ZGlmZiAtLWdpdCBhLy5tYWlsbWFwIGIvLm1haWxtYXAKaW5kZXggMmE5MWMxNC4uOTY3Zjg4MiAxMDA2NDQKLS0tIGEvLm1haWxtYXAKKysrIGIvLm1haWxtYXAKQEAgLTY5LDYgKzY5LDcgQEAKIEphbWVzIEJvdHRvbWxleSA8amVqYkB0aXRhbmljLmlsLnN0ZWVsZXllLmNvbT4KIEphbWVzIEUgV2lsc29uIDx3aWxzb25Ac3BlY2lmaXguY29tPgogSmFtZXMgS2V0cmVub3MgPGprZXRyZW5vQGlvLihub25lKT4KK0phdmkgTWVyaW5vIDxqYXZpLm1lcmlub0BrZXJuZWwub3JnPiA8amF2aS5tZXJpbm9AYXJtLmNvbT4KIDxqYXZpZXJAb3NnLnNhbXN1bmcuY29tPiA8amF2aWVyLm1hcnRpbmV6QGNvbGxhYm9yYS5jby51az4KIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KIEplZmYgR2FyemlrIDxqZ2FyemlrQHByZXR6ZWwueXl6LnVzPgpAQCAtODgsNiArODksNyBAQAogS2VubmV0aCBXIENoZW4gPGtlbm5ldGgudy5jaGVuQGludGVsLmNvbT4KIEtvbnN0YW50aW4gS2hsZWJuaWtvdiA8a29jdDlpQGdtYWlsLmNvbT4gPGsua2hsZWJuaWtvdkBzYW1zdW5nLmNvbT4KIEtvdXNoaWsgPHJhZ2hhdmVuZHJhLmtvdXNoaWtAbmV0ZXJpb24uY29tPgorS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPiA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+CiBLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+IDxrLmtvemxvd3NraS5rQGdtYWlsLmNvbT4KIEt1bmlub3JpIE1vcmltb3RvIDxrdW5pbm9yaS5tb3JpbW90by5neEByZW5lc2FzLmNvbT4KIExlb25pZCBJIEFuYW5pZXYgPGxlb25pZC5pLmFuYW5pZXZAaW50ZWwuY29tPgpAQCAtMTU4LDYgKzE2MCw5IEBACiBWaXJlc2ggS3VtYXIgPHZpcmVzaGtAa2VybmVsLm9yZz4gPHZpcmVzaC5rdW1hckBzdC5jb20+CiBWaXJlc2ggS3VtYXIgPHZpcmVzaGtAa2VybmVsLm9yZz4gPHZpcmVzaC5saW51eEBnbWFpbC5jb20+CiBWaXJlc2ggS3VtYXIgPHZpcmVzaGtAa2VybmVsLm9yZz4gPHZpcmVzaC5rdW1hcjJAYXJtLmNvbT4KK1ZsYWQgRG9nYXJ1IDxkZHZsYWRAZ21haWwuY29tPiA8dmxhZC5kb2dhcnVAaW50ZWwuY29tPgorVmxhZGltaXIgRGF2eWRvdiA8dmRhdnlkb3YuZGV2QGdtYWlsLmNvbT4gPHZkYXZ5ZG92QHZpcnR1b3p6by5jb20+CitWbGFkaW1pciBEYXZ5ZG92IDx2ZGF2eWRvdi5kZXZAZ21haWwuY29tPiA8dmRhdnlkb3ZAcGFyYWxsZWxzLmNvbT4KIFRha2FzaGkgWU9TSElJIDx0YWthc2hpLnlvc2hpaS56akByZW5lc2FzLmNvbT4KIFl1c3VrZSBHb2RhIDxnb2RhLnl1c3VrZUByZW5lc2FzLmNvbT4KIEd1c3Rhdm8gUGFkb3ZhbiA8Z3VzdGF2b0BsYXMuaWMudW5pY2FtcC5icj4KZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDJhM2ZiY2QuLjkzNmYwNWEgMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtMTk0NCw2ICsxOTQ0LDExIEBACiBFOiBrcmF4ZWxAc3VzZS5kZQogRDogdmlkZW80bGludXgsIGJ0dHYsIHZlc2FmYiwgc29tZSBzY3NpLCBtaXNjIGZpeGVzCiAKK046IEhhbnMgSi4gS29jaAorRDogVVNFUlNQQUNFIEkvTywgTUFYNjY1MAorRDogSGFucyBwYXNzZWQgYXdheSBpbiBKdW5lIDIwMTYsIGFuZCB3aWxsIGJlIGdyZWF0bHkgbWlzc2VkLgorVzogaHR0cHM6Ly9sd24ubmV0L0FydGljbGVzLzY5MTAwMC8KKwogTjogSGFyYWxkIEtvZW5pZwogRToga29lbmlnQHRhdC5waHlzaWsudW5pLXR1ZWJpbmdlbi5kZQogRDogWEZyZWU4NiAoUzMpLCBEQ0Y3Nywgc29tZSBrZXJuZWwgaGFja3MgYW5kIGZpeGVzCkBAIC0zNTE4LDYgKzM1MjMsMTAgQEAKIFM6IE5vcnRoYm9yb3VnaCwgTUEgMDE1MzIKIFM6IFVTQQogCitOOiBEb3VnIFRob21wc29uCitFOiBkb3VndGhvbXBzb25AeG1pc3Npb24uY29tCitEOiBFREFDCisKIE46IFRvbW15IFRob3JuCiBFOiBUb21teS5UaG9ybkBpcmlzYS5mcgogVzogaHR0cDovL3d3dy5pcmlzYS5mci9wcml2ZS90aG9ybi9pbmRleC5odG1sCkBAIC0zNjU0LDYgKzM2NjMsMTAgQEAKIFM6IDk3MDc4IFd1ZXJ6YnVyZwogUzogR2VybWFueQogCitOOiBKYXNvbiBVaGxlbmtvdHQKK0U6IGp1aGxlbmtvQGFrYW1haS5jb20KK0Q6IEkzMDAwIEVEQUMgZHJpdmVyCisKIE46IEdyZWcgVW5nZXJlcgogRTogZ2VyZ0BzbmFwZ2Vhci5jb20KIEQ6IHVDbGludXgga2VybmVsIGhhY2tlcgpAQCAtMzY5MSw3ICszNzA0LDcgQEAKIE46IEdlZXJ0IFV5dHRlcmhvZXZlbgogRTogZ2VlcnRAbGludXgtbTY4ay5vcmcKIFc6IGh0dHA6Ly91c2Vycy50ZWxlbmV0LmJlL2dlZXJ0dS8KLVA6IDEwMjQvODYyNjc4QTYgQzUxRCAzNjFDIDBCRDEgNEM5MCBCMjc1ICBDNTUzIDZFRUEgMTFCQSA4NjI2IDc4QTYKK1A6IDQwOTZSLzQ4MDRCNEJDM0Y1NUVFRkIgNzUwRCA4MkIwIEE3ODEgNTQzMSA1RTI1ICA5MjVCIDQ4MDQgQjRCQyAzRjU1IEVFRkIKIEQ6IG02OGsvQW1pZ2EgYW5kIFBQQy9DSFJQIExvbmd0cmFpbCBjb29yZGluYXRvcgogRDogRnJhbWUgYnVmZmVyIGRldmljZSBhbmQgWEY2OF9GQkRldiBtYWludGFpbmVyCiBEOiBtNjhrIElERSBtYWludGFpbmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtZGV2aWNlcyBiL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1kZXZpY2VzCmluZGV4IDQzZjc4Yjg4ZC4uZGY0NDlkNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWRldmljZXMKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWRldmljZXMKQEAgLTEsNyArMSw3IEBACiAjIE5vdGU6IFRoaXMgZG9jdW1lbnRzIGFkZGl0aW9uYWwgcHJvcGVydGllcyBvZiBhbnkgZGV2aWNlIGJleW9uZCB3aGF0CiAjIGlzIGRvY3VtZW50ZWQgaW4gRG9jdW1lbnRhdGlvbi9zeXNmcy1ydWxlcy50eHQKIAotV2hhdDoJCS9zeXMvZGV2aWNlcy8qL29mX3BhdGgKK1doYXQ6CQkvc3lzL2RldmljZXMvKi9vZl9ub2RlCiBEYXRlOgkJRmVicnVhcnkgMjAxNQogQ29udGFjdDoJRGV2aWNlIFRyZWUgbWFpbGluZyBsaXN0IDxkZXZpY2V0cmVlQHZnZXIua2VybmVsLm9yZz4KIERlc2NyaXB0aW9uOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLWxlZAppbmRleCAzNjQ2ZWM4Li44NmFjZTI4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLWxlZAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLWxlZApAQCAtMjQsNyArMjQsOCBAQAogCQlvZiBsZWQgZXZlbnRzLgogCQlZb3UgY2FuIGNoYW5nZSB0cmlnZ2VycyBpbiBhIHNpbWlsYXIgbWFubmVyIHRvIHRoZSB3YXkgYW4gSU8KIAkJc2NoZWR1bGVyIGlzIGNob3Nlbi4gVHJpZ2dlciBzcGVjaWZpYyBwYXJhbWV0ZXJzIGNhbiBhcHBlYXIgaW4KLQkJL3N5cy9jbGFzcy9sZWRzLzxsZWQ+IG9uY2UgYSBnaXZlbiB0cmlnZ2VyIGlzIHNlbGVjdGVkLgorCQkvc3lzL2NsYXNzL2xlZHMvPGxlZD4gb25jZSBhIGdpdmVuIHRyaWdnZXIgaXMgc2VsZWN0ZWQuIEZvcgorCQl0aGVpciBkb2N1bWVudGF0aW9uIHNlZSBzeXNmcy1jbGFzcy1sZWQtdHJpZ2dlci0qLgogCiBXaGF0OgkJL3N5cy9jbGFzcy9sZWRzLzxsZWQ+L2ludmVydGVkCiBEYXRlOgkJSmFudWFyeSAyMDExCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLWxlZC10cmlnZ2VyLW9uZXNob3QgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLWxlZC10cmlnZ2VyLW9uZXNob3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc4YTNhNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbGVkLXRyaWdnZXItb25lc2hvdApAQCAtMCwwICsxLDM2IEBACitXaGF0OgkJL3N5cy9jbGFzcy9sZWRzLzxsZWQ+L2RlbGF5X29uCitEYXRlOgkJSnVuIDIwMTIKK0tlcm5lbFZlcnNpb246CTMuNgorQ29udGFjdDoJbGludXgtbGVkc0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlTcGVjaWZpZXMgZm9yIGhvdyBtYW55IG1pbGxpc2Vjb25kcyB0aGUgTEVEIGhhcyB0byBzdGF5IGF0CisJCUxFRF9GVUxMIGJyaWdodG5lc3MgYWZ0ZXIgaXQgaGFzIGJlZW4gYXJtZWQuCisJCURlZmF1bHRzIHRvIDEwMCBtcy4KKworV2hhdDoJCS9zeXMvY2xhc3MvbGVkcy88bGVkPi9kZWxheV9vZmYKK0RhdGU6CQlKdW4gMjAxMgorS2VybmVsVmVyc2lvbjoJMy42CitDb250YWN0OglsaW51eC1sZWRzQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVNwZWNpZmllcyBmb3IgaG93IG1hbnkgbWlsbGlzZWNvbmRzIHRoZSBMRUQgaGFzIHRvIHN0YXkgYXQKKwkJTEVEX09GRiBicmlnaHRuZXNzIGFmdGVyIGl0IGhhcyBiZWVuIGFybWVkLgorCQlEZWZhdWx0cyB0byAxMDAgbXMuCisKK1doYXQ6CQkvc3lzL2NsYXNzL2xlZHMvPGxlZD4vaW52ZXJ0CitEYXRlOgkJSnVuIDIwMTIKK0tlcm5lbFZlcnNpb246CTMuNgorQ29udGFjdDoJbGludXgtbGVkc0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlSZXZlcnNlIHRoZSBibGluayBsb2dpYy4gSWYgc2V0IHRvIDAgKGRlZmF1bHQpIGJsaW5rIG9uIGZvcgorCQlkZWxheV9vbiBtcywgdGhlbiBibGluayBvZmYgZm9yIGRlbGF5X29mZiBtcywgbGVhdmluZyB0aGUgTEVECisJCW5vcm1hbGx5IG9mZi4gSWYgc2V0IHRvIDEsIGJsaW5rIG9mZiBmb3IgZGVsYXlfb2ZmIG1zLCB0aGVuCisJCWJsaW5rIG9uIGZvciBkZWxheV9vbiBtcywgbGVhdmluZyB0aGUgTEVEIG5vcm1hbGx5IG9uLgorCQlTZXR0aW5nIHRoaXMgdmFsdWUgYWxzbyBpbW1lZGlhdGVseSBjaGFuZ2VzIHRoZSBMRUQgc3RhdGUuCisKK1doYXQ6CQkvc3lzL2NsYXNzL2xlZHMvPGxlZD4vc2hvdAorRGF0ZToJCUp1biAyMDEyCitLZXJuZWxWZXJzaW9uOgkzLjYKK0NvbnRhY3Q6CWxpbnV4LWxlZHNAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJV3JpdGUgYW55IG5vbi1lbXB0eSBzdHJpbmcgdG8gc2lnbmFsIGFuIGV2ZW50cywgdGhpcyBzdGFydHMgYQorCQlibGluayBzZXF1ZW5jZSBpZiBub3QgYWxyZWFkeSBydW5uaW5nLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQtdHJpZ2dlci11c2Jwb3J0IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQtdHJpZ2dlci11c2Jwb3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NDBlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLWxlZC10cmlnZ2VyLXVzYnBvcnQKQEAgLTAsMCArMSwxMiBAQAorV2hhdDoJCS9zeXMvY2xhc3MvbGVkcy88bGVkPi9wb3J0cy88cG9ydD4KK0RhdGU6CQlTZXB0ZW1iZXIgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglsaW51eC1sZWRzQHZnZXIua2VybmVsLm9yZworCQlsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJRXZlcnkgZGlyIGVudHJ5IHJlcHJlc2VudHMgYSBzaW5nbGUgVVNCIHBvcnQgdGhhdCBjYW4gYmUKKwkJc2VsZWN0ZWQgZm9yIHRoZSBVU0IgcG9ydCB0cmlnZ2VyLiBTZWxlY3RpbmcgcG9ydHMgbWFrZXMgdHJpZ2dlcgorCQlvYnNlcnZpbmcgdGhlbSBmb3IgYW55IGNvbm5lY3RlZCBkZXZpY2VzIGFuZCBsaWdodGluZyBvbiBMRUQgaWYKKwkJdGhlcmUgYXJlIGFueS4KKwkJRWNob2luZyAiMSIgdmFsdWUgc2VsZWN0cyBVU0IgcG9ydC4gRWNob2luZyAiMCIgdW5zZWxlY3RzIGl0LgorCQlDdXJyZW50IHN0YXRlIGNhbiBiZSBhbHNvIHJlYWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLW1pYy50eHQgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLW1pYy50eHQKaW5kZXggZDQ1ZWVkMi4uNmVmNjgyNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1taWMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbWljLnR4dApAQCAtMTUzLDcgKzE1Myw3IEBACiAKIFdoYXQ6CQkvc3lzL2NsYXNzL21pYy9taWMoeCkvaGVhcnRiZWF0X2VuYWJsZQogRGF0ZToJCU1hcmNoIDIwMTUKLUtlcm5lbFZlcnNpb246CTMuMjAKK0tlcm5lbFZlcnNpb246CTQuNAogQ29udGFjdDoJQXNodXRvc2ggRGl4aXQgPGFzaHV0b3NoLmRpeGl0QGludGVsLmNvbT4KIERlc2NyaXB0aW9uOgogCQlUaGUgTUlDIGRyaXZlcnMgZGV0ZWN0IGFuZCBpbmZvcm0gdXNlciBzcGFjZSBhYm91dCBjYXJkIGNyYXNoZXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtaTJjLWJtcDA4NSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtaTJjLWJtcDA4NQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1OTYyYS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWkyYy1ibXAwODUKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1XaGF0OgkJL3N5cy9idXMvaTJjL2RldmljZXMvPGJ1c251bT4tPGRldmFkZHI+L3ByZXNzdXJlMF9pbnB1dAotRGF0ZToJCUp1bmUgMjAxMAotQ29udGFjdDoJQ2hyaXN0b3BoIE1haXIgPGNocmlzdG9waC5tYWlyQGdtYWlsLmNvbT4KLURlc2NyaXB0aW9uOglTdGFydCBhIHByZXNzdXJlIG1lYXN1cmVtZW50IGFuZCByZWFkIHRoZSByZXN1bHQuIFZhbHVlcwotCQlyZXByZXNlbnQgdGhlIGFtYmllbnQgYWlyIHByZXNzdXJlIGluIHBhc2NhbCAoMC4wMSBtaWxsaWJhcikuCi0KLQkJUmVhZGluZzogcmV0dXJucyB0aGUgY3VycmVudCBhaXIgcHJlc3N1cmUuCi0KLQotV2hhdDoJCS9zeXMvYnVzL2kyYy9kZXZpY2VzLzxidXNudW0+LTxkZXZhZGRyPi90ZW1wMF9pbnB1dAotRGF0ZToJCUp1bmUgMjAxMAotQ29udGFjdDoJQ2hyaXN0b3BoIE1haXIgPGNocmlzdG9waC5tYWlyQGdtYWlsLmNvbT4KLURlc2NyaXB0aW9uOglNZWFzdXJlIHRoZSBhbWJpZW50IHRlbXBlcmF0dXJlLiBUaGUgcmV0dXJuZWQgdmFsdWUgcmVwcmVzZW50cwotCQl0aGUgYW1iaWVudCB0ZW1wZXJhdHVyZSBpbiB1bml0cyBvZiAwLjEgZGVncmVlIGNlbHNpdXMuCi0KLQkJUmVhZGluZzogcmV0dXJucyB0aGUgY3VycmVudCB0ZW1wZXJhdHVyZS4KLQotCi1XaGF0OgkJL3N5cy9idXMvaTJjL2RldmljZXMvPGJ1c251bT4tPGRldmFkZHI+L292ZXJzYW1wbGluZwotRGF0ZToJCUp1bmUgMjAxMAotQ29udGFjdDoJQ2hyaXN0b3BoIE1haXIgPGNocmlzdG9waC5tYWlyQGdtYWlsLmNvbT4KLURlc2NyaXB0aW9uOglUZWxsIHRoZSBibXAwODUgdG8gdXNlIG1vcmUgc2FtcGxlcyB0byBjYWxjdWxhdGUgYSBwcmVzc3VyZQotCQl2YWx1ZS4gV2hlbiB3cml0aW5nIHRvIHRoaXMgZmlsZSB0aGUgY2hpcCB3aWxsIHVzZSAyXnggc2FtcGxlcwotCQl0byBjYWxjdWxhdGUgdGhlIG5leHQgcHJlc3N1cmUgdmFsdWUgd2l0aCB4IGJlaW5nIHRoZSB2YWx1ZQotCQl3cml0dGVuLiBVc2luZyB0aGlzIGZlYXR1cmUgd2lsbCBkZWNyZWFzZSBSTVMgbm9pc2UgYW5kCi0JCWluY3JlYXNlIHRoZSBtZWFzdXJlbWVudCB0aW1lLgotCi0JCVJlYWRpbmc6IHJldHVybnMgdGhlIGN1cnJlbnQgb3ZlcnNhbXBsaW5nIHNldHRpbmcuCi0KLQkJV3JpdGluZzogc2V0cyBhIG5ldyBvdmVyc2FtcGxpbmcgc2V0dGluZy4KLQkJQWNjZXB0ZWQgdmFsdWVzOiAwLi4zLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtaXJxIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtaXJxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMDc0YjEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWtlcm5lbC1pcnEKQEAgLTAsMCArMSw1MyBAQAorV2hhdDoJCS9zeXMva2VybmVsL2lycQorRGF0ZToJCVNlcHRlbWJlciAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNyYWlnIEdhbGxlayA8a3JhaWdAZ29vZ2xlLmNvbT4KK0Rlc2NyaXB0aW9uOglEaXJlY3RvcnkgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3lzdGVtJ3MgSVJRcy4KKwkJU3BlY2lmaWNhbGx5LCBkYXRhIGZyb20gdGhlIGFzc29jaWF0ZWQgc3RydWN0IGlycV9kZXNjLgorCQlUaGUgaW5mb3JtYXRpb24gaGVyZSBpcyBzaW1pbGFyIHRvIHRoYXQgaW4gL3Byb2MvaW50ZXJydXB0cworCQlidXQgaW4gYSBtb3JlIG1hY2hpbmUtZnJpZW5kbHkgZm9ybWF0LiAgVGhpcyBkaXJlY3RvcnkgY29udGFpbnMKKwkJb25lIHN1YmRpcmVjdG9yeSBmb3IgZWFjaCBMaW51eCBJUlEgbnVtYmVyLgorCitXaGF0OgkJL3N5cy9rZXJuZWwvaXJxLzxpcnE+L2FjdGlvbnMKK0RhdGU6CQlTZXB0ZW1iZXIgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDcmFpZyBHYWxsZWsgPGtyYWlnQGdvb2dsZS5jb20+CitEZXNjcmlwdGlvbjoJVGhlIElSUSBhY3Rpb24gY2hhaW4uICBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHplcm8gb3IgbW9yZQorCQlkZXZpY2UgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW50ZXJydXB0LgorCitXaGF0OgkJL3N5cy9rZXJuZWwvaXJxLzxpcnE+L2NoaXBfbmFtZQorRGF0ZToJCVNlcHRlbWJlciAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNyYWlnIEdhbGxlayA8a3JhaWdAZ29vZ2xlLmNvbT4KK0Rlc2NyaXB0aW9uOglIdW1hbi1yZWFkYWJsZSBjaGlwIG5hbWUgc3VwcGxpZWQgYnkgdGhlIGFzc29jaWF0ZWQgZGV2aWNlCisJCWRyaXZlci4KKworV2hhdDoJCS9zeXMva2VybmVsL2lycS88aXJxPi9od2lycQorRGF0ZToJCVNlcHRlbWJlciAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNyYWlnIEdhbGxlayA8a3JhaWdAZ29vZ2xlLmNvbT4KK0Rlc2NyaXB0aW9uOglXaGVuIGludGVycnVwdCB0cmFuc2xhdGlvbiBkb21haW5zIGFyZSB1c2VkLCB0aGlzIGZpbGUgY29udGFpbnMKKwkJdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUgSVJRIG51bWJlciB1c2VkIGZvciB0aGlzIExpbnV4IElSUS4KKworV2hhdDoJCS9zeXMva2VybmVsL2lycS88aXJxPi9uYW1lCitEYXRlOgkJU2VwdGVtYmVyIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ3JhaWcgR2FsbGVrIDxrcmFpZ0Bnb29nbGUuY29tPgorRGVzY3JpcHRpb246CUh1bWFuLXJlYWRhYmxlIGZsb3cgaGFuZGxlciBuYW1lIGFzIGRlZmluZWQgYnkgdGhlIGlycSBjaGlwCisJCWRyaXZlci4KKworV2hhdDoJCS9zeXMva2VybmVsL2lycS88aXJxPi9wZXJfY3B1X2NvdW50CitEYXRlOgkJU2VwdGVtYmVyIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ3JhaWcgR2FsbGVrIDxrcmFpZ0Bnb29nbGUuY29tPgorRGVzY3JpcHRpb246CVRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGludGVycnVwdCBoYXMgZmlyZWQgc2luY2UgYm9vdC4gIFRoaXMKKwkJaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjb3VudGVyczsgb25lIHBlciBDUFUgaW4gQ1BVIGlkCisJCW9yZGVyLiAgTk9URTogVGhpcyBmaWxlIGNvbnNpc3RlbnRseSBzaG93cyBjb3VudGVycyBmb3IgYWxsCisJCUNQVSBpZHMuICBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgYmVoYXZpb3Igb2YgL3Byb2MvaW50ZXJydXB0cworCQl3aGljaCBvbmx5IHNob3dzIGNvdW50ZXJzIGZvciBvbmxpbmUgQ1BVcy4KKworV2hhdDoJCS9zeXMva2VybmVsL2lycS88aXJxPi90eXBlCitEYXRlOgkJU2VwdGVtYmVyIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ3JhaWcgR2FsbGVrIDxrcmFpZ0Bnb29nbGUuY29tPgorRGVzY3JpcHRpb246CVRoZSB0eXBlIG9mIHRoZSBpbnRlcnJ1cHQuICBFaXRoZXIgdGhlIHN0cmluZyAnbGV2ZWwnIG9yICdlZGdlJy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQ2hhbmdlcyBiL0RvY3VtZW50YXRpb24vQ2hhbmdlcwppbmRleCBlYzk3Yjc3Li4yMjc5N2ExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NoYW5nZXMKKysrIGIvRG9jdW1lbnRhdGlvbi9DaGFuZ2VzCkBAIC0xLDggKzEsMTMgQEAKKy4uIF9jaGFuZ2VzOgorCitNaW5pbWFsIHJlcXVlcmVtZW50cyB0byBjb21waWxlIHRoZSBLZXJuZWwKKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworCiBJbnRybwogPT09PT0KIAogVGhpcyBkb2N1bWVudCBpcyBkZXNpZ25lZCB0byBwcm92aWRlIGEgbGlzdCBvZiB0aGUgbWluaW11bSBsZXZlbHMgb2YKLXNvZnR3YXJlIG5lY2Vzc2FyeSB0byBydW4gdGhlIDMuMCBrZXJuZWxzLgorc29mdHdhcmUgbmVjZXNzYXJ5IHRvIHJ1biB0aGUgNC54IGtlcm5lbHMuCiAKIFRoaXMgZG9jdW1lbnQgaXMgb3JpZ2luYWxseSBiYXNlZCBvbiBteSAiQ2hhbmdlcyIgZmlsZSBmb3IgMi4wLngga2VybmVscwogYW5kIHRoZXJlZm9yZSBvd2VzIGNyZWRpdCB0byB0aGUgc2FtZSBwZW9wbGUgYXMgdGhhdCBmaWxlIChKYXJlZCBNYXVjaCwKQEAgLTEwLDkgKzE1LDkgQEAKICduZXQpLgogCiBDdXJyZW50IE1pbmltYWwgUmVxdWlyZW1lbnRzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLVVwZ3JhZGUgdG8gYXQgKmxlYXN0KiB0aGVzZSBzb2Z0d2FyZSByZXZpc2lvbnMgYmVmb3JlIHRoaW5raW5nIHlvdSd2ZQorVXBncmFkZSB0byBhdCAqKmxlYXN0KiogdGhlc2Ugc29mdHdhcmUgcmV2aXNpb25zIGJlZm9yZSB0aGlua2luZyB5b3UndmUKIGVuY291bnRlcmVkIGEgYnVnISAgSWYgeW91J3JlIHVuc3VyZSB3aGF0IHZlcnNpb24geW91J3JlIGN1cnJlbnRseQogcnVubmluZywgdGhlIHN1Z2dlc3RlZCBjb21tYW5kIHNob3VsZCB0ZWxsIHlvdS4KIApAQCAtMjEsMzQgKzI2LDQwIEBACiBzeXN0ZW1zOyBvYnZpb3VzbHksIGlmIHlvdSBkb24ndCBoYXZlIGFueSBJU0ROIGhhcmR3YXJlLCBmb3IgZXhhbXBsZSwKIHlvdSBwcm9iYWJseSBuZWVkbid0IGNvbmNlcm4geW91cnNlbGYgd2l0aCBpc2RuNGstdXRpbHMuCiAKLW8gIEdOVSBDICAgICAgICAgICAgICAgICAgMy4yICAgICAgICAgICAgICAgICAgICAgIyBnY2MgLS12ZXJzaW9uCi1vICBHTlUgbWFrZSAgICAgICAgICAgICAgIDMuODAgICAgICAgICAgICAgICAgICAgICMgbWFrZSAtLXZlcnNpb24KLW8gIGJpbnV0aWxzICAgICAgICAgICAgICAgMi4xMiAgICAgICAgICAgICAgICAgICAgIyBsZCAtdgotbyAgdXRpbC1saW51eCAgICAgICAgICAgICAyLjEwbyAgICAgICAgICAgICAgICAgICAjIGZkZm9ybWF0IC0tdmVyc2lvbgotbyAgbW9kdWxlLWluaXQtdG9vbHMgICAgICAwLjkuMTAgICAgICAgICAgICAgICAgICAjIGRlcG1vZCAtVgotbyAgZTJmc3Byb2dzICAgICAgICAgICAgICAxLjQxLjQgICAgICAgICAgICAgICAgICAjIGUyZnNjayAtVgotbyAgamZzdXRpbHMgICAgICAgICAgICAgICAxLjEuMyAgICAgICAgICAgICAgICAgICAjIGZzY2suamZzIC1WCi1vICByZWlzZXJmc3Byb2dzICAgICAgICAgIDMuNi4zICAgICAgICAgICAgICAgICAgICMgcmVpc2VyZnNjayAtVgotbyAgeGZzcHJvZ3MgICAgICAgICAgICAgICAyLjYuMCAgICAgICAgICAgICAgICAgICAjIHhmc19kYiAtVgotbyAgc3F1YXNoZnMtdG9vbHMgICAgICAgICA0LjAgICAgICAgICAgICAgICAgICAgICAjIG1rc3F1YXNoZnMgLXZlcnNpb24KLW8gIGJ0cmZzLXByb2dzICAgICAgICAgICAgMC4xOCAgICAgICAgICAgICAgICAgICAgIyBidHJmc2NrCi1vICBwY21jaWF1dGlscyAgICAgICAgICAgIDAwNCAgICAgICAgICAgICAgICAgICAgICMgcGNjYXJkY3RsIC1WCi1vICBxdW90YS10b29scyAgICAgICAgICAgIDMuMDkgICAgICAgICAgICAgICAgICAgICMgcXVvdGEgLVYKLW8gIFBQUCAgICAgICAgICAgICAgICAgICAgMi40LjAgICAgICAgICAgICAgICAgICAgIyBwcHBkIC0tdmVyc2lvbgotbyAgaXNkbjRrLXV0aWxzICAgICAgICAgICAzLjFwcmUxICAgICAgICAgICAgICAgICAjIGlzZG5jdHJsIDI+JjF8Z3JlcCB2ZXJzaW9uCi1vICBuZnMtdXRpbHMgICAgICAgICAgICAgIDEuMC41ICAgICAgICAgICAgICAgICAgICMgc2hvd21vdW50IC0tdmVyc2lvbgotbyAgcHJvY3BzICAgICAgICAgICAgICAgICAzLjIuMCAgICAgICAgICAgICAgICAgICAjIHBzIC0tdmVyc2lvbgotbyAgb3Byb2ZpbGUgICAgICAgICAgICAgICAwLjkgICAgICAgICAgICAgICAgICAgICAjIG9wcm9maWxlZCAtLXZlcnNpb24KLW8gIHVkZXYgICAgICAgICAgICAgICAgICAgMDgxICAgICAgICAgICAgICAgICAgICAgIyB1ZGV2ZCAtLXZlcnNpb24KLW8gIGdydWIgICAgICAgICAgICAgICAgICAgMC45MyAgICAgICAgICAgICAgICAgICAgIyBncnViIC0tdmVyc2lvbiB8fCBncnViLWluc3RhbGwgLS12ZXJzaW9uCi1vICBtY2Vsb2cgICAgICAgICAgICAgICAgIDAuNiAgICAgICAgICAgICAgICAgICAgICMgbWNlbG9nIC0tdmVyc2lvbgotbyAgaXB0YWJsZXMgICAgICAgICAgICAgICAxLjQuMiAgICAgICAgICAgICAgICAgICAjIGlwdGFibGVzIC1WCi1vICBvcGVuc3NsICYgbGliY3J5cHRvICAgIDEuMC4wICAgICAgICAgICAgICAgICAgICMgb3BlbnNzbCB2ZXJzaW9uCi1vICBiYyAgICAgICAgICAgICAgICAgICAgIDEuMDYuOTUgICAgICAgICAgICAgICAgICMgYmMgLS12ZXJzaW9uCis9PT09PT09PT09PT09PT09PT09PT09ID09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBQcm9ncmFtICAgICAgICBNaW5pbWFsIHZlcnNpb24gICAgICAgQ29tbWFuZCB0byBjaGVjayB0aGUgdmVyc2lvbgorPT09PT09PT09PT09PT09PT09PT09PSA9PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0dOVSBDICAgICAgICAgICAgICAgICAgMy4yICAgICAgICAgICAgICBnY2MgLS12ZXJzaW9uCitHTlUgbWFrZSAgICAgICAgICAgICAgIDMuODAgICAgICAgICAgICAgbWFrZSAtLXZlcnNpb24KK2JpbnV0aWxzICAgICAgICAgICAgICAgMi4xMiAgICAgICAgICAgICBsZCAtdgordXRpbC1saW51eCAgICAgICAgICAgICAyLjEwbyAgICAgICAgICAgIGZkZm9ybWF0IC0tdmVyc2lvbgorbW9kdWxlLWluaXQtdG9vbHMgICAgICAwLjkuMTAgICAgICAgICAgIGRlcG1vZCAtVgorZTJmc3Byb2dzICAgICAgICAgICAgICAxLjQxLjQgICAgICAgICAgIGUyZnNjayAtVgoramZzdXRpbHMgICAgICAgICAgICAgICAxLjEuMyAgICAgICAgICAgIGZzY2suamZzIC1WCityZWlzZXJmc3Byb2dzICAgICAgICAgIDMuNi4zICAgICAgICAgICAgcmVpc2VyZnNjayAtVgoreGZzcHJvZ3MgICAgICAgICAgICAgICAyLjYuMCAgICAgICAgICAgIHhmc19kYiAtVgorc3F1YXNoZnMtdG9vbHMgICAgICAgICA0LjAgICAgICAgICAgICAgIG1rc3F1YXNoZnMgLXZlcnNpb24KK2J0cmZzLXByb2dzICAgICAgICAgICAgMC4xOCAgICAgICAgICAgICBidHJmc2NrCitwY21jaWF1dGlscyAgICAgICAgICAgIDAwNCAgICAgICAgICAgICAgcGNjYXJkY3RsIC1WCitxdW90YS10b29scyAgICAgICAgICAgIDMuMDkgICAgICAgICAgICAgcXVvdGEgLVYKK1BQUCAgICAgICAgICAgICAgICAgICAgMi40LjAgICAgICAgICAgICBwcHBkIC0tdmVyc2lvbgoraXNkbjRrLXV0aWxzICAgICAgICAgICAzLjFwcmUxICAgICAgICAgIGlzZG5jdHJsIDI+JjF8Z3JlcCB2ZXJzaW9uCituZnMtdXRpbHMgICAgICAgICAgICAgIDEuMC41ICAgICAgICAgICAgc2hvd21vdW50IC0tdmVyc2lvbgorcHJvY3BzICAgICAgICAgICAgICAgICAzLjIuMCAgICAgICAgICAgIHBzIC0tdmVyc2lvbgorb3Byb2ZpbGUgICAgICAgICAgICAgICAwLjkgICAgICAgICAgICAgIG9wcm9maWxlZCAtLXZlcnNpb24KK3VkZXYgICAgICAgICAgICAgICAgICAgMDgxICAgICAgICAgICAgICB1ZGV2ZCAtLXZlcnNpb24KK2dydWIgICAgICAgICAgICAgICAgICAgMC45MyAgICAgICAgICAgICBncnViIC0tdmVyc2lvbiB8fCBncnViLWluc3RhbGwgLS12ZXJzaW9uCittY2Vsb2cgICAgICAgICAgICAgICAgIDAuNiAgICAgICAgICAgICAgbWNlbG9nIC0tdmVyc2lvbgoraXB0YWJsZXMgICAgICAgICAgICAgICAxLjQuMiAgICAgICAgICAgIGlwdGFibGVzIC1WCitvcGVuc3NsICYgbGliY3J5cHRvICAgIDEuMC4wICAgICAgICAgICAgb3BlbnNzbCB2ZXJzaW9uCitiYyAgICAgICAgICAgICAgICAgICAgIDEuMDYuOTUgICAgICAgICAgYmMgLS12ZXJzaW9uCitTcGhpbnhcIFsjZjFdXwkgICAgICAgMS4yCQlzcGhpbngtYnVpbGQgLS12ZXJzaW9uCis9PT09PT09PT09PT09PT09PT09PT09ID09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCisuLiBbI2YxXSBTcGhpbnggaXMgbmVlZGVkIG9ubHkgdG8gYnVpbGQgdGhlIEtlcm5lbCBkb2N1bWVudGF0aW9uCiAKIEtlcm5lbCBjb21waWxhdGlvbgotPT09PT09PT09PT09PT09PT09CisqKioqKioqKioqKioqKioqKioKIAogR0NDCiAtLS0KQEAgLTY0LDE2ICs3NSwxNiBAQAogQmludXRpbHMKIC0tLS0tLS0tCiAKLUxpbnV4IG9uIElBLTMyIGhhcyByZWNlbnRseSBzd2l0Y2hlZCBmcm9tIHVzaW5nIGFzODYgdG8gdXNpbmcgZ2FzIGZvcgotYXNzZW1ibGluZyB0aGUgMTYtYml0IGJvb3QgY29kZSwgcmVtb3ZpbmcgdGhlIG5lZWQgZm9yIGFzODYgdG8gY29tcGlsZQorTGludXggb24gSUEtMzIgaGFzIHJlY2VudGx5IHN3aXRjaGVkIGZyb20gdXNpbmcgYGBhczg2YGAgdG8gdXNpbmcgYGBnYXNgYCBmb3IKK2Fzc2VtYmxpbmcgdGhlIDE2LWJpdCBib290IGNvZGUsIHJlbW92aW5nIHRoZSBuZWVkIGZvciBgYGFzODZgYCB0byBjb21waWxlCiB5b3VyIGtlcm5lbC4gIFRoaXMgY2hhbmdlIGRvZXMsIGhvd2V2ZXIsIG1lYW4gdGhhdCB5b3UgbmVlZCBhIHJlY2VudAogcmVsZWFzZSBvZiBiaW51dGlscy4KIAogUGVybAogLS0tLQogCi1Zb3Ugd2lsbCBuZWVkIHBlcmwgNSBhbmQgdGhlIGZvbGxvd2luZyBtb2R1bGVzOiBHZXRvcHQ6OkxvbmcsIEdldG9wdDo6U3RkLAotRmlsZTo6QmFzZW5hbWUsIGFuZCBGaWxlOjpGaW5kIHRvIGJ1aWxkIHRoZSBrZXJuZWwuCitZb3Ugd2lsbCBuZWVkIHBlcmwgNSBhbmQgdGhlIGZvbGxvd2luZyBtb2R1bGVzOiBgYEdldG9wdDo6TG9uZ2BgLAorYGBHZXRvcHQ6OlN0ZGBgLCBgYEZpbGU6OkJhc2VuYW1lYGAsIGFuZCBgYEZpbGU6OkZpbmRgYCB0byBidWlsZCB0aGUga2VybmVsLgogCiBCQwogLS0KQEAgLTkzLDcgKzEwNCw3IEBACiAKIAogU3lzdGVtIHV0aWxpdGllcwotPT09PT09PT09PT09PT09PQorKioqKioqKioqKioqKioqKgogCiBBcmNoaXRlY3R1cmFsIGNoYW5nZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTE1LDcgKzEyNiw3IEBACiBVdGlsLWxpbnV4CiAtLS0tLS0tLS0tCiAKLU5ldyB2ZXJzaW9ucyBvZiB1dGlsLWxpbnV4IHByb3ZpZGUgKmZkaXNrIHN1cHBvcnQgZm9yIGxhcmdlciBkaXNrcywKK05ldyB2ZXJzaW9ucyBvZiB1dGlsLWxpbnV4IHByb3ZpZGUgYGBmZGlza2BgIHN1cHBvcnQgZm9yIGxhcmdlciBkaXNrcywKIHN1cHBvcnQgbmV3IG9wdGlvbnMgdG8gbW91bnQsIHJlY29nbml6ZSBtb3JlIHN1cHBvcnRlZCBwYXJ0aXRpb24KIHR5cGVzLCBoYXZlIGEgZmRmb3JtYXQgd2hpY2ggd29ya3Mgd2l0aCAyLjQga2VybmVscywgYW5kIHNpbWlsYXIgZ29vZGllcy4KIFlvdSdsbCBwcm9iYWJseSB3YW50IHRvIHVwZ3JhZGUuCkBAIC0xMjUsNTQgKzEzNiw1NyBAQAogCiBJZiB0aGUgdW50aGlua2FibGUgaGFwcGVucyBhbmQgeW91ciBrZXJuZWwgb29wc2VzLCB5b3UgbWF5IG5lZWQgdGhlCiBrc3ltb29wcyB0b29sIHRvIGRlY29kZSBpdCwgYnV0IGluIG1vc3QgY2FzZXMgeW91IGRvbid0LgotSXQgaXMgZ2VuZXJhbGx5IHByZWZlcnJlZCB0byBidWlsZCB0aGUga2VybmVsIHdpdGggQ09ORklHX0tBTExTWU1TIHNvCitJdCBpcyBnZW5lcmFsbHkgcHJlZmVycmVkIHRvIGJ1aWxkIHRoZSBrZXJuZWwgd2l0aCBgYENPTkZJR19LQUxMU1lNU2BgIHNvCiB0aGF0IGl0IHByb2R1Y2VzIHJlYWRhYmxlIGR1bXBzIHRoYXQgY2FuIGJlIHVzZWQgYXMtaXMgKHRoaXMgYWxzbwogcHJvZHVjZXMgYmV0dGVyIG91dHB1dCB0aGFuIGtzeW1vb3BzKS4gIElmIGZvciBzb21lIHJlYXNvbiB5b3VyIGtlcm5lbAotaXMgbm90IGJ1aWxkIHdpdGggQ09ORklHX0tBTExTWU1TIGFuZCB5b3UgaGF2ZSBubyB3YXkgdG8gcmVidWlsZCBhbmQKK2lzIG5vdCBidWlsZCB3aXRoIGBgQ09ORklHX0tBTExTWU1TYGAgYW5kIHlvdSBoYXZlIG5vIHdheSB0byByZWJ1aWxkIGFuZAogcmVwcm9kdWNlIHRoZSBPb3BzIHdpdGggdGhhdCBvcHRpb24sIHRoZW4geW91IGNhbiBzdGlsbCBkZWNvZGUgdGhhdCBPb3BzCiB3aXRoIGtzeW1vb3BzLgogCiBNb2R1bGUtSW5pdC1Ub29scwogLS0tLS0tLS0tLS0tLS0tLS0KIAotQSBuZXcgbW9kdWxlIGxvYWRlciBpcyBub3cgaW4gdGhlIGtlcm5lbCB0aGF0IHJlcXVpcmVzIG1vZHVsZS1pbml0LXRvb2xzCitBIG5ldyBtb2R1bGUgbG9hZGVyIGlzIG5vdyBpbiB0aGUga2VybmVsIHRoYXQgcmVxdWlyZXMgYGBtb2R1bGUtaW5pdC10b29sc2BgCiB0byB1c2UuICBJdCBpcyBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggdGhlIDIuNC54IHNlcmllcyBrZXJuZWxzLgogCiBNa2luaXRyZAogLS0tLS0tLS0KIAotVGhlc2UgY2hhbmdlcyB0byB0aGUgL2xpYi9tb2R1bGVzIGZpbGUgdHJlZSBsYXlvdXQgYWxzbyByZXF1aXJlIHRoYXQKK1RoZXNlIGNoYW5nZXMgdG8gdGhlIGBgL2xpYi9tb2R1bGVzYGAgZmlsZSB0cmVlIGxheW91dCBhbHNvIHJlcXVpcmUgdGhhdAogbWtpbml0cmQgYmUgdXBncmFkZWQuCiAKIEUyZnNwcm9ncwogLS0tLS0tLS0tCiAKLVRoZSBsYXRlc3QgdmVyc2lvbiBvZiBlMmZzcHJvZ3MgZml4ZXMgc2V2ZXJhbCBidWdzIGluIGZzY2sgYW5kCitUaGUgbGF0ZXN0IHZlcnNpb24gb2YgYGBlMmZzcHJvZ3NgYCBmaXhlcyBzZXZlcmFsIGJ1Z3MgaW4gZnNjayBhbmQKIGRlYnVnZnMuICBPYnZpb3VzbHksIGl0J3MgYSBnb29kIGlkZWEgdG8gdXBncmFkZS4KIAogSkZTdXRpbHMKIC0tLS0tLS0tCiAKLVRoZSBqZnN1dGlscyBwYWNrYWdlIGNvbnRhaW5zIHRoZSB1dGlsaXRpZXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KK1RoZSBgYGpmc3V0aWxzYGAgcGFja2FnZSBjb250YWlucyB0aGUgdXRpbGl0aWVzIGZvciB0aGUgZmlsZSBzeXN0ZW0uCiBUaGUgZm9sbG93aW5nIHV0aWxpdGllcyBhcmUgYXZhaWxhYmxlOgotbyBmc2NrLmpmcyAtIGluaXRpYXRlIHJlcGxheSBvZiB0aGUgdHJhbnNhY3Rpb24gbG9nLCBhbmQgY2hlY2sKKworLSBgYGZzY2suamZzYGAgLSBpbml0aWF0ZSByZXBsYXkgb2YgdGhlIHRyYW5zYWN0aW9uIGxvZywgYW5kIGNoZWNrCiAgIGFuZCByZXBhaXIgYSBKRlMgZm9ybWF0dGVkIHBhcnRpdGlvbi4KLW8gbWtmcy5qZnMgLSBjcmVhdGUgYSBKRlMgZm9ybWF0dGVkIHBhcnRpdGlvbi4KLW8gb3RoZXIgZmlsZSBzeXN0ZW0gdXRpbGl0aWVzIGFyZSBhbHNvIGF2YWlsYWJsZSBpbiB0aGlzIHBhY2thZ2UuCisKKy0gYGBta2ZzLmpmc2BgIC0gY3JlYXRlIGEgSkZTIGZvcm1hdHRlZCBwYXJ0aXRpb24uCisKKy0gb3RoZXIgZmlsZSBzeXN0ZW0gdXRpbGl0aWVzIGFyZSBhbHNvIGF2YWlsYWJsZSBpbiB0aGlzIHBhY2thZ2UuCiAKIFJlaXNlcmZzcHJvZ3MKIC0tLS0tLS0tLS0tLS0KIAogVGhlIHJlaXNlcmZzcHJvZ3MgcGFja2FnZSBzaG91bGQgYmUgdXNlZCBmb3IgcmVpc2VyZnMtMy42LngKIChMaW51eCBrZXJuZWxzIDIuNC54KS4gSXQgaXMgYSBjb21iaW5lZCBwYWNrYWdlIGFuZCBjb250YWlucyB3b3JraW5nCi12ZXJzaW9ucyBvZiBta3JlaXNlcmZzLCByZXNpemVfcmVpc2VyZnMsIGRlYnVncmVpc2VyZnMgYW5kCi1yZWlzZXJmc2NrLiBUaGVzZSB1dGlscyB3b3JrIG9uIGJvdGggaTM4NiBhbmQgYWxwaGEgcGxhdGZvcm1zLgordmVyc2lvbnMgb2YgYGBta3JlaXNlcmZzYGAsIGBgcmVzaXplX3JlaXNlcmZzYGAsIGBgZGVidWdyZWlzZXJmc2BgIGFuZAorYGByZWlzZXJmc2NrYGAuIFRoZXNlIHV0aWxzIHdvcmsgb24gYm90aCBpMzg2IGFuZCBhbHBoYSBwbGF0Zm9ybXMuCiAKIFhmc3Byb2dzCiAtLS0tLS0tLQogCi1UaGUgbGF0ZXN0IHZlcnNpb24gb2YgeGZzcHJvZ3MgY29udGFpbnMgbWtmcy54ZnMsIHhmc19kYiwgYW5kIHRoZQoteGZzX3JlcGFpciB1dGlsaXRpZXMsIGFtb25nIG90aGVycywgZm9yIHRoZSBYRlMgZmlsZXN5c3RlbS4gIEl0IGlzCitUaGUgbGF0ZXN0IHZlcnNpb24gb2YgYGB4ZnNwcm9nc2BgIGNvbnRhaW5zIGBgbWtmcy54ZnNgYCwgYGB4ZnNfZGJgYCwgYW5kIHRoZQorYGB4ZnNfcmVwYWlyYGAgdXRpbGl0aWVzLCBhbW9uZyBvdGhlcnMsIGZvciB0aGUgWEZTIGZpbGVzeXN0ZW0uICBJdCBpcwogYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50IGFuZCBhbnkgdmVyc2lvbiBmcm9tIDIuMC4wIG9ud2FyZCBzaG91bGQKIHdvcmsgY29ycmVjdGx5IHdpdGggdGhpcyB2ZXJzaW9uIG9mIHRoZSBYRlMga2VybmVsIGNvZGUgKDIuNi4wIG9yCiBsYXRlciBpcyByZWNvbW1lbmRlZCwgZHVlIHRvIHNvbWUgc2lnbmlmaWNhbnQgaW1wcm92ZW1lbnRzKS4KQEAgLTE4MCw3ICsxOTQsNyBAQAogUENNQ0lBdXRpbHMKIC0tLS0tLS0tLS0tCiAKLVBDTUNJQXV0aWxzIHJlcGxhY2VzIHBjbWNpYS1jcy4gSXQgcHJvcGVybHkgc2V0cyB1cAorUENNQ0lBdXRpbHMgcmVwbGFjZXMgYGBwY21jaWEtY3NgYC4gSXQgcHJvcGVybHkgc2V0cyB1cAogUENNQ0lBIHNvY2tldHMgYXQgc3lzdGVtIHN0YXJ0dXAgYW5kIGxvYWRzIHRoZSBhcHByb3ByaWF0ZSBtb2R1bGVzCiBmb3IgMTYtYml0IFBDTUNJQSBkZXZpY2VzIGlmIHRoZSBrZXJuZWwgaXMgbW9kdWxhcml6ZWQgYW5kIHRoZSBob3RwbHVnCiBzdWJzeXN0ZW0gaXMgdXNlZC4KQEAgLTE5OCwxOSArMjEyLDIwIEBACiAKIEEgZHJpdmVyIGhhcyBiZWVuIGFkZGVkIHRvIGFsbG93IHVwZGF0aW5nIG9mIEludGVsIElBMzIgbWljcm9jb2RlLAogYWNjZXNzaWJsZSBhcyBhIG5vcm1hbCAobWlzYykgY2hhcmFjdGVyIGRldmljZS4gIElmIHlvdSBhcmUgbm90IHVzaW5nCi11ZGV2IHlvdSBtYXkgbmVlZCB0bzoKK3VkZXYgeW91IG1heSBuZWVkIHRvOjoKIAotbWtkaXIgL2Rldi9jcHUKLW1rbm9kIC9kZXYvY3B1L21pY3JvY29kZSBjIDEwIDE4NAotY2htb2QgMDY0NCAvZGV2L2NwdS9taWNyb2NvZGUKKyAgbWtkaXIgL2Rldi9jcHUKKyAgbWtub2QgL2Rldi9jcHUvbWljcm9jb2RlIGMgMTAgMTg0CisgIGNobW9kIDA2NDQgL2Rldi9jcHUvbWljcm9jb2RlCiAKIGFzIHJvb3QgYmVmb3JlIHlvdSBjYW4gdXNlIHRoaXMuICBZb3UnbGwgcHJvYmFibHkgYWxzbyB3YW50IHRvCiBnZXQgdGhlIHVzZXItc3BhY2UgbWljcm9jb2RlX2N0bCB1dGlsaXR5IHRvIHVzZSB3aXRoIHRoaXMuCiAKIHVkZXYKIC0tLS0KLXVkZXYgaXMgYSB1c2Vyc3BhY2UgYXBwbGljYXRpb24gZm9yIHBvcHVsYXRpbmcgL2RldiBkeW5hbWljYWxseSB3aXRoCi1vbmx5IGVudHJpZXMgZm9yIGRldmljZXMgYWN0dWFsbHkgcHJlc2VudC4gIHVkZXYgcmVwbGFjZXMgdGhlIGJhc2ljCisKK2BgdWRldmBgIGlzIGEgdXNlcnNwYWNlIGFwcGxpY2F0aW9uIGZvciBwb3B1bGF0aW5nIGBgL2RldmBgIGR5bmFtaWNhbGx5IHdpdGgKK29ubHkgZW50cmllcyBmb3IgZGV2aWNlcyBhY3R1YWxseSBwcmVzZW50LiBgYHVkZXZgYCByZXBsYWNlcyB0aGUgYmFzaWMKIGZ1bmN0aW9uYWxpdHkgb2YgZGV2ZnMsIHdoaWxlIGFsbG93aW5nIHBlcnNpc3RlbnQgZGV2aWNlIG5hbWluZyBmb3IKIGRldmljZXMuCiAKQEAgLTIxOCwxMCArMjMzLDEwIEBACiAtLS0tCiAKIE5lZWRzIGxpYmZ1c2UgMi40LjAgb3IgbGF0ZXIuICBBYnNvbHV0ZSBtaW5pbXVtIGlzIDIuMy4wIGJ1dCBtb3VudAotb3B0aW9ucyAnZGlyZWN0X2lvJyBhbmQgJ2tlcm5lbF9jYWNoZScgd29uJ3Qgd29yay4KK29wdGlvbnMgYGBkaXJlY3RfaW9gYCBhbmQgYGBrZXJuZWxfY2FjaGVgYCB3b24ndCB3b3JrLgogCiBOZXR3b3JraW5nCi09PT09PT09PT09CisqKioqKioqKioqCiAKIEdlbmVyYWwgY2hhbmdlcwogLS0tLS0tLS0tLS0tLS0tCkBAIC0yNDMsOSArMjU4LDkgQEAKIHVwZ3JhZGUgcHBwZCB0byBhdCBsZWFzdCAyLjQuMC4KIAogSWYgeW91IGFyZSBub3QgdXNpbmcgdWRldiwgeW91IG11c3QgaGF2ZSB0aGUgZGV2aWNlIGZpbGUgL2Rldi9wcHAKLXdoaWNoIGNhbiBiZSBtYWRlIGJ5Ogord2hpY2ggY2FuIGJlIG1hZGUgYnk6OgogCi1ta25vZCAvZGV2L3BwcCBjIDEwOCAwCisgIG1rbm9kIC9kZXYvcHBwIGMgMTA4IDAKIAogYXMgcm9vdC4KIApAQCAtMjYwLDIyICsyNzUsMjIgQEAKIAogSW4gYW5jaWVudCAoMi40IGFuZCBlYXJsaWVyKSBrZXJuZWxzLCB0aGUgbmZzIHNlcnZlciBuZWVkZWQgdG8ga25vdwogYWJvdXQgYW55IGNsaWVudCB0aGF0IGV4cGVjdGVkIHRvIGJlIGFibGUgdG8gYWNjZXNzIGZpbGVzIHZpYSBORlMuICBUaGlzCi1pbmZvcm1hdGlvbiB3b3VsZCBiZSBnaXZlbiB0byB0aGUga2VybmVsIGJ5ICJtb3VudGQiIHdoZW4gdGhlIGNsaWVudAotbW91bnRlZCB0aGUgZmlsZXN5c3RlbSwgb3IgYnkgImV4cG9ydGZzIiBhdCBzeXN0ZW0gc3RhcnR1cC4gIGV4cG9ydGZzCi13b3VsZCB0YWtlIGluZm9ybWF0aW9uIGFib3V0IGFjdGl2ZSBjbGllbnRzIGZyb20gL3Zhci9saWIvbmZzL3JtdGFiLgoraW5mb3JtYXRpb24gd291bGQgYmUgZ2l2ZW4gdG8gdGhlIGtlcm5lbCBieSBgYG1vdW50ZGBgIHdoZW4gdGhlIGNsaWVudAorbW91bnRlZCB0aGUgZmlsZXN5c3RlbSwgb3IgYnkgYGBleHBvcnRmc2BgIGF0IHN5c3RlbSBzdGFydHVwLiAgZXhwb3J0ZnMKK3dvdWxkIHRha2UgaW5mb3JtYXRpb24gYWJvdXQgYWN0aXZlIGNsaWVudHMgZnJvbSBgYC92YXIvbGliL25mcy9ybXRhYmBgLgogCiBUaGlzIGFwcHJvYWNoIGlzIHF1aXRlIGZyYWdpbGUgYXMgaXQgZGVwZW5kcyBvbiBybXRhYiBiZWluZyBjb3JyZWN0CiB3aGljaCBpcyBub3QgYWx3YXlzIGVhc3ksIHBhcnRpY3VsYXJseSB3aGVuIHRyeWluZyB0byBpbXBsZW1lbnQKLWZhaWwtb3Zlci4gIEV2ZW4gd2hlbiB0aGUgc3lzdGVtIGlzIHdvcmtpbmcgd2VsbCwgcm10YWIgc3VmZmVycyBmcm9tCitmYWlsLW92ZXIuICBFdmVuIHdoZW4gdGhlIHN5c3RlbSBpcyB3b3JraW5nIHdlbGwsIGBgcm10YWJgYCBzdWZmZXJzIGZyb20KIGdldHRpbmcgbG90cyBvZiBvbGQgZW50cmllcyB0aGF0IG5ldmVyIGdldCByZW1vdmVkLgogCiBXaXRoIG1vZGVybiBrZXJuZWxzIHdlIGhhdmUgdGhlIG9wdGlvbiBvZiBoYXZpbmcgdGhlIGtlcm5lbCB0ZWxsIG1vdW50ZAogd2hlbiBpdCBnZXRzIGEgcmVxdWVzdCBmcm9tIGFuIHVua25vd24gaG9zdCwgYW5kIG1vdW50ZCBjYW4gZ2l2ZQogYXBwcm9wcmlhdGUgZXhwb3J0IGluZm9ybWF0aW9uIHRvIHRoZSBrZXJuZWwuICBUaGlzIHJlbW92ZXMgdGhlCi1kZXBlbmRlbmN5IG9uIHJtdGFiIGFuZCBtZWFucyB0aGF0IHRoZSBrZXJuZWwgb25seSBuZWVkcyB0byBrbm93IGFib3V0CitkZXBlbmRlbmN5IG9uIGBgcm10YWJgYCBhbmQgbWVhbnMgdGhhdCB0aGUga2VybmVsIG9ubHkgbmVlZHMgdG8ga25vdyBhYm91dAogY3VycmVudGx5IGFjdGl2ZSBjbGllbnRzLgogCi1UbyBlbmFibGUgdGhpcyBuZXcgZnVuY3Rpb25hbGl0eSwgeW91IG5lZWQgdG86CitUbyBlbmFibGUgdGhpcyBuZXcgZnVuY3Rpb25hbGl0eSwgeW91IG5lZWQgdG86OgogCiAgIG1vdW50IC10IG5mc2QgbmZzZCAvcHJvYy9mcy9uZnNkCiAKQEAgLTI4Nyw4ICszMDIsMzIgQEAKIC0tLS0tLQogCiBPbiB4ODYga2VybmVscyB0aGUgbWNlbG9nIHV0aWxpdHkgaXMgbmVlZGVkIHRvIHByb2Nlc3MgYW5kIGxvZyBtYWNoaW5lIGNoZWNrCi1ldmVudHMgd2hlbiBDT05GSUdfWDg2X01DRSBpcyBlbmFibGVkLiBNYWNoaW5lIGNoZWNrIGV2ZW50cyBhcmUgZXJyb3JzIHJlcG9ydGVkCi1ieSB0aGUgQ1BVLiBQcm9jZXNzaW5nIHRoZW0gaXMgc3Ryb25nbHkgZW5jb3VyYWdlZC4KK2V2ZW50cyB3aGVuIGBgQ09ORklHX1g4Nl9NQ0VgYCBpcyBlbmFibGVkLiBNYWNoaW5lIGNoZWNrIGV2ZW50cyBhcmUgZXJyb3JzCityZXBvcnRlZCBieSB0aGUgQ1BVLiBQcm9jZXNzaW5nIHRoZW0gaXMgc3Ryb25nbHkgZW5jb3VyYWdlZC4KKworS2VybmVsIGRvY3VtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqCisKK1NwaGlueAorLS0tLS0tCisKK1RoZSBSZVNUIG1hcmt1cHMgY3VycmVudGx5IHVzZWQgYnkgdGhlIERvY3VtZW50YXRpb24vIGZpbGVzIGFyZSBtZWFudCB0byBiZQorYnVpbHQgd2l0aCBgYFNwaGlueGBgIHZlcnNpb24gMS4yIG9yIHVwcGVyLiBJZiB5b3UncmUgZGVzaXJpbmcgdG8gYnVpbGQKK1BERiBvdXRwdXRzLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdmVyc2lvbiAxLjQuNi4KKworLi4gbm90ZTo6CisKKyAgUGxlYXNlIG5vdGljZSB0aGF0LCBmb3IgUERGIGFuZCBMYVRlWCBvdXRwdXQsIHlvdSdsbCBhbHNvIG5lZWQgYGBYZUxhVGVYYGAKKyAgdmVyc2lvbiAzLjE0MTU5MjY1LiBEZXBlbmRpbmcgb24gdGhlIGRpc3RyaWJ1dGlvbiwgeW91IG1heSBhbHNvIG5lZWQKKyAgdG8gaW5zdGFsbCBhIHNlcmllcyBvZiBgYHRleGxpdmVgYCBwYWNrYWdlcyB0aGF0IHByb3ZpZGUgdGhlIG1pbmltYWwKKyAgc2V0IG9mIGZ1bmN0aW9uYWxpdGllcyByZXF1aXJlZCBmb3IgYGBYZUxhVGV4YGAgdG8gd29yay4KKworT3RoZXIgdG9vbHMKKy0tLS0tLS0tLS0tCisKK0luIG9yZGVyIHRvIHByb2R1Y2UgZG9jdW1lbnRhdGlvbiBmcm9tIERvY0Jvb2ssIHlvdSdsbCBhbHNvIG5lZWQgYGB4bWx0b2BgLgorUGxlYXNlIG5vdGljZSwgaG93ZXZlciwgdGhhdCB3ZSdyZSBjdXJyZW50bHkgbWlncmF0aW5nIGFsbCBkb2N1bWVudHMgdG8gdXNlCitgYFNwaGlueGBgLgogCiBHZXR0aW5nIHVwZGF0ZWQgc29mdHdhcmUKID09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMjk4LDExNCArMzM3LDE0OSBAQAogCiBnY2MKIC0tLQotbyAgPGZ0cDovL2Z0cC5nbnUub3JnL2dudS9nY2MvPgorCistIDxmdHA6Ly9mdHAuZ251Lm9yZy9nbnUvZ2NjLz4KIAogTWFrZQogLS0tLQotbyAgPGZ0cDovL2Z0cC5nbnUub3JnL2dudS9tYWtlLz4KKworLSA8ZnRwOi8vZnRwLmdudS5vcmcvZ251L21ha2UvPgogCiBCaW51dGlscwogLS0tLS0tLS0KLW8gIDxmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgvZGV2ZWwvYmludXRpbHMvPgorCistIDxmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgvZGV2ZWwvYmludXRpbHMvPgogCiBPcGVuU1NMCiAtLS0tLS0tCi1vICA8aHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvPgorCistIDxodHRwczovL3d3dy5vcGVuc3NsLm9yZy8+CiAKIFN5c3RlbSB1dGlsaXRpZXMKICoqKioqKioqKioqKioqKioKIAogVXRpbC1saW51eAogLS0tLS0tLS0tLQotbyAgPGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy91dGlsLWxpbnV4Lz4KKworLSA8ZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL3V0aWwtbGludXgvPgogCiBLc3ltb29wcwogLS0tLS0tLS0KLW8gIDxmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMva2VybmVsL2tzeW1vb3BzL3YyLjQvPgorCistIDxmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMva2VybmVsL2tzeW1vb3BzL3YyLjQvPgogCiBNb2R1bGUtSW5pdC1Ub29scwogLS0tLS0tLS0tLS0tLS0tLS0KLW8gIDxmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3Blb3BsZS9ydXN0eS9tb2R1bGVzLz4KKworLSA8ZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9wZW9wbGUvcnVzdHkvbW9kdWxlcy8+CiAKIE1raW5pdHJkCiAtLS0tLS0tLQotbyAgPGh0dHBzOi8vY29kZS5sYXVuY2hwYWQubmV0L2luaXRyZC10b29scy9tYWluPgorCistIDxodHRwczovL2NvZGUubGF1bmNocGFkLm5ldC9pbml0cmQtdG9vbHMvbWFpbj4KIAogRTJmc3Byb2dzCiAtLS0tLS0tLS0KLW8gIDxodHRwOi8vcHJkb3dubG9hZHMuc291cmNlZm9yZ2UubmV0L2UyZnNwcm9ncy9lMmZzcHJvZ3MtMS4yOS50YXIuZ3o+CisKKy0gPGh0dHA6Ly9wcmRvd25sb2Fkcy5zb3VyY2Vmb3JnZS5uZXQvZTJmc3Byb2dzL2UyZnNwcm9ncy0xLjI5LnRhci5nej4KIAogSkZTdXRpbHMKIC0tLS0tLS0tCi1vICA8aHR0cDovL2pmcy5zb3VyY2Vmb3JnZS5uZXQvPgorCistIDxodHRwOi8vamZzLnNvdXJjZWZvcmdlLm5ldC8+CiAKIFJlaXNlcmZzcHJvZ3MKIC0tLS0tLS0tLS0tLS0KLW8gIDxodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL2ZzL3JlaXNlcmZzLz4KKworLSA8aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9mcy9yZWlzZXJmcy8+CiAKIFhmc3Byb2dzCiAtLS0tLS0tLQotbyAgPGZ0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL3hmcy8+CisKKy0gPGZ0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL3hmcy8+CiAKIFBjbWNpYXV0aWxzCiAtLS0tLS0tLS0tLQotbyAgPGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9rZXJuZWwvcGNtY2lhLz4KKworLSA8ZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL2tlcm5lbC9wY21jaWEvPgogCiBRdW90YS10b29scwotLS0tLS0tLS0tLQotbyAgPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGludXhxdW90YS8+CistLS0tLS0tLS0tLQorCistIDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpbnV4cXVvdGEvPgogCiBEb2NCb29rIFN0eWxlc2hlZXRzCiAtLS0tLS0tLS0tLS0tLS0tLS0tCi1vICA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9kb2Nib29rL2ZpbGVzL2RvY2Jvb2stZHNzc2wvPgorCistIDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2RvY2Jvb2svZmlsZXMvZG9jYm9vay1kc3NzbC8+CiAKIFhNTFRPIFhTTFQgRnJvbnRlbmQKIC0tLS0tLS0tLS0tLS0tLS0tLS0KLW8gIDxodHRwOi8vY3liZXJlbGsubmV0L3RpbS94bWx0by8+CisKKy0gPGh0dHA6Ly9jeWJlcmVsay5uZXQvdGltL3htbHRvLz4KIAogSW50ZWwgUDYgbWljcm9jb2RlCiAtLS0tLS0tLS0tLS0tLS0tLS0KLW8gIDxodHRwczovL2Rvd25sb2FkY2VudGVyLmludGVsLmNvbS8+CisKKy0gPGh0dHBzOi8vZG93bmxvYWRjZW50ZXIuaW50ZWwuY29tLz4KIAogdWRldgogLS0tLQotbyA8aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvc3lzdGVtZC9tYW4vdWRldi5odG1sPgorCistIDxodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9zeXN0ZW1kL21hbi91ZGV2Lmh0bWw+CiAKIEZVU0UKIC0tLS0KLW8gPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZnVzZT4KKworLSA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9mdXNlPgogCiBtY2Vsb2cKIC0tLS0tLQotbyA8aHR0cDovL3d3dy5tY2Vsb2cub3JnLz4KKworLSA8aHR0cDovL3d3dy5tY2Vsb2cub3JnLz4KIAogTmV0d29ya2luZwogKioqKioqKioqKgogCiBQUFAKIC0tLQotbyAgPGZ0cDovL2Z0cC5zYW1iYS5vcmcvcHViL3BwcC8+CisKKy0gPGZ0cDovL2Z0cC5zYW1iYS5vcmcvcHViL3BwcC8+CiAKIElzZG40ay11dGlscwogLS0tLS0tLS0tLS0tCi1vICA8ZnRwOi8vZnRwLmlzZG40bGludXguZGUvcHViL2lzZG40bGludXgvdXRpbHMvPgorCistIDxmdHA6Ly9mdHAuaXNkbjRsaW51eC5kZS9wdWIvaXNkbjRsaW51eC91dGlscy8+CiAKIE5GUy11dGlscwogLS0tLS0tLS0tCi1vICA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9MTQ+CisKKy0gPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTE0PgogCiBJcHRhYmxlcwogLS0tLS0tLS0KLW8gIDxodHRwOi8vd3d3LmlwdGFibGVzLm9yZy9kb3dubG9hZHMuaHRtbD4KKworLSA8aHR0cDovL3d3dy5pcHRhYmxlcy5vcmcvZG93bmxvYWRzLmh0bWw+CiAKIElwLXJvdXRlMgogLS0tLS0tLS0tCi1vICA8aHR0cHM6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMvbmV0L2lwcm91dGUyLz4KKworLSA8aHR0cHM6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMvbmV0L2lwcm91dGUyLz4KIAogT1Byb2ZpbGUKIC0tLS0tLS0tCi1vICA8aHR0cDovL29wcm9maWxlLnNmLm5ldC9kb3dubG9hZC8+CisKKy0gPGh0dHA6Ly9vcHJvZmlsZS5zZi5uZXQvZG93bmxvYWQvPgogCiBORlMtVXRpbHMKIC0tLS0tLS0tLQotbyAgPGh0dHA6Ly9uZnMuc291cmNlZm9yZ2UubmV0Lz4KKworLSA8aHR0cDovL25mcy5zb3VyY2Vmb3JnZS5uZXQvPgorCitLZXJuZWwgZG9jdW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioKKworU3BoaW54CistLS0tLS0KKworLSA8aHR0cDovL3d3dy5zcGhpbngtZG9jLm9yZy8+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0NvZGVPZkNvbmZsaWN0IGIvRG9jdW1lbnRhdGlvbi9Db2RlT2ZDb25mbGljdAppbmRleCAxNjg0ZDBiLi40OWE4ZWNjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NvZGVPZkNvbmZsaWN0CisrKyBiL0RvY3VtZW50YXRpb24vQ29kZU9mQ29uZmxpY3QKQEAgLTE5LDcgKzE5LDcgQEAKIHdpbGwgd29yayB0byByZXNvbHZlIHRoZSBpc3N1ZSB0byB0aGUgYmVzdCBvZiB0aGVpciBhYmlsaXR5LiAgRm9yIG1vcmUKIGluZm9ybWF0aW9uIG9uIHdobyBpcyBvbiB0aGUgVGVjaG5pY2FsIEFkdmlzb3J5IEJvYXJkIGFuZCB3aGF0IHRoZWlyCiByb2xlIGlzLCBwbGVhc2Ugc2VlOgotCWh0dHA6Ly93d3cubGludXhmb3VuZGF0aW9uLm9yZy9wcm9ncmFtcy9hZHZpc29yeS1jb3VuY2lscy90YWIKKwlodHRwOi8vd3d3LmxpbnV4Zm91bmRhdGlvbi5vcmcvcHJvamVjdHMvbGludXgvdGFiCiAKIEFzIGEgcmV2aWV3ZXIgb2YgY29kZSwgcGxlYXNlIHN0cml2ZSB0byBrZWVwIHRoaW5ncyBjaXZpbCBhbmQgZm9jdXNlZCBvbgogdGhlIHRlY2huaWNhbCBpc3N1ZXMgaW52b2x2ZWQuICBXZSBhcmUgYWxsIGh1bWFucywgYW5kIGZydXN0cmF0aW9ucyBjYW4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUgYi9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCmluZGV4IGEwOTY4MzYuLjljNjFjMDMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKKysrIGIvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQpAQCAtMSw4ICsxLDEwIEBACisuLiBfY29kaW5nc3R5bGU6CiAKLQkJTGludXgga2VybmVsIGNvZGluZyBzdHlsZQorTGludXgga2VybmVsIGNvZGluZyBzdHlsZQorPT09PT09PT09PT09PT09PT09PT09PT09PQogCiBUaGlzIGlzIGEgc2hvcnQgZG9jdW1lbnQgZGVzY3JpYmluZyB0aGUgcHJlZmVycmVkIGNvZGluZyBzdHlsZSBmb3IgdGhlCi1saW51eCBrZXJuZWwuICBDb2Rpbmcgc3R5bGUgaXMgdmVyeSBwZXJzb25hbCwgYW5kIEkgd29uJ3QgX2ZvcmNlXyBteQorbGludXgga2VybmVsLiAgQ29kaW5nIHN0eWxlIGlzIHZlcnkgcGVyc29uYWwsIGFuZCBJIHdvbid0ICoqZm9yY2UqKiBteQogdmlld3Mgb24gYW55Ym9keSwgYnV0IHRoaXMgaXMgd2hhdCBnb2VzIGZvciBhbnl0aGluZyB0aGF0IEkgaGF2ZSB0byBiZQogYWJsZSB0byBtYWludGFpbiwgYW5kIEknZCBwcmVmZXIgaXQgZm9yIG1vc3Qgb3RoZXIgdGhpbmdzIHRvby4gIFBsZWFzZQogYXQgbGVhc3QgY29uc2lkZXIgdGhlIHBvaW50cyBtYWRlIGhlcmUuCkBAIC0xMyw3ICsxNSw4IEBACiBBbnl3YXksIGhlcmUgZ29lczoKIAogCi0JCUNoYXB0ZXIgMTogSW5kZW50YXRpb24KKzEpIEluZGVudGF0aW9uCistLS0tLS0tLS0tLS0tLQogCiBUYWJzIGFyZSA4IGNoYXJhY3RlcnMsIGFuZCB0aHVzIGluZGVudGF0aW9ucyBhcmUgYWxzbyA4IGNoYXJhY3RlcnMuCiBUaGVyZSBhcmUgaGVyZXRpYyBtb3ZlbWVudHMgdGhhdCB0cnkgdG8gbWFrZSBpbmRlbnRhdGlvbnMgNCAob3IgZXZlbiAyISkKQEAgLTM2LDggKzM5LDEwIEBACiBIZWVkIHRoYXQgd2FybmluZy4KIAogVGhlIHByZWZlcnJlZCB3YXkgdG8gZWFzZSBtdWx0aXBsZSBpbmRlbnRhdGlvbiBsZXZlbHMgaW4gYSBzd2l0Y2ggc3RhdGVtZW50IGlzCi10byBhbGlnbiB0aGUgInN3aXRjaCIgYW5kIGl0cyBzdWJvcmRpbmF0ZSAiY2FzZSIgbGFiZWxzIGluIHRoZSBzYW1lIGNvbHVtbgotaW5zdGVhZCBvZiAiZG91YmxlLWluZGVudGluZyIgdGhlICJjYXNlIiBsYWJlbHMuICBFLmcuOgordG8gYWxpZ24gdGhlIGBgc3dpdGNoYGAgYW5kIGl0cyBzdWJvcmRpbmF0ZSBgYGNhc2VgYCBsYWJlbHMgaW4gdGhlIHNhbWUgY29sdW1uCitpbnN0ZWFkIG9mIGBgZG91YmxlLWluZGVudGluZ2BgIHRoZSBgYGNhc2VgYCBsYWJlbHMuICBFLmcuOgorCisuLiBjb2RlLWJsb2NrOjogYwogCiAJc3dpdGNoIChzdWZmaXgpIHsKIAljYXNlICdHJzoKQEAgLTU5LDYgKzY0LDggQEAKIERvbid0IHB1dCBtdWx0aXBsZSBzdGF0ZW1lbnRzIG9uIGEgc2luZ2xlIGxpbmUgdW5sZXNzIHlvdSBoYXZlCiBzb21ldGhpbmcgdG8gaGlkZToKIAorLi4gY29kZS1ibG9jazo6IGMKKwogCWlmIChjb25kaXRpb24pIGRvX3RoaXM7CiAJICBkb19zb21ldGhpbmdfZXZlcnl0aW1lOwogCkBAIC03MSw3ICs3OCw4IEBACiBHZXQgYSBkZWNlbnQgZWRpdG9yIGFuZCBkb24ndCBsZWF2ZSB3aGl0ZXNwYWNlIGF0IHRoZSBlbmQgb2YgbGluZXMuCiAKIAotCQlDaGFwdGVyIDI6IEJyZWFraW5nIGxvbmcgbGluZXMgYW5kIHN0cmluZ3MKKzIpIEJyZWFraW5nIGxvbmcgbGluZXMgYW5kIHN0cmluZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQ29kaW5nIHN0eWxlIGlzIGFsbCBhYm91dCByZWFkYWJpbGl0eSBhbmQgbWFpbnRhaW5hYmlsaXR5IHVzaW5nIGNvbW1vbmx5CiBhdmFpbGFibGUgdG9vbHMuCkBAIC04Nyw3ICs5NSw4IEBACiBwcmludGsgbWVzc2FnZXMsIGJlY2F1c2UgdGhhdCBicmVha3MgdGhlIGFiaWxpdHkgdG8gZ3JlcCBmb3IgdGhlbS4KIAogCi0JCUNoYXB0ZXIgMzogUGxhY2luZyBCcmFjZXMgYW5kIFNwYWNlcworMykgUGxhY2luZyBCcmFjZXMgYW5kIFNwYWNlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGUgb3RoZXIgaXNzdWUgdGhhdCBhbHdheXMgY29tZXMgdXAgaW4gQyBzdHlsaW5nIGlzIHRoZSBwbGFjZW1lbnQgb2YKIGJyYWNlcy4gIFVubGlrZSB0aGUgaW5kZW50IHNpemUsIHRoZXJlIGFyZSBmZXcgdGVjaG5pY2FsIHJlYXNvbnMgdG8KQEAgLTk1LDYgKzEwNCw4IEBACiBzaG93biB0byB1cyBieSB0aGUgcHJvcGhldHMgS2VybmlnaGFuIGFuZCBSaXRjaGllLCBpcyB0byBwdXQgdGhlIG9wZW5pbmcKIGJyYWNlIGxhc3Qgb24gdGhlIGxpbmUsIGFuZCBwdXQgdGhlIGNsb3NpbmcgYnJhY2UgZmlyc3QsIHRodXNseToKIAorLi4gY29kZS1ibG9jazo6IGMKKwogCWlmICh4IGlzIHRydWUpIHsKIAkJd2UgZG8geQogCX0KQEAgLTEwMiw2ICsxMTMsOCBAQAogVGhpcyBhcHBsaWVzIHRvIGFsbCBub24tZnVuY3Rpb24gc3RhdGVtZW50IGJsb2NrcyAoaWYsIHN3aXRjaCwgZm9yLAogd2hpbGUsIGRvKS4gIEUuZy46CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgS09CSl9BREQ6CiAJCXJldHVybiAiYWRkIjsKQEAgLTExNiw2ICsxMjksOCBAQAogSG93ZXZlciwgdGhlcmUgaXMgb25lIHNwZWNpYWwgY2FzZSwgbmFtZWx5IGZ1bmN0aW9uczogdGhleSBoYXZlIHRoZQogb3BlbmluZyBicmFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGxpbmUsIHRodXM6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAlpbnQgZnVuY3Rpb24oaW50IHgpCiAJewogCQlib2R5IG9mIGZ1bmN0aW9uCkBAIC0xMjMsMjAgKzEzOCwyNCBAQAogCiBIZXJldGljIHBlb3BsZSBhbGwgb3ZlciB0aGUgd29ybGQgaGF2ZSBjbGFpbWVkIHRoYXQgdGhpcyBpbmNvbnNpc3RlbmN5CiBpcyAuLi4gIHdlbGwgLi4uICBpbmNvbnNpc3RlbnQsIGJ1dCBhbGwgcmlnaHQtdGhpbmtpbmcgcGVvcGxlIGtub3cgdGhhdAotKGEpIEsmUiBhcmUgX3JpZ2h0XyBhbmQgKGIpIEsmUiBhcmUgcmlnaHQuICBCZXNpZGVzLCBmdW5jdGlvbnMgYXJlCisoYSkgSyZSIGFyZSAqKnJpZ2h0KiogYW5kIChiKSBLJlIgYXJlIHJpZ2h0LiAgQmVzaWRlcywgZnVuY3Rpb25zIGFyZQogc3BlY2lhbCBhbnl3YXkgKHlvdSBjYW4ndCBuZXN0IHRoZW0gaW4gQykuCiAKLU5vdGUgdGhhdCB0aGUgY2xvc2luZyBicmFjZSBpcyBlbXB0eSBvbiBhIGxpbmUgb2YgaXRzIG93biwgX2V4Y2VwdF8gaW4KK05vdGUgdGhhdCB0aGUgY2xvc2luZyBicmFjZSBpcyBlbXB0eSBvbiBhIGxpbmUgb2YgaXRzIG93biwgKipleGNlcHQqKiBpbgogdGhlIGNhc2VzIHdoZXJlIGl0IGlzIGZvbGxvd2VkIGJ5IGEgY29udGludWF0aW9uIG9mIHRoZSBzYW1lIHN0YXRlbWVudCwKLWllIGEgIndoaWxlIiBpbiBhIGRvLXN0YXRlbWVudCBvciBhbiAiZWxzZSIgaW4gYW4gaWYtc3RhdGVtZW50LCBsaWtlCitpZSBhIGBgd2hpbGVgYCBpbiBhIGRvLXN0YXRlbWVudCBvciBhbiBgYGVsc2VgYCBpbiBhbiBpZi1zdGF0ZW1lbnQsIGxpa2UKIHRoaXM6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAlkbyB7CiAJCWJvZHkgb2YgZG8tbG9vcAogCX0gd2hpbGUgKGNvbmRpdGlvbik7CiAKIGFuZAogCisuLiBjb2RlLWJsb2NrOjogYworCiAJaWYgKHggPT0geSkgewogCQkuLgogCX0gZWxzZSBpZiAoeCA+IHkpIHsKQEAgLTE1NSwxMSArMTc0LDE1IEBACiAKIERvIG5vdCB1bm5lY2Vzc2FyaWx5IHVzZSBicmFjZXMgd2hlcmUgYSBzaW5nbGUgc3RhdGVtZW50IHdpbGwgZG8uCiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAlpZiAoY29uZGl0aW9uKQogCQlhY3Rpb24oKTsKIAogYW5kCiAKKy4uIGNvZGUtYmxvY2s6OiBub25lCisKIAlpZiAoY29uZGl0aW9uKQogCQlkb190aGlzKCk7CiAJZWxzZQpAQCAtMTY4LDYgKzE5MSw4IEBACiBUaGlzIGRvZXMgbm90IGFwcGx5IGlmIG9ubHkgb25lIGJyYW5jaCBvZiBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCBpcyBhIHNpbmdsZQogc3RhdGVtZW50OyBpbiB0aGUgbGF0dGVyIGNhc2UgdXNlIGJyYWNlcyBpbiBib3RoIGJyYW5jaGVzOgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJaWYgKGNvbmRpdGlvbikgewogCQlkb190aGlzKCk7CiAJCWRvX3RoYXQoKTsKQEAgLTE3NSw1NyArMjAwLDY3IEBACiAJCW90aGVyd2lzZSgpOwogCX0KIAotCQkzLjE6ICBTcGFjZXMKKzMuMSkgU3BhY2VzCisqKioqKioqKioqKgogCiBMaW51eCBrZXJuZWwgc3R5bGUgZm9yIHVzZSBvZiBzcGFjZXMgZGVwZW5kcyAobW9zdGx5KSBvbgogZnVuY3Rpb24tdmVyc3VzLWtleXdvcmQgdXNhZ2UuICBVc2UgYSBzcGFjZSBhZnRlciAobW9zdCkga2V5d29yZHMuICBUaGUKIG5vdGFibGUgZXhjZXB0aW9ucyBhcmUgc2l6ZW9mLCB0eXBlb2YsIGFsaWdub2YsIGFuZCBfX2F0dHJpYnV0ZV9fLCB3aGljaCBsb29rCiBzb21ld2hhdCBsaWtlIGZ1bmN0aW9ucyAoYW5kIGFyZSB1c3VhbGx5IHVzZWQgd2l0aCBwYXJlbnRoZXNlcyBpbiBMaW51eCwKLWFsdGhvdWdoIHRoZXkgYXJlIG5vdCByZXF1aXJlZCBpbiB0aGUgbGFuZ3VhZ2UsIGFzIGluOiAic2l6ZW9mIGluZm8iIGFmdGVyCi0ic3RydWN0IGZpbGVpbmZvIGluZm87IiBpcyBkZWNsYXJlZCkuCithbHRob3VnaCB0aGV5IGFyZSBub3QgcmVxdWlyZWQgaW4gdGhlIGxhbmd1YWdlLCBhcyBpbjogYGBzaXplb2YgaW5mb2BgIGFmdGVyCitgYHN0cnVjdCBmaWxlaW5mbyBpbmZvO2BgIGlzIGRlY2xhcmVkKS4KIAotU28gdXNlIGEgc3BhY2UgYWZ0ZXIgdGhlc2Uga2V5d29yZHM6CitTbyB1c2UgYSBzcGFjZSBhZnRlciB0aGVzZSBrZXl3b3Jkczo6CiAKIAlpZiwgc3dpdGNoLCBjYXNlLCBmb3IsIGRvLCB3aGlsZQogCiBidXQgbm90IHdpdGggc2l6ZW9mLCB0eXBlb2YsIGFsaWdub2YsIG9yIF9fYXR0cmlidXRlX18uICBFLmcuLAogCisuLiBjb2RlLWJsb2NrOjogYworCisKIAlzID0gc2l6ZW9mKHN0cnVjdCBmaWxlKTsKIAogRG8gbm90IGFkZCBzcGFjZXMgYXJvdW5kIChpbnNpZGUpIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbnMuICBUaGlzIGV4YW1wbGUgaXMKLSpiYWQqOgorKipiYWQqKjoKKworLi4gY29kZS1ibG9jazo6IGMKKwogCiAJcyA9IHNpemVvZiggc3RydWN0IGZpbGUgKTsKIAogV2hlbiBkZWNsYXJpbmcgcG9pbnRlciBkYXRhIG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcG9pbnRlciB0eXBlLCB0aGUKLXByZWZlcnJlZCB1c2Ugb2YgJyonIGlzIGFkamFjZW50IHRvIHRoZSBkYXRhIG5hbWUgb3IgZnVuY3Rpb24gbmFtZSBhbmQgbm90CitwcmVmZXJyZWQgdXNlIG9mIGBgKmBgIGlzIGFkamFjZW50IHRvIHRoZSBkYXRhIG5hbWUgb3IgZnVuY3Rpb24gbmFtZSBhbmQgbm90CiBhZGphY2VudCB0byB0aGUgdHlwZSBuYW1lLiAgRXhhbXBsZXM6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKKwogCWNoYXIgKmxpbnV4X2Jhbm5lcjsKIAl1bnNpZ25lZCBsb25nIGxvbmcgbWVtcGFyc2UoY2hhciAqcHRyLCBjaGFyICoqcmV0cHRyKTsKIAljaGFyICptYXRjaF9zdHJkdXAoc3Vic3RyaW5nX3QgKnMpOwogCiBVc2Ugb25lIHNwYWNlIGFyb3VuZCAob24gZWFjaCBzaWRlIG9mKSBtb3N0IGJpbmFyeSBhbmQgdGVybmFyeSBvcGVyYXRvcnMsCi1zdWNoIGFzIGFueSBvZiB0aGVzZToKK3N1Y2ggYXMgYW55IG9mIHRoZXNlOjoKIAogCT0gICsgIC0gIDwgID4gICogIC8gICUgIHwgICYgIF4gIDw9ICA+PSAgPT0gICE9ICA/ICA6CiAKLWJ1dCBubyBzcGFjZSBhZnRlciB1bmFyeSBvcGVyYXRvcnM6CitidXQgbm8gc3BhY2UgYWZ0ZXIgdW5hcnkgb3BlcmF0b3JzOjoKIAogCSYgICogICsgIC0gIH4gICEgIHNpemVvZiAgdHlwZW9mICBhbGlnbm9mICBfX2F0dHJpYnV0ZV9fICBkZWZpbmVkCiAKLW5vIHNwYWNlIGJlZm9yZSB0aGUgcG9zdGZpeCBpbmNyZW1lbnQgJiBkZWNyZW1lbnQgdW5hcnkgb3BlcmF0b3JzOgorbm8gc3BhY2UgYmVmb3JlIHRoZSBwb3N0Zml4IGluY3JlbWVudCAmIGRlY3JlbWVudCB1bmFyeSBvcGVyYXRvcnM6OgogCiAJKysgIC0tCiAKLW5vIHNwYWNlIGFmdGVyIHRoZSBwcmVmaXggaW5jcmVtZW50ICYgZGVjcmVtZW50IHVuYXJ5IG9wZXJhdG9yczoKK25vIHNwYWNlIGFmdGVyIHRoZSBwcmVmaXggaW5jcmVtZW50ICYgZGVjcmVtZW50IHVuYXJ5IG9wZXJhdG9yczo6CiAKIAkrKyAgLS0KIAotYW5kIG5vIHNwYWNlIGFyb3VuZCB0aGUgJy4nIGFuZCAiLT4iIHN0cnVjdHVyZSBtZW1iZXIgb3BlcmF0b3JzLgorYW5kIG5vIHNwYWNlIGFyb3VuZCB0aGUgYGAuYGAgYW5kIGBgLT5gYCBzdHJ1Y3R1cmUgbWVtYmVyIG9wZXJhdG9ycy4KIAogRG8gbm90IGxlYXZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgYXQgdGhlIGVuZHMgb2YgbGluZXMuICBTb21lIGVkaXRvcnMgd2l0aAotInNtYXJ0IiBpbmRlbnRhdGlvbiB3aWxsIGluc2VydCB3aGl0ZXNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgbmV3IGxpbmVzIGFzCitgYHNtYXJ0YGAgaW5kZW50YXRpb24gd2lsbCBpbnNlcnQgd2hpdGVzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIG5ldyBsaW5lcyBhcwogYXBwcm9wcmlhdGUsIHNvIHlvdSBjYW4gc3RhcnQgdHlwaW5nIHRoZSBuZXh0IGxpbmUgb2YgY29kZSByaWdodCBhd2F5LgogSG93ZXZlciwgc29tZSBzdWNoIGVkaXRvcnMgZG8gbm90IHJlbW92ZSB0aGUgd2hpdGVzcGFjZSBpZiB5b3UgZW5kIHVwIG5vdAogcHV0dGluZyBhIGxpbmUgb2YgY29kZSB0aGVyZSwgc3VjaCBhcyBpZiB5b3UgbGVhdmUgYSBibGFuayBsaW5lLiAgQXMgYSByZXN1bHQsCkBAIC0yMzcsMjIgKzI3MiwyMyBAQAogY29udGV4dCBsaW5lcy4KIAogCi0JCUNoYXB0ZXIgNDogTmFtaW5nCis0KSBOYW1pbmcKKy0tLS0tLS0tLQogCiBDIGlzIGEgU3BhcnRhbiBsYW5ndWFnZSwgYW5kIHNvIHNob3VsZCB5b3VyIG5hbWluZyBiZS4gIFVubGlrZSBNb2R1bGEtMgogYW5kIFBhc2NhbCBwcm9ncmFtbWVycywgQyBwcm9ncmFtbWVycyBkbyBub3QgdXNlIGN1dGUgbmFtZXMgbGlrZQogVGhpc1ZhcmlhYmxlSXNBVGVtcG9yYXJ5Q291bnRlci4gIEEgQyBwcm9ncmFtbWVyIHdvdWxkIGNhbGwgdGhhdAotdmFyaWFibGUgInRtcCIsIHdoaWNoIGlzIG11Y2ggZWFzaWVyIHRvIHdyaXRlLCBhbmQgbm90IHRoZSBsZWFzdCBtb3JlCit2YXJpYWJsZSBgYHRtcGBgLCB3aGljaCBpcyBtdWNoIGVhc2llciB0byB3cml0ZSwgYW5kIG5vdCB0aGUgbGVhc3QgbW9yZQogZGlmZmljdWx0IHRvIHVuZGVyc3RhbmQuCiAKIEhPV0VWRVIsIHdoaWxlIG1peGVkLWNhc2UgbmFtZXMgYXJlIGZyb3duZWQgdXBvbiwgZGVzY3JpcHRpdmUgbmFtZXMgZm9yCi1nbG9iYWwgdmFyaWFibGVzIGFyZSBhIG11c3QuICBUbyBjYWxsIGEgZ2xvYmFsIGZ1bmN0aW9uICJmb28iIGlzIGEKK2dsb2JhbCB2YXJpYWJsZXMgYXJlIGEgbXVzdC4gIFRvIGNhbGwgYSBnbG9iYWwgZnVuY3Rpb24gYGBmb29gYCBpcyBhCiBzaG9vdGluZyBvZmZlbnNlLgogCi1HTE9CQUwgdmFyaWFibGVzICh0byBiZSB1c2VkIG9ubHkgaWYgeW91IF9yZWFsbHlfIG5lZWQgdGhlbSkgbmVlZCB0bworR0xPQkFMIHZhcmlhYmxlcyAodG8gYmUgdXNlZCBvbmx5IGlmIHlvdSAqKnJlYWxseSoqIG5lZWQgdGhlbSkgbmVlZCB0bwogaGF2ZSBkZXNjcmlwdGl2ZSBuYW1lcywgYXMgZG8gZ2xvYmFsIGZ1bmN0aW9ucy4gIElmIHlvdSBoYXZlIGEgZnVuY3Rpb24KIHRoYXQgY291bnRzIHRoZSBudW1iZXIgb2YgYWN0aXZlIHVzZXJzLCB5b3Ugc2hvdWxkIGNhbGwgdGhhdAotImNvdW50X2FjdGl2ZV91c2VycygpIiBvciBzaW1pbGFyLCB5b3Ugc2hvdWxkIF9ub3RfIGNhbGwgaXQgImNudHVzcigpIi4KK2BgY291bnRfYWN0aXZlX3VzZXJzKClgYCBvciBzaW1pbGFyLCB5b3Ugc2hvdWxkICoqbm90KiogY2FsbCBpdCBgYGNudHVzcigpYGAuCiAKIEVuY29kaW5nIHRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gaW50byB0aGUgbmFtZSAoc28tY2FsbGVkIEh1bmdhcmlhbgogbm90YXRpb24pIGlzIGJyYWluIGRhbWFnZWQgLSB0aGUgY29tcGlsZXIga25vd3MgdGhlIHR5cGVzIGFueXdheSBhbmQgY2FuCkBAIC0yNjAsOSArMjk2LDkgQEAKIG1ha2VzIGJ1Z2d5IHByb2dyYW1zLgogCiBMT0NBTCB2YXJpYWJsZSBuYW1lcyBzaG91bGQgYmUgc2hvcnQsIGFuZCB0byB0aGUgcG9pbnQuICBJZiB5b3UgaGF2ZQotc29tZSByYW5kb20gaW50ZWdlciBsb29wIGNvdW50ZXIsIGl0IHNob3VsZCBwcm9iYWJseSBiZSBjYWxsZWQgImkiLgotQ2FsbGluZyBpdCAibG9vcF9jb3VudGVyIiBpcyBub24tcHJvZHVjdGl2ZSwgaWYgdGhlcmUgaXMgbm8gY2hhbmNlIG9mIGl0Ci1iZWluZyBtaXMtdW5kZXJzdG9vZC4gIFNpbWlsYXJseSwgInRtcCIgY2FuIGJlIGp1c3QgYWJvdXQgYW55IHR5cGUgb2YKK3NvbWUgcmFuZG9tIGludGVnZXIgbG9vcCBjb3VudGVyLCBpdCBzaG91bGQgcHJvYmFibHkgYmUgY2FsbGVkIGBgaWBgLgorQ2FsbGluZyBpdCBgYGxvb3BfY291bnRlcmBgIGlzIG5vbi1wcm9kdWN0aXZlLCBpZiB0aGVyZSBpcyBubyBjaGFuY2Ugb2YgaXQKK2JlaW5nIG1pcy11bmRlcnN0b29kLiAgU2ltaWxhcmx5LCBgYHRtcGBgIGNhbiBiZSBqdXN0IGFib3V0IGFueSB0eXBlIG9mCiB2YXJpYWJsZSB0aGF0IGlzIHVzZWQgdG8gaG9sZCBhIHRlbXBvcmFyeSB2YWx1ZS4KIAogSWYgeW91IGFyZSBhZnJhaWQgdG8gbWl4IHVwIHlvdXIgbG9jYWwgdmFyaWFibGUgbmFtZXMsIHlvdSBoYXZlIGFub3RoZXIKQEAgLTI3MCw1OSArMzA2LDY5IEBACiBTZWUgY2hhcHRlciA2IChGdW5jdGlvbnMpLgogCiAKLQkJQ2hhcHRlciA1OiBUeXBlZGVmcworNSkgVHlwZWRlZnMKKy0tLS0tLS0tLS0tCiAKLVBsZWFzZSBkb24ndCB1c2UgdGhpbmdzIGxpa2UgInZwc190Ii4KLUl0J3MgYSBfbWlzdGFrZV8gdG8gdXNlIHR5cGVkZWYgZm9yIHN0cnVjdHVyZXMgYW5kIHBvaW50ZXJzLiBXaGVuIHlvdSBzZWUgYQorUGxlYXNlIGRvbid0IHVzZSB0aGluZ3MgbGlrZSBgYHZwc190YGAuCitJdCdzIGEgKiptaXN0YWtlKiogdG8gdXNlIHR5cGVkZWYgZm9yIHN0cnVjdHVyZXMgYW5kIHBvaW50ZXJzLiBXaGVuIHlvdSBzZWUgYQorCisuLiBjb2RlLWJsb2NrOjogYworCiAKIAl2cHNfdCBhOwogCiBpbiB0aGUgc291cmNlLCB3aGF0IGRvZXMgaXQgbWVhbj8KIEluIGNvbnRyYXN0LCBpZiBpdCBzYXlzCiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAlzdHJ1Y3QgdmlydHVhbF9jb250YWluZXIgKmE7CiAKLXlvdSBjYW4gYWN0dWFsbHkgdGVsbCB3aGF0ICJhIiBpcy4KK3lvdSBjYW4gYWN0dWFsbHkgdGVsbCB3aGF0IGBgYWBgIGlzLgogCi1Mb3RzIG9mIHBlb3BsZSB0aGluayB0aGF0IHR5cGVkZWZzICJoZWxwIHJlYWRhYmlsaXR5Ii4gTm90IHNvLiBUaGV5IGFyZQorTG90cyBvZiBwZW9wbGUgdGhpbmsgdGhhdCB0eXBlZGVmcyBgYGhlbHAgcmVhZGFiaWxpdHlgYC4gTm90IHNvLiBUaGV5IGFyZQogdXNlZnVsIG9ubHkgZm9yOgogCi0gKGEpIHRvdGFsbHkgb3BhcXVlIG9iamVjdHMgKHdoZXJlIHRoZSB0eXBlZGVmIGlzIGFjdGl2ZWx5IHVzZWQgdG8gX2hpZGVfCisgKGEpIHRvdGFsbHkgb3BhcXVlIG9iamVjdHMgKHdoZXJlIHRoZSB0eXBlZGVmIGlzIGFjdGl2ZWx5IHVzZWQgdG8gKipoaWRlKioKICAgICAgd2hhdCB0aGUgb2JqZWN0IGlzKS4KIAotICAgICBFeGFtcGxlOiAicHRlX3QiIGV0Yy4gb3BhcXVlIG9iamVjdHMgdGhhdCB5b3UgY2FuIG9ubHkgYWNjZXNzIHVzaW5nCisgICAgIEV4YW1wbGU6IGBgcHRlX3RgYCBldGMuIG9wYXF1ZSBvYmplY3RzIHRoYXQgeW91IGNhbiBvbmx5IGFjY2VzcyB1c2luZwogICAgICB0aGUgcHJvcGVyIGFjY2Vzc29yIGZ1bmN0aW9ucy4KIAotICAgICBOT1RFISBPcGFxdWVuZXNzIGFuZCAiYWNjZXNzb3IgZnVuY3Rpb25zIiBhcmUgbm90IGdvb2QgaW4gdGhlbXNlbHZlcy4KLSAgICAgVGhlIHJlYXNvbiB3ZSBoYXZlIHRoZW0gZm9yIHRoaW5ncyBsaWtlIHB0ZV90IGV0Yy4gaXMgdGhhdCB0aGVyZQotICAgICByZWFsbHkgaXMgYWJzb2x1dGVseSBfemVyb18gcG9ydGFibHkgYWNjZXNzaWJsZSBpbmZvcm1hdGlvbiB0aGVyZS4KKyAgICAgLi4gbm90ZTo6CiAKLSAoYikgQ2xlYXIgaW50ZWdlciB0eXBlcywgd2hlcmUgdGhlIGFic3RyYWN0aW9uIF9oZWxwc18gYXZvaWQgY29uZnVzaW9uCi0gICAgIHdoZXRoZXIgaXQgaXMgImludCIgb3IgImxvbmciLgorICAgICAgIE9wYXF1ZW5lc3MgYW5kIGBgYWNjZXNzb3IgZnVuY3Rpb25zYGAgYXJlIG5vdCBnb29kIGluIHRoZW1zZWx2ZXMuCisgICAgICAgVGhlIHJlYXNvbiB3ZSBoYXZlIHRoZW0gZm9yIHRoaW5ncyBsaWtlIHB0ZV90IGV0Yy4gaXMgdGhhdCB0aGVyZQorICAgICAgIHJlYWxseSBpcyBhYnNvbHV0ZWx5ICoqemVybyoqIHBvcnRhYmx5IGFjY2Vzc2libGUgaW5mb3JtYXRpb24gdGhlcmUuCisKKyAoYikgQ2xlYXIgaW50ZWdlciB0eXBlcywgd2hlcmUgdGhlIGFic3RyYWN0aW9uICoqaGVscHMqKiBhdm9pZCBjb25mdXNpb24KKyAgICAgd2hldGhlciBpdCBpcyBgYGludGBgIG9yIGBgbG9uZ2BgLgogCiAgICAgIHU4L3UxNi91MzIgYXJlIHBlcmZlY3RseSBmaW5lIHR5cGVkZWZzLCBhbHRob3VnaCB0aGV5IGZpdCBpbnRvCiAgICAgIGNhdGVnb3J5IChkKSBiZXR0ZXIgdGhhbiBoZXJlLgogCi0gICAgIE5PVEUhIEFnYWluIC0gdGhlcmUgbmVlZHMgdG8gYmUgYSBfcmVhc29uXyBmb3IgdGhpcy4gSWYgc29tZXRoaW5nIGlzCi0gICAgICJ1bnNpZ25lZCBsb25nIiwgdGhlbiB0aGVyZSdzIG5vIHJlYXNvbiB0byBkbworICAgICAuLiBub3RlOjoKKworICAgICAgIEFnYWluIC0gdGhlcmUgbmVlZHMgdG8gYmUgYSAqKnJlYXNvbioqIGZvciB0aGlzLiBJZiBzb21ldGhpbmcgaXMKKyAgICAgICBgYHVuc2lnbmVkIGxvbmdgYCwgdGhlbiB0aGVyZSdzIG5vIHJlYXNvbiB0byBkbwogCiAJdHlwZWRlZiB1bnNpZ25lZCBsb25nIG15ZmxhZ3NfdDsKIAogICAgICBidXQgaWYgdGhlcmUgaXMgYSBjbGVhciByZWFzb24gZm9yIHdoeSBpdCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMKLSAgICAgbWlnaHQgYmUgYW4gInVuc2lnbmVkIGludCIgYW5kIHVuZGVyIG90aGVyIGNvbmZpZ3VyYXRpb25zIG1pZ2h0IGJlCi0gICAgICJ1bnNpZ25lZCBsb25nIiwgdGhlbiBieSBhbGwgbWVhbnMgZ28gYWhlYWQgYW5kIHVzZSBhIHR5cGVkZWYuCisgICAgIG1pZ2h0IGJlIGFuIGBgdW5zaWduZWQgaW50YGAgYW5kIHVuZGVyIG90aGVyIGNvbmZpZ3VyYXRpb25zIG1pZ2h0IGJlCisgICAgIGBgdW5zaWduZWQgbG9uZ2BgLCB0aGVuIGJ5IGFsbCBtZWFucyBnbyBhaGVhZCBhbmQgdXNlIGEgdHlwZWRlZi4KIAotIChjKSB3aGVuIHlvdSB1c2Ugc3BhcnNlIHRvIGxpdGVyYWxseSBjcmVhdGUgYSBfbmV3XyB0eXBlIGZvcgorIChjKSB3aGVuIHlvdSB1c2Ugc3BhcnNlIHRvIGxpdGVyYWxseSBjcmVhdGUgYSAqKm5ldyoqIHR5cGUgZm9yCiAgICAgIHR5cGUtY2hlY2tpbmcuCiAKICAoZCkgTmV3IHR5cGVzIHdoaWNoIGFyZSBpZGVudGljYWwgdG8gc3RhbmRhcmQgQzk5IHR5cGVzLCBpbiBjZXJ0YWluCiAgICAgIGV4Y2VwdGlvbmFsIGNpcmN1bXN0YW5jZXMuCiAKICAgICAgQWx0aG91Z2ggaXQgd291bGQgb25seSB0YWtlIGEgc2hvcnQgYW1vdW50IG9mIHRpbWUgZm9yIHRoZSBleWVzIGFuZAotICAgICBicmFpbiB0byBiZWNvbWUgYWNjdXN0b21lZCB0byB0aGUgc3RhbmRhcmQgdHlwZXMgbGlrZSAndWludDMyX3QnLAorICAgICBicmFpbiB0byBiZWNvbWUgYWNjdXN0b21lZCB0byB0aGUgc3RhbmRhcmQgdHlwZXMgbGlrZSBgYHVpbnQzMl90YGAsCiAgICAgIHNvbWUgcGVvcGxlIG9iamVjdCB0byB0aGVpciB1c2UgYW55d2F5LgogCi0gICAgIFRoZXJlZm9yZSwgdGhlIExpbnV4LXNwZWNpZmljICd1OC91MTYvdTMyL3U2NCcgdHlwZXMgYW5kIHRoZWlyCisgICAgIFRoZXJlZm9yZSwgdGhlIExpbnV4LXNwZWNpZmljIGBgdTgvdTE2L3UzMi91NjRgYCB0eXBlcyBhbmQgdGhlaXIKICAgICAgc2lnbmVkIGVxdWl2YWxlbnRzIHdoaWNoIGFyZSBpZGVudGljYWwgdG8gc3RhbmRhcmQgdHlwZXMgYXJlCiAgICAgIHBlcm1pdHRlZCAtLSBhbHRob3VnaCB0aGV5IGFyZSBub3QgbWFuZGF0b3J5IGluIG5ldyBjb2RlIG9mIHlvdXIKICAgICAgb3duLgpAQCAtMzMzLDcgKzM3OSw3IEBACiAgKGUpIFR5cGVzIHNhZmUgZm9yIHVzZSBpbiB1c2Vyc3BhY2UuCiAKICAgICAgSW4gY2VydGFpbiBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSB2aXNpYmxlIHRvIHVzZXJzcGFjZSwgd2UgY2Fubm90Ci0gICAgIHJlcXVpcmUgQzk5IHR5cGVzIGFuZCBjYW5ub3QgdXNlIHRoZSAndTMyJyBmb3JtIGFib3ZlLiBUaHVzLCB3ZQorICAgICByZXF1aXJlIEM5OSB0eXBlcyBhbmQgY2Fubm90IHVzZSB0aGUgYGB1MzJgYCBmb3JtIGFib3ZlLiBUaHVzLCB3ZQogICAgICB1c2UgX191MzIgYW5kIHNpbWlsYXIgdHlwZXMgaW4gYWxsIHN0cnVjdHVyZXMgd2hpY2ggYXJlIHNoYXJlZAogICAgICB3aXRoIHVzZXJzcGFjZS4KIApAQCAtMzQxLDEwICszODcsMTEgQEAKIEVWRVIgdXNlIGEgdHlwZWRlZiB1bmxlc3MgeW91IGNhbiBjbGVhcmx5IG1hdGNoIG9uZSBvZiB0aG9zZSBydWxlcy4KIAogSW4gZ2VuZXJhbCwgYSBwb2ludGVyLCBvciBhIHN0cnVjdCB0aGF0IGhhcyBlbGVtZW50cyB0aGF0IGNhbiByZWFzb25hYmx5Ci1iZSBkaXJlY3RseSBhY2Nlc3NlZCBzaG91bGQgX25ldmVyXyBiZSBhIHR5cGVkZWYuCitiZSBkaXJlY3RseSBhY2Nlc3NlZCBzaG91bGQgKipuZXZlcioqIGJlIGEgdHlwZWRlZi4KIAogCi0JCUNoYXB0ZXIgNjogRnVuY3Rpb25zCis2KSBGdW5jdGlvbnMKKy0tLS0tLS0tLS0tLQogCiBGdW5jdGlvbnMgc2hvdWxkIGJlIHNob3J0IGFuZCBzd2VldCwgYW5kIGRvIGp1c3Qgb25lIHRoaW5nLiAgVGhleSBzaG91bGQKIGZpdCBvbiBvbmUgb3IgdHdvIHNjcmVlbmZ1bHMgb2YgdGV4dCAodGhlIElTTy9BTlNJIHNjcmVlbiBzaXplIGlzIDgweDI0LApAQCAtMzcyLDggKzQxOSwxMCBAQAogdG8gdW5kZXJzdGFuZCB3aGF0IHlvdSBkaWQgMiB3ZWVrcyBmcm9tIG5vdy4KIAogSW4gc291cmNlIGZpbGVzLCBzZXBhcmF0ZSBmdW5jdGlvbnMgd2l0aCBvbmUgYmxhbmsgbGluZS4gIElmIHRoZSBmdW5jdGlvbiBpcwotZXhwb3J0ZWQsIHRoZSBFWFBPUlQqIG1hY3JvIGZvciBpdCBzaG91bGQgZm9sbG93IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjbG9zaW5nCi1mdW5jdGlvbiBicmFjZSBsaW5lLiAgRS5nLjoKK2V4cG9ydGVkLCB0aGUgKipFWFBPUlQqKiBtYWNybyBmb3IgaXQgc2hvdWxkIGZvbGxvdyBpbW1lZGlhdGVseSBhZnRlciB0aGUKK2Nsb3NpbmcgZnVuY3Rpb24gYnJhY2UgbGluZS4gIEUuZy46CisKKy4uIGNvZGUtYmxvY2s6OiBjCiAKIAlpbnQgc3lzdGVtX2lzX3VwKHZvaWQpCiAJewpAQCAtMzg2LDcgKzQzNSw4IEBACiBiZWNhdXNlIGl0IGlzIGEgc2ltcGxlIHdheSB0byBhZGQgdmFsdWFibGUgaW5mb3JtYXRpb24gZm9yIHRoZSByZWFkZXIuCiAKIAotCQlDaGFwdGVyIDc6IENlbnRyYWxpemVkIGV4aXRpbmcgb2YgZnVuY3Rpb25zCis3KSBDZW50cmFsaXplZCBleGl0aW5nIG9mIGZ1bmN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQWxiZWl0IGRlcHJlY2F0ZWQgYnkgc29tZSBwZW9wbGUsIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBnb3RvIHN0YXRlbWVudCBpcwogdXNlZCBmcmVxdWVudGx5IGJ5IGNvbXBpbGVycyBpbiBmb3JtIG9mIHRoZSB1bmNvbmRpdGlvbmFsIGp1bXAgaW5zdHJ1Y3Rpb24uCkBAIC0zOTYsMTggKzQ0NiwyMSBAQAogY2xlYW51cCBuZWVkZWQgdGhlbiBqdXN0IHJldHVybiBkaXJlY3RseS4KIAogQ2hvb3NlIGxhYmVsIG5hbWVzIHdoaWNoIHNheSB3aGF0IHRoZSBnb3RvIGRvZXMgb3Igd2h5IHRoZSBnb3RvIGV4aXN0cy4gIEFuCi1leGFtcGxlIG9mIGEgZ29vZCBuYW1lIGNvdWxkIGJlICJvdXRfYnVmZmVyOiIgaWYgdGhlIGdvdG8gZnJlZXMgImJ1ZmZlciIuICBBdm9pZAotdXNpbmcgR1ctQkFTSUMgbmFtZXMgbGlrZSAiZXJyMToiIGFuZCAiZXJyMjoiLiAgQWxzbyBkb24ndCBuYW1lIHRoZW0gYWZ0ZXIgdGhlCi1nb3RvIGxvY2F0aW9uIGxpa2UgImVycl9rbWFsbG9jX2ZhaWxlZDoiCitleGFtcGxlIG9mIGEgZ29vZCBuYW1lIGNvdWxkIGJlIGBgb3V0X2ZyZWVfYnVmZmVyOmBgIGlmIHRoZSBnb3RvIGZyZWVzIGBgYnVmZmVyYGAuCitBdm9pZCB1c2luZyBHVy1CQVNJQyBuYW1lcyBsaWtlIGBgZXJyMTpgYCBhbmQgYGBlcnIyOmBgLCBhcyB5b3Ugd291bGQgaGF2ZSB0bworcmVudW1iZXIgdGhlbSBpZiB5b3UgZXZlciBhZGQgb3IgcmVtb3ZlIGV4aXQgcGF0aHMsIGFuZCB0aGV5IG1ha2UgY29ycmVjdG5lc3MKK2RpZmZpY3VsdCB0byB2ZXJpZnkgYW55d2F5LgogCiBUaGUgcmF0aW9uYWxlIGZvciB1c2luZyBnb3RvcyBpczoKIAogLSB1bmNvbmRpdGlvbmFsIHN0YXRlbWVudHMgYXJlIGVhc2llciB0byB1bmRlcnN0YW5kIGFuZCBmb2xsb3cKIC0gbmVzdGluZyBpcyByZWR1Y2VkCiAtIGVycm9ycyBieSBub3QgdXBkYXRpbmcgaW5kaXZpZHVhbCBleGl0IHBvaW50cyB3aGVuIG1ha2luZwotICAgIG1vZGlmaWNhdGlvbnMgYXJlIHByZXZlbnRlZAorICBtb2RpZmljYXRpb25zIGFyZSBwcmV2ZW50ZWQKIC0gc2F2ZXMgdGhlIGNvbXBpbGVyIHdvcmsgdG8gb3B0aW1pemUgcmVkdW5kYW50IGNvZGUgYXdheSA7KQogCisuLiBjb2RlLWJsb2NrOjogYworCiAJaW50IGZ1bihpbnQgYSkKIAl7CiAJCWludCByZXN1bHQgPSAwOwpAQCAtNDI1LDI3ICs0NzgsNDEgQEAKIAkJCWdvdG8gb3V0X2J1ZmZlcjsKIAkJfQogCQkuLi4KLQlvdXRfYnVmZmVyOgorCW91dF9mcmVlX2J1ZmZlcjoKIAkJa2ZyZWUoYnVmZmVyKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLUEgY29tbW9uIHR5cGUgb2YgYnVnIHRvIGJlIGF3YXJlIG9mIGlzICJvbmUgZXJyIGJ1Z3MiIHdoaWNoIGxvb2sgbGlrZSB0aGlzOgorQSBjb21tb24gdHlwZSBvZiBidWcgdG8gYmUgYXdhcmUgb2YgaXMgYGBvbmUgZXJyIGJ1Z3NgYCB3aGljaCBsb29rIGxpa2UgdGhpczoKKworLi4gY29kZS1ibG9jazo6IGMKIAogCWVycjoKIAkJa2ZyZWUoZm9vLT5iYXIpOwogCQlrZnJlZShmb28pOwogCQlyZXR1cm4gcmV0OwogCi1UaGUgYnVnIGluIHRoaXMgY29kZSBpcyB0aGF0IG9uIHNvbWUgZXhpdCBwYXRocyAiZm9vIiBpcyBOVUxMLiAgTm9ybWFsbHkgdGhlCi1maXggZm9yIHRoaXMgaXMgdG8gc3BsaXQgaXQgdXAgaW50byB0d28gZXJyb3IgbGFiZWxzICJlcnJfYmFyOiIgYW5kICJlcnJfZm9vOiIuCitUaGUgYnVnIGluIHRoaXMgY29kZSBpcyB0aGF0IG9uIHNvbWUgZXhpdCBwYXRocyBgYGZvb2BgIGlzIE5VTEwuICBOb3JtYWxseSB0aGUKK2ZpeCBmb3IgdGhpcyBpcyB0byBzcGxpdCBpdCB1cCBpbnRvIHR3byBlcnJvciBsYWJlbHMgYGBlcnJfZnJlZV9iYXI6YGAgYW5kCitgYGVycl9mcmVlX2ZvbzpgYDoKKworLi4gY29kZS1ibG9jazo6IGMKKworCSBlcnJfZnJlZV9iYXI6CisJCWtmcmVlKGZvby0+YmFyKTsKKwkgZXJyX2ZyZWVfZm9vOgorCQlrZnJlZShmb28pOworCQlyZXR1cm4gcmV0OworCitJZGVhbGx5IHlvdSBzaG91bGQgc2ltdWxhdGUgZXJyb3JzIHRvIHRlc3QgYWxsIGV4aXQgcGF0aHMuCiAKIAotCQlDaGFwdGVyIDg6IENvbW1lbnRpbmcKKzgpIENvbW1lbnRpbmcKKy0tLS0tLS0tLS0tLS0KIAogQ29tbWVudHMgYXJlIGdvb2QsIGJ1dCB0aGVyZSBpcyBhbHNvIGEgZGFuZ2VyIG9mIG92ZXItY29tbWVudGluZy4gIE5FVkVSCiB0cnkgdG8gZXhwbGFpbiBIT1cgeW91ciBjb2RlIHdvcmtzIGluIGEgY29tbWVudDogaXQncyBtdWNoIGJldHRlciB0bwotd3JpdGUgdGhlIGNvZGUgc28gdGhhdCB0aGUgX3dvcmtpbmdfIGlzIG9idmlvdXMsIGFuZCBpdCdzIGEgd2FzdGUgb2YKK3dyaXRlIHRoZSBjb2RlIHNvIHRoYXQgdGhlICoqd29ya2luZyoqIGlzIG9idmlvdXMsIGFuZCBpdCdzIGEgd2FzdGUgb2YKIHRpbWUgdG8gZXhwbGFpbiBiYWRseSB3cml0dGVuIGNvZGUuCiAKIEdlbmVyYWxseSwgeW91IHdhbnQgeW91ciBjb21tZW50cyB0byB0ZWxsIFdIQVQgeW91ciBjb2RlIGRvZXMsIG5vdCBIT1cuCkBAIC00NjEsMTEgKzUyOCwxMCBAQAogU2VlIHRoZSBmaWxlcyBEb2N1bWVudGF0aW9uL2tlcm5lbC1kb2N1bWVudGF0aW9uLnJzdCBhbmQgc2NyaXB0cy9rZXJuZWwtZG9jCiBmb3IgZGV0YWlscy4KIAotTGludXggc3R5bGUgZm9yIGNvbW1lbnRzIGlzIHRoZSBDODkgIi8qIC4uLiAqLyIgc3R5bGUuCi1Eb24ndCB1c2UgQzk5LXN0eWxlICIvLyAuLi4iIGNvbW1lbnRzLgotCiBUaGUgcHJlZmVycmVkIHN0eWxlIGZvciBsb25nIChtdWx0aS1saW5lKSBjb21tZW50cyBpczoKIAorLi4gY29kZS1ibG9jazo6IGMKKwogCS8qCiAJICogVGhpcyBpcyB0aGUgcHJlZmVycmVkIHN0eWxlIGZvciBtdWx0aS1saW5lCiAJICogY29tbWVudHMgaW4gdGhlIExpbnV4IGtlcm5lbCBzb3VyY2UgY29kZS4KQEAgLTQ3OCw2ICs1NDQsOCBAQAogRm9yIGZpbGVzIGluIG5ldC8gYW5kIGRyaXZlcnMvbmV0LyB0aGUgcHJlZmVycmVkIHN0eWxlIGZvciBsb25nIChtdWx0aS1saW5lKQogY29tbWVudHMgaXMgYSBsaXR0bGUgZGlmZmVyZW50LgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJLyogVGhlIHByZWZlcnJlZCBjb21tZW50IHN0eWxlIGZvciBmaWxlcyBpbiBuZXQvIGFuZCBkcml2ZXJzL25ldAogCSAqIGxvb2tzIGxpa2UgdGhpcy4KIAkgKgpAQCAtNDkxLDEwICs1NTksMTEgQEAKIGl0ZW0sIGV4cGxhaW5pbmcgaXRzIHVzZS4KIAogCi0JCUNoYXB0ZXIgOTogWW91J3ZlIG1hZGUgYSBtZXNzIG9mIGl0Cis5KSBZb3UndmUgbWFkZSBhIG1lc3Mgb2YgaXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGF0J3MgT0ssIHdlIGFsbCBkby4gIFlvdSd2ZSBwcm9iYWJseSBiZWVuIHRvbGQgYnkgeW91ciBsb25nLXRpbWUgVW5peAotdXNlciBoZWxwZXIgdGhhdCAiR05VIGVtYWNzIiBhdXRvbWF0aWNhbGx5IGZvcm1hdHMgdGhlIEMgc291cmNlcyBmb3IKK3VzZXIgaGVscGVyIHRoYXQgYGBHTlUgZW1hY3NgYCBhdXRvbWF0aWNhbGx5IGZvcm1hdHMgdGhlIEMgc291cmNlcyBmb3IKIHlvdSwgYW5kIHlvdSd2ZSBub3RpY2VkIHRoYXQgeWVzLCBpdCBkb2VzIGRvIHRoYXQsIGJ1dCB0aGUgZGVmYXVsdHMgaXQKIHVzZXMgYXJlIGxlc3MgdGhhbiBkZXNpcmFibGUgKGluIGZhY3QsIHRoZXkgYXJlIHdvcnNlIHRoYW4gcmFuZG9tCiB0eXBpbmcgLSBhbiBpbmZpbml0ZSBudW1iZXIgb2YgbW9ua2V5cyB0eXBpbmcgaW50byBHTlUgZW1hY3Mgd291bGQgbmV2ZXIKQEAgLTUwMyw2MyArNTcyLDY2IEBACiBTbywgeW91IGNhbiBlaXRoZXIgZ2V0IHJpZCBvZiBHTlUgZW1hY3MsIG9yIGNoYW5nZSBpdCB0byB1c2Ugc2FuZXIKIHZhbHVlcy4gIFRvIGRvIHRoZSBsYXR0ZXIsIHlvdSBjYW4gc3RpY2sgdGhlIGZvbGxvd2luZyBpbiB5b3VyIC5lbWFjcyBmaWxlOgogCi0oZGVmdW4gYy1saW5ldXAtYXJnbGlzdC10YWJzLW9ubHkgKGlnbm9yZWQpCi0gICJMaW5lIHVwIGFyZ3VtZW50IGxpc3RzIGJ5IHRhYnMsIG5vdCBzcGFjZXMiCi0gIChsZXQqICgoYW5jaG9yIChjLWxhbmdlbGVtLXBvcyBjLXN5bnRhY3RpYy1lbGVtZW50KSkKLSAgICAgICAgIChjb2x1bW4gKGMtbGFuZ2VsZW0tMm5kLXBvcyBjLXN5bnRhY3RpYy1lbGVtZW50KSkKLSAgICAgICAgIChvZmZzZXQgKC0gKDErIGNvbHVtbikgYW5jaG9yKSkKLSAgICAgICAgIChzdGVwcyAoZmxvb3Igb2Zmc2V0IGMtYmFzaWMtb2Zmc2V0KSkpCi0gICAgKCogKG1heCBzdGVwcyAxKQotICAgICAgIGMtYmFzaWMtb2Zmc2V0KSkpCisuLiBjb2RlLWJsb2NrOjogbm9uZQogCi0oYWRkLWhvb2sgJ2MtbW9kZS1jb21tb24taG9vawotICAgICAgICAgIChsYW1iZGEgKCkKLSAgICAgICAgICAgIDs7IEFkZCBrZXJuZWwgc3R5bGUKLSAgICAgICAgICAgIChjLWFkZC1zdHlsZQotICAgICAgICAgICAgICJsaW51eC10YWJzLW9ubHkiCi0gICAgICAgICAgICAgJygibGludXgiIChjLW9mZnNldHMtYWxpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIChhcmdsaXN0LWNvbnQtbm9uZW1wdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICBjLWxpbmV1cC1nY2MtYXNtLXJlZwotICAgICAgICAgICAgICAgICAgICAgICAgIGMtbGluZXVwLWFyZ2xpc3QtdGFicy1vbmx5KSkpKSkpCisgIChkZWZ1biBjLWxpbmV1cC1hcmdsaXN0LXRhYnMtb25seSAoaWdub3JlZCkKKyAgICAiTGluZSB1cCBhcmd1bWVudCBsaXN0cyBieSB0YWJzLCBub3Qgc3BhY2VzIgorICAgIChsZXQqICgoYW5jaG9yIChjLWxhbmdlbGVtLXBvcyBjLXN5bnRhY3RpYy1lbGVtZW50KSkKKyAgICAgICAgICAgKGNvbHVtbiAoYy1sYW5nZWxlbS0ybmQtcG9zIGMtc3ludGFjdGljLWVsZW1lbnQpKQorICAgICAgICAgICAob2Zmc2V0ICgtICgxKyBjb2x1bW4pIGFuY2hvcikpCisgICAgICAgICAgIChzdGVwcyAoZmxvb3Igb2Zmc2V0IGMtYmFzaWMtb2Zmc2V0KSkpCisgICAgICAoKiAobWF4IHN0ZXBzIDEpCisgICAgICAgICBjLWJhc2ljLW9mZnNldCkpKQogCi0oYWRkLWhvb2sgJ2MtbW9kZS1ob29rCi0gICAgICAgICAgKGxhbWJkYSAoKQotICAgICAgICAgICAgKGxldCAoKGZpbGVuYW1lIChidWZmZXItZmlsZS1uYW1lKSkpCi0gICAgICAgICAgICAgIDs7IEVuYWJsZSBrZXJuZWwgbW9kZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGZpbGVzCi0gICAgICAgICAgICAgICh3aGVuIChhbmQgZmlsZW5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLW1hdGNoIChleHBhbmQtZmlsZS1uYW1lICJ+L3NyYy9saW51eC10cmVlcyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSkpCi0gICAgICAgICAgICAgICAgKHNldHEgaW5kZW50LXRhYnMtbW9kZSB0KQotICAgICAgICAgICAgICAgIChzZXRxIHNob3ctdHJhaWxpbmctd2hpdGVzcGFjZSB0KQotICAgICAgICAgICAgICAgIChjLXNldC1zdHlsZSAibGludXgtdGFicy1vbmx5IikpKSkpCisgIChhZGQtaG9vayAnYy1tb2RlLWNvbW1vbi1ob29rCisgICAgICAgICAgICAobGFtYmRhICgpCisgICAgICAgICAgICAgIDs7IEFkZCBrZXJuZWwgc3R5bGUKKyAgICAgICAgICAgICAgKGMtYWRkLXN0eWxlCisgICAgICAgICAgICAgICAibGludXgtdGFicy1vbmx5IgorICAgICAgICAgICAgICAgJygibGludXgiIChjLW9mZnNldHMtYWxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyZ2xpc3QtY29udC1ub25lbXB0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYy1saW5ldXAtZ2NjLWFzbS1yZWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtbGluZXVwLWFyZ2xpc3QtdGFicy1vbmx5KSkpKSkpCisKKyAgKGFkZC1ob29rICdjLW1vZGUtaG9vaworICAgICAgICAgICAgKGxhbWJkYSAoKQorICAgICAgICAgICAgICAobGV0ICgoZmlsZW5hbWUgKGJ1ZmZlci1maWxlLW5hbWUpKSkKKyAgICAgICAgICAgICAgICA7OyBFbmFibGUga2VybmVsIG1vZGUgZm9yIHRoZSBhcHByb3ByaWF0ZSBmaWxlcworICAgICAgICAgICAgICAgICh3aGVuIChhbmQgZmlsZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmctbWF0Y2ggKGV4cGFuZC1maWxlLW5hbWUgIn4vc3JjL2xpbnV4LXRyZWVzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpKQorICAgICAgICAgICAgICAgICAgKHNldHEgaW5kZW50LXRhYnMtbW9kZSB0KQorICAgICAgICAgICAgICAgICAgKHNldHEgc2hvdy10cmFpbGluZy13aGl0ZXNwYWNlIHQpCisgICAgICAgICAgICAgICAgICAoYy1zZXQtc3R5bGUgImxpbnV4LXRhYnMtb25seSIpKSkpKQogCiBUaGlzIHdpbGwgbWFrZSBlbWFjcyBnbyBiZXR0ZXIgd2l0aCB0aGUga2VybmVsIGNvZGluZyBzdHlsZSBmb3IgQwotZmlsZXMgYmVsb3cgfi9zcmMvbGludXgtdHJlZXMuCitmaWxlcyBiZWxvdyBgYH4vc3JjL2xpbnV4LXRyZWVzYGAuCiAKIEJ1dCBldmVuIGlmIHlvdSBmYWlsIGluIGdldHRpbmcgZW1hY3MgdG8gZG8gc2FuZSBmb3JtYXR0aW5nLCBub3QKLWV2ZXJ5dGhpbmcgaXMgbG9zdDogdXNlICJpbmRlbnQiLgorZXZlcnl0aGluZyBpcyBsb3N0OiB1c2UgYGBpbmRlbnRgYC4KIAogTm93LCBhZ2FpbiwgR05VIGluZGVudCBoYXMgdGhlIHNhbWUgYnJhaW4tZGVhZCBzZXR0aW5ncyB0aGF0IEdOVSBlbWFjcwogaGFzLCB3aGljaCBpcyB3aHkgeW91IG5lZWQgdG8gZ2l2ZSBpdCBhIGZldyBjb21tYW5kIGxpbmUgb3B0aW9ucy4KIEhvd2V2ZXIsIHRoYXQncyBub3QgdG9vIGJhZCwgYmVjYXVzZSBldmVuIHRoZSBtYWtlcnMgb2YgR05VIGluZGVudAogcmVjb2duaXplIHRoZSBhdXRob3JpdHkgb2YgSyZSICh0aGUgR05VIHBlb3BsZSBhcmVuJ3QgZXZpbCwgdGhleSBhcmUKIGp1c3Qgc2V2ZXJlbHkgbWlzZ3VpZGVkIGluIHRoaXMgbWF0dGVyKSwgc28geW91IGp1c3QgZ2l2ZSBpbmRlbnQgdGhlCi1vcHRpb25zICIta3IgLWk4IiAoc3RhbmRzIGZvciAiSyZSLCA4IGNoYXJhY3RlciBpbmRlbnRzIiksIG9yIHVzZQotInNjcmlwdHMvTGluZGVudCIsIHdoaWNoIGluZGVudHMgaW4gdGhlIGxhdGVzdCBzdHlsZS4KK29wdGlvbnMgYGAta3IgLWk4YGAgKHN0YW5kcyBmb3IgYGBLJlIsIDggY2hhcmFjdGVyIGluZGVudHNgYCksIG9yIHVzZQorYGBzY3JpcHRzL0xpbmRlbnRgYCwgd2hpY2ggaW5kZW50cyBpbiB0aGUgbGF0ZXN0IHN0eWxlLgogCi0iaW5kZW50IiBoYXMgYSBsb3Qgb2Ygb3B0aW9ucywgYW5kIGVzcGVjaWFsbHkgd2hlbiBpdCBjb21lcyB0byBjb21tZW50CitgYGluZGVudGBgIGhhcyBhIGxvdCBvZiBvcHRpb25zLCBhbmQgZXNwZWNpYWxseSB3aGVuIGl0IGNvbWVzIHRvIGNvbW1lbnQKIHJlLWZvcm1hdHRpbmcgeW91IG1heSB3YW50IHRvIHRha2UgYSBsb29rIGF0IHRoZSBtYW4gcGFnZS4gIEJ1dAotcmVtZW1iZXI6ICJpbmRlbnQiIGlzIG5vdCBhIGZpeCBmb3IgYmFkIHByb2dyYW1taW5nLgorcmVtZW1iZXI6IGBgaW5kZW50YGAgaXMgbm90IGEgZml4IGZvciBiYWQgcHJvZ3JhbW1pbmcuCiAKIAotCQlDaGFwdGVyIDEwOiBLY29uZmlnIGNvbmZpZ3VyYXRpb24gZmlsZXMKKzEwKSBLY29uZmlnIGNvbmZpZ3VyYXRpb24gZmlsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogRm9yIGFsbCBvZiB0aGUgS2NvbmZpZyogY29uZmlndXJhdGlvbiBmaWxlcyB0aHJvdWdob3V0IHRoZSBzb3VyY2UgdHJlZSwKLXRoZSBpbmRlbnRhdGlvbiBpcyBzb21ld2hhdCBkaWZmZXJlbnQuICBMaW5lcyB1bmRlciBhICJjb25maWciIGRlZmluaXRpb24KK3RoZSBpbmRlbnRhdGlvbiBpcyBzb21ld2hhdCBkaWZmZXJlbnQuICBMaW5lcyB1bmRlciBhIGBgY29uZmlnYGAgZGVmaW5pdGlvbgogYXJlIGluZGVudGVkIHdpdGggb25lIHRhYiwgd2hpbGUgaGVscCB0ZXh0IGlzIGluZGVudGVkIGFuIGFkZGl0aW9uYWwgdHdvCi1zcGFjZXMuICBFeGFtcGxlOgorc3BhY2VzLiAgRXhhbXBsZTo6CiAKLWNvbmZpZyBBVURJVAorICBjb25maWcgQVVESVQKIAlib29sICJBdWRpdGluZyBzdXBwb3J0IgogCWRlcGVuZHMgb24gTkVUCiAJaGVscApAQCAtNTY5LDkgKzY0MSw5IEBACiAJICBhdWRpdGluZyB3aXRob3V0IENPTkZJR19BVURJVFNZU0NBTEwuCiAKIFNlcmlvdXNseSBkYW5nZXJvdXMgZmVhdHVyZXMgKHN1Y2ggYXMgd3JpdGUgc3VwcG9ydCBmb3IgY2VydGFpbgotZmlsZXN5c3RlbXMpIHNob3VsZCBhZHZlcnRpc2UgdGhpcyBwcm9taW5lbnRseSBpbiB0aGVpciBwcm9tcHQgc3RyaW5nOgorZmlsZXN5c3RlbXMpIHNob3VsZCBhZHZlcnRpc2UgdGhpcyBwcm9taW5lbnRseSBpbiB0aGVpciBwcm9tcHQgc3RyaW5nOjoKIAotY29uZmlnIEFERlNfRlNfUlcKKyAgY29uZmlnIEFERlNfRlNfUlcKIAlib29sICJBREZTIHdyaXRlIHN1cHBvcnQgKERBTkdFUk9VUykiCiAJZGVwZW5kcyBvbiBBREZTX0ZTCiAJLi4uCkBAIC01ODAsNDEgKzY1Miw0NSBAQAogRG9jdW1lbnRhdGlvbi9rYnVpbGQva2NvbmZpZy1sYW5ndWFnZS50eHQuCiAKIAotCQlDaGFwdGVyIDExOiBEYXRhIHN0cnVjdHVyZXMKKzExKSBEYXRhIHN0cnVjdHVyZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KIAogRGF0YSBzdHJ1Y3R1cmVzIHRoYXQgaGF2ZSB2aXNpYmlsaXR5IG91dHNpZGUgdGhlIHNpbmdsZS10aHJlYWRlZAogZW52aXJvbm1lbnQgdGhleSBhcmUgY3JlYXRlZCBhbmQgZGVzdHJveWVkIGluIHNob3VsZCBhbHdheXMgaGF2ZQogcmVmZXJlbmNlIGNvdW50cy4gIEluIHRoZSBrZXJuZWwsIGdhcmJhZ2UgY29sbGVjdGlvbiBkb2Vzbid0IGV4aXN0IChhbmQKIG91dHNpZGUgdGhlIGtlcm5lbCBnYXJiYWdlIGNvbGxlY3Rpb24gaXMgc2xvdyBhbmQgaW5lZmZpY2llbnQpLCB3aGljaAotbWVhbnMgdGhhdCB5b3UgYWJzb2x1dGVseSBfaGF2ZV8gdG8gcmVmZXJlbmNlIGNvdW50IGFsbCB5b3VyIHVzZXMuCittZWFucyB0aGF0IHlvdSBhYnNvbHV0ZWx5ICoqaGF2ZSoqIHRvIHJlZmVyZW5jZSBjb3VudCBhbGwgeW91ciB1c2VzLgogCiBSZWZlcmVuY2UgY291bnRpbmcgbWVhbnMgdGhhdCB5b3UgY2FuIGF2b2lkIGxvY2tpbmcsIGFuZCBhbGxvd3MgbXVsdGlwbGUKIHVzZXJzIHRvIGhhdmUgYWNjZXNzIHRvIHRoZSBkYXRhIHN0cnVjdHVyZSBpbiBwYXJhbGxlbCAtIGFuZCBub3QgaGF2aW5nCiB0byB3b3JyeSBhYm91dCB0aGUgc3RydWN0dXJlIHN1ZGRlbmx5IGdvaW5nIGF3YXkgZnJvbSB1bmRlciB0aGVtIGp1c3QKIGJlY2F1c2UgdGhleSBzbGVwdCBvciBkaWQgc29tZXRoaW5nIGVsc2UgZm9yIGEgd2hpbGUuCiAKLU5vdGUgdGhhdCBsb2NraW5nIGlzIF9ub3RfIGEgcmVwbGFjZW1lbnQgZm9yIHJlZmVyZW5jZSBjb3VudGluZy4KK05vdGUgdGhhdCBsb2NraW5nIGlzICoqbm90KiogYSByZXBsYWNlbWVudCBmb3IgcmVmZXJlbmNlIGNvdW50aW5nLgogTG9ja2luZyBpcyB1c2VkIHRvIGtlZXAgZGF0YSBzdHJ1Y3R1cmVzIGNvaGVyZW50LCB3aGlsZSByZWZlcmVuY2UKIGNvdW50aW5nIGlzIGEgbWVtb3J5IG1hbmFnZW1lbnQgdGVjaG5pcXVlLiAgVXN1YWxseSBib3RoIGFyZSBuZWVkZWQsIGFuZAogdGhleSBhcmUgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggZWFjaCBvdGhlci4KIAogTWFueSBkYXRhIHN0cnVjdHVyZXMgY2FuIGluZGVlZCBoYXZlIHR3byBsZXZlbHMgb2YgcmVmZXJlbmNlIGNvdW50aW5nLAotd2hlbiB0aGVyZSBhcmUgdXNlcnMgb2YgZGlmZmVyZW50ICJjbGFzc2VzIi4gIFRoZSBzdWJjbGFzcyBjb3VudCBjb3VudHMKK3doZW4gdGhlcmUgYXJlIHVzZXJzIG9mIGRpZmZlcmVudCBgYGNsYXNzZXNgYC4gIFRoZSBzdWJjbGFzcyBjb3VudCBjb3VudHMKIHRoZSBudW1iZXIgb2Ygc3ViY2xhc3MgdXNlcnMsIGFuZCBkZWNyZW1lbnRzIHRoZSBnbG9iYWwgY291bnQganVzdCBvbmNlCiB3aGVuIHRoZSBzdWJjbGFzcyBjb3VudCBnb2VzIHRvIHplcm8uCiAKLUV4YW1wbGVzIG9mIHRoaXMga2luZCBvZiAibXVsdGktbGV2ZWwtcmVmZXJlbmNlLWNvdW50aW5nIiBjYW4gYmUgZm91bmQgaW4KLW1lbW9yeSBtYW5hZ2VtZW50ICgic3RydWN0IG1tX3N0cnVjdCI6IG1tX3VzZXJzIGFuZCBtbV9jb3VudCksIGFuZCBpbgotZmlsZXN5c3RlbSBjb2RlICgic3RydWN0IHN1cGVyX2Jsb2NrIjogc19jb3VudCBhbmQgc19hY3RpdmUpLgorRXhhbXBsZXMgb2YgdGhpcyBraW5kIG9mIGBgbXVsdGktbGV2ZWwtcmVmZXJlbmNlLWNvdW50aW5nYGAgY2FuIGJlIGZvdW5kIGluCittZW1vcnkgbWFuYWdlbWVudCAoYGBzdHJ1Y3QgbW1fc3RydWN0YGA6IG1tX3VzZXJzIGFuZCBtbV9jb3VudCksIGFuZCBpbgorZmlsZXN5c3RlbSBjb2RlIChgYHN0cnVjdCBzdXBlcl9ibG9ja2BgOiBzX2NvdW50IGFuZCBzX2FjdGl2ZSkuCiAKIFJlbWVtYmVyOiBpZiBhbm90aGVyIHRocmVhZCBjYW4gZmluZCB5b3VyIGRhdGEgc3RydWN0dXJlLCBhbmQgeW91IGRvbid0CiBoYXZlIGEgcmVmZXJlbmNlIGNvdW50IG9uIGl0LCB5b3UgYWxtb3N0IGNlcnRhaW5seSBoYXZlIGEgYnVnLgogCiAKLQkJQ2hhcHRlciAxMjogTWFjcm9zLCBFbnVtcyBhbmQgUlRMCisxMikgTWFjcm9zLCBFbnVtcyBhbmQgUlRMCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIE5hbWVzIG9mIG1hY3JvcyBkZWZpbmluZyBjb25zdGFudHMgYW5kIGxhYmVscyBpbiBlbnVtcyBhcmUgY2FwaXRhbGl6ZWQuCiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAkjZGVmaW5lIENPTlNUQU5UIDB4MTIzNDUKIAogRW51bXMgYXJlIHByZWZlcnJlZCB3aGVuIGRlZmluaW5nIHNldmVyYWwgcmVsYXRlZCBjb25zdGFudHMuCkBAIC02MjYsNyArNzAyLDkgQEAKIAogTWFjcm9zIHdpdGggbXVsdGlwbGUgc3RhdGVtZW50cyBzaG91bGQgYmUgZW5jbG9zZWQgaW4gYSBkbyAtIHdoaWxlIGJsb2NrOgogCi0JI2RlZmluZSBtYWNyb2Z1bihhLCBiLCBjKSAJCQlcCisuLiBjb2RlLWJsb2NrOjogYworCisJI2RlZmluZSBtYWNyb2Z1bihhLCBiLCBjKQkJCVwKIAkJZG8gewkJCQkJXAogCQkJaWYgKGEgPT0gNSkJCQlcCiAJCQkJZG9fdGhpcyhiLCBjKTsJCVwKQEAgLTYzNiwxNyArNzE0LDIxIEBACiAKIDEpIG1hY3JvcyB0aGF0IGFmZmVjdCBjb250cm9sIGZsb3c6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAkjZGVmaW5lIEZPTyh4KQkJCQkJXAogCQlkbyB7CQkJCQlcCiAJCQlpZiAoYmxhaCh4KSA8IDApCQlcCiAJCQkJcmV0dXJuIC1FQlVHR0VSRUQ7CVwKIAkJfSB3aGlsZSAoMCkKIAotaXMgYSBfdmVyeV8gYmFkIGlkZWEuICBJdCBsb29rcyBsaWtlIGEgZnVuY3Rpb24gY2FsbCBidXQgZXhpdHMgdGhlICJjYWxsaW5nIgoraXMgYSAqKnZlcnkqKiBiYWQgaWRlYS4gIEl0IGxvb2tzIGxpa2UgYSBmdW5jdGlvbiBjYWxsIGJ1dCBleGl0cyB0aGUgYGBjYWxsaW5nYGAKIGZ1bmN0aW9uOyBkb24ndCBicmVhayB0aGUgaW50ZXJuYWwgcGFyc2VycyBvZiB0aG9zZSB3aG8gd2lsbCByZWFkIHRoZSBjb2RlLgogCiAyKSBtYWNyb3MgdGhhdCBkZXBlbmQgb24gaGF2aW5nIGEgbG9jYWwgdmFyaWFibGUgd2l0aCBhIG1hZ2ljIG5hbWU6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAkjZGVmaW5lIEZPTyh2YWwpIGJhcihpbmRleCwgdmFsKQogCiBtaWdodCBsb29rIGxpa2UgYSBnb29kIHRoaW5nLCBidXQgaXQncyBjb25mdXNpbmcgYXMgaGVsbCB3aGVuIG9uZSByZWFkcyB0aGUKQEAgLTY1OSwxOCArNzQxLDIyIEBACiBtdXN0IGVuY2xvc2UgdGhlIGV4cHJlc3Npb24gaW4gcGFyZW50aGVzZXMuIEJld2FyZSBvZiBzaW1pbGFyIGlzc3VlcyB3aXRoCiBtYWNyb3MgdXNpbmcgcGFyYW1ldGVycy4KIAorLi4gY29kZS1ibG9jazo6IGMKKwogCSNkZWZpbmUgQ09OU1RBTlQgMHg0MDAwCiAJI2RlZmluZSBDT05TVEVYUCAoQ09OU1RBTlQgfCAzKQogCiA1KSBuYW1lc3BhY2UgY29sbGlzaW9ucyB3aGVuIGRlZmluaW5nIGxvY2FsIHZhcmlhYmxlcyBpbiBtYWNyb3MgcmVzZW1ibGluZwogZnVuY3Rpb25zOgogCi0jZGVmaW5lIEZPTyh4KQkJCQlcCi0oewkJCQkJXAotCXR5cGVvZih4KSByZXQ7CQkJXAotCXJldCA9IGNhbGNfcmV0KHgpOwkJXAotCShyZXQpOwkJCQlcCi19KQorLi4gY29kZS1ibG9jazo6IGMKKworCSNkZWZpbmUgRk9PKHgpCQkJCVwKKwkoewkJCQkJXAorCQl0eXBlb2YoeCkgcmV0OwkJCVwKKwkJcmV0ID0gY2FsY19yZXQoeCk7CQlcCisJCShyZXQpOwkJCQlcCisJfSkKIAogcmV0IGlzIGEgY29tbW9uIG5hbWUgZm9yIGEgbG9jYWwgdmFyaWFibGUgLSBfX2Zvb19yZXQgaXMgbGVzcyBsaWtlbHkKIHRvIGNvbGxpZGUgd2l0aCBhbiBleGlzdGluZyB2YXJpYWJsZS4KQEAgLTY3OSwxMSArNzY1LDEyIEBACiBjb3ZlcnMgUlRMIHdoaWNoIGlzIHVzZWQgZnJlcXVlbnRseSB3aXRoIGFzc2VtYmx5IGxhbmd1YWdlIGluIHRoZSBrZXJuZWwuCiAKIAotCQlDaGFwdGVyIDEzOiBQcmludGluZyBrZXJuZWwgbWVzc2FnZXMKKzEzKSBQcmludGluZyBrZXJuZWwgbWVzc2FnZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogS2VybmVsIGRldmVsb3BlcnMgbGlrZSB0byBiZSBzZWVuIGFzIGxpdGVyYXRlLiBEbyBtaW5kIHRoZSBzcGVsbGluZwogb2Yga2VybmVsIG1lc3NhZ2VzIHRvIG1ha2UgYSBnb29kIGltcHJlc3Npb24uIERvIG5vdCB1c2UgY3JpcHBsZWQKLXdvcmRzIGxpa2UgImRvbnQiOyB1c2UgImRvIG5vdCIgb3IgImRvbid0IiBpbnN0ZWFkLiAgTWFrZSB0aGUgbWVzc2FnZXMKK3dvcmRzIGxpa2UgYGBkb250YGA7IHVzZSBgYGRvIG5vdGBgIG9yIGBgZG9uJ3RgYCBpbnN0ZWFkLiAgTWFrZSB0aGUgbWVzc2FnZXMKIGNvbmNpc2UsIGNsZWFyLCBhbmQgdW5hbWJpZ3VvdXMuCiAKIEtlcm5lbCBtZXNzYWdlcyBkbyBub3QgaGF2ZSB0byBiZSB0ZXJtaW5hdGVkIHdpdGggYSBwZXJpb2QuCkBAIC03MTMsNyArODAwLDggQEAKIHVzZWQuCiAKIAotCQlDaGFwdGVyIDE0OiBBbGxvY2F0aW5nIG1lbW9yeQorMTQpIEFsbG9jYXRpbmcgbWVtb3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhlIGtlcm5lbCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGdlbmVyYWwgcHVycG9zZSBtZW1vcnkgYWxsb2NhdG9yczoKIGttYWxsb2MoKSwga3phbGxvYygpLCBrbWFsbG9jX2FycmF5KCksIGtjYWxsb2MoKSwgdm1hbGxvYygpLCBhbmQKQEAgLTcyMiw2ICs4MTAsOCBAQAogCiBUaGUgcHJlZmVycmVkIGZvcm0gZm9yIHBhc3NpbmcgYSBzaXplIG9mIGEgc3RydWN0IGlzIHRoZSBmb2xsb3dpbmc6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAlwID0ga21hbGxvYyhzaXplb2YoKnApLCAuLi4pOwogCiBUaGUgYWx0ZXJuYXRpdmUgZm9ybSB3aGVyZSBzdHJ1Y3QgbmFtZSBpcyBzcGVsbGVkIG91dCBodXJ0cyByZWFkYWJpbGl0eSBhbmQKQEAgLTczNCwyMCArODI0LDI1IEBACiAKIFRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgYWxsb2NhdGluZyBhbiBhcnJheSBpcyB0aGUgZm9sbG93aW5nOgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJcCA9IGttYWxsb2NfYXJyYXkobiwgc2l6ZW9mKC4uLiksIC4uLik7CiAKIFRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgYWxsb2NhdGluZyBhIHplcm9lZCBhcnJheSBpcyB0aGUgZm9sbG93aW5nOgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJcCA9IGtjYWxsb2Mobiwgc2l6ZW9mKC4uLiksIC4uLik7CiAKIEJvdGggZm9ybXMgY2hlY2sgZm9yIG92ZXJmbG93IG9uIHRoZSBhbGxvY2F0aW9uIHNpemUgbiAqIHNpemVvZiguLi4pLAogYW5kIHJldHVybiBOVUxMIGlmIHRoYXQgb2NjdXJyZWQuCiAKIAotCQlDaGFwdGVyIDE1OiBUaGUgaW5saW5lIGRpc2Vhc2UKKzE1KSBUaGUgaW5saW5lIGRpc2Vhc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhlcmUgYXBwZWFycyB0byBiZSBhIGNvbW1vbiBtaXNwZXJjZXB0aW9uIHRoYXQgZ2NjIGhhcyBhIG1hZ2ljICJtYWtlIG1lCi1mYXN0ZXIiIHNwZWVkdXAgb3B0aW9uIGNhbGxlZCAiaW5saW5lIi4gV2hpbGUgdGhlIHVzZSBvZiBpbmxpbmVzIGNhbiBiZQorZmFzdGVyIiBzcGVlZHVwIG9wdGlvbiBjYWxsZWQgYGBpbmxpbmVgYC4gV2hpbGUgdGhlIHVzZSBvZiBpbmxpbmVzIGNhbiBiZQogYXBwcm9wcmlhdGUgKGZvciBleGFtcGxlIGFzIGEgbWVhbnMgb2YgcmVwbGFjaW5nIG1hY3Jvcywgc2VlIENoYXB0ZXIgMTIpLCBpdAogdmVyeSBvZnRlbiBpcyBub3QuIEFidW5kYW50IHVzZSBvZiB0aGUgaW5saW5lIGtleXdvcmQgbGVhZHMgdG8gYSBtdWNoIGJpZ2dlcgoga2VybmVsLCB3aGljaCBpbiB0dXJuIHNsb3dzIHRoZSBzeXN0ZW0gYXMgYSB3aG9sZSBkb3duLCBkdWUgdG8gYSBiaWdnZXIKQEAgLTc3MSwyNiArODY2LDI3IEBACiBzb21ldGhpbmcgaXQgd291bGQgaGF2ZSBkb25lIGFueXdheS4KIAogCi0JCUNoYXB0ZXIgMTY6IEZ1bmN0aW9uIHJldHVybiB2YWx1ZXMgYW5kIG5hbWVzCisxNikgRnVuY3Rpb24gcmV0dXJuIHZhbHVlcyBhbmQgbmFtZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBGdW5jdGlvbnMgY2FuIHJldHVybiB2YWx1ZXMgb2YgbWFueSBkaWZmZXJlbnQga2luZHMsIGFuZCBvbmUgb2YgdGhlCiBtb3N0IGNvbW1vbiBpcyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZnVuY3Rpb24gc3VjY2VlZGVkIG9yCiBmYWlsZWQuICBTdWNoIGEgdmFsdWUgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGFuIGVycm9yLWNvZGUgaW50ZWdlcgotKC1FeHh4ID0gZmFpbHVyZSwgMCA9IHN1Y2Nlc3MpIG9yIGEgInN1Y2NlZWRlZCIgYm9vbGVhbiAoMCA9IGZhaWx1cmUsCisoLUV4eHggPSBmYWlsdXJlLCAwID0gc3VjY2Vzcykgb3IgYSBgYHN1Y2NlZWRlZGBgIGJvb2xlYW4gKDAgPSBmYWlsdXJlLAogbm9uLXplcm8gPSBzdWNjZXNzKS4KIAogTWl4aW5nIHVwIHRoZXNlIHR3byBzb3J0cyBvZiByZXByZXNlbnRhdGlvbnMgaXMgYSBmZXJ0aWxlIHNvdXJjZSBvZgogZGlmZmljdWx0LXRvLWZpbmQgYnVncy4gIElmIHRoZSBDIGxhbmd1YWdlIGluY2x1ZGVkIGEgc3Ryb25nIGRpc3RpbmN0aW9uCiBiZXR3ZWVuIGludGVnZXJzIGFuZCBib29sZWFucyB0aGVuIHRoZSBjb21waWxlciB3b3VsZCBmaW5kIHRoZXNlIG1pc3Rha2VzCiBmb3IgdXMuLi4gYnV0IGl0IGRvZXNuJ3QuICBUbyBoZWxwIHByZXZlbnQgc3VjaCBidWdzLCBhbHdheXMgZm9sbG93IHRoaXMKLWNvbnZlbnRpb246Citjb252ZW50aW9uOjoKIAogCUlmIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gaXMgYW4gYWN0aW9uIG9yIGFuIGltcGVyYXRpdmUgY29tbWFuZCwKIAl0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhbiBlcnJvci1jb2RlIGludGVnZXIuICBJZiB0aGUgbmFtZQogCWlzIGEgcHJlZGljYXRlLCB0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhICJzdWNjZWVkZWQiIGJvb2xlYW4uCiAKLUZvciBleGFtcGxlLCAiYWRkIHdvcmsiIGlzIGEgY29tbWFuZCwgYW5kIHRoZSBhZGRfd29yaygpIGZ1bmN0aW9uIHJldHVybnMgMAotZm9yIHN1Y2Nlc3Mgb3IgLUVCVVNZIGZvciBmYWlsdXJlLiAgSW4gdGhlIHNhbWUgd2F5LCAiUENJIGRldmljZSBwcmVzZW50IiBpcworRm9yIGV4YW1wbGUsIGBgYWRkIHdvcmtgYCBpcyBhIGNvbW1hbmQsIGFuZCB0aGUgYWRkX3dvcmsoKSBmdW5jdGlvbiByZXR1cm5zIDAKK2ZvciBzdWNjZXNzIG9yIC1FQlVTWSBmb3IgZmFpbHVyZS4gIEluIHRoZSBzYW1lIHdheSwgYGBQQ0kgZGV2aWNlIHByZXNlbnRgYCBpcwogYSBwcmVkaWNhdGUsIGFuZCB0aGUgcGNpX2Rldl9wcmVzZW50KCkgZnVuY3Rpb24gcmV0dXJucyAxIGlmIGl0IHN1Y2NlZWRzIGluCiBmaW5kaW5nIGEgbWF0Y2hpbmcgZGV2aWNlIG9yIDAgaWYgaXQgZG9lc24ndC4KIApAQCAtODA1LDE3ICs5MDEsMjIgQEAKIE5VTEwgb3IgdGhlIEVSUl9QVFIgbWVjaGFuaXNtIHRvIHJlcG9ydCBmYWlsdXJlLgogCiAKLQkJQ2hhcHRlciAxNzogIERvbid0IHJlLWludmVudCB0aGUga2VybmVsIG1hY3JvcworMTcpIERvbid0IHJlLWludmVudCB0aGUga2VybmVsIG1hY3JvcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGUgaGVhZGVyIGZpbGUgaW5jbHVkZS9saW51eC9rZXJuZWwuaCBjb250YWlucyBhIG51bWJlciBvZiBtYWNyb3MgdGhhdAogeW91IHNob3VsZCB1c2UsIHJhdGhlciB0aGFuIGV4cGxpY2l0bHkgY29kaW5nIHNvbWUgdmFyaWFudCBvZiB0aGVtIHlvdXJzZWxmLgogRm9yIGV4YW1wbGUsIGlmIHlvdSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIGFuIGFycmF5LCB0YWtlIGFkdmFudGFnZQogb2YgdGhlIG1hY3JvCiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAkjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KSAvIHNpemVvZigoeClbMF0pKQogCiBTaW1pbGFybHksIGlmIHlvdSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBzb21lIHN0cnVjdHVyZSBtZW1iZXIsIHVzZQogCisuLiBjb2RlLWJsb2NrOjogYworCiAJI2RlZmluZSBGSUVMRF9TSVpFT0YodCwgZikgKHNpemVvZigoKHQqKTApLT5mKSkKIAogVGhlcmUgYXJlIGFsc28gbWluKCkgYW5kIG1heCgpIG1hY3JvcyB0aGF0IGRvIHN0cmljdCB0eXBlIGNoZWNraW5nIGlmIHlvdQpAQCAtODIzLDE2ICs5MjQsMjEgQEAKIGRlZmluZWQgdGhhdCB5b3Ugc2hvdWxkbid0IHJlcHJvZHVjZSBpbiB5b3VyIGNvZGUuCiAKIAotCQlDaGFwdGVyIDE4OiAgRWRpdG9yIG1vZGVsaW5lcyBhbmQgb3RoZXIgY3J1ZnQKKzE4KSBFZGl0b3IgbW9kZWxpbmVzIGFuZCBvdGhlciBjcnVmdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFNvbWUgZWRpdG9ycyBjYW4gaW50ZXJwcmV0IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZW1iZWRkZWQgaW4gc291cmNlIGZpbGVzLAogaW5kaWNhdGVkIHdpdGggc3BlY2lhbCBtYXJrZXJzLiAgRm9yIGV4YW1wbGUsIGVtYWNzIGludGVycHJldHMgbGluZXMgbWFya2VkCiBsaWtlIHRoaXM6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAktKi0gbW9kZTogYyAtKi0KIAogT3IgbGlrZSB0aGlzOgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJLyoKIAlMb2NhbCBWYXJpYWJsZXM6CiAJY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETUFHSUNfREVCVUdfRkxBRyBmb28uYyIKQEAgLTg0MSw2ICs5NDcsOCBAQAogCiBWaW0gaW50ZXJwcmV0cyBtYXJrZXJzIHRoYXQgbG9vayBsaWtlIHRoaXM6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAkvKiB2aW06c2V0IHN3PTggbm9ldCAqLwogCiBEbyBub3QgaW5jbHVkZSBhbnkgb2YgdGhlc2UgaW4gc291cmNlIGZpbGVzLiAgUGVvcGxlIGhhdmUgdGhlaXIgb3duIHBlcnNvbmFsCkBAIC04NTAsNyArOTU4LDggQEAKIHdvcmsgY29ycmVjdGx5LgogCiAKLQkJQ2hhcHRlciAxOTogIElubGluZSBhc3NlbWJseQorMTkpIElubGluZSBhc3NlbWJseQorLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJbiBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29kZSwgeW91IG1heSBuZWVkIHRvIHVzZSBpbmxpbmUgYXNzZW1ibHkgdG8gaW50ZXJmYWNlCiB3aXRoIENQVSBvciBwbGF0Zm9ybSBmdW5jdGlvbmFsaXR5LiAgRG9uJ3QgaGVzaXRhdGUgdG8gZG8gc28gd2hlbiBuZWNlc3NhcnkuCkBAIC04NjMsNyArOTcyLDcgQEAKIAogTGFyZ2UsIG5vbi10cml2aWFsIGFzc2VtYmx5IGZ1bmN0aW9ucyBzaG91bGQgZ28gaW4gLlMgZmlsZXMsIHdpdGggY29ycmVzcG9uZGluZwogQyBwcm90b3R5cGVzIGRlZmluZWQgaW4gQyBoZWFkZXIgZmlsZXMuICBUaGUgQyBwcm90b3R5cGVzIGZvciBhc3NlbWJseQotZnVuY3Rpb25zIHNob3VsZCB1c2UgImFzbWxpbmthZ2UiLgorZnVuY3Rpb25zIHNob3VsZCB1c2UgYGBhc21saW5rYWdlYGAuCiAKIFlvdSBtYXkgbmVlZCB0byBtYXJrIHlvdXIgYXNtIHN0YXRlbWVudCBhcyB2b2xhdGlsZSwgdG8gcHJldmVudCBHQ0MgZnJvbQogcmVtb3ZpbmcgaXQgaWYgR0NDIGRvZXNuJ3Qgbm90aWNlIGFueSBzaWRlIGVmZmVjdHMuICBZb3UgZG9uJ3QgYWx3YXlzIG5lZWQgdG8KQEAgLTg3NCwxMiArOTgzLDE1IEBACiBzdHJpbmcsIGFuZCBlbmQgZWFjaCBzdHJpbmcgZXhjZXB0IHRoZSBsYXN0IHdpdGggXG5cdCB0byBwcm9wZXJseSBpbmRlbnQgdGhlCiBuZXh0IGluc3RydWN0aW9uIGluIHRoZSBhc3NlbWJseSBvdXRwdXQ6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAlhc20gKCJtYWdpYyAlcmVnMSwgIzQyXG5cdCIKIAkgICAgICJtb3JlX21hZ2ljICVyZWcyLCAlcmVnMyIKIAkgICAgIDogLyogb3V0cHV0cyAqLyA6IC8qIGlucHV0cyAqLyA6IC8qIGNsb2JiZXJzICovKTsKIAogCi0JCUNoYXB0ZXIgMjA6IENvbmRpdGlvbmFsIENvbXBpbGF0aW9uCisyMCkgQ29uZGl0aW9uYWwgQ29tcGlsYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBXaGVyZXZlciBwb3NzaWJsZSwgZG9uJ3QgdXNlIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMgKCNpZiwgI2lmZGVmKSBpbiAuYwogZmlsZXM7IGRvaW5nIHNvIG1ha2VzIGNvZGUgaGFyZGVyIHRvIHJlYWQgYW5kIGxvZ2ljIGhhcmRlciB0byBmb2xsb3cuICBJbnN0ZWFkLApAQCAtOTAzLDYgKzEwMTUsOCBAQAogV2l0aGluIGNvZGUsIHdoZXJlIHBvc3NpYmxlLCB1c2UgdGhlIElTX0VOQUJMRUQgbWFjcm8gdG8gY29udmVydCBhIEtjb25maWcKIHN5bWJvbCBpbnRvIGEgQyBib29sZWFuIGV4cHJlc3Npb24sIGFuZCB1c2UgaXQgaW4gYSBub3JtYWwgQyBjb25kaXRpb25hbDoKIAorLi4gY29kZS1ibG9jazo6IGMKKwogCWlmIChJU19FTkFCTEVEKENPTkZJR19TT01FVEhJTkcpKSB7CiAJCS4uLgogCX0KQEAgLTkxOCwxMiArMTAzMiwxNSBAQAogcGxhY2UgYSBjb21tZW50IGFmdGVyIHRoZSAjZW5kaWYgb24gdGhlIHNhbWUgbGluZSwgbm90aW5nIHRoZSBjb25kaXRpb25hbAogZXhwcmVzc2lvbiB1c2VkLiAgRm9yIGluc3RhbmNlOgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJI2lmZGVmIENPTkZJR19TT01FVEhJTkcKIAkuLi4KIAkjZW5kaWYgLyogQ09ORklHX1NPTUVUSElORyAqLwogCiAKLQkJQXBwZW5kaXggSTogUmVmZXJlbmNlcworQXBwZW5kaXggSSkgUmVmZXJlbmNlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGUgQyBQcm9ncmFtbWluZyBMYW5ndWFnZSwgU2Vjb25kIEVkaXRpb24KIGJ5IEJyaWFuIFcuIEtlcm5pZ2hhbiBhbmQgRGVubmlzIE0uIFJpdGNoaWUuCkBAIC05NDMsNCArMTA2MCwzIEBACiAKIEtlcm5lbCBDb2RpbmdTdHlsZSwgYnkgZ3JlZ0Brcm9haC5jb20gYXQgT0xTIDIwMDI6CiBodHRwOi8vd3d3Lmtyb2FoLmNvbS9saW51eC90YWxrcy9vbHNfMjAwMl9rZXJuZWxfY29kaW5nc3R5bGVfdGFsay9odG1sLwotCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RNQS1BUEktSE9XVE8udHh0IGIvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLUhPV1RPLnR4dAppbmRleCA3ODEwMjRlLi45NzkyMjhiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RNQS1BUEktSE9XVE8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vRE1BLUFQSS1IT1dUTy50eHQKQEAgLTY5OSw3ICs2OTksNyBAQAogCQlkbWFfYWRkcl90IG1hcHBpbmc7CiAKIAkJbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKGNwLT5kZXYsIGJ1ZmZlciwgbGVuLCBETUFfRlJPTV9ERVZJQ0UpOwotCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoY3AtPmRldiwgZG1hX2hhbmRsZSkpIHsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGNwLT5kZXYsIG1hcHBpbmcpKSB7CiAJCQkvKgogCQkJICogcmVkdWNlIGN1cnJlbnQgRE1BIG1hcHBpbmcgdXNhZ2UsCiAJCQkgKiBkZWxheSBhbmQgdHJ5IGFnYWluIGxhdGVyIG9yCkBAIC05MzEsMTAgKzkzMSw4IEBACiAKIDEpIFN0cnVjdCBzY2F0dGVybGlzdCByZXF1aXJlbWVudHMuCiAKLSAgIERvbid0IGludmVudCB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIHN0cnVjdCBzY2F0dGVybGlzdDsganVzdCB1c2UKLSAgIDxhc20tZ2VuZXJpYy9zY2F0dGVybGlzdC5oPi4gWW91IG5lZWQgdG8gZW5hYmxlCi0gICBDT05GSUdfTkVFRF9TR19ETUFfTEVOR1RIIGlmIHRoZSBhcmNoaXRlY3R1cmUgc3VwcG9ydHMgSU9NTVVzCi0gICAoaW5jbHVkaW5nIHNvZnR3YXJlIElPTU1VKS4KKyAgIFlvdSBuZWVkIHRvIGVuYWJsZSBDT05GSUdfTkVFRF9TR19ETUFfTEVOR1RIIGlmIHRoZSBhcmNoaXRlY3R1cmUKKyAgIHN1cHBvcnRzIElPTU1VcyAoaW5jbHVkaW5nIHNvZnR3YXJlIElPTU1VKS4KIAogMikgQVJDSF9ETUFfTUlOQUxJR04KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCmluZGV4IDY0NDYwYTguLjczNmY1OTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKQEAgLTYsNyArNiw3IEBACiAjIFRvIGFkZCBhIG5ldyBib29rIHRoZSBvbmx5IHN0ZXAgcmVxdWlyZWQgaXMgdG8gYWRkIHRoZSBib29rIHRvIHRoZQogIyBsaXN0IG9mIERPQ0JPT0tTLgogCi1ET0NCT09LUyA6PSB6ODUzMGJvb2sueG1sIGRldmljZS1kcml2ZXJzLnhtbCBcCitET0NCT09LUyA6PSB6ODUzMGJvb2sueG1sICBcCiAJICAgIGtlcm5lbC1oYWNraW5nLnhtbCBrZXJuZWwtbG9ja2luZy54bWwgZGV2aWNlaW9ib29rLnhtbCBcCiAJICAgIHdyaXRpbmdfdXNiX2RyaXZlci54bWwgbmV0d29ya2luZy54bWwgXAogCSAgICBrZXJuZWwtYXBpLnhtbCBmaWxlc3lzdGVtcy54bWwgbHNtLnhtbCB1c2IueG1sIGtnZGIueG1sIFwKQEAgLTIyLDggKzIyLDE0IEBACiAjIFNraXAgRG9jQm9vayBidWlsZCBpZiB0aGUgdXNlciBleHBsaWNpdGx5IHJlcXVlc3RlZCBubyBET0NCT09LUy4KIC5ERUZBVUxUOgogCUBlY2hvICIgIFNLSVAgICAgRG9jQm9vayAkQCB0YXJnZXQgKERPQ0JPT0tTPVwiXCIgc3BlY2lmaWVkKS4iCi0KIGVsc2UKK2lmbmVxICgkKFNQSElOWERJUlMpLCkKKworIyBTa2lwIERvY0Jvb2sgYnVpbGQgaWYgdGhlIHVzZXIgZXhwbGljaXRseSByZXF1ZXN0ZWQgYSBzcGhpbnggZGlyCisuREVGQVVMVDoKKwlAZWNobyAiICBTS0lQICAgIERvY0Jvb2sgJEAgdGFyZ2V0IChTUEhJTlhESVJTIHNwZWNpZmllZCkuIgorZWxzZQorCiAKICMjIwogIyBUaGUgYnVpbGQgcHJvY2VzcyBpcyBhcyBmb2xsb3dzICh0YXJnZXRzKToKQEAgLTY2LDYgKzcyLDcgQEAKIAogIyBuby1vcCBmb3IgdGhlIERvY0Jvb2sgdG9vbGNoYWluCiBlcHViZG9jczoKK2xhdGV4ZG9jczoKIAogIyMjCiAjRXh0ZXJuYWwgcHJvZ3JhbXMgdXNlZApAQCAtMjIxLDYgKzIyOCw3IEBACiAJICAgZWNobyAiPC9wcm9ncmFtbGlzdGluZz4iKSAgPiAkQAogCiBlbmRpZiAjIERPQ0JPT0tTPSIiCitlbmRpZiAjIFNQSElORElSPS4uLgogCiAjIyMKICMgSGVscCB0YXJnZXRzIGFzIHVzZWQgYnkgdGhlIHRvcC1sZXZlbCBtYWtlZmlsZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2RldmljZS1kcml2ZXJzLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZGV2aWNlLWRyaXZlcnMudG1wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxMDAzMC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZGV2aWNlLWRyaXZlcnMudG1wbAorKysgL2Rldi9udWxsCkBAIC0xLDUyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGJvb2sgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjEuMi8vRU4iCi0JImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC4xLjIvZG9jYm9va3guZHRkIiBbXT4KLQotPGJvb2sgaWQ9IkxpbnV4RHJpdmVyc0FQSSI+Ci0gPGJvb2tpbmZvPgotICA8dGl0bGU+TGludXggRGV2aWNlIERyaXZlcnM8L3RpdGxlPgotCi0gIDxsZWdhbG5vdGljZT4KLSAgIDxwYXJhPgotICAgICBUaGlzIGRvY3VtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLSAgICAgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgotICAgICB2ZXJzaW9uLgotICAgPC9wYXJhPgotCi0gICA8cGFyYT4KLSAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotICAgICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi0gICAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAgICAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgPC9wYXJhPgotCi0gICA8cGFyYT4KLSAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAgICAgTUEgMDIxMTEtMTMwNyBVU0EKLSAgIDwvcGFyYT4KLQotICAgPHBhcmE+Ci0gICAgIEZvciBtb3JlIGRldGFpbHMgc2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHNvdXJjZQotICAgICBkaXN0cmlidXRpb24gb2YgTGludXguCi0gICA8L3BhcmE+Ci0gIDwvbGVnYWxub3RpY2U+Ci0gPC9ib29raW5mbz4KLQotPHRvYz48L3RvYz4KLQotICA8Y2hhcHRlciBpZD0iQmFzaWNzIj4KLSAgICAgPHRpdGxlPkRyaXZlciBCYXNpY3M8L3RpdGxlPgotICAgICA8c2VjdDE+PHRpdGxlPkRyaXZlciBFbnRyeSBhbmQgRXhpdCBwb2ludHM8L3RpdGxlPgotIUlpbmNsdWRlL2xpbnV4L2luaXQuaAotICAgICA8L3NlY3QxPgotCi0gICAgIDxzZWN0MT48dGl0bGU+QXRvbWljIGFuZCBwb2ludGVyIG1hbmlwdWxhdGlvbjwvdGl0bGU+Ci0hSWFyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pYy5oCi0gICAgIDwvc2VjdDE+Ci0KLSAgICAgPHNlY3QxPjx0aXRsZT5EZWxheWluZywgc2NoZWR1bGluZywgYW5kIHRpbWVyIHJvdXRpbmVzPC90aXRsZT4KLSFJaW5jbHVkZS9saW51eC9zY2hlZC5oCi0hRWtlcm5lbC9zY2hlZC9jb3JlLmMKLSFJa2VybmVsL3NjaGVkL2NwdXByaS5jCi0hSWtlcm5lbC9zY2hlZC9mYWlyLmMKLSFJaW5jbHVkZS9saW51eC9jb21wbGV0aW9uLmgKLSFFa2VybmVsL3RpbWUvdGltZXIuYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPldhaXQgcXVldWVzIGFuZCBXYWtlIGV2ZW50czwvdGl0bGU+Ci0hSWluY2x1ZGUvbGludXgvd2FpdC5oCi0hRWtlcm5lbC9zY2hlZC93YWl0LmMKLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5IaWdoLXJlc29sdXRpb24gdGltZXJzPC90aXRsZT4KLSFJaW5jbHVkZS9saW51eC9rdGltZS5oCi0hSWluY2x1ZGUvbGludXgvaHJ0aW1lci5oCi0hRWtlcm5lbC90aW1lL2hydGltZXIuYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPldvcmtxdWV1ZXMgYW5kIEtldmVudHM8L3RpdGxlPgotIUlpbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCi0hRWtlcm5lbC93b3JrcXVldWUuYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPkludGVybmFsIEZ1bmN0aW9uczwvdGl0bGU+Ci0hSWtlcm5lbC9leGl0LmMKLSFJa2VybmVsL3NpZ25hbC5jCi0hSWluY2x1ZGUvbGludXgva3RocmVhZC5oCi0hRWtlcm5lbC9rdGhyZWFkLmMKLSAgICAgPC9zZWN0MT4KLQotICAgICA8c2VjdDE+PHRpdGxlPktlcm5lbCBvYmplY3RzIG1hbmlwdWxhdGlvbjwvdGl0bGU+Ci08IS0tCi1YIUlpbmNsdWRlL2xpbnV4L2tvYmplY3QuaAotLS0+Ci0hRWxpYi9rb2JqZWN0LmMKLSAgICAgPC9zZWN0MT4KLQotICAgICA8c2VjdDE+PHRpdGxlPktlcm5lbCB1dGlsaXR5IGZ1bmN0aW9uczwvdGl0bGU+Ci0hSWluY2x1ZGUvbGludXgva2VybmVsLmgKLSFFa2VybmVsL3ByaW50ay9wcmludGsuYwotIUVrZXJuZWwvcGFuaWMuYwotIUVrZXJuZWwvc3lzLmMKLSFFa2VybmVsL3JjdS9zcmN1LmMKLSFFa2VybmVsL3JjdS90cmVlLmMKLSFFa2VybmVsL3JjdS90cmVlX3BsdWdpbi5oCi0hRWtlcm5lbC9yY3UvdXBkYXRlLmMKLSAgICAgPC9zZWN0MT4KLQotICAgICA8c2VjdDE+PHRpdGxlPkRldmljZSBSZXNvdXJjZSBNYW5hZ2VtZW50PC90aXRsZT4KLSFFZHJpdmVycy9iYXNlL2RldnJlcy5jCi0gICAgIDwvc2VjdDE+Ci0KLSAgPC9jaGFwdGVyPgotCi0gIDxjaGFwdGVyIGlkPSJkZXZkcml2ZXJzIj4KLSAgICAgPHRpdGxlPkRldmljZSBkcml2ZXJzIGluZnJhc3RydWN0dXJlPC90aXRsZT4KLSAgICAgPHNlY3QxPjx0aXRsZT5UaGUgQmFzaWMgRGV2aWNlIERyaXZlci1Nb2RlbCBTdHJ1Y3R1cmVzIDwvdGl0bGU+Ci0hSWluY2x1ZGUvbGludXgvZGV2aWNlLmgKLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5EZXZpY2UgRHJpdmVycyBCYXNlPC90aXRsZT4KLSFJZHJpdmVycy9iYXNlL2luaXQuYwotIUVkcml2ZXJzL2Jhc2UvZHJpdmVyLmMKLSFFZHJpdmVycy9iYXNlL2NvcmUuYwotIUVkcml2ZXJzL2Jhc2Uvc3lzY29yZS5jCi0hRWRyaXZlcnMvYmFzZS9jbGFzcy5jCi0hSWRyaXZlcnMvYmFzZS9ub2RlLmMKLSFFZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKLSFFZHJpdmVycy9iYXNlL3RyYW5zcG9ydF9jbGFzcy5jCi08IS0tIENhbm5vdCBiZSBpbmNsdWRlZCwgYmVjYXVzZQotICAgICBhdHRyaWJ1dGVfY29udGFpbmVyX2FkZF9jbGFzc19kZXZpY2VfYWRhcHRlcgotIGFuZCBhdHRyaWJ1dGVfY29udGFpbmVyX2NsYXNzZGV2X3RvX2NvbnRhaW5lcgotICAgICBleGNlZWQgYWxsb3dlZCA0NCBjaGFyYWN0ZXJzIG1heGltdW0KLVghRWRyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMKLS0tPgotIUVkcml2ZXJzL2Jhc2UvZGQuYwotPCEtLQotWCFFZHJpdmVycy9iYXNlL2ludGVyZmFjZS5jCi0tLT4KLSFJaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaAotIUVkcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYwotIUVkcml2ZXJzL2Jhc2UvYnVzLmMKLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPgotICAgICAgIDx0aXRsZT5CdWZmZXIgU2hhcmluZyBhbmQgU3luY2hyb25pemF0aW9uPC90aXRsZT4KLSAgICAgICA8cGFyYT4KLSAgICAgICAgIFRoZSBkbWEtYnVmIHN1YnN5c3RlbSBwcm92aWRlcyB0aGUgZnJhbWV3b3JrIGZvciBzaGFyaW5nIGJ1ZmZlcnMKLSAgICAgICAgIGZvciBoYXJkd2FyZSAoRE1BKSBhY2Nlc3MgYWNyb3NzIG11bHRpcGxlIGRldmljZSBkcml2ZXJzIGFuZAotICAgICAgICAgc3Vic3lzdGVtcywgYW5kIGZvciBzeW5jaHJvbml6aW5nIGFzeW5jaHJvbm91cyBoYXJkd2FyZSBhY2Nlc3MuCi0gICAgICAgPC9wYXJhPgotICAgICAgIDxwYXJhPgotICAgICAgICAgVGhpcyBpcyB1c2VkLCBmb3IgZXhhbXBsZSwgYnkgZHJtICJwcmltZSIgbXVsdGktR1BVIHN1cHBvcnQsIGJ1dAotICAgICAgICAgaXMgb2YgY291cnNlIG5vdCBsaW1pdGVkIHRvIEdQVSB1c2UgY2FzZXMuCi0gICAgICAgPC9wYXJhPgotICAgICAgIDxwYXJhPgotICAgICAgICAgVGhlIHRocmVlIG1haW4gY29tcG9uZW50cyBvZiB0aGlzIGFyZTogKDEpIGRtYS1idWYsIHJlcHJlc2VudGluZwotICAgICAgICAgYSBzZ190YWJsZSBhbmQgZXhwb3NlZCB0byB1c2Vyc3BhY2UgYXMgYSBmaWxlIGRlc2NyaXB0b3IgdG8gYWxsb3cKLSAgICAgICAgIHBhc3NpbmcgYmV0d2VlbiBkZXZpY2VzLCAoMikgZmVuY2UsIHdoaWNoIHByb3ZpZGVzIGEgbWVjaGFuaXNtCi0gICAgICAgICB0byBzaWduYWwgd2hlbiBvbmUgZGV2aWNlIGFzIGZpbmlzaGVkIGFjY2VzcywgYW5kICgzKSByZXNlcnZhdGlvbiwKLSAgICAgICAgIHdoaWNoIG1hbmFnZXMgdGhlIHNoYXJlZCBvciBleGNsdXNpdmUgZmVuY2UocykgYXNzb2NpYXRlZCB3aXRoCi0gICAgICAgICB0aGUgYnVmZmVyLgotICAgICAgIDwvcGFyYT4KLSAgICAgICA8c2VjdDI+PHRpdGxlPmRtYS1idWY8L3RpdGxlPgotIUVkcml2ZXJzL2RtYS1idWYvZG1hLWJ1Zi5jCi0hSWluY2x1ZGUvbGludXgvZG1hLWJ1Zi5oCi0gICAgICAgPC9zZWN0Mj4KLSAgICAgICA8c2VjdDI+PHRpdGxlPnJlc2VydmF0aW9uPC90aXRsZT4KLSFQZHJpdmVycy9kbWEtYnVmL3Jlc2VydmF0aW9uLmMgUmVzZXJ2YXRpb24gT2JqZWN0IE92ZXJ2aWV3Ci0hRWRyaXZlcnMvZG1hLWJ1Zi9yZXNlcnZhdGlvbi5jCi0hSWluY2x1ZGUvbGludXgvcmVzZXJ2YXRpb24uaAotICAgICAgIDwvc2VjdDI+Ci0gICAgICAgPHNlY3QyPjx0aXRsZT5mZW5jZTwvdGl0bGU+Ci0hRWRyaXZlcnMvZG1hLWJ1Zi9mZW5jZS5jCi0hSWluY2x1ZGUvbGludXgvZmVuY2UuaAotIUVkcml2ZXJzL2RtYS1idWYvc2Vxbm8tZmVuY2UuYwotIUlpbmNsdWRlL2xpbnV4L3NlcW5vLWZlbmNlLmgKLSFFZHJpdmVycy9kbWEtYnVmL2ZlbmNlLWFycmF5LmMKLSFJaW5jbHVkZS9saW51eC9mZW5jZS1hcnJheS5oCi0hRWRyaXZlcnMvZG1hLWJ1Zi9yZXNlcnZhdGlvbi5jCi0hSWluY2x1ZGUvbGludXgvcmVzZXJ2YXRpb24uaAotIUVkcml2ZXJzL2RtYS1idWYvc3luY19maWxlLmMKLSFJaW5jbHVkZS9saW51eC9zeW5jX2ZpbGUuaAotICAgICAgIDwvc2VjdDI+Ci0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+RGV2aWNlIERyaXZlcnMgRE1BIE1hbmFnZW1lbnQ8L3RpdGxlPgotIUVkcml2ZXJzL2Jhc2UvZG1hLWNvaGVyZW50LmMKLSFFZHJpdmVycy9iYXNlL2RtYS1tYXBwaW5nLmMKLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5EZXZpY2UgRHJpdmVycyBQb3dlciBNYW5hZ2VtZW50PC90aXRsZT4KLSFFZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPkRldmljZSBEcml2ZXJzIEFDUEkgU3VwcG9ydDwvdGl0bGU+Ci08IS0tIEludGVybmFsIGZ1bmN0aW9ucyBvbmx5Ci1YIUVkcml2ZXJzL2FjcGkvc2xlZXAvbWFpbi5jCi1YIUVkcml2ZXJzL2FjcGkvc2xlZXAvd2FrZXVwLmMKLVghRWRyaXZlcnMvYWNwaS9tb3RoZXJib2FyZC5jCi1YIUVkcml2ZXJzL2FjcGkvYnVzLmMKLS0tPgotIUVkcml2ZXJzL2FjcGkvc2Nhbi5jCi0hSWRyaXZlcnMvYWNwaS9zY2FuLmMKLTwhLS0gTm8gY29ycmVjdCBzdHJ1Y3R1cmVkIGNvbW1lbnRzCi1YIUVkcml2ZXJzL2FjcGkvcGNpX2JpbmQuYwotLS0+Ci0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+RGV2aWNlIGRyaXZlcnMgUG5QIHN1cHBvcnQ8L3RpdGxlPgotIUlkcml2ZXJzL3BucC9jb3JlLmMKLTwhLS0gTm8gY29ycmVjdCBzdHJ1Y3R1cmVkIGNvbW1lbnRzCi1YIUVkcml2ZXJzL3BucC9zeXN0ZW0uYwotIC0tPgotIUVkcml2ZXJzL3BucC9jYXJkLmMKLSFJZHJpdmVycy9wbnAvZHJpdmVyLmMKLSFFZHJpdmVycy9wbnAvbWFuYWdlci5jCi0hRWRyaXZlcnMvcG5wL3N1cHBvcnQuYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPlVzZXJzcGFjZSBJTyBkZXZpY2VzPC90aXRsZT4KLSFFZHJpdmVycy91aW8vdWlvLmMKLSFJaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKLSAgICAgPC9zZWN0MT4KLSAgPC9jaGFwdGVyPgotCi0gIDxjaGFwdGVyIGlkPSJwYXJwb3J0ZGV2Ij4KLSAgICAgPHRpdGxlPlBhcmFsbGVsIFBvcnQgRGV2aWNlczwvdGl0bGU+Ci0hSWluY2x1ZGUvbGludXgvcGFycG9ydC5oCi0hRWRyaXZlcnMvcGFycG9ydC9pZWVlMTI4NC5jCi0hRWRyaXZlcnMvcGFycG9ydC9zaGFyZS5jCi0hSWRyaXZlcnMvcGFycG9ydC9kYWlzeS5jCi0gIDwvY2hhcHRlcj4KLQotICA8Y2hhcHRlciBpZD0ibWVzc2FnZV9kZXZpY2VzIj4KLQk8dGl0bGU+TWVzc2FnZS1iYXNlZCBkZXZpY2VzPC90aXRsZT4KLSAgICAgPHNlY3QxPjx0aXRsZT5GdXNpb24gbWVzc2FnZSBkZXZpY2VzPC90aXRsZT4KLSFFZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKLSFJZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKLSFFZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCi0hSWRyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYwotIUlkcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGN0bC5jCi0hSWRyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c3BpLmMKLSFJZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRmYy5jCi0hSWRyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0bGFuLmMKLSAgICAgPC9zZWN0MT4KLSAgPC9jaGFwdGVyPgotCi0gIDxjaGFwdGVyIGlkPSJzbmRkZXYiPgotICAgICA8dGl0bGU+U291bmQgRGV2aWNlczwvdGl0bGU+Ci0hSWluY2x1ZGUvc291bmQvY29yZS5oCi0hRXNvdW5kL3NvdW5kX2NvcmUuYwotIUlpbmNsdWRlL3NvdW5kL3BjbS5oCi0hRXNvdW5kL2NvcmUvcGNtLmMKLSFFc291bmQvY29yZS9kZXZpY2UuYwotIUVzb3VuZC9jb3JlL2luZm8uYwotIUVzb3VuZC9jb3JlL3Jhd21pZGkuYwotIUVzb3VuZC9jb3JlL3NvdW5kLmMKLSFFc291bmQvY29yZS9tZW1vcnkuYwotIUVzb3VuZC9jb3JlL3BjbV9tZW1vcnkuYwotIUVzb3VuZC9jb3JlL2luaXQuYwotIUVzb3VuZC9jb3JlL2lzYWRtYS5jCi0hRXNvdW5kL2NvcmUvY29udHJvbC5jCi0hRXNvdW5kL2NvcmUvcGNtX2xpYi5jCi0hRXNvdW5kL2NvcmUvaHdkZXAuYwotIUVzb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwotIUVzb3VuZC9jb3JlL21lbWFsbG9jLmMKLTwhLS0gRklYTUU6IFJlbW92ZWQgZm9yIG5vdyBzaW5jZSBubyBzdHJ1Y3R1cmVkIGNvbW1lbnRzIGluIHNvdXJjZQotWCFJc291bmQvc291bmRfZmlybXdhcmUuYwotLS0+Ci0gIDwvY2hhcHRlcj4KLQotCi0gIDxjaGFwdGVyIGlkPSJ1YXJ0MTZ4NTAiPgotICAgICA8dGl0bGU+MTZ4NTAgVUFSVCBEcml2ZXI8L3RpdGxlPgotIUVkcml2ZXJzL3R0eS9zZXJpYWwvc2VyaWFsX2NvcmUuYwotIUVkcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2NvcmUuYwotICA8L2NoYXB0ZXI+Ci0KLSAgPGNoYXB0ZXIgaWQ9ImZiZGV2Ij4KLSAgICAgPHRpdGxlPkZyYW1lIEJ1ZmZlciBMaWJyYXJ5PC90aXRsZT4KLQotICAgICA8cGFyYT4KLSAgICAgICBUaGUgZnJhbWUgYnVmZmVyIGRyaXZlcnMgZGVwZW5kIGhlYXZpbHkgb24gZm91ciBkYXRhIHN0cnVjdHVyZXMuCi0gICAgICAgVGhlc2Ugc3RydWN0dXJlcyBhcmUgZGVjbGFyZWQgaW4gaW5jbHVkZS9saW51eC9mYi5oLiAgVGhleSBhcmUKLSAgICAgICBmYl9pbmZvLCBmYl92YXJfc2NyZWVuaW5mbywgZmJfZml4X3NjcmVlbmluZm8gYW5kIGZiX21vbm9zcGVjcy4KLSAgICAgICBUaGUgbGFzdCB0aHJlZSBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gYW5kIGZyb20gdXNlcmxhbmQuCi0gICAgIDwvcGFyYT4KLQotICAgICA8cGFyYT4KLSAgICAgICBmYl9pbmZvIGRlZmluZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBwYXJ0aWN1bGFyIHZpZGVvIGNhcmQuCi0gICAgICAgSW5zaWRlIGZiX2luZm8sIHRoZXJlIGV4aXN0cyBhIGZiX29wcyBzdHJ1Y3R1cmUgd2hpY2ggaXMgYQotICAgICAgIGNvbGxlY3Rpb24gb2YgbmVlZGVkIGZ1bmN0aW9ucyB0byBtYWtlIGZiZGV2IGFuZCBmYmNvbiB3b3JrLgotICAgICAgIGZiX2luZm8gaXMgb25seSB2aXNpYmxlIHRvIHRoZSBrZXJuZWwuCi0gICAgIDwvcGFyYT4KLQotICAgICA8cGFyYT4KLSAgICAgICBmYl92YXJfc2NyZWVuaW5mbyBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBmZWF0dXJlcyBvZiBhIHZpZGVvIGNhcmQKLSAgICAgICB0aGF0IGFyZSB1c2VyIGRlZmluZWQuICBXaXRoIGZiX3Zhcl9zY3JlZW5pbmZvLCB0aGluZ3Mgc3VjaCBhcwotICAgICAgIGRlcHRoIGFuZCB0aGUgcmVzb2x1dGlvbiBtYXkgYmUgZGVmaW5lZC4KLSAgICAgPC9wYXJhPgotCi0gICAgIDxwYXJhPgotICAgICAgIFRoZSBuZXh0IHN0cnVjdHVyZSBpcyBmYl9maXhfc2NyZWVuaW5mby4gVGhpcyBkZWZpbmVzIHRoZQotICAgICAgIHByb3BlcnRpZXMgb2YgYSBjYXJkIHRoYXQgYXJlIGNyZWF0ZWQgd2hlbiBhIG1vZGUgaXMgc2V0IGFuZCBjYW4ndAotICAgICAgIGJlIGNoYW5nZWQgb3RoZXJ3aXNlLiAgQSBnb29kIGV4YW1wbGUgb2YgdGhpcyBpcyB0aGUgc3RhcnQgb2YgdGhlCi0gICAgICAgZnJhbWUgYnVmZmVyIG1lbW9yeS4gIFRoaXMgImxvY2tzIiB0aGUgYWRkcmVzcyBvZiB0aGUgZnJhbWUgYnVmZmVyCi0gICAgICAgbWVtb3J5LCBzbyB0aGF0IGl0IGNhbm5vdCBiZSBjaGFuZ2VkIG9yIG1vdmVkLgotICAgICA8L3BhcmE+Ci0KLSAgICAgPHBhcmE+Ci0gICAgICAgVGhlIGxhc3Qgc3RydWN0dXJlIGlzIGZiX21vbm9zcGVjcy4gSW4gdGhlIG9sZCBBUEksIHRoZXJlIHdhcwotICAgICAgIGxpdHRsZSBpbXBvcnRhbmNlIGZvciBmYl9tb25vc3BlY3MuIFRoaXMgYWxsb3dlZCBmb3IgZm9yYmlkZGVuIHRoaW5ncwotICAgICAgIHN1Y2ggYXMgc2V0dGluZyBhIG1vZGUgb2YgODAweDYwMCBvbiBhIGZpeCBmcmVxdWVuY3kgbW9uaXRvci4gV2l0aAotICAgICAgIHRoZSBuZXcgQVBJLCBmYl9tb25vc3BlY3MgcHJldmVudHMgc3VjaCB0aGluZ3MsIGFuZCBpZiB1c2VkCi0gICAgICAgY29ycmVjdGx5LCBjYW4gcHJldmVudCBhIG1vbml0b3IgZnJvbSBiZWluZyBjb29rZWQuICBmYl9tb25vc3BlY3MKLSAgICAgICB3aWxsIG5vdCBiZSB1c2VmdWwgdW50aWwga2VybmVscyAyLjUueC4KLSAgICAgPC9wYXJhPgotCi0gICAgIDxzZWN0MT48dGl0bGU+RnJhbWUgQnVmZmVyIE1lbW9yeTwvdGl0bGU+Ci0hRWRyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYm1lbS5jCi0gICAgIDwvc2VjdDE+Ci08IS0tCi0gICAgIDxzZWN0MT48dGl0bGU+RnJhbWUgQnVmZmVyIENvbnNvbGU8L3RpdGxlPgotWCFFZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMKLSAgICAgPC9zZWN0MT4KLS0tPgotICAgICA8c2VjdDE+PHRpdGxlPkZyYW1lIEJ1ZmZlciBDb2xvcm1hcDwvdGl0bGU+Ci0hRWRyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYmNtYXAuYwotICAgICA8L3NlY3QxPgotPCEtLSBGSVhNRToKLSAgZHJpdmVycy92aWRlby9mYmdlbi5jIGhhcyBubyBkb2NzLCB3aGljaCBzdHVmZnMgdXAgdGhlIHNnbWwuICBDb21tZW50Ci0gIG91dCB1bnRpbCBzb21lYm9keSBhZGRzIGRvY3MuICBLQU8KLSAgICAgPHNlY3QxPjx0aXRsZT5GcmFtZSBCdWZmZXIgR2VuZXJpYyBGdW5jdGlvbnM8L3RpdGxlPgotWCFJZHJpdmVycy92aWRlby9mYmdlbi5jCi0gICAgIDwvc2VjdDE+Ci1LQU8gLS0+Ci0gICAgIDxzZWN0MT48dGl0bGU+RnJhbWUgQnVmZmVyIFZpZGVvIE1vZGUgRGF0YWJhc2U8L3RpdGxlPgotIUlkcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvbW9kZWRiLmMKLSFFZHJpdmVycy92aWRlby9mYmRldi9jb3JlL21vZGVkYi5jCi0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+RnJhbWUgQnVmZmVyIE1hY2ludG9zaCBWaWRlbyBNb2RlIERhdGFiYXNlPC90aXRsZT4KLSFFZHJpdmVycy92aWRlby9mYmRldi9tYWNtb2Rlcy5jCi0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+RnJhbWUgQnVmZmVyIEZvbnRzPC90aXRsZT4KLSAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgIFJlZmVyIHRvIHRoZSBmaWxlIGxpYi9mb250cy9mb250cy5jIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAgICA8L3BhcmE+Ci08IS0tIEZJWE1FOiBSZW1vdmVkIGZvciBub3cgc2luY2Ugbm8gc3RydWN0dXJlZCBjb21tZW50cyBpbiBzb3VyY2UKLVghSWxpYi9mb250cy9mb250cy5jCi0tLT4KLSAgICAgPC9zZWN0MT4KLSAgPC9jaGFwdGVyPgotCi0gIDxjaGFwdGVyIGlkPSJpbnB1dF9zdWJzeXN0ZW0iPgotICAgICA8dGl0bGU+SW5wdXQgU3Vic3lzdGVtPC90aXRsZT4KLSAgICAgPHNlY3QxPjx0aXRsZT5JbnB1dCBjb3JlPC90aXRsZT4KLSFJaW5jbHVkZS9saW51eC9pbnB1dC5oCi0hRWRyaXZlcnMvaW5wdXQvaW5wdXQuYwotIUVkcml2ZXJzL2lucHV0L2ZmLWNvcmUuYwotIUVkcml2ZXJzL2lucHV0L2ZmLW1lbWxlc3MuYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPk11bHRpdG91Y2ggTGlicmFyeTwvdGl0bGU+Ci0hSWluY2x1ZGUvbGludXgvaW5wdXQvbXQuaAotIUVkcml2ZXJzL2lucHV0L2lucHV0LW10LmMKLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5Qb2xsZWQgaW5wdXQgZGV2aWNlczwvdGl0bGU+Ci0hSWluY2x1ZGUvbGludXgvaW5wdXQtcG9sbGRldi5oCi0hRWRyaXZlcnMvaW5wdXQvaW5wdXQtcG9sbGRldi5jCi0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+TWF0cml4IGtleWJvYXJkcy9rZXlwYWRzPC90aXRsZT4KLSFJaW5jbHVkZS9saW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmgKLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5TcGFyc2Uga2V5bWFwIHN1cHBvcnQ8L3RpdGxlPgotIUlpbmNsdWRlL2xpbnV4L2lucHV0L3NwYXJzZS1rZXltYXAuaAotIUVkcml2ZXJzL2lucHV0L3NwYXJzZS1rZXltYXAuYwotICAgICA8L3NlY3QxPgotICA8L2NoYXB0ZXI+Ci0KLSAgPGNoYXB0ZXIgaWQ9InNwaSI+Ci0gICAgICA8dGl0bGU+U2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIChTUEkpPC90aXRsZT4KLSAgPHBhcmE+Ci0JU1BJIGlzIHRoZSAiU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIiwgd2lkZWx5IHVzZWQgd2l0aAotCWVtYmVkZGVkIHN5c3RlbXMgYmVjYXVzZSBpdCBpcyBhIHNpbXBsZSBhbmQgZWZmaWNpZW50Ci0JaW50ZXJmYWNlOiAgYmFzaWNhbGx5IGEgbXVsdGlwbGV4ZWQgc2hpZnQgcmVnaXN0ZXIuCi0JSXRzIHRocmVlIHNpZ25hbCB3aXJlcyBob2xkIGEgY2xvY2sgKFNDSywgb2Z0ZW4gaW4gdGhlIHJhbmdlCi0Jb2YgMS0yMCBNSHopLCBhICJNYXN0ZXIgT3V0LCBTbGF2ZSBJbiIgKE1PU0kpIGRhdGEgbGluZSwgYW5kCi0JYSAiTWFzdGVyIEluLCBTbGF2ZSBPdXQiIChNSVNPKSBkYXRhIGxpbmUuCi0JU1BJIGlzIGEgZnVsbCBkdXBsZXggcHJvdG9jb2w7IGZvciBlYWNoIGJpdCBzaGlmdGVkIG91dCB0aGUKLQlNT1NJIGxpbmUgKG9uZSBwZXIgY2xvY2spIGFub3RoZXIgaXMgc2hpZnRlZCBpbiBvbiB0aGUgTUlTTyBsaW5lLgotCVRob3NlIGJpdHMgYXJlIGFzc2VtYmxlZCBpbnRvIHdvcmRzIG9mIHZhcmlvdXMgc2l6ZXMgb24gdGhlCi0Jd2F5IHRvIGFuZCBmcm9tIHN5c3RlbSBtZW1vcnkuCi0JQW4gYWRkaXRpb25hbCBjaGlwc2VsZWN0IGxpbmUgaXMgdXN1YWxseSBhY3RpdmUtbG93IChuQ1MpOwotCWZvdXIgc2lnbmFscyBhcmUgbm9ybWFsbHkgdXNlZCBmb3IgZWFjaCBwZXJpcGhlcmFsLCBwbHVzCi0Jc29tZXRpbWVzIGFuIGludGVycnVwdC4KLSAgPC9wYXJhPgotICA8cGFyYT4KLQlUaGUgU1BJIGJ1cyBmYWNpbGl0aWVzIGxpc3RlZCBoZXJlIHByb3ZpZGUgYSBnZW5lcmFsaXplZAotCWludGVyZmFjZSB0byBkZWNsYXJlIFNQSSBidXNzZXMgYW5kIGRldmljZXMsIG1hbmFnZSB0aGVtCi0JYWNjb3JkaW5nIHRvIHRoZSBzdGFuZGFyZCBMaW51eCBkcml2ZXIgbW9kZWwsIGFuZCBwZXJmb3JtCi0JaW5wdXQvb3V0cHV0IG9wZXJhdGlvbnMuCi0JQXQgdGhpcyB0aW1lLCBvbmx5ICJtYXN0ZXIiIHNpZGUgaW50ZXJmYWNlcyBhcmUgc3VwcG9ydGVkLAotCXdoZXJlIExpbnV4IHRhbGtzIHRvIFNQSSBwZXJpcGhlcmFscyBhbmQgZG9lcyBub3QgaW1wbGVtZW50Ci0Jc3VjaCBhIHBlcmlwaGVyYWwgaXRzZWxmLgotCShJbnRlcmZhY2VzIHRvIHN1cHBvcnQgaW1wbGVtZW50aW5nIFNQSSBzbGF2ZXMgd291bGQKLQluZWNlc3NhcmlseSBsb29rIGRpZmZlcmVudC4pCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0JVGhlIHByb2dyYW1taW5nIGludGVyZmFjZSBpcyBzdHJ1Y3R1cmVkIGFyb3VuZCB0d28ga2luZHMgb2YgZHJpdmVyLAotCWFuZCB0d28ga2luZHMgb2YgZGV2aWNlLgotCUEgIkNvbnRyb2xsZXIgRHJpdmVyIiBhYnN0cmFjdHMgdGhlIGNvbnRyb2xsZXIgaGFyZHdhcmUsIHdoaWNoIG1heQotCWJlIGFzIHNpbXBsZSBhcyBhIHNldCBvZiBHUElPIHBpbnMgb3IgYXMgY29tcGxleCBhcyBhIHBhaXIgb2YgRklGT3MKLQljb25uZWN0ZWQgdG8gZHVhbCBETUEgZW5naW5lcyBvbiB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgU1BJIHNoaWZ0Ci0JcmVnaXN0ZXIgKG1heGltaXppbmcgdGhyb3VnaHB1dCkuICBTdWNoIGRyaXZlcnMgYnJpZGdlIGJldHdlZW4KLQl3aGF0ZXZlciBidXMgdGhleSBzaXQgb24gKG9mdGVuIHRoZSBwbGF0Zm9ybSBidXMpIGFuZCBTUEksIGFuZAotCWV4cG9zZSB0aGUgU1BJIHNpZGUgb2YgdGhlaXIgZGV2aWNlIGFzIGEKLQk8c3RydWN0bmFtZT5zdHJ1Y3Qgc3BpX21hc3Rlcjwvc3RydWN0bmFtZT4uCi0JU1BJIGRldmljZXMgYXJlIGNoaWxkcmVuIG9mIHRoYXQgbWFzdGVyLCByZXByZXNlbnRlZCBhcyBhCi0JPHN0cnVjdG5hbWU+c3RydWN0IHNwaV9kZXZpY2U8L3N0cnVjdG5hbWU+IGFuZCBtYW51ZmFjdHVyZWQgZnJvbQotCTxzdHJ1Y3RuYW1lPnN0cnVjdCBzcGlfYm9hcmRfaW5mbzwvc3RydWN0bmFtZT4gZGVzY3JpcHRvcnMgd2hpY2gKLQlhcmUgdXN1YWxseSBwcm92aWRlZCBieSBib2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBjb2RlLgotCUEgPHN0cnVjdG5hbWU+c3RydWN0IHNwaV9kcml2ZXI8L3N0cnVjdG5hbWU+IGlzIGNhbGxlZCBhCi0JIlByb3RvY29sIERyaXZlciIsIGFuZCBpcyBib3VuZCB0byBhIHNwaV9kZXZpY2UgdXNpbmcgbm9ybWFsCi0JZHJpdmVyIG1vZGVsIGNhbGxzLgotICA8L3BhcmE+Ci0gIDxwYXJhPgotCVRoZSBJL08gbW9kZWwgaXMgYSBzZXQgb2YgcXVldWVkIG1lc3NhZ2VzLiAgUHJvdG9jb2wgZHJpdmVycwotCXN1Ym1pdCBvbmUgb3IgbW9yZSA8c3RydWN0bmFtZT5zdHJ1Y3Qgc3BpX21lc3NhZ2U8L3N0cnVjdG5hbWU+Ci0Jb2JqZWN0cywgd2hpY2ggYXJlIHByb2Nlc3NlZCBhbmQgY29tcGxldGVkIGFzeW5jaHJvbm91c2x5LgotCShUaGVyZSBhcmUgc3luY2hyb25vdXMgd3JhcHBlcnMsIGhvd2V2ZXIuKSAgTWVzc2FnZXMgYXJlCi0JYnVpbHQgZnJvbSBvbmUgb3IgbW9yZSA8c3RydWN0bmFtZT5zdHJ1Y3Qgc3BpX3RyYW5zZmVyPC9zdHJ1Y3RuYW1lPgotCW9iamVjdHMsIGVhY2ggb2Ygd2hpY2ggd3JhcHMgYSBmdWxsIGR1cGxleCBTUEkgdHJhbnNmZXIuCi0JQSB2YXJpZXR5IG9mIHByb3RvY29sIHR3ZWFraW5nIG9wdGlvbnMgYXJlIG5lZWRlZCwgYmVjYXVzZQotCWRpZmZlcmVudCBjaGlwcyBhZG9wdCB2ZXJ5IGRpZmZlcmVudCBwb2xpY2llcyBmb3IgaG93IHRoZXkKLQl1c2UgdGhlIGJpdHMgdHJhbnNmZXJyZWQgd2l0aCBTUEkuCi0gIDwvcGFyYT4KLSFJaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKLSFGZHJpdmVycy9zcGkvc3BpLmMgc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8KLSFFZHJpdmVycy9zcGkvc3BpLmMKLSAgPC9jaGFwdGVyPgotCi0gIDxjaGFwdGVyIGlkPSJpMmMiPgotICAgICA8dGl0bGU+STxzdXBlcnNjcmlwdD4yPC9zdXBlcnNjcmlwdD5DIGFuZCBTTUJ1cyBTdWJzeXN0ZW08L3RpdGxlPgotCi0gICAgIDxwYXJhPgotCUk8c3VwZXJzY3JpcHQ+Mjwvc3VwZXJzY3JpcHQ+QyAob3Igd2l0aG91dCBmYW5jeSB0eXBvZ3JhcGh5LCAiSTJDIikKLQlpcyBhbiBhY3JvbnltIGZvciB0aGUgIkludGVyLUlDIiBidXMsIGEgc2ltcGxlIGJ1cyBwcm90b2NvbCB3aGljaCBpcwotCXdpZGVseSB1c2VkIHdoZXJlIGxvdyBkYXRhIHJhdGUgY29tbXVuaWNhdGlvbnMgc3VmZmljZS4KLQlTaW5jZSBpdCdzIGFsc28gYSBsaWNlbnNlZCB0cmFkZW1hcmssIHNvbWUgdmVuZG9ycyB1c2UgYW5vdGhlcgotCW5hbWUgKHN1Y2ggYXMgIlR3by1XaXJlIEludGVyZmFjZSIsIFRXSSkgZm9yIHRoZSBzYW1lIGJ1cy4KLQlJMkMgb25seSBuZWVkcyB0d28gc2lnbmFscyAoU0NMIGZvciBjbG9jaywgU0RBIGZvciBkYXRhKSwgY29uc2VydmluZwotCWJvYXJkIHJlYWwgZXN0YXRlIGFuZCBtaW5pbWl6aW5nIHNpZ25hbCBxdWFsaXR5IGlzc3Vlcy4KLQlNb3N0IEkyQyBkZXZpY2VzIHVzZSBzZXZlbiBiaXQgYWRkcmVzc2VzLCBhbmQgYnVzIHNwZWVkcyBvZiB1cAotCXRvIDQwMCBrSHo7IHRoZXJlJ3MgYSBoaWdoIHNwZWVkIGV4dGVuc2lvbiAoMy40IE1IeikgdGhhdCdzIG5vdCB5ZXQKLQlmb3VuZCB3aWRlIHVzZS4KLQlJMkMgaXMgYSBtdWx0aS1tYXN0ZXIgYnVzOyBvcGVuIGRyYWluIHNpZ25hbGluZyBpcyB1c2VkIHRvCi0JYXJiaXRyYXRlIGJldHdlZW4gbWFzdGVycywgYXMgd2VsbCBhcyB0byBoYW5kc2hha2UgYW5kIHRvCi0Jc3luY2hyb25pemUgY2xvY2tzIGZyb20gc2xvd2VyIGNsaWVudHMuCi0gICAgIDwvcGFyYT4KLQotICAgICA8cGFyYT4KLQlUaGUgTGludXggSTJDIHByb2dyYW1taW5nIGludGVyZmFjZXMgc3VwcG9ydCBvbmx5IHRoZSBtYXN0ZXIKLQlzaWRlIG9mIGJ1cyBpbnRlcmFjdGlvbnMsIG5vdCB0aGUgc2xhdmUgc2lkZS4KLQlUaGUgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlIGlzIHN0cnVjdHVyZWQgYXJvdW5kIHR3byBraW5kcyBvZiBkcml2ZXIsCi0JYW5kIHR3byBraW5kcyBvZiBkZXZpY2UuCi0JQW4gSTJDICJBZGFwdGVyIERyaXZlciIgYWJzdHJhY3RzIHRoZSBjb250cm9sbGVyIGhhcmR3YXJlOyBpdCBiaW5kcwotCXRvIGEgcGh5c2ljYWwgZGV2aWNlIChwZXJoYXBzIGEgUENJIGRldmljZSBvciBwbGF0Zm9ybV9kZXZpY2UpIGFuZAotCWV4cG9zZXMgYSA8c3RydWN0bmFtZT5zdHJ1Y3QgaTJjX2FkYXB0ZXI8L3N0cnVjdG5hbWU+IHJlcHJlc2VudGluZwotCWVhY2ggSTJDIGJ1cyBzZWdtZW50IGl0IG1hbmFnZXMuCi0JT24gZWFjaCBJMkMgYnVzIHNlZ21lbnQgd2lsbCBiZSBJMkMgZGV2aWNlcyByZXByZXNlbnRlZCBieSBhCi0JPHN0cnVjdG5hbWU+c3RydWN0IGkyY19jbGllbnQ8L3N0cnVjdG5hbWU+LiAgVGhvc2UgZGV2aWNlcyB3aWxsCi0JYmUgYm91bmQgdG8gYSA8c3RydWN0bmFtZT5zdHJ1Y3QgaTJjX2RyaXZlcjwvc3RydWN0bmFtZT4sCi0Jd2hpY2ggc2hvdWxkIGZvbGxvdyB0aGUgc3RhbmRhcmQgTGludXggZHJpdmVyIG1vZGVsLgotCShBdCB0aGlzIHdyaXRpbmcsIGEgbGVnYWN5IG1vZGVsIGlzIG1vcmUgd2lkZWx5IHVzZWQuKQotCVRoZXJlIGFyZSBmdW5jdGlvbnMgdG8gcGVyZm9ybSB2YXJpb3VzIEkyQyBwcm90b2NvbCBvcGVyYXRpb25zOyBhdAotCXRoaXMgd3JpdGluZyBhbGwgc3VjaCBmdW5jdGlvbnMgYXJlIHVzYWJsZSBvbmx5IGZyb20gdGFzayBjb250ZXh0LgotICAgICA8L3BhcmE+Ci0KLSAgICAgPHBhcmE+Ci0JVGhlIFN5c3RlbSBNYW5hZ2VtZW50IEJ1cyAoU01CdXMpIGlzIGEgc2libGluZyBwcm90b2NvbC4gIE1vc3QgU01CdXMKLQlzeXN0ZW1zIGFyZSBhbHNvIEkyQyBjb25mb3JtYW50LiAgVGhlIGVsZWN0cmljYWwgY29uc3RyYWludHMgYXJlCi0JdGlnaHRlciBmb3IgU01CdXMsIGFuZCBpdCBzdGFuZGFyZGl6ZXMgcGFydGljdWxhciBwcm90b2NvbCBtZXNzYWdlcwotCWFuZCBpZGlvbXMuICBDb250cm9sbGVycyB0aGF0IHN1cHBvcnQgSTJDIGNhbiBhbHNvIHN1cHBvcnQgbW9zdAotCVNNQnVzIG9wZXJhdGlvbnMsIGJ1dCBTTUJ1cyBjb250cm9sbGVycyBkb24ndCBzdXBwb3J0IGFsbCB0aGUgcHJvdG9jb2wKLQlvcHRpb25zIHRoYXQgYW4gSTJDIGNvbnRyb2xsZXIgd2lsbC4KLQlUaGVyZSBhcmUgZnVuY3Rpb25zIHRvIHBlcmZvcm0gdmFyaW91cyBTTUJ1cyBwcm90b2NvbCBvcGVyYXRpb25zLAotCWVpdGhlciB1c2luZyBJMkMgcHJpbWl0aXZlcyBvciBieSBpc3N1aW5nIFNNQnVzIGNvbW1hbmRzIHRvCi0JaTJjX2FkYXB0ZXIgZGV2aWNlcyB3aGljaCBkb24ndCBzdXBwb3J0IHRob3NlIEkyQyBvcGVyYXRpb25zLgotICAgICA8L3BhcmE+Ci0KLSFJaW5jbHVkZS9saW51eC9pMmMuaAotIUZkcml2ZXJzL2kyYy9pMmMtYm9hcmRpbmZvLmMgaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8KLSFFZHJpdmVycy9pMmMvaTJjLWNvcmUuYwotICA8L2NoYXB0ZXI+Ci0KLSAgPGNoYXB0ZXIgaWQ9ImhzaSI+Ci0gICAgIDx0aXRsZT5IaWdoIFNwZWVkIFN5bmNocm9ub3VzIFNlcmlhbCBJbnRlcmZhY2UgKEhTSSk8L3RpdGxlPgotCi0gICAgIDxwYXJhPgotCUhpZ2ggU3BlZWQgU3luY2hyb25vdXMgU2VyaWFsIEludGVyZmFjZSAoSFNJKSBpcyBhCi0Jc2VyaWFsIGludGVyZmFjZSBtYWlubHkgdXNlZCBmb3IgY29ubmVjdGluZyBhcHBsaWNhdGlvbgotCWVuZ2luZXMgKEFQRSkgd2l0aCBjZWxsdWxhciBtb2RlbSBlbmdpbmVzIChDTVQpIGluIGNlbGx1bGFyCi0JaGFuZHNldHMuCi0KLQlIU0kgcHJvdmlkZXMgbXVsdGlwbGV4aW5nIGZvciB1cCB0byAxNiBsb2dpY2FsIGNoYW5uZWxzLAotCWxvdy1sYXRlbmN5IGFuZCBmdWxsIGR1cGxleCBjb21tdW5pY2F0aW9uLgotICAgICA8L3BhcmE+Ci0KLSFJaW5jbHVkZS9saW51eC9oc2kvaHNpLmgKLSFFZHJpdmVycy9oc2kvaHNpX2NvcmUuYwotICA8L2NoYXB0ZXI+Ci0KLSAgPGNoYXB0ZXIgaWQ9InB3bSI+Ci0gICAgPHRpdGxlPlB1bHNlLVdpZHRoIE1vZHVsYXRpb24gKFBXTSk8L3RpdGxlPgotICAgIDxwYXJhPgotICAgICAgUHVsc2Utd2lkdGggbW9kdWxhdGlvbiBpcyBhIG1vZHVsYXRpb24gdGVjaG5pcXVlIHByaW1hcmlseSB1c2VkIHRvCi0gICAgICBjb250cm9sIHBvd2VyIHN1cHBsaWVkIHRvIGVsZWN0cmljYWwgZGV2aWNlcy4KLSAgICA8L3BhcmE+Ci0gICAgPHBhcmE+Ci0gICAgICBUaGUgUFdNIGZyYW1ld29yayBwcm92aWRlcyBhbiBhYnN0cmFjdGlvbiBmb3IgcHJvdmlkZXJzIGFuZCBjb25zdW1lcnMKLSAgICAgIG9mIFBXTSBzaWduYWxzLiBBIGNvbnRyb2xsZXIgdGhhdCBwcm92aWRlcyBvbmUgb3IgbW9yZSBQV00gc2lnbmFscyBpcwotICAgICAgcmVnaXN0ZXJlZCBhcyA8c3RydWN0bmFtZT5zdHJ1Y3QgcHdtX2NoaXA8L3N0cnVjdG5hbWU+LiBQcm92aWRlcnMgYXJlCi0gICAgICBleHBlY3RlZCB0byBlbWJlZCB0aGlzIHN0cnVjdHVyZSBpbiBhIGRyaXZlci1zcGVjaWZpYyBzdHJ1Y3R1cmUuIFRoaXMKLSAgICAgIHN0cnVjdHVyZSBjb250YWlucyBmaWVsZHMgdGhhdCBkZXNjcmliZSBhIHBhcnRpY3VsYXIgY2hpcC4KLSAgICA8L3BhcmE+Ci0gICAgPHBhcmE+Ci0gICAgICBBIGNoaXAgZXhwb3NlcyBvbmUgb3IgbW9yZSBQV00gc2lnbmFsIHNvdXJjZXMsIGVhY2ggb2Ygd2hpY2ggZXhwb3NlZAotICAgICAgYXMgYSA8c3RydWN0bmFtZT5zdHJ1Y3QgcHdtX2RldmljZTwvc3RydWN0bmFtZT4uIE9wZXJhdGlvbnMgY2FuIGJlCi0gICAgICBwZXJmb3JtZWQgb24gUFdNIGRldmljZXMgdG8gY29udHJvbCB0aGUgcGVyaW9kLCBkdXR5IGN5Y2xlLCBwb2xhcml0eQotICAgICAgYW5kIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgc2lnbmFsLgotICAgIDwvcGFyYT4KLSAgICA8cGFyYT4KLSAgICAgIE5vdGUgdGhhdCBQV00gZGV2aWNlcyBhcmUgZXhjbHVzaXZlIHJlc291cmNlczogdGhleSBjYW4gYWx3YXlzIG9ubHkgYmUKLSAgICAgIHVzZWQgYnkgb25lIGNvbnN1bWVyIGF0IGEgdGltZS4KLSAgICA8L3BhcmE+Ci0hSWluY2x1ZGUvbGludXgvcHdtLmgKLSFFZHJpdmVycy9wd20vY29yZS5jCi0gIDwvY2hhcHRlcj4KLQotPC9ib29rPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9IT1dUTyBiL0RvY3VtZW50YXRpb24vSE9XVE8KaW5kZXggMWYzNDVkYS4uNWYwNDIzNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9IT1dUTworKysgYi9Eb2N1bWVudGF0aW9uL0hPV1RPCkBAIC0xLDUgKzEsNSBAQAogSE9XVE8gZG8gTGludXgga2VybmVsIGRldmVsb3BtZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBUaGlzIGlzIHRoZSBiZS1hbGwsIGVuZC1hbGwgZG9jdW1lbnQgb24gdGhpcyB0b3BpYy4gIEl0IGNvbnRhaW5zCiBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGJlY29tZSBhIExpbnV4IGtlcm5lbCBkZXZlbG9wZXIgYW5kIGhvdyB0byBsZWFybgpAQCAtMjgsNiArMjgsNyBAQAogeW91IHBsYW4gdG8gZG8gbG93LWxldmVsIGRldmVsb3BtZW50IGZvciB0aGF0IGFyY2hpdGVjdHVyZS4gIFRob3VnaCB0aGV5CiBhcmUgbm90IGEgZ29vZCBzdWJzdGl0dXRlIGZvciBhIHNvbGlkIEMgZWR1Y2F0aW9uIGFuZC9vciB5ZWFycyBvZgogZXhwZXJpZW5jZSwgdGhlIGZvbGxvd2luZyBib29rcyBhcmUgZ29vZCBmb3IsIGlmIGFueXRoaW5nLCByZWZlcmVuY2U6CisKICAtICJUaGUgQyBQcm9ncmFtbWluZyBMYW5ndWFnZSIgYnkgS2VybmlnaGFuIGFuZCBSaXRjaGllIFtQcmVudGljZSBIYWxsXQogIC0gIlByYWN0aWNhbCBDIFByb2dyYW1taW5nIiBieSBTdGV2ZSBPdWFsbGluZSBbTydSZWlsbHldCiAgLSAiQzogIEEgUmVmZXJlbmNlIE1hbnVhbCIgYnkgSGFyYmlzb24gYW5kIFN0ZWVsZSBbUHJlbnRpY2UgSGFsbF0KQEAgLTY0LDcgKzY1LDggQEAKIHRoZWlyIHN0YXRlbWVudHMgb24gbGVnYWwgbWF0dGVycy4KIAogRm9yIGNvbW1vbiBxdWVzdGlvbnMgYW5kIGFuc3dlcnMgYWJvdXQgdGhlIEdQTCwgcGxlYXNlIHNlZToKLQlodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisKKwlodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogCiAKIERvY3VtZW50YXRpb24KQEAgLTgyLDk2ICs4NCwxMTggQEAKIAogSGVyZSBpcyBhIGxpc3Qgb2YgZmlsZXMgdGhhdCBhcmUgaW4gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZSB0aGF0IGFyZQogcmVxdWlyZWQgcmVhZGluZzoKKwogICBSRUFETUUKICAgICBUaGlzIGZpbGUgZ2l2ZXMgYSBzaG9ydCBiYWNrZ3JvdW5kIG9uIHRoZSBMaW51eCBrZXJuZWwgYW5kIGRlc2NyaWJlcwogICAgIHdoYXQgaXMgbmVjZXNzYXJ5IHRvIGRvIHRvIGNvbmZpZ3VyZSBhbmQgYnVpbGQgdGhlIGtlcm5lbC4gIFBlb3BsZQogICAgIHdobyBhcmUgbmV3IHRvIHRoZSBrZXJuZWwgc2hvdWxkIHN0YXJ0IGhlcmUuCiAKLSAgRG9jdW1lbnRhdGlvbi9DaGFuZ2VzCisgIDpyZWY6YERvY3VtZW50YXRpb24vQ2hhbmdlcyA8Y2hhbmdlcz5gCiAgICAgVGhpcyBmaWxlIGdpdmVzIGEgbGlzdCBvZiB0aGUgbWluaW11bSBsZXZlbHMgb2YgdmFyaW91cyBzb2Z0d2FyZQogICAgIHBhY2thZ2VzIHRoYXQgYXJlIG5lY2Vzc2FyeSB0byBidWlsZCBhbmQgcnVuIHRoZSBrZXJuZWwKICAgICBzdWNjZXNzZnVsbHkuCiAKLSAgRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQorICA6cmVmOmBEb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlIDxjb2RpbmdzdHlsZT5gCiAgICAgVGhpcyBkZXNjcmliZXMgdGhlIExpbnV4IGtlcm5lbCBjb2Rpbmcgc3R5bGUsIGFuZCBzb21lIG9mIHRoZQogICAgIHJhdGlvbmFsZSBiZWhpbmQgaXQuIEFsbCBuZXcgY29kZSBpcyBleHBlY3RlZCB0byBmb2xsb3cgdGhlCiAgICAgZ3VpZGVsaW5lcyBpbiB0aGlzIGRvY3VtZW50LiBNb3N0IG1haW50YWluZXJzIHdpbGwgb25seSBhY2NlcHQKICAgICBwYXRjaGVzIGlmIHRoZXNlIHJ1bGVzIGFyZSBmb2xsb3dlZCwgYW5kIG1hbnkgcGVvcGxlIHdpbGwgb25seQogICAgIHJldmlldyBjb2RlIGlmIGl0IGlzIGluIHRoZSBwcm9wZXIgc3R5bGUuCiAKLSAgRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcwotICBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdEcml2ZXJzCisgIDpyZWY6YERvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMgPHN1Ym1pdHRpbmdwYXRjaGVzPmAgYW5kIDpyZWY6YERvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMgPHN1Ym1pdHRpbmdkcml2ZXJzPmAKICAgICBUaGVzZSBmaWxlcyBkZXNjcmliZSBpbiBleHBsaWNpdCBkZXRhaWwgaG93IHRvIHN1Y2Nlc3NmdWxseSBjcmVhdGUKICAgICBhbmQgc2VuZCBhIHBhdGNoLCBpbmNsdWRpbmcgKGJ1dCBub3QgbGltaXRlZCB0byk6CisKICAgICAgICAtIEVtYWlsIGNvbnRlbnRzCiAgICAgICAgLSBFbWFpbCBmb3JtYXQKICAgICAgICAtIFdobyB0byBzZW5kIGl0IHRvCisKICAgICBGb2xsb3dpbmcgdGhlc2UgcnVsZXMgd2lsbCBub3QgZ3VhcmFudGVlIHN1Y2Nlc3MgKGFzIGFsbCBwYXRjaGVzIGFyZQogICAgIHN1YmplY3QgdG8gc2NydXRpbnkgZm9yIGNvbnRlbnQgYW5kIHN0eWxlKSwgYnV0IG5vdCBmb2xsb3dpbmcgdGhlbQogICAgIHdpbGwgYWxtb3N0IGFsd2F5cyBwcmV2ZW50IGl0LgogCiAgICAgT3RoZXIgZXhjZWxsZW50IGRlc2NyaXB0aW9ucyBvZiBob3cgdG8gY3JlYXRlIHBhdGNoZXMgcHJvcGVybHkgYXJlOgorCiAJIlRoZSBQZXJmZWN0IFBhdGNoIgotCQlodHRwOi8vd3d3Lm96bGFicy5vcmcvfmFrcG0vc3R1ZmYvdHBwLnR4dAorCQlodHRwczovL3d3dy5vemxhYnMub3JnL35ha3BtL3N0dWZmL3RwcC50eHQKKwogCSJMaW51eCBrZXJuZWwgcGF0Y2ggc3VibWlzc2lvbiBmb3JtYXQiCiAJCWh0dHA6Ly9saW51eC55eXoudXMvcGF0Y2gtZm9ybWF0Lmh0bWwKIAotICBEb2N1bWVudGF0aW9uL3N0YWJsZV9hcGlfbm9uc2Vuc2UudHh0CisgIDpyZWY6YERvY3VtZW50YXRpb24vc3RhYmxlX2FwaV9ub25zZW5zZS50eHQgPHN0YWJsZV9hcGlfbm9uc2Vuc2U+YAogICAgIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhlIGNvbnNjaW91cyBkZWNpc2lvbiB0bwogICAgIG5vdCBoYXZlIGEgc3RhYmxlIEFQSSB3aXRoaW4gdGhlIGtlcm5lbCwgaW5jbHVkaW5nIHRoaW5ncyBsaWtlOgorCiAgICAgICAtIFN1YnN5c3RlbSBzaGltLWxheWVycyAoZm9yIGNvbXBhdGliaWxpdHk/KQogICAgICAgLSBEcml2ZXIgcG9ydGFiaWxpdHkgYmV0d2VlbiBPcGVyYXRpbmcgU3lzdGVtcy4KICAgICAgIC0gTWl0aWdhdGluZyByYXBpZCBjaGFuZ2Ugd2l0aGluIHRoZSBrZXJuZWwgc291cmNlIHRyZWUgKG9yCiAJcHJldmVudGluZyByYXBpZCBjaGFuZ2UpCisKICAgICBUaGlzIGRvY3VtZW50IGlzIGNydWNpYWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIExpbnV4IGRldmVsb3BtZW50CiAgICAgcGhpbG9zb3BoeSBhbmQgaXMgdmVyeSBpbXBvcnRhbnQgZm9yIHBlb3BsZSBtb3ZpbmcgdG8gTGludXggZnJvbQogICAgIGRldmVsb3BtZW50IG9uIG90aGVyIE9wZXJhdGluZyBTeXN0ZW1zLgogCi0gIERvY3VtZW50YXRpb24vU2VjdXJpdHlCdWdzCisgIDpyZWY6YERvY3VtZW50YXRpb24vU2VjdXJpdHlCdWdzIDxzZWN1cml0eWJ1Z3M+YAogICAgIElmIHlvdSBmZWVsIHlvdSBoYXZlIGZvdW5kIGEgc2VjdXJpdHkgcHJvYmxlbSBpbiB0aGUgTGludXgga2VybmVsLAogICAgIHBsZWFzZSBmb2xsb3cgdGhlIHN0ZXBzIGluIHRoaXMgZG9jdW1lbnQgdG8gaGVscCBub3RpZnkgdGhlIGtlcm5lbAogICAgIGRldmVsb3BlcnMsIGFuZCBoZWxwIHNvbHZlIHRoZSBpc3N1ZS4KIAotICBEb2N1bWVudGF0aW9uL01hbmFnZW1lbnRTdHlsZQorICA6cmVmOmBEb2N1bWVudGF0aW9uL01hbmFnZW1lbnRTdHlsZSA8bWFuYWdlbWVudHN0eWxlPmAKICAgICBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgTGludXgga2VybmVsIG1haW50YWluZXJzIG9wZXJhdGUgYW5kIHRoZQogICAgIHNoYXJlZCBldGhvcyBiZWhpbmQgdGhlaXIgbWV0aG9kb2xvZ2llcy4gIFRoaXMgaXMgaW1wb3J0YW50IHJlYWRpbmcKICAgICBmb3IgYW55b25lIG5ldyB0byBrZXJuZWwgZGV2ZWxvcG1lbnQgKG9yIGFueW9uZSBzaW1wbHkgY3VyaW91cyBhYm91dAogICAgIGl0KSwgYXMgaXQgcmVzb2x2ZXMgYSBsb3Qgb2YgY29tbW9uIG1pc2NvbmNlcHRpb25zIGFuZCBjb25mdXNpb24KICAgICBhYm91dCB0aGUgdW5pcXVlIGJlaGF2aW9yIG9mIGtlcm5lbCBtYWludGFpbmVycy4KIAotICBEb2N1bWVudGF0aW9uL3N0YWJsZV9rZXJuZWxfcnVsZXMudHh0CisgIDpyZWY6YERvY3VtZW50YXRpb24vc3RhYmxlX2tlcm5lbF9ydWxlcy50eHQgPHN0YWJsZV9rZXJuZWxfcnVsZXM+YAogICAgIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHJ1bGVzIG9uIGhvdyB0aGUgc3RhYmxlIGtlcm5lbCByZWxlYXNlcwogICAgIGhhcHBlbiwgYW5kIHdoYXQgdG8gZG8gaWYgeW91IHdhbnQgdG8gZ2V0IGEgY2hhbmdlIGludG8gb25lIG9mIHRoZXNlCiAgICAgcmVsZWFzZXMuCiAKLSAgRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jcy50eHQKKyAgOnJlZjpgRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jcy50eHQgPGtlcm5lbF9kb2NzPmAKICAgICBBIGxpc3Qgb2YgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiB0aGF0IHBlcnRhaW5zIHRvIGtlcm5lbAogICAgIGRldmVsb3BtZW50LiAgUGxlYXNlIGNvbnN1bHQgdGhpcyBsaXN0IGlmIHlvdSBkbyBub3QgZmluZCB3aGF0IHlvdQogICAgIGFyZSBsb29raW5nIGZvciB3aXRoaW4gdGhlIGluLWtlcm5lbCBkb2N1bWVudGF0aW9uLgogCi0gIERvY3VtZW50YXRpb24vYXBwbHlpbmctcGF0Y2hlcy50eHQKKyAgOnJlZjpgRG9jdW1lbnRhdGlvbi9hcHBseWluZy1wYXRjaGVzLnR4dCA8YXBwbHlpbmdfcGF0Y2hlcz5gCiAgICAgQSBnb29kIGludHJvZHVjdGlvbiBkZXNjcmliaW5nIGV4YWN0bHkgd2hhdCBhIHBhdGNoIGlzIGFuZCBob3cgdG8KICAgICBhcHBseSBpdCB0byB0aGUgZGlmZmVyZW50IGRldmVsb3BtZW50IGJyYW5jaGVzIG9mIHRoZSBrZXJuZWwuCiAKIFRoZSBrZXJuZWwgYWxzbyBoYXMgYSBsYXJnZSBudW1iZXIgb2YgZG9jdW1lbnRzIHRoYXQgY2FuIGJlCi1hdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIHRoZSBzb3VyY2UgY29kZSBpdHNlbGYuICBUaGlzIGluY2x1ZGVzIGEKK2F1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gdGhlIHNvdXJjZSBjb2RlIGl0c2VsZiBvciBmcm9tCitSZVN0cnVjdHVyZWRUZXh0IG1hcmt1cHMgKFJlU1QpLCBsaWtlIHRoaXMgb25lLiBUaGlzIGluY2x1ZGVzIGEKIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlIGluLWtlcm5lbCBBUEksIGFuZCBydWxlcyBvbiBob3cgdG8gaGFuZGxlCi1sb2NraW5nIHByb3Blcmx5LiAgVGhlIGRvY3VtZW50cyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlCi1Eb2N1bWVudGF0aW9uL0RvY0Jvb2svIGRpcmVjdG9yeSBhbmQgY2FuIGJlIGdlbmVyYXRlZCBhcyBQREYsCi1Qb3N0c2NyaXB0LCBIVE1MLCBhbmQgbWFuIHBhZ2VzIGJ5IHJ1bm5pbmc6Citsb2NraW5nIHByb3Blcmx5LgorCitBbGwgc3VjaCBkb2N1bWVudHMgY2FuIGJlIGdlbmVyYXRlZCBhcyBQREYgb3IgSFRNTCBieSBydW5uaW5nOjoKKwogCW1ha2UgcGRmZG9jcwotCW1ha2UgcHNkb2NzCiAJbWFrZSBodG1sZG9jcwotCW1ha2UgbWFuZG9jcworCiByZXNwZWN0aXZlbHkgZnJvbSB0aGUgbWFpbiBrZXJuZWwgc291cmNlIGRpcmVjdG9yeS4KIAorVGhlIGRvY3VtZW50cyB0aGF0IHVzZXMgUmVTVCBtYXJrdXAgd2lsbCBiZSBnZW5lcmF0ZWQgYXQgRG9jdW1lbnRhdGlvbi9vdXRwdXQuCitUaGV5IGNhbiBhbHNvIGJlIGdlbmVyYXRlZCBvbiBMYVRlWCBhbmQgZVB1YiBmb3JtYXRzIHdpdGg6OgorCisJbWFrZSBsYXRleGRvY3MKKwltYWtlIGVwdWJkb2NzCisKK0N1cnJlbnRseSwgdGhlcmUgYXJlIHNvbWUgZG9jdW1lbnRzIHdyaXR0ZW4gb24gRG9jQm9vayB0aGF0IGFyZSBpbgordGhlIHByb2Nlc3Mgb2YgY29udmVyc2lvbiB0byBSZVNULiBTdWNoIGRvY3VtZW50cyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlCitEb2N1bWVudGF0aW9uL0RvY0Jvb2svIGRpcmVjdG9yeSBhbmQgY2FuIGJlIGdlbmVyYXRlZCBhbHNvIGFzCitQb3N0c2NyaXB0IG9yIG1hbiBwYWdlcyBieSBydW5uaW5nOjoKKworCW1ha2UgcHNkb2NzCisJbWFrZSBtYW5kb2NzCiAKIEJlY29taW5nIEEgS2VybmVsIERldmVsb3BlcgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIElmIHlvdSBkbyBub3Qga25vdyBhbnl0aGluZyBhYm91dCBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQsIHlvdSBzaG91bGQKIGxvb2sgYXQgdGhlIExpbnV4IEtlcm5lbE5ld2JpZXMgcHJvamVjdDoKLQlodHRwOi8va2VybmVsbmV3Ymllcy5vcmcKKworCWh0dHBzOi8va2VybmVsbmV3Ymllcy5vcmcKKwogSXQgY29uc2lzdHMgb2YgYSBoZWxwZnVsIG1haWxpbmcgbGlzdCB3aGVyZSB5b3UgY2FuIGFzayBhbG1vc3QgYW55IHR5cGUKIG9mIGJhc2ljIGtlcm5lbCBkZXZlbG9wbWVudCBxdWVzdGlvbiAobWFrZSBzdXJlIHRvIHNlYXJjaCB0aGUgYXJjaGl2ZXMKIGZpcnN0LCBiZWZvcmUgYXNraW5nIHNvbWV0aGluZyB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gYW5zd2VyZWQgaW4gdGhlCkBAIC0xODcsNyArMjExLDkgQEAKIElmIHlvdSBkbyBub3Qga25vdyB3aGVyZSB5b3Ugd2FudCB0byBzdGFydCwgYnV0IHlvdSB3YW50IHRvIGxvb2sgZm9yCiBzb21lIHRhc2sgdG8gc3RhcnQgZG9pbmcgdG8gam9pbiBpbnRvIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LAogZ28gdG8gdGhlIExpbnV4IEtlcm5lbCBKYW5pdG9yJ3MgcHJvamVjdDoKLQlodHRwOi8va2VybmVsbmV3Ymllcy5vcmcvS2VybmVsSmFuaXRvcnMKKworCWh0dHBzOi8va2VybmVsbmV3Ymllcy5vcmcvS2VybmVsSmFuaXRvcnMKKwogSXQgaXMgYSBncmVhdCBwbGFjZSB0byBzdGFydC4gIEl0IGRlc2NyaWJlcyBhIGxpc3Qgb2YgcmVsYXRpdmVseSBzaW1wbGUKIHByb2JsZW1zIHRoYXQgbmVlZCB0byBiZSBjbGVhbmVkIHVwIGFuZCBmaXhlZCB3aXRoaW4gdGhlIExpbnV4IGtlcm5lbAogc291cmNlIHRyZWUuICBXb3JraW5nIHdpdGggdGhlIGRldmVsb3BlcnMgaW4gY2hhcmdlIG9mIHRoaXMgcHJvamVjdCwgeW91CkBAIC0xOTksNyArMjI1LDggQEAKIHRyZWUsIGJ1dCBuZWVkIHNvbWUgaGVscCBnZXR0aW5nIGl0IGluIHRoZSBwcm9wZXIgZm9ybSwgdGhlCiBrZXJuZWwtbWVudG9ycyBwcm9qZWN0IHdhcyBjcmVhdGVkIHRvIGhlbHAgeW91IG91dCB3aXRoIHRoaXMuICBJdCBpcyBhCiBtYWlsaW5nIGxpc3QsIGFuZCBjYW4gYmUgZm91bmQgYXQ6Ci0JaHR0cDovL3NlbGVuaWMuY29tL21haWxtYW4vbGlzdGluZm8va2VybmVsLW1lbnRvcnMKKworCWh0dHBzOi8vc2VsZW5pYy5jb20vbWFpbG1hbi9saXN0aW5mby9rZXJuZWwtbWVudG9ycwogCiBCZWZvcmUgbWFraW5nIGFueSBhY3R1YWwgbW9kaWZpY2F0aW9ucyB0byB0aGUgTGludXgga2VybmVsIGNvZGUsIGl0IGlzCiBpbXBlcmF0aXZlIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBjb2RlIGluIHF1ZXN0aW9uIHdvcmtzLiAgRm9yIHRoaXMKQEAgLTIwOSw2ICsyMzYsNyBAQAogQ3Jvc3MtUmVmZXJlbmNlIHByb2plY3QsIHdoaWNoIGlzIGFibGUgdG8gcHJlc2VudCBzb3VyY2UgY29kZSBpbiBhCiBzZWxmLXJlZmVyZW50aWFsLCBpbmRleGVkIHdlYnBhZ2UgZm9ybWF0LiBBbiBleGNlbGxlbnQgdXAtdG8tZGF0ZQogcmVwb3NpdG9yeSBvZiB0aGUga2VybmVsIGNvZGUgbWF5IGJlIGZvdW5kIGF0OgorCiAJaHR0cDovL2x4ci5mcmVlLWVsZWN0cm9ucy5jb20vCiAKIApAQCAtMjE4LDYgKzI0Niw3IEBACiBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyBjdXJyZW50bHkgY29uc2lzdHMgb2YgYSBmZXcgZGlmZmVyZW50CiBtYWluIGtlcm5lbCAiYnJhbmNoZXMiIGFuZCBsb3RzIG9mIGRpZmZlcmVudCBzdWJzeXN0ZW0tc3BlY2lmaWMga2VybmVsCiBicmFuY2hlcy4gIFRoZXNlIGRpZmZlcmVudCBicmFuY2hlcyBhcmU6CisKICAgLSBtYWluIDQueCBrZXJuZWwgdHJlZQogICAtIDQueC55IC1zdGFibGUga2VybmVsIHRyZWUKICAgLSA0LnggLWdpdCBrZXJuZWwgcGF0Y2hlcwpAQCAtMjI3LDE0ICsyNTYsMTUgQEAKIDQueCBrZXJuZWwgdHJlZQogLS0tLS0tLS0tLS0tLS0tLS0KIDQueCBrZXJuZWxzIGFyZSBtYWludGFpbmVkIGJ5IExpbnVzIFRvcnZhbGRzLCBhbmQgY2FuIGJlIGZvdW5kIG9uCi1rZXJuZWwub3JnIGluIHRoZSBwdWIvbGludXgva2VybmVsL3Y0LngvIGRpcmVjdG9yeS4gIEl0cyBkZXZlbG9wbWVudAoraHR0cHM6Ly9rZXJuZWwub3JnIGluIHRoZSBwdWIvbGludXgva2VybmVsL3Y0LngvIGRpcmVjdG9yeS4gIEl0cyBkZXZlbG9wbWVudAogcHJvY2VzcyBpcyBhcyBmb2xsb3dzOgorCiAgIC0gQXMgc29vbiBhcyBhIG5ldyBrZXJuZWwgaXMgcmVsZWFzZWQgYSB0d28gd2Vla3Mgd2luZG93IGlzIG9wZW4sCiAgICAgZHVyaW5nIHRoaXMgcGVyaW9kIG9mIHRpbWUgbWFpbnRhaW5lcnMgY2FuIHN1Ym1pdCBiaWcgZGlmZnMgdG8KICAgICBMaW51cywgdXN1YWxseSB0aGUgcGF0Y2hlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGluY2x1ZGVkIGluIHRoZQogICAgIC1uZXh0IGtlcm5lbCBmb3IgYSBmZXcgd2Vla3MuICBUaGUgcHJlZmVycmVkIHdheSB0byBzdWJtaXQgYmlnIGNoYW5nZXMKICAgICBpcyB1c2luZyBnaXQgKHRoZSBrZXJuZWwncyBzb3VyY2UgbWFuYWdlbWVudCB0b29sLCBtb3JlIGluZm9ybWF0aW9uCi0gICAgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly9naXQtc2NtLmNvbS8pIGJ1dCBwbGFpbiBwYXRjaGVzIGFyZSBhbHNvIGp1c3QKKyAgICBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly9naXQtc2NtLmNvbS8pIGJ1dCBwbGFpbiBwYXRjaGVzIGFyZSBhbHNvIGp1c3QKICAgICBmaW5lLgogICAtIEFmdGVyIHR3byB3ZWVrcyBhIC1yYzEga2VybmVsIGlzIHJlbGVhc2VkIGl0IGlzIG5vdyBwb3NzaWJsZSB0byBwdXNoCiAgICAgb25seSBwYXRjaGVzIHRoYXQgZG8gbm90IGluY2x1ZGUgbmV3IGZlYXR1cmVzIHRoYXQgY291bGQgYWZmZWN0IHRoZQpAQCAtMjUzLDkgKzI4MywxMCBAQAogCiBJdCBpcyB3b3J0aCBtZW50aW9uaW5nIHdoYXQgQW5kcmV3IE1vcnRvbiB3cm90ZSBvbiB0aGUgbGludXgta2VybmVsCiBtYWlsaW5nIGxpc3QgYWJvdXQga2VybmVsIHJlbGVhc2VzOgotCSJOb2JvZHkga25vd3Mgd2hlbiBhIGtlcm5lbCB3aWxsIGJlIHJlbGVhc2VkLCBiZWNhdXNlIGl0J3MKKworCSoiTm9ib2R5IGtub3dzIHdoZW4gYSBrZXJuZWwgd2lsbCBiZSByZWxlYXNlZCwgYmVjYXVzZSBpdCdzCiAJcmVsZWFzZWQgYWNjb3JkaW5nIHRvIHBlcmNlaXZlZCBidWcgc3RhdHVzLCBub3QgYWNjb3JkaW5nIHRvIGEKLQlwcmVjb25jZWl2ZWQgdGltZWxpbmUuIgorCXByZWNvbmNlaXZlZCB0aW1lbGluZS4iKgogCiA0LngueSAtc3RhYmxlIGtlcm5lbCB0cmVlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zMDEsNyArMzMyLDcgQEAKIE1vc3Qgb2YgdGhlc2UgcmVwb3NpdG9yaWVzIGFyZSBnaXQgdHJlZXMsIGJ1dCB0aGVyZSBhcmUgYWxzbyBvdGhlciBTQ01zCiBpbiB1c2UsIG9yIHBhdGNoIHF1ZXVlcyBiZWluZyBwdWJsaXNoZWQgYXMgcXVpbHQgc2VyaWVzLiAgQWRkcmVzc2VzIG9mCiB0aGVzZSBzdWJzeXN0ZW0gcmVwb3NpdG9yaWVzIGFyZSBsaXN0ZWQgaW4gdGhlIE1BSU5UQUlORVJTIGZpbGUuICBNYW55Ci1vZiB0aGVtIGNhbiBiZSBicm93c2VkIGF0IGh0dHA6Ly9naXQua2VybmVsLm9yZy8uCitvZiB0aGVtIGNhbiBiZSBicm93c2VkIGF0IGh0dHBzOi8vZ2l0Lmtlcm5lbC5vcmcvLgogCiBCZWZvcmUgYSBwcm9wb3NlZCBwYXRjaCBpcyBjb21taXR0ZWQgdG8gc3VjaCBhIHN1YnN5c3RlbSB0cmVlLCBpdCBpcwogc3ViamVjdCB0byByZXZpZXcgd2hpY2ggcHJpbWFyaWx5IGhhcHBlbnMgb24gbWFpbGluZyBsaXN0cyAoc2VlIHRoZQpAQCAtMzEwLDcgKzM0MSw3IEBACiBpbnRlcmZhY2Ugd2hpY2ggc2hvd3MgcGF0Y2ggcG9zdGluZ3MsIGFueSBjb21tZW50cyBvbiBhIHBhdGNoIG9yCiByZXZpc2lvbnMgdG8gaXQsIGFuZCBtYWludGFpbmVycyBjYW4gbWFyayBwYXRjaGVzIGFzIHVuZGVyIHJldmlldywKIGFjY2VwdGVkLCBvciByZWplY3RlZC4gIE1vc3Qgb2YgdGhlc2UgcGF0Y2h3b3JrIHNpdGVzIGFyZSBsaXN0ZWQgYXQKLWh0dHA6Ly9wYXRjaHdvcmsua2VybmVsLm9yZy8uCitodHRwczovL3BhdGNod29yay5rZXJuZWwub3JnLy4KIAogNC54IC1uZXh0IGtlcm5lbCB0cmVlIGZvciBpbnRlZ3JhdGlvbiB0ZXN0cwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzE4LDcgKzM0OSw4IEBACiB0cmVlLCB0aGV5IG5lZWQgdG8gYmUgaW50ZWdyYXRpb24tdGVzdGVkLiAgRm9yIHRoaXMgcHVycG9zZSwgYSBzcGVjaWFsCiB0ZXN0aW5nIHJlcG9zaXRvcnkgZXhpc3RzIGludG8gd2hpY2ggdmlydHVhbGx5IGFsbCBzdWJzeXN0ZW0gdHJlZXMgYXJlCiBwdWxsZWQgb24gYW4gYWxtb3N0IGRhaWx5IGJhc2lzOgotCWh0dHA6Ly9naXQua2VybmVsLm9yZy8/cD1saW51eC9rZXJuZWwvZ2l0L25leHQvbGludXgtbmV4dC5naXQKKworCWh0dHBzOi8vZ2l0Lmtlcm5lbC5vcmcvP3A9bGludXgva2VybmVsL2dpdC9uZXh0L2xpbnV4LW5leHQuZ2l0CiAKIFRoaXMgd2F5LCB0aGUgLW5leHQga2VybmVsIGdpdmVzIGEgc3VtbWFyeSBvdXRsb29rIG9udG8gd2hhdCB3aWxsIGJlCiBleHBlY3RlZCB0byBnbyBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwgYXQgdGhlIG5leHQgbWVyZ2UgcGVyaW9kLgpAQCAtMzI4LDEwICszNjAsMTEgQEAKIEJ1ZyBSZXBvcnRpbmcKIC0tLS0tLS0tLS0tLS0KIAotYnVnemlsbGEua2VybmVsLm9yZyBpcyB3aGVyZSB0aGUgTGludXgga2VybmVsIGRldmVsb3BlcnMgdHJhY2sga2VybmVsCitodHRwczovL2J1Z3ppbGxhLmtlcm5lbC5vcmcgaXMgd2hlcmUgdGhlIExpbnV4IGtlcm5lbCBkZXZlbG9wZXJzIHRyYWNrIGtlcm5lbAogYnVncy4gIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHJlcG9ydCBhbGwgYnVncyB0aGF0IHRoZXkgZmluZCBpbiB0aGlzCiB0b29sLiAgRm9yIGRldGFpbHMgb24gaG93IHRvIHVzZSB0aGUga2VybmVsIGJ1Z3ppbGxhLCBwbGVhc2Ugc2VlOgotCWh0dHA6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3BhZ2UuY2dpP2lkPWZhcS5odG1sCisKKwlodHRwczovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvcGFnZS5jZ2k/aWQ9ZmFxLmh0bWwKIAogVGhlIGZpbGUgUkVQT1JUSU5HLUJVR1MgaW4gdGhlIG1haW4ga2VybmVsIHNvdXJjZSBkaXJlY3RvcnkgaGFzIGEgZ29vZAogdGVtcGxhdGUgZm9yIGhvdyB0byByZXBvcnQgYSBwb3NzaWJsZSBrZXJuZWwgYnVnLCBhbmQgZGV0YWlscyB3aGF0IGtpbmQKQEAgLTM0OSwxMyArMzgyLDE0IEBACiBidWdzIGlzIG9uZSBvZiB0aGUgYmVzdCB3YXlzIHRvIGdldCBtZXJpdHMgYW1vbmcgb3RoZXIgZGV2ZWxvcGVycywgYmVjYXVzZQogbm90IG1hbnkgcGVvcGxlIGxpa2Ugd2FzdGluZyB0aW1lIGZpeGluZyBvdGhlciBwZW9wbGUncyBidWdzLgogCi1UbyB3b3JrIGluIHRoZSBhbHJlYWR5IHJlcG9ydGVkIGJ1ZyByZXBvcnRzLCBnbyB0byBodHRwOi8vYnVnemlsbGEua2VybmVsLm9yZy4KK1RvIHdvcmsgaW4gdGhlIGFscmVhZHkgcmVwb3J0ZWQgYnVnIHJlcG9ydHMsIGdvIHRvIGh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy4KIElmIHlvdSB3YW50IHRvIGJlIGFkdmlzZWQgb2YgdGhlIGZ1dHVyZSBidWcgcmVwb3J0cywgeW91IGNhbiBzdWJzY3JpYmUgdG8gdGhlCiBidWdtZS1uZXcgbWFpbGluZyBsaXN0IChvbmx5IG5ldyBidWcgcmVwb3J0cyBhcmUgbWFpbGVkIGhlcmUpIG9yIHRvIHRoZQogYnVnbWUtamFuaXRvciBtYWlsaW5nIGxpc3QgKGV2ZXJ5IGNoYW5nZSBpbiB0aGUgYnVnemlsbGEgaXMgbWFpbGVkIGhlcmUpCiAKLQlodHRwOi8vbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9idWdtZS1uZXcKLQlodHRwOi8vbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9idWdtZS1qYW5pdG9ycworCWh0dHBzOi8vbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9idWdtZS1uZXcKKworCWh0dHBzOi8vbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9idWdtZS1qYW5pdG9ycwogCiAKIApAQCAtMzY1LDEwICszOTksMTQgQEAKIEFzIHNvbWUgb2YgdGhlIGFib3ZlIGRvY3VtZW50cyBkZXNjcmliZSwgdGhlIG1ham9yaXR5IG9mIHRoZSBjb3JlIGtlcm5lbAogZGV2ZWxvcGVycyBwYXJ0aWNpcGF0ZSBvbiB0aGUgTGludXggS2VybmVsIE1haWxpbmcgbGlzdC4gIERldGFpbHMgb24gaG93CiB0byBzdWJzY3JpYmUgYW5kIHVuc3Vic2NyaWJlIGZyb20gdGhlIGxpc3QgY2FuIGJlIGZvdW5kIGF0OgorCiAJaHR0cDovL3ZnZXIua2VybmVsLm9yZy92Z2VyLWxpc3RzLmh0bWwjbGludXgta2VybmVsCisKIFRoZXJlIGFyZSBhcmNoaXZlcyBvZiB0aGUgbWFpbGluZyBsaXN0IG9uIHRoZSB3ZWIgaW4gbWFueSBkaWZmZXJlbnQKIHBsYWNlcy4gIFVzZSBhIHNlYXJjaCBlbmdpbmUgdG8gZmluZCB0aGVzZSBhcmNoaXZlcy4gIEZvciBleGFtcGxlOgorCiAJaHR0cDovL2Rpci5nbWFuZS5vcmcvZ21hbmUubGludXgua2VybmVsCisKIEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBzZWFyY2ggdGhlIGFyY2hpdmVzIGFib3V0IHRoZSB0b3BpYwogeW91IHdhbnQgdG8gYnJpbmcgdXAsIGJlZm9yZSB5b3UgcG9zdCBpdCB0byB0aGUgbGlzdC4gQSBsb3Qgb2YgdGhpbmdzCiBhbHJlYWR5IGRpc2N1c3NlZCBpbiBkZXRhaWwgYXJlIG9ubHkgcmVjb3JkZWQgYXQgdGhlIG1haWxpbmcgbGlzdApAQCAtMzgxLDExICs0MTksMTMgQEAKIAogTWFueSBvZiB0aGUgbGlzdHMgYXJlIGhvc3RlZCBvbiBrZXJuZWwub3JnLiBJbmZvcm1hdGlvbiBvbiB0aGVtIGNhbiBiZQogZm91bmQgYXQ6CisKIAlodHRwOi8vdmdlci5rZXJuZWwub3JnL3ZnZXItbGlzdHMuaHRtbAogCiBQbGVhc2UgcmVtZW1iZXIgdG8gZm9sbG93IGdvb2QgYmVoYXZpb3JhbCBoYWJpdHMgd2hlbiB1c2luZyB0aGUgbGlzdHMuCiBUaG91Z2ggYSBiaXQgY2hlZXN5LCB0aGUgZm9sbG93aW5nIFVSTCBoYXMgc29tZSBzaW1wbGUgZ3VpZGVsaW5lcyBmb3IKIGludGVyYWN0aW5nIHdpdGggdGhlIGxpc3QgKG9yIGFueSBsaXN0KToKKwogCWh0dHA6Ly93d3cuYWxiaW9uLmNvbS9uZXRpcXVldHRlLwogCiBJZiBtdWx0aXBsZSBwZW9wbGUgcmVzcG9uZCB0byB5b3VyIG1haWwsIHRoZSBDQzogbGlzdCBvZiByZWNpcGllbnRzIG1heQpAQCAtNDAwLDEzICs0NDAsMTQgQEAKIHdyaXRpbmcgYXQgdGhlIHRvcCBvZiB0aGUgbWFpbC4KIAogSWYgeW91IGFkZCBwYXRjaGVzIHRvIHlvdXIgbWFpbCwgbWFrZSBzdXJlIHRoZXkgYXJlIHBsYWluIHJlYWRhYmxlIHRleHQKLWFzIHN0YXRlZCBpbiBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzLiBLZXJuZWwgZGV2ZWxvcGVycyBkb24ndAotd2FudCB0byBkZWFsIHdpdGggYXR0YWNobWVudHMgb3IgY29tcHJlc3NlZCBwYXRjaGVzOyB0aGV5IG1heSB3YW50Ci10byBjb21tZW50IG9uIGluZGl2aWR1YWwgbGluZXMgb2YgeW91ciBwYXRjaCwgd2hpY2ggd29ya3Mgb25seSB0aGF0IHdheS4KLU1ha2Ugc3VyZSB5b3UgdXNlIGEgbWFpbCBwcm9ncmFtIHRoYXQgZG9lcyBub3QgbWFuZ2xlIHNwYWNlcyBhbmQgdGFiCi1jaGFyYWN0ZXJzLiBBIGdvb2QgZmlyc3QgdGVzdCBpcyB0byBzZW5kIHRoZSBtYWlsIHRvIHlvdXJzZWxmIGFuZCB0cnkKLXRvIGFwcGx5IHlvdXIgb3duIHBhdGNoIGJ5IHlvdXJzZWxmLiBJZiB0aGF0IGRvZXNuJ3Qgd29yaywgZ2V0IHlvdXIKLW1haWwgcHJvZ3JhbSBmaXhlZCBvciBjaGFuZ2UgaXQgdW50aWwgaXQgd29ya3MuCithcyBzdGF0ZWQgaW4gRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcy4KK0tlcm5lbCBkZXZlbG9wZXJzIGRvbid0IHdhbnQgdG8gZGVhbCB3aXRoCithdHRhY2htZW50cyBvciBjb21wcmVzc2VkIHBhdGNoZXM7IHRoZXkgbWF5IHdhbnQgdG8gY29tbWVudCBvbgoraW5kaXZpZHVhbCBsaW5lcyBvZiB5b3VyIHBhdGNoLCB3aGljaCB3b3JrcyBvbmx5IHRoYXQgd2F5LiBNYWtlIHN1cmUgeW91Cit1c2UgYSBtYWlsIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBtYW5nbGUgc3BhY2VzIGFuZCB0YWIgY2hhcmFjdGVycy4gQQorZ29vZCBmaXJzdCB0ZXN0IGlzIHRvIHNlbmQgdGhlIG1haWwgdG8geW91cnNlbGYgYW5kIHRyeSB0byBhcHBseSB5b3VyCitvd24gcGF0Y2ggYnkgeW91cnNlbGYuIElmIHRoYXQgZG9lc24ndCB3b3JrLCBnZXQgeW91ciBtYWlsIHByb2dyYW0gZml4ZWQKK29yIGNoYW5nZSBpdCB1bnRpbCBpdCB3b3Jrcy4KIAogQWJvdmUgYWxsLCBwbGVhc2UgcmVtZW1iZXIgdG8gc2hvdyByZXNwZWN0IHRvIG90aGVyIHN1YnNjcmliZXJzLgogCkBAIC00MTgsNiArNDU5LDcgQEAKIHRoZXJlIGlzLiAgV2hlbiB5b3Ugc3VibWl0IGEgcGF0Y2ggZm9yIGFjY2VwdGFuY2UsIGl0IHdpbGwgYmUgcmV2aWV3ZWQKIG9uIGl0cyB0ZWNobmljYWwgbWVyaXRzIGFuZCB0aG9zZSBhbG9uZS4gIFNvLCB3aGF0IHNob3VsZCB5b3UgYmUKIGV4cGVjdGluZz8KKwogICAtIGNyaXRpY2lzbQogICAtIGNvbW1lbnRzCiAgIC0gcmVxdWVzdHMgZm9yIGNoYW5nZQpAQCAtNDMyLDYgKzQ3NCw3IEBACiBhZ2Fpbiwgc29tZXRpbWVzIHRoaW5ncyBnZXQgbG9zdCBpbiB0aGUgaHVnZSB2b2x1bWUuCiAKIFdoYXQgc2hvdWxkIHlvdSBub3QgZG8/CisKICAgLSBleHBlY3QgeW91ciBwYXRjaCB0byBiZSBhY2NlcHRlZCB3aXRob3V0IHF1ZXN0aW9uCiAgIC0gYmVjb21lIGRlZmVuc2l2ZQogICAtIGlnbm9yZSBjb21tZW50cwpAQCAtNDQ1LDggKzQ4OCw4IEBACiB0b3dhcmQgYSBzb2x1dGlvbiB0aGF0IGlzIHJpZ2h0LgogCiBJdCBpcyBub3JtYWwgdGhhdCB0aGUgYW5zd2VycyB0byB5b3VyIGZpcnN0IHBhdGNoIG1pZ2h0IHNpbXBseSBiZSBhIGxpc3QKLW9mIGEgZG96ZW4gdGhpbmdzIHlvdSBzaG91bGQgY29ycmVjdC4gIFRoaXMgZG9lcyBfbm90XyBpbXBseSB0aGF0IHlvdXIKLXBhdGNoIHdpbGwgbm90IGJlIGFjY2VwdGVkLCBhbmQgaXQgaXMgX25vdF8gbWVhbnQgYWdhaW5zdCB5b3UKK29mIGEgZG96ZW4gdGhpbmdzIHlvdSBzaG91bGQgY29ycmVjdC4gIFRoaXMgZG9lcyAqKm5vdCoqIGltcGx5IHRoYXQgeW91cgorcGF0Y2ggd2lsbCBub3QgYmUgYWNjZXB0ZWQsIGFuZCBpdCBpcyAqKm5vdCoqIG1lYW50IGFnYWluc3QgeW91CiBwZXJzb25hbGx5LiAgU2ltcGx5IGNvcnJlY3QgYWxsIGlzc3VlcyByYWlzZWQgYWdhaW5zdCB5b3VyIHBhdGNoIGFuZAogcmVzZW5kIGl0LgogCkBAIC00NTcsNyArNTAwLDkgQEAKIFRoZSBrZXJuZWwgY29tbXVuaXR5IHdvcmtzIGRpZmZlcmVudGx5IHRoYW4gbW9zdCB0cmFkaXRpb25hbCBjb3Jwb3JhdGUKIGRldmVsb3BtZW50IGVudmlyb25tZW50cy4gIEhlcmUgYXJlIGEgbGlzdCBvZiB0aGluZ3MgdGhhdCB5b3UgY2FuIHRyeSB0bwogZG8gdG8gYXZvaWQgcHJvYmxlbXM6CisKICAgR29vZCB0aGluZ3MgdG8gc2F5IHJlZ2FyZGluZyB5b3VyIHByb3Bvc2VkIGNoYW5nZXM6CisKICAgICAtICJUaGlzIHNvbHZlcyBtdWx0aXBsZSBwcm9ibGVtcy4iCiAgICAgLSAiVGhpcyBkZWxldGVzIDIwMDAgbGluZXMgb2YgY29kZS4iCiAgICAgLSAiSGVyZSBpcyBhIHBhdGNoIHRoYXQgZXhwbGFpbnMgd2hhdCBJIGFtIHRyeWluZyB0byBkZXNjcmliZS4iCkBAIC00NjYsNiArNTExLDcgQEAKICAgICAtICJUaGlzIGluY3JlYXNlcyBwZXJmb3JtYW5jZSBvbiB0eXBpY2FsIG1hY2hpbmVzLi4uIgogCiAgIEJhZCB0aGluZ3MgeW91IHNob3VsZCBhdm9pZCBzYXlpbmc6CisKICAgICAtICJXZSBkaWQgaXQgdGhpcyB3YXkgaW4gQUlYL3B0eC9Tb2xhcmlzLCBzbyB0aGVyZWZvcmUgaXQgbXVzdCBiZQogICAgICAgZ29vZC4uLiIKICAgICAtICJJJ3ZlIGJlaW5nIGRvaW5nIHRoaXMgZm9yIDIwIHllYXJzLCBzby4uLiIKQEAgLTUyNywxNyArNTczLDE4IEBACiAgICBhbmQgc2ltcGxpZnkgKG9yIHNpbXBseSByZS1vcmRlcikgcGF0Y2hlcyBiZWZvcmUgc3VibWl0dGluZyB0aGVtLgogCiBIZXJlIGlzIGFuIGFuYWxvZ3kgZnJvbSBrZXJuZWwgZGV2ZWxvcGVyIEFsIFZpcm86Ci0JIlRoaW5rIG9mIGEgdGVhY2hlciBncmFkaW5nIGhvbWV3b3JrIGZyb20gYSBtYXRoIHN0dWRlbnQuICBUaGUKKworCSoiVGhpbmsgb2YgYSB0ZWFjaGVyIGdyYWRpbmcgaG9tZXdvcmsgZnJvbSBhIG1hdGggc3R1ZGVudC4gIFRoZQogCXRlYWNoZXIgZG9lcyBub3Qgd2FudCB0byBzZWUgdGhlIHN0dWRlbnQncyB0cmlhbHMgYW5kIGVycm9ycwogCWJlZm9yZSB0aGV5IGNhbWUgdXAgd2l0aCB0aGUgc29sdXRpb24uIFRoZXkgd2FudCB0byBzZWUgdGhlCiAJY2xlYW5lc3QsIG1vc3QgZWxlZ2FudCBhbnN3ZXIuICBBIGdvb2Qgc3R1ZGVudCBrbm93cyB0aGlzLCBhbmQKIAl3b3VsZCBuZXZlciBzdWJtaXQgaGVyIGludGVybWVkaWF0ZSB3b3JrIGJlZm9yZSB0aGUgZmluYWwKLQlzb2x1dGlvbi4iCisJc29sdXRpb24uKgogCi0JVGhlIHNhbWUgaXMgdHJ1ZSBvZiBrZXJuZWwgZGV2ZWxvcG1lbnQuIFRoZSBtYWludGFpbmVycyBhbmQKKwkqVGhlIHNhbWUgaXMgdHJ1ZSBvZiBrZXJuZWwgZGV2ZWxvcG1lbnQuIFRoZSBtYWludGFpbmVycyBhbmQKIAlyZXZpZXdlcnMgZG8gbm90IHdhbnQgdG8gc2VlIHRoZSB0aG91Z2h0IHByb2Nlc3MgYmVoaW5kIHRoZQogCXNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtIG9uZSBpcyBzb2x2aW5nLiBUaGV5IHdhbnQgdG8gc2VlIGEKLQlzaW1wbGUgYW5kIGVsZWdhbnQgc29sdXRpb24uIgorCXNpbXBsZSBhbmQgZWxlZ2FudCBzb2x1dGlvbi4iKgogCiBJdCBtYXkgYmUgY2hhbGxlbmdpbmcgdG8ga2VlcCB0aGUgYmFsYW5jZSBiZXR3ZWVuIHByZXNlbnRpbmcgYW4gZWxlZ2FudAogc29sdXRpb24gYW5kIHdvcmtpbmcgdG9nZXRoZXIgd2l0aCB0aGUgY29tbXVuaXR5IGFuZCBkaXNjdXNzaW5nIHlvdXIKQEAgLTU2NSw2ICs2MTIsNyBAQAogdGhlIHRleHQgaW4geW91ciBlbWFpbC4gIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZWNvbWUgdGhlIENoYW5nZUxvZwogaW5mb3JtYXRpb24gZm9yIHRoZSBwYXRjaCwgYW5kIHdpbGwgYmUgcHJlc2VydmVkIGZvciBldmVyeW9uZSB0byBzZWUgZm9yCiBhbGwgdGltZS4gIEl0IHNob3VsZCBkZXNjcmliZSB0aGUgcGF0Y2ggY29tcGxldGVseSwgY29udGFpbmluZzoKKwogICAtIHdoeSB0aGUgY2hhbmdlIGlzIG5lY2Vzc2FyeQogICAtIHRoZSBvdmVyYWxsIGRlc2lnbiBhcHByb2FjaCBpbiB0aGUgcGF0Y2gKICAgLSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCkBAIC01NzIsMTIgKzYyMCwxMSBAQAogCiBGb3IgbW9yZSBkZXRhaWxzIG9uIHdoYXQgdGhpcyBzaG91bGQgYWxsIGxvb2sgbGlrZSwgcGxlYXNlIHNlZSB0aGUKIENoYW5nZUxvZyBzZWN0aW9uIG9mIHRoZSBkb2N1bWVudDoKKwogICAiVGhlIFBlcmZlY3QgUGF0Y2giCiAgICAgICBodHRwOi8vd3d3Lm96bGFicy5vcmcvfmFrcG0vc3R1ZmYvdHBwLnR4dAogCiAKLQotCiBBbGwgb2YgdGhlc2UgdGhpbmdzIGFyZSBzb21ldGltZXMgdmVyeSBoYXJkIHRvIGRvLiBJdCBjYW4gdGFrZSB5ZWFycyB0bwogcGVyZmVjdCB0aGVzZSBwcmFjdGljZXMgKGlmIGF0IGFsbCkuIEl0J3MgYSBjb250aW51b3VzIHByb2Nlc3Mgb2YKIGltcHJvdmVtZW50IHRoYXQgcmVxdWlyZXMgYSBsb3Qgb2YgcGF0aWVuY2UgYW5kIGRldGVybWluYXRpb24uIEJ1dApAQCAtNTg4LDggKzYzNSw5IEBACiAKIAogLS0tLS0tLS0tLQorCiBUaGFua3MgdG8gUGFvbG8gQ2lhcnJvY2NoaSB3aG8gYWxsb3dlZCB0aGUgIkRldmVsb3BtZW50IFByb2Nlc3MiCi0oaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvOTQzODYvKSBzZWN0aW9uCisoaHR0cHM6Ly9sd24ubmV0L0FydGljbGVzLzk0Mzg2Lykgc2VjdGlvbgogdG8gYmUgYmFzZWQgb24gdGV4dCBoZSBoYWQgd3JpdHRlbiwgYW5kIHRvIFJhbmR5IER1bmxhcCBhbmQgR2Vycml0CiBIdWl6ZW5nYSBmb3Igc29tZSBvZiB0aGUgbGlzdCBvZiB0aGluZ3MgeW91IHNob3VsZCBhbmQgc2hvdWxkIG5vdCBzYXkuCiBBbHNvIHRoYW5rcyB0byBQYXQgTW9jaGVsLCBIYW5uYSBMaW5kZXIsIFJhbmR5IER1bmxhcCwgS2F5IFNpZXZlcnMsCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL01ha2VmaWxlLnNwaGlueCBiL0RvY3VtZW50YXRpb24vTWFrZWZpbGUuc3BoaW54CmluZGV4IDg1N2YxZTIuLjkyZGVlYTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vTWFrZWZpbGUuc3BoaW54CisrKyBiL0RvY3VtZW50YXRpb24vTWFrZWZpbGUuc3BoaW54CkBAIC01LDYgKzUsOSBAQAogIyBZb3UgY2FuIHNldCB0aGVzZSB2YXJpYWJsZXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgogU1BISU5YQlVJTEQgICA9IHNwaGlueC1idWlsZAogU1BISU5YT1BUUyAgICA9CitTUEhJTlhESVJTICAgID0gLgorX1NQSElOWERJUlMgICA9ICQocGF0c3Vic3QgJChzcmN0cmVlKS9Eb2N1bWVudGF0aW9uLyUvY29uZi5weSwlLCQod2lsZGNhcmQgJChzcmN0cmVlKS9Eb2N1bWVudGF0aW9uLyovY29uZi5weSkpCitTUEhJTlhfQ09ORiAgID0gY29uZi5weQogUEFQRVIgICAgICAgICA9CiBCVUlMRERJUiAgICAgID0gJChvYmopL291dHB1dAogCkBAIC0yNSwzOCArMjgsNjIgQEAKIAogZWxzZSAjIEhBVkVfU1BISU5YCiAKLSMgVXNlci1mcmllbmRseSBjaGVjayBmb3IgcnN0MnBkZgotSEFWRV9SU1QyUERGIDo9ICQoc2hlbGwgaWYgcHl0aG9uIC1jICJpbXBvcnQgcnN0MnBkZiIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIGVjaG8gMTsgZWxzZSBlY2hvIDA7IGZpKQorIyBVc2VyLWZyaWVuZGx5IGNoZWNrIGZvciBwZGZsYXRleAorSEFWRV9QREZMQVRFWCA6PSAkKHNoZWxsIGlmIHdoaWNoIHhlbGF0ZXggPi9kZXYvbnVsbCAyPiYxOyB0aGVuIGVjaG8gMTsgZWxzZSBlY2hvIDA7IGZpKQogCiAjIEludGVybmFsIHZhcmlhYmxlcy4KIFBBUEVST1BUX2E0ICAgICA9IC1EIGxhdGV4X3BhcGVyX3NpemU9YTQKIFBBUEVST1BUX2xldHRlciA9IC1EIGxhdGV4X3BhcGVyX3NpemU9bGV0dGVyCiBLRVJORUxET0MgICAgICAgPSAkKHNyY3RyZWUpL3NjcmlwdHMva2VybmVsLWRvYwogS0VSTkVMRE9DX0NPTkYgID0gLUQga2VybmVsZG9jX3NyY3RyZWU9JChzcmN0cmVlKSAtRCBrZXJuZWxkb2NfYmluPSQoS0VSTkVMRE9DKQotQUxMU1BISU5YT1BUUyAgID0gLUQgdmVyc2lvbj0kKEtFUk5FTFZFUlNJT04pIC1EIHJlbGVhc2U9JChLRVJORUxSRUxFQVNFKSAtZCAkKEJVSUxERElSKS8uZG9jdHJlZXMgJChLRVJORUxET0NfQ09ORikgJChQQVBFUk9QVF8kKFBBUEVSKSkgLWMgJChzcmN0cmVlKS8kKHNyYykgJChTUEhJTlhPUFRTKSAkKHNyY3RyZWUpLyQoc3JjKQorQUxMU1BISU5YT1BUUyAgID0gICQoS0VSTkVMRE9DX0NPTkYpICQoUEFQRVJPUFRfJChQQVBFUikpICQoU1BISU5YT1BUUykKICMgdGhlIGkxOG4gYnVpbGRlciBjYW5ub3Qgc2hhcmUgdGhlIGVudmlyb25tZW50IGFuZCBkb2N0cmVlcyB3aXRoIHRoZSBvdGhlcnMKIEkxOE5TUEhJTlhPUFRTICA9ICQoUEFQRVJPUFRfJChQQVBFUikpICQoU1BISU5YT1BUUykgLgogCi1xdWlldF9jbWRfc3BoaW54ID0gU1BISU5YICAkQAotICAgICAgY21kX3NwaGlueCA9IEJVSUxERElSPSQoQlVJTERESVIpICQoU1BISU5YQlVJTEQpIC1iICQyICQoQUxMU1BISU5YT1BUUykgJChCVUlMRERJUikvJDIKKyMgY29tbWFuZHM7IHRoZSAnY21kJyBmcm9tIHNjcmlwdHMvS2J1aWxkLmluY2x1ZGUgaXMgbm90ICpsb29wYWJsZSoKK2xvb3BfY21kID0gJChlY2hvLWNtZCkgJChjbWRfJCgxKSkKKworIyAkMiBzcGhpbnggYnVpbGRlciBlLmcuICJodG1sIgorIyAkMyBuYW1lIG9mIHRoZSBidWlsZCBzdWJmb2xkZXIgLyBlLmcuICJtZWRpYSIsIHVzZWQgYXM6CisjICAgICogZGVzdCBmb2xkZXIgcmVsYXRpdmUgdG8gJChCVUlMRERJUikgYW5kCisjICAgICogY2FjaGUgZm9sZGVyIHJlbGF0aXZlIHRvICQoQlVJTERESVIpLy5kb2N0cmVlcworIyAkNCBkZXN0IHN1YmZvbGRlciBlLmcuICJtYW4iIGZvciBtYW4gcGFnZXMgYXQgbWVkaWEvbWFuCisjICQ1IHJlU1Qgc291cmNlIGZvbGRlciByZWxhdGl2ZSB0byAkKHNyY3RyZWUpLyQoc3JjKSwKKyMgICAgZS5nLiAibWVkaWEiIGZvciB0aGUgbGludXgtdHYgYm9vay1zZXQgYXQgLi9Eb2N1bWVudGF0aW9uL21lZGlhCisKK3F1aWV0X2NtZF9zcGhpbnggPSBTUEhJTlggICRAIC0tPiBmaWxlOi8vJChhYnNwYXRoICQoQlVJTERESVIpLyQzLyQ0KTsKKyAgICAgIGNtZF9zcGhpbnggPSAkKE1BS0UpIEJVSUxERElSPSQoYWJzcGF0aCAkKEJVSUxERElSKSkgJChidWlsZCk9RG9jdW1lbnRhdGlvbi9tZWRpYSBhbGw7XAorCUJVSUxERElSPSQoYWJzcGF0aCAkKEJVSUxERElSKSkgU1BISU5YX0NPTkY9JChhYnNwYXRoICQoc3JjdHJlZSkvJChzcmMpLyQ1LyQoU1BISU5YX0NPTkYpKSBcCisJJChTUEhJTlhCVUlMRCkgXAorCS1iICQyIFwKKwktYyAkKGFic3BhdGggJChzcmN0cmVlKS8kKHNyYykpIFwKKwktZCAkKGFic3BhdGggJChCVUlMRERJUikvLmRvY3RyZWVzLyQzKSBcCisJLUQgdmVyc2lvbj0kKEtFUk5FTFZFUlNJT04pIC1EIHJlbGVhc2U9JChLRVJORUxSRUxFQVNFKSBcCisJJChBTExTUEhJTlhPUFRTKSBcCisJJChhYnNwYXRoICQoc3JjdHJlZSkvJChzcmMpLyQ1KSBcCisJJChhYnNwYXRoICQoQlVJTERESVIpLyQzLyQ0KTsKIAogaHRtbGRvY3M6Ci0JJChNQUtFKSBCVUlMRERJUj0kKEJVSUxERElSKSAtZiAkKHNyY3RyZWUpL0RvY3VtZW50YXRpb24vbWVkaWEvTWFrZWZpbGUgJEAKLQkkKGNhbGwgY21kLHNwaGlueCxodG1sKQorCUAkKGZvcmVhY2ggdmFyLCQoU1BISU5YRElSUyksJChjYWxsIGxvb3BfY21kLHNwaGlueCxodG1sLCQodmFyKSwsJCh2YXIpKSkKIAotcGRmZG9jczoKLWlmZXEgKCQoSEFWRV9SU1QyUERGKSwwKQotCSQod2FybmluZyBUaGUgUHl0aG9uICdyc3QycGRmJyBtb2R1bGUgd2FzIG5vdCBmb3VuZC4gTWFrZSBzdXJlIHlvdSBoYXZlIHRoZSBtb2R1bGUgaW5zdGFsbGVkIHRvIHByb2R1Y2UgUERGIG91dHB1dC4pCitsYXRleGRvY3M6CitpZmVxICgkKEhBVkVfUERGTEFURVgpLDApCisJJCh3YXJuaW5nIFRoZSAneGVsYXRleCcgY29tbWFuZCB3YXMgbm90IGZvdW5kLiBNYWtlIHN1cmUgeW91IGhhdmUgaXQgaW5zdGFsbGVkIGFuZCBpbiBQQVRIIHRvIHByb2R1Y2UgUERGIG91dHB1dC4pCiAJQGVjaG8gIiAgU0tJUCAgICBTcGhpbnggJEAgdGFyZ2V0LiIKLWVsc2UgIyBIQVZFX1JTVDJQREYKLQkkKGNhbGwgY21kLHNwaGlueCxwZGYpCi1lbmRpZiAjIEhBVkVfUlNUMlBERgorZWxzZSAjIEhBVkVfUERGTEFURVgKKwlAJChmb3JlYWNoIHZhciwkKFNQSElOWERJUlMpLCQoY2FsbCBsb29wX2NtZCxzcGhpbngsbGF0ZXgsJCh2YXIpLGxhdGV4LCQodmFyKSkpCitlbmRpZiAjIEhBVkVfUERGTEFURVgKKworcGRmZG9jczogbGF0ZXhkb2NzCitpZm5lcSAoJChIQVZFX1BERkxBVEVYKSwwKQorCSQoZm9yZWFjaCB2YXIsJChTUEhJTlhESVJTKSwgJChNQUtFKSBQREZMQVRFWD14ZWxhdGV4IExBVEVYT1BUUz0iLWludGVyYWN0aW9uPW5vbnN0b3Btb2RlIiAtQyAkKEJVSUxERElSKS8kKHZhcikvbGF0ZXgpCitlbmRpZiAjIEhBVkVfUERGTEFURVgKIAogZXB1YmRvY3M6Ci0JJChjYWxsIGNtZCxzcGhpbngsZXB1YikKKwlAJChmb3JlYWNoIHZhciwkKFNQSElOWERJUlMpLCQoY2FsbCBsb29wX2NtZCxzcGhpbngsZXB1YiwkKHZhciksZXB1YiwkKHZhcikpKQogCiB4bWxkb2NzOgotCSQoY2FsbCBjbWQsc3BoaW54LHhtbCkKKwlAJChmb3JlYWNoIHZhciwkKFNQSElOWERJUlMpLCQoY2FsbCBsb29wX2NtZCxzcGhpbngseG1sLCQodmFyKSx4bWwsJCh2YXIpKSkKIAogIyBuby1vcHMgZm9yIHRoZSBTcGhpbnggdG9vbGNoYWluCiBzZ21sZG9jczoKQEAgLTcyLDcgKzk5LDE0IEBACiBkb2NoZWxwOgogCUBlY2hvICAnIExpbnV4IGtlcm5lbCBpbnRlcm5hbCBkb2N1bWVudGF0aW9uIGluIGRpZmZlcmVudCBmb3JtYXRzIChTcGhpbngpOicKIAlAZWNobyAgJyAgaHRtbGRvY3MgICAgICAgIC0gSFRNTCcKKwlAZWNobyAgJyAgbGF0ZXhkb2NzICAgICAgIC0gTGFUZVgnCiAJQGVjaG8gICcgIHBkZmRvY3MgICAgICAgICAtIFBERicKIAlAZWNobyAgJyAgZXB1YmRvY3MgICAgICAgIC0gRVBVQicKIAlAZWNobyAgJyAgeG1sZG9jcyAgICAgICAgIC0gWE1MJwogCUBlY2hvICAnICBjbGVhbmRvY3MgICAgICAgLSBjbGVhbiBhbGwgZ2VuZXJhdGVkIGZpbGVzJworCUBlY2hvCisJQGVjaG8gICcgIG1ha2UgU1BISU5YRElSUz0iczEgczIiIFt0YXJnZXRdIEdlbmVyYXRlIG9ubHkgZG9jcyBvZiBmb2xkZXIgczEsIHMyJworCUBlY2hvICAnICB2YWxpZCB2YWx1ZXMgZm9yIFNQSElOWERJUlMgYXJlOiAkKF9TUEhJTlhESVJTKScKKwlAZWNobworCUBlY2hvICAnICBtYWtlIFNQSElOWF9DT05GPXtjb25mLWZpbGV9IFt0YXJnZXRdIHVzZSAqYWRkaXRpb25hbCogc3BoaW54LWJ1aWxkJworCUBlY2hvICAnICBjb25maWd1cmF0aW9uLiBUaGlzIGlzIGUuZy4gdXNlZnVsIHRvIGJ1aWxkIHdpdGggbml0LXBpY2tpbmcgY29uZmlnLicKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vTWFuYWdlbWVudFN0eWxlIGIvRG9jdW1lbnRhdGlvbi9NYW5hZ2VtZW50U3R5bGUKaW5kZXggYTIxMWVlOC4uZGVhMmU2NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9NYW5hZ2VtZW50U3R5bGUKKysrIGIvRG9jdW1lbnRhdGlvbi9NYW5hZ2VtZW50U3R5bGUKQEAgLTEsMTAgKzEsMTIgQEAKKy4uIF9tYW5hZ2VtZW50c3R5bGU6CiAKLSAgICAgICAgICAgICAgICBMaW51eCBrZXJuZWwgbWFuYWdlbWVudCBzdHlsZQorTGludXgga2VybmVsIG1hbmFnZW1lbnQgc3R5bGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFRoaXMgaXMgYSBzaG9ydCBkb2N1bWVudCBkZXNjcmliaW5nIHRoZSBwcmVmZXJyZWQgKG9yIG1hZGUgdXAsIGRlcGVuZGluZwogb24gd2hvIHlvdSBhc2spIG1hbmFnZW1lbnQgc3R5bGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuICBJdCdzIG1lYW50IHRvCiBtaXJyb3IgdGhlIENvZGluZ1N0eWxlIGRvY3VtZW50IHRvIHNvbWUgZGVncmVlLCBhbmQgbWFpbmx5IHdyaXR0ZW4gdG8KLWF2b2lkIGFuc3dlcmluZyAoKikgdGhlIHNhbWUgKG9yIHNpbWlsYXIpIHF1ZXN0aW9ucyBvdmVyIGFuZCBvdmVyIGFnYWluLiAKK2F2b2lkIGFuc3dlcmluZyBbI2YxXV8gIHRoZSBzYW1lIChvciBzaW1pbGFyKSBxdWVzdGlvbnMgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4KIAogTWFuYWdlbWVudCBzdHlsZSBpcyB2ZXJ5IHBlcnNvbmFsIGFuZCBtdWNoIGhhcmRlciB0byBxdWFudGlmeSB0aGFuCiBzaW1wbGUgY29kaW5nIHN0eWxlIHJ1bGVzLCBzbyB0aGlzIGRvY3VtZW50IG1heSBvciBtYXkgbm90IGhhdmUgYW55dGhpbmcKQEAgLTE0LDUwICsxNiw1MiBAQAogQnR3LCB3aGVuIHRhbGtpbmcgYWJvdXQgImtlcm5lbCBtYW5hZ2VyIiwgaXQncyBhbGwgYWJvdXQgdGhlIHRlY2huaWNhbAogbGVhZCBwZXJzb25zLCBub3QgdGhlIHBlb3BsZSB3aG8gZG8gdHJhZGl0aW9uYWwgbWFuYWdlbWVudCBpbnNpZGUKIGNvbXBhbmllcy4gIElmIHlvdSBzaWduIHB1cmNoYXNlIG9yZGVycyBvciB5b3UgaGF2ZSBhbnkgY2x1ZSBhYm91dCB0aGUKLWJ1ZGdldCBvZiB5b3VyIGdyb3VwLCB5b3UncmUgYWxtb3N0IGNlcnRhaW5seSBub3QgYSBrZXJuZWwgbWFuYWdlci4gCi1UaGVzZSBzdWdnZXN0aW9ucyBtYXkgb3IgbWF5IG5vdCBhcHBseSB0byB5b3UuIAorYnVkZ2V0IG9mIHlvdXIgZ3JvdXAsIHlvdSdyZSBhbG1vc3QgY2VydGFpbmx5IG5vdCBhIGtlcm5lbCBtYW5hZ2VyLgorVGhlc2Ugc3VnZ2VzdGlvbnMgbWF5IG9yIG1heSBub3QgYXBwbHkgdG8geW91LgogCiBGaXJzdCBvZmYsIEknZCBzdWdnZXN0IGJ1eWluZyAiU2V2ZW4gSGFiaXRzIG9mIEhpZ2hseSBFZmZlY3RpdmUKLVBlb3BsZSIsIGFuZCBOT1QgcmVhZCBpdC4gIEJ1cm4gaXQsIGl0J3MgYSBncmVhdCBzeW1ib2xpYyBnZXN0dXJlLiAKK1Blb3BsZSIsIGFuZCBOT1QgcmVhZCBpdC4gIEJ1cm4gaXQsIGl0J3MgYSBncmVhdCBzeW1ib2xpYyBnZXN0dXJlLgogCi0oKikgVGhpcyBkb2N1bWVudCBkb2VzIHNvIG5vdCBzbyBtdWNoIGJ5IGFuc3dlcmluZyB0aGUgcXVlc3Rpb24sIGJ1dCBieQotbWFraW5nIGl0IHBhaW5mdWxseSBvYnZpb3VzIHRvIHRoZSBxdWVzdGlvbmVyIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIGNsdWUKLXRvIHdoYXQgdGhlIGFuc3dlciBpcy4gCisuLiBbI2YxXSBUaGlzIGRvY3VtZW50IGRvZXMgc28gbm90IHNvIG11Y2ggYnkgYW5zd2VyaW5nIHRoZSBxdWVzdGlvbiwgYnV0IGJ5CisgIG1ha2luZyBpdCBwYWluZnVsbHkgb2J2aW91cyB0byB0aGUgcXVlc3Rpb25lciB0aGF0IHdlIGRvbid0IGhhdmUgYSBjbHVlCisgIHRvIHdoYXQgdGhlIGFuc3dlciBpcy4KIAogQW55d2F5LCBoZXJlIGdvZXM6CiAKKy4uIF9kZWNpc2lvbnM6CiAKLQkJQ2hhcHRlciAxOiBEZWNpc2lvbnMKKzEpIERlY2lzaW9ucworLS0tLS0tLS0tLS0tCiAKIEV2ZXJ5Ym9keSB0aGlua3MgbWFuYWdlcnMgbWFrZSBkZWNpc2lvbnMsIGFuZCB0aGF0IGRlY2lzaW9uLW1ha2luZyBpcwogaW1wb3J0YW50LiAgVGhlIGJpZ2dlciBhbmQgbW9yZSBwYWluZnVsIHRoZSBkZWNpc2lvbiwgdGhlIGJpZ2dlciB0aGUKIG1hbmFnZXIgbXVzdCBiZSB0byBtYWtlIGl0LiAgVGhhdCdzIHZlcnkgZGVlcCBhbmQgb2J2aW91cywgYnV0IGl0J3Mgbm90Ci1hY3R1YWxseSB0cnVlLiAKK2FjdHVhbGx5IHRydWUuCiAKLVRoZSBuYW1lIG9mIHRoZSBnYW1lIGlzIHRvIF9hdm9pZF8gaGF2aW5nIHRvIG1ha2UgYSBkZWNpc2lvbi4gIEluCitUaGUgbmFtZSBvZiB0aGUgZ2FtZSBpcyB0byAqKmF2b2lkKiogaGF2aW5nIHRvIG1ha2UgYSBkZWNpc2lvbi4gIEluCiBwYXJ0aWN1bGFyLCBpZiBzb21lYm9keSB0ZWxscyB5b3UgImNob29zZSAoYSkgb3IgKGIpLCB3ZSByZWFsbHkgbmVlZCB5b3UKIHRvIGRlY2lkZSBvbiB0aGlzIiwgeW91J3JlIGluIHRyb3VibGUgYXMgYSBtYW5hZ2VyLiAgVGhlIHBlb3BsZSB5b3UKIG1hbmFnZSBoYWQgYmV0dGVyIGtub3cgdGhlIGRldGFpbHMgYmV0dGVyIHRoYW4geW91LCBzbyBpZiB0aGV5IGNvbWUgdG8KIHlvdSBmb3IgYSB0ZWNobmljYWwgZGVjaXNpb24sIHlvdSdyZSBzY3Jld2VkLiAgWW91J3JlIGNsZWFybHkgbm90Ci1jb21wZXRlbnQgdG8gbWFrZSB0aGF0IGRlY2lzaW9uIGZvciB0aGVtLiAKK2NvbXBldGVudCB0byBtYWtlIHRoYXQgZGVjaXNpb24gZm9yIHRoZW0uCiAKIChDb3JvbGxhcnk6aWYgdGhlIHBlb3BsZSB5b3UgbWFuYWdlIGRvbid0IGtub3cgdGhlIGRldGFpbHMgYmV0dGVyIHRoYW4KLXlvdSwgeW91J3JlIGFsc28gc2NyZXdlZCwgYWx0aG91Z2ggZm9yIGEgdG90YWxseSBkaWZmZXJlbnQgcmVhc29uLiAKLU5hbWVseSB0aGF0IHlvdSBhcmUgaW4gdGhlIHdyb25nIGpvYiwgYW5kIHRoYXQgX3RoZXlfIHNob3VsZCBiZSBtYW5hZ2luZwoteW91ciBicmlsbGlhbmNlIGluc3RlYWQpLiAKK3lvdSwgeW91J3JlIGFsc28gc2NyZXdlZCwgYWx0aG91Z2ggZm9yIGEgdG90YWxseSBkaWZmZXJlbnQgcmVhc29uLgorTmFtZWx5IHRoYXQgeW91IGFyZSBpbiB0aGUgd3Jvbmcgam9iLCBhbmQgdGhhdCAqKnRoZXkqKiBzaG91bGQgYmUgbWFuYWdpbmcKK3lvdXIgYnJpbGxpYW5jZSBpbnN0ZWFkKS4KIAotU28gdGhlIG5hbWUgb2YgdGhlIGdhbWUgaXMgdG8gX2F2b2lkXyBkZWNpc2lvbnMsIGF0IGxlYXN0IHRoZSBiaWcgYW5kCitTbyB0aGUgbmFtZSBvZiB0aGUgZ2FtZSBpcyB0byAqKmF2b2lkKiogZGVjaXNpb25zLCBhdCBsZWFzdCB0aGUgYmlnIGFuZAogcGFpbmZ1bCBvbmVzLiAgTWFraW5nIHNtYWxsIGFuZCBub24tY29uc2VxdWVudGlhbCBkZWNpc2lvbnMgaXMgZmluZSwgYW5kCiBtYWtlcyB5b3UgbG9vayBsaWtlIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLCBzbyB3aGF0IGEga2VybmVsIG1hbmFnZXIKIG5lZWRzIHRvIGRvIGlzIHRvIHR1cm4gdGhlIGJpZyBhbmQgcGFpbmZ1bCBvbmVzIGludG8gc21hbGwgdGhpbmdzIHdoZXJlCi1ub2JvZHkgcmVhbGx5IGNhcmVzLiAKK25vYm9keSByZWFsbHkgY2FyZXMuCiAKIEl0IGhlbHBzIHRvIHJlYWxpemUgdGhhdCB0aGUga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBhIGJpZyBkZWNpc2lvbiBhbmQgYQogc21hbGwgb25lIGlzIHdoZXRoZXIgeW91IGNhbiBmaXggeW91ciBkZWNpc2lvbiBhZnRlcndhcmRzLiAgQW55IGRlY2lzaW9uCiBjYW4gYmUgbWFkZSBzbWFsbCBieSBqdXN0IGFsd2F5cyBtYWtpbmcgc3VyZSB0aGF0IGlmIHlvdSB3ZXJlIHdyb25nIChhbmQKLXlvdSBfd2lsbF8gYmUgd3JvbmcpLCB5b3UgY2FuIGFsd2F5cyB1bmRvIHRoZSBkYW1hZ2UgbGF0ZXIgYnkKK3lvdSAqKndpbGwqKiBiZSB3cm9uZyksIHlvdSBjYW4gYWx3YXlzIHVuZG8gdGhlIGRhbWFnZSBsYXRlciBieQogYmFja3RyYWNraW5nLiAgU3VkZGVubHksIHlvdSBnZXQgdG8gYmUgZG91Ymx5IG1hbmFnZXJpYWwgZm9yIG1ha2luZwotX3R3b18gaW5jb25zZXF1ZW50aWFsIGRlY2lzaW9ucyAtIHRoZSB3cm9uZyBvbmUgX2FuZF8gdGhlIHJpZ2h0IG9uZS4gCisqKnR3byoqIGluY29uc2VxdWVudGlhbCBkZWNpc2lvbnMgLSB0aGUgd3Jvbmcgb25lICoqYW5kKiogdGhlIHJpZ2h0IG9uZS4KIAogQW5kIHBlb3BsZSB3aWxsIGV2ZW4gc2VlIHRoYXQgYXMgdHJ1ZSBsZWFkZXJzaGlwICgqY291Z2gqIGJ1bGxzaGl0CiAqY291Z2gqKS4KQEAgLTY1LDEwICs2OSwxMCBAQAogVGh1cyB0aGUga2V5IHRvIGF2b2lkaW5nIGJpZyBkZWNpc2lvbnMgYmVjb21lcyB0byBqdXN0IGF2b2lkaW5nIHRvIGRvCiB0aGluZ3MgdGhhdCBjYW4ndCBiZSB1bmRvbmUuICBEb24ndCBnZXQgdXNoZXJlZCBpbnRvIGEgY29ybmVyIGZyb20gd2hpY2gKIHlvdSBjYW5ub3QgZXNjYXBlLiAgQSBjb3JuZXJlZCByYXQgbWF5IGJlIGRhbmdlcm91cyAtIGEgY29ybmVyZWQgbWFuYWdlcgotaXMganVzdCBwaXRpZnVsLiAKK2lzIGp1c3QgcGl0aWZ1bC4KIAogSXQgdHVybnMgb3V0IHRoYXQgc2luY2Ugbm9ib2R5IHdvdWxkIGJlIHN0dXBpZCBlbm91Z2ggdG8gZXZlciByZWFsbHkgbGV0Ci1hIGtlcm5lbCBtYW5hZ2VyIGhhdmUgaHVnZSBmaXNjYWwgcmVzcG9uc2liaWxpdHkgX2FueXdheV8sIGl0J3MgdXN1YWxseQorYSBrZXJuZWwgbWFuYWdlciBoYXZlIGh1Z2UgZmlzY2FsIHJlc3BvbnNpYmlsaXR5ICoqYW55d2F5KiosIGl0J3MgdXN1YWxseQogZmFpcmx5IGVhc3kgdG8gYmFja3RyYWNrLiAgU2luY2UgeW91J3JlIG5vdCBnb2luZyB0byBiZSBhYmxlIHRvIHdhc3RlCiBodWdlIGFtb3VudHMgb2YgbW9uZXkgdGhhdCB5b3UgbWlnaHQgbm90IGJlIGFibGUgdG8gcmVwYXksIHRoZSBvbmx5CiB0aGluZyB5b3UgY2FuIGJhY2t0cmFjayBvbiBpcyBhIHRlY2huaWNhbCBkZWNpc2lvbiwgYW5kIHRoZXJlCkBAIC03NiwxMTMgKzgwLDExOCBAQAogaW5jb21wZXRlbnQgbmluY29tcG9vcCwgc2F5IHlvdSdyZSBzb3JyeSwgYW5kIHVuZG8gYWxsIHRoZSB3b3J0aGxlc3MKIHdvcmsgeW91IGhhZCBwZW9wbGUgd29yayBvbiBmb3IgdGhlIGxhc3QgeWVhci4gIFN1ZGRlbmx5IHRoZSBkZWNpc2lvbgogeW91IG1hZGUgYSB5ZWFyIGFnbyB3YXNuJ3QgYSBiaWcgZGVjaXNpb24gYWZ0ZXIgYWxsLCBzaW5jZSBpdCBjb3VsZCBiZQotZWFzaWx5IHVuZG9uZS4gCitlYXNpbHkgdW5kb25lLgogCiBJdCB0dXJucyBvdXQgdGhhdCBzb21lIHBlb3BsZSBoYXZlIHRyb3VibGUgd2l0aCB0aGlzIGFwcHJvYWNoLCBmb3IgdHdvCiByZWFzb25zOgorCiAgLSBhZG1pdHRpbmcgeW91IHdlcmUgYW4gaWRpb3QgaXMgaGFyZGVyIHRoYW4gaXQgbG9va3MuICBXZSBhbGwgbGlrZSB0bwogICAgbWFpbnRhaW4gYXBwZWFyYW5jZXMsIGFuZCBjb21pbmcgb3V0IGluIHB1YmxpYyB0byBzYXkgdGhhdCB5b3Ugd2VyZQotICAgd3JvbmcgaXMgc29tZXRpbWVzIHZlcnkgaGFyZCBpbmRlZWQuIAorICAgd3JvbmcgaXMgc29tZXRpbWVzIHZlcnkgaGFyZCBpbmRlZWQuCiAgLSBoYXZpbmcgc29tZWJvZHkgdGVsbCB5b3UgdGhhdCB3aGF0IHlvdSB3b3JrZWQgb24gZm9yIHRoZSBsYXN0IHllYXIKICAgIHdhc24ndCB3b3J0aHdoaWxlIGFmdGVyIGFsbCBjYW4gYmUgaGFyZCBvbiB0aGUgcG9vciBsb3dseSBlbmdpbmVlcnMKLSAgIHRvbywgYW5kIHdoaWxlIHRoZSBhY3R1YWwgX3dvcmtfIHdhcyBlYXN5IGVub3VnaCB0byB1bmRvIGJ5IGp1c3QKKyAgIHRvbywgYW5kIHdoaWxlIHRoZSBhY3R1YWwgKip3b3JrKiogd2FzIGVhc3kgZW5vdWdoIHRvIHVuZG8gYnkganVzdAogICAgZGVsZXRpbmcgaXQsIHlvdSBtYXkgaGF2ZSBpcnJldm9jYWJseSBsb3N0IHRoZSB0cnVzdCBvZiB0aGF0CiAgICBlbmdpbmVlci4gIEFuZCByZW1lbWJlcjogImlycmV2b2NhYmxlIiB3YXMgd2hhdCB3ZSB0cmllZCB0byBhdm9pZCBpbgogICAgdGhlIGZpcnN0IHBsYWNlLCBhbmQgeW91ciBkZWNpc2lvbiBlbmRlZCB1cCBiZWluZyBhIGJpZyBvbmUgYWZ0ZXIKLSAgIGFsbC4gCisgICBhbGwuCiAKIEhhcHBpbHksIGJvdGggb2YgdGhlc2UgcmVhc29ucyBjYW4gYmUgbWl0aWdhdGVkIGVmZmVjdGl2ZWx5IGJ5IGp1c3QKIGFkbWl0dGluZyB1cC1mcm9udCB0aGF0IHlvdSBkb24ndCBoYXZlIGEgZnJpZ2dpbicgY2x1ZSwgYW5kIHRlbGxpbmcKIHBlb3BsZSBhaGVhZCBvZiB0aGUgZmFjdCB0aGF0IHlvdXIgZGVjaXNpb24gaXMgcHVyZWx5IHByZWxpbWluYXJ5LCBhbmQKIG1pZ2h0IGJlIHRoZSB3cm9uZyB0aGluZy4gIFlvdSBzaG91bGQgYWx3YXlzIHJlc2VydmUgdGhlIHJpZ2h0IHRvIGNoYW5nZQoteW91ciBtaW5kLCBhbmQgbWFrZSBwZW9wbGUgdmVyeSBfYXdhcmVfIG9mIHRoYXQuICBBbmQgaXQncyBtdWNoIGVhc2llcgotdG8gYWRtaXQgdGhhdCB5b3UgYXJlIHN0dXBpZCB3aGVuIHlvdSBoYXZlbid0IF95ZXRfIGRvbmUgdGhlIHJlYWxseQoreW91ciBtaW5kLCBhbmQgbWFrZSBwZW9wbGUgdmVyeSAqKmF3YXJlKiogb2YgdGhhdC4gIEFuZCBpdCdzIG11Y2ggZWFzaWVyCit0byBhZG1pdCB0aGF0IHlvdSBhcmUgc3R1cGlkIHdoZW4geW91IGhhdmVuJ3QgKip5ZXQqKiBkb25lIHRoZSByZWFsbHkKIHN0dXBpZCB0aGluZy4KIAogVGhlbiwgd2hlbiBpdCByZWFsbHkgZG9lcyB0dXJuIG91dCB0byBiZSBzdHVwaWQsIHBlb3BsZSBqdXN0IHJvbGwgdGhlaXIKLWV5ZXMgYW5kIHNheSAiT29wcywgaGUgZGlkIGl0IGFnYWluIi4gIAorZXllcyBhbmQgc2F5ICJPb3BzLCBoZSBkaWQgaXQgYWdhaW4iLgogCiBUaGlzIHByZWVtcHRpdmUgYWRtaXNzaW9uIG9mIGluY29tcGV0ZW5jZSBtaWdodCBhbHNvIG1ha2UgdGhlIHBlb3BsZSB3aG8KIGFjdHVhbGx5IGRvIHRoZSB3b3JrIGFsc28gdGhpbmsgdHdpY2UgYWJvdXQgd2hldGhlciBpdCdzIHdvcnRoIGRvaW5nIG9yCi1ub3QuICBBZnRlciBhbGwsIGlmIF90aGV5XyBhcmVuJ3QgY2VydGFpbiB3aGV0aGVyIGl0J3MgYSBnb29kIGlkZWEsIHlvdQorbm90LiAgQWZ0ZXIgYWxsLCBpZiAqKnRoZXkqKiBhcmVuJ3QgY2VydGFpbiB3aGV0aGVyIGl0J3MgYSBnb29kIGlkZWEsIHlvdQogc3VyZSBhcyBoZWxsIHNob3VsZG4ndCBlbmNvdXJhZ2UgdGhlbSBieSBwcm9taXNpbmcgdGhlbSB0aGF0IHdoYXQgdGhleQogd29yayBvbiB3aWxsIGJlIGluY2x1ZGVkLiAgTWFrZSB0aGVtIGF0IGxlYXN0IHRoaW5rIHR3aWNlIGJlZm9yZSB0aGV5Ci1lbWJhcmsgb24gYSBiaWcgZW5kZWF2b3IuIAorZW1iYXJrIG9uIGEgYmlnIGVuZGVhdm9yLgogCiBSZW1lbWJlcjogdGhleSdkIGJldHRlciBrbm93IG1vcmUgYWJvdXQgdGhlIGRldGFpbHMgdGhhbiB5b3UgZG8sIGFuZAogdGhleSB1c3VhbGx5IGFscmVhZHkgdGhpbmsgdGhleSBoYXZlIHRoZSBhbnN3ZXIgdG8gZXZlcnl0aGluZy4gIFRoZSBiZXN0CiB0aGluZyB5b3UgY2FuIGRvIGFzIGEgbWFuYWdlciBpcyBub3QgdG8gaW5zdGlsbCBjb25maWRlbmNlLCBidXQgcmF0aGVyIGEKLWhlYWx0aHkgZG9zZSBvZiBjcml0aWNhbCB0aGlua2luZyBvbiB3aGF0IHRoZXkgZG8uIAoraGVhbHRoeSBkb3NlIG9mIGNyaXRpY2FsIHRoaW5raW5nIG9uIHdoYXQgdGhleSBkby4KIAogQnR3LCBhbm90aGVyIHdheSB0byBhdm9pZCBhIGRlY2lzaW9uIGlzIHRvIHBsYWludGl2ZWx5IGp1c3Qgd2hpbmUgImNhbid0CiB3ZSBqdXN0IGRvIGJvdGg/IiBhbmQgbG9vayBwaXRpZnVsLiAgVHJ1c3QgbWUsIGl0IHdvcmtzLiAgSWYgaXQncyBub3QKIGNsZWFyIHdoaWNoIGFwcHJvYWNoIGlzIGJldHRlciwgdGhleSdsbCBldmVudHVhbGx5IGZpZ3VyZSBpdCBvdXQuICBUaGUKIGFuc3dlciBtYXkgZW5kIHVwIGJlaW5nIHRoYXQgYm90aCB0ZWFtcyBnZXQgc28gZnJ1c3RyYXRlZCBieSB0aGUKLXNpdHVhdGlvbiB0aGF0IHRoZXkganVzdCBnaXZlIHVwLiAKK3NpdHVhdGlvbiB0aGF0IHRoZXkganVzdCBnaXZlIHVwLgogCiBUaGF0IG1heSBzb3VuZCBsaWtlIGEgZmFpbHVyZSwgYnV0IGl0J3MgdXN1YWxseSBhIHNpZ24gdGhhdCB0aGVyZSB3YXMKIHNvbWV0aGluZyB3cm9uZyB3aXRoIGJvdGggcHJvamVjdHMsIGFuZCB0aGUgcmVhc29uIHRoZSBwZW9wbGUgaW52b2x2ZWQKIGNvdWxkbid0IGRlY2lkZSB3YXMgdGhhdCB0aGV5IHdlcmUgYm90aCB3cm9uZy4gIFlvdSBlbmQgdXAgY29taW5nIHVwCiBzbWVsbGluZyBsaWtlIHJvc2VzLCBhbmQgeW91IGF2b2lkZWQgeWV0IGFub3RoZXIgZGVjaXNpb24gdGhhdCB5b3UgY291bGQKLWhhdmUgc2NyZXdlZCB1cCBvbi4gCitoYXZlIHNjcmV3ZWQgdXAgb24uCiAKIAotCQlDaGFwdGVyIDI6IFBlb3BsZQorMikgUGVvcGxlCistLS0tLS0tLS0KIAogTW9zdCBwZW9wbGUgYXJlIGlkaW90cywgYW5kIGJlaW5nIGEgbWFuYWdlciBtZWFucyB5b3UnbGwgaGF2ZSB0byBkZWFsCi13aXRoIGl0LCBhbmQgcGVyaGFwcyBtb3JlIGltcG9ydGFudGx5LCB0aGF0IF90aGV5XyBoYXZlIHRvIGRlYWwgd2l0aAotX3lvdV8uIAord2l0aCBpdCwgYW5kIHBlcmhhcHMgbW9yZSBpbXBvcnRhbnRseSwgdGhhdCAqKnRoZXkqKiBoYXZlIHRvIGRlYWwgd2l0aAorKip5b3UqKi4KIAogSXQgdHVybnMgb3V0IHRoYXQgd2hpbGUgaXQncyBlYXN5IHRvIHVuZG8gdGVjaG5pY2FsIG1pc3Rha2VzLCBpdCdzIG5vdAogYXMgZWFzeSB0byB1bmRvIHBlcnNvbmFsaXR5IGRpc29yZGVycy4gIFlvdSBqdXN0IGhhdmUgdG8gbGl2ZSB3aXRoCi10aGVpcnMgLSBhbmQgeW91cnMuIAordGhlaXJzIC0gYW5kIHlvdXJzLgogCiBIb3dldmVyLCBpbiBvcmRlciB0byBwcmVwYXJlIHlvdXJzZWxmIGFzIGEga2VybmVsIG1hbmFnZXIsIGl0J3MgYmVzdCB0bwogcmVtZW1iZXIgbm90IHRvIGJ1cm4gYW55IGJyaWRnZXMsIGJvbWIgYW55IGlubm9jZW50IHZpbGxhZ2Vycywgb3IKIGFsaWVuYXRlIHRvbyBtYW55IGtlcm5lbCBkZXZlbG9wZXJzLiBJdCB0dXJucyBvdXQgdGhhdCBhbGllbmF0aW5nIHBlb3BsZQogaXMgZmFpcmx5IGVhc3ksIGFuZCB1bi1hbGllbmF0aW5nIHRoZW0gaXMgaGFyZC4gVGh1cyAiYWxpZW5hdGluZyIKIGltbWVkaWF0ZWx5IGZhbGxzIHVuZGVyIHRoZSBoZWFkaW5nIG9mICJub3QgcmV2ZXJzaWJsZSIsIGFuZCBiZWNvbWVzIGEKLW5vLW5vIGFjY29yZGluZyB0byBDaGFwdGVyIDEuCituby1ubyBhY2NvcmRpbmcgdG8gOnJlZjpgZGVjaXNpb25zYC4KIAogVGhlcmUncyBqdXN0IGEgZmV3IHNpbXBsZSBydWxlcyBoZXJlOgorCiAgKDEpIGRvbid0IGNhbGwgcGVvcGxlIGQqY2toZWFkcyAoYXQgbGVhc3Qgbm90IGluIHB1YmxpYykKICAoMikgbGVhcm4gaG93IHRvIGFwb2xvZ2l6ZSB3aGVuIHlvdSBmb3Jnb3QgcnVsZSAoMSkKIAogVGhlIHByb2JsZW0gd2l0aCAjMSBpcyB0aGF0IGl0J3MgdmVyeSBlYXN5IHRvIGRvLCBzaW5jZSB5b3UgY2FuIHNheQotInlvdSdyZSBhIGQqY2toZWFkIiBpbiBtaWxsaW9ucyBvZiBkaWZmZXJlbnQgd2F5cyAoKiksIHNvbWV0aW1lcyB3aXRob3V0CisieW91J3JlIGEgZCpja2hlYWQiIGluIG1pbGxpb25zIG9mIGRpZmZlcmVudCB3YXlzIFsjZjJdXywgc29tZXRpbWVzIHdpdGhvdXQKIGV2ZW4gcmVhbGl6aW5nIGl0LCBhbmQgYWxtb3N0IGFsd2F5cyB3aXRoIGEgd2hpdGUtaG90IGNvbnZpY3Rpb24gdGhhdAoteW91IGFyZSByaWdodC4gCit5b3UgYXJlIHJpZ2h0LgogCiBBbmQgdGhlIG1vcmUgY29udmluY2VkIHlvdSBhcmUgdGhhdCB5b3UgYXJlIHJpZ2h0IChhbmQgbGV0J3MgZmFjZSBpdCwKLXlvdSBjYW4gY2FsbCBqdXN0IGFib3V0IF9hbnlib2R5XyBhIGQqY2toZWFkLCBhbmQgeW91IG9mdGVuIF93aWxsXyBiZQotcmlnaHQpLCB0aGUgaGFyZGVyIGl0IGVuZHMgdXAgYmVpbmcgdG8gYXBvbG9naXplIGFmdGVyd2FyZHMuIAoreW91IGNhbiBjYWxsIGp1c3QgYWJvdXQgKiphbnlib2R5KiogYSBkKmNraGVhZCwgYW5kIHlvdSBvZnRlbiAqKndpbGwqKiBiZQorcmlnaHQpLCB0aGUgaGFyZGVyIGl0IGVuZHMgdXAgYmVpbmcgdG8gYXBvbG9naXplIGFmdGVyd2FyZHMuCiAKIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSwgeW91IHJlYWxseSBvbmx5IGhhdmUgdHdvIG9wdGlvbnM6CisKICAtIGdldCByZWFsbHkgZ29vZCBhdCBhcG9sb2dpZXMKICAtIHNwcmVhZCB0aGUgImxvdmUiIG91dCBzbyBldmVubHkgdGhhdCBub2JvZHkgcmVhbGx5IGVuZHMgdXAgZmVlbGluZwogICAgbGlrZSB0aGV5IGdldCB1bmZhaXJseSB0YXJnZXRlZC4gIE1ha2UgaXQgaW52ZW50aXZlIGVub3VnaCwgYW5kIHRoZXkKLSAgIG1pZ2h0IGV2ZW4gYmUgYW11c2VkLiAKKyAgIG1pZ2h0IGV2ZW4gYmUgYW11c2VkLgogCiBUaGUgb3B0aW9uIG9mIGJlaW5nIHVuZmFpbGluZ2x5IHBvbGl0ZSByZWFsbHkgZG9lc24ndCBleGlzdC4gTm9ib2R5IHdpbGwKIHRydXN0IHNvbWVib2R5IHdobyBpcyBzbyBjbGVhcmx5IGhpZGluZyBoaXMgdHJ1ZSBjaGFyYWN0ZXIuCiAKLSgqKSBQYXVsIFNpbW9uIHNhbmcgIkZpZnR5IFdheXMgdG8gTGVhdmUgWW91ciBMb3ZlciIsIGJlY2F1c2UgcXVpdGUKLWZyYW5rbHksICJBIE1pbGxpb24gV2F5cyB0byBUZWxsIGEgRGV2ZWxvcGVyIEhlIElzIGEgRCpja2hlYWQiIGRvZXNuJ3QKLXNjYW4gbmVhcmx5IGFzIHdlbGwuICBCdXQgSSdtIHN1cmUgaGUgdGhvdWdodCBhYm91dCBpdC4gCisuLiBbI2YyXSBQYXVsIFNpbW9uIHNhbmcgIkZpZnR5IFdheXMgdG8gTGVhdmUgWW91ciBMb3ZlciIsIGJlY2F1c2UgcXVpdGUKKyAgZnJhbmtseSwgIkEgTWlsbGlvbiBXYXlzIHRvIFRlbGwgYSBEZXZlbG9wZXIgSGUgSXMgYSBEKmNraGVhZCIgZG9lc24ndAorICBzY2FuIG5lYXJseSBhcyB3ZWxsLiAgQnV0IEknbSBzdXJlIGhlIHRob3VnaHQgYWJvdXQgaXQuCiAKIAotCQlDaGFwdGVyIDM6IFBlb3BsZSBJSSAtIHRoZSBHb29kIEtpbmQKKzMpIFBlb3BsZSBJSSAtIHRoZSBHb29kIEtpbmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogV2hpbGUgaXQgdHVybnMgb3V0IHRoYXQgbW9zdCBwZW9wbGUgYXJlIGlkaW90cywgdGhlIGNvcm9sbGFyeSB0byB0aGF0IGlzCiBzYWRseSB0aGF0IHlvdSBhcmUgb25lIHRvbywgYW5kIHRoYXQgd2hpbGUgd2UgY2FuIGFsbCBiYXNrIGluIHRoZSBzZWN1cmUKIGtub3dsZWRnZSB0aGF0IHdlJ3JlIGJldHRlciB0aGFuIHRoZSBhdmVyYWdlIHBlcnNvbiAobGV0J3MgZmFjZSBpdCwKIG5vYm9keSBldmVyIGJlbGlldmVzIHRoYXQgdGhleSdyZSBhdmVyYWdlIG9yIGJlbG93LWF2ZXJhZ2UpLCB3ZSBzaG91bGQKIGFsc28gYWRtaXQgdGhhdCB3ZSdyZSBub3QgdGhlIHNoYXJwZXN0IGtuaWZlIGFyb3VuZCwgYW5kIHRoZXJlIHdpbGwgYmUKLW90aGVyIHBlb3BsZSB0aGF0IGFyZSBsZXNzIG9mIGFuIGlkaW90IHRoYW4geW91IGFyZS4gCitvdGhlciBwZW9wbGUgdGhhdCBhcmUgbGVzcyBvZiBhbiBpZGlvdCB0aGFuIHlvdSBhcmUuCiAKLVNvbWUgcGVvcGxlIHJlYWN0IGJhZGx5IHRvIHNtYXJ0IHBlb3BsZS4gIE90aGVycyB0YWtlIGFkdmFudGFnZSBvZiB0aGVtLiAKK1NvbWUgcGVvcGxlIHJlYWN0IGJhZGx5IHRvIHNtYXJ0IHBlb3BsZS4gIE90aGVycyB0YWtlIGFkdmFudGFnZSBvZiB0aGVtLgogCi1NYWtlIHN1cmUgdGhhdCB5b3UsIGFzIGEga2VybmVsIG1haW50YWluZXIsIGFyZSBpbiB0aGUgc2Vjb25kIGdyb3VwLiAKK01ha2Ugc3VyZSB0aGF0IHlvdSwgYXMgYSBrZXJuZWwgbWFpbnRhaW5lciwgYXJlIGluIHRoZSBzZWNvbmQgZ3JvdXAuCiBTdWNrIHVwIHRvIHRoZW0sIGJlY2F1c2UgdGhleSBhcmUgdGhlIHBlb3BsZSB3aG8gd2lsbCBtYWtlIHlvdXIgam9iCiBlYXNpZXIuIEluIHBhcnRpY3VsYXIsIHRoZXknbGwgYmUgYWJsZSB0byBtYWtlIHlvdXIgZGVjaXNpb25zIGZvciB5b3UsCiB3aGljaCBpcyB3aGF0IHRoZSBnYW1lIGlzIGFsbCBhYm91dC4KQEAgLTE5MSw3ICsyMDAsNyBAQAogbWFuYWdlbWVudCByZXNwb25zaWJpbGl0aWVzIGxhcmdlbHkgYmVjb21lIG9uZXMgb2Ygc2F5aW5nICJTb3VuZHMgbGlrZSBhCiBnb29kIGlkZWEgLSBnbyB3aWxkIiwgb3IgIlRoYXQgc291bmRzIGdvb2QsIGJ1dCB3aGF0IGFib3V0IHh4eD8iLiAgVGhlCiBzZWNvbmQgdmVyc2lvbiBpbiBwYXJ0aWN1bGFyIGlzIGEgZ3JlYXQgd2F5IHRvIGVpdGhlciBsZWFybiBzb21ldGhpbmcKLW5ldyBhYm91dCAieHh4IiBvciBzZWVtIF9leHRyYV8gbWFuYWdlcmlhbCBieSBwb2ludGluZyBvdXQgc29tZXRoaW5nIHRoZQorbmV3IGFib3V0ICJ4eHgiIG9yIHNlZW0gKipleHRyYSoqIG1hbmFnZXJpYWwgYnkgcG9pbnRpbmcgb3V0IHNvbWV0aGluZyB0aGUKIHNtYXJ0ZXIgcGVyc29uIGhhZG4ndCB0aG91Z2h0IGFib3V0LiAgSW4gZWl0aGVyIGNhc2UsIHlvdSB3aW4uCiAKIE9uZSB0aGluZyB0byBsb29rIG91dCBmb3IgaXMgdG8gcmVhbGl6ZSB0aGF0IGdyZWF0bmVzcyBpbiBvbmUgYXJlYSBkb2VzCkBAIC0xOTksNDcgKzIwOCw0OSBAQAogc3BlY2lmaWMgZGlyZWN0aW9ucywgYnV0IGxldCdzIGZhY2UgaXQsIHRoZXkgbWlnaHQgYmUgZ29vZCBhdCB3aGF0IHRoZXkKIGRvLCBhbmQgc3VjayBhdCBldmVyeXRoaW5nIGVsc2UuICBUaGUgZ29vZCBuZXdzIGlzIHRoYXQgcGVvcGxlIHRlbmQgdG8KIG5hdHVyYWxseSBncmF2aXRhdGUgYmFjayB0byB3aGF0IHRoZXkgYXJlIGdvb2QgYXQsIHNvIGl0J3Mgbm90IGxpa2UgeW91Ci1hcmUgZG9pbmcgc29tZXRoaW5nIGlycmV2ZXJzaWJsZSB3aGVuIHlvdSBfZG9fIHByb2QgdGhlbSBpbiBzb21lCithcmUgZG9pbmcgc29tZXRoaW5nIGlycmV2ZXJzaWJsZSB3aGVuIHlvdSAqKmRvKiogcHJvZCB0aGVtIGluIHNvbWUKIGRpcmVjdGlvbiwganVzdCBkb24ndCBwdXNoIHRvbyBoYXJkLgogCiAKLQkJQ2hhcHRlciA0OiBQbGFjaW5nIGJsYW1lCis0KSBQbGFjaW5nIGJsYW1lCistLS0tLS0tLS0tLS0tLS0tCiAKIFRoaW5ncyB3aWxsIGdvIHdyb25nLCBhbmQgcGVvcGxlIHdhbnQgc29tZWJvZHkgdG8gYmxhbWUuIFRhZywgeW91J3JlIGl0LgogCiBJdCdzIG5vdCBhY3R1YWxseSB0aGF0IGhhcmQgdG8gYWNjZXB0IHRoZSBibGFtZSwgZXNwZWNpYWxseSBpZiBwZW9wbGUKLWtpbmQgb2YgcmVhbGl6ZSB0aGF0IGl0IHdhc24ndCBfYWxsXyB5b3VyIGZhdWx0LiAgV2hpY2ggYnJpbmdzIHVzIHRvIHRoZQora2luZCBvZiByZWFsaXplIHRoYXQgaXQgd2Fzbid0ICoqYWxsKiogeW91ciBmYXVsdC4gIFdoaWNoIGJyaW5ncyB1cyB0byB0aGUKIGJlc3Qgd2F5IG9mIHRha2luZyB0aGUgYmxhbWU6IGRvIGl0IGZvciBhbm90aGVyIGd1eS4gWW91J2xsIGZlZWwgZ29vZAogZm9yIHRha2luZyB0aGUgZmFsbCwgaGUnbGwgZmVlbCBnb29kIGFib3V0IG5vdCBnZXR0aW5nIGJsYW1lZCwgYW5kIHRoZQogZ3V5IHdobyBsb3N0IGhpcyB3aG9sZSAzNkdCIHBvcm4tY29sbGVjdGlvbiBiZWNhdXNlIG9mIHlvdXIgaW5jb21wZXRlbmNlCiB3aWxsIGdydWRnaW5nbHkgYWRtaXQgdGhhdCB5b3UgYXQgbGVhc3QgZGlkbid0IHRyeSB0byB3ZWFzZWwgb3V0IG9mIGl0LgogCiBUaGVuIG1ha2UgdGhlIGRldmVsb3BlciB3aG8gcmVhbGx5IHNjcmV3ZWQgdXAgKGlmIHlvdSBjYW4gZmluZCBoaW0pIGtub3cKLV9pbl9wcml2YXRlXyB0aGF0IGhlIHNjcmV3ZWQgdXAuICBOb3QganVzdCBzbyBoZSBjYW4gYXZvaWQgaXQgaW4gdGhlCisqKmluX3ByaXZhdGUqKiB0aGF0IGhlIHNjcmV3ZWQgdXAuICBOb3QganVzdCBzbyBoZSBjYW4gYXZvaWQgaXQgaW4gdGhlCiBmdXR1cmUsIGJ1dCBzbyB0aGF0IGhlIGtub3dzIGhlIG93ZXMgeW91IG9uZS4gIEFuZCwgcGVyaGFwcyBldmVuIG1vcmUKIGltcG9ydGFudGx5LCBoZSdzIGFsc28gbGlrZWx5IHRoZSBwZXJzb24gd2hvIGNhbiBmaXggaXQuICBCZWNhdXNlLCBsZXQncwotZmFjZSBpdCwgaXQgc3VyZSBhaW4ndCB5b3UuIAorZmFjZSBpdCwgaXQgc3VyZSBhaW4ndCB5b3UuCiAKLVRha2luZyB0aGUgYmxhbWUgaXMgYWxzbyB3aHkgeW91IGdldCB0byBiZSBtYW5hZ2VyIGluIHRoZSBmaXJzdCBwbGFjZS4gCitUYWtpbmcgdGhlIGJsYW1lIGlzIGFsc28gd2h5IHlvdSBnZXQgdG8gYmUgbWFuYWdlciBpbiB0aGUgZmlyc3QgcGxhY2UuCiBJdCdzIHBhcnQgb2Ygd2hhdCBtYWtlcyBwZW9wbGUgdHJ1c3QgeW91LCBhbmQgYWxsb3cgeW91IHRoZSBwb3RlbnRpYWwKIGdsb3J5LCBiZWNhdXNlIHlvdSdyZSB0aGUgb25lIHdobyBnZXRzIHRvIHNheSAiSSBzY3Jld2VkIHVwIi4gIEFuZCBpZgogeW91J3ZlIGZvbGxvd2VkIHRoZSBwcmV2aW91cyBydWxlcywgeW91J2xsIGJlIHByZXR0eSBnb29kIGF0IHNheWluZyB0aGF0Ci1ieSBub3cuIAorYnkgbm93LgogCiAKLQkJQ2hhcHRlciA1OiBUaGluZ3MgdG8gYXZvaWQKKzUpIFRoaW5ncyB0byBhdm9pZAorLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoZXJlJ3Mgb25lIHRoaW5nIHBlb3BsZSBoYXRlIGV2ZW4gbW9yZSB0aGFuIGJlaW5nIGNhbGxlZCAiZCpja2hlYWQiLAogYW5kIHRoYXQgaXMgYmVpbmcgY2FsbGVkIGEgImQqY2toZWFkIiBpbiBhIHNhbmN0aW1vbmlvdXMgdm9pY2UuICBUaGUKIGZpcnN0IHlvdSBjYW4gYXBvbG9naXplIGZvciwgdGhlIHNlY29uZCBvbmUgeW91IHdvbid0IHJlYWxseSBnZXQgdGhlCiBjaGFuY2UuICBUaGV5IGxpa2VseSB3aWxsIG5vIGxvbmdlciBiZSBsaXN0ZW5pbmcgZXZlbiBpZiB5b3Ugb3RoZXJ3aXNlCi1kbyBhIGdvb2Qgam9iLiAKK2RvIGEgZ29vZCBqb2IuCiAKIFdlIGFsbCB0aGluayB3ZSdyZSBiZXR0ZXIgdGhhbiBhbnlib2R5IGVsc2UsIHdoaWNoIG1lYW5zIHRoYXQgd2hlbgotc29tZWJvZHkgZWxzZSBwdXRzIG9uIGFpcnMsIGl0IF9yZWFsbHlfIHJ1YnMgdXMgdGhlIHdyb25nIHdheS4gIFlvdSBtYXkKK3NvbWVib2R5IGVsc2UgcHV0cyBvbiBhaXJzLCBpdCAqKnJlYWxseSoqIHJ1YnMgdXMgdGhlIHdyb25nIHdheS4gIFlvdSBtYXkKIGJlIG1vcmFsbHkgYW5kIGludGVsbGVjdHVhbGx5IHN1cGVyaW9yIHRvIGV2ZXJ5Ym9keSBhcm91bmQgeW91LCBidXQKLWRvbid0IHRyeSB0byBtYWtlIGl0IHRvbyBvYnZpb3VzIHVubGVzcyB5b3UgcmVhbGx5IF9pbnRlbmRfIHRvIGlycml0YXRlCi1zb21lYm9keSAoKikuIAorZG9uJ3QgdHJ5IHRvIG1ha2UgaXQgdG9vIG9idmlvdXMgdW5sZXNzIHlvdSByZWFsbHkgKippbnRlbmQqKiB0byBpcnJpdGF0ZQorc29tZWJvZHkgWyNmM11fLgogCiBTaW1pbGFybHksIGRvbid0IGJlIHRvbyBwb2xpdGUgb3Igc3VidGxlIGFib3V0IHRoaW5ncy4gUG9saXRlbmVzcyBlYXNpbHkKIGVuZHMgdXAgZ29pbmcgb3ZlcmJvYXJkIGFuZCBoaWRpbmcgdGhlIHByb2JsZW0sIGFuZCBhcyB0aGV5IHNheSwgIk9uIHRoZQpAQCAtMjUxLDE1ICsyNjIsMTYgQEAKIG92ZXJib2FyZCB0byB0aGUgcG9pbnQgb2YgYmVpbmcgcmlkaWN1bG91cyBjYW4gZHJpdmUgYSBwb2ludCBob21lCiB3aXRob3V0IG1ha2luZyBpdCBwYWluZnVsIHRvIHRoZSByZWNpcGllbnQsIHdobyBqdXN0IHRoaW5rcyB5b3UncmUgYmVpbmcKIHNpbGx5LiAgSXQgY2FuIHRodXMgaGVscCBnZXQgdGhyb3VnaCB0aGUgcGVyc29uYWwgbWVudGFsIGJsb2NrIHdlIGFsbAotaGF2ZSBhYm91dCBjcml0aWNpc20uIAoraGF2ZSBhYm91dCBjcml0aWNpc20uCiAKLSgqKSBIaW50OiBpbnRlcm5ldCBuZXdzZ3JvdXBzIHRoYXQgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIHlvdXIgd29yawotYXJlIGdyZWF0IHdheXMgdG8gdGFrZSBvdXQgeW91ciBmcnVzdHJhdGlvbnMgYXQgb3RoZXIgcGVvcGxlLiBXcml0ZQotaW5zdWx0aW5nIHBvc3RzIHdpdGggYSBzbmVlciBqdXN0IHRvIGdldCBpbnRvIGEgZ29vZCBmbGFtZSBldmVyeSBvbmNlIGluCi1hIHdoaWxlLCBhbmQgeW91J2xsIGZlZWwgY2xlYW5zZWQuIEp1c3QgZG9uJ3QgY3JhcCB0b28gY2xvc2UgdG8gaG9tZS4KKy4uIFsjZjNdIEhpbnQ6IGludGVybmV0IG5ld3Nncm91cHMgdGhhdCBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8geW91ciB3b3JrCisgIGFyZSBncmVhdCB3YXlzIHRvIHRha2Ugb3V0IHlvdXIgZnJ1c3RyYXRpb25zIGF0IG90aGVyIHBlb3BsZS4gV3JpdGUKKyAgaW5zdWx0aW5nIHBvc3RzIHdpdGggYSBzbmVlciBqdXN0IHRvIGdldCBpbnRvIGEgZ29vZCBmbGFtZSBldmVyeSBvbmNlIGluCisgIGEgd2hpbGUsIGFuZCB5b3UnbGwgZmVlbCBjbGVhbnNlZC4gSnVzdCBkb24ndCBjcmFwIHRvbyBjbG9zZSB0byBob21lLgogCiAKLQkJQ2hhcHRlciA2OiBXaHkgbWU/Cis2KSBXaHkgbWU/CistLS0tLS0tLS0tCiAKIFNpbmNlIHlvdXIgbWFpbiByZXNwb25zaWJpbGl0eSBzZWVtcyB0byBiZSB0byB0YWtlIHRoZSBibGFtZSBmb3Igb3RoZXIKIHBlb3BsZXMgbWlzdGFrZXMsIGFuZCBtYWtlIGl0IHBhaW5mdWxseSBvYnZpb3VzIHRvIGV2ZXJ5Ym9keSBlbHNlIHRoYXQKQEAgLTI2OCw5ICsyODAsOSBAQAogCiBGaXJzdCBvZmYsIHdoaWxlIHlvdSBtYXkgb3IgbWF5IG5vdCBnZXQgc2NyZWFtaW5nIHRlZW5hZ2UgZ2lybHMgKG9yCiBib3lzLCBsZXQncyBub3QgYmUganVkZ21lbnRhbCBvciBzZXhpc3QgaGVyZSkga25vY2tpbmcgb24geW91ciBkcmVzc2luZwotcm9vbSBkb29yLCB5b3UgX3dpbGxfIGdldCBhbiBpbW1lbnNlIGZlZWxpbmcgb2YgcGVyc29uYWwgYWNjb21wbGlzaG1lbnQKK3Jvb20gZG9vciwgeW91ICoqd2lsbCoqIGdldCBhbiBpbW1lbnNlIGZlZWxpbmcgb2YgcGVyc29uYWwgYWNjb21wbGlzaG1lbnQKIGZvciBiZWluZyAiaW4gY2hhcmdlIi4gIE5ldmVyIG1pbmQgdGhlIGZhY3QgdGhhdCB5b3UncmUgcmVhbGx5IGxlYWRpbmcKIGJ5IHRyeWluZyB0byBrZWVwIHVwIHdpdGggZXZlcnlib2R5IGVsc2UgYW5kIHJ1bm5pbmcgYWZ0ZXIgdGhlbSBhcyBmYXN0Ci1hcyB5b3UgY2FuLiAgRXZlcnlib2R5IHdpbGwgc3RpbGwgdGhpbmsgeW91J3JlIHRoZSBwZXJzb24gaW4gY2hhcmdlLiAKK2FzIHlvdSBjYW4uICBFdmVyeWJvZHkgd2lsbCBzdGlsbCB0aGluayB5b3UncmUgdGhlIHBlcnNvbiBpbiBjaGFyZ2UuCiAKIEl0J3MgYSBncmVhdCBqb2IgaWYgeW91IGNhbiBoYWNrIGl0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9QQ0kvTVNJLUhPV1RPLnR4dCBiL0RvY3VtZW50YXRpb24vUENJL01TSS1IT1dUTy50eHQKaW5kZXggYzU1ZGYyOS4uY2Q5YzlmNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9QQ0kvTVNJLUhPV1RPLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL1BDSS9NU0ktSE9XVE8udHh0CkBAIC05NCwxNCArOTQsMTEgQEAKIG1pbl92ZWNzIGFyZ3VtZW50IHNldCB0byB0aGlzIGxpbWl0LCBhbmQgdGhlIFBDSSBjb3JlIHdpbGwgcmV0dXJuIC1FTk9TUEMKIGlmIGl0IGNhbid0IG1lZXQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHZlY3RvcnMuCiAKLVRoZSBmbGFncyBhcmd1bWVudCBzaG91bGQgbm9ybWFsbHkgYmUgc2V0IHRvIDAsIGJ1dCBjYW4gYmUgdXNlZCB0byBwYXNzIHRoZQotUENJX0lSUV9OT01TSSBhbmQgUENJX0lSUV9OT01TSVggZmxhZyBpbiBjYXNlIGEgZGV2aWNlIGNsYWltcyB0byBzdXBwb3J0Ci1NU0kgb3IgTVNJLVgsIGJ1dCB0aGUgc3VwcG9ydCBpcyBicm9rZW4sIG9yIHRvIHBhc3MgUENJX0lSUV9OT0xFR0FDWSBpbgotY2FzZSB0aGUgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgbGVnYWN5IGludGVycnVwdCBsaW5lcy4KLQotQnkgZGVmYXVsdCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3ByZWFkIHRoZSBpbnRlcnJ1cHRzIGFyb3VuZCB0aGUgYXZhaWxhYmxlCi1DUFVzLCBidXQgdGhpcyBmZWF0dXJlIGNhbiBiZSBkaXNhYmxlZCBieSBwYXNzaW5nIHRoZSBQQ0lfSVJRX05PQUZGSU5JVFkKLWZsYWcuCitUaGUgZmxhZ3MgYXJndW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIHR5cGUgb2YgaW50ZXJydXB0IGNhbiBiZSB1c2VkCitieSB0aGUgZGV2aWNlIGFuZCB0aGUgZHJpdmVyIChQQ0lfSVJRX0xFR0FDWSwgUENJX0lSUV9NU0ksIFBDSV9JUlFfTVNJWCkuCitBIGNvbnZlbmllbnQgc2hvcnQtaGFuZCAoUENJX0lSUV9BTExfVFlQRVMpIGlzIGFsc28gYXZhaWxhYmxlIHRvIGFzayBmb3IKK2FueSBwb3NzaWJsZSBraW5kIG9mIGludGVycnVwdC4gIElmIHRoZSBQQ0lfSVJRX0FGRklOSVRZIGZsYWcgaXMgc2V0LAorcGNpX2FsbG9jX2lycV92ZWN0b3JzKCkgd2lsbCBzcHJlYWQgdGhlIGludGVycnVwdHMgYXJvdW5kIHRoZSBhdmFpbGFibGUgQ1BVcy4KIAogVG8gZ2V0IHRoZSBMaW51eCBJUlEgbnVtYmVycyBwYXNzZWQgdG8gcmVxdWVzdF9pcnEoKSBhbmQgZnJlZV9pcnEoKSBhbmQgdGhlCiB2ZWN0b3JzLCB1c2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKQEAgLTEzMSw3ICsxMjgsNyBAQAogY2FwcGVkIHRvIHRoZSBzdXBwb3J0ZWQgbGltaXQsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcXVlcnkgdGhlIG51bWJlciBvZgogdmVjdG9ycyBzdXBwb3J0ZWQgYmVmb3JlaGFuZDoKIAotCW52ZWMgPSBwY2lfYWxsb2NfaXJxX3ZlY3RvcnMocGRldiwgMSwgbnZlYywgMCk7CisJbnZlYyA9IHBjaV9hbGxvY19pcnFfdmVjdG9ycyhwZGV2LCAxLCBudmVjLCBQQ0lfSVJRX0FMTF9UWVBFUykKIAlpZiAobnZlYyA8IDApCiAJCWdvdG8gb3V0X2VycjsKIApAQCAtMTQwLDcgKzEzNyw3IEBACiBudW1iZXIgdG8gcGNpX2FsbG9jX2lycV92ZWN0b3JzKCkgZnVuY3Rpb24gYXMgYm90aCAnbWluX3ZlY3MnIGFuZAogJ21heF92ZWNzJyBwYXJhbWV0ZXJzOgogCi0JcmV0ID0gcGNpX2FsbG9jX2lycV92ZWN0b3JzKHBkZXYsIG52ZWMsIG52ZWMsIDApOworCXJldCA9IHBjaV9hbGxvY19pcnFfdmVjdG9ycyhwZGV2LCBudmVjLCBudmVjLCBQQ0lfSVJRX0FMTF9UWVBFUyk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X2VycjsKIApAQCAtMTQ4LDE1ICsxNDUsMTQgQEAKIHRoZSBzaW5nbGUgTVNJIG1vZGUgZm9yIGEgZGV2aWNlLiAgSXQgY291bGQgYmUgZG9uZSBieSBwYXNzaW5nIHR3byAxcyBhcwogJ21pbl92ZWNzJyBhbmQgJ21heF92ZWNzJzoKIAotCXJldCA9IHBjaV9hbGxvY19pcnFfdmVjdG9ycyhwZGV2LCAxLCAxLCAwKTsKKwlyZXQgPSBwY2lfYWxsb2NfaXJxX3ZlY3RvcnMocGRldiwgMSwgMSwgUENJX0lSUV9BTExfVFlQRVMpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9lcnI7CiAKIFNvbWUgZGV2aWNlcyBtaWdodCBub3Qgc3VwcG9ydCB1c2luZyBsZWdhY3kgbGluZSBpbnRlcnJ1cHRzLCBpbiB3aGljaCBjYXNlCi10aGUgUENJX0lSUV9OT0xFR0FDWSBmbGFnIGNhbiBiZSB1c2VkIHRvIGZhaWwgdGhlIHJlcXVlc3QgaWYgdGhlIHBsYXRmb3JtCi1jYW4ndCBwcm92aWRlIE1TSSBvciBNU0ktWCBpbnRlcnJ1cHRzOgordGhlIGRyaXZlciBjYW4gc3BlY2lmeSB0aGF0IG9ubHkgTVNJIG9yIE1TSS1YIGlzIGFjY2VwdGFibGU6CiAKLQludmVjID0gcGNpX2FsbG9jX2lycV92ZWN0b3JzKHBkZXYsIDEsIG52ZWMsIFBDSV9JUlFfTk9MRUdBQ1kpOworCW52ZWMgPSBwY2lfYWxsb2NfaXJxX3ZlY3RvcnMocGRldiwgMSwgbnZlYywgUENJX0lSUV9NU0kgfCBQQ0lfSVJRX01TSVgpOwogCWlmIChudmVjIDwgMCkKIAkJZ290byBvdXRfZXJyOwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1BDSS9wY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLnR4dAppbmRleCAxMjM4ODFmLi43N2Y0OWRjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1BDSS9wY2kudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUENJL3BjaS50eHQKQEAgLTEyNCw3ICsxMjQsNiBAQAogCiBUaGUgSUQgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHBjaV9kZXZpY2VfaWQgZW50cmllcyBlbmRpbmcgd2l0aCBhbgogYWxsLXplcm8gZW50cnkuICBEZWZpbml0aW9ucyB3aXRoIHN0YXRpYyBjb25zdCBhcmUgZ2VuZXJhbGx5IHByZWZlcnJlZC4KLVVzZSBvZiB0aGUgZGVwcmVjYXRlZCBtYWNybyBERUZJTkVfUENJX0RFVklDRV9UQUJMRSBzaG91bGQgYmUgYXZvaWRlZC4KIAogRWFjaCBlbnRyeSBjb25zaXN0cyBvZjoKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SQ1UvRGVzaWduL1JlcXVpcmVtZW50cy9SZXF1aXJlbWVudHMuaHRtbCBiL0RvY3VtZW50YXRpb24vUkNVL0Rlc2lnbi9SZXF1aXJlbWVudHMvUmVxdWlyZW1lbnRzLmh0bWwKaW5kZXggZWNlNDEwZi4uYTRkMzgzOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9SQ1UvRGVzaWduL1JlcXVpcmVtZW50cy9SZXF1aXJlbWVudHMuaHRtbAorKysgYi9Eb2N1bWVudGF0aW9uL1JDVS9EZXNpZ24vUmVxdWlyZW1lbnRzL1JlcXVpcmVtZW50cy5odG1sCkBAIC0yNDkzLDYgKzI0OTMsMjggQEAKIHZhcmlhbnQgb2YgPHR0PmNhbGxfcmN1KCk8L3R0PiB0aGF0IG1pZ2h0IG9uZSBkYXkgYmUgY3JlYXRlZCBmb3IKIGVuZXJneS1lZmZpY2llbmN5IHB1cnBvc2VzLgogCis8cD4KK1RoYXQgc2FpZCwgdGhlcmUgYXJlIGxpbWl0cy4KK1JDVSByZXF1aXJlcyB0aGF0IHRoZSA8dHQ+cmN1X2hlYWQ8L3R0PiBzdHJ1Y3R1cmUgYmUgYWxpZ25lZCB0byBhCit0d28tYnl0ZSBib3VuZGFyeSwgYW5kIHBhc3NpbmcgYSBtaXNhbGlnbmVkIDx0dD5yY3VfaGVhZDwvdHQ+CitzdHJ1Y3R1cmUgdG8gb25lIG9mIHRoZSA8dHQ+Y2FsbF9yY3UoKTwvdHQ+IGZhbWlseSBvZiBmdW5jdGlvbnMKK3dpbGwgcmVzdWx0IGluIGEgc3BsYXQuCitJdCBpcyB0aGVyZWZvcmUgbmVjZXNzYXJ5IHRvIGV4ZXJjaXNlIGNhdXRpb24gd2hlbiBwYWNraW5nCitzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgZmllbGRzIG9mIHR5cGUgPHR0PnJjdV9oZWFkPC90dD4uCitXaHkgbm90IGEgZm91ci1ieXRlIG9yIGV2ZW4gZWlnaHQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQ/CitCZWNhdXNlIHRoZSBtNjhrIGFyY2hpdGVjdHVyZSBwcm92aWRlcyBvbmx5IHR3by1ieXRlIGFsaWdubWVudCwKK2FuZCB0aHVzIGFjdHMgYXMgYWxpZ25tZW50J3MgbGVhc3QgY29tbW9uIGRlbm9taW5hdG9yLgorCis8cD4KK1RoZSByZWFzb24gZm9yIHJlc2VydmluZyB0aGUgYm90dG9tIGJpdCBvZiBwb2ludGVycyB0bworPHR0PnJjdV9oZWFkPC90dD4gc3RydWN0dXJlcyBpcyB0byBsZWF2ZSB0aGUgZG9vciBvcGVuIHRvCismbGRxdW87bGF6eSZyZHF1bzsgY2FsbGJhY2tzIHdob3NlIGludm9jYXRpb25zIGNhbiBzYWZlbHkgYmUgZGVmZXJyZWQuCitEZWZlcnJpbmcgaW52b2NhdGlvbiBjb3VsZCBwb3RlbnRpYWxseSBoYXZlIGVuZXJneS1lZmZpY2llbmN5CitiZW5lZml0cywgYnV0IG9ubHkgaWYgdGhlIHJhdGUgb2Ygbm9uLWxhenkgY2FsbGJhY2tzIGRlY3JlYXNlcworc2lnbmlmaWNhbnRseSBmb3Igc29tZSBpbXBvcnRhbnQgd29ya2xvYWQuCitJbiB0aGUgbWVhbnRpbWUsIHJlc2VydmluZyB0aGUgYm90dG9tIGJpdCBrZWVwcyB0aGlzIG9wdGlvbiBvcGVuCitpbiBjYXNlIGl0IG9uZSBkYXkgYmVjb21lcyB1c2VmdWwuCisKIDxoMz48YSBuYW1lPSJQZXJmb3JtYW5jZSwgU2NhbGFiaWxpdHksIFJlc3BvbnNlIFRpbWUsIGFuZCBSZWxpYWJpbGl0eSI+CiBQZXJmb3JtYW5jZSwgU2NhbGFiaWxpdHksIFJlc3BvbnNlIFRpbWUsIGFuZCBSZWxpYWJpbGl0eTwvYT48L2gzPgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS90b3J0dXJlLnR4dCBiL0RvY3VtZW50YXRpb24vUkNVL3RvcnR1cmUudHh0CmluZGV4IDExOGU3YzEuLjI3OGY2YTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vUkNVL3RvcnR1cmUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL3RvcnR1cmUudHh0CkBAIC0xMCwyMSArMTAsNiBAQAogY29tbWFuZCAocGVyaGFwcyBncmVwcGluZyBmb3IgInRvcnR1cmUiKS4gIFRoZSB0ZXN0IGlzIHN0YXJ0ZWQKIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQsIGFuZCBzdG9wcyB3aGVuIHRoZSBtb2R1bGUgaXMgdW5sb2FkZWQuCiAKLUNPTkZJR19SQ1VfVE9SVFVSRV9URVNUX1JVTk5BQkxFCi0KLUl0IGlzIGFsc28gcG9zc2libGUgdG8gc3BlY2lmeSBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVD15LCB3aGljaCB3aWxsCi1yZXN1bHQgaW4gdGhlIHRlc3RzIGJlaW5nIGxvYWRlZCBpbnRvIHRoZSBiYXNlIGtlcm5lbC4gIEluIHRoaXMgY2FzZSwKLXRoZSBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVF9SVU5OQUJMRSBjb25maWcgb3B0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeQotd2hldGhlciB0aGUgUkNVIHRvcnR1cmUgdGVzdHMgYXJlIHRvIGJlIHN0YXJ0ZWQgaW1tZWRpYXRlbHkgZHVyaW5nCi1ib290IG9yIHdoZXRoZXIgdGhlIC9wcm9jL3N5cy9rZXJuZWwvcmN1dG9ydHVyZV9ydW5uYWJsZSBmaWxlIGlzIHVzZWQKLXRvIGVuYWJsZSB0aGVtLiAgVGhpcyAvcHJvYyBmaWxlIGNhbiBiZSB1c2VkIHRvIHJlcGVhdGVkbHkgcGF1c2UgYW5kCi1yZXN0YXJ0IHRoZSB0ZXN0cywgcmVnYXJkbGVzcyBvZiB0aGUgaW5pdGlhbCBzdGF0ZSBzcGVjaWZpZWQgYnkgdGhlCi1DT05GSUdfUkNVX1RPUlRVUkVfVEVTVF9SVU5OQUJMRSBjb25maWcgb3B0aW9uLgotCi1Zb3Ugd2lsbCBub3JtYWxseSAtbm90LSB3YW50IHRvIHN0YXJ0IHRoZSBSQ1UgdG9ydHVyZSB0ZXN0cyBkdXJpbmcgYm9vdAotKGFuZCB0aHVzIHRoZSBkZWZhdWx0IGlzIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUX1JVTk5BQkxFPW4pLCBidXQgZG9pbmcKLXRoaXMgY2FuIHNvbWV0aW1lcyBiZSB1c2VmdWwgaW4gZmluZGluZyBib290LXRpbWUgYnVncy4KLQogCiBNT0RVTEUgUEFSQU1FVEVSUwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1NlY3VyaXR5QnVncyBiL0RvY3VtZW50YXRpb24vU2VjdXJpdHlCdWdzCmluZGV4IGE2NjBkNDkuLjM0MmQ3NjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vU2VjdXJpdHlCdWdzCisrKyBiL0RvY3VtZW50YXRpb24vU2VjdXJpdHlCdWdzCkBAIC0xLDkgKzEsMTUgQEAKKy4uIF9zZWN1cml0eWJ1Z3M6CisKK1NlY3VyaXR5IGJ1Z3MKKz09PT09PT09PT09PT0KKwogTGludXgga2VybmVsIGRldmVsb3BlcnMgdGFrZSBzZWN1cml0eSB2ZXJ5IHNlcmlvdXNseS4gIEFzIHN1Y2gsIHdlJ2QKIGxpa2UgdG8ga25vdyB3aGVuIGEgc2VjdXJpdHkgYnVnIGlzIGZvdW5kIHNvIHRoYXQgaXQgY2FuIGJlIGZpeGVkIGFuZAogZGlzY2xvc2VkIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuICBQbGVhc2UgcmVwb3J0IHNlY3VyaXR5IGJ1Z3MgdG8gdGhlCiBMaW51eCBrZXJuZWwgc2VjdXJpdHkgdGVhbS4KIAogMSkgQ29udGFjdAorLS0tLS0tLS0tLQogCiBUaGUgTGludXgga2VybmVsIHNlY3VyaXR5IHRlYW0gY2FuIGJlIGNvbnRhY3RlZCBieSBlbWFpbCBhdAogPHNlY3VyaXR5QGtlcm5lbC5vcmc+LiAgVGhpcyBpcyBhIHByaXZhdGUgbGlzdCBvZiBzZWN1cml0eSBvZmZpY2VycwpAQCAtMTgsNiArMjQsNyBAQAogY29uc2VudCBmcm9tIHRoZSByZXBvcnRlciB1bmxlc3MgaXQgaGFzIGFscmVhZHkgYmVlbiBtYWRlIHB1YmxpYy4KIAogMikgRGlzY2xvc3VyZQorLS0tLS0tLS0tLS0tLQogCiBUaGUgZ29hbCBvZiB0aGUgTGludXgga2VybmVsIHNlY3VyaXR5IHRlYW0gaXMgdG8gd29yayB3aXRoIHRoZQogYnVnIHN1Ym1pdHRlciB0byBidWcgcmVzb2x1dGlvbiBhcyB3ZWxsIGFzIGRpc2Nsb3N1cmUuICBXZSBwcmVmZXIKQEAgLTMzLDYgKzQwLDcgQEAKIGRpc2Nsb3N1cmUgZGF0ZSB0byBiZSBvbiB0aGUgb3JkZXIgb2YgNyBkYXlzLgogCiAzKSBOb24tZGlzY2xvc3VyZSBhZ3JlZW1lbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoZSBMaW51eCBrZXJuZWwgc2VjdXJpdHkgdGVhbSBpcyBub3QgYSBmb3JtYWwgYm9keSBhbmQgdGhlcmVmb3JlIHVuYWJsZQogdG8gZW50ZXIgYW55IG5vbi1kaXNjbG9zdXJlIGFncmVlbWVudHMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdENoZWNrbGlzdCBiL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CmluZGV4IDJiN2UzMmQuLjg5NDI4OWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CisrKyBiL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CkBAIC0xLDEwOSArMSwxMjAgQEAKKy4uIF9zdWJtaXRjaGVja2xpc3Q6CisKIExpbnV4IEtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGNoZWNrbGlzdAotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogCiBIZXJlIGFyZSBzb21lIGJhc2ljIHRoaW5ncyB0aGF0IGRldmVsb3BlcnMgc2hvdWxkIGRvIGlmIHRoZXkgd2FudCB0byBzZWUgdGhlaXIKIGtlcm5lbCBwYXRjaCBzdWJtaXNzaW9ucyBhY2NlcHRlZCBtb3JlIHF1aWNrbHkuCiAKIFRoZXNlIGFyZSBhbGwgYWJvdmUgYW5kIGJleW9uZCB0aGUgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIHByb3ZpZGVkIGluCi1Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzIGFuZCBlbHNld2hlcmUgcmVnYXJkaW5nIHN1Ym1pdHRpbmcgTGludXgKLWtlcm5lbCBwYXRjaGVzLgorOnJlZjpgRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyA8c3VibWl0dGluZ3BhdGNoZXM+YAorYW5kIGVsc2V3aGVyZSByZWdhcmRpbmcgc3VibWl0dGluZyBMaW51eCBrZXJuZWwgcGF0Y2hlcy4KIAogCi0xOiBJZiB5b3UgdXNlIGEgZmFjaWxpdHkgdGhlbiAjaW5jbHVkZSB0aGUgZmlsZSB0aGF0IGRlZmluZXMvZGVjbGFyZXMKKzEpIElmIHlvdSB1c2UgYSBmYWNpbGl0eSB0aGVuICNpbmNsdWRlIHRoZSBmaWxlIHRoYXQgZGVmaW5lcy9kZWNsYXJlcwogICAgdGhhdCBmYWNpbGl0eS4gIERvbid0IGRlcGVuZCBvbiBvdGhlciBoZWFkZXIgZmlsZXMgcHVsbGluZyBpbiBvbmVzCiAgICB0aGF0IHlvdSB1c2UuCiAKLTI6IEJ1aWxkcyBjbGVhbmx5IHdpdGggYXBwbGljYWJsZSBvciBtb2RpZmllZCBDT05GSUcgb3B0aW9ucyA9eSwgPW0sIGFuZAotICAgPW4uICBObyBnY2Mgd2FybmluZ3MvZXJyb3JzLCBubyBsaW5rZXIgd2FybmluZ3MvZXJyb3JzLgorMikgQnVpbGRzIGNsZWFubHk6CiAKLTJiOiBQYXNzZXMgYWxsbm9jb25maWcsIGFsbG1vZGNvbmZpZworICBhKSB3aXRoIGFwcGxpY2FibGUgb3IgbW9kaWZpZWQgYGBDT05GSUdgYCBvcHRpb25zIGBgPXlgYCwgYGA9bWBgLCBhbmQKKyAgICAgYGA9bmBgLiAgTm8gYGBnY2NgYCB3YXJuaW5ncy9lcnJvcnMsIG5vIGxpbmtlciB3YXJuaW5ncy9lcnJvcnMuCiAKLTJjOiBCdWlsZHMgc3VjY2Vzc2Z1bGx5IHdoZW4gdXNpbmcgTz1idWlsZGRpcgorICBiKSBQYXNzZXMgYGBhbGxub2NvbmZpZ2BgLCBgYGFsbG1vZGNvbmZpZ2BgCiAKLTM6IEJ1aWxkcyBvbiBtdWx0aXBsZSBDUFUgYXJjaGl0ZWN0dXJlcyBieSB1c2luZyBsb2NhbCBjcm9zcy1jb21waWxlIHRvb2xzCisgIGMpIEJ1aWxkcyBzdWNjZXNzZnVsbHkgd2hlbiB1c2luZyBgYE89YnVpbGRkaXJgYAorCiszKSBCdWlsZHMgb24gbXVsdGlwbGUgQ1BVIGFyY2hpdGVjdHVyZXMgYnkgdXNpbmcgbG9jYWwgY3Jvc3MtY29tcGlsZSB0b29scwogICAgb3Igc29tZSBvdGhlciBidWlsZCBmYXJtLgogCi00OiBwcGM2NCBpcyBhIGdvb2QgYXJjaGl0ZWN0dXJlIGZvciBjcm9zcy1jb21waWxhdGlvbiBjaGVja2luZyBiZWNhdXNlIGl0Ci0gICB0ZW5kcyB0byB1c2UgYHVuc2lnbmVkIGxvbmcnIGZvciA2NC1iaXQgcXVhbnRpdGllcy4KKzQpIHBwYzY0IGlzIGEgZ29vZCBhcmNoaXRlY3R1cmUgZm9yIGNyb3NzLWNvbXBpbGF0aW9uIGNoZWNraW5nIGJlY2F1c2UgaXQKKyAgIHRlbmRzIHRvIHVzZSBgYHVuc2lnbmVkIGxvbmdgYCBmb3IgNjQtYml0IHF1YW50aXRpZXMuCiAKLTU6IENoZWNrIHlvdXIgcGF0Y2ggZm9yIGdlbmVyYWwgc3R5bGUgYXMgZGV0YWlsZWQgaW4KLSAgIERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUuICBDaGVjayBmb3IgdHJpdmlhbCB2aW9sYXRpb25zIHdpdGggdGhlCi0gICBwYXRjaCBzdHlsZSBjaGVja2VyIHByaW9yIHRvIHN1Ym1pc3Npb24gKHNjcmlwdHMvY2hlY2twYXRjaC5wbCkuCis1KSBDaGVjayB5b3VyIHBhdGNoIGZvciBnZW5lcmFsIHN0eWxlIGFzIGRldGFpbGVkIGluCisgICA6cmVmOmBEb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlIDxjb2RpbmdzdHlsZT5gLgorICAgQ2hlY2sgZm9yIHRyaXZpYWwgdmlvbGF0aW9ucyB3aXRoIHRoZSBwYXRjaCBzdHlsZSBjaGVja2VyIHByaW9yIHRvCisgICBzdWJtaXNzaW9uIChgYHNjcmlwdHMvY2hlY2twYXRjaC5wbGBgKS4KICAgIFlvdSBzaG91bGQgYmUgYWJsZSB0byBqdXN0aWZ5IGFsbCB2aW9sYXRpb25zIHRoYXQgcmVtYWluIGluCiAgICB5b3VyIHBhdGNoLgogCi02OiBBbnkgbmV3IG9yIG1vZGlmaWVkIENPTkZJRyBvcHRpb25zIGRvbid0IG11Y2sgdXAgdGhlIGNvbmZpZyBtZW51LgorNikgQW55IG5ldyBvciBtb2RpZmllZCBgYENPTkZJR2BgIG9wdGlvbnMgZG9uJ3QgbXVjayB1cCB0aGUgY29uZmlnIG1lbnUuCiAKLTc6IEFsbCBuZXcgS2NvbmZpZyBvcHRpb25zIGhhdmUgaGVscCB0ZXh0LgorNykgQWxsIG5ldyBgYEtjb25maWdgYCBvcHRpb25zIGhhdmUgaGVscCB0ZXh0LgogCi04OiBIYXMgYmVlbiBjYXJlZnVsbHkgcmV2aWV3ZWQgd2l0aCByZXNwZWN0IHRvIHJlbGV2YW50IEtjb25maWcKKzgpIEhhcyBiZWVuIGNhcmVmdWxseSByZXZpZXdlZCB3aXRoIHJlc3BlY3QgdG8gcmVsZXZhbnQgYGBLY29uZmlnYGAKICAgIGNvbWJpbmF0aW9ucy4gIFRoaXMgaXMgdmVyeSBoYXJkIHRvIGdldCByaWdodCB3aXRoIHRlc3RpbmcgLS0gYnJhaW5wb3dlcgogICAgcGF5cyBvZmYgaGVyZS4KIAotOTogQ2hlY2sgY2xlYW5seSB3aXRoIHNwYXJzZS4KKzkpIENoZWNrIGNsZWFubHkgd2l0aCBzcGFyc2UuCiAKLTEwOiBVc2UgJ21ha2UgY2hlY2tzdGFjaycgYW5kICdtYWtlIG5hbWVzcGFjZWNoZWNrJyBhbmQgZml4IGFueSBwcm9ibGVtcwotICAgIHRoYXQgdGhleSBmaW5kLiAgTm90ZTogY2hlY2tzdGFjayBkb2VzIG5vdCBwb2ludCBvdXQgcHJvYmxlbXMgZXhwbGljaXRseSwKLSAgICBidXQgYW55IG9uZSBmdW5jdGlvbiB0aGF0IHVzZXMgbW9yZSB0aGFuIDUxMiBieXRlcyBvbiB0aGUgc3RhY2sgaXMgYQotICAgIGNhbmRpZGF0ZSBmb3IgY2hhbmdlLgorMTApIFVzZSBgYG1ha2UgY2hlY2tzdGFja2BgIGFuZCBgYG1ha2UgbmFtZXNwYWNlY2hlY2tgYCBhbmQgZml4IGFueSBwcm9ibGVtcworICAgIHRoYXQgdGhleSBmaW5kLgogCi0xMTogSW5jbHVkZSBrZXJuZWwtZG9jIHRvIGRvY3VtZW50IGdsb2JhbCBrZXJuZWwgQVBJcy4gIChOb3QgcmVxdWlyZWQgZm9yCi0gICAgc3RhdGljIGZ1bmN0aW9ucywgYnV0IE9LIHRoZXJlIGFsc28uKSBVc2UgJ21ha2UgaHRtbGRvY3MnIG9yICdtYWtlCi0gICAgbWFuZG9jcycgdG8gY2hlY2sgdGhlIGtlcm5lbC1kb2MgYW5kIGZpeCBhbnkgaXNzdWVzLgorICAgIC4uIG5vdGU6OgogCi0xMjogSGFzIGJlZW4gdGVzdGVkIHdpdGggQ09ORklHX1BSRUVNUFQsIENPTkZJR19ERUJVR19QUkVFTVBULAotICAgIENPTkZJR19ERUJVR19TTEFCLCBDT05GSUdfREVCVUdfUEFHRUFMTE9DLCBDT05GSUdfREVCVUdfTVVURVhFUywKLSAgICBDT05GSUdfREVCVUdfU1BJTkxPQ0ssIENPTkZJR19ERUJVR19BVE9NSUNfU0xFRVAsIENPTkZJR19QUk9WRV9SQ1UKLSAgICBhbmQgQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQgYWxsIHNpbXVsdGFuZW91c2x5IGVuYWJsZWQuCisgICAgICAgYGBjaGVja3N0YWNrYGAgZG9lcyBub3QgcG9pbnQgb3V0IHByb2JsZW1zIGV4cGxpY2l0bHksCisgICAgICAgYnV0IGFueSBvbmUgZnVuY3Rpb24gdGhhdCB1c2VzIG1vcmUgdGhhbiA1MTIgYnl0ZXMgb24gdGhlIHN0YWNrIGlzIGEKKyAgICAgICBjYW5kaWRhdGUgZm9yIGNoYW5nZS4KIAotMTM6IEhhcyBiZWVuIGJ1aWxkLSBhbmQgcnVudGltZSB0ZXN0ZWQgd2l0aCBhbmQgd2l0aG91dCBDT05GSUdfU01QIGFuZAotICAgIENPTkZJR19QUkVFTVBULgorMTEpIEluY2x1ZGUgOnJlZjpga2VybmVsLWRvYyA8a2VybmVsX2RvYz5gIHRvIGRvY3VtZW50IGdsb2JhbCAga2VybmVsIEFQSXMuCisgICAgKE5vdCByZXF1aXJlZCBmb3Igc3RhdGljIGZ1bmN0aW9ucywgYnV0IE9LIHRoZXJlIGFsc28uKSBVc2UKKyAgICBgYG1ha2UgaHRtbGRvY3NgYCBvciBgYG1ha2UgcGRmZG9jc2BgIHRvIGNoZWNrIHRoZQorICAgIDpyZWY6YGtlcm5lbC1kb2MgPGtlcm5lbF9kb2M+YCBhbmQgZml4IGFueSBpc3N1ZXMuCiAKLTE0OiBJZiB0aGUgcGF0Y2ggYWZmZWN0cyBJTy9EaXNrLCBldGM6IGhhcyBiZWVuIHRlc3RlZCB3aXRoIGFuZCB3aXRob3V0Ci0gICAgQ09ORklHX0xCREFGLgorMTIpIEhhcyBiZWVuIHRlc3RlZCB3aXRoIGBgQ09ORklHX1BSRUVNUFRgYCwgYGBDT05GSUdfREVCVUdfUFJFRU1QVGBgLAorICAgIGBgQ09ORklHX0RFQlVHX1NMQUJgYCwgYGBDT05GSUdfREVCVUdfUEFHRUFMTE9DYGAsIGBgQ09ORklHX0RFQlVHX01VVEVYRVNgYCwKKyAgICBgYENPTkZJR19ERUJVR19TUElOTE9DS2BgLCBgYENPTkZJR19ERUJVR19BVE9NSUNfU0xFRVBgYCwKKyAgICBgYENPTkZJR19QUk9WRV9SQ1VgYCBhbmQgYGBDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRGBgIGFsbAorICAgIHNpbXVsdGFuZW91c2x5IGVuYWJsZWQuCiAKLTE1OiBBbGwgY29kZXBhdGhzIGhhdmUgYmVlbiBleGVyY2lzZWQgd2l0aCBhbGwgbG9ja2RlcCBmZWF0dXJlcyBlbmFibGVkLgorMTMpIEhhcyBiZWVuIGJ1aWxkLSBhbmQgcnVudGltZSB0ZXN0ZWQgd2l0aCBhbmQgd2l0aG91dCBgYENPTkZJR19TTVBgYCBhbmQKKyAgICBgYENPTkZJR19QUkVFTVBULmBgCiAKLTE2OiBBbGwgbmV3IC9wcm9jIGVudHJpZXMgYXJlIGRvY3VtZW50ZWQgdW5kZXIgRG9jdW1lbnRhdGlvbi8KKzE0KSBJZiB0aGUgcGF0Y2ggYWZmZWN0cyBJTy9EaXNrLCBldGM6IGhhcyBiZWVuIHRlc3RlZCB3aXRoIGFuZCB3aXRob3V0CisgICAgYGBDT05GSUdfTEJEQUYuYGAKIAotMTc6IEFsbCBuZXcga2VybmVsIGJvb3QgcGFyYW1ldGVycyBhcmUgZG9jdW1lbnRlZCBpbgotICAgIERvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0LgorMTUpIEFsbCBjb2RlcGF0aHMgaGF2ZSBiZWVuIGV4ZXJjaXNlZCB3aXRoIGFsbCBsb2NrZGVwIGZlYXR1cmVzIGVuYWJsZWQuCiAKLTE4OiBBbGwgbmV3IG1vZHVsZSBwYXJhbWV0ZXJzIGFyZSBkb2N1bWVudGVkIHdpdGggTU9EVUxFX1BBUk1fREVTQygpCisxNikgQWxsIG5ldyBgYC9wcm9jYGAgZW50cmllcyBhcmUgZG9jdW1lbnRlZCB1bmRlciBgYERvY3VtZW50YXRpb24vYGAKIAotMTk6IEFsbCBuZXcgdXNlcnNwYWNlIGludGVyZmFjZXMgYXJlIGRvY3VtZW50ZWQgaW4gRG9jdW1lbnRhdGlvbi9BQkkvLgotICAgIFNlZSBEb2N1bWVudGF0aW9uL0FCSS9SRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisxNykgQWxsIG5ldyBrZXJuZWwgYm9vdCBwYXJhbWV0ZXJzIGFyZSBkb2N1bWVudGVkIGluCisgICAgYGBEb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dGBgLgorCisxOCkgQWxsIG5ldyBtb2R1bGUgcGFyYW1ldGVycyBhcmUgZG9jdW1lbnRlZCB3aXRoIGBgTU9EVUxFX1BBUk1fREVTQygpYGAKKworMTkpIEFsbCBuZXcgdXNlcnNwYWNlIGludGVyZmFjZXMgYXJlIGRvY3VtZW50ZWQgaW4gYGBEb2N1bWVudGF0aW9uL0FCSS9gYC4KKyAgICBTZWUgYGBEb2N1bWVudGF0aW9uL0FCSS9SRUFETUVgYCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICBQYXRjaGVzIHRoYXQgY2hhbmdlIHVzZXJzcGFjZSBpbnRlcmZhY2VzIHNob3VsZCBiZSBDQ2VkIHRvCiAgICAgbGludXgtYXBpQHZnZXIua2VybmVsLm9yZy4KIAotMjA6IENoZWNrIHRoYXQgaXQgYWxsIHBhc3NlcyBgbWFrZSBoZWFkZXJzX2NoZWNrJy4KKzIwKSBDaGVjayB0aGF0IGl0IGFsbCBwYXNzZXMgYGBtYWtlIGhlYWRlcnNfY2hlY2tgYC4KIAotMjE6IEhhcyBiZWVuIGNoZWNrZWQgd2l0aCBpbmplY3Rpb24gb2YgYXQgbGVhc3Qgc2xhYiBhbmQgcGFnZS1hbGxvY2F0aW9uCi0gICAgZmFpbHVyZXMuICBTZWUgRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vLgorMjEpIEhhcyBiZWVuIGNoZWNrZWQgd2l0aCBpbmplY3Rpb24gb2YgYXQgbGVhc3Qgc2xhYiBhbmQgcGFnZS1hbGxvY2F0aW9uCisgICAgZmFpbHVyZXMuICBTZWUgYGBEb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9gYC4KIAogICAgIElmIHRoZSBuZXcgY29kZSBpcyBzdWJzdGFudGlhbCwgYWRkaXRpb24gb2Ygc3Vic3lzdGVtLXNwZWNpZmljIGZhdWx0CiAgICAgaW5qZWN0aW9uIG1pZ2h0IGJlIGFwcHJvcHJpYXRlLgogCi0yMjogTmV3bHktYWRkZWQgY29kZSBoYXMgYmVlbiBjb21waWxlZCB3aXRoIGBnY2MgLVcnICh1c2UgIm1ha2UKLSAgICBFWFRSQV9DRkxBR1M9LVciKS4gIFRoaXMgd2lsbCBnZW5lcmF0ZSBsb3RzIG9mIG5vaXNlLCBidXQgaXMgZ29vZCBmb3IKLSAgICBmaW5kaW5nIGJ1Z3MgbGlrZSAid2FybmluZzogY29tcGFyaXNvbiBiZXR3ZWVuIHNpZ25lZCBhbmQgdW5zaWduZWQiLgorMjIpIE5ld2x5LWFkZGVkIGNvZGUgaGFzIGJlZW4gY29tcGlsZWQgd2l0aCBgYGdjYyAtV2BgICh1c2UKKyAgICBgYG1ha2UgRVhUUkFfQ0ZMQUdTPS1XYGApLiAgVGhpcyB3aWxsIGdlbmVyYXRlIGxvdHMgb2Ygbm9pc2UsIGJ1dCBpcyBnb29kCisgICAgZm9yIGZpbmRpbmcgYnVncyBsaWtlICJ3YXJuaW5nOiBjb21wYXJpc29uIGJldHdlZW4gc2lnbmVkIGFuZCB1bnNpZ25lZCIuCiAKLTIzOiBUZXN0ZWQgYWZ0ZXIgaXQgaGFzIGJlZW4gbWVyZ2VkIGludG8gdGhlIC1tbSBwYXRjaHNldCB0byBtYWtlIHN1cmUKKzIzKSBUZXN0ZWQgYWZ0ZXIgaXQgaGFzIGJlZW4gbWVyZ2VkIGludG8gdGhlIC1tbSBwYXRjaHNldCB0byBtYWtlIHN1cmUKICAgICB0aGF0IGl0IHN0aWxsIHdvcmtzIHdpdGggYWxsIG9mIHRoZSBvdGhlciBxdWV1ZWQgcGF0Y2hlcyBhbmQgdmFyaW91cwogICAgIGNoYW5nZXMgaW4gdGhlIFZNLCBWRlMsIGFuZCBvdGhlciBzdWJzeXN0ZW1zLgogCi0yNDogQWxsIG1lbW9yeSBiYXJyaWVycyB7ZS5nLiwgYmFycmllcigpLCBybWIoKSwgd21iKCl9IG5lZWQgYSBjb21tZW50IGluIHRoZQotICAgIHNvdXJjZSBjb2RlIHRoYXQgZXhwbGFpbnMgdGhlIGxvZ2ljIG9mIHdoYXQgdGhleSBhcmUgZG9pbmcgYW5kIHdoeS4KKzI0KSBBbGwgbWVtb3J5IGJhcnJpZXJzIHtlLmcuLCBgYGJhcnJpZXIoKWBgLCBgYHJtYigpYGAsIGBgd21iKClgYH0gbmVlZCBhCisgICAgY29tbWVudCBpbiB0aGUgc291cmNlIGNvZGUgdGhhdCBleHBsYWlucyB0aGUgbG9naWMgb2Ygd2hhdCB0aGV5IGFyZSBkb2luZworICAgIGFuZCB3aHkuCiAKLTI1OiBJZiBhbnkgaW9jdGwncyBhcmUgYWRkZWQgYnkgdGhlIHBhdGNoLCB0aGVuIGFsc28gdXBkYXRlCi0gICAgRG9jdW1lbnRhdGlvbi9pb2N0bC9pb2N0bC1udW1iZXIudHh0LgorMjUpIElmIGFueSBpb2N0bCdzIGFyZSBhZGRlZCBieSB0aGUgcGF0Y2gsIHRoZW4gYWxzbyB1cGRhdGUKKyAgICBgYERvY3VtZW50YXRpb24vaW9jdGwvaW9jdGwtbnVtYmVyLnR4dGBgLgogCi0yNjogSWYgeW91ciBtb2RpZmllZCBzb3VyY2UgY29kZSBkZXBlbmRzIG9uIG9yIHVzZXMgYW55IG9mIHRoZSBrZXJuZWwKLSAgICBBUElzIG9yIGZlYXR1cmVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIGZvbGxvd2luZyBrY29uZmlnIHN5bWJvbHMsCi0gICAgdGhlbiB0ZXN0IG11bHRpcGxlIGJ1aWxkcyB3aXRoIHRoZSByZWxhdGVkIGtjb25maWcgc3ltYm9scyBkaXNhYmxlZAotICAgIGFuZC9vciA9bSAoaWYgdGhhdCBvcHRpb24gaXMgYXZhaWxhYmxlKSBbbm90IGFsbCBvZiB0aGVzZSBhdCB0aGUKKzI2KSBJZiB5b3VyIG1vZGlmaWVkIHNvdXJjZSBjb2RlIGRlcGVuZHMgb24gb3IgdXNlcyBhbnkgb2YgdGhlIGtlcm5lbAorICAgIEFQSXMgb3IgZmVhdHVyZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgZm9sbG93aW5nIGBgS2NvbmZpZ2BgIHN5bWJvbHMsCisgICAgdGhlbiB0ZXN0IG11bHRpcGxlIGJ1aWxkcyB3aXRoIHRoZSByZWxhdGVkIGBgS2NvbmZpZ2BgIHN5bWJvbHMgZGlzYWJsZWQKKyAgICBhbmQvb3IgYGA9bWBgIChpZiB0aGF0IG9wdGlvbiBpcyBhdmFpbGFibGUpIFtub3QgYWxsIG9mIHRoZXNlIGF0IHRoZQogICAgIHNhbWUgdGltZSwganVzdCB2YXJpb3VzL3JhbmRvbSBjb21iaW5hdGlvbnMgb2YgdGhlbV06CiAKLSAgICBDT05GSUdfU01QLCBDT05GSUdfU1lTRlMsIENPTkZJR19QUk9DX0ZTLCBDT05GSUdfSU5QVVQsIENPTkZJR19QQ0ksCi0gICAgQ09ORklHX0JMT0NLLCBDT05GSUdfUE0sIENPTkZJR19NQUdJQ19TWVNSUSwKLSAgICBDT05GSUdfTkVULCBDT05GSUdfSU5FVD1uIChidXQgbGF0dGVyIHdpdGggQ09ORklHX05FVD15KQorICAgIGBgQ09ORklHX1NNUGBgLCBgYENPTkZJR19TWVNGU2BgLCBgYENPTkZJR19QUk9DX0ZTYGAsIGBgQ09ORklHX0lOUFVUYGAsIGBgQ09ORklHX1BDSWBgLCBgYENPTkZJR19CTE9DS2BgLCBgYENPTkZJR19QTWBgLCBgYENPTkZJR19NQUdJQ19TWVNSUWBgLAorICAgIGBgQ09ORklHX05FVGBgLCBgYENPTkZJR19JTkVUPW5gYCAoYnV0IGxhdHRlciB3aXRoIGBgQ09ORklHX05FVD15YGApLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nRHJpdmVycyBiL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMKaW5kZXggMzFkMzcyNi4uMjUyYjc3YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nRHJpdmVycworKysgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdEcml2ZXJzCkBAIC0xLDUgKzEsNyBAQAorLi4gX3N1Ym1pdHRpbmdkcml2ZXJzOgorCiBTdWJtaXR0aW5nIERyaXZlcnMgRm9yIFRoZSBMaW51eCBLZXJuZWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFRoaXMgZG9jdW1lbnQgaXMgaW50ZW5kZWQgdG8gZXhwbGFpbiBob3cgdG8gc3VibWl0IGRldmljZSBkcml2ZXJzIHRvIHRoZQogdmFyaW91cyBrZXJuZWwgdHJlZXMuIE5vdGUgdGhhdCBpZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gdmlkZW8gY2FyZCBkcml2ZXJzCkBAIC0zOCw0MiArNDAsNDggQEAKIAltYWludGFpbmVyIGRvZXMgbm90IHJlc3BvbmQgb3IgeW91IGNhbm5vdCBmaW5kIHRoZSBhcHByb3ByaWF0ZQogCW1haW50YWluZXIgdGhlbiBwbGVhc2UgY29udGFjdCBXaWxseSBUYXJyZWF1IDx3QDF3dC5ldT4uCiAKLUxpbnV4IDIuNjoKK0xpbnV4IDIuNiBhbmQgdXBwZXI6CiAJVGhlIHNhbWUgcnVsZXMgYXBwbHkgYXMgMi40IGV4Y2VwdCB0aGF0IHlvdSBzaG91bGQgZm9sbG93IGxpbnV4LWtlcm5lbAotCXRvIHRyYWNrIGNoYW5nZXMgaW4gQVBJJ3MuIFRoZSBmaW5hbCBjb250YWN0IHBvaW50IGZvciBMaW51eCAyLjYKKwl0byB0cmFjayBjaGFuZ2VzIGluIEFQSSdzLiBUaGUgZmluYWwgY29udGFjdCBwb2ludCBmb3IgTGludXggMi42KwogCXN1Ym1pc3Npb25zIGlzIEFuZHJldyBNb3J0b24uCiAKIFdoYXQgQ3JpdGVyaWEgRGV0ZXJtaW5lIEFjY2VwdGFuY2UKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotTGljZW5zaW5nOglUaGUgY29kZSBtdXN0IGJlIHJlbGVhc2VkIHRvIHVzIHVuZGVyIHRoZQorTGljZW5zaW5nOgorCQlUaGUgY29kZSBtdXN0IGJlIHJlbGVhc2VkIHRvIHVzIHVuZGVyIHRoZQogCQlHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gV2UgZG9uJ3QgaW5zaXN0IG9uIGFueSBraW5kCiAJCW9mIGV4Y2x1c2l2ZSBHUEwgbGljZW5zaW5nLCBhbmQgaWYgeW91IHdpc2ggdGhlIGRyaXZlcgogCQl0byBiZSB1c2VmdWwgdG8gb3RoZXIgY29tbXVuaXRpZXMgc3VjaCBhcyBCU0QgeW91IG1heSB3ZWxsCiAJCXdpc2ggdG8gcmVsZWFzZSB1bmRlciBtdWx0aXBsZSBsaWNlbnNlcy4KIAkJU2VlIGFjY2VwdGVkIGxpY2Vuc2VzIGF0IGluY2x1ZGUvbGludXgvbW9kdWxlLmgKIAotQ29weXJpZ2h0OglUaGUgY29weXJpZ2h0IG93bmVyIG11c3QgYWdyZWUgdG8gdXNlIG9mIEdQTC4KK0NvcHlyaWdodDoKKwkJVGhlIGNvcHlyaWdodCBvd25lciBtdXN0IGFncmVlIHRvIHVzZSBvZiBHUEwuCiAJCUl0J3MgYmVzdCBpZiB0aGUgc3VibWl0dGVyIGFuZCBjb3B5cmlnaHQgb3duZXIKIAkJYXJlIHRoZSBzYW1lIHBlcnNvbi9lbnRpdHkuIElmIG5vdCwgdGhlIG5hbWUgb2YKIAkJdGhlIHBlcnNvbi9lbnRpdHkgYXV0aG9yaXppbmcgdXNlIG9mIEdQTCBzaG91bGQgYmUKIAkJbGlzdGVkIGluIGNhc2UgaXQncyBuZWNlc3NhcnkgdG8gdmVyaWZ5IHRoZSB3aWxsIG9mCiAJCXRoZSBjb3B5cmlnaHQgb3duZXIuCiAKLUludGVyZmFjZXM6CUlmIHlvdXIgZHJpdmVyIHVzZXMgZXhpc3RpbmcgaW50ZXJmYWNlcyBhbmQgYmVoYXZlcyBsaWtlCitJbnRlcmZhY2VzOgorCQlJZiB5b3VyIGRyaXZlciB1c2VzIGV4aXN0aW5nIGludGVyZmFjZXMgYW5kIGJlaGF2ZXMgbGlrZQogCQlvdGhlciBkcml2ZXJzIGluIHRoZSBzYW1lIGNsYXNzIGl0IHdpbGwgYmUgbXVjaCBtb3JlIGxpa2VseQogCQl0byBiZSBhY2NlcHRlZCB0aGFuIGlmIGl0IGludmVudHMgZ3JhdHVpdG91cyBuZXcgb25lcy4KIAkJSWYgeW91IG5lZWQgdG8gaW1wbGVtZW50IGEgY29tbW9uIEFQSSBvdmVyIExpbnV4IGFuZCBOVAogCQlkcml2ZXJzIGRvIGl0IGluIHVzZXJzcGFjZS4KIAotQ29kZToJCVBsZWFzZSB1c2UgdGhlIExpbnV4IHN0eWxlIG9mIGNvZGUgZm9ybWF0dGluZyBhcyBkb2N1bWVudGVkCi0JCWluIERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUuIElmIHlvdSBoYXZlIHNlY3Rpb25zIG9mIGNvZGUKK0NvZGU6CisJCVBsZWFzZSB1c2UgdGhlIExpbnV4IHN0eWxlIG9mIGNvZGUgZm9ybWF0dGluZyBhcyBkb2N1bWVudGVkCisJCWluIDpyZWY6YERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUgPGNvZGluZ1N0eWxlPmAuCisJCUlmIHlvdSBoYXZlIHNlY3Rpb25zIG9mIGNvZGUKIAkJdGhhdCBuZWVkIHRvIGJlIGluIG90aGVyIGZvcm1hdHMsIGZvciBleGFtcGxlIGJlY2F1c2UgdGhleQogCQlhcmUgc2hhcmVkIHdpdGggYSB3aW5kb3dzIGRyaXZlciBraXQgYW5kIHlvdSB3YW50IHRvCiAJCW1haW50YWluIHRoZW0ganVzdCBvbmNlIHNlcGFyYXRlIHRoZW0gb3V0IG5pY2VseSBhbmQgbm90ZQogCQl0aGlzIGZhY3QuCiAKLVBvcnRhYmlsaXR5OglQb2ludGVycyBhcmUgbm90IGFsd2F5cyAzMmJpdHMsIG5vdCBhbGwgY29tcHV0ZXJzIGFyZSBsaXR0bGUKK1BvcnRhYmlsaXR5OgorCQlQb2ludGVycyBhcmUgbm90IGFsd2F5cyAzMmJpdHMsIG5vdCBhbGwgY29tcHV0ZXJzIGFyZSBsaXR0bGUKIAkJZW5kaWFuLCBwZW9wbGUgZG8gbm90IGFsbCBoYXZlIGZsb2F0aW5nIHBvaW50IGFuZCB5b3UKIAkJc2hvdWxkbid0IHVzZSBpbmxpbmUgeDg2IGFzc2VtYmxlciBpbiB5b3VyIGRyaXZlciB3aXRob3V0CiAJCWNhcmVmdWwgdGhvdWdodC4gUHVyZSB4ODYgZHJpdmVycyBnZW5lcmFsbHkgYXJlIG5vdCBwb3B1bGFyLgpAQCAtODEsMTIgKzg5LDE0IEBACiAJCWJ1dCBpdCBpcyBlYXN5IHRvIG1ha2Ugc3VyZSB0aGUgY29kZSBjYW4gZWFzaWx5IGJlIG1hZGUKIAkJcG9ydGFibGUuCiAKLUNsYXJpdHk6CUl0IGhlbHBzIGlmIGFueW9uZSBjYW4gc2VlIGhvdyB0byBmaXggdGhlIGRyaXZlci4gSXQgaGVscHMKK0NsYXJpdHk6CisJCUl0IGhlbHBzIGlmIGFueW9uZSBjYW4gc2VlIGhvdyB0byBmaXggdGhlIGRyaXZlci4gSXQgaGVscHMKIAkJeW91IGJlY2F1c2UgeW91IGdldCBwYXRjaGVzIG5vdCBidWcgcmVwb3J0cy4gSWYgeW91IHN1Ym1pdCBhCiAJCWRyaXZlciB0aGF0IGludGVudGlvbmFsbHkgb2JmdXNjYXRlcyBob3cgdGhlIGhhcmR3YXJlIHdvcmtzCiAJCWl0IHdpbGwgZ28gaW4gdGhlIGJpdGJ1Y2tldC4KIAotUE0gc3VwcG9ydDoJU2luY2UgTGludXggaXMgdXNlZCBvbiBtYW55IHBvcnRhYmxlIGFuZCBkZXNrdG9wIHN5c3RlbXMsIHlvdXIKK1BNIHN1cHBvcnQ6CisJCVNpbmNlIExpbnV4IGlzIHVzZWQgb24gbWFueSBwb3J0YWJsZSBhbmQgZGVza3RvcCBzeXN0ZW1zLCB5b3VyCiAJCWRyaXZlciBpcyBsaWtlbHkgdG8gYmUgdXNlZCBvbiBzdWNoIGEgc3lzdGVtIGFuZCB0aGVyZWZvcmUgaXQKIAkJc2hvdWxkIHN1cHBvcnQgYmFzaWMgcG93ZXIgbWFuYWdlbWVudCBieSBpbXBsZW1lbnRpbmcsIGlmCiAJCW5lY2Vzc2FyeSwgdGhlIC5zdXNwZW5kIGFuZCAucmVzdW1lIG1ldGhvZHMgdXNlZCBkdXJpbmcgdGhlCkBAIC0xMDEsNyArMTExLDggQEAKIAkJY29tcGxldGUgb3ZlcnZpZXcgb2YgdGhlIHBvd2VyIG1hbmFnZW1lbnQgaXNzdWVzIHJlbGF0ZWQgdG8KIAkJZHJpdmVycyBzZWUgRG9jdW1lbnRhdGlvbi9wb3dlci9kZXZpY2VzLnR4dCAuCiAKLUNvbnRyb2w6CUluIGdlbmVyYWwgaWYgdGhlcmUgaXMgYWN0aXZlIG1haW50ZW5hbmNlIG9mIGEgZHJpdmVyIGJ5CitDb250cm9sOgorCQlJbiBnZW5lcmFsIGlmIHRoZXJlIGlzIGFjdGl2ZSBtYWludGVuYW5jZSBvZiBhIGRyaXZlciBieQogCQl0aGUgYXV0aG9yIHRoZW4gcGF0Y2hlcyB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gdGhlbSB1bmxlc3MKIAkJdGhleSBhcmUgdG90YWxseSBvYnZpb3VzIGFuZCB3aXRob3V0IG5lZWQgb2YgY2hlY2tpbmcuCiAJCUlmIHlvdSB3YW50IHRvIGJlIHRoZSBjb250YWN0IGFuZCB1cGRhdGUgcG9pbnQgZm9yIHRoZQpAQCAtMTExLDEzICsxMjIsMTUgQEAKIFdoYXQgQ3JpdGVyaWEgRG8gTm90IERldGVybWluZSBBY2NlcHRhbmNlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1WZW5kb3I6CQlCZWluZyB0aGUgaGFyZHdhcmUgdmVuZG9yIGFuZCBtYWludGFpbmluZyB0aGUgZHJpdmVyIGlzCitWZW5kb3I6CisJCUJlaW5nIHRoZSBoYXJkd2FyZSB2ZW5kb3IgYW5kIG1haW50YWluaW5nIHRoZSBkcml2ZXIgaXMKIAkJb2Z0ZW4gYSBnb29kIHRoaW5nLiBJZiB0aGVyZSBpcyBhIHN0YWJsZSB3b3JraW5nIGRyaXZlciBmcm9tCiAJCW90aGVyIHBlb3BsZSBhbHJlYWR5IGluIHRoZSB0cmVlIGRvbid0IGV4cGVjdCAnd2UgYXJlIHRoZQogCQl2ZW5kb3InIHRvIGdldCB5b3VyIGRyaXZlciBjaG9zZW4uIElkZWFsbHkgd29yayB3aXRoIHRoZQogCQlleGlzdGluZyBkcml2ZXIgYXV0aG9yIHRvIGJ1aWxkIGEgc2luZ2xlIHBlcmZlY3QgZHJpdmVyLgogCi1BdXRob3I6CQlJdCBkb2Vzbid0IG1hdHRlciBpZiBhIGxhcmdlIExpbnV4IGNvbXBhbnkgd3JvdGUgdGhlIGRyaXZlciwKK0F1dGhvcjoKKwkJSXQgZG9lc24ndCBtYXR0ZXIgaWYgYSBsYXJnZSBMaW51eCBjb21wYW55IHdyb3RlIHRoZSBkcml2ZXIsCiAJCW9yIHlvdSBkaWQuIE5vYm9keSBoYXMgYW55IHNwZWNpYWwgYWNjZXNzIHRvIHRoZSBrZXJuZWwKIAkJdHJlZS4gQW55b25lIHdobyB0ZWxscyB5b3Ugb3RoZXJ3aXNlIGlzbid0IHRlbGxpbmcgdGhlCiAJCXdob2xlIHN0b3J5LgpAQCAtMTI3LDggKzE0MCwxMCBAQAogLS0tLS0tLS0tCiAKIExpbnV4IGtlcm5lbCBtYXN0ZXIgdHJlZToKLQlmdHAuPz8ua2VybmVsLm9yZzovcHViL2xpbnV4L2tlcm5lbC8uLi4KLQk/PyA9PSB5b3VyIGNvdW50cnkgY29kZSwgc3VjaCBhcyAidXMiLCAidWsiLCAiZnIiLCBldGMuCisJZnRwLlwgKmNvdW50cnlfY29kZSpcIC5rZXJuZWwub3JnOi9wdWIvbGludXgva2VybmVsLy4uLgorCisJd2hlcmUgKmNvdW50cnlfY29kZSogPT0geW91ciBjb3VudHJ5IGNvZGUsIHN1Y2ggYXMKKwkqKnVzKiosICoqdWsqKiwgKipmcioqLCBldGMuCiAKIAlodHRwOi8vZ2l0Lmtlcm5lbC5vcmcvP3A9bGludXgva2VybmVsL2dpdC90b3J2YWxkcy9saW51eC5naXQKIApAQCAtMTQxLDE0ICsxNTYsMTkgQEAKIAogTFdOLm5ldDoKIAlXZWVrbHkgc3VtbWFyeSBvZiBrZXJuZWwgZGV2ZWxvcG1lbnQgYWN0aXZpdHkgLSBodHRwOi8vbHduLm5ldC8KKwogCTIuNiBBUEkgY2hhbmdlczoKKwogCQlodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yLjYta2VybmVsLWFwaS8KKwogCVBvcnRpbmcgZHJpdmVycyBmcm9tIHByaW9yIGtlcm5lbHMgdG8gMi42OgorCiAJCWh0dHA6Ly9sd24ubmV0L0FydGljbGVzL2RyaXZlci1wb3J0aW5nLwogCiBLZXJuZWxOZXdiaWVzOgogCURvY3VtZW50YXRpb24gYW5kIGFzc2lzdGFuY2UgZm9yIG5ldyBrZXJuZWwgcHJvZ3JhbW1lcnMKLQlodHRwOi8va2VybmVsbmV3Ymllcy5vcmcvCisKKwkJaHR0cDovL2tlcm5lbG5ld2JpZXMub3JnLwogCiBMaW51eCBVU0IgcHJvamVjdDoKIAlodHRwOi8vd3d3LmxpbnV4LXVzYi5vcmcvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcwppbmRleCA4Yzc5ZjFkLi4zNmYxZGVkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCisrKyBiL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMKQEAgLTEsOSArMSw3IEBACisuLiBfc3VibWl0dGluZ3BhdGNoZXM6CiAKLQlIb3cgdG8gR2V0IFlvdXIgQ2hhbmdlIEludG8gdGhlIExpbnV4IEtlcm5lbAotCQlvcgotCUNhcmUgQW5kIE9wZXJhdGlvbiBPZiBZb3VyIExpbnVzIFRvcnZhbGRzCi0KLQorSG93IHRvIEdldCBZb3VyIENoYW5nZSBJbnRvIHRoZSBMaW51eCBLZXJuZWwgb3IgQ2FyZSBBbmQgT3BlcmF0aW9uIE9mIFlvdXIgTGludXMgVG9ydmFsZHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIEZvciBhIHBlcnNvbiBvciBjb21wYW55IHdobyB3aXNoZXMgdG8gc3VibWl0IGEgY2hhbmdlIHRvIHRoZSBMaW51eAoga2VybmVsLCB0aGUgcHJvY2VzcyBjYW4gc29tZXRpbWVzIGJlIGRhdW50aW5nIGlmIHlvdSdyZSBub3QgZmFtaWxpYXIKQEAgLTEyLDU3ICsxMCw1OSBAQAogCiBUaGlzIGRvY3VtZW50IGNvbnRhaW5zIGEgbGFyZ2UgbnVtYmVyIG9mIHN1Z2dlc3Rpb25zIGluIGEgcmVsYXRpdmVseSB0ZXJzZQogZm9ybWF0LiAgRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGhvdyB0aGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3MKLXdvcmtzLCBzZWUgRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLiAgQWxzbywgcmVhZAotRG9jdW1lbnRhdGlvbi9TdWJtaXRDaGVja2xpc3QgZm9yIGEgbGlzdCBvZiBpdGVtcyB0byBjaGVjayBiZWZvcmUKK3dvcmtzLCBzZWUgOnJlZjpgRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzIDxkZXZlbG9wbWVudF9wcm9jZXNzX21haW4+YC4KK0Fsc28sIHJlYWQgOnJlZjpgRG9jdW1lbnRhdGlvbi9TdWJtaXRDaGVja2xpc3QgPHN1Ym1pdGNoZWNrbGlzdD5gCitmb3IgYSBsaXN0IG9mIGl0ZW1zIHRvIGNoZWNrIGJlZm9yZQogc3VibWl0dGluZyBjb2RlLiAgSWYgeW91IGFyZSBzdWJtaXR0aW5nIGEgZHJpdmVyLCBhbHNvIHJlYWQKLURvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnM7IGZvciBkZXZpY2UgdHJlZSBiaW5kaW5nIHBhdGNoZXMsIHJlYWQKKzpyZWY6YERvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMgPHN1Ym1pdHRpbmdkcml2ZXJzPmA7Citmb3IgZGV2aWNlIHRyZWUgYmluZGluZyBwYXRjaGVzLCByZWFkCiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3VibWl0dGluZy1wYXRjaGVzLnR4dC4KIAotTWFueSBvZiB0aGVzZSBzdGVwcyBkZXNjcmliZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgZ2l0IHZlcnNpb24KLWNvbnRyb2wgc3lzdGVtOyBpZiB5b3UgdXNlIGdpdCB0byBwcmVwYXJlIHlvdXIgcGF0Y2hlcywgeW91J2xsIGZpbmQgbXVjaAorTWFueSBvZiB0aGVzZSBzdGVwcyBkZXNjcmliZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgYGBnaXRgYCB2ZXJzaW9uCitjb250cm9sIHN5c3RlbTsgaWYgeW91IHVzZSBgYGdpdGBgIHRvIHByZXBhcmUgeW91ciBwYXRjaGVzLCB5b3UnbGwgZmluZCBtdWNoCiBvZiB0aGUgbWVjaGFuaWNhbCB3b3JrIGRvbmUgZm9yIHlvdSwgdGhvdWdoIHlvdSdsbCBzdGlsbCBuZWVkIHRvIHByZXBhcmUKLWFuZCBkb2N1bWVudCBhIHNlbnNpYmxlIHNldCBvZiBwYXRjaGVzLiAgSW4gZ2VuZXJhbCwgdXNlIG9mIGdpdCB3aWxsIG1ha2UKK2FuZCBkb2N1bWVudCBhIHNlbnNpYmxlIHNldCBvZiBwYXRjaGVzLiAgSW4gZ2VuZXJhbCwgdXNlIG9mIGBgZ2l0YGAgd2lsbCBtYWtlCiB5b3VyIGxpZmUgYXMgYSBrZXJuZWwgZGV2ZWxvcGVyIGVhc2llci4KIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNFQ1RJT04gMSAtIENSRUFUSU5HIEFORCBTRU5ESU5HIFlPVVIgQ0hBTkdFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ3JlYXRpbmcgYW5kIFNlbmRpbmcgeW91ciBDaGFuZ2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKIAogMCkgT2J0YWluIGEgY3VycmVudCBzb3VyY2UgdHJlZQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJZiB5b3UgZG8gbm90IGhhdmUgYSByZXBvc2l0b3J5IHdpdGggdGhlIGN1cnJlbnQga2VybmVsIHNvdXJjZSBoYW5keSwgdXNlCi1naXQgdG8gb2J0YWluIG9uZS4gIFlvdSdsbCB3YW50IHRvIHN0YXJ0IHdpdGggdGhlIG1haW5saW5lIHJlcG9zaXRvcnksCi13aGljaCBjYW4gYmUgZ3JhYmJlZCB3aXRoOgorYGBnaXRgYCB0byBvYnRhaW4gb25lLiAgWW91J2xsIHdhbnQgdG8gc3RhcnQgd2l0aCB0aGUgbWFpbmxpbmUgcmVwb3NpdG9yeSwKK3doaWNoIGNhbiBiZSBncmFiYmVkIHdpdGg6OgogCi0gIGdpdCBjbG9uZSBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdG9ydmFsZHMvbGludXguZ2l0IAorICBnaXQgY2xvbmUgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RvcnZhbGRzL2xpbnV4LmdpdAogCiBOb3RlLCBob3dldmVyLCB0aGF0IHlvdSBtYXkgbm90IHdhbnQgdG8gZGV2ZWxvcCBhZ2FpbnN0IHRoZSBtYWlubGluZSB0cmVlCiBkaXJlY3RseS4gIE1vc3Qgc3Vic3lzdGVtIG1haW50YWluZXJzIHJ1biB0aGVpciBvd24gdHJlZXMgYW5kIHdhbnQgdG8gc2VlCi1wYXRjaGVzIHByZXBhcmVkIGFnYWluc3QgdGhvc2UgdHJlZXMuICBTZWUgdGhlICJUOiIgZW50cnkgZm9yIHRoZSBzdWJzeXN0ZW0KK3BhdGNoZXMgcHJlcGFyZWQgYWdhaW5zdCB0aG9zZSB0cmVlcy4gIFNlZSB0aGUgKipUOioqIGVudHJ5IGZvciB0aGUgc3Vic3lzdGVtCiBpbiB0aGUgTUFJTlRBSU5FUlMgZmlsZSB0byBmaW5kIHRoYXQgdHJlZSwgb3Igc2ltcGx5IGFzayB0aGUgbWFpbnRhaW5lciBpZgogdGhlIHRyZWUgaXMgbm90IGxpc3RlZCB0aGVyZS4KIAogSXQgaXMgc3RpbGwgcG9zc2libGUgdG8gZG93bmxvYWQga2VybmVsIHJlbGVhc2VzIHZpYSB0YXJiYWxscyAoYXMgZGVzY3JpYmVkCiBpbiB0aGUgbmV4dCBzZWN0aW9uKSwgYnV0IHRoYXQgaXMgdGhlIGhhcmQgd2F5IHRvIGRvIGtlcm5lbCBkZXZlbG9wbWVudC4KIAotMSkgImRpZmYgLXVwIgotLS0tLS0tLS0tLS0tCisxKSBgYGRpZmYgLXVwYGAKKy0tLS0tLS0tLS0tLS0tLQogCi1JZiB5b3UgbXVzdCBnZW5lcmF0ZSB5b3VyIHBhdGNoZXMgYnkgaGFuZCwgdXNlICJkaWZmIC11cCIgb3IgImRpZmYgLXVwck4iCitJZiB5b3UgbXVzdCBnZW5lcmF0ZSB5b3VyIHBhdGNoZXMgYnkgaGFuZCwgdXNlIGBgZGlmZiAtdXBgYCBvciBgYGRpZmYgLXVwck5gYAogdG8gY3JlYXRlIHBhdGNoZXMuICBHaXQgZ2VuZXJhdGVzIHBhdGNoZXMgaW4gdGhpcyBmb3JtIGJ5IGRlZmF1bHQ7IGlmCi15b3UncmUgdXNpbmcgZ2l0LCB5b3UgY2FuIHNraXAgdGhpcyBzZWN0aW9uIGVudGlyZWx5LgoreW91J3JlIHVzaW5nIGBgZ2l0YGAsIHlvdSBjYW4gc2tpcCB0aGlzIHNlY3Rpb24gZW50aXJlbHkuCiAKIEFsbCBjaGFuZ2VzIHRvIHRoZSBMaW51eCBrZXJuZWwgb2NjdXIgaW4gdGhlIGZvcm0gb2YgcGF0Y2hlcywgYXMKLWdlbmVyYXRlZCBieSBkaWZmKDEpLiAgV2hlbiBjcmVhdGluZyB5b3VyIHBhdGNoLCBtYWtlIHN1cmUgdG8gY3JlYXRlIGl0Ci1pbiAidW5pZmllZCBkaWZmIiBmb3JtYXQsIGFzIHN1cHBsaWVkIGJ5IHRoZSAnLXUnIGFyZ3VtZW50IHRvIGRpZmYoMSkuCi1BbHNvLCBwbGVhc2UgdXNlIHRoZSAnLXAnIGFyZ3VtZW50IHdoaWNoIHNob3dzIHdoaWNoIEMgZnVuY3Rpb24gZWFjaAotY2hhbmdlIGlzIGluIC0gdGhhdCBtYWtlcyB0aGUgcmVzdWx0YW50IGRpZmYgYSBsb3QgZWFzaWVyIHRvIHJlYWQuCitnZW5lcmF0ZWQgYnkgOm1hbnBhZ2U6YGRpZmYoMSlgLiAgV2hlbiBjcmVhdGluZyB5b3VyIHBhdGNoLCBtYWtlIHN1cmUgdG8KK2NyZWF0ZSBpdCBpbiAidW5pZmllZCBkaWZmIiBmb3JtYXQsIGFzIHN1cHBsaWVkIGJ5IHRoZSBgYC11YGAgYXJndW1lbnQKK3RvIDptYW5wYWdlOmBkaWZmKDEpYC4KK0Fsc28sIHBsZWFzZSB1c2UgdGhlIGBgLXBgYCBhcmd1bWVudCB3aGljaCBzaG93cyB3aGljaCBDIGZ1bmN0aW9uIGVhY2gKK2NoYW5nZSBpcyBpbiAtIHRoYXQgbWFrZXMgdGhlIHJlc3VsdGFudCBgYGRpZmZgYCBhIGxvdCBlYXNpZXIgdG8gcmVhZC4KIFBhdGNoZXMgc2hvdWxkIGJlIGJhc2VkIGluIHRoZSByb290IGtlcm5lbCBzb3VyY2UgZGlyZWN0b3J5LAogbm90IGluIGFueSBsb3dlciBzdWJkaXJlY3RvcnkuCiAKLVRvIGNyZWF0ZSBhIHBhdGNoIGZvciBhIHNpbmdsZSBmaWxlLCBpdCBpcyBvZnRlbiBzdWZmaWNpZW50IHRvIGRvOgorVG8gY3JlYXRlIGEgcGF0Y2ggZm9yIGEgc2luZ2xlIGZpbGUsIGl0IGlzIG9mdGVuIHN1ZmZpY2llbnQgdG8gZG86OgogCiAJU1JDVFJFRT0gbGludXgKIAlNWUZJTEU9ICBkcml2ZXJzL25ldC9teWRyaXZlci5jCkBAIC03NCw4ICs3NCw4IEBACiAJZGlmZiAtdXAgJFNSQ1RSRUUvJE1ZRklMRXsub3JpZyx9ID4gL3RtcC9wYXRjaAogCiBUbyBjcmVhdGUgYSBwYXRjaCBmb3IgbXVsdGlwbGUgZmlsZXMsIHlvdSBzaG91bGQgdW5wYWNrIGEgInZhbmlsbGEiLAotb3IgdW5tb2RpZmllZCBrZXJuZWwgc291cmNlIHRyZWUsIGFuZCBnZW5lcmF0ZSBhIGRpZmYgYWdhaW5zdCB5b3VyCi1vd24gc291cmNlIHRyZWUuICBGb3IgZXhhbXBsZToKK29yIHVubW9kaWZpZWQga2VybmVsIHNvdXJjZSB0cmVlLCBhbmQgZ2VuZXJhdGUgYSBgYGRpZmZgYCBhZ2FpbnN0IHlvdXIKK293biBzb3VyY2UgdHJlZS4gIEZvciBleGFtcGxlOjoKIAogCU1ZU1JDPSAvZGV2ZWwvbGludXgKIApAQCAtODQsMjcgKzg0LDI3IEBACiAJZGlmZiAtdXByTiAtWCBsaW51eC0zLjE5LXZhbmlsbGEvRG9jdW1lbnRhdGlvbi9kb250ZGlmZiBcCiAJCWxpbnV4LTMuMTktdmFuaWxsYSAkTVlTUkMgPiAvdG1wL3BhdGNoCiAKLSJkb250ZGlmZiIgaXMgYSBsaXN0IG9mIGZpbGVzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIGtlcm5lbCBkdXJpbmcKLXRoZSBidWlsZCBwcm9jZXNzLCBhbmQgc2hvdWxkIGJlIGlnbm9yZWQgaW4gYW55IGRpZmYoMSktZ2VuZXJhdGVkCitgYGRvbnRkaWZmYGAgaXMgYSBsaXN0IG9mIGZpbGVzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIGtlcm5lbCBkdXJpbmcKK3RoZSBidWlsZCBwcm9jZXNzLCBhbmQgc2hvdWxkIGJlIGlnbm9yZWQgaW4gYW55IDptYW5wYWdlOmBkaWZmKDEpYC1nZW5lcmF0ZWQKIHBhdGNoLgogCiBNYWtlIHN1cmUgeW91ciBwYXRjaCBkb2VzIG5vdCBpbmNsdWRlIGFueSBleHRyYSBmaWxlcyB3aGljaCBkbyBub3QKIGJlbG9uZyBpbiBhIHBhdGNoIHN1Ym1pc3Npb24uICBNYWtlIHN1cmUgdG8gcmV2aWV3IHlvdXIgcGF0Y2ggLWFmdGVyLQotZ2VuZXJhdGluZyBpdCB3aXRoIGRpZmYoMSksIHRvIGVuc3VyZSBhY2N1cmFjeS4KK2dlbmVyYXRpbmcgaXQgd2l0aCA6bWFucGFnZTpgZGlmZigxKWAsIHRvIGVuc3VyZSBhY2N1cmFjeS4KIAogSWYgeW91ciBjaGFuZ2VzIHByb2R1Y2UgYSBsb3Qgb2YgZGVsdGFzLCB5b3UgbmVlZCB0byBzcGxpdCB0aGVtIGludG8KLWluZGl2aWR1YWwgcGF0Y2hlcyB3aGljaCBtb2RpZnkgdGhpbmdzIGluIGxvZ2ljYWwgc3RhZ2VzOyBzZWUgc2VjdGlvbgotIzMuICBUaGlzIHdpbGwgZmFjaWxpdGF0ZSByZXZpZXcgYnkgb3RoZXIga2VybmVsIGRldmVsb3BlcnMsCitpbmRpdmlkdWFsIHBhdGNoZXMgd2hpY2ggbW9kaWZ5IHRoaW5ncyBpbiBsb2dpY2FsIHN0YWdlczsgc2VlCis6cmVmOmBzcGxpdF9jaGFuZ2VzYC4gIFRoaXMgd2lsbCBmYWNpbGl0YXRlIHJldmlldyBieSBvdGhlciBrZXJuZWwgZGV2ZWxvcGVycywKIHZlcnkgaW1wb3J0YW50IGlmIHlvdSB3YW50IHlvdXIgcGF0Y2ggYWNjZXB0ZWQuCiAKLUlmIHlvdSdyZSB1c2luZyBnaXQsICJnaXQgcmViYXNlIC1pIiBjYW4gaGVscCB5b3Ugd2l0aCB0aGlzIHByb2Nlc3MuICBJZgoteW91J3JlIG5vdCB1c2luZyBnaXQsIHF1aWx0IDxodHRwOi8vc2F2YW5uYWgubm9uZ251Lm9yZy9wcm9qZWN0cy9xdWlsdD4KK0lmIHlvdSdyZSB1c2luZyBgYGdpdGBgLCBgYGdpdCByZWJhc2UgLWlgYCBjYW4gaGVscCB5b3Ugd2l0aCB0aGlzIHByb2Nlc3MuICBJZgoreW91J3JlIG5vdCB1c2luZyBgYGdpdGBgLCBgYHF1aWx0YGAgPGh0dHA6Ly9zYXZhbm5haC5ub25nbnUub3JnL3Byb2plY3RzL3F1aWx0PgogaXMgYW5vdGhlciBwb3B1bGFyIGFsdGVybmF0aXZlLgogCisuLiBfZGVzY3JpYmVfY2hhbmdlczoKIAotCi0yKSBEZXNjcmliZSB5b3VyIGNoYW5nZXMuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyKSBEZXNjcmliZSB5b3VyIGNoYW5nZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBEZXNjcmliZSB5b3VyIHByb2JsZW0uICBXaGV0aGVyIHlvdXIgcGF0Y2ggaXMgYSBvbmUtbGluZSBidWcgZml4IG9yCiA1MDAwIGxpbmVzIG9mIGEgbmV3IGZlYXR1cmUsIHRoZXJlIG11c3QgYmUgYW4gdW5kZXJseWluZyBwcm9ibGVtIHRoYXQKQEAgLTEzNywxMSArMTM3LDExIEBACiAKIFRoZSBtYWludGFpbmVyIHdpbGwgdGhhbmsgeW91IGlmIHlvdSB3cml0ZSB5b3VyIHBhdGNoIGRlc2NyaXB0aW9uIGluIGEKIGZvcm0gd2hpY2ggY2FuIGJlIGVhc2lseSBwdWxsZWQgaW50byBMaW51eCdzIHNvdXJjZSBjb2RlIG1hbmFnZW1lbnQKLXN5c3RlbSwgZ2l0LCBhcyBhICJjb21taXQgbG9nIi4gIFNlZSAjMTUsIGJlbG93Lgorc3lzdGVtLCBgYGdpdGBgLCBhcyBhICJjb21taXQgbG9nIi4gIFNlZSA6cmVmOmBleHBsaWNpdF9pbl9yZXBseV90b2AuCiAKIFNvbHZlIG9ubHkgb25lIHByb2JsZW0gcGVyIHBhdGNoLiAgSWYgeW91ciBkZXNjcmlwdGlvbiBzdGFydHMgdG8gZ2V0CiBsb25nLCB0aGF0J3MgYSBzaWduIHRoYXQgeW91IHByb2JhYmx5IG5lZWQgdG8gc3BsaXQgdXAgeW91ciBwYXRjaC4KLVNlZSAjMywgbmV4dC4KK1NlZSA6cmVmOmBzcGxpdF9jaGFuZ2VzYC4KIAogV2hlbiB5b3Ugc3VibWl0IG9yIHJlc3VibWl0IGEgcGF0Y2ggb3IgcGF0Y2ggc2VyaWVzLCBpbmNsdWRlIHRoZQogY29tcGxldGUgcGF0Y2ggZGVzY3JpcHRpb24gYW5kIGp1c3RpZmljYXRpb24gZm9yIGl0LiAgRG9uJ3QganVzdApAQCAtMTYwLDcgKzE2MCw3IEBACiBJZiB0aGUgcGF0Y2ggZml4ZXMgYSBsb2dnZWQgYnVnIGVudHJ5LCByZWZlciB0byB0aGF0IGJ1ZyBlbnRyeSBieQogbnVtYmVyIGFuZCBVUkwuICBJZiB0aGUgcGF0Y2ggZm9sbG93cyBmcm9tIGEgbWFpbGluZyBsaXN0IGRpc2N1c3Npb24sCiBnaXZlIGEgVVJMIHRvIHRoZSBtYWlsaW5nIGxpc3QgYXJjaGl2ZTsgdXNlIHRoZSBodHRwczovL2xrbWwua2VybmVsLm9yZy8KLXJlZGlyZWN0b3Igd2l0aCBhIE1lc3NhZ2UtSWQsIHRvIGVuc3VyZSB0aGF0IHRoZSBsaW5rcyBjYW5ub3QgYmVjb21lCityZWRpcmVjdG9yIHdpdGggYSBgYE1lc3NhZ2UtSWRgYCwgdG8gZW5zdXJlIHRoYXQgdGhlIGxpbmtzIGNhbm5vdCBiZWNvbWUKIHN0YWxlLgogCiBIb3dldmVyLCB0cnkgdG8gbWFrZSB5b3VyIGV4cGxhbmF0aW9uIHVuZGVyc3RhbmRhYmxlIHdpdGhvdXQgZXh0ZXJuYWwKQEAgLTE3MSw3ICsxNzEsNyBAQAogSWYgeW91IHdhbnQgdG8gcmVmZXIgdG8gYSBzcGVjaWZpYyBjb21taXQsIGRvbid0IGp1c3QgcmVmZXIgdG8gdGhlCiBTSEEtMSBJRCBvZiB0aGUgY29tbWl0LiBQbGVhc2UgYWxzbyBpbmNsdWRlIHRoZSBvbmVsaW5lIHN1bW1hcnkgb2YKIHRoZSBjb21taXQsIHRvIG1ha2UgaXQgZWFzaWVyIGZvciByZXZpZXdlcnMgdG8ga25vdyB3aGF0IGl0IGlzIGFib3V0LgotRXhhbXBsZToKK0V4YW1wbGU6OgogCiAJQ29tbWl0IGUyMWQyMTcwZjM2NjAyYWUyNzA4ICgidmlkZW86IHJlbW92ZSB1bm5lY2Vzc2FyeQogCXBsYXRmb3JtX3NldF9kcnZkYXRhKCkiKSByZW1vdmVkIHRoZSB1bm5lY2Vzc2FyeQpAQCAtMTg1LDIzICsxODUsMjUgQEAKIGNoYW5nZSBmaXZlIHllYXJzIGZyb20gbm93LgogCiBJZiB5b3VyIHBhdGNoIGZpeGVzIGEgYnVnIGluIGEgc3BlY2lmaWMgY29tbWl0LCBlLmcuIHlvdSBmb3VuZCBhbiBpc3N1ZSB1c2luZwotZ2l0LWJpc2VjdCwgcGxlYXNlIHVzZSB0aGUgJ0ZpeGVzOicgdGFnIHdpdGggdGhlIGZpcnN0IDEyIGNoYXJhY3RlcnMgb2YgdGhlCi1TSEEtMSBJRCwgYW5kIHRoZSBvbmUgbGluZSBzdW1tYXJ5LiAgRm9yIGV4YW1wbGU6CitgYGdpdCBiaXNlY3RgYCwgcGxlYXNlIHVzZSB0aGUgJ0ZpeGVzOicgdGFnIHdpdGggdGhlIGZpcnN0IDEyIGNoYXJhY3RlcnMgb2YKK3RoZSBTSEEtMSBJRCwgYW5kIHRoZSBvbmUgbGluZSBzdW1tYXJ5LiAgRm9yIGV4YW1wbGU6OgogCiAJRml4ZXM6IGUyMWQyMTcwZjM2NiAoInZpZGVvOiByZW1vdmUgdW5uZWNlc3NhcnkgcGxhdGZvcm1fc2V0X2RydmRhdGEoKSIpCiAKLVRoZSBmb2xsb3dpbmcgZ2l0LWNvbmZpZyBzZXR0aW5ncyBjYW4gYmUgdXNlZCB0byBhZGQgYSBwcmV0dHkgZm9ybWF0IGZvcgotb3V0cHV0dGluZyB0aGUgYWJvdmUgc3R5bGUgaW4gdGhlIGdpdCBsb2cgb3IgZ2l0IHNob3cgY29tbWFuZHMKK1RoZSBmb2xsb3dpbmcgYGBnaXQgY29uZmlnYGAgc2V0dGluZ3MgY2FuIGJlIHVzZWQgdG8gYWRkIGEgcHJldHR5IGZvcm1hdCBmb3IKK291dHB1dHRpbmcgdGhlIGFib3ZlIHN0eWxlIGluIHRoZSBgYGdpdCBsb2dgYCBvciBgYGdpdCBzaG93YGAgY29tbWFuZHM6OgogCiAJW2NvcmVdCiAJCWFiYnJldiA9IDEyCiAJW3ByZXR0eV0KIAkJZml4ZXMgPSBGaXhlczogJWggKFwiJXNcIikKIAotMykgU2VwYXJhdGUgeW91ciBjaGFuZ2VzLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLi4gX3NwbGl0X2NoYW5nZXM6CiAKLVNlcGFyYXRlIGVhY2ggX2xvZ2ljYWwgY2hhbmdlXyBpbnRvIGEgc2VwYXJhdGUgcGF0Y2guCiszKSBTZXBhcmF0ZSB5b3VyIGNoYW5nZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTZXBhcmF0ZSBlYWNoICoqbG9naWNhbCBjaGFuZ2UqKiBpbnRvIGEgc2VwYXJhdGUgcGF0Y2guCiAKIEZvciBleGFtcGxlLCBpZiB5b3VyIGNoYW5nZXMgaW5jbHVkZSBib3RoIGJ1ZyBmaXhlcyBhbmQgcGVyZm9ybWFuY2UKIGVuaGFuY2VtZW50cyBmb3IgYSBzaW5nbGUgZHJpdmVyLCBzZXBhcmF0ZSB0aG9zZSBjaGFuZ2VzIGludG8gdHdvCkBAIC0yMTcsMTIgKzIxOSwxMiBAQAogb24gaXRzIG93biBtZXJpdHMuCiAKIElmIG9uZSBwYXRjaCBkZXBlbmRzIG9uIGFub3RoZXIgcGF0Y2ggaW4gb3JkZXIgZm9yIGEgY2hhbmdlIHRvIGJlCi1jb21wbGV0ZSwgdGhhdCBpcyBPSy4gIFNpbXBseSBub3RlICJ0aGlzIHBhdGNoIGRlcGVuZHMgb24gcGF0Y2ggWCIKK2NvbXBsZXRlLCB0aGF0IGlzIE9LLiAgU2ltcGx5IG5vdGUgKioidGhpcyBwYXRjaCBkZXBlbmRzIG9uIHBhdGNoIFgiKioKIGluIHlvdXIgcGF0Y2ggZGVzY3JpcHRpb24uCiAKIFdoZW4gZGl2aWRpbmcgeW91ciBjaGFuZ2UgaW50byBhIHNlcmllcyBvZiBwYXRjaGVzLCB0YWtlIHNwZWNpYWwgY2FyZSB0bwogZW5zdXJlIHRoYXQgdGhlIGtlcm5lbCBidWlsZHMgYW5kIHJ1bnMgcHJvcGVybHkgYWZ0ZXIgZWFjaCBwYXRjaCBpbiB0aGUKLXNlcmllcy4gIERldmVsb3BlcnMgdXNpbmcgImdpdCBiaXNlY3QiIHRvIHRyYWNrIGRvd24gYSBwcm9ibGVtIGNhbiBlbmQgdXAKK3Nlcmllcy4gIERldmVsb3BlcnMgdXNpbmcgYGBnaXQgYmlzZWN0YGAgdG8gdHJhY2sgZG93biBhIHByb2JsZW0gY2FuIGVuZCB1cAogc3BsaXR0aW5nIHlvdXIgcGF0Y2ggc2VyaWVzIGF0IGFueSBwb2ludDsgdGhleSB3aWxsIG5vdCB0aGFuayB5b3UgaWYgeW91CiBpbnRyb2R1Y2UgYnVncyBpbiB0aGUgbWlkZGxlLgogCkBAIC0yMzEsMTEgKzIzMywxMyBAQAogCiAKIAotNCkgU3R5bGUtY2hlY2sgeW91ciBjaGFuZ2VzLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorNCkgU3R5bGUtY2hlY2sgeW91ciBjaGFuZ2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQ2hlY2sgeW91ciBwYXRjaCBmb3IgYmFzaWMgc3R5bGUgdmlvbGF0aW9ucywgZGV0YWlscyBvZiB3aGljaCBjYW4gYmUKLWZvdW5kIGluIERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUuICBGYWlsdXJlIHRvIGRvIHNvIHNpbXBseSB3YXN0ZXMKK2ZvdW5kIGluCis6cmVmOmBEb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlIDxjb2RpbmdzdHlsZT5gLgorRmFpbHVyZSB0byBkbyBzbyBzaW1wbHkgd2FzdGVzCiB0aGUgcmV2aWV3ZXJzIHRpbWUgYW5kIHdpbGwgZ2V0IHlvdXIgcGF0Y2ggcmVqZWN0ZWQsIHByb2JhYmx5CiB3aXRob3V0IGV2ZW4gYmVpbmcgcmVhZC4KIApAQCAtMjYwLDggKzI2NCw4IEBACiBwYXRjaC4KIAogCi01KSBTZWxlY3QgdGhlIHJlY2lwaWVudHMgZm9yIHlvdXIgcGF0Y2guCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis1KSBTZWxlY3QgdGhlIHJlY2lwaWVudHMgZm9yIHlvdXIgcGF0Y2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBZb3Ugc2hvdWxkIGFsd2F5cyBjb3B5IHRoZSBhcHByb3ByaWF0ZSBzdWJzeXN0ZW0gbWFpbnRhaW5lcihzKSBvbiBhbnkgcGF0Y2gKIHRvIGNvZGUgdGhhdCB0aGV5IG1haW50YWluOyBsb29rIHRocm91Z2ggdGhlIE1BSU5UQUlORVJTIGZpbGUgYW5kIHRoZQpAQCAtMjk1LDEzICsyOTksMTQgQEAKIG9idmlvdXNseSwgdGhlIHBhdGNoIHNob3VsZCBub3QgYmUgc2VudCB0byBhbnkgcHVibGljIGxpc3RzLgogCiBQYXRjaGVzIHRoYXQgZml4IGEgc2V2ZXJlIGJ1ZyBpbiBhIHJlbGVhc2VkIGtlcm5lbCBzaG91bGQgYmUgZGlyZWN0ZWQKLXRvd2FyZCB0aGUgc3RhYmxlIG1haW50YWluZXJzIGJ5IHB1dHRpbmcgYSBsaW5lIGxpa2UgdGhpczoKK3Rvd2FyZCB0aGUgc3RhYmxlIG1haW50YWluZXJzIGJ5IHB1dHRpbmcgYSBsaW5lIGxpa2UgdGhpczo6CiAKICAgQ2M6IHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmcKIAogaW50byB0aGUgc2lnbi1vZmYgYXJlYSBvZiB5b3VyIHBhdGNoIChub3RlLCBOT1QgYW4gZW1haWwgcmVjaXBpZW50KS4gIFlvdQotc2hvdWxkIGFsc28gcmVhZCBEb2N1bWVudGF0aW9uL3N0YWJsZV9rZXJuZWxfcnVsZXMudHh0IGluIGFkZGl0aW9uIHRvIHRoaXMKLWZpbGUuCitzaG91bGQgYWxzbyByZWFkCis6cmVmOmBEb2N1bWVudGF0aW9uL3N0YWJsZV9rZXJuZWxfcnVsZXMudHh0IDxzdGFibGVfa2VybmVsX3J1bGVzPmAKK2luIGFkZGl0aW9uIHRvIHRoaXMgZmlsZS4KIAogTm90ZSwgaG93ZXZlciwgdGhhdCBzb21lIHN1YnN5c3RlbSBtYWludGFpbmVycyB3YW50IHRvIGNvbWUgdG8gdGhlaXIgb3duCiBjb25jbHVzaW9ucyBvbiB3aGljaCBwYXRjaGVzIHNob3VsZCBnbyB0byB0aGUgc3RhYmxlIHRyZWVzLiAgVGhlIG5ldHdvcmtpbmcKQEAgLTMxMiwyOCArMzE3LDMwIEBACiBtYWludGFpbmVyIChhcyBsaXN0ZWQgaW4gdGhlIE1BSU5UQUlORVJTIGZpbGUpIGEgbWFuLXBhZ2VzIHBhdGNoLCBvciBhdAogbGVhc3QgYSBub3RpZmljYXRpb24gb2YgdGhlIGNoYW5nZSwgc28gdGhhdCBzb21lIGluZm9ybWF0aW9uIG1ha2VzIGl0cyB3YXkKIGludG8gdGhlIG1hbnVhbCBwYWdlcy4gIFVzZXItc3BhY2UgQVBJIGNoYW5nZXMgc2hvdWxkIGFsc28gYmUgY29waWVkIHRvCi1saW51eC1hcGlAdmdlci5rZXJuZWwub3JnLiAKK2xpbnV4LWFwaUB2Z2VyLmtlcm5lbC5vcmcuCiAKIEZvciBzbWFsbCBwYXRjaGVzIHlvdSBtYXkgd2FudCB0byBDQyB0aGUgVHJpdmlhbCBQYXRjaCBNb25rZXkKIHRyaXZpYWxAa2VybmVsLm9yZyB3aGljaCBjb2xsZWN0cyAidHJpdmlhbCIgcGF0Y2hlcy4gSGF2ZSBhIGxvb2sKIGludG8gdGhlIE1BSU5UQUlORVJTIGZpbGUgZm9yIGl0cyBjdXJyZW50IG1hbmFnZXIuCisKIFRyaXZpYWwgcGF0Y2hlcyBtdXN0IHF1YWxpZnkgZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJ1bGVzOgotIFNwZWxsaW5nIGZpeGVzIGluIGRvY3VtZW50YXRpb24KLSBTcGVsbGluZyBmaXhlcyBmb3IgZXJyb3JzIHdoaWNoIGNvdWxkIGJyZWFrIGdyZXAoMSkKLSBXYXJuaW5nIGZpeGVzIChjbHV0dGVyaW5nIHdpdGggdXNlbGVzcyB3YXJuaW5ncyBpcyBiYWQpCi0gQ29tcGlsYXRpb24gZml4ZXMgKG9ubHkgaWYgdGhleSBhcmUgYWN0dWFsbHkgY29ycmVjdCkKLSBSdW50aW1lIGZpeGVzIChvbmx5IGlmIHRoZXkgYWN0dWFsbHkgZml4IHRoaW5ncykKLSBSZW1vdmluZyB1c2Ugb2YgZGVwcmVjYXRlZCBmdW5jdGlvbnMvbWFjcm9zCi0gQ29udGFjdCBkZXRhaWwgYW5kIGRvY3VtZW50YXRpb24gZml4ZXMKLSBOb24tcG9ydGFibGUgY29kZSByZXBsYWNlZCBieSBwb3J0YWJsZSBjb2RlIChldmVuIGluIGFyY2gtc3BlY2lmaWMsCi0gc2luY2UgcGVvcGxlIGNvcHksIGFzIGxvbmcgYXMgaXQncyB0cml2aWFsKQotIEFueSBmaXggYnkgdGhlIGF1dGhvci9tYWludGFpbmVyIG9mIHRoZSBmaWxlIChpZS4gcGF0Y2ggbW9ua2V5Ci0gaW4gcmUtdHJhbnNtaXNzaW9uIG1vZGUpCisKKy0gU3BlbGxpbmcgZml4ZXMgaW4gZG9jdW1lbnRhdGlvbgorLSBTcGVsbGluZyBmaXhlcyBmb3IgZXJyb3JzIHdoaWNoIGNvdWxkIGJyZWFrIDptYW5wYWdlOmBncmVwKDEpYAorLSBXYXJuaW5nIGZpeGVzIChjbHV0dGVyaW5nIHdpdGggdXNlbGVzcyB3YXJuaW5ncyBpcyBiYWQpCistIENvbXBpbGF0aW9uIGZpeGVzIChvbmx5IGlmIHRoZXkgYXJlIGFjdHVhbGx5IGNvcnJlY3QpCistIFJ1bnRpbWUgZml4ZXMgKG9ubHkgaWYgdGhleSBhY3R1YWxseSBmaXggdGhpbmdzKQorLSBSZW1vdmluZyB1c2Ugb2YgZGVwcmVjYXRlZCBmdW5jdGlvbnMvbWFjcm9zCistIENvbnRhY3QgZGV0YWlsIGFuZCBkb2N1bWVudGF0aW9uIGZpeGVzCistIE5vbi1wb3J0YWJsZSBjb2RlIHJlcGxhY2VkIGJ5IHBvcnRhYmxlIGNvZGUgKGV2ZW4gaW4gYXJjaC1zcGVjaWZpYywKKyAgc2luY2UgcGVvcGxlIGNvcHksIGFzIGxvbmcgYXMgaXQncyB0cml2aWFsKQorLSBBbnkgZml4IGJ5IHRoZSBhdXRob3IvbWFpbnRhaW5lciBvZiB0aGUgZmlsZSAoaWUuIHBhdGNoIG1vbmtleQorICBpbiByZS10cmFuc21pc3Npb24gbW9kZSkKIAogCiAKLTYpIE5vIE1JTUUsIG5vIGxpbmtzLCBubyBjb21wcmVzc2lvbiwgbm8gYXR0YWNobWVudHMuICBKdXN0IHBsYWluIHRleHQuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorNikgTm8gTUlNRSwgbm8gbGlua3MsIG5vIGNvbXByZXNzaW9uLCBubyBhdHRhY2htZW50cy4gIEp1c3QgcGxhaW4gdGV4dAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBMaW51cyBhbmQgb3RoZXIga2VybmVsIGRldmVsb3BlcnMgbmVlZCB0byBiZSBhYmxlIHRvIHJlYWQgYW5kIGNvbW1lbnQKIG9uIHRoZSBjaGFuZ2VzIHlvdSBhcmUgc3VibWl0dGluZy4gIEl0IGlzIGltcG9ydGFudCBmb3IgYSBrZXJuZWwKQEAgLTM0MSw4ICszNDgsMTEgQEAKIHRvb2xzLCBzbyB0aGF0IHRoZXkgbWF5IGNvbW1lbnQgb24gc3BlY2lmaWMgcG9ydGlvbnMgb2YgeW91ciBjb2RlLgogCiBGb3IgdGhpcyByZWFzb24sIGFsbCBwYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgYnkgZS1tYWlsICJpbmxpbmUiLgotV0FSTklORzogIEJlIHdhcnkgb2YgeW91ciBlZGl0b3IncyB3b3JkLXdyYXAgY29ycnVwdGluZyB5b3VyIHBhdGNoLAotaWYgeW91IGNob29zZSB0byBjdXQtbi1wYXN0ZSB5b3VyIHBhdGNoLgorCisuLiB3YXJuaW5nOjoKKworICBCZSB3YXJ5IG9mIHlvdXIgZWRpdG9yJ3Mgd29yZC13cmFwIGNvcnJ1cHRpbmcgeW91ciBwYXRjaCwKKyAgaWYgeW91IGNob29zZSB0byBjdXQtbi1wYXN0ZSB5b3VyIHBhdGNoLgogCiBEbyBub3QgYXR0YWNoIHRoZSBwYXRjaCBhcyBhIE1JTUUgYXR0YWNobWVudCwgY29tcHJlc3NlZCBvciBub3QuCiBNYW55IHBvcHVsYXIgZS1tYWlsIGFwcGxpY2F0aW9ucyB3aWxsIG5vdCBhbHdheXMgdHJhbnNtaXQgYSBNSU1FCkBAIC0zNTMsMTEgKzM2MywxMiBAQAogRXhjZXB0aW9uOiAgSWYgeW91ciBtYWlsZXIgaXMgbWFuZ2xpbmcgcGF0Y2hlcyB0aGVuIHNvbWVvbmUgbWF5IGFzawogeW91IHRvIHJlLXNlbmQgdGhlbSB1c2luZyBNSU1FLgogCi1TZWUgRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dCBmb3IgaGludHMgYWJvdXQgY29uZmlndXJpbmcKLXlvdXIgZS1tYWlsIGNsaWVudCBzbyB0aGF0IGl0IHNlbmRzIHlvdXIgcGF0Y2hlcyB1bnRvdWNoZWQuCitTZWUgOnJlZjpgRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dCA8ZW1haWxfY2xpZW50cz5gCitmb3IgaGludHMgYWJvdXQgY29uZmlndXJpbmcgeW91ciBlLW1haWwgY2xpZW50IHNvIHRoYXQgaXQgc2VuZHMgeW91ciBwYXRjaGVzCit1bnRvdWNoZWQuCiAKLTcpIEUtbWFpbCBzaXplLgotLS0tLS0tLS0tLS0tLS0tCis3KSBFLW1haWwgc2l6ZQorLS0tLS0tLS0tLS0tLS0KIAogTGFyZ2UgY2hhbmdlcyBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciBtYWlsaW5nIGxpc3RzLCBhbmQgc29tZQogbWFpbnRhaW5lcnMuICBJZiB5b3VyIHBhdGNoLCB1bmNvbXByZXNzZWQsIGV4Y2VlZHMgMzAwIGtCIGluIHNpemUsCkBAIC0zNjYsOCArMzc3LDggQEAKIHRoYXQgaWYgeW91ciBwYXRjaCBleGNlZWRzIDMwMCBrQiwgaXQgYWxtb3N0IGNlcnRhaW5seSBuZWVkcyB0byBiZSBicm9rZW4gdXAKIGFueXdheS4KIAotOCkgUmVzcG9uZCB0byByZXZpZXcgY29tbWVudHMuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzgpIFJlc3BvbmQgdG8gcmV2aWV3IGNvbW1lbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBZb3VyIHBhdGNoIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBnZXQgY29tbWVudHMgZnJvbSByZXZpZXdlcnMgb24gd2F5cyBpbgogd2hpY2ggdGhlIHBhdGNoIGNhbiBiZSBpbXByb3ZlZC4gIFlvdSBtdXN0IHJlc3BvbmQgdG8gdGhvc2UgY29tbWVudHM7CkBAIC0zODIsOCArMzkzLDggQEAKIHBvbGl0ZWx5IGFuZCBhZGRyZXNzIHRoZSBwcm9ibGVtcyB0aGV5IGhhdmUgcG9pbnRlZCBvdXQuCiAKIAotOSkgRG9uJ3QgZ2V0IGRpc2NvdXJhZ2VkIC0gb3IgaW1wYXRpZW50LgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOSkgRG9uJ3QgZ2V0IGRpc2NvdXJhZ2VkIC0gb3IgaW1wYXRpZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQWZ0ZXIgeW91IGhhdmUgc3VibWl0dGVkIHlvdXIgY2hhbmdlLCBiZSBwYXRpZW50IGFuZCB3YWl0LiAgUmV2aWV3ZXJzIGFyZQogYnVzeSBwZW9wbGUgYW5kIG1heSBub3QgZ2V0IHRvIHlvdXIgcGF0Y2ggcmlnaHQgYXdheS4KQEAgLTQxOSw5ICs0MzAsMTAgQEAKIHBhc3MgaXQgb24gYXMgYW4gb3Blbi1zb3VyY2UgcGF0Y2guICBUaGUgcnVsZXMgYXJlIHByZXR0eSBzaW1wbGU6IGlmIHlvdQogY2FuIGNlcnRpZnkgdGhlIGJlbG93OgogCi0gICAgICAgIERldmVsb3BlcidzIENlcnRpZmljYXRlIG9mIE9yaWdpbiAxLjEKK0RldmVsb3BlcidzIENlcnRpZmljYXRlIG9mIE9yaWdpbiAxLjEKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KIAotICAgICAgICBCeSBtYWtpbmcgYSBjb250cmlidXRpb24gdG8gdGhpcyBwcm9qZWN0LCBJIGNlcnRpZnkgdGhhdDoKK0J5IG1ha2luZyBhIGNvbnRyaWJ1dGlvbiB0byB0aGlzIHByb2plY3QsIEkgY2VydGlmeSB0aGF0OgogCiAgICAgICAgIChhKSBUaGUgY29udHJpYnV0aW9uIHdhcyBjcmVhdGVkIGluIHdob2xlIG9yIGluIHBhcnQgYnkgbWUgYW5kIEkKICAgICAgICAgICAgIGhhdmUgdGhlIHJpZ2h0IHRvIHN1Ym1pdCBpdCB1bmRlciB0aGUgb3BlbiBzb3VyY2UgbGljZW5zZQpAQCAtNDQ1LDcgKzQ1Nyw3IEBACiAgICAgICAgICAgICBtYWludGFpbmVkIGluZGVmaW5pdGVseSBhbmQgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgY29uc2lzdGVudCB3aXRoCiAgICAgICAgICAgICB0aGlzIHByb2plY3Qgb3IgdGhlIG9wZW4gc291cmNlIGxpY2Vuc2UocykgaW52b2x2ZWQuCiAKLXRoZW4geW91IGp1c3QgYWRkIGEgbGluZSBzYXlpbmcKK3RoZW4geW91IGp1c3QgYWRkIGEgbGluZSBzYXlpbmc6OgogCiAJU2lnbmVkLW9mZi1ieTogUmFuZG9tIEogRGV2ZWxvcGVyIDxyYW5kb21AZGV2ZWxvcGVyLmV4YW1wbGUub3JnPgogCkBAIC00NjYsNyArNDc4LDcgQEAKIHRoZSBuYXR1cmUgb2YgeW91ciBjaGFuZ2VzLiBXaGlsZSB0aGVyZSBpcyBub3RoaW5nIG1hbmRhdG9yeSBhYm91dCB0aGlzLCBpdAogc2VlbXMgbGlrZSBwcmVwZW5kaW5nIHRoZSBkZXNjcmlwdGlvbiB3aXRoIHlvdXIgbWFpbCBhbmQvb3IgbmFtZSwgYWxsCiBlbmNsb3NlZCBpbiBzcXVhcmUgYnJhY2tldHMsIGlzIG5vdGljZWFibGUgZW5vdWdoIHRvIG1ha2UgaXQgb2J2aW91cyB0aGF0Ci15b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBsYXN0LW1pbnV0ZSBjaGFuZ2VzLiBFeGFtcGxlIDoKK3lvdSBhcmUgcmVzcG9uc2libGUgZm9yIGxhc3QtbWludXRlIGNoYW5nZXMuIEV4YW1wbGU6OgogCiAJU2lnbmVkLW9mZi1ieTogUmFuZG9tIEogRGV2ZWxvcGVyIDxyYW5kb21AZGV2ZWxvcGVyLmV4YW1wbGUub3JnPgogCVtsdWNreUBtYWludGFpbmVyLmV4YW1wbGUub3JnOiBzdHJ1Y3QgZm9vIG1vdmVkIGZyb20gZm9vLmMgdG8gZm9vLmhdCkBAIC00ODEsMTUgKzQ5MywxNSBAQAogU3BlY2lhbCBub3RlIHRvIGJhY2stcG9ydGVyczogSXQgc2VlbXMgdG8gYmUgYSBjb21tb24gYW5kIHVzZWZ1bCBwcmFjdGljZQogdG8gaW5zZXJ0IGFuIGluZGljYXRpb24gb2YgdGhlIG9yaWdpbiBvZiBhIHBhdGNoIGF0IHRoZSB0b3Agb2YgdGhlIGNvbW1pdAogbWVzc2FnZSAoanVzdCBhZnRlciB0aGUgc3ViamVjdCBsaW5lKSB0byBmYWNpbGl0YXRlIHRyYWNraW5nLiBGb3IgaW5zdGFuY2UsCi1oZXJlJ3Mgd2hhdCB3ZSBzZWUgaW4gYSAzLngtc3RhYmxlIHJlbGVhc2U6CitoZXJlJ3Mgd2hhdCB3ZSBzZWUgaW4gYSAzLngtc3RhYmxlIHJlbGVhc2U6OgogCi1EYXRlOiAgIFR1ZSBPY3QgNyAwNzoyNjozOCAyMDE0IC0wNDAwCisgIERhdGU6ICAgVHVlIE9jdCA3IDA3OjI2OjM4IDIwMTQgLTA0MDAKIAogICAgIGxpYmF0YTogVW4tYnJlYWsgQVRBIGJsYWNrbGlzdAogCiAgICAgY29tbWl0IDFjNDAyNzk5NjBiY2Q3ZDUyZGJkZjFkNDY2YjIwZDI0Yjk5MTc2YzggdXBzdHJlYW0uCiAKLUFuZCBoZXJlJ3Mgd2hhdCBtaWdodCBhcHBlYXIgaW4gYW4gb2xkZXIga2VybmVsIG9uY2UgYSBwYXRjaCBpcyBiYWNrcG9ydGVkOgorQW5kIGhlcmUncyB3aGF0IG1pZ2h0IGFwcGVhciBpbiBhbiBvbGRlciBrZXJuZWwgb25jZSBhIHBhdGNoIGlzIGJhY2twb3J0ZWQ6OgogCiAgICAgRGF0ZTogICBUdWUgTWF5IDEzIDIyOjEyOjI3IDIwMDggKzAyMDAKIApAQCAtNTI5LDcgKzU0MSw3IEBACiBsaXN0IGFyY2hpdmVzLgogCiBJZiBhIHBlcnNvbiBoYXMgaGFkIHRoZSBvcHBvcnR1bml0eSB0byBjb21tZW50IG9uIGEgcGF0Y2gsIGJ1dCBoYXMgbm90Ci1wcm92aWRlZCBzdWNoIGNvbW1lbnRzLCB5b3UgbWF5IG9wdGlvbmFsbHkgYWRkIGEgIkNjOiIgdGFnIHRvIHRoZSBwYXRjaC4KK3Byb3ZpZGVkIHN1Y2ggY29tbWVudHMsIHlvdSBtYXkgb3B0aW9uYWxseSBhZGQgYSBgYENjOmBgIHRhZyB0byB0aGUgcGF0Y2guCiBUaGlzIGlzIHRoZSBvbmx5IHRhZyB3aGljaCBtaWdodCBiZSBhZGRlZCB3aXRob3V0IGFuIGV4cGxpY2l0IGFjdGlvbiBieSB0aGUKIHBlcnNvbiBpdCBuYW1lcyAtIGJ1dCBpdCBzaG91bGQgaW5kaWNhdGUgdGhhdCB0aGlzIHBlcnNvbiB3YXMgY29waWVkIG9uIHRoZQogcGF0Y2guICBUaGlzIHRhZyBkb2N1bWVudHMgdGhhdCBwb3RlbnRpYWxseSBpbnRlcmVzdGVkIHBhcnRpZXMKQEAgLTU1MiwxMSArNTY0LDEyIEBACiBSZXZpZXdlZC1ieTosIGluc3RlYWQsIGluZGljYXRlcyB0aGF0IHRoZSBwYXRjaCBoYXMgYmVlbiByZXZpZXdlZCBhbmQgZm91bmQKIGFjY2VwdGFibGUgYWNjb3JkaW5nIHRvIHRoZSBSZXZpZXdlcidzIFN0YXRlbWVudDoKIAotCVJldmlld2VyJ3Mgc3RhdGVtZW50IG9mIG92ZXJzaWdodAorUmV2aWV3ZXIncyBzdGF0ZW1lbnQgb2Ygb3ZlcnNpZ2h0CiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KIAotCUJ5IG9mZmVyaW5nIG15IFJldmlld2VkLWJ5OiB0YWcsIEkgc3RhdGUgdGhhdDoKK0J5IG9mZmVyaW5nIG15IFJldmlld2VkLWJ5OiB0YWcsIEkgc3RhdGUgdGhhdDoKIAotIAkgKGEpIEkgaGF2ZSBjYXJyaWVkIG91dCBhIHRlY2huaWNhbCByZXZpZXcgb2YgdGhpcyBwYXRjaCB0bworCSAoYSkgSSBoYXZlIGNhcnJpZWQgb3V0IGEgdGVjaG5pY2FsIHJldmlldyBvZiB0aGlzIHBhdGNoIHRvCiAJICAgICBldmFsdWF0ZSBpdHMgYXBwcm9wcmlhdGVuZXNzIGFuZCByZWFkaW5lc3MgZm9yIGluY2x1c2lvbiBpbnRvCiAJICAgICB0aGUgbWFpbmxpbmUga2VybmVsLgogCkBAIC01OTQsMjQgKzYwNywyNSBAQAogaXMgdXNlZCB0byBtYWtlIGl0IGVhc3kgdG8gZGV0ZXJtaW5lIHdoZXJlIGEgYnVnIG9yaWdpbmF0ZWQsIHdoaWNoIGNhbiBoZWxwCiByZXZpZXcgYSBidWcgZml4LiBUaGlzIHRhZyBhbHNvIGFzc2lzdHMgdGhlIHN0YWJsZSBrZXJuZWwgdGVhbSBpbiBkZXRlcm1pbmluZwogd2hpY2ggc3RhYmxlIGtlcm5lbCB2ZXJzaW9ucyBzaG91bGQgcmVjZWl2ZSB5b3VyIGZpeC4gVGhpcyBpcyB0aGUgcHJlZmVycmVkCi1tZXRob2QgZm9yIGluZGljYXRpbmcgYSBidWcgZml4ZWQgYnkgdGhlIHBhdGNoLiBTZWUgIzIgYWJvdmUgZm9yIG1vcmUgZGV0YWlscy4KK21ldGhvZCBmb3IgaW5kaWNhdGluZyBhIGJ1ZyBmaXhlZCBieSB0aGUgcGF0Y2guIFNlZSA6cmVmOmBkZXNjcmliZV9jaGFuZ2VzYAorZm9yIG1vcmUgZGV0YWlscy4KIAogCiAxNCkgVGhlIGNhbm9uaWNhbCBwYXRjaCBmb3JtYXQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGhvdyB0aGUgcGF0Y2ggaXRzZWxmIHNob3VsZCBiZSBmb3JtYXR0ZWQuICBOb3RlCi10aGF0LCBpZiB5b3UgaGF2ZSB5b3VyIHBhdGNoZXMgc3RvcmVkIGluIGEgZ2l0IHJlcG9zaXRvcnksIHByb3BlciBwYXRjaAotZm9ybWF0dGluZyBjYW4gYmUgaGFkIHdpdGggImdpdCBmb3JtYXQtcGF0Y2giLiAgVGhlIHRvb2xzIGNhbm5vdCBjcmVhdGUKK3RoYXQsIGlmIHlvdSBoYXZlIHlvdXIgcGF0Y2hlcyBzdG9yZWQgaW4gYSBgYGdpdGBgIHJlcG9zaXRvcnksIHByb3BlciBwYXRjaAorZm9ybWF0dGluZyBjYW4gYmUgaGFkIHdpdGggYGBnaXQgZm9ybWF0LXBhdGNoYGAuICBUaGUgdG9vbHMgY2Fubm90IGNyZWF0ZQogdGhlIG5lY2Vzc2FyeSB0ZXh0LCB0aG91Z2gsIHNvIHJlYWQgdGhlIGluc3RydWN0aW9ucyBiZWxvdyBhbnl3YXkuCiAKLVRoZSBjYW5vbmljYWwgcGF0Y2ggc3ViamVjdCBsaW5lIGlzOgorVGhlIGNhbm9uaWNhbCBwYXRjaCBzdWJqZWN0IGxpbmUgaXM6OgogCiAgICAgU3ViamVjdDogW1BBVENIIDAwMS8xMjNdIHN1YnN5c3RlbTogc3VtbWFyeSBwaHJhc2UKIAogVGhlIGNhbm9uaWNhbCBwYXRjaCBtZXNzYWdlIGJvZHkgY29udGFpbnMgdGhlIGZvbGxvd2luZzoKIAotICAtIEEgImZyb20iIGxpbmUgc3BlY2lmeWluZyB0aGUgcGF0Y2ggYXV0aG9yIChvbmx5IG5lZWRlZCBpZiB0aGUgcGVyc29uCisgIC0gQSBgYGZyb21gYCBsaW5lIHNwZWNpZnlpbmcgdGhlIHBhdGNoIGF1dGhvciAob25seSBuZWVkZWQgaWYgdGhlIHBlcnNvbgogICAgIHNlbmRpbmcgdGhlIHBhdGNoIGlzIG5vdCB0aGUgYXV0aG9yKS4KIAogICAtIEFuIGVtcHR5IGxpbmUuCkBAIC02MTksNDYgKzYzMyw0NiBAQAogICAtIFRoZSBib2R5IG9mIHRoZSBleHBsYW5hdGlvbiwgbGluZSB3cmFwcGVkIGF0IDc1IGNvbHVtbnMsIHdoaWNoIHdpbGwKICAgICBiZSBjb3BpZWQgdG8gdGhlIHBlcm1hbmVudCBjaGFuZ2Vsb2cgdG8gZGVzY3JpYmUgdGhpcyBwYXRjaC4KIAotICAtIFRoZSAiU2lnbmVkLW9mZi1ieToiIGxpbmVzLCBkZXNjcmliZWQgYWJvdmUsIHdoaWNoIHdpbGwKKyAgLSBUaGUgYGBTaWduZWQtb2ZmLWJ5OmBgIGxpbmVzLCBkZXNjcmliZWQgYWJvdmUsIHdoaWNoIHdpbGwKICAgICBhbHNvIGdvIGluIHRoZSBjaGFuZ2Vsb2cuCiAKLSAgLSBBIG1hcmtlciBsaW5lIGNvbnRhaW5pbmcgc2ltcGx5ICItLS0iLgorICAtIEEgbWFya2VyIGxpbmUgY29udGFpbmluZyBzaW1wbHkgYGAtLS1gYC4KIAogICAtIEFueSBhZGRpdGlvbmFsIGNvbW1lbnRzIG5vdCBzdWl0YWJsZSBmb3IgdGhlIGNoYW5nZWxvZy4KIAotICAtIFRoZSBhY3R1YWwgcGF0Y2ggKGRpZmYgb3V0cHV0KS4KKyAgLSBUaGUgYWN0dWFsIHBhdGNoIChgYGRpZmZgYCBvdXRwdXQpLgogCiBUaGUgU3ViamVjdCBsaW5lIGZvcm1hdCBtYWtlcyBpdCB2ZXJ5IGVhc3kgdG8gc29ydCB0aGUgZW1haWxzCiBhbHBoYWJldGljYWxseSBieSBzdWJqZWN0IGxpbmUgLSBwcmV0dHkgbXVjaCBhbnkgZW1haWwgcmVhZGVyIHdpbGwKIHN1cHBvcnQgdGhhdCAtIHNpbmNlIGJlY2F1c2UgdGhlIHNlcXVlbmNlIG51bWJlciBpcyB6ZXJvLXBhZGRlZCwKIHRoZSBudW1lcmljYWwgYW5kIGFscGhhYmV0aWMgc29ydCBpcyB0aGUgc2FtZS4KIAotVGhlICJzdWJzeXN0ZW0iIGluIHRoZSBlbWFpbCdzIFN1YmplY3Qgc2hvdWxkIGlkZW50aWZ5IHdoaWNoCitUaGUgYGBzdWJzeXN0ZW1gYCBpbiB0aGUgZW1haWwncyBTdWJqZWN0IHNob3VsZCBpZGVudGlmeSB3aGljaAogYXJlYSBvciBzdWJzeXN0ZW0gb2YgdGhlIGtlcm5lbCBpcyBiZWluZyBwYXRjaGVkLgogCi1UaGUgInN1bW1hcnkgcGhyYXNlIiBpbiB0aGUgZW1haWwncyBTdWJqZWN0IHNob3VsZCBjb25jaXNlbHkKLWRlc2NyaWJlIHRoZSBwYXRjaCB3aGljaCB0aGF0IGVtYWlsIGNvbnRhaW5zLiAgVGhlICJzdW1tYXJ5Ci1waHJhc2UiIHNob3VsZCBub3QgYmUgYSBmaWxlbmFtZS4gIERvIG5vdCB1c2UgdGhlIHNhbWUgInN1bW1hcnkKLXBocmFzZSIgZm9yIGV2ZXJ5IHBhdGNoIGluIGEgd2hvbGUgcGF0Y2ggc2VyaWVzICh3aGVyZSBhICJwYXRjaAotc2VyaWVzIiBpcyBhbiBvcmRlcmVkIHNlcXVlbmNlIG9mIG11bHRpcGxlLCByZWxhdGVkIHBhdGNoZXMpLgorVGhlIGBgc3VtbWFyeSBwaHJhc2VgYCBpbiB0aGUgZW1haWwncyBTdWJqZWN0IHNob3VsZCBjb25jaXNlbHkKK2Rlc2NyaWJlIHRoZSBwYXRjaCB3aGljaCB0aGF0IGVtYWlsIGNvbnRhaW5zLiAgVGhlIGBgc3VtbWFyeQorcGhyYXNlYGAgc2hvdWxkIG5vdCBiZSBhIGZpbGVuYW1lLiAgRG8gbm90IHVzZSB0aGUgc2FtZSBgYHN1bW1hcnkKK3BocmFzZWBgIGZvciBldmVyeSBwYXRjaCBpbiBhIHdob2xlIHBhdGNoIHNlcmllcyAod2hlcmUgYSBgYHBhdGNoCitzZXJpZXNgYCBpcyBhbiBvcmRlcmVkIHNlcXVlbmNlIG9mIG11bHRpcGxlLCByZWxhdGVkIHBhdGNoZXMpLgogCi1CZWFyIGluIG1pbmQgdGhhdCB0aGUgInN1bW1hcnkgcGhyYXNlIiBvZiB5b3VyIGVtYWlsIGJlY29tZXMgYQorQmVhciBpbiBtaW5kIHRoYXQgdGhlIGBgc3VtbWFyeSBwaHJhc2VgYCBvZiB5b3VyIGVtYWlsIGJlY29tZXMgYQogZ2xvYmFsbHktdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoYXQgcGF0Y2guICBJdCBwcm9wYWdhdGVzIGFsbCB0aGUgd2F5Ci1pbnRvIHRoZSBnaXQgY2hhbmdlbG9nLiAgVGhlICJzdW1tYXJ5IHBocmFzZSIgbWF5IGxhdGVyIGJlIHVzZWQgaW4KK2ludG8gdGhlIGBgZ2l0YGAgY2hhbmdlbG9nLiAgVGhlIGBgc3VtbWFyeSBwaHJhc2VgYCBtYXkgbGF0ZXIgYmUgdXNlZCBpbgogZGV2ZWxvcGVyIGRpc2N1c3Npb25zIHdoaWNoIHJlZmVyIHRvIHRoZSBwYXRjaC4gIFBlb3BsZSB3aWxsIHdhbnQgdG8KLWdvb2dsZSBmb3IgdGhlICJzdW1tYXJ5IHBocmFzZSIgdG8gcmVhZCBkaXNjdXNzaW9uIHJlZ2FyZGluZyB0aGF0Citnb29nbGUgZm9yIHRoZSBgYHN1bW1hcnkgcGhyYXNlYGAgdG8gcmVhZCBkaXNjdXNzaW9uIHJlZ2FyZGluZyB0aGF0CiBwYXRjaC4gIEl0IHdpbGwgYWxzbyBiZSB0aGUgb25seSB0aGluZyB0aGF0IHBlb3BsZSBtYXkgcXVpY2tseSBzZWUKIHdoZW4sIHR3byBvciB0aHJlZSBtb250aHMgbGF0ZXIsIHRoZXkgYXJlIGdvaW5nIHRocm91Z2ggcGVyaGFwcwotdGhvdXNhbmRzIG9mIHBhdGNoZXMgdXNpbmcgdG9vbHMgc3VjaCBhcyAiZ2l0ayIgb3IgImdpdCBsb2cKLS0tb25lbGluZSIuCit0aG91c2FuZHMgb2YgcGF0Y2hlcyB1c2luZyB0b29scyBzdWNoIGFzIGBgZ2l0a2BgIG9yIGBgZ2l0IGxvZworLS1vbmVsaW5lYGAuCiAKLUZvciB0aGVzZSByZWFzb25zLCB0aGUgInN1bW1hcnkiIG11c3QgYmUgbm8gbW9yZSB0aGFuIDcwLTc1CitGb3IgdGhlc2UgcmVhc29ucywgdGhlIGBgc3VtbWFyeWBgIG11c3QgYmUgbm8gbW9yZSB0aGFuIDcwLTc1CiBjaGFyYWN0ZXJzLCBhbmQgaXQgbXVzdCBkZXNjcmliZSBib3RoIHdoYXQgdGhlIHBhdGNoIGNoYW5nZXMsIGFzIHdlbGwKIGFzIHdoeSB0aGUgcGF0Y2ggbWlnaHQgYmUgbmVjZXNzYXJ5LiAgSXQgaXMgY2hhbGxlbmdpbmcgdG8gYmUgYm90aAogc3VjY2luY3QgYW5kIGRlc2NyaXB0aXZlLCBidXQgdGhhdCBpcyB3aGF0IGEgd2VsbC13cml0dGVuIHN1bW1hcnkKIHNob3VsZCBkby4KIAotVGhlICJzdW1tYXJ5IHBocmFzZSIgbWF5IGJlIHByZWZpeGVkIGJ5IHRhZ3MgZW5jbG9zZWQgaW4gc3F1YXJlCitUaGUgYGBzdW1tYXJ5IHBocmFzZWBgIG1heSBiZSBwcmVmaXhlZCBieSB0YWdzIGVuY2xvc2VkIGluIHNxdWFyZQogYnJhY2tldHM6ICJTdWJqZWN0OiBbUEFUQ0ggPHRhZz4uLi5dIDxzdW1tYXJ5IHBocmFzZT4iLiAgVGhlIHRhZ3MgYXJlCiBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBzdW1tYXJ5IHBocmFzZSwgYnV0IGRlc2NyaWJlIGhvdyB0aGUgcGF0Y2gKIHNob3VsZCBiZSB0cmVhdGVkLiAgQ29tbW9uIHRhZ3MgbWlnaHQgaW5jbHVkZSBhIHZlcnNpb24gZGVzY3JpcHRvciBpZgpAQCAtNjcwLDE5ICs2ODQsMTkgQEAKIGFwcGxpZWQgYW5kIHRoYXQgdGhleSBoYXZlIHJldmlld2VkIG9yIGFwcGxpZWQgYWxsIG9mIHRoZSBwYXRjaGVzIGluCiB0aGUgcGF0Y2ggc2VyaWVzLgogCi1BIGNvdXBsZSBvZiBleGFtcGxlIFN1YmplY3RzOgorQSBjb3VwbGUgb2YgZXhhbXBsZSBTdWJqZWN0czo6CiAKICAgICBTdWJqZWN0OiBbUEFUQ0ggMi81XSBleHQyOiBpbXByb3ZlIHNjYWxhYmlsaXR5IG9mIGJpdG1hcCBzZWFyY2hpbmcKICAgICBTdWJqZWN0OiBbUEFUQ0ggdjIgMDEvMjddIHg4NjogZml4IGVmbGFncyB0cmFja2luZwogCi1UaGUgImZyb20iIGxpbmUgbXVzdCBiZSB0aGUgdmVyeSBmaXJzdCBsaW5lIGluIHRoZSBtZXNzYWdlIGJvZHksCitUaGUgYGBmcm9tYGAgbGluZSBtdXN0IGJlIHRoZSB2ZXJ5IGZpcnN0IGxpbmUgaW4gdGhlIG1lc3NhZ2UgYm9keSwKIGFuZCBoYXMgdGhlIGZvcm06CiAKICAgICAgICAgRnJvbTogT3JpZ2luYWwgQXV0aG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CiAKLVRoZSAiZnJvbSIgbGluZSBzcGVjaWZpZXMgd2hvIHdpbGwgYmUgY3JlZGl0ZWQgYXMgdGhlIGF1dGhvciBvZiB0aGUKLXBhdGNoIGluIHRoZSBwZXJtYW5lbnQgY2hhbmdlbG9nLiAgSWYgdGhlICJmcm9tIiBsaW5lIGlzIG1pc3NpbmcsCi10aGVuIHRoZSAiRnJvbToiIGxpbmUgZnJvbSB0aGUgZW1haWwgaGVhZGVyIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUKK1RoZSBgYGZyb21gYCBsaW5lIHNwZWNpZmllcyB3aG8gd2lsbCBiZSBjcmVkaXRlZCBhcyB0aGUgYXV0aG9yIG9mIHRoZQorcGF0Y2ggaW4gdGhlIHBlcm1hbmVudCBjaGFuZ2Vsb2cuICBJZiB0aGUgYGBmcm9tYGAgbGluZSBpcyBtaXNzaW5nLAordGhlbiB0aGUgYGBGcm9tOmBgIGxpbmUgZnJvbSB0aGUgZW1haWwgaGVhZGVyIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUKIHRoZSBwYXRjaCBhdXRob3IgaW4gdGhlIGNoYW5nZWxvZy4KIAogVGhlIGV4cGxhbmF0aW9uIGJvZHkgd2lsbCBiZSBjb21taXR0ZWQgdG8gdGhlIHBlcm1hbmVudCBzb3VyY2UKQEAgLTY5NCwzNSArNzA4LDM3IEBACiBsb29raW5nIGZvciB0aGUgYXBwbGljYWJsZSBwYXRjaC4gIElmIGEgcGF0Y2ggZml4ZXMgYSBjb21waWxlIGZhaWx1cmUsCiBpdCBtYXkgbm90IGJlIG5lY2Vzc2FyeSB0byBpbmNsdWRlIF9hbGxfIG9mIHRoZSBjb21waWxlIGZhaWx1cmVzOyBqdXN0CiBlbm91Z2ggdGhhdCBpdCBpcyBsaWtlbHkgdGhhdCBzb21lb25lIHNlYXJjaGluZyBmb3IgdGhlIHBhdGNoIGNhbiBmaW5kCi1pdC4gIEFzIGluIHRoZSAic3VtbWFyeSBwaHJhc2UiLCBpdCBpcyBpbXBvcnRhbnQgdG8gYmUgYm90aCBzdWNjaW5jdCBhcworaXQuICBBcyBpbiB0aGUgYGBzdW1tYXJ5IHBocmFzZWBgLCBpdCBpcyBpbXBvcnRhbnQgdG8gYmUgYm90aCBzdWNjaW5jdCBhcwogd2VsbCBhcyBkZXNjcmlwdGl2ZS4KIAotVGhlICItLS0iIG1hcmtlciBsaW5lIHNlcnZlcyB0aGUgZXNzZW50aWFsIHB1cnBvc2Ugb2YgbWFya2luZyBmb3IgcGF0Y2gKK1RoZSBgYC0tLWBgIG1hcmtlciBsaW5lIHNlcnZlcyB0aGUgZXNzZW50aWFsIHB1cnBvc2Ugb2YgbWFya2luZyBmb3IgcGF0Y2gKIGhhbmRsaW5nIHRvb2xzIHdoZXJlIHRoZSBjaGFuZ2Vsb2cgbWVzc2FnZSBlbmRzLgogCi1PbmUgZ29vZCB1c2UgZm9yIHRoZSBhZGRpdGlvbmFsIGNvbW1lbnRzIGFmdGVyIHRoZSAiLS0tIiBtYXJrZXIgaXMgZm9yCi1hIGRpZmZzdGF0LCB0byBzaG93IHdoYXQgZmlsZXMgaGF2ZSBjaGFuZ2VkLCBhbmQgdGhlIG51bWJlciBvZgotaW5zZXJ0ZWQgYW5kIGRlbGV0ZWQgbGluZXMgcGVyIGZpbGUuICBBIGRpZmZzdGF0IGlzIGVzcGVjaWFsbHkgdXNlZnVsCitPbmUgZ29vZCB1c2UgZm9yIHRoZSBhZGRpdGlvbmFsIGNvbW1lbnRzIGFmdGVyIHRoZSBgYC0tLWBgIG1hcmtlciBpcyBmb3IKK2EgYGBkaWZmc3RhdGBgLCB0byBzaG93IHdoYXQgZmlsZXMgaGF2ZSBjaGFuZ2VkLCBhbmQgdGhlIG51bWJlciBvZgoraW5zZXJ0ZWQgYW5kIGRlbGV0ZWQgbGluZXMgcGVyIGZpbGUuICBBIGBgZGlmZnN0YXRgYCBpcyBlc3BlY2lhbGx5IHVzZWZ1bAogb24gYmlnZ2VyIHBhdGNoZXMuICBPdGhlciBjb21tZW50cyByZWxldmFudCBvbmx5IHRvIHRoZSBtb21lbnQgb3IgdGhlCiBtYWludGFpbmVyLCBub3Qgc3VpdGFibGUgZm9yIHRoZSBwZXJtYW5lbnQgY2hhbmdlbG9nLCBzaG91bGQgYWxzbyBnbwotaGVyZS4gIEEgZ29vZCBleGFtcGxlIG9mIHN1Y2ggY29tbWVudHMgbWlnaHQgYmUgInBhdGNoIGNoYW5nZWxvZ3MiCitoZXJlLiAgQSBnb29kIGV4YW1wbGUgb2Ygc3VjaCBjb21tZW50cyBtaWdodCBiZSBgYHBhdGNoIGNoYW5nZWxvZ3NgYAogd2hpY2ggZGVzY3JpYmUgd2hhdCBoYXMgY2hhbmdlZCBiZXR3ZWVuIHRoZSB2MSBhbmQgdjIgdmVyc2lvbiBvZiB0aGUKIHBhdGNoLgogCi1JZiB5b3UgYXJlIGdvaW5nIHRvIGluY2x1ZGUgYSBkaWZmc3RhdCBhZnRlciB0aGUgIi0tLSIgbWFya2VyLCBwbGVhc2UKLXVzZSBkaWZmc3RhdCBvcHRpb25zICItcCAxIC13IDcwIiBzbyB0aGF0IGZpbGVuYW1lcyBhcmUgbGlzdGVkIGZyb20KK0lmIHlvdSBhcmUgZ29pbmcgdG8gaW5jbHVkZSBhIGBgZGlmZnN0YXRgYCBhZnRlciB0aGUgYGAtLS1gYCBtYXJrZXIsIHBsZWFzZQordXNlIGBgZGlmZnN0YXRgYCBvcHRpb25zIGBgLXAgMSAtdyA3MGBgIHNvIHRoYXQgZmlsZW5hbWVzIGFyZSBsaXN0ZWQgZnJvbQogdGhlIHRvcCBvZiB0aGUga2VybmVsIHNvdXJjZSB0cmVlIGFuZCBkb24ndCB1c2UgdG9vIG11Y2ggaG9yaXpvbnRhbAotc3BhY2UgKGVhc2lseSBmaXQgaW4gODAgY29sdW1ucywgbWF5YmUgd2l0aCBzb21lIGluZGVudGF0aW9uKS4gIChnaXQKK3NwYWNlIChlYXNpbHkgZml0IGluIDgwIGNvbHVtbnMsIG1heWJlIHdpdGggc29tZSBpbmRlbnRhdGlvbikuICAoYGBnaXRgYAogZ2VuZXJhdGVzIGFwcHJvcHJpYXRlIGRpZmZzdGF0cyBieSBkZWZhdWx0LikKIAogU2VlIG1vcmUgZGV0YWlscyBvbiB0aGUgcHJvcGVyIHBhdGNoIGZvcm1hdCBpbiB0aGUgZm9sbG93aW5nCiByZWZlcmVuY2VzLgogCisuLiBfZXhwbGljaXRfaW5fcmVwbHlfdG86CisKIDE1KSBFeHBsaWNpdCBJbi1SZXBseS1UbyBoZWFkZXJzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJdCBjYW4gYmUgaGVscGZ1bCB0byBtYW51YWxseSBhZGQgSW4tUmVwbHktVG86IGhlYWRlcnMgdG8gYSBwYXRjaAotKGUuZy4sIHdoZW4gdXNpbmcgImdpdCBzZW5kLWVtYWlsIikgdG8gYXNzb2NpYXRlIHRoZSBwYXRjaCB3aXRoCisoZS5nLiwgd2hlbiB1c2luZyBgYGdpdCBzZW5kLWVtYWlsYGApIHRvIGFzc29jaWF0ZSB0aGUgcGF0Y2ggd2l0aAogcHJldmlvdXMgcmVsZXZhbnQgZGlzY3Vzc2lvbiwgZS5nLiB0byBsaW5rIGEgYnVnIGZpeCB0byB0aGUgZW1haWwgd2l0aAogdGhlIGJ1ZyByZXBvcnQuICBIb3dldmVyLCBmb3IgYSBtdWx0aS1wYXRjaCBzZXJpZXMsIGl0IGlzIGdlbmVyYWxseQogYmVzdCB0byBhdm9pZCB1c2luZyBJbi1SZXBseS1UbzogdG8gbGluayB0byBvbGRlciB2ZXJzaW9ucyBvZiB0aGUKQEAgLTczMiwxMiArNzQ4LDEyIEBACiB0aGUgY292ZXIgZW1haWwgdGV4dCkgdG8gbGluayB0byBhbiBlYXJsaWVyIHZlcnNpb24gb2YgdGhlIHBhdGNoIHNlcmllcy4KIAogCi0xNikgU2VuZGluZyAiZ2l0IHB1bGwiIHJlcXVlc3RzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxNikgU2VuZGluZyBgYGdpdCBwdWxsYGAgcmVxdWVzdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJZiB5b3UgaGF2ZSBhIHNlcmllcyBvZiBwYXRjaGVzLCBpdCBtYXkgYmUgbW9zdCBjb252ZW5pZW50IHRvIGhhdmUgdGhlCiBtYWludGFpbmVyIHB1bGwgdGhlbSBkaXJlY3RseSBpbnRvIHRoZSBzdWJzeXN0ZW0gcmVwb3NpdG9yeSB3aXRoIGEKLSJnaXQgcHVsbCIgb3BlcmF0aW9uLiAgTm90ZSwgaG93ZXZlciwgdGhhdCBwdWxsaW5nIHBhdGNoZXMgZnJvbSBhIGRldmVsb3BlcgorYGBnaXQgcHVsbGBgIG9wZXJhdGlvbi4gIE5vdGUsIGhvd2V2ZXIsIHRoYXQgcHVsbGluZyBwYXRjaGVzIGZyb20gYSBkZXZlbG9wZXIKIHJlcXVpcmVzIGEgaGlnaGVyIGRlZ3JlZSBvZiB0cnVzdCB0aGFuIHRha2luZyBwYXRjaGVzIGZyb20gYSBtYWlsaW5nIGxpc3QuCiBBcyBhIHJlc3VsdCwgbWFueSBzdWJzeXN0ZW0gbWFpbnRhaW5lcnMgYXJlIHJlbHVjdGFudCB0byB0YWtlIHB1bGwKIHJlcXVlc3RzLCBlc3BlY2lhbGx5IGZyb20gbmV3LCB1bmtub3duIGRldmVsb3BlcnMuICBJZiBpbiBkb3VidCB5b3UgY2FuIHVzZQpAQCAtNzQ2LDcgKzc2Miw3IEBACiAKIEEgcHVsbCByZXF1ZXN0IHNob3VsZCBoYXZlIFtHSVRdIG9yIFtQVUxMXSBpbiB0aGUgc3ViamVjdCBsaW5lLiAgVGhlCiByZXF1ZXN0IGl0c2VsZiBzaG91bGQgaW5jbHVkZSB0aGUgcmVwb3NpdG9yeSBuYW1lIGFuZCB0aGUgYnJhbmNoIG9mCi1pbnRlcmVzdCBvbiBhIHNpbmdsZSBsaW5lOyBpdCBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZToKK2ludGVyZXN0IG9uIGEgc2luZ2xlIGxpbmU7IGl0IHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlOjoKIAogICBQbGVhc2UgcHVsbCBmcm9tCiAKQEAgLTc1NSwxMCArNzcxLDEwIEBACiAgIHRvIGdldCB0aGVzZSBjaGFuZ2VzOgogCiBBIHB1bGwgcmVxdWVzdCBzaG91bGQgYWxzbyBpbmNsdWRlIGFuIG92ZXJhbGwgbWVzc2FnZSBzYXlpbmcgd2hhdCB3aWxsIGJlCi1pbmNsdWRlZCBpbiB0aGUgcmVxdWVzdCwgYSAiZ2l0IHNob3J0bG9nIiBsaXN0aW5nIG9mIHRoZSBwYXRjaGVzCi10aGVtc2VsdmVzLCBhbmQgYSBkaWZmc3RhdCBzaG93aW5nIHRoZSBvdmVyYWxsIGVmZmVjdCBvZiB0aGUgcGF0Y2ggc2VyaWVzLgoraW5jbHVkZWQgaW4gdGhlIHJlcXVlc3QsIGEgYGBnaXQgc2hvcnRsb2dgYCBsaXN0aW5nIG9mIHRoZSBwYXRjaGVzCit0aGVtc2VsdmVzLCBhbmQgYSBgYGRpZmZzdGF0YGAgc2hvd2luZyB0aGUgb3ZlcmFsbCBlZmZlY3Qgb2YgdGhlIHBhdGNoIHNlcmllcy4KIFRoZSBlYXNpZXN0IHdheSB0byBnZXQgYWxsIHRoaXMgaW5mb3JtYXRpb24gdG9nZXRoZXIgaXMsIG9mIGNvdXJzZSwgdG8gbGV0Ci1naXQgZG8gaXQgZm9yIHlvdSB3aXRoIHRoZSAiZ2l0IHJlcXVlc3QtcHVsbCIgY29tbWFuZC4KK2BgZ2l0YGAgZG8gaXQgZm9yIHlvdSB3aXRoIHRoZSBgYGdpdCByZXF1ZXN0LXB1bGxgYCBjb21tYW5kLgogCiBTb21lIG1haW50YWluZXJzIChpbmNsdWRpbmcgTGludXMpIHdhbnQgdG8gc2VlIHB1bGwgcmVxdWVzdHMgZnJvbSBzaWduZWQKIGNvbW1pdHM7IHRoYXQgaW5jcmVhc2VzIHRoZWlyIGNvbmZpZGVuY2UgdGhhdCB0aGUgcmVxdWVzdCBhY3R1YWxseSBjYW1lCkBAIC03NzAsOCArNzg2LDggQEAKIG5ldyBkZXZlbG9wZXJzLCBidXQgdGhlcmUgaXMgbm8gd2F5IGFyb3VuZCBpdC4gIEF0dGVuZGluZyBjb25mZXJlbmNlcyBjYW4KIGJlIGEgZ29vZCB3YXkgdG8gZmluZCBkZXZlbG9wZXJzIHdobyBjYW4gc2lnbiB5b3VyIGtleS4KIAotT25jZSB5b3UgaGF2ZSBwcmVwYXJlZCBhIHBhdGNoIHNlcmllcyBpbiBnaXQgdGhhdCB5b3Ugd2lzaCB0byBoYXZlIHNvbWVib2R5Ci1wdWxsLCBjcmVhdGUgYSBzaWduZWQgdGFnIHdpdGggImdpdCB0YWcgLXMiLiAgVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyB0YWcKK09uY2UgeW91IGhhdmUgcHJlcGFyZWQgYSBwYXRjaCBzZXJpZXMgaW4gYGBnaXRgYCB0aGF0IHlvdSB3aXNoIHRvIGhhdmUgc29tZWJvZHkKK3B1bGwsIGNyZWF0ZSBhIHNpZ25lZCB0YWcgd2l0aCBgYGdpdCB0YWcgLXNgYC4gIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgdGFnCiBpZGVudGlmeWluZyB0aGUgbGFzdCBjb21taXQgaW4gdGhlIHNlcmllcyBhbmQgY29udGFpbmluZyBhIHNpZ25hdHVyZQogY3JlYXRlZCB3aXRoIHlvdXIgcHJpdmF0ZSBrZXkuICBZb3Ugd2lsbCBhbHNvIGhhdmUgdGhlIG9wcG9ydHVuaXR5IHRvIGFkZCBhCiBjaGFuZ2Vsb2ctc3R5bGUgbWVzc2FnZSB0byB0aGUgdGFnOyB0aGlzIGlzIGFuIGlkZWFsIHBsYWNlIHRvIGRlc2NyaWJlIHRoZQpAQCAtNzgyLDE0ICs3OTgsMTMgQEAKIHB1YmxpYyB0cmVlLgogCiBXaGVuIGdlbmVyYXRpbmcgeW91ciBwdWxsIHJlcXVlc3QsIHVzZSB0aGUgc2lnbmVkIHRhZyBhcyB0aGUgdGFyZ2V0LiAgQQotY29tbWFuZCBsaWtlIHRoaXMgd2lsbCBkbyB0aGUgdHJpY2s6Citjb21tYW5kIGxpa2UgdGhpcyB3aWxsIGRvIHRoZSB0cmljazo6CiAKICAgZ2l0IHJlcXVlc3QtcHVsbCBtYXN0ZXIgZ2l0Oi8vbXkucHVibGljLnRyZWUvbGludXguZ2l0IG15LXNpZ25lZC10YWcKIAogCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TRUNUSU9OIDIgLSBSRUZFUkVOQ0VTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSRUZFUkVOQ0VTCisqKioqKioqKioqCiAKIEFuZHJldyBNb3J0b24sICJUaGUgcGVyZmVjdCBwYXRjaCIgKHRwcCkuCiAgIDxodHRwOi8vd3d3Lm96bGFicy5vcmcvfmFrcG0vc3R1ZmYvdHBwLnR4dD4KQEAgLTc5OSwyMyArODE0LDI4IEBACiAKIEdyZWcgS3JvYWgtSGFydG1hbiwgIkhvdyB0byBwaXNzIG9mZiBhIGtlcm5lbCBzdWJzeXN0ZW0gbWFpbnRhaW5lciIuCiAgIDxodHRwOi8vd3d3Lmtyb2FoLmNvbS9sb2cvbGludXgvbWFpbnRhaW5lci5odG1sPgorCiAgIDxodHRwOi8vd3d3Lmtyb2FoLmNvbS9sb2cvbGludXgvbWFpbnRhaW5lci0wMi5odG1sPgorCiAgIDxodHRwOi8vd3d3Lmtyb2FoLmNvbS9sb2cvbGludXgvbWFpbnRhaW5lci0wMy5odG1sPgorCiAgIDxodHRwOi8vd3d3Lmtyb2FoLmNvbS9sb2cvbGludXgvbWFpbnRhaW5lci0wNC5odG1sPgorCiAgIDxodHRwOi8vd3d3Lmtyb2FoLmNvbS9sb2cvbGludXgvbWFpbnRhaW5lci0wNS5odG1sPgorCiAgIDxodHRwOi8vd3d3Lmtyb2FoLmNvbS9sb2cvbGludXgvbWFpbnRhaW5lci0wNi5odG1sPgogCiBOTyEhISEgTm8gbW9yZSBodWdlIHBhdGNoIGJvbWJzIHRvIGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcgcGVvcGxlIQogICA8aHR0cHM6Ly9sa21sLm9yZy9sa21sLzIwMDUvNy8xMS8zMzY+CiAKIEtlcm5lbCBEb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlOgotICA8RG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZT4KKyAgOnJlZjpgRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZSA8Y29kaW5nc3R5bGU+YAogCiBMaW51cyBUb3J2YWxkcydzIG1haWwgb24gdGhlIGNhbm9uaWNhbCBwYXRjaCBmb3JtYXQ6CiAgIDxodHRwOi8vbGttbC5vcmcvbGttbC8yMDA1LzQvNy8xODM+CiAKIEFuZGkgS2xlZW4sICJPbiBzdWJtaXR0aW5nIGtlcm5lbCBwYXRjaGVzIgogICBTb21lIHN0cmF0ZWdpZXMgdG8gZ2V0IGRpZmZpY3VsdCBvciBjb250cm92ZXJzaWFsIGNoYW5nZXMgaW4uCisKICAgaHR0cDovL2hhbG9iYXRlcy5kZS9vbi1zdWJtaXR0aW5nLXBhdGNoZXMucGRmCiAKLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FjcGkvYWNwaS1saWQudHh0IGIvRG9jdW1lbnRhdGlvbi9hY3BpL2FjcGktbGlkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmZlN2FmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9hY3BpL2FjcGktbGlkLnR4dApAQCAtMCwwICsxLDk2IEBACitTcGVjaWFsIFVzYWdlIE1vZGVsIG9mIHRoZSBBQ1BJIENvbnRyb2wgTWV0aG9kIExpZCBEZXZpY2UKKworQ29weXJpZ2h0IChDKSAyMDE2LCBJbnRlbCBDb3Jwb3JhdGlvbgorQXV0aG9yOiBMdiBaaGVuZyA8bHYuemhlbmdAaW50ZWwuY29tPgorCisKK0Fic3RyYWN0OgorCitQbGF0Zm9ybXMgY29udGFpbmluZyBsaWRzIGNvbnZleSBsaWQgc3RhdGUgKG9wZW4vY2xvc2UpIHRvIE9TUE1zIHVzaW5nIGEKK2NvbnRyb2wgbWV0aG9kIGxpZCBkZXZpY2UuIFRvIGltcGxlbWVudCB0aGlzLCB0aGUgQU1MIHRhYmxlcyBpc3N1ZQorTm90aWZ5KGxpZF9kZXZpY2UsIDB4ODApIHRvIG5vdGlmeSB0aGUgT1NQTXMgd2hlbmV2ZXIgdGhlIGxpZCBzdGF0ZSBoYXMKK2NoYW5nZWQuIFRoZSBfTElEIGNvbnRyb2wgbWV0aG9kIGZvciB0aGUgbGlkIGRldmljZSBtdXN0IGJlIGltcGxlbWVudGVkIHRvCityZXBvcnQgdGhlICJjdXJyZW50IiBzdGF0ZSBvZiB0aGUgbGlkIGFzIGVpdGhlciAib3BlbmVkIiBvciAiY2xvc2VkIi4KKworRm9yIG1vc3QgcGxhdGZvcm1zLCBib3RoIHRoZSBfTElEIG1ldGhvZCBhbmQgdGhlIGxpZCBub3RpZmljYXRpb25zIGFyZQorcmVsaWFibGUuIEhvd2V2ZXIsIHRoZXJlIGFyZSBleGNlcHRpb25zLiBJbiBvcmRlciB0byB3b3JrIHdpdGggdGhlc2UKK2V4Y2VwdGlvbmFsIGJ1Z2d5IHBsYXRmb3Jtcywgc3BlY2lhbCByZXN0cmljdGlvbnMgYW5kIGV4cGVjdGlvbnMgc2hvdWxkIGJlCit0YWtlbiBpbnRvIGFjY291bnQuIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSByZXN0cmljdGlvbnMgYW5kIHRoZQorZXhwZWN0aW9ucyBvZiB0aGUgTGludXggQUNQSSBsaWQgZGV2aWNlIGRyaXZlci4KKworCisxLiBSZXN0cmljdGlvbnMgb2YgdGhlIHJldHVybmluZyB2YWx1ZSBvZiB0aGUgX0xJRCBjb250cm9sIG1ldGhvZAorCitUaGUgX0xJRCBjb250cm9sIG1ldGhvZCBpcyBkZXNjcmliZWQgdG8gcmV0dXJuIHRoZSAiY3VycmVudCIgbGlkIHN0YXRlLgorSG93ZXZlciB0aGUgd29yZCBvZiAiY3VycmVudCIgaGFzIGFtYmlndWl0eSwgc29tZSBidWdneSBBTUwgdGFibGVzIHJldHVybgordGhlIGxpZCBzdGF0ZSB1cG9uIHRoZSBsYXN0IGxpZCBub3RpZmljYXRpb24gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIGxpZAorc3RhdGUgdXBvbiB0aGUgbGFzdCBfTElEIGV2YWx1YXRpb24uIFRoZXJlIHdvbid0IGJlIGRpZmZlcmVuY2Ugd2hlbiB0aGUKK19MSUQgY29udHJvbCBtZXRob2QgaXMgZXZhbHVhdGVkIGR1cmluZyB0aGUgcnVudGltZSwgdGhlIHByb2JsZW0gaXMgaXRzCitpbml0aWFsIHJldHVybmluZyB2YWx1ZS4gV2hlbiB0aGUgQU1MIHRhYmxlcyBpbXBsZW1lbnQgdGhpcyBjb250cm9sIG1ldGhvZAord2l0aCBjYWNoZWQgdmFsdWUsIHRoZSBpbml0aWFsIHJldHVybmluZyB2YWx1ZSBpcyBsaWtlbHkgbm90IHJlbGlhYmxlLgorVGhlcmUgYXJlIHBsYXRmb3JtcyBhbHdheXMgcmV0dW4gImNsb3NlZCIgYXMgaW5pdGlhbCBsaWQgc3RhdGUuCisKKzIuIFJlc3RyaWN0aW9ucyBvZiB0aGUgbGlkIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb25zCisKK1RoZXJlIGFyZSBidWdneSBBTUwgdGFibGVzIG5ldmVyIG5vdGlmeWluZyB3aGVuIHRoZSBsaWQgZGV2aWNlIHN0YXRlIGlzCitjaGFuZ2VkIHRvICJvcGVuZWQiLiBUaHVzIHRoZSAib3BlbmVkIiBub3RpZmljYXRpb24gaXMgbm90IGd1YXJhbnRlZWQuIEJ1dAoraXQgaXMgZ3VhcmFudGVlZCB0aGF0IHRoZSBBTUwgdGFibGVzIGFsd2F5cyBub3RpZnkgImNsb3NlZCIgd2hlbiB0aGUgbGlkCitzdGF0ZSBpcyBjaGFuZ2VkIHRvICJjbG9zZWQiLiBUaGUgImNsb3NlZCIgbm90aWZpY2F0aW9uIGlzIG5vcm1hbGx5IHVzZWQgdG8KK3RyaWdnZXIgc29tZSBzeXN0ZW0gcG93ZXIgc2F2aW5nIG9wZXJhdGlvbnMgb24gV2luZG93cy4gU2luY2UgaXQgaXMgZnVsbHkKK3Rlc3RlZCwgaXQgaXMgcmVsaWFibGUgZnJvbSBhbGwgQU1MIHRhYmxlcy4KKworMy4gRXhwZWN0aW9ucyBmb3IgdGhlIHVzZXJzcGFjZSB1c2VycyBvZiB0aGUgQUNQSSBsaWQgZGV2aWNlIGRyaXZlcgorCitUaGUgQUNQSSBidXR0b24gZHJpdmVyIGV4cG9ydHMgdGhlIGxpZCBzdGF0ZSB0byB0aGUgdXNlcnNwYWNlIHZpYSB0aGUKK2ZvbGxvd2luZyBmaWxlOgorICAvcHJvYy9hY3BpL2J1dHRvbi9saWQvTElEMC9zdGF0ZQorVGhpcyBmaWxlIGFjdHVhbGx5IGNhbGxzIHRoZSBfTElEIGNvbnRyb2wgbWV0aG9kIGRlc2NyaWJlZCBhYm92ZS4gQW5kIGdpdmVuCit0aGUgcHJldmlvdXMgZXhwbGFuYXRpb24sIGl0IGlzIG5vdCByZWxpYWJsZSBlbm91Z2ggb24gc29tZSBwbGF0Zm9ybXMuIFNvCitpdCBpcyBhZHZpc2VkIGZvciB0aGUgdXNlcnNwYWNlIHByb2dyYW0gdG8gbm90IHRvIHNvbGVseSByZWx5IG9uIHRoaXMgZmlsZQordG8gZGV0ZXJtaW5lIHRoZSBhY3R1YWwgbGlkIHN0YXRlLgorCitUaGUgQUNQSSBidXR0b24gZHJpdmVyIGVtaXRzIHRoZSBmb2xsb3dpbmcgaW5wdXQgZXZlbnQgdG8gdGhlIHVzZXJzcGFjZToKKyAgU1dfTElECitUaGUgQUNQSSBsaWQgZGV2aWNlIGRyaXZlciBpcyBpbXBsZW1lbnRlZCB0byB0cnkgdG8gZGVsaXZlciB0aGUgcGxhdGZvcm0KK3RyaWdnZXJlZCBldmVudHMgdG8gdGhlIHVzZXJzcGFjZS4gSG93ZXZlciwgZ2l2ZW4gdGhlIGZhY3QgdGhhdCB0aGUgYnVnZ3kKK2Zpcm13YXJlIGNhbm5vdCBtYWtlIHN1cmUgIm9wZW5lZCIvImNsb3NlZCIgZXZlbnRzIGFyZSBwYWlyZWQsIHRoZSBBQ1BJCitidXR0b24gZHJpdmVyIHVzZXMgdGhlIGZvbGxvd2luZyAzIG1vZGVzIGluIG9yZGVyIG5vdCB0byB0cmlnZ2VyIGlzc3Vlcy4KKworSWYgdGhlIHVzZXJzcGFjZSBoYXNuJ3QgYmVlbiBwcmVwYXJlZCB0byBpZ25vcmUgdGhlIHVucmVsaWFibGUgIm9wZW5lZCIKK2V2ZW50cyBhbmQgdGhlIHVucmVsaWFibGUgaW5pdGlhbCBzdGF0ZSBub3RpZmljYXRpb24sIExpbnV4IHVzZXJzIGNhbiB1c2UKK3RoZSBmb2xsb3dpbmcga2VybmVsIHBhcmFtZXRlcnMgdG8gaGFuZGxlIHRoZSBwb3NzaWJsZSBpc3N1ZXM6CitBLiBidXR0b24ubGlkX2luaXRfc3RhdGU9bWV0aG9kOgorICAgV2hlbiB0aGlzIG9wdGlvbiBpcyBzcGVjaWZpZWQsIHRoZSBBQ1BJIGJ1dHRvbiBkcml2ZXIgcmVwb3J0cyB0aGUKKyAgIGluaXRpYWwgbGlkIHN0YXRlIHVzaW5nIHRoZSByZXR1cm5pbmcgdmFsdWUgb2YgdGhlIF9MSUQgY29udHJvbCBtZXRob2QKKyAgIGFuZCB3aGV0aGVyIHRoZSAib3BlbmVkIi8iY2xvc2VkIiBldmVudHMgYXJlIHBhaXJlZCBmdWxseSByZWxpZXMgb24gdGhlCisgICBmaXJtd2FyZSBpbXBsZW1lbnRhdGlvbi4KKyAgIFRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIGZpeCBzb21lIHBsYXRmb3JtcyB3aGVyZSB0aGUgcmV0dXJuaW5nIHZhbHVlCisgICBvZiB0aGUgX0xJRCBjb250cm9sIG1ldGhvZCBpcyByZWxpYWJsZSBidXQgdGhlIGluaXRpYWwgbGlkIHN0YXRlCisgICBub3RpZmljYXRpb24gaXMgbWlzc2luZy4KKyAgIFRoaXMgb3B0aW9uIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGR1cmluZyB0aGUgcGVyaW9kIHRoZSB1c2Vyc3BhY2UKKyAgIGlzbid0IHJlYWR5IHRvIGhhbmRsZSB0aGUgYnVnZ3kgQU1MIHRhYmxlcy4KK0IuIGJ1dHRvbi5saWRfaW5pdF9zdGF0ZT1vcGVuOgorICAgV2hlbiB0aGlzIG9wdGlvbiBpcyBzcGVjaWZpZWQsIHRoZSBBQ1BJIGJ1dHRvbiBkcml2ZXIgYWx3YXlzIHJlcG9ydHMgdGhlCisgICBpbml0aWFsIGxpZCBzdGF0ZSBhcyAib3BlbmVkIiBhbmQgd2hldGhlciB0aGUgIm9wZW5lZCIvImNsb3NlZCIgZXZlbnRzCisgICBhcmUgcGFpcmVkIGZ1bGx5IHJlbGllcyBvbiB0aGUgZmlybXdhcmUgaW1wbGVtZW50YXRpb24uCisgICBUaGlzIG1heSBmaXggc29tZSBwbGF0Zm9ybXMgd2hlcmUgdGhlIHJldHVybmluZyB2YWx1ZSBvZiB0aGUgX0xJRAorICAgY29udHJvbCBtZXRob2QgaXMgbm90IHJlbGlhYmxlIGFuZCB0aGUgaW5pdGlhbCBsaWQgc3RhdGUgbm90aWZpY2F0aW9uIGlzCisgICBtaXNzaW5nLgorCitJZiB0aGUgdXNlcnNwYWNlIGhhcyBiZWVuIHByZXBhcmVkIHRvIGlnbm9yZSB0aGUgdW5yZWxpYWJsZSAib3BlbmVkIiBldmVudHMKK2FuZCB0aGUgdW5yZWxpYWJsZSBpbml0aWFsIHN0YXRlIG5vdGlmaWNhdGlvbiwgTGludXggdXNlcnMgc2hvdWxkIGFsd2F5cwordXNlIHRoZSBmb2xsb3dpbmcga2VybmVsIHBhcmFtZXRlcjoKK0MuIGJ1dHRvbi5saWRfaW5pdF9zdGF0ZT1pZ25vcmU6CisgICBXaGVuIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCwgdGhlIEFDUEkgYnV0dG9uIGRyaXZlciBuZXZlciByZXBvcnRzIHRoZQorICAgaW5pdGlhbCBsaWQgc3RhdGUgYW5kIHRoZXJlIGlzIGEgY29tcGVuc2F0aW9uIG1lY2hhbmlzbSBpbXBsZW1lbnRlZCB0bworICAgZW5zdXJlIHRoYXQgdGhlIHJlbGlhYmxlICJjbG9zZWQiIG5vdGlmaWNhdGlvbnMgY2FuIGFsd2F5cyBiZSBkZWxpZXZlcmVkCisgICB0byB0aGUgdXNlcnNwYWNlIGJ5IGFsd2F5cyBwYWlyaW5nICJjbG9zZWQiIGlucHV0IGV2ZW50cyB3aXRoIGNvbXBsZW1lbnQKKyAgICJvcGVuZWQiIGlucHV0IGV2ZW50cy4gQnV0IHRoZXJlIGlzIHN0aWxsIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSAib3BlbmVkIgorICAgbm90aWZpY2F0aW9ucyBjYW4gYmUgZGVsaXZlcmVkIHRvIHRoZSB1c2Vyc3BhY2Ugd2hlbiB0aGUgbGlkIGlzIGFjdHVhbGx5CisgICBvcGVucyBnaXZlbiB0aGF0IHNvbWUgQU1MIHRhYmxlcyBkbyBub3Qgc2VuZCAib3BlbmVkIiBub3RpZmljYXRpb25zCisgICByZWxpYWJseS4KKyAgIEluIHRoaXMgbW9kZSwgaWYgZXZlcnl0aGluZyBpcyBjb3JyZWN0bHkgaW1wbGVtZW50ZWQgYnkgdGhlIHBsYXRmb3JtCisgICBmaXJtd2FyZSwgdGhlIG9sZCB1c2Vyc3BhY2UgcHJvZ3JhbXMgc2hvdWxkIHN0aWxsIHdvcmsuIE90aGVyd2lzZSwgdGhlCisgICBuZXcgdXNlcnNwYWNlIHByb2dyYW1zIGFyZSByZXF1aXJlZCB0byB3b3JrIHdpdGggdGhlIEFDUEkgYnV0dG9uIGRyaXZlci4KKyAgIFRoaXMgb3B0aW9uIHdpbGwgYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYWZ0ZXIgdGhlIHVzZXJzcGFjZSBpcyByZWFkeSB0bworICAgaGFuZGxlIHRoZSBidWdneSBBTUwgdGFibGVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hY3BpL2dwaW8tcHJvcGVydGllcy50eHQgYi9Eb2N1bWVudGF0aW9uL2FjcGkvZ3Bpby1wcm9wZXJ0aWVzLnR4dAppbmRleCBmMzVkYWQxLi41YWFmZTBiMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hY3BpL2dwaW8tcHJvcGVydGllcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hY3BpL2dwaW8tcHJvcGVydGllcy50eHQKQEAgLTI4LDggKzI4LDggQEAKICAgICAgICAgICBUb1VVSUQoImRhZmZkODE0LTZlYmEtNGQ4Yy04YTkxLWJjOWJiZjRhYTMwMSIpLAogICAgICAgICAgIFBhY2thZ2UgKCkKIAkgIHsKLSAgICAgICAgICAgICAgUGFja2FnZSAoKSB7InJlc2V0LWdwaW8iLCBQYWNrYWdlKCkge15CVEgsIDEsIDEsIDAgfX0sCi0gICAgICAgICAgICAgIFBhY2thZ2UgKCkgeyJzaHV0ZG93bi1ncGlvIiwgUGFja2FnZSgpIHteQlRILCAwLCAwLCAwIH19LAorICAgICAgICAgICAgICBQYWNrYWdlICgpIHsicmVzZXQtZ3Bpb3MiLCBQYWNrYWdlKCkge15CVEgsIDEsIDEsIDAgfX0sCisgICAgICAgICAgICAgIFBhY2thZ2UgKCkgeyJzaHV0ZG93bi1ncGlvcyIsIFBhY2thZ2UoKSB7XkJUSCwgMCwgMCwgMCB9fSwKICAgICAgICAgICB9CiAgICAgICB9KQogICB9CkBAIC00OCw3ICs0OCw3IEBACiBhY3RpdmUgbG93IG9yIGhpZ2gsIHRoZSAiYWN0aXZlX2xvdyIgYXJndW1lbnQgY2FuIGJlIHVzZWQgaGVyZS4gIFNldHRpbmcKIGl0IHRvIDEgbWFya3MgdGhlIEdQSU8gYXMgYWN0aXZlIGxvdy4KIAotSW4gb3VyIEJsdWV0b290aCBleGFtcGxlIHRoZSAicmVzZXQtZ3BpbyIgcmVmZXJzIHRvIHRoZSBzZWNvbmQgR3Bpb0lvKCkKK0luIG91ciBCbHVldG9vdGggZXhhbXBsZSB0aGUgInJlc2V0LWdwaW9zIiByZWZlcnMgdG8gdGhlIHNlY29uZCBHcGlvSW8oKQogcmVzb3VyY2UsIHNlY29uZCBwaW4gaW4gdGhhdCByZXNvdXJjZSB3aXRoIHRoZSBHUElPIG51bWJlciBvZiAzMS4KIAogQUNQSSBHUElPIE1hcHBpbmdzIFByb3ZpZGVkIGJ5IERyaXZlcnMKQEAgLTgzLDggKzgzLDggQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9ncGlvX3BhcmFtcyBzaHV0ZG93bl9ncGlvID0geyAwLCAwLCBmYWxzZSB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZ3Bpb19tYXBwaW5nIGJsdWV0b290aF9hY3BpX2dwaW9zW10gPSB7Ci0gIHsgInJlc2V0LWdwaW8iLCAmcmVzZXRfZ3BpbywgMSB9LAotICB7ICJzaHV0ZG93bi1ncGlvIiwgJnNodXRkb3duX2dwaW8sIDEgfSwKKyAgeyAicmVzZXQtZ3Bpb3MiLCAmcmVzZXRfZ3BpbywgMSB9LAorICB7ICJzaHV0ZG93bi1ncGlvcyIsICZzaHV0ZG93bl9ncGlvLCAxIH0sCiAgIHsgfSwKIH07CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXBwbHlpbmctcGF0Y2hlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2FwcGx5aW5nLXBhdGNoZXMudHh0CmluZGV4IDc3ZGY1NWIuLjAyY2U0OTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYXBwbHlpbmctcGF0Y2hlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hcHBseWluZy1wYXRjaGVzLnR4dApAQCAtMSw5ICsxLDEzIEBACisuLiBfYXBwbHlpbmdfcGF0Y2hlczoKIAotCUFwcGx5aW5nIFBhdGNoZXMgVG8gVGhlIExpbnV4IEtlcm5lbAotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQXBwbHlpbmcgUGF0Y2hlcyBUbyBUaGUgTGludXggS2VybmVsCisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIAotCU9yaWdpbmFsIGJ5OiBKZXNwZXIgSnVobCwgQXVndXN0IDIwMDUKLQlMYXN0IHVwZGF0ZTogMjAwNi0wMS0wNQorT3JpZ2luYWwgYnk6CisJSmVzcGVyIEp1aGwsIEF1Z3VzdCAyMDA1CisKK0xhc3QgdXBkYXRlOgorCTIwMTYtMDktMTQKIAogCiBBIGZyZXF1ZW50bHkgYXNrZWQgcXVlc3Rpb24gb24gdGhlIExpbnV4IEtlcm5lbCBNYWlsaW5nIExpc3QgaXMgaG93IHRvIGFwcGx5CkBAIC0xNywxMCArMjEsMTIgQEAKIAogCiBXaGF0IGlzIGEgcGF0Y2g/Ci0tLS0KLSBBIHBhdGNoIGlzIGEgc21hbGwgdGV4dCBkb2N1bWVudCBjb250YWluaW5nIGEgZGVsdGEgb2YgY2hhbmdlcyBiZXR3ZWVuIHR3bwotZGlmZmVyZW50IHZlcnNpb25zIG9mIGEgc291cmNlIHRyZWUuIFBhdGNoZXMgYXJlIGNyZWF0ZWQgd2l0aCB0aGUgYGRpZmYnCis9PT09PT09PT09PT09PT09CisKK0EgcGF0Y2ggaXMgYSBzbWFsbCB0ZXh0IGRvY3VtZW50IGNvbnRhaW5pbmcgYSBkZWx0YSBvZiBjaGFuZ2VzIGJldHdlZW4gdHdvCitkaWZmZXJlbnQgdmVyc2lvbnMgb2YgYSBzb3VyY2UgdHJlZS4gUGF0Y2hlcyBhcmUgY3JlYXRlZCB3aXRoIHRoZSBgYGRpZmZgYAogcHJvZ3JhbS4KKwogVG8gY29ycmVjdGx5IGFwcGx5IGEgcGF0Y2ggeW91IG5lZWQgdG8ga25vdyB3aGF0IGJhc2UgaXQgd2FzIGdlbmVyYXRlZCBmcm9tCiBhbmQgd2hhdCBuZXcgdmVyc2lvbiB0aGUgcGF0Y2ggd2lsbCBjaGFuZ2UgdGhlIHNvdXJjZSB0cmVlIGludG8uIFRoZXNlCiBzaG91bGQgYm90aCBiZSBwcmVzZW50IGluIHRoZSBwYXRjaCBmaWxlIG1ldGFkYXRhIG9yIGJlIHBvc3NpYmxlIHRvIGRlZHVjZQpAQCAtMjgsOCArMzQsOSBAQAogCiAKIEhvdyBkbyBJIGFwcGx5IG9yIHJldmVydCBhIHBhdGNoPwotLS0tCi0gWW91IGFwcGx5IGEgcGF0Y2ggd2l0aCB0aGUgYHBhdGNoJyBwcm9ncmFtLiBUaGUgcGF0Y2ggcHJvZ3JhbSByZWFkcyBhIGRpZmYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitZb3UgYXBwbHkgYSBwYXRjaCB3aXRoIHRoZSBgYHBhdGNoYGAgcHJvZ3JhbS4gVGhlIHBhdGNoIHByb2dyYW0gcmVhZHMgYSBkaWZmCiAob3IgcGF0Y2gpIGZpbGUgYW5kIG1ha2VzIHRoZSBjaGFuZ2VzIHRvIHRoZSBzb3VyY2UgdHJlZSBkZXNjcmliZWQgaW4gaXQuCiAKIFBhdGNoZXMgZm9yIHRoZSBMaW51eCBrZXJuZWwgYXJlIGdlbmVyYXRlZCByZWxhdGl2ZSB0byB0aGUgcGFyZW50IGRpcmVjdG9yeQpAQCAtMzgsMjYgKzQ1LDMzIEBACiBUaGlzIG1lYW5zIHRoYXQgcGF0aHMgdG8gZmlsZXMgaW5zaWRlIHRoZSBwYXRjaCBmaWxlIGNvbnRhaW4gdGhlIG5hbWUgb2YgdGhlCiBrZXJuZWwgc291cmNlIGRpcmVjdG9yaWVzIGl0IHdhcyBnZW5lcmF0ZWQgYWdhaW5zdCAob3Igc29tZSBvdGhlciBkaXJlY3RvcnkKIG5hbWVzIGxpa2UgImEvIiBhbmQgImIvIikuCisKIFNpbmNlIHRoaXMgaXMgdW5saWtlbHkgdG8gbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIGtlcm5lbCBzb3VyY2UgZGlyIG9uIHlvdXIKIGxvY2FsIG1hY2hpbmUgKGJ1dCBpcyBvZnRlbiB1c2VmdWwgaW5mbyB0byBzZWUgd2hhdCB2ZXJzaW9uIGFuIG90aGVyd2lzZQogdW5sYWJlbGVkIHBhdGNoIHdhcyBnZW5lcmF0ZWQgYWdhaW5zdCkgeW91IHNob3VsZCBjaGFuZ2UgaW50byB5b3VyIGtlcm5lbAogc291cmNlIGRpcmVjdG9yeSBhbmQgdGhlbiBzdHJpcCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgcGF0aCBmcm9tIGZpbGVuYW1lcwotaW4gdGhlIHBhdGNoIGZpbGUgd2hlbiBhcHBseWluZyBpdCAodGhlIC1wMSBhcmd1bWVudCB0byBgcGF0Y2gnIGRvZXMgdGhpcykuCitpbiB0aGUgcGF0Y2ggZmlsZSB3aGVuIGFwcGx5aW5nIGl0ICh0aGUgYGAtcDFgYCBhcmd1bWVudCB0byBgYHBhdGNoYGAgZG9lcwordGhpcykuCiAKIFRvIHJldmVydCBhIHByZXZpb3VzbHkgYXBwbGllZCBwYXRjaCwgdXNlIHRoZSAtUiBhcmd1bWVudCB0byBwYXRjaC4KLVNvLCBpZiB5b3UgYXBwbGllZCBhIHBhdGNoIGxpa2UgdGhpczoKK1NvLCBpZiB5b3UgYXBwbGllZCBhIHBhdGNoIGxpa2UgdGhpczo6CisKIAlwYXRjaCAtcDEgPCAuLi9wYXRjaC14LnkuegogCi1Zb3UgY2FuIHJldmVydCAodW5kbykgaXQgbGlrZSB0aGlzOgorWW91IGNhbiByZXZlcnQgKHVuZG8pIGl0IGxpa2UgdGhpczo6CisKIAlwYXRjaCAtUiAtcDEgPCAuLi9wYXRjaC14LnkuegogCiAKLUhvdyBkbyBJIGZlZWQgYSBwYXRjaC9kaWZmIGZpbGUgdG8gYHBhdGNoJz8KLS0tLQotIFRoaXMgKGFzIHVzdWFsIHdpdGggTGludXggYW5kIG90aGVyIFVOSVggbGlrZSBvcGVyYXRpbmcgc3lzdGVtcykgY2FuIGJlCitIb3cgZG8gSSBmZWVkIGEgcGF0Y2gvZGlmZiBmaWxlIHRvIGBgcGF0Y2hgYD8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIChhcyB1c3VhbCB3aXRoIExpbnV4IGFuZCBvdGhlciBVTklYIGxpa2Ugb3BlcmF0aW5nIHN5c3RlbXMpIGNhbiBiZQogZG9uZSBpbiBzZXZlcmFsIGRpZmZlcmVudCB3YXlzLgorCiBJbiBhbGwgdGhlIGV4YW1wbGVzIGJlbG93IEkgZmVlZCB0aGUgZmlsZSAoaW4gdW5jb21wcmVzc2VkIGZvcm0pIHRvIHBhdGNoCi12aWEgc3RkaW4gdXNpbmcgdGhlIGZvbGxvd2luZyBzeW50YXg6Cit2aWEgc3RkaW4gdXNpbmcgdGhlIGZvbGxvd2luZyBzeW50YXg6OgorCiAJcGF0Y2ggLXAxIDwgcGF0aC90by9wYXRjaC14LnkuegogCiBJZiB5b3UganVzdCB3YW50IHRvIGJlIGFibGUgdG8gZm9sbG93IHRoZSBleGFtcGxlcyBiZWxvdyBhbmQgZG9uJ3Qgd2FudCB0bwpAQCAtNjUsMzUgKzc5LDQwIEBACiBzZWN0aW9uIGhlcmUuCiAKIFBhdGNoIGNhbiBhbHNvIGdldCB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byB1c2UgdmlhIHRoZSAtaSBhcmd1bWVudCwgbGlrZQotdGhpczoKK3RoaXM6OgorCiAJcGF0Y2ggLXAxIC1pIHBhdGgvdG8vcGF0Y2gteC55LnoKIAotSWYgeW91ciBwYXRjaCBmaWxlIGlzIGNvbXByZXNzZWQgd2l0aCBnemlwIG9yIGJ6aXAyIGFuZCB5b3UgZG9uJ3Qgd2FudCB0bworSWYgeW91ciBwYXRjaCBmaWxlIGlzIGNvbXByZXNzZWQgd2l0aCBnemlwIG9yIHh6IGFuZCB5b3UgZG9uJ3Qgd2FudCB0bwogdW5jb21wcmVzcyBpdCBiZWZvcmUgYXBwbHlpbmcgaXQsIHRoZW4geW91IGNhbiBmZWVkIGl0IHRvIHBhdGNoIGxpa2UgdGhpcwotaW5zdGVhZDoKLQl6Y2F0IHBhdGgvdG8vcGF0Y2gteC55LnouZ3ogfCBwYXRjaCAtcDEKLQliemNhdCBwYXRoL3RvL3BhdGNoLXgueS56LmJ6MiB8IHBhdGNoIC1wMQoraW5zdGVhZDo6CisKKwl4emNhdCBwYXRoL3RvL3BhdGNoLXgueS56Lnh6IHwgcGF0Y2ggLXAxCisJYnpjYXQgcGF0aC90by9wYXRjaC14Lnkuei5neiB8IHBhdGNoIC1wMQogCiBJZiB5b3Ugd2lzaCB0byB1bmNvbXByZXNzIHRoZSBwYXRjaCBmaWxlIGJ5IGhhbmQgZmlyc3QgYmVmb3JlIGFwcGx5aW5nIGl0CiAod2hhdCBJIGFzc3VtZSB5b3UndmUgZG9uZSBpbiB0aGUgZXhhbXBsZXMgYmVsb3cpLCB0aGVuIHlvdSBzaW1wbHkgcnVuCi1ndW56aXAgb3IgYnVuemlwMiBvbiB0aGUgZmlsZSAtLSBsaWtlIHRoaXM6CitndW56aXAgb3IgeHogb24gdGhlIGZpbGUgLS0gbGlrZSB0aGlzOjoKKwogCWd1bnppcCBwYXRjaC14Lnkuei5negotCWJ1bnppcDIgcGF0Y2gteC55LnouYnoyCisJeHogLWQgcGF0Y2gteC55LnoueHoKIAogV2hpY2ggd2lsbCBsZWF2ZSB5b3Ugd2l0aCBhIHBsYWluIHRleHQgcGF0Y2gteC55LnogZmlsZSB0aGF0IHlvdSBjYW4gZmVlZCB0bwotcGF0Y2ggdmlhIHN0ZGluIG9yIHRoZSAtaSBhcmd1bWVudCwgYXMgeW91IHByZWZlci4KK3BhdGNoIHZpYSBzdGRpbiBvciB0aGUgYGAtaWBgIGFyZ3VtZW50LCBhcyB5b3UgcHJlZmVyLgogCi1BIGZldyBvdGhlciBuaWNlIGFyZ3VtZW50cyBmb3IgcGF0Y2ggYXJlIC1zIHdoaWNoIGNhdXNlcyBwYXRjaCB0byBiZSBzaWxlbnQKK0EgZmV3IG90aGVyIG5pY2UgYXJndW1lbnRzIGZvciBwYXRjaCBhcmUgYGAtc2BgIHdoaWNoIGNhdXNlcyBwYXRjaCB0byBiZSBzaWxlbnQKIGV4Y2VwdCBmb3IgZXJyb3JzIHdoaWNoIGlzIG5pY2UgdG8gcHJldmVudCBlcnJvcnMgZnJvbSBzY3JvbGxpbmcgb3V0IG9mIHRoZQotc2NyZWVuIHRvbyBmYXN0LCBhbmQgLS1kcnktcnVuIHdoaWNoIGNhdXNlcyBwYXRjaCB0byBqdXN0IHByaW50IGEgbGlzdGluZyBvZgotd2hhdCB3b3VsZCBoYXBwZW4sIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IG1ha2UgYW55IGNoYW5nZXMuIEZpbmFsbHkgLS12ZXJib3NlCitzY3JlZW4gdG9vIGZhc3QsIGFuZCBgYC0tZHJ5LXJ1bmBgIHdoaWNoIGNhdXNlcyBwYXRjaCB0byBqdXN0IHByaW50IGEgbGlzdGluZyBvZgord2hhdCB3b3VsZCBoYXBwZW4sIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IG1ha2UgYW55IGNoYW5nZXMuIEZpbmFsbHkgYGAtLXZlcmJvc2VgYAogdGVsbHMgcGF0Y2ggdG8gcHJpbnQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgd29yayBiZWluZyBkb25lLgogCiAKIENvbW1vbiBlcnJvcnMgd2hlbiBwYXRjaGluZwotLS0tCi0gV2hlbiBwYXRjaCBhcHBsaWVzIGEgcGF0Y2ggZmlsZSBpdCBhdHRlbXB0cyB0byB2ZXJpZnkgdGhlIHNhbml0eSBvZiB0aGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXaGVuIHBhdGNoIGFwcGxpZXMgYSBwYXRjaCBmaWxlIGl0IGF0dGVtcHRzIHRvIHZlcmlmeSB0aGUgc2FuaXR5IG9mIHRoZQogZmlsZSBpbiBkaWZmZXJlbnQgd2F5cy4KKwogQ2hlY2tpbmcgdGhhdCB0aGUgZmlsZSBsb29rcyBsaWtlIGEgdmFsaWQgcGF0Y2ggZmlsZSBhbmQgY2hlY2tpbmcgdGhlIGNvZGUKIGFyb3VuZCB0aGUgYml0cyBiZWluZyBtb2RpZmllZCBtYXRjaGVzIHRoZSBjb250ZXh0IHByb3ZpZGVkIGluIHRoZSBwYXRjaCBhcmUKIGp1c3QgdHdvIG9mIHRoZSBiYXNpYyBzYW5pdHkgY2hlY2tzIHBhdGNoIGRvZXMuCkBAIC0xMTEsMTMgKzEzMCwxMyBAQAogdXN1YWxseSBhZGp1c3QgdGhlIGxpbmUgbnVtYmVycyBhbmQgYXBwbHkgdGhlIHBhdGNoLgogCiBXaGVuZXZlciBwYXRjaCBhcHBsaWVzIGEgcGF0Y2ggdGhhdCBpdCBoYWQgdG8gbW9kaWZ5IGEgYml0IHRvIG1ha2UgaXQgZml0Ci1pdCdsbCB0ZWxsIHlvdSBhYm91dCBpdCBieSBzYXlpbmcgdGhlIHBhdGNoIGFwcGxpZWQgd2l0aCAnZnV6eicuCitpdCdsbCB0ZWxsIHlvdSBhYm91dCBpdCBieSBzYXlpbmcgdGhlIHBhdGNoIGFwcGxpZWQgd2l0aCAqKmZ1enoqKi4KIFlvdSBzaG91bGQgYmUgd2FyeSBvZiBzdWNoIGNoYW5nZXMgc2luY2UgZXZlbiB0aG91Z2ggcGF0Y2ggcHJvYmFibHkgZ290IGl0CiByaWdodCBpdCBkb2Vzbid0IC9hbHdheXMvIGdldCBpdCByaWdodCwgYW5kIHRoZSByZXN1bHQgd2lsbCBzb21ldGltZXMgYmUKIHdyb25nLgogCiBXaGVuIHBhdGNoIGVuY291bnRlcnMgYSBjaGFuZ2UgdGhhdCBpdCBjYW4ndCBmaXggdXAgd2l0aCBmdXp6IGl0IHJlamVjdHMgaXQKLW91dHJpZ2h0IGFuZCBsZWF2ZXMgYSBmaWxlIHdpdGggYSAucmVqIGV4dGVuc2lvbiAoYSByZWplY3QgZmlsZSkuIFlvdSBjYW4KK291dHJpZ2h0IGFuZCBsZWF2ZXMgYSBmaWxlIHdpdGggYSBgYC5yZWpgYCBleHRlbnNpb24gKGEgcmVqZWN0IGZpbGUpLiBZb3UgY2FuCiByZWFkIHRoaXMgZmlsZSB0byBzZWUgZXhhY3RseSB3aGF0IGNoYW5nZSBjb3VsZG4ndCBiZSBhcHBsaWVkLCBzbyB5b3UgY2FuCiBnbyBmaXggaXQgdXAgYnkgaGFuZCBpZiB5b3Ugd2lzaC4KIApAQCAtMTMyLDQzICsxNTEsNDcgQEAKIAogTGV0J3MgbG9vayBhIGJpdCBtb3JlIGF0IHNvbWUgb2YgdGhlIG1lc3NhZ2VzIHBhdGNoIGNhbiBwcm9kdWNlLgogCi1JZiBwYXRjaCBzdG9wcyBhbmQgcHJlc2VudHMgYSAiRmlsZSB0byBwYXRjaDoiIHByb21wdCwgdGhlbiBwYXRjaCBjb3VsZCBub3QKK0lmIHBhdGNoIHN0b3BzIGFuZCBwcmVzZW50cyBhIGBgRmlsZSB0byBwYXRjaDpgYCBwcm9tcHQsIHRoZW4gcGF0Y2ggY291bGQgbm90CiBmaW5kIGEgZmlsZSB0byBiZSBwYXRjaGVkLiBNb3N0IGxpa2VseSB5b3UgZm9yZ290IHRvIHNwZWNpZnkgLXAxIG9yIHlvdSBhcmUKIGluIHRoZSB3cm9uZyBkaXJlY3RvcnkuIExlc3Mgb2Z0ZW4sIHlvdSdsbCBmaW5kIHBhdGNoZXMgdGhhdCBuZWVkIHRvIGJlCi1hcHBsaWVkIHdpdGggLXAwIGluc3RlYWQgb2YgLXAxIChyZWFkaW5nIHRoZSBwYXRjaCBmaWxlIHNob3VsZCByZXZlYWwgaWYKK2FwcGxpZWQgd2l0aCBgYC1wMGBgIGluc3RlYWQgb2YgYGAtcDFgYCAocmVhZGluZyB0aGUgcGF0Y2ggZmlsZSBzaG91bGQgcmV2ZWFsIGlmCiB0aGlzIGlzIHRoZSBjYXNlIC0tIGlmIHNvLCB0aGVuIHRoaXMgaXMgYW4gZXJyb3IgYnkgdGhlIHBlcnNvbiB3aG8gY3JlYXRlZAogdGhlIHBhdGNoIGJ1dCBpcyBub3QgZmF0YWwpLgogCi1JZiB5b3UgZ2V0ICJIdW5rICMyIHN1Y2NlZWRlZCBhdCAxODg3IHdpdGggZnV6eiAyIChvZmZzZXQgNyBsaW5lcykuIiBvciBhCitJZiB5b3UgZ2V0IGBgSHVuayAjMiBzdWNjZWVkZWQgYXQgMTg4NyB3aXRoIGZ1enogMiAob2Zmc2V0IDcgbGluZXMpLmBgIG9yIGEKIG1lc3NhZ2Ugc2ltaWxhciB0byB0aGF0LCB0aGVuIGl0IG1lYW5zIHRoYXQgcGF0Y2ggaGFkIHRvIGFkanVzdCB0aGUgbG9jYXRpb24KIG9mIHRoZSBjaGFuZ2UgKGluIHRoaXMgZXhhbXBsZSBpdCBuZWVkZWQgdG8gbW92ZSA3IGxpbmVzIGZyb20gd2hlcmUgaXQKIGV4cGVjdGVkIHRvIG1ha2UgdGhlIGNoYW5nZSB0byBtYWtlIGl0IGZpdCkuCisKIFRoZSByZXN1bHRpbmcgZmlsZSBtYXkgb3IgbWF5IG5vdCBiZSBPSywgZGVwZW5kaW5nIG9uIHRoZSByZWFzb24gdGhlIGZpbGUKIHdhcyBkaWZmZXJlbnQgdGhhbiBleHBlY3RlZC4KKwogVGhpcyBvZnRlbiBoYXBwZW5zIGlmIHlvdSB0cnkgdG8gYXBwbHkgYSBwYXRjaCB0aGF0IHdhcyBnZW5lcmF0ZWQgYWdhaW5zdCBhCiBkaWZmZXJlbnQga2VybmVsIHZlcnNpb24gdGhhbiB0aGUgb25lIHlvdSBhcmUgdHJ5aW5nIHRvIHBhdGNoLgogCi1JZiB5b3UgZ2V0IGEgbWVzc2FnZSBsaWtlICJIdW5rICMzIEZBSUxFRCBhdCAyMzg3LiIsIHRoZW4gaXQgbWVhbnMgdGhhdCB0aGUKK0lmIHlvdSBnZXQgYSBtZXNzYWdlIGxpa2UgYGBIdW5rICMzIEZBSUxFRCBhdCAyMzg3LmBgLCB0aGVuIGl0IG1lYW5zIHRoYXQgdGhlCiBwYXRjaCBjb3VsZCBub3QgYmUgYXBwbGllZCBjb3JyZWN0bHkgYW5kIHRoZSBwYXRjaCBwcm9ncmFtIHdhcyB1bmFibGUgdG8KLWZ1enogaXRzIHdheSB0aHJvdWdoLiBUaGlzIHdpbGwgZ2VuZXJhdGUgYSAucmVqIGZpbGUgd2l0aCB0aGUgY2hhbmdlIHRoYXQKLWNhdXNlZCB0aGUgcGF0Y2ggdG8gZmFpbCBhbmQgYWxzbyBhIC5vcmlnIGZpbGUgc2hvd2luZyB5b3UgdGhlIG9yaWdpbmFsCitmdXp6IGl0cyB3YXkgdGhyb3VnaC4gVGhpcyB3aWxsIGdlbmVyYXRlIGEgYGAucmVqYGAgZmlsZSB3aXRoIHRoZSBjaGFuZ2UgdGhhdAorY2F1c2VkIHRoZSBwYXRjaCB0byBmYWlsIGFuZCBhbHNvIGEgYGAub3JpZ2BgIGZpbGUgc2hvd2luZyB5b3UgdGhlIG9yaWdpbmFsCiBjb250ZW50IHRoYXQgY291bGRuJ3QgYmUgY2hhbmdlZC4KIAotSWYgeW91IGdldCAiUmV2ZXJzZWQgKG9yIHByZXZpb3VzbHkgYXBwbGllZCkgcGF0Y2ggZGV0ZWN0ZWQhICBBc3N1bWUgLVI/IFtuXSIKK0lmIHlvdSBnZXQgYGBSZXZlcnNlZCAob3IgcHJldmlvdXNseSBhcHBsaWVkKSBwYXRjaCBkZXRlY3RlZCEgIEFzc3VtZSAtUj8gW25dYGAKIHRoZW4gcGF0Y2ggZGV0ZWN0ZWQgdGhhdCB0aGUgY2hhbmdlIGNvbnRhaW5lZCBpbiB0aGUgcGF0Y2ggc2VlbXMgdG8gaGF2ZQogYWxyZWFkeSBiZWVuIG1hZGUuCisKIElmIHlvdSBhY3R1YWxseSBkaWQgYXBwbHkgdGhpcyBwYXRjaCBwcmV2aW91c2x5IGFuZCB5b3UganVzdCByZS1hcHBsaWVkIGl0CiBpbiBlcnJvciwgdGhlbiBqdXN0IHNheSBbbl1vIGFuZCBhYm9ydCB0aGlzIHBhdGNoLiBJZiB5b3UgYXBwbGllZCB0aGlzIHBhdGNoCiBwcmV2aW91c2x5IGFuZCBhY3R1YWxseSBpbnRlbmRlZCB0byByZXZlcnQgaXQsIGJ1dCBmb3Jnb3QgdG8gc3BlY2lmeSAtUiwKLXRoZW4geW91IGNhbiBzYXkgW3ldZXMgaGVyZSB0byBtYWtlIHBhdGNoIHJldmVydCBpdCBmb3IgeW91LgordGhlbiB5b3UgY2FuIHNheSBbKip5KipdZXMgaGVyZSB0byBtYWtlIHBhdGNoIHJldmVydCBpdCBmb3IgeW91LgorCiBUaGlzIGNhbiBhbHNvIGhhcHBlbiBpZiB0aGUgY3JlYXRvciBvZiB0aGUgcGF0Y2ggcmV2ZXJzZWQgdGhlIHNvdXJjZSBhbmQKIGRlc3RpbmF0aW9uIGRpcmVjdG9yaWVzIHdoZW4gY3JlYXRpbmcgdGhlIHBhdGNoLCBhbmQgaW4gdGhhdCBjYXNlIHJldmVydGluZwogdGhlIHBhdGNoIHdpbGwgaW4gZmFjdCBhcHBseSBpdC4KIAotQSBtZXNzYWdlIHNpbWlsYXIgdG8gInBhdGNoOiAqKioqIHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gcGF0Y2giIG9yICJwYXRjaAotdW5leHBlY3RlZGx5IGVuZHMgaW4gbWlkZGxlIG9mIGxpbmUiIG1lYW5zIHRoYXQgcGF0Y2ggY291bGQgbWFrZSBubyBzZW5zZSBvZgotdGhlIGZpbGUgeW91IGZlZCB0byBpdC4gRWl0aGVyIHlvdXIgZG93bmxvYWQgaXMgYnJva2VuLCB5b3UgdHJpZWQgdG8gZmVlZAotcGF0Y2ggYSBjb21wcmVzc2VkIHBhdGNoIGZpbGUgd2l0aG91dCB1bmNvbXByZXNzaW5nIGl0IGZpcnN0LCBvciB0aGUgcGF0Y2gKK0EgbWVzc2FnZSBzaW1pbGFyIHRvIGBgcGF0Y2g6ICoqKiogdW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBwYXRjaGBgIG9yCitgYHBhdGNoIHVuZXhwZWN0ZWRseSBlbmRzIGluIG1pZGRsZSBvZiBsaW5lYGAgbWVhbnMgdGhhdCBwYXRjaCBjb3VsZCBtYWtlIG5vCitzZW5zZSBvZiB0aGUgZmlsZSB5b3UgZmVkIHRvIGl0LiBFaXRoZXIgeW91ciBkb3dubG9hZCBpcyBicm9rZW4sIHlvdSB0cmllZCB0bworZmVlZCBwYXRjaCBhIGNvbXByZXNzZWQgcGF0Y2ggZmlsZSB3aXRob3V0IHVuY29tcHJlc3NpbmcgaXQgZmlyc3QsIG9yIHRoZSBwYXRjaAogZmlsZSB0aGF0IHlvdSBhcmUgdXNpbmcgaGFzIGJlZW4gbWFuZ2xlZCBieSBhIG1haWwgY2xpZW50IG9yIG1haWwgdHJhbnNmZXIKIGFnZW50IGFsb25nIHRoZSB3YXkgc29tZXdoZXJlLCBlLmcuLCBieSBzcGxpdHRpbmcgYSBsb25nIGxpbmUgaW50byB0d28gbGluZXMuCiBPZnRlbiB0aGVzZSB3YXJuaW5ncyBjYW4gZWFzaWx5IGJlIGZpeGVkIGJ5IGpvaW5pbmcgKGNvbmNhdGVuYXRpbmcpIHRoZQpAQCAtMTgyLDI4ICsyMDUsMzIgQEAKIHdpc2ggdG8gYXBwbHkuCiAKIAotQXJlIHRoZXJlIGFueSBhbHRlcm5hdGl2ZXMgdG8gYHBhdGNoJz8KLS0tLQotIFllcyB0aGVyZSBhcmUgYWx0ZXJuYXRpdmVzLgorQXJlIHRoZXJlIGFueSBhbHRlcm5hdGl2ZXMgdG8gYGBwYXRjaGBgPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0gWW91IGNhbiB1c2UgdGhlIGBpbnRlcmRpZmYnIHByb2dyYW0gKGh0dHA6Ly9jeWJlcmVsay5uZXQvdGltL3BhdGNodXRpbHMvKSB0bworCitZZXMgdGhlcmUgYXJlIGFsdGVybmF0aXZlcy4KKworWW91IGNhbiB1c2UgdGhlIGBgaW50ZXJkaWZmYGAgcHJvZ3JhbSAoaHR0cDovL2N5YmVyZWxrLm5ldC90aW0vcGF0Y2h1dGlscy8pIHRvCiBnZW5lcmF0ZSBhIHBhdGNoIHJlcHJlc2VudGluZyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gcGF0Y2hlcyBhbmQgdGhlbgogYXBwbHkgdGhlIHJlc3VsdC4KLVRoaXMgd2lsbCBsZXQgeW91IG1vdmUgZnJvbSBzb21ldGhpbmcgbGlrZSAyLjYuMTIuMiB0byAyLjYuMTIuMyBpbiBhIHNpbmdsZQorCitUaGlzIHdpbGwgbGV0IHlvdSBtb3ZlIGZyb20gc29tZXRoaW5nIGxpa2UgNC43LjIgdG8gNC43LjMgaW4gYSBzaW5nbGUKIHN0ZXAuIFRoZSAteiBmbGFnIHRvIGludGVyZGlmZiB3aWxsIGV2ZW4gbGV0IHlvdSBmZWVkIGl0IHBhdGNoZXMgaW4gZ3ppcCBvcgogYnppcDIgY29tcHJlc3NlZCBmb3JtIGRpcmVjdGx5IHdpdGhvdXQgdGhlIHVzZSBvZiB6Y2F0IG9yIGJ6Y2F0IG9yIG1hbnVhbAogZGVjb21wcmVzc2lvbi4KIAotSGVyZSdzIGhvdyB5b3UnZCBnbyBmcm9tIDIuNi4xMi4yIHRvIDIuNi4xMi4zIGluIGEgc2luZ2xlIHN0ZXA6Ci0JaW50ZXJkaWZmIC16IC4uL3BhdGNoLTIuNi4xMi4yLmJ6MiAuLi9wYXRjaC0yLjYuMTIuMy5neiB8IHBhdGNoIC1wMQorSGVyZSdzIGhvdyB5b3UnZCBnbyBmcm9tIDQuNy4yIHRvIDQuNy4zIGluIGEgc2luZ2xlIHN0ZXA6OgorCisJaW50ZXJkaWZmIC16IC4uL3BhdGNoLTQuNy4yLmd6IC4uL3BhdGNoLTQuNy4zLmd6IHwgcGF0Y2ggLXAxCiAKIEFsdGhvdWdoIGludGVyZGlmZiBtYXkgc2F2ZSB5b3UgYSBzdGVwIG9yIHR3byB5b3UgYXJlIGdlbmVyYWxseSBhZHZpc2VkIHRvCiBkbyB0aGUgYWRkaXRpb25hbCBzdGVwcyBzaW5jZSBpbnRlcmRpZmYgY2FuIGdldCB0aGluZ3Mgd3JvbmcgaW4gc29tZSBjYXNlcy4KIAotIEFub3RoZXIgYWx0ZXJuYXRpdmUgaXMgYGtldGNodXAnLCB3aGljaCBpcyBhIHB5dGhvbiBzY3JpcHQgZm9yIGF1dG9tYXRpYworQW5vdGhlciBhbHRlcm5hdGl2ZSBpcyBgYGtldGNodXBgYCwgd2hpY2ggaXMgYSBweXRob24gc2NyaXB0IGZvciBhdXRvbWF0aWMKIGRvd25sb2FkaW5nIGFuZCBhcHBseWluZyBvZiBwYXRjaGVzIChodHRwOi8vd3d3LnNlbGVuaWMuY29tL2tldGNodXAvKS4KIAotIE90aGVyIG5pY2UgdG9vbHMgYXJlIGRpZmZzdGF0LCB3aGljaCBzaG93cyBhIHN1bW1hcnkgb2YgY2hhbmdlcyBtYWRlIGJ5IGEKK090aGVyIG5pY2UgdG9vbHMgYXJlIGRpZmZzdGF0LCB3aGljaCBzaG93cyBhIHN1bW1hcnkgb2YgY2hhbmdlcyBtYWRlIGJ5IGEKIHBhdGNoOyBsc2RpZmYsIHdoaWNoIGRpc3BsYXlzIGEgc2hvcnQgbGlzdGluZyBvZiBhZmZlY3RlZCBmaWxlcyBpbiBhIHBhdGNoCiBmaWxlLCBhbG9uZyB3aXRoIChvcHRpb25hbGx5KSB0aGUgbGluZSBudW1iZXJzIG9mIHRoZSBzdGFydCBvZiBlYWNoIHBhdGNoOwogYW5kIGdyZXBkaWZmLCB3aGljaCBkaXNwbGF5cyBhIGxpc3Qgb2YgdGhlIGZpbGVzIG1vZGlmaWVkIGJ5IGEgcGF0Y2ggd2hlcmUKQEAgLTIxMSw5OSArMjM4LDEwMyBAQAogCiAKIFdoZXJlIGNhbiBJIGRvd25sb2FkIHRoZSBwYXRjaGVzPwotLS0tCi0gVGhlIHBhdGNoZXMgYXJlIGF2YWlsYWJsZSBhdCBodHRwOi8va2VybmVsLm9yZy8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgcGF0Y2hlcyBhcmUgYXZhaWxhYmxlIGF0IGh0dHA6Ly9rZXJuZWwub3JnLwogTW9zdCByZWNlbnQgcGF0Y2hlcyBhcmUgbGlua2VkIGZyb20gdGhlIGZyb250IHBhZ2UsIGJ1dCB0aGV5IGFsc28gaGF2ZQogc3BlY2lmaWMgaG9tZXMuCiAKLVRoZSAyLjYueC55ICgtc3RhYmxlKSBhbmQgMi42LnggcGF0Y2hlcyBsaXZlIGF0Ci0gZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC92Mi42LworVGhlIDQueC55ICgtc3RhYmxlKSBhbmQgNC54IHBhdGNoZXMgbGl2ZSBhdAorCisJZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC92NC54LwogCiBUaGUgLXJjIHBhdGNoZXMgbGl2ZSBhdAotIGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvdjIuNi90ZXN0aW5nLwogCi1UaGUgLWdpdCBwYXRjaGVzIGxpdmUgYXQKLSBmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3YyLjYvc25hcHNob3RzLworCWZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvdjQueC90ZXN0aW5nLwogCi1UaGUgLW1tIGtlcm5lbHMgbGl2ZSBhdAotIGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvcGVvcGxlL2FrcG0vcGF0Y2hlcy8yLjYvCi0KLUluIHBsYWNlIG9mIGZ0cC5rZXJuZWwub3JnIHlvdSBjYW4gdXNlIGZ0cC5jYy5rZXJuZWwub3JnLCB3aGVyZSBjYyBpcyBhCitJbiBwbGFjZSBvZiBgYGZ0cC5rZXJuZWwub3JnYGAgeW91IGNhbiB1c2UgYGBmdHAuY2Mua2VybmVsLm9yZ2BgLCB3aGVyZSBjYyBpcyBhCiBjb3VudHJ5IGNvZGUuIFRoaXMgd2F5IHlvdSdsbCBiZSBkb3dubG9hZGluZyBmcm9tIGEgbWlycm9yIHNpdGUgdGhhdCdzIG1vc3QKIGxpa2VseSBnZW9ncmFwaGljYWxseSBjbG9zZXIgdG8geW91LCByZXN1bHRpbmcgaW4gZmFzdGVyIGRvd25sb2FkcyBmb3IgeW91LAogbGVzcyBiYW5kd2lkdGggdXNlZCBnbG9iYWxseSBhbmQgbGVzcyBsb2FkIG9uIHRoZSBtYWluIGtlcm5lbC5vcmcgc2VydmVycyAtLQogdGhlc2UgYXJlIGdvb2QgdGhpbmdzLCBzbyBkbyB1c2UgbWlycm9ycyB3aGVuIHBvc3NpYmxlLgogCiAKLVRoZSAyLjYueCBrZXJuZWxzCi0tLS0KLSBUaGVzZSBhcmUgdGhlIGJhc2Ugc3RhYmxlIHJlbGVhc2VzIHJlbGVhc2VkIGJ5IExpbnVzLiBUaGUgaGlnaGVzdCBudW1iZXJlZAorVGhlIDQueCBrZXJuZWxzCis9PT09PT09PT09PT09PT0KKworVGhlc2UgYXJlIHRoZSBiYXNlIHN0YWJsZSByZWxlYXNlcyByZWxlYXNlZCBieSBMaW51cy4gVGhlIGhpZ2hlc3QgbnVtYmVyZWQKIHJlbGVhc2UgaXMgdGhlIG1vc3QgcmVjZW50LgogCiBJZiByZWdyZXNzaW9ucyBvciBvdGhlciBzZXJpb3VzIGZsYXdzIGFyZSBmb3VuZCwgdGhlbiBhIC1zdGFibGUgZml4IHBhdGNoCi13aWxsIGJlIHJlbGVhc2VkIChzZWUgYmVsb3cpIG9uIHRvcCBvZiB0aGlzIGJhc2UuIE9uY2UgYSBuZXcgMi42LnggYmFzZQord2lsbCBiZSByZWxlYXNlZCAoc2VlIGJlbG93KSBvbiB0b3Agb2YgdGhpcyBiYXNlLiBPbmNlIGEgbmV3IDQueCBiYXNlCiBrZXJuZWwgaXMgcmVsZWFzZWQsIGEgcGF0Y2ggaXMgbWFkZSBhdmFpbGFibGUgdGhhdCBpcyBhIGRlbHRhIGJldHdlZW4gdGhlCi1wcmV2aW91cyAyLjYueCBrZXJuZWwgYW5kIHRoZSBuZXcgb25lLgorcHJldmlvdXMgNC54IGtlcm5lbCBhbmQgdGhlIG5ldyBvbmUuCiAKLVRvIGFwcGx5IGEgcGF0Y2ggbW92aW5nIGZyb20gMi42LjExIHRvIDIuNi4xMiwgeW91J2QgZG8gdGhlIGZvbGxvd2luZyAobm90ZQotdGhhdCBzdWNoIHBhdGNoZXMgZG8gKk5PVCogYXBwbHkgb24gdG9wIG9mIDIuNi54Lnkga2VybmVscyBidXQgb24gdG9wIG9mIHRoZQotYmFzZSAyLjYueCBrZXJuZWwgLS0gaWYgeW91IG5lZWQgdG8gbW92ZSBmcm9tIDIuNi54LnkgdG8gMi42LngrMSB5b3UgbmVlZCB0bwotZmlyc3QgcmV2ZXJ0IHRoZSAyLjYueC55IHBhdGNoKS4KK1RvIGFwcGx5IGEgcGF0Y2ggbW92aW5nIGZyb20gNC42IHRvIDQuNywgeW91J2QgZG8gdGhlIGZvbGxvd2luZyAobm90ZQordGhhdCBzdWNoIHBhdGNoZXMgZG8gKipOT1QqKiBhcHBseSBvbiB0b3Agb2YgNC54Lnkga2VybmVscyBidXQgb24gdG9wIG9mIHRoZQorYmFzZSA0Lngga2VybmVsIC0tIGlmIHlvdSBuZWVkIHRvIG1vdmUgZnJvbSA0LngueSB0byA0LngrMSB5b3UgbmVlZCB0bworZmlyc3QgcmV2ZXJ0IHRoZSA0LngueSBwYXRjaCkuCiAKLUhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CitIZXJlIGFyZSBzb21lIGV4YW1wbGVzOjoKIAotIyBtb3ZpbmcgZnJvbSAyLjYuMTEgdG8gMi42LjEyCi0kIGNkIH4vbGludXgtMi42LjExCQkJIyBjaGFuZ2UgdG8ga2VybmVsIHNvdXJjZSBkaXIKLSQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEyCQkjIGFwcGx5IHRoZSAyLjYuMTIgcGF0Y2gKLSQgY2QgLi4KLSQgbXYgbGludXgtMi42LjExIGxpbnV4LTIuNi4xMgkJIyByZW5hbWUgc291cmNlIGRpcgorCSMgbW92aW5nIGZyb20gNC42IHRvIDQuNwogCi0jIG1vdmluZyBmcm9tIDIuNi4xMS4xIHRvIDIuNi4xMgotJCBjZCB+L2xpbnV4LTIuNi4xMS4xCQkJIyBjaGFuZ2UgdG8ga2VybmVsIHNvdXJjZSBkaXIKLSQgcGF0Y2ggLXAxIC1SIDwgLi4vcGF0Y2gtMi42LjExLjEJIyByZXZlcnQgdGhlIDIuNi4xMS4xIHBhdGNoCi0JCQkJCSMgc291cmNlIGRpciBpcyBub3cgMi42LjExCi0kIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTIuNi4xMgkJIyBhcHBseSBuZXcgMi42LjEyIHBhdGNoCi0kIGNkIC4uCi0kIG12IGxpbnV4LTIuNi4xMS4xIGxpbnV4LTIuNi4xMgkJIyByZW5hbWUgc291cmNlIGRpcgorCSQgY2Qgfi9saW51eC00LjYJCSMgY2hhbmdlIHRvIGtlcm5lbCBzb3VyY2UgZGlyCisJJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC00LjcJIyBhcHBseSB0aGUgNC43IHBhdGNoCisJJCBjZCAuLgorCSQgbXYgbGludXgtNC42IGxpbnV4LTQuNwkjIHJlbmFtZSBzb3VyY2UgZGlyCisKKwkjIG1vdmluZyBmcm9tIDQuNi4xIHRvIDQuNworCisJJCBjZCB+L2xpbnV4LTQuNi4xCQkjIGNoYW5nZSB0byBrZXJuZWwgc291cmNlIGRpcgorCSQgcGF0Y2ggLXAxIC1SIDwgLi4vcGF0Y2gtNC42LjEJIyByZXZlcnQgdGhlIDQuNi4xIHBhdGNoCisJCQkJCSMgc291cmNlIGRpciBpcyBub3cgNC42CisJJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC00LjcJIyBhcHBseSBuZXcgNC43IHBhdGNoCisJJCBjZCAuLgorCSQgbXYgbGludXgtNC42LjEgbGludXgtNC43CSMgcmVuYW1lIHNvdXJjZSBkaXIKIAogCi1UaGUgMi42LngueSBrZXJuZWxzCi0tLS0KLSBLZXJuZWxzIHdpdGggNC1kaWdpdCB2ZXJzaW9ucyBhcmUgLXN0YWJsZSBrZXJuZWxzLiBUaGV5IGNvbnRhaW4gc21hbGwoaXNoKQorVGhlIDQueC55IGtlcm5lbHMKKz09PT09PT09PT09PT09PT09CisKK0tlcm5lbHMgd2l0aCAzLWRpZ2l0IHZlcnNpb25zIGFyZSAtc3RhYmxlIGtlcm5lbHMuIFRoZXkgY29udGFpbiBzbWFsbChpc2gpCiBjcml0aWNhbCBmaXhlcyBmb3Igc2VjdXJpdHkgcHJvYmxlbXMgb3Igc2lnbmlmaWNhbnQgcmVncmVzc2lvbnMgZGlzY292ZXJlZAotaW4gYSBnaXZlbiAyLjYueCBrZXJuZWwuCitpbiBhIGdpdmVuIDQueCBrZXJuZWwuCiAKIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIGJyYW5jaCBmb3IgdXNlcnMgd2hvIHdhbnQgdGhlIG1vc3QgcmVjZW50IHN0YWJsZQoga2VybmVsIGFuZCBhcmUgbm90IGludGVyZXN0ZWQgaW4gaGVscGluZyB0ZXN0IGRldmVsb3BtZW50L2V4cGVyaW1lbnRhbAogdmVyc2lvbnMuCiAKLUlmIG5vIDIuNi54Lnkga2VybmVsIGlzIGF2YWlsYWJsZSwgdGhlbiB0aGUgaGlnaGVzdCBudW1iZXJlZCAyLjYueCBrZXJuZWwgaXMKK0lmIG5vIDQueC55IGtlcm5lbCBpcyBhdmFpbGFibGUsIHRoZW4gdGhlIGhpZ2hlc3QgbnVtYmVyZWQgNC54IGtlcm5lbCBpcwogdGhlIGN1cnJlbnQgc3RhYmxlIGtlcm5lbC4KIAotIG5vdGU6IHRoZSAtc3RhYmxlIHRlYW0gdXN1YWxseSBkbyBtYWtlIGluY3JlbWVudGFsIHBhdGNoZXMgYXZhaWxhYmxlIGFzIHdlbGwKKy4uIG5vdGU6OgorCisgVGhlIC1zdGFibGUgdGVhbSB1c3VhbGx5IGRvIG1ha2UgaW5jcmVtZW50YWwgcGF0Y2hlcyBhdmFpbGFibGUgYXMgd2VsbAogIGFzIHBhdGNoZXMgYWdhaW5zdCB0aGUgbGF0ZXN0IG1haW5saW5lIHJlbGVhc2UsIGJ1dCBJIG9ubHkgY292ZXIgdGhlCiAgbm9uLWluY3JlbWVudGFsIG9uZXMgYmVsb3cuIFRoZSBpbmNyZW1lbnRhbCBvbmVzIGNhbiBiZSBmb3VuZCBhdAotIGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvdjIuNi9pbmNyLworIGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvdjQueC9pbmNyLwogCi1UaGVzZSBwYXRjaGVzIGFyZSBub3QgaW5jcmVtZW50YWwsIG1lYW5pbmcgdGhhdCBmb3IgZXhhbXBsZSB0aGUgMi42LjEyLjMKLXBhdGNoIGRvZXMgbm90IGFwcGx5IG9uIHRvcCBvZiB0aGUgMi42LjEyLjIga2VybmVsIHNvdXJjZSwgYnV0IHJhdGhlciBvbiB0b3AKLW9mIHRoZSBiYXNlIDIuNi4xMiBrZXJuZWwgc291cmNlIC4KLVNvLCBpbiBvcmRlciB0byBhcHBseSB0aGUgMi42LjEyLjMgcGF0Y2ggdG8geW91ciBleGlzdGluZyAyLjYuMTIuMiBrZXJuZWwKLXNvdXJjZSB5b3UgaGF2ZSB0byBmaXJzdCBiYWNrIG91dCB0aGUgMi42LjEyLjIgcGF0Y2ggKHNvIHlvdSBhcmUgbGVmdCB3aXRoIGEKLWJhc2UgMi42LjEyIGtlcm5lbCBzb3VyY2UpIGFuZCB0aGVuIGFwcGx5IHRoZSBuZXcgMi42LjEyLjMgcGF0Y2guCitUaGVzZSBwYXRjaGVzIGFyZSBub3QgaW5jcmVtZW50YWwsIG1lYW5pbmcgdGhhdCBmb3IgZXhhbXBsZSB0aGUgNC43LjMKK3BhdGNoIGRvZXMgbm90IGFwcGx5IG9uIHRvcCBvZiB0aGUgNC43LjIga2VybmVsIHNvdXJjZSwgYnV0IHJhdGhlciBvbiB0b3AKK29mIHRoZSBiYXNlIDQuNyBrZXJuZWwgc291cmNlLgogCi1IZXJlJ3MgYSBzbWFsbCBleGFtcGxlOgorU28sIGluIG9yZGVyIHRvIGFwcGx5IHRoZSA0LjcuMyBwYXRjaCB0byB5b3VyIGV4aXN0aW5nIDQuNy4yIGtlcm5lbAorc291cmNlIHlvdSBoYXZlIHRvIGZpcnN0IGJhY2sgb3V0IHRoZSA0LjcuMiBwYXRjaCAoc28geW91IGFyZSBsZWZ0IHdpdGggYQorYmFzZSA0Ljcga2VybmVsIHNvdXJjZSkgYW5kIHRoZW4gYXBwbHkgdGhlIG5ldyA0LjcuMyBwYXRjaC4KIAotJCBjZCB+L2xpbnV4LTIuNi4xMi4yCQkJIyBjaGFuZ2UgaW50byB0aGUga2VybmVsIHNvdXJjZSBkaXIKLSQgcGF0Y2ggLXAxIC1SIDwgLi4vcGF0Y2gtMi42LjEyLjIJIyByZXZlcnQgdGhlIDIuNi4xMi4yIHBhdGNoCi0kIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTIuNi4xMi4zCQkjIGFwcGx5IHRoZSBuZXcgMi42LjEyLjMgcGF0Y2gKLSQgY2QgLi4KLSQgbXYgbGludXgtMi42LjEyLjIgbGludXgtMi42LjEyLjMJIyByZW5hbWUgdGhlIGtlcm5lbCBzb3VyY2UgZGlyCitIZXJlJ3MgYSBzbWFsbCBleGFtcGxlOjoKIAorCSQgY2Qgfi9saW51eC00LjcuMgkJIyBjaGFuZ2UgdG8gdGhlIGtlcm5lbCBzb3VyY2UgZGlyCisJJCBwYXRjaCAtcDEgLVIgPCAuLi9wYXRjaC00LjcuMgkjIHJldmVydCB0aGUgNC43LjIgcGF0Y2gKKwkkIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTQuNy4zCSMgYXBwbHkgdGhlIG5ldyA0LjcuMyBwYXRjaAorCSQgY2QgLi4KKwkkIG12IGxpbnV4LTQuNy4yIGxpbnV4LTQuNy4zCSMgcmVuYW1lIHRoZSBrZXJuZWwgc291cmNlIGRpcgogCiBUaGUgLXJjIGtlcm5lbHMKLS0tLQotIFRoZXNlIGFyZSByZWxlYXNlLWNhbmRpZGF0ZSBrZXJuZWxzLiBUaGVzZSBhcmUgZGV2ZWxvcG1lbnQga2VybmVscyByZWxlYXNlZAorPT09PT09PT09PT09PT09CisKK1RoZXNlIGFyZSByZWxlYXNlLWNhbmRpZGF0ZSBrZXJuZWxzLiBUaGVzZSBhcmUgZGV2ZWxvcG1lbnQga2VybmVscyByZWxlYXNlZAogYnkgTGludXMgd2hlbmV2ZXIgaGUgZGVlbXMgdGhlIGN1cnJlbnQgZ2l0ICh0aGUga2VybmVsJ3Mgc291cmNlIG1hbmFnZW1lbnQKIHRvb2wpIHRyZWUgdG8gYmUgaW4gYSByZWFzb25hYmx5IHNhbmUgc3RhdGUgYWRlcXVhdGUgZm9yIHRlc3RpbmcuCiAKQEAgLTMxNywzOSArMzQ4LDQ0IEBACiBkZXZlbG9wbWVudCBrZXJuZWxzIGJ1dCBkbyBub3Qgd2FudCB0byBydW4gc29tZSBvZiB0aGUgcmVhbGx5IGV4cGVyaW1lbnRhbAogc3R1ZmYgKHN1Y2ggcGVvcGxlIHNob3VsZCBzZWUgdGhlIHNlY3Rpb25zIGFib3V0IC1naXQgYW5kIC1tbSBrZXJuZWxzIGJlbG93KS4KIAotVGhlIC1yYyBwYXRjaGVzIGFyZSBub3QgaW5jcmVtZW50YWwsIHRoZXkgYXBwbHkgdG8gYSBiYXNlIDIuNi54IGtlcm5lbCwganVzdAotbGlrZSB0aGUgMi42LngueSBwYXRjaGVzIGRlc2NyaWJlZCBhYm92ZS4gVGhlIGtlcm5lbCB2ZXJzaW9uIGJlZm9yZSB0aGUgLXJjTgorVGhlIC1yYyBwYXRjaGVzIGFyZSBub3QgaW5jcmVtZW50YWwsIHRoZXkgYXBwbHkgdG8gYSBiYXNlIDQueCBrZXJuZWwsIGp1c3QKK2xpa2UgdGhlIDQueC55IHBhdGNoZXMgZGVzY3JpYmVkIGFib3ZlLiBUaGUga2VybmVsIHZlcnNpb24gYmVmb3JlIHRoZSAtcmNOCiBzdWZmaXggZGVub3RlcyB0aGUgdmVyc2lvbiBvZiB0aGUga2VybmVsIHRoYXQgdGhpcyAtcmMga2VybmVsIHdpbGwgZXZlbnR1YWxseQogdHVybiBpbnRvLgotU28sIDIuNi4xMy1yYzUgbWVhbnMgdGhhdCB0aGlzIGlzIHRoZSBmaWZ0aCByZWxlYXNlIGNhbmRpZGF0ZSBmb3IgdGhlIDIuNi4xMwota2VybmVsIGFuZCB0aGUgcGF0Y2ggc2hvdWxkIGJlIGFwcGxpZWQgb24gdG9wIG9mIHRoZSAyLjYuMTIga2VybmVsIHNvdXJjZS4KIAotSGVyZSBhcmUgMyBleGFtcGxlcyBvZiBob3cgdG8gYXBwbHkgdGhlc2UgcGF0Y2hlczoKK1NvLCA0LjgtcmM1IG1lYW5zIHRoYXQgdGhpcyBpcyB0aGUgZmlmdGggcmVsZWFzZSBjYW5kaWRhdGUgZm9yIHRoZSA0LjgKK2tlcm5lbCBhbmQgdGhlIHBhdGNoIHNob3VsZCBiZSBhcHBsaWVkIG9uIHRvcCBvZiB0aGUgNC43IGtlcm5lbCBzb3VyY2UuCiAKLSMgZmlyc3QgYW4gZXhhbXBsZSBvZiBtb3ZpbmcgZnJvbSAyLjYuMTIgdG8gMi42LjEzLXJjMwotJCBjZCB+L2xpbnV4LTIuNi4xMgkJCSMgY2hhbmdlIGludG8gdGhlIDIuNi4xMiBzb3VyY2UgZGlyCi0kIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTIuNi4xMy1yYzMJIyBhcHBseSB0aGUgMi42LjEzLXJjMyBwYXRjaAotJCBjZCAuLgotJCBtdiBsaW51eC0yLjYuMTIgbGludXgtMi42LjEzLXJjMwkjIHJlbmFtZSB0aGUgc291cmNlIGRpcgorSGVyZSBhcmUgMyBleGFtcGxlcyBvZiBob3cgdG8gYXBwbHkgdGhlc2UgcGF0Y2hlczo6CiAKLSMgbm93IGxldCdzIG1vdmUgZnJvbSAyLjYuMTMtcmMzIHRvIDIuNi4xMy1yYzUKLSQgY2Qgfi9saW51eC0yLjYuMTMtcmMzCQkJIyBjaGFuZ2UgaW50byB0aGUgMi42LjEzLXJjMyBkaXIKLSQgcGF0Y2ggLXAxIC1SIDwgLi4vcGF0Y2gtMi42LjEzLXJjMwkjIHJldmVydCB0aGUgMi42LjEzLXJjMyBwYXRjaAotJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC0yLjYuMTMtcmM1CSMgYXBwbHkgdGhlIG5ldyAyLjYuMTMtcmM1IHBhdGNoCi0kIGNkIC4uCi0kIG12IGxpbnV4LTIuNi4xMy1yYzMgbGludXgtMi42LjEzLXJjNQkjIHJlbmFtZSB0aGUgc291cmNlIGRpcgorCSMgZmlyc3QgYW4gZXhhbXBsZSBvZiBtb3ZpbmcgZnJvbSA0LjcgdG8gNC44LXJjMwogCi0jIGZpbmFsbHkgbGV0J3MgdHJ5IGFuZCBtb3ZlIGZyb20gMi42LjEyLjMgdG8gMi42LjEzLXJjNQotJCBjZCB+L2xpbnV4LTIuNi4xMi4zCQkJIyBjaGFuZ2UgdG8gdGhlIGtlcm5lbCBzb3VyY2UgZGlyCi0kIHBhdGNoIC1wMSAtUiA8IC4uL3BhdGNoLTIuNi4xMi4zCSMgcmV2ZXJ0IHRoZSAyLjYuMTIuMyBwYXRjaAotJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC0yLjYuMTMtcmM1CSMgYXBwbHkgbmV3IDIuNi4xMy1yYzUgcGF0Y2gKLSQgY2QgLi4KLSQgbXYgbGludXgtMi42LjEyLjMgbGludXgtMi42LjEzLXJjNQkjIHJlbmFtZSB0aGUga2VybmVsIHNvdXJjZSBkaXIKKwkkIGNkIH4vbGludXgtNC43CQkJIyBjaGFuZ2UgdG8gdGhlIDQuNyBzb3VyY2UgZGlyCisJJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC00LjgtcmMzCQkjIGFwcGx5IHRoZSA0LjgtcmMzIHBhdGNoCisJJCBjZCAuLgorCSQgbXYgbGludXgtNC43IGxpbnV4LTQuOC1yYzMJCSMgcmVuYW1lIHRoZSBzb3VyY2UgZGlyCisKKwkjIG5vdyBsZXQncyBtb3ZlIGZyb20gNC44LXJjMyB0byA0LjgtcmM1CisKKwkkIGNkIH4vbGludXgtNC44LXJjMwkJCSMgY2hhbmdlIHRvIHRoZSA0LjgtcmMzIGRpcgorCSQgcGF0Y2ggLXAxIC1SIDwgLi4vcGF0Y2gtNC44LXJjMwkjIHJldmVydCB0aGUgNC44LXJjMyBwYXRjaAorCSQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtNC44LXJjNQkJIyBhcHBseSB0aGUgbmV3IDQuOC1yYzUgcGF0Y2gKKwkkIGNkIC4uCisJJCBtdiBsaW51eC00LjgtcmMzIGxpbnV4LTQuOC1yYzUJIyByZW5hbWUgdGhlIHNvdXJjZSBkaXIKKworCSMgZmluYWxseSBsZXQncyB0cnkgYW5kIG1vdmUgZnJvbSA0LjcuMyB0byA0LjgtcmM1CisKKwkkIGNkIH4vbGludXgtNC43LjMJCQkjIGNoYW5nZSB0byB0aGUga2VybmVsIHNvdXJjZSBkaXIKKwkkIHBhdGNoIC1wMSAtUiA8IC4uL3BhdGNoLTQuNy4zCQkjIHJldmVydCB0aGUgNC43LjMgcGF0Y2gKKwkkIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTQuOC1yYzUJCSMgYXBwbHkgbmV3IDQuOC1yYzUgcGF0Y2gKKwkkIGNkIC4uCisJJCBtdiBsaW51eC00LjcuMyBsaW51eC00LjgtcmM1CQkjIHJlbmFtZSB0aGUga2VybmVsIHNvdXJjZSBkaXIKIAogCiBUaGUgLWdpdCBrZXJuZWxzCi0tLS0KLSBUaGVzZSBhcmUgZGFpbHkgc25hcHNob3RzIG9mIExpbnVzJyBrZXJuZWwgdHJlZSAobWFuYWdlZCBpbiBhIGdpdAorPT09PT09PT09PT09PT09PQorCitUaGVzZSBhcmUgZGFpbHkgc25hcHNob3RzIG9mIExpbnVzJyBrZXJuZWwgdHJlZSAobWFuYWdlZCBpbiBhIGdpdAogcmVwb3NpdG9yeSwgaGVuY2UgdGhlIG5hbWUpLgogCiBUaGVzZSBwYXRjaGVzIGFyZSB1c3VhbGx5IHJlbGVhc2VkIGRhaWx5IGFuZCByZXByZXNlbnQgdGhlIGN1cnJlbnQgc3RhdGUgb2YKQEAgLTM1Nyw5MSArMzkzLDY2IEBACiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSB3aXRob3V0IGV2ZW4gYSBjdXJzb3J5IGdsYW5jZSB0byBzZWUgaWYgdGhleSBhcmUKIHNhbmUuCiAKLS1naXQgcGF0Y2hlcyBhcmUgbm90IGluY3JlbWVudGFsIGFuZCBhcHBseSBlaXRoZXIgdG8gYSBiYXNlIDIuNi54IGtlcm5lbCBvcgotYSBiYXNlIDIuNi54LXJjIGtlcm5lbCAtLSB5b3UgY2FuIHNlZSB3aGljaCBmcm9tIHRoZWlyIG5hbWUuCi1BIHBhdGNoIG5hbWVkIDIuNi4xMi1naXQxIGFwcGxpZXMgdG8gdGhlIDIuNi4xMiBrZXJuZWwgc291cmNlIGFuZCBhIHBhdGNoCi1uYW1lZCAyLjYuMTMtcmMzLWdpdDIgYXBwbGllcyB0byB0aGUgc291cmNlIG9mIHRoZSAyLjYuMTMtcmMzIGtlcm5lbC4KKy1naXQgcGF0Y2hlcyBhcmUgbm90IGluY3JlbWVudGFsIGFuZCBhcHBseSBlaXRoZXIgdG8gYSBiYXNlIDQueCBrZXJuZWwgb3IKK2EgYmFzZSA0LngtcmMga2VybmVsIC0tIHlvdSBjYW4gc2VlIHdoaWNoIGZyb20gdGhlaXIgbmFtZS4KK0EgcGF0Y2ggbmFtZWQgNC43LWdpdDEgYXBwbGllcyB0byB0aGUgNC43IGtlcm5lbCBzb3VyY2UgYW5kIGEgcGF0Y2gKK25hbWVkIDQuOC1yYzMtZ2l0MiBhcHBsaWVzIHRvIHRoZSBzb3VyY2Ugb2YgdGhlIDQuOC1yYzMga2VybmVsLgogCi1IZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGhvdyB0byBhcHBseSB0aGVzZSBwYXRjaGVzOgorSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBob3cgdG8gYXBwbHkgdGhlc2UgcGF0Y2hlczo6CiAKLSMgbW92aW5nIGZyb20gMi42LjEyIHRvIDIuNi4xMi1naXQxCi0kIGNkIH4vbGludXgtMi42LjEyCQkJIyBjaGFuZ2UgdG8gdGhlIGtlcm5lbCBzb3VyY2UgZGlyCi0kIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTIuNi4xMi1naXQxCSMgYXBwbHkgdGhlIDIuNi4xMi1naXQxIHBhdGNoCi0kIGNkIC4uCi0kIG12IGxpbnV4LTIuNi4xMiBsaW51eC0yLjYuMTItZ2l0MQkjIHJlbmFtZSB0aGUga2VybmVsIHNvdXJjZSBkaXIKKwkjIG1vdmluZyBmcm9tIDQuNyB0byA0LjctZ2l0MQogCi0jIG1vdmluZyBmcm9tIDIuNi4xMi1naXQxIHRvIDIuNi4xMy1yYzItZ2l0MwotJCBjZCB+L2xpbnV4LTIuNi4xMi1naXQxCQkjIGNoYW5nZSB0byB0aGUga2VybmVsIHNvdXJjZSBkaXIKLSQgcGF0Y2ggLXAxIC1SIDwgLi4vcGF0Y2gtMi42LjEyLWdpdDEJIyByZXZlcnQgdGhlIDIuNi4xMi1naXQxIHBhdGNoCi0JCQkJCSMgd2Ugbm93IGhhdmUgYSAyLjYuMTIga2VybmVsCi0kIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTIuNi4xMy1yYzIJIyBhcHBseSB0aGUgMi42LjEzLXJjMiBwYXRjaAotCQkJCQkjIHRoZSBrZXJuZWwgaXMgbm93IDIuNi4xMy1yYzIKLSQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEzLXJjMi1naXQzCSMgYXBwbHkgdGhlIDIuNi4xMy1yYzItZ2l0MyBwYXRjaAotCQkJCQkjIHRoZSBrZXJuZWwgaXMgbm93IDIuNi4xMy1yYzItZ2l0MwotJCBjZCAuLgotJCBtdiBsaW51eC0yLjYuMTItZ2l0MSBsaW51eC0yLjYuMTMtcmMyLWdpdDMJIyByZW5hbWUgc291cmNlIGRpcgorCSQgY2Qgfi9saW51eC00LjcJCQkjIGNoYW5nZSB0byB0aGUga2VybmVsIHNvdXJjZSBkaXIKKwkkIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTQuNy1naXQxCQkjIGFwcGx5IHRoZSA0LjctZ2l0MSBwYXRjaAorCSQgY2QgLi4KKwkkIG12IGxpbnV4LTQuNyBsaW51eC00LjctZ2l0MQkJIyByZW5hbWUgdGhlIGtlcm5lbCBzb3VyY2UgZGlyCisKKwkjIG1vdmluZyBmcm9tIDQuNy1naXQxIHRvIDQuOC1yYzItZ2l0MworCisJJCBjZCB+L2xpbnV4LTQuNy1naXQxCQkJIyBjaGFuZ2UgdG8gdGhlIGtlcm5lbCBzb3VyY2UgZGlyCisJJCBwYXRjaCAtcDEgLVIgPCAuLi9wYXRjaC00LjctZ2l0MQkjIHJldmVydCB0aGUgNC43LWdpdDEgcGF0Y2gKKwkJCQkJCSMgd2Ugbm93IGhhdmUgYSA0Ljcga2VybmVsCisJJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC00LjgtcmMyCQkjIGFwcGx5IHRoZSA0LjgtcmMyIHBhdGNoCisJCQkJCQkjIHRoZSBrZXJuZWwgaXMgbm93IDQuOC1yYzIKKwkkIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTQuOC1yYzItZ2l0MwkjIGFwcGx5IHRoZSA0LjgtcmMyLWdpdDMgcGF0Y2gKKwkJCQkJCSMgdGhlIGtlcm5lbCBpcyBub3cgNC44LXJjMi1naXQzCisJJCBjZCAuLgorCSQgbXYgbGludXgtNC43LWdpdDEgbGludXgtNC44LXJjMi1naXQzCSMgcmVuYW1lIHNvdXJjZSBkaXIKIAogCi1UaGUgLW1tIGtlcm5lbHMKLS0tLQotIFRoZXNlIGFyZSBleHBlcmltZW50YWwga2VybmVscyByZWxlYXNlZCBieSBBbmRyZXcgTW9ydG9uLgorVGhlIC1tbSBwYXRjaGVzIGFuZCB0aGUgbGludXgtbmV4dCB0cmVlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotVGhlIC1tbSB0cmVlIHNlcnZlcyBhcyBhIHNvcnQgb2YgcHJvdmluZyBncm91bmQgZm9yIG5ldyBmZWF0dXJlcyBhbmQgb3RoZXIKLWV4cGVyaW1lbnRhbCBwYXRjaGVzLgotT25jZSBhIHBhdGNoIGhhcyBwcm92ZWQgaXRzIHdvcnRoIGluIC1tbSBmb3IgYSB3aGlsZSBBbmRyZXcgcHVzaGVzIGl0IG9uIHRvCi1MaW51cyBmb3IgaW5jbHVzaW9uIGluIG1haW5saW5lLgorVGhlIC1tbSBwYXRjaGVzIGFyZSBleHBlcmltZW50YWwgcGF0Y2hlcyByZWxlYXNlZCBieSBBbmRyZXcgTW9ydG9uLgogCi1BbHRob3VnaCBpdCdzIGVuY291cmFnZWQgdGhhdCBwYXRjaGVzIGZsb3cgdG8gTGludXMgdmlhIHRoZSAtbW0gdHJlZSwgdGhpcwotaXMgbm90IGFsd2F5cyBlbmZvcmNlZC4KLVN1YnN5c3RlbSBtYWludGFpbmVycyAob3IgaW5kaXZpZHVhbHMpIHNvbWV0aW1lcyBwdXNoIHRoZWlyIHBhdGNoZXMgZGlyZWN0bHkKLXRvIExpbnVzLCBldmVuIHRob3VnaCAob3IgYWZ0ZXIpIHRoZXkgaGF2ZSBiZWVuIG1lcmdlZCBhbmQgdGVzdGVkIGluIC1tbSAob3IKLXNvbWV0aW1lcyBldmVuIHdpdGhvdXQgcHJpb3IgdGVzdGluZyBpbiAtbW0pLgorSW4gdGhlIHBhc3QsIC1tbSB0cmVlIHdlcmUgdXNlZCB0byBhbHNvIHRlc3Qgc3Vic3lzdGVtIHBhdGNoZXMsIGJ1dCB0aGlzCitmdW5jdGlvbiBpcyBub3cgZG9uZSB2aWEgdGhlCis6cmVmOmBsaW51eC1uZXh0IDxodHRwczovL3d3dy5rZXJuZWwub3JnL2RvYy9tYW4tcGFnZXMvbGludXgtbmV4dC5odG1sPmAKK3RyZWUuIFRoZSBTdWJzeXN0ZW0gbWFpbnRhaW5lcnMgcHVzaCB0aGVpciBwYXRjaGVzIGZpcnN0IHRvIGxpbnV4LW5leHQsCithbmQsIGR1cmluZyB0aGUgbWVyZ2Ugd2luZG93LCBzZW5kcyB0aGVtIGRpcmVjdGx5IHRvIExpbnVzLgogCi1Zb3Ugc2hvdWxkIGdlbmVyYWxseSBzdHJpdmUgdG8gZ2V0IHlvdXIgcGF0Y2hlcyBpbnRvIG1haW5saW5lIHZpYSAtbW0gdG8KLWVuc3VyZSBtYXhpbXVtIHRlc3RpbmcuCitUaGUgLW1tIHBhdGNoZXMgc2VydmUgYXMgYSBzb3J0IG9mIHByb3ZpbmcgZ3JvdW5kIGZvciBuZXcgZmVhdHVyZXMgYW5kIG90aGVyCitleHBlcmltZW50YWwgcGF0Y2hlcyB0aGF0IGFyZW4ndCBtZXJnZWQgdmlhIGEgc3Vic3lzdGVtIHRyZWUuCitPbmNlIHN1Y2ggcGF0Y2hlcyBoYXMgcHJvdmVkIGl0cyB3b3J0aCBpbiAtbW0gZm9yIGEgd2hpbGUgQW5kcmV3IHB1c2hlcworaXQgb24gdG8gTGludXMgZm9yIGluY2x1c2lvbiBpbiBtYWlubGluZS4KIAotVGhpcyBicmFuY2ggaXMgaW4gY29uc3RhbnQgZmx1eCBhbmQgY29udGFpbnMgbWFueSBleHBlcmltZW50YWwgZmVhdHVyZXMsIGEKK1RoZSBsaW51eC1uZXh0IHRyZWUgaXMgZGFpbHkgdXBkYXRlZCwgYW5kIGluY2x1ZGVzIHRoZSAtbW0gcGF0Y2hlcy4KK0JvdGggYXJlIGluIGNvbnN0YW50IGZsdXggYW5kIGNvbnRhaW5zIG1hbnkgZXhwZXJpbWVudGFsIGZlYXR1cmVzLCBhCiBsb3Qgb2YgZGVidWdnaW5nIHBhdGNoZXMgbm90IGFwcHJvcHJpYXRlIGZvciBtYWlubGluZSBldGMuLCBhbmQgaXMgdGhlIG1vc3QKIGV4cGVyaW1lbnRhbCBvZiB0aGUgYnJhbmNoZXMgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuCiAKLVRoZXNlIGtlcm5lbHMgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IgdXNlIG9uIHN5c3RlbXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUKK1RoZXNlIHBhdGNoZXMgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IgdXNlIG9uIHN5c3RlbXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUKIHN0YWJsZSBhbmQgdGhleSBhcmUgbW9yZSByaXNreSB0byBydW4gdGhhbiBhbnkgb2YgdGhlIG90aGVyIGJyYW5jaGVzIChtYWtlCiBzdXJlIHlvdSBoYXZlIHVwLXRvLWRhdGUgYmFja3VwcyAtLSB0aGF0IGdvZXMgZm9yIGFueSBleHBlcmltZW50YWwga2VybmVsIGJ1dAotZXZlbiBtb3JlIHNvIGZvciAtbW0ga2VybmVscykuCitldmVuIG1vcmUgc28gZm9yIC1tbSBwYXRjaGVzIG9yIHVzaW5nIGEgS2VybmVsIGZyb20gdGhlIGxpbnV4LW5leHQgdHJlZSkuCiAKLVRoZXNlIGtlcm5lbHMgaW4gYWRkaXRpb24gdG8gYWxsIHRoZSBvdGhlciBleHBlcmltZW50YWwgcGF0Y2hlcyB0aGV5IGNvbnRhaW4KLXVzdWFsbHkgYWxzbyBjb250YWluIGFueSBjaGFuZ2VzIGluIHRoZSBtYWlubGluZSAtZ2l0IGtlcm5lbHMgYXZhaWxhYmxlIGF0Ci10aGUgdGltZSBvZiByZWxlYXNlLgorVGVzdGluZyBvZiAtbW0gcGF0Y2hlcyBhbmQgbGludXgtbmV4dCBpcyBncmVhdGx5IGFwcHJlY2lhdGVkIHNpbmNlIHRoZSB3aG9sZQorcG9pbnQgb2YgdGhvc2UgYXJlIHRvIHdlZWQgb3V0IHJlZ3Jlc3Npb25zLCBjcmFzaGVzLCBkYXRhIGNvcnJ1cHRpb24gYnVncywKK2J1aWxkIGJyZWFrYWdlIChhbmQgYW55IG90aGVyIGJ1ZyBpbiBnZW5lcmFsKSBiZWZvcmUgY2hhbmdlcyBhcmUgbWVyZ2VkIGludG8KK3RoZSBtb3JlIHN0YWJsZSBtYWlubGluZSBMaW51cyB0cmVlLgogCi1UZXN0aW5nIG9mIC1tbSBrZXJuZWxzIGlzIGdyZWF0bHkgYXBwcmVjaWF0ZWQgc2luY2UgdGhlIHdob2xlIHBvaW50IG9mIHRoZQotdHJlZSBpcyB0byB3ZWVkIG91dCByZWdyZXNzaW9ucywgY3Jhc2hlcywgZGF0YSBjb3JydXB0aW9uIGJ1Z3MsIGJ1aWxkCi1icmVha2FnZSAoYW5kIGFueSBvdGhlciBidWcgaW4gZ2VuZXJhbCkgYmVmb3JlIGNoYW5nZXMgYXJlIG1lcmdlZCBpbnRvIHRoZQotbW9yZSBzdGFibGUgbWFpbmxpbmUgTGludXMgdHJlZS4KLUJ1dCB0ZXN0ZXJzIG9mIC1tbSBzaG91bGQgYmUgYXdhcmUgdGhhdCBicmVha2FnZSBpbiB0aGlzIHRyZWUgaXMgbW9yZSBjb21tb24KLXRoYW4gaW4gYW55IG90aGVyIHRyZWUuCi0KLVRoZSAtbW0ga2VybmVscyBhcmUgbm90IHJlbGVhc2VkIG9uIGEgZml4ZWQgc2NoZWR1bGUsIGJ1dCB1c3VhbGx5IGEgZmV3IC1tbQota2VybmVscyBhcmUgcmVsZWFzZWQgaW4gYmV0d2VlbiBlYWNoIC1yYyBrZXJuZWwgKDEgdG8gMyBpcyBjb21tb24pLgotVGhlIC1tbSBrZXJuZWxzIGFwcGx5IHRvIGVpdGhlciBhIGJhc2UgMi42Lngga2VybmVsICh3aGVuIG5vIC1yYyBrZXJuZWxzCi1oYXZlIGJlZW4gcmVsZWFzZWQgeWV0KSBvciB0byBhIExpbnVzIC1yYyBrZXJuZWwuCi0KLUhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgYXBwbHlpbmcgdGhlIC1tbSBwYXRjaGVzOgotCi0jIG1vdmluZyBmcm9tIDIuNi4xMiB0byAyLjYuMTItbW0xCi0kIGNkIH4vbGludXgtMi42LjEyCQkJIyBjaGFuZ2UgdG8gdGhlIDIuNi4xMiBzb3VyY2UgZGlyCi0kIHBhdGNoIC1wMSA8IC4uLzIuNi4xMi1tbTEJCSMgYXBwbHkgdGhlIDIuNi4xMi1tbTEgcGF0Y2gKLSQgY2QgLi4KLSQgbXYgbGludXgtMi42LjEyIGxpbnV4LTIuNi4xMi1tbTEJIyByZW5hbWUgdGhlIHNvdXJjZSBhcHByb3ByaWF0ZWx5Ci0KLSMgbW92aW5nIGZyb20gMi42LjEyLW1tMSB0byAyLjYuMTMtcmMzLW1tMwotJCBjZCB+L2xpbnV4LTIuNi4xMi1tbTEKLSQgcGF0Y2ggLXAxIC1SIDwgLi4vMi42LjEyLW1tMQkJIyByZXZlcnQgdGhlIDIuNi4xMi1tbTEgcGF0Y2gKLQkJCQkJIyB3ZSBub3cgaGF2ZSBhIDIuNi4xMiBzb3VyY2UKLSQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEzLXJjMwkjIGFwcGx5IHRoZSAyLjYuMTMtcmMzIHBhdGNoCi0JCQkJCSMgd2Ugbm93IGhhdmUgYSAyLjYuMTMtcmMzIHNvdXJjZQotJCBwYXRjaCAtcDEgPCAuLi8yLjYuMTMtcmMzLW1tMwkJIyBhcHBseSB0aGUgMi42LjEzLXJjMy1tbTMgcGF0Y2gKLSQgY2QgLi4KLSQgbXYgbGludXgtMi42LjEyLW1tMSBsaW51eC0yLjYuMTMtcmMzLW1tMwkjIHJlbmFtZSB0aGUgc291cmNlIGRpcgorQnV0IHRlc3RlcnMgb2YgLW1tIGFuZCBsaW51eC1uZXh0IHNob3VsZCBiZSBhd2FyZSB0aGF0IGJyZWFrYWdlcyBhcmUKK21vcmUgY29tbW9uIHRoYW4gaW4gYW55IG90aGVyIHRyZWUuCiAKIAogVGhpcyBjb25jbHVkZXMgdGhpcyBsaXN0IG9mIGV4cGxhbmF0aW9ucyBvZiB0aGUgdmFyaW91cyBrZXJuZWwgdHJlZXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FybS9DQ04udHh0IGIvRG9jdW1lbnRhdGlvbi9hcm0vQ0NOLnR4dAppbmRleCBmZmNhNDQzLi4xNWNkYjdiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FybS9DQ04udHh0CisrKyBiL0RvY3VtZW50YXRpb24vYXJtL0NDTi50eHQKQEAgLTE4LDEzICsxOCwxNyBAQAogZGlyZWN0b3J5IHByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gdGVtcGxhdGVzIGZvciBhbGwgZG9jdW1lbnRlZAogZXZlbnRzLCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggcGVyZiB0b29sLiBGb3IgZXhhbXBsZSAieHBfdmFsaWRfZmxpdCIKIGlzIGFuIGVxdWl2YWxlbnQgb2YgInR5cGU9MHg4LGV2ZW50PTB4NCIuIE90aGVyIHBhcmFtZXRlcnMgbXVzdCBiZQotZXhwbGljaXRseSBzcGVjaWZpZWQuIEZvciBldmVudHMgb3JpZ2luYXRpbmcgZnJvbSBkZXZpY2UsICJub2RlIgotZGVmaW5lcyBpdHMgaW5kZXguIEFsbCBjcm9zc3BvaW50IGV2ZW50cyByZXF1aXJlICJ4cCIgKGluZGV4KSwKLSJwb3J0IiAoZGV2aWNlIHBvcnQgbnVtYmVyKSBhbmQgInZjIiAodmlydHVhbCBjaGFubmVsIElEKSBhbmQKLSJkaXIiIChkaXJlY3Rpb24pLiBXYXRjaHBvaW50cyAoc3BlY2lhbCAiZXZlbnQiIHZhbHVlIDB4ZmUpIGFsc28KLXJlcXVpcmUgY29tcGFyYXRvciB2YWx1ZXMgKCJjbXBfbCIgYW5kICJjbXBfaCIpIGFuZCAibWFzayIsIGJlaW5nCi1pbmRleCBvZiB0aGUgY29tcGFyYXRvciBtYXNrLgorZXhwbGljaXRseSBzcGVjaWZpZWQuCiAKK0ZvciBldmVudHMgb3JpZ2luYXRpbmcgZnJvbSBkZXZpY2UsICJub2RlIiBkZWZpbmVzIGl0cyBpbmRleC4KKworQ3Jvc3Nwb2ludCBQTVUgZXZlbnRzIHJlcXVpcmUgInhwIiAoaW5kZXgpLCAiYnVzIiAoYnVzIG51bWJlcikKK2FuZCAidmMiICh2aXJ0dWFsIGNoYW5uZWwgSUQpLgorCitDcm9zc3BvaW50IHdhdGNocG9pbnQtYmFzZWQgZXZlbnRzIChzcGVjaWFsICJldmVudCIgdmFsdWUgMHhmZSkKK3JlcXVpcmUgInhwIiBhbmQgInZjIiBhcyBhcyBhYm92ZSBwbHVzICJwb3J0IiAoZGV2aWNlIHBvcnQgaW5kZXgpLAorImRpciIgKHRyYW5zbWl0L3JlY2VpdmUgZGlyZWN0aW9uKSwgY29tcGFyYXRvciB2YWx1ZXMgKCJjbXBfbCIKK2FuZCAiY21wX2giKSBhbmQgIm1hc2siLCBiZWluZyBpbmRleCBvZiB0aGUgY29tcGFyYXRvciBtYXNrLgogTWFza3MgYXJlIGRlZmluZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBldmVudCBkZXNjcmlwdGlvbgogKGR1ZSB0byBsaW1pdGVkIG51bWJlciBvZiB0aGUgY29uZmlnIHZhbHVlcykgaW4gdGhlICJjbXBfbWFzayIKIGRpcmVjdG9yeSwgd2l0aCBmaXJzdCA4IGNvbmZpZ3VyYWJsZSBieSB1c2VyIGFuZCBhZGRpdGlvbmFsCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FybS9zdW54aS9SRUFETUUgYi9Eb2N1bWVudGF0aW9uL2FybS9zdW54aS9SRUFETUUKaW5kZXggZTVhMTE1Zi4uYzdhMDU1NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hcm0vc3VueGkvUkVBRE1FCisrKyBiL0RvY3VtZW50YXRpb24vYXJtL3N1bnhpL1JFQURNRQpAQCAtNzMsNCArNzMsMTMgQEAKICAgICAqIE9jdGEgQVJNIENvcnRleC1BNyBiYXNlZCBTb0NzCiAgICAgICAtIEFsbHdpbm5lciBBODNUCiAgICAgICAgICsgRGF0YXNoZWV0Ci0gICAgICAgICAgaHR0cDovL2RsLmxpbnV4LXN1bnhpLm9yZy9BODNUL0E4M1RfZGF0YXNoZWV0X1JldmlzaW9uXzEuMS5wZGYKKyAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYWxsd2lubmVyLXpoL2RvY3VtZW50cy9yYXcvbWFzdGVyL0E4M1QvQTgzVF9EYXRhc2hlZXRfdjEuM18yMDE1MDUxMC5wZGYKKyAgICAgICAgKyBVc2VyIE1hbnVhbAorICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGx3aW5uZXItemgvZG9jdW1lbnRzL3Jhdy9tYXN0ZXIvQTgzVC9BODNUX1VzZXJfTWFudWFsX3YxLjUuMV8yMDE1MDUxMy5wZGYKKworICAgICogUXVhZCBBUk0gQ29ydGV4LUE1MyBiYXNlZCBTb0NzCisgICAgICAtIEFsbHdpbm5lciBBNjQKKyAgICAgICAgKyBEYXRhc2hlZXQKKyAgICAgICAgICBodHRwOi8vZGwubGludXgtc3VueGkub3JnL0E2NC9BNjRfRGF0YXNoZWV0X1YxLjEucGRmCisgICAgICAgICsgVXNlciBNYW51YWwKKyAgICAgICAgICBodHRwOi8vZGwubGludXgtc3VueGkub3JnL0E2NC9BbGx3aW5uZXIlMjBBNjQlMjBVc2VyJTIwTWFudWFsJTIwdjEuMC5wZGYKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXJtNjQvc2lsaWNvbi1lcnJhdGEudHh0IGIvRG9jdW1lbnRhdGlvbi9hcm02NC9zaWxpY29uLWVycmF0YS50eHQKaW5kZXggNGRhNjBiNC4uNDA1ZGExMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hcm02NC9zaWxpY29uLWVycmF0YS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hcm02NC9zaWxpY29uLWVycmF0YS50eHQKQEAgLTUzLDYgKzUzLDcgQEAKIHwgQVJNICAgICAgICAgICAgfCBDb3J0ZXgtQTU3ICAgICAgfCAjODMyMDc1ICAgICAgICAgfCBBUk02NF9FUlJBVFVNXzgzMjA3NSAgICB8CiB8IEFSTSAgICAgICAgICAgIHwgQ29ydGV4LUE1NyAgICAgIHwgIzg1MjUyMyAgICAgICAgIHwgTi9BICAgICAgICAgICAgICAgICAgICAgfAogfCBBUk0gICAgICAgICAgICB8IENvcnRleC1BNTcgICAgICB8ICM4MzQyMjAgICAgICAgICB8IEFSTTY0X0VSUkFUVU1fODM0MjIwICAgIHwKK3wgQVJNICAgICAgICAgICAgfCBDb3J0ZXgtQTcyICAgICAgfCAjODUzNzA5ICAgICAgICAgfCBOL0EgICAgICAgICAgICAgICAgICAgICB8CiB8IEFSTSAgICAgICAgICAgIHwgTU1VLTUwMCAgICAgICAgIHwgIzg0MTExOSwjODI2NDE5IHwgTi9BICAgICAgICAgICAgICAgICAgICAgfAogfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwKIHwgQ2F2aXVtICAgICAgICAgfCBUaHVuZGVyWCBJVFMgICAgfCAjMjIzNzUsICMyNDMxMyAgfCBDQVZJVU1fRVJSQVRVTV8yMjM3NSAgICB8CkBAIC02MCwzICs2MSw1IEBACiB8IENhdml1bSAgICAgICAgIHwgVGh1bmRlclggR0lDdjMgIHwgIzIzMTU0ICAgICAgICAgIHwgQ0FWSVVNX0VSUkFUVU1fMjMxNTQgICAgfAogfCBDYXZpdW0gICAgICAgICB8IFRodW5kZXJYIENvcmUgICB8ICMyNzQ1NiAgICAgICAgICB8IENBVklVTV9FUlJBVFVNXzI3NDU2ICAgIHwKIHwgQ2F2aXVtICAgICAgICAgfCBUaHVuZGVyWCBTTU1VdjIgfCAjMjc3MDQgICAgICAgICAgfCBOL0EJCSAgICAgICB8Cit8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCBGcmVlc2NhbGUvTlhQICB8IExTMjA4MEEvTFMxMDQzQSB8IEEtMDA4NTg1ICAgICAgICB8IEZTTF9FUlJBVFVNX0EwMDg1ODUgICAgIHwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2xrLnR4dCBiL0RvY3VtZW50YXRpb24vY2xrLnR4dAppbmRleCA1YzRiYzRkLi4yMmYwMjZhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nsay50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jbGsudHh0CkBAIC0zMSwyNCArMzEsMjUgQEAKIGhhcmR3YXJlLXNwZWNpZmljIGJpdHMgZm9yIHRoZSBoeXBvdGhldGljYWwgImZvbyIgaGFyZHdhcmUuCiAKIFR5aW5nIHRoZSB0d28gaGFsdmVzIG9mIHRoaXMgaW50ZXJmYWNlIHRvZ2V0aGVyIGlzIHN0cnVjdCBjbGtfaHcsIHdoaWNoCi1pcyBkZWZpbmVkIGluIHN0cnVjdCBjbGtfZm9vIGFuZCBwb2ludGVkIHRvIHdpdGhpbiBzdHJ1Y3QgY2xrLiAgVGhpcworaXMgZGVmaW5lZCBpbiBzdHJ1Y3QgY2xrX2ZvbyBhbmQgcG9pbnRlZCB0byB3aXRoaW4gc3RydWN0IGNsa19jb3JlLiAgVGhpcwogYWxsb3dzIGZvciBlYXN5IG5hdmlnYXRpb24gYmV0d2VlbiB0aGUgdHdvIGRpc2NyZXRlIGhhbHZlcyBvZiB0aGUgY29tbW9uCiBjbG9jayBpbnRlcmZhY2UuCiAKIAlQYXJ0IDIgLSBjb21tb24gZGF0YSBzdHJ1Y3R1cmVzIGFuZCBhcGkKIAotQmVsb3cgaXMgdGhlIGNvbW1vbiBzdHJ1Y3QgY2xrIGRlZmluaXRpb24gZnJvbQotaW5jbHVkZS9saW51eC9jbGstcHJpdmF0ZS5oLCBtb2RpZmllZCBmb3IgYnJldml0eToKK0JlbG93IGlzIHRoZSBjb21tb24gc3RydWN0IGNsa19jb3JlIGRlZmluaXRpb24gZnJvbQorZHJpdmVycy9jbGsvY2xrLmMsIG1vZGlmaWVkIGZvciBicmV2aXR5OgogCi0Jc3RydWN0IGNsayB7CisJc3RydWN0IGNsa19jb3JlIHsKIAkJY29uc3QgY2hhcgkJKm5hbWU7CiAJCWNvbnN0IHN0cnVjdCBjbGtfb3BzCSpvcHM7CiAJCXN0cnVjdCBjbGtfaHcJCSpodzsKLQkJY2hhcgkJCSoqcGFyZW50X25hbWVzOwotCQlzdHJ1Y3QgY2xrCQkqKnBhcmVudHM7Ci0JCXN0cnVjdCBjbGsJCSpwYXJlbnQ7Ci0JCXN0cnVjdCBobGlzdF9oZWFkCWNoaWxkcmVuOwotCQlzdHJ1Y3QgaGxpc3Rfbm9kZQljaGlsZF9ub2RlOworCQlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CisJCXN0cnVjdCBjbGtfY29yZQkJKnBhcmVudDsKKwkJY29uc3QgY2hhcgkJKipwYXJlbnRfbmFtZXM7CisJCXN0cnVjdCBjbGtfY29yZQkJKipwYXJlbnRzOworCQl1OAkJCW51bV9wYXJlbnRzOworCQl1OAkJCW5ld19wYXJlbnRfaW5kZXg7CiAJCS4uLgogCX07CiAKQEAgLTU2LDE2ICs1NywxOSBAQAogYXBpIGl0c2VsZiBkZWZpbmVzIHNldmVyYWwgZHJpdmVyLWZhY2luZyBmdW5jdGlvbnMgd2hpY2ggb3BlcmF0ZSBvbgogc3RydWN0IGNsay4gIFRoYXQgYXBpIGlzIGRvY3VtZW50ZWQgaW4gaW5jbHVkZS9saW51eC9jbGsuaC4KIAotUGxhdGZvcm1zIGFuZCBkZXZpY2VzIHV0aWxpemluZyB0aGUgY29tbW9uIHN0cnVjdCBjbGsgdXNlIHRoZSBzdHJ1Y3QKLWNsa19vcHMgcG9pbnRlciBpbiBzdHJ1Y3QgY2xrIHRvIHBlcmZvcm0gdGhlIGhhcmR3YXJlLXNwZWNpZmljIHBhcnRzIG9mCi10aGUgb3BlcmF0aW9ucyBkZWZpbmVkIGluIGNsay5oOgorUGxhdGZvcm1zIGFuZCBkZXZpY2VzIHV0aWxpemluZyB0aGUgY29tbW9uIHN0cnVjdCBjbGtfY29yZSB1c2UgdGhlIHN0cnVjdAorY2xrX29wcyBwb2ludGVyIGluIHN0cnVjdCBjbGtfY29yZSB0byBwZXJmb3JtIHRoZSBoYXJkd2FyZS1zcGVjaWZpYyBwYXJ0cyBvZgordGhlIG9wZXJhdGlvbnMgZGVmaW5lZCBpbiBjbGstcHJvdmlkZXIuaDoKIAogCXN0cnVjdCBjbGtfb3BzIHsKIAkJaW50CQkoKnByZXBhcmUpKHN0cnVjdCBjbGtfaHcgKmh3KTsKIAkJdm9pZAkJKCp1bnByZXBhcmUpKHN0cnVjdCBjbGtfaHcgKmh3KTsKKwkJaW50CQkoKmlzX3ByZXBhcmVkKShzdHJ1Y3QgY2xrX2h3ICpodyk7CisJCXZvaWQJCSgqdW5wcmVwYXJlX3VudXNlZCkoc3RydWN0IGNsa19odyAqaHcpOwogCQlpbnQJCSgqZW5hYmxlKShzdHJ1Y3QgY2xrX2h3ICpodyk7CiAJCXZvaWQJCSgqZGlzYWJsZSkoc3RydWN0IGNsa19odyAqaHcpOwogCQlpbnQJCSgqaXNfZW5hYmxlZCkoc3RydWN0IGNsa19odyAqaHcpOworCQl2b2lkCQkoKmRpc2FibGVfdW51c2VkKShzdHJ1Y3QgY2xrX2h3ICpodyk7CiAJCXVuc2lnbmVkIGxvbmcJKCpyZWNhbGNfcmF0ZSkoc3RydWN0IGNsa19odyAqaHcsCiAJCQkJCQl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKTsKIAkJbG9uZwkJKCpyb3VuZF9yYXRlKShzdHJ1Y3QgY2xrX2h3ICpodywKQEAgLTg0LDYgKzg4LDggQEAKIAkJCQkJICAgIHU4IGluZGV4KTsKIAkJdW5zaWduZWQgbG9uZwkoKnJlY2FsY19hY2N1cmFjeSkoc3RydWN0IGNsa19odyAqaHcsCiAJCQkJCQl1bnNpZ25lZCBsb25nIHBhcmVudF9hY2N1cmFjeSk7CisJCWludAkJKCpnZXRfcGhhc2UpKHN0cnVjdCBjbGtfaHcgKmh3KTsKKwkJaW50CQkoKnNldF9waGFzZSkoc3RydWN0IGNsa19odyAqaHcsIGludCBkZWdyZWVzKTsKIAkJdm9pZAkJKCppbml0KShzdHJ1Y3QgY2xrX2h3ICpodyk7CiAJCWludAkJKCpkZWJ1Z19pbml0KShzdHJ1Y3QgY2xrX2h3ICpodywKIAkJCQkJICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKQEAgLTkxLDcgKzk3LDcgQEAKIAogCVBhcnQgMyAtIGhhcmR3YXJlIGNsayBpbXBsZW1lbnRhdGlvbnMKIAotVGhlIHN0cmVuZ3RoIG9mIHRoZSBjb21tb24gc3RydWN0IGNsayBjb21lcyBmcm9tIGl0cyAub3BzIGFuZCAuaHcgcG9pbnRlcnMKK1RoZSBzdHJlbmd0aCBvZiB0aGUgY29tbW9uIHN0cnVjdCBjbGtfY29yZSBjb21lcyBmcm9tIGl0cyAub3BzIGFuZCAuaHcgcG9pbnRlcnMKIHdoaWNoIGFic3RyYWN0IHRoZSBkZXRhaWxzIG9mIHN0cnVjdCBjbGsgZnJvbSB0aGUgaGFyZHdhcmUtc3BlY2lmaWMgYml0cywgYW5kCiB2aWNlIHZlcnNhLiAgVG8gaWxsdXN0cmF0ZSBjb25zaWRlciB0aGUgc2ltcGxlIGdhdGVhYmxlIGNsayBpbXBsZW1lbnRhdGlvbiBpbgogZHJpdmVycy9jbGsvY2xrLWdhdGUuYzoKQEAgLTEwNyw3ICsxMTMsNyBAQAoga25vd2xlZGdlIGFib3V0IHdoaWNoIHJlZ2lzdGVyIGFuZCBiaXQgY29udHJvbHMgdGhpcyBjbGsncyBnYXRpbmcuCiBOb3RoaW5nIGFib3V0IGNsb2NrIHRvcG9sb2d5IG9yIGFjY291bnRpbmcsIHN1Y2ggYXMgZW5hYmxlX2NvdW50IG9yCiBub3RpZmllcl9jb3VudCwgaXMgbmVlZGVkIGhlcmUuICBUaGF0IGlzIGFsbCBoYW5kbGVkIGJ5IHRoZSBjb21tb24KLWZyYW1ld29yayBjb2RlIGFuZCBzdHJ1Y3QgY2xrLgorZnJhbWV3b3JrIGNvZGUgYW5kIHN0cnVjdCBjbGtfY29yZS4KIAogTGV0J3Mgd2FsayB0aHJvdWdoIGVuYWJsaW5nIHRoaXMgY2xrIGZyb20gZHJpdmVyIGNvZGU6CiAKQEAgLTEzOSwyMiArMTQ1LDE4IEBACiAKIE5vdGUgdGhhdCB0b19jbGtfZ2F0ZSBpcyBkZWZpbmVkIGFzOgogCi0jZGVmaW5lIHRvX2Nsa19nYXRlKF9odykgY29udGFpbmVyX29mKF9odywgc3RydWN0IGNsa19nYXRlLCBjbGspCisjZGVmaW5lIHRvX2Nsa19nYXRlKF9odykgY29udGFpbmVyX29mKF9odywgc3RydWN0IGNsa19nYXRlLCBodykKIAogVGhpcyBwYXR0ZXJuIG9mIGFic3RyYWN0aW9uIGlzIHVzZWQgZm9yIGV2ZXJ5IGNsb2NrIGhhcmR3YXJlCiByZXByZXNlbnRhdGlvbi4KIAogCVBhcnQgNCAtIHN1cHBvcnRpbmcgeW91ciBvd24gY2xrIGhhcmR3YXJlCiAKLVdoZW4gaW1wbGVtZW50aW5nIHN1cHBvcnQgZm9yIGEgbmV3IHR5cGUgb2YgY2xvY2sgaXQgb25seSBuZWNlc3NhcnkgdG8KK1doZW4gaW1wbGVtZW50aW5nIHN1cHBvcnQgZm9yIGEgbmV3IHR5cGUgb2YgY2xvY2sgaXQgaXMgb25seSBuZWNlc3NhcnkgdG8KIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBoZWFkZXI6CiAKICNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KIAotaW5jbHVkZS9saW51eC9jbGsuaCBpcyBpbmNsdWRlZCB3aXRoaW4gdGhhdCBoZWFkZXIgYW5kIGNsay1wcml2YXRlLmgKLW11c3QgbmV2ZXIgYmUgaW5jbHVkZWQgZnJvbSB0aGUgY29kZSB3aGljaCBpbXBsZW1lbnRzIHRoZSBvcGVyYXRpb25zIGZvcgotYSBjbG9jay4gIE1vcmUgb24gdGhhdCBiZWxvdyBpbiBQYXJ0IDUuCi0KIFRvIGNvbnN0cnVjdCBhIGNsayBoYXJkd2FyZSBzdHJ1Y3R1cmUgZm9yIHlvdXIgcGxhdGZvcm0geW91IG11c3QgZGVmaW5lCiB0aGUgZm9sbG93aW5nOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvY2NpbmVsbGUudHh0IGIvRG9jdW1lbnRhdGlvbi9jb2NjaW5lbGxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmYjFkYS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2NvY2NpbmVsbGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLUNvcHlyaWdodCAyMDEwIE5pY29sYXMgUGFsaXggPG5wYWxpeEBkaWt1LmRrPgotQ29weXJpZ2h0IDIwMTAgSnVsaWEgTGF3YWxsIDxqdWxpYUBkaWt1LmRrPgotQ29weXJpZ2h0IDIwMTAgR2lsbGVzIE11bGxlciA8R2lsbGVzLk11bGxlckBsaXA2LmZyPgotCi0KLSBHZXR0aW5nIENvY2NpbmVsbGUKLX5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLVRoZSBzZW1hbnRpYyBwYXRjaGVzIGluY2x1ZGVkIGluIHRoZSBrZXJuZWwgdXNlIGZlYXR1cmVzIGFuZCBvcHRpb25zCi13aGljaCBhcmUgcHJvdmlkZWQgYnkgQ29jY2luZWxsZSB2ZXJzaW9uIDEuMC4wLXJjMTEgYW5kIGFib3ZlLgotVXNpbmcgZWFybGllciB2ZXJzaW9ucyB3aWxsIGZhaWwgYXMgdGhlIG9wdGlvbiBuYW1lcyB1c2VkIGJ5Ci10aGUgQ29jY2luZWxsZSBmaWxlcyBhbmQgY29jY2ljaGVjayBoYXZlIGJlZW4gdXBkYXRlZC4KLQotQ29jY2luZWxsZSBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgcGFja2FnZSBtYW5hZ2VyCi1vZiBtYW55IGRpc3RyaWJ1dGlvbnMsIGUuZy4gOgotCi0gLSBEZWJpYW4KLSAtIEZlZG9yYQotIC0gVWJ1bnR1Ci0gLSBPcGVuU1VTRQotIC0gQXJjaCBMaW51eAotIC0gTmV0QlNECi0gLSBGcmVlQlNECi0KLQotWW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIHJlbGVhc2VkIGZyb20gdGhlIENvY2NpbmVsbGUgaG9tZXBhZ2UgYXQKLWh0dHA6Ly9jb2NjaW5lbGxlLmxpcDYuZnIvCi0KLUluZm9ybWF0aW9uIGFuZCB0aXBzIGFib3V0IENvY2NpbmVsbGUgYXJlIGFsc28gcHJvdmlkZWQgb24gdGhlIHdpa2kKLXBhZ2VzIGF0IGh0dHA6Ly9jb2NjaS5la3N0cmFuZXQuZGlrdS5kay93aWtpL2Rva3UucGhwCi0KLU9uY2UgeW91IGhhdmUgaXQsIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6Ci0KLSAgICAgCS4vY29uZmlndXJlCi0gICAgICAgIG1ha2UKLQotYXMgYSByZWd1bGFyIHVzZXIsIGFuZCBpbnN0YWxsIGl0IHdpdGgKLQotICAgICAgICBzdWRvIG1ha2UgaW5zdGFsbAotCi0gU3VwcGxlbWVudGFsIGRvY3VtZW50YXRpb24KLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotRm9yIHN1cHBsZW1lbnRhbCBkb2N1bWVudGF0aW9uIHJlZmVyIHRvIHRoZSB3aWtpOgotCi1odHRwczovL2JvdHRlc3Qud2lraS5rZXJuZWwub3JnL2NvY2NpY2hlY2sKLQotVGhlIHdpa2kgZG9jdW1lbnRhdGlvbiBhbHdheXMgcmVmZXJzIHRvIHRoZSBsaW51eC1uZXh0IHZlcnNpb24gb2YgdGhlIHNjcmlwdC4KLQotIFVzaW5nIENvY2NpbmVsbGUgb24gdGhlIExpbnV4IGtlcm5lbAotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotQSBDb2NjaW5lbGxlLXNwZWNpZmljIHRhcmdldCBpcyBkZWZpbmVkIGluIHRoZSB0b3AgbGV2ZWwKLU1ha2VmaWxlLiBUaGlzIHRhcmdldCBpcyBuYW1lZCAnY29jY2ljaGVjaycgYW5kIGNhbGxzIHRoZSAnY29jY2ljaGVjaycKLWZyb250LWVuZCBpbiB0aGUgJ3NjcmlwdHMnIGRpcmVjdG9yeS4KLQotRm91ciBiYXNpYyBtb2RlcyBhcmUgZGVmaW5lZDogcGF0Y2gsIHJlcG9ydCwgY29udGV4dCwgYW5kIG9yZy4gVGhlIG1vZGUgdG8KLXVzZSBpcyBzcGVjaWZpZWQgYnkgc2V0dGluZyB0aGUgTU9ERSB2YXJpYWJsZSB3aXRoICdNT0RFPTxtb2RlPicuCi0KLSdwYXRjaCcgcHJvcG9zZXMgYSBmaXgsIHdoZW4gcG9zc2libGUuCi0KLSdyZXBvcnQnIGdlbmVyYXRlcyBhIGxpc3QgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6Ci0gIGZpbGU6bGluZTpjb2x1bW4tY29sdW1uOiBtZXNzYWdlCi0KLSdjb250ZXh0JyBoaWdobGlnaHRzIGxpbmVzIG9mIGludGVyZXN0IGFuZCB0aGVpciBjb250ZXh0IGluIGEKLWRpZmYtbGlrZSBzdHlsZS5MaW5lcyBvZiBpbnRlcmVzdCBhcmUgaW5kaWNhdGVkIHdpdGggJy0nLgotCi0nb3JnJyBnZW5lcmF0ZXMgYSByZXBvcnQgaW4gdGhlIE9yZyBtb2RlIGZvcm1hdCBvZiBFbWFjcy4KLQotTm90ZSB0aGF0IG5vdCBhbGwgc2VtYW50aWMgcGF0Y2hlcyBpbXBsZW1lbnQgYWxsIG1vZGVzLiBGb3IgZWFzeSB1c2UKLW9mIENvY2NpbmVsbGUsIHRoZSBkZWZhdWx0IG1vZGUgaXMgInJlcG9ydCIuCi0KLVR3byBvdGhlciBtb2RlcyBwcm92aWRlIHNvbWUgY29tbW9uIGNvbWJpbmF0aW9ucyBvZiB0aGVzZSBtb2Rlcy4KLQotJ2NoYWluJyB0cmllcyB0aGUgcHJldmlvdXMgbW9kZXMgaW4gdGhlIG9yZGVyIGFib3ZlIHVudGlsIG9uZSBzdWNjZWVkcy4KLQotJ3JlcCtjdHh0JyBydW5zIHN1Y2Nlc3NpdmVseSB0aGUgcmVwb3J0IG1vZGUgYW5kIHRoZSBjb250ZXh0IG1vZGUuCi0JICAgSXQgc2hvdWxkIGJlIHVzZWQgd2l0aCB0aGUgQyBvcHRpb24gKGRlc2NyaWJlZCBsYXRlcikKLQkgICB3aGljaCBjaGVja3MgdGhlIGNvZGUgb24gYSBmaWxlIGJhc2lzLgotCi1FeGFtcGxlczoKLQlUbyBtYWtlIGEgcmVwb3J0IGZvciBldmVyeSBzZW1hbnRpYyBwYXRjaCwgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKLQotCQltYWtlIGNvY2NpY2hlY2sgTU9ERT1yZXBvcnQKLQotCVRvIHByb2R1Y2UgcGF0Y2hlcywgcnVuOgotCi0JCW1ha2UgY29jY2ljaGVjayBNT0RFPXBhdGNoCi0KLQotVGhlIGNvY2NpY2hlY2sgdGFyZ2V0IGFwcGxpZXMgZXZlcnkgc2VtYW50aWMgcGF0Y2ggYXZhaWxhYmxlIGluIHRoZQotc3ViLWRpcmVjdG9yaWVzIG9mICdzY3JpcHRzL2NvY2NpbmVsbGUnIHRvIHRoZSBlbnRpcmUgTGludXgga2VybmVsLgotCi1Gb3IgZWFjaCBzZW1hbnRpYyBwYXRjaCwgYSBjb21taXQgbWVzc2FnZSBpcyBwcm9wb3NlZC4gIEl0IGdpdmVzIGEKLWRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIGJlaW5nIGNoZWNrZWQgYnkgdGhlIHNlbWFudGljIHBhdGNoLCBhbmQKLWluY2x1ZGVzIGEgcmVmZXJlbmNlIHRvIENvY2NpbmVsbGUuCi0KLUFzIGFueSBzdGF0aWMgY29kZSBhbmFseXplciwgQ29jY2luZWxsZSBwcm9kdWNlcyBmYWxzZQotcG9zaXRpdmVzLiBUaHVzLCByZXBvcnRzIG11c3QgYmUgY2FyZWZ1bGx5IGNoZWNrZWQsIGFuZCBwYXRjaGVzCi1yZXZpZXdlZC4KLQotVG8gZW5hYmxlIHZlcmJvc2UgbWVzc2FnZXMgc2V0IHRoZSBWPSB2YXJpYWJsZSwgZm9yIGV4YW1wbGU6Ci0KLSAgIG1ha2UgY29jY2ljaGVjayBNT0RFPXJlcG9ydCBWPTEKLQotIENvY2NpbmVsbGUgcGFyYWxsZWxpemF0aW9uCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLUJ5IGRlZmF1bHQsIGNvY2NpY2hlY2sgdHJpZXMgdG8gcnVuIGFzIHBhcmFsbGVsIGFzIHBvc3NpYmxlLiBUbyBjaGFuZ2UKLXRoZSBwYXJhbGxlbGlzbSwgc2V0IHRoZSBKPSB2YXJpYWJsZS4gRm9yIGV4YW1wbGUsIHRvIHJ1biBhY3Jvc3MgNCBDUFVzOgotCi0gICBtYWtlIGNvY2NpY2hlY2sgTU9ERT1yZXBvcnQgSj00Ci0KLUFzIG9mIENvY2NpbmVsbGUgMS4wLjIgQ29jY2luZWxsZSB1c2VzIE9jYW1sIHBhcm1hcCBmb3IgcGFyYWxsZWxpemF0aW9uLAotaWYgc3VwcG9ydCBmb3IgdGhpcyBpcyBkZXRlY3RlZCB5b3Ugd2lsbCBiZW5lZml0IGZyb20gcGFybWFwIHBhcmFsbGVsaXphdGlvbi4KLQotV2hlbiBwYXJtYXAgaXMgZW5hYmxlZCBjb2NjaWNoZWNrIHdpbGwgZW5hYmxlIGR5bmFtaWMgbG9hZCBiYWxhbmNpbmcgYnkgdXNpbmcKLSctLWNodW5rc2l6ZSAxJyBhcmd1bWVudCwgdGhpcyBlbnN1cmVzIHdlIGtlZXAgZmVlZGluZyB0aHJlYWRzIHdpdGggd29yawotb25lIGJ5IG9uZSwgc28gdGhhdCB3ZSBhdm9pZCB0aGUgc2l0dWF0aW9uIHdoZXJlIG1vc3Qgd29yayBnZXRzIGRvbmUgYnkgb25seQotYSBmZXcgdGhyZWFkcy4gV2l0aCBkeW5hbWljIGxvYWQgYmFsYW5jaW5nLCBpZiBhIHRocmVhZCBmaW5pc2hlcyBlYXJseSB3ZSBrZWVwCi1mZWVkaW5nIGl0IG1vcmUgd29yay4KLQotV2hlbiBwYXJtYXAgaXMgZW5hYmxlZCwgaWYgYW4gZXJyb3Igb2NjdXJzIGluIENvY2NpbmVsbGUsIHRoaXMgZXJyb3IKLXZhbHVlIGlzIHByb3BhZ2F0ZWQgYmFjaywgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgJ21ha2UgY29jY2ljaGVjaycKLWNhcHR1cmVzIHRoaXMgcmV0dXJuIHZhbHVlLgotCi0gVXNpbmcgQ29jY2luZWxsZSB3aXRoIGEgc2luZ2xlIHNlbWFudGljIHBhdGNoCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi1UaGUgb3B0aW9uYWwgbWFrZSB2YXJpYWJsZSBDT0NDSSBjYW4gYmUgdXNlZCB0byBjaGVjayBhIHNpbmdsZQotc2VtYW50aWMgcGF0Y2guIEluIHRoYXQgY2FzZSwgdGhlIHZhcmlhYmxlIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aAotdGhlIG5hbWUgb2YgdGhlIHNlbWFudGljIHBhdGNoIHRvIGFwcGx5LgotCi1Gb3IgaW5zdGFuY2U6Ci0KLQltYWtlIGNvY2NpY2hlY2sgQ09DQ0k9PG15X1NQLmNvY2NpPiBNT0RFPXBhdGNoCi1vcgotCW1ha2UgY29jY2ljaGVjayBDT0NDST08bXlfU1AuY29jY2k+IE1PREU9cmVwb3J0Ci0KLQotIENvbnRyb2xsaW5nIFdoaWNoIEZpbGVzIGFyZSBQcm9jZXNzZWQgYnkgQ29jY2luZWxsZQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci1CeSBkZWZhdWx0IHRoZSBlbnRpcmUga2VybmVsIHNvdXJjZSB0cmVlIGlzIGNoZWNrZWQuCi0KLVRvIGFwcGx5IENvY2NpbmVsbGUgdG8gYSBzcGVjaWZpYyBkaXJlY3RvcnksIE09IGNhbiBiZSB1c2VkLgotRm9yIGV4YW1wbGUsIHRvIGNoZWNrIGRyaXZlcnMvbmV0L3dpcmVsZXNzLyBvbmUgbWF5IHdyaXRlOgotCi0gICAgbWFrZSBjb2NjaWNoZWNrIE09ZHJpdmVycy9uZXQvd2lyZWxlc3MvCi0KLVRvIGFwcGx5IENvY2NpbmVsbGUgb24gYSBmaWxlIGJhc2lzLCBpbnN0ZWFkIG9mIGEgZGlyZWN0b3J5IGJhc2lzLCB0aGUKLWZvbGxvd2luZyBjb21tYW5kIG1heSBiZSB1c2VkOgotCi0gICAgbWFrZSBDPTEgQ0hFQ0s9InNjcmlwdHMvY29jY2ljaGVjayIKLQotVG8gY2hlY2sgb25seSBuZXdseSBlZGl0ZWQgY29kZSwgdXNlIHRoZSB2YWx1ZSAyIGZvciB0aGUgQyBmbGFnLCBpLmUuCi0KLSAgICBtYWtlIEM9MiBDSEVDSz0ic2NyaXB0cy9jb2NjaWNoZWNrIgotCi1JbiB0aGVzZSBtb2Rlcywgd2hpY2ggd29ya3Mgb24gYSBmaWxlIGJhc2lzLCB0aGVyZSBpcyBubyBpbmZvcm1hdGlvbgotYWJvdXQgc2VtYW50aWMgcGF0Y2hlcyBkaXNwbGF5ZWQsIGFuZCBubyBjb21taXQgbWVzc2FnZSBwcm9wb3NlZC4KLQotVGhpcyBydW5zIGV2ZXJ5IHNlbWFudGljIHBhdGNoIGluIHNjcmlwdHMvY29jY2luZWxsZSBieSBkZWZhdWx0LiBUaGUKLUNPQ0NJIHZhcmlhYmxlIG1heSBhZGRpdGlvbmFsbHkgYmUgdXNlZCB0byBvbmx5IGFwcGx5IGEgc2luZ2xlCi1zZW1hbnRpYyBwYXRjaCBhcyBzaG93biBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4KLQotVGhlICJyZXBvcnQiIG1vZGUgaXMgdGhlIGRlZmF1bHQuIFlvdSBjYW4gc2VsZWN0IGFub3RoZXIgb25lIHdpdGggdGhlCi1NT0RFIHZhcmlhYmxlIGV4cGxhaW5lZCBhYm92ZS4KLQotIERlYnVnZ2luZyBDb2NjaW5lbGxlIFNtUEwgcGF0Y2hlcwotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi1Vc2luZyBjb2NjaWNoZWNrIGlzIGJlc3QgYXMgaXQgcHJvdmlkZXMgaW4gdGhlIHNwYXRjaCBjb21tYW5kIGxpbmUKLWluY2x1ZGUgb3B0aW9ucyBtYXRjaGluZyB0aGUgb3B0aW9ucyB1c2VkIHdoZW4gd2UgY29tcGlsZSB0aGUga2VybmVsLgotWW91IGNhbiBsZWFybiB3aGF0IHRoZXNlIG9wdGlvbnMgYXJlIGJ5IHVzaW5nIFY9MSwgeW91IGNvdWxkIHRoZW4KLW1hbnVhbGx5IHJ1biBDb2NjaW5lbGxlIHdpdGggZGVidWcgb3B0aW9ucyBhZGRlZC4KLQotQWx0ZXJuYXRpdmVseSB5b3UgY2FuIGRlYnVnIHJ1bm5pbmcgQ29jY2luZWxsZSBhZ2FpbnN0IFNtUEwgcGF0Y2hlcwotYnkgYXNraW5nIGZvciBzdGRlcnIgdG8gYmUgcmVkaXJlY3RlZCB0byBzdGRlcnIsIGJ5IGRlZmF1bHQgc3RkZXJyCi1pcyByZWRpcmVjdGVkIHRvIC9kZXYvbnVsbCwgaWYgeW91J2QgbGlrZSB0byBjYXB0dXJlIHN0ZGVyciB5b3UKLWNhbiBzcGVjaWZ5IHRoZSBERUJVR19GSUxFPSJmaWxlLnR4dCIgb3B0aW9uIHRvIGNvY2NpY2hlY2suIEZvcgotaW5zdGFuY2U6Ci0KLSAgICBybSAtZiBjb2NjaS5lcnIKLSAgICBtYWtlIGNvY2NpY2hlY2sgQ09DQ0k9c2NyaXB0cy9jb2NjaW5lbGxlL2ZyZWUva2ZyZWUuY29jY2kgTU9ERT1yZXBvcnQgREVCVUdfRklMRT1jb2NjaS5lcnIKLSAgICBjYXQgY29jY2kuZXJyCi0KLVlvdSBjYW4gdXNlIFNQRkxBR1MgdG8gYWRkIGRlYnVnZ2luZyBmbGFncywgZm9yIGluc3RhbmNlIHlvdSBtYXkgd2FudCB0bwotYWRkIGJvdGggLS1wcm9maWxlIC0tc2hvdy10cnlpbmcgdG8gU1BGTEFHUyB3aGVuIGRlYnVnZ2luZy4gRm9yIGluc3RhbmNlCi15b3UgbWF5IHdhbnQgdG8gdXNlOgotCi0gICAgcm0gLWYgZXJyLmxvZwotICAgIGV4cG9ydCBDT0NDST1zY3JpcHRzL2NvY2NpbmVsbGUvbWlzYy9pcnFmX29uZXNob3QuY29jY2kKLSAgICBtYWtlIGNvY2NpY2hlY2sgREVCVUdfRklMRT0iZXJyLmxvZyIgTU9ERT1yZXBvcnQgU1BGTEFHUz0iLS1wcm9maWxlIC0tc2hvdy10cnlpbmciIE09Li9kcml2ZXJzL21mZC9hcml6b25hLWlycS5jCi0KLWVyci5sb2cgd2lsbCBub3cgaGF2ZSB0aGUgcHJvZmlsaW5nIGluZm9ybWF0aW9uLCB3aGlsZSBzdGRvdXQgd2lsbAotcHJvdmlkZSBzb21lIHByb2dyZXNzIGluZm9ybWF0aW9uIGFzIENvY2NpbmVsbGUgbW92ZXMgZm9yd2FyZCB3aXRoCi13b3JrLgotCi1ERUJVR19GSUxFIHN1cHBvcnQgaXMgb25seSBzdXBwb3J0ZWQgd2hlbiB1c2luZyBjb2NjaW5lbGxlID49IDEuMi4KLQotIC5jb2NjaWNvbmZpZyBzdXBwb3J0Ci1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLUNvY2NpbmVsbGUgc3VwcG9ydHMgcmVhZGluZyAuY29jY2ljb25maWcgZm9yIGRlZmF1bHQgQ29jY2luZWxsZSBvcHRpb25zIHRoYXQKLXNob3VsZCBiZSB1c2VkIGV2ZXJ5IHRpbWUgc3BhdGNoIGlzIHNwYXduZWQsIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGZvcgotdmFyaWFibGVzIGZvciAuY29jY2ljb25maWcgaXMgYXMgZm9sbG93czoKLQotICBvIFlvdXIgY3VycmVudCB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgaXMgcHJvY2Vzc2VkIGZpcnN0Ci0gIG8gWW91ciBkaXJlY3RvcnkgZnJvbSB3aGljaCBzcGF0Y2ggaXMgY2FsbGVkIGlzIHByb2Nlc3NlZCBuZXh0Ci0gIG8gVGhlIGRpcmVjdG9yeSBwcm92aWRlZCB3aXRoIHRoZSAtLWRpciBvcHRpb24gaXMgcHJvY2Vzc2VkIGxhc3QsIGlmIHVzZWQKLQotU2luY2UgY29jY2ljaGVjayBydW5zIHRocm91Z2ggbWFrZSwgaXQgbmF0dXJhbGx5IHJ1bnMgZnJvbSB0aGUga2VybmVsCi1wcm9wZXIgZGlyLCBhcyBzdWNoIHRoZSBzZWNvbmQgcnVsZSBhYm92ZSB3b3VsZCBiZSBpbXBsaWVkIGZvciBwaWNraW5nIHVwIGEKLS5jb2NjaWNvbmZpZyB3aGVuIHVzaW5nICdtYWtlIGNvY2NpY2hlY2snLgotCi0nbWFrZSBjb2NjaWNoZWNrJyBhbHNvIHN1cHBvcnRzIHVzaW5nIE09IHRhcmdldHMuSWYgeW91IGRvIG5vdCBzdXBwbHkKLWFueSBNPSB0YXJnZXQsIGl0IGlzIGFzc3VtZWQgeW91IHdhbnQgdG8gdGFyZ2V0IHRoZSBlbnRpcmUga2VybmVsLgotVGhlIGtlcm5lbCBjb2NjaWNoZWNrIHNjcmlwdCBoYXM6Ci0KLSAgICBpZiBbICIkS0JVSUxEX0VYVE1PRCIgPSAiIiBdIDsgdGhlbgotICAgICAgICBPUFRJT05TPSItLWRpciAkc3JjdHJlZSAkQ09DQ0lJTkNMVURFIgotICAgIGVsc2UKLSAgICAgICAgT1BUSU9OUz0iLS1kaXIgJEtCVUlMRF9FWFRNT0QgJENPQ0NJSU5DTFVERSIKLSAgICBmaQotCi1LQlVJTERfRVhUTU9EIGlzIHNldCB3aGVuIGFuIGV4cGxpY2l0IHRhcmdldCB3aXRoIE09IGlzIHVzZWQuIEZvciBib3RoIGNhc2VzCi10aGUgc3BhdGNoIC0tZGlyIGFyZ3VtZW50IGlzIHVzZWQsIGFzIHN1Y2ggdGhpcmQgcnVsZSBhcHBsaWVzIHdoZW4gd2hldGhlciBNPQotaXMgdXNlZCBvciBub3QsIGFuZCB3aGVuIE09IGlzIHVzZWQgdGhlIHRhcmdldCBkaXJlY3RvcnkgY2FuIGhhdmUgaXRzIG93bgotLmNvY2NpY29uZmlnIGZpbGUuIFdoZW4gTT0gaXMgbm90IHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBjb2NjaWNoZWNrIHRoZQotdGFyZ2V0IGRpcmVjdG9yeSBpcyB0aGUgc2FtZSBhcyB0aGUgZGlyZWN0b3J5IGZyb20gd2hlcmUgc3BhdGNoIHdhcyBjYWxsZWQuCi0KLUlmIG5vdCB1c2luZyB0aGUga2VybmVsJ3MgY29jY2ljaGVjayB0YXJnZXQsIGtlZXAgdGhlIGFib3ZlIHByZWNlZGVuY2UKLW9yZGVyIGxvZ2ljIG9mIC5jb2NjaWNvbmZpZyByZWFkaW5nLiBJZiB1c2luZyB0aGUga2VybmVsJ3MgY29jY2ljaGVjayB0YXJnZXQsCi1vdmVycmlkZSBhbnkgb2YgdGhlIGtlcm5lbCdzIC5jb2NjaWNoZWNrJ3Mgc2V0dGluZ3MgdXNpbmcgU1BGTEFHUy4KLQotV2UgaGVscCBDb2NjaW5lbGxlIHdoZW4gdXNlZCBhZ2FpbnN0IExpbnV4IHdpdGggYSBzZXQgb2Ygc2Vuc2libGUgZGVmYXVsdHMKLW9wdGlvbnMgZm9yIExpbnV4IHdpdGggb3VyIG93biBMaW51eCAuY29jY2ljb25maWcuIFRoaXMgaGludHMgdG8gY29jY2luZWxsZQotZ2l0IGNhbiBiZSB1c2VkIGZvciAnZ2l0IGdyZXAnIHF1ZXJpZXMgb3ZlciBjb2NjaWdyZXAuIEEgdGltZW91dCBvZiAyMDAKLXNlY29uZHMgc2hvdWxkIHN1ZmZpY2UgZm9yIG5vdy4KLQotVGhlIG9wdGlvbnMgcGlja2VkIHVwIGJ5IGNvY2NpbmVsbGUgd2hlbiByZWFkaW5nIGEgLmNvY2NpY29uZmlnIGRvIG5vdCBhcHBlYXIKLWFzIGFyZ3VtZW50cyB0byBzcGF0Y2ggcHJvY2Vzc2VzIHJ1bm5pbmcgb24geW91ciBzeXN0ZW0sIHRvIGNvbmZpcm0gd2hhdAotb3B0aW9ucyB3aWxsIGJlIHVzZWQgYnkgQ29jY2luZWxsZSBydW46Ci0KLSAgICAgIHNwYXRjaCAtLXByaW50LW9wdGlvbnMtb25seQotCi1Zb3UgY2FuIG92ZXJyaWRlIHdpdGggeW91ciBvd24gcHJlZmVycmVkIGluZGV4IG9wdGlvbiBieSB1c2luZyBTUEZMQUdTLiBUYWtlCi1ub3RlIHRoYXQgd2hlbiB0aGVyZSBhcmUgY29uZmxpY3Rpbmcgb3B0aW9ucyBDb2NjaW5lbGxlIHRha2VzIHByZWNlZGVuY2UgZm9yCi10aGUgbGFzdCBvcHRpb25zIHBhc3NlZC4gVXNpbmcgLmNvY2NpY29uZmlnIGlzIHBvc3NpYmxlIHRvIHVzZSBpZHV0aWxzLCBob3dldmVyCi1naXZlbiB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBmb2xsb3dlZCBieSBDb2NjaW5lbGxlLCBzaW5jZSB0aGUga2VybmVsIG5vdwotY2FycmllcyBpdHMgb3duIC5jb2NjaWNvbmZpZywgeW91IHdpbGwgbmVlZCB0byB1c2UgU1BGTEFHUyB0byB1c2UgaWR1dGlscyBpZgotZGVzaXJlZC4gU2VlIGJlbG93IHNlY3Rpb24gIkFkZGl0aW9uYWwgZmxhZ3MiIGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIHVzZQotaWR1dGlscy4KLQotIEFkZGl0aW9uYWwgZmxhZ3MKLX5+fn5+fn5+fn5+fn5+fn5+fgotCi1BZGRpdGlvbmFsIGZsYWdzIGNhbiBiZSBwYXNzZWQgdG8gc3BhdGNoIHRocm91Z2ggdGhlIFNQRkxBR1MKLXZhcmlhYmxlLiBUaGlzIHdvcmtzIGFzIENvY2NpbmVsbGUgcmVzcGVjdHMgdGhlIGxhc3QgZmxhZ3MKLWdpdmVuIHRvIGl0IHdoZW4gb3B0aW9ucyBhcmUgaW4gY29uZmxpY3QuCi0KLSAgICBtYWtlIFNQRkxBR1M9LS11c2UtZ2xpbXBzZSBjb2NjaWNoZWNrCi0KLUNvY2NpbmVsbGUgc3VwcG9ydHMgaWR1dGlscyBhcyB3ZWxsIGJ1dCByZXF1aXJlcyBjb2NjaW5lbGxlID49IDEuMC42LgotV2hlbiBubyBJRCBmaWxlIGlzIHNwZWNpZmllZCBjb2NjaW5lbGxlIGFzc3VtZXMgeW91ciBJRCBkYXRhYmFzZSBmaWxlCi1pcyBpbiB0aGUgZmlsZSAuaWQtdXRpbHMuaW5kZXggb24gdGhlIHRvcCBsZXZlbCBvZiB0aGUga2VybmVsLCBjb2NjaW5lbGxlCi1jYXJyaWVzIGEgc2NyaXB0IHNjcmlwdHMvaWR1dGlsc19pbmRleC5zaCB3aGljaCBjcmVhdGVzIHRoZSBkYXRhYmFzZSB3aXRoCi0KLSAgICBta2lkIC1pIEMgLS1vdXRwdXQgLmlkLXV0aWxzLmluZGV4Ci0KLUlmIHlvdSBoYXZlIGFub3RoZXIgZGF0YWJhc2UgZmlsZW5hbWUgeW91IGNhbiBhbHNvIGp1c3Qgc3ltbGluayB3aXRoIHRoaXMKLW5hbWUuCi0KLSAgICBtYWtlIFNQRkxBR1M9LS11c2UtaWR1dGlscyBjb2NjaWNoZWNrCi0KLUFsdGVybmF0aXZlbHkgeW91IGNhbiBzcGVjaWZ5IHRoZSBkYXRhYmFzZSBmaWxlbmFtZSBleHBsaWNpdGx5LCBmb3IKLWluc3RhbmNlOgotCi0gICAgbWFrZSBTUEZMQUdTPSItLXVzZS1pZHV0aWxzIC9mdWxsLXBhdGgvdG8vSUQiIGNvY2NpY2hlY2sKLQotU2VlIHNwYXRjaCAtLWhlbHAgdG8gbGVhcm4gbW9yZSBhYm91dCBzcGF0Y2ggb3B0aW9ucy4KLQotTm90ZSB0aGF0IHRoZSAnLS11c2UtZ2xpbXBzZScgYW5kICctLXVzZS1pZHV0aWxzJyBvcHRpb25zCi1yZXF1aXJlIGV4dGVybmFsIHRvb2xzIGZvciBpbmRleGluZyB0aGUgY29kZS4gTm9uZSBvZiB0aGVtIGlzCi10aHVzIGFjdGl2ZSBieSBkZWZhdWx0LiBIb3dldmVyLCBieSBpbmRleGluZyB0aGUgY29kZSB3aXRoCi1vbmUgb2YgdGhlc2UgdG9vbHMsIGFuZCBhY2NvcmRpbmcgdG8gdGhlIGNvY2NpIGZpbGUgdXNlZCwKLXNwYXRjaCBjb3VsZCBwcm9jZWVkIHRoZSBlbnRpcmUgY29kZSBiYXNlIG1vcmUgcXVpY2tseS4KLQotIFNtUEwgcGF0Y2ggc3BlY2lmaWMgb3B0aW9ucwotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotU21QTCBwYXRjaGVzIGNhbiBoYXZlIHRoZWlyIG93biByZXF1aXJlbWVudHMgZm9yIG9wdGlvbnMgcGFzc2VkCi10byBDb2NjaW5lbGxlLiBTbVBMIHBhdGNoIHNwZWNpZmljIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIGJ5Ci1wcm92aWRpbmcgdGhlbSBhdCB0aGUgdG9wIG9mIHRoZSBTbVBMIHBhdGNoLCBmb3IgaW5zdGFuY2U6Ci0KLS8vIE9wdGlvbnM6IC0tbm8taW5jbHVkZXMgLS1pbmNsdWRlLWhlYWRlcnMKLQotIFNtUEwgcGF0Y2ggQ29jY2luZWxsZSByZXF1aXJlbWVudHMKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi1BcyBDb2NjaW5lbGxlIGZlYXR1cmVzIGdldCBhZGRlZCBzb21lIG1vcmUgYWR2YW5jZWQgU21QTCBwYXRjaGVzCi1tYXkgcmVxdWlyZSBuZXdlciB2ZXJzaW9ucyBvZiBDb2NjaW5lbGxlLiBJZiBhbiBTbVBMIHBhdGNoIHJlcXVpcmVzCi1hdCBsZWFzdCBhIHZlcnNpb24gb2YgQ29jY2luZWxsZSwgdGhpcyBjYW4gYmUgc3BlY2lmaWVkIGFzIGZvbGxvd3MsCi1hcyBhbiBleGFtcGxlIGlmIHJlcXVpcmluZyBhdCBsZWFzdCBDb2NjaW5lbGxlID49IDEuMC41OgotCi0vLyBSZXF1aXJlczogMS4wLjUKLQotIFByb3Bvc2luZyBuZXcgc2VtYW50aWMgcGF0Y2hlcwotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotTmV3IHNlbWFudGljIHBhdGNoZXMgY2FuIGJlIHByb3Bvc2VkIGFuZCBzdWJtaXR0ZWQgYnkga2VybmVsCi1kZXZlbG9wZXJzLiBGb3Igc2FrZSBvZiBjbGFyaXR5LCB0aGV5IHNob3VsZCBiZSBvcmdhbml6ZWQgaW4gdGhlCi1zdWItZGlyZWN0b3JpZXMgb2YgJ3NjcmlwdHMvY29jY2luZWxsZS8nLgotCi0KLSBEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgJ3JlcG9ydCcgbW9kZQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi0ncmVwb3J0JyBnZW5lcmF0ZXMgYSBsaXN0IGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgotICBmaWxlOmxpbmU6Y29sdW1uLWNvbHVtbjogbWVzc2FnZQotCi1FeGFtcGxlOgotCi1SdW5uaW5nCi0KLQltYWtlIGNvY2NpY2hlY2sgTU9ERT1yZXBvcnQgQ09DQ0k9c2NyaXB0cy9jb2NjaW5lbGxlL2FwaS9lcnJfY2FzdC5jb2NjaQotCi13aWxsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBwYXJ0IG9mIHRoZSBTbVBMIHNjcmlwdC4KLQotPHNtcGw+Ci1AciBkZXBlbmRzIG9uICFjb250ZXh0ICYmICFwYXRjaCAmJiAob3JnIHx8IHJlcG9ydClACi1leHByZXNzaW9uIHg7Ci1wb3NpdGlvbiBwOwotQEAKLQotIEVSUl9QVFJAcChQVFJfRVJSKHgpKQotCi1Ac2NyaXB0OnB5dGhvbiBkZXBlbmRzIG9uIHJlcG9ydEAKLXAgPDwgci5wOwoteCA8PCByLng7Ci1AQAotCi1tc2c9IkVSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggJXMiICUgKHgpCi1jb2NjaWxpYi5yZXBvcnQucHJpbnRfcmVwb3J0KHBbMF0sIG1zZykKLTwvc21wbD4KLQotVGhpcyBTbVBMIGV4Y2VycHQgZ2VuZXJhdGVzIGVudHJpZXMgb24gdGhlIHN0YW5kYXJkIG91dHB1dCwgYXMKLWlsbHVzdHJhdGVkIGJlbG93OgotCi0vaG9tZS91c2VyL2xpbnV4L2NyeXB0by9jdHIuYzoxODg6OS0xNjogRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCBhbGcKLS9ob21lL3VzZXIvbGludXgvY3J5cHRvL2F1dGhlbmMuYzo2MTk6OS0xNjogRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCBhdXRoCi0vaG9tZS91c2VyL2xpbnV4L2NyeXB0by94dHMuYzoyMjc6OS0xNjogRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCBhbGcKLQotCi0gRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlICdwYXRjaCcgbW9kZQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi1XaGVuIHRoZSAncGF0Y2gnIG1vZGUgaXMgYXZhaWxhYmxlLCBpdCBwcm9wb3NlcyBhIGZpeCBmb3IgZWFjaCBwcm9ibGVtCi1pZGVudGlmaWVkLgotCi1FeGFtcGxlOgotCi1SdW5uaW5nCi0JbWFrZSBjb2NjaWNoZWNrIE1PREU9cGF0Y2ggQ09DQ0k9c2NyaXB0cy9jb2NjaW5lbGxlL2FwaS9lcnJfY2FzdC5jb2NjaQotCi13aWxsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBwYXJ0IG9mIHRoZSBTbVBMIHNjcmlwdC4KLQotPHNtcGw+Ci1AIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgcGF0Y2ggJiYgIW9yZyAmJiAhcmVwb3J0IEAKLWV4cHJlc3Npb24geDsKLUBACi0KLS0gRVJSX1BUUihQVFJfRVJSKHgpKQotKyBFUlJfQ0FTVCh4KQotPC9zbXBsPgotCi1UaGlzIFNtUEwgZXhjZXJwdCBnZW5lcmF0ZXMgcGF0Y2ggaHVua3Mgb24gdGhlIHN0YW5kYXJkIG91dHB1dCwgYXMKLWlsbHVzdHJhdGVkIGJlbG93OgotCi1kaWZmIC11IC1wIGEvY3J5cHRvL2N0ci5jIGIvY3J5cHRvL2N0ci5jCi0tLS0gYS9jcnlwdG8vY3RyLmMgMjAxMC0wNS0yNiAxMDo0OTozOC4wMDAwMDAwMDAgKzAyMDAKLSsrKyBiL2NyeXB0by9jdHIuYyAyMDEwLTA2LTAzIDIzOjQ0OjQ5LjAwMDAwMDAwMCArMDIwMAotQEAgLTE4NSw3ICsxODUsNyBAQCBzdGF0aWMgc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqY3J5cHRvX2N0Ci0gCWFsZyA9IGNyeXB0b19hdHRyX2FsZyh0YlsxXSwgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKLSAJCQkJICBDUllQVE9fQUxHX1RZUEVfTUFTSyk7Ci0gCWlmIChJU19FUlIoYWxnKSkKLS0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoYWxnKSk7Ci0rCQlyZXR1cm4gRVJSX0NBU1QoYWxnKTsKLSAKLSAJLyogQmxvY2sgc2l6ZSBtdXN0IGJlID49IDQgYnl0ZXMuICovCi0gCWVyciA9IC1FSU5WQUw7Ci0KLSBEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgJ2NvbnRleHQnIG1vZGUKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotJ2NvbnRleHQnIGhpZ2hsaWdodHMgbGluZXMgb2YgaW50ZXJlc3QgYW5kIHRoZWlyIGNvbnRleHQKLWluIGEgZGlmZi1saWtlIHN0eWxlLgotCi1OT1RFOiBUaGUgZGlmZi1saWtlIG91dHB1dCBnZW5lcmF0ZWQgaXMgTk9UIGFuIGFwcGxpY2FibGUgcGF0Y2guIFRoZQotICAgICAgaW50ZW50IG9mIHRoZSAnY29udGV4dCcgbW9kZSBpcyB0byBoaWdobGlnaHQgdGhlIGltcG9ydGFudCBsaW5lcwotICAgICAgKGFubm90YXRlZCB3aXRoIG1pbnVzLCAnLScpIGFuZCBnaXZlcyBzb21lIHN1cnJvdW5kaW5nIGNvbnRleHQKLSAgICAgIGxpbmVzIGFyb3VuZC4gVGhpcyBvdXRwdXQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgZGlmZiBtb2RlIG9mCi0gICAgICBFbWFjcyB0byByZXZpZXcgdGhlIGNvZGUuCi0KLUV4YW1wbGU6Ci0KLVJ1bm5pbmcKLQltYWtlIGNvY2NpY2hlY2sgTU9ERT1jb250ZXh0IENPQ0NJPXNjcmlwdHMvY29jY2luZWxsZS9hcGkvZXJyX2Nhc3QuY29jY2kKLQotd2lsbCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgcGFydCBvZiB0aGUgU21QTCBzY3JpcHQuCi0KLTxzbXBsPgotQCBkZXBlbmRzIG9uIGNvbnRleHQgJiYgIXBhdGNoICYmICFvcmcgJiYgIXJlcG9ydEAKLWV4cHJlc3Npb24geDsKLUBACi0KLSogRVJSX1BUUihQVFJfRVJSKHgpKQotPC9zbXBsPgotCi1UaGlzIFNtUEwgZXhjZXJwdCBnZW5lcmF0ZXMgZGlmZiBodW5rcyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LCBhcwotaWxsdXN0cmF0ZWQgYmVsb3c6Ci0KLWRpZmYgLXUgLXAgL2hvbWUvdXNlci9saW51eC9jcnlwdG8vY3RyLmMgL3RtcC9ub3RoaW5nCi0tLS0gL2hvbWUvdXNlci9saW51eC9jcnlwdG8vY3RyLmMJMjAxMC0wNS0yNiAxMDo0OTozOC4wMDAwMDAwMDAgKzAyMDAKLSsrKyAvdG1wL25vdGhpbmcKLUBAIC0xODUsNyArMTg1LDYgQEAgc3RhdGljIHN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmNyeXB0b19jdAotIAlhbGcgPSBjcnlwdG9fYXR0cl9hbGcodGJbMV0sIENSWVBUT19BTEdfVFlQRV9DSVBIRVIsCi0gCQkJCSAgQ1JZUFRPX0FMR19UWVBFX01BU0spOwotIAlpZiAoSVNfRVJSKGFsZykpCi0tCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGFsZykpOwotIAotIAkvKiBCbG9jayBzaXplIG11c3QgYmUgPj0gNCBieXRlcy4gKi8KLSAJZXJyID0gLUVJTlZBTDsKLQotIERldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSAnb3JnJyBtb2RlCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLSdvcmcnIGdlbmVyYXRlcyBhIHJlcG9ydCBpbiB0aGUgT3JnIG1vZGUgZm9ybWF0IG9mIEVtYWNzLgotCi1FeGFtcGxlOgotCi1SdW5uaW5nCi0JbWFrZSBjb2NjaWNoZWNrIE1PREU9b3JnIENPQ0NJPXNjcmlwdHMvY29jY2luZWxsZS9hcGkvZXJyX2Nhc3QuY29jY2kKLQotd2lsbCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgcGFydCBvZiB0aGUgU21QTCBzY3JpcHQuCi0KLTxzbXBsPgotQHIgZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhcGF0Y2ggJiYgKG9yZyB8fCByZXBvcnQpQAotZXhwcmVzc2lvbiB4OwotcG9zaXRpb24gcDsKLUBACi0KLSBFUlJfUFRSQHAoUFRSX0VSUih4KSkKLQotQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiBvcmdACi1wIDw8IHIucDsKLXggPDwgci54OwotQEAKLQotbXNnPSJFUlJfQ0FTVCBjYW4gYmUgdXNlZCB3aXRoICVzIiAlICh4KQotbXNnX3NhZmU9bXNnLnJlcGxhY2UoIlsiLCJAKCIpLnJlcGxhY2UoIl0iLCIpIikKLWNvY2NpbGliLm9yZy5wcmludF90b2RvKHBbMF0sIG1zZ19zYWZlKQotPC9zbXBsPgotCi1UaGlzIFNtUEwgZXhjZXJwdCBnZW5lcmF0ZXMgT3JnIGVudHJpZXMgb24gdGhlIHN0YW5kYXJkIG91dHB1dCwgYXMKLWlsbHVzdHJhdGVkIGJlbG93OgotCi0qIFRPRE8gW1t2aWV3Oi9ob21lL3VzZXIvbGludXgvY3J5cHRvL2N0ci5jOjpmYWNlPW92bC1mYWNlMTo6bGluYj0xODg6OmNvbGI9OTo6Y29sZT0xNl1bRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCBhbGddXQotKiBUT0RPIFtbdmlldzovaG9tZS91c2VyL2xpbnV4L2NyeXB0by9hdXRoZW5jLmM6OmZhY2U9b3ZsLWZhY2UxOjpsaW5iPTYxOTo6Y29sYj05Ojpjb2xlPTE2XVtFUlJfQ0FTVCBjYW4gYmUgdXNlZCB3aXRoIGF1dGhdXQotKiBUT0RPIFtbdmlldzovaG9tZS91c2VyL2xpbnV4L2NyeXB0by94dHMuYzo6ZmFjZT1vdmwtZmFjZTE6OmxpbmI9MjI3Ojpjb2xiPTk6OmNvbGU9MTZdW0VSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggYWxnXV0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY29uZi5weSBiL0RvY3VtZW50YXRpb24vY29uZi5weQppbmRleCA5NmI3YWE2Li4wY2M4NzY1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NvbmYucHkKKysrIGIvRG9jdW1lbnRhdGlvbi9jb25mLnB5CkBAIC0xNCwxMSArMTQsMTcgQEAKIAogaW1wb3J0IHN5cwogaW1wb3J0IG9zCitpbXBvcnQgc3BoaW54CisKKyMgR2V0IFNwaGlueCB2ZXJzaW9uCittYWpvciwgbWlub3IsIHBhdGNoID0gbWFwKGludCwgc3BoaW54Ll9fdmVyc2lvbl9fLnNwbGl0KCIuIikpCisKIAogIyBJZiBleHRlbnNpb25zIChvciBtb2R1bGVzIHRvIGRvY3VtZW50IHdpdGggYXV0b2RvYykgYXJlIGluIGFub3RoZXIgZGlyZWN0b3J5LAogIyBhZGQgdGhlc2UgZGlyZWN0b3JpZXMgdG8gc3lzLnBhdGggaGVyZS4gSWYgdGhlIGRpcmVjdG9yeSBpcyByZWxhdGl2ZSB0byB0aGUKICMgZG9jdW1lbnRhdGlvbiByb290LCB1c2Ugb3MucGF0aC5hYnNwYXRoIHRvIG1ha2UgaXQgYWJzb2x1dGUsIGxpa2Ugc2hvd24gaGVyZS4KIHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmFic3BhdGgoJ3NwaGlueCcpKQorZnJvbSBsb2FkX2NvbmZpZyBpbXBvcnQgbG9hZENvbmZpZwogCiAjIC0tIEdlbmVyYWwgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjgsMTQgKzM0LDEzIEBACiAjIEFkZCBhbnkgU3BoaW54IGV4dGVuc2lvbiBtb2R1bGUgbmFtZXMgaGVyZSwgYXMgc3RyaW5ncy4gVGhleSBjYW4gYmUKICMgZXh0ZW5zaW9ucyBjb21pbmcgd2l0aCBTcGhpbnggKG5hbWVkICdzcGhpbnguZXh0LionKSBvciB5b3VyIGN1c3RvbQogIyBvbmVzLgotZXh0ZW5zaW9ucyA9IFsna2VybmVsLWRvYycsICdyc3RGbGF0VGFibGUnLCAna2VybmVsX2luY2x1ZGUnXQorZXh0ZW5zaW9ucyA9IFsna2VybmVsLWRvYycsICdyc3RGbGF0VGFibGUnLCAna2VybmVsX2luY2x1ZGUnLCAnY2RvbWFpbiddCiAKLSMgR3JhY2VmdWxseSBoYW5kbGUgbWlzc2luZyByc3QycGRmLgotdHJ5OgotICAgIGltcG9ydCByc3QycGRmCi0gICAgZXh0ZW5zaW9ucyArPSBbJ3JzdDJwZGYucGRmYnVpbGRlciddCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgcGFzcworIyBUaGUgbmFtZSBvZiB0aGUgbWF0aCBleHRlbnNpb24gY2hhbmdlZCBvbiBTcGhpbnggMS40CitpZiBtaW5vciA+IDM6CisgICAgZXh0ZW5zaW9ucy5hcHBlbmQoInNwaGlueC5leHQuaW1nbWF0aCIpCitlbHNlOgorICAgIGV4dGVuc2lvbnMuYXBwZW5kKCJzcGhpbnguZXh0LnBuZ21hdGgiKQogCiAjIEFkZCBhbnkgcGF0aHMgdGhhdCBjb250YWluIHRlbXBsYXRlcyBoZXJlLCByZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeS4KIHRlbXBsYXRlc19wYXRoID0gWydfdGVtcGxhdGVzJ10KQEAgLTEzMSw3ICsxMzYsNyBAQAogdG9kb19pbmNsdWRlX3RvZG9zID0gRmFsc2UKIAogcHJpbWFyeV9kb21haW4gPSAnQycKLWhpZ2hsaWdodF9sYW5ndWFnZSA9ICdDJworaGlnaGxpZ2h0X2xhbmd1YWdlID0gJ2d1ZXNzJwogCiAjIC0tIE9wdGlvbnMgZm9yIEhUTUwgb3V0cHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjUyLDIzICsyNTcsOTAgQEAKIAogbGF0ZXhfZWxlbWVudHMgPSB7CiAjIFRoZSBwYXBlciBzaXplICgnbGV0dGVycGFwZXInIG9yICdhNHBhcGVyJykuCi0jJ3BhcGVyc2l6ZSc6ICdsZXR0ZXJwYXBlcicsCisncGFwZXJzaXplJzogJ2E0cGFwZXInLAogCiAjIFRoZSBmb250IHNpemUgKCcxMHB0JywgJzExcHQnIG9yICcxMnB0JykuCi0jJ3BvaW50c2l6ZSc6ICcxMHB0JywKLQotIyBBZGRpdGlvbmFsIHN0dWZmIGZvciB0aGUgTGFUZVggcHJlYW1ibGUuCi0jJ3ByZWFtYmxlJzogJycsCisncG9pbnRzaXplJzogJzhwdCcsCiAKICMgTGF0ZXggZmlndXJlIChmbG9hdCkgYWxpZ25tZW50CiAjJ2ZpZ3VyZV9hbGlnbic6ICdodGJwJywKKworIyBEb24ndCBtYW5nbGUgd2l0aCBVVEYtOCBjaGFycworJ2lucHV0ZW5jJzogJycsCisndXRmOGV4dHJhJzogJycsCisKKyMgQWRkaXRpb25hbCBzdHVmZiBmb3IgdGhlIExhVGVYIHByZWFtYmxlLgorICAgICdwcmVhbWJsZSc6ICcnJworCSUgQWRqdXN0IG1hcmdpbnMKKwlcXHVzZXBhY2thZ2VbbWFyZ2luPTAuNWluLCB0b3A9MWluLCBib3R0b209MWluXXtnZW9tZXRyeX0KKworICAgICAgICAlIEFsbG93IGdlbmVyYXRlIHNvbWUgcGFnZXMgaW4gbGFuZHNjYXBlCisgICAgICAgIFxcdXNlcGFja2FnZXtsc2NhcGV9CisKKyAgICAgICAgJSBQdXQgbm90ZXMgaW4gY29sb3IgYW5kIGxldCB0aGVtIGJlIGluc2lkZSBhIHRhYmxlCisJXFxkZWZpbmVjb2xvcntOb3RlQ29sb3J9e1JHQn17MjA0LDI1NSwyNTV9CisJXFxkZWZpbmVjb2xvcntXYXJuaW5nQ29sb3J9e1JHQn17MjU1LDIwNCwyMDR9CisJXFxkZWZpbmVjb2xvcntBdHRlbnRpb25Db2xvcn17UkdCfXsyNTUsMjU1LDIwNH0KKwlcXGRlZmluZWNvbG9ye090aGVyQ29sb3J9e1JHQn17MjA0LDIwNCwyMDR9CisgICAgICAgIFxcbmV3bGVuZ3Roe1xcbXlub3RpY2VsZW5ndGh9CisgICAgICAgIFxcbWFrZWF0bGV0dGVyXFxuZXdlbnZpcm9ubWVudHtjb2xvcmVkYm94fVsxXXslCisJICAgXFxzZXRsZW5ndGh7XFxmYm94cnVsZX17MXB0fQorCSAgIFxcc2V0bGVuZ3Roe1xcZmJveHNlcH17N3B0fQorCSAgIFxcc2V0bGVuZ3Roe1xcbXlub3RpY2VsZW5ndGh9e1xcbGluZXdpZHRofQorCSAgIFxcYWRkdG9sZW5ndGh7XFxteW5vdGljZWxlbmd0aH17LTJcXGZib3hzZXB9CisJICAgXFxhZGR0b2xlbmd0aHtcXG15bm90aWNlbGVuZ3RofXstMlxcZmJveHJ1bGV9CisgICAgICAgICAgIFxcYmVnaW57bHJib3h9e1xcQHRlbXBib3hhfVxcYmVnaW57bWluaXBhZ2V9e1xcbXlub3RpY2VsZW5ndGh9fXtcXGVuZHttaW5pcGFnZX1cXGVuZHtscmJveH0lCisJICAgXFxpZnRoZW5lbHNlJQorCSAgICAgIHtcXGVxdWFse1xccHlAbm90aWNldHlwZX17bm90ZX19JQorCSAgICAgIHtcXGNvbG9yYm94e05vdGVDb2xvcn17XFx1c2Vib3h7XFxAdGVtcGJveGF9fX0lCisJICAgICAgeyUKKwkgICAgICAgICBcXGlmdGhlbmVsc2UlCisJICAgICAgICAge1xcZXF1YWx7XFxweUBub3RpY2V0eXBlfXt3YXJuaW5nfX0lCisJICAgICAgICAge1xcY29sb3Jib3h7V2FybmluZ0NvbG9yfXtcXHVzZWJveHtcXEB0ZW1wYm94YX19fSUKKwkJIHslCisJICAgICAgICAgICAgXFxpZnRoZW5lbHNlJQorCSAgICAgICAgICAgIHtcXGVxdWFse1xccHlAbm90aWNldHlwZX17YXR0ZW50aW9ufX0lCisJICAgICAgICAgICAge1xcY29sb3Jib3h7QXR0ZW50aW9uQ29sb3J9e1xcdXNlYm94e1xcQHRlbXBib3hhfX19JQorCSAgICAgICAgICAgIHtcXGNvbG9yYm94e090aGVyQ29sb3J9e1xcdXNlYm94e1xcQHRlbXBib3hhfX19JQorCQkgfSUKKwkgICAgICB9JQorICAgICAgICB9XFxtYWtlYXRvdGhlcgorCisgICAgICAgIFxcbWFrZWF0bGV0dGVyCisgICAgICAgIFxccmVuZXdlbnZpcm9ubWVudHtub3RpY2V9WzJdeyUKKyAgICAgICAgICBcXGRlZlxccHlAbm90aWNldHlwZXsjMX0KKyAgICAgICAgICBcXGJlZ2lue2NvbG9yZWRib3h9eyMxfQorICAgICAgICAgIFxcYmZcXGl0CisgICAgICAgICAgXFxwYXJcXHN0cm9uZ3sjMn0KKyAgICAgICAgICBcXGNzbmFtZSBweUBub3RpY2VzdGFydEAjMVxcZW5kY3NuYW1lCisgICAgICAgIH0KKwl7CisgICAgICAgICAgXFxjc25hbWUgcHlAbm90aWNlZW5kQFxccHlAbm90aWNldHlwZVxcZW5kY3NuYW1lCisgICAgICAgICAgXFxlbmR7Y29sb3JlZGJveH0KKyAgICAgICAgfQorCVxcbWFrZWF0b3RoZXIKKworCSUgVXNlIHNvbWUgZm9udCB3aXRoIFVURi04IHN1cHBvcnQgd2l0aCBYZUxhVGVYCisgICAgICAgIFxcdXNlcGFja2FnZXtmb250c3BlY30KKyAgICAgICAgXFxzZXRzYW5zZm9udHtEZWphVnUgU2VyaWZ9CisgICAgICAgIFxcc2V0cm9tYW5mb250e0RlamFWdSBTYW5zfQorICAgICAgICBcXHNldG1vbm9mb250e0RlamFWdSBTYW5zIE1vbm99CisKKwklIFRvIGFsbG93IGFkanVzdGluZyB0YWJsZSBzaXplcworCVxcdXNlcGFja2FnZXthZGp1c3Rib3h9CisKKyAgICAgJycnCiB9CiAKICMgR3JvdXBpbmcgdGhlIGRvY3VtZW50IHRyZWUgaW50byBMYVRlWCBmaWxlcy4gTGlzdCBvZiB0dXBsZXMKICMgKHNvdXJjZSBzdGFydCBmaWxlLCB0YXJnZXQgbmFtZSwgdGl0bGUsCiAjICBhdXRob3IsIGRvY3VtZW50Y2xhc3MgW2hvd3RvLCBtYW51YWwsIG9yIG93biBjbGFzc10pLgogbGF0ZXhfZG9jdW1lbnRzID0gWwotICAgIChtYXN0ZXJfZG9jLCAnVGhlTGludXhLZXJuZWwudGV4JywgJ1RoZSBMaW51eCBLZXJuZWwgRG9jdW1lbnRhdGlvbicsCisgICAgKCdrZXJuZWwtZG9jdW1lbnRhdGlvbicsICdrZXJuZWwtZG9jdW1lbnRhdGlvbi50ZXgnLCAnVGhlIExpbnV4IEtlcm5lbCBEb2N1bWVudGF0aW9uJywKKyAgICAgJ1RoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgY29tbXVuaXR5JywgJ21hbnVhbCcpLAorICAgICgnZGV2ZWxvcG1lbnQtcHJvY2Vzcy9pbmRleCcsICdkZXZlbG9wbWVudC1wcm9jZXNzLnRleCcsICdMaW51eCBLZXJuZWwgRGV2ZWxvcG1lbnQgRG9jdW1lbnRhdGlvbicsCisgICAgICdUaGUga2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eScsICdtYW51YWwnKSwKKyAgICAoJ2dwdS9pbmRleCcsICdncHUudGV4JywgJ0xpbnV4IEdQVSBEcml2ZXIgRGV2ZWxvcGVyXCdzIEd1aWRlJywKICAgICAgJ1RoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgY29tbXVuaXR5JywgJ21hbnVhbCcpLAogXQogCkBAIC00MTksMyArNDkxLDkgQEAKICMgbGluZSBhcmd1bWVudHMuCiBrZXJuZWxkb2NfYmluID0gJy4uL3NjcmlwdHMva2VybmVsLWRvYycKIGtlcm5lbGRvY19zcmN0cmVlID0gJy4uJworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTaW5jZSBsb2FkQ29uZmlnIG92ZXJ3cml0ZXMgc2V0dGluZ3MgZnJvbSB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgaXQgaGFzIHRvIGJlCisjIHRoZSBsYXN0IHN0YXRlbWVudCBpbiB0aGUgY29uZi5weSBmaWxlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbG9hZENvbmZpZyhnbG9iYWxzKCkpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdWZyZXEtc3RhdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9jcHVmcmVxLXN0YXRzLnR4dAppbmRleCBmYzY0NzQ5Li44ZDk3NzNmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdWZyZXEtc3RhdHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvY3B1ZnJlcS1zdGF0cy50eHQKQEAgLTEwMyw3ICsxMDMsNyBAQAogCVBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoQUNQSSwgQVBNKSAgLS0tPgogCQlDUFUgRnJlcXVlbmN5IHNjYWxpbmcgIC0tLT4KIAkJCVsqXSBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKLQkJCTwqPiAgIENQVSBmcmVxdWVuY3kgdHJhbnNsYXRpb24gc3RhdGlzdGljcyAKKwkJCVsqXSAgIENQVSBmcmVxdWVuY3kgdHJhbnNsYXRpb24gc3RhdGlzdGljcwogCQkJWypdICAgICBDUFUgZnJlcXVlbmN5IHRyYW5zbGF0aW9uIHN0YXRpc3RpY3MgZGV0YWlscwogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2NvY2NpbmVsbGUucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvY29jY2luZWxsZS5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE2NGI0YwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2NvY2NpbmVsbGUucnN0CkBAIC0wLDAgKzEsNDkxIEBACisuLiBDb3B5cmlnaHQgMjAxMCBOaWNvbGFzIFBhbGl4IDxucGFsaXhAZGlrdS5kaz4KKy4uIENvcHlyaWdodCAyMDEwIEp1bGlhIExhd2FsbCA8anVsaWFAZGlrdS5kaz4KKy4uIENvcHlyaWdodCAyMDEwIEdpbGxlcyBNdWxsZXIgPEdpbGxlcy5NdWxsZXJAbGlwNi5mcj4KKworLi4gaGlnaGxpZ2h0Ojogbm9uZQorCitDb2NjaW5lbGxlCis9PT09PT09PT09CisKK0NvY2NpbmVsbGUgaXMgYSB0b29sIGZvciBwYXR0ZXJuIG1hdGNoaW5nIGFuZCB0ZXh0IHRyYW5zZm9ybWF0aW9uIHRoYXQgaGFzCittYW55IHVzZXMgaW4ga2VybmVsIGRldmVsb3BtZW50LCBpbmNsdWRpbmcgdGhlIGFwcGxpY2F0aW9uIG9mIGNvbXBsZXgsCit0cmVlLXdpZGUgcGF0Y2hlcyBhbmQgZGV0ZWN0aW9uIG9mIHByb2JsZW1hdGljIHByb2dyYW1taW5nIHBhdHRlcm5zLgorCitHZXR0aW5nIENvY2NpbmVsbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHNlbWFudGljIHBhdGNoZXMgaW5jbHVkZWQgaW4gdGhlIGtlcm5lbCB1c2UgZmVhdHVyZXMgYW5kIG9wdGlvbnMKK3doaWNoIGFyZSBwcm92aWRlZCBieSBDb2NjaW5lbGxlIHZlcnNpb24gMS4wLjAtcmMxMSBhbmQgYWJvdmUuCitVc2luZyBlYXJsaWVyIHZlcnNpb25zIHdpbGwgZmFpbCBhcyB0aGUgb3B0aW9uIG5hbWVzIHVzZWQgYnkKK3RoZSBDb2NjaW5lbGxlIGZpbGVzIGFuZCBjb2NjaWNoZWNrIGhhdmUgYmVlbiB1cGRhdGVkLgorCitDb2NjaW5lbGxlIGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBwYWNrYWdlIG1hbmFnZXIKK29mIG1hbnkgZGlzdHJpYnV0aW9ucywgZS5nLiA6CisKKyAtIERlYmlhbgorIC0gRmVkb3JhCisgLSBVYnVudHUKKyAtIE9wZW5TVVNFCisgLSBBcmNoIExpbnV4CisgLSBOZXRCU0QKKyAtIEZyZWVCU0QKKworWW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIHJlbGVhc2VkIGZyb20gdGhlIENvY2NpbmVsbGUgaG9tZXBhZ2UgYXQKK2h0dHA6Ly9jb2NjaW5lbGxlLmxpcDYuZnIvCisKK0luZm9ybWF0aW9uIGFuZCB0aXBzIGFib3V0IENvY2NpbmVsbGUgYXJlIGFsc28gcHJvdmlkZWQgb24gdGhlIHdpa2kKK3BhZ2VzIGF0IGh0dHA6Ly9jb2NjaS5la3N0cmFuZXQuZGlrdS5kay93aWtpL2Rva3UucGhwCisKK09uY2UgeW91IGhhdmUgaXQsIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6OgorCisgICAgIAkuL2NvbmZpZ3VyZQorICAgICAgICBtYWtlCisKK2FzIGEgcmVndWxhciB1c2VyLCBhbmQgaW5zdGFsbCBpdCB3aXRoOjoKKworICAgICAgICBzdWRvIG1ha2UgaW5zdGFsbAorCitTdXBwbGVtZW50YWwgZG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZvciBzdXBwbGVtZW50YWwgZG9jdW1lbnRhdGlvbiByZWZlciB0byB0aGUgd2lraToKKworaHR0cHM6Ly9ib3R0ZXN0Lndpa2kua2VybmVsLm9yZy9jb2NjaWNoZWNrCisKK1RoZSB3aWtpIGRvY3VtZW50YXRpb24gYWx3YXlzIHJlZmVycyB0byB0aGUgbGludXgtbmV4dCB2ZXJzaW9uIG9mIHRoZSBzY3JpcHQuCisKK1VzaW5nIENvY2NpbmVsbGUgb24gdGhlIExpbnV4IGtlcm5lbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgQ29jY2luZWxsZS1zcGVjaWZpYyB0YXJnZXQgaXMgZGVmaW5lZCBpbiB0aGUgdG9wIGxldmVsCitNYWtlZmlsZS4gVGhpcyB0YXJnZXQgaXMgbmFtZWQgYGBjb2NjaWNoZWNrYGAgYW5kIGNhbGxzIHRoZSBgYGNvY2NpY2hlY2tgYAorZnJvbnQtZW5kIGluIHRoZSBgYHNjcmlwdHNgYCBkaXJlY3RvcnkuCisKK0ZvdXIgYmFzaWMgbW9kZXMgYXJlIGRlZmluZWQ6IGBgcGF0Y2hgYCwgYGByZXBvcnRgYCwgYGBjb250ZXh0YGAsIGFuZAorYGBvcmdgYC4gVGhlIG1vZGUgdG8gdXNlIGlzIHNwZWNpZmllZCBieSBzZXR0aW5nIHRoZSBNT0RFIHZhcmlhYmxlIHdpdGgKK2BgTU9ERT08bW9kZT5gYC4KKworLSBgYHBhdGNoYGAgcHJvcG9zZXMgYSBmaXgsIHdoZW4gcG9zc2libGUuCisKKy0gYGByZXBvcnRgYCBnZW5lcmF0ZXMgYSBsaXN0IGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICBmaWxlOmxpbmU6Y29sdW1uLWNvbHVtbjogbWVzc2FnZQorCistIGBgY29udGV4dGBgIGhpZ2hsaWdodHMgbGluZXMgb2YgaW50ZXJlc3QgYW5kIHRoZWlyIGNvbnRleHQgaW4gYQorICBkaWZmLWxpa2Ugc3R5bGUuTGluZXMgb2YgaW50ZXJlc3QgYXJlIGluZGljYXRlZCB3aXRoIGBgLWBgLgorCistIGBgb3JnYGAgZ2VuZXJhdGVzIGEgcmVwb3J0IGluIHRoZSBPcmcgbW9kZSBmb3JtYXQgb2YgRW1hY3MuCisKK05vdGUgdGhhdCBub3QgYWxsIHNlbWFudGljIHBhdGNoZXMgaW1wbGVtZW50IGFsbCBtb2Rlcy4gRm9yIGVhc3kgdXNlCitvZiBDb2NjaW5lbGxlLCB0aGUgZGVmYXVsdCBtb2RlIGlzICJyZXBvcnQiLgorCitUd28gb3RoZXIgbW9kZXMgcHJvdmlkZSBzb21lIGNvbW1vbiBjb21iaW5hdGlvbnMgb2YgdGhlc2UgbW9kZXMuCisKKy0gYGBjaGFpbmBgIHRyaWVzIHRoZSBwcmV2aW91cyBtb2RlcyBpbiB0aGUgb3JkZXIgYWJvdmUgdW50aWwgb25lIHN1Y2NlZWRzLgorCistIGBgcmVwK2N0eHRgYCBydW5zIHN1Y2Nlc3NpdmVseSB0aGUgcmVwb3J0IG1vZGUgYW5kIHRoZSBjb250ZXh0IG1vZGUuCisgIEl0IHNob3VsZCBiZSB1c2VkIHdpdGggdGhlIEMgb3B0aW9uIChkZXNjcmliZWQgbGF0ZXIpCisgIHdoaWNoIGNoZWNrcyB0aGUgY29kZSBvbiBhIGZpbGUgYmFzaXMuCisKK0V4YW1wbGVzCit+fn5+fn5+fgorCitUbyBtYWtlIGEgcmVwb3J0IGZvciBldmVyeSBzZW1hbnRpYyBwYXRjaCwgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDo6CisKKwkJbWFrZSBjb2NjaWNoZWNrIE1PREU9cmVwb3J0CisKK1RvIHByb2R1Y2UgcGF0Y2hlcywgcnVuOjoKKworCQltYWtlIGNvY2NpY2hlY2sgTU9ERT1wYXRjaAorCisKK1RoZSBjb2NjaWNoZWNrIHRhcmdldCBhcHBsaWVzIGV2ZXJ5IHNlbWFudGljIHBhdGNoIGF2YWlsYWJsZSBpbiB0aGUKK3N1Yi1kaXJlY3RvcmllcyBvZiBgYHNjcmlwdHMvY29jY2luZWxsZWBgIHRvIHRoZSBlbnRpcmUgTGludXgga2VybmVsLgorCitGb3IgZWFjaCBzZW1hbnRpYyBwYXRjaCwgYSBjb21taXQgbWVzc2FnZSBpcyBwcm9wb3NlZC4gIEl0IGdpdmVzIGEKK2Rlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIGJlaW5nIGNoZWNrZWQgYnkgdGhlIHNlbWFudGljIHBhdGNoLCBhbmQKK2luY2x1ZGVzIGEgcmVmZXJlbmNlIHRvIENvY2NpbmVsbGUuCisKK0FzIGFueSBzdGF0aWMgY29kZSBhbmFseXplciwgQ29jY2luZWxsZSBwcm9kdWNlcyBmYWxzZQorcG9zaXRpdmVzLiBUaHVzLCByZXBvcnRzIG11c3QgYmUgY2FyZWZ1bGx5IGNoZWNrZWQsIGFuZCBwYXRjaGVzCityZXZpZXdlZC4KKworVG8gZW5hYmxlIHZlcmJvc2UgbWVzc2FnZXMgc2V0IHRoZSBWPSB2YXJpYWJsZSwgZm9yIGV4YW1wbGU6OgorCisgICBtYWtlIGNvY2NpY2hlY2sgTU9ERT1yZXBvcnQgVj0xCisKK0NvY2NpbmVsbGUgcGFyYWxsZWxpemF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQnkgZGVmYXVsdCwgY29jY2ljaGVjayB0cmllcyB0byBydW4gYXMgcGFyYWxsZWwgYXMgcG9zc2libGUuIFRvIGNoYW5nZQordGhlIHBhcmFsbGVsaXNtLCBzZXQgdGhlIEo9IHZhcmlhYmxlLiBGb3IgZXhhbXBsZSwgdG8gcnVuIGFjcm9zcyA0IENQVXM6OgorCisgICBtYWtlIGNvY2NpY2hlY2sgTU9ERT1yZXBvcnQgSj00CisKK0FzIG9mIENvY2NpbmVsbGUgMS4wLjIgQ29jY2luZWxsZSB1c2VzIE9jYW1sIHBhcm1hcCBmb3IgcGFyYWxsZWxpemF0aW9uLAoraWYgc3VwcG9ydCBmb3IgdGhpcyBpcyBkZXRlY3RlZCB5b3Ugd2lsbCBiZW5lZml0IGZyb20gcGFybWFwIHBhcmFsbGVsaXphdGlvbi4KKworV2hlbiBwYXJtYXAgaXMgZW5hYmxlZCBjb2NjaWNoZWNrIHdpbGwgZW5hYmxlIGR5bmFtaWMgbG9hZCBiYWxhbmNpbmcgYnkgdXNpbmcKK2BgLS1jaHVua3NpemUgMWBgIGFyZ3VtZW50LCB0aGlzIGVuc3VyZXMgd2Uga2VlcCBmZWVkaW5nIHRocmVhZHMgd2l0aCB3b3JrCitvbmUgYnkgb25lLCBzbyB0aGF0IHdlIGF2b2lkIHRoZSBzaXR1YXRpb24gd2hlcmUgbW9zdCB3b3JrIGdldHMgZG9uZSBieSBvbmx5CithIGZldyB0aHJlYWRzLiBXaXRoIGR5bmFtaWMgbG9hZCBiYWxhbmNpbmcsIGlmIGEgdGhyZWFkIGZpbmlzaGVzIGVhcmx5IHdlIGtlZXAKK2ZlZWRpbmcgaXQgbW9yZSB3b3JrLgorCitXaGVuIHBhcm1hcCBpcyBlbmFibGVkLCBpZiBhbiBlcnJvciBvY2N1cnMgaW4gQ29jY2luZWxsZSwgdGhpcyBlcnJvcgordmFsdWUgaXMgcHJvcGFnYXRlZCBiYWNrLCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBgYG1ha2UgY29jY2ljaGVja2BgCitjYXB0dXJlcyB0aGlzIHJldHVybiB2YWx1ZS4KKworVXNpbmcgQ29jY2luZWxsZSB3aXRoIGEgc2luZ2xlIHNlbWFudGljIHBhdGNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIG9wdGlvbmFsIG1ha2UgdmFyaWFibGUgQ09DQ0kgY2FuIGJlIHVzZWQgdG8gY2hlY2sgYSBzaW5nbGUKK3NlbWFudGljIHBhdGNoLiBJbiB0aGF0IGNhc2UsIHRoZSB2YXJpYWJsZSBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGgKK3RoZSBuYW1lIG9mIHRoZSBzZW1hbnRpYyBwYXRjaCB0byBhcHBseS4KKworRm9yIGluc3RhbmNlOjoKKworCW1ha2UgY29jY2ljaGVjayBDT0NDST08bXlfU1AuY29jY2k+IE1PREU9cGF0Y2gKKworb3I6OgorCisJbWFrZSBjb2NjaWNoZWNrIENPQ0NJPTxteV9TUC5jb2NjaT4gTU9ERT1yZXBvcnQKKworCitDb250cm9sbGluZyBXaGljaCBGaWxlcyBhcmUgUHJvY2Vzc2VkIGJ5IENvY2NpbmVsbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCeSBkZWZhdWx0IHRoZSBlbnRpcmUga2VybmVsIHNvdXJjZSB0cmVlIGlzIGNoZWNrZWQuCisKK1RvIGFwcGx5IENvY2NpbmVsbGUgdG8gYSBzcGVjaWZpYyBkaXJlY3RvcnksIGBgTT1gYCBjYW4gYmUgdXNlZC4KK0ZvciBleGFtcGxlLCB0byBjaGVjayBkcml2ZXJzL25ldC93aXJlbGVzcy8gb25lIG1heSB3cml0ZTo6CisKKyAgICBtYWtlIGNvY2NpY2hlY2sgTT1kcml2ZXJzL25ldC93aXJlbGVzcy8KKworVG8gYXBwbHkgQ29jY2luZWxsZSBvbiBhIGZpbGUgYmFzaXMsIGluc3RlYWQgb2YgYSBkaXJlY3RvcnkgYmFzaXMsIHRoZQorZm9sbG93aW5nIGNvbW1hbmQgbWF5IGJlIHVzZWQ6OgorCisgICAgbWFrZSBDPTEgQ0hFQ0s9InNjcmlwdHMvY29jY2ljaGVjayIKKworVG8gY2hlY2sgb25seSBuZXdseSBlZGl0ZWQgY29kZSwgdXNlIHRoZSB2YWx1ZSAyIGZvciB0aGUgQyBmbGFnLCBpLmUuOjoKKworICAgIG1ha2UgQz0yIENIRUNLPSJzY3JpcHRzL2NvY2NpY2hlY2siCisKK0luIHRoZXNlIG1vZGVzLCB3aGljaCB3b3JrcyBvbiBhIGZpbGUgYmFzaXMsIHRoZXJlIGlzIG5vIGluZm9ybWF0aW9uCithYm91dCBzZW1hbnRpYyBwYXRjaGVzIGRpc3BsYXllZCwgYW5kIG5vIGNvbW1pdCBtZXNzYWdlIHByb3Bvc2VkLgorCitUaGlzIHJ1bnMgZXZlcnkgc2VtYW50aWMgcGF0Y2ggaW4gc2NyaXB0cy9jb2NjaW5lbGxlIGJ5IGRlZmF1bHQuIFRoZQorQ09DQ0kgdmFyaWFibGUgbWF5IGFkZGl0aW9uYWxseSBiZSB1c2VkIHRvIG9ubHkgYXBwbHkgYSBzaW5nbGUKK3NlbWFudGljIHBhdGNoIGFzIHNob3duIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLgorCitUaGUgInJlcG9ydCIgbW9kZSBpcyB0aGUgZGVmYXVsdC4gWW91IGNhbiBzZWxlY3QgYW5vdGhlciBvbmUgd2l0aCB0aGUKK01PREUgdmFyaWFibGUgZXhwbGFpbmVkIGFib3ZlLgorCitEZWJ1Z2dpbmcgQ29jY2luZWxsZSBTbVBMIHBhdGNoZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitVc2luZyBjb2NjaWNoZWNrIGlzIGJlc3QgYXMgaXQgcHJvdmlkZXMgaW4gdGhlIHNwYXRjaCBjb21tYW5kIGxpbmUKK2luY2x1ZGUgb3B0aW9ucyBtYXRjaGluZyB0aGUgb3B0aW9ucyB1c2VkIHdoZW4gd2UgY29tcGlsZSB0aGUga2VybmVsLgorWW91IGNhbiBsZWFybiB3aGF0IHRoZXNlIG9wdGlvbnMgYXJlIGJ5IHVzaW5nIFY9MSwgeW91IGNvdWxkIHRoZW4KK21hbnVhbGx5IHJ1biBDb2NjaW5lbGxlIHdpdGggZGVidWcgb3B0aW9ucyBhZGRlZC4KKworQWx0ZXJuYXRpdmVseSB5b3UgY2FuIGRlYnVnIHJ1bm5pbmcgQ29jY2luZWxsZSBhZ2FpbnN0IFNtUEwgcGF0Y2hlcworYnkgYXNraW5nIGZvciBzdGRlcnIgdG8gYmUgcmVkaXJlY3RlZCB0byBzdGRlcnIsIGJ5IGRlZmF1bHQgc3RkZXJyCitpcyByZWRpcmVjdGVkIHRvIC9kZXYvbnVsbCwgaWYgeW91J2QgbGlrZSB0byBjYXB0dXJlIHN0ZGVyciB5b3UKK2NhbiBzcGVjaWZ5IHRoZSBgYERFQlVHX0ZJTEU9ImZpbGUudHh0ImBgIG9wdGlvbiB0byBjb2NjaWNoZWNrLiBGb3IKK2luc3RhbmNlOjoKKworICAgIHJtIC1mIGNvY2NpLmVycgorICAgIG1ha2UgY29jY2ljaGVjayBDT0NDST1zY3JpcHRzL2NvY2NpbmVsbGUvZnJlZS9rZnJlZS5jb2NjaSBNT0RFPXJlcG9ydCBERUJVR19GSUxFPWNvY2NpLmVycgorICAgIGNhdCBjb2NjaS5lcnIKKworWW91IGNhbiB1c2UgU1BGTEFHUyB0byBhZGQgZGVidWdnaW5nIGZsYWdzLCBmb3IgaW5zdGFuY2UgeW91IG1heSB3YW50IHRvCithZGQgYm90aCAtLXByb2ZpbGUgLS1zaG93LXRyeWluZyB0byBTUEZMQUdTIHdoZW4gZGVidWdnaW5nLiBGb3IgaW5zdGFuY2UKK3lvdSBtYXkgd2FudCB0byB1c2U6OgorCisgICAgcm0gLWYgZXJyLmxvZworICAgIGV4cG9ydCBDT0NDST1zY3JpcHRzL2NvY2NpbmVsbGUvbWlzYy9pcnFmX29uZXNob3QuY29jY2kKKyAgICBtYWtlIGNvY2NpY2hlY2sgREVCVUdfRklMRT0iZXJyLmxvZyIgTU9ERT1yZXBvcnQgU1BGTEFHUz0iLS1wcm9maWxlIC0tc2hvdy10cnlpbmciIE09Li9kcml2ZXJzL21mZC9hcml6b25hLWlycS5jCisKK2Vyci5sb2cgd2lsbCBub3cgaGF2ZSB0aGUgcHJvZmlsaW5nIGluZm9ybWF0aW9uLCB3aGlsZSBzdGRvdXQgd2lsbAorcHJvdmlkZSBzb21lIHByb2dyZXNzIGluZm9ybWF0aW9uIGFzIENvY2NpbmVsbGUgbW92ZXMgZm9yd2FyZCB3aXRoCit3b3JrLgorCitERUJVR19GSUxFIHN1cHBvcnQgaXMgb25seSBzdXBwb3J0ZWQgd2hlbiB1c2luZyBjb2NjaW5lbGxlID49IDEuMi4KKworLmNvY2NpY29uZmlnIHN1cHBvcnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NvY2NpbmVsbGUgc3VwcG9ydHMgcmVhZGluZyAuY29jY2ljb25maWcgZm9yIGRlZmF1bHQgQ29jY2luZWxsZSBvcHRpb25zIHRoYXQKK3Nob3VsZCBiZSB1c2VkIGV2ZXJ5IHRpbWUgc3BhdGNoIGlzIHNwYXduZWQsIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGZvcgordmFyaWFibGVzIGZvciAuY29jY2ljb25maWcgaXMgYXMgZm9sbG93czoKKworLSBZb3VyIGN1cnJlbnQgdXNlcidzIGhvbWUgZGlyZWN0b3J5IGlzIHByb2Nlc3NlZCBmaXJzdAorLSBZb3VyIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHNwYXRjaCBpcyBjYWxsZWQgaXMgcHJvY2Vzc2VkIG5leHQKKy0gVGhlIGRpcmVjdG9yeSBwcm92aWRlZCB3aXRoIHRoZSAtLWRpciBvcHRpb24gaXMgcHJvY2Vzc2VkIGxhc3QsIGlmIHVzZWQKKworU2luY2UgY29jY2ljaGVjayBydW5zIHRocm91Z2ggbWFrZSwgaXQgbmF0dXJhbGx5IHJ1bnMgZnJvbSB0aGUga2VybmVsCitwcm9wZXIgZGlyLCBhcyBzdWNoIHRoZSBzZWNvbmQgcnVsZSBhYm92ZSB3b3VsZCBiZSBpbXBsaWVkIGZvciBwaWNraW5nIHVwIGEKKy5jb2NjaWNvbmZpZyB3aGVuIHVzaW5nIGBgbWFrZSBjb2NjaWNoZWNrYGAuCisKK2BgbWFrZSBjb2NjaWNoZWNrYGAgYWxzbyBzdXBwb3J0cyB1c2luZyBNPSB0YXJnZXRzLklmIHlvdSBkbyBub3Qgc3VwcGx5CithbnkgTT0gdGFyZ2V0LCBpdCBpcyBhc3N1bWVkIHlvdSB3YW50IHRvIHRhcmdldCB0aGUgZW50aXJlIGtlcm5lbC4KK1RoZSBrZXJuZWwgY29jY2ljaGVjayBzY3JpcHQgaGFzOjoKKworICAgIGlmIFsgIiRLQlVJTERfRVhUTU9EIiA9ICIiIF0gOyB0aGVuCisgICAgICAgIE9QVElPTlM9Ii0tZGlyICRzcmN0cmVlICRDT0NDSUlOQ0xVREUiCisgICAgZWxzZQorICAgICAgICBPUFRJT05TPSItLWRpciAkS0JVSUxEX0VYVE1PRCAkQ09DQ0lJTkNMVURFIgorICAgIGZpCisKK0tCVUlMRF9FWFRNT0QgaXMgc2V0IHdoZW4gYW4gZXhwbGljaXQgdGFyZ2V0IHdpdGggTT0gaXMgdXNlZC4gRm9yIGJvdGggY2FzZXMKK3RoZSBzcGF0Y2ggLS1kaXIgYXJndW1lbnQgaXMgdXNlZCwgYXMgc3VjaCB0aGlyZCBydWxlIGFwcGxpZXMgd2hlbiB3aGV0aGVyIE09CitpcyB1c2VkIG9yIG5vdCwgYW5kIHdoZW4gTT0gaXMgdXNlZCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBjYW4gaGF2ZSBpdHMgb3duCisuY29jY2ljb25maWcgZmlsZS4gV2hlbiBNPSBpcyBub3QgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIGNvY2NpY2hlY2sgdGhlCit0YXJnZXQgZGlyZWN0b3J5IGlzIHRoZSBzYW1lIGFzIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGVyZSBzcGF0Y2ggd2FzIGNhbGxlZC4KKworSWYgbm90IHVzaW5nIHRoZSBrZXJuZWwncyBjb2NjaWNoZWNrIHRhcmdldCwga2VlcCB0aGUgYWJvdmUgcHJlY2VkZW5jZQorb3JkZXIgbG9naWMgb2YgLmNvY2NpY29uZmlnIHJlYWRpbmcuIElmIHVzaW5nIHRoZSBrZXJuZWwncyBjb2NjaWNoZWNrIHRhcmdldCwKK292ZXJyaWRlIGFueSBvZiB0aGUga2VybmVsJ3MgLmNvY2NpY2hlY2sncyBzZXR0aW5ncyB1c2luZyBTUEZMQUdTLgorCitXZSBoZWxwIENvY2NpbmVsbGUgd2hlbiB1c2VkIGFnYWluc3QgTGludXggd2l0aCBhIHNldCBvZiBzZW5zaWJsZSBkZWZhdWx0cworb3B0aW9ucyBmb3IgTGludXggd2l0aCBvdXIgb3duIExpbnV4IC5jb2NjaWNvbmZpZy4gVGhpcyBoaW50cyB0byBjb2NjaW5lbGxlCitnaXQgY2FuIGJlIHVzZWQgZm9yIGBgZ2l0IGdyZXBgYCBxdWVyaWVzIG92ZXIgY29jY2lncmVwLiBBIHRpbWVvdXQgb2YgMjAwCitzZWNvbmRzIHNob3VsZCBzdWZmaWNlIGZvciBub3cuCisKK1RoZSBvcHRpb25zIHBpY2tlZCB1cCBieSBjb2NjaW5lbGxlIHdoZW4gcmVhZGluZyBhIC5jb2NjaWNvbmZpZyBkbyBub3QgYXBwZWFyCithcyBhcmd1bWVudHMgdG8gc3BhdGNoIHByb2Nlc3NlcyBydW5uaW5nIG9uIHlvdXIgc3lzdGVtLCB0byBjb25maXJtIHdoYXQKK29wdGlvbnMgd2lsbCBiZSB1c2VkIGJ5IENvY2NpbmVsbGUgcnVuOjoKKworICAgICAgc3BhdGNoIC0tcHJpbnQtb3B0aW9ucy1vbmx5CisKK1lvdSBjYW4gb3ZlcnJpZGUgd2l0aCB5b3VyIG93biBwcmVmZXJyZWQgaW5kZXggb3B0aW9uIGJ5IHVzaW5nIFNQRkxBR1MuIFRha2UKK25vdGUgdGhhdCB3aGVuIHRoZXJlIGFyZSBjb25mbGljdGluZyBvcHRpb25zIENvY2NpbmVsbGUgdGFrZXMgcHJlY2VkZW5jZSBmb3IKK3RoZSBsYXN0IG9wdGlvbnMgcGFzc2VkLiBVc2luZyAuY29jY2ljb25maWcgaXMgcG9zc2libGUgdG8gdXNlIGlkdXRpbHMsIGhvd2V2ZXIKK2dpdmVuIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGZvbGxvd2VkIGJ5IENvY2NpbmVsbGUsIHNpbmNlIHRoZSBrZXJuZWwgbm93CitjYXJyaWVzIGl0cyBvd24gLmNvY2NpY29uZmlnLCB5b3Ugd2lsbCBuZWVkIHRvIHVzZSBTUEZMQUdTIHRvIHVzZSBpZHV0aWxzIGlmCitkZXNpcmVkLiBTZWUgYmVsb3cgc2VjdGlvbiAiQWRkaXRpb25hbCBmbGFncyIgZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gdXNlCitpZHV0aWxzLgorCitBZGRpdGlvbmFsIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tCisKK0FkZGl0aW9uYWwgZmxhZ3MgY2FuIGJlIHBhc3NlZCB0byBzcGF0Y2ggdGhyb3VnaCB0aGUgU1BGTEFHUwordmFyaWFibGUuIFRoaXMgd29ya3MgYXMgQ29jY2luZWxsZSByZXNwZWN0cyB0aGUgbGFzdCBmbGFncworZ2l2ZW4gdG8gaXQgd2hlbiBvcHRpb25zIGFyZSBpbiBjb25mbGljdC4gOjoKKworICAgIG1ha2UgU1BGTEFHUz0tLXVzZS1nbGltcHNlIGNvY2NpY2hlY2sKKworQ29jY2luZWxsZSBzdXBwb3J0cyBpZHV0aWxzIGFzIHdlbGwgYnV0IHJlcXVpcmVzIGNvY2NpbmVsbGUgPj0gMS4wLjYuCitXaGVuIG5vIElEIGZpbGUgaXMgc3BlY2lmaWVkIGNvY2NpbmVsbGUgYXNzdW1lcyB5b3VyIElEIGRhdGFiYXNlIGZpbGUKK2lzIGluIHRoZSBmaWxlIC5pZC11dGlscy5pbmRleCBvbiB0aGUgdG9wIGxldmVsIG9mIHRoZSBrZXJuZWwsIGNvY2NpbmVsbGUKK2NhcnJpZXMgYSBzY3JpcHQgc2NyaXB0cy9pZHV0aWxzX2luZGV4LnNoIHdoaWNoIGNyZWF0ZXMgdGhlIGRhdGFiYXNlIHdpdGg6OgorCisgICAgbWtpZCAtaSBDIC0tb3V0cHV0IC5pZC11dGlscy5pbmRleAorCitJZiB5b3UgaGF2ZSBhbm90aGVyIGRhdGFiYXNlIGZpbGVuYW1lIHlvdSBjYW4gYWxzbyBqdXN0IHN5bWxpbmsgd2l0aCB0aGlzCituYW1lLiA6OgorCisgICAgbWFrZSBTUEZMQUdTPS0tdXNlLWlkdXRpbHMgY29jY2ljaGVjaworCitBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gc3BlY2lmeSB0aGUgZGF0YWJhc2UgZmlsZW5hbWUgZXhwbGljaXRseSwgZm9yCitpbnN0YW5jZTo6CisKKyAgICBtYWtlIFNQRkxBR1M9Ii0tdXNlLWlkdXRpbHMgL2Z1bGwtcGF0aC90by9JRCIgY29jY2ljaGVjaworCitTZWUgYGBzcGF0Y2ggLS1oZWxwYGAgdG8gbGVhcm4gbW9yZSBhYm91dCBzcGF0Y2ggb3B0aW9ucy4KKworTm90ZSB0aGF0IHRoZSBgYC0tdXNlLWdsaW1wc2VgYCBhbmQgYGAtLXVzZS1pZHV0aWxzYGAgb3B0aW9ucworcmVxdWlyZSBleHRlcm5hbCB0b29scyBmb3IgaW5kZXhpbmcgdGhlIGNvZGUuIE5vbmUgb2YgdGhlbSBpcwordGh1cyBhY3RpdmUgYnkgZGVmYXVsdC4gSG93ZXZlciwgYnkgaW5kZXhpbmcgdGhlIGNvZGUgd2l0aAorb25lIG9mIHRoZXNlIHRvb2xzLCBhbmQgYWNjb3JkaW5nIHRvIHRoZSBjb2NjaSBmaWxlIHVzZWQsCitzcGF0Y2ggY291bGQgcHJvY2VlZCB0aGUgZW50aXJlIGNvZGUgYmFzZSBtb3JlIHF1aWNrbHkuCisKK1NtUEwgcGF0Y2ggc3BlY2lmaWMgb3B0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NtUEwgcGF0Y2hlcyBjYW4gaGF2ZSB0aGVpciBvd24gcmVxdWlyZW1lbnRzIGZvciBvcHRpb25zIHBhc3NlZAordG8gQ29jY2luZWxsZS4gU21QTCBwYXRjaCBzcGVjaWZpYyBvcHRpb25zIGNhbiBiZSBwcm92aWRlZCBieQorcHJvdmlkaW5nIHRoZW0gYXQgdGhlIHRvcCBvZiB0aGUgU21QTCBwYXRjaCwgZm9yIGluc3RhbmNlOjoKKworCS8vIE9wdGlvbnM6IC0tbm8taW5jbHVkZXMgLS1pbmNsdWRlLWhlYWRlcnMKKworU21QTCBwYXRjaCBDb2NjaW5lbGxlIHJlcXVpcmVtZW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBcyBDb2NjaW5lbGxlIGZlYXR1cmVzIGdldCBhZGRlZCBzb21lIG1vcmUgYWR2YW5jZWQgU21QTCBwYXRjaGVzCittYXkgcmVxdWlyZSBuZXdlciB2ZXJzaW9ucyBvZiBDb2NjaW5lbGxlLiBJZiBhbiBTbVBMIHBhdGNoIHJlcXVpcmVzCithdCBsZWFzdCBhIHZlcnNpb24gb2YgQ29jY2luZWxsZSwgdGhpcyBjYW4gYmUgc3BlY2lmaWVkIGFzIGZvbGxvd3MsCithcyBhbiBleGFtcGxlIGlmIHJlcXVpcmluZyBhdCBsZWFzdCBDb2NjaW5lbGxlID49IDEuMC41OjoKKworCS8vIFJlcXVpcmVzOiAxLjAuNQorCitQcm9wb3NpbmcgbmV3IHNlbWFudGljIHBhdGNoZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmV3IHNlbWFudGljIHBhdGNoZXMgY2FuIGJlIHByb3Bvc2VkIGFuZCBzdWJtaXR0ZWQgYnkga2VybmVsCitkZXZlbG9wZXJzLiBGb3Igc2FrZSBvZiBjbGFyaXR5LCB0aGV5IHNob3VsZCBiZSBvcmdhbml6ZWQgaW4gdGhlCitzdWItZGlyZWN0b3JpZXMgb2YgYGBzY3JpcHRzL2NvY2NpbmVsbGUvYGAuCisKKworRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGBgcmVwb3J0YGAgbW9kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitgYHJlcG9ydGBgIGdlbmVyYXRlcyBhIGxpc3QgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6OgorCisgIGZpbGU6bGluZTpjb2x1bW4tY29sdW1uOiBtZXNzYWdlCisKK0V4YW1wbGUKK35+fn5+fn4KKworUnVubmluZzo6CisKKwltYWtlIGNvY2NpY2hlY2sgTU9ERT1yZXBvcnQgQ09DQ0k9c2NyaXB0cy9jb2NjaW5lbGxlL2FwaS9lcnJfY2FzdC5jb2NjaQorCit3aWxsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBwYXJ0IG9mIHRoZSBTbVBMIHNjcmlwdDo6CisKKyAgIDxzbXBsPgorICAgQHIgZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhcGF0Y2ggJiYgKG9yZyB8fCByZXBvcnQpQAorICAgZXhwcmVzc2lvbiB4OworICAgcG9zaXRpb24gcDsKKyAgIEBACisKKyAgICAgRVJSX1BUUkBwKFBUUl9FUlIoeCkpCisKKyAgIEBzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gcmVwb3J0QAorICAgcCA8PCByLnA7CisgICB4IDw8IHIueDsKKyAgIEBACisKKyAgIG1zZz0iRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCAlcyIgJSAoeCkKKyAgIGNvY2NpbGliLnJlcG9ydC5wcmludF9yZXBvcnQocFswXSwgbXNnKQorICAgPC9zbXBsPgorCitUaGlzIFNtUEwgZXhjZXJwdCBnZW5lcmF0ZXMgZW50cmllcyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LCBhcworaWxsdXN0cmF0ZWQgYmVsb3c6OgorCisgICAgL2hvbWUvdXNlci9saW51eC9jcnlwdG8vY3RyLmM6MTg4OjktMTY6IEVSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggYWxnCisgICAgL2hvbWUvdXNlci9saW51eC9jcnlwdG8vYXV0aGVuYy5jOjYxOTo5LTE2OiBFUlJfQ0FTVCBjYW4gYmUgdXNlZCB3aXRoIGF1dGgKKyAgICAvaG9tZS91c2VyL2xpbnV4L2NyeXB0by94dHMuYzoyMjc6OS0xNjogRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCBhbGcKKworCitEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgYGBwYXRjaGBgIG1vZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuIHRoZSBgYHBhdGNoYGAgbW9kZSBpcyBhdmFpbGFibGUsIGl0IHByb3Bvc2VzIGEgZml4IGZvciBlYWNoIHByb2JsZW0KK2lkZW50aWZpZWQuCisKK0V4YW1wbGUKK35+fn5+fn4KKworUnVubmluZzo6CisKKwltYWtlIGNvY2NpY2hlY2sgTU9ERT1wYXRjaCBDT0NDST1zY3JpcHRzL2NvY2NpbmVsbGUvYXBpL2Vycl9jYXN0LmNvY2NpCisKK3dpbGwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIHBhcnQgb2YgdGhlIFNtUEwgc2NyaXB0OjoKKworICAgIDxzbXBsPgorICAgIEAgZGVwZW5kcyBvbiAhY29udGV4dCAmJiBwYXRjaCAmJiAhb3JnICYmICFyZXBvcnQgQAorICAgIGV4cHJlc3Npb24geDsKKyAgICBAQAorCisgICAgLSBFUlJfUFRSKFBUUl9FUlIoeCkpCisgICAgKyBFUlJfQ0FTVCh4KQorICAgIDwvc21wbD4KKworVGhpcyBTbVBMIGV4Y2VycHQgZ2VuZXJhdGVzIHBhdGNoIGh1bmtzIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQsIGFzCitpbGx1c3RyYXRlZCBiZWxvdzo6CisKKyAgICBkaWZmIC11IC1wIGEvY3J5cHRvL2N0ci5jIGIvY3J5cHRvL2N0ci5jCisgICAgLS0tIGEvY3J5cHRvL2N0ci5jIDIwMTAtMDUtMjYgMTA6NDk6MzguMDAwMDAwMDAwICswMjAwCisgICAgKysrIGIvY3J5cHRvL2N0ci5jIDIwMTAtMDYtMDMgMjM6NDQ6NDkuMDAwMDAwMDAwICswMjAwCisgICAgQEAgLTE4NSw3ICsxODUsNyBAQCBzdGF0aWMgc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqY3J5cHRvX2N0CisgCWFsZyA9IGNyeXB0b19hdHRyX2FsZyh0YlsxXSwgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKKyAJCQkJICBDUllQVE9fQUxHX1RZUEVfTUFTSyk7CisgCWlmIChJU19FUlIoYWxnKSkKKyAgICAtCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGFsZykpOworICAgICsJCXJldHVybiBFUlJfQ0FTVChhbGcpOworCisgCS8qIEJsb2NrIHNpemUgbXVzdCBiZSA+PSA0IGJ5dGVzLiAqLworIAllcnIgPSAtRUlOVkFMOworCitEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgYGBjb250ZXh0YGAgbW9kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYGBjb250ZXh0YGAgaGlnaGxpZ2h0cyBsaW5lcyBvZiBpbnRlcmVzdCBhbmQgdGhlaXIgY29udGV4dAoraW4gYSBkaWZmLWxpa2Ugc3R5bGUuCisKKyAgICAgICoqTk9URSoqOiBUaGUgZGlmZi1saWtlIG91dHB1dCBnZW5lcmF0ZWQgaXMgTk9UIGFuIGFwcGxpY2FibGUgcGF0Y2guIFRoZQorICAgICAgaW50ZW50IG9mIHRoZSBgYGNvbnRleHRgYCBtb2RlIGlzIHRvIGhpZ2hsaWdodCB0aGUgaW1wb3J0YW50IGxpbmVzCisgICAgICAoYW5ub3RhdGVkIHdpdGggbWludXMsIGBgLWBgKSBhbmQgZ2l2ZXMgc29tZSBzdXJyb3VuZGluZyBjb250ZXh0CisgICAgICBsaW5lcyBhcm91bmQuIFRoaXMgb3V0cHV0IGNhbiBiZSB1c2VkIHdpdGggdGhlIGRpZmYgbW9kZSBvZgorICAgICAgRW1hY3MgdG8gcmV2aWV3IHRoZSBjb2RlLgorCitFeGFtcGxlCit+fn5+fn5+CisKK1J1bm5pbmc6OgorCisJbWFrZSBjb2NjaWNoZWNrIE1PREU9Y29udGV4dCBDT0NDST1zY3JpcHRzL2NvY2NpbmVsbGUvYXBpL2Vycl9jYXN0LmNvY2NpCisKK3dpbGwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIHBhcnQgb2YgdGhlIFNtUEwgc2NyaXB0OjoKKworICAgIDxzbXBsPgorICAgIEAgZGVwZW5kcyBvbiBjb250ZXh0ICYmICFwYXRjaCAmJiAhb3JnICYmICFyZXBvcnRACisgICAgZXhwcmVzc2lvbiB4OworICAgIEBACisKKyAgICAqIEVSUl9QVFIoUFRSX0VSUih4KSkKKyAgICA8L3NtcGw+CisKK1RoaXMgU21QTCBleGNlcnB0IGdlbmVyYXRlcyBkaWZmIGh1bmtzIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQsIGFzCitpbGx1c3RyYXRlZCBiZWxvdzo6CisKKyAgICBkaWZmIC11IC1wIC9ob21lL3VzZXIvbGludXgvY3J5cHRvL2N0ci5jIC90bXAvbm90aGluZworICAgIC0tLSAvaG9tZS91c2VyL2xpbnV4L2NyeXB0by9jdHIuYwkyMDEwLTA1LTI2IDEwOjQ5OjM4LjAwMDAwMDAwMCArMDIwMAorICAgICsrKyAvdG1wL25vdGhpbmcKKyAgICBAQCAtMTg1LDcgKzE4NSw2IEBAIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICpjcnlwdG9fY3QKKyAJYWxnID0gY3J5cHRvX2F0dHJfYWxnKHRiWzFdLCBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAorIAkJCQkgIENSWVBUT19BTEdfVFlQRV9NQVNLKTsKKyAJaWYgKElTX0VSUihhbGcpKQorICAgIC0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoYWxnKSk7CisKKyAJLyogQmxvY2sgc2l6ZSBtdXN0IGJlID49IDQgYnl0ZXMuICovCisgCWVyciA9IC1FSU5WQUw7CisKK0RldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBgYG9yZ2BgIG1vZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYGBvcmdgYCBnZW5lcmF0ZXMgYSByZXBvcnQgaW4gdGhlIE9yZyBtb2RlIGZvcm1hdCBvZiBFbWFjcy4KKworRXhhbXBsZQorfn5+fn5+fgorCitSdW5uaW5nOjoKKworCW1ha2UgY29jY2ljaGVjayBNT0RFPW9yZyBDT0NDST1zY3JpcHRzL2NvY2NpbmVsbGUvYXBpL2Vycl9jYXN0LmNvY2NpCisKK3dpbGwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIHBhcnQgb2YgdGhlIFNtUEwgc2NyaXB0OjoKKworICAgIDxzbXBsPgorICAgIEByIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgIXBhdGNoICYmIChvcmcgfHwgcmVwb3J0KUAKKyAgICBleHByZXNzaW9uIHg7CisgICAgcG9zaXRpb24gcDsKKyAgICBAQAorCisgICAgICBFUlJfUFRSQHAoUFRSX0VSUih4KSkKKworICAgIEBzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gb3JnQAorICAgIHAgPDwgci5wOworICAgIHggPDwgci54OworICAgIEBACisKKyAgICBtc2c9IkVSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggJXMiICUgKHgpCisgICAgbXNnX3NhZmU9bXNnLnJlcGxhY2UoIlsiLCJAKCIpLnJlcGxhY2UoIl0iLCIpIikKKyAgICBjb2NjaWxpYi5vcmcucHJpbnRfdG9kbyhwWzBdLCBtc2dfc2FmZSkKKyAgICA8L3NtcGw+CisKK1RoaXMgU21QTCBleGNlcnB0IGdlbmVyYXRlcyBPcmcgZW50cmllcyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LCBhcworaWxsdXN0cmF0ZWQgYmVsb3c6OgorCisgICAgKiBUT0RPIFtbdmlldzovaG9tZS91c2VyL2xpbnV4L2NyeXB0by9jdHIuYzo6ZmFjZT1vdmwtZmFjZTE6OmxpbmI9MTg4Ojpjb2xiPTk6OmNvbGU9MTZdW0VSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggYWxnXV0KKyAgICAqIFRPRE8gW1t2aWV3Oi9ob21lL3VzZXIvbGludXgvY3J5cHRvL2F1dGhlbmMuYzo6ZmFjZT1vdmwtZmFjZTE6OmxpbmI9NjE5Ojpjb2xiPTk6OmNvbGU9MTZdW0VSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggYXV0aF1dCisgICAgKiBUT0RPIFtbdmlldzovaG9tZS91c2VyL2xpbnV4L2NyeXB0by94dHMuYzo6ZmFjZT1vdmwtZmFjZTE6OmxpbmI9MjI3Ojpjb2xiPTk6OmNvbGU9MTZdW0VSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggYWxnXV0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2djb3YucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvZ2Nvdi5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllZWRmZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2djb3YucnN0CkBAIC0wLDAgKzEsMjU2IEBACitVc2luZyBnY292IHdpdGggdGhlIExpbnV4IGtlcm5lbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworZ2NvdiBwcm9maWxpbmcga2VybmVsIHN1cHBvcnQgZW5hYmxlcyB0aGUgdXNlIG9mIEdDQydzIGNvdmVyYWdlIHRlc3RpbmcKK3Rvb2wgZ2Nvdl8gd2l0aCB0aGUgTGludXgga2VybmVsLiBDb3ZlcmFnZSBkYXRhIG9mIGEgcnVubmluZyBrZXJuZWwKK2lzIGV4cG9ydGVkIGluIGdjb3YtY29tcGF0aWJsZSBmb3JtYXQgdmlhIHRoZSAiZ2NvdiIgZGVidWdmcyBkaXJlY3RvcnkuCitUbyBnZXQgY292ZXJhZ2UgZGF0YSBmb3IgYSBzcGVjaWZpYyBmaWxlLCBjaGFuZ2UgdG8gdGhlIGtlcm5lbCBidWlsZAorZGlyZWN0b3J5IGFuZCB1c2UgZ2NvdiB3aXRoIHRoZSBgYC1vYGAgb3B0aW9uIGFzIGZvbGxvd3MgKHJlcXVpcmVzIHJvb3QpOjoKKworICAgICMgY2QgL3RtcC9saW51eC1vdXQKKyAgICAjIGdjb3YgLW8gL3N5cy9rZXJuZWwvZGVidWcvZ2Nvdi90bXAvbGludXgtb3V0L2tlcm5lbCBzcGlubG9jay5jCisKK1RoaXMgd2lsbCBjcmVhdGUgc291cmNlIGNvZGUgZmlsZXMgYW5ub3RhdGVkIHdpdGggZXhlY3V0aW9uIGNvdW50cworaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiBJbiBhZGRpdGlvbiwgZ3JhcGhpY2FsIGdjb3YgZnJvbnQtZW5kcyBzdWNoCithcyBsY292XyBjYW4gYmUgdXNlZCB0byBhdXRvbWF0ZSB0aGUgcHJvY2VzcyBvZiBjb2xsZWN0aW5nIGRhdGEKK2ZvciB0aGUgZW50aXJlIGtlcm5lbCBhbmQgcHJvdmlkZSBjb3ZlcmFnZSBvdmVydmlld3MgaW4gSFRNTCBmb3JtYXQuCisKK1Bvc3NpYmxlIHVzZXM6CisKKyogZGVidWdnaW5nIChoYXMgdGhpcyBsaW5lIGJlZW4gcmVhY2hlZCBhdCBhbGw/KQorKiB0ZXN0IGltcHJvdmVtZW50IChob3cgZG8gSSBjaGFuZ2UgbXkgdGVzdCB0byBjb3ZlciB0aGVzZSBsaW5lcz8pCisqIG1pbmltaXppbmcga2VybmVsIGNvbmZpZ3VyYXRpb25zIChkbyBJIG5lZWQgdGhpcyBvcHRpb24gaWYgdGhlCisgIGFzc29jaWF0ZWQgY29kZSBpcyBuZXZlciBydW4/KQorCisuLiBfZ2NvdjogaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjL0djb3YuaHRtbAorLi4gX2xjb3Y6IGh0dHA6Ly9sdHAuc291cmNlZm9yZ2UubmV0L2NvdmVyYWdlL2xjb3YucGhwCisKKworUHJlcGFyYXRpb24KKy0tLS0tLS0tLS0tCisKK0NvbmZpZ3VyZSB0aGUga2VybmVsIHdpdGg6OgorCisgICAgICAgIENPTkZJR19ERUJVR19GUz15CisgICAgICAgIENPTkZJR19HQ09WX0tFUk5FTD15CisKK3NlbGVjdCB0aGUgZ2NjJ3MgZ2NvdiBmb3JtYXQsIGRlZmF1bHQgaXMgYXV0b2RldGVjdCBiYXNlZCBvbiBnY2MgdmVyc2lvbjo6CisKKyAgICAgICAgQ09ORklHX0dDT1ZfRk9STUFUX0FVVE9ERVRFQ1Q9eQorCithbmQgdG8gZ2V0IGNvdmVyYWdlIGRhdGEgZm9yIHRoZSBlbnRpcmUga2VybmVsOjoKKworICAgICAgICBDT05GSUdfR0NPVl9QUk9GSUxFX0FMTD15CisKK05vdGUgdGhhdCBrZXJuZWxzIGNvbXBpbGVkIHdpdGggcHJvZmlsaW5nIGZsYWdzIHdpbGwgYmUgc2lnbmlmaWNhbnRseQorbGFyZ2VyIGFuZCBydW4gc2xvd2VyLiBBbHNvIENPTkZJR19HQ09WX1BST0ZJTEVfQUxMIG1heSBub3QgYmUgc3VwcG9ydGVkCitvbiBhbGwgYXJjaGl0ZWN0dXJlcy4KKworUHJvZmlsaW5nIGRhdGEgd2lsbCBvbmx5IGJlY29tZSBhY2Nlc3NpYmxlIG9uY2UgZGVidWdmcyBoYXMgYmVlbgorbW91bnRlZDo6CisKKyAgICAgICAgbW91bnQgLXQgZGVidWdmcyBub25lIC9zeXMva2VybmVsL2RlYnVnCisKKworQ3VzdG9taXphdGlvbgorLS0tLS0tLS0tLS0tLQorCitUbyBlbmFibGUgcHJvZmlsaW5nIGZvciBzcGVjaWZpYyBmaWxlcyBvciBkaXJlY3RvcmllcywgYWRkIGEgbGluZQorc2ltaWxhciB0byB0aGUgZm9sbG93aW5nIHRvIHRoZSByZXNwZWN0aXZlIGtlcm5lbCBNYWtlZmlsZToKKworLSBGb3IgYSBzaW5nbGUgZmlsZSAoZS5nLiBtYWluLm8pOjoKKworCUdDT1ZfUFJPRklMRV9tYWluLm8gOj0geQorCistIEZvciBhbGwgZmlsZXMgaW4gb25lIGRpcmVjdG9yeTo6CisKKwlHQ09WX1BST0ZJTEUgOj0geQorCitUbyBleGNsdWRlIGZpbGVzIGZyb20gYmVpbmcgcHJvZmlsZWQgZXZlbiB3aGVuIENPTkZJR19HQ09WX1BST0ZJTEVfQUxMCitpcyBzcGVjaWZpZWQsIHVzZTo6CisKKwlHQ09WX1BST0ZJTEVfbWFpbi5vIDo9IG4KKworYW5kOjoKKworCUdDT1ZfUFJPRklMRSA6PSBuCisKK09ubHkgZmlsZXMgd2hpY2ggYXJlIGxpbmtlZCB0byB0aGUgbWFpbiBrZXJuZWwgaW1hZ2Ugb3IgYXJlIGNvbXBpbGVkIGFzCitrZXJuZWwgbW9kdWxlcyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgbWVjaGFuaXNtLgorCisKK0ZpbGVzCistLS0tLQorCitUaGUgZ2NvdiBrZXJuZWwgc3VwcG9ydCBjcmVhdGVzIHRoZSBmb2xsb3dpbmcgZmlsZXMgaW4gZGVidWdmczoKKworYGAvc3lzL2tlcm5lbC9kZWJ1Zy9nY292YGAKKwlQYXJlbnQgZGlyZWN0b3J5IGZvciBhbGwgZ2Nvdi1yZWxhdGVkIGZpbGVzLgorCitgYC9zeXMva2VybmVsL2RlYnVnL2djb3YvcmVzZXRgYAorCUdsb2JhbCByZXNldCBmaWxlOiByZXNldHMgYWxsIGNvdmVyYWdlIGRhdGEgdG8gemVybyB3aGVuCisgICAgICAgIHdyaXR0ZW4gdG8uCisKK2BgL3N5cy9rZXJuZWwvZGVidWcvZ2Nvdi9wYXRoL3RvL2NvbXBpbGUvZGlyL2ZpbGUuZ2NkYWBgCisJVGhlIGFjdHVhbCBnY292IGRhdGEgZmlsZSBhcyB1bmRlcnN0b29kIGJ5IHRoZSBnY292CisgICAgICAgIHRvb2wuIFJlc2V0cyBmaWxlIGNvdmVyYWdlIGRhdGEgdG8gemVybyB3aGVuIHdyaXR0ZW4gdG8uCisKK2BgL3N5cy9rZXJuZWwvZGVidWcvZ2Nvdi9wYXRoL3RvL2NvbXBpbGUvZGlyL2ZpbGUuZ2Nub2BgCisJU3ltYm9saWMgbGluayB0byBhIHN0YXRpYyBkYXRhIGZpbGUgcmVxdWlyZWQgYnkgdGhlIGdjb3YKKyAgICAgICAgdG9vbC4gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBnY2Mgd2hlbiBjb21waWxpbmcgd2l0aAorICAgICAgICBvcHRpb24gYGAtZnRlc3QtY292ZXJhZ2VgYC4KKworCitNb2R1bGVzCistLS0tLS0tCisKK0tlcm5lbCBtb2R1bGVzIG1heSBjb250YWluIGNsZWFudXAgY29kZSB3aGljaCBpcyBvbmx5IHJ1biBkdXJpbmcKK21vZHVsZSB1bmxvYWQgdGltZS4gVGhlIGdjb3YgbWVjaGFuaXNtIHByb3ZpZGVzIGEgbWVhbnMgdG8gY29sbGVjdAorY292ZXJhZ2UgZGF0YSBmb3Igc3VjaCBjb2RlIGJ5IGtlZXBpbmcgYSBjb3B5IG9mIHRoZSBkYXRhIGFzc29jaWF0ZWQKK3dpdGggdGhlIHVubG9hZGVkIG1vZHVsZS4gVGhpcyBkYXRhIHJlbWFpbnMgYXZhaWxhYmxlIHRocm91Z2ggZGVidWdmcy4KK09uY2UgdGhlIG1vZHVsZSBpcyBsb2FkZWQgYWdhaW4sIHRoZSBhc3NvY2lhdGVkIGNvdmVyYWdlIGNvdW50ZXJzIGFyZQoraW5pdGlhbGl6ZWQgd2l0aCB0aGUgZGF0YSBmcm9tIGl0cyBwcmV2aW91cyBpbnN0YW50aWF0aW9uLgorCitUaGlzIGJlaGF2aW9yIGNhbiBiZSBkZWFjdGl2YXRlZCBieSBzcGVjaWZ5aW5nIHRoZSBnY292X3BlcnNpc3Qga2VybmVsCitwYXJhbWV0ZXI6OgorCisgICAgICAgIGdjb3ZfcGVyc2lzdD0wCisKK0F0IHJ1bi10aW1lLCBhIHVzZXIgY2FuIGFsc28gY2hvb3NlIHRvIGRpc2NhcmQgZGF0YSBmb3IgYW4gdW5sb2FkZWQKK21vZHVsZSBieSB3cml0aW5nIHRvIGl0cyBkYXRhIGZpbGUgb3IgdGhlIGdsb2JhbCByZXNldCBmaWxlLgorCisKK1NlcGFyYXRlZCBidWlsZCBhbmQgdGVzdCBtYWNoaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBnY292IGtlcm5lbCBwcm9maWxpbmcgaW5mcmFzdHJ1Y3R1cmUgaXMgZGVzaWduZWQgdG8gd29yayBvdXQtb2YtdGhlCitib3ggZm9yIHNldHVwcyB3aGVyZSBrZXJuZWxzIGFyZSBidWlsdCBhbmQgcnVuIG9uIHRoZSBzYW1lIG1hY2hpbmUuIEluCitjYXNlcyB3aGVyZSB0aGUga2VybmVsIHJ1bnMgb24gYSBzZXBhcmF0ZSBtYWNoaW5lLCBzcGVjaWFsIHByZXBhcmF0aW9ucworbXVzdCBiZSBtYWRlLCBkZXBlbmRpbmcgb24gd2hlcmUgdGhlIGdjb3YgdG9vbCBpcyB1c2VkOgorCithKSBnY292IGlzIHJ1biBvbiB0aGUgVEVTVCBtYWNoaW5lCisKKyAgICBUaGUgZ2NvdiB0b29sIHZlcnNpb24gb24gdGhlIHRlc3QgbWFjaGluZSBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUKKyAgICBnY2MgdmVyc2lvbiB1c2VkIGZvciBrZXJuZWwgYnVpbGQuIEFsc28gdGhlIGZvbGxvd2luZyBmaWxlcyBuZWVkIHRvIGJlCisgICAgY29waWVkIGZyb20gYnVpbGQgdG8gdGVzdCBtYWNoaW5lOgorCisgICAgZnJvbSB0aGUgc291cmNlIHRyZWU6CisgICAgICAtIGFsbCBDIHNvdXJjZSBmaWxlcyArIGhlYWRlcnMKKworICAgIGZyb20gdGhlIGJ1aWxkIHRyZWU6CisgICAgICAtIGFsbCBDIHNvdXJjZSBmaWxlcyArIGhlYWRlcnMKKyAgICAgIC0gYWxsIC5nY2RhIGFuZCAuZ2NubyBmaWxlcworICAgICAgLSBhbGwgbGlua3MgdG8gZGlyZWN0b3JpZXMKKworICAgIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlc2UgZmlsZXMgbmVlZCB0byBiZSBwbGFjZWQgaW50byB0aGUKKyAgICBleGFjdCBzYW1lIGZpbGUgc3lzdGVtIGxvY2F0aW9uIG9uIHRoZSB0ZXN0IG1hY2hpbmUgYXMgb24gdGhlIGJ1aWxkCisgICAgbWFjaGluZS4gSWYgYW55IG9mIHRoZSBwYXRoIGNvbXBvbmVudHMgaXMgc3ltYm9saWMgbGluaywgdGhlIGFjdHVhbAorICAgIGRpcmVjdG9yeSBuZWVkcyB0byBiZSB1c2VkIGluc3RlYWQgKGR1ZSB0byBtYWtlJ3MgQ1VSRElSIGhhbmRsaW5nKS4KKworYikgZ2NvdiBpcyBydW4gb24gdGhlIEJVSUxEIG1hY2hpbmUKKworICAgIFRoZSBmb2xsb3dpbmcgZmlsZXMgbmVlZCB0byBiZSBjb3BpZWQgYWZ0ZXIgZWFjaCB0ZXN0IGNhc2UgZnJvbSB0ZXN0CisgICAgdG8gYnVpbGQgbWFjaGluZToKKworICAgIGZyb20gdGhlIGdjb3YgZGlyZWN0b3J5IGluIHN5c2ZzOgorICAgICAgLSBhbGwgLmdjZGEgZmlsZXMKKyAgICAgIC0gYWxsIGxpbmtzIHRvIC5nY25vIGZpbGVzCisKKyAgICBUaGVzZSBmaWxlcyBjYW4gYmUgY29waWVkIHRvIGFueSBsb2NhdGlvbiBvbiB0aGUgYnVpbGQgbWFjaGluZS4gZ2NvdgorICAgIG11c3QgdGhlbiBiZSBjYWxsZWQgd2l0aCB0aGUgLW8gb3B0aW9uIHBvaW50aW5nIHRvIHRoYXQgZGlyZWN0b3J5LgorCisgICAgRXhhbXBsZSBkaXJlY3Rvcnkgc2V0dXAgb24gdGhlIGJ1aWxkIG1hY2hpbmU6OgorCisgICAgICAvdG1wL2xpbnV4OiAgICBrZXJuZWwgc291cmNlIHRyZWUKKyAgICAgIC90bXAvb3V0OiAgICAgIGtlcm5lbCBidWlsZCBkaXJlY3RvcnkgYXMgc3BlY2lmaWVkIGJ5IG1ha2UgTz0KKyAgICAgIC90bXAvY292ZXJhZ2U6IGxvY2F0aW9uIG9mIHRoZSBmaWxlcyBjb3BpZWQgZnJvbSB0aGUgdGVzdCBtYWNoaW5lCisKKyAgICAgIFt1c2VyQGJ1aWxkXSBjZCAvdG1wL291dAorICAgICAgW3VzZXJAYnVpbGRdIGdjb3YgLW8gL3RtcC9jb3ZlcmFnZS90bXAvb3V0L2luaXQgbWFpbi5jCisKKworVHJvdWJsZXNob290aW5nCistLS0tLS0tLS0tLS0tLS0KKworUHJvYmxlbQorICAgIENvbXBpbGF0aW9uIGFib3J0cyBkdXJpbmcgbGlua2VyIHN0ZXAuCisKK0NhdXNlCisgICAgUHJvZmlsaW5nIGZsYWdzIGFyZSBzcGVjaWZpZWQgZm9yIHNvdXJjZSBmaWxlcyB3aGljaCBhcmUgbm90CisgICAgbGlua2VkIHRvIHRoZSBtYWluIGtlcm5lbCBvciB3aGljaCBhcmUgbGlua2VkIGJ5IGEgY3VzdG9tCisgICAgbGlua2VyIHByb2NlZHVyZS4KKworU29sdXRpb24KKyAgICBFeGNsdWRlIGFmZmVjdGVkIHNvdXJjZSBmaWxlcyBmcm9tIHByb2ZpbGluZyBieSBzcGVjaWZ5aW5nCisgICAgYGBHQ09WX1BST0ZJTEUgOj0gbmBgIG9yIGBgR0NPVl9QUk9GSUxFX2Jhc2VuYW1lLm8gOj0gbmBgIGluIHRoZQorICAgIGNvcnJlc3BvbmRpbmcgTWFrZWZpbGUuCisKK1Byb2JsZW0KKyAgICBGaWxlcyBjb3BpZWQgZnJvbSBzeXNmcyBhcHBlYXIgZW1wdHkgb3IgaW5jb21wbGV0ZS4KKworQ2F1c2UKKyAgICBEdWUgdG8gdGhlIHdheSBzZXFfZmlsZSB3b3Jrcywgc29tZSB0b29scyBzdWNoIGFzIGNwIG9yIHRhcgorICAgIG1heSBub3QgY29ycmVjdGx5IGNvcHkgZmlsZXMgZnJvbSBzeXNmcy4KKworU29sdXRpb24KKyAgICBVc2UgYGBjYXRgYCcgdG8gcmVhZCBgYC5nY2RhYGAgZmlsZXMgYW5kIGBgY3AgLWRgYCB0byBjb3B5IGxpbmtzLgorICAgIEFsdGVybmF0aXZlbHkgdXNlIHRoZSBtZWNoYW5pc20gc2hvd24gaW4gQXBwZW5kaXggQi4KKworCitBcHBlbmRpeCBBOiBnYXRoZXJfb25fYnVpbGQuc2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTYW1wbGUgc2NyaXB0IHRvIGdhdGhlciBjb3ZlcmFnZSBtZXRhIGZpbGVzIG9uIHRoZSBidWlsZCBtYWNoaW5lCisoc2VlIDZhKTo6CisKKyAgICAjIS9iaW4vYmFzaAorCisgICAgS1NSQz0kMQorICAgIEtPQko9JDIKKyAgICBERVNUPSQzCisKKyAgICBpZiBbIC16ICIkS1NSQyIgXSB8fCBbIC16ICIkS09CSiIgXSB8fCBbIC16ICIkREVTVCIgXTsgdGhlbgorICAgICAgZWNobyAiVXNhZ2U6ICQwIDxrc3JjIGRpcmVjdG9yeT4gPGtvYmogZGlyZWN0b3J5PiA8b3V0cHV0LnRhci5nej4iID4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIEtTUkM9JChjZCAkS1NSQzsgcHJpbnRmICJhbGw6XG5cdEBlY2hvIFwke0NVUkRJUn1cbiIgfCBtYWtlIC1mIC0pCisgICAgS09CSj0kKGNkICRLT0JKOyBwcmludGYgImFsbDpcblx0QGVjaG8gXCR7Q1VSRElSfVxuIiB8IG1ha2UgLWYgLSkKKworICAgIGZpbmQgJEtTUkMgJEtPQkogXCggLW5hbWUgJyouZ2NubycgLW8gLW5hbWUgJyouW2NoXScgLW8gLXR5cGUgbCBcKSAtYSBcCisgICAgICAgICAgICAgICAgICAgICAtcGVybSAvdStyLGcrciB8IHRhciBjZnogJERFU1QgLVAgLVQgLQorCisgICAgaWYgWyAkPyAtZXEgMCBdIDsgdGhlbgorICAgICAgZWNobyAiJERFU1Qgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIGNvcHkgdG8gdGVzdCBzeXN0ZW0gYW5kIHVucGFjayB3aXRoOiIKKyAgICAgIGVjaG8gIiAgdGFyIHhmeiAkREVTVCAtUCIKKyAgICBlbHNlCisgICAgICBlY2hvICJDb3VsZCBub3QgY3JlYXRlIGZpbGUgJERFU1QiCisgICAgZmkKKworCitBcHBlbmRpeCBCOiBnYXRoZXJfb25fdGVzdC5zaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2FtcGxlIHNjcmlwdCB0byBnYXRoZXIgY292ZXJhZ2UgZGF0YSBmaWxlcyBvbiB0aGUgdGVzdCBtYWNoaW5lCisoc2VlIDZiKTo6CisKKyAgICAjIS9iaW4vYmFzaCAtZQorCisgICAgREVTVD0kMQorICAgIEdDREE9L3N5cy9rZXJuZWwvZGVidWcvZ2NvdgorCisgICAgaWYgWyAteiAiJERFU1QiIF0gOyB0aGVuCisgICAgICBlY2hvICJVc2FnZTogJDAgPG91dHB1dC50YXIuZ3o+IiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBURU1QRElSPSQobWt0ZW1wIC1kKQorICAgIGVjaG8gQ29sbGVjdGluZyBkYXRhLi4KKyAgICBmaW5kICRHQ0RBIC10eXBlIGQgLWV4ZWMgbWtkaXIgLXAgJFRFTVBESVIvXHtcfSBcOworICAgIGZpbmQgJEdDREEgLW5hbWUgJyouZ2NkYScgLWV4ZWMgc2ggLWMgJ2NhdCA8ICQwID4gJyRURU1QRElSJy8kMCcge30gXDsKKyAgICBmaW5kICRHQ0RBIC1uYW1lICcqLmdjbm8nIC1leGVjIHNoIC1jICdjcCAtZCAkMCAnJFRFTVBESVInLyQwJyB7fSBcOworICAgIHRhciBjemYgJERFU1QgLUMgJFRFTVBESVIgc3lzCisgICAgcm0gLXJmICRURU1QRElSCisKKyAgICBlY2hvICIkREVTVCBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgY29weSB0byBidWlsZCBzeXN0ZW0gYW5kIHVucGFjayB3aXRoOiIKKyAgICBlY2hvICIgIHRhciB4ZnogJERFU1QiCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9nZGIta2VybmVsLWRlYnVnZ2luZy5yc3QgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9nZGIta2VybmVsLWRlYnVnZ2luZy5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU5M2M5YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2dkYi1rZXJuZWwtZGVidWdnaW5nLnJzdApAQCAtMCwwICsxLDE3MyBAQAorLi4gaGlnaGxpZ2h0Ojogbm9uZQorCitEZWJ1Z2dpbmcga2VybmVsIGFuZCBtb2R1bGVzIHZpYSBnZGIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUga2VybmVsIGRlYnVnZ2VyIGtnZGIsIGh5cGVydmlzb3JzIGxpa2UgUUVNVSBvciBKVEFHLWJhc2VkIGhhcmR3YXJlCitpbnRlcmZhY2VzIGFsbG93IHRvIGRlYnVnIHRoZSBMaW51eCBrZXJuZWwgYW5kIGl0cyBtb2R1bGVzIGR1cmluZyBydW50aW1lCit1c2luZyBnZGIuIEdkYiBjb21lcyB3aXRoIGEgcG93ZXJmdWwgc2NyaXB0aW5nIGludGVyZmFjZSBmb3IgcHl0aG9uLiBUaGUKK2tlcm5lbCBwcm92aWRlcyBhIGNvbGxlY3Rpb24gb2YgaGVscGVyIHNjcmlwdHMgdGhhdCBjYW4gc2ltcGxpZnkgdHlwaWNhbAora2VybmVsIGRlYnVnZ2luZyBzdGVwcy4gVGhpcyBpcyBhIHNob3J0IHR1dG9yaWFsIGFib3V0IGhvdyB0byBlbmFibGUgYW5kIHVzZQordGhlbS4gSXQgZm9jdXNlcyBvbiBRRU1VL0tWTSB2aXJ0dWFsIG1hY2hpbmVzIGFzIHRhcmdldCwgYnV0IHRoZSBleGFtcGxlcyBjYW4KK2JlIHRyYW5zZmVycmVkIHRvIHRoZSBvdGhlciBnZGIgc3R1YnMgYXMgd2VsbC4KKworCitSZXF1aXJlbWVudHMKKy0tLS0tLS0tLS0tLQorCistIGdkYiA3LjIrIChyZWNvbW1lbmRlZDogNy40Kykgd2l0aCBweXRob24gc3VwcG9ydCBlbmFibGVkICh0eXBpY2FsbHkgdHJ1ZQorICBmb3IgZGlzdHJpYnV0aW9ucykKKworCitTZXR1cAorLS0tLS0KKworLSBDcmVhdGUgYSB2aXJ0dWFsIExpbnV4IG1hY2hpbmUgZm9yIFFFTVUvS1ZNIChzZWUgd3d3LmxpbnV4LWt2bS5vcmcgYW5kCisgIHd3dy5xZW11Lm9yZyBmb3IgbW9yZSBkZXRhaWxzKS4gRm9yIGNyb3NzLWRldmVsb3BtZW50LAorICBodHRwOi8vbGFuZGxleS5uZXQvYWJvcmlnaW5hbC9iaW4ga2VlcHMgYSBwb29sIG9mIG1hY2hpbmUgaW1hZ2VzIGFuZAorICB0b29sY2hhaW5zIHRoYXQgY2FuIGJlIGhlbHBmdWwgdG8gc3RhcnQgZnJvbS4KKworLSBCdWlsZCB0aGUga2VybmVsIHdpdGggQ09ORklHX0dEQl9TQ1JJUFRTIGVuYWJsZWQsIGJ1dCBsZWF2ZQorICBDT05GSUdfREVCVUdfSU5GT19SRURVQ0VEIG9mZi4gSWYgeW91ciBhcmNoaXRlY3R1cmUgc3VwcG9ydHMKKyAgQ09ORklHX0ZSQU1FX1BPSU5URVIsIGtlZXAgaXQgZW5hYmxlZC4KKworLSBJbnN0YWxsIHRoYXQga2VybmVsIG9uIHRoZSBndWVzdC4KKyAgQWx0ZXJuYXRpdmVseSwgUUVNVSBhbGxvd3MgdG8gYm9vdCB0aGUga2VybmVsIGRpcmVjdGx5IHVzaW5nIC1rZXJuZWwsCisgIC1hcHBlbmQsIC1pbml0cmQgY29tbWFuZCBsaW5lIHN3aXRjaGVzLiBUaGlzIGlzIGdlbmVyYWxseSBvbmx5IHVzZWZ1bCBpZgorICB5b3UgZG8gbm90IGRlcGVuZCBvbiBtb2R1bGVzLiBTZWUgUUVNVSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMgb24KKyAgdGhpcyBtb2RlLgorCistIEVuYWJsZSB0aGUgZ2RiIHN0dWIgb2YgUUVNVS9LVk0sIGVpdGhlcgorCisgICAgLSBhdCBWTSBzdGFydHVwIHRpbWUgYnkgYXBwZW5kaW5nICItcyIgdG8gdGhlIFFFTVUgY29tbWFuZCBsaW5lCisKKyAgb3IKKworICAgIC0gZHVyaW5nIHJ1bnRpbWUgYnkgaXNzdWluZyAiZ2Ric2VydmVyIiBmcm9tIHRoZSBRRU1VIG1vbml0b3IKKyAgICAgIGNvbnNvbGUKKworLSBjZCAvcGF0aC90by9saW51eC1idWlsZAorCistIFN0YXJ0IGdkYjogZ2RiIHZtbGludXgKKworICBOb3RlOiBTb21lIGRpc3Ryb3MgbWF5IHJlc3RyaWN0IGF1dG8tbG9hZGluZyBvZiBnZGIgc2NyaXB0cyB0byBrbm93biBzYWZlCisgIGRpcmVjdG9yaWVzLiBJbiBjYXNlIGdkYiByZXBvcnRzIHRvIHJlZnVzZSBsb2FkaW5nIHZtbGludXgtZ2RiLnB5LCBhZGQ6OgorCisgICAgYWRkLWF1dG8tbG9hZC1zYWZlLXBhdGggL3BhdGgvdG8vbGludXgtYnVpbGQKKworICB0byB+Ly5nZGJpbml0LiBTZWUgZ2RiIGhlbHAgZm9yIG1vcmUgZGV0YWlscy4KKworLSBBdHRhY2ggdG8gdGhlIGJvb3RlZCBndWVzdDo6CisKKyAgICAoZ2RiKSB0YXJnZXQgcmVtb3RlIDoxMjM0CisKKworRXhhbXBsZXMgb2YgdXNpbmcgdGhlIExpbnV4LXByb3ZpZGVkIGdkYiBoZWxwZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBMb2FkIG1vZHVsZSAoYW5kIG1haW4ga2VybmVsKSBzeW1ib2xzOjoKKworICAgIChnZGIpIGx4LXN5bWJvbHMKKyAgICBsb2FkaW5nIHZtbGludXgKKyAgICBzY2FubmluZyBmb3IgbW9kdWxlcyBpbiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkCisgICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMDIwMDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL25ldC9uZXRmaWx0ZXIveHRfdGNwdWRwLmtvCisgICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMDE2MDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL25ldC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5rbworICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDAwMjAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9uZXQvbmV0ZmlsdGVyL3h0X2xpbWl0LmtvCisgICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMGNhMDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL25ldC9wYWNrZXQvYWZfcGFja2V0LmtvCisgICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMDNjMDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL2ZzL2Z1c2UvZnVzZS5rbworICAgIC4uLgorICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDAwMDAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9kcml2ZXJzL2F0YS9hdGFfZ2VuZXJpYy5rbworCistIFNldCBhIGJyZWFrcG9pbnQgb24gc29tZSBub3QgeWV0IGxvYWRlZCBtb2R1bGUgZnVuY3Rpb24sIGUuZy46OgorCisgICAgKGdkYikgYiBidHJmc19pbml0X3N5c2ZzCisgICAgRnVuY3Rpb24gImJ0cmZzX2luaXRfc3lzZnMiIG5vdCBkZWZpbmVkLgorICAgIE1ha2UgYnJlYWtwb2ludCBwZW5kaW5nIG9uIGZ1dHVyZSBzaGFyZWQgbGlicmFyeSBsb2FkPyAoeSBvciBbbl0pIHkKKyAgICBCcmVha3BvaW50IDEgKGJ0cmZzX2luaXRfc3lzZnMpIHBlbmRpbmcuCisKKy0gQ29udGludWUgdGhlIHRhcmdldDo6CisKKyAgICAoZ2RiKSBjCisKKy0gTG9hZCB0aGUgbW9kdWxlIG9uIHRoZSB0YXJnZXQgYW5kIHdhdGNoIHRoZSBzeW1ib2xzIGJlaW5nIGxvYWRlZCBhcyB3ZWxsIGFzCisgIHRoZSBicmVha3BvaW50IGhpdDo6CisKKyAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwMzQwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvbGliL2xpYmNyYzMyYy5rbworICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDA1MDAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9saWIvbHpvL2x6b19jb21wcmVzcy5rbworICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDA2ZTAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9saWIvemxpYl9kZWZsYXRlL3psaWJfZGVmbGF0ZS5rbworICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDFiMTAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9mcy9idHJmcy9idHJmcy5rbworCisgICAgQnJlYWtwb2ludCAxLCBidHJmc19pbml0X3N5c2ZzICgpIGF0IC9ob21lL3VzZXIvbGludXgvZnMvYnRyZnMvc3lzZnMuYzozNgorICAgIDM2ICAgICAgICAgICAgICBidHJmc19rc2V0ID0ga3NldF9jcmVhdGVfYW5kX2FkZCgiYnRyZnMiLCBOVUxMLCBmc19rb2JqKTsKKworLSBEdW1wIHRoZSBsb2cgYnVmZmVyIG9mIHRoZSB0YXJnZXQga2VybmVsOjoKKworICAgIChnZGIpIGx4LWRtZXNnCisgICAgWyAgICAgMC4wMDAwMDBdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIGNwdXNldAorICAgIFsgICAgIDAuMDAwMDAwXSBJbml0aWFsaXppbmcgY2dyb3VwIHN1YnN5cyBjcHUKKyAgICBbICAgICAwLjAwMDAwMF0gTGludXggdmVyc2lvbiAzLjguMC1yYzQtZGJnKyAoLi4uCisgICAgWyAgICAgMC4wMDAwMDBdIENvbW1hbmQgbGluZTogcm9vdD0vZGV2L3NkYTIgcmVzdW1lPS9kZXYvc2RhMSB2Z2E9MHgzMTQKKyAgICBbICAgICAwLjAwMDAwMF0gZTgyMDogQklPUy1wcm92aWRlZCBwaHlzaWNhbCBSQU0gbWFwOgorICAgIFsgICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMDAwMDAwMDAwLTB4MDAwMDAwMDAwMDA5ZmJmZl0gdXNhYmxlCisgICAgWyAgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAwMDAwMDAwOWZjMDAtMHgwMDAwMDAwMDAwMDlmZmZmXSByZXNlcnZlZAorICAgIC4uLi4KKworLSBFeGFtaW5lIGZpZWxkcyBvZiB0aGUgY3VycmVudCB0YXNrIHN0cnVjdDo6CisKKyAgICAoZ2RiKSBwICRseF9jdXJyZW50KCkucGlkCisgICAgJDEgPSA0OTk4CisgICAgKGdkYikgcCAkbHhfY3VycmVudCgpLmNvbW0KKyAgICAkMiA9ICJtb2Rwcm9iZVwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiCisKKy0gTWFrZSB1c2Ugb2YgdGhlIHBlci1jcHUgZnVuY3Rpb24gZm9yIHRoZSBjdXJyZW50IG9yIGEgc3BlY2lmaWVkIENQVTo6CisKKyAgICAoZ2RiKSBwICRseF9wZXJfY3B1KCJydW5xdWV1ZXMiKS5ucl9ydW5uaW5nCisgICAgJDMgPSAxCisgICAgKGdkYikgcCAkbHhfcGVyX2NwdSgicnVucXVldWVzIiwgMikubnJfcnVubmluZworICAgICQ0ID0gMAorCistIERpZyBpbnRvIGhydGltZXJzIHVzaW5nIHRoZSBjb250YWluZXJfb2YgaGVscGVyOjoKKworICAgIChnZGIpIHNldCAkbmV4dCA9ICRseF9wZXJfY3B1KCJocnRpbWVyX2Jhc2VzIikuY2xvY2tfYmFzZVswXS5hY3RpdmUubmV4dAorICAgIChnZGIpIHAgKiRjb250YWluZXJfb2YoJG5leHQsICJzdHJ1Y3QgaHJ0aW1lciIsICJub2RlIikKKyAgICAkNSA9IHsKKyAgICAgIG5vZGUgPSB7CisgICAgICAgIG5vZGUgPSB7CisgICAgICAgICAgX19yYl9wYXJlbnRfY29sb3IgPSAxODQ0NjYxMjEzMzM1NTI1NjA3MiwKKyAgICAgICAgICByYl9yaWdodCA9IDB4MCA8aXJxX3N0YWNrX3VuaW9uPiwKKyAgICAgICAgICByYl9sZWZ0ID0gMHgwIDxpcnFfc3RhY2tfdW5pb24+CisgICAgICAgIH0sCisgICAgICAgIGV4cGlyZXMgPSB7CisgICAgICAgICAgdHY2NCA9IDE4MzUyNjgwMDAwMDAKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIF9zb2Z0ZXhwaXJlcyA9IHsKKyAgICAgICAgdHY2NCA9IDE4MzUyNjgwMDAwMDAKKyAgICAgIH0sCisgICAgICBmdW5jdGlvbiA9IDB4ZmZmZmZmZmY4MTA3ODIzMiA8dGlja19zY2hlZF90aW1lcj4sCisgICAgICBiYXNlID0gMHhmZmZmODgwMDNmZDBkNmYwLAorICAgICAgc3RhdGUgPSAxLAorICAgICAgc3RhcnRfcGlkID0gMCwKKyAgICAgIHN0YXJ0X3NpdGUgPSAweGZmZmZmZmZmODEwNTVjMWYgPGhydGltZXJfc3RhcnRfcmFuZ2VfbnMrMjA+LAorICAgICAgc3RhcnRfY29tbSA9ICJzd2FwcGVyLzJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiCisgICAgfQorCisKK0xpc3Qgb2YgY29tbWFuZHMgYW5kIGZ1bmN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBudW1iZXIgb2YgY29tbWFuZHMgYW5kIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyBtYXkgZXZvbHZlIG92ZXIgdGhlIHRpbWUsCit0aGlzIGlzIGp1c3QgYSBzbmFwc2hvdCBvZiB0aGUgaW5pdGlhbCB2ZXJzaW9uOjoKKworIChnZGIpIGFwcm9wb3MgbHgKKyBmdW5jdGlvbiBseF9jdXJyZW50IC0tIFJldHVybiBjdXJyZW50IHRhc2sKKyBmdW5jdGlvbiBseF9tb2R1bGUgLS0gRmluZCBtb2R1bGUgYnkgbmFtZSBhbmQgcmV0dXJuIHRoZSBtb2R1bGUgdmFyaWFibGUKKyBmdW5jdGlvbiBseF9wZXJfY3B1IC0tIFJldHVybiBwZXItY3B1IHZhcmlhYmxlCisgZnVuY3Rpb24gbHhfdGFza19ieV9waWQgLS0gRmluZCBMaW51eCB0YXNrIGJ5IFBJRCBhbmQgcmV0dXJuIHRoZSB0YXNrX3N0cnVjdCB2YXJpYWJsZQorIGZ1bmN0aW9uIGx4X3RocmVhZF9pbmZvIC0tIENhbGN1bGF0ZSBMaW51eCB0aHJlYWRfaW5mbyBmcm9tIHRhc2sgdmFyaWFibGUKKyBseC1kbWVzZyAtLSBQcmludCBMaW51eCBrZXJuZWwgbG9nIGJ1ZmZlcgorIGx4LWxzbW9kIC0tIExpc3QgY3VycmVudGx5IGxvYWRlZCBtb2R1bGVzCisgbHgtc3ltYm9scyAtLSAoUmUtKWxvYWQgc3ltYm9scyBvZiBMaW51eCBrZXJuZWwgYW5kIGN1cnJlbnRseSBsb2FkZWQgbW9kdWxlcworCitEZXRhaWxlZCBoZWxwIGNhbiBiZSBvYnRhaW5lZCB2aWEgImhlbHAgPGNvbW1hbmQtbmFtZT4iIGZvciBjb21tYW5kcyBhbmQgImhlbHAKK2Z1bmN0aW9uIDxmdW5jdGlvbi1uYW1lPiIgZm9yIGNvbnZlbmllbmNlIGZ1bmN0aW9ucy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2thc2FuLnJzdCBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2thc2FuLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2ExOGYyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva2FzYW4ucnN0CkBAIC0wLDAgKzEsMTczIEBACitUaGUgS2VybmVsIEFkZHJlc3MgU2FuaXRpemVyIChLQVNBTikKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitPdmVydmlldworLS0tLS0tLS0KKworS2VybmVsQWRkcmVzc1NBTml0aXplciAoS0FTQU4pIGlzIGEgZHluYW1pYyBtZW1vcnkgZXJyb3IgZGV0ZWN0b3IuIEl0IHByb3ZpZGVzCithIGZhc3QgYW5kIGNvbXByZWhlbnNpdmUgc29sdXRpb24gZm9yIGZpbmRpbmcgdXNlLWFmdGVyLWZyZWUgYW5kIG91dC1vZi1ib3VuZHMKK2J1Z3MuCisKK0tBU0FOIHVzZXMgY29tcGlsZS10aW1lIGluc3RydW1lbnRhdGlvbiBmb3IgY2hlY2tpbmcgZXZlcnkgbWVtb3J5IGFjY2VzcywKK3RoZXJlZm9yZSB5b3Ugd2lsbCBuZWVkIGEgR0NDIHZlcnNpb24gNC45LjIgb3IgbGF0ZXIuIEdDQyA1LjAgb3IgbGF0ZXIgaXMKK3JlcXVpcmVkIGZvciBkZXRlY3Rpb24gb2Ygb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyB0byBzdGFjayBvciBnbG9iYWwgdmFyaWFibGVzLgorCitDdXJyZW50bHkgS0FTQU4gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHRoZSB4ODZfNjQgYW5kIGFybTY0IGFyY2hpdGVjdHVyZXMuCisKK1VzYWdlCistLS0tLQorCitUbyBlbmFibGUgS0FTQU4gY29uZmlndXJlIGtlcm5lbCB3aXRoOjoKKworCSAgQ09ORklHX0tBU0FOID0geQorCithbmQgY2hvb3NlIGJldHdlZW4gQ09ORklHX0tBU0FOX09VVExJTkUgYW5kIENPTkZJR19LQVNBTl9JTkxJTkUuIE91dGxpbmUgYW5kCitpbmxpbmUgYXJlIGNvbXBpbGVyIGluc3RydW1lbnRhdGlvbiB0eXBlcy4gVGhlIGZvcm1lciBwcm9kdWNlcyBzbWFsbGVyIGJpbmFyeQordGhlIGxhdHRlciBpcyAxLjEgLSAyIHRpbWVzIGZhc3Rlci4gSW5saW5lIGluc3RydW1lbnRhdGlvbiByZXF1aXJlcyBhIEdDQwordmVyc2lvbiA1LjAgb3IgbGF0ZXIuCisKK0tBU0FOIHdvcmtzIHdpdGggYm90aCBTTFVCIGFuZCBTTEFCIG1lbW9yeSBhbGxvY2F0b3JzLgorRm9yIGJldHRlciBidWcgZGV0ZWN0aW9uIGFuZCBuaWNlciByZXBvcnRpbmcsIGVuYWJsZSBDT05GSUdfU1RBQ0tUUkFDRS4KKworVG8gZGlzYWJsZSBpbnN0cnVtZW50YXRpb24gZm9yIHNwZWNpZmljIGZpbGVzIG9yIGRpcmVjdG9yaWVzLCBhZGQgYSBsaW5lCitzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgdG8gdGhlIHJlc3BlY3RpdmUga2VybmVsIE1ha2VmaWxlOgorCistIEZvciBhIHNpbmdsZSBmaWxlIChlLmcuIG1haW4ubyk6OgorCisgICAgS0FTQU5fU0FOSVRJWkVfbWFpbi5vIDo9IG4KKworLSBGb3IgYWxsIGZpbGVzIGluIG9uZSBkaXJlY3Rvcnk6OgorCisgICAgS0FTQU5fU0FOSVRJWkUgOj0gbgorCitFcnJvciByZXBvcnRzCit+fn5+fn5+fn5+fn5+CisKK0EgdHlwaWNhbCBvdXQgb2YgYm91bmRzIGFjY2VzcyByZXBvcnQgbG9va3MgbGlrZSB0aGlzOjoKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEJVRzogQWRkcmVzc1Nhbml0aXplcjogb3V0IG9mIGJvdW5kcyBhY2Nlc3MgaW4ga21hbGxvY19vb2JfcmlnaHQrMHg2NS8weDc1IFt0ZXN0X2thc2FuXSBhdCBhZGRyIGZmZmY4ODAwNjkzYmM1ZDMKKyAgICBXcml0ZSBvZiBzaXplIDEgYnkgdGFzayBtb2Rwcm9iZS8xNjg5CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBCVUcga21hbGxvYy0xMjggKE5vdCB0YWludGVkKToga2FzYW4gZXJyb3IKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRGlzYWJsaW5nIGxvY2sgZGVidWdnaW5nIGR1ZSB0byBrZXJuZWwgdGFpbnQKKyAgICBJTkZPOiBBbGxvY2F0ZWQgaW4ga21hbGxvY19vb2JfcmlnaHQrMHgzZC8weDc1IFt0ZXN0X2thc2FuXSBhZ2U9MCBjcHU9MCBwaWQ9MTY4OQorICAgICBfX3NsYWJfYWxsb2MrMHg0YjQvMHg0ZjAKKyAgICAga21lbV9jYWNoZV9hbGxvY190cmFjZSsweDEwYi8weDE5MAorICAgICBrbWFsbG9jX29vYl9yaWdodCsweDNkLzB4NzUgW3Rlc3Rfa2FzYW5dCisgICAgIGluaXRfbW9kdWxlKzB4OS8weDQ3IFt0ZXN0X2thc2FuXQorICAgICBkb19vbmVfaW5pdGNhbGwrMHg5OS8weDIwMAorICAgICBsb2FkX21vZHVsZSsweDJjYjMvMHgzYjIwCisgICAgIFN5U19maW5pdF9tb2R1bGUrMHg3Ni8weDgwCisgICAgIHN5c3RlbV9jYWxsX2Zhc3RwYXRoKzB4MTIvMHgxNworICAgIElORk86IFNsYWIgMHhmZmZmZWEwMDAxYTRlZjAwIG9iamVjdHM9MTcgdXNlZD03IGZwPTB4ZmZmZjg4MDA2OTNiZDcyOCBmbGFncz0weDEwMDAwMDAwMDAwNDA4MAorICAgIElORk86IE9iamVjdCAweGZmZmY4ODAwNjkzYmM1NTggQG9mZnNldD0xMzY4IGZwPTB4ZmZmZjg4MDA2OTNiYzcyMAorCisgICAgQnl0ZXMgYjQgZmZmZjg4MDA2OTNiYzU0ODogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgNWEgNWEgNWEgNWEgNWEgNWEgNWEgNWEgIC4uLi4uLi4uWlpaWlpaWloKKyAgICBPYmplY3QgZmZmZjg4MDA2OTNiYzU1ODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKKyAgICBPYmplY3QgZmZmZjg4MDA2OTNiYzU2ODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKKyAgICBPYmplY3QgZmZmZjg4MDA2OTNiYzU3ODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKKyAgICBPYmplY3QgZmZmZjg4MDA2OTNiYzU4ODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKKyAgICBPYmplY3QgZmZmZjg4MDA2OTNiYzU5ODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKKyAgICBPYmplY3QgZmZmZjg4MDA2OTNiYzVhODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKKyAgICBPYmplY3QgZmZmZjg4MDA2OTNiYzViODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKKyAgICBPYmplY3QgZmZmZjg4MDA2OTNiYzVjODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgYTUgIGtra2tra2tra2tra2tray4KKyAgICBSZWR6b25lIGZmZmY4ODAwNjkzYmM1ZDg6IGNjIGNjIGNjIGNjIGNjIGNjIGNjIGNjICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4uLi4uLgorICAgIFBhZGRpbmcgZmZmZjg4MDA2OTNiYzcxODogNWEgNWEgNWEgNWEgNWEgNWEgNWEgNWEgICAgICAgICAgICAgICAgICAgICAgICAgIFpaWlpaWlpaCisgICAgQ1BVOiAwIFBJRDogMTY4OSBDb21tOiBtb2Rwcm9iZSBUYWludGVkOiBHICAgIEIgICAgICAgICAgMy4xOC4wLXJjMS1tbTErICM5OAorICAgIEhhcmR3YXJlIG5hbWU6IFFFTVUgU3RhbmRhcmQgUEMgKGk0NDBGWCArIFBJSVgsIDE5OTYpLCBCSU9TIHJlbC0xLjcuNS0wLWdlNTE0ODhjLTIwMTQwNjAyXzE2NDYxMi1uaWxzc29uLmhvbWUua3JheGVsLm9yZyAwNC8wMS8yMDE0CisgICAgIGZmZmY4ODAwNjkzYmMwMDAgMDAwMDAwMDAwMDAwMDAwMCBmZmZmODgwMDY5M2JjNTU4IGZmZmY4ODAwNjkyM2JiNzgKKyAgICAgZmZmZmZmZmY4MWNjNjhhZSAwMDAwMDAwMDAwMDAwMGYzIGZmZmY4ODAwNmQ0MDc2MDAgZmZmZjg4MDA2OTIzYmJhOAorICAgICBmZmZmZmZmZjgxMWZkODQ4IGZmZmY4ODAwNmQ0MDc2MDAgZmZmZmVhMDAwMWE0ZWYwMCBmZmZmODgwMDY5M2JjNTU4CisgICAgQ2FsbCBUcmFjZToKKyAgICAgWzxmZmZmZmZmZjgxY2M2OGFlPl0gZHVtcF9zdGFjaysweDQ2LzB4NTgKKyAgICAgWzxmZmZmZmZmZjgxMWZkODQ4Pl0gcHJpbnRfdHJhaWxlcisweGY4LzB4MTYwCisgICAgIFs8ZmZmZmZmZmZhMDAwMjZhNz5dID8ga21lbV9jYWNoZV9vb2IrMHhjMy8weGMzIFt0ZXN0X2thc2FuXQorICAgICBbPGZmZmZmZmZmODExZmYwZjU+XSBvYmplY3RfZXJyKzB4MzUvMHg0MAorICAgICBbPGZmZmZmZmZmYTAwMDIwNjU+XSA/IGttYWxsb2Nfb29iX3JpZ2h0KzB4NjUvMHg3NSBbdGVzdF9rYXNhbl0KKyAgICAgWzxmZmZmZmZmZjgxMjBiOWZhPl0ga2FzYW5fcmVwb3J0X2Vycm9yKzB4MzhhLzB4M2YwCisgICAgIFs8ZmZmZmZmZmY4MTIwYTc5Zj5dID8ga2FzYW5fcG9pc29uX3NoYWRvdysweDJmLzB4NDAKKyAgICAgWzxmZmZmZmZmZjgxMjBiMzQ0Pl0gPyBrYXNhbl91bnBvaXNvbl9zaGFkb3crMHgxNC8weDQwCisgICAgIFs8ZmZmZmZmZmY4MTIwYTc5Zj5dID8ga2FzYW5fcG9pc29uX3NoYWRvdysweDJmLzB4NDAKKyAgICAgWzxmZmZmZmZmZmEwMDAyNmE3Pl0gPyBrbWVtX2NhY2hlX29vYisweGMzLzB4YzMgW3Rlc3Rfa2FzYW5dCisgICAgIFs8ZmZmZmZmZmY4MTIwYTk5NT5dIF9fYXNhbl9zdG9yZTErMHg3NS8weGIwCisgICAgIFs8ZmZmZmZmZmZhMDAwMjYwMT5dID8ga21lbV9jYWNoZV9vb2IrMHgxZC8weGMzIFt0ZXN0X2thc2FuXQorICAgICBbPGZmZmZmZmZmYTAwMDIwNjU+XSA/IGttYWxsb2Nfb29iX3JpZ2h0KzB4NjUvMHg3NSBbdGVzdF9rYXNhbl0KKyAgICAgWzxmZmZmZmZmZmEwMDAyMDY1Pl0ga21hbGxvY19vb2JfcmlnaHQrMHg2NS8weDc1IFt0ZXN0X2thc2FuXQorICAgICBbPGZmZmZmZmZmYTAwMDI2YjA+XSBpbml0X21vZHVsZSsweDkvMHg0NyBbdGVzdF9rYXNhbl0KKyAgICAgWzxmZmZmZmZmZjgxMDAwMmQ5Pl0gZG9fb25lX2luaXRjYWxsKzB4OTkvMHgyMDAKKyAgICAgWzxmZmZmZmZmZjgxMWU0ZTVjPl0gPyBfX3Z1bm1hcCsweGVjLzB4MTYwCisgICAgIFs8ZmZmZmZmZmY4MTExNGY2Mz5dIGxvYWRfbW9kdWxlKzB4MmNiMy8weDNiMjAKKyAgICAgWzxmZmZmZmZmZjgxMTBmZDcwPl0gPyBtX3Nob3crMHgyNDAvMHgyNDAKKyAgICAgWzxmZmZmZmZmZjgxMTE1ZjA2Pl0gU3lTX2Zpbml0X21vZHVsZSsweDc2LzB4ODAKKyAgICAgWzxmZmZmZmZmZjgxY2QzMTI5Pl0gc3lzdGVtX2NhbGxfZmFzdHBhdGgrMHgxMi8weDE3CisgICAgTWVtb3J5IHN0YXRlIGFyb3VuZCB0aGUgYnVnZ3kgYWRkcmVzczoKKyAgICAgZmZmZjg4MDA2OTNiYzMwMDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMKKyAgICAgZmZmZjg4MDA2OTNiYzM4MDogZmMgZmMgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgZmMKKyAgICAgZmZmZjg4MDA2OTNiYzQwMDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMKKyAgICAgZmZmZjg4MDA2OTNiYzQ4MDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMKKyAgICAgZmZmZjg4MDA2OTNiYzUwMDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgMDAgMDAgMDAgMDAgMDAKKyAgICA+ZmZmZjg4MDA2OTNiYzU4MDogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDMgZmMgZmMgZmMgZmMgZmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgICAgIGZmZmY4ODAwNjkzYmM2MDA6IGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjCisgICAgIGZmZmY4ODAwNjkzYmM2ODA6IGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjCisgICAgIGZmZmY4ODAwNjkzYmM3MDA6IGZjIGZjIGZjIGZjIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiCisgICAgIGZmZmY4ODAwNjkzYmM3ODA6IGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiCisgICAgIGZmZmY4ODAwNjkzYmM4MDA6IGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBoZWFkZXIgb2YgdGhlIHJlcG9ydCBkaXNjcmliZSB3aGF0IGtpbmQgb2YgYnVnIGhhcHBlbmVkIGFuZCB3aGF0IGtpbmQgb2YKK2FjY2VzcyBjYXVzZWQgaXQuIEl0J3MgZm9sbG93ZWQgYnkgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhY2Nlc3NlZCBzbHViIG9iamVjdAorKHNlZSAnU0xVQiBEZWJ1ZyBvdXRwdXQnIHNlY3Rpb24gaW4gRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dCBmb3IgZGV0YWlscykgYW5kCit0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGFjY2Vzc2VkIG1lbW9yeSBwYWdlLgorCitJbiB0aGUgbGFzdCBzZWN0aW9uIHRoZSByZXBvcnQgc2hvd3MgbWVtb3J5IHN0YXRlIGFyb3VuZCB0aGUgYWNjZXNzZWQgYWRkcmVzcy4KK1JlYWRpbmcgdGhpcyBwYXJ0IHJlcXVpcmVzIHNvbWUgdW5kZXJzdGFuZGluZyBvZiBob3cgS0FTQU4gd29ya3MuCisKK1RoZSBzdGF0ZSBvZiBlYWNoIDggYWxpZ25lZCBieXRlcyBvZiBtZW1vcnkgaXMgZW5jb2RlZCBpbiBvbmUgc2hhZG93IGJ5dGUuCitUaG9zZSA4IGJ5dGVzIGNhbiBiZSBhY2Nlc3NpYmxlLCBwYXJ0aWFsbHkgYWNjZXNzaWJsZSwgZnJlZWQgb3IgYmUgYSByZWR6b25lLgorV2UgdXNlIHRoZSBmb2xsb3dpbmcgZW5jb2RpbmcgZm9yIGVhY2ggc2hhZG93IGJ5dGU6IDAgbWVhbnMgdGhhdCBhbGwgOCBieXRlcworb2YgdGhlIGNvcnJlc3BvbmRpbmcgbWVtb3J5IHJlZ2lvbiBhcmUgYWNjZXNzaWJsZTsgbnVtYmVyIE4gKDEgPD0gTiA8PSA3KSBtZWFucwordGhhdCB0aGUgZmlyc3QgTiBieXRlcyBhcmUgYWNjZXNzaWJsZSwgYW5kIG90aGVyICg4IC0gTikgYnl0ZXMgYXJlIG5vdDsKK2FueSBuZWdhdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50aXJlIDgtYnl0ZSB3b3JkIGlzIGluYWNjZXNzaWJsZS4KK1dlIHVzZSBkaWZmZXJlbnQgbmVnYXRpdmUgdmFsdWVzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZGlmZmVyZW50IGtpbmRzIG9mCitpbmFjY2Vzc2libGUgbWVtb3J5IGxpa2UgcmVkem9uZXMgb3IgZnJlZWQgbWVtb3J5IChzZWUgbW0va2FzYW4va2FzYW4uaCkuCisKK0luIHRoZSByZXBvcnQgYWJvdmUgdGhlIGFycm93cyBwb2ludCB0byB0aGUgc2hhZG93IGJ5dGUgMDMsIHdoaWNoIG1lYW5zIHRoYXQKK3RoZSBhY2Nlc3NlZCBhZGRyZXNzIGlzIHBhcnRpYWxseSBhY2Nlc3NpYmxlLgorCisKK0ltcGxlbWVudGF0aW9uIGRldGFpbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRnJvbSBhIGhpZ2ggbGV2ZWwsIG91ciBhcHByb2FjaCB0byBtZW1vcnkgZXJyb3IgZGV0ZWN0aW9uIGlzIHNpbWlsYXIgdG8gdGhhdAorb2Yga21lbWNoZWNrOiB1c2Ugc2hhZG93IG1lbW9yeSB0byByZWNvcmQgd2hldGhlciBlYWNoIGJ5dGUgb2YgbWVtb3J5IGlzIHNhZmUKK3RvIGFjY2VzcywgYW5kIHVzZSBjb21waWxlLXRpbWUgaW5zdHJ1bWVudGF0aW9uIHRvIGNoZWNrIHNoYWRvdyBtZW1vcnkgb24gZWFjaAorbWVtb3J5IGFjY2Vzcy4KKworQWRkcmVzc1Nhbml0aXplciBkZWRpY2F0ZXMgMS84IG9mIGtlcm5lbCBtZW1vcnkgdG8gaXRzIHNoYWRvdyBtZW1vcnkKKyhlLmcuIDE2VEIgdG8gY292ZXIgMTI4VEIgb24geDg2XzY0KSBhbmQgdXNlcyBkaXJlY3QgbWFwcGluZyB3aXRoIGEgc2NhbGUgYW5kCitvZmZzZXQgdG8gdHJhbnNsYXRlIGEgbWVtb3J5IGFkZHJlc3MgdG8gaXRzIGNvcnJlc3BvbmRpbmcgc2hhZG93IGFkZHJlc3MuCisKK0hlcmUgaXMgdGhlIGZ1bmN0aW9uIHdoaWNoIHRyYW5zbGF0ZXMgYW4gYWRkcmVzcyB0byBpdHMgY29ycmVzcG9uZGluZyBzaGFkb3cKK2FkZHJlc3M6OgorCisgICAgc3RhdGljIGlubGluZSB2b2lkICprYXNhbl9tZW1fdG9fc2hhZG93KGNvbnN0IHZvaWQgKmFkZHIpCisgICAgeworCXJldHVybiAoKHVuc2lnbmVkIGxvbmcpYWRkciA+PiBLQVNBTl9TSEFET1dfU0NBTEVfU0hJRlQpCisJCSsgS0FTQU5fU0hBRE9XX09GRlNFVDsKKyAgICB9CisKK3doZXJlIGBgS0FTQU5fU0hBRE9XX1NDQUxFX1NISUZUID0gM2BgLgorCitDb21waWxlLXRpbWUgaW5zdHJ1bWVudGF0aW9uIHVzZWQgZm9yIGNoZWNraW5nIG1lbW9yeSBhY2Nlc3Nlcy4gQ29tcGlsZXIgaW5zZXJ0cworZnVuY3Rpb24gY2FsbHMgKF9fYXNhbl9sb2FkKihhZGRyKSwgX19hc2FuX3N0b3JlKihhZGRyKSkgYmVmb3JlIGVhY2ggbWVtb3J5CithY2Nlc3Mgb2Ygc2l6ZSAxLCAyLCA0LCA4IG9yIDE2LiBUaGVzZSBmdW5jdGlvbnMgY2hlY2sgd2hldGhlciBtZW1vcnkgYWNjZXNzIGlzCit2YWxpZCBvciBub3QgYnkgY2hlY2tpbmcgY29ycmVzcG9uZGluZyBzaGFkb3cgbWVtb3J5LgorCitHQ0MgNS4wIGhhcyBwb3NzaWJpbGl0eSB0byBwZXJmb3JtIGlubGluZSBpbnN0cnVtZW50YXRpb24uIEluc3RlYWQgb2YgbWFraW5nCitmdW5jdGlvbiBjYWxscyBHQ0MgZGlyZWN0bHkgaW5zZXJ0cyB0aGUgY29kZSB0byBjaGVjayB0aGUgc2hhZG93IG1lbW9yeS4KK1RoaXMgb3B0aW9uIHNpZ25pZmljYW50bHkgZW5sYXJnZXMga2VybmVsIGJ1dCBpdCBnaXZlcyB4MS4xLXgyIHBlcmZvcm1hbmNlCitib29zdCBvdmVyIG91dGxpbmUgaW5zdHJ1bWVudGVkIGtlcm5lbC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2tjb3YucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva2Nvdi5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhMGUyNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2tjb3YucnN0CkBAIC0wLDAgKzEsMTExIEBACitrY292OiBjb2RlIGNvdmVyYWdlIGZvciBmdXp6aW5nCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2tjb3YgZXhwb3NlcyBrZXJuZWwgY29kZSBjb3ZlcmFnZSBpbmZvcm1hdGlvbiBpbiBhIGZvcm0gc3VpdGFibGUgZm9yIGNvdmVyYWdlLQorZ3VpZGVkIGZ1enppbmcgKHJhbmRvbWl6ZWQgdGVzdGluZykuIENvdmVyYWdlIGRhdGEgb2YgYSBydW5uaW5nIGtlcm5lbCBpcworZXhwb3J0ZWQgdmlhIHRoZSAia2NvdiIgZGVidWdmcyBmaWxlLiBDb3ZlcmFnZSBjb2xsZWN0aW9uIGlzIGVuYWJsZWQgb24gYSB0YXNrCitiYXNpcywgYW5kIHRodXMgaXQgY2FuIGNhcHR1cmUgcHJlY2lzZSBjb3ZlcmFnZSBvZiBhIHNpbmdsZSBzeXN0ZW0gY2FsbC4KKworTm90ZSB0aGF0IGtjb3YgZG9lcyBub3QgYWltIHRvIGNvbGxlY3QgYXMgbXVjaCBjb3ZlcmFnZSBhcyBwb3NzaWJsZS4gSXQgYWltcwordG8gY29sbGVjdCBtb3JlIG9yIGxlc3Mgc3RhYmxlIGNvdmVyYWdlIHRoYXQgaXMgZnVuY3Rpb24gb2Ygc3lzY2FsbCBpbnB1dHMuCitUbyBhY2hpZXZlIHRoaXMgZ29hbCBpdCBkb2VzIG5vdCBjb2xsZWN0IGNvdmVyYWdlIGluIHNvZnQvaGFyZCBpbnRlcnJ1cHRzCithbmQgaW5zdHJ1bWVudGF0aW9uIG9mIHNvbWUgaW5oZXJlbnRseSBub24tZGV0ZXJtaW5pc3RpYyBwYXJ0cyBvZiBrZXJuZWwgaXMKK2Rpc2JsZWQgKGUuZy4gc2NoZWR1bGVyLCBsb2NraW5nKS4KKworVXNhZ2UKKy0tLS0tCisKK0NvbmZpZ3VyZSB0aGUga2VybmVsIHdpdGg6OgorCisgICAgICAgIENPTkZJR19LQ09WPXkKKworQ09ORklHX0tDT1YgcmVxdWlyZXMgZ2NjIGJ1aWx0IG9uIHJldmlzaW9uIDIzMTI5NiBvciBsYXRlci4KK1Byb2ZpbGluZyBkYXRhIHdpbGwgb25seSBiZWNvbWUgYWNjZXNzaWJsZSBvbmNlIGRlYnVnZnMgaGFzIGJlZW4gbW91bnRlZDo6CisKKyAgICAgICAgbW91bnQgLXQgZGVidWdmcyBub25lIC9zeXMva2VybmVsL2RlYnVnCisKK1RoZSBmb2xsb3dpbmcgcHJvZ3JhbSBkZW1vbnN0cmF0ZXMga2NvdiB1c2FnZSBmcm9tIHdpdGhpbiBhIHRlc3QgcHJvZ3JhbTo6CisKKyAgICAjaW5jbHVkZSA8c3RkaW8uaD4KKyAgICAjaW5jbHVkZSA8c3RkZGVmLmg+CisgICAgI2luY2x1ZGUgPHN0ZGludC5oPgorICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgICAgI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisgICAgI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorICAgICNpbmNsdWRlIDxzeXMvbW1hbi5oPgorICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KKyAgICAjaW5jbHVkZSA8ZmNudGwuaD4KKworICAgICNkZWZpbmUgS0NPVl9JTklUX1RSQUNFCQkJX0lPUignYycsIDEsIHVuc2lnbmVkIGxvbmcpCisgICAgI2RlZmluZSBLQ09WX0VOQUJMRQkJCV9JTygnYycsIDEwMCkKKyAgICAjZGVmaW5lIEtDT1ZfRElTQUJMRQkJCV9JTygnYycsIDEwMSkKKyAgICAjZGVmaW5lIENPVkVSX1NJWkUJCQkoNjQ8PDEwKQorCisgICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorICAgIHsKKwlpbnQgZmQ7CisJdW5zaWduZWQgbG9uZyAqY292ZXIsIG4sIGk7CisKKwkvKiBBIHNpbmdsZSBmZCBkZXNjcmlwdG9yIGFsbG93cyBjb3ZlcmFnZSBjb2xsZWN0aW9uIG9uIGEgc2luZ2xlCisJICogdGhyZWFkLgorCSAqLworCWZkID0gb3BlbigiL3N5cy9rZXJuZWwvZGVidWcva2NvdiIsIE9fUkRXUik7CisJaWYgKGZkID09IC0xKQorCQlwZXJyb3IoIm9wZW4iKSwgZXhpdCgxKTsKKwkvKiBTZXR1cCB0cmFjZSBtb2RlIGFuZCB0cmFjZSBzaXplLiAqLworCWlmIChpb2N0bChmZCwgS0NPVl9JTklUX1RSQUNFLCBDT1ZFUl9TSVpFKSkKKwkJcGVycm9yKCJpb2N0bCIpLCBleGl0KDEpOworCS8qIE1tYXAgYnVmZmVyIHNoYXJlZCBiZXR3ZWVuIGtlcm5lbC0gYW5kIHVzZXItc3BhY2UuICovCisJY292ZXIgPSAodW5zaWduZWQgbG9uZyopbW1hcChOVUxMLCBDT1ZFUl9TSVpFICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLAorCQkJCSAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIDApOworCWlmICgodm9pZCopY292ZXIgPT0gTUFQX0ZBSUxFRCkKKwkJcGVycm9yKCJtbWFwIiksIGV4aXQoMSk7CisJLyogRW5hYmxlIGNvdmVyYWdlIGNvbGxlY3Rpb24gb24gdGhlIGN1cnJlbnQgdGhyZWFkLiAqLworCWlmIChpb2N0bChmZCwgS0NPVl9FTkFCTEUsIDApKQorCQlwZXJyb3IoImlvY3RsIiksIGV4aXQoMSk7CisJLyogUmVzZXQgY292ZXJhZ2UgZnJvbSB0aGUgdGFpbCBvZiB0aGUgaW9jdGwoKSBjYWxsLiAqLworCV9fYXRvbWljX3N0b3JlX24oJmNvdmVyWzBdLCAwLCBfX0FUT01JQ19SRUxBWEVEKTsKKwkvKiBUaGF0J3MgdGhlIHRhcmdldCBzeXNjYWwgY2FsbC4gKi8KKwlyZWFkKC0xLCBOVUxMLCAwKTsKKwkvKiBSZWFkIG51bWJlciBvZiBQQ3MgY29sbGVjdGVkLiAqLworCW4gPSBfX2F0b21pY19sb2FkX24oJmNvdmVyWzBdLCBfX0FUT01JQ19SRUxBWEVEKTsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlwcmludGYoIjB4JWx4XG4iLCBjb3ZlcltpICsgMV0pOworCS8qIERpc2FibGUgY292ZXJhZ2UgY29sbGVjdGlvbiBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLiBBZnRlciB0aGlzIGNhbGwKKwkgKiBjb3ZlcmFnZSBjYW4gYmUgZW5hYmxlZCBmb3IgYSBkaWZmZXJlbnQgdGhyZWFkLgorCSAqLworCWlmIChpb2N0bChmZCwgS0NPVl9ESVNBQkxFLCAwKSkKKwkJcGVycm9yKCJpb2N0bCIpLCBleGl0KDEpOworCS8qIEZyZWUgcmVzb3VyY2VzLiAqLworCWlmIChtdW5tYXAoY292ZXIsIENPVkVSX1NJWkUgKiBzaXplb2YodW5zaWduZWQgbG9uZykpKQorCQlwZXJyb3IoIm11bm1hcCIpLCBleGl0KDEpOworCWlmIChjbG9zZShmZCkpCisJCXBlcnJvcigiY2xvc2UiKSwgZXhpdCgxKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKK0FmdGVyIHBpcGluZyB0aHJvdWdoIGFkZHIybGluZSBvdXRwdXQgb2YgdGhlIHByb2dyYW0gbG9va3MgYXMgZm9sbG93czo6CisKKyAgICBTeVNfcmVhZAorICAgIGZzL3JlYWRfd3JpdGUuYzo1NjIKKyAgICBfX2ZkZ2V0X3BvcworICAgIGZzL2ZpbGUuYzo3NzQKKyAgICBfX2ZnZXRfbGlnaHQKKyAgICBmcy9maWxlLmM6NzQ2CisgICAgX19mZ2V0X2xpZ2h0CisgICAgZnMvZmlsZS5jOjc1MAorICAgIF9fZmdldF9saWdodAorICAgIGZzL2ZpbGUuYzo3NjAKKyAgICBfX2ZkZ2V0X3BvcworICAgIGZzL2ZpbGUuYzo3ODQKKyAgICBTeVNfcmVhZAorICAgIGZzL3JlYWRfd3JpdGUuYzo1NjIKKworSWYgYSBwcm9ncmFtIG5lZWRzIHRvIGNvbGxlY3QgY292ZXJhZ2UgZnJvbSBzZXZlcmFsIHRocmVhZHMgKGluZGVwZW5kZW50bHkpLAoraXQgbmVlZHMgdG8gb3BlbiAvc3lzL2tlcm5lbC9kZWJ1Zy9rY292IGluIGVhY2ggdGhyZWFkIHNlcGFyYXRlbHkuCisKK1RoZSBpbnRlcmZhY2UgaXMgZmluZS1ncmFpbmVkIHRvIGFsbG93IGVmZmljaWVudCBmb3JraW5nIG9mIHRlc3QgcHJvY2Vzc2VzLgorVGhhdCBpcywgYSBwYXJlbnQgcHJvY2VzcyBvcGVucyAvc3lzL2tlcm5lbC9kZWJ1Zy9rY292LCBlbmFibGVzIHRyYWNlIG1vZGUsCittbWFwcyBjb3ZlcmFnZSBidWZmZXIgYW5kIHRoZW4gZm9ya3MgY2hpbGQgcHJvY2Vzc2VzIGluIGEgbG9vcC4gQ2hpbGQgcHJvY2Vzc2VzCitvbmx5IG5lZWQgdG8gZW5hYmxlIGNvdmVyYWdlIChkaXNhYmxlIGhhcHBlbnMgYXV0b21hdGljYWxseSBvbiB0aHJlYWQgZW5kKS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2ttZW1jaGVjay5yc3QgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9rbWVtY2hlY2sucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmM2QxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9rbWVtY2hlY2sucnN0CkBAIC0wLDAgKzEsNzMzIEBACitHZXR0aW5nIHN0YXJ0ZWQgd2l0aCBrbWVtY2hlY2sKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitWZWdhcmQgTm9zc3VtIDx2ZWdhcmRub0BpZmkudWlvLm5vPgorCisKK0ludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tCisKK2ttZW1jaGVjayBpcyBhIGRlYnVnZ2luZyBmZWF0dXJlIGZvciB0aGUgTGludXggS2VybmVsLiBNb3JlIHNwZWNpZmljYWxseSwgaXQKK2lzIGEgZHluYW1pYyBjaGVja2VyIHRoYXQgZGV0ZWN0cyBhbmQgd2FybnMgYWJvdXQgc29tZSB1c2VzIG9mIHVuaW5pdGlhbGl6ZWQKK21lbW9yeS4KKworVXNlcnNwYWNlIHByb2dyYW1tZXJzIG1pZ2h0IGJlIGZhbWlsaWFyIHdpdGggVmFsZ3JpbmQncyBtZW1jaGVjay4gVGhlIG1haW4KK2RpZmZlcmVuY2UgYmV0d2VlbiBtZW1jaGVjayBhbmQga21lbWNoZWNrIGlzIHRoYXQgbWVtY2hlY2sgd29ya3MgZm9yIHVzZXJzcGFjZQorcHJvZ3JhbXMgb25seSwgYW5kIGttZW1jaGVjayB3b3JrcyBmb3IgdGhlIGtlcm5lbCBvbmx5LiBUaGUgaW1wbGVtZW50YXRpb25zCithcmUgb2YgY291cnNlIHZhc3RseSBkaWZmZXJlbnQuIEJlY2F1c2Ugb2YgdGhpcywga21lbWNoZWNrIGlzIG5vdCBhcyBhY2N1cmF0ZQorYXMgbWVtY2hlY2ssIGJ1dCBpdCB0dXJucyBvdXQgdG8gYmUgZ29vZCBlbm91Z2ggaW4gcHJhY3RpY2UgdG8gZGlzY292ZXIgcmVhbAorcHJvZ3JhbW1lciBlcnJvcnMgdGhhdCB0aGUgY29tcGlsZXIgaXMgbm90IGFibGUgdG8gZmluZCB0aHJvdWdoIHN0YXRpYworYW5hbHlzaXMuCisKK0VuYWJsaW5nIGttZW1jaGVjayBvbiBhIGtlcm5lbCB3aWxsIHByb2JhYmx5IHNsb3cgaXQgZG93biB0byB0aGUgZXh0ZW50IHRoYXQKK3RoZSBtYWNoaW5lIHdpbGwgbm90IGJlIHVzYWJsZSBmb3Igbm9ybWFsIHdvcmtsb2FkcyBzdWNoIGFzIGUuZy4gYW4KK2ludGVyYWN0aXZlIGRlc2t0b3AuIGttZW1jaGVjayB3aWxsIGFsc28gY2F1c2UgdGhlIGtlcm5lbCB0byB1c2UgYWJvdXQgdHdpY2UKK2FzIG11Y2ggbWVtb3J5IGFzIG5vcm1hbC4gRm9yIHRoaXMgcmVhc29uLCBrbWVtY2hlY2sgaXMgc3RyaWN0bHkgYSBkZWJ1Z2dpbmcKK2ZlYXR1cmUuCisKKworRG93bmxvYWRpbmcKKy0tLS0tLS0tLS0tCisKK0FzIG9mIHZlcnNpb24gMi42LjMxLXJjMSwga21lbWNoZWNrIGlzIGluY2x1ZGVkIGluIHRoZSBtYWlubGluZSBrZXJuZWwuCisKKworQ29uZmlndXJpbmcgYW5kIGNvbXBpbGluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitrbWVtY2hlY2sgb25seSB3b3JrcyBmb3IgdGhlIHg4NiAoYm90aCAzMi0gYW5kIDY0LWJpdCkgcGxhdGZvcm0uIEEgbnVtYmVyIG9mCitjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBtdXN0IGhhdmUgc3BlY2lmaWMgc2V0dGluZ3MgaW4gb3JkZXIgZm9yIHRoZSBrbWVtY2hlY2sKK21lbnUgdG8gZXZlbiBhcHBlYXIgaW4gIm1lbnVjb25maWciLiBUaGVzZSBhcmU6CisKKy0gYGBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9bmBgCisJVGhpcyBvcHRpb24gaXMgbG9jYXRlZCB1bmRlciAiR2VuZXJhbCBzZXR1cCIgLyAiT3B0aW1pemUgZm9yIHNpemUiLgorCisJV2l0aG91dCB0aGlzLCBnY2Mgd2lsbCB1c2UgY2VydGFpbiBvcHRpbWl6YXRpb25zIHRoYXQgdXN1YWxseSBsZWFkIHRvCisJZmFsc2UgcG9zaXRpdmUgd2FybmluZ3MgZnJvbSBrbWVtY2hlY2suIEFuIGV4YW1wbGUgb2YgdGhpcyBpcyBhIDE2LWJpdAorCWZpZWxkIGluIGEgc3RydWN0LCB3aGVyZSBnY2MgbWF5IGxvYWQgMzIgYml0cywgdGhlbiBkaXNjYXJkIHRoZSB1cHBlcgorCTE2IGJpdHMuIGttZW1jaGVjayBzZWVzIG9ubHkgdGhlIDMyLWJpdCBsb2FkLCBhbmQgbWF5IHRyaWdnZXIgYQorCXdhcm5pbmcgZm9yIHRoZSB1cHBlciAxNiBiaXRzIChpZiB0aGV5J3JlIHVuaW5pdGlhbGl6ZWQpLgorCistIGBgQ09ORklHX1NMQUI9eWBgIG9yIGBgQ09ORklHX1NMVUI9eWBgCisJVGhpcyBvcHRpb24gaXMgbG9jYXRlZCB1bmRlciAiR2VuZXJhbCBzZXR1cCIgLyAiQ2hvb3NlIFNMQUIKKwlhbGxvY2F0b3IiLgorCistIGBgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUj1uYGAKKwlUaGlzIG9wdGlvbiBpcyBsb2NhdGVkIHVuZGVyICJLZXJuZWwgaGFja2luZyIgLyAiVHJhY2VycyIgLyAiS2VybmVsCisJRnVuY3Rpb24gVHJhY2VyIgorCisJV2hlbiBmdW5jdGlvbiB0cmFjaW5nIGlzIGNvbXBpbGVkIGluLCBnY2MgZW1pdHMgYSBjYWxsIHRvIGFub3RoZXIKKwlmdW5jdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IGZ1bmN0aW9uLiBUaGlzIG1lYW5zIHRoYXQgd2hlbiB0aGUKKwlwYWdlIGZhdWx0IGhhbmRsZXIgaXMgY2FsbGVkLCB0aGUgZnRyYWNlIGZyYW1ld29yayB3aWxsIGJlIGNhbGxlZAorCWJlZm9yZSBrbWVtY2hlY2sgaGFzIGhhZCBhIGNoYW5jZSB0byBoYW5kbGUgdGhlIGZhdWx0LiBJZiBmdHJhY2UgdGhlbgorCW1vZGlmaWVzIG1lbW9yeSB0aGF0IHdhcyB0cmFja2VkIGJ5IGttZW1jaGVjaywgdGhlIHJlc3VsdCBpcyBhbgorCWVuZGxlc3MgcmVjdXJzaXZlIHBhZ2UgZmF1bHQuCisKKy0gYGBDT05GSUdfREVCVUdfUEFHRUFMTE9DPW5gYAorCVRoaXMgb3B0aW9uIGlzIGxvY2F0ZWQgdW5kZXIgIktlcm5lbCBoYWNraW5nIiAvICJNZW1vcnkgRGVidWdnaW5nIgorCS8gIkRlYnVnIHBhZ2UgbWVtb3J5IGFsbG9jYXRpb25zIi4KKworSW4gYWRkaXRpb24sIEkgaGlnaGx5IHJlY29tbWVuZCB0dXJuaW5nIG9uIGBgQ09ORklHX0RFQlVHX0lORk89eWBgLiBUaGlzIGlzIGFsc28KK2xvY2F0ZWQgdW5kZXIgIktlcm5lbCBoYWNraW5nIi4gV2l0aCB0aGlzLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGdldCBsaW5lIG51bWJlcgoraW5mb3JtYXRpb24gZnJvbSB0aGUga21lbWNoZWNrIHdhcm5pbmdzLCB3aGljaCBpcyBleHRyZW1lbHkgdmFsdWFibGUgaW4KK2RlYnVnZ2luZyBhIHByb2JsZW0uIFRoaXMgb3B0aW9uIGlzIG5vdCBtYW5kYXRvcnksIGhvd2V2ZXIsIGJlY2F1c2UgaXQgc2xvd3MKK2Rvd24gdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MgYW5kIHByb2R1Y2VzIGEgbXVjaCBiaWdnZXIga2VybmVsIGltYWdlLgorCitOb3cgdGhlIGttZW1jaGVjayBtZW51IHNob3VsZCBiZSB2aXNpYmxlICh1bmRlciAiS2VybmVsIGhhY2tpbmciIC8gIk1lbW9yeQorRGVidWdnaW5nIiAvICJrbWVtY2hlY2s6IHRyYXAgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IikuIEhlcmUgZm9sbG93cworYSBkZXNjcmlwdGlvbiBvZiB0aGUga21lbWNoZWNrIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzOgorCistIGBgQ09ORklHX0tNRU1DSEVDS2BgCisJVGhpcyBtdXN0IGJlIGVuYWJsZWQgaW4gb3JkZXIgdG8gdXNlIGttZW1jaGVjayBhdCBhbGwuLi4KKworLSBgYENPTkZJR19LTUVNQ0hFQ0tfYGBbYGBESVNBQkxFRGBgIHwgYGBFTkFCTEVEYGAgfCBgYE9ORVNIT1RgYF1gYF9CWV9ERUZBVUxUYGAKKwlUaGlzIG9wdGlvbiBjb250cm9scyB0aGUgc3RhdHVzIG9mIGttZW1jaGVjayBhdCBib290LXRpbWUuICJFbmFibGVkIgorCXdpbGwgZW5hYmxlIGttZW1jaGVjayByaWdodCBmcm9tIHRoZSBzdGFydCwgImRpc2FibGVkIiB3aWxsIGJvb3QgdGhlCisJa2VybmVsIGFzIG5vcm1hbCAoYnV0IHdpdGggdGhlIGttZW1jaGVjayBjb2RlIGNvbXBpbGVkIGluLCBzbyBpdCBjYW4KKwliZSBlbmFibGVkIGF0IHJ1bi10aW1lIGFmdGVyIHRoZSBrZXJuZWwgaGFzIGJvb3RlZCksIGFuZCAib25lLXNob3QiIGlzCisJYSBzcGVjaWFsIG1vZGUgd2hpY2ggd2lsbCB0dXJuIGttZW1jaGVjayBvZmYgYXV0b21hdGljYWxseSBhZnRlcgorCWRldGVjdGluZyB0aGUgZmlyc3QgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LgorCisJSWYgeW91IGFyZSB1c2luZyBrbWVtY2hlY2sgdG8gYWN0aXZlbHkgZGVidWcgYSBwcm9ibGVtLCB0aGVuIHlvdQorCXByb2JhYmx5IHdhbnQgdG8gY2hvb3NlICJlbmFibGVkIiBoZXJlLgorCisJVGhlIG9uZS1zaG90IG1vZGUgaXMgbW9zdGx5IHVzZWZ1bCBpbiBhdXRvbWF0ZWQgdGVzdCBzZXR1cHMgYmVjYXVzZSBpdAorCWNhbiBwcmV2ZW50IGZsb29kcyBvZiB3YXJuaW5ncyBhbmQgaW5jcmVhc2UgdGhlIGNoYW5jZXMgb2YgdGhlIG1hY2hpbmUKKwlzdXJ2aXZpbmcgaW4gY2FzZSBzb21ldGhpbmcgaXMgcmVhbGx5IHdyb25nLiBJbiBvdGhlciBjYXNlcywgdGhlIG9uZS0KKwlzaG90IG1vZGUgY291bGQgYWN0dWFsbHkgYmUgY291bnRlci1wcm9kdWN0aXZlIGJlY2F1c2UgaXQgd291bGQgdHVybgorCWl0c2VsZiBvZmYgYXQgdGhlIHZlcnkgZmlyc3QgZXJyb3IgLS0gaW4gdGhlIGNhc2Ugb2YgYSBmYWxzZSBwb3NpdGl2ZQorCXRvbyAtLSBhbmQgdGhpcyB3b3VsZCBjb21lIGluIHRoZSB3YXkgb2YgZGVidWdnaW5nIHRoZSBzcGVjaWZpYworCXByb2JsZW0geW91IHdlcmUgaW50ZXJlc3RlZCBpbi4KKworCUlmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB5b3VyIGtlcm5lbCBhcyBub3JtYWwsIGJ1dCB3aXRoIGEgY2hhbmNlIHRvCisJZW5hYmxlIGttZW1jaGVjayBpbiBjYXNlIG9mIHNvbWUgcHJvYmxlbSwgaXQgbWlnaHQgYmUgYSBnb29kIGlkZWEgdG8KKwljaG9vc2UgImRpc2FibGVkIiBoZXJlLiBXaGVuIGttZW1jaGVjayBpcyBkaXNhYmxlZCwgbW9zdCBvZiB0aGUgcnVuLQorCXRpbWUgb3ZlcmhlYWQgaXMgbm90IGluY3VycmVkLCBhbmQgdGhlIGtlcm5lbCB3aWxsIGJlIGFsbW9zdCBhcyBmYXN0CisJYXMgbm9ybWFsLgorCistIGBgQ09ORklHX0tNRU1DSEVDS19RVUVVRV9TSVpFYGAKKwlTZWxlY3QgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVycm9yIHJlcG9ydHMgdG8gc3RvcmUgaW4gYW4gaW50ZXJuYWwKKwkoZml4ZWQtc2l6ZSkgYnVmZmVyLiBTaW5jZSBlcnJvcnMgY2FuIG9jY3VyIHZpcnR1YWxseSBhbnl3aGVyZSBhbmQgaW4KKwlhbnkgY29udGV4dCwgd2UgbmVlZCBhIHRlbXBvcmFyeSBzdG9yYWdlIGFyZWEgd2hpY2ggaXMgZ3VhcmFudGVlZCBub3QKKwl0byBnZW5lcmF0ZSBhbnkgb3RoZXIgcGFnZSBmYXVsdHMgd2hlbiBhY2Nlc3NlZC4gVGhlIHF1ZXVlIHdpbGwgYmUKKwllbXB0aWVkIGFzIHNvb24gYXMgYSB0YXNrbGV0IG1heSBiZSBzY2hlZHVsZWQuIElmIHRoZSBxdWV1ZSBpcyBmdWxsLAorCW5ldyBlcnJvciByZXBvcnRzIHdpbGwgYmUgbG9zdC4KKworCVRoZSBkZWZhdWx0IHZhbHVlIG9mIDY0IGlzIHByb2JhYmx5IGZpbmUuIElmIHNvbWUgY29kZSBwcm9kdWNlcyBtb3JlCisJdGhhbiA2NCBlcnJvcnMgd2l0aGluIGFuIGlycXMtb2ZmIHNlY3Rpb24sIHRoZW4gdGhlIGNvZGUgaXMgbGlrZWx5IHRvCisJcHJvZHVjZSBtYW55LCBtYW55IG1vcmUsIHRvbywgYW5kIHRoZXNlIGFkZGl0aW9uYWwgcmVwb3J0cyBzZWxkb20gZ2l2ZQorCWFueSBtb3JlIGluZm9ybWF0aW9uICh0aGUgZmlyc3QgcmVwb3J0IGlzIHVzdWFsbHkgdGhlIG1vc3QgdmFsdWFibGUKKwlhbnl3YXkpLgorCisJVGhpcyBudW1iZXIgbWlnaHQgaGF2ZSB0byBiZSBhZGp1c3RlZCBpZiB5b3UgYXJlIG5vdCB1c2luZyBzZXJpYWwKKwljb25zb2xlIG9yIHNpbWlsYXIgdG8gY2FwdHVyZSB0aGUga2VybmVsIGxvZy4gSWYgeW91IGFyZSB1c2luZyB0aGUKKwkiZG1lc2ciIGNvbW1hbmQgdG8gc2F2ZSB0aGUgbG9nLCB0aGVuIGdldHRpbmcgYSBsb3Qgb2Yga21lbWNoZWNrCisJd2FybmluZ3MgbWlnaHQgb3ZlcmZsb3cgdGhlIGtlcm5lbCBsb2cgaXRzZWxmLCBhbmQgdGhlIGVhcmxpZXIgcmVwb3J0cworCXdpbGwgZ2V0IGxvc3QgaW4gdGhhdCB3YXkgaW5zdGVhZC4gVHJ5IHNldHRpbmcgdGhpcyB0byAxMCBvciBzbyBvbgorCXN1Y2ggYSBzZXR1cC4KKworLSBgYENPTkZJR19LTUVNQ0hFQ0tfU0hBRE9XX0NPUFlfU0hJRlRgYAorCVNlbGVjdCB0aGUgbnVtYmVyIG9mIHNoYWRvdyBieXRlcyB0byBzYXZlIGFsb25nIHdpdGggZWFjaCBlbnRyeSBvZiB0aGUKKwllcnJvci1yZXBvcnQgcXVldWUuIFRoZXNlIGJ5dGVzIGluZGljYXRlIHdoYXQgcGFydHMgb2YgYW4gYWxsb2NhdGlvbgorCWFyZSBpbml0aWFsaXplZCwgdW5pbml0aWFsaXplZCwgZXRjLiBhbmQgd2lsbCBiZSBkaXNwbGF5ZWQgd2hlbiBhbgorCWVycm9yIGlzIGRldGVjdGVkIHRvIGhlbHAgdGhlIGRlYnVnZ2luZyBvZiBhIHBhcnRpY3VsYXIgcHJvYmxlbS4KKworCVRoZSBudW1iZXIgZW50ZXJlZCBoZXJlIGlzIGFjdHVhbGx5IHRoZSBsb2dhcml0aG0gb2YgdGhlIG51bWJlciBvZgorCWJ5dGVzIHRoYXQgd2lsbCBiZSBzYXZlZC4gU28gaWYgeW91IHBpY2sgZm9yIGV4YW1wbGUgNSBoZXJlLCBrbWVtY2hlY2sKKwl3aWxsIHNhdmUgMl41ID0gMzIgYnl0ZXMuCisKKwlUaGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgZmluZSBmb3IgZGVidWdnaW5nIG1vc3QgcHJvYmxlbXMuIEl0IGFsc28KKwlmaXRzIG5pY2VseSB3aXRoaW4gODAgY29sdW1ucy4KKworLSBgYENPTkZJR19LTUVNQ0hFQ0tfUEFSVElBTF9PS2BgCisJVGhpcyBvcHRpb24gKHdoZW4gZW5hYmxlZCkgd29ya3MgYXJvdW5kIGNlcnRhaW4gR0NDIG9wdGltaXphdGlvbnMgdGhhdAorCXByb2R1Y2UgMzItYml0IHJlYWRzIGZyb20gMTYtYml0IHZhcmlhYmxlcyB3aGVyZSB0aGUgdXBwZXIgMTYgYml0cyBhcmUKKwl0aHJvd24gYXdheSBhZnRlcndhcmRzLgorCisJVGhlIGRlZmF1bHQgdmFsdWUgKGVuYWJsZWQpIGlzIHJlY29tbWVuZGVkLiBUaGlzIG1heSBvZiBjb3Vyc2UgaGlkZQorCXNvbWUgcmVhbCBlcnJvcnMsIGJ1dCBkaXNhYmxpbmcgaXQgd291bGQgcHJvYmFibHkgcHJvZHVjZSBhIGxvdCBvZgorCWZhbHNlIHBvc2l0aXZlcy4KKworLSBgYENPTkZJR19LTUVNQ0hFQ0tfQklUT1BTX09LYGAKKwlUaGlzIG9wdGlvbiBzaWxlbmNlcyB3YXJuaW5ncyB0aGF0IHdvdWxkIGJlIGdlbmVyYXRlZCBmb3IgYml0LWZpZWxkCisJYWNjZXNzZXMgd2hlcmUgbm90IGFsbCB0aGUgYml0cyBhcmUgaW5pdGlhbGl6ZWQgYXQgdGhlIHNhbWUgdGltZS4gVGhpcworCW1heSBhbHNvIGhpZGUgc29tZSByZWFsIGJ1Z3MuCisKKwlUaGlzIG9wdGlvbiBpcyBwcm9iYWJseSBvYnNvbGV0ZSwgb3IgaXQgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGgKKwl0aGUga21lbWNoZWNrLS9iaXRmaWVsZC1hbm5vdGF0aW9ucyBmb3IgdGhlIGNvZGUgaW4gcXVlc3Rpb24uIFRoZQorCWRlZmF1bHQgdmFsdWUgaXMgdGhlcmVmb3JlIGZpbmUuCisKK05vdyBjb21waWxlIHRoZSBrZXJuZWwgYXMgdXN1YWwuCisKKworSG93IHRvIHVzZQorLS0tLS0tLS0tLQorCitCb290aW5nCit+fn5+fn5+CisKK0ZpcnN0IHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zLiBUaGVyZSBpcyBvbmx5IG9uZQorb3B0aW9uIHNwZWNpZmljIHRvIGttZW1jaGVjaywgYW5kIHRoaXMgaXMgY2FsbGVkICJrbWVtY2hlY2siLiBJdCBjYW4gYmUgdXNlZAordG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbW9kZSBhcyBjaG9zZW4gYnkgdGhlIGBgQ09ORklHX0tNRU1DSEVDS18qX0JZX0RFRkFVTFRgYAorb3B0aW9uLiBJdHMgcG9zc2libGUgc2V0dGluZ3MgYXJlOgorCistIGBga21lbWNoZWNrPTBgYCAoZGlzYWJsZWQpCistIGBga21lbWNoZWNrPTFgYCAoZW5hYmxlZCkKKy0gYGBrbWVtY2hlY2s9MmBgIChvbmUtc2hvdCBtb2RlKQorCitJZiBTTFVCIGRlYnVnZ2luZyBoYXMgYmVlbiBlbmFibGVkIGluIHRoZSBrZXJuZWwsIGl0IG1heSB0YWtlIHByZWNlZGVuY2Ugb3Zlcgora21lbWNoZWNrIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgc2xhYiBjYWNoZXMgd2hpY2ggYXJlIHVuZGVyIFNMVUIgZGVidWdnaW5nCit3aWxsIG5vdCBiZSB0cmFja2VkIGJ5IGttZW1jaGVjay4gSW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhpcyBkb2Vzbid0IGhhcHBlbgorKGV2ZW4gdGhvdWdoIGl0IHNob3VsZG4ndCBieSBkZWZhdWx0KSwgdXNlIFNMVUIncyBib290IG9wdGlvbiBgYHNsdWJfZGVidWdgYCwKK2xpa2UgdGhpczogYGBzbHViX2RlYnVnPS1gYAorCitJbiBmYWN0LCB0aGlzIG9wdGlvbiBtYXkgYWxzbyBiZSB1c2VkIGZvciBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIFNMVUIgdnMuCitrbWVtY2hlY2suIEZvciBleGFtcGxlLCBpZiB0aGUgY29tbWFuZCBsaW5lIGluY2x1ZGVzCitgYGttZW1jaGVjaz0xIHNsdWJfZGVidWc9LGRlbnRyeWBgLCB0aGVuIFNMVUIgZGVidWdnaW5nIHdpbGwgYmUgdXNlZCBvbmx5Citmb3IgdGhlICJkZW50cnkiIHNsYWIgY2FjaGUsIGFuZCB3aXRoIGttZW1jaGVjayB0cmFja2luZyBhbGwgdGhlIG90aGVyCitjYWNoZXMuIFRoaXMgaXMgYWR2YW5jZWQgdXNhZ2UsIGhvd2V2ZXIsIGFuZCBpcyBub3QgZ2VuZXJhbGx5IHJlY29tbWVuZGVkLgorCisKK1J1bi10aW1lIGVuYWJsZS9kaXNhYmxlCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitXaGVuIHRoZSBrZXJuZWwgaGFzIGJvb3RlZCwgaXQgaXMgcG9zc2libGUgdG8gZW5hYmxlIG9yIGRpc2FibGUga21lbWNoZWNrIGF0CitydW4tdGltZS4gV0FSTklORzogVGhpcyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNhdXNlIGZhbHNlCitwb3NpdGl2ZSB3YXJuaW5ncyB0byBhcHBlYXIuIFRoZXJlZm9yZSwgdHJ5IG5vdCB0byB1c2UgdGhpcy4gSWYgeW91IGZpbmQgdGhhdAoraXQgZG9lc24ndCB3b3JrIHByb3Blcmx5IChlLmcuIHlvdSBzZWUgYW4gdW5yZWFzb25hYmxlIGFtb3VudCBvZiB3YXJuaW5ncyksIEkKK3dpbGwgYmUgaGFwcHkgdG8gdGFrZSBidWcgcmVwb3J0cy4KKworVXNlIHRoZSBmaWxlIGBgL3Byb2Mvc3lzL2tlcm5lbC9rbWVtY2hlY2tgYCBmb3IgdGhpcyBwdXJwb3NlLCBlLmcuOjoKKworCSQgZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9rbWVtY2hlY2sgIyBkaXNhYmxlcyBrbWVtY2hlY2sKKworVGhlIG51bWJlcnMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgYGBrbWVtY2hlY2s9YGAgY29tbWFuZC1saW5lIG9wdGlvbi4KKworCitEZWJ1Z2dpbmcKK35+fn5+fn5+fgorCitBIHR5cGljYWwgcmVwb3J0IHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOjoKKworICAgIFdBUk5JTkc6IGttZW1jaGVjazogQ2F1Z2h0IDMyLWJpdCByZWFkIGZyb20gdW5pbml0aWFsaXplZCBtZW1vcnkgKGZmZmY4ODAwM2U0YTIwMjQpCisgICAgODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODhmZmZmMDAwMDAwMDAwMDAwMDAwMAorICAgICBpIGkgaSBpIHUgdSB1IHUgaSBpIGkgaSBpIGkgaSBpIHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUKKyAgICAgICAgICAgICBeCisKKyAgICBQaWQ6IDE4NTYsIGNvbW06IG50cGRhdGUgTm90IHRhaW50ZWQgMi42LjI5LXJjNSAjMjY0IDk0NVAtQQorICAgIFJJUDogMDAxMDpbPGZmZmZmZmZmODEwNGVkZTg+XSAgWzxmZmZmZmZmZjgxMDRlZGU4Pl0gX19kZXF1ZXVlX3NpZ25hbCsweGM4LzB4MTkwCisgICAgUlNQOiAwMDE4OmZmZmY4ODAwM2NkZjdkOTggIEVGTEFHUzogMDAyMTAwMDIKKyAgICBSQVg6IDAwMDAwMDAwMDAwMDAwMzAgUkJYOiBmZmZmODgwMDNkNGVhOTY4IFJDWDogMDAwMDAwMDAwMDAwMDAwOQorICAgIFJEWDogZmZmZjg4MDAzZTVkNjAxOCBSU0k6IGZmZmY4ODAwM2U1ZDYwMjQgUkRJOiBmZmZmODgwMDNjZGY3ZTg0CisgICAgUkJQOiBmZmZmODgwMDNjZGY3ZGI4IFIwODogZmZmZjg4MDAzZTVkNjAwMCBSMDk6IDAwMDAwMDAwMDAwMDAwMDAKKyAgICBSMTA6IDAwMDAwMDAwMDAwMDAwODAgUjExOiAwMDAwMDAwMDAwMDAwMDAwIFIxMjogMDAwMDAwMDAwMDAwMDAwZQorICAgIFIxMzogZmZmZjg4MDAzY2RmN2U3OCBSMTQ6IGZmZmY4ODAwM2Q1MzA3MTAgUjE1OiBmZmZmODgwMDNkNWE5OGM4CisgICAgRlM6ICAwMDAwMDAwMDAwMDAwMDAwKDAwMDApIEdTOmZmZmY4ODAwMDE5ODIwMDAoMDA2Mykga25sR1M6MDAwMDAKKyAgICBDUzogIDAwMTAgRFM6IDAwMmIgRVM6IDAwMmIgQ1IwOiAwMDAwMDAwMDgwMDUwMDMzCisgICAgQ1IyOiBmZmZmODgwMDNmODA2ZWEwIENSMzogMDAwMDAwMDAzYzAzNjAwMCBDUjQ6IDAwMDAwMDAwMDAwMDA2YTAKKyAgICBEUjA6IDAwMDAwMDAwMDAwMDAwMDAgRFIxOiAwMDAwMDAwMDAwMDAwMDAwIERSMjogMDAwMDAwMDAwMDAwMDAwMAorICAgIERSMzogMDAwMDAwMDAwMDAwMDAwMCBEUjY6IDAwMDAwMDAwZmZmZjRmZjAgRFI3OiAwMDAwMDAwMDAwMDAwNDAwCisgICAgIFs8ZmZmZmZmZmY4MTA0ZjA0ZT5dIGRlcXVldWVfc2lnbmFsKzB4OGUvMHgxNzAKKyAgICAgWzxmZmZmZmZmZjgxMDUwYmQ4Pl0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKzB4OTgvMHgzOTAKKyAgICAgWzxmZmZmZmZmZjgxMDBiODdkPl0gZG9fbm90aWZ5X3Jlc3VtZSsweGFkLzB4N2QwCisgICAgIFs8ZmZmZmZmZmY4MTAwYzdiNT5dIGludF9zaWduYWwrMHgxMi8weDE3CisgICAgIFs8ZmZmZmZmZmZmZmZmZmZmZj5dIDB4ZmZmZmZmZmZmZmZmZmZmZgorCitUaGUgc2luZ2xlIG1vc3QgdmFsdWFibGUgaW5mb3JtYXRpb24gaW4gdGhpcyByZXBvcnQgaXMgdGhlIFJJUCAob3IgRUlQIG9uIDMyLQorYml0KSB2YWx1ZS4gVGhpcyB3aWxsIGhlbHAgdXMgcGlucG9pbnQgZXhhY3RseSB3aGljaCBpbnN0cnVjdGlvbiB0aGF0IGNhdXNlZAordGhlIHdhcm5pbmcuCisKK0lmIHlvdXIga2VybmVsIHdhcyBjb21waWxlZCB3aXRoIGBgQ09ORklHX0RFQlVHX0lORk89eWBgLCB0aGVuIGFsbCB3ZSBoYXZlIHRvIGRvCitpcyBnaXZlIHRoaXMgYWRkcmVzcyB0byB0aGUgYWRkcjJsaW5lIHByb2dyYW0sIGxpa2UgdGhpczo6CisKKwkkIGFkZHIybGluZSAtZSB2bWxpbnV4IC1pIGZmZmZmZmZmODEwNGVkZTgKKwlhcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdHJpbmdfNjQuaDoxMgorCWluY2x1ZGUvYXNtLWdlbmVyaWMvc2lnaW5mby5oOjI4NworCWtlcm5lbC9zaWduYWwuYzozODAKKwlrZXJuZWwvc2lnbmFsLmM6NDEwCisKK1RoZSAiYGAtZSB2bWxpbnV4YGAiIHRlbGxzIGFkZHIybGluZSB3aGljaCBmaWxlIHRvIGxvb2sgaW4uICoqSU1QT1JUQU5UOioqCitUaGlzIG11c3QgYmUgdGhlIHZtbGludXggb2YgdGhlIGtlcm5lbCB0aGF0IHByb2R1Y2VkIHRoZSB3YXJuaW5nIGluIHRoZQorZmlyc3QgcGxhY2UhIElmIG5vdCwgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZQord3JvbmcuCisKK1RoZSAiYGAtaWBgIiB0ZWxscyBhZGRyMmxpbmUgdG8gYWxzbyBwcmludCB0aGUgbGluZSBudW1iZXJzIG9mIGlubGluZWQKK2Z1bmN0aW9ucy4gIEluIHRoaXMgY2FzZSwgdGhlIGZsYWcgd2FzIHZlcnkgaW1wb3J0YW50LCBiZWNhdXNlIG90aGVyd2lzZSwKK2l0IHdvdWxkIG9ubHkgaGF2ZSBwcmludGVkIHRoZSBmaXJzdCBsaW5lLCB3aGljaCBpcyBqdXN0IGEgY2FsbCB0bworYGBtZW1jcHkoKWBgLCB3aGljaCBjb3VsZCBiZSBjYWxsZWQgZnJvbSBhIHRob3VzYW5kIHBsYWNlcyBpbiB0aGUga2VybmVsLCBhbmQKK2lzIHRoZXJlZm9yZSBub3QgdmVyeSB1c2VmdWwuICBUaGVzZSBpbmxpbmVkIGZ1bmN0aW9ucyB3b3VsZCBub3Qgc2hvdyB1cCBpbgordGhlIHN0YWNrIHRyYWNlIGFib3ZlLCBzaW1wbHkgYmVjYXVzZSB0aGUga2VybmVsIGRvZXNuJ3QgbG9hZCB0aGUgZXh0cmEKK2RlYnVnZ2luZyBpbmZvcm1hdGlvbi4gVGhpcyB0ZWNobmlxdWUgY2FuIG9mIGNvdXJzZSBiZSB1c2VkIHdpdGggb3JkaW5hcnkKK2tlcm5lbCBvb3BzZXMgYXMgd2VsbC4KKworSW4gdGhpcyBjYXNlLCBpdCdzIHRoZSBjYWxsZXIgb2YgYGBtZW1jcHkoKWBgIHRoYXQgaXMgaW50ZXJlc3RpbmcsIGFuZCBpdCBjYW4gYmUKK2ZvdW5kIGluIGBgaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWdpbmZvLmhgYCwgbGluZSAyODc6OgorCisgICAgMjgxIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3NpZ2luZm8oc3RydWN0IHNpZ2luZm8gKnRvLCBzdHJ1Y3Qgc2lnaW5mbyAqZnJvbSkKKyAgICAyODIgeworICAgIDI4MyAgICAgICAgIGlmIChmcm9tLT5zaV9jb2RlIDwgMCkKKyAgICAyODQgICAgICAgICAgICAgICAgIG1lbWNweSh0bywgZnJvbSwgc2l6ZW9mKCp0bykpOworICAgIDI4NSAgICAgICAgIGVsc2UKKyAgICAyODYgICAgICAgICAgICAgICAgIC8qIF9zaWdjaGxkIGlzIGN1cnJlbnRseSB0aGUgbGFyZ2VzdCBrbm93IHVuaW9uIG1lbWJlciAqLworICAgIDI4NyAgICAgICAgICAgICAgICAgbWVtY3B5KHRvLCBmcm9tLCBfX0FSQ0hfU0lfUFJFQU1CTEVfU0laRSArIHNpemVvZihmcm9tLT5fc2lmaWVsZHMuX3NpZ2NobGQpKTsKKyAgICAyODggfQorCitTaW5jZSB0aGlzIHdhcyBhIHJlYWQgKGttZW1jaGVjayB1c3VhbGx5IHdhcm5zIGFib3V0IHJlYWRzIG9ubHksIHRob3VnaCBpdCBjYW4KK3dhcm4gYWJvdXQgd3JpdGVzIHRvIHVuYWxsb2NhdGVkIG9yIGZyZWVkIG1lbW9yeSBhcyB3ZWxsKSwgaXQgd2FzIHByb2JhYmx5IHRoZQorImZyb20iIGFyZ3VtZW50IHdoaWNoIGNvbnRhaW5lZCBzb21lIHVuaW5pdGlhbGl6ZWQgYnl0ZXMuIEZvbGxvd2luZyB0aGUgY2hhaW4KK29mIGNhbGxzLCB3ZSBtb3ZlIHVwd2FyZHMgdG8gc2VlIHdoZXJlICJmcm9tIiB3YXMgYWxsb2NhdGVkIG9yIGluaXRpYWxpemVkLAorYGBrZXJuZWwvc2lnbmFsLmNgYCwgbGluZSAzODA6OgorCisgICAgMzU5IHN0YXRpYyB2b2lkIGNvbGxlY3Rfc2lnbmFsKGludCBzaWcsIHN0cnVjdCBzaWdwZW5kaW5nICpsaXN0LCBzaWdpbmZvX3QgKmluZm8pCisgICAgMzYwIHsKKyAgICAuLi4KKyAgICAzNjcgICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHEsICZsaXN0LT5saXN0LCBsaXN0KSB7CisgICAgMzY4ICAgICAgICAgICAgICAgICBpZiAocS0+aW5mby5zaV9zaWdubyA9PSBzaWcpIHsKKyAgICAzNjkgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgIDM3MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc3RpbGxfcGVuZGluZzsKKyAgICAzNzEgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBxOworICAgIC4uLgorICAgIDM3NyAgICAgICAgIGlmIChmaXJzdCkgeworICAgIDM3OCBzdGlsbF9wZW5kaW5nOgorICAgIDM3OSAgICAgICAgICAgICAgICAgbGlzdF9kZWxfaW5pdCgmZmlyc3QtPmxpc3QpOworICAgIDM4MCAgICAgICAgICAgICAgICAgY29weV9zaWdpbmZvKGluZm8sICZmaXJzdC0+aW5mbyk7CisgICAgMzgxICAgICAgICAgICAgICAgICBfX3NpZ3F1ZXVlX2ZyZWUoZmlyc3QpOworICAgIC4uLgorICAgIDM5MiAgICAgICAgIH0KKyAgICAzOTMgfQorCitIZXJlLCBpdCBpcyBgYCZmaXJzdC0+aW5mb2BgIHRoYXQgaXMgYmVpbmcgcGFzc2VkIG9uIHRvIGBgY29weV9zaWdpbmZvKClgYC4gVGhlCit2YXJpYWJsZSBgYGZpcnN0YGAgd2FzIGZvdW5kIG9uIGEgbGlzdCAtLSBwYXNzZWQgaW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0bworYGBjb2xsZWN0X3NpZ25hbCgpYGAuIFdlICBjb250aW51ZSBvdXIgam91cm5leSB0aHJvdWdoIHRoZSBzdGFjaywgdG8gZmlndXJlIG91dAord2hlcmUgdGhlIGl0ZW0gb24gImxpc3QiIHdhcyBhbGxvY2F0ZWQgb3IgaW5pdGlhbGl6ZWQuIFdlIG1vdmUgdG8gbGluZSA0MTA6OgorCisgICAgMzk1IHN0YXRpYyBpbnQgX19kZXF1ZXVlX3NpZ25hbChzdHJ1Y3Qgc2lncGVuZGluZyAqcGVuZGluZywgc2lnc2V0X3QgKm1hc2ssCisgICAgMzk2ICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ2luZm9fdCAqaW5mbykKKyAgICAzOTcgeworICAgIC4uLgorICAgIDQxMCAgICAgICAgICAgICAgICAgY29sbGVjdF9zaWduYWwoc2lnLCBwZW5kaW5nLCBpbmZvKTsKKyAgICAuLi4KKyAgICA0MTQgfQorCitOb3cgd2UgbmVlZCB0byBmb2xsb3cgdGhlIGBgcGVuZGluZ2BgIHBvaW50ZXIsIHNpbmNlIHRoYXQgaXMgYmVpbmcgcGFzc2VkIG9uIHRvCitgYGNvbGxlY3Rfc2lnbmFsKClgYCBhcyBgYGxpc3RgYC4gQXQgdGhpcyBwb2ludCwgd2UndmUgcnVuIG91dCBvZiBsaW5lcyBmcm9tIHRoZQorImFkZHIybGluZSIgb3V0cHV0LiBOb3QgdG8gd29ycnksIHdlIGp1c3QgcGFzdGUgdGhlIG5leHQgYWRkcmVzc2VzIGZyb20gdGhlCitrbWVtY2hlY2sgc3RhY2sgZHVtcCwgaS5lLjo6CisKKyAgICAgWzxmZmZmZmZmZjgxMDRmMDRlPl0gZGVxdWV1ZV9zaWduYWwrMHg4ZS8weDE3MAorICAgICBbPGZmZmZmZmZmODEwNTBiZDg+XSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIrMHg5OC8weDM5MAorICAgICBbPGZmZmZmZmZmODEwMGI4N2Q+XSBkb19ub3RpZnlfcmVzdW1lKzB4YWQvMHg3ZDAKKyAgICAgWzxmZmZmZmZmZjgxMDBjN2I1Pl0gaW50X3NpZ25hbCsweDEyLzB4MTcKKworCSQgYWRkcjJsaW5lIC1lIHZtbGludXggLWkgZmZmZmZmZmY4MTA0ZjA0ZSBmZmZmZmZmZjgxMDUwYmQ4IFwKKwkJZmZmZmZmZmY4MTAwYjg3ZCBmZmZmZmZmZjgxMDBjN2I1CisJa2VybmVsL3NpZ25hbC5jOjQ0NgorCWtlcm5lbC9zaWduYWwuYzoxODA2CisJYXJjaC94ODYva2VybmVsL3NpZ25hbC5jOjgwNQorCWFyY2gveDg2L2tlcm5lbC9zaWduYWwuYzo4NzEKKwlhcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUzo2OTQKKworUmVtZW1iZXIgdGhhdCBzaW5jZSB0aGVzZSBhZGRyZXNzZXMgd2VyZSBmb3VuZCBvbiB0aGUgc3RhY2sgYW5kIG5vdCBhcyB0aGUKK1JJUCB2YWx1ZSwgdGhleSBhY3R1YWxseSBwb2ludCB0byB0aGUgX25leHRfIGluc3RydWN0aW9uICh0aGV5IGFyZSByZXR1cm4KK2FkZHJlc3NlcykuIFRoaXMgYmVjb21lcyBvYnZpb3VzIHdoZW4gd2UgbG9vayBhdCB0aGUgY29kZSBmb3IgbGluZSA0NDY6OgorCisgICAgNDIyIGludCBkZXF1ZXVlX3NpZ25hbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc2lnc2V0X3QgKm1hc2ssIHNpZ2luZm9fdCAqaW5mbykKKyAgICA0MjMgeworICAgIC4uLgorICAgIDQzMSAgICAgICAgICAgICAgICAgc2lnbnIgPSBfX2RlcXVldWVfc2lnbmFsKCZ0c2stPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcsCisgICAgNDMyCQkJCQkJIG1hc2ssIGluZm8pOworICAgIDQzMwkJCS8qCisgICAgNDM0CQkJICogaXRpbWVyIHNpZ25hbCA/CisgICAgNDM1CQkJICoKKyAgICA0MzYJCQkgKiBpdGltZXJzIGFyZSBwcm9jZXNzIHNoYXJlZCBhbmQgd2UgcmVzdGFydCBwZXJpb2RpYworICAgIDQzNwkJCSAqIGl0aW1lcnMgaW4gdGhlIHNpZ25hbCBkZWxpdmVyeSBwYXRoIHRvIHByZXZlbnQgRG9TCisgICAgNDM4CQkJICogYXR0YWNrcyBpbiB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyIGNhc2UuIFRoaXMgaXMKKyAgICA0MzkJCQkgKiBjb21wbGlhbnQgd2l0aCB0aGUgb2xkIHdheSBvZiBzZWxmIHJlc3RhcnRpbmcKKyAgICA0NDAJCQkgKiBpdGltZXJzLCBhcyB0aGUgU0lHQUxSTSBpcyBhIGxlZ2FjeSBzaWduYWwgYW5kIG9ubHkKKyAgICA0NDEJCQkgKiBxdWV1ZWQgb25jZS4gQ2hhbmdpbmcgdGhlIHJlc3RhcnQgYmVoYXZpb3VyIHRvCisgICAgNDQyCQkJICogcmVzdGFydCB0aGUgdGltZXIgaW4gdGhlIHNpZ25hbCBkZXF1ZXVlIHBhdGggaXMKKyAgICA0NDMJCQkgKiByZWR1Y2luZyB0aGUgdGltZXIgbm9pc2Ugb24gaGVhdnkgbG9hZGVkICFoaWdocmVzCisgICAgNDQ0CQkJICogc3lzdGVtcyB0b28uCisgICAgNDQ1CQkJICovCisgICAgNDQ2CQkJaWYgKHVubGlrZWx5KHNpZ25yID09IFNJR0FMUk0pKSB7CisgICAgLi4uCisgICAgNDg5IH0KKworU28gaW5zdGVhZCBvZiBsb29raW5nIGF0IDQ0Niwgd2Ugc2hvdWxkIGJlIGxvb2tpbmcgYXQgNDMxLCB3aGljaCBpcyB0aGUgbGluZQordGhhdCBleGVjdXRlcyBqdXN0IGJlZm9yZSA0NDYuIEhlcmUgd2Ugc2VlIHRoYXQgd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IgaXMKK2BgJnRzay0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZ2BgLgorCitPdXIgbmV4dCB0YXNrIGlzIG5vdyB0byBmaWd1cmUgb3V0IHdoaWNoIGZ1bmN0aW9uIHRoYXQgcHV0cyBpdGVtcyBvbiB0aGlzCitgYHNoYXJlZF9wZW5kaW5nYGAgbGlzdC4gQSBjcnVkZSwgYnV0IGVmZmljaWVudCB0b29sLCBpcyBgYGdpdCBncmVwYGA6OgorCisJJCBnaXQgZ3JlcCAtbiAnc2hhcmVkX3BlbmRpbmcnIGtlcm5lbC8KKwkuLi4KKwlrZXJuZWwvc2lnbmFsLmM6ODI4OglwZW5kaW5nID0gZ3JvdXAgPyAmdC0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZyA6ICZ0LT5wZW5kaW5nOworCWtlcm5lbC9zaWduYWwuYzoxMzM5OglwZW5kaW5nID0gZ3JvdXAgPyAmdC0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZyA6ICZ0LT5wZW5kaW5nOworCS4uLgorCitUaGVyZSB3ZXJlIG1vcmUgcmVzdWx0cywgYnV0IG5vbmUgb2YgdGhlbSB3ZXJlIHJlbGF0ZWQgdG8gbGlzdCBvcGVyYXRpb25zLAorYW5kIHRoZXNlIHdlcmUgdGhlIG9ubHkgYXNzaWdubWVudHMuIFdlIGluc3BlY3QgdGhlIGxpbmUgbnVtYmVycyBtb3JlIGNsb3NlbHkKK2FuZCBmaW5kIHRoYXQgdGhpcyBpcyBpbmRlZWQgd2hlcmUgaXRlbXMgYXJlIGJlaW5nIGFkZGVkIHRvIHRoZSBsaXN0OjoKKworICAgIDgxNiBzdGF0aWMgaW50IHNlbmRfc2lnbmFsKGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsCisgICAgODE3CQkJCWludCBncm91cCkKKyAgICA4MTggeworICAgIC4uLgorICAgIDgyOAkJcGVuZGluZyA9IGdyb3VwID8gJnQtPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcgOiAmdC0+cGVuZGluZzsKKyAgICAuLi4KKyAgICA4NTEJCXEgPSBfX3NpZ3F1ZXVlX2FsbG9jKHQsIEdGUF9BVE9NSUMsIChzaWcgPCBTSUdSVE1JTiAmJgorICAgIDg1MgkJCQkJCSAgICAgKGlzX3NpX3NwZWNpYWwoaW5mbykgfHwKKyAgICA4NTMJCQkJCQkgICAgICBpbmZvLT5zaV9jb2RlID49IDApKSk7CisgICAgODU0CQlpZiAocSkgeworICAgIDg1NQkJCWxpc3RfYWRkX3RhaWwoJnEtPmxpc3QsICZwZW5kaW5nLT5saXN0KTsKKyAgICAuLi4KKyAgICA4OTAgfQorCithbmQ6OgorCisgICAgMTMwOSBpbnQgc2VuZF9zaWdxdWV1ZShzdHJ1Y3Qgc2lncXVldWUgKnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgaW50IGdyb3VwKQorICAgIDEzMTAgeworICAgIC4uLi4KKyAgICAxMzM5CSBwZW5kaW5nID0gZ3JvdXAgPyAmdC0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZyA6ICZ0LT5wZW5kaW5nOworICAgIDEzNDAJIGxpc3RfYWRkX3RhaWwoJnEtPmxpc3QsICZwZW5kaW5nLT5saXN0KTsKKyAgICAuLi4uCisgICAgMTM0NyB9CisKK0luIHRoZSBmaXJzdCBjYXNlLCB0aGUgbGlzdCBlbGVtZW50IHdlIGFyZSBsb29raW5nIGZvciwgYGBxYGAsIGlzIGJlaW5nCityZXR1cm5lZCBmcm9tIHRoZSBmdW5jdGlvbiBgYF9fc2lncXVldWVfYWxsb2MoKWBgLCB3aGljaCBsb29rcyBsaWtlIGFuCithbGxvY2F0aW9uIGZ1bmN0aW9uLiAgTGV0J3MgdGFrZSBhIGxvb2sgYXQgaXQ6OgorCisgICAgMTg3IHN0YXRpYyBzdHJ1Y3Qgc2lncXVldWUgKl9fc2lncXVldWVfYWxsb2Moc3RydWN0IHRhc2tfc3RydWN0ICp0LCBnZnBfdCBmbGFncywKKyAgICAxODgJCQkJCQkgaW50IG92ZXJyaWRlX3JsaW1pdCkKKyAgICAxODkgeworICAgIDE5MAkJc3RydWN0IHNpZ3F1ZXVlICpxID0gTlVMTDsKKyAgICAxOTEJCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlcjsKKyAgICAxOTIKKyAgICAxOTMJCS8qCisgICAgMTk0CQkgKiBXZSB3b24ndCBnZXQgcHJvYmxlbXMgd2l0aCB0aGUgdGFyZ2V0J3MgVUlEIGNoYW5naW5nIHVuZGVyIHVzCisgICAgMTk1CQkgKiBiZWNhdXNlIGNoYW5naW5nIGl0IHJlcXVpcmVzIFJDVSBiZSB1c2VkLCBhbmQgaWYgdCAhPSBjdXJyZW50LCB0aGUKKyAgICAxOTYJCSAqIGNhbGxlciBtdXN0IGJlIGhvbGRpbmcgdGhlIFJDVSByZWFkbG9jayAoYnkgd2F5IG9mIGEgc3BpbmxvY2spIGFuZAorICAgIDE5NwkJICogd2UgdXNlIFJDVSBwcm90ZWN0aW9uIGhlcmUKKyAgICAxOTgJCSAqLworICAgIDE5OQkJdXNlciA9IGdldF91aWQoX190YXNrX2NyZWQodCktPnVzZXIpOworICAgIDIwMAkJYXRvbWljX2luYygmdXNlci0+c2lncGVuZGluZyk7CisgICAgMjAxCQlpZiAob3ZlcnJpZGVfcmxpbWl0IHx8CisgICAgMjAyCQkgICAgYXRvbWljX3JlYWQoJnVzZXItPnNpZ3BlbmRpbmcpIDw9CisgICAgMjAzCQkJCXQtPnNpZ25hbC0+cmxpbVtSTElNSVRfU0lHUEVORElOR10ucmxpbV9jdXIpCisgICAgMjA0CQkJcSA9IGttZW1fY2FjaGVfYWxsb2Moc2lncXVldWVfY2FjaGVwLCBmbGFncyk7CisgICAgMjA1CQlpZiAodW5saWtlbHkocSA9PSBOVUxMKSkgeworICAgIDIwNgkJCWF0b21pY19kZWMoJnVzZXItPnNpZ3BlbmRpbmcpOworICAgIDIwNwkJCWZyZWVfdWlkKHVzZXIpOworICAgIDIwOAkJfSBlbHNlIHsKKyAgICAyMDkJCQlJTklUX0xJU1RfSEVBRCgmcS0+bGlzdCk7CisgICAgMjEwCQkJcS0+ZmxhZ3MgPSAwOworICAgIDIxMQkJCXEtPnVzZXIgPSB1c2VyOworICAgIDIxMgkJfQorICAgIDIxMworICAgIDIxNAkJcmV0dXJuIHE7CisgICAgMjE1IH0KKworV2Ugc2VlIHRoYXQgdGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBgYHEtPmxpc3RgYCwgYGBxLT5mbGFnc2BgLCBhbmQKK2BgcS0+dXNlcmBgLiBJdCBzZWVtcyB0aGF0IG5vdyBpcyB0aGUgdGltZSB0byBsb29rIGF0IHRoZSBkZWZpbml0aW9uIG9mCitgYHN0cnVjdCBzaWdxdWV1ZWBgLCBlLmcuOjoKKworICAgIDE0IHN0cnVjdCBzaWdxdWV1ZSB7CisgICAgMTUJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKyAgICAxNgkgICAgICAgaW50IGZsYWdzOworICAgIDE3CSAgICAgICBzaWdpbmZvX3QgaW5mbzsKKyAgICAxOAkgICAgICAgc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyOworICAgIDE5IH07CisKK0FuZCwgeW91IG1pZ2h0IHJlbWVtYmVyLCBpdCB3YXMgYSBgYG1lbWNweSgpYGAgb24gYGAmZmlyc3QtPmluZm9gYCB0aGF0CitjYXVzZWQgdGhlIHdhcm5pbmcsIHNvIHRoaXMgbWFrZXMgcGVyZmVjdCBzZW5zZS4gSXQgYWxzbyBzZWVtcyByZWFzb25hYmxlCit0byBhc3N1bWUgdGhhdCBpdCBpcyB0aGUgY2FsbGVyIG9mIGBgX19zaWdxdWV1ZV9hbGxvYygpYGAgdGhhdCBoYXMgdGhlCityZXNwb25zaWJpbGl0eSBvZiBmaWxsaW5nIG91dCAoaW5pdGlhbGl6aW5nKSB0aGlzIG1lbWJlci4KKworQnV0IGp1c3Qgd2hpY2ggZmllbGRzIG9mIHRoZSBzdHJ1Y3Qgd2VyZSB1bmluaXRpYWxpemVkPyBMZXQncyBsb29rIGF0CitrbWVtY2hlY2sncyByZXBvcnQgYWdhaW46OgorCisgICAgV0FSTklORzoga21lbWNoZWNrOiBDYXVnaHQgMzItYml0IHJlYWQgZnJvbSB1bmluaXRpYWxpemVkIG1lbW9yeSAoZmZmZjg4MDAzZTRhMjAyNCkKKyAgICA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4OGZmZmYwMDAwMDAwMDAwMDAwMDAwCisgICAgIGkgaSBpIGkgdSB1IHUgdSBpIGkgaSBpIGkgaSBpIGkgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdQorCSAgICAgXgorCitUaGVzZSBmaXJzdCB0d28gbGluZXMgYXJlIHRoZSBtZW1vcnkgZHVtcCBvZiB0aGUgbWVtb3J5IG9iamVjdCBpdHNlbGYsIGFuZAordGhlIHNoYWRvdyBieXRlbWFwLCByZXNwZWN0aXZlbHkuIFRoZSBtZW1vcnkgb2JqZWN0IGl0c2VsZiBpcyBpbiB0aGlzIGNhc2UKK2BgJmZpcnN0LT5pbmZvYGAuIEp1c3QgYmV3YXJlIHRoYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZHVtcCBpcyBOT1QgdGhlIHN0YXJ0CitvZiB0aGUgb2JqZWN0IGl0c2VsZiEgVGhlIHBvc2l0aW9uIG9mIHRoZSBjYXJldCAoXikgY29ycmVzcG9uZHMgd2l0aCB0aGUKK2FkZHJlc3Mgb2YgdGhlIHJlYWQgKGZmZmY4ODAwM2U0YTIwMjQpLgorCitUaGUgc2hhZG93IGJ5dGVtYXAgZHVtcCBsZWdlbmQgaXMgYXMgZm9sbG93czoKKworLSBpOiBpbml0aWFsaXplZAorLSB1OiB1bmluaXRpYWxpemVkCistIGE6IHVuYWxsb2NhdGVkIChtZW1vcnkgaGFzIGJlZW4gYWxsb2NhdGVkIGJ5IHRoZSBzbGFiIGxheWVyLCBidXQgaGFzIG5vdAorICB5ZXQgYmVlbiBoYW5kZWQgb2ZmIHRvIGFueWJvZHkpCistIGY6IGZyZWVkIChtZW1vcnkgaGFzIGJlZW4gYWxsb2NhdGVkIGJ5IHRoZSBzbGFiIGxheWVyLCBidXQgaGFzIGJlZW4gZnJlZWQKKyAgYnkgdGhlIHByZXZpb3VzIG93bmVyKQorCitJbiBvcmRlciB0byBmaWd1cmUgb3V0IHdoZXJlIChyZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIG9iamVjdCkgdGhlCit1bmluaXRpYWxpemVkIG1lbW9yeSB3YXMgbG9jYXRlZCwgd2UgaGF2ZSB0byBsb29rIGF0IHRoZSBkaXNhc3NlbWJseS4gRm9yCit0aGF0LCB3ZSdsbCBuZWVkIHRoZSBSSVAgYWRkcmVzcyBhZ2Fpbjo6CisKKyAgICBSSVA6IDAwMTA6WzxmZmZmZmZmZjgxMDRlZGU4Pl0gIFs8ZmZmZmZmZmY4MTA0ZWRlOD5dIF9fZGVxdWV1ZV9zaWduYWwrMHhjOC8weDE5MAorCisJJCBvYmpkdW1wIC1kIC0tbm8tc2hvdy1yYXctaW5zbiB2bWxpbnV4IHwgZ3JlcCAtQyA4IGZmZmZmZmZmODEwNGVkZTg6CisJZmZmZmZmZmY4MTA0ZWRjODoJbW92ICAgICVyOCwweDgoJXI4KQorCWZmZmZmZmZmODEwNGVkY2M6CXRlc3QgICAlcjEwZCwlcjEwZAorCWZmZmZmZmZmODEwNGVkY2Y6CWpzICAgICBmZmZmZmZmZjgxMDRlZTg4IDxfX2RlcXVldWVfc2lnbmFsKzB4MTY4PgorCWZmZmZmZmZmODEwNGVkZDU6CW1vdiAgICAlcmF4LCVyZHgKKwlmZmZmZmZmZjgxMDRlZGQ4Ogltb3YgICAgJDB4YywlZWN4CisJZmZmZmZmZmY4MTA0ZWRkZDoJbW92ICAgICVyMTMsJXJkaQorCWZmZmZmZmZmODEwNGVkZTA6CW1vdiAgICAkMHgzMCwlZWF4CisJZmZmZmZmZmY4MTA0ZWRlNToJbW92ICAgICVyZHgsJXJzaQorCWZmZmZmZmZmODEwNGVkZTg6CXJlcCBtb3ZzbCAlZHM6KCVyc2kpLCVlczooJXJkaSkKKwlmZmZmZmZmZjgxMDRlZGVhOgl0ZXN0ICAgJDB4MiwlYWwKKwlmZmZmZmZmZjgxMDRlZGVjOglqZSAgICAgZmZmZmZmZmY4MTA0ZWRmMCA8X19kZXF1ZXVlX3NpZ25hbCsweGQwPgorCWZmZmZmZmZmODEwNGVkZWU6CW1vdnN3ICAlZHM6KCVyc2kpLCVlczooJXJkaSkKKwlmZmZmZmZmZjgxMDRlZGYwOgl0ZXN0ICAgJDB4MSwlYWwKKwlmZmZmZmZmZjgxMDRlZGYyOglqZSAgICAgZmZmZmZmZmY4MTA0ZWRmNSA8X19kZXF1ZXVlX3NpZ25hbCsweGQ1PgorCWZmZmZmZmZmODEwNGVkZjQ6CW1vdnNiICAlZHM6KCVyc2kpLCVlczooJXJkaSkKKwlmZmZmZmZmZjgxMDRlZGY1Ogltb3YgICAgJXI4LCVyZGkKKwlmZmZmZmZmZjgxMDRlZGY4OgljYWxscSAgZmZmZmZmZmY4MTA0ZGU2MCA8X19zaWdxdWV1ZV9mcmVlPgorCitBcyBleHBlY3RlZCwgaXQncyB0aGUgImBgcmVwIG1vdnNsYGAiIGluc3RydWN0aW9uIGZyb20gdGhlIGBgbWVtY3B5KClgYAordGhhdCBjYXVzZXMgdGhlIHdhcm5pbmcuIFdlIGtub3cgYWJvdXQgYGBSRVAgTU9WU0xgYCB0aGF0IGl0IHVzZXMgdGhlIHJlZ2lzdGVyCitgYFJDWGBgIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGl0ZXJhdGlvbnMuIEJ5IHRha2luZyBhIGxvb2sgYXQgdGhlCityZWdpc3RlciBkdW1wIGFnYWluIChmcm9tIHRoZSBrbWVtY2hlY2sgcmVwb3J0KSwgd2UgY2FuIGZpZ3VyZSBvdXQgaG93IG1hbnkKK2J5dGVzIHdlcmUgbGVmdCB0byBjb3B5OjoKKworICAgIFJBWDogMDAwMDAwMDAwMDAwMDAzMCBSQlg6IGZmZmY4ODAwM2Q0ZWE5NjggUkNYOiAwMDAwMDAwMDAwMDAwMDA5CisKK0J5IGxvb2tpbmcgYXQgdGhlIGRpc2Fzc2VtYmx5LCB3ZSBhbHNvIHNlZSB0aGF0IGBgJWVjeGBgIGlzIGJlaW5nIGxvYWRlZAord2l0aCB0aGUgdmFsdWUgYGAkMHhjYGAganVzdCBiZWZvcmUgKGZmZmZmZmZmODEwNGVkZDgpLCBzbyB3ZSBhcmUgdmVyeQorbHVja3kuIEtlZXAgaW4gbWluZCB0aGF0IHRoaXMgaXMgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zLCBub3QgYnl0ZXMuIEFuZAorc2luY2UgdGhpcyBpcyBhICJsb25nIiBvcGVyYXRpb24sIHdlIG5lZWQgdG8gbXVsdGlwbHkgYnkgNCB0byBnZXQgdGhlCitudW1iZXIgb2YgYnl0ZXMuIFNvIHRoaXMgbWVhbnMgdGhhdCB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZSB3YXMgZW5jb3VudGVyZWQKK2F0IDQgKiAoMHhjIC0gMHg5KSA9IDEyIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBvYmplY3QuCisKK1dlIGNhbiBub3cgdHJ5IHRvIGZpZ3VyZSBvdXQgd2hpY2ggZmllbGQgb2YgdGhlICJgYHN0cnVjdCBzaWdpbmZvYGAiIHRoYXQKK3dhcyBub3QgaW5pdGlhbGl6ZWQuIFRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RydWN0OjoKKworICAgIDQwIHR5cGVkZWYgc3RydWN0IHNpZ2luZm8geworICAgIDQxCSAgICAgICBpbnQgc2lfc2lnbm87CisgICAgNDIJICAgICAgIGludCBzaV9lcnJubzsKKyAgICA0MwkgICAgICAgaW50IHNpX2NvZGU7CisgICAgNDQKKyAgICA0NQkgICAgICAgdW5pb24geworICAgIC4uCisgICAgOTIJICAgICAgIH0gX3NpZmllbGRzOworICAgIDkzIH0gc2lnaW5mb190OworCitPbiA2NC1iaXQsIHRoZSBpbnQgaXMgNCBieXRlcyBsb25nLCBzbyBpdCBtdXN0IHRoZSB1bmlvbiBtZW1iZXIgdGhhdCBoYXMKK25vdCBiZWVuIGluaXRpYWxpemVkLiBXZSBjYW4gdmVyaWZ5IHRoaXMgdXNpbmcgZ2RiOjoKKworCSQgZ2RiIHZtbGludXgKKwkuLi4KKwkoZ2RiKSBwICYoKHN0cnVjdCBzaWdpbmZvICopIDApLT5fc2lmaWVsZHMKKwkkMSA9ICh1bmlvbiB7Li4ufSAqKSAweDEwCisKK0FjdHVhbGx5LCBpdCBzZWVtcyB0aGF0IHRoZSB1bmlvbiBtZW1iZXIgaXMgbG9jYXRlZCBhdCBvZmZzZXQgMHgxMCAtLSB3aGljaAorbWVhbnMgdGhhdCBnY2MgaGFzIGluc2VydGVkIDQgYnl0ZXMgb2YgcGFkZGluZyBiZXR3ZWVuIHRoZSBtZW1iZXJzIGBgc2lfY29kZWBgCithbmQgYGBfc2lmaWVsZHNgYC4gV2UgY2FuIG5vdyBnZXQgYSBmdWxsZXIgcGljdHVyZSBvZiB0aGUgbWVtb3J5IGR1bXA6OgorCisJCSBfLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT0+IHNpX2NvZGUKKwkJLwkgXy0tLS0tLS0tLS0tLS0tLS0tLS0tPT4gKHBhZGRpbmcpCisJICAgICAgIHwJLwkgXy0tLS0tLS0tLS0tLT0+IF9zaWZpZWxkcyguX2tpbGwuX3BpZCkKKwkgICAgICAgfCAgICAgICB8CS8JIF8tLS0tPT4gX3NpZmllbGRzKC5fa2lsbC5fdWlkKQorCSAgICAgICB8ICAgICAgIHwgICAgICAgfAkvCisJLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwKKwk4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4OGZmZmYwMDAwMDAwMDAwMDAwMDAwCisJIGkgaSBpIGkgdSB1IHUgdSBpIGkgaSBpIGkgaSBpIGkgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdQorCitUaGlzIGFsbG93cyB1cyB0byByZWFsaXplIGFub3RoZXIgaW1wb3J0YW50IGZhY3Q6IGBgc2lfY29kZWBgIGNvbnRhaW5zIHRoZQordmFsdWUgMHg4MC4gUmVtZW1iZXIgdGhhdCB4ODYgaXMgbGl0dGxlIGVuZGlhbiwgc28gdGhlIGZpcnN0IDQgYnl0ZXMKKyI4MDAwMDAwMCIgYXJlIHJlYWxseSB0aGUgbnVtYmVyIDB4MDAwMDAwODAuIFdpdGggYSBiaXQgb2YgcmVzZWFyY2gsIHdlCitmaW5kIHRoYXQgdGhpcyBpcyBhY3R1YWxseSB0aGUgY29uc3RhbnQgYGBTSV9LRVJORUxgYCBkZWZpbmVkIGluCitgYGluY2x1ZGUvYXNtLWdlbmVyaWMvc2lnaW5mby5oYGA6OgorCisgICAgMTQ0ICNkZWZpbmUgU0lfS0VSTkVMCTB4ODAJCS8qIHNlbnQgYnkgdGhlIGtlcm5lbCBmcm9tIHNvbWV3aGVyZQkgKi8KKworVGhpcyBtYWNybyBpcyB1c2VkIGluIGV4YWN0bHkgb25lIHBsYWNlIGluIHRoZSB4ODYga2VybmVsOiBJbiBgYHNlbmRfc2lnbmFsKClgYAoraW4gYGBrZXJuZWwvc2lnbmFsLmNgYDo6CisKKyAgICA4MTYgc3RhdGljIGludCBzZW5kX3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbywgc3RydWN0IHRhc2tfc3RydWN0ICp0LAorICAgIDgxNwkJCQlpbnQgZ3JvdXApCisgICAgODE4IHsKKyAgICAuLi4KKyAgICA4MjgJCXBlbmRpbmcgPSBncm91cCA/ICZ0LT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nIDogJnQtPnBlbmRpbmc7CisgICAgLi4uCisgICAgODUxCQlxID0gX19zaWdxdWV1ZV9hbGxvYyh0LCBHRlBfQVRPTUlDLCAoc2lnIDwgU0lHUlRNSU4gJiYKKyAgICA4NTIJCQkJCQkgICAgIChpc19zaV9zcGVjaWFsKGluZm8pIHx8CisgICAgODUzCQkJCQkJICAgICAgaW5mby0+c2lfY29kZSA+PSAwKSkpOworICAgIDg1NAkJaWYgKHEpIHsKKyAgICA4NTUJCQlsaXN0X2FkZF90YWlsKCZxLT5saXN0LCAmcGVuZGluZy0+bGlzdCk7CisgICAgODU2CQkJc3dpdGNoICgodW5zaWduZWQgbG9uZykgaW5mbykgeworICAgIC4uLgorICAgIDg2NQkJCWNhc2UgKHVuc2lnbmVkIGxvbmcpIFNFTkRfU0lHX1BSSVY6CisgICAgODY2CQkJCXEtPmluZm8uc2lfc2lnbm8gPSBzaWc7CisgICAgODY3CQkJCXEtPmluZm8uc2lfZXJybm8gPSAwOworICAgIDg2OAkJCQlxLT5pbmZvLnNpX2NvZGUgPSBTSV9LRVJORUw7CisgICAgODY5CQkJCXEtPmluZm8uc2lfcGlkID0gMDsKKyAgICA4NzAJCQkJcS0+aW5mby5zaV91aWQgPSAwOworICAgIDg3MQkJCQlicmVhazsKKyAgICAuLi4KKyAgICA4OTAgfQorCitOb3Qgb25seSBkb2VzIHRoaXMgbWF0Y2ggd2l0aCB0aGUgYGAuc2lfY29kZWBgIG1lbWJlciwgaXQgYWxzbyBtYXRjaGVzIHRoZSBwbGFjZQord2UgZm91bmQgZWFybGllciB3aGVuIGxvb2tpbmcgZm9yIHdoZXJlIHNpZ2luZm9fdCBvYmplY3RzIGFyZSBlbnF1ZXVlZCBvbiB0aGUKK2Bgc2hhcmVkX3BlbmRpbmdgYCBsaXN0LgorCitTbyB0byBzdW0gdXA6IEl0IHNlZW1zIHRoYXQgaXQgaXMgdGhlIHBhZGRpbmcgaW50cm9kdWNlZCBieSB0aGUgY29tcGlsZXIKK2JldHdlZW4gdHdvIHN0cnVjdCBmaWVsZHMgdGhhdCBpcyB1bmluaXRpYWxpemVkLCBhbmQgdGhpcyBnZXRzIHJlcG9ydGVkIHdoZW4KK3dlIGRvIGEgYGBtZW1jcHkoKWBgIG9uIHRoZSBzdHJ1Y3QuIFRoaXMgbWVhbnMgdGhhdCB3ZSBoYXZlIGlkZW50aWZpZWQgYSBmYWxzZQorcG9zaXRpdmUgd2FybmluZy4KKworTm9ybWFsbHksIGttZW1jaGVjayB3aWxsIG5vdCByZXBvcnQgdW5pbml0aWFsaXplZCBhY2Nlc3NlcyBpbiBgYG1lbWNweSgpYGAgY2FsbHMKK3doZW4gYm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgYXJlIHRyYWNrZWQuIChJbnN0ZWFkLCB3ZSBjb3B5Cit0aGUgc2hhZG93IGJ5dGVtYXAgYXMgd2VsbCkuIEluIHRoaXMgY2FzZSwgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgY2xlYXJseQord2FzIG5vdCB0cmFja2VkLiBXZSBjYW4gZGlnIGEgbGl0dGxlIGRlZXBlciBpbnRvIHRoZSBzdGFjayB0cmFjZSBmcm9tIGFib3ZlOjoKKworCWFyY2gveDg2L2tlcm5lbC9zaWduYWwuYzo4MDUKKwlhcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmM6ODcxCisJYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlM6Njk0CisKK0FuZCB3ZSBjbGVhcmx5IHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBzaWdpbmZvIG9iamVjdCBpcyBsb2NhdGVkIG9uIHRoZQorc3RhY2s6OgorCisgICAgNzgyIHN0YXRpYyB2b2lkIGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyAgICA3ODMgeworICAgIDc4NAkJc3RydWN0IGtfc2lnYWN0aW9uIGthOworICAgIDc4NQkJc2lnaW5mb190IGluZm87CisgICAgLi4uCisgICAgODA0CQlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKKyAgICAuLi4KKyAgICA4NTQgfQorCitBbmQgdGhpcyBgYCZpbmZvYGAgaXMgd2hhdCBldmVudHVhbGx5IGdldHMgcGFzc2VkIHRvIGBgY29weV9zaWdpbmZvKClgYCBhcyB0aGUKK2Rlc3RpbmF0aW9uIGFyZ3VtZW50LgorCitOb3csIGV2ZW4gdGhvdWdoIHdlIGRpZG4ndCBmaW5kIGFuIGFjdHVhbCBlcnJvciBoZXJlLCB0aGUgZXhhbXBsZSBpcyBzdGlsbCBhCitnb29kIG9uZSwgYmVjYXVzZSBpdCBzaG93cyBob3cgb25lIHdvdWxkIGdvIGFib3V0IHRvIGZpbmQgb3V0IHdoYXQgdGhlIHJlcG9ydAord2FzIGFsbCBhYm91dC4KKworCitBbm5vdGF0aW5nIGZhbHNlIHBvc2l0aXZlcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlcmUgYXJlIGEgZmV3IGRpZmZlcmVudCB3YXlzIHRvIG1ha2UgYW5ub3RhdGlvbnMgaW4gdGhlIHNvdXJjZSBjb2RlIHRoYXQKK3dpbGwga2VlcCBrbWVtY2hlY2sgZnJvbSBjaGVja2luZyBhbmQgcmVwb3J0aW5nIGNlcnRhaW4gYWxsb2NhdGlvbnMuIEhlcmUKK3RoZXkgYXJlOgorCistIGBgX19HRlBfTk9UUkFDS19GQUxTRV9QT1NJVElWRWBgCisJVGhpcyBmbGFnIGNhbiBiZSBwYXNzZWQgdG8gYGBrbWFsbG9jKClgYCBvciBgYGttZW1fY2FjaGVfYWxsb2MoKWBgCisJKHRoZXJlZm9yZSBhbHNvIHRvIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGVuZCB1cCBjYWxsaW5nIG9uZSBvZgorCXRoZXNlKSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBhbGxvY2F0aW9uIHNob3VsZCBub3QgYmUgdHJhY2tlZAorCWJlY2F1c2UgaXQgd291bGQgbGVhZCB0byBhIGZhbHNlIHBvc2l0aXZlIHJlcG9ydC4gVGhpcyBpcyBhICJiaWcKKwloYW1tZXIiIHdheSBvZiBzaWxlbmNpbmcga21lbWNoZWNrOyBhZnRlciBhbGwsIGV2ZW4gaWYgdGhlIGZhbHNlCisJcG9zaXRpdmUgcGVydGFpbnMgdG8gcGFydGljdWxhciBmaWVsZCBpbiBhIHN0cnVjdCwgZm9yIGV4YW1wbGUsIHdlCisJd2lsbCBub3cgbG9zZSB0aGUgYWJpbGl0eSB0byBmaW5kIChyZWFsKSBlcnJvcnMgaW4gb3RoZXIgcGFydHMgb2YKKwl0aGUgc2FtZSBzdHJ1Y3QuCisKKwlFeGFtcGxlOjoKKworCSAgICAvKiBObyB3YXJuaW5ncyB3aWxsIGV2ZXIgdHJpZ2dlciBvbiBhY2Nlc3NpbmcgYW55IHBhcnQgb2YgeCAqLworCSAgICB4ID0ga21hbGxvYyhzaXplb2YgKngsIEdGUF9LRVJORUwgfCBfX0dGUF9OT1RSQUNLX0ZBTFNFX1BPU0lUSVZFKTsKKworLSBgYGttZW1jaGVja19iaXRmaWVsZF9iZWdpbihuYW1lKWBgL2Bga21lbWNoZWNrX2JpdGZpZWxkX2VuZChuYW1lKWBgIGFuZAorCWBga21lbWNoZWNrX2Fubm90YXRlX2JpdGZpZWxkKHB0ciwgbmFtZSlgYAorCVRoZSBmaXJzdCB0d28gb2YgdGhlc2UgdGhyZWUgbWFjcm9zIGNhbiBiZSB1c2VkIGluc2lkZSBzdHJ1Y3QKKwlkZWZpbml0aW9ucyB0byBzaWduYWwsIHJlc3BlY3RpdmVseSwgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEKKwliaXRmaWVsZC4gQWRkaXRpb25hbGx5LCB0aGlzIHdpbGwgYXNzaWduIHRoZSBiaXRmaWVsZCBhIG5hbWUsIHdoaWNoCisJaXMgZ2l2ZW4gYXMgYW4gYXJndW1lbnQgdG8gdGhlIG1hY3Jvcy4KKworCUhhdmluZyB1c2VkIHRoZXNlIG1hcmtlcnMsIG9uZSBjYW4gbGF0ZXIgdXNlCisJa21lbWNoZWNrX2Fubm90YXRlX2JpdGZpZWxkKCkgYXQgdGhlIHBvaW50IG9mIGFsbG9jYXRpb24sIHRvIGluZGljYXRlCisJd2hpY2ggcGFydHMgb2YgdGhlIGFsbG9jYXRpb24gaXMgcGFydCBvZiBhIGJpdGZpZWxkLgorCisJRXhhbXBsZTo6CisKKwkgICAgc3RydWN0IGZvbyB7CisJCWludCB4OworCisJCWttZW1jaGVja19iaXRmaWVsZF9iZWdpbihmbGFncyk7CisJCWludCBmbGFnX2E6MTsKKwkJaW50IGZsYWdfYjoxOworCQlrbWVtY2hlY2tfYml0ZmllbGRfZW5kKGZsYWdzKTsKKworCQlpbnQgeTsKKwkgICAgfTsKKworCSAgICBzdHJ1Y3QgZm9vICp4ID0ga21hbGxvYyhzaXplb2YgKngpOworCisJICAgIC8qIE5vIHdhcm5pbmdzIHdpbGwgdHJpZ2dlciBvbiBhY2Nlc3NpbmcgdGhlIGJpdGZpZWxkIG9mIHggKi8KKwkgICAga21lbWNoZWNrX2Fubm90YXRlX2JpdGZpZWxkKHgsIGZsYWdzKTsKKworCU5vdGUgdGhhdCBgYGttZW1jaGVja19hbm5vdGF0ZV9iaXRmaWVsZCgpYGAgY2FuIGJlIHVzZWQgZXZlbiBiZWZvcmUgdGhlCisJcmV0dXJuIHZhbHVlIG9mIGBga21hbGxvYygpYGAgaXMgY2hlY2tlZCAtLSBpbiBvdGhlciB3b3JkcywgcGFzc2luZyBOVUxMCisJYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGxlZ2FsIChhbmQgd2lsbCBkbyBub3RoaW5nKS4KKworCitSZXBvcnRpbmcgZXJyb3JzCistLS0tLS0tLS0tLS0tLS0tCisKK0FzIHdlIGhhdmUgc2Vlbiwga21lbWNoZWNrIHdpbGwgcHJvZHVjZSBmYWxzZSBwb3NpdGl2ZSByZXBvcnRzLiBUaGVyZWZvcmUsIGl0CitpcyBub3QgdmVyeSB3aXNlIHRvIGJsaW5kbHkgcG9zdCBrbWVtY2hlY2sgd2FybmluZ3MgdG8gbWFpbGluZyBsaXN0cyBhbmQKK21haW50YWluZXJzLiBJbnN0ZWFkLCBJIGVuY291cmFnZSBtYWludGFpbmVycyBhbmQgZGV2ZWxvcGVycyB0byBmaW5kIGVycm9ycworaW4gdGhlaXIgb3duIGNvZGUuIElmIHlvdSBnZXQgYSB3YXJuaW5nLCB5b3UgY2FuIHRyeSB0byB3b3JrIGFyb3VuZCBpdCwgdHJ5Cit0byBmaWd1cmUgb3V0IGlmIGl0J3MgYSByZWFsIGVycm9yIG9yIG5vdCwgb3Igc2ltcGx5IGlnbm9yZSBpdC4gTW9zdAorZGV2ZWxvcGVycyBrbm93IHRoZWlyIG93biBjb2RlIGFuZCB3aWxsIHF1aWNrbHkgYW5kIGVmZmljaWVudGx5IGRldGVybWluZSB0aGUKK3Jvb3QgY2F1c2Ugb2YgYSBrbWVtY2hlY2sgcmVwb3J0LiBUaGlzIGlzIHRoZXJlZm9yZSBhbHNvIHRoZSBtb3N0IGVmZmljaWVudAord2F5IHRvIHdvcmsgd2l0aCBrbWVtY2hlY2suCisKK1RoYXQgc2FpZCwgd2UgKHRoZSBrbWVtY2hlY2sgbWFpbnRhaW5lcnMpIHdpbGwgYWx3YXlzIGJlIG9uIHRoZSBsb29rb3V0IGZvcgorZmFsc2UgcG9zaXRpdmVzIHRoYXQgd2UgY2FuIGFubm90YXRlIGFuZCBzaWxlbmNlLiBTbyB3aGF0ZXZlciB5b3UgZmluZCwKK3BsZWFzZSBkcm9wIHVzIGEgbm90ZSBwcml2YXRlbHkhIEtlcm5lbCBjb25maWdzIGFuZCBzdGVwcyB0byByZXByb2R1Y2UgKGlmCithdmFpbGFibGUpIGFyZSBvZiBjb3Vyc2UgYSBncmVhdCBoZWxwIHRvby4KKworSGFwcHkgaGFja2luZyEKKworCitUZWNobmljYWwgZGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitrbWVtY2hlY2sgd29ya3MgYnkgbWFya2luZyBtZW1vcnkgcGFnZXMgbm9uLXByZXNlbnQuIFRoaXMgbWVhbnMgdGhhdCB3aGVuZXZlcgorc29tZWJvZHkgYXR0ZW1wdHMgdG8gYWNjZXNzIHRoZSBwYWdlLCBhIHBhZ2UgZmF1bHQgaXMgZ2VuZXJhdGVkLiBUaGUgcGFnZQorZmF1bHQgaGFuZGxlciBub3RpY2VzIHRoYXQgdGhlIHBhZ2Ugd2FzIGluIGZhY3Qgb25seSBoaWRkZW4sIGFuZCBzbyBpdCBjYWxscworb24gdGhlIGttZW1jaGVjayBjb2RlIHRvIG1ha2UgZnVydGhlciBpbnZlc3RpZ2F0aW9ucy4KKworV2hlbiB0aGUgaW52ZXN0aWdhdGlvbnMgYXJlIGNvbXBsZXRlZCwga21lbWNoZWNrICJzaG93cyIgdGhlIHBhZ2UgYnkgbWFya2luZworaXQgcHJlc2VudCAoYXMgaXQgd291bGQgYmUgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMpLiBUaGlzIHdheSwgdGhlCitpbnRlcnJ1cHRlZCBjb2RlIGNhbiBjb250aW51ZSBhcyB1c3VhbC4KKworQnV0IGFmdGVyIHRoZSBpbnN0cnVjdGlvbiBoYXMgYmVlbiBleGVjdXRlZCwgd2Ugc2hvdWxkIGhpZGUgdGhlIHBhZ2UgYWdhaW4sIHNvCit0aGF0IHdlIGNhbiBjYXRjaCB0aGUgbmV4dCBhY2Nlc3MgdG9vISBOb3cga21lbWNoZWNrIG1ha2VzIHVzZSBvZiBhIGRlYnVnZ2luZworZmVhdHVyZSBvZiB0aGUgcHJvY2Vzc29yLCBuYW1lbHkgc2luZ2xlLXN0ZXBwaW5nLiBXaGVuIHRoZSBwcm9jZXNzb3IgaGFzCitmaW5pc2hlZCB0aGUgb25lIGluc3RydWN0aW9uIHRoYXQgZ2VuZXJhdGVkIHRoZSBtZW1vcnkgYWNjZXNzLCBhIGRlYnVnCitleGNlcHRpb24gaXMgcmFpc2VkLiBGcm9tIGhlcmUsIHdlIHNpbXBseSBoaWRlIHRoZSBwYWdlIGFnYWluIGFuZCBjb250aW51ZQorZXhlY3V0aW9uLCB0aGlzIHRpbWUgd2l0aCB0aGUgc2luZ2xlLXN0ZXBwaW5nIGZlYXR1cmUgdHVybmVkIG9mZi4KKwora21lbWNoZWNrIHJlcXVpcmVzIHNvbWUgYXNzaXN0YW5jZSBmcm9tIHRoZSBtZW1vcnkgYWxsb2NhdG9yIGluIG9yZGVyIHRvIHdvcmsuCitUaGUgbWVtb3J5IGFsbG9jYXRvciBuZWVkcyB0bworCisgIDEuIFRlbGwga21lbWNoZWNrIGFib3V0IG5ld2x5IGFsbG9jYXRlZCBwYWdlcyBhbmQgcGFnZXMgdGhhdCBhcmUgYWJvdXQgdG8KKyAgICAgYmUgZnJlZWQuIFRoaXMgYWxsb3dzIGttZW1jaGVjayB0byBzZXQgdXAgYW5kIHRlYXIgZG93biB0aGUgc2hhZG93IG1lbW9yeQorICAgICBmb3IgdGhlIHBhZ2VzIGluIHF1ZXN0aW9uLiBUaGUgc2hhZG93IG1lbW9yeSBzdG9yZXMgdGhlIHN0YXR1cyBvZiBlYWNoCisgICAgIGJ5dGUgaW4gdGhlIGFsbG9jYXRpb24gcHJvcGVyLCBlLmcuIHdoZXRoZXIgaXQgaXMgaW5pdGlhbGl6ZWQgb3IKKyAgICAgdW5pbml0aWFsaXplZC4KKworICAyLiBUZWxsIGttZW1jaGVjayB3aGljaCBwYXJ0cyBvZiBtZW1vcnkgc2hvdWxkIGJlIG1hcmtlZCB1bmluaXRpYWxpemVkLgorICAgICBUaGVyZSBhcmUgYWN0dWFsbHkgYSBmZXcgbW9yZSBzdGF0ZXMsIHN1Y2ggYXMgIm5vdCB5ZXQgYWxsb2NhdGVkIiBhbmQKKyAgICAgInJlY2VudGx5IGZyZWVkIi4KKworSWYgYSBzbGFiIGNhY2hlIGlzIHNldCB1cCB1c2luZyB0aGUgU0xBQl9OT1RSQUNLIGZsYWcsIGl0IHdpbGwgbmV2ZXIgcmV0dXJuCittZW1vcnkgdGhhdCBjYW4gdGFrZSBwYWdlIGZhdWx0cyBiZWNhdXNlIG9mIGttZW1jaGVjay4KKworSWYgYSBzbGFiIGNhY2hlIGlzIE5PVCBzZXQgdXAgdXNpbmcgdGhlIFNMQUJfTk9UUkFDSyBmbGFnLCBjYWxsZXJzIGNhbiBzdGlsbAorcmVxdWVzdCBtZW1vcnkgd2l0aCB0aGUgX19HRlBfTk9UUkFDSyBvciBfX0dGUF9OT1RSQUNLX0ZBTFNFX1BPU0lUSVZFIGZsYWdzLgorVGhpcyBkb2VzIG5vdCBwcmV2ZW50IHRoZSBwYWdlIGZhdWx0cyBmcm9tIG9jY3VycmluZywgaG93ZXZlciwgYnV0IG1hcmtzIHRoZQorb2JqZWN0IGluIHF1ZXN0aW9uIGFzIGJlaW5nIGluaXRpYWxpemVkIHNvIHRoYXQgbm8gd2FybmluZ3Mgd2lsbCBldmVyIGJlCitwcm9kdWNlZCBmb3IgdGhpcyBvYmplY3QuCisKK0N1cnJlbnRseSwgdGhlIFNMQUIgYW5kIFNMVUIgYWxsb2NhdG9ycyBhcmUgc3VwcG9ydGVkIGJ5IGttZW1jaGVjay4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2ttZW1sZWFrLnJzdCBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2ttZW1sZWFrLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzg4NzIyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva21lbWxlYWsucnN0CkBAIC0wLDAgKzEsMjEwIEBACitLZXJuZWwgTWVtb3J5IExlYWsgRGV0ZWN0b3IKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitLbWVtbGVhayBwcm92aWRlcyBhIHdheSBvZiBkZXRlY3RpbmcgcG9zc2libGUga2VybmVsIG1lbW9yeSBsZWFrcyBpbiBhCit3YXkgc2ltaWxhciB0byBhIHRyYWNpbmcgZ2FyYmFnZSBjb2xsZWN0b3IKKyhodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HYXJiYWdlX2NvbGxlY3Rpb25fJTI4Y29tcHV0ZXJfc2NpZW5jZSUyOSNUcmFjaW5nX2dhcmJhZ2VfY29sbGVjdG9ycyksCit3aXRoIHRoZSBkaWZmZXJlbmNlIHRoYXQgdGhlIG9ycGhhbiBvYmplY3RzIGFyZSBub3QgZnJlZWQgYnV0IG9ubHkKK3JlcG9ydGVkIHZpYSAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhay4gQSBzaW1pbGFyIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZQorVmFsZ3JpbmQgdG9vbCAoYGBtZW1jaGVjayAtLWxlYWstY2hlY2tgYCkgdG8gZGV0ZWN0IHRoZSBtZW1vcnkgbGVha3MgaW4KK3VzZXItc3BhY2UgYXBwbGljYXRpb25zLgorS21lbWxlYWsgaXMgc3VwcG9ydGVkIG9uIHg4NiwgYXJtLCBwb3dlcnBjLCBzcGFyYywgc2gsIG1pY3JvYmxhemUsIHBwYywgbWlwcywgczM5MCwgbWV0YWcgYW5kIHRpbGUuCisKK1VzYWdlCistLS0tLQorCitDT05GSUdfREVCVUdfS01FTUxFQUsgaW4gIktlcm5lbCBoYWNraW5nIiBoYXMgdG8gYmUgZW5hYmxlZC4gQSBrZXJuZWwKK3RocmVhZCBzY2FucyB0aGUgbWVtb3J5IGV2ZXJ5IDEwIG1pbnV0ZXMgKGJ5IGRlZmF1bHQpIGFuZCBwcmludHMgdGhlCitudW1iZXIgb2YgbmV3IHVucmVmZXJlbmNlZCBvYmplY3RzIGZvdW5kLiBUbyBkaXNwbGF5IHRoZSBkZXRhaWxzIG9mIGFsbAordGhlIHBvc3NpYmxlIG1lbW9yeSBsZWFrczo6CisKKyAgIyBtb3VudCAtdCBkZWJ1Z2ZzIG5vZGV2IC9zeXMva2VybmVsL2RlYnVnLworICAjIGNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhaworCitUbyB0cmlnZ2VyIGFuIGludGVybWVkaWF0ZSBtZW1vcnkgc2Nhbjo6CisKKyAgIyBlY2hvIHNjYW4gPiAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhaworCitUbyBjbGVhciB0aGUgbGlzdCBvZiBhbGwgY3VycmVudCBwb3NzaWJsZSBtZW1vcnkgbGVha3M6OgorCisgICMgZWNobyBjbGVhciA+IC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCisKK05ldyBsZWFrcyB3aWxsIHRoZW4gY29tZSB1cCB1cG9uIHJlYWRpbmcgYGAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVha2BgCithZ2Fpbi4KKworTm90ZSB0aGF0IHRoZSBvcnBoYW4gb2JqZWN0cyBhcmUgbGlzdGVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgYWxsb2NhdGVkCithbmQgb25lIG9iamVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0IG1heSBjYXVzZSBvdGhlciBzdWJzZXF1ZW50CitvYmplY3RzIHRvIGJlIHJlcG9ydGVkIGFzIG9ycGhhbi4KKworTWVtb3J5IHNjYW5uaW5nIHBhcmFtZXRlcnMgY2FuIGJlIG1vZGlmaWVkIGF0IHJ1bi10aW1lIGJ5IHdyaXRpbmcgdG8gdGhlCitgYC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrYGAgZmlsZS4gVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBzdXBwb3J0ZWQ6CisKKy0gb2ZmCisgICAgZGlzYWJsZSBrbWVtbGVhayAoaXJyZXZlcnNpYmxlKQorLSBzdGFjaz1vbgorICAgIGVuYWJsZSB0aGUgdGFzayBzdGFja3Mgc2Nhbm5pbmcgKGRlZmF1bHQpCistIHN0YWNrPW9mZgorICAgIGRpc2FibGUgdGhlIHRhc2tzIHN0YWNrcyBzY2FubmluZworLSBzY2FuPW9uCisgICAgc3RhcnQgdGhlIGF1dG9tYXRpYyBtZW1vcnkgc2Nhbm5pbmcgdGhyZWFkIChkZWZhdWx0KQorLSBzY2FuPW9mZgorICAgIHN0b3AgdGhlIGF1dG9tYXRpYyBtZW1vcnkgc2Nhbm5pbmcgdGhyZWFkCistIHNjYW49PHNlY3M+CisgICAgc2V0IHRoZSBhdXRvbWF0aWMgbWVtb3J5IHNjYW5uaW5nIHBlcmlvZCBpbiBzZWNvbmRzCisgICAgKGRlZmF1bHQgNjAwLCAwIHRvIHN0b3AgdGhlIGF1dG9tYXRpYyBzY2FubmluZykKKy0gc2NhbgorICAgIHRyaWdnZXIgYSBtZW1vcnkgc2NhbgorLSBjbGVhcgorICAgIGNsZWFyIGxpc3Qgb2YgY3VycmVudCBtZW1vcnkgbGVhayBzdXNwZWN0cywgZG9uZSBieQorICAgIG1hcmtpbmcgYWxsIGN1cnJlbnQgcmVwb3J0ZWQgdW5yZWZlcmVuY2VkIG9iamVjdHMgZ3JleSwKKyAgICBvciBmcmVlIGFsbCBrbWVtbGVhayBvYmplY3RzIGlmIGttZW1sZWFrIGhhcyBiZWVuIGRpc2FibGVkLgorLSBkdW1wPTxhZGRyPgorICAgIGR1bXAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBmb3VuZCBhdCA8YWRkcj4KKworS21lbWxlYWsgY2FuIGFsc28gYmUgZGlzYWJsZWQgYXQgYm9vdC10aW1lIGJ5IHBhc3NpbmcgYGBrbWVtbGVhaz1vZmZgYCBvbgordGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuCisKK01lbW9yeSBtYXkgYmUgYWxsb2NhdGVkIG9yIGZyZWVkIGJlZm9yZSBrbWVtbGVhayBpcyBpbml0aWFsaXNlZCBhbmQKK3RoZXNlIGFjdGlvbnMgYXJlIHN0b3JlZCBpbiBhbiBlYXJseSBsb2cgYnVmZmVyLiBUaGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlcgoraXMgY29uZmlndXJlZCB2aWEgdGhlIENPTkZJR19ERUJVR19LTUVNTEVBS19FQVJMWV9MT0dfU0laRSBvcHRpb24uCisKK0lmIENPTkZJR19ERUJVR19LTUVNTEVBS19ERUZBVUxUX09GRiBhcmUgZW5hYmxlZCwgdGhlIGttZW1sZWFrIGlzCitkaXNhYmxlZCBieSBkZWZhdWx0LiBQYXNzaW5nIGBga21lbWxlYWs9b25gYCBvbiB0aGUga2VybmVsIGNvbW1hbmQKK2xpbmUgZW5hYmxlcyB0aGUgZnVuY3Rpb24uIAorCitCYXNpYyBBbGdvcml0aG0KKy0tLS0tLS0tLS0tLS0tLQorCitUaGUgbWVtb3J5IGFsbG9jYXRpb25zIHZpYSA6YzpmdW5jOmBrbWFsbG9jYCwgOmM6ZnVuYzpgdm1hbGxvY2AsCis6YzpmdW5jOmBrbWVtX2NhY2hlX2FsbG9jYCBhbmQKK2ZyaWVuZHMgYXJlIHRyYWNlZCBhbmQgdGhlIHBvaW50ZXJzLCB0b2dldGhlciB3aXRoIGFkZGl0aW9uYWwKK2luZm9ybWF0aW9uIGxpa2Ugc2l6ZSBhbmQgc3RhY2sgdHJhY2UsIGFyZSBzdG9yZWQgaW4gYSByYnRyZWUuCitUaGUgY29ycmVzcG9uZGluZyBmcmVlaW5nIGZ1bmN0aW9uIGNhbGxzIGFyZSB0cmFja2VkIGFuZCB0aGUgcG9pbnRlcnMKK3JlbW92ZWQgZnJvbSB0aGUga21lbWxlYWsgZGF0YSBzdHJ1Y3R1cmVzLgorCitBbiBhbGxvY2F0ZWQgYmxvY2sgb2YgbWVtb3J5IGlzIGNvbnNpZGVyZWQgb3JwaGFuIGlmIG5vIHBvaW50ZXIgdG8gaXRzCitzdGFydCBhZGRyZXNzIG9yIHRvIGFueSBsb2NhdGlvbiBpbnNpZGUgdGhlIGJsb2NrIGNhbiBiZSBmb3VuZCBieQorc2Nhbm5pbmcgdGhlIG1lbW9yeSAoaW5jbHVkaW5nIHNhdmVkIHJlZ2lzdGVycykuIFRoaXMgbWVhbnMgdGhhdCB0aGVyZQorbWlnaHQgYmUgbm8gd2F5IGZvciB0aGUga2VybmVsIHRvIHBhc3MgdGhlIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZAorYmxvY2sgdG8gYSBmcmVlaW5nIGZ1bmN0aW9uIGFuZCB0aGVyZWZvcmUgdGhlIGJsb2NrIGlzIGNvbnNpZGVyZWQgYQorbWVtb3J5IGxlYWsuCisKK1RoZSBzY2FubmluZyBhbGdvcml0aG0gc3RlcHM6CisKKyAgMS4gbWFyayBhbGwgb2JqZWN0cyBhcyB3aGl0ZSAocmVtYWluaW5nIHdoaXRlIG9iamVjdHMgd2lsbCBsYXRlciBiZQorICAgICBjb25zaWRlcmVkIG9ycGhhbikKKyAgMi4gc2NhbiB0aGUgbWVtb3J5IHN0YXJ0aW5nIHdpdGggdGhlIGRhdGEgc2VjdGlvbiBhbmQgc3RhY2tzLCBjaGVja2luZworICAgICB0aGUgdmFsdWVzIGFnYWluc3QgdGhlIGFkZHJlc3NlcyBzdG9yZWQgaW4gdGhlIHJidHJlZS4gSWYKKyAgICAgYSBwb2ludGVyIHRvIGEgd2hpdGUgb2JqZWN0IGlzIGZvdW5kLCB0aGUgb2JqZWN0IGlzIGFkZGVkIHRvIHRoZQorICAgICBncmF5IGxpc3QKKyAgMy4gc2NhbiB0aGUgZ3JheSBvYmplY3RzIGZvciBtYXRjaGluZyBhZGRyZXNzZXMgKHNvbWUgd2hpdGUgb2JqZWN0cworICAgICBjYW4gYmVjb21lIGdyYXkgYW5kIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGdyYXkgbGlzdCkgdW50aWwgdGhlCisgICAgIGdyYXkgc2V0IGlzIGZpbmlzaGVkCisgIDQuIHRoZSByZW1haW5pbmcgd2hpdGUgb2JqZWN0cyBhcmUgY29uc2lkZXJlZCBvcnBoYW4gYW5kIHJlcG9ydGVkIHZpYQorICAgICAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhaworCitTb21lIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2tzIGhhdmUgcG9pbnRlcnMgc3RvcmVkIGluIHRoZSBrZXJuZWwncworaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGFuZCB0aGV5IGNhbm5vdCBiZSBkZXRlY3RlZCBhcyBvcnBoYW5zLiBUbworYXZvaWQgdGhpcywga21lbWxlYWsgY2FuIGFsc28gc3RvcmUgdGhlIG51bWJlciBvZiB2YWx1ZXMgcG9pbnRpbmcgdG8gYW4KK2FkZHJlc3MgaW5zaWRlIHRoZSBibG9jayBhZGRyZXNzIHJhbmdlIHRoYXQgbmVlZCB0byBiZSBmb3VuZCBzbyB0aGF0IHRoZQorYmxvY2sgaXMgbm90IGNvbnNpZGVyZWQgYSBsZWFrLiBPbmUgZXhhbXBsZSBpcyBfX3ZtYWxsb2MoKS4KKworVGVzdGluZyBzcGVjaWZpYyBzZWN0aW9ucyB3aXRoIGttZW1sZWFrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVXBvbiBpbml0aWFsIGJvb3R1cCB5b3VyIC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrIG91dHB1dCBwYWdlIG1heSBiZQorcXVpdGUgZXh0ZW5zaXZlLiBUaGlzIGNhbiBhbHNvIGJlIHRoZSBjYXNlIGlmIHlvdSBoYXZlIHZlcnkgYnVnZ3kgY29kZQord2hlbiBkb2luZyBkZXZlbG9wbWVudC4gVG8gd29yayBhcm91bmQgdGhlc2Ugc2l0dWF0aW9ucyB5b3UgY2FuIHVzZSB0aGUKKydjbGVhcicgY29tbWFuZCB0byBjbGVhciBhbGwgcmVwb3J0ZWQgdW5yZWZlcmVuY2VkIG9iamVjdHMgZnJvbSB0aGUKKy9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrIG91dHB1dC4gQnkgaXNzdWluZyBhICdzY2FuJyBhZnRlciBhICdjbGVhcicKK3lvdSBjYW4gZmluZCBuZXcgdW5yZWZlcmVuY2VkIG9iamVjdHM7IHRoaXMgc2hvdWxkIGhlbHAgd2l0aCB0ZXN0aW5nCitzcGVjaWZpYyBzZWN0aW9ucyBvZiBjb2RlLgorCitUbyB0ZXN0IGEgY3JpdGljYWwgc2VjdGlvbiBvbiBkZW1hbmQgd2l0aCBhIGNsZWFuIGttZW1sZWFrIGRvOjoKKworICAjIGVjaG8gY2xlYXIgPiAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhaworICAuLi4gdGVzdCB5b3VyIGtlcm5lbCBvciBtb2R1bGVzIC4uLgorICAjIGVjaG8gc2NhbiA+IC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCisKK1RoZW4gYXMgdXN1YWwgdG8gZ2V0IHlvdXIgcmVwb3J0IHdpdGg6OgorCisgICMgY2F0IC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCisKK0ZyZWVpbmcga21lbWxlYWsgaW50ZXJuYWwgb2JqZWN0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIGFsbG93IGFjY2VzcyB0byBwcmV2aW91c2x5IGZvdW5kIG1lbW9yeSBsZWFrcyBhZnRlciBrbWVtbGVhayBoYXMgYmVlbgorZGlzYWJsZWQgYnkgdGhlIHVzZXIgb3IgZHVlIHRvIGFuIGZhdGFsIGVycm9yLCBpbnRlcm5hbCBrbWVtbGVhayBvYmplY3RzCit3b24ndCBiZSBmcmVlZCB3aGVuIGttZW1sZWFrIGlzIGRpc2FibGVkLCBhbmQgdGhvc2Ugb2JqZWN0cyBtYXkgb2NjdXB5CithIGxhcmdlIHBhcnQgb2YgcGh5c2ljYWwgbWVtb3J5LgorCitJbiB0aGlzIHNpdHVhdGlvbiwgeW91IG1heSByZWNsYWltIG1lbW9yeSB3aXRoOjoKKworICAjIGVjaG8gY2xlYXIgPiAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhaworCitLbWVtbGVhayBBUEkKKy0tLS0tLS0tLS0tLQorCitTZWUgdGhlIGluY2x1ZGUvbGludXgva21lbWxlYWsuaCBoZWFkZXIgZm9yIHRoZSBmdW5jdGlvbnMgcHJvdG90eXBlLgorCistIGBga21lbWxlYWtfaW5pdGBgCQkgLSBpbml0aWFsaXplIGttZW1sZWFrCistIGBga21lbWxlYWtfYWxsb2NgYAkJIC0gbm90aWZ5IG9mIGEgbWVtb3J5IGJsb2NrIGFsbG9jYXRpb24KKy0gYGBrbWVtbGVha19hbGxvY19wZXJjcHVgYAkgLSBub3RpZnkgb2YgYSBwZXJjcHUgbWVtb3J5IGJsb2NrIGFsbG9jYXRpb24KKy0gYGBrbWVtbGVha19mcmVlYGAJCSAtIG5vdGlmeSBvZiBhIG1lbW9yeSBibG9jayBmcmVlaW5nCistIGBga21lbWxlYWtfZnJlZV9wYXJ0YGAJIC0gbm90aWZ5IG9mIGEgcGFydGlhbCBtZW1vcnkgYmxvY2sgZnJlZWluZworLSBgYGttZW1sZWFrX2ZyZWVfcGVyY3B1YGAJIC0gbm90aWZ5IG9mIGEgcGVyY3B1IG1lbW9yeSBibG9jayBmcmVlaW5nCistIGBga21lbWxlYWtfdXBkYXRlX3RyYWNlYGAJIC0gdXBkYXRlIG9iamVjdCBhbGxvY2F0aW9uIHN0YWNrIHRyYWNlCistIGBga21lbWxlYWtfbm90X2xlYWtgYAkgLSBtYXJrIGFuIG9iamVjdCBhcyBub3QgYSBsZWFrCistIGBga21lbWxlYWtfaWdub3JlYGAJCSAtIGRvIG5vdCBzY2FuIG9yIHJlcG9ydCBhbiBvYmplY3QgYXMgbGVhaworLSBgYGttZW1sZWFrX3NjYW5fYXJlYWBgCSAtIGFkZCBzY2FuIGFyZWFzIGluc2lkZSBhIG1lbW9yeSBibG9jaworLSBgYGttZW1sZWFrX25vX3NjYW5gYAkgLSBkbyBub3Qgc2NhbiBhIG1lbW9yeSBibG9jaworLSBgYGttZW1sZWFrX2VyYXNlYGAJCSAtIGVyYXNlIGFuIG9sZCB2YWx1ZSBpbiBhIHBvaW50ZXIgdmFyaWFibGUKKy0gYGBrbWVtbGVha19hbGxvY19yZWN1cnNpdmVgYCAtIGFzIGttZW1sZWFrX2FsbG9jIGJ1dCBjaGVja3MgdGhlIHJlY3Vyc2l2ZW5lc3MKKy0gYGBrbWVtbGVha19mcmVlX3JlY3Vyc2l2ZWBgCSAtIGFzIGttZW1sZWFrX2ZyZWUgYnV0IGNoZWNrcyB0aGUgcmVjdXJzaXZlbmVzcworCitEZWFsaW5nIHdpdGggZmFsc2UgcG9zaXRpdmVzL25lZ2F0aXZlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZhbHNlIG5lZ2F0aXZlcyBhcmUgcmVhbCBtZW1vcnkgbGVha3MgKG9ycGhhbiBvYmplY3RzKSBidXQgbm90CityZXBvcnRlZCBieSBrbWVtbGVhayBiZWNhdXNlIHZhbHVlcyBmb3VuZCBkdXJpbmcgdGhlIG1lbW9yeSBzY2FubmluZworcG9pbnQgdG8gc3VjaCBvYmplY3RzLiBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBmYWxzZSBuZWdhdGl2ZXMsIGttZW1sZWFrCitwcm92aWRlcyB0aGUga21lbWxlYWtfaWdub3JlLCBrbWVtbGVha19zY2FuX2FyZWEsIGttZW1sZWFrX25vX3NjYW4gYW5kCitrbWVtbGVha19lcmFzZSBmdW5jdGlvbnMgKHNlZSBhYm92ZSkuIFRoZSB0YXNrIHN0YWNrcyBhbHNvIGluY3JlYXNlIHRoZQorYW1vdW50IG9mIGZhbHNlIG5lZ2F0aXZlcyBhbmQgdGhlaXIgc2Nhbm5pbmcgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4KKworVGhlIGZhbHNlIHBvc2l0aXZlcyBhcmUgb2JqZWN0cyB3cm9uZ2x5IHJlcG9ydGVkIGFzIGJlaW5nIG1lbW9yeSBsZWFrcworKG9ycGhhbikuIEZvciBvYmplY3RzIGtub3duIG5vdCB0byBiZSBsZWFrcywga21lbWxlYWsgcHJvdmlkZXMgdGhlCitrbWVtbGVha19ub3RfbGVhayBmdW5jdGlvbi4gVGhlIGttZW1sZWFrX2lnbm9yZSBjb3VsZCBhbHNvIGJlIHVzZWQgaWYKK3RoZSBtZW1vcnkgYmxvY2sgaXMga25vd24gbm90IHRvIGNvbnRhaW4gb3RoZXIgcG9pbnRlcnMgYW5kIGl0IHdpbGwgbm8KK2xvbmdlciBiZSBzY2FubmVkLgorCitTb21lIG9mIHRoZSByZXBvcnRlZCBsZWFrcyBhcmUgb25seSB0cmFuc2llbnQsIGVzcGVjaWFsbHkgb24gU01QCitzeXN0ZW1zLCBiZWNhdXNlIG9mIHBvaW50ZXJzIHRlbXBvcmFyaWx5IHN0b3JlZCBpbiBDUFUgcmVnaXN0ZXJzIG9yCitzdGFja3MuIEttZW1sZWFrIGRlZmluZXMgTVNFQ1NfTUlOX0FHRSAoZGVmYXVsdGluZyB0byAxMDAwKSByZXByZXNlbnRpbmcKK3RoZSBtaW5pbXVtIGFnZSBvZiBhbiBvYmplY3QgdG8gYmUgcmVwb3J0ZWQgYXMgYSBtZW1vcnkgbGVhay4KKworTGltaXRhdGlvbnMgYW5kIERyYXdiYWNrcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgbWFpbiBkcmF3YmFjayBpcyB0aGUgcmVkdWNlZCBwZXJmb3JtYW5jZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBhbmQKK2ZyZWVpbmcuIFRvIGF2b2lkIG90aGVyIHBlbmFsdGllcywgdGhlIG1lbW9yeSBzY2FubmluZyBpcyBvbmx5IHBlcmZvcm1lZAord2hlbiB0aGUgL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsgZmlsZSBpcyByZWFkLiBBbnl3YXksIHRoaXMgdG9vbCBpcworaW50ZW5kZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB3aGVyZSB0aGUgcGVyZm9ybWFuY2UgbWlnaHQgbm90IGJlIHRoZQorbW9zdCBpbXBvcnRhbnQgcmVxdWlyZW1lbnQuCisKK1RvIGtlZXAgdGhlIGFsZ29yaXRobSBzaW1wbGUsIGttZW1sZWFrIHNjYW5zIGZvciB2YWx1ZXMgcG9pbnRpbmcgdG8gYW55CithZGRyZXNzIGluc2lkZSBhIGJsb2NrJ3MgYWRkcmVzcyByYW5nZS4gVGhpcyBtYXkgbGVhZCB0byBhbiBpbmNyZWFzZWQKK251bWJlciBvZiBmYWxzZSBuZWdhdGl2ZXMuIEhvd2V2ZXIsIGl0IGlzIGxpa2VseSB0aGF0IGEgcmVhbCBtZW1vcnkgbGVhaword2lsbCBldmVudHVhbGx5IGJlY29tZSB2aXNpYmxlLgorCitBbm90aGVyIHNvdXJjZSBvZiBmYWxzZSBuZWdhdGl2ZXMgaXMgdGhlIGRhdGEgc3RvcmVkIGluIG5vbi1wb2ludGVyCit2YWx1ZXMuIEluIGEgZnV0dXJlIHZlcnNpb24sIGttZW1sZWFrIGNvdWxkIG9ubHkgc2NhbiB0aGUgcG9pbnRlcgorbWVtYmVycyBpbiB0aGUgYWxsb2NhdGVkIHN0cnVjdHVyZXMuIFRoaXMgZmVhdHVyZSB3b3VsZCBzb2x2ZSBtYW55IG9mCit0aGUgZmFsc2UgbmVnYXRpdmUgY2FzZXMgZGVzY3JpYmVkIGFib3ZlLgorCitUaGUgdG9vbCBjYW4gcmVwb3J0IGZhbHNlIHBvc2l0aXZlcy4gVGhlc2UgYXJlIGNhc2VzIHdoZXJlIGFuIGFsbG9jYXRlZAorYmxvY2sgZG9lc24ndCBuZWVkIHRvIGJlIGZyZWVkIChzb21lIGNhc2VzIGluIHRoZSBpbml0X2NhbGwgZnVuY3Rpb25zKSwKK3RoZSBwb2ludGVyIGlzIGNhbGN1bGF0ZWQgYnkgb3RoZXIgbWV0aG9kcyB0aGFuIHRoZSB1c3VhbCBjb250YWluZXJfb2YKK21hY3JvIG9yIHRoZSBwb2ludGVyIGlzIHN0b3JlZCBpbiBhIGxvY2F0aW9uIG5vdCBzY2FubmVkIGJ5IGttZW1sZWFrLgorCitQYWdlIGFsbG9jYXRpb25zIGFuZCBpb3JlbWFwIGFyZSBub3QgdHJhY2tlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL3NwYXJzZS5yc3QgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9zcGFyc2UucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjUwZTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9zcGFyc2UucnN0CkBAIC0wLDAgKzEsMTE3IEBACisuLiBDb3B5cmlnaHQgMjAwNCBMaW51cyBUb3J2YWxkcworLi4gQ29weXJpZ2h0IDIwMDQgUGF2ZWwgTWFjaGVrIDxwYXZlbEB1Y3cuY3o+CisuLiBDb3B5cmlnaHQgMjAwNiBCb2IgQ29wZWxhbmQgPG1lQGJvYmNvcGVsYW5kLmNvbT4KKworU3BhcnNlCis9PT09PT0KKworU3BhcnNlIGlzIGEgc2VtYW50aWMgY2hlY2tlciBmb3IgQyBwcm9ncmFtczsgaXQgY2FuIGJlIHVzZWQgdG8gZmluZCBhCitudW1iZXIgb2YgcG90ZW50aWFsIHByb2JsZW1zIHdpdGgga2VybmVsIGNvZGUuICBTZWUKK2h0dHBzOi8vbHduLm5ldC9BcnRpY2xlcy82ODk5MDcvIGZvciBhbiBvdmVydmlldyBvZiBzcGFyc2U7IHRoaXMgZG9jdW1lbnQKK2NvbnRhaW5zIHNvbWUga2VybmVsLXNwZWNpZmljIHNwYXJzZSBpbmZvcm1hdGlvbi4KKworCitVc2luZyBzcGFyc2UgZm9yIHR5cGVjaGVja2luZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIl9fYml0d2lzZSIgaXMgYSB0eXBlIGF0dHJpYnV0ZSwgc28geW91IGhhdmUgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhpczo6CisKKyAgICAgICAgdHlwZWRlZiBpbnQgX19iaXR3aXNlIHBtX3JlcXVlc3RfdDsKKworICAgICAgICBlbnVtIHBtX3JlcXVlc3QgeworICAgICAgICAgICAgICAgIFBNX1NVU1BFTkQgPSAoX19mb3JjZSBwbV9yZXF1ZXN0X3QpIDEsCisgICAgICAgICAgICAgICAgUE1fUkVTVU1FID0gKF9fZm9yY2UgcG1fcmVxdWVzdF90KSAyCisgICAgICAgIH07CisKK3doaWNoIG1ha2VzIFBNX1NVU1BFTkQgYW5kIFBNX1JFU1VNRSAiYml0d2lzZSIgaW50ZWdlcnMgKHRoZSAiX19mb3JjZSIgaXMKK3RoZXJlIGJlY2F1c2Ugc3BhcnNlIHdpbGwgY29tcGxhaW4gYWJvdXQgY2FzdGluZyB0by9mcm9tIGEgYml0d2lzZSB0eXBlLAorYnV0IGluIHRoaXMgY2FzZSB3ZSByZWFsbHkgX2RvXyB3YW50IHRvIGZvcmNlIHRoZSBjb252ZXJzaW9uKS4gQW5kIGJlY2F1c2UKK3RoZSBlbnVtIHZhbHVlcyBhcmUgYWxsIHRoZSBzYW1lIHR5cGUsIG5vdyAiZW51bSBwbV9yZXF1ZXN0IiB3aWxsIGJlIHRoYXQKK3R5cGUgdG9vLgorCitBbmQgd2l0aCBnY2MsIGFsbCB0aGUgIl9fYml0d2lzZSIvIl9fZm9yY2Ugc3R1ZmYiIGdvZXMgYXdheSwgYW5kIGl0IGFsbAorZW5kcyB1cCBsb29raW5nIGp1c3QgbGlrZSBpbnRlZ2VycyB0byBnY2MuCisKK1F1aXRlIGZyYW5rbHksIHlvdSBkb24ndCBuZWVkIHRoZSBlbnVtIHRoZXJlLiBUaGUgYWJvdmUgYWxsIHJlYWxseSBqdXN0Citib2lscyBkb3duIHRvIG9uZSBzcGVjaWFsICJpbnQgX19iaXR3aXNlIiB0eXBlLgorCitTbyB0aGUgc2ltcGxlciB3YXkgaXMgdG8ganVzdCBkbzo6CisKKyAgICAgICAgdHlwZWRlZiBpbnQgX19iaXR3aXNlIHBtX3JlcXVlc3RfdDsKKworICAgICAgICAjZGVmaW5lIFBNX1NVU1BFTkQgKChfX2ZvcmNlIHBtX3JlcXVlc3RfdCkgMSkKKyAgICAgICAgI2RlZmluZSBQTV9SRVNVTUUgKChfX2ZvcmNlIHBtX3JlcXVlc3RfdCkgMikKKworYW5kIHlvdSBub3cgaGF2ZSBhbGwgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCBmb3Igc3RyaWN0IHR5cGVjaGVja2luZy4KKworT25lIHNtYWxsIG5vdGU6IHRoZSBjb25zdGFudCBpbnRlZ2VyICIwIiBpcyBzcGVjaWFsLiBZb3UgY2FuIHVzZSBhCitjb25zdGFudCB6ZXJvIGFzIGEgYml0d2lzZSBpbnRlZ2VyIHR5cGUgd2l0aG91dCBzcGFyc2UgZXZlciBjb21wbGFpbmluZy4KK1RoaXMgaXMgYmVjYXVzZSAiYml0d2lzZSIgKGFzIHRoZSBuYW1lIGltcGxpZXMpIHdhcyBkZXNpZ25lZCBmb3IgbWFraW5nCitzdXJlIHRoYXQgYml0d2lzZSB0eXBlcyBkb24ndCBnZXQgbWl4ZWQgdXAgKGxpdHRsZS1lbmRpYW4gdnMgYmlnLWVuZGlhbgordnMgY3B1LWVuZGlhbiB2cyB3aGF0ZXZlciksIGFuZCB0aGVyZSB0aGUgY29uc3RhbnQgIjAiIHJlYWxseSBfaXNfCitzcGVjaWFsLgorCitfX2JpdHdpc2VfXyAtIHRvIGJlIHVzZWQgZm9yIHJlbGF0aXZlbHkgY29tcGFjdCBzdHVmZiAoZ2ZwX3QsIGV0Yy4pIHRoYXQKK2lzIG1vc3RseSB3YXJuaW5nLWZyZWUgYW5kIGlzIHN1cHBvc2VkIHRvIHN0YXkgdGhhdCB3YXkuICBXYXJuaW5ncyB3aWxsCitiZSBnZW5lcmF0ZWQgd2l0aG91dCBfX0NIRUNLX0VORElBTl9fLgorCitfX2JpdHdpc2UgLSBub2lzeSBzdHVmZjsgaW4gcGFydGljdWxhciwgX19sZSovX19iZSogYXJlIHRoYXQuICBXZSByZWFsbHkKK2Rvbid0IHdhbnQgdG8gZHJvd24gaW4gbm9pc2UgdW5sZXNzIHdlJ2QgZXhwbGljaXRseSBhc2tlZCBmb3IgaXQuCisKK1VzaW5nIHNwYXJzZSBmb3IgbG9jayBjaGVja2luZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSB1bmRlZmluZWQgZm9yIGdjYyBhbmQgZGVmaW5lZCBkdXJpbmcgYSBzcGFyc2UKK3J1biB0byB1c2UgdGhlICJjb250ZXh0IiB0cmFja2luZyBmZWF0dXJlIG9mIHNwYXJzZSwgYXBwbGllZCB0bworbG9ja2luZy4gIFRoZXNlIGFubm90YXRpb25zIHRlbGwgc3BhcnNlIHdoZW4gYSBsb2NrIGlzIGhlbGQsIHdpdGgKK3JlZ2FyZCB0byB0aGUgYW5ub3RhdGVkIGZ1bmN0aW9uJ3MgZW50cnkgYW5kIGV4aXQuCisKK19fbXVzdF9ob2xkIC0gVGhlIHNwZWNpZmllZCBsb2NrIGlzIGhlbGQgb24gZnVuY3Rpb24gZW50cnkgYW5kIGV4aXQuCisKK19fYWNxdWlyZXMgLSBUaGUgc3BlY2lmaWVkIGxvY2sgaXMgaGVsZCBvbiBmdW5jdGlvbiBleGl0LCBidXQgbm90IGVudHJ5LgorCitfX3JlbGVhc2VzIC0gVGhlIHNwZWNpZmllZCBsb2NrIGlzIGhlbGQgb24gZnVuY3Rpb24gZW50cnksIGJ1dCBub3QgZXhpdC4KKworSWYgdGhlIGZ1bmN0aW9uIGVudGVycyBhbmQgZXhpdHMgd2l0aG91dCB0aGUgbG9jayBoZWxkLCBhY3F1aXJpbmcgYW5kCityZWxlYXNpbmcgdGhlIGxvY2sgaW5zaWRlIHRoZSBmdW5jdGlvbiBpbiBhIGJhbGFuY2VkIHdheSwgbm8KK2Fubm90YXRpb24gaXMgbmVlZGVkLiAgVGhlIHRyZWUgYW5ub3RhdGlvbnMgYWJvdmUgYXJlIGZvciBjYXNlcyB3aGVyZQorc3BhcnNlIHdvdWxkIG90aGVyd2lzZSByZXBvcnQgYSBjb250ZXh0IGltYmFsYW5jZS4KKworR2V0dGluZyBzcGFyc2UKKy0tLS0tLS0tLS0tLS0tCisKK1lvdSBjYW4gZ2V0IGxhdGVzdCByZWxlYXNlZCB2ZXJzaW9ucyBmcm9tIHRoZSBTcGFyc2UgaG9tZXBhZ2UgYXQKK2h0dHBzOi8vc3BhcnNlLndpa2kua2VybmVsLm9yZy9pbmRleC5waHAvTWFpbl9QYWdlCisKK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gZ2V0IHNuYXBzaG90cyBvZiB0aGUgbGF0ZXN0IGRldmVsb3BtZW50IHZlcnNpb24KK29mIHNwYXJzZSB1c2luZyBnaXQgdG8gY2xvbmU6OgorCisgICAgICAgIGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vZGV2ZWwvc3BhcnNlL3NwYXJzZS5naXQKKworRGF2ZUogaGFzIGhvdXJseSBnZW5lcmF0ZWQgdGFyYmFsbHMgb2YgdGhlIGdpdCB0cmVlIGF2YWlsYWJsZSBhdDo6CisKKyAgICAgICAgaHR0cDovL3d3dy5jb2RlbW9ua2V5Lm9yZy51ay9wcm9qZWN0cy9naXQtc25hcHNob3RzL3NwYXJzZS8KKworCitPbmNlIHlvdSBoYXZlIGl0LCBqdXN0IGRvOjoKKworICAgICAgICBtYWtlCisgICAgICAgIG1ha2UgaW5zdGFsbAorCithcyBhIHJlZ3VsYXIgdXNlciwgYW5kIGl0IHdpbGwgaW5zdGFsbCBzcGFyc2UgaW4geW91ciB+L2JpbiBkaXJlY3RvcnkuCisKK1VzaW5nIHNwYXJzZQorLS0tLS0tLS0tLS0tCisKK0RvIGEga2VybmVsIG1ha2Ugd2l0aCAibWFrZSBDPTEiIHRvIHJ1biBzcGFyc2Ugb24gYWxsIHRoZSBDIGZpbGVzIHRoYXQgZ2V0CityZWNvbXBpbGVkLCBvciB1c2UgIm1ha2UgQz0yIiB0byBydW4gc3BhcnNlIG9uIHRoZSBmaWxlcyB3aGV0aGVyIHRoZXkgbmVlZCB0bworYmUgcmVjb21waWxlZCBvciBub3QuICBUaGUgbGF0dGVyIGlzIGEgZmFzdCB3YXkgdG8gY2hlY2sgdGhlIHdob2xlIHRyZWUgaWYgeW91CitoYXZlIGFscmVhZHkgYnVpbHQgaXQuCisKK1RoZSBvcHRpb25hbCBtYWtlIHZhcmlhYmxlIENGIGNhbiBiZSB1c2VkIHRvIHBhc3MgYXJndW1lbnRzIHRvIHNwYXJzZS4gIFRoZQorYnVpbGQgc3lzdGVtIHBhc3NlcyAtV2JpdHdpc2UgdG8gc3BhcnNlIGF1dG9tYXRpY2FsbHkuICBUbyBwZXJmb3JtIGVuZGlhbm5lc3MKK2NoZWNrcywgeW91IG1heSBkZWZpbmUgX19DSEVDS19FTkRJQU5fXzo6CisKKyAgICAgICAgbWFrZSBDPTIgQ0Y9Ii1EX19DSEVDS19FTkRJQU5fXyIKKworVGhlc2UgY2hlY2tzIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0IGFzIHRoZXkgZ2VuZXJhdGUgYSBob3N0IG9mIHdhcm5pbmdzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvdG9vbHMucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvdG9vbHMucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNGFlOGUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy90b29scy5yc3QKQEAgLTAsMCArMSwyNSBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0RldmVsb3BtZW50IHRvb2xzIGZvciB0aGUga2VybmVsCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGRvY3VtZW50IGlzIGEgY29sbGVjdGlvbiBvZiBkb2N1bWVudHMgYWJvdXQgZGV2ZWxvcG1lbnQgdG9vbHMgdGhhdCBjYW4KK2JlIHVzZWQgdG8gd29yayBvbiB0aGUga2VybmVsLiAgRm9yIG5vdywgdGhlIGRvY3VtZW50cyBoYXZlIGJlZW4gcHVsbGVkCit0b2dldGhlciB3aXRob3V0IGFueSBzaWduaWZpY2FudCBlZmZvdCB0byBpbnRlZ3JhdGUgdGhlbSBpbnRvIGEgY29oZXJlbnQKK3dob2xlOyBwYXRjaGVzIHdlbGNvbWUhCisKKy4uIGNsYXNzOjogdG9jLXRpdGxlCisKKwkgICBUYWJsZSBvZiBjb250ZW50cworCisuLiB0b2N0cmVlOjoKKyAgIDptYXhkZXB0aDogMgorCisgICBjb2NjaW5lbGxlCisgICBzcGFyc2UKKyAgIGtjb3YKKyAgIGdjb3YKKyAgIGthc2FuCisgICB1YnNhbgorICAga21lbWxlYWsKKyAgIGttZW1jaGVjaworICAgZ2RiLWtlcm5lbC1kZWJ1Z2dpbmcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL3Vic2FuLnJzdCBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL3Vic2FuLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTVlNmI2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvdWJzYW4ucnN0CkBAIC0wLDAgKzEsODggQEAKK1RoZSBVbmRlZmluZWQgQmVoYXZpb3IgU2FuaXRpemVyIC0gVUJTQU4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVUJTQU4gaXMgYSBydW50aW1lIHVuZGVmaW5lZCBiZWhhdmlvdXIgY2hlY2tlci4KKworVUJTQU4gdXNlcyBjb21waWxlLXRpbWUgaW5zdHJ1bWVudGF0aW9uIHRvIGNhdGNoIHVuZGVmaW5lZCBiZWhhdmlvciAoVUIpLgorQ29tcGlsZXIgaW5zZXJ0cyBjb2RlIHRoYXQgcGVyZm9ybSBjZXJ0YWluIGtpbmRzIG9mIGNoZWNrcyBiZWZvcmUgb3BlcmF0aW9ucwordGhhdCBtYXkgY2F1c2UgVUIuIElmIGNoZWNrIGZhaWxzIChpLmUuIFVCIGRldGVjdGVkKSBfX3Vic2FuX2hhbmRsZV8qCitmdW5jdGlvbiBjYWxsZWQgdG8gcHJpbnQgZXJyb3IgbWVzc2FnZS4KKworR0NDIGhhcyB0aGF0IGZlYXR1cmUgc2luY2UgNC45LnggWzFfXSAoc2VlIGBgLWZzYW5pdGl6ZT11bmRlZmluZWRgYCBvcHRpb24gYW5kCitpdHMgc3Vib3B0aW9ucykuIEdDQyA1LnggaGFzIG1vcmUgY2hlY2tlcnMgaW1wbGVtZW50ZWQgWzJfXS4KKworUmVwb3J0IGV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tCisKKzo6CisKKwkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgVUJTQU46IFVuZGVmaW5lZCBiZWhhdmlvdXIgaW4gLi4vaW5jbHVkZS9saW51eC9iaXRvcHMuaDoxMTA6MzMKKwkgc2hpZnQgZXhwb25lbnQgMzIgaXMgdG8gbGFyZ2UgZm9yIDMyLWJpdCB0eXBlICd1bnNpZ25lZCBpbnQnCisJIENQVTogMCBQSUQ6IDAgQ29tbTogc3dhcHBlciBOb3QgdGFpbnRlZCA0LjQuMC1yYzErICMyNgorCSAgMDAwMDAwMDAwMDAwMDAwMCBmZmZmZmZmZjgyNDAzY2M4IGZmZmZmZmZmODE1ZTZjZDYgMDAwMDAwMDAwMDAwMDAwMQorCSAgZmZmZmZmZmY4MjQwM2NmOCBmZmZmZmZmZjgyNDAzY2UwIGZmZmZmZmZmODE2M2E1ZWQgMDAwMDAwMDAwMDAwMDAyMAorCSAgZmZmZmZmZmY4MjQwM2Q3OCBmZmZmZmZmZjgxNjNhYzJiIGZmZmZmZmZmODE1ZjAwMDEgMDAwMDAwMDAwMDAwMDAwMgorCSBDYWxsIFRyYWNlOgorCSAgWzxmZmZmZmZmZjgxNWU2Y2Q2Pl0gZHVtcF9zdGFjaysweDQ1LzB4NWYKKwkgIFs8ZmZmZmZmZmY4MTYzYTVlZD5dIHVic2FuX2VwaWxvZ3VlKzB4ZC8weDQwCisJICBbPGZmZmZmZmZmODE2M2FjMmI+XSBfX3Vic2FuX2hhbmRsZV9zaGlmdF9vdXRfb2ZfYm91bmRzKzB4ZWIvMHgxMzAKKwkgIFs8ZmZmZmZmZmY4MTVmMDAwMT5dID8gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cF9zbG90KzB4NTEvMHgxNTAKKwkgIFs8ZmZmZmZmZmY4MTczYzU4Nj5dIF9taXhfcG9vbF9ieXRlcysweDFlNi8weDQ4MAorCSAgWzxmZmZmZmZmZjgzMTA1NjUzPl0gPyBkbWlfd2Fsa19lYXJseSsweDQ4LzB4NWMKKwkgIFs8ZmZmZmZmZmY4MTczYzg4MT5dIGFkZF9kZXZpY2VfcmFuZG9tbmVzcysweDYxLzB4MTMwCisJICBbPGZmZmZmZmZmODMxMDViMzU+XSA/IGRtaV9zYXZlX29uZV9kZXZpY2UrMHhhYS8weGFhCisJICBbPGZmZmZmZmZmODMxMDU2NTM+XSBkbWlfd2Fsa19lYXJseSsweDQ4LzB4NWMKKwkgIFs8ZmZmZmZmZmY4MzEwNjZhZT5dIGRtaV9zY2FuX21hY2hpbmUrMHgyNzgvMHg0YjQKKwkgIFs8ZmZmZmZmZmY4MTExZDU4YT5dID8gdnByaW50a19kZWZhdWx0KzB4MWEvMHgyMAorCSAgWzxmZmZmZmZmZjgzMGFkMTIwPl0gPyBlYXJseV9pZHRfaGFuZGxlcl9hcnJheSsweDEyMC8weDEyMAorCSAgWzxmZmZmZmZmZjgzMGIyMjQwPl0gc2V0dXBfYXJjaCsweDQwNS8weGMyYworCSAgWzxmZmZmZmZmZjgzMGFkMTIwPl0gPyBlYXJseV9pZHRfaGFuZGxlcl9hcnJheSsweDEyMC8weDEyMAorCSAgWzxmZmZmZmZmZjgzMGFlMDUzPl0gc3RhcnRfa2VybmVsKzB4ODMvMHg0OWEKKwkgIFs8ZmZmZmZmZmY4MzBhZDEyMD5dID8gZWFybHlfaWR0X2hhbmRsZXJfYXJyYXkrMHgxMjAvMHgxMjAKKwkgIFs8ZmZmZmZmZmY4MzBhZDM4Nj5dIHg4Nl82NF9zdGFydF9yZXNlcnZhdGlvbnMrMHgyYS8weDJjCisJICBbPGZmZmZmZmZmODMwYWQ0ZjM+XSB4ODZfNjRfc3RhcnRfa2VybmVsKzB4MTZiLzB4MTdhCisJID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1VzYWdlCistLS0tLQorCitUbyBlbmFibGUgVUJTQU4gY29uZmlndXJlIGtlcm5lbCB3aXRoOjoKKworCUNPTkZJR19VQlNBTj15CisKK2FuZCB0byBjaGVjayB0aGUgZW50aXJlIGtlcm5lbDo6CisKKyAgICAgICAgQ09ORklHX1VCU0FOX1NBTklUSVpFX0FMTD15CisKK1RvIGVuYWJsZSBpbnN0cnVtZW50YXRpb24gZm9yIHNwZWNpZmljIGZpbGVzIG9yIGRpcmVjdG9yaWVzLCBhZGQgYSBsaW5lCitzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgdG8gdGhlIHJlc3BlY3RpdmUga2VybmVsIE1ha2VmaWxlOgorCistIEZvciBhIHNpbmdsZSBmaWxlIChlLmcuIG1haW4ubyk6OgorCisgICAgVUJTQU5fU0FOSVRJWkVfbWFpbi5vIDo9IHkKKworLSBGb3IgYWxsIGZpbGVzIGluIG9uZSBkaXJlY3Rvcnk6OgorCisgICAgVUJTQU5fU0FOSVRJWkUgOj0geQorCitUbyBleGNsdWRlIGZpbGVzIGZyb20gYmVpbmcgaW5zdHJ1bWVudGVkIGV2ZW4gaWYKK2BgQ09ORklHX1VCU0FOX1NBTklUSVpFX0FMTD15YGAsIHVzZTo6CisKKyAgVUJTQU5fU0FOSVRJWkVfbWFpbi5vIDo9IG4KKworYW5kOjoKKworICBVQlNBTl9TQU5JVElaRSA6PSBuCisKK0RldGVjdGlvbiBvZiB1bmFsaWduZWQgYWNjZXNzZXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBzZXBhcmF0ZSBvcHRpb24gLQorQ09ORklHX1VCU0FOX0FMSUdOTUVOVC4gSXQncyBvZmYgYnkgZGVmYXVsdCBvbiBhcmNoaXRlY3R1cmVzIHRoYXQgc3VwcG9ydAordW5hbGlnbmVkIGFjY2Vzc2VzIChDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUz15KS4gT25lIGNvdWxkCitzdGlsbCBlbmFibGUgaXQgaW4gY29uZmlnLCBqdXN0IG5vdGUgdGhhdCBpdCB3aWxsIHByb2R1Y2UgYSBsb3Qgb2YgVUJTQU4KK3JlcG9ydHMuCisKK1JlZmVyZW5jZXMKKy0tLS0tLS0tLS0KKworLi4gXzE6IGh0dHBzOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MtNC45LjAvZ2NjL0RlYnVnZ2luZy1PcHRpb25zLmh0bWwKKy4uIF8yOiBodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjL0RlYnVnZ2luZy1PcHRpb25zLmh0bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy8xLkludHJvIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzEuSW50cm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNjE0NDguLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzEuSW50cm8KKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotMTogQSBHVUlERSBUTyBUSEUgS0VSTkVMIERFVkVMT1BNRU5UIFBST0NFU1MKLQotVGhlIHB1cnBvc2Ugb2YgdGhpcyBkb2N1bWVudCBpcyB0byBoZWxwIGRldmVsb3BlcnMgKGFuZCB0aGVpciBtYW5hZ2VycykKLXdvcmsgd2l0aCB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IHdpdGggYSBtaW5pbXVtIG9mIGZydXN0cmF0aW9uLiAgSXQgaXMKLWFuIGF0dGVtcHQgdG8gZG9jdW1lbnQgaG93IHRoaXMgY29tbXVuaXR5IHdvcmtzIGluIGEgd2F5IHdoaWNoIGlzCi1hY2Nlc3NpYmxlIHRvIHRob3NlIHdobyBhcmUgbm90IGludGltYXRlbHkgZmFtaWxpYXIgd2l0aCBMaW51eCBrZXJuZWwKLWRldmVsb3BtZW50IChvciwgaW5kZWVkLCBmcmVlIHNvZnR3YXJlIGRldmVsb3BtZW50IGluIGdlbmVyYWwpLiAgV2hpbGUKLXRoZXJlIGlzIHNvbWUgdGVjaG5pY2FsIG1hdGVyaWFsIGhlcmUsIHRoaXMgaXMgdmVyeSBtdWNoIGEgcHJvY2Vzcy1vcmllbnRlZAotZGlzY3Vzc2lvbiB3aGljaCBkb2VzIG5vdCByZXF1aXJlIGEgZGVlcCBrbm93bGVkZ2Ugb2Yga2VybmVsIHByb2dyYW1taW5nIHRvCi11bmRlcnN0YW5kLgotCi0KLTEuMTogRVhFQ1VUSVZFIFNVTU1BUlkKLQotVGhlIHJlc3Qgb2YgdGhpcyBzZWN0aW9uIGNvdmVycyB0aGUgc2NvcGUgb2YgdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzCi1hbmQgdGhlIGtpbmRzIG9mIGZydXN0cmF0aW9ucyB0aGF0IGRldmVsb3BlcnMgYW5kIHRoZWlyIGVtcGxveWVycyBjYW4KLWVuY291bnRlciB0aGVyZS4gIFRoZXJlIGFyZSBhIGdyZWF0IG1hbnkgcmVhc29ucyB3aHkga2VybmVsIGNvZGUgc2hvdWxkIGJlCi1tZXJnZWQgaW50byB0aGUgb2ZmaWNpYWwgKCJtYWlubGluZSIpIGtlcm5lbCwgaW5jbHVkaW5nIGF1dG9tYXRpYwotYXZhaWxhYmlsaXR5IHRvIHVzZXJzLCBjb21tdW5pdHkgc3VwcG9ydCBpbiBtYW55IGZvcm1zLCBhbmQgdGhlIGFiaWxpdHkgdG8KLWluZmx1ZW5jZSB0aGUgZGlyZWN0aW9uIG9mIGtlcm5lbCBkZXZlbG9wbWVudC4gIENvZGUgY29udHJpYnV0ZWQgdG8gdGhlCi1MaW51eCBrZXJuZWwgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhIEdQTC1jb21wYXRpYmxlIGxpY2Vuc2UuCi0KLVNlY3Rpb24gMiBpbnRyb2R1Y2VzIHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLCB0aGUga2VybmVsIHJlbGVhc2UgY3ljbGUsIGFuZAotdGhlIG1lY2hhbmljcyBvZiB0aGUgbWVyZ2Ugd2luZG93LiAgVGhlIHZhcmlvdXMgcGhhc2VzIGluIHRoZSBwYXRjaAotZGV2ZWxvcG1lbnQsIHJldmlldywgYW5kIG1lcmdpbmcgY3ljbGUgYXJlIGNvdmVyZWQuICBUaGVyZSBpcyBzb21lCi1kaXNjdXNzaW9uIG9mIHRvb2xzIGFuZCBtYWlsaW5nIGxpc3RzLiAgRGV2ZWxvcGVycyB3YW50aW5nIHRvIGdldCBzdGFydGVkCi13aXRoIGtlcm5lbCBkZXZlbG9wbWVudCBhcmUgZW5jb3VyYWdlZCB0byB0cmFjayBkb3duIGFuZCBmaXggYnVncyBhcyBhbgotaW5pdGlhbCBleGVyY2lzZS4KLQotU2VjdGlvbiAzIGNvdmVycyBlYXJseS1zdGFnZSBwcm9qZWN0IHBsYW5uaW5nLCB3aXRoIGFuIGVtcGhhc2lzIG9uCi1pbnZvbHZpbmcgdGhlIGRldmVsb3BtZW50IGNvbW11bml0eSBhcyBzb29uIGFzIHBvc3NpYmxlLgotCi1TZWN0aW9uIDQgaXMgYWJvdXQgdGhlIGNvZGluZyBwcm9jZXNzOyBzZXZlcmFsIHBpdGZhbGxzIHdoaWNoIGhhdmUgYmVlbgotZW5jb3VudGVyZWQgYnkgb3RoZXIgZGV2ZWxvcGVycyBhcmUgZGlzY3Vzc2VkLiAgU29tZSByZXF1aXJlbWVudHMgZm9yCi1wYXRjaGVzIGFyZSBjb3ZlcmVkLCBhbmQgdGhlcmUgaXMgYW4gaW50cm9kdWN0aW9uIHRvIHNvbWUgb2YgdGhlIHRvb2xzCi13aGljaCBjYW4gaGVscCB0byBlbnN1cmUgdGhhdCBrZXJuZWwgcGF0Y2hlcyBhcmUgY29ycmVjdC4KLQotU2VjdGlvbiA1IHRhbGtzIGFib3V0IHRoZSBwcm9jZXNzIG9mIHBvc3RpbmcgcGF0Y2hlcyBmb3IgcmV2aWV3LiAgVG8gYmUKLXRha2VuIHNlcmlvdXNseSBieSB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LCBwYXRjaGVzIG11c3QgYmUgcHJvcGVybHkKLWZvcm1hdHRlZCBhbmQgZGVzY3JpYmVkLCBhbmQgdGhleSBtdXN0IGJlIHNlbnQgdG8gdGhlIHJpZ2h0IHBsYWNlLgotRm9sbG93aW5nIHRoZSBhZHZpY2UgaW4gdGhpcyBzZWN0aW9uIHNob3VsZCBoZWxwIHRvIGVuc3VyZSB0aGUgYmVzdAotcG9zc2libGUgcmVjZXB0aW9uIGZvciB5b3VyIHdvcmsuCi0KLVNlY3Rpb24gNiBjb3ZlcnMgd2hhdCBoYXBwZW5zIGFmdGVyIHBvc3RpbmcgcGF0Y2hlczsgdGhlIGpvYiBpcyBmYXIgZnJvbQotZG9uZSBhdCB0aGF0IHBvaW50LiAgV29ya2luZyB3aXRoIHJldmlld2VycyBpcyBhIGNydWNpYWwgcGFydCBvZiB0aGUKLWRldmVsb3BtZW50IHByb2Nlc3M7IHRoaXMgc2VjdGlvbiBvZmZlcnMgYSBudW1iZXIgb2YgdGlwcyBvbiBob3cgdG8gYXZvaWQKLXByb2JsZW1zIGF0IHRoaXMgaW1wb3J0YW50IHN0YWdlLiAgRGV2ZWxvcGVycyBhcmUgY2F1dGlvbmVkIGFnYWluc3QKLWFzc3VtaW5nIHRoYXQgdGhlIGpvYiBpcyBkb25lIHdoZW4gYSBwYXRjaCBpcyBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUuCi0KLVNlY3Rpb24gNyBpbnRyb2R1Y2VzIGEgY291cGxlIG9mICJhZHZhbmNlZCIgdG9waWNzOiBtYW5hZ2luZyBwYXRjaGVzIHdpdGgKLWdpdCBhbmQgcmV2aWV3aW5nIHBhdGNoZXMgcG9zdGVkIGJ5IG90aGVycy4KLQotU2VjdGlvbiA4IGNvbmNsdWRlcyB0aGUgZG9jdW1lbnQgd2l0aCBwb2ludGVycyB0byBzb3VyY2VzIGZvciBtb3JlCi1pbmZvcm1hdGlvbiBvbiBrZXJuZWwgZGV2ZWxvcG1lbnQuCi0KLQotMS4yOiBXSEFUIFRISVMgRE9DVU1FTlQgSVMgQUJPVVQKLQotVGhlIExpbnV4IGtlcm5lbCwgYXQgb3ZlciA4IG1pbGxpb24gbGluZXMgb2YgY29kZSBhbmQgd2VsbCBvdmVyIDEwMDAKLWNvbnRyaWJ1dG9ycyB0byBlYWNoIHJlbGVhc2UsIGlzIG9uZSBvZiB0aGUgbGFyZ2VzdCBhbmQgbW9zdCBhY3RpdmUgZnJlZQotc29mdHdhcmUgcHJvamVjdHMgaW4gZXhpc3RlbmNlLiAgU2luY2UgaXRzIGh1bWJsZSBiZWdpbm5pbmcgaW4gMTk5MSwgdGhpcwota2VybmVsIGhhcyBldm9sdmVkIGludG8gYSBiZXN0LW9mLWJyZWVkIG9wZXJhdGluZyBzeXN0ZW0gY29tcG9uZW50IHdoaWNoCi1ydW5zIG9uIHBvY2tldC1zaXplZCBkaWdpdGFsIG11c2ljIHBsYXllcnMsIGRlc2t0b3AgUENzLCB0aGUgbGFyZ2VzdAotc3VwZXJjb21wdXRlcnMgaW4gZXhpc3RlbmNlLCBhbmQgYWxsIHR5cGVzIG9mIHN5c3RlbXMgaW4gYmV0d2Vlbi4gIEl0IGlzIGEKLXJvYnVzdCwgZWZmaWNpZW50LCBhbmQgc2NhbGFibGUgc29sdXRpb24gZm9yIGFsbW9zdCBhbnkgc2l0dWF0aW9uLgotCi1XaXRoIHRoZSBncm93dGggb2YgTGludXggaGFzIGNvbWUgYW4gaW5jcmVhc2UgaW4gdGhlIG51bWJlciBvZiBkZXZlbG9wZXJzCi0oYW5kIGNvbXBhbmllcykgd2lzaGluZyB0byBwYXJ0aWNpcGF0ZSBpbiBpdHMgZGV2ZWxvcG1lbnQuICBIYXJkd2FyZQotdmVuZG9ycyB3YW50IHRvIGVuc3VyZSB0aGF0IExpbnV4IHN1cHBvcnRzIHRoZWlyIHByb2R1Y3RzIHdlbGwsIG1ha2luZwotdGhvc2UgcHJvZHVjdHMgYXR0cmFjdGl2ZSB0byBMaW51eCB1c2Vycy4gIEVtYmVkZGVkIHN5c3RlbXMgdmVuZG9ycywgd2hvCi11c2UgTGludXggYXMgYSBjb21wb25lbnQgaW4gYW4gaW50ZWdyYXRlZCBwcm9kdWN0LCB3YW50IExpbnV4IHRvIGJlIGFzCi1jYXBhYmxlIGFuZCB3ZWxsLXN1aXRlZCB0byB0aGUgdGFzayBhdCBoYW5kIGFzIHBvc3NpYmxlLiAgRGlzdHJpYnV0b3JzIGFuZAotb3RoZXIgc29mdHdhcmUgdmVuZG9ycyB3aG8gYmFzZSB0aGVpciBwcm9kdWN0cyBvbiBMaW51eCBoYXZlIGEgY2xlYXIKLWludGVyZXN0IGluIHRoZSBjYXBhYmlsaXRpZXMsIHBlcmZvcm1hbmNlLCBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlIExpbnV4Ci1rZXJuZWwuICBBbmQgZW5kIHVzZXJzLCB0b28sIHdpbGwgb2Z0ZW4gd2lzaCB0byBjaGFuZ2UgTGludXggdG8gbWFrZSBpdAotYmV0dGVyIHN1aXQgdGhlaXIgbmVlZHMuCi0KLU9uZSBvZiB0aGUgbW9zdCBjb21wZWxsaW5nIGZlYXR1cmVzIG9mIExpbnV4IGlzIHRoYXQgaXQgaXMgYWNjZXNzaWJsZSB0bwotdGhlc2UgZGV2ZWxvcGVyczsgYW55Ym9keSB3aXRoIHRoZSByZXF1aXNpdGUgc2tpbGxzIGNhbiBpbXByb3ZlIExpbnV4IGFuZAotaW5mbHVlbmNlIHRoZSBkaXJlY3Rpb24gb2YgaXRzIGRldmVsb3BtZW50LiAgUHJvcHJpZXRhcnkgcHJvZHVjdHMgY2Fubm90Ci1vZmZlciB0aGlzIGtpbmQgb2Ygb3Blbm5lc3MsIHdoaWNoIGlzIGEgY2hhcmFjdGVyaXN0aWMgb2YgdGhlIGZyZWUgc29mdHdhcmUKLXByb2Nlc3MuICBCdXQsIGlmIGFueXRoaW5nLCB0aGUga2VybmVsIGlzIGV2ZW4gbW9yZSBvcGVuIHRoYW4gbW9zdCBvdGhlcgotZnJlZSBzb2Z0d2FyZSBwcm9qZWN0cy4gIEEgdHlwaWNhbCB0aHJlZS1tb250aCBrZXJuZWwgZGV2ZWxvcG1lbnQgY3ljbGUgY2FuCi1pbnZvbHZlIG92ZXIgMTAwMCBkZXZlbG9wZXJzIHdvcmtpbmcgZm9yIG1vcmUgdGhhbiAxMDAgZGlmZmVyZW50IGNvbXBhbmllcwotKG9yIGZvciBubyBjb21wYW55IGF0IGFsbCkuCi0KLVdvcmtpbmcgd2l0aCB0aGUga2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eSBpcyBub3QgZXNwZWNpYWxseSBoYXJkLiAgQnV0LAotdGhhdCBub3R3aXRoc3RhbmRpbmcsIG1hbnkgcG90ZW50aWFsIGNvbnRyaWJ1dG9ycyBoYXZlIGV4cGVyaWVuY2VkCi1kaWZmaWN1bHRpZXMgd2hlbiB0cnlpbmcgdG8gZG8ga2VybmVsIHdvcmsuICBUaGUga2VybmVsIGNvbW11bml0eSBoYXMKLWV2b2x2ZWQgaXRzIG93biBkaXN0aW5jdCB3YXlzIG9mIG9wZXJhdGluZyB3aGljaCBhbGxvdyBpdCB0byBmdW5jdGlvbgotc21vb3RobHkgKGFuZCBwcm9kdWNlIGEgaGlnaC1xdWFsaXR5IHByb2R1Y3QpIGluIGFuIGVudmlyb25tZW50IHdoZXJlCi10aG91c2FuZHMgb2YgbGluZXMgb2YgY29kZSBhcmUgYmVpbmcgY2hhbmdlZCBldmVyeSBkYXkuICBTbyBpdCBpcyBub3QKLXN1cnByaXNpbmcgdGhhdCBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkaWZmZXJzIGdyZWF0bHkgZnJvbQotcHJvcHJpZXRhcnkgZGV2ZWxvcG1lbnQgbWV0aG9kcy4KLQotVGhlIGtlcm5lbCdzIGRldmVsb3BtZW50IHByb2Nlc3MgbWF5IGNvbWUgYWNyb3NzIGFzIHN0cmFuZ2UgYW5kCi1pbnRpbWlkYXRpbmcgdG8gbmV3IGRldmVsb3BlcnMsIGJ1dCB0aGVyZSBhcmUgZ29vZCByZWFzb25zIGFuZCBzb2xpZAotZXhwZXJpZW5jZSBiZWhpbmQgaXQuICBBIGRldmVsb3BlciB3aG8gZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUga2VybmVsCi1jb21tdW5pdHkncyB3YXlzIChvciwgd29yc2UsIHdobyB0cmllcyB0byBmbG91dCBvciBjaXJjdW12ZW50IHRoZW0pIHdpbGwKLWhhdmUgYSBmcnVzdHJhdGluZyBleHBlcmllbmNlIGluIHN0b3JlLiAgVGhlIGRldmVsb3BtZW50IGNvbW11bml0eSwgd2hpbGUKLWJlaW5nIGhlbHBmdWwgdG8gdGhvc2Ugd2hvIGFyZSB0cnlpbmcgdG8gbGVhcm4sIGhhcyBsaXR0bGUgdGltZSBmb3IgdGhvc2UKLXdobyB3aWxsIG5vdCBsaXN0ZW4gb3Igd2hvIGRvIG5vdCBjYXJlIGFib3V0IHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLgotCi1JdCBpcyBob3BlZCB0aGF0IHRob3NlIHdobyByZWFkIHRoaXMgZG9jdW1lbnQgd2lsbCBiZSBhYmxlIHRvIGF2b2lkIHRoYXQKLWZydXN0cmF0aW5nIGV4cGVyaWVuY2UuICBUaGVyZSBpcyBhIGxvdCBvZiBtYXRlcmlhbCBoZXJlLCBidXQgdGhlIGVmZm9ydAotaW52b2x2ZWQgaW4gcmVhZGluZyBpdCB3aWxsIGJlIHJlcGFpZCBpbiBzaG9ydCBvcmRlci4gIFRoZSBkZXZlbG9wbWVudAotY29tbXVuaXR5IGlzIGFsd2F5cyBpbiBuZWVkIG9mIGRldmVsb3BlcnMgd2hvIHdpbGwgaGVscCB0byBtYWtlIHRoZSBrZXJuZWwKLWJldHRlcjsgdGhlIGZvbGxvd2luZyB0ZXh0IHNob3VsZCBoZWxwIHlvdSAtIG9yIHRob3NlIHdobyB3b3JrIGZvciB5b3UgLQotam9pbiBvdXIgY29tbXVuaXR5LgotCi0KLTEuMzogQ1JFRElUUwotCi1UaGlzIGRvY3VtZW50IHdhcyB3cml0dGVuIGJ5IEpvbmF0aGFuIENvcmJldCwgY29yYmV0QGx3bi5uZXQuICBJdCBoYXMgYmVlbgotaW1wcm92ZWQgYnkgY29tbWVudHMgZnJvbSBKb2hhbm5lcyBCZXJnLCBKYW1lcyBCZXJyeSwgQWxleCBDaGlhbmcsIFJvbGFuZAotRHJlaWVyLCBSYW5keSBEdW5sYXAsIEpha2UgRWRnZSwgSmlyaSBLb3NpbmEsIE1hdHQgTWFja2FsbCwgQXJ0aHVyIE1hcnNoLAotQW1hbmRhIE1jUGhlcnNvbiwgQW5kcmV3IE1vcnRvbiwgQW5kcmV3IFByaWNlLCBUc3VnaWthenUgU2hpYmF0YSwgYW5kCi1Kb2NoZW4gVm/Dny4KLQotVGhpcyB3b3JrIHdhcyBzdXBwb3J0ZWQgYnkgdGhlIExpbnV4IEZvdW5kYXRpb247IHRoYW5rcyBlc3BlY2lhbGx5IHRvCi1BbWFuZGEgTWNQaGVyc29uLCB3aG8gc2F3IHRoZSB2YWx1ZSBvZiB0aGlzIGVmZm9ydCBhbmQgbWFkZSBpdCBhbGwgaGFwcGVuLgotCi0KLTEuNDogVEhFIElNUE9SVEFOQ0UgT0YgR0VUVElORyBDT0RFIElOVE8gVEhFIE1BSU5MSU5FCi0KLVNvbWUgY29tcGFuaWVzIGFuZCBkZXZlbG9wZXJzIG9jY2FzaW9uYWxseSB3b25kZXIgd2h5IHRoZXkgc2hvdWxkIGJvdGhlcgotbGVhcm5pbmcgaG93IHRvIHdvcmsgd2l0aCB0aGUga2VybmVsIGNvbW11bml0eSBhbmQgZ2V0IHRoZWlyIGNvZGUgaW50byB0aGUKLW1haW5saW5lIGtlcm5lbCAodGhlICJtYWlubGluZSIgYmVpbmcgdGhlIGtlcm5lbCBtYWludGFpbmVkIGJ5IExpbnVzCi1Ub3J2YWxkcyBhbmQgdXNlZCBhcyBhIGJhc2UgYnkgTGludXggZGlzdHJpYnV0b3JzKS4gIEluIHRoZSBzaG9ydCB0ZXJtLAotY29udHJpYnV0aW5nIGNvZGUgY2FuIGxvb2sgbGlrZSBhbiBhdm9pZGFibGUgZXhwZW5zZTsgaXQgc2VlbXMgZWFzaWVyIHRvCi1qdXN0IGtlZXAgdGhlIGNvZGUgc2VwYXJhdGUgYW5kIHN1cHBvcnQgdXNlcnMgZGlyZWN0bHkuICBUaGUgdHJ1dGggb2YgdGhlCi1tYXR0ZXIgaXMgdGhhdCBrZWVwaW5nIGNvZGUgc2VwYXJhdGUgKCJvdXQgb2YgdHJlZSIpIGlzIGEgZmFsc2UgZWNvbm9teS4KLQotQXMgYSB3YXkgb2YgaWxsdXN0cmF0aW5nIHRoZSBjb3N0cyBvZiBvdXQtb2YtdHJlZSBjb2RlLCBoZXJlIGFyZSBhIGZldwotcmVsZXZhbnQgYXNwZWN0cyBvZiB0aGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3M7IG1vc3Qgb2YgdGhlc2Ugd2lsbCBiZQotZGlzY3Vzc2VkIGluIGdyZWF0ZXIgZGV0YWlsIGxhdGVyIGluIHRoaXMgZG9jdW1lbnQuICBDb25zaWRlcjoKLQotLSBDb2RlIHdoaWNoIGhhcyBiZWVuIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwgaXMgYXZhaWxhYmxlIHRvIGFsbAotICBMaW51eCB1c2Vycy4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBwcmVzZW50IG9uIGFsbCBkaXN0cmlidXRpb25zIHdoaWNoCi0gIGVuYWJsZSBpdC4gIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGRyaXZlciBkaXNrcywgZG93bmxvYWRzLCBvciB0aGUgaGFzc2xlcwotICBvZiBzdXBwb3J0aW5nIG11bHRpcGxlIHZlcnNpb25zIG9mIG11bHRpcGxlIGRpc3RyaWJ1dGlvbnM7IGl0IGFsbCBqdXN0Ci0gIHdvcmtzLCBmb3IgdGhlIGRldmVsb3BlciBhbmQgZm9yIHRoZSB1c2VyLiAgSW5jb3Jwb3JhdGlvbiBpbnRvIHRoZQotICBtYWlubGluZSBzb2x2ZXMgYSBsYXJnZSBudW1iZXIgb2YgZGlzdHJpYnV0aW9uIGFuZCBzdXBwb3J0IHByb2JsZW1zLgotCi0tIFdoaWxlIGtlcm5lbCBkZXZlbG9wZXJzIHN0cml2ZSB0byBtYWludGFpbiBhIHN0YWJsZSBpbnRlcmZhY2UgdG8gdXNlcgotICBzcGFjZSwgdGhlIGludGVybmFsIGtlcm5lbCBBUEkgaXMgaW4gY29uc3RhbnQgZmx1eC4gIFRoZSBsYWNrIG9mIGEgc3RhYmxlCi0gIGludGVybmFsIGludGVyZmFjZSBpcyBhIGRlbGliZXJhdGUgZGVzaWduIGRlY2lzaW9uOyBpdCBhbGxvd3MgZnVuZGFtZW50YWwKLSAgaW1wcm92ZW1lbnRzIHRvIGJlIG1hZGUgYXQgYW55IHRpbWUgYW5kIHJlc3VsdHMgaW4gaGlnaGVyLXF1YWxpdHkgY29kZS4KLSAgQnV0IG9uZSByZXN1bHQgb2YgdGhhdCBwb2xpY3kgaXMgdGhhdCBhbnkgb3V0LW9mLXRyZWUgY29kZSByZXF1aXJlcwotICBjb25zdGFudCB1cGtlZXAgaWYgaXQgaXMgdG8gd29yayB3aXRoIG5ldyBrZXJuZWxzLiAgTWFpbnRhaW5pbmcKLSAgb3V0LW9mLXRyZWUgY29kZSByZXF1aXJlcyBzaWduaWZpY2FudCBhbW91bnRzIG9mIHdvcmsganVzdCB0byBrZWVwIHRoYXQKLSAgY29kZSB3b3JraW5nLgotCi0gIENvZGUgd2hpY2ggaXMgaW4gdGhlIG1haW5saW5lLCBpbnN0ZWFkLCBkb2VzIG5vdCByZXF1aXJlIHRoaXMgd29yayBhcyB0aGUKLSAgcmVzdWx0IG9mIGEgc2ltcGxlIHJ1bGUgcmVxdWlyaW5nIGFueSBkZXZlbG9wZXIgd2hvIG1ha2VzIGFuIEFQSSBjaGFuZ2UKLSAgdG8gYWxzbyBmaXggYW55IGNvZGUgdGhhdCBicmVha3MgYXMgdGhlIHJlc3VsdCBvZiB0aGF0IGNoYW5nZS4gIFNvIGNvZGUKLSAgd2hpY2ggaGFzIGJlZW4gbWVyZ2VkIGludG8gdGhlIG1haW5saW5lIGhhcyBzaWduaWZpY2FudGx5IGxvd2VyCi0gIG1haW50ZW5hbmNlIGNvc3RzLgotCi0tIEJleW9uZCB0aGF0LCBjb2RlIHdoaWNoIGlzIGluIHRoZSBrZXJuZWwgd2lsbCBvZnRlbiBiZSBpbXByb3ZlZCBieSBvdGhlcgotICBkZXZlbG9wZXJzLiAgU3VycHJpc2luZyByZXN1bHRzIGNhbiBjb21lIGZyb20gZW1wb3dlcmluZyB5b3VyIHVzZXIKLSAgY29tbXVuaXR5IGFuZCBjdXN0b21lcnMgdG8gaW1wcm92ZSB5b3VyIHByb2R1Y3QuCi0KLS0gS2VybmVsIGNvZGUgaXMgc3ViamVjdGVkIHRvIHJldmlldywgYm90aCBiZWZvcmUgYW5kIGFmdGVyIG1lcmdpbmcgaW50bwotICB0aGUgbWFpbmxpbmUuICBObyBtYXR0ZXIgaG93IHN0cm9uZyB0aGUgb3JpZ2luYWwgZGV2ZWxvcGVyJ3Mgc2tpbGxzIGFyZSwKLSAgdGhpcyByZXZpZXcgcHJvY2VzcyBpbnZhcmlhYmx5IGZpbmRzIHdheXMgaW4gd2hpY2ggdGhlIGNvZGUgY2FuIGJlCi0gIGltcHJvdmVkLiAgT2Z0ZW4gcmV2aWV3IGZpbmRzIHNldmVyZSBidWdzIGFuZCBzZWN1cml0eSBwcm9ibGVtcy4gIFRoaXMgaXMKLSAgZXNwZWNpYWxseSB0cnVlIGZvciBjb2RlIHdoaWNoIGhhcyBiZWVuIGRldmVsb3BlZCBpbiBhIGNsb3NlZAotICBlbnZpcm9ubWVudDsgc3VjaCBjb2RlIGJlbmVmaXRzIHN0cm9uZ2x5IGZyb20gcmV2aWV3IGJ5IG91dHNpZGUKLSAgZGV2ZWxvcGVycy4gIE91dC1vZi10cmVlIGNvZGUgaXMgbG93ZXItcXVhbGl0eSBjb2RlLgotCi0tIFBhcnRpY2lwYXRpb24gaW4gdGhlIGRldmVsb3BtZW50IHByb2Nlc3MgaXMgeW91ciB3YXkgdG8gaW5mbHVlbmNlIHRoZQotICBkaXJlY3Rpb24gb2Yga2VybmVsIGRldmVsb3BtZW50LiAgVXNlcnMgd2hvIGNvbXBsYWluIGZyb20gdGhlIHNpZGVsaW5lcwotICBhcmUgaGVhcmQsIGJ1dCBhY3RpdmUgZGV2ZWxvcGVycyBoYXZlIGEgc3Ryb25nZXIgdm9pY2UgLSBhbmQgdGhlIGFiaWxpdHkKLSAgdG8gaW1wbGVtZW50IGNoYW5nZXMgd2hpY2ggbWFrZSB0aGUga2VybmVsIHdvcmsgYmV0dGVyIGZvciB0aGVpciBuZWVkcy4KLQotLSBXaGVuIGNvZGUgaXMgbWFpbnRhaW5lZCBzZXBhcmF0ZWx5LCB0aGUgcG9zc2liaWxpdHkgdGhhdCBhIHRoaXJkIHBhcnR5Ci0gIHdpbGwgY29udHJpYnV0ZSBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBvZiBhIHNpbWlsYXIgZmVhdHVyZSBhbHdheXMKLSAgZXhpc3RzLiAgU2hvdWxkIHRoYXQgaGFwcGVuLCBnZXR0aW5nIHlvdXIgY29kZSBtZXJnZWQgd2lsbCBiZWNvbWUgbXVjaAotICBoYXJkZXIgLSB0byB0aGUgcG9pbnQgb2YgaW1wb3NzaWJpbGl0eS4gIFRoZW4geW91IHdpbGwgYmUgZmFjZWQgd2l0aCB0aGUKLSAgdW5wbGVhc2FudCBhbHRlcm5hdGl2ZXMgb2YgZWl0aGVyICgxKSBtYWludGFpbmluZyBhIG5vbnN0YW5kYXJkIGZlYXR1cmUKLSAgb3V0IG9mIHRyZWUgaW5kZWZpbml0ZWx5LCBvciAoMikgYWJhbmRvbmluZyB5b3VyIGNvZGUgYW5kIG1pZ3JhdGluZyB5b3VyCi0gIHVzZXJzIG92ZXIgdG8gdGhlIGluLXRyZWUgdmVyc2lvbi4KLQotLSBDb250cmlidXRpb24gb2YgY29kZSBpcyB0aGUgZnVuZGFtZW50YWwgYWN0aW9uIHdoaWNoIG1ha2VzIHRoZSB3aG9sZQotICBwcm9jZXNzIHdvcmsuICBCeSBjb250cmlidXRpbmcgeW91ciBjb2RlIHlvdSBjYW4gYWRkIG5ldyBmdW5jdGlvbmFsaXR5IHRvCi0gIHRoZSBrZXJuZWwgYW5kIHByb3ZpZGUgY2FwYWJpbGl0aWVzIGFuZCBleGFtcGxlcyB3aGljaCBhcmUgb2YgdXNlIHRvCi0gIG90aGVyIGtlcm5lbCBkZXZlbG9wZXJzLiAgSWYgeW91IGhhdmUgZGV2ZWxvcGVkIGNvZGUgZm9yIExpbnV4IChvciBhcmUKLSAgdGhpbmtpbmcgYWJvdXQgZG9pbmcgc28pLCB5b3UgY2xlYXJseSBoYXZlIGFuIGludGVyZXN0IGluIHRoZSBjb250aW51ZWQKLSAgc3VjY2VzcyBvZiB0aGlzIHBsYXRmb3JtOyBjb250cmlidXRpbmcgY29kZSBpcyBvbmUgb2YgdGhlIGJlc3Qgd2F5cyB0bwotICBoZWxwIGVuc3VyZSB0aGF0IHN1Y2Nlc3MuCi0KLUFsbCBvZiB0aGUgcmVhc29uaW5nIGFib3ZlIGFwcGxpZXMgdG8gYW55IG91dC1vZi10cmVlIGtlcm5lbCBjb2RlLAotaW5jbHVkaW5nIGNvZGUgd2hpY2ggaXMgZGlzdHJpYnV0ZWQgaW4gcHJvcHJpZXRhcnksIGJpbmFyeS1vbmx5IGZvcm0uCi1UaGVyZSBhcmUsIGhvd2V2ZXIsIGFkZGl0aW9uYWwgZmFjdG9ycyB3aGljaCBzaG91bGQgYmUgdGFrZW4gaW50byBhY2NvdW50Ci1iZWZvcmUgY29uc2lkZXJpbmcgYW55IHNvcnQgb2YgYmluYXJ5LW9ubHkga2VybmVsIGNvZGUgZGlzdHJpYnV0aW9uLiAgVGhlc2UKLWluY2x1ZGU6Ci0KLS0gVGhlIGxlZ2FsIGlzc3VlcyBhcm91bmQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBwcm9wcmlldGFyeSBrZXJuZWwgbW9kdWxlcwotICBhcmUgY2xvdWR5IGF0IGJlc3Q7IHF1aXRlIGEgZmV3IGtlcm5lbCBjb3B5cmlnaHQgaG9sZGVycyBiZWxpZXZlIHRoYXQKLSAgbW9zdCBiaW5hcnktb25seSBtb2R1bGVzIGFyZSBkZXJpdmVkIHByb2R1Y3RzIG9mIHRoZSBrZXJuZWwgYW5kIHRoYXQsIGFzCi0gIGEgcmVzdWx0LCB0aGVpciBkaXN0cmlidXRpb24gaXMgYSB2aW9sYXRpb24gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICBsaWNlbnNlIChhYm91dCB3aGljaCBtb3JlIHdpbGwgYmUgc2FpZCBiZWxvdykuICBZb3VyIGF1dGhvciBpcyBub3QgYQotICBsYXd5ZXIsIGFuZCBub3RoaW5nIGluIHRoaXMgZG9jdW1lbnQgY2FuIHBvc3NpYmx5IGJlIGNvbnNpZGVyZWQgdG8gYmUKLSAgbGVnYWwgYWR2aWNlLiAgVGhlIHRydWUgbGVnYWwgc3RhdHVzIG9mIGNsb3NlZC1zb3VyY2UgbW9kdWxlcyBjYW4gb25seSBiZQotICBkZXRlcm1pbmVkIGJ5IHRoZSBjb3VydHMuICBCdXQgdGhlIHVuY2VydGFpbnR5IHdoaWNoIGhhdW50cyB0aG9zZSBtb2R1bGVzCi0gIGlzIHRoZXJlIHJlZ2FyZGxlc3MuCi0KLS0gQmluYXJ5IG1vZHVsZXMgZ3JlYXRseSBpbmNyZWFzZSB0aGUgZGlmZmljdWx0eSBvZiBkZWJ1Z2dpbmcga2VybmVsCi0gIHByb2JsZW1zLCB0byB0aGUgcG9pbnQgdGhhdCBtb3N0IGtlcm5lbCBkZXZlbG9wZXJzIHdpbGwgbm90IGV2ZW4gdHJ5LiAgU28KLSAgdGhlIGRpc3RyaWJ1dGlvbiBvZiBiaW5hcnktb25seSBtb2R1bGVzIHdpbGwgbWFrZSBpdCBoYXJkZXIgZm9yIHlvdXIKLSAgdXNlcnMgdG8gZ2V0IHN1cHBvcnQgZnJvbSB0aGUgY29tbXVuaXR5LgotCi0tIFN1cHBvcnQgaXMgYWxzbyBoYXJkZXIgZm9yIGRpc3RyaWJ1dG9ycyBvZiBiaW5hcnktb25seSBtb2R1bGVzLCB3aG8gbXVzdAotICBwcm92aWRlIGEgdmVyc2lvbiBvZiB0aGUgbW9kdWxlIGZvciBldmVyeSBkaXN0cmlidXRpb24gYW5kIGV2ZXJ5IGtlcm5lbAotICB2ZXJzaW9uIHRoZXkgd2lzaCB0byBzdXBwb3J0LiAgRG96ZW5zIG9mIGJ1aWxkcyBvZiBhIHNpbmdsZSBtb2R1bGUgY2FuCi0gIGJlIHJlcXVpcmVkIHRvIHByb3ZpZGUgcmVhc29uYWJseSBjb21wcmVoZW5zaXZlIGNvdmVyYWdlLCBhbmQgeW91ciB1c2VycwotICB3aWxsIGhhdmUgdG8gdXBncmFkZSB5b3VyIG1vZHVsZSBzZXBhcmF0ZWx5IGV2ZXJ5IHRpbWUgdGhleSB1cGdyYWRlIHRoZWlyCi0gIGtlcm5lbC4KLQotLSBFdmVyeXRoaW5nIHRoYXQgd2FzIHNhaWQgYWJvdmUgYWJvdXQgY29kZSByZXZpZXcgYXBwbGllcyBkb3VibHkgdG8KLSAgY2xvc2VkLXNvdXJjZSBjb2RlLiAgU2luY2UgdGhpcyBjb2RlIGlzIG5vdCBhdmFpbGFibGUgYXQgYWxsLCBpdCBjYW5ub3QKLSAgaGF2ZSBiZWVuIHJldmlld2VkIGJ5IHRoZSBjb21tdW5pdHkgYW5kIHdpbGwsIGJleW9uZCBkb3VidCwgaGF2ZSBzZXJpb3VzCi0gIHByb2JsZW1zLgotCi1NYWtlcnMgb2YgZW1iZWRkZWQgc3lzdGVtcywgaW4gcGFydGljdWxhciwgbWF5IGJlIHRlbXB0ZWQgdG8gZGlzcmVnYXJkIG11Y2gKLW9mIHdoYXQgaGFzIGJlZW4gc2FpZCBpbiB0aGlzIHNlY3Rpb24gaW4gdGhlIGJlbGllZiB0aGF0IHRoZXkgYXJlIHNoaXBwaW5nCi1hIHNlbGYtY29udGFpbmVkIHByb2R1Y3Qgd2hpY2ggdXNlcyBhIGZyb3plbiBrZXJuZWwgdmVyc2lvbiBhbmQgcmVxdWlyZXMgbm8KLW1vcmUgZGV2ZWxvcG1lbnQgYWZ0ZXIgaXRzIHJlbGVhc2UuICBUaGlzIGFyZ3VtZW50IG1pc3NlcyB0aGUgdmFsdWUgb2YKLXdpZGVzcHJlYWQgY29kZSByZXZpZXcgYW5kIHRoZSB2YWx1ZSBvZiBhbGxvd2luZyB5b3VyIHVzZXJzIHRvIGFkZAotY2FwYWJpbGl0aWVzIHRvIHlvdXIgcHJvZHVjdC4gIEJ1dCB0aGVzZSBwcm9kdWN0cywgdG9vLCBoYXZlIGEgbGltaXRlZAotY29tbWVyY2lhbCBsaWZlLCBhZnRlciB3aGljaCBhIG5ldyB2ZXJzaW9uIG11c3QgYmUgcmVsZWFzZWQuICBBdCB0aGF0Ci1wb2ludCwgdmVuZG9ycyB3aG9zZSBjb2RlIGlzIGluIHRoZSBtYWlubGluZSBhbmQgd2VsbCBtYWludGFpbmVkIHdpbGwgYmUKLW11Y2ggYmV0dGVyIHBvc2l0aW9uZWQgdG8gZ2V0IHRoZSBuZXcgcHJvZHVjdCByZWFkeSBmb3IgbWFya2V0IHF1aWNrbHkuCi0KLQotMS41OiBMSUNFTlNJTkcKLQotQ29kZSBpcyBjb250cmlidXRlZCB0byB0aGUgTGludXgga2VybmVsIHVuZGVyIGEgbnVtYmVyIG9mIGxpY2Vuc2VzLCBidXQgYWxsCi1jb2RlIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLShHUEx2MiksIHdoaWNoIGlzIHRoZSBsaWNlbnNlIGNvdmVyaW5nIHRoZSBrZXJuZWwgZGlzdHJpYnV0aW9uIGFzIGEgd2hvbGUuCi1JbiBwcmFjdGljZSwgdGhhdCBtZWFucyB0aGF0IGFsbCBjb2RlIGNvbnRyaWJ1dGlvbnMgYXJlIGNvdmVyZWQgZWl0aGVyIGJ5Ci1HUEx2MiAod2l0aCwgb3B0aW9uYWxseSwgbGFuZ3VhZ2UgYWxsb3dpbmcgZGlzdHJpYnV0aW9uIHVuZGVyIGxhdGVyCi12ZXJzaW9ucyBvZiB0aGUgR1BMKSBvciB0aGUgdGhyZWUtY2xhdXNlIEJTRCBsaWNlbnNlLiAgQW55IGNvbnRyaWJ1dGlvbnMKLXdoaWNoIGFyZSBub3QgY292ZXJlZCBieSBhIGNvbXBhdGlibGUgbGljZW5zZSB3aWxsIG5vdCBiZSBhY2NlcHRlZCBpbnRvIHRoZQota2VybmVsLgotCi1Db3B5cmlnaHQgYXNzaWdubWVudHMgYXJlIG5vdCByZXF1aXJlZCAob3IgcmVxdWVzdGVkKSBmb3IgY29kZSBjb250cmlidXRlZAotdG8gdGhlIGtlcm5lbC4gIEFsbCBjb2RlIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwgcmV0YWlucyBpdHMKLW9yaWdpbmFsIG93bmVyc2hpcDsgYXMgYSByZXN1bHQsIHRoZSBrZXJuZWwgbm93IGhhcyB0aG91c2FuZHMgb2Ygb3duZXJzLgotCi1PbmUgaW1wbGljYXRpb24gb2YgdGhpcyBvd25lcnNoaXAgc3RydWN0dXJlIGlzIHRoYXQgYW55IGF0dGVtcHQgdG8gY2hhbmdlCi10aGUgbGljZW5zaW5nIG9mIHRoZSBrZXJuZWwgaXMgZG9vbWVkIHRvIGFsbW9zdCBjZXJ0YWluIGZhaWx1cmUuICBUaGVyZSBhcmUKLWZldyBwcmFjdGljYWwgc2NlbmFyaW9zIHdoZXJlIHRoZSBhZ3JlZW1lbnQgb2YgYWxsIGNvcHlyaWdodCBob2xkZXJzIGNvdWxkCi1iZSBvYnRhaW5lZCAob3IgdGhlaXIgY29kZSByZW1vdmVkIGZyb20gdGhlIGtlcm5lbCkuICBTbywgaW4gcGFydGljdWxhciwKLXRoZXJlIGlzIG5vIHByb3NwZWN0IG9mIGEgbWlncmF0aW9uIHRvIHZlcnNpb24gMyBvZiB0aGUgR1BMIGluIHRoZQotZm9yZXNlZWFibGUgZnV0dXJlLgotCi1JdCBpcyBpbXBlcmF0aXZlIHRoYXQgYWxsIGNvZGUgY29udHJpYnV0ZWQgdG8gdGhlIGtlcm5lbCBiZSBsZWdpdGltYXRlbHkKLWZyZWUgc29mdHdhcmUuICBGb3IgdGhhdCByZWFzb24sIGNvZGUgZnJvbSBhbm9ueW1vdXMgKG9yIHBzZXVkb255bW91cykKLWNvbnRyaWJ1dG9ycyB3aWxsIG5vdCBiZSBhY2NlcHRlZC4gIEFsbCBjb250cmlidXRvcnMgYXJlIHJlcXVpcmVkIHRvICJzaWduCi1vZmYiIG9uIHRoZWlyIGNvZGUsIHN0YXRpbmcgdGhhdCB0aGUgY29kZSBjYW4gYmUgZGlzdHJpYnV0ZWQgd2l0aCB0aGUKLWtlcm5lbCB1bmRlciB0aGUgR1BMLiAgQ29kZSB3aGljaCBoYXMgbm90IGJlZW4gbGljZW5zZWQgYXMgZnJlZSBzb2Z0d2FyZSBieQotaXRzIG93bmVyLCBvciB3aGljaCByaXNrcyBjcmVhdGluZyBjb3B5cmlnaHQtcmVsYXRlZCBwcm9ibGVtcyBmb3IgdGhlCi1rZXJuZWwgKHN1Y2ggYXMgY29kZSB3aGljaCBkZXJpdmVzIGZyb20gcmV2ZXJzZS1lbmdpbmVlcmluZyBlZmZvcnRzIGxhY2tpbmcKLXByb3BlciBzYWZlZ3VhcmRzKSBjYW5ub3QgYmUgY29udHJpYnV0ZWQuCi0KLVF1ZXN0aW9ucyBhYm91dCBjb3B5cmlnaHQtcmVsYXRlZCBpc3N1ZXMgYXJlIGNvbW1vbiBvbiBMaW51eCBkZXZlbG9wbWVudAotbWFpbGluZyBsaXN0cy4gIFN1Y2ggcXVlc3Rpb25zIHdpbGwgbm9ybWFsbHkgcmVjZWl2ZSBubyBzaG9ydGFnZSBvZgotYW5zd2VycywgYnV0IG9uZSBzaG91bGQgYmVhciBpbiBtaW5kIHRoYXQgdGhlIHBlb3BsZSBhbnN3ZXJpbmcgdGhvc2UKLXF1ZXN0aW9ucyBhcmUgbm90IGxhd3llcnMgYW5kIGNhbm5vdCBwcm92aWRlIGxlZ2FsIGFkdmljZS4gIElmIHlvdSBoYXZlCi1sZWdhbCBxdWVzdGlvbnMgcmVsYXRpbmcgdG8gTGludXggc291cmNlIGNvZGUsIHRoZXJlIGlzIG5vIHN1YnN0aXR1dGUgZm9yCi10YWxraW5nIHdpdGggYSBsYXd5ZXIgd2hvIHVuZGVyc3RhbmRzIHRoaXMgZmllbGQuICBSZWx5aW5nIG9uIGFuc3dlcnMKLW9idGFpbmVkIG9uIHRlY2huaWNhbCBtYWlsaW5nIGxpc3RzIGlzIGEgcmlza3kgYWZmYWlyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzEuSW50cm8ucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzEuSW50cm8ucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjQyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMS5JbnRyby5yc3QKQEAgLTAsMCArMSwyNjYgQEAKK0ludHJvZHV0aW9uCis9PT09PT09PT09PQorCitFeGVjdXRpdmUgc3VtbWFyeQorLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHJlc3Qgb2YgdGhpcyBzZWN0aW9uIGNvdmVycyB0aGUgc2NvcGUgb2YgdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzCithbmQgdGhlIGtpbmRzIG9mIGZydXN0cmF0aW9ucyB0aGF0IGRldmVsb3BlcnMgYW5kIHRoZWlyIGVtcGxveWVycyBjYW4KK2VuY291bnRlciB0aGVyZS4gIFRoZXJlIGFyZSBhIGdyZWF0IG1hbnkgcmVhc29ucyB3aHkga2VybmVsIGNvZGUgc2hvdWxkIGJlCittZXJnZWQgaW50byB0aGUgb2ZmaWNpYWwgKCJtYWlubGluZSIpIGtlcm5lbCwgaW5jbHVkaW5nIGF1dG9tYXRpYworYXZhaWxhYmlsaXR5IHRvIHVzZXJzLCBjb21tdW5pdHkgc3VwcG9ydCBpbiBtYW55IGZvcm1zLCBhbmQgdGhlIGFiaWxpdHkgdG8KK2luZmx1ZW5jZSB0aGUgZGlyZWN0aW9uIG9mIGtlcm5lbCBkZXZlbG9wbWVudC4gIENvZGUgY29udHJpYnV0ZWQgdG8gdGhlCitMaW51eCBrZXJuZWwgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhIEdQTC1jb21wYXRpYmxlIGxpY2Vuc2UuCisKKzpyZWY6YGRldmVsb3BtZW50X3Byb2Nlc3NgIGludHJvZHVjZXMgdGhlIGRldmVsb3BtZW50IHByb2Nlc3MsIHRoZSBrZXJuZWwKK3JlbGVhc2UgY3ljbGUsIGFuZCB0aGUgbWVjaGFuaWNzIG9mIHRoZSBtZXJnZSB3aW5kb3cuICBUaGUgdmFyaW91cyBwaGFzZXMgaW4KK3RoZSBwYXRjaCBkZXZlbG9wbWVudCwgcmV2aWV3LCBhbmQgbWVyZ2luZyBjeWNsZSBhcmUgY292ZXJlZC4gIFRoZXJlIGlzIHNvbWUKK2Rpc2N1c3Npb24gb2YgdG9vbHMgYW5kIG1haWxpbmcgbGlzdHMuICBEZXZlbG9wZXJzIHdhbnRpbmcgdG8gZ2V0IHN0YXJ0ZWQKK3dpdGgga2VybmVsIGRldmVsb3BtZW50IGFyZSBlbmNvdXJhZ2VkIHRvIHRyYWNrIGRvd24gYW5kIGZpeCBidWdzIGFzIGFuCitpbml0aWFsIGV4ZXJjaXNlLgorCis6cmVmOmBkZXZlbG9wbWVudF9lYXJseV9zdGFnZWAgY292ZXJzIGVhcmx5LXN0YWdlIHByb2plY3QgcGxhbm5pbmcsIHdpdGggYW4KK2VtcGhhc2lzIG9uIGludm9sdmluZyB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGFzIHNvb24gYXMgcG9zc2libGUuCisKKzpyZWY6YGRldmVsb3BtZW50X2NvZGluZ2AgaXMgYWJvdXQgdGhlIGNvZGluZyBwcm9jZXNzOyBzZXZlcmFsIHBpdGZhbGxzIHdoaWNoCitoYXZlIGJlZW4gZW5jb3VudGVyZWQgYnkgb3RoZXIgZGV2ZWxvcGVycyBhcmUgZGlzY3Vzc2VkLiAgU29tZSByZXF1aXJlbWVudHMgZm9yCitwYXRjaGVzIGFyZSBjb3ZlcmVkLCBhbmQgdGhlcmUgaXMgYW4gaW50cm9kdWN0aW9uIHRvIHNvbWUgb2YgdGhlIHRvb2xzCit3aGljaCBjYW4gaGVscCB0byBlbnN1cmUgdGhhdCBrZXJuZWwgcGF0Y2hlcyBhcmUgY29ycmVjdC4KKworOnJlZjpgZGV2ZWxvcG1lbnRfcG9zdGluZ2AgdGFsa3MgYWJvdXQgdGhlIHByb2Nlc3Mgb2YgcG9zdGluZyBwYXRjaGVzIGZvcgorcmV2aWV3LiBUbyBiZSB0YWtlbiBzZXJpb3VzbHkgYnkgdGhlIGRldmVsb3BtZW50IGNvbW11bml0eSwgcGF0Y2hlcyBtdXN0IGJlCitwcm9wZXJseSBmb3JtYXR0ZWQgYW5kIGRlc2NyaWJlZCwgYW5kIHRoZXkgbXVzdCBiZSBzZW50IHRvIHRoZSByaWdodCBwbGFjZS4KK0ZvbGxvd2luZyB0aGUgYWR2aWNlIGluIHRoaXMgc2VjdGlvbiBzaG91bGQgaGVscCB0byBlbnN1cmUgdGhlIGJlc3QKK3Bvc3NpYmxlIHJlY2VwdGlvbiBmb3IgeW91ciB3b3JrLgorCis6cmVmOmBkZXZlbG9wbWVudF9mb2xsb3d0aHJvdWdoYCBjb3ZlcnMgd2hhdCBoYXBwZW5zIGFmdGVyIHBvc3RpbmcgcGF0Y2hlczsgdGhlCitqb2IgaXMgZmFyIGZyb20gZG9uZSBhdCB0aGF0IHBvaW50LiAgV29ya2luZyB3aXRoIHJldmlld2VycyBpcyBhIGNydWNpYWwgcGFydAorb2YgdGhlIGRldmVsb3BtZW50IHByb2Nlc3M7IHRoaXMgc2VjdGlvbiBvZmZlcnMgYSBudW1iZXIgb2YgdGlwcyBvbiBob3cgdG8KK2F2b2lkIHByb2JsZW1zIGF0IHRoaXMgaW1wb3J0YW50IHN0YWdlLiAgRGV2ZWxvcGVycyBhcmUgY2F1dGlvbmVkIGFnYWluc3QKK2Fzc3VtaW5nIHRoYXQgdGhlIGpvYiBpcyBkb25lIHdoZW4gYSBwYXRjaCBpcyBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUuCisKKzpyZWY6YGRldmVsb3BtZW50X2FkdmFuY2VkdG9waWNzYCBpbnRyb2R1Y2VzIGEgY291cGxlIG9mICJhZHZhbmNlZCIgdG9waWNzOgorbWFuYWdpbmcgcGF0Y2hlcyB3aXRoIGdpdCBhbmQgcmV2aWV3aW5nIHBhdGNoZXMgcG9zdGVkIGJ5IG90aGVycy4KKworOnJlZjpgZGV2ZWxvcG1lbnRfY29uY2x1c2lvbmAgY29uY2x1ZGVzIHRoZSBkb2N1bWVudCB3aXRoIHBvaW50ZXJzIHRvIHNvdXJjZXMKK2ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGtlcm5lbCBkZXZlbG9wbWVudC4KKworV2hhdCB0aGlzIGRvY3VtZW50IGlzIGFib3V0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIExpbnV4IGtlcm5lbCwgYXQgb3ZlciA4IG1pbGxpb24gbGluZXMgb2YgY29kZSBhbmQgd2VsbCBvdmVyIDEwMDAKK2NvbnRyaWJ1dG9ycyB0byBlYWNoIHJlbGVhc2UsIGlzIG9uZSBvZiB0aGUgbGFyZ2VzdCBhbmQgbW9zdCBhY3RpdmUgZnJlZQorc29mdHdhcmUgcHJvamVjdHMgaW4gZXhpc3RlbmNlLiAgU2luY2UgaXRzIGh1bWJsZSBiZWdpbm5pbmcgaW4gMTk5MSwgdGhpcwora2VybmVsIGhhcyBldm9sdmVkIGludG8gYSBiZXN0LW9mLWJyZWVkIG9wZXJhdGluZyBzeXN0ZW0gY29tcG9uZW50IHdoaWNoCitydW5zIG9uIHBvY2tldC1zaXplZCBkaWdpdGFsIG11c2ljIHBsYXllcnMsIGRlc2t0b3AgUENzLCB0aGUgbGFyZ2VzdAorc3VwZXJjb21wdXRlcnMgaW4gZXhpc3RlbmNlLCBhbmQgYWxsIHR5cGVzIG9mIHN5c3RlbXMgaW4gYmV0d2Vlbi4gIEl0IGlzIGEKK3JvYnVzdCwgZWZmaWNpZW50LCBhbmQgc2NhbGFibGUgc29sdXRpb24gZm9yIGFsbW9zdCBhbnkgc2l0dWF0aW9uLgorCitXaXRoIHRoZSBncm93dGggb2YgTGludXggaGFzIGNvbWUgYW4gaW5jcmVhc2UgaW4gdGhlIG51bWJlciBvZiBkZXZlbG9wZXJzCisoYW5kIGNvbXBhbmllcykgd2lzaGluZyB0byBwYXJ0aWNpcGF0ZSBpbiBpdHMgZGV2ZWxvcG1lbnQuICBIYXJkd2FyZQordmVuZG9ycyB3YW50IHRvIGVuc3VyZSB0aGF0IExpbnV4IHN1cHBvcnRzIHRoZWlyIHByb2R1Y3RzIHdlbGwsIG1ha2luZwordGhvc2UgcHJvZHVjdHMgYXR0cmFjdGl2ZSB0byBMaW51eCB1c2Vycy4gIEVtYmVkZGVkIHN5c3RlbXMgdmVuZG9ycywgd2hvCit1c2UgTGludXggYXMgYSBjb21wb25lbnQgaW4gYW4gaW50ZWdyYXRlZCBwcm9kdWN0LCB3YW50IExpbnV4IHRvIGJlIGFzCitjYXBhYmxlIGFuZCB3ZWxsLXN1aXRlZCB0byB0aGUgdGFzayBhdCBoYW5kIGFzIHBvc3NpYmxlLiAgRGlzdHJpYnV0b3JzIGFuZAorb3RoZXIgc29mdHdhcmUgdmVuZG9ycyB3aG8gYmFzZSB0aGVpciBwcm9kdWN0cyBvbiBMaW51eCBoYXZlIGEgY2xlYXIKK2ludGVyZXN0IGluIHRoZSBjYXBhYmlsaXRpZXMsIHBlcmZvcm1hbmNlLCBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlIExpbnV4CitrZXJuZWwuICBBbmQgZW5kIHVzZXJzLCB0b28sIHdpbGwgb2Z0ZW4gd2lzaCB0byBjaGFuZ2UgTGludXggdG8gbWFrZSBpdAorYmV0dGVyIHN1aXQgdGhlaXIgbmVlZHMuCisKK09uZSBvZiB0aGUgbW9zdCBjb21wZWxsaW5nIGZlYXR1cmVzIG9mIExpbnV4IGlzIHRoYXQgaXQgaXMgYWNjZXNzaWJsZSB0bwordGhlc2UgZGV2ZWxvcGVyczsgYW55Ym9keSB3aXRoIHRoZSByZXF1aXNpdGUgc2tpbGxzIGNhbiBpbXByb3ZlIExpbnV4IGFuZAoraW5mbHVlbmNlIHRoZSBkaXJlY3Rpb24gb2YgaXRzIGRldmVsb3BtZW50LiAgUHJvcHJpZXRhcnkgcHJvZHVjdHMgY2Fubm90CitvZmZlciB0aGlzIGtpbmQgb2Ygb3Blbm5lc3MsIHdoaWNoIGlzIGEgY2hhcmFjdGVyaXN0aWMgb2YgdGhlIGZyZWUgc29mdHdhcmUKK3Byb2Nlc3MuICBCdXQsIGlmIGFueXRoaW5nLCB0aGUga2VybmVsIGlzIGV2ZW4gbW9yZSBvcGVuIHRoYW4gbW9zdCBvdGhlcgorZnJlZSBzb2Z0d2FyZSBwcm9qZWN0cy4gIEEgdHlwaWNhbCB0aHJlZS1tb250aCBrZXJuZWwgZGV2ZWxvcG1lbnQgY3ljbGUgY2FuCitpbnZvbHZlIG92ZXIgMTAwMCBkZXZlbG9wZXJzIHdvcmtpbmcgZm9yIG1vcmUgdGhhbiAxMDAgZGlmZmVyZW50IGNvbXBhbmllcworKG9yIGZvciBubyBjb21wYW55IGF0IGFsbCkuCisKK1dvcmtpbmcgd2l0aCB0aGUga2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eSBpcyBub3QgZXNwZWNpYWxseSBoYXJkLiAgQnV0LAordGhhdCBub3R3aXRoc3RhbmRpbmcsIG1hbnkgcG90ZW50aWFsIGNvbnRyaWJ1dG9ycyBoYXZlIGV4cGVyaWVuY2VkCitkaWZmaWN1bHRpZXMgd2hlbiB0cnlpbmcgdG8gZG8ga2VybmVsIHdvcmsuICBUaGUga2VybmVsIGNvbW11bml0eSBoYXMKK2V2b2x2ZWQgaXRzIG93biBkaXN0aW5jdCB3YXlzIG9mIG9wZXJhdGluZyB3aGljaCBhbGxvdyBpdCB0byBmdW5jdGlvbgorc21vb3RobHkgKGFuZCBwcm9kdWNlIGEgaGlnaC1xdWFsaXR5IHByb2R1Y3QpIGluIGFuIGVudmlyb25tZW50IHdoZXJlCit0aG91c2FuZHMgb2YgbGluZXMgb2YgY29kZSBhcmUgYmVpbmcgY2hhbmdlZCBldmVyeSBkYXkuICBTbyBpdCBpcyBub3QKK3N1cnByaXNpbmcgdGhhdCBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkaWZmZXJzIGdyZWF0bHkgZnJvbQorcHJvcHJpZXRhcnkgZGV2ZWxvcG1lbnQgbWV0aG9kcy4KKworVGhlIGtlcm5lbCdzIGRldmVsb3BtZW50IHByb2Nlc3MgbWF5IGNvbWUgYWNyb3NzIGFzIHN0cmFuZ2UgYW5kCitpbnRpbWlkYXRpbmcgdG8gbmV3IGRldmVsb3BlcnMsIGJ1dCB0aGVyZSBhcmUgZ29vZCByZWFzb25zIGFuZCBzb2xpZAorZXhwZXJpZW5jZSBiZWhpbmQgaXQuICBBIGRldmVsb3BlciB3aG8gZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUga2VybmVsCitjb21tdW5pdHkncyB3YXlzIChvciwgd29yc2UsIHdobyB0cmllcyB0byBmbG91dCBvciBjaXJjdW12ZW50IHRoZW0pIHdpbGwKK2hhdmUgYSBmcnVzdHJhdGluZyBleHBlcmllbmNlIGluIHN0b3JlLiAgVGhlIGRldmVsb3BtZW50IGNvbW11bml0eSwgd2hpbGUKK2JlaW5nIGhlbHBmdWwgdG8gdGhvc2Ugd2hvIGFyZSB0cnlpbmcgdG8gbGVhcm4sIGhhcyBsaXR0bGUgdGltZSBmb3IgdGhvc2UKK3dobyB3aWxsIG5vdCBsaXN0ZW4gb3Igd2hvIGRvIG5vdCBjYXJlIGFib3V0IHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLgorCitJdCBpcyBob3BlZCB0aGF0IHRob3NlIHdobyByZWFkIHRoaXMgZG9jdW1lbnQgd2lsbCBiZSBhYmxlIHRvIGF2b2lkIHRoYXQKK2ZydXN0cmF0aW5nIGV4cGVyaWVuY2UuICBUaGVyZSBpcyBhIGxvdCBvZiBtYXRlcmlhbCBoZXJlLCBidXQgdGhlIGVmZm9ydAoraW52b2x2ZWQgaW4gcmVhZGluZyBpdCB3aWxsIGJlIHJlcGFpZCBpbiBzaG9ydCBvcmRlci4gIFRoZSBkZXZlbG9wbWVudAorY29tbXVuaXR5IGlzIGFsd2F5cyBpbiBuZWVkIG9mIGRldmVsb3BlcnMgd2hvIHdpbGwgaGVscCB0byBtYWtlIHRoZSBrZXJuZWwKK2JldHRlcjsgdGhlIGZvbGxvd2luZyB0ZXh0IHNob3VsZCBoZWxwIHlvdSAtIG9yIHRob3NlIHdobyB3b3JrIGZvciB5b3UgLQoram9pbiBvdXIgY29tbXVuaXR5LgorCitDcmVkaXRzCistLS0tLS0tCisKK1RoaXMgZG9jdW1lbnQgd2FzIHdyaXR0ZW4gYnkgSm9uYXRoYW4gQ29yYmV0LCBjb3JiZXRAbHduLm5ldC4gIEl0IGhhcyBiZWVuCitpbXByb3ZlZCBieSBjb21tZW50cyBmcm9tIEpvaGFubmVzIEJlcmcsIEphbWVzIEJlcnJ5LCBBbGV4IENoaWFuZywgUm9sYW5kCitEcmVpZXIsIFJhbmR5IER1bmxhcCwgSmFrZSBFZGdlLCBKaXJpIEtvc2luYSwgTWF0dCBNYWNrYWxsLCBBcnRodXIgTWFyc2gsCitBbWFuZGEgTWNQaGVyc29uLCBBbmRyZXcgTW9ydG9uLCBBbmRyZXcgUHJpY2UsIFRzdWdpa2F6dSBTaGliYXRhLCBhbmQKK0pvY2hlbiBWb8OfLgorCitUaGlzIHdvcmsgd2FzIHN1cHBvcnRlZCBieSB0aGUgTGludXggRm91bmRhdGlvbjsgdGhhbmtzIGVzcGVjaWFsbHkgdG8KK0FtYW5kYSBNY1BoZXJzb24sIHdobyBzYXcgdGhlIHZhbHVlIG9mIHRoaXMgZWZmb3J0IGFuZCBtYWRlIGl0IGFsbCBoYXBwZW4uCisKK1RoZSBpbXBvcnRhbmNlIG9mIGdldHRpbmcgY29kZSBpbnRvIHRoZSBtYWlubGluZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvbWUgY29tcGFuaWVzIGFuZCBkZXZlbG9wZXJzIG9jY2FzaW9uYWxseSB3b25kZXIgd2h5IHRoZXkgc2hvdWxkIGJvdGhlcgorbGVhcm5pbmcgaG93IHRvIHdvcmsgd2l0aCB0aGUga2VybmVsIGNvbW11bml0eSBhbmQgZ2V0IHRoZWlyIGNvZGUgaW50byB0aGUKK21haW5saW5lIGtlcm5lbCAodGhlICJtYWlubGluZSIgYmVpbmcgdGhlIGtlcm5lbCBtYWludGFpbmVkIGJ5IExpbnVzCitUb3J2YWxkcyBhbmQgdXNlZCBhcyBhIGJhc2UgYnkgTGludXggZGlzdHJpYnV0b3JzKS4gIEluIHRoZSBzaG9ydCB0ZXJtLAorY29udHJpYnV0aW5nIGNvZGUgY2FuIGxvb2sgbGlrZSBhbiBhdm9pZGFibGUgZXhwZW5zZTsgaXQgc2VlbXMgZWFzaWVyIHRvCitqdXN0IGtlZXAgdGhlIGNvZGUgc2VwYXJhdGUgYW5kIHN1cHBvcnQgdXNlcnMgZGlyZWN0bHkuICBUaGUgdHJ1dGggb2YgdGhlCittYXR0ZXIgaXMgdGhhdCBrZWVwaW5nIGNvZGUgc2VwYXJhdGUgKCJvdXQgb2YgdHJlZSIpIGlzIGEgZmFsc2UgZWNvbm9teS4KKworQXMgYSB3YXkgb2YgaWxsdXN0cmF0aW5nIHRoZSBjb3N0cyBvZiBvdXQtb2YtdHJlZSBjb2RlLCBoZXJlIGFyZSBhIGZldworcmVsZXZhbnQgYXNwZWN0cyBvZiB0aGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3M7IG1vc3Qgb2YgdGhlc2Ugd2lsbCBiZQorZGlzY3Vzc2VkIGluIGdyZWF0ZXIgZGV0YWlsIGxhdGVyIGluIHRoaXMgZG9jdW1lbnQuICBDb25zaWRlcjoKKworLSBDb2RlIHdoaWNoIGhhcyBiZWVuIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwgaXMgYXZhaWxhYmxlIHRvIGFsbAorICBMaW51eCB1c2Vycy4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBwcmVzZW50IG9uIGFsbCBkaXN0cmlidXRpb25zIHdoaWNoCisgIGVuYWJsZSBpdC4gIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGRyaXZlciBkaXNrcywgZG93bmxvYWRzLCBvciB0aGUgaGFzc2xlcworICBvZiBzdXBwb3J0aW5nIG11bHRpcGxlIHZlcnNpb25zIG9mIG11bHRpcGxlIGRpc3RyaWJ1dGlvbnM7IGl0IGFsbCBqdXN0CisgIHdvcmtzLCBmb3IgdGhlIGRldmVsb3BlciBhbmQgZm9yIHRoZSB1c2VyLiAgSW5jb3Jwb3JhdGlvbiBpbnRvIHRoZQorICBtYWlubGluZSBzb2x2ZXMgYSBsYXJnZSBudW1iZXIgb2YgZGlzdHJpYnV0aW9uIGFuZCBzdXBwb3J0IHByb2JsZW1zLgorCistIFdoaWxlIGtlcm5lbCBkZXZlbG9wZXJzIHN0cml2ZSB0byBtYWludGFpbiBhIHN0YWJsZSBpbnRlcmZhY2UgdG8gdXNlcgorICBzcGFjZSwgdGhlIGludGVybmFsIGtlcm5lbCBBUEkgaXMgaW4gY29uc3RhbnQgZmx1eC4gIFRoZSBsYWNrIG9mIGEgc3RhYmxlCisgIGludGVybmFsIGludGVyZmFjZSBpcyBhIGRlbGliZXJhdGUgZGVzaWduIGRlY2lzaW9uOyBpdCBhbGxvd3MgZnVuZGFtZW50YWwKKyAgaW1wcm92ZW1lbnRzIHRvIGJlIG1hZGUgYXQgYW55IHRpbWUgYW5kIHJlc3VsdHMgaW4gaGlnaGVyLXF1YWxpdHkgY29kZS4KKyAgQnV0IG9uZSByZXN1bHQgb2YgdGhhdCBwb2xpY3kgaXMgdGhhdCBhbnkgb3V0LW9mLXRyZWUgY29kZSByZXF1aXJlcworICBjb25zdGFudCB1cGtlZXAgaWYgaXQgaXMgdG8gd29yayB3aXRoIG5ldyBrZXJuZWxzLiAgTWFpbnRhaW5pbmcKKyAgb3V0LW9mLXRyZWUgY29kZSByZXF1aXJlcyBzaWduaWZpY2FudCBhbW91bnRzIG9mIHdvcmsganVzdCB0byBrZWVwIHRoYXQKKyAgY29kZSB3b3JraW5nLgorCisgIENvZGUgd2hpY2ggaXMgaW4gdGhlIG1haW5saW5lLCBpbnN0ZWFkLCBkb2VzIG5vdCByZXF1aXJlIHRoaXMgd29yayBhcyB0aGUKKyAgcmVzdWx0IG9mIGEgc2ltcGxlIHJ1bGUgcmVxdWlyaW5nIGFueSBkZXZlbG9wZXIgd2hvIG1ha2VzIGFuIEFQSSBjaGFuZ2UKKyAgdG8gYWxzbyBmaXggYW55IGNvZGUgdGhhdCBicmVha3MgYXMgdGhlIHJlc3VsdCBvZiB0aGF0IGNoYW5nZS4gIFNvIGNvZGUKKyAgd2hpY2ggaGFzIGJlZW4gbWVyZ2VkIGludG8gdGhlIG1haW5saW5lIGhhcyBzaWduaWZpY2FudGx5IGxvd2VyCisgIG1haW50ZW5hbmNlIGNvc3RzLgorCistIEJleW9uZCB0aGF0LCBjb2RlIHdoaWNoIGlzIGluIHRoZSBrZXJuZWwgd2lsbCBvZnRlbiBiZSBpbXByb3ZlZCBieSBvdGhlcgorICBkZXZlbG9wZXJzLiAgU3VycHJpc2luZyByZXN1bHRzIGNhbiBjb21lIGZyb20gZW1wb3dlcmluZyB5b3VyIHVzZXIKKyAgY29tbXVuaXR5IGFuZCBjdXN0b21lcnMgdG8gaW1wcm92ZSB5b3VyIHByb2R1Y3QuCisKKy0gS2VybmVsIGNvZGUgaXMgc3ViamVjdGVkIHRvIHJldmlldywgYm90aCBiZWZvcmUgYW5kIGFmdGVyIG1lcmdpbmcgaW50bworICB0aGUgbWFpbmxpbmUuICBObyBtYXR0ZXIgaG93IHN0cm9uZyB0aGUgb3JpZ2luYWwgZGV2ZWxvcGVyJ3Mgc2tpbGxzIGFyZSwKKyAgdGhpcyByZXZpZXcgcHJvY2VzcyBpbnZhcmlhYmx5IGZpbmRzIHdheXMgaW4gd2hpY2ggdGhlIGNvZGUgY2FuIGJlCisgIGltcHJvdmVkLiAgT2Z0ZW4gcmV2aWV3IGZpbmRzIHNldmVyZSBidWdzIGFuZCBzZWN1cml0eSBwcm9ibGVtcy4gIFRoaXMgaXMKKyAgZXNwZWNpYWxseSB0cnVlIGZvciBjb2RlIHdoaWNoIGhhcyBiZWVuIGRldmVsb3BlZCBpbiBhIGNsb3NlZAorICBlbnZpcm9ubWVudDsgc3VjaCBjb2RlIGJlbmVmaXRzIHN0cm9uZ2x5IGZyb20gcmV2aWV3IGJ5IG91dHNpZGUKKyAgZGV2ZWxvcGVycy4gIE91dC1vZi10cmVlIGNvZGUgaXMgbG93ZXItcXVhbGl0eSBjb2RlLgorCistIFBhcnRpY2lwYXRpb24gaW4gdGhlIGRldmVsb3BtZW50IHByb2Nlc3MgaXMgeW91ciB3YXkgdG8gaW5mbHVlbmNlIHRoZQorICBkaXJlY3Rpb24gb2Yga2VybmVsIGRldmVsb3BtZW50LiAgVXNlcnMgd2hvIGNvbXBsYWluIGZyb20gdGhlIHNpZGVsaW5lcworICBhcmUgaGVhcmQsIGJ1dCBhY3RpdmUgZGV2ZWxvcGVycyBoYXZlIGEgc3Ryb25nZXIgdm9pY2UgLSBhbmQgdGhlIGFiaWxpdHkKKyAgdG8gaW1wbGVtZW50IGNoYW5nZXMgd2hpY2ggbWFrZSB0aGUga2VybmVsIHdvcmsgYmV0dGVyIGZvciB0aGVpciBuZWVkcy4KKworLSBXaGVuIGNvZGUgaXMgbWFpbnRhaW5lZCBzZXBhcmF0ZWx5LCB0aGUgcG9zc2liaWxpdHkgdGhhdCBhIHRoaXJkIHBhcnR5CisgIHdpbGwgY29udHJpYnV0ZSBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBvZiBhIHNpbWlsYXIgZmVhdHVyZSBhbHdheXMKKyAgZXhpc3RzLiAgU2hvdWxkIHRoYXQgaGFwcGVuLCBnZXR0aW5nIHlvdXIgY29kZSBtZXJnZWQgd2lsbCBiZWNvbWUgbXVjaAorICBoYXJkZXIgLSB0byB0aGUgcG9pbnQgb2YgaW1wb3NzaWJpbGl0eS4gIFRoZW4geW91IHdpbGwgYmUgZmFjZWQgd2l0aCB0aGUKKyAgdW5wbGVhc2FudCBhbHRlcm5hdGl2ZXMgb2YgZWl0aGVyICgxKSBtYWludGFpbmluZyBhIG5vbnN0YW5kYXJkIGZlYXR1cmUKKyAgb3V0IG9mIHRyZWUgaW5kZWZpbml0ZWx5LCBvciAoMikgYWJhbmRvbmluZyB5b3VyIGNvZGUgYW5kIG1pZ3JhdGluZyB5b3VyCisgIHVzZXJzIG92ZXIgdG8gdGhlIGluLXRyZWUgdmVyc2lvbi4KKworLSBDb250cmlidXRpb24gb2YgY29kZSBpcyB0aGUgZnVuZGFtZW50YWwgYWN0aW9uIHdoaWNoIG1ha2VzIHRoZSB3aG9sZQorICBwcm9jZXNzIHdvcmsuICBCeSBjb250cmlidXRpbmcgeW91ciBjb2RlIHlvdSBjYW4gYWRkIG5ldyBmdW5jdGlvbmFsaXR5IHRvCisgIHRoZSBrZXJuZWwgYW5kIHByb3ZpZGUgY2FwYWJpbGl0aWVzIGFuZCBleGFtcGxlcyB3aGljaCBhcmUgb2YgdXNlIHRvCisgIG90aGVyIGtlcm5lbCBkZXZlbG9wZXJzLiAgSWYgeW91IGhhdmUgZGV2ZWxvcGVkIGNvZGUgZm9yIExpbnV4IChvciBhcmUKKyAgdGhpbmtpbmcgYWJvdXQgZG9pbmcgc28pLCB5b3UgY2xlYXJseSBoYXZlIGFuIGludGVyZXN0IGluIHRoZSBjb250aW51ZWQKKyAgc3VjY2VzcyBvZiB0aGlzIHBsYXRmb3JtOyBjb250cmlidXRpbmcgY29kZSBpcyBvbmUgb2YgdGhlIGJlc3Qgd2F5cyB0bworICBoZWxwIGVuc3VyZSB0aGF0IHN1Y2Nlc3MuCisKK0FsbCBvZiB0aGUgcmVhc29uaW5nIGFib3ZlIGFwcGxpZXMgdG8gYW55IG91dC1vZi10cmVlIGtlcm5lbCBjb2RlLAoraW5jbHVkaW5nIGNvZGUgd2hpY2ggaXMgZGlzdHJpYnV0ZWQgaW4gcHJvcHJpZXRhcnksIGJpbmFyeS1vbmx5IGZvcm0uCitUaGVyZSBhcmUsIGhvd2V2ZXIsIGFkZGl0aW9uYWwgZmFjdG9ycyB3aGljaCBzaG91bGQgYmUgdGFrZW4gaW50byBhY2NvdW50CitiZWZvcmUgY29uc2lkZXJpbmcgYW55IHNvcnQgb2YgYmluYXJ5LW9ubHkga2VybmVsIGNvZGUgZGlzdHJpYnV0aW9uLiAgVGhlc2UKK2luY2x1ZGU6CisKKy0gVGhlIGxlZ2FsIGlzc3VlcyBhcm91bmQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBwcm9wcmlldGFyeSBrZXJuZWwgbW9kdWxlcworICBhcmUgY2xvdWR5IGF0IGJlc3Q7IHF1aXRlIGEgZmV3IGtlcm5lbCBjb3B5cmlnaHQgaG9sZGVycyBiZWxpZXZlIHRoYXQKKyAgbW9zdCBiaW5hcnktb25seSBtb2R1bGVzIGFyZSBkZXJpdmVkIHByb2R1Y3RzIG9mIHRoZSBrZXJuZWwgYW5kIHRoYXQsIGFzCisgIGEgcmVzdWx0LCB0aGVpciBkaXN0cmlidXRpb24gaXMgYSB2aW9sYXRpb24gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICBsaWNlbnNlIChhYm91dCB3aGljaCBtb3JlIHdpbGwgYmUgc2FpZCBiZWxvdykuICBZb3VyIGF1dGhvciBpcyBub3QgYQorICBsYXd5ZXIsIGFuZCBub3RoaW5nIGluIHRoaXMgZG9jdW1lbnQgY2FuIHBvc3NpYmx5IGJlIGNvbnNpZGVyZWQgdG8gYmUKKyAgbGVnYWwgYWR2aWNlLiAgVGhlIHRydWUgbGVnYWwgc3RhdHVzIG9mIGNsb3NlZC1zb3VyY2UgbW9kdWxlcyBjYW4gb25seSBiZQorICBkZXRlcm1pbmVkIGJ5IHRoZSBjb3VydHMuICBCdXQgdGhlIHVuY2VydGFpbnR5IHdoaWNoIGhhdW50cyB0aG9zZSBtb2R1bGVzCisgIGlzIHRoZXJlIHJlZ2FyZGxlc3MuCisKKy0gQmluYXJ5IG1vZHVsZXMgZ3JlYXRseSBpbmNyZWFzZSB0aGUgZGlmZmljdWx0eSBvZiBkZWJ1Z2dpbmcga2VybmVsCisgIHByb2JsZW1zLCB0byB0aGUgcG9pbnQgdGhhdCBtb3N0IGtlcm5lbCBkZXZlbG9wZXJzIHdpbGwgbm90IGV2ZW4gdHJ5LiAgU28KKyAgdGhlIGRpc3RyaWJ1dGlvbiBvZiBiaW5hcnktb25seSBtb2R1bGVzIHdpbGwgbWFrZSBpdCBoYXJkZXIgZm9yIHlvdXIKKyAgdXNlcnMgdG8gZ2V0IHN1cHBvcnQgZnJvbSB0aGUgY29tbXVuaXR5LgorCistIFN1cHBvcnQgaXMgYWxzbyBoYXJkZXIgZm9yIGRpc3RyaWJ1dG9ycyBvZiBiaW5hcnktb25seSBtb2R1bGVzLCB3aG8gbXVzdAorICBwcm92aWRlIGEgdmVyc2lvbiBvZiB0aGUgbW9kdWxlIGZvciBldmVyeSBkaXN0cmlidXRpb24gYW5kIGV2ZXJ5IGtlcm5lbAorICB2ZXJzaW9uIHRoZXkgd2lzaCB0byBzdXBwb3J0LiAgRG96ZW5zIG9mIGJ1aWxkcyBvZiBhIHNpbmdsZSBtb2R1bGUgY2FuCisgIGJlIHJlcXVpcmVkIHRvIHByb3ZpZGUgcmVhc29uYWJseSBjb21wcmVoZW5zaXZlIGNvdmVyYWdlLCBhbmQgeW91ciB1c2VycworICB3aWxsIGhhdmUgdG8gdXBncmFkZSB5b3VyIG1vZHVsZSBzZXBhcmF0ZWx5IGV2ZXJ5IHRpbWUgdGhleSB1cGdyYWRlIHRoZWlyCisgIGtlcm5lbC4KKworLSBFdmVyeXRoaW5nIHRoYXQgd2FzIHNhaWQgYWJvdmUgYWJvdXQgY29kZSByZXZpZXcgYXBwbGllcyBkb3VibHkgdG8KKyAgY2xvc2VkLXNvdXJjZSBjb2RlLiAgU2luY2UgdGhpcyBjb2RlIGlzIG5vdCBhdmFpbGFibGUgYXQgYWxsLCBpdCBjYW5ub3QKKyAgaGF2ZSBiZWVuIHJldmlld2VkIGJ5IHRoZSBjb21tdW5pdHkgYW5kIHdpbGwsIGJleW9uZCBkb3VidCwgaGF2ZSBzZXJpb3VzCisgIHByb2JsZW1zLgorCitNYWtlcnMgb2YgZW1iZWRkZWQgc3lzdGVtcywgaW4gcGFydGljdWxhciwgbWF5IGJlIHRlbXB0ZWQgdG8gZGlzcmVnYXJkIG11Y2gKK29mIHdoYXQgaGFzIGJlZW4gc2FpZCBpbiB0aGlzIHNlY3Rpb24gaW4gdGhlIGJlbGllZiB0aGF0IHRoZXkgYXJlIHNoaXBwaW5nCithIHNlbGYtY29udGFpbmVkIHByb2R1Y3Qgd2hpY2ggdXNlcyBhIGZyb3plbiBrZXJuZWwgdmVyc2lvbiBhbmQgcmVxdWlyZXMgbm8KK21vcmUgZGV2ZWxvcG1lbnQgYWZ0ZXIgaXRzIHJlbGVhc2UuICBUaGlzIGFyZ3VtZW50IG1pc3NlcyB0aGUgdmFsdWUgb2YKK3dpZGVzcHJlYWQgY29kZSByZXZpZXcgYW5kIHRoZSB2YWx1ZSBvZiBhbGxvd2luZyB5b3VyIHVzZXJzIHRvIGFkZAorY2FwYWJpbGl0aWVzIHRvIHlvdXIgcHJvZHVjdC4gIEJ1dCB0aGVzZSBwcm9kdWN0cywgdG9vLCBoYXZlIGEgbGltaXRlZAorY29tbWVyY2lhbCBsaWZlLCBhZnRlciB3aGljaCBhIG5ldyB2ZXJzaW9uIG11c3QgYmUgcmVsZWFzZWQuICBBdCB0aGF0Citwb2ludCwgdmVuZG9ycyB3aG9zZSBjb2RlIGlzIGluIHRoZSBtYWlubGluZSBhbmQgd2VsbCBtYWludGFpbmVkIHdpbGwgYmUKK211Y2ggYmV0dGVyIHBvc2l0aW9uZWQgdG8gZ2V0IHRoZSBuZXcgcHJvZHVjdCByZWFkeSBmb3IgbWFya2V0IHF1aWNrbHkuCisKK0xpY2Vuc2luZworLS0tLS0tLS0tCisKK0NvZGUgaXMgY29udHJpYnV0ZWQgdG8gdGhlIExpbnV4IGtlcm5lbCB1bmRlciBhIG51bWJlciBvZiBsaWNlbnNlcywgYnV0IGFsbAorY29kZSBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisoR1BMdjIpLCB3aGljaCBpcyB0aGUgbGljZW5zZSBjb3ZlcmluZyB0aGUga2VybmVsIGRpc3RyaWJ1dGlvbiBhcyBhIHdob2xlLgorSW4gcHJhY3RpY2UsIHRoYXQgbWVhbnMgdGhhdCBhbGwgY29kZSBjb250cmlidXRpb25zIGFyZSBjb3ZlcmVkIGVpdGhlciBieQorR1BMdjIgKHdpdGgsIG9wdGlvbmFsbHksIGxhbmd1YWdlIGFsbG93aW5nIGRpc3RyaWJ1dGlvbiB1bmRlciBsYXRlcgordmVyc2lvbnMgb2YgdGhlIEdQTCkgb3IgdGhlIHRocmVlLWNsYXVzZSBCU0QgbGljZW5zZS4gIEFueSBjb250cmlidXRpb25zCit3aGljaCBhcmUgbm90IGNvdmVyZWQgYnkgYSBjb21wYXRpYmxlIGxpY2Vuc2Ugd2lsbCBub3QgYmUgYWNjZXB0ZWQgaW50byB0aGUKK2tlcm5lbC4KKworQ29weXJpZ2h0IGFzc2lnbm1lbnRzIGFyZSBub3QgcmVxdWlyZWQgKG9yIHJlcXVlc3RlZCkgZm9yIGNvZGUgY29udHJpYnV0ZWQKK3RvIHRoZSBrZXJuZWwuICBBbGwgY29kZSBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUga2VybmVsIHJldGFpbnMgaXRzCitvcmlnaW5hbCBvd25lcnNoaXA7IGFzIGEgcmVzdWx0LCB0aGUga2VybmVsIG5vdyBoYXMgdGhvdXNhbmRzIG9mIG93bmVycy4KKworT25lIGltcGxpY2F0aW9uIG9mIHRoaXMgb3duZXJzaGlwIHN0cnVjdHVyZSBpcyB0aGF0IGFueSBhdHRlbXB0IHRvIGNoYW5nZQordGhlIGxpY2Vuc2luZyBvZiB0aGUga2VybmVsIGlzIGRvb21lZCB0byBhbG1vc3QgY2VydGFpbiBmYWlsdXJlLiAgVGhlcmUgYXJlCitmZXcgcHJhY3RpY2FsIHNjZW5hcmlvcyB3aGVyZSB0aGUgYWdyZWVtZW50IG9mIGFsbCBjb3B5cmlnaHQgaG9sZGVycyBjb3VsZAorYmUgb2J0YWluZWQgKG9yIHRoZWlyIGNvZGUgcmVtb3ZlZCBmcm9tIHRoZSBrZXJuZWwpLiAgU28sIGluIHBhcnRpY3VsYXIsCit0aGVyZSBpcyBubyBwcm9zcGVjdCBvZiBhIG1pZ3JhdGlvbiB0byB2ZXJzaW9uIDMgb2YgdGhlIEdQTCBpbiB0aGUKK2ZvcmVzZWVhYmxlIGZ1dHVyZS4KKworSXQgaXMgaW1wZXJhdGl2ZSB0aGF0IGFsbCBjb2RlIGNvbnRyaWJ1dGVkIHRvIHRoZSBrZXJuZWwgYmUgbGVnaXRpbWF0ZWx5CitmcmVlIHNvZnR3YXJlLiAgRm9yIHRoYXQgcmVhc29uLCBjb2RlIGZyb20gYW5vbnltb3VzIChvciBwc2V1ZG9ueW1vdXMpCitjb250cmlidXRvcnMgd2lsbCBub3QgYmUgYWNjZXB0ZWQuICBBbGwgY29udHJpYnV0b3JzIGFyZSByZXF1aXJlZCB0byAic2lnbgorb2ZmIiBvbiB0aGVpciBjb2RlLCBzdGF0aW5nIHRoYXQgdGhlIGNvZGUgY2FuIGJlIGRpc3RyaWJ1dGVkIHdpdGggdGhlCitrZXJuZWwgdW5kZXIgdGhlIEdQTC4gIENvZGUgd2hpY2ggaGFzIG5vdCBiZWVuIGxpY2Vuc2VkIGFzIGZyZWUgc29mdHdhcmUgYnkKK2l0cyBvd25lciwgb3Igd2hpY2ggcmlza3MgY3JlYXRpbmcgY29weXJpZ2h0LXJlbGF0ZWQgcHJvYmxlbXMgZm9yIHRoZQora2VybmVsIChzdWNoIGFzIGNvZGUgd2hpY2ggZGVyaXZlcyBmcm9tIHJldmVyc2UtZW5naW5lZXJpbmcgZWZmb3J0cyBsYWNraW5nCitwcm9wZXIgc2FmZWd1YXJkcykgY2Fubm90IGJlIGNvbnRyaWJ1dGVkLgorCitRdWVzdGlvbnMgYWJvdXQgY29weXJpZ2h0LXJlbGF0ZWQgaXNzdWVzIGFyZSBjb21tb24gb24gTGludXggZGV2ZWxvcG1lbnQKK21haWxpbmcgbGlzdHMuICBTdWNoIHF1ZXN0aW9ucyB3aWxsIG5vcm1hbGx5IHJlY2VpdmUgbm8gc2hvcnRhZ2Ugb2YKK2Fuc3dlcnMsIGJ1dCBvbmUgc2hvdWxkIGJlYXIgaW4gbWluZCB0aGF0IHRoZSBwZW9wbGUgYW5zd2VyaW5nIHRob3NlCitxdWVzdGlvbnMgYXJlIG5vdCBsYXd5ZXJzIGFuZCBjYW5ub3QgcHJvdmlkZSBsZWdhbCBhZHZpY2UuICBJZiB5b3UgaGF2ZQorbGVnYWwgcXVlc3Rpb25zIHJlbGF0aW5nIHRvIExpbnV4IHNvdXJjZSBjb2RlLCB0aGVyZSBpcyBubyBzdWJzdGl0dXRlIGZvcgordGFsa2luZyB3aXRoIGEgbGF3eWVyIHdobyB1bmRlcnN0YW5kcyB0aGlzIGZpZWxkLiAgUmVseWluZyBvbiBhbnN3ZXJzCitvYnRhaW5lZCBvbiB0ZWNobmljYWwgbWFpbGluZyBsaXN0cyBpcyBhIHJpc2t5IGFmZmFpci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy8yLlByb2Nlc3MgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMi5Qcm9jZXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjRlMTU2Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy8yLlByb2Nlc3MKKysrIC9kZXYvbnVsbApAQCAtMSw0NzggKzAsMCBAQAotMjogSE9XIFRIRSBERVZFTE9QTUVOVCBQUk9DRVNTIFdPUktTCi0KLUxpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBpbiB0aGUgZWFybHkgMTk5MCdzIHdhcyBhIHByZXR0eSBsb29zZSBhZmZhaXIsCi13aXRoIHJlbGF0aXZlbHkgc21hbGwgbnVtYmVycyBvZiB1c2VycyBhbmQgZGV2ZWxvcGVycyBpbnZvbHZlZC4gIFdpdGggYQotdXNlciBiYXNlIGluIHRoZSBtaWxsaW9ucyBhbmQgd2l0aCBzb21lIDIsMDAwIGRldmVsb3BlcnMgaW52b2x2ZWQgb3ZlciB0aGUKLWNvdXJzZSBvZiBvbmUgeWVhciwgdGhlIGtlcm5lbCBoYXMgc2luY2UgaGFkIHRvIGV2b2x2ZSBhIG51bWJlciBvZgotcHJvY2Vzc2VzIHRvIGtlZXAgZGV2ZWxvcG1lbnQgaGFwcGVuaW5nIHNtb290aGx5LiAgQSBzb2xpZCB1bmRlcnN0YW5kaW5nIG9mCi1ob3cgdGhlIHByb2Nlc3Mgd29ya3MgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gYmUgYW4gZWZmZWN0aXZlIHBhcnQgb2YgaXQuCi0KLQotMi4xOiBUSEUgQklHIFBJQ1RVUkUKLQotVGhlIGtlcm5lbCBkZXZlbG9wZXJzIHVzZSBhIGxvb3NlbHkgdGltZS1iYXNlZCByZWxlYXNlIHByb2Nlc3MsIHdpdGggYSBuZXcKLW1ham9yIGtlcm5lbCByZWxlYXNlIGhhcHBlbmluZyBldmVyeSB0d28gb3IgdGhyZWUgbW9udGhzLiAgVGhlIHJlY2VudAotcmVsZWFzZSBoaXN0b3J5IGxvb2tzIGxpa2UgdGhpczoKLQotCTIuNi4zOAlNYXJjaCAxNCwgMjAxMQotCTIuNi4zNwlKYW51YXJ5IDQsIDIwMTEKLQkyLjYuMzYJT2N0b2JlciAyMCwgMjAxMAotCTIuNi4zNQlBdWd1c3QgMSwgMjAxMAotCTIuNi4zNAlNYXkgMTUsIDIwMTAKLQkyLjYuMzMJRmVicnVhcnkgMjQsIDIwMTAKLQotRXZlcnkgMi42LnggcmVsZWFzZSBpcyBhIG1ham9yIGtlcm5lbCByZWxlYXNlIHdpdGggbmV3IGZlYXR1cmVzLCBpbnRlcm5hbAotQVBJIGNoYW5nZXMsIGFuZCBtb3JlLiAgQSB0eXBpY2FsIDIuNiByZWxlYXNlIGNhbiBjb250YWluIG5lYXJseSAxMCwwMDAKLWNoYW5nZXNldHMgd2l0aCBjaGFuZ2VzIHRvIHNldmVyYWwgaHVuZHJlZCB0aG91c2FuZCBsaW5lcyBvZiBjb2RlLiAgMi42IGlzCi10aHVzIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgTGludXgga2VybmVsIGRldmVsb3BtZW50OyB0aGUga2VybmVsIHVzZXMgYQotcm9sbGluZyBkZXZlbG9wbWVudCBtb2RlbCB3aGljaCBpcyBjb250aW51YWxseSBpbnRlZ3JhdGluZyBtYWpvciBjaGFuZ2VzLgotCi1BIHJlbGF0aXZlbHkgc3RyYWlnaHRmb3J3YXJkIGRpc2NpcGxpbmUgaXMgZm9sbG93ZWQgd2l0aCByZWdhcmQgdG8gdGhlCi1tZXJnaW5nIG9mIHBhdGNoZXMgZm9yIGVhY2ggcmVsZWFzZS4gIEF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBkZXZlbG9wbWVudAotY3ljbGUsIHRoZSAibWVyZ2Ugd2luZG93IiBpcyBzYWlkIHRvIGJlIG9wZW4uICBBdCB0aGF0IHRpbWUsIGNvZGUgd2hpY2ggaXMKLWRlZW1lZCB0byBiZSBzdWZmaWNpZW50bHkgc3RhYmxlIChhbmQgd2hpY2ggaXMgYWNjZXB0ZWQgYnkgdGhlIGRldmVsb3BtZW50Ci1jb21tdW5pdHkpIGlzIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwuICBUaGUgYnVsayBvZiBjaGFuZ2VzIGZvciBhCi1uZXcgZGV2ZWxvcG1lbnQgY3ljbGUgKGFuZCBhbGwgb2YgdGhlIG1ham9yIGNoYW5nZXMpIHdpbGwgYmUgbWVyZ2VkIGR1cmluZwotdGhpcyB0aW1lLCBhdCBhIHJhdGUgYXBwcm9hY2hpbmcgMSwwMDAgY2hhbmdlcyAoInBhdGNoZXMsIiBvciAiY2hhbmdlc2V0cyIpCi1wZXIgZGF5LgotCi0oQXMgYW4gYXNpZGUsIGl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IHRoZSBjaGFuZ2VzIGludGVncmF0ZWQgZHVyaW5nIHRoZQotbWVyZ2Ugd2luZG93IGRvIG5vdCBjb21lIG91dCBvZiB0aGluIGFpcjsgdGhleSBoYXZlIGJlZW4gY29sbGVjdGVkLCB0ZXN0ZWQsCi1hbmQgc3RhZ2VkIGFoZWFkIG9mIHRpbWUuICBIb3cgdGhhdCBwcm9jZXNzIHdvcmtzIHdpbGwgYmUgZGVzY3JpYmVkIGluCi1kZXRhaWwgbGF0ZXIgb24pLgotCi1UaGUgbWVyZ2Ugd2luZG93IGxhc3RzIGZvciBhcHByb3hpbWF0ZWx5IHR3byB3ZWVrcy4gIEF0IHRoZSBlbmQgb2YgdGhpcwotdGltZSwgTGludXMgVG9ydmFsZHMgd2lsbCBkZWNsYXJlIHRoYXQgdGhlIHdpbmRvdyBpcyBjbG9zZWQgYW5kIHJlbGVhc2UgdGhlCi1maXJzdCBvZiB0aGUgInJjIiBrZXJuZWxzLiAgRm9yIHRoZSBrZXJuZWwgd2hpY2ggaXMgZGVzdGluZWQgdG8gYmUgMi42LjQwLAotZm9yIGV4YW1wbGUsIHRoZSByZWxlYXNlIHdoaWNoIGhhcHBlbnMgYXQgdGhlIGVuZCBvZiB0aGUgbWVyZ2Ugd2luZG93IHdpbGwKLWJlIGNhbGxlZCAyLjYuNDAtcmMxLiAgVGhlIC1yYzEgcmVsZWFzZSBpcyB0aGUgc2lnbmFsIHRoYXQgdGhlIHRpbWUgdG8KLW1lcmdlIG5ldyBmZWF0dXJlcyBoYXMgcGFzc2VkLCBhbmQgdGhhdCB0aGUgdGltZSB0byBzdGFiaWxpemUgdGhlIG5leHQKLWtlcm5lbCBoYXMgYmVndW4uCi0KLU92ZXIgdGhlIG5leHQgc2l4IHRvIHRlbiB3ZWVrcywgb25seSBwYXRjaGVzIHdoaWNoIGZpeCBwcm9ibGVtcyBzaG91bGQgYmUKLXN1Ym1pdHRlZCB0byB0aGUgbWFpbmxpbmUuICBPbiBvY2Nhc2lvbiBhIG1vcmUgc2lnbmlmaWNhbnQgY2hhbmdlIHdpbGwgYmUKLWFsbG93ZWQsIGJ1dCBzdWNoIG9jY2FzaW9ucyBhcmUgcmFyZTsgZGV2ZWxvcGVycyB3aG8gdHJ5IHRvIG1lcmdlIG5ldwotZmVhdHVyZXMgb3V0c2lkZSBvZiB0aGUgbWVyZ2Ugd2luZG93IHRlbmQgdG8gZ2V0IGFuIHVuZnJpZW5kbHkgcmVjZXB0aW9uLgotQXMgYSBnZW5lcmFsIHJ1bGUsIGlmIHlvdSBtaXNzIHRoZSBtZXJnZSB3aW5kb3cgZm9yIGEgZ2l2ZW4gZmVhdHVyZSwgdGhlCi1iZXN0IHRoaW5nIHRvIGRvIGlzIHRvIHdhaXQgZm9yIHRoZSBuZXh0IGRldmVsb3BtZW50IGN5Y2xlLiAgKEFuIG9jY2FzaW9uYWwKLWV4Y2VwdGlvbiBpcyBtYWRlIGZvciBkcml2ZXJzIGZvciBwcmV2aW91c2x5LXVuc3VwcG9ydGVkIGhhcmR3YXJlOyBpZiB0aGV5Ci10b3VjaCBubyBpbi10cmVlIGNvZGUsIHRoZXkgY2Fubm90IGNhdXNlIHJlZ3Jlc3Npb25zIGFuZCBzaG91bGQgYmUgc2FmZSB0bwotYWRkIGF0IGFueSB0aW1lKS4KLQotQXMgZml4ZXMgbWFrZSB0aGVpciB3YXkgaW50byB0aGUgbWFpbmxpbmUsIHRoZSBwYXRjaCByYXRlIHdpbGwgc2xvdyBvdmVyCi10aW1lLiAgTGludXMgcmVsZWFzZXMgbmV3IC1yYyBrZXJuZWxzIGFib3V0IG9uY2UgYSB3ZWVrOyBhIG5vcm1hbCBzZXJpZXMKLXdpbGwgZ2V0IHVwIHRvIHNvbWV3aGVyZSBiZXR3ZWVuIC1yYzYgYW5kIC1yYzkgYmVmb3JlIHRoZSBrZXJuZWwgaXMKLWNvbnNpZGVyZWQgdG8gYmUgc3VmZmljaWVudGx5IHN0YWJsZSBhbmQgdGhlIGZpbmFsIDIuNi54IHJlbGVhc2UgaXMgbWFkZS4KLUF0IHRoYXQgcG9pbnQgdGhlIHdob2xlIHByb2Nlc3Mgc3RhcnRzIG92ZXIgYWdhaW4uCi0KLUFzIGFuIGV4YW1wbGUsIGhlcmUgaXMgaG93IHRoZSAyLjYuMzggZGV2ZWxvcG1lbnQgY3ljbGUgd2VudCAoYWxsIGRhdGVzIGluCi0yMDExKToKLQotCUphbnVhcnkgNAkyLjYuMzcgc3RhYmxlIHJlbGVhc2UKLQlKYW51YXJ5IDE4CTIuNi4zOC1yYzEsIG1lcmdlIHdpbmRvdyBjbG9zZXMKLQlKYW51YXJ5IDIxCTIuNi4zOC1yYzIKLQlGZWJydWFyeSAxCTIuNi4zOC1yYzMKLQlGZWJydWFyeSA3CTIuNi4zOC1yYzQKLQlGZWJydWFyeSAxNQkyLjYuMzgtcmM1Ci0JRmVicnVhcnkgMjEJMi42LjM4LXJjNgotCU1hcmNoIDEJCTIuNi4zOC1yYzcKLQlNYXJjaCA3CQkyLjYuMzgtcmM4Ci0JTWFyY2ggMTQJMi42LjM4IHN0YWJsZSByZWxlYXNlCi0KLUhvdyBkbyB0aGUgZGV2ZWxvcGVycyBkZWNpZGUgd2hlbiB0byBjbG9zZSB0aGUgZGV2ZWxvcG1lbnQgY3ljbGUgYW5kIGNyZWF0ZQotdGhlIHN0YWJsZSByZWxlYXNlPyAgVGhlIG1vc3Qgc2lnbmlmaWNhbnQgbWV0cmljIHVzZWQgaXMgdGhlIGxpc3Qgb2YKLXJlZ3Jlc3Npb25zIGZyb20gcHJldmlvdXMgcmVsZWFzZXMuICBObyBidWdzIGFyZSB3ZWxjb21lLCBidXQgdGhvc2Ugd2hpY2gKLWJyZWFrIHN5c3RlbXMgd2hpY2ggd29ya2VkIGluIHRoZSBwYXN0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGVzcGVjaWFsbHkKLXNlcmlvdXMuICBGb3IgdGhpcyByZWFzb24sIHBhdGNoZXMgd2hpY2ggY2F1c2UgcmVncmVzc2lvbnMgYXJlIGxvb2tlZCB1cG9uCi11bmZhdm9yYWJseSBhbmQgYXJlIHF1aXRlIGxpa2VseSB0byBiZSByZXZlcnRlZCBkdXJpbmcgdGhlIHN0YWJpbGl6YXRpb24KLXBlcmlvZC4KLQotVGhlIGRldmVsb3BlcnMnIGdvYWwgaXMgdG8gZml4IGFsbCBrbm93biByZWdyZXNzaW9ucyBiZWZvcmUgdGhlIHN0YWJsZQotcmVsZWFzZSBpcyBtYWRlLiAgSW4gdGhlIHJlYWwgd29ybGQsIHRoaXMga2luZCBvZiBwZXJmZWN0aW9uIGlzIGhhcmQgdG8KLWFjaGlldmU7IHRoZXJlIGFyZSBqdXN0IHRvbyBtYW55IHZhcmlhYmxlcyBpbiBhIHByb2plY3Qgb2YgdGhpcyBzaXplLgotVGhlcmUgY29tZXMgYSBwb2ludCB3aGVyZSBkZWxheWluZyB0aGUgZmluYWwgcmVsZWFzZSBqdXN0IG1ha2VzIHRoZSBwcm9ibGVtCi13b3JzZTsgdGhlIHBpbGUgb2YgY2hhbmdlcyB3YWl0aW5nIGZvciB0aGUgbmV4dCBtZXJnZSB3aW5kb3cgd2lsbCBncm93Ci1sYXJnZXIsIGNyZWF0aW5nIGV2ZW4gbW9yZSByZWdyZXNzaW9ucyB0aGUgbmV4dCB0aW1lIGFyb3VuZC4gIFNvIG1vc3QgMi42LngKLWtlcm5lbHMgZ28gb3V0IHdpdGggYSBoYW5kZnVsIG9mIGtub3duIHJlZ3Jlc3Npb25zIHRob3VnaCwgaG9wZWZ1bGx5LCBub25lCi1vZiB0aGVtIGFyZSBzZXJpb3VzLgotCi1PbmNlIGEgc3RhYmxlIHJlbGVhc2UgaXMgbWFkZSwgaXRzIG9uZ29pbmcgbWFpbnRlbmFuY2UgaXMgcGFzc2VkIG9mZiB0byB0aGUKLSJzdGFibGUgdGVhbSwiIGN1cnJlbnRseSBjb25zaXN0aW5nIG9mIEdyZWcgS3JvYWgtSGFydG1hbi4gIFRoZSBzdGFibGUgdGVhbQotd2lsbCByZWxlYXNlIG9jY2FzaW9uYWwgdXBkYXRlcyB0byB0aGUgc3RhYmxlIHJlbGVhc2UgdXNpbmcgdGhlIDIuNi54LnkKLW51bWJlcmluZyBzY2hlbWUuICBUbyBiZSBjb25zaWRlcmVkIGZvciBhbiB1cGRhdGUgcmVsZWFzZSwgYSBwYXRjaCBtdXN0ICgxKQotZml4IGEgc2lnbmlmaWNhbnQgYnVnLCBhbmQgKDIpIGFscmVhZHkgYmUgbWVyZ2VkIGludG8gdGhlIG1haW5saW5lIGZvciB0aGUKLW5leHQgZGV2ZWxvcG1lbnQga2VybmVsLiAgS2VybmVscyB3aWxsIHR5cGljYWxseSByZWNlaXZlIHN0YWJsZSB1cGRhdGVzIGZvcgotYSBsaXR0bGUgbW9yZSB0aGFuIG9uZSBkZXZlbG9wbWVudCBjeWNsZSBwYXN0IHRoZWlyIGluaXRpYWwgcmVsZWFzZS4gIFNvLAotZm9yIGV4YW1wbGUsIHRoZSAyLjYuMzYga2VybmVsJ3MgaGlzdG9yeSBsb29rZWQgbGlrZToKLQotCU9jdG9iZXIgMTAJMi42LjM2IHN0YWJsZSByZWxlYXNlCi0JTm92ZW1iZXIgMjIJMi42LjM2LjEKLQlEZWNlbWJlciA5CTIuNi4zNi4yCi0JSmFudWFyeSA3CTIuNi4zNi4zCi0JRmVicnVhcnkgMTcJMi42LjM2LjQKLQotMi42LjM2LjQgd2FzIHRoZSBmaW5hbCBzdGFibGUgdXBkYXRlIGZvciB0aGUgMi42LjM2IHJlbGVhc2UuCi0KLVNvbWUga2VybmVscyBhcmUgZGVzaWduYXRlZCAibG9uZyB0ZXJtIiBrZXJuZWxzOyB0aGV5IHdpbGwgcmVjZWl2ZSBzdXBwb3J0Ci1mb3IgYSBsb25nZXIgcGVyaW9kLiAgQXMgb2YgdGhpcyB3cml0aW5nLCB0aGUgY3VycmVudCBsb25nIHRlcm0ga2VybmVscwotYW5kIHRoZWlyIG1haW50YWluZXJzIGFyZToKLQotCTIuNi4yNwlXaWxseSBUYXJyZWF1CQkoRGVlcC1mcm96ZW4gc3RhYmxlIGtlcm5lbCkKLQkyLjYuMzIJR3JlZyBLcm9haC1IYXJ0bWFuCi0JMi42LjM1CUFuZGkgS2xlZW4JCShFbWJlZGRlZCBmbGFnIGtlcm5lbCkKLQotVGhlIHNlbGVjdGlvbiBvZiBhIGtlcm5lbCBmb3IgbG9uZy10ZXJtIHN1cHBvcnQgaXMgcHVyZWx5IGEgbWF0dGVyIG9mIGEKLW1haW50YWluZXIgaGF2aW5nIHRoZSBuZWVkIGFuZCB0aGUgdGltZSB0byBtYWludGFpbiB0aGF0IHJlbGVhc2UuICBUaGVyZQotYXJlIG5vIGtub3duIHBsYW5zIGZvciBsb25nLXRlcm0gc3VwcG9ydCBmb3IgYW55IHNwZWNpZmljIHVwY29taW5nCi1yZWxlYXNlLgotCi0KLTIuMjogVEhFIExJRkVDWUNMRSBPRiBBIFBBVENICi0KLVBhdGNoZXMgZG8gbm90IGdvIGRpcmVjdGx5IGZyb20gdGhlIGRldmVsb3BlcidzIGtleWJvYXJkIGludG8gdGhlIG1haW5saW5lCi1rZXJuZWwuICBUaGVyZSBpcywgaW5zdGVhZCwgYSBzb21ld2hhdCBpbnZvbHZlZCAoaWYgc29tZXdoYXQgaW5mb3JtYWwpCi1wcm9jZXNzIGRlc2lnbmVkIHRvIGVuc3VyZSB0aGF0IGVhY2ggcGF0Y2ggaXMgcmV2aWV3ZWQgZm9yIHF1YWxpdHkgYW5kIHRoYXQKLWVhY2ggcGF0Y2ggaW1wbGVtZW50cyBhIGNoYW5nZSB3aGljaCBpcyBkZXNpcmFibGUgdG8gaGF2ZSBpbiB0aGUgbWFpbmxpbmUuCi1UaGlzIHByb2Nlc3MgY2FuIGhhcHBlbiBxdWlja2x5IGZvciBtaW5vciBmaXhlcywgb3IsIGluIHRoZSBjYXNlIG9mIGxhcmdlCi1hbmQgY29udHJvdmVyc2lhbCBjaGFuZ2VzLCBnbyBvbiBmb3IgeWVhcnMuICBNdWNoIGRldmVsb3BlciBmcnVzdHJhdGlvbgotY29tZXMgZnJvbSBhIGxhY2sgb2YgdW5kZXJzdGFuZGluZyBvZiB0aGlzIHByb2Nlc3Mgb3IgZnJvbSBhdHRlbXB0cyB0bwotY2lyY3VtdmVudCBpdC4KLQotSW4gdGhlIGhvcGVzIG9mIHJlZHVjaW5nIHRoYXQgZnJ1c3RyYXRpb24sIHRoaXMgZG9jdW1lbnQgd2lsbCBkZXNjcmliZSBob3cKLWEgcGF0Y2ggZ2V0cyBpbnRvIHRoZSBrZXJuZWwuICBXaGF0IGZvbGxvd3MgYmVsb3cgaXMgYW4gaW50cm9kdWN0aW9uIHdoaWNoCi1kZXNjcmliZXMgdGhlIHByb2Nlc3MgaW4gYSBzb21ld2hhdCBpZGVhbGl6ZWQgd2F5LiAgQSBtdWNoIG1vcmUgZGV0YWlsZWQKLXRyZWF0bWVudCB3aWxsIGNvbWUgaW4gbGF0ZXIgc2VjdGlvbnMuCi0KLVRoZSBzdGFnZXMgdGhhdCBhIHBhdGNoIGdvZXMgdGhyb3VnaCBhcmUsIGdlbmVyYWxseToKLQotIC0gRGVzaWduLiAgVGhpcyBpcyB3aGVyZSB0aGUgcmVhbCByZXF1aXJlbWVudHMgZm9yIHRoZSBwYXRjaCAtIGFuZCB0aGUgd2F5Ci0gICB0aG9zZSByZXF1aXJlbWVudHMgd2lsbCBiZSBtZXQgLSBhcmUgbGFpZCBvdXQuICBEZXNpZ24gd29yayBpcyBvZnRlbgotICAgZG9uZSB3aXRob3V0IGludm9sdmluZyB0aGUgY29tbXVuaXR5LCBidXQgaXQgaXMgYmV0dGVyIHRvIGRvIHRoaXMgd29yawotICAgaW4gdGhlIG9wZW4gaWYgYXQgYWxsIHBvc3NpYmxlOyBpdCBjYW4gc2F2ZSBhIGxvdCBvZiB0aW1lIHJlZGVzaWduaW5nCi0gICB0aGluZ3MgbGF0ZXIuCi0KLSAtIEVhcmx5IHJldmlldy4gIFBhdGNoZXMgYXJlIHBvc3RlZCB0byB0aGUgcmVsZXZhbnQgbWFpbGluZyBsaXN0LCBhbmQKLSAgIGRldmVsb3BlcnMgb24gdGhhdCBsaXN0IHJlcGx5IHdpdGggYW55IGNvbW1lbnRzIHRoZXkgbWF5IGhhdmUuICBUaGlzCi0gICBwcm9jZXNzIHNob3VsZCB0dXJuIHVwIGFueSBtYWpvciBwcm9ibGVtcyB3aXRoIGEgcGF0Y2ggaWYgYWxsIGdvZXMKLSAgIHdlbGwuCi0KLSAtIFdpZGVyIHJldmlldy4gIFdoZW4gdGhlIHBhdGNoIGlzIGdldHRpbmcgY2xvc2UgdG8gcmVhZHkgZm9yIG1haW5saW5lCi0gICBpbmNsdXNpb24sIGl0IHNob3VsZCBiZSBhY2NlcHRlZCBieSBhIHJlbGV2YW50IHN1YnN5c3RlbSBtYWludGFpbmVyIC0KLSAgIHRob3VnaCB0aGlzIGFjY2VwdGFuY2UgaXMgbm90IGEgZ3VhcmFudGVlIHRoYXQgdGhlIHBhdGNoIHdpbGwgbWFrZSBpdAotICAgYWxsIHRoZSB3YXkgdG8gdGhlIG1haW5saW5lLiAgVGhlIHBhdGNoIHdpbGwgc2hvdyB1cCBpbiB0aGUgbWFpbnRhaW5lcidzCi0gICBzdWJzeXN0ZW0gdHJlZSBhbmQgaW50byB0aGUgLW5leHQgdHJlZXMgKGRlc2NyaWJlZCBiZWxvdykuICBXaGVuIHRoZQotICAgcHJvY2VzcyB3b3JrcywgdGhpcyBzdGVwIGxlYWRzIHRvIG1vcmUgZXh0ZW5zaXZlIHJldmlldyBvZiB0aGUgcGF0Y2ggYW5kCi0gICB0aGUgZGlzY292ZXJ5IG9mIGFueSBwcm9ibGVtcyByZXN1bHRpbmcgZnJvbSB0aGUgaW50ZWdyYXRpb24gb2YgdGhpcwotICAgcGF0Y2ggd2l0aCB3b3JrIGJlaW5nIGRvbmUgYnkgb3RoZXJzLgotCi0tICBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFpbnRhaW5lcnMgYWxzbyBoYXZlIGRheSBqb2JzLCBzbyBtZXJnaW5nCi0gICB5b3VyIHBhdGNoIG1heSBub3QgYmUgdGhlaXIgaGlnaGVzdCBwcmlvcml0eS4gIElmIHlvdXIgcGF0Y2ggaXMKLSAgIGdldHRpbmcgZmVlZGJhY2sgYWJvdXQgY2hhbmdlcyB0aGF0IGFyZSBuZWVkZWQsIHlvdSBzaG91bGQgZWl0aGVyCi0gICBtYWtlIHRob3NlIGNoYW5nZXMgb3IganVzdGlmeSB3aHkgdGhleSBzaG91bGQgbm90IGJlIG1hZGUuICBJZiB5b3VyCi0gICBwYXRjaCBoYXMgbm8gcmV2aWV3IGNvbXBsYWludHMgYnV0IGlzIG5vdCBiZWluZyBtZXJnZWQgYnkgaXRzCi0gICBhcHByb3ByaWF0ZSBzdWJzeXN0ZW0gb3IgZHJpdmVyIG1haW50YWluZXIsIHlvdSBzaG91bGQgYmUgcGVyc2lzdGVudAotICAgaW4gdXBkYXRpbmcgdGhlIHBhdGNoIHRvIHRoZSBjdXJyZW50IGtlcm5lbCBzbyB0aGF0IGl0IGFwcGxpZXMgY2xlYW5seQotICAgYW5kIGtlZXAgc2VuZGluZyBpdCBmb3IgcmV2aWV3IGFuZCBtZXJnaW5nLgotCi0gLSBNZXJnaW5nIGludG8gdGhlIG1haW5saW5lLiAgRXZlbnR1YWxseSwgYSBzdWNjZXNzZnVsIHBhdGNoIHdpbGwgYmUKLSAgIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZSByZXBvc2l0b3J5IG1hbmFnZWQgYnkgTGludXMgVG9ydmFsZHMuICBNb3JlCi0gICBjb21tZW50cyBhbmQvb3IgcHJvYmxlbXMgbWF5IHN1cmZhY2UgYXQgdGhpcyB0aW1lOyBpdCBpcyBpbXBvcnRhbnQgdGhhdAotICAgdGhlIGRldmVsb3BlciBiZSByZXNwb25zaXZlIHRvIHRoZXNlIGFuZCBmaXggYW55IGlzc3VlcyB3aGljaCBhcmlzZS4KLQotIC0gU3RhYmxlIHJlbGVhc2UuICBUaGUgbnVtYmVyIG9mIHVzZXJzIHBvdGVudGlhbGx5IGFmZmVjdGVkIGJ5IHRoZSBwYXRjaAotICAgaXMgbm93IGxhcmdlLCBzbywgb25jZSBhZ2FpbiwgbmV3IHByb2JsZW1zIG1heSBhcmlzZS4KLQotIC0gTG9uZy10ZXJtIG1haW50ZW5hbmNlLiAgV2hpbGUgaXQgaXMgY2VydGFpbmx5IHBvc3NpYmxlIGZvciBhIGRldmVsb3BlcgotICAgdG8gZm9yZ2V0IGFib3V0IGNvZGUgYWZ0ZXIgbWVyZ2luZyBpdCwgdGhhdCBzb3J0IG9mIGJlaGF2aW9yIHRlbmRzIHRvCi0gICBsZWF2ZSBhIHBvb3IgaW1wcmVzc2lvbiBpbiB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LiAgTWVyZ2luZyBjb2RlCi0gICBlbGltaW5hdGVzIHNvbWUgb2YgdGhlIG1haW50ZW5hbmNlIGJ1cmRlbiwgaW4gdGhhdCBvdGhlcnMgd2lsbCBmaXgKLSAgIHByb2JsZW1zIGNhdXNlZCBieSBBUEkgY2hhbmdlcy4gIEJ1dCB0aGUgb3JpZ2luYWwgZGV2ZWxvcGVyIHNob3VsZAotICAgY29udGludWUgdG8gdGFrZSByZXNwb25zaWJpbGl0eSBmb3IgdGhlIGNvZGUgaWYgaXQgaXMgdG8gcmVtYWluIHVzZWZ1bAotICAgaW4gdGhlIGxvbmdlciB0ZXJtLgotCi1PbmUgb2YgdGhlIGxhcmdlc3QgbWlzdGFrZXMgbWFkZSBieSBrZXJuZWwgZGV2ZWxvcGVycyAob3IgdGhlaXIgZW1wbG95ZXJzKQotaXMgdG8gdHJ5IHRvIGN1dCB0aGUgcHJvY2VzcyBkb3duIHRvIGEgc2luZ2xlICJtZXJnaW5nIGludG8gdGhlIG1haW5saW5lIgotc3RlcC4gIFRoaXMgYXBwcm9hY2ggaW52YXJpYWJseSBsZWFkcyB0byBmcnVzdHJhdGlvbiBmb3IgZXZlcnlib2R5Ci1pbnZvbHZlZC4KLQotCi0yLjM6IEhPVyBQQVRDSEVTIEdFVCBJTlRPIFRIRSBLRVJORUwKLQotVGhlcmUgaXMgZXhhY3RseSBvbmUgcGVyc29uIHdobyBjYW4gbWVyZ2UgcGF0Y2hlcyBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwKLXJlcG9zaXRvcnk6IExpbnVzIFRvcnZhbGRzLiAgQnV0LCBvZiB0aGUgb3ZlciA5LDUwMCBwYXRjaGVzIHdoaWNoIHdlbnQKLWludG8gdGhlIDIuNi4zOCBrZXJuZWwsIG9ubHkgMTEyIChhcm91bmQgMS4zJSkgd2VyZSBkaXJlY3RseSBjaG9zZW4gYnkgTGludXMKLWhpbXNlbGYuICBUaGUga2VybmVsIHByb2plY3QgaGFzIGxvbmcgc2luY2UgZ3Jvd24gdG8gYSBzaXplIHdoZXJlIG5vIHNpbmdsZQotZGV2ZWxvcGVyIGNvdWxkIHBvc3NpYmx5IGluc3BlY3QgYW5kIHNlbGVjdCBldmVyeSBwYXRjaCB1bmFzc2lzdGVkLiAgVGhlCi13YXkgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIGhhdmUgYWRkcmVzc2VkIHRoaXMgZ3Jvd3RoIGlzIHRocm91Z2ggdGhlIHVzZSBvZgotYSBsaWV1dGVuYW50IHN5c3RlbSBidWlsdCBhcm91bmQgYSBjaGFpbiBvZiB0cnVzdC4KLQotVGhlIGtlcm5lbCBjb2RlIGJhc2UgaXMgbG9naWNhbGx5IGJyb2tlbiBkb3duIGludG8gYSBzZXQgb2Ygc3Vic3lzdGVtczoKLW5ldHdvcmtpbmcsIHNwZWNpZmljIGFyY2hpdGVjdHVyZSBzdXBwb3J0LCBtZW1vcnkgbWFuYWdlbWVudCwgdmlkZW8KLWRldmljZXMsIGV0Yy4gIE1vc3Qgc3Vic3lzdGVtcyBoYXZlIGEgZGVzaWduYXRlZCBtYWludGFpbmVyLCBhIGRldmVsb3Blcgotd2hvIGhhcyBvdmVyYWxsIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgY29kZSB3aXRoaW4gdGhhdCBzdWJzeXN0ZW0uICBUaGVzZQotc3Vic3lzdGVtIG1haW50YWluZXJzIGFyZSB0aGUgZ2F0ZWtlZXBlcnMgKGluIGEgbG9vc2Ugd2F5KSBmb3IgdGhlIHBvcnRpb24KLW9mIHRoZSBrZXJuZWwgdGhleSBtYW5hZ2U7IHRoZXkgYXJlIHRoZSBvbmVzIHdobyB3aWxsICh1c3VhbGx5KSBhY2NlcHQgYQotcGF0Y2ggZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwuCi0KLVN1YnN5c3RlbSBtYWludGFpbmVycyBlYWNoIG1hbmFnZSB0aGVpciBvd24gdmVyc2lvbiBvZiB0aGUga2VybmVsIHNvdXJjZQotdHJlZSwgdXN1YWxseSAoYnV0IGNlcnRhaW5seSBub3QgYWx3YXlzKSB1c2luZyB0aGUgZ2l0IHNvdXJjZSBtYW5hZ2VtZW50Ci10b29sLiAgVG9vbHMgbGlrZSBnaXQgKGFuZCByZWxhdGVkIHRvb2xzIGxpa2UgcXVpbHQgb3IgbWVyY3VyaWFsKSBhbGxvdwotbWFpbnRhaW5lcnMgdG8gdHJhY2sgYSBsaXN0IG9mIHBhdGNoZXMsIGluY2x1ZGluZyBhdXRob3JzaGlwIGluZm9ybWF0aW9uCi1hbmQgb3RoZXIgbWV0YWRhdGEuICBBdCBhbnkgZ2l2ZW4gdGltZSwgdGhlIG1haW50YWluZXIgY2FuIGlkZW50aWZ5IHdoaWNoCi1wYXRjaGVzIGluIGhpcyBvciBoZXIgcmVwb3NpdG9yeSBhcmUgbm90IGZvdW5kIGluIHRoZSBtYWlubGluZS4KLQotV2hlbiB0aGUgbWVyZ2Ugd2luZG93IG9wZW5zLCB0b3AtbGV2ZWwgbWFpbnRhaW5lcnMgd2lsbCBhc2sgTGludXMgdG8gInB1bGwiCi10aGUgcGF0Y2hlcyB0aGV5IGhhdmUgc2VsZWN0ZWQgZm9yIG1lcmdpbmcgZnJvbSB0aGVpciByZXBvc2l0b3JpZXMuICBJZgotTGludXMgYWdyZWVzLCB0aGUgc3RyZWFtIG9mIHBhdGNoZXMgd2lsbCBmbG93IHVwIGludG8gaGlzIHJlcG9zaXRvcnksCi1iZWNvbWluZyBwYXJ0IG9mIHRoZSBtYWlubGluZSBrZXJuZWwuICBUaGUgYW1vdW50IG9mIGF0dGVudGlvbiB0aGF0IExpbnVzCi1wYXlzIHRvIHNwZWNpZmljIHBhdGNoZXMgcmVjZWl2ZWQgaW4gYSBwdWxsIG9wZXJhdGlvbiB2YXJpZXMuICBJdCBpcyBjbGVhcgotdGhhdCwgc29tZXRpbWVzLCBoZSBsb29rcyBxdWl0ZSBjbG9zZWx5LiAgQnV0LCBhcyBhIGdlbmVyYWwgcnVsZSwgTGludXMKLXRydXN0cyB0aGUgc3Vic3lzdGVtIG1haW50YWluZXJzIHRvIG5vdCBzZW5kIGJhZCBwYXRjaGVzIHVwc3RyZWFtLgotCi1TdWJzeXN0ZW0gbWFpbnRhaW5lcnMsIGluIHR1cm4sIGNhbiBwdWxsIHBhdGNoZXMgZnJvbSBvdGhlciBtYWludGFpbmVycy4KLUZvciBleGFtcGxlLCB0aGUgbmV0d29ya2luZyB0cmVlIGlzIGJ1aWx0IGZyb20gcGF0Y2hlcyB3aGljaCBhY2N1bXVsYXRlZAotZmlyc3QgaW4gdHJlZXMgZGVkaWNhdGVkIHRvIG5ldHdvcmsgZGV2aWNlIGRyaXZlcnMsIHdpcmVsZXNzIG5ldHdvcmtpbmcsCi1ldGMuICBUaGlzIGNoYWluIG9mIHJlcG9zaXRvcmllcyBjYW4gYmUgYXJiaXRyYXJpbHkgbG9uZywgdGhvdWdoIGl0IHJhcmVseQotZXhjZWVkcyB0d28gb3IgdGhyZWUgbGlua3MuICBTaW5jZSBlYWNoIG1haW50YWluZXIgaW4gdGhlIGNoYWluIHRydXN0cwotdGhvc2UgbWFuYWdpbmcgbG93ZXItbGV2ZWwgdHJlZXMsIHRoaXMgcHJvY2VzcyBpcyBrbm93biBhcyB0aGUgImNoYWluIG9mCi10cnVzdC4iCi0KLUNsZWFybHksIGluIGEgc3lzdGVtIGxpa2UgdGhpcywgZ2V0dGluZyBwYXRjaGVzIGludG8gdGhlIGtlcm5lbCBkZXBlbmRzIG9uCi1maW5kaW5nIHRoZSByaWdodCBtYWludGFpbmVyLiAgU2VuZGluZyBwYXRjaGVzIGRpcmVjdGx5IHRvIExpbnVzIGlzIG5vdAotbm9ybWFsbHkgdGhlIHJpZ2h0IHdheSB0byBnby4KLQotCi0yLjQ6IE5FWFQgVFJFRVMKLQotVGhlIGNoYWluIG9mIHN1YnN5c3RlbSB0cmVlcyBndWlkZXMgdGhlIGZsb3cgb2YgcGF0Y2hlcyBpbnRvIHRoZSBrZXJuZWwsCi1idXQgaXQgYWxzbyByYWlzZXMgYW4gaW50ZXJlc3RpbmcgcXVlc3Rpb246IHdoYXQgaWYgc29tZWJvZHkgd2FudHMgdG8gbG9vawotYXQgYWxsIG9mIHRoZSBwYXRjaGVzIHdoaWNoIGFyZSBiZWluZyBwcmVwYXJlZCBmb3IgdGhlIG5leHQgbWVyZ2Ugd2luZG93PwotRGV2ZWxvcGVycyB3aWxsIGJlIGludGVyZXN0ZWQgaW4gd2hhdCBvdGhlciBjaGFuZ2VzIGFyZSBwZW5kaW5nIHRvIHNlZQotd2hldGhlciB0aGVyZSBhcmUgYW55IGNvbmZsaWN0cyB0byB3b3JyeSBhYm91dDsgYSBwYXRjaCB3aGljaCBjaGFuZ2VzIGEKLWNvcmUga2VybmVsIGZ1bmN0aW9uIHByb3RvdHlwZSwgZm9yIGV4YW1wbGUsIHdpbGwgY29uZmxpY3Qgd2l0aCBhbnkgb3RoZXIKLXBhdGNoZXMgd2hpY2ggdXNlIHRoZSBvbGRlciBmb3JtIG9mIHRoYXQgZnVuY3Rpb24uICBSZXZpZXdlcnMgYW5kIHRlc3RlcnMKLXdhbnQgYWNjZXNzIHRvIHRoZSBjaGFuZ2VzIGluIHRoZWlyIGludGVncmF0ZWQgZm9ybSBiZWZvcmUgYWxsIG9mIHRob3NlCi1jaGFuZ2VzIGxhbmQgaW4gdGhlIG1haW5saW5lIGtlcm5lbC4gIE9uZSBjb3VsZCBwdWxsIGNoYW5nZXMgZnJvbSBhbGwgb2YKLXRoZSBpbnRlcmVzdGluZyBzdWJzeXN0ZW0gdHJlZXMsIGJ1dCB0aGF0IHdvdWxkIGJlIGEgYmlnIGFuZCBlcnJvci1wcm9uZQotam9iLgotCi1UaGUgYW5zd2VyIGNvbWVzIGluIHRoZSBmb3JtIG9mIC1uZXh0IHRyZWVzLCB3aGVyZSBzdWJzeXN0ZW0gdHJlZXMgYXJlCi1jb2xsZWN0ZWQgZm9yIHRlc3RpbmcgYW5kIHJldmlldy4gIFRoZSBvbGRlciBvZiB0aGVzZSB0cmVlcywgbWFpbnRhaW5lZCBieQotQW5kcmV3IE1vcnRvbiwgaXMgY2FsbGVkICItbW0iIChmb3IgbWVtb3J5IG1hbmFnZW1lbnQsIHdoaWNoIGlzIGhvdyBpdCBnb3QKLXN0YXJ0ZWQpLiAgVGhlIC1tbSB0cmVlIGludGVncmF0ZXMgcGF0Y2hlcyBmcm9tIGEgbG9uZyBsaXN0IG9mIHN1YnN5c3RlbQotdHJlZXM7IGl0IGFsc28gaGFzIHNvbWUgcGF0Y2hlcyBhaW1lZCBhdCBoZWxwaW5nIHdpdGggZGVidWdnaW5nLgotCi1CZXlvbmQgdGhhdCwgLW1tIGNvbnRhaW5zIGEgc2lnbmlmaWNhbnQgY29sbGVjdGlvbiBvZiBwYXRjaGVzIHdoaWNoIGhhdmUKLWJlZW4gc2VsZWN0ZWQgYnkgQW5kcmV3IGRpcmVjdGx5LiAgVGhlc2UgcGF0Y2hlcyBtYXkgaGF2ZSBiZWVuIHBvc3RlZCBvbiBhCi1tYWlsaW5nIGxpc3QsIG9yIHRoZXkgbWF5IGFwcGx5IHRvIGEgcGFydCBvZiB0aGUga2VybmVsIGZvciB3aGljaCB0aGVyZSBpcwotbm8gZGVzaWduYXRlZCBzdWJzeXN0ZW0gdHJlZS4gIEFzIGEgcmVzdWx0LCAtbW0gb3BlcmF0ZXMgYXMgYSBzb3J0IG9mCi1zdWJzeXN0ZW0gdHJlZSBvZiBsYXN0IHJlc29ydDsgaWYgdGhlcmUgaXMgbm8gb3RoZXIgb2J2aW91cyBwYXRoIGZvciBhCi1wYXRjaCBpbnRvIHRoZSBtYWlubGluZSwgaXQgaXMgbGlrZWx5IHRvIGVuZCB1cCBpbiAtbW0uICBNaXNjZWxsYW5lb3VzCi1wYXRjaGVzIHdoaWNoIGFjY3VtdWxhdGUgaW4gLW1tIHdpbGwgZXZlbnR1YWxseSBlaXRoZXIgYmUgZm9yd2FyZGVkIG9uIHRvCi1hbiBhcHByb3ByaWF0ZSBzdWJzeXN0ZW0gdHJlZSBvciBiZSBzZW50IGRpcmVjdGx5IHRvIExpbnVzLiAgSW4gYSB0eXBpY2FsCi1kZXZlbG9wbWVudCBjeWNsZSwgYXBwcm94aW1hdGVseSA1LTEwJSBvZiB0aGUgcGF0Y2hlcyBnb2luZyBpbnRvIHRoZQotbWFpbmxpbmUgZ2V0IHRoZXJlIHZpYSAtbW0uCi0KLVRoZSBjdXJyZW50IC1tbSBwYXRjaCBpcyBhdmFpbGFibGUgaW4gdGhlICJtbW90bSIgKC1tbSBvZiB0aGUgbW9tZW50KQotZGlyZWN0b3J5IGF0OgotCi0JaHR0cDovL3d3dy5vemxhYnMub3JnL35ha3BtL21tb3RtLwotCi1Vc2Ugb2YgdGhlIE1NT1RNIHRyZWUgaXMgbGlrZWx5IHRvIGJlIGEgZnJ1c3RyYXRpbmcgZXhwZXJpZW5jZSwgdGhvdWdoOwotdGhlcmUgaXMgYSBkZWZpbml0ZSBjaGFuY2UgdGhhdCBpdCB3aWxsIG5vdCBldmVuIGNvbXBpbGUuCi0KLVRoZSBwcmltYXJ5IHRyZWUgZm9yIG5leHQtY3ljbGUgcGF0Y2ggbWVyZ2luZyBpcyBsaW51eC1uZXh0LCBtYWludGFpbmVkIGJ5Ci1TdGVwaGVuIFJvdGh3ZWxsLiAgVGhlIGxpbnV4LW5leHQgdHJlZSBpcywgYnkgZGVzaWduLCBhIHNuYXBzaG90IG9mIHdoYXQKLXRoZSBtYWlubGluZSBpcyBleHBlY3RlZCB0byBsb29rIGxpa2UgYWZ0ZXIgdGhlIG5leHQgbWVyZ2Ugd2luZG93IGNsb3Nlcy4KLUxpbnV4LW5leHQgdHJlZXMgYXJlIGFubm91bmNlZCBvbiB0aGUgbGludXgta2VybmVsIGFuZCBsaW51eC1uZXh0IG1haWxpbmcKLWxpc3RzIHdoZW4gdGhleSBhcmUgYXNzZW1ibGVkOyB0aGV5IGNhbiBiZSBkb3dubG9hZGVkIGZyb206Ci0KLQlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9uZXh0LwotCi1MaW51eC1uZXh0IGhhcyBiZWNvbWUgYW4gaW50ZWdyYWwgcGFydCBvZiB0aGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3M7Ci1hbGwgcGF0Y2hlcyBtZXJnZWQgZHVyaW5nIGEgZ2l2ZW4gbWVyZ2Ugd2luZG93IHNob3VsZCByZWFsbHkgaGF2ZSBmb3VuZAotdGhlaXIgd2F5IGludG8gbGludXgtbmV4dCBzb21lIHRpbWUgYmVmb3JlIHRoZSBtZXJnZSB3aW5kb3cgb3BlbnMuCi0KLQotMi40LjE6IFNUQUdJTkcgVFJFRVMKLQotVGhlIGtlcm5lbCBzb3VyY2UgdHJlZSBjb250YWlucyB0aGUgZHJpdmVycy9zdGFnaW5nLyBkaXJlY3RvcnksIHdoZXJlCi1tYW55IHN1Yi1kaXJlY3RvcmllcyBmb3IgZHJpdmVycyBvciBmaWxlc3lzdGVtcyB0aGF0IGFyZSBvbiB0aGVpciB3YXkgdG8KLWJlaW5nIGFkZGVkIHRvIHRoZSBrZXJuZWwgdHJlZSBsaXZlLiAgVGhleSByZW1haW4gaW4gZHJpdmVycy9zdGFnaW5nIHdoaWxlCi10aGV5IHN0aWxsIG5lZWQgbW9yZSB3b3JrOyBvbmNlIGNvbXBsZXRlLCB0aGV5IGNhbiBiZSBtb3ZlZCBpbnRvIHRoZQota2VybmVsIHByb3Blci4gIFRoaXMgaXMgYSB3YXkgdG8ga2VlcCB0cmFjayBvZiBkcml2ZXJzIHRoYXQgYXJlbid0Ci11cCB0byBMaW51eCBrZXJuZWwgY29kaW5nIG9yIHF1YWxpdHkgc3RhbmRhcmRzLCBidXQgcGVvcGxlIG1heSB3YW50IHRvIHVzZQotdGhlbSBhbmQgdHJhY2sgZGV2ZWxvcG1lbnQuCi0KLUdyZWcgS3JvYWgtSGFydG1hbiBjdXJyZW50bHkgbWFpbnRhaW5zIHRoZSBzdGFnaW5nIHRyZWUuICBEcml2ZXJzIHRoYXQKLXN0aWxsIG5lZWQgd29yayBhcmUgc2VudCB0byBoaW0sIHdpdGggZWFjaCBkcml2ZXIgaGF2aW5nIGl0cyBvd24KLXN1YmRpcmVjdG9yeSBpbiBkcml2ZXJzL3N0YWdpbmcvLiAgQWxvbmcgd2l0aCB0aGUgZHJpdmVyIHNvdXJjZSBmaWxlcywgYQotVE9ETyBmaWxlIHNob3VsZCBiZSBwcmVzZW50IGluIHRoZSBkaXJlY3RvcnkgYXMgd2VsbC4gIFRoZSBUT0RPIGZpbGUgbGlzdHMKLXRoZSBwZW5kaW5nIHdvcmsgdGhhdCB0aGUgZHJpdmVyIG5lZWRzIGZvciBhY2NlcHRhbmNlIGludG8gdGhlIGtlcm5lbAotcHJvcGVyLCBhcyB3ZWxsIGFzIGEgbGlzdCBvZiBwZW9wbGUgdGhhdCBzaG91bGQgYmUgQ2MnZCBmb3IgYW55IHBhdGNoZXMgdG8KLXRoZSBkcml2ZXIuICBDdXJyZW50IHJ1bGVzIHJlcXVpcmUgdGhhdCBkcml2ZXJzIGNvbnRyaWJ1dGVkIHRvIHN0YWdpbmcKLW11c3QsIGF0IGEgbWluaW11bSwgY29tcGlsZSBwcm9wZXJseS4KLQotU3RhZ2luZyBjYW4gYmUgYSByZWxhdGl2ZWx5IGVhc3kgd2F5IHRvIGdldCBuZXcgZHJpdmVycyBpbnRvIHRoZSBtYWlubGluZQotd2hlcmUsIHdpdGggbHVjaywgdGhleSB3aWxsIGNvbWUgdG8gdGhlIGF0dGVudGlvbiBvZiBvdGhlciBkZXZlbG9wZXJzIGFuZAotaW1wcm92ZSBxdWlja2x5LiAgRW50cnkgaW50byBzdGFnaW5nIGlzIG5vdCB0aGUgZW5kIG9mIHRoZSBzdG9yeSwgdGhvdWdoOwotY29kZSBpbiBzdGFnaW5nIHdoaWNoIGlzIG5vdCBzZWVpbmcgcmVndWxhciBwcm9ncmVzcyB3aWxsIGV2ZW50dWFsbHkgYmUKLXJlbW92ZWQuICBEaXN0cmlidXRvcnMgYWxzbyB0ZW5kIHRvIGJlIHJlbGF0aXZlbHkgcmVsdWN0YW50IHRvIGVuYWJsZQotc3RhZ2luZyBkcml2ZXJzLiAgU28gc3RhZ2luZyBpcywgYXQgYmVzdCwgYSBzdG9wIG9uIHRoZSB3YXkgdG93YXJkIGJlY29taW5nCi1hIHByb3BlciBtYWlubGluZSBkcml2ZXIuCi0KLQotMi41OiBUT09MUwotCi1BcyBjYW4gYmUgc2VlbiBmcm9tIHRoZSBhYm92ZSB0ZXh0LCB0aGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3MgZGVwZW5kcwotaGVhdmlseSBvbiB0aGUgYWJpbGl0eSB0byBoZXJkIGNvbGxlY3Rpb25zIG9mIHBhdGNoZXMgaW4gdmFyaW91cwotZGlyZWN0aW9ucy4gIFRoZSB3aG9sZSB0aGluZyB3b3VsZCBub3Qgd29yayBhbnl3aGVyZSBuZWFyIGFzIHdlbGwgYXMgaXQKLWRvZXMgd2l0aG91dCBzdWl0YWJseSBwb3dlcmZ1bCB0b29scy4gIFR1dG9yaWFscyBvbiBob3cgdG8gdXNlIHRoZXNlIHRvb2xzCi1hcmUgd2VsbCBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgZG9jdW1lbnQsIGJ1dCB0aGVyZSBpcyBzcGFjZSBmb3IgYSBmZXcKLXBvaW50ZXJzLgotCi1CeSBmYXIgdGhlIGRvbWluYW50IHNvdXJjZSBjb2RlIG1hbmFnZW1lbnQgc3lzdGVtIHVzZWQgYnkgdGhlIGtlcm5lbAotY29tbXVuaXR5IGlzIGdpdC4gIEdpdCBpcyBvbmUgb2YgYSBudW1iZXIgb2YgZGlzdHJpYnV0ZWQgdmVyc2lvbiBjb250cm9sCi1zeXN0ZW1zIGJlaW5nIGRldmVsb3BlZCBpbiB0aGUgZnJlZSBzb2Z0d2FyZSBjb21tdW5pdHkuICBJdCBpcyB3ZWxsIHR1bmVkCi1mb3Iga2VybmVsIGRldmVsb3BtZW50LCBpbiB0aGF0IGl0IHBlcmZvcm1zIHF1aXRlIHdlbGwgd2hlbiBkZWFsaW5nIHdpdGgKLWxhcmdlIHJlcG9zaXRvcmllcyBhbmQgbGFyZ2UgbnVtYmVycyBvZiBwYXRjaGVzLiAgSXQgYWxzbyBoYXMgYSByZXB1dGF0aW9uCi1mb3IgYmVpbmcgZGlmZmljdWx0IHRvIGxlYXJuIGFuZCB1c2UsIHRob3VnaCBpdCBoYXMgZ290dGVuIGJldHRlciBvdmVyCi10aW1lLiAgU29tZSBzb3J0IG9mIGZhbWlsaWFyaXR5IHdpdGggZ2l0IGlzIGFsbW9zdCBhIHJlcXVpcmVtZW50IGZvciBrZXJuZWwKLWRldmVsb3BlcnM7IGV2ZW4gaWYgdGhleSBkbyBub3QgdXNlIGl0IGZvciB0aGVpciBvd24gd29yaywgdGhleSdsbCBuZWVkIGdpdAotdG8ga2VlcCB1cCB3aXRoIHdoYXQgb3RoZXIgZGV2ZWxvcGVycyAoYW5kIHRoZSBtYWlubGluZSkgYXJlIGRvaW5nLgotCi1HaXQgaXMgbm93IHBhY2thZ2VkIGJ5IGFsbW9zdCBhbGwgTGludXggZGlzdHJpYnV0aW9ucy4gIFRoZXJlIGlzIGEgaG9tZQotcGFnZSBhdDoKLQotCWh0dHA6Ly9naXQtc2NtLmNvbS8KLQotVGhhdCBwYWdlIGhhcyBwb2ludGVycyB0byBkb2N1bWVudGF0aW9uIGFuZCB0dXRvcmlhbHMuCi0KLUFtb25nIHRoZSBrZXJuZWwgZGV2ZWxvcGVycyB3aG8gZG8gbm90IHVzZSBnaXQsIHRoZSBtb3N0IHBvcHVsYXIgY2hvaWNlIGlzCi1hbG1vc3QgY2VydGFpbmx5IE1lcmN1cmlhbDoKLQotCWh0dHA6Ly93d3cuc2VsZW5pYy5jb20vbWVyY3VyaWFsLwotCi1NZXJjdXJpYWwgc2hhcmVzIG1hbnkgZmVhdHVyZXMgd2l0aCBnaXQsIGJ1dCBpdCBwcm92aWRlcyBhbiBpbnRlcmZhY2Ugd2hpY2gKLW1hbnkgZmluZCBlYXNpZXIgdG8gdXNlLgotCi1UaGUgb3RoZXIgdG9vbCB3b3J0aCBrbm93aW5nIGFib3V0IGlzIFF1aWx0OgotCi0JaHR0cDovL3NhdmFubmFoLm5vbmdudS5vcmcvcHJvamVjdHMvcXVpbHQvCi0KLVF1aWx0IGlzIGEgcGF0Y2ggbWFuYWdlbWVudCBzeXN0ZW0sIHJhdGhlciB0aGFuIGEgc291cmNlIGNvZGUgbWFuYWdlbWVudAotc3lzdGVtLiAgSXQgZG9lcyBub3QgdHJhY2sgaGlzdG9yeSBvdmVyIHRpbWU7IGl0IGlzLCBpbnN0ZWFkLCBvcmllbnRlZAotdG93YXJkIHRyYWNraW5nIGEgc3BlY2lmaWMgc2V0IG9mIGNoYW5nZXMgYWdhaW5zdCBhbiBldm9sdmluZyBjb2RlIGJhc2UuCi1Tb21lIG1ham9yIHN1YnN5c3RlbSBtYWludGFpbmVycyB1c2UgcXVpbHQgdG8gbWFuYWdlIHBhdGNoZXMgaW50ZW5kZWQgdG8gZ28KLXVwc3RyZWFtLiAgRm9yIHRoZSBtYW5hZ2VtZW50IG9mIGNlcnRhaW4ga2luZHMgb2YgdHJlZXMgKC1tbSwgZm9yIGV4YW1wbGUpLAotcXVpbHQgaXMgdGhlIGJlc3QgdG9vbCBmb3IgdGhlIGpvYi4KLQotCi0yLjY6IE1BSUxJTkcgTElTVFMKLQotQSBncmVhdCBkZWFsIG9mIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCB3b3JrIGlzIGRvbmUgYnkgd2F5IG9mIG1haWxpbmcKLWxpc3RzLiAgSXQgaXMgaGFyZCB0byBiZSBhIGZ1bGx5LWZ1bmN0aW9uaW5nIG1lbWJlciBvZiB0aGUgY29tbXVuaXR5Ci13aXRob3V0IGpvaW5pbmcgYXQgbGVhc3Qgb25lIGxpc3Qgc29tZXdoZXJlLiAgQnV0IExpbnV4IG1haWxpbmcgbGlzdHMgYWxzbwotcmVwcmVzZW50IGEgcG90ZW50aWFsIGhhemFyZCB0byBkZXZlbG9wZXJzLCB3aG8gcmlzayBnZXR0aW5nIGJ1cmllZCB1bmRlciBhCi1sb2FkIG9mIGVsZWN0cm9uaWMgbWFpbCwgcnVubmluZyBhZm91bCBvZiB0aGUgY29udmVudGlvbnMgdXNlZCBvbiB0aGUgTGludXgKLWxpc3RzLCBvciBib3RoLgotCi1Nb3N0IGtlcm5lbCBtYWlsaW5nIGxpc3RzIGFyZSBydW4gb24gdmdlci5rZXJuZWwub3JnOyB0aGUgbWFzdGVyIGxpc3QgY2FuCi1iZSBmb3VuZCBhdDoKLQotCWh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvdmdlci1saXN0cy5odG1sCi0KLVRoZXJlIGFyZSBsaXN0cyBob3N0ZWQgZWxzZXdoZXJlLCB0aG91Z2g7IGEgbnVtYmVyIG9mIHRoZW0gYXJlIGF0Ci1saXN0cy5yZWRoYXQuY29tLgotCi1UaGUgY29yZSBtYWlsaW5nIGxpc3QgZm9yIGtlcm5lbCBkZXZlbG9wbWVudCBpcywgb2YgY291cnNlLCBsaW51eC1rZXJuZWwuCi1UaGlzIGxpc3QgaXMgYW4gaW50aW1pZGF0aW5nIHBsYWNlIHRvIGJlOyB2b2x1bWUgY2FuIHJlYWNoIDUwMCBtZXNzYWdlcyBwZXIKLWRheSwgdGhlIGFtb3VudCBvZiBub2lzZSBpcyBoaWdoLCB0aGUgY29udmVyc2F0aW9uIGNhbiBiZSBzZXZlcmVseQotdGVjaG5pY2FsLCBhbmQgcGFydGljaXBhbnRzIGFyZSBub3QgYWx3YXlzIGNvbmNlcm5lZCB3aXRoIHNob3dpbmcgYSBoaWdoCi1kZWdyZWUgb2YgcG9saXRlbmVzcy4gIEJ1dCB0aGVyZSBpcyBubyBvdGhlciBwbGFjZSB3aGVyZSB0aGUga2VybmVsCi1kZXZlbG9wbWVudCBjb21tdW5pdHkgY29tZXMgdG9nZXRoZXIgYXMgYSB3aG9sZTsgZGV2ZWxvcGVycyB3aG8gYXZvaWQgdGhpcwotbGlzdCB3aWxsIG1pc3MgaW1wb3J0YW50IGluZm9ybWF0aW9uLgotCi1UaGVyZSBhcmUgYSBmZXcgaGludHMgd2hpY2ggY2FuIGhlbHAgd2l0aCBsaW51eC1rZXJuZWwgc3Vydml2YWw6Ci0KLS0gSGF2ZSB0aGUgbGlzdCBkZWxpdmVyZWQgdG8gYSBzZXBhcmF0ZSBmb2xkZXIsIHJhdGhlciB0aGFuIHlvdXIgbWFpbgotICBtYWlsYm94LiAgT25lIG11c3QgYmUgYWJsZSB0byBpZ25vcmUgdGhlIHN0cmVhbSBmb3Igc3VzdGFpbmVkIHBlcmlvZHMgb2YKLSAgdGltZS4KLQotLSBEbyBub3QgdHJ5IHRvIGZvbGxvdyBldmVyeSBjb252ZXJzYXRpb24gLSBub2JvZHkgZWxzZSBkb2VzLiAgSXQgaXMKLSAgaW1wb3J0YW50IHRvIGZpbHRlciBvbiBib3RoIHRoZSB0b3BpYyBvZiBpbnRlcmVzdCAodGhvdWdoIG5vdGUgdGhhdAotICBsb25nLXJ1bm5pbmcgY29udmVyc2F0aW9ucyBjYW4gZHJpZnQgYXdheSBmcm9tIHRoZSBvcmlnaW5hbCBzdWJqZWN0Ci0gIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGVtYWlsIHN1YmplY3QgbGluZSkgYW5kIHRoZSBwZW9wbGUgd2hvIGFyZQotICBwYXJ0aWNpcGF0aW5nLgotCi0tIERvIG5vdCBmZWVkIHRoZSB0cm9sbHMuICBJZiBzb21lYm9keSBpcyB0cnlpbmcgdG8gc3RpciB1cCBhbiBhbmdyeQotICByZXNwb25zZSwgaWdub3JlIHRoZW0uCi0KLS0gV2hlbiByZXNwb25kaW5nIHRvIGxpbnV4LWtlcm5lbCBlbWFpbCAob3IgdGhhdCBvbiBvdGhlciBsaXN0cykgcHJlc2VydmUKLSAgdGhlIENjOiBoZWFkZXIgZm9yIGFsbCBpbnZvbHZlZC4gIEluIHRoZSBhYnNlbmNlIG9mIGEgc3Ryb25nIHJlYXNvbiAoc3VjaAotICBhcyBhbiBleHBsaWNpdCByZXF1ZXN0KSwgeW91IHNob3VsZCBuZXZlciByZW1vdmUgcmVjaXBpZW50cy4gIEFsd2F5cyBtYWtlCi0gIHN1cmUgdGhhdCB0aGUgcGVyc29uIHlvdSBhcmUgcmVzcG9uZGluZyB0byBpcyBpbiB0aGUgQ2M6IGxpc3QuICBUaGlzCi0gIGNvbnZlbnRpb24gYWxzbyBtYWtlcyBpdCB1bm5lY2Vzc2FyeSB0byBleHBsaWNpdGx5IGFzayB0byBiZSBjb3BpZWQgb24KLSAgcmVwbGllcyB0byB5b3VyIHBvc3RpbmdzLgotCi0tIFNlYXJjaCB0aGUgbGlzdCBhcmNoaXZlcyAoYW5kIHRoZSBuZXQgYXMgYSB3aG9sZSkgYmVmb3JlIGFza2luZwotICBxdWVzdGlvbnMuICBTb21lIGRldmVsb3BlcnMgY2FuIGdldCBpbXBhdGllbnQgd2l0aCBwZW9wbGUgd2hvIGNsZWFybHkKLSAgaGF2ZSBub3QgZG9uZSB0aGVpciBob21ld29yay4KLQotLSBBdm9pZCB0b3AtcG9zdGluZyAodGhlIHByYWN0aWNlIG9mIHB1dHRpbmcgeW91ciBhbnN3ZXIgYWJvdmUgdGhlIHF1b3RlZAotICB0ZXh0IHlvdSBhcmUgcmVzcG9uZGluZyB0bykuICBJdCBtYWtlcyB5b3VyIHJlc3BvbnNlIGhhcmRlciB0byByZWFkIGFuZAotICBtYWtlcyBhIHBvb3IgaW1wcmVzc2lvbi4KLQotLSBBc2sgb24gdGhlIGNvcnJlY3QgbWFpbGluZyBsaXN0LiAgTGludXgta2VybmVsIG1heSBiZSB0aGUgZ2VuZXJhbCBtZWV0aW5nCi0gIHBvaW50LCBidXQgaXQgaXMgbm90IHRoZSBiZXN0IHBsYWNlIHRvIGZpbmQgZGV2ZWxvcGVycyBmcm9tIGFsbAotICBzdWJzeXN0ZW1zLgotCi1UaGUgbGFzdCBwb2ludCAtIGZpbmRpbmcgdGhlIGNvcnJlY3QgbWFpbGluZyBsaXN0IC0gaXMgYSBjb21tb24gcGxhY2UgZm9yCi1iZWdpbm5pbmcgZGV2ZWxvcGVycyB0byBnbyB3cm9uZy4gIFNvbWVib2R5IHdobyBhc2tzIGEgbmV0d29ya2luZy1yZWxhdGVkCi1xdWVzdGlvbiBvbiBsaW51eC1rZXJuZWwgd2lsbCBhbG1vc3QgY2VydGFpbmx5IHJlY2VpdmUgYSBwb2xpdGUgc3VnZ2VzdGlvbgotdG8gYXNrIG9uIHRoZSBuZXRkZXYgbGlzdCBpbnN0ZWFkLCBhcyB0aGF0IGlzIHRoZSBsaXN0IGZyZXF1ZW50ZWQgYnkgbW9zdAotbmV0d29ya2luZyBkZXZlbG9wZXJzLiAgT3RoZXIgbGlzdHMgZXhpc3QgZm9yIHRoZSBTQ1NJLCB2aWRlbzRsaW51eCwgSURFLAotZmlsZXN5c3RlbSwgZXRjLiBzdWJzeXN0ZW1zLiAgVGhlIGJlc3QgcGxhY2UgdG8gbG9vayBmb3IgbWFpbGluZyBsaXN0cyBpcwotaW4gdGhlIE1BSU5UQUlORVJTIGZpbGUgcGFja2FnZWQgd2l0aCB0aGUga2VybmVsIHNvdXJjZS4KLQotCi0yLjc6IEdFVFRJTkcgU1RBUlRFRCBXSVRIIEtFUk5FTCBERVZFTE9QTUVOVAotCi1RdWVzdGlvbnMgYWJvdXQgaG93IHRvIGdldCBzdGFydGVkIHdpdGggdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzIGFyZQotY29tbW9uIC0gZnJvbSBib3RoIGluZGl2aWR1YWxzIGFuZCBjb21wYW5pZXMuICBFcXVhbGx5IGNvbW1vbiBhcmUgbWlzc3RlcHMKLXdoaWNoIG1ha2UgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVsYXRpb25zaGlwIGhhcmRlciB0aGFuIGl0IGhhcyB0byBiZS4KLQotQ29tcGFuaWVzIG9mdGVuIGxvb2sgdG8gaGlyZSB3ZWxsLWtub3duIGRldmVsb3BlcnMgdG8gZ2V0IGEgZGV2ZWxvcG1lbnQKLWdyb3VwIHN0YXJ0ZWQuICBUaGlzIGNhbiwgaW4gZmFjdCwgYmUgYW4gZWZmZWN0aXZlIHRlY2huaXF1ZS4gIEJ1dCBpdCBhbHNvCi10ZW5kcyB0byBiZSBleHBlbnNpdmUgYW5kIGRvZXMgbm90IGRvIG11Y2ggdG8gZ3JvdyB0aGUgcG9vbCBvZiBleHBlcmllbmNlZAota2VybmVsIGRldmVsb3BlcnMuICBJdCBpcyBwb3NzaWJsZSB0byBicmluZyBpbi1ob3VzZSBkZXZlbG9wZXJzIHVwIHRvIHNwZWVkCi1vbiBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQsIGdpdmVuIHRoZSBpbnZlc3RtZW50IG9mIGEgYml0IG9mIHRpbWUuICBUYWtpbmcKLXRoaXMgdGltZSBjYW4gZW5kb3cgYW4gZW1wbG95ZXIgd2l0aCBhIGdyb3VwIG9mIGRldmVsb3BlcnMgd2hvIHVuZGVyc3RhbmQKLXRoZSBrZXJuZWwgYW5kIHRoZSBjb21wYW55IGJvdGgsIGFuZCB3aG8gY2FuIGhlbHAgdG8gdHJhaW4gb3RoZXJzIGFzIHdlbGwuCi1PdmVyIHRoZSBtZWRpdW0gdGVybSwgdGhpcyBpcyBvZnRlbiB0aGUgbW9yZSBwcm9maXRhYmxlIGFwcHJvYWNoLgotCi1JbmRpdmlkdWFsIGRldmVsb3BlcnMgYXJlIG9mdGVuLCB1bmRlcnN0YW5kYWJseSwgYXQgYSBsb3NzIGZvciBhIHBsYWNlIHRvCi1zdGFydC4gIEJlZ2lubmluZyB3aXRoIGEgbGFyZ2UgcHJvamVjdCBjYW4gYmUgaW50aW1pZGF0aW5nOyBvbmUgb2Z0ZW4gd2FudHMKLXRvIHRlc3QgdGhlIHdhdGVycyB3aXRoIHNvbWV0aGluZyBzbWFsbGVyIGZpcnN0LiAgVGhpcyBpcyB0aGUgcG9pbnQgd2hlcmUKLXNvbWUgZGV2ZWxvcGVycyBqdW1wIGludG8gdGhlIGNyZWF0aW9uIG9mIHBhdGNoZXMgZml4aW5nIHNwZWxsaW5nIGVycm9ycyBvcgotbWlub3IgY29kaW5nIHN0eWxlIGlzc3Vlcy4gIFVuZm9ydHVuYXRlbHksIHN1Y2ggcGF0Y2hlcyBjcmVhdGUgYSBsZXZlbCBvZgotbm9pc2Ugd2hpY2ggaXMgZGlzdHJhY3RpbmcgZm9yIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgYXMgYSB3aG9sZSwgc28sCi1pbmNyZWFzaW5nbHksIHRoZXkgYXJlIGxvb2tlZCBkb3duIHVwb24uICBOZXcgZGV2ZWxvcGVycyB3aXNoaW5nIHRvCi1pbnRyb2R1Y2UgdGhlbXNlbHZlcyB0byB0aGUgY29tbXVuaXR5IHdpbGwgbm90IGdldCB0aGUgc29ydCBvZiByZWNlcHRpb24KLXRoZXkgd2lzaCBmb3IgYnkgdGhlc2UgbWVhbnMuCi0KLUFuZHJldyBNb3J0b24gZ2l2ZXMgdGhpcyBhZHZpY2UgZm9yIGFzcGlyaW5nIGtlcm5lbCBkZXZlbG9wZXJzCi0KLQlUaGUgIzEgcHJvamVjdCBmb3IgYWxsIGtlcm5lbCBiZWdpbm5lcnMgc2hvdWxkIHN1cmVseSBiZSAibWFrZSBzdXJlCi0JdGhhdCB0aGUga2VybmVsIHJ1bnMgcGVyZmVjdGx5IGF0IGFsbCB0aW1lcyBvbiBhbGwgbWFjaGluZXMgd2hpY2gKLQl5b3UgY2FuIGxheSB5b3VyIGhhbmRzIG9uIi4gIFVzdWFsbHkgdGhlIHdheSB0byBkbyB0aGlzIGlzIHRvIHdvcmsKLQl3aXRoIG90aGVycyBvbiBnZXR0aW5nIHRoaW5ncyBmaXhlZCB1cCAodGhpcyBjYW4gcmVxdWlyZQotCXBlcnNpc3RlbmNlISkgYnV0IHRoYXQncyBmaW5lIC0gaXQncyBhIHBhcnQgb2Yga2VybmVsIGRldmVsb3BtZW50LgotCi0oaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvMjgzOTgyLykuCi0KLUluIHRoZSBhYnNlbmNlIG9mIG9idmlvdXMgcHJvYmxlbXMgdG8gZml4LCBkZXZlbG9wZXJzIGFyZSBhZHZpc2VkIHRvIGxvb2sKLWF0IHRoZSBjdXJyZW50IGxpc3RzIG9mIHJlZ3Jlc3Npb25zIGFuZCBvcGVuIGJ1Z3MgaW4gZ2VuZXJhbC4gIFRoZXJlIGlzCi1uZXZlciBhbnkgc2hvcnRhZ2Ugb2YgaXNzdWVzIGluIG5lZWQgb2YgZml4aW5nOyBieSBhZGRyZXNzaW5nIHRoZXNlIGlzc3VlcywKLWRldmVsb3BlcnMgd2lsbCBnYWluIGV4cGVyaWVuY2Ugd2l0aCB0aGUgcHJvY2VzcyB3aGlsZSwgYXQgdGhlIHNhbWUgdGltZSwKLWJ1aWxkaW5nIHJlc3BlY3Qgd2l0aCB0aGUgcmVzdCBvZiB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzIuUHJvY2Vzcy5yc3QgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMi5Qcm9jZXNzLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTU1NjFiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzIuUHJvY2Vzcy5yc3QKQEAgLTAsMCArMSw0OTcgQEAKKy4uIF9kZXZlbG9wbWVudF9wcm9jZXNzOgorCitIb3cgdGhlIGRldmVsb3BtZW50IHByb2Nlc3Mgd29ya3MKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgaW4gdGhlIGVhcmx5IDE5OTAncyB3YXMgYSBwcmV0dHkgbG9vc2UgYWZmYWlyLAord2l0aCByZWxhdGl2ZWx5IHNtYWxsIG51bWJlcnMgb2YgdXNlcnMgYW5kIGRldmVsb3BlcnMgaW52b2x2ZWQuICBXaXRoIGEKK3VzZXIgYmFzZSBpbiB0aGUgbWlsbGlvbnMgYW5kIHdpdGggc29tZSAyLDAwMCBkZXZlbG9wZXJzIGludm9sdmVkIG92ZXIgdGhlCitjb3Vyc2Ugb2Ygb25lIHllYXIsIHRoZSBrZXJuZWwgaGFzIHNpbmNlIGhhZCB0byBldm9sdmUgYSBudW1iZXIgb2YKK3Byb2Nlc3NlcyB0byBrZWVwIGRldmVsb3BtZW50IGhhcHBlbmluZyBzbW9vdGhseS4gIEEgc29saWQgdW5kZXJzdGFuZGluZyBvZgoraG93IHRoZSBwcm9jZXNzIHdvcmtzIGlzIHJlcXVpcmVkIGluIG9yZGVyIHRvIGJlIGFuIGVmZmVjdGl2ZSBwYXJ0IG9mIGl0LgorCitUaGUgYmlnIHBpY3R1cmUKKy0tLS0tLS0tLS0tLS0tLQorCitUaGUga2VybmVsIGRldmVsb3BlcnMgdXNlIGEgbG9vc2VseSB0aW1lLWJhc2VkIHJlbGVhc2UgcHJvY2Vzcywgd2l0aCBhIG5ldworbWFqb3Iga2VybmVsIHJlbGVhc2UgaGFwcGVuaW5nIGV2ZXJ5IHR3byBvciB0aHJlZSBtb250aHMuICBUaGUgcmVjZW50CityZWxlYXNlIGhpc3RvcnkgbG9va3MgbGlrZSB0aGlzOgorCisJPT09PT09ICA9PT09PT09PT09PT09PT09PQorCTIuNi4zOAlNYXJjaCAxNCwgMjAxMQorCTIuNi4zNwlKYW51YXJ5IDQsIDIwMTEKKwkyLjYuMzYJT2N0b2JlciAyMCwgMjAxMAorCTIuNi4zNQlBdWd1c3QgMSwgMjAxMAorCTIuNi4zNAlNYXkgMTUsIDIwMTAKKwkyLjYuMzMJRmVicnVhcnkgMjQsIDIwMTAKKwk9PT09PT0gID09PT09PT09PT09PT09PT09CisKK0V2ZXJ5IDIuNi54IHJlbGVhc2UgaXMgYSBtYWpvciBrZXJuZWwgcmVsZWFzZSB3aXRoIG5ldyBmZWF0dXJlcywgaW50ZXJuYWwKK0FQSSBjaGFuZ2VzLCBhbmQgbW9yZS4gIEEgdHlwaWNhbCAyLjYgcmVsZWFzZSBjYW4gY29udGFpbiBuZWFybHkgMTAsMDAwCitjaGFuZ2VzZXRzIHdpdGggY2hhbmdlcyB0byBzZXZlcmFsIGh1bmRyZWQgdGhvdXNhbmQgbGluZXMgb2YgY29kZS4gIDIuNiBpcwordGh1cyB0aGUgbGVhZGluZyBlZGdlIG9mIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudDsgdGhlIGtlcm5lbCB1c2VzIGEKK3JvbGxpbmcgZGV2ZWxvcG1lbnQgbW9kZWwgd2hpY2ggaXMgY29udGludWFsbHkgaW50ZWdyYXRpbmcgbWFqb3IgY2hhbmdlcy4KKworQSByZWxhdGl2ZWx5IHN0cmFpZ2h0Zm9yd2FyZCBkaXNjaXBsaW5lIGlzIGZvbGxvd2VkIHdpdGggcmVnYXJkIHRvIHRoZQorbWVyZ2luZyBvZiBwYXRjaGVzIGZvciBlYWNoIHJlbGVhc2UuICBBdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggZGV2ZWxvcG1lbnQKK2N5Y2xlLCB0aGUgIm1lcmdlIHdpbmRvdyIgaXMgc2FpZCB0byBiZSBvcGVuLiAgQXQgdGhhdCB0aW1lLCBjb2RlIHdoaWNoIGlzCitkZWVtZWQgdG8gYmUgc3VmZmljaWVudGx5IHN0YWJsZSAoYW5kIHdoaWNoIGlzIGFjY2VwdGVkIGJ5IHRoZSBkZXZlbG9wbWVudAorY29tbXVuaXR5KSBpcyBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUga2VybmVsLiAgVGhlIGJ1bGsgb2YgY2hhbmdlcyBmb3IgYQorbmV3IGRldmVsb3BtZW50IGN5Y2xlIChhbmQgYWxsIG9mIHRoZSBtYWpvciBjaGFuZ2VzKSB3aWxsIGJlIG1lcmdlZCBkdXJpbmcKK3RoaXMgdGltZSwgYXQgYSByYXRlIGFwcHJvYWNoaW5nIDEsMDAwIGNoYW5nZXMgKCJwYXRjaGVzLCIgb3IgImNoYW5nZXNldHMiKQorcGVyIGRheS4KKworKEFzIGFuIGFzaWRlLCBpdCBpcyB3b3J0aCBub3RpbmcgdGhhdCB0aGUgY2hhbmdlcyBpbnRlZ3JhdGVkIGR1cmluZyB0aGUKK21lcmdlIHdpbmRvdyBkbyBub3QgY29tZSBvdXQgb2YgdGhpbiBhaXI7IHRoZXkgaGF2ZSBiZWVuIGNvbGxlY3RlZCwgdGVzdGVkLAorYW5kIHN0YWdlZCBhaGVhZCBvZiB0aW1lLiAgSG93IHRoYXQgcHJvY2VzcyB3b3JrcyB3aWxsIGJlIGRlc2NyaWJlZCBpbgorZGV0YWlsIGxhdGVyIG9uKS4KKworVGhlIG1lcmdlIHdpbmRvdyBsYXN0cyBmb3IgYXBwcm94aW1hdGVseSB0d28gd2Vla3MuICBBdCB0aGUgZW5kIG9mIHRoaXMKK3RpbWUsIExpbnVzIFRvcnZhbGRzIHdpbGwgZGVjbGFyZSB0aGF0IHRoZSB3aW5kb3cgaXMgY2xvc2VkIGFuZCByZWxlYXNlIHRoZQorZmlyc3Qgb2YgdGhlICJyYyIga2VybmVscy4gIEZvciB0aGUga2VybmVsIHdoaWNoIGlzIGRlc3RpbmVkIHRvIGJlIDIuNi40MCwKK2ZvciBleGFtcGxlLCB0aGUgcmVsZWFzZSB3aGljaCBoYXBwZW5zIGF0IHRoZSBlbmQgb2YgdGhlIG1lcmdlIHdpbmRvdyB3aWxsCitiZSBjYWxsZWQgMi42LjQwLXJjMS4gIFRoZSAtcmMxIHJlbGVhc2UgaXMgdGhlIHNpZ25hbCB0aGF0IHRoZSB0aW1lIHRvCittZXJnZSBuZXcgZmVhdHVyZXMgaGFzIHBhc3NlZCwgYW5kIHRoYXQgdGhlIHRpbWUgdG8gc3RhYmlsaXplIHRoZSBuZXh0CitrZXJuZWwgaGFzIGJlZ3VuLgorCitPdmVyIHRoZSBuZXh0IHNpeCB0byB0ZW4gd2Vla3MsIG9ubHkgcGF0Y2hlcyB3aGljaCBmaXggcHJvYmxlbXMgc2hvdWxkIGJlCitzdWJtaXR0ZWQgdG8gdGhlIG1haW5saW5lLiAgT24gb2NjYXNpb24gYSBtb3JlIHNpZ25pZmljYW50IGNoYW5nZSB3aWxsIGJlCithbGxvd2VkLCBidXQgc3VjaCBvY2Nhc2lvbnMgYXJlIHJhcmU7IGRldmVsb3BlcnMgd2hvIHRyeSB0byBtZXJnZSBuZXcKK2ZlYXR1cmVzIG91dHNpZGUgb2YgdGhlIG1lcmdlIHdpbmRvdyB0ZW5kIHRvIGdldCBhbiB1bmZyaWVuZGx5IHJlY2VwdGlvbi4KK0FzIGEgZ2VuZXJhbCBydWxlLCBpZiB5b3UgbWlzcyB0aGUgbWVyZ2Ugd2luZG93IGZvciBhIGdpdmVuIGZlYXR1cmUsIHRoZQorYmVzdCB0aGluZyB0byBkbyBpcyB0byB3YWl0IGZvciB0aGUgbmV4dCBkZXZlbG9wbWVudCBjeWNsZS4gIChBbiBvY2Nhc2lvbmFsCitleGNlcHRpb24gaXMgbWFkZSBmb3IgZHJpdmVycyBmb3IgcHJldmlvdXNseS11bnN1cHBvcnRlZCBoYXJkd2FyZTsgaWYgdGhleQordG91Y2ggbm8gaW4tdHJlZSBjb2RlLCB0aGV5IGNhbm5vdCBjYXVzZSByZWdyZXNzaW9ucyBhbmQgc2hvdWxkIGJlIHNhZmUgdG8KK2FkZCBhdCBhbnkgdGltZSkuCisKK0FzIGZpeGVzIG1ha2UgdGhlaXIgd2F5IGludG8gdGhlIG1haW5saW5lLCB0aGUgcGF0Y2ggcmF0ZSB3aWxsIHNsb3cgb3ZlcgordGltZS4gIExpbnVzIHJlbGVhc2VzIG5ldyAtcmMga2VybmVscyBhYm91dCBvbmNlIGEgd2VlazsgYSBub3JtYWwgc2VyaWVzCit3aWxsIGdldCB1cCB0byBzb21ld2hlcmUgYmV0d2VlbiAtcmM2IGFuZCAtcmM5IGJlZm9yZSB0aGUga2VybmVsIGlzCitjb25zaWRlcmVkIHRvIGJlIHN1ZmZpY2llbnRseSBzdGFibGUgYW5kIHRoZSBmaW5hbCAyLjYueCByZWxlYXNlIGlzIG1hZGUuCitBdCB0aGF0IHBvaW50IHRoZSB3aG9sZSBwcm9jZXNzIHN0YXJ0cyBvdmVyIGFnYWluLgorCitBcyBhbiBleGFtcGxlLCBoZXJlIGlzIGhvdyB0aGUgMi42LjM4IGRldmVsb3BtZW50IGN5Y2xlIHdlbnQgKGFsbCBkYXRlcyBpbgorMjAxMSk6CisKKwk9PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCUphbnVhcnkgNAkyLjYuMzcgc3RhYmxlIHJlbGVhc2UKKwlKYW51YXJ5IDE4CTIuNi4zOC1yYzEsIG1lcmdlIHdpbmRvdyBjbG9zZXMKKwlKYW51YXJ5IDIxCTIuNi4zOC1yYzIKKwlGZWJydWFyeSAxCTIuNi4zOC1yYzMKKwlGZWJydWFyeSA3CTIuNi4zOC1yYzQKKwlGZWJydWFyeSAxNQkyLjYuMzgtcmM1CisJRmVicnVhcnkgMjEJMi42LjM4LXJjNgorCU1hcmNoIDEJCTIuNi4zOC1yYzcKKwlNYXJjaCA3CQkyLjYuMzgtcmM4CisJTWFyY2ggMTQJMi42LjM4IHN0YWJsZSByZWxlYXNlCisJPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSG93IGRvIHRoZSBkZXZlbG9wZXJzIGRlY2lkZSB3aGVuIHRvIGNsb3NlIHRoZSBkZXZlbG9wbWVudCBjeWNsZSBhbmQgY3JlYXRlCit0aGUgc3RhYmxlIHJlbGVhc2U/ICBUaGUgbW9zdCBzaWduaWZpY2FudCBtZXRyaWMgdXNlZCBpcyB0aGUgbGlzdCBvZgorcmVncmVzc2lvbnMgZnJvbSBwcmV2aW91cyByZWxlYXNlcy4gIE5vIGJ1Z3MgYXJlIHdlbGNvbWUsIGJ1dCB0aG9zZSB3aGljaAorYnJlYWsgc3lzdGVtcyB3aGljaCB3b3JrZWQgaW4gdGhlIHBhc3QgYXJlIGNvbnNpZGVyZWQgdG8gYmUgZXNwZWNpYWxseQorc2VyaW91cy4gIEZvciB0aGlzIHJlYXNvbiwgcGF0Y2hlcyB3aGljaCBjYXVzZSByZWdyZXNzaW9ucyBhcmUgbG9va2VkIHVwb24KK3VuZmF2b3JhYmx5IGFuZCBhcmUgcXVpdGUgbGlrZWx5IHRvIGJlIHJldmVydGVkIGR1cmluZyB0aGUgc3RhYmlsaXphdGlvbgorcGVyaW9kLgorCitUaGUgZGV2ZWxvcGVycycgZ29hbCBpcyB0byBmaXggYWxsIGtub3duIHJlZ3Jlc3Npb25zIGJlZm9yZSB0aGUgc3RhYmxlCityZWxlYXNlIGlzIG1hZGUuICBJbiB0aGUgcmVhbCB3b3JsZCwgdGhpcyBraW5kIG9mIHBlcmZlY3Rpb24gaXMgaGFyZCB0bworYWNoaWV2ZTsgdGhlcmUgYXJlIGp1c3QgdG9vIG1hbnkgdmFyaWFibGVzIGluIGEgcHJvamVjdCBvZiB0aGlzIHNpemUuCitUaGVyZSBjb21lcyBhIHBvaW50IHdoZXJlIGRlbGF5aW5nIHRoZSBmaW5hbCByZWxlYXNlIGp1c3QgbWFrZXMgdGhlIHByb2JsZW0KK3dvcnNlOyB0aGUgcGlsZSBvZiBjaGFuZ2VzIHdhaXRpbmcgZm9yIHRoZSBuZXh0IG1lcmdlIHdpbmRvdyB3aWxsIGdyb3cKK2xhcmdlciwgY3JlYXRpbmcgZXZlbiBtb3JlIHJlZ3Jlc3Npb25zIHRoZSBuZXh0IHRpbWUgYXJvdW5kLiAgU28gbW9zdCAyLjYueAora2VybmVscyBnbyBvdXQgd2l0aCBhIGhhbmRmdWwgb2Yga25vd24gcmVncmVzc2lvbnMgdGhvdWdoLCBob3BlZnVsbHksIG5vbmUKK29mIHRoZW0gYXJlIHNlcmlvdXMuCisKK09uY2UgYSBzdGFibGUgcmVsZWFzZSBpcyBtYWRlLCBpdHMgb25nb2luZyBtYWludGVuYW5jZSBpcyBwYXNzZWQgb2ZmIHRvIHRoZQorInN0YWJsZSB0ZWFtLCIgY3VycmVudGx5IGNvbnNpc3Rpbmcgb2YgR3JlZyBLcm9haC1IYXJ0bWFuLiAgVGhlIHN0YWJsZSB0ZWFtCit3aWxsIHJlbGVhc2Ugb2NjYXNpb25hbCB1cGRhdGVzIHRvIHRoZSBzdGFibGUgcmVsZWFzZSB1c2luZyB0aGUgMi42LngueQorbnVtYmVyaW5nIHNjaGVtZS4gIFRvIGJlIGNvbnNpZGVyZWQgZm9yIGFuIHVwZGF0ZSByZWxlYXNlLCBhIHBhdGNoIG11c3QgKDEpCitmaXggYSBzaWduaWZpY2FudCBidWcsIGFuZCAoMikgYWxyZWFkeSBiZSBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUgZm9yIHRoZQorbmV4dCBkZXZlbG9wbWVudCBrZXJuZWwuICBLZXJuZWxzIHdpbGwgdHlwaWNhbGx5IHJlY2VpdmUgc3RhYmxlIHVwZGF0ZXMgZm9yCithIGxpdHRsZSBtb3JlIHRoYW4gb25lIGRldmVsb3BtZW50IGN5Y2xlIHBhc3QgdGhlaXIgaW5pdGlhbCByZWxlYXNlLiAgU28sCitmb3IgZXhhbXBsZSwgdGhlIDIuNi4zNiBrZXJuZWwncyBoaXN0b3J5IGxvb2tlZCBsaWtlOgorCisJPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlPY3RvYmVyIDEwCTIuNi4zNiBzdGFibGUgcmVsZWFzZQorCU5vdmVtYmVyIDIyCTIuNi4zNi4xCisJRGVjZW1iZXIgOQkyLjYuMzYuMgorCUphbnVhcnkgNwkyLjYuMzYuMworCUZlYnJ1YXJ5IDE3CTIuNi4zNi40CisJPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworMi42LjM2LjQgd2FzIHRoZSBmaW5hbCBzdGFibGUgdXBkYXRlIGZvciB0aGUgMi42LjM2IHJlbGVhc2UuCisKK1NvbWUga2VybmVscyBhcmUgZGVzaWduYXRlZCAibG9uZyB0ZXJtIiBrZXJuZWxzOyB0aGV5IHdpbGwgcmVjZWl2ZSBzdXBwb3J0Citmb3IgYSBsb25nZXIgcGVyaW9kLiAgQXMgb2YgdGhpcyB3cml0aW5nLCB0aGUgY3VycmVudCBsb25nIHRlcm0ga2VybmVscworYW5kIHRoZWlyIG1haW50YWluZXJzIGFyZToKKworCT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09CisJMi42LjI3CVdpbGx5IFRhcnJlYXUJCShEZWVwLWZyb3plbiBzdGFibGUga2VybmVsKQorCTIuNi4zMglHcmVnIEtyb2FoLUhhcnRtYW4KKwkyLjYuMzUJQW5kaSBLbGVlbgkJKEVtYmVkZGVkIGZsYWcga2VybmVsKQorCT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBzZWxlY3Rpb24gb2YgYSBrZXJuZWwgZm9yIGxvbmctdGVybSBzdXBwb3J0IGlzIHB1cmVseSBhIG1hdHRlciBvZiBhCittYWludGFpbmVyIGhhdmluZyB0aGUgbmVlZCBhbmQgdGhlIHRpbWUgdG8gbWFpbnRhaW4gdGhhdCByZWxlYXNlLiAgVGhlcmUKK2FyZSBubyBrbm93biBwbGFucyBmb3IgbG9uZy10ZXJtIHN1cHBvcnQgZm9yIGFueSBzcGVjaWZpYyB1cGNvbWluZworcmVsZWFzZS4KKworCitUaGUgbGlmZWN5Y2xlIG9mIGEgcGF0Y2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQYXRjaGVzIGRvIG5vdCBnbyBkaXJlY3RseSBmcm9tIHRoZSBkZXZlbG9wZXIncyBrZXlib2FyZCBpbnRvIHRoZSBtYWlubGluZQora2VybmVsLiAgVGhlcmUgaXMsIGluc3RlYWQsIGEgc29tZXdoYXQgaW52b2x2ZWQgKGlmIHNvbWV3aGF0IGluZm9ybWFsKQorcHJvY2VzcyBkZXNpZ25lZCB0byBlbnN1cmUgdGhhdCBlYWNoIHBhdGNoIGlzIHJldmlld2VkIGZvciBxdWFsaXR5IGFuZCB0aGF0CitlYWNoIHBhdGNoIGltcGxlbWVudHMgYSBjaGFuZ2Ugd2hpY2ggaXMgZGVzaXJhYmxlIHRvIGhhdmUgaW4gdGhlIG1haW5saW5lLgorVGhpcyBwcm9jZXNzIGNhbiBoYXBwZW4gcXVpY2tseSBmb3IgbWlub3IgZml4ZXMsIG9yLCBpbiB0aGUgY2FzZSBvZiBsYXJnZQorYW5kIGNvbnRyb3ZlcnNpYWwgY2hhbmdlcywgZ28gb24gZm9yIHllYXJzLiAgTXVjaCBkZXZlbG9wZXIgZnJ1c3RyYXRpb24KK2NvbWVzIGZyb20gYSBsYWNrIG9mIHVuZGVyc3RhbmRpbmcgb2YgdGhpcyBwcm9jZXNzIG9yIGZyb20gYXR0ZW1wdHMgdG8KK2NpcmN1bXZlbnQgaXQuCisKK0luIHRoZSBob3BlcyBvZiByZWR1Y2luZyB0aGF0IGZydXN0cmF0aW9uLCB0aGlzIGRvY3VtZW50IHdpbGwgZGVzY3JpYmUgaG93CithIHBhdGNoIGdldHMgaW50byB0aGUga2VybmVsLiAgV2hhdCBmb2xsb3dzIGJlbG93IGlzIGFuIGludHJvZHVjdGlvbiB3aGljaAorZGVzY3JpYmVzIHRoZSBwcm9jZXNzIGluIGEgc29tZXdoYXQgaWRlYWxpemVkIHdheS4gIEEgbXVjaCBtb3JlIGRldGFpbGVkCit0cmVhdG1lbnQgd2lsbCBjb21lIGluIGxhdGVyIHNlY3Rpb25zLgorCitUaGUgc3RhZ2VzIHRoYXQgYSBwYXRjaCBnb2VzIHRocm91Z2ggYXJlLCBnZW5lcmFsbHk6CisKKyAtIERlc2lnbi4gIFRoaXMgaXMgd2hlcmUgdGhlIHJlYWwgcmVxdWlyZW1lbnRzIGZvciB0aGUgcGF0Y2ggLSBhbmQgdGhlIHdheQorICAgdGhvc2UgcmVxdWlyZW1lbnRzIHdpbGwgYmUgbWV0IC0gYXJlIGxhaWQgb3V0LiAgRGVzaWduIHdvcmsgaXMgb2Z0ZW4KKyAgIGRvbmUgd2l0aG91dCBpbnZvbHZpbmcgdGhlIGNvbW11bml0eSwgYnV0IGl0IGlzIGJldHRlciB0byBkbyB0aGlzIHdvcmsKKyAgIGluIHRoZSBvcGVuIGlmIGF0IGFsbCBwb3NzaWJsZTsgaXQgY2FuIHNhdmUgYSBsb3Qgb2YgdGltZSByZWRlc2lnbmluZworICAgdGhpbmdzIGxhdGVyLgorCisgLSBFYXJseSByZXZpZXcuICBQYXRjaGVzIGFyZSBwb3N0ZWQgdG8gdGhlIHJlbGV2YW50IG1haWxpbmcgbGlzdCwgYW5kCisgICBkZXZlbG9wZXJzIG9uIHRoYXQgbGlzdCByZXBseSB3aXRoIGFueSBjb21tZW50cyB0aGV5IG1heSBoYXZlLiAgVGhpcworICAgcHJvY2VzcyBzaG91bGQgdHVybiB1cCBhbnkgbWFqb3IgcHJvYmxlbXMgd2l0aCBhIHBhdGNoIGlmIGFsbCBnb2VzCisgICB3ZWxsLgorCisgLSBXaWRlciByZXZpZXcuICBXaGVuIHRoZSBwYXRjaCBpcyBnZXR0aW5nIGNsb3NlIHRvIHJlYWR5IGZvciBtYWlubGluZQorICAgaW5jbHVzaW9uLCBpdCBzaG91bGQgYmUgYWNjZXB0ZWQgYnkgYSByZWxldmFudCBzdWJzeXN0ZW0gbWFpbnRhaW5lciAtCisgICB0aG91Z2ggdGhpcyBhY2NlcHRhbmNlIGlzIG5vdCBhIGd1YXJhbnRlZSB0aGF0IHRoZSBwYXRjaCB3aWxsIG1ha2UgaXQKKyAgIGFsbCB0aGUgd2F5IHRvIHRoZSBtYWlubGluZS4gIFRoZSBwYXRjaCB3aWxsIHNob3cgdXAgaW4gdGhlIG1haW50YWluZXIncworICAgc3Vic3lzdGVtIHRyZWUgYW5kIGludG8gdGhlIC1uZXh0IHRyZWVzIChkZXNjcmliZWQgYmVsb3cpLiAgV2hlbiB0aGUKKyAgIHByb2Nlc3Mgd29ya3MsIHRoaXMgc3RlcCBsZWFkcyB0byBtb3JlIGV4dGVuc2l2ZSByZXZpZXcgb2YgdGhlIHBhdGNoIGFuZAorICAgdGhlIGRpc2NvdmVyeSBvZiBhbnkgcHJvYmxlbXMgcmVzdWx0aW5nIGZyb20gdGhlIGludGVncmF0aW9uIG9mIHRoaXMKKyAgIHBhdGNoIHdpdGggd29yayBiZWluZyBkb25lIGJ5IG90aGVycy4KKworLSAgUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1haW50YWluZXJzIGFsc28gaGF2ZSBkYXkgam9icywgc28gbWVyZ2luZworICAgeW91ciBwYXRjaCBtYXkgbm90IGJlIHRoZWlyIGhpZ2hlc3QgcHJpb3JpdHkuICBJZiB5b3VyIHBhdGNoIGlzCisgICBnZXR0aW5nIGZlZWRiYWNrIGFib3V0IGNoYW5nZXMgdGhhdCBhcmUgbmVlZGVkLCB5b3Ugc2hvdWxkIGVpdGhlcgorICAgbWFrZSB0aG9zZSBjaGFuZ2VzIG9yIGp1c3RpZnkgd2h5IHRoZXkgc2hvdWxkIG5vdCBiZSBtYWRlLiAgSWYgeW91cgorICAgcGF0Y2ggaGFzIG5vIHJldmlldyBjb21wbGFpbnRzIGJ1dCBpcyBub3QgYmVpbmcgbWVyZ2VkIGJ5IGl0cworICAgYXBwcm9wcmlhdGUgc3Vic3lzdGVtIG9yIGRyaXZlciBtYWludGFpbmVyLCB5b3Ugc2hvdWxkIGJlIHBlcnNpc3RlbnQKKyAgIGluIHVwZGF0aW5nIHRoZSBwYXRjaCB0byB0aGUgY3VycmVudCBrZXJuZWwgc28gdGhhdCBpdCBhcHBsaWVzIGNsZWFubHkKKyAgIGFuZCBrZWVwIHNlbmRpbmcgaXQgZm9yIHJldmlldyBhbmQgbWVyZ2luZy4KKworIC0gTWVyZ2luZyBpbnRvIHRoZSBtYWlubGluZS4gIEV2ZW50dWFsbHksIGEgc3VjY2Vzc2Z1bCBwYXRjaCB3aWxsIGJlCisgICBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUgcmVwb3NpdG9yeSBtYW5hZ2VkIGJ5IExpbnVzIFRvcnZhbGRzLiAgTW9yZQorICAgY29tbWVudHMgYW5kL29yIHByb2JsZW1zIG1heSBzdXJmYWNlIGF0IHRoaXMgdGltZTsgaXQgaXMgaW1wb3J0YW50IHRoYXQKKyAgIHRoZSBkZXZlbG9wZXIgYmUgcmVzcG9uc2l2ZSB0byB0aGVzZSBhbmQgZml4IGFueSBpc3N1ZXMgd2hpY2ggYXJpc2UuCisKKyAtIFN0YWJsZSByZWxlYXNlLiAgVGhlIG51bWJlciBvZiB1c2VycyBwb3RlbnRpYWxseSBhZmZlY3RlZCBieSB0aGUgcGF0Y2gKKyAgIGlzIG5vdyBsYXJnZSwgc28sIG9uY2UgYWdhaW4sIG5ldyBwcm9ibGVtcyBtYXkgYXJpc2UuCisKKyAtIExvbmctdGVybSBtYWludGVuYW5jZS4gIFdoaWxlIGl0IGlzIGNlcnRhaW5seSBwb3NzaWJsZSBmb3IgYSBkZXZlbG9wZXIKKyAgIHRvIGZvcmdldCBhYm91dCBjb2RlIGFmdGVyIG1lcmdpbmcgaXQsIHRoYXQgc29ydCBvZiBiZWhhdmlvciB0ZW5kcyB0bworICAgbGVhdmUgYSBwb29yIGltcHJlc3Npb24gaW4gdGhlIGRldmVsb3BtZW50IGNvbW11bml0eS4gIE1lcmdpbmcgY29kZQorICAgZWxpbWluYXRlcyBzb21lIG9mIHRoZSBtYWludGVuYW5jZSBidXJkZW4sIGluIHRoYXQgb3RoZXJzIHdpbGwgZml4CisgICBwcm9ibGVtcyBjYXVzZWQgYnkgQVBJIGNoYW5nZXMuICBCdXQgdGhlIG9yaWdpbmFsIGRldmVsb3BlciBzaG91bGQKKyAgIGNvbnRpbnVlIHRvIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBjb2RlIGlmIGl0IGlzIHRvIHJlbWFpbiB1c2VmdWwKKyAgIGluIHRoZSBsb25nZXIgdGVybS4KKworT25lIG9mIHRoZSBsYXJnZXN0IG1pc3Rha2VzIG1hZGUgYnkga2VybmVsIGRldmVsb3BlcnMgKG9yIHRoZWlyIGVtcGxveWVycykKK2lzIHRvIHRyeSB0byBjdXQgdGhlIHByb2Nlc3MgZG93biB0byBhIHNpbmdsZSAibWVyZ2luZyBpbnRvIHRoZSBtYWlubGluZSIKK3N0ZXAuICBUaGlzIGFwcHJvYWNoIGludmFyaWFibHkgbGVhZHMgdG8gZnJ1c3RyYXRpb24gZm9yIGV2ZXJ5Ym9keQoraW52b2x2ZWQuCisKK0hvdyBwYXRjaGVzIGdldCBpbnRvIHRoZSBLZXJuZWwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlcmUgaXMgZXhhY3RseSBvbmUgcGVyc29uIHdobyBjYW4gbWVyZ2UgcGF0Y2hlcyBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwKK3JlcG9zaXRvcnk6IExpbnVzIFRvcnZhbGRzLiAgQnV0LCBvZiB0aGUgb3ZlciA5LDUwMCBwYXRjaGVzIHdoaWNoIHdlbnQKK2ludG8gdGhlIDIuNi4zOCBrZXJuZWwsIG9ubHkgMTEyIChhcm91bmQgMS4zJSkgd2VyZSBkaXJlY3RseSBjaG9zZW4gYnkgTGludXMKK2hpbXNlbGYuICBUaGUga2VybmVsIHByb2plY3QgaGFzIGxvbmcgc2luY2UgZ3Jvd24gdG8gYSBzaXplIHdoZXJlIG5vIHNpbmdsZQorZGV2ZWxvcGVyIGNvdWxkIHBvc3NpYmx5IGluc3BlY3QgYW5kIHNlbGVjdCBldmVyeSBwYXRjaCB1bmFzc2lzdGVkLiAgVGhlCit3YXkgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIGhhdmUgYWRkcmVzc2VkIHRoaXMgZ3Jvd3RoIGlzIHRocm91Z2ggdGhlIHVzZSBvZgorYSBsaWV1dGVuYW50IHN5c3RlbSBidWlsdCBhcm91bmQgYSBjaGFpbiBvZiB0cnVzdC4KKworVGhlIGtlcm5lbCBjb2RlIGJhc2UgaXMgbG9naWNhbGx5IGJyb2tlbiBkb3duIGludG8gYSBzZXQgb2Ygc3Vic3lzdGVtczoKK25ldHdvcmtpbmcsIHNwZWNpZmljIGFyY2hpdGVjdHVyZSBzdXBwb3J0LCBtZW1vcnkgbWFuYWdlbWVudCwgdmlkZW8KK2RldmljZXMsIGV0Yy4gIE1vc3Qgc3Vic3lzdGVtcyBoYXZlIGEgZGVzaWduYXRlZCBtYWludGFpbmVyLCBhIGRldmVsb3Blcgord2hvIGhhcyBvdmVyYWxsIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgY29kZSB3aXRoaW4gdGhhdCBzdWJzeXN0ZW0uICBUaGVzZQorc3Vic3lzdGVtIG1haW50YWluZXJzIGFyZSB0aGUgZ2F0ZWtlZXBlcnMgKGluIGEgbG9vc2Ugd2F5KSBmb3IgdGhlIHBvcnRpb24KK29mIHRoZSBrZXJuZWwgdGhleSBtYW5hZ2U7IHRoZXkgYXJlIHRoZSBvbmVzIHdobyB3aWxsICh1c3VhbGx5KSBhY2NlcHQgYQorcGF0Y2ggZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwuCisKK1N1YnN5c3RlbSBtYWludGFpbmVycyBlYWNoIG1hbmFnZSB0aGVpciBvd24gdmVyc2lvbiBvZiB0aGUga2VybmVsIHNvdXJjZQordHJlZSwgdXN1YWxseSAoYnV0IGNlcnRhaW5seSBub3QgYWx3YXlzKSB1c2luZyB0aGUgZ2l0IHNvdXJjZSBtYW5hZ2VtZW50Cit0b29sLiAgVG9vbHMgbGlrZSBnaXQgKGFuZCByZWxhdGVkIHRvb2xzIGxpa2UgcXVpbHQgb3IgbWVyY3VyaWFsKSBhbGxvdworbWFpbnRhaW5lcnMgdG8gdHJhY2sgYSBsaXN0IG9mIHBhdGNoZXMsIGluY2x1ZGluZyBhdXRob3JzaGlwIGluZm9ybWF0aW9uCithbmQgb3RoZXIgbWV0YWRhdGEuICBBdCBhbnkgZ2l2ZW4gdGltZSwgdGhlIG1haW50YWluZXIgY2FuIGlkZW50aWZ5IHdoaWNoCitwYXRjaGVzIGluIGhpcyBvciBoZXIgcmVwb3NpdG9yeSBhcmUgbm90IGZvdW5kIGluIHRoZSBtYWlubGluZS4KKworV2hlbiB0aGUgbWVyZ2Ugd2luZG93IG9wZW5zLCB0b3AtbGV2ZWwgbWFpbnRhaW5lcnMgd2lsbCBhc2sgTGludXMgdG8gInB1bGwiCit0aGUgcGF0Y2hlcyB0aGV5IGhhdmUgc2VsZWN0ZWQgZm9yIG1lcmdpbmcgZnJvbSB0aGVpciByZXBvc2l0b3JpZXMuICBJZgorTGludXMgYWdyZWVzLCB0aGUgc3RyZWFtIG9mIHBhdGNoZXMgd2lsbCBmbG93IHVwIGludG8gaGlzIHJlcG9zaXRvcnksCitiZWNvbWluZyBwYXJ0IG9mIHRoZSBtYWlubGluZSBrZXJuZWwuICBUaGUgYW1vdW50IG9mIGF0dGVudGlvbiB0aGF0IExpbnVzCitwYXlzIHRvIHNwZWNpZmljIHBhdGNoZXMgcmVjZWl2ZWQgaW4gYSBwdWxsIG9wZXJhdGlvbiB2YXJpZXMuICBJdCBpcyBjbGVhcgordGhhdCwgc29tZXRpbWVzLCBoZSBsb29rcyBxdWl0ZSBjbG9zZWx5LiAgQnV0LCBhcyBhIGdlbmVyYWwgcnVsZSwgTGludXMKK3RydXN0cyB0aGUgc3Vic3lzdGVtIG1haW50YWluZXJzIHRvIG5vdCBzZW5kIGJhZCBwYXRjaGVzIHVwc3RyZWFtLgorCitTdWJzeXN0ZW0gbWFpbnRhaW5lcnMsIGluIHR1cm4sIGNhbiBwdWxsIHBhdGNoZXMgZnJvbSBvdGhlciBtYWludGFpbmVycy4KK0ZvciBleGFtcGxlLCB0aGUgbmV0d29ya2luZyB0cmVlIGlzIGJ1aWx0IGZyb20gcGF0Y2hlcyB3aGljaCBhY2N1bXVsYXRlZAorZmlyc3QgaW4gdHJlZXMgZGVkaWNhdGVkIHRvIG5ldHdvcmsgZGV2aWNlIGRyaXZlcnMsIHdpcmVsZXNzIG5ldHdvcmtpbmcsCitldGMuICBUaGlzIGNoYWluIG9mIHJlcG9zaXRvcmllcyBjYW4gYmUgYXJiaXRyYXJpbHkgbG9uZywgdGhvdWdoIGl0IHJhcmVseQorZXhjZWVkcyB0d28gb3IgdGhyZWUgbGlua3MuICBTaW5jZSBlYWNoIG1haW50YWluZXIgaW4gdGhlIGNoYWluIHRydXN0cwordGhvc2UgbWFuYWdpbmcgbG93ZXItbGV2ZWwgdHJlZXMsIHRoaXMgcHJvY2VzcyBpcyBrbm93biBhcyB0aGUgImNoYWluIG9mCit0cnVzdC4iCisKK0NsZWFybHksIGluIGEgc3lzdGVtIGxpa2UgdGhpcywgZ2V0dGluZyBwYXRjaGVzIGludG8gdGhlIGtlcm5lbCBkZXBlbmRzIG9uCitmaW5kaW5nIHRoZSByaWdodCBtYWludGFpbmVyLiAgU2VuZGluZyBwYXRjaGVzIGRpcmVjdGx5IHRvIExpbnVzIGlzIG5vdAorbm9ybWFsbHkgdGhlIHJpZ2h0IHdheSB0byBnby4KKworCitOZXh0IHRyZWVzCistLS0tLS0tLS0tCisKK1RoZSBjaGFpbiBvZiBzdWJzeXN0ZW0gdHJlZXMgZ3VpZGVzIHRoZSBmbG93IG9mIHBhdGNoZXMgaW50byB0aGUga2VybmVsLAorYnV0IGl0IGFsc28gcmFpc2VzIGFuIGludGVyZXN0aW5nIHF1ZXN0aW9uOiB3aGF0IGlmIHNvbWVib2R5IHdhbnRzIHRvIGxvb2sKK2F0IGFsbCBvZiB0aGUgcGF0Y2hlcyB3aGljaCBhcmUgYmVpbmcgcHJlcGFyZWQgZm9yIHRoZSBuZXh0IG1lcmdlIHdpbmRvdz8KK0RldmVsb3BlcnMgd2lsbCBiZSBpbnRlcmVzdGVkIGluIHdoYXQgb3RoZXIgY2hhbmdlcyBhcmUgcGVuZGluZyB0byBzZWUKK3doZXRoZXIgdGhlcmUgYXJlIGFueSBjb25mbGljdHMgdG8gd29ycnkgYWJvdXQ7IGEgcGF0Y2ggd2hpY2ggY2hhbmdlcyBhCitjb3JlIGtlcm5lbCBmdW5jdGlvbiBwcm90b3R5cGUsIGZvciBleGFtcGxlLCB3aWxsIGNvbmZsaWN0IHdpdGggYW55IG90aGVyCitwYXRjaGVzIHdoaWNoIHVzZSB0aGUgb2xkZXIgZm9ybSBvZiB0aGF0IGZ1bmN0aW9uLiAgUmV2aWV3ZXJzIGFuZCB0ZXN0ZXJzCit3YW50IGFjY2VzcyB0byB0aGUgY2hhbmdlcyBpbiB0aGVpciBpbnRlZ3JhdGVkIGZvcm0gYmVmb3JlIGFsbCBvZiB0aG9zZQorY2hhbmdlcyBsYW5kIGluIHRoZSBtYWlubGluZSBrZXJuZWwuICBPbmUgY291bGQgcHVsbCBjaGFuZ2VzIGZyb20gYWxsIG9mCit0aGUgaW50ZXJlc3Rpbmcgc3Vic3lzdGVtIHRyZWVzLCBidXQgdGhhdCB3b3VsZCBiZSBhIGJpZyBhbmQgZXJyb3ItcHJvbmUKK2pvYi4KKworVGhlIGFuc3dlciBjb21lcyBpbiB0aGUgZm9ybSBvZiAtbmV4dCB0cmVlcywgd2hlcmUgc3Vic3lzdGVtIHRyZWVzIGFyZQorY29sbGVjdGVkIGZvciB0ZXN0aW5nIGFuZCByZXZpZXcuICBUaGUgb2xkZXIgb2YgdGhlc2UgdHJlZXMsIG1haW50YWluZWQgYnkKK0FuZHJldyBNb3J0b24sIGlzIGNhbGxlZCAiLW1tIiAoZm9yIG1lbW9yeSBtYW5hZ2VtZW50LCB3aGljaCBpcyBob3cgaXQgZ290CitzdGFydGVkKS4gIFRoZSAtbW0gdHJlZSBpbnRlZ3JhdGVzIHBhdGNoZXMgZnJvbSBhIGxvbmcgbGlzdCBvZiBzdWJzeXN0ZW0KK3RyZWVzOyBpdCBhbHNvIGhhcyBzb21lIHBhdGNoZXMgYWltZWQgYXQgaGVscGluZyB3aXRoIGRlYnVnZ2luZy4KKworQmV5b25kIHRoYXQsIC1tbSBjb250YWlucyBhIHNpZ25pZmljYW50IGNvbGxlY3Rpb24gb2YgcGF0Y2hlcyB3aGljaCBoYXZlCitiZWVuIHNlbGVjdGVkIGJ5IEFuZHJldyBkaXJlY3RseS4gIFRoZXNlIHBhdGNoZXMgbWF5IGhhdmUgYmVlbiBwb3N0ZWQgb24gYQorbWFpbGluZyBsaXN0LCBvciB0aGV5IG1heSBhcHBseSB0byBhIHBhcnQgb2YgdGhlIGtlcm5lbCBmb3Igd2hpY2ggdGhlcmUgaXMKK25vIGRlc2lnbmF0ZWQgc3Vic3lzdGVtIHRyZWUuICBBcyBhIHJlc3VsdCwgLW1tIG9wZXJhdGVzIGFzIGEgc29ydCBvZgorc3Vic3lzdGVtIHRyZWUgb2YgbGFzdCByZXNvcnQ7IGlmIHRoZXJlIGlzIG5vIG90aGVyIG9idmlvdXMgcGF0aCBmb3IgYQorcGF0Y2ggaW50byB0aGUgbWFpbmxpbmUsIGl0IGlzIGxpa2VseSB0byBlbmQgdXAgaW4gLW1tLiAgTWlzY2VsbGFuZW91cworcGF0Y2hlcyB3aGljaCBhY2N1bXVsYXRlIGluIC1tbSB3aWxsIGV2ZW50dWFsbHkgZWl0aGVyIGJlIGZvcndhcmRlZCBvbiB0bworYW4gYXBwcm9wcmlhdGUgc3Vic3lzdGVtIHRyZWUgb3IgYmUgc2VudCBkaXJlY3RseSB0byBMaW51cy4gIEluIGEgdHlwaWNhbAorZGV2ZWxvcG1lbnQgY3ljbGUsIGFwcHJveGltYXRlbHkgNS0xMCUgb2YgdGhlIHBhdGNoZXMgZ29pbmcgaW50byB0aGUKK21haW5saW5lIGdldCB0aGVyZSB2aWEgLW1tLgorCitUaGUgY3VycmVudCAtbW0gcGF0Y2ggaXMgYXZhaWxhYmxlIGluIHRoZSAibW1vdG0iICgtbW0gb2YgdGhlIG1vbWVudCkKK2RpcmVjdG9yeSBhdDoKKworCWh0dHA6Ly93d3cub3psYWJzLm9yZy9+YWtwbS9tbW90bS8KKworVXNlIG9mIHRoZSBNTU9UTSB0cmVlIGlzIGxpa2VseSB0byBiZSBhIGZydXN0cmF0aW5nIGV4cGVyaWVuY2UsIHRob3VnaDsKK3RoZXJlIGlzIGEgZGVmaW5pdGUgY2hhbmNlIHRoYXQgaXQgd2lsbCBub3QgZXZlbiBjb21waWxlLgorCitUaGUgcHJpbWFyeSB0cmVlIGZvciBuZXh0LWN5Y2xlIHBhdGNoIG1lcmdpbmcgaXMgbGludXgtbmV4dCwgbWFpbnRhaW5lZCBieQorU3RlcGhlbiBSb3Rod2VsbC4gIFRoZSBsaW51eC1uZXh0IHRyZWUgaXMsIGJ5IGRlc2lnbiwgYSBzbmFwc2hvdCBvZiB3aGF0Cit0aGUgbWFpbmxpbmUgaXMgZXhwZWN0ZWQgdG8gbG9vayBsaWtlIGFmdGVyIHRoZSBuZXh0IG1lcmdlIHdpbmRvdyBjbG9zZXMuCitMaW51eC1uZXh0IHRyZWVzIGFyZSBhbm5vdW5jZWQgb24gdGhlIGxpbnV4LWtlcm5lbCBhbmQgbGludXgtbmV4dCBtYWlsaW5nCitsaXN0cyB3aGVuIHRoZXkgYXJlIGFzc2VtYmxlZDsgdGhleSBjYW4gYmUgZG93bmxvYWRlZCBmcm9tOgorCisJaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvbmV4dC8KKworTGludXgtbmV4dCBoYXMgYmVjb21lIGFuIGludGVncmFsIHBhcnQgb2YgdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzOworYWxsIHBhdGNoZXMgbWVyZ2VkIGR1cmluZyBhIGdpdmVuIG1lcmdlIHdpbmRvdyBzaG91bGQgcmVhbGx5IGhhdmUgZm91bmQKK3RoZWlyIHdheSBpbnRvIGxpbnV4LW5leHQgc29tZSB0aW1lIGJlZm9yZSB0aGUgbWVyZ2Ugd2luZG93IG9wZW5zLgorCisKK1N0YWdpbmcgdHJlZXMKKy0tLS0tLS0tLS0tLS0KKworVGhlIGtlcm5lbCBzb3VyY2UgdHJlZSBjb250YWlucyB0aGUgZHJpdmVycy9zdGFnaW5nLyBkaXJlY3RvcnksIHdoZXJlCittYW55IHN1Yi1kaXJlY3RvcmllcyBmb3IgZHJpdmVycyBvciBmaWxlc3lzdGVtcyB0aGF0IGFyZSBvbiB0aGVpciB3YXkgdG8KK2JlaW5nIGFkZGVkIHRvIHRoZSBrZXJuZWwgdHJlZSBsaXZlLiAgVGhleSByZW1haW4gaW4gZHJpdmVycy9zdGFnaW5nIHdoaWxlCit0aGV5IHN0aWxsIG5lZWQgbW9yZSB3b3JrOyBvbmNlIGNvbXBsZXRlLCB0aGV5IGNhbiBiZSBtb3ZlZCBpbnRvIHRoZQora2VybmVsIHByb3Blci4gIFRoaXMgaXMgYSB3YXkgdG8ga2VlcCB0cmFjayBvZiBkcml2ZXJzIHRoYXQgYXJlbid0Cit1cCB0byBMaW51eCBrZXJuZWwgY29kaW5nIG9yIHF1YWxpdHkgc3RhbmRhcmRzLCBidXQgcGVvcGxlIG1heSB3YW50IHRvIHVzZQordGhlbSBhbmQgdHJhY2sgZGV2ZWxvcG1lbnQuCisKK0dyZWcgS3JvYWgtSGFydG1hbiBjdXJyZW50bHkgbWFpbnRhaW5zIHRoZSBzdGFnaW5nIHRyZWUuICBEcml2ZXJzIHRoYXQKK3N0aWxsIG5lZWQgd29yayBhcmUgc2VudCB0byBoaW0sIHdpdGggZWFjaCBkcml2ZXIgaGF2aW5nIGl0cyBvd24KK3N1YmRpcmVjdG9yeSBpbiBkcml2ZXJzL3N0YWdpbmcvLiAgQWxvbmcgd2l0aCB0aGUgZHJpdmVyIHNvdXJjZSBmaWxlcywgYQorVE9ETyBmaWxlIHNob3VsZCBiZSBwcmVzZW50IGluIHRoZSBkaXJlY3RvcnkgYXMgd2VsbC4gIFRoZSBUT0RPIGZpbGUgbGlzdHMKK3RoZSBwZW5kaW5nIHdvcmsgdGhhdCB0aGUgZHJpdmVyIG5lZWRzIGZvciBhY2NlcHRhbmNlIGludG8gdGhlIGtlcm5lbAorcHJvcGVyLCBhcyB3ZWxsIGFzIGEgbGlzdCBvZiBwZW9wbGUgdGhhdCBzaG91bGQgYmUgQ2MnZCBmb3IgYW55IHBhdGNoZXMgdG8KK3RoZSBkcml2ZXIuICBDdXJyZW50IHJ1bGVzIHJlcXVpcmUgdGhhdCBkcml2ZXJzIGNvbnRyaWJ1dGVkIHRvIHN0YWdpbmcKK211c3QsIGF0IGEgbWluaW11bSwgY29tcGlsZSBwcm9wZXJseS4KKworU3RhZ2luZyBjYW4gYmUgYSByZWxhdGl2ZWx5IGVhc3kgd2F5IHRvIGdldCBuZXcgZHJpdmVycyBpbnRvIHRoZSBtYWlubGluZQord2hlcmUsIHdpdGggbHVjaywgdGhleSB3aWxsIGNvbWUgdG8gdGhlIGF0dGVudGlvbiBvZiBvdGhlciBkZXZlbG9wZXJzIGFuZAoraW1wcm92ZSBxdWlja2x5LiAgRW50cnkgaW50byBzdGFnaW5nIGlzIG5vdCB0aGUgZW5kIG9mIHRoZSBzdG9yeSwgdGhvdWdoOworY29kZSBpbiBzdGFnaW5nIHdoaWNoIGlzIG5vdCBzZWVpbmcgcmVndWxhciBwcm9ncmVzcyB3aWxsIGV2ZW50dWFsbHkgYmUKK3JlbW92ZWQuICBEaXN0cmlidXRvcnMgYWxzbyB0ZW5kIHRvIGJlIHJlbGF0aXZlbHkgcmVsdWN0YW50IHRvIGVuYWJsZQorc3RhZ2luZyBkcml2ZXJzLiAgU28gc3RhZ2luZyBpcywgYXQgYmVzdCwgYSBzdG9wIG9uIHRoZSB3YXkgdG93YXJkIGJlY29taW5nCithIHByb3BlciBtYWlubGluZSBkcml2ZXIuCisKKworVG9vbHMKKy0tLS0tCisKK0FzIGNhbiBiZSBzZWVuIGZyb20gdGhlIGFib3ZlIHRleHQsIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkZXBlbmRzCitoZWF2aWx5IG9uIHRoZSBhYmlsaXR5IHRvIGhlcmQgY29sbGVjdGlvbnMgb2YgcGF0Y2hlcyBpbiB2YXJpb3VzCitkaXJlY3Rpb25zLiAgVGhlIHdob2xlIHRoaW5nIHdvdWxkIG5vdCB3b3JrIGFueXdoZXJlIG5lYXIgYXMgd2VsbCBhcyBpdAorZG9lcyB3aXRob3V0IHN1aXRhYmx5IHBvd2VyZnVsIHRvb2xzLiAgVHV0b3JpYWxzIG9uIGhvdyB0byB1c2UgdGhlc2UgdG9vbHMKK2FyZSB3ZWxsIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBkb2N1bWVudCwgYnV0IHRoZXJlIGlzIHNwYWNlIGZvciBhIGZldworcG9pbnRlcnMuCisKK0J5IGZhciB0aGUgZG9taW5hbnQgc291cmNlIGNvZGUgbWFuYWdlbWVudCBzeXN0ZW0gdXNlZCBieSB0aGUga2VybmVsCitjb21tdW5pdHkgaXMgZ2l0LiAgR2l0IGlzIG9uZSBvZiBhIG51bWJlciBvZiBkaXN0cmlidXRlZCB2ZXJzaW9uIGNvbnRyb2wKK3N5c3RlbXMgYmVpbmcgZGV2ZWxvcGVkIGluIHRoZSBmcmVlIHNvZnR3YXJlIGNvbW11bml0eS4gIEl0IGlzIHdlbGwgdHVuZWQKK2ZvciBrZXJuZWwgZGV2ZWxvcG1lbnQsIGluIHRoYXQgaXQgcGVyZm9ybXMgcXVpdGUgd2VsbCB3aGVuIGRlYWxpbmcgd2l0aAorbGFyZ2UgcmVwb3NpdG9yaWVzIGFuZCBsYXJnZSBudW1iZXJzIG9mIHBhdGNoZXMuICBJdCBhbHNvIGhhcyBhIHJlcHV0YXRpb24KK2ZvciBiZWluZyBkaWZmaWN1bHQgdG8gbGVhcm4gYW5kIHVzZSwgdGhvdWdoIGl0IGhhcyBnb3R0ZW4gYmV0dGVyIG92ZXIKK3RpbWUuICBTb21lIHNvcnQgb2YgZmFtaWxpYXJpdHkgd2l0aCBnaXQgaXMgYWxtb3N0IGEgcmVxdWlyZW1lbnQgZm9yIGtlcm5lbAorZGV2ZWxvcGVyczsgZXZlbiBpZiB0aGV5IGRvIG5vdCB1c2UgaXQgZm9yIHRoZWlyIG93biB3b3JrLCB0aGV5J2xsIG5lZWQgZ2l0Cit0byBrZWVwIHVwIHdpdGggd2hhdCBvdGhlciBkZXZlbG9wZXJzIChhbmQgdGhlIG1haW5saW5lKSBhcmUgZG9pbmcuCisKK0dpdCBpcyBub3cgcGFja2FnZWQgYnkgYWxtb3N0IGFsbCBMaW51eCBkaXN0cmlidXRpb25zLiAgVGhlcmUgaXMgYSBob21lCitwYWdlIGF0OgorCisJaHR0cDovL2dpdC1zY20uY29tLworCitUaGF0IHBhZ2UgaGFzIHBvaW50ZXJzIHRvIGRvY3VtZW50YXRpb24gYW5kIHR1dG9yaWFscy4KKworQW1vbmcgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIHdobyBkbyBub3QgdXNlIGdpdCwgdGhlIG1vc3QgcG9wdWxhciBjaG9pY2UgaXMKK2FsbW9zdCBjZXJ0YWlubHkgTWVyY3VyaWFsOgorCisJaHR0cDovL3d3dy5zZWxlbmljLmNvbS9tZXJjdXJpYWwvCisKK01lcmN1cmlhbCBzaGFyZXMgbWFueSBmZWF0dXJlcyB3aXRoIGdpdCwgYnV0IGl0IHByb3ZpZGVzIGFuIGludGVyZmFjZSB3aGljaAorbWFueSBmaW5kIGVhc2llciB0byB1c2UuCisKK1RoZSBvdGhlciB0b29sIHdvcnRoIGtub3dpbmcgYWJvdXQgaXMgUXVpbHQ6CisKKwlodHRwOi8vc2F2YW5uYWgubm9uZ251Lm9yZy9wcm9qZWN0cy9xdWlsdC8KKworUXVpbHQgaXMgYSBwYXRjaCBtYW5hZ2VtZW50IHN5c3RlbSwgcmF0aGVyIHRoYW4gYSBzb3VyY2UgY29kZSBtYW5hZ2VtZW50CitzeXN0ZW0uICBJdCBkb2VzIG5vdCB0cmFjayBoaXN0b3J5IG92ZXIgdGltZTsgaXQgaXMsIGluc3RlYWQsIG9yaWVudGVkCit0b3dhcmQgdHJhY2tpbmcgYSBzcGVjaWZpYyBzZXQgb2YgY2hhbmdlcyBhZ2FpbnN0IGFuIGV2b2x2aW5nIGNvZGUgYmFzZS4KK1NvbWUgbWFqb3Igc3Vic3lzdGVtIG1haW50YWluZXJzIHVzZSBxdWlsdCB0byBtYW5hZ2UgcGF0Y2hlcyBpbnRlbmRlZCB0byBnbwordXBzdHJlYW0uICBGb3IgdGhlIG1hbmFnZW1lbnQgb2YgY2VydGFpbiBraW5kcyBvZiB0cmVlcyAoLW1tLCBmb3IgZXhhbXBsZSksCitxdWlsdCBpcyB0aGUgYmVzdCB0b29sIGZvciB0aGUgam9iLgorCisKK01haWxpbmcgbGlzdHMKKy0tLS0tLS0tLS0tLS0KKworQSBncmVhdCBkZWFsIG9mIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCB3b3JrIGlzIGRvbmUgYnkgd2F5IG9mIG1haWxpbmcKK2xpc3RzLiAgSXQgaXMgaGFyZCB0byBiZSBhIGZ1bGx5LWZ1bmN0aW9uaW5nIG1lbWJlciBvZiB0aGUgY29tbXVuaXR5Cit3aXRob3V0IGpvaW5pbmcgYXQgbGVhc3Qgb25lIGxpc3Qgc29tZXdoZXJlLiAgQnV0IExpbnV4IG1haWxpbmcgbGlzdHMgYWxzbworcmVwcmVzZW50IGEgcG90ZW50aWFsIGhhemFyZCB0byBkZXZlbG9wZXJzLCB3aG8gcmlzayBnZXR0aW5nIGJ1cmllZCB1bmRlciBhCitsb2FkIG9mIGVsZWN0cm9uaWMgbWFpbCwgcnVubmluZyBhZm91bCBvZiB0aGUgY29udmVudGlvbnMgdXNlZCBvbiB0aGUgTGludXgKK2xpc3RzLCBvciBib3RoLgorCitNb3N0IGtlcm5lbCBtYWlsaW5nIGxpc3RzIGFyZSBydW4gb24gdmdlci5rZXJuZWwub3JnOyB0aGUgbWFzdGVyIGxpc3QgY2FuCitiZSBmb3VuZCBhdDoKKworCWh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvdmdlci1saXN0cy5odG1sCisKK1RoZXJlIGFyZSBsaXN0cyBob3N0ZWQgZWxzZXdoZXJlLCB0aG91Z2g7IGEgbnVtYmVyIG9mIHRoZW0gYXJlIGF0CitsaXN0cy5yZWRoYXQuY29tLgorCitUaGUgY29yZSBtYWlsaW5nIGxpc3QgZm9yIGtlcm5lbCBkZXZlbG9wbWVudCBpcywgb2YgY291cnNlLCBsaW51eC1rZXJuZWwuCitUaGlzIGxpc3QgaXMgYW4gaW50aW1pZGF0aW5nIHBsYWNlIHRvIGJlOyB2b2x1bWUgY2FuIHJlYWNoIDUwMCBtZXNzYWdlcyBwZXIKK2RheSwgdGhlIGFtb3VudCBvZiBub2lzZSBpcyBoaWdoLCB0aGUgY29udmVyc2F0aW9uIGNhbiBiZSBzZXZlcmVseQordGVjaG5pY2FsLCBhbmQgcGFydGljaXBhbnRzIGFyZSBub3QgYWx3YXlzIGNvbmNlcm5lZCB3aXRoIHNob3dpbmcgYSBoaWdoCitkZWdyZWUgb2YgcG9saXRlbmVzcy4gIEJ1dCB0aGVyZSBpcyBubyBvdGhlciBwbGFjZSB3aGVyZSB0aGUga2VybmVsCitkZXZlbG9wbWVudCBjb21tdW5pdHkgY29tZXMgdG9nZXRoZXIgYXMgYSB3aG9sZTsgZGV2ZWxvcGVycyB3aG8gYXZvaWQgdGhpcworbGlzdCB3aWxsIG1pc3MgaW1wb3J0YW50IGluZm9ybWF0aW9uLgorCitUaGVyZSBhcmUgYSBmZXcgaGludHMgd2hpY2ggY2FuIGhlbHAgd2l0aCBsaW51eC1rZXJuZWwgc3Vydml2YWw6CisKKy0gSGF2ZSB0aGUgbGlzdCBkZWxpdmVyZWQgdG8gYSBzZXBhcmF0ZSBmb2xkZXIsIHJhdGhlciB0aGFuIHlvdXIgbWFpbgorICBtYWlsYm94LiAgT25lIG11c3QgYmUgYWJsZSB0byBpZ25vcmUgdGhlIHN0cmVhbSBmb3Igc3VzdGFpbmVkIHBlcmlvZHMgb2YKKyAgdGltZS4KKworLSBEbyBub3QgdHJ5IHRvIGZvbGxvdyBldmVyeSBjb252ZXJzYXRpb24gLSBub2JvZHkgZWxzZSBkb2VzLiAgSXQgaXMKKyAgaW1wb3J0YW50IHRvIGZpbHRlciBvbiBib3RoIHRoZSB0b3BpYyBvZiBpbnRlcmVzdCAodGhvdWdoIG5vdGUgdGhhdAorICBsb25nLXJ1bm5pbmcgY29udmVyc2F0aW9ucyBjYW4gZHJpZnQgYXdheSBmcm9tIHRoZSBvcmlnaW5hbCBzdWJqZWN0CisgIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGVtYWlsIHN1YmplY3QgbGluZSkgYW5kIHRoZSBwZW9wbGUgd2hvIGFyZQorICBwYXJ0aWNpcGF0aW5nLgorCistIERvIG5vdCBmZWVkIHRoZSB0cm9sbHMuICBJZiBzb21lYm9keSBpcyB0cnlpbmcgdG8gc3RpciB1cCBhbiBhbmdyeQorICByZXNwb25zZSwgaWdub3JlIHRoZW0uCisKKy0gV2hlbiByZXNwb25kaW5nIHRvIGxpbnV4LWtlcm5lbCBlbWFpbCAob3IgdGhhdCBvbiBvdGhlciBsaXN0cykgcHJlc2VydmUKKyAgdGhlIENjOiBoZWFkZXIgZm9yIGFsbCBpbnZvbHZlZC4gIEluIHRoZSBhYnNlbmNlIG9mIGEgc3Ryb25nIHJlYXNvbiAoc3VjaAorICBhcyBhbiBleHBsaWNpdCByZXF1ZXN0KSwgeW91IHNob3VsZCBuZXZlciByZW1vdmUgcmVjaXBpZW50cy4gIEFsd2F5cyBtYWtlCisgIHN1cmUgdGhhdCB0aGUgcGVyc29uIHlvdSBhcmUgcmVzcG9uZGluZyB0byBpcyBpbiB0aGUgQ2M6IGxpc3QuICBUaGlzCisgIGNvbnZlbnRpb24gYWxzbyBtYWtlcyBpdCB1bm5lY2Vzc2FyeSB0byBleHBsaWNpdGx5IGFzayB0byBiZSBjb3BpZWQgb24KKyAgcmVwbGllcyB0byB5b3VyIHBvc3RpbmdzLgorCistIFNlYXJjaCB0aGUgbGlzdCBhcmNoaXZlcyAoYW5kIHRoZSBuZXQgYXMgYSB3aG9sZSkgYmVmb3JlIGFza2luZworICBxdWVzdGlvbnMuICBTb21lIGRldmVsb3BlcnMgY2FuIGdldCBpbXBhdGllbnQgd2l0aCBwZW9wbGUgd2hvIGNsZWFybHkKKyAgaGF2ZSBub3QgZG9uZSB0aGVpciBob21ld29yay4KKworLSBBdm9pZCB0b3AtcG9zdGluZyAodGhlIHByYWN0aWNlIG9mIHB1dHRpbmcgeW91ciBhbnN3ZXIgYWJvdmUgdGhlIHF1b3RlZAorICB0ZXh0IHlvdSBhcmUgcmVzcG9uZGluZyB0bykuICBJdCBtYWtlcyB5b3VyIHJlc3BvbnNlIGhhcmRlciB0byByZWFkIGFuZAorICBtYWtlcyBhIHBvb3IgaW1wcmVzc2lvbi4KKworLSBBc2sgb24gdGhlIGNvcnJlY3QgbWFpbGluZyBsaXN0LiAgTGludXgta2VybmVsIG1heSBiZSB0aGUgZ2VuZXJhbCBtZWV0aW5nCisgIHBvaW50LCBidXQgaXQgaXMgbm90IHRoZSBiZXN0IHBsYWNlIHRvIGZpbmQgZGV2ZWxvcGVycyBmcm9tIGFsbAorICBzdWJzeXN0ZW1zLgorCitUaGUgbGFzdCBwb2ludCAtIGZpbmRpbmcgdGhlIGNvcnJlY3QgbWFpbGluZyBsaXN0IC0gaXMgYSBjb21tb24gcGxhY2UgZm9yCitiZWdpbm5pbmcgZGV2ZWxvcGVycyB0byBnbyB3cm9uZy4gIFNvbWVib2R5IHdobyBhc2tzIGEgbmV0d29ya2luZy1yZWxhdGVkCitxdWVzdGlvbiBvbiBsaW51eC1rZXJuZWwgd2lsbCBhbG1vc3QgY2VydGFpbmx5IHJlY2VpdmUgYSBwb2xpdGUgc3VnZ2VzdGlvbgordG8gYXNrIG9uIHRoZSBuZXRkZXYgbGlzdCBpbnN0ZWFkLCBhcyB0aGF0IGlzIHRoZSBsaXN0IGZyZXF1ZW50ZWQgYnkgbW9zdAorbmV0d29ya2luZyBkZXZlbG9wZXJzLiAgT3RoZXIgbGlzdHMgZXhpc3QgZm9yIHRoZSBTQ1NJLCB2aWRlbzRsaW51eCwgSURFLAorZmlsZXN5c3RlbSwgZXRjLiBzdWJzeXN0ZW1zLiAgVGhlIGJlc3QgcGxhY2UgdG8gbG9vayBmb3IgbWFpbGluZyBsaXN0cyBpcworaW4gdGhlIE1BSU5UQUlORVJTIGZpbGUgcGFja2FnZWQgd2l0aCB0aGUga2VybmVsIHNvdXJjZS4KKworCitHZXR0aW5nIHN0YXJ0ZWQgd2l0aCBLZXJuZWwgZGV2ZWxvcG1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitRdWVzdGlvbnMgYWJvdXQgaG93IHRvIGdldCBzdGFydGVkIHdpdGggdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzIGFyZQorY29tbW9uIC0gZnJvbSBib3RoIGluZGl2aWR1YWxzIGFuZCBjb21wYW5pZXMuICBFcXVhbGx5IGNvbW1vbiBhcmUgbWlzc3RlcHMKK3doaWNoIG1ha2UgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVsYXRpb25zaGlwIGhhcmRlciB0aGFuIGl0IGhhcyB0byBiZS4KKworQ29tcGFuaWVzIG9mdGVuIGxvb2sgdG8gaGlyZSB3ZWxsLWtub3duIGRldmVsb3BlcnMgdG8gZ2V0IGEgZGV2ZWxvcG1lbnQKK2dyb3VwIHN0YXJ0ZWQuICBUaGlzIGNhbiwgaW4gZmFjdCwgYmUgYW4gZWZmZWN0aXZlIHRlY2huaXF1ZS4gIEJ1dCBpdCBhbHNvCit0ZW5kcyB0byBiZSBleHBlbnNpdmUgYW5kIGRvZXMgbm90IGRvIG11Y2ggdG8gZ3JvdyB0aGUgcG9vbCBvZiBleHBlcmllbmNlZAora2VybmVsIGRldmVsb3BlcnMuICBJdCBpcyBwb3NzaWJsZSB0byBicmluZyBpbi1ob3VzZSBkZXZlbG9wZXJzIHVwIHRvIHNwZWVkCitvbiBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQsIGdpdmVuIHRoZSBpbnZlc3RtZW50IG9mIGEgYml0IG9mIHRpbWUuICBUYWtpbmcKK3RoaXMgdGltZSBjYW4gZW5kb3cgYW4gZW1wbG95ZXIgd2l0aCBhIGdyb3VwIG9mIGRldmVsb3BlcnMgd2hvIHVuZGVyc3RhbmQKK3RoZSBrZXJuZWwgYW5kIHRoZSBjb21wYW55IGJvdGgsIGFuZCB3aG8gY2FuIGhlbHAgdG8gdHJhaW4gb3RoZXJzIGFzIHdlbGwuCitPdmVyIHRoZSBtZWRpdW0gdGVybSwgdGhpcyBpcyBvZnRlbiB0aGUgbW9yZSBwcm9maXRhYmxlIGFwcHJvYWNoLgorCitJbmRpdmlkdWFsIGRldmVsb3BlcnMgYXJlIG9mdGVuLCB1bmRlcnN0YW5kYWJseSwgYXQgYSBsb3NzIGZvciBhIHBsYWNlIHRvCitzdGFydC4gIEJlZ2lubmluZyB3aXRoIGEgbGFyZ2UgcHJvamVjdCBjYW4gYmUgaW50aW1pZGF0aW5nOyBvbmUgb2Z0ZW4gd2FudHMKK3RvIHRlc3QgdGhlIHdhdGVycyB3aXRoIHNvbWV0aGluZyBzbWFsbGVyIGZpcnN0LiAgVGhpcyBpcyB0aGUgcG9pbnQgd2hlcmUKK3NvbWUgZGV2ZWxvcGVycyBqdW1wIGludG8gdGhlIGNyZWF0aW9uIG9mIHBhdGNoZXMgZml4aW5nIHNwZWxsaW5nIGVycm9ycyBvcgorbWlub3IgY29kaW5nIHN0eWxlIGlzc3Vlcy4gIFVuZm9ydHVuYXRlbHksIHN1Y2ggcGF0Y2hlcyBjcmVhdGUgYSBsZXZlbCBvZgorbm9pc2Ugd2hpY2ggaXMgZGlzdHJhY3RpbmcgZm9yIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgYXMgYSB3aG9sZSwgc28sCitpbmNyZWFzaW5nbHksIHRoZXkgYXJlIGxvb2tlZCBkb3duIHVwb24uICBOZXcgZGV2ZWxvcGVycyB3aXNoaW5nIHRvCitpbnRyb2R1Y2UgdGhlbXNlbHZlcyB0byB0aGUgY29tbXVuaXR5IHdpbGwgbm90IGdldCB0aGUgc29ydCBvZiByZWNlcHRpb24KK3RoZXkgd2lzaCBmb3IgYnkgdGhlc2UgbWVhbnMuCisKK0FuZHJldyBNb3J0b24gZ2l2ZXMgdGhpcyBhZHZpY2UgZm9yIGFzcGlyaW5nIGtlcm5lbCBkZXZlbG9wZXJzCisKKzo6CisKKwlUaGUgIzEgcHJvamVjdCBmb3IgYWxsIGtlcm5lbCBiZWdpbm5lcnMgc2hvdWxkIHN1cmVseSBiZSAibWFrZSBzdXJlCisJdGhhdCB0aGUga2VybmVsIHJ1bnMgcGVyZmVjdGx5IGF0IGFsbCB0aW1lcyBvbiBhbGwgbWFjaGluZXMgd2hpY2gKKwl5b3UgY2FuIGxheSB5b3VyIGhhbmRzIG9uIi4gIFVzdWFsbHkgdGhlIHdheSB0byBkbyB0aGlzIGlzIHRvIHdvcmsKKwl3aXRoIG90aGVycyBvbiBnZXR0aW5nIHRoaW5ncyBmaXhlZCB1cCAodGhpcyBjYW4gcmVxdWlyZQorCXBlcnNpc3RlbmNlISkgYnV0IHRoYXQncyBmaW5lIC0gaXQncyBhIHBhcnQgb2Yga2VybmVsIGRldmVsb3BtZW50LgorCisoaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvMjgzOTgyLykuCisKK0luIHRoZSBhYnNlbmNlIG9mIG9idmlvdXMgcHJvYmxlbXMgdG8gZml4LCBkZXZlbG9wZXJzIGFyZSBhZHZpc2VkIHRvIGxvb2sKK2F0IHRoZSBjdXJyZW50IGxpc3RzIG9mIHJlZ3Jlc3Npb25zIGFuZCBvcGVuIGJ1Z3MgaW4gZ2VuZXJhbC4gIFRoZXJlIGlzCituZXZlciBhbnkgc2hvcnRhZ2Ugb2YgaXNzdWVzIGluIG5lZWQgb2YgZml4aW5nOyBieSBhZGRyZXNzaW5nIHRoZXNlIGlzc3VlcywKK2RldmVsb3BlcnMgd2lsbCBnYWluIGV4cGVyaWVuY2Ugd2l0aCB0aGUgcHJvY2VzcyB3aGlsZSwgYXQgdGhlIHNhbWUgdGltZSwKK2J1aWxkaW5nIHJlc3BlY3Qgd2l0aCB0aGUgcmVzdCBvZiB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzMuRWFybHktc3RhZ2UgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMy5FYXJseS1zdGFnZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3YmE3Yi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMy5FYXJseS1zdGFnZQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0zOiBFQVJMWS1TVEFHRSBQTEFOTklORwotCi1XaGVuIGNvbnRlbXBsYXRpbmcgYSBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvamVjdCwgaXQgY2FuIGJlIHRlbXB0aW5nCi10byBqdW1wIHJpZ2h0IGluIGFuZCBzdGFydCBjb2RpbmcuICBBcyB3aXRoIGFueSBzaWduaWZpY2FudCBwcm9qZWN0LAotdGhvdWdoLCBtdWNoIG9mIHRoZSBncm91bmR3b3JrIGZvciBzdWNjZXNzIGlzIGJlc3QgbGFpZCBiZWZvcmUgdGhlIGZpcnN0Ci1saW5lIG9mIGNvZGUgaXMgd3JpdHRlbi4gIFNvbWUgdGltZSBzcGVudCBpbiBlYXJseSBwbGFubmluZyBhbmQKLWNvbW11bmljYXRpb24gY2FuIHNhdmUgZmFyIG1vcmUgdGltZSBsYXRlciBvbi4KLQotCi0zLjE6IFNQRUNJRllJTkcgVEhFIFBST0JMRU0KLQotTGlrZSBhbnkgZW5naW5lZXJpbmcgcHJvamVjdCwgYSBzdWNjZXNzZnVsIGtlcm5lbCBlbmhhbmNlbWVudCBzdGFydHMgd2l0aCBhCi1jbGVhciBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0byBiZSBzb2x2ZWQuICBJbiBzb21lIGNhc2VzLCB0aGlzIHN0ZXAgaXMKLWVhc3k6IHdoZW4gYSBkcml2ZXIgaXMgbmVlZGVkIGZvciBhIHNwZWNpZmljIHBpZWNlIG9mIGhhcmR3YXJlLCBmb3IKLWV4YW1wbGUuICBJbiBvdGhlcnMsIHRob3VnaCwgaXQgaXMgdGVtcHRpbmcgdG8gY29uZnVzZSB0aGUgcmVhbCBwcm9ibGVtCi13aXRoIHRoZSBwcm9wb3NlZCBzb2x1dGlvbiwgYW5kIHRoYXQgY2FuIGxlYWQgdG8gZGlmZmljdWx0aWVzLgotCi1Db25zaWRlciBhbiBleGFtcGxlOiBzb21lIHllYXJzIGFnbywgZGV2ZWxvcGVycyB3b3JraW5nIHdpdGggTGludXggYXVkaW8KLXNvdWdodCBhIHdheSB0byBydW4gYXBwbGljYXRpb25zIHdpdGhvdXQgZHJvcG91dHMgb3Igb3RoZXIgYXJ0aWZhY3RzIGNhdXNlZAotYnkgZXhjZXNzaXZlIGxhdGVuY3kgaW4gdGhlIHN5c3RlbS4gIFRoZSBzb2x1dGlvbiB0aGV5IGFycml2ZWQgYXQgd2FzIGEKLWtlcm5lbCBtb2R1bGUgaW50ZW5kZWQgdG8gaG9vayBpbnRvIHRoZSBMaW51eCBTZWN1cml0eSBNb2R1bGUgKExTTSkKLWZyYW1ld29yazsgdGhpcyBtb2R1bGUgY291bGQgYmUgY29uZmlndXJlZCB0byBnaXZlIHNwZWNpZmljIGFwcGxpY2F0aW9ucwotYWNjZXNzIHRvIHRoZSByZWFsdGltZSBzY2hlZHVsZXIuICBUaGlzIG1vZHVsZSB3YXMgaW1wbGVtZW50ZWQgYW5kIHNlbnQgdG8KLXRoZSBsaW51eC1rZXJuZWwgbWFpbGluZyBsaXN0LCB3aGVyZSBpdCBpbW1lZGlhdGVseSByYW4gaW50byBwcm9ibGVtcy4KLQotVG8gdGhlIGF1ZGlvIGRldmVsb3BlcnMsIHRoaXMgc2VjdXJpdHkgbW9kdWxlIHdhcyBzdWZmaWNpZW50IHRvIHNvbHZlIHRoZWlyCi1pbW1lZGlhdGUgcHJvYmxlbS4gIFRvIHRoZSB3aWRlciBrZXJuZWwgY29tbXVuaXR5LCB0aG91Z2gsIGl0IHdhcyBzZWVuIGFzIGEKLW1pc3VzZSBvZiB0aGUgTFNNIGZyYW1ld29yayAod2hpY2ggaXMgbm90IGludGVuZGVkIHRvIGNvbmZlciBwcml2aWxlZ2VzCi1vbnRvIHByb2Nlc3NlcyB3aGljaCB0aGV5IHdvdWxkIG5vdCBvdGhlcndpc2UgaGF2ZSkgYW5kIGEgcmlzayB0byBzeXN0ZW0KLXN0YWJpbGl0eS4gIFRoZWlyIHByZWZlcnJlZCBzb2x1dGlvbnMgaW52b2x2ZWQgcmVhbHRpbWUgc2NoZWR1bGluZyBhY2Nlc3MKLXZpYSB0aGUgcmxpbWl0IG1lY2hhbmlzbSBmb3IgdGhlIHNob3J0IHRlcm0sIGFuZCBvbmdvaW5nIGxhdGVuY3kgcmVkdWN0aW9uCi13b3JrIGluIHRoZSBsb25nIHRlcm0uCi0KLVRoZSBhdWRpbyBjb21tdW5pdHksIGhvd2V2ZXIsIGNvdWxkIG5vdCBzZWUgcGFzdCB0aGUgcGFydGljdWxhciBzb2x1dGlvbgotdGhleSBoYWQgaW1wbGVtZW50ZWQ7IHRoZXkgd2VyZSB1bndpbGxpbmcgdG8gYWNjZXB0IGFsdGVybmF0aXZlcy4gIFRoZQotcmVzdWx0aW5nIGRpc2FncmVlbWVudCBsZWZ0IHRob3NlIGRldmVsb3BlcnMgZmVlbGluZyBkaXNpbGx1c2lvbmVkIHdpdGggdGhlCi1lbnRpcmUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3M7IG9uZSBvZiB0aGVtIHdlbnQgYmFjayB0byBhbiBhdWRpbyBsaXN0Ci1hbmQgcG9zdGVkIHRoaXM6Ci0KLQlUaGVyZSBhcmUgYSBudW1iZXIgb2YgdmVyeSBnb29kIExpbnV4IGtlcm5lbCBkZXZlbG9wZXJzLCBidXQgdGhleQotCXRlbmQgdG8gZ2V0IG91dHNob3V0ZWQgYnkgYSBsYXJnZSBjcm93ZCBvZiBhcnJvZ2FudCBmb29scy4gVHJ5aW5nCi0JdG8gY29tbXVuaWNhdGUgdXNlciByZXF1aXJlbWVudHMgdG8gdGhlc2UgcGVvcGxlIGlzIGEgd2FzdGUgb2YKLQl0aW1lLiBUaGV5IGFyZSBtdWNoIHRvbyAiaW50ZWxsaWdlbnQiIHRvIGxpc3RlbiB0byBsZXNzZXIgbW9ydGFscy4KLQotKGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzEzMTc3Ni8pLgotCi1UaGUgcmVhbGl0eSBvZiB0aGUgc2l0dWF0aW9uIHdhcyBkaWZmZXJlbnQ7IHRoZSBrZXJuZWwgZGV2ZWxvcGVycyB3ZXJlIGZhcgotbW9yZSBjb25jZXJuZWQgYWJvdXQgc3lzdGVtIHN0YWJpbGl0eSwgbG9uZy10ZXJtIG1haW50ZW5hbmNlLCBhbmQgZmluZGluZwotdGhlIHJpZ2h0IHNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtIHRoYW4gdGhleSB3ZXJlIHdpdGggYSBzcGVjaWZpYyBtb2R1bGUuCi1UaGUgbW9yYWwgb2YgdGhlIHN0b3J5IGlzIHRvIGZvY3VzIG9uIHRoZSBwcm9ibGVtIC0gbm90IGEgc3BlY2lmaWMgc29sdXRpb24KLS0gYW5kIHRvIGRpc2N1c3MgaXQgd2l0aCB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGJlZm9yZSBpbnZlc3RpbmcgaW4gdGhlCi1jcmVhdGlvbiBvZiBhIGJvZHkgb2YgY29kZS4KLQotU28sIHdoZW4gY29udGVtcGxhdGluZyBhIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9qZWN0LCBvbmUgc2hvdWxkIG9idGFpbgotYW5zd2VycyB0byBhIHNob3J0IHNldCBvZiBxdWVzdGlvbnM6Ci0KLSAtIFdoYXQsIGV4YWN0bHksIGlzIHRoZSBwcm9ibGVtIHdoaWNoIG5lZWRzIHRvIGJlIHNvbHZlZD8KLQotIC0gV2hvIGFyZSB0aGUgdXNlcnMgYWZmZWN0ZWQgYnkgdGhpcyBwcm9ibGVtPyAgV2hpY2ggdXNlIGNhc2VzIHNob3VsZCB0aGUKLSAgIHNvbHV0aW9uIGFkZHJlc3M/Ci0KLSAtIEhvdyBkb2VzIHRoZSBrZXJuZWwgZmFsbCBzaG9ydCBpbiBhZGRyZXNzaW5nIHRoYXQgcHJvYmxlbSBub3c/Ci0KLU9ubHkgdGhlbiBkb2VzIGl0IG1ha2Ugc2Vuc2UgdG8gc3RhcnQgY29uc2lkZXJpbmcgcG9zc2libGUgc29sdXRpb25zLgotCi0KLTMuMjogRUFSTFkgRElTQ1VTU0lPTgotCi1XaGVuIHBsYW5uaW5nIGEga2VybmVsIGRldmVsb3BtZW50IHByb2plY3QsIGl0IG1ha2VzIGdyZWF0IHNlbnNlIHRvIGhvbGQKLWRpc2N1c3Npb25zIHdpdGggdGhlIGNvbW11bml0eSBiZWZvcmUgbGF1bmNoaW5nIGludG8gaW1wbGVtZW50YXRpb24uICBFYXJseQotY29tbXVuaWNhdGlvbiBjYW4gc2F2ZSB0aW1lIGFuZCB0cm91YmxlIGluIGEgbnVtYmVyIG9mIHdheXM6Ci0KLSAtIEl0IG1heSB3ZWxsIGJlIHRoYXQgdGhlIHByb2JsZW0gaXMgYWRkcmVzc2VkIGJ5IHRoZSBrZXJuZWwgaW4gd2F5cyB3aGljaAotICAgeW91IGhhdmUgbm90IHVuZGVyc3Rvb2QuICBUaGUgTGludXgga2VybmVsIGlzIGxhcmdlIGFuZCBoYXMgYSBudW1iZXIgb2YKLSAgIGZlYXR1cmVzIGFuZCBjYXBhYmlsaXRpZXMgd2hpY2ggYXJlIG5vdCBpbW1lZGlhdGVseSBvYnZpb3VzLiAgTm90IGFsbAotICAga2VybmVsIGNhcGFiaWxpdGllcyBhcmUgZG9jdW1lbnRlZCBhcyB3ZWxsIGFzIG9uZSBtaWdodCBsaWtlLCBhbmQgaXQgaXMKLSAgIGVhc3kgdG8gbWlzcyB0aGluZ3MuICBZb3VyIGF1dGhvciBoYXMgc2VlbiB0aGUgcG9zdGluZyBvZiBhIGNvbXBsZXRlCi0gICBkcml2ZXIgd2hpY2ggZHVwbGljYXRlZCBhbiBleGlzdGluZyBkcml2ZXIgdGhhdCB0aGUgbmV3IGF1dGhvciBoYWQgYmVlbgotICAgdW5hd2FyZSBvZi4gIENvZGUgd2hpY2ggcmVpbnZlbnRzIGV4aXN0aW5nIHdoZWVscyBpcyBub3Qgb25seSB3YXN0ZWZ1bDsKLSAgIGl0IHdpbGwgYWxzbyBub3QgYmUgYWNjZXB0ZWQgaW50byB0aGUgbWFpbmxpbmUga2VybmVsLgotCi0gLSBUaGVyZSBtYXkgYmUgZWxlbWVudHMgb2YgdGhlIHByb3Bvc2VkIHNvbHV0aW9uIHdoaWNoIHdpbGwgbm90IGJlCi0gICBhY2NlcHRhYmxlIGZvciBtYWlubGluZSBtZXJnaW5nLiAgSXQgaXMgYmV0dGVyIHRvIGZpbmQgb3V0IGFib3V0Ci0gICBwcm9ibGVtcyBsaWtlIHRoaXMgYmVmb3JlIHdyaXRpbmcgdGhlIGNvZGUuCi0KLSAtIEl0J3MgZW50aXJlbHkgcG9zc2libGUgdGhhdCBvdGhlciBkZXZlbG9wZXJzIGhhdmUgdGhvdWdodCBhYm91dCB0aGUKLSAgIHByb2JsZW07IHRoZXkgbWF5IGhhdmUgaWRlYXMgZm9yIGEgYmV0dGVyIHNvbHV0aW9uLCBhbmQgbWF5IGJlIHdpbGxpbmcKLSAgIHRvIGhlbHAgaW4gdGhlIGNyZWF0aW9uIG9mIHRoYXQgc29sdXRpb24uCi0KLVllYXJzIG9mIGV4cGVyaWVuY2Ugd2l0aCB0aGUga2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eSBoYXZlIHRhdWdodCBhCi1jbGVhciBsZXNzb246IGtlcm5lbCBjb2RlIHdoaWNoIGlzIGRlc2lnbmVkIGFuZCBkZXZlbG9wZWQgYmVoaW5kIGNsb3NlZAotZG9vcnMgaW52YXJpYWJseSBoYXMgcHJvYmxlbXMgd2hpY2ggYXJlIG9ubHkgcmV2ZWFsZWQgd2hlbiB0aGUgY29kZSBpcwotcmVsZWFzZWQgaW50byB0aGUgY29tbXVuaXR5LiAgU29tZXRpbWVzIHRoZXNlIHByb2JsZW1zIGFyZSBzZXZlcmUsCi1yZXF1aXJpbmcgbW9udGhzIG9yIHllYXJzIG9mIGVmZm9ydCBiZWZvcmUgdGhlIGNvZGUgY2FuIGJlIGJyb3VnaHQgdXAgdG8KLXRoZSBrZXJuZWwgY29tbXVuaXR5J3Mgc3RhbmRhcmRzLiAgU29tZSBleGFtcGxlcyBpbmNsdWRlOgotCi0gLSBUaGUgRGV2aWNlc2NhcGUgbmV0d29yayBzdGFjayB3YXMgZGVzaWduZWQgYW5kIGltcGxlbWVudGVkIGZvcgotICAgc2luZ2xlLXByb2Nlc3NvciBzeXN0ZW1zLiAgSXQgY291bGQgbm90IGJlIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZQotICAgdW50aWwgaXQgd2FzIG1hZGUgc3VpdGFibGUgZm9yIG11bHRpcHJvY2Vzc29yIHN5c3RlbXMuICBSZXRyb2ZpdHRpbmcKLSAgIGxvY2tpbmcgYW5kIHN1Y2ggaW50byBjb2RlIGlzIGEgZGlmZmljdWx0IHRhc2s7IGFzIGEgcmVzdWx0LCB0aGUgbWVyZ2luZwotICAgb2YgdGhpcyBjb2RlIChub3cgY2FsbGVkIG1hYzgwMjExKSB3YXMgZGVsYXllZCBmb3Igb3ZlciBhIHllYXIuCi0KLSAtIFRoZSBSZWlzZXI0IGZpbGVzeXN0ZW0gaW5jbHVkZWQgYSBudW1iZXIgb2YgY2FwYWJpbGl0aWVzIHdoaWNoLCBpbiB0aGUKLSAgIGNvcmUga2VybmVsIGRldmVsb3BlcnMnIG9waW5pb24sIHNob3VsZCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgaW4gdGhlCi0gICB2aXJ0dWFsIGZpbGVzeXN0ZW0gbGF5ZXIgaW5zdGVhZC4gIEl0IGFsc28gaW5jbHVkZWQgZmVhdHVyZXMgd2hpY2ggY291bGQKLSAgIG5vdCBlYXNpbHkgYmUgaW1wbGVtZW50ZWQgd2l0aG91dCBleHBvc2luZyB0aGUgc3lzdGVtIHRvIHVzZXItY2F1c2VkCi0gICBkZWFkbG9ja3MuICBUaGUgbGF0ZSByZXZlbGF0aW9uIG9mIHRoZXNlIHByb2JsZW1zIC0gYW5kIHJlZnVzYWwgdG8KLSAgIGFkZHJlc3Mgc29tZSBvZiB0aGVtIC0gaGFzIGNhdXNlZCBSZWlzZXI0IHRvIHN0YXkgb3V0IG9mIHRoZSBtYWlubGluZQotICAga2VybmVsLgotCi0gLSBUaGUgQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlIG1hZGUgdXNlIG9mIGludGVybmFsIHZpcnR1YWwgZmlsZXN5c3RlbQotICAgZGF0YSBzdHJ1Y3R1cmVzIGluIHdheXMgd2hpY2ggd2VyZSBjb25zaWRlcmVkIHRvIGJlIHVuc2FmZSBhbmQKLSAgIHVucmVsaWFibGUuICBUaGlzIGNvbmNlcm4gKGFtb25nIG90aGVycykga2VwdCBBcHBBcm1vciBvdXQgb2YgdGhlCi0gICBtYWlubGluZSBmb3IgeWVhcnMuCi0KLUluIGVhY2ggb2YgdGhlc2UgY2FzZXMsIGEgZ3JlYXQgZGVhbCBvZiBwYWluIGFuZCBleHRyYSB3b3JrIGNvdWxkIGhhdmUgYmVlbgotYXZvaWRlZCB3aXRoIHNvbWUgZWFybHkgZGlzY3Vzc2lvbiB3aXRoIHRoZSBrZXJuZWwgZGV2ZWxvcGVycy4KLQotCi0zLjM6IFdITyBETyBZT1UgVEFMSyBUTz8KLQotV2hlbiBkZXZlbG9wZXJzIGRlY2lkZSB0byB0YWtlIHRoZWlyIHBsYW5zIHB1YmxpYywgdGhlIG5leHQgcXVlc3Rpb24gd2lsbAotYmU6IHdoZXJlIGRvIHdlIHN0YXJ0PyAgVGhlIGFuc3dlciBpcyB0byBmaW5kIHRoZSByaWdodCBtYWlsaW5nIGxpc3QocykgYW5kCi10aGUgcmlnaHQgbWFpbnRhaW5lci4gIEZvciBtYWlsaW5nIGxpc3RzLCB0aGUgYmVzdCBhcHByb2FjaCBpcyB0byBsb29rIGluCi10aGUgTUFJTlRBSU5FUlMgZmlsZSBmb3IgYSByZWxldmFudCBwbGFjZSB0byBwb3N0LiAgSWYgdGhlcmUgaXMgYSBzdWl0YWJsZQotc3Vic3lzdGVtIGxpc3QsIHBvc3RpbmcgdGhlcmUgaXMgb2Z0ZW4gcHJlZmVyYWJsZSB0byBwb3N0aW5nIG9uCi1saW51eC1rZXJuZWw7IHlvdSBhcmUgbW9yZSBsaWtlbHkgdG8gcmVhY2ggZGV2ZWxvcGVycyB3aXRoIGV4cGVydGlzZSBpbiB0aGUKLXJlbGV2YW50IHN1YnN5c3RlbSBhbmQgdGhlIGVudmlyb25tZW50IG1heSBiZSBtb3JlIHN1cHBvcnRpdmUuCi0KLUZpbmRpbmcgbWFpbnRhaW5lcnMgY2FuIGJlIGEgYml0IGhhcmRlci4gIEFnYWluLCB0aGUgTUFJTlRBSU5FUlMgZmlsZSBpcwotdGhlIHBsYWNlIHRvIHN0YXJ0LiAgVGhhdCBmaWxlIHRlbmRzIHRvIG5vdCBhbHdheXMgYmUgdXAgdG8gZGF0ZSwgdGhvdWdoLAotYW5kIG5vdCBhbGwgc3Vic3lzdGVtcyBhcmUgcmVwcmVzZW50ZWQgdGhlcmUuICBUaGUgcGVyc29uIGxpc3RlZCBpbiB0aGUKLU1BSU5UQUlORVJTIGZpbGUgbWF5LCBpbiBmYWN0LCBub3QgYmUgdGhlIHBlcnNvbiB3aG8gaXMgYWN0dWFsbHkgYWN0aW5nIGluCi10aGF0IHJvbGUgY3VycmVudGx5LiAgU28sIHdoZW4gdGhlcmUgaXMgZG91YnQgYWJvdXQgd2hvIHRvIGNvbnRhY3QsIGEKLXVzZWZ1bCB0cmljayBpcyB0byB1c2UgZ2l0IChhbmQgImdpdCBsb2ciIGluIHBhcnRpY3VsYXIpIHRvIHNlZSB3aG8gaXMKLWN1cnJlbnRseSBhY3RpdmUgd2l0aGluIHRoZSBzdWJzeXN0ZW0gb2YgaW50ZXJlc3QuICBMb29rIGF0IHdobyBpcyB3cml0aW5nCi1wYXRjaGVzLCBhbmQgd2hvLCBpZiBhbnlib2R5LCBpcyBhdHRhY2hpbmcgU2lnbmVkLW9mZi1ieSBsaW5lcyB0byB0aG9zZQotcGF0Y2hlcy4gIFRob3NlIGFyZSB0aGUgcGVvcGxlIHdobyB3aWxsIGJlIGJlc3QgcGxhY2VkIHRvIGhlbHAgd2l0aCBhIG5ldwotZGV2ZWxvcG1lbnQgcHJvamVjdC4KLQotVGhlIHRhc2sgb2YgZmluZGluZyB0aGUgcmlnaHQgbWFpbnRhaW5lciBpcyBzb21ldGltZXMgY2hhbGxlbmdpbmcgZW5vdWdoCi10aGF0IHRoZSBrZXJuZWwgZGV2ZWxvcGVycyBoYXZlIGFkZGVkIGEgc2NyaXB0IHRvIGVhc2UgdGhlIHByb2Nlc3M6Ci0KLQkuLi4vc2NyaXB0cy9nZXRfbWFpbnRhaW5lci5wbAotCi1UaGlzIHNjcmlwdCB3aWxsIHJldHVybiB0aGUgY3VycmVudCBtYWludGFpbmVyKHMpIGZvciBhIGdpdmVuIGZpbGUgb3IKLWRpcmVjdG9yeSB3aGVuIGdpdmVuIHRoZSAiLWYiIG9wdGlvbi4gIElmIHBhc3NlZCBhIHBhdGNoIG9uIHRoZQotY29tbWFuZCBsaW5lLCBpdCB3aWxsIGxpc3QgdGhlIG1haW50YWluZXJzIHdobyBzaG91bGQgcHJvYmFibHkgcmVjZWl2ZQotY29waWVzIG9mIHRoZSBwYXRjaC4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiBvcHRpb25zIHJlZ3VsYXRpbmcgaG93IGhhcmQKLWdldF9tYWludGFpbmVyLnBsIHdpbGwgc2VhcmNoIGZvciBtYWludGFpbmVyczsgcGxlYXNlIGJlIGNhcmVmdWwgYWJvdXQKLXVzaW5nIHRoZSBtb3JlIGFnZ3Jlc3NpdmUgb3B0aW9ucyBhcyB5b3UgbWF5IGVuZCB1cCBpbmNsdWRpbmcgZGV2ZWxvcGVycwotd2hvIGhhdmUgbm8gcmVhbCBpbnRlcmVzdCBpbiB0aGUgY29kZSB5b3UgYXJlIG1vZGlmeWluZy4KLQotSWYgYWxsIGVsc2UgZmFpbHMsIHRhbGtpbmcgdG8gQW5kcmV3IE1vcnRvbiBjYW4gYmUgYW4gZWZmZWN0aXZlIHdheSB0bwotdHJhY2sgZG93biBhIG1haW50YWluZXIgZm9yIGEgc3BlY2lmaWMgcGllY2Ugb2YgY29kZS4KLQotCi0zLjQ6IFdIRU4gVE8gUE9TVD8KLQotSWYgcG9zc2libGUsIHBvc3RpbmcgeW91ciBwbGFucyBkdXJpbmcgdGhlIGVhcmx5IHN0YWdlcyBjYW4gb25seSBiZQotaGVscGZ1bC4gIERlc2NyaWJlIHRoZSBwcm9ibGVtIGJlaW5nIHNvbHZlZCBhbmQgYW55IHBsYW5zIHRoYXQgaGF2ZSBiZWVuCi1tYWRlIG9uIGhvdyB0aGUgaW1wbGVtZW50YXRpb24gd2lsbCBiZSBkb25lLiAgQW55IGluZm9ybWF0aW9uIHlvdSBjYW4KLXByb3ZpZGUgY2FuIGhlbHAgdGhlIGRldmVsb3BtZW50IGNvbW11bml0eSBwcm92aWRlIHVzZWZ1bCBpbnB1dCBvbiB0aGUKLXByb2plY3QuCi0KLU9uZSBkaXNjb3VyYWdpbmcgdGhpbmcgd2hpY2ggY2FuIGhhcHBlbiBhdCB0aGlzIHN0YWdlIGlzIG5vdCBhIGhvc3RpbGUKLXJlYWN0aW9uLCBidXQsIGluc3RlYWQsIGxpdHRsZSBvciBubyByZWFjdGlvbiBhdCBhbGwuICBUaGUgc2FkIHRydXRoIG9mIHRoZQotbWF0dGVyIGlzICgxKSBrZXJuZWwgZGV2ZWxvcGVycyB0ZW5kIHRvIGJlIGJ1c3ksICgyKSB0aGVyZSBpcyBubyBzaG9ydGFnZQotb2YgcGVvcGxlIHdpdGggZ3JhbmQgcGxhbnMgYW5kIGxpdHRsZSBjb2RlIChvciBldmVuIHByb3NwZWN0IG9mIGNvZGUpIHRvCi1iYWNrIHRoZW0gdXAsIGFuZCAoMykgbm9ib2R5IGlzIG9ibGlnYXRlZCB0byByZXZpZXcgb3IgY29tbWVudCBvbiBpZGVhcwotcG9zdGVkIGJ5IG90aGVycy4gIEJleW9uZCB0aGF0LCBoaWdoLWxldmVsIGRlc2lnbnMgb2Z0ZW4gaGlkZSBwcm9ibGVtcwotd2hpY2ggYXJlIG9ubHkgcmV2aWV3ZWQgd2hlbiBzb21lYm9keSBhY3R1YWxseSB0cmllcyB0byBpbXBsZW1lbnQgdGhvc2UKLWRlc2lnbnM7IGZvciB0aGF0IHJlYXNvbiwga2VybmVsIGRldmVsb3BlcnMgd291bGQgcmF0aGVyIHNlZSB0aGUgY29kZS4KLQotSWYgYSByZXF1ZXN0LWZvci1jb21tZW50cyBwb3N0aW5nIHlpZWxkcyBsaXR0bGUgaW4gdGhlIHdheSBvZiBjb21tZW50cywgZG8KLW5vdCBhc3N1bWUgdGhhdCBpdCBtZWFucyB0aGVyZSBpcyBubyBpbnRlcmVzdCBpbiB0aGUgcHJvamVjdC4KLVVuZm9ydHVuYXRlbHksIHlvdSBhbHNvIGNhbm5vdCBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgbm8gcHJvYmxlbXMgd2l0aCB5b3VyCi1pZGVhLiAgVGhlIGJlc3QgdGhpbmcgdG8gZG8gaW4gdGhpcyBzaXR1YXRpb24gaXMgdG8gcHJvY2VlZCwga2VlcGluZyB0aGUKLWNvbW11bml0eSBpbmZvcm1lZCBhcyB5b3UgZ28uCi0KLQotMy41OiBHRVRUSU5HIE9GRklDSUFMIEJVWS1JTgotCi1JZiB5b3VyIHdvcmsgaXMgYmVpbmcgZG9uZSBpbiBhIGNvcnBvcmF0ZSBlbnZpcm9ubWVudCAtIGFzIG1vc3QgTGludXgKLWtlcm5lbCB3b3JrIGlzIC0geW91IG11c3QsIG9idmlvdXNseSwgaGF2ZSBwZXJtaXNzaW9uIGZyb20gc3VpdGFibHkKLWVtcG93ZXJlZCBtYW5hZ2VycyBiZWZvcmUgeW91IGNhbiBwb3N0IHlvdXIgY29tcGFueSdzIHBsYW5zIG9yIGNvZGUgdG8gYQotcHVibGljIG1haWxpbmcgbGlzdC4gIFRoZSBwb3N0aW5nIG9mIGNvZGUgd2hpY2ggaGFzIG5vdCBiZWVuIGNsZWFyZWQgZm9yCi1yZWxlYXNlIHVuZGVyIGEgR1BMLWNvbXBhdGlibGUgbGljZW5zZSBjYW4gYmUgZXNwZWNpYWxseSBwcm9ibGVtYXRpYzsgdGhlCi1zb29uZXIgdGhhdCBhIGNvbXBhbnkncyBtYW5hZ2VtZW50IGFuZCBsZWdhbCBzdGFmZiBjYW4gYWdyZWUgb24gdGhlIHBvc3RpbmcKLW9mIGEga2VybmVsIGRldmVsb3BtZW50IHByb2plY3QsIHRoZSBiZXR0ZXIgb2ZmIGV2ZXJ5Ym9keSBpbnZvbHZlZCB3aWxsIGJlLgotCi1Tb21lIHJlYWRlcnMgbWF5IGJlIHRoaW5raW5nIGF0IHRoaXMgcG9pbnQgdGhhdCB0aGVpciBrZXJuZWwgd29yayBpcwotaW50ZW5kZWQgdG8gc3VwcG9ydCBhIHByb2R1Y3Qgd2hpY2ggZG9lcyBub3QgeWV0IGhhdmUgYW4gb2ZmaWNpYWxseQotYWNrbm93bGVkZ2VkIGV4aXN0ZW5jZS4gIFJldmVhbGluZyB0aGVpciBlbXBsb3llcidzIHBsYW5zIG9uIGEgcHVibGljCi1tYWlsaW5nIGxpc3QgbWF5IG5vdCBiZSBhIHZpYWJsZSBvcHRpb24uICBJbiBjYXNlcyBsaWtlIHRoaXMsIGl0IGlzIHdvcnRoCi1jb25zaWRlcmluZyB3aGV0aGVyIHRoZSBzZWNyZWN5IGlzIHJlYWxseSBuZWNlc3Nhcnk7IHRoZXJlIGlzIG9mdGVuIG5vIHJlYWwKLW5lZWQgdG8ga2VlcCBkZXZlbG9wbWVudCBwbGFucyBiZWhpbmQgY2xvc2VkIGRvb3JzLgotCi1UaGF0IHNhaWQsIHRoZXJlIGFyZSBhbHNvIGNhc2VzIHdoZXJlIGEgY29tcGFueSBsZWdpdGltYXRlbHkgY2Fubm90Ci1kaXNjbG9zZSBpdHMgcGxhbnMgZWFybHkgaW4gdGhlIGRldmVsb3BtZW50IHByb2Nlc3MuICBDb21wYW5pZXMgd2l0aAotZXhwZXJpZW5jZWQga2VybmVsIGRldmVsb3BlcnMgbWF5IGNob29zZSB0byBwcm9jZWVkIGluIGFuIG9wZW4tbG9vcCBtYW5uZXIKLW9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhleSB3aWxsIGJlIGFibGUgdG8gYXZvaWQgc2VyaW91cyBpbnRlZ3JhdGlvbgotcHJvYmxlbXMgbGF0ZXIuICBGb3IgY29tcGFuaWVzIHdpdGhvdXQgdGhhdCBzb3J0IG9mIGluLWhvdXNlIGV4cGVydGlzZSwgdGhlCi1iZXN0IG9wdGlvbiBpcyBvZnRlbiB0byBoaXJlIGFuIG91dHNpZGUgZGV2ZWxvcGVyIHRvIHJldmlldyB0aGUgcGxhbnMgdW5kZXIKLWEgbm9uLWRpc2Nsb3N1cmUgYWdyZWVtZW50LiAgVGhlIExpbnV4IEZvdW5kYXRpb24gb3BlcmF0ZXMgYW4gTkRBIHByb2dyYW0KLWRlc2lnbmVkIHRvIGhlbHAgd2l0aCB0aGlzIHNvcnQgb2Ygc2l0dWF0aW9uOyBtb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZAotYXQ6Ci0KLSAgICBodHRwOi8vd3d3LmxpbnV4Zm91bmRhdGlvbi5vcmcvZW4vTkRBX3Byb2dyYW0KLQotVGhpcyBraW5kIG9mIHJldmlldyBpcyBvZnRlbiBlbm91Z2ggdG8gYXZvaWQgc2VyaW91cyBwcm9ibGVtcyBsYXRlciBvbgotd2l0aG91dCByZXF1aXJpbmcgcHVibGljIGRpc2Nsb3N1cmUgb2YgdGhlIHByb2plY3QuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMy5FYXJseS1zdGFnZS5yc3QgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMy5FYXJseS1zdGFnZS5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyYzBhZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy8zLkVhcmx5LXN0YWdlLnJzdApAQCAtMCwwICsxLDIyMiBAQAorLi4gX2RldmVsb3BtZW50X2Vhcmx5X3N0YWdlOgorCitFYXJseS1zdGFnZSBwbGFubmluZworPT09PT09PT09PT09PT09PT09PT0KKworV2hlbiBjb250ZW1wbGF0aW5nIGEgTGludXgga2VybmVsIGRldmVsb3BtZW50IHByb2plY3QsIGl0IGNhbiBiZSB0ZW1wdGluZwordG8ganVtcCByaWdodCBpbiBhbmQgc3RhcnQgY29kaW5nLiAgQXMgd2l0aCBhbnkgc2lnbmlmaWNhbnQgcHJvamVjdCwKK3Rob3VnaCwgbXVjaCBvZiB0aGUgZ3JvdW5kd29yayBmb3Igc3VjY2VzcyBpcyBiZXN0IGxhaWQgYmVmb3JlIHRoZSBmaXJzdAorbGluZSBvZiBjb2RlIGlzIHdyaXR0ZW4uICBTb21lIHRpbWUgc3BlbnQgaW4gZWFybHkgcGxhbm5pbmcgYW5kCitjb21tdW5pY2F0aW9uIGNhbiBzYXZlIGZhciBtb3JlIHRpbWUgbGF0ZXIgb24uCisKKworU3BlY2lmeWluZyB0aGUgcHJvYmxlbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMaWtlIGFueSBlbmdpbmVlcmluZyBwcm9qZWN0LCBhIHN1Y2Nlc3NmdWwga2VybmVsIGVuaGFuY2VtZW50IHN0YXJ0cyB3aXRoIGEKK2NsZWFyIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRvIGJlIHNvbHZlZC4gIEluIHNvbWUgY2FzZXMsIHRoaXMgc3RlcCBpcworZWFzeTogd2hlbiBhIGRyaXZlciBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgcGllY2Ugb2YgaGFyZHdhcmUsIGZvcgorZXhhbXBsZS4gIEluIG90aGVycywgdGhvdWdoLCBpdCBpcyB0ZW1wdGluZyB0byBjb25mdXNlIHRoZSByZWFsIHByb2JsZW0KK3dpdGggdGhlIHByb3Bvc2VkIHNvbHV0aW9uLCBhbmQgdGhhdCBjYW4gbGVhZCB0byBkaWZmaWN1bHRpZXMuCisKK0NvbnNpZGVyIGFuIGV4YW1wbGU6IHNvbWUgeWVhcnMgYWdvLCBkZXZlbG9wZXJzIHdvcmtpbmcgd2l0aCBMaW51eCBhdWRpbworc291Z2h0IGEgd2F5IHRvIHJ1biBhcHBsaWNhdGlvbnMgd2l0aG91dCBkcm9wb3V0cyBvciBvdGhlciBhcnRpZmFjdHMgY2F1c2VkCitieSBleGNlc3NpdmUgbGF0ZW5jeSBpbiB0aGUgc3lzdGVtLiAgVGhlIHNvbHV0aW9uIHRoZXkgYXJyaXZlZCBhdCB3YXMgYQora2VybmVsIG1vZHVsZSBpbnRlbmRlZCB0byBob29rIGludG8gdGhlIExpbnV4IFNlY3VyaXR5IE1vZHVsZSAoTFNNKQorZnJhbWV3b3JrOyB0aGlzIG1vZHVsZSBjb3VsZCBiZSBjb25maWd1cmVkIHRvIGdpdmUgc3BlY2lmaWMgYXBwbGljYXRpb25zCithY2Nlc3MgdG8gdGhlIHJlYWx0aW1lIHNjaGVkdWxlci4gIFRoaXMgbW9kdWxlIHdhcyBpbXBsZW1lbnRlZCBhbmQgc2VudCB0bwordGhlIGxpbnV4LWtlcm5lbCBtYWlsaW5nIGxpc3QsIHdoZXJlIGl0IGltbWVkaWF0ZWx5IHJhbiBpbnRvIHByb2JsZW1zLgorCitUbyB0aGUgYXVkaW8gZGV2ZWxvcGVycywgdGhpcyBzZWN1cml0eSBtb2R1bGUgd2FzIHN1ZmZpY2llbnQgdG8gc29sdmUgdGhlaXIKK2ltbWVkaWF0ZSBwcm9ibGVtLiAgVG8gdGhlIHdpZGVyIGtlcm5lbCBjb21tdW5pdHksIHRob3VnaCwgaXQgd2FzIHNlZW4gYXMgYQorbWlzdXNlIG9mIHRoZSBMU00gZnJhbWV3b3JrICh3aGljaCBpcyBub3QgaW50ZW5kZWQgdG8gY29uZmVyIHByaXZpbGVnZXMKK29udG8gcHJvY2Vzc2VzIHdoaWNoIHRoZXkgd291bGQgbm90IG90aGVyd2lzZSBoYXZlKSBhbmQgYSByaXNrIHRvIHN5c3RlbQorc3RhYmlsaXR5LiAgVGhlaXIgcHJlZmVycmVkIHNvbHV0aW9ucyBpbnZvbHZlZCByZWFsdGltZSBzY2hlZHVsaW5nIGFjY2VzcwordmlhIHRoZSBybGltaXQgbWVjaGFuaXNtIGZvciB0aGUgc2hvcnQgdGVybSwgYW5kIG9uZ29pbmcgbGF0ZW5jeSByZWR1Y3Rpb24KK3dvcmsgaW4gdGhlIGxvbmcgdGVybS4KKworVGhlIGF1ZGlvIGNvbW11bml0eSwgaG93ZXZlciwgY291bGQgbm90IHNlZSBwYXN0IHRoZSBwYXJ0aWN1bGFyIHNvbHV0aW9uCit0aGV5IGhhZCBpbXBsZW1lbnRlZDsgdGhleSB3ZXJlIHVud2lsbGluZyB0byBhY2NlcHQgYWx0ZXJuYXRpdmVzLiAgVGhlCityZXN1bHRpbmcgZGlzYWdyZWVtZW50IGxlZnQgdGhvc2UgZGV2ZWxvcGVycyBmZWVsaW5nIGRpc2lsbHVzaW9uZWQgd2l0aCB0aGUKK2VudGlyZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2Vzczsgb25lIG9mIHRoZW0gd2VudCBiYWNrIHRvIGFuIGF1ZGlvIGxpc3QKK2FuZCBwb3N0ZWQgdGhpczoKKworCVRoZXJlIGFyZSBhIG51bWJlciBvZiB2ZXJ5IGdvb2QgTGludXgga2VybmVsIGRldmVsb3BlcnMsIGJ1dCB0aGV5CisJdGVuZCB0byBnZXQgb3V0c2hvdXRlZCBieSBhIGxhcmdlIGNyb3dkIG9mIGFycm9nYW50IGZvb2xzLiBUcnlpbmcKKwl0byBjb21tdW5pY2F0ZSB1c2VyIHJlcXVpcmVtZW50cyB0byB0aGVzZSBwZW9wbGUgaXMgYSB3YXN0ZSBvZgorCXRpbWUuIFRoZXkgYXJlIG11Y2ggdG9vICJpbnRlbGxpZ2VudCIgdG8gbGlzdGVuIHRvIGxlc3NlciBtb3J0YWxzLgorCisoaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvMTMxNzc2LykuCisKK1RoZSByZWFsaXR5IG9mIHRoZSBzaXR1YXRpb24gd2FzIGRpZmZlcmVudDsgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIHdlcmUgZmFyCittb3JlIGNvbmNlcm5lZCBhYm91dCBzeXN0ZW0gc3RhYmlsaXR5LCBsb25nLXRlcm0gbWFpbnRlbmFuY2UsIGFuZCBmaW5kaW5nCit0aGUgcmlnaHQgc29sdXRpb24gdG8gdGhlIHByb2JsZW0gdGhhbiB0aGV5IHdlcmUgd2l0aCBhIHNwZWNpZmljIG1vZHVsZS4KK1RoZSBtb3JhbCBvZiB0aGUgc3RvcnkgaXMgdG8gZm9jdXMgb24gdGhlIHByb2JsZW0gLSBub3QgYSBzcGVjaWZpYyBzb2x1dGlvbgorLSBhbmQgdG8gZGlzY3VzcyBpdCB3aXRoIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgYmVmb3JlIGludmVzdGluZyBpbiB0aGUKK2NyZWF0aW9uIG9mIGEgYm9keSBvZiBjb2RlLgorCitTbywgd2hlbiBjb250ZW1wbGF0aW5nIGEga2VybmVsIGRldmVsb3BtZW50IHByb2plY3QsIG9uZSBzaG91bGQgb2J0YWluCithbnN3ZXJzIHRvIGEgc2hvcnQgc2V0IG9mIHF1ZXN0aW9uczoKKworIC0gV2hhdCwgZXhhY3RseSwgaXMgdGhlIHByb2JsZW0gd2hpY2ggbmVlZHMgdG8gYmUgc29sdmVkPworCisgLSBXaG8gYXJlIHRoZSB1c2VycyBhZmZlY3RlZCBieSB0aGlzIHByb2JsZW0/ICBXaGljaCB1c2UgY2FzZXMgc2hvdWxkIHRoZQorICAgc29sdXRpb24gYWRkcmVzcz8KKworIC0gSG93IGRvZXMgdGhlIGtlcm5lbCBmYWxsIHNob3J0IGluIGFkZHJlc3NpbmcgdGhhdCBwcm9ibGVtIG5vdz8KKworT25seSB0aGVuIGRvZXMgaXQgbWFrZSBzZW5zZSB0byBzdGFydCBjb25zaWRlcmluZyBwb3NzaWJsZSBzb2x1dGlvbnMuCisKKworRWFybHkgZGlzY3Vzc2lvbgorLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuIHBsYW5uaW5nIGEga2VybmVsIGRldmVsb3BtZW50IHByb2plY3QsIGl0IG1ha2VzIGdyZWF0IHNlbnNlIHRvIGhvbGQKK2Rpc2N1c3Npb25zIHdpdGggdGhlIGNvbW11bml0eSBiZWZvcmUgbGF1bmNoaW5nIGludG8gaW1wbGVtZW50YXRpb24uICBFYXJseQorY29tbXVuaWNhdGlvbiBjYW4gc2F2ZSB0aW1lIGFuZCB0cm91YmxlIGluIGEgbnVtYmVyIG9mIHdheXM6CisKKyAtIEl0IG1heSB3ZWxsIGJlIHRoYXQgdGhlIHByb2JsZW0gaXMgYWRkcmVzc2VkIGJ5IHRoZSBrZXJuZWwgaW4gd2F5cyB3aGljaAorICAgeW91IGhhdmUgbm90IHVuZGVyc3Rvb2QuICBUaGUgTGludXgga2VybmVsIGlzIGxhcmdlIGFuZCBoYXMgYSBudW1iZXIgb2YKKyAgIGZlYXR1cmVzIGFuZCBjYXBhYmlsaXRpZXMgd2hpY2ggYXJlIG5vdCBpbW1lZGlhdGVseSBvYnZpb3VzLiAgTm90IGFsbAorICAga2VybmVsIGNhcGFiaWxpdGllcyBhcmUgZG9jdW1lbnRlZCBhcyB3ZWxsIGFzIG9uZSBtaWdodCBsaWtlLCBhbmQgaXQgaXMKKyAgIGVhc3kgdG8gbWlzcyB0aGluZ3MuICBZb3VyIGF1dGhvciBoYXMgc2VlbiB0aGUgcG9zdGluZyBvZiBhIGNvbXBsZXRlCisgICBkcml2ZXIgd2hpY2ggZHVwbGljYXRlZCBhbiBleGlzdGluZyBkcml2ZXIgdGhhdCB0aGUgbmV3IGF1dGhvciBoYWQgYmVlbgorICAgdW5hd2FyZSBvZi4gIENvZGUgd2hpY2ggcmVpbnZlbnRzIGV4aXN0aW5nIHdoZWVscyBpcyBub3Qgb25seSB3YXN0ZWZ1bDsKKyAgIGl0IHdpbGwgYWxzbyBub3QgYmUgYWNjZXB0ZWQgaW50byB0aGUgbWFpbmxpbmUga2VybmVsLgorCisgLSBUaGVyZSBtYXkgYmUgZWxlbWVudHMgb2YgdGhlIHByb3Bvc2VkIHNvbHV0aW9uIHdoaWNoIHdpbGwgbm90IGJlCisgICBhY2NlcHRhYmxlIGZvciBtYWlubGluZSBtZXJnaW5nLiAgSXQgaXMgYmV0dGVyIHRvIGZpbmQgb3V0IGFib3V0CisgICBwcm9ibGVtcyBsaWtlIHRoaXMgYmVmb3JlIHdyaXRpbmcgdGhlIGNvZGUuCisKKyAtIEl0J3MgZW50aXJlbHkgcG9zc2libGUgdGhhdCBvdGhlciBkZXZlbG9wZXJzIGhhdmUgdGhvdWdodCBhYm91dCB0aGUKKyAgIHByb2JsZW07IHRoZXkgbWF5IGhhdmUgaWRlYXMgZm9yIGEgYmV0dGVyIHNvbHV0aW9uLCBhbmQgbWF5IGJlIHdpbGxpbmcKKyAgIHRvIGhlbHAgaW4gdGhlIGNyZWF0aW9uIG9mIHRoYXQgc29sdXRpb24uCisKK1llYXJzIG9mIGV4cGVyaWVuY2Ugd2l0aCB0aGUga2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eSBoYXZlIHRhdWdodCBhCitjbGVhciBsZXNzb246IGtlcm5lbCBjb2RlIHdoaWNoIGlzIGRlc2lnbmVkIGFuZCBkZXZlbG9wZWQgYmVoaW5kIGNsb3NlZAorZG9vcnMgaW52YXJpYWJseSBoYXMgcHJvYmxlbXMgd2hpY2ggYXJlIG9ubHkgcmV2ZWFsZWQgd2hlbiB0aGUgY29kZSBpcworcmVsZWFzZWQgaW50byB0aGUgY29tbXVuaXR5LiAgU29tZXRpbWVzIHRoZXNlIHByb2JsZW1zIGFyZSBzZXZlcmUsCityZXF1aXJpbmcgbW9udGhzIG9yIHllYXJzIG9mIGVmZm9ydCBiZWZvcmUgdGhlIGNvZGUgY2FuIGJlIGJyb3VnaHQgdXAgdG8KK3RoZSBrZXJuZWwgY29tbXVuaXR5J3Mgc3RhbmRhcmRzLiAgU29tZSBleGFtcGxlcyBpbmNsdWRlOgorCisgLSBUaGUgRGV2aWNlc2NhcGUgbmV0d29yayBzdGFjayB3YXMgZGVzaWduZWQgYW5kIGltcGxlbWVudGVkIGZvcgorICAgc2luZ2xlLXByb2Nlc3NvciBzeXN0ZW1zLiAgSXQgY291bGQgbm90IGJlIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZQorICAgdW50aWwgaXQgd2FzIG1hZGUgc3VpdGFibGUgZm9yIG11bHRpcHJvY2Vzc29yIHN5c3RlbXMuICBSZXRyb2ZpdHRpbmcKKyAgIGxvY2tpbmcgYW5kIHN1Y2ggaW50byBjb2RlIGlzIGEgZGlmZmljdWx0IHRhc2s7IGFzIGEgcmVzdWx0LCB0aGUgbWVyZ2luZworICAgb2YgdGhpcyBjb2RlIChub3cgY2FsbGVkIG1hYzgwMjExKSB3YXMgZGVsYXllZCBmb3Igb3ZlciBhIHllYXIuCisKKyAtIFRoZSBSZWlzZXI0IGZpbGVzeXN0ZW0gaW5jbHVkZWQgYSBudW1iZXIgb2YgY2FwYWJpbGl0aWVzIHdoaWNoLCBpbiB0aGUKKyAgIGNvcmUga2VybmVsIGRldmVsb3BlcnMnIG9waW5pb24sIHNob3VsZCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgaW4gdGhlCisgICB2aXJ0dWFsIGZpbGVzeXN0ZW0gbGF5ZXIgaW5zdGVhZC4gIEl0IGFsc28gaW5jbHVkZWQgZmVhdHVyZXMgd2hpY2ggY291bGQKKyAgIG5vdCBlYXNpbHkgYmUgaW1wbGVtZW50ZWQgd2l0aG91dCBleHBvc2luZyB0aGUgc3lzdGVtIHRvIHVzZXItY2F1c2VkCisgICBkZWFkbG9ja3MuICBUaGUgbGF0ZSByZXZlbGF0aW9uIG9mIHRoZXNlIHByb2JsZW1zIC0gYW5kIHJlZnVzYWwgdG8KKyAgIGFkZHJlc3Mgc29tZSBvZiB0aGVtIC0gaGFzIGNhdXNlZCBSZWlzZXI0IHRvIHN0YXkgb3V0IG9mIHRoZSBtYWlubGluZQorICAga2VybmVsLgorCisgLSBUaGUgQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlIG1hZGUgdXNlIG9mIGludGVybmFsIHZpcnR1YWwgZmlsZXN5c3RlbQorICAgZGF0YSBzdHJ1Y3R1cmVzIGluIHdheXMgd2hpY2ggd2VyZSBjb25zaWRlcmVkIHRvIGJlIHVuc2FmZSBhbmQKKyAgIHVucmVsaWFibGUuICBUaGlzIGNvbmNlcm4gKGFtb25nIG90aGVycykga2VwdCBBcHBBcm1vciBvdXQgb2YgdGhlCisgICBtYWlubGluZSBmb3IgeWVhcnMuCisKK0luIGVhY2ggb2YgdGhlc2UgY2FzZXMsIGEgZ3JlYXQgZGVhbCBvZiBwYWluIGFuZCBleHRyYSB3b3JrIGNvdWxkIGhhdmUgYmVlbgorYXZvaWRlZCB3aXRoIHNvbWUgZWFybHkgZGlzY3Vzc2lvbiB3aXRoIHRoZSBrZXJuZWwgZGV2ZWxvcGVycy4KKworCitXaG8gZG8geW91IHRhbGsgdG8/CistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4gZGV2ZWxvcGVycyBkZWNpZGUgdG8gdGFrZSB0aGVpciBwbGFucyBwdWJsaWMsIHRoZSBuZXh0IHF1ZXN0aW9uIHdpbGwKK2JlOiB3aGVyZSBkbyB3ZSBzdGFydD8gIFRoZSBhbnN3ZXIgaXMgdG8gZmluZCB0aGUgcmlnaHQgbWFpbGluZyBsaXN0KHMpIGFuZAordGhlIHJpZ2h0IG1haW50YWluZXIuICBGb3IgbWFpbGluZyBsaXN0cywgdGhlIGJlc3QgYXBwcm9hY2ggaXMgdG8gbG9vayBpbgordGhlIE1BSU5UQUlORVJTIGZpbGUgZm9yIGEgcmVsZXZhbnQgcGxhY2UgdG8gcG9zdC4gIElmIHRoZXJlIGlzIGEgc3VpdGFibGUKK3N1YnN5c3RlbSBsaXN0LCBwb3N0aW5nIHRoZXJlIGlzIG9mdGVuIHByZWZlcmFibGUgdG8gcG9zdGluZyBvbgorbGludXgta2VybmVsOyB5b3UgYXJlIG1vcmUgbGlrZWx5IHRvIHJlYWNoIGRldmVsb3BlcnMgd2l0aCBleHBlcnRpc2UgaW4gdGhlCityZWxldmFudCBzdWJzeXN0ZW0gYW5kIHRoZSBlbnZpcm9ubWVudCBtYXkgYmUgbW9yZSBzdXBwb3J0aXZlLgorCitGaW5kaW5nIG1haW50YWluZXJzIGNhbiBiZSBhIGJpdCBoYXJkZXIuICBBZ2FpbiwgdGhlIE1BSU5UQUlORVJTIGZpbGUgaXMKK3RoZSBwbGFjZSB0byBzdGFydC4gIFRoYXQgZmlsZSB0ZW5kcyB0byBub3QgYWx3YXlzIGJlIHVwIHRvIGRhdGUsIHRob3VnaCwKK2FuZCBub3QgYWxsIHN1YnN5c3RlbXMgYXJlIHJlcHJlc2VudGVkIHRoZXJlLiAgVGhlIHBlcnNvbiBsaXN0ZWQgaW4gdGhlCitNQUlOVEFJTkVSUyBmaWxlIG1heSwgaW4gZmFjdCwgbm90IGJlIHRoZSBwZXJzb24gd2hvIGlzIGFjdHVhbGx5IGFjdGluZyBpbgordGhhdCByb2xlIGN1cnJlbnRseS4gIFNvLCB3aGVuIHRoZXJlIGlzIGRvdWJ0IGFib3V0IHdobyB0byBjb250YWN0LCBhCit1c2VmdWwgdHJpY2sgaXMgdG8gdXNlIGdpdCAoYW5kICJnaXQgbG9nIiBpbiBwYXJ0aWN1bGFyKSB0byBzZWUgd2hvIGlzCitjdXJyZW50bHkgYWN0aXZlIHdpdGhpbiB0aGUgc3Vic3lzdGVtIG9mIGludGVyZXN0LiAgTG9vayBhdCB3aG8gaXMgd3JpdGluZworcGF0Y2hlcywgYW5kIHdobywgaWYgYW55Ym9keSwgaXMgYXR0YWNoaW5nIFNpZ25lZC1vZmYtYnkgbGluZXMgdG8gdGhvc2UKK3BhdGNoZXMuICBUaG9zZSBhcmUgdGhlIHBlb3BsZSB3aG8gd2lsbCBiZSBiZXN0IHBsYWNlZCB0byBoZWxwIHdpdGggYSBuZXcKK2RldmVsb3BtZW50IHByb2plY3QuCisKK1RoZSB0YXNrIG9mIGZpbmRpbmcgdGhlIHJpZ2h0IG1haW50YWluZXIgaXMgc29tZXRpbWVzIGNoYWxsZW5naW5nIGVub3VnaAordGhhdCB0aGUga2VybmVsIGRldmVsb3BlcnMgaGF2ZSBhZGRlZCBhIHNjcmlwdCB0byBlYXNlIHRoZSBwcm9jZXNzOgorCis6OgorCisJLi4uL3NjcmlwdHMvZ2V0X21haW50YWluZXIucGwKKworVGhpcyBzY3JpcHQgd2lsbCByZXR1cm4gdGhlIGN1cnJlbnQgbWFpbnRhaW5lcihzKSBmb3IgYSBnaXZlbiBmaWxlIG9yCitkaXJlY3Rvcnkgd2hlbiBnaXZlbiB0aGUgIi1mIiBvcHRpb24uICBJZiBwYXNzZWQgYSBwYXRjaCBvbiB0aGUKK2NvbW1hbmQgbGluZSwgaXQgd2lsbCBsaXN0IHRoZSBtYWludGFpbmVycyB3aG8gc2hvdWxkIHByb2JhYmx5IHJlY2VpdmUKK2NvcGllcyBvZiB0aGUgcGF0Y2guICBUaGVyZSBhcmUgYSBudW1iZXIgb2Ygb3B0aW9ucyByZWd1bGF0aW5nIGhvdyBoYXJkCitnZXRfbWFpbnRhaW5lci5wbCB3aWxsIHNlYXJjaCBmb3IgbWFpbnRhaW5lcnM7IHBsZWFzZSBiZSBjYXJlZnVsIGFib3V0Cit1c2luZyB0aGUgbW9yZSBhZ2dyZXNzaXZlIG9wdGlvbnMgYXMgeW91IG1heSBlbmQgdXAgaW5jbHVkaW5nIGRldmVsb3BlcnMKK3dobyBoYXZlIG5vIHJlYWwgaW50ZXJlc3QgaW4gdGhlIGNvZGUgeW91IGFyZSBtb2RpZnlpbmcuCisKK0lmIGFsbCBlbHNlIGZhaWxzLCB0YWxraW5nIHRvIEFuZHJldyBNb3J0b24gY2FuIGJlIGFuIGVmZmVjdGl2ZSB3YXkgdG8KK3RyYWNrIGRvd24gYSBtYWludGFpbmVyIGZvciBhIHNwZWNpZmljIHBpZWNlIG9mIGNvZGUuCisKKworV2hlbiB0byBwb3N0PworLS0tLS0tLS0tLS0tLQorCitJZiBwb3NzaWJsZSwgcG9zdGluZyB5b3VyIHBsYW5zIGR1cmluZyB0aGUgZWFybHkgc3RhZ2VzIGNhbiBvbmx5IGJlCitoZWxwZnVsLiAgRGVzY3JpYmUgdGhlIHByb2JsZW0gYmVpbmcgc29sdmVkIGFuZCBhbnkgcGxhbnMgdGhhdCBoYXZlIGJlZW4KK21hZGUgb24gaG93IHRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGRvbmUuICBBbnkgaW5mb3JtYXRpb24geW91IGNhbgorcHJvdmlkZSBjYW4gaGVscCB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IHByb3ZpZGUgdXNlZnVsIGlucHV0IG9uIHRoZQorcHJvamVjdC4KKworT25lIGRpc2NvdXJhZ2luZyB0aGluZyB3aGljaCBjYW4gaGFwcGVuIGF0IHRoaXMgc3RhZ2UgaXMgbm90IGEgaG9zdGlsZQorcmVhY3Rpb24sIGJ1dCwgaW5zdGVhZCwgbGl0dGxlIG9yIG5vIHJlYWN0aW9uIGF0IGFsbC4gIFRoZSBzYWQgdHJ1dGggb2YgdGhlCittYXR0ZXIgaXMgKDEpIGtlcm5lbCBkZXZlbG9wZXJzIHRlbmQgdG8gYmUgYnVzeSwgKDIpIHRoZXJlIGlzIG5vIHNob3J0YWdlCitvZiBwZW9wbGUgd2l0aCBncmFuZCBwbGFucyBhbmQgbGl0dGxlIGNvZGUgKG9yIGV2ZW4gcHJvc3BlY3Qgb2YgY29kZSkgdG8KK2JhY2sgdGhlbSB1cCwgYW5kICgzKSBub2JvZHkgaXMgb2JsaWdhdGVkIHRvIHJldmlldyBvciBjb21tZW50IG9uIGlkZWFzCitwb3N0ZWQgYnkgb3RoZXJzLiAgQmV5b25kIHRoYXQsIGhpZ2gtbGV2ZWwgZGVzaWducyBvZnRlbiBoaWRlIHByb2JsZW1zCit3aGljaCBhcmUgb25seSByZXZpZXdlZCB3aGVuIHNvbWVib2R5IGFjdHVhbGx5IHRyaWVzIHRvIGltcGxlbWVudCB0aG9zZQorZGVzaWduczsgZm9yIHRoYXQgcmVhc29uLCBrZXJuZWwgZGV2ZWxvcGVycyB3b3VsZCByYXRoZXIgc2VlIHRoZSBjb2RlLgorCitJZiBhIHJlcXVlc3QtZm9yLWNvbW1lbnRzIHBvc3RpbmcgeWllbGRzIGxpdHRsZSBpbiB0aGUgd2F5IG9mIGNvbW1lbnRzLCBkbworbm90IGFzc3VtZSB0aGF0IGl0IG1lYW5zIHRoZXJlIGlzIG5vIGludGVyZXN0IGluIHRoZSBwcm9qZWN0LgorVW5mb3J0dW5hdGVseSwgeW91IGFsc28gY2Fubm90IGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBubyBwcm9ibGVtcyB3aXRoIHlvdXIKK2lkZWEuICBUaGUgYmVzdCB0aGluZyB0byBkbyBpbiB0aGlzIHNpdHVhdGlvbiBpcyB0byBwcm9jZWVkLCBrZWVwaW5nIHRoZQorY29tbXVuaXR5IGluZm9ybWVkIGFzIHlvdSBnby4KKworCitHZXR0aW5nIG9mZmljaWFsIGJ1eS1pbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91ciB3b3JrIGlzIGJlaW5nIGRvbmUgaW4gYSBjb3Jwb3JhdGUgZW52aXJvbm1lbnQgLSBhcyBtb3N0IExpbnV4CitrZXJuZWwgd29yayBpcyAtIHlvdSBtdXN0LCBvYnZpb3VzbHksIGhhdmUgcGVybWlzc2lvbiBmcm9tIHN1aXRhYmx5CitlbXBvd2VyZWQgbWFuYWdlcnMgYmVmb3JlIHlvdSBjYW4gcG9zdCB5b3VyIGNvbXBhbnkncyBwbGFucyBvciBjb2RlIHRvIGEKK3B1YmxpYyBtYWlsaW5nIGxpc3QuICBUaGUgcG9zdGluZyBvZiBjb2RlIHdoaWNoIGhhcyBub3QgYmVlbiBjbGVhcmVkIGZvcgorcmVsZWFzZSB1bmRlciBhIEdQTC1jb21wYXRpYmxlIGxpY2Vuc2UgY2FuIGJlIGVzcGVjaWFsbHkgcHJvYmxlbWF0aWM7IHRoZQorc29vbmVyIHRoYXQgYSBjb21wYW55J3MgbWFuYWdlbWVudCBhbmQgbGVnYWwgc3RhZmYgY2FuIGFncmVlIG9uIHRoZSBwb3N0aW5nCitvZiBhIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9qZWN0LCB0aGUgYmV0dGVyIG9mZiBldmVyeWJvZHkgaW52b2x2ZWQgd2lsbCBiZS4KKworU29tZSByZWFkZXJzIG1heSBiZSB0aGlua2luZyBhdCB0aGlzIHBvaW50IHRoYXQgdGhlaXIga2VybmVsIHdvcmsgaXMKK2ludGVuZGVkIHRvIHN1cHBvcnQgYSBwcm9kdWN0IHdoaWNoIGRvZXMgbm90IHlldCBoYXZlIGFuIG9mZmljaWFsbHkKK2Fja25vd2xlZGdlZCBleGlzdGVuY2UuICBSZXZlYWxpbmcgdGhlaXIgZW1wbG95ZXIncyBwbGFucyBvbiBhIHB1YmxpYworbWFpbGluZyBsaXN0IG1heSBub3QgYmUgYSB2aWFibGUgb3B0aW9uLiAgSW4gY2FzZXMgbGlrZSB0aGlzLCBpdCBpcyB3b3J0aAorY29uc2lkZXJpbmcgd2hldGhlciB0aGUgc2VjcmVjeSBpcyByZWFsbHkgbmVjZXNzYXJ5OyB0aGVyZSBpcyBvZnRlbiBubyByZWFsCituZWVkIHRvIGtlZXAgZGV2ZWxvcG1lbnQgcGxhbnMgYmVoaW5kIGNsb3NlZCBkb29ycy4KKworVGhhdCBzYWlkLCB0aGVyZSBhcmUgYWxzbyBjYXNlcyB3aGVyZSBhIGNvbXBhbnkgbGVnaXRpbWF0ZWx5IGNhbm5vdAorZGlzY2xvc2UgaXRzIHBsYW5zIGVhcmx5IGluIHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLiAgQ29tcGFuaWVzIHdpdGgKK2V4cGVyaWVuY2VkIGtlcm5lbCBkZXZlbG9wZXJzIG1heSBjaG9vc2UgdG8gcHJvY2VlZCBpbiBhbiBvcGVuLWxvb3AgbWFubmVyCitvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZXkgd2lsbCBiZSBhYmxlIHRvIGF2b2lkIHNlcmlvdXMgaW50ZWdyYXRpb24KK3Byb2JsZW1zIGxhdGVyLiAgRm9yIGNvbXBhbmllcyB3aXRob3V0IHRoYXQgc29ydCBvZiBpbi1ob3VzZSBleHBlcnRpc2UsIHRoZQorYmVzdCBvcHRpb24gaXMgb2Z0ZW4gdG8gaGlyZSBhbiBvdXRzaWRlIGRldmVsb3BlciB0byByZXZpZXcgdGhlIHBsYW5zIHVuZGVyCithIG5vbi1kaXNjbG9zdXJlIGFncmVlbWVudC4gIFRoZSBMaW51eCBGb3VuZGF0aW9uIG9wZXJhdGVzIGFuIE5EQSBwcm9ncmFtCitkZXNpZ25lZCB0byBoZWxwIHdpdGggdGhpcyBzb3J0IG9mIHNpdHVhdGlvbjsgbW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQKK2F0OgorCisgICAgaHR0cDovL3d3dy5saW51eGZvdW5kYXRpb24ub3JnL2VuL05EQV9wcm9ncmFtCisKK1RoaXMga2luZCBvZiByZXZpZXcgaXMgb2Z0ZW4gZW5vdWdoIHRvIGF2b2lkIHNlcmlvdXMgcHJvYmxlbXMgbGF0ZXIgb24KK3dpdGhvdXQgcmVxdWlyaW5nIHB1YmxpYyBkaXNjbG9zdXJlIG9mIHRoZSBwcm9qZWN0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzQuQ29kaW5nIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzQuQ29kaW5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTNlZTc3Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy80LkNvZGluZworKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi00OiBHRVRUSU5HIFRIRSBDT0RFIFJJR0hUCi0KLVdoaWxlIHRoZXJlIGlzIG11Y2ggdG8gYmUgc2FpZCBmb3IgYSBzb2xpZCBhbmQgY29tbXVuaXR5LW9yaWVudGVkIGRlc2lnbgotcHJvY2VzcywgdGhlIHByb29mIG9mIGFueSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvamVjdCBpcyBpbiB0aGUgcmVzdWx0aW5nCi1jb2RlLiAgSXQgaXMgdGhlIGNvZGUgd2hpY2ggd2lsbCBiZSBleGFtaW5lZCBieSBvdGhlciBkZXZlbG9wZXJzIGFuZCBtZXJnZWQKLShvciBub3QpIGludG8gdGhlIG1haW5saW5lIHRyZWUuICBTbyBpdCBpcyB0aGUgcXVhbGl0eSBvZiB0aGlzIGNvZGUgd2hpY2gKLXdpbGwgZGV0ZXJtaW5lIHRoZSB1bHRpbWF0ZSBzdWNjZXNzIG9mIHRoZSBwcm9qZWN0LgotCi1UaGlzIHNlY3Rpb24gd2lsbCBleGFtaW5lIHRoZSBjb2RpbmcgcHJvY2Vzcy4gIFdlJ2xsIHN0YXJ0IHdpdGggYSBsb29rIGF0IGEKLW51bWJlciBvZiB3YXlzIGluIHdoaWNoIGtlcm5lbCBkZXZlbG9wZXJzIGNhbiBnbyB3cm9uZy4gIFRoZW4gdGhlIGZvY3VzCi13aWxsIHNoaWZ0IHRvd2FyZCBkb2luZyB0aGluZ3MgcmlnaHQgYW5kIHRoZSB0b29scyB3aGljaCBjYW4gaGVscCBpbiB0aGF0Ci1xdWVzdC4KLQotCi00LjE6IFBJVEZBTExTCi0KLSogQ29kaW5nIHN0eWxlCi0KLVRoZSBrZXJuZWwgaGFzIGxvbmcgaGFkIGEgc3RhbmRhcmQgY29kaW5nIHN0eWxlLCBkZXNjcmliZWQgaW4KLURvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUuICBGb3IgbXVjaCBvZiB0aGF0IHRpbWUsIHRoZSBwb2xpY2llcyBkZXNjcmliZWQKLWluIHRoYXQgZmlsZSB3ZXJlIHRha2VuIGFzIGJlaW5nLCBhdCBtb3N0LCBhZHZpc29yeS4gIEFzIGEgcmVzdWx0LCB0aGVyZSBpcwotYSBzdWJzdGFudGlhbCBhbW91bnQgb2YgY29kZSBpbiB0aGUga2VybmVsIHdoaWNoIGRvZXMgbm90IG1lZXQgdGhlIGNvZGluZwotc3R5bGUgZ3VpZGVsaW5lcy4gIFRoZSBwcmVzZW5jZSBvZiB0aGF0IGNvZGUgbGVhZHMgdG8gdHdvIGluZGVwZW5kZW50Ci1oYXphcmRzIGZvciBrZXJuZWwgZGV2ZWxvcGVycy4KLQotVGhlIGZpcnN0IG9mIHRoZXNlIGlzIHRvIGJlbGlldmUgdGhhdCB0aGUga2VybmVsIGNvZGluZyBzdGFuZGFyZHMgZG8gbm90Ci1tYXR0ZXIgYW5kIGFyZSBub3QgZW5mb3JjZWQuICBUaGUgdHJ1dGggb2YgdGhlIG1hdHRlciBpcyB0aGF0IGFkZGluZyBuZXcKLWNvZGUgdG8gdGhlIGtlcm5lbCBpcyB2ZXJ5IGRpZmZpY3VsdCBpZiB0aGF0IGNvZGUgaXMgbm90IGNvZGVkIGFjY29yZGluZyB0bwotdGhlIHN0YW5kYXJkOyBtYW55IGRldmVsb3BlcnMgd2lsbCByZXF1ZXN0IHRoYXQgdGhlIGNvZGUgYmUgcmVmb3JtYXR0ZWQKLWJlZm9yZSB0aGV5IHdpbGwgZXZlbiByZXZpZXcgaXQuICBBIGNvZGUgYmFzZSBhcyBsYXJnZSBhcyB0aGUga2VybmVsCi1yZXF1aXJlcyBzb21lIHVuaWZvcm1pdHkgb2YgY29kZSB0byBtYWtlIGl0IHBvc3NpYmxlIGZvciBkZXZlbG9wZXJzIHRvCi1xdWlja2x5IHVuZGVyc3RhbmQgYW55IHBhcnQgb2YgaXQuICBTbyB0aGVyZSBpcyBubyBsb25nZXIgcm9vbSBmb3IKLXN0cmFuZ2VseS1mb3JtYXR0ZWQgY29kZS4KLQotT2NjYXNpb25hbGx5LCB0aGUga2VybmVsJ3MgY29kaW5nIHN0eWxlIHdpbGwgcnVuIGludG8gY29uZmxpY3Qgd2l0aCBhbgotZW1wbG95ZXIncyBtYW5kYXRlZCBzdHlsZS4gIEluIHN1Y2ggY2FzZXMsIHRoZSBrZXJuZWwncyBzdHlsZSB3aWxsIGhhdmUgdG8KLXdpbiBiZWZvcmUgdGhlIGNvZGUgY2FuIGJlIG1lcmdlZC4gIFB1dHRpbmcgY29kZSBpbnRvIHRoZSBrZXJuZWwgbWVhbnMKLWdpdmluZyB1cCBhIGRlZ3JlZSBvZiBjb250cm9sIGluIGEgbnVtYmVyIG9mIHdheXMgLSBpbmNsdWRpbmcgY29udHJvbCBvdmVyCi1ob3cgdGhlIGNvZGUgaXMgZm9ybWF0dGVkLgotCi1UaGUgb3RoZXIgdHJhcCBpcyB0byBhc3N1bWUgdGhhdCBjb2RlIHdoaWNoIGlzIGFscmVhZHkgaW4gdGhlIGtlcm5lbCBpcwotdXJnZW50bHkgaW4gbmVlZCBvZiBjb2Rpbmcgc3R5bGUgZml4ZXMuICBEZXZlbG9wZXJzIG1heSBzdGFydCB0byBnZW5lcmF0ZQotcmVmb3JtYXR0aW5nIHBhdGNoZXMgYXMgYSB3YXkgb2YgZ2FpbmluZyBmYW1pbGlhcml0eSB3aXRoIHRoZSBwcm9jZXNzLCBvcgotYXMgYSB3YXkgb2YgZ2V0dGluZyB0aGVpciBuYW1lIGludG8gdGhlIGtlcm5lbCBjaGFuZ2Vsb2dzIC0gb3IgYm90aC4gIEJ1dAotcHVyZSBjb2Rpbmcgc3R5bGUgZml4ZXMgYXJlIHNlZW4gYXMgbm9pc2UgYnkgdGhlIGRldmVsb3BtZW50IGNvbW11bml0eTsKLXRoZXkgdGVuZCB0byBnZXQgYSBjaGlsbHkgcmVjZXB0aW9uLiAgU28gdGhpcyB0eXBlIG9mIHBhdGNoIGlzIGJlc3QKLWF2b2lkZWQuICBJdCBpcyBuYXR1cmFsIHRvIGZpeCB0aGUgc3R5bGUgb2YgYSBwaWVjZSBvZiBjb2RlIHdoaWxlIHdvcmtpbmcKLW9uIGl0IGZvciBvdGhlciByZWFzb25zLCBidXQgY29kaW5nIHN0eWxlIGNoYW5nZXMgc2hvdWxkIG5vdCBiZSBtYWRlIGZvcgotdGhlaXIgb3duIHNha2UuCi0KLVRoZSBjb2Rpbmcgc3R5bGUgZG9jdW1lbnQgYWxzbyBzaG91bGQgbm90IGJlIHJlYWQgYXMgYW4gYWJzb2x1dGUgbGF3IHdoaWNoCi1jYW4gbmV2ZXIgYmUgdHJhbnNncmVzc2VkLiAgSWYgdGhlcmUgaXMgYSBnb29kIHJlYXNvbiB0byBnbyBhZ2FpbnN0IHRoZQotc3R5bGUgKGEgbGluZSB3aGljaCBiZWNvbWVzIGZhciBsZXNzIHJlYWRhYmxlIGlmIHNwbGl0IHRvIGZpdCB3aXRoaW4gdGhlCi04MC1jb2x1bW4gbGltaXQsIGZvciBleGFtcGxlKSwganVzdCBkbyBpdC4KLQotCi0qIEFic3RyYWN0aW9uIGxheWVycwotCi1Db21wdXRlciBTY2llbmNlIHByb2Zlc3NvcnMgdGVhY2ggc3R1ZGVudHMgdG8gbWFrZSBleHRlbnNpdmUgdXNlIG9mCi1hYnN0cmFjdGlvbiBsYXllcnMgaW4gdGhlIG5hbWUgb2YgZmxleGliaWxpdHkgYW5kIGluZm9ybWF0aW9uIGhpZGluZy4KLUNlcnRhaW5seSB0aGUga2VybmVsIG1ha2VzIGV4dGVuc2l2ZSB1c2Ugb2YgYWJzdHJhY3Rpb247IG5vIHByb2plY3QKLWludm9sdmluZyBzZXZlcmFsIG1pbGxpb24gbGluZXMgb2YgY29kZSBjb3VsZCBkbyBvdGhlcndpc2UgYW5kIHN1cnZpdmUuCi1CdXQgZXhwZXJpZW5jZSBoYXMgc2hvd24gdGhhdCBleGNlc3NpdmUgb3IgcHJlbWF0dXJlIGFic3RyYWN0aW9uIGNhbiBiZQotanVzdCBhcyBoYXJtZnVsIGFzIHByZW1hdHVyZSBvcHRpbWl6YXRpb24uICBBYnN0cmFjdGlvbiBzaG91bGQgYmUgdXNlZCB0bwotdGhlIGxldmVsIHJlcXVpcmVkIGFuZCBubyBmdXJ0aGVyLgotCi1BdCBhIHNpbXBsZSBsZXZlbCwgY29uc2lkZXIgYSBmdW5jdGlvbiB3aGljaCBoYXMgYW4gYXJndW1lbnQgd2hpY2ggaXMKLWFsd2F5cyBwYXNzZWQgYXMgemVybyBieSBhbGwgY2FsbGVycy4gIE9uZSBjb3VsZCByZXRhaW4gdGhhdCBhcmd1bWVudCBqdXN0Ci1pbiBjYXNlIHNvbWVib2R5IGV2ZW50dWFsbHkgbmVlZHMgdG8gdXNlIHRoZSBleHRyYSBmbGV4aWJpbGl0eSB0aGF0IGl0Ci1wcm92aWRlcy4gIEJ5IHRoYXQgdGltZSwgdGhvdWdoLCBjaGFuY2VzIGFyZSBnb29kIHRoYXQgdGhlIGNvZGUgd2hpY2gKLWltcGxlbWVudHMgdGhpcyBleHRyYSBhcmd1bWVudCBoYXMgYmVlbiBicm9rZW4gaW4gc29tZSBzdWJ0bGUgd2F5IHdoaWNoIHdhcwotbmV2ZXIgbm90aWNlZCAtIGJlY2F1c2UgaXQgaGFzIG5ldmVyIGJlZW4gdXNlZC4gIE9yLCB3aGVuIHRoZSBuZWVkIGZvcgotZXh0cmEgZmxleGliaWxpdHkgYXJpc2VzLCBpdCBkb2VzIG5vdCBkbyBzbyBpbiBhIHdheSB3aGljaCBtYXRjaGVzIHRoZQotcHJvZ3JhbW1lcidzIGVhcmx5IGV4cGVjdGF0aW9uLiAgS2VybmVsIGRldmVsb3BlcnMgd2lsbCByb3V0aW5lbHkgc3VibWl0Ci1wYXRjaGVzIHRvIHJlbW92ZSB1bnVzZWQgYXJndW1lbnRzOyB0aGV5IHNob3VsZCwgaW4gZ2VuZXJhbCwgbm90IGJlIGFkZGVkCi1pbiB0aGUgZmlyc3QgcGxhY2UuCi0KLUFic3RyYWN0aW9uIGxheWVycyB3aGljaCBoaWRlIGFjY2VzcyB0byBoYXJkd2FyZSAtIG9mdGVuIHRvIGFsbG93IHRoZSBidWxrCi1vZiBhIGRyaXZlciB0byBiZSB1c2VkIHdpdGggbXVsdGlwbGUgb3BlcmF0aW5nIHN5c3RlbXMgLSBhcmUgZXNwZWNpYWxseQotZnJvd25lZCB1cG9uLiAgU3VjaCBsYXllcnMgb2JzY3VyZSB0aGUgY29kZSBhbmQgbWF5IGltcG9zZSBhIHBlcmZvcm1hbmNlCi1wZW5hbHR5OyB0aGV5IGRvIG5vdCBiZWxvbmcgaW4gdGhlIExpbnV4IGtlcm5lbC4KLQotT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdSBmaW5kIHlvdXJzZWxmIGNvcHlpbmcgc2lnbmlmaWNhbnQgYW1vdW50cyBvZiBjb2RlCi1mcm9tIGFub3RoZXIga2VybmVsIHN1YnN5c3RlbSwgaXQgaXMgdGltZSB0byBhc2sgd2hldGhlciBpdCB3b3VsZCwgaW4gZmFjdCwKLW1ha2Ugc2Vuc2UgdG8gcHVsbCBvdXQgc29tZSBvZiB0aGF0IGNvZGUgaW50byBhIHNlcGFyYXRlIGxpYnJhcnkgb3IgdG8KLWltcGxlbWVudCB0aGF0IGZ1bmN0aW9uYWxpdHkgYXQgYSBoaWdoZXIgbGV2ZWwuICBUaGVyZSBpcyBubyB2YWx1ZSBpbgotcmVwbGljYXRpbmcgdGhlIHNhbWUgY29kZSB0aHJvdWdob3V0IHRoZSBrZXJuZWwuCi0KLQotKiAjaWZkZWYgYW5kIHByZXByb2Nlc3NvciB1c2UgaW4gZ2VuZXJhbAotCi1UaGUgQyBwcmVwcm9jZXNzb3Igc2VlbXMgdG8gcHJlc2VudCBhIHBvd2VyZnVsIHRlbXB0YXRpb24gdG8gc29tZSBDCi1wcm9ncmFtbWVycywgd2hvIHNlZSBpdCBhcyBhIHdheSB0byBlZmZpY2llbnRseSBlbmNvZGUgYSBncmVhdCBkZWFsIG9mCi1mbGV4aWJpbGl0eSBpbnRvIGEgc291cmNlIGZpbGUuICBCdXQgdGhlIHByZXByb2Nlc3NvciBpcyBub3QgQywgYW5kIGhlYXZ5Ci11c2Ugb2YgaXQgcmVzdWx0cyBpbiBjb2RlIHdoaWNoIGlzIG11Y2ggaGFyZGVyIGZvciBvdGhlcnMgdG8gcmVhZCBhbmQKLWhhcmRlciBmb3IgdGhlIGNvbXBpbGVyIHRvIGNoZWNrIGZvciBjb3JyZWN0bmVzcy4gIEhlYXZ5IHByZXByb2Nlc3NvciB1c2UKLWlzIGFsbW9zdCBhbHdheXMgYSBzaWduIG9mIGNvZGUgd2hpY2ggbmVlZHMgc29tZSBjbGVhbnVwIHdvcmsuCi0KLUNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHdpdGggI2lmZGVmIGlzLCBpbmRlZWQsIGEgcG93ZXJmdWwgZmVhdHVyZSwgYW5kIGl0Ci1pcyB1c2VkIHdpdGhpbiB0aGUga2VybmVsLiAgQnV0IHRoZXJlIGlzIGxpdHRsZSBkZXNpcmUgdG8gc2VlIGNvZGUgd2hpY2ggaXMKLXNwcmlua2xlZCBsaWJlcmFsbHkgd2l0aCAjaWZkZWYgYmxvY2tzLiAgQXMgYSBnZW5lcmFsIHJ1bGUsICNpZmRlZiB1c2UKLXNob3VsZCBiZSBjb25maW5lZCB0byBoZWFkZXIgZmlsZXMgd2hlbmV2ZXIgcG9zc2libGUuCi1Db25kaXRpb25hbGx5LWNvbXBpbGVkIGNvZGUgY2FuIGJlIGNvbmZpbmVkIHRvIGZ1bmN0aW9ucyB3aGljaCwgaWYgdGhlIGNvZGUKLWlzIG5vdCB0byBiZSBwcmVzZW50LCBzaW1wbHkgYmVjb21lIGVtcHR5LiAgVGhlIGNvbXBpbGVyIHdpbGwgdGhlbiBxdWlldGx5Ci1vcHRpbWl6ZSBvdXQgdGhlIGNhbGwgdG8gdGhlIGVtcHR5IGZ1bmN0aW9uLiAgVGhlIHJlc3VsdCBpcyBmYXIgY2xlYW5lcgotY29kZSB3aGljaCBpcyBlYXNpZXIgdG8gZm9sbG93LgotCi1DIHByZXByb2Nlc3NvciBtYWNyb3MgcHJlc2VudCBhIG51bWJlciBvZiBoYXphcmRzLCBpbmNsdWRpbmcgcG9zc2libGUKLW11bHRpcGxlIGV2YWx1YXRpb24gb2YgZXhwcmVzc2lvbnMgd2l0aCBzaWRlIGVmZmVjdHMgYW5kIG5vIHR5cGUgc2FmZXR5LgotSWYgeW91IGFyZSB0ZW1wdGVkIHRvIGRlZmluZSBhIG1hY3JvLCBjb25zaWRlciBjcmVhdGluZyBhbiBpbmxpbmUgZnVuY3Rpb24KLWluc3RlYWQuICBUaGUgY29kZSB3aGljaCByZXN1bHRzIHdpbGwgYmUgdGhlIHNhbWUsIGJ1dCBpbmxpbmUgZnVuY3Rpb25zIGFyZQotZWFzaWVyIHRvIHJlYWQsIGRvIG5vdCBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMgbXVsdGlwbGUgdGltZXMsIGFuZCBhbGxvdwotdGhlIGNvbXBpbGVyIHRvIHBlcmZvcm0gdHlwZSBjaGVja2luZyBvbiB0aGUgYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWUuCi0KLQotKiBJbmxpbmUgZnVuY3Rpb25zCi0KLUlubGluZSBmdW5jdGlvbnMgcHJlc2VudCBhIGhhemFyZCBvZiB0aGVpciBvd24sIHRob3VnaC4gIFByb2dyYW1tZXJzIGNhbgotYmVjb21lIGVuYW1vcmVkIG9mIHRoZSBwZXJjZWl2ZWQgZWZmaWNpZW5jeSBpbmhlcmVudCBpbiBhdm9pZGluZyBhIGZ1bmN0aW9uCi1jYWxsIGFuZCBmaWxsIGEgc291cmNlIGZpbGUgd2l0aCBpbmxpbmUgZnVuY3Rpb25zLiAgVGhvc2UgZnVuY3Rpb25zLAotaG93ZXZlciwgY2FuIGFjdHVhbGx5IHJlZHVjZSBwZXJmb3JtYW5jZS4gIFNpbmNlIHRoZWlyIGNvZGUgaXMgcmVwbGljYXRlZAotYXQgZWFjaCBjYWxsIHNpdGUsIHRoZXkgZW5kIHVwIGJsb2F0aW5nIHRoZSBzaXplIG9mIHRoZSBjb21waWxlZCBrZXJuZWwuCi1UaGF0LCBpbiB0dXJuLCBjcmVhdGVzIHByZXNzdXJlIG9uIHRoZSBwcm9jZXNzb3IncyBtZW1vcnkgY2FjaGVzLCB3aGljaCBjYW4KLXNsb3cgZXhlY3V0aW9uIGRyYW1hdGljYWxseS4gIElubGluZSBmdW5jdGlvbnMsIGFzIGEgcnVsZSwgc2hvdWxkIGJlIHF1aXRlCi1zbWFsbCBhbmQgcmVsYXRpdmVseSByYXJlLiAgVGhlIGNvc3Qgb2YgYSBmdW5jdGlvbiBjYWxsLCBhZnRlciBhbGwsIGlzIG5vdAotdGhhdCBoaWdoOyB0aGUgY3JlYXRpb24gb2YgbGFyZ2UgbnVtYmVycyBvZiBpbmxpbmUgZnVuY3Rpb25zIGlzIGEgY2xhc3NpYwotZXhhbXBsZSBvZiBwcmVtYXR1cmUgb3B0aW1pemF0aW9uLgotCi1JbiBnZW5lcmFsLCBrZXJuZWwgcHJvZ3JhbW1lcnMgaWdub3JlIGNhY2hlIGVmZmVjdHMgYXQgdGhlaXIgcGVyaWwuICBUaGUKLWNsYXNzaWMgdGltZS9zcGFjZSB0cmFkZW9mZiB0YXVnaHQgaW4gYmVnaW5uaW5nIGRhdGEgc3RydWN0dXJlcyBjbGFzc2VzCi1vZnRlbiBkb2VzIG5vdCBhcHBseSB0byBjb250ZW1wb3JhcnkgaGFyZHdhcmUuICBTcGFjZSAqaXMqIHRpbWUsIGluIHRoYXQgYQotbGFyZ2VyIHByb2dyYW0gd2lsbCBydW4gc2xvd2VyIHRoYW4gb25lIHdoaWNoIGlzIG1vcmUgY29tcGFjdC4KLQotTW9yZSByZWNlbnQgY29tcGlsZXJzIHRha2UgYW4gaW5jcmVhc2luZ2x5IGFjdGl2ZSByb2xlIGluIGRlY2lkaW5nIHdoZXRoZXIKLWEgZ2l2ZW4gZnVuY3Rpb24gc2hvdWxkIGFjdHVhbGx5IGJlIGlubGluZWQgb3Igbm90LiAgU28gdGhlIGxpYmVyYWwKLXBsYWNlbWVudCBvZiAiaW5saW5lIiBrZXl3b3JkcyBtYXkgbm90IGp1c3QgYmUgZXhjZXNzaXZlOyBpdCBjb3VsZCBhbHNvIGJlCi1pcnJlbGV2YW50LgotCi0KLSogTG9ja2luZwotCi1JbiBNYXksIDIwMDYsIHRoZSAiRGV2aWNlc2NhcGUiIG5ldHdvcmtpbmcgc3RhY2sgd2FzLCB3aXRoIGdyZWF0Ci1mYW5mYXJlLCByZWxlYXNlZCB1bmRlciB0aGUgR1BMIGFuZCBtYWRlIGF2YWlsYWJsZSBmb3IgaW5jbHVzaW9uIGluIHRoZQotbWFpbmxpbmUga2VybmVsLiAgVGhpcyBkb25hdGlvbiB3YXMgd2VsY29tZSBuZXdzOyBzdXBwb3J0IGZvciB3aXJlbGVzcwotbmV0d29ya2luZyBpbiBMaW51eCB3YXMgY29uc2lkZXJlZCBzdWJzdGFuZGFyZCBhdCBiZXN0LCBhbmQgdGhlIERldmljZXNjYXBlCi1zdGFjayBvZmZlcmVkIHRoZSBwcm9taXNlIG9mIGZpeGluZyB0aGF0IHNpdHVhdGlvbi4gIFlldCwgdGhpcyBjb2RlIGRpZCBub3QKLWFjdHVhbGx5IG1ha2UgaXQgaW50byB0aGUgbWFpbmxpbmUgdW50aWwgSnVuZSwgMjAwNyAoMi42LjIyKS4gIFdoYXQKLWhhcHBlbmVkPwotCi1UaGlzIGNvZGUgc2hvd2VkIGEgbnVtYmVyIG9mIHNpZ25zIG9mIGhhdmluZyBiZWVuIGRldmVsb3BlZCBiZWhpbmQKLWNvcnBvcmF0ZSBkb29ycy4gIEJ1dCBvbmUgbGFyZ2UgcHJvYmxlbSBpbiBwYXJ0aWN1bGFyIHdhcyB0aGF0IGl0IHdhcyBub3QKLWRlc2lnbmVkIHRvIHdvcmsgb24gbXVsdGlwcm9jZXNzb3Igc3lzdGVtcy4gIEJlZm9yZSB0aGlzIG5ldHdvcmtpbmcgc3RhY2sKLShub3cgY2FsbGVkIG1hYzgwMjExKSBjb3VsZCBiZSBtZXJnZWQsIGEgbG9ja2luZyBzY2hlbWUgbmVlZGVkIHRvIGJlCi1yZXRyb2ZpdHRlZCBvbnRvIGl0LiAgCi0KLU9uY2UgdXBvbiBhIHRpbWUsIExpbnV4IGtlcm5lbCBjb2RlIGNvdWxkIGJlIGRldmVsb3BlZCB3aXRob3V0IHRoaW5raW5nCi1hYm91dCB0aGUgY29uY3VycmVuY3kgaXNzdWVzIHByZXNlbnRlZCBieSBtdWx0aXByb2Nlc3NvciBzeXN0ZW1zLiAgTm93LAotaG93ZXZlciwgdGhpcyBkb2N1bWVudCBpcyBiZWluZyB3cml0dGVuIG9uIGEgZHVhbC1jb3JlIGxhcHRvcC4gIEV2ZW4gb24KLXNpbmdsZS1wcm9jZXNzb3Igc3lzdGVtcywgd29yayBiZWluZyBkb25lIHRvIGltcHJvdmUgcmVzcG9uc2l2ZW5lc3Mgd2lsbAotcmFpc2UgdGhlIGxldmVsIG9mIGNvbmN1cnJlbmN5IHdpdGhpbiB0aGUga2VybmVsLiAgVGhlIGRheXMgd2hlbiBrZXJuZWwKLWNvZGUgY291bGQgYmUgd3JpdHRlbiB3aXRob3V0IHRoaW5raW5nIGFib3V0IGxvY2tpbmcgYXJlIGxvbmcgcGFzdC4KLQotQW55IHJlc291cmNlIChkYXRhIHN0cnVjdHVyZXMsIGhhcmR3YXJlIHJlZ2lzdGVycywgZXRjLikgd2hpY2ggY291bGQgYmUKLWFjY2Vzc2VkIGNvbmN1cnJlbnRseSBieSBtb3JlIHRoYW4gb25lIHRocmVhZCBtdXN0IGJlIHByb3RlY3RlZCBieSBhIGxvY2suCi1OZXcgY29kZSBzaG91bGQgYmUgd3JpdHRlbiB3aXRoIHRoaXMgcmVxdWlyZW1lbnQgaW4gbWluZDsgcmV0cm9maXR0aW5nCi1sb2NraW5nIGFmdGVyIHRoZSBmYWN0IGlzIGEgcmF0aGVyIG1vcmUgZGlmZmljdWx0IHRhc2suICBLZXJuZWwgZGV2ZWxvcGVycwotc2hvdWxkIHRha2UgdGhlIHRpbWUgdG8gdW5kZXJzdGFuZCB0aGUgYXZhaWxhYmxlIGxvY2tpbmcgcHJpbWl0aXZlcyB3ZWxsCi1lbm91Z2ggdG8gcGljayB0aGUgcmlnaHQgdG9vbCBmb3IgdGhlIGpvYi4gIENvZGUgd2hpY2ggc2hvd3MgYSBsYWNrIG9mCi1hdHRlbnRpb24gdG8gY29uY3VycmVuY3kgd2lsbCBoYXZlIGEgZGlmZmljdWx0IHBhdGggaW50byB0aGUgbWFpbmxpbmUuCi0KLQotKiBSZWdyZXNzaW9ucwotCi1PbmUgZmluYWwgaGF6YXJkIHdvcnRoIG1lbnRpb25pbmcgaXMgdGhpczogaXQgY2FuIGJlIHRlbXB0aW5nIHRvIG1ha2UgYQotY2hhbmdlICh3aGljaCBtYXkgYnJpbmcgYmlnIGltcHJvdmVtZW50cykgd2hpY2ggY2F1c2VzIHNvbWV0aGluZyB0byBicmVhawotZm9yIGV4aXN0aW5nIHVzZXJzLiAgVGhpcyBraW5kIG9mIGNoYW5nZSBpcyBjYWxsZWQgYSAicmVncmVzc2lvbiwiIGFuZAotcmVncmVzc2lvbnMgaGF2ZSBiZWNvbWUgbW9zdCB1bndlbGNvbWUgaW4gdGhlIG1haW5saW5lIGtlcm5lbC4gIFdpdGggZmV3Ci1leGNlcHRpb25zLCBjaGFuZ2VzIHdoaWNoIGNhdXNlIHJlZ3Jlc3Npb25zIHdpbGwgYmUgYmFja2VkIG91dCBpZiB0aGUKLXJlZ3Jlc3Npb24gY2Fubm90IGJlIGZpeGVkIGluIGEgdGltZWx5IG1hbm5lci4gIEZhciBiZXR0ZXIgdG8gYXZvaWQgdGhlCi1yZWdyZXNzaW9uIGluIHRoZSBmaXJzdCBwbGFjZS4KLQotSXQgaXMgb2Z0ZW4gYXJndWVkIHRoYXQgYSByZWdyZXNzaW9uIGNhbiBiZSBqdXN0aWZpZWQgaWYgaXQgY2F1c2VzIHRoaW5ncwotdG8gd29yayBmb3IgbW9yZSBwZW9wbGUgdGhhbiBpdCBjcmVhdGVzIHByb2JsZW1zIGZvci4gIFdoeSBub3QgbWFrZSBhCi1jaGFuZ2UgaWYgaXQgYnJpbmdzIG5ldyBmdW5jdGlvbmFsaXR5IHRvIHRlbiBzeXN0ZW1zIGZvciBlYWNoIG9uZSBpdAotYnJlYWtzPyAgVGhlIGJlc3QgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24gd2FzIGV4cHJlc3NlZCBieSBMaW51cyBpbiBKdWx5LAotMjAwNzoKLQotCVNvIHdlIGRvbid0IGZpeCBidWdzIGJ5IGludHJvZHVjaW5nIG5ldyBwcm9ibGVtcy4gIFRoYXQgd2F5IGxpZXMKLQltYWRuZXNzLCBhbmQgbm9ib2R5IGV2ZXIga25vd3MgaWYgeW91IGFjdHVhbGx5IG1ha2UgYW55IHJlYWwKLQlwcm9ncmVzcyBhdCBhbGwuIElzIGl0IHR3byBzdGVwcyBmb3J3YXJkcywgb25lIHN0ZXAgYmFjaywgb3Igb25lCi0Jc3RlcCBmb3J3YXJkIGFuZCB0d28gc3RlcHMgYmFjaz8KLQotKGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzI0MzQ2MC8pLgotCi1BbiBlc3BlY2lhbGx5IHVud2VsY29tZSB0eXBlIG9mIHJlZ3Jlc3Npb24gaXMgYW55IHNvcnQgb2YgY2hhbmdlIHRvIHRoZQotdXNlci1zcGFjZSBBQkkuICBPbmNlIGFuIGludGVyZmFjZSBoYXMgYmVlbiBleHBvcnRlZCB0byB1c2VyIHNwYWNlLCBpdCBtdXN0Ci1iZSBzdXBwb3J0ZWQgaW5kZWZpbml0ZWx5LiAgVGhpcyBmYWN0IG1ha2VzIHRoZSBjcmVhdGlvbiBvZiB1c2VyLXNwYWNlCi1pbnRlcmZhY2VzIHBhcnRpY3VsYXJseSBjaGFsbGVuZ2luZzogc2luY2UgdGhleSBjYW5ub3QgYmUgY2hhbmdlZCBpbgotaW5jb21wYXRpYmxlIHdheXMsIHRoZXkgbXVzdCBiZSBkb25lIHJpZ2h0IHRoZSBmaXJzdCB0aW1lLiAgRm9yIHRoaXMKLXJlYXNvbiwgYSBncmVhdCBkZWFsIG9mIHRob3VnaHQsIGNsZWFyIGRvY3VtZW50YXRpb24sIGFuZCB3aWRlIHJldmlldyBmb3IKLXVzZXItc3BhY2UgaW50ZXJmYWNlcyBpcyBhbHdheXMgcmVxdWlyZWQuCi0KLQotCi00LjI6IENPREUgQ0hFQ0tJTkcgVE9PTFMKLQotRm9yIG5vdywgYXQgbGVhc3QsIHRoZSB3cml0aW5nIG9mIGVycm9yLWZyZWUgY29kZSByZW1haW5zIGFuIGlkZWFsIHRoYXQgZmV3Ci1vZiB1cyBjYW4gcmVhY2guICBXaGF0IHdlIGNhbiBob3BlIHRvIGRvLCB0aG91Z2gsIGlzIHRvIGNhdGNoIGFuZCBmaXggYXMKLW1hbnkgb2YgdGhvc2UgZXJyb3JzIGFzIHBvc3NpYmxlIGJlZm9yZSBvdXIgY29kZSBnb2VzIGludG8gdGhlIG1haW5saW5lCi1rZXJuZWwuICBUbyB0aGF0IGVuZCwgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIGhhdmUgcHV0IHRvZ2V0aGVyIGFuIGltcHJlc3NpdmUKLWFycmF5IG9mIHRvb2xzIHdoaWNoIGNhbiBjYXRjaCBhIHdpZGUgdmFyaWV0eSBvZiBvYnNjdXJlIHByb2JsZW1zIGluIGFuCi1hdXRvbWF0ZWQgd2F5LiAgQW55IHByb2JsZW0gY2F1Z2h0IGJ5IHRoZSBjb21wdXRlciBpcyBhIHByb2JsZW0gd2hpY2ggd2lsbAotbm90IGFmZmxpY3QgYSB1c2VyIGxhdGVyIG9uLCBzbyBpdCBzdGFuZHMgdG8gcmVhc29uIHRoYXQgdGhlIGF1dG9tYXRlZAotdG9vbHMgc2hvdWxkIGJlIHVzZWQgd2hlbmV2ZXIgcG9zc2libGUuCi0KLVRoZSBmaXJzdCBzdGVwIGlzIHNpbXBseSB0byBoZWVkIHRoZSB3YXJuaW5ncyBwcm9kdWNlZCBieSB0aGUgY29tcGlsZXIuCi1Db250ZW1wb3JhcnkgdmVyc2lvbnMgb2YgZ2NjIGNhbiBkZXRlY3QgKGFuZCB3YXJuIGFib3V0KSBhIGxhcmdlIG51bWJlciBvZgotcG90ZW50aWFsIGVycm9ycy4gIFF1aXRlIG9mdGVuLCB0aGVzZSB3YXJuaW5ncyBwb2ludCB0byByZWFsIHByb2JsZW1zLgotQ29kZSBzdWJtaXR0ZWQgZm9yIHJldmlldyBzaG91bGQsIGFzIGEgcnVsZSwgbm90IHByb2R1Y2UgYW55IGNvbXBpbGVyCi13YXJuaW5ncy4gIFdoZW4gc2lsZW5jaW5nIHdhcm5pbmdzLCB0YWtlIGNhcmUgdG8gdW5kZXJzdGFuZCB0aGUgcmVhbCBjYXVzZQotYW5kIHRyeSB0byBhdm9pZCAiZml4ZXMiIHdoaWNoIG1ha2UgdGhlIHdhcm5pbmcgZ28gYXdheSB3aXRob3V0IGFkZHJlc3NpbmcKLWl0cyBjYXVzZS4KLQotTm90ZSB0aGF0IG5vdCBhbGwgY29tcGlsZXIgd2FybmluZ3MgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gIEJ1aWxkIHRoZQota2VybmVsIHdpdGggIm1ha2UgRVhUUkFfQ0ZMQUdTPS1XIiB0byBnZXQgdGhlIGZ1bGwgc2V0LgotCi1UaGUga2VybmVsIHByb3ZpZGVzIHNldmVyYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIHdoaWNoIHR1cm4gb24gZGVidWdnaW5nCi1mZWF0dXJlczsgbW9zdCBvZiB0aGVzZSBhcmUgZm91bmQgaW4gdGhlICJrZXJuZWwgaGFja2luZyIgc3VibWVudS4gIFNldmVyYWwKLW9mIHRoZXNlIG9wdGlvbnMgc2hvdWxkIGJlIHR1cm5lZCBvbiBmb3IgYW55IGtlcm5lbCB1c2VkIGZvciBkZXZlbG9wbWVudCBvcgotdGVzdGluZyBwdXJwb3Nlcy4gIEluIHBhcnRpY3VsYXIsIHlvdSBzaG91bGQgdHVybiBvbjoKLQotIC0gRU5BQkxFX1dBUk5fREVQUkVDQVRFRCwgRU5BQkxFX01VU1RfQ0hFQ0ssIGFuZCBGUkFNRV9XQVJOIHRvIGdldCBhbgotICAgZXh0cmEgc2V0IG9mIHdhcm5pbmdzIGZvciBwcm9ibGVtcyBsaWtlIHRoZSB1c2Ugb2YgZGVwcmVjYXRlZCBpbnRlcmZhY2VzCi0gICBvciBpZ25vcmluZyBhbiBpbXBvcnRhbnQgcmV0dXJuIHZhbHVlIGZyb20gYSBmdW5jdGlvbi4gIFRoZSBvdXRwdXQKLSAgIGdlbmVyYXRlZCBieSB0aGVzZSB3YXJuaW5ncyBjYW4gYmUgdmVyYm9zZSwgYnV0IG9uZSBuZWVkIG5vdCB3b3JyeSBhYm91dAotICAgd2FybmluZ3MgZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsLgotCi0gLSBERUJVR19PQkpFQ1RTIHdpbGwgYWRkIGNvZGUgdG8gdHJhY2sgdGhlIGxpZmV0aW1lIG9mIHZhcmlvdXMgb2JqZWN0cwotICAgY3JlYXRlZCBieSB0aGUga2VybmVsIGFuZCB3YXJuIHdoZW4gdGhpbmdzIGFyZSBkb25lIG91dCBvZiBvcmRlci4gIElmCi0gICB5b3UgYXJlIGFkZGluZyBhIHN1YnN5c3RlbSB3aGljaCBjcmVhdGVzIChhbmQgZXhwb3J0cykgY29tcGxleCBvYmplY3RzCi0gICBvZiBpdHMgb3duLCBjb25zaWRlciBhZGRpbmcgc3VwcG9ydCBmb3IgdGhlIG9iamVjdCBkZWJ1Z2dpbmcKLSAgIGluZnJhc3RydWN0dXJlLgotCi0gLSBERUJVR19TTEFCIGNhbiBmaW5kIGEgdmFyaWV0eSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgdXNlIGVycm9yczsgaXQKLSAgIHNob3VsZCBiZSB1c2VkIG9uIG1vc3QgZGV2ZWxvcG1lbnQga2VybmVscy4KLQotIC0gREVCVUdfU1BJTkxPQ0ssIERFQlVHX0FUT01JQ19TTEVFUCwgYW5kIERFQlVHX01VVEVYRVMgd2lsbCBmaW5kIGEKLSAgIG51bWJlciBvZiBjb21tb24gbG9ja2luZyBlcnJvcnMuCi0KLVRoZXJlIGFyZSBxdWl0ZSBhIGZldyBvdGhlciBkZWJ1Z2dpbmcgb3B0aW9ucywgc29tZSBvZiB3aGljaCB3aWxsIGJlCi1kaXNjdXNzZWQgYmVsb3cuICBTb21lIG9mIHRoZW0gaGF2ZSBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcGFjdCBhbmQKLXNob3VsZCBub3QgYmUgdXNlZCBhbGwgb2YgdGhlIHRpbWUuICBCdXQgc29tZSB0aW1lIHNwZW50IGxlYXJuaW5nIHRoZQotYXZhaWxhYmxlIG9wdGlvbnMgd2lsbCBsaWtlbHkgYmUgcGFpZCBiYWNrIG1hbnkgdGltZXMgb3ZlciBpbiBzaG9ydCBvcmRlci4gCi0KLU9uZSBvZiB0aGUgaGVhdmllciBkZWJ1Z2dpbmcgdG9vbHMgaXMgdGhlIGxvY2tpbmcgY2hlY2tlciwgb3IgImxvY2tkZXAuIgotVGhpcyB0b29sIHdpbGwgdHJhY2sgdGhlIGFjcXVpc2l0aW9uIGFuZCByZWxlYXNlIG9mIGV2ZXJ5IGxvY2sgKHNwaW5sb2NrIG9yCi1tdXRleCkgaW4gdGhlIHN5c3RlbSwgdGhlIG9yZGVyIGluIHdoaWNoIGxvY2tzIGFyZSBhY3F1aXJlZCByZWxhdGl2ZSB0bwotZWFjaCBvdGhlciwgdGhlIGN1cnJlbnQgaW50ZXJydXB0IGVudmlyb25tZW50LCBhbmQgbW9yZS4gIEl0IGNhbiB0aGVuCi1lbnN1cmUgdGhhdCBsb2NrcyBhcmUgYWx3YXlzIGFjcXVpcmVkIGluIHRoZSBzYW1lIG9yZGVyLCB0aGF0IHRoZSBzYW1lCi1pbnRlcnJ1cHQgYXNzdW1wdGlvbnMgYXBwbHkgaW4gYWxsIHNpdHVhdGlvbnMsIGFuZCBzbyBvbi4gIEluIG90aGVyIHdvcmRzLAotbG9ja2RlcCBjYW4gZmluZCBhIG51bWJlciBvZiBzY2VuYXJpb3MgaW4gd2hpY2ggdGhlIHN5c3RlbSBjb3VsZCwgb24gcmFyZQotb2NjYXNpb24sIGRlYWRsb2NrLiAgVGhpcyBraW5kIG9mIHByb2JsZW0gY2FuIGJlIHBhaW5mdWwgKGZvciBib3RoCi1kZXZlbG9wZXJzIGFuZCB1c2VycykgaW4gYSBkZXBsb3llZCBzeXN0ZW07IGxvY2tkZXAgYWxsb3dzIHRoZW0gdG8gYmUgZm91bmQKLWluIGFuIGF1dG9tYXRlZCBtYW5uZXIgYWhlYWQgb2YgdGltZS4gIENvZGUgd2l0aCBhbnkgc29ydCBvZiBub24tdHJpdmlhbAotbG9ja2luZyBzaG91bGQgYmUgcnVuIHdpdGggbG9ja2RlcCBlbmFibGVkIGJlZm9yZSBiZWluZyBzdWJtaXR0ZWQgZm9yCi1pbmNsdXNpb24uIAotCi1BcyBhIGRpbGlnZW50IGtlcm5lbCBwcm9ncmFtbWVyLCB5b3Ugd2lsbCwgYmV5b25kIGRvdWJ0LCBjaGVjayB0aGUgcmV0dXJuCi1zdGF0dXMgb2YgYW55IG9wZXJhdGlvbiAoc3VjaCBhcyBhIG1lbW9yeSBhbGxvY2F0aW9uKSB3aGljaCBjYW4gZmFpbC4gIFRoZQotZmFjdCBvZiB0aGUgbWF0dGVyLCB0aG91Z2gsIGlzIHRoYXQgdGhlIHJlc3VsdGluZyBmYWlsdXJlIHJlY292ZXJ5IHBhdGhzCi1hcmUsIHByb2JhYmx5LCBjb21wbGV0ZWx5IHVudGVzdGVkLiAgVW50ZXN0ZWQgY29kZSB0ZW5kcyB0byBiZSBicm9rZW4gY29kZTsKLXlvdSBjb3VsZCBiZSBtdWNoIG1vcmUgY29uZmlkZW50IG9mIHlvdXIgY29kZSBpZiBhbGwgdGhvc2UgZXJyb3ItaGFuZGxpbmcKLXBhdGhzIGhhZCBiZWVuIGV4ZXJjaXNlZCBhIGZldyB0aW1lcy4KLQotVGhlIGtlcm5lbCBwcm92aWRlcyBhIGZhdWx0IGluamVjdGlvbiBmcmFtZXdvcmsgd2hpY2ggY2FuIGRvIGV4YWN0bHkgdGhhdCwKLWVzcGVjaWFsbHkgd2hlcmUgbWVtb3J5IGFsbG9jYXRpb25zIGFyZSBpbnZvbHZlZC4gIFdpdGggZmF1bHQgaW5qZWN0aW9uCi1lbmFibGVkLCBhIGNvbmZpZ3VyYWJsZSBwZXJjZW50YWdlIG9mIG1lbW9yeSBhbGxvY2F0aW9ucyB3aWxsIGJlIG1hZGUgdG8KLWZhaWw7IHRoZXNlIGZhaWx1cmVzIGNhbiBiZSByZXN0cmljdGVkIHRvIGEgc3BlY2lmaWMgcmFuZ2Ugb2YgY29kZS4KLVJ1bm5pbmcgd2l0aCBmYXVsdCBpbmplY3Rpb24gZW5hYmxlZCBhbGxvd3MgdGhlIHByb2dyYW1tZXIgdG8gc2VlIGhvdyB0aGUKLWNvZGUgcmVzcG9uZHMgd2hlbiB0aGluZ3MgZ28gYmFkbHkuICBTZWUKLURvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhdWx0LWluamVjdGlvbi50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24KLWhvdyB0byB1c2UgdGhpcyBmYWNpbGl0eS4KLQotT3RoZXIga2luZHMgb2YgZXJyb3JzIGNhbiBiZSBmb3VuZCB3aXRoIHRoZSAic3BhcnNlIiBzdGF0aWMgYW5hbHlzaXMgdG9vbC4KLVdpdGggc3BhcnNlLCB0aGUgcHJvZ3JhbW1lciBjYW4gYmUgd2FybmVkIGFib3V0IGNvbmZ1c2lvbiBiZXR3ZWVuCi11c2VyLXNwYWNlIGFuZCBrZXJuZWwtc3BhY2UgYWRkcmVzc2VzLCBtaXh0dXJlIG9mIGJpZy1lbmRpYW4gYW5kCi1zbWFsbC1lbmRpYW4gcXVhbnRpdGllcywgdGhlIHBhc3Npbmcgb2YgaW50ZWdlciB2YWx1ZXMgd2hlcmUgYSBzZXQgb2YgYml0Ci1mbGFncyBpcyBleHBlY3RlZCwgYW5kIHNvIG9uLiAgU3BhcnNlIG11c3QgYmUgaW5zdGFsbGVkIHNlcGFyYXRlbHkgKGl0IGNhbgotYmUgZm91bmQgYXQgaHR0cHM6Ly9zcGFyc2Uud2lraS5rZXJuZWwub3JnL2luZGV4LnBocC9NYWluX1BhZ2UgaWYgeW91cgotZGlzdHJpYnV0b3IgZG9lcyBub3QgcGFja2FnZSBpdCk7IGl0IGNhbiB0aGVuIGJlIHJ1biBvbiB0aGUgY29kZSBieSBhZGRpbmcKLSJDPTEiIHRvIHlvdXIgbWFrZSBjb21tYW5kLgotCi1UaGUgIkNvY2NpbmVsbGUiIHRvb2wgKGh0dHA6Ly9jb2NjaW5lbGxlLmxpcDYuZnIvKSBpcyBhYmxlIHRvIGZpbmQgYSB3aWRlCi12YXJpZXR5IG9mIHBvdGVudGlhbCBjb2RpbmcgcHJvYmxlbXM7IGl0IGNhbiBhbHNvIHByb3Bvc2UgZml4ZXMgZm9yIHRob3NlCi1wcm9ibGVtcy4gIFF1aXRlIGEgZmV3ICJzZW1hbnRpYyBwYXRjaGVzIiBmb3IgdGhlIGtlcm5lbCBoYXZlIGJlZW4gcGFja2FnZWQKLXVuZGVyIHRoZSBzY3JpcHRzL2NvY2NpbmVsbGUgZGlyZWN0b3J5OyBydW5uaW5nICJtYWtlIGNvY2NpY2hlY2siIHdpbGwgcnVuCi10aHJvdWdoIHRob3NlIHNlbWFudGljIHBhdGNoZXMgYW5kIHJlcG9ydCBvbiBhbnkgcHJvYmxlbXMgZm91bmQuICBTZWUKLURvY3VtZW50YXRpb24vY29jY2luZWxsZS50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLU90aGVyIGtpbmRzIG9mIHBvcnRhYmlsaXR5IGVycm9ycyBhcmUgYmVzdCBmb3VuZCBieSBjb21waWxpbmcgeW91ciBjb2RlIGZvcgotb3RoZXIgYXJjaGl0ZWN0dXJlcy4gIElmIHlvdSBkbyBub3QgaGFwcGVuIHRvIGhhdmUgYW4gUy8zOTAgc3lzdGVtIG9yIGEKLUJsYWNrZmluIGRldmVsb3BtZW50IGJvYXJkIGhhbmR5LCB5b3UgY2FuIHN0aWxsIHBlcmZvcm0gdGhlIGNvbXBpbGF0aW9uCi1zdGVwLiAgQSBsYXJnZSBzZXQgb2YgY3Jvc3MgY29tcGlsZXJzIGZvciB4ODYgc3lzdGVtcyBjYW4gYmUgZm91bmQgYXQgCi0KLQlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3Rvb2xzL2Nyb3NzdG9vbC8KLQotU29tZSB0aW1lIHNwZW50IGluc3RhbGxpbmcgYW5kIHVzaW5nIHRoZXNlIGNvbXBpbGVycyB3aWxsIGhlbHAgYXZvaWQKLWVtYmFycmFzc21lbnQgbGF0ZXIuCi0KLQotNC4zOiBET0NVTUVOVEFUSU9OCi0KLURvY3VtZW50YXRpb24gaGFzIG9mdGVuIGJlZW4gbW9yZSB0aGUgZXhjZXB0aW9uIHRoYW4gdGhlIHJ1bGUgd2l0aCBrZXJuZWwKLWRldmVsb3BtZW50LiAgRXZlbiBzbywgYWRlcXVhdGUgZG9jdW1lbnRhdGlvbiB3aWxsIGhlbHAgdG8gZWFzZSB0aGUgbWVyZ2luZwotb2YgbmV3IGNvZGUgaW50byB0aGUga2VybmVsLCBtYWtlIGxpZmUgZWFzaWVyIGZvciBvdGhlciBkZXZlbG9wZXJzLCBhbmQKLXdpbGwgYmUgaGVscGZ1bCBmb3IgeW91ciB1c2Vycy4gIEluIG1hbnkgY2FzZXMsIHRoZSBhZGRpdGlvbiBvZgotZG9jdW1lbnRhdGlvbiBoYXMgYmVjb21lIGVzc2VudGlhbGx5IG1hbmRhdG9yeS4KLQotVGhlIGZpcnN0IHBpZWNlIG9mIGRvY3VtZW50YXRpb24gZm9yIGFueSBwYXRjaCBpcyBpdHMgYXNzb2NpYXRlZAotY2hhbmdlbG9nLiAgTG9nIGVudHJpZXMgc2hvdWxkIGRlc2NyaWJlIHRoZSBwcm9ibGVtIGJlaW5nIHNvbHZlZCwgdGhlIGZvcm0KLW9mIHRoZSBzb2x1dGlvbiwgdGhlIHBlb3BsZSB3aG8gd29ya2VkIG9uIHRoZSBwYXRjaCwgYW55IHJlbGV2YW50Ci1lZmZlY3RzIG9uIHBlcmZvcm1hbmNlLCBhbmQgYW55dGhpbmcgZWxzZSB0aGF0IG1pZ2h0IGJlIG5lZWRlZCB0bwotdW5kZXJzdGFuZCB0aGUgcGF0Y2guICBCZSBzdXJlIHRoYXQgdGhlIGNoYW5nZWxvZyBzYXlzICp3aHkqIHRoZSBwYXRjaCBpcwotd29ydGggYXBwbHlpbmc7IGEgc3VycHJpc2luZyBudW1iZXIgb2YgZGV2ZWxvcGVycyBmYWlsIHRvIHByb3ZpZGUgdGhhdAotaW5mb3JtYXRpb24uCi0KLUFueSBjb2RlIHdoaWNoIGFkZHMgYSBuZXcgdXNlci1zcGFjZSBpbnRlcmZhY2UgLSBpbmNsdWRpbmcgbmV3IHN5c2ZzIG9yCi0vcHJvYyBmaWxlcyAtIHNob3VsZCBpbmNsdWRlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBpbnRlcmZhY2Ugd2hpY2ggZW5hYmxlcwotdXNlci1zcGFjZSBkZXZlbG9wZXJzIHRvIGtub3cgd2hhdCB0aGV5IGFyZSB3b3JraW5nIHdpdGguICBTZWUKLURvY3VtZW50YXRpb24vQUJJL1JFQURNRSBmb3IgYSBkZXNjcmlwdGlvbiBvZiBob3cgdGhpcyBkb2N1bWVudGF0aW9uIHNob3VsZAotYmUgZm9ybWF0dGVkIGFuZCB3aGF0IGluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIHByb3ZpZGVkLgotCi1UaGUgZmlsZSBEb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBkZXNjcmliZXMgYWxsIG9mIHRoZSBrZXJuZWwncwotYm9vdC10aW1lIHBhcmFtZXRlcnMuICBBbnkgcGF0Y2ggd2hpY2ggYWRkcyBuZXcgcGFyYW1ldGVycyBzaG91bGQgYWRkIHRoZQotYXBwcm9wcmlhdGUgZW50cmllcyB0byB0aGlzIGZpbGUuCi0KLUFueSBuZXcgY29uZmlndXJhdGlvbiBvcHRpb25zIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgaGVscCB0ZXh0IHdoaWNoCi1jbGVhcmx5IGV4cGxhaW5zIHRoZSBvcHRpb25zIGFuZCB3aGVuIHRoZSB1c2VyIG1pZ2h0IHdhbnQgdG8gc2VsZWN0IHRoZW0uCi0KLUludGVybmFsIEFQSSBpbmZvcm1hdGlvbiBmb3IgbWFueSBzdWJzeXN0ZW1zIGlzIGRvY3VtZW50ZWQgYnkgd2F5IG9mCi1zcGVjaWFsbHktZm9ybWF0dGVkIGNvbW1lbnRzOyB0aGVzZSBjb21tZW50cyBjYW4gYmUgZXh0cmFjdGVkIGFuZCBmb3JtYXR0ZWQKLWluIGEgbnVtYmVyIG9mIHdheXMgYnkgdGhlICJrZXJuZWwtZG9jIiBzY3JpcHQuICBJZiB5b3UgYXJlIHdvcmtpbmcgd2l0aGluCi1hIHN1YnN5c3RlbSB3aGljaCBoYXMga2VybmVsZG9jIGNvbW1lbnRzLCB5b3Ugc2hvdWxkIG1haW50YWluIHRoZW0gYW5kIGFkZAotdGhlbSwgYXMgYXBwcm9wcmlhdGUsIGZvciBleHRlcm5hbGx5LWF2YWlsYWJsZSBmdW5jdGlvbnMuICBFdmVuIGluIGFyZWFzCi13aGljaCBoYXZlIG5vdCBiZWVuIHNvIGRvY3VtZW50ZWQsIHRoZXJlIGlzIG5vIGhhcm0gaW4gYWRkaW5nIGtlcm5lbGRvYwotY29tbWVudHMgZm9yIHRoZSBmdXR1cmU7IGluZGVlZCwgdGhpcyBjYW4gYmUgYSB1c2VmdWwgYWN0aXZpdHkgZm9yCi1iZWdpbm5pbmcga2VybmVsIGRldmVsb3BlcnMuICBUaGUgZm9ybWF0IG9mIHRoZXNlIGNvbW1lbnRzLCBhbG9uZyB3aXRoIHNvbWUKLWluZm9ybWF0aW9uIG9uIGhvdyB0byBjcmVhdGUga2VybmVsZG9jIHRlbXBsYXRlcyBjYW4gYmUgZm91bmQgaW4gdGhlIGZpbGUKLURvY3VtZW50YXRpb24va2VybmVsLWRvY3VtZW50YXRpb24ucnN0LgotCi1Bbnlib2R5IHdobyByZWFkcyB0aHJvdWdoIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIGV4aXN0aW5nIGtlcm5lbCBjb2RlIHdpbGwKLW5vdGUgdGhhdCwgb2Z0ZW4sIGNvbW1lbnRzIGFyZSBtb3N0IG5vdGFibGUgYnkgdGhlaXIgYWJzZW5jZS4gIE9uY2UgYWdhaW4sCi10aGUgZXhwZWN0YXRpb25zIGZvciBuZXcgY29kZSBhcmUgaGlnaGVyIHRoYW4gdGhleSB3ZXJlIGluIHRoZSBwYXN0OwotbWVyZ2luZyB1bmNvbW1lbnRlZCBjb2RlIHdpbGwgYmUgaGFyZGVyLiAgVGhhdCBzYWlkLCB0aGVyZSBpcyBsaXR0bGUgZGVzaXJlCi1mb3IgdmVyYm9zZWx5LWNvbW1lbnRlZCBjb2RlLiAgVGhlIGNvZGUgc2hvdWxkLCBpdHNlbGYsIGJlIHJlYWRhYmxlLCB3aXRoCi1jb21tZW50cyBleHBsYWluaW5nIHRoZSBtb3JlIHN1YnRsZSBhc3BlY3RzLgotCi1DZXJ0YWluIHRoaW5ncyBzaG91bGQgYWx3YXlzIGJlIGNvbW1lbnRlZC4gIFVzZXMgb2YgbWVtb3J5IGJhcnJpZXJzIHNob3VsZAotYmUgYWNjb21wYW5pZWQgYnkgYSBsaW5lIGV4cGxhaW5pbmcgd2h5IHRoZSBiYXJyaWVyIGlzIG5lY2Vzc2FyeS4gIFRoZQotbG9ja2luZyBydWxlcyBmb3IgZGF0YSBzdHJ1Y3R1cmVzIGdlbmVyYWxseSBuZWVkIHRvIGJlIGV4cGxhaW5lZCBzb21ld2hlcmUuCi1NYWpvciBkYXRhIHN0cnVjdHVyZXMgbmVlZCBjb21wcmVoZW5zaXZlIGRvY3VtZW50YXRpb24gaW4gZ2VuZXJhbC4KLU5vbi1vYnZpb3VzIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHNlcGFyYXRlIGJpdHMgb2YgY29kZSBzaG91bGQgYmUgcG9pbnRlZAotb3V0LiAgQW55dGhpbmcgd2hpY2ggbWlnaHQgdGVtcHQgYSBjb2RlIGphbml0b3IgdG8gbWFrZSBhbiBpbmNvcnJlY3QKLSJjbGVhbnVwIiBuZWVkcyBhIGNvbW1lbnQgc2F5aW5nIHdoeSBpdCBpcyBkb25lIHRoZSB3YXkgaXQgaXMuICBBbmQgc28gb24uCi0KLQotNC40OiBJTlRFUk5BTCBBUEkgQ0hBTkdFUwotCi1UaGUgYmluYXJ5IGludGVyZmFjZSBwcm92aWRlZCBieSB0aGUga2VybmVsIHRvIHVzZXIgc3BhY2UgY2Fubm90IGJlIGJyb2tlbgotZXhjZXB0IHVuZGVyIHRoZSBtb3N0IHNldmVyZSBjaXJjdW1zdGFuY2VzLiAgVGhlIGtlcm5lbCdzIGludGVybmFsCi1wcm9ncmFtbWluZyBpbnRlcmZhY2VzLCBpbnN0ZWFkLCBhcmUgaGlnaGx5IGZsdWlkIGFuZCBjYW4gYmUgY2hhbmdlZCB3aGVuCi10aGUgbmVlZCBhcmlzZXMuICBJZiB5b3UgZmluZCB5b3Vyc2VsZiBoYXZpbmcgdG8gd29yayBhcm91bmQgYSBrZXJuZWwgQVBJLAotb3Igc2ltcGx5IG5vdCB1c2luZyBhIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgYmVjYXVzZSBpdCBkb2VzIG5vdCBtZWV0IHlvdXIKLW5lZWRzLCB0aGF0IG1heSBiZSBhIHNpZ24gdGhhdCB0aGUgQVBJIG5lZWRzIHRvIGNoYW5nZS4gIEFzIGEga2VybmVsCi1kZXZlbG9wZXIsIHlvdSBhcmUgZW1wb3dlcmVkIHRvIG1ha2Ugc3VjaCBjaGFuZ2VzLgotCi1UaGVyZSBhcmUsIG9mIGNvdXJzZSwgc29tZSBjYXRjaGVzLiAgQVBJIGNoYW5nZXMgY2FuIGJlIG1hZGUsIGJ1dCB0aGV5IG5lZWQKLXRvIGJlIHdlbGwganVzdGlmaWVkLiAgU28gYW55IHBhdGNoIG1ha2luZyBhbiBpbnRlcm5hbCBBUEkgY2hhbmdlIHNob3VsZCBiZQotYWNjb21wYW5pZWQgYnkgYSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBjaGFuZ2UgaXMgYW5kIHdoeSBpdCBpcwotbmVjZXNzYXJ5LiAgVGhpcyBraW5kIG9mIGNoYW5nZSBzaG91bGQgYWxzbyBiZSBicm9rZW4gb3V0IGludG8gYSBzZXBhcmF0ZQotcGF0Y2gsIHJhdGhlciB0aGFuIGJ1cmllZCB3aXRoaW4gYSBsYXJnZXIgcGF0Y2guCi0KLVRoZSBvdGhlciBjYXRjaCBpcyB0aGF0IGEgZGV2ZWxvcGVyIHdobyBjaGFuZ2VzIGFuIGludGVybmFsIEFQSSBpcwotZ2VuZXJhbGx5IGNoYXJnZWQgd2l0aCB0aGUgdGFzayBvZiBmaXhpbmcgYW55IGNvZGUgd2l0aGluIHRoZSBrZXJuZWwgdHJlZQotd2hpY2ggaXMgYnJva2VuIGJ5IHRoZSBjaGFuZ2UuICBGb3IgYSB3aWRlbHktdXNlZCBmdW5jdGlvbiwgdGhpcyBkdXR5IGNhbgotbGVhZCB0byBsaXRlcmFsbHkgaHVuZHJlZHMgb3IgdGhvdXNhbmRzIG9mIGNoYW5nZXMgLSBtYW55IG9mIHdoaWNoIGFyZQotbGlrZWx5IHRvIGNvbmZsaWN0IHdpdGggd29yayBiZWluZyBkb25lIGJ5IG90aGVyIGRldmVsb3BlcnMuICBOZWVkbGVzcyB0bwotc2F5LCB0aGlzIGNhbiBiZSBhIGxhcmdlIGpvYiwgc28gaXQgaXMgYmVzdCB0byBiZSBzdXJlIHRoYXQgdGhlCi1qdXN0aWZpY2F0aW9uIGlzIHNvbGlkLiAgTm90ZSB0aGF0IHRoZSBDb2NjaW5lbGxlIHRvb2wgY2FuIGhlbHAgd2l0aAotd2lkZS1yYW5naW5nIEFQSSBjaGFuZ2VzLgotCi1XaGVuIG1ha2luZyBhbiBpbmNvbXBhdGlibGUgQVBJIGNoYW5nZSwgb25lIHNob3VsZCwgd2hlbmV2ZXIgcG9zc2libGUsCi1lbnN1cmUgdGhhdCBjb2RlIHdoaWNoIGhhcyBub3QgYmVlbiB1cGRhdGVkIGlzIGNhdWdodCBieSB0aGUgY29tcGlsZXIuCi1UaGlzIHdpbGwgaGVscCB5b3UgdG8gYmUgc3VyZSB0aGF0IHlvdSBoYXZlIGZvdW5kIGFsbCBpbi10cmVlIHVzZXMgb2YgdGhhdAotaW50ZXJmYWNlLiAgSXQgd2lsbCBhbHNvIGFsZXJ0IGRldmVsb3BlcnMgb2Ygb3V0LW9mLXRyZWUgY29kZSB0aGF0IHRoZXJlIGlzCi1hIGNoYW5nZSB0aGF0IHRoZXkgbmVlZCB0byByZXNwb25kIHRvLiAgU3VwcG9ydGluZyBvdXQtb2YtdHJlZSBjb2RlIGlzIG5vdAotc29tZXRoaW5nIHRoYXQga2VybmVsIGRldmVsb3BlcnMgbmVlZCB0byBiZSB3b3JyaWVkIGFib3V0LCBidXQgd2UgYWxzbyBkbwotbm90IGhhdmUgdG8gbWFrZSBsaWZlIGhhcmRlciBmb3Igb3V0LW9mLXRyZWUgZGV2ZWxvcGVycyB0aGFuIGl0IG5lZWRzIHRvCi1iZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy80LkNvZGluZy5yc3QgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNC5Db2RpbmcucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNWNlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNC5Db2RpbmcucnN0CkBAIC0wLDAgKzEsNDEzIEBACisuLiBfZGV2ZWxvcG1lbnRfY29kaW5nOgorCitHZXR0aW5nIHRoZSBjb2RlIHJpZ2h0Cis9PT09PT09PT09PT09PT09PT09PT09CisKK1doaWxlIHRoZXJlIGlzIG11Y2ggdG8gYmUgc2FpZCBmb3IgYSBzb2xpZCBhbmQgY29tbXVuaXR5LW9yaWVudGVkIGRlc2lnbgorcHJvY2VzcywgdGhlIHByb29mIG9mIGFueSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvamVjdCBpcyBpbiB0aGUgcmVzdWx0aW5nCitjb2RlLiAgSXQgaXMgdGhlIGNvZGUgd2hpY2ggd2lsbCBiZSBleGFtaW5lZCBieSBvdGhlciBkZXZlbG9wZXJzIGFuZCBtZXJnZWQKKyhvciBub3QpIGludG8gdGhlIG1haW5saW5lIHRyZWUuICBTbyBpdCBpcyB0aGUgcXVhbGl0eSBvZiB0aGlzIGNvZGUgd2hpY2gKK3dpbGwgZGV0ZXJtaW5lIHRoZSB1bHRpbWF0ZSBzdWNjZXNzIG9mIHRoZSBwcm9qZWN0LgorCitUaGlzIHNlY3Rpb24gd2lsbCBleGFtaW5lIHRoZSBjb2RpbmcgcHJvY2Vzcy4gIFdlJ2xsIHN0YXJ0IHdpdGggYSBsb29rIGF0IGEKK251bWJlciBvZiB3YXlzIGluIHdoaWNoIGtlcm5lbCBkZXZlbG9wZXJzIGNhbiBnbyB3cm9uZy4gIFRoZW4gdGhlIGZvY3VzCit3aWxsIHNoaWZ0IHRvd2FyZCBkb2luZyB0aGluZ3MgcmlnaHQgYW5kIHRoZSB0b29scyB3aGljaCBjYW4gaGVscCBpbiB0aGF0CitxdWVzdC4KKworCitQaXRmYWxscworLS0tLS0tLS0tCisKK0NvZGluZyBzdHlsZQorKioqKioqKioqKioqCisKK1RoZSBrZXJuZWwgaGFzIGxvbmcgaGFkIGEgc3RhbmRhcmQgY29kaW5nIHN0eWxlLCBkZXNjcmliZWQgaW4KK0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUuICBGb3IgbXVjaCBvZiB0aGF0IHRpbWUsIHRoZSBwb2xpY2llcyBkZXNjcmliZWQKK2luIHRoYXQgZmlsZSB3ZXJlIHRha2VuIGFzIGJlaW5nLCBhdCBtb3N0LCBhZHZpc29yeS4gIEFzIGEgcmVzdWx0LCB0aGVyZSBpcworYSBzdWJzdGFudGlhbCBhbW91bnQgb2YgY29kZSBpbiB0aGUga2VybmVsIHdoaWNoIGRvZXMgbm90IG1lZXQgdGhlIGNvZGluZworc3R5bGUgZ3VpZGVsaW5lcy4gIFRoZSBwcmVzZW5jZSBvZiB0aGF0IGNvZGUgbGVhZHMgdG8gdHdvIGluZGVwZW5kZW50CitoYXphcmRzIGZvciBrZXJuZWwgZGV2ZWxvcGVycy4KKworVGhlIGZpcnN0IG9mIHRoZXNlIGlzIHRvIGJlbGlldmUgdGhhdCB0aGUga2VybmVsIGNvZGluZyBzdGFuZGFyZHMgZG8gbm90CittYXR0ZXIgYW5kIGFyZSBub3QgZW5mb3JjZWQuICBUaGUgdHJ1dGggb2YgdGhlIG1hdHRlciBpcyB0aGF0IGFkZGluZyBuZXcKK2NvZGUgdG8gdGhlIGtlcm5lbCBpcyB2ZXJ5IGRpZmZpY3VsdCBpZiB0aGF0IGNvZGUgaXMgbm90IGNvZGVkIGFjY29yZGluZyB0bwordGhlIHN0YW5kYXJkOyBtYW55IGRldmVsb3BlcnMgd2lsbCByZXF1ZXN0IHRoYXQgdGhlIGNvZGUgYmUgcmVmb3JtYXR0ZWQKK2JlZm9yZSB0aGV5IHdpbGwgZXZlbiByZXZpZXcgaXQuICBBIGNvZGUgYmFzZSBhcyBsYXJnZSBhcyB0aGUga2VybmVsCityZXF1aXJlcyBzb21lIHVuaWZvcm1pdHkgb2YgY29kZSB0byBtYWtlIGl0IHBvc3NpYmxlIGZvciBkZXZlbG9wZXJzIHRvCitxdWlja2x5IHVuZGVyc3RhbmQgYW55IHBhcnQgb2YgaXQuICBTbyB0aGVyZSBpcyBubyBsb25nZXIgcm9vbSBmb3IKK3N0cmFuZ2VseS1mb3JtYXR0ZWQgY29kZS4KKworT2NjYXNpb25hbGx5LCB0aGUga2VybmVsJ3MgY29kaW5nIHN0eWxlIHdpbGwgcnVuIGludG8gY29uZmxpY3Qgd2l0aCBhbgorZW1wbG95ZXIncyBtYW5kYXRlZCBzdHlsZS4gIEluIHN1Y2ggY2FzZXMsIHRoZSBrZXJuZWwncyBzdHlsZSB3aWxsIGhhdmUgdG8KK3dpbiBiZWZvcmUgdGhlIGNvZGUgY2FuIGJlIG1lcmdlZC4gIFB1dHRpbmcgY29kZSBpbnRvIHRoZSBrZXJuZWwgbWVhbnMKK2dpdmluZyB1cCBhIGRlZ3JlZSBvZiBjb250cm9sIGluIGEgbnVtYmVyIG9mIHdheXMgLSBpbmNsdWRpbmcgY29udHJvbCBvdmVyCitob3cgdGhlIGNvZGUgaXMgZm9ybWF0dGVkLgorCitUaGUgb3RoZXIgdHJhcCBpcyB0byBhc3N1bWUgdGhhdCBjb2RlIHdoaWNoIGlzIGFscmVhZHkgaW4gdGhlIGtlcm5lbCBpcwordXJnZW50bHkgaW4gbmVlZCBvZiBjb2Rpbmcgc3R5bGUgZml4ZXMuICBEZXZlbG9wZXJzIG1heSBzdGFydCB0byBnZW5lcmF0ZQorcmVmb3JtYXR0aW5nIHBhdGNoZXMgYXMgYSB3YXkgb2YgZ2FpbmluZyBmYW1pbGlhcml0eSB3aXRoIHRoZSBwcm9jZXNzLCBvcgorYXMgYSB3YXkgb2YgZ2V0dGluZyB0aGVpciBuYW1lIGludG8gdGhlIGtlcm5lbCBjaGFuZ2Vsb2dzIC0gb3IgYm90aC4gIEJ1dAorcHVyZSBjb2Rpbmcgc3R5bGUgZml4ZXMgYXJlIHNlZW4gYXMgbm9pc2UgYnkgdGhlIGRldmVsb3BtZW50IGNvbW11bml0eTsKK3RoZXkgdGVuZCB0byBnZXQgYSBjaGlsbHkgcmVjZXB0aW9uLiAgU28gdGhpcyB0eXBlIG9mIHBhdGNoIGlzIGJlc3QKK2F2b2lkZWQuICBJdCBpcyBuYXR1cmFsIHRvIGZpeCB0aGUgc3R5bGUgb2YgYSBwaWVjZSBvZiBjb2RlIHdoaWxlIHdvcmtpbmcKK29uIGl0IGZvciBvdGhlciByZWFzb25zLCBidXQgY29kaW5nIHN0eWxlIGNoYW5nZXMgc2hvdWxkIG5vdCBiZSBtYWRlIGZvcgordGhlaXIgb3duIHNha2UuCisKK1RoZSBjb2Rpbmcgc3R5bGUgZG9jdW1lbnQgYWxzbyBzaG91bGQgbm90IGJlIHJlYWQgYXMgYW4gYWJzb2x1dGUgbGF3IHdoaWNoCitjYW4gbmV2ZXIgYmUgdHJhbnNncmVzc2VkLiAgSWYgdGhlcmUgaXMgYSBnb29kIHJlYXNvbiB0byBnbyBhZ2FpbnN0IHRoZQorc3R5bGUgKGEgbGluZSB3aGljaCBiZWNvbWVzIGZhciBsZXNzIHJlYWRhYmxlIGlmIHNwbGl0IHRvIGZpdCB3aXRoaW4gdGhlCis4MC1jb2x1bW4gbGltaXQsIGZvciBleGFtcGxlKSwganVzdCBkbyBpdC4KKworCitBYnN0cmFjdGlvbiBsYXllcnMKKyoqKioqKioqKioqKioqKioqKgorCitDb21wdXRlciBTY2llbmNlIHByb2Zlc3NvcnMgdGVhY2ggc3R1ZGVudHMgdG8gbWFrZSBleHRlbnNpdmUgdXNlIG9mCithYnN0cmFjdGlvbiBsYXllcnMgaW4gdGhlIG5hbWUgb2YgZmxleGliaWxpdHkgYW5kIGluZm9ybWF0aW9uIGhpZGluZy4KK0NlcnRhaW5seSB0aGUga2VybmVsIG1ha2VzIGV4dGVuc2l2ZSB1c2Ugb2YgYWJzdHJhY3Rpb247IG5vIHByb2plY3QKK2ludm9sdmluZyBzZXZlcmFsIG1pbGxpb24gbGluZXMgb2YgY29kZSBjb3VsZCBkbyBvdGhlcndpc2UgYW5kIHN1cnZpdmUuCitCdXQgZXhwZXJpZW5jZSBoYXMgc2hvd24gdGhhdCBleGNlc3NpdmUgb3IgcHJlbWF0dXJlIGFic3RyYWN0aW9uIGNhbiBiZQoranVzdCBhcyBoYXJtZnVsIGFzIHByZW1hdHVyZSBvcHRpbWl6YXRpb24uICBBYnN0cmFjdGlvbiBzaG91bGQgYmUgdXNlZCB0bwordGhlIGxldmVsIHJlcXVpcmVkIGFuZCBubyBmdXJ0aGVyLgorCitBdCBhIHNpbXBsZSBsZXZlbCwgY29uc2lkZXIgYSBmdW5jdGlvbiB3aGljaCBoYXMgYW4gYXJndW1lbnQgd2hpY2ggaXMKK2Fsd2F5cyBwYXNzZWQgYXMgemVybyBieSBhbGwgY2FsbGVycy4gIE9uZSBjb3VsZCByZXRhaW4gdGhhdCBhcmd1bWVudCBqdXN0CitpbiBjYXNlIHNvbWVib2R5IGV2ZW50dWFsbHkgbmVlZHMgdG8gdXNlIHRoZSBleHRyYSBmbGV4aWJpbGl0eSB0aGF0IGl0Citwcm92aWRlcy4gIEJ5IHRoYXQgdGltZSwgdGhvdWdoLCBjaGFuY2VzIGFyZSBnb29kIHRoYXQgdGhlIGNvZGUgd2hpY2gKK2ltcGxlbWVudHMgdGhpcyBleHRyYSBhcmd1bWVudCBoYXMgYmVlbiBicm9rZW4gaW4gc29tZSBzdWJ0bGUgd2F5IHdoaWNoIHdhcworbmV2ZXIgbm90aWNlZCAtIGJlY2F1c2UgaXQgaGFzIG5ldmVyIGJlZW4gdXNlZC4gIE9yLCB3aGVuIHRoZSBuZWVkIGZvcgorZXh0cmEgZmxleGliaWxpdHkgYXJpc2VzLCBpdCBkb2VzIG5vdCBkbyBzbyBpbiBhIHdheSB3aGljaCBtYXRjaGVzIHRoZQorcHJvZ3JhbW1lcidzIGVhcmx5IGV4cGVjdGF0aW9uLiAgS2VybmVsIGRldmVsb3BlcnMgd2lsbCByb3V0aW5lbHkgc3VibWl0CitwYXRjaGVzIHRvIHJlbW92ZSB1bnVzZWQgYXJndW1lbnRzOyB0aGV5IHNob3VsZCwgaW4gZ2VuZXJhbCwgbm90IGJlIGFkZGVkCitpbiB0aGUgZmlyc3QgcGxhY2UuCisKK0Fic3RyYWN0aW9uIGxheWVycyB3aGljaCBoaWRlIGFjY2VzcyB0byBoYXJkd2FyZSAtIG9mdGVuIHRvIGFsbG93IHRoZSBidWxrCitvZiBhIGRyaXZlciB0byBiZSB1c2VkIHdpdGggbXVsdGlwbGUgb3BlcmF0aW5nIHN5c3RlbXMgLSBhcmUgZXNwZWNpYWxseQorZnJvd25lZCB1cG9uLiAgU3VjaCBsYXllcnMgb2JzY3VyZSB0aGUgY29kZSBhbmQgbWF5IGltcG9zZSBhIHBlcmZvcm1hbmNlCitwZW5hbHR5OyB0aGV5IGRvIG5vdCBiZWxvbmcgaW4gdGhlIExpbnV4IGtlcm5lbC4KKworT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdSBmaW5kIHlvdXJzZWxmIGNvcHlpbmcgc2lnbmlmaWNhbnQgYW1vdW50cyBvZiBjb2RlCitmcm9tIGFub3RoZXIga2VybmVsIHN1YnN5c3RlbSwgaXQgaXMgdGltZSB0byBhc2sgd2hldGhlciBpdCB3b3VsZCwgaW4gZmFjdCwKK21ha2Ugc2Vuc2UgdG8gcHVsbCBvdXQgc29tZSBvZiB0aGF0IGNvZGUgaW50byBhIHNlcGFyYXRlIGxpYnJhcnkgb3IgdG8KK2ltcGxlbWVudCB0aGF0IGZ1bmN0aW9uYWxpdHkgYXQgYSBoaWdoZXIgbGV2ZWwuICBUaGVyZSBpcyBubyB2YWx1ZSBpbgorcmVwbGljYXRpbmcgdGhlIHNhbWUgY29kZSB0aHJvdWdob3V0IHRoZSBrZXJuZWwuCisKKworI2lmZGVmIGFuZCBwcmVwcm9jZXNzb3IgdXNlIGluIGdlbmVyYWwKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK1RoZSBDIHByZXByb2Nlc3NvciBzZWVtcyB0byBwcmVzZW50IGEgcG93ZXJmdWwgdGVtcHRhdGlvbiB0byBzb21lIEMKK3Byb2dyYW1tZXJzLCB3aG8gc2VlIGl0IGFzIGEgd2F5IHRvIGVmZmljaWVudGx5IGVuY29kZSBhIGdyZWF0IGRlYWwgb2YKK2ZsZXhpYmlsaXR5IGludG8gYSBzb3VyY2UgZmlsZS4gIEJ1dCB0aGUgcHJlcHJvY2Vzc29yIGlzIG5vdCBDLCBhbmQgaGVhdnkKK3VzZSBvZiBpdCByZXN1bHRzIGluIGNvZGUgd2hpY2ggaXMgbXVjaCBoYXJkZXIgZm9yIG90aGVycyB0byByZWFkIGFuZAoraGFyZGVyIGZvciB0aGUgY29tcGlsZXIgdG8gY2hlY2sgZm9yIGNvcnJlY3RuZXNzLiAgSGVhdnkgcHJlcHJvY2Vzc29yIHVzZQoraXMgYWxtb3N0IGFsd2F5cyBhIHNpZ24gb2YgY29kZSB3aGljaCBuZWVkcyBzb21lIGNsZWFudXAgd29yay4KKworQ29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2l0aCAjaWZkZWYgaXMsIGluZGVlZCwgYSBwb3dlcmZ1bCBmZWF0dXJlLCBhbmQgaXQKK2lzIHVzZWQgd2l0aGluIHRoZSBrZXJuZWwuICBCdXQgdGhlcmUgaXMgbGl0dGxlIGRlc2lyZSB0byBzZWUgY29kZSB3aGljaCBpcworc3ByaW5rbGVkIGxpYmVyYWxseSB3aXRoICNpZmRlZiBibG9ja3MuICBBcyBhIGdlbmVyYWwgcnVsZSwgI2lmZGVmIHVzZQorc2hvdWxkIGJlIGNvbmZpbmVkIHRvIGhlYWRlciBmaWxlcyB3aGVuZXZlciBwb3NzaWJsZS4KK0NvbmRpdGlvbmFsbHktY29tcGlsZWQgY29kZSBjYW4gYmUgY29uZmluZWQgdG8gZnVuY3Rpb25zIHdoaWNoLCBpZiB0aGUgY29kZQoraXMgbm90IHRvIGJlIHByZXNlbnQsIHNpbXBseSBiZWNvbWUgZW1wdHkuICBUaGUgY29tcGlsZXIgd2lsbCB0aGVuIHF1aWV0bHkKK29wdGltaXplIG91dCB0aGUgY2FsbCB0byB0aGUgZW1wdHkgZnVuY3Rpb24uICBUaGUgcmVzdWx0IGlzIGZhciBjbGVhbmVyCitjb2RlIHdoaWNoIGlzIGVhc2llciB0byBmb2xsb3cuCisKK0MgcHJlcHJvY2Vzc29yIG1hY3JvcyBwcmVzZW50IGEgbnVtYmVyIG9mIGhhemFyZHMsIGluY2x1ZGluZyBwb3NzaWJsZQorbXVsdGlwbGUgZXZhbHVhdGlvbiBvZiBleHByZXNzaW9ucyB3aXRoIHNpZGUgZWZmZWN0cyBhbmQgbm8gdHlwZSBzYWZldHkuCitJZiB5b3UgYXJlIHRlbXB0ZWQgdG8gZGVmaW5lIGEgbWFjcm8sIGNvbnNpZGVyIGNyZWF0aW5nIGFuIGlubGluZSBmdW5jdGlvbgoraW5zdGVhZC4gIFRoZSBjb2RlIHdoaWNoIHJlc3VsdHMgd2lsbCBiZSB0aGUgc2FtZSwgYnV0IGlubGluZSBmdW5jdGlvbnMgYXJlCitlYXNpZXIgdG8gcmVhZCwgZG8gbm90IGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50cyBtdWx0aXBsZSB0aW1lcywgYW5kIGFsbG93Cit0aGUgY29tcGlsZXIgdG8gcGVyZm9ybSB0eXBlIGNoZWNraW5nIG9uIHRoZSBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZS4KKworCitJbmxpbmUgZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqCisKK0lubGluZSBmdW5jdGlvbnMgcHJlc2VudCBhIGhhemFyZCBvZiB0aGVpciBvd24sIHRob3VnaC4gIFByb2dyYW1tZXJzIGNhbgorYmVjb21lIGVuYW1vcmVkIG9mIHRoZSBwZXJjZWl2ZWQgZWZmaWNpZW5jeSBpbmhlcmVudCBpbiBhdm9pZGluZyBhIGZ1bmN0aW9uCitjYWxsIGFuZCBmaWxsIGEgc291cmNlIGZpbGUgd2l0aCBpbmxpbmUgZnVuY3Rpb25zLiAgVGhvc2UgZnVuY3Rpb25zLAoraG93ZXZlciwgY2FuIGFjdHVhbGx5IHJlZHVjZSBwZXJmb3JtYW5jZS4gIFNpbmNlIHRoZWlyIGNvZGUgaXMgcmVwbGljYXRlZAorYXQgZWFjaCBjYWxsIHNpdGUsIHRoZXkgZW5kIHVwIGJsb2F0aW5nIHRoZSBzaXplIG9mIHRoZSBjb21waWxlZCBrZXJuZWwuCitUaGF0LCBpbiB0dXJuLCBjcmVhdGVzIHByZXNzdXJlIG9uIHRoZSBwcm9jZXNzb3IncyBtZW1vcnkgY2FjaGVzLCB3aGljaCBjYW4KK3Nsb3cgZXhlY3V0aW9uIGRyYW1hdGljYWxseS4gIElubGluZSBmdW5jdGlvbnMsIGFzIGEgcnVsZSwgc2hvdWxkIGJlIHF1aXRlCitzbWFsbCBhbmQgcmVsYXRpdmVseSByYXJlLiAgVGhlIGNvc3Qgb2YgYSBmdW5jdGlvbiBjYWxsLCBhZnRlciBhbGwsIGlzIG5vdAordGhhdCBoaWdoOyB0aGUgY3JlYXRpb24gb2YgbGFyZ2UgbnVtYmVycyBvZiBpbmxpbmUgZnVuY3Rpb25zIGlzIGEgY2xhc3NpYworZXhhbXBsZSBvZiBwcmVtYXR1cmUgb3B0aW1pemF0aW9uLgorCitJbiBnZW5lcmFsLCBrZXJuZWwgcHJvZ3JhbW1lcnMgaWdub3JlIGNhY2hlIGVmZmVjdHMgYXQgdGhlaXIgcGVyaWwuICBUaGUKK2NsYXNzaWMgdGltZS9zcGFjZSB0cmFkZW9mZiB0YXVnaHQgaW4gYmVnaW5uaW5nIGRhdGEgc3RydWN0dXJlcyBjbGFzc2VzCitvZnRlbiBkb2VzIG5vdCBhcHBseSB0byBjb250ZW1wb3JhcnkgaGFyZHdhcmUuICBTcGFjZSAqaXMqIHRpbWUsIGluIHRoYXQgYQorbGFyZ2VyIHByb2dyYW0gd2lsbCBydW4gc2xvd2VyIHRoYW4gb25lIHdoaWNoIGlzIG1vcmUgY29tcGFjdC4KKworTW9yZSByZWNlbnQgY29tcGlsZXJzIHRha2UgYW4gaW5jcmVhc2luZ2x5IGFjdGl2ZSByb2xlIGluIGRlY2lkaW5nIHdoZXRoZXIKK2EgZ2l2ZW4gZnVuY3Rpb24gc2hvdWxkIGFjdHVhbGx5IGJlIGlubGluZWQgb3Igbm90LiAgU28gdGhlIGxpYmVyYWwKK3BsYWNlbWVudCBvZiAiaW5saW5lIiBrZXl3b3JkcyBtYXkgbm90IGp1c3QgYmUgZXhjZXNzaXZlOyBpdCBjb3VsZCBhbHNvIGJlCitpcnJlbGV2YW50LgorCisKK0xvY2tpbmcKKyoqKioqKioKKworSW4gTWF5LCAyMDA2LCB0aGUgIkRldmljZXNjYXBlIiBuZXR3b3JraW5nIHN0YWNrIHdhcywgd2l0aCBncmVhdAorZmFuZmFyZSwgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCBhbmQgbWFkZSBhdmFpbGFibGUgZm9yIGluY2x1c2lvbiBpbiB0aGUKK21haW5saW5lIGtlcm5lbC4gIFRoaXMgZG9uYXRpb24gd2FzIHdlbGNvbWUgbmV3czsgc3VwcG9ydCBmb3Igd2lyZWxlc3MKK25ldHdvcmtpbmcgaW4gTGludXggd2FzIGNvbnNpZGVyZWQgc3Vic3RhbmRhcmQgYXQgYmVzdCwgYW5kIHRoZSBEZXZpY2VzY2FwZQorc3RhY2sgb2ZmZXJlZCB0aGUgcHJvbWlzZSBvZiBmaXhpbmcgdGhhdCBzaXR1YXRpb24uICBZZXQsIHRoaXMgY29kZSBkaWQgbm90CithY3R1YWxseSBtYWtlIGl0IGludG8gdGhlIG1haW5saW5lIHVudGlsIEp1bmUsIDIwMDcgKDIuNi4yMikuICBXaGF0CitoYXBwZW5lZD8KKworVGhpcyBjb2RlIHNob3dlZCBhIG51bWJlciBvZiBzaWducyBvZiBoYXZpbmcgYmVlbiBkZXZlbG9wZWQgYmVoaW5kCitjb3Jwb3JhdGUgZG9vcnMuICBCdXQgb25lIGxhcmdlIHByb2JsZW0gaW4gcGFydGljdWxhciB3YXMgdGhhdCBpdCB3YXMgbm90CitkZXNpZ25lZCB0byB3b3JrIG9uIG11bHRpcHJvY2Vzc29yIHN5c3RlbXMuICBCZWZvcmUgdGhpcyBuZXR3b3JraW5nIHN0YWNrCisobm93IGNhbGxlZCBtYWM4MDIxMSkgY291bGQgYmUgbWVyZ2VkLCBhIGxvY2tpbmcgc2NoZW1lIG5lZWRlZCB0byBiZQorcmV0cm9maXR0ZWQgb250byBpdC4KKworT25jZSB1cG9uIGEgdGltZSwgTGludXgga2VybmVsIGNvZGUgY291bGQgYmUgZGV2ZWxvcGVkIHdpdGhvdXQgdGhpbmtpbmcKK2Fib3V0IHRoZSBjb25jdXJyZW5jeSBpc3N1ZXMgcHJlc2VudGVkIGJ5IG11bHRpcHJvY2Vzc29yIHN5c3RlbXMuICBOb3csCitob3dldmVyLCB0aGlzIGRvY3VtZW50IGlzIGJlaW5nIHdyaXR0ZW4gb24gYSBkdWFsLWNvcmUgbGFwdG9wLiAgRXZlbiBvbgorc2luZ2xlLXByb2Nlc3NvciBzeXN0ZW1zLCB3b3JrIGJlaW5nIGRvbmUgdG8gaW1wcm92ZSByZXNwb25zaXZlbmVzcyB3aWxsCityYWlzZSB0aGUgbGV2ZWwgb2YgY29uY3VycmVuY3kgd2l0aGluIHRoZSBrZXJuZWwuICBUaGUgZGF5cyB3aGVuIGtlcm5lbAorY29kZSBjb3VsZCBiZSB3cml0dGVuIHdpdGhvdXQgdGhpbmtpbmcgYWJvdXQgbG9ja2luZyBhcmUgbG9uZyBwYXN0LgorCitBbnkgcmVzb3VyY2UgKGRhdGEgc3RydWN0dXJlcywgaGFyZHdhcmUgcmVnaXN0ZXJzLCBldGMuKSB3aGljaCBjb3VsZCBiZQorYWNjZXNzZWQgY29uY3VycmVudGx5IGJ5IG1vcmUgdGhhbiBvbmUgdGhyZWFkIG11c3QgYmUgcHJvdGVjdGVkIGJ5IGEgbG9jay4KK05ldyBjb2RlIHNob3VsZCBiZSB3cml0dGVuIHdpdGggdGhpcyByZXF1aXJlbWVudCBpbiBtaW5kOyByZXRyb2ZpdHRpbmcKK2xvY2tpbmcgYWZ0ZXIgdGhlIGZhY3QgaXMgYSByYXRoZXIgbW9yZSBkaWZmaWN1bHQgdGFzay4gIEtlcm5lbCBkZXZlbG9wZXJzCitzaG91bGQgdGFrZSB0aGUgdGltZSB0byB1bmRlcnN0YW5kIHRoZSBhdmFpbGFibGUgbG9ja2luZyBwcmltaXRpdmVzIHdlbGwKK2Vub3VnaCB0byBwaWNrIHRoZSByaWdodCB0b29sIGZvciB0aGUgam9iLiAgQ29kZSB3aGljaCBzaG93cyBhIGxhY2sgb2YKK2F0dGVudGlvbiB0byBjb25jdXJyZW5jeSB3aWxsIGhhdmUgYSBkaWZmaWN1bHQgcGF0aCBpbnRvIHRoZSBtYWlubGluZS4KKworCitSZWdyZXNzaW9ucworKioqKioqKioqKioKKworT25lIGZpbmFsIGhhemFyZCB3b3J0aCBtZW50aW9uaW5nIGlzIHRoaXM6IGl0IGNhbiBiZSB0ZW1wdGluZyB0byBtYWtlIGEKK2NoYW5nZSAod2hpY2ggbWF5IGJyaW5nIGJpZyBpbXByb3ZlbWVudHMpIHdoaWNoIGNhdXNlcyBzb21ldGhpbmcgdG8gYnJlYWsKK2ZvciBleGlzdGluZyB1c2Vycy4gIFRoaXMga2luZCBvZiBjaGFuZ2UgaXMgY2FsbGVkIGEgInJlZ3Jlc3Npb24sIiBhbmQKK3JlZ3Jlc3Npb25zIGhhdmUgYmVjb21lIG1vc3QgdW53ZWxjb21lIGluIHRoZSBtYWlubGluZSBrZXJuZWwuICBXaXRoIGZldworZXhjZXB0aW9ucywgY2hhbmdlcyB3aGljaCBjYXVzZSByZWdyZXNzaW9ucyB3aWxsIGJlIGJhY2tlZCBvdXQgaWYgdGhlCityZWdyZXNzaW9uIGNhbm5vdCBiZSBmaXhlZCBpbiBhIHRpbWVseSBtYW5uZXIuICBGYXIgYmV0dGVyIHRvIGF2b2lkIHRoZQorcmVncmVzc2lvbiBpbiB0aGUgZmlyc3QgcGxhY2UuCisKK0l0IGlzIG9mdGVuIGFyZ3VlZCB0aGF0IGEgcmVncmVzc2lvbiBjYW4gYmUganVzdGlmaWVkIGlmIGl0IGNhdXNlcyB0aGluZ3MKK3RvIHdvcmsgZm9yIG1vcmUgcGVvcGxlIHRoYW4gaXQgY3JlYXRlcyBwcm9ibGVtcyBmb3IuICBXaHkgbm90IG1ha2UgYQorY2hhbmdlIGlmIGl0IGJyaW5ncyBuZXcgZnVuY3Rpb25hbGl0eSB0byB0ZW4gc3lzdGVtcyBmb3IgZWFjaCBvbmUgaXQKK2JyZWFrcz8gIFRoZSBiZXN0IGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIHdhcyBleHByZXNzZWQgYnkgTGludXMgaW4gSnVseSwKKzIwMDc6CisKKzo6CisKKwlTbyB3ZSBkb24ndCBmaXggYnVncyBieSBpbnRyb2R1Y2luZyBuZXcgcHJvYmxlbXMuICBUaGF0IHdheSBsaWVzCisJbWFkbmVzcywgYW5kIG5vYm9keSBldmVyIGtub3dzIGlmIHlvdSBhY3R1YWxseSBtYWtlIGFueSByZWFsCisJcHJvZ3Jlc3MgYXQgYWxsLiBJcyBpdCB0d28gc3RlcHMgZm9yd2FyZHMsIG9uZSBzdGVwIGJhY2ssIG9yIG9uZQorCXN0ZXAgZm9yd2FyZCBhbmQgdHdvIHN0ZXBzIGJhY2s/CisKKyhodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yNDM0NjAvKS4KKworQW4gZXNwZWNpYWxseSB1bndlbGNvbWUgdHlwZSBvZiByZWdyZXNzaW9uIGlzIGFueSBzb3J0IG9mIGNoYW5nZSB0byB0aGUKK3VzZXItc3BhY2UgQUJJLiAgT25jZSBhbiBpbnRlcmZhY2UgaGFzIGJlZW4gZXhwb3J0ZWQgdG8gdXNlciBzcGFjZSwgaXQgbXVzdAorYmUgc3VwcG9ydGVkIGluZGVmaW5pdGVseS4gIFRoaXMgZmFjdCBtYWtlcyB0aGUgY3JlYXRpb24gb2YgdXNlci1zcGFjZQoraW50ZXJmYWNlcyBwYXJ0aWN1bGFybHkgY2hhbGxlbmdpbmc6IHNpbmNlIHRoZXkgY2Fubm90IGJlIGNoYW5nZWQgaW4KK2luY29tcGF0aWJsZSB3YXlzLCB0aGV5IG11c3QgYmUgZG9uZSByaWdodCB0aGUgZmlyc3QgdGltZS4gIEZvciB0aGlzCityZWFzb24sIGEgZ3JlYXQgZGVhbCBvZiB0aG91Z2h0LCBjbGVhciBkb2N1bWVudGF0aW9uLCBhbmQgd2lkZSByZXZpZXcgZm9yCit1c2VyLXNwYWNlIGludGVyZmFjZXMgaXMgYWx3YXlzIHJlcXVpcmVkLgorCisKK0NvZGUgY2hlY2tpbmcgdG9vbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworRm9yIG5vdywgYXQgbGVhc3QsIHRoZSB3cml0aW5nIG9mIGVycm9yLWZyZWUgY29kZSByZW1haW5zIGFuIGlkZWFsIHRoYXQgZmV3CitvZiB1cyBjYW4gcmVhY2guICBXaGF0IHdlIGNhbiBob3BlIHRvIGRvLCB0aG91Z2gsIGlzIHRvIGNhdGNoIGFuZCBmaXggYXMKK21hbnkgb2YgdGhvc2UgZXJyb3JzIGFzIHBvc3NpYmxlIGJlZm9yZSBvdXIgY29kZSBnb2VzIGludG8gdGhlIG1haW5saW5lCitrZXJuZWwuICBUbyB0aGF0IGVuZCwgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIGhhdmUgcHV0IHRvZ2V0aGVyIGFuIGltcHJlc3NpdmUKK2FycmF5IG9mIHRvb2xzIHdoaWNoIGNhbiBjYXRjaCBhIHdpZGUgdmFyaWV0eSBvZiBvYnNjdXJlIHByb2JsZW1zIGluIGFuCithdXRvbWF0ZWQgd2F5LiAgQW55IHByb2JsZW0gY2F1Z2h0IGJ5IHRoZSBjb21wdXRlciBpcyBhIHByb2JsZW0gd2hpY2ggd2lsbAorbm90IGFmZmxpY3QgYSB1c2VyIGxhdGVyIG9uLCBzbyBpdCBzdGFuZHMgdG8gcmVhc29uIHRoYXQgdGhlIGF1dG9tYXRlZAordG9vbHMgc2hvdWxkIGJlIHVzZWQgd2hlbmV2ZXIgcG9zc2libGUuCisKK1RoZSBmaXJzdCBzdGVwIGlzIHNpbXBseSB0byBoZWVkIHRoZSB3YXJuaW5ncyBwcm9kdWNlZCBieSB0aGUgY29tcGlsZXIuCitDb250ZW1wb3JhcnkgdmVyc2lvbnMgb2YgZ2NjIGNhbiBkZXRlY3QgKGFuZCB3YXJuIGFib3V0KSBhIGxhcmdlIG51bWJlciBvZgorcG90ZW50aWFsIGVycm9ycy4gIFF1aXRlIG9mdGVuLCB0aGVzZSB3YXJuaW5ncyBwb2ludCB0byByZWFsIHByb2JsZW1zLgorQ29kZSBzdWJtaXR0ZWQgZm9yIHJldmlldyBzaG91bGQsIGFzIGEgcnVsZSwgbm90IHByb2R1Y2UgYW55IGNvbXBpbGVyCit3YXJuaW5ncy4gIFdoZW4gc2lsZW5jaW5nIHdhcm5pbmdzLCB0YWtlIGNhcmUgdG8gdW5kZXJzdGFuZCB0aGUgcmVhbCBjYXVzZQorYW5kIHRyeSB0byBhdm9pZCAiZml4ZXMiIHdoaWNoIG1ha2UgdGhlIHdhcm5pbmcgZ28gYXdheSB3aXRob3V0IGFkZHJlc3NpbmcKK2l0cyBjYXVzZS4KKworTm90ZSB0aGF0IG5vdCBhbGwgY29tcGlsZXIgd2FybmluZ3MgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gIEJ1aWxkIHRoZQora2VybmVsIHdpdGggIm1ha2UgRVhUUkFfQ0ZMQUdTPS1XIiB0byBnZXQgdGhlIGZ1bGwgc2V0LgorCitUaGUga2VybmVsIHByb3ZpZGVzIHNldmVyYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIHdoaWNoIHR1cm4gb24gZGVidWdnaW5nCitmZWF0dXJlczsgbW9zdCBvZiB0aGVzZSBhcmUgZm91bmQgaW4gdGhlICJrZXJuZWwgaGFja2luZyIgc3VibWVudS4gIFNldmVyYWwKK29mIHRoZXNlIG9wdGlvbnMgc2hvdWxkIGJlIHR1cm5lZCBvbiBmb3IgYW55IGtlcm5lbCB1c2VkIGZvciBkZXZlbG9wbWVudCBvcgordGVzdGluZyBwdXJwb3Nlcy4gIEluIHBhcnRpY3VsYXIsIHlvdSBzaG91bGQgdHVybiBvbjoKKworIC0gRU5BQkxFX1dBUk5fREVQUkVDQVRFRCwgRU5BQkxFX01VU1RfQ0hFQ0ssIGFuZCBGUkFNRV9XQVJOIHRvIGdldCBhbgorICAgZXh0cmEgc2V0IG9mIHdhcm5pbmdzIGZvciBwcm9ibGVtcyBsaWtlIHRoZSB1c2Ugb2YgZGVwcmVjYXRlZCBpbnRlcmZhY2VzCisgICBvciBpZ25vcmluZyBhbiBpbXBvcnRhbnQgcmV0dXJuIHZhbHVlIGZyb20gYSBmdW5jdGlvbi4gIFRoZSBvdXRwdXQKKyAgIGdlbmVyYXRlZCBieSB0aGVzZSB3YXJuaW5ncyBjYW4gYmUgdmVyYm9zZSwgYnV0IG9uZSBuZWVkIG5vdCB3b3JyeSBhYm91dAorICAgd2FybmluZ3MgZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsLgorCisgLSBERUJVR19PQkpFQ1RTIHdpbGwgYWRkIGNvZGUgdG8gdHJhY2sgdGhlIGxpZmV0aW1lIG9mIHZhcmlvdXMgb2JqZWN0cworICAgY3JlYXRlZCBieSB0aGUga2VybmVsIGFuZCB3YXJuIHdoZW4gdGhpbmdzIGFyZSBkb25lIG91dCBvZiBvcmRlci4gIElmCisgICB5b3UgYXJlIGFkZGluZyBhIHN1YnN5c3RlbSB3aGljaCBjcmVhdGVzIChhbmQgZXhwb3J0cykgY29tcGxleCBvYmplY3RzCisgICBvZiBpdHMgb3duLCBjb25zaWRlciBhZGRpbmcgc3VwcG9ydCBmb3IgdGhlIG9iamVjdCBkZWJ1Z2dpbmcKKyAgIGluZnJhc3RydWN0dXJlLgorCisgLSBERUJVR19TTEFCIGNhbiBmaW5kIGEgdmFyaWV0eSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgdXNlIGVycm9yczsgaXQKKyAgIHNob3VsZCBiZSB1c2VkIG9uIG1vc3QgZGV2ZWxvcG1lbnQga2VybmVscy4KKworIC0gREVCVUdfU1BJTkxPQ0ssIERFQlVHX0FUT01JQ19TTEVFUCwgYW5kIERFQlVHX01VVEVYRVMgd2lsbCBmaW5kIGEKKyAgIG51bWJlciBvZiBjb21tb24gbG9ja2luZyBlcnJvcnMuCisKK1RoZXJlIGFyZSBxdWl0ZSBhIGZldyBvdGhlciBkZWJ1Z2dpbmcgb3B0aW9ucywgc29tZSBvZiB3aGljaCB3aWxsIGJlCitkaXNjdXNzZWQgYmVsb3cuICBTb21lIG9mIHRoZW0gaGF2ZSBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcGFjdCBhbmQKK3Nob3VsZCBub3QgYmUgdXNlZCBhbGwgb2YgdGhlIHRpbWUuICBCdXQgc29tZSB0aW1lIHNwZW50IGxlYXJuaW5nIHRoZQorYXZhaWxhYmxlIG9wdGlvbnMgd2lsbCBsaWtlbHkgYmUgcGFpZCBiYWNrIG1hbnkgdGltZXMgb3ZlciBpbiBzaG9ydCBvcmRlci4KKworT25lIG9mIHRoZSBoZWF2aWVyIGRlYnVnZ2luZyB0b29scyBpcyB0aGUgbG9ja2luZyBjaGVja2VyLCBvciAibG9ja2RlcC4iCitUaGlzIHRvb2wgd2lsbCB0cmFjayB0aGUgYWNxdWlzaXRpb24gYW5kIHJlbGVhc2Ugb2YgZXZlcnkgbG9jayAoc3BpbmxvY2sgb3IKK211dGV4KSBpbiB0aGUgc3lzdGVtLCB0aGUgb3JkZXIgaW4gd2hpY2ggbG9ja3MgYXJlIGFjcXVpcmVkIHJlbGF0aXZlIHRvCitlYWNoIG90aGVyLCB0aGUgY3VycmVudCBpbnRlcnJ1cHQgZW52aXJvbm1lbnQsIGFuZCBtb3JlLiAgSXQgY2FuIHRoZW4KK2Vuc3VyZSB0aGF0IGxvY2tzIGFyZSBhbHdheXMgYWNxdWlyZWQgaW4gdGhlIHNhbWUgb3JkZXIsIHRoYXQgdGhlIHNhbWUKK2ludGVycnVwdCBhc3N1bXB0aW9ucyBhcHBseSBpbiBhbGwgc2l0dWF0aW9ucywgYW5kIHNvIG9uLiAgSW4gb3RoZXIgd29yZHMsCitsb2NrZGVwIGNhbiBmaW5kIGEgbnVtYmVyIG9mIHNjZW5hcmlvcyBpbiB3aGljaCB0aGUgc3lzdGVtIGNvdWxkLCBvbiByYXJlCitvY2Nhc2lvbiwgZGVhZGxvY2suICBUaGlzIGtpbmQgb2YgcHJvYmxlbSBjYW4gYmUgcGFpbmZ1bCAoZm9yIGJvdGgKK2RldmVsb3BlcnMgYW5kIHVzZXJzKSBpbiBhIGRlcGxveWVkIHN5c3RlbTsgbG9ja2RlcCBhbGxvd3MgdGhlbSB0byBiZSBmb3VuZAoraW4gYW4gYXV0b21hdGVkIG1hbm5lciBhaGVhZCBvZiB0aW1lLiAgQ29kZSB3aXRoIGFueSBzb3J0IG9mIG5vbi10cml2aWFsCitsb2NraW5nIHNob3VsZCBiZSBydW4gd2l0aCBsb2NrZGVwIGVuYWJsZWQgYmVmb3JlIGJlaW5nIHN1Ym1pdHRlZCBmb3IKK2luY2x1c2lvbi4KKworQXMgYSBkaWxpZ2VudCBrZXJuZWwgcHJvZ3JhbW1lciwgeW91IHdpbGwsIGJleW9uZCBkb3VidCwgY2hlY2sgdGhlIHJldHVybgorc3RhdHVzIG9mIGFueSBvcGVyYXRpb24gKHN1Y2ggYXMgYSBtZW1vcnkgYWxsb2NhdGlvbikgd2hpY2ggY2FuIGZhaWwuICBUaGUKK2ZhY3Qgb2YgdGhlIG1hdHRlciwgdGhvdWdoLCBpcyB0aGF0IHRoZSByZXN1bHRpbmcgZmFpbHVyZSByZWNvdmVyeSBwYXRocworYXJlLCBwcm9iYWJseSwgY29tcGxldGVseSB1bnRlc3RlZC4gIFVudGVzdGVkIGNvZGUgdGVuZHMgdG8gYmUgYnJva2VuIGNvZGU7Cit5b3UgY291bGQgYmUgbXVjaCBtb3JlIGNvbmZpZGVudCBvZiB5b3VyIGNvZGUgaWYgYWxsIHRob3NlIGVycm9yLWhhbmRsaW5nCitwYXRocyBoYWQgYmVlbiBleGVyY2lzZWQgYSBmZXcgdGltZXMuCisKK1RoZSBrZXJuZWwgcHJvdmlkZXMgYSBmYXVsdCBpbmplY3Rpb24gZnJhbWV3b3JrIHdoaWNoIGNhbiBkbyBleGFjdGx5IHRoYXQsCitlc3BlY2lhbGx5IHdoZXJlIG1lbW9yeSBhbGxvY2F0aW9ucyBhcmUgaW52b2x2ZWQuICBXaXRoIGZhdWx0IGluamVjdGlvbgorZW5hYmxlZCwgYSBjb25maWd1cmFibGUgcGVyY2VudGFnZSBvZiBtZW1vcnkgYWxsb2NhdGlvbnMgd2lsbCBiZSBtYWRlIHRvCitmYWlsOyB0aGVzZSBmYWlsdXJlcyBjYW4gYmUgcmVzdHJpY3RlZCB0byBhIHNwZWNpZmljIHJhbmdlIG9mIGNvZGUuCitSdW5uaW5nIHdpdGggZmF1bHQgaW5qZWN0aW9uIGVuYWJsZWQgYWxsb3dzIHRoZSBwcm9ncmFtbWVyIHRvIHNlZSBob3cgdGhlCitjb2RlIHJlc3BvbmRzIHdoZW4gdGhpbmdzIGdvIGJhZGx5LiAgU2VlCitEb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYXVsdC1pbmplY3Rpb24udHh0IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCitob3cgdG8gdXNlIHRoaXMgZmFjaWxpdHkuCisKK090aGVyIGtpbmRzIG9mIGVycm9ycyBjYW4gYmUgZm91bmQgd2l0aCB0aGUgInNwYXJzZSIgc3RhdGljIGFuYWx5c2lzIHRvb2wuCitXaXRoIHNwYXJzZSwgdGhlIHByb2dyYW1tZXIgY2FuIGJlIHdhcm5lZCBhYm91dCBjb25mdXNpb24gYmV0d2VlbgordXNlci1zcGFjZSBhbmQga2VybmVsLXNwYWNlIGFkZHJlc3NlcywgbWl4dHVyZSBvZiBiaWctZW5kaWFuIGFuZAorc21hbGwtZW5kaWFuIHF1YW50aXRpZXMsIHRoZSBwYXNzaW5nIG9mIGludGVnZXIgdmFsdWVzIHdoZXJlIGEgc2V0IG9mIGJpdAorZmxhZ3MgaXMgZXhwZWN0ZWQsIGFuZCBzbyBvbi4gIFNwYXJzZSBtdXN0IGJlIGluc3RhbGxlZCBzZXBhcmF0ZWx5IChpdCBjYW4KK2JlIGZvdW5kIGF0IGh0dHBzOi8vc3BhcnNlLndpa2kua2VybmVsLm9yZy9pbmRleC5waHAvTWFpbl9QYWdlIGlmIHlvdXIKK2Rpc3RyaWJ1dG9yIGRvZXMgbm90IHBhY2thZ2UgaXQpOyBpdCBjYW4gdGhlbiBiZSBydW4gb24gdGhlIGNvZGUgYnkgYWRkaW5nCisiQz0xIiB0byB5b3VyIG1ha2UgY29tbWFuZC4KKworVGhlICJDb2NjaW5lbGxlIiB0b29sIChodHRwOi8vY29jY2luZWxsZS5saXA2LmZyLykgaXMgYWJsZSB0byBmaW5kIGEgd2lkZQordmFyaWV0eSBvZiBwb3RlbnRpYWwgY29kaW5nIHByb2JsZW1zOyBpdCBjYW4gYWxzbyBwcm9wb3NlIGZpeGVzIGZvciB0aG9zZQorcHJvYmxlbXMuICBRdWl0ZSBhIGZldyAic2VtYW50aWMgcGF0Y2hlcyIgZm9yIHRoZSBrZXJuZWwgaGF2ZSBiZWVuIHBhY2thZ2VkCit1bmRlciB0aGUgc2NyaXB0cy9jb2NjaW5lbGxlIGRpcmVjdG9yeTsgcnVubmluZyAibWFrZSBjb2NjaWNoZWNrIiB3aWxsIHJ1bgordGhyb3VnaCB0aG9zZSBzZW1hbnRpYyBwYXRjaGVzIGFuZCByZXBvcnQgb24gYW55IHByb2JsZW1zIGZvdW5kLiAgU2VlCitEb2N1bWVudGF0aW9uL2NvY2NpbmVsbGUudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitPdGhlciBraW5kcyBvZiBwb3J0YWJpbGl0eSBlcnJvcnMgYXJlIGJlc3QgZm91bmQgYnkgY29tcGlsaW5nIHlvdXIgY29kZSBmb3IKK290aGVyIGFyY2hpdGVjdHVyZXMuICBJZiB5b3UgZG8gbm90IGhhcHBlbiB0byBoYXZlIGFuIFMvMzkwIHN5c3RlbSBvciBhCitCbGFja2ZpbiBkZXZlbG9wbWVudCBib2FyZCBoYW5keSwgeW91IGNhbiBzdGlsbCBwZXJmb3JtIHRoZSBjb21waWxhdGlvbgorc3RlcC4gIEEgbGFyZ2Ugc2V0IG9mIGNyb3NzIGNvbXBpbGVycyBmb3IgeDg2IHN5c3RlbXMgY2FuIGJlIGZvdW5kIGF0CisKKwlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3Rvb2xzL2Nyb3NzdG9vbC8KKworU29tZSB0aW1lIHNwZW50IGluc3RhbGxpbmcgYW5kIHVzaW5nIHRoZXNlIGNvbXBpbGVycyB3aWxsIGhlbHAgYXZvaWQKK2VtYmFycmFzc21lbnQgbGF0ZXIuCisKKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLQorCitEb2N1bWVudGF0aW9uIGhhcyBvZnRlbiBiZWVuIG1vcmUgdGhlIGV4Y2VwdGlvbiB0aGFuIHRoZSBydWxlIHdpdGgga2VybmVsCitkZXZlbG9wbWVudC4gIEV2ZW4gc28sIGFkZXF1YXRlIGRvY3VtZW50YXRpb24gd2lsbCBoZWxwIHRvIGVhc2UgdGhlIG1lcmdpbmcKK29mIG5ldyBjb2RlIGludG8gdGhlIGtlcm5lbCwgbWFrZSBsaWZlIGVhc2llciBmb3Igb3RoZXIgZGV2ZWxvcGVycywgYW5kCit3aWxsIGJlIGhlbHBmdWwgZm9yIHlvdXIgdXNlcnMuICBJbiBtYW55IGNhc2VzLCB0aGUgYWRkaXRpb24gb2YKK2RvY3VtZW50YXRpb24gaGFzIGJlY29tZSBlc3NlbnRpYWxseSBtYW5kYXRvcnkuCisKK1RoZSBmaXJzdCBwaWVjZSBvZiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcGF0Y2ggaXMgaXRzIGFzc29jaWF0ZWQKK2NoYW5nZWxvZy4gIExvZyBlbnRyaWVzIHNob3VsZCBkZXNjcmliZSB0aGUgcHJvYmxlbSBiZWluZyBzb2x2ZWQsIHRoZSBmb3JtCitvZiB0aGUgc29sdXRpb24sIHRoZSBwZW9wbGUgd2hvIHdvcmtlZCBvbiB0aGUgcGF0Y2gsIGFueSByZWxldmFudAorZWZmZWN0cyBvbiBwZXJmb3JtYW5jZSwgYW5kIGFueXRoaW5nIGVsc2UgdGhhdCBtaWdodCBiZSBuZWVkZWQgdG8KK3VuZGVyc3RhbmQgdGhlIHBhdGNoLiAgQmUgc3VyZSB0aGF0IHRoZSBjaGFuZ2Vsb2cgc2F5cyAqd2h5KiB0aGUgcGF0Y2ggaXMKK3dvcnRoIGFwcGx5aW5nOyBhIHN1cnByaXNpbmcgbnVtYmVyIG9mIGRldmVsb3BlcnMgZmFpbCB0byBwcm92aWRlIHRoYXQKK2luZm9ybWF0aW9uLgorCitBbnkgY29kZSB3aGljaCBhZGRzIGEgbmV3IHVzZXItc3BhY2UgaW50ZXJmYWNlIC0gaW5jbHVkaW5nIG5ldyBzeXNmcyBvcgorL3Byb2MgZmlsZXMgLSBzaG91bGQgaW5jbHVkZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgaW50ZXJmYWNlIHdoaWNoIGVuYWJsZXMKK3VzZXItc3BhY2UgZGV2ZWxvcGVycyB0byBrbm93IHdoYXQgdGhleSBhcmUgd29ya2luZyB3aXRoLiAgU2VlCitEb2N1bWVudGF0aW9uL0FCSS9SRUFETUUgZm9yIGEgZGVzY3JpcHRpb24gb2YgaG93IHRoaXMgZG9jdW1lbnRhdGlvbiBzaG91bGQKK2JlIGZvcm1hdHRlZCBhbmQgd2hhdCBpbmZvcm1hdGlvbiBuZWVkcyB0byBiZSBwcm92aWRlZC4KKworVGhlIGZpbGUgRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgZGVzY3JpYmVzIGFsbCBvZiB0aGUga2VybmVsJ3MKK2Jvb3QtdGltZSBwYXJhbWV0ZXJzLiAgQW55IHBhdGNoIHdoaWNoIGFkZHMgbmV3IHBhcmFtZXRlcnMgc2hvdWxkIGFkZCB0aGUKK2FwcHJvcHJpYXRlIGVudHJpZXMgdG8gdGhpcyBmaWxlLgorCitBbnkgbmV3IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGhlbHAgdGV4dCB3aGljaAorY2xlYXJseSBleHBsYWlucyB0aGUgb3B0aW9ucyBhbmQgd2hlbiB0aGUgdXNlciBtaWdodCB3YW50IHRvIHNlbGVjdCB0aGVtLgorCitJbnRlcm5hbCBBUEkgaW5mb3JtYXRpb24gZm9yIG1hbnkgc3Vic3lzdGVtcyBpcyBkb2N1bWVudGVkIGJ5IHdheSBvZgorc3BlY2lhbGx5LWZvcm1hdHRlZCBjb21tZW50czsgdGhlc2UgY29tbWVudHMgY2FuIGJlIGV4dHJhY3RlZCBhbmQgZm9ybWF0dGVkCitpbiBhIG51bWJlciBvZiB3YXlzIGJ5IHRoZSAia2VybmVsLWRvYyIgc2NyaXB0LiAgSWYgeW91IGFyZSB3b3JraW5nIHdpdGhpbgorYSBzdWJzeXN0ZW0gd2hpY2ggaGFzIGtlcm5lbGRvYyBjb21tZW50cywgeW91IHNob3VsZCBtYWludGFpbiB0aGVtIGFuZCBhZGQKK3RoZW0sIGFzIGFwcHJvcHJpYXRlLCBmb3IgZXh0ZXJuYWxseS1hdmFpbGFibGUgZnVuY3Rpb25zLiAgRXZlbiBpbiBhcmVhcword2hpY2ggaGF2ZSBub3QgYmVlbiBzbyBkb2N1bWVudGVkLCB0aGVyZSBpcyBubyBoYXJtIGluIGFkZGluZyBrZXJuZWxkb2MKK2NvbW1lbnRzIGZvciB0aGUgZnV0dXJlOyBpbmRlZWQsIHRoaXMgY2FuIGJlIGEgdXNlZnVsIGFjdGl2aXR5IGZvcgorYmVnaW5uaW5nIGtlcm5lbCBkZXZlbG9wZXJzLiAgVGhlIGZvcm1hdCBvZiB0aGVzZSBjb21tZW50cywgYWxvbmcgd2l0aCBzb21lCitpbmZvcm1hdGlvbiBvbiBob3cgdG8gY3JlYXRlIGtlcm5lbGRvYyB0ZW1wbGF0ZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBmaWxlCitEb2N1bWVudGF0aW9uL2tlcm5lbC1kb2N1bWVudGF0aW9uLnJzdC4KKworQW55Ym9keSB3aG8gcmVhZHMgdGhyb3VnaCBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBleGlzdGluZyBrZXJuZWwgY29kZSB3aWxsCitub3RlIHRoYXQsIG9mdGVuLCBjb21tZW50cyBhcmUgbW9zdCBub3RhYmxlIGJ5IHRoZWlyIGFic2VuY2UuICBPbmNlIGFnYWluLAordGhlIGV4cGVjdGF0aW9ucyBmb3IgbmV3IGNvZGUgYXJlIGhpZ2hlciB0aGFuIHRoZXkgd2VyZSBpbiB0aGUgcGFzdDsKK21lcmdpbmcgdW5jb21tZW50ZWQgY29kZSB3aWxsIGJlIGhhcmRlci4gIFRoYXQgc2FpZCwgdGhlcmUgaXMgbGl0dGxlIGRlc2lyZQorZm9yIHZlcmJvc2VseS1jb21tZW50ZWQgY29kZS4gIFRoZSBjb2RlIHNob3VsZCwgaXRzZWxmLCBiZSByZWFkYWJsZSwgd2l0aAorY29tbWVudHMgZXhwbGFpbmluZyB0aGUgbW9yZSBzdWJ0bGUgYXNwZWN0cy4KKworQ2VydGFpbiB0aGluZ3Mgc2hvdWxkIGFsd2F5cyBiZSBjb21tZW50ZWQuICBVc2VzIG9mIG1lbW9yeSBiYXJyaWVycyBzaG91bGQKK2JlIGFjY29tcGFuaWVkIGJ5IGEgbGluZSBleHBsYWluaW5nIHdoeSB0aGUgYmFycmllciBpcyBuZWNlc3NhcnkuICBUaGUKK2xvY2tpbmcgcnVsZXMgZm9yIGRhdGEgc3RydWN0dXJlcyBnZW5lcmFsbHkgbmVlZCB0byBiZSBleHBsYWluZWQgc29tZXdoZXJlLgorTWFqb3IgZGF0YSBzdHJ1Y3R1cmVzIG5lZWQgY29tcHJlaGVuc2l2ZSBkb2N1bWVudGF0aW9uIGluIGdlbmVyYWwuCitOb24tb2J2aW91cyBkZXBlbmRlbmNpZXMgYmV0d2VlbiBzZXBhcmF0ZSBiaXRzIG9mIGNvZGUgc2hvdWxkIGJlIHBvaW50ZWQKK291dC4gIEFueXRoaW5nIHdoaWNoIG1pZ2h0IHRlbXB0IGEgY29kZSBqYW5pdG9yIHRvIG1ha2UgYW4gaW5jb3JyZWN0CisiY2xlYW51cCIgbmVlZHMgYSBjb21tZW50IHNheWluZyB3aHkgaXQgaXMgZG9uZSB0aGUgd2F5IGl0IGlzLiAgQW5kIHNvIG9uLgorCisKK0ludGVybmFsIEFQSSBjaGFuZ2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgYmluYXJ5IGludGVyZmFjZSBwcm92aWRlZCBieSB0aGUga2VybmVsIHRvIHVzZXIgc3BhY2UgY2Fubm90IGJlIGJyb2tlbgorZXhjZXB0IHVuZGVyIHRoZSBtb3N0IHNldmVyZSBjaXJjdW1zdGFuY2VzLiAgVGhlIGtlcm5lbCdzIGludGVybmFsCitwcm9ncmFtbWluZyBpbnRlcmZhY2VzLCBpbnN0ZWFkLCBhcmUgaGlnaGx5IGZsdWlkIGFuZCBjYW4gYmUgY2hhbmdlZCB3aGVuCit0aGUgbmVlZCBhcmlzZXMuICBJZiB5b3UgZmluZCB5b3Vyc2VsZiBoYXZpbmcgdG8gd29yayBhcm91bmQgYSBrZXJuZWwgQVBJLAorb3Igc2ltcGx5IG5vdCB1c2luZyBhIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgYmVjYXVzZSBpdCBkb2VzIG5vdCBtZWV0IHlvdXIKK25lZWRzLCB0aGF0IG1heSBiZSBhIHNpZ24gdGhhdCB0aGUgQVBJIG5lZWRzIHRvIGNoYW5nZS4gIEFzIGEga2VybmVsCitkZXZlbG9wZXIsIHlvdSBhcmUgZW1wb3dlcmVkIHRvIG1ha2Ugc3VjaCBjaGFuZ2VzLgorCitUaGVyZSBhcmUsIG9mIGNvdXJzZSwgc29tZSBjYXRjaGVzLiAgQVBJIGNoYW5nZXMgY2FuIGJlIG1hZGUsIGJ1dCB0aGV5IG5lZWQKK3RvIGJlIHdlbGwganVzdGlmaWVkLiAgU28gYW55IHBhdGNoIG1ha2luZyBhbiBpbnRlcm5hbCBBUEkgY2hhbmdlIHNob3VsZCBiZQorYWNjb21wYW5pZWQgYnkgYSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBjaGFuZ2UgaXMgYW5kIHdoeSBpdCBpcworbmVjZXNzYXJ5LiAgVGhpcyBraW5kIG9mIGNoYW5nZSBzaG91bGQgYWxzbyBiZSBicm9rZW4gb3V0IGludG8gYSBzZXBhcmF0ZQorcGF0Y2gsIHJhdGhlciB0aGFuIGJ1cmllZCB3aXRoaW4gYSBsYXJnZXIgcGF0Y2guCisKK1RoZSBvdGhlciBjYXRjaCBpcyB0aGF0IGEgZGV2ZWxvcGVyIHdobyBjaGFuZ2VzIGFuIGludGVybmFsIEFQSSBpcworZ2VuZXJhbGx5IGNoYXJnZWQgd2l0aCB0aGUgdGFzayBvZiBmaXhpbmcgYW55IGNvZGUgd2l0aGluIHRoZSBrZXJuZWwgdHJlZQord2hpY2ggaXMgYnJva2VuIGJ5IHRoZSBjaGFuZ2UuICBGb3IgYSB3aWRlbHktdXNlZCBmdW5jdGlvbiwgdGhpcyBkdXR5IGNhbgorbGVhZCB0byBsaXRlcmFsbHkgaHVuZHJlZHMgb3IgdGhvdXNhbmRzIG9mIGNoYW5nZXMgLSBtYW55IG9mIHdoaWNoIGFyZQorbGlrZWx5IHRvIGNvbmZsaWN0IHdpdGggd29yayBiZWluZyBkb25lIGJ5IG90aGVyIGRldmVsb3BlcnMuICBOZWVkbGVzcyB0bworc2F5LCB0aGlzIGNhbiBiZSBhIGxhcmdlIGpvYiwgc28gaXQgaXMgYmVzdCB0byBiZSBzdXJlIHRoYXQgdGhlCitqdXN0aWZpY2F0aW9uIGlzIHNvbGlkLiAgTm90ZSB0aGF0IHRoZSBDb2NjaW5lbGxlIHRvb2wgY2FuIGhlbHAgd2l0aAord2lkZS1yYW5naW5nIEFQSSBjaGFuZ2VzLgorCitXaGVuIG1ha2luZyBhbiBpbmNvbXBhdGlibGUgQVBJIGNoYW5nZSwgb25lIHNob3VsZCwgd2hlbmV2ZXIgcG9zc2libGUsCitlbnN1cmUgdGhhdCBjb2RlIHdoaWNoIGhhcyBub3QgYmVlbiB1cGRhdGVkIGlzIGNhdWdodCBieSB0aGUgY29tcGlsZXIuCitUaGlzIHdpbGwgaGVscCB5b3UgdG8gYmUgc3VyZSB0aGF0IHlvdSBoYXZlIGZvdW5kIGFsbCBpbi10cmVlIHVzZXMgb2YgdGhhdAoraW50ZXJmYWNlLiAgSXQgd2lsbCBhbHNvIGFsZXJ0IGRldmVsb3BlcnMgb2Ygb3V0LW9mLXRyZWUgY29kZSB0aGF0IHRoZXJlIGlzCithIGNoYW5nZSB0aGF0IHRoZXkgbmVlZCB0byByZXNwb25kIHRvLiAgU3VwcG9ydGluZyBvdXQtb2YtdHJlZSBjb2RlIGlzIG5vdAorc29tZXRoaW5nIHRoYXQga2VybmVsIGRldmVsb3BlcnMgbmVlZCB0byBiZSB3b3JyaWVkIGFib3V0LCBidXQgd2UgYWxzbyBkbworbm90IGhhdmUgdG8gbWFrZSBsaWZlIGhhcmRlciBmb3Igb3V0LW9mLXRyZWUgZGV2ZWxvcGVycyB0aGFuIGl0IG5lZWRzIHRvCitiZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy81LlBvc3RpbmcgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNS5Qb3N0aW5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTQ4YzliLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy81LlBvc3RpbmcKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotNTogUE9TVElORyBQQVRDSEVTCi0KLVNvb25lciBvciBsYXRlciwgdGhlIHRpbWUgY29tZXMgd2hlbiB5b3VyIHdvcmsgaXMgcmVhZHkgdG8gYmUgcHJlc2VudGVkIHRvCi10aGUgY29tbXVuaXR5IGZvciByZXZpZXcgYW5kLCBldmVudHVhbGx5LCBpbmNsdXNpb24gaW50byB0aGUgbWFpbmxpbmUKLWtlcm5lbC4gIFVuc3VycHJpc2luZ2x5LCB0aGUga2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eSBoYXMgZXZvbHZlZCBhIHNldAotb2YgY29udmVudGlvbnMgYW5kIHByb2NlZHVyZXMgd2hpY2ggYXJlIHVzZWQgaW4gdGhlIHBvc3Rpbmcgb2YgcGF0Y2hlczsKLWZvbGxvd2luZyB0aGVtIHdpbGwgbWFrZSBsaWZlIG11Y2ggZWFzaWVyIGZvciBldmVyeWJvZHkgaW52b2x2ZWQuICBUaGlzCi1kb2N1bWVudCB3aWxsIGF0dGVtcHQgdG8gY292ZXIgdGhlc2UgZXhwZWN0YXRpb25zIGluIHJlYXNvbmFibGUgZGV0YWlsOwotbW9yZSBpbmZvcm1hdGlvbiBjYW4gYWxzbyBiZSBmb3VuZCBpbiB0aGUgZmlsZXMgU3VibWl0dGluZ1BhdGNoZXMsCi1TdWJtaXR0aW5nRHJpdmVycywgYW5kIFN1Ym1pdENoZWNrbGlzdCBpbiB0aGUga2VybmVsIGRvY3VtZW50YXRpb24KLWRpcmVjdG9yeS4KLQotCi01LjE6IFdIRU4gVE8gUE9TVAotCi1UaGVyZSBpcyBhIGNvbnN0YW50IHRlbXB0YXRpb24gdG8gYXZvaWQgcG9zdGluZyBwYXRjaGVzIGJlZm9yZSB0aGV5IGFyZQotY29tcGxldGVseSAicmVhZHkuIiAgRm9yIHNpbXBsZSBwYXRjaGVzLCB0aGF0IGlzIG5vdCBhIHByb2JsZW0uICBJZiB0aGUKLXdvcmsgYmVpbmcgZG9uZSBpcyBjb21wbGV4LCB0aG91Z2gsIHRoZXJlIGlzIGEgbG90IHRvIGJlIGdhaW5lZCBieSBnZXR0aW5nCi1mZWVkYmFjayBmcm9tIHRoZSBjb21tdW5pdHkgYmVmb3JlIHRoZSB3b3JrIGlzIGNvbXBsZXRlLiAgU28geW91IHNob3VsZAotY29uc2lkZXIgcG9zdGluZyBpbi1wcm9ncmVzcyB3b3JrLCBvciBldmVuIG1ha2luZyBhIGdpdCB0cmVlIGF2YWlsYWJsZSBzbwotdGhhdCBpbnRlcmVzdGVkIGRldmVsb3BlcnMgY2FuIGNhdGNoIHVwIHdpdGggeW91ciB3b3JrIGF0IGFueSB0aW1lLgotCi1XaGVuIHBvc3RpbmcgY29kZSB3aGljaCBpcyBub3QgeWV0IGNvbnNpZGVyZWQgcmVhZHkgZm9yIGluY2x1c2lvbiwgaXQgaXMgYQotZ29vZCBpZGVhIHRvIHNheSBzbyBpbiB0aGUgcG9zdGluZyBpdHNlbGYuICBBbHNvIG1lbnRpb24gYW55IG1ham9yIHdvcmsKLXdoaWNoIHJlbWFpbnMgdG8gYmUgZG9uZSBhbmQgYW55IGtub3duIHByb2JsZW1zLiAgRmV3ZXIgcGVvcGxlIHdpbGwgbG9vayBhdAotcGF0Y2hlcyB3aGljaCBhcmUga25vd24gdG8gYmUgaGFsZi1iYWtlZCwgYnV0IHRob3NlIHdobyBkbyB3aWxsIGNvbWUgaW4KLXdpdGggdGhlIGlkZWEgdGhhdCB0aGV5IGNhbiBoZWxwIHlvdSBkcml2ZSB0aGUgd29yayBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uLgotCi0KLTUuMjogQkVGT1JFIENSRUFUSU5HIFBBVENIRVMKLQotVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRoaW5ncyB3aGljaCBzaG91bGQgYmUgZG9uZSBiZWZvcmUgeW91IGNvbnNpZGVyCi1zZW5kaW5nIHBhdGNoZXMgdG8gdGhlIGRldmVsb3BtZW50IGNvbW11bml0eS4gIFRoZXNlIGluY2x1ZGU6Ci0KLSAtIFRlc3QgdGhlIGNvZGUgdG8gdGhlIGV4dGVudCB0aGF0IHlvdSBjYW4uICBNYWtlIHVzZSBvZiB0aGUga2VybmVsJ3MKLSAgIGRlYnVnZ2luZyB0b29scywgZW5zdXJlIHRoYXQgdGhlIGtlcm5lbCB3aWxsIGJ1aWxkIHdpdGggYWxsIHJlYXNvbmFibGUKLSAgIGNvbWJpbmF0aW9ucyBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHVzZSBjcm9zcy1jb21waWxlcnMgdG8gYnVpbGQgZm9yCi0gICBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcywgZXRjLgotCi0gLSBNYWtlIHN1cmUgeW91ciBjb2RlIGlzIGNvbXBsaWFudCB3aXRoIHRoZSBrZXJuZWwgY29kaW5nIHN0eWxlCi0gICBndWlkZWxpbmVzLgotCi0gLSBEb2VzIHlvdXIgY2hhbmdlIGhhdmUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zPyAgSWYgc28sIHlvdSBzaG91bGQgcnVuCi0gICBiZW5jaG1hcmtzIHNob3dpbmcgd2hhdCB0aGUgaW1wYWN0IChvciBiZW5lZml0KSBvZiB5b3VyIGNoYW5nZSBpczsgYQotICAgc3VtbWFyeSBvZiB0aGUgcmVzdWx0cyBzaG91bGQgYmUgaW5jbHVkZWQgd2l0aCB0aGUgcGF0Y2guCi0KLSAtIEJlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgcmlnaHQgdG8gcG9zdCB0aGUgY29kZS4gIElmIHRoaXMgd29yayB3YXMgZG9uZQotICAgZm9yIGFuIGVtcGxveWVyLCB0aGUgZW1wbG95ZXIgbGlrZWx5IGhhcyBhIHJpZ2h0IHRvIHRoZSB3b3JrIGFuZCBtdXN0IGJlCi0gICBhZ3JlZWFibGUgd2l0aCBpdHMgcmVsZWFzZSB1bmRlciB0aGUgR1BMLgotCi1BcyBhIGdlbmVyYWwgcnVsZSwgcHV0dGluZyBpbiBzb21lIGV4dHJhIHRob3VnaHQgYmVmb3JlIHBvc3RpbmcgY29kZSBhbG1vc3QKLWFsd2F5cyBwYXlzIGJhY2sgdGhlIGVmZm9ydCBpbiBzaG9ydCBvcmRlci4KLQotCi01LjM6IFBBVENIIFBSRVBBUkFUSU9OCi0KLVRoZSBwcmVwYXJhdGlvbiBvZiBwYXRjaGVzIGZvciBwb3N0aW5nIGNhbiBiZSBhIHN1cnByaXNpbmcgYW1vdW50IG9mIHdvcmssCi1idXQsIG9uY2UgYWdhaW4sIGF0dGVtcHRpbmcgdG8gc2F2ZSB0aW1lIGhlcmUgaXMgbm90IGdlbmVyYWxseSBhZHZpc2FibGUKLWV2ZW4gaW4gdGhlIHNob3J0IHRlcm0uCi0KLVBhdGNoZXMgbXVzdCBiZSBwcmVwYXJlZCBhZ2FpbnN0IGEgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUga2VybmVsLiAgQXMgYQotZ2VuZXJhbCBydWxlLCBhIHBhdGNoIHNob3VsZCBiZSBiYXNlZCBvbiB0aGUgY3VycmVudCBtYWlubGluZSBhcyBmb3VuZCBpbgotTGludXMncyBnaXQgdHJlZS4gIFdoZW4gYmFzaW5nIG9uIG1haW5saW5lLCBzdGFydCB3aXRoIGEgd2VsbC1rbm93biByZWxlYXNlCi1wb2ludCAtIGEgc3RhYmxlIG9yIC1yYyByZWxlYXNlIC0gcmF0aGVyIHRoYW4gYnJhbmNoaW5nIG9mZiB0aGUgbWFpbmxpbmUgYXQKLWFuIGFyYml0cmFyeSBzcG90LgotCi1JdCBtYXkgYmVjb21lIG5lY2Vzc2FyeSB0byBtYWtlIHZlcnNpb25zIGFnYWluc3QgLW1tLCBsaW51eC1uZXh0LCBvciBhCi1zdWJzeXN0ZW0gdHJlZSwgdGhvdWdoLCB0byBmYWNpbGl0YXRlIHdpZGVyIHRlc3RpbmcgYW5kIHJldmlldy4gIERlcGVuZGluZwotb24gdGhlIGFyZWEgb2YgeW91ciBwYXRjaCBhbmQgd2hhdCBpcyBnb2luZyBvbiBlbHNld2hlcmUsIGJhc2luZyBhIHBhdGNoCi1hZ2FpbnN0IHRoZXNlIG90aGVyIHRyZWVzIGNhbiByZXF1aXJlIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHdvcmsKLXJlc29sdmluZyBjb25mbGljdHMgYW5kIGRlYWxpbmcgd2l0aCBBUEkgY2hhbmdlcy4KLQotT25seSB0aGUgbW9zdCBzaW1wbGUgY2hhbmdlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIGEgc2luZ2xlIHBhdGNoOwotZXZlcnl0aGluZyBlbHNlIHNob3VsZCBiZSBtYWRlIGFzIGEgbG9naWNhbCBzZXJpZXMgb2YgY2hhbmdlcy4gIFNwbGl0dGluZwotdXAgcGF0Y2hlcyBpcyBhIGJpdCBvZiBhbiBhcnQ7IHNvbWUgZGV2ZWxvcGVycyBzcGVuZCBhIGxvbmcgdGltZSBmaWd1cmluZwotb3V0IGhvdyB0byBkbyBpdCBpbiB0aGUgd2F5IHRoYXQgdGhlIGNvbW11bml0eSBleHBlY3RzLiAgVGhlcmUgYXJlIGEgZmV3Ci1ydWxlcyBvZiB0aHVtYiwgaG93ZXZlciwgd2hpY2ggY2FuIGhlbHAgY29uc2lkZXJhYmx5OgotCi0gLSBUaGUgcGF0Y2ggc2VyaWVzIHlvdSBwb3N0IHdpbGwgYWxtb3N0IGNlcnRhaW5seSBub3QgYmUgdGhlIHNlcmllcyBvZgotICAgY2hhbmdlcyBmb3VuZCBpbiB5b3VyIHdvcmtpbmcgcmV2aXNpb24gY29udHJvbCBzeXN0ZW0uICBJbnN0ZWFkLCB0aGUKLSAgIGNoYW5nZXMgeW91IGhhdmUgbWFkZSBuZWVkIHRvIGJlIGNvbnNpZGVyZWQgaW4gdGhlaXIgZmluYWwgZm9ybSwgdGhlbgotICAgc3BsaXQgYXBhcnQgaW4gd2F5cyB3aGljaCBtYWtlIHNlbnNlLiAgVGhlIGRldmVsb3BlcnMgYXJlIGludGVyZXN0ZWQgaW4KLSAgIGRpc2NyZXRlLCBzZWxmLWNvbnRhaW5lZCBjaGFuZ2VzLCBub3QgdGhlIHBhdGggeW91IHRvb2sgdG8gZ2V0IHRvIHRob3NlCi0gICBjaGFuZ2VzLgotCi0gLSBFYWNoIGxvZ2ljYWxseSBpbmRlcGVuZGVudCBjaGFuZ2Ugc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBhIHNlcGFyYXRlCi0gICBwYXRjaC4gIFRoZXNlIGNoYW5nZXMgY2FuIGJlIHNtYWxsICgiYWRkIGEgZmllbGQgdG8gdGhpcyBzdHJ1Y3R1cmUiKSBvcgotICAgbGFyZ2UgKGFkZGluZyBhIHNpZ25pZmljYW50IG5ldyBkcml2ZXIsIGZvciBleGFtcGxlKSwgYnV0IHRoZXkgc2hvdWxkIGJlCi0gICBjb25jZXB0dWFsbHkgc21hbGwgYW5kIGFtZW5hYmxlIHRvIGEgb25lLWxpbmUgZGVzY3JpcHRpb24uICBFYWNoIHBhdGNoCi0gICBzaG91bGQgbWFrZSBhIHNwZWNpZmljIGNoYW5nZSB3aGljaCBjYW4gYmUgcmV2aWV3ZWQgb24gaXRzIG93biBhbmQKLSAgIHZlcmlmaWVkIHRvIGRvIHdoYXQgaXQgc2F5cyBpdCBkb2VzLgotCi0gLSBBcyBhIHdheSBvZiByZXN0YXRpbmcgdGhlIGd1aWRlbGluZSBhYm92ZTogZG8gbm90IG1peCBkaWZmZXJlbnQgdHlwZXMgb2YKLSAgIGNoYW5nZXMgaW4gdGhlIHNhbWUgcGF0Y2guICBJZiBhIHNpbmdsZSBwYXRjaCBmaXhlcyBhIGNyaXRpY2FsIHNlY3VyaXR5Ci0gICBidWcsIHJlYXJyYW5nZXMgYSBmZXcgc3RydWN0dXJlcywgYW5kIHJlZm9ybWF0cyB0aGUgY29kZSwgdGhlcmUgaXMgYQotICAgZ29vZCBjaGFuY2UgdGhhdCBpdCB3aWxsIGJlIHBhc3NlZCBvdmVyIGFuZCB0aGUgaW1wb3J0YW50IGZpeCB3aWxsIGJlCi0gICBsb3N0LgotCi0gLSBFYWNoIHBhdGNoIHNob3VsZCB5aWVsZCBhIGtlcm5lbCB3aGljaCBidWlsZHMgYW5kIHJ1bnMgcHJvcGVybHk7IGlmIHlvdXIKLSAgIHBhdGNoIHNlcmllcyBpcyBpbnRlcnJ1cHRlZCBpbiB0aGUgbWlkZGxlLCB0aGUgcmVzdWx0IHNob3VsZCBzdGlsbCBiZSBhCi0gICB3b3JraW5nIGtlcm5lbC4gIFBhcnRpYWwgYXBwbGljYXRpb24gb2YgYSBwYXRjaCBzZXJpZXMgaXMgYSBjb21tb24KLSAgIHNjZW5hcmlvIHdoZW4gdGhlICJnaXQgYmlzZWN0IiB0b29sIGlzIHVzZWQgdG8gZmluZCByZWdyZXNzaW9uczsgaWYgdGhlCi0gICByZXN1bHQgaXMgYSBicm9rZW4ga2VybmVsLCB5b3Ugd2lsbCBtYWtlIGxpZmUgaGFyZGVyIGZvciBkZXZlbG9wZXJzIGFuZAotICAgdXNlcnMgd2hvIGFyZSBlbmdhZ2luZyBpbiB0aGUgbm9ibGUgd29yayBvZiB0cmFja2luZyBkb3duIHByb2JsZW1zLgotCi0gLSBEbyBub3Qgb3ZlcmRvIGl0LCB0aG91Z2guICBPbmUgZGV2ZWxvcGVyIG9uY2UgcG9zdGVkIGEgc2V0IG9mIGVkaXRzCi0gICB0byBhIHNpbmdsZSBmaWxlIGFzIDUwMCBzZXBhcmF0ZSBwYXRjaGVzIC0gYW4gYWN0IHdoaWNoIGRpZCBub3QgbWFrZSBoaW0KLSAgIHRoZSBtb3N0IHBvcHVsYXIgcGVyc29uIG9uIHRoZSBrZXJuZWwgbWFpbGluZyBsaXN0LiAgQSBzaW5nbGUgcGF0Y2ggY2FuCi0gICBiZSByZWFzb25hYmx5IGxhcmdlIGFzIGxvbmcgYXMgaXQgc3RpbGwgY29udGFpbnMgYSBzaW5nbGUgKmxvZ2ljYWwqCi0gICBjaGFuZ2UuCi0KLSAtIEl0IGNhbiBiZSB0ZW1wdGluZyB0byBhZGQgYSB3aG9sZSBuZXcgaW5mcmFzdHJ1Y3R1cmUgd2l0aCBhIHNlcmllcyBvZgotICAgcGF0Y2hlcywgYnV0IHRvIGxlYXZlIHRoYXQgaW5mcmFzdHJ1Y3R1cmUgdW51c2VkIHVudGlsIHRoZSBmaW5hbCBwYXRjaAotICAgaW4gdGhlIHNlcmllcyBlbmFibGVzIHRoZSB3aG9sZSB0aGluZy4gIFRoaXMgdGVtcHRhdGlvbiBzaG91bGQgYmUKLSAgIGF2b2lkZWQgaWYgcG9zc2libGU7IGlmIHRoYXQgc2VyaWVzIGFkZHMgcmVncmVzc2lvbnMsIGJpc2VjdGlvbiB3aWxsCi0gICBmaW5nZXIgdGhlIGxhc3QgcGF0Y2ggYXMgdGhlIG9uZSB3aGljaCBjYXVzZWQgdGhlIHByb2JsZW0sIGV2ZW4gdGhvdWdoCi0gICB0aGUgcmVhbCBidWcgaXMgZWxzZXdoZXJlLiAgV2hlbmV2ZXIgcG9zc2libGUsIGEgcGF0Y2ggd2hpY2ggYWRkcyBuZXcKLSAgIGNvZGUgc2hvdWxkIG1ha2UgdGhhdCBjb2RlIGFjdGl2ZSBpbW1lZGlhdGVseS4KLQotV29ya2luZyB0byBjcmVhdGUgdGhlIHBlcmZlY3QgcGF0Y2ggc2VyaWVzIGNhbiBiZSBhIGZydXN0cmF0aW5nIHByb2Nlc3MKLXdoaWNoIHRha2VzIHF1aXRlIGEgYml0IG9mIHRpbWUgYW5kIHRob3VnaHQgYWZ0ZXIgdGhlICJyZWFsIHdvcmsiIGhhcyBiZWVuCi1kb25lLiAgV2hlbiBkb25lIHByb3Blcmx5LCB0aG91Z2gsIGl0IGlzIHRpbWUgd2VsbCBzcGVudC4KLQotCi01LjQ6IFBBVENIIEZPUk1BVFRJTkcgQU5EIENIQU5HRUxPR1MKLQotU28gbm93IHlvdSBoYXZlIGEgcGVyZmVjdCBzZXJpZXMgb2YgcGF0Y2hlcyBmb3IgcG9zdGluZywgYnV0IHRoZSB3b3JrIGlzCi1ub3QgZG9uZSBxdWl0ZSB5ZXQuICBFYWNoIHBhdGNoIG5lZWRzIHRvIGJlIGZvcm1hdHRlZCBpbnRvIGEgbWVzc2FnZSB3aGljaAotcXVpY2tseSBhbmQgY2xlYXJseSBjb21tdW5pY2F0ZXMgaXRzIHB1cnBvc2UgdG8gdGhlIHJlc3Qgb2YgdGhlIHdvcmxkLiAgVG8KLXRoYXQgZW5kLCBlYWNoIHBhdGNoIHdpbGwgYmUgY29tcG9zZWQgb2YgdGhlIGZvbGxvd2luZzoKLQotIC0gQW4gb3B0aW9uYWwgIkZyb20iIGxpbmUgbmFtaW5nIHRoZSBhdXRob3Igb2YgdGhlIHBhdGNoLiAgVGhpcyBsaW5lIGlzCi0gICBvbmx5IG5lY2Vzc2FyeSBpZiB5b3UgYXJlIHBhc3Npbmcgb24gc29tZWJvZHkgZWxzZSdzIHBhdGNoIHZpYSBlbWFpbCwKLSAgIGJ1dCBpdCBuZXZlciBodXJ0cyB0byBhZGQgaXQgd2hlbiBpbiBkb3VidC4KLQotIC0gQSBvbmUtbGluZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBwYXRjaCBkb2VzLiAgVGhpcyBtZXNzYWdlIHNob3VsZCBiZQotICAgZW5vdWdoIGZvciBhIHJlYWRlciB3aG8gc2VlcyBpdCB3aXRoIG5vIG90aGVyIGNvbnRleHQgdG8gZmlndXJlIG91dCB0aGUKLSAgIHNjb3BlIG9mIHRoZSBwYXRjaDsgaXQgaXMgdGhlIGxpbmUgdGhhdCB3aWxsIHNob3cgdXAgaW4gdGhlICJzaG9ydCBmb3JtIgotICAgY2hhbmdlbG9ncy4gIFRoaXMgbWVzc2FnZSBpcyB1c3VhbGx5IGZvcm1hdHRlZCB3aXRoIHRoZSByZWxldmFudAotICAgc3Vic3lzdGVtIG5hbWUgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSBwdXJwb3NlIG9mIHRoZSBwYXRjaC4gIEZvcgotICAgZXhhbXBsZToKLQotCWdwaW86IGZpeCBidWlsZCBvbiBDT05GSUdfR1BJT19TWVNGUz1uCi0KLSAtIEEgYmxhbmsgbGluZSBmb2xsb3dlZCBieSBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBjb250ZW50cyBvZiB0aGUKLSAgIHBhdGNoLiAgVGhpcyBkZXNjcmlwdGlvbiBjYW4gYmUgYXMgbG9uZyBhcyBpcyByZXF1aXJlZDsgaXQgc2hvdWxkIHNheQotICAgd2hhdCB0aGUgcGF0Y2ggZG9lcyBhbmQgd2h5IGl0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBrZXJuZWwuCi0KLSAtIE9uZSBvciBtb3JlIHRhZyBsaW5lcywgd2l0aCwgYXQgYSBtaW5pbXVtLCBvbmUgU2lnbmVkLW9mZi1ieTogbGluZSBmcm9tCi0gICB0aGUgYXV0aG9yIG9mIHRoZSBwYXRjaC4gIFRhZ3Mgd2lsbCBiZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgYmVsb3cuCi0KLVRoZSBpdGVtcyBhYm92ZSwgdG9nZXRoZXIsIGZvcm0gdGhlIGNoYW5nZWxvZyBmb3IgdGhlIHBhdGNoLiAgV3JpdGluZyBnb29kCi1jaGFuZ2Vsb2dzIGlzIGEgY3J1Y2lhbCBidXQgb2Z0ZW4tbmVnbGVjdGVkIGFydDsgaXQncyB3b3J0aCBzcGVuZGluZwotYW5vdGhlciBtb21lbnQgZGlzY3Vzc2luZyB0aGlzIGlzc3VlLiAgV2hlbiB3cml0aW5nIGEgY2hhbmdlbG9nLCB5b3Ugc2hvdWxkCi1iZWFyIGluIG1pbmQgdGhhdCBhIG51bWJlciBvZiBkaWZmZXJlbnQgcGVvcGxlIHdpbGwgYmUgcmVhZGluZyB5b3VyIHdvcmRzLgotVGhlc2UgaW5jbHVkZSBzdWJzeXN0ZW0gbWFpbnRhaW5lcnMgYW5kIHJldmlld2VycyB3aG8gbmVlZCB0byBkZWNpZGUKLXdoZXRoZXIgdGhlIHBhdGNoIHNob3VsZCBiZSBpbmNsdWRlZCwgZGlzdHJpYnV0b3JzIGFuZCBvdGhlciBtYWludGFpbmVycwotdHJ5aW5nIHRvIGRlY2lkZSB3aGV0aGVyIGEgcGF0Y2ggc2hvdWxkIGJlIGJhY2twb3J0ZWQgdG8gb3RoZXIga2VybmVscywgYnVnCi1odW50ZXJzIHdvbmRlcmluZyB3aGV0aGVyIHRoZSBwYXRjaCBpcyByZXNwb25zaWJsZSBmb3IgYSBwcm9ibGVtIHRoZXkgYXJlCi1jaGFzaW5nLCB1c2VycyB3aG8gd2FudCB0byBrbm93IGhvdyB0aGUga2VybmVsIGhhcyBjaGFuZ2VkLCBhbmQgbW9yZS4gIEEKLWdvb2QgY2hhbmdlbG9nIGNvbnZleXMgdGhlIG5lZWRlZCBpbmZvcm1hdGlvbiB0byBhbGwgb2YgdGhlc2UgcGVvcGxlIGluIHRoZQotbW9zdCBkaXJlY3QgYW5kIGNvbmNpc2Ugd2F5IHBvc3NpYmxlLgotCi1UbyB0aGF0IGVuZCwgdGhlIHN1bW1hcnkgbGluZSBzaG91bGQgZGVzY3JpYmUgdGhlIGVmZmVjdHMgb2YgYW5kIG1vdGl2YXRpb24KLWZvciB0aGUgY2hhbmdlIGFzIHdlbGwgYXMgcG9zc2libGUgZ2l2ZW4gdGhlIG9uZS1saW5lIGNvbnN0cmFpbnQuICBUaGUKLWRldGFpbGVkIGRlc2NyaXB0aW9uIGNhbiB0aGVuIGFtcGxpZnkgb24gdGhvc2UgdG9waWNzIGFuZCBwcm92aWRlIGFueQotbmVlZGVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uICBJZiB0aGUgcGF0Y2ggZml4ZXMgYSBidWcsIGNpdGUgdGhlIGNvbW1pdAotd2hpY2ggaW50cm9kdWNlZCB0aGUgYnVnIGlmIHBvc3NpYmxlIChhbmQgcGxlYXNlIHByb3ZpZGUgYm90aCB0aGUgY29tbWl0IElECi1hbmQgdGhlIHRpdGxlIHdoZW4gY2l0aW5nIGNvbW1pdHMpLiAgSWYgYSBwcm9ibGVtIGlzIGFzc29jaWF0ZWQgd2l0aAotc3BlY2lmaWMgbG9nIG9yIGNvbXBpbGVyIG91dHB1dCwgaW5jbHVkZSB0aGF0IG91dHB1dCB0byBoZWxwIG90aGVycwotc2VhcmNoaW5nIGZvciBhIHNvbHV0aW9uIHRvIHRoZSBzYW1lIHByb2JsZW0uICBJZiB0aGUgY2hhbmdlIGlzIG1lYW50IHRvCi1zdXBwb3J0IG90aGVyIGNoYW5nZXMgY29taW5nIGluIGxhdGVyIHBhdGNoLCBzYXkgc28uICBJZiBpbnRlcm5hbCBBUElzIGFyZQotY2hhbmdlZCwgZGV0YWlsIHRob3NlIGNoYW5nZXMgYW5kIGhvdyBvdGhlciBkZXZlbG9wZXJzIHNob3VsZCByZXNwb25kLiAgSW4KLWdlbmVyYWwsIHRoZSBtb3JlIHlvdSBjYW4gcHV0IHlvdXJzZWxmIGludG8gdGhlIHNob2VzIG9mIGV2ZXJ5Ym9keSB3aG8gd2lsbAotYmUgcmVhZGluZyB5b3VyIGNoYW5nZWxvZywgdGhlIGJldHRlciB0aGF0IGNoYW5nZWxvZyAoYW5kIHRoZSBrZXJuZWwgYXMgYQotd2hvbGUpIHdpbGwgYmUuCi0KLU5lZWRsZXNzIHRvIHNheSwgdGhlIGNoYW5nZWxvZyBzaG91bGQgYmUgdGhlIHRleHQgdXNlZCB3aGVuIGNvbW1pdHRpbmcgdGhlCi1jaGFuZ2UgdG8gYSByZXZpc2lvbiBjb250cm9sIHN5c3RlbS4gIEl0IHdpbGwgYmUgZm9sbG93ZWQgYnk6Ci0KLSAtIFRoZSBwYXRjaCBpdHNlbGYsIGluIHRoZSB1bmlmaWVkICgiLXUiKSBwYXRjaCBmb3JtYXQuICBVc2luZyB0aGUgIi1wIgotICAgb3B0aW9uIHRvIGRpZmYgd2lsbCBhc3NvY2lhdGUgZnVuY3Rpb24gbmFtZXMgd2l0aCBjaGFuZ2VzLCBtYWtpbmcgdGhlCi0gICByZXN1bHRpbmcgcGF0Y2ggZWFzaWVyIGZvciBvdGhlcnMgdG8gcmVhZC4KLQotWW91IHNob3VsZCBhdm9pZCBpbmNsdWRpbmcgY2hhbmdlcyB0byBpcnJlbGV2YW50IGZpbGVzICh0aG9zZSBnZW5lcmF0ZWQgYnkKLXRoZSBidWlsZCBwcm9jZXNzLCBmb3IgZXhhbXBsZSwgb3IgZWRpdG9yIGJhY2t1cCBmaWxlcykgaW4gdGhlIHBhdGNoLiAgVGhlCi1maWxlICJkb250ZGlmZiIgaW4gdGhlIERvY3VtZW50YXRpb24gZGlyZWN0b3J5IGNhbiBoZWxwIGluIHRoaXMgcmVnYXJkOwotcGFzcyBpdCB0byBkaWZmIHdpdGggdGhlICItWCIgb3B0aW9uLgotCi1UaGUgdGFncyBtZW50aW9uZWQgYWJvdmUgYXJlIHVzZWQgdG8gZGVzY3JpYmUgaG93IHZhcmlvdXMgZGV2ZWxvcGVycyBoYXZlCi1iZWVuIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBwYXRjaC4gIFRoZXkgYXJlIGRlc2NyaWJlZCBpbgotZGV0YWlsIGluIHRoZSBTdWJtaXR0aW5nUGF0Y2hlcyBkb2N1bWVudDsgd2hhdCBmb2xsb3dzIGhlcmUgaXMgYSBicmllZgotc3VtbWFyeS4gIEVhY2ggb2YgdGhlc2UgbGluZXMgaGFzIHRoZSBmb3JtYXQ6Ci0KLQl0YWc6IEZ1bGwgTmFtZSA8ZW1haWwgYWRkcmVzcz4gIG9wdGlvbmFsLW90aGVyLXN0dWZmCi0KLVRoZSB0YWdzIGluIGNvbW1vbiB1c2UgYXJlOgotCi0gLSBTaWduZWQtb2ZmLWJ5OiB0aGlzIGlzIGEgZGV2ZWxvcGVyJ3MgY2VydGlmaWNhdGlvbiB0aGF0IGhlIG9yIHNoZSBoYXMKLSAgIHRoZSByaWdodCB0byBzdWJtaXQgdGhlIHBhdGNoIGZvciBpbmNsdXNpb24gaW50byB0aGUga2VybmVsLiAgSXQgaXMgYW4KLSAgIGFncmVlbWVudCB0byB0aGUgRGV2ZWxvcGVyJ3MgQ2VydGlmaWNhdGUgb2YgT3JpZ2luLCB0aGUgZnVsbCB0ZXh0IG9mCi0gICB3aGljaCBjYW4gYmUgZm91bmQgaW4gRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcy4gIENvZGUgd2l0aG91dCBhCi0gICBwcm9wZXIgc2lnbm9mZiBjYW5ub3QgYmUgbWVyZ2VkIGludG8gdGhlIG1haW5saW5lLgotCi0gLSBBY2tlZC1ieTogaW5kaWNhdGVzIGFuIGFncmVlbWVudCBieSBhbm90aGVyIGRldmVsb3BlciAob2Z0ZW4gYQotICAgbWFpbnRhaW5lciBvZiB0aGUgcmVsZXZhbnQgY29kZSkgdGhhdCB0aGUgcGF0Y2ggaXMgYXBwcm9wcmlhdGUgZm9yCi0gICBpbmNsdXNpb24gaW50byB0aGUga2VybmVsLgotCi0gLSBUZXN0ZWQtYnk6IHN0YXRlcyB0aGF0IHRoZSBuYW1lZCBwZXJzb24gaGFzIHRlc3RlZCB0aGUgcGF0Y2ggYW5kIGZvdW5kCi0gICBpdCB0byB3b3JrLgotCi0gLSBSZXZpZXdlZC1ieTogdGhlIG5hbWVkIGRldmVsb3BlciBoYXMgcmV2aWV3ZWQgdGhlIHBhdGNoIGZvciBjb3JyZWN0bmVzczsKLSAgIHNlZSB0aGUgcmV2aWV3ZXIncyBzdGF0ZW1lbnQgaW4gRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyBmb3IgbW9yZQotICAgZGV0YWlsLgotCi0gLSBSZXBvcnRlZC1ieTogbmFtZXMgYSB1c2VyIHdobyByZXBvcnRlZCBhIHByb2JsZW0gd2hpY2ggaXMgZml4ZWQgYnkgdGhpcwotICAgcGF0Y2g7IHRoaXMgdGFnIGlzIHVzZWQgdG8gZ2l2ZSBjcmVkaXQgdG8gdGhlIChvZnRlbiB1bmRlcmFwcHJlY2lhdGVkKQotICAgcGVvcGxlIHdobyB0ZXN0IG91ciBjb2RlIGFuZCBsZXQgdXMga25vdyB3aGVuIHRoaW5ncyBkbyBub3Qgd29yawotICAgY29ycmVjdGx5LgotCi0gLSBDYzogdGhlIG5hbWVkIHBlcnNvbiByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIHBhdGNoIGFuZCBoYWQgdGhlCi0gICBvcHBvcnR1bml0eSB0byBjb21tZW50IG9uIGl0LgotCi1CZSBjYXJlZnVsIGluIHRoZSBhZGRpdGlvbiBvZiB0YWdzIHRvIHlvdXIgcGF0Y2hlczogb25seSBDYzogaXMgYXBwcm9wcmlhdGUKLWZvciBhZGRpdGlvbiB3aXRob3V0IHRoZSBleHBsaWNpdCBwZXJtaXNzaW9uIG9mIHRoZSBwZXJzb24gbmFtZWQuCi0KLQotNS41OiBTRU5ESU5HIFRIRSBQQVRDSAotCi1CZWZvcmUgeW91IG1haWwgeW91ciBwYXRjaGVzLCB0aGVyZSBhcmUgYSBjb3VwbGUgb2Ygb3RoZXIgdGhpbmdzIHlvdSBzaG91bGQKLXRha2UgY2FyZSBvZjoKLQotIC0gQXJlIHlvdSBzdXJlIHRoYXQgeW91ciBtYWlsZXIgd2lsbCBub3QgY29ycnVwdCB0aGUgcGF0Y2hlcz8gIFBhdGNoZXMKLSAgIHdoaWNoIGhhdmUgaGFkIGdyYXR1aXRvdXMgd2hpdGUtc3BhY2UgY2hhbmdlcyBvciBsaW5lIHdyYXBwaW5nIHBlcmZvcm1lZAotICAgYnkgdGhlIG1haWwgY2xpZW50IHdpbGwgbm90IGFwcGx5IGF0IHRoZSBvdGhlciBlbmQsIGFuZCBvZnRlbiB3aWxsIG5vdAotICAgYmUgZXhhbWluZWQgaW4gYW55IGRldGFpbC4gIElmIHRoZXJlIGlzIGFueSBkb3VidCBhdCBhbGwsIG1haWwgdGhlIHBhdGNoCi0gICB0byB5b3Vyc2VsZiBhbmQgY29udmluY2UgeW91cnNlbGYgdGhhdCBpdCBzaG93cyB1cCBpbnRhY3QuCi0KLSAgIERvY3VtZW50YXRpb24vZW1haWwtY2xpZW50cy50eHQgaGFzIHNvbWUgaGVscGZ1bCBoaW50cyBvbiBtYWtpbmcKLSAgIHNwZWNpZmljIG1haWwgY2xpZW50cyB3b3JrIGZvciBzZW5kaW5nIHBhdGNoZXMuCi0KLSAtIEFyZSB5b3Ugc3VyZSB5b3VyIHBhdGNoIGlzIGZyZWUgb2Ygc2lsbHkgbWlzdGFrZXM/ICBZb3Ugc2hvdWxkIGFsd2F5cwotICAgcnVuIHBhdGNoZXMgdGhyb3VnaCBzY3JpcHRzL2NoZWNrcGF0Y2gucGwgYW5kIGFkZHJlc3MgdGhlIGNvbXBsYWludHMgaXQKLSAgIGNvbWVzIHVwIHdpdGguICBQbGVhc2UgYmVhciBpbiBtaW5kIHRoYXQgY2hlY2twYXRjaC5wbCwgd2hpbGUgYmVpbmcgdGhlCi0gICBlbWJvZGltZW50IG9mIGEgZmFpciBhbW91bnQgb2YgdGhvdWdodCBhYm91dCB3aGF0IGtlcm5lbCBwYXRjaGVzIHNob3VsZAotICAgbG9vayBsaWtlLCBpcyBub3Qgc21hcnRlciB0aGFuIHlvdS4gIElmIGZpeGluZyBhIGNoZWNrcGF0Y2gucGwgY29tcGxhaW50Ci0gICB3b3VsZCBtYWtlIHRoZSBjb2RlIHdvcnNlLCBkb24ndCBkbyBpdC4KLQotUGF0Y2hlcyBzaG91bGQgYWx3YXlzIGJlIHNlbnQgYXMgcGxhaW4gdGV4dC4gIFBsZWFzZSBkbyBub3Qgc2VuZCB0aGVtIGFzCi1hdHRhY2htZW50czsgdGhhdCBtYWtlcyBpdCBtdWNoIGhhcmRlciBmb3IgcmV2aWV3ZXJzIHRvIHF1b3RlIHNlY3Rpb25zIG9mCi10aGUgcGF0Y2ggaW4gdGhlaXIgcmVwbGllcy4gIEluc3RlYWQsIGp1c3QgcHV0IHRoZSBwYXRjaCBkaXJlY3RseSBpbnRvIHlvdXIKLW1lc3NhZ2UuCi0KLVdoZW4gbWFpbGluZyBwYXRjaGVzLCBpdCBpcyBpbXBvcnRhbnQgdG8gc2VuZCBjb3BpZXMgdG8gYW55Ym9keSB3aG8gbWlnaHQKLWJlIGludGVyZXN0ZWQgaW4gaXQuICBVbmxpa2Ugc29tZSBvdGhlciBwcm9qZWN0cywgdGhlIGtlcm5lbCBlbmNvdXJhZ2VzCi1wZW9wbGUgdG8gZXJyIG9uIHRoZSBzaWRlIG9mIHNlbmRpbmcgdG9vIG1hbnkgY29waWVzOyBkb24ndCBhc3N1bWUgdGhhdCB0aGUKLXJlbGV2YW50IHBlb3BsZSB3aWxsIHNlZSB5b3VyIHBvc3Rpbmcgb24gdGhlIG1haWxpbmcgbGlzdHMuICBJbiBwYXJ0aWN1bGFyLAotY29waWVzIHNob3VsZCBnbyB0bzoKLQotIC0gVGhlIG1haW50YWluZXIocykgb2YgdGhlIGFmZmVjdGVkIHN1YnN5c3RlbShzKS4gIEFzIGRlc2NyaWJlZCBlYXJsaWVyLAotICAgdGhlIE1BSU5UQUlORVJTIGZpbGUgaXMgdGhlIGZpcnN0IHBsYWNlIHRvIGxvb2sgZm9yIHRoZXNlIHBlb3BsZS4KLQotIC0gT3RoZXIgZGV2ZWxvcGVycyB3aG8gaGF2ZSBiZWVuIHdvcmtpbmcgaW4gdGhlIHNhbWUgYXJlYSAtIGVzcGVjaWFsbHkKLSAgIHRob3NlIHdobyBtaWdodCBiZSB3b3JraW5nIHRoZXJlIG5vdy4gIFVzaW5nIGdpdCB0byBzZWUgd2hvIGVsc2UgaGFzCi0gICBtb2RpZmllZCB0aGUgZmlsZXMgeW91IGFyZSB3b3JraW5nIG9uIGNhbiBiZSBoZWxwZnVsLgotCi0gLSBJZiB5b3UgYXJlIHJlc3BvbmRpbmcgdG8gYSBidWcgcmVwb3J0IG9yIGEgZmVhdHVyZSByZXF1ZXN0LCBjb3B5IHRoZQotICAgb3JpZ2luYWwgcG9zdGVyIGFzIHdlbGwuCi0KLSAtIFNlbmQgYSBjb3B5IHRvIHRoZSByZWxldmFudCBtYWlsaW5nIGxpc3QsIG9yLCBpZiBub3RoaW5nIGVsc2UgYXBwbGllcywKLSAgIHRoZSBsaW51eC1rZXJuZWwgbGlzdC4KLQotIC0gSWYgeW91IGFyZSBmaXhpbmcgYSBidWcsIHRoaW5rIGFib3V0IHdoZXRoZXIgdGhlIGZpeCBzaG91bGQgZ28gaW50byB0aGUKLSAgIG5leHQgc3RhYmxlIHVwZGF0ZS4gIElmIHNvLCBzdGFibGVAdmdlci5rZXJuZWwub3JnIHNob3VsZCBnZXQgYSBjb3B5IG9mCi0gICB0aGUgcGF0Y2guICBBbHNvIGFkZCBhICJDYzogc3RhYmxlQHZnZXIua2VybmVsLm9yZyIgdG8gdGhlIHRhZ3Mgd2l0aGluCi0gICB0aGUgcGF0Y2ggaXRzZWxmOyB0aGF0IHdpbGwgY2F1c2UgdGhlIHN0YWJsZSB0ZWFtIHRvIGdldCBhIG5vdGlmaWNhdGlvbgotICAgd2hlbiB5b3VyIGZpeCBnb2VzIGludG8gdGhlIG1haW5saW5lLgotCi1XaGVuIHNlbGVjdGluZyByZWNpcGllbnRzIGZvciBhIHBhdGNoLCBpdCBpcyBnb29kIHRvIGhhdmUgYW4gaWRlYSBvZiB3aG8KLXlvdSB0aGluayB3aWxsIGV2ZW50dWFsbHkgYWNjZXB0IHRoZSBwYXRjaCBhbmQgZ2V0IGl0IG1lcmdlZC4gIFdoaWxlIGl0Ci1pcyBwb3NzaWJsZSB0byBzZW5kIHBhdGNoZXMgZGlyZWN0bHkgdG8gTGludXMgVG9ydmFsZHMgYW5kIGhhdmUgaGltIG1lcmdlCi10aGVtLCB0aGluZ3MgYXJlIG5vdCBub3JtYWxseSBkb25lIHRoYXQgd2F5LiAgTGludXMgaXMgYnVzeSwgYW5kIHRoZXJlIGFyZQotc3Vic3lzdGVtIG1haW50YWluZXJzIHdobyB3YXRjaCBvdmVyIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBrZXJuZWwuICBVc3VhbGx5Ci15b3Ugd2lsbCBiZSB3YW50aW5nIHRoYXQgbWFpbnRhaW5lciB0byBtZXJnZSB5b3VyIHBhdGNoZXMuICBJZiB0aGVyZSBpcyBubwotb2J2aW91cyBtYWludGFpbmVyLCBBbmRyZXcgTW9ydG9uIGlzIG9mdGVuIHRoZSBwYXRjaCB0YXJnZXQgb2YgbGFzdCByZXNvcnQuCi0KLVBhdGNoZXMgbmVlZCBnb29kIHN1YmplY3QgbGluZXMuICBUaGUgY2Fub25pY2FsIGZvcm1hdCBmb3IgYSBwYXRjaCBsaW5lIGlzCi1zb21ldGhpbmcgbGlrZToKLQotCVtQQVRDSCBubi9tbV0gc3Vic3lzOiBvbmUtbGluZSBkZXNjcmlwdGlvbiBvZiB0aGUgcGF0Y2gKLQotd2hlcmUgIm5uIiBpcyB0aGUgb3JkaW5hbCBudW1iZXIgb2YgdGhlIHBhdGNoLCAibW0iIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YKLXBhdGNoZXMgaW4gdGhlIHNlcmllcywgYW5kICJzdWJzeXMiIGlzIHRoZSBuYW1lIG9mIHRoZSBhZmZlY3RlZCBzdWJzeXN0ZW0uCi1DbGVhcmx5LCBubi9tbSBjYW4gYmUgb21pdHRlZCBmb3IgYSBzaW5nbGUsIHN0YW5kYWxvbmUgcGF0Y2guCi0KLUlmIHlvdSBoYXZlIGEgc2lnbmlmaWNhbnQgc2VyaWVzIG9mIHBhdGNoZXMsIGl0IGlzIGN1c3RvbWFyeSB0byBzZW5kIGFuCi1pbnRyb2R1Y3RvcnkgZGVzY3JpcHRpb24gYXMgcGFydCB6ZXJvLiAgVGhpcyBjb252ZW50aW9uIGlzIG5vdCB1bml2ZXJzYWxseQotZm9sbG93ZWQgdGhvdWdoOyBpZiB5b3UgdXNlIGl0LCByZW1lbWJlciB0aGF0IGluZm9ybWF0aW9uIGluIHRoZQotaW50cm9kdWN0aW9uIGRvZXMgbm90IG1ha2UgaXQgaW50byB0aGUga2VybmVsIGNoYW5nZWxvZ3MuICBTbyBwbGVhc2UgZW5zdXJlCi10aGF0IHRoZSBwYXRjaGVzLCB0aGVtc2VsdmVzLCBoYXZlIGNvbXBsZXRlIGNoYW5nZWxvZyBpbmZvcm1hdGlvbi4KLQotSW4gZ2VuZXJhbCwgdGhlIHNlY29uZCBhbmQgZm9sbG93aW5nIHBhcnRzIG9mIGEgbXVsdGktcGFydCBwYXRjaCBzaG91bGQgYmUKLXNlbnQgYXMgYSByZXBseSB0byB0aGUgZmlyc3QgcGFydCBzbyB0aGF0IHRoZXkgYWxsIHRocmVhZCB0b2dldGhlciBhdCB0aGUKLXJlY2VpdmluZyBlbmQuICBUb29scyBsaWtlIGdpdCBhbmQgcXVpbHQgaGF2ZSBjb21tYW5kcyB0byBtYWlsIG91dCBhIHNldCBvZgotcGF0Y2hlcyB3aXRoIHRoZSBwcm9wZXIgdGhyZWFkaW5nLiAgSWYgeW91IGhhdmUgYSBsb25nIHNlcmllcywgdGhvdWdoLCBhbmQKLWFyZSB1c2luZyBnaXQsIHBsZWFzZSBzdGF5IGF3YXkgZnJvbSB0aGUgLS1jaGFpbi1yZXBseS10byBvcHRpb24gdG8gYXZvaWQKLWNyZWF0aW5nIGV4Y2VwdGlvbmFsbHkgZGVlcCBuZXN0aW5nLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzUuUG9zdGluZy5yc3QgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNS5Qb3N0aW5nLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTExZGRmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzUuUG9zdGluZy5yc3QKQEAgLTAsMCArMSwzMjEgQEAKKy4uIF9kZXZlbG9wbWVudF9wb3N0aW5nOgorCitQb3N0aW5nIHBhdGNoZXMKKz09PT09PT09PT09PT09PQorCitTb29uZXIgb3IgbGF0ZXIsIHRoZSB0aW1lIGNvbWVzIHdoZW4geW91ciB3b3JrIGlzIHJlYWR5IHRvIGJlIHByZXNlbnRlZCB0bwordGhlIGNvbW11bml0eSBmb3IgcmV2aWV3IGFuZCwgZXZlbnR1YWxseSwgaW5jbHVzaW9uIGludG8gdGhlIG1haW5saW5lCitrZXJuZWwuICBVbnN1cnByaXNpbmdseSwgdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBjb21tdW5pdHkgaGFzIGV2b2x2ZWQgYSBzZXQKK29mIGNvbnZlbnRpb25zIGFuZCBwcm9jZWR1cmVzIHdoaWNoIGFyZSB1c2VkIGluIHRoZSBwb3N0aW5nIG9mIHBhdGNoZXM7Citmb2xsb3dpbmcgdGhlbSB3aWxsIG1ha2UgbGlmZSBtdWNoIGVhc2llciBmb3IgZXZlcnlib2R5IGludm9sdmVkLiAgVGhpcworZG9jdW1lbnQgd2lsbCBhdHRlbXB0IHRvIGNvdmVyIHRoZXNlIGV4cGVjdGF0aW9ucyBpbiByZWFzb25hYmxlIGRldGFpbDsKK21vcmUgaW5mb3JtYXRpb24gY2FuIGFsc28gYmUgZm91bmQgaW4gdGhlIGZpbGVzIFN1Ym1pdHRpbmdQYXRjaGVzLAorU3VibWl0dGluZ0RyaXZlcnMsIGFuZCBTdWJtaXRDaGVja2xpc3QgaW4gdGhlIGtlcm5lbCBkb2N1bWVudGF0aW9uCitkaXJlY3RvcnkuCisKKworV2hlbiB0byBwb3N0CistLS0tLS0tLS0tLS0KKworVGhlcmUgaXMgYSBjb25zdGFudCB0ZW1wdGF0aW9uIHRvIGF2b2lkIHBvc3RpbmcgcGF0Y2hlcyBiZWZvcmUgdGhleSBhcmUKK2NvbXBsZXRlbHkgInJlYWR5LiIgIEZvciBzaW1wbGUgcGF0Y2hlcywgdGhhdCBpcyBub3QgYSBwcm9ibGVtLiAgSWYgdGhlCit3b3JrIGJlaW5nIGRvbmUgaXMgY29tcGxleCwgdGhvdWdoLCB0aGVyZSBpcyBhIGxvdCB0byBiZSBnYWluZWQgYnkgZ2V0dGluZworZmVlZGJhY2sgZnJvbSB0aGUgY29tbXVuaXR5IGJlZm9yZSB0aGUgd29yayBpcyBjb21wbGV0ZS4gIFNvIHlvdSBzaG91bGQKK2NvbnNpZGVyIHBvc3RpbmcgaW4tcHJvZ3Jlc3Mgd29yaywgb3IgZXZlbiBtYWtpbmcgYSBnaXQgdHJlZSBhdmFpbGFibGUgc28KK3RoYXQgaW50ZXJlc3RlZCBkZXZlbG9wZXJzIGNhbiBjYXRjaCB1cCB3aXRoIHlvdXIgd29yayBhdCBhbnkgdGltZS4KKworV2hlbiBwb3N0aW5nIGNvZGUgd2hpY2ggaXMgbm90IHlldCBjb25zaWRlcmVkIHJlYWR5IGZvciBpbmNsdXNpb24sIGl0IGlzIGEKK2dvb2QgaWRlYSB0byBzYXkgc28gaW4gdGhlIHBvc3RpbmcgaXRzZWxmLiAgQWxzbyBtZW50aW9uIGFueSBtYWpvciB3b3JrCit3aGljaCByZW1haW5zIHRvIGJlIGRvbmUgYW5kIGFueSBrbm93biBwcm9ibGVtcy4gIEZld2VyIHBlb3BsZSB3aWxsIGxvb2sgYXQKK3BhdGNoZXMgd2hpY2ggYXJlIGtub3duIHRvIGJlIGhhbGYtYmFrZWQsIGJ1dCB0aG9zZSB3aG8gZG8gd2lsbCBjb21lIGluCit3aXRoIHRoZSBpZGVhIHRoYXQgdGhleSBjYW4gaGVscCB5b3UgZHJpdmUgdGhlIHdvcmsgaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbi4KKworCitCZWZvcmUgY3JlYXRpbmcgcGF0Y2hlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRoaW5ncyB3aGljaCBzaG91bGQgYmUgZG9uZSBiZWZvcmUgeW91IGNvbnNpZGVyCitzZW5kaW5nIHBhdGNoZXMgdG8gdGhlIGRldmVsb3BtZW50IGNvbW11bml0eS4gIFRoZXNlIGluY2x1ZGU6CisKKyAtIFRlc3QgdGhlIGNvZGUgdG8gdGhlIGV4dGVudCB0aGF0IHlvdSBjYW4uICBNYWtlIHVzZSBvZiB0aGUga2VybmVsJ3MKKyAgIGRlYnVnZ2luZyB0b29scywgZW5zdXJlIHRoYXQgdGhlIGtlcm5lbCB3aWxsIGJ1aWxkIHdpdGggYWxsIHJlYXNvbmFibGUKKyAgIGNvbWJpbmF0aW9ucyBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHVzZSBjcm9zcy1jb21waWxlcnMgdG8gYnVpbGQgZm9yCisgICBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcywgZXRjLgorCisgLSBNYWtlIHN1cmUgeW91ciBjb2RlIGlzIGNvbXBsaWFudCB3aXRoIHRoZSBrZXJuZWwgY29kaW5nIHN0eWxlCisgICBndWlkZWxpbmVzLgorCisgLSBEb2VzIHlvdXIgY2hhbmdlIGhhdmUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zPyAgSWYgc28sIHlvdSBzaG91bGQgcnVuCisgICBiZW5jaG1hcmtzIHNob3dpbmcgd2hhdCB0aGUgaW1wYWN0IChvciBiZW5lZml0KSBvZiB5b3VyIGNoYW5nZSBpczsgYQorICAgc3VtbWFyeSBvZiB0aGUgcmVzdWx0cyBzaG91bGQgYmUgaW5jbHVkZWQgd2l0aCB0aGUgcGF0Y2guCisKKyAtIEJlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgcmlnaHQgdG8gcG9zdCB0aGUgY29kZS4gIElmIHRoaXMgd29yayB3YXMgZG9uZQorICAgZm9yIGFuIGVtcGxveWVyLCB0aGUgZW1wbG95ZXIgbGlrZWx5IGhhcyBhIHJpZ2h0IHRvIHRoZSB3b3JrIGFuZCBtdXN0IGJlCisgICBhZ3JlZWFibGUgd2l0aCBpdHMgcmVsZWFzZSB1bmRlciB0aGUgR1BMLgorCitBcyBhIGdlbmVyYWwgcnVsZSwgcHV0dGluZyBpbiBzb21lIGV4dHJhIHRob3VnaHQgYmVmb3JlIHBvc3RpbmcgY29kZSBhbG1vc3QKK2Fsd2F5cyBwYXlzIGJhY2sgdGhlIGVmZm9ydCBpbiBzaG9ydCBvcmRlci4KKworCitQYXRjaCBwcmVwYXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHByZXBhcmF0aW9uIG9mIHBhdGNoZXMgZm9yIHBvc3RpbmcgY2FuIGJlIGEgc3VycHJpc2luZyBhbW91bnQgb2Ygd29yaywKK2J1dCwgb25jZSBhZ2FpbiwgYXR0ZW1wdGluZyB0byBzYXZlIHRpbWUgaGVyZSBpcyBub3QgZ2VuZXJhbGx5IGFkdmlzYWJsZQorZXZlbiBpbiB0aGUgc2hvcnQgdGVybS4KKworUGF0Y2hlcyBtdXN0IGJlIHByZXBhcmVkIGFnYWluc3QgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBrZXJuZWwuICBBcyBhCitnZW5lcmFsIHJ1bGUsIGEgcGF0Y2ggc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBjdXJyZW50IG1haW5saW5lIGFzIGZvdW5kIGluCitMaW51cydzIGdpdCB0cmVlLiAgV2hlbiBiYXNpbmcgb24gbWFpbmxpbmUsIHN0YXJ0IHdpdGggYSB3ZWxsLWtub3duIHJlbGVhc2UKK3BvaW50IC0gYSBzdGFibGUgb3IgLXJjIHJlbGVhc2UgLSByYXRoZXIgdGhhbiBicmFuY2hpbmcgb2ZmIHRoZSBtYWlubGluZSBhdAorYW4gYXJiaXRyYXJ5IHNwb3QuCisKK0l0IG1heSBiZWNvbWUgbmVjZXNzYXJ5IHRvIG1ha2UgdmVyc2lvbnMgYWdhaW5zdCAtbW0sIGxpbnV4LW5leHQsIG9yIGEKK3N1YnN5c3RlbSB0cmVlLCB0aG91Z2gsIHRvIGZhY2lsaXRhdGUgd2lkZXIgdGVzdGluZyBhbmQgcmV2aWV3LiAgRGVwZW5kaW5nCitvbiB0aGUgYXJlYSBvZiB5b3VyIHBhdGNoIGFuZCB3aGF0IGlzIGdvaW5nIG9uIGVsc2V3aGVyZSwgYmFzaW5nIGEgcGF0Y2gKK2FnYWluc3QgdGhlc2Ugb3RoZXIgdHJlZXMgY2FuIHJlcXVpcmUgYSBzaWduaWZpY2FudCBhbW91bnQgb2Ygd29yaworcmVzb2x2aW5nIGNvbmZsaWN0cyBhbmQgZGVhbGluZyB3aXRoIEFQSSBjaGFuZ2VzLgorCitPbmx5IHRoZSBtb3N0IHNpbXBsZSBjaGFuZ2VzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgYSBzaW5nbGUgcGF0Y2g7CitldmVyeXRoaW5nIGVsc2Ugc2hvdWxkIGJlIG1hZGUgYXMgYSBsb2dpY2FsIHNlcmllcyBvZiBjaGFuZ2VzLiAgU3BsaXR0aW5nCit1cCBwYXRjaGVzIGlzIGEgYml0IG9mIGFuIGFydDsgc29tZSBkZXZlbG9wZXJzIHNwZW5kIGEgbG9uZyB0aW1lIGZpZ3VyaW5nCitvdXQgaG93IHRvIGRvIGl0IGluIHRoZSB3YXkgdGhhdCB0aGUgY29tbXVuaXR5IGV4cGVjdHMuICBUaGVyZSBhcmUgYSBmZXcKK3J1bGVzIG9mIHRodW1iLCBob3dldmVyLCB3aGljaCBjYW4gaGVscCBjb25zaWRlcmFibHk6CisKKyAtIFRoZSBwYXRjaCBzZXJpZXMgeW91IHBvc3Qgd2lsbCBhbG1vc3QgY2VydGFpbmx5IG5vdCBiZSB0aGUgc2VyaWVzIG9mCisgICBjaGFuZ2VzIGZvdW5kIGluIHlvdXIgd29ya2luZyByZXZpc2lvbiBjb250cm9sIHN5c3RlbS4gIEluc3RlYWQsIHRoZQorICAgY2hhbmdlcyB5b3UgaGF2ZSBtYWRlIG5lZWQgdG8gYmUgY29uc2lkZXJlZCBpbiB0aGVpciBmaW5hbCBmb3JtLCB0aGVuCisgICBzcGxpdCBhcGFydCBpbiB3YXlzIHdoaWNoIG1ha2Ugc2Vuc2UuICBUaGUgZGV2ZWxvcGVycyBhcmUgaW50ZXJlc3RlZCBpbgorICAgZGlzY3JldGUsIHNlbGYtY29udGFpbmVkIGNoYW5nZXMsIG5vdCB0aGUgcGF0aCB5b3UgdG9vayB0byBnZXQgdG8gdGhvc2UKKyAgIGNoYW5nZXMuCisKKyAtIEVhY2ggbG9naWNhbGx5IGluZGVwZW5kZW50IGNoYW5nZSBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIGEgc2VwYXJhdGUKKyAgIHBhdGNoLiAgVGhlc2UgY2hhbmdlcyBjYW4gYmUgc21hbGwgKCJhZGQgYSBmaWVsZCB0byB0aGlzIHN0cnVjdHVyZSIpIG9yCisgICBsYXJnZSAoYWRkaW5nIGEgc2lnbmlmaWNhbnQgbmV3IGRyaXZlciwgZm9yIGV4YW1wbGUpLCBidXQgdGhleSBzaG91bGQgYmUKKyAgIGNvbmNlcHR1YWxseSBzbWFsbCBhbmQgYW1lbmFibGUgdG8gYSBvbmUtbGluZSBkZXNjcmlwdGlvbi4gIEVhY2ggcGF0Y2gKKyAgIHNob3VsZCBtYWtlIGEgc3BlY2lmaWMgY2hhbmdlIHdoaWNoIGNhbiBiZSByZXZpZXdlZCBvbiBpdHMgb3duIGFuZAorICAgdmVyaWZpZWQgdG8gZG8gd2hhdCBpdCBzYXlzIGl0IGRvZXMuCisKKyAtIEFzIGEgd2F5IG9mIHJlc3RhdGluZyB0aGUgZ3VpZGVsaW5lIGFib3ZlOiBkbyBub3QgbWl4IGRpZmZlcmVudCB0eXBlcyBvZgorICAgY2hhbmdlcyBpbiB0aGUgc2FtZSBwYXRjaC4gIElmIGEgc2luZ2xlIHBhdGNoIGZpeGVzIGEgY3JpdGljYWwgc2VjdXJpdHkKKyAgIGJ1ZywgcmVhcnJhbmdlcyBhIGZldyBzdHJ1Y3R1cmVzLCBhbmQgcmVmb3JtYXRzIHRoZSBjb2RlLCB0aGVyZSBpcyBhCisgICBnb29kIGNoYW5jZSB0aGF0IGl0IHdpbGwgYmUgcGFzc2VkIG92ZXIgYW5kIHRoZSBpbXBvcnRhbnQgZml4IHdpbGwgYmUKKyAgIGxvc3QuCisKKyAtIEVhY2ggcGF0Y2ggc2hvdWxkIHlpZWxkIGEga2VybmVsIHdoaWNoIGJ1aWxkcyBhbmQgcnVucyBwcm9wZXJseTsgaWYgeW91cgorICAgcGF0Y2ggc2VyaWVzIGlzIGludGVycnVwdGVkIGluIHRoZSBtaWRkbGUsIHRoZSByZXN1bHQgc2hvdWxkIHN0aWxsIGJlIGEKKyAgIHdvcmtpbmcga2VybmVsLiAgUGFydGlhbCBhcHBsaWNhdGlvbiBvZiBhIHBhdGNoIHNlcmllcyBpcyBhIGNvbW1vbgorICAgc2NlbmFyaW8gd2hlbiB0aGUgImdpdCBiaXNlY3QiIHRvb2wgaXMgdXNlZCB0byBmaW5kIHJlZ3Jlc3Npb25zOyBpZiB0aGUKKyAgIHJlc3VsdCBpcyBhIGJyb2tlbiBrZXJuZWwsIHlvdSB3aWxsIG1ha2UgbGlmZSBoYXJkZXIgZm9yIGRldmVsb3BlcnMgYW5kCisgICB1c2VycyB3aG8gYXJlIGVuZ2FnaW5nIGluIHRoZSBub2JsZSB3b3JrIG9mIHRyYWNraW5nIGRvd24gcHJvYmxlbXMuCisKKyAtIERvIG5vdCBvdmVyZG8gaXQsIHRob3VnaC4gIE9uZSBkZXZlbG9wZXIgb25jZSBwb3N0ZWQgYSBzZXQgb2YgZWRpdHMKKyAgIHRvIGEgc2luZ2xlIGZpbGUgYXMgNTAwIHNlcGFyYXRlIHBhdGNoZXMgLSBhbiBhY3Qgd2hpY2ggZGlkIG5vdCBtYWtlIGhpbQorICAgdGhlIG1vc3QgcG9wdWxhciBwZXJzb24gb24gdGhlIGtlcm5lbCBtYWlsaW5nIGxpc3QuICBBIHNpbmdsZSBwYXRjaCBjYW4KKyAgIGJlIHJlYXNvbmFibHkgbGFyZ2UgYXMgbG9uZyBhcyBpdCBzdGlsbCBjb250YWlucyBhIHNpbmdsZSAqbG9naWNhbCoKKyAgIGNoYW5nZS4KKworIC0gSXQgY2FuIGJlIHRlbXB0aW5nIHRvIGFkZCBhIHdob2xlIG5ldyBpbmZyYXN0cnVjdHVyZSB3aXRoIGEgc2VyaWVzIG9mCisgICBwYXRjaGVzLCBidXQgdG8gbGVhdmUgdGhhdCBpbmZyYXN0cnVjdHVyZSB1bnVzZWQgdW50aWwgdGhlIGZpbmFsIHBhdGNoCisgICBpbiB0aGUgc2VyaWVzIGVuYWJsZXMgdGhlIHdob2xlIHRoaW5nLiAgVGhpcyB0ZW1wdGF0aW9uIHNob3VsZCBiZQorICAgYXZvaWRlZCBpZiBwb3NzaWJsZTsgaWYgdGhhdCBzZXJpZXMgYWRkcyByZWdyZXNzaW9ucywgYmlzZWN0aW9uIHdpbGwKKyAgIGZpbmdlciB0aGUgbGFzdCBwYXRjaCBhcyB0aGUgb25lIHdoaWNoIGNhdXNlZCB0aGUgcHJvYmxlbSwgZXZlbiB0aG91Z2gKKyAgIHRoZSByZWFsIGJ1ZyBpcyBlbHNld2hlcmUuICBXaGVuZXZlciBwb3NzaWJsZSwgYSBwYXRjaCB3aGljaCBhZGRzIG5ldworICAgY29kZSBzaG91bGQgbWFrZSB0aGF0IGNvZGUgYWN0aXZlIGltbWVkaWF0ZWx5LgorCitXb3JraW5nIHRvIGNyZWF0ZSB0aGUgcGVyZmVjdCBwYXRjaCBzZXJpZXMgY2FuIGJlIGEgZnJ1c3RyYXRpbmcgcHJvY2Vzcword2hpY2ggdGFrZXMgcXVpdGUgYSBiaXQgb2YgdGltZSBhbmQgdGhvdWdodCBhZnRlciB0aGUgInJlYWwgd29yayIgaGFzIGJlZW4KK2RvbmUuICBXaGVuIGRvbmUgcHJvcGVybHksIHRob3VnaCwgaXQgaXMgdGltZSB3ZWxsIHNwZW50LgorCisKK1BhdGNoIGZvcm1hdHRpbmcgYW5kIGNoYW5nZWxvZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU28gbm93IHlvdSBoYXZlIGEgcGVyZmVjdCBzZXJpZXMgb2YgcGF0Y2hlcyBmb3IgcG9zdGluZywgYnV0IHRoZSB3b3JrIGlzCitub3QgZG9uZSBxdWl0ZSB5ZXQuICBFYWNoIHBhdGNoIG5lZWRzIHRvIGJlIGZvcm1hdHRlZCBpbnRvIGEgbWVzc2FnZSB3aGljaAorcXVpY2tseSBhbmQgY2xlYXJseSBjb21tdW5pY2F0ZXMgaXRzIHB1cnBvc2UgdG8gdGhlIHJlc3Qgb2YgdGhlIHdvcmxkLiAgVG8KK3RoYXQgZW5kLCBlYWNoIHBhdGNoIHdpbGwgYmUgY29tcG9zZWQgb2YgdGhlIGZvbGxvd2luZzoKKworIC0gQW4gb3B0aW9uYWwgIkZyb20iIGxpbmUgbmFtaW5nIHRoZSBhdXRob3Igb2YgdGhlIHBhdGNoLiAgVGhpcyBsaW5lIGlzCisgICBvbmx5IG5lY2Vzc2FyeSBpZiB5b3UgYXJlIHBhc3Npbmcgb24gc29tZWJvZHkgZWxzZSdzIHBhdGNoIHZpYSBlbWFpbCwKKyAgIGJ1dCBpdCBuZXZlciBodXJ0cyB0byBhZGQgaXQgd2hlbiBpbiBkb3VidC4KKworIC0gQSBvbmUtbGluZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBwYXRjaCBkb2VzLiAgVGhpcyBtZXNzYWdlIHNob3VsZCBiZQorICAgZW5vdWdoIGZvciBhIHJlYWRlciB3aG8gc2VlcyBpdCB3aXRoIG5vIG90aGVyIGNvbnRleHQgdG8gZmlndXJlIG91dCB0aGUKKyAgIHNjb3BlIG9mIHRoZSBwYXRjaDsgaXQgaXMgdGhlIGxpbmUgdGhhdCB3aWxsIHNob3cgdXAgaW4gdGhlICJzaG9ydCBmb3JtIgorICAgY2hhbmdlbG9ncy4gIFRoaXMgbWVzc2FnZSBpcyB1c3VhbGx5IGZvcm1hdHRlZCB3aXRoIHRoZSByZWxldmFudAorICAgc3Vic3lzdGVtIG5hbWUgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSBwdXJwb3NlIG9mIHRoZSBwYXRjaC4gIEZvcgorICAgZXhhbXBsZToKKworICAgOjoKKworCWdwaW86IGZpeCBidWlsZCBvbiBDT05GSUdfR1BJT19TWVNGUz1uCisKKyAtIEEgYmxhbmsgbGluZSBmb2xsb3dlZCBieSBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBjb250ZW50cyBvZiB0aGUKKyAgIHBhdGNoLiAgVGhpcyBkZXNjcmlwdGlvbiBjYW4gYmUgYXMgbG9uZyBhcyBpcyByZXF1aXJlZDsgaXQgc2hvdWxkIHNheQorICAgd2hhdCB0aGUgcGF0Y2ggZG9lcyBhbmQgd2h5IGl0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBrZXJuZWwuCisKKyAtIE9uZSBvciBtb3JlIHRhZyBsaW5lcywgd2l0aCwgYXQgYSBtaW5pbXVtLCBvbmUgU2lnbmVkLW9mZi1ieTogbGluZSBmcm9tCisgICB0aGUgYXV0aG9yIG9mIHRoZSBwYXRjaC4gIFRhZ3Mgd2lsbCBiZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgYmVsb3cuCisKK1RoZSBpdGVtcyBhYm92ZSwgdG9nZXRoZXIsIGZvcm0gdGhlIGNoYW5nZWxvZyBmb3IgdGhlIHBhdGNoLiAgV3JpdGluZyBnb29kCitjaGFuZ2Vsb2dzIGlzIGEgY3J1Y2lhbCBidXQgb2Z0ZW4tbmVnbGVjdGVkIGFydDsgaXQncyB3b3J0aCBzcGVuZGluZworYW5vdGhlciBtb21lbnQgZGlzY3Vzc2luZyB0aGlzIGlzc3VlLiAgV2hlbiB3cml0aW5nIGEgY2hhbmdlbG9nLCB5b3Ugc2hvdWxkCitiZWFyIGluIG1pbmQgdGhhdCBhIG51bWJlciBvZiBkaWZmZXJlbnQgcGVvcGxlIHdpbGwgYmUgcmVhZGluZyB5b3VyIHdvcmRzLgorVGhlc2UgaW5jbHVkZSBzdWJzeXN0ZW0gbWFpbnRhaW5lcnMgYW5kIHJldmlld2VycyB3aG8gbmVlZCB0byBkZWNpZGUKK3doZXRoZXIgdGhlIHBhdGNoIHNob3VsZCBiZSBpbmNsdWRlZCwgZGlzdHJpYnV0b3JzIGFuZCBvdGhlciBtYWludGFpbmVycwordHJ5aW5nIHRvIGRlY2lkZSB3aGV0aGVyIGEgcGF0Y2ggc2hvdWxkIGJlIGJhY2twb3J0ZWQgdG8gb3RoZXIga2VybmVscywgYnVnCitodW50ZXJzIHdvbmRlcmluZyB3aGV0aGVyIHRoZSBwYXRjaCBpcyByZXNwb25zaWJsZSBmb3IgYSBwcm9ibGVtIHRoZXkgYXJlCitjaGFzaW5nLCB1c2VycyB3aG8gd2FudCB0byBrbm93IGhvdyB0aGUga2VybmVsIGhhcyBjaGFuZ2VkLCBhbmQgbW9yZS4gIEEKK2dvb2QgY2hhbmdlbG9nIGNvbnZleXMgdGhlIG5lZWRlZCBpbmZvcm1hdGlvbiB0byBhbGwgb2YgdGhlc2UgcGVvcGxlIGluIHRoZQorbW9zdCBkaXJlY3QgYW5kIGNvbmNpc2Ugd2F5IHBvc3NpYmxlLgorCitUbyB0aGF0IGVuZCwgdGhlIHN1bW1hcnkgbGluZSBzaG91bGQgZGVzY3JpYmUgdGhlIGVmZmVjdHMgb2YgYW5kIG1vdGl2YXRpb24KK2ZvciB0aGUgY2hhbmdlIGFzIHdlbGwgYXMgcG9zc2libGUgZ2l2ZW4gdGhlIG9uZS1saW5lIGNvbnN0cmFpbnQuICBUaGUKK2RldGFpbGVkIGRlc2NyaXB0aW9uIGNhbiB0aGVuIGFtcGxpZnkgb24gdGhvc2UgdG9waWNzIGFuZCBwcm92aWRlIGFueQorbmVlZGVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uICBJZiB0aGUgcGF0Y2ggZml4ZXMgYSBidWcsIGNpdGUgdGhlIGNvbW1pdAord2hpY2ggaW50cm9kdWNlZCB0aGUgYnVnIGlmIHBvc3NpYmxlIChhbmQgcGxlYXNlIHByb3ZpZGUgYm90aCB0aGUgY29tbWl0IElECithbmQgdGhlIHRpdGxlIHdoZW4gY2l0aW5nIGNvbW1pdHMpLiAgSWYgYSBwcm9ibGVtIGlzIGFzc29jaWF0ZWQgd2l0aAorc3BlY2lmaWMgbG9nIG9yIGNvbXBpbGVyIG91dHB1dCwgaW5jbHVkZSB0aGF0IG91dHB1dCB0byBoZWxwIG90aGVycworc2VhcmNoaW5nIGZvciBhIHNvbHV0aW9uIHRvIHRoZSBzYW1lIHByb2JsZW0uICBJZiB0aGUgY2hhbmdlIGlzIG1lYW50IHRvCitzdXBwb3J0IG90aGVyIGNoYW5nZXMgY29taW5nIGluIGxhdGVyIHBhdGNoLCBzYXkgc28uICBJZiBpbnRlcm5hbCBBUElzIGFyZQorY2hhbmdlZCwgZGV0YWlsIHRob3NlIGNoYW5nZXMgYW5kIGhvdyBvdGhlciBkZXZlbG9wZXJzIHNob3VsZCByZXNwb25kLiAgSW4KK2dlbmVyYWwsIHRoZSBtb3JlIHlvdSBjYW4gcHV0IHlvdXJzZWxmIGludG8gdGhlIHNob2VzIG9mIGV2ZXJ5Ym9keSB3aG8gd2lsbAorYmUgcmVhZGluZyB5b3VyIGNoYW5nZWxvZywgdGhlIGJldHRlciB0aGF0IGNoYW5nZWxvZyAoYW5kIHRoZSBrZXJuZWwgYXMgYQord2hvbGUpIHdpbGwgYmUuCisKK05lZWRsZXNzIHRvIHNheSwgdGhlIGNoYW5nZWxvZyBzaG91bGQgYmUgdGhlIHRleHQgdXNlZCB3aGVuIGNvbW1pdHRpbmcgdGhlCitjaGFuZ2UgdG8gYSByZXZpc2lvbiBjb250cm9sIHN5c3RlbS4gIEl0IHdpbGwgYmUgZm9sbG93ZWQgYnk6CisKKyAtIFRoZSBwYXRjaCBpdHNlbGYsIGluIHRoZSB1bmlmaWVkICgiLXUiKSBwYXRjaCBmb3JtYXQuICBVc2luZyB0aGUgIi1wIgorICAgb3B0aW9uIHRvIGRpZmYgd2lsbCBhc3NvY2lhdGUgZnVuY3Rpb24gbmFtZXMgd2l0aCBjaGFuZ2VzLCBtYWtpbmcgdGhlCisgICByZXN1bHRpbmcgcGF0Y2ggZWFzaWVyIGZvciBvdGhlcnMgdG8gcmVhZC4KKworWW91IHNob3VsZCBhdm9pZCBpbmNsdWRpbmcgY2hhbmdlcyB0byBpcnJlbGV2YW50IGZpbGVzICh0aG9zZSBnZW5lcmF0ZWQgYnkKK3RoZSBidWlsZCBwcm9jZXNzLCBmb3IgZXhhbXBsZSwgb3IgZWRpdG9yIGJhY2t1cCBmaWxlcykgaW4gdGhlIHBhdGNoLiAgVGhlCitmaWxlICJkb250ZGlmZiIgaW4gdGhlIERvY3VtZW50YXRpb24gZGlyZWN0b3J5IGNhbiBoZWxwIGluIHRoaXMgcmVnYXJkOworcGFzcyBpdCB0byBkaWZmIHdpdGggdGhlICItWCIgb3B0aW9uLgorCitUaGUgdGFncyBtZW50aW9uZWQgYWJvdmUgYXJlIHVzZWQgdG8gZGVzY3JpYmUgaG93IHZhcmlvdXMgZGV2ZWxvcGVycyBoYXZlCitiZWVuIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBwYXRjaC4gIFRoZXkgYXJlIGRlc2NyaWJlZCBpbgorZGV0YWlsIGluIHRoZSBTdWJtaXR0aW5nUGF0Y2hlcyBkb2N1bWVudDsgd2hhdCBmb2xsb3dzIGhlcmUgaXMgYSBicmllZgorc3VtbWFyeS4gIEVhY2ggb2YgdGhlc2UgbGluZXMgaGFzIHRoZSBmb3JtYXQ6CisKKzo6CisKKwl0YWc6IEZ1bGwgTmFtZSA8ZW1haWwgYWRkcmVzcz4gIG9wdGlvbmFsLW90aGVyLXN0dWZmCisKK1RoZSB0YWdzIGluIGNvbW1vbiB1c2UgYXJlOgorCisgLSBTaWduZWQtb2ZmLWJ5OiB0aGlzIGlzIGEgZGV2ZWxvcGVyJ3MgY2VydGlmaWNhdGlvbiB0aGF0IGhlIG9yIHNoZSBoYXMKKyAgIHRoZSByaWdodCB0byBzdWJtaXQgdGhlIHBhdGNoIGZvciBpbmNsdXNpb24gaW50byB0aGUga2VybmVsLiAgSXQgaXMgYW4KKyAgIGFncmVlbWVudCB0byB0aGUgRGV2ZWxvcGVyJ3MgQ2VydGlmaWNhdGUgb2YgT3JpZ2luLCB0aGUgZnVsbCB0ZXh0IG9mCisgICB3aGljaCBjYW4gYmUgZm91bmQgaW4gRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcy4gIENvZGUgd2l0aG91dCBhCisgICBwcm9wZXIgc2lnbm9mZiBjYW5ub3QgYmUgbWVyZ2VkIGludG8gdGhlIG1haW5saW5lLgorCisgLSBBY2tlZC1ieTogaW5kaWNhdGVzIGFuIGFncmVlbWVudCBieSBhbm90aGVyIGRldmVsb3BlciAob2Z0ZW4gYQorICAgbWFpbnRhaW5lciBvZiB0aGUgcmVsZXZhbnQgY29kZSkgdGhhdCB0aGUgcGF0Y2ggaXMgYXBwcm9wcmlhdGUgZm9yCisgICBpbmNsdXNpb24gaW50byB0aGUga2VybmVsLgorCisgLSBUZXN0ZWQtYnk6IHN0YXRlcyB0aGF0IHRoZSBuYW1lZCBwZXJzb24gaGFzIHRlc3RlZCB0aGUgcGF0Y2ggYW5kIGZvdW5kCisgICBpdCB0byB3b3JrLgorCisgLSBSZXZpZXdlZC1ieTogdGhlIG5hbWVkIGRldmVsb3BlciBoYXMgcmV2aWV3ZWQgdGhlIHBhdGNoIGZvciBjb3JyZWN0bmVzczsKKyAgIHNlZSB0aGUgcmV2aWV3ZXIncyBzdGF0ZW1lbnQgaW4gRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyBmb3IgbW9yZQorICAgZGV0YWlsLgorCisgLSBSZXBvcnRlZC1ieTogbmFtZXMgYSB1c2VyIHdobyByZXBvcnRlZCBhIHByb2JsZW0gd2hpY2ggaXMgZml4ZWQgYnkgdGhpcworICAgcGF0Y2g7IHRoaXMgdGFnIGlzIHVzZWQgdG8gZ2l2ZSBjcmVkaXQgdG8gdGhlIChvZnRlbiB1bmRlcmFwcHJlY2lhdGVkKQorICAgcGVvcGxlIHdobyB0ZXN0IG91ciBjb2RlIGFuZCBsZXQgdXMga25vdyB3aGVuIHRoaW5ncyBkbyBub3Qgd29yaworICAgY29ycmVjdGx5LgorCisgLSBDYzogdGhlIG5hbWVkIHBlcnNvbiByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIHBhdGNoIGFuZCBoYWQgdGhlCisgICBvcHBvcnR1bml0eSB0byBjb21tZW50IG9uIGl0LgorCitCZSBjYXJlZnVsIGluIHRoZSBhZGRpdGlvbiBvZiB0YWdzIHRvIHlvdXIgcGF0Y2hlczogb25seSBDYzogaXMgYXBwcm9wcmlhdGUKK2ZvciBhZGRpdGlvbiB3aXRob3V0IHRoZSBleHBsaWNpdCBwZXJtaXNzaW9uIG9mIHRoZSBwZXJzb24gbmFtZWQuCisKKworU2VuZGluZyB0aGUgcGF0Y2gKKy0tLS0tLS0tLS0tLS0tLS0tCisKK0JlZm9yZSB5b3UgbWFpbCB5b3VyIHBhdGNoZXMsIHRoZXJlIGFyZSBhIGNvdXBsZSBvZiBvdGhlciB0aGluZ3MgeW91IHNob3VsZAordGFrZSBjYXJlIG9mOgorCisgLSBBcmUgeW91IHN1cmUgdGhhdCB5b3VyIG1haWxlciB3aWxsIG5vdCBjb3JydXB0IHRoZSBwYXRjaGVzPyAgUGF0Y2hlcworICAgd2hpY2ggaGF2ZSBoYWQgZ3JhdHVpdG91cyB3aGl0ZS1zcGFjZSBjaGFuZ2VzIG9yIGxpbmUgd3JhcHBpbmcgcGVyZm9ybWVkCisgICBieSB0aGUgbWFpbCBjbGllbnQgd2lsbCBub3QgYXBwbHkgYXQgdGhlIG90aGVyIGVuZCwgYW5kIG9mdGVuIHdpbGwgbm90CisgICBiZSBleGFtaW5lZCBpbiBhbnkgZGV0YWlsLiAgSWYgdGhlcmUgaXMgYW55IGRvdWJ0IGF0IGFsbCwgbWFpbCB0aGUgcGF0Y2gKKyAgIHRvIHlvdXJzZWxmIGFuZCBjb252aW5jZSB5b3Vyc2VsZiB0aGF0IGl0IHNob3dzIHVwIGludGFjdC4KKworICAgRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dCBoYXMgc29tZSBoZWxwZnVsIGhpbnRzIG9uIG1ha2luZworICAgc3BlY2lmaWMgbWFpbCBjbGllbnRzIHdvcmsgZm9yIHNlbmRpbmcgcGF0Y2hlcy4KKworIC0gQXJlIHlvdSBzdXJlIHlvdXIgcGF0Y2ggaXMgZnJlZSBvZiBzaWxseSBtaXN0YWtlcz8gIFlvdSBzaG91bGQgYWx3YXlzCisgICBydW4gcGF0Y2hlcyB0aHJvdWdoIHNjcmlwdHMvY2hlY2twYXRjaC5wbCBhbmQgYWRkcmVzcyB0aGUgY29tcGxhaW50cyBpdAorICAgY29tZXMgdXAgd2l0aC4gIFBsZWFzZSBiZWFyIGluIG1pbmQgdGhhdCBjaGVja3BhdGNoLnBsLCB3aGlsZSBiZWluZyB0aGUKKyAgIGVtYm9kaW1lbnQgb2YgYSBmYWlyIGFtb3VudCBvZiB0aG91Z2h0IGFib3V0IHdoYXQga2VybmVsIHBhdGNoZXMgc2hvdWxkCisgICBsb29rIGxpa2UsIGlzIG5vdCBzbWFydGVyIHRoYW4geW91LiAgSWYgZml4aW5nIGEgY2hlY2twYXRjaC5wbCBjb21wbGFpbnQKKyAgIHdvdWxkIG1ha2UgdGhlIGNvZGUgd29yc2UsIGRvbid0IGRvIGl0LgorCitQYXRjaGVzIHNob3VsZCBhbHdheXMgYmUgc2VudCBhcyBwbGFpbiB0ZXh0LiAgUGxlYXNlIGRvIG5vdCBzZW5kIHRoZW0gYXMKK2F0dGFjaG1lbnRzOyB0aGF0IG1ha2VzIGl0IG11Y2ggaGFyZGVyIGZvciByZXZpZXdlcnMgdG8gcXVvdGUgc2VjdGlvbnMgb2YKK3RoZSBwYXRjaCBpbiB0aGVpciByZXBsaWVzLiAgSW5zdGVhZCwganVzdCBwdXQgdGhlIHBhdGNoIGRpcmVjdGx5IGludG8geW91cgorbWVzc2FnZS4KKworV2hlbiBtYWlsaW5nIHBhdGNoZXMsIGl0IGlzIGltcG9ydGFudCB0byBzZW5kIGNvcGllcyB0byBhbnlib2R5IHdobyBtaWdodAorYmUgaW50ZXJlc3RlZCBpbiBpdC4gIFVubGlrZSBzb21lIG90aGVyIHByb2plY3RzLCB0aGUga2VybmVsIGVuY291cmFnZXMKK3Blb3BsZSB0byBlcnIgb24gdGhlIHNpZGUgb2Ygc2VuZGluZyB0b28gbWFueSBjb3BpZXM7IGRvbid0IGFzc3VtZSB0aGF0IHRoZQorcmVsZXZhbnQgcGVvcGxlIHdpbGwgc2VlIHlvdXIgcG9zdGluZyBvbiB0aGUgbWFpbGluZyBsaXN0cy4gIEluIHBhcnRpY3VsYXIsCitjb3BpZXMgc2hvdWxkIGdvIHRvOgorCisgLSBUaGUgbWFpbnRhaW5lcihzKSBvZiB0aGUgYWZmZWN0ZWQgc3Vic3lzdGVtKHMpLiAgQXMgZGVzY3JpYmVkIGVhcmxpZXIsCisgICB0aGUgTUFJTlRBSU5FUlMgZmlsZSBpcyB0aGUgZmlyc3QgcGxhY2UgdG8gbG9vayBmb3IgdGhlc2UgcGVvcGxlLgorCisgLSBPdGhlciBkZXZlbG9wZXJzIHdobyBoYXZlIGJlZW4gd29ya2luZyBpbiB0aGUgc2FtZSBhcmVhIC0gZXNwZWNpYWxseQorICAgdGhvc2Ugd2hvIG1pZ2h0IGJlIHdvcmtpbmcgdGhlcmUgbm93LiAgVXNpbmcgZ2l0IHRvIHNlZSB3aG8gZWxzZSBoYXMKKyAgIG1vZGlmaWVkIHRoZSBmaWxlcyB5b3UgYXJlIHdvcmtpbmcgb24gY2FuIGJlIGhlbHBmdWwuCisKKyAtIElmIHlvdSBhcmUgcmVzcG9uZGluZyB0byBhIGJ1ZyByZXBvcnQgb3IgYSBmZWF0dXJlIHJlcXVlc3QsIGNvcHkgdGhlCisgICBvcmlnaW5hbCBwb3N0ZXIgYXMgd2VsbC4KKworIC0gU2VuZCBhIGNvcHkgdG8gdGhlIHJlbGV2YW50IG1haWxpbmcgbGlzdCwgb3IsIGlmIG5vdGhpbmcgZWxzZSBhcHBsaWVzLAorICAgdGhlIGxpbnV4LWtlcm5lbCBsaXN0LgorCisgLSBJZiB5b3UgYXJlIGZpeGluZyBhIGJ1ZywgdGhpbmsgYWJvdXQgd2hldGhlciB0aGUgZml4IHNob3VsZCBnbyBpbnRvIHRoZQorICAgbmV4dCBzdGFibGUgdXBkYXRlLiAgSWYgc28sIHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmcgc2hvdWxkIGdldCBhIGNvcHkgb2YKKyAgIHRoZSBwYXRjaC4gIEFsc28gYWRkIGEgIkNjOiBzdGFibGVAdmdlci5rZXJuZWwub3JnIiB0byB0aGUgdGFncyB3aXRoaW4KKyAgIHRoZSBwYXRjaCBpdHNlbGY7IHRoYXQgd2lsbCBjYXVzZSB0aGUgc3RhYmxlIHRlYW0gdG8gZ2V0IGEgbm90aWZpY2F0aW9uCisgICB3aGVuIHlvdXIgZml4IGdvZXMgaW50byB0aGUgbWFpbmxpbmUuCisKK1doZW4gc2VsZWN0aW5nIHJlY2lwaWVudHMgZm9yIGEgcGF0Y2gsIGl0IGlzIGdvb2QgdG8gaGF2ZSBhbiBpZGVhIG9mIHdobworeW91IHRoaW5rIHdpbGwgZXZlbnR1YWxseSBhY2NlcHQgdGhlIHBhdGNoIGFuZCBnZXQgaXQgbWVyZ2VkLiAgV2hpbGUgaXQKK2lzIHBvc3NpYmxlIHRvIHNlbmQgcGF0Y2hlcyBkaXJlY3RseSB0byBMaW51cyBUb3J2YWxkcyBhbmQgaGF2ZSBoaW0gbWVyZ2UKK3RoZW0sIHRoaW5ncyBhcmUgbm90IG5vcm1hbGx5IGRvbmUgdGhhdCB3YXkuICBMaW51cyBpcyBidXN5LCBhbmQgdGhlcmUgYXJlCitzdWJzeXN0ZW0gbWFpbnRhaW5lcnMgd2hvIHdhdGNoIG92ZXIgc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbC4gIFVzdWFsbHkKK3lvdSB3aWxsIGJlIHdhbnRpbmcgdGhhdCBtYWludGFpbmVyIHRvIG1lcmdlIHlvdXIgcGF0Y2hlcy4gIElmIHRoZXJlIGlzIG5vCitvYnZpb3VzIG1haW50YWluZXIsIEFuZHJldyBNb3J0b24gaXMgb2Z0ZW4gdGhlIHBhdGNoIHRhcmdldCBvZiBsYXN0IHJlc29ydC4KKworUGF0Y2hlcyBuZWVkIGdvb2Qgc3ViamVjdCBsaW5lcy4gIFRoZSBjYW5vbmljYWwgZm9ybWF0IGZvciBhIHBhdGNoIGxpbmUgaXMKK3NvbWV0aGluZyBsaWtlOgorCis6OgorCisJW1BBVENIIG5uL21tXSBzdWJzeXM6IG9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSBwYXRjaAorCit3aGVyZSAibm4iIGlzIHRoZSBvcmRpbmFsIG51bWJlciBvZiB0aGUgcGF0Y2gsICJtbSIgaXMgdGhlIHRvdGFsIG51bWJlciBvZgorcGF0Y2hlcyBpbiB0aGUgc2VyaWVzLCBhbmQgInN1YnN5cyIgaXMgdGhlIG5hbWUgb2YgdGhlIGFmZmVjdGVkIHN1YnN5c3RlbS4KK0NsZWFybHksIG5uL21tIGNhbiBiZSBvbWl0dGVkIGZvciBhIHNpbmdsZSwgc3RhbmRhbG9uZSBwYXRjaC4KKworSWYgeW91IGhhdmUgYSBzaWduaWZpY2FudCBzZXJpZXMgb2YgcGF0Y2hlcywgaXQgaXMgY3VzdG9tYXJ5IHRvIHNlbmQgYW4KK2ludHJvZHVjdG9yeSBkZXNjcmlwdGlvbiBhcyBwYXJ0IHplcm8uICBUaGlzIGNvbnZlbnRpb24gaXMgbm90IHVuaXZlcnNhbGx5Citmb2xsb3dlZCB0aG91Z2g7IGlmIHlvdSB1c2UgaXQsIHJlbWVtYmVyIHRoYXQgaW5mb3JtYXRpb24gaW4gdGhlCitpbnRyb2R1Y3Rpb24gZG9lcyBub3QgbWFrZSBpdCBpbnRvIHRoZSBrZXJuZWwgY2hhbmdlbG9ncy4gIFNvIHBsZWFzZSBlbnN1cmUKK3RoYXQgdGhlIHBhdGNoZXMsIHRoZW1zZWx2ZXMsIGhhdmUgY29tcGxldGUgY2hhbmdlbG9nIGluZm9ybWF0aW9uLgorCitJbiBnZW5lcmFsLCB0aGUgc2Vjb25kIGFuZCBmb2xsb3dpbmcgcGFydHMgb2YgYSBtdWx0aS1wYXJ0IHBhdGNoIHNob3VsZCBiZQorc2VudCBhcyBhIHJlcGx5IHRvIHRoZSBmaXJzdCBwYXJ0IHNvIHRoYXQgdGhleSBhbGwgdGhyZWFkIHRvZ2V0aGVyIGF0IHRoZQorcmVjZWl2aW5nIGVuZC4gIFRvb2xzIGxpa2UgZ2l0IGFuZCBxdWlsdCBoYXZlIGNvbW1hbmRzIHRvIG1haWwgb3V0IGEgc2V0IG9mCitwYXRjaGVzIHdpdGggdGhlIHByb3BlciB0aHJlYWRpbmcuICBJZiB5b3UgaGF2ZSBhIGxvbmcgc2VyaWVzLCB0aG91Z2gsIGFuZAorYXJlIHVzaW5nIGdpdCwgcGxlYXNlIHN0YXkgYXdheSBmcm9tIHRoZSAtLWNoYWluLXJlcGx5LXRvIG9wdGlvbiB0byBhdm9pZAorY3JlYXRpbmcgZXhjZXB0aW9uYWxseSBkZWVwIG5lc3RpbmcuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNi5Gb2xsb3d0aHJvdWdoIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzYuRm9sbG93dGhyb3VnaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkMzI0YS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNi5Gb2xsb3d0aHJvdWdoCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLTY6IEZPTExPV1RIUk9VR0gKLQotQXQgdGhpcyBwb2ludCwgeW91IGhhdmUgZm9sbG93ZWQgdGhlIGd1aWRlbGluZXMgZ2l2ZW4gc28gZmFyIGFuZCwgd2l0aCB0aGUKLWFkZGl0aW9uIG9mIHlvdXIgb3duIGVuZ2luZWVyaW5nIHNraWxscywgaGF2ZSBwb3N0ZWQgYSBwZXJmZWN0IHNlcmllcyBvZgotcGF0Y2hlcy4gIE9uZSBvZiB0aGUgYmlnZ2VzdCBtaXN0YWtlcyB0aGF0IGV2ZW4gZXhwZXJpZW5jZWQga2VybmVsCi1kZXZlbG9wZXJzIGNhbiBtYWtlIGlzIHRvIGNvbmNsdWRlIHRoYXQgdGhlaXIgd29yayBpcyBub3cgZG9uZS4gIEluIHRydXRoLAotcG9zdGluZyBwYXRjaGVzIGluZGljYXRlcyBhIHRyYW5zaXRpb24gaW50byB0aGUgbmV4dCBzdGFnZSBvZiB0aGUgcHJvY2VzcywKLXdpdGgsIHBvc3NpYmx5LCBxdWl0ZSBhIGJpdCBvZiB3b3JrIHlldCB0byBiZSBkb25lLgotCi1JdCBpcyBhIHJhcmUgcGF0Y2ggd2hpY2ggaXMgc28gZ29vZCBhdCBpdHMgZmlyc3QgcG9zdGluZyB0aGF0IHRoZXJlIGlzIG5vCi1yb29tIGZvciBpbXByb3ZlbWVudC4gIFRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyByZWNvZ25pemVzIHRoaXMgZmFjdCwKLWFuZCwgYXMgYSByZXN1bHQsIGlzIGhlYXZpbHkgb3JpZW50ZWQgdG93YXJkIHRoZSBpbXByb3ZlbWVudCBvZiBwb3N0ZWQKLWNvZGUuICBZb3UsIGFzIHRoZSBhdXRob3Igb2YgdGhhdCBjb2RlLCB3aWxsIGJlIGV4cGVjdGVkIHRvIHdvcmsgd2l0aCB0aGUKLWtlcm5lbCBjb21tdW5pdHkgdG8gZW5zdXJlIHRoYXQgeW91ciBjb2RlIGlzIHVwIHRvIHRoZSBrZXJuZWwncyBxdWFsaXR5Ci1zdGFuZGFyZHMuICBBIGZhaWx1cmUgdG8gcGFydGljaXBhdGUgaW4gdGhpcyBwcm9jZXNzIGlzIHF1aXRlIGxpa2VseSB0bwotcHJldmVudCB0aGUgaW5jbHVzaW9uIG9mIHlvdXIgcGF0Y2hlcyBpbnRvIHRoZSBtYWlubGluZS4KLQotCi02LjE6IFdPUktJTkcgV0lUSCBSRVZJRVdFUlMKLQotQSBwYXRjaCBvZiBhbnkgc2lnbmlmaWNhbmNlIHdpbGwgcmVzdWx0IGluIGEgbnVtYmVyIG9mIGNvbW1lbnRzIGZyb20gb3RoZXIKLWRldmVsb3BlcnMgYXMgdGhleSByZXZpZXcgdGhlIGNvZGUuICBXb3JraW5nIHdpdGggcmV2aWV3ZXJzIGNhbiBiZSwgZm9yCi1tYW55IGRldmVsb3BlcnMsIHRoZSBtb3N0IGludGltaWRhdGluZyBwYXJ0IG9mIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQKLXByb2Nlc3MuICBMaWZlIGNhbiBiZSBtYWRlIG11Y2ggZWFzaWVyLCB0aG91Z2gsIGlmIHlvdSBrZWVwIGEgZmV3IHRoaW5ncyBpbgotbWluZDoKLQotIC0gSWYgeW91IGhhdmUgZXhwbGFpbmVkIHlvdXIgcGF0Y2ggd2VsbCwgcmV2aWV3ZXJzIHdpbGwgdW5kZXJzdGFuZCBpdHMKLSAgIHZhbHVlIGFuZCB3aHkgeW91IHdlbnQgdG8gdGhlIHRyb3VibGUgb2Ygd3JpdGluZyBpdC4gIEJ1dCB0aGF0IHZhbHVlCi0gICB3aWxsIG5vdCBrZWVwIHRoZW0gZnJvbSBhc2tpbmcgYSBmdW5kYW1lbnRhbCBxdWVzdGlvbjogd2hhdCB3aWxsIGl0IGJlCi0gICBsaWtlIHRvIG1haW50YWluIGEga2VybmVsIHdpdGggdGhpcyBjb2RlIGluIGl0IGZpdmUgb3IgdGVuIHllYXJzIGxhdGVyPwotICAgTWFueSBvZiB0aGUgY2hhbmdlcyB5b3UgbWF5IGJlIGFza2VkIHRvIG1ha2UgLSBmcm9tIGNvZGluZyBzdHlsZSB0d2Vha3MKLSAgIHRvIHN1YnN0YW50aWFsIHJld3JpdGVzIC0gY29tZSBmcm9tIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgTGludXggd2lsbAotICAgc3RpbGwgYmUgYXJvdW5kIGFuZCB1bmRlciBkZXZlbG9wbWVudCBhIGRlY2FkZSBmcm9tIG5vdy4KLQotIC0gQ29kZSByZXZpZXcgaXMgaGFyZCB3b3JrLCBhbmQgaXQgaXMgYSByZWxhdGl2ZWx5IHRoYW5rbGVzcyBvY2N1cGF0aW9uOwotICAgcGVvcGxlIHJlbWVtYmVyIHdobyB3cm90ZSBrZXJuZWwgY29kZSwgYnV0IHRoZXJlIGlzIGxpdHRsZSBsYXN0aW5nIGZhbWUKLSAgIGZvciB0aG9zZSB3aG8gcmV2aWV3ZWQgaXQuICBTbyByZXZpZXdlcnMgY2FuIGdldCBncnVtcHksIGVzcGVjaWFsbHkgd2hlbgotICAgdGhleSBzZWUgdGhlIHNhbWUgbWlzdGFrZXMgYmVpbmcgbWFkZSBvdmVyIGFuZCBvdmVyIGFnYWluLiAgSWYgeW91IGdldCBhCi0gICByZXZpZXcgd2hpY2ggc2VlbXMgYW5ncnksIGluc3VsdGluZywgb3Igb3V0cmlnaHQgb2ZmZW5zaXZlLCByZXNpc3QgdGhlCi0gICBpbXB1bHNlIHRvIHJlc3BvbmQgaW4ga2luZC4gIENvZGUgcmV2aWV3IGlzIGFib3V0IHRoZSBjb2RlLCBub3QgYWJvdXQKLSAgIHRoZSBwZW9wbGUsIGFuZCBjb2RlIHJldmlld2VycyBhcmUgbm90IGF0dGFja2luZyB5b3UgcGVyc29uYWxseS4KLQotIC0gU2ltaWxhcmx5LCBjb2RlIHJldmlld2VycyBhcmUgbm90IHRyeWluZyB0byBwcm9tb3RlIHRoZWlyIGVtcGxveWVycycKLSAgIGFnZW5kYXMgYXQgdGhlIGV4cGVuc2Ugb2YgeW91ciBvd24uICBLZXJuZWwgZGV2ZWxvcGVycyBvZnRlbiBleHBlY3QgdG8KLSAgIGJlIHdvcmtpbmcgb24gdGhlIGtlcm5lbCB5ZWFycyBmcm9tIG5vdywgYnV0IHRoZXkgdW5kZXJzdGFuZCB0aGF0IHRoZWlyCi0gICBlbXBsb3llciBjb3VsZCBjaGFuZ2UuICBUaGV5IHRydWx5IGFyZSwgYWxtb3N0IHdpdGhvdXQgZXhjZXB0aW9uLAotICAgd29ya2luZyB0b3dhcmQgdGhlIGNyZWF0aW9uIG9mIHRoZSBiZXN0IGtlcm5lbCB0aGV5IGNhbjsgdGhleSBhcmUgbm90Ci0gICB0cnlpbmcgdG8gY3JlYXRlIGRpc2NvbWZvcnQgZm9yIHRoZWlyIGVtcGxveWVycycgY29tcGV0aXRvcnMuCi0KLVdoYXQgYWxsIG9mIHRoaXMgY29tZXMgZG93biB0byBpcyB0aGF0LCB3aGVuIHJldmlld2VycyBzZW5kIHlvdSBjb21tZW50cywKLXlvdSBuZWVkIHRvIHBheSBhdHRlbnRpb24gdG8gdGhlIHRlY2huaWNhbCBvYnNlcnZhdGlvbnMgdGhhdCB0aGV5IGFyZQotbWFraW5nLiAgRG8gbm90IGxldCB0aGVpciBmb3JtIG9mIGV4cHJlc3Npb24gb3IgeW91ciBvd24gcHJpZGUga2VlcCB0aGF0Ci1mcm9tIGhhcHBlbmluZy4gIFdoZW4geW91IGdldCByZXZpZXcgY29tbWVudHMgb24gYSBwYXRjaCwgdGFrZSB0aGUgdGltZSB0bwotdW5kZXJzdGFuZCB3aGF0IHRoZSByZXZpZXdlciBpcyB0cnlpbmcgdG8gc2F5LiAgSWYgcG9zc2libGUsIGZpeCB0aGUgdGhpbmdzCi10aGF0IHRoZSByZXZpZXdlciBpcyBhc2tpbmcgeW91IHRvIGZpeC4gIEFuZCByZXNwb25kIGJhY2sgdG8gdGhlIHJldmlld2VyOgotdGhhbmsgdGhlbSwgYW5kIGRlc2NyaWJlIGhvdyB5b3Ugd2lsbCBhbnN3ZXIgdGhlaXIgcXVlc3Rpb25zLgotCi1Ob3RlIHRoYXQgeW91IGRvIG5vdCBoYXZlIHRvIGFncmVlIHdpdGggZXZlcnkgY2hhbmdlIHN1Z2dlc3RlZCBieQotcmV2aWV3ZXJzLiAgSWYgeW91IGJlbGlldmUgdGhhdCB0aGUgcmV2aWV3ZXIgaGFzIG1pc3VuZGVyc3Rvb2QgeW91ciBjb2RlLAotZXhwbGFpbiB3aGF0IGlzIHJlYWxseSBnb2luZyBvbi4gIElmIHlvdSBoYXZlIGEgdGVjaG5pY2FsIG9iamVjdGlvbiB0byBhCi1zdWdnZXN0ZWQgY2hhbmdlLCBkZXNjcmliZSBpdCBhbmQganVzdGlmeSB5b3VyIHNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtLiAgSWYKLXlvdXIgZXhwbGFuYXRpb25zIG1ha2Ugc2Vuc2UsIHRoZSByZXZpZXdlciB3aWxsIGFjY2VwdCB0aGVtLiAgU2hvdWxkIHlvdXIKLWV4cGxhbmF0aW9uIG5vdCBwcm92ZSBwZXJzdWFzaXZlLCB0aG91Z2gsIGVzcGVjaWFsbHkgaWYgb3RoZXJzIHN0YXJ0IHRvCi1hZ3JlZSB3aXRoIHRoZSByZXZpZXdlciwgdGFrZSBzb21lIHRpbWUgdG8gdGhpbmsgdGhpbmdzIG92ZXIgYWdhaW4uICBJdCBjYW4KLWJlIGVhc3kgdG8gYmVjb21lIGJsaW5kZWQgYnkgeW91ciBvd24gc29sdXRpb24gdG8gYSBwcm9ibGVtIHRvIHRoZSBwb2ludAotdGhhdCB5b3UgZG9uJ3QgcmVhbGl6ZSB0aGF0IHNvbWV0aGluZyBpcyBmdW5kYW1lbnRhbGx5IHdyb25nIG9yLCBwZXJoYXBzLAoteW91J3JlIG5vdCBldmVuIHNvbHZpbmcgdGhlIHJpZ2h0IHByb2JsZW0uCi0KLUFuZHJldyBNb3J0b24gaGFzIHN1Z2dlc3RlZCB0aGF0IGV2ZXJ5IHJldmlldyBjb21tZW50IHdoaWNoIGRvZXMgbm90IHJlc3VsdAotaW4gYSBjb2RlIGNoYW5nZSBzaG91bGQgcmVzdWx0IGluIGFuIGFkZGl0aW9uYWwgY29kZSBjb21tZW50IGluc3RlYWQ7IHRoYXQKLWNhbiBoZWxwIGZ1dHVyZSByZXZpZXdlcnMgYXZvaWQgdGhlIHF1ZXN0aW9ucyB3aGljaCBjYW1lIHVwIHRoZSBmaXJzdCB0aW1lCi1hcm91bmQuCi0KLU9uZSBmYXRhbCBtaXN0YWtlIGlzIHRvIGlnbm9yZSByZXZpZXcgY29tbWVudHMgaW4gdGhlIGhvcGUgdGhhdCB0aGV5IHdpbGwKLWdvIGF3YXkuICBUaGV5IHdpbGwgbm90IGdvIGF3YXkuICBJZiB5b3UgcmVwb3N0IGNvZGUgd2l0aG91dCBoYXZpbmcKLXJlc3BvbmRlZCB0byB0aGUgY29tbWVudHMgeW91IGdvdCB0aGUgdGltZSBiZWZvcmUsIHlvdSdyZSBsaWtlbHkgdG8gZmluZAotdGhhdCB5b3VyIHBhdGNoZXMgZ28gbm93aGVyZS4KLQotU3BlYWtpbmcgb2YgcmVwb3N0aW5nIGNvZGU6IHBsZWFzZSBiZWFyIGluIG1pbmQgdGhhdCByZXZpZXdlcnMgYXJlIG5vdAotZ29pbmcgdG8gcmVtZW1iZXIgYWxsIHRoZSBkZXRhaWxzIG9mIHRoZSBjb2RlIHlvdSBwb3N0ZWQgdGhlIGxhc3QgdGltZQotYXJvdW5kLiAgU28gaXQgaXMgYWx3YXlzIGEgZ29vZCBpZGVhIHRvIHJlbWluZCByZXZpZXdlcnMgb2YgcHJldmlvdXNseQotcmFpc2VkIGlzc3VlcyBhbmQgaG93IHlvdSBkZWFsdCB3aXRoIHRoZW07IHRoZSBwYXRjaCBjaGFuZ2Vsb2cgaXMgYSBnb29kCi1wbGFjZSBmb3IgdGhpcyBraW5kIG9mIGluZm9ybWF0aW9uLiAgUmV2aWV3ZXJzIHNob3VsZCBub3QgaGF2ZSB0byBzZWFyY2gKLXRocm91Z2ggbGlzdCBhcmNoaXZlcyB0byBmYW1pbGlhcml6ZSB0aGVtc2VsdmVzIHdpdGggd2hhdCB3YXMgc2FpZCBsYXN0Ci10aW1lOyBpZiB5b3UgaGVscCB0aGVtIGdldCBhIHJ1bm5pbmcgc3RhcnQsIHRoZXkgd2lsbCBiZSBpbiBhIGJldHRlciBtb29kCi13aGVuIHRoZXkgcmV2aXNpdCB5b3VyIGNvZGUuCi0KLVdoYXQgaWYgeW91J3ZlIHRyaWVkIHRvIGRvIGV2ZXJ5dGhpbmcgcmlnaHQgYW5kIHRoaW5ncyBzdGlsbCBhcmVuJ3QgZ29pbmcKLWFueXdoZXJlPyAgTW9zdCB0ZWNobmljYWwgZGlzYWdyZWVtZW50cyBjYW4gYmUgcmVzb2x2ZWQgdGhyb3VnaCBkaXNjdXNzaW9uLAotYnV0IHRoZXJlIGFyZSB0aW1lcyB3aGVuIHNvbWVib2R5IHNpbXBseSBoYXMgdG8gbWFrZSBhIGRlY2lzaW9uLiAgSWYgeW91Ci1ob25lc3RseSBiZWxpZXZlIHRoYXQgdGhpcyBkZWNpc2lvbiBpcyBnb2luZyBhZ2FpbnN0IHlvdSB3cm9uZ2x5LCB5b3UgY2FuCi1hbHdheXMgdHJ5IGFwcGVhbGluZyB0byBhIGhpZ2hlciBwb3dlci4gIEFzIG9mIHRoaXMgd3JpdGluZywgdGhhdCBoaWdoZXIKLXBvd2VyIHRlbmRzIHRvIGJlIEFuZHJldyBNb3J0b24uICBBbmRyZXcgaGFzIGEgZ3JlYXQgZGVhbCBvZiByZXNwZWN0IGluIHRoZQota2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eTsgaGUgY2FuIG9mdGVuIHVuamFtIGEgc2l0dWF0aW9uIHdoaWNoIHNlZW1zIHRvCi1iZSBob3BlbGVzc2x5IGJsb2NrZWQuICBBcHBlYWxpbmcgdG8gQW5kcmV3IHNob3VsZCBub3QgYmUgZG9uZSBsaWdodGx5LAotdGhvdWdoLCBhbmQgbm90IGJlZm9yZSBhbGwgb3RoZXIgYWx0ZXJuYXRpdmVzIGhhdmUgYmVlbiBleHBsb3JlZC4gIEFuZCBiZWFyCi1pbiBtaW5kLCBvZiBjb3Vyc2UsIHRoYXQgaGUgbWF5IG5vdCBhZ3JlZSB3aXRoIHlvdSBlaXRoZXIuCi0KLQotNi4yOiBXSEFUIEhBUFBFTlMgTkVYVAotCi1JZiBhIHBhdGNoIGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBnb29kIHRoaW5nIHRvIGFkZCB0byB0aGUga2VybmVsLCBhbmQgb25jZQotbW9zdCBvZiB0aGUgcmV2aWV3IGlzc3VlcyBoYXZlIGJlZW4gcmVzb2x2ZWQsIHRoZSBuZXh0IHN0ZXAgaXMgdXN1YWxseQotZW50cnkgaW50byBhIHN1YnN5c3RlbSBtYWludGFpbmVyJ3MgdHJlZS4gIEhvdyB0aGF0IHdvcmtzIHZhcmllcyBmcm9tIG9uZQotc3Vic3lzdGVtIHRvIHRoZSBuZXh0OyBlYWNoIG1haW50YWluZXIgaGFzIGhpcyBvciBoZXIgb3duIHdheSBvZiBkb2luZwotdGhpbmdzLiAgSW4gcGFydGljdWxhciwgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUgdHJlZSAtIG9uZSwgcGVyaGFwcywKLWRlZGljYXRlZCB0byBwYXRjaGVzIHBsYW5uZWQgZm9yIHRoZSBuZXh0IG1lcmdlIHdpbmRvdywgYW5kIGFub3RoZXIgZm9yCi1sb25nZXItdGVybSB3b3JrLgotCi1Gb3IgcGF0Y2hlcyBhcHBseWluZyB0byBhcmVhcyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gb2J2aW91cyBzdWJzeXN0ZW0gdHJlZQotKG1lbW9yeSBtYW5hZ2VtZW50IHBhdGNoZXMsIGZvciBleGFtcGxlKSwgdGhlIGRlZmF1bHQgdHJlZSBvZnRlbiBlbmRzIHVwCi1iZWluZyAtbW0uICBQYXRjaGVzIHdoaWNoIGFmZmVjdCBtdWx0aXBsZSBzdWJzeXN0ZW1zIGNhbiBhbHNvIGVuZCB1cCBnb2luZwotdGhyb3VnaCB0aGUgLW1tIHRyZWUuCi0KLUluY2x1c2lvbiBpbnRvIGEgc3Vic3lzdGVtIHRyZWUgY2FuIGJyaW5nIGEgaGlnaGVyIGxldmVsIG9mIHZpc2liaWxpdHkgdG8gYQotcGF0Y2guICBOb3cgb3RoZXIgZGV2ZWxvcGVycyB3b3JraW5nIHdpdGggdGhhdCB0cmVlIHdpbGwgZ2V0IHRoZSBwYXRjaCBieQotZGVmYXVsdC4gIFN1YnN5c3RlbSB0cmVlcyB0eXBpY2FsbHkgZmVlZCBsaW51eC1uZXh0IGFzIHdlbGwsIG1ha2luZyB0aGVpcgotY29udGVudHMgdmlzaWJsZSB0byB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGFzIGEgd2hvbGUuICBBdCB0aGlzIHBvaW50LAotdGhlcmUncyBhIGdvb2QgY2hhbmNlIHRoYXQgeW91IHdpbGwgZ2V0IG1vcmUgY29tbWVudHMgZnJvbSBhIG5ldyBzZXQgb2YKLXJldmlld2VyczsgdGhlc2UgY29tbWVudHMgbmVlZCB0byBiZSBhbnN3ZXJlZCBhcyBpbiB0aGUgcHJldmlvdXMgcm91bmQuCi0KLVdoYXQgbWF5IGFsc28gaGFwcGVuIGF0IHRoaXMgcG9pbnQsIGRlcGVuZGluZyBvbiB0aGUgbmF0dXJlIG9mIHlvdXIgcGF0Y2gsCi1pcyB0aGF0IGNvbmZsaWN0cyB3aXRoIHdvcmsgYmVpbmcgZG9uZSBieSBvdGhlcnMgdHVybiB1cC4gIEluIHRoZSB3b3JzdAotY2FzZSwgaGVhdnkgcGF0Y2ggY29uZmxpY3RzIGNhbiByZXN1bHQgaW4gc29tZSB3b3JrIGJlaW5nIHB1dCBvbiB0aGUgYmFjawotYnVybmVyIHNvIHRoYXQgdGhlIHJlbWFpbmluZyBwYXRjaGVzIGNhbiBiZSB3b3JrZWQgaW50byBzaGFwZSBhbmQgbWVyZ2VkLgotT3RoZXIgdGltZXMsIGNvbmZsaWN0IHJlc29sdXRpb24gd2lsbCBpbnZvbHZlIHdvcmtpbmcgd2l0aCB0aGUgb3RoZXIKLWRldmVsb3BlcnMgYW5kLCBwb3NzaWJseSwgbW92aW5nIHNvbWUgcGF0Y2hlcyBiZXR3ZWVuIHRyZWVzIHRvIGVuc3VyZSB0aGF0Ci1ldmVyeXRoaW5nIGFwcGxpZXMgY2xlYW5seS4gIFRoaXMgd29yayBjYW4gYmUgYSBwYWluLCBidXQgY291bnQgeW91cgotYmxlc3NpbmdzOiBiZWZvcmUgdGhlIGFkdmVudCBvZiB0aGUgbGludXgtbmV4dCB0cmVlLCB0aGVzZSBjb25mbGljdHMgb2Z0ZW4KLW9ubHkgdHVybmVkIHVwIGR1cmluZyB0aGUgbWVyZ2Ugd2luZG93IGFuZCBoYWQgdG8gYmUgYWRkcmVzc2VkIGluIGEgaHVycnkuCi1Ob3cgdGhleSBjYW4gYmUgcmVzb2x2ZWQgYXQgbGVpc3VyZSwgYmVmb3JlIHRoZSBtZXJnZSB3aW5kb3cgb3BlbnMuCi0KLVNvbWUgZGF5LCBpZiBhbGwgZ29lcyB3ZWxsLCB5b3UnbGwgbG9nIG9uIGFuZCBzZWUgdGhhdCB5b3VyIHBhdGNoIGhhcyBiZWVuCi1tZXJnZWQgaW50byB0aGUgbWFpbmxpbmUga2VybmVsLiAgQ29uZ3JhdHVsYXRpb25zISAgT25jZSB0aGUgY2VsZWJyYXRpb24gaXMKLWNvbXBsZXRlIChhbmQgeW91IGhhdmUgYWRkZWQgeW91cnNlbGYgdG8gdGhlIE1BSU5UQUlORVJTIGZpbGUpLCB0aG91Z2gsIGl0Ci1pcyB3b3J0aCByZW1lbWJlcmluZyBhbiBpbXBvcnRhbnQgbGl0dGxlIGZhY3Q6IHRoZSBqb2Igc3RpbGwgaXMgbm90IGRvbmUuCi1NZXJnaW5nIGludG8gdGhlIG1haW5saW5lIGJyaW5ncyBpdHMgb3duIGNoYWxsZW5nZXMuCi0KLVRvIGJlZ2luIHdpdGgsIHRoZSB2aXNpYmlsaXR5IG9mIHlvdXIgcGF0Y2ggaGFzIGluY3JlYXNlZCB5ZXQgYWdhaW4uICBUaGVyZQotbWF5IGJlIGEgbmV3IHJvdW5kIG9mIGNvbW1lbnRzIGZyb20gZGV2ZWxvcGVycyB3aG8gaGFkIG5vdCBiZWVuIGF3YXJlIG9mCi10aGUgcGF0Y2ggYmVmb3JlLiAgSXQgbWF5IGJlIHRlbXB0aW5nIHRvIGlnbm9yZSB0aGVtLCBzaW5jZSB0aGVyZSBpcyBubwotbG9uZ2VyIGFueSBxdWVzdGlvbiBvZiB5b3VyIGNvZGUgYmVpbmcgbWVyZ2VkLiAgUmVzaXN0IHRoYXQgdGVtcHRhdGlvbiwKLXRob3VnaDsgeW91IHN0aWxsIG5lZWQgdG8gYmUgcmVzcG9uc2l2ZSB0byBkZXZlbG9wZXJzIHdobyBoYXZlIHF1ZXN0aW9ucyBvcgotc3VnZ2VzdGlvbnMuCi0KLU1vcmUgaW1wb3J0YW50bHksIHRob3VnaDogaW5jbHVzaW9uIGludG8gdGhlIG1haW5saW5lIHB1dHMgeW91ciBjb2RlIGludG8KLXRoZSBoYW5kcyBvZiBhIG11Y2ggbGFyZ2VyIGdyb3VwIG9mIHRlc3RlcnMuICBFdmVuIGlmIHlvdSBoYXZlIGNvbnRyaWJ1dGVkCi1hIGRyaXZlciBmb3IgaGFyZHdhcmUgd2hpY2ggaXMgbm90IHlldCBhdmFpbGFibGUsIHlvdSB3aWxsIGJlIHN1cnByaXNlZCBieQotaG93IG1hbnkgcGVvcGxlIHdpbGwgYnVpbGQgeW91ciBjb2RlIGludG8gdGhlaXIga2VybmVscy4gIEFuZCwgb2YgY291cnNlLAotd2hlcmUgdGhlcmUgYXJlIHRlc3RlcnMsIHRoZXJlIHdpbGwgYmUgYnVnIHJlcG9ydHMuCi0KLVRoZSB3b3JzdCBzb3J0IG9mIGJ1ZyByZXBvcnRzIGFyZSByZWdyZXNzaW9ucy4gIElmIHlvdXIgcGF0Y2ggY2F1c2VzIGEKLXJlZ3Jlc3Npb24sIHlvdSdsbCBmaW5kIGFuIHVuY29tZm9ydGFibGUgbnVtYmVyIG9mIGV5ZXMgdXBvbiB5b3U7Ci1yZWdyZXNzaW9ucyBuZWVkIHRvIGJlIGZpeGVkIGFzIHNvb24gYXMgcG9zc2libGUuICBJZiB5b3UgYXJlIHVud2lsbGluZyBvcgotdW5hYmxlIHRvIGZpeCB0aGUgcmVncmVzc2lvbiAoYW5kIG5vYm9keSBlbHNlIGRvZXMgaXQgZm9yIHlvdSksIHlvdXIgcGF0Y2gKLXdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSByZW1vdmVkIGR1cmluZyB0aGUgc3RhYmlsaXphdGlvbiBwZXJpb2QuICBCZXlvbmQKLW5lZ2F0aW5nIGFsbCBvZiB0aGUgd29yayB5b3UgaGF2ZSBkb25lIHRvIGdldCB5b3VyIHBhdGNoIGludG8gdGhlIG1haW5saW5lLAotaGF2aW5nIGEgcGF0Y2ggcHVsbGVkIGFzIHRoZSByZXN1bHQgb2YgYSBmYWlsdXJlIHRvIGZpeCBhIHJlZ3Jlc3Npb24gY291bGQKLXdlbGwgbWFrZSBpdCBoYXJkZXIgZm9yIHlvdSB0byBnZXQgd29yayBtZXJnZWQgaW4gdGhlIGZ1dHVyZS4KLQotQWZ0ZXIgYW55IHJlZ3Jlc3Npb25zIGhhdmUgYmVlbiBkZWFsdCB3aXRoLCB0aGVyZSBtYXkgYmUgb3RoZXIsIG9yZGluYXJ5Ci1idWdzIHRvIGRlYWwgd2l0aC4gIFRoZSBzdGFiaWxpemF0aW9uIHBlcmlvZCBpcyB5b3VyIGJlc3Qgb3Bwb3J0dW5pdHkgdG8KLWZpeCB0aGVzZSBidWdzIGFuZCBlbnN1cmUgdGhhdCB5b3VyIGNvZGUncyBkZWJ1dCBpbiBhIG1haW5saW5lIGtlcm5lbAotcmVsZWFzZSBpcyBhcyBzb2xpZCBhcyBwb3NzaWJsZS4gIFNvLCBwbGVhc2UsIGFuc3dlciBidWcgcmVwb3J0cywgYW5kIGZpeAotdGhlIHByb2JsZW1zIGlmIGF0IGFsbCBwb3NzaWJsZS4gIFRoYXQncyB3aGF0IHRoZSBzdGFiaWxpemF0aW9uIHBlcmlvZCBpcwotZm9yOyB5b3UgY2FuIHN0YXJ0IGNyZWF0aW5nIGNvb2wgbmV3IHBhdGNoZXMgb25jZSBhbnkgcHJvYmxlbXMgd2l0aCB0aGUgb2xkCi1vbmVzIGhhdmUgYmVlbiB0YWtlbiBjYXJlIG9mLgotCi1BbmQgZG9uJ3QgZm9yZ2V0IHRoYXQgdGhlcmUgYXJlIG90aGVyIG1pbGVzdG9uZXMgd2hpY2ggbWF5IGFsc28gY3JlYXRlIGJ1ZwotcmVwb3J0czogdGhlIG5leHQgbWFpbmxpbmUgc3RhYmxlIHJlbGVhc2UsIHdoZW4gcHJvbWluZW50IGRpc3RyaWJ1dG9ycyBwaWNrCi11cCBhIHZlcnNpb24gb2YgdGhlIGtlcm5lbCBjb250YWluaW5nIHlvdXIgcGF0Y2gsIGV0Yy4gIENvbnRpbnVpbmcgdG8KLXJlc3BvbmQgdG8gdGhlc2UgcmVwb3J0cyBpcyBhIG1hdHRlciBvZiBiYXNpYyBwcmlkZSBpbiB5b3VyIHdvcmsuICBJZiB0aGF0Ci1pcyBpbnN1ZmZpY2llbnQgbW90aXZhdGlvbiwgdGhvdWdoLCBpdCdzIGFsc28gd29ydGggY29uc2lkZXJpbmcgdGhhdCB0aGUKLWRldmVsb3BtZW50IGNvbW11bml0eSByZW1lbWJlcnMgZGV2ZWxvcGVycyB3aG8gbG9zZSBpbnRlcmVzdCBpbiB0aGVpciBjb2RlCi1hZnRlciBpdCdzIG1lcmdlZC4gIFRoZSBuZXh0IHRpbWUgeW91IHBvc3QgYSBwYXRjaCwgdGhleSB3aWxsIGJlIGV2YWx1YXRpbmcKLWl0IHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB5b3Ugd2lsbCBub3QgYmUgYXJvdW5kIHRvIG1haW50YWluIGl0Ci1hZnRlcndhcmQuCi0KLQotNi4zOiBPVEhFUiBUSElOR1MgVEhBVCBDQU4gSEFQUEVOCi0KLU9uZSBkYXksIHlvdSBtYXkgb3BlbiB5b3VyIG1haWwgY2xpZW50IGFuZCBzZWUgdGhhdCBzb21lYm9keSBoYXMgbWFpbGVkIHlvdQotYSBwYXRjaCB0byB5b3VyIGNvZGUuICBUaGF0IGlzIG9uZSBvZiB0aGUgYWR2YW50YWdlcyBvZiBoYXZpbmcgeW91ciBjb2RlCi1vdXQgdGhlcmUgaW4gdGhlIG9wZW4sIGFmdGVyIGFsbC4gIElmIHlvdSBhZ3JlZSB3aXRoIHRoZSBwYXRjaCwgeW91IGNhbgotZWl0aGVyIGZvcndhcmQgaXQgb24gdG8gdGhlIHN1YnN5c3RlbSBtYWludGFpbmVyIChiZSBzdXJlIHRvIGluY2x1ZGUgYQotcHJvcGVyIEZyb206IGxpbmUgc28gdGhhdCB0aGUgYXR0cmlidXRpb24gaXMgY29ycmVjdCwgYW5kIGFkZCBhIHNpZ25vZmYgb2YKLXlvdXIgb3duKSwgb3Igc2VuZCBhbiBBY2tlZC1ieTogcmVzcG9uc2UgYmFjayBhbmQgbGV0IHRoZSBvcmlnaW5hbCBwb3N0ZXIKLXNlbmQgaXQgdXB3YXJkLgotCi1JZiB5b3UgZGlzYWdyZWUgd2l0aCB0aGUgcGF0Y2gsIHNlbmQgYSBwb2xpdGUgcmVzcG9uc2UgZXhwbGFpbmluZyB3aHkuICBJZgotcG9zc2libGUsIHRlbGwgdGhlIGF1dGhvciB3aGF0IGNoYW5nZXMgbmVlZCB0byBiZSBtYWRlIHRvIG1ha2UgdGhlIHBhdGNoCi1hY2NlcHRhYmxlIHRvIHlvdS4gIFRoZXJlIGlzIGEgY2VydGFpbiByZXNpc3RhbmNlIHRvIG1lcmdpbmcgcGF0Y2hlcyB3aGljaAotYXJlIG9wcG9zZWQgYnkgdGhlIGF1dGhvciBhbmQgbWFpbnRhaW5lciBvZiB0aGUgY29kZSwgYnV0IGl0IG9ubHkgZ29lcyBzbwotZmFyLiAgSWYgeW91IGFyZSBzZWVuIGFzIG5lZWRsZXNzbHkgYmxvY2tpbmcgZ29vZCB3b3JrLCB0aG9zZSBwYXRjaGVzIHdpbGwKLWV2ZW50dWFsbHkgZmxvdyBhcm91bmQgeW91IGFuZCBnZXQgaW50byB0aGUgbWFpbmxpbmUgYW55d2F5LiAgSW4gdGhlIExpbnV4Ci1rZXJuZWwsIG5vYm9keSBoYXMgYWJzb2x1dGUgdmV0byBwb3dlciBvdmVyIGFueSBjb2RlLiAgRXhjZXB0IG1heWJlIExpbnVzLgotCi1PbiB2ZXJ5IHJhcmUgb2NjYXNpb24sIHlvdSBtYXkgc2VlIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudDogYW5vdGhlcgotZGV2ZWxvcGVyIHBvc3RzIGEgZGlmZmVyZW50IHNvbHV0aW9uIHRvIHlvdXIgcHJvYmxlbS4gIEF0IHRoYXQgcG9pbnQsCi1jaGFuY2VzIGFyZSB0aGF0IG9uZSBvZiB0aGUgdHdvIHBhdGNoZXMgd2lsbCBub3QgYmUgbWVyZ2VkLCBhbmQgIm1pbmUgd2FzCi1oZXJlIGZpcnN0IiBpcyBub3QgY29uc2lkZXJlZCB0byBiZSBhIGNvbXBlbGxpbmcgdGVjaG5pY2FsIGFyZ3VtZW50LiAgSWYKLXNvbWVib2R5IGVsc2UncyBwYXRjaCBkaXNwbGFjZXMgeW91cnMgYW5kIGdldHMgaW50byB0aGUgbWFpbmxpbmUsIHRoZXJlIGlzCi1yZWFsbHkgb25seSBvbmUgd2F5IHRvIHJlc3BvbmQ6IGJlIHBsZWFzZWQgdGhhdCB5b3VyIHByb2JsZW0gZ290IHNvbHZlZCBhbmQKLWdldCBvbiB3aXRoIHlvdXIgd29yay4gIEhhdmluZyBvbmUncyB3b3JrIHNob3ZlZCBhc2lkZSBpbiB0aGlzIG1hbm5lciBjYW4KLWJlIGh1cnRmdWwgYW5kIGRpc2NvdXJhZ2luZywgYnV0IHRoZSBjb21tdW5pdHkgd2lsbCByZW1lbWJlciB5b3VyIHJlYWN0aW9uCi1sb25nIGFmdGVyIHRoZXkgaGF2ZSBmb3Jnb3R0ZW4gd2hvc2UgcGF0Y2ggYWN0dWFsbHkgZ290IG1lcmdlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy82LkZvbGxvd3Rocm91Z2gucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzYuRm9sbG93dGhyb3VnaC5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3M2NkNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy82LkZvbGxvd3Rocm91Z2gucnN0CkBAIC0wLDAgKzEsMjEyIEBACisuLiBfZGV2ZWxvcG1lbnRfZm9sbG93dGhyb3VnaDoKKworRm9sbG93dGhyb3VnaAorPT09PT09PT09PT09PQorCitBdCB0aGlzIHBvaW50LCB5b3UgaGF2ZSBmb2xsb3dlZCB0aGUgZ3VpZGVsaW5lcyBnaXZlbiBzbyBmYXIgYW5kLCB3aXRoIHRoZQorYWRkaXRpb24gb2YgeW91ciBvd24gZW5naW5lZXJpbmcgc2tpbGxzLCBoYXZlIHBvc3RlZCBhIHBlcmZlY3Qgc2VyaWVzIG9mCitwYXRjaGVzLiAgT25lIG9mIHRoZSBiaWdnZXN0IG1pc3Rha2VzIHRoYXQgZXZlbiBleHBlcmllbmNlZCBrZXJuZWwKK2RldmVsb3BlcnMgY2FuIG1ha2UgaXMgdG8gY29uY2x1ZGUgdGhhdCB0aGVpciB3b3JrIGlzIG5vdyBkb25lLiAgSW4gdHJ1dGgsCitwb3N0aW5nIHBhdGNoZXMgaW5kaWNhdGVzIGEgdHJhbnNpdGlvbiBpbnRvIHRoZSBuZXh0IHN0YWdlIG9mIHRoZSBwcm9jZXNzLAord2l0aCwgcG9zc2libHksIHF1aXRlIGEgYml0IG9mIHdvcmsgeWV0IHRvIGJlIGRvbmUuCisKK0l0IGlzIGEgcmFyZSBwYXRjaCB3aGljaCBpcyBzbyBnb29kIGF0IGl0cyBmaXJzdCBwb3N0aW5nIHRoYXQgdGhlcmUgaXMgbm8KK3Jvb20gZm9yIGltcHJvdmVtZW50LiAgVGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzIHJlY29nbml6ZXMgdGhpcyBmYWN0LAorYW5kLCBhcyBhIHJlc3VsdCwgaXMgaGVhdmlseSBvcmllbnRlZCB0b3dhcmQgdGhlIGltcHJvdmVtZW50IG9mIHBvc3RlZAorY29kZS4gIFlvdSwgYXMgdGhlIGF1dGhvciBvZiB0aGF0IGNvZGUsIHdpbGwgYmUgZXhwZWN0ZWQgdG8gd29yayB3aXRoIHRoZQora2VybmVsIGNvbW11bml0eSB0byBlbnN1cmUgdGhhdCB5b3VyIGNvZGUgaXMgdXAgdG8gdGhlIGtlcm5lbCdzIHF1YWxpdHkKK3N0YW5kYXJkcy4gIEEgZmFpbHVyZSB0byBwYXJ0aWNpcGF0ZSBpbiB0aGlzIHByb2Nlc3MgaXMgcXVpdGUgbGlrZWx5IHRvCitwcmV2ZW50IHRoZSBpbmNsdXNpb24gb2YgeW91ciBwYXRjaGVzIGludG8gdGhlIG1haW5saW5lLgorCisKK1dvcmtpbmcgd2l0aCByZXZpZXdlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSBwYXRjaCBvZiBhbnkgc2lnbmlmaWNhbmNlIHdpbGwgcmVzdWx0IGluIGEgbnVtYmVyIG9mIGNvbW1lbnRzIGZyb20gb3RoZXIKK2RldmVsb3BlcnMgYXMgdGhleSByZXZpZXcgdGhlIGNvZGUuICBXb3JraW5nIHdpdGggcmV2aWV3ZXJzIGNhbiBiZSwgZm9yCittYW55IGRldmVsb3BlcnMsIHRoZSBtb3N0IGludGltaWRhdGluZyBwYXJ0IG9mIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQKK3Byb2Nlc3MuICBMaWZlIGNhbiBiZSBtYWRlIG11Y2ggZWFzaWVyLCB0aG91Z2gsIGlmIHlvdSBrZWVwIGEgZmV3IHRoaW5ncyBpbgorbWluZDoKKworIC0gSWYgeW91IGhhdmUgZXhwbGFpbmVkIHlvdXIgcGF0Y2ggd2VsbCwgcmV2aWV3ZXJzIHdpbGwgdW5kZXJzdGFuZCBpdHMKKyAgIHZhbHVlIGFuZCB3aHkgeW91IHdlbnQgdG8gdGhlIHRyb3VibGUgb2Ygd3JpdGluZyBpdC4gIEJ1dCB0aGF0IHZhbHVlCisgICB3aWxsIG5vdCBrZWVwIHRoZW0gZnJvbSBhc2tpbmcgYSBmdW5kYW1lbnRhbCBxdWVzdGlvbjogd2hhdCB3aWxsIGl0IGJlCisgICBsaWtlIHRvIG1haW50YWluIGEga2VybmVsIHdpdGggdGhpcyBjb2RlIGluIGl0IGZpdmUgb3IgdGVuIHllYXJzIGxhdGVyPworICAgTWFueSBvZiB0aGUgY2hhbmdlcyB5b3UgbWF5IGJlIGFza2VkIHRvIG1ha2UgLSBmcm9tIGNvZGluZyBzdHlsZSB0d2Vha3MKKyAgIHRvIHN1YnN0YW50aWFsIHJld3JpdGVzIC0gY29tZSBmcm9tIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgTGludXggd2lsbAorICAgc3RpbGwgYmUgYXJvdW5kIGFuZCB1bmRlciBkZXZlbG9wbWVudCBhIGRlY2FkZSBmcm9tIG5vdy4KKworIC0gQ29kZSByZXZpZXcgaXMgaGFyZCB3b3JrLCBhbmQgaXQgaXMgYSByZWxhdGl2ZWx5IHRoYW5rbGVzcyBvY2N1cGF0aW9uOworICAgcGVvcGxlIHJlbWVtYmVyIHdobyB3cm90ZSBrZXJuZWwgY29kZSwgYnV0IHRoZXJlIGlzIGxpdHRsZSBsYXN0aW5nIGZhbWUKKyAgIGZvciB0aG9zZSB3aG8gcmV2aWV3ZWQgaXQuICBTbyByZXZpZXdlcnMgY2FuIGdldCBncnVtcHksIGVzcGVjaWFsbHkgd2hlbgorICAgdGhleSBzZWUgdGhlIHNhbWUgbWlzdGFrZXMgYmVpbmcgbWFkZSBvdmVyIGFuZCBvdmVyIGFnYWluLiAgSWYgeW91IGdldCBhCisgICByZXZpZXcgd2hpY2ggc2VlbXMgYW5ncnksIGluc3VsdGluZywgb3Igb3V0cmlnaHQgb2ZmZW5zaXZlLCByZXNpc3QgdGhlCisgICBpbXB1bHNlIHRvIHJlc3BvbmQgaW4ga2luZC4gIENvZGUgcmV2aWV3IGlzIGFib3V0IHRoZSBjb2RlLCBub3QgYWJvdXQKKyAgIHRoZSBwZW9wbGUsIGFuZCBjb2RlIHJldmlld2VycyBhcmUgbm90IGF0dGFja2luZyB5b3UgcGVyc29uYWxseS4KKworIC0gU2ltaWxhcmx5LCBjb2RlIHJldmlld2VycyBhcmUgbm90IHRyeWluZyB0byBwcm9tb3RlIHRoZWlyIGVtcGxveWVycycKKyAgIGFnZW5kYXMgYXQgdGhlIGV4cGVuc2Ugb2YgeW91ciBvd24uICBLZXJuZWwgZGV2ZWxvcGVycyBvZnRlbiBleHBlY3QgdG8KKyAgIGJlIHdvcmtpbmcgb24gdGhlIGtlcm5lbCB5ZWFycyBmcm9tIG5vdywgYnV0IHRoZXkgdW5kZXJzdGFuZCB0aGF0IHRoZWlyCisgICBlbXBsb3llciBjb3VsZCBjaGFuZ2UuICBUaGV5IHRydWx5IGFyZSwgYWxtb3N0IHdpdGhvdXQgZXhjZXB0aW9uLAorICAgd29ya2luZyB0b3dhcmQgdGhlIGNyZWF0aW9uIG9mIHRoZSBiZXN0IGtlcm5lbCB0aGV5IGNhbjsgdGhleSBhcmUgbm90CisgICB0cnlpbmcgdG8gY3JlYXRlIGRpc2NvbWZvcnQgZm9yIHRoZWlyIGVtcGxveWVycycgY29tcGV0aXRvcnMuCisKK1doYXQgYWxsIG9mIHRoaXMgY29tZXMgZG93biB0byBpcyB0aGF0LCB3aGVuIHJldmlld2VycyBzZW5kIHlvdSBjb21tZW50cywKK3lvdSBuZWVkIHRvIHBheSBhdHRlbnRpb24gdG8gdGhlIHRlY2huaWNhbCBvYnNlcnZhdGlvbnMgdGhhdCB0aGV5IGFyZQorbWFraW5nLiAgRG8gbm90IGxldCB0aGVpciBmb3JtIG9mIGV4cHJlc3Npb24gb3IgeW91ciBvd24gcHJpZGUga2VlcCB0aGF0Citmcm9tIGhhcHBlbmluZy4gIFdoZW4geW91IGdldCByZXZpZXcgY29tbWVudHMgb24gYSBwYXRjaCwgdGFrZSB0aGUgdGltZSB0bwordW5kZXJzdGFuZCB3aGF0IHRoZSByZXZpZXdlciBpcyB0cnlpbmcgdG8gc2F5LiAgSWYgcG9zc2libGUsIGZpeCB0aGUgdGhpbmdzCit0aGF0IHRoZSByZXZpZXdlciBpcyBhc2tpbmcgeW91IHRvIGZpeC4gIEFuZCByZXNwb25kIGJhY2sgdG8gdGhlIHJldmlld2VyOgordGhhbmsgdGhlbSwgYW5kIGRlc2NyaWJlIGhvdyB5b3Ugd2lsbCBhbnN3ZXIgdGhlaXIgcXVlc3Rpb25zLgorCitOb3RlIHRoYXQgeW91IGRvIG5vdCBoYXZlIHRvIGFncmVlIHdpdGggZXZlcnkgY2hhbmdlIHN1Z2dlc3RlZCBieQorcmV2aWV3ZXJzLiAgSWYgeW91IGJlbGlldmUgdGhhdCB0aGUgcmV2aWV3ZXIgaGFzIG1pc3VuZGVyc3Rvb2QgeW91ciBjb2RlLAorZXhwbGFpbiB3aGF0IGlzIHJlYWxseSBnb2luZyBvbi4gIElmIHlvdSBoYXZlIGEgdGVjaG5pY2FsIG9iamVjdGlvbiB0byBhCitzdWdnZXN0ZWQgY2hhbmdlLCBkZXNjcmliZSBpdCBhbmQganVzdGlmeSB5b3VyIHNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtLiAgSWYKK3lvdXIgZXhwbGFuYXRpb25zIG1ha2Ugc2Vuc2UsIHRoZSByZXZpZXdlciB3aWxsIGFjY2VwdCB0aGVtLiAgU2hvdWxkIHlvdXIKK2V4cGxhbmF0aW9uIG5vdCBwcm92ZSBwZXJzdWFzaXZlLCB0aG91Z2gsIGVzcGVjaWFsbHkgaWYgb3RoZXJzIHN0YXJ0IHRvCithZ3JlZSB3aXRoIHRoZSByZXZpZXdlciwgdGFrZSBzb21lIHRpbWUgdG8gdGhpbmsgdGhpbmdzIG92ZXIgYWdhaW4uICBJdCBjYW4KK2JlIGVhc3kgdG8gYmVjb21lIGJsaW5kZWQgYnkgeW91ciBvd24gc29sdXRpb24gdG8gYSBwcm9ibGVtIHRvIHRoZSBwb2ludAordGhhdCB5b3UgZG9uJ3QgcmVhbGl6ZSB0aGF0IHNvbWV0aGluZyBpcyBmdW5kYW1lbnRhbGx5IHdyb25nIG9yLCBwZXJoYXBzLAoreW91J3JlIG5vdCBldmVuIHNvbHZpbmcgdGhlIHJpZ2h0IHByb2JsZW0uCisKK0FuZHJldyBNb3J0b24gaGFzIHN1Z2dlc3RlZCB0aGF0IGV2ZXJ5IHJldmlldyBjb21tZW50IHdoaWNoIGRvZXMgbm90IHJlc3VsdAoraW4gYSBjb2RlIGNoYW5nZSBzaG91bGQgcmVzdWx0IGluIGFuIGFkZGl0aW9uYWwgY29kZSBjb21tZW50IGluc3RlYWQ7IHRoYXQKK2NhbiBoZWxwIGZ1dHVyZSByZXZpZXdlcnMgYXZvaWQgdGhlIHF1ZXN0aW9ucyB3aGljaCBjYW1lIHVwIHRoZSBmaXJzdCB0aW1lCithcm91bmQuCisKK09uZSBmYXRhbCBtaXN0YWtlIGlzIHRvIGlnbm9yZSByZXZpZXcgY29tbWVudHMgaW4gdGhlIGhvcGUgdGhhdCB0aGV5IHdpbGwKK2dvIGF3YXkuICBUaGV5IHdpbGwgbm90IGdvIGF3YXkuICBJZiB5b3UgcmVwb3N0IGNvZGUgd2l0aG91dCBoYXZpbmcKK3Jlc3BvbmRlZCB0byB0aGUgY29tbWVudHMgeW91IGdvdCB0aGUgdGltZSBiZWZvcmUsIHlvdSdyZSBsaWtlbHkgdG8gZmluZAordGhhdCB5b3VyIHBhdGNoZXMgZ28gbm93aGVyZS4KKworU3BlYWtpbmcgb2YgcmVwb3N0aW5nIGNvZGU6IHBsZWFzZSBiZWFyIGluIG1pbmQgdGhhdCByZXZpZXdlcnMgYXJlIG5vdAorZ29pbmcgdG8gcmVtZW1iZXIgYWxsIHRoZSBkZXRhaWxzIG9mIHRoZSBjb2RlIHlvdSBwb3N0ZWQgdGhlIGxhc3QgdGltZQorYXJvdW5kLiAgU28gaXQgaXMgYWx3YXlzIGEgZ29vZCBpZGVhIHRvIHJlbWluZCByZXZpZXdlcnMgb2YgcHJldmlvdXNseQorcmFpc2VkIGlzc3VlcyBhbmQgaG93IHlvdSBkZWFsdCB3aXRoIHRoZW07IHRoZSBwYXRjaCBjaGFuZ2Vsb2cgaXMgYSBnb29kCitwbGFjZSBmb3IgdGhpcyBraW5kIG9mIGluZm9ybWF0aW9uLiAgUmV2aWV3ZXJzIHNob3VsZCBub3QgaGF2ZSB0byBzZWFyY2gKK3Rocm91Z2ggbGlzdCBhcmNoaXZlcyB0byBmYW1pbGlhcml6ZSB0aGVtc2VsdmVzIHdpdGggd2hhdCB3YXMgc2FpZCBsYXN0Cit0aW1lOyBpZiB5b3UgaGVscCB0aGVtIGdldCBhIHJ1bm5pbmcgc3RhcnQsIHRoZXkgd2lsbCBiZSBpbiBhIGJldHRlciBtb29kCit3aGVuIHRoZXkgcmV2aXNpdCB5b3VyIGNvZGUuCisKK1doYXQgaWYgeW91J3ZlIHRyaWVkIHRvIGRvIGV2ZXJ5dGhpbmcgcmlnaHQgYW5kIHRoaW5ncyBzdGlsbCBhcmVuJ3QgZ29pbmcKK2FueXdoZXJlPyAgTW9zdCB0ZWNobmljYWwgZGlzYWdyZWVtZW50cyBjYW4gYmUgcmVzb2x2ZWQgdGhyb3VnaCBkaXNjdXNzaW9uLAorYnV0IHRoZXJlIGFyZSB0aW1lcyB3aGVuIHNvbWVib2R5IHNpbXBseSBoYXMgdG8gbWFrZSBhIGRlY2lzaW9uLiAgSWYgeW91Citob25lc3RseSBiZWxpZXZlIHRoYXQgdGhpcyBkZWNpc2lvbiBpcyBnb2luZyBhZ2FpbnN0IHlvdSB3cm9uZ2x5LCB5b3UgY2FuCithbHdheXMgdHJ5IGFwcGVhbGluZyB0byBhIGhpZ2hlciBwb3dlci4gIEFzIG9mIHRoaXMgd3JpdGluZywgdGhhdCBoaWdoZXIKK3Bvd2VyIHRlbmRzIHRvIGJlIEFuZHJldyBNb3J0b24uICBBbmRyZXcgaGFzIGEgZ3JlYXQgZGVhbCBvZiByZXNwZWN0IGluIHRoZQora2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eTsgaGUgY2FuIG9mdGVuIHVuamFtIGEgc2l0dWF0aW9uIHdoaWNoIHNlZW1zIHRvCitiZSBob3BlbGVzc2x5IGJsb2NrZWQuICBBcHBlYWxpbmcgdG8gQW5kcmV3IHNob3VsZCBub3QgYmUgZG9uZSBsaWdodGx5LAordGhvdWdoLCBhbmQgbm90IGJlZm9yZSBhbGwgb3RoZXIgYWx0ZXJuYXRpdmVzIGhhdmUgYmVlbiBleHBsb3JlZC4gIEFuZCBiZWFyCitpbiBtaW5kLCBvZiBjb3Vyc2UsIHRoYXQgaGUgbWF5IG5vdCBhZ3JlZSB3aXRoIHlvdSBlaXRoZXIuCisKKworV2hhdCBoYXBwZW5zIG5leHQKKy0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIGEgcGF0Y2ggaXMgY29uc2lkZXJlZCB0byBiZSBhIGdvb2QgdGhpbmcgdG8gYWRkIHRvIHRoZSBrZXJuZWwsIGFuZCBvbmNlCittb3N0IG9mIHRoZSByZXZpZXcgaXNzdWVzIGhhdmUgYmVlbiByZXNvbHZlZCwgdGhlIG5leHQgc3RlcCBpcyB1c3VhbGx5CitlbnRyeSBpbnRvIGEgc3Vic3lzdGVtIG1haW50YWluZXIncyB0cmVlLiAgSG93IHRoYXQgd29ya3MgdmFyaWVzIGZyb20gb25lCitzdWJzeXN0ZW0gdG8gdGhlIG5leHQ7IGVhY2ggbWFpbnRhaW5lciBoYXMgaGlzIG9yIGhlciBvd24gd2F5IG9mIGRvaW5nCit0aGluZ3MuICBJbiBwYXJ0aWN1bGFyLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSB0cmVlIC0gb25lLCBwZXJoYXBzLAorZGVkaWNhdGVkIHRvIHBhdGNoZXMgcGxhbm5lZCBmb3IgdGhlIG5leHQgbWVyZ2Ugd2luZG93LCBhbmQgYW5vdGhlciBmb3IKK2xvbmdlci10ZXJtIHdvcmsuCisKK0ZvciBwYXRjaGVzIGFwcGx5aW5nIHRvIGFyZWFzIGZvciB3aGljaCB0aGVyZSBpcyBubyBvYnZpb3VzIHN1YnN5c3RlbSB0cmVlCisobWVtb3J5IG1hbmFnZW1lbnQgcGF0Y2hlcywgZm9yIGV4YW1wbGUpLCB0aGUgZGVmYXVsdCB0cmVlIG9mdGVuIGVuZHMgdXAKK2JlaW5nIC1tbS4gIFBhdGNoZXMgd2hpY2ggYWZmZWN0IG11bHRpcGxlIHN1YnN5c3RlbXMgY2FuIGFsc28gZW5kIHVwIGdvaW5nCit0aHJvdWdoIHRoZSAtbW0gdHJlZS4KKworSW5jbHVzaW9uIGludG8gYSBzdWJzeXN0ZW0gdHJlZSBjYW4gYnJpbmcgYSBoaWdoZXIgbGV2ZWwgb2YgdmlzaWJpbGl0eSB0byBhCitwYXRjaC4gIE5vdyBvdGhlciBkZXZlbG9wZXJzIHdvcmtpbmcgd2l0aCB0aGF0IHRyZWUgd2lsbCBnZXQgdGhlIHBhdGNoIGJ5CitkZWZhdWx0LiAgU3Vic3lzdGVtIHRyZWVzIHR5cGljYWxseSBmZWVkIGxpbnV4LW5leHQgYXMgd2VsbCwgbWFraW5nIHRoZWlyCitjb250ZW50cyB2aXNpYmxlIHRvIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgYXMgYSB3aG9sZS4gIEF0IHRoaXMgcG9pbnQsCit0aGVyZSdzIGEgZ29vZCBjaGFuY2UgdGhhdCB5b3Ugd2lsbCBnZXQgbW9yZSBjb21tZW50cyBmcm9tIGEgbmV3IHNldCBvZgorcmV2aWV3ZXJzOyB0aGVzZSBjb21tZW50cyBuZWVkIHRvIGJlIGFuc3dlcmVkIGFzIGluIHRoZSBwcmV2aW91cyByb3VuZC4KKworV2hhdCBtYXkgYWxzbyBoYXBwZW4gYXQgdGhpcyBwb2ludCwgZGVwZW5kaW5nIG9uIHRoZSBuYXR1cmUgb2YgeW91ciBwYXRjaCwKK2lzIHRoYXQgY29uZmxpY3RzIHdpdGggd29yayBiZWluZyBkb25lIGJ5IG90aGVycyB0dXJuIHVwLiAgSW4gdGhlIHdvcnN0CitjYXNlLCBoZWF2eSBwYXRjaCBjb25mbGljdHMgY2FuIHJlc3VsdCBpbiBzb21lIHdvcmsgYmVpbmcgcHV0IG9uIHRoZSBiYWNrCitidXJuZXIgc28gdGhhdCB0aGUgcmVtYWluaW5nIHBhdGNoZXMgY2FuIGJlIHdvcmtlZCBpbnRvIHNoYXBlIGFuZCBtZXJnZWQuCitPdGhlciB0aW1lcywgY29uZmxpY3QgcmVzb2x1dGlvbiB3aWxsIGludm9sdmUgd29ya2luZyB3aXRoIHRoZSBvdGhlcgorZGV2ZWxvcGVycyBhbmQsIHBvc3NpYmx5LCBtb3Zpbmcgc29tZSBwYXRjaGVzIGJldHdlZW4gdHJlZXMgdG8gZW5zdXJlIHRoYXQKK2V2ZXJ5dGhpbmcgYXBwbGllcyBjbGVhbmx5LiAgVGhpcyB3b3JrIGNhbiBiZSBhIHBhaW4sIGJ1dCBjb3VudCB5b3VyCitibGVzc2luZ3M6IGJlZm9yZSB0aGUgYWR2ZW50IG9mIHRoZSBsaW51eC1uZXh0IHRyZWUsIHRoZXNlIGNvbmZsaWN0cyBvZnRlbgorb25seSB0dXJuZWQgdXAgZHVyaW5nIHRoZSBtZXJnZSB3aW5kb3cgYW5kIGhhZCB0byBiZSBhZGRyZXNzZWQgaW4gYSBodXJyeS4KK05vdyB0aGV5IGNhbiBiZSByZXNvbHZlZCBhdCBsZWlzdXJlLCBiZWZvcmUgdGhlIG1lcmdlIHdpbmRvdyBvcGVucy4KKworU29tZSBkYXksIGlmIGFsbCBnb2VzIHdlbGwsIHlvdSdsbCBsb2cgb24gYW5kIHNlZSB0aGF0IHlvdXIgcGF0Y2ggaGFzIGJlZW4KK21lcmdlZCBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwuICBDb25ncmF0dWxhdGlvbnMhICBPbmNlIHRoZSBjZWxlYnJhdGlvbiBpcworY29tcGxldGUgKGFuZCB5b3UgaGF2ZSBhZGRlZCB5b3Vyc2VsZiB0byB0aGUgTUFJTlRBSU5FUlMgZmlsZSksIHRob3VnaCwgaXQKK2lzIHdvcnRoIHJlbWVtYmVyaW5nIGFuIGltcG9ydGFudCBsaXR0bGUgZmFjdDogdGhlIGpvYiBzdGlsbCBpcyBub3QgZG9uZS4KK01lcmdpbmcgaW50byB0aGUgbWFpbmxpbmUgYnJpbmdzIGl0cyBvd24gY2hhbGxlbmdlcy4KKworVG8gYmVnaW4gd2l0aCwgdGhlIHZpc2liaWxpdHkgb2YgeW91ciBwYXRjaCBoYXMgaW5jcmVhc2VkIHlldCBhZ2Fpbi4gIFRoZXJlCittYXkgYmUgYSBuZXcgcm91bmQgb2YgY29tbWVudHMgZnJvbSBkZXZlbG9wZXJzIHdobyBoYWQgbm90IGJlZW4gYXdhcmUgb2YKK3RoZSBwYXRjaCBiZWZvcmUuICBJdCBtYXkgYmUgdGVtcHRpbmcgdG8gaWdub3JlIHRoZW0sIHNpbmNlIHRoZXJlIGlzIG5vCitsb25nZXIgYW55IHF1ZXN0aW9uIG9mIHlvdXIgY29kZSBiZWluZyBtZXJnZWQuICBSZXNpc3QgdGhhdCB0ZW1wdGF0aW9uLAordGhvdWdoOyB5b3Ugc3RpbGwgbmVlZCB0byBiZSByZXNwb25zaXZlIHRvIGRldmVsb3BlcnMgd2hvIGhhdmUgcXVlc3Rpb25zIG9yCitzdWdnZXN0aW9ucy4KKworTW9yZSBpbXBvcnRhbnRseSwgdGhvdWdoOiBpbmNsdXNpb24gaW50byB0aGUgbWFpbmxpbmUgcHV0cyB5b3VyIGNvZGUgaW50bwordGhlIGhhbmRzIG9mIGEgbXVjaCBsYXJnZXIgZ3JvdXAgb2YgdGVzdGVycy4gIEV2ZW4gaWYgeW91IGhhdmUgY29udHJpYnV0ZWQKK2EgZHJpdmVyIGZvciBoYXJkd2FyZSB3aGljaCBpcyBub3QgeWV0IGF2YWlsYWJsZSwgeW91IHdpbGwgYmUgc3VycHJpc2VkIGJ5Citob3cgbWFueSBwZW9wbGUgd2lsbCBidWlsZCB5b3VyIGNvZGUgaW50byB0aGVpciBrZXJuZWxzLiAgQW5kLCBvZiBjb3Vyc2UsCit3aGVyZSB0aGVyZSBhcmUgdGVzdGVycywgdGhlcmUgd2lsbCBiZSBidWcgcmVwb3J0cy4KKworVGhlIHdvcnN0IHNvcnQgb2YgYnVnIHJlcG9ydHMgYXJlIHJlZ3Jlc3Npb25zLiAgSWYgeW91ciBwYXRjaCBjYXVzZXMgYQorcmVncmVzc2lvbiwgeW91J2xsIGZpbmQgYW4gdW5jb21mb3J0YWJsZSBudW1iZXIgb2YgZXllcyB1cG9uIHlvdTsKK3JlZ3Jlc3Npb25zIG5lZWQgdG8gYmUgZml4ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS4gIElmIHlvdSBhcmUgdW53aWxsaW5nIG9yCit1bmFibGUgdG8gZml4IHRoZSByZWdyZXNzaW9uIChhbmQgbm9ib2R5IGVsc2UgZG9lcyBpdCBmb3IgeW91KSwgeW91ciBwYXRjaAord2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIHJlbW92ZWQgZHVyaW5nIHRoZSBzdGFiaWxpemF0aW9uIHBlcmlvZC4gIEJleW9uZAorbmVnYXRpbmcgYWxsIG9mIHRoZSB3b3JrIHlvdSBoYXZlIGRvbmUgdG8gZ2V0IHlvdXIgcGF0Y2ggaW50byB0aGUgbWFpbmxpbmUsCitoYXZpbmcgYSBwYXRjaCBwdWxsZWQgYXMgdGhlIHJlc3VsdCBvZiBhIGZhaWx1cmUgdG8gZml4IGEgcmVncmVzc2lvbiBjb3VsZAord2VsbCBtYWtlIGl0IGhhcmRlciBmb3IgeW91IHRvIGdldCB3b3JrIG1lcmdlZCBpbiB0aGUgZnV0dXJlLgorCitBZnRlciBhbnkgcmVncmVzc2lvbnMgaGF2ZSBiZWVuIGRlYWx0IHdpdGgsIHRoZXJlIG1heSBiZSBvdGhlciwgb3JkaW5hcnkKK2J1Z3MgdG8gZGVhbCB3aXRoLiAgVGhlIHN0YWJpbGl6YXRpb24gcGVyaW9kIGlzIHlvdXIgYmVzdCBvcHBvcnR1bml0eSB0bworZml4IHRoZXNlIGJ1Z3MgYW5kIGVuc3VyZSB0aGF0IHlvdXIgY29kZSdzIGRlYnV0IGluIGEgbWFpbmxpbmUga2VybmVsCityZWxlYXNlIGlzIGFzIHNvbGlkIGFzIHBvc3NpYmxlLiAgU28sIHBsZWFzZSwgYW5zd2VyIGJ1ZyByZXBvcnRzLCBhbmQgZml4Cit0aGUgcHJvYmxlbXMgaWYgYXQgYWxsIHBvc3NpYmxlLiAgVGhhdCdzIHdoYXQgdGhlIHN0YWJpbGl6YXRpb24gcGVyaW9kIGlzCitmb3I7IHlvdSBjYW4gc3RhcnQgY3JlYXRpbmcgY29vbCBuZXcgcGF0Y2hlcyBvbmNlIGFueSBwcm9ibGVtcyB3aXRoIHRoZSBvbGQKK29uZXMgaGF2ZSBiZWVuIHRha2VuIGNhcmUgb2YuCisKK0FuZCBkb24ndCBmb3JnZXQgdGhhdCB0aGVyZSBhcmUgb3RoZXIgbWlsZXN0b25lcyB3aGljaCBtYXkgYWxzbyBjcmVhdGUgYnVnCityZXBvcnRzOiB0aGUgbmV4dCBtYWlubGluZSBzdGFibGUgcmVsZWFzZSwgd2hlbiBwcm9taW5lbnQgZGlzdHJpYnV0b3JzIHBpY2sKK3VwIGEgdmVyc2lvbiBvZiB0aGUga2VybmVsIGNvbnRhaW5pbmcgeW91ciBwYXRjaCwgZXRjLiAgQ29udGludWluZyB0bworcmVzcG9uZCB0byB0aGVzZSByZXBvcnRzIGlzIGEgbWF0dGVyIG9mIGJhc2ljIHByaWRlIGluIHlvdXIgd29yay4gIElmIHRoYXQKK2lzIGluc3VmZmljaWVudCBtb3RpdmF0aW9uLCB0aG91Z2gsIGl0J3MgYWxzbyB3b3J0aCBjb25zaWRlcmluZyB0aGF0IHRoZQorZGV2ZWxvcG1lbnQgY29tbXVuaXR5IHJlbWVtYmVycyBkZXZlbG9wZXJzIHdobyBsb3NlIGludGVyZXN0IGluIHRoZWlyIGNvZGUKK2FmdGVyIGl0J3MgbWVyZ2VkLiAgVGhlIG5leHQgdGltZSB5b3UgcG9zdCBhIHBhdGNoLCB0aGV5IHdpbGwgYmUgZXZhbHVhdGluZworaXQgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHlvdSB3aWxsIG5vdCBiZSBhcm91bmQgdG8gbWFpbnRhaW4gaXQKK2FmdGVyd2FyZC4KKworCitPdGhlciB0aGluZ3MgdGhhdCBjYW4gaGFwcGVuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPbmUgZGF5LCB5b3UgbWF5IG9wZW4geW91ciBtYWlsIGNsaWVudCBhbmQgc2VlIHRoYXQgc29tZWJvZHkgaGFzIG1haWxlZCB5b3UKK2EgcGF0Y2ggdG8geW91ciBjb2RlLiAgVGhhdCBpcyBvbmUgb2YgdGhlIGFkdmFudGFnZXMgb2YgaGF2aW5nIHlvdXIgY29kZQorb3V0IHRoZXJlIGluIHRoZSBvcGVuLCBhZnRlciBhbGwuICBJZiB5b3UgYWdyZWUgd2l0aCB0aGUgcGF0Y2gsIHlvdSBjYW4KK2VpdGhlciBmb3J3YXJkIGl0IG9uIHRvIHRoZSBzdWJzeXN0ZW0gbWFpbnRhaW5lciAoYmUgc3VyZSB0byBpbmNsdWRlIGEKK3Byb3BlciBGcm9tOiBsaW5lIHNvIHRoYXQgdGhlIGF0dHJpYnV0aW9uIGlzIGNvcnJlY3QsIGFuZCBhZGQgYSBzaWdub2ZmIG9mCit5b3VyIG93biksIG9yIHNlbmQgYW4gQWNrZWQtYnk6IHJlc3BvbnNlIGJhY2sgYW5kIGxldCB0aGUgb3JpZ2luYWwgcG9zdGVyCitzZW5kIGl0IHVwd2FyZC4KKworSWYgeW91IGRpc2FncmVlIHdpdGggdGhlIHBhdGNoLCBzZW5kIGEgcG9saXRlIHJlc3BvbnNlIGV4cGxhaW5pbmcgd2h5LiAgSWYKK3Bvc3NpYmxlLCB0ZWxsIHRoZSBhdXRob3Igd2hhdCBjaGFuZ2VzIG5lZWQgdG8gYmUgbWFkZSB0byBtYWtlIHRoZSBwYXRjaAorYWNjZXB0YWJsZSB0byB5b3UuICBUaGVyZSBpcyBhIGNlcnRhaW4gcmVzaXN0YW5jZSB0byBtZXJnaW5nIHBhdGNoZXMgd2hpY2gKK2FyZSBvcHBvc2VkIGJ5IHRoZSBhdXRob3IgYW5kIG1haW50YWluZXIgb2YgdGhlIGNvZGUsIGJ1dCBpdCBvbmx5IGdvZXMgc28KK2Zhci4gIElmIHlvdSBhcmUgc2VlbiBhcyBuZWVkbGVzc2x5IGJsb2NraW5nIGdvb2Qgd29yaywgdGhvc2UgcGF0Y2hlcyB3aWxsCitldmVudHVhbGx5IGZsb3cgYXJvdW5kIHlvdSBhbmQgZ2V0IGludG8gdGhlIG1haW5saW5lIGFueXdheS4gIEluIHRoZSBMaW51eAora2VybmVsLCBub2JvZHkgaGFzIGFic29sdXRlIHZldG8gcG93ZXIgb3ZlciBhbnkgY29kZS4gIEV4Y2VwdCBtYXliZSBMaW51cy4KKworT24gdmVyeSByYXJlIG9jY2FzaW9uLCB5b3UgbWF5IHNlZSBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQ6IGFub3RoZXIKK2RldmVsb3BlciBwb3N0cyBhIGRpZmZlcmVudCBzb2x1dGlvbiB0byB5b3VyIHByb2JsZW0uICBBdCB0aGF0IHBvaW50LAorY2hhbmNlcyBhcmUgdGhhdCBvbmUgb2YgdGhlIHR3byBwYXRjaGVzIHdpbGwgbm90IGJlIG1lcmdlZCwgYW5kICJtaW5lIHdhcworaGVyZSBmaXJzdCIgaXMgbm90IGNvbnNpZGVyZWQgdG8gYmUgYSBjb21wZWxsaW5nIHRlY2huaWNhbCBhcmd1bWVudC4gIElmCitzb21lYm9keSBlbHNlJ3MgcGF0Y2ggZGlzcGxhY2VzIHlvdXJzIGFuZCBnZXRzIGludG8gdGhlIG1haW5saW5lLCB0aGVyZSBpcworcmVhbGx5IG9ubHkgb25lIHdheSB0byByZXNwb25kOiBiZSBwbGVhc2VkIHRoYXQgeW91ciBwcm9ibGVtIGdvdCBzb2x2ZWQgYW5kCitnZXQgb24gd2l0aCB5b3VyIHdvcmsuICBIYXZpbmcgb25lJ3Mgd29yayBzaG92ZWQgYXNpZGUgaW4gdGhpcyBtYW5uZXIgY2FuCitiZSBodXJ0ZnVsIGFuZCBkaXNjb3VyYWdpbmcsIGJ1dCB0aGUgY29tbXVuaXR5IHdpbGwgcmVtZW1iZXIgeW91ciByZWFjdGlvbgorbG9uZyBhZnRlciB0aGV5IGhhdmUgZm9yZ290dGVuIHdob3NlIHBhdGNoIGFjdHVhbGx5IGdvdCBtZXJnZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNy5BZHZhbmNlZFRvcGljcyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy83LkFkdmFuY2VkVG9waWNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmRjM2ZhLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy83LkFkdmFuY2VkVG9waWNzCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLTc6IEFEVkFOQ0VEIFRPUElDUwotCi1BdCB0aGlzIHBvaW50LCBob3BlZnVsbHksIHlvdSBoYXZlIGEgaGFuZGxlIG9uIGhvdyB0aGUgZGV2ZWxvcG1lbnQgcHJvY2Vzcwotd29ya3MuICBUaGVyZSBpcyBzdGlsbCBtb3JlIHRvIGxlYXJuLCBob3dldmVyISAgVGhpcyBzZWN0aW9uIHdpbGwgY292ZXIgYQotbnVtYmVyIG9mIHRvcGljcyB3aGljaCBjYW4gYmUgaGVscGZ1bCBmb3IgZGV2ZWxvcGVycyB3YW50aW5nIHRvIGJlY29tZSBhCi1yZWd1bGFyIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzLgotCi03LjE6IE1BTkFHSU5HIFBBVENIRVMgV0lUSCBHSVQKLQotVGhlIHVzZSBvZiBkaXN0cmlidXRlZCB2ZXJzaW9uIGNvbnRyb2wgZm9yIHRoZSBrZXJuZWwgYmVnYW4gaW4gZWFybHkgMjAwMiwKLXdoZW4gTGludXMgZmlyc3Qgc3RhcnRlZCBwbGF5aW5nIHdpdGggdGhlIHByb3ByaWV0YXJ5IEJpdEtlZXBlcgotYXBwbGljYXRpb24uICBXaGlsZSBCaXRLZWVwZXIgd2FzIGNvbnRyb3ZlcnNpYWwsIHRoZSBhcHByb2FjaCB0byBzb2Z0d2FyZQotdmVyc2lvbiBtYW5hZ2VtZW50IGl0IGVtYm9kaWVkIG1vc3QgY2VydGFpbmx5IHdhcyBub3QuICBEaXN0cmlidXRlZCB2ZXJzaW9uCi1jb250cm9sIGVuYWJsZWQgYW4gaW1tZWRpYXRlIGFjY2VsZXJhdGlvbiBvZiB0aGUga2VybmVsIGRldmVsb3BtZW50Ci1wcm9qZWN0LiAgSW4gY3VycmVudCB0aW1lcywgdGhlcmUgYXJlIHNldmVyYWwgZnJlZSBhbHRlcm5hdGl2ZXMgdG8KLUJpdEtlZXBlci4gIEZvciBiZXR0ZXIgb3IgZm9yIHdvcnNlLCB0aGUga2VybmVsIHByb2plY3QgaGFzIHNldHRsZWQgb24gZ2l0Ci1hcyBpdHMgdG9vbCBvZiBjaG9pY2UuCi0KLU1hbmFnaW5nIHBhdGNoZXMgd2l0aCBnaXQgY2FuIG1ha2UgbGlmZSBtdWNoIGVhc2llciBmb3IgdGhlIGRldmVsb3BlciwKLWVzcGVjaWFsbHkgYXMgdGhlIHZvbHVtZSBvZiB0aG9zZSBwYXRjaGVzIGdyb3dzLiAgR2l0IGFsc28gaGFzIGl0cyByb3VnaAotZWRnZXMgYW5kIHBvc2VzIGNlcnRhaW4gaGF6YXJkczsgaXQgaXMgYSB5b3VuZyBhbmQgcG93ZXJmdWwgdG9vbCB3aGljaCBpcwotc3RpbGwgYmVpbmcgY2l2aWxpemVkIGJ5IGl0cyBkZXZlbG9wZXJzLiAgVGhpcyBkb2N1bWVudCB3aWxsIG5vdCBhdHRlbXB0IHRvCi10ZWFjaCB0aGUgcmVhZGVyIGhvdyB0byB1c2UgZ2l0OyB0aGF0IHdvdWxkIGJlIHN1ZmZpY2llbnQgbWF0ZXJpYWwgZm9yIGEKLWxvbmcgZG9jdW1lbnQgaW4gaXRzIG93biByaWdodC4gIEluc3RlYWQsIHRoZSBmb2N1cyBoZXJlIHdpbGwgYmUgb24gaG93IGdpdAotZml0cyBpbnRvIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyBpbiBwYXJ0aWN1bGFyLiAgRGV2ZWxvcGVycyB3aG8KLXdpc2ggdG8gY29tZSB1cCB0byBzcGVlZCB3aXRoIGdpdCB3aWxsIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBhdDoKLQotCWh0dHA6Ly9naXQtc2NtLmNvbS8KLQotCWh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzL3VzZXItbWFudWFsLmh0bWwKLQotYW5kIG9uIHZhcmlvdXMgdHV0b3JpYWxzIGZvdW5kIG9uIHRoZSB3ZWIuCi0KLVRoZSBmaXJzdCBvcmRlciBvZiBidXNpbmVzcyBpcyB0byByZWFkIHRoZSBhYm92ZSBzaXRlcyBhbmQgZ2V0IGEgc29saWQKLXVuZGVyc3RhbmRpbmcgb2YgaG93IGdpdCB3b3JrcyBiZWZvcmUgdHJ5aW5nIHRvIHVzZSBpdCB0byBtYWtlIHBhdGNoZXMKLWF2YWlsYWJsZSB0byBvdGhlcnMuICBBIGdpdC11c2luZyBkZXZlbG9wZXIgc2hvdWxkIGJlIGFibGUgdG8gb2J0YWluIGEgY29weQotb2YgdGhlIG1haW5saW5lIHJlcG9zaXRvcnksIGV4cGxvcmUgdGhlIHJldmlzaW9uIGhpc3RvcnksIGNvbW1pdCBjaGFuZ2VzIHRvCi10aGUgdHJlZSwgdXNlIGJyYW5jaGVzLCBldGMuICBBbiB1bmRlcnN0YW5kaW5nIG9mIGdpdCdzIHRvb2xzIGZvciB0aGUKLXJld3JpdGluZyBvZiBoaXN0b3J5IChzdWNoIGFzIHJlYmFzZSkgaXMgYWxzbyB1c2VmdWwuICBHaXQgY29tZXMgd2l0aCBpdHMKLW93biB0ZXJtaW5vbG9neSBhbmQgY29uY2VwdHM7IGEgbmV3IHVzZXIgb2YgZ2l0IHNob3VsZCBrbm93IGFib3V0IHJlZnMsCi1yZW1vdGUgYnJhbmNoZXMsIHRoZSBpbmRleCwgZmFzdC1mb3J3YXJkIG1lcmdlcywgcHVzaGVzIGFuZCBwdWxscywgZGV0YWNoZWQKLWhlYWRzLCBldGMuICBJdCBjYW4gYWxsIGJlIGEgbGl0dGxlIGludGltaWRhdGluZyBhdCB0aGUgb3V0c2V0LCBidXQgdGhlCi1jb25jZXB0cyBhcmUgbm90IHRoYXQgaGFyZCB0byBncmFzcCB3aXRoIGEgYml0IG9mIHN0dWR5LgotCi1Vc2luZyBnaXQgdG8gZ2VuZXJhdGUgcGF0Y2hlcyBmb3Igc3VibWlzc2lvbiBieSBlbWFpbCBjYW4gYmUgYSBnb29kCi1leGVyY2lzZSB3aGlsZSBjb21pbmcgdXAgdG8gc3BlZWQuCi0KLVdoZW4geW91IGFyZSByZWFkeSB0byBzdGFydCBwdXR0aW5nIHVwIGdpdCB0cmVlcyBmb3Igb3RoZXJzIHRvIGxvb2sgYXQsIHlvdQotd2lsbCwgb2YgY291cnNlLCBuZWVkIGEgc2VydmVyIHRoYXQgY2FuIGJlIHB1bGxlZCBmcm9tLiAgU2V0dGluZyB1cCBzdWNoIGEKLXNlcnZlciB3aXRoIGdpdC1kYWVtb24gaXMgcmVsYXRpdmVseSBzdHJhaWdodGZvcndhcmQgaWYgeW91IGhhdmUgYSBzeXN0ZW0KLXdoaWNoIGlzIGFjY2Vzc2libGUgdG8gdGhlIEludGVybmV0LiAgT3RoZXJ3aXNlLCBmcmVlLCBwdWJsaWMgaG9zdGluZyBzaXRlcwotKEdpdGh1YiwgZm9yIGV4YW1wbGUpIGFyZSBzdGFydGluZyB0byBhcHBlYXIgb24gdGhlIG5ldC4gIEVzdGFibGlzaGVkCi1kZXZlbG9wZXJzIGNhbiBnZXQgYW4gYWNjb3VudCBvbiBrZXJuZWwub3JnLCBidXQgdGhvc2UgYXJlIG5vdCBlYXN5IHRvIGNvbWUKLWJ5OyBzZWUgaHR0cDovL2tlcm5lbC5vcmcvZmFxLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotVGhlIG5vcm1hbCBnaXQgd29ya2Zsb3cgaW52b2x2ZXMgdGhlIHVzZSBvZiBhIGxvdCBvZiBicmFuY2hlcy4gIEVhY2ggbGluZQotb2YgZGV2ZWxvcG1lbnQgY2FuIGJlIHNlcGFyYXRlZCBpbnRvIGEgc2VwYXJhdGUgInRvcGljIGJyYW5jaCIgYW5kCi1tYWludGFpbmVkIGluZGVwZW5kZW50bHkuICBCcmFuY2hlcyBpbiBnaXQgYXJlIGNoZWFwLCB0aGVyZSBpcyBubyByZWFzb24gdG8KLW5vdCBtYWtlIGZyZWUgdXNlIG9mIHRoZW0uICBBbmQsIGluIGFueSBjYXNlLCB5b3Ugc2hvdWxkIG5vdCBkbyB5b3VyCi1kZXZlbG9wbWVudCBpbiBhbnkgYnJhbmNoIHdoaWNoIHlvdSBpbnRlbmQgdG8gYXNrIG90aGVycyB0byBwdWxsIGZyb20uCi1QdWJsaWNseS1hdmFpbGFibGUgYnJhbmNoZXMgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aCBjYXJlOyBtZXJnZSBpbiBwYXRjaGVzCi1mcm9tIGRldmVsb3BtZW50IGJyYW5jaGVzIHdoZW4gdGhleSBhcmUgaW4gY29tcGxldGUgZm9ybSBhbmQgcmVhZHkgdG8gZ28gLQotbm90IGJlZm9yZS4KLQotR2l0IHByb3ZpZGVzIHNvbWUgcG93ZXJmdWwgdG9vbHMgd2hpY2ggY2FuIGFsbG93IHlvdSB0byByZXdyaXRlIHlvdXIKLWRldmVsb3BtZW50IGhpc3RvcnkuICBBbiBpbmNvbnZlbmllbnQgcGF0Y2ggKG9uZSB3aGljaCBicmVha3MgYmlzZWN0aW9uLAotc2F5LCBvciB3aGljaCBoYXMgc29tZSBvdGhlciBzb3J0IG9mIG9idmlvdXMgYnVnKSBjYW4gYmUgZml4ZWQgaW4gcGxhY2Ugb3IKLW1hZGUgdG8gZGlzYXBwZWFyIGZyb20gdGhlIGhpc3RvcnkgZW50aXJlbHkuICBBIHBhdGNoIHNlcmllcyBjYW4gYmUKLXJld3JpdHRlbiBhcyBpZiBpdCBoYWQgYmVlbiB3cml0dGVuIG9uIHRvcCBvZiB0b2RheSdzIG1haW5saW5lLCBldmVuIHRob3VnaAoteW91IGhhdmUgYmVlbiB3b3JraW5nIG9uIGl0IGZvciBtb250aHMuICBDaGFuZ2VzIGNhbiBiZSB0cmFuc3BhcmVudGx5Ci1zaGlmdGVkIGZyb20gb25lIGJyYW5jaCB0byBhbm90aGVyLiAgQW5kIHNvIG9uLiAgSnVkaWNpb3VzIHVzZSBvZiBnaXQncwotYWJpbGl0eSB0byByZXZpc2UgaGlzdG9yeSBjYW4gaGVscCBpbiB0aGUgY3JlYXRpb24gb2YgY2xlYW4gcGF0Y2ggc2V0cyB3aXRoCi1mZXdlciBwcm9ibGVtcy4KLQotRXhjZXNzaXZlIHVzZSBvZiB0aGlzIGNhcGFiaWxpdHkgY2FuIGxlYWQgdG8gb3RoZXIgcHJvYmxlbXMsIHRob3VnaCwgYmV5b25kCi1hIHNpbXBsZSBvYnNlc3Npb24gZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgcGVyZmVjdCBwcm9qZWN0IGhpc3RvcnkuCi1SZXdyaXRpbmcgaGlzdG9yeSB3aWxsIHJld3JpdGUgdGhlIGNoYW5nZXMgY29udGFpbmVkIGluIHRoYXQgaGlzdG9yeSwKLXR1cm5pbmcgYSB0ZXN0ZWQgKGhvcGVmdWxseSkga2VybmVsIHRyZWUgaW50byBhbiB1bnRlc3RlZCBvbmUuICBCdXQsIGJleW9uZAotdGhhdCwgZGV2ZWxvcGVycyBjYW5ub3QgZWFzaWx5IGNvbGxhYm9yYXRlIGlmIHRoZXkgZG8gbm90IGhhdmUgYSBzaGFyZWQKLXZpZXcgb2YgdGhlIHByb2plY3QgaGlzdG9yeTsgaWYgeW91IHJld3JpdGUgaGlzdG9yeSB3aGljaCBvdGhlciBkZXZlbG9wZXJzCi1oYXZlIHB1bGxlZCBpbnRvIHRoZWlyIHJlcG9zaXRvcmllcywgeW91IHdpbGwgbWFrZSBsaWZlIG11Y2ggbW9yZSBkaWZmaWN1bHQKLWZvciB0aG9zZSBkZXZlbG9wZXJzLiAgU28gYSBzaW1wbGUgcnVsZSBvZiB0aHVtYiBhcHBsaWVzIGhlcmU6IGhpc3RvcnkKLXdoaWNoIGhhcyBiZWVuIGV4cG9ydGVkIHRvIG90aGVycyBzaG91bGQgZ2VuZXJhbGx5IGJlIHNlZW4gYXMgaW1tdXRhYmxlCi10aGVyZWFmdGVyLgotCi1Tbywgb25jZSB5b3UgcHVzaCBhIHNldCBvZiBjaGFuZ2VzIHRvIHlvdXIgcHVibGljbHktYXZhaWxhYmxlIHNlcnZlciwgdGhvc2UKLWNoYW5nZXMgc2hvdWxkIG5vdCBiZSByZXdyaXR0ZW4uICBHaXQgd2lsbCBhdHRlbXB0IHRvIGVuZm9yY2UgdGhpcyBydWxlIGlmCi15b3UgdHJ5IHRvIHB1c2ggY2hhbmdlcyB3aGljaCBkbyBub3QgcmVzdWx0IGluIGEgZmFzdC1mb3J3YXJkIG1lcmdlCi0oaS5lLiBjaGFuZ2VzIHdoaWNoIGRvIG5vdCBzaGFyZSB0aGUgc2FtZSBoaXN0b3J5KS4gIEl0IGlzIHBvc3NpYmxlIHRvCi1vdmVycmlkZSB0aGlzIGNoZWNrLCBhbmQgdGhlcmUgbWF5IGJlIHRpbWVzIHdoZW4gaXQgaXMgbmVjZXNzYXJ5IHRvIHJld3JpdGUKLWFuIGV4cG9ydGVkIHRyZWUuICBNb3ZpbmcgY2hhbmdlc2V0cyBiZXR3ZWVuIHRyZWVzIHRvIGF2b2lkIGNvbmZsaWN0cyBpbgotbGludXgtbmV4dCBpcyBvbmUgZXhhbXBsZS4gIEJ1dCBzdWNoIGFjdGlvbnMgc2hvdWxkIGJlIHJhcmUuICBUaGlzIGlzIG9uZQotb2YgdGhlIHJlYXNvbnMgd2h5IGRldmVsb3BtZW50IHNob3VsZCBiZSBkb25lIGluIHByaXZhdGUgYnJhbmNoZXMgKHdoaWNoCi1jYW4gYmUgcmV3cml0dGVuIGlmIG5lY2Vzc2FyeSkgYW5kIG9ubHkgbW92ZWQgaW50byBwdWJsaWMgYnJhbmNoZXMgd2hlbgotaXQncyBpbiBhIHJlYXNvbmFibHkgYWR2YW5jZWQgc3RhdGUuCi0KLUFzIHRoZSBtYWlubGluZSAob3Igb3RoZXIgdHJlZSB1cG9uIHdoaWNoIGEgc2V0IG9mIGNoYW5nZXMgaXMgYmFzZWQpCi1hZHZhbmNlcywgaXQgaXMgdGVtcHRpbmcgdG8gbWVyZ2Ugd2l0aCB0aGF0IHRyZWUgdG8gc3RheSBvbiB0aGUgbGVhZGluZwotZWRnZS4gIEZvciBhIHByaXZhdGUgYnJhbmNoLCByZWJhc2luZyBjYW4gYmUgYW4gZWFzeSB3YXkgdG8ga2VlcCB1cCB3aXRoCi1hbm90aGVyIHRyZWUsIGJ1dCByZWJhc2luZyBpcyBub3QgYW4gb3B0aW9uIG9uY2UgYSB0cmVlIGlzIGV4cG9ydGVkIHRvIHRoZQotd29ybGQuICBPbmNlIHRoYXQgaGFwcGVucywgYSBmdWxsIG1lcmdlIG11c3QgYmUgZG9uZS4gIE1lcmdpbmcgb2NjYXNpb25hbGx5Ci1tYWtlcyBnb29kIHNlbnNlLCBidXQgb3Zlcmx5IGZyZXF1ZW50IG1lcmdlcyBjYW4gY2x1dHRlciB0aGUgaGlzdG9yeQotbmVlZGxlc3NseS4gIFN1Z2dlc3RlZCB0ZWNobmlxdWUgaW4gdGhpcyBjYXNlIGlzIHRvIG1lcmdlIGluZnJlcXVlbnRseSwgYW5kCi1nZW5lcmFsbHkgb25seSBhdCBzcGVjaWZpYyByZWxlYXNlIHBvaW50cyAoc3VjaCBhcyBhIG1haW5saW5lIC1yYwotcmVsZWFzZSkuICBJZiB5b3UgYXJlIG5lcnZvdXMgYWJvdXQgc3BlY2lmaWMgY2hhbmdlcywgeW91IGNhbiBhbHdheXMKLXBlcmZvcm0gdGVzdCBtZXJnZXMgaW4gYSBwcml2YXRlIGJyYW5jaC4gIFRoZSBnaXQgInJlcmVyZSIgdG9vbCBjYW4gYmUKLXVzZWZ1bCBpbiBzdWNoIHNpdHVhdGlvbnM7IGl0IHJlbWVtYmVycyBob3cgbWVyZ2UgY29uZmxpY3RzIHdlcmUgcmVzb2x2ZWQKLXNvIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gZG8gdGhlIHNhbWUgd29yayB0d2ljZS4KLQotT25lIG9mIHRoZSBiaWdnZXN0IHJlY3VycmluZyBjb21wbGFpbnRzIGFib3V0IHRvb2xzIGxpa2UgZ2l0IGlzIHRoaXM6IHRoZQotbWFzcyBtb3ZlbWVudCBvZiBwYXRjaGVzIGZyb20gb25lIHJlcG9zaXRvcnkgdG8gYW5vdGhlciBtYWtlcyBpdCBlYXN5IHRvCi1zbGlwIGluIGlsbC1hZHZpc2VkIGNoYW5nZXMgd2hpY2ggZ28gaW50byB0aGUgbWFpbmxpbmUgYmVsb3cgdGhlIHJldmlldwotcmFkYXIuICBLZXJuZWwgZGV2ZWxvcGVycyB0ZW5kIHRvIGdldCB1bmhhcHB5IHdoZW4gdGhleSBzZWUgdGhhdCBraW5kIG9mCi10aGluZyBoYXBwZW5pbmc7IHB1dHRpbmcgdXAgYSBnaXQgdHJlZSB3aXRoIHVucmV2aWV3ZWQgb3Igb2ZmLXRvcGljIHBhdGNoZXMKLWNhbiBhZmZlY3QgeW91ciBhYmlsaXR5IHRvIGdldCB0cmVlcyBwdWxsZWQgaW4gdGhlIGZ1dHVyZS4gIFF1b3RpbmcgTGludXM6Ci0KLQlZb3UgY2FuIHNlbmQgbWUgcGF0Y2hlcywgYnV0IGZvciBtZSB0byBwdWxsIGEgZ2l0IHBhdGNoIGZyb20geW91LCBJCi0JbmVlZCB0byBrbm93IHRoYXQgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcsIGFuZCBJIG5lZWQgdG8gYmUgYWJsZQotCXRvIHRydXN0IHRoaW5ncyAqd2l0aG91dCogdGhlbiBoYXZpbmcgdG8gZ28gYW5kIGNoZWNrIGV2ZXJ5Ci0JaW5kaXZpZHVhbCBjaGFuZ2UgYnkgaGFuZC4KLQotKGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzIyNDEzNS8pLgotCi1UbyBhdm9pZCB0aGlzIGtpbmQgb2Ygc2l0dWF0aW9uLCBlbnN1cmUgdGhhdCBhbGwgcGF0Y2hlcyB3aXRoaW4gYSBnaXZlbgotYnJhbmNoIHN0aWNrIGNsb3NlbHkgdG8gdGhlIGFzc29jaWF0ZWQgdG9waWM7IGEgImRyaXZlciBmaXhlcyIgYnJhbmNoCi1zaG91bGQgbm90IGJlIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUuICBBbmQsIG1vc3QKLWltcG9ydGFudGx5LCBkbyBub3QgdXNlIGEgZ2l0IHRyZWUgdG8gYnlwYXNzIHRoZSByZXZpZXcgcHJvY2Vzcy4gIFBvc3QgYW4KLW9jY2FzaW9uYWwgc3VtbWFyeSBvZiB0aGUgdHJlZSB0byB0aGUgcmVsZXZhbnQgbGlzdCwgYW5kLCB3aGVuIHRoZSB0aW1lIGlzCi1yaWdodCwgcmVxdWVzdCB0aGF0IHRoZSB0cmVlIGJlIGluY2x1ZGVkIGluIGxpbnV4LW5leHQuCi0KLUlmIGFuZCB3aGVuIG90aGVycyBzdGFydCB0byBzZW5kIHBhdGNoZXMgZm9yIGluY2x1c2lvbiBpbnRvIHlvdXIgdHJlZSwKLWRvbid0IGZvcmdldCB0byByZXZpZXcgdGhlbS4gIEFsc28gZW5zdXJlIHRoYXQgeW91IG1haW50YWluIHRoZSBjb3JyZWN0Ci1hdXRob3JzaGlwIGluZm9ybWF0aW9uOyB0aGUgZ2l0ICJhbSIgdG9vbCBkb2VzIGl0cyBiZXN0IGluIHRoaXMgcmVnYXJkLCBidXQKLXlvdSBtYXkgaGF2ZSB0byBhZGQgYSAiRnJvbToiIGxpbmUgdG8gdGhlIHBhdGNoIGlmIGl0IGhhcyBiZWVuIHJlbGF5ZWQgdG8KLXlvdSB2aWEgYSB0aGlyZCBwYXJ0eS4KLQotV2hlbiByZXF1ZXN0aW5nIGEgcHVsbCwgYmUgc3VyZSB0byBnaXZlIGFsbCB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb246IHdoZXJlCi15b3VyIHRyZWUgaXMsIHdoYXQgYnJhbmNoIHRvIHB1bGwsIGFuZCB3aGF0IGNoYW5nZXMgd2lsbCByZXN1bHQgZnJvbSB0aGUKLXB1bGwuICBUaGUgZ2l0IHJlcXVlc3QtcHVsbCBjb21tYW5kIGNhbiBiZSBoZWxwZnVsIGluIHRoaXMgcmVnYXJkOyBpdCB3aWxsCi1mb3JtYXQgdGhlIHJlcXVlc3QgYXMgb3RoZXIgZGV2ZWxvcGVycyBleHBlY3QsIGFuZCB3aWxsIGFsc28gY2hlY2sgdG8gYmUKLXN1cmUgdGhhdCB5b3UgaGF2ZSByZW1lbWJlcmVkIHRvIHB1c2ggdGhvc2UgY2hhbmdlcyB0byB0aGUgcHVibGljIHNlcnZlci4KLQotCi03LjI6IFJFVklFV0lORyBQQVRDSEVTCi0KLVNvbWUgcmVhZGVycyB3aWxsIGNlcnRhaW5seSBvYmplY3QgdG8gcHV0dGluZyB0aGlzIHNlY3Rpb24gd2l0aCAiYWR2YW5jZWQKLXRvcGljcyIgb24gdGhlIGdyb3VuZHMgdGhhdCBldmVuIGJlZ2lubmluZyBrZXJuZWwgZGV2ZWxvcGVycyBzaG91bGQgYmUKLXJldmlld2luZyBwYXRjaGVzLiAgSXQgaXMgY2VydGFpbmx5IHRydWUgdGhhdCB0aGVyZSBpcyBubyBiZXR0ZXIgd2F5IHRvCi1sZWFybiBob3cgdG8gcHJvZ3JhbSBpbiB0aGUga2VybmVsIGVudmlyb25tZW50IHRoYW4gYnkgbG9va2luZyBhdCBjb2RlCi1wb3N0ZWQgYnkgb3RoZXJzLiAgSW4gYWRkaXRpb24sIHJldmlld2VycyBhcmUgZm9yZXZlciBpbiBzaG9ydCBzdXBwbHk7IGJ5Ci1sb29raW5nIGF0IGNvZGUgeW91IGNhbiBtYWtlIGEgc2lnbmlmaWNhbnQgY29udHJpYnV0aW9uIHRvIHRoZSBwcm9jZXNzIGFzIGEKLXdob2xlLgotCi1SZXZpZXdpbmcgY29kZSBjYW4gYmUgYW4gaW50aW1pZGF0aW5nIHByb3NwZWN0LCBlc3BlY2lhbGx5IGZvciBhIG5ldyBrZXJuZWwKLWRldmVsb3BlciB3aG8gbWF5IHdlbGwgZmVlbCBuZXJ2b3VzIGFib3V0IHF1ZXN0aW9uaW5nIGNvZGUgLSBpbiBwdWJsaWMgLQotd2hpY2ggaGFzIGJlZW4gcG9zdGVkIGJ5IHRob3NlIHdpdGggbW9yZSBleHBlcmllbmNlLiAgRXZlbiBjb2RlIHdyaXR0ZW4gYnkKLXRoZSBtb3N0IGV4cGVyaWVuY2VkIGRldmVsb3BlcnMgY2FuIGJlIGltcHJvdmVkLCB0aG91Z2guICBQZXJoYXBzIHRoZSBiZXN0Ci1waWVjZSBvZiBhZHZpY2UgZm9yIHJldmlld2VycyAoYWxsIHJldmlld2VycykgaXMgdGhpczogcGhyYXNlIHJldmlldwotY29tbWVudHMgYXMgcXVlc3Rpb25zIHJhdGhlciB0aGFuIGNyaXRpY2lzbXMuICBBc2tpbmcgImhvdyBkb2VzIHRoZSBsb2NrCi1nZXQgcmVsZWFzZWQgaW4gdGhpcyBwYXRoPyIgd2lsbCBhbHdheXMgd29yayBiZXR0ZXIgdGhhbiBzdGF0aW5nICJ0aGUKLWxvY2tpbmcgaGVyZSBpcyB3cm9uZy4iCi0KLURpZmZlcmVudCBkZXZlbG9wZXJzIHdpbGwgcmV2aWV3IGNvZGUgZnJvbSBkaWZmZXJlbnQgcG9pbnRzIG9mIHZpZXcuICBTb21lCi1hcmUgbW9zdGx5IGNvbmNlcm5lZCB3aXRoIGNvZGluZyBzdHlsZSBhbmQgd2hldGhlciBjb2RlIGxpbmVzIGhhdmUgdHJhaWxpbmcKLXdoaXRlIHNwYWNlLiAgT3RoZXJzIHdpbGwgZm9jdXMgcHJpbWFyaWx5IG9uIHdoZXRoZXIgdGhlIGNoYW5nZSBpbXBsZW1lbnRlZAotYnkgdGhlIHBhdGNoIGFzIGEgd2hvbGUgaXMgYSBnb29kIHRoaW5nIGZvciB0aGUga2VybmVsIG9yIG5vdC4gIFlldCBvdGhlcnMKLXdpbGwgY2hlY2sgZm9yIHByb2JsZW1hdGljIGxvY2tpbmcsIGV4Y2Vzc2l2ZSBzdGFjayB1c2FnZSwgcG9zc2libGUKLXNlY3VyaXR5IGlzc3VlcywgZHVwbGljYXRpb24gb2YgY29kZSBmb3VuZCBlbHNld2hlcmUsIGFkZXF1YXRlCi1kb2N1bWVudGF0aW9uLCBhZHZlcnNlIGVmZmVjdHMgb24gcGVyZm9ybWFuY2UsIHVzZXItc3BhY2UgQUJJIGNoYW5nZXMsIGV0Yy4KLUFsbCB0eXBlcyBvZiByZXZpZXcsIGlmIHRoZXkgbGVhZCB0byBiZXR0ZXIgY29kZSBnb2luZyBpbnRvIHRoZSBrZXJuZWwsIGFyZQotd2VsY29tZSBhbmQgd29ydGh3aGlsZS4KLQotCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNy5BZHZhbmNlZFRvcGljcy5yc3QgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNy5BZHZhbmNlZFRvcGljcy5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkNjFjNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy83LkFkdmFuY2VkVG9waWNzLnJzdApAQCAtMCwwICsxLDE4MCBAQAorLi4gX2RldmVsb3BtZW50X2FkdmFuY2VkdG9waWNzOgorCitBZHZhbmNlZCB0b3BpY3MKKz09PT09PT09PT09PT09PQorCitBdCB0aGlzIHBvaW50LCBob3BlZnVsbHksIHlvdSBoYXZlIGEgaGFuZGxlIG9uIGhvdyB0aGUgZGV2ZWxvcG1lbnQgcHJvY2Vzcword29ya3MuICBUaGVyZSBpcyBzdGlsbCBtb3JlIHRvIGxlYXJuLCBob3dldmVyISAgVGhpcyBzZWN0aW9uIHdpbGwgY292ZXIgYQorbnVtYmVyIG9mIHRvcGljcyB3aGljaCBjYW4gYmUgaGVscGZ1bCBmb3IgZGV2ZWxvcGVycyB3YW50aW5nIHRvIGJlY29tZSBhCityZWd1bGFyIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzLgorCitNYW5hZ2luZyBwYXRjaGVzIHdpdGggZ2l0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB1c2Ugb2YgZGlzdHJpYnV0ZWQgdmVyc2lvbiBjb250cm9sIGZvciB0aGUga2VybmVsIGJlZ2FuIGluIGVhcmx5IDIwMDIsCit3aGVuIExpbnVzIGZpcnN0IHN0YXJ0ZWQgcGxheWluZyB3aXRoIHRoZSBwcm9wcmlldGFyeSBCaXRLZWVwZXIKK2FwcGxpY2F0aW9uLiAgV2hpbGUgQml0S2VlcGVyIHdhcyBjb250cm92ZXJzaWFsLCB0aGUgYXBwcm9hY2ggdG8gc29mdHdhcmUKK3ZlcnNpb24gbWFuYWdlbWVudCBpdCBlbWJvZGllZCBtb3N0IGNlcnRhaW5seSB3YXMgbm90LiAgRGlzdHJpYnV0ZWQgdmVyc2lvbgorY29udHJvbCBlbmFibGVkIGFuIGltbWVkaWF0ZSBhY2NlbGVyYXRpb24gb2YgdGhlIGtlcm5lbCBkZXZlbG9wbWVudAorcHJvamVjdC4gIEluIGN1cnJlbnQgdGltZXMsIHRoZXJlIGFyZSBzZXZlcmFsIGZyZWUgYWx0ZXJuYXRpdmVzIHRvCitCaXRLZWVwZXIuICBGb3IgYmV0dGVyIG9yIGZvciB3b3JzZSwgdGhlIGtlcm5lbCBwcm9qZWN0IGhhcyBzZXR0bGVkIG9uIGdpdAorYXMgaXRzIHRvb2wgb2YgY2hvaWNlLgorCitNYW5hZ2luZyBwYXRjaGVzIHdpdGggZ2l0IGNhbiBtYWtlIGxpZmUgbXVjaCBlYXNpZXIgZm9yIHRoZSBkZXZlbG9wZXIsCitlc3BlY2lhbGx5IGFzIHRoZSB2b2x1bWUgb2YgdGhvc2UgcGF0Y2hlcyBncm93cy4gIEdpdCBhbHNvIGhhcyBpdHMgcm91Z2gKK2VkZ2VzIGFuZCBwb3NlcyBjZXJ0YWluIGhhemFyZHM7IGl0IGlzIGEgeW91bmcgYW5kIHBvd2VyZnVsIHRvb2wgd2hpY2ggaXMKK3N0aWxsIGJlaW5nIGNpdmlsaXplZCBieSBpdHMgZGV2ZWxvcGVycy4gIFRoaXMgZG9jdW1lbnQgd2lsbCBub3QgYXR0ZW1wdCB0bwordGVhY2ggdGhlIHJlYWRlciBob3cgdG8gdXNlIGdpdDsgdGhhdCB3b3VsZCBiZSBzdWZmaWNpZW50IG1hdGVyaWFsIGZvciBhCitsb25nIGRvY3VtZW50IGluIGl0cyBvd24gcmlnaHQuICBJbnN0ZWFkLCB0aGUgZm9jdXMgaGVyZSB3aWxsIGJlIG9uIGhvdyBnaXQKK2ZpdHMgaW50byB0aGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3MgaW4gcGFydGljdWxhci4gIERldmVsb3BlcnMgd2hvCit3aXNoIHRvIGNvbWUgdXAgdG8gc3BlZWQgd2l0aCBnaXQgd2lsbCBmaW5kIG1vcmUgaW5mb3JtYXRpb24gYXQ6CisKKwlodHRwOi8vZ2l0LXNjbS5jb20vCisKKwlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy91c2VyLW1hbnVhbC5odG1sCisKK2FuZCBvbiB2YXJpb3VzIHR1dG9yaWFscyBmb3VuZCBvbiB0aGUgd2ViLgorCitUaGUgZmlyc3Qgb3JkZXIgb2YgYnVzaW5lc3MgaXMgdG8gcmVhZCB0aGUgYWJvdmUgc2l0ZXMgYW5kIGdldCBhIHNvbGlkCit1bmRlcnN0YW5kaW5nIG9mIGhvdyBnaXQgd29ya3MgYmVmb3JlIHRyeWluZyB0byB1c2UgaXQgdG8gbWFrZSBwYXRjaGVzCithdmFpbGFibGUgdG8gb3RoZXJzLiAgQSBnaXQtdXNpbmcgZGV2ZWxvcGVyIHNob3VsZCBiZSBhYmxlIHRvIG9idGFpbiBhIGNvcHkKK29mIHRoZSBtYWlubGluZSByZXBvc2l0b3J5LCBleHBsb3JlIHRoZSByZXZpc2lvbiBoaXN0b3J5LCBjb21taXQgY2hhbmdlcyB0bwordGhlIHRyZWUsIHVzZSBicmFuY2hlcywgZXRjLiAgQW4gdW5kZXJzdGFuZGluZyBvZiBnaXQncyB0b29scyBmb3IgdGhlCityZXdyaXRpbmcgb2YgaGlzdG9yeSAoc3VjaCBhcyByZWJhc2UpIGlzIGFsc28gdXNlZnVsLiAgR2l0IGNvbWVzIHdpdGggaXRzCitvd24gdGVybWlub2xvZ3kgYW5kIGNvbmNlcHRzOyBhIG5ldyB1c2VyIG9mIGdpdCBzaG91bGQga25vdyBhYm91dCByZWZzLAorcmVtb3RlIGJyYW5jaGVzLCB0aGUgaW5kZXgsIGZhc3QtZm9yd2FyZCBtZXJnZXMsIHB1c2hlcyBhbmQgcHVsbHMsIGRldGFjaGVkCitoZWFkcywgZXRjLiAgSXQgY2FuIGFsbCBiZSBhIGxpdHRsZSBpbnRpbWlkYXRpbmcgYXQgdGhlIG91dHNldCwgYnV0IHRoZQorY29uY2VwdHMgYXJlIG5vdCB0aGF0IGhhcmQgdG8gZ3Jhc3Agd2l0aCBhIGJpdCBvZiBzdHVkeS4KKworVXNpbmcgZ2l0IHRvIGdlbmVyYXRlIHBhdGNoZXMgZm9yIHN1Ym1pc3Npb24gYnkgZW1haWwgY2FuIGJlIGEgZ29vZAorZXhlcmNpc2Ugd2hpbGUgY29taW5nIHVwIHRvIHNwZWVkLgorCitXaGVuIHlvdSBhcmUgcmVhZHkgdG8gc3RhcnQgcHV0dGluZyB1cCBnaXQgdHJlZXMgZm9yIG90aGVycyB0byBsb29rIGF0LCB5b3UKK3dpbGwsIG9mIGNvdXJzZSwgbmVlZCBhIHNlcnZlciB0aGF0IGNhbiBiZSBwdWxsZWQgZnJvbS4gIFNldHRpbmcgdXAgc3VjaCBhCitzZXJ2ZXIgd2l0aCBnaXQtZGFlbW9uIGlzIHJlbGF0aXZlbHkgc3RyYWlnaHRmb3J3YXJkIGlmIHlvdSBoYXZlIGEgc3lzdGVtCit3aGljaCBpcyBhY2Nlc3NpYmxlIHRvIHRoZSBJbnRlcm5ldC4gIE90aGVyd2lzZSwgZnJlZSwgcHVibGljIGhvc3Rpbmcgc2l0ZXMKKyhHaXRodWIsIGZvciBleGFtcGxlKSBhcmUgc3RhcnRpbmcgdG8gYXBwZWFyIG9uIHRoZSBuZXQuICBFc3RhYmxpc2hlZAorZGV2ZWxvcGVycyBjYW4gZ2V0IGFuIGFjY291bnQgb24ga2VybmVsLm9yZywgYnV0IHRob3NlIGFyZSBub3QgZWFzeSB0byBjb21lCitieTsgc2VlIGh0dHA6Ly9rZXJuZWwub3JnL2ZhcS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK1RoZSBub3JtYWwgZ2l0IHdvcmtmbG93IGludm9sdmVzIHRoZSB1c2Ugb2YgYSBsb3Qgb2YgYnJhbmNoZXMuICBFYWNoIGxpbmUKK29mIGRldmVsb3BtZW50IGNhbiBiZSBzZXBhcmF0ZWQgaW50byBhIHNlcGFyYXRlICJ0b3BpYyBicmFuY2giIGFuZAorbWFpbnRhaW5lZCBpbmRlcGVuZGVudGx5LiAgQnJhbmNoZXMgaW4gZ2l0IGFyZSBjaGVhcCwgdGhlcmUgaXMgbm8gcmVhc29uIHRvCitub3QgbWFrZSBmcmVlIHVzZSBvZiB0aGVtLiAgQW5kLCBpbiBhbnkgY2FzZSwgeW91IHNob3VsZCBub3QgZG8geW91cgorZGV2ZWxvcG1lbnQgaW4gYW55IGJyYW5jaCB3aGljaCB5b3UgaW50ZW5kIHRvIGFzayBvdGhlcnMgdG8gcHVsbCBmcm9tLgorUHVibGljbHktYXZhaWxhYmxlIGJyYW5jaGVzIHNob3VsZCBiZSBjcmVhdGVkIHdpdGggY2FyZTsgbWVyZ2UgaW4gcGF0Y2hlcworZnJvbSBkZXZlbG9wbWVudCBicmFuY2hlcyB3aGVuIHRoZXkgYXJlIGluIGNvbXBsZXRlIGZvcm0gYW5kIHJlYWR5IHRvIGdvIC0KK25vdCBiZWZvcmUuCisKK0dpdCBwcm92aWRlcyBzb21lIHBvd2VyZnVsIHRvb2xzIHdoaWNoIGNhbiBhbGxvdyB5b3UgdG8gcmV3cml0ZSB5b3VyCitkZXZlbG9wbWVudCBoaXN0b3J5LiAgQW4gaW5jb252ZW5pZW50IHBhdGNoIChvbmUgd2hpY2ggYnJlYWtzIGJpc2VjdGlvbiwKK3NheSwgb3Igd2hpY2ggaGFzIHNvbWUgb3RoZXIgc29ydCBvZiBvYnZpb3VzIGJ1ZykgY2FuIGJlIGZpeGVkIGluIHBsYWNlIG9yCittYWRlIHRvIGRpc2FwcGVhciBmcm9tIHRoZSBoaXN0b3J5IGVudGlyZWx5LiAgQSBwYXRjaCBzZXJpZXMgY2FuIGJlCityZXdyaXR0ZW4gYXMgaWYgaXQgaGFkIGJlZW4gd3JpdHRlbiBvbiB0b3Agb2YgdG9kYXkncyBtYWlubGluZSwgZXZlbiB0aG91Z2gKK3lvdSBoYXZlIGJlZW4gd29ya2luZyBvbiBpdCBmb3IgbW9udGhzLiAgQ2hhbmdlcyBjYW4gYmUgdHJhbnNwYXJlbnRseQorc2hpZnRlZCBmcm9tIG9uZSBicmFuY2ggdG8gYW5vdGhlci4gIEFuZCBzbyBvbi4gIEp1ZGljaW91cyB1c2Ugb2YgZ2l0J3MKK2FiaWxpdHkgdG8gcmV2aXNlIGhpc3RvcnkgY2FuIGhlbHAgaW4gdGhlIGNyZWF0aW9uIG9mIGNsZWFuIHBhdGNoIHNldHMgd2l0aAorZmV3ZXIgcHJvYmxlbXMuCisKK0V4Y2Vzc2l2ZSB1c2Ugb2YgdGhpcyBjYXBhYmlsaXR5IGNhbiBsZWFkIHRvIG90aGVyIHByb2JsZW1zLCB0aG91Z2gsIGJleW9uZAorYSBzaW1wbGUgb2JzZXNzaW9uIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHBlcmZlY3QgcHJvamVjdCBoaXN0b3J5LgorUmV3cml0aW5nIGhpc3Rvcnkgd2lsbCByZXdyaXRlIHRoZSBjaGFuZ2VzIGNvbnRhaW5lZCBpbiB0aGF0IGhpc3RvcnksCit0dXJuaW5nIGEgdGVzdGVkIChob3BlZnVsbHkpIGtlcm5lbCB0cmVlIGludG8gYW4gdW50ZXN0ZWQgb25lLiAgQnV0LCBiZXlvbmQKK3RoYXQsIGRldmVsb3BlcnMgY2Fubm90IGVhc2lseSBjb2xsYWJvcmF0ZSBpZiB0aGV5IGRvIG5vdCBoYXZlIGEgc2hhcmVkCit2aWV3IG9mIHRoZSBwcm9qZWN0IGhpc3Rvcnk7IGlmIHlvdSByZXdyaXRlIGhpc3Rvcnkgd2hpY2ggb3RoZXIgZGV2ZWxvcGVycworaGF2ZSBwdWxsZWQgaW50byB0aGVpciByZXBvc2l0b3JpZXMsIHlvdSB3aWxsIG1ha2UgbGlmZSBtdWNoIG1vcmUgZGlmZmljdWx0Citmb3IgdGhvc2UgZGV2ZWxvcGVycy4gIFNvIGEgc2ltcGxlIHJ1bGUgb2YgdGh1bWIgYXBwbGllcyBoZXJlOiBoaXN0b3J5Cit3aGljaCBoYXMgYmVlbiBleHBvcnRlZCB0byBvdGhlcnMgc2hvdWxkIGdlbmVyYWxseSBiZSBzZWVuIGFzIGltbXV0YWJsZQordGhlcmVhZnRlci4KKworU28sIG9uY2UgeW91IHB1c2ggYSBzZXQgb2YgY2hhbmdlcyB0byB5b3VyIHB1YmxpY2x5LWF2YWlsYWJsZSBzZXJ2ZXIsIHRob3NlCitjaGFuZ2VzIHNob3VsZCBub3QgYmUgcmV3cml0dGVuLiAgR2l0IHdpbGwgYXR0ZW1wdCB0byBlbmZvcmNlIHRoaXMgcnVsZSBpZgoreW91IHRyeSB0byBwdXNoIGNoYW5nZXMgd2hpY2ggZG8gbm90IHJlc3VsdCBpbiBhIGZhc3QtZm9yd2FyZCBtZXJnZQorKGkuZS4gY2hhbmdlcyB3aGljaCBkbyBub3Qgc2hhcmUgdGhlIHNhbWUgaGlzdG9yeSkuICBJdCBpcyBwb3NzaWJsZSB0bworb3ZlcnJpZGUgdGhpcyBjaGVjaywgYW5kIHRoZXJlIG1heSBiZSB0aW1lcyB3aGVuIGl0IGlzIG5lY2Vzc2FyeSB0byByZXdyaXRlCithbiBleHBvcnRlZCB0cmVlLiAgTW92aW5nIGNoYW5nZXNldHMgYmV0d2VlbiB0cmVlcyB0byBhdm9pZCBjb25mbGljdHMgaW4KK2xpbnV4LW5leHQgaXMgb25lIGV4YW1wbGUuICBCdXQgc3VjaCBhY3Rpb25zIHNob3VsZCBiZSByYXJlLiAgVGhpcyBpcyBvbmUKK29mIHRoZSByZWFzb25zIHdoeSBkZXZlbG9wbWVudCBzaG91bGQgYmUgZG9uZSBpbiBwcml2YXRlIGJyYW5jaGVzICh3aGljaAorY2FuIGJlIHJld3JpdHRlbiBpZiBuZWNlc3NhcnkpIGFuZCBvbmx5IG1vdmVkIGludG8gcHVibGljIGJyYW5jaGVzIHdoZW4KK2l0J3MgaW4gYSByZWFzb25hYmx5IGFkdmFuY2VkIHN0YXRlLgorCitBcyB0aGUgbWFpbmxpbmUgKG9yIG90aGVyIHRyZWUgdXBvbiB3aGljaCBhIHNldCBvZiBjaGFuZ2VzIGlzIGJhc2VkKQorYWR2YW5jZXMsIGl0IGlzIHRlbXB0aW5nIHRvIG1lcmdlIHdpdGggdGhhdCB0cmVlIHRvIHN0YXkgb24gdGhlIGxlYWRpbmcKK2VkZ2UuICBGb3IgYSBwcml2YXRlIGJyYW5jaCwgcmViYXNpbmcgY2FuIGJlIGFuIGVhc3kgd2F5IHRvIGtlZXAgdXAgd2l0aAorYW5vdGhlciB0cmVlLCBidXQgcmViYXNpbmcgaXMgbm90IGFuIG9wdGlvbiBvbmNlIGEgdHJlZSBpcyBleHBvcnRlZCB0byB0aGUKK3dvcmxkLiAgT25jZSB0aGF0IGhhcHBlbnMsIGEgZnVsbCBtZXJnZSBtdXN0IGJlIGRvbmUuICBNZXJnaW5nIG9jY2FzaW9uYWxseQorbWFrZXMgZ29vZCBzZW5zZSwgYnV0IG92ZXJseSBmcmVxdWVudCBtZXJnZXMgY2FuIGNsdXR0ZXIgdGhlIGhpc3RvcnkKK25lZWRsZXNzbHkuICBTdWdnZXN0ZWQgdGVjaG5pcXVlIGluIHRoaXMgY2FzZSBpcyB0byBtZXJnZSBpbmZyZXF1ZW50bHksIGFuZAorZ2VuZXJhbGx5IG9ubHkgYXQgc3BlY2lmaWMgcmVsZWFzZSBwb2ludHMgKHN1Y2ggYXMgYSBtYWlubGluZSAtcmMKK3JlbGVhc2UpLiAgSWYgeW91IGFyZSBuZXJ2b3VzIGFib3V0IHNwZWNpZmljIGNoYW5nZXMsIHlvdSBjYW4gYWx3YXlzCitwZXJmb3JtIHRlc3QgbWVyZ2VzIGluIGEgcHJpdmF0ZSBicmFuY2guICBUaGUgZ2l0ICJyZXJlcmUiIHRvb2wgY2FuIGJlCit1c2VmdWwgaW4gc3VjaCBzaXR1YXRpb25zOyBpdCByZW1lbWJlcnMgaG93IG1lcmdlIGNvbmZsaWN0cyB3ZXJlIHJlc29sdmVkCitzbyB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIGRvIHRoZSBzYW1lIHdvcmsgdHdpY2UuCisKK09uZSBvZiB0aGUgYmlnZ2VzdCByZWN1cnJpbmcgY29tcGxhaW50cyBhYm91dCB0b29scyBsaWtlIGdpdCBpcyB0aGlzOiB0aGUKK21hc3MgbW92ZW1lbnQgb2YgcGF0Y2hlcyBmcm9tIG9uZSByZXBvc2l0b3J5IHRvIGFub3RoZXIgbWFrZXMgaXQgZWFzeSB0bworc2xpcCBpbiBpbGwtYWR2aXNlZCBjaGFuZ2VzIHdoaWNoIGdvIGludG8gdGhlIG1haW5saW5lIGJlbG93IHRoZSByZXZpZXcKK3JhZGFyLiAgS2VybmVsIGRldmVsb3BlcnMgdGVuZCB0byBnZXQgdW5oYXBweSB3aGVuIHRoZXkgc2VlIHRoYXQga2luZCBvZgordGhpbmcgaGFwcGVuaW5nOyBwdXR0aW5nIHVwIGEgZ2l0IHRyZWUgd2l0aCB1bnJldmlld2VkIG9yIG9mZi10b3BpYyBwYXRjaGVzCitjYW4gYWZmZWN0IHlvdXIgYWJpbGl0eSB0byBnZXQgdHJlZXMgcHVsbGVkIGluIHRoZSBmdXR1cmUuICBRdW90aW5nIExpbnVzOgorCis6OgorCisJWW91IGNhbiBzZW5kIG1lIHBhdGNoZXMsIGJ1dCBmb3IgbWUgdG8gcHVsbCBhIGdpdCBwYXRjaCBmcm9tIHlvdSwgSQorCW5lZWQgdG8ga25vdyB0aGF0IHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLCBhbmQgSSBuZWVkIHRvIGJlIGFibGUKKwl0byB0cnVzdCB0aGluZ3MgKndpdGhvdXQqIHRoZW4gaGF2aW5nIHRvIGdvIGFuZCBjaGVjayBldmVyeQorCWluZGl2aWR1YWwgY2hhbmdlIGJ5IGhhbmQuCisKKyhodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yMjQxMzUvKS4KKworVG8gYXZvaWQgdGhpcyBraW5kIG9mIHNpdHVhdGlvbiwgZW5zdXJlIHRoYXQgYWxsIHBhdGNoZXMgd2l0aGluIGEgZ2l2ZW4KK2JyYW5jaCBzdGljayBjbG9zZWx5IHRvIHRoZSBhc3NvY2lhdGVkIHRvcGljOyBhICJkcml2ZXIgZml4ZXMiIGJyYW5jaAorc2hvdWxkIG5vdCBiZSBtYWtpbmcgY2hhbmdlcyB0byB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlLiAgQW5kLCBtb3N0CitpbXBvcnRhbnRseSwgZG8gbm90IHVzZSBhIGdpdCB0cmVlIHRvIGJ5cGFzcyB0aGUgcmV2aWV3IHByb2Nlc3MuICBQb3N0IGFuCitvY2Nhc2lvbmFsIHN1bW1hcnkgb2YgdGhlIHRyZWUgdG8gdGhlIHJlbGV2YW50IGxpc3QsIGFuZCwgd2hlbiB0aGUgdGltZSBpcworcmlnaHQsIHJlcXVlc3QgdGhhdCB0aGUgdHJlZSBiZSBpbmNsdWRlZCBpbiBsaW51eC1uZXh0LgorCitJZiBhbmQgd2hlbiBvdGhlcnMgc3RhcnQgdG8gc2VuZCBwYXRjaGVzIGZvciBpbmNsdXNpb24gaW50byB5b3VyIHRyZWUsCitkb24ndCBmb3JnZXQgdG8gcmV2aWV3IHRoZW0uICBBbHNvIGVuc3VyZSB0aGF0IHlvdSBtYWludGFpbiB0aGUgY29ycmVjdAorYXV0aG9yc2hpcCBpbmZvcm1hdGlvbjsgdGhlIGdpdCAiYW0iIHRvb2wgZG9lcyBpdHMgYmVzdCBpbiB0aGlzIHJlZ2FyZCwgYnV0Cit5b3UgbWF5IGhhdmUgdG8gYWRkIGEgIkZyb206IiBsaW5lIHRvIHRoZSBwYXRjaCBpZiBpdCBoYXMgYmVlbiByZWxheWVkIHRvCit5b3UgdmlhIGEgdGhpcmQgcGFydHkuCisKK1doZW4gcmVxdWVzdGluZyBhIHB1bGwsIGJlIHN1cmUgdG8gZ2l2ZSBhbGwgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uOiB3aGVyZQoreW91ciB0cmVlIGlzLCB3aGF0IGJyYW5jaCB0byBwdWxsLCBhbmQgd2hhdCBjaGFuZ2VzIHdpbGwgcmVzdWx0IGZyb20gdGhlCitwdWxsLiAgVGhlIGdpdCByZXF1ZXN0LXB1bGwgY29tbWFuZCBjYW4gYmUgaGVscGZ1bCBpbiB0aGlzIHJlZ2FyZDsgaXQgd2lsbAorZm9ybWF0IHRoZSByZXF1ZXN0IGFzIG90aGVyIGRldmVsb3BlcnMgZXhwZWN0LCBhbmQgd2lsbCBhbHNvIGNoZWNrIHRvIGJlCitzdXJlIHRoYXQgeW91IGhhdmUgcmVtZW1iZXJlZCB0byBwdXNoIHRob3NlIGNoYW5nZXMgdG8gdGhlIHB1YmxpYyBzZXJ2ZXIuCisKKworUmV2aWV3aW5nIHBhdGNoZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKK1NvbWUgcmVhZGVycyB3aWxsIGNlcnRhaW5seSBvYmplY3QgdG8gcHV0dGluZyB0aGlzIHNlY3Rpb24gd2l0aCAiYWR2YW5jZWQKK3RvcGljcyIgb24gdGhlIGdyb3VuZHMgdGhhdCBldmVuIGJlZ2lubmluZyBrZXJuZWwgZGV2ZWxvcGVycyBzaG91bGQgYmUKK3Jldmlld2luZyBwYXRjaGVzLiAgSXQgaXMgY2VydGFpbmx5IHRydWUgdGhhdCB0aGVyZSBpcyBubyBiZXR0ZXIgd2F5IHRvCitsZWFybiBob3cgdG8gcHJvZ3JhbSBpbiB0aGUga2VybmVsIGVudmlyb25tZW50IHRoYW4gYnkgbG9va2luZyBhdCBjb2RlCitwb3N0ZWQgYnkgb3RoZXJzLiAgSW4gYWRkaXRpb24sIHJldmlld2VycyBhcmUgZm9yZXZlciBpbiBzaG9ydCBzdXBwbHk7IGJ5Citsb29raW5nIGF0IGNvZGUgeW91IGNhbiBtYWtlIGEgc2lnbmlmaWNhbnQgY29udHJpYnV0aW9uIHRvIHRoZSBwcm9jZXNzIGFzIGEKK3dob2xlLgorCitSZXZpZXdpbmcgY29kZSBjYW4gYmUgYW4gaW50aW1pZGF0aW5nIHByb3NwZWN0LCBlc3BlY2lhbGx5IGZvciBhIG5ldyBrZXJuZWwKK2RldmVsb3BlciB3aG8gbWF5IHdlbGwgZmVlbCBuZXJ2b3VzIGFib3V0IHF1ZXN0aW9uaW5nIGNvZGUgLSBpbiBwdWJsaWMgLQord2hpY2ggaGFzIGJlZW4gcG9zdGVkIGJ5IHRob3NlIHdpdGggbW9yZSBleHBlcmllbmNlLiAgRXZlbiBjb2RlIHdyaXR0ZW4gYnkKK3RoZSBtb3N0IGV4cGVyaWVuY2VkIGRldmVsb3BlcnMgY2FuIGJlIGltcHJvdmVkLCB0aG91Z2guICBQZXJoYXBzIHRoZSBiZXN0CitwaWVjZSBvZiBhZHZpY2UgZm9yIHJldmlld2VycyAoYWxsIHJldmlld2VycykgaXMgdGhpczogcGhyYXNlIHJldmlldworY29tbWVudHMgYXMgcXVlc3Rpb25zIHJhdGhlciB0aGFuIGNyaXRpY2lzbXMuICBBc2tpbmcgImhvdyBkb2VzIHRoZSBsb2NrCitnZXQgcmVsZWFzZWQgaW4gdGhpcyBwYXRoPyIgd2lsbCBhbHdheXMgd29yayBiZXR0ZXIgdGhhbiBzdGF0aW5nICJ0aGUKK2xvY2tpbmcgaGVyZSBpcyB3cm9uZy4iCisKK0RpZmZlcmVudCBkZXZlbG9wZXJzIHdpbGwgcmV2aWV3IGNvZGUgZnJvbSBkaWZmZXJlbnQgcG9pbnRzIG9mIHZpZXcuICBTb21lCithcmUgbW9zdGx5IGNvbmNlcm5lZCB3aXRoIGNvZGluZyBzdHlsZSBhbmQgd2hldGhlciBjb2RlIGxpbmVzIGhhdmUgdHJhaWxpbmcKK3doaXRlIHNwYWNlLiAgT3RoZXJzIHdpbGwgZm9jdXMgcHJpbWFyaWx5IG9uIHdoZXRoZXIgdGhlIGNoYW5nZSBpbXBsZW1lbnRlZAorYnkgdGhlIHBhdGNoIGFzIGEgd2hvbGUgaXMgYSBnb29kIHRoaW5nIGZvciB0aGUga2VybmVsIG9yIG5vdC4gIFlldCBvdGhlcnMKK3dpbGwgY2hlY2sgZm9yIHByb2JsZW1hdGljIGxvY2tpbmcsIGV4Y2Vzc2l2ZSBzdGFjayB1c2FnZSwgcG9zc2libGUKK3NlY3VyaXR5IGlzc3VlcywgZHVwbGljYXRpb24gb2YgY29kZSBmb3VuZCBlbHNld2hlcmUsIGFkZXF1YXRlCitkb2N1bWVudGF0aW9uLCBhZHZlcnNlIGVmZmVjdHMgb24gcGVyZm9ybWFuY2UsIHVzZXItc3BhY2UgQUJJIGNoYW5nZXMsIGV0Yy4KK0FsbCB0eXBlcyBvZiByZXZpZXcsIGlmIHRoZXkgbGVhZCB0byBiZXR0ZXIgY29kZSBnb2luZyBpbnRvIHRoZSBrZXJuZWwsIGFyZQord2VsY29tZSBhbmQgd29ydGh3aGlsZS4KKworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvOC5Db25jbHVzaW9uIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzguQ29uY2x1c2lvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FlZjY5MC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvOC5Db25jbHVzaW9uCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotODogRk9SIE1PUkUgSU5GT1JNQVRJT04KLQotVGhlcmUgYXJlIG51bWVyb3VzIHNvdXJjZXMgb2YgaW5mb3JtYXRpb24gb24gTGludXgga2VybmVsIGRldmVsb3BtZW50IGFuZAotcmVsYXRlZCB0b3BpY3MuICBGaXJzdCBhbW9uZyB0aG9zZSB3aWxsIGFsd2F5cyBiZSB0aGUgRG9jdW1lbnRhdGlvbgotZGlyZWN0b3J5IGZvdW5kIGluIHRoZSBrZXJuZWwgc291cmNlIGRpc3RyaWJ1dGlvbi4gIFRoZSB0b3AtbGV2ZWwgSE9XVE8KLWZpbGUgaXMgYW4gaW1wb3J0YW50IHN0YXJ0aW5nIHBvaW50OyBTdWJtaXR0aW5nUGF0Y2hlcyBhbmQKLVN1Ym1pdHRpbmdEcml2ZXJzIGFyZSBhbHNvIHNvbWV0aGluZyB3aGljaCBhbGwga2VybmVsIGRldmVsb3BlcnMgc2hvdWxkCi1yZWFkLiAgTWFueSBpbnRlcm5hbCBrZXJuZWwgQVBJcyBhcmUgZG9jdW1lbnRlZCB1c2luZyB0aGUga2VybmVsZG9jCi1tZWNoYW5pc207ICJtYWtlIGh0bWxkb2NzIiBvciAibWFrZSBwZGZkb2NzIiBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aG9zZQotZG9jdW1lbnRzIGluIEhUTUwgb3IgUERGIGZvcm1hdCAodGhvdWdoIHRoZSB2ZXJzaW9uIG9mIFRlWCBzaGlwcGVkIGJ5IHNvbWUKLWRpc3RyaWJ1dGlvbnMgcnVucyBpbnRvIGludGVybmFsIGxpbWl0cyBhbmQgZmFpbHMgdG8gcHJvY2VzcyB0aGUgZG9jdW1lbnRzCi1wcm9wZXJseSkuCi0KLVZhcmlvdXMgd2ViIHNpdGVzIGRpc2N1c3Mga2VybmVsIGRldmVsb3BtZW50IGF0IGFsbCBsZXZlbHMgb2YgZGV0YWlsLiAgWW91cgotYXV0aG9yIHdvdWxkIGxpa2UgdG8gaHVtYmx5IHN1Z2dlc3QgaHR0cDovL2x3bi5uZXQvIGFzIGEgc291cmNlOwotaW5mb3JtYXRpb24gb24gbWFueSBzcGVjaWZpYyBrZXJuZWwgdG9waWNzIGNhbiBiZSBmb3VuZCB2aWEgdGhlIExXTiBrZXJuZWwKLWluZGV4IGF0OgotCi0JaHR0cDovL2x3bi5uZXQvS2VybmVsL0luZGV4LwotCi1CZXlvbmQgdGhhdCwgYSB2YWx1YWJsZSByZXNvdXJjZSBmb3Iga2VybmVsIGRldmVsb3BlcnMgaXM6Ci0KLQlodHRwOi8va2VybmVsbmV3Ymllcy5vcmcvCi0KLUFuZCwgb2YgY291cnNlLCBvbmUgc2hvdWxkIG5vdCBmb3JnZXQgaHR0cDovL2tlcm5lbC5vcmcvLCB0aGUgZGVmaW5pdGl2ZQotbG9jYXRpb24gZm9yIGtlcm5lbCByZWxlYXNlIGluZm9ybWF0aW9uLgotCi1UaGVyZSBhcmUgYSBudW1iZXIgb2YgYm9va3Mgb24ga2VybmVsIGRldmVsb3BtZW50OgotCi0JTGludXggRGV2aWNlIERyaXZlcnMsIDNyZCBFZGl0aW9uIChKb25hdGhhbiBDb3JiZXQsIEFsZXNzYW5kcm8KLQlSdWJpbmksIGFuZCBHcmVnIEtyb2FoLUhhcnRtYW4pLiAgT25saW5lIGF0Ci0JaHR0cDovL2x3bi5uZXQvS2VybmVsL0xERDMvLgotCi0JTGludXggS2VybmVsIERldmVsb3BtZW50IChSb2JlcnQgTG92ZSkuCi0KLQlVbmRlcnN0YW5kaW5nIHRoZSBMaW51eCBLZXJuZWwgKERhbmllbCBCb3ZldCBhbmQgTWFyY28gQ2VzYXRpKS4KLQotQWxsIG9mIHRoZXNlIGJvb2tzIHN1ZmZlciBmcm9tIGEgY29tbW9uIGZhdWx0LCB0aG91Z2g6IHRoZXkgdGVuZCB0byBiZQotc29tZXdoYXQgb2Jzb2xldGUgYnkgdGhlIHRpbWUgdGhleSBoaXQgdGhlIHNoZWx2ZXMsIGFuZCB0aGV5IGhhdmUgYmVlbiBvbgotdGhlIHNoZWx2ZXMgZm9yIGEgd2hpbGUgbm93LiAgU3RpbGwsIHRoZXJlIGlzIHF1aXRlIGEgYml0IG9mIGdvb2QKLWluZm9ybWF0aW9uIHRvIGJlIGZvdW5kIHRoZXJlLgotCi1Eb2N1bWVudGF0aW9uIGZvciBnaXQgY2FuIGJlIGZvdW5kIGF0OgotCi0JaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvCi0KLQlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy91c2VyLW1hbnVhbC5odG1sCi0KLQotOTogQ09OQ0xVU0lPTgotCi1Db25ncmF0dWxhdGlvbnMgdG8gYW55Ym9keSB3aG8gaGFzIG1hZGUgaXQgdGhyb3VnaCB0aGlzIGxvbmctd2luZGVkCi1kb2N1bWVudC4gIEhvcGVmdWxseSBpdCBoYXMgcHJvdmlkZWQgYSBoZWxwZnVsIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZQotTGludXgga2VybmVsIGlzIGRldmVsb3BlZCBhbmQgaG93IHlvdSBjYW4gcGFydGljaXBhdGUgaW4gdGhhdCBwcm9jZXNzLgotCi1JbiB0aGUgZW5kLCBpdCdzIHRoZSBwYXJ0aWNpcGF0aW9uIHRoYXQgbWF0dGVycy4gIEFueSBvcGVuIHNvdXJjZSBzb2Z0d2FyZQotcHJvamVjdCBpcyBubyBtb3JlIHRoYW4gdGhlIHN1bSBvZiB3aGF0IGl0cyBjb250cmlidXRvcnMgcHV0IGludG8gaXQuICBUaGUKLUxpbnV4IGtlcm5lbCBoYXMgcHJvZ3Jlc3NlZCBhcyBxdWlja2x5IGFuZCBhcyB3ZWxsIGFzIGl0IGhhcyBiZWNhdXNlIGl0IGhhcwotYmVlbiBoZWxwZWQgYnkgYW4gaW1wcmVzc2l2ZWx5IGxhcmdlIGdyb3VwIG9mIGRldmVsb3BlcnMsIGFsbCBvZiB3aG9tIGFyZQotd29ya2luZyB0byBtYWtlIGl0IGJldHRlci4gIFRoZSBrZXJuZWwgaXMgYSBwcmVtaWVyIGV4YW1wbGUgb2Ygd2hhdCBjYW4gYmUKLWRvbmUgd2hlbiB0aG91c2FuZHMgb2YgcGVvcGxlIHdvcmsgdG9nZXRoZXIgdG93YXJkIGEgY29tbW9uIGdvYWwuCi0KLVRoZSBrZXJuZWwgY2FuIGFsd2F5cyBiZW5lZml0IGZyb20gYSBsYXJnZXIgZGV2ZWxvcGVyIGJhc2UsIHRob3VnaC4gIFRoZXJlCi1pcyBhbHdheXMgbW9yZSB3b3JrIHRvIGRvLiAgQnV0LCBqdXN0IGFzIGltcG9ydGFudGx5LCBtb3N0IG90aGVyCi1wYXJ0aWNpcGFudHMgaW4gdGhlIExpbnV4IGVjb3N5c3RlbSBjYW4gYmVuZWZpdCB0aHJvdWdoIGNvbnRyaWJ1dGluZyB0byB0aGUKLWtlcm5lbC4gIEdldHRpbmcgY29kZSBpbnRvIHRoZSBtYWlubGluZSBpcyB0aGUga2V5IHRvIGhpZ2hlciBjb2RlIHF1YWxpdHksCi1sb3dlciBtYWludGVuYW5jZSBhbmQgZGlzdHJpYnV0aW9uIGNvc3RzLCBhIGhpZ2hlciBsZXZlbCBvZiBpbmZsdWVuY2Ugb3ZlcgotdGhlIGRpcmVjdGlvbiBvZiBrZXJuZWwgZGV2ZWxvcG1lbnQsIGFuZCBtb3JlLiAgSXQgaXMgYSBzaXR1YXRpb24gd2hlcmUKLWV2ZXJ5Ym9keSBpbnZvbHZlZCB3aW5zLiAgRmlyZSB1cCB5b3VyIGVkaXRvciBhbmQgY29tZSBqb2luIHVzOyB5b3Ugd2lsbCBiZQotbW9yZSB0aGFuIHdlbGNvbWUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvOC5Db25jbHVzaW9uLnJzdCBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy84LkNvbmNsdXNpb24ucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZWM3Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvOC5Db25jbHVzaW9uLnJzdApAQCAtMCwwICsxLDc0IEBACisuLiBfZGV2ZWxvcG1lbnRfY29uY2x1c2lvbjoKKworRm9yIG1vcmUgaW5mb3JtYXRpb24KKz09PT09PT09PT09PT09PT09PT09CisKK1RoZXJlIGFyZSBudW1lcm91cyBzb3VyY2VzIG9mIGluZm9ybWF0aW9uIG9uIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBhbmQKK3JlbGF0ZWQgdG9waWNzLiAgRmlyc3QgYW1vbmcgdGhvc2Ugd2lsbCBhbHdheXMgYmUgdGhlIERvY3VtZW50YXRpb24KK2RpcmVjdG9yeSBmb3VuZCBpbiB0aGUga2VybmVsIHNvdXJjZSBkaXN0cmlidXRpb24uICBUaGUgdG9wLWxldmVsIEhPV1RPCitmaWxlIGlzIGFuIGltcG9ydGFudCBzdGFydGluZyBwb2ludDsgU3VibWl0dGluZ1BhdGNoZXMgYW5kCitTdWJtaXR0aW5nRHJpdmVycyBhcmUgYWxzbyBzb21ldGhpbmcgd2hpY2ggYWxsIGtlcm5lbCBkZXZlbG9wZXJzIHNob3VsZAorcmVhZC4gIE1hbnkgaW50ZXJuYWwga2VybmVsIEFQSXMgYXJlIGRvY3VtZW50ZWQgdXNpbmcgdGhlIGtlcm5lbGRvYworbWVjaGFuaXNtOyAibWFrZSBodG1sZG9jcyIgb3IgIm1ha2UgcGRmZG9jcyIgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhvc2UKK2RvY3VtZW50cyBpbiBIVE1MIG9yIFBERiBmb3JtYXQgKHRob3VnaCB0aGUgdmVyc2lvbiBvZiBUZVggc2hpcHBlZCBieSBzb21lCitkaXN0cmlidXRpb25zIHJ1bnMgaW50byBpbnRlcm5hbCBsaW1pdHMgYW5kIGZhaWxzIHRvIHByb2Nlc3MgdGhlIGRvY3VtZW50cworcHJvcGVybHkpLgorCitWYXJpb3VzIHdlYiBzaXRlcyBkaXNjdXNzIGtlcm5lbCBkZXZlbG9wbWVudCBhdCBhbGwgbGV2ZWxzIG9mIGRldGFpbC4gIFlvdXIKK2F1dGhvciB3b3VsZCBsaWtlIHRvIGh1bWJseSBzdWdnZXN0IGh0dHA6Ly9sd24ubmV0LyBhcyBhIHNvdXJjZTsKK2luZm9ybWF0aW9uIG9uIG1hbnkgc3BlY2lmaWMga2VybmVsIHRvcGljcyBjYW4gYmUgZm91bmQgdmlhIHRoZSBMV04ga2VybmVsCitpbmRleCBhdDoKKworCWh0dHA6Ly9sd24ubmV0L0tlcm5lbC9JbmRleC8KKworQmV5b25kIHRoYXQsIGEgdmFsdWFibGUgcmVzb3VyY2UgZm9yIGtlcm5lbCBkZXZlbG9wZXJzIGlzOgorCisJaHR0cDovL2tlcm5lbG5ld2JpZXMub3JnLworCitBbmQsIG9mIGNvdXJzZSwgb25lIHNob3VsZCBub3QgZm9yZ2V0IGh0dHA6Ly9rZXJuZWwub3JnLywgdGhlIGRlZmluaXRpdmUKK2xvY2F0aW9uIGZvciBrZXJuZWwgcmVsZWFzZSBpbmZvcm1hdGlvbi4KKworVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGJvb2tzIG9uIGtlcm5lbCBkZXZlbG9wbWVudDoKKworCUxpbnV4IERldmljZSBEcml2ZXJzLCAzcmQgRWRpdGlvbiAoSm9uYXRoYW4gQ29yYmV0LCBBbGVzc2FuZHJvCisJUnViaW5pLCBhbmQgR3JlZyBLcm9haC1IYXJ0bWFuKS4gIE9ubGluZSBhdAorCWh0dHA6Ly9sd24ubmV0L0tlcm5lbC9MREQzLy4KKworCUxpbnV4IEtlcm5lbCBEZXZlbG9wbWVudCAoUm9iZXJ0IExvdmUpLgorCisJVW5kZXJzdGFuZGluZyB0aGUgTGludXggS2VybmVsIChEYW5pZWwgQm92ZXQgYW5kIE1hcmNvIENlc2F0aSkuCisKK0FsbCBvZiB0aGVzZSBib29rcyBzdWZmZXIgZnJvbSBhIGNvbW1vbiBmYXVsdCwgdGhvdWdoOiB0aGV5IHRlbmQgdG8gYmUKK3NvbWV3aGF0IG9ic29sZXRlIGJ5IHRoZSB0aW1lIHRoZXkgaGl0IHRoZSBzaGVsdmVzLCBhbmQgdGhleSBoYXZlIGJlZW4gb24KK3RoZSBzaGVsdmVzIGZvciBhIHdoaWxlIG5vdy4gIFN0aWxsLCB0aGVyZSBpcyBxdWl0ZSBhIGJpdCBvZiBnb29kCitpbmZvcm1hdGlvbiB0byBiZSBmb3VuZCB0aGVyZS4KKworRG9jdW1lbnRhdGlvbiBmb3IgZ2l0IGNhbiBiZSBmb3VuZCBhdDoKKworCWh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzLworCisJaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvdXNlci1tYW51YWwuaHRtbAorCisKK0NvbmNsdXNpb24KKz09PT09PT09PT0KKworQ29uZ3JhdHVsYXRpb25zIHRvIGFueWJvZHkgd2hvIGhhcyBtYWRlIGl0IHRocm91Z2ggdGhpcyBsb25nLXdpbmRlZAorZG9jdW1lbnQuICBIb3BlZnVsbHkgaXQgaGFzIHByb3ZpZGVkIGEgaGVscGZ1bCB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUKK0xpbnV4IGtlcm5lbCBpcyBkZXZlbG9wZWQgYW5kIGhvdyB5b3UgY2FuIHBhcnRpY2lwYXRlIGluIHRoYXQgcHJvY2Vzcy4KKworSW4gdGhlIGVuZCwgaXQncyB0aGUgcGFydGljaXBhdGlvbiB0aGF0IG1hdHRlcnMuICBBbnkgb3BlbiBzb3VyY2Ugc29mdHdhcmUKK3Byb2plY3QgaXMgbm8gbW9yZSB0aGFuIHRoZSBzdW0gb2Ygd2hhdCBpdHMgY29udHJpYnV0b3JzIHB1dCBpbnRvIGl0LiAgVGhlCitMaW51eCBrZXJuZWwgaGFzIHByb2dyZXNzZWQgYXMgcXVpY2tseSBhbmQgYXMgd2VsbCBhcyBpdCBoYXMgYmVjYXVzZSBpdCBoYXMKK2JlZW4gaGVscGVkIGJ5IGFuIGltcHJlc3NpdmVseSBsYXJnZSBncm91cCBvZiBkZXZlbG9wZXJzLCBhbGwgb2Ygd2hvbSBhcmUKK3dvcmtpbmcgdG8gbWFrZSBpdCBiZXR0ZXIuICBUaGUga2VybmVsIGlzIGEgcHJlbWllciBleGFtcGxlIG9mIHdoYXQgY2FuIGJlCitkb25lIHdoZW4gdGhvdXNhbmRzIG9mIHBlb3BsZSB3b3JrIHRvZ2V0aGVyIHRvd2FyZCBhIGNvbW1vbiBnb2FsLgorCitUaGUga2VybmVsIGNhbiBhbHdheXMgYmVuZWZpdCBmcm9tIGEgbGFyZ2VyIGRldmVsb3BlciBiYXNlLCB0aG91Z2guICBUaGVyZQoraXMgYWx3YXlzIG1vcmUgd29yayB0byBkby4gIEJ1dCwganVzdCBhcyBpbXBvcnRhbnRseSwgbW9zdCBvdGhlcgorcGFydGljaXBhbnRzIGluIHRoZSBMaW51eCBlY29zeXN0ZW0gY2FuIGJlbmVmaXQgdGhyb3VnaCBjb250cmlidXRpbmcgdG8gdGhlCitrZXJuZWwuICBHZXR0aW5nIGNvZGUgaW50byB0aGUgbWFpbmxpbmUgaXMgdGhlIGtleSB0byBoaWdoZXIgY29kZSBxdWFsaXR5LAorbG93ZXIgbWFpbnRlbmFuY2UgYW5kIGRpc3RyaWJ1dGlvbiBjb3N0cywgYSBoaWdoZXIgbGV2ZWwgb2YgaW5mbHVlbmNlIG92ZXIKK3RoZSBkaXJlY3Rpb24gb2Yga2VybmVsIGRldmVsb3BtZW50LCBhbmQgbW9yZS4gIEl0IGlzIGEgc2l0dWF0aW9uIHdoZXJlCitldmVyeWJvZHkgaW52b2x2ZWQgd2lucy4gIEZpcmUgdXAgeW91ciBlZGl0b3IgYW5kIGNvbWUgam9pbiB1czsgeW91IHdpbGwgYmUKK21vcmUgdGhhbiB3ZWxjb21lLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzL2NvbmYucHkgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvY29uZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjRhMTJkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzL2NvbmYucHkKQEAgLTAsMCArMSwxMCBAQAorIyAtKi0gY29kaW5nOiB1dGYtODsgbW9kZTogcHl0aG9uIC0qLQorCitwcm9qZWN0ID0gJ0xpbnV4IEtlcm5lbCBEZXZlbG9wbWVudCBEb2N1bWVudGF0aW9uJworCit0YWdzLmFkZCgic3VicHJvamVjdCIpCisKK2xhdGV4X2RvY3VtZW50cyA9IFsKKyAgICAoJ2luZGV4JywgJ2RldmVsb3BtZW50LXByb2Nlc3MudGV4JywgJ0xpbnV4IEtlcm5lbCBEZXZlbG9wbWVudCBEb2N1bWVudGF0aW9uJywKKyAgICAgJ1RoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgY29tbXVuaXR5JywgJ21hbnVhbCcpLAorXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzL2RldmVsb3BtZW50LXByb2Nlc3MucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzL2RldmVsb3BtZW50LXByb2Nlc3MucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTM5OWYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvZGV2ZWxvcG1lbnQtcHJvY2Vzcy5yc3QKQEAgLTAsMCArMSwyOSBAQAorLi4gX2RldmVsb3BtZW50X3Byb2Nlc3NfbWFpbjoKKworQSBndWlkZSB0byB0aGUgS2VybmVsIERldmVsb3BtZW50IFByb2Nlc3MKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvbnRlbnRzOgorCisuLiB0b2N0cmVlOjoKKyAgIDpudW1iZXJlZDoKKyAgIDptYXhkZXB0aDogMgorCisgICAxLkludHJvCisgICAyLlByb2Nlc3MKKyAgIDMuRWFybHktc3RhZ2UKKyAgIDQuQ29kaW5nCisgICA1LlBvc3RpbmcKKyAgIDYuRm9sbG93dGhyb3VnaAorICAgNy5BZHZhbmNlZFRvcGljcworICAgOC5Db25jbHVzaW9uCisKK1RoZSBwdXJwb3NlIG9mIHRoaXMgZG9jdW1lbnQgaXMgdG8gaGVscCBkZXZlbG9wZXJzIChhbmQgdGhlaXIgbWFuYWdlcnMpCit3b3JrIHdpdGggdGhlIGRldmVsb3BtZW50IGNvbW11bml0eSB3aXRoIGEgbWluaW11bSBvZiBmcnVzdHJhdGlvbi4gIEl0IGlzCithbiBhdHRlbXB0IHRvIGRvY3VtZW50IGhvdyB0aGlzIGNvbW11bml0eSB3b3JrcyBpbiBhIHdheSB3aGljaCBpcworYWNjZXNzaWJsZSB0byB0aG9zZSB3aG8gYXJlIG5vdCBpbnRpbWF0ZWx5IGZhbWlsaWFyIHdpdGggTGludXgga2VybmVsCitkZXZlbG9wbWVudCAob3IsIGluZGVlZCwgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBpbiBnZW5lcmFsKS4gIFdoaWxlCit0aGVyZSBpcyBzb21lIHRlY2huaWNhbCBtYXRlcmlhbCBoZXJlLCB0aGlzIGlzIHZlcnkgbXVjaCBhIHByb2Nlc3Mtb3JpZW50ZWQKK2Rpc2N1c3Npb24gd2hpY2ggZG9lcyBub3QgcmVxdWlyZSBhIGRlZXAga25vd2xlZGdlIG9mIGtlcm5lbCBwcm9ncmFtbWluZyB0bwordW5kZXJzdGFuZC4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzL2luZGV4LnJzdCBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy9pbmRleC5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3NDc1ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy9pbmRleC5yc3QKQEAgLTAsMCArMSw5IEBACitMaW51eCBLZXJuZWwgRGV2ZWxvcG1lbnQgRG9jdW1lbnRhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29udGVudHM6CisKKy4uIHRvY3RyZWU6OgorICAgOm1heGRlcHRoOiAyCisKKyAgIGRldmVsb3BtZW50LXByb2Nlc3MKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYWx0ZXJhL3NvY2ZwZ2EtZWNjbWdyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYWx0ZXJhL3NvY2ZwZ2EtZWNjbWdyLnR4dAppbmRleCBiNTQ1ODU2Li40YTE3MTRmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2FsdGVyYS9zb2NmcGdhLWVjY21nci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9hbHRlcmEvc29jZnBnYS1lY2NtZ3IudHh0CkBAIC05MCw2ICs5MCw0NyBAQAogLSBpbnRlcnJ1cHRzICAgICAgOiBTaG91bGQgYmUgc2luZ2xlIGJpdCBlcnJvciBpbnRlcnJ1cHQsIHRoZW4gZG91YmxlIGJpdCBlcnJvcgogCWludGVycnVwdCwgaW4gdGhpcyBvcmRlci4KIAorTkFORCBGSUZPIEVDQworUmVxdWlyZWQgUHJvcGVydGllczoKKy0gY29tcGF0aWJsZSAgICAgIDogU2hvdWxkIGJlICJhbHRyLHNvY2ZwZ2EtbmFuZC1lY2MiCistIHJlZyAgICAgICAgICAgICA6IEFkZHJlc3MgYW5kIHNpemUgZm9yIEVDQyBibG9jayByZWdpc3RlcnMuCistIGFsdHIsZWNjLXBhcmVudCA6IHBoYW5kbGUgdG8gcGFyZW50IE5BTkQgbm9kZS4KKy0gaW50ZXJydXB0cyAgICAgIDogU2hvdWxkIGJlIHNpbmdsZSBiaXQgZXJyb3IgaW50ZXJydXB0LCB0aGVuIGRvdWJsZSBiaXQgZXJyb3IKKwlpbnRlcnJ1cHQsIGluIHRoaXMgb3JkZXIuCisKK0RNQSBGSUZPIEVDQworUmVxdWlyZWQgUHJvcGVydGllczoKKy0gY29tcGF0aWJsZSAgICAgIDogU2hvdWxkIGJlICJhbHRyLHNvY2ZwZ2EtZG1hLWVjYyIKKy0gcmVnICAgICAgICAgICAgIDogQWRkcmVzcyBhbmQgc2l6ZSBmb3IgRUNDIGJsb2NrIHJlZ2lzdGVycy4KKy0gYWx0cixlY2MtcGFyZW50IDogcGhhbmRsZSB0byBwYXJlbnQgRE1BIG5vZGUuCistIGludGVycnVwdHMgICAgICA6IFNob3VsZCBiZSBzaW5nbGUgYml0IGVycm9yIGludGVycnVwdCwgdGhlbiBkb3VibGUgYml0IGVycm9yCisJaW50ZXJydXB0LCBpbiB0aGlzIG9yZGVyLgorCitVU0IgRklGTyBFQ0MKK1JlcXVpcmVkIFByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgICAgICA6IFNob3VsZCBiZSAiYWx0cixzb2NmcGdhLXVzYi1lY2MiCistIHJlZyAgICAgICAgICAgICA6IEFkZHJlc3MgYW5kIHNpemUgZm9yIEVDQyBibG9jayByZWdpc3RlcnMuCistIGFsdHIsZWNjLXBhcmVudCA6IHBoYW5kbGUgdG8gcGFyZW50IFVTQiBub2RlLgorLSBpbnRlcnJ1cHRzICAgICAgOiBTaG91bGQgYmUgc2luZ2xlIGJpdCBlcnJvciBpbnRlcnJ1cHQsIHRoZW4gZG91YmxlIGJpdCBlcnJvcgorCWludGVycnVwdCwgaW4gdGhpcyBvcmRlci4KKworUVNQSSBGSUZPIEVDQworUmVxdWlyZWQgUHJvcGVydGllczoKKy0gY29tcGF0aWJsZSAgICAgIDogU2hvdWxkIGJlICJhbHRyLHNvY2ZwZ2EtcXNwaS1lY2MiCistIHJlZyAgICAgICAgICAgICA6IEFkZHJlc3MgYW5kIHNpemUgZm9yIEVDQyBibG9jayByZWdpc3RlcnMuCistIGFsdHIsZWNjLXBhcmVudCA6IHBoYW5kbGUgdG8gcGFyZW50IFFTUEkgbm9kZS4KKy0gaW50ZXJydXB0cyAgICAgIDogU2hvdWxkIGJlIHNpbmdsZSBiaXQgZXJyb3IgaW50ZXJydXB0LCB0aGVuIGRvdWJsZSBiaXQgZXJyb3IKKwlpbnRlcnJ1cHQsIGluIHRoaXMgb3JkZXIuCisKK1NETU1DIEZJRk8gRUNDCitSZXF1aXJlZCBQcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlICAgICAgOiBTaG91bGQgYmUgImFsdHIsc29jZnBnYS1zZG1tYy1lY2MiCistIHJlZyAgICAgICAgICAgICA6IEFkZHJlc3MgYW5kIHNpemUgZm9yIEVDQyBibG9jayByZWdpc3RlcnMuCistIGFsdHIsZWNjLXBhcmVudCA6IHBoYW5kbGUgdG8gcGFyZW50IFNEL01NQyBub2RlLgorLSBpbnRlcnJ1cHRzICAgICAgOiBTaG91bGQgYmUgc2luZ2xlIGJpdCBlcnJvciBpbnRlcnJ1cHQsIHRoZW4gZG91YmxlIGJpdCBlcnJvcgorCWludGVycnVwdCwgaW4gdGhpcyBvcmRlciBmb3IgcG9ydCBBLCBhbmQgdGhlbiBzaW5nbGUgYml0IGVycm9yIGludGVycnVwdCwKKwl0aGVuIGRvdWJsZSBiaXQgZXJyb3IgaW50ZXJydXB0IGluIHRoaXMgb3JkZXIgZm9yIHBvcnQgQi4KKwogRXhhbXBsZToKIAogCWVjY21ncjogZWNjbWdyQGZmZDA2MDAwIHsKQEAgLTEzMiw0ICsxNzMsNjEgQEAKIAkJCWludGVycnVwdHMgPSA8NSBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKIAkJCQkgICAgIDwzNyBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKIAkJfTsKKworCQluYW5kLWJ1Zi1lY2NAZmY4YzIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhbHRyLHNvY2ZwZ2EtbmFuZC1lY2MiOworCQkJcmVnID0gPDB4ZmY4YzIwMDAgMHg0MDA+OworCQkJYWx0cixlY2MtcGFyZW50ID0gPCZuYW5kPjsKKwkJCWludGVycnVwdHMgPSA8MTEgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJICAgICA8NDMgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CisKKwkJbmFuZC1yZC1lY2NAZmY4YzI0MDAgeworCQkJY29tcGF0aWJsZSA9ICJhbHRyLHNvY2ZwZ2EtbmFuZC1lY2MiOworCQkJcmVnID0gPDB4ZmY4YzI0MDAgMHg0MDA+OworCQkJYWx0cixlY2MtcGFyZW50ID0gPCZuYW5kPjsKKwkJCWludGVycnVwdHMgPSA8MTMgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJICAgICA8NDUgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CisKKwkJbmFuZC13ci1lY2NAZmY4YzI4MDAgeworCQkJY29tcGF0aWJsZSA9ICJhbHRyLHNvY2ZwZ2EtbmFuZC1lY2MiOworCQkJcmVnID0gPDB4ZmY4YzI4MDAgMHg0MDA+OworCQkJYWx0cixlY2MtcGFyZW50ID0gPCZuYW5kPjsKKwkJCWludGVycnVwdHMgPSA8MTIgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJICAgICA8NDQgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CisKKwkJZG1hLWVjY0BmZjhjODAwMCB7CisJCQljb21wYXRpYmxlID0gImFsdHIsc29jZnBnYS1kbWEtZWNjIjsKKwkJCXJlZyA9IDwweGZmOGM4MDAwIDB4NDAwPjsKKwkJCWFsdHIsZWNjLXBhcmVudCA9IDwmcGRtYT47CisJCQlpbnRlcnJ1cHRzID0gPDEwIElSUV9UWVBFX0xFVkVMX0hJR0g+LAorCQkJCSAgICAgPDQyIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCisJCXVzYjAtZWNjQGZmOGM4ODAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYWx0cixzb2NmcGdhLXVzYi1lY2MiOworCQkJcmVnID0gPDB4ZmY4Yzg4MDAgMHg0MDA+OworCQkJYWx0cixlY2MtcGFyZW50ID0gPCZ1c2IwPjsKKwkJCWludGVycnVwdHMgPSA8MiBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJCQkgICAgIDwzNCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKKworCQlxc3BpLWVjY0BmZjhjODQwMCB7CisJCQljb21wYXRpYmxlID0gImFsdHIsc29jZnBnYS1xc3BpLWVjYyI7CisJCQlyZWcgPSA8MHhmZjhjODQwMCAweDQwMD47CisJCQlhbHRyLGVjYy1wYXJlbnQgPSA8JnFzcGk+OworCQkJaW50ZXJydXB0cyA9IDwxNCBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJCQkgICAgIDw0NiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKKworCQlzZG1tYy1lY2NAZmY4YzJjMDAgeworCQkJY29tcGF0aWJsZSA9ICJhbHRyLHNvY2ZwZ2Etc2RtbWMtZWNjIjsKKwkJCXJlZyA9IDwweGZmOGMyYzAwIDB4NDAwPjsKKwkJCWFsdHIsZWNjLXBhcmVudCA9IDwmbW1jPjsKKwkJCWludGVycnVwdHMgPSA8MTUgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJICAgICA8NDcgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJICAgICA8MTYgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJICAgICA8NDggSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CiAJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYXJjaF90aW1lci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2FyY2hfdGltZXIudHh0CmluZGV4IGU3NzQxMjguLmVmNWZiZTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYXJjaF90aW1lci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9hcmNoX3RpbWVyLnR4dApAQCAtMjUsNiArMjUsMTIgQEAKIC0gYWx3YXlzLW9uIDogYSBib29sZWFuIHByb3BlcnR5LiBJZiBwcmVzZW50LCB0aGUgdGltZXIgaXMgcG93ZXJlZCB0aHJvdWdoIGFuCiAgIGFsd2F5cy1vbiBwb3dlciBkb21haW4sIHRoZXJlZm9yZSBpdCBuZXZlciBsb3NlcyBjb250ZXh0LgogCistIGZzbCxlcnJhdHVtLWEwMDg1ODUgOiBBIGJvb2xlYW4gcHJvcGVydHkuIEluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2YKKyAgUW9ySVEgZXJyYXR1bSBBLTAwODU4NSwgd2hpY2ggc2F5cyB0aGF0IHJlYWRpbmcgdGhlIGNvdW50ZXIgaXMKKyAgdW5yZWxpYWJsZSB1bmxlc3MgdGhlIHNhbWUgdmFsdWUgaXMgcmV0dXJuZWQgYnkgYmFjay10by1iYWNrIHJlYWRzLgorICBUaGlzIGFsc28gYWZmZWN0cyB3cml0ZXMgdG8gdGhlIHR2YWwgcmVnaXN0ZXIsIGR1ZSB0byB0aGUgaW1wbGljaXQKKyAgY291bnRlciByZWFkLgorCiAqKiBPcHRpb25hbCBwcm9wZXJ0aWVzOgogCiAtIGFybSxjcHUtcmVnaXN0ZXJzLW5vdC1mdy1jb25maWd1cmVkIDogRmlybXdhcmUgZG9lcyBub3QgaW5pdGlhbGl6ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxhcG1peGVkc3lzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssYXBtaXhlZHN5cy50eHQKaW5kZXggOTM2MTY2Zi4uY2IwMDU0YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxhcG1peGVkc3lzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLGFwbWl4ZWRzeXMudHh0CkBAIC01LDcgKzUsOCBAQAogCiBSZXF1aXJlZCBQcm9wZXJ0aWVzOgogCi0tIGNvbXBhdGlibGU6IFNob3VsZCBiZToKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZjoKKwktICJtZWRpYXRlayxtdDI3MDEtYXBtaXhlZHN5cyIKIAktICJtZWRpYXRlayxtdDgxMzUtYXBtaXhlZHN5cyIKIAktICJtZWRpYXRlayxtdDgxNzMtYXBtaXhlZHN5cyIKIC0gI2Nsb2NrLWNlbGxzOiBNdXN0IGJlIDEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssYmRwc3lzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssYmRwc3lzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTM3MTk2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxiZHBzeXMudHh0CkBAIC0wLDAgKzEsMjIgQEAKK01lZGlhdGVrIGJkcHN5cyBjb250cm9sbGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBNZWRpYXRlayBiZHBzeXMgY29udHJvbGxlciBwcm92aWRlcyB2YXJpb3VzIGNsb2NrcyB0byB0aGUgc3lzdGVtLgorCitSZXF1aXJlZCBQcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGU6IFNob3VsZCBiZToKKwktICJtZWRpYXRlayxtdDI3MDEtYmRwc3lzIiwgInN5c2NvbiIKKy0gI2Nsb2NrLWNlbGxzOiBNdXN0IGJlIDEKKworVGhlIGJkcHN5cyBjb250cm9sbGVyIHVzZXMgdGhlIGNvbW1vbiBjbGsgYmluZGluZyBmcm9tCitEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0CitUaGUgYXZhaWxhYmxlIGNsb2NrcyBhcmUgZGVmaW5lZCBpbiBkdC1iaW5kaW5ncy9jbG9jay9tdCotY2xrLmguCisKK0V4YW1wbGU6CisKK2JkcHN5czogY2xvY2stY29udHJvbGxlckAxYzAwMDAwMCB7CisJY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDI3MDEtYmRwc3lzIiwgInN5c2NvbiI7CisJcmVnID0gPDAgMHgxYzAwMDAwMCAwIDB4MTAwMD47CisJI2Nsb2NrLWNlbGxzID0gPDE+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssZXRoc3lzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssZXRoc3lzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjhmM2E1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxldGhzeXMudHh0CkBAIC0wLDAgKzEsMjIgQEAKK01lZGlhdGVrIGV0aHN5cyBjb250cm9sbGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBNZWRpYXRlayBldGhzeXMgY29udHJvbGxlciBwcm92aWRlcyB2YXJpb3VzIGNsb2NrcyB0byB0aGUgc3lzdGVtLgorCitSZXF1aXJlZCBQcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGU6IFNob3VsZCBiZToKKwktICJtZWRpYXRlayxtdDI3MDEtZXRoc3lzIiwgInN5c2NvbiIKKy0gI2Nsb2NrLWNlbGxzOiBNdXN0IGJlIDEKKworVGhlIGV0aHN5cyBjb250cm9sbGVyIHVzZXMgdGhlIGNvbW1vbiBjbGsgYmluZGluZyBmcm9tCitEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0CitUaGUgYXZhaWxhYmxlIGNsb2NrcyBhcmUgZGVmaW5lZCBpbiBkdC1iaW5kaW5ncy9jbG9jay9tdCotY2xrLmguCisKK0V4YW1wbGU6CisKK2V0aHN5czogY2xvY2stY29udHJvbGxlckAxYjAwMDAwMCB7CisJY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDI3MDEtZXRoc3lzIiwgInN5c2NvbiI7CisJcmVnID0gPDAgMHgxYjAwMDAwMCAwIDB4MTAwMD47CisJI2Nsb2NrLWNlbGxzID0gPDE+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssaGlmc3lzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssaGlmc3lzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWVkN2I1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxoaWZzeXMudHh0CkBAIC0wLDAgKzEsMjQgQEAKK01lZGlhdGVrIGhpZnN5cyBjb250cm9sbGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBNZWRpYXRlayBoaWZzeXMgY29udHJvbGxlciBwcm92aWRlcyB2YXJpb3VzIGNsb2NrcyBhbmQgcmVzZXQKK291dHB1dHMgdG8gdGhlIHN5c3RlbS4KKworUmVxdWlyZWQgUHJvcGVydGllczoKKworLSBjb21wYXRpYmxlOiBTaG91bGQgYmU6CisJLSAibWVkaWF0ZWssbXQyNzAxLWhpZnN5cyIsICJzeXNjb24iCistICNjbG9jay1jZWxsczogTXVzdCBiZSAxCisKK1RoZSBoaWZzeXMgY29udHJvbGxlciB1c2VzIHRoZSBjb21tb24gY2xrIGJpbmRpbmcgZnJvbQorRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2Nsb2NrLWJpbmRpbmdzLnR4dAorVGhlIGF2YWlsYWJsZSBjbG9ja3MgYXJlIGRlZmluZWQgaW4gZHQtYmluZGluZ3MvY2xvY2svbXQqLWNsay5oLgorCitFeGFtcGxlOgorCitoaWZzeXM6IGNsb2NrLWNvbnRyb2xsZXJAMWEwMDAwMDAgeworCWNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQyNzAxLWhpZnN5cyIsICJzeXNjb24iOworCXJlZyA9IDwwIDB4MWEwMDAwMDAgMCAweDEwMDA+OworCSNjbG9jay1jZWxscyA9IDwxPjsKKwkjcmVzZXQtY2VsbHMgPSA8MT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxpbWdzeXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxpbWdzeXMudHh0CmluZGV4IGIxZjJjZTEuLmY2YTkxNjYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssaW1nc3lzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLGltZ3N5cy50eHQKQEAgLTUsNyArNSw4IEBACiAKIFJlcXVpcmVkIFByb3BlcnRpZXM6CiAKLS0gY29tcGF0aWJsZTogU2hvdWxkIGJlOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgb25lIG9mOgorCS0gIm1lZGlhdGVrLG10MjcwMS1pbWdzeXMiLCAic3lzY29uIgogCS0gIm1lZGlhdGVrLG10ODE3My1pbWdzeXMiLCAic3lzY29uIgogLSAjY2xvY2stY2VsbHM6IE11c3QgYmUgMQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLGluZnJhY2ZnLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssaW5mcmFjZmcudHh0CmluZGV4IGFhZjhkMTQuLjE2MjBlYzIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssaW5mcmFjZmcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssaW5mcmFjZmcudHh0CkBAIC02LDcgKzYsOCBAQAogCiBSZXF1aXJlZCBQcm9wZXJ0aWVzOgogCi0tIGNvbXBhdGlibGU6IFNob3VsZCBiZToKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZjoKKwktICJtZWRpYXRlayxtdDI3MDEtaW5mcmFjZmciLCAic3lzY29uIgogCS0gIm1lZGlhdGVrLG10ODEzNS1pbmZyYWNmZyIsICJzeXNjb24iCiAJLSAibWVkaWF0ZWssbXQ4MTczLWluZnJhY2ZnIiwgInN5c2NvbiIKIC0gI2Nsb2NrLWNlbGxzOiBNdXN0IGJlIDEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssbW1zeXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxtbXN5cy50eHQKaW5kZXggNDM4NTk0Ni4uNjdkZDJlNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxtbXN5cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxtbXN5cy50eHQKQEAgLTUsNyArNSw4IEBACiAKIFJlcXVpcmVkIFByb3BlcnRpZXM6CiAKLS0gY29tcGF0aWJsZTogU2hvdWxkIGJlOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgb25lIG9mOgorCS0gIm1lZGlhdGVrLG10MjcwMS1tbXN5cyIsICJzeXNjb24iCiAJLSAibWVkaWF0ZWssbXQ4MTczLW1tc3lzIiwgInN5c2NvbiIKIC0gI2Nsb2NrLWNlbGxzOiBNdXN0IGJlIDEKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxwZXJpY2ZnLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWsscGVyaWNmZy50eHQKaW5kZXggMmY2ZmY4Ni4uZTQ5NDM2NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxwZXJpY2ZnLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLHBlcmljZmcudHh0CkBAIC02LDcgKzYsOCBAQAogCiBSZXF1aXJlZCBQcm9wZXJ0aWVzOgogCi0tIGNvbXBhdGlibGU6IFNob3VsZCBiZToKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZjoKKwktICJtZWRpYXRlayxtdDI3MDEtcGVyaWNmZyIsICJzeXNjb24iCiAJLSAibWVkaWF0ZWssbXQ4MTM1LXBlcmljZmciLCAic3lzY29uIgogCS0gIm1lZGlhdGVrLG10ODE3My1wZXJpY2ZnIiwgInN5c2NvbiIKIC0gI2Nsb2NrLWNlbGxzOiBNdXN0IGJlIDEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssdG9wY2tnZW4udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayx0b3Bja2dlbi50eHQKaW5kZXggZjllOTE3OS4uOWYyZmU3OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayx0b3Bja2dlbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayx0b3Bja2dlbi50eHQKQEAgLTUsNyArNSw4IEBACiAKIFJlcXVpcmVkIFByb3BlcnRpZXM6CiAKLS0gY29tcGF0aWJsZTogU2hvdWxkIGJlOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgb25lIG9mOgorCS0gIm1lZGlhdGVrLG10MjcwMS10b3Bja2dlbiIKIAktICJtZWRpYXRlayxtdDgxMzUtdG9wY2tnZW4iCiAJLSAibWVkaWF0ZWssbXQ4MTczLXRvcGNrZ2VuIgogLSAjY2xvY2stY2VsbHM6IE11c3QgYmUgMQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayx2ZGVjc3lzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssdmRlY3N5cy50eHQKaW5kZXggMWZhYWNmMS4uMjQ0MGY3MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayx2ZGVjc3lzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLHZkZWNzeXMudHh0CkBAIC01LDcgKzUsOCBAQAogCiBSZXF1aXJlZCBQcm9wZXJ0aWVzOgogCi0tIGNvbXBhdGlibGU6IFNob3VsZCBiZToKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZjoKKwktICJtZWRpYXRlayxtdDI3MDEtdmRlY3N5cyIsICJzeXNjb24iCiAJLSAibWVkaWF0ZWssbXQ4MTczLXZkZWNzeXMiLCAic3lzY29uIgogLSAjY2xvY2stY2VsbHM6IE11c3QgYmUgMQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYW1sb2dpYyxneGJiLWFvY2xrYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYW1sb2dpYyxneGJiLWFvY2xrYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1ZDMxYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9hbWxvZ2ljLGd4YmItYW9jbGtjLnR4dApAQCAtMCwwICsxLDQ1IEBACisqIEFtbG9naWMgR1hCQiBBTyBDbG9jayBhbmQgUmVzZXQgVW5pdAorCitUaGUgQW1sb2dpYyBHWEJCIEFPIGNsb2NrIGNvbnRyb2xsZXIgZ2VuZXJhdGVzIGFuZCBzdXBwbGllcyBjbG9jayB0byB2YXJpb3VzCitjb250cm9sbGVycyB3aXRoaW4gdGhlIEFsd2F5cy1PbiBwYXJ0IG9mIHRoZSBTb0MuCisKK1JlcXVpcmVkIFByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJhbWxvZ2ljLGd4YmItYW9jbGtjIgorLSByZWc6IHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgY2xvY2sgY29udHJvbGxlciBhbmQgbGVuZ3RoIG9mIG1lbW9yeQorICAgICAgIG1hcHBlZCByZWdpb24uCisKKy0gI2Nsb2NrLWNlbGxzOiBzaG91bGQgYmUgMS4KKworRWFjaCBjbG9jayBpcyBhc3NpZ25lZCBhbiBpZGVudGlmaWVyIGFuZCBjbGllbnQgbm9kZXMgY2FuIHVzZSB0aGlzIGlkZW50aWZpZXIKK3RvIHNwZWNpZnkgdGhlIGNsb2NrIHdoaWNoIHRoZXkgY29uc3VtZS4gQWxsIGF2YWlsYWJsZSBjbG9ja3MgYXJlIGRlZmluZWQgYXMKK3ByZXByb2Nlc3NvciBtYWNyb3MgaW4gdGhlIGR0LWJpbmRpbmdzL2Nsb2NrL2d4YmItYW9jbGtjLmggaGVhZGVyIGFuZCBjYW4gYmUKK3VzZWQgaW4gZGV2aWNlIHRyZWUgc291cmNlcy4KKworLSAjcmVzZXQtY2VsbHM6IHNob3VsZCBiZSAxLgorCitFYWNoIHJlc2V0IGlzIGFzc2lnbmVkIGFuIGlkZW50aWZpZXIgYW5kIGNsaWVudCBub2RlcyBjYW4gdXNlIHRoaXMgaWRlbnRpZmllcgordG8gc3BlY2lmeSB0aGUgcmVzZXQgd2hpY2ggdGhleSBjb25zdW1lLiBBbGwgYXZhaWxhYmxlIHJlc2V0cyBhcmUgZGVmaW5lZCBhcworcHJlcHJvY2Vzc29yIG1hY3JvcyBpbiB0aGUgZHQtYmluZGluZ3MvcmVzZXQvZ3hiYi1hb2Nsa2MuaCBoZWFkZXIgYW5kIGNhbiBiZQordXNlZCBpbiBkZXZpY2UgdHJlZSBzb3VyY2VzLgorCitFeGFtcGxlOiBBTyBDbG9jayBjb250cm9sbGVyIG5vZGU6CisKKwljbGtjX0FPOiBjbG9jay1jb250cm9sbGVyQDA0MCB7CisJCWNvbXBhdGlibGUgPSAiYW1sb2dpYyxneGJiLWFvY2xrYyI7CisJCXJlZyA9IDwweDAgMHgwNDAgMHgwIDB4ND47CisJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJI3Jlc2V0LWNlbGxzID0gPDE+OworCX07CisKK0V4YW1wbGU6IFVBUlQgY29udHJvbGxlciBub2RlIHRoYXQgY29uc3VtZXMgdGhlIGNsb2NrIGFuZCByZXNldCBnZW5lcmF0ZWQKKyAgYnkgdGhlIGNsb2NrIGNvbnRyb2xsZXI6CisKKwl1YXJ0X0FPOiBzZXJpYWxANGMwIHsKKwkJY29tcGF0aWJsZSA9ICJhbWxvZ2ljLG1lc29uLXVhcnQiOworCQlyZWcgPSA8MHg0YzAgMHgxND47CisJCWludGVycnVwdHMgPSA8MCA5MCAxPjsKKwkJY2xvY2tzID0gPCZjbGtjX0FPIENMS0lEX0FPX1VBUlQxPjsKKwkJcmVzZXRzID0gPCZjbGtjX0FPIFJFU0VUX0FPX1VBUlQxPjsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2FybS1zeXNjb24taWNzdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtLXN5c2Nvbi1pY3N0LnR4dAppbmRleCA4YjcxNzdjLi4yNzQ2ODExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtLXN5c2Nvbi1pY3N0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtLXN5c2Nvbi1pY3N0LnR4dApAQCAtNSwyMCArNSw1MCBAQAogcmVmZXJlbmNlIGRlc2lnbnMgYnkgYWRkaW5nIHNwZWNpYWwgY29udHJvbCByZWdpc3RlcnMgdGhhdCBtYW5hZ2Ugc3VjaAogb3NjaWxsYXRvcnMgdG8gdGhlaXIgc3lzdGVtIGNvbnRyb2xsZXJzLgogCi1UaGUgQVJNIHN5c3RlbSBjb250cm9sbGVyIGNvbnRhaW5zIGxvZ2ljIHRvIHNlcmlhbGl6ZSBhbmQgaW5pdGlhbGl6ZQorVGhlIHZhcmlvdXMgQVJNIHN5c3RlbSBjb250cm9sbGVycyBjb250YWluIGxvZ2ljIHRvIHNlcmlhbGl6ZSBhbmQgaW5pdGlhbGl6ZQogYW4gSUNTVCBjbG9jayByZXF1ZXN0IGFmdGVyIGEgd3JpdGUgdG8gdGhlIDMyIGJpdCByZWdpc3RlciBhdCBhbiBvZmZzZXQKIGludG8gdGhlIHN5c3RlbSBjb250cm9sbGVyLiBGdXJ0aGVybW9yZSwgdG8gZXZlbiBiZSBhYmxlIHRvIGFsdGVyIG9uZSBvZgogdGhlc2UgZnJlcXVlbmNpZXMsIHRoZSBzeXN0ZW0gY29udHJvbGxlciBtdXN0IGZpcnN0IGJlIHVubG9ja2VkIGJ5CiB3cml0aW5nIGEgc3BlY2lhbCB0b2tlbiB0byBhbm90aGVyIG9mZnNldCBpbiB0aGUgc3lzdGVtIGNvbnRyb2xsZXIuCiAKK1NvbWUgQVJNIGhhcmR3YXJlIGNvbnRhaW4gc3BlY2lhbCB2ZXJzaW9ucyBvZiB0aGUgc2VyaWFsIGludGVyZmFjZSB0aGF0IG9ubHkKK2Nvbm5lY3RzIHRoZSBsb3cgOCBiaXRzIG9mIHRoZSBWRFcgKG1pc3Npbmcgb25lIGJpdCksIGhhcmR3aXJlcyBSRFcgdG8KK2RpZmZlcmVudCB2YWx1ZXMgYW5kIHNvbWV0aW1lcyBhbHNvIGhhcmR3aXJlIHRoZSBvdXRwdXQgZGl2aWRlci4gVGhleQordGhlcmVmb3JlIGhhdmUgc3BlY2lhbCBjb21wYXRpYmxlIHN0cmluZ3MgYXMgcGVyIHRoaXMgdGFibGUgKHRoZSBPRCB2YWx1ZSBpcwordGhlIHZhbHVlIG9uIHRoZSBwaW5zLCBub3QgdGhlIHJlc3VsdGluZyBvdXRwdXQgZGl2aWRlcik6CisKK0hhcmR3YXJlIHZhcmlhbnQ6ICAgICAgICBSRFcgICAgIE9EICAgICAgICAgIFZEVworCitJbnRlZ3JhdG9yL0FQICAgICAgICAgICAgMjIgICAgICAxICAgICAgICAgICBCaXQgOCAwLCByZXN0IHZhcmlhYmxlCitpbnRlZ3JhdG9yYXAtY20KKworSW50ZWdyYXRvci9BUCAgICAgICAgICAgIDQ2ICAgICAgMyAgICAgICAgICAgQml0IDggMCwgcmVzdCB2YXJpYWJsZQoraW50ZWdyYXRvcmFwLXN5cworCitJbnRlZ3JhdG9yL0FQICAgICAgICAgICAgMjIgb3IgICAxICAgICAgICAgICAxNyBvciAoMzMgb3IgMjUgTUh6KQoraW50ZWdyYXRvcmFwLXBjaSAgICAgICAgIDE0ICAgICAgMSAgICAgICAgICAgMTQKKworSW50ZWdyYXRvci9DUCAgICAgICAgICAgIDIyICAgICAgdmFyaWFibGUgICAgQml0IDggMCwgcmVzdCB2YXJpYWJsZQoraW50ZWdyYXRvcmNwLWNtLWNvcmUKKworSW50ZWdyYXRvci9DUCAgICAgICAgICAgIDIyICAgICAgdmFyaWFibGUgICAgQml0IDggMCwgcmVzdCB2YXJpYWJsZQoraW50ZWdyYXRvcmNwLWNtLW1lbQorCiBUaGUgSUNTVCBvc2NpbGxhdG9yIG11c3QgYmUgcHJvdmlkZWQgaW5zaWRlIGEgc3lzdGVtIGNvbnRyb2xsZXIgbm9kZS4KIAogUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogbXVzdCBiZSBvbmUgb2YKKyAgImFybSxzeXNjb24taWNzdDUyNSIKKyAgImFybSxzeXNjb24taWNzdDMwNyIKKyAgImFybSxzeXNjb24taWNzdDUyNS1pbnRlZ3JhdG9yYXAtY20iCisgICJhcm0sc3lzY29uLWljc3Q1MjUtaW50ZWdyYXRvcmFwLXN5cyIKKyAgImFybSxzeXNjb24taWNzdDUyNS1pbnRlZ3JhdG9yYXAtcGNpIgorICAiYXJtLHN5c2Nvbi1pY3N0NTI1LWludGVncmF0b3JjcC1jbS1jb3JlIgorICAiYXJtLHN5c2Nvbi1pY3N0NTI1LWludGVncmF0b3JjcC1jbS1tZW0iCiAtIGxvY2stb2Zmc2V0OiB0aGUgb2Zmc2V0IGFkZHJlc3MgaW50byB0aGUgc3lzdGVtIGNvbnRyb2xsZXIgd2hlcmUgdGhlCiAgIHVubG9ja2luZyByZWdpc3RlciBpcyBsb2NhdGVkCiAtIHZjby1vZmZzZXQ6IHRoZSBvZmZzZXQgYWRkcmVzcyBpbnRvIHRoZSBzeXN0ZW0gY29udHJvbGxlciB3aGVyZSB0aGUKICAgSUNTVCBjb250cm9sIHJlZ2lzdGVyIGlzIGxvY2F0ZWQgKGV2ZW4gMzIgYml0IGFkZHJlc3MpCi0tIGNvbXBhdGlibGU6IG11c3QgYmUgb25lIG9mICJhcm0sc3lzY29uLWljc3Q1MjUiIG9yICJhcm0sc3lzY29uLWljc3QzMDciCiAtICNjbG9jay1jZWxsczogbXVzdCBiZSA8MD4KIC0gY2xvY2tzOiBwYXJlbnQgY2xvY2ssIHNpbmNlIHRoZSBJQ1NUIG5lZWRzIGEgcGFyZW50IGNsb2NrIHRvIGRlcml2ZSBpdHMKICAgZnJlcXVlbmN5IGZyb20sIHRoaXMgYXR0cmlidXRlIGlzIGNvbXB1bHNvcnkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtYWRhMzcwMC1wZXJpcGgtY2xvY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2FybWFkYTM3MDAtcGVyaXBoLWNsb2NrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTMzNzBiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2FybWFkYTM3MDAtcGVyaXBoLWNsb2NrLnR4dApAQCAtMCwwICsxLDcwIEBACisqIFBlcmlwaGVyYWwgQ2xvY2sgYmluZGluZ3MgZm9yIE1hcnZlbGwgQXJtYWRhIDM3eHggU29DcworCitNYXJ2ZWxsIEFybWFkYSAzN3h4IFNvQ3MgcHJvdmlkZSBwZXJpcGhlcmFsIGNsb2NrcyB3aGljaCBhcmUKK3VzZWQgYXMgY2xvY2sgc291cmNlIGZvciB0aGUgcGVyaXBoZXJhbCBvZiB0aGUgU29DLgorCitUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCBibG9ja3MgYXNzb2NpYXRlZCB0byBub3J0aCBicmlkZ2UgYW5kIHNvdXRoCiticmlkZ2UuCisKK1RoZSBwZXJpcGhlcmFsIGNsb2NrIGNvbnN1bWVyIHNob3VsZCBzcGVjaWZ5IHRoZSBkZXNpcmVkIGNsb2NrIGJ5CitoYXZpbmcgdGhlIGNsb2NrIElEIGluIGl0cyAiY2xvY2tzIiBwaGFuZGxlIGNlbGwuCisKK1RoZSBmb2xsb3dpbmcgaXMgYSBsaXN0IG9mIHByb3ZpZGVkIElEcyBmb3IgQXJtYWRhIDM3MCBOb3J0aCBicmlkZ2UgY2xvY2tzOgorSUQJQ2xvY2sgbmFtZQlEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAJbW1jCQlNTUMgY29udHJvbGxlcgorMQlzYXRhX2hvc3QJU2F0YSBIb3N0CisyCXNlY19hdAkJU2VjdXJpdHkgQVQKKzMJc2FjX2RhcAkJU2VjdXJpdHkgREFQCis0CXRzZWNtCQlTZWN1cml0eSBFbmdpbmUKKzUJc2V0bV90bXgJU2VyaWFsIEVtYmVkZGVkIFRyYWNlIE1vZHVsZQorNglhdnMJCUFkYXB0aXZlIFZvbHRhZ2UgU2NhbGluZworNwlzcWYJCVNQSQorOAlwd20JCVBXTQorOQlpMmNfMgkJSTJDIDIKKzEwCWkyY18xCQlJMkMgMQorMTEJZGRyX3BoeQkJRERSIFBIWQorMTIJZGRyX2ZjbGsJRERSIEYgY2xvY2sKKzEzCXRyYWNlCQlUcmFjZQorMTQJY291bnRlcgkJQ291bnRlcgorMTUJZWlwOTcJCUVJUCA5NworMTYJY3B1CQlDUFUKKworVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgcHJvdmlkZWQgSURzIGZvciBBcm1hZGEgMzcwIFNvdXRoIGJyaWRnZSBjbG9ja3M6CitJRAlDbG9jayBuYW1lCURlc2NyaXB0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMAlnYmUtNTAJCTUwIE1IeiBwYXJlbnQgY2xvY2sgZm9yIEdpZ2FiaXQgRXRoZXJuZXQKKzEJZ2JlLWNvcmUJcGFyZW50IGNsb2NrIGZvciBHaWdhYml0IEV0aGVybmV0IGNvcmUKKzIJZ2JlLTEyNQkJMTI1IE1IeiBwYXJlbnQgY2xvY2sgZm9yIEdpZ2FiaXQgRXRoZXJuZXQKKzMJZ2JlMS01MAkJNTAgTUh6IGNsb2NrIGZvciBHaWdhYml0IEV0aGVybmV0IHBvcnQgMQorNAlnYmUwLTUwCQk1MCBNSHogY2xvY2sgZm9yIEdpZ2FiaXQgRXRoZXJuZXQgcG9ydCAwCis1CWdiZTEtMTI1CTEyNSBNSHogY2xvY2sgZm9yIEdpZ2FiaXQgRXRoZXJuZXQgcG9ydCAxCis2CWdiZTAtMTI1CTEyNSBNSHogY2xvY2sgZm9yIEdpZ2FiaXQgRXRoZXJuZXQgcG9ydCAwCis3CWdiZTEtY29yZQlHaWdhYml0IEV0aGVybmV0IGNvcmUgcG9ydCAxCis4CWdiZTAtY29yZQlHaWdhYml0IEV0aGVybmV0IGNvcmUgcG9ydCAwCis5CWdiZS1ibQkJR2lnYWJpdCBFdGhlcm5ldCBCdWZmZXIgTWFuYWdlcgorMTAJc2RpbwkJU0RJTworMTEJdXNiMzItc3ViMi1zeXMJVVNCIDIgY2xvY2sKKzEyCXVzYjMyLXNzLXN5cwlVU0IgMyBjbG9jaworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGUgOiBzaGFsbCBiZSAibWFydmVsbCxhcm1hZGEtMzcwMC1wZXJpcGgtY2xvY2stbmIiIGZvciB0aGUKKyAgbm9ydGggYnJpZGdlIGJsb2NrLCBvcgorICAibWFydmVsbCxhcm1hZGEtMzcwMC1wZXJpcGgtY2xvY2stc2IiIGZvciB0aGUgc291dGggYnJpZGdlIGJsb2NrCistIHJlZyA6IG11c3QgYmUgdGhlIHJlZ2lzdGVyIGFkZHJlc3Mgb2YgTm9ydGgvU291dGggQnJpZGdlIENsb2NrIHJlZ2lzdGVyCistICNjbG9jay1jZWxscyA6IGZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmc7IHNoYWxsIGJlIHNldCB0byAxCisKKy0gY2xvY2tzIDogbGlzdCBvZiB0aGUgcGFyZW50IGNsb2NrIHBoYW5kbGUgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKyAgVEJHLUEgUCwgVEJHLUIgUCwgVEJHLUEgUywgVEJHLUIgUyBhbmQgZmluYWxseSB0aGUgeHRhbCBjbG9jay4KKworCitFeGFtcGxlOgorCituYl9wZXJpaF9jbGs6IG5iLXBlcmlwaC1jbGtAMTMwMDB7CisJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGFybWFkYS0zNzAwLXBlcmlwaC1jbG9jay1uYiI7CisJcmVnID0gPDB4MTMwMDAgMHgxMDAwPjsKKwljbG9ja3MgPSA8JnRiZyAwPiwgPCZ0YmcgMT4sIDwmdGJnIDI+LAorCTwmdGJnIDM+LCA8Jnh0YWxjbGs+OworCSNjbG9jay1jZWxscyA9IDwxPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtYWRhMzcwMC10YmctY2xvY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2FybWFkYTM3MDAtdGJnLWNsb2NrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmExZDgzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2FybWFkYTM3MDAtdGJnLWNsb2NrLnR4dApAQCAtMCwwICsxLDI3IEBACisqIFRpbWUgQmFzZSBHZW5lcmF0b3IgQ2xvY2sgYmluZGluZ3MgZm9yIE1hcnZlbGwgQXJtYWRhIDM3eHggU29DcworCitNYXJ2ZWxsIEFybWFkYSAzN3h4IFNvQ3MgcHJvdmRlIFRpbWUgQmFzZSBHZW5lcmF0b3IgY2xvY2tzIHdoaWNoIGFyZQordXNlZCBhcyBwYXJlbnQgY2xvY2tzIGZvciB0aGUgcGVyaXBoZXJhbCBjbG9ja3MuCisKK1RoZSBUQkcgY2xvY2sgY29uc3VtZXIgc2hvdWxkIHNwZWNpZnkgdGhlIGRlc2lyZWQgY2xvY2sgYnkgaGF2aW5nIHRoZQorY2xvY2sgSUQgaW4gaXRzICJjbG9ja3MiIHBoYW5kbGUgY2VsbC4KKworVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgcHJvdmlkZWQgSURzIGFuZCBjbG9jayBuYW1lcyBvbiBBcm1hZGEgMzcwMDoKKyAwID0gVEJHIEEgUAorIDEgPSBUQkcgQiBQCisgMiA9IFRCRyBBIFMKKyAzID0gVEJHIEIgUworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogc2hhbGwgYmUgIm1hcnZlbGwsYXJtYWRhLTM3MDAtdGJnLWNsb2NrIgorLSByZWcgOiBtdXN0IGJlIHRoZSByZWdpc3RlciBhZGRyZXNzIG9mIE5vcnRoIEJyaWRnZSBQTEwgcmVnaXN0ZXIKKy0gI2Nsb2NrLWNlbGxzIDogZnJvbSBjb21tb24gY2xvY2sgYmluZGluZzsgc2hhbGwgYmUgc2V0IHRvIDEKKworRXhhbXBsZToKKwordGJnOiB0YmdAMTMyMDAgeworCWNvbXBhdGlibGUgPSAibWFydmVsbCxhcm1hZGEtMzcwMC10YmctY2xvY2siOworCXJlZyA9IDwweDEzMjAwIDB4MTAwMD47CisJY2xvY2tzID0gPCZ4dGFsY2xrPjsKKwkjY2xvY2stY2VsbHMgPSA8MT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2FybWFkYTM3MDAteHRhbC1jbG9jay50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtYWRhMzcwMC14dGFsLWNsb2NrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODhmMWYwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2FybWFkYTM3MDAteHRhbC1jbG9jay50eHQKQEAgLTAsMCArMSwyOCBAQAorKiBYdGFsIENsb2NrIGJpbmRpbmdzIGZvciBNYXJ2ZWxsIEFybWFkYSAzN3h4IFNvQ3MKKworTWFydmVsbCBBcm1hZGEgMzd4eCBTb0NzIGFsbG93IHRvIGRldGVybWluZSB0aGUgeHRhbCBjbG9jayBmcmVxdWVuY2llcyBieQorcmVhZGluZyB0aGUgZ3BpbyBsYXRjaCByZWdpc3Rlci4KKworVGhpcyBub2RlIG11c3QgYmUgYSBzdWJub2RlIG9mIHRoZSBub2RlIGV4cG9zaW5nIHRoZSByZWdpc3RlciBhZGRyZXNzCitvZiB0aGUgR1BJTyBibG9jayB3aGVyZSB0aGUgZ3BpbyBsYXRjaCBpcyBsb2NhdGVkLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogc2hhbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJIm1hcnZlbGwsYXJtYWRhLTM3MDAteHRhbC1jbG9jayIKKy0gI2Nsb2NrLWNlbGxzIDogZnJvbSBjb21tb24gY2xvY2sgYmluZGluZzsgc2hhbGwgYmUgc2V0IHRvIDAKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gY2xvY2stb3V0cHV0LW5hbWVzIDogZnJvbSBjb21tb24gY2xvY2sgYmluZGluZzsgYWxsb3dzIG92ZXJ3cml0ZSBkZWZhdWx0IGNsb2NrCisJb3V0cHV0IG5hbWVzICgieHRhbCIpCisKK0V4YW1wbGU6CitncGlvMTogZ3Bpb0AxMzgwMCB7CisJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGFybWFkYS0zNzAwLWdwaW8iLCAic3lzY29uIiwgInNpbXBsZS1tZmQiOworCXJlZyA9IDwweDEzODAwIDB4MTAwMD47CisKKwl4dGFsY2xrOiB4dGFsLWNsayB7CisJCWNvbXBhdGlibGUgPSAibWFydmVsbCxhcm1hZGEtMzcwMC14dGFsLWNsb2NrIjsKKwkJY2xvY2stb3V0cHV0LW5hbWVzID0gInh0YWwiOworCQkjY2xvY2stY2VsbHMgPSA8MD47CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXQ5MS1jbG9jay50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXQ5MS1jbG9jay50eHQKaW5kZXggMTgxYmM4YS4uNWYzYWQ2NWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9hdDkxLWNsb2NrLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXQ5MS1jbG9jay50eHQKQEAgLTYsNyArNiw4IEBACiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAtIGNvbXBhdGlibGUgOiBzaGFsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQkiYXRtZWwsYXQ5MXNhbTl4NS1zY2tjIjoKKwkiYXRtZWwsYXQ5MXNhbTl4NS1zY2tjIiBvcgorCSJhdG1lbCxzYW1hNWQ0LXNja2MiOgogCQlhdDkxIFNDS0MgKFNsb3cgQ2xvY2sgQ29udHJvbGxlcikKIAkJVGhpcyBub2RlIGNvbnRhaW5zIHRoZSBzbG93IGNsb2NrIGRlZmluaXRpb25zLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYnJjbSxiY201MzU3My1pbHAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2JyY20sYmNtNTM1NzMtaWxwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWJiMTA3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2JyY20sYmNtNTM1NzMtaWxwLnR4dApAQCAtMCwwICsxLDM2IEBACitCcm9hZGNvbSBCQ001MzU3MyBJTFAgY2xvY2sKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGJpbmRpbmcgdXNlcyB0aGUgY29tbW9uIGNsb2NrIGJpbmRpbmc6CisgICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2Nsb2NrLWJpbmRpbmdzLnR4dAorCitUaGlzIGJpbmRpbmcgaXMgdXNlZCBmb3IgSUxQIGNsb2NrIChzb21ldGltZXMgcmVmZXJyZWQgYXMgInNsb3cgY2xvY2siKQorb24gQnJvYWRjb20gQkNNNTM1NzMgZGV2aWNlcyB1c2luZyBDb3J0ZXgtQTcgQ1BVLgorCitJTFAncyByYXRlIGhhcyB0byBiZSBjYWxjdWxhdGVkIG9uIHJ1bnRpbWUgYW5kIGl0IGRlcGVuZHMgb24gQUxQIGNsb2NrCit3aGljaCBoYXMgdG8gYmUgcmVmZXJlbmNlZC4KKworVGhpcyBjbG9jayBpcyBwYXJ0IG9mIFBNVSAoUG93ZXIgTWFuYWdlbWVudCBVbml0KSwgYSBCcm9hZGNvbSdzIGRldmljZQoraGFuZGluZyBwb3dlci1yZWxhdGVkIGFzcGVjdHMuIEl0cyBub2RlIG11c3QgYmUgc3ViLW5vZGUgb2YgdGhlIFBNVQorZGV2aWNlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAiYnJjbSxiY201MzU3My1pbHAiCistIGNsb2NrczogaGFzIHRvIHJlZmVyZW5jZSBhbiBBTFAgY2xvY2sKKy0gI2Nsb2NrLWNlbGxzOiBzaG91bGQgYmUgPDA+CistIGNsb2NrLW91dHB1dC1uYW1lczogZnJvbSBjb21tb24gY2xvY2sgYmluZGluZ3MsIHNob3VsZCBjb250YWluIGNsb2NrCisJCSAgICAgIG5hbWUKKworRXhhbXBsZToKKworcG11QDE4MDEyMDAwIHsKKwljb21wYXRpYmxlID0gInNpbXBsZS1tZmQiLCAic3lzY29uIjsKKwlyZWcgPSA8MHgxODAxMjAwMCAweDAwMDAxMDAwPjsKKworCWlscCB7CisJCWNvbXBhdGlibGUgPSAiYnJjbSxiY201MzU3My1pbHAiOworCQljbG9ja3MgPSA8JmFscD47CisJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJY2xvY2stb3V0cHV0LW5hbWVzID0gImlscCI7CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xrLWV4eW5vcy1hdWRzcy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xrLWV4eW5vcy1hdWRzcy50eHQKaW5kZXggMTgwZTg4My4uMGMzZDYwMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2Nsay1leHlub3MtYXVkc3MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9jbGstZXh5bm9zLWF1ZHNzLnR4dApAQCAtMTAsNiArMTAsOCBAQAogICAtICJzYW1zdW5nLGV4eW5vczQyMTAtYXVkc3MtY2xvY2siIC0gY29udHJvbGxlciBjb21wYXRpYmxlIHdpdGggYWxsIEV4eW5vczQgU29Dcy4KICAgLSAic2Ftc3VuZyxleHlub3M1MjUwLWF1ZHNzLWNsb2NrIiAtIGNvbnRyb2xsZXIgY29tcGF0aWJsZSB3aXRoIEV4eW5vczUyNTAKICAgICBTb0NzLgorICAtICJzYW1zdW5nLGV4eW5vczU0MTAtYXVkc3MtY2xvY2siIC0gY29udHJvbGxlciBjb21wYXRpYmxlIHdpdGggRXh5bm9zNTQxMAorICAgIFNvQ3MuCiAgIC0gInNhbXN1bmcsZXh5bm9zNTQyMC1hdWRzcy1jbG9jayIgLSBjb250cm9sbGVyIGNvbXBhdGlibGUgd2l0aCBFeHlub3M1NDIwCiAgICAgU29Dcy4KIC0gcmVnOiBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgY29udHJvbGxlcidzIHJlZ2lzdGVyIHNldC4KQEAgLTkxLDUgKzkzLDUgQEAKIAkJPCZjbG9ja19hdWRzcyBFWFlOT1NfTU9VVF9BVURTUz4sCiAJCTwmY2xvY2tfYXVkc3MgRVhZTk9TX01PVVRfSTJTPjsKIAljbG9jay1uYW1lcyA9ICJpaXMiLCAiaTJzX29wY2xrMCIsICJpMnNfb3BjbGsxIiwKLQkibW91dF9hdWRzcyIsICJtb3V0X2kycyI7CisJCSAgICAgICJtb3V0X2F1ZHNzIiwgIm1vdXRfaTJzIjsKIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svZXh5bm9zNTQxMC1jbG9jay50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svZXh5bm9zNTQxMC1jbG9jay50eHQKaW5kZXggYWVhYjYzNS4uNDUyN2RlMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2V4eW5vczU0MTAtY2xvY2sudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9leHlub3M1NDEwLWNsb2NrLnR4dApAQCAtMTIsMjQgKzEyLDI5IEBACiAKIC0gI2Nsb2NrLWNlbGxzOiBzaG91bGQgYmUgMS4KIAorLSBjbG9ja3M6IHNob3VsZCBjb250YWluIGFuIGVudHJ5IHNwZWNpZnlpbmcgdGhlIHJvb3QgY2xvY2sgZnJvbSBleHRlcm5hbAorICBvc2NpbGxhdG9yIHN1cHBsaWVkIHRocm91Z2ggWFhUSSBvciBYdXNiWFRJIHBpbi4gIFRoaXMgY2xvY2sgc2hvdWxkIGJlCisgIGRlZmluZWQgdXNpbmcgc3RhbmRhcmQgY2xvY2sgYmluZGluZ3Mgd2l0aCAiZmluX3BsbCIgY2xvY2stb3V0cHV0LW5hbWUuCisgIFRoYXQgY2xvY2sgaXMgYmVpbmcgcGFzc2VkIGludGVybmFsbHkgdG8gdGhlIDkgUExMcy4KKwogQWxsIGF2YWlsYWJsZSBjbG9ja3MgYXJlIGRlZmluZWQgYXMgcHJlcHJvY2Vzc29yIG1hY3JvcyBpbgogZHQtYmluZGluZ3MvY2xvY2svZXh5bm9zNTQxMC5oIGhlYWRlciBhbmQgY2FuIGJlIHVzZWQgaW4gZGV2aWNlCiB0cmVlIHNvdXJjZXMuCiAKLUV4dGVybmFsIGNsb2NrOgotCi1UaGVyZSBpcyBjbG9jayB0aGF0IGlzIGdlbmVyYXRlZCBvdXRzaWRlIHRoZSBTb0MuIEl0Ci1pcyBleHBlY3RlZCB0aGF0IGl0IGlzIGRlZmluZWQgdXNpbmcgc3RhbmRhcmQgY2xvY2sgYmluZGluZ3MKLXdpdGggZm9sbG93aW5nIGNsb2NrLW91dHB1dC1uYW1lOgotCi0gLSAiZmluX3BsbCIgLSBQTEwgaW5wdXQgY2xvY2sgZnJvbSBYWFRJCi0KIEV4YW1wbGUgMTogQW4gZXhhbXBsZSBvZiBhIGNsb2NrIGNvbnRyb2xsZXIgbm9kZSBpcyBsaXN0ZWQgYmVsb3cuCiAKKwlmaW5fcGxsOiB4eHRpIHsKKwkJY29tcGF0aWJsZSA9ICJmaXhlZC1jbG9jayI7CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwyNDAwMDAwMD47CisJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJmaW5fcGxsIjsKKwkJI2Nsb2NrLWNlbGxzID0gPDA+OworCX07CisKIAljbG9jazogY2xvY2stY29udHJvbGxlckAweDEwMDEwMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczU0MTAtY2xvY2siOwogCQlyZWcgPSA8MHgxMDAxMDAwMCAweDMwMDAwPjsKIAkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQljbG9ja3MgPSA8JmZpbl9wbGw+OwogCX07CiAKIEV4YW1wbGUgMjogVUFSVCBjb250cm9sbGVyIG5vZGUgdGhhdCBjb25zdW1lcyB0aGUgY2xvY2sgZ2VuZXJhdGVkIGJ5IHRoZSBjbG9jawpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3Njg2LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzY4Ni50eHQKaW5kZXggOWM0MDczOS4uODM5OGEzYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3Njg2LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc2ODYudHh0CkBAIC0xLDEwICsxLDI0IEBACi1CaW5kaW5nIGZvciBNYXhpbSBNQVg3NzY4NiAzMmsgY2xvY2sgZ2VuZXJhdG9yIGJsb2NrCitCaW5kaW5nIGZvciBNYXhpbSBNQVg3NzY4Ni9NQVg3NzgwMi9NQVg3NzYyMCAzMmsgY2xvY2sgZ2VuZXJhdG9yIGJsb2NrCiAKLVRoaXMgaXMgYSBwYXJ0IG9mIGRldmljZSB0cmVlIGJpbmRpbmdzIG9mIE1BWDc3Njg2IG11bHRpLWZ1bmN0aW9uIGRldmljZS4KLU1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIGJpbmRpbmdzL21mZC9tYXg3NzY4Ni50eHQgZmlsZS4KK1RoaXMgaXMgYSBwYXJ0IG9mIGRldmljZSB0cmVlIGJpbmRpbmdzIG9mIE1BWDc3Njg2L01BWDc3ODAyL01BWDc3NjIwCittdWx0aS1mdW5jdGlvbiBkZXZpY2UuIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIE1GRCBEVCBiaW5kaW5nCitkb2MgYXMgZm9sbG93czoKKwliaW5kaW5ncy9tZmQvbWF4Nzc2ODYudHh0IGZvciBNQVg3NzY4NiBhbmQKKwliaW5kaW5ncy9tZmQvbWF4Nzc4MDIudHh0IGZvciBNQVg3NzgwMiBhbmQKKwliaW5kaW5ncy9tZmQvbWF4Nzc2MjAudHh0IGZvciBNQVg3NzYyMC4KIAogVGhlIE1BWDc3Njg2IGNvbnRhaW5zIHRocmVlIDMyLjc2OGtoeiBjbG9jayBvdXRwdXRzIHRoYXQgY2FuIGJlIGNvbnRyb2xsZWQKLShnYXRlZC91bmdhdGVkKSBvdmVyIEkyQy4KKyhnYXRlZC91bmdhdGVkKSBvdmVyIEkyQy4gQ2xvY2tzIGFyZSBkZWZpbmVkIGFzIHByZXByb2Nlc3NvciBtYWNyb3MgaW4KK2R0LWJpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3Njg2LmguCisKKworVGhlIE1BWDc3ODAyIGNvbnRhaW5zIHR3byAzMi43NjhraHogY2xvY2sgb3V0cHV0cyB0aGF0IGNhbiBiZSBjb250cm9sbGVkCisoZ2F0ZWQvdW5nYXRlZCkgb3ZlciBJMkMuIENsb2NrcyBhcmUgZGVmaW5lZCBhcyBwcmVwcm9jZXNzb3IgbWFjcm9zIGluCitkdC1iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzgwMi5oLgorCitUaGUgTUFYNzc2ODYgY29udGFpbnMgb25lIDMyLjc2OGtoeiBjbG9jayBvdXRwdXRzIHRoYXQgY2FuIGJlIGNvbnRyb2xsZWQKKyhnYXRlZC91bmdhdGVkKSBvdmVyIEkyQy4gQ2xvY2tzIGFyZSBkZWZpbmVkIGFzIHByZXByb2Nlc3NvciBtYWNyb3MgaW4KK2R0LWJpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3NjIwLmguCiAKIEZvbGxvd2luZyBwcm9wZXJ0aWVzIHNob3VsZCBiZSBwcmVzZW5kIGluIG1haW4gZGV2aWNlIG5vZGUgb2YgdGhlIE1GRCBjaGlwLgogCkBAIC0xNywzMCArMzEsODQgQEAKIAogRWFjaCBjbG9jayBpcyBhc3NpZ25lZCBhbiBpZGVudGlmaWVyIGFuZCBjbGllbnQgbm9kZXMgY2FuIHVzZSB0aGlzIGlkZW50aWZpZXIKIHRvIHNwZWNpZnkgdGhlIGNsb2NrIHdoaWNoIHRoZXkgY29uc3VtZS4gRm9sbG93aW5nIGluZGljZXMgYXJlIGFsbG93ZWQ6Ci0gICAgLSAwOiAzMmtoel9hcCBjbG9jaywKLSAgICAtIDE6IDMya2h6X2NwIGNsb2NrLAotICAgIC0gMjogMzJraHpfcG1pYyBjbG9jay4KKyAgICAtIDA6IDMya2h6X2FwIGNsb2NrIChtYXg3NzY4NiwgbWF4Nzc4MDIpLCAzMmtoel9vdXQwIChtYXg3NzYyMCkKKyAgICAtIDE6IDMya2h6X2NwIGNsb2NrIChtYXg3NzY4NiwgbWF4Nzc4MDIpLAorICAgIC0gMjogMzJraHpfcG1pYyBjbG9jayAobWF4Nzc2ODYpLgogCi1DbG9ja3MgYXJlIGRlZmluZWQgYXMgcHJlcHJvY2Vzc29yIG1hY3JvcyBpbiBkdC1iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzY4Ni5oCi1oZWFkZXIgYW5kIGNhbiBiZSB1c2VkIGluIGRldmljZSB0cmVlIHNvdXJjZXMuCitDbG9ja3MgYXJlIGRlZmluZWQgYXMgcHJlcHJvY2Vzc29yIG1hY3JvcyBpbiBhYm92ZSBkdC1iaW5kaW5nIGhlYWRlciBmb3IKK3Jlc3BlY3RpdmUgY2hpcHMuCiAKLUV4YW1wbGU6IE5vZGUgb2YgdGhlIE1GRCBjaGlwCitFeGFtcGxlOgogCi0JbWF4Nzc2ODY6IG1heDc3Njg2QDA5IHsKLQkJY29tcGF0aWJsZSA9ICJtYXhpbSxtYXg3NzY4NiI7Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jndha2V1cF9laW50PjsKLQkJaW50ZXJydXB0cyA9IDwyNiAwPjsKLQkJcmVnID0gPDB4MDk+OwotCQkjY2xvY2stY2VsbHMgPSA8MT47CisxLiBXaXRoIE1BWDc3Njg2OgogCi0JCS8qIC4uLiAqLwotCX07CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc2ODYuaD4KKy8qIC4uLiAqLwogCi1FeGFtcGxlOiBDbG9jayBjb25zdW1lciBub2RlCisJTm9kZSBvZiB0aGUgTUZEIGNoaXAKKwkJbWF4Nzc2ODY6IG1heDc3Njg2QDA5IHsKKwkJCWNvbXBhdGlibGUgPSAibWF4aW0sbWF4Nzc2ODYiOworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmd2FrZXVwX2VpbnQ+OworCQkJaW50ZXJydXB0cyA9IDwyNiAwPjsKKwkJCXJlZyA9IDwweDA5PjsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKIAotCWZvb0AwIHsKLQkJY29tcGF0aWJsZSA9ICJiYXIsZm9vIjsKLQkJLyogLi4uICovCi0JCWNsb2NrLW5hbWVzID0gIm15LWNsb2NrIjsKLQkJY2xvY2tzID0gPCZtYXg3NzY4NiBNQVg3NzY4Nl9DTEtfUE1JQz47Ci0JfTsKKwkJCS8qIC4uLiAqLworCQl9OworCisJQ2xvY2sgY29uc3VtZXIgbm9kZQorCisJCWZvb0AwIHsKKwkJCWNvbXBhdGlibGUgPSAiYmFyLGZvbyI7CisJCQkvKiAuLi4gKi8KKwkJCWNsb2NrLW5hbWVzID0gIm15LWNsb2NrIjsKKwkJCWNsb2NrcyA9IDwmbWF4Nzc2ODYgTUFYNzc2ODZfQ0xLX1BNSUM+OworCQl9OworCisyLiBXaXRoIE1BWDc3ODAyOgorCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc4MDIuaD4KKy8qIC4uLiAqLworCisJTm9kZSBvZiB0aGUgTUZEIGNoaXAKKwkJbWF4Nzc4MDI6IG1heDc3ODAyQDA5IHsKKwkJCWNvbXBhdGlibGUgPSAibWF4aW0sbWF4Nzc4MDIiOworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmd2FrZXVwX2VpbnQ+OworCQkJaW50ZXJydXB0cyA9IDwyNiAwPjsKKwkJCXJlZyA9IDwweDA5PjsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKworCQkJLyogLi4uICovCisJCX07CisKKwlDbG9jayBjb25zdW1lciBub2RlCisKKwkJZm9vQDAgeworCQkJY29tcGF0aWJsZSA9ICJiYXIsZm9vIjsKKwkJCS8qIC4uLiAqLworCQkJY2xvY2stbmFtZXMgPSAibXktY2xvY2siOworCQkJY2xvY2tzID0gPCZtYXg3NzgwMiBNQVg3NzgwMl9DTEtfMzJLX0FQPjsKKwkJfTsKKworCiszLiBXaXRoIE1BWDc3NjIwOgorCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc2MjAuaD4KKy8qIC4uLiAqLworCisJTm9kZSBvZiB0aGUgTUZEIGNoaXAKKwkJbWF4Nzc2MjA6IG1heDc3NjIwQDNjIHsKKwkJCWNvbXBhdGlibGUgPSAibWF4aW0sbWF4Nzc2MjAiOworCQkJcmVnID0gPDB4M2M+OworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJLyogLi4uICovCisJCX07CisKKwlDbG9jayBjb25zdW1lciBub2RlCisKKwkJZm9vQDAgeworCQkJY29tcGF0aWJsZSA9ICJiYXIsZm9vIjsKKwkJCS8qIC4uLiAqLworCQkJY2xvY2stbmFtZXMgPSAibXktY2xvY2siOworCQkJY2xvY2tzID0gPCZtYXg3NzYyMCBNQVg3NzYyMF9DTEtfMzJLX09VVDA+OworCQl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3ODAyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzgwMi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZGM3ODMuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3ODAyLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLUJpbmRpbmcgZm9yIE1heGltIE1BWDc3ODAyIDMyayBjbG9jayBnZW5lcmF0b3IgYmxvY2sKLQotVGhpcyBpcyBhIHBhcnQgb2YgZGV2aWNlIHRyZWUgYmluZGluZ3Mgb2YgTUFYNzc4MDIgbXVsdGktZnVuY3Rpb24gZGV2aWNlLgotTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gYmluZGluZ3MvbWZkL21heDc3ODAyLnR4dCBmaWxlLgotCi1UaGUgTUFYNzc4MDIgY29udGFpbnMgdHdvIDMyLjc2OGtoeiBjbG9jayBvdXRwdXRzIHRoYXQgY2FuIGJlIGNvbnRyb2xsZWQKLShnYXRlZC91bmdhdGVkKSBvdmVyIEkyQy4KLQotRm9sbG93aW5nIHByb3BlcnRpZXMgc2hvdWxkIGJlIHByZXNlbnQgaW4gbWFpbiBkZXZpY2Ugbm9kZSBvZiB0aGUgTUZEIGNoaXAuCi0KLVJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tICNjbG9jay1jZWxsczogRnJvbSBjb21tb24gY2xvY2sgYmluZGluZzsgc2hhbGwgYmUgc2V0IHRvIDEuCi0KLU9wdGlvbmFsIHByb3BlcnRpZXM6Ci0tIGNsb2NrLW91dHB1dC1uYW1lczogRnJvbSBjb21tb24gY2xvY2sgYmluZGluZy4KLQotRWFjaCBjbG9jayBpcyBhc3NpZ25lZCBhbiBpZGVudGlmaWVyIGFuZCBjbGllbnQgbm9kZXMgY2FuIHVzZSB0aGlzIGlkZW50aWZpZXIKLXRvIHNwZWNpZnkgdGhlIGNsb2NrIHdoaWNoIHRoZXkgY29uc3VtZS4gRm9sbG93aW5nIGluZGljZXMgYXJlIGFsbG93ZWQ6Ci0gICAgIC0gMDogMzJraHpfYXAgY2xvY2ssCi0gICAgIC0gMTogMzJraHpfY3AgY2xvY2suCi0KLUNsb2NrcyBhcmUgZGVmaW5lZCBhcyBwcmVwcm9jZXNzb3IgbWFjcm9zIGluIGR0LWJpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3ODAyLmgKLWhlYWRlciBhbmQgY2FuIGJlIHVzZWQgaW4gZGV2aWNlIHRyZWUgc291cmNlcy4KLQotRXhhbXBsZTogTm9kZSBvZiB0aGUgTUZEIGNoaXAKLQotCW1heDc3ODAyOiBtYXg3NzgwMkAwOSB7Ci0JCWNvbXBhdGlibGUgPSAibWF4aW0sbWF4Nzc4MDIiOwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ3YWtldXBfZWludD47Ci0JCWludGVycnVwdHMgPSA8MjYgMD47Ci0JCXJlZyA9IDwweDA5PjsKLQkJI2Nsb2NrLWNlbGxzID0gPDE+OwotCi0JCS8qIC4uLiAqLwotCX07Ci0KLUV4YW1wbGU6IENsb2NrIGNvbnN1bWVyIG5vZGUKLQotCWZvb0AwIHsKLQkJY29tcGF0aWJsZSA9ICJiYXIsZm9vIjsKLQkJLyogLi4uICovCi0JCWNsb2NrLW5hbWVzID0gIm15LWNsb2NrIjsKLQkJY2xvY2tzID0gPCZtYXg3NzgwMiBNQVg3NzgwMl9DTEtfMzJLX0FQPjsKLQl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL212ZWJ1LWdhdGVkLWNsb2NrLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9tdmVidS1nYXRlZC1jbG9jay50eHQKaW5kZXggNjYwZTY0OS4uY2I4NTQyZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL212ZWJ1LWdhdGVkLWNsb2NrLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svbXZlYnUtZ2F0ZWQtY2xvY2sudHh0CkBAIC04Niw2ICs4Niw4IEBACiA3CXBleDMJCVBDSWUgMwogOAlwZXgwCQlQQ0llIDAKIDkJdXNiM2gwCQlVU0IzIEhvc3QgMAorMTAJdXNiM2gxCQlVU0IzIEhvc3QgMQorMTUJc2F0YTAJCVNBVEEgMAogMTcJc2RpbwkJU0RJTwogMjIJeG9yMAkJWE9SIDAKIDI4CXhvcjEJCVhPUiAxCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svcWNvbSxnY2MudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLnR4dAppbmRleCA5YTYwZmRlLi44NjlhMmYwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svcWNvbSxnY2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9xY29tLGdjYy50eHQKQEAgLTE1LDYgKzE1LDcgQEAKIAkJCSJxY29tLGdjYy1tc204OTc0cHJvIgogCQkJInFjb20sZ2NjLW1zbTg5NzRwcm8tYWMiCiAJCQkicWNvbSxnY2MtbXNtODk5NiIKKwkJCSJxY29tLGdjYy1tZG05NjE1IgogCiAtIHJlZyA6IHNoYWxsIGNvbnRhaW4gYmFzZSByZWdpc3RlciBsb2NhdGlvbiBhbmQgbGVuZ3RoCiAtICNjbG9jay1jZWxscyA6IHNoYWxsIGNvbnRhaW4gMQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3Fjb20sbGNjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9xY29tLGxjYy50eHQKaW5kZXggZGQ3NTViZS4uYTNjNzhhYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3Fjb20sbGNjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svcWNvbSxsY2MudHh0CkBAIC03LDYgKzcsNyBAQAogCQkJInFjb20sbGNjLW1zbTg5NjAiCiAJCQkicWNvbSxsY2MtYXBxODA2NCIKIAkJCSJxY29tLGxjYy1pcHE4MDY0IgorCQkJInFjb20sbGNjLW1kbTk2MTUiCiAKIC0gcmVnIDogc2hhbGwgY29udGFpbiBiYXNlIHJlZ2lzdGVyIGxvY2F0aW9uIGFuZCBsZW5ndGgKIC0gI2Nsb2NrLWNlbGxzIDogc2hhbGwgY29udGFpbiAxCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLWRpdm11eC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLWRpdm11eC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNDc2NTIuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi1kaXZtdXgudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotQmluZGluZyBmb3IgYSBTVCBkaXZpZGVyIGFuZCBtdWx0aXBsZXhlciBjbG9jayBkcml2ZXIuCi0KLVRoaXMgYmluZGluZyB1c2VzIHRoZSBjb21tb24gY2xvY2sgYmluZGluZ1sxXS4KLUJhc2UgYWRkcmVzcyBpcyBsb2NhdGVkIHRvIHRoZSBwYXJlbnQgbm9kZS4gU2VlIGNsb2NrIGJpbmRpbmdbMl0KLQotWzFdIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9jbG9jay1iaW5kaW5ncy50eHQKLVsyXSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLnR4dAotCi1SZXF1aXJlZCBwcm9wZXJ0aWVzOgotCi0tIGNvbXBhdGlibGUgOiBzaGFsbCBiZToKLQkic3QsY2xrZ2VuYS1kaXZtdXgtYzY1LWhzIiwJInN0LGNsa2dlbmEtZGl2bXV4IgotCSJzdCxjbGtnZW5hLWRpdm11eC1jNjUtbHMiLAkic3QsY2xrZ2VuYS1kaXZtdXgiCi0JInN0LGNsa2dlbmEtZGl2bXV4LWMzMi1vZGYwIiwJInN0LGNsa2dlbmEtZGl2bXV4IgotCSJzdCxjbGtnZW5hLWRpdm11eC1jMzItb2RmMSIsCSJzdCxjbGtnZW5hLWRpdm11eCIKLQkic3QsY2xrZ2VuYS1kaXZtdXgtYzMyLW9kZjIiLAkic3QsY2xrZ2VuYS1kaXZtdXgiCi0JInN0LGNsa2dlbmEtZGl2bXV4LWMzMi1vZGYzIiwJInN0LGNsa2dlbmEtZGl2bXV4IgotCi0tICNjbG9jay1jZWxscyA6IEZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmc7IHNoYWxsIGJlIHNldCB0byAxLgotCi0tIGNsb2NrcyA6IEZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmcKLQotLSBjbG9jay1vdXRwdXQtbmFtZXMgOiBGcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nLgotCi1FeGFtcGxlOgotCi0JY2xvY2tnZW4tYUBmZDM0NTAwMCB7Ci0JCXJlZyA9IDwweGZkMzQ1MDAwIDB4YjUwPjsKLQotCQljbGtfbV9hMV9kaXYxOiBjbGstbS1hMS1kaXYxIHsKLQkJCSNjbG9jay1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAic3QsY2xrZ2VuYS1kaXZtdXgtYzMyLW9kZjEiLAotCQkJCSAgICAgInN0LGNsa2dlbmEtZGl2bXV4IjsKLQotCQkJY2xvY2tzID0gPCZjbGtfbV9hMV9vc2NfcHJlZGl2PiwKLQkJCQkgPCZjbGtfbV9hMV9wbGwwIDE+LCAvKiBQTEwwIFBISTEgKi8KLQkJCQkgPCZjbGtfbV9hMV9wbGwxIDE+OyAvKiBQTEwxIFBISTEgKi8KLQotCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNsay1tLXJ4LWljbi10cyIsCi0JCQkJCSAgICAgImNsay1tLXJ4LWljbi12ZHAtMCIsCi0JCQkJCSAgICAgIiIsIC8qIHVudXNlZCAqLwotCQkJCQkgICAgICJjbGstbS1wcnYtdDEtYnVzIiwKLQkJCQkJICAgICAiY2xrLW0taWNuLXJlZy0xMiIsCi0JCQkJCSAgICAgImNsay1tLWljbi1yZWctMTAiLAotCQkJCQkgICAgICIiLCAvKiB1bnVzZWQgKi8KLQkJCQkJICAgICAiY2xrLW0taWNuLXN0MjMxIjsKLQkJfTsKLQl9OwotCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLW11eC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLW11eC50eHQKaW5kZXggZjFmYTkxYy4uOWE0NmNiMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi1tdXgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4tbXV4LnR4dApAQCAtMTAsMTQgKzEwLDcgQEAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAKIC0gY29tcGF0aWJsZSA6IHNoYWxsIGJlOgotCSJzdCxzdGloNDE2LWNsa2dlbmMtdmNjLWhkIiwJInN0LGNsa2dlbi1tdXgiCi0JInN0LHN0aWg0MTYtY2xrZ2VuZi12Y2MtZnZkcCIsCSJzdCxjbGtnZW4tbXV4IgotCSJzdCxzdGloNDE2LWNsa2dlbmYtdmNjLWh2YSIsIAkic3QsY2xrZ2VuLW11eCIKLQkic3Qsc3RpaDQxNi1jbGtnZW5mLXZjYy1oZCIsCSJzdCxjbGtnZW4tbXV4IgotCSJzdCxzdGloNDE2LWNsa2dlbmYtdmNjLXNkIiwJInN0LGNsa2dlbi1tdXgiCi0JInN0LHN0aWg0MTUtY2xrZ2VuLWE5LW11eCIsCSJzdCxjbGtnZW4tbXV4IgotCSJzdCxzdGloNDE2LWNsa2dlbi1hOS1tdXgiLAkic3QsY2xrZ2VuLW11eCIKLQkic3Qsc3RpaDQwNy1jbGtnZW4tYTktbXV4IiwJInN0LGNsa2dlbi1tdXgiCisJInN0LHN0aWg0MDctY2xrZ2VuLWE5LW11eCIKIAogLSAjY2xvY2stY2VsbHMgOiBmcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nOyBzaGFsbCBiZSBzZXQgdG8gMC4KIApAQCAtMjcsMTAgKzIwLDEzIEBACiAKIEV4YW1wbGU6CiAKLQljbGtfbV9odmE6IGNsay1tLWh2YUBmZDY5MDg2OCB7CisJY2xrX21fYTk6IGNsay1tLWE5QDkyYjAwMDAgewogCQkjY2xvY2stY2VsbHMgPSA8MD47Ci0JCWNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1jbGtnZW5mLXZjYy1odmEiLCAic3QsY2xrZ2VuLW11eCI7Ci0JCXJlZyA9IDwweGZkNjkwODY4IDQ+OworCQljb21wYXRpYmxlID0gInN0LHN0aWg0MDctY2xrZ2VuLWE5LW11eCI7CisJCXJlZyA9IDwweDkyYjAwMDAgMHgxMDAwMD47CiAKLQkJY2xvY2tzID0gPCZjbG9ja2dlbl9mIDE+LCA8JmNsa19tX2ExX2RpdjAgMz47CisJCWNsb2NrcyA9IDwmY2xvY2tnZW5fYTlfcGxsIDA+LAorCQkJIDwmY2xvY2tnZW5fYTlfcGxsIDA+LAorCQkJIDwmY2xrX3NfYzBfZmxleGdlbiAxMz4sCisJCQkgPCZjbGtfbV9hOV9leHQyZl9kaXYyPjsKIAl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi1wbGwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi1wbGwudHh0CmluZGV4IDg0NGIzYTAuLmYyMDcwNTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4tcGxsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLXBsbC50eHQKQEAgLTksMjQgKzksMTAgQEAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAKIC0gY29tcGF0aWJsZSA6IHNoYWxsIGJlOgotCSJzdCxjbGtnZW5hLXByZWRpdi1jNjUiLAkic3QsY2xrZ2VuYS1wcmVkaXYiCi0JInN0LGNsa2dlbmEtcHJlZGl2LWMzMiIsCSJzdCxjbGtnZW5hLXByZWRpdiIKLQotCSJzdCxjbGtnZW5hLXBsbHMtYzY1IgotCSJzdCxwbGxzLWMzMi1hMXgtMCIsCQkic3QsY2xrZ2VuLXBsbHMtYzMyIgotCSJzdCxwbGxzLWMzMi1hMXgtMSIsCQkic3QsY2xrZ2VuLXBsbHMtYzMyIgotCSJzdCxzdGloNDE1LXBsbHMtYzMyLWE5IiwJInN0LGNsa2dlbi1wbGxzLWMzMiIKLQkic3Qsc3RpaDQxNS1wbGxzLWMzMi1kZHIiLAkic3QsY2xrZ2VuLXBsbHMtYzMyIgotCSJzdCxzdGloNDE2LXBsbHMtYzMyLWE5IiwJInN0LGNsa2dlbi1wbGxzLWMzMiIKLQkic3Qsc3RpaDQxNi1wbGxzLWMzMi1kZHIiLAkic3QsY2xrZ2VuLXBsbHMtYzMyIgotCSJzdCxzdGloNDA3LXBsbHMtYzMyLWEwIiwJInN0LGNsa2dlbi1wbGxzLWMzMiIKLQkic3Qsc3RpaDQwNy1wbGxzLWMzMi1hOSIsCSJzdCxjbGtnZW4tcGxscy1jMzIiCi0JInNzdCxwbGxzLWMzMi1jeF8wIiwJCSJzdCxjbGtnZW4tcGxscy1jMzIiCi0JInNzdCxwbGxzLWMzMi1jeF8xIiwJCSJzdCxjbGtnZW4tcGxscy1jMzIiCi0JInN0LHN0aWg0MTgtcGxscy1jMjgtYTkiLAkic3QsY2xrZ2VuLXBsbHMtYzMyIgotCi0JInN0LHN0aWg0MTUtZ3B1LXBsbC1jMzIiLAkic3QsY2xrZ2VuZ3B1LXBsbC1jMzIiCi0JInN0LHN0aWg0MTYtZ3B1LXBsbC1jMzIiLAkic3QsY2xrZ2VuZ3B1LXBsbC1jMzIiCisJInN0LGNsa2dlbi1wbGwwIgorCSJzdCxjbGtnZW4tcGxsMSIKKwkic3Qsc3RpaDQwNy1jbGtnZW4tcGxsYTkiCisJInN0LHN0aWg0MTgtY2xrZ2VuLXBsbGE5IgogCiAtICNjbG9jay1jZWxscyA6IEZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmc7IHNoYWxsIGJlIHNldCB0byAxLgogCkBAIC0zNiwxNyArMjIsMTYgQEAKIAogRXhhbXBsZToKIAotCWNsb2NrZ2VuLWFAZmVlNjIwMDAgewotCQlyZWcgPSA8MHhmZWU2MjAwMCAweGI0OD47CisJY2xvY2tnZW4tYTlAOTJiMDAwMCB7CisJCWNvbXBhdGlibGUgPSAic3QsY2xrZ2VuLWMzMiI7CisJCXJlZyA9IDwweDkyYjAwMDAgMHhmZmZmPjsKIAotCQljbGtfc19hMF9wbGw6IGNsay1zLWEwLXBsbCB7CisJCWNsb2NrZ2VuX2E5X3BsbDogY2xvY2tnZW4tYTktcGxsIHsKIAkJCSNjbG9jay1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAic3QsY2xrZ2VuYS1wbGxzLWM2NSI7CisJCQljb21wYXRpYmxlID0gInN0LHN0aWg0MDctY2xrZ2VuLXBsbGE5IjsKIAogCQkJY2xvY2tzID0gPCZjbGtfc3lzaW4+OwogCi0JCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY2xrLXMtYTAtcGxsMC1ocyIsCi0JCQkJCSAgICAgImNsay1zLWEwLXBsbDAtbHMiLAotCQkJCQkgICAgICJjbGstcy1hMC1wbGwxIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbG9ja2dlbi1hOS1wbGwtb2RmIjsKIAkJfTsKIAl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi1wcmVkaXYudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi1wcmVkaXYudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQ3NjZjLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4tcHJlZGl2LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLUJpbmRpbmcgZm9yIGEgU1QgcHJlLWRpdmlkZXIgY2xvY2sgZHJpdmVyLgotCi1UaGlzIGJpbmRpbmcgdXNlcyB0aGUgY29tbW9uIGNsb2NrIGJpbmRpbmdbMV0uCi1CYXNlIGFkZHJlc3MgaXMgbG9jYXRlZCB0byB0aGUgcGFyZW50IG5vZGUuIFNlZSBjbG9jayBiaW5kaW5nWzJdCi0KLVsxXSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0Ci1bMl0gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi50eHQKLQotUmVxdWlyZWQgcHJvcGVydGllczoKLQotLSBjb21wYXRpYmxlIDogc2hhbGwgYmU6Ci0JInN0LGNsa2dlbmEtcHJlZGl2LWM2NSIsCSJzdCxjbGtnZW5hLXByZWRpdiIKLQkic3QsY2xrZ2VuYS1wcmVkaXYtYzMyIiwJInN0LGNsa2dlbmEtcHJlZGl2IgotCi0tICNjbG9jay1jZWxscyA6IEZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmc7IHNoYWxsIGJlIHNldCB0byAwLgotCi0tIGNsb2NrcyA6IEZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmcKLQotLSBjbG9jay1vdXRwdXQtbmFtZXMgOiBGcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nLgotCi1FeGFtcGxlOgotCi0JY2xvY2tnZW4tYUBmZDM0NTAwMCB7Ci0JCXJlZyA9IDwweGZkMzQ1MDAwIDB4YjUwPjsKLQotCQljbGtfbV9hMl9vc2NfcHJlZGl2OiBjbGstbS1hMi1vc2MtcHJlZGl2IHsKLQkJCSNjbG9jay1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAic3QsY2xrZ2VuYS1wcmVkaXYtYzMyIiwKLQkJCQkgICAgICJzdCxjbGtnZW5hLXByZWRpdiI7Ci0KLQkJCWNsb2NrcyA9IDwmY2xrX3N5c2luPjsKLQotCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNsay1tLWEyLW9zYy1wcmVkaXYiOwotCQl9OwotCX07Ci0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4tdmNjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4tdmNjLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA5YjNlZC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLXZjYy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1CaW5kaW5nIGZvciBhIHR5cGUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIGNsb2NrIGNyb3NzYmFyIChWQ0MpLgotCi1UaGUgY3Jvc3NiYXIgY2FuIHRha2UgdXAgdG8gNCBpbnB1dCBjbG9ja3MgYW5kIGNvbnRyb2wgdXAgdG8gMTYKLW91dHB1dCBjbG9ja3MuIE5vdCBhbGwgaW5wdXRzIG9yIG91dHB1dHMgaGF2ZSB0byBiZSBpbiB1c2UgaW4gYQotcGFydGljdWxhciBpbnN0YW50aWF0aW9uLiBFYWNoIG91dHB1dCBjYW4gYmUgaW5kaXZpZHVhbGx5IGVuYWJsZWQsCi1zZWxlY3QgYW55IG9mIHRoZSBpbnB1dCBjbG9ja3MgYW5kIGFwcGx5IGEgZGl2aWRlIChieSAxLDIsNCBvciA4KSB0bwotdGhhdCBzZWxlY3RlZCBjbG9jay4KLQotVGhpcyBiaW5kaW5nIHVzZXMgdGhlIGNvbW1vbiBjbG9jayBiaW5kaW5nWzFdLgotCi1bMV0gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2Nsb2NrLWJpbmRpbmdzLnR4dAotCi1SZXF1aXJlZCBwcm9wZXJ0aWVzOgotCi0tIGNvbXBhdGlibGUgOiBzaGFsbCBiZToKLQkic3Qsc3RpaDQxNi1jbGtnZW5jIiwJCSJzdCx2Y2MiCi0JInN0LHN0aWg0MTYtY2xrZ2VuZiIsCQkic3QsdmNjIgotCi0tICNjbG9jay1jZWxscyA6IGZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmc7IHNoYWxsIGJlIHNldCB0byAxLgotCi0tIHJlZyA6IEEgQmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldC4KLQotLSBjbG9ja3MgOiBmcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nCi0KLS0gY2xvY2stb3V0cHV0LW5hbWVzIDogRnJvbSBjb21tb24gY2xvY2sgYmluZGluZy4gVGhlIGJsb2NrIGhhcyAxNgotICAgICAgICAgICAgICAgICAgICAgICBjbG9jayBvdXRwdXRzIGJ1dCBub3QgYWxsIG9mIHRoZW0gaW4gYSBzcGVjaWZpYyBpbnN0YW5jZQotICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHRvIGJlIHVzZWQgaW4gdGhlIFNvQy4gSWYgYSBjbG9jayBuYW1lIGlzIGxlZnQgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgYW4gZW1wdHkgc3RyaW5nIHRoZW4gbm8gY2xvY2sgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGFzc29jaWF0ZWQgd2l0aCB0aGF0IHN0cmluZyBpbmRleC4gSWYgZmV3ZXIgdGhhbgotICAgICAgICAgICAgICAgICAgICAgICAxNiBzdHJpbmdzIGFyZSBwcm92aWRlZCB0aGVuIG5vIGNsb2NrcyB3aWxsIGJlIGNyZWF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSByZW1haW5pbmcgb3V0cHV0cy4KLQotRXhhbXBsZToKLQotCWNsb2NrZ2VuX2NfdmNjOiBjbG9ja2dlbi1jLXZjY0AweGZlODMwOGFjIHsKLQkJI2Nsb2NrLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gInN0LHN0aWg0MTYtY2xrZ2VuYyIsICJzdCxjbGtnZW4tdmNjIjsKLQkJcmVnID0gPDB4ZmU4MzA4YWMgMTI+OwotCi0JCWNsb2NrcyA9IDwmY2xrX3NfdmNjX2hkPiwKLQkJCSA8JmNsb2NrZ2VuX2MgMT4sCi0JCQkgPCZjbGtfc190bWRzX2Zyb21waHk+LAotCQkJIDwmY2xvY2tnZW5fYyAyPjsKLQotCQljbG9jay1vdXRwdXQtbmFtZXMgID0gImNsay1zLXBpeC1oZG1pIiwKLQkJCQkgICAgICAiY2xrLXMtcGl4LWR2byIsCi0JCQkJICAgICAgImNsay1zLW91dC1kdm8iLAotCQkJCSAgICAgICJjbGstcy1waXgtaGQiLAotCQkJCSAgICAgICJjbGstcy1oZGRhYyIsCi0JCQkJICAgICAgImNsay1zLWRlbmMiLAotCQkJCSAgICAgICJjbGstcy1zZGRhYyIsCi0JCQkJICAgICAgImNsay1zLXBpeC1tYWluIiwKLQkJCQkgICAgICAiY2xrLXMtcGl4LWF1eCIsCi0JCQkJICAgICAgImNsay1zLXN0ZmUtZnJjLTAiLAotCQkJCSAgICAgICJjbGstcy1yZWYtbWNydSIsCi0JCQkJICAgICAgImNsay1zLXNsYXZlLW1jcnUiLAotCQkJCSAgICAgICJjbGstcy10bWRzLWhkbWkiLAotCQkJCSAgICAgICJjbGstcy1oZG1pLXJlamVjdC1wbGwiLAotCQkJCSAgICAgICJjbGstcy10aHNlbnMiOwotCX07Ci0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi50eHQKaW5kZXggYjE4YmY4Ni4uYzM1MzkwZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi50eHQKQEAgLTEzLDE0ICsxMyw2IEBACiAJCQkuLi4KIAkJfTsKIAotCQlwcmVkaXZfbm9kZSB7Ci0JCQkuLi4KLQkJfTsKLQotCQlkaXZtdXhfbm9kZSB7Ci0JCQkuLi4KLQkJfTsKLQogCQlxdWFkZnNfbm9kZSB7CiAJCQkuLi4KIAkJfTsKQEAgLTI5LDEwICsyMSw2IEBACiAJCQkuLi4KIAkJfTsKIAotCQl2Y2Nfbm9kZSB7Ci0JCQkuLi4KLQkJfTsKLQogCQlmbGV4Z2VuX25vZGUgewogCQkJLi4uCiAJCX07CkBAIC00MywxMSArMzEsOCBAQAogRWFjaCBzdWJub2RlIHNob3VsZCB1c2UgdGhlIGJpbmRpbmcgZGVzY3JpYmVkIGluIFsyXS4uWzddCiAKIFsxXSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0Ci1bMl0gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0LGNsa2dlbi1kaXZtdXgudHh0CiBbM10gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0LGNsa2dlbi1tdXgudHh0CiBbNF0gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0LGNsa2dlbi1wbGwudHh0Ci1bNV0gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0LGNsa2dlbi1wcmVkaXYudHh0Ci1bNl0gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0LHZjYy50eHQKIFs3XSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3QscXVhZGZzLnR4dAogWzhdIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdCxmbGV4Z2VuLnR4dAogCkBAIC01Nyw0NCArNDIsMjcgQEAKIAogRXhhbXBsZToKIAotCWNsb2NrZ2VuLWFAZmVlNjIwMDAgewotCi0JCXJlZyA9IDwweGZlZTYyMDAwIDB4YjQ4PjsKKwljbG9ja2dlbi1hQDA5MGZmMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJzdCxjbGtnZW4tYzMyIjsKKwkJcmVnID0gPDB4OTBmZjAwMCAweDEwMDA+OwogCiAJCWNsa19zX2EwX3BsbDogY2xrLXMtYTAtcGxsIHsKIAkJCSNjbG9jay1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAic3QsY2xrZ2VuYS1wbGxzLWM2NSI7Ci0KLQkJCWNsb2NrcyA9IDwmY2xrLXN5c2luPjsKLQotCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNsay1zLWEwLXBsbDAtaHMiLAotCQkJCQkgICAgICJjbGstcy1hMC1wbGwwLWxzIiwKLQkJCQkJICAgICAiY2xrLXMtYTAtcGxsMSI7Ci0JCX07Ci0KLQkJY2xrX3NfYTBfb3NjX3ByZWRpdjogY2xrLXMtYTAtb3NjLXByZWRpdiB7Ci0JCQkjY2xvY2stY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gInN0LGNsa2dlbmEtcHJlZGl2LWM2NSIsCi0JCQkJICAgICAic3QsY2xrZ2VuYS1wcmVkaXYiOworCQkJY29tcGF0aWJsZSA9ICJzdCxjbGtnZW4tcGxsMCI7CiAKIAkJCWNsb2NrcyA9IDwmY2xrX3N5c2luPjsKIAotCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNsay1zLWEwLW9zYy1wcmVkaXYiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNsay1zLWEwLXBsbC1vZmQtMCI7CiAJCX07CiAKLQkJY2xrX3NfYTBfaHM6IGNsay1zLWEwLWhzIHsKKwkJY2xrX3NfYTBfZmxleGdlbjogY2xrLXMtYTAtZmxleGdlbiB7CisJCQljb21wYXRpYmxlID0gInN0LGZsZXhnZW4iOworCiAJCQkjY2xvY2stY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gInN0LGNsa2dlbmEtZGl2bXV4LWM2NS1ocyIsCi0JCQkJICAgICAic3QsY2xrZ2VuYS1kaXZtdXgiOwogCi0JCQljbG9ja3MgPSA8JmNsay1zX2EwX29zY19wcmVkaXY+LAotCQkJCSA8JmNsay1zX2EwX3BsbCAwPiwgLyogcGxsMCBocyAqLwotCQkJCSA8JmNsay1zX2EwX3BsbCAyPjsgLyogcGxsMSAqLworCQkJY2xvY2tzID0gPCZjbGtfc19hMF9wbGwgMD4sCisJCQkJIDwmY2xrX3N5c2luPjsKIAotCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNsay1zLWZkbWEtMCIsCi0JCQkJCSAgICAgImNsay1zLWZkbWEtMSIsCi0JCQkJCSAgICAgIiI7IC8qIGNsay1zLWppdC1zZW5zZSAqLwotCQkJCQkgICAgIC8qIGZvdXJ0aCBvdXRwdXQgdW51c2VkICovCisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY2xrLWljLWxtaTAiOwogCQl9OwogCX07Ci0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxmbGV4Z2VuLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxmbGV4Z2VuLnR4dAppbmRleCBiN2VlNWM3Li43ZmY3N2ZjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsZmxleGdlbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGZsZXhnZW4udHh0CkBAIC02MCw2ICs2MCwxMCBAQAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZSA6IHNoYWxsIGJlOgogICAic3QsZmxleGdlbiIKKyAgInN0LGZsZXhnZW4tYXVkaW8iLCAic3QsZmxleGdlbiIgKGVuYWJsZSBjbG9jayBwcm9wYWdhdGlvbiBvbiBwYXJlbnQgZm9yCisgIGF1ZGlvIHVzZSBjYXNlKQorICAic3QsZmxleGdlbi12aWRlbyIsICJzdCxmbGV4Z2VuIiAoZW5hYmxlIGNsb2NrIHByb3BhZ2F0aW9uIG9uIHBhcmVudAorCQkJCQlhbmQgYWN0aXZhdGUgc3luY2hyb25vdXMgbW9kZSkKIAogLSAjY2xvY2stY2VsbHMgOiBmcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nOyBzaGFsbCBiZSBzZXQgdG8gMSAobXVsdGlwbGUgY2xvY2sKICAgb3V0cHV0cykuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QscXVhZGZzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxxdWFkZnMudHh0CmluZGV4IGNlZGViOWMuLmQ5M2Q0OTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxxdWFkZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxxdWFkZnMudHh0CkBAIC0xMSwxMiArMTEsOCBAQAogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogLSBjb21wYXRpYmxlIDogc2hhbGwgYmU6Ci0gICJzdCxzdGloNDE2LXF1YWRmczIxNiIsCSJzdCxxdWFkZnMiCi0gICJzdCxzdGloNDE2LXF1YWRmczQzMiIsCSJzdCxxdWFkZnMiCi0gICJzdCxzdGloNDE2LXF1YWRmczY2MC1FIiwJInN0LHF1YWRmcyIKLSAgInN0LHN0aWg0MTYtcXVhZGZzNjYwLUYiLAkic3QscXVhZGZzIgotICAic3Qsc3RpaDQwNy1xdWFkZnM2NjAtQyIsCSJzdCxxdWFkZnMiCi0gICJzdCxzdGloNDA3LXF1YWRmczY2MC1EIiwJInN0LHF1YWRmcyIKKyAgInN0LHF1YWRmcyIKKyAgInN0LHF1YWRmcy1wbGwiCiAKIAogLSAjY2xvY2stY2VsbHMgOiBmcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nOyBzaGFsbCBiZSBzZXQgdG8gMS4KQEAgLTM1LDE0ICszMSwxNSBAQAogCiBFeGFtcGxlOgogCi0JY2xvY2tnZW5fZTogY2xvY2tnZW4tZUBmZDMyMDhiYyB7Ci0gICAgICAgICAgICAgICAgI2Nsb2NrLWNlbGxzID0gPDE+OwotICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1xdWFkZnM2NjAtRSIsICJzdCxxdWFkZnMiOwotICAgICAgICAgICAgICAgIHJlZyA9IDwweGZkMzIwOGJjIDB4QjA+OworCWNsa19zX2MwX3F1YWRmczogY2xrLXMtYzAtcXVhZGZzQDkxMDMwMDAgeworCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAic3QscXVhZGZzLXBsbCI7CisJCXJlZyA9IDwweDkxMDMwMDAgMHgxMDAwPjsKIAotICAgICAgICAgICAgICAgIGNsb2NrcyA9IDwmY2xrX3N5c2luPjsKLSAgICAgICAgICAgICAgICBjbG9jay1vdXRwdXQtbmFtZXMgPSAiY2xrLW0tcGl4LW1kdHAtMCIsCi0JCQkJICAgICAiY2xrLW0tcGl4LW1kdHAtMSIsCi0JCQkJICAgICAiY2xrLW0tcGl4LW1kdHAtMiIsCi0JCQkJICAgICAiY2xrLW0tbXBlbHBjIjsKLSAgICAgICAgfTsKKwkJY2xvY2tzID0gPCZjbGtfc3lzaW4+OworCisJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbGstcy1jMC1mczAtY2gwIiwKKwkJCQkgICAgICJjbGstcy1jMC1mczAtY2gxIiwKKwkJCQkgICAgICJjbGstcy1jMC1mczAtY2gyIiwKKwkJCQkgICAgICJjbGstcy1jMC1mczAtY2gzIjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N1bnhpLWNjdS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3VueGktY2N1LnR4dAppbmRleCBjYjkxNTA3Li4zODY4NDU4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3VueGktY2N1LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3VueGktY2N1LnR4dApAQCAtMiw3ICsyLDEwIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogUmVxdWlyZWQgcHJvcGVydGllcyA6Ci0tIGNvbXBhdGlibGU6IG11c3QgY29udGFpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb21wYXRpYmxlOgorLSBjb21wYXRpYmxlOiBtdXN0IGNvbnRhaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgY29tcGF0aWJsZXM6CisJCS0gImFsbHdpbm5lcixzdW42aS1hMzEtY2N1IgorCQktICJhbGx3aW5uZXIsc3VuOGktYTIzLWNjdSIKKwkJLSAiYWxsd2lubmVyLHN1bjhpLWEzMy1jY3UiCiAJCS0gImFsbHdpbm5lcixzdW44aS1oMy1jY3UiCiAKIC0gcmVnOiBNdXN0IGNvbnRhaW4gdGhlIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgYW5kIGxlbmd0aApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3VuaXBoaWVyLWNsb2NrLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay91bmlwaGllci1jbG9jay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxNzlkMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay91bmlwaGllci1jbG9jay50eHQKQEAgLTAsMCArMSwxMzQgQEAKK1VuaVBoaWVyIGNsb2NrIGNvbnRyb2xsZXIKKworCitTeXN0ZW0gY2xvY2sKKy0tLS0tLS0tLS0tLQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgInNvY2lvbmV4dCx1bmlwaGllci1zbGQzLWNsb2NrIiAtIGZvciBzTEQzIFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLWxkNC1jbG9jayIgIC0gZm9yIExENCBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1wcm80LWNsb2NrIiAtIGZvciBQcm80IFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLXNsZDgtY2xvY2siIC0gZm9yIHNMRDggU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItcHJvNS1jbG9jayIgLSBmb3IgUHJvNSBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1weHMyLWNsb2NrIiAtIGZvciBQWHMyL0xENmIgU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItbGQxMS1jbG9jayIgLSBmb3IgTEQxMSBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1sZDIwLWNsb2NrIiAtIGZvciBMRDIwIFNvQy4KKy0gI2Nsb2NrLWNlbGxzOiBzaG91bGQgYmUgMS4KKworRXhhbXBsZToKKworCXN5c2N0cmxANjE4NDAwMDAgeworCQljb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1zeXNjdHJsIiwKKwkJCSAgICAgInNpbXBsZS1tZmQiLCAic3lzY29uIjsKKwkJcmVnID0gPDB4NjE4NDAwMDAgMHg0MDAwPjsKKworCQljbG9jayB7CisJCQljb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1sZDIwLWNsb2NrIjsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJfTsKKworCQlvdGhlciBub2RlcyAuLi4KKwl9OworCitQcm92aWRlZCBjbG9ja3M6CisKKyA4OiBTVCBETUFDCisxMjogR0lPIChHaWdhIGJpdCBzdHJlYW0gSS9PKQorMTQ6IFVTQjMgY2gwIGhvc3QKKzE1OiBVU0IzIGNoMSBob3N0CisxNjogVVNCMyBjaDAgUEhZMAorMTc6IFVTQjMgY2gwIFBIWTEKKzIwOiBVU0IzIGNoMSBQSFkwCisyMTogVVNCMyBjaDEgUEhZMQorCisKK01lZGlhIEkvTyAoTUlPKSBjbG9jaworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IHNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLXNsZDMtbWlvLWNsb2NrIiAtIGZvciBzTEQzIFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLWxkNC1taW8tY2xvY2siICAtIGZvciBMRDQgU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItcHJvNC1taW8tY2xvY2siIC0gZm9yIFBybzQgU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItc2xkOC1taW8tY2xvY2siIC0gZm9yIHNMRDggU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItcHJvNS1taW8tY2xvY2siIC0gZm9yIFBybzUgU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItcHhzMi1taW8tY2xvY2siIC0gZm9yIFBYczIvTEQ2YiBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1sZDExLW1pby1jbG9jayIgLSBmb3IgTEQxMSBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1sZDIwLW1pby1jbG9jayIgLSBmb3IgTEQyMCBTb0MuCistICNjbG9jay1jZWxsczogc2hvdWxkIGJlIDEuCisKK0V4YW1wbGU6CisKKwltaW9jdHJsQDU5ODEwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItbWlvY3RybCIsCisJCQkgICAgICJzaW1wbGUtbWZkIiwgInN5c2NvbiI7CisJCXJlZyA9IDwweDU5ODEwMDAwIDB4ODAwPjsKKworCQljbG9jayB7CisJCQljb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1sZDIwLW1pby1jbG9jayI7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCX07CisKKwkJb3RoZXIgbm9kZXMgLi4uCisJfTsKKworUHJvdmlkZWQgY2xvY2tzOgorCisgMDogU0QgY2gwIGhvc3QKKyAxOiBlTU1DIGhvc3QKKyAyOiBTRCBjaDEgaG9zdAorIDc6IE1JTyBETUFDCisgODogVVNCMiBjaDAgaG9zdAorIDk6IFVTQjIgY2gxIGhvc3QKKzEwOiBVU0IyIGNoMiBob3N0CisxMTogVVNCMiBjaDMgaG9zdAorMTI6IFVTQjIgY2gwIFBIWQorMTM6IFVTQjIgY2gxIFBIWQorMTQ6IFVTQjIgY2gyIFBIWQorMTU6IFVTQjIgY2gzIFBIWQorCisKK1BlcmlwaGVyYWwgY2xvY2sKKy0tLS0tLS0tLS0tLS0tLS0KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICJzb2Npb25leHQsdW5pcGhpZXItc2xkMy1wZXJpLWNsb2NrIiAtIGZvciBzTEQzIFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLWxkNC1wZXJpLWNsb2NrIiAgLSBmb3IgTEQ0IFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLXBybzQtcGVyaS1jbG9jayIgLSBmb3IgUHJvNCBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1zbGQ4LXBlcmktY2xvY2siIC0gZm9yIHNMRDggU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItcHJvNS1wZXJpLWNsb2NrIiAtIGZvciBQcm81IFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLXB4czItcGVyaS1jbG9jayIgLSBmb3IgUFhzMi9MRDZiIFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLWxkMTEtcGVyaS1jbG9jayIgLSBmb3IgTEQxMSBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1sZDIwLXBlcmktY2xvY2siIC0gZm9yIExEMjAgU29DLgorLSAjY2xvY2stY2VsbHM6IHNob3VsZCBiZSAxLgorCitFeGFtcGxlOgorCisJcGVyaWN0cmxANTk4MjAwMDAgeworCQljb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1wZXJpY3RybCIsCisJCQkgICAgICJzaW1wbGUtbWZkIiwgInN5c2NvbiI7CisJCXJlZyA9IDwweDU5ODIwMDAwIDB4MjAwPjsKKworCQljbG9jayB7CisJCQljb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1sZDIwLXBlcmktY2xvY2siOworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQl9OworCisJCW90aGVyIG5vZGVzIC4uLgorCX07CisKK1Byb3ZpZGVkIGNsb2NrczoKKworIDA6IFVBUlQgY2gwCisgMTogVUFSVCBjaDEKKyAyOiBVQVJUIGNoMgorIDM6IFVBUlQgY2gzCisgNDogSTJDIGNoMAorIDU6IEkyQyBjaDEKKyA2OiBJMkMgY2gyCisgNzogSTJDIGNoMworIDg6IEkyQyBjaDQKKyA5OiBJMkMgY2g1CisxMDogSTJDIGNoNgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3hnZW5lLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay94Z2VuZS50eHQKaW5kZXggODJmOTYzOC4uODIzM2U3NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3hnZW5lLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2sveGdlbmUudHh0CkBAIC04LDYgKzgsNyBAQAogLSBjb21wYXRpYmxlIDogc2hhbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CiAJImFwbSx4Z2VuZS1zb2NwbGwtY2xvY2siIC0gZm9yIGEgWC1HZW5lIFNvQyBQTEwgY2xvY2sKIAkiYXBtLHhnZW5lLXBjcHBsbC1jbG9jayIgLSBmb3IgYSBYLUdlbmUgUENQIFBMTCBjbG9jaworCSJhcG0seGdlbmUtcG1kLWNsb2NrIiAtIGZvciBhIFgtR2VuZSBQTUQgY2xvY2sKIAkiYXBtLHhnZW5lLWRldmljZS1jbG9jayIgLSBmb3IgYSBYLUdlbmUgZGV2aWNlIGNsb2NrCiAJImFwbSx4Z2VuZS1zb2NwbGwtdjItY2xvY2siIC0gZm9yIGEgWC1HZW5lIFNvQyBQTEwgdjIgY2xvY2sKIAkiYXBtLHhnZW5lLXBjcHBsbC12Mi1jbG9jayIgLSBmb3IgYSBYLUdlbmUgUENQIFBMTCB2MiBjbG9jawpAQCAtMjIsNiArMjMsMTUgQEAKIE9wdGlvbmFsIHByb3BlcnRpZXMgZm9yIFBMTCBjbG9ja3M6CiAtIGNsb2NrLW5hbWVzIDogc2hhbGwgYmUgdGhlIG5hbWUgb2YgdGhlIFBMTC4gSWYgbWlzc2luZywgdXNlIHRoZSBkZXZpY2UgbmFtZS4KIAorUmVxdWlyZWQgcHJvcGVydGllcyBmb3IgUE1EIGNsb2NrczoKKy0gcmVnIDogc2hhbGwgYmUgdGhlIHBoeXNpY2FsIHJlZ2lzdGVyIGFkZHJlc3MgZm9yIHRoZSBwbWQgY2xvY2suCistIGNsb2NrcyA6IHNoYWxsIGJlIHRoZSBpbnB1dCBwYXJlbnQgY2xvY2sgcGhhbmRsZSBmb3IgdGhlIGNsb2NrLgorLSAjY2xvY2stY2VsbHMgOiBzaGFsbCBiZSBzZXQgdG8gMS4KKy0gY2xvY2stb3V0cHV0LW5hbWVzIDogc2hhbGwgYmUgdGhlIG5hbWUgb2YgdGhlIGNsb2NrIHJlZmVyZW5jZWQgYnkgZGVyaXZlCisgIGNsb2NrLgorT3B0aW9uYWwgcHJvcGVydGllcyBmb3IgUExMIGNsb2NrczoKKy0gY2xvY2stbmFtZXMgOiBzaGFsbCBiZSB0aGUgbmFtZSBvZiB0aGUgY2xvY2suIElmIG1pc3NpbmcsIHVzZSB0aGUgZGV2aWNlIG5hbWUuCisKIFJlcXVpcmVkIHByb3BlcnRpZXMgZm9yIGRldmljZSBjbG9ja3M6CiAtIHJlZyA6IHNoYWxsIGJlIGEgbGlzdCBvZiBhZGRyZXNzIGFuZCBsZW5ndGggcGFpcnMgZGVzY3JpYmluZyB0aGUgQ1NSCiAgICAgICAgICByZXNldCBhbmQvb3IgdGhlIGRpdmlkZXIuIEVpdGhlciBtYXkgYmUgb21pdHRlZCwgYnV0IGF0IGxlYXN0CkBAIC01OSw2ICs2OSwxNCBAQAogCQl0eXBlID0gPDA+OwogCX07CiAKKwlwbWQwY2xrOiBwbWQwY2xrQDdlMjAwMjAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtcG1kLWNsb2NrIjsKKwkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQljbG9ja3MgPSA8JnBtZHBsbCAwPjsKKwkJcmVnID0gPDB4MCAweDdlMjAwMjAwIDB4MCAweDEwPjsKKwkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBtZDBjbGsiOworCX07CisKIAlzb2NwbGw6IHNvY3BsbEAxNzAwMDEyMCB7CiAJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLXNvY3BsbC1jbG9jayI7CiAJCSNjbG9jay1jZWxscyA9IDwxPjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay96eDI5NjcxOC1jbGsudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3p4Mjk2NzE4LWNsay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxOGI3YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay96eDI5NjcxOC1jbGsudHh0CkBAIC0wLDAgKzEsMzUgQEAKK0RldmljZSBUcmVlIENsb2NrIGJpbmRpbmdzIGZvciBaVEUgengyOTY3MTgKKworVGhpcyBiaW5kaW5nIHVzZXMgdGhlIGNvbW1vbiBjbG9jayBiaW5kaW5nWzFdLgorCitbMV0gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2Nsb2NrLWJpbmRpbmdzLnR4dAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogc2hhbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJInp0ZSx6eDI5NjcxOC10b3Bjcm0iOgorCQl6eDI5NjcxOCB0b3AgY2xvY2sgc2VsZWN0aW9uLCBkaXZpZGVyIGFuZCBnYXRpbmcKKworCSJ6dGUsengyOTY3MTgtbHNwMGNybSIgYW5kCisJInp0ZSx6eDI5NjcxOC1sc3AxY3JtIjoKKwkJengyOTY3MTggZGV2aWNlIGxldmVsIGNsb2NrIHNlbGVjdGlvbiBhbmQgZ2F0aW5nCisKKy0gcmVnOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldAorCitUaGUgY2xvY2sgY29uc3VtZXIgc2hvdWxkIHNwZWNpZnkgdGhlIGRlc2lyZWQgY2xvY2sgYnkgaGF2aW5nIHRoZSBjbG9jaworSUQgaW4gaXRzICJjbG9ja3MiIHBoYW5kbGUgY2VsbC4gU2VlIGluY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svengyOTY3MTgtY2xvY2suaAorZm9yIHRoZSBmdWxsIGxpc3Qgb2YgengyOTY3MTggY2xvY2sgSURzLgorCisKK3RvcGNsazogdG9wY3JtQDE0NjEwMDAgeworICAgICAgICBjb21wYXRpYmxlID0gInp0ZSx6eDI5NjcxOC10b3Bjcm0tY2xrIjsKKyAgICAgICAgcmVnID0gPDB4MDE0NjEwMDAgMHgxMDAwPjsKKyAgICAgICAgI2Nsb2NrLWNlbGxzID0gPDE+OworfTsKKwordXNicGh5MDp1c2ItcGh5MCB7CisJY29tcGF0aWJsZSA9ICJ6dGUsengyOTY3MTgtdXNiLXBoeSI7CisJI3BoeS1jZWxscyA9IDwwPjsKKwljbG9ja3MgPSA8JnRvcGNsayBVU0IyMF9QSFlfQ0xLPjsKKwljbG9jay1uYW1lcyA9ICJwaHljbGsiOworCXN0YXR1cyA9ICJva2F5IjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZGV2ZnJlcS9ldmVudC9yb2NrY2hpcC1kZmkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RldmZyZXEvZXZlbnQvcm9ja2NoaXAtZGZpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjIzMzEzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RldmZyZXEvZXZlbnQvcm9ja2NoaXAtZGZpLnR4dApAQCAtMCwwICsxLDE5IEBACisKKyogUm9ja2NoaXAgcmszMzk5IERGSSBkZXZpY2UKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogTXVzdCBiZSAicm9ja2NoaXAscmszMzk5LWRmaSIuCistIHJlZzogcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIGVhY2ggREZJIGFuZCBsZW5ndGggb2YgbWVtb3J5IG1hcHBlZCByZWdpb24KKy0gcm9ja2NoaXAscG11OiBwaGFuZGxlIHRvIHRoZSBzeXNjb24gbWFuYWdpbmcgdGhlICJwbXUgZ2VuZXJhbCByZWdpc3RlciBmaWxlcyIKKy0gY2xvY2tzOiBwaGFuZGxlcyBmb3IgY2xvY2sgc3BlY2lmaWVkIGluICJjbG9jay1uYW1lcyIgcHJvcGVydHkKKy0gY2xvY2stbmFtZXMgOiB0aGUgbmFtZSBvZiBjbG9jayB1c2VkIGJ5IHRoZSBERkksIG11c3QgYmUgInBjbGtfZGRyX21vbiI7CisKK0V4YW1wbGU6CisJZGZpOiBkZmlAMHhmZjYzMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LWRmaSI7CisJCXJlZyA9IDwweDAwIDB4ZmY2MzAwMDAgMHgwMCAweDQwMDA+OworCQlyb2NrY2hpcCxwbXUgPSA8JnBtdWdyZj47CisJCWNsb2NrcyA9IDwmY3J1IFBDTEtfRERSX01PTj47CisJCWNsb2NrLW5hbWVzID0gInBjbGtfZGRyX21vbiI7CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kZXZmcmVxL3JrMzM5OV9kbWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RldmZyZXEvcmszMzk5X2RtYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5ZTg2MAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kZXZmcmVxL3JrMzM5OV9kbWMudHh0CkBAIC0wLDAgKzEsMjA5IEBACisqIFJvY2tjaGlwIHJrMzM5OSBETUMoRHluYW1pYyBNZW1vcnkgQ29udHJvbGxlcikgZGV2aWNlCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6CQkgTXVzdCBiZSAicm9ja2NoaXAscmszMzk5LWRtYyIuCistIGRldmZyZXEtZXZlbnRzOgkgTm9kZSB0byBnZXQgRERSIGxvYWRpbmcsIFJlZmVyIHRvCisJCQkgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RldmZyZXEvCisJCQkgcm9ja2NoaXAtZGZpLnR4dAorLSBpbnRlcnJ1cHRzOgkJIFRoZSBpbnRlcnJ1cHQgbnVtYmVyIHRvIHRoZSBDUFUuIFRoZSBpbnRlcnJ1cHQKKwkJCSBzcGVjaWZpZXIgZm9ybWF0IGRlcGVuZHMgb24gdGhlIGludGVycnVwdCBjb250cm9sbGVyLgorCQkJIEl0IHNob3VsZCBiZSBEQ0YgaW50ZXJydXB0cywgd2hlbiBERFIgZHZmcyBmaW5pc2gsCisJCQkgaXQgd2lsbCBoYXBwZW4uCistIGNsb2NrczoJCSBQaGFuZGxlcyBmb3IgY2xvY2sgc3BlY2lmaWVkIGluICJjbG9jay1uYW1lcyIgcHJvcGVydHkKKy0gY2xvY2stbmFtZXMgOgkJIFRoZSBuYW1lIG9mIGNsb2NrIHVzZWQgYnkgdGhlIERGSSwgbXVzdCBiZQorCQkJICJwY2xrX2Rkcl9tb24iOworLSBvcGVyYXRpbmctcG9pbnRzLXYyOgkgUmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL29wcC50eHQKKwkJCSBmb3IgZGV0YWlscy4KKy0gY2VudGVyLXN1cHBseToJIERNQyBzdXBwbHkgbm9kZS4KKy0gc3RhdHVzOgkJIE1hcmtzIHRoZSBub2RlIGVuYWJsZWQvZGlzYWJsZWQuCisKK0ZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBkZHIgdGltaW5nOgorCistIHJvY2tjaGlwLGRyYW1fc3BlZWRfYmluIDoJICBWYWx1ZSByZWZlcmVuY2UgaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9kZHIuaCwKKwkJCQkgIGl0IHNlbGVjdCBkZHIzIGNsLXRycC10cmNkIHR5cGUsIGRlZmF1bHQgdmFsdWUKKwkJCQkgICJERFIzX0RFRkFVTFQiLml0IG11c3Qgc2VsZWN0ZWQgYWNjb3JkaW5nIHRvCisJCQkJICAiU3BlZWQgQmluIiBpbiBkZHIzIGRhdGFzaGVldCwgRE8gTk9UIHVzZQorCQkJCSAgc21hbGxlciAiU3BlZWQgQmluIiB0aGFuIGRkcjMgZXhhY3RseSBpcy4KKworLSByb2NrY2hpcCxwZF9pZGxlIDoJCSAgQ29uZmlnIHRoZSBQRF9JRExFIHZhbHVlLCBkZWZpbmVkIHRoZSBwb3dlci1kb3duCisJCQkJICBpZGxlIHBlcmlvZCwgbWVtb3JpZXMgYXJlIHBsYWNlcyBpbnRvIHBvd2VyLWRvd24KKwkJCQkgIG1vZGUgaWYgYnVzIGlzIGlkbGUgZm9yIFBEX0lETEUgREZJIGNsb2Nrcy4KKworLSByb2NrY2hpcCxzcl9pZGxlIDoJCSAgQ29uZmlndXJlIHRoZSBTUl9JRExFIHZhbHVlLCBkZWZpbmVkIHRoZQorCQkJCSAgc2VsZnJlZnJlc2ggaWRsZSBwZXJpb2QsIG1lbW9yaWVzIGFyZSBwbGFjZXMKKwkJCQkgIGludG8gc2VsZi1yZWZyZXNoIG1vZGUgaWYgYnVzIGlzIGlkbGUgZm9yCisJCQkJICBTUl9JRExFKjEwMjQgREZJIGNsb2NrcyAoREZJIGNsb2NrcyBmcmVxIGlzCisJCQkJICBoYWxmIG9mIGRyYW0ncyBjbG9ja3MpLCBkZWZhdWxlIHZhbHVlIGlzICIwIi4KKworLSByb2NrY2hpcCxzcl9tY19nYXRlX2lkbGUgOgkgIERlZmluZWQgdGhlIHNlbGYtcmVmcmVzaCB3aXRoIG1lbW9yeSBhbmQKKwkJCQkgIGNvbnRyb2xsZXIgY2xvY2sgZ2F0aW5nIGlkbGUgcGVyaW9kLCBtZW1vcmllcworCQkJCSAgYXJlIHBsYWNlcyBpbnRvIHNlbGYtcmVmcmVzaCBtb2RlIGFuZCBtZW1vcnkKKwkJCQkgIGNvbnRyb2xsZXIgY2xvY2sgYXJnIGdhdGluZyBpZiBidXMgaXMgaWRsZSBmb3IKKwkJCQkgIHNyX21jX2dhdGVfaWRsZSoxMDI0IERGSSBjbG9ja3MuCisKKy0gcm9ja2NoaXAsc3JwZF9saXRlX2lkbGUgOgkgIERlZmluZWQgdGhlIHNlbGYtcmVmcmVzaCBwb3dlciBkb3duIGlkbGUKKwkJCQkgIHBlcmlvZCwgbWVtb3JpZXMgYXJlIHBsYWNlcyBpbnRvIHNlbGYtcmVmcmVzaAorCQkJCSAgcG93ZXIgZG93biBtb2RlIGlmIGJ1cyBpcyBpZGxlIGZvcgorCQkJCSAgc3JwZF9saXRlX2lkbGUqMTAyNCBERkkgY2xvY2tzLiBUaGlzIHBhcmFtZXRlcgorCQkJCSAgaXMgZm9yIExQRERSNCBvbmx5LgorCistIHJvY2tjaGlwLHN0YW5kYnlfaWRsZSA6CSAgRGVmaW5lZCB0aGUgc3RhbmRieSBpZGxlIHBlcmlvZCwgbWVtb3JpZXMgYXJlCisJCQkJICBwbGFjZXMgaW50byBzZWxmLXJlZnJlc2ggdGhhbiBjb250cm9sbGVyLCBwaSwKKwkJCQkgIHBoeSBhbmQgZHJhbSBjbG9jayB3aWxsIGdhdGluZyBpZiBidXMgaXMgaWRsZQorCQkJCSAgZm9yIHN0YW5kYnlfaWRsZSAqIERGSSBjbG9ja3MuCisKKy0gcm9ja2NoaXAsZHJhbV9kbGxfZGlzYl9mcmVxIDogIEl0J3MgZGVmaW5lZCB0aGUgRERSMyBkbGwgYnlwYXNzIGZyZXF1ZW5jeSBpbgorCQkJCSAgTUh6LCB3aGVuIGRkciBmcmVxIGxlc3MgdGhhbiBEUkFNX0RMTF9ESVNCX0ZSRVEsCisJCQkJICBkZHIzIGRsbCB3aWxsIGJ5cHNzZWQgbm90ZTogaWYgZGxsIHdhcyBieXBhc3NlZCwKKwkJCQkgIHRoZSBvZHQgYWxzbyBzdG9wIHdvcmtpbmcuCisKKy0gcm9ja2NoaXAscGh5X2RsbF9kaXNiX2ZyZXEgOgkgIERlZmluZWQgdGhlIFBIWSBkbGwgYnlwYXNzIGZyZXF1ZW5jeSBpbgorCQkJCSAgTUh6IChNZWdhIEh6KSwgd2hlbiBkZHIgZnJlcSBsZXNzIHRoYW4KKwkJCQkgIERSQU1fRExMX0RJU0JfRlJFUSwgcGh5IGRsbCB3aWxsIGJ5cHNzZWQuCisJCQkJICBub3RlOiBwaHkgZGxsIGFuZCBwaHkgb2R0IGFyZSBpbmRlcGVuZGVudC4KKworLSByb2NrY2hpcCxkZHIzX29kdF9kaXNiX2ZyZXEgOiAgV2hlbiBkcmFtIHR5cGUgaXMgRERSMywgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lZAorCQkJCSAgdGhlIG9kdCBkaXNhYmxlIGZyZXF1ZW5jeSBpbiBNSHogKE1lZ2EgSHopLAorCQkJCSAgd2hlbiBkZHIgZnJlcXVlbmN5IGxlc3MgdGhlbiBkZHIzX29kdF9kaXNiX2ZyZXEsCisJCQkJICB0aGUgb2R0IG9uIGRyYW0gc2lkZSBhbmQgY29udHJvbGxlciBzaWRlIGFyZQorCQkJCSAgYm90aCBkaXNhYmxlZC4KKworLSByb2NrY2hpcCxkZHIzX2RydiA6CQkgIFdoZW4gZHJhbSB0eXBlIGlzIEREUjMsIHRoaXMgcGFyYW1ldGVyIGRlZmluZQorCQkJCSAgdGhlIGRyYW0gc2lkZSBkcml2ZXIgc3Rlbmd0aCBpbiBvaG0sIGRlZmF1bHQKKwkJCQkgIHZhbHVlIGlzIEREUjNfRFNfNDBvaG0uCisKKy0gcm9ja2NoaXAsZGRyM19vZHQgOgkJICBXaGVuIGRyYW0gdHlwZSBpcyBERFIzLCB0aGlzIHBhcmFtZXRlciBkZWZpbmUKKwkJCQkgIHRoZSBkcmFtIHNpZGUgT0RUIHN0ZW5ndGggaW4gb2htLCBkZWZhdWx0IHZhbHVlCisJCQkJICBpcyBERFIzX09EVF8xMjBvaG0uCisKKy0gcm9ja2NoaXAscGh5X2RkcjNfY2FfZHJ2IDoJICBXaGVuIGRyYW0gdHlwZSBpcyBERFIzLCB0aGlzIHBhcmFtZXRlciBkZWZpbmUKKwkJCQkgIHRoZSBwaHkgc2lkZSBDQSBsaW5lKGluY2x1aW5nIGNvbW1hbmQgbGluZSwKKwkJCQkgIGFkZHJlc3MgbGluZSBhbmQgY2xvY2sgbGluZSkgZHJpdmVyIHN0cmVuZ3RoLgorCQkJCSAgRGVmYXVsdCB2YWx1ZSBpcyBQSFlfRFJWX09EVF80MC4KKworLSByb2NrY2hpcCxwaHlfZGRyM19kcV9kcnYgOgkgIFdoZW4gZHJhbSB0eXBlIGlzIEREUjMsIHRoaXMgcGFyYW1ldGVyIGRlZmluZQorCQkJCSAgdGhlIHBoeSBzaWRlIERRIGxpbmUoaW5jbHVpbmcgRFFTL0RRL0RNIGxpbmUpCisJCQkJICBkcml2ZXIgc3RyZW5ndGguIGRlZmF1bHQgdmFsdWUgaXMgUEhZX0RSVl9PRFRfNDAuCisKKy0gcm9ja2NoaXAscGh5X2RkcjNfb2R0IDogCSAgV2hlbiBkcmFtIHR5cGUgaXMgRERSMywgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lIHRoZQorCQkJCSAgcGh5IHNpZGUgb2R0IHN0cmVuZ3RoLCBkZWZhdWx0IHZhbHVlIGlzCisJCQkJICBQSFlfRFJWX09EVF8yNDAuCisKKy0gcm9ja2NoaXAsbHBkZHIzX29kdF9kaXNiX2ZyZXEgOiBXaGVuIGRyYW0gdHlwZSBpcyBMUEREUjMsIHRoaXMgcGFyYW1ldGVyIGRlZmluZWQKKwkJCQkgIHRoZW4gb2R0IGRpc2FibGUgZnJlcXVlbmN5IGluIE1IeiAoTWVnYSBIeiksCisJCQkJICB3aGVuIGRkciBmcmVxdWVuY3kgbGVzcyB0aGVuIGRkcjNfb2R0X2Rpc2JfZnJlcSwKKwkJCQkgIHRoZSBvZHQgb24gZHJhbSBzaWRlIGFuZCBjb250cm9sbGVyIHNpZGUgYXJlCisJCQkJICBib3RoIGRpc2FibGVkLgorCistIHJvY2tjaGlwLGxwZGRyM19kcnYgOgkgIFdoZW4gZHJhbSB0eXBlIGlzIExQRERSMywgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgZHJhbSBzaWRlIGRyaXZlciBzdGVuZ3RoIGluIG9obSwgZGVmYXVsdAorCQkJCSAgdmFsdWUgaXMgTFAzX0RTXzM0b2htLgorCistIHJvY2tjaGlwLGxwZGRyM19vZHQgOgkgIFdoZW4gZHJhbSB0eXBlIGlzIExQRERSMywgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgZHJhbSBzaWRlIE9EVCBzdGVuZ3RoIGluIG9obSwgZGVmYXVsdCB2YWx1ZQorCQkJCSAgaXMgTFAzX09EVF8yNDBvaG0uCisKKy0gcm9ja2NoaXAscGh5X2xwZGRyM19jYV9kcnYgOgkgIFdoZW4gZHJhbSB0eXBlIGlzIExQRERSMywgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgcGh5IHNpZGUgQ0EgbGluZShpbmNsdWluZyBjb21tYW5kIGxpbmUsCisJCQkJICBhZGRyZXNzIGxpbmUgYW5kIGNsb2NrIGxpbmUpIGRyaXZlciBzdHJlbmd0aC4KKwkJCQkgIGRlZmF1bHQgdmFsdWUgaXMgUEhZX0RSVl9PRFRfNDAuCisKKy0gcm9ja2NoaXAscGh5X2xwZGRyM19kcV9kcnYgOgkgIFdoZW4gZHJhbSB0eXBlIGlzIExQRERSMywgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgcGh5IHNpZGUgRFEgbGluZShpbmNsdWluZyBEUVMvRFEvRE0gbGluZSkKKwkJCQkgIGRyaXZlciBzdHJlbmd0aC4gZGVmYXVsdCB2YWx1ZSBpcworCQkJCSAgUEhZX0RSVl9PRFRfNDAuCisKKy0gcm9ja2NoaXAscGh5X2xwZGRyM19vZHQgOiAJICBXaGVuIGRyYW0gdHlwZSBpcyBMUEREUjMsIHRoaXMgcGFyYW1ldGVyIGRlZmluZQorCQkJCSAgdGhlIHBoeSBzaWRlIG9kdCBzdHJlbmd0aCwgZGVmYXVsdCB2YWx1ZSBpcworCQkJCSAgUEhZX0RSVl9PRFRfMjQwLgorCistIHJvY2tjaGlwLGxwZGRyNF9vZHRfZGlzYl9mcmVxIDogV2hlbiBkcmFtIHR5cGUgaXMgTFBERFI0LCB0aGlzIHBhcmFtZXRlcgorCQkJCSAgZGVmaW5lZCB0aGUgb2R0IGRpc2FibGUgZnJlcXVlbmN5IGluCisJCQkJICBNSHogKE1lZ2EgSHopLCB3aGVuIGRkciBmcmVxdWVuY3kgbGVzcyB0aGVuCisJCQkJICBkZHIzX29kdF9kaXNiX2ZyZXEsIHRoZSBvZHQgb24gZHJhbSBzaWRlIGFuZAorCQkJCSAgY29udHJvbGxlciBzaWRlIGFyZSBib3RoIGRpc2FibGVkLgorCistIHJvY2tjaGlwLGxwZGRyNF9kcnYgOgkgIFdoZW4gZHJhbSB0eXBlIGlzIExQRERSNCwgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgZHJhbSBzaWRlIGRyaXZlciBzdGVuZ3RoIGluIG9obSwgZGVmYXVsdAorCQkJCSAgdmFsdWUgaXMgTFA0X1BERFNfNjBvaG0uCisKKy0gcm9ja2NoaXAsbHBkZHI0X2RxX29kdCA6IAkgIFdoZW4gZHJhbSB0eXBlIGlzIExQRERSNCwgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgZHJhbSBzaWRlIE9EVCBvbiBkcXMvZHEgbGluZSBzdGVuZ3RoIGluIG9obSwKKwkJCQkgIGRlZmF1bHQgdmFsdWUgaXMgTFA0X0RRX09EVF80MG9obS4KKworLSByb2NrY2hpcCxscGRkcjRfY2Ffb2R0IDoJICBXaGVuIGRyYW0gdHlwZSBpcyBMUEREUjQsIHRoaXMgcGFyYW1ldGVyIGRlZmluZQorCQkJCSAgdGhlIGRyYW0gc2lkZSBPRFQgb24gY2EgbGluZSBzdGVuZ3RoIGluIG9obSwKKwkJCQkgIGRlZmF1bHQgdmFsdWUgaXMgTFA0X0NBX09EVF80MG9obS4KKworLSByb2NrY2hpcCxwaHlfbHBkZHI0X2NhX2RydiA6CSAgV2hlbiBkcmFtIHR5cGUgaXMgTFBERFI0LCB0aGlzIHBhcmFtZXRlciBkZWZpbmUKKwkJCQkgIHRoZSBwaHkgc2lkZSAgQ0EgbGluZShpbmNsdWluZyBjb21tYW5kIGFkZHJlc3MKKwkJCQkgIGxpbmUpIGRyaXZlciBzdHJlbmd0aC4gZGVmYXVsdCB2YWx1ZSBpcworCQkJCSAgUEhZX0RSVl9PRFRfNDAuCisKKy0gcm9ja2NoaXAscGh5X2xwZGRyNF9ja19jc19kcnYgOiBXaGVuIGRyYW0gdHlwZSBpcyBMUEREUjQsIHRoaXMgcGFyYW1ldGVyIGRlZmluZQorCQkJCSAgdGhlIHBoeSBzaWRlIGNsb2NrIGxpbmUgYW5kIGNzIGxpbmUgZHJpdmVyCisJCQkJICBzdHJlbmd0aC4gZGVmYXVsdCB2YWx1ZSBpcyBQSFlfRFJWX09EVF84MC4KKworLSByb2NrY2hpcCxwaHlfbHBkZHI0X2RxX2RydiA6CSAgV2hlbiBkcmFtIHR5cGUgaXMgTFBERFI0LCB0aGlzIHBhcmFtZXRlciBkZWZpbmUKKwkJCQkgIHRoZSBwaHkgc2lkZSBEUSBsaW5lKGluY2x1aW5nIERRUy9EUS9ETSBsaW5lKQorCQkJCSAgZHJpdmVyIHN0cmVuZ3RoLiBkZWZhdWx0IHZhbHVlIGlzIFBIWV9EUlZfT0RUXzgwLgorCistIHJvY2tjaGlwLHBoeV9scGRkcjRfb2R0IDoJICBXaGVuIGRyYW0gdHlwZSBpcyBMUEREUjQsIHRoaXMgcGFyYW1ldGVyIGRlZmluZQorCQkJCSAgdGhlIHBoeSBzaWRlIG9kdCBzdHJlbmd0aCwgZGVmYXVsdCB2YWx1ZSBpcworCQkJCSAgUEhZX0RSVl9PRFRfNjAuCisKK0V4YW1wbGU6CisJZG1jX29wcF90YWJsZTogZG1jX29wcF90YWJsZSB7CisJCWNvbXBhdGlibGUgPSAib3BlcmF0aW5nLXBvaW50cy12MiI7CisKKwkJb3BwMDAgeworCQkJb3BwLWh6ID0gL2JpdHMvIDY0IDwzMDAwMDAwMDA+OworCQkJb3BwLW1pY3Jvdm9sdCA9IDw5MDAwMDA+OworCQl9OworCQlvcHAwMSB7CisJCQlvcHAtaHogPSAvYml0cy8gNjQgPDY2NjAwMDAwMD47CisJCQlvcHAtbWljcm92b2x0ID0gPDkwMDAwMD47CisJCX07CisJfTsKKworCWRtYzogZG1jIHsKKwkJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktZG1jIjsKKwkJZGV2ZnJlcS1ldmVudHMgPSA8JmRmaT47CisJCWludGVycnVwdHMgPSA8R0lDX1NQSSAxIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQljbG9ja3MgPSA8JmNydSBTQ0xLX0REUkNMSz47CisJCWNsb2NrLW5hbWVzID0gImRtY19jbGsiOworCQlvcGVyYXRpbmctcG9pbnRzLXYyID0gPCZkbWNfb3BwX3RhYmxlPjsKKwkJY2VudGVyLXN1cHBseSA9IDwmcHB2YXJfY2VudGVybG9naWM+OworCQl1cHRocmVzaG9sZCA9IDwxNT47CisJCWRvd25kaWZmZXJlbnRpYWwgPSA8MTA+OworCQlyb2NrY2hpcCxkZHIzX3NwZWVkX2JpbiA9IDwyMT47CisJCXJvY2tjaGlwLHBkX2lkbGUgPSA8MHg0MD47CisJCXJvY2tjaGlwLHNyX2lkbGUgPSA8MHgyPjsKKwkJcm9ja2NoaXAsc3JfbWNfZ2F0ZV9pZGxlID0gPDB4Mz47CisJCXJvY2tjaGlwLHNycGRfbGl0ZV9pZGxlCT0gPDB4ND47CisJCXJvY2tjaGlwLHN0YW5kYnlfaWRsZSA9IDwweDIwMDA+OworCQlyb2NrY2hpcCxkcmFtX2RsbF9kaXNfZnJlcSA9IDwzMDA+OworCQlyb2NrY2hpcCxwaHlfZGxsX2Rpc19mcmVxID0gPDEyNT47CisJCXJvY2tjaGlwLGF1dG9fcGRfZGlzX2ZyZXEgPSA8NjY2PjsKKwkJcm9ja2NoaXAsZGRyM19vZHRfZGlzX2ZyZXEgPSA8MzMzPjsKKwkJcm9ja2NoaXAsZGRyM19kcnYgPSA8RERSM19EU180MG9obT47CisJCXJvY2tjaGlwLGRkcjNfb2R0ID0gPEREUjNfT0RUXzEyMG9obT47CisJCXJvY2tjaGlwLHBoeV9kZHIzX2NhX2RydiA9IDxQSFlfRFJWX09EVF80MD47CisJCXJvY2tjaGlwLHBoeV9kZHIzX2RxX2RydiA9IDxQSFlfRFJWX09EVF80MD47CisJCXJvY2tjaGlwLHBoeV9kZHIzX29kdCA9IDxQSFlfRFJWX09EVF8yNDA+OworCQlyb2NrY2hpcCxscGRkcjNfb2R0X2Rpc19mcmVxID0gPDMzMz47CisJCXJvY2tjaGlwLGxwZGRyM19kcnYgPSA8TFAzX0RTXzM0b2htPjsKKwkJcm9ja2NoaXAsbHBkZHIzX29kdCA9IDxMUDNfT0RUXzI0MG9obT47CisJCXJvY2tjaGlwLHBoeV9scGRkcjNfY2FfZHJ2ID0gPFBIWV9EUlZfT0RUXzQwPjsKKwkJcm9ja2NoaXAscGh5X2xwZGRyM19kcV9kcnYgPSA8UEhZX0RSVl9PRFRfNDA+OworCQlyb2NrY2hpcCxwaHlfbHBkZHIzX29kdCA9IDxQSFlfRFJWX09EVF8yNDA+OworCQlyb2NrY2hpcCxscGRkcjRfb2R0X2Rpc19mcmVxID0gPDMzMz47CisJCXJvY2tjaGlwLGxwZGRyNF9kcnYgPSA8TFA0X1BERFNfNjBvaG0+OworCQlyb2NrY2hpcCxscGRkcjRfZHFfb2R0ID0gPExQNF9EUV9PRFRfNDBvaG0+OworCQlyb2NrY2hpcCxscGRkcjRfY2Ffb2R0ID0gPExQNF9DQV9PRFRfNDBvaG0+OworCQlyb2NrY2hpcCxwaHlfbHBkZHI0X2NhX2RydiA9IDxQSFlfRFJWX09EVF80MD47CisJCXJvY2tjaGlwLHBoeV9scGRkcjRfY2tfY3NfZHJ2ID0gPFBIWV9EUlZfT0RUXzgwPjsKKwkJcm9ja2NoaXAscGh5X2xwZGRyNF9kcV9kcnYgPSA8UEhZX0RSVl9PRFRfODA+OworCQlyb2NrY2hpcCxwaHlfbHBkZHI0X29kdCA9IDxQSFlfRFJWX09EVF82MD47CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9leHRjb24vcWNvbSxwbTg5NDEtbWlzYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZXh0Y29uL3Fjb20scG04OTQxLW1pc2MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MzgzYWRiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2V4dGNvbi9xY29tLHBtODk0MS1taXNjLnR4dApAQCAtMCwwICsxLDQxIEBACitRdWFsY29tbSdzIFBNODk0MSBVU0IgSUQgRXh0Y29uIGRldmljZQorCitTb21lIFF1YWxjb21tIFBNSUNzIGhhdmUgYSAibWlzYyIgbW9kdWxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IHdoZW4KK3RoZSBVU0IgSUQgcGluIGhhcyBiZWVuIHB1bGxlZCBsb3cgb3IgaGlnaC4KKworUFJPUEVSVElFUworCistIGNvbXBhdGlibGU6CisgICAgVXNhZ2U6IHJlcXVpcmVkCisgICAgVmFsdWUgdHlwZTogPHN0cmluZz4KKyAgICBEZWZpbml0aW9uOiBTaG91bGQgY29udGFpbiAicWNvbSxwbTg5NDEtbWlzYyI7CisKKy0gcmVnOgorICAgIFVzYWdlOiByZXF1aXJlZAorICAgIFZhbHVlIHR5cGU6IDx1MzI+CisgICAgRGVmaW5pdGlvbjogU2hvdWxkIGNvbnRhaW4gdGhlIG9mZnNldCB0byB0aGUgbWlzYyBhZGRyZXNzIHNwYWNlCisKKy0gaW50ZXJydXB0czoKKyAgICBVc2FnZTogcmVxdWlyZWQKKyAgICBWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorICAgIERlZmluaXRpb246IFNob3VsZCBjb250YWluIHRoZSB1c2IgaWQgaW50ZXJydXB0CisKKy0gaW50ZXJydXB0LW5hbWVzOgorICAgIFVzYWdlOiByZXF1aXJlZAorICAgIFZhbHVlIHR5cGU6IDxzdHJpbmdsaXN0PgorICAgIERlZmluaXRpb246IFNob3VsZCBjb250YWluIHRoZSBzdHJpbmcgInVzYl9pZCIgZm9yIHRoZSB1c2IgaWQgaW50ZXJydXB0CisKK0V4YW1wbGU6CisKKwlwbWljIHsKKwkJdXNiX2lkOiBtaXNjQDkwMCB7CisJCQljb21wYXRpYmxlID0gInFjb20scG04OTQxLW1pc2MiOworCQkJcmVnID0gPDB4OTAwPjsKKwkJCWludGVycnVwdHMgPSA8MHgwIDB4OSAwIElSUV9UWVBFX0VER0VfQk9USD47CisJCQlpbnRlcnJ1cHQtbmFtZXMgPSAidXNiX2lkIjsKKwkJfTsKKwl9CisKKwl1c2ItY29udHJvbGxlciB7CisJCWV4dGNvbiA9IDwmdXNiX2lkPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vYnJjbSxiY202MzQ1LWdwaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vYnJjbSxiY202MzQ1LWdwaW8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ODUzMTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9icmNtLGJjbTYzNDUtZ3Bpby50eHQKQEAgLTAsMCArMSw0NiBAQAorQmluZGluZ3MgZm9yIHRoZSBCcm9hZGNvbSdzIGJyY20sYmNtNjM0NS1ncGlvIG1lbW9yeS1tYXBwZWQgR1BJTyBjb250cm9sbGVycy4KKworVGhlc2UgYmluZGluZ3MgY2FuIGJlIHVzZWQgb24gYW55IEJDTTYzeHggU29DLiBIb3dldmVyLCBCQ002MzM4IGFuZCBCQ002MzQ1CithcmUgdGhlIG9ubHkgb25lcyB3aGljaCBkb24ndCBuZWVkIGEgcGluY3RybCBkcml2ZXIuCitCQ002MzM4IGhhdmUgOC1iaXQgZGF0YSBhbmQgZGlyb3V0IHJlZ2lzdGVycywgd2hlcmUgR1BJTyBzdGF0ZSBjYW4gYmUgcmVhZAorYW5kL29yIHdyaXR0ZW4sIGFuZCB0aGUgZGlyZWN0aW9uIGNoYW5nZWQgZnJvbSBpbnB1dCB0byBvdXRwdXQuCitCQ002MzQ1IGhhdmUgMTYtYml0IGRhdGEgYW5kIGRpcm91dCByZWdpc3RlcnMsIHdoZXJlIEdQSU8gc3RhdGUgY2FuIGJlIHJlYWQKK2FuZC9vciB3cml0dGVuLCBhbmQgdGhlIGRpcmVjdGlvbiBjaGFuZ2VkIGZyb20gaW5wdXQgdG8gb3V0cHV0LgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCS0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJicmNtLGJjbTYzNDUtZ3BpbyIKKwktIHJlZy1uYW1lczogbXVzdCBjb250YWluCisJCSJkYXQiIC0gZGF0YSByZWdpc3RlcgorCQkiZGlyb3V0IiAtIGRpcmVjdGlvbiAob3V0cHV0KSByZWdpc3RlcgorCS0gcmVnOiBhZGRyZXNzICsgc2l6ZSBwYWlycyBkZXNjcmliaW5nIHRoZSBHUElPIHJlZ2lzdGVyIHNldHM7CisJCW9yZGVyIG11c3QgY29ycmVzcG9uZCB3aXRoIHRoZSBvcmRlciBvZiBlbnRyaWVzIGluIHJlZy1uYW1lcworCS0gI2dwaW8tY2VsbHM6IG11c3QgYmUgc2V0IHRvIDIuIFRoZSBmaXJzdCBjZWxsIGlzIHRoZSBwaW4gbnVtYmVyIGFuZAorCQkJdGhlIHNlY29uZCBjZWxsIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZ3BpbyBwb2xhcml0eToKKwkJCTAgPSBhY3RpdmUgaGlnaAorCQkJMSA9IGFjdGl2ZSBsb3cKKwktIGdwaW8tY29udHJvbGxlcjogTWFya3MgdGhlIGRldmljZSBub2RlIGFzIGEgZ3BpbyBjb250cm9sbGVyLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCS0gbmF0aXZlLWVuZGlhbjogdXNlIG5hdGl2ZSBlbmRpYW4gbWVtb3J5LgorCitFeGFtcGxlczoKKwktIEJDTTYzMzg6CisJZ3BpbzogZ3Bpby1jb250cm9sbGVyQGZmZmUwNDA3IHsKKwkJY29tcGF0aWJsZSA9ICJicmNtLGJjbTYzNDUtZ3BpbyI7CisJCXJlZy1uYW1lcyA9ICJkaXJvdXQiLCAiZGF0IjsKKwkJcmVnID0gPDB4ZmZmZTA0MDcgMT4sIDwweGZmZmUwNDBmIDE+OworCisJCSNncGlvLWNlbGxzID0gPDI+OworCQlncGlvLWNvbnRyb2xsZXI7CisJfTsKKworCS0gQkNNNjM0NToKKwlncGlvOiBncGlvLWNvbnRyb2xsZXJAZmZmZTA0MDYgeworCQljb21wYXRpYmxlID0gImJyY20sYmNtNjM0NS1ncGlvIjsKKwkJcmVnLW5hbWVzID0gImRpcm91dCIsICJkYXQiOworCQlyZWcgPSA8MHhmZmZlMDQwNiAyPiwgPDB4ZmZmZTA0MGEgMj47CisJCW5hdGl2ZS1lbmRpYW47CisKKwkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCWdwaW8tY29udHJvbGxlcjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby1hc3BlZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby1hc3BlZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5M2JiMmUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvLWFzcGVlZC50eHQKQEAgLTAsMCArMSwzNiBAQAorQXNwZWVkIEdQSU8gY29udHJvbGxlciBEZXZpY2UgVHJlZSBCaW5kaW5ncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlCQk6IEVpdGhlciAiYXNwZWVkLGFzdDI0MDAtZ3BpbyIgb3IgImFzcGVlZCxhc3QyNTAwLWdwaW8iCisKKy0gI2dwaW8tY2VsbHMgCQk6IFNob3VsZCBiZSB0d28KKwkJCSAgLSBGaXJzdCBjZWxsIGlzIHRoZSBHUElPIGxpbmUgbnVtYmVyCisJCQkgIC0gU2Vjb25kIGNlbGwgaXMgdXNlZCB0byBzcGVjaWZ5IG9wdGlvbmFsCisJCQkgICAgcGFyYW1ldGVycyAodW51c2VkKQorCistIHJlZwkJCTogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKKy0gZ3Bpby1jb250cm9sbGVyCTogTWFya3MgdGhlIGRldmljZSBub2RlIGFzIGEgR1BJTyBjb250cm9sbGVyLgorLSBpbnRlcnJ1cHRzCQk6IEludGVycnVwdCBzcGVjaWZpZXIgKHNlZSBpbnRlcnJ1cHQgYmluZGluZ3MgZm9yCisJCQkgIGRldGFpbHMpCistIGludGVycnVwdC1jb250cm9sbGVyCTogTWFyayB0aGUgR1BJTyBjb250cm9sbGVyIGFzIGFuIGludGVycnVwdC1jb250cm9sbGVyCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisKKy0gaW50ZXJydXB0LXBhcmVudCAgICAgOiBUaGUgcGFyZW50IGludGVycnVwdCBjb250cm9sbGVyLCBvcHRpb25hbCBpZiBpbmhlcml0ZWQKKworVGhlIGdwaW8gYW5kIGludGVycnVwdCBwcm9wZXJ0aWVzIGFyZSBmdXJ0aGVyIGRlc2NyaWJlZCBpbiB0aGVpciByZXNwZWN0aXZlCitiaW5kaW5ncyBkb2N1bWVudGF0aW9uOgorCistIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8udHh0CistIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9pbnRlcnJ1cHRzLnR4dAorCisgIEV4YW1wbGU6CisJZ3Bpb0AxZTc4MDAwMCB7CisJCSNncGlvLWNlbGxzID0gPDI+OworCQljb21wYXRpYmxlID0gImFzcGVlZCxhc3QyNDAwLWdwaW8iOworCQlncGlvLWNvbnRyb2xsZXI7CisJCWludGVycnVwdHMgPSA8MjA+OworCQlyZWcgPSA8MHgxZTc4MDAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby1heHAyMDkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby1heHAyMDkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NjExMzAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvLWF4cDIwOS50eHQKQEAgLTAsMCArMSwzMCBAQAorQVhQMjA5IEdQSU8gY29udHJvbGxlcgorCitUaGlzIGRyaXZlciBmb2xsb3dzIHRoZSB1c3VhbCBHUElPIGJpbmRpbmdzIGZvdW5kIGluCitEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvLnR4dAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgIngtcG93ZXJzLGF4cDIwOS1ncGlvIgorLSAjZ3Bpby1jZWxsczogU2hvdWxkIGJlIHR3by4gVGhlIGZpcnN0IGNlbGwgaXMgdGhlIHBpbiBudW1iZXIgYW5kIHRoZQorICBzZWNvbmQgaXMgdGhlIEdQSU8gZmxhZ3MuCistIGdwaW8tY29udHJvbGxlcjogTWFya3MgdGhlIGRldmljZSBub2RlIGFzIGEgR1BJTyBjb250cm9sbGVyLgorCitUaGlzIG5vZGUgbXVzdCBiZSBhIHN1Ym5vZGUgb2YgdGhlIGF4cDIweCBQTUlDLCBkb2N1bWVudGVkIGluCitEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL2F4cDIweC50eHQKKworRXhhbXBsZToKKworYXhwMjA5OiBwbWljQDM0IHsKKwljb21wYXRpYmxlID0gIngtcG93ZXJzLGF4cDIwOSI7CisJcmVnID0gPDB4MzQ+OworCWludGVycnVwdC1wYXJlbnQgPSA8Jm5taV9pbnRjPjsKKwlpbnRlcnJ1cHRzID0gPDAgSVJRX1RZUEVfTEVWRUxfTE9XPjsKKwlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCisJYXhwX2dwaW86IGdwaW8geworCQljb21wYXRpYmxlID0gIngtcG93ZXJzLGF4cDIwOS1ncGlvIjsKKwkJZ3Bpby1jb250cm9sbGVyOworCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tdHBpYzI4MTAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby10cGljMjgxMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmYzJkZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tdHBpYzI4MTAudHh0CkBAIC0wLDAgKzEsMTYgQEAKK1RQSUMyODEwIEdQSU8gY29udHJvbGxlciBiaW5kaW5ncworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZQkJOiBTaG91bGQgYmUgInRpLHRwaWMyODEwIi4KKyAtIHJlZwkJCTogVGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UKKyAtIGdwaW8tY29udHJvbGxlcgk6IE1hcmtzIHRoZSBkZXZpY2Ugbm9kZSBhcyBhIEdQSU8gY29udHJvbGxlci4KKyAtICNncGlvLWNlbGxzCQk6IFNob3VsZCBiZSB0d28uIEZvciBjb25zdW1lciB1c2Ugc2VlIGdwaW8udHh0LgorCitFeGFtcGxlOgorCisJZ3Bpb0A2MCB7CisJCWNvbXBhdGlibGUgPSAidGksdHBpYzI4MTAiOworCQlyZWcgPSA8MHg2MD47CisJCWdwaW8tY29udHJvbGxlcjsKKwkJI2dwaW8tY2VsbHMgPSA8Mj47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tdHBzNjUwODYudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby10cHM2NTA4Ni50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDUxMDcuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby10cHM2NTA4Ni50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0qIFRQUzY1MDg2IEdQTyBDb250cm9sbGVyIGJpbmRpbmdzCi0KLVJlcXVpcmVkIHByb3BlcnRpZXM6Ci0gLSBjb21wYXRpYmxlCQk6IFNob3VsZCBiZSAidGksdHBzNjUwODYtZ3BpbyIuCi0gLSBncGlvLWNvbnRyb2xsZXIJOiBNYXJrcyB0aGUgZGV2aWNlIG5vZGUgYXMgYSBHUElPIENvbnRyb2xsZXIuCi0gLSAjZ3Bpby1jZWxscwkJOiBTaG91bGQgYmUgdHdvLiBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgcGluIG51bWJlcgotCQkJICAgIGFuZCB0aGUgc2Vjb25kIGNlbGwgaXMgdXNlZCB0byBzcGVjaWZ5IGZsYWdzLgotCQkJICAgIFNlZSAuLi9ncGlvL2dwaW8udHh0IGZvciBwb3NzaWJsZSB2YWx1ZXMuCi0KLUV4YW1wbGU6Ci0KLQlncGlvNDogZ3BpbyB7Ci0JCWNvbXBhdGlibGUgPSAidGksdHBzNjUwODYtZ3BpbyI7Ci0JCWdwaW8tY29udHJvbGxlcjsKLQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tdHM0OTAwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tdHM0OTAwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjhlNzFiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby10czQ5MDAudHh0CkBAIC0wLDAgKzEsMzAgQEAKKyogVGVjaG5vbG9naWMgU3lzdGVtcyBJMkMtRlBHQSdzIEdQSU8gY29udHJvbGxlciBiaW5kaW5ncworCitUaGlzIGJpbmRpbmdzIGRlc2NyaWJlcyB0aGUgR1BJTyBjb250cm9sbGVyIGZvciBUZWNobm9sb2dpYydzIEZQR0EgY29yZS4KK1RTLTQ5MDAncyBGUEdBIGVuY29kZXMgdGhlIEdQSU8gc3RhdGUgb24gMyBiaXRzLCB3aGVyZWFzIHRoZSBUUy03OTcwJ3MgRlBHQQordXNlcyAyIGJpdHM6IGl0IGRvZXNuJ3QgdXNlIGEgZGVkaWNhdGVkIGlucHV0IGJpdC4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nCisJCSJ0ZWNobm9sb2dpYyx0czQ5MDAtZ3BpbyIKKwkJInRlY2hub2xvZ2ljLHRzNzk3MC1ncGlvIgorLSByZWc6IFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgY29udHJvbGxlciBhbmQgbGVuZ3RoCisgICAgICAgb2YgbWVtb3J5IG1hcHBlZCByZWdpb24uCistICNncGlvLWNlbGxzOiBTaG91bGQgYmUgdHdvLiBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgcGluIG51bWJlci4KKy0gZ3Bpby1jb250cm9sbGVyOiBNYXJrcyB0aGUgZGV2aWNlIG5vZGUgYXMgYSBncGlvIGNvbnRyb2xsZXIuCisKK09wdGlvbmFsIHByb3BlcnR5OgorLSBuZ3Bpb3M6IE51bWJlciBvZiBHUElPcyB0aGlzIGNvbnRyb2xsZXIgaXMgaW5zdGFudGlhdGVkIHdpdGgsCisgIHRoZSBkZWZhdWx0IGlzIDMyLiBTZWUgZ3Bpby50eHQgZm9yIG1vcmUgZGV0YWlscy4KKworRXhhbXBsZToKKworJmkyYzIgeworCWdwaW84OiBncGlvQDI4IHsKKwkJY29tcGF0aWJsZSA9ICJ0ZWNobm9sb2dpYyx0czQ5MDAtZ3BpbyI7CisJCXJlZyA9IDwweDI4PjsKKwkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCWdwaW8tY29udHJvbGxlcjsKKwkJbmdwaW9zID0gPDMyPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL21ydmwtZ3Bpby50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9tcnZsLWdwaW8udHh0CmluZGV4IDk4ZDE5ODMuLmMzZDAxNjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL21ydmwtZ3Bpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vbXJ2bC1ncGlvLnR4dApAQCAtNDQsMjYgKzQ0LDMgQEAKIAkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MHgyPjsKIAl9OwotCi0qIE1hcnZlbGwgT3Jpb24gR1BJTyBDb250cm9sbGVyCi0KLVJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGUgICAgICAgICA6IFNob3VsZCBiZSAibWFydmVsbCxvcmlvbi1ncGlvIgotLSByZWcgICAgICAgICAgICAgICAgOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgY29udHJvbGxlci4KLS0gZ3Bpby1jb250cm9sbGVyICAgIDogU28gd2Uga25vdyB0aGlzIGlzIGEgZ3BpbyBjb250cm9sbGVyLgotLSBuZ3BpbyAgICAgICAgICAgICAgOiBIb3cgbWFueSBncGlvcyB0aGlzIGNvbnRyb2xsZXIgaGFzLgotLSBpbnRlcnJ1cHRzCSAgICAgOiBVcCB0byA0IEludGVycnVwdHMgZm9yIHRoZSBjb250cm9sbGVyLgotCi1PcHRpb25hbCBwcm9wZXJ0aWVzOgotLSBtYXNrLW9mZnNldCAgICAgICAgOiBGb3IgU01QIE9yaW9ucywgb2Zmc2V0IGZvciBOdGggQ1BVCi0KLUV4YW1wbGU6Ci0KLQkJZ3BpbzA6IGdwaW9AMTAxMDAgewotCQkJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLG9yaW9uLWdwaW8iOwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQlyZWcgPSA8MHgxMDEwMCAweDQwPjsKLQkJCW5ncGlvID0gPDMyPjsKLQkJCWludGVycnVwdHMgPSA8MzU+LCA8MzY+LCA8Mzc+LCA8Mzg+OwotCQl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vcmVuZXNhcyxncGlvLXJjYXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vcmVuZXNhcyxncGlvLXJjYXIudHh0CmluZGV4IDhkYTI2YjMuLjdjMWFiM2IgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL3JlbmVzYXMsZ3Bpby1yY2FyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9yZW5lc2FzLGdwaW8tcmNhci50eHQKQEAgLTExLDYgKzExLDcgQEAKICAgICAtICJyZW5lc2FzLGdwaW8tcjhhNzc5MyI6IGZvciBSOEE3NzkzIChSLUNhciBNMi1OKSBjb21wYXRpYmxlIEdQSU8gY29udHJvbGxlci4KICAgICAtICJyZW5lc2FzLGdwaW8tcjhhNzc5NCI6IGZvciBSOEE3Nzk0IChSLUNhciBFMikgY29tcGF0aWJsZSBHUElPIGNvbnRyb2xsZXIuCiAgICAgLSAicmVuZXNhcyxncGlvLXI4YTc3OTUiOiBmb3IgUjhBNzc5NSAoUi1DYXIgSDMpIGNvbXBhdGlibGUgR1BJTyBjb250cm9sbGVyLgorICAgIC0gInJlbmVzYXMsZ3Bpby1yOGE3Nzk2IjogZm9yIFI4QTc3OTYgKFItQ2FyIE0zLVcpIGNvbXBhdGlibGUgR1BJTyBjb250cm9sbGVyLgogICAgIC0gInJlbmVzYXMsZ3Bpby1yY2FyIjogZm9yIGdlbmVyaWMgUi1DYXIgR1BJTyBjb250cm9sbGVyLgogCiAgIC0gcmVnOiBCYXNlIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiBlYWNoIG1lbW9yeSByZXNvdXJjZSB1c2VkIGJ5IHRoZSBHUElPCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaHdtb24vbHRjNDE1MS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaHdtb24vbHRjNDE1MS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwOGE1ZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9od21vbi9sdGM0MTUxLnR4dApAQCAtMCwwICsxLDE4IEBACitMVEM0MTUxIEhpZ2ggVm9sdGFnZSBJMkMgQ3VycmVudCBhbmQgVm9sdGFnZSBNb25pdG9yCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IE11c3QgYmUgImxsdGMsbHRjNDE1MSIKKy0gcmVnOiBJMkMgYWRkcmVzcworCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBzaHVudC1yZXNpc3Rvci1taWNyby1vaG1zCisJU2h1bnQgcmVzaXN0b3IgdmFsdWUgaW4gbWljcm8tT2htcworCURlZmF1bHRzIHRvIDwxMDAwPiBpZiB1bnNldC4KKworRXhhbXBsZToKKworbHRjNDE1MUA2ZSB7CisJY29tcGF0aWJsZSA9ICJsbHRjLGx0YzQxNTEiOworCXJlZyA9IDwweDZlPjsKKwlzaHVudC1yZXNpc3Rvci1taWNyby1vaG1zID0gPDE1MDA+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9od21vbi9tYXg2NjUwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9od21vbi9tYXg2NjUwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmJkODdkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2h3bW9uL21heDY2NTAudHh0CkBAIC0wLDAgKzEsMjggQEAKK0JpbmRpbmdzIGZvciBNQVg2NjUxIGFuZCBNQVg2NjUwIEkyQyBmYW4gY29udHJvbGxlcnMKKworUmVmZXJlbmNlOgorWzFdCWh0dHBzOi8vZGF0YXNoZWV0cy5tYXhpbWludGVncmF0ZWQuY29tL2VuL2RzL01BWDY2NTAtTUFYNjY1MS5wZGYKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6IE9uZSBvZiAibWF4aW0sbWF4NjY1MCIgb3IgIm1heGltLG1heDY2NTEiCistIHJlZyAgICAgICAgOiBJMkMgYWRkcmVzcywgb25lIG9mIDB4MWIsIDB4MWYsIDB4NGIsIDB4NDguCisKK09wdGlvbmFsIHByb3BlcnRpZXMsIGRlZmF1bHQgaXMgdG8gcmV0YWluIHRoZSBjaGlwJ3MgY3VycmVudCBzZXR0aW5nOgorLSBtYXhpbSxmYW4tbWljcm92b2x0IDogVGhlIHN1cHBseSB2b2x0YWdlIG9mIHRoZSBmYW4sIGVpdGhlciA1MDAwMDAwIHVWIG9yCisJCQkxMjAwMDAwMCB1Vi4KKy0gbWF4aW0sZmFuLXByZXNjYWxlICA6IFByZS1zY2FsaW5nIHZhbHVlLCBhcyBwZXIgZGF0YXNoZWV0IFsxXS4gTG93ZXIgdmFsdWVzCisJCQlhbGxvdyBtb3JlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG9mIHNsb3dlciBmYW5zLgorCQkJVmFsaWQ6IDEsIDIsIDQsIDgsIDE2LgorLSBtYXhpbSxmYW4tdGFyZ2V0LXJwbTogSW5pdGlhbCByZXF1ZXN0ZWQgZmFuIHJvdGF0aW9uIHNwZWVkLiBJZiBzcGVjaWZpZWQsIHRoZQorCQkJZHJpdmVyIHNlbGVjdHMgY2xvc2VkLWxvb3AgbW9kZSBhbmQgdGhlIHJlcXVlc3RlZCBzcGVlZC4KKwkJCVRoaXMgZW5zdXJlcyB0aGUgZmFuIGlzIGFscmVhZHkgcnVubmluZyBiZWZvcmUgdXNlcnNwYWNlCisJCQl0YWtlcyBvdmVyLgorCitFeGFtcGxlOgorCWZhbi1tYXg2NjUwOiBtYXg2NjUwQDFiIHsKKwkJcmVnID0gPDB4MWI+OworCQljb21wYXRpYmxlID0gIm1heGltLG1heDY2NTAiOworCQltYXhpbSxmYW4tbWljcm92b2x0ID0gPDEyMDAwMDAwPjsKKwkJbWF4aW0sZmFuLXByZXNjYWxlID0gPDQ+OworCQltYXhpbSxmYW4tdGFyZ2V0LXJwbSA9IDwxMjAwPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy90cml2aWFsLWRldmljZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy90cml2aWFsLWRldmljZXMudHh0CmluZGV4IDVjNzBjZTkuLjE0MTZjNmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJpdmlhbC1kZXZpY2VzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3RyaXZpYWwtZGV2aWNlcy50eHQKQEAgLTM4LDYgKzM4LDcgQEAKIGRhbGxhcyxkczc1CQlEaWdpdGFsIFRoZXJtb21ldGVyIGFuZCBUaGVybW9zdGF0CiBkbGcsZGE5MDUzCQlEQTkwNTM6IGZsZXhpYmxlIHN5c3RlbSBsZXZlbCBQTUlDIHdpdGggbXVsdGljb3JlIHN1cHBvcnQKIGRsZyxkYTkwNjMJCURBOTA2Mzogc3lzdGVtIFBNSUMgZm9yIHF1YWQtY29yZSBhcHBsaWNhdGlvbiBwcm9jZXNzb3JzCitkb21pbnRlY2gsZG1hcmQwOQlETUFSRDA5OiAzLWF4aXMgQWNjZWxlcm9tZXRlcgogZXBzb24scng4MDEwCQlJMkMtQlVTIElOVEVSRkFDRSBSRUFMIFRJTUUgQ0xPQ0sgTU9EVUxFCiBlcHNvbixyeDgwMjUJCUhpZ2gtU3RhYmlsaXR5LiBJMkMtQnVzIElOVEVSRkFDRSBSRUFMIFRJTUUgQ0xPQ0sgTU9EVUxFCiBlcHNvbixyeDg1ODEJCUkyQy1CVVMgSU5URVJGQUNFIFJFQUwgVElNRSBDTE9DSyBNT0RVTEUKQEAgLTU2LDYgKzU3LDcgQEAKIG1heGltLG1heDEyMzcJCUxvdy1Qb3dlciwgNC0vMTItQ2hhbm5lbCwgMi1XaXJlIFNlcmlhbCwgMTItQml0IEFEQ3MKIG1heGltLG1heDY2MjUJCTktQml0LzEyLUJpdCBUZW1wZXJhdHVyZSBTZW5zb3JzIHdpdGggScKyQy1Db21wYXRpYmxlIFNlcmlhbCBJbnRlcmZhY2UKIG1jLHJ2MzAyOWMyCQlSZWFsIFRpbWUgQ2xvY2sgTW9kdWxlIHdpdGggSTJDLUJ1cworbWN1YmUsbWMzMjMwCQltQ3ViZSAzLWF4aXMgOC1iaXQgZGlnaXRhbCBhY2NlbGVyb21ldGVyCiBtaWNyb2NoaXAsbWNwNDUzMS01MDIJTWljcm9jaGlwIDctYml0IFNpbmdsZSBJMkMgRGlnaXRhbCBQb3RlbnRpb21ldGVyICg1aykKIG1pY3JvY2hpcCxtY3A0NTMxLTEwMwlNaWNyb2NoaXAgNy1iaXQgU2luZ2xlIEkyQyBEaWdpdGFsIFBvdGVudGlvbWV0ZXIgKDEwaykKIG1pY3JvY2hpcCxtY3A0NTMxLTUwMwlNaWNyb2NoaXAgNy1iaXQgU2luZ2xlIEkyQyBEaWdpdGFsIFBvdGVudGlvbWV0ZXIgKDUwaykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWNjZWwvZG1hcmQwNi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FjY2VsL2RtYXJkMDYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMTA1YTEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FjY2VsL2RtYXJkMDYudHh0CkBAIC0wLDAgKzEsMTkgQEAKK0RldmljZSB0cmVlIGJpbmRpbmdzIGZvciBEb21pbnRlY2ggRE1BUkQwNSwgRE1BUkQwNiwgRE1BUkQwNyBhY2NlbGVyb21ldGVycworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZQkJOiBTaG91bGQgYmUgImRvbWludGVjaCxkbWFyZDA1IgorCQkJCSBvciAiZG9taW50ZWNoLGRtYXJkMDYiCisJCQkJIG9yICJkb21pbnRlY2gsZG1hcmQwNyIKKyAtIHJlZwkJCTogSTJDIGFkZHJlc3Mgb2YgdGhlIGNoaXAuIFNob3VsZCBiZSAweDFjCisKK0V4YW1wbGU6CisJJmkyYzEgeworCQkvKiAuLi4gKi8KKworCQlhY2NlbGVyb21ldGVyQDFjIHsKKwkJCWNvbXBhdGlibGUgPSAiZG9taW50ZWNoLGRtYXJkMDYiOworCQkJcmVnID0gPDB4MWM+OworCQl9OworCisJCS8qIC4uLiAqLworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FjY2VsL2tpb25peCxreHNkOS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FjY2VsL2tpb25peCxreHNkOS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1YmYzYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWNjZWwva2lvbml4LGt4c2Q5LnR4dApAQCAtMCwwICsxLDIyIEBACitLaW9uaXggS1hTRDkgQWNjZWxlcm9tZXRlciBkZXZpY2UgdHJlZSBiaW5kaW5ncworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZTogCQlzaG91bGQgYmUgc2V0IHRvICJraW9uaXgsa3hzZDkiCisgLSByZWc6CQkJaTJjIHNsYXZlIGFkZHJlc3MKKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAtIHZkZC1zdXBwbHk6CQlUaGUgaW5wdXQgc3VwcGx5IGZvciBWREQKKyAtIGlvdmRkLXN1cHBseToJVGhlIGlucHV0IHN1cHBseSBmb3IgSU9WREQKKyAtIGludGVycnVwdHM6CQlUaGUgbW92ZW1lbnQgZGV0ZWN0aW9uIGludGVycnVwdAorIC0gbW91bnQtbWF0cml4OglTZWUgbW91bnQtbWF0cml4LnR4dAorCitFeGFtcGxlOgorCitreHNkOUAxOCB7CisJY29tcGF0aWJsZSA9ICJraW9uaXgsa3hzZDkiOworCXJlZyA9IDwweDE4PjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZmb28+OworCWludGVycnVwdHMgPSA8NTcgSVJRX1RZUEVfRURHRV9GQUxMSU5HPjsKKwlpb3ZkZC1zdXBwbHkgPSA8JmJhcj47CisJdmRkLXN1cHBseSA9IDwmYmF6PjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy9tdDY1NzdfYXV4YWRjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL210NjU3N19hdXhhZGMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YzQ1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy9tdDY1NzdfYXV4YWRjLnR4dApAQCAtMCwwICsxLDI5IEBACisqIE1lZGlhdGVrIEFVWEFEQyAtIEFuYWxvZyB0byBEaWdpdGFsIENvbnZlcnRlciBvbiBNZWRpYXRlayBtb2JpbGUgc29jIChtdDY1eHgvbXQ4MXh4L210Mjd4eCkKKz09PT09PT09PT09PT09PQorCitUaGUgQXV4aWxpYXJ5IEFuYWxvZy9EaWdpdGFsIENvbnZlcnRlciAoQVVYQURDKSBpcyBhbiBBREMgZm91bmQKK2luIHNvbWUgTWVkaWF0ZWsgU29DcyB3aGljaCBhbW9uZyBvdGhlciB0aGluZ3MgbWVhc3VyZXMgdGhlIHRlbXBlcmF0dXJlcworaW4gdGhlIFNvQy4gSXQgY2FuIGJlIHVzZWQgZGlyZWN0bHkgd2l0aCByZWdpc3RlciBhY2Nlc3NlcywgYnV0IGl0IGlzIGFsc28KK3VzZWQgYnkgdGhlcm1hbCBjb250cm9sbGVyIHdoaWNoIHJlYWRzIHRoZSB0ZW1wZXJhdHVyZXMgZnJvbSB0aGUgQVVYQURDCitkaXJlY3RseSB2aWEgaXRzIG93biBidXMgaW50ZXJmYWNlLiBTZWUKK0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aGVybWFsL21lZGlhdGVrLXRoZXJtYWwudHh0Citmb3IgdGhlIFRoZXJtYWwgQ29udHJvbGxlciB3aGljaCBob2xkcyBhIHBoYW5kbGUgdG8gdGhlIEFVWEFEQy4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKyAgLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgb25lIG9mOgorICAgIC0gIm1lZGlhdGVrLG10MjcwMS1hdXhhZGMiOiBGb3IgTVQyNzAxIGZhbWlseSBvZiBTb0NzCisgICAgLSAibWVkaWF0ZWssbXQ4MTczLWF1eGFkYyI6IEZvciBNVDgxNzMgZmFtaWx5IG9mIFNvQ3MKKyAgLSByZWc6IEFkZHJlc3MgcmFuZ2Ugb2YgdGhlIEFVWEFEQyB1bml0LgorICAtIGNsb2NrczogU2hvdWxkIGNvbnRhaW4gYSBjbG9jayBzcGVjaWZpZXIgZm9yIGVhY2ggZW50cnkgaW4gY2xvY2stbmFtZXMKKyAgLSBjbG9jay1uYW1lczogU2hvdWxkIGNvbnRhaW4gIm1haW4iLgorICAtICNpby1jaGFubmVsLWNlbGxzOiBTaG91bGQgYmUgMSwgc2VlIC4uL2lpby1iaW5kaW5ncy50eHQKKworRXhhbXBsZToKKworYXV4YWRjOiBhZGNAMTEwMDEwMDAgeworCWNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQyNzAxLWF1eGFkYyI7CisJcmVnID0gPDAgMHgxMTAwMTAwMCAwIDB4MTAwMD47CisJY2xvY2tzID0gPCZwZXJpY2ZnIENMS19QRVJJX0FVWEFEQz47CisJY2xvY2stbmFtZXMgPSAibWFpbiI7CisJI2lvLWNoYW5uZWwtY2VsbHMgPSA8MT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvcm9ja2NoaXAtc2FyYWRjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL3JvY2tjaGlwLXNhcmFkYy50eHQKaW5kZXggYmY5OWUyZi4uMjA1NTkzZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvcm9ja2NoaXAtc2FyYWRjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy9yb2NrY2hpcC1zYXJhZGMudHh0CkBAIC0xNiw2ICsxNiwxMSBAQAogLSB2cmVmLXN1cHBseTogVGhlIHJlZ3VsYXRvciBzdXBwbHkgQURDIHJlZmVyZW5jZSB2b2x0YWdlLgogLSAjaW8tY2hhbm5lbC1jZWxsczogU2hvdWxkIGJlIDEsIHNlZSAuLi9paW8tYmluZGluZ3MudHh0CiAKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHJlc2V0czogTXVzdCBjb250YWluIGFuIGVudHJ5IGZvciBlYWNoIGVudHJ5IGluIHJlc2V0LW5hbWVzIGlmIG5lZWQgc3VwcG9ydAorCSAgdGhpcyBvcHRpb24uIFNlZSAuLi9yZXNldC9yZXNldC50eHQgZm9yIGRldGFpbHMuCistIHJlc2V0LW5hbWVzOiBNdXN0IGluY2x1ZGUgdGhlIG5hbWUgInNhcmFkYy1hcGIiLgorCiBFeGFtcGxlOgogCXNhcmFkYzogc2FyYWRjQDIwMDZjMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxzYXJhZGMiOwpAQCAtMjMsNiArMjgsOCBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMjYgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAJCWNsb2NrcyA9IDwmY3J1IFNDTEtfU0FSQURDPiwgPCZjcnUgUENMS19TQVJBREM+OwogCQljbG9jay1uYW1lcyA9ICJzYXJhZGMiLCAiYXBiX3BjbGsiOworCQlyZXNldHMgPSA8JmNydSBTUlNUX1NBUkFEQz47CisJCXJlc2V0LW5hbWVzID0gInNhcmFkYy1hcGIiOwogCQkjaW8tY2hhbm5lbC1jZWxscyA9IDwxPjsKIAkJdnJlZi1zdXBwbHkgPSA8JnZjYzE4PjsKIAl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvdGktYWRjMTIxMzgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvdGktYWRjMTIxMzgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OWExZDMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy90aS1hZGMxMjEzOC50eHQKQEAgLTAsMCArMSwzNyBAQAorKiBUZXhhcyBJbnN0cnVtZW50cycgQURDMTIxMzAvQURDMTIxMzIvQURDMTIxMzgKKworUmVxdWlyZWQgcHJvcGVydGllczoKKyAtIGNvbXBhdGlibGU6IFNob3VsZCBiZSBvbmUgb2YKKwkqICJ0aSxhZGMxMjEzMCIKKwkqICJ0aSxhZGMxMjEzMiIKKwkqICJ0aSxhZGMxMjEzOCIKKyAtIHJlZzogU1BJIGNoaXAgc2VsZWN0IG51bWJlciBmb3IgdGhlIGRldmljZQorIC0gaW50ZXJydXB0czogU2hvdWxkIGNvbnRhaW4gaW50ZXJydXB0IGZvciBFT0MgKGVuZCBvZiBjb252ZXJzaW9uKQorIC0gY2xvY2tzOiBwaGFuZGxlIHRvIGNvbnZlcnNpb24gY2xvY2sgaW5wdXQKKyAtIHNwaS1tYXgtZnJlcXVlbmN5OiBEZWZpbmlzaW9uIGFzIHBlcgorCURvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWJ1cy50eHQKKyAtIHZyZWYtcC1zdXBwbHk6IFRoZSByZWd1bGF0b3Igc3VwcGx5IGZvciBwb3NpdGl2ZSBhbmFsb2cgdm9sdGFnZSByZWZlcmVuY2UKKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAtIHZyZWYtbi1zdXBwbHk6IFRoZSByZWd1bGF0b3Igc3VwcGx5IGZvciBuZWdhdGl2ZSBhbmFsb2cgdm9sdGFnZSByZWZlcmVuY2UKKwkoTm90ZSB0aGF0IHRoaXMgbXVzdCBub3QgZ28gYmVsb3cgR05EIG9yIGV4Y2VlZCB2cmVmLXApCisJSWYgbm90IHNwZWNpZmllZCwgdGhpcyBpcyBhc3N1bWVkIHRvIGJlIGFuYWxvZyBncm91bmQuCisgLSB0aSxhY3F1aXNpdGlvbi10aW1lOiBUaGUgbnVtYmVyIG9mIGNvbnZlcnNpb24gY2xvY2sgcGVyaW9kcyBmb3IgdGhlIFMvSCdzCisJYWNxdWlzaXRpb24gdGltZS4gIFNob3VsZCBiZSBvbmUgb2YgNiwgMTAsIDE4LCAzNC4gIElmIG5vdCBzcGVjaWZpZWQsCisJZGVmYXVsdCB2YWx1ZSBvZiAxMCBpcyB1c2VkLgorCUZvciBoaWdoIHNvdXJjZSBpbXBlZGFuY2VzLCB0aGlzIHZhbHVlIGNhbiBiZSBpbmNyZWFzZWQgdG8gMTggb3IgMzQuCisJRm9yIGxlc3MgQURDIGFjY3VyYWN5IGFuZC9vciBzbG93ZXIgQ0NMSyBmcmVxdWVuY2llcyB0aGlzIHZhbHVlIG1heSBiZQorCWRlY3JlYXNlZCB0byA2LiAgU2VlIHNlY3Rpb24gNi4wIElOUFVUIFNPVVJDRSBSRVNJU1RBTkNFIGluIHRoZQorCWRhdGFzaGVldCBmb3IgZGV0YWlscy4KKworRXhhbXBsZToKK2FkY0AwIHsKKwljb21wYXRpYmxlID0gInRpLGFkYzEyMTM4IjsKKwlyZWcgPSA8MD47CisJaW50ZXJydXB0cyA9IDwyOCBJUlFfVFlQRV9FREdFX1JJU0lORz47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmZ3BpbzE+OworCWNsb2NrcyA9IDwmY2Nsaz47CisJdnJlZi1wLXN1cHBseSA9IDwmbGRvNF9yZWc+OworCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDUwMDAwMDA+OworCXRpLGFjcXVpc2l0aW9uLXRpbWUgPSA8Nj47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvdGktYWRjMTYxczYyNi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy90aS1hZGMxNjFzNjI2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWQyMzE1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvdGktYWRjMTYxczYyNi50eHQKQEAgLTAsMCArMSwxNiBAQAorKiBUZXhhcyBJbnN0cnVtZW50cyBBREMxNDFTNjI2IGFuZCBBREMxNjFTNjI2IGNoaXBzCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgInRpLGFkYzE0MXM2MjYiIG9yICJ0aSxhZGMxNjFzNjI2IgorIC0gcmVnOiBzcGkgY2hpcCBzZWxlY3QgbnVtYmVyIGZvciB0aGUgZGV2aWNlCisKK1JlY29tbWVuZGVkIHByb3BlcnRpZXM6CisgLSBzcGktbWF4LWZyZXF1ZW5jeTogRGVmaW5pdGlvbiBhcyBwZXIKKwkJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktYnVzLnR4dAorCitFeGFtcGxlOgorYWRjQDAgeworCWNvbXBhdGlibGUgPSAidGksYWRjMTYxczYyNiI7CisJcmVnID0gPDA+OworCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDQzMDAwMDA+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vY2hlbWljYWwvYXRsYXMsb3JwLXNtLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vY2hlbWljYWwvYXRsYXMsb3JwLXNtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDhiNjg3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9jaGVtaWNhbC9hdGxhcyxvcnAtc20udHh0CkBAIC0wLDAgKzEsMjIgQEAKKyogQXRsYXMgU2NpZW50aWZpYyBPUlAtU00gT0VNIHNlbnNvcgorCitodHRwczovL3d3dy5hdGxhcy1zY2llbnRpZmljLmNvbS9fZmlsZXMvX2RhdGFzaGVldHMvX29lbS9PUlBfb2VtX2RhdGFzaGVldC5wZGYKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGU6IG11c3QgYmUgImF0bGFzLG9ycC1zbSIKKyAgLSByZWc6IHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgc2Vuc29yCisgIC0gaW50ZXJydXB0LXBhcmVudDogc2hvdWxkIGJlIHRoZSBwaGFuZGxlIGZvciB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIKKyAgLSBpbnRlcnJ1cHRzOiB0aGUgc29sZSBpbnRlcnJ1cHQgZ2VuZXJhdGVkIGJ5IHRoZSBkZXZpY2UKKworICBSZWZlciB0byBpbnRlcnJ1cHQtY29udHJvbGxlci9pbnRlcnJ1cHRzLnR4dCBmb3IgZ2VuZXJpYyBpbnRlcnJ1cHQgY2xpZW50CisgIG5vZGUgYmluZGluZ3MuCisKK0V4YW1wbGU6CisKK2F0bGFzQDY2IHsKKwljb21wYXRpYmxlID0gImF0bGFzLG9ycC1zbSI7CisJcmVnID0gPDB4NjY+OworCWludGVycnVwdC1wYXJlbnQgPSA8JmdwaW8xPjsKKwlpbnRlcnJ1cHRzID0gPDE2IDI+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vbWFnbmV0b21ldGVyL2FrODk3NC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL21hZ25ldG9tZXRlci9hazg5NzQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDVhYmExCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9tYWduZXRvbWV0ZXIvYWs4OTc0LnR4dApAQCAtMCwwICsxLDI5IEBACisqIEFzYWhpIEthc2VpIEFLODk3NCBtYWduZXRvbWV0ZXIgc2Vuc29yCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAiYXNhaGkta2FzZWksYWs4OTc0IgorLSByZWcgOiB0aGUgSTJDIGFkZHJlc3Mgb2YgdGhlIG1hZ25ldG9tZXRlcgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCistIGF2ZGQtc3VwcGx5OiByZWd1bGF0b3Igc3VwcGx5IGZvciB0aGUgYW5hbG9nIHZvbHRhZ2UKKyAgKHNlZSByZWd1bGF0b3IvcmVndWxhdG9yLnR4dCkKKy0gZHZkZC1zdXBwbHk6IHJlZ3VsYXRvciBzdXBwbHkgZm9yIHRoZSBkaWdpdGFsIHZvbHRhZ2UKKyAgKHNlZSByZWd1bGF0b3IvcmVndWxhdG9yLnR4dCkKKy0gaW50ZXJydXB0czogZGF0YSByZWFkeSAoRFJEWSkgYW5kIGludGVycnVwdCAoSU5UMSkgbGluZXMKKyAgZnJvbSB0aGUgY2hpcCwgdGhlIERSRFkgaW50ZXJydXB0IG11c3QgYmUgcGxhY2VkIGZpcnN0LgorICBUaGUgaW50ZXJydXB0cyBjYW4gYmUgdHJpZ2dlcmVkIG9uIHJpc2luZyBvciBmYWxsaW5nCisgIGVkZ2VzIGFsaWtlLgorLSBtb3VudC1tYXRyaXg6IGFuIG9wdGlvbmFsIDN4MyBtb3VudGluZyByb3RhdGlvbiBtYXRyaXgKKworRXhhbXBsZToKKworYWs4OTc0QDBmIHsKKwljb21wYXRpYmxlID0gImFzYWhpLWthc2VpLGFrODk3NCI7CisJcmVnID0gPDB4MGY+OworCWF2ZGQtc3VwcGx5ID0gPCZmb29fcmVnPjsKKwlkdmRkLXN1cHBseSA9IDwmYmFyX3JlZz47CisJaW50ZXJydXB0cyA9IDwwIElSUV9UWVBFX0VER0VfUklTSU5HPiwKKwkJICAgICA8MSBJUlFfVFlQRV9FREdFX1JJU0lORz47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9wcmVzc3VyZS96cGEyMzI2LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vcHJlc3N1cmUvenBhMjMyNi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4NWRlNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vcHJlc3N1cmUvenBhMjMyNi50eHQKQEAgLTAsMCArMSwzMSBAQAorTXVyYXRhIFpQQTIzMjYgcHJlc3N1cmUgc2Vuc29yCisKK1ByZXNzdXJlIHNlbnNvciBmcm9tIE11cmF0YSB3aXRoIFNQSSBhbmQgSTJDIGJ1cyBpbnRlcmZhY2VzLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAibXVyYXRhLHpwYTIzMjYiCistIHJlZzogdGhlIEkyQyBhZGRyZXNzIG9yIFNQSSBjaGlwIHNlbGVjdCB0aGUgZGV2aWNlIHdpbGwgcmVzcG9uZCB0bworCitSZWNvbW1lbmRlZCBwcm9wZXJ0aWVzIGZvciBTUEkgYnVzIHVzYWdlOgorLSBzcGktbWF4LWZyZXF1ZW5jeTogbWF4aW11bSBTUEkgYnVzIGZyZXF1ZW5jeSBhcyBkb2N1bWVudGVkIGluCisgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWJ1cy50eHQKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gdnJlZi1zdXBwbHk6IGFuIG9wdGlvbmFsIHJlZ3VsYXRvciB0aGF0IG5lZWRzIHRvIGJlIG9uIHRvIHByb3ZpZGUgVlJFRgorICBwb3dlciB0byB0aGUgc2Vuc29yCistIHZkZC1zdXBwbHk6IGFuIG9wdGlvbmFsIHJlZ3VsYXRvciB0aGF0IG5lZWRzIHRvIGJlIG9uIHRvIHByb3ZpZGUgVkRECisgIHBvd2VyIHRvIHRoZSBzZW5zb3IKKy0gaW50ZXJydXB0LXBhcmVudDogcGhhbmRsZSB0byB0aGUgcGFyZW50IGludGVycnVwdCBjb250cm9sbGVyIGFzIGRvY3VtZW50ZWQgaW4KKyAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2ludGVycnVwdHMudHh0CistIGludGVycnVwdHM6IGludGVycnVwdCBtYXBwaW5nIGZvciBJUlEgYXMgZG9jdW1lbnRlZCBpbgorICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvaW50ZXJydXB0cy50eHQKKworRXhhbXBsZToKKworenBhMjMyNkA1YyB7CisJY29tcGF0aWJsZSA9ICJtdXJhdGEsenBhMjMyNiI7CisJcmVnID0gPDB4NWM+OworCWludGVycnVwdC1wYXJlbnQgPSA8JmdwaW8+OworCWludGVycnVwdHMgPSA8MTI+OworCXZkZC1zdXBwbHkgPSA8Jmxkb18xdjhfZ25zcz47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9wcm94aW1pdHkvc3g5NTAwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vcHJveGltaXR5L3N4OTUwMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwMWRkMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vcHJveGltaXR5L3N4OTUwMC50eHQKQEAgLTAsMCArMSwyNCBAQAorU2VtdGVjaCdzIFNYOTUwMCBjYXBhY2l0aXZlIHByb3hpbWl0eSBidXR0b24gZGV2aWNlIGRyaXZlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCS0gY29tcGF0aWJsZTogbXVzdCBiZSAic2VtdGVjaCxzeDk1MDAiCisJLSByZWc6IGkyYyBhZGRyZXNzIHdoZXJlIHRvIGZpbmQgdGhlIGRldmljZQorCS0gaW50ZXJydXB0LXBhcmVudCA6IHNob3VsZCBiZSB0aGUgcGhhbmRsZSBmb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVyCisJLSBpbnRlcnJ1cHRzIDogdGhlIHNvbGUgaW50ZXJydXB0IGdlbmVyYXRlZCBieSB0aGUgZGV2aWNlCisKKwlSZWZlciB0byBpbnRlcnJ1cHQtY29udHJvbGxlci9pbnRlcnJ1cHRzLnR4dCBmb3IgZ2VuZXJpYworCWludGVycnVwdCBjbGllbnQgbm9kZSBiaW5kaW5ncy4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKwktIHJlc2V0LWdwaW9zOiBSZWZlcmVuY2UgdG8gdGhlIEdQSU8gY29ubmVjdGVkIHRvIHRoZSBkZXZpY2UncyBhY3RpdmUKKwkgIGxvdyByZXNldCBwaW4uCisKK0V4YW1wbGU6CisKK3N4OTUwMEAyOCB7CisJY29tcGF0aWJsZSA9ICJzZW10ZWNoLHN4OTUwMCI7CisJcmVnID0gPDB4Mjg+OworCWludGVycnVwdC1wYXJlbnQgPSA8JmdwaW8yPjsKKwlpbnRlcnJ1cHRzID0gPDE2IElSUV9UWVBFX0xFVkVMX0xPVz47CisJcmVzZXQtZ3Bpb3MgPSA8JmdwaW8yIDEwIEdQSU9fQUNUSVZFX0xPVz47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby90ZW1wZXJhdHVyZS9tYXhpbV90aGVybW9jb3VwbGUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby90ZW1wZXJhdHVyZS9tYXhpbV90aGVybW9jb3VwbGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YmM1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL3RlbXBlcmF0dXJlL21heGltX3RoZXJtb2NvdXBsZS50eHQKQEAgLTAsMCArMSwyMSBAQAorTWF4aW0gdGhlcm1vY291cGxlIHN1cHBvcnQKKworKiBodHRwczovL2RhdGFzaGVldHMubWF4aW1pbnRlZ3JhdGVkLmNvbS9lbi9kcy9NQVg2Njc1LnBkZgorKiBodHRwczovL2RhdGFzaGVldHMubWF4aW1pbnRlZ3JhdGVkLmNvbS9lbi9kcy9NQVgzMTg1NS5wZGYKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworCS0gY29tcGF0aWJsZTogbXVzdCBiZSAibWF4aW0sbWF4MzE4NTUiIG9yICJtYXhpbSxtYXg2Njc1IgorCS0gcmVnOiBTUEkgY2hpcCBzZWxlY3QgbnVtYmVyIGZvciB0aGUgZGV2aWNlCisJLSBzcGktbWF4LWZyZXF1ZW5jeTogbXVzdCBiZSA0MzAwMDAwCisJLSBzcGktY3BoYTogbXVzdCBiZSBkZWZpbmVkIGZvciBtYXg2Njc1IHRvIGVuYWJsZSBTUEkgbW9kZSAxCisKKwlSZWZlciB0byBzcGkvc3BpLWJ1cy50eHQgZm9yIGdlbmVyaWMgU1BJIHNsYXZlIGJpbmRpbmdzLgorCitFeGFtcGxlOgorCisJbWF4MzE4NTVAMCB7CisJCWNvbXBhdGlibGUgPSAibWF4aW0sbWF4MzE4NTUiOworCQlyZWcgPSA8MD47CisJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDQzMDAwMDA+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdG91Y2hzY3JlZW4vc2lsZWFkX2dzbDE2ODAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L3RvdWNoc2NyZWVuL3NpbGVhZF9nc2wxNjgwLnR4dAppbmRleCAxMTEyZTBkLi44MjBmZWU0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdG91Y2hzY3JlZW4vc2lsZWFkX2dzbDE2ODAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90b3VjaHNjcmVlbi9zaWxlYWRfZ3NsMTY4MC50eHQKQEAgLTEzLDYgKzEzLDcgQEAKIC0gdG91Y2hzY3JlZW4tc2l6ZS15CSAgOiBTZWUgdG91Y2hzY3JlZW4udHh0CiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CistIGZpcm13YXJlLW5hbWUJCSAgOiBGaWxlIGJhc2VuYW1lIChzdHJpbmcpIGZvciBib2FyZCBzcGVjaWZpYyBmaXJtd2FyZQogLSB0b3VjaHNjcmVlbi1pbnZlcnRlZC14ICA6IFNlZSB0b3VjaHNjcmVlbi50eHQKIC0gdG91Y2hzY3JlZW4taW52ZXJ0ZWQteSAgOiBTZWUgdG91Y2hzY3JlZW4udHh0CiAtIHRvdWNoc2NyZWVuLXN3YXBwZWQteC15IDogU2VlIHRvdWNoc2NyZWVuLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2pjb3JlLGFpYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvamNvcmUsYWljLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTJhZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2pjb3JlLGFpYy50eHQKQEAgLTAsMCArMSwyNiBAQAorSi1Db3JlIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJqY29yZSxhaWMxIiBmb3IgdGhlIChvYnNvbGV0ZSkgZmlyc3QtZ2VuZXJhdGlvbiBhaWMKKyAgd2l0aCA4IGludGVycnVwdCBsaW5lcyB3aXRoIHByb2dyYW1tYWJsZSBwcmlvcml0aWVzLCBvciAiamNvcmUsYWljMiIgZm9yCisgIHRoZSAiYWljMiIgY29yZSB3aXRoIDY0IGludGVycnVwdHMuCisKKy0gcmVnOiBNZW1vcnkgcmVnaW9uKHMpIGZvciBjb25maWd1cmF0aW9uLiBGb3IgU01QLCB0aGVyZSBzaG91bGQgYmUgb25lCisgIHJlZ2lvbiBwZXIgY3B1LCBpbmRleGVkIGJ5IHRoZSBzZXF1ZW50aWFsLCB6ZXJvLWJhc2VkIGhhcmR3YXJlIGNwdQorICBudW1iZXIuCisKKy0gaW50ZXJydXB0LWNvbnRyb2xsZXI6IElkZW50aWZpZXMgdGhlIG5vZGUgYXMgYW4gaW50ZXJydXB0IGNvbnRyb2xsZXIKKworLSAjaW50ZXJydXB0LWNlbGxzOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjZWxscyBuZWVkZWQgdG8gZW5jb2RlIGFuCisgIGludGVycnVwdCBzb3VyY2UuIFRoZSB2YWx1ZSBzaGFsbCBiZSAxLgorCisKK0V4YW1wbGU6CisKK2FpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJAMjAwIHsKKwljb21wYXRpYmxlID0gImpjb3JlLGFpYzIiOworCXJlZyA9IDwgMHgyMDAgMHgzMCAweDUwMCAweDMwID47CisJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvbWFydmVsbCxhcm1hZGEtOGstcGljLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9tYXJ2ZWxsLGFybWFkYS04ay1waWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YTdiNGNkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL21hcnZlbGwsYXJtYWRhLThrLXBpYy50eHQKQEAgLTAsMCArMSwyNSBAQAorTWFydmVsbCBBcm1hZGEgN0svOEsgUElDIEludGVycnVwdCBjb250cm9sbGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBpcyB0aGUgRGV2aWNlIFRyZWUgYmluZGluZyBmb3IgdGhlIFBJQywgYSBzZWNvbmRhcnkgaW50ZXJydXB0Citjb250cm9sbGVyIGF2YWlsYWJsZSBvbiB0aGUgTWFydmVsbCBBcm1hZGEgN0svOEsgQVJNNjQgU29DcywgYW5kCit0eXBpY2FsbHkgY29ubmVjdGVkIHRvIHRoZSBHSUMgYXMgdGhlIHByaW1hcnkgaW50ZXJydXB0IGNvbnRyb2xsZXIuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IHNob3VsZCBiZSAibWFydmVsbCxhcm1hZGEtOGstcGljIgorLSBpbnRlcnJ1cHQtY29udHJvbGxlcjogaWRlbnRpZmllcyB0aGUgbm9kZSBhcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlcgorLSAjaW50ZXJydXB0LWNlbGxzOiB0aGUgbnVtYmVyIG9mIGNlbGxzIHRvIGRlZmluZSBpbnRlcnJ1cHRzIG9uIHRoaXMKKyAgY29udHJvbGxlci4gU2hvdWxkIGJlIDEKKy0gcmVnOiB0aGUgcmVnaXN0ZXIgYXJlYSBmb3IgdGhlIFBJQyBpbnRlcnJ1cHQgY29udHJvbGxlcgorLSBpbnRlcnJ1cHRzOiB0aGUgaW50ZXJydXB0IHRvIHRoZSBwcmltYXJ5IGludGVycnVwdCBjb250cm9sbGVyLAorICB0eXBpY2FsbHkgdGhlIEdJQworCitFeGFtcGxlOgorCisJcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckAzZjAxMDAgeworCQljb21wYXRpYmxlID0gIm1hcnZlbGwsYXJtYWRhLThrLXBpYyI7CisJCXJlZyA9IDwweDNmMDEwMCAweDEwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCWludGVycnVwdHMgPSA8R0lDX1BQSSAxNSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL21hcnZlbGwsb2RtaS1jb250cm9sbGVyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9tYXJ2ZWxsLG9kbWktY29udHJvbGxlci50eHQKaW5kZXggOGFmMGE4ZS4uM2Y2NDQyYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL21hcnZlbGwsb2RtaS1jb250cm9sbGVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvbWFydmVsbCxvZG1pLWNvbnRyb2xsZXIudHh0CkBAIC0zMSw3ICszMSw3IEBACiBFeGFtcGxlOgogCiAJb2RtaTogb2RtaUAzMDAwMDAgewotCQljb21wYXRpYmxlID0gIm1hcnZlbGwsYXA4MDYtb2RtLWNvbnRyb2xsZXIiLAorCQljb21wYXRpYmxlID0gIm1hcnZlbGwsYXA4MDYtb2RtaS1jb250cm9sbGVyIiwKIAkJCSAgICAgIm1hcnZlbGwsb2RtaS1jb250cm9sbGVyIjsKIAkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCW1zaS1jb250cm9sbGVyOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL3JlbmVzYXMsaXJxYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvcmVuZXNhcyxpcnFjLnR4dAppbmRleCBhZTUwNTRjLi5lM2YwNTJkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvcmVuZXNhcyxpcnFjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvcmVuZXNhcyxpcnFjLnR4dApAQCAtMSwxMCArMSwxMiBAQAotRFQgYmluZGluZ3MgZm9yIHRoZSBSLU1vYmlsZS9SLUNhciBpbnRlcnJ1cHQgY29udHJvbGxlcgorRFQgYmluZGluZ3MgZm9yIHRoZSBSLU1vYmlsZS9SLUNhci9SWi9HIGludGVycnVwdCBjb250cm9sbGVyCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAKIC0gY29tcGF0aWJsZTogaGFzIHRvIGJlICJyZW5lc2FzLGlycWMtPHNvY3R5cGU+IiwgInJlbmVzYXMsaXJxYyIgYXMgZmFsbGJhY2suCiAgIEV4YW1wbGVzIHdpdGggc29jdHlwZXMgYXJlOgogICAgIC0gInJlbmVzYXMsaXJxYy1yOGE3M2E0IiAoUi1Nb2JpbGUgQVBFNikKKyAgICAtICJyZW5lc2FzLGlycWMtcjhhNzc0MyIgKFJaL0cxTSkKKyAgICAtICJyZW5lc2FzLGlycWMtcjhhNzc0NSIgKFJaL0cxRSkKICAgICAtICJyZW5lc2FzLGlycWMtcjhhNzc5MCIgKFItQ2FyIEgyKQogICAgIC0gInJlbmVzYXMsaXJxYy1yOGE3NzkxIiAoUi1DYXIgTTItVykKICAgICAtICJyZW5lc2FzLGlycWMtcjhhNzc5MiIgKFItQ2FyIFYySCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9zdCxzdG0zMi1leHRpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9zdCxzdG0zMi1leHRpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTc3MDNkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL3N0LHN0bTMyLWV4dGkudHh0CkBAIC0wLDAgKzEsMjAgQEAKK1NUTTMyIEV4dGVybmFsIEludGVycnVwdCBDb250cm9sbGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJzdCxzdG0zMi1leHRpIgorLSByZWc6IFNwZWNpZmllcyBiYXNlIHBoeXNpY2FsIGFkZHJlc3MgYW5kIHNpemUgb2YgdGhlIHJlZ2lzdGVycworLSBpbnRlcnJ1cHQtY29udHJvbGxlcjogSW5kZW50aWZpZXMgdGhlIG5vZGUgYXMgYW4gaW50ZXJydXB0IGNvbnRyb2xsZXIKKy0gI2ludGVycnVwdC1jZWxsczogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2VsbHMgdG8gZW5jb2RlIGFuIGludGVycnVwdAorICBzcGVjaWZpZXIsIHNoYWxsIGJlIDIKKy0gaW50ZXJydXB0czogaW50ZXJydXB0cyByZWZlcmVuY2VzIHRvIHByaW1hcnkgaW50ZXJydXB0IGNvbnRyb2xsZXIKKworRXhhbXBsZToKKworZXh0aTogaW50ZXJydXB0LWNvbnRyb2xsZXJANDAwMTNjMDAgeworCWNvbXBhdGlibGUgPSAic3Qsc3RtMzItZXh0aSI7CisJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwlyZWcgPSA8MHg0MDAxM0MwMCAweDQwMD47CisJaW50ZXJydXB0cyA9IDwxPiwgPDI+LCA8Mz4sIDw2PiwgPDc+LCA8OD4sIDw5PiwgPDEwPiwgPDIzPiwgPDQwPiwgPDQxPiwgPDQyPiwgPDYyPiwgPDc2PjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAppbmRleCA5M2VmNmU2Li42OTZiZTU3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQKQEAgLTE5LDYgKzE5LDEzIEBACiAJICBhIGRldmljZSwgaS5lLiBubyBvdGhlciBMRUQgY2xhc3MgZGV2aWNlIGNhbiBiZSBhc3NpZ25lZCB0aGUgc2FtZQogCSAgbGFiZWwuCiAKKy0gZGVmYXVsdC1zdGF0ZSA6IFRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBMRUQuIFZhbGlkIHZhbHVlcyBhcmUgIm9uIiwgIm9mZiIsCisgIGFuZCAia2VlcCIuIElmIHRoZSBMRUQgaXMgYWxyZWFkeSBvbiBvciBvZmYgYW5kIHRoZSBkZWZhdWx0LXN0YXRlIHByb3BlcnR5IGlzCisgIHNldCB0aGUgdG8gc2FtZSB2YWx1ZSwgdGhlbiBubyBnbGl0Y2ggc2hvdWxkIGJlIHByb2R1Y2VkIHdoZXJlIHRoZSBMRUQKKyAgbW9tZW50YXJpbHkgdHVybnMgb2ZmIChvciBvbikuIFRoZSAia2VlcCIgc2V0dGluZyB3aWxsIGtlZXAgdGhlIExFRCBhdAorICB3aGF0ZXZlciBpdHMgY3VycmVudCBzdGF0ZSBpcywgd2l0aG91dCBwcm9kdWNpbmcgYSBnbGl0Y2guICBUaGUgZGVmYXVsdCBpcworICBvZmYgaWYgdGhpcyBwcm9wZXJ0eSBpcyBub3QgcHJlc2VudC4KKwogLSBsaW51eCxkZWZhdWx0LXRyaWdnZXIgOiAgVGhpcyBwYXJhbWV0ZXIsIGlmIHByZXNlbnQsIGlzIGEKICAgICBzdHJpbmcgZGVmaW5pbmcgdGhlIHRyaWdnZXIgYXNzaWduZWQgdG8gdGhlIExFRC4gIEN1cnJlbnQgdHJpZ2dlcnMgYXJlOgogICAgICAiYmFja2xpZ2h0IiAtIExFRCB3aWxsIGFjdCBhcyBhIGJhY2stbGlnaHQsIGNvbnRyb2xsZWQgYnkgdGhlIGZyYW1lYnVmZmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWJjbTYzMjgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1iY202MzI4LnR4dAppbmRleCAzZjQ4YzFlLi5jY2ViY2U1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWJjbTYzMjgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtYmNtNjMyOC50eHQKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICAtIGFjdGl2ZS1sb3cgOiBCb29sZWFuLCBtYWtlcyBMRUQgYWN0aXZlIGxvdy4KICAgICAgIERlZmF1bHQgOiBmYWxzZQogICAgIC0gZGVmYXVsdC1zdGF0ZSA6IHNlZQotICAgICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1ncGlvLnR4dAorICAgICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAogICAgIC0gbGludXgsZGVmYXVsdC10cmlnZ2VyIDogc2VlCiAgICAgICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtYmNtNjM1OC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWJjbTYzNTgudHh0CmluZGV4IGIyMmE1NWIuLmRhNTcwOGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtYmNtNjM1OC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1iY202MzU4LnR4dApAQCAtMjgsNyArMjgsNyBAQAogICAtIGFjdGl2ZS1sb3cgOiBCb29sZWFuLCBtYWtlcyBMRUQgYWN0aXZlIGxvdy4KICAgICBEZWZhdWx0IDogZmFsc2UKICAgLSBkZWZhdWx0LXN0YXRlIDogc2VlCi0gICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1ncGlvLnR4dAorICAgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQKICAgLSBsaW51eCxkZWZhdWx0LXRyaWdnZXIgOiBzZWUKICAgICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtZ3Bpby50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWdwaW8udHh0CmluZGV4IDViMWI0M2EuLjc2NTM1Y2EgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtZ3Bpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1ncGlvLnR4dApAQCAtMTQsMTMgKzE0LDggQEAKICAgc2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQKIC0gbGludXgsZGVmYXVsdC10cmlnZ2VyIDogIChvcHRpb25hbCkKICAgc2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQKLS0gZGVmYXVsdC1zdGF0ZTogIChvcHRpb25hbCkgVGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIExFRC4gIFZhbGlkCi0gIHZhbHVlcyBhcmUgIm9uIiwgIm9mZiIsIGFuZCAia2VlcCIuICBJZiB0aGUgTEVEIGlzIGFscmVhZHkgb24gb3Igb2ZmCi0gIGFuZCB0aGUgZGVmYXVsdC1zdGF0ZSBwcm9wZXJ0eSBpcyBzZXQgdGhlIHRvIHNhbWUgdmFsdWUsIHRoZW4gbm8KLSAgZ2xpdGNoIHNob3VsZCBiZSBwcm9kdWNlZCB3aGVyZSB0aGUgTEVEIG1vbWVudGFyaWx5IHR1cm5zIG9mZiAob3IKLSAgb24pLiAgVGhlICJrZWVwIiBzZXR0aW5nIHdpbGwga2VlcCB0aGUgTEVEIGF0IHdoYXRldmVyIGl0cyBjdXJyZW50Ci0gIHN0YXRlIGlzLCB3aXRob3V0IHByb2R1Y2luZyBhIGdsaXRjaC4gIFRoZSBkZWZhdWx0IGlzIG9mZiBpZiB0aGlzCi0gIHByb3BlcnR5IGlzIG5vdCBwcmVzZW50LgorLSBkZWZhdWx0LXN0YXRlOiAgKG9wdGlvbmFsKSBUaGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgTEVELgorICBzZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAogLSByZXRhaW4tc3RhdGUtc3VzcGVuZGVkOiAob3B0aW9uYWwpIFRoZSBzdXNwZW5kIHN0YXRlIGNhbiBiZSByZXRhaW5lZC5TdWNoCiAgIGFzIGNoYXJnZS1sZWQgZ3Bpby4KIC0gcGFuaWMtaW5kaWNhdG9yIDogKG9wdGlvbmFsKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1pczMxZmwzMTl4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtaXMzMWZsMzE5eC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyNjAzNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtaXMzMWZsMzE5eC50eHQKQEAgLTAsMCArMSw1OSBAQAorTEVEcyBjb25uZWN0ZWQgdG8gaXMzMWZsMzE5eCBMRUQgY29udHJvbGxlciBjaGlwCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgYW55IG9mCisJImlzc2ksaXMzMWZsMzE5MCIKKwkiaXNzaSxpczMxZmwzMTkxIgorCSJpc3NpLGlzMzFmbDMxOTMiCisJImlzc2ksaXMzMWZsMzE5NiIKKwkiaXNzaSxpczMxZmwzMTk5IgorCSJzaS1lbixzbjMxOTkiLgorLSAjYWRkcmVzcy1jZWxsczogTXVzdCBiZSAxLgorLSAjc2l6ZS1jZWxsczogTXVzdCBiZSAwLgorLSByZWc6IDB4NjQsIDB4NjUsIDB4NjYsIG9yIDB4NjcuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGF1ZGlvLWdhaW4tZGIgOiBhdWRpbyBnYWluIHNlbGVjdGlvbiBmb3IgZXh0ZXJuYWwgYW5hbG9nIG1vZHVsYXRpb24gaW5wdXQuCisJVmFsaWQgdmFsdWVzOiAwIC0gMjEsIHN0ZXAgYnkgMyAocm91bmRlZCBkb3duKQorCURlZmF1bHQ6IDAKKworRWFjaCBsZWQgaXMgcmVwcmVzZW50ZWQgYXMgYSBzdWItbm9kZSBvZiB0aGUgaXNzaSxpczMxZmwzMTl4IGRldmljZS4KK1RoZXJlIGNhbiBiZSBsZXNzIGxlZHMgc3Vibm9kZXMgdGhhbiB0aGUgY2hpcCBjYW4gc3VwcG9ydCBidXQgbm90IG1vcmUuCisKK1JlcXVpcmVkIGxlZCBzdWItbm9kZSBwcm9wZXJ0aWVzOgorLSByZWcgOiBudW1iZXIgb2YgTEVEIGxpbmUKKwlWYWxpZCB2YWx1ZXM6IDEgLSBudW1iZXIgb2YgbGVkcyBzdXBwb3J0ZWQgYnkgdGhlIGNoaXAgdmFyaWFudC4KKworT3B0aW9uYWwgbGVkIHN1Yi1ub2RlIHByb3BlcnRpZXM6CistIGxhYmVsIDogc2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQuCistIGxpbnV4LGRlZmF1bHQtdHJpZ2dlciA6CisJc2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQuCistIGxlZC1tYXgtbWljcm9hbXAgOiAob3B0aW9uYWwpCisJVmFsaWQgdmFsdWVzOiA1MDAwIC0gNDAwMDAsIHN0ZXAgYnkgNTAwMCAocm91bmRlZCBkb3duKQorCURlZmF1bHQ6IDIwMDAwICgyMCBtQSkKKwlOb3RlOiBhIGRyaXZlciB3aWxsIHRha2UgdGhlIGxvd2VzdCBvZiBhbGwgbGVkIGxpbWl0cyBzaW5jZSB0aGUKKwljaGlwIGhhcyBhIHNpbmdsZSBnbG9iYWwgc2V0dGluZy4gVGhlIGxvd2VzdCB2YWx1ZSB3aWxsIGJlIGNob3NlbgorCWR1ZSB0byB0aGUgUFdNIHNwZWNpZmljaXR5LCB3aGVyZSBsb3dlciBicmlnaHRuZXNzIGlzIGFjaGlldmVkCisJYnkgcmVkdWNpbmcgdGhlIGR1cnktY3ljbGUgb2YgcHVsc2VzIGFuZCBub3QgdGhlIGN1cnJlbnQsIHdoaWNoCisJd2lsbCBhbHdheXMgaGF2ZSBpdHMgcGVhayB2YWx1ZSBlcXVhbCB0byBsZWQtbWF4LW1pY3JvYW1wLgorCitFeGFtcGxlczoKKworZmFuY3lfbGVkczogbGVkc0A2NSB7CisJY29tcGF0aWJsZSA9ICJpc3NpLGlzMzFmbDMxOTYiOworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDA+OworCXJlZyA9IDwweDY1PjsKKworCXJlZF9hdXg6IGxlZEAxIHsKKwkJbGFiZWwgPSAicmVkOmF1eCI7CisJCXJlZyA9IDwxPjsKKwkJbGVkLW1heC1taWNyb2FtcCA9IDwxMDAwMD47CisJfTsKKworCWdyZWVuX3Bvd2VyOiBsZWRANSB7CisJCWxhYmVsID0gImdyZWVuOnBvd2VyIjsKKwkJcmVnID0gPDU+OworCQlsaW51eCxkZWZhdWx0LXRyaWdnZXIgPSAiZGVmYXVsdC1vbiI7CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLXBtODA1OC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLXBtODA1OC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1ODRjNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtcG04MDU4LnR4dApAQCAtMCwwICsxLDY3IEBACitRdWFsY29tbSBQTTgwNTggTEVEIGRyaXZlcgorCitUaGUgUXVhbGNvbW0gUE04MDU4IGlzIGEgbXVsdGktZnVuY3Rpb25hbCBkZXZpY2Ugd2hpY2ggY29udGFpbnMKK2FuIExFRCBkcml2ZXIgYmxvY2sgZm9yIHVwIHRvIHNpeCBMRURzOiB0aHJlZSBub3JtYWwgTEVEcywgdHdvCisiZmxhc2giIExFRHMgYW5kIG9uZSAia2V5cGFkIGJhY2tsaWdodCIgTEVELiBUaGUgbmFtZXMgYXJlCitxdW90ZWQgYmVjYXVzZSBzb21ldGltZXMgdGhlc2UgTEVEIGRyaXZlcnMgYXJlIHVzZWQgZm9yIHdpbGRseQorZGlmZmVyZW50IHRoaW5ncyB0aGFuIGZsYXNoIG9yIGtleXBhZCBiYWNrbGlnaHQ6IHRoZWlyIG5hbWVzCithcmUgbW9yZSBvZiBhIHN1Z2dlc3Rpb24gdGhhbiBhIGhhcmQtd2lyZWQgdXNlY2FzZS4KKworSGFyZHdhcmUtd2lzZSB0aGUgZGlmZmVyZW50IExFRHMgc3VwcG9ydCBzbGlnaHRseSBkaWZmZXJlbnQKK291dHB1dCBjdXJyZW50cy4gVGhlICJmbGFzaCIgTEVEcyBkbyBub3QgbmVlZCB0byBjaGFyZ2Ugbm9yCitkbyB0aGV5IHN1cHBvcnQgZXh0ZXJuYWwgdHJpZ2dlcnMuIFRoZXkgYXJlIGp1c3QgcG93ZXJmdWwgTEVECitkcml2ZXJzLgorCitUaGUgTEVEcyBhcHBlYXIgYXMgY2hpbGRyZW4gdG8gdGhlIFBNODA1OCBkZXZpY2UsIHdpdGggdGhlCitwcm9wZXIgY29tcGF0aWJsZSBzdHJpbmcuIEZvciB0aGUgUE04MDU4IGJpbmRpbmdzIHNlZToKK21mZC9xY29tLXBtOHh4eC50eHQuCisKK0VhY2ggTEVEIGlzIHJlcHJlc2VudGVkIGFzIGEgc3ViLW5vZGUgb2YgdGhlIHN5c2NvbiBkZXZpY2UuIEVhY2gKK25vZGUncyBuYW1lIHJlcHJlc2VudHMgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgTEVELgorCitMRUQgc3ViLW5vZGUgcHJvcGVydGllczoKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogb25lIG9mCisgICJxY29tLHBtODA1OC1sZWQiIChmb3IgdGhlIG5vcm1hbCBMRURzIGF0IDB4MTMxLCAweDEzMiBhbmQgMHgxMzMpCisgICJxY29tLHBtODA1OC1rZXlwYWQtbGVkIiAoZm9yIHRoZSAia2V5cGFkIiBMRUQgYXQgMHg0OCkKKyAgInFjb20scG04MDU4LWZsYXNoLWxlZCIgKGZvciB0aGUgImZsYXNoIiBMRURzIGF0IDB4NDkgYW5kIDB4RkIpCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGxhYmVsOiBzZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAorLSBkZWZhdWx0LXN0YXRlOiBzZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAorLSBsaW51eCxkZWZhdWx0LXRyaWdnZXI6IHNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0CisKK0V4YW1wbGU6CisKK3Fjb20sc3NiaUA1MDAwMDAgeworCXBtaWNpbnRjOiBwbWljQDAgeworCQljb21wYXRpYmxlID0gInFjb20scG04MDU4IjsKKwkJbGVkQDQ4IHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxwbTgwNTgta2V5cGFkLWxlZCI7CisJCQlyZWcgPSA8MHg0OD47CisJCQlsYWJlbCA9ICJwbTgwNTA6d2hpdGU6a2V5cGFkIjsKKwkJCWRlZmF1bHQtc3RhdGUgPSAib2ZmIjsKKwkJfTsKKwkJbGVkQDEzMSB7CisJCQljb21wYXRpYmxlID0gInFjb20scG04MDU4LWxlZCI7CisJCQlyZWcgPSA8MHgxMzE+OworCQkJbGFiZWwgPSAicG04MDU4OnJlZCI7CisJCQlkZWZhdWx0LXN0YXRlID0gIm9mZiI7CisJCX07CisJCWxlZEAxMzIgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLHBtODA1OC1sZWQiOworCQkJcmVnID0gPDB4MTMyPjsKKwkJCWxhYmVsID0gInBtODA1ODp5ZWxsb3ciOworCQkJZGVmYXVsdC1zdGF0ZSA9ICJvZmYiOworCQkJbGludXgsZGVmYXVsdC10cmlnZ2VyID0gIm1tYzAiOworCQl9OworCQlsZWRAMTMzIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxwbTgwNTgtbGVkIjsKKwkJCXJlZyA9IDwweDEzMz47CisJCQlsYWJlbCA9ICJwbTgwNTg6Z3JlZW4iOworCQkJZGVmYXVsdC1zdGF0ZSA9ICJvbiI7CisJCQlsaW51eCxkZWZhdWx0LXRyaWdnZXIgPSAiaGVhcnRiZWF0IjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL3JlZ2lzdGVyLWJpdC1sZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvcmVnaXN0ZXItYml0LWxlZC50eHQKaW5kZXggMzc5Y2VmZGMuLjU5YjU2MzYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL3JlZ2lzdGVyLWJpdC1sZWQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL3JlZ2lzdGVyLWJpdC1sZWQudHh0CkBAIC0yMywxMyArMjMsOCBAQAogICBzZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAogLSBsaW51eCxkZWZhdWx0LXRyaWdnZXIgOiAob3B0aW9uYWwpCiAgIHNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0Ci0tIGRlZmF1bHQtc3RhdGU6IChvcHRpb25hbCkgVGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIExFRC4gVmFsaWQKLSAgdmFsdWVzIGFyZSAib24iLCAib2ZmIiwgYW5kICJrZWVwIi4gSWYgdGhlIExFRCBpcyBhbHJlYWR5IG9uIG9yIG9mZgotICBhbmQgdGhlIGRlZmF1bHQtc3RhdGUgcHJvcGVydHkgaXMgc2V0IHRoZSB0byBzYW1lIHZhbHVlLCB0aGVuIG5vCi0gIGdsaXRjaCBzaG91bGQgYmUgcHJvZHVjZWQgd2hlcmUgdGhlIExFRCBtb21lbnRhcmlseSB0dXJucyBvZmYgKG9yCi0gIG9uKS4gVGhlICJrZWVwIiBzZXR0aW5nIHdpbGwga2VlcCB0aGUgTEVEIGF0IHdoYXRldmVyIGl0cyBjdXJyZW50Ci0gIHN0YXRlIGlzLCB3aXRob3V0IHByb2R1Y2luZyBhIGdsaXRjaC4gIFRoZSBkZWZhdWx0IGlzIG9mZiBpZiB0aGlzCi0gIHByb3BlcnR5IGlzIG5vdCBwcmVzZW50LgorLSBkZWZhdWx0LXN0YXRlOiAob3B0aW9uYWwpIFRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBMRUQKKyAgc2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQKIAogRXhhbXBsZToKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lbW9yeS1jb250cm9sbGVycy9mc2wvZGRyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZW1vcnktY29udHJvbGxlcnMvZnNsL2Rkci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlNmQ4MwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZW1vcnktY29udHJvbGxlcnMvZnNsL2Rkci50eHQKQEAgLTAsMCArMSwyOSBAQAorRnJlZXNjYWxlIEREUiBtZW1vcnkgY29udHJvbGxlcgorCitQcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGUJOiBTaG91bGQgaW5jbHVkZSAiZnNsLGNoaXAtbWVtb3J5LWNvbnRyb2xsZXIiIHdoZXJlCisJCSAgY2hpcCBpcyB0aGUgcHJvY2Vzc29yIChic2M5MTMyLCBtcGM4NTcyIGV0Yy4pLCBvcgorCQkgICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiLgorLSByZWcJCTogQWRkcmVzcyBhbmQgc2l6ZSBvZiBERFIgY29udHJvbGxlciByZWdpc3RlcnMKKy0gaW50ZXJydXB0cwk6IEVycm9yIGludGVycnVwdCBvZiBERFIgY29udHJvbGxlcgorLSBsaXR0bGUtZW5kaWFuCTogU3BlY2lmaWVzIGxpdHRsZS1lbmRpYW4gYWNjZXNzIHRvIHJlZ2lzdGVycworCQkgIElmIG9taXR0ZWQsIGJpZy1lbmRpYW4gd2lsbCBiZSB1c2VkLgorCitFeGFtcGxlIDE6CisKKwltZW1vcnktY29udHJvbGxlckAyMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsYnNjOTEzMi1tZW1vcnktY29udHJvbGxlciI7CisJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgOD47CisJfTsKKworCitFeGFtcGxlIDI6CisKKwlkZHIxOiBtZW1vcnktY29udHJvbGxlckA4MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNyIsCisJCQkJImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlciI7CisJCXJlZyA9IDwweDgwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjM+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL21heDc3NjkzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvbWF4Nzc2OTMudHh0CmluZGV4IGQzNDI1ODQuLjZhMWFlM2EgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvbWF4Nzc2OTMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvbWF4Nzc2OTMudHh0CkBAIC0xNywyOCArMTcsMjggQEAKIC0gaW50ZXJydXB0LXBhcmVudCA6ICBUaGUgcGFyZW50IGludGVycnVwdCBjb250cm9sbGVyLgogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgotLSByZWd1bGF0b3JzIDogVGhlIHJlZ3VsYXRvcnMgb2YgbWF4Nzc2OTMgaGF2ZSB0byBiZSBpbnN0YW50aWF0ZWQgdW5kZXIgc3Vibm9kCistIHJlZ3VsYXRvcnMgOiBUaGUgcmVndWxhdG9ycyBvZiBtYXg3NzY5MyBoYXZlIHRvIGJlIGluc3RhbnRpYXRlZCB1bmRlciBzdWJub2RlCiAgIG5hbWVkICJyZWd1bGF0b3JzIiB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm1hdC4KIAogCXJlZ3VsYXRvcnMgewotCQlyZWd1YWx0b3ItY29tcGF0aWJsZSA9IEVTQUZFT1VUMS9FU0FGRU9VVDIvQ0hBUkdFUgotCQlzdGFuZGFyZCByZWd1bGF0b3IgY29uc3RyYXRpbnRzWypdLgorCQlyZWd1bGF0b3ItY29tcGF0aWJsZSA9IEVTQUZFT1VUMS9FU0FGRU9VVDIvQ0hBUkdFUgorCQlzdGFuZGFyZCByZWd1bGF0b3IgY29uc3RyYWludHNbKl0uCiAJfTsKIAogCVsqXSByZWZlciBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3JlZ3VsYXRvci50eHQKIAogLSBoYXB0aWMgOiBUaGUgTUFYNzc2OTMgaGFwdGljIGRldmljZSB1dGlsaXNlcyBhIFBXTSBjb250cm9sbGVkIG1vdG9yIHRvIHByb3ZpZGUKICAgdXNlcnMgd2l0aCB0YWN0aWxlIGZlZWRiYWNrLiBQV00gcGVyaW9kIGFuZCBkdXR5LWN5Y2xlIGFyZSB2YXJpZWQgaW4KLSAgb3JkZXIgdG8gcHJvdmlkZSB0aGUgYXBwcm9wcml0ZSBsZXZlbCBvZiBmZWVkYmFjay4KKyAgb3JkZXIgdG8gcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgbGV2ZWwgb2YgZmVlZGJhY2suCiAKICBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotCS0gY29tcGF0aWJsZSA6IE11c3QgYmUgIm1heGltLG1heDc3NjkzLWhwYXRpYyIKKwktIGNvbXBhdGlibGUgOiBNdXN0IGJlICJtYXhpbSxtYXg3NzY5My1oYXB0aWMiCiAJLSBoYXB0aWMtc3VwcGx5IDogcG93ZXIgc3VwcGx5IGZvciB0aGUgaGFwdGljIG1vdG9yCiAJWypdIHJlZmVyIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcmVndWxhdG9yLnR4dAogCS0gcHdtcyA6IHBoYW5kbGUgdG8gdGhlIHBoeXNpY2FsIFBXTShQdWxzZSBXaWR0aCBNb2R1bGF0aW9uKSBkZXZpY2UuCiAJIFBXTSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBuYW1lZCAicHdtcyIuIEFuZCBudW1iZXIgb2YgY2VsbCBpcyBkaWZmZXJlbnQKIAkgZm9yIGVhY2ggcHdtIGRldmljZS4KLQkgVG8gZ2V0IG1vcmUgaW5mb3JtYXRpb25zLCBwbGVhc2UgcmVmZXIgdG8gZG9jdW1lbnRhaW9uLgorCSBUbyBnZXQgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIGRvY3VtZW50YXRpb24uCiAJWypdIHJlZmVyIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wd20vcHdtLnR4dAogCiAtIGNoYXJnZXIgOiBOb2RlIGNvbmZpZ3VyaW5nIHRoZSBjaGFyZ2VyIGRyaXZlci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvc3RtcGUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9zdG1wZS50eHQKaW5kZXggM2ZiNjhiZi4uZjkwNjVhNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9zdG1wZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9zdG1wZS50eHQKQEAgLTQsNyArNCw3IEBACiBrZXlwYWQsIHRvdWNoc2NyZWVuLCBhZGMsIHB3bSwgcm90YXRvci4KIAogUmVxdWlyZWQgcHJvcGVydGllczoKLSAtIGNvbXBhdGlibGUgICAgICAgICAgICAgICAgICAgOiAic3Qsc3RtcGVbNjEwfDgwMXw4MTF8MTYwMXwyNDAxfDI0MDNdIgorIC0gY29tcGF0aWJsZSAgICAgICAgICAgICAgICAgICA6ICJzdCxzdG1wZVs2MTB8ODAxfDgxMXwxNjAwfDE2MDF8MjQwMXwyNDAzXSIKICAtIHJlZyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJMkMvU1BJIGFkZHJlc3Mgb2YgdGhlIGRldmljZQogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9hcmFzYW4sc2RoY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9hcmFzYW4sc2RoY2kudHh0CmluZGV4IDM0MDRhZmEuLjQ5ZGY2MzAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvYXJhc2FuLHNkaGNpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL2FyYXNhbixzZGhjaS50eHQKQEAgLTM2LDYgKzM2LDkgQEAKICAgLSAjY2xvY2stY2VsbHM6IElmIHNwZWNpZmllZCB0aGlzIHNob3VsZCBiZSB0aGUgdmFsdWUgPDA+LiAgV2l0aCB0aGlzIHByb3BlcnR5CiAgICAgaW4gcGxhY2Ugd2Ugd2lsbCBleHBvcnQgYSBjbG9jayByZXByZXNlbnRpbmcgdGhlIENhcmQgQ2xvY2suICBUaGlzIGNsb2NrCiAgICAgaXMgZXhwZWN0ZWQgdG8gYmUgY29uc3VtZWQgYnkgb3VyIFBIWS4gIFlvdSBtdXN0IGFsc28gc3BlY2lmeQorICAtIHhsbngsZmFpbHMtd2l0aG91dC10ZXN0LWNkOiB3aGVuIHByZXNlbnQsIHRoZSBjb250cm9sbGVyIGRvZXNuJ3Qgd29yayB3aGVuCisgICAgdGhlIENEIGxpbmUgaXMgbm90IGNvbm5lY3RlZCBwcm9wZXJseSwgYW5kIHRoZSBsaW5lIGlzIG5vdCBjb25uZWN0ZWQKKyAgICBwcm9wZXJseS4gVGVzdCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZvcmNlIHRoZSBjb250cm9sbGVyIHRvIGZ1bmN0aW9uLgogCiBFeGFtcGxlOgogCXNkaGNpQGUwMTAwMDAwIHsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvYnJjbSxiY203NDI1LXNkaGNpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvYnJjbSxiY203NDI1LXNkaGNpLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4NDcxNy4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL2JyY20sYmNtNzQyNS1zZGhjaS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0qIEJST0FEQ09NIEJSQ01TVEIvQk1JUFMgU0RIQ0kgQ29udHJvbGxlcgotCi1UaGlzIGZpbGUgZG9jdW1lbnRzIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGNvcmUgcHJvcGVydGllcyBpbiBtbWMudHh0Ci1hbmQgdGhlIHByb3BlcnRpZXMgdXNlZCBieSB0aGUgc2RoY2ktYnJjbXN0YiBkcml2ZXIuCi0KLU5PVEU6IFRoZSBkcml2ZXIgZGlzYWJsZXMgYWxsIFVIUyBzcGVlZCBtb2RlcyBieSBkZWZhdWx0IGFuZCBkZXBlbmRzCi1vbiBEZXZpY2UgVHJlZSBwcm9wZXJ0aWVzIHRvIGVuYWJsZSB0aGVtIGZvciBTb0MvQm9hcmQgY29tYmluYXRpb25zCi10aGF0IHN1cHBvcnQgdGhlbS4KLQotUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogImJyY20sYmNtNzQyNS1zZGhjaSIKLQotUmVmZXIgdG8gY2xvY2tzL2Nsb2NrLWJpbmRpbmdzLnR4dCBmb3IgZ2VuZXJpYyBjbG9jayBjb25zdW1lciBwcm9wZXJ0aWVzLgotCi1FeGFtcGxlOgotCi0Jc2RoY2lAZjAzZTAxMDAgewotCQljb21wYXRpYmxlID0gImJyY20sYmNtNzQyNS1zZGhjaSI7Ci0JCXJlZyA9IDwweGYwM2UwMDAwIDB4MTAwPjsKLQkJaW50ZXJydXB0cyA9IDwweDAgMHgyNiAweDA+OwotCQlzZGhjaSxhdXRvLWNtZDEyOwotCQljbG9ja3MgPSA8JnN3X3NkaW8+OwotCQlzZC11aHMtc2RyNTA7Ci0JCXNkLXVocy1kZHI1MDsKLQl9OwotCi0Jc2RoY2lAZjAzZTAzMDAgewotCQlub24tcmVtb3ZhYmxlOwotCQlidXMtd2lkdGggPSA8MHg4PjsKLQkJY29tcGF0aWJsZSA9ICJicmNtLGJjbTc0MjUtc2RoY2kiOwotCQlyZWcgPSA8MHhmMDNlMDIwMCAweDEwMD47Ci0JCWludGVycnVwdHMgPSA8MHgwIDB4MjcgMHgwPjsKLQkJc2RoY2ksYXV0by1jbWQxMjsKLQkJY2xvY2tzID0gPHN3X3NkaW8+OwotCQltbWMtaHMyMDAtMV84djsKLQl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9icmNtLHNkaGNpLWJyY21zdGIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9icmNtLHNkaGNpLWJyY21zdGIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2I2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL2JyY20sc2RoY2ktYnJjbXN0Yi50eHQKQEAgLTAsMCArMSwzOCBAQAorKiBCUk9BRENPTSBCUkNNU1RCL0JNSVBTIFNESENJIENvbnRyb2xsZXIKKworVGhpcyBmaWxlIGRvY3VtZW50cyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBjb3JlIHByb3BlcnRpZXMgaW4gbW1jLnR4dAorYW5kIHRoZSBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIHNkaGNpLWJyY21zdGIgZHJpdmVyLgorCitOT1RFOiBUaGUgZHJpdmVyIGRpc2FibGVzIGFsbCBVSFMgc3BlZWQgbW9kZXMgYnkgZGVmYXVsdCBhbmQgZGVwZW5kcworb24gRGV2aWNlIFRyZWUgcHJvcGVydGllcyB0byBlbmFibGUgdGhlbSBmb3IgU29DL0JvYXJkIGNvbWJpbmF0aW9ucwordGhhdCBzdXBwb3J0IHRoZW0uCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IHNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZworICAtICJicmNtLGJjbTc0MjUtc2RoY2kiCisgIC0gImJyY20sYmNtNzQ0NS1zZGhjaSIKKworUmVmZXIgdG8gY2xvY2tzL2Nsb2NrLWJpbmRpbmdzLnR4dCBmb3IgZ2VuZXJpYyBjbG9jayBjb25zdW1lciBwcm9wZXJ0aWVzLgorCitFeGFtcGxlOgorCisJc2RoY2lAZjAzZTAxMDAgeworCQljb21wYXRpYmxlID0gImJyY20sYmNtNzQyNS1zZGhjaSI7CisJCXJlZyA9IDwweGYwM2UwMDAwIDB4MTAwPjsKKwkJaW50ZXJydXB0cyA9IDwweDAgMHgyNiAweDA+OworCQlzZGhjaSxhdXRvLWNtZDEyOworCQljbG9ja3MgPSA8JnN3X3NkaW8+OworCQlzZC11aHMtc2RyNTA7CisJCXNkLXVocy1kZHI1MDsKKwl9OworCisJc2RoY2lAZjAzZTAzMDAgeworCQlub24tcmVtb3ZhYmxlOworCQlidXMtd2lkdGggPSA8MHg4PjsKKwkJY29tcGF0aWJsZSA9ICJicmNtLGJjbTc0MjUtc2RoY2kiOworCQlyZWcgPSA8MHhmMDNlMDIwMCAweDEwMD47CisJCWludGVycnVwdHMgPSA8MHgwIDB4MjcgMHgwPjsKKwkJc2RoY2ksYXV0by1jbWQxMjsKKwkJY2xvY2tzID0gPHN3X3NkaW8+OworCQltbWMtaHMyMDAtMV84djsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9tbWMtcHdyc2VxLXNpbXBsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL21tYy1wd3JzZXEtc2ltcGxlLnR4dAppbmRleCBjZTBlNzY3Li5lMjU0MzY4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL21tYy1wd3JzZXEtc2ltcGxlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL21tYy1wd3JzZXEtc2ltcGxlLnR4dApAQCAtMTYsNiArMTYsOCBAQAogICBTZWUgLi4vY2xvY2tzL2Nsb2NrLWJpbmRpbmdzLnR4dCBmb3IgZGV0YWlscy4KIC0gY2xvY2stbmFtZXMgOiBNdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBlbnRyeToKICAgImV4dF9jbG9jayIgKEV4dGVybmFsIGNsb2NrIHByb3ZpZGVkIHRvIHRoZSBjYXJkKS4KKy0gcG9zdC1wb3dlci1vbi1kZWxheS1tcyA6IERlbGF5IGluIG1zIGFmdGVyIHBvd2VyaW5nIHRoZSBjYXJkIGFuZAorCWRlLWFzc2VydGluZyB0aGUgcmVzZXQtZ3Bpb3MgKGlmIGFueSkKIAogRXhhbXBsZToKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9tbWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9tbWMudHh0CmluZGV4IDIyZDFlMWYuLjhhMzc3ODIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvbW1jLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL21tYy50eHQKQEAgLTc1LDYgKzc1LDE3IEBACiAtIHdha2V1cC1zb3VyY2U6IEVuYWJsZXMgd2FrZSB1cCBvZiBob3N0IHN5c3RlbSBvbiBTRElPIElSUSBhc3NlcnRpb24KIAkJIChMZWdhY3kgcHJvcGVydHkgc3VwcG9ydGVkOiAiZW5hYmxlLXNkaW8td2FrZXVwIikKIAorTU1DIHBvd2VyCistLS0tLS0tLS0KKworQ29udHJvbGxlcnMgbWF5IGltcGxlbWVudCBwb3dlciBjb250cm9sIGZyb20gYm90aCB0aGUgY29ubmVjdGVkIGNhcmRzIGFuZAordGhlIElPIHNpZ25hbGluZyAoZm9yIGV4YW1wbGUgdG8gY2hhbmdlIHRvIGhpZ2gtc3BlZWQgMS44ViBzaWduYWxsaW5nKS4gSWYKK3RoZSBzeXN0ZW0gc3VwcG9ydHMgdGhpcywgdGhlbiB0aGUgZm9sbG93aW5nIHR3byBwcm9wZXJ0aWVzIHNob3VsZCBwb2ludAordG8gdmFsaWQgcmVndWxhdG9yIG5vZGVzOgorCistIHZxbW1jLXN1cHBseTogc3VwcGx5IG5vZGUgZm9yIElPIGxpbmUgcG93ZXIKKy0gdm1tYy1zdXBwbHk6IHN1cHBseSBub2RlIGZvciBjYXJkJ3MgcG93ZXIKKwogCiBNTUMgcG93ZXIgc2VxdWVuY2VzOgogLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEwMiwxMSArMTEzLDEzIEBACiAtICNzaXplLWNlbGxzOiBzaG91bGQgYmUgemVyby4KIAogUmVxdWlyZWQgZnVuY3Rpb24gc3Vibm9kZSBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlOiBuYW1lIG9mIFNESU8gZnVuY3Rpb24gZm9sbG93aW5nIGdlbmVyaWMgbmFtZXMgcmVjb21tZW5kZWQgcHJhY3RpY2UKIC0gcmVnOiBNdXN0IGNvbnRhaW4gdGhlIFNESU8gZnVuY3Rpb24gbnVtYmVyIG9mIHRoZSBmdW5jdGlvbiB0aGlzIHN1Ym5vZGUKICAgICAgICBkZXNjcmliZXMuIEEgdmFsdWUgb2YgMCBkZW5vdGVzIHRoZSBtZW1vcnkgU0QgZnVuY3Rpb24sIHZhbHVlcyBmcm9tCiAgICAgICAgMSB0byA3IGRlbm90ZSB0aGUgU0RJTyBmdW5jdGlvbnMuCiAKK09wdGlvbmFsIGZ1bmN0aW9uIHN1Ym5vZGUgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogbmFtZSBvZiBTRElPIGZ1bmN0aW9uIGZvbGxvd2luZyBnZW5lcmljIG5hbWVzIHJlY29tbWVuZGVkIHByYWN0aWNlCisKIAogRXhhbXBsZXMKIC0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3NkaGNpLXN0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvc2RoY2ktc3QudHh0CmluZGV4IDg4ZmFhOTEuLjNjZDRjNDMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvc2RoY2ktc3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvc2RoY2ktc3QudHh0CkBAIC0xMCw3ICsxMCw3IEBACiAJCQlzdWJzeXN0ZW0gKG1tY3NzKSBpbnNpZGUgdGhlIEZsYXNoU1MgKGF2YWlsYWJsZSBpbiBTVGlINDA3IFNvQwogCQkJZmFtaWx5KS4KIAotLSBjbG9jay1uYW1lczoJCVNob3VsZCBiZSAibW1jIi4KKy0gY2xvY2stbmFtZXM6CQlTaG91bGQgYmUgIm1tYyIgYW5kICJpY24iLiAgKE5COiBUaGUgbGF0dGVyIGlzIG5vdCBjb21wdWxzb3J5KQogCQkJU2VlOiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVzb3VyY2UtbmFtZXMudHh0CiAtIGNsb2NrczoJCVBoYW5kbGUgdG8gdGhlIGNsb2NrLgogCQkJU2VlOiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3N1bnhpLW1tYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3N1bnhpLW1tYy50eHQKaW5kZXggNGJmNDFkOC4uNTVjZGQ4MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9zdW54aS1tbWMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvc3VueGktbW1jLnR4dApAQCAtOCw3ICs4LDEyIEBACiBBYnNvbHV0ZSBtYXhpbXVtIHRyYW5zZmVyIHJhdGUgaXMgMjAwTUIvcwogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotIC0gY29tcGF0aWJsZSA6ICJhbGx3aW5uZXIsc3VuNGktYTEwLW1tYyIgb3IgImFsbHdpbm5lcixzdW41aS1hMTMtbW1jIgorIC0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSBvbmUgb2Y6CisgICAqICJhbGx3aW5uZXIsc3VuNGktYTEwLW1tYyIKKyAgICogImFsbHdpbm5lcixzdW41aS1hMTMtbW1jIgorICAgKiAiYWxsd2lubmVyLHN1bjdpLWEyMC1tbWMiCisgICAqICJhbGx3aW5uZXIsc3VuOWktYTgwLW1tYyIKKyAgICogImFsbHdpbm5lcixzdW41MGktYTY0LW1tYyIKICAtIHJlZyA6IG1tYyBjb250cm9sbGVyIGJhc2UgcmVnaXN0ZXJzCiAgLSBjbG9ja3MgOiBhIGxpc3Qgd2l0aCA0IHBoYW5kbGUgKyBjbG9jayBzcGVjaWZpZXIgcGFpcnMKICAtIGNsb2NrLW5hbWVzIDogbXVzdCBjb250YWluICJhaGIiLCAibW1jIiwgIm91dHB1dCIgYW5kICJzYW1wbGUiCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3N5bm9wc3lzLWR3LW1zaGMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9zeW5vcHN5cy1kdy1tc2hjLnR4dAppbmRleCA4NjM2ZjVhLi40ZTAwZTg1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3N5bm9wc3lzLWR3LW1zaGMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvc3lub3BzeXMtZHctbXNoYy50eHQKQEAgLTM5LDYgKzM5LDEwIEBACiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAKKyogcmVzZXRzOiBwaGFuZGxlICsgcmVzZXQgc3BlY2lmaWVyIHBhaXIsIGludGVuZGVkIHRvIHJlcHJlc2VudCBoYXJkd2FyZQorICByZXNldCBzaWduYWwgcHJlc2VudCBpbnRlcm5hbGx5IGluIHNvbWUgaG9zdCBjb250cm9sbGVyIElDIGRlc2lnbnMuCisgIFNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVzZXQvcmVzZXQudHh0IGZvciBkZXRhaWxzLgorCiAqIGNsb2NrczogZnJvbSBjb21tb24gY2xvY2sgYmluZGluZzogaGFuZGxlIHRvIGJpdSBhbmQgY2l1IGNsb2NrcyBmb3IgdGhlCiAgIGJ1cyBpbnRlcmZhY2UgdW5pdCBjbG9jayBhbmQgdGhlIGNhcmQgaW50ZXJmYWNlIHVuaXQgY2xvY2suCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvdG1pb19tbWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy90bWlvX21tYy50eHQKaW5kZXggMGY2MTBkNC4uMTNkZjljMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy90bWlvX21tYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy90bWlvX21tYy50eHQKQEAgLTIzLDYgKzIzLDcgQEAKIAkJInJlbmVzYXMsc2RoaS1yOGE3NzkzIiAtIFNESEkgSVAgb24gUjhBNzc5MyBTb0MKIAkJInJlbmVzYXMsc2RoaS1yOGE3Nzk0IiAtIFNESEkgSVAgb24gUjhBNzc5NCBTb0MKIAkJInJlbmVzYXMsc2RoaS1yOGE3Nzk1IiAtIFNESEkgSVAgb24gUjhBNzc5NSBTb0MKKwkJInJlbmVzYXMsc2RoaS1yOGE3Nzk2IiAtIFNESEkgSVAgb24gUjhBNzc5NiBTb0MKIAogT3B0aW9uYWwgcHJvcGVydGllczoKIC0gdG9zaGliYSxtbWMtd3Jwcm90ZWN0LWRpc2FibGU6IHdyaXRlLXByb3RlY3QgZGV0ZWN0aW9uIGlzIHVuYXZhaWxhYmxlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2FwbS14Z2VuZS1lbmV0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvYXBtLXhnZW5lLWVuZXQudHh0CmluZGV4IGU0MWIyZDUuLmY1OTFhYjcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvYXBtLXhnZW5lLWVuZXQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvYXBtLXhnZW5lLWVuZXQudHh0CkBAIC00Nyw2ICs0Nyw5IEBACiAJICAgIFZhbGlkIHZhbHVlcyBhcmUgYmV0d2VlbiAwIHRvIDcsIHRoYXQgbWFwcyB0bwogCSAgICAyNzMsIDU4OSwgODk5LCAxMjIyLCAxNDgwLCAxODA2LCAyMTQ3LCAyNDY0IHBzCiAJICAgIERlZmF1bHQgdmFsdWUgaXMgMiwgd2hpY2ggY29ycmVzcG9uZHMgdG8gODk5IHBzCistIHJ4bG9zLWdwaW9zOiBJbnB1dCBncGlvIGZyb20gU0ZQKyBtb2R1bGUgdG8gaW5kaWNhdGUgYXZhaWxhYmlsaXR5IG9mCisJICAgICAgIGluY29taW5nIHNpZ25hbC4KKwogCiBFeGFtcGxlOgogCW1lbmV0Y2xrOiBtZW5ldGNsayB7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2JyY20sYmNtNzQ0NS1zd2l0Y2gtdjQuMC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2JyY20sYmNtNzQ0NS1zd2l0Y2gtdjQuMC50eHQKaW5kZXggMzBkNDg3NS4uZmI0MDg5MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9icmNtLGJjbTc0NDUtc3dpdGNoLXY0LjAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvYnJjbSxiY203NDQ1LXN3aXRjaC12NC4wLnR4dApAQCAtNiw5ICs2LDEzIEBACiAtIHJlZzogYWRkcmVzc2VzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldHMgZm9yIHRoZSBkZXZpY2UsIG11c3QgYmUgNgogICBwYWlycyBvZiByZWdpc3RlciBhZGRyZXNzZXMgYW5kIGxlbmd0aHMKIC0gaW50ZXJydXB0czogaW50ZXJydXB0cyBmb3IgdGhlIGRldmljZXMsIG11c3QgYmUgdHdvIGludGVycnVwdHMKKy0gI2FkZHJlc3MtY2VsbHM6IG11c3QgYmUgMSwgc2VlIGRzYS9kc2EudHh0CistICNzaXplLWNlbGxzOiBtdXN0IGJlIDAsIHNlZSBkc2EvZHNhLnR4dAorCitEZXByZWNhdGVkIGJpbmRpbmcgcmVxdWlyZWQgcHJvcGVydGllczoKKwogLSBkc2EsbWlpLWJ1czogcGhhbmRsZSB0byB0aGUgTURJTyBidXMgY29udHJvbGxlciwgc2VlIGRzYS9kc2EudHh0CiAtIGRzYSxldGhlcm5ldDogcGhhbmRsZSB0byB0aGUgQ1BVIG5ldHdvcmsgaW50ZXJmYWNlIGNvbnRyb2xsZXIsIHNlZSBkc2EvZHNhLnR4dAotLSAjc2l6ZS1jZWxsczogbXVzdCBiZSAwCiAtICNhZGRyZXNzLWNlbGxzOiBtdXN0IGJlIDIsIHNlZSBkc2EvZHNhLnR4dAogCiBTdWJub2RlczoKQEAgLTQ4LDYgKzUyLDQ1IEBACiAJZXRoZXJuZXRfc3dpdGNoQDAgewogCQljb21wYXRpYmxlID0gImJyY20sYmNtNzQ0NS1zd2l0Y2gtdjQuMCI7CiAJCSNzaXplLWNlbGxzID0gPDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJcmVnID0gPDB4MCAweDQwMDAwCisJCQkweDQwMDAwIDB4MTEwCisJCQkweDQwMzQwIDB4MzAKKwkJCTB4NDAzODAgMHgzMAorCQkJMHg0MDQwMCAweDM0CisJCQkweDQwNjAwIDB4MjA4PjsKKwkJcmVnLW5hbWVzID0gImNvcmUiLCAicmVnIiwgaW50cmwyXzAiLCAiaW50cmwyXzEiLAorCQkJICAgICJmY2IsICJhY2IiOworCQlpbnRlcnJ1cHRzID0gPDAgMHgxOCAwCisJCQkJMCAweDE5IDA+OworCQlicmNtLG51bS1ncGh5ID0gPDE+OworCQlicmNtLG51bS1yZ21paS1wb3J0cyA9IDwyPjsKKwkJYnJjbSxmY2ItcGF1c2Utb3ZlcnJpZGU7CisJCWJyY20sYWNiLXBhY2tldHMtaW5mbGlnaHQ7CisKKwkJcG9ydHMgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQkJcG9ydEAwIHsKKwkJCQlsYWJlbCA9ICJncGh5IjsKKwkJCQlyZWcgPSA8MD47CisJCQl9OworCQl9OworCX07Cit9OworCitFeGFtcGxlIHVzaW5nIHRoZSBvbGQgRFNBIERldmljZVRyZWUgYmluZGluZzoKKworc3dpdGNoX3RvcEBmMGIwMDAwMCB7CisJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwlyYW5nZXMgPSA8MCAweGYwYjAwMDAwIDB4NDA4MDQ+OworCisJZXRoZXJuZXRfc3dpdGNoQDAgeworCQljb21wYXRpYmxlID0gImJyY20sYmNtNzQ0NS1zd2l0Y2gtdjQuMCI7CisJCSNzaXplLWNlbGxzID0gPDA+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKIAkJcmVnID0gPDB4MCAweDQwMDAwCiAJCQkweDQwMDAwIDB4MTEwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2RzYS9xY2E4ay50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2RzYS9xY2E4ay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2N2VlNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZHNhL3FjYThrLnR4dApAQCAtMCwwICsxLDg5IEBACisqIFF1YWxjb21tIEF0aGVyb3MgUUNBOHh4eCBzd2l0Y2ggZmFtaWx5CisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJxY2EscWNhODMzNyIKKy0gI3NpemUtY2VsbHM6IG11c3QgYmUgMAorLSAjYWRkcmVzcy1jZWxsczogbXVzdCBiZSAxCisKK1N1Ym5vZGVzOgorCitUaGUgaW50ZWdyYXRlZCBzd2l0Y2ggc3Vibm9kZSBzaG91bGQgYmUgc3BlY2lmaWVkIGFjY29yZGluZyB0byB0aGUgYmluZGluZworZGVzY3JpYmVkIGluIGRzYS9kc2EudHh0LiBBcyB0aGUgUUNBOEsgc3dpdGNoZXMgZG8gbm90IGhhdmUgYSBOOk4gbWFwcGluZyBvZgorcG9ydCBhbmQgUEhZIGlkLCBlYWNoIHN1Ym5vZGUgZGVzY3JpYmluZyBhIHBvcnQgbmVlZHMgdG8gaGF2ZSBhIHZhbGlkIHBoYW5kbGUKK3JlZmVyZW5jaW5nIHRoZSBpbnRlcm5hbCBQSFkgY29ubmVjdGVkIHRvIGl0LiBUaGUgQ1BVIHBvcnQgb2YgdGhpcyBzd2l0Y2ggaXMKK2Fsd2F5cyBwb3J0IDAuCisKK0V4YW1wbGU6CisKKworCSZtZGlvMCB7CisJCXBoeV9wb3J0MTogcGh5QDAgeworCQkJcmVnID0gPDA+OworCQl9OworCisJCXBoeV9wb3J0MjogcGh5QDEgeworCQkJcmVnID0gPDE+OworCQl9OworCisJCXBoeV9wb3J0MzogcGh5QDIgeworCQkJcmVnID0gPDI+OworCQl9OworCisJCXBoeV9wb3J0NDogcGh5QDMgeworCQkJcmVnID0gPDM+OworCQl9OworCisJCXBoeV9wb3J0NTogcGh5QDQgeworCQkJcmVnID0gPDQ+OworCQl9OworCisJCXN3aXRjaDBAMCB7CisJCQljb21wYXRpYmxlID0gInFjYSxxY2E4MzM3IjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJCXJlZyA9IDwwPjsKKworCQkJcG9ydHMgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCXBvcnRAMCB7CisJCQkJCXJlZyA9IDwwPjsKKwkJCQkJbGFiZWwgPSAiY3B1IjsKKwkJCQkJZXRoZXJuZXQgPSA8JmdtYWMxPjsKKwkJCQkJcGh5LW1vZGUgPSAicmdtaWkiOworCQkJCX07CisKKwkJCQlwb3J0QDEgeworCQkJCQlyZWcgPSA8MT47CisJCQkJCWxhYmVsID0gImxhbjEiOworCQkJCQlwaHktaGFuZGxlID0gPCZwaHlfcG9ydDE+OworCQkJCX07CisKKwkJCQlwb3J0QDIgeworCQkJCQlyZWcgPSA8Mj47CisJCQkJCWxhYmVsID0gImxhbjIiOworCQkJCQlwaHktaGFuZGxlID0gPCZwaHlfcG9ydDI+OworCQkJCX07CisKKwkJCQlwb3J0QDMgeworCQkJCQlyZWcgPSA8Mz47CisJCQkJCWxhYmVsID0gImxhbjMiOworCQkJCQlwaHktaGFuZGxlID0gPCZwaHlfcG9ydDM+OworCQkJCX07CisKKwkJCQlwb3J0QDQgeworCQkJCQlyZWcgPSA8ND47CisJCQkJCWxhYmVsID0gImxhbjQiOworCQkJCQlwaHktaGFuZGxlID0gPCZwaHlfcG9ydDQ+OworCQkJCX07CisKKwkJCQlwb3J0QDUgeworCQkJCQlyZWcgPSA8NT47CisJCQkJCWxhYmVsID0gIndhbiI7CisJCQkJCXBoeS1oYW5kbGUgPSA8JnBoeV9wb3J0NT47CisJCQkJfTsKKwkJCX07CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZXRoZXJuZXQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9ldGhlcm5ldC50eHQKaW5kZXggNWQ4OGYzNy4uZTFkNzY4MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9ldGhlcm5ldC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9ldGhlcm5ldC50eHQKQEAgLTExLDggKzExLDggQEAKICAgdGhlIG1heGltdW0gZnJhbWUgc2l6ZSAodGhlcmUncyBjb250cmFkaWN0aW9uIGluIGVQQVBSKS4KIC0gcGh5LW1vZGU6IHN0cmluZywgb3BlcmF0aW9uIG1vZGUgb2YgdGhlIFBIWSBpbnRlcmZhY2U7IHN1cHBvcnRlZCB2YWx1ZXMgYXJlCiAgICJtaWkiLCAiZ21paSIsICJzZ21paSIsICJxc2dtaWkiLCAidGJpIiwgInJldi1taWkiLCAicm1paSIsICJyZ21paSIsICJyZ21paS1pZCIsCi0gICJyZ21paS1yeGlkIiwgInJnbWlpLXR4aWQiLCAicnRiaSIsICJzbWlpIiwgInhnbWlpIjsgdGhpcyBpcyBub3cgYSBkZS1mYWN0bwotICBzdGFuZGFyZCBwcm9wZXJ0eTsKKyAgInJnbWlpLXJ4aWQiLCAicmdtaWktdHhpZCIsICJydGJpIiwgInNtaWkiLCAieGdtaWkiLCAidHJnbWlpIjsgdGhpcyBpcyBub3cgYQorICBkZS1mYWN0byBzdGFuZGFyZCBwcm9wZXJ0eTsKIC0gcGh5LWNvbm5lY3Rpb24tdHlwZTogdGhlIHNhbWUgYXMgInBoeS1tb2RlIiBwcm9wZXJ0eSBidXQgZGVzY3JpYmVkIGluIGVQQVBSOwogLSBwaHktaGFuZGxlOiBwaGFuZGxlLCBzcGVjaWZpZXMgYSByZWZlcmVuY2UgdG8gYSBub2RlIHJlcHJlc2VudGluZyBhIFBIWQogICBkZXZpY2U7IHRoaXMgcHJvcGVydHkgaXMgZGVzY3JpYmVkIGluIGVQQVBSIGFuZCBzbyBwcmVmZXJyZWQ7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21hY2IudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9tYWNiLnR4dAppbmRleCBiNWE0MmRmLi4xNTA2ZTk0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21hY2IudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbWFjYi50eHQKQEAgLTIxLDYgKzIxLDcgQEAKIC0gY2xvY2stbmFtZXM6IFR1cGxlIGxpc3RpbmcgaW5wdXQgY2xvY2sgbmFtZXMuCiAJUmVxdWlyZWQgZWxlbWVudHM6ICdwY2xrJywgJ2hjbGsnCiAJT3B0aW9uYWwgZWxlbWVudHM6ICd0eF9jbGsnCisJT3B0aW9uYWwgZWxlbWVudHM6ICdyeF9jbGsnIGFwcGxpZXMgdG8gY2Rucyx6eW5xbXAtZ2VtCiAtIGNsb2NrczogUGhhbmRsZXMgdG8gaW5wdXQgY2xvY2tzLgogCiBPcHRpb25hbCBwcm9wZXJ0aWVzIGZvciBQSFkgY2hpbGQgbm9kZToKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbWVkaWF0ZWstbmV0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbWVkaWF0ZWstbmV0LnR4dAppbmRleCAzMmVhYWNhLi5mMDk1MjU3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21lZGlhdGVrLW5ldC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9tZWRpYXRlay1uZXQudHh0CkBAIC0yNCwxNCArMjQsMTcgQEAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAtIGludGVycnVwdC1wYXJlbnQ6IFNob3VsZCBiZSB0aGUgcGhhbmRsZSBmb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVyCiAgIHRoYXQgc2VydmljZXMgaW50ZXJydXB0cyBmb3IgdGhpcyBkZXZpY2UKLQorLSBtZWRpYXRlayxod2xybzogdGhlIGNhcGFiaWxpdHkgaWYgdGhlIGhhcmR3YXJlIHN1cHBvcnRzIExSTyBmdW5jdGlvbnMKIAogKiBFdGhlcm5ldCBNQUMgbm9kZQogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgIm1lZGlhdGVrLGV0aC1tYWMiCiAtIHJlZzogVGhlIG51bWJlciBvZiB0aGUgTUFDCi0tIHBoeS1oYW5kbGU6IHNlZSBldGhlcm5ldC50eHQgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCistIHBoeS1oYW5kbGU6IHNlZSBldGhlcm5ldC50eHQgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYW5kCisJdGhlIHBoeS1tb2RlICJ0cmdtaWkiIHJlcXVpcmVkIGJlaW5nIHByb3ZpZGVkIHdoZW4gcmVnCisJaXMgZXF1YWwgdG8gMCBhbmQgdGhlIE1BQyB1c2VzIGZpeGVkLWxpbmsgdG8gY29ubmVjdAorCXdpdGggaW50ZXJuYWwgc3dpdGNoIHN1Y2ggYXMgTVQ3NTMwLgogCiBFeGFtcGxlOgogCkBAIC01MSw2ICs1NCw3IEBACiAJcmVzZXQtbmFtZXMgPSAiZXRoIjsKIAltZWRpYXRlayxldGhzeXMgPSA8JmV0aHN5cz47CiAJbWVkaWF0ZWsscGN0bCA9IDwmc3lzY2ZnX3BjdGxfYT47CisJbWVkaWF0ZWssaHdscm87CiAJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJI3NpemUtY2VsbHMgPSA8MD47CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbXNjYy1waHktdnNjODUzMS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21zY2MtcGh5LXZzYzg1MzEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YzdlYjAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21zY2MtcGh5LXZzYzg1MzEudHh0CkBAIC0wLDAgKzEsNTggQEAKKyogTWljcm9zZW1pIC0gdnNjODUzMSBHaWdhIGJpdCBldGhlcm5ldCBwaHkKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZQk6IFNob3VsZCBjb250YWluIHBoeSBpZCBhcyAiZXRoZXJuZXQtcGh5LWlkQUFBQS5CQkJCIgorCQkgIFRoZSBQSFkgZGV2aWNlIHVzZXMgdGhlIGJpbmRpbmcgZGVzY3JpYmVkIGluCisJCSAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9waHkudHh0CisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHZzYzg1MzEsdmRkbWFjCTogVGhlIHZkZG1hYyBpbiBtVi4KKy0gdnNjODUzMSxlZGdlLXNsb3dkb3duCTogJSB0aGUgZWRnZSBzaG91bGQgYmUgc2xvd2VkIGRvd24gcmVsYXRpdmUgdG8KKwkJCSAgdGhlIGZhc3Rlc3QgcG9zc2libGUgZWRnZSB0aW1lLiBOYXRpdmUgc2lnbgorCQkJICBuZWVkIG5vdCBlbnRlci4KKwkJCSAgRWRnZSByYXRlIHNldHMgdGhlIGRyaXZlIHN0cmVuZ3RoIG9mIHRoZSBNQUMKKwkJCSAgaW50ZXJmYWNlIG91dHB1dCBzaWduYWxzLiAgQ2hhbmdpbmcgdGhlIGRyaXZlCisJCQkgIHN0cmVuZ3RoIHdpbGwgYWZmZWN0IHRoZSBlZGdlIHJhdGUgb2YgdGhlIG91dHB1dAorCQkJICBzaWduYWwuICBUaGUgZ29hbCBvZiB0aGlzIHNldHRpbmcgaXMgdG8gaGVscAorCQkJICByZWR1Y2UgZWxlY3RyaWNhbCBlbWlzc2lvbiAoRU1JKSBieSBiZWluZyBhYmxlCisJCQkgIHRvIHJlcHJvZ3JhbSBkcml2ZSBzdHJlbmd0aCBhbmQgaW4gZWZmZWN0IHNsb3cKKwkJCSAgZG93biB0aGUgZWRnZSByYXRlIGlmIGRlc2lyZWQuICBUYWJsZSAxIHNob3dzIHRoZQorCQkJICBpbXBhY3QgdG8gdGhlIGVkZ2UgcmF0ZSBwZXIgVkRETUFDIHN1cHBseSBmb3IgZWFjaAorCQkJICBkcml2ZSBzdHJlbmd0aCBzZXR0aW5nLgorCQkJICBSZWY6IFRhYmxlOjEgLSBFZGdlIHJhdGUgY2hhbmdlIGJlbG93LgorCitOb3RlOiBzZWUgZHQtYmluZGluZ3MvbmV0L21zY2MtcGh5LXZzYzg1MzEuaCBmb3IgYXBwbGljYWJsZSB2YWx1ZXMKKworVGFibGU6IDEgLSBFZGdlIHJhdGUgY2hhbmdlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCAJCUVkZ2UgUmF0ZSBDaGFuZ2UgKFZERE1BQykJCQl8Cit8CQkJCQkJCQl8Cit8IDMzMDAgbVYJMjUwMCBtVgkJMTgwMCBtVgkJMTUwMCBtVgkJfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgRGVmYXVsdAlEZWFmdWx0CQlEZWZhdWx0CQlEZWZhdWx0CQl8Cit8IChGYXN0ZXN0KQkJCShyZWNvbW1lbmRlZCkJKHJlY29tbWVuZGVkKQl8Cit8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCAtMiUJCS0zJQkJLTUlCQktNiUJCXwKK3wtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IC00JQkJLTYlCQktOSUJCS0xNCUJCXwKK3wtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IC03JQkJLTEwJQkJLTE2JQkJLTIxJQkJfAorfChyZWNvbW1lbmRlZCkJKHJlY29tbWVuZGVkKQkJCQkJfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgLTEwJQkJLTE0JQkJLTIzJQkJLTI5JQkJfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgLTE3JQkJLTIzJQkJLTM1JQkJLTQyJQkJfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgLTI5JQkJLTM3JQkJLTUyJQkJLTU4JQkJfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgLTUzJQkJLTYzJQkJLTc2JQkJLTc3JQkJfAorfCAoc2xvd2VzdCkJCQkJCQkJfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKworRXhhbXBsZToKKworICAgICAgICB2c2M4NTMxXzA6IGV0aGVybmV0LXBoeUAwIHsKKyAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gImV0aGVybmV0LXBoeS1pZDAwMDcuMDU3MCI7CisgICAgICAgICAgICAgICAgdnNjODUzMSx2ZGRtYWMJCT0gPDMzMDA+OworICAgICAgICAgICAgICAgIHZzYzg1MzEsZWRnZS1zbG93ZG93bgk9IDwyMT47CisgICAgICAgIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3Fjb20tZW1hYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3Fjb20tZW1hYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ2ZTZjNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcWNvbS1lbWFjLnR4dApAQCAtMCwwICsxLDExMSBAQAorUXVhbGNvbW0gVGVjaG5vbG9naWVzIEVNQUMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyCisKK1RoaXMgbmV0d29yayBjb250cm9sbGVyIGNvbnNpc3RzIG9mIHR3byBkZXZpY2VzOiBhIE1BQyBhbmQgYW4gU0dNSUkKK2ludGVybmFsIFBIWS4gIEVhY2ggZGV2aWNlIGlzIHJlcHJlc2VudGVkIGJ5IGEgZGV2aWNlIHRyZWUgbm9kZS4gIEEgcGhhbmRsZQorY29ubmVjdHMgdGhlIE1BQyBub2RlIHRvIGl0cyBjb3JyZXNwb25kaW5nIGludGVybmFsIHBoeSBub2RlLiAgQW5vdGhlcgorcGhhbmRsZSBwb2ludHMgdG8gdGhlIGV4dGVybmFsIFBIWSBub2RlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCitNQUMgbm9kZToKKy0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAicWNvbSxmc205OTAwLWVtYWMiLgorLSByZWcgOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgcmVnaW9ucyBmb3IgdGhlIGRldmljZQorLSBpbnRlcnJ1cHRzIDogSW50ZXJydXB0IG51bWJlciB1c2VkIGJ5IHRoaXMgY29udHJvbGxlcgorLSBtYWMtYWRkcmVzcyA6IFRoZSA2LWJ5dGUgTUFDIGFkZHJlc3MuIElmIHByZXNlbnQsIGl0IGlzIHRoZSBkZWZhdWx0CisJTUFDIGFkZHJlc3MuCistIGludGVybmFsLXBoeSA6IHBoYW5kbGUgdG8gdGhlIGludGVybmFsIFBIWSBub2RlCistIHBoeS1oYW5kbGUgOiBwaGFuZGxlIHRoZSB0aGUgZXh0ZXJuYWwgUEhZIG5vZGUKKworSW50ZXJuYWwgUEhZIG5vZGU6CistIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgInFjb20sZnNtOTkwMC1lbWFjLXNnbWlpIiBvciAicWNvbSxxZGYyNDMyLWVtYWMtc2dtaWkiLgorLSByZWcgOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgcmVnaW9uKHMpIGZvciB0aGUgZGV2aWNlCistIGludGVycnVwdHMgOiBJbnRlcnJ1cHQgbnVtYmVyIHVzZWQgYnkgdGhpcyBjb250cm9sbGVyCisKK1RoZSBleHRlcm5hbCBwaHkgY2hpbGQgbm9kZToKKy0gcmVnIDogVGhlIHBoeSBhZGRyZXNzCisKK0V4YW1wbGU6CisKK0ZTTTk5MDA6CisKK3NvYyB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisKKwllbWFjMDogZXRoZXJuZXRAZmViMjAwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sZnNtOTkwMC1lbWFjIjsKKwkJcmVnID0gPDB4ZmViMjAwMDAgMHgxMDAwMD4sCisJCSAgICAgIDwweGZlYjM2MDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8NzY+OworCisJCWNsb2NrcyA9IDwmZ2NjIDA+LCA8JmdjYyAxPiwgPCZnY2MgMz4sIDwmZ2NjIDQ+LCA8JmdjYyA1PiwKKwkJCTwmZ2NjIDY+LCA8JmdjYyA3PjsKKwkJY2xvY2stbmFtZXMgPSAiYXhpX2NsayIsICJjZmdfYWhiX2NsayIsICJoaWdoX3NwZWVkX2NsayIsCisJCQkibWRpb19jbGsiLCAidHhfY2xrIiwgInJ4X2NsayIsICJzeXNfY2xrIjsKKworCQlpbnRlcm5hbC1waHkgPSA8JmVtYWNfc2dtaWk+OworCisJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OworCisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJcGh5MDogZXRoZXJuZXQtcGh5QDAgeworCQkJcmVnID0gPDA+OworCQl9OworCisJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJCXBpbmN0cmwtMCA9IDwmbWRpb19waW5zX2E+OworCX07CisKKwllbWFjX3NnbWlpOiBldGhlcm5ldEBmZWIzODAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxmc205OTAwLWVtYWMtc2dtaWkiOworCQlyZWcgPSA8MHhmZWIzODAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDgwPjsKKwl9OworCisJdGxtbTogcGluY3RybEBmZDUxMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxmc205OTAwLXBpbmN0cmwiOworCisJCW1kaW9fcGluc19hOiBtZGlvIHsKKwkJCXN0YXRlIHsKKwkJCQlwaW5zID0gImdwaW8xMjMiLCAiZ3BpbzEyNCI7CisJCQkJZnVuY3Rpb24gPSAibWRpbyI7CisJCQl9OworCQl9OworCX07CisKKworUURGMjQzMjoKKworc29jIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKworCWVtYWMwOiBldGhlcm5ldEAzODgwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxmc205OTAwLWVtYWMiOworCQlyZWcgPSA8MHgwIDB4Mzg4MDAwMDAgMHgwIDB4MTAwMDA+LAorCQkgICAgICA8MHgwIDB4Mzg4MTYwMDAgMHgwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MCAyNTYgND47CisKKwkJY2xvY2tzID0gPCZnY2MgMD4sIDwmZ2NjIDE+LCA8JmdjYyAzPiwgPCZnY2MgND4sIDwmZ2NjIDU+LAorCQkJIDwmZ2NjIDY+LCA8JmdjYyA3PjsKKwkJY2xvY2stbmFtZXMgPSAiYXhpX2NsayIsICJjZmdfYWhiX2NsayIsICJoaWdoX3NwZWVkX2NsayIsCisJCQkibWRpb19jbGsiLCAidHhfY2xrIiwgInJ4X2NsayIsICJzeXNfY2xrIjsKKworCQlpbnRlcm5hbC1waHkgPSA8JmVtYWNfc2dtaWk+OworCisJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OworCisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJcGh5MDogZXRoZXJuZXQtcGh5QDQgeworCQkJcmVnID0gPDQ+OworCQl9OworCX07CisKKwllbWFjX3NnbWlpOiBldGhlcm5ldEA0MTA0MDAgeworCQljb21wYXRpYmxlID0gInFjb20scWRmMjQzMi1lbWFjLXNnbWlpIjsKKwkJcmVnID0gPDB4MCAweDAwNDEwNDAwIDB4MCAweGMwMD4sIC8qIEJhc2UgYWRkcmVzcyAqLworCQkgICAgICA8MHgwIDB4MDA0MTAwMDAgMHgwIDB4NDAwPjsgLyogUGVyLWxhbmUgZGlnaXRhbCAqLworCQlpbnRlcnJ1cHRzID0gPDAgMjU0IDE+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3JvY2tjaGlwLWR3bWFjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcm9ja2NoaXAtZHdtYWMudHh0CmluZGV4IGNjY2Q5NDUuLjk1MzgzYzUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcm9ja2NoaXAtZHdtYWMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcm9ja2NoaXAtZHdtYWMudHh0CkBAIC0zLDggKzMsMTIgQEAKIFRoZSBkZXZpY2Ugbm9kZSBoYXMgZm9sbG93aW5nIHByb3BlcnRpZXMuCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0gLSBjb21wYXRpYmxlOiBDYW4gYmUgb25lIG9mICJyb2NrY2hpcCxyazMyMjgtZ21hYyIsICJyb2NrY2hpcCxyazMyODgtZ21hYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb2NrY2hpcCxyazMzNjgtZ21hYyIKKyAtIGNvbXBhdGlibGU6IHNob3VsZCBiZSAicm9ja2NoaXAsPG5hbWU+LWdhbWMiCisgICAicm9ja2NoaXAscmszMjI4LWdtYWMiOiBmb3VuZCBvbiBSSzMyMnggU29DcworICAgInJvY2tjaGlwLHJrMzI4OC1nbWFjIjogZm91bmQgb24gUkszMjg4IFNvQ3MKKyAgICJyb2NrY2hpcCxyazMzNjYtZ21hYyI6IGZvdW5kIG9uIFJLMzM2NiBTb0NzCisgICAicm9ja2NoaXAscmszMzY4LWdtYWMiOiBmb3VuZCBvbiBSSzMzNjggU29DcworICAgInJvY2tjaGlwLHJrMzM5OS1nbWFjIjogZm91bmQgb24gUkszMzk5IFNvQ3MKICAtIHJlZzogYWRkcmVzc2VzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldHMgZm9yIHRoZSBkZXZpY2UuCiAgLSBpbnRlcnJ1cHRzOiBTaG91bGQgY29udGFpbiB0aGUgR01BQyBpbnRlcnJ1cHRzLgogIC0gaW50ZXJydXB0LW5hbWVzOiBTaG91bGQgY29udGFpbiB0aGUgaW50ZXJydXB0IG5hbWVzICJtYWNpcnEiLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zaF9ldGgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zaF9ldGgudHh0CmluZGV4IDJmNmVjODUuLjAxMTVjODUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc2hfZXRoLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3NoX2V0aC50eHQKQEAgLTUsNiArNSw4IEBACiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAtIGNvbXBhdGlibGU6ICJyZW5lc2FzLGdldGhlci1yOGE3NzQwIiBpZiB0aGUgZGV2aWNlIGlzIGEgcGFydCBvZiBSOEE3NzQwIFNvQy4KKwkgICAgICAicmVuZXNhcyxldGhlci1yOGE3NzQzIiAgaWYgdGhlIGRldmljZSBpcyBhIHBhcnQgb2YgUjhBNzc0MyBTb0MuCisJICAgICAgInJlbmVzYXMsZXRoZXItcjhhNzc0NSIgIGlmIHRoZSBkZXZpY2UgaXMgYSBwYXJ0IG9mIFI4QTc3NDUgU29DLgogCSAgICAgICJyZW5lc2FzLGV0aGVyLXI4YTc3NzgiICBpZiB0aGUgZGV2aWNlIGlzIGEgcGFydCBvZiBSOEE3Nzc4IFNvQy4KIAkgICAgICAicmVuZXNhcyxldGhlci1yOGE3Nzc5IiAgaWYgdGhlIGRldmljZSBpcyBhIHBhcnQgb2YgUjhBNzc3OSBTb0MuCiAJICAgICAgInJlbmVzYXMsZXRoZXItcjhhNzc5MCIgIGlmIHRoZSBkZXZpY2UgaXMgYSBwYXJ0IG9mIFI4QTc3OTAgU29DLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zbXNjOTExeC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3Ntc2M5MTF4LnR4dAppbmRleCAzZmVkM2MxLi4xNmMzYTk1MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zbXNjOTExeC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zbXNjOTExeC50eHQKQEAgLTMsOSArMywxMSBAQAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAic21zYyxsYW48bW9kZWw+IiwgInNtc2MsbGFuOTExNSIKIC0gcmVnIDogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSBpbyBzcGFjZSBmb3IgU01TQyBMQU4KLS0gaW50ZXJydXB0cyA6IFNob3VsZCBjb250YWluIFNNU0MgTEFOIGludGVycnVwdCBsaW5lCi0tIGludGVycnVwdC1wYXJlbnQgOiBTaG91bGQgYmUgdGhlIHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcgotICB0aGF0IHNlcnZpY2VzIGludGVycnVwdHMgZm9yIHRoaXMgZGV2aWNlCistIGludGVycnVwdHMgOiBvbmUgb3IgdHdvIGludGVycnVwdCBzcGVjaWZpZXJzCisgIC0gVGhlIGZpcnN0IGludGVycnVwdCBpcyB0aGUgU01TQyBMQU4gaW50ZXJydXB0IGxpbmUKKyAgLSBUaGUgc2Vjb25kIGludGVycnVwdCAoaWYgcHJlc2VudCkgaXMgdGhlIFBNRSAocG93ZXIKKyAgICBtYW5hZ2VtZW50IGV2ZW50KSBpbnRlcnJ1cHQgdGhhdCBpcyBhYmxlIHRvIHdha2UgdXAgdGhlIGhvc3QKKyAgICAgc3lzdGVtIHdpdGggYSA1MG1zIHB1bHNlIG9uIG5ldHdvcmsgYWN0aXZpdHkKIC0gcGh5LW1vZGUgOiBTZWUgZXRoZXJuZXQudHh0IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5CiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CkBAIC0yMSw2ICsyMywxMCBAQAogICBleHRlcm5hbCBQSFkKIC0gc21zYyxzYXZlLW1hYy1hZGRyZXNzIDogSW5kaWNhdGVzIHRoYXQgbWFjIGFkZHJlc3MgbmVlZHMgdG8gYmUgc2F2ZWQKICAgYmVmb3JlIHJlc2V0dGluZyB0aGUgY29udHJvbGxlcgorLSByZXNldC1ncGlvcyA6IGEgR1BJTyBsaW5lIGNvbm5lY3RlZCB0byB0aGUgUkVTRVQgKGFjdGl2ZSBsb3cpIHNpZ25hbAorICBvZiB0aGUgZGV2aWNlLiBPbiBtYW55IHN5c3RlbXMgdGhpcyBpcyB3aXJlZCBoaWdoIHNvIHRoZSBkZXZpY2UgZ29lcworICBvdXQgb2YgcmVzZXQgYXQgcG93ZXItb24sIGJ1dCBpZiBpdCBpcyB1bmRlciBwcm9ncmFtIGNvbnRyb2wsIHRoaXMKKyAgb3B0aW9uYWwgR1BJTyBjYW4gd2FrZSB1cCBpbiByZXNwb25zZSB0byBpdC4KIAogRXhhbXBsZXM6CiAKQEAgLTI5LDcgKzM1LDggQEAKIAlyZWcgPSA8MHhmNDAwMDAwMCAweDIwMDAwMDA+OwogCXBoeS1tb2RlID0gIm1paSI7CiAJaW50ZXJydXB0LXBhcmVudCA9IDwmZ3BpbzE+OwotCWludGVycnVwdHMgPSA8MzE+OworCWludGVycnVwdHMgPSA8MzE+LCA8MzI+OworCXJlc2V0LWdwaW9zID0gPCZncGlvMSAzMCBHUElPX0FDVElWRV9MT1c+OwogCXJlZy1pby13aWR0aCA9IDw0PjsKIAlzbXNjLGlycS1wdXNoLXB1bGw7CiB9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zbnBzLGR3Yy1xb3MtZXRoZXJuZXQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zbnBzLGR3Yy1xb3MtZXRoZXJuZXQudHh0CmluZGV4IDUxZjhkMmUuLmQ5M2Y3MWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc25wcyxkd2MtcW9zLWV0aGVybmV0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3NucHMsZHdjLXFvcy1ldGhlcm5ldC50eHQKQEAgLTEsMjEgKzEsMTExIEBACiAqIFN5bm9wc3lzIERXQyBFdGhlcm5ldCBRb1MgSVAgdmVyc2lvbiA0LjEwIGRyaXZlciAoR01BQykKIAorVGhpcyBiaW5kaW5nIHN1cHBvcnRzIHRoZSBTeW5vcHN5cyBEZXNpZ253YXJlIEV0aGVybmV0IFFvUyAoUXVhbGl0eSBPZiBTZXJ2aWNlKQorSVAgYmxvY2suIFRoZSBJUCBzdXBwb3J0cyBtdWx0aXBsZSBvcHRpb25zIGZvciBidXMgdHlwZSwgY2xvY2tpbmcgYW5kIHJlc2V0CitzdHJ1Y3R1cmUsIGFuZCBmZWF0dXJlIGxpc3QuIENvbnNlcXVlbnRseSwgYSBudW1iZXIgb2YgcHJvcGVydGllcyBhbmQgbGlzdAorZW50cmllcyBpbiBwcm9wZXJ0aWVzIGFyZSBtYXJrZWQgYXMgb3B0aW9uYWwsIG9yIG9ubHkgcmVxdWlyZWQgaW4gc3BlY2lmaWMgSFcKK2NvbmZpZ3VyYXRpb25zLgogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgInNucHMsZHdjLXFvcy1ldGhlcm5ldC00LjEwIgorLSBjb21wYXRpYmxlOiBPbmUgb2Y6CisgIC0gImF4aXMsYXJ0cGVjNi1lcW9zIiwgInNucHMsZHdjLXFvcy1ldGhlcm5ldC00LjEwIgorICAgIFJlcHJlc2VudHMgdGhlIElQIGNvcmUgd2hlbiBpbnRlZ3JhdGVkIGludG8gdGhlIEF4aXMgQVJUUEVDLTYgU29DLgorICAtICJudmlkaWEsdGVncmExODYtZXFvcyIsICJzbnBzLGR3Yy1xb3MtZXRoZXJuZXQtNC4xMCIKKyAgICBSZXByZXNlbnRzIHRoZSBJUCBjb3JlIHdoZW4gaW50ZWdyYXRlZCBpbnRvIHRoZSBOVklESUEgVGVncmExODYgU29DLgorICAtICJzbnBzLGR3Yy1xb3MtZXRoZXJuZXQtNC4xMCIKKyAgICBUaGlzIGNvbWJpbmF0aW9uIGlzIGRlcHJlY2F0ZWQuIEl0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgdG8KKyAgICAiYXhpcyxhcnRwZWM2LWVxb3MiLCAic25wcyxkd2MtcW9zLWV0aGVybmV0LTQuMTAiLiBJdCBpcyBzdXBwb3J0ZWQgdG8gYmUKKyAgICBjb21wYXRpYmxlIHdpdGggZWFybGllciByZXZpc2lvbnMgb2YgdGhpcyBiaW5kaW5nLgogLSByZWc6IEFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlCi0tIGNsb2NrczogUGhhbmRsZXMgdG8gdGhlIHJlZmVyZW5jZSBjbG9jayBhbmQgdGhlIGJ1cyBjbG9jawotLSBjbG9jay1uYW1lczogU2hvdWxkIGJlICJwaHlfcmVmX2NsayIgZm9yIHRoZSByZWZlcmVuY2UgY2xvY2sgYW5kICJhcGJfcGNsayIKLSAgZm9yIHRoZSBidXMgY2xvY2suCistIGNsb2NrczogUGhhbmRsZSBhbmQgY2xvY2sgc3BlY2lmaWVycyBmb3IgZWFjaCBlbnRyeSBpbiBjbG9jay1uYW1lcywgaW4gdGhlCisgIHNhbWUgb3JkZXIuIFNlZSAuLi9jbG9jay9jbG9jay1iaW5kaW5ncy50eHQuCistIGNsb2NrLW5hbWVzOiBNYXkgY29udGFpbiBhbnkvYWxsIG9mIHRoZSBmb2xsb3dpbmcgZGVwZW5kaW5nIG9uIHRoZSBJUAorICBjb25maWd1cmF0aW9uLCBpbiBhbnkgb3JkZXI6CisgIC0gInR4IgorICAgIFRoZSBFUU9TIHRyYW5zbWl0IHBhdGggY2xvY2suIFRoZSBIVyBzaWduYWwgbmFtZSBpcyBjbGtfdHhfaS4KKyAgICBJbiBzb21lIGNvbmZpZ3VyYXRpb25zIChlLmcuIEdNSUkvUkdNSUkpLCB0aGlzIGNsb2NrIGFsc28gZHJpdmVzIHRoZSBQSFkgVFgKKyAgICBwYXRoLiBJbiBvdGhlciBjb25maWd1cmF0aW9ucywgb3RoZXIgY2xvY2tzIChzdWNoIGFzIHR4XzEyNSwgcm1paSkgbWF5CisgICAgZHJpdmUgdGhlIFBIWSBUWCBwYXRoLgorICAtICJyeCIKKyAgICBUaGUgRVFPUyByZWNlaXZlIHBhdGggY2xvY2suIFRoZSBIVyBzaWduYWwgbmFtZSBpcyBjbGtfcnhfaS4KKyAgICBJbiBzb21lIGNvbmZpZ3VyYXRpb25zIChlLmcuIEdNSUkvUkdNSUkpLCB0aGlzIGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUKKyAgICBQSFkncyBSWCBjbG9jayBvdXRwdXQuIEluIG90aGVyIGNvbmZpZ3VyYXRpb25zLCBvdGhlciBjbG9ja3MgKHN1Y2ggYXMKKyAgICByeF8xMjUsIHJtaWkpIG1heSBkcml2ZSB0aGUgRVFPUyBSWCBwYXRoLgorICAgIEluIGNhc2VzIHdoZXJlIHRoZSBQSFkgY2xvY2sgaXMgZGlyZWN0bHkgZmVkIGludG8gdGhlIEVRT1MgcmVjZWl2ZSBwYXRoCisgICAgd2l0aG91dCBpbnRlcnZlbmluZyBsb2dpYywgdGhlIERUIG5lZWQgbm90IHJlcHJlc2VudCB0aGlzIGNsb2NrLCBzaW5jZSBpdAorICAgIGlzIGFzc3VtZWQgdG8gYmUgZnVsbHkgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIFBIWSBkZXZpY2UvZHJpdmVyLiBJbgorICAgIGNhc2VzIHdoZXJlIFNvQyBpbnRlZ3JhdGlvbiBhZGRzIGFkZGl0aW9uYWwgbG9naWMgdG8gdGhpcyBwYXRoLCBzdWNoIGFzIGEKKyAgICBTVy1jb250cm9sbGVkIGNsb2NrIGdhdGUsIHRoaXMgY2xvY2sgc2hvdWxkIGJlIHJlcHJlc2VudGVkIGluIERULgorICAtICJzbGF2ZV9idXMiCisgICAgVGhlIENQVS9zbGF2ZS1idXMgKENTUikgaW50ZXJmYWNlIGNsb2NrLiBUaGlzIGFwcGxpZXMgdG8gYW55IGJ1cyB0eXBlOworICAgIEFQQiwgQUhCLCBBWEksIGV0Yy4gVGhlIEhXIHNpZ25hbCBuYW1lIGlzIGhjbGtfaSAoQUhCKSBvciBjbGtfY3NyX2kgKG90aGVyCisgICAgYnVzZXMpLgorICAtICJtYXN0ZXJfYnVzIgorICAgIFRoZSBtYXN0ZXIgYnVzIGludGVyZmFjZSBjbG9jay4gT25seSByZXF1aXJlZCBpbiBjb25maWd1cmF0aW9ucyB0aGF0IHVzZSBhCisgICAgc2VwYXJhdGUgY2xvY2sgZm9yIHRoZSBtYXN0ZXIgYW5kIHNsYXZlIGJ1cyBpbnRlcmZhY2VzLiBUaGUgSFcgc2lnbmFsIG5hbWUKKyAgICBpcyBoY2xrX2kgKEFIQikgb3IgYWNsa19pIChBWEkpLgorICAtICJwdHBfcmVmIgorICAgIFRoZSBQVFAgcmVmZXJlbmNlIGNsb2NrLiBUaGUgSFcgc2lnbmFsIG5hbWUgaXMgY2xrX3B0cF9yZWZfaS4KKyAgLSAicGh5X3JlZl9jbGsiCisgICAgVGhpcyBjbG9jayBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgbmV3IGNvbXBhdGlibGUgdmFsdWVzLgorICAgIEl0IGlzIGVxdWl2YWxlbnQgdG8gInR4Ii4KKyAgLSAiYXBiX3BjbGsiCisgICAgVGhpcyBjbG9jayBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgbmV3IGNvbXBhdGlibGUgdmFsdWVzLgorICAgIEl0IGlzIGVxdWl2YWxlbnQgdG8gInNsYXZlX2J1cyIuCisKKyAgTm90ZTogU3VwcG9ydCBmb3IgYWRkaXRpb25hbCBJUCBjb25maWd1cmF0aW9ucyBtYXkgcmVxdWlyZSBhZGRpbmcgdGhlCisgIGZvbGxvd2luZyBjbG9ja3MgdG8gdGhpcyBsaXN0IGluIHRoZSBmdXR1cmU6IGNsa19yeF8xMjVfaSwgY2xrX3R4XzEyNV9pLAorICBjbGtfcG1hcnhfMF9pLCBjbGtfcG1hcngxX2ksIGNsa19ybWlpX2ksIGNsa19yZXZtaWlfcnhfaSwgY2xrX3Jldm1paV90eF9pLgorICBDb25maWd1cmF0aW9ucyBleGlzdCB3aGVyZSBtdWx0aXBsZSBzaW1pbGFyIGNsb2NrcyBhcmUgdXNlZCBhdCBvbmNlLCBlLmcuIGFsbAorICBvZiBjbGtfcnhfMTI1X2ksIGNsa19wbWFyeF8wX2ksIGNsa19wbWFyeDFfaS4gRm9yIHRoaXMgcmVhc29uIGl0IGlzIGJlc3QgdG8KKyAgZXh0ZW5kIHRoZSBiaW5kaW5nIHdpdGggYSBzZXBhcmF0ZSBjbG9jay1uYW1lcyBlbnRyeSBmb3IgZWFjaCBvZiB0aG9zZSBSWAorICBjbG9ja3MsIHJhdGhlciB0aGFuIHJlcHVycG9zaW5nIHRoZSBleGlzdGluZyAicngiIGNsb2NrLW5hbWVzIGVudHJ5IGFzIGEKKyAgZ2VuZXJpYy9sb2dpY2FsIGNsb2NrIGluIGEgc2ltaWxhciBmYXNoaW9uIHRvICJtYXN0ZXJfYnVzIiBhbmQgInNsYXZlX2J1cyIuCisgIFRoaXMgd2lsbCBhbGxvdyBlYXN5IHN1cHBvcnQgZm9yIGNvbmZpZ3VyYXRpb25zIHRoYXQgc3VwcG9ydCBtdWx0aXBsZSBQSFkKKyAgaW50ZXJmYWNlcyB1c2luZyBhIG11eCwgYW5kIGhlbmNlIG5lZWQgdG8gaGF2ZSBleHBsaWNpdCBjb250cm9sIG92ZXIKKyAgc3BlY2lmaWMgUlggY2xvY2tzLgorCisgIFRoZSBmb2xsb3dpbmcgY29tcGF0aWJsZSB2YWx1ZXMgcmVxdWlyZSB0aGUgZm9sbG93aW5nIHNldCBvZiBjbG9ja3M6CisgIC0gIm52aWRpYSx0ZWdyYTE4Ni1lcW9zIiwgInNucHMsZHdjLXFvcy1ldGhlcm5ldC00LjEwIjoKKyAgICAtICJzbGF2ZV9idXMiCisgICAgLSAibWFzdGVyX2J1cyIKKyAgICAtICJyeCIKKyAgICAtICJ0eCIKKyAgICAtICJwdHBfcmVmIgorICAtICJheGlzLGFydHBlYzYtZXFvcyIsICJzbnBzLGR3Yy1xb3MtZXRoZXJuZXQtNC4xMCI6CisgICAgLSAic2xhdmVfYnVzIgorICAgIC0gIm1hc3Rlcl9idXMiCisgICAgLSAidHgiCisgICAgLSAicHRwX3JlZiIKKyAgLSAic25wcyxkd2MtcW9zLWV0aGVybmV0LTQuMTAiIChkZXByZWNhdGVkKToKKyAgICAtICJwaHlfcmVmX2NsayIKKyAgICAtICJhcGJfY2xrIgogLSBpbnRlcnJ1cHQtcGFyZW50OiBTaG91bGQgYmUgdGhlIHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcgogICB0aGF0IHNlcnZpY2VzIGludGVycnVwdHMgZm9yIHRoaXMgZGV2aWNlCiAtIGludGVycnVwdHM6IFNob3VsZCBjb250YWluIHRoZSBjb3JlJ3MgY29tYmluZWQgaW50ZXJydXB0IHNpZ25hbAogLSBwaHktbW9kZTogU2VlIGV0aGVybmV0LnR4dCBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeQorLSByZXNldHM6IFBoYW5kbGUgYW5kIHJlc2V0IHNwZWNpZmllcnMgZm9yIGVhY2ggZW50cnkgaW4gcmVzZXQtbmFtZXMsIGluIHRoZQorICBzYW1lIG9yZGVyLiBTZWUgLi4vcmVzZXQvcmVzZXQudHh0LgorLSByZXNldC1uYW1lczogTWF5IGNvbnRhaW4gYW55L2FsbCBvZiB0aGUgZm9sbG93aW5nIGRlcGVuZGluZyBvbiB0aGUgSVAKKyAgY29uZmlndXJhdGlvbiwgaW4gYW55IG9yZGVyOgorICAtICJlcW9zIi4gVGhlIHJlc2V0IHRvIHRoZSBlbnRpcmUgbW9kdWxlLiBUaGUgSFcgc2lnbmFsIG5hbWUgaXMgaHJlc2V0X24KKyAgICAoQUhCKSBvciBhcmVzZXRuX2kgKEFYSSkuCisKKyAgVGhlIGZvbGxvd2luZyBjb21wYXRpYmxlIHZhbHVlcyByZXF1aXJlIHRoZSBmb2xsb3dpbmcgc2V0IG9mIHJlc2V0czoKKyAgKHRoZSByZXNldCBwcm9wZXJ0aWVzIG1heSBiZSBvbWl0dGVkIGlmIGVtcHR5KQorICAtICJudmlkaWEsdGVncmExODYtZXFvcyIsICJzbnBzLGR3Yy1xb3MtZXRoZXJuZXQtNC4xMCI6CisgICAgLSAiZXFvcyIuCisgIC0gImF4aXMsYXJ0cGVjNi1lcW9zIiwgInNucHMsZHdjLXFvcy1ldGhlcm5ldC00LjEwIjoKKyAgICAtIE5vbmUuCisgIC0gInNucHMsZHdjLXFvcy1ldGhlcm5ldC00LjEwIiAoZGVwcmVjYXRlZCk6CisgICAgLSBOb25lLgogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgogLSBkbWEtY29oZXJlbnQ6IFByZXNlbnQgaWYgZG1hIG9wZXJhdGlvbnMgYXJlIGNvaGVyZW50CiAtIG1hYy1hZGRyZXNzOiBTZWUgZXRoZXJuZXQudHh0IGluIHRoZSBzYW1lIGRpcmVjdG9yeQogLSBsb2NhbC1tYWMtYWRkcmVzczogU2VlIGV0aGVybmV0LnR4dCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKKy0gcGh5LXJlc2V0LWdwaW9zOiBQaGFuZGxlIGFuZCBzcGVjaWZpZXIgZm9yIGFueSBHUElPIHVzZWQgdG8gcmVzZXQgdGhlIFBIWS4KKyAgU2VlIC4uL2dwaW8vZ3Bpby50eHQuCiAtIHNucHMsZW4tbHBpOiBJZiBwcmVzZW50IGl0IGVuYWJsZXMgdXNlIG9mIHRoZSBBWEkgbG93LXBvd2VyIGludGVyZmFjZQogLSBzbnBzLHdyaXRlLXJlcXVlc3RzOiBOdW1iZXIgb2Ygd3JpdGUgcmVxdWVzdHMgdGhhdCB0aGUgQVhJIHBvcnQgY2FuIGlzc3VlLgogICBJdCBkZXBlbmRzIG9uIHRoZSBTb0MgY29uZmlndXJhdGlvbi4KQEAgLTUyLDYgKzE0Miw3IEBACiAJcmVnID0gPDB4NDAwMTAwMDAgMHg0MDAwPjsKIAlwaHktaGFuZGxlID0gPCZwaHkyPjsKIAlwaHktbW9kZSA9ICJnbWlpIjsKKwlwaHktcmVzZXQtZ3Bpb3MgPSA8JmdwaW9jdGxyIDQzIEdQSU9fQUNUSVZFX0xPVz47CiAKIAlzbnBzLGVuLXR4LWxwaS1jbG9ja2dhdGluZzsKIAlzbnBzLGVuLWxwaTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc3RtMzItZHdtYWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zdG0zMi1kd21hYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM1YWZiNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc3RtMzItZHdtYWMudHh0CkBAIC0wLDAgKzEsMzIgQEAKK1NUTWljcm9lbGVjdHJvbmljcyBTVE0zMiAvIE1DVSBEV01BQyBnbHVlIGxheWVyIGNvbnRyb2xsZXIKKworVGhpcyBmaWxlIGRvY3VtZW50cyBwbGF0Zm9ybSBnbHVlIGxheWVyIGZvciBzdG1tYWMuCitQbGVhc2Ugc2VlIHN0bW1hYy50eHQgZm9yIHRoZSBvdGhlciB1bmNoYW5nZWQgcHJvcGVydGllcy4KKworVGhlIGRldmljZSBub2RlIGhhcyBmb2xsb3dpbmcgcHJvcGVydGllcy4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogIFNob3VsZCBiZSAic3Qsc3RtMzItZHdtYWMiIHRvIHNlbGVjdCBnbHVlLCBhbmQKKwkgICAgICAgInNucHMsZHdtYWMtMy41MGEiIHRvIHNlbGVjdCBJUCB2ZXJzaW9uLgorLSBjbG9ja3M6IE11c3QgY29udGFpbiBhIHBoYW5kbGUgZm9yIGVhY2ggZW50cnkgaW4gY2xvY2stbmFtZXMuCistIGNsb2NrLW5hbWVzOiBTaG91bGQgYmUgInN0bW1hY2V0aCIgZm9yIHRoZSBob3N0IGNsb2NrLgorCSAgICAgICBTaG91bGQgYmUgIm1hYy1jbGstdHgiIGZvciB0aGUgTUFDIFRYIGNsb2NrLgorCSAgICAgICBTaG91bGQgYmUgIm1hYy1jbGstcngiIGZvciB0aGUgTUFDIFJYIGNsb2NrLgorLSBzdCxzeXNjb24gOiBTaG91bGQgYmUgcGhhbmRsZS9vZmZzZXQgcGFpci4gVGhlIHBoYW5kbGUgdG8gdGhlIHN5c2NvbiBub2RlIHdoaWNoCisJICAgICAgZW5jb21wYXNlcyB0aGUgZ2x1ZSByZWdpc3RlciwgYW5kIHRoZSBvZmZzZXQgb2YgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuCitFeGFtcGxlOgorCisJZXRoZXJuZXRANDAwMjgwMDAgeworCQljb21wYXRpYmxlID0gInN0LHN0bTMyLWR3bWFjIiwgInNucHMsZHdtYWMtMy41MGEiOworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQlyZWcgPSA8MHg0MDAyODAwMCAweDgwMDA+OworCQlyZWctbmFtZXMgPSAic3RtbWFjZXRoIjsKKwkJaW50ZXJydXB0cyA9IDwwIDYxIDA+LCA8MCA2MiAwPjsKKwkJaW50ZXJydXB0LW5hbWVzID0gIm1hY2lycSIsICJldGhfd2FrZV9pcnEiOworCQljbG9jay1uYW1lcyA9ICJzdG1tYWNldGgiLCAibWFjLWNsay10eCIsICJtYWMtY2xrLXJ4IjsKKwkJY2xvY2tzID0gPCZyY2MgMCAyNT4sIDwmcmNjIDAgMjY+LCA8JnJjYyAwIDI3PjsKKwkJc3Qsc3lzY29uID0gPCZzeXNjZmcgMHg0PjsKKwkJc25wcyxwYmwgPSA8OD47CisJCXNucHMsbWl4ZWQtYnVyc3Q7CisJCWRtYS1yYW5nZXM7CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvd2lyZWxlc3MvZXNwLGVzcDgwODkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC93aXJlbGVzcy9lc3AsZXNwODA4OS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkzMzFiYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvd2lyZWxlc3MvZXNwLGVzcDgwODkudHh0CkBAIC0wLDAgKzEsMzEgQEAKK0VzcHJlc3NpZiBFU1A4MDg5IHdpcmVsZXNzIFNESU8gZGV2aWNlcworCitUaGlzIG5vZGUgcHJvdmlkZXMgcHJvcGVydGllcyBmb3IgY29udHJvbGxpbmcgdGhlIEVTUDgwODkgd2lyZWxlc3MgZGV2aWNlLgorVGhlIG5vZGUgaXMgZXhwZWN0ZWQgdG8gYmUgc3BlY2lmaWVkIGFzIGEgY2hpbGQgbm9kZSB0byB0aGUgU0RJTyBjb250cm9sbGVyCit0aGF0IGNvbm5lY3RzIHRoZSBkZXZpY2UgdG8gdGhlIHN5c3RlbS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworIC0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAiZXNwLGVzcDgwODkiLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorIC0gZXNwLGNyeXN0YWwtMjZNLWVuOiBJbnRlZ2VyIHZhbHVlIGZvciB0aGUgY3J5c3RhbF8yNk1fZW4gZmlybXdhcmUgcGFyYW1ldGVyCisKK0V4YW1wbGU6CisKKyZtbWMxIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwwPjsKKworCXZtbWMtc3VwcGx5ID0gPCZyZWdfZGxkbzE+OworCW1tYy1wd3JzZXEgPSA8JndpZmlfcHdyc2VxPjsKKwlidXMtd2lkdGggPSA8ND47CisJbm9uLXJlbW92YWJsZTsKKwlzdGF0dXMgPSAib2theSI7CisKKwllc3A4MDg5OiBzZGlvX3dpZmlAMSB7CisJCWNvbXBhdGlibGUgPSAiZXNwLGVzcDgwODkiOworCQlyZWcgPSA8MT47CisJCWVzcCxjcnlzdGFsLTI2TS1lbiA9IDwyPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQveGlsaW54X2dtaWkycmdtaWkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC94aWxpbnhfZ21paTJyZ21paS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4ZGRhNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQveGlsaW54X2dtaWkycmdtaWkudHh0CkBAIC0wLDAgKzEsMzUgQEAKK1hJTElOWCBHTUlJVE9SR01JSSBDb252ZXJ0ZXIgRHJpdmVyIERldmljZSBUcmVlIEJpbmRpbmdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgR2lnYWJpdCBNZWRpYSBJbmRlcGVuZGVudCBJbnRlcmZhY2UgKEdNSUkpIHRvIFJlZHVjZWQgR2lnYWJpdCBNZWRpYQorSW5kZXBlbmRlbnQgSW50ZXJmYWNlIChSR01JSSkgY29yZSBwcm92aWRlcyB0aGUgUkdNSUkgYmV0d2VlbiBSR01JSS1jb21wbGlhbnQKK0V0aGVybmV0IHBoeXNpY2FsIG1lZGlhIGRldmljZXMgKFBIWSkgYW5kIHRoZSBHaWdhYml0IEV0aGVybmV0IGNvbnRyb2xsZXIuCitUaGlzIGNvcmUgY2FuIGJlIHVzZWQgaW4gYWxsIHRocmVlIG1vZGVzIG9mIG9wZXJhdGlvbigxMC8xMDAvMTAwMCBNYi9zKS4KK1RoZSBNYW5hZ2VtZW50IERhdGEgSW5wdXQvT3V0cHV0IChNRElPKSBpbnRlcmZhY2UgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlCitTcGVlZCBvZiBvcGVyYXRpb24uIFRoaXMgY29yZSBjYW4gc3dpdGNoIGR5bmFtaWNhbGx5IGJldHdlZW4gdGhlIHRocmVlCitEaWZmZXJlbnQgc3BlZWQgbW9kZXMgYnkgY29uZmlndXJpbmcgdGhlIGNvbnZldGVyIHJlZ2lzdGVyIHRocm91Z2ggbWRpbyB3cml0ZS4KKworVGhpcyBjb252ZXJ0ZXIgc2l0cyBiZXR3ZWVuIHRoZSBldGhlcm5ldCBNQUMgYW5kIHRoZSBleHRlcm5hbCBwaHkuCitNQUMgPD09PiBHTUlJMlJHTUlJIDw9PT4gUkdNSUlfUEhZCisKK0ZvciBtb3JlIGRldGFpbHMgYWJvdXQgbWRpbyBwbGVhc2UgcmVmZXIgcGh5LnR4dCBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZQk6IFNob3VsZCBiZSAieGxueCxnbWlpLXRvLXJnbWlpLTEuMCIKKy0gcmVnCQk6IFRoZSBJRCBudW1iZXIgZm9yIHRoZSBwaHksIHVzdWFsbHkgYSBzbWFsbCBpbnRlZ2VyCistIHBoeS1oYW5kbGUJOiBTaG91bGQgcG9pbnQgdG8gdGhlIGV4dGVybmFsIHBoeSBkZXZpY2UuCisJCSAgU2VlIGV0aGVybmV0LnR4dCBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKworRXhhbXBsZToKKwltZGlvIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQlwaHk6IGV0aGVybmV0LXBoeUAwIHsKKwkJCS4uLi4uLgorCQl9OworCQlnbWlpdG9yZ21paTogZ21paXRvcmdtaWlAOCB7CisJCQljb21wYXRpYmxlID0gInhsbngsZ21paS10by1yZ21paS0xLjAiOworCQkJcmVnID0gPDg+OworCQkJcGh5LWhhbmRsZSA9IDwmcGh5PjsKKwkJfTsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL252bWVtL3JvY2tjaGlwLWVmdXNlLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9udm1lbS9yb2NrY2hpcC1lZnVzZS50eHQKaW5kZXggOGY4NmFiMy4uOTRhZWVlYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL252bWVtL3JvY2tjaGlwLWVmdXNlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbnZtZW0vcm9ja2NoaXAtZWZ1c2UudHh0CkBAIC0xLDExICsxLDIwIEBACiA9IFJvY2tjaGlwIGVGdXNlIGRldmljZSB0cmVlIGJpbmRpbmdzID0KIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJyb2NrY2hpcCxyb2NrY2hpcC1lZnVzZSIKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nLgorICAtICJyb2NrY2hpcCxyazMwNjZhLWVmdXNlIiAtIGZvciBSSzMwNjZhIFNvQ3MuCisgIC0gInJvY2tjaGlwLHJrMzE4OC1lZnVzZSIgLSBmb3IgUkszMTg4IFNvQ3MuCisgIC0gInJvY2tjaGlwLHJrMzI4OC1lZnVzZSIgLSBmb3IgUkszMjg4IFNvQ3MuCisgIC0gInJvY2tjaGlwLHJrMzM5OS1lZnVzZSIgLSBmb3IgUkszMzk5IFNvQ3MuCiAtIHJlZzogU2hvdWxkIGNvbnRhaW4gdGhlIHJlZ2lzdGVycyBsb2NhdGlvbiBhbmQgZXhhY3QgZUZ1c2Ugc2l6ZQogLSBjbG9ja3M6IFNob3VsZCBiZSB0aGUgY2xvY2sgaWQgb2YgZUZ1c2UKIC0gY2xvY2stbmFtZXM6IFNob3VsZCBiZSAicGNsa19lZnVzZSIKIAorRGVwcmVjYXRlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAicm9ja2NoaXAscm9ja2NoaXAtZWZ1c2UiCisgIE9sZCBlZnVzZSBjb21wYXRpYmxlIHZhbHVlIGNvbXBhdGlibGUgdG8gcmszMDY2YSwgcmszMTg4IGFuZCByazMyODgKKyAgZWZ1c2VzCisKID0gRGF0YSBjZWxscyA9CiBBcmUgY2hpbGQgbm9kZXMgb2YgZUZ1c2UsIGJpbmRpbmdzIG9mIHdoaWNoIGFzIGRlc2NyaWJlZCBpbgogYmluZGluZ3MvbnZtZW0vbnZtZW0udHh0CkBAIC0xMyw3ICsyMiw3IEBACiBFeGFtcGxlOgogCiAJZWZ1c2U6IGVmdXNlQGZmYjQwMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyb2NrY2hpcC1lZnVzZSI7CisJCWNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMjg4LWVmdXNlIjsKIAkJcmVnID0gPDB4ZmZiNDAwMDAgMHgyMD47CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kvYXhpcyxhcnRwZWM2LXBjaWUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9heGlzLGFydHBlYzYtcGNpZS50eHQKaW5kZXggMzMwYTQ1Yi4uNWVjYWVhMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9heGlzLGFydHBlYzYtcGNpZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9heGlzLGFydHBlYzYtcGNpZS50eHQKQEAgLTI0LDE2ICsyNCwxNyBAQAogCQljb21wYXRpYmxlID0gImF4aXMsYXJ0cGVjNi1wY2llIiwgInNucHMsZHctcGNpZSI7CiAJCXJlZyA9IDwweGY4MDUwMDAwIDB4MjAwMAogCQkgICAgICAgMHhmODA0MDAwMCAweDEwMDAKLQkJICAgICAgIDB4YzAwMDAwMDAgMHgxMDAwPjsKKwkJICAgICAgIDB4YzAwMDAwMDAgMHgyMDAwPjsKIAkJcmVnLW5hbWVzID0gImRiaSIsICJwaHkiLCAiY29uZmlnIjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CiAJCSNzaXplLWNlbGxzID0gPDI+OwogCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJICAvKiBkb3duc3RyZWFtIEkvTyAqLwotCQlyYW5nZXMgPSA8MHg4MTAwMDAwMCAwIDB4MDAwMTAwMDAgMHhjMDAxMDAwMCAwIDB4MDAwMTAwMDAKKwkJcmFuZ2VzID0gPDB4ODEwMDAwMDAgMCAwIDB4YzAwMDIwMDAgMCAweDAwMDEwMDAwCiAJCQkgIC8qIG5vbi1wcmVmZXRjaGFibGUgbWVtb3J5ICovCi0JCQkgIDB4ODIwMDAwMDAgMCAweGMwMDIwMDAwIDB4YzAwMjAwMDAgMCAweDFmZmUwMDAwPjsKKwkJCSAgMHg4MjAwMDAwMCAwIDB4YzAwMTIwMDAgMHhjMDAxMjAwMCAwIDB4MWZmZWUwMDA+OwogCQludW0tbGFuZXMgPSA8Mj47CisJCWJ1cy1yYW5nZSA9IDwweDAwIDB4ZmY+OwogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMTQ4IElSUV9UWVBFX0xFVkVMX0hJR0g+OwogCQlpbnRlcnJ1cHQtbmFtZXMgPSAibXNpIjsKIAkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kveGlsaW54LW53bC1wY2llLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kveGlsaW54LW53bC1wY2llLnR4dAppbmRleCAzMzdmYzk3Li4zMjU5Nzk4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGNpL3hpbGlueC1ud2wtcGNpZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS94aWxpbngtbndsLXBjaWUudHh0CkBAIC01NSw5ICs1NSwxMCBAQAogCW1zaS1wYXJlbnQgPSA8Jm53bF9wY2llPjsKIAlyZWcgPSA8MHgwIDB4ZmQwZTAwMDAgMHgwIDB4MTAwMD4sCiAJICAgICAgPDB4MCAweGZkNDgwMDAwIDB4MCAweDEwMDA+LAotCSAgICAgIDwweDAgMHhlMDAwMDAwMCAweDAgMHgxMDAwMDAwPjsKKwkgICAgICA8MHg4MCAweDAwMDAwMDAwIDB4MCAweDEwMDAwMDA+OwogCXJlZy1uYW1lcyA9ICJicmVnIiwgInBjaXJlZyIsICJjZmciOwotCXJhbmdlcyA9IDwweDAyMDAwMDAwIDB4MDAwMDAwMDAgMHhlMTAwMDAwMCAweDAwMDAwMDAwIDB4ZTEwMDAwMDAgMCAweDBmMDAwMDAwPjsKKwlyYW5nZXMgPSA8MHgwMjAwMDAwMCAweDAwMDAwMDAwIDB4ZTAwMDAwMDAgMHgwMDAwMDAwMCAweGUwMDAwMDAwIDB4MDAwMDAwMDAgMHgxMDAwMDAwMCAgLyogbm9uLXByZWZldGNoYWJsZSBtZW1vcnkgKi8KKwkJICAweDQzMDAwMDAwIDB4MDAwMDAwMDYgMHgwMDAwMDAwMCAweDAwMDAwMDA2IDB4MDAwMDAwMDAgMHgwMDAwMDAwMiAweDAwMDAwMDAwPjsvKiBwcmVmZXRjaGFibGUgbWVtb3J5ICovCiAKIAlwY2llX2ludGM6IGxlZ2FjeS1pbnRlcnJ1cHQtY29udHJvbGxlciB7CiAJCWludGVycnVwdC1jb250cm9sbGVyOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9iY20tbnMtdXNiMy1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9iY20tbnMtdXNiMy1waHkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YWViYTkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L2JjbS1ucy11c2IzLXBoeS50eHQKQEAgLTAsMCArMSwyMyBAQAorRHJpdmVyIGZvciBCcm9hZGNvbSBOb3J0aHN0YXIgVVNCIDMuMCBQSFkKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworLSBjb21wYXRpYmxlOiBvbmUgb2Y6ICJicmNtLG5zLWF4LXVzYjMtcGh5IiwgImJyY20sbnMtYngtdXNiMy1waHkiLgorLSByZWc6IHJlZ2lzdGVyIG1hcHBpbmdzIGZvciBETVAgKERldmljZSBNYW5hZ2VtZW50IFBsdWdpbikgYW5kIENoaXBDb21tb24gQgorICAgICAgIE1NSS4KKy0gcmVnLW5hbWVzOiAiZG1wIiBhbmQgImNjYi1taWkiCisKK0luaXRpYWxpemF0aW9uIG9mIFVTQiAzLjAgUEhZIGRlcGVuZHMgb24gTm9ydGhzdGFyIHZlcnNpb24uIFRoZXJlIGFyZSBjdXJyZW50bHkKK3RocmVlIGtub3duIHNlcmllczogQXgsIEJ4IGFuZCBDeC4KK0tub3duIEEwOiBCQ000NzA3IHJldiAwCitLbm93biBCMDogQkNNNDcwNyByZXYgNCwgQkNNNTM1NzMgcmV2IDIKK0tub3duIEIxOiBCQ000NzA3IHJldiA2CitLbm93biBDMDogQkNNNDcwOTQgcmV2IDAKKworRXhhbXBsZToKKwl1c2IzLXBoeSB7CisJCWNvbXBhdGlibGUgPSAiYnJjbSxucy1heC11c2IzLXBoeSI7CisJCXJlZyA9IDwweDE4MTA1MDAwIDB4MTAwMD4sIDwweDE4MDAzMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJkbXAiLCAiY2NiLW1paSI7CisJCSNwaHktY2VsbHMgPSA8MD47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvbXhzLXVzYi1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9teHMtdXNiLXBoeS50eHQKaW5kZXggMzc5Yjg0YS4uMWQyNWIwNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9teHMtdXNiLXBoeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9teHMtdXNiLXBoeS50eHQKQEAgLTEyLDYgKzEyLDE2IEBACiAtIGludGVycnVwdHM6IFNob3VsZCBjb250YWluIHBoeSBpbnRlcnJ1cHQKIC0gZnNsLGFuYXRvcDogcGhhbmRsZSBmb3IgYW5hdG9wIHJlZ2lzdGVyLCBpdCBpcyBvbmx5IGZvciBpbXg2IFNvQyBzZXJpZXMKIAorT3B0aW9uYWwgcHJvcGVydGllczoKKy0gZnNsLHR4LWNhbC00NS1kbi1vaG1zOiBJbnRlZ2VyIFszMC01NV0uIFJlc2lzdGFuY2UgKGluIG9obXMpIG9mIHN3aXRjaGFibGUKKyAgaGlnaC1zcGVlZCB0cmltbWluZyByZXNpc3RvciBjb25uZWN0ZWQgaW4gcGFyYWxsZWwgd2l0aCB0aGUgNDUgb2htIHJlc2lzdG9yCisgIHRoYXQgdGVybWluYXRlcyB0aGUgRE4gb3V0cHV0IHNpZ25hbC4gRGVmYXVsdDogNDUKKy0gZnNsLHR4LWNhbC00NS1kcC1vaG1zOiBJbnRlZ2VyIFszMC01NV0uIFJlc2lzdGFuY2UgKGluIG9obXMpIG9mIHN3aXRjaGFibGUKKyAgaGlnaC1zcGVlZCB0cmltbWluZyByZXNpc3RvciBjb25uZWN0ZWQgaW4gcGFyYWxsZWwgd2l0aCB0aGUgNDUgb2htIHJlc2lzdG9yCisgIHRoYXQgdGVybWluYXRlcyB0aGUgRFAgb3V0cHV0IHNpZ25hbC4gRGVmYXVsdDogNDUKKy0gZnNsLHR4LWQtY2FsOiBJbnRlZ2VyIFs3OS0xMTldLiBDdXJyZW50IHRyaW1taW5nIHZhbHVlIChhcyBhIHBlcmNlbnRhZ2UpIG9mCisgIHRoZSAxNy43OG1BIFRYIHJlZmVyZW5jZSBjdXJyZW50LiBEZWZhdWx0OiAxMDAKKwogRXhhbXBsZToKIHVzYnBoeTE6IHVzYnBoeUAwMjBjOTAwMCB7CiAJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtdXNicGh5IiwgImZzbCxpbXgyMy11c2JwaHkiOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9waHktcm9ja2NoaXAtaW5uby11c2IyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcGh5LXJvY2tjaGlwLWlubm8tdXNiMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyOWM3NwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcGh5LXJvY2tjaGlwLWlubm8tdXNiMi50eHQKQEAgLTAsMCArMSw2NCBAQAorUk9DS0NISVAgVVNCMi4wIFBIWSBXSVRIIElOTk8gSVAgQkxPQ0sKKworUmVxdWlyZWQgcHJvcGVydGllcyAocGh5IChwYXJlbnQpIG5vZGUpOgorIC0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSBvbmUgb2YgdGhlIGxpc3RlZCBjb21wYXRpYmxlczoKKwkqICJyb2NrY2hpcCxyazMzNjYtdXNiMnBoeSIKKwkqICJyb2NrY2hpcCxyazMzOTktdXNiMnBoeSIKKyAtIHJlZyA6IHRoZSBhZGRyZXNzIG9mZnNldCBvZiBncmYgZm9yIHVzYi1waHkgY29uZmlndXJhdGlvbi4KKyAtICNjbG9jay1jZWxscyA6IHNob3VsZCBiZSAwLgorIC0gY2xvY2stb3V0cHV0LW5hbWVzIDogc3BlY2lmeSB0aGUgNDgwbSBvdXRwdXQgY2xvY2sgbmFtZS4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAtIGNsb2NrcyA6IHBoYW5kbGUgKyBwaHkgc3BlY2lmaWVyIHBhaXIsIGZvciB0aGUgaW5wdXQgY2xvY2sgb2YgcGh5LgorIC0gY2xvY2stbmFtZXMgOiBpbnB1dCBjbG9jayBuYW1lIG9mIHBoeSwgbXVzdCBiZSAicGh5Y2xrIi4KKworUmVxdWlyZWQgbm9kZXMgOiBhIHN1Yi1ub2RlIGlzIHJlcXVpcmVkIGZvciBlYWNoIHBvcnQgdGhlIHBoeSBwcm92aWRlcy4KKwkJIFRoZSBzdWItbm9kZSBuYW1lIGlzIHVzZWQgdG8gaWRlbnRpZnkgaG9zdCBvciBvdGcgcG9ydCwKKwkJIGFuZCBzaGFsbCBiZSB0aGUgZm9sbG93aW5nIGVudHJpZXM6CisJKiAib3RnLXBvcnQiIDogdGhlIG5hbWUgb2Ygb3RnIHBvcnQuCisJKiAiaG9zdC1wb3J0IiA6IHRoZSBuYW1lIG9mIGhvc3QgcG9ydC4KKworUmVxdWlyZWQgcHJvcGVydGllcyAocG9ydCAoY2hpbGQpIG5vZGUpOgorIC0gI3BoeS1jZWxscyA6IG11c3QgYmUgMC4gU2VlIC4vcGh5LWJpbmRpbmdzLnR4dCBmb3IgZGV0YWlscy4KKyAtIGludGVycnVwdHMgOiBzcGVjaWZ5IGFuIGludGVycnVwdCBmb3IgZWFjaCBlbnRyeSBpbiBpbnRlcnJ1cHQtbmFtZXMuCisgLSBpbnRlcnJ1cHQtbmFtZXMgOiBhIGxpc3Qgd2hpY2ggc2hhbGwgYmUgdGhlIGZvbGxvd2luZyBlbnRyaWVzOgorCSogIm90Zy1pZCIgOiBmb3IgdGhlIG90ZyBpZCBpbnRlcnJ1cHQuCisJKiAib3RnLWJ2YWxpZCIgOiBmb3IgdGhlIG90ZyB2YnVzIGludGVycnVwdC4KKwkqICJsaW5lc3RhdGUiIDogZm9yIHRoZSBob3N0L290ZyBsaW5lc3RhdGUgaW50ZXJydXB0LgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorIC0gcGh5LXN1cHBseSA6IHBoYW5kbGUgdG8gYSByZWd1bGF0b3IgdGhhdCBwcm92aWRlcyBwb3dlciB0byBWQlVTLgorCQlTZWUgLi9waHktYmluZGluZ3MudHh0IGZvciBkZXRhaWxzLgorCitFeGFtcGxlOgorCitncmY6IHN5c2NvbkBmZjc3MDAwMCB7CisJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzNjYtZ3JmIiwgInN5c2NvbiIsICJzaW1wbGUtbWZkIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKworLi4uCisKKwl1MnBoeTogdXNiMi1waHlANzAwIHsKKwkJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzNjYtdXNiMnBoeSI7CisJCXJlZyA9IDwweDcwMCAweDJjPjsKKwkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQljbG9jay1vdXRwdXQtbmFtZXMgPSAic2Nsa19vdGdwaHkwXzQ4MG0iOworCisJCXUycGh5X290Zzogb3RnLXBvcnQgeworCQkJI3BoeS1jZWxscyA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8R0lDX1NQSSA5MyBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJCQkgICAgIDxHSUNfU1BJIDk0IElSUV9UWVBFX0xFVkVMX0hJR0g+LAorCQkJCSAgICAgPEdJQ19TUEkgOTUgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlpbnRlcnJ1cHQtbmFtZXMgPSAib3RnLWlkIiwgIm90Zy1idmFsaWQiLCAibGluZXN0YXRlIjsKKwkJCXN0YXR1cyA9ICJva2F5IjsKKwkJfTsKKworCQl1MnBoeV9ob3N0OiBob3N0LXBvcnQgeworCQkJI3BoeS1jZWxscyA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8R0lDX1NQSSA5NiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCWludGVycnVwdC1uYW1lcyA9ICJsaW5lc3RhdGUiOworCQkJc3RhdHVzID0gIm9rYXkiOworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9waHktcm9ja2NoaXAtdHlwZWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9waHktcm9ja2NoaXAtdHlwZWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYTg2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3BoeS1yb2NrY2hpcC10eXBlYy50eHQKQEAgLTAsMCArMSwxMDEgQEAKKyogUk9DS0NISVAgdHlwZS1jIFBIWQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgLSBjb21wYXRpYmxlIDogbXVzdCBiZSAicm9ja2NoaXAscmszMzk5LXR5cGVjLXBoeSIKKyAtIHJlZzogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSB1c2IgcGh5IGNvbnRyb2wgcmVnaXN0ZXIgc2V0CisgLSByb2NrY2hpcCxncmYgOiBwaGFuZGxlIHRvIHRoZSBzeXNjb24gbWFuYWdpbmcgdGhlICJnZW5lcmFsCisgICByZWdpc3RlciBmaWxlcyIKKyAtIGNsb2NrcyA6IHBoYW5kbGUgKyBjbG9jayBzcGVjaWZpZXIgZm9yIHRoZSBwaHkgY2xvY2tzCisgLSBjbG9jay1uYW1lcyA6IHN0cmluZywgY2xvY2sgbmFtZSwgbXVzdCBiZSAidGNwZGNvcmUiLCAidGNwZHBoeS1yZWYiOworIC0gYXNzaWduZWQtY2xvY2tzOiBtYWluIGNsb2NrLCBzaG91bGQgYmUgPCZjcnUgU0NMS19VUEhZMF9UQ1BEQ09SRT4gb3IKKwkJICAgIDwmY3J1IFNDTEtfVVBIWTFfVENQRENPUkU+OworIC0gYXNzaWduZWQtY2xvY2stcmF0ZXMgOiB0aGUgcGh5IGNvcmUgY2xrIGZyZXF1ZW5jeSwgc2hhbGwgYmU6IDUwMDAwMDAwCisgLSByZXNldHMgOiBhIGxpc3Qgb2YgcGhhbmRsZSArIHJlc2V0IHNwZWNpZmllciBwYWlycworIC0gcmVzZXQtbmFtZXMgOiBzdHJpbmcgcmVzZXQgbmFtZSwgbXVzdCBiZToKKwkJICJ1cGh5IiwgInVwaHktcGlwZSIsICJ1cGh5LXRjcGh5IgorIC0gZXh0Y29uIDogZXh0Y29uIHNwZWNpZmllciBmb3IgdGhlIFBvd2VyIERlbGl2ZXJ5CisKK05vdGUsIHRoZXJlIGFyZSAyIHR5cGUtYyBwaHlzIGZvciBSSzMzOTksIGFuZCB0aGV5IGFyZSBhbG1vc3QgaWRlbnRpY2FsLCBleGNlcHQKK3RoZXNlIHJlZ2lzdGVycyhkZXNjcmlwdGlvbiBiZWxvdyksIGV2ZXJ5IHJlZ2lzdGVyIG5vZGUgY29udGFpbnMgMyBzZWN0aW9uczoKK29mZnNldCwgZW5hYmxlIGJpdCwgd3JpdGUgbWFzayBiaXQuCisgLSByb2NrY2hpcCx0eXBlYy1jb25uLWRpciA6IHRoZSByZWdpc3RlciBvZiB0eXBlLWMgY29ubmVjdG9yIGRpcmVjdGlvbiwKKyAgIGZvciB0eXBlLWMgcGh5MCwgaXQgbXVzdCBiZSA8MHhlNTgwIDAgMTY+OworICAgZm9yIHR5cGUtYyBwaHkxLCBpdCBtdXN0IGJlIDwweGU1OGMgMCAxNj47CisgLSByb2NrY2hpcCx1c2IzdG91c2IyLWVuIDogdGhlIHJlZ2lzdGVyIG9mIHR5cGUtYyBmb3JjZSB1c2IzIHRvIHVzYjIgZW5hYmxlCisgICBjb250cm9sLgorICAgZm9yIHR5cGUtYyBwaHkwLCBpdCBtdXN0IGJlIDwweGU1ODAgMyAxOT47CisgICBmb3IgdHlwZS1jIHBoeTEsIGl0IG11c3QgYmUgPDB4ZTU4YyAzIDE5PjsKKyAtIHJvY2tjaGlwLGV4dGVybmFsLXBzbSA6IHRoZSByZWdpc3RlciBvZiB0eXBlLWMgcGh5IGV4dGVybmFsIHBzbSBjbG9jaworICAgc2VsZWN0aW9uLgorICAgZm9yIHR5cGUtYyBwaHkwLCBpdCBtdXN0IGJlIDwweGU1ODggMTQgMzA+OworICAgZm9yIHR5cGUtYyBwaHkxLCBpdCBtdXN0IGJlIDwweGU1OTQgMTQgMzA+OworIC0gcm9ja2NoaXAscGlwZS1zdGF0dXMgOiB0aGUgcmVnaXN0ZXIgb2YgdHlwZS1jIHBoeSBwaXBlIHN0YXR1cy4KKyAgIGZvciB0eXBlLWMgcGh5MCwgaXQgbXVzdCBiZSA8MHhlNWMwIDAgMD47CisgICBmb3IgdHlwZS1jIHBoeTEsIGl0IG11c3QgYmUgPDB4ZTVjMCAxNiAxNj47CisKK1JlcXVpcmVkIG5vZGVzIDogYSBzdWItbm9kZSBpcyByZXF1aXJlZCBmb3IgZWFjaCBwb3J0IHRoZSBwaHkgcHJvdmlkZXMuCisJCSBUaGUgc3ViLW5vZGUgbmFtZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGRwIG9yIHVzYjMgcG9ydCwKKwkJIGFuZCBzaGFsbCBiZSB0aGUgZm9sbG93aW5nIGVudHJpZXM6CisJKiAiZHAtcG9ydCIgOiB0aGUgbmFtZSBvZiBEUCBwb3J0LgorCSogInVzYjMtcG9ydCIgOiB0aGUgbmFtZSBvZiBVU0IzIHBvcnQuCisKK1JlcXVpcmVkIHByb3BlcnRpZXMgKHBvcnQgKGNoaWxkKSBub2RlKToKKy0gI3BoeS1jZWxscyA6IG11c3QgYmUgMCwgU2VlIC4vcGh5LWJpbmRpbmdzLnR4dCBmb3IgZGV0YWlscy4KKworRXhhbXBsZToKKwl0Y3BoeTA6IHBoeUBmZjdjMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LXR5cGVjLXBoeSI7CisJCXJlZyA9IDwweDAgMHhmZjdjMDAwMCAweDAgMHg0MDAwMD47CisJCXJvY2tjaGlwLGdyZiA9IDwmZ3JmPjsKKwkJZXh0Y29uID0gPCZmdXNiMD47CisJCWNsb2NrcyA9IDwmY3J1IFNDTEtfVVBIWTBfVENQRENPUkU+LAorCQkJIDwmY3J1IFNDTEtfVVBIWTBfVENQRFBIWV9SRUY+OworCQljbG9jay1uYW1lcyA9ICJ0Y3BkY29yZSIsICJ0Y3BkcGh5LXJlZiI7CisJCWFzc2lnbmVkLWNsb2NrcyA9IDwmY3J1IFNDTEtfVVBIWTBfVENQRENPUkU+OworCQlhc3NpZ25lZC1jbG9jay1yYXRlcyA9IDw1MDAwMDAwMD47CisJCXJlc2V0cyA9IDwmY3J1IFNSU1RfVVBIWTA+LAorCQkJIDwmY3J1IFNSU1RfVVBIWTBfUElQRV9MMDA+LAorCQkJIDwmY3J1IFNSU1RfUF9VUEhZMF9UQ1BIWT47CisJCXJlc2V0LW5hbWVzID0gInVwaHkiLCAidXBoeS1waXBlIiwgInVwaHktdGNwaHkiOworCQlyb2NrY2hpcCx0eXBlYy1jb25uLWRpciA9IDwweGU1ODAgMCAxNj47CisJCXJvY2tjaGlwLHVzYjN0b3VzYjItZW4gPSA8MHhlNTgwIDMgMTk+OworCQlyb2NrY2hpcCxleHRlcm5hbC1wc20gPSA8MHhlNTg4IDE0IDMwPjsKKwkJcm9ja2NoaXAscGlwZS1zdGF0dXMgPSA8MHhlNWMwIDAgMD47CisKKwkJdGNwaHkwX2RwOiBkcC1wb3J0IHsKKwkJCSNwaHktY2VsbHMgPSA8MD47CisJCX07CisKKwkJdGNwaHkwX3VzYjM6IHVzYjMtcG9ydCB7CisJCQkjcGh5LWNlbGxzID0gPDA+OworCQl9OworCX07CisKKwl0Y3BoeTE6IHBoeUBmZjgwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LXR5cGVjLXBoeSI7CisJCXJlZyA9IDwweDAgMHhmZjgwMDAwMCAweDAgMHg0MDAwMD47CisJCXJvY2tjaGlwLGdyZiA9IDwmZ3JmPjsKKwkJZXh0Y29uID0gPCZmdXNiMT47CisJCWNsb2NrcyA9IDwmY3J1IFNDTEtfVVBIWTFfVENQRENPUkU+LAorCQkJIDwmY3J1IFNDTEtfVVBIWTFfVENQRFBIWV9SRUY+OworCQljbG9jay1uYW1lcyA9ICJ0Y3BkY29yZSIsICJ0Y3BkcGh5LXJlZiI7CisJCWFzc2lnbmVkLWNsb2NrcyA9IDwmY3J1IFNDTEtfVVBIWTFfVENQRENPUkU+OworCQlhc3NpZ25lZC1jbG9jay1yYXRlcyA9IDw1MDAwMDAwMD47CisJCXJlc2V0cyA9IDwmY3J1IFNSU1RfVVBIWTE+LAorCQkJIDwmY3J1IFNSU1RfVVBIWTFfUElQRV9MMDA+LAorCQkJIDwmY3J1IFNSU1RfUF9VUEhZMV9UQ1BIWT47CisJCXJlc2V0LW5hbWVzID0gInVwaHkiLCAidXBoeS1waXBlIiwgInVwaHktdGNwaHkiOworCQlyb2NrY2hpcCx0eXBlYy1jb25uLWRpciA9IDwweGU1OGMgMCAxNj47CisJCXJvY2tjaGlwLHVzYjN0b3VzYjItZW4gPSA8MHhlNThjIDMgMTk+OworCQlyb2NrY2hpcCxleHRlcm5hbC1wc20gPSA8MHhlNTk0IDE0IDMwPjsKKwkJcm9ja2NoaXAscGlwZS1zdGF0dXMgPSA8MHhlNWMwIDE2IDE2PjsKKworCQl0Y3BoeTFfZHA6IGRwLXBvcnQgeworCQkJI3BoeS1jZWxscyA9IDwwPjsKKwkJfTsKKworCQl0Y3BoeTFfdXNiMzogdXNiMy1wb3J0IHsKKwkJCSNwaHktY2VsbHMgPSA8MD47CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcmNhci1nZW4zLXBoeS11c2IyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcmNhci1nZW4zLXBoeS11c2IyLnR4dAppbmRleCAyMjgxZDZjLi5hY2U5Y2NlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3JjYXItZ2VuMy1waHktdXNiMi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9yY2FyLWdlbjMtcGh5LXVzYjIudHh0CkBAIC02LDYgKzYsOCBAQAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZTogInJlbmVzYXMsdXNiMi1waHktcjhhNzc5NSIgaWYgdGhlIGRldmljZSBpcyBhIHBhcnQgb2YgYW4gUjhBNzc5NQogCSAgICAgIFNvQy4KKwkgICAgICAicmVuZXNhcyx1c2IyLXBoeS1yOGE3Nzk2IiBpZiB0aGUgZGV2aWNlIGlzIGEgcGFydCBvZiBhbiBSOEE3Nzk2CisJICAgICAgU29DLgogCSAgICAgICJyZW5lc2FzLHJjYXItZ2VuMy11c2IyLXBoeSIgZm9yIGEgZ2VuZXJpYyBSLUNhciBHZW4zIGNvbXBhdGlibGUgZGV2aWNlLgogCiAJICAgICAgV2hlbiBjb21wYXRpYmxlIHdpdGggdGhlIGdlbmVyaWMgdmVyc2lvbiwgbm9kZXMgbXVzdCBsaXN0IHRoZQpAQCAtMzAsMTEgKzMyLDExIEBACiAJCWNvbXBhdGlibGUgPSAicmVuZXNhcyx1c2IyLXBoeS1yOGE3Nzk1IiwgInJlbmVzYXMscmNhci1nZW4zLXVzYjItcGh5IjsKIAkJcmVnID0gPDAgMHhlZTA4MDIwMCAwIDB4NzAwPjsKIAkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDEwOCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKLQkJY2xvY2tzID0gPCZtc3RwN19jbGtzIFI4QTc3OTVfQ0xLX0VIQ0kwPjsKKwkJY2xvY2tzID0gPCZjcGcgQ1BHX01PRCA3MDM+OwogCX07CiAKIAl1c2ItcGh5QGVlMGEwMjAwIHsKIAkJY29tcGF0aWJsZSA9ICJyZW5lc2FzLHVzYjItcGh5LXI4YTc3OTUiLCAicmVuZXNhcyxyY2FyLWdlbjMtdXNiMi1waHkiOwogCQlyZWcgPSA8MCAweGVlMGEwMjAwIDAgMHg3MDA+OwotCQljbG9ja3MgPSA8Jm1zdHA3X2Nsa3MgUjhBNzc5NV9DTEtfRUhDSTA+OworCQljbG9ja3MgPSA8JmNwZyBDUEdfTU9EIDcwMj47CiAJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcm9ja2NoaXAtcGNpZS1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9yb2NrY2hpcC1wY2llLXBoeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2MjIyYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcm9ja2NoaXAtcGNpZS1waHkudHh0CkBAIC0wLDAgKzEsMzEgQEAKK1JvY2tjaGlwIFBDSUUgUEhZCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZTogcm9ja2NoaXAscmszMzk5LXBjaWUtcGh5CisgLSAjcGh5LWNlbGxzOiBtdXN0IGJlIDAKKyAtIGNsb2NrczogTXVzdCBjb250YWluIGFuIGVudHJ5IGluIGNsb2NrLW5hbWVzLgorCVNlZSAuLi9jbG9ja3MvY2xvY2stYmluZGluZ3MudHh0IGZvciBkZXRhaWxzLgorIC0gY2xvY2stbmFtZXM6IE11c3QgYmUgInJlZmNsayIKKyAtIHJlc2V0czogTXVzdCBjb250YWluIGFuIGVudHJ5IGluIHJlc2V0LW5hbWVzLgorCVNlZSAuLi9yZXNldC9yZXNldC50eHQgZm9yIGRldGFpbHMuCisgLSByZXNldC1uYW1lczogTXVzdCBiZSAicGh5IgorCitFeGFtcGxlOgorCitncmY6IHN5c2NvbkBmZjc3MDAwMCB7CisJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktZ3JmIiwgInN5c2NvbiIsICJzaW1wbGUtbWZkIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKworCS4uLgorCisJcGNpZV9waHk6IHBjaWUtcGh5IHsKKwkJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktcGNpZS1waHkiOworCQkjcGh5LWNlbGxzID0gPDA+OworCQljbG9ja3MgPSA8JmNydSBTQ0xLX1BDSUVQSFlfUkVGPjsKKwkJY2xvY2stbmFtZXMgPSAicmVmY2xrIjsKKwkJcmVzZXRzID0gPCZjcnUgU1JTVF9QQ0lFUEhZPjsKKwkJcmVzZXQtbmFtZXMgPSAicGh5IjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcm9ja2NoaXAtdXNiLXBoeS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3JvY2tjaGlwLXVzYi1waHkudHh0CmluZGV4IGNjNmJlOTYuLjU3ZGMzODggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcm9ja2NoaXAtdXNiLXBoeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9yb2NrY2hpcC11c2ItcGh5LnR4dApAQCAtMjcsNiArMjcsOSBAQAogLSBjbG9ja3MgOiBwaGFuZGxlICsgY2xvY2sgc3BlY2lmaWVyIGZvciB0aGUgcGh5IGNsb2NrcwogLSBjbG9jay1uYW1lczogc3RyaW5nLCBjbG9jayBuYW1lLCBtdXN0IGJlICJwaHljbGsiCiAtICNjbG9jay1jZWxsczogZm9yIHVzZXJzIG9mIHRoZSBwaHktcGxsLCBzaG91bGQgYmUgMAorLSByZXNldC1uYW1lczogT25seSBhbGxvdyB0aGUgZm9sbG93aW5nIGVudHJpZXM6CisgLSBwaHktcmVzZXQKKy0gcmVzZXRzOiBNdXN0IGNvbnRhaW4gYW4gZW50cnkgZm9yIGVhY2ggZW50cnkgaW4gcmVzZXQtbmFtZXMuCiAKIEV4YW1wbGU6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvc3VuNGktdXNiLXBoeS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3N1bjRpLXVzYi1waHkudHh0CmluZGV4IDk1NzM2ZDcuLjI4NzE1MGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvc3VuNGktdXNiLXBoeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zdW40aS11c2ItcGh5LnR4dApAQCAtMTAsNiArMTAsNyBAQAogICAqIGFsbHdpbm5lcixzdW44aS1hMjMtdXNiLXBoeQogICAqIGFsbHdpbm5lcixzdW44aS1hMzMtdXNiLXBoeQogICAqIGFsbHdpbm5lcixzdW44aS1oMy11c2ItcGh5CisgICogYWxsd2lubmVyLHN1bjUwaS1hNjQtdXNiLXBoeQogLSByZWcgOiBhIGxpc3Qgb2Ygb2Zmc2V0ICsgbGVuZ3RoIHBhaXJzCiAtIHJlZy1uYW1lcyA6CiAgICogInBoeV9jdHJsIgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS90aS1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS90aS1waHkudHh0CmluZGV4IGEzYjM5NDUuLmNkMTNlNjE1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3RpLXBoeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS90aS1waHkudHh0CkBAIC0zMSw2ICszMSw4IEBACiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAgLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgInRpLG9tYXAtdXNiMiIKKwkgICAgICAgU2hvdWxkIGJlICJ0aSxkcmE3eC11c2IyIiBmb3IgdGhlIDFzdCBpbnN0YW5jZSBvZiBVU0IyIFBIWSBvbgorCSAgICAgICBEUkE3eAogCSAgICAgICBTaG91bGQgYmUgInRpLGRyYTd4LXVzYjItcGh5MiIgZm9yIHRoZSAybmQgaW5zdGFuY2Ugb2YgVVNCMiBQSFkKIAkgICAgICAgaW4gRFJBN3gKICAtIHJlZyA6IEFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvYWxsd2lubmVyLHN1bnhpLXBpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvYWxsd2lubmVyLHN1bnhpLXBpbmN0cmwudHh0CmluZGV4IDY5NjE3MjIuLjE2ODU4MjEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL2FsbHdpbm5lcixzdW54aS1waW5jdHJsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9hbGx3aW5uZXIsc3VueGktcGluY3RybC50eHQKQEAgLTIzLDYgKzIzLDcgQEAKICAgImFsbHdpbm5lcixzdW44aS1oMy1waW5jdHJsIgogICAiYWxsd2lubmVyLHN1bjhpLWgzLXItcGluY3RybCIKICAgImFsbHdpbm5lcixzdW41MGktYTY0LXBpbmN0cmwiCisgICJuZXh0dGhpbmcsZ3I4LXBpbmN0cmwiCiAKIC0gcmVnOiBTaG91bGQgY29udGFpbiB0aGUgcmVnaXN0ZXIgcGh5c2ljYWwgYWRkcmVzcyBhbmQgbGVuZ3RoIGZvciB0aGUKICAgcGluIGNvbnRyb2xsZXIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLWFzcGVlZC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLWFzcGVlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2MGFkMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3BpbmN0cmwtYXNwZWVkLnR4dApAQCAtMCwwICsxLDY1IEBACitBc3BlZWQgUGluIENvbnRyb2xsZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBBc3BlZWQgU29DcyB2YXJ5IGluIGZ1bmN0aW9uYWxpdHkgaW5zaWRlIGEgZ2VuZXJhdGlvbiBidXQgaGF2ZSBhIGNvbW1vbiBtdXgKK2RldmljZSByZWdpc3RlciBsYXlvdXQuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgYW55IG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCQkiYXNwZWVkLGFzdDI0MDAtcGluY3RybCIKKwkJImFzcGVlZCxnNC1waW5jdHJsIgorCQkiYXNwZWVkLGFzdDI1MDAtcGluY3RybCIKKwkJImFzcGVlZCxnNS1waW5jdHJsIgorCitUaGUgcGluIGNvbnRyb2xsZXIgbm9kZSBzaG91bGQgYmUgYSBjaGlsZCBvZiBhIHN5c2NvbiBub2RlIHdpdGggdGhlIHJlcXVpcmVkCitwcm9wZXJ0eToKKy0gY29tcGF0aWJsZTogInN5c2NvbiIsICJzaW1wbGUtbWZkIgorCitSZWZlciB0byB0aGUgdGhlIGJpbmRpbmdzIGRlc2NyaWJlZCBpbgorRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9zeXNjb24udHh0CisKK1N1Ym5vZGUgRm9ybWF0CistLS0tLS0tLS0tLS0tLQorCitUaGUgcmVxdWlyZWQgcHJvcGVydGllcyBvZiBjaGlsZCBub2RlcyBhcmUgKGFzIGRlZmluZWQgaW4gcGluY3RybC1iaW5kaW5ncyk6CistIGZ1bmN0aW9uCistIGdyb3VwcworCitFYWNoIGZ1bmN0aW9uIGhhcyBvbmx5IG9uZSBhc3NvY2lhdGVkIHBpbiBncm91cC4gRWFjaCBncm91cCBpcyBuYW1lZCBieSBpdHMKK2Z1bmN0aW9uLiBUaGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgdGhlIGZ1bmN0aW9uIGFuZCBncm91cHMgcHJvcGVydGllcyBhcmUKK3N1cHBvcnRlZDoKKworYXNwZWVkLGFzdDI0MDAtcGluY3RybCwgYXNwZWVkLGc0LXBpbmN0cmw6CisKK0FDUEkgQk1DSU5UIEREQ0NMSyBERENEQVQgRkxBQ0sgRkxCVVNZIEZMV1AgR1BJRDAgR1BJRTAgR1BJRTIgR1BJRTQgR1BJRTYgSTJDMTAKK0kyQzExIEkyQzEyIEkyQzEzIEkyQzMgSTJDNCBJMkM1IEkyQzYgSTJDNyBJMkM4IEkyQzkgTFBDUEQgTFBDUE1FIExQQ1NNSSBNRElPMQorTURJTzIgTkNUUzEgTkNUUzMgTkNUUzQgTkRDRDEgTkRDRDMgTkRDRDQgTkRTUjEgTkRTUjMgTkRUUjEgTkRUUjMgTlJJMSBOUkkzCitOUkk0IE5SVFMxIE5SVFMzIFBXTTAgUFdNMSBQV00yIFBXTTMgUFdNNCBQV001IFBXTTYgUFdNNyBSR01JSTEgUk1JSTEgUk9NMTYKK1JPTTggUk9NQ1MxIFJPTUNTMiBST01DUzMgUk9NQ1M0IFJYRDEgUlhEMyBSWEQ0IFNEMSBTR1BNSSBTSU9QQkkgU0lPUEJPIFRJTUVSMworVElNRVI1IFRJTUVSNiBUSU1FUjcgVElNRVI4IFRYRDEgVFhEMyBUWEQ0IFVBUlQ2IFZHQUhTIFZHQVZTIFZQSTE4IFZQSTI0IFZQSTMwCitWUE8xMiBWUE8yNAorCithc3BlZWQsYXN0MjUwMC1waW5jdHJsLCBhc3BlZWQsZzUtcGluY3RybDoKKworR1BJRDAgR1BJRDIgR1BJRTAgSTJDMTAgSTJDMTEgSTJDMTIgSTJDMTMgSTJDMTQgSTJDMyBJMkM0IEkyQzUgSTJDNiBJMkM3IEkyQzgKK0kyQzkgTUFDMUxJTksgTURJTzEgTURJTzIgT1NDQ0xLIFBFV0FLRSBQV00wIFBXTTEgUFdNMiBQV00zIFBXTTQgUFdNNSBQV002IFBXTTcKK1JHTUlJMSBSR01JSTIgUk1JSTEgUk1JSTIgU0QxIFNQSTEgVElNRVI0IFRJTUVSNSBUSU1FUjYgVElNRVI3IFRJTUVSOAorCitFeGFtcGxlczoKKworc3lzY29uOiBzY3VAMWU2ZTIwMDAgeworCWNvbXBhdGlibGUgPSAic3lzY29uIiwgInNpbXBsZS1tZmQiOworCXJlZyA9IDwweDFlNmUyMDAwIDB4MWE4PjsKKworCXBpbmN0cmw6IHBpbmN0cmwgeworCQljb21wYXRpYmxlID0gImFzcGVlZCxnNC1waW5jdHJsIjsKKworCQlwaW5jdHJsX2kyYzNfZGVmYXVsdDogaTJjM19kZWZhdWx0IHsKKwkJCWZ1bmN0aW9uID0gIkkyQzMiOworCQkJZ3JvdXBzID0gIkkyQzMiOworCQl9OworCX07Cit9OworCitQbGVhc2UgcmVmZXIgdG8gcGluY3RybC1iaW5kaW5ncy50eHQgaW4gdGhpcyBkaXJlY3RvcnkgZm9yIGRldGFpbHMgb2YgdGhlCitjb21tb24gcGluY3RybCBiaW5kaW5ncyB1c2VkIGJ5IGNsaWVudCBkZXZpY2VzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcGluY3RybC1zdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXN0LnR4dAppbmRleCAyNmJjYjE4Li4wMTNjNjc1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXN0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXN0LnR4dApAQCAtMzAsOCArMzAsNyBAQAogCiBQaW4gY29udHJvbGxlciBub2RlOgogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZQk6IHNob3VsZCBiZSAic3QsPFNPQz4tPHBpby1ibG9jaz4tcGluY3RybCIKLQlsaWtlIHN0LHN0aWg0MTUtc2JjLXBpbmN0cmwsIHN0LHN0aWg0MTUtZnJvbnQtcGluY3RybCBhbmQgc28gb24uCistIGNvbXBhdGlibGUJOiBzaG91bGQgYmUgInN0LHN0aWg0MDctPHBpby1ibG9jaz4tcGluY3RybCIKIC0gc3Qsc3lzY2ZnCQk6IFNob3VsZCBiZSBhIHBoYW5kbGUgb2YgdGhlIHN5c2NmZyBub2RlLgogLSBzdCxyZXRpbWUtcGluLW1hc2sJOiBTaG91bGQgYmUgbWFzayB0byBzcGVjaWZ5IHdoaWNoIHBpbnMgY2FuIGJlIHJldGltZWQuCiAJSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBwcmVzZW50LCBpdCBpcyBhc3N1bWVkIHRoYXQgYWxsIHRoZSBwaW5zIGluIHRoZQpAQCAtNTAsNyArNDksMTEgQEAKIEdQSU8gY29udHJvbGxlci9iYW5rIG5vZGUuCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogLSBncGlvLWNvbnRyb2xsZXIgOiBJbmRpY2F0ZXMgdGhpcyBkZXZpY2UgaXMgYSBHUElPIGNvbnRyb2xsZXIKLS0gI2dwaW8tY2VsbHMJICA6IFNob3VsZCBiZSBvbmUuIFRoZSBmaXJzdCBjZWxsIGlzIHRoZSBwaW4gbnVtYmVyLgorLSAjZ3Bpby1jZWxscwkgIDogTXVzdCBiZSB0d28uCisgICAgIC0gRmlyc3QgY2VsbDogc3BlY2lmaWVzIHRoZSBwaW4gbnVtYmVyIGluc2lkZSB0aGUgY29udHJvbGxlcgorICAgICAtIFNlY29uZCBjZWxsOiBzcGVjaWZpZXMgd2hldGhlciB0aGUgcGluIGlzIGxvZ2ljYWxseSBpbnZlcnRlZC4KKyAgICAgICAtIDAgPSBhY3RpdmUgaGlnaAorICAgICAgIC0gMSA9IGFjdGl2ZSBsb3cKIC0gc3QsYmFuay1uYW1lCSAgOiBTaG91bGQgYmUgYSBuYW1lIHN0cmluZyBmb3IgdGhpcyBiYW5rIGFzIHNwZWNpZmllZCBpbgogICBkYXRhc2hlZXQuCiAKQEAgLTc2LDIzICs3OSwyMyBAQAogCiBFeGFtcGxlOgogCXBpbi1jb250cm9sbGVyLXNiYyB7Ci0JCSNhZGRyZXNzLWNlbGxzCT0gPDE+OwotCQkjc2l6ZS1jZWxscwk9IDwxPjsKLQkJY29tcGF0aWJsZQk9ICJzdCxzdGloNDE1LXNiYy1waW5jdHJsIjsKLQkJc3Qsc3lzY2ZnCT0gPCZzeXNjZmdfc2JjPjsKLQkJcmVnIAkJPSA8MHhmZTYxZjA4MCAweDQ+OwotCQlyZWctbmFtZXMJPSAiaXJxbXV4IjsKLQkJaW50ZXJydXB0cyAJPSA8R0lDX1NQSSAxODAgSVJRX1RZUEVfTEVWRUxfSElHSD47Ci0JCWludGVycnVwdC1uYW1lcwk9ICJpcnFtdXgiOwotCQlyYW5nZXMgCQk9IDwwIDB4ZmU2MTAwMDAgMHg1MDAwPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gInN0LHN0aWg0MDctc2JjLXBpbmN0cmwiOworCQlzdCxzeXNjZmcgPSA8JnN5c2NmZ19zYmM+OworCQlyZWcgPSA8MHgwOTYxZjA4MCAweDQ+OworCQlyZWctbmFtZXMgPSAiaXJxbXV4IjsKKwkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDE4OCBJUlFfVFlQRV9OT05FPjsKKwkJaW50ZXJydXB0LW5hbWVzID0gImlycW11eCI7CisJCXJhbmdlcyA9IDwwIDB4MDk2MTAwMDAgMHg2MDAwPjsKIAotCQlQSU8wOiBncGlvQGZlNjEwMDAwIHsKKwkJcGlvMDogZ3Bpb0AwOTYxMDAwMCB7CiAJCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscwk9IDwxPjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OwogCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwotCQkJcmVnCQk9IDwwIDB4MTAwPjsKLQkJCXN0LGJhbmstbmFtZQk9ICJQSU8wIjsKKwkJCXJlZyA9IDwweDAgMHgxMDA+OworCQkJc3QsYmFuay1uYW1lID0gIlBJTzAiOwogCQl9OwogCQkuLi4KIAkJcGluLWZ1bmN0aW9ucyBub2RlcyBmb2xsb3cuLi4KQEAgLTE2Miw3ICsxNjUsNyBAQAogCiBzZGhjaTA6c2RoY2lAZmU4MTAwMDB7CiAJLi4uCi0JaW50ZXJydXB0LXBhcmVudCA9IDwmUElPMz47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmcGlvMz47CiAJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKIAlpbnRlcnJ1cHRzID0gPDMgSVJRX1RZUEVfTEVWRUxfSElHSD47IC8qIEludGVycnVwdCBsaW5lIHZpYSBQSU8zLTMgKi8KIAlpbnRlcnJ1cHQtbmFtZXMgPSAiY2FyZC1kZXRlY3QiOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxwbWljLWdwaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxwbWljLWdwaW8udHh0CmluZGV4IGE1NGMzOWUuLjhkODkzYTggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20scG1pYy1ncGlvLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9xY29tLHBtaWMtZ3Bpby50eHQKQEAgLTE3LDYgKzE3LDkgQEAKIAkJICAgICJxY29tLHBtODk5NC1ncGlvIgogCQkgICAgInFjb20scG1hODA4NC1ncGlvIgogCisJCSAgICBBbmQgbXVzdCBjb250YWluIGVpdGhlciAicWNvbSxzcG1pLWdwaW8iIG9yICJxY29tLHNzYmktZ3BpbyIKKwkJICAgIGlmIHRoZSBkZXZpY2UgaXMgb24gYW4gc3BtaSBidXMgb3IgYW4gc3NiaSBidXMgcmVzcGVjdGl2ZWx5CisKIC0gcmVnOgogCVVzYWdlOiByZXF1aXJlZAogCVZhbHVlIHR5cGU6IDxwcm9wLWVuY29kZWQtYXJyYXk+CkBAIC0xODMsNyArMTg2LDcgQEAKIEV4YW1wbGU6CiAKIAlwbTg5MjFfZ3BpbzogZ3Bpb0AxNTAgewotCQljb21wYXRpYmxlID0gInFjb20scG04OTIxLWdwaW8iOworCQljb21wYXRpYmxlID0gInFjb20scG04OTIxLWdwaW8iLCAicWNvbSxzc2JpLWdwaW8iOwogCQlyZWcgPSA8MHgxNTAgMHgxNjA+OwogCQlpbnRlcnJ1cHRzID0gPDE5MiAxPiwgPDE5MyAxPiwgPDE5NCAxPiwKIAkJCSAgICAgPDE5NSAxPiwgPDE5NiAxPiwgPDE5NyAxPiwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20scG1pYy1tcHAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxwbWljLW1wcC50eHQKaW5kZXggYjQ4NGJhMS4uMmFiOTViYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxwbWljLW1wcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxwbWljLW1wcC50eHQKQEAgLTE5LDYgKzE5LDkgQEAKIAkJICAgICJxY29tLHBtODk5NC1tcHAiLAogCQkgICAgInFjb20scG1hODA4NC1tcHAiLAogCisJCSAgICBBbmQgbXVzdCBjb250YWluIGVpdGhlciAicWNvbSxzcG1pLW1wcCIgb3IgInFjb20sc3NiaS1tcHAiCisJCSAgICBpZiB0aGUgZGV2aWNlIGlzIG9uIGFuIHNwbWkgYnVzIG9yIGFuIHNzYmkgYnVzIHJlc3BlY3RpdmVseS4KKwogLSByZWc6CiAJVXNhZ2U6IHJlcXVpcmVkCiAJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KQEAgLTE1OCw3ICsxNjEsNyBAQAogRXhhbXBsZToKIAogCW1wcHNAYTAwMCB7Ci0JCWNvbXBhdGlibGUgPSAicWNvbSxwbTg4NDEtbXBwIjsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHBtODg0MS1tcHAiLCAicWNvbSxzcG1pLW1wcCI7CiAJCXJlZyA9IDwweGEwMDA+OwogCQlncGlvLWNvbnRyb2xsZXI7CiAJCSNncGlvLWNlbGxzID0gPDI+OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcmVuZXNhcyxwZmMtcGluY3RybC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9yZW5lc2FzLHBmYy1waW5jdHJsLnR4dAppbmRleCBlNGNmMDIyLi4xM2RmOTQ5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9yZW5lc2FzLHBmYy1waW5jdHJsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9yZW5lc2FzLHBmYy1waW5jdHJsLnR4dApAQCAtMTcsOSArMTcsMTEgQEAKICAgICAtICJyZW5lc2FzLHBmYy1yOGE3Nzc5IjogZm9yIFI4QTc3NzkgKFItQ2FyIEgxKSBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgogICAgIC0gInJlbmVzYXMscGZjLXI4YTc3OTAiOiBmb3IgUjhBNzc5MCAoUi1DYXIgSDIpIGNvbXBhdGlibGUgcGluLWNvbnRyb2xsZXIuCiAgICAgLSAicmVuZXNhcyxwZmMtcjhhNzc5MSI6IGZvciBSOEE3NzkxIChSLUNhciBNMi1XKSBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgorICAgIC0gInJlbmVzYXMscGZjLXI4YTc3OTIiOiBmb3IgUjhBNzc5MiAoUi1DYXIgVjJIKSBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgogICAgIC0gInJlbmVzYXMscGZjLXI4YTc3OTMiOiBmb3IgUjhBNzc5MyAoUi1DYXIgTTItTikgY29tcGF0aWJsZSBwaW4tY29udHJvbGxlci4KICAgICAtICJyZW5lc2FzLHBmYy1yOGE3Nzk0IjogZm9yIFI4QTc3OTQgKFItQ2FyIEUyKSBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgogICAgIC0gInJlbmVzYXMscGZjLXI4YTc3OTUiOiBmb3IgUjhBNzc5NSAoUi1DYXIgSDMpIGNvbXBhdGlibGUgcGluLWNvbnRyb2xsZXIuCisgICAgLSAicmVuZXNhcyxwZmMtcjhhNzc5NiI6IGZvciBSOEE3Nzk2IChSLUNhciBNMy1XKSBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgogICAgIC0gInJlbmVzYXMscGZjLXNoNzNhMCI6IGZvciBTSDczQTAgKFNILU1vYmlsZSBBRzUpIGNvbXBhdGlibGUgcGluLWNvbnRyb2xsZXIuCiAKICAgLSByZWc6IEJhc2UgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIGVhY2ggbWVtb3J5IHJlc291cmNlIHVzZWQgYnkgdGhlIHBpbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvc3Qsc3RtMzItcGluY3RybC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9zdCxzdG0zMi1waW5jdHJsLnR4dAppbmRleCA1ODdiZmZiLi5mOTc1M2M0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9zdCxzdG0zMi1waW5jdHJsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9zdCxzdG0zMi1waW5jdHJsLnR4dApAQCAtMTQsNiArMTQsMTEgQEAKICAtICNzaXplLWNlbGxzCTogVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgbXVzdCBiZSAxCiAgLSByYW5nZXMJOiBkZWZpbmVzIG1hcHBpbmcgYmV0d2VlbiBwaW4gY29udHJvbGxlciBub2RlIChwYXJlbnQpIHRvCiAgICBncGlvLWJhbmsgbm9kZSAoY2hpbGRyZW4pLgorIC0gaW50ZXJydXB0LXBhcmVudDogcGhhbmRsZSBvZiB0aGUgaW50ZXJydXB0IHBhcmVudCB0byB3aGljaCB0aGUgZXh0ZXJuYWwKKyAgIEdQSU8gaW50ZXJydXB0cyBhcmUgZm9yd2FyZGVkIHRvLgorIC0gc3Qsc3lzY2ZnOiBTaG91bGQgYmUgcGhhbmRsZS9vZmZzZXQgcGFpci4gVGhlIHBoYW5kbGUgdG8gdGhlIHN5c2NvbiBub2RlCisgICB3aGljaCBpbmNsdWRlcyBJUlEgbXV4IHNlbGVjdGlvbiByZWdpc3RlciwgYW5kIHRoZSBvZmZzZXQgb2YgdGhlIElSUSBtdXgKKyAgIHNlbGVjdGlvbiByZWdpc3Rlci4KICAtIHBpbnMtYXJlLW51bWJlcmVkOiBTcGVjaWZ5IHRoZSBzdWJub2RlcyBhcmUgdXNpbmcgbnVtYmVyZWQgcGlubXV4IHRvCiAgICBzcGVjaWZ5IHBpbnMuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcnBjL2ZzbC9tZW0tY3RybHIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VycGMvZnNsL21lbS1jdHJsci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4Nzg1NmYuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VycGMvZnNsL21lbS1jdHJsci50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1GcmVlc2NhbGUgRERSIG1lbW9yeSBjb250cm9sbGVyCi0KLVByb3BlcnRpZXM6Ci0KLS0gY29tcGF0aWJsZQk6IFNob3VsZCBpbmNsdWRlICJmc2wsY2hpcC1tZW1vcnktY29udHJvbGxlciIgd2hlcmUKLQkJICBjaGlwIGlzIHRoZSBwcm9jZXNzb3IgKGJzYzkxMzIsIG1wYzg1NzIgZXRjLiksIG9yCi0JCSAgImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlciIuCi0tIHJlZwkJOiBBZGRyZXNzIGFuZCBzaXplIG9mIEREUiBjb250cm9sbGVyIHJlZ2lzdGVycwotLSBpbnRlcnJ1cHRzCTogRXJyb3IgaW50ZXJydXB0IG9mIEREUiBjb250cm9sbGVyCi0KLUV4YW1wbGUgMToKLQotCW1lbW9yeS1jb250cm9sbGVyQDIwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxic2M5MTMyLW1lbW9yeS1jb250cm9sbGVyIjsKLQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OwotCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSA4PjsKLQl9OwotCi0KLUV4YW1wbGUgMjoKLQotCWRkcjE6IG1lbW9yeS1jb250cm9sbGVyQDgwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlci12NC43IiwKLQkJCQkiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyIjsKLQkJcmVnID0gPDB4ODAwMCAweDEwMDA+OwotCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyMz47Ci0JfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvbHRjMzY3Ni50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL2x0YzM2NzYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZWIzNjYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL2x0YzM2NzYudHh0CkBAIC0wLDAgKzEsOTQgQEAKK0xpbmVhciBUZWNobm9sb2d5IExUQzM2NzYgOC1vdXRwdXQgcmVndWxhdG9ycworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAibGx0YyxsdGMzNjc2IgorLSByZWc6IEkyQyBzbGF2ZSBhZGRyZXNzCisKK1JlcXVpcmVkIGNoaWxkIG5vZGU6CistIHJlZ3VsYXRvcnM6IENvbnRhaW5zIGVpZ2h0IHJlZ3VsYXRvciBjaGlsZCBub2RlcyBzdzEsIHN3Miwgc3czLCBzdzQsCisgIGxkbzEsIGxkbzIsIGxkbzMsIGFuZCBsZG80LCBzcGVjaWZ5aW5nIHRoZSBpbml0aWFsaXphdGlvbiBkYXRhIGFzCisgIGRvY3VtZW50ZWQgaW4gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9yZWd1bGF0b3IudHh0LgorCitFYWNoIHJlZ3VsYXRvciBpcyBkZWZpbmVkIHVzaW5nIHRoZSBzdGFuZGFyZCBiaW5kaW5nIGZvciByZWd1bGF0b3JzLiBUaGUKK25vZGVzIGZvciBzdzEsIHN3Miwgc3czLCBzdzQsIGxkbzEsIGxkbzIgYW5kIGxkbzQgYWRkaXRpb25hbGx5IG5lZWQgdG8gc3BlY2lmeQordGhlIHJlc2lzdG9yIHZhbHVlcyBvZiB0aGVpciBleHRlcm5hbCBmZWVkYmFjayB2b2x0YWdlIGRpdmlkZXJzOgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzIChub3Qgb24gbGRvMyk6CistIGxsdGMsZmItdm9sdGFnZS1kaXZpZGVyOiBBbiBhcnJheSBvZiB0d28gaW50ZWdlcnMgY29udGFpbmluZyB0aGUgcmVzaXN0b3IKKyAgdmFsdWVzIFIxIGFuZCBSMiBvZiB0aGUgZmVlZGJhY2sgdm9sdGFnZSBkaXZpZGVyIGluIG9obXMuCisKK1JlZ3VsYXRvcnMgc3cxLCBzdzIsIHN3Mywgc3c0IGNhbiByZWd1bGF0ZSB0aGUgZmVlZGJhY2sgcmVmZXJlbmNlIGZyb206Cis0MTIuNW1WIHRvIDgwMG1WIGluIDEyLjUgbVYgc3RlcHMuIFRoZSBvdXRwdXQgdm9sdGFnZSB0aHVzIHJhbmdlcyBiZXR3ZWVuCiswLjQxMjUgKiAoMSArIFIxL1IyKSBWIGFuZCAwLjggKiAoMSArIFIxL1IyKSBWLgorCitSZWd1bGF0b3JzIGxkbzEsIGxkbzIsIGFuZCBsZG80IGhhdmUgYSBmaXhlZCAwLjcyNSBWIHJlZmVyZW5jZSBhbmQgdGh1cyBvdXRwdXQKKzAuNzI1ICogKDEgKyBSMS9SMikgVi4gVGhlIGxkbzMgcmVndWxhdG9yIGlzIGZpeGVkIHRvIDEuOCBWLiAgVGhlIGxkbzEgc3RhbmRieQorcmVndWxhdG9yIGNhbiBub3QgYmUgZGlzYWJsZWQgYW5kIHRodXMgc2hvdWxkIGhhdmUgdGhlIHJlZ3VsYXRvci1hbHdheXMtb24KK3Byb3BlcnR5IHNldC4KKworRXhhbXBsZToKKworCWx0YzM2NzY6IHBtaWNAM2MgeworCQljb21wYXRpYmxlID0gImxsdGMsbHRjMzY3NiI7CisJCXJlZyA9IDwweDNjPjsKKworCQlyZWd1bGF0b3JzIHsKKwkJCXN3MV9yZWc6IHN3MSB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8Njc0NDAwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxMzA4MDAwPjsKKwkJCQlsbHRjLGZiLXZvbHRhZ2UtZGl2aWRlciA9IDwxMjcwMDAgMjAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItcmFtcC1kZWxheSA9IDw3MDAwPjsKKwkJCQlyZWd1bGF0b3ItYm9vdC1vbjsKKwkJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOworCQkJfTsKKworCQkJc3cyX3JlZzogc3cyIHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwxMDMzMzEwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwyMDA0MDA+OworCQkJCWxsdGMsZmItdm9sdGFnZS1kaXZpZGVyID0gPDMwMTAwMCAyMDAwMDA+OworCQkJCXJlZ3VsYXRvci1yYW1wLWRlbGF5ID0gPDcwMDA+OworCQkJCXJlZ3VsYXRvci1ib290LW9uOworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQl9OworCisJCQlzdzNfcmVnOiBzdzMgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDY3NDQwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTMwODAwPjsKKwkJCQlsbHRjLGZiLXZvbHRhZ2UtZGl2aWRlciA9IDwxMjcwMDAgMjAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItcmFtcC1kZWxheSA9IDw3MDAwPjsKKwkJCQlyZWd1bGF0b3ItYm9vdC1vbjsKKwkJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOworCQkJfTsKKworCQkJc3c0X3JlZzogc3c0IHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw4NjgzMTA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDE2ODQwMD47CisJCQkJbGx0YyxmYi12b2x0YWdlLWRpdmlkZXIgPSA8MjIxMDAwIDIwMDAwMD47CisJCQkJcmVndWxhdG9yLXJhbXAtZGVsYXkgPSA8NzAwMD47CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCX07CisKKwkJCWxkbzJfcmVnOiBsZG8yIHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwyNDkwMzc1PjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwyNDkwMzc1PjsKKwkJCQlsbHRjLGZiLXZvbHRhZ2UtZGl2aWRlciA9IDw0ODcwMDAgMjAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItYm9vdC1vbjsKKwkJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOworCQkJfTsKKworCQkJbGRvM19yZWc6IGxkbzMgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDE4MDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDE4MDAwMDA+OworCQkJCXJlZ3VsYXRvci1ib290LW9uOworCQkJfTsKKworCQkJbGRvNF9yZWc6IGxkbzQgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDMwMjMyNTA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDMwMjMyNTA+OworCQkJCWxsdGMsZmItdm9sdGFnZS1kaXZpZGVyID0gPDYzNDAwMCAyMDAwMDA+OworCQkJCXJlZ3VsYXRvci1ib290LW9uOworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQl9OworCQl9OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3B2ODgwODAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9wdjg4MDgwLnR4dAppbmRleCAzOGE2MTQyLi5lNmU0YjljIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3B2ODgwODAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcHY4ODA4MC50eHQKQEAgLTEsMjIgKzEsMjggQEAKICogUG93ZXJ2ZW50dXJlIFNlbWljb25kdWN0b3IgUFY4ODA4MCBWb2x0YWdlIFJlZ3VsYXRvcgogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlOiAicHZzLHB2ODgwODAiLgotLSByZWc6IEkyQyBzbGF2ZSBhZGRyZXNzLCB1c3VhbGx5IDB4NDkuCistIGNvbXBhdGlibGU6IE11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcsIGRlcGVuZGluZyBvbiB0aGUKKyAgc2lsaWNvbiB2ZXJzaW9uOgorCS0gInB2cyxwdjg4MDgwIiAoREVQUkVDQVRFRCkKKworCS0gInB2cyxwdjg4MDgwLWFhIiBmb3IgUFY4ODA4MCBBQSBvciBBQiBzaWxpY29uCisJLSAicHZzLHB2ODgwODAtYmEiIGZvciBQVjg4MDgwIEJBIG9yIEJCIHNpbGljb24KKyAgTk9URTogVGhlIHVzZSBvZiB0aGUgY29tcGF0aWJsZXMgd2l0aCBubyBzaWxpY29uIHZlcnNpb24gaXMgZGVwcmVjYXRlZC4KKy0gcmVnOiBJMkMgc2xhdmUgYWRkcmVzcywgdXN1YWxseSAweDQ5CiAtIGludGVycnVwdHM6IHRoZSBpbnRlcnJ1cHQgb3V0cHV0cyBvZiB0aGUgY29udHJvbGxlcgogLSByZWd1bGF0b3JzOiBBIG5vZGUgdGhhdCBob3VzZXMgYSBzdWItbm9kZSBmb3IgZWFjaCByZWd1bGF0b3Igd2l0aGluIHRoZQogICBkZXZpY2UuIEVhY2ggc3ViLW5vZGUgaXMgaWRlbnRpZmllZCB1c2luZyB0aGUgbm9kZSdzIG5hbWUsIHdpdGggdmFsaWQKICAgdmFsdWVzIGxpc3RlZCBiZWxvdy4gVGhlIGNvbnRlbnQgb2YgZWFjaCBzdWItbm9kZSBpcyBkZWZpbmVkIGJ5IHRoZQogICBzdGFuZGFyZCBiaW5kaW5nIGZvciByZWd1bGF0b3JzOyBzZWUgcmVndWxhdG9yLnR4dC4KLSAgQlVDSzEsIEJVQ0syLCBhbmQgQlVDSzMuCisgIEJVQ0sxLCBCVUNLMiwgQlVDSzMgYW5kIEhWQlVDSy4KIAogT3B0aW9uYWwgcHJvcGVydGllczoKIC0gQW55IG9wdGlvbmFsIHByb3BlcnR5IGRlZmluZWQgaW4gcmVndWxhdG9yLnR4dAogCi1FeGFtcGxlCitFeGFtcGxlOgogCiAJcG1pYzogcHY4ODA4MEA0OSB7Ci0JCWNvbXBhdGlibGUgPSAicHZzLHB2ODgwODAiOworCQljb21wYXRpYmxlID0gInB2cyxwdjg4MDgwLWJhIjsKIAkJcmVnID0gPDB4NDk+OwogCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZncGlvPjsKIAkJaW50ZXJydXB0cyA9IDwyNCAyND47CkBAIC00NSw1ICs1MSwxMiBAQAogCQkJCXJlZ3VsYXRvci1taW4tbWljcm9hbXAgCT0gPDE0OTYwMDA+OwogCQkJCXJlZ3VsYXRvci1tYXgtbWljcm9hbXAgCT0gPDQxODkwMDA+OwogCQkJfTsKKworCQkJSFZCVUNLIHsKKwkJCQlyZWd1bGF0b3ItbmFtZSA9ICJodmJ1Y2siOworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPCAgIDUwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDEyNzUwMDA+OworIAkJCX07CiAJCX07CiAJfTsKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9yZWd1bGF0b3IudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9yZWd1bGF0b3IudHh0CmluZGV4IGVjZmM1OTMuLjZhYjVhZWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcmVndWxhdG9yLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3JlZ3VsYXRvci50eHQKQEAgLTEzLDcgKzEzLDcgQEAKIC0gcmVndWxhdG9yLWFsbG93LWJ5cGFzczogYWxsb3cgdGhlIHJlZ3VsYXRvciB0byBnbyBpbnRvIGJ5cGFzcyBtb2RlCiAtIHJlZ3VsYXRvci1hbGxvdy1zZXQtbG9hZDogYWxsb3cgdGhlIHJlZ3VsYXRvciBwZXJmb3JtYW5jZSBsZXZlbCB0byBiZSBjb25maWd1cmVkCiAtIDxuYW1lPi1zdXBwbHk6IHBoYW5kbGUgdG8gdGhlIHBhcmVudCBzdXBwbHkvcmVndWxhdG9yIG5vZGUKLS0gcmVndWxhdG9yLXJhbXAtZGVsYXk6IHJhbXAgZGVsYXkgZm9yIHJlZ3VsYXRvcihpbiB1Vi91UykKKy0gcmVndWxhdG9yLXJhbXAtZGVsYXk6IHJhbXAgZGVsYXkgZm9yIHJlZ3VsYXRvcihpbiB1Vi91cykKICAgRm9yIGhhcmR3YXJlIHdoaWNoIHN1cHBvcnRzIGRpc2FibGluZyByYW1wIHJhdGUsIGl0IHNob3VsZCBiZSBleHBsaWNpdGx5CiAgIGluaXRpYWxpc2VkIHRvIHplcm8gKHJlZ3VsYXRvci1yYW1wLWRlbGF5ID0gPDA+KSBmb3IgZGlzYWJsaW5nIHJhbXAgZGVsYXkuCiAtIHJlZ3VsYXRvci1lbmFibGUtcmFtcC1kZWxheTogVGhlIHRpbWUgdGFrZW4sIGluIG1pY3Jvc2Vjb25kcywgZm9yIHRoZSBzdXBwbHkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvODI1MC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsLzgyNTAudHh0CmluZGV4IGY1NTYxYWMuLmY4NmJiMDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvODI1MC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC84MjUwLnR4dApAQCAtNDIsOSArNDIsOCBAQAogLSBhdXRvLWZsb3ctY29udHJvbDogb25lIHdheSB0byBlbmFibGUgYXV0b21hdGljIGZsb3cgY29udHJvbCBzdXBwb3J0LiBUaGUKICAgZHJpdmVyIGlzIGFsbG93ZWQgdG8gZGV0ZWN0IHN1cHBvcnQgZm9yIHRoZSBjYXBhYmlsaXR5IGV2ZW4gd2l0aG91dCB0aGlzCiAgIHByb3BlcnR5LgotLSB7cnRzLGN0cyxkdHIsZHNyLHJuZyxkY2R9LWdwaW9zOiBzcGVjaWZ5IGEgR1BJTyBmb3IgUlRTL0NUUy9EVFIvRFNSL1JJL0RDRAotICBsaW5lIHJlc3BlY3RpdmVseS4gSXQgd2lsbCB1c2Ugc3BlY2lmaWVkIEdQSU8gaW5zdGVhZCBvZiB0aGUgcGVyaXBoZXJhbAotICBmdW5jdGlvbiBwaW4gZm9yIHRoZSBVQVJUIGZlYXR1cmUuIElmIHVuc3VyZSwgZG9uJ3Qgc3BlY2lmeSB0aGlzIHByb3BlcnR5LgorLSB0eC10aHJlc2hvbGQ6IFNwZWNpZnkgdGhlIFRYIEZJRk8gbG93IHdhdGVyIGluZGljYXRpb24gZm9yIHBhcnRzIHdpdGgKKyAgcHJvZ3JhbW1hYmxlIFRYIEZJRk8gdGhyZXNob2xkcy4KIAogTm90ZToKICogZnNsLG5zMTY1NTA6CkBAIC02NiwxOSArNjUsMyBAQAogCQlpbnRlcnJ1cHRzID0gPDEwPjsKIAkJcmVnLXNoaWZ0ID0gPDI+OwogCX07Ci0KLUV4YW1wbGUgZm9yIE9NQVAgVUFSVCB1c2luZyBHUElPLWJhc2VkIG1vZGVtIGNvbnRyb2wgc2lnbmFsczoKLQotCXVhcnQ0OiBzZXJpYWxANDkwNDIwMDAgewotCQljb21wYXRpYmxlID0gInRpLG9tYXAzLXVhcnQiOwotCQlyZWcgPSA8MHg0OTA0MjAwMCAweDQwMD47Ci0JCWludGVycnVwdHMgPSA8ODA+OwotCQl0aSxod21vZHMgPSAidWFydDQiOwotCQljbG9jay1mcmVxdWVuY3kgPSA8NDgwMDAwMDA+OwotCQljdHMtZ3Bpb3MgPSA8JmdwaW8zIDUgR1BJT19BQ1RJVkVfTE9XPjsKLQkJcnRzLWdwaW9zID0gPCZncGlvMyA2IEdQSU9fQUNUSVZFX0xPVz47Ci0JCWR0ci1ncGlvcyA9IDwmZ3BpbzEgMTIgR1BJT19BQ1RJVkVfTE9XPjsKLQkJZHNyLWdwaW9zID0gPCZncGlvMSAxMyBHUElPX0FDVElWRV9MT1c+OwotCQlkY2QtZ3Bpb3MgPSA8JmdwaW8xIDE0IEdQSU9fQUNUSVZFX0xPVz47Ci0JCXJuZy1ncGlvcyA9IDwmZ3BpbzEgMTUgR1BJT19BQ1RJVkVfTE9XPjsKLQl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9zdCxzdG0zMi11c2FydC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL3N0LHN0bTMyLXVzYXJ0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWVjNWYyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9zdCxzdG0zMi11c2FydC50eHQKQEAgLTAsMCArMSw0NiBAQAorKiBTVE1pY3JvZWxlY3Ryb25pY3MgU1RNMzIgVVNBUlQKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogQ2FuIGJlIGVpdGhlciAic3Qsc3RtMzItdXNhcnQiLCAic3Qsc3RtMzItdWFydCIsCisic3Qsc3RtMzJmNy11c2FydCIgb3IgInN0LHN0bTMyZjctdWFydCIgZGVwZW5kaW5nIG9uIHdoZXRoZXIKK3RoZSBkZXZpY2Ugc3VwcG9ydHMgc3luY2hyb25vdXMgbW9kZSBhbmQgaXMgY29tcGF0aWJsZSB3aXRoCitzdG0zMihmNCkgb3Igc3RtMzJmNy4KKy0gcmVnOiBUaGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVycyBzcGFjZQorLSBpbnRlcnJ1cHRzOiBUaGUgaW50ZXJydXB0IGxpbmUgb2YgdGhlIFVTQVJUIGluc3RhbmNlCistIGNsb2NrczogVGhlIGlucHV0IGNsb2NrIG9mIHRoZSBVU0FSVCBpbnN0YW5jZQorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBwaW5jdHJsOiBUaGUgcmVmZXJlbmNlIG9uIHRoZSBwaW5zIGNvbmZpZ3VyYXRpb24KKy0gc3QsaHctZmxvdy1jdHJsOiBib29sIGZsYWcgdG8gZW5hYmxlIGhhcmR3YXJlIGZsb3cgY29udHJvbC4KKy0gZG1hczogcGhhbmRsZShzKSB0byBETUEgY29udHJvbGxlciBub2RlKHMpLiBSZWZlciB0byBzdG0zMi1kbWEudHh0CistIGRtYS1uYW1lczogInJ4IiBhbmQvb3IgInR4IgorCitFeGFtcGxlczoKK3VzYXJ0NDogc2VyaWFsQDQwMDA0YzAwIHsKKwljb21wYXRpYmxlID0gInN0LHN0bTMyLXVhcnQiOworCXJlZyA9IDwweDQwMDA0YzAwIDB4NDAwPjsKKwlpbnRlcnJ1cHRzID0gPDUyPjsKKwljbG9ja3MgPSA8JmNsa19wY2xrMT47CisJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKKwlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfdXNhcnQ0PjsKK307CisKK3VzYXJ0Mjogc2VyaWFsQDQwMDA0NDAwIHsKKwljb21wYXRpYmxlID0gInN0LHN0bTMyLXVzYXJ0IiwgInN0LHN0bTMyLXVhcnQiOworCXJlZyA9IDwweDQwMDA0NDAwIDB4NDAwPjsKKwlpbnRlcnJ1cHRzID0gPDM4PjsKKwljbG9ja3MgPSA8JmNsa19wY2xrMT47CisJc3QsaHctZmxvdy1jdHJsOworCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJcGluY3RybC0wID0gPCZwaW5jdHJsX3VzYXJ0MiAmcGluY3RybF91c2FydDJfcnRzY3RzPjsKK307CisKK3VzYXJ0MTogc2VyaWFsQDQwMDExMDAwIHsKKwljb21wYXRpYmxlID0gInN0LHN0bTMyLXVzYXJ0IiwgInN0LHN0bTMyLXVhcnQiOworCXJlZyA9IDwweDQwMDExMDAwIDB4NDAwPjsKKwlpbnRlcnJ1cHRzID0gPDM3PjsKKwljbG9ja3MgPSA8JnJjYyAwIDE2ND47CisJZG1hcyA9IDwmZG1hMiAyIDQgMHg0MTQgMHgwPiwKKwkgICAgICAgPCZkbWEyIDcgNCAweDQxNCAweDA+OworCWRtYS1uYW1lcyA9ICJyeCIsICJ0eCI7Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvYy9tZWRpYXRlay9hdXhhZGMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvYy9tZWRpYXRlay9hdXhhZGMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGI3ODI5Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb2MvbWVkaWF0ZWsvYXV4YWRjLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1lZGlhVGVrIEFVWEFEQwotPT09PT09PT09PT09PT09Ci0KLVRoZSBBdXhpbGlhcnkgQW5hbG9nL0RpZ2l0YWwgQ29udmVydGVyIChBVVhBREMpIGlzIGFuIEFEQyBmb3VuZAotaW4gc29tZSBNZWRpYXRlayBTb0NzIHdoaWNoIGFtb25nIG90aGVyIHRoaW5ncyBtZWFzdXJlcyB0aGUgdGVtcGVyYXR1cmVzCi1pbiB0aGUgU29DLiBJdCBjYW4gYmUgdXNlZCBkaXJlY3RseSB3aXRoIHJlZ2lzdGVyIGFjY2Vzc2VzLCBidXQgaXQgaXMgYWxzbwotdXNlZCBieSB0aGVybWFsIGNvbnRyb2xsZXIgd2hpY2ggcmVhZHMgdGhlIHRlbXBlcmF0dXJlcyBmcm9tIHRoZSBBVVhBREMKLWRpcmVjdGx5IHZpYSBpdHMgb3duIGJ1cyBpbnRlcmZhY2UuIFNlZQotRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RoZXJtYWwvbWVkaWF0ZWstdGhlcm1hbC50eHQKLWZvciB0aGUgVGhlcm1hbCBDb250cm9sbGVyIHdoaWNoIGhvbGRzIGEgcGhhbmRsZSB0byB0aGUgQVVYQURDLgotCi1SZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlOiBNdXN0IGJlICJtZWRpYXRlayxtdDgxNzMtYXV4YWRjIgotLSByZWc6IEFkZHJlc3MgcmFuZ2Ugb2YgdGhlIEFVWEFEQyB1bml0Ci0KLUV4YW1wbGU6Ci0KLWF1eGFkYzogYXV4YWRjQDExMDAxMDAwIHsKLQljb21wYXRpYmxlID0gIm1lZGlhdGVrLG10ODE3My1hdXhhZGMiOwotCXJlZyA9IDwwIDB4MTEwMDEwMDAgMCAweDEwMDA+OwotfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9uYXU4ODEwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9uYXU4ODEwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTgzMGU0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL25hdTg4MTAudHh0CkBAIC0wLDAgKzEsMTYgQEAKK05BVTg4MTAgYXVkaW8gQ09ERUMKKworVGhpcyBkZXZpY2Ugc3VwcG9ydHMgSTJDIG9ubHkuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAgLSBjb21wYXRpYmxlIDogIm51dm90b24sbmF1ODgxMCIKKworICAtIHJlZyA6IHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgZGV2aWNlLgorCitFeGFtcGxlOgorCitjb2RlYzogbmF1ODgxMEAxYSB7CisJY29tcGF0aWJsZSA9ICJudXZvdG9uLG5hdTg4MTAiOworCXJlZyA9IDwweDFhPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvbnZpZGlhLHRlZ3JhLWF1ZGlvLXNndGw1MDAwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9udmlkaWEsdGVncmEtYXVkaW8tc2d0bDUwMDAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYTdkYTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvbnZpZGlhLHRlZ3JhLWF1ZGlvLXNndGw1MDAwLnR4dApAQCAtMCwwICsxLDQyIEBACitOVklESUEgVGVncmEgYXVkaW8gY29tcGxleCwgd2l0aCBTR1RMNTAwMCBDT0RFQworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogIm52aWRpYSx0ZWdyYS1hdWRpby1zZ3RsNTAwMCIKKy0gY2xvY2tzIDogTXVzdCBjb250YWluIGFuIGVudHJ5IGZvciBlYWNoIGVudHJ5IGluIGNsb2NrLW5hbWVzLgorICBTZWUgLi4vY2xvY2tzL2Nsb2NrLWJpbmRpbmdzLnR4dCBmb3IgZGV0YWlscy4KKy0gY2xvY2stbmFtZXMgOiBNdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBlbnRyaWVzOgorICAtIHBsbF9hCisgIC0gcGxsX2Ffb3V0MAorICAtIG1jbGsgKFRoZSBUZWdyYSBjZGV2MS9leHRlcm4xIGNsb2NrLCB3aGljaCBmZWVkcyB0aGUgQ09ERUMncyBtY2xrKQorLSBudmlkaWEsbW9kZWwgOiBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhpcyBzb3VuZCBjb21wbGV4LgorLSBudmlkaWEsYXVkaW8tcm91dGluZyA6IEEgbGlzdCBvZiB0aGUgY29ubmVjdGlvbnMgYmV0d2VlbiBhdWRpbyBjb21wb25lbnRzLgorICBFYWNoIGVudHJ5IGlzIGEgcGFpciBvZiBzdHJpbmdzLCB0aGUgZmlyc3QgYmVpbmcgdGhlIGNvbm5lY3Rpb24ncyBzaW5rLAorICB0aGUgc2Vjb25kIGJlaW5nIHRoZSBjb25uZWN0aW9uJ3Mgc291cmNlLiBWYWxpZCBuYW1lcyBmb3Igc291cmNlcyBhbmQKKyAgc2lua3MgYXJlIHRoZSBTR1RMNTAwMCdzIHBpbnMgKGFzIGRvY3VtZW50ZWQgaW4gaXRzIGJpbmRpbmcpLCBhbmQgdGhlIGphY2tzCisgIG9uIHRoZSBib2FyZDoKKworICAqIEhlYWRwaG9uZSBKYWNrCisgICogTGluZSBJbiBKYWNrCisgICogTWljIEphY2sKKworLSBudmlkaWEsaTJzLWNvbnRyb2xsZXIgOiBUaGUgcGhhbmRsZSBvZiB0aGUgVGVncmEgSTJTIGNvbnRyb2xsZXIgdGhhdCdzCisgIGNvbm5lY3RlZCB0byB0aGUgQ09ERUMuCistIG52aWRpYSxhdWRpby1jb2RlYyA6IFRoZSBwaGFuZGxlIG9mIHRoZSBTR1RMNTAwMCBhdWRpbyBjb2RlYy4KKworRXhhbXBsZToKKworc291bmQgeworCWNvbXBhdGlibGUgPSAidG9yYWRleCx0ZWdyYS1hdWRpby1zZ3RsNTAwMC1hcGFsaXNfdDMwIiwKKwkJICAgICAibnZpZGlhLHRlZ3JhLWF1ZGlvLXNndGw1MDAwIjsKKwludmlkaWEsbW9kZWwgPSAiVG9yYWRleCBBcGFsaXMgVDMwIjsKKwludmlkaWEsYXVkaW8tcm91dGluZyA9CisJCSJIZWFkcGhvbmUgSmFjayIsICJIUF9PVVQiLAorCQkiTElORV9JTiIsICJMaW5lIEluIEphY2siLAorCQkiTUlDX0lOIiwgIk1pYyBKYWNrIjsKKwludmlkaWEsaTJzLWNvbnRyb2xsZXIgPSA8JnRlZ3JhX2kyczI+OworCW52aWRpYSxhdWRpby1jb2RlYyA9IDwmc2d0bDUwMDA+OworCWNsb2NrcyA9IDwmdGVncmFfY2FyIFRFR1JBMzBfQ0xLX1BMTF9BPiwKKwkJIDwmdGVncmFfY2FyIFRFR1JBMzBfQ0xLX1BMTF9BX09VVDA+LAorCQkgPCZ0ZWdyYV9jYXIgVEVHUkEzMF9DTEtfRVhURVJOMT47CisJY2xvY2stbmFtZXMgPSAicGxsX2EiLCAicGxsX2Ffb3V0MCIsICJtY2xrIjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvb21hcC1tY3BkbS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvb21hcC1tY3BkbS50eHQKaW5kZXggNmY2YzJmOC4uMDc0MWRmZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL29tYXAtbWNwZG0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9vbWFwLW1jcGRtLnR4dApAQCAtOCw4ICs4LDYgQEAKIC0gaW50ZXJydXB0czogSW50ZXJydXB0IG51bWJlciBmb3IgTWNQRE0KIC0gaW50ZXJydXB0LXBhcmVudDogVGhlIHBhcmVudCBpbnRlcnJ1cHQgY29udHJvbGxlcgogLSB0aSxod21vZHM6IE5hbWUgb2YgdGhlIGh3bW9kIGFzc29jaWF0ZWQgdG8gdGhlIE1jUERNCi0tIGNsb2NrczogIHBoYW5kbGUgZm9yIHRoZSBwZG1jbGsgcHJvdmlkZXIsIGxpa2VseSA8JnR3bDYwNDA+Ci0tIGNsb2NrLW5hbWVzOiBNdXN0IGJlICJwZG1jbGsiCiAKIEV4YW1wbGU6CiAKQEAgLTIxLDExICsxOSwzIEBACiAJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAl0aSxod21vZHMgPSAibWNwZG0iOwogfTsKLQotSW4gYm9hcmQgRFRTIGZpbGUgdGhlIHBkbWNsayBuZWVkcyB0byBiZSBhZGRlZDoKLQotJm1jcGRtIHsKLQljbG9ja3MgPSA8JnR3bDYwNDA+OwotCWNsb2NrLW5hbWVzID0gInBkbWNsayI7Ci0Jc3RhdHVzID0gIm9rYXkiOwotfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9xY29tLGFwcTgwMTYtc2JjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9xY29tLGFwcTgwMTYtc2JjLnR4dAppbmRleCA0ODEyOTM2Li5kOWQ4NjM1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcWNvbSxhcHE4MDE2LXNiYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3Fjb20sYXBxODAxNi1zYmMudHh0CkBAIC0xNiw2ICsxNiwyNCBAQAogCQkJCSogInNwa3ItaW9tdXgiCiAtIHFjb20sbW9kZWwJCTogTmFtZSBvZiB0aGUgc291bmQgY2FyZC4KIAorLSBxY29tLGF1ZGlvLXJvdXRpbmcJOiBBIGxpc3Qgb2YgdGhlIGNvbm5lY3Rpb25zIGJldHdlZW4gYXVkaW8gY29tcG9uZW50cy4KKwkJCSAgRWFjaCBlbnRyeSBpcyBhIHBhaXIgb2Ygc3RyaW5ncywgdGhlIGZpcnN0IGJlaW5nIHRoZQorCQkJICBjb25uZWN0aW9uJ3Mgc2luaywgdGhlIHNlY29uZCBiZWluZyB0aGUgY29ubmVjdGlvbidzCisJCQkgIHNvdXJjZS4gVmFsaWQgbmFtZXMgY291bGQgYmUgcG93ZXIgc3VwcGxpZXMsIE1pY0JpYXMKKwkJCSAgb2YgbXNtOHgxNl93Y2QgY29kZWMgYW5kIHRoZSBqYWNrcyBvbiB0aGUgYm9hcmQ6CisKKwkJCSAgUG93ZXIgc3VwcGxpZXM6CisJCQkgICogTUlDIEJJQVMgRXh0ZXJuYWwxCisJCQkgICogTUlDIEJJQVMgRXh0ZXJuYWwyCisJCQkgICogTUlDIEJJQVMgSW50ZXJuYWwxCisJCQkgICogTUlDIEJJQVMgSW50ZXJuYWwyCisKKwkJCSAgQm9hcmQgY29ubmVjdG9yczoKKwkJCSAgKiBIZWFkc2V0IE1pYworCQkJICAqIFNlY29uZGFyeSBNaWMiLAorCQkJICAqIERNSUMKKwkJCSAgKiBFeHQgU3BrCisKIERhaS1saW5rIHN1Ym5vZGUgcHJvcGVydGllcyBhbmQgc3Vibm9kZXM6CiAKIFJlcXVpcmVkIGRhaS1saW5rIHN1Ym5vZGVzOgpAQCAtMzcsNiArNTUsMTggQEAKIAlyZWctbmFtZXMgPSAibWljLWlvbXV4IiwgInNwa3ItaW9tdXgiOwogCXFjb20sbW9kZWwgPSAiREI0MTBjIjsKIAorCXFjb20sYXVkaW8tcm91dGluZyA9CisJCSJNSUMgQklBUyBFeHRlcm5hbDEiLCAiSGFuZHNldCBNaWMiLAorCQkiTUlDIEJJQVMgSW50ZXJuYWwyIiwgIkhlYWRzZXQgTWljIiwKKwkJIk1JQyBCSUFTIEV4dGVybmFsMSIsICJTZWNvbmRhcnkgTWljIiwKKwkJIkFNSUMxIiwgIk1JQyBCSUFTIEV4dGVybmFsMSIsCisJCSJBTUlDMiIsICJNSUMgQklBUyBJbnRlcm5hbDIiLAorCQkiQU1JQzMiLCAiTUlDIEJJQVMgRXh0ZXJuYWwxIiwKKwkJIkRNSUMxIiwgIk1JQyBCSUFTIEludGVybmFsMSIsCisJCSJNSUMgQklBUyBJbnRlcm5hbDEiLCAiRGlnaXRhbCBNaWMxIiwKKwkJIkRNSUMyIiwgIk1JQyBCSUFTIEludGVybmFsMSIsCisJCSJNSUMgQklBUyBJbnRlcm5hbDEiLCAiRGlnaXRhbCBNaWMyIjsKKwogCS8qIEkyUyAtIEludGVybmFsIGNvZGVjICovCiAJaW50ZXJuYWwtZGFpLWxpbmtAMCB7CiAJCWNwdSB7IC8qIFBSSU1BUlkgKi8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9yZW5lc2FzLHJzcmMtY2FyZC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcmVuZXNhcyxyc3JjLWNhcmQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTVlY2UzLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9yZW5lc2FzLHJzcmMtY2FyZC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi1SZW5lc2FzIFNhbXBsaW5nIFJhdGUgQ29udmVydCBTb3VuZCBDYXJkOgotCi1SZW5lc2FzIFNhbXBsaW5nIFJhdGUgQ29udmVydCBTb3VuZCBDYXJkIHNwZWNpZmllcyBhdWRpbyBEQUkgY29ubmVjdGlvbnMgb2YgU29DIDwtPiBjb2RlYy4KLQotUmVxdWlyZWQgcHJvcGVydGllczoKLQotLSBjb21wYXRpYmxlCQkJCTogInJlbmVzYXMscnNyYy1jYXJkeyw8Ym9hcmQ+fSIKLQkJCQkJICBFeGFtcGxlcyB3aXRoIGJvYXJkcyBhcmU6Ci0JCQkJCSAgICAtICJyZW5lc2FzLHJzcmMtY2FyZCIKLQkJCQkJICAgIC0gInJlbmVzYXMscnNyYy1jYXJkLGxhZ2VyIgotCQkJCQkgICAgLSAicmVuZXNhcyxyc3JjLWNhcmQsa29lbHNjaCIKLU9wdGlvbmFsIHByb3BlcnRpZXM6Ci0KLS0gY2FyZF9uYW1lCQkJCTogVXNlciBzcGVjaWZpZWQgYXVkaW8gc291bmQgY2FyZCBuYW1lLCBvbmUgc3RyaW5nCi0JCQkJCSAgcHJvcGVydHkuCi0tIGNwdQkJCQkJOiBDUFUgICBzdWItbm9kZQotLSBjb2RlYwkJCQkJOiBDT0RFQyBzdWItbm9kZQotCi1PcHRpb25hbCBzdWJub2RlIHByb3BlcnRpZXM6Ci0KLS0gZm9ybWF0CQkJCTogQ1BVL0NPREVDIGNvbW1vbiBhdWRpbyBmb3JtYXQuCi0JCQkJCSAgImkycyIsICJyaWdodF9qIiwgImxlZnRfaiIgLCAiZHNwX2EiCi0JCQkJCSAgImRzcF9iIiwgImFjOTciLCAicGRtIiwgIm1zYiIsICJsc2IiCi0tIGZyYW1lLW1hc3RlcgkJCQk6IEluZGljYXRlcyBkYWktbGluayBmcmFtZSBtYXN0ZXIuCi0JCQkJCSAgcGhhbmRsZSB0byBhIGNwdSBvciBjb2RlYyBzdWJub2RlLgotLSBiaXRjbG9jay1tYXN0ZXIJCQk6IEluZGljYXRlcyBkYWktbGluayBiaXQgY2xvY2sgbWFzdGVyLgotCQkJCQkgIHBoYW5kbGUgdG8gYSBjcHUgb3IgY29kZWMgc3Vibm9kZS4KLS0gYml0Y2xvY2staW52ZXJzaW9uCQkJOiBib29sIHByb3BlcnR5LiBBZGQgdGhpcyBpZiB0aGUKLQkJCQkJICBkYWktbGluayB1c2VzIGJpdCBjbG9jayBpbnZlcnNpb24uCi0tIGZyYW1lLWludmVyc2lvbgkJCTogYm9vbCBwcm9wZXJ0eS4gQWRkIHRoaXMgaWYgdGhlCi0JCQkJCSAgZGFpLWxpbmsgdXNlcyBmcmFtZSBjbG9jayBpbnZlcnNpb24uCi0tIGNvbnZlcnQtcmF0ZQkJCQk6IHBsYXRmb3JtIHNwZWNpZmllZCBzYW1wbGluZyByYXRlIGNvbnZlcnQKLS0gY29udmVydC1jaGFubmVscwkJCTogcGxhdGZvcm0gc3BlY2lmaWVkIGNvbnZlcnRlZCBjaGFubmVsIHNpemUgKDIgLSA4IGNoKQotLSBhdWRpby1wcmVmaXgJCQkJOiBzZWUgYXVkaW8tcm91dGluZwotLSBhdWRpby1yb3V0aW5nCQkJCTogQSBsaXN0IG9mIHRoZSBjb25uZWN0aW9ucyBiZXR3ZWVuIGF1ZGlvIGNvbXBvbmVudHMuCi0JCQkJCSAgRWFjaCBlbnRyeSBpcyBhIHBhaXIgb2Ygc3RyaW5ncywgdGhlIGZpcnN0IGJlaW5nIHRoZSBjb25uZWN0aW9uJ3Mgc2luaywKLQkJCQkJICB0aGUgc2Vjb25kIGJlaW5nIHRoZSBjb25uZWN0aW9uJ3Mgc291cmNlLiBWYWxpZCBuYW1lcyBmb3Igc291cmNlcy4KLQkJCQkJICB1c2UgYXVkaW8tcHJlZml4IGlmIHNvbWUgY29tcG9uZW50cyBpcyB1c2luZyBzYW1lIHNpbmsvc291cmNlcyBuYW1pbmcuCi0JCQkJCSAgaXQgY2FuIGJlIHVzZWQgaWYgY29tcGF0aWJsZSB3YXMgInJlbmVzYXMscnNyYy1jYXJkIjsKLQotUmVxdWlyZWQgQ1BVL0NPREVDIHN1Ym5vZGVzIHByb3BlcnRpZXM6Ci0KLS0gc291bmQtZGFpCQkJCTogcGhhbmRsZSBhbmQgcG9ydCBvZiBDUFUvQ09ERUMKLQotT3B0aW9uYWwgQ1BVL0NPREVDIHN1Ym5vZGVzIHByb3BlcnRpZXM6Ci0KLS0gY2xvY2tzIC8gc3lzdGVtLWNsb2NrLWZyZXF1ZW5jeQk6IHNwZWNpZnkgc3Vibm9kZSdzIGNsb2NrIGlmIG5lZWRlZC4KLQkJCQkJICBpdCBjYW4gYmUgc3BlY2lmaWVkIHZpYSAiY2xvY2tzIiBpZiBzeXN0ZW0gaGFzCi0JCQkJCSAgY2xvY2sgbm9kZSAoPSBjb21tb24gY2xvY2spLCBvciAic3lzdGVtLWNsb2NrLWZyZXF1ZW5jeSIKLQkJCQkJICAoaWYgc3lzdGVtIGRvZW5zJ3Qgc3VwcG9ydCBjb21tb24gY2xvY2spCi0JCQkJCSAgSWYgYSBjbG9jayBpcyBzcGVjaWZpZWQsIGl0IGlzCi0JCQkJCSAgZW5hYmxlZCB3aXRoIGNsa19wcmVwYXJlX2VuYWJsZSgpCi0JCQkJCSAgaW4gZGFpIHN0YXJ0dXAoKSBhbmQgZGlzYWJsZWQgd2l0aAotCQkJCQkgIGNsa19kaXNhYmxlX3VucHJlcGFyZSgpIGluIGRhaQotCQkJCQkgIHNodXRkb3duKCkuCi0KLUV4YW1wbGUKLQotc291bmQgewotCWNvbXBhdGlibGUgPSAicmVuZXNhcyxyc3JjLWNhcmQsbGFnZXIiOwotCi0JY2FyZC1uYW1lID0gInJzbmQtYWs0NjQzIjsKLQlmb3JtYXQgPSAibGVmdF9qIjsKLQliaXRjbG9jay1tYXN0ZXIgPSA8JnNuZGNvZGVjPjsKLQlmcmFtZS1tYXN0ZXIgPSA8JnNuZGNvZGVjPjsKLQotCXNuZGNwdTogY3B1IHsKLQkJc291bmQtZGFpID0gPCZyY2FyX3NvdW5kPjsKLQl9OwotCi0Jc25kY29kZWM6IGNvZGVjIHsKLQkJc291bmQtZGFpID0gPCZhazQ2NDM+OwotCQlzeXN0ZW0tY2xvY2stZnJlcXVlbmN5ID0gPDExMjg5NjAwPjsKLQl9OwotfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9yb2NrY2hpcCxyazMzOTktZ3J1LXNvdW5kLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9yb2NrY2hpcCxyazMzOTktZ3J1LXNvdW5kLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWM5MWRiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3JvY2tjaGlwLHJrMzM5OS1ncnUtc291bmQudHh0CkBAIC0wLDAgKzEsMjIgQEAKK1JPQ0tDSElQIHdpdGggTUFYOTgzNTdBL1JUNTUxNC9EQTcyMTkgY29kZWNzIG9uIEdSVSBib2FyZHMKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogInJvY2tjaGlwLHJrMzM5OS1ncnUtc291bmQiCistIHJvY2tjaGlwLGNwdTogVGhlIHBoYW5kbGUgb2YgdGhlIFJvY2tjaGlwIEkyUyBjb250cm9sbGVyIHRoYXQncworICBjb25uZWN0ZWQgdG8gdGhlIGNvZGVjcworLSByb2NrY2hpcCxjb2RlYzogVGhlIHBoYW5kbGUgb2YgdGhlIE1BWDk4MzU3QS9SVDU1MTQvREE3MjE5IGNvZGVjcworCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBkbWljLXdha2V1cC1kZWxheS1tcyA6IHNwZWNpZnkgZGVsYXkgdGltZSAobXMpIGZvciBETUlDIHJlYWR5LgorICBJZiB0aGlzIG9wdGlvbiBpcyBzcGVjaWZpZWQsIHdoaWNoIG1lYW5zIGl0J3MgcmVxdWlyZWQgZG1pYyBuZWVkCisgIGRlbGF5IGZvciBETUlDIHRvIHJlYWR5IHNvIHRoYXQgcnQ1NTE0IGNhbiBhdm9pZCByZWNvcmRpbmcgYmVmb3JlCisgIERNSUMgc2VuZCB2YWxpZCBkYXRhCisKK0V4YW1wbGU6CisKK3NvdW5kIHsKKwljb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzM5OS1ncnUtc291bmQiOworCXJvY2tjaGlwLGNwdSA9IDwmaTJzMD47CisJcm9ja2NoaXAsY29kZWMgPSA8Jm1heDk4MzU3YSAmcnQ1NTE0ICZkYTcyMTk+OworCWRtaWMtd2FrZXVwLWRlbGF5LW1zID0gPDIwPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcnQ1NjU5LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9ydDU2NTkudHh0CmluZGV4IDVmNzllN2YuLjE3NjZlMDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9ydDU2NTkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9ydDU2NTkudHh0CkBAIC0xMiw2ICsxMiw5IEBACiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAKKy0gY2xvY2tzOiBUaGUgcGhhbmRsZSBvZiB0aGUgbWFzdGVyIGNsb2NrIHRvIHRoZSBDT0RFQworLSBjbG9jay1uYW1lczogU2hvdWxkIGJlICJtY2xrIgorCiAtIHJlYWx0ZWssaW4xLWRpZmZlcmVudGlhbAogLSByZWFsdGVrLGluMy1kaWZmZXJlbnRpYWwKIC0gcmVhbHRlayxpbjQtZGlmZmVyZW50aWFsCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcnQ1NjYwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9ydDU2NjAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYmU1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcnQ1NjYwLnR4dApAQCAtMCwwICsxLDQ3IEBACitSVDU2NjAgYXVkaW8gQ09ERUMKKworVGhpcyBkZXZpY2Ugc3VwcG9ydHMgSTJDIG9ubHkuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZSA6ICJyZWFsdGVrLHJ0NTY2MCIuCisKKy0gcmVnIDogVGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisKKy0gY2xvY2tzOiBUaGUgcGhhbmRsZSBvZiB0aGUgbWFzdGVyIGNsb2NrIHRvIHRoZSBDT0RFQworLSBjbG9jay1uYW1lczogU2hvdWxkIGJlICJtY2xrIgorCistIHJlYWx0ZWssaW4xLWRpZmZlcmVudGlhbAorLSByZWFsdGVrLGluMy1kaWZmZXJlbnRpYWwKKyAgQm9vbGVhbi4gSW5kaWNhdGUgTUlDMS8zIGlucHV0IGFyZSBkaWZmZXJlbnRpYWwsIHJhdGhlciB0aGFuIHNpbmdsZS1lbmRlZC4KKworLSByZWFsdGVrLHBvd2Vyb2ZmLWluLXN1c3BlbmQKKyAgQm9vbGVhbi4gSWYgdGhlIGNvZGVjIHdpbGwgYmUgcG93ZXJlZCBvZmYgaW4gc3VzcGVuZCwgdGhlIHJlc3VtZSBzaG91bGQgYmUKKyAgYWRkZWQgZGVsYXkgdGltZSBmb3Igd2FpdGluZyBjb2RlYyBwb3dlciByZWFkeS4KKworLSByZWFsdGVrLGRtaWMxLWRhdGEtcGluCisgIDA6IGRtaWMxIGlzIG5vdCB1c2VkCisgIDE6IHVzaW5nIEdQSU8yIHBpbiBhcyBkbWljMSBkYXRhIHBpbgorICAyOiB1c2luZyBJTjFQIHBpbiBhcyBkbWljMSBkYXRhIHBpbgorCitQaW5zIG9uIHRoZSBkZXZpY2UgKGZvciBsaW5raW5nIGludG8gYXVkaW8gcm91dGVzKSBmb3IgUlQ1NjYwOgorCisgICogRE1JQyBMMQorICAqIERNSUMgUjEKKyAgKiBJTjFQCisgICogSU4xTgorICAqIElOMlAKKyAgKiBJTjNQCisgICogSU4zTgorICAqIFNQTworICAqIExPVVRMCisgICogTE9VVFIKKworRXhhbXBsZToKKworcnQ1NjYwIHsKKwljb21wYXRpYmxlID0gInJlYWx0ZWsscnQ1NjYwIjsKKwlyZWcgPSA8MHgxYz47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3J0NTY2My50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcnQ1NjYzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDNjOTc0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3J0NTY2My50eHQKQEAgLTAsMCArMSwzMCBAQAorUlQ1NjYzL1JUNTY2OCBhdWRpbyBDT0RFQworCitUaGlzIGRldmljZSBzdXBwb3J0cyBJMkMgb25seS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworLSBjb21wYXRpYmxlIDogT25lIG9mICJyZWFsdGVrLHJ0NTY2MyIgb3IgInJlYWx0ZWsscnQ1NjY4Ii4KKworLSByZWcgOiBUaGUgSTJDIGFkZHJlc3Mgb2YgdGhlIGRldmljZS4KKworLSBpbnRlcnJ1cHRzIDogVGhlIENPREVDJ3MgaW50ZXJydXB0IG91dHB1dC4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKworUGlucyBvbiB0aGUgZGV2aWNlIChmb3IgbGlua2luZyBpbnRvIGF1ZGlvIHJvdXRlcykgZm9yIFJUNTY2My9SVDU2Njg6CisKKyAgKiBJTjFQCisgICogSU4xTgorICAqIElOMlAKKyAgKiBJTjJOCisgICogSFBPTAorICAqIEhQT1IKKworRXhhbXBsZToKKworY29kZWM6IHJ0NTY2M0AxMiB7CisJY29tcGF0aWJsZSA9ICJyZWFsdGVrLHJ0NTY2MyI7CisJcmVnID0gPDB4MTI+OworCWludGVycnVwdHMgPSA8NyBJUlFfVFlQRV9FREdFX0ZBTExJTkc+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaW1wbGUtY2FyZC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2ltcGxlLWNhcmQudHh0CmluZGV4IDU5ZDg2MjguLmM3YTkzOTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaW1wbGUtY2FyZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpbXBsZS1jYXJkLnR4dApAQCAtMjIsNiArMjIsOCBAQAogCQkJCQkgIGhlYWRwaG9uZXMgYXJlIGF0dGFjaGVkLgogLSBzaW1wbGUtYXVkaW8tY2FyZCxtaWMtZGV0LWdwaW8JOiBSZWZlcmVuY2UgdG8gR1BJTyB0aGF0IHNpZ25hbHMgd2hlbgogCQkJCQkgIGEgbWljcm9waG9uZSBpcyBhdHRhY2hlZC4KKy0gc2ltcGxlLWF1ZGlvLWNhcmQsYXV4LWRldnMJCTogTGlzdCBvZiBwaGFuZGxlcyBwb2ludGluZyB0byBhdXhpbGlhcnkgZGV2aWNlcywgc3VjaAorCQkJCQkgIGFzIGFtcGxpZmllcnMsIHRvIGJlIGFkZGVkIHRvIHRoZSBzb3VuZCBjYXJkLgogCiBPcHRpb25hbCBzdWJub2RlczoKIApAQCAtMTYyLDMgKzE2NCwzOCBAQAogCQl9OwogCX07CiB9OworCitFeGFtcGxlIDMgLSByb3V0ZSBhdWRpbyBmcm9tIElNWDYgU1NJMiB0aHJvdWdoIFRMVjMyMERBQzMxMDAgY29kZWMKK3Rocm91Z2ggVFBBNjEzMEEyIGFtcGxpZmllciB0byBoZWFkcGhvbmVzOgorCismaTJjMCB7CisJY29kZWM6IHRsdjMyMGRhYzMxMDBAMTggeworCQljb21wYXRpYmxlID0gInRpLHRsdjMyMGRhYzMxMDAiOworCQkuLi4KKwl9CisKKwlhbXA6IHRwYTYxMzBhMkA2MCB7CisJCWNvbXBhdGlibGUgPSAidGksdHBhNjEzMGEyIjsKKwkJLi4uCisJfQorfQorCitzb3VuZCB7CisJY29tcGF0aWJsZSA9ICJzaW1wbGUtYXVkaW8tY2FyZCI7CisJLi4uCisJc2ltcGxlLWF1ZGlvLWNhcmQsd2lkZ2V0cyA9CisJCSJIZWFkcGhvbmUiLCAiSGVhZHBob25lIEphY2siOworCXNpbXBsZS1hdWRpby1jYXJkLHJvdXRpbmcgPQorCQkiSGVhZHBob25lIEphY2siLCAiSFBMRUZUIiwKKwkJIkhlYWRwaG9uZSBKYWNrIiwgIkhQUklHSFQiLAorCQkiTEVGVElOIiwgIkhQTCIsCisJCSJSSUdIVElOIiwgIkhQUiI7CisJc2ltcGxlLWF1ZGlvLWNhcmQsYXV4LWRldnMgPSA8JmFtcD47CisJc2ltcGxlLWF1ZGlvLWNhcmQsY3B1IHsKKwkJc291bmQtZGFpID0gPCZzc2kyPjsKKwl9OworCXNpbXBsZS1hdWRpby1jYXJkLGNvZGVjIHsKKwkJc291bmQtZGFpID0gPCZjb2RlYz47CisJCWNsb2NrcyA9IC4uLgorCX07Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpbXBsZS1zY3UtY2FyZC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2ltcGxlLXNjdS1jYXJkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmZlNDdlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpbXBsZS1zY3UtY2FyZC50eHQKQEAgLTAsMCArMSwxMTAgQEAKK0FTb0Mgc2ltcGxlIFNDVSBTb3VuZCBDYXJkCisKK1NpbXBsZS1DYXJkIHNwZWNpZmllcyBhdWRpbyBEQUkgY29ubmVjdGlvbnMgb2YgU29DIDwtPiBjb2RlYy4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworLSBjb21wYXRpYmxlCQkJCTogInNpbXBsZS1zY3UtYXVkaW8tY2FyZCIKKwkJCQkJICAicmVuZXNhcyxyc3JjLWNhcmQiCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisKKy0gc2ltcGxlLWF1ZGlvLWNhcmQsbmFtZQkJOiBVc2VyIHNwZWNpZmllZCBhdWRpbyBzb3VuZCBjYXJkIG5hbWUsIG9uZSBzdHJpbmcKKwkJCQkJICBwcm9wZXJ0eS4KKy0gc2ltcGxlLWF1ZGlvLWNhcmQsY3B1CQkJOiBDUFUgICBzdWItbm9kZQorLSBzaW1wbGUtYXVkaW8tY2FyZCxjb2RlYwkJOiBDT0RFQyBzdWItbm9kZQorCitPcHRpb25hbCBzdWJub2RlIHByb3BlcnRpZXM6CisKKy0gc2ltcGxlLWF1ZGlvLWNhcmQsZm9ybWF0CQk6IENQVS9DT0RFQyBjb21tb24gYXVkaW8gZm9ybWF0LgorCQkJCQkgICJpMnMiLCAicmlnaHRfaiIsICJsZWZ0X2oiICwgImRzcF9hIgorCQkJCQkgICJkc3BfYiIsICJhYzk3IiwgInBkbSIsICJtc2IiLCAibHNiIgorLSBzaW1wbGUtYXVkaW8tY2FyZCxmcmFtZS1tYXN0ZXIJOiBJbmRpY2F0ZXMgZGFpLWxpbmsgZnJhbWUgbWFzdGVyLgorCQkJCQkgIHBoYW5kbGUgdG8gYSBjcHUgb3IgY29kZWMgc3Vibm9kZS4KKy0gc2ltcGxlLWF1ZGlvLWNhcmQsYml0Y2xvY2stbWFzdGVyCTogSW5kaWNhdGVzIGRhaS1saW5rIGJpdCBjbG9jayBtYXN0ZXIuCisJCQkJCSAgcGhhbmRsZSB0byBhIGNwdSBvciBjb2RlYyBzdWJub2RlLgorLSBzaW1wbGUtYXVkaW8tY2FyZCxiaXRjbG9jay1pbnZlcnNpb24JOiBib29sIHByb3BlcnR5LiBBZGQgdGhpcyBpZiB0aGUKKwkJCQkJICBkYWktbGluayB1c2VzIGJpdCBjbG9jayBpbnZlcnNpb24uCistIHNpbXBsZS1hdWRpby1jYXJkLGZyYW1lLWludmVyc2lvbgk6IGJvb2wgcHJvcGVydHkuIEFkZCB0aGlzIGlmIHRoZQorCQkJCQkgIGRhaS1saW5rIHVzZXMgZnJhbWUgY2xvY2sgaW52ZXJzaW9uLgorLSBzaW1wbGUtYXVkaW8tY2FyZCxjb252ZXJ0LXJhdGUJOiBwbGF0Zm9ybSBzcGVjaWZpZWQgc2FtcGxpbmcgcmF0ZSBjb252ZXJ0CistIHNpbXBsZS1hdWRpby1jYXJkLGNvbnZlcnQtY2hhbm5lbHMJOiBwbGF0Zm9ybSBzcGVjaWZpZWQgY29udmVydGVkIGNoYW5uZWwgc2l6ZSAoMiAtIDggY2gpCistIHNpbXBsZS1hdWRpby1jYXJkLHByZWZpeAkJOiBzZWUgYXVkaW8tcm91dGluZworLSBzaW1wbGUtYXVkaW8tY2FyZCxyb3V0aW5nCQk6IEEgbGlzdCBvZiB0aGUgY29ubmVjdGlvbnMgYmV0d2VlbiBhdWRpbyBjb21wb25lbnRzLgorCQkJCQkgIEVhY2ggZW50cnkgaXMgYSBwYWlyIG9mIHN0cmluZ3MsIHRoZSBmaXJzdCBiZWluZyB0aGUgY29ubmVjdGlvbidzIHNpbmssCisJCQkJCSAgdGhlIHNlY29uZCBiZWluZyB0aGUgY29ubmVjdGlvbidzIHNvdXJjZS4gVmFsaWQgbmFtZXMgZm9yIHNvdXJjZXMuCisJCQkJCSAgdXNlIGF1ZGlvLXByZWZpeCBpZiBzb21lIGNvbXBvbmVudHMgaXMgdXNpbmcgc2FtZSBzaW5rL3NvdXJjZXMgbmFtaW5nLgorCQkJCQkgIGl0IGNhbiBiZSB1c2VkIGlmIGNvbXBhdGlibGUgd2FzICJyZW5lc2FzLHJzcmMtY2FyZCI7CisKK1JlcXVpcmVkIENQVS9DT0RFQyBzdWJub2RlcyBwcm9wZXJ0aWVzOgorCistIHNvdW5kLWRhaQkJCQk6IHBoYW5kbGUgYW5kIHBvcnQgb2YgQ1BVL0NPREVDCisKK09wdGlvbmFsIENQVS9DT0RFQyBzdWJub2RlcyBwcm9wZXJ0aWVzOgorCistIGNsb2NrcyAvIHN5c3RlbS1jbG9jay1mcmVxdWVuY3kJOiBzcGVjaWZ5IHN1Ym5vZGUncyBjbG9jayBpZiBuZWVkZWQuCisJCQkJCSAgaXQgY2FuIGJlIHNwZWNpZmllZCB2aWEgImNsb2NrcyIgaWYgc3lzdGVtIGhhcworCQkJCQkgIGNsb2NrIG5vZGUgKD0gY29tbW9uIGNsb2NrKSwgb3IgInN5c3RlbS1jbG9jay1mcmVxdWVuY3kiCisJCQkJCSAgKGlmIHN5c3RlbSBkb2Vucyd0IHN1cHBvcnQgY29tbW9uIGNsb2NrKQorCQkJCQkgIElmIGEgY2xvY2sgaXMgc3BlY2lmaWVkLCBpdCBpcworCQkJCQkgIGVuYWJsZWQgd2l0aCBjbGtfcHJlcGFyZV9lbmFibGUoKQorCQkJCQkgIGluIGRhaSBzdGFydHVwKCkgYW5kIGRpc2FibGVkIHdpdGgKKwkJCQkJICBjbGtfZGlzYWJsZV91bnByZXBhcmUoKSBpbiBkYWkKKwkJCQkJICBzaHV0ZG93bigpLgorCitFeGFtcGxlIDEuIFNhbXBsaW5nIFJhdGUgQ292ZXJ0CisKK3NvdW5kIHsKKwljb21wYXRpYmxlID0gInNpbXBsZS1zY3UtYXVkaW8tY2FyZCI7CisKKwlzaW1wbGUtYXVkaW8tY2FyZCxuYW1lID0gInJzbmQtYWs0NjQzIjsKKwlzaW1wbGUtYXVkaW8tY2FyZCxmb3JtYXQgPSAibGVmdF9qIjsKKwlzaW1wbGUtYXVkaW8tY2FyZCxmb3JtYXQgPSAibGVmdF9qIjsKKwlzaW1wbGUtYXVkaW8tY2FyZCxiaXRjbG9jay1tYXN0ZXIgPSA8JnNuZGNvZGVjPjsKKwlzaW1wbGUtYXVkaW8tY2FyZCxmcmFtZS1tYXN0ZXIgPSA8JnNuZGNvZGVjPjsKKworCXNpbXBsZS1hdWRpby1jYXJkLGNvbnZlcnQtcmF0ZSA9IDw0ODAwMD47IC8qIHNlZSBhdWRpb19jbGtfYSAqLworCisJc2ltcGxlLWF1ZGlvLWNhcmQscHJlZml4ID0gImFrNDY0MiI7CisJc2ltcGxlLWF1ZGlvLWNhcmQscm91dGluZyA9ICJhazQ2NDIgUGxheWJhY2siLCAiREFJMCBQbGF5YmFjayIsCisJCQkiREFJMCBDYXB0dXJlIiwgImFrNDY0MiBDYXB0dXJlIjsKKworCXNuZGNwdTogc2ltcGxlLWF1ZGlvLWNhcmQsY3B1IHsKKwkJc291bmQtZGFpID0gPCZyY2FyX3NvdW5kPjsKKwl9OworCisJc25kY29kZWM6IHNpbXBsZS1hdWRpby1jYXJkLGNvZGVjIHsKKwkJc291bmQtZGFpID0gPCZhazQ2NDM+OworCQlzeXN0ZW0tY2xvY2stZnJlcXVlbmN5ID0gPDExMjg5NjAwPjsKKwl9OworfTsKKworRXhhbXBsZSAyLiAyIENQVSAxIENvZGVjCisKK3NvdW5kIHsKKwljb21wYXRpYmxlID0gInJlbmVzYXMscnNyYy1jYXJkIjsKKworCWNhcmQtbmFtZSA9ICJyc25kLWFrNDY0MyI7CisJZm9ybWF0ID0gImxlZnRfaiI7CisJYml0Y2xvY2stbWFzdGVyID0gPCZkcGNtY3B1PjsKKwlmcmFtZS1tYXN0ZXIgPSA8JmRwY21jcHU+OworCisJY29udmVydC1yYXRlID0gPDQ4MDAwPjsgIC8qIHNlZSBhdWRpb19jbGtfYSAqLworCisJYXVkaW8tcHJlZml4ID0gImFrNDY0MiI7CisJYXVkaW8tcm91dGluZyA9ICJhazQ2NDIgUGxheWJhY2siLCAiREFJMCBQbGF5YmFjayIsCisJCQkiYWs0NjQyIFBsYXliYWNrIiwgIkRBSTEgUGxheWJhY2siOworCisJZHBjbWNwdTogY3B1QDAgeworCQlzb3VuZC1kYWkgPSA8JnJjYXJfc291bmQgMD47CisJfTsKKworCWNwdUAxIHsKKwkJc291bmQtZGFpID0gPCZyY2FyX3NvdW5kIDE+OworCX07CisKKwljb2RlYyB7CisJCXNvdW5kLWRhaSA9IDwmYWs0NjQzPjsKKwkJY2xvY2tzID0gPCZhdWRpb19jbG9jaz47CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc3Qsc3RpLWFzb2MtY2FyZC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc3Qsc3RpLWFzb2MtY2FyZC50eHQKaW5kZXggMTZiY2RmYi4uNzQ1ZGM2MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3N0LHN0aS1hc29jLWNhcmQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zdCxzdGktYXNvYy1jYXJkLnR4dApAQCAtMTEsNyArMTEsOSBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0gIC0gY29tcGF0aWJsZTogInN0LHN0aS11bmktcGxheWVyIiBvciAic3Qsc3RpLXVuaS1yZWFkZXIiCisgIC0gY29tcGF0aWJsZTogInN0LHN0aWg0MDctdW5pLXBsYXllci1oZG1pIiwgInN0LHN0aWg0MDctdW5pLXBsYXllci1wY20tb3V0IiwKKwkJInN0LHN0aWg0MDctdW5pLXBsYXllci1kYWMiLCAic3Qsc3RpaDQwNy11bmktcGxheWVyLXNwZGlmIiwKKwkJInN0LHN0aWg0MDctdW5pLXJlYWRlci1wY21faW4iLCAic3Qsc3RpaDQwNy11bmktcmVhZGVyLWhkbWkiLAogCiAgIC0gc3Qsc3lzY2ZnOiBwaGFuZGxlIHRvIGJvb3QtZGV2aWNlIHN5c3RlbSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycwogCkBAIC0zMywzMiArMzUsMjQgQEAKIAkidHgiIGZvciAic3Qsc3RpLXVuaS1wbGF5ZXIiIGNvbXBhdGliaWxpdHkKIAkicngiIGZvciAic3Qsc3RpLXVuaS1yZWFkZXIiIGNvbXBhdGliaWxpdHkKIAotICAtIHN0LHZlcnNpb246IElQIHZlcnNpb24gaW50ZWdyYXRlZCBpbiBTT0MuCi0KLSAgLSBkYWktbmFtZTogREFJIG5hbWUgdGhhdCBkZXNjcmliZXMgdGhlIElQLgotCi0gIC0gc3QsbW9kZTogSVAgd29ya2luZyBtb2RlIGRlcGVuZGluZyBvbiBhc3NvY2lhdGVkIGNvZGVjLgotCSJIRE1JIiBjb25uZWN0ZWQgdG8gSERNSSBjb2RlYyBhbmQgc3VwcG9ydCBJRUMgSERNSSBmb3JtYXRzIChwbGF5ZXIgb25seSkuCi0JIlNQRElGIiBjb25uZWN0ZWQgdG8gU1BESUYgY29kZWMgYW5kIHN1cHBvcnQgU1BESUYgZm9ybWF0cyAocGxheWVyIG9ubHkpLgotCSJQQ00iIFBDTSBzdGFuZGFyZCBtb2RlIGZvciBJMlMgb3IgVERNIGJ1cy4KLQkiVERNIiBURE0gbW9kZSBmb3IgVERNIGJ1cy4KLQogUmVxdWlyZWQgcHJvcGVydGllcyAoInN0LHN0aS11bmktcGxheWVyIiBjb21wYXRpYmlsaXR5IG9ubHkpOgogICAtIGNsb2NrczogQ1BVX0RBSSBJUCBjbG9jayBzb3VyY2UsIGxpc3RlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGFuIHRoZQogCSAgICBDUFVfREFJIHByb3BlcnRpZXMuCiAKLSAgLSBzdCx1bmlwZXJpcGgtaWQ6IGludGVybmFsIFNPQyBJUCBpbnN0YW5jZSBJRC4KLQogT3B0aW9uYWwgcHJvcGVydGllczoKICAgLSBwaW5jdHJsLTA6IGRlZmluZWQgZm9yIENQVV9EQUlAMSBhbmQgQ1BVX0RBSUA0IHRvIGRlc2NyaWJlIEkyUyBQSU9zIGZvcgogCSAgICAgICBleHRlcm5hbCBjb2RlY3MgY29ubmVjdGlvbi4KIAogICAtIHBpbmN0cmwtbmFtZXM6IHNob3VsZCBjb250YWluIG9ubHkgb25lIHZhbHVlIC0gImRlZmF1bHQiLgogCisgIC0gc3QsdGRtLW1vZGU6IHRvIGRlY2xhcmUgdG8gc2V0IFRETSBtb2RlIGZvciB1bmlyZWFkZXIgYW5kIHVuaXBsYXllciBJUHMuCisJT25seSBjb21wYXJ0aWJsZSB3aXRoIElQcyBpbiBjaGFyZ2Ugb2YgdGhlIGV4dGVybmFsIEkyUy9URE0gYnVzLgorCVNob3VsZCBiZSBkZWNsYXJlZCBkZXBlbmRpbmcgb24gYXNzb2NpYXRlZCBjb2RlYy4KKwogRXhhbXBsZToKIAotCXN0aV91bmlfcGxheWVyMTogc3RpLXVuaS1wbGF5ZXJAMSB7Ci0JCWNvbXBhdGlibGUgPSAic3Qsc3RpLXVuaS1wbGF5ZXIiOworCXN0aV91bmlfcGxheWVyMTogc3RpLXVuaS1wbGF5ZXJAMHg4RDgxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LXVuaS1wbGF5ZXItaGRtaSI7CiAJCXN0YXR1cyA9ICJva2F5IjsKIAkJI3NvdW5kLWRhaS1jZWxscyA9IDwwPjsKIAkJc3Qsc3lzY2ZnID0gPCZzeXNjZmdfY29yZT47CkBAIC02NiwxNSArNjAsMTIgQEAKIAkJcmVnID0gPDB4OEQ4MTAwMCAweDE1OD47CiAJCWludGVycnVwdHMgPSA8R0lDX1NQSSA4NSBJUlFfVFlQRV9OT05FPjsKIAkJZG1hcyA9IDwmZmRtYTAgMyAwIDE+OwotCQlzdCxkYWktbmFtZSA9ICJVbmkgUGxheWVyICMxIChJMlMpIjsKIAkJZG1hLW5hbWVzID0gInR4IjsKLQkJc3QsdW5pcGVyaXBoLWlkID0gPDE+OwotCQlzdCx2ZXJzaW9uID0gPDU+OwotCQlzdCxtb2RlID0gIlRETSI7CisJCXN0LHRkbS1tb2RlID0gPDE+OwogCX07CiAKLQlzdGlfdW5pX3BsYXllcjI6IHN0aS11bmktcGxheWVyQDIgewotCQljb21wYXRpYmxlID0gInN0LHN0aS11bmktcGxheWVyIjsKKwlzdGlfdW5pX3BsYXllcjI6IHN0aS11bmktcGxheWVyQDB4OEQ4MjAwMCB7CisJCWNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy11bmktcGxheWVyLXBjbS1vdXQiOwogCQlzdGF0dXMgPSAib2theSI7CiAJCSNzb3VuZC1kYWktY2VsbHMgPSA8MD47CiAJCXN0LHN5c2NmZyA9IDwmc3lzY2ZnX2NvcmU+OwpAQCAtODIsMTUgKzczLDExIEBACiAJCXJlZyA9IDwweDhEODIwMDAgMHgxNTg+OwogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgODYgSVJRX1RZUEVfTk9ORT47CiAJCWRtYXMgPSA8JmZkbWEwIDQgMCAxPjsKLQkJZGFpLW5hbWUgPSAiVW5pIFBsYXllciAjMiAoREFDKSI7CiAJCWRtYS1uYW1lcyA9ICJ0eCI7Ci0JCXN0LHVuaXBlcmlwaC1pZCA9IDwyPjsKLQkJc3QsdmVyc2lvbiA9IDw1PjsKLQkJc3QsbW9kZSA9ICJQQ00iOwogCX07CiAKLQlzdGlfdW5pX3BsYXllcjM6IHN0aS11bmktcGxheWVyQDMgewotCQljb21wYXRpYmxlID0gInN0LHN0aS11bmktcGxheWVyIjsKKwlzdGlfdW5pX3BsYXllcjM6IHN0aS11bmktcGxheWVyQDB4OEQ4NTAwMCB7CisJCWNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy11bmktcGxheWVyLXNwZGlmIjsKIAkJc3RhdHVzID0gIm9rYXkiOwogCQkjc291bmQtZGFpLWNlbGxzID0gPDA+OwogCQlzdCxzeXNjZmcgPSA8JnN5c2NmZ19jb3JlPjsKQEAgLTk5LDE0ICs4NiwxMCBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgODkgSVJRX1RZUEVfTk9ORT47CiAJCWRtYXMgPSA8JmZkbWEwIDcgMCAxPjsKIAkJZG1hLW5hbWVzID0gInR4IjsKLQkJZGFpLW5hbWUgPSAiVW5pIFBsYXllciAjMyAoU1BESUYpIjsKLQkJc3QsdW5pcGVyaXBoLWlkID0gPDM+OwotCQlzdCx2ZXJzaW9uID0gPDU+OwotCQlzdCxtb2RlID0gIlNQRElGIjsKIAl9OwogCi0Jc3RpX3VuaV9yZWFkZXIxOiBzdGktdW5pLXJlYWRlckAxIHsKLQkJY29tcGF0aWJsZSA9ICJzdCxzdGktdW5pLXJlYWRlciI7CisJc3RpX3VuaV9yZWFkZXIxOiBzdGktdW5pLXJlYWRlckAweDhEODQwMDAgeworCQljb21wYXRpYmxlID0gInN0LHN0aWg0MDctdW5pLXJlYWRlci1oZG1pIjsKIAkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJI3NvdW5kLWRhaS1jZWxscyA9IDwwPjsKIAkJc3Qsc3lzY2ZnID0gPCZzeXNjZmdfY29yZT47CkBAIC0xMTQsOSArOTcsNiBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgODggSVJRX1RZUEVfTk9ORT47CiAJCWRtYXMgPSA8JmZkbWEwIDYgMCAxPjsKIAkJZG1hLW5hbWVzID0gInJ4IjsKLQkJZGFpLW5hbWUgPSAiVW5pIFJlYWRlciAjMSAoSERNSSBSWCkiOwotCQlzdCx2ZXJzaW9uID0gPDM+OwotCQlzdCxtb2RlID0gIlBDTSI7CiAJfTsKIAogMikgc3RpLXNhcy1jb2RlYzogaW50ZXJuYWwgYXVkaW8gY29kZWMgSVBzIGRyaXZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3N1bnhpLHN1bjRpLXNwZGlmLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zdW54aSxzdW40aS1zcGRpZi50eHQKaW5kZXggMTM1MDNhYS4uMDIzMGM0ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3N1bnhpLHN1bjRpLXNwZGlmLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc3VueGksc3VuNGktc3BkaWYudHh0CkBAIC05LDYgKzksNyBAQAogCiAgIC0gY29tcGF0aWJsZQkJOiBzaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CiAgICAgLSAiYWxsd2lubmVyLHN1bjRpLWExMC1zcGRpZiI6IGZvciB0aGUgQWxsd2lubmVyIEExMCBTb0MKKyAgICAtICJhbGx3aW5uZXIsc3VuNmktYTMxLXNwZGlmIjogZm9yIHRoZSBBbGx3aW5uZXIgQTMxIFNvQwogCiAgIC0gcmVnCQkJOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLgogCkBAIC0yNSw2ICsyNiw4IEBACiAJImFwYiIJCSAgY2xvY2sgZm9yIHRoZSBzcGRpZiBidXMuCiAJInNwZGlmIgkJICBjbG9jayBmb3Igc3BkaWYgY29udHJvbGxlci4KIAorICAtIHJlc2V0cwkJOiByZXNldCBzcGVjaWZpZXIgZm9yIHRoZSBhaGIgcmVzZXQgKEEzMSBhbmQgbmV3ZXIgb25seSkKKwogRXhhbXBsZToKIAogc3BkaWY6IHNwZGlmQDAxYzIxMDAwIHsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzMXh4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzMXh4LnR4dAppbmRleCBlZmYxMmJlLi45MzQwZDJkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvdGx2MzIwYWljMzF4eC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzMxeHgudHh0CkBAIC0xMSw2ICsxMSw3IEBACiAgICAgInRpLHRsdjMyMGFpYzMxMTAiIC0gVExWMzIwQUlDMzExMCAoc3RlcmVvIHNwZWFrZXIgYW1wLCBubyBNaW5pRFNQKQogICAgICJ0aSx0bHYzMjBhaWMzMTIwIiAtIFRMVjMyMEFJQzMxMjAgKG1vbm8gc3BlYWtlciBhbXAsIE1pbmlEU1ApCiAgICAgInRpLHRsdjMyMGFpYzMxMTEiIC0gVExWMzIwQUlDMzExMSAoc3RlcmVvIHNwZWFrZXIgYW1wLCBNaW5pRFNQKQorICAgICJ0aSx0bHYzMjBkYWMzMTAwIiAtIFRMVjMyMERBQzMxMDAgKG5vIEFEQywgbW9ubyBzcGVha2VyIGFtcCwgbm8gTWluaURTUCkKIAogLSByZWcgLSA8aW50PiAtICBJMkMgc2xhdmUgYWRkcmVzcwogLSBIUFZERC1zdXBwbHksIFNQUlZERC1zdXBwbHksIFNQTFZERC1zdXBwbHksIEFWREQtc3VwcGx5LCBJT1ZERC1zdXBwbHksCkBAIC0zNyw5ICszOCwxMSBAQAogICAqIE1JQ0JJQVMKIAogQ09ERUMgaW5wdXQgcGluczoKLSAgKiBNSUMxTFAKLSAgKiBNSUMxUlAKLSAgKiBNSUMxTE0KKyAgKiBNSUMxTFAsIGRldmljZXMgd2l0aCBBREMKKyAgKiBNSUMxUlAsIGRldmljZXMgd2l0aCBBREMKKyAgKiBNSUMxTE0sIGRldmljZXMgd2l0aCBBREMKKyAgKiBBSU4xLCBkZXZpY2VzIHdpdGhvdXQgQURDCisgICogQUlOMiwgZGV2aWNlcyB3aXRob3V0IEFEQwogCiBUaGUgcGlucyBjYW4gYmUgdXNlZCBpbiByZWZlcnJpbmcgc291bmQgbm9kZSdzIGF1ZGlvLXJvdXRpbmcgcHJvcGVydHkuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvYnJjbSxzcGktYmNtLXFzcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9icmNtLHNwaS1iY20tcXNwaS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3YWM4MAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvYnJjbSxzcGktYmNtLXFzcGkudHh0CkBAIC0wLDAgKzEsMjMzIEBACitCcm9hZGNvbSBTUEkgY29udHJvbGxlcgorCitUaGUgQnJvYWRjb20gU1BJIGNvbnRyb2xsZXIgaXMgYSBTUEkgbWFzdGVyIGZvdW5kIG9uIHZhcmlvdXMgU09DcywgaW5jbHVkaW5nCitCUkNNU1RCIChCQ003WFhYKSwgQ3lnbnVzLCBOU1AgYW5kIE5TMi4gVGhlIEJyb2FkY29tIE1hc3RlciBTUEkgaHcgSVAgY29uc2l0cworb2YgOgorIE1TUEkgOiBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgY2FuIHJlYWQgYW5kIHdyaXRlIHRvIGEgU1BJIHNsYXZlIGRldmljZQorIEJTUEkgOiBCcm9hZGNvbSBTUEkgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgTVNQSSBodyBJUCBwcm92aWRlcyBhY2NlbGVyYXRpb24KKwlmb3IgZmxhc2ggcmVhZHMgYW5kIGJlIGNvbmZpZ3VyZWQgdG8gZG8gc2luZ2xlLCBkb3VibGUsIHF1YWQgbGFuZQorCWlvIHdpdGggMy1ieXRlIGFuZCA0LWJ5dGUgYWRkcmVzc2luZyBzdXBwb3J0LgorCisgU3VwcG9ydGVkIEJyb2FkY29tIFNvQ3MgaGF2ZSBvbmUgaW5zdGFuY2Ugb2YgTVNQSStCU1BJIGNvbnRyb2xsZXIgSVAuCisgTVNQSSBtYXN0ZXIgY2FuIGJlIHVzZWQgd2lob3V0IEJTUEkuIEJSQ01TVEIgU29DcyBoYXZlIGFuIGFkZGl0aW9uYWwgaW5zdGFuY2UKKyBvZiBhIE1TUEkgbWFzdGVyIHdpdGhvdXQgdGhlIEJTUEkgdG8gdXNlIHdpdGggbm9uIGZsYXNoIHNsYXZlIGRldmljZXMgdGhhdAorIHVzZSBTUEkgcHJvdG9jb2wuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gI2FkZHJlc3MtY2VsbHM6CisgICAgTXVzdCBiZSA8MT4sIGFzIHJlcXVpcmVkIGJ5IGdlbmVyaWMgU1BJIGJpbmRpbmcuCisKKy0gI3NpemUtY2VsbHM6CisgICAgTXVzdCBiZSA8MD4sIGFsc28gYXMgcmVxdWlyZWQgYnkgZ2VuZXJpYyBTUEkgYmluZGluZy4KKworLSBjb21wYXRpYmxlOgorICAgIE11c3QgYmUgb25lIG9mIDoKKyAgICAiYnJjbSxzcGktYmNtLXFzcGkiLCAiYnJjbSxzcGktYnJjbXN0Yi1xc3BpIiA6IE1TUEkrQlNQSSBvbiBCUkNNU1RCIFNvQ3MKKyAgICAiYnJjbSxzcGktYmNtLXFzcGkiLCAiYnJjbSxzcGktYnJjbXN0Yi1tc3BpIiA6IFNlY29uZCBJbnN0YW5jZSBvZiBNU1BJCisJCQkJCQkgICBCUkNNU1RCICBTb0NzCisgICAgImJyY20sc3BpLWJjbS1xc3BpIiwgImJyY20sc3BpLW5zcC1xc3BpIiAgICAgOiBNU1BJK0JTUEkgb24gQ3lnbnVzLCBOU1AKKyAgICAiYnJjbSxzcGktYmNtLXFzcGkiLCAiYnJjbSxzcGktbnMyLXFzcGkiICAgICA6IE5TMiBTb0NzCisKKy0gcmVnOgorICAgIERlZmluZSB0aGUgYmFzZXMgYW5kIHJhbmdlcyBvZiB0aGUgYXNzb2NpYXRlZCBJL08gYWRkcmVzcyBzcGFjZXMuCisgICAgVGhlIHJlcXVpcmVkIHJhbmdlIGlzIE1TUEkgY29udHJvbGxlciByZWdpc3RlcnMuCisKKy0gcmVnLW5hbWVzOgorICAgIEZpcnN0IG5hbWUgZG9lcyBub3QgbWF0dGVyLCBidXQgbXVzdCBiZSByZXNlcnZlZCBmb3IgdGhlIE1TUEkgY29udHJvbGxlcgorICAgIHJlZ2lzdGVyIHJhbmdlIGFzIG1lbnRpb25lZCBpbiAncmVnJyBhYm92ZSwgYW5kIHdpbGwgdHlwaWNhbGx5IGNvbnRhaW4KKyAgICAtICJic3BpX3JlZ3MiOiBCU1BJIHJlZ2lzdGVyIHJhbmdlLCBub3QgcmVxdWlyZWQgd2l0aCBjb21wYXRpYmxlCisJCSAgICJzcGktYnJjbXN0Yi1tc3BpIgorICAgIC0gIm1zcGlfcmVncyI6IE1TUEkgcmVnaXN0ZXIgcmFuZ2UgaXMgcmVxdWlyZWQgZm9yIGNvbXBhdGlibGUgc3RyaW5ncworICAgIC0gImludHJfcmVncyIsICJpbnRyX3N0YXR1c19yZWciIDogSW50ZXJydXB0IGFuZCBzdGF0dXMgcmVnaXN0ZXIgZm9yCisgICAgICBOU1AsIE5TMiwgQ3lnbnVzIFNvQworCistIGludGVycnVwdHMKKyAgICBUaGUgaW50ZXJydXB0cyB1c2VkIGJ5IHRoZSBNU1BJIGFuZC9vciBCU1BJIGNvbnRyb2xsZXIuCisKKy0gaW50ZXJydXB0LW5hbWVzOgorICAgIE5hbWVzIG9mIGludGVycnVwdHMgYXNzb2NpYXRlZCB3aXRoIE1TUEkKKyAgICAtICJtc3BpX2hhbHRlZCIgOgorICAgIC0gIm1zcGlfZG9uZSI6IEluZGljYXRlcyB0aGF0IHRoZSByZXF1ZXN0ZWQgU1BJIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4KKyAgICAtICJzcGlfbHJfZnVsbG5lc3NfcmVhY2hlZCIgOiBMaW5lYXIgcmVhZCBCU1BJIHBpcGUgZnVsbAorICAgIC0gInNwaV9scl9zZXNzaW9uX2Fib3J0ZWQiICA6IExpbmVhciByZWFkIEJTUEkgcGlwZSBhYm9ydGVkCisgICAgLSAic3BpX2xyX2ltcGF0aWVudCIgOiBMaW5lYXIgcmVhZCBCU1BJIHJlcXVlc3RlZCB3aGVuIHBpcGUgZW1wdHkKKyAgICAtICJzcGlfbHJfc2Vzc2lvbl9kb25lIiA6IExpbmVhciByZWFkIEJTUEkgc2Vzc2lvbiBkb25lCisKKy0gY2xvY2tzOgorICAgIEEgcGhhbmRsZSB0byB0aGUgcmVmZXJlbmNlIGNsb2NrIGZvciB0aGlzIGJsb2NrLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCisKKy0gbmF0aXZlLWVuZGlhbgorICAgIERlZmluZWQgd2hlbiB1c2luZyBCRSBTb0MgYW5kIGRldmljZSB1c2VzIEJFIHJlZ2lzdGVyIHJlYWQvd3JpdGUKKworUmVjb21tZW5kZWQgb3B0aW9uYWwgbTI1cDgwIHByb3BlcnRpZXM6CistIHNwaS1yeC1idXMtd2lkdGg6IERlZmluaXRpb24gYXMgcGVyCisgICAgICAgICAgICAgICAgICAgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWJ1cy50eHQKKworRXhhbXBsZXM6CisKK0JSQ01TVEIgU29DIEV4YW1wbGU6CisKKyAgU1BJIE1hc3RlciAoTVNQSStCU1BJKSBmb3IgU1BJLU5PUiBhY2Nlc3M6CisKKyAgICBzcGlAZjAzZTM0MDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwweDE+OworCQkjc2l6ZS1jZWxscyA9IDwweDA+OworCQljb21wYXRpYmxlID0gImJyY20sc3BpLWJyY21zdGItcXNwaSIsICJicmNtLHNwaS1icmNtc3RiLXFzcGkiOworCQlyZWcgPSA8MHhmMDNlMDkyMCAweDQgMHhmMDNlMzQwMCAweDE4OCAweGYwM2UzMjAwIDB4NTA+OworCQlyZWctbmFtZXMgPSAiY3NfcmVnIiwgIm1zcGkiLCAiYnNwaSI7CisJCWludGVycnVwdHMgPSA8MHg2IDB4NSAweDQgMHgzIDB4MiAweDEgMHgwPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwweDFjPjsKKwkJaW50ZXJydXB0LW5hbWVzID0gIm1zcGlfaGFsdGVkIiwKKwkJCQkgICJtc3BpX2RvbmUiLAorCQkJCSAgInNwaV9scl9vdmVycmVhZCIsCisJCQkJICAic3BpX2xyX3Nlc3Npb25fZG9uZSIsCisJCQkJICAic3BpX2xyX2ltcGF0aWVudCIsCisJCQkJICAic3BpX2xyX3Nlc3Npb25fYWJvcnRlZCIsCisJCQkJICAic3BpX2xyX2Z1bGxuZXNzX3JlYWNoZWQiOworCisJCWNsb2NrcyA9IDwmaGlmX3NwaT47CisJCWNsb2NrLW5hbWVzID0gInN3X3NwaSI7CisKKwkJbTI1cDgwQDAgeworCQkJI3NpemUtY2VsbHMgPSA8MHgyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDB4Mj47CisJCQljb21wYXRpYmxlID0gIm0yNXA4MCI7CisJCQlyZWcgPSA8MHgwPjsKKwkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDB4MjYyNWEwMD47CisJCQlzcGktY3BvbDsKKwkJCXNwaS1jcGhhOworCQkJbTI1cCxmYXN0LXJlYWQ7CisKKwkJCWZsYXNoMC5ib2x0QDAgeworCQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDEwMDAwMD47CisJCQl9OworCisJCQlmbGFzaDAubWFjYWRyQDEwMDAwMCB7CisJCQkJcmVnID0gPDB4MCAweDEwMDAwMCAweDAgMHgxMDAwMD47CisJCQl9OworCisJCQlmbGFzaDAubnZyYW1AMTEwMDAwIHsKKwkJCQlyZWcgPSA8MHgwIDB4MTEwMDAwIDB4MCAweDEwMDAwPjsKKwkJCX07CisKKwkJCWZsYXNoMC5rZXJuZWxAMTIwMDAwIHsKKwkJCQlyZWcgPSA8MHgwIDB4MTIwMDAwIDB4MCAweDQwMDAwMD47CisJCQl9OworCisJCQlmbGFzaDAuZGV2dHJlZUA1MjAwMDAgeworCQkJCXJlZyA9IDwweDAgMHg1MjAwMDAgMHgwIDB4MTAwMDA+OworCQkJfTsKKworCQkJZmxhc2gwLnNwbGFzaEA1MzAwMDAgeworCQkJCXJlZyA9IDwweDAgMHg1MzAwMDAgMHgwIDB4ODAwMDA+OworCQkJfTsKKworCQkJZmxhc2gwQDAgeworCQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDQwMDAwMDA+OworCQkJfTsKKwkJfTsKKwl9OworCisKKyAgICBNU1BJIG1hc3RlciBmb3IgYW55IFNQSSBkZXZpY2UgOgorCisJc3BpQGYwNDE2MDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQljbG9ja3MgPSA8JnVwZ19maXhlZD47CisJCWNvbXBhdGlibGUgPSAiYnJjbSxzcGktYnJjbXN0Yi1xc3BpIiwgImJyY20sc3BpLWJyY21zdGItbXNwaSI7CisJCXJlZyA9IDwweGYwNDE2MDAwIDB4MTgwPjsKKwkJcmVnLW5hbWVzID0gIm1zcGkiOworCQlpbnRlcnJ1cHRzID0gPDB4MTQ+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcnEwX2Fvbl9pbnRjPjsKKwkJaW50ZXJydXB0LW5hbWVzID0gIm1zcGlfZG9uZSI7CisJfTsKKworaVByb2MgU29DIEV4YW1wbGU6CisKKyAgICBxc3BpOiBzcGlAMTgwMjcyMDAgeworCWNvbXBhdGlibGUgPSAiYnJjbSxzcGktYmNtLXFzcGkiLCAiYnJjbSxzcGktbnNwLXFzcGkiOworCXJlZyA9IDwweDE4MDI3MjAwIDB4MTg0PiwKKwkgICAgICA8MHgxODAyNzAwMCAweDEyND4sCisJICAgICAgPDB4MTgxMWM0MDggMHgwMDQ+LAorCSAgICAgIDwweDE4MDI3M2EwIDB4MDFjPjsKKwlyZWctbmFtZXMgPSAibXNwaV9yZWdzIiwgImJzcGlfcmVncyIsICJpbnRyX3JlZ3MiLCAiaW50cl9zdGF0dXNfcmVnIjsKKwlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNzIgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCSAgICAgPEdJQ19TUEkgNzMgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCSAgICAgPEdJQ19TUEkgNzQgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCSAgICAgPEdJQ19TUEkgNzUgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCSAgICAgPEdJQ19TUEkgNzYgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCSAgICAgPEdJQ19TUEkgNzcgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCSAgICAgPEdJQ19TUEkgNzggSVJRX1RZUEVfTEVWRUxfSElHSD47CisJaW50ZXJydXB0LW5hbWVzID0KKwkJICAgICAic3BpX2xyX2Z1bGxuZXNzX3JlYWNoZWQiLAorCQkgICAgICJzcGlfbHJfc2Vzc2lvbl9hYm9ydGVkIiwKKwkJICAgICAic3BpX2xyX2ltcGF0aWVudCIsCisJCSAgICAgInNwaV9scl9zZXNzaW9uX2RvbmUiLAorCQkgICAgICJtc3BpX2RvbmUiLAorCQkgICAgICJtc3BpX2hhbHRlZCI7CisJY2xvY2tzID0gPCZpcHJvY21lZD47CisJY2xvY2stbmFtZXMgPSAiaXByb2NtZWQiOworCW51bS1jcyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwwPjsKKyAgICB9OworCisKKyBOUzIgU29DIEV4YW1wbGU6CisKKwkgICAgICAgcXNwaTogc3BpQDY2NDcwMjAwIHsKKwkJICAgICAgIGNvbXBhdGlibGUgPSAiYnJjbSxzcGktYmNtLXFzcGkiLCAiYnJjbSxzcGktbnMyLXFzcGkiOworCQkgICAgICAgcmVnID0gPDB4NjY0NzAyMDAgMHgxODQ+LAorCQkJICAgICA8MHg2NjQ3MDAwMCAweDEyND4sCisJCQkgICAgIDwweDY3MDE3NDA4IDB4MDA0PiwKKwkJCSAgICAgPDB4NjY0NzAzYTAgMHgwMWM+OworCQkgICAgICAgcmVnLW5hbWVzID0gIm1zcGkiLCAiYnNwaSIsICJpbnRyX3JlZ3MiLAorCQkJImludHJfc3RhdHVzX3JlZyI7CisJCSAgICAgICBpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNDE5IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkgICAgICAgaW50ZXJydXB0LW5hbWVzID0gInNwaV9sMV9pbnRyIjsKKwkJCWNsb2NrcyA9IDwmaXByb2NtZWQ+OworCQkJY2xvY2stbmFtZXMgPSAiaXByb2NtZWQiOworCQkJbnVtLWNzID0gPDI+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkgICAgICAgfTsKKworCisgbTI1cDgwIG5vZGUgZm9yIE5TUCwgTlMyCisKKwkgJnFzcGkgeworCQkgICAgICBmbGFzaDogbTI1cDgwQDAgeworCQkgICAgICAjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJICAgICAgI3NpemUtY2VsbHMgPSA8MT47CisJCSAgICAgIGNvbXBhdGlibGUgPSAibTI1cDgwIjsKKwkJICAgICAgcmVnID0gPDB4MD47CisJCSAgICAgIHNwaS1tYXgtZnJlcXVlbmN5ID0gPDEyNTAwMDAwPjsKKwkJICAgICAgbTI1cCxmYXN0LXJlYWQ7CisJCSAgICAgIHNwaS1jcG9sOworCQkgICAgICBzcGktY3BoYTsKKworCQkgICAgICBwYXJ0aXRpb25AMCB7CisJCQkJICBsYWJlbCA9ICJib290IjsKKwkJCQkgIHJlZyA9IDwweDAwMDAwMDAwIDB4MDAwYTAwMDA+OworCQkgICAgICB9OworCisJCSAgICAgIHBhcnRpdGlvbkBhMDAwMCB7CisJCQkJICBsYWJlbCA9ICJlbnYiOworCQkJCSAgcmVnID0gPDB4MDAwYTAwMDAgMHgwMDA2MDAwMD47CisJCSAgICAgIH07CisKKwkJICAgICAgcGFydGl0aW9uQDEwMDAwMCB7CisJCQkJICBsYWJlbCA9ICJzeXN0ZW0iOworCQkJCSAgcmVnID0gPDB4MDAxMDAwMDAgMHgwMDYwMDAwMD47CisJCSAgICAgIH07CisKKwkJICAgICAgcGFydGl0aW9uQDcwMDAwMCB7CisJCQkJICBsYWJlbCA9ICJyb290ZnMiOworCQkJCSAgcmVnID0gPDB4MDA3MDAwMDAgMHgwMTkwMDAwMD47CisJCSAgICAgIH07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvamNvcmUsc3BpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvamNvcmUsc3BpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzkzNmQxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9qY29yZSxzcGkudHh0CkBAIC0wLDAgKzEsMzQgQEAKK0otQ29yZSBTUEkgbWFzdGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZTogTXVzdCBiZSAiamNvcmUsc3BpMiIuCisKKy0gcmVnOiBNZW1vcnkgcmVnaW9uIGZvciByZWdpc3RlcnMuCisKKy0gI2FkZHJlc3MtY2VsbHM6IE11c3QgYmUgMS4KKworLSAjc2l6ZS1jZWxsczogTXVzdCBiZSAwLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCistIGNsb2NrczogSWYgYSBwaGFuZGxlIG5hbWVkICJyZWZfY2xrIiBpcyBwcmVzZW50LCBTUEkgY2xvY2sgc3BlZWQKKyAgcHJvZ3JhbW1pbmcgaXMgcmVsYXRpdmUgdG8gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgaW5kaWNhdGVkIGNsb2NrLgorICBOZWNlc3Nhcnkgb25seSBpZiB0aGUgaW5wdXQgY2xvY2sgcmF0ZSBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiBhCisgIGZpeGVkIDUwIE1Iei4KKworLSBjbG9jay1uYW1lczogQ2xvY2sgbmFtZXMsIG9uZSBmb3IgZWFjaCBwaGFuZGxlIGluIGNsb2Nrcy4KKworU2VlIHNwaS1idXMudHh0IGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgbm90IHNwZWNpZmljIHRvIHRoaXMgZGV2aWNlLgorCitFeGFtcGxlOgorCitzcGlANDAgeworCWNvbXBhdGlibGUgPSAiamNvcmUsc3BpMiI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MD47CisJcmVnID0gPDB4NDAgMHg4PjsKKwlzcGktbWF4LWZyZXF1ZW5jeSA9IDwyNTAwMDAwMD47CisJY2xvY2tzID0gPCZidXNfY2xrPjsKKwljbG9jay1uYW1lcyA9ICJyZWZfY2xrIjsKK30KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWJ1cy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1idXMudHh0CmluZGV4IDE3ODIyODYuLjRiMWQ2ZTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWJ1cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktYnVzLnR4dApAQCAtMzEsNyArMzEsNyBAQAogU28gaWYgZm9yIGV4YW1wbGUgdGhlIGNvbnRyb2xsZXIgaGFzIDIgQ1MgbGluZXMsIGFuZCB0aGUgY3MtZ3Bpb3MKIHByb3BlcnR5IGxvb2tzIGxpa2UgdGhpczoKIAotY3MtZ3Bpb3MgPSA8JmdwaW8xIDAgMD4gPDA+IDwmZ3BpbzEgMSAwPiA8JmdwaW8xIDIgMD47Citjcy1ncGlvcyA9IDwmZ3BpbzEgMCAwPiwgPDA+LCA8JmdwaW8xIDEgMD4sIDwmZ3BpbzEgMiAwPjsKIAogVGhlbiBpdCBzaG91bGQgYmUgY29uZmlndXJlZCBzbyB0aGF0IG51bV9jaGlwc2VsZWN0ID0gNCB3aXRoIHRoZQogZm9sbG93aW5nIG1hcHBpbmc6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1tZXNvbi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1tZXNvbi50eHQKaW5kZXggYmI1MmE4Ni4uZGM2ZDAzMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktbWVzb24udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLW1lc29uLnR4dApAQCAtNyw3ICs3LDcgQEAKIHJlY2VpdmUgYnVmZmVyLgogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotIC0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJhbWxvZ2ljLG1lc29uNi1zcGlmYyIKKyAtIGNvbXBhdGlibGU6IHNob3VsZCBiZSAiYW1sb2dpYyxtZXNvbjYtc3BpZmMiIG9yICJhbWxvZ2ljLG1lc29uLWd4YmItc3BpZmMiCiAgLSByZWc6IHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSBjb250cm9sbGVyIHJlZ2lzdGVycwogIC0gY2xvY2tzOiBwaGFuZGxlIG9mIHRoZSBpbnB1dCBjbG9jayBmb3IgdGhlIGJhdWQgcmF0ZSBnZW5lcmF0b3IKICAtICNhZGRyZXNzLWNlbGxzOiBzaG91bGQgYmUgMQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RoZXJtYWwvdGhlcm1hbC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGhlcm1hbC90aGVybWFsLnR4dAppbmRleCA0MWI4MTdmLi44OGI2ZWExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGhlcm1hbC90aGVybWFsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGhlcm1hbC90aGVybWFsLnR4dApAQCAtNjIsNyArNjIsNyBAQAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gI2Nvb2xpbmctY2VsbHM6CVVzZWQgdG8gcHJvdmlkZSBjb29saW5nIGRldmljZSBzcGVjaWZpYyBpbmZvcm1hdGlvbgogICBUeXBlOiB1bnNpZ25lZAl3aGlsZSByZWZlcnJpbmcgdG8gaXQuIE11c3QgYmUgYXQgbGVhc3QgMiwgaW4gb3JkZXIKLSAgU2l6ZTogb25lIGNlbGwgICAgICAJdG8gc3BlY2lmeSBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvb2xpbmcgc3RhdGUgdXNlZAorICBTaXplOiBvbmUgY2VsbAl0byBzcGVjaWZ5IG1pbmltdW0gYW5kIG1heGltdW0gY29vbGluZyBzdGF0ZSB1c2VkCiAJCQlpbiB0aGUgcmVmZXJlbmNlLiBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgbWluaW11bQogCQkJY29vbGluZyBzdGF0ZSByZXF1ZXN0ZWQgYW5kIHRoZSBzZWNvbmQgY2VsbCBpcwogCQkJdGhlIG1heGltdW0gY29vbGluZyBzdGF0ZSByZXF1ZXN0ZWQgaW4gdGhlIHJlZmVyZW5jZS4KQEAgLTExOSw3ICsxMTksNyBAQAogT3B0aW9uYWwgcHJvcGVydHk6CiAtIGNvbnRyaWJ1dGlvbjoJCVRoZSBjb29saW5nIGNvbnRyaWJ1dGlvbiB0byB0aGUgdGhlcm1hbCB6b25lIG9mIHRoZQogICBUeXBlOiB1bnNpZ25lZAlyZWZlcnJlZCBjb29saW5nIGRldmljZSBhdCB0aGUgcmVmZXJyZWQgdHJpcCBwb2ludC4KLSAgU2l6ZTogb25lIGNlbGwgICAgICAJVGhlIGNvbnRyaWJ1dGlvbiBpcyBhIHJhdGlvIG9mIHRoZSBzdW0KKyAgU2l6ZTogb25lIGNlbGwJVGhlIGNvbnRyaWJ1dGlvbiBpcyBhIHJhdGlvIG9mIHRoZSBzdW0KIAkJCW9mIGFsbCBjb29saW5nIGNvbnRyaWJ1dGlvbnMgd2l0aGluIGEgdGhlcm1hbCB6b25lLgogCiBOb3RlOiBVc2luZyB0aGUgVEhFUk1BTF9OT19MSU1JVCAoLTFVTCkgY29uc3RhbnQgaW4gdGhlIGNvb2xpbmctZGV2aWNlIHBoYW5kbGUKQEAgLTE0NSw3ICsxNDUsNyBAQAogICBTaXplOiBvbmUgY2VsbAogCiAtIHRoZXJtYWwtc2Vuc29yczoJQSBsaXN0IG9mIHRoZXJtYWwgc2Vuc29yIHBoYW5kbGVzIGFuZCBzZW5zb3Igc3BlY2lmaWVyCi0gIFR5cGU6IGxpc3Qgb2YgCXVzZWQgd2hpbGUgbW9uaXRvcmluZyB0aGUgdGhlcm1hbCB6b25lLgorICBUeXBlOiBsaXN0IG9mCQl1c2VkIHdoaWxlIG1vbml0b3JpbmcgdGhlIHRoZXJtYWwgem9uZS4KICAgcGhhbmRsZXMgKyBzZW5zb3IKICAgc3BlY2lmaWVyCiAKQEAgLTQ3Myw3ICs0NzMsNyBAQAogCQkJCSAgPCZhZGM+OwkvKiBwY2Igbm9ydGggKi8KIAogCQkvKiBob3RzcG90ID0gMTAwICogYmFuZGdhcCAtIDEyMCAqIGFkYyArIDQ4NCAqLwotCQljb2VmZmljaWVudHMgPSAJCTwxMDAJLTEyMAk0ODQ+OworCQljb2VmZmljaWVudHMgPQkJPDEwMAktMTIwCTQ4ND47CiAKIAkJdHJpcHMgewogCQkJLi4uCkBAIC01MDIsNyArNTAyLDcgQEAKICAgICAgICAgdGhlcm1hbC1zZW5zb3JzID0gIDwmYWRjPjsKIAogCQkvKiBob3RzcG90ID0gMSAqIGFkYyArIDYwMDAgKi8KLQljb2VmZmljaWVudHMgPSAJCTwxCTYwMDA+OworCWNvZWZmaWNpZW50cyA9CQk8MQk2MDAwPjsKIAogKGQpIC0gQm9hcmQgdGhlcm1hbAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGltZXIvbW94YSxtb3hhcnQtdGltZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RpbWVyL21veGEsbW94YXJ0LXRpbWVyLnR4dAppbmRleCBkYTJkNTEwLi5lMjA3YzExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGltZXIvbW94YSxtb3hhcnQtdGltZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aW1lci9tb3hhLG1veGFydC10aW1lci50eHQKQEAgLTIsNyArMiw5IEBACiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAKLS0gY29tcGF0aWJsZSA6IE11c3QgYmUgIm1veGEsbW94YXJ0LXRpbWVyIgorLSBjb21wYXRpYmxlIDogTXVzdCBiZSBvbmUgb2Y6CisgCS0gIm1veGEsbW94YXJ0LXRpbWVyIgorIAktICJhc3BlZWQsYXN0MjQwMC10aW1lciIKIC0gcmVnIDogU2hvdWxkIGNvbnRhaW4gcmVnaXN0ZXJzIGxvY2F0aW9uIGFuZCBsZW5ndGgKIC0gaW50ZXJydXB0cyA6IFNob3VsZCBjb250YWluIHRoZSB0aW1lciBpbnRlcnJ1cHQgbnVtYmVyCiAtIGNsb2NrcyA6IFNob3VsZCBjb250YWluIHBoYW5kbGUgZm9yIHRoZSBjbG9jayB0aGF0IGRyaXZlcyB0aGUgY291bnRlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RpbWVyL294c2VtaSxycHMtdGltZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RpbWVyL294c2VtaSxycHMtdGltZXIudHh0CmluZGV4IDNjYTg5Y2QuLmQxOTE2MTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aW1lci9veHNlbWkscnBzLXRpbWVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGltZXIvb3hzZW1pLHJwcy10aW1lci50eHQKQEAgLTIsNyArMiw3IEBACiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJveHNlbWksb3g4MTBzZS1ycHMtdGltZXIiCistIGNvbXBhdGlibGU6IFNob3VsZCBiZSAib3hzZW1pLG94ODEwc2UtcnBzLXRpbWVyIiBvciAib3hzZW1pLG94ODIwLXJwcy10aW1lciIKIC0gcmVnIDogU3BlY2lmaWVzIGJhc2UgcGh5c2ljYWwgYWRkcmVzcyBhbmQgc2l6ZSBvZiB0aGUgcmVnaXN0ZXJzLgogLSBpbnRlcnJ1cHRzIDogVGhlIGludGVycnVwdHMgb2YgdGhlIHR3byB0aW1lcnMKIC0gY2xvY2tzIDogVGhlIHBoYW5kbGUgb2YgdGhlIHRpbWVyIGNsb2NrIHNvdXJjZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9jaS1oZHJjLXVzYjIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9jaS1oZHJjLXVzYjIudHh0CmluZGV4IDM0MWRjNjcuLjBlMDMzNDQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvY2ktaGRyYy11c2IyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2NpLWhkcmMtdXNiMi50eHQKQEAgLTgxLDYgKzgxLDggQEAKIC0gZnNsLHVzYm1pc2M6IHBoYW5kbGVyIG9mIG5vbi1jb3JlIHJlZ2lzdGVyIGRldmljZSwgd2l0aCBvbmUKICAgYXJndW1lbnQgdGhhdCBpbmRpY2F0ZSB1c2IgY29udHJvbGxlciBpbmRleAogLSBkaXNhYmxlLW92ZXItY3VycmVudDogZGlzYWJsZSBvdmVyIGN1cnJlbnQgZGV0ZWN0CistIG92ZXItY3VycmVudC1hY3RpdmUtaGlnaDogb3ZlciBjdXJyZW50IHNpZ25hbCBwb2xhcml0eSBpcyBoaWdoIGFjdGl2ZSwKKyAgdHlwaWNhbGx5IG92ZXIgY3VycmVudCBzaWduYWwgcG9sYXJpdHkgaXMgbG93IGFjdGl2ZS4KIC0gZXh0ZXJuYWwtdmJ1cy1kaXZpZGVyOiBlbmFibGVzIG9mZi1jaGlwIHJlc2lzdG9yIGRpdmlkZXIgZm9yIFZidXMKIAogRXhhbXBsZToKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzIudHh0CmluZGV4IDIwYTY4YmYuLjdkMTZlYmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MyLnR4dApAQCAtMjYsNyArMjYsMTAgQEAKIC0gZy11c2UtZG1hOiBlbmFibGUgZG1hIHVzYWdlIGluIGdhZGdldCBkcml2ZXIuCiAtIGctcngtZmlmby1zaXplOiBzaXplIG9mIHJ4IGZpZm8gc2l6ZSBpbiBnYWRnZXQgbW9kZS4KIC0gZy1ucC10eC1maWZvLXNpemU6IHNpemUgb2Ygbm9uLXBlcmlvZGljIHR4IGZpZm8gc2l6ZSBpbiBnYWRnZXQgbW9kZS4KLS0gZy10eC1maWZvLXNpemU6IHNpemUgb2YgcGVyaW9kaWMgdHggZmlmbyBwZXIgZW5kcG9pbnQgKGV4Y2VwdCBlcDApIGluIGdhZGdldCBtb2RlLgorCitEZXByZWNhdGVkIHByb3BlcnRpZXM6CistIGctdHgtZmlmby1zaXplOiBzaXplIG9mIHBlcmlvZGljIHR4IGZpZm8gcGVyIGVuZHBvaW50IChleGNlcHQgZXAwKQorICBpbiBnYWRnZXQgbW9kZS4KIAogRXhhbXBsZToKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MzLWNhdml1bS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzMtY2F2aXVtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTBiNzgyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MzLWNhdml1bS50eHQKQEAgLTAsMCArMSwyOCBAQAorQ2F2aXVtIFN1cGVyU3BlZWQgRFdDMyBVU0IgU29DIGNvbnRyb2xsZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZToJU2hvdWxkIGNvbnRhaW4gImNhdml1bSxvY3Rlb24tNzEzMC11c2ItdWN0bCIKKworUmVxdWlyZWQgY2hpbGQgbm9kZToKK0EgY2hpbGQgbm9kZSBtdXN0IGV4aXN0IHRvIHJlcHJlc2VudCB0aGUgY29yZSBEV0MzIElQIGJsb2NrLiBUaGUgbmFtZSBvZgordGhlIG5vZGUgaXMgbm90IGltcG9ydGFudC4gVGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUgaXMgZGVmaW5lZCBpbiBkd2MzLnR4dC4KKworRXhhbXBsZSBkZXZpY2Ugbm9kZToKKworCQkgICAgdWN0bEAxMTgwMDY5MDAwMDAwIHsKKwkJCSAgICBjb21wYXRpYmxlID0gImNhdml1bSxvY3Rlb24tNzEzMC11c2ItdWN0bCI7CisJCQkgICAgcmVnID0gPDB4MDAwMTE4MDAgMHg2OTAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAxMDA+OworCQkJICAgIHJhbmdlczsKKwkJCSAgICAjYWRkcmVzcy1jZWxscyA9IDwweDAwMDAwMDAyPjsKKwkJCSAgICAjc2l6ZS1jZWxscyA9IDwweDAwMDAwMDAyPjsKKwkJCSAgICByZWZjbGstZnJlcXVlbmN5ID0gPDB4MDVmNWUxMDA+OworCQkJICAgIHJlZmNsay10eXBlLXNzID0gImRsbWNfcmVmX2NsazAiOworCQkJICAgIHJlZmNsay10eXBlLWhzID0gImRsbWNfcmVmX2NsazAiOworCQkJICAgIHBvd2VyID0gPDB4MDAwMDAwMDIgMHgwMDAwMDAwMiAweDAwMDAwMDAxPjsKKwkJCSAgICB4aGNpQDE2OTAwMDAwMDAwMDAgeworCQkJCSAgICBjb21wYXRpYmxlID0gImNhdml1bSxvY3Rlb24tNzEzMC14aGNpIiwgInN5bm9wc3lzLGR3YzMiOworCQkJCSAgICByZWcgPSA8MHgwMDAxNjkwMCAweDAwMDAwMDAwIDB4MDAwMDAwMTAgMHgwMDAwMDAwMD47CisJCQkJICAgIGludGVycnVwdC1wYXJlbnQgPSA8MHgwMDAwMDAxMD47CisJCQkJICAgIGludGVycnVwdHMgPSA8MHgwMDAwMDAwOSAweDAwMDAwMDA0PjsKKwkJCSAgICB9OworCQkgICAgfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzMudHh0CmluZGV4IDdkN2NlMDguLmUzZTY5ODMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MzLnR4dApAQCAtMTMsNyArMTMsOCBAQAogICAgaW4gdGhlIGFycmF5IGlzIGV4cGVjdGVkIHRvIGJlIGEgaGFuZGxlIHRvIHRoZSBVU0IyL0hTIFBIWSBhbmQKICAgIHRoZSBzZWNvbmQgZWxlbWVudCBpcyBleHBlY3RlZCB0byBiZSBhIGhhbmRsZSB0byB0aGUgVVNCMy9TUyBQSFkKICAtIHBoeXM6IGZyb20gdGhlICpHZW5lcmljIFBIWSogYmluZGluZ3MKLSAtIHBoeS1uYW1lczogZnJvbSB0aGUgKkdlbmVyaWMgUEhZKiBiaW5kaW5ncworIC0gcGh5LW5hbWVzOiBmcm9tIHRoZSAqR2VuZXJpYyBQSFkqIGJpbmRpbmdzOyBzdXBwb3J0ZWQgbmFtZXMgYXJlICJ1c2IyLXBoeSIKKwlvciAidXNiMy1waHkiLgogIC0gc25wcyx1c2IzX2xwbV9jYXBhYmxlOiBkZXRlcm1pbmVzIGlmIHBsYXRmb3JtIGlzIFVTQjMgTFBNIGNhcGFibGUKICAtIHNucHMsZGlzYWJsZV9zY3JhbWJsZV9xdWlyazogdHJ1ZSB3aGVuIFNXIHNob3VsZCBkaXNhYmxlIGRhdGEgc2NyYW1ibGluZy4KIAlPbmx5IHJlYWxseSB1c2VmdWwgZm9yIEZQR0EgYnVpbGRzLgpAQCAtMzksNiArNDAsMTEgQEAKIAkJCWRpc2FibGluZyB0aGUgc3VzcGVuZCBzaWduYWwgdG8gdGhlIFBIWS4KICAtIHNucHMsZGlzX3J4ZGV0X2lucDNfcXVpcms6IHdoZW4gc2V0IGNvcmUgd2lsbCBkaXNhYmxlIHJlY2VpdmVyIGRldGVjdGlvbgogCQkJaW4gUEhZIFAzIHBvd2VyIHN0YXRlLgorIC0gc25wcyxkaXMtdTItZnJlZWNsay1leGlzdHMtcXVpcms6IHdoZW4gc2V0LCBjbGVhciB0aGUgdTJfZnJlZWNsa19leGlzdHMKKwkJCWluIEdVU0IyUEhZQ0ZHLCBzcGVjaWZ5IHRoYXQgVVNCMiBQSFkgZG9lc24ndCBwcm92aWRlCisJCQlhIGZyZWUtcnVubmluZyBQSFkgY2xvY2suCisgLSBzbnBzLGRpcy1kZWwtcGh5LXBvd2VyLWNoZy1xdWlyazogd2hlbiBzZXQgY29yZSB3aWxsIGNoYW5nZSBQSFkgcG93ZXIKKwkJCWZyb20gUDAgdG8gUDEvUDIvUDMgd2l0aG91dCBkZWxheS4KICAtIHNucHMsaXMtdXRtaS1sMS1zdXNwZW5kOiB0cnVlIHdoZW4gRFdDMyBhc3NlcnRzIG91dHB1dCBzaWduYWwKIAkJCXV0bWlfbDFfc3VzcGVuZF9uLCBmYWxzZSB3aGVuIGFzc2VydHMgdXRtaV9zbGVlcF9uCiAgLSBzbnBzLGhpcmQtdGhyZXNob2xkOiBISVJEIHRocmVzaG9sZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9nZW5lcmljLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZ2VuZXJpYy50eHQKaW5kZXggYmJhODI1Ny4uYmZhZGViMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9nZW5lcmljLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2dlbmVyaWMudHh0CkBAIC0xMSw2ICsxMSwxMSBAQAogCQkJInBlcmlwaGVyYWwiIGFuZCAib3RnIi4gSW4gY2FzZSB0aGlzIGF0dHJpYnV0ZSBpc24ndAogCQkJcGFzc2VkIHZpYSBEVCwgVVNCIERSRCBjb250cm9sbGVycyBzaG91bGQgZGVmYXVsdCB0bwogCQkJT1RHLgorIC0gcGh5X3R5cGU6IHRlbGxzIFVTQiBjb250cm9sbGVycyB0aGF0IHdlIHdhbnQgdG8gY29uZmlndXJlIHRoZSBjb3JlIHRvIHN1cHBvcnQKKwkJCWEgVVRNSSsgUEhZIHdpdGggYW4gOC0gb3IgMTYtYml0IGludGVyZmFjZSBpZiBVVE1JKyBpcworCQkJc2VsZWN0ZWQuIFZhbGlkIGFyZ3VtZW50cyBhcmUgInV0bWkiIGFuZCAidXRtaV93aWRlIi4KKwkJCUluIGNhc2UgdGhpcyBpc24ndCBwYXNzZWQgdmlhIERULCBVU0IgY29udHJvbGxlcnMgc2hvdWxkCisJCQlkZWZhdWx0IHRvIEhXIGNhcGFiaWxpdHkuCiAgLSBvdGctcmV2OiB0ZWxscyB1c2IgZHJpdmVyIHRoZSByZWxlYXNlIG51bWJlciBvZiB0aGUgT1RHIGFuZCBFSCBzdXBwbGVtZW50CiAJCQl3aXRoIHdoaWNoIHRoZSBkZXZpY2UgYW5kIGl0cyBkZXNjcmlwdG9ycyBhcmUgY29tcGxpYW50LAogCQkJaW4gYmluYXJ5LWNvZGVkIGRlY2ltYWwgKGkuZS4gMi4wIGlzIDAyMDBIKS4gVGhpcwpAQCAtMzQsNiArMzksNyBAQAogCXVzYi1waHkgPSA8JnVzYjJfcGh5PiwgPCZ1c2IzLHBoeT47CiAJbWF4aW11bS1zcGVlZCA9ICJzdXBlci1zcGVlZCI7CiAJZHJfbW9kZSA9ICJvdGciOworCXBoeV90eXBlID0gInV0bWlfd2lkZSI7CiAJb3RnLXJldiA9IDwweDAyMDA+OwogCWFkcC1kaXNhYmxlOwogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvcmVuZXNhc191c2Jocy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3JlbmVzYXNfdXNiaHMudHh0CmluZGV4IGI2MDQwNTYuLjllMThlMDAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvcmVuZXNhc191c2Jocy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9yZW5lc2FzX3VzYmhzLnR4dApAQCAtOSw2ICs5LDcgQEAKIAktICJyZW5lc2FzLHVzYmhzLXI4YTc3OTMiIGZvciByOGE3NzkzIChSLUNhciBNMi1OKSBjb21wYXRpYmxlIGRldmljZQogCS0gInJlbmVzYXMsdXNiaHMtcjhhNzc5NCIgZm9yIHI4YTc3OTQgKFItQ2FyIEUyKSBjb21wYXRpYmxlIGRldmljZQogCS0gInJlbmVzYXMsdXNiaHMtcjhhNzc5NSIgZm9yIHI4YTc3OTUgKFItQ2FyIEgzKSBjb21wYXRpYmxlIGRldmljZQorCS0gInJlbmVzYXMsdXNiaHMtcjhhNzc5NiIgZm9yIHI4YTc3OTYgKFItQ2FyIE0zLVcpIGNvbXBhdGlibGUgZGV2aWNlCiAJLSAicmVuZXNhcyxyY2FyLWdlbjItdXNiaHMiIGZvciBSLUNhciBHZW4yIGNvbXBhdGlibGUgZGV2aWNlCiAJLSAicmVuZXNhcyxyY2FyLWdlbjMtdXNiaHMiIGZvciBSLUNhciBHZW4zIGNvbXBhdGlibGUgZGV2aWNlCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2Ivcm9ja2NoaXAsZHdjMy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3JvY2tjaGlwLGR3YzMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MzZhOTMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3JvY2tjaGlwLGR3YzMudHh0CkBAIC0wLDAgKzEsNTkgQEAKK1JvY2tjaGlwIFN1cGVyU3BlZWQgRFdDMyBVU0IgU29DIGNvbnRyb2xsZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZToJc2hvdWxkIGNvbnRhaW4gInJvY2tjaGlwLHJrMzM5OS1kd2MzIiBmb3IgcmszMzk5IFNvQworLSBjbG9ja3M6CUEgbGlzdCBvZiBwaGFuZGxlICsgY2xvY2stc3BlY2lmaWVyIHBhaXJzIGZvciB0aGUKKwkJY2xvY2tzIGxpc3RlZCBpbiBjbG9jay1uYW1lcworLSBjbG9jay1uYW1lczoJU2hvdWxkIGNvbnRhaW4gdGhlIGZvbGxvd2luZzoKKyAgInJlZl9jbGsiCUNvbnRyb2xsZXIgcmVmZXJlbmNlIGNsaywgaGF2ZSB0byBiZSAyNCBNSHoKKyAgInN1c3BlbmRfY2xrIglDb250cm9sbGVyIHN1c3BlbmQgY2xrLCBoYXZlIHRvIGJlIDI0IE1IeiBvciAzMiBLSHoKKyAgImJ1c19jbGsiCU1hc3Rlci9Db3JlIGNsb2NrLCBoYXZlIHRvIGJlID49IDYyLjUgTUh6IGZvciBTUworCQlvcGVyYXRpb24gYW5kID49IDMwTUh6IGZvciBIUyBvcGVyYXRpb24KKyAgImdyZl9jbGsiCUNvbnRyb2xsZXIgZ3JmIGNsaworCitSZXF1aXJlZCBjaGlsZCBub2RlOgorQSBjaGlsZCBub2RlIG11c3QgZXhpc3QgdG8gcmVwcmVzZW50IHRoZSBjb3JlIERXQzMgSVAgYmxvY2suIFRoZSBuYW1lIG9mCit0aGUgbm9kZSBpcyBub3QgaW1wb3J0YW50LiBUaGUgY29udGVudCBvZiB0aGUgbm9kZSBpcyBkZWZpbmVkIGluIGR3YzMudHh0LgorCitQaHkgZG9jdW1lbnRhdGlvbiBpcyBwcm92aWRlZCBpbiB0aGUgZm9sbG93aW5nIHBsYWNlczoKK0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcm9ja2NoaXAsZHdjMy11c2ItcGh5LnR4dAorCitFeGFtcGxlIGRldmljZSBub2RlczoKKworCXVzYmRyZDNfMDogdXNiQGZlODAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktZHdjMyI7CisJCWNsb2NrcyA9IDwmY3J1IFNDTEtfVVNCM09URzBfUkVGPiwgPCZjcnUgU0NMS19VU0IzT1RHMF9TVVNQRU5EPiwKKwkJCSA8JmNydSBBQ0xLX1VTQjNPVEcwPiwgPCZjcnUgQUNMS19VU0IzX0dSRj47CisJCWNsb2NrLW5hbWVzID0gInJlZl9jbGsiLCAic3VzcGVuZF9jbGsiLAorCQkJICAgICAgImJ1c19jbGsiLCAiZ3JmX2NsayI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJcmFuZ2VzOworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl1c2JkcmRfZHdjM18wOiBkd2MzQGZlODAwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAic25wcyxkd2MzIjsKKwkJCXJlZyA9IDwweDAgMHhmZTgwMDAwMCAweDAgMHgxMDAwMDA+OworCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDEwNSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCWRyX21vZGUgPSAib3RnIjsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisJfTsKKworCXVzYmRyZDNfMTogdXNiQGZlOTAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktZHdjMyI7CisJCWNsb2NrcyA9IDwmY3J1IFNDTEtfVVNCM09URzFfUkVGPiwgPCZjcnUgU0NMS19VU0IzT1RHMV9TVVNQRU5EPiwKKwkJCSA8JmNydSBBQ0xLX1VTQjNPVEcxPiwgPCZjcnUgQUNMS19VU0IzX0dSRj47CisJCWNsb2NrLW5hbWVzID0gInJlZl9jbGsiLCAic3VzcGVuZF9jbGsiLAorCQkJICAgICAgImJ1c19jbGsiLCAiZ3JmX2NsayI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJcmFuZ2VzOworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl1c2JkcmRfZHdjM18xOiBkd2MzQGZlOTAwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAic25wcyxkd2MzIjsKKwkJCXJlZyA9IDwweDAgMHhmZTkwMDAwMCAweDAgMHgxMDAwMDA+OworCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDExMCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCWRyX21vZGUgPSAib3RnIjsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiNDYwNC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYjQ2MDQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNTA2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYjQ2MDQudHh0CkBAIC0wLDAgKzEsMTkgQEAKK1NNU0MgVVNCNDYwNCBIaWdoLVNwZWVkIEh1YiBDb250cm9sbGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IFNob3VsZCBiZSAic21zYyx1c2I0NjA0IgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSByZWc6IFNwZWNpZmllcyB0aGUgaTJjIHNsYXZlIGFkZHJlc3MsIGl0IGlzIHJlcXVpcmVkIGFuZCBzaG91bGQgYmUgMHgyZAorICAgICAgIGlmIEkyQyBpcyB1c2VkLgorLSByZXNldC1ncGlvczogU2hvdWxkIHNwZWNpZnkgR1BJTyBmb3IgcmVzZXQuCistIGluaXRpYWwtbW9kZTogU2hvdWxkIHNwZWNpZnkgaW5pdGlhbCBtb2RlLgorICAgICAgICAgICAgICAgICgxIGZvciBIVUIgbW9kZSwgMiBmb3IgU1RBTkRCWSBtb2RlKQorCitFeGFtcGxlczoKKwl1c2ItaHViQDJkIHsKKwkJY29tcGF0aWJsZSA9ICJzbXNjLHVzYjQ2MDQiOworCQlyZWcgPSA8MHgyZD47CisJCXJlc2V0LWdwaW9zID0gPCZncHgzIDUgMT47CisJCWluaXRpYWwtbW9kZSA9IDwxPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2JtaXNjLWlteC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYm1pc2MtaW14LnR4dAppbmRleCAzNTM5ZDRlLi5mMWUyN2ZhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYm1pc2MtaW14LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYm1pc2MtaW14LnR4dApAQCAtNiw2ICs2LDcgQEAKIAkiZnNsLGlteDZxLXVzYm1pc2MiIGZvciBpbXg2cQogCSJmc2wsdmY2MTAtdXNibWlzYyIgZm9yIFZ5YnJpZCB2ZjYxMAogCSJmc2wsaW14NnN4LXVzYm1pc2MiIGZvciBpbXg2c3gKKwkiZnNsLGlteDdkLXVzYm1pc2MiIGZvciBpbXg3ZAogLSByZWc6IFNob3VsZCBjb250YWluIHJlZ2lzdGVycyBsb2NhdGlvbiBhbmQgbGVuZ3RoCiAKIEV4YW1wbGVzOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3ZlbmRvci1wcmVmaXhlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdmVuZG9yLXByZWZpeGVzLnR4dAppbmRleCAxOTkyYWE5Li43N2U5ODVmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdmVuZG9yLXByZWZpeGVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdmVuZG9yLXByZWZpeGVzLnR4dApAQCAtMyw4ICszLDggQEAKIFRoaXMgaXNuJ3QgYW4gZXhoYXVzdGl2ZSBsaXN0LCBidXQgeW91IHNob3VsZCBhZGQgbmV3IHByZWZpeGVzIHRvIGl0IGJlZm9yZQogdXNpbmcgdGhlbSB0byBhdm9pZCBuYW1lLXNwYWNlIGNvbGxpc2lvbnMuCiAKLWFiaWxpcwlBYmlsaXMgU3lzdGVtcwogYWJjbglBYnJhY29uIENvcnBvcmF0aW9uCithYmlsaXMJQWJpbGlzIFN5c3RlbXMKIGFjdGl2ZS1zZW1pCUFjdGl2ZS1TZW1pIEludGVybmF0aW9uYWwgSW5jCiBhZAlBdmlvbmljIERlc2lnbiBHbWJICiBhZGFwdGV2YQlBZGFwdGV2YSwgSW5jLgpAQCAtMzYsNiArMzYsNyBAQAogYXRsYXMJQXRsYXMgU2NpZW50aWZpYyBMTEMKIGF0bWVsCUF0bWVsIENvcnBvcmF0aW9uCiBhdW8JQVUgT3B0cm9uaWNzIENvcnBvcmF0aW9uCithdXZpZGVhIEF1dmlkZWEgR21iSAogYXZhZ28JQXZhZ28gVGVjaG5vbG9naWVzCiBhdmljCVNoYW5naGFpIEFWSUMgT3B0b2VsZWN0cm9uaWNzIENvLiwgTHRkLgogYXhpcwlBeGlzIENvbW11bmljYXRpb25zIEFCCkBAIC03NSw2ICs3Niw3IEBACiBkbGcJRGlhbG9nIFNlbWljb25kdWN0b3IKIGRsaW5rCUQtTGluayBDb3Jwb3JhdGlvbgogZG1vCURhdGEgTW9kdWwgQUcKK2RvbWludGVjaAlEb21pbnRlY2ggQ28uLCBMdGQuCiBkcHRlY2huaWNzCURQVGVjaG5pY3MKIGRyYWdpbm8JRHJhZ2lubyBUZWNobm9sb2d5IENvLiwgTGltaXRlZAogZWEJRW1iZWRkZWQgQXJ0aXN0cyBBQgpAQCAtODUsNiArODcsNyBAQAogZW1iZXN0CVNoZW56aGVuIEVtYmVzdCBUZWNobm9sb2d5IENvLiwgTHRkLgogZW1taWNybwlFTSBNaWNyb2VsZWN0cm9uaWMKIGVuZXJneW1pY3JvCVNpbGljb24gTGFib3JhdG9yaWVzIChmb3JtZXJseSBFbmVyZ3kgTWljcm8gQVMpCitlbmdpY2FtCUVuZ2ljYW0gUy5yLmwuCiBlcGNvcwlFUENPUyBBRwogZXBmbAlFY29sZSBQb2x5dGVjaG5pcXVlIEbDqWTDqXJhbGUgZGUgTGF1c2FubmUKIGVwc29uCVNlaWtvIEVwc29uIENvcnAuCkBAIC0xMDEsOCArMTA0LDggQEAKIGZzbAlGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvcgogZ2UJR2VuZXJhbCBFbGVjdHJpYyBDb21wYW55CiBnZWVrYnV5aW5nCUdlZWtCdXlpbmcKLUdFRmFudWMJR0UgRmFudWMgSW50ZWxsaWdlbnQgUGxhdGZvcm1zIEVtYmVkZGVkIFN5c3RlbXMsIEluYy4KIGdlZglHRSBGYW51YyBJbnRlbGxpZ2VudCBQbGF0Zm9ybXMgRW1iZWRkZWQgU3lzdGVtcywgSW5jLgorR0VGYW51YwlHRSBGYW51YyBJbnRlbGxpZ2VudCBQbGF0Zm9ybXMgRW1iZWRkZWQgU3lzdGVtcywgSW5jLgogZ2VuaWF0ZWNoCUdlbmlhdGVjaCwgSW5jLgogZ2lhbnRwbHVzCUdpYW50cGx1cyBUZWNobm9sb2d5IENvLiwgTHRkLgogZ2xvYmFsc2NhbGUJR2xvYmFsc2NhbGUgVGVjaG5vbG9naWVzLCBJbmMuCkBAIC0xMjYsNyArMTI5LDYgQEAKIGlibQlJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIChJQk0pCiBpZHQJSW50ZWdyYXRlZCBEZXZpY2UgVGVjaG5vbG9naWVzLCBJbmMuCiBpZmkJSW5nZW5pZXVyYnVybyBGdXIgSWMtVGVjaG5vbG9naWUgKEkvRi9JKQotaW9tCUlvbWVnYSBDb3Jwb3JhdGlvbgogaW1nCUltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCiBpbmZpbmVvbiBJbmZpbmVvbiBUZWNobm9sb2dpZXMKIGluZm9yY2UJSW5mb3JjZSBDb21wdXRpbmcKQEAgLTEzNSwxMSArMTM3LDE0IEBACiBpbnRlbAlJbnRlbCBDb3Jwb3JhdGlvbgogaW50ZXJjb250cm9sCUludGVyIENvbnRyb2wgR3JvdXAKIGludmVuc2Vuc2UJSW52ZW5TZW5zZSBJbmMuCitpb20JSW9tZWdhIENvcnBvcmF0aW9uCiBpc2VlCUlTRUUgMjAwNyBTLkwuCiBpc2lsCUludGVyc2lsCiBpc3NpCUludGVncmF0ZWQgU2lsaWNvbiBTb2x1dGlvbnMgSW5jLgoramRpCUphcGFuIERpc3BsYXkgSW5jLgogamVkZWMJSkVERUMgU29saWQgU3RhdGUgVGVjaG5vbG9neSBBc3NvY2lhdGlvbgoga2FybwlLYS1SbyBlbGVjdHJvbmljcyBHbWJICitrZWl0aGtvZXAJS2VpdGggJiBLb2VwIEdtYkgKIGtleW1pbGUJS2V5bWlsZSBHbWJICiBraW5ldGljIEtpbmV0aWMgVGVjaG5vbG9naWVzCiBrb3NhZ2kJU3V0YWppbyBLby1Vc2FnaSBQVEUgTHRkLgpAQCAtMTQ5LDggKzE1NCw4IEBACiBsZW5vdm8JTGVub3ZvIEdyb3VwIEx0ZC4KIGxnCUxHIENvcnBvcmF0aW9uCiBsaW51eAlMaW51eC1zcGVjaWZpYyBiaW5kaW5nCi1sc2kJTFNJIENvcnAuIChMU0kgTG9naWMpCiBsbHRjCUxpbmVhciBUZWNobm9sb2d5IENvcnBvcmF0aW9uCitsc2kJTFNJIENvcnAuIChMU0kgTG9naWMpCiBtYXJ2ZWxsCU1hcnZlbGwgVGVjaG5vbG9neSBHcm91cCBMdGQuCiBtYXhpbQlNYXhpbSBJbnRlZ3JhdGVkIFByb2R1Y3RzCiBtZWFzCU1lYXN1cmVtZW50IFNwZWNpYWx0aWVzCkBAIC0xOTAsMjAgKzE5NSwyMCBAQAogb250YXQJT24gVGF0IEluZHVzdHJpYWwgQ29tcGFueQogb3BlbmNvcmVzCU9wZW5Db3Jlcy5vcmcKIG9wdGlvbglPcHRpb24gTlYKK09SQ0wJT3JhY2xlIENvcnBvcmF0aW9uCiBvcnR1c3RlY2gJT3J0dXMgVGVjaG5vbG9neSBDby4sIEx0ZC4KIG92dGkJT21uaVZpc2lvbiBUZWNobm9sb2dpZXMKLU9SQ0wJT3JhY2xlIENvcnBvcmF0aW9uCiBveHNlbWkJT3hmb3JkIFNlbWljb25kdWN0b3IsIEx0ZC4KIHBhbmFzb25pYwlQYW5hc29uaWMgQ29ycG9yYXRpb24KIHBhcmFkZQlQYXJhZGUgVGVjaG5vbG9naWVzIEluYy4KIHBlcmljb20JUGVyaWNvbSBUZWNobm9sb2d5IEluYy4KIHBoeXRlYwlQSFlURUMgTWVzc3RlY2huaWsgR21iSAogcGljb2NoaXAJUGljb2NoaXAgTHRkCitwaXhjaXIgIFBJWENJUiBNSUNST0VMRUNUUk9OSUNTIENvLiwgTHRkCiBwbGF0aG9tZQlQbGF0J0hvbWUgQ28uLCBMdGQuCiBwbGRhCVBMREEKLXBpeGNpciAgUElYQ0lSIE1JQ1JPRUxFQ1RST05JQ1MgQ28uLCBMdGQKLXB1bHNlZGxpZ2h0CVB1bHNlZExpZ2h0LCBJbmMKIHBvd2VydnIJUG93ZXJWUiAoZGVwcmVjYXRlZCwgdXNlIGltZykKK3B1bHNlZGxpZ2h0CVB1bHNlZExpZ2h0LCBJbmMKIHFjYQlRdWFsY29tbSBBdGhlcm9zLCBJbmMuCiBxY29tCVF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jCiBxZW11CVFFTVUsIGEgZ2VuZXJpYyBhbmQgb3BlbiBzb3VyY2UgbWFjaGluZSBlbXVsYXRvciBhbmQgdmlydHVhbGl6ZXIKQEAgLTIzMSwxMiArMjM2LDEzIEBACiBzaGFycAlTaGFycCBDb3Jwb3JhdGlvbgogc2ktZW4JU2ktRW4gVGVjaG5vbG9neSBMdGQuCiBzaWdtYQlTaWdtYSBEZXNpZ25zLCBJbmMuCitzaWkJU2Vpa28gSW5zdHJ1bWVudHMsIEluYy4KIHNpbAlTaWxpY29uIEltYWdlCiBzaWxhYnMJU2lsaWNvbiBMYWJvcmF0b3JpZXMKK3NpbGVhZAlTaWxlYWQgSW5jLgorc2lsZXJneQlTaWxlcmd5IENvcnAuCiBzaWxpY29ubWl0dXMJU2lsaWNvbiBNaXR1cywgSW5jLgogc2ltdGVrCi1zaWkJU2Vpa28gSW5zdHJ1bWVudHMsIEluYy4KLXNpbGVyZ3kJU2lsZXJneSBDb3JwLgogc2lyZglTaVJGIFRlY2hub2xvZ3ksIEluYy4KIHNpcwlTaWxpY29uIEludGVncmF0ZWQgU3lzdGVtcyBDb3JwLgogc2l0cm9uaXgJU2l0cm9uaXggVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgpAQCAtMjU0LDkgKzI2MCwxMiBAQAogc3RhcnRlawlTdGFydGVrCiBzdGUJU1QtRXJpY3Nzb24KIHN0ZXJpY3Nzb24JU1QtRXJpY3Nzb24KK3N1bW1pdAlTdW1taXQgbWljcm9lbGVjdHJvbmljcworc3VuY2hpcAlTaGVuemhlbiBTdW5jaGlwIFRlY2hub2xvZ3kgQ28uLCBMdGQKK1NVTlcJU3VuIE1pY3Jvc3lzdGVtcywgSW5jCitzd2lyCVNpZXJyYSBXaXJlbGVzcwogc3luYQlTeW5hcHRpY3MgSW5jLgogc3lub2xvZ3kJU3lub2xvZ3ksIEluYy4KLVNVTlcJU3VuIE1pY3Jvc3lzdGVtcywgSW5jCiB0YnMJVEJTIFRlY2hub2xvZ2llcwogdGNnCVRydXN0ZWQgQ29tcHV0aW5nIEdyb3VwCiB0Y2wJVG9ieSBDaHVyY2hpbGwgTHRkLgpAQCAtMjY1LDE3ICsyNzQsMTggQEAKIHRoaW5lCVRIaW5lIEVsZWN0cm9uaWNzLCBJbmMuCiB0aQlUZXhhcyBJbnN0cnVtZW50cwogdGxtCVRydXN0ZWQgTG9naWMgTW9iaWxpdHkKK3RvcGVldCAgVG9wZWV0CiB0b3JhZGV4CVRvcmFkZXggQUcKIHRvc2hpYmEJVG9zaGliYSBDb3Jwb3JhdGlvbgogdG91bWF6CVRvdW1hegotdHBsaW5rCVRQLUxJTksgVGVjaG5vbG9naWVzIENvLiwgTHRkLgogdHBrCVRQSyBVLlMuQS4gTExDCit0cGxpbmsJVFAtTElOSyBUZWNobm9sb2dpZXMgQ28uLCBMdGQuCiB0cm9uZnkJVHJvbmZ5CiB0cm9uc21hcnQJVHJvbnNtYXJ0CiB0cnVseQlUcnVseSBTZW1pY29uZHVjdG9ycyBMaW1pdGVkCiB0eWFuCVR5YW4gQ29tcHV0ZXIgQ29ycG9yYXRpb24KLXVwaXNlbWkJdVBJIFNlbWljb25kdWN0b3IgQ29ycC4KIHVuaXdlc3QJVW5pdGVkIFdlc3Rlcm4gVGVjaG5vbG9naWVzIENvcnAgKFVuaVdlc3QpCit1cGlzZW1pCXVQSSBTZW1pY29uZHVjdG9yIENvcnAuCiB1cnQJVW5pdGVkIFJhZGlhbnQgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgogdXNpCVVuaXZlcnNhbCBTY2llbnRpZmljIEluZHVzdHJpYWwgQ28uLCBMdGQuCiB2MwlWMyBTZW1pY29uZHVjdG9yCkBAIC0yOTMsNyArMzAzLDcgQEAKIHhlcwlFeHRyZW1lIEVuZ2luZWVyaW5nIFNvbHV0aW9ucyAoWC1FUykKIHhpbGx5YnVzCVhpbGx5YnVzIEx0ZC4KIHhsbngJWGlsaW54Ci16eXhlbAlaeVhFTCBDb21tdW5pY2F0aW9ucyBDb3JwLgogemFybGluawlaYXJsaW5rIFNlbWljb25kdWN0b3IKIHppaQlab2RpYWMgSW5mbGlnaHQgSW5ub3ZhdGlvbnMKIHp0ZQlaVEUgQ29ycC4KK3p5eGVsCVp5WEVMIENvbW11bmljYXRpb25zIENvcnAuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvY2hhbmdlc2V0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvY2hhbmdlc2V0cy50eHQKaW5kZXggOTM1YmE1YS4uY2I0ODhlZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2NoYW5nZXNldHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9jaGFuZ2VzZXRzLnR4dApAQCAtMjEsMjAgKzIxLDExIEBACiBBbGwgdGhlIGNoYW5nZSBvcGVyYXRpb25zIGFyZSByZWNvcmRlZCBpbiB0aGUgb2ZfY2hhbmdlc2V0ICdlbnRyaWVzJwogbGlzdC4KIAotMy4gbXV0ZXhfbG9jayhvZl9tdXRleCkgLSBzdGFydHMgYSBjaGFuZ2VzZXQ7IFRoZSBnbG9iYWwgb2ZfbXV0ZXgKLWVuc3VyZXMgdGhlcmUgY2FuIG9ubHkgYmUgb25lIGVkaXRvciBhdCBhIHRpbWUuCi0KLTQuIG9mX2NoYW5nZXNldF9hcHBseSgpIC0gQXBwbHkgdGhlIGNoYW5nZXMgdG8gdGhlIHRyZWUuIEVpdGhlciB0aGUKKzMuIG9mX2NoYW5nZXNldF9hcHBseSgpIC0gQXBwbHkgdGhlIGNoYW5nZXMgdG8gdGhlIHRyZWUuIEVpdGhlciB0aGUKIGVudGlyZSBjaGFuZ2VzZXQgd2lsbCBnZXQgYXBwbGllZCwgb3IgaWYgdGhlcmUgaXMgYW4gZXJyb3IgdGhlIHRyZWUgd2lsbAotYmUgcmVzdG9yZWQgdG8gdGhlIHByZXZpb3VzIHN0YXRlCi0KLTUuIG11dGV4X3VubG9jayhvZl9tdXRleCkgLSBBbGwgb3BlcmF0aW9ucyBjb21wbGV0ZSwgcmVsZWFzZSB0aGUgbXV0ZXgKK2JlIHJlc3RvcmVkIHRvIHRoZSBwcmV2aW91cyBzdGF0ZS4gVGhlIGNvcmUgZW5zdXJlcyBwcm9wZXIgc2VyaWFsaXphdGlvbgordGhyb3VnaCBsb2NraW5nLiBBbiB1bmxvY2tlZCB2ZXJzaW9uIF9fb2ZfY2hhbmdlc2V0X2FwcGx5IGlzIGF2YWlsYWJsZSwKK2lmIG5lZWRlZC4KIAogSWYgYSBzdWNjZXNzZnVsbHkgYXBwbGllZCBjaGFuZ2VzZXQgbmVlZHMgdG8gYmUgcmVtb3ZlZCwgaXQgY2FuIGJlIGRvbmUKLXdpdGggdGhlIGZvbGxvd2luZyBzZXF1ZW5jZS4KLQotMS4gbXV0ZXhfbG9jayhvZl9tdXRleCkKLQotMi4gb2ZfY2hhbmdlc2V0X3JldmVydCgpCi0KLTMuIG11dGV4X3VubG9jayhvZl9tdXRleCkKK3dpdGggb2ZfY2hhbmdlc2V0X3JldmVydCgpLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kb2N1dGlscy5jb25mIGIvRG9jdW1lbnRhdGlvbi9kb2N1dGlscy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MzA3NzIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RvY3V0aWxzLmNvbmYKQEAgLTAsMCArMSw3IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IG1vZGU6IGNvbmYtY29sb24gLSotCisjCisjIGRvY3V0aWxzIGNvbmZpZ3VyYXRpb24gZmlsZQorIyBodHRwOi8vZG9jdXRpbHMuc291cmNlZm9yZ2UubmV0L2RvY3MvdXNlci9jb25maWcuaHRtbAorCitbZ2VuZXJhbF0KK2hhbHRfbGV2ZWw6IHNldmVyZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9iYXNpY3MucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2Jhc2ljcy5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1YjliOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9iYXNpY3MucnN0CkBAIC0wLDAgKzEsMTIwIEBACitEcml2ZXIgQmFzaWNzCis9PT09PT09PT09PT09CisKK0RyaXZlciBFbnRyeSBhbmQgRXhpdCBwb2ludHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvaW5pdC5oCisgICA6aW50ZXJuYWw6CisKK0F0b21pYyBhbmQgcG9pbnRlciBtYW5pcHVsYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGFyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pYy5oCisgICA6aW50ZXJuYWw6CisKK0RlbGF5aW5nLCBzY2hlZHVsaW5nLCBhbmQgdGltZXIgcm91dGluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvc2NoZWQuaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjoga2VybmVsL3NjaGVkL2NvcmUuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGtlcm5lbC9zY2hlZC9jcHVwcmkuYworICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjoga2VybmVsL3NjaGVkL2ZhaXIuYworICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9jb21wbGV0aW9uLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGtlcm5lbC90aW1lL3RpbWVyLmMKKyAgIDpleHBvcnQ6CisKK1dhaXQgcXVldWVzIGFuZCBXYWtlIGV2ZW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L3dhaXQuaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjoga2VybmVsL3NjaGVkL3dhaXQuYworICAgOmV4cG9ydDoKKworSGlnaC1yZXNvbHV0aW9uIHRpbWVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9rdGltZS5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L2hydGltZXIuaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjoga2VybmVsL3RpbWUvaHJ0aW1lci5jCisgICA6ZXhwb3J0OgorCitXb3JrcXVldWVzIGFuZCBLZXZlbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwvd29ya3F1ZXVlLmMKKyAgIDpleHBvcnQ6CisKK0ludGVybmFsIEZ1bmN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwvZXhpdC5jCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwvc2lnbmFsLmMKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgva3RocmVhZC5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwva3RocmVhZC5jCisgICA6ZXhwb3J0OgorCitLZXJuZWwgb2JqZWN0cyBtYW5pcHVsYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogbGliL2tvYmplY3QuYworICAgOmV4cG9ydDoKKworS2VybmVsIHV0aWxpdHkgZnVuY3Rpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgva2VybmVsLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGtlcm5lbC9wcmludGsvcHJpbnRrLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwvcGFuaWMuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGtlcm5lbC9zeXMuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGtlcm5lbC9yY3Uvc3JjdS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjoga2VybmVsL3JjdS90cmVlLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwvcmN1L3RyZWVfcGx1Z2luLmgKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwvcmN1L3VwZGF0ZS5jCisgICA6ZXhwb3J0OgorCitEZXZpY2UgUmVzb3VyY2UgTWFuYWdlbWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYmFzZS9kZXZyZXMuYworICAgOmV4cG9ydDoKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2ZyYW1lLWJ1ZmZlci5yc3QgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvZnJhbWUtYnVmZmVyLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQzMDYwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2ZyYW1lLWJ1ZmZlci5yc3QKQEAgLTAsMCArMSw2MiBAQAorRnJhbWUgQnVmZmVyIExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09CisKK1RoZSBmcmFtZSBidWZmZXIgZHJpdmVycyBkZXBlbmQgaGVhdmlseSBvbiBmb3VyIGRhdGEgc3RydWN0dXJlcy4gVGhlc2UKK3N0cnVjdHVyZXMgYXJlIGRlY2xhcmVkIGluIGluY2x1ZGUvbGludXgvZmIuaC4gVGhleSBhcmUgZmJfaW5mbywKK2ZiX3Zhcl9zY3JlZW5pbmZvLCBmYl9maXhfc2NyZWVuaW5mbyBhbmQgZmJfbW9ub3NwZWNzLiBUaGUgbGFzdAordGhyZWUgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIGFuZCBmcm9tIHVzZXJsYW5kLgorCitmYl9pbmZvIGRlZmluZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBwYXJ0aWN1bGFyIHZpZGVvIGNhcmQuIEluc2lkZQorZmJfaW5mbywgdGhlcmUgZXhpc3RzIGEgZmJfb3BzIHN0cnVjdHVyZSB3aGljaCBpcyBhIGNvbGxlY3Rpb24gb2YKK25lZWRlZCBmdW5jdGlvbnMgdG8gbWFrZSBmYmRldiBhbmQgZmJjb24gd29yay4gZmJfaW5mbyBpcyBvbmx5IHZpc2libGUKK3RvIHRoZSBrZXJuZWwuCisKK2ZiX3Zhcl9zY3JlZW5pbmZvIGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGZlYXR1cmVzIG9mIGEgdmlkZW8gY2FyZAordGhhdCBhcmUgdXNlciBkZWZpbmVkLiBXaXRoIGZiX3Zhcl9zY3JlZW5pbmZvLCB0aGluZ3Mgc3VjaCBhcyBkZXB0aAorYW5kIHRoZSByZXNvbHV0aW9uIG1heSBiZSBkZWZpbmVkLgorCitUaGUgbmV4dCBzdHJ1Y3R1cmUgaXMgZmJfZml4X3NjcmVlbmluZm8uIFRoaXMgZGVmaW5lcyB0aGUgcHJvcGVydGllcworb2YgYSBjYXJkIHRoYXQgYXJlIGNyZWF0ZWQgd2hlbiBhIG1vZGUgaXMgc2V0IGFuZCBjYW4ndCBiZSBjaGFuZ2VkCitvdGhlcndpc2UuIEEgZ29vZCBleGFtcGxlIG9mIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZSBidWZmZXIKK21lbW9yeS4gVGhpcyAibG9ja3MiIHRoZSBhZGRyZXNzIG9mIHRoZSBmcmFtZSBidWZmZXIgbWVtb3J5LCBzbyB0aGF0IGl0CitjYW5ub3QgYmUgY2hhbmdlZCBvciBtb3ZlZC4KKworVGhlIGxhc3Qgc3RydWN0dXJlIGlzIGZiX21vbm9zcGVjcy4gSW4gdGhlIG9sZCBBUEksIHRoZXJlIHdhcyBsaXR0bGUKK2ltcG9ydGFuY2UgZm9yIGZiX21vbm9zcGVjcy4gVGhpcyBhbGxvd2VkIGZvciBmb3JiaWRkZW4gdGhpbmdzIHN1Y2ggYXMKK3NldHRpbmcgYSBtb2RlIG9mIDgwMHg2MDAgb24gYSBmaXggZnJlcXVlbmN5IG1vbml0b3IuIFdpdGggdGhlIG5ldyBBUEksCitmYl9tb25vc3BlY3MgcHJldmVudHMgc3VjaCB0aGluZ3MsIGFuZCBpZiB1c2VkIGNvcnJlY3RseSwgY2FuIHByZXZlbnQgYQorbW9uaXRvciBmcm9tIGJlaW5nIGNvb2tlZC4gZmJfbW9ub3NwZWNzIHdpbGwgbm90IGJlIHVzZWZ1bCB1bnRpbAora2VybmVscyAyLjUueC4KKworRnJhbWUgQnVmZmVyIE1lbW9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy92aWRlby9mYmRldi9jb3JlL2ZibWVtLmMKKyAgIDpleHBvcnQ6CisKK0ZyYW1lIEJ1ZmZlciBDb2xvcm1hcAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvZmJjbWFwLmMKKyAgIDpleHBvcnQ6CisKK0ZyYW1lIEJ1ZmZlciBWaWRlbyBNb2RlIERhdGFiYXNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy92aWRlby9mYmRldi9jb3JlL21vZGVkYi5jCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvbW9kZWRiLmMKKyAgIDpleHBvcnQ6CisKK0ZyYW1lIEJ1ZmZlciBNYWNpbnRvc2ggVmlkZW8gTW9kZSBEYXRhYmFzZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3ZpZGVvL2ZiZGV2L21hY21vZGVzLmMKKyAgIDpleHBvcnQ6CisKK0ZyYW1lIEJ1ZmZlciBGb250cworLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlZmVyIHRvIHRoZSBmaWxlIGxpYi9mb250cy9mb250cy5jIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvaHNpLnJzdCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9oc2kucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2VjMDIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvaHNpLnJzdApAQCAtMCwwICsxLDg4IEBACitIaWdoIFNwZWVkIFN5bmNocm9ub3VzIFNlcmlhbCBJbnRlcmZhY2UgKEhTSSkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbnRyb2R1Y3Rpb24KKy0tLS0tLS0tLS0tLS0tLQorCitIaWdoIFNwZWVkIFN5bmNyb25vdXMgSW50ZXJmYWNlIChIU0kpIGlzIGEgZnVsbGR1cGxleCwgbG93IGxhdGVuY3kgcHJvdG9jb2wsCit0aGF0IGlzIG9wdGltaXplZCBmb3IgZGllLWxldmVsIGludGVyY29ubmVjdCBiZXR3ZWVuIGFuIEFwcGxpY2F0aW9uIFByb2Nlc3NvcgorYW5kIGEgQmFzZWJhbmQgY2hpcHNldC4gSXQgaGFzIGJlZW4gc3BlY2lmaWVkIGJ5IHRoZSBNSVBJIGFsbGlhbmNlIGluIDIwMDMgYW5kCitpbXBsZW1lbnRlZCBieSBtdWx0aXBsZSB2ZW5kb3JzIHNpbmNlIHRoZW4uCisKK1RoZSBIU0kgaW50ZXJmYWNlIHN1cHBvcnRzIGZ1bGwgZHVwbGV4IGNvbW11bmljYXRpb24gb3ZlciBtdWx0aXBsZSBjaGFubmVscworKHR5cGljYWxseSA4KSBhbmQgaXMgY2FwYWJsZSBvZiByZWFjaGluZyBzcGVlZHMgdXAgdG8gMjAwIE1iaXQvcy4KKworVGhlIHNlcmlhbCBwcm90b2NvbCB1c2VzIHR3byBzaWduYWxzLCBEQVRBIGFuZCBGTEFHIGFzIGNvbWJpbmVkIGRhdGEgYW5kIGNsb2NrCitzaWduYWxzIGFuZCBhbiBhZGRpdGlvbmFsIFJFQURZIHNpZ25hbCBmb3IgZmxvdyBjb250cm9sLiBBbiBhZGRpdGlvbmFsIFdBS0UKK3NpZ25hbCBjYW4gYmUgdXNlZCB0byB3YWtldXAgdGhlIGNoaXBzIGZyb20gc3RhbmRieSBtb2Rlcy4gVGhlIHNpZ25hbHMgYXJlCitjb21tb25seSBwcmVmaXhlZCBieSBBQyBmb3Igc2lnbmFscyBnb2luZyBmcm9tIHRoZSBhcHBsaWNhdGlvbiBkaWUgdG8gdGhlCitjZWxsdWxhciBkaWUgYW5kIENBIGZvciBzaWduYWxzIGdvaW5nIHRoZSBvdGhlciB3YXkgYXJvdW5kLgorCis6OgorCisgICAgKy0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tKworICAgIHwgIENlbGx1bGFyICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgQXBwbGljYXRpb24gIHwKKyAgICB8ICAgIERpZSAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICBEaWUgICAgICB8CisgICAgfCAgICAgICAgICAgIHwgLSAtIC0gLSAtIC0gQ0FXQUtFIC0gLSAtIC0gLSAtID58ICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgIFR8LS0tLS0tLS0tLS0tIENBREFUQSAtLS0tLS0tLS0tLS0+fFIgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICBYfC0tLS0tLS0tLS0tLSBDQUZMQUcgLS0tLS0tLS0tLS0tPnxYICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgIHw8LS0tLS0tLS0tLS0gQUNSRUFEWSAtLS0tLS0tLS0tLS18ICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgIHw8IC0gLSAtIC0gLSAgQUNXQUtFIC0gLSAtIC0gLSAtIC18ICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgIFJ8PC0tLS0tLS0tLS0tIEFDREFUQSAtLS0tLS0tLS0tLS0tfFQgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICBYfDwtLS0tLS0tLS0tLSBBQ0ZMQUcgLS0tLS0tLS0tLS0tLXxYICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0gQ0FSRUFEWSAtLS0tLS0tLS0tLT58ICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tKworCitIU0kgU3Vic3lzdGVtIGluIExpbnV4CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luIHRoZSBMaW51eCBrZXJuZWwgdGhlIGhzaSBzdWJzeXN0ZW0gaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBmb3IgSFNJIGRldmljZXMuCitUaGUgaHNpIHN1YnN5c3RlbSBjb250YWlucyBkcml2ZXJzIGZvciBoc2kgY29udHJvbGxlcnMgaW5jbHVkaW5nIHN1cHBvcnQgZm9yCittdWx0aS1wb3J0IGNvbnRyb2xsZXJzIGFuZCBwcm92aWRlcyBhIGdlbmVyaWMgQVBJIGZvciB1c2luZyB0aGUgSFNJIHBvcnRzLgorCitJdCBhbHNvIGNvbnRhaW5zIEhTSSBjbGllbnQgZHJpdmVycywgd2hpY2ggbWFrZSB1c2Ugb2YgdGhlIGdlbmVyaWMgQVBJIHRvCitpbXBsZW1lbnQgYSBwcm90b2NvbCB1c2VkIG9uIHRoZSBIU0kgaW50ZXJmYWNlLiBUaGVzZSBjbGllbnQgZHJpdmVycyBjYW4KK3VzZSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGNoYW5uZWxzLgorCitoc2ktY2hhciBEZXZpY2UKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitFYWNoIHBvcnQgYXV0b21hdGljYWxseSByZWdpc3RlcnMgYSBnZW5lcmljIGNsaWVudCBkcml2ZXIgY2FsbGVkIGhzaV9jaGFyLAord2hpY2ggcHJvdmlkZXMgYSBjaGFyZWN0ZXIgZGV2aWNlIGZvciB1c2Vyc3BhY2UgcmVwcmVzZW50aW5nIHRoZSBIU0kgcG9ydC4KK0l0IGNhbiBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHZpYSBIU0kgZnJvbSB1c2Vyc3BhY2UuIFVzZXJzcGFjZSBtYXkKK2NvbmZpZ3VyZSB0aGUgaHNpX2NoYXIgZGV2aWNlIHVzaW5nIHRoZSBmb2xsb3dpbmcgaW9jdGwgY29tbWFuZHM6CisKK0hTQ19SRVNFVAorIGZsdXNoIHRoZSBIU0kgcG9ydAorCitIU0NfU0VUX1BNCisgZW5hYmxlIG9yIGRpc2FibGUgdGhlIGNsaWVudC4KKworSFNDX1NFTkRfQlJFQUsKKyBzZW5kIGJyZWFrCisKK0hTQ19TRVRfUlgKKyBzZXQgUlggY29uZmlndXJhdGlvbgorCitIU0NfR0VUX1JYCisgZ2V0IFJYIGNvbmZpZ3VyYXRpb24KKworSFNDX1NFVF9UWAorIHNldCBUWCBjb25maWd1cmF0aW9uCisKK0hTQ19HRVRfVFgKKyBnZXQgVFggY29uZmlndXJhdGlvbgorCitUaGUga2VybmVsIEhTSSBBUEkKKy0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9oc2kvaHNpLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvaHNpL2hzaV9jb3JlLmMKKyAgIDpleHBvcnQ6CisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9pMmMucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2kyYy5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5MzlmNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9pMmMucnN0CkBAIC0wLDAgKzEsNDYgQEAKK0lcIDpzdXA6YDJgXCBDIGFuZCBTTUJ1cyBTdWJzeXN0ZW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSVwgOnN1cDpgMmBcIEMgKG9yIHdpdGhvdXQgZmFuY3kgdHlwb2dyYXBoeSwgIkkyQyIpIGlzIGFuIGFjcm9ueW0gZm9yCit0aGUgIkludGVyLUlDIiBidXMsIGEgc2ltcGxlIGJ1cyBwcm90b2NvbCB3aGljaCBpcyB3aWRlbHkgdXNlZCB3aGVyZSBsb3cKK2RhdGEgcmF0ZSBjb21tdW5pY2F0aW9ucyBzdWZmaWNlLiBTaW5jZSBpdCdzIGFsc28gYSBsaWNlbnNlZCB0cmFkZW1hcmssCitzb21lIHZlbmRvcnMgdXNlIGFub3RoZXIgbmFtZSAoc3VjaCBhcyAiVHdvLVdpcmUgSW50ZXJmYWNlIiwgVFdJKSBmb3IKK3RoZSBzYW1lIGJ1cy4gSTJDIG9ubHkgbmVlZHMgdHdvIHNpZ25hbHMgKFNDTCBmb3IgY2xvY2ssIFNEQSBmb3IgZGF0YSksCitjb25zZXJ2aW5nIGJvYXJkIHJlYWwgZXN0YXRlIGFuZCBtaW5pbWl6aW5nIHNpZ25hbCBxdWFsaXR5IGlzc3Vlcy4gTW9zdAorSTJDIGRldmljZXMgdXNlIHNldmVuIGJpdCBhZGRyZXNzZXMsIGFuZCBidXMgc3BlZWRzIG9mIHVwIHRvIDQwMCBrSHo7Cit0aGVyZSdzIGEgaGlnaCBzcGVlZCBleHRlbnNpb24gKDMuNCBNSHopIHRoYXQncyBub3QgeWV0IGZvdW5kIHdpZGUgdXNlLgorSTJDIGlzIGEgbXVsdGktbWFzdGVyIGJ1czsgb3BlbiBkcmFpbiBzaWduYWxpbmcgaXMgdXNlZCB0byBhcmJpdHJhdGUKK2JldHdlZW4gbWFzdGVycywgYXMgd2VsbCBhcyB0byBoYW5kc2hha2UgYW5kIHRvIHN5bmNocm9uaXplIGNsb2NrcyBmcm9tCitzbG93ZXIgY2xpZW50cy4KKworVGhlIExpbnV4IEkyQyBwcm9ncmFtbWluZyBpbnRlcmZhY2VzIHN1cHBvcnQgb25seSB0aGUgbWFzdGVyIHNpZGUgb2YgYnVzCitpbnRlcmFjdGlvbnMsIG5vdCB0aGUgc2xhdmUgc2lkZS4gVGhlIHByb2dyYW1taW5nIGludGVyZmFjZSBpcworc3RydWN0dXJlZCBhcm91bmQgdHdvIGtpbmRzIG9mIGRyaXZlciwgYW5kIHR3byBraW5kcyBvZiBkZXZpY2UuIEFuIEkyQworIkFkYXB0ZXIgRHJpdmVyIiBhYnN0cmFjdHMgdGhlIGNvbnRyb2xsZXIgaGFyZHdhcmU7IGl0IGJpbmRzIHRvIGEKK3BoeXNpY2FsIGRldmljZSAocGVyaGFwcyBhIFBDSSBkZXZpY2Ugb3IgcGxhdGZvcm1fZGV2aWNlKSBhbmQgZXhwb3NlcyBhCis6Yzp0eXBlOmBzdHJ1Y3QgaTJjX2FkYXB0ZXIgPGkyY19hZGFwdGVyPmAgcmVwcmVzZW50aW5nIGVhY2gKK0kyQyBidXMgc2VnbWVudCBpdCBtYW5hZ2VzLiBPbiBlYWNoIEkyQyBidXMgc2VnbWVudCB3aWxsIGJlIEkyQyBkZXZpY2VzCityZXByZXNlbnRlZCBieSBhIDpjOnR5cGU6YHN0cnVjdCBpMmNfY2xpZW50IDxpMmNfY2xpZW50PmAuCitUaG9zZSBkZXZpY2VzIHdpbGwgYmUgYm91bmQgdG8gYSA6Yzp0eXBlOmBzdHJ1Y3QgaTJjX2RyaXZlcgorPGkyY19kcml2ZXI+YCwgd2hpY2ggc2hvdWxkIGZvbGxvdyB0aGUgc3RhbmRhcmQgTGludXggZHJpdmVyCittb2RlbC4gKEF0IHRoaXMgd3JpdGluZywgYSBsZWdhY3kgbW9kZWwgaXMgbW9yZSB3aWRlbHkgdXNlZC4pIFRoZXJlIGFyZQorZnVuY3Rpb25zIHRvIHBlcmZvcm0gdmFyaW91cyBJMkMgcHJvdG9jb2wgb3BlcmF0aW9uczsgYXQgdGhpcyB3cml0aW5nCithbGwgc3VjaCBmdW5jdGlvbnMgYXJlIHVzYWJsZSBvbmx5IGZyb20gdGFzayBjb250ZXh0LgorCitUaGUgU3lzdGVtIE1hbmFnZW1lbnQgQnVzIChTTUJ1cykgaXMgYSBzaWJsaW5nIHByb3RvY29sLiBNb3N0IFNNQnVzCitzeXN0ZW1zIGFyZSBhbHNvIEkyQyBjb25mb3JtYW50LiBUaGUgZWxlY3RyaWNhbCBjb25zdHJhaW50cyBhcmUgdGlnaHRlcgorZm9yIFNNQnVzLCBhbmQgaXQgc3RhbmRhcmRpemVzIHBhcnRpY3VsYXIgcHJvdG9jb2wgbWVzc2FnZXMgYW5kIGlkaW9tcy4KK0NvbnRyb2xsZXJzIHRoYXQgc3VwcG9ydCBJMkMgY2FuIGFsc28gc3VwcG9ydCBtb3N0IFNNQnVzIG9wZXJhdGlvbnMsIGJ1dAorU01CdXMgY29udHJvbGxlcnMgZG9uJ3Qgc3VwcG9ydCBhbGwgdGhlIHByb3RvY29sIG9wdGlvbnMgdGhhdCBhbiBJMkMKK2NvbnRyb2xsZXIgd2lsbC4gVGhlcmUgYXJlIGZ1bmN0aW9ucyB0byBwZXJmb3JtIHZhcmlvdXMgU01CdXMgcHJvdG9jb2wKK29wZXJhdGlvbnMsIGVpdGhlciB1c2luZyBJMkMgcHJpbWl0aXZlcyBvciBieSBpc3N1aW5nIFNNQnVzIGNvbW1hbmRzIHRvCitpMmNfYWRhcHRlciBkZXZpY2VzIHdoaWNoIGRvbid0IHN1cHBvcnQgdGhvc2UgSTJDIG9wZXJhdGlvbnMuCisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L2kyYy5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2kyYy9pMmMtYm9hcmRpbmZvLmMKKyAgIDpmdW5jdGlvbnM6IGkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvCisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2kyYy9pMmMtY29yZS5jCisgICA6ZXhwb3J0OgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2luZGV4LnJzdCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9pbmRleC5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyNTljNWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvaW5kZXgucnN0CkBAIC0wLDAgKzEsMjYgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoZSBMaW51eCBkcml2ZXIgaW1wbGVtZW50ZXIncyBBUEkgZ3VpZGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGtlcm5lbCBvZmZlcnMgYSB3aWRlIHZhcmlldHkgb2YgaW50ZXJmYWNlcyB0byBzdXBwb3J0IHRoZSBkZXZlbG9wbWVudAorb2YgZGV2aWNlIGRyaXZlcnMuICBUaGlzIGRvY3VtZW50IGlzIGFuIG9ubHkgc29tZXdoYXQgb3JnYW5pemVkIGNvbGxlY3Rpb24KK29mIHNvbWUgb2YgdGhvc2UgaW50ZXJmYWNlcyDigJQgaXQgd2lsbCBob3BlZnVsbHkgZ2V0IGJldHRlciBvdmVyIHRpbWUhICBUaGUKK2F2YWlsYWJsZSBzdWJzZWN0aW9ucyBjYW4gYmUgc2VlbiBiZWxvdy4KKworLi4gY2xhc3M6OiB0b2MtdGl0bGUKKworCSAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKy4uIHRvY3RyZWU6OgorICAgOm1heGRlcHRoOiAyCisKKyAgIGJhc2ljcworICAgaW5mcmFzdHJ1Y3R1cmUKKyAgIG1lc3NhZ2UtYmFzZWQKKyAgIHNvdW5kCisgICBmcmFtZS1idWZmZXIKKyAgIGlucHV0CisgICBzcGkKKyAgIGkyYworICAgaHNpCisgICBtaXNjZWxsYW5lb3VzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvaW5mcmFzdHJ1Y3R1cmUucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2luZnJhc3RydWN0dXJlLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDUwZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2luZnJhc3RydWN0dXJlLnJzdApAQCAtMCwwICsxLDE2OSBAQAorRGV2aWNlIGRyaXZlcnMgaW5mcmFzdHJ1Y3R1cmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBCYXNpYyBEZXZpY2UgRHJpdmVyLU1vZGVsIFN0cnVjdHVyZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvZGV2aWNlLmgKKyAgIDppbnRlcm5hbDoKKworRGV2aWNlIERyaXZlcnMgQmFzZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL2luaXQuYworICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL2RyaXZlci5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL2NvcmUuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYmFzZS9zeXNjb3JlLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2Jhc2UvY2xhc3MuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYmFzZS9ub2RlLmMKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL3RyYW5zcG9ydF9jbGFzcy5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL2RkLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYmFzZS9idXMuYworICAgOmV4cG9ydDoKKworQnVmZmVyIFNoYXJpbmcgYW5kIFN5bmNocm9uaXphdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZG1hLWJ1ZiBzdWJzeXN0ZW0gcHJvdmlkZXMgdGhlIGZyYW1ld29yayBmb3Igc2hhcmluZyBidWZmZXJzIGZvcgoraGFyZHdhcmUgKERNQSkgYWNjZXNzIGFjcm9zcyBtdWx0aXBsZSBkZXZpY2UgZHJpdmVycyBhbmQgc3Vic3lzdGVtcywgYW5kCitmb3Igc3luY2hyb25pemluZyBhc3luY2hyb25vdXMgaGFyZHdhcmUgYWNjZXNzLgorCitUaGlzIGlzIHVzZWQsIGZvciBleGFtcGxlLCBieSBkcm0gInByaW1lIiBtdWx0aS1HUFUgc3VwcG9ydCwgYnV0IGlzIG9mCitjb3Vyc2Ugbm90IGxpbWl0ZWQgdG8gR1BVIHVzZSBjYXNlcy4KKworVGhlIHRocmVlIG1haW4gY29tcG9uZW50cyBvZiB0aGlzIGFyZTogKDEpIGRtYS1idWYsIHJlcHJlc2VudGluZyBhCitzZ190YWJsZSBhbmQgZXhwb3NlZCB0byB1c2Vyc3BhY2UgYXMgYSBmaWxlIGRlc2NyaXB0b3IgdG8gYWxsb3cgcGFzc2luZworYmV0d2VlbiBkZXZpY2VzLCAoMikgZmVuY2UsIHdoaWNoIHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIHNpZ25hbCB3aGVuCitvbmUgZGV2aWNlIGFzIGZpbmlzaGVkIGFjY2VzcywgYW5kICgzKSByZXNlcnZhdGlvbiwgd2hpY2ggbWFuYWdlcyB0aGUKK3NoYXJlZCBvciBleGNsdXNpdmUgZmVuY2UocykgYXNzb2NpYXRlZCB3aXRoIHRoZSBidWZmZXIuCisKK2RtYS1idWYKK35+fn5+fn4KKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvZG1hLWJ1Zi9kbWEtYnVmLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L2RtYS1idWYuaAorICAgOmludGVybmFsOgorCityZXNlcnZhdGlvbgorfn5+fn5+fn5+fn4KKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvZG1hLWJ1Zi9yZXNlcnZhdGlvbi5jCisgICA6ZG9jOiBSZXNlcnZhdGlvbiBPYmplY3QgT3ZlcnZpZXcKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvZG1hLWJ1Zi9yZXNlcnZhdGlvbi5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9yZXNlcnZhdGlvbi5oCisgICA6aW50ZXJuYWw6CisKK2ZlbmNlCit+fn5+fgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9kbWEtYnVmL2ZlbmNlLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L2ZlbmNlLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvZG1hLWJ1Zi9zZXFuby1mZW5jZS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9zZXFuby1mZW5jZS5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2RtYS1idWYvZmVuY2UtYXJyYXkuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvZmVuY2UtYXJyYXkuaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9kbWEtYnVmL3Jlc2VydmF0aW9uLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L3Jlc2VydmF0aW9uLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvZG1hLWJ1Zi9zeW5jX2ZpbGUuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvc3luY19maWxlLmgKKyAgIDppbnRlcm5hbDoKKworRGV2aWNlIERyaXZlcnMgRE1BIE1hbmFnZW1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2Jhc2UvZG1hLWNvaGVyZW50LmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2Jhc2UvZG1hLW1hcHBpbmcuYworICAgOmV4cG9ydDoKKworRGV2aWNlIERyaXZlcnMgUG93ZXIgTWFuYWdlbWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYworICAgOmV4cG9ydDoKKworRGV2aWNlIERyaXZlcnMgQUNQSSBTdXBwb3J0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYWNwaS9zY2FuLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2FjcGkvc2Nhbi5jCisgICA6aW50ZXJuYWw6CisKK0RldmljZSBkcml2ZXJzIFBuUCBzdXBwb3J0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9wbnAvY29yZS5jCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3BucC9jYXJkLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3BucC9kcml2ZXIuYworICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9wbnAvbWFuYWdlci5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9wbnAvc3VwcG9ydC5jCisgICA6ZXhwb3J0OgorCitVc2Vyc3BhY2UgSU8gZGV2aWNlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvdWlvL3Vpby5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKKyAgIDppbnRlcm5hbDoKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2lucHV0LnJzdCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9pbnB1dC5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1YmY1OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9pbnB1dC5yc3QKQEAgLTAsMCArMSw1MSBAQAorSW5wdXQgU3Vic3lzdGVtCis9PT09PT09PT09PT09PT0KKworSW5wdXQgY29yZQorLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9pbnB1dC5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2lucHV0L2lucHV0LmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2lucHV0L2ZmLWNvcmUuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvaW5wdXQvZmYtbWVtbGVzcy5jCisgICA6ZXhwb3J0OgorCitNdWx0aXRvdWNoIExpYnJhcnkKKy0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9pbnB1dC9tdC5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2lucHV0L2lucHV0LW10LmMKKyAgIDpleHBvcnQ6CisKK1BvbGxlZCBpbnB1dCBkZXZpY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9pbnB1dC1wb2xsZGV2LmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvaW5wdXQvaW5wdXQtcG9sbGRldi5jCisgICA6ZXhwb3J0OgorCitNYXRyaXgga2V5Ym9hcmRzL2tleXBhZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmgKKyAgIDppbnRlcm5hbDoKKworU3BhcnNlIGtleW1hcCBzdXBwb3J0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvaW5wdXQvc3BhcnNlLWtleW1hcC5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2lucHV0L3NwYXJzZS1rZXltYXAuYworICAgOmV4cG9ydDoKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL21lc3NhZ2UtYmFzZWQucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL21lc3NhZ2UtYmFzZWQucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZmY5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvbWVzc2FnZS1iYXNlZC5yc3QKQEAgLTAsMCArMSwxMiBAQAorTWVzc2FnZS1iYXNlZCBkZXZpY2VzCis9PT09PT09PT09PT09PT09PT09PT0KKworRnVzaW9uIG1lc3NhZ2UgZGV2aWNlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKKyAgIDpleHBvcnQ6CisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9taXNjZWxsYW5lb3VzLnJzdCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9taXNjZWxsYW5lb3VzLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGE3ZDExCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL21pc2NlbGxhbmVvdXMucnN0CkBAIC0wLDAgKzEsNTAgQEAKK1BhcmFsbGVsIFBvcnQgRGV2aWNlcworPT09PT09PT09PT09PT09PT09PT09CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L3BhcnBvcnQuaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0LmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3BhcnBvcnQvc2hhcmUuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvcGFycG9ydC9kYWlzeS5jCisgICA6aW50ZXJuYWw6CisKKzE2eDUwIFVBUlQgRHJpdmVyCis9PT09PT09PT09PT09PT09PQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy90dHkvc2VyaWFsL3NlcmlhbF9jb3JlLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2NvcmUuYworICAgOmV4cG9ydDoKKworUHVsc2UtV2lkdGggTW9kdWxhdGlvbiAoUFdNKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQdWxzZS13aWR0aCBtb2R1bGF0aW9uIGlzIGEgbW9kdWxhdGlvbiB0ZWNobmlxdWUgcHJpbWFyaWx5IHVzZWQgdG8KK2NvbnRyb2wgcG93ZXIgc3VwcGxpZWQgdG8gZWxlY3RyaWNhbCBkZXZpY2VzLgorCitUaGUgUFdNIGZyYW1ld29yayBwcm92aWRlcyBhbiBhYnN0cmFjdGlvbiBmb3IgcHJvdmlkZXJzIGFuZCBjb25zdW1lcnMgb2YKK1BXTSBzaWduYWxzLiBBIGNvbnRyb2xsZXIgdGhhdCBwcm92aWRlcyBvbmUgb3IgbW9yZSBQV00gc2lnbmFscyBpcworcmVnaXN0ZXJlZCBhcyA6Yzp0eXBlOmBzdHJ1Y3QgcHdtX2NoaXAgPHB3bV9jaGlwPmAuIFByb3ZpZGVycworYXJlIGV4cGVjdGVkIHRvIGVtYmVkIHRoaXMgc3RydWN0dXJlIGluIGEgZHJpdmVyLXNwZWNpZmljIHN0cnVjdHVyZS4KK1RoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGZpZWxkcyB0aGF0IGRlc2NyaWJlIGEgcGFydGljdWxhciBjaGlwLgorCitBIGNoaXAgZXhwb3NlcyBvbmUgb3IgbW9yZSBQV00gc2lnbmFsIHNvdXJjZXMsIGVhY2ggb2Ygd2hpY2ggZXhwb3NlZCBhcworYSA6Yzp0eXBlOmBzdHJ1Y3QgcHdtX2RldmljZSA8cHdtX2RldmljZT5gLiBPcGVyYXRpb25zIGNhbiBiZQorcGVyZm9ybWVkIG9uIFBXTSBkZXZpY2VzIHRvIGNvbnRyb2wgdGhlIHBlcmlvZCwgZHV0eSBjeWNsZSwgcG9sYXJpdHkgYW5kCithY3RpdmUgc3RhdGUgb2YgdGhlIHNpZ25hbC4KKworTm90ZSB0aGF0IFBXTSBkZXZpY2VzIGFyZSBleGNsdXNpdmUgcmVzb3VyY2VzOiB0aGV5IGNhbiBhbHdheXMgb25seSBiZQordXNlZCBieSBvbmUgY29uc3VtZXIgYXQgYSB0aW1lLgorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9wd20uaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9wd20vY29yZS5jCisgICA6ZXhwb3J0OgorICAgCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvc291bmQucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL3NvdW5kLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmVmNmVhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL3NvdW5kLnJzdApAQCAtMCwwICsxLDU0IEBACitTb3VuZCBEZXZpY2VzCis9PT09PT09PT09PT09CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL3NvdW5kL2NvcmUuaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvc291bmRfY29yZS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9zb3VuZC9wY20uaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvY29yZS9wY20uYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IHNvdW5kL2NvcmUvZGV2aWNlLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBzb3VuZC9jb3JlL2luZm8uYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IHNvdW5kL2NvcmUvcmF3bWlkaS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvY29yZS9zb3VuZC5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvY29yZS9tZW1vcnkuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IHNvdW5kL2NvcmUvcGNtX21lbW9yeS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvY29yZS9pbml0LmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBzb3VuZC9jb3JlL2lzYWRtYS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvY29yZS9jb250cm9sLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBzb3VuZC9jb3JlL3BjbV9saWIuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IHNvdW5kL2NvcmUvaHdkZXAuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IHNvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvY29yZS9tZW1hbGxvYy5jCisgICA6ZXhwb3J0OgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvc3BpLnJzdCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9zcGkucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NGNiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvc3BpLnJzdApAQCAtMCwwICsxLDUzIEBACitTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTUEkgaXMgdGhlICJTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UiLCB3aWRlbHkgdXNlZCB3aXRoIGVtYmVkZGVkCitzeXN0ZW1zIGJlY2F1c2UgaXQgaXMgYSBzaW1wbGUgYW5kIGVmZmljaWVudCBpbnRlcmZhY2U6IGJhc2ljYWxseSBhCittdWx0aXBsZXhlZCBzaGlmdCByZWdpc3Rlci4gSXRzIHRocmVlIHNpZ25hbCB3aXJlcyBob2xkIGEgY2xvY2sgKFNDSywKK29mdGVuIGluIHRoZSByYW5nZSBvZiAxLTIwIE1IeiksIGEgIk1hc3RlciBPdXQsIFNsYXZlIEluIiAoTU9TSSkgZGF0YQorbGluZSwgYW5kIGEgIk1hc3RlciBJbiwgU2xhdmUgT3V0IiAoTUlTTykgZGF0YSBsaW5lLiBTUEkgaXMgYSBmdWxsCitkdXBsZXggcHJvdG9jb2w7IGZvciBlYWNoIGJpdCBzaGlmdGVkIG91dCB0aGUgTU9TSSBsaW5lIChvbmUgcGVyIGNsb2NrKQorYW5vdGhlciBpcyBzaGlmdGVkIGluIG9uIHRoZSBNSVNPIGxpbmUuIFRob3NlIGJpdHMgYXJlIGFzc2VtYmxlZCBpbnRvCit3b3JkcyBvZiB2YXJpb3VzIHNpemVzIG9uIHRoZSB3YXkgdG8gYW5kIGZyb20gc3lzdGVtIG1lbW9yeS4gQW4KK2FkZGl0aW9uYWwgY2hpcHNlbGVjdCBsaW5lIGlzIHVzdWFsbHkgYWN0aXZlLWxvdyAobkNTKTsgZm91ciBzaWduYWxzIGFyZQorbm9ybWFsbHkgdXNlZCBmb3IgZWFjaCBwZXJpcGhlcmFsLCBwbHVzIHNvbWV0aW1lcyBhbiBpbnRlcnJ1cHQuCisKK1RoZSBTUEkgYnVzIGZhY2lsaXRpZXMgbGlzdGVkIGhlcmUgcHJvdmlkZSBhIGdlbmVyYWxpemVkIGludGVyZmFjZSB0bworZGVjbGFyZSBTUEkgYnVzc2VzIGFuZCBkZXZpY2VzLCBtYW5hZ2UgdGhlbSBhY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkCitMaW51eCBkcml2ZXIgbW9kZWwsIGFuZCBwZXJmb3JtIGlucHV0L291dHB1dCBvcGVyYXRpb25zLiBBdCB0aGlzIHRpbWUsCitvbmx5ICJtYXN0ZXIiIHNpZGUgaW50ZXJmYWNlcyBhcmUgc3VwcG9ydGVkLCB3aGVyZSBMaW51eCB0YWxrcyB0byBTUEkKK3BlcmlwaGVyYWxzIGFuZCBkb2VzIG5vdCBpbXBsZW1lbnQgc3VjaCBhIHBlcmlwaGVyYWwgaXRzZWxmLiAoSW50ZXJmYWNlcwordG8gc3VwcG9ydCBpbXBsZW1lbnRpbmcgU1BJIHNsYXZlcyB3b3VsZCBuZWNlc3NhcmlseSBsb29rIGRpZmZlcmVudC4pCisKK1RoZSBwcm9ncmFtbWluZyBpbnRlcmZhY2UgaXMgc3RydWN0dXJlZCBhcm91bmQgdHdvIGtpbmRzIG9mIGRyaXZlciwgYW5kCit0d28ga2luZHMgb2YgZGV2aWNlLiBBICJDb250cm9sbGVyIERyaXZlciIgYWJzdHJhY3RzIHRoZSBjb250cm9sbGVyCitoYXJkd2FyZSwgd2hpY2ggbWF5IGJlIGFzIHNpbXBsZSBhcyBhIHNldCBvZiBHUElPIHBpbnMgb3IgYXMgY29tcGxleCBhcworYSBwYWlyIG9mIEZJRk9zIGNvbm5lY3RlZCB0byBkdWFsIERNQSBlbmdpbmVzIG9uIHRoZSBvdGhlciBzaWRlIG9mIHRoZQorU1BJIHNoaWZ0IHJlZ2lzdGVyIChtYXhpbWl6aW5nIHRocm91Z2hwdXQpLiBTdWNoIGRyaXZlcnMgYnJpZGdlIGJldHdlZW4KK3doYXRldmVyIGJ1cyB0aGV5IHNpdCBvbiAob2Z0ZW4gdGhlIHBsYXRmb3JtIGJ1cykgYW5kIFNQSSwgYW5kIGV4cG9zZQordGhlIFNQSSBzaWRlIG9mIHRoZWlyIGRldmljZSBhcyBhIDpjOnR5cGU6YHN0cnVjdCBzcGlfbWFzdGVyCis8c3BpX21hc3Rlcj5gLiBTUEkgZGV2aWNlcyBhcmUgY2hpbGRyZW4gb2YgdGhhdCBtYXN0ZXIsCityZXByZXNlbnRlZCBhcyBhIDpjOnR5cGU6YHN0cnVjdCBzcGlfZGV2aWNlIDxzcGlfZGV2aWNlPmAgYW5kCittYW51ZmFjdHVyZWQgZnJvbSA6Yzp0eXBlOmBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8KKzxzcGlfYm9hcmRfaW5mbz5gIGRlc2NyaXB0b3JzIHdoaWNoIGFyZSB1c3VhbGx5IHByb3ZpZGVkIGJ5Citib2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBjb2RlLiBBIDpjOnR5cGU6YHN0cnVjdCBzcGlfZHJpdmVyCis8c3BpX2RyaXZlcj5gIGlzIGNhbGxlZCBhICJQcm90b2NvbCBEcml2ZXIiLCBhbmQgaXMgYm91bmQgdG8gYQorc3BpX2RldmljZSB1c2luZyBub3JtYWwgZHJpdmVyIG1vZGVsIGNhbGxzLgorCitUaGUgSS9PIG1vZGVsIGlzIGEgc2V0IG9mIHF1ZXVlZCBtZXNzYWdlcy4gUHJvdG9jb2wgZHJpdmVycyBzdWJtaXQgb25lCitvciBtb3JlIDpjOnR5cGU6YHN0cnVjdCBzcGlfbWVzc2FnZSA8c3BpX21lc3NhZ2U+YCBvYmplY3RzLAord2hpY2ggYXJlIHByb2Nlc3NlZCBhbmQgY29tcGxldGVkIGFzeW5jaHJvbm91c2x5LiAoVGhlcmUgYXJlIHN5bmNocm9ub3VzCit3cmFwcGVycywgaG93ZXZlci4pIE1lc3NhZ2VzIGFyZSBidWlsdCBmcm9tIG9uZSBvciBtb3JlCis6Yzp0eXBlOmBzdHJ1Y3Qgc3BpX3RyYW5zZmVyIDxzcGlfdHJhbnNmZXI+YCBvYmplY3RzLCBlYWNoIG9mCit3aGljaCB3cmFwcyBhIGZ1bGwgZHVwbGV4IFNQSSB0cmFuc2Zlci4gQSB2YXJpZXR5IG9mIHByb3RvY29sIHR3ZWFraW5nCitvcHRpb25zIGFyZSBuZWVkZWQsIGJlY2F1c2UgZGlmZmVyZW50IGNoaXBzIGFkb3B0IHZlcnkgZGlmZmVyZW50Citwb2xpY2llcyBmb3IgaG93IHRoZXkgdXNlIHRoZSBiaXRzIHRyYW5zZmVycmVkIHdpdGggU1BJLgorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvc3BpL3NwaS5jCisgICA6ZnVuY3Rpb25zOiBzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbworCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9zcGkvc3BpLmMKKyAgIDpleHBvcnQ6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXZpY2UudHh0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvZGV2aWNlLnR4dAppbmRleCAxZTcwMjIwLi4yNDAzZWI4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXZpY2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2RldmljZS50eHQKQEAgLTUwLDcgKzUwLDcgQEAKIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zeXNmcy50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24KIG9uIGhvdyBzeXNmcyB3b3Jrcy4KIAotQXMgZXhwbGFpbmVkIGluIERvY3VtZW50YXRpb24va29iamVjdC50eHQsIGRldmljZSBhdHRyaWJ1dGVzIG11c3QgYmUgYmUKK0FzIGV4cGxhaW5lZCBpbiBEb2N1bWVudGF0aW9uL2tvYmplY3QudHh0LCBkZXZpY2UgYXR0cmlidXRlcyBtdXN0IGJlCiBjcmVhdGVkIGJlZm9yZSB0aGUgS09CSl9BREQgdWV2ZW50IGlzIGdlbmVyYXRlZC4gVGhlIG9ubHkgd2F5IHRvIHJlYWxpemUKIHRoYXQgaXMgYnkgZGVmaW5pbmcgYW4gYXR0cmlidXRlIGdyb3VwLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXZyZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvZGV2cmVzLnR4dAppbmRleCBiMGQ3NzVkLi43NWJjNWI4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXZyZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2RldnJlcy50eHQKQEAgLTI2Niw4ICsyNjYsMTIgQEAKICAgZGV2bV9paW9fZGV2aWNlX3VucmVnaXN0ZXIoKQogICBkZXZtX2lpb19rZmlmb19hbGxvY2F0ZSgpCiAgIGRldm1faWlvX2tmaWZvX2ZyZWUoKQorICBkZXZtX2lpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKCkKKyAgZGV2bV9paW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKCkKICAgZGV2bV9paW9fdHJpZ2dlcl9hbGxvYygpCiAgIGRldm1faWlvX3RyaWdnZXJfZnJlZSgpCisgIGRldm1faWlvX3RyaWdnZXJfcmVnaXN0ZXIoKQorICBkZXZtX2lpb190cmlnZ2VyX3VucmVnaXN0ZXIoKQogICBkZXZtX2lpb19jaGFubmVsX2dldCgpCiAgIGRldm1faWlvX2NoYW5uZWxfcmVsZWFzZSgpCiAgIGRldm1faWlvX2NoYW5uZWxfZ2V0X2FsbCgpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2VtYWlsLWNsaWVudHMudHh0IGIvRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dAppbmRleCAyZDQ4NWRlLi5hYzg5MmIzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2VtYWlsLWNsaWVudHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZW1haWwtY2xpZW50cy50eHQKQEAgLTEsMjMgKzEsMjcgQEAKKy4uIF9lbWFpbF9jbGllbnRzOgorCiBFbWFpbCBjbGllbnRzIGluZm8gZm9yIExpbnV4Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIEdpdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlc2UgZGF5cyBtb3N0IGRldmVsb3BlcnMgdXNlIGBnaXQgc2VuZC1lbWFpbGAgaW5zdGVhZCBvZiByZWd1bGFyCi1lbWFpbCBjbGllbnRzLiAgVGhlIG1hbiBwYWdlIGZvciB0aGlzIGlzIHF1aXRlIGdvb2QuICBPbiB0aGUgcmVjZWl2aW5nCi1lbmQsIG1haW50YWluZXJzIHVzZSBgZ2l0IGFtYCB0byBhcHBseSB0aGUgcGF0Y2hlcy4KKy0tLQogCi1JZiB5b3UgYXJlIG5ldyB0byBnaXQgdGhlbiBzZW5kIHlvdXIgZmlyc3QgcGF0Y2ggdG8geW91cnNlbGYuICBTYXZlIGl0Ci1hcyByYXcgdGV4dCBpbmNsdWRpbmcgYWxsIHRoZSBoZWFkZXJzLiAgUnVuIGBnaXQgYW0gcmF3X2VtYWlsLnR4dGAgYW5kCi10aGVuIHJldmlldyB0aGUgY2hhbmdlbG9nIHdpdGggYGdpdCBsb2dgLiAgV2hlbiB0aGF0IHdvcmtzIHRoZW4gc2VuZAorVGhlc2UgZGF5cyBtb3N0IGRldmVsb3BlcnMgdXNlIGBgZ2l0IHNlbmQtZW1haWxgYCBpbnN0ZWFkIG9mIHJlZ3VsYXIKK2VtYWlsIGNsaWVudHMuICBUaGUgbWFuIHBhZ2UgZm9yIHRoaXMgaXMgcXVpdGUgZ29vZC4gIE9uIHRoZSByZWNlaXZpbmcKK2VuZCwgbWFpbnRhaW5lcnMgdXNlIGBgZ2l0IGFtYGAgdG8gYXBwbHkgdGhlIHBhdGNoZXMuCisKK0lmIHlvdSBhcmUgbmV3IHRvIGBgZ2l0YGAgdGhlbiBzZW5kIHlvdXIgZmlyc3QgcGF0Y2ggdG8geW91cnNlbGYuICBTYXZlIGl0CithcyByYXcgdGV4dCBpbmNsdWRpbmcgYWxsIHRoZSBoZWFkZXJzLiAgUnVuIGBgZ2l0IGFtIHJhd19lbWFpbC50eHRgYCBhbmQKK3RoZW4gcmV2aWV3IHRoZSBjaGFuZ2Vsb2cgd2l0aCBgYGdpdCBsb2dgYC4gIFdoZW4gdGhhdCB3b3JrcyB0aGVuIHNlbmQKIHRoZSBwYXRjaCB0byB0aGUgYXBwcm9wcmlhdGUgbWFpbGluZyBsaXN0KHMpLgogCiBHZW5lcmFsIFByZWZlcmVuY2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLS0tLS0tLS0tLS0tLS0tLS0tCisKIFBhdGNoZXMgZm9yIHRoZSBMaW51eCBrZXJuZWwgYXJlIHN1Ym1pdHRlZCB2aWEgZW1haWwsIHByZWZlcmFibHkgYXMKIGlubGluZSB0ZXh0IGluIHRoZSBib2R5IG9mIHRoZSBlbWFpbC4gIFNvbWUgbWFpbnRhaW5lcnMgYWNjZXB0CiBhdHRhY2htZW50cywgYnV0IHRoZW4gdGhlIGF0dGFjaG1lbnRzIHNob3VsZCBoYXZlIGNvbnRlbnQtdHlwZQotInRleHQvcGxhaW4iLiAgSG93ZXZlciwgYXR0YWNobWVudHMgYXJlIGdlbmVyYWxseSBmcm93bmVkIHVwb24gYmVjYXVzZQorYGB0ZXh0L3BsYWluYGAuICBIb3dldmVyLCBhdHRhY2htZW50cyBhcmUgZ2VuZXJhbGx5IGZyb3duZWQgdXBvbiBiZWNhdXNlCiBpdCBtYWtlcyBxdW90aW5nIHBvcnRpb25zIG9mIHRoZSBwYXRjaCBtb3JlIGRpZmZpY3VsdCBpbiB0aGUgcGF0Y2gKIHJldmlldyBwcm9jZXNzLgogCkBAIC0yNSw3ICsyOSw3IEBACiBwYXRjaCB0ZXh0IHVudG91Y2hlZC4gIEZvciBleGFtcGxlLCB0aGV5IHNob3VsZCBub3QgbW9kaWZ5IG9yIGRlbGV0ZSB0YWJzCiBvciBzcGFjZXMsIGV2ZW4gYXQgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgbGluZXMuCiAKLURvbid0IHNlbmQgcGF0Y2hlcyB3aXRoICJmb3JtYXQ9Zmxvd2VkIi4gIFRoaXMgY2FuIGNhdXNlIHVuZXhwZWN0ZWQKK0Rvbid0IHNlbmQgcGF0Y2hlcyB3aXRoIGBgZm9ybWF0PWZsb3dlZGBgLiAgVGhpcyBjYW4gY2F1c2UgdW5leHBlY3RlZAogYW5kIHVud2FudGVkIGxpbmUgYnJlYWtzLgogCiBEb24ndCBsZXQgeW91ciBlbWFpbCBjbGllbnQgZG8gYXV0b21hdGljIHdvcmQgd3JhcHBpbmcgZm9yIHlvdS4KQEAgLTU0LDU3ICs1OCw2MyBAQAogCiAKIFNvbWUgZW1haWwgY2xpZW50IChNVUEpIGhpbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiBIZXJlIGFyZSBzb21lIHNwZWNpZmljIE1VQSBjb25maWd1cmF0aW9uIGhpbnRzIGZvciBlZGl0aW5nIGFuZCBzZW5kaW5nCiBwYXRjaGVzIGZvciB0aGUgTGludXgga2VybmVsLiAgVGhlc2UgYXJlIG5vdCBtZWFudCB0byBiZSBjb21wbGV0ZQogc29mdHdhcmUgcGFja2FnZSBjb25maWd1cmF0aW9uIHN1bW1hcmllcy4KIAotTGVnZW5kOgotVFVJID0gdGV4dC1iYXNlZCB1c2VyIGludGVyZmFjZQotR1VJID0gZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlCiAKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitMZWdlbmQ6CisKKy0gVFVJID0gdGV4dC1iYXNlZCB1c2VyIGludGVyZmFjZQorLSBHVUkgPSBncmFwaGljYWwgdXNlciBpbnRlcmZhY2UKKwogQWxwaW5lIChUVUkpCisqKioqKioqKioqKioKIAogQ29uZmlnIG9wdGlvbnM6Ci1JbiB0aGUgIlNlbmRpbmcgUHJlZmVyZW5jZXMiIHNlY3Rpb246CiAKLS0gIkRvIE5vdCBTZW5kIEZsb3dlZCBUZXh0IiBtdXN0IGJlIGVuYWJsZWQKLS0gIlN0cmlwIFdoaXRlc3BhY2UgQmVmb3JlIFNlbmRpbmciIG11c3QgYmUgZGlzYWJsZWQKK0luIHRoZSA6bWVudXNlbGVjdGlvbjpgU2VuZGluZyBQcmVmZXJlbmNlc2Agc2VjdGlvbjoKKworLSA6bWVudXNlbGVjdGlvbjpgRG8gTm90IFNlbmQgRmxvd2VkIFRleHRgIG11c3QgYmUgYGBlbmFibGVkYGAKKy0gOm1lbnVzZWxlY3Rpb246YFN0cmlwIFdoaXRlc3BhY2UgQmVmb3JlIFNlbmRpbmdgIG11c3QgYmUgYGBkaXNhYmxlZGBgCiAKIFdoZW4gY29tcG9zaW5nIHRoZSBtZXNzYWdlLCB0aGUgY3Vyc29yIHNob3VsZCBiZSBwbGFjZWQgd2hlcmUgdGhlIHBhdGNoCi1zaG91bGQgYXBwZWFyLCBhbmQgdGhlbiBwcmVzc2luZyBDVFJMLVIgbGV0IHlvdSBzcGVjaWZ5IHRoZSBwYXRjaCBmaWxlCitzaG91bGQgYXBwZWFyLCBhbmQgdGhlbiBwcmVzc2luZyA6a2JkOmBDVFJMLVJgIGxldCB5b3Ugc3BlY2lmeSB0aGUgcGF0Y2ggZmlsZQogdG8gaW5zZXJ0IGludG8gdGhlIG1lc3NhZ2UuCiAKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBDbGF3cyBNYWlsIChHVUkpCisqKioqKioqKioqKioqKioqCiAKIFdvcmtzLiBTb21lIHBlb3BsZSB1c2UgdGhpcyBzdWNjZXNzZnVsbHkgZm9yIHBhdGNoZXMuCiAKLVRvIGluc2VydCBhIHBhdGNoIHVzZSBNZXNzYWdlLT5JbnNlcnQgRmlsZSAoQ1RSTCtpKSBvciBhbiBleHRlcm5hbCBlZGl0b3IuCitUbyBpbnNlcnQgYSBwYXRjaCB1c2UgOm1lbnVzZWxlY3Rpb246YE1lc3NhZ2UtLT5JbnNlcnRgIEZpbGUgKDprYmQ6YENUUkwtSWApCitvciBhbiBleHRlcm5hbCBlZGl0b3IuCiAKIElmIHRoZSBpbnNlcnRlZCBwYXRjaCBoYXMgdG8gYmUgZWRpdGVkIGluIHRoZSBDbGF3cyBjb21wb3NpdGlvbiB3aW5kb3cKLSJBdXRvIHdyYXBwaW5nIiBpbiBDb25maWd1cmF0aW9uLT5QcmVmZXJlbmNlcy0+Q29tcG9zZS0+V3JhcHBpbmcgc2hvdWxkIGJlCisiQXV0byB3cmFwcGluZyIgaW4KKzptZW51c2VsZWN0aW9uOmBDb25maWd1cmF0aW9uLS0+UHJlZmVyZW5jZXMtLT5Db21wb3NlLS0+V3JhcHBpbmdgIHNob3VsZCBiZQogZGlzYWJsZWQuCiAKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBFdm9sdXRpb24gKEdVSSkKKyoqKioqKioqKioqKioqKgogCiBTb21lIHBlb3BsZSB1c2UgdGhpcyBzdWNjZXNzZnVsbHkgZm9yIHBhdGNoZXMuCiAKIFdoZW4gY29tcG9zaW5nIG1haWwgc2VsZWN0OiBQcmVmb3JtYXQKLSAgZnJvbSBGb3JtYXQtPlBhcmFncmFwaCBTdHlsZS0+UHJlZm9ybWF0dGVkIChDdHJsLTcpCisgIGZyb20gOm1lbnVzZWxlY3Rpb246YEZvcm1hdC0tPlBhcmFncmFwaCBTdHlsZS0tPlByZWZvcm1hdHRlZGAgKDprYmQ6YENUUkwtN2ApCiAgIG9yIHRoZSB0b29sYmFyCiAKIFRoZW4gdXNlOgotICBJbnNlcnQtPlRleHQgRmlsZS4uLiAoQWx0LW4geCkKKzptZW51c2VsZWN0aW9uOmBJbnNlcnQtLT5UZXh0IEZpbGUuLi5gICg6a2JkOmBBTFQtTiB4YCkKIHRvIGluc2VydCB0aGUgcGF0Y2guCiAKLVlvdSBjYW4gYWxzbyAiZGlmZiAtTnJ1IG9sZC5jIG5ldy5jIHwgeGNsaXAiLCBzZWxlY3QgUHJlZm9ybWF0LCB0aGVuCi1wYXN0ZSB3aXRoIHRoZSBtaWRkbGUgYnV0dG9uLgorWW91IGNhbiBhbHNvIGBgZGlmZiAtTnJ1IG9sZC5jIG5ldy5jIHwgeGNsaXBgYCwgc2VsZWN0Cis6bWVudXNlbGVjdGlvbjpgUHJlZm9ybWF0YCwgdGhlbiBwYXN0ZSB3aXRoIHRoZSBtaWRkbGUgYnV0dG9uLgogCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogS21haWwgKEdVSSkKKyoqKioqKioqKioqCiAKIFNvbWUgcGVvcGxlIHVzZSBLbWFpbCBzdWNjZXNzZnVsbHkgZm9yIHBhdGNoZXMuCiAKQEAgLTEyMCwxMSArMTMwLDEyIEBACiB3cmFwcGluZy4KIAogQXQgdGhlIGJvdHRvbSBvZiB5b3VyIGVtYWlsLCBwdXQgdGhlIGNvbW1vbmx5LXVzZWQgcGF0Y2ggZGVsaW1pdGVyIGJlZm9yZQotaW5zZXJ0aW5nIHlvdXIgcGF0Y2g6ICB0aHJlZSBoeXBoZW5zICgtLS0pLgoraW5zZXJ0aW5nIHlvdXIgcGF0Y2g6ICB0aHJlZSBoeXBoZW5zIChgYC0tLWBgKS4KIAotVGhlbiBmcm9tIHRoZSAiTWVzc2FnZSIgbWVudSBpdGVtLCBzZWxlY3QgaW5zZXJ0IGZpbGUgYW5kIGNob29zZSB5b3VyIHBhdGNoLgorVGhlbiBmcm9tIHRoZSA6bWVudXNlbGVjdGlvbjpgTWVzc2FnZWAgbWVudSBpdGVtLCBzZWxlY3QgaW5zZXJ0IGZpbGUgYW5kCitjaG9vc2UgeW91ciBwYXRjaC4KIEFzIGFuIGFkZGVkIGJvbnVzIHlvdSBjYW4gY3VzdG9taXNlIHRoZSBtZXNzYWdlIGNyZWF0aW9uIHRvb2xiYXIgbWVudQotYW5kIHB1dCB0aGUgImluc2VydCBmaWxlIiBpY29uIHRoZXJlLgorYW5kIHB1dCB0aGUgOm1lbnVzZWxlY3Rpb246YGluc2VydCBmaWxlYCBpY29uIHRoZXJlLgogCiBNYWtlIHRoZSBjb21wb3NlciB3aW5kb3cgd2lkZSBlbm91Z2ggc28gdGhhdCBubyBsaW5lcyB3cmFwLiBBcyBvZgogS01haWwgMS4xMy41IChLREUgNC41LjQpLCBLTWFpbCB3aWxsIGFwcGx5IHdvcmQgd3JhcHBpbmcgd2hlbiBzZW5kaW5nCkBAIC0xMzksODYgKzE1MCw5NiBAQAogCiBJZiB5b3UgYWJzb2x1dGVseSBtdXN0IHNlbmQgcGF0Y2hlcyBhcyBhdHRhY2htZW50cyBpbnN0ZWFkIG9mIGlubGluaW5nCiB0aGVtIGFzIHRleHQsIHJpZ2h0IGNsaWNrIG9uIHRoZSBhdHRhY2htZW50IGFuZCBzZWxlY3QgcHJvcGVydGllcywgYW5kCi1oaWdobGlnaHQgIlN1Z2dlc3QgYXV0b21hdGljIGRpc3BsYXkiIHRvIG1ha2UgdGhlIGF0dGFjaG1lbnQgaW5saW5lZCB0bwotbWFrZSBpdCBtb3JlIHZpZXdhYmxlLgoraGlnaGxpZ2h0IDptZW51c2VsZWN0aW9uOmBTdWdnZXN0IGF1dG9tYXRpYyBkaXNwbGF5YCB0byBtYWtlIHRoZSBhdHRhY2htZW50CitpbmxpbmVkIHRvIG1ha2UgaXQgbW9yZSB2aWV3YWJsZS4KIAogV2hlbiBzYXZpbmcgcGF0Y2hlcyB0aGF0IGFyZSBzZW50IGFzIGlubGluZWQgdGV4dCwgc2VsZWN0IHRoZSBlbWFpbCB0aGF0CiBjb250YWlucyB0aGUgcGF0Y2ggZnJvbSB0aGUgbWVzc2FnZSBsaXN0IHBhbmUsIHJpZ2h0IGNsaWNrIGFuZCBzZWxlY3QKLSJzYXZlIGFzIi4gIFlvdSBjYW4gdXNlIHRoZSB3aG9sZSBlbWFpbCB1bm1vZGlmaWVkIGFzIGEgcGF0Y2ggaWYgaXQgd2FzCi1wcm9wZXJseSBjb21wb3NlZC4gIFRoZXJlIGlzIG5vIG9wdGlvbiBjdXJyZW50bHkgdG8gc2F2ZSB0aGUgZW1haWwgd2hlbiB5b3UKLWFyZSBhY3R1YWxseSB2aWV3aW5nIGl0IGluIGl0cyBvd24gd2luZG93IC0tIHRoZXJlIGhhcyBiZWVuIGEgcmVxdWVzdCBmaWxlZAotYXQga21haWwncyBidWd6aWxsYSBhbmQgaG9wZWZ1bGx5IHRoaXMgd2lsbCBiZSBhZGRyZXNzZWQuICBFbWFpbHMgYXJlIHNhdmVkCi1hcyByZWFkLXdyaXRlIGZvciB1c2VyIG9ubHkgc28geW91IHdpbGwgaGF2ZSB0byBjaG1vZCB0aGVtIHRvIG1ha2UgdGhlbQorOm1lbnVzZWxlY3Rpb246YHNhdmUgYXNgLiAgWW91IGNhbiB1c2UgdGhlIHdob2xlIGVtYWlsIHVubW9kaWZpZWQgYXMgYSBwYXRjaAoraWYgaXQgd2FzIHByb3Blcmx5IGNvbXBvc2VkLiAgVGhlcmUgaXMgbm8gb3B0aW9uIGN1cnJlbnRseSB0byBzYXZlIHRoZSBlbWFpbAord2hlbiB5b3UgYXJlIGFjdHVhbGx5IHZpZXdpbmcgaXQgaW4gaXRzIG93biB3aW5kb3cgLS0gdGhlcmUgaGFzIGJlZW4gYSByZXF1ZXN0CitmaWxlZCBhdCBrbWFpbCdzIGJ1Z3ppbGxhIGFuZCBob3BlZnVsbHkgdGhpcyB3aWxsIGJlIGFkZHJlc3NlZC4gIEVtYWlscyBhcmUKK3NhdmVkIGFzIHJlYWQtd3JpdGUgZm9yIHVzZXIgb25seSBzbyB5b3Ugd2lsbCBoYXZlIHRvIGNobW9kIHRoZW0gdG8gbWFrZSB0aGVtCiBncm91cCBhbmQgd29ybGQgcmVhZGFibGUgaWYgeW91IGNvcHkgdGhlbSBlbHNld2hlcmUuCiAKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBMb3R1cyBOb3RlcyAoR1VJKQorKioqKioqKioqKioqKioqKioKIAogUnVuIGF3YXkgZnJvbSBpdC4KIAotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIE11dHQgKFRVSSkKKyoqKioqKioqKioKIAotUGxlbnR5IG9mIExpbnV4IGRldmVsb3BlcnMgdXNlIG11dHQsIHNvIGl0IG11c3Qgd29yayBwcmV0dHkgd2VsbC4KK1BsZW50eSBvZiBMaW51eCBkZXZlbG9wZXJzIHVzZSBgYG11dHRgYCwgc28gaXQgbXVzdCB3b3JrIHByZXR0eSB3ZWxsLgogCiBNdXR0IGRvZXNuJ3QgY29tZSB3aXRoIGFuIGVkaXRvciwgc28gd2hhdGV2ZXIgZWRpdG9yIHlvdSB1c2Ugc2hvdWxkIGJlCiB1c2VkIGluIGEgd2F5IHRoYXQgdGhlcmUgYXJlIG5vIGF1dG9tYXRpYyBsaW5lYnJlYWtzLiAgTW9zdCBlZGl0b3JzIGhhdmUKLWFuICJpbnNlcnQgZmlsZSIgb3B0aW9uIHRoYXQgaW5zZXJ0cyB0aGUgY29udGVudHMgb2YgYSBmaWxlIHVuYWx0ZXJlZC4KK2FuIDptZW51c2VsZWN0aW9uOmBpbnNlcnQgZmlsZWAgb3B0aW9uIHRoYXQgaW5zZXJ0cyB0aGUgY29udGVudHMgb2YgYSBmaWxlCit1bmFsdGVyZWQuCiAKLVRvIHVzZSAndmltJyB3aXRoIG11dHQ6CitUbyB1c2UgYGB2aW1gYCB3aXRoIG11dHQ6OgorCiAgIHNldCBlZGl0b3I9InZpIgogCi0gIElmIHVzaW5nIHhjbGlwLCB0eXBlIHRoZSBjb21tYW5kCitJZiB1c2luZyB4Y2xpcCwgdHlwZSB0aGUgY29tbWFuZDo6CisKICAgOnNldCBwYXN0ZQotICBiZWZvcmUgbWlkZGxlIGJ1dHRvbiBvciBzaGlmdC1pbnNlcnQgb3IgdXNlCisKK2JlZm9yZSBtaWRkbGUgYnV0dG9uIG9yIHNoaWZ0LWluc2VydCBvciB1c2U6OgorCiAgIDpyIGZpbGVuYW1lCiAKIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIHBhdGNoIGlubGluZS4KLShhKXR0YWNoIHdvcmtzIGZpbmUgd2l0aG91dCAic2V0IHBhc3RlIi4KKyhhKXR0YWNoIHdvcmtzIGZpbmUgd2l0aG91dCBgYHNldCBwYXN0ZWBgLgogCi1Zb3UgY2FuIGFsc28gZ2VuZXJhdGUgcGF0Y2hlcyB3aXRoICdnaXQgZm9ybWF0LXBhdGNoJyBhbmQgdGhlbiB1c2UgTXV0dAotdG8gc2VuZCB0aGVtOgorWW91IGNhbiBhbHNvIGdlbmVyYXRlIHBhdGNoZXMgd2l0aCBgYGdpdCBmb3JtYXQtcGF0Y2hgYCBhbmQgdGhlbiB1c2UgTXV0dAordG8gc2VuZCB0aGVtOjoKKwogICAgICQgbXV0dCAtSCAwMDAxLXNvbWUtYnVnLWZpeC5wYXRjaAogCiBDb25maWcgb3B0aW9uczoKKwogSXQgc2hvdWxkIHdvcmsgd2l0aCBkZWZhdWx0IHNldHRpbmdzLgotSG93ZXZlciwgaXQncyBhIGdvb2QgaWRlYSB0byBzZXQgdGhlICJzZW5kX2NoYXJzZXQiIHRvOgorSG93ZXZlciwgaXQncyBhIGdvb2QgaWRlYSB0byBzZXQgdGhlIGBgc2VuZF9jaGFyc2V0YGAgdG86OgorCiAgIHNldCBzZW5kX2NoYXJzZXQ9InVzLWFzY2lpOnV0Zi04IgogCiBNdXR0IGlzIGhpZ2hseSBjdXN0b21pemFibGUuIEhlcmUgaXMgYSBtaW5pbXVtIGNvbmZpZ3VyYXRpb24gdG8gc3RhcnQKLXVzaW5nIE11dHQgdG8gc2VuZCBwYXRjaGVzIHRocm91Z2ggR21haWw6Cit1c2luZyBNdXR0IHRvIHNlbmQgcGF0Y2hlcyB0aHJvdWdoIEdtYWlsOjoKIAotIyAubXV0dHJjCi0jID09PT09PT09PT09PT09PT0gIElNQVAgPT09PT09PT09PT09PT09PT09PT0KLXNldCBpbWFwX3VzZXIgPSAneW91cnVzZXJuYW1lQGdtYWlsLmNvbScKLXNldCBpbWFwX3Bhc3MgPSAneW91cnBhc3N3b3JkJwotc2V0IHNwb29sZmlsZSA9IGltYXBzOi8vaW1hcC5nbWFpbC5jb20vSU5CT1gKLXNldCBmb2xkZXIgPSBpbWFwczovL2ltYXAuZ21haWwuY29tLwotc2V0IHJlY29yZD0iaW1hcHM6Ly9pbWFwLmdtYWlsLmNvbS9bR21haWxdL1NlbnQgTWFpbCIKLXNldCBwb3N0cG9uZWQ9ImltYXBzOi8vaW1hcC5nbWFpbC5jb20vW0dtYWlsXS9EcmFmdHMiCi1zZXQgbWJveD0iaW1hcHM6Ly9pbWFwLmdtYWlsLmNvbS9bR21haWxdL0FsbCBNYWlsIgorICAjIC5tdXR0cmMKKyAgIyA9PT09PT09PT09PT09PT09ICBJTUFQID09PT09PT09PT09PT09PT09PT09CisgIHNldCBpbWFwX3VzZXIgPSAneW91cnVzZXJuYW1lQGdtYWlsLmNvbScKKyAgc2V0IGltYXBfcGFzcyA9ICd5b3VycGFzc3dvcmQnCisgIHNldCBzcG9vbGZpbGUgPSBpbWFwczovL2ltYXAuZ21haWwuY29tL0lOQk9YCisgIHNldCBmb2xkZXIgPSBpbWFwczovL2ltYXAuZ21haWwuY29tLworICBzZXQgcmVjb3JkPSJpbWFwczovL2ltYXAuZ21haWwuY29tL1tHbWFpbF0vU2VudCBNYWlsIgorICBzZXQgcG9zdHBvbmVkPSJpbWFwczovL2ltYXAuZ21haWwuY29tL1tHbWFpbF0vRHJhZnRzIgorICBzZXQgbWJveD0iaW1hcHM6Ly9pbWFwLmdtYWlsLmNvbS9bR21haWxdL0FsbCBNYWlsIgogCi0jID09PT09PT09PT09PT09PT0gIFNNVFAgID09PT09PT09PT09PT09PT09PT09Ci1zZXQgc210cF91cmwgPSAic210cDovL3VzZXJuYW1lQHNtdHAuZ21haWwuY29tOjU4Ny8iCi1zZXQgc210cF9wYXNzID0gJGltYXBfcGFzcwotc2V0IHNzbF9mb3JjZV90bHMgPSB5ZXMgIyBSZXF1aXJlIGVuY3J5cHRlZCBjb25uZWN0aW9uCisgICMgPT09PT09PT09PT09PT09PSAgU01UUCAgPT09PT09PT09PT09PT09PT09PT0KKyAgc2V0IHNtdHBfdXJsID0gInNtdHA6Ly91c2VybmFtZUBzbXRwLmdtYWlsLmNvbTo1ODcvIgorICBzZXQgc210cF9wYXNzID0gJGltYXBfcGFzcworICBzZXQgc3NsX2ZvcmNlX3RscyA9IHllcyAjIFJlcXVpcmUgZW5jcnlwdGVkIGNvbm5lY3Rpb24KIAotIyA9PT09PT09PT09PT09PT09ICBDb21wb3NpdGlvbiAgPT09PT09PT09PT09PT09PT09PT0KLXNldCBlZGl0b3IgPSBgZWNobyBcJEVESVRPUmAKLXNldCBlZGl0X2hlYWRlcnMgPSB5ZXMgICMgU2VlIHRoZSBoZWFkZXJzIHdoZW4gZWRpdGluZwotc2V0IGNoYXJzZXQgPSBVVEYtOCAgICAgIyB2YWx1ZSBvZiAkTEFORzsgYWxzbyBmYWxsYmFjayBmb3Igc2VuZF9jaGFyc2V0Ci0jIFNlbmRlciwgZW1haWwgYWRkcmVzcywgYW5kIHNpZ24tb2ZmIGxpbmUgbXVzdCBtYXRjaAotdW5zZXQgdXNlX2RvbWFpbiAgICAgICAgIyBiZWNhdXNlIGpvZUBsb2NhbGhvc3QgaXMganVzdCBlbWJhcnJhc3NpbmcKLXNldCByZWFsbmFtZSA9ICJZT1VSIE5BTUUiCi1zZXQgZnJvbSA9ICJ1c2VybmFtZUBnbWFpbC5jb20iCi1zZXQgdXNlX2Zyb20gPSB5ZXMKKyAgIyA9PT09PT09PT09PT09PT09ICBDb21wb3NpdGlvbiAgPT09PT09PT09PT09PT09PT09PT0KKyAgc2V0IGVkaXRvciA9IGBlY2hvIFwkRURJVE9SYAorICBzZXQgZWRpdF9oZWFkZXJzID0geWVzICAjIFNlZSB0aGUgaGVhZGVycyB3aGVuIGVkaXRpbmcKKyAgc2V0IGNoYXJzZXQgPSBVVEYtOCAgICAgIyB2YWx1ZSBvZiAkTEFORzsgYWxzbyBmYWxsYmFjayBmb3Igc2VuZF9jaGFyc2V0CisgICMgU2VuZGVyLCBlbWFpbCBhZGRyZXNzLCBhbmQgc2lnbi1vZmYgbGluZSBtdXN0IG1hdGNoCisgIHVuc2V0IHVzZV9kb21haW4gICAgICAgICMgYmVjYXVzZSBqb2VAbG9jYWxob3N0IGlzIGp1c3QgZW1iYXJyYXNzaW5nCisgIHNldCByZWFsbmFtZSA9ICJZT1VSIE5BTUUiCisgIHNldCBmcm9tID0gInVzZXJuYW1lQGdtYWlsLmNvbSIKKyAgc2V0IHVzZV9mcm9tID0geWVzCiAKIFRoZSBNdXR0IGRvY3MgaGF2ZSBsb3RzIG1vcmUgaW5mb3JtYXRpb246CisKICAgICBodHRwOi8vZGV2Lm11dHQub3JnL3RyYWMvd2lraS9Vc2VDYXNlcy9HbWFpbAorCiAgICAgaHR0cDovL2Rldi5tdXR0Lm9yZy9kb2MvbWFudWFsLmh0bWwKIAotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIFBpbmUgKFRVSSkKKyoqKioqKioqKioKIAogUGluZSBoYXMgaGFkIHNvbWUgd2hpdGVzcGFjZSB0cnVuY2F0aW9uIGlzc3VlcyBpbiB0aGUgcGFzdCwgYnV0IHRoZXNlCiBzaG91bGQgYWxsIGJlIGZpeGVkIG5vdy4KQEAgLTIyNiwxMiArMjQ3LDEzIEBACiBVc2UgYWxwaW5lIChwaW5lJ3Mgc3VjY2Vzc29yKSBpZiB5b3UgY2FuLgogCiBDb25maWcgb3B0aW9uczoKLS0gcXVlbGwtZmxvd2VkLXRleHQgaXMgbmVlZGVkIGZvciByZWNlbnQgdmVyc2lvbnMKLS0gdGhlICJuby1zdHJpcC13aGl0ZXNwYWNlLWJlZm9yZS1zZW5kIiBvcHRpb24gaXMgbmVlZGVkCisKKy0gYGBxdWVsbC1mbG93ZWQtdGV4dGBgIGlzIG5lZWRlZCBmb3IgcmVjZW50IHZlcnNpb25zCistIHRoZSBgYG5vLXN0cmlwLXdoaXRlc3BhY2UtYmVmb3JlLXNlbmRgYCBvcHRpb24gaXMgbmVlZGVkCiAKIAotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIFN5bHBoZWVkIChHVUkpCisqKioqKioqKioqKioqKgogCiAtIFdvcmtzIHdlbGwgZm9yIGlubGluaW5nIHRleHQgKG9yIHVzaW5nIGF0dGFjaG1lbnRzKS4KIC0gQWxsb3dzIHVzZSBvZiBhbiBleHRlcm5hbCBlZGl0b3IuCkBAIC0yNDEsNTAgKzI2Myw1MCBAQAogLSBBZGRpbmcgYWRkcmVzc2VzIHRvIGFkZHJlc3MgYm9vayBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIGRpc3BsYXkgbmFtZQogICBwcm9wZXJseS4KIAotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIFRodW5kZXJiaXJkIChHVUkpCisqKioqKioqKioqKioqKioqKgogCiBUaHVuZGVyYmlyZCBpcyBhbiBPdXRsb29rIGNsb25lIHRoYXQgbGlrZXMgdG8gbWFuZ2xlIHRleHQsIGJ1dCB0aGVyZSBhcmUgd2F5cwogdG8gY29lcmNlIGl0IGludG8gYmVoYXZpbmcuCiAKIC0gQWxsb3cgdXNlIG9mIGFuIGV4dGVybmFsIGVkaXRvcjoKICAgVGhlIGVhc2llc3QgdGhpbmcgdG8gZG8gd2l0aCBUaHVuZGVyYmlyZCBhbmQgcGF0Y2hlcyBpcyB0byB1c2UgYW4KLSAgImV4dGVybmFsIGVkaXRvciIgZXh0ZW5zaW9uIGFuZCB0aGVuIGp1c3QgdXNlIHlvdXIgZmF2b3JpdGUgJEVESVRPUgorICAiZXh0ZXJuYWwgZWRpdG9yIiBleHRlbnNpb24gYW5kIHRoZW4ganVzdCB1c2UgeW91ciBmYXZvcml0ZSBgYCRFRElUT1JgYAogICBmb3IgcmVhZGluZy9tZXJnaW5nIHBhdGNoZXMgaW50byB0aGUgYm9keSB0ZXh0LiAgVG8gZG8gdGhpcywgZG93bmxvYWQKICAgYW5kIGluc3RhbGwgdGhlIGV4dGVuc2lvbiwgdGhlbiBhZGQgYSBidXR0b24gZm9yIGl0IHVzaW5nCi0gIFZpZXctPlRvb2xiYXJzLT5DdXN0b21pemUuLi4gYW5kIGZpbmFsbHkganVzdCBjbGljayBvbiBpdCB3aGVuIGluIHRoZQotICBDb21wb3NlIGRpYWxvZy4KKyAgOm1lbnVzZWxlY3Rpb246YFZpZXctLT5Ub29sYmFycy0tPkN1c3RvbWl6ZS4uLmAgYW5kIGZpbmFsbHkganVzdCBjbGljayBvbiBpdAorICB3aGVuIGluIHRoZSA6bWVudXNlbGVjdGlvbjpgQ29tcG9zZWAgZGlhbG9nLgogCiAgIFBsZWFzZSBub3RlIHRoYXQgImV4dGVybmFsIGVkaXRvciIgcmVxdWlyZXMgdGhhdCB5b3VyIGVkaXRvciBtdXN0IG5vdAogICBmb3JrLCBvciBpbiBvdGhlciB3b3JkcywgdGhlIGVkaXRvciBtdXN0IG5vdCByZXR1cm4gYmVmb3JlIGNsb3NpbmcuCiAgIFlvdSBtYXkgaGF2ZSB0byBwYXNzIGFkZGl0aW9uYWwgZmxhZ3Mgb3IgY2hhbmdlIHRoZSBzZXR0aW5ncyBvZiB5b3VyCiAgIGVkaXRvci4gTW9zdCBub3RhYmx5IGlmIHlvdSBhcmUgdXNpbmcgZ3ZpbSB0aGVuIHlvdSBtdXN0IHBhc3MgdGhlIC1mCi0gIG9wdGlvbiB0byBndmltIGJ5IHB1dHRpbmcgIi91c3IvYmluL2d2aW0gLWYiIChpZiB0aGUgYmluYXJ5IGlzIGluCi0gIC91c3IvYmluKSB0byB0aGUgdGV4dCBlZGl0b3IgZmllbGQgaW4gImV4dGVybmFsIGVkaXRvciIgc2V0dGluZ3MuIElmIHlvdQotICBhcmUgdXNpbmcgc29tZSBvdGhlciBlZGl0b3IgdGhlbiBwbGVhc2UgcmVhZCBpdHMgbWFudWFsIHRvIGZpbmQgb3V0IGhvdwotICB0byBkbyB0aGlzLgorICBvcHRpb24gdG8gZ3ZpbSBieSBwdXR0aW5nIGBgL3Vzci9iaW4vZ3ZpbSAtZmBgIChpZiB0aGUgYmluYXJ5IGlzIGluCisgIGBgL3Vzci9iaW5gYCkgdG8gdGhlIHRleHQgZWRpdG9yIGZpZWxkIGluIDptZW51c2VsZWN0aW9uOmBleHRlcm5hbCBlZGl0b3JgCisgIHNldHRpbmdzLiBJZiB5b3UgYXJlIHVzaW5nIHNvbWUgb3RoZXIgZWRpdG9yIHRoZW4gcGxlYXNlIHJlYWQgaXRzIG1hbnVhbAorICB0byBmaW5kIG91dCBob3cgdG8gZG8gdGhpcy4KIAogVG8gYmVhdCBzb21lIHNlbnNlIG91dCBvZiB0aGUgaW50ZXJuYWwgZWRpdG9yLCBkbyB0aGlzOgogCi0tIEVkaXQgeW91ciBUaHVuZGVyYmlyZCBjb25maWcgc2V0dGluZ3Mgc28gdGhhdCBpdCB3b24ndCB1c2UgZm9ybWF0PWZsb3dlZC4KLSAgR28gdG8gImVkaXQtPnByZWZlcmVuY2VzLT5hZHZhbmNlZC0+Y29uZmlnIGVkaXRvciIgdG8gYnJpbmcgdXAgdGhlCi0gIHRodW5kZXJiaXJkJ3MgcmVnaXN0cnkgZWRpdG9yLgorLSBFZGl0IHlvdXIgVGh1bmRlcmJpcmQgY29uZmlnIHNldHRpbmdzIHNvIHRoYXQgaXQgd29uJ3QgdXNlIGBgZm9ybWF0PWZsb3dlZGBgLgorICBHbyB0byA6bWVudXNlbGVjdGlvbjpgZWRpdC0tPnByZWZlcmVuY2VzLS0+YWR2YW5jZWQtLT5jb25maWcgZWRpdG9yYCB0byBicmluZyB1cAorICB0aGUgdGh1bmRlcmJpcmQncyByZWdpc3RyeSBlZGl0b3IuCiAKLS0gU2V0ICJtYWlsbmV3cy5zZW5kX3BsYWludGV4dF9mbG93ZWQiIHRvICJmYWxzZSIKKy0gU2V0IGBgbWFpbG5ld3Muc2VuZF9wbGFpbnRleHRfZmxvd2VkYGAgdG8gYGBmYWxzZWBgCiAKLS0gU2V0ICJtYWlsbmV3cy53cmFwbGVuZ3RoIiBmcm9tICI3MiIgdG8gIjAiCistIFNldCBgYG1haWxuZXdzLndyYXBsZW5ndGhgYCBmcm9tIGBgNzJgYCB0byBgYDBgYAogCi0tICJWaWV3IiA+ICJNZXNzYWdlIEJvZHkgQXMiID4gIlBsYWluIFRleHQiCistIDptZW51c2VsZWN0aW9uOmBWaWV3LS0+TWVzc2FnZSBCb2R5IEFzLS0+UGxhaW4gVGV4dGAKIAotLSAiVmlldyIgPiAiQ2hhcmFjdGVyIEVuY29kaW5nIiA+ICJVbmljb2RlIChVVEYtOCkiCistIDptZW51c2VsZWN0aW9uOmBWaWV3LS0+Q2hhcmFjdGVyIEVuY29kaW5nLS0+VW5pY29kZSAoVVRGLTgpYAogCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogVGtSYXQgKEdVSSkKKyoqKioqKioqKioqCiAKIFdvcmtzLiAgVXNlICJJbnNlcnQgZmlsZS4uLiIgb3IgZXh0ZXJuYWwgZWRpdG9yLgogCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogR21haWwgKFdlYiBHVUkpCisqKioqKioqKioqKioqKioKIAogRG9lcyBub3Qgd29yayBmb3Igc2VuZGluZyBwYXRjaGVzLgogCkBAIC0yOTUsNSArMzE3LDMgQEAKIAogQW5vdGhlciBwcm9ibGVtIGlzIHRoYXQgR21haWwgd2lsbCBiYXNlNjQtZW5jb2RlIGFueSBtZXNzYWdlIHRoYXQgaGFzIGEKIG5vbi1BU0NJSSBjaGFyYWN0ZXIuIFRoYXQgaW5jbHVkZXMgdGhpbmdzIGxpa2UgRXVyb3BlYW4gbmFtZXMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2RheC50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2RheC50eHQKaW5kZXggMGMxNmEyMi4uMjNkMThiOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9kYXgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZGF4LnR4dApAQCAtMTIzLDkgKzEyMywxMiBAQAogbWFwcGVkIGNhY2hlcyBzdWNoIGFzIEFSTSwgTUlQUyBhbmQgU1BBUkMuCiAKIENhbGxpbmcgZ2V0X3VzZXJfcGFnZXMoKSBvbiBhIHJhbmdlIG9mIHVzZXIgbWVtb3J5IHRoYXQgaGFzIGJlZW4gbW1hcGVkCi1mcm9tIGEgREFYIGZpbGUgd2lsbCBmYWlsIGFzIHRoZXJlIGFyZSBubyAnc3RydWN0IHBhZ2UnIHRvIGRlc2NyaWJlCi10aG9zZSBwYWdlcy4gIFRoaXMgcHJvYmxlbSBpcyBiZWluZyB3b3JrZWQgb24uICBUaGF0IG1lYW5zIHRoYXQgT19ESVJFQ1QKLXJlYWRzL3dyaXRlcyB0byB0aG9zZSBtZW1vcnkgcmFuZ2VzIGZyb20gYSBub24tREFYIGZpbGUgd2lsbCBmYWlsIChub3RlCi10aGF0IE9fRElSRUNUIHJlYWRzL3dyaXRlcyBfb2YgYSBEQVggZmlsZV8gZG8gd29yaywgaXQgaXMgdGhlIG1lbW9yeQotdGhhdCBpcyBiZWluZyBhY2Nlc3NlZCB0aGF0IGlzIGtleSBoZXJlKS4gIE90aGVyIHRoaW5ncyB0aGF0IHdpbGwgbm90Ci13b3JrIGluY2x1ZGUgUkRNQSwgc2VuZGZpbGUoKSBhbmQgc3BsaWNlKCkuCitmcm9tIGEgREFYIGZpbGUgd2lsbCBmYWlsIHdoZW4gdGhlcmUgYXJlIG5vICdzdHJ1Y3QgcGFnZScgdG8gZGVzY3JpYmUKK3Rob3NlIHBhZ2VzLiAgVGhpcyBwcm9ibGVtIGhhcyBiZWVuIGFkZHJlc3NlZCBpbiBzb21lIGRldmljZSBkcml2ZXJzCitieSBhZGRpbmcgb3B0aW9uYWwgc3RydWN0IHBhZ2Ugc3VwcG9ydCBmb3IgcGFnZXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YKK3RoZSBkcml2ZXIgKHNlZSBDT05GSUdfTlZESU1NX1BGTiBpbiBkcml2ZXJzL252ZGltbSBmb3IgYW4gZXhhbXBsZSBvZgoraG93IHRvIGRvIHRoaXMpLiBJbiB0aGUgbm9uIHN0cnVjdCBwYWdlIGNhc2VzIE9fRElSRUNUIHJlYWRzL3dyaXRlcyB0bwordGhvc2UgbWVtb3J5IHJhbmdlcyBmcm9tIGEgbm9uLURBWCBmaWxlIHdpbGwgZmFpbCAobm90ZSB0aGF0IE9fRElSRUNUCityZWFkcy93cml0ZXMgX29mIGEgREFYIGZpbGVfIGRvIHdvcmssIGl0IGlzIHRoZSBtZW1vcnkgdGhhdCBpcyBiZWluZworYWNjZXNzZWQgdGhhdCBpcyBrZXkgaGVyZSkuICBPdGhlciB0aGluZ3MgdGhhdCB3aWxsIG5vdCB3b3JrIGluIHRoZQorbm9uIHN0cnVjdCBwYWdlIGNhc2UgaW5jbHVkZSBSRE1BLCBzZW5kZmlsZSgpIGFuZCBzcGxpY2UoKS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvb3ZlcmxheWZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvb3ZlcmxheWZzLnR4dAppbmRleCBkNjI1OWM3Li5iY2JmOTcxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL292ZXJsYXlmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9vdmVybGF5ZnMudHh0CkBAIC0xODMsMTIgKzE4MywxMCBAQAogbW92ZXMgaXQgb3ZlciB0byB0aGUgb2xkIG5hbWUuICBUaGUgbmV3IGZpbGUgbWF5IGJlIG9uIGEgZGlmZmVyZW50CiBmaWxlc3lzdGVtLCBzbyBib3RoIHN0X2RldiBhbmQgc3RfaW5vIG9mIHRoZSBmaWxlIG1heSBjaGFuZ2UuCiAKLUFueSBvcGVuIGZpbGVzIHJlZmVycmluZyB0byB0aGlzIGlub2RlIHdpbGwgYWNjZXNzIHRoZSBvbGQgZGF0YSBhbmQKLW1ldGFkYXRhLiAgU2ltaWxhcmx5IGFueSBmaWxlIGxvY2tzIG9idGFpbmVkIGJlZm9yZSBjb3B5X3VwIHdpbGwgbm90Ci1hcHBseSB0byB0aGUgY29waWVkIHVwIGZpbGUuCitBbnkgb3BlbiBmaWxlcyByZWZlcnJpbmcgdG8gdGhpcyBpbm9kZSB3aWxsIGFjY2VzcyB0aGUgb2xkIGRhdGEuCiAKLU9uIGEgZmlsZSBvcGVuZWQgd2l0aCBPX1JET05MWSBmY2htb2QoMiksIGZjaG93bigyKSwgZnV0aW1lc2F0KDIpIGFuZAotZnNldHhhdHRyKDIpIHdpbGwgZmFpbCB3aXRoIEVST0ZTLgorQW55IGZpbGUgbG9ja3MgKGFuZCBsZWFzZXMpIG9idGFpbmVkIGJlZm9yZSBjb3B5X3VwIHdpbGwgbm90IGFwcGx5Cit0byB0aGUgY29waWVkIHVwIGZpbGUuCiAKIElmIGEgZmlsZSB3aXRoIG11bHRpcGxlIGhhcmQgbGlua3MgaXMgY29waWVkIHVwLCB0aGVuIHRoaXMgd2lsbAogImJyZWFrIiB0aGUgbGluay4gIENoYW5nZXMgd2lsbCBub3QgYmUgcHJvcGFnYXRlZCB0byBvdGhlciBuYW1lcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKaW5kZXggNjgwODBhZC4uZmNjMWFjMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CkBAIC0xNDUsNyArMTQ1LDcgQEAKIAkJc3ltYm9sIHRoZSB0YXNrIGlzIGJsb2NrZWQgaW4gLSBvciAiMCIgaWYgbm90IGJsb2NrZWQuCiAgcGFnZW1hcAlQYWdlIHRhYmxlCiAgc3RhY2sJCVJlcG9ydCBmdWxsIHN0YWNrIHRyYWNlLCBlbmFibGUgdmlhIENPTkZJR19TVEFDS1RSQUNFCi0gc21hcHMJCWEgZXh0ZW5zaW9uIGJhc2VkIG9uIG1hcHMsIHNob3dpbmcgdGhlIG1lbW9yeSBjb25zdW1wdGlvbiBvZgorIHNtYXBzCQlhbiBleHRlbnNpb24gYmFzZWQgb24gbWFwcywgc2hvd2luZyB0aGUgbWVtb3J5IGNvbnN1bXB0aW9uIG9mCiAJCWVhY2ggbWFwcGluZyBhbmQgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIGl0CiAgbnVtYV9tYXBzCWFuIGV4dGVuc2lvbiBiYXNlZCBvbiBtYXBzLCBzaG93aW5nIHRoZSBtZW1vcnkgbG9jYWxpdHkgYW5kCiAJCWJpbmRpbmcgcG9saWN5IGFzIHdlbGwgYXMgbWVtIHVzYWdlIChpbiBwYWdlcykgb2YgZWFjaCBtYXBwaW5nLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9nY292LnR4dCBiL0RvY3VtZW50YXRpb24vZ2Nvdi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNzI3NzguLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9nY292LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi1Vc2luZyBnY292IHdpdGggdGhlIExpbnV4IGtlcm5lbAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotMS4gSW50cm9kdWN0aW9uCi0yLiBQcmVwYXJhdGlvbgotMy4gQ3VzdG9taXphdGlvbgotNC4gRmlsZXMKLTUuIE1vZHVsZXMKLTYuIFNlcGFyYXRlZCBidWlsZCBhbmQgdGVzdCBtYWNoaW5lcwotNy4gVHJvdWJsZXNob290aW5nCi1BcHBlbmRpeCBBOiBzYW1wbGUgc2NyaXB0OiBnYXRoZXJfb25fYnVpbGQuc2gKLUFwcGVuZGl4IEI6IHNhbXBsZSBzY3JpcHQ6IGdhdGhlcl9vbl90ZXN0LnNoCi0KLQotMS4gSW50cm9kdWN0aW9uCi09PT09PT09PT09PT09PT0KLQotZ2NvdiBwcm9maWxpbmcga2VybmVsIHN1cHBvcnQgZW5hYmxlcyB0aGUgdXNlIG9mIEdDQydzIGNvdmVyYWdlIHRlc3RpbmcKLXRvb2wgZ2NvdiBbMV0gd2l0aCB0aGUgTGludXgga2VybmVsLiBDb3ZlcmFnZSBkYXRhIG9mIGEgcnVubmluZyBrZXJuZWwKLWlzIGV4cG9ydGVkIGluIGdjb3YtY29tcGF0aWJsZSBmb3JtYXQgdmlhIHRoZSAiZ2NvdiIgZGVidWdmcyBkaXJlY3RvcnkuCi1UbyBnZXQgY292ZXJhZ2UgZGF0YSBmb3IgYSBzcGVjaWZpYyBmaWxlLCBjaGFuZ2UgdG8gdGhlIGtlcm5lbCBidWlsZAotZGlyZWN0b3J5IGFuZCB1c2UgZ2NvdiB3aXRoIHRoZSAtbyBvcHRpb24gYXMgZm9sbG93cyAocmVxdWlyZXMgcm9vdCk6Ci0KLSMgY2QgL3RtcC9saW51eC1vdXQKLSMgZ2NvdiAtbyAvc3lzL2tlcm5lbC9kZWJ1Zy9nY292L3RtcC9saW51eC1vdXQva2VybmVsIHNwaW5sb2NrLmMKLQotVGhpcyB3aWxsIGNyZWF0ZSBzb3VyY2UgY29kZSBmaWxlcyBhbm5vdGF0ZWQgd2l0aCBleGVjdXRpb24gY291bnRzCi1pbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuIEluIGFkZGl0aW9uLCBncmFwaGljYWwgZ2NvdiBmcm9udC1lbmRzIHN1Y2gKLWFzIGxjb3YgWzJdIGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRlIHRoZSBwcm9jZXNzIG9mIGNvbGxlY3RpbmcgZGF0YQotZm9yIHRoZSBlbnRpcmUga2VybmVsIGFuZCBwcm92aWRlIGNvdmVyYWdlIG92ZXJ2aWV3cyBpbiBIVE1MIGZvcm1hdC4KLQotUG9zc2libGUgdXNlczoKLQotKiBkZWJ1Z2dpbmcgKGhhcyB0aGlzIGxpbmUgYmVlbiByZWFjaGVkIGF0IGFsbD8pCi0qIHRlc3QgaW1wcm92ZW1lbnQgKGhvdyBkbyBJIGNoYW5nZSBteSB0ZXN0IHRvIGNvdmVyIHRoZXNlIGxpbmVzPykKLSogbWluaW1pemluZyBrZXJuZWwgY29uZmlndXJhdGlvbnMgKGRvIEkgbmVlZCB0aGlzIG9wdGlvbiBpZiB0aGUKLSAgYXNzb2NpYXRlZCBjb2RlIGlzIG5ldmVyIHJ1bj8pCi0KLS0tCi0KLVsxXSBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MvR2Nvdi5odG1sCi1bMl0gaHR0cDovL2x0cC5zb3VyY2Vmb3JnZS5uZXQvY292ZXJhZ2UvbGNvdi5waHAKLQotCi0yLiBQcmVwYXJhdGlvbgotPT09PT09PT09PT09PT0KLQotQ29uZmlndXJlIHRoZSBrZXJuZWwgd2l0aDoKLQotICAgICAgICBDT05GSUdfREVCVUdfRlM9eQotICAgICAgICBDT05GSUdfR0NPVl9LRVJORUw9eQotCi1zZWxlY3QgdGhlIGdjYydzIGdjb3YgZm9ybWF0LCBkZWZhdWx0IGlzIGF1dG9kZXRlY3QgYmFzZWQgb24gZ2NjIHZlcnNpb246Ci0KLSAgICAgICAgQ09ORklHX0dDT1ZfRk9STUFUX0FVVE9ERVRFQ1Q9eQotCi1hbmQgdG8gZ2V0IGNvdmVyYWdlIGRhdGEgZm9yIHRoZSBlbnRpcmUga2VybmVsOgotCi0gICAgICAgIENPTkZJR19HQ09WX1BST0ZJTEVfQUxMPXkKLQotTm90ZSB0aGF0IGtlcm5lbHMgY29tcGlsZWQgd2l0aCBwcm9maWxpbmcgZmxhZ3Mgd2lsbCBiZSBzaWduaWZpY2FudGx5Ci1sYXJnZXIgYW5kIHJ1biBzbG93ZXIuIEFsc28gQ09ORklHX0dDT1ZfUFJPRklMRV9BTEwgbWF5IG5vdCBiZSBzdXBwb3J0ZWQKLW9uIGFsbCBhcmNoaXRlY3R1cmVzLgotCi1Qcm9maWxpbmcgZGF0YSB3aWxsIG9ubHkgYmVjb21lIGFjY2Vzc2libGUgb25jZSBkZWJ1Z2ZzIGhhcyBiZWVuCi1tb3VudGVkOgotCi0gICAgICAgIG1vdW50IC10IGRlYnVnZnMgbm9uZSAvc3lzL2tlcm5lbC9kZWJ1ZwotCi0KLTMuIEN1c3RvbWl6YXRpb24KLT09PT09PT09PT09PT09PT0KLQotVG8gZW5hYmxlIHByb2ZpbGluZyBmb3Igc3BlY2lmaWMgZmlsZXMgb3IgZGlyZWN0b3JpZXMsIGFkZCBhIGxpbmUKLXNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyB0byB0aGUgcmVzcGVjdGl2ZSBrZXJuZWwgTWFrZWZpbGU6Ci0KLSAgICAgICAgRm9yIGEgc2luZ2xlIGZpbGUgKGUuZy4gbWFpbi5vKToKLSAgICAgICAgICAgICAgICBHQ09WX1BST0ZJTEVfbWFpbi5vIDo9IHkKLQotICAgICAgICBGb3IgYWxsIGZpbGVzIGluIG9uZSBkaXJlY3Rvcnk6Ci0gICAgICAgICAgICAgICAgR0NPVl9QUk9GSUxFIDo9IHkKLQotVG8gZXhjbHVkZSBmaWxlcyBmcm9tIGJlaW5nIHByb2ZpbGVkIGV2ZW4gd2hlbiBDT05GSUdfR0NPVl9QUk9GSUxFX0FMTAotaXMgc3BlY2lmaWVkLCB1c2U6Ci0KLSAgICAgICAgICAgICAgICBHQ09WX1BST0ZJTEVfbWFpbi5vIDo9IG4KLSAgICAgICAgYW5kOgotICAgICAgICAgICAgICAgIEdDT1ZfUFJPRklMRSA6PSBuCi0KLU9ubHkgZmlsZXMgd2hpY2ggYXJlIGxpbmtlZCB0byB0aGUgbWFpbiBrZXJuZWwgaW1hZ2Ugb3IgYXJlIGNvbXBpbGVkIGFzCi1rZXJuZWwgbW9kdWxlcyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgbWVjaGFuaXNtLgotCi0KLTQuIEZpbGVzCi09PT09PT09PQotCi1UaGUgZ2NvdiBrZXJuZWwgc3VwcG9ydCBjcmVhdGVzIHRoZSBmb2xsb3dpbmcgZmlsZXMgaW4gZGVidWdmczoKLQotICAgICAgICAvc3lzL2tlcm5lbC9kZWJ1Zy9nY292Ci0gICAgICAgICAgICAgICAgUGFyZW50IGRpcmVjdG9yeSBmb3IgYWxsIGdjb3YtcmVsYXRlZCBmaWxlcy4KLQotICAgICAgICAvc3lzL2tlcm5lbC9kZWJ1Zy9nY292L3Jlc2V0Ci0gICAgICAgICAgICAgICAgR2xvYmFsIHJlc2V0IGZpbGU6IHJlc2V0cyBhbGwgY292ZXJhZ2UgZGF0YSB0byB6ZXJvIHdoZW4KLSAgICAgICAgICAgICAgICB3cml0dGVuIHRvLgotCi0gICAgICAgIC9zeXMva2VybmVsL2RlYnVnL2djb3YvcGF0aC90by9jb21waWxlL2Rpci9maWxlLmdjZGEKLSAgICAgICAgICAgICAgICBUaGUgYWN0dWFsIGdjb3YgZGF0YSBmaWxlIGFzIHVuZGVyc3Rvb2QgYnkgdGhlIGdjb3YKLSAgICAgICAgICAgICAgICB0b29sLiBSZXNldHMgZmlsZSBjb3ZlcmFnZSBkYXRhIHRvIHplcm8gd2hlbiB3cml0dGVuIHRvLgotCi0gICAgICAgIC9zeXMva2VybmVsL2RlYnVnL2djb3YvcGF0aC90by9jb21waWxlL2Rpci9maWxlLmdjbm8KLSAgICAgICAgICAgICAgICBTeW1ib2xpYyBsaW5rIHRvIGEgc3RhdGljIGRhdGEgZmlsZSByZXF1aXJlZCBieSB0aGUgZ2NvdgotICAgICAgICAgICAgICAgIHRvb2wuIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgZ2NjIHdoZW4gY29tcGlsaW5nIHdpdGgKLSAgICAgICAgICAgICAgICBvcHRpb24gLWZ0ZXN0LWNvdmVyYWdlLgotCi0KLTUuIE1vZHVsZXMKLT09PT09PT09PT0KLQotS2VybmVsIG1vZHVsZXMgbWF5IGNvbnRhaW4gY2xlYW51cCBjb2RlIHdoaWNoIGlzIG9ubHkgcnVuIGR1cmluZwotbW9kdWxlIHVubG9hZCB0aW1lLiBUaGUgZ2NvdiBtZWNoYW5pc20gcHJvdmlkZXMgYSBtZWFucyB0byBjb2xsZWN0Ci1jb3ZlcmFnZSBkYXRhIGZvciBzdWNoIGNvZGUgYnkga2VlcGluZyBhIGNvcHkgb2YgdGhlIGRhdGEgYXNzb2NpYXRlZAotd2l0aCB0aGUgdW5sb2FkZWQgbW9kdWxlLiBUaGlzIGRhdGEgcmVtYWlucyBhdmFpbGFibGUgdGhyb3VnaCBkZWJ1Z2ZzLgotT25jZSB0aGUgbW9kdWxlIGlzIGxvYWRlZCBhZ2FpbiwgdGhlIGFzc29jaWF0ZWQgY292ZXJhZ2UgY291bnRlcnMgYXJlCi1pbml0aWFsaXplZCB3aXRoIHRoZSBkYXRhIGZyb20gaXRzIHByZXZpb3VzIGluc3RhbnRpYXRpb24uCi0KLVRoaXMgYmVoYXZpb3IgY2FuIGJlIGRlYWN0aXZhdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGdjb3ZfcGVyc2lzdCBrZXJuZWwKLXBhcmFtZXRlcjoKLQotICAgICAgICBnY292X3BlcnNpc3Q9MAotCi1BdCBydW4tdGltZSwgYSB1c2VyIGNhbiBhbHNvIGNob29zZSB0byBkaXNjYXJkIGRhdGEgZm9yIGFuIHVubG9hZGVkCi1tb2R1bGUgYnkgd3JpdGluZyB0byBpdHMgZGF0YSBmaWxlIG9yIHRoZSBnbG9iYWwgcmVzZXQgZmlsZS4KLQotCi02LiBTZXBhcmF0ZWQgYnVpbGQgYW5kIHRlc3QgbWFjaGluZXMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgZ2NvdiBrZXJuZWwgcHJvZmlsaW5nIGluZnJhc3RydWN0dXJlIGlzIGRlc2lnbmVkIHRvIHdvcmsgb3V0LW9mLXRoZQotYm94IGZvciBzZXR1cHMgd2hlcmUga2VybmVscyBhcmUgYnVpbHQgYW5kIHJ1biBvbiB0aGUgc2FtZSBtYWNoaW5lLiBJbgotY2FzZXMgd2hlcmUgdGhlIGtlcm5lbCBydW5zIG9uIGEgc2VwYXJhdGUgbWFjaGluZSwgc3BlY2lhbCBwcmVwYXJhdGlvbnMKLW11c3QgYmUgbWFkZSwgZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSBnY292IHRvb2wgaXMgdXNlZDoKLQotYSkgZ2NvdiBpcyBydW4gb24gdGhlIFRFU1QgbWFjaGluZQotCi1UaGUgZ2NvdiB0b29sIHZlcnNpb24gb24gdGhlIHRlc3QgbWFjaGluZSBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUKLWdjYyB2ZXJzaW9uIHVzZWQgZm9yIGtlcm5lbCBidWlsZC4gQWxzbyB0aGUgZm9sbG93aW5nIGZpbGVzIG5lZWQgdG8gYmUKLWNvcGllZCBmcm9tIGJ1aWxkIHRvIHRlc3QgbWFjaGluZToKLQotZnJvbSB0aGUgc291cmNlIHRyZWU6Ci0gIC0gYWxsIEMgc291cmNlIGZpbGVzICsgaGVhZGVycwotCi1mcm9tIHRoZSBidWlsZCB0cmVlOgotICAtIGFsbCBDIHNvdXJjZSBmaWxlcyArIGhlYWRlcnMKLSAgLSBhbGwgLmdjZGEgYW5kIC5nY25vIGZpbGVzCi0gIC0gYWxsIGxpbmtzIHRvIGRpcmVjdG9yaWVzCi0KLUl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlc2UgZmlsZXMgbmVlZCB0byBiZSBwbGFjZWQgaW50byB0aGUKLWV4YWN0IHNhbWUgZmlsZSBzeXN0ZW0gbG9jYXRpb24gb24gdGhlIHRlc3QgbWFjaGluZSBhcyBvbiB0aGUgYnVpbGQKLW1hY2hpbmUuIElmIGFueSBvZiB0aGUgcGF0aCBjb21wb25lbnRzIGlzIHN5bWJvbGljIGxpbmssIHRoZSBhY3R1YWwKLWRpcmVjdG9yeSBuZWVkcyB0byBiZSB1c2VkIGluc3RlYWQgKGR1ZSB0byBtYWtlJ3MgQ1VSRElSIGhhbmRsaW5nKS4KLQotYikgZ2NvdiBpcyBydW4gb24gdGhlIEJVSUxEIG1hY2hpbmUKLQotVGhlIGZvbGxvd2luZyBmaWxlcyBuZWVkIHRvIGJlIGNvcGllZCBhZnRlciBlYWNoIHRlc3QgY2FzZSBmcm9tIHRlc3QKLXRvIGJ1aWxkIG1hY2hpbmU6Ci0KLWZyb20gdGhlIGdjb3YgZGlyZWN0b3J5IGluIHN5c2ZzOgotICAtIGFsbCAuZ2NkYSBmaWxlcwotICAtIGFsbCBsaW5rcyB0byAuZ2NubyBmaWxlcwotCi1UaGVzZSBmaWxlcyBjYW4gYmUgY29waWVkIHRvIGFueSBsb2NhdGlvbiBvbiB0aGUgYnVpbGQgbWFjaGluZS4gZ2NvdgotbXVzdCB0aGVuIGJlIGNhbGxlZCB3aXRoIHRoZSAtbyBvcHRpb24gcG9pbnRpbmcgdG8gdGhhdCBkaXJlY3RvcnkuCi0KLUV4YW1wbGUgZGlyZWN0b3J5IHNldHVwIG9uIHRoZSBidWlsZCBtYWNoaW5lOgotCi0gIC90bXAvbGludXg6ICAgIGtlcm5lbCBzb3VyY2UgdHJlZQotICAvdG1wL291dDogICAgICBrZXJuZWwgYnVpbGQgZGlyZWN0b3J5IGFzIHNwZWNpZmllZCBieSBtYWtlIE89Ci0gIC90bXAvY292ZXJhZ2U6IGxvY2F0aW9uIG9mIHRoZSBmaWxlcyBjb3BpZWQgZnJvbSB0aGUgdGVzdCBtYWNoaW5lCi0KLSAgW3VzZXJAYnVpbGRdIGNkIC90bXAvb3V0Ci0gIFt1c2VyQGJ1aWxkXSBnY292IC1vIC90bXAvY292ZXJhZ2UvdG1wL291dC9pbml0IG1haW4uYwotCi0KLTcuIFRyb3VibGVzaG9vdGluZwotPT09PT09PT09PT09PT09PT09Ci0KLVByb2JsZW06ICBDb21waWxhdGlvbiBhYm9ydHMgZHVyaW5nIGxpbmtlciBzdGVwLgotQ2F1c2U6ICAgIFByb2ZpbGluZyBmbGFncyBhcmUgc3BlY2lmaWVkIGZvciBzb3VyY2UgZmlsZXMgd2hpY2ggYXJlIG5vdAotICAgICAgICAgIGxpbmtlZCB0byB0aGUgbWFpbiBrZXJuZWwgb3Igd2hpY2ggYXJlIGxpbmtlZCBieSBhIGN1c3RvbQotICAgICAgICAgIGxpbmtlciBwcm9jZWR1cmUuCi1Tb2x1dGlvbjogRXhjbHVkZSBhZmZlY3RlZCBzb3VyY2UgZmlsZXMgZnJvbSBwcm9maWxpbmcgYnkgc3BlY2lmeWluZwotICAgICAgICAgIEdDT1ZfUFJPRklMRSA6PSBuIG9yIEdDT1ZfUFJPRklMRV9iYXNlbmFtZS5vIDo9IG4gaW4gdGhlCi0gICAgICAgICAgY29ycmVzcG9uZGluZyBNYWtlZmlsZS4KLQotUHJvYmxlbTogIEZpbGVzIGNvcGllZCBmcm9tIHN5c2ZzIGFwcGVhciBlbXB0eSBvciBpbmNvbXBsZXRlLgotQ2F1c2U6ICAgIER1ZSB0byB0aGUgd2F5IHNlcV9maWxlIHdvcmtzLCBzb21lIHRvb2xzIHN1Y2ggYXMgY3Agb3IgdGFyCi0gICAgICAgICAgbWF5IG5vdCBjb3JyZWN0bHkgY29weSBmaWxlcyBmcm9tIHN5c2ZzLgotU29sdXRpb246IFVzZSAnY2F0JyB0byByZWFkIC5nY2RhIGZpbGVzIGFuZCAnY3AgLWQnIHRvIGNvcHkgbGlua3MuCi0gICAgICAgICAgQWx0ZXJuYXRpdmVseSB1c2UgdGhlIG1lY2hhbmlzbSBzaG93biBpbiBBcHBlbmRpeCBCLgotCi0KLUFwcGVuZGl4IEE6IGdhdGhlcl9vbl9idWlsZC5zaAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVNhbXBsZSBzY3JpcHQgdG8gZ2F0aGVyIGNvdmVyYWdlIG1ldGEgZmlsZXMgb24gdGhlIGJ1aWxkIG1hY2hpbmUKLShzZWUgNmEpOgotIyEvYmluL2Jhc2gKLQotS1NSQz0kMQotS09CSj0kMgotREVTVD0kMwotCi1pZiBbIC16ICIkS1NSQyIgXSB8fCBbIC16ICIkS09CSiIgXSB8fCBbIC16ICIkREVTVCIgXTsgdGhlbgotICBlY2hvICJVc2FnZTogJDAgPGtzcmMgZGlyZWN0b3J5PiA8a29iaiBkaXJlY3Rvcnk+IDxvdXRwdXQudGFyLmd6PiIgPiYyCi0gIGV4aXQgMQotZmkKLQotS1NSQz0kKGNkICRLU1JDOyBwcmludGYgImFsbDpcblx0QGVjaG8gXCR7Q1VSRElSfVxuIiB8IG1ha2UgLWYgLSkKLUtPQko9JChjZCAkS09CSjsgcHJpbnRmICJhbGw6XG5cdEBlY2hvIFwke0NVUkRJUn1cbiIgfCBtYWtlIC1mIC0pCi0KLWZpbmQgJEtTUkMgJEtPQkogXCggLW5hbWUgJyouZ2NubycgLW8gLW5hbWUgJyouW2NoXScgLW8gLXR5cGUgbCBcKSAtYSBcCi0gICAgICAgICAgICAgICAgIC1wZXJtIC91K3IsZytyIHwgdGFyIGNmeiAkREVTVCAtUCAtVCAtCi0KLWlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KLSAgZWNobyAiJERFU1Qgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIGNvcHkgdG8gdGVzdCBzeXN0ZW0gYW5kIHVucGFjayB3aXRoOiIKLSAgZWNobyAiICB0YXIgeGZ6ICRERVNUIC1QIgotZWxzZQotICBlY2hvICJDb3VsZCBub3QgY3JlYXRlIGZpbGUgJERFU1QiCi1maQotCi0KLUFwcGVuZGl4IEI6IGdhdGhlcl9vbl90ZXN0LnNoCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1TYW1wbGUgc2NyaXB0IHRvIGdhdGhlciBjb3ZlcmFnZSBkYXRhIGZpbGVzIG9uIHRoZSB0ZXN0IG1hY2hpbmUKLShzZWUgNmIpOgotCi0jIS9iaW4vYmFzaCAtZQotCi1ERVNUPSQxCi1HQ0RBPS9zeXMva2VybmVsL2RlYnVnL2djb3YKLQotaWYgWyAteiAiJERFU1QiIF0gOyB0aGVuCi0gIGVjaG8gIlVzYWdlOiAkMCA8b3V0cHV0LnRhci5nej4iID4mMgotICBleGl0IDEKLWZpCi0KLVRFTVBESVI9JChta3RlbXAgLWQpCi1lY2hvIENvbGxlY3RpbmcgZGF0YS4uCi1maW5kICRHQ0RBIC10eXBlIGQgLWV4ZWMgbWtkaXIgLXAgJFRFTVBESVIvXHtcfSBcOwotZmluZCAkR0NEQSAtbmFtZSAnKi5nY2RhJyAtZXhlYyBzaCAtYyAnY2F0IDwgJDAgPiAnJFRFTVBESVInLyQwJyB7fSBcOwotZmluZCAkR0NEQSAtbmFtZSAnKi5nY25vJyAtZXhlYyBzaCAtYyAnY3AgLWQgJDAgJyRURU1QRElSJy8kMCcge30gXDsKLXRhciBjemYgJERFU1QgLUMgJFRFTVBESVIgc3lzCi1ybSAtcmYgJFRFTVBESVIKLQotZWNobyAiJERFU1Qgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIGNvcHkgdG8gYnVpbGQgc3lzdGVtIGFuZCB1bnBhY2sgd2l0aDoiCi1lY2hvICIgIHRhciB4ZnogJERFU1QiCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dkYi1rZXJuZWwtZGVidWdnaW5nLnR4dCBiL0RvY3VtZW50YXRpb24vZ2RiLWtlcm5lbC1kZWJ1Z2dpbmcudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDUwY2U4Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZ2RiLWtlcm5lbC1kZWJ1Z2dpbmcudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLURlYnVnZ2luZyBrZXJuZWwgYW5kIG1vZHVsZXMgdmlhIGdkYgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoZSBrZXJuZWwgZGVidWdnZXIga2dkYiwgaHlwZXJ2aXNvcnMgbGlrZSBRRU1VIG9yIEpUQUctYmFzZWQgaGFyZHdhcmUKLWludGVyZmFjZXMgYWxsb3cgdG8gZGVidWcgdGhlIExpbnV4IGtlcm5lbCBhbmQgaXRzIG1vZHVsZXMgZHVyaW5nIHJ1bnRpbWUKLXVzaW5nIGdkYi4gR2RiIGNvbWVzIHdpdGggYSBwb3dlcmZ1bCBzY3JpcHRpbmcgaW50ZXJmYWNlIGZvciBweXRob24uIFRoZQota2VybmVsIHByb3ZpZGVzIGEgY29sbGVjdGlvbiBvZiBoZWxwZXIgc2NyaXB0cyB0aGF0IGNhbiBzaW1wbGlmeSB0eXBpY2FsCi1rZXJuZWwgZGVidWdnaW5nIHN0ZXBzLiBUaGlzIGlzIGEgc2hvcnQgdHV0b3JpYWwgYWJvdXQgaG93IHRvIGVuYWJsZSBhbmQgdXNlCi10aGVtLiBJdCBmb2N1c2VzIG9uIFFFTVUvS1ZNIHZpcnR1YWwgbWFjaGluZXMgYXMgdGFyZ2V0LCBidXQgdGhlIGV4YW1wbGVzIGNhbgotYmUgdHJhbnNmZXJyZWQgdG8gdGhlIG90aGVyIGdkYiBzdHVicyBhcyB3ZWxsLgotCi0KLVJlcXVpcmVtZW50cwotLS0tLS0tLS0tLS0tCi0KLSBvIGdkYiA3LjIrIChyZWNvbW1lbmRlZDogNy40Kykgd2l0aCBweXRob24gc3VwcG9ydCBlbmFibGVkICh0eXBpY2FsbHkgdHJ1ZQotICAgZm9yIGRpc3RyaWJ1dGlvbnMpCi0KLQotU2V0dXAKLS0tLS0tCi0KLSBvIENyZWF0ZSBhIHZpcnR1YWwgTGludXggbWFjaGluZSBmb3IgUUVNVS9LVk0gKHNlZSB3d3cubGludXgta3ZtLm9yZyBhbmQKLSAgIHd3dy5xZW11Lm9yZyBmb3IgbW9yZSBkZXRhaWxzKS4gRm9yIGNyb3NzLWRldmVsb3BtZW50LAotICAgaHR0cDovL2xhbmRsZXkubmV0L2Fib3JpZ2luYWwvYmluIGtlZXBzIGEgcG9vbCBvZiBtYWNoaW5lIGltYWdlcyBhbmQKLSAgIHRvb2xjaGFpbnMgdGhhdCBjYW4gYmUgaGVscGZ1bCB0byBzdGFydCBmcm9tLgotCi0gbyBCdWlsZCB0aGUga2VybmVsIHdpdGggQ09ORklHX0dEQl9TQ1JJUFRTIGVuYWJsZWQsIGJ1dCBsZWF2ZQotICAgQ09ORklHX0RFQlVHX0lORk9fUkVEVUNFRCBvZmYuIElmIHlvdXIgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzCi0gICBDT05GSUdfRlJBTUVfUE9JTlRFUiwga2VlcCBpdCBlbmFibGVkLgotCi0gbyBJbnN0YWxsIHRoYXQga2VybmVsIG9uIHRoZSBndWVzdC4KLQotICAgQWx0ZXJuYXRpdmVseSwgUUVNVSBhbGxvd3MgdG8gYm9vdCB0aGUga2VybmVsIGRpcmVjdGx5IHVzaW5nIC1rZXJuZWwsCi0gICAtYXBwZW5kLCAtaW5pdHJkIGNvbW1hbmQgbGluZSBzd2l0Y2hlcy4gVGhpcyBpcyBnZW5lcmFsbHkgb25seSB1c2VmdWwgaWYKLSAgIHlvdSBkbyBub3QgZGVwZW5kIG9uIG1vZHVsZXMuIFNlZSBRRU1VIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscyBvbgotICAgdGhpcyBtb2RlLgotCi0gbyBFbmFibGUgdGhlIGdkYiBzdHViIG9mIFFFTVUvS1ZNLCBlaXRoZXIKLSAgICAtIGF0IFZNIHN0YXJ0dXAgdGltZSBieSBhcHBlbmRpbmcgIi1zIiB0byB0aGUgUUVNVSBjb21tYW5kIGxpbmUKLSAgIG9yCi0gICAgLSBkdXJpbmcgcnVudGltZSBieSBpc3N1aW5nICJnZGJzZXJ2ZXIiIGZyb20gdGhlIFFFTVUgbW9uaXRvcgotICAgICAgY29uc29sZQotCi0gbyBjZCAvcGF0aC90by9saW51eC1idWlsZAotCi0gbyBTdGFydCBnZGI6IGdkYiB2bWxpbnV4Ci0KLSAgIE5vdGU6IFNvbWUgZGlzdHJvcyBtYXkgcmVzdHJpY3QgYXV0by1sb2FkaW5nIG9mIGdkYiBzY3JpcHRzIHRvIGtub3duIHNhZmUKLSAgIGRpcmVjdG9yaWVzLiBJbiBjYXNlIGdkYiByZXBvcnRzIHRvIHJlZnVzZSBsb2FkaW5nIHZtbGludXgtZ2RiLnB5LCBhZGQKLQotICAgIGFkZC1hdXRvLWxvYWQtc2FmZS1wYXRoIC9wYXRoL3RvL2xpbnV4LWJ1aWxkCi0KLSAgIHRvIH4vLmdkYmluaXQuIFNlZSBnZGIgaGVscCBmb3IgbW9yZSBkZXRhaWxzLgotCi0gbyBBdHRhY2ggdG8gdGhlIGJvb3RlZCBndWVzdDoKLSAgICAoZ2RiKSB0YXJnZXQgcmVtb3RlIDoxMjM0Ci0KLQotRXhhbXBsZXMgb2YgdXNpbmcgdGhlIExpbnV4LXByb3ZpZGVkIGdkYiBoZWxwZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIG8gTG9hZCBtb2R1bGUgKGFuZCBtYWluIGtlcm5lbCkgc3ltYm9sczoKLSAgICAoZ2RiKSBseC1zeW1ib2xzCi0gICAgbG9hZGluZyB2bWxpbnV4Ci0gICAgc2Nhbm5pbmcgZm9yIG1vZHVsZXMgaW4gL2hvbWUvdXNlci9saW51eC9idWlsZAotICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDAyMDAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9uZXQvbmV0ZmlsdGVyL3h0X3RjcHVkcC5rbwotICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDAxNjAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9uZXQvbmV0ZmlsdGVyL3h0X3BrdHR5cGUua28KLSAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwMDIwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvbmV0L25ldGZpbHRlci94dF9saW1pdC5rbwotICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDBjYTAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9uZXQvcGFja2V0L2FmX3BhY2tldC5rbwotICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDAzYzAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9mcy9mdXNlL2Z1c2Uua28KLSAgICAuLi4KLSAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwMDAwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvZHJpdmVycy9hdGEvYXRhX2dlbmVyaWMua28KLQotIG8gU2V0IGEgYnJlYWtwb2ludCBvbiBzb21lIG5vdCB5ZXQgbG9hZGVkIG1vZHVsZSBmdW5jdGlvbiwgZS5nLjoKLSAgICAoZ2RiKSBiIGJ0cmZzX2luaXRfc3lzZnMKLSAgICBGdW5jdGlvbiAiYnRyZnNfaW5pdF9zeXNmcyIgbm90IGRlZmluZWQuCi0gICAgTWFrZSBicmVha3BvaW50IHBlbmRpbmcgb24gZnV0dXJlIHNoYXJlZCBsaWJyYXJ5IGxvYWQ/ICh5IG9yIFtuXSkgeQotICAgIEJyZWFrcG9pbnQgMSAoYnRyZnNfaW5pdF9zeXNmcykgcGVuZGluZy4KLQotIG8gQ29udGludWUgdGhlIHRhcmdldAotICAgIChnZGIpIGMKLQotIG8gTG9hZCB0aGUgbW9kdWxlIG9uIHRoZSB0YXJnZXQgYW5kIHdhdGNoIHRoZSBzeW1ib2xzIGJlaW5nIGxvYWRlZCBhcyB3ZWxsIGFzCi0gICB0aGUgYnJlYWtwb2ludCBoaXQ6Ci0gICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMDM0MDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL2xpYi9saWJjcmMzMmMua28KLSAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwNTAwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvbGliL2x6by9sem9fY29tcHJlc3Mua28KLSAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwNmUwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvbGliL3psaWJfZGVmbGF0ZS96bGliX2RlZmxhdGUua28KLSAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAxYjEwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvZnMvYnRyZnMvYnRyZnMua28KLQotICAgIEJyZWFrcG9pbnQgMSwgYnRyZnNfaW5pdF9zeXNmcyAoKSBhdCAvaG9tZS91c2VyL2xpbnV4L2ZzL2J0cmZzL3N5c2ZzLmM6MzYKLSAgICAzNiAgICAgICAgICAgICAgYnRyZnNfa3NldCA9IGtzZXRfY3JlYXRlX2FuZF9hZGQoImJ0cmZzIiwgTlVMTCwgZnNfa29iaik7Ci0KLSBvIER1bXAgdGhlIGxvZyBidWZmZXIgb2YgdGhlIHRhcmdldCBrZXJuZWw6Ci0gICAgKGdkYikgbHgtZG1lc2cKLSAgICBbICAgICAwLjAwMDAwMF0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgY3B1c2V0Ci0gICAgWyAgICAgMC4wMDAwMDBdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIGNwdQotICAgIFsgICAgIDAuMDAwMDAwXSBMaW51eCB2ZXJzaW9uIDMuOC4wLXJjNC1kYmcrICguLi4KLSAgICBbICAgICAwLjAwMDAwMF0gQ29tbWFuZCBsaW5lOiByb290PS9kZXYvc2RhMiByZXN1bWU9L2Rldi9zZGExIHZnYT0weDMxNAotICAgIFsgICAgIDAuMDAwMDAwXSBlODIwOiBCSU9TLXByb3ZpZGVkIHBoeXNpY2FsIFJBTSBtYXA6Ci0gICAgWyAgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAwMDAwMDAwMDAwMDAtMHgwMDAwMDAwMDAwMDlmYmZmXSB1c2FibGUKLSAgICBbICAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDAwMDA5ZmMwMC0weDAwMDAwMDAwMDAwOWZmZmZdIHJlc2VydmVkCi0gICAgLi4uLgotCi0gbyBFeGFtaW5lIGZpZWxkcyBvZiB0aGUgY3VycmVudCB0YXNrIHN0cnVjdDoKLSAgICAoZ2RiKSBwICRseF9jdXJyZW50KCkucGlkCi0gICAgJDEgPSA0OTk4Ci0gICAgKGdkYikgcCAkbHhfY3VycmVudCgpLmNvbW0KLSAgICAkMiA9ICJtb2Rwcm9iZVwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiCi0KLSBvIE1ha2UgdXNlIG9mIHRoZSBwZXItY3B1IGZ1bmN0aW9uIGZvciB0aGUgY3VycmVudCBvciBhIHNwZWNpZmllZCBDUFU6Ci0gICAgKGdkYikgcCAkbHhfcGVyX2NwdSgicnVucXVldWVzIikubnJfcnVubmluZwotICAgICQzID0gMQotICAgIChnZGIpIHAgJGx4X3Blcl9jcHUoInJ1bnF1ZXVlcyIsIDIpLm5yX3J1bm5pbmcKLSAgICAkNCA9IDAKLQotIG8gRGlnIGludG8gaHJ0aW1lcnMgdXNpbmcgdGhlIGNvbnRhaW5lcl9vZiBoZWxwZXI6Ci0gICAgKGdkYikgc2V0ICRuZXh0ID0gJGx4X3Blcl9jcHUoImhydGltZXJfYmFzZXMiKS5jbG9ja19iYXNlWzBdLmFjdGl2ZS5uZXh0Ci0gICAgKGdkYikgcCAqJGNvbnRhaW5lcl9vZigkbmV4dCwgInN0cnVjdCBocnRpbWVyIiwgIm5vZGUiKQotICAgICQ1ID0gewotICAgICAgbm9kZSA9IHsKLSAgICAgICAgbm9kZSA9IHsKLSAgICAgICAgICBfX3JiX3BhcmVudF9jb2xvciA9IDE4NDQ2NjEyMTMzMzU1MjU2MDcyLAotICAgICAgICAgIHJiX3JpZ2h0ID0gMHgwIDxpcnFfc3RhY2tfdW5pb24+LAotICAgICAgICAgIHJiX2xlZnQgPSAweDAgPGlycV9zdGFja191bmlvbj4KLSAgICAgICAgfSwKLSAgICAgICAgZXhwaXJlcyA9IHsKLSAgICAgICAgICB0djY0ID0gMTgzNTI2ODAwMDAwMAotICAgICAgICB9Ci0gICAgICB9LAotICAgICAgX3NvZnRleHBpcmVzID0gewotICAgICAgICB0djY0ID0gMTgzNTI2ODAwMDAwMAotICAgICAgfSwKLSAgICAgIGZ1bmN0aW9uID0gMHhmZmZmZmZmZjgxMDc4MjMyIDx0aWNrX3NjaGVkX3RpbWVyPiwKLSAgICAgIGJhc2UgPSAweGZmZmY4ODAwM2ZkMGQ2ZjAsCi0gICAgICBzdGF0ZSA9IDEsCi0gICAgICBzdGFydF9waWQgPSAwLAotICAgICAgc3RhcnRfc2l0ZSA9IDB4ZmZmZmZmZmY4MTA1NWMxZiA8aHJ0aW1lcl9zdGFydF9yYW5nZV9ucysyMD4sCi0gICAgICBzdGFydF9jb21tID0gInN3YXBwZXIvMlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCIKLSAgICB9Ci0KLQotTGlzdCBvZiBjb21tYW5kcyBhbmQgZnVuY3Rpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIG51bWJlciBvZiBjb21tYW5kcyBhbmQgY29udmVuaWVuY2UgZnVuY3Rpb25zIG1heSBldm9sdmUgb3ZlciB0aGUgdGltZSwKLXRoaXMgaXMganVzdCBhIHNuYXBzaG90IG9mIHRoZSBpbml0aWFsIHZlcnNpb246Ci0KLSAoZ2RiKSBhcHJvcG9zIGx4Ci0gZnVuY3Rpb24gbHhfY3VycmVudCAtLSBSZXR1cm4gY3VycmVudCB0YXNrCi0gZnVuY3Rpb24gbHhfbW9kdWxlIC0tIEZpbmQgbW9kdWxlIGJ5IG5hbWUgYW5kIHJldHVybiB0aGUgbW9kdWxlIHZhcmlhYmxlCi0gZnVuY3Rpb24gbHhfcGVyX2NwdSAtLSBSZXR1cm4gcGVyLWNwdSB2YXJpYWJsZQotIGZ1bmN0aW9uIGx4X3Rhc2tfYnlfcGlkIC0tIEZpbmQgTGludXggdGFzayBieSBQSUQgYW5kIHJldHVybiB0aGUgdGFza19zdHJ1Y3QgdmFyaWFibGUKLSBmdW5jdGlvbiBseF90aHJlYWRfaW5mbyAtLSBDYWxjdWxhdGUgTGludXggdGhyZWFkX2luZm8gZnJvbSB0YXNrIHZhcmlhYmxlCi0gbHgtZG1lc2cgLS0gUHJpbnQgTGludXgga2VybmVsIGxvZyBidWZmZXIKLSBseC1sc21vZCAtLSBMaXN0IGN1cnJlbnRseSBsb2FkZWQgbW9kdWxlcwotIGx4LXN5bWJvbHMgLS0gKFJlLSlsb2FkIHN5bWJvbHMgb2YgTGludXgga2VybmVsIGFuZCBjdXJyZW50bHkgbG9hZGVkIG1vZHVsZXMKLQotRGV0YWlsZWQgaGVscCBjYW4gYmUgb2J0YWluZWQgdmlhICJoZWxwIDxjb21tYW5kLW5hbWU+IiBmb3IgY29tbWFuZHMgYW5kICJoZWxwCi1mdW5jdGlvbiA8ZnVuY3Rpb24tbmFtZT4iIGZvciBjb252ZW5pZW5jZSBmdW5jdGlvbnMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dwaW8vYm9hcmQudHh0IGIvRG9jdW1lbnRhdGlvbi9ncGlvL2JvYXJkLnR4dAppbmRleCA4NmQzZmE5Li40MDg4NGM0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2dwaW8vYm9hcmQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZ3Bpby9ib2FyZC50eHQKQEAgLTgsOSArOCw5IEBACiBpbnRlcmZhY2U7IHlvdSBqdXN0IGZldGNoIGFuIGludGVnZXIgZnJvbSBzb21ld2hlcmUgYW5kIHJlcXVlc3QgdGhlCiBjb3JyZXNwb25kaW5nIEdQSU8uCiAKLVBsYXRmb3JtcyB0aGF0IG1ha2UgdXNlIG9mIEdQSU9zIG11c3Qgc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCIChpZiBHUElPIHVzYWdlCi1pcyBtYW5kYXRvcnkpIG9yIEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCIChpZiBHUElPIHN1cHBvcnQgY2FuIGJlIG9taXR0ZWQpIGluCi10aGVpciBLY29uZmlnLiBUaGVuLCBob3cgR1BJT3MgYXJlIG1hcHBlZCBkZXBlbmRzIG9uIHdoYXQgdGhlIHBsYXRmb3JtIHVzZXMgdG8KK0FsbCBwbGF0Zm9ybXMgY2FuIGVuYWJsZSB0aGUgR1BJTyBsaWJyYXJ5LCBidXQgaWYgdGhlIHBsYXRmb3JtIHN0cmljdGx5CityZXF1aXJlcyBHUElPIGZ1bmN0aW9uYWxpdHkgdG8gYmUgcHJlc2VudCwgaXQgbmVlZHMgdG8gc2VsZWN0IEdQSU9MSUIgZnJvbSBpdHMKK0tjb25maWcuIFRoZW4sIGhvdyBHUElPcyBhcmUgbWFwcGVkIGRlcGVuZHMgb24gd2hhdCB0aGUgcGxhdGZvcm0gdXNlcyB0bwogZGVzY3JpYmUgaXRzIGhhcmR3YXJlIGxheW91dC4gQ3VycmVudGx5LCBtYXBwaW5ncyBjYW4gYmUgZGVmaW5lZCB0aHJvdWdoIGRldmljZQogdHJlZSwgQUNQSSwgYW5kIHBsYXRmb3JtIGRhdGEuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ3Bpby9kcml2ZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9ncGlvL2RyaXZlci50eHQKaW5kZXggNmNiMzVhNy4uMzY4ZDVhMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ncGlvL2RyaXZlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ncGlvL2RyaXZlci50eHQKQEAgLTI2Miw2ICsyNjIsMTIgQEAKICAgdG8gdGhlIGNvbnRhaW5lciB1c2luZyBjb250YWluZXJfb2YoKS4KICAgKFNlZSBEb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXNpZ24tcGF0dGVybnMudHh0KQogCisgIElmIHRoZXJlIGlzIGEgbmVlZCB0byBleGNsdWRlIGNlcnRhaW4gR1BJT3MgZnJvbSB0aGUgSVJRIGRvbWFpbiwgb25lIGNhbgorICBzZXQgLmlycV9uZWVkX3ZhbGlkX21hc2sgb2YgdGhlIGdwaW9jaGlwIGJlZm9yZSBncGlvY2hpcF9hZGRfZGF0YSgpIGlzCisgIGNhbGxlZC4gVGhpcyBhbGxvY2F0ZXMgLmlycV92YWxpZF9tYXNrIHdpdGggYXMgbWFueSBiaXRzIHNldCBhcyB0aGVyZSBhcmUKKyAgR1BJT3MgaW4gdGhlIGNoaXAuIERyaXZlcnMgY2FuIGV4Y2x1ZGUgR1BJT3MgYnkgY2xlYXJpbmcgYml0cyBmcm9tIHRoaXMKKyAgbWFzay4gVGhlIG1hc2sgbXVzdCBiZSBmaWxsZWQgaW4gYmVmb3JlIGdwaW9jaGlwX2lycWNoaXBfYWRkKCkgaXMgY2FsbGVkLgorCiAqIGdwaW9jaGlwX3NldF9jaGFpbmVkX2lycWNoaXAoKTogc2V0cyB1cCBhIGNoYWluZWQgaXJxIGhhbmRsZXIgZm9yIGEKICAgZ3Bpb19jaGlwIGZyb20gYSBwYXJlbnQgSVJRIGFuZCBwYXNzZXMgdGhlIHN0cnVjdCBncGlvX2NoaXAqIGFzIGhhbmRsZXIKICAgZGF0YS4gKE5vdGljZSBoYW5kbGVyIGRhdGEsIHNpbmNlIHRoZSBpcnFjaGlwIGRhdGEgaXMgbGlrZWx5IHVzZWQgYnkgdGhlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dwaW8vZ3Bpby1sZWdhY3kudHh0IGIvRG9jdW1lbnRhdGlvbi9ncGlvL2dwaW8tbGVnYWN5LnR4dAppbmRleCA3OWFiNTY0Li5iMzRmZDk0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2dwaW8vZ3Bpby1sZWdhY3kudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZ3Bpby9ncGlvLWxlZ2FjeS50eHQKQEAgLTcyLDggKzcyLDggQEAKIG5vdCBjYXJlIGhvdyBpdCdzIGltcGxlbWVudGVkLikKIAogVGhhdCBzYWlkLCBpZiB0aGUgY29udmVudGlvbiBpcyBzdXBwb3J0ZWQgb24gdGhlaXIgcGxhdGZvcm0sIGRyaXZlcnMgc2hvdWxkCi11c2UgaXQgd2hlbiBwb3NzaWJsZS4gIFBsYXRmb3JtcyBtdXN0IHNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQiBvcgotQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIgaW4gdGhlaXIgS2NvbmZpZy4gIERyaXZlcnMgdGhhdCBjYW4ndCB3b3JrIHdpdGhvdXQKK3VzZSBpdCB3aGVuIHBvc3NpYmxlLiAgUGxhdGZvcm1zIG11c3Qgc2VsZWN0IEdQSU9MSUIgaWYgR1BJTyBmdW5jdGlvbmFsaXR5CitpcyBzdHJpY3RseSByZXF1aXJlZC4gIERyaXZlcnMgdGhhdCBjYW4ndCB3b3JrIHdpdGhvdXQKIHN0YW5kYXJkIEdQSU8gY2FsbHMgc2hvdWxkIGhhdmUgS2NvbmZpZyBlbnRyaWVzIHdoaWNoIGRlcGVuZCBvbiBHUElPTElCLiAgVGhlCiBHUElPIGNhbGxzIGFyZSBhdmFpbGFibGUsIGVpdGhlciBhcyAicmVhbCBjb2RlIiBvciBhcyBvcHRpbWl6ZWQtYXdheSBzdHVicywKIHdoZW4gZHJpdmVycyB1c2UgdGhlIGluY2x1ZGUgZmlsZToKQEAgLTU1MywyMiArNTUzLDE0IEBACiAKIFBsYXRmb3JtIFN1cHBvcnQKIC0tLS0tLS0tLS0tLS0tLS0KLVRvIHN1cHBvcnQgdGhpcyBmcmFtZXdvcmssIGEgcGxhdGZvcm0ncyBLY29uZmlnIHdpbGwgInNlbGVjdCIgZWl0aGVyCi1BUkNIX1JFUVVJUkVfR1BJT0xJQiBvciBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgotYW5kIGFycmFuZ2UgdGhhdCBpdHMgPGFzbS9ncGlvLmg+IGluY2x1ZGVzIDxhc20tZ2VuZXJpYy9ncGlvLmg+IGFuZCBkZWZpbmVzCi10aHJlZSBmdW5jdGlvbnM6IGdwaW9fZ2V0X3ZhbHVlKCksIGdwaW9fc2V0X3ZhbHVlKCksIGFuZCBncGlvX2NhbnNsZWVwKCkuCitUbyBmb3JjZS1lbmFibGUgdGhpcyBmcmFtZXdvcmssIGEgcGxhdGZvcm0ncyBLY29uZmlnIHdpbGwgInNlbGVjdCIgR1BJT0xJQiwKK2Vsc2UgaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gY29uZmlndXJlIHN1cHBvcnQgZm9yIEdQSU8uCiAKIEl0IG1heSBhbHNvIHByb3ZpZGUgYSBjdXN0b20gdmFsdWUgZm9yIEFSQ0hfTlJfR1BJT1MsIHNvIHRoYXQgaXQgYmV0dGVyCiByZWZsZWN0cyB0aGUgbnVtYmVyIG9mIEdQSU9zIGluIGFjdHVhbCB1c2Ugb24gdGhhdCBwbGF0Zm9ybSwgd2l0aG91dAogd2FzdGluZyBzdGF0aWMgdGFibGUgc3BhY2UuICAoSXQgc2hvdWxkIGNvdW50IGJvdGggYnVpbHQtaW4vU29DIEdQSU9zIGFuZAogYWxzbyBvbmVzIG9uIEdQSU8gZXhwYW5kZXJzLgogCi1BUkNIX1JFUVVJUkVfR1BJT0xJQiBtZWFucyB0aGF0IHRoZSBncGlvbGliIGNvZGUgd2lsbCBhbHdheXMgZ2V0IGNvbXBpbGVkCi1pbnRvIHRoZSBrZXJuZWwgb24gdGhhdCBhcmNoaXRlY3R1cmUuCi0KLUFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCIG1lYW5zIHRoZSBncGlvbGliIGNvZGUgZGVmYXVsdHMgdG8gb2ZmIGFuZCB0aGUgdXNlcgotY2FuIGVuYWJsZSBpdCBhbmQgYnVpbGQgaXQgaW50byB0aGUga2VybmVsIG9wdGlvbmFsbHkuCi0KIElmIG5laXRoZXIgb2YgdGhlc2Ugb3B0aW9ucyBhcmUgc2VsZWN0ZWQsIHRoZSBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0CiBHUElPcyB0aHJvdWdoIEdQSU8tbGliIGFuZCB0aGUgY29kZSBjYW5ub3QgYmUgZW5hYmxlZCBieSB0aGUgdXNlci4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ncHUvY29uZi5weSBiL0RvY3VtZW50YXRpb24vZ3B1L2NvbmYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMxNGQxNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ3B1L2NvbmYucHkKQEAgLTAsMCArMSw1IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04OyBtb2RlOiBweXRob24gLSotCisKK3Byb2plY3QgPSAiTGludXggR1BVIERyaXZlciBEZXZlbG9wZXIncyBHdWlkZSIKKwordGFncy5hZGQoInN1YnByb2plY3QiKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ncHUvaW5kZXgucnN0IGIvRG9jdW1lbnRhdGlvbi9ncHUvaW5kZXgucnN0CmluZGV4IGZjYWMwZmEuLjVmZjNkMmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZ3B1L2luZGV4LnJzdAorKysgYi9Eb2N1bWVudGF0aW9uL2dwdS9pbmRleC5yc3QKQEAgLTEyLDMgKzEyLDEwIEBACiAgICBkcm0tdWFwaQogICAgaTkxNQogICAgdmdhLXN3aXRjaGVyb28KKworLi4gb25seTo6ICBzdWJwcm9qZWN0CisKKyAgIEluZGljZXMKKyAgID09PT09PT0KKworICAgKiA6cmVmOmBnZW5pbmRleGAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHNpLnR4dCBiL0RvY3VtZW50YXRpb24vaHNpLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjNmNkNS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2hzaS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi1IU0kgLSBIaWdoLXNwZWVkIFN5bmNocm9ub3VzIFNlcmlhbCBJbnRlcmZhY2UKLQotMS4gSW50cm9kdWN0aW9uCi1+fn5+fn5+fn5+fn5+fn4KLQotSGlnaCBTcGVlZCBTeW5jcm9ub3VzIEludGVyZmFjZSAoSFNJKSBpcyBhIGZ1bGxkdXBsZXgsIGxvdyBsYXRlbmN5IHByb3RvY29sLAotdGhhdCBpcyBvcHRpbWl6ZWQgZm9yIGRpZS1sZXZlbCBpbnRlcmNvbm5lY3QgYmV0d2VlbiBhbiBBcHBsaWNhdGlvbiBQcm9jZXNzb3IKLWFuZCBhIEJhc2ViYW5kIGNoaXBzZXQuIEl0IGhhcyBiZWVuIHNwZWNpZmllZCBieSB0aGUgTUlQSSBhbGxpYW5jZSBpbiAyMDAzIGFuZAotaW1wbGVtZW50ZWQgYnkgbXVsdGlwbGUgdmVuZG9ycyBzaW5jZSB0aGVuLgotCi1UaGUgSFNJIGludGVyZmFjZSBzdXBwb3J0cyBmdWxsIGR1cGxleCBjb21tdW5pY2F0aW9uIG92ZXIgbXVsdGlwbGUgY2hhbm5lbHMKLSh0eXBpY2FsbHkgOCkgYW5kIGlzIGNhcGFibGUgb2YgcmVhY2hpbmcgc3BlZWRzIHVwIHRvIDIwMCBNYml0L3MuCi0KLVRoZSBzZXJpYWwgcHJvdG9jb2wgdXNlcyB0d28gc2lnbmFscywgREFUQSBhbmQgRkxBRyBhcyBjb21iaW5lZCBkYXRhIGFuZCBjbG9jawotc2lnbmFscyBhbmQgYW4gYWRkaXRpb25hbCBSRUFEWSBzaWduYWwgZm9yIGZsb3cgY29udHJvbC4gQW4gYWRkaXRpb25hbCBXQUtFCi1zaWduYWwgY2FuIGJlIHVzZWQgdG8gd2FrZXVwIHRoZSBjaGlwcyBmcm9tIHN0YW5kYnkgbW9kZXMuIFRoZSBzaWduYWxzIGFyZQotY29tbW9ubHkgcHJlZml4ZWQgYnkgQUMgZm9yIHNpZ25hbHMgZ29pbmcgZnJvbSB0aGUgYXBwbGljYXRpb24gZGllIHRvIHRoZQotY2VsbHVsYXIgZGllIGFuZCBDQSBmb3Igc2lnbmFscyBnb2luZyB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KLQotKy0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tKwotfCAgQ2VsbHVsYXIgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBcHBsaWNhdGlvbiAgfAotfCAgICBEaWUgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgRGllICAgICAgfAotfCAgICAgICAgICAgIHwgLSAtIC0gLSAtIC0gQ0FXQUtFIC0gLSAtIC0gLSAtID58ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgVHwtLS0tLS0tLS0tLS0gQ0FEQVRBIC0tLS0tLS0tLS0tLT58UiAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgWHwtLS0tLS0tLS0tLS0gQ0FGTEFHIC0tLS0tLS0tLS0tLT58WCAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHw8LS0tLS0tLS0tLS0gQUNSRUFEWSAtLS0tLS0tLS0tLS18ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHw8IC0gLSAtIC0gLSAgQUNXQUtFIC0gLSAtIC0gLSAtIC18ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgUnw8LS0tLS0tLS0tLS0gQUNEQVRBIC0tLS0tLS0tLS0tLS18VCAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgWHw8LS0tLS0tLS0tLS0gQUNGTEFHIC0tLS0tLS0tLS0tLS18WCAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0gQ0FSRUFEWSAtLS0tLS0tLS0tLT58ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tKwotCi0yLiBIU0kgU3Vic3lzdGVtIGluIExpbnV4Ci1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLUluIHRoZSBMaW51eCBrZXJuZWwgdGhlIGhzaSBzdWJzeXN0ZW0gaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBmb3IgSFNJIGRldmljZXMuCi1UaGUgaHNpIHN1YnN5c3RlbSBjb250YWlucyBkcml2ZXJzIGZvciBoc2kgY29udHJvbGxlcnMgaW5jbHVkaW5nIHN1cHBvcnQgZm9yCi1tdWx0aS1wb3J0IGNvbnRyb2xsZXJzIGFuZCBwcm92aWRlcyBhIGdlbmVyaWMgQVBJIGZvciB1c2luZyB0aGUgSFNJIHBvcnRzLgotCi1JdCBhbHNvIGNvbnRhaW5zIEhTSSBjbGllbnQgZHJpdmVycywgd2hpY2ggbWFrZSB1c2Ugb2YgdGhlIGdlbmVyaWMgQVBJIHRvCi1pbXBsZW1lbnQgYSBwcm90b2NvbCB1c2VkIG9uIHRoZSBIU0kgaW50ZXJmYWNlLiBUaGVzZSBjbGllbnQgZHJpdmVycyBjYW4KLXVzZSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGNoYW5uZWxzLgotCi0zLiBoc2ktY2hhciBEZXZpY2UKLX5+fn5+fn5+fn5+fn5+fn5+fgotCi1FYWNoIHBvcnQgYXV0b21hdGljYWxseSByZWdpc3RlcnMgYSBnZW5lcmljIGNsaWVudCBkcml2ZXIgY2FsbGVkIGhzaV9jaGFyLAotd2hpY2ggcHJvdmlkZXMgYSBjaGFyZWN0ZXIgZGV2aWNlIGZvciB1c2Vyc3BhY2UgcmVwcmVzZW50aW5nIHRoZSBIU0kgcG9ydC4KLUl0IGNhbiBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHZpYSBIU0kgZnJvbSB1c2Vyc3BhY2UuIFVzZXJzcGFjZSBtYXkKLWNvbmZpZ3VyZSB0aGUgaHNpX2NoYXIgZGV2aWNlIHVzaW5nIHRoZSBmb2xsb3dpbmcgaW9jdGwgY29tbWFuZHM6Ci0KLSogSFNDX1JFU0VUOgotIC0gZmx1c2ggdGhlIEhTSSBwb3J0Ci0KLSogSFNDX1NFVF9QTQotIC0gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGNsaWVudC4KLQotKiBIU0NfU0VORF9CUkVBSwotIC0gc2VuZCBicmVhawotCi0qIEhTQ19TRVRfUlgKLSAtIHNldCBSWCBjb25maWd1cmF0aW9uCi0KLSogSFNDX0dFVF9SWAotIC0gZ2V0IFJYIGNvbmZpZ3VyYXRpb24KLQotKiBIU0NfU0VUX1RYCi0gLSBzZXQgVFggY29uZmlndXJhdGlvbgotCi0qIEhTQ19HRVRfVFgKLSAtIGdldCBUWCBjb25maWd1cmF0aW9uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzAgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzAKaW5kZXggOGNlNGFhMC4uZmU2OGUxOGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vYWR0NzQ3MAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzAKQEAgLTY1LDYgKzY1LDIzIEBACiB0ZW1wZXJhdHVyZSBzZW5zb3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBQV00gY29udHJvbCBleGNlZWRzCiBwd20jX2F1dG9fcG9pbnQyX3RlbXAuCiAKK1RoZSBkcml2ZXIgYWxzbyBhbGxvd3MgY29udHJvbCBvZiB0aGUgUFdNIGZyZXF1ZW5jeToKKworKiBwd20xX2ZyZXEKKworVGhlIFBXTSBmcmVxdWVuY3kgaXMgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBvbmUgb2Y6CisKKyogMTEuMCBIegorKiAxNC43IEh6CisqIDIyLjEgSHoKKyogMjkuNCBIegorKiAzNS4zIEh6CisqIDQ0LjEgSHoKKyogNTguOCBIegorKiA4OC4yIEh6CisqIDEuNCBrSHoKKyogMjIuNSBrSHoKKwogTm90ZXMKIC0tLS0tCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vZnRzdGV1dGF0ZXMgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2Z0c3RldXRhdGVzCmluZGV4IDJhMWJmNjkuLjhjMTBhOTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vZnRzdGV1dGF0ZXMKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9mdHN0ZXV0YXRlcwpAQCAtMTksNSArMTksNSBAQAogaW1wbGVtZW50ZWQgaW4gdGhpcyBkcml2ZXIuCiAKIFNwZWNpZmljYXRpb24gb2YgdGhlIGNoaXAgY2FuIGJlIGZvdW5kIGhlcmU6Ci1mdHA6Ly8vcHViL01haW5ib2FyZC1PRU0tU2FsZXMvU2VydmljZXMvU29mdHdhcmUmVG9vbHMvTGludXhfU3lzdGVtTW9uaXRvcmluZyZXYXRjaGRvZyZHUElPL0JNQy1UZXV0YXRlc19TcGVjaWZpY2F0aW9uX1YxLjIxLnBkZgotZnRwOi8vL3B1Yi9NYWluYm9hcmQtT0VNLVNhbGVzL1NlcnZpY2VzL1NvZnR3YXJlJlRvb2xzL0xpbnV4X1N5c3RlbU1vbml0b3JpbmcmV2F0Y2hkb2cmR1BJTy9GdWppdHN1X21haW5ib2FyZHMtMS1TZW5zb3JzX0hvd1RvLWVuLVVTLnBkZgorZnRwOi8vZnRwLnRzLmZ1aml0c3UuY29tL3B1Yi9NYWluYm9hcmQtT0VNLVNhbGVzL1NlcnZpY2VzL1NvZnR3YXJlJlRvb2xzL0xpbnV4X1N5c3RlbU1vbml0b3JpbmcmV2F0Y2hkb2cmR1BJTy9CTUMtVGV1dGF0ZXNfU3BlY2lmaWNhdGlvbl9WMS4yMS5wZGYKK2Z0cDovL2Z0cC50cy5mdWppdHN1LmNvbS9wdWIvTWFpbmJvYXJkLU9FTS1TYWxlcy9TZXJ2aWNlcy9Tb2Z0d2FyZSZUb29scy9MaW51eF9TeXN0ZW1Nb25pdG9yaW5nJldhdGNoZG9nJkdQSU8vRnVqaXRzdV9tYWluYm9hcmRzLTEtU2Vuc29yc19Ib3dUby1lbi1VUy5wZGYKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vaHdtb24ta2VybmVsLWFwaS50eHQgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2h3bW9uLWtlcm5lbC1hcGkudHh0CmluZGV4IDJlY2RiZmMuLmVmOWQ3NDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vaHdtb24ta2VybmVsLWFwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9od21vbi1rZXJuZWwtYXBpLnR4dApAQCAtMzQsNiArMzQsMTkgQEAKIAkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZHJ2ZGF0YSwKIAkJCQkgICAgICAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKmdyb3Vwcyk7CiAKK3N0cnVjdCBkZXZpY2UgKgoraHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZHJ2ZGF0YSwKKwkJCQljb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvICppbmZvLAorCQkJCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpOworCitzdHJ1Y3QgZGV2aWNlICoKK2Rldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgdm9pZCAqZHJ2ZGF0YSwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gKmluZm8sCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzKTsKKwogdm9pZCBod21vbl9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpOwogdm9pZCBkZXZtX2h3bW9uX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKQEAgLTYwLDE1ICs3MywyMjkgQEAKIGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3Vwcy4gSG93ZXZlciwgaXQgaXMgZGV2aWNlIG1hbmFnZWQsIG1lYW5pbmcgdGhlCiBod21vbiBkZXZpY2UgZG9lcyBub3QgaGF2ZSB0byBiZSByZW1vdmVkIGV4cGxpY2l0bHkgYnkgdGhlIHJlbW92YWwgZnVuY3Rpb24uCiAKK2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8gaXMgdGhlIG1vc3QgY29tcHJlaGVuc2l2ZSBhbmQgcHJlZmVycmVkIG1lYW5zCit0byByZWdpc3RlciBhIGhhcmR3YXJlIG1vbml0b3JpbmcgZGV2aWNlLiBJdCBjcmVhdGVzIHRoZSBzdGFuZGFyZCBzeXNmcworYXR0cmlidXRlcyBpbiB0aGUgaGFyZHdhcmUgbW9uaXRvcmluZyBjb3JlLCBsZXR0aW5nIHRoZSBkcml2ZXIgZm9jdXMgb24gcmVhZGluZworZnJvbSBhbmQgd3JpdGluZyB0byB0aGUgY2hpcCBpbnN0ZWFkIG9mIGhhdmluZyB0byBib3RoZXIgd2l0aCBzeXNmcyBhdHRyaWJ1dGVzLgorSXRzIHBhcmFtZXRlcnMgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBiZWxvdy4KKworZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvIGlzIHNpbWlsYXIgdG8KK2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8uIEhvd2V2ZXIsIGl0IGlzIGRldmljZSBtYW5hZ2VkLCBtZWFuaW5nIHRoZQoraHdtb24gZGV2aWNlIGRvZXMgbm90IGhhdmUgdG8gYmUgcmVtb3ZlZCBleHBsaWNpdGx5IGJ5IHRoZSByZW1vdmFsIGZ1bmN0aW9uLgorCiBod21vbl9kZXZpY2VfdW5yZWdpc3RlciBkZXJlZ2lzdGVycyBhIHJlZ2lzdGVyZWQgaGFyZHdhcmUgbW9uaXRvcmluZyBkZXZpY2UuCiBUaGUgcGFyYW1ldGVyIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhlIHBvaW50ZXIgdG8gdGhlIHJlZ2lzdGVyZWQgaGFyZHdhcmUKIG1vbml0b3JpbmcgZGV2aWNlIHN0cnVjdHVyZS4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBkcml2ZXIKIHJlbW92ZSBmdW5jdGlvbiBpZiB0aGUgaGFyZHdhcmUgbW9uaXRvcmluZyBkZXZpY2Ugd2FzIHJlZ2lzdGVyZWQgd2l0aAotaHdtb25fZGV2aWNlX3JlZ2lzdGVyIG9yIHdpdGggaHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzLgoraHdtb25fZGV2aWNlX3JlZ2lzdGVyLCBod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMsIG9yCitod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvLgogCiBkZXZtX2h3bW9uX2RldmljZV91bnJlZ2lzdGVyIGRvZXMgbm90IG5vcm1hbGx5IGhhdmUgdG8gYmUgY2FsbGVkLiBJdCBpcyBvbmx5CiBuZWVkZWQgZm9yIGVycm9yIGhhbmRsaW5nLCBhbmQgb25seSBuZWVkZWQgaWYgdGhlIGRyaXZlciBwcm9iZSBmYWlscyBhZnRlcgotdGhlIGNhbGwgdG8gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMuCit0aGUgY2FsbCB0byBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyBhbmQgaWYgdGhlIGF1dG9tYXRpYworKGRldmljZSBtYW5hZ2VkKSByZW1vdmFsIHdvdWxkIGJlIHRvbyBsYXRlLgorCitVc2luZyBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbygpIHJlZ2lzdGVycyBhIGhhcmR3YXJlIG1vbml0b3JpbmcgZGV2aWNlLgorVGhlIHBhcmFtZXRlcnMgdG8gdGhpcyBmdW5jdGlvbiBhcmUKKworc3RydWN0IGRldmljZSAqZGV2CVBvaW50ZXIgdG8gcGFyZW50IGRldmljZQorY29uc3QgY2hhciAqbmFtZQlEZXZpY2UgbmFtZQordm9pZCAqZHJ2ZGF0YQkJRHJpdmVyIHByaXZhdGUgZGF0YQorY29uc3Qgc3RydWN0IGh3bW9uX2NoaXBfaW5mbyAqaW5mbworCQkJUG9pbnRlciB0byBjaGlwIGRlc2NyaXB0aW9uLgorY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKmdyb3VwcworCQkJTnVsbC10ZXJtaW5hdGVkIGxpc3Qgb2YgYWRkaXRpb25hbCBzeXNmcyBhdHRyaWJ1dGUKKwkJCWdyb3Vwcy4KKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBoYXJkd2FyZSBtb25pdG9yaW5nIGRldmljZQorb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlLgorCitUaGUgaHdtb25fY2hpcF9pbmZvIHN0cnVjdHVyZSBsb29rcyBhcyBmb2xsb3dzLgorCitzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvIHsKKwljb25zdCBzdHJ1Y3QgaHdtb25fb3BzICpvcHM7CisJY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqKmluZm87Cit9OworCitJdCBjb250YWlucyB0aGUgZm9sbG93aW5nIGZpZWxkczoKKworKiBvcHM6CVBvaW50ZXIgdG8gZGV2aWNlIG9wZXJhdGlvbnMuCisqIGluZm86IE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIGRldmljZSBjaGFubmVsIGRlc2NyaXB0b3JzLgorCitUaGUgbGlzdCBvZiBod21vbiBvcGVyYXRpb25zIGlzIGRlZmluZWQgYXM6CisKK3N0cnVjdCBod21vbl9vcHMgeworCXVtb2RlX3QgKCppc192aXNpYmxlKShjb25zdCB2b2lkICosIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkgICAgICB1MzIgYXR0ciwgaW50KTsKKwlpbnQgKCpyZWFkKShzdHJ1Y3QgZGV2aWNlICosIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCSAgICB1MzIgYXR0ciwgaW50LCBsb25nICopOworCWludCAoKndyaXRlKShzdHJ1Y3QgZGV2aWNlICosIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCSAgICAgdTMyIGF0dHIsIGludCwgbG9uZyk7Cit9OworCitJdCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucy4KKworKiBpc192aXNpYmxlOiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBmaWxlIG1vZGUgZm9yIGVhY2ggc3VwcG9ydGVkCisgIGF0dHJpYnV0ZS4gVGhpcyBmdW5jdGlvbiBpcyBtYW5kYXRvcnkuCisKKyogcmVhZDogUG9pbnRlciB0byBhIGZ1bmN0aW9uIGZvciByZWFkaW5nIGEgdmFsdWUgZnJvbSB0aGUgY2hpcC4gVGhpcyBmdW5jdGlvbgorICBpcyBvcHRpb25hbCwgYnV0IG11c3QgYmUgcHJvdmlkZWQgaWYgYW55IHJlYWRhYmxlIGF0dHJpYnV0ZXMgZXhpc3QuCisKKyogd3JpdGU6IFBvaW50ZXIgdG8gYSBmdW5jdGlvbiBmb3Igd3JpdGluZyBhIHZhbHVlIHRvIHRoZSBjaGlwLiBUaGlzIGZ1bmN0aW9uIGlzCisgIG9wdGlvbmFsLCBidXQgbXVzdCBiZSBwcm92aWRlZCBpZiBhbnkgd3JpdGVhYmxlIGF0dHJpYnV0ZXMgZXhpc3QuCisKK0VhY2ggc2Vuc29yIGNoYW5uZWwgaXMgZGVzY3JpYmVkIHdpdGggc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbywgd2hpY2ggaXMKK2RlZmluZWQgYXMgZm9sbG93cy4KKworc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyB7CisJZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZTsKKwl1MzIgKmNvbmZpZzsKK307CisKK0l0IGNvbnRhaW5zIGZvbGxvd2luZyBmaWVsZHM6CisKKyogdHlwZTogVGhlIGhhcmR3YXJlIG1vbml0b3Jpbmcgc2Vuc29yIHR5cGUuCisgIFN1cHBvcnRlZCBzZW5zb3IgdHlwZXMgYXJlCisgICogaHdtb25fY2hpcAkJQSB2aXJ0dWFsIHNlbnNvciB0eXBlLCB1c2VkIHRvIGRlc2NyaWJlIGF0dHJpYnV0ZXMKKwkJCXdoaWNoIGFwcGx5IHRvIHRoZSBlbnRpcmUgY2hpcC4KKyAgKiBod21vbl90ZW1wCQlUZW1wZXJhdHVyZSBzZW5zb3IKKyAgKiBod21vbl9pbgkJVm9sdGFnZSBzZW5zb3IKKyAgKiBod21vbl9jdXJyCQlDdXJyZW50IHNlbnNvcgorICAqIGh3bW9uX3Bvd2VyCQlQb3dlciBzZW5zb3IKKyAgKiBod21vbl9lbmVyZ3kJRW5lcmd5IHNlbnNvcgorICAqIGh3bW9uX2h1bWlkaXR5CUh1bWlkaXR5IHNlbnNvcgorICAqIGh3bW9uX2ZhbgkJRmFuIHNwZWVkIHNlbnNvcgorICAqIGh3bW9uX3B3bQkJUFdNIGNvbnRyb2wKKworKiBjb25maWc6IFBvaW50ZXIgdG8gYSAwLXRlcm1pbmF0ZWQgbGlzdCBvZiBjb25maWd1cmF0aW9uIHZhbHVlcyBmb3IgZWFjaAorICBzZW5zb3Igb2YgdGhlIGdpdmVuIHR5cGUuIEVhY2ggdmFsdWUgaXMgYSBjb21iaW5hdGlvbiBvZiBiaXQgdmFsdWVzCisgIGRlc2NyaWJpbmcgdGhlIGF0dHJpYnV0ZXMgc3VwcG9zZWQgYnkgYSBzaW5nbGUgc2Vuc29yLgorCitBcyBhbiBleGFtcGxlLCBoZXJlIGlzIHRoZSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBmaWxlIGZvciBhIExNNzUgY29tcGF0aWJsZQorc2Vuc29yIGNoaXAuIFRoZSBjaGlwIGhhcyBhIHNpbmdsZSB0ZW1wZXJhdHVyZSBzZW5zb3IuIFRoZSBkcml2ZXIgd2FudHMgdG8KK3JlZ2lzdGVyIHdpdGggdGhlIHRoZXJtYWwgc3Vic3lzdGVtIChIV01PTl9DX1JFR0lTVEVSX1RaKSwgYW5kIGl0IHN1cHBvcnRzCit0aGUgdXBkYXRlX2ludGVydmFsIGF0dHJpYnV0ZSAoSFdNT05fQ19VUERBVEVfSU5URVJWQUwpLiBUaGUgY2hpcCBzdXBwb3J0cworcmVhZGluZyB0aGUgdGVtcGVyYXR1cmUgKEhXTU9OX1RfSU5QVVQpLCBpdCBoYXMgYSBtYXhpbXVtIHRlbXBlcmF0dXJlCityZWdpc3RlciAoSFdNT05fVF9NQVgpIGFzIHdlbGwgYXMgYSBtYXhpbXVtIHRlbXBlcmF0dXJlIGh5c3RlcmVzaXMgcmVnaXN0ZXIKKyhIV01PTl9UX01BWF9IWVNUKS4KKworc3RhdGljIGNvbnN0IHUzMiBsbTc1X2NoaXBfY29uZmlnW10gPSB7CisJSFdNT05fQ19SRUdJU1RFUl9UWiB8IEhXTU9OX0NfVVBEQVRFX0lOVEVSVkFMLAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGxtNzVfY2hpcCA9IHsKKwkudHlwZSA9IGh3bW9uX2NoaXAsCisJLmNvbmZpZyA9IGxtNzVfY2hpcF9jb25maWcsCit9OworCitzdGF0aWMgY29uc3QgdTMyIGxtNzVfdGVtcF9jb25maWdbXSA9IHsKKwlIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9NQVggfCBIV01PTl9UX01BWF9IWVNULAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGxtNzVfdGVtcCA9IHsKKwkudHlwZSA9IGh3bW9uX3RlbXAsCisJLmNvbmZpZyA9IGxtNzVfdGVtcF9jb25maWcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqbG03NV9pbmZvW10gPSB7CisJJmxtNzVfY2hpcCwKKwkmbG03NV90ZW1wLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fb3BzIGxtNzVfaHdtb25fb3BzID0geworCS5pc192aXNpYmxlID0gbG03NV9pc192aXNpYmxlLAorCS5yZWFkID0gbG03NV9yZWFkLAorCS53cml0ZSA9IGxtNzVfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoaXBfaW5mbyBsbTc1X2NoaXBfaW5mbyA9IHsKKwkub3BzID0gJmxtNzVfaHdtb25fb3BzLAorCS5pbmZvID0gbG03NV9pbmZvLAorfTsKKworQSBjb21wbGV0ZSBsaXN0IG9mIGJpdCB2YWx1ZXMgaW5kaWNhdGluZyBpbmRpdmlkdWFsIGF0dHJpYnV0ZSBzdXBwb3J0CitpcyBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgvaHdtb24uaC4gRGVmaW5pdGlvbiBwcmVmaXhlcyBhcmUgYXMgZm9sbG93cy4KKworSFdNT05fQ194eHh4CUNoaXAgYXR0cmlidXRlcywgZm9yIHVzZSB3aXRoIGh3bW9uX2NoaXAuCitIV01PTl9UX3h4eHgJVGVtcGVyYXR1cmUgYXR0cmlidXRlcywgZm9yIHVzZSB3aXRoIGh3bW9uX3RlbXAuCitIV01PTl9JX3h4eHgJVm9sdGFnZSBhdHRyaWJ1dGVzLCBmb3IgdXNlIHdpdGggaHdtb25faW4uCitIV01PTl9DX3h4eHgJQ3VycmVudCBhdHRyaWJ1dGVzLCBmb3IgdXNlIHdpdGggaHdtb25fY3Vyci4KKwkJTm90aWNlIHRoZSBwcmVmaXggb3ZlcmxhcCB3aXRoIGNoaXAgYXR0cmlidXRlcy4KK0hXTU9OX1BfeHh4eAlQb3dlciBhdHRyaWJ1dGVzLCBmb3IgdXNlIHdpdGggaHdtb25fcG93ZXIuCitIV01PTl9FX3h4eHgJRW5lcmd5IGF0dHJpYnV0ZXMsIGZvciB1c2Ugd2l0aCBod21vbl9lbmVyZ3kuCitIV01PTl9IX3h4eHgJSHVtaWRpdHkgYXR0cmlidXRlcywgZm9yIHVzZSB3aXRoIGh3bW9uX2h1bWlkaXR5LgorSFdNT05fRl94eHh4CUZhbiBzcGVlZCBhdHRyaWJ1dGVzLCBmb3IgdXNlIHdpdGggaHdtb25fZmFuLgorSFdNT05fUFdNX3h4eHgJUFdNIGNvbnRyb2wgYXR0cmlidXRlcywgZm9yIHVzZSB3aXRoIGh3bW9uX3B3bS4KKworRHJpdmVyIGNhbGxiYWNrIGZ1bmN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFYWNoIGRyaXZlciBwcm92aWRlcyBpc192aXNpYmxlLCByZWFkLCBhbmQgd3JpdGUgZnVuY3Rpb25zLiBQYXJhbWV0ZXJzCithbmQgcmV0dXJuIHZhbHVlcyBmb3IgdGhvc2UgZnVuY3Rpb25zIGFyZSBhcyBmb2xsb3dzLgorCit1bW9kZV90IGlzX3Zpc2libGVfZnVuYyhjb25zdCB2b2lkICpkYXRhLCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJdTMyIGF0dHIsIGludCBjaGFubmVsKQorCitQYXJhbWV0ZXJzOgorCWRhdGE6CVBvaW50ZXIgdG8gZGV2aWNlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUuCisJdHlwZToJVGhlIHNlbnNvciB0eXBlLgorCWF0dHI6CUF0dHJpYnV0ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIGF0dHJpYnV0ZS4KKwkJRm9yIGV4YW1wbGUsIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIEhXTU9OX1RfSU5QVVQgd291bGQgYmUKKwkJaHdtb25fdGVtcF9pbnB1dC4gRm9yIGNvbXBsZXRlIG1hcHBpbmdzIG9mIGJpdCBmaWVsZHMgdG8KKwkJYXR0cmlidXRlIHZhbHVlcyBwbGVhc2Ugc2VlIGluY2x1ZGUvbGludXgvaHdtb24uaC4KKwljaGFubmVsOlRoZSBzZW5zb3IgY2hhbm5lbCBudW1iZXIuCisKK1JldHVybiB2YWx1ZToKKwlUaGUgZmlsZSBtb2RlIGZvciB0aGlzIGF0dHJpYnV0ZS4gVHlwaWNhbGx5LCB0aGlzIHdpbGwgYmUgMCAodGhlCisJYXR0cmlidXRlIHdpbGwgbm90IGJlIGNyZWF0ZWQpLCBTX0lSVUdPLCBvciAnU19JUlVHTyB8IFNfSVdVU1InLgorCitpbnQgcmVhZF9mdW5jKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkgICAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnZhbCkKKworUGFyYW1ldGVyczoKKwlkZXY6CVBvaW50ZXIgdG8gdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcgZGV2aWNlLgorCXR5cGU6CVRoZSBzZW5zb3IgdHlwZS4KKwlhdHRyOglBdHRyaWJ1dGUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBhdHRyaWJ1dGUuCisJCUZvciBleGFtcGxlLCB0aGUgYXR0cmlidXRlIHZhbHVlIGZvciBIV01PTl9UX0lOUFVUIHdvdWxkIGJlCisJCWh3bW9uX3RlbXBfaW5wdXQuIEZvciBjb21wbGV0ZSBtYXBwaW5ncyBwbGVhc2Ugc2VlCisJCWluY2x1ZGUvbGludXgvaHdtb24uaC4KKwljaGFubmVsOlRoZSBzZW5zb3IgY2hhbm5lbCBudW1iZXIuCisJdmFsOglQb2ludGVyIHRvIGF0dHJpYnV0ZSB2YWx1ZS4KKworUmV0dXJuIHZhbHVlOgorCTAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb3RoZXJ3aXNlLgorCitpbnQgd3JpdGVfZnVuYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJICAgICAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyB2YWwpCisKK1BhcmFtZXRlcnM6CisJZGV2OglQb2ludGVyIHRvIHRoZSBoYXJkd2FyZSBtb25pdG9yaW5nIGRldmljZS4KKwl0eXBlOglUaGUgc2Vuc29yIHR5cGUuCisJYXR0cjoJQXR0cmlidXRlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgYXR0cmlidXRlLgorCQlGb3IgZXhhbXBsZSwgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgSFdNT05fVF9JTlBVVCB3b3VsZCBiZQorCQlod21vbl90ZW1wX2lucHV0LiBGb3IgY29tcGxldGUgbWFwcGluZ3MgcGxlYXNlIHNlZQorCQlpbmNsdWRlL2xpbnV4L2h3bW9uLmguCisJY2hhbm5lbDpUaGUgc2Vuc29yIGNoYW5uZWwgbnVtYmVyLgorCXZhbDoJVGhlIHZhbHVlIHRvIHdyaXRlIHRvIHRoZSBjaGlwLgorCitSZXR1cm4gdmFsdWU6CisJMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIG51bWJlciBvdGhlcndpc2UuCisKKworRHJpdmVyLXByb3ZpZGVkIHN5c2ZzIGF0dHJpYnV0ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHRoZSBoYXJkd2FyZSBtb25pdG9yaW5nIGRldmljZSBpcyByZWdpc3RlcmVkIHdpdGgKK2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8gb3IgZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvLAoraXQgaXMgbW9zdCBsaWtlbHkgbm90IG5lY2Vzc2FyeSB0byBwcm92aWRlIHN5c2ZzIGF0dHJpYnV0ZXMuIE9ubHkgbm9uLXN0YW5kYXJkCitzeXNmcyBhdHRyaWJ1dGVzIG5lZWQgdG8gYmUgcHJvdmlkZWQgd2hlbiBvbmUgb2YgdGhvc2UgcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucworaXMgdXNlZC4KIAogVGhlIGhlYWRlciBmaWxlIGxpbnV4L2h3bW9uLXN5c2ZzLmggcHJvdmlkZXMgYSBudW1iZXIgb2YgdXNlZnVsIG1hY3JvcyB0bwogZGVjbGFyZSBhbmQgdXNlIGhhcmR3YXJlIG1vbml0b3Jpbmcgc3lzZnMgYXR0cmlidXRlcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbWF4NjY1MCBiL0RvY3VtZW50YXRpb24vaHdtb24vbWF4NjY1MAppbmRleCA1OGQ5NjQ0Li5kZmYxZDI5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL21heDY2NTAKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9tYXg2NjUwCkBAIC0zNCw2ICszNCw3IEBACiBmYW40X2lucHV0CXJvCSIKIGZhbjFfdGFyZ2V0CXJ3CWRlc2lyZWQgZmFuIHNwZWVkIGluIFJQTSAoY2xvc2VkIGxvb3AgbW9kZSBvbmx5KQogcHdtMV9lbmFibGUJcncJcmVndWxhdG9yIG1vZGUsIDA9ZnVsbCBvbiwgMT1vcGVuIGxvb3AsIDI9Y2xvc2VkIGxvb3AKKwkJCTM9b2ZmCiBwd20xCQlydwlyZWxhdGl2ZSBzcGVlZCAoMC0yNTUpLCAyNTU9bWF4LiBzcGVlZC4KIAkJCVVzZWQgaW4gb3BlbiBsb29wIG1vZGUgb25seS4KIGZhbjFfZGl2CXJ3CXNldHMgdGhlIHNwZWVkIHJhbmdlIHRoZSBpbnB1dHMgY2FuIGhhbmRsZS4gTGVnYWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vdWNkOTAwMCBiL0RvY3VtZW50YXRpb24vaHdtb24vdWNkOTAwMAppbmRleCA4MDVlMzNlLi4yNjJlNzEzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3VjZDkwMDAKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi91Y2Q5MDAwCkBAIC0yLDEyICsyLDEzIEBACiA9PT09PT09PT09PT09PT09PT09PT0KIAogU3VwcG9ydGVkIGNoaXBzOgotICAqIFRJIFVDRDkwMTIwLCBVQ0Q5MDEyNCwgVUNEOTA5MCwgYW5kIFVDRDkwOTEwCi0gICAgUHJlZml4ZXM6ICd1Y2Q5MDEyMCcsICd1Y2Q5MDEyNCcsICd1Y2Q5MDkwJywgJ3VjZDkwOTEwJworICAqIFRJIFVDRDkwMTIwLCBVQ0Q5MDEyNCwgVUNEOTAxNjAsIFVDRDkwOTAsIGFuZCBVQ0Q5MDkxMAorICAgIFByZWZpeGVzOiAndWNkOTAxMjAnLCAndWNkOTAxMjQnLCAndWNkOTAxNjAnLCAndWNkOTA5MCcsICd1Y2Q5MDkxMCcKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogLQogICAgIERhdGFzaGVldHM6CiAJaHR0cDovL2ZvY3VzLnRpLmNvbS9saXQvZHMvc3ltbGluay91Y2Q5MDEyMC5wZGYKIAlodHRwOi8vZm9jdXMudGkuY29tL2xpdC9kcy9zeW1saW5rL3VjZDkwMTI0LnBkZgorCWh0dHA6Ly9mb2N1cy50aS5jb20vbGl0L2RzL3N5bWxpbmsvdWNkOTAxNjAucGRmCiAJaHR0cDovL2ZvY3VzLnRpLmNvbS9saXQvZHMvc3ltbGluay91Y2Q5MDkwLnBkZgogCWh0dHA6Ly9mb2N1cy50aS5jb20vbGl0L2RzL3N5bWxpbmsvdWNkOTA5MTAucGRmCiAKQEAgLTMyLDYgKzMzLDEzIEBACiBmdW5jdGlvbmFsaXR5LiBVc2luZyB0aGVzZSBwaW5zLCB0aGUgVUNEOTAxMjQgb2ZmZXJzIHN1cHBvcnQgZm9yIGZhbiBjb250cm9sLAogbWFyZ2luaW5nLCBhbmQgZ2VuZXJhbC1wdXJwb3NlIFBXTSBmdW5jdGlvbnMuCiAKK1RoZSBVQ0Q5MDE2MCBpcyBhIDE2LXJhaWwgUE1CdXMvSTJDIGFkZHJlc3NhYmxlIHBvd2VyLXN1cHBseSBzZXF1ZW5jZXIgYW5kCittb25pdG9yLiBUaGUgZGV2aWNlIGludGVncmF0ZXMgYSAxMi1iaXQgQURDIGZvciBtb25pdG9yaW5nIHVwIHRvIDE2IHBvd2VyLXN1cHBseQordm9sdGFnZSBpbnB1dHMuIFR3ZW50eS1zaXggR1BJTyBwaW5zIGNhbiBiZSB1c2VkIGZvciBwb3dlciBzdXBwbHkgZW5hYmxlcywKK3Bvd2VyLW9uIHJlc2V0IHNpZ25hbHMsIGV4dGVybmFsIGludGVycnVwdHMsIGNhc2NhZGluZywgb3Igb3RoZXIgc3lzdGVtCitmdW5jdGlvbnMuIFR3ZWx2ZSBvZiB0aGVzZSBwaW5zIG9mZmVyIFBXTSBmdW5jdGlvbmFsaXR5LiBVc2luZyB0aGVzZSBwaW5zLCB0aGUKK1VDRDkwMTYwIG9mZmVycyBzdXBwb3J0IGZvciBtYXJnaW5pbmcsIGFuZCBnZW5lcmFsLXB1cnBvc2UgUFdNIGZ1bmN0aW9ucy4KKwogVGhlIFVDRDkwOTAgaXMgYSAxMC1yYWlsIFBNQnVzL0kyQyBhZGRyZXNzYWJsZSBwb3dlci1zdXBwbHkgc2VxdWVuY2VyIGFuZAogbW9uaXRvci4gVGhlIGRldmljZSBpbnRlZ3JhdGVzIGEgMTItYml0IEFEQyBmb3IgbW9uaXRvcmluZyB1cCB0byAxMCBwb3dlci1zdXBwbHkKIHZvbHRhZ2UgaW5wdXRzLiBUd2VudHktdGhyZWUgR1BJTyBwaW5zIGNhbiBiZSB1c2VkIGZvciBwb3dlciBzdXBwbHkgZW5hYmxlcywKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24veGdlbmUtaHdtb24gYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3hnZW5lLWh3bW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYzUwZWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3hnZW5lLWh3bW9uCkBAIC0wLDAgKzEsMzAgQEAKK0tlcm5lbCBkcml2ZXIgeGdlbmUtaHdtb24KKz09PT09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgY2hpcHM6CisgKiBBUE0gWC1HZW5lIFNvQworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhpcyBkcml2ZXIgYWRkcyBoYXJkd2FyZSB0ZW1wZXJhdHVyZSBhbmQgcG93ZXIgcmVhZGluZyBzdXBwb3J0IGZvcgorQVBNIFgtR2VuZSBTb0MgdXNpbmcgdGhlIG1haWxib3ggY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UuCitGb3IgZGV2aWNlIHRyZWUsIGl0IGlzIHRoZSBzdGFuZGFyZCBEVCBtYWlsYm94LgorRm9yIEFDUEksIGl0IGlzIHRoZSBQQ0MgbWFpbGJveC4KKworVGhlIGZvbGxvd2luZyBzZW5zb3JzIGFyZSBzdXBwb3J0ZWQKKworICAqIFRlbXBlcmF0dXJlCisgICAgLSBTb0Mgb24tZGllIHRlbXBlcmF0dXJlIGluIG1pbGxpLWRlZ3JlZSBDCisgICAgLSBBbGFybSB3aGVuIGhpZ2gvb3ZlciB0ZW1wZXJhdHVyZSBvY2N1cnMKKyAgKiBQb3dlcgorICAgIC0gQ1BVIHBvd2VyIGluIHVXCisgICAgLSBJTyBwb3dlciBpbiB1VworCitzeXNmcy1JbnRlcmZhY2UKKy0tLS0tLS0tLS0tLS0tLQorCit0ZW1wMF9pbnB1dCAtIFNvQyBvbi1kaWUgdGVtcGVyYXR1cmUgKG1pbGxpLWRlZ3JlZSBDKQordGVtcDBfY3JpdGljYWxfYWxhcm0gLSBBbiAxIHdvdWxkIGluZGljYXRlcyBvbi1kaWUgdGVtcGVyYXR1cmUgZXhjZWVkZWQgdGhyZXNob2xkCitwb3dlcjBfaW5wdXQgLSBDUFUgcG93ZXIgaW4gKHVXKQorcG93ZXIxX2lucHV0IC0gSU8gcG93ZXIgaW4gKHVXKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvc2xhdmUtaW50ZXJmYWNlIGIvRG9jdW1lbnRhdGlvbi9pMmMvc2xhdmUtaW50ZXJmYWNlCmluZGV4IDgwODA3YWQuLjdlMmEyMjggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaTJjL3NsYXZlLWludGVyZmFjZQorKysgYi9Eb2N1bWVudGF0aW9uL2kyYy9zbGF2ZS1pbnRlcmZhY2UKQEAgLTE0NSw2ICsxNDUsMTEgQEAKIAogKiBDYXRjaCB0aGUgc2xhdmUgaW50ZXJydXB0cyBhbmQgc2VuZCBhcHByb3ByaWF0ZSBpMmNfc2xhdmVfZXZlbnRzIHRvIHRoZSBiYWNrZW5kLgogCitOb3RlIHRoYXQgbW9zdCBoYXJkd2FyZSBzdXBwb3J0cyBiZWluZyBtYXN0ZXIgX2FuZF8gc2xhdmUgb24gdGhlIHNhbWUgYnVzLiBTbywKK2lmIHlvdSBleHRlbmQgYSBidXMgZHJpdmVyLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgdGhlIGRyaXZlciBzdXBwb3J0cyB0aGF0IGFzCit3ZWxsLiBJbiBhbG1vc3QgYWxsIGNhc2VzLCBzbGF2ZSBzdXBwb3J0IGRvZXMgbm90IG5lZWQgdG8gZGlzYWJsZSB0aGUgbWFzdGVyCitmdW5jdGlvbmFsaXR5LgorCiBDaGVjayB0aGUgaTJjLXJjYXIgZHJpdmVyIGFzIGFuIGV4YW1wbGUuCiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9paW8vaWlvX2NvbmZpZ2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vaWlvL2lpb19jb25maWdmcy50eHQKaW5kZXggZjBhZGQzNS4uNGU1ZjEwMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9paW8vaWlvX2NvbmZpZ2ZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lpby9paW9fY29uZmlnZnMudHh0CkBAIC04Miw4ICs4Miw4IEBACiAKIGUuZzoKIAotJCBta2RpciAvY29uZmlnL3RyaWdnZXJzL2hydGltZXIvaW5zdGFuY2UxCi0kIHJtZGlyIC9jb25maWcvdHJpZ2dlcnMvaHJ0aW1lci9pbnN0YW5jZTEKKyQgbWtkaXIgL2NvbmZpZy9paW8vdHJpZ2dlcnMvaHJ0aW1lci9pbnN0YW5jZTEKKyQgcm1kaXIgL2NvbmZpZy9paW8vdHJpZ2dlcnMvaHJ0aW1lci9pbnN0YW5jZTEKIAogRWFjaCB0cmlnZ2VyIGNhbiBoYXZlIG9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgc3BlY2lmaWMgdG8gdGhlIHRyaWdnZXIgdHlwZS4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbmRleC5yc3QgYi9Eb2N1bWVudGF0aW9uL2luZGV4LnJzdAppbmRleCBlMGZjNzI5Li5kOWNjYjk0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2luZGV4LnJzdAorKysgYi9Eb2N1bWVudGF0aW9uL2luZGV4LnJzdApAQCAtNiwyMiArNiwxOSBAQAogV2VsY29tZSB0byBUaGUgTGludXggS2VybmVsJ3MgZG9jdW1lbnRhdGlvbiEKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLU5vdGhpbmcgZm9yIHlvdSB0byBzZWUgaGVyZSAqeWV0Ki4gUGxlYXNlIG1vdmUgYWxvbmcuCi0KIENvbnRlbnRzOgogCiAuLiB0b2N0cmVlOjoKICAgIDptYXhkZXB0aDogMgogCiAgICBrZXJuZWwtZG9jdW1lbnRhdGlvbgotICAgbWVkaWEvbWVkaWFfdWFwaQotICAgbWVkaWEvbWVkaWFfa2FwaQotICAgbWVkaWEvZHZiLWRyaXZlcnMvaW5kZXgKLSAgIG1lZGlhL3Y0bC1kcml2ZXJzL2luZGV4CisgICBkZXZlbG9wbWVudC1wcm9jZXNzL2luZGV4CisgICBkZXYtdG9vbHMvdG9vbHMKKyAgIGRyaXZlci1hcGkvaW5kZXgKKyAgIG1lZGlhL2luZGV4CiAgICBncHUvaW5kZXgKIAogSW5kaWNlcyBhbmQgdGFibGVzCiA9PT09PT09PT09PT09PT09PT0KIAogKiA6cmVmOmBnZW5pbmRleGAKLSogOnJlZjpgc2VhcmNoYApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbmZpbmliYW5kL3N5c2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vaW5maW5pYmFuZC9zeXNmcy50eHQKaW5kZXggNDViY2FmZS4uNzc1NzBkMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pbmZpbmliYW5kL3N5c2ZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2luZmluaWJhbmQvc3lzZnMudHh0CkBAIC04OSw2ICs4OSwzNiBAQAogICAgbmN0eHRzIC0gbnVtYmVyIG9mIGFsbG93ZWQgY29udGV4dHMgKFBTTTIpCiAgICBjaGlwX3Jlc2V0IC0gZGlhZ25vc3RpYyAocm9vdCBvbmx5KQogICAgYm9hcmR2ZXJzaW9uIC0gYm9hcmQgdmVyc2lvbgorCisgICBzZG1hPE4+LyAtIG9uZSBkaXJlY3RvcnkgcGVyIHNkbWEgZW5naW5lICgwIC0gMTUpCisJc2RtYTxOPi9jcHVfbGlzdCAtIHJlYWQtd3JpdGUsIGxpc3Qgb2YgY3B1cyBmb3IgdXNlci1wcm9jZXNzIHRvIHNkbWEKKwkJCSAgIGVuZ2luZSBhc3NpZ25tZW50LgorCXNkbWE8Tj4vdmwgLSByZWFkLW9ubHksIHZsIHRoZSBzZG1hIGVuZ2luZSBtYXBzIHRvLgorCisJVGhlIG5ldyBpbnRlcmZhY2Ugd2lsbCBnaXZlIHRoZSB1c2VyIGNvbnRyb2wgb24gdGhlIGFmZmluaXR5IHNldHRpbmdzCisJZm9yIHRoZSBoZmkxIGRldmljZS4KKwlBcyBhbiBleGFtcGxlLCB0byBzZXQgYW4gc2RtYSBlbmdpbmUgaXJxIGFmZmluaXR5IGFuZCB0aHJlYWQgYWZmaW5pdHkKKwlvZiBhIHVzZXIgcHJvY2Vzc2VzIHRvIHVzZSB0aGUgc2RtYSBlbmdpbmUsIHdoaWNoIGlzICJuZWFyIiBpbiB0ZXJtcworCW9mIE5VTUEgY29uZmlndXJhdGlvbiwgb3IgcGh5c2ljYWwgY3B1IGxvY2F0aW9uLCB0aGUgdXNlciB3aWxsIGRvOgorCisJZWNobyAiMyIgPiAvcHJvYy9pcnEvPE4+L3NtcF9hZmZpbml0eV9saXN0CisJZWNobyAiNC03IiA+IC9zeXMvZGV2aWNlcy8uLi4vc2RtYTMvY3B1X2xpc3QKKwljYXQgL3N5cy9kZXZpY2VzLy4uLi9zZG1hMy92bAorCTAKKwllY2hvICI4IiA+IC9wcm9jL2lycS88TT4vc21wX2FmZmluaXR5X2xpc3QKKwllY2hvICI5LTEyIiA+IC9zeXMvZGV2aWNlcy8uLi4vc2RtYTQvY3B1X2xpc3QKKwljYXQgL3N5cy9kZXZpY2VzLy4uLi9zZG1hNC92bAorCTEKKworCXRvIG1ha2Ugc3VyZSB0aGF0IHdoZW4gYSBwcm9jZXNzIHJ1bnMgb24gY3B1cyA0LDUsNiwgb3IgNywKKwlhbmQgdXNlcyB2bD0wLCB0aGVuIHNkbWEgZW5naW5lIDMgaXMgc2VsZWN0ZWQgYnkgdGhlIGRyaXZlciwKKwlhbmQgYWxzbyB0aGUgaW50ZXJydXB0IG9mIHRoZSBzZG1hIGVuZ2luZSAzIGlzIHN0ZWVyZWQgdG8gY3B1IDMuCisJU2ltaWxhcmx5LCB3aGVuIGEgcHJvY2VzcyBydW5zIG9uIGNwdXMgOSwxMCwxMSwgb3IgMTIgYW5kIHNldHMgdmw9MSwKKwl0aGVuIGVuZ2luZSA0IHdpbGwgYmUgc2VsZWN0ZWQgYW5kIHRoZSBpcnEgb2YgdGhlIHNkbWEgZW5naW5lIDQgaXMKKwlzdGVlcmVkIHRvIGNwdSA4LgorCVRoaXMgYXNzdW1lcyB0aGF0IGluIHRoZSBhYm92ZSBOIGlzIHRoZSBpcnEgbnVtYmVyIG9mICJzZG1hMyIsCisJYW5kIE0gaXMgaXJxIG51bWJlciBvZiAic2RtYTQiIGluIHRoZSAvcHJvYy9pbnRlcnJ1cHRzIGZpbGUuCisKICAgIHBvcnRzLzEvCiAgICAgICAgICAgQ0NNZ3RBLwogICAgICAgICAgICAgICAgY2Nfc2V0dGluZ3NfYmluIC0gQ0NBIHRhYmxlcyB1c2VkIGJ5IFBTTTIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW9jdGwvYm90Y2hpbmctdXAtaW9jdGxzLnR4dCBiL0RvY3VtZW50YXRpb24vaW9jdGwvYm90Y2hpbmctdXAtaW9jdGxzLnR4dAppbmRleCBjYzMwYjE0Li4zNjEzOGM2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2lvY3RsL2JvdGNoaW5nLXVwLWlvY3Rscy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pb2N0bC9ib3RjaGluZy11cC1pb2N0bHMudHh0CkBAIC0zNCwxNSArMzQsMTggQEAKICAgIDY0LWJpdCBwbGF0Zm9ybXMgZG8uIFNvIHdlIGFsd2F5cyBuZWVkIHBhZGRpbmcgdG8gdGhlIG5hdHVyYWwgc2l6ZSB0byBnZXQKICAgIHRoaXMgcmlnaHQuCiAKLSAqIFBhZCB0aGUgZW50aXJlIHN0cnVjdCB0byBhIG11bHRpcGxlIG9mIDY0LWJpdHMgLSB0aGUgc3RydWN0dXJlIHNpemUgd2lsbAotICAgb3RoZXJ3aXNlIGRpZmZlciBvbiAzMi1iaXQgdmVyc3VzIDY0LWJpdC4gSGF2aW5nIGEgZGlmZmVyZW50IHN0cnVjdHVyZSBzaXplCi0gICBodXJ0cyB3aGVuIHBhc3NpbmcgYXJyYXlzIG9mIHN0cnVjdHVyZXMgdG8gdGhlIGtlcm5lbCwgb3IgaWYgdGhlIGtlcm5lbAotICAgY2hlY2tzIHRoZSBzdHJ1Y3R1cmUgc2l6ZSwgd2hpY2ggZS5nLiB0aGUgZHJtIGNvcmUgZG9lcy4KKyAqIFBhZCB0aGUgZW50aXJlIHN0cnVjdCB0byBhIG11bHRpcGxlIG9mIDY0LWJpdHMgaWYgdGhlIHN0cnVjdHVyZSBjb250YWlucworICAgNjQtYml0IHR5cGVzIC0gdGhlIHN0cnVjdHVyZSBzaXplIHdpbGwgb3RoZXJ3aXNlIGRpZmZlciBvbiAzMi1iaXQgdmVyc3VzCisgICA2NC1iaXQuIEhhdmluZyBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUgc2l6ZSBodXJ0cyB3aGVuIHBhc3NpbmcgYXJyYXlzIG9mCisgICBzdHJ1Y3R1cmVzIHRvIHRoZSBrZXJuZWwsIG9yIGlmIHRoZSBrZXJuZWwgY2hlY2tzIHRoZSBzdHJ1Y3R1cmUgc2l6ZSwgd2hpY2gKKyAgIGUuZy4gdGhlIGRybSBjb3JlIGRvZXMuCiAKICAqIFBvaW50ZXJzIGFyZSBfX3U2NCwgY2FzdCBmcm9tL3RvIGEgdWludHBydF90IG9uIHRoZSB1c2Vyc3BhY2Ugc2lkZSBhbmQKICAgIGZyb20vdG8gYSB2b2lkIF9fdXNlciAqIGluIHRoZSBrZXJuZWwuIFRyeSByZWFsbHkgaGFyZCBub3QgdG8gZGVsYXkgdGhpcwogICAgY29udmVyc2lvbiBvciB3b3JzZSwgZmlkZGxlIHRoZSByYXcgX191NjQgdGhyb3VnaCB5b3VyIGNvZGUgc2luY2UgdGhhdAotICAgZGltaW5pc2hlcyB0aGUgY2hlY2tpbmcgdG9vbHMgbGlrZSBzcGFyc2UgY2FuIHByb3ZpZGUuCisgICBkaW1pbmlzaGVzIHRoZSBjaGVja2luZyB0b29scyBsaWtlIHNwYXJzZSBjYW4gcHJvdmlkZS4gVGhlIG1hY3JvCisgICB1NjRfdG9fdXNlcl9wdHIgY2FuIGJlIHVzZWQgaW4gdGhlIGtlcm5lbCB0byBhdm9pZCB3YXJuaW5ncyBhYm91dCBpbnRlZ2VycworICAgYW5kIHBvaW50cmVzIG9mIGRpZmZlcmVudCBzaXplcy4KIAogCiBCYXNpY3MKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2FzYW4udHh0IGIvRG9jdW1lbnRhdGlvbi9rYXNhbi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZDk1YjMuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9rYXNhbi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotS2VybmVsQWRkcmVzc1Nhbml0aXplciAoS0FTQU4pCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotMC4gT3ZlcnZpZXcKLT09PT09PT09PT09Ci0KLUtlcm5lbEFkZHJlc3NTQU5pdGl6ZXIgKEtBU0FOKSBpcyBhIGR5bmFtaWMgbWVtb3J5IGVycm9yIGRldGVjdG9yLiBJdCBwcm92aWRlcwotYSBmYXN0IGFuZCBjb21wcmVoZW5zaXZlIHNvbHV0aW9uIGZvciBmaW5kaW5nIHVzZS1hZnRlci1mcmVlIGFuZCBvdXQtb2YtYm91bmRzCi1idWdzLgotCi1LQVNBTiB1c2VzIGNvbXBpbGUtdGltZSBpbnN0cnVtZW50YXRpb24gZm9yIGNoZWNraW5nIGV2ZXJ5IG1lbW9yeSBhY2Nlc3MsCi10aGVyZWZvcmUgeW91IHdpbGwgbmVlZCBhIEdDQyB2ZXJzaW9uIDQuOS4yIG9yIGxhdGVyLiBHQ0MgNS4wIG9yIGxhdGVyIGlzCi1yZXF1aXJlZCBmb3IgZGV0ZWN0aW9uIG9mIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgdG8gc3RhY2sgb3IgZ2xvYmFsIHZhcmlhYmxlcy4KLQotQ3VycmVudGx5IEtBU0FOIGlzIHN1cHBvcnRlZCBvbmx5IGZvciB4ODZfNjQgYXJjaGl0ZWN0dXJlLgotCi0xLiBVc2FnZQotPT09PT09PT0KLQotVG8gZW5hYmxlIEtBU0FOIGNvbmZpZ3VyZSBrZXJuZWwgd2l0aDoKLQotCSAgQ09ORklHX0tBU0FOID0geQotCi1hbmQgY2hvb3NlIGJldHdlZW4gQ09ORklHX0tBU0FOX09VVExJTkUgYW5kIENPTkZJR19LQVNBTl9JTkxJTkUuIE91dGxpbmUgYW5kCi1pbmxpbmUgYXJlIGNvbXBpbGVyIGluc3RydW1lbnRhdGlvbiB0eXBlcy4gVGhlIGZvcm1lciBwcm9kdWNlcyBzbWFsbGVyIGJpbmFyeQotdGhlIGxhdHRlciBpcyAxLjEgLSAyIHRpbWVzIGZhc3Rlci4gSW5saW5lIGluc3RydW1lbnRhdGlvbiByZXF1aXJlcyBhIEdDQwotdmVyc2lvbiA1LjAgb3IgbGF0ZXIuCi0KLUtBU0FOIHdvcmtzIHdpdGggYm90aCBTTFVCIGFuZCBTTEFCIG1lbW9yeSBhbGxvY2F0b3JzLgotRm9yIGJldHRlciBidWcgZGV0ZWN0aW9uIGFuZCBuaWNlciByZXBvcnRpbmcsIGVuYWJsZSBDT05GSUdfU1RBQ0tUUkFDRS4KLQotVG8gZGlzYWJsZSBpbnN0cnVtZW50YXRpb24gZm9yIHNwZWNpZmljIGZpbGVzIG9yIGRpcmVjdG9yaWVzLCBhZGQgYSBsaW5lCi1zaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgdG8gdGhlIHJlc3BlY3RpdmUga2VybmVsIE1ha2VmaWxlOgotCi0gICAgICAgIEZvciBhIHNpbmdsZSBmaWxlIChlLmcuIG1haW4ubyk6Ci0gICAgICAgICAgICAgICAgS0FTQU5fU0FOSVRJWkVfbWFpbi5vIDo9IG4KLQotICAgICAgICBGb3IgYWxsIGZpbGVzIGluIG9uZSBkaXJlY3Rvcnk6Ci0gICAgICAgICAgICAgICAgS0FTQU5fU0FOSVRJWkUgOj0gbgotCi0xLjEgRXJyb3IgcmVwb3J0cwotPT09PT09PT09PT09PT09PT0KLQotQSB0eXBpY2FsIG91dCBvZiBib3VuZHMgYWNjZXNzIHJlcG9ydCBsb29rcyBsaWtlIHRoaXM6Ci0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQlVHOiBBZGRyZXNzU2FuaXRpemVyOiBvdXQgb2YgYm91bmRzIGFjY2VzcyBpbiBrbWFsbG9jX29vYl9yaWdodCsweDY1LzB4NzUgW3Rlc3Rfa2FzYW5dIGF0IGFkZHIgZmZmZjg4MDA2OTNiYzVkMwotV3JpdGUgb2Ygc2l6ZSAxIGJ5IHRhc2sgbW9kcHJvYmUvMTY4OQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUJVRyBrbWFsbG9jLTEyOCAoTm90IHRhaW50ZWQpOiBrYXNhbiBlcnJvcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRGlzYWJsaW5nIGxvY2sgZGVidWdnaW5nIGR1ZSB0byBrZXJuZWwgdGFpbnQKLUlORk86IEFsbG9jYXRlZCBpbiBrbWFsbG9jX29vYl9yaWdodCsweDNkLzB4NzUgW3Rlc3Rfa2FzYW5dIGFnZT0wIGNwdT0wIHBpZD0xNjg5Ci0gX19zbGFiX2FsbG9jKzB4NGI0LzB4NGYwCi0ga21lbV9jYWNoZV9hbGxvY190cmFjZSsweDEwYi8weDE5MAotIGttYWxsb2Nfb29iX3JpZ2h0KzB4M2QvMHg3NSBbdGVzdF9rYXNhbl0KLSBpbml0X21vZHVsZSsweDkvMHg0NyBbdGVzdF9rYXNhbl0KLSBkb19vbmVfaW5pdGNhbGwrMHg5OS8weDIwMAotIGxvYWRfbW9kdWxlKzB4MmNiMy8weDNiMjAKLSBTeVNfZmluaXRfbW9kdWxlKzB4NzYvMHg4MAotIHN5c3RlbV9jYWxsX2Zhc3RwYXRoKzB4MTIvMHgxNwotSU5GTzogU2xhYiAweGZmZmZlYTAwMDFhNGVmMDAgb2JqZWN0cz0xNyB1c2VkPTcgZnA9MHhmZmZmODgwMDY5M2JkNzI4IGZsYWdzPTB4MTAwMDAwMDAwMDA0MDgwCi1JTkZPOiBPYmplY3QgMHhmZmZmODgwMDY5M2JjNTU4IEBvZmZzZXQ9MTM2OCBmcD0weGZmZmY4ODAwNjkzYmM3MjAKLQotQnl0ZXMgYjQgZmZmZjg4MDA2OTNiYzU0ODogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgNWEgNWEgNWEgNWEgNWEgNWEgNWEgNWEgIC4uLi4uLi4uWlpaWlpaWloKLU9iamVjdCBmZmZmODgwMDY5M2JjNTU4OiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiAga2tra2tra2tra2tra2trawotT2JqZWN0IGZmZmY4ODAwNjkzYmM1Njg6IDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiICBra2tra2tra2tra2tra2trCi1PYmplY3QgZmZmZjg4MDA2OTNiYzU3ODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKLU9iamVjdCBmZmZmODgwMDY5M2JjNTg4OiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiAga2tra2tra2tra2tra2trawotT2JqZWN0IGZmZmY4ODAwNjkzYmM1OTg6IDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiICBra2tra2tra2tra2tra2trCi1PYmplY3QgZmZmZjg4MDA2OTNiYzVhODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKLU9iamVjdCBmZmZmODgwMDY5M2JjNWI4OiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiAga2tra2tra2tra2tra2trawotT2JqZWN0IGZmZmY4ODAwNjkzYmM1Yzg6IDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIGE1ICBra2tra2tra2tra2tra2suCi1SZWR6b25lIGZmZmY4ODAwNjkzYmM1ZDg6IGNjIGNjIGNjIGNjIGNjIGNjIGNjIGNjICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4uLi4uLgotUGFkZGluZyBmZmZmODgwMDY5M2JjNzE4OiA1YSA1YSA1YSA1YSA1YSA1YSA1YSA1YSAgICAgICAgICAgICAgICAgICAgICAgICAgWlpaWlpaWloKLUNQVTogMCBQSUQ6IDE2ODkgQ29tbTogbW9kcHJvYmUgVGFpbnRlZDogRyAgICBCICAgICAgICAgIDMuMTguMC1yYzEtbW0xKyAjOTgKLUhhcmR3YXJlIG5hbWU6IFFFTVUgU3RhbmRhcmQgUEMgKGk0NDBGWCArIFBJSVgsIDE5OTYpLCBCSU9TIHJlbC0xLjcuNS0wLWdlNTE0ODhjLTIwMTQwNjAyXzE2NDYxMi1uaWxzc29uLmhvbWUua3JheGVsLm9yZyAwNC8wMS8yMDE0Ci0gZmZmZjg4MDA2OTNiYzAwMCAwMDAwMDAwMDAwMDAwMDAwIGZmZmY4ODAwNjkzYmM1NTggZmZmZjg4MDA2OTIzYmI3OAotIGZmZmZmZmZmODFjYzY4YWUgMDAwMDAwMDAwMDAwMDBmMyBmZmZmODgwMDZkNDA3NjAwIGZmZmY4ODAwNjkyM2JiYTgKLSBmZmZmZmZmZjgxMWZkODQ4IGZmZmY4ODAwNmQ0MDc2MDAgZmZmZmVhMDAwMWE0ZWYwMCBmZmZmODgwMDY5M2JjNTU4Ci1DYWxsIFRyYWNlOgotIFs8ZmZmZmZmZmY4MWNjNjhhZT5dIGR1bXBfc3RhY2srMHg0Ni8weDU4Ci0gWzxmZmZmZmZmZjgxMWZkODQ4Pl0gcHJpbnRfdHJhaWxlcisweGY4LzB4MTYwCi0gWzxmZmZmZmZmZmEwMDAyNmE3Pl0gPyBrbWVtX2NhY2hlX29vYisweGMzLzB4YzMgW3Rlc3Rfa2FzYW5dCi0gWzxmZmZmZmZmZjgxMWZmMGY1Pl0gb2JqZWN0X2VycisweDM1LzB4NDAKLSBbPGZmZmZmZmZmYTAwMDIwNjU+XSA/IGttYWxsb2Nfb29iX3JpZ2h0KzB4NjUvMHg3NSBbdGVzdF9rYXNhbl0KLSBbPGZmZmZmZmZmODEyMGI5ZmE+XSBrYXNhbl9yZXBvcnRfZXJyb3IrMHgzOGEvMHgzZjAKLSBbPGZmZmZmZmZmODEyMGE3OWY+XSA/IGthc2FuX3BvaXNvbl9zaGFkb3crMHgyZi8weDQwCi0gWzxmZmZmZmZmZjgxMjBiMzQ0Pl0gPyBrYXNhbl91bnBvaXNvbl9zaGFkb3crMHgxNC8weDQwCi0gWzxmZmZmZmZmZjgxMjBhNzlmPl0gPyBrYXNhbl9wb2lzb25fc2hhZG93KzB4MmYvMHg0MAotIFs8ZmZmZmZmZmZhMDAwMjZhNz5dID8ga21lbV9jYWNoZV9vb2IrMHhjMy8weGMzIFt0ZXN0X2thc2FuXQotIFs8ZmZmZmZmZmY4MTIwYTk5NT5dIF9fYXNhbl9zdG9yZTErMHg3NS8weGIwCi0gWzxmZmZmZmZmZmEwMDAyNjAxPl0gPyBrbWVtX2NhY2hlX29vYisweDFkLzB4YzMgW3Rlc3Rfa2FzYW5dCi0gWzxmZmZmZmZmZmEwMDAyMDY1Pl0gPyBrbWFsbG9jX29vYl9yaWdodCsweDY1LzB4NzUgW3Rlc3Rfa2FzYW5dCi0gWzxmZmZmZmZmZmEwMDAyMDY1Pl0ga21hbGxvY19vb2JfcmlnaHQrMHg2NS8weDc1IFt0ZXN0X2thc2FuXQotIFs8ZmZmZmZmZmZhMDAwMjZiMD5dIGluaXRfbW9kdWxlKzB4OS8weDQ3IFt0ZXN0X2thc2FuXQotIFs8ZmZmZmZmZmY4MTAwMDJkOT5dIGRvX29uZV9pbml0Y2FsbCsweDk5LzB4MjAwCi0gWzxmZmZmZmZmZjgxMWU0ZTVjPl0gPyBfX3Z1bm1hcCsweGVjLzB4MTYwCi0gWzxmZmZmZmZmZjgxMTE0ZjYzPl0gbG9hZF9tb2R1bGUrMHgyY2IzLzB4M2IyMAotIFs8ZmZmZmZmZmY4MTEwZmQ3MD5dID8gbV9zaG93KzB4MjQwLzB4MjQwCi0gWzxmZmZmZmZmZjgxMTE1ZjA2Pl0gU3lTX2Zpbml0X21vZHVsZSsweDc2LzB4ODAKLSBbPGZmZmZmZmZmODFjZDMxMjk+XSBzeXN0ZW1fY2FsbF9mYXN0cGF0aCsweDEyLzB4MTcKLU1lbW9yeSBzdGF0ZSBhcm91bmQgdGhlIGJ1Z2d5IGFkZHJlc3M6Ci0gZmZmZjg4MDA2OTNiYzMwMDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMKLSBmZmZmODgwMDY5M2JjMzgwOiBmYyBmYyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCBmYwotIGZmZmY4ODAwNjkzYmM0MDA6IGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjCi0gZmZmZjg4MDA2OTNiYzQ4MDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMKLSBmZmZmODgwMDY5M2JjNTAwOiBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyAwMCAwMCAwMCAwMCAwMAotPmZmZmY4ODAwNjkzYmM1ODA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAzIGZjIGZjIGZjIGZjIGZjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgotIGZmZmY4ODAwNjkzYmM2MDA6IGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjCi0gZmZmZjg4MDA2OTNiYzY4MDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMKLSBmZmZmODgwMDY5M2JjNzAwOiBmYyBmYyBmYyBmYyBmYiBmYiBmYiBmYiBmYiBmYiBmYiBmYiBmYiBmYiBmYiBmYgotIGZmZmY4ODAwNjkzYmM3ODA6IGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiCi0gZmZmZjg4MDA2OTNiYzgwMDogZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgaGVhZGVyIG9mIHRoZSByZXBvcnQgZGlzY3JpYmUgd2hhdCBraW5kIG9mIGJ1ZyBoYXBwZW5lZCBhbmQgd2hhdCBraW5kIG9mCi1hY2Nlc3MgY2F1c2VkIGl0LiBJdCdzIGZvbGxvd2VkIGJ5IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYWNjZXNzZWQgc2x1YiBvYmplY3QKLShzZWUgJ1NMVUIgRGVidWcgb3V0cHV0JyBzZWN0aW9uIGluIERvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQgZm9yIGRldGFpbHMpIGFuZAotdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhY2Nlc3NlZCBtZW1vcnkgcGFnZS4KLQotSW4gdGhlIGxhc3Qgc2VjdGlvbiB0aGUgcmVwb3J0IHNob3dzIG1lbW9yeSBzdGF0ZSBhcm91bmQgdGhlIGFjY2Vzc2VkIGFkZHJlc3MuCi1SZWFkaW5nIHRoaXMgcGFydCByZXF1aXJlcyBzb21lIHVuZGVyc3RhbmRpbmcgb2YgaG93IEtBU0FOIHdvcmtzLgotCi1UaGUgc3RhdGUgb2YgZWFjaCA4IGFsaWduZWQgYnl0ZXMgb2YgbWVtb3J5IGlzIGVuY29kZWQgaW4gb25lIHNoYWRvdyBieXRlLgotVGhvc2UgOCBieXRlcyBjYW4gYmUgYWNjZXNzaWJsZSwgcGFydGlhbGx5IGFjY2Vzc2libGUsIGZyZWVkIG9yIGJlIGEgcmVkem9uZS4KLVdlIHVzZSB0aGUgZm9sbG93aW5nIGVuY29kaW5nIGZvciBlYWNoIHNoYWRvdyBieXRlOiAwIG1lYW5zIHRoYXQgYWxsIDggYnl0ZXMKLW9mIHRoZSBjb3JyZXNwb25kaW5nIG1lbW9yeSByZWdpb24gYXJlIGFjY2Vzc2libGU7IG51bWJlciBOICgxIDw9IE4gPD0gNykgbWVhbnMKLXRoYXQgdGhlIGZpcnN0IE4gYnl0ZXMgYXJlIGFjY2Vzc2libGUsIGFuZCBvdGhlciAoOCAtIE4pIGJ5dGVzIGFyZSBub3Q7Ci1hbnkgbmVnYXRpdmUgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIGVudGlyZSA4LWJ5dGUgd29yZCBpcyBpbmFjY2Vzc2libGUuCi1XZSB1c2UgZGlmZmVyZW50IG5lZ2F0aXZlIHZhbHVlcyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRpZmZlcmVudCBraW5kcyBvZgotaW5hY2Nlc3NpYmxlIG1lbW9yeSBsaWtlIHJlZHpvbmVzIG9yIGZyZWVkIG1lbW9yeSAoc2VlIG1tL2thc2FuL2thc2FuLmgpLgotCi1JbiB0aGUgcmVwb3J0IGFib3ZlIHRoZSBhcnJvd3MgcG9pbnQgdG8gdGhlIHNoYWRvdyBieXRlIDAzLCB3aGljaCBtZWFucyB0aGF0Ci10aGUgYWNjZXNzZWQgYWRkcmVzcyBpcyBwYXJ0aWFsbHkgYWNjZXNzaWJsZS4KLQotCi0yLiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzCi09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUZyb20gYSBoaWdoIGxldmVsLCBvdXIgYXBwcm9hY2ggdG8gbWVtb3J5IGVycm9yIGRldGVjdGlvbiBpcyBzaW1pbGFyIHRvIHRoYXQKLW9mIGttZW1jaGVjazogdXNlIHNoYWRvdyBtZW1vcnkgdG8gcmVjb3JkIHdoZXRoZXIgZWFjaCBieXRlIG9mIG1lbW9yeSBpcyBzYWZlCi10byBhY2Nlc3MsIGFuZCB1c2UgY29tcGlsZS10aW1lIGluc3RydW1lbnRhdGlvbiB0byBjaGVjayBzaGFkb3cgbWVtb3J5IG9uIGVhY2gKLW1lbW9yeSBhY2Nlc3MuCi0KLUFkZHJlc3NTYW5pdGl6ZXIgZGVkaWNhdGVzIDEvOCBvZiBrZXJuZWwgbWVtb3J5IHRvIGl0cyBzaGFkb3cgbWVtb3J5Ci0oZS5nLiAxNlRCIHRvIGNvdmVyIDEyOFRCIG9uIHg4Nl82NCkgYW5kIHVzZXMgZGlyZWN0IG1hcHBpbmcgd2l0aCBhIHNjYWxlIGFuZAotb2Zmc2V0IHRvIHRyYW5zbGF0ZSBhIG1lbW9yeSBhZGRyZXNzIHRvIGl0cyBjb3JyZXNwb25kaW5nIHNoYWRvdyBhZGRyZXNzLgotCi1IZXJlIGlzIHRoZSBmdW5jdGlvbiB3aGljaCB0cmFuc2xhdGVzIGFuIGFkZHJlc3MgdG8gaXRzIGNvcnJlc3BvbmRpbmcgc2hhZG93Ci1hZGRyZXNzOgotCi1zdGF0aWMgaW5saW5lIHZvaWQgKmthc2FuX21lbV90b19zaGFkb3coY29uc3Qgdm9pZCAqYWRkcikKLXsKLQlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKWFkZHIgPj4gS0FTQU5fU0hBRE9XX1NDQUxFX1NISUZUKQotCQkrIEtBU0FOX1NIQURPV19PRkZTRVQ7Ci19Ci0KLXdoZXJlIEtBU0FOX1NIQURPV19TQ0FMRV9TSElGVCA9IDMuCi0KLUNvbXBpbGUtdGltZSBpbnN0cnVtZW50YXRpb24gdXNlZCBmb3IgY2hlY2tpbmcgbWVtb3J5IGFjY2Vzc2VzLiBDb21waWxlciBpbnNlcnRzCi1mdW5jdGlvbiBjYWxscyAoX19hc2FuX2xvYWQqKGFkZHIpLCBfX2FzYW5fc3RvcmUqKGFkZHIpKSBiZWZvcmUgZWFjaCBtZW1vcnkKLWFjY2VzcyBvZiBzaXplIDEsIDIsIDQsIDggb3IgMTYuIFRoZXNlIGZ1bmN0aW9ucyBjaGVjayB3aGV0aGVyIG1lbW9yeSBhY2Nlc3MgaXMKLXZhbGlkIG9yIG5vdCBieSBjaGVja2luZyBjb3JyZXNwb25kaW5nIHNoYWRvdyBtZW1vcnkuCi0KLUdDQyA1LjAgaGFzIHBvc3NpYmlsaXR5IHRvIHBlcmZvcm0gaW5saW5lIGluc3RydW1lbnRhdGlvbi4gSW5zdGVhZCBvZiBtYWtpbmcKLWZ1bmN0aW9uIGNhbGxzIEdDQyBkaXJlY3RseSBpbnNlcnRzIHRoZSBjb2RlIHRvIGNoZWNrIHRoZSBzaGFkb3cgbWVtb3J5LgotVGhpcyBvcHRpb24gc2lnbmlmaWNhbnRseSBlbmxhcmdlcyBrZXJuZWwgYnV0IGl0IGdpdmVzIHgxLjEteDIgcGVyZm9ybWFuY2UKLWJvb3N0IG92ZXIgb3V0bGluZSBpbnN0cnVtZW50ZWQga2VybmVsLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rYnVpbGQva2NvbmZpZy1sYW5ndWFnZS50eHQgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9rY29uZmlnLWxhbmd1YWdlLnR4dAppbmRleCBkYjEwMTg1Li4wNjlmY2IzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9rY29uZmlnLWxhbmd1YWdlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9rY29uZmlnLWxhbmd1YWdlLnR4dApAQCAtMjc0LDcgKzI3NCw0NCBAQAogCiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHNpbXBsZSBjb25maWcgZW50cnkgYWJvdmUsIGJ1dCBpdCBhbHNvIGdpdmVzIGEKIGhpbnQgdG8gZnJvbnQgZW5kcywgdGhhdCBhbGwgc3Vib3B0aW9ucyBzaG91bGQgYmUgZGlzcGxheWVkIGFzIGEKLXNlcGFyYXRlIGxpc3Qgb2Ygb3B0aW9ucy4KK3NlcGFyYXRlIGxpc3Qgb2Ygb3B0aW9ucy4gVG8gbWFrZSBzdXJlIGFsbCB0aGUgc3Vib3B0aW9ucyB3aWxsIHJlYWxseQorc2hvdyB1cCB1bmRlciB0aGUgbWVudWNvbmZpZyBlbnRyeSBhbmQgbm90IG91dHNpZGUgb2YgaXQsIGV2ZXJ5IGl0ZW0KK2Zyb20gdGhlIDxjb25maWcgb3B0aW9ucz4gbGlzdCBtdXN0IGRlcGVuZCBvbiB0aGUgbWVudWNvbmZpZyBzeW1ib2wuCitJbiBwcmFjdGljZSwgdGhpcyBpcyBhY2hpZXZlZCBieSB1c2luZyBvbmUgb2YgdGhlIG5leHQgdHdvIGNvbnN0cnVjdHM6CisKKygxKToKK21lbnVjb25maWcgTQoraWYgTQorICAgIGNvbmZpZyBDMQorICAgIGNvbmZpZyBDMgorZW5kaWYKKworKDIpOgorbWVudWNvbmZpZyBNCitjb25maWcgQzEKKyAgICBkZXBlbmRzIG9uIE0KK2NvbmZpZyBDMgorICAgIGRlcGVuZHMgb24gTQorCitJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGVzICgzKSBhbmQgKDQpLCBDMSBhbmQgQzIgc3RpbGwgaGF2ZSB0aGUgTQorZGVwZW5kZW5jeSwgYnV0IHdpbGwgbm90IGFwcGVhciB1bmRlciBtZW51Y29uZmlnIE0gYW55bW9yZSwgYmVjYXVzZQorb2YgQzAsIHdoaWNoIGRvZXNuJ3QgZGVwZW5kIG9uIE06CisKKygzKToKK21lbnVjb25maWcgTQorICAgIGNvbmZpZyBDMAoraWYgTQorICAgIGNvbmZpZyBDMQorICAgIGNvbmZpZyBDMgorZW5kaWYKKworKDQpOgorbWVudWNvbmZpZyBNCitjb25maWcgQzAKK2NvbmZpZyBDMQorICAgIGRlcGVuZHMgb24gTQorY29uZmlnIEMyCisgICAgZGVwZW5kcyBvbiBNCiAKIGNob2ljZXM6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2Nvdi50eHQgYi9Eb2N1bWVudGF0aW9uL2tjb3YudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzlmZjRhLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24va2Nvdi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAota2NvdjogY29kZSBjb3ZlcmFnZSBmb3IgZnV6emluZwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1rY292IGV4cG9zZXMga2VybmVsIGNvZGUgY292ZXJhZ2UgaW5mb3JtYXRpb24gaW4gYSBmb3JtIHN1aXRhYmxlIGZvciBjb3ZlcmFnZS0KLWd1aWRlZCBmdXp6aW5nIChyYW5kb21pemVkIHRlc3RpbmcpLiBDb3ZlcmFnZSBkYXRhIG9mIGEgcnVubmluZyBrZXJuZWwgaXMKLWV4cG9ydGVkIHZpYSB0aGUgImtjb3YiIGRlYnVnZnMgZmlsZS4gQ292ZXJhZ2UgY29sbGVjdGlvbiBpcyBlbmFibGVkIG9uIGEgdGFzawotYmFzaXMsIGFuZCB0aHVzIGl0IGNhbiBjYXB0dXJlIHByZWNpc2UgY292ZXJhZ2Ugb2YgYSBzaW5nbGUgc3lzdGVtIGNhbGwuCi0KLU5vdGUgdGhhdCBrY292IGRvZXMgbm90IGFpbSB0byBjb2xsZWN0IGFzIG11Y2ggY292ZXJhZ2UgYXMgcG9zc2libGUuIEl0IGFpbXMKLXRvIGNvbGxlY3QgbW9yZSBvciBsZXNzIHN0YWJsZSBjb3ZlcmFnZSB0aGF0IGlzIGZ1bmN0aW9uIG9mIHN5c2NhbGwgaW5wdXRzLgotVG8gYWNoaWV2ZSB0aGlzIGdvYWwgaXQgZG9lcyBub3QgY29sbGVjdCBjb3ZlcmFnZSBpbiBzb2Z0L2hhcmQgaW50ZXJydXB0cwotYW5kIGluc3RydW1lbnRhdGlvbiBvZiBzb21lIGluaGVyZW50bHkgbm9uLWRldGVybWluaXN0aWMgcGFydHMgb2Yga2VybmVsIGlzCi1kaXNibGVkIChlLmcuIHNjaGVkdWxlciwgbG9ja2luZykuCi0KLVVzYWdlOgotPT09PT09Ci0KLUNvbmZpZ3VyZSBrZXJuZWwgd2l0aDoKLQotICAgICAgICBDT05GSUdfS0NPVj15Ci0KLUNPTkZJR19LQ09WIHJlcXVpcmVzIGdjYyBidWlsdCBvbiByZXZpc2lvbiAyMzEyOTYgb3IgbGF0ZXIuCi1Qcm9maWxpbmcgZGF0YSB3aWxsIG9ubHkgYmVjb21lIGFjY2Vzc2libGUgb25jZSBkZWJ1Z2ZzIGhhcyBiZWVuIG1vdW50ZWQ6Ci0KLSAgICAgICAgbW91bnQgLXQgZGVidWdmcyBub25lIC9zeXMva2VybmVsL2RlYnVnCi0KLVRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBkZW1vbnN0cmF0ZXMga2NvdiB1c2FnZSBmcm9tIHdpdGhpbiBhIHRlc3QgcHJvZ3JhbToKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLSNkZWZpbmUgS0NPVl9JTklUX1RSQUNFCQkJX0lPUignYycsIDEsIHVuc2lnbmVkIGxvbmcpCi0jZGVmaW5lIEtDT1ZfRU5BQkxFCQkJX0lPKCdjJywgMTAwKQotI2RlZmluZSBLQ09WX0RJU0FCTEUJCQlfSU8oJ2MnLCAxMDEpCi0jZGVmaW5lIENPVkVSX1NJWkUJCQkoNjQ8PDEwKQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0JaW50IGZkOwotCXVuc2lnbmVkIGxvbmcgKmNvdmVyLCBuLCBpOwotCi0JLyogQSBzaW5nbGUgZmQgZGVzY3JpcHRvciBhbGxvd3MgY292ZXJhZ2UgY29sbGVjdGlvbiBvbiBhIHNpbmdsZQotCSAqIHRocmVhZC4KLQkgKi8KLQlmZCA9IG9wZW4oIi9zeXMva2VybmVsL2RlYnVnL2tjb3YiLCBPX1JEV1IpOwotCWlmIChmZCA9PSAtMSkKLQkJcGVycm9yKCJvcGVuIiksIGV4aXQoMSk7Ci0JLyogU2V0dXAgdHJhY2UgbW9kZSBhbmQgdHJhY2Ugc2l6ZS4gKi8KLQlpZiAoaW9jdGwoZmQsIEtDT1ZfSU5JVF9UUkFDRSwgQ09WRVJfU0laRSkpCi0JCXBlcnJvcigiaW9jdGwiKSwgZXhpdCgxKTsKLQkvKiBNbWFwIGJ1ZmZlciBzaGFyZWQgYmV0d2VlbiBrZXJuZWwtIGFuZCB1c2VyLXNwYWNlLiAqLwotCWNvdmVyID0gKHVuc2lnbmVkIGxvbmcqKW1tYXAoTlVMTCwgQ09WRVJfU0laRSAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKLQkJCQkgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwKTsKLQlpZiAoKHZvaWQqKWNvdmVyID09IE1BUF9GQUlMRUQpCi0JCXBlcnJvcigibW1hcCIpLCBleGl0KDEpOwotCS8qIEVuYWJsZSBjb3ZlcmFnZSBjb2xsZWN0aW9uIG9uIHRoZSBjdXJyZW50IHRocmVhZC4gKi8KLQlpZiAoaW9jdGwoZmQsIEtDT1ZfRU5BQkxFLCAwKSkKLQkJcGVycm9yKCJpb2N0bCIpLCBleGl0KDEpOwotCS8qIFJlc2V0IGNvdmVyYWdlIGZyb20gdGhlIHRhaWwgb2YgdGhlIGlvY3RsKCkgY2FsbC4gKi8KLQlfX2F0b21pY19zdG9yZV9uKCZjb3ZlclswXSwgMCwgX19BVE9NSUNfUkVMQVhFRCk7Ci0JLyogVGhhdCdzIHRoZSB0YXJnZXQgc3lzY2FsIGNhbGwuICovCi0JcmVhZCgtMSwgTlVMTCwgMCk7Ci0JLyogUmVhZCBudW1iZXIgb2YgUENzIGNvbGxlY3RlZC4gKi8KLQluID0gX19hdG9taWNfbG9hZF9uKCZjb3ZlclswXSwgX19BVE9NSUNfUkVMQVhFRCk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykKLQkJcHJpbnRmKCIweCVseFxuIiwgY292ZXJbaSArIDFdKTsKLQkvKiBEaXNhYmxlIGNvdmVyYWdlIGNvbGxlY3Rpb24gZm9yIHRoZSBjdXJyZW50IHRocmVhZC4gQWZ0ZXIgdGhpcyBjYWxsCi0JICogY292ZXJhZ2UgY2FuIGJlIGVuYWJsZWQgZm9yIGEgZGlmZmVyZW50IHRocmVhZC4KLQkgKi8KLQlpZiAoaW9jdGwoZmQsIEtDT1ZfRElTQUJMRSwgMCkpCi0JCXBlcnJvcigiaW9jdGwiKSwgZXhpdCgxKTsKLQkvKiBGcmVlIHJlc291cmNlcy4gKi8KLQlpZiAobXVubWFwKGNvdmVyLCBDT1ZFUl9TSVpFICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKLQkJcGVycm9yKCJtdW5tYXAiKSwgZXhpdCgxKTsKLQlpZiAoY2xvc2UoZmQpKQotCQlwZXJyb3IoImNsb3NlIiksIGV4aXQoMSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUFmdGVyIHBpcGluZyB0aHJvdWdoIGFkZHIybGluZSBvdXRwdXQgb2YgdGhlIHByb2dyYW0gbG9va3MgYXMgZm9sbG93czoKLQotU3lTX3JlYWQKLWZzL3JlYWRfd3JpdGUuYzo1NjIKLV9fZmRnZXRfcG9zCi1mcy9maWxlLmM6Nzc0Ci1fX2ZnZXRfbGlnaHQKLWZzL2ZpbGUuYzo3NDYKLV9fZmdldF9saWdodAotZnMvZmlsZS5jOjc1MAotX19mZ2V0X2xpZ2h0Ci1mcy9maWxlLmM6NzYwCi1fX2ZkZ2V0X3BvcwotZnMvZmlsZS5jOjc4NAotU3lTX3JlYWQKLWZzL3JlYWRfd3JpdGUuYzo1NjIKLQotSWYgYSBwcm9ncmFtIG5lZWRzIHRvIGNvbGxlY3QgY292ZXJhZ2UgZnJvbSBzZXZlcmFsIHRocmVhZHMgKGluZGVwZW5kZW50bHkpLAotaXQgbmVlZHMgdG8gb3BlbiAvc3lzL2tlcm5lbC9kZWJ1Zy9rY292IGluIGVhY2ggdGhyZWFkIHNlcGFyYXRlbHkuCi0KLVRoZSBpbnRlcmZhY2UgaXMgZmluZS1ncmFpbmVkIHRvIGFsbG93IGVmZmljaWVudCBmb3JraW5nIG9mIHRlc3QgcHJvY2Vzc2VzLgotVGhhdCBpcywgYSBwYXJlbnQgcHJvY2VzcyBvcGVucyAvc3lzL2tlcm5lbC9kZWJ1Zy9rY292LCBlbmFibGVzIHRyYWNlIG1vZGUsCi1tbWFwcyBjb3ZlcmFnZSBidWZmZXIgYW5kIHRoZW4gZm9ya3MgY2hpbGQgcHJvY2Vzc2VzIGluIGEgbG9vcC4gQ2hpbGQgcHJvY2Vzc2VzCi1vbmx5IG5lZWQgdG8gZW5hYmxlIGNvdmVyYWdlIChkaXNhYmxlIGhhcHBlbnMgYXV0b21hdGljYWxseSBvbiB0aHJlYWQgZW5kKS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2R1bXAva2R1bXAudHh0IGIvRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQKaW5kZXggODhmZjYzZC4uYjBlYjI3YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQKQEAgLTM5Myw2ICszOTMsMTUgQEAKICogV2UgZ2VuZXJhbGx5IGRvbicgaGF2ZSB0byBicmluZyB1cCBhIFNNUCBrZXJuZWwganVzdCB0byBjYXB0dXJlIHRoZQogICBkdW1wLiBIZW5jZSBnZW5lcmFsbHkgaXQgaXMgdXNlZnVsIGVpdGhlciB0byBidWlsZCBhIFVQIGR1bXAtY2FwdHVyZQogICBrZXJuZWwgb3Igc3BlY2lmeSBtYXhjcHVzPTEgb3B0aW9uIHdoaWxlIGxvYWRpbmcgZHVtcC1jYXB0dXJlIGtlcm5lbC4KKyAgTm90ZSwgdGhvdWdoIG1heGNwdXMgYWx3YXlzIHdvcmtzLCB5b3UgaGFkIGJldHRlciByZXBsYWNlIGl0IHdpdGgKKyAgbnJfY3B1cyB0byBzYXZlIG1lbW9yeSBpZiBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgQVJDSCwgc3VjaCBhcyB4ODYuCisKKyogWW91IHNob3VsZCBlbmFibGUgbXVsdGktY3B1IHN1cHBvcnQgaW4gZHVtcC1jYXB0dXJlIGtlcm5lbCBpZiB5b3UgaW50ZW5kCisgIHRvIHVzZSBtdWx0aS10aHJlYWQgcHJvZ3JhbXMgd2l0aCBpdCwgc3VjaCBhcyBwYXJhbGxlbCBkdW1wIGZlYXR1cmUgb2YKKyAgbWFrZWR1bXBmaWxlLiBPdGhlcndpc2UsIHRoZSBtdWx0aS10aHJlYWQgcHJvZ3JhbSBtYXkgaGF2ZSBhIGdyZWF0CisgIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uLiBUbyBlbmFibGUgbXVsdGktY3B1IHN1cHBvcnQsIHlvdSBzaG91bGQgYnJpbmcgdXAgYW4KKyAgU01QIGR1bXAtY2FwdHVyZSBrZXJuZWwgYW5kIHNwZWNpZnkgbWF4Y3B1cy9ucl9jcHVzLCBkaXNhYmxlX2NwdV9hcGljaWQ9W1hdCisgIG9wdGlvbnMgd2hpbGUgbG9hZGluZyBpdC4KIAogKiBGb3IgczM5MHggdGhlcmUgYXJlIHR3byBrZHVtcCBtb2RlczogSWYgYSBFTEYgaGVhZGVyIGlzIHNwZWNpZmllZCB3aXRoCiAgIHRoZSBlbGZjb3JlaGRyPSBrZXJuZWwgcGFyYW1ldGVyLCBpdCBpcyB1c2VkIGJ5IHRoZSBrZHVtcCBrZXJuZWwgYXMgaXQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLWRvY3MudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jcy50eHQKaW5kZXggMWRhZmM1Mi4uMDVhNzg1NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jcy50eHQKQEAgLTEsNzMxICsxLDY1MiBAQAorLi4gX2tlcm5lbF9kb2NzOgogCi0gICAgSW5kZXggb2YgRG9jdW1lbnRhdGlvbiBmb3IgUGVvcGxlIEludGVyZXN0ZWQgaW4gV3JpdGluZyBhbmQvb3IKLQotICAgICAgICAgICAgICAgICAgIFVuZGVyc3RhbmRpbmcgdGhlIExpbnV4IEtlcm5lbC4KK0luZGV4IG9mIERvY3VtZW50YXRpb24gZm9yIFBlb3BsZSBJbnRlcmVzdGVkIGluIFdyaXRpbmcgYW5kL29yIFVuZGVyc3RhbmRpbmcgdGhlIExpbnV4IEtlcm5lbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKICAgICAgICAgICBKdWFuLU1hcmlhbm8gZGUgR295ZW5lY2hlIDxqbXNleWFzQGRpdC51cG0uZXM+CiAKLS8qCi0gKiBUaGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBtYXkgYmUgZm91bmQgYXQ6Ci0gKiAgIGh0dHA6Ly93d3cuZGl0LnVwbS5lcy9+am1zZXlhcy9saW51eC9rZXJuZWwvaGFja2Vycy1kb2NzLmh0bWwKLSAqLworVGhlIG5lZWQgZm9yIGEgZG9jdW1lbnQgbGlrZSB0aGlzIG9uZSBiZWNhbWUgYXBwYXJlbnQgaW4gdGhlCitsaW51eC1rZXJuZWwgbWFpbGluZyBsaXN0IGFzIHRoZSBzYW1lIHF1ZXN0aW9ucywgYXNraW5nIGZvciBwb2ludGVycwordG8gaW5mb3JtYXRpb24sIGFwcGVhcmVkIGFnYWluIGFuZCBhZ2Fpbi4KIAotICAgVGhlIG5lZWQgZm9yIGEgZG9jdW1lbnQgbGlrZSB0aGlzIG9uZSBiZWNhbWUgYXBwYXJlbnQgaW4gdGhlCi0gICBsaW51eC1rZXJuZWwgbWFpbGluZyBsaXN0IGFzIHRoZSBzYW1lIHF1ZXN0aW9ucywgYXNraW5nIGZvciBwb2ludGVycwotICAgdG8gaW5mb3JtYXRpb24sIGFwcGVhcmVkIGFnYWluIGFuZCBhZ2Fpbi4KLSAgIAotICAgRm9ydHVuYXRlbHksIGFzIG1vcmUgYW5kIG1vcmUgcGVvcGxlIGdldCB0byBHTlUvTGludXgsIG1vcmUgYW5kIG1vcmUKLSAgIGdldCBpbnRlcmVzdGVkIGluIHRoZSBLZXJuZWwuIEJ1dCByZWFkaW5nIHRoZSBzb3VyY2VzIGlzIG5vdCBhbHdheXMKLSAgIGVub3VnaC4gSXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kIHRoZSBjb2RlLCBidXQgbWlzcyB0aGUgY29uY2VwdHMsIHRoZQotICAgcGhpbG9zb3BoeSBhbmQgZGVzaWduIGRlY2lzaW9ucyBiZWhpbmQgdGhpcyBjb2RlLgotICAgCi0gICBVbmZvcnR1bmF0ZWx5LCBub3QgbWFueSBkb2N1bWVudHMgYXJlIGF2YWlsYWJsZSBmb3IgYmVnaW5uZXJzIHRvCi0gICBzdGFydC4gQW5kLCBldmVuIGlmIHRoZXkgZXhpc3QsIHRoZXJlIHdhcyBubyAid2VsbC1rbm93biIgcGxhY2Ugd2hpY2gKLSAgIGtlcHQgdHJhY2sgb2YgdGhlbS4gVGhlc2UgbGluZXMgdHJ5IHRvIGNvdmVyIHRoaXMgbGFjay4gQWxsIGRvY3VtZW50cwotICAgYXZhaWxhYmxlIG9uIGxpbmUga25vd24gYnkgdGhlIGF1dGhvciBhcmUgbGlzdGVkLCB3aGlsZSBzb21lIHJlZmVyZW5jZQotICAgYm9va3MgYXJlIGFsc28gbWVudGlvbmVkLgotICAgCi0gICBQTEVBU0UsIGlmIHlvdSBrbm93IGFueSBwYXBlciBub3QgbGlzdGVkIGhlcmUgb3Igd3JpdGUgYSBuZXcgZG9jdW1lbnQsCi0gICBzZW5kIG1lIGFuIGUtbWFpbCwgYW5kIEknbGwgaW5jbHVkZSBhIHJlZmVyZW5jZSB0byBpdCBoZXJlLiBBbnkKLSAgIGNvcnJlY3Rpb25zLCBpZGVhcyBvciBjb21tZW50cyBhcmUgYWxzbyB3ZWxjb21lZC4KLSAgIAotICAgVGhlIHBhcGVycyB0aGF0IGZvbGxvdyBhcmUgbGlzdGVkIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuIEFsbCBhcmUKLSAgIGNhdGFsb2dlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOiB0aGUgZG9jdW1lbnQncyAiVGl0bGUiLCB0aGUKLSAgICJBdXRob3IiL3MsIHRoZSAiVVJMIiB3aGVyZSB0aGV5IGNhbiBiZSBmb3VuZCwgc29tZSAiS2V5d29yZHMiIGhlbHBmdWwKLSAgIHdoZW4gc2VhcmNoaW5nIGZvciBzcGVjaWZpYyB0b3BpY3MsIGFuZCBhIGJyaWVmICJEZXNjcmlwdGlvbiIgb2YgdGhlCi0gICBEb2N1bWVudC4KLSAgIAotICAgRW5qb3khCi0gICAKLSAgICAgT04tTElORSBET0NTOgotICAgICAgIAotICAgICAqIFRpdGxlOiAiTGludXggRGV2aWNlIERyaXZlcnMsIFRoaXJkIEVkaXRpb24iCi0gICAgICAgQXV0aG9yOiBKb25hdGhhbiBDb3JiZXQsIEFsZXNzYW5kcm8gUnViaW5pLCBHcmVnIEtyb2FoLUhhcnRtYW4KLSAgICAgICBVUkw6IGh0dHA6Ly9sd24ubmV0L0tlcm5lbC9MREQzLwotICAgICAgIERlc2NyaXB0aW9uOiBBIDYwMC1wYWdlIGJvb2sgY292ZXJpbmcgdGhlICgyLjYuMTApIGRyaXZlcgotICAgICAgIHByb2dyYW1taW5nIEFQSSBhbmQga2VybmVsIGhhY2tpbmcgaW4gZ2VuZXJhbC4gIEF2YWlsYWJsZSB1bmRlciB0aGUKLSAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlQWxpa2UgMi4wIGxpY2Vuc2UuCitGb3J0dW5hdGVseSwgYXMgbW9yZSBhbmQgbW9yZSBwZW9wbGUgZ2V0IHRvIEdOVS9MaW51eCwgbW9yZSBhbmQgbW9yZQorZ2V0IGludGVyZXN0ZWQgaW4gdGhlIEtlcm5lbC4gQnV0IHJlYWRpbmcgdGhlIHNvdXJjZXMgaXMgbm90IGFsd2F5cworZW5vdWdoLiBJdCBpcyBlYXN5IHRvIHVuZGVyc3RhbmQgdGhlIGNvZGUsIGJ1dCBtaXNzIHRoZSBjb25jZXB0cywgdGhlCitwaGlsb3NvcGh5IGFuZCBkZXNpZ24gZGVjaXNpb25zIGJlaGluZCB0aGlzIGNvZGUuCiAKLSAgICAgKiBUaXRsZTogIlRoZSBMaW51eCBLZXJuZWwiCi0gICAgICAgQXV0aG9yOiBEYXZpZCBBLiBSdXNsaW5nLgotICAgICAgIFVSTDogaHR0cDovL3d3dy50bGRwLm9yZy9MRFAvdGxrL3Rsay5odG1sCi0gICAgICAgS2V5d29yZHM6IGV2ZXJ5dGhpbmchLCBib29rLgotICAgICAgIERlc2NyaXB0aW9uOiBPbiBsaW5lLCAyMDAgcGFnZXMgYm9vayBkZXNjcmliaW5nIG1vc3QgYXNwZWN0cyBvZgotICAgICAgIHRoZSBMaW51eCBLZXJuZWwuIFByb2JhYmx5LCB0aGUgZmlyc3QgcmVmZXJlbmNlIGZvciBiZWdpbm5lcnMuCi0gICAgICAgTG90cyBvZiBpbGx1c3RyYXRpb25zIGV4cGxhaW5pbmcgZGF0YSBzdHJ1Y3R1cmVzIHVzZSBhbmQKLSAgICAgICByZWxhdGlvbnNoaXBzIGluIHRoZSBwdXJlc3QgUmljaGFyZCBXLiBTdGV2ZW5zJyBzdHlsZS4gQ29udGVudHM6Ci0gICAgICAgIjEuLUhhcmR3YXJlIEJhc2ljcywgMi4tU29mdHdhcmUgQmFzaWNzLCAzLi1NZW1vcnkgTWFuYWdlbWVudCwKLSAgICAgICA0Li1Qcm9jZXNzZXMsIDUuLUludGVycHJvY2VzcyBDb21tdW5pY2F0aW9uIE1lY2hhbmlzbXMsIDYuLVBDSSwKLSAgICAgICA3Li1JbnRlcnJ1cHRzIGFuZCBJbnRlcnJ1cHQgSGFuZGxpbmcsIDguLURldmljZSBEcml2ZXJzLCA5Li1UaGUKLSAgICAgICBGaWxlIHN5c3RlbSwgMTAuLU5ldHdvcmtzLCAxMS4tS2VybmVsIE1lY2hhbmlzbXMsIDEyLi1Nb2R1bGVzLAotICAgICAgIDEzLi1UaGUgTGludXggS2VybmVsIFNvdXJjZXMsIEEuLUxpbnV4IERhdGEgU3RydWN0dXJlcywgQi4tVGhlCi0gICAgICAgQWxwaGEgQVhQIFByb2Nlc3NvciwgQy4tVXNlZnVsIFdlYiBhbmQgRlRQIFNpdGVzLCBELi1UaGUgR05VCi0gICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgR2xvc3NhcnkiLiBJbiBzaG9ydDogYSBtdXN0IGhhdmUuCitVbmZvcnR1bmF0ZWx5LCBub3QgbWFueSBkb2N1bWVudHMgYXJlIGF2YWlsYWJsZSBmb3IgYmVnaW5uZXJzIHRvCitzdGFydC4gQW5kLCBldmVuIGlmIHRoZXkgZXhpc3QsIHRoZXJlIHdhcyBubyAid2VsbC1rbm93biIgcGxhY2Ugd2hpY2gKK2tlcHQgdHJhY2sgb2YgdGhlbS4gVGhlc2UgbGluZXMgdHJ5IHRvIGNvdmVyIHRoaXMgbGFjay4gQWxsIGRvY3VtZW50cworYXZhaWxhYmxlIG9uIGxpbmUga25vd24gYnkgdGhlIGF1dGhvciBhcmUgbGlzdGVkLCB3aGlsZSBzb21lIHJlZmVyZW5jZQorYm9va3MgYXJlIGFsc28gbWVudGlvbmVkLgogCi0gICAgICogVGl0bGU6ICJMaW51eCBEZXZpY2UgRHJpdmVycywgMm5kIEVkaXRpb24iCi0gICAgICAgQXV0aG9yOiBBbGVzc2FuZHJvIFJ1YmluaSBhbmQgSm9uYXRoYW4gQ29yYmV0LgotICAgICAgIFVSTDogaHR0cDovL3d3dy54bWwuY29tL2xkZC9jaGFwdGVyL2Jvb2svaW5kZXguaHRtbAotICAgICAgIEtleXdvcmRzOiBkZXZpY2UgZHJpdmVycywgbW9kdWxlcywgZGVidWdnaW5nLCBtZW1vcnksIGhhcmR3YXJlLAotICAgICAgIGludGVycnVwdCBoYW5kbGluZywgY2hhciBkcml2ZXJzLCBibG9jayBkcml2ZXJzLCBrbW9kLCBtbWFwLCBETUEsCi0gICAgICAgYnVzZXMuCi0gICAgICAgRGVzY3JpcHRpb246IE8nUmVpbGx5J3MgcG9wdWxhciBib29rLCBub3cgYWxzbyBvbi1saW5lIHVuZGVyIHRoZQotICAgICAgIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZS4KLSAgICAgICBOb3RlczogWW91IGNhbiBhbHNvIGJ1eSBpdCBpbiBwYXBlci1mb3JtIGZyb20gTydSZWlsbHkuIFNlZSBiZWxvdwotICAgICAgIHVuZGVyIEJPT0tTIChOb3Qgb24tbGluZSkuCitQTEVBU0UsIGlmIHlvdSBrbm93IGFueSBwYXBlciBub3QgbGlzdGVkIGhlcmUgb3Igd3JpdGUgYSBuZXcgZG9jdW1lbnQsCitzZW5kIG1lIGFuIGUtbWFpbCwgYW5kIEknbGwgaW5jbHVkZSBhIHJlZmVyZW5jZSB0byBpdCBoZXJlLiBBbnkKK2NvcnJlY3Rpb25zLCBpZGVhcyBvciBjb21tZW50cyBhcmUgYWxzbyB3ZWxjb21lZC4KIAotICAgICAqIFRpdGxlOiAiQ29uY2VwdHVhbCBBcmNoaXRlY3R1cmUgb2YgdGhlIExpbnV4IEtlcm5lbCIKLSAgICAgICBBdXRob3I6IEl2YW4gVC4gQm93bWFuLgotICAgICAgIFVSTDogaHR0cDovL3BsZy51d2F0ZXJsb28uY2EvCi0gICAgICAgS2V5d29yZHM6IGNvbmNlcHR1YWwgc29mdHdhcmUgYXJjaGl0ZWN0dXJlLCBleHRyYWN0ZWQgZGVzaWduLAotICAgICAgIHJldmVyc2UgZW5naW5lZXJpbmcsIHN5c3RlbSBzdHJ1Y3R1cmUuCi0gICAgICAgRGVzY3JpcHRpb246IENvbmNlcHR1YWwgc29mdHdhcmUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBMaW51eCBrZXJuZWwsCi0gICAgICAgYXV0b21hdGljYWxseSBleHRyYWN0ZWQgZnJvbSB0aGUgc291cmNlIGNvZGUuIFZlcnkgZGV0YWlsZWQuIEdvb2QKLSAgICAgICBmaWd1cmVzLiBHaXZlcyBnb29kIG92ZXJhbGwga2VybmVsIHVuZGVyc3RhbmRpbmcuCitUaGUgcGFwZXJzIHRoYXQgZm9sbG93IGFyZSBsaXN0ZWQgaW4gbm8gcGFydGljdWxhciBvcmRlci4gQWxsIGFyZQorY2F0YWxvZ2VkIHdpdGggdGhlIGZvbGxvd2luZyBmaWVsZHM6IHRoZSBkb2N1bWVudCdzICJUaXRsZSIsIHRoZQorIkF1dGhvciIvcywgdGhlICJVUkwiIHdoZXJlIHRoZXkgY2FuIGJlIGZvdW5kLCBzb21lICJLZXl3b3JkcyIgaGVscGZ1bAord2hlbiBzZWFyY2hpbmcgZm9yIHNwZWNpZmljIHRvcGljcywgYW5kIGEgYnJpZWYgIkRlc2NyaXB0aW9uIiBvZiB0aGUKK0RvY3VtZW50LgogCi0gICAgICogVGl0bGU6ICJDb25jcmV0ZSBBcmNoaXRlY3R1cmUgb2YgdGhlIExpbnV4IEtlcm5lbCIKLSAgICAgICBBdXRob3I6IEl2YW4gVC4gQm93bWFuLCBTYWhlZW0gU2lkZGlxaSwgYW5kIE1leWVyIEMuIFRhbnVhbi4KLSAgICAgICBVUkw6IGh0dHA6Ly9wbGcudXdhdGVybG9vLmNhLwotICAgICAgIEtleXdvcmRzOiBjb25jcmV0ZSBhcmNoaXRlY3R1cmUsIGV4dHJhY3RlZCBkZXNpZ24sIHJldmVyc2UKLSAgICAgICBlbmdpbmVlcmluZywgc3lzdGVtIHN0cnVjdHVyZSwgZGVwZW5kZW5jaWVzLgotICAgICAgIERlc2NyaXB0aW9uOiBDb25jcmV0ZSBhcmNoaXRlY3R1cmUgb2YgdGhlIExpbnV4IGtlcm5lbCwKLSAgICAgICBhdXRvbWF0aWNhbGx5IGV4dHJhY3RlZCBmcm9tIHRoZSBzb3VyY2UgY29kZS4gVmVyeSBkZXRhaWxlZC4gR29vZAotICAgICAgIGZpZ3VyZXMuIEdpdmVzIGdvb2Qgb3ZlcmFsbCBrZXJuZWwgdW5kZXJzdGFuZGluZy4gVGhpcyBwYXBlcnMKLSAgICAgICBmb2N1cyBvbiBsb3dlciBkZXRhaWxzIHRoYW4gaXRzIHByZWRlY2Vzc29yIChmaWxlcywgdmFyaWFibGVzLi4uKS4KK0Vuam95IQogCi0gICAgICogVGl0bGU6ICJMaW51eCBhcyBhIENhc2UgU3R1ZHk6IEl0cyBFeHRyYWN0ZWQgU29mdHdhcmUKLSAgICAgICBBcmNoaXRlY3R1cmUiCi0gICAgICAgQXV0aG9yOiBJdmFuIFQuIEJvd21hbiwgUmljaGFyZCBDLiBIb2x0IGFuZCBOZWlsIFYuIEJyZXdzdGVyLgotICAgICAgIFVSTDogaHR0cDovL3BsZy51d2F0ZXJsb28uY2EvCi0gICAgICAgS2V5d29yZHM6IHNvZnR3YXJlIGFyY2hpdGVjdHVyZSwgYXJjaGl0ZWN0dXJlIHJlY292ZXJ5LAotICAgICAgIHJlZG9jdW1lbnRhdGlvbi4KLSAgICAgICBEZXNjcmlwdGlvbjogUGFwZXIgYXBwZWFyZWQgYXQgSUNTRSc5OSwgTG9zIEFuZ2VsZXMsIE1heSAxNi0yMiwKLSAgICAgICAxOTk5LiBBIG1peHR1cmUgb2YgdGhlIHByZXZpb3VzIHR3byBkb2N1bWVudHMgZnJvbSB0aGUgc2FtZQotICAgICAgIGF1dGhvci4KKy4uIG5vdGU6OgogCi0gICAgICogVGl0bGU6ICJPdmVydmlldyBvZiB0aGUgVmlydHVhbCBGaWxlIFN5c3RlbSIKLSAgICAgICBBdXRob3I6IFJpY2hhcmQgR29vY2guCi0gICAgICAgVVJMOiBodHRwOi8vd3d3Lm1qbXdpcmVkLm5ldC9rZXJuZWwvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0Ci0gICAgICAgS2V5d29yZHM6IFZGUywgRmlsZSBTeXN0ZW0sIG1vdW50aW5nIGZpbGVzeXN0ZW1zLCBvcGVuaW5nIGZpbGVzLAotICAgICAgIGRlbnRyaWVzLCBkY2FjaGUuCi0gICAgICAgRGVzY3JpcHRpb246IEJyaWVmIGludHJvZHVjdGlvbiB0byB0aGUgTGludXggVmlydHVhbCBGaWxlIFN5c3RlbS4KLSAgICAgICBXaGF0IGlzIGl0LCBob3cgaXQgd29ya3MsIG9wZXJhdGlvbnMgdGFrZW4gd2hlbiBvcGVuaW5nIGEgZmlsZSBvcgotICAgICAgIG1vdW50aW5nIGEgZmlsZSBzeXN0ZW0gYW5kIGRlc2NyaXB0aW9uIG9mIGltcG9ydGFudCBkYXRhCi0gICAgICAgc3RydWN0dXJlcyBleHBsYWluaW5nIHRoZSBwdXJwb3NlIG9mIGVhY2ggb2YgdGhlaXIgZW50cmllcy4KKyAgIFRoZSBkb2N1bWVudHMgb24gZWFjaCBzZWN0aW9uIG9mIHRoaXMgZG9jdW1lbnQgYXJlIG9yZGVyZWQgYnkgaXRzCisgICBwdWJsaXNoZWQgZGF0ZSwgZnJvbSB0aGUgbmV3ZXN0IHRvIHRoZSBvbGRlc3QuCiAKLSAgICAgKiBUaXRsZTogIlRoZSBMaW51eCBSQUlELTEsIDQsIDUgQ29kZSIKLSAgICAgICBBdXRob3I6IEluZ28gTW9sbmFyLCBHYWRpIE94bWFuIGFuZCBNaWd1ZWwgZGUgSWNhemEuCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS5waHA/c2lkPTIzOTEKLSAgICAgICBLZXl3b3JkczogUkFJRCwgTUQgZHJpdmVyLgotICAgICAgIERlc2NyaXB0aW9uOiBMaW51eCBKb3VybmFsIEtlcm5lbCBLb3JuZXIgYXJ0aWNsZS4gSGVyZSBpcyBpdHMKLSAgICAgICBhYnN0cmFjdDogIkEgZGVzY3JpcHRpb24gb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSQUlELTEsCi0gICAgICAgUkFJRC00IGFuZCBSQUlELTUgcGVyc29uYWxpdGllcyBvZiB0aGUgTUQgZGV2aWNlIGRyaXZlciBpbiB0aGUKLSAgICAgICBMaW51eCBrZXJuZWwsIHByb3ZpZGluZyB1c2VycyB3aXRoIGhpZ2ggcGVyZm9ybWFuY2UgYW5kIHJlbGlhYmxlLAotICAgICAgIHNlY29uZGFyeS1zdG9yYWdlIGNhcGFiaWxpdHkgdXNpbmcgc29mdHdhcmUiLgorRG9jcyBhdCB0aGUgTGludXggS2VybmVsIHRyZWUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICAgKiBUaXRsZTogIkR5bmFtaWMgS2VybmVsczogTW9kdWxhcml6ZWQgRGV2aWNlIERyaXZlcnMiCi0gICAgICAgQXV0aG9yOiBBbGVzc2FuZHJvIFJ1YmluaS4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXhqb3VybmFsLmNvbS9hcnRpY2xlLnBocD9zaWQ9MTIxOQotICAgICAgIEtleXdvcmRzOiBkZXZpY2UgZHJpdmVyLCBtb2R1bGUsIGxvYWRpbmcvdW5sb2FkaW5nIG1vZHVsZXMsCi0gICAgICAgYWxsb2NhdGluZyByZXNvdXJjZXMuCi0gICAgICAgRGVzY3JpcHRpb246IExpbnV4IEpvdXJuYWwgS2VybmVsIEtvcm5lciBhcnRpY2xlLiBIZXJlIGlzIGl0cwotICAgICAgIGFic3RyYWN0OiAiVGhpcyBpcyB0aGUgZmlyc3Qgb2YgYSBzZXJpZXMgb2YgZm91ciBhcnRpY2xlcwotICAgICAgIGNvLWF1dGhvcmVkIGJ5IEFsZXNzYW5kcm8gUnViaW5pIGFuZCBHZW9yZyBaZXpjaHdpdHogd2hpY2ggcHJlc2VudAotICAgICAgIGEgcHJhY3RpY2FsIGFwcHJvYWNoIHRvIHdyaXRpbmcgTGludXggZGV2aWNlIGRyaXZlcnMgYXMga2VybmVsCi0gICAgICAgbG9hZGFibGUgbW9kdWxlcy4gVGhpcyBpbnN0YWxsbWVudCBwcmVzZW50cyBhbiBpbnRyb2R1Y3Rpb24gdG8gdGhlCi0gICAgICAgdG9waWMsIHByZXBhcmluZyB0aGUgcmVhZGVyIHRvIHVuZGVyc3RhbmQgbmV4dCBtb250aCdzCi0gICAgICAgaW5zdGFsbG1lbnQiLgorVGhlIERvY0Jvb2sgYm9va3Mgc2hvdWxkIGJlIGJ1aWx0IHdpdGggYGBtYWtlIHtodG1sZG9jcyB8IHBzZG9jcyB8IHBkZmRvY3N9YGAuCitUaGUgU3BoaW54IGJvb2tzIHNob3VsZCBiZSBidWlsdCB3aXRoIGBgbWFrZSB7aHRtbGRvY3MgfCBwZGZkb2NzIHwgZXB1YmRvY3N9YGAuCiAKLSAgICAgKiBUaXRsZTogIkR5bmFtaWMgS2VybmVsczogRGlzY292ZXJ5IgotICAgICAgIEF1dGhvcjogQWxlc3NhbmRybyBSdWJpbmkuCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS5waHA/c2lkPTEyMjAKLSAgICAgICBLZXl3b3JkczogY2hhcmFjdGVyIGRyaXZlciwgaW5pdF9tb2R1bGUsIGNsZWFuX3VwIG1vZHVsZSwKLSAgICAgICBhdXRvZGV0ZWN0aW9uLCBtYXlvciBudW1iZXIsIG1pbm9yIG51bWJlciwgZmlsZSBvcGVyYXRpb25zLAotICAgICAgIG9wZW4oKSwgY2xvc2UoKS4KLSAgICAgICBEZXNjcmlwdGlvbjogTGludXggSm91cm5hbCBLZXJuZWwgS29ybmVyIGFydGljbGUuIEhlcmUgaXMgaXRzCi0gICAgICAgYWJzdHJhY3Q6ICJUaGlzIGFydGljbGUsIHRoZSBzZWNvbmQgb2YgZm91ciwgaW50cm9kdWNlcyBwYXJ0IG9mCi0gICAgICAgdGhlIGFjdHVhbCBjb2RlIHRvIGNyZWF0ZSBjdXN0b20gbW9kdWxlIGltcGxlbWVudGluZyBhIGNoYXJhY3RlcgotICAgICAgIGRldmljZSBkcml2ZXIuIEl0IGRlc2NyaWJlcyB0aGUgY29kZSBmb3IgbW9kdWxlIGluaXRpYWxpemF0aW9uIGFuZAotICAgICAgIGNsZWFudXAsIGFzIHdlbGwgYXMgdGhlIG9wZW4oKSBhbmQgY2xvc2UoKSBzeXN0ZW0gY2FsbHMiLgorICAgICogTmFtZTogKipsaW51eC9Eb2N1bWVudGF0aW9uKioKIAotICAgICAqIFRpdGxlOiAiVGhlIERldmlsJ3MgaW4gdGhlIERldGFpbHMiCi0gICAgICAgQXV0aG9yOiBHZW9yZyB2LiBaZXpzY2h3aXR6IGFuZCBBbGVzc2FuZHJvIFJ1YmluaS4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXhqb3VybmFsLmNvbS9hcnRpY2xlLnBocD9zaWQ9MTIyMQotICAgICAgIEtleXdvcmRzOiByZWFkKCksIHdyaXRlKCksIHNlbGVjdCgpLCBpb2N0bCgpLCBibG9ja2luZy9ub24KLSAgICAgICBibG9ja2luZyBtb2RlLCBpbnRlcnJ1cHQgaGFuZGxlci4KLSAgICAgICBEZXNjcmlwdGlvbjogTGludXggSm91cm5hbCBLZXJuZWwgS29ybmVyIGFydGljbGUuIEhlcmUgaXMgaXRzCi0gICAgICAgYWJzdHJhY3Q6ICJUaGlzIGFydGljbGUsIHRoZSB0aGlyZCBvZiBmb3VyIG9uIHdyaXRpbmcgY2hhcmFjdGVyCi0gICAgICAgZGV2aWNlIGRyaXZlcnMsIGludHJvZHVjZXMgY29uY2VwdHMgb2YgcmVhZGluZywgd3JpdGluZywgYW5kIHVzaW5nCi0gICAgICAgaW9jdGwtY2FsbHMiLgorICAgICAgOkF1dGhvcjogTWFueS4KKyAgICAgIDpMb2NhdGlvbjogRG9jdW1lbnRhdGlvbi8KKyAgICAgIDpLZXl3b3JkczogdGV4dCBmaWxlcywgU3BoaW54LCBEb2NCb29rLgorICAgICAgOkRlc2NyaXB0aW9uOiBEb2N1bWVudGF0aW9uIHRoYXQgY29tZXMgd2l0aCB0aGUga2VybmVsIHNvdXJjZXMsCisgICAgICAgIGluc2lkZSB0aGUgRG9jdW1lbnRhdGlvbiBkaXJlY3RvcnkuIFNvbWUgcGFnZXMgZnJvbSB0aGlzIGRvY3VtZW50CisgICAgICAgIChpbmNsdWRpbmcgdGhpcyBkb2N1bWVudCBpdHNlbGYpIGhhdmUgYmVlbiBtb3ZlZCB0aGVyZSwgYW5kIG1pZ2h0CisgICAgICAgIGJlIG1vcmUgdXAgdG8gZGF0ZSB0aGFuIHRoZSB3ZWIgdmVyc2lvbi4KIAotICAgICAqIFRpdGxlOiAiRGlzc2VjdGluZyBJbnRlcnJ1cHRzIGFuZCBCcm93c2luZyBETUEiCi0gICAgICAgQXV0aG9yOiBBbGVzc2FuZHJvIFJ1YmluaSBhbmQgR2Vvcmcgdi4gWmV6c2Nod2l0ei4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXhqb3VybmFsLmNvbS9hcnRpY2xlLnBocD9zaWQ9MTIyMgotICAgICAgIEtleXdvcmRzOiBpbnRlcnJ1cHRzLCBpcnFzLCBETUEsIGJvdHRvbSBoYWx2ZXMsIHRhc2sgcXVldWVzLgotICAgICAgIERlc2NyaXB0aW9uOiBMaW51eCBKb3VybmFsIEtlcm5lbCBLb3JuZXIgYXJ0aWNsZS4gSGVyZSBpcyBpdHMKLSAgICAgICBhYnN0cmFjdDogIlRoaXMgaXMgdGhlIGZvdXJ0aCBpbiBhIHNlcmllcyBvZiBhcnRpY2xlcyBhYm91dAotICAgICAgIHdyaXRpbmcgY2hhcmFjdGVyIGRldmljZSBkcml2ZXJzIGFzIGxvYWRhYmxlIGtlcm5lbCBtb2R1bGVzLiBUaGlzCi0gICAgICAgbW9udGgsIHdlIGZ1cnRoZXIgaW52ZXN0aWdhdGUgdGhlIGZpZWxkIG9mIGludGVycnVwdCBoYW5kbGluZy4KLSAgICAgICBUaG91Z2ggaXQgaXMgY29uY2VwdHVhbGx5IHNpbXBsZSwgcHJhY3RpY2FsIGxpbWl0YXRpb25zIGFuZAotICAgICAgIGNvbnN0cmFpbnRzIG1ha2UgdGhpcyBhbiBgYGludGVyZXN0aW5nJycgcGFydCBvZiBkZXZpY2UgZHJpdmVyCi0gICAgICAgd3JpdGluZywgYW5kIHNldmVyYWwgZGlmZmVyZW50IGZhY2lsaXRpZXMgaGF2ZSBiZWVuIHByb3ZpZGVkIGZvcgotICAgICAgIGRpZmZlcmVudCBzaXR1YXRpb25zLiBXZSBhbHNvIGludmVzdGlnYXRlIHRoZSBjb21wbGV4IHRvcGljIG9mCi0gICAgICAgRE1BIi4KKyAgICAqIFRpdGxlOiAqKlRoZSBLZXJuZWwgSGFja2luZyBIT1dUTyoqCiAKLSAgICAgKiBUaXRsZTogIkRldmljZSBEcml2ZXJzIENvbmNsdWRlZCIKLSAgICAgICBBdXRob3I6IEdlb3JnIHYuIFplenNjaHdpdHouCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS5waHA/c2lkPTEyODcKLSAgICAgICBLZXl3b3JkczogYWRkcmVzcyBzcGFjZXMsIHBhZ2VzLCBwYWdpbmF0aW9uLCBwYWdlIG1hbmFnZW1lbnQsCi0gICAgICAgZGVtYW5kIGxvYWRpbmcsIHN3YXBwaW5nLCBtZW1vcnkgcHJvdGVjdGlvbiwgbWVtb3J5IG1hcHBpbmcsIG1tYXAsCi0gICAgICAgdmlydHVhbCBtZW1vcnkgYXJlYXMgKFZNQXMpLCB2cmVtYXAsIFBDSS4KLSAgICAgICBEZXNjcmlwdGlvbjogRmluYWxseSwgdGhlIGFib3ZlIHR1cm5lZCBvdXQgaW50byBhIGZpdmUgYXJ0aWNsZXMKLSAgICAgICBzZXJpZXMuIFRoaXMgbGF0ZXN0IG9uZSdzIGludHJvZHVjdGlvbiByZWFkczogIlRoaXMgaXMgdGhlIGxhc3Qgb2YKLSAgICAgICBmaXZlIGFydGljbGVzIGFib3V0IGNoYXJhY3RlciBkZXZpY2UgZHJpdmVycy4gSW4gdGhpcyBmaW5hbAotICAgICAgIHNlY3Rpb24sIEdlb3JnIGRlYWxzIHdpdGggbWVtb3J5IG1hcHBpbmcgZGV2aWNlcywgYmVnaW5uaW5nIHdpdGgKLSAgICAgICBhbiBvdmVyYWxsIGRlc2NyaXB0aW9uIG9mIHRoZSBMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBjb25jZXB0cyIuCisgICAgICA6QXV0aG9yOiBWYXJpb3VzIFRhbGVudGVkIFBlb3BsZSwgYW5kIFJ1c3R5LgorICAgICAgOkxvY2F0aW9uOiBEb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWhhY2tpbmcudG1wbAorICAgICAgOktleXdvcmRzOiBIT1dUTywga2VybmVsIGNvbnRleHRzLCBkZWFkbG9jaywgbG9ja2luZywgbW9kdWxlcywKKyAgICAgICAgc3ltYm9scywgcmV0dXJuIGNvbnZlbnRpb25zLgorICAgICAgOkRlc2NyaXB0aW9uOiBGcm9tIHRoZSBJbnRyb2R1Y3Rpb246ICJQbGVhc2UgdW5kZXJzdGFuZCB0aGF0IEkKKyAgICAgICAgbmV2ZXIgd2FudGVkIHRvIHdyaXRlIHRoaXMgZG9jdW1lbnQsIGJlaW5nIGdyb3NzbHkgdW5kZXJxdWFsaWZpZWQsCisgICAgICAgIGJ1dCBJIGFsd2F5cyB3YW50ZWQgdG8gcmVhZCBpdCwgYW5kIHRoaXMgd2FzIHRoZSBvbmx5IHdheS4gSQorICAgICAgICBzaW1wbHkgZXhwbGFpbiBzb21lIGJlc3QgcHJhY3RpY2VzLCBhbmQgZ2l2ZSByZWFkaW5nIGVudHJ5LXBvaW50cworICAgICAgICBpbnRvIHRoZSBrZXJuZWwgc291cmNlcy4gSSBhdm9pZCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzOiB0aGF0J3MKKyAgICAgICAgd2hhdCB0aGUgY29kZSBpcyBmb3IsIGFuZCBJIGlnbm9yZSB3aG9sZSB0cmFjdHMgb2YgdXNlZnVsCisgICAgICAgIHJvdXRpbmVzLiBUaGlzIGRvY3VtZW50IGFzc3VtZXMgZmFtaWxpYXJpdHkgd2l0aCBDLCBhbmQgYW4KKyAgICAgICAgdW5kZXJzdGFuZGluZyBvZiB3aGF0IHRoZSBrZXJuZWwgaXMsIGFuZCBob3cgaXQgaXMgdXNlZC4gSXQgd2FzCisgICAgICAgIG9yaWdpbmFsbHkgd3JpdHRlbiBmb3IgdGhlIDIuMyBrZXJuZWxzLCBidXQgbmVhcmx5IGFsbCBvZiBpdAorICAgICAgICBhcHBsaWVzIHRvIDIuMiB0b287IDIuMCBpcyBzbGlnaHRseSBkaWZmZXJlbnQiLgogCi0gICAgICogVGl0bGU6ICJOZXR3b3JrIEJ1ZmZlcnMgQW5kIE1lbW9yeSBNYW5hZ2VtZW50IgotICAgICAgIEF1dGhvcjogQWxhbiBDb3guCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS5waHA/c2lkPTEzMTIKLSAgICAgICBLZXl3b3Jkczogc2tfYnVmZnMsIG5ldHdvcmsgZGV2aWNlcywgcHJvdG9jb2wvbGluayBsYXllcgotICAgICAgIHZhcmlhYmxlcywgbmV0d29yayBkZXZpY2VzIGZsYWdzLCB0cmFuc21pdCwgcmVjZWl2ZSwKLSAgICAgICBjb25maWd1cmF0aW9uLCBtdWx0aWNhc3QuCi0gICAgICAgRGVzY3JpcHRpb246IExpbnV4IEpvdXJuYWwgS2VybmVsIEtvcm5lci4gSGVyZSBpcyB0aGUgYWJzdHJhY3Q6Ci0gICAgICAgIldyaXRpbmcgYSBuZXR3b3JrIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IGlzIGZ1bmRhbWVudGFsbHkKLSAgICAgICBzaW1wbGUtLS1tb3N0IG9mIHRoZSBjb21wbGV4aXR5IChvdGhlciB0aGFuIHRhbGtpbmcgdG8gdGhlCi0gICAgICAgaGFyZHdhcmUpIGludm9sdmVzIG1hbmFnaW5nIG5ldHdvcmsgcGFja2V0cyBpbiBtZW1vcnkiLgotICAgICAgIAotICAgICAqIFRpdGxlOiAiTGludXggS2VybmVsIEhhY2tlcnMnIEd1aWRlIgotICAgICAgIEF1dGhvcjogTWljaGFlbCBLLiBKb2huc29uLgotICAgICAgIFVSTDogaHR0cDovL3d3dy50bGRwLm9yZy9MRFAva2hnL0h5cGVyTmV3cy9nZXQva2hnLmh0bWwKLSAgICAgICBLZXl3b3JkczogZGV2aWNlIGRyaXZlcnMsIGZpbGVzLCBWRlMsIGtlcm5lbCBpbnRlcmZhY2UsIGNoYXJhY3RlciB2cwotICAgICAgIGJsb2NrIGRldmljZXMsIGhhcmR3YXJlIGludGVycnVwdHMsIHNjc2ksIERNQSwgYWNjZXNzIHRvIHVzZXIgbWVtb3J5LAotICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uLCB0aW1lcnMuCi0gICAgICAgRGVzY3JpcHRpb246IEEgZ3VpZGUgZGVzaWduZWQgdG8gaGVscCB5b3UgZ2V0IHVwIHRvIHNwZWVkIG9uIHRoZQotICAgICAgIGNvbmNlcHRzIHRoYXQgYXJlIG5vdCBpbnR1aXRldmx5IG9idmlvdXMsIGFuZCB0byBkb2N1bWVudCB0aGUgaW50ZXJuYWwKLSAgICAgICBzdHJ1Y3R1cmVzIG9mIExpbnV4LgotICAgICAgIAotICAgICAqIFRpdGxlOiAiVGhlIFZlbnVzIGtlcm5lbCBpbnRlcmZhY2UiCi0gICAgICAgQXV0aG9yOiBQZXRlciBKLiBCcmFhbS4KLSAgICAgICBVUkw6Ci0gICAgICAgaHR0cDovL3d3dy5jb2RhLmNzLmNtdS5lZHUvZG9jL2h0bWwva2VybmVsLXZlbnVzLXByb3RvY29sLmh0bWwKLSAgICAgICBLZXl3b3JkczogY29kYSwgZmlsZXN5c3RlbSwgdmVudXMsIGNhY2hlIG1hbmFnZXIuCi0gICAgICAgRGVzY3JpcHRpb246ICJUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuCi0gICAgICAgVmVudXMgYW5kIGtlcm5lbCBsZXZlbCBmaWxlIHN5c3RlbSBjb2RlIG5lZWRlZCBmb3IgdGhlIG9wZXJhdGlvbgotICAgICAgIG9mIHRoZSBDb2RhIGZpbGVzeXN0ZW0uIFRoaXMgdmVyc2lvbiBkb2N1bWVudCBpcyBtZWFudCB0byBkZXNjcmliZQotICAgICAgIHRoZSBjdXJyZW50IGludGVyZmFjZSAodmVyc2lvbiAxLjApIGFzIHdlbGwgYXMgaW1wcm92ZW1lbnRzIHdlCi0gICAgICAgZW52aXNhZ2UiLgorICAgICogVGl0bGU6ICoqTGludXggS2VybmVsIExvY2tpbmcgSE9XVE8qKgogCi0gICAgICogVGl0bGU6ICJQcm9ncmFtbWluZyBQQ0ktRGV2aWNlcyB1bmRlciBMaW51eCIKLSAgICAgICBBdXRob3I6IENsYXVzIFNjaHJvZXRlci4KLSAgICAgICBVUkw6Ci0gICAgICAgZnRwOi8vZnRwLmxscC5mdS1iZXJsaW4uZGUvcHViL2xpbnV4L0xJTlVYLUxBQi93aGl0ZXBhcGVycy9wY2lwLnBzLmd6Ci0gICAgICAgS2V5d29yZHM6IFBDSSwgZGV2aWNlLCBidXNtYXN0ZXJpbmcuCi0gICAgICAgRGVzY3JpcHRpb246IDYgcGFnZXMgdHV0b3JpYWwgb24gUENJIHByb2dyYW1taW5nIHVuZGVyIExpbnV4LgotICAgICAgIEdpdmVzIHRoZSBiYXNpYyBjb25jZXB0cyBvbiB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBQQ0kgc3Vic3lzdGVtLAotICAgICAgIGFzIGxvbmcgYXMgYmFzaWMgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdG8gcmVhZC93cml0ZSB0aGUgZGV2aWNlcwotICAgICAgIGFuZCBwZXJmb3JtIGJ1c21hc3RlcmluZy4KKyAgICAgIDpBdXRob3I6IFZhcmlvdXMgVGFsZW50ZWQgUGVvcGxlLCBhbmQgUnVzdHkuCisgICAgICA6TG9jYXRpb246IERvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtbG9ja2luZy50bXBsCisgICAgICA6S2V5d29yZHM6IGxvY2tzLCBsb2NraW5nLCBzcGlubG9jaywgc2VtYXBob3JlLCBhdG9taWMsIHJhY2UKKyAgICAgICAgY29uZGl0aW9uLCBib3R0b20gaGFsdmVzLCB0YXNrbGV0cywgc29mdGlycXMuCisgICAgICA6RGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbDogZG9jdW1lbnQgZGVzY3JpYmluZyB0aGUKKyAgICAgICAgbG9ja2luZyBzeXN0ZW0gaW4gdGhlIExpbnV4IEtlcm5lbCBlaXRoZXIgaW4gdW5pcHJvY2Vzc29yIG9yIFNNUAorICAgICAgICBzeXN0ZW1zLgorICAgICAgOk5vdGVzOiAiSXQgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBmb3IgdGhlIGxhdGVyICg+Mi4zLjQ3KSAyLjMKKyAgICAgICAga2VybmVscywgYnV0IG1vc3Qgb2YgaXQgYXBwbGllcyB0byAyLjIgdG9vOyAyLjAgaXMgc2xpZ2h0bHkKKyAgICAgICAgZGlmZmVyZW50Ii4gRnJlZWx5IHJlZGlzdHJpYnV0YWJsZSB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiB0aGUgR05VCisgICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAKLSAgICAgKiBUaXRsZTogIldyaXRpbmcgQ2hhcmFjdGVyIERldmljZSBEcml2ZXIgZm9yIExpbnV4IgotICAgICAgIEF1dGhvcjogUi4gQmFydWNoIGFuZCBDLiBTY2hyb2V0ZXIuCi0gICAgICAgVVJMOgotICAgICAgIGZ0cDovL2Z0cC5sbHAuZnUtYmVybGluLmRlL3B1Yi9saW51eC9MSU5VWC1MQUIvd2hpdGVwYXBlcnMvZHJpdmVycy5wcy5negotICAgICAgIEtleXdvcmRzOiBjaGFyYWN0ZXIgZGV2aWNlIGRyaXZlcnMsIEkvTywgc2lnbmFscywgRE1BLCBhY2Nlc3NpbmcKLSAgICAgICBwb3J0cyBpbiB1c2VyIHNwYWNlLCBrZXJuZWwgZW52aXJvbm1lbnQuCi0gICAgICAgRGVzY3JpcHRpb246IDY4IHBhZ2VzIHBhcGVyIG9uIHdyaXRpbmcgY2hhcmFjdGVyIGRyaXZlcnMuIEEgbGl0dGxlCi0gICAgICAgYml0IG9sZCAoMS45OTMsIDEuOTk0KSBhbHRob3VnaCBzdGlsbCB1c2VmdWwuCitPbi1saW5lIGRvY3MKKy0tLS0tLS0tLS0tLQogCi0gICAgICogVGl0bGU6ICJEZXNpZ24gYW5kIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTZWNvbmQgRXh0ZW5kZWQKLSAgICAgICBGaWxlc3lzdGVtIgotICAgICAgIEF1dGhvcjogUsOpbXkgQ2FyZCwgVGhlb2RvcmUgVHMnbywgU3RlcGhlbiBUd2VlZGllLgotICAgICAgIFVSTDogaHR0cDovL3dlYi5taXQuZWR1L3R5dHNvL3d3dy9saW51eC9leHQyaW50cm8uaHRtbAotICAgICAgIEtleXdvcmRzOiBleHQyLCBsaW51eCBmcyBoaXN0b3J5LCBpbm9kZSwgZGlyZWN0b3J5LCBsaW5rLCBkZXZpY2VzLAotICAgICAgIFZGUywgcGh5c2ljYWwgc3RydWN0dXJlLCBwZXJmb3JtYW5jZSwgYmVuY2htYXJrcywgZXh0MmZzIGxpYnJhcnksCi0gICAgICAgZXh0MmZzIHRvb2xzLCBlMmZzY2suCi0gICAgICAgRGVzY3JpcHRpb246IFBhcGVyIHdyaXR0ZW4gYnkgdGhyZWUgb2YgdGhlIHRvcCBleHQyIGhhY2tlcnMuCi0gICAgICAgQ292ZXJzIExpbnV4IGZpbGVzeXN0ZW1zIGhpc3RvcnksIGV4dDIgbW90aXZhdGlvbiwgZXh0MiBmZWF0dXJlcywKLSAgICAgICBkZXNpZ24sIHBoeXNpY2FsIHN0cnVjdHVyZSBvbiBkaXNrLCBwZXJmb3JtYW5jZSwgYmVuY2htYXJrcywKLSAgICAgICBlMmZzY2sncyBwYXNzZXMgZGVzY3JpcHRpb24uLi4gQSBtdXN0IHJlYWQhCi0gICAgICAgTm90ZXM6IFRoaXMgcGFwZXIgd2FzIGZpcnN0IHB1Ymxpc2hlZCBpbiB0aGUgUHJvY2VlZGluZ3Mgb2YgdGhlCi0gICAgICAgRmlyc3QgRHV0Y2ggSW50ZXJuYXRpb25hbCBTeW1wb3NpdW0gb24gTGludXgsIElTQk4gOTAtMzY3LTAzODUtOS4KKyAgICAqIFRpdGxlOiAqKkxpbnV4IEtlcm5lbCBNYWlsaW5nIExpc3QgR2xvc3NhcnkqKgogCi0gICAgICogVGl0bGU6ICJBbmFseXNpcyBvZiB0aGUgRXh0MmZzIHN0cnVjdHVyZSIKLSAgICAgICBBdXRob3I6IExvdWlzLURvbWluaXF1ZSBEdWJlYXUuCi0gICAgICAgVVJMOiBodHRwOi8vdGVhY2hpbmcuY3NzZS51d2EuZWR1LmF1L3VuaXRzL0NJVFMyMDAyL2ZzLWV4dDIvCi0gICAgICAgS2V5d29yZHM6IGV4dDIsIGZpbGVzeXN0ZW0sIGV4dDJmcy4KLSAgICAgICBEZXNjcmlwdGlvbjogRGVzY3JpcHRpb24gb2YgZXh0MidzIGJsb2NrcywgZGlyZWN0b3JpZXMsIGlub2RlcywKLSAgICAgICBiaXRtYXBzLCBpbnZhcmlhbnRzLi4uCisgICAgICA6QXV0aG9yOiB2YXJpb3VzCisgICAgICA6VVJMOiBodHRwOi8va2VybmVsbmV3Ymllcy5vcmcvZ2xvc3NhcnkvCisgICAgICA6RGF0ZTogcm9sbGluZyB2ZXJzaW9uCisgICAgICA6S2V5d29yZHM6IGdsb3NzYXJ5LCB0ZXJtcywgbGludXgta2VybmVsLgorICAgICAgOkRlc2NyaXB0aW9uOiBGcm9tIHRoZSBpbnRyb2R1Y3Rpb246ICJUaGlzIGdsb3NzYXJ5IGlzIGludGVuZGVkIGFzCisgICAgICAgIGEgYnJpZWYgZGVzY3JpcHRpb24gb2Ygc29tZSBvZiB0aGUgYWNyb255bXMgYW5kIHRlcm1zIHlvdSBtYXkgaGVhcgorICAgICAgICBkdXJpbmcgZGlzY3Vzc2lvbiBvZiB0aGUgTGludXgga2VybmVsIi4KIAotICAgICAqIFRpdGxlOiAiSm91cm5hbGluZyB0aGUgTGludXggZXh0MmZzIEZpbGVzeXN0ZW0iCi0gICAgICAgQXV0aG9yOiBTdGVwaGVuIEMuIFR3ZWVkaWUuCi0gICAgICAgVVJMOgotICAgICAgIGZ0cDovL2Z0cC51ay5saW51eC5vcmcvcHViL2xpbnV4L3NjdC9mcy9qZnMvam91cm5hbC1kZXNpZ24ucHMuZ3oKLSAgICAgICBLZXl3b3JkczogZXh0Mywgam91cm5hbGluZy4KLSAgICAgICBEZXNjcmlwdGlvbjogRXhjZWxsZW50IDgtcGFnZXMgcGFwZXIgZXhwbGFpbmluZyB0aGUgam91cm5hbGluZwotICAgICAgIGNhcGFiaWxpdGllcyBhZGRlZCB0byBleHQyIGJ5IHRoZSBhdXRob3IsIHNob3dpbmcgZGlmZmVyZW50Ci0gICAgICAgcHJvYmxlbXMgZmFjZWQgYW5kIHRoZSBhbHRlcm5hdGl2ZXMgY2hvc2VuLgorICAgICogVGl0bGU6ICoqVHJhY2luZyB0aGUgV2F5IG9mIERhdGEgaW4gYSBUQ1AgQ29ubmVjdGlvbiB0aHJvdWdoIHRoZSBMaW51eCBLZXJuZWwqKgogCi0gICAgICogVGl0bGU6ICJLZXJuZWwgQVBJIGNoYW5nZXMgZnJvbSAyLjAgdG8gMi4yIgotICAgICAgIEF1dGhvcjogUmljaGFyZCBHb29jaC4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cuc2FmZS1tYm94LmNvbS9+cmdvb2NoL2xpbnV4L2RvY3MvcG9ydGluZy10by0yLjIuaHRtbAotICAgICAgIEtleXdvcmRzOiAyLjIsIGNoYW5nZXMuCi0gICAgICAgRGVzY3JpcHRpb246IEtlcm5lbCBmdW5jdGlvbnMvc3RydWN0dXJlcy92YXJpYWJsZXMgd2hpY2ggY2hhbmdlZAotICAgICAgIGZyb20gMi4wLnggdG8gMi4yLnguCisgICAgICA6QXV0aG9yOiBSaWNoYXJkIFNhaWxlcgorICAgICAgOlVSTDogaHR0cHM6Ly9hcmNoaXZlLm9yZy9kZXRhaWxzL2xpbnV4X2tlcm5lbF9kYXRhX2Zsb3dfc2hvcnRfcGFwZXIKKyAgICAgIDpEYXRlOiAyMDE2CisgICAgICA6S2V5d29yZHM6IExpbnV4IEtlcm5lbCBOZXR3b3JraW5nLCBUQ1AsIHRyYWNpbmcsIGZ0cmFjZQorICAgICAgOkRlc2NyaXB0aW9uOiBBIHNlbWluYXIgcGFwZXIgZXhwbGFpbmluZyBmdHJhY2UgYW5kIGhvdyB0byB1c2UgaXQgZm9yCisgICAgICAgIHVuZGVyc3RhbmRpbmcgbGludXgga2VybmVsIGludGVybmFscywKKyAgICAgICAgaWxsdXN0cmF0ZWQgYXQgdHJhY2luZyB0aGUgd2F5IG9mIGEgVENQIHBhY2tldCB0aHJvdWdoIHRoZSBrZXJuZWwuCisgICAgICA6QWJzdHJhY3Q6ICpUaGlzIHNob3J0IHBhcGVyIG91dGxpbmVzIHRoZSB1c2FnZSBvZiBmdHJhY2UgYSB0cmFjaW5nIGZyYW1ld29yaworICAgICAgICBhcyBhIHRvb2wgdG8gdW5kZXJzdGFuZCBhIHJ1bm5pbmcgTGludXggc3lzdGVtLgorICAgICAgICBIYXZpbmcgb2J0YWluZWQgYSB0cmFjZS1sb2cgYSBrZXJuZWwgaGFja2VyIGNhbiByZWFkIGFuZCB1bmRlcnN0YW5kCisgICAgICAgIHNvdXJjZSBjb2RlIG1vcmUgZGV0ZXJtaW5lZCBhbmQgd2l0aCBjb250ZXh0LgorICAgICAgICBJbiBhIGRldGFpbGVkIGV4YW1wbGUgdGhpcyBhcHByb2FjaCBpcyBkZW1vbnN0cmF0ZWQgaW4gdHJhY2luZworICAgICAgICBhbmQgdGhlIHdheSBvZiBkYXRhIGluIGEgVENQIENvbm5lY3Rpb24gdGhyb3VnaCB0aGUga2VybmVsLgorICAgICAgICBGaW5hbGx5IHRoaXMgdHJhY2UtbG9nIGlzIHVzZWQgYXMgYmFzZSBmb3IgbW9yZSBhIGV4YWN0IGNvbmNlcHR1YWwKKyAgICAgICAgZXhwbG9yYXRpb24gYW5kIGRlc2NyaXB0aW9uIG9mIHRoZSBMaW51eCBUQ1AvSVAgaW1wbGVtZW50YXRpb24uKgogCi0gICAgICogVGl0bGU6ICJLZXJuZWwgQVBJIGNoYW5nZXMgZnJvbSAyLjIgdG8gMi40IgotICAgICAgIEF1dGhvcjogUmljaGFyZCBHb29jaC4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cuc2FmZS1tYm94LmNvbS9+cmdvb2NoL2xpbnV4L2RvY3MvcG9ydGluZy10by0yLjQuaHRtbAotICAgICAgIEtleXdvcmRzOiAyLjQsIGNoYW5nZXMuCi0gICAgICAgRGVzY3JpcHRpb246IEtlcm5lbCBmdW5jdGlvbnMvc3RydWN0dXJlcy92YXJpYWJsZXMgd2hpY2ggY2hhbmdlZAotICAgICAgIGZyb20gMi4yLnggdG8gMi40LnguCi0gICAgICAgCi0gICAgICogVGl0bGU6ICJMaW51eCBLZXJuZWwgTW9kdWxlIFByb2dyYW1taW5nIEd1aWRlIgotICAgICAgIEF1dGhvcjogT3JpIFBvbWVyYW50ei4KLSAgICAgICBVUkw6IGh0dHA6Ly90bGRwLm9yZy9MRFAvbGttcGcvMi42L2h0bWwvaW5kZXguaHRtbAotICAgICAgIEtleXdvcmRzOiBtb2R1bGVzLCBHUEwgYm9vaywgL3Byb2MsIGlvY3Rscywgc3lzdGVtIGNhbGxzLAotICAgICAgIGludGVycnVwdCBoYW5kbGVycyAuCi0gICAgICAgRGVzY3JpcHRpb246IFZlcnkgbmljZSA5MiBwYWdlcyBHUEwgYm9vayBvbiB0aGUgdG9waWMgb2YgbW9kdWxlcwotICAgICAgIHByb2dyYW1taW5nLiBMb3RzIG9mIGV4YW1wbGVzLgotICAgICAgIAotICAgICAqIFRpdGxlOiAiSS9PIEV2ZW50IEhhbmRsaW5nIFVuZGVyIExpbnV4IgotICAgICAgIEF1dGhvcjogUmljaGFyZCBHb29jaC4KLSAgICAgICBLZXl3b3JkczogSU8sIEkvTywgc2VsZWN0KDIpLCBwb2xsKDIpLCBGRHMsIGFpb19yZWFkKDIpLCByZWFkaW5lc3MKLSAgICAgICBldmVudCBxdWV1ZXMuCi0gICAgICAgRGVzY3JpcHRpb246IEZyb20gdGhlIEludHJvZHVjdGlvbjogIkkvTyBFdmVudCBoYW5kbGluZyBpcyBhYm91dAotICAgICAgIGhvdyB5b3VyIE9wZXJhdGluZyBTeXN0ZW0gYWxsb3dzIHlvdSB0byBtYW5hZ2UgYSBsYXJnZSBudW1iZXIgb2YKLSAgICAgICBvcGVuIGZpbGVzIChmaWxlIGRlc2NyaXB0b3JzIGluIFVOSVgvUE9TSVgsIG9yIEZEcykgaW4geW91cgotICAgICAgIGFwcGxpY2F0aW9uLiBZb3Ugd2FudCB0aGUgT1MgdG8gbm90aWZ5IHlvdSB3aGVuIEZEcyBiZWNvbWUgYWN0aXZlCi0gICAgICAgKGhhdmUgZGF0YSByZWFkeSB0byBiZSByZWFkIG9yIGFyZSByZWFkeSBmb3Igd3JpdGluZykuIElkZWFsbHkgeW91Ci0gICAgICAgd2FudCBhIG1lY2hhbmlzbSB0aGF0IGlzIHNjYWxhYmxlLiBUaGlzIG1lYW5zIGEgbGFyZ2UgbnVtYmVyIG9mCi0gICAgICAgaW5hY3RpdmUgRkRzIGNvc3QgdmVyeSBsaXR0bGUgaW4gbWVtb3J5IGFuZCBDUFUgdGltZSB0byBtYW5hZ2UiLgotICAgICAgIAotICAgICAqIFRpdGxlOiAiVGhlIEtlcm5lbCBIYWNraW5nIEhPV1RPIgotICAgICAgIEF1dGhvcjogVmFyaW91cyBUYWxlbnRlZCBQZW9wbGUsIGFuZCBSdXN0eS4KLSAgICAgICBMb2NhdGlvbjogaW4ga2VybmVsIHRyZWUsIERvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtaGFja2luZy50bXBsCi0gICAgICAgKG11c3QgYmUgYnVpbHQgYXMgIm1ha2Uge2h0bWxkb2NzIHwgcHNkb2NzIHwgcGRmZG9jc30pCi0gICAgICAgS2V5d29yZHM6IEhPV1RPLCBrZXJuZWwgY29udGV4dHMsIGRlYWRsb2NrLCBsb2NraW5nLCBtb2R1bGVzLAotICAgICAgIHN5bWJvbHMsIHJldHVybiBjb252ZW50aW9ucy4KLSAgICAgICBEZXNjcmlwdGlvbjogRnJvbSB0aGUgSW50cm9kdWN0aW9uOiAiUGxlYXNlIHVuZGVyc3RhbmQgdGhhdCBJCi0gICAgICAgbmV2ZXIgd2FudGVkIHRvIHdyaXRlIHRoaXMgZG9jdW1lbnQsIGJlaW5nIGdyb3NzbHkgdW5kZXJxdWFsaWZpZWQsCi0gICAgICAgYnV0IEkgYWx3YXlzIHdhbnRlZCB0byByZWFkIGl0LCBhbmQgdGhpcyB3YXMgdGhlIG9ubHkgd2F5LiBJCi0gICAgICAgc2ltcGx5IGV4cGxhaW4gc29tZSBiZXN0IHByYWN0aWNlcywgYW5kIGdpdmUgcmVhZGluZyBlbnRyeS1wb2ludHMKLSAgICAgICBpbnRvIHRoZSBrZXJuZWwgc291cmNlcy4gSSBhdm9pZCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzOiB0aGF0J3MKLSAgICAgICB3aGF0IHRoZSBjb2RlIGlzIGZvciwgYW5kIEkgaWdub3JlIHdob2xlIHRyYWN0cyBvZiB1c2VmdWwKLSAgICAgICByb3V0aW5lcy4gVGhpcyBkb2N1bWVudCBhc3N1bWVzIGZhbWlsaWFyaXR5IHdpdGggQywgYW5kIGFuCi0gICAgICAgdW5kZXJzdGFuZGluZyBvZiB3aGF0IHRoZSBrZXJuZWwgaXMsIGFuZCBob3cgaXQgaXMgdXNlZC4gSXQgd2FzCi0gICAgICAgb3JpZ2luYWxseSB3cml0dGVuIGZvciB0aGUgMi4zIGtlcm5lbHMsIGJ1dCBuZWFybHkgYWxsIG9mIGl0Ci0gICAgICAgYXBwbGllcyB0byAyLjIgdG9vOyAyLjAgaXMgc2xpZ2h0bHkgZGlmZmVyZW50Ii4KLSAgICAgICAKLSAgICAgKiBUaXRsZTogIldyaXRpbmcgYW4gQUxTQSBEcml2ZXIiCi0gICAgICAgQXV0aG9yOiBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+Ci0gICAgICAgVVJMOiBodHRwOi8vd3d3LmFsc2EtcHJvamVjdC5vcmcvfml3YWkvd3JpdGluZy1hbi1hbHNhLWRyaXZlci9pbmRleC5odG1sCi0gICAgICAgS2V5d29yZHM6IEFMU0EsIHNvdW5kLCBzb3VuZGNhcmQsIGRyaXZlciwgbG93bGV2ZWwsIGhhcmR3YXJlLgotICAgICAgIERlc2NyaXB0aW9uOiBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUgZm9yIGRldmVsb3BlcnMsCi0gICAgICAgYm90aCBhdCBrZXJuZWwgYW5kIHVzZXItbGV2ZWwgc2lkZXMuIEFMU0EgaXMgdGhlIExpbnV4IGtlcm5lbAotICAgICAgIHNvdW5kIGFyY2hpdGVjdHVyZSBpbiB0aGUgMi42IGtlcm5lbCB2ZXJzaW9uLgotICAgICAgIAotICAgICAqIFRpdGxlOiAiUHJvZ3JhbW1pbmcgR3VpZGUgZm9yIExpbnV4IFVTQiBEZXZpY2UgRHJpdmVycyIKLSAgICAgICBBdXRob3I6IERldGxlZiBGbGllZ2wuCi0gICAgICAgVVJMOiBodHRwOi8vdXNiLmluLnR1bS5kZS91c2Jkb2MvCi0gICAgICAgS2V5d29yZHM6IFVTQiwgdW5pdmVyc2FsIHNlcmlhbCBidXMuCi0gICAgICAgRGVzY3JpcHRpb246IEEgbXVzdC1yZWFkLiBGcm9tIHRoZSBQcmVmYWNlOiAiVGhpcyBkb2N1bWVudCBzaG91bGQKLSAgICAgICBnaXZlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBVU0IKLSAgICAgICBzdWJzeXN0ZW0gYW5kIGl0cyBBUEkgZm9yIFVTQiBkZXZpY2UgZHJpdmVycy4gVGhlIGZpcnN0IHNlY3Rpb24KLSAgICAgICB3aWxsIGRlYWwgd2l0aCB0aGUgYmFzaWNzIG9mIFVTQiBkZXZpY2VzLiBZb3Ugd2lsbCBsZWFybiBhYm91dAotICAgICAgIGRpZmZlcmVudCB0eXBlcyBvZiBkZXZpY2VzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiBHb2luZyBpbnRvIGRldGFpbAotICAgICAgIHlvdSB3aWxsIHNlZSBob3cgVVNCIGRldmljZXMgY29tbXVuaWNhdGUgb24gdGhlIGJ1cy4gVGhlIHNlY29uZAotICAgICAgIHNlY3Rpb24gZ2l2ZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIExpbnV4IFVTQiBzdWJzeXN0ZW0gWzJdIGFuZCB0aGUKLSAgICAgICBkZXZpY2UgZHJpdmVyIGZyYW1ld29yay4gVGhlbiB0aGUgQVBJIGFuZCBpdHMgZGF0YSBzdHJ1Y3R1cmVzIHdpbGwKLSAgICAgICBiZSBleHBsYWluZWQgc3RlcCBieSBzdGVwLiBUaGUgbGFzdCBzZWN0aW9uIG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgICBjb250YWlucyBhIHJlZmVyZW5jZSBvZiBhbGwgQVBJIGNhbGxzIGFuZCB0aGVpciByZXR1cm4gY29kZXMiLgotICAgICAgIE5vdGVzOiBCZXdhcmU6IHRoZSBtYWluIHBhZ2Ugc3RhdGVzOiAiVGhpcyBkb2N1bWVudCBtYXkgbm90IGJlCi0gICAgICAgcHVibGlzaGVkLCBwcmludGVkIG9yIHVzZWQgaW4gZXhjZXJwdHMgd2l0aG91dCBleHBsaWNpdCBwZXJtaXNzaW9uCi0gICAgICAgb2YgdGhlIGF1dGhvciIuIEZvcnR1bmF0ZWx5LCBpdCBtYXkgc3RpbGwgYmUgcmVhZC4uLgorICAgICogVGl0bGU6ICoqT24gc3VibWl0dGluZyBrZXJuZWwgUGF0Y2hlcyoqCiAKLSAgICAgKiBUaXRsZTogIkxpbnV4IEtlcm5lbCBNYWlsaW5nIExpc3QgR2xvc3NhcnkiCi0gICAgICAgQXV0aG9yOiB2YXJpb3VzCi0gICAgICAgVVJMOiBodHRwOi8va2VybmVsbmV3Ymllcy5vcmcvZ2xvc3NhcnkvCi0gICAgICAgS2V5d29yZHM6IGdsb3NzYXJ5LCB0ZXJtcywgbGludXgta2VybmVsLgotICAgICAgIERlc2NyaXB0aW9uOiBGcm9tIHRoZSBpbnRyb2R1Y3Rpb246ICJUaGlzIGdsb3NzYXJ5IGlzIGludGVuZGVkIGFzCi0gICAgICAgYSBicmllZiBkZXNjcmlwdGlvbiBvZiBzb21lIG9mIHRoZSBhY3JvbnltcyBhbmQgdGVybXMgeW91IG1heSBoZWFyCi0gICAgICAgZHVyaW5nIGRpc2N1c3Npb24gb2YgdGhlIExpbnV4IGtlcm5lbCIuCi0gICAgICAgCi0gICAgICogVGl0bGU6ICJMaW51eCBLZXJuZWwgTG9ja2luZyBIT1dUTyIKLSAgICAgICBBdXRob3I6IFZhcmlvdXMgVGFsZW50ZWQgUGVvcGxlLCBhbmQgUnVzdHkuCi0gICAgICAgTG9jYXRpb246IGluIGtlcm5lbCB0cmVlLCBEb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWxvY2tpbmcudG1wbAotICAgICAgIChtdXN0IGJlIGJ1aWx0IGFzICJtYWtlIHtodG1sZG9jcyB8IHBzZG9jcyB8IHBkZmRvY3N9KQotICAgICAgIEtleXdvcmRzOiBsb2NrcywgbG9ja2luZywgc3BpbmxvY2ssIHNlbWFwaG9yZSwgYXRvbWljLCByYWNlCi0gICAgICAgY29uZGl0aW9uLCBib3R0b20gaGFsdmVzLCB0YXNrbGV0cywgc29mdGlycXMuCi0gICAgICAgRGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbDogZG9jdW1lbnQgZGVzY3JpYmluZyB0aGUKLSAgICAgICBsb2NraW5nIHN5c3RlbSBpbiB0aGUgTGludXggS2VybmVsIGVpdGhlciBpbiB1bmlwcm9jZXNzb3Igb3IgU01QCi0gICAgICAgc3lzdGVtcy4KLSAgICAgICBOb3RlczogIkl0IHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gZm9yIHRoZSBsYXRlciAoPjIuMy40NykgMi4zCi0gICAgICAga2VybmVscywgYnV0IG1vc3Qgb2YgaXQgYXBwbGllcyB0byAyLjIgdG9vOyAyLjAgaXMgc2xpZ2h0bHkKLSAgICAgICBkaWZmZXJlbnQiLiBGcmVlbHkgcmVkaXN0cmlidXRhYmxlIHVuZGVyIHRoZSBjb25kaXRpb25zIG9mIHRoZSBHTlUKLSAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICAgICAgOkF1dGhvcjogQW5kaSBLbGVlbgorICAgICAgOlVSTDogaHR0cDovL2hhbG9iYXRlcy5kZS9vbi1zdWJtaXR0aW5nLWtlcm5lbC1wYXRjaGVzLnBkZgorICAgICAgOkRhdGU6IDIwMDgKKyAgICAgIDpLZXl3b3JkczogcGF0Y2hlcywgcmV2aWV3IHByb2Nlc3MsIHR5cGVzIG9mIHN1Ym1pc3Npb25zLCBiYXNpYyBydWxlcywgY2FzZSBzdHVkaWVzCisgICAgICA6RGVzY3JpcHRpb246IFRoaXMgcGFwZXIgZ2l2ZXMgc2V2ZXJhbCBleHBlcmllbmNlIHZhbHVlcyBvbiB3aGF0IHR5cGVzIG9mIHBhdGNoZXMKKyAgICAgICAgdGhlcmUgYXJlIGFuZCBob3cgbGlrbGV5IHRoZXkgZ2V0IG1lcmdlZC4KKyAgICAgIDpBYnN0cmFjdDoKKyAgICAgICAgWy4uLl0uIFRoaXMgcGFwZXIgZXhhbWluZXMgc29tZSBjb21tb24gcHJvYmxlbXMgZm9yCisgICAgICAgIHN1Ym1pdHRpbmcgbGFyZ2VyIGNoYW5nZXMgYW5kIHNvbWUgc3RyYXRlZ2llcyB0byBhdm9pZCBwcm9ibGVtcy4KIAotICAgICAqIFRpdGxlOiAiR2xvYmFsIHNwaW5sb2NrIGxpc3QgYW5kIHVzYWdlIgotICAgICAgIEF1dGhvcjogUmljayBMaW5kc2xleS4KLSAgICAgICBVUkw6IGh0dHA6Ly9sc2Uuc291cmNlZm9yZ2UubmV0L2xvY2toaWVyL2dsb2JhbC1zcGluLWxvY2sKLSAgICAgICBLZXl3b3Jkczogc3BpbmxvY2suCi0gICAgICAgRGVzY3JpcHRpb246IFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBkb2N1bWVudCBib3RoIHRoZSBleGlzdGVuY2UgYW5kCi0gICAgICAgdXNhZ2Ugb2YgdGhlIHNwaW5sb2NrcyBpbiB0aGUgTGludXggMi40LjUga2VybmVsLiBDb21wcmVoZW5zaXZlCi0gICAgICAgbGlzdCBvZiBzcGlubG9ja3Mgc2hvd2luZyB3aGVuIHRoZXkgYXJlIHVzZWQsIHdoaWNoIGZ1bmN0aW9ucwotICAgICAgIGFjY2VzcyB0aGVtLCBob3cgZWFjaCBsb2NrIGlzIGFjcXVpcmVkLCB1bmRlciB3aGF0IGNvbmRpdGlvbnMgaXQKLSAgICAgICBpcyBoZWxkLCB3aGV0aGVyIGludGVycnVwdHMgY2FuIG9jY3VyIG9yIG5vdCB3aGlsZSBpdCBpcyBoZWxkLi4uCisgICAgKiBUaXRsZTogKipPdmVydmlldyBvZiB0aGUgVmlydHVhbCBGaWxlIFN5c3RlbSoqCiAKLSAgICAgKiBUaXRsZTogIlBvcnRpbmcgTGludXggMi4wIERyaXZlcnMgVG8gTGludXggMi4yOiBDaGFuZ2VzIGFuZCBOZXcKLSAgICAgICBGZWF0dXJlcyAiCi0gICAgICAgQXV0aG9yOiBBbGFuIENveC4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS8xOTk5LTA1L2dlYXJfMDEuaHRtbAotICAgICAgIEtleXdvcmRzOiBwb3J0cywgcG9ydGluZy4KLSAgICAgICBEZXNjcmlwdGlvbjogQXJ0aWNsZSBmcm9tIExpbnV4IE1hZ2F6aW5lIG9uIHBvcnRpbmcgZnJvbSAyLjAgdG8KLSAgICAgICAyLjIga2VybmVscy4KKyAgICAgIDpBdXRob3I6IFJpY2hhcmQgR29vY2guCisgICAgICA6VVJMOiBodHRwOi8vd3d3Lm1qbXdpcmVkLm5ldC9rZXJuZWwvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CisgICAgICA6RGF0ZTogMjAwNworICAgICAgOktleXdvcmRzOiBWRlMsIEZpbGUgU3lzdGVtLCBtb3VudGluZyBmaWxlc3lzdGVtcywgb3BlbmluZyBmaWxlcywKKyAgICAgICAgZGVudHJpZXMsIGRjYWNoZS4KKyAgICAgIDpEZXNjcmlwdGlvbjogQnJpZWYgaW50cm9kdWN0aW9uIHRvIHRoZSBMaW51eCBWaXJ0dWFsIEZpbGUgU3lzdGVtLgorICAgICAgICBXaGF0IGlzIGl0LCBob3cgaXQgd29ya3MsIG9wZXJhdGlvbnMgdGFrZW4gd2hlbiBvcGVuaW5nIGEgZmlsZSBvcgorICAgICAgICBtb3VudGluZyBhIGZpbGUgc3lzdGVtIGFuZCBkZXNjcmlwdGlvbiBvZiBpbXBvcnRhbnQgZGF0YQorICAgICAgICBzdHJ1Y3R1cmVzIGV4cGxhaW5pbmcgdGhlIHB1cnBvc2Ugb2YgZWFjaCBvZiB0aGVpciBlbnRyaWVzLgogCi0gICAgICogVGl0bGU6ICJQb3J0aW5nIERldmljZSBEcml2ZXJzIFRvIExpbnV4IDIuMjogcGFydCBJSSIKLSAgICAgICBBdXRob3I6IEFsYW4gQ294LgotICAgICAgIFVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tL2lkLzIzOCAKLSAgICAgICBLZXl3b3JkczogcG9ydHMsIHBvcnRpbmcuCi0gICAgICAgRGVzY3JpcHRpb246IFNlY29uZCBwYXJ0IG9uIHBvcnRpbmcgZnJvbSAyLjAgdG8gMi4yIGtlcm5lbHMuCisgICAgKiBUaXRsZTogKipMaW51eCBEZXZpY2UgRHJpdmVycywgVGhpcmQgRWRpdGlvbioqCiAKLSAgICAgKiBUaXRsZTogIkhvdyBUbyBNYWtlIFN1cmUgWW91ciBEcml2ZXIgV2lsbCBXb3JrIE9uIFRoZSBQb3dlcgotICAgICAgIE1hY2ludG9zaCIKLSAgICAgICBBdXRob3I6IFBhdWwgTWFja2VycmFzLgotICAgICAgIFVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tL2lkLzI2MQotICAgICAgIEtleXdvcmRzOiBNYWMsIFBvd2VyIE1hY2ludG9zaCwgcG9ydGluZywgZHJpdmVycywgY29tcGF0aWJpbGl0eS4KLSAgICAgICBEZXNjcmlwdGlvbjogVGhlIHRpdGxlIHNheXMgaXQgYWxsLgorICAgICAgOkF1dGhvcjogSm9uYXRoYW4gQ29yYmV0LCBBbGVzc2FuZHJvIFJ1YmluaSwgR3JlZyBLcm9haC1IYXJ0bWFuCisgICAgICA6VVJMOiBodHRwOi8vbHduLm5ldC9LZXJuZWwvTEREMy8KKyAgICAgIDpEYXRlOiAyMDA1CisgICAgICA6RGVzY3JpcHRpb246IEEgNjAwLXBhZ2UgYm9vayBjb3ZlcmluZyB0aGUgKDIuNi4xMCkgZHJpdmVyCisgICAgICAgIHByb2dyYW1taW5nIEFQSSBhbmQga2VybmVsIGhhY2tpbmcgaW4gZ2VuZXJhbC4gIEF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICAgICAgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDIuMCBsaWNlbnNlLgorICAgICAgOm5vdGU6IFlvdSBjYW4gYWxzbyA6cmVmOmBwdXJjaGFzZSBhIGNvcHkgZnJvbSBPJ1JlaWxseSBvciBlbHNld2hlcmUgIDxsZGQzX3B1Ymxpc2hlZD5gLgogCi0gICAgICogVGl0bGU6ICJBbiBJbnRyb2R1Y3Rpb24gdG8gU0NTSSBEcml2ZXJzIgotICAgICAgIEF1dGhvcjogQWxhbiBDb3guCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4LW1hZy5jb20vaWQvMjg0Ci0gICAgICAgS2V5d29yZHM6IFNDU0ksIGRldmljZSwgZHJpdmVyLgotICAgICAgIERlc2NyaXB0aW9uOiBUaGUgdGl0bGUgc2F5cyBpdCBhbGwuCisgICAgKiBUaXRsZTogKipXcml0aW5nIGFuIEFMU0EgRHJpdmVyKioKIAotICAgICAqIFRpdGxlOiAiQWR2YW5jZWQgU0NTSSBEcml2ZXJzIEFuZCBPdGhlciBUYWxlcyIKLSAgICAgICBBdXRob3I6IEFsYW4gQ294LgotICAgICAgIFVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tL2lkLzMwNwotICAgICAgIEtleXdvcmRzOiBTQ1NJLCBkZXZpY2UsIGRyaXZlciwgYWR2YW5jZWQuCi0gICAgICAgRGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbC4KKyAgICAgIDpBdXRob3I6IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cuYWxzYS1wcm9qZWN0Lm9yZy9+aXdhaS93cml0aW5nLWFuLWFsc2EtZHJpdmVyL2luZGV4Lmh0bWwKKyAgICAgIDpEYXRlOiAyMDA1CisgICAgICA6S2V5d29yZHM6IEFMU0EsIHNvdW5kLCBzb3VuZGNhcmQsIGRyaXZlciwgbG93bGV2ZWwsIGhhcmR3YXJlLgorICAgICAgOkRlc2NyaXB0aW9uOiBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUgZm9yIGRldmVsb3BlcnMsCisgICAgICAgIGJvdGggYXQga2VybmVsIGFuZCB1c2VyLWxldmVsIHNpZGVzLiBBTFNBIGlzIHRoZSBMaW51eCBrZXJuZWwKKyAgICAgICAgc291bmQgYXJjaGl0ZWN0dXJlIGluIHRoZSAyLjYga2VybmVsIHZlcnNpb24uCiAKLSAgICAgKiBUaXRsZTogIldyaXRpbmcgTGludXggTW91c2UgRHJpdmVycyIKLSAgICAgICBBdXRob3I6IEFsYW4gQ294LgotICAgICAgIFVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tL2lkLzMzMAotICAgICAgIEtleXdvcmRzOiBtb3VzZSwgZHJpdmVyLCBncG0uCi0gICAgICAgRGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbC4KKyAgICAqIFRpdGxlOiAqKkxpbnV4IFBDTUNJQSBQcm9ncmFtbWVyJ3MgR3VpZGUqKgogCi0gICAgICogVGl0bGU6ICJNb3JlIG9uIE1vdXNlIERyaXZlcnMiCi0gICAgICAgQXV0aG9yOiBBbGFuIENveC4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC8zNTYKLSAgICAgICBLZXl3b3JkczogbW91c2UsIGRyaXZlciwgZ3BtLCByYWNlcywgYXN5bmNocm9ub3VzIEkvTy4KLSAgICAgICBEZXNjcmlwdGlvbjogVGhlIHRpdGxlIHN0aWxsIHNheXMgaXQgYWxsLgorICAgICAgOkF1dGhvcjogRGF2aWQgSGluZHMuCisgICAgICA6VVJMOiBodHRwOi8vcGNtY2lhLWNzLnNvdXJjZWZvcmdlLm5ldC9mdHAvZG9jL1BDTUNJQS1QUk9HLmh0bWwKKyAgICAgIDpEYXRlOiAyMDAzCisgICAgICA6S2V5d29yZHM6IFBDTUNJQS4KKyAgICAgIDpEZXNjcmlwdGlvbjogIlRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyB0byB3cml0ZSBrZXJuZWwgZGV2aWNlCisgICAgICAgIGRyaXZlcnMgZm9yIHRoZSBMaW51eCBQQ01DSUEgQ2FyZCBTZXJ2aWNlcyBpbnRlcmZhY2UuIEl0IGFsc28KKyAgICAgICAgZGVzY3JpYmVzIGhvdyB0byB3cml0ZSB1c2VyLW1vZGUgdXRpbGl0aWVzIGZvciBjb21tdW5pY2F0aW5nIHdpdGgKKyAgICAgICAgQ2FyZCBTZXJ2aWNlcy4KIAotICAgICAqIFRpdGxlOiAiV3JpdGluZyBWaWRlbzRsaW51eCBSYWRpbyBEcml2ZXIiCi0gICAgICAgQXV0aG9yOiBBbGFuIENveC4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC8zODEKLSAgICAgICBLZXl3b3JkczogdmlkZW80bGludXgsIGRyaXZlciwgcmFkaW8sIHJhZGlvIGRldmljZXMuCi0gICAgICAgRGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbC4KKyAgICAqIFRpdGxlOiAqKkxpbnV4IEtlcm5lbCBNb2R1bGUgUHJvZ3JhbW1pbmcgR3VpZGUqKgogCi0gICAgICogVGl0bGU6ICJWaWRlbzRsaW51eCBEcml2ZXJzLCBQYXJ0IDE6IFZpZGVvLUNhcHR1cmUgRGV2aWNlIgotICAgICAgIEF1dGhvcjogQWxhbiBDb3guCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4LW1hZy5jb20vaWQvNDA2Ci0gICAgICAgS2V5d29yZHM6IHZpZGVvNGxpbnV4LCBkcml2ZXIsIHZpZGVvIGNhcHR1cmUsIGNhcHR1cmUgZGV2aWNlcywKLSAgICAgICBjYW1lcmEgZHJpdmVyLgotICAgICAgIERlc2NyaXB0aW9uOiBUaGUgdGl0bGUgc2F5cyBpdCBhbGwuCisgICAgICA6QXV0aG9yOiBPcmkgUG9tZXJhbnR6LgorICAgICAgOlVSTDogaHR0cDovL3RsZHAub3JnL0xEUC9sa21wZy8yLjYvaHRtbC9pbmRleC5odG1sCisgICAgICA6RGF0ZTogMjAwMQorICAgICAgOktleXdvcmRzOiBtb2R1bGVzLCBHUEwgYm9vaywgL3Byb2MsIGlvY3Rscywgc3lzdGVtIGNhbGxzLAorICAgICAgICBpbnRlcnJ1cHQgaGFuZGxlcnMgLgorICAgICAgOkRlc2NyaXB0aW9uOiBWZXJ5IG5pY2UgOTIgcGFnZXMgR1BMIGJvb2sgb24gdGhlIHRvcGljIG9mIG1vZHVsZXMKKyAgICAgICAgcHJvZ3JhbW1pbmcuIExvdHMgb2YgZXhhbXBsZXMuCiAKLSAgICAgKiBUaXRsZTogIlZpZGVvNGxpbnV4IERyaXZlcnMsIFBhcnQgMjogVmlkZW8tY2FwdHVyZSBEZXZpY2VzIgotICAgICAgIEF1dGhvcjogQWxhbiBDb3guCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4LW1hZy5jb20vaWQvNDI5Ci0gICAgICAgS2V5d29yZHM6IHZpZGVvNGxpbnV4LCBkcml2ZXIsIHZpZGVvIGNhcHR1cmUsIGNhcHR1cmUgZGV2aWNlcywKLSAgICAgICBjYW1lcmEgZHJpdmVyLCBjb250cm9sLCBxdWVyeSBjYXBhYmlsaXRpZXMsIGNhcGFiaWxpdHksIGZhY2lsaXR5LgotICAgICAgIERlc2NyaXB0aW9uOiBUaGUgdGl0bGUgc2F5cyBpdCBhbGwuCisgICAgKiBUaXRsZTogKipHbG9iYWwgc3BpbmxvY2sgbGlzdCBhbmQgdXNhZ2UqKgogCi0gICAgICogVGl0bGU6ICJQQ0kgTWFuYWdlbWVudCBpbiBMaW51eCAyLjIiCi0gICAgICAgQXV0aG9yOiBBbGFuIENveC4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC80NTIKLSAgICAgICBLZXl3b3JkczogUENJLCBidXMsIGJ1cy1tYXN0ZXJpbmcuCi0gICAgICAgRGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbC4KKyAgICAgIDpBdXRob3I6IFJpY2sgTGluZHNsZXkuCisgICAgICA6VVJMOiBodHRwOi8vbHNlLnNvdXJjZWZvcmdlLm5ldC9sb2NraGllci9nbG9iYWwtc3Bpbi1sb2NrCisgICAgICA6RGF0ZTogMjAwMQorICAgICAgOktleXdvcmRzOiBzcGlubG9jay4KKyAgICAgIDpEZXNjcmlwdGlvbjogVGhpcyBpcyBhbiBhdHRlbXB0IHRvIGRvY3VtZW50IGJvdGggdGhlIGV4aXN0ZW5jZSBhbmQKKyAgICAgICAgdXNhZ2Ugb2YgdGhlIHNwaW5sb2NrcyBpbiB0aGUgTGludXggMi40LjUga2VybmVsLiBDb21wcmVoZW5zaXZlCisgICAgICAgIGxpc3Qgb2Ygc3BpbmxvY2tzIHNob3dpbmcgd2hlbiB0aGV5IGFyZSB1c2VkLCB3aGljaCBmdW5jdGlvbnMKKyAgICAgICAgYWNjZXNzIHRoZW0sIGhvdyBlYWNoIGxvY2sgaXMgYWNxdWlyZWQsIHVuZGVyIHdoYXQgY29uZGl0aW9ucyBpdAorICAgICAgICBpcyBoZWxkLCB3aGV0aGVyIGludGVycnVwdHMgY2FuIG9jY3VyIG9yIG5vdCB3aGlsZSBpdCBpcyBoZWxkLi4uCiAKLSAgICAgKiBUaXRsZTogIkxpbnV4IDIuNCBLZXJuZWwgSW50ZXJuYWxzIgotICAgICAgIEF1dGhvcjogVGlncmFuIEFpdmF6aWFuIGFuZCBDaHJpc3RvcGggSGVsbHdpZy4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubW9zZXMudWtsaW51eC5uZXQvcGF0Y2hlcy9sa2kuaHRtbAotICAgICAgIEtleXdvcmRzOiBMaW51eCwga2VybmVsLCBib290aW5nLCBTTUIgYm9vdCwgVkZTLCBwYWdlIGNhY2hlLgotICAgICAgIERlc2NyaXB0aW9uOiBBIGxpdHRsZSBib29rIHVzZWQgZm9yIGEgc2hvcnQgdHJhaW5pbmcgY291cnNlLgotICAgICAgIENvdmVycyBidWlsZGluZyB0aGUga2VybmVsIGltYWdlLCBib290aW5nIChpbmNsdWRpbmcgU01QIGJvb3R1cCksCi0gICAgICAgcHJvY2VzcyBtYW5hZ2VtZW50LCBWRlMgYW5kIG1vcmUuCisgICAgKiBUaXRsZTogKipBIExpbnV4IHZtIFJFQURNRSoqCiAKLSAgICAgKiBUaXRsZTogIkxpbnV4IElQIE5ldHdvcmtpbmcuIEEgR3VpZGUgdG8gdGhlIEltcGxlbWVudGF0aW9uIGFuZAotICAgICAgIE1vZGlmaWNhdGlvbiBvZiB0aGUgTGludXggUHJvdG9jb2wgU3RhY2suIgotICAgICAgIEF1dGhvcjogR2xlbm4gSGVycmluLgotICAgICAgIFVSTDogaHR0cDovL3d3dy5jcy51bmguZWR1L2NucmcvZ2hlcnJpbgotICAgICAgIEtleXdvcmRzOiBuZXR3b3JrLCBuZXR3b3JraW5nLCBwcm90b2NvbCwgSVAsIFVEUCwgVENQLCBjb25uZWN0aW9uLAotICAgICAgIHNvY2tldCwgcmVjZWl2aW5nLCB0cmFuc21pdHRpbmcsIGZvcndhcmRpbmcsIHJvdXRpbmcsIHBhY2tldHMsCi0gICAgICAgbW9kdWxlcywgL3Byb2MsIHNrX2J1ZmYsIEZJQiwgdGFncy4KLSAgICAgICBEZXNjcmlwdGlvbjogRXhjZWxsZW50IHBhcGVyIGRldm90ZWQgdG8gdGhlIExpbnV4IElQIE5ldHdvcmtpbmcsCi0gICAgICAgZXhwbGFpbmluZyBhbnl0aGluZyBmcm9tIHRoZSBrZXJuZWwncyB0byB0aGUgdXNlciBzcGFjZQotICAgICAgIGNvbmZpZ3VyYXRpb24gdG9vbHMnIGNvZGUuIFZlcnkgZ29vZCB0byBnZXQgYSBnZW5lcmFsIG92ZXJ2aWV3IG9mCi0gICAgICAgdGhlIGtlcm5lbCBuZXR3b3JraW5nIGltcGxlbWVudGF0aW9uIGFuZCB1bmRlcnN0YW5kIGFsbCBzdGVwcwotICAgICAgIHBhY2tldHMgZm9sbG93IGZyb20gdGhlIHRpbWUgdGhleSBhcmUgcmVjZWl2ZWQgYXQgdGhlIG5ldHdvcmsKLSAgICAgICBkZXZpY2UgdGlsbCB0aGV5IGFyZSBkZWxpdmVyZWQgdG8gYXBwbGljYXRpb25zLiBUaGUgc3R1ZGllZCBrZXJuZWwKLSAgICAgICBjb2RlIGlzIGZyb20gMi4yLjE0IHZlcnNpb24uIFByb3ZpZGVzIGNvZGUgZm9yIGEgd29ya2luZyBwYWNrZXQKLSAgICAgICBkcm9wcGVyIGV4YW1wbGUuCi0gICAgICAgCi0gICAgICogVGl0bGU6ICJHZXQgdGhvc2UgYm9hcmRzIHRhbGtpbmcgdW5kZXIgTGludXguIgotICAgICAgIEF1dGhvcjogQWxleCBJdmNoZW5rby4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cuZWRuLmNvbS9hcnRpY2xlL0NBNDY5NjguaHRtbAotICAgICAgIEtleXdvcmRzOiBkYXRhLWFjcXVpc2l0aW9uIGJvYXJkcywgZHJpdmVycywgbW9kdWxlcywgaW50ZXJydXB0cywKLSAgICAgICBtZW1vcnkgYWxsb2NhdGlvbi4KLSAgICAgICBEZXNjcmlwdGlvbjogQXJ0aWNsZSB3cml0dGVuIGZvciBwZW9wbGUgd2lzaGluZyB0byBtYWtlIHRoZWlyIGRhdGEKLSAgICAgICBhY3F1aXNpdGlvbiBib2FyZHMgd29yayBvbiB0aGVpciBHTlUvTGludXggbWFjaGluZXMuIEdpdmVzIGEgYmFzaWMKLSAgICAgICBvdmVydmlldyBvbiB3cml0aW5nIGRyaXZlcnMsIGZyb20gdGhlIG5hbWluZyBvZiBmdW5jdGlvbnMgdG8KLSAgICAgICBpbnRlcnJ1cHQgaGFuZGxpbmcuCi0gICAgICAgTm90ZXM6IFR3by1wYXJ0cyBhcnRpY2xlLiBQYXJ0IElJIGlzIGF0Ci0gICAgICAgVVJMOiBodHRwOi8vd3d3LmVkbi5jb20vYXJ0aWNsZS9DQTQ2OTk4Lmh0bWwKLSAgICAgICAKLSAgICAgKiBUaXRsZTogIkxpbnV4IFBDTUNJQSBQcm9ncmFtbWVyJ3MgR3VpZGUiCi0gICAgICAgQXV0aG9yOiBEYXZpZCBIaW5kcy4KLSAgICAgICBVUkw6IGh0dHA6Ly9wY21jaWEtY3Muc291cmNlZm9yZ2UubmV0L2Z0cC9kb2MvUENNQ0lBLVBST0cuaHRtbAotICAgICAgIEtleXdvcmRzOiBQQ01DSUEuCi0gICAgICAgRGVzY3JpcHRpb246ICJUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gd3JpdGUga2VybmVsIGRldmljZQotICAgICAgIGRyaXZlcnMgZm9yIHRoZSBMaW51eCBQQ01DSUEgQ2FyZCBTZXJ2aWNlcyBpbnRlcmZhY2UuIEl0IGFsc28KLSAgICAgICBkZXNjcmliZXMgaG93IHRvIHdyaXRlIHVzZXItbW9kZSB1dGlsaXRpZXMgZm9yIGNvbW11bmljYXRpbmcgd2l0aAotICAgICAgIENhcmQgU2VydmljZXMuCisgICAgICA6QXV0aG9yOiBLYW5vaiBTYXJjYXIuCisgICAgICA6VVJMOiBodHRwOi8va29zLmVuaXgub3JnL3B1Yi9saW51eC12bW0uaHRtbAorICAgICAgOkRhdGU6IDIwMDEKKyAgICAgIDpLZXl3b3JkczogdmlydHVhbCBtZW1vcnksIG1tLCBwZ2QsIHZtYSwgcGFnZSwgcGFnZSBmbGFncywgcGFnZQorICAgICAgICBjYWNoZSwgc3dhcCBjYWNoZSwga3N3YXBkLgorICAgICAgOkRlc2NyaXB0aW9uOiBUZWxlZ3JhcGhpYywgc2hvcnQgZGVzY3JpcHRpb25zIGFuZCBkZWZpbml0aW9ucworICAgICAgICByZWxhdGluZyB0aGUgTGludXggdmlydHVhbCBtZW1vcnkgaW1wbGVtZW50YXRpb24uCiAKLSAgICAgKiBUaXRsZTogIlRoZSBMaW51eCBLZXJuZWwgTkZTRCBJbXBsZW1lbnRhdGlvbiIKLSAgICAgICBBdXRob3I6IE5laWwgQnJvd24uCi0gICAgICAgVVJMOgotICAgICAgIGh0dHA6Ly93d3cuY3NlLnVuc3cuZWR1LmF1L35uZWlsYi9vc3MvbGludXgtY29tbWVudGFyeS9uZnNkLmh0bWwKLSAgICAgICBLZXl3b3Jkczoga25mc2QsIG5mc2QsIE5GUywgUlBDLCBsb2NrZCwgbW91bnRkLCBzdGF0ZC4KLSAgICAgICBEZXNjcmlwdGlvbjogVGhlIHRpdGxlIHNheXMgaXQgYWxsLgotICAgICAgIE5vdGVzOiBDb3ZlcnMga25mc2QncyB2ZXJzaW9uIDEuNC43IChwYXRjaCBhZ2FpbnN0IDIuMi43IGtlcm5lbCkuCi0gICAgICAgCi0gICAgICogVGl0bGU6ICJBIExpbnV4IHZtIFJFQURNRSIKLSAgICAgICBBdXRob3I6IEthbm9qIFNhcmNhci4KLSAgICAgICBVUkw6IGh0dHA6Ly9rb3MuZW5peC5vcmcvcHViL2xpbnV4LXZtbS5odG1sCi0gICAgICAgS2V5d29yZHM6IHZpcnR1YWwgbWVtb3J5LCBtbSwgcGdkLCB2bWEsIHBhZ2UsIHBhZ2UgZmxhZ3MsIHBhZ2UKLSAgICAgICBjYWNoZSwgc3dhcCBjYWNoZSwga3N3YXBkLgotICAgICAgIERlc2NyaXB0aW9uOiBUZWxlZ3JhcGhpYywgc2hvcnQgZGVzY3JpcHRpb25zIGFuZCBkZWZpbml0aW9ucwotICAgICAgIHJlbGF0aW5nIHRoZSBMaW51eCB2aXJ0dWFsIG1lbW9yeSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAKLSAgICAgKiBUaXRsZTogIihuZWFybHkpIENvbXBsZXRlIExpbnV4IExvYWRhYmxlIEtlcm5lbCBNb2R1bGVzLiBUaGUKLSAgICAgICBkZWZpbml0aXZlIGd1aWRlIGZvciBoYWNrZXJzLCB2aXJ1cyBjb2RlcnMgYW5kIHN5c3RlbQotICAgICAgIGFkbWluaXN0cmF0b3JzLiIKLSAgICAgICBBdXRob3I6IHByYWdtYXRpYy9USEMuCi0gICAgICAgVVJMOiBodHRwOi8vcGFja2V0c3Rvcm1zZWN1cml0eS5vcmcvZG9jcy9oYWNrL0xLTV9IQUNLSU5HLmh0bWwKLSAgICAgICBLZXl3b3Jkczogc3lzY2FsbHMsIGludGVyY2VwdCwgaGlkZSwgYWJ1c2UsIHN5bWJvbCB0YWJsZS4KLSAgICAgICBEZXNjcmlwdGlvbjogSW50ZXJlc3RpbmcgcGFwZXIgb24gaG93IHRvIGFidXNlIHRoZSBMaW51eCBrZXJuZWwgaW4KLSAgICAgICBvcmRlciB0byBpbnRlcmNlcHQgYW5kIG1vZGlmeSBzeXNjYWxscywgbWFrZQotICAgICAgIGZpbGVzL2RpcmVjdG9yaWVzL3Byb2Nlc3NlcyBpbnZpc2libGUsIGJlY29tZSByb290LCBoaWphY2sgdHR5cywKLSAgICAgICB3cml0ZSBrZXJuZWwgbW9kdWxlcyBiYXNlZCB2aXJ1cy4uLiBhbmQgc29sdXRpb25zIGZvciBhZG1pbnMgdG8KLSAgICAgICBhdm9pZCBhbGwgdGhvc2UgYWJ1c2VzLgotICAgICAgIE5vdGVzOiBGb3IgMi4wLngga2VybmVscy4gR2l2ZXMgZ3VpZGFuY2VzIHRvIHBvcnQgaXQgdG8gMi4yLngKLSAgICAgICBrZXJuZWxzLgotICAgICAgIAotICAgICBCT09LUzogKE5vdCBvbi1saW5lKQotICAgCi0gICAgICogVGl0bGU6ICJMaW51eCBEZXZpY2UgRHJpdmVycyIKLSAgICAgICBBdXRob3I6IEFsZXNzYW5kcm8gUnViaW5pLgotICAgICAgIFB1Ymxpc2hlcjogTydSZWlsbHkgJiBBc3NvY2lhdGVzLgotICAgICAgIERhdGU6IDE5OTguCi0gICAgICAgUGFnZXM6IDQzOS4KLSAgICAgICBJU0JOOiAxLTU2NTkyLTI5Mi0xCi0gICAgICAgCi0gICAgICogVGl0bGU6ICJMaW51eCBEZXZpY2UgRHJpdmVycywgMm5kIEVkaXRpb24iCi0gICAgICAgQXV0aG9yOiBBbGVzc2FuZHJvIFJ1YmluaSBhbmQgSm9uYXRoYW4gQ29yYmV0LgotICAgICAgIFB1Ymxpc2hlcjogTydSZWlsbHkgJiBBc3NvY2lhdGVzLgotICAgICAgIERhdGU6IDIwMDEuCi0gICAgICAgUGFnZXM6IDU4Ni4KLSAgICAgICBJU0JOOiAwLTU5NjAwLTAwOC0xCi0gICAgICAgTm90ZXM6IEZ1cnRoZXIgaW5mb3JtYXRpb24gaW4KLSAgICAgICBodHRwOi8vd3d3Lm9yZWlsbHkuY29tL2NhdGFsb2cvbGludXhkcml2ZTIvCisgICAgKiBUaXRsZTogKipWaWRlbzRsaW51eCBEcml2ZXJzLCBQYXJ0IDE6IFZpZGVvLUNhcHR1cmUgRGV2aWNlKioKIAotICAgICAqIFRpdGxlOiAiTGludXggRGV2aWNlIERyaXZlcnMsIDNyZCBFZGl0aW9uIgotICAgICAgIEF1dGhvcnM6IEpvbmF0aGFuIENvcmJldCwgQWxlc3NhbmRybyBSdWJpbmksIGFuZCBHcmVnIEtyb2FoLUhhcnRtYW4KLSAgICAgICBQdWJsaXNoZXI6IE8nUmVpbGx5ICYgQXNzb2NpYXRlcy4KLSAgICAgICBEYXRlOiAyMDA1LgotICAgICAgIFBhZ2VzOiA2MzYuCi0gICAgICAgSVNCTjogMC01OTYtMDA1OTAtMwotICAgICAgIE5vdGVzOiBGdXJ0aGVyIGluZm9ybWF0aW9uIGluCi0gICAgICAgaHR0cDovL3d3dy5vcmVpbGx5LmNvbS9jYXRhbG9nL2xpbnV4ZHJpdmUzLwotICAgICAgIFBERiBmb3JtYXQsIFVSTDogaHR0cDovL2x3bi5uZXQvS2VybmVsL0xERDMvCisgICAgICA6QXV0aG9yOiBBbGFuIENveC4KKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC80MDYKKyAgICAgIDpEYXRlOiAyMDAwCisgICAgICA6S2V5d29yZHM6IHZpZGVvNGxpbnV4LCBkcml2ZXIsIHZpZGVvIGNhcHR1cmUsIGNhcHR1cmUgZGV2aWNlcywKKyAgICAgICAgY2FtZXJhIGRyaXZlci4KKyAgICAgIDpEZXNjcmlwdGlvbjogVGhlIHRpdGxlIHNheXMgaXQgYWxsLgogCi0gICAgICogVGl0bGU6ICJMaW51eCBLZXJuZWwgSW50ZXJuYWxzIgotICAgICAgIEF1dGhvcjogTWljaGFlbCBCZWNrLgotICAgICAgIFB1Ymxpc2hlcjogQWRkaXNvbi1XZXNsZXkuCi0gICAgICAgRGF0ZTogMTk5Ny4KLSAgICAgICBJU0JOOiAwLTIwMS0zMzE0My04IChzZWNvbmQgZWRpdGlvbikKLSAgICAgICAKLSAgICAgKiBUaXRsZTogIlRoZSBEZXNpZ24gb2YgdGhlIFVOSVggT3BlcmF0aW5nIFN5c3RlbSIKLSAgICAgICBBdXRob3I6IE1hdXJpY2UgSi4gQmFjaC4KLSAgICAgICBQdWJsaXNoZXI6IFByZW50aWNlIEhhbGwuCi0gICAgICAgRGF0ZTogMTk4Ni4KLSAgICAgICBQYWdlczogNDcxLgotICAgICAgIElTQk46IDAtMTMtMjAxNzU3LTEKLSAgICAgICAKLSAgICAgKiBUaXRsZTogIlRoZSBEZXNpZ24gYW5kIEltcGxlbWVudGF0aW9uIG9mIHRoZSA0LjMgQlNEIFVOSVgKLSAgICAgICBPcGVyYXRpbmcgU3lzdGVtIgotICAgICAgIEF1dGhvcjogU2FtdWVsIEouIExlZmZsZXIsIE1hcnNoYWxsIEtpcmsgTWNLdXNpY2ssIE1pY2hhZWwgSi4KLSAgICAgICBLYXJlbHMsIEpvaG4gUy4gUXVhcnRlcm1hbi4KLSAgICAgICBQdWJsaXNoZXI6IEFkZGlzb24tV2VzbGV5LgotICAgICAgIERhdGU6IDE5ODkgKHJlcHJpbnRlZCB3aXRoIGNvcnJlY3Rpb25zIG9uIE9jdG9iZXIsIDE5OTApLgotICAgICAgIElTQk46IDAtMjAxLTA2MTk2LTEKLSAgICAgICAKLSAgICAgKiBUaXRsZTogIlRoZSBEZXNpZ24gYW5kIEltcGxlbWVudGF0aW9uIG9mIHRoZSA0LjQgQlNEIFVOSVgKLSAgICAgICBPcGVyYXRpbmcgU3lzdGVtIgotICAgICAgIEF1dGhvcjogTWFyc2hhbGwgS2lyayBNY0t1c2ljaywgS2VpdGggQm9zdGljLCBNaWNoYWVsIEouIEthcmVscywKLSAgICAgICBKb2huIFMuIFF1YXJ0ZXJtYW4uCi0gICAgICAgUHVibGlzaGVyOiBBZGRpc29uLVdlc2xleS4KLSAgICAgICBEYXRlOiAxOTk2LgotICAgICAgIElTQk46IDAtMjAxLTU0OTc5LTQKLSAgICAgICAKLSAgICAgKiBUaXRsZTogIlByb2dyYW1tYXRpb24gTGludXggMi4wIEFQSSBzeXN0ZW1lIGV0IGZvbmN0aW9ubmVtZW50IGR1Ci0gICAgICAgbm95YXUiCi0gICAgICAgQXV0aG9yOiBSZW15IENhcmQsIEVyaWMgRHVtYXMsIEZyYW5jayBNZXZlbC4KLSAgICAgICBQdWJsaXNoZXI6IEV5cm9sbGVzLgotICAgICAgIERhdGU6IDE5OTcuCi0gICAgICAgUGFnZXM6IDUyMC4KLSAgICAgICBJU0JOOiAyLTIxMi0wODkzMi01Ci0gICAgICAgTm90ZXM6IEZyZW5jaC4KKyAgICAqIFRpdGxlOiAqKlZpZGVvNGxpbnV4IERyaXZlcnMsIFBhcnQgMjogVmlkZW8tY2FwdHVyZSBEZXZpY2VzKioKIAotICAgICAqIFRpdGxlOiAiVW5peCBpbnRlcm5hbHMgLS0gdGhlIG5ldyBmcm9udGllcnMiCi0gICAgICAgQXV0aG9yOiBVcmVzaCBWYWhhbGlhLgotICAgICAgIFB1Ymxpc2hlcjogUHJlbnRpY2UgSGFsbC4KLSAgICAgICBEYXRlOiAxOTk2LgotICAgICAgIFBhZ2VzOiA2MDAuCi0gICAgICAgSVNCTjogMC0xMy0xMDE5MDgtMgorICAgICAgOkF1dGhvcjogQWxhbiBDb3guCisgICAgICA6VVJMOiBodHRwOi8vd3d3LmxpbnV4LW1hZy5jb20vaWQvNDI5CisgICAgICA6RGF0ZTogMjAwMAorICAgICAgOktleXdvcmRzOiB2aWRlbzRsaW51eCwgZHJpdmVyLCB2aWRlbyBjYXB0dXJlLCBjYXB0dXJlIGRldmljZXMsCisgICAgICAgIGNhbWVyYSBkcml2ZXIsIGNvbnRyb2wsIHF1ZXJ5IGNhcGFiaWxpdGllcywgY2FwYWJpbGl0eSwgZmFjaWxpdHkuCisgICAgICA6RGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbC4KIAotICAgICAqIFRpdGxlOiAiUHJvZ3JhbW1pbmcgZm9yIHRoZSByZWFsIHdvcmxkIC0gUE9TSVguNCIKLSAgICAgICBBdXRob3I6IEJpbGwgTy4gR2FsbG1laXN0ZXIuCi0gICAgICAgUHVibGlzaGVyOiBPJ1JlaWxseSAmIEFzc29jaWF0ZXMsIEluYy4uCi0gICAgICAgRGF0ZTogMTk5NS4KLSAgICAgICBQYWdlczogPz8/LgotICAgICAgIElTQk46IEktNTY1OTItMDc0LTAKLSAgICAgICBOb3RlczogVGhvdWdoIG5vdCBiZWluZyBkaXJlY3RseSBhYm91dCBMaW51eCwgTGludXggYWltcyB0byBiZQotICAgICAgIFBPU0lYLiBHb29kIHJlZmVyZW5jZS4KKyAgICAqIFRpdGxlOiAqKkxpbnV4IElQIE5ldHdvcmtpbmcuIEEgR3VpZGUgdG8gdGhlIEltcGxlbWVudGF0aW9uIGFuZCBNb2RpZmljYXRpb24gb2YgdGhlIExpbnV4IFByb3RvY29sIFN0YWNrLioqCiAKLSAgICAgKiBUaXRsZTogICJVTklYICBTeXN0ZW1zICBmb3IgIE1vZGVybiBBcmNoaXRlY3R1cmVzOiBTeW1tZXRyaWMKLSAgICAgICBNdWx0aXByb2Nlc3NpbmcgYW5kIENhY2hpbmcgZm9yIEtlcm5lbCBQcm9ncmFtbWVycyIKLSAgICAgICBBdXRob3I6IEN1cnQgU2NoaW1tZWwuCi0gICAgICAgUHVibGlzaGVyOiBBZGRpc29uIFdlc2xleS4KLSAgICAgICBEYXRlOiBKdW5lLCAxOTk0LgotICAgICAgIFBhZ2VzOiA0MzIuCi0gICAgICAgSVNCTjogMC0yMDEtNjMzMzgtOAorICAgICAgOkF1dGhvcjogR2xlbm4gSGVycmluLgorICAgICAgOlVSTDogaHR0cDovL3d3dy5jcy51bmguZWR1L2NucmcvZ2hlcnJpbgorICAgICAgOkRhdGU6IDIwMDAKKyAgICAgIDpLZXl3b3JkczogbmV0d29yaywgbmV0d29ya2luZywgcHJvdG9jb2wsIElQLCBVRFAsIFRDUCwgY29ubmVjdGlvbiwKKyAgICAgICAgc29ja2V0LCByZWNlaXZpbmcsIHRyYW5zbWl0dGluZywgZm9yd2FyZGluZywgcm91dGluZywgcGFja2V0cywKKyAgICAgICAgbW9kdWxlcywgL3Byb2MsIHNrX2J1ZmYsIEZJQiwgdGFncy4KKyAgICAgIDpEZXNjcmlwdGlvbjogRXhjZWxsZW50IHBhcGVyIGRldm90ZWQgdG8gdGhlIExpbnV4IElQIE5ldHdvcmtpbmcsCisgICAgICAgIGV4cGxhaW5pbmcgYW55dGhpbmcgZnJvbSB0aGUga2VybmVsJ3MgdG8gdGhlIHVzZXIgc3BhY2UKKyAgICAgICAgY29uZmlndXJhdGlvbiB0b29scycgY29kZS4gVmVyeSBnb29kIHRvIGdldCBhIGdlbmVyYWwgb3ZlcnZpZXcgb2YKKyAgICAgICAgdGhlIGtlcm5lbCBuZXR3b3JraW5nIGltcGxlbWVudGF0aW9uIGFuZCB1bmRlcnN0YW5kIGFsbCBzdGVwcworICAgICAgICBwYWNrZXRzIGZvbGxvdyBmcm9tIHRoZSB0aW1lIHRoZXkgYXJlIHJlY2VpdmVkIGF0IHRoZSBuZXR3b3JrCisgICAgICAgIGRldmljZSB0aWxsIHRoZXkgYXJlIGRlbGl2ZXJlZCB0byBhcHBsaWNhdGlvbnMuIFRoZSBzdHVkaWVkIGtlcm5lbAorICAgICAgICBjb2RlIGlzIGZyb20gMi4yLjE0IHZlcnNpb24uIFByb3ZpZGVzIGNvZGUgZm9yIGEgd29ya2luZyBwYWNrZXQKKyAgICAgICAgZHJvcHBlciBleGFtcGxlLgogCi0gICAgICogVGl0bGU6ICJMaW51eCBLZXJuZWwgRGV2ZWxvcG1lbnQsIDNyZCBFZGl0aW9uIgotICAgICAgIEF1dGhvcjogUm9iZXJ0IExvdmUKLSAgICAgICBQdWJsaXNoZXI6IEFkZGlzb24tV2VzbGV5LgotICAgICAgIERhdGU6IEp1bHksIDIwMTAKLSAgICAgICBQYWdlczogNDQwCi0gICAgICAgSVNCTjogOTc4LTA2NzIzMjk0NjMKKyAgICAqIFRpdGxlOiAqKkhvdyBUbyBNYWtlIFN1cmUgWW91ciBEcml2ZXIgV2lsbCBXb3JrIE9uIFRoZSBQb3dlciBNYWNpbnRvc2gqKgogCi0gICAgIE1JU0NFTExBTkVPVVM6CisgICAgICA6QXV0aG9yOiBQYXVsIE1hY2tlcnJhcy4KKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC8yNjEKKyAgICAgIDpEYXRlOiAxOTk5CisgICAgICA6S2V5d29yZHM6IE1hYywgUG93ZXIgTWFjaW50b3NoLCBwb3J0aW5nLCBkcml2ZXJzLCBjb21wYXRpYmlsaXR5LgorICAgICAgOkRlc2NyaXB0aW9uOiBUaGUgdGl0bGUgc2F5cyBpdCBhbGwuCiAKLSAgICAgKiBOYW1lOiBsaW51eC9Eb2N1bWVudGF0aW9uCi0gICAgICAgQXV0aG9yOiBNYW55LgotICAgICAgIFVSTDogSnVzdCBsb29rIGluc2lkZSB5b3VyIGtlcm5lbCBzb3VyY2VzLgotICAgICAgIEtleXdvcmRzOiBhbnl0aGluZywgRG9jQm9vay4KLSAgICAgICBEZXNjcmlwdGlvbjogRG9jdW1lbnRhdGlvbiB0aGF0IGNvbWVzIHdpdGggdGhlIGtlcm5lbCBzb3VyY2VzLAotICAgICAgIGluc2lkZSB0aGUgRG9jdW1lbnRhdGlvbiBkaXJlY3RvcnkuIFNvbWUgcGFnZXMgZnJvbSB0aGlzIGRvY3VtZW50Ci0gICAgICAgKGluY2x1ZGluZyB0aGlzIGRvY3VtZW50IGl0c2VsZikgaGF2ZSBiZWVuIG1vdmVkIHRoZXJlLCBhbmQgbWlnaHQKLSAgICAgICBiZSBtb3JlIHVwIHRvIGRhdGUgdGhhbiB0aGUgd2ViIHZlcnNpb24uCisgICAgKiBUaXRsZTogKipBbiBJbnRyb2R1Y3Rpb24gdG8gU0NTSSBEcml2ZXJzKioKIAotICAgICAqIE5hbWU6ICJMaW51eCBLZXJuZWwgU291cmNlIFJlZmVyZW5jZSIKLSAgICAgICBBdXRob3I6IFRob21hcyBHcmFpY2hlbi4KLSAgICAgICBVUkw6IGh0dHA6Ly9tYXJjLmluZm8vP2w9bGludXgta2VybmVsJm09OTY0NDY2NDAxMDIyMDUmdz00Ci0gICAgICAgS2V5d29yZHM6IENWUywgd2ViLCBjdnN3ZWIsIGJyb3dzaW5nIHNvdXJjZSBjb2RlLgotICAgICAgIERlc2NyaXB0aW9uOiBXZWIgaW50ZXJmYWNlIHRvIGEgQ1ZTIHNlcnZlciB3aXRoIHRoZSBrZXJuZWwKLSAgICAgICBzb3VyY2VzLiAiSGVyZSB5b3UgY2FuIGhhdmUgYSBsb29rIGF0IGFueSBmaWxlIG9mIHRoZSBMaW51eCBrZXJuZWwKLSAgICAgICBzb3VyY2VzIG9mIGFueSB2ZXJzaW9uIHN0YXJ0aW5nIGZyb20gMS4wIHVwIHRvIHRoZSAoZGFpbHkgdXBkYXRlZCkKLSAgICAgICBjdXJyZW50IHZlcnNpb24gYXZhaWxhYmxlLiBBbHNvIHlvdSBjYW4gY2hlY2sgdGhlIGRpZmZlcmVuY2VzCi0gICAgICAgYmV0d2VlbiB0d28gdmVyc2lvbnMgb2YgYSBmaWxlIi4KKyAgICAgIDpBdXRob3I6IEFsYW4gQ294LgorICAgICAgOlVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tL2lkLzI4NAorICAgICAgOkRhdGU6IDE5OTkKKyAgICAgIDpLZXl3b3JkczogU0NTSSwgZGV2aWNlLCBkcml2ZXIuCisgICAgICA6RGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbC4KIAotICAgICAqIE5hbWU6ICJDcm9zcy1SZWZlcmVuY2luZyBMaW51eCIKLSAgICAgICBVUkw6IGh0dHA6Ly9seHIuZnJlZS1lbGVjdHJvbnMuY29tLwotICAgICAgIEtleXdvcmRzOiBCcm93c2luZyBzb3VyY2UgY29kZS4KLSAgICAgICBEZXNjcmlwdGlvbjogQW5vdGhlciB3ZWItYmFzZWQgTGludXgga2VybmVsIHNvdXJjZSBjb2RlIGJyb3dzZXIuCi0gICAgICAgTG90cyBvZiBjcm9zcyByZWZlcmVuY2VzIHRvIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zLiBZb3UgY2FuIHNlZQotICAgICAgIHdoZXJlIHRoZXkgYXJlIGRlZmluZWQgYW5kIHdoZXJlIHRoZXkgYXJlIHVzZWQuCisgICAgKiBUaXRsZTogKipBZHZhbmNlZCBTQ1NJIERyaXZlcnMgQW5kIE90aGVyIFRhbGVzKioKIAotICAgICAqIE5hbWU6ICJMaW51eCBXZWVrbHkgTmV3cyIKLSAgICAgICBVUkw6IGh0dHA6Ly9sd24ubmV0Ci0gICAgICAgS2V5d29yZHM6IGxhdGVzdCBrZXJuZWwgbmV3cy4KLSAgICAgICBEZXNjcmlwdGlvbjogVGhlIHRpdGxlIHNheXMgaXQgYWxsLiBUaGVyZSdzIGEgZml4ZWQga2VybmVsIHNlY3Rpb24KLSAgICAgICBzdW1tYXJpemluZyBkZXZlbG9wZXJzJyB3b3JrLCBidWcgZml4ZXMsIG5ldyBmZWF0dXJlcyBhbmQgdmVyc2lvbnMKLSAgICAgICBwcm9kdWNlZCBkdXJpbmcgdGhlIHdlZWsuIFB1Ymxpc2hlZCBldmVyeSBUaHVyc2RheS4KKyAgICAgIDpBdXRob3I6IEFsYW4gQ294LgorICAgICAgOlVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tL2lkLzMwNworICAgICAgOkRhdGU6IDE5OTkKKyAgICAgIDpLZXl3b3JkczogU0NTSSwgZGV2aWNlLCBkcml2ZXIsIGFkdmFuY2VkLgorICAgICAgOkRlc2NyaXB0aW9uOiBUaGUgdGl0bGUgc2F5cyBpdCBhbGwuCiAKLSAgICAgKiBOYW1lOiAiS2VybmVsIFRyYWZmaWMiCi0gICAgICAgVVJMOiBodHRwOi8va3QuZWFydGgubGkva2VybmVsLXRyYWZmaWMvaW5kZXguaHRtbAotICAgICAgIEtleXdvcmRzOiBsaW51eC1rZXJuZWwgbWFpbGluZyBsaXN0LCB3ZWVrbHkga2VybmVsIG5ld3MuCi0gICAgICAgRGVzY3JpcHRpb246IFdlZWtseSBuZXdzbGV0dGVyIGNvdmVyaW5nIHRoZSBtb3N0IHJlbGV2YW50Ci0gICAgICAgZGlzY3Vzc2lvbnMgb2YgdGhlIGxpbnV4LWtlcm5lbCBtYWlsaW5nIGxpc3QuCisgICAgKiBUaXRsZTogKipXcml0aW5nIExpbnV4IE1vdXNlIERyaXZlcnMqKgogCi0gICAgICogTmFtZTogIkN1VFRpTkcuZURHZS5MaU51WCIKLSAgICAgICBVUkw6IGh0dHA6Ly9lZGdlLmtlcm5lbG5vdGVzLm9yZwotICAgICAgIEtleXdvcmRzOiBjaGFuZ2VsaXN0LgotICAgICAgIERlc2NyaXB0aW9uOiBTaXRlIHdoaWNoIHByb3ZpZGVzIHRoZSBjaGFuZ2VsaXN0IGZvciBldmVyeSBrZXJuZWwKLSAgICAgICByZWxlYXNlLiBXaGF0J3MgbmV3LCB3aGF0J3MgYmV0dGVyLCB3aGF0J3MgY2hhbmdlZC4gTXlyZHJhYWwgcmVhZHMKLSAgICAgICB0aGUgcGF0Y2hlcyBhbmQgZGVzY3JpYmVzIHRoZW0uIFBvaW50ZXJzIHRvIHRoZSBwYXRjaGVzIGFyZSB0aGVyZSwKLSAgICAgICB0b28uCisgICAgICA6QXV0aG9yOiBBbGFuIENveC4KKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC8zMzAKKyAgICAgIDpEYXRlOiAxOTk5CisgICAgICA6S2V5d29yZHM6IG1vdXNlLCBkcml2ZXIsIGdwbS4KKyAgICAgIDpEZXNjcmlwdGlvbjogVGhlIHRpdGxlIHNheXMgaXQgYWxsLgogCi0gICAgICogTmFtZTogIk5ldyBsaW51eC1rZXJuZWwgTWFpbGluZyBMaXN0IEZBUSIKLSAgICAgICBVUkw6IGh0dHA6Ly93d3cudHV4Lm9yZy9sa21sLwotICAgICAgIEtleXdvcmRzOiBsaW51eC1rZXJuZWwgbWFpbGluZyBsaXN0IEZBUS4KLSAgICAgICBEZXNjcmlwdGlvbjogbGludXgta2VybmVsIGlzIGEgbWFpbGluZyBsaXN0IGZvciBkZXZlbG9wZXJzIHRvCi0gICAgICAgY29tbXVuaWNhdGUuIFRoaXMgRkFRIGJ1aWxkcyBvbiB0aGUgcHJldmlvdXMgbGludXgta2VybmVsIG1haWxpbmcKLSAgICAgICBsaXN0IEZBUSBtYWludGFpbmVkIGJ5IEZyb2h3YWx0IEVnZXJlciwgd2hvIG5vIGxvbmdlciBtYWludGFpbnMKLSAgICAgICBpdC4gUmVhZCBpdCB0byBzZWUgaG93IHRvIGpvaW4gdGhlIG1haWxpbmcgbGlzdC4gRG96ZW5zIG9mCi0gICAgICAgaW50ZXJlc3RpbmcgcXVlc3Rpb25zIHJlZ2FyZGluZyB0aGUgbGlzdCwgTGludXgsIGRldmVsb3BlcnMgKHdobwotICAgICAgIGlzIC4uLj8pLCB0ZXJtcyAod2hhdCBpcy4uLj8pIGFyZSBhbnN3ZXJlZCBoZXJlIHRvby4gSnVzdCByZWFkIGl0LgorICAgICogVGl0bGU6ICoqTW9yZSBvbiBNb3VzZSBEcml2ZXJzKioKIAotICAgICAqIE5hbWU6ICJMaW51eCBWaXJ0dWFsIEZpbGUgU3lzdGVtIgotICAgICAgIEF1dGhvcjogUGV0ZXIgSi4gQnJhYW0uCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmNvZGEuY3MuY211LmVkdS9kb2MvdGFsa3MvbGludXh2ZnMvCi0gICAgICAgS2V5d29yZHM6IHNsaWRlcywgVkZTLCBpbm9kZSwgc3VwZXJibG9jaywgZGVudHJ5LCBkY2FjaGUuCi0gICAgICAgRGVzY3JpcHRpb246IFNldCBvZiBzbGlkZXMsIHByZXN1bWFibHkgZnJvbSBhIHByZXNlbnRhdGlvbiBvbiB0aGUKLSAgICAgICBMaW51eCBWRlMgbGF5ZXIuIENvdmVycyB2ZXJzaW9uIDIuMS54LCB3aXRoIGRlbnRyaWVzIGFuZCB0aGUKLSAgICAgICBkY2FjaGUuCisgICAgICA6QXV0aG9yOiBBbGFuIENveC4KKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC8zNTYKKyAgICAgIDpEYXRlOiAxOTk5CisgICAgICA6S2V5d29yZHM6IG1vdXNlLCBkcml2ZXIsIGdwbSwgcmFjZXMsIGFzeW5jaHJvbm91cyBJL08uCisgICAgICA6RGVzY3JpcHRpb246IFRoZSB0aXRsZSBzdGlsbCBzYXlzIGl0IGFsbC4KIAotICAgICAqIE5hbWU6ICJHYXJ5J3MgRW5jeWNsb3BlZGlhIC0gVGhlIExpbnV4IEtlcm5lbCIKLSAgICAgICBBdXRob3I6IEdhcnkgKEkgc3VwcG9zZS4uLikuCi0gICAgICAgVVJMOiBodHRwOi8vc2xlbmN5Y2xvcGVkaWEuYmVybGlvcy5kZS9pbmRleC5odG1sCi0gICAgICAgS2V5d29yZHM6IGxpbnV4LCBjb21tdW5pdHksIGV2ZXJ5dGhpbmchCi0gICAgICAgRGVzY3JpcHRpb246IEdhcnkncyBFbmN5Y2xvcGVkaWEgZXhpc3RzIHRvIGFsbG93IHRoZSByYXBpZCBmaW5kaW5nCi0gICAgICAgb2YgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgaW5mb3JtYXRpb24gb2YgaW50ZXJlc3QgdG8gR05VL0xpbnV4Ci0gICAgICAgdXNlcnMuIEl0IGhhcyBhYm91dCA0MDAwIGxpbmtzIHRvIGV4dGVybmFsIHBhZ2VzIGluIDE1MCBtYWpvcgotICAgICAgIGNhdGVnb3JpZXMuIFRoaXMgbGluayBpcyBmb3Iga2VybmVsLXNwZWNpZmljIGxpbmtzLCBkb2N1bWVudHMsCi0gICAgICAgc2l0ZXMuLi4gIFRoaXMgbGlzdCBpcyBub3cgaG9zdGVkIGJ5IGRldmVsb3Blci5CZXJsaW9zLmRlLAotICAgICAgIGJ1dCBzZWVtcyBub3QgdG8gaGF2ZSBiZWVuIHVwZGF0ZWQgc2luY2Ugc29tZXRpbWUgaW4gMTk5OS4KKyAgICAqIFRpdGxlOiAqKldyaXRpbmcgVmlkZW80bGludXggUmFkaW8gRHJpdmVyKioKIAotICAgICAqIE5hbWU6ICJUaGUgaG9tZSBwYWdlIG9mIExpbnV4LU1NIgotICAgICAgIEF1dGhvcjogVGhlIExpbnV4LU1NIHRlYW0uCi0gICAgICAgVVJMOiBodHRwOi8vbGludXgtbW0ub3JnLwotICAgICAgIEtleXdvcmRzOiBtZW1vcnkgbWFuYWdlbWVudCwgTGludXgtTU0sIG1tIHBhdGNoZXMsIFRPRE8sIGRvY3MsCi0gICAgICAgbWFpbGluZyBsaXN0LgotICAgICAgIERlc2NyaXB0aW9uOiBTaXRlIGRldm90ZWQgdG8gTGludXggTWVtb3J5IE1hbmFnZW1lbnQgZGV2ZWxvcG1lbnQuCi0gICAgICAgTWVtb3J5IHJlbGF0ZWQgcGF0Y2hlcywgSE9XVE9zLCBsaW5rcywgbW0gZGV2ZWxvcGVycy4uLiBEb24ndCBtaXNzCi0gICAgICAgaXQgaWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIG1lbW9yeSBtYW5hZ2VtZW50IGRldmVsb3BtZW50IQorICAgICAgOkF1dGhvcjogQWxhbiBDb3guCisgICAgICA6VVJMOiBodHRwOi8vd3d3LmxpbnV4LW1hZy5jb20vaWQvMzgxCisgICAgICA6RGF0ZTogMTk5OQorICAgICAgOktleXdvcmRzOiB2aWRlbzRsaW51eCwgZHJpdmVyLCByYWRpbywgcmFkaW8gZGV2aWNlcy4KKyAgICAgIDpEZXNjcmlwdGlvbjogVGhlIHRpdGxlIHNheXMgaXQgYWxsLgogCi0gICAgICogTmFtZTogIktlcm5lbCBOZXdiaWVzIElSQyBDaGFubmVsIGFuZCBXZWJzaXRlIgotICAgICAgIFVSTDogaHR0cDovL3d3dy5rZXJuZWxuZXdiaWVzLm9yZwotICAgICAgIEtleXdvcmRzOiBJUkMsIG5ld2JpZXMsIGNoYW5uZWwsIGFza2luZyBkb3VidHMuCi0gICAgICAgRGVzY3JpcHRpb246ICNrZXJuZWxuZXdiaWVzIG9uIGlyYy5vZnRjLm5ldC4KLSAgICAgICAja2VybmVsbmV3YmllcyBpcyBhbiBJUkMgbmV0d29yayBkZWRpY2F0ZWQgdG8gdGhlICduZXdiaWUnCi0gICAgICAga2VybmVsIGhhY2tlci4gVGhlIGF1ZGllbmNlIG1vc3RseSBjb25zaXN0cyBvZiBwZW9wbGUgd2hvIGFyZQotICAgICAgIGxlYXJuaW5nIGFib3V0IHRoZSBrZXJuZWwsIHdvcmtpbmcgb24ga2VybmVsIHByb2plY3RzIG9yCi0gICAgICAgcHJvZmVzc2lvbmFsIGtlcm5lbCBoYWNrZXJzIHRoYXQgd2FudCB0byBoZWxwIGxlc3Mgc2Vhc29uZWQga2VybmVsCi0gICAgICAgcGVvcGxlLgotICAgICAgICNrZXJuZWxuZXdiaWVzIGlzIG9uIHRoZSBPRlRDIElSQyBOZXR3b3JrLgotICAgICAgIFRyeSBpcmMub2Z0Yy5uZXQgYXMgeW91ciBzZXJ2ZXIgYW5kIHRoZW4gL2pvaW4gI2tlcm5lbG5ld2JpZXMuCi0gICAgICAgVGhlIGtlcm5lbG5ld2JpZXMgd2Vic2l0ZSBhbHNvIGhvc3RzIGFydGljbGVzLCBkb2N1bWVudHMsIEZBUXMuLi4KLSAgICAgICAKLSAgICAgKiBOYW1lOiAibGludXgta2VybmVsIG1haWxpbmcgbGlzdCBhcmNoaXZlcyBhbmQgc2VhcmNoIGVuZ2luZXMiCi0gICAgICAgVVJMOiBodHRwOi8vdmdlci5rZXJuZWwub3JnL3ZnZXItbGlzdHMuaHRtbAotICAgICAgIFVSTDogaHR0cDovL3d3dy51d3NnLmluZGlhbmEuZWR1L2h5cGVybWFpbC9saW51eC9rZXJuZWwvaW5kZXguaHRtbAotICAgICAgIFVSTDogaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1saW51eC1rZXJuZWwKLSAgICAgICBVUkw6IGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9tbGlzdC5saW51eC5rZXJuZWwKLSAgICAgICBVUkw6IGh0dHA6Ly93d3cuY3MuaGVsc2lua2kuZmkvbGludXgvbGludXgta2VybmVsLwotICAgICAgIFVSTDogaHR0cDovL3d3dy5saWIudWFhLmFsYXNrYS5lZHUvbGludXgta2VybmVsLwotICAgICAgIEtleXdvcmRzOiBsaW51eC1rZXJuZWwsIGFyY2hpdmVzLCBzZWFyY2guCi0gICAgICAgRGVzY3JpcHRpb246IFNvbWUgb2YgdGhlIGxpbnV4LWtlcm5lbCBtYWlsaW5nIGxpc3QgYXJjaGl2ZXJzLiBJZgotICAgICAgIHlvdSBoYXZlIGEgYmV0dGVyL2Fub3RoZXIgb25lLCBwbGVhc2UgbGV0IG1lIGtub3cuCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gICAKLSAgIERvY3VtZW50IGxhc3QgdXBkYXRlZCBvbiBTYXQgMjAwNS1OT1YtMTkKKyAgICAqIFRpdGxlOiAqKkkvTyBFdmVudCBIYW5kbGluZyBVbmRlciBMaW51eCoqCisKKyAgICAgIDpBdXRob3I6IFJpY2hhcmQgR29vY2guCisgICAgICA6VVJMOiBodHRwOi8vd2ViLm1pdC5lZHUvfnlhbmRyb3MvZG9jL2lvLWV2ZW50cy5odG1sCisgICAgICA6RGF0ZTogMTk5OQorICAgICAgOktleXdvcmRzOiBJTywgSS9PLCBzZWxlY3QoMiksIHBvbGwoMiksIEZEcywgYWlvX3JlYWQoMiksIHJlYWRpbmVzcworICAgICAgICBldmVudCBxdWV1ZXMuCisgICAgICA6RGVzY3JpcHRpb246IEZyb20gdGhlIEludHJvZHVjdGlvbjogIkkvTyBFdmVudCBoYW5kbGluZyBpcyBhYm91dAorICAgICAgICBob3cgeW91ciBPcGVyYXRpbmcgU3lzdGVtIGFsbG93cyB5b3UgdG8gbWFuYWdlIGEgbGFyZ2UgbnVtYmVyIG9mCisgICAgICAgIG9wZW4gZmlsZXMgKGZpbGUgZGVzY3JpcHRvcnMgaW4gVU5JWC9QT1NJWCwgb3IgRkRzKSBpbiB5b3VyCisgICAgICAgIGFwcGxpY2F0aW9uLiBZb3Ugd2FudCB0aGUgT1MgdG8gbm90aWZ5IHlvdSB3aGVuIEZEcyBiZWNvbWUgYWN0aXZlCisgICAgICAgIChoYXZlIGRhdGEgcmVhZHkgdG8gYmUgcmVhZCBvciBhcmUgcmVhZHkgZm9yIHdyaXRpbmcpLiBJZGVhbGx5IHlvdQorICAgICAgICB3YW50IGEgbWVjaGFuaXNtIHRoYXQgaXMgc2NhbGFibGUuIFRoaXMgbWVhbnMgYSBsYXJnZSBudW1iZXIgb2YKKyAgICAgICAgaW5hY3RpdmUgRkRzIGNvc3QgdmVyeSBsaXR0bGUgaW4gbWVtb3J5IGFuZCBDUFUgdGltZSB0byBtYW5hZ2UiLgorCisgICAgKiBUaXRsZTogKioobmVhcmx5KSBDb21wbGV0ZSBMaW51eCBMb2FkYWJsZSBLZXJuZWwgTW9kdWxlcy4gVGhlIGRlZmluaXRpdmUgZ3VpZGUgZm9yIGhhY2tlcnMsIHZpcnVzIGNvZGVycyBhbmQgc3lzdGVtIGFkbWluaXN0cmF0b3JzLioqCisKKyAgICAgIDpBdXRob3I6IHByYWdtYXRpYy9USEMuCisgICAgICA6VVJMOiBodHRwOi8vcGFja2V0c3Rvcm1zZWN1cml0eS5vcmcvZG9jcy9oYWNrL0xLTV9IQUNLSU5HLmh0bWwKKyAgICAgIDpEYXRlOiAxOTk5CisgICAgICA6S2V5d29yZHM6IHN5c2NhbGxzLCBpbnRlcmNlcHQsIGhpZGUsIGFidXNlLCBzeW1ib2wgdGFibGUuCisgICAgICA6RGVzY3JpcHRpb246IEludGVyZXN0aW5nIHBhcGVyIG9uIGhvdyB0byBhYnVzZSB0aGUgTGludXgga2VybmVsIGluCisgICAgICAgIG9yZGVyIHRvIGludGVyY2VwdCBhbmQgbW9kaWZ5IHN5c2NhbGxzLCBtYWtlCisgICAgICAgIGZpbGVzL2RpcmVjdG9yaWVzL3Byb2Nlc3NlcyBpbnZpc2libGUsIGJlY29tZSByb290LCBoaWphY2sgdHR5cywKKyAgICAgICAgd3JpdGUga2VybmVsIG1vZHVsZXMgYmFzZWQgdmlydXMuLi4gYW5kIHNvbHV0aW9ucyBmb3IgYWRtaW5zIHRvCisgICAgICAgIGF2b2lkIGFsbCB0aG9zZSBhYnVzZXMuCisgICAgICA6Tm90ZXM6IEZvciAyLjAueCBrZXJuZWxzLiBHaXZlcyBndWlkYW5jZXMgdG8gcG9ydCBpdCB0byAyLjIueAorICAgICAgICBrZXJuZWxzLgorCisgICAgKiBOYW1lOiAqKkxpbnV4IFZpcnR1YWwgRmlsZSBTeXN0ZW0qKgorCisgICAgICA6QXV0aG9yOiBQZXRlciBKLiBCcmFhbS4KKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cuY29kYS5jcy5jbXUuZWR1L2RvYy90YWxrcy9saW51eHZmcy8KKyAgICAgIDpEYXRlOiAxOTk4CisgICAgICA6S2V5d29yZHM6IHNsaWRlcywgVkZTLCBpbm9kZSwgc3VwZXJibG9jaywgZGVudHJ5LCBkY2FjaGUuCisgICAgICA6RGVzY3JpcHRpb246IFNldCBvZiBzbGlkZXMsIHByZXN1bWFibHkgZnJvbSBhIHByZXNlbnRhdGlvbiBvbiB0aGUKKyAgICAgICAgTGludXggVkZTIGxheWVyLiBDb3ZlcnMgdmVyc2lvbiAyLjEueCwgd2l0aCBkZW50cmllcyBhbmQgdGhlCisgICAgICAgIGRjYWNoZS4KKworICAgICogVGl0bGU6ICoqVGhlIFZlbnVzIGtlcm5lbCBpbnRlcmZhY2UqKgorCisgICAgICA6QXV0aG9yOiBQZXRlciBKLiBCcmFhbS4KKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cuY29kYS5jcy5jbXUuZWR1L2RvYy9odG1sL2tlcm5lbC12ZW51cy1wcm90b2NvbC5odG1sCisgICAgICA6RGF0ZTogMTk5OAorICAgICAgOktleXdvcmRzOiBjb2RhLCBmaWxlc3lzdGVtLCB2ZW51cywgY2FjaGUgbWFuYWdlci4KKyAgICAgIDpEZXNjcmlwdGlvbjogIlRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4KKyAgICAgICAgVmVudXMgYW5kIGtlcm5lbCBsZXZlbCBmaWxlIHN5c3RlbSBjb2RlIG5lZWRlZCBmb3IgdGhlIG9wZXJhdGlvbgorICAgICAgICBvZiB0aGUgQ29kYSBmaWxlc3lzdGVtLiBUaGlzIHZlcnNpb24gZG9jdW1lbnQgaXMgbWVhbnQgdG8gZGVzY3JpYmUKKyAgICAgICAgdGhlIGN1cnJlbnQgaW50ZXJmYWNlICh2ZXJzaW9uIDEuMCkgYXMgd2VsbCBhcyBpbXByb3ZlbWVudHMgd2UKKyAgICAgICAgZW52aXNhZ2UiLgorCisgICAgKiBUaXRsZTogKipEZXNpZ24gYW5kIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTZWNvbmQgRXh0ZW5kZWQgRmlsZXN5c3RlbSoqCisKKyAgICAgIDpBdXRob3I6IFLDqW15IENhcmQsIFRoZW9kb3JlIFRzJ28sIFN0ZXBoZW4gVHdlZWRpZS4KKyAgICAgIDpVUkw6IGh0dHA6Ly93ZWIubWl0LmVkdS90eXRzby93d3cvbGludXgvZXh0MmludHJvLmh0bWwKKyAgICAgIDpEYXRlOiAxOTk4CisgICAgICA6S2V5d29yZHM6IGV4dDIsIGxpbnV4IGZzIGhpc3RvcnksIGlub2RlLCBkaXJlY3RvcnksIGxpbmssIGRldmljZXMsCisgICAgICAgIFZGUywgcGh5c2ljYWwgc3RydWN0dXJlLCBwZXJmb3JtYW5jZSwgYmVuY2htYXJrcywgZXh0MmZzIGxpYnJhcnksCisgICAgICAgIGV4dDJmcyB0b29scywgZTJmc2NrLgorICAgICAgOkRlc2NyaXB0aW9uOiBQYXBlciB3cml0dGVuIGJ5IHRocmVlIG9mIHRoZSB0b3AgZXh0MiBoYWNrZXJzLgorICAgICAgICBDb3ZlcnMgTGludXggZmlsZXN5c3RlbXMgaGlzdG9yeSwgZXh0MiBtb3RpdmF0aW9uLCBleHQyIGZlYXR1cmVzLAorICAgICAgICBkZXNpZ24sIHBoeXNpY2FsIHN0cnVjdHVyZSBvbiBkaXNrLCBwZXJmb3JtYW5jZSwgYmVuY2htYXJrcywKKyAgICAgICAgZTJmc2NrJ3MgcGFzc2VzIGRlc2NyaXB0aW9uLi4uIEEgbXVzdCByZWFkIQorICAgICAgOk5vdGVzOiBUaGlzIHBhcGVyIHdhcyBmaXJzdCBwdWJsaXNoZWQgaW4gdGhlIFByb2NlZWRpbmdzIG9mIHRoZQorICAgICAgICBGaXJzdCBEdXRjaCBJbnRlcm5hdGlvbmFsIFN5bXBvc2l1bSBvbiBMaW51eCwgSVNCTiA5MC0zNjctMDM4NS05LgorCisgICAgKiBUaXRsZTogKipUaGUgTGludXggUkFJRC0xLCA0LCA1IENvZGUqKgorCisgICAgICA6QXV0aG9yOiBJbmdvIE1vbG5hciwgR2FkaSBPeG1hbiBhbmQgTWlndWVsIGRlIEljYXphLgorICAgICAgOlVSTDogaHR0cDovL3d3dy5saW51eGpvdXJuYWwuY29tL2FydGljbGUucGhwP3NpZD0yMzkxCisgICAgICA6RGF0ZTogMTk5NworICAgICAgOktleXdvcmRzOiBSQUlELCBNRCBkcml2ZXIuCisgICAgICA6RGVzY3JpcHRpb246IExpbnV4IEpvdXJuYWwgS2VybmVsIEtvcm5lciBhcnRpY2xlLiBIZXJlIGlzIGl0cworICAgICAgOkFic3RyYWN0OiAqQSBkZXNjcmlwdGlvbiBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJBSUQtMSwKKyAgICAgICAgUkFJRC00IGFuZCBSQUlELTUgcGVyc29uYWxpdGllcyBvZiB0aGUgTUQgZGV2aWNlIGRyaXZlciBpbiB0aGUKKyAgICAgICAgTGludXgga2VybmVsLCBwcm92aWRpbmcgdXNlcnMgd2l0aCBoaWdoIHBlcmZvcm1hbmNlIGFuZCByZWxpYWJsZSwKKyAgICAgICAgc2Vjb25kYXJ5LXN0b3JhZ2UgY2FwYWJpbGl0eSB1c2luZyBzb2Z0d2FyZSouCisKKyAgICAqIFRpdGxlOiAqKkxpbnV4IEtlcm5lbCBIYWNrZXJzJyBHdWlkZSoqCisKKyAgICAgIDpBdXRob3I6IE1pY2hhZWwgSy4gSm9obnNvbi4KKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cudGxkcC5vcmcvTERQL2toZy9IeXBlck5ld3MvZ2V0L2toZy5odG1sCisgICAgICA6RGF0ZTogMTk5NworICAgICAgOktleXdvcmRzOiBkZXZpY2UgZHJpdmVycywgZmlsZXMsIFZGUywga2VybmVsIGludGVyZmFjZSwgY2hhcmFjdGVyIHZzCisgICAgICAgIGJsb2NrIGRldmljZXMsIGhhcmR3YXJlIGludGVycnVwdHMsIHNjc2ksIERNQSwgYWNjZXNzIHRvIHVzZXIgbWVtb3J5LAorICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiwgdGltZXJzLgorICAgICAgOkRlc2NyaXB0aW9uOiBBIGd1aWRlIGRlc2lnbmVkIHRvIGhlbHAgeW91IGdldCB1cCB0byBzcGVlZCBvbiB0aGUKKyAgICAgICAgY29uY2VwdHMgdGhhdCBhcmUgbm90IGludHVpdGV2bHkgb2J2aW91cywgYW5kIHRvIGRvY3VtZW50IHRoZSBpbnRlcm5hbAorICAgICAgICBzdHJ1Y3R1cmVzIG9mIExpbnV4LgorCisgICAgKiBUaXRsZTogKipEeW5hbWljIEtlcm5lbHM6IE1vZHVsYXJpemVkIERldmljZSBEcml2ZXJzKioKKworICAgICAgOkF1dGhvcjogQWxlc3NhbmRybyBSdWJpbmkuCisgICAgICA6VVJMOiBodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS5waHA/c2lkPTEyMTkKKyAgICAgIDpEYXRlOiAxOTk2CisgICAgICA6S2V5d29yZHM6IGRldmljZSBkcml2ZXIsIG1vZHVsZSwgbG9hZGluZy91bmxvYWRpbmcgbW9kdWxlcywKKyAgICAgICAgYWxsb2NhdGluZyByZXNvdXJjZXMuCisgICAgICA6RGVzY3JpcHRpb246IExpbnV4IEpvdXJuYWwgS2VybmVsIEtvcm5lciBhcnRpY2xlLiBIZXJlIGlzIGl0cworICAgICAgOkFic3RyYWN0OiAqVGhpcyBpcyB0aGUgZmlyc3Qgb2YgYSBzZXJpZXMgb2YgZm91ciBhcnRpY2xlcworICAgICAgICBjby1hdXRob3JlZCBieSBBbGVzc2FuZHJvIFJ1YmluaSBhbmQgR2VvcmcgWmV6Y2h3aXR6IHdoaWNoIHByZXNlbnQKKyAgICAgICAgYSBwcmFjdGljYWwgYXBwcm9hY2ggdG8gd3JpdGluZyBMaW51eCBkZXZpY2UgZHJpdmVycyBhcyBrZXJuZWwKKyAgICAgICAgbG9hZGFibGUgbW9kdWxlcy4gVGhpcyBpbnN0YWxsbWVudCBwcmVzZW50cyBhbiBpbnRyb2R1Y3Rpb24gdG8gdGhlCisgICAgICAgIHRvcGljLCBwcmVwYXJpbmcgdGhlIHJlYWRlciB0byB1bmRlcnN0YW5kIG5leHQgbW9udGgncworICAgICAgICBpbnN0YWxsbWVudCouCisKKyAgICAqIFRpdGxlOiAqKkR5bmFtaWMgS2VybmVsczogRGlzY292ZXJ5KioKKworICAgICAgOkF1dGhvcjogQWxlc3NhbmRybyBSdWJpbmkuCisgICAgICA6VVJMOiBodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS5waHA/c2lkPTEyMjAKKyAgICAgIDpEYXRlOiAxOTk2CisgICAgICA6S2V5d29yZHM6IGNoYXJhY3RlciBkcml2ZXIsIGluaXRfbW9kdWxlLCBjbGVhbl91cCBtb2R1bGUsCisgICAgICAgIGF1dG9kZXRlY3Rpb24sIG1heW9yIG51bWJlciwgbWlub3IgbnVtYmVyLCBmaWxlIG9wZXJhdGlvbnMsCisgICAgICAgIG9wZW4oKSwgY2xvc2UoKS4KKyAgICAgIDpEZXNjcmlwdGlvbjogTGludXggSm91cm5hbCBLZXJuZWwgS29ybmVyIGFydGljbGUuIEhlcmUgaXMgaXRzCisgICAgICA6QWJzdHJhY3Q6ICpUaGlzIGFydGljbGUsIHRoZSBzZWNvbmQgb2YgZm91ciwgaW50cm9kdWNlcyBwYXJ0IG9mCisgICAgICAgIHRoZSBhY3R1YWwgY29kZSB0byBjcmVhdGUgY3VzdG9tIG1vZHVsZSBpbXBsZW1lbnRpbmcgYSBjaGFyYWN0ZXIKKyAgICAgICAgZGV2aWNlIGRyaXZlci4gSXQgZGVzY3JpYmVzIHRoZSBjb2RlIGZvciBtb2R1bGUgaW5pdGlhbGl6YXRpb24gYW5kCisgICAgICAgIGNsZWFudXAsIGFzIHdlbGwgYXMgdGhlIG9wZW4oKSBhbmQgY2xvc2UoKSBzeXN0ZW0gY2FsbHMqLgorCisgICAgKiBUaXRsZTogKipUaGUgRGV2aWwncyBpbiB0aGUgRGV0YWlscyoqCisKKyAgICAgIDpBdXRob3I6IEdlb3JnIHYuIFplenNjaHdpdHogYW5kIEFsZXNzYW5kcm8gUnViaW5pLgorICAgICAgOlVSTDogaHR0cDovL3d3dy5saW51eGpvdXJuYWwuY29tL2FydGljbGUucGhwP3NpZD0xMjIxCisgICAgICA6RGF0ZTogMTk5NgorICAgICAgOktleXdvcmRzOiByZWFkKCksIHdyaXRlKCksIHNlbGVjdCgpLCBpb2N0bCgpLCBibG9ja2luZy9ub24KKyAgICAgICAgYmxvY2tpbmcgbW9kZSwgaW50ZXJydXB0IGhhbmRsZXIuCisgICAgICA6RGVzY3JpcHRpb246IExpbnV4IEpvdXJuYWwgS2VybmVsIEtvcm5lciBhcnRpY2xlLiBIZXJlIGlzIGl0cworICAgICAgOkFic3RyYWN0OiAqVGhpcyBhcnRpY2xlLCB0aGUgdGhpcmQgb2YgZm91ciBvbiB3cml0aW5nIGNoYXJhY3RlcgorICAgICAgICBkZXZpY2UgZHJpdmVycywgaW50cm9kdWNlcyBjb25jZXB0cyBvZiByZWFkaW5nLCB3cml0aW5nLCBhbmQgdXNpbmcKKyAgICAgICAgaW9jdGwtY2FsbHMqLgorCisgICAgKiBUaXRsZTogKipEaXNzZWN0aW5nIEludGVycnVwdHMgYW5kIEJyb3dzaW5nIERNQSoqCisKKyAgICAgIDpBdXRob3I6IEFsZXNzYW5kcm8gUnViaW5pIGFuZCBHZW9yZyB2LiBaZXpzY2h3aXR6LgorICAgICAgOlVSTDogaHR0cDovL3d3dy5saW51eGpvdXJuYWwuY29tL2FydGljbGUucGhwP3NpZD0xMjIyCisgICAgICA6RGF0ZTogMTk5NgorICAgICAgOktleXdvcmRzOiBpbnRlcnJ1cHRzLCBpcnFzLCBETUEsIGJvdHRvbSBoYWx2ZXMsIHRhc2sgcXVldWVzLgorICAgICAgOkRlc2NyaXB0aW9uOiBMaW51eCBKb3VybmFsIEtlcm5lbCBLb3JuZXIgYXJ0aWNsZS4gSGVyZSBpcyBpdHMKKyAgICAgIDpBYnN0cmFjdDogKlRoaXMgaXMgdGhlIGZvdXJ0aCBpbiBhIHNlcmllcyBvZiBhcnRpY2xlcyBhYm91dAorICAgICAgICB3cml0aW5nIGNoYXJhY3RlciBkZXZpY2UgZHJpdmVycyBhcyBsb2FkYWJsZSBrZXJuZWwgbW9kdWxlcy4gVGhpcworICAgICAgICBtb250aCwgd2UgZnVydGhlciBpbnZlc3RpZ2F0ZSB0aGUgZmllbGQgb2YgaW50ZXJydXB0IGhhbmRsaW5nLgorICAgICAgICBUaG91Z2ggaXQgaXMgY29uY2VwdHVhbGx5IHNpbXBsZSwgcHJhY3RpY2FsIGxpbWl0YXRpb25zIGFuZAorICAgICAgICBjb25zdHJhaW50cyBtYWtlIHRoaXMgYW4gJydpbnRlcmVzdGluZycnIHBhcnQgb2YgZGV2aWNlIGRyaXZlcgorICAgICAgICB3cml0aW5nLCBhbmQgc2V2ZXJhbCBkaWZmZXJlbnQgZmFjaWxpdGllcyBoYXZlIGJlZW4gcHJvdmlkZWQgZm9yCisgICAgICAgIGRpZmZlcmVudCBzaXR1YXRpb25zLiBXZSBhbHNvIGludmVzdGlnYXRlIHRoZSBjb21wbGV4IHRvcGljIG9mCisgICAgICAgIERNQSouCisKKyAgICAqIFRpdGxlOiAqKkRldmljZSBEcml2ZXJzIENvbmNsdWRlZCoqCisKKyAgICAgIDpBdXRob3I6IEdlb3JnIHYuIFplenNjaHdpdHouCisgICAgICA6VVJMOiBodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS5waHA/c2lkPTEyODcKKyAgICAgIDpEYXRlOiAxOTk2CisgICAgICA6S2V5d29yZHM6IGFkZHJlc3Mgc3BhY2VzLCBwYWdlcywgcGFnaW5hdGlvbiwgcGFnZSBtYW5hZ2VtZW50LAorICAgICAgICBkZW1hbmQgbG9hZGluZywgc3dhcHBpbmcsIG1lbW9yeSBwcm90ZWN0aW9uLCBtZW1vcnkgbWFwcGluZywgbW1hcCwKKyAgICAgICAgdmlydHVhbCBtZW1vcnkgYXJlYXMgKFZNQXMpLCB2cmVtYXAsIFBDSS4KKyAgICAgIDpEZXNjcmlwdGlvbjogRmluYWxseSwgdGhlIGFib3ZlIHR1cm5lZCBvdXQgaW50byBhIGZpdmUgYXJ0aWNsZXMKKyAgICAgICAgc2VyaWVzLiBUaGlzIGxhdGVzdCBvbmUncyBpbnRyb2R1Y3Rpb24gcmVhZHM6ICJUaGlzIGlzIHRoZSBsYXN0IG9mCisgICAgICAgIGZpdmUgYXJ0aWNsZXMgYWJvdXQgY2hhcmFjdGVyIGRldmljZSBkcml2ZXJzLiBJbiB0aGlzIGZpbmFsCisgICAgICAgIHNlY3Rpb24sIEdlb3JnIGRlYWxzIHdpdGggbWVtb3J5IG1hcHBpbmcgZGV2aWNlcywgYmVnaW5uaW5nIHdpdGgKKyAgICAgICAgYW4gb3ZlcmFsbCBkZXNjcmlwdGlvbiBvZiB0aGUgTGludXggbWVtb3J5IG1hbmFnZW1lbnQgY29uY2VwdHMiLgorCisgICAgKiBUaXRsZTogKipOZXR3b3JrIEJ1ZmZlcnMgQW5kIE1lbW9yeSBNYW5hZ2VtZW50KioKKworICAgICAgOkF1dGhvcjogQWxhbiBDb3guCisgICAgICA6VVJMOiBodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS5waHA/c2lkPTEzMTIKKyAgICAgIDpEYXRlOiAxOTk2CisgICAgICA6S2V5d29yZHM6IHNrX2J1ZmZzLCBuZXR3b3JrIGRldmljZXMsIHByb3RvY29sL2xpbmsgbGF5ZXIKKyAgICAgICAgdmFyaWFibGVzLCBuZXR3b3JrIGRldmljZXMgZmxhZ3MsIHRyYW5zbWl0LCByZWNlaXZlLAorICAgICAgICBjb25maWd1cmF0aW9uLCBtdWx0aWNhc3QuCisgICAgICA6RGVzY3JpcHRpb246IExpbnV4IEpvdXJuYWwgS2VybmVsIEtvcm5lci4KKyAgICAgIDpBYnN0cmFjdDogKldyaXRpbmcgYSBuZXR3b3JrIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IGlzIGZ1bmRhbWVudGFsbHkKKyAgICAgICAgc2ltcGxlLS0tbW9zdCBvZiB0aGUgY29tcGxleGl0eSAob3RoZXIgdGhhbiB0YWxraW5nIHRvIHRoZQorICAgICAgICBoYXJkd2FyZSkgaW52b2x2ZXMgbWFuYWdpbmcgbmV0d29yayBwYWNrZXRzIGluIG1lbW9yeSouCisKKyAgICAqIFRpdGxlOiAqKkFuYWx5c2lzIG9mIHRoZSBFeHQyZnMgc3RydWN0dXJlKioKKworICAgICAgOkF1dGhvcjogTG91aXMtRG9taW5pcXVlIER1YmVhdS4KKyAgICAgIDpVUkw6IGh0dHA6Ly90ZWFjaGluZy5jc3NlLnV3YS5lZHUuYXUvdW5pdHMvQ0lUUzIwMDIvZnMtZXh0Mi8KKyAgICAgIDpEYXRlOiAxOTk0CisgICAgICA6S2V5d29yZHM6IGV4dDIsIGZpbGVzeXN0ZW0sIGV4dDJmcy4KKyAgICAgIDpEZXNjcmlwdGlvbjogRGVzY3JpcHRpb24gb2YgZXh0MidzIGJsb2NrcywgZGlyZWN0b3JpZXMsIGlub2RlcywKKyAgICAgICAgYml0bWFwcywgaW52YXJpYW50cy4uLgorCitQdWJsaXNoZWQgYm9va3MKKy0tLS0tLS0tLS0tLS0tLQorCisgICAgKiBUaXRsZTogKipMaW51eCBUcmVpYmVyIGVudHdpY2tlbG4qKgorCisgICAgICA6QXV0aG9yOiBKw7xyZ2VuIFF1YWRlLCBFdmEtS2F0aGFyaW5hIEt1bnN0CisgICAgICA6UHVibGlzaGVyOiBkcHVua3QudmVybGFnCisgICAgICA6RGF0ZTogT2N0IDIwMTUgKDR0aCBlZGl0aW9uKQorICAgICAgOlBhZ2VzOiA2ODgKKyAgICAgIDpJU0JOOiA5NzgtMy04NjQ5MC0yODgtOAorICAgICAgOk5vdGU6IEdlcm1hbi4gVGhlIHRoaXJkIGVkaXRpb24gZnJvbSAyMDExIGlzCisgICAgICAgICBtdWNoIGNoZWFwZXIgYW5kIHN0aWxsIHF1aXRlIHVwLXRvLWRhdGUuCisKKyAgICAqIFRpdGxlOiAqKkxpbnV4IEtlcm5lbCBOZXR3b3JraW5nOiBJbXBsZW1lbnRhdGlvbiBhbmQgVGhlb3J5KioKKworICAgICAgOkF1dGhvcjogUmFtaSBSb3NlbgorICAgICAgOlB1Ymxpc2hlcjogQXByZXNzCisgICAgICA6RGF0ZTogRGVjZW1iZXIgMjIsIDIwMTMKKyAgICAgIDpQYWdlczogNjQ4CisgICAgICA6SVNCTjogOTc4LTE0MzAyNjE5NjQKKworICAgICogVGl0bGU6ICoqRW1iZWRkZWQgTGludXggUHJpbWVyOiBBIHByYWN0aWNhbCBSZWFsLVdvcmxkIEFwcHJvYWNoLCAybmQgRWRpdGlvbioqCisKKyAgICAgIDpBdXRob3I6IENocmlzdG9waGVyIEhhbGxpbmFuCisgICAgICA6UHVibGlzaGVyOiBQZWFyc29uCisgICAgICA6RGF0ZTogTm92ZW1iZXIsIDIwMTAKKyAgICAgIDpQYWdlczogNjU2CisgICAgICA6SVNCTjogOTc4LTAxMzcwMTc4MzYKKworICAgICogVGl0bGU6ICoqTGludXggS2VybmVsIERldmVsb3BtZW50LCAzcmQgRWRpdGlvbioqCisKKyAgICAgIDpBdXRob3I6IFJvYmVydCBMb3ZlCisgICAgICA6UHVibGlzaGVyOiBBZGRpc29uLVdlc2xleQorICAgICAgOkRhdGU6IEp1bHksIDIwMTAKKyAgICAgIDpQYWdlczogNDQwCisgICAgICA6SVNCTjogOTc4LTA2NzIzMjk0NjMKKworICAgICogVGl0bGU6ICoqRXNzZW50aWFsIExpbnV4IERldmljZSBEcml2ZXJzKioKKworICAgICAgOkF1dGhvcjogU3JlZWtyaXNobmFuIFZlbmthdGVzd2FyYW4KKyAgICAgIDpQdWJsaXNoZWQ6IFByZW50aWNlIEhhbGwKKyAgICAgIDpEYXRlOiBBcHJpbCwgMjAwOAorICAgICAgOlBhZ2VzOiA3NDQKKyAgICAgIDpJU0JOOiA5NzgtMDEzMjM5NjU1NAorCisuLiBfbGRkM19wdWJsaXNoZWQ6CisKKyAgICAqIFRpdGxlOiAqKkxpbnV4IERldmljZSBEcml2ZXJzLCAzcmQgRWRpdGlvbioqCisKKyAgICAgIDpBdXRob3JzOiBKb25hdGhhbiBDb3JiZXQsIEFsZXNzYW5kcm8gUnViaW5pLCBhbmQgR3JlZyBLcm9haC1IYXJ0bWFuCisgICAgICA6UHVibGlzaGVyOiBPJ1JlaWxseSAmIEFzc29jaWF0ZXMKKyAgICAgIDpEYXRlOiAyMDA1CisgICAgICA6UGFnZXM6IDYzNgorICAgICAgOklTQk46IDAtNTk2LTAwNTkwLTMKKyAgICAgIDpOb3RlczogRnVydGhlciBpbmZvcm1hdGlvbiBpbgorICAgICAgICBodHRwOi8vd3d3Lm9yZWlsbHkuY29tL2NhdGFsb2cvbGludXhkcml2ZTMvCisgICAgICAgIFBERiBmb3JtYXQsIFVSTDogaHR0cDovL2x3bi5uZXQvS2VybmVsL0xERDMvCisKKyAgICAqIFRpdGxlOiAqKkxpbnV4IEtlcm5lbCBJbnRlcm5hbHMqKgorCisgICAgICA6QXV0aG9yOiBNaWNoYWVsIEJlY2sKKyAgICAgIDpQdWJsaXNoZXI6IEFkZGlzb24tV2VzbGV5CisgICAgICA6RGF0ZTogMTk5NworICAgICAgOklTQk46IDAtMjAxLTMzMTQzLTggKHNlY29uZCBlZGl0aW9uKQorCisgICAgKiBUaXRsZTogKipQcm9ncmFtbWF0aW9uIExpbnV4IDIuMCBBUEkgc3lzdGVtZSBldCBmb25jdGlvbm5lbWVudCBkdSBub3lhdSoqCisKKyAgICAgIDpBdXRob3I6IFJlbXkgQ2FyZCwgRXJpYyBEdW1hcywgRnJhbmNrIE1ldmVsCisgICAgICA6UHVibGlzaGVyOiBFeXJvbGxlcworICAgICAgOkRhdGU6IDE5OTcKKyAgICAgIDpQYWdlczogNTIwCisgICAgICA6SVNCTjogMi0yMTItMDg5MzItNQorICAgICAgOk5vdGVzOiBGcmVuY2gKKworICAgICogVGl0bGU6ICoqVGhlIERlc2lnbiBhbmQgSW1wbGVtZW50YXRpb24gb2YgdGhlIDQuNCBCU0QgVU5JWCBPcGVyYXRpbmcgU3lzdGVtKioKKworICAgICAgOkF1dGhvcjogTWFyc2hhbGwgS2lyayBNY0t1c2ljaywgS2VpdGggQm9zdGljLCBNaWNoYWVsIEouIEthcmVscywKKyAgICAgICAgSm9obiBTLiBRdWFydGVybWFuCisgICAgICA6UHVibGlzaGVyOiBBZGRpc29uLVdlc2xleQorICAgICAgOkRhdGU6IDE5OTYKKyAgICAgIDpJU0JOOiAwLTIwMS01NDk3OS00CisKKyAgICAqIFRpdGxlOiAqKlVuaXggaW50ZXJuYWxzIC0tIHRoZSBuZXcgZnJvbnRpZXJzKioKKworICAgICAgOkF1dGhvcjogVXJlc2ggVmFoYWxpYQorICAgICAgOlB1Ymxpc2hlcjogUHJlbnRpY2UgSGFsbAorICAgICAgOkRhdGU6IDE5OTYKKyAgICAgIDpQYWdlczogNjAwCisgICAgICA6SVNCTjogMC0xMy0xMDE5MDgtMgorCisgICAgKiBUaXRsZTogKipQcm9ncmFtbWluZyBmb3IgdGhlIHJlYWwgd29ybGQgLSBQT1NJWC40KioKKworICAgICAgOkF1dGhvcjogQmlsbCBPLiBHYWxsbWVpc3RlcgorICAgICAgOlB1Ymxpc2hlcjogTydSZWlsbHkgJiBBc3NvY2lhdGVzLCBJbmMKKyAgICAgIDpEYXRlOiAxOTk1CisgICAgICA6UGFnZXM6IDU1MgorICAgICAgOklTQk46IEktNTY1OTItMDc0LTAKKyAgICAgIDpOb3RlczogVGhvdWdoIG5vdCBiZWluZyBkaXJlY3RseSBhYm91dCBMaW51eCwgTGludXggYWltcyB0byBiZQorICAgICAgICBQT1NJWC4gR29vZCByZWZlcmVuY2UuCisKKyAgICAqIFRpdGxlOiAgKipVTklYICBTeXN0ZW1zICBmb3IgIE1vZGVybiBBcmNoaXRlY3R1cmVzOiBTeW1tZXRyaWMgTXVsdGlwcm9jZXNzaW5nIGFuZCBDYWNoaW5nIGZvciBLZXJuZWwgUHJvZ3JhbW1lcnMqKgorCisgICAgICA6QXV0aG9yOiBDdXJ0IFNjaGltbWVsCisgICAgICA6UHVibGlzaGVyOiBBZGRpc29uIFdlc2xleQorICAgICAgOkRhdGU6IEp1bmUsIDE5OTQKKyAgICAgIDpQYWdlczogNDMyCisgICAgICA6SVNCTjogMC0yMDEtNjMzMzgtOAorCisgICAgKiBUaXRsZTogKipUaGUgRGVzaWduIGFuZCBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgNC4zIEJTRCBVTklYIE9wZXJhdGluZyBTeXN0ZW0qKgorCisgICAgICA6QXV0aG9yOiBTYW11ZWwgSi4gTGVmZmxlciwgTWFyc2hhbGwgS2lyayBNY0t1c2ljaywgTWljaGFlbCBKCisgICAgICAgIEthcmVscywgSm9obiBTLiBRdWFydGVybWFuCisgICAgICA6UHVibGlzaGVyOiBBZGRpc29uLVdlc2xleQorICAgICAgOkRhdGU6IDE5ODkgKHJlcHJpbnRlZCB3aXRoIGNvcnJlY3Rpb25zIG9uIE9jdG9iZXIsIDE5OTApCisgICAgICA6SVNCTjogMC0yMDEtMDYxOTYtMQorCisgICAgKiBUaXRsZTogKipUaGUgRGVzaWduIG9mIHRoZSBVTklYIE9wZXJhdGluZyBTeXN0ZW0qKgorCisgICAgICA6QXV0aG9yOiBNYXVyaWNlIEouIEJhY2gKKyAgICAgIDpQdWJsaXNoZXI6IFByZW50aWNlIEhhbGwKKyAgICAgIDpEYXRlOiAxOTg2CisgICAgICA6UGFnZXM6IDQ3MQorICAgICAgOklTQk46IDAtMTMtMjAxNzU3LTEKKworTWlzY2VsbGFuZW91cworLS0tLS0tLS0tLS0tLQorCisgICAgKiBOYW1lOiAqKkNyb3NzLVJlZmVyZW5jaW5nIExpbnV4KioKKworICAgICAgOlVSTDogaHR0cDovL2x4ci5mcmVlLWVsZWN0cm9ucy5jb20vCisgICAgICA6S2V5d29yZHM6IEJyb3dzaW5nIHNvdXJjZSBjb2RlLgorICAgICAgOkRlc2NyaXB0aW9uOiBBbm90aGVyIHdlYi1iYXNlZCBMaW51eCBrZXJuZWwgc291cmNlIGNvZGUgYnJvd3Nlci4KKyAgICAgICAgTG90cyBvZiBjcm9zcyByZWZlcmVuY2VzIHRvIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zLiBZb3UgY2FuIHNlZQorICAgICAgICB3aGVyZSB0aGV5IGFyZSBkZWZpbmVkIGFuZCB3aGVyZSB0aGV5IGFyZSB1c2VkLgorCisgICAgKiBOYW1lOiAqKkxpbnV4IFdlZWtseSBOZXdzKioKKworICAgICAgOlVSTDogaHR0cDovL2x3bi5uZXQKKyAgICAgIDpLZXl3b3JkczogbGF0ZXN0IGtlcm5lbCBuZXdzLgorICAgICAgOkRlc2NyaXB0aW9uOiBUaGUgdGl0bGUgc2F5cyBpdCBhbGwuIFRoZXJlJ3MgYSBmaXhlZCBrZXJuZWwgc2VjdGlvbgorICAgICAgICBzdW1tYXJpemluZyBkZXZlbG9wZXJzJyB3b3JrLCBidWcgZml4ZXMsIG5ldyBmZWF0dXJlcyBhbmQgdmVyc2lvbnMKKyAgICAgICAgcHJvZHVjZWQgZHVyaW5nIHRoZSB3ZWVrLiBQdWJsaXNoZWQgZXZlcnkgVGh1cnNkYXkuCisKKyAgICAqIE5hbWU6ICoqVGhlIGhvbWUgcGFnZSBvZiBMaW51eC1NTSoqCisKKyAgICAgIDpBdXRob3I6IFRoZSBMaW51eC1NTSB0ZWFtLgorICAgICAgOlVSTDogaHR0cDovL2xpbnV4LW1tLm9yZy8KKyAgICAgIDpLZXl3b3JkczogbWVtb3J5IG1hbmFnZW1lbnQsIExpbnV4LU1NLCBtbSBwYXRjaGVzLCBUT0RPLCBkb2NzLAorICAgICAgICBtYWlsaW5nIGxpc3QuCisgICAgICA6RGVzY3JpcHRpb246IFNpdGUgZGV2b3RlZCB0byBMaW51eCBNZW1vcnkgTWFuYWdlbWVudCBkZXZlbG9wbWVudC4KKyAgICAgICAgTWVtb3J5IHJlbGF0ZWQgcGF0Y2hlcywgSE9XVE9zLCBsaW5rcywgbW0gZGV2ZWxvcGVycy4uLiBEb24ndCBtaXNzCisgICAgICAgIGl0IGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBtZW1vcnkgbWFuYWdlbWVudCBkZXZlbG9wbWVudCEKKworICAgICogTmFtZTogKipLZXJuZWwgTmV3YmllcyBJUkMgQ2hhbm5lbCBhbmQgV2Vic2l0ZSoqCisKKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cua2VybmVsbmV3Ymllcy5vcmcKKyAgICAgIDpLZXl3b3JkczogSVJDLCBuZXdiaWVzLCBjaGFubmVsLCBhc2tpbmcgZG91YnRzLgorICAgICAgOkRlc2NyaXB0aW9uOiAja2VybmVsbmV3YmllcyBvbiBpcmMub2Z0Yy5uZXQuCisgICAgICAgICNrZXJuZWxuZXdiaWVzIGlzIGFuIElSQyBuZXR3b3JrIGRlZGljYXRlZCB0byB0aGUgJ25ld2JpZScKKyAgICAgICAga2VybmVsIGhhY2tlci4gVGhlIGF1ZGllbmNlIG1vc3RseSBjb25zaXN0cyBvZiBwZW9wbGUgd2hvIGFyZQorICAgICAgICBsZWFybmluZyBhYm91dCB0aGUga2VybmVsLCB3b3JraW5nIG9uIGtlcm5lbCBwcm9qZWN0cyBvcgorICAgICAgICBwcm9mZXNzaW9uYWwga2VybmVsIGhhY2tlcnMgdGhhdCB3YW50IHRvIGhlbHAgbGVzcyBzZWFzb25lZCBrZXJuZWwKKyAgICAgICAgcGVvcGxlLgorICAgICAgICAja2VybmVsbmV3YmllcyBpcyBvbiB0aGUgT0ZUQyBJUkMgTmV0d29yay4KKyAgICAgICAgVHJ5IGlyYy5vZnRjLm5ldCBhcyB5b3VyIHNlcnZlciBhbmQgdGhlbiAvam9pbiAja2VybmVsbmV3Ymllcy4KKyAgICAgICAgVGhlIGtlcm5lbG5ld2JpZXMgd2Vic2l0ZSBhbHNvIGhvc3RzIGFydGljbGVzLCBkb2N1bWVudHMsIEZBUXMuLi4KKworICAgICogTmFtZTogKipsaW51eC1rZXJuZWwgbWFpbGluZyBsaXN0IGFyY2hpdmVzIGFuZCBzZWFyY2ggZW5naW5lcyoqCisKKyAgICAgIDpVUkw6IGh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvdmdlci1saXN0cy5odG1sCisgICAgICA6VVJMOiBodHRwOi8vd3d3LnV3c2cuaW5kaWFuYS5lZHUvaHlwZXJtYWlsL2xpbnV4L2tlcm5lbC9pbmRleC5odG1sCisgICAgICA6VVJMOiBodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvbWxpc3QubGludXgua2VybmVsCisgICAgICA6S2V5d29yZHM6IGxpbnV4LWtlcm5lbCwgYXJjaGl2ZXMsIHNlYXJjaC4KKyAgICAgIDpEZXNjcmlwdGlvbjogU29tZSBvZiB0aGUgbGludXgta2VybmVsIG1haWxpbmcgbGlzdCBhcmNoaXZlcnMuIElmCisgICAgICAgIHlvdSBoYXZlIGEgYmV0dGVyL2Fub3RoZXIgb25lLCBwbGVhc2UgbGV0IG1lIGtub3cuCisKKy0tLS0tLS0KKworRG9jdW1lbnQgbGFzdCB1cGRhdGVkIG9uIFR1ZSAyMDE2LVNlcC0yMAorCitUaGlzIGRvY3VtZW50IGlzIGJhc2VkIG9uOgorIGh0dHA6Ly93d3cuZGl0LnVwbS5lcy9+am1zZXlhcy9saW51eC9rZXJuZWwvaGFja2Vycy1kb2NzLmh0bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLWRvY3VtZW50YXRpb24ucnN0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jdW1lbnRhdGlvbi5yc3QKaW5kZXggYzRlYjUwNC4uMTBjYzdkZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jdW1lbnRhdGlvbi5yc3QKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jdW1lbnRhdGlvbi5yc3QKQEAgLTEwNyw2ICsxMDcsMzUgQEAKICAgdGhlIG9yZGVyIGFzIGVuY291bnRlcmVkLiIpLCBoYXZpbmcgdGhlIGhpZ2hlciBsZXZlbHMgdGhlIHNhbWUgb3ZlcmFsbCBtYWtlcwogICBpdCBlYXNpZXIgdG8gZm9sbG93IHRoZSBkb2N1bWVudHMuCiAKKwordGhlIEMgZG9tYWluCistLS0tLS0tLS0tLS0KKworVGhlIGBTcGhpbnggQyBEb21haW5gXyAobmFtZSBjKSBpcyBzdWl0ZWQgZm9yIGRvY3VtZW50YXRpb24gb2YgQyBBUEkuIEUuZy4gYQorZnVuY3Rpb24gcHJvdG90eXBlOgorCisuLiBjb2RlLWJsb2NrOjogcnN0CisKKyAgICAuLiBjOmZ1bmN0aW9uOjogaW50IGlvY3RsKCBpbnQgZmQsIGludCByZXF1ZXN0ICkKKworVGhlIEMgZG9tYWluIG9mIHRoZSBrZXJuZWwtZG9jIGhhcyBzb21lIGFkZGl0aW9uYWwgZmVhdHVyZXMuIEUuZy4geW91IGNhbgorKnJlbmFtZSogdGhlIHJlZmVyZW5jZSBuYW1lIG9mIGEgZnVuY3Rpb24gd2l0aCBhIGNvbW1vbiBuYW1lIGxpa2UgYGBvcGVuYGAgb3IKK2BgaW9jdGxgYDoKKworLi4gY29kZS1ibG9jazo6IHJzdAorCisgICAgIC4uIGM6ZnVuY3Rpb246OiBpbnQgaW9jdGwoIGludCBmZCwgaW50IHJlcXVlc3QgKQorICAgICAgICA6bmFtZTogVklESU9DX0xPR19TVEFUVVMKKworVGhlIGZ1bmMtbmFtZSAoZS5nLiBpb2N0bCkgcmVtYWlucyBpbiB0aGUgb3V0cHV0IGJ1dCB0aGUgcmVmLW5hbWUgY2hhbmdlZCBmcm9tCitgYGlvY3RsYGAgdG8gYGBWSURJT0NfTE9HX1NUQVRVU2BgLiBUaGUgaW5kZXggZW50cnkgZm9yIHRoaXMgZnVuY3Rpb24gaXMgYWxzbworY2hhbmdlZCB0byBgYFZJRElPQ19MT0dfU1RBVFVTYGAgYW5kIHRoZSBmdW5jdGlvbiBjYW4gbm93IHJlZmVyZW5jZWQgYnk6CisKKy4uIGNvZGUtYmxvY2s6OiByc3QKKworICAgICA6YzpmdW5jOmBWSURJT0NfTE9HX1NUQVRVU2AKKworCiBsaXN0IHRhYmxlcwogLS0tLS0tLS0tLS0KIApAQCAtMjY1LDYgKzI5NCw4IEBACiBgYHNjcmlwdHMva2VybmVsLWRvY2BgIHNjcmlwdCB0byBleHRyYWN0IHRoZSBkb2N1bWVudGF0aW9uIGNvbW1lbnRzIGZyb20gdGhlCiBzb3VyY2UuCiAKKy4uIF9rZXJuZWxfZG9jOgorCiBXcml0aW5nIGtlcm5lbC1kb2MgY29tbWVudHMKID09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0zNjYsOCArMzk3LDYgQEAKIENyb3NzLXJlZmVyZW5jaW5nIGZyb20gcmVTdHJ1Y3R1cmVkVGV4dAogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAKLS4uIGhpZ2hsaWdodDo6IG5vbmUKLQogVG8gY3Jvc3MtcmVmZXJlbmNlIHRoZSBmdW5jdGlvbnMgYW5kIHR5cGVzIGRlZmluZWQgaW4gdGhlIGtlcm5lbC1kb2MgY29tbWVudHMKIGZyb20gcmVTdHJ1Y3R1cmVkVGV4dCBkb2N1bWVudHMsIHBsZWFzZSB1c2UgdGhlIGBTcGhpbnggQyBEb21haW5gXwogcmVmZXJlbmNlcy4gRm9yIGV4YW1wbGU6OgpAQCAtMzkwLDggKzQxOSw2IEBACiBGdW5jdGlvbiBkb2N1bWVudGF0aW9uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS4uIGhpZ2hsaWdodDo6IGMKLQogVGhlIGdlbmVyYWwgZm9ybWF0IG9mIGEgZnVuY3Rpb24gYW5kIGZ1bmN0aW9uLWxpa2UgbWFjcm8ga2VybmVsLWRvYyBjb21tZW50IGlzOjoKIAogICAvKioKQEAgLTU3Miw4ICs1OTksNiBAQAogQ29udmVydGluZyBEb2NCb29rIHRvIFNwaGlueAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0uLiBoaWdobGlnaHQ6OiBub25lCi0KIE92ZXIgdGltZSwgd2UgZXhwZWN0IGFsbCBvZiB0aGUgZG9jdW1lbnRzIHVuZGVyIGBgRG9jdW1lbnRhdGlvbi9Eb2NCb29rYGAgdG8gYmUKIGNvbnZlcnRlZCB0byBTcGhpbnggYW5kIHJlU3RydWN0dXJlZFRleHQuIEZvciBtb3N0IERvY0Jvb2sgWE1MIGRvY3VtZW50cywgYSBnb29kCiBlbm91Z2ggc29sdXRpb24gaXMgdG8gdXNlIHRoZSBzaW1wbGUgYGBEb2N1bWVudGF0aW9uL3NwaGlueC90bXBsY3Z0YGAgc2NyaXB0LApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCA0NmMwMzBhLi42ZmExZDhhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtNjk4LDYgKzY5OCwxNSBAQAogCQkJbG9vcHMgY2FuIGJlIGRlYnVnZ2VkIG1vcmUgZWZmZWN0aXZlbHkgb24gcHJvZHVjdGlvbgogCQkJc3lzdGVtcy4KIAorCWNsb2Nrc291cmNlLmFybV9hcmNoX3RpbWVyLmZzbC1hMDA4NTg1PQorCQkJW0FSTTY0XQorCQkJRm9ybWF0OiA8Ym9vbD4KKwkJCUVuYWJsZS9kaXNhYmxlIHRoZSB3b3JrYXJvdW5kIG9mIEZyZWVzY2FsZS9OWFAKKwkJCWVycmF0dW0gQS0wMDg1ODUuICBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIEtWTQorCQkJZ3Vlc3RzLCBpZiB0aGUgZ3Vlc3QgZGV2aWNlIHRyZWUgZG9lc24ndCBzaG93IHRoZQorCQkJZXJyYXR1bS4gIElmIHVuc3BlY2lmaWVkLCB0aGUgd29ya2Fyb3VuZCBpcworCQkJZW5hYmxlZCBiYXNlZCBvbiB0aGUgZGV2aWNlIHRyZWUuCisKIAljbGVhcmNwdWlkPUJJVE5VTSBbWDg2XQogCQkJRGlzYWJsZSBDUFVJRCBmZWF0dXJlIFggZm9yIHRoZSBrZXJuZWwuIFNlZQogCQkJYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZXMuaCBmb3IgdGhlIHZhbGlkIGJpdApAQCAtMTA0NSwxMSArMTA1NCwxMiBAQAogCQkJZGV0ZXJtaW5lZCBieSB0aGUgc3Rkb3V0LXBhdGggcHJvcGVydHkgaW4gZGV2aWNlCiAJCQl0cmVlJ3MgY2hvc2VuIG5vZGUuCiAKLQkJY2Rucyw8YWRkcj4KLQkJCVN0YXJ0IGFuIGVhcmx5LCBwb2xsZWQtbW9kZSBjb25zb2xlIG9uIGEgY2FkZW5jZSBzZXJpYWwKLQkJCXBvcnQgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLiBUaGUgY2FkZW5jZSBzZXJpYWwgcG9ydAotCQkJbXVzdCBhbHJlYWR5IGJlIHNldHVwIGFuZCBjb25maWd1cmVkLiBPcHRpb25zIGFyZSBub3QKLQkJCXlldCBzdXBwb3J0ZWQuCisJCWNkbnMsPGFkZHI+WyxvcHRpb25zXQorCQkJU3RhcnQgYW4gZWFybHksIHBvbGxlZC1tb2RlIGNvbnNvbGUgb24gYSBDYWRlbmNlCisJCQkoeHVhcnRwcykgc2VyaWFsIHBvcnQgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLiBPbmx5CisJCQlzdXBwb3J0ZWQgb3B0aW9uIGlzIGJhdWQgcmF0ZS4gSWYgYmF1ZCByYXRlIGlzIG5vdAorCQkJc3BlY2lmaWVkLCB0aGUgc2VyaWFsIHBvcnQgbXVzdCBhbHJlYWR5IGJlIHNldHVwIGFuZAorCQkJY29uZmlndXJlZC4KIAogCQl1YXJ0WzgyNTBdLGlvLDxhZGRyPlssb3B0aW9uc10KIAkJdWFydFs4MjUwXSxtbWlvLDxhZGRyPlssb3B0aW9uc10KQEAgLTEzNjQsNiArMTM3NCwxMCBAQAogCQkJRm9ybWF0OiA8dW5zaWduZWQgaW50PiBzdWNoIHRoYXQgKHJ4c2l6ZSAmIH4weDFmZmZjMCkgPT0gMC4KIAkJCURlZmF1bHQ6IDEwMjQKIAorCWdwaW8tbW9ja3VwLmdwaW9fbW9ja3VwX3JhbmdlcworCQkJW0hXXSBTZXRzIHRoZSByYW5nZXMgb2YgZ3Bpb2NoaXAgb2YgZm9yIHRoaXMgZGV2aWNlLgorCQkJRm9ybWF0OiA8c3RhcnQxPiw8ZW5kMT4sPHN0YXJ0Mj4sPGVuZDI+Li4uCisKIAloYXJkbG9ja3VwX2FsbF9jcHVfYmFja3RyYWNlPQogCQkJW0tOTF0gU2hvdWxkIHRoZSBoYXJkLWxvY2t1cCBkZXRlY3RvciBnZW5lcmF0ZQogCQkJYmFja3RyYWNlcyBvbiBhbGwgY3B1cy4KQEAgLTE2ODgsNyArMTcwMiw3IEBACiAKIAlpbnRlbF9pZGxlLm1heF9jc3RhdGU9CVtLTkwsSFcsQUNQSSxYODZdCiAJCQkwCWRpc2FibGVzIGludGVsX2lkbGUgYW5kIGZhbGwgYmFjayBvbiBhY3BpX2lkbGUuCi0JCQkxIHRvIDYJc3BlY2lmeSBtYXhpbXVtIGRlcHRoIG9mIEMtc3RhdGUuCisJCQkxIHRvIDkJc3BlY2lmeSBtYXhpbXVtIGRlcHRoIG9mIEMtc3RhdGUuCiAKIAlpbnRlbF9wc3RhdGU9ICBbWDg2XQogCQkgICAgICAgZGlzYWJsZQpAQCAtMjE2MSwxMCArMjE3NSwxMyBAQAogCQkJdGhhbiBvciBlcXVhbCB0byB0aGlzIHBoeXNpY2FsIGFkZHJlc3MgaXMgaWdub3JlZC4KIAogCW1heGNwdXM9CVtTTVBdIE1heGltdW0gbnVtYmVyIG9mIHByb2Nlc3NvcnMgdGhhdAlhbiBTTVAga2VybmVsCi0JCQlzaG91bGQgbWFrZSB1c2Ugb2YuICBtYXhjcHVzPW4gOiBuID49IDAgbGltaXRzIHRoZQotCQkJa2VybmVsIHRvIHVzaW5nICduJyBwcm9jZXNzb3JzLiAgbj0wIGlzIGEgc3BlY2lhbCBjYXNlLAotCQkJaXQgaXMgZXF1aXZhbGVudCB0byAibm9zbXAiLCB3aGljaCBhbHNvIGRpc2FibGVzCi0JCQl0aGUgSU8gQVBJQy4KKwkJCXdpbGwgYnJpbmcgdXAgZHVyaW5nIGJvb3R1cC4gIG1heGNwdXM9biA6IG4gPj0gMCBsaW1pdHMKKwkJCXRoZSBrZXJuZWwgdG8gYnJpbmcgdXAgJ24nIHByb2Nlc3NvcnMuIFN1cmVseSBhZnRlcgorCQkJYm9vdHVwIHlvdSBjYW4gYnJpbmcgdXAgdGhlIG90aGVyIHBsdWdnZWQgY3B1IGJ5IGV4ZWN1dGluZworCQkJImVjaG8gMSA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdVgvb25saW5lIi4gU28gbWF4Y3B1cworCQkJb25seSB0YWtlcyBlZmZlY3QgZHVyaW5nIHN5c3RlbSBib290dXAuCisJCQlXaGlsZSBuPTAgaXMgYSBzcGVjaWFsIGNhc2UsIGl0IGlzIGVxdWl2YWxlbnQgdG8gIm5vc21wIiwKKwkJCXdoaWNoIGFsc28gZGlzYWJsZXMgdGhlIElPIEFQSUMuCiAKIAltYXhfbG9vcD0JW0xPT1BdIFRoZSBudW1iZXIgb2YgbG9vcCBibG9jayBkZXZpY2VzIHRoYXQgZ2V0CiAJKGxvb3AubWF4X2xvb3ApCXVuY29uZGl0aW9uYWxseSBwcmUtY3JlYXRlZCBhdCBpbml0IHRpbWUuIFRoZSBkZWZhdWx0CkBAIC0yNTcxLDggKzI1ODgsNiBAQAogCiAJbm9kZWxheWFjY3QJW0tOTF0gRGlzYWJsZSBwZXItdGFzayBkZWxheSBhY2NvdW50aW5nCiAKLQlub2Rpc2Nvbm5lY3QJW0hXLFNDU0ksTTY4S10gRGlzYWJsZXMgU0NTSSBkaXNjb25uZWN0cy4KLQogCW5vZHNwCQlbU0hdIERpc2FibGUgaGFyZHdhcmUgRFNQIGF0IGJvb3QgdGltZS4KIAogCW5vZWZpCQlEaXNhYmxlIEVGSSBydW50aW1lIHNlcnZpY2VzIHN1cHBvcnQuCkBAIC0yNzczLDkgKzI3ODgsMTIgQEAKIAogCW5yX2NwdXM9CVtTTVBdIE1heGltdW0gbnVtYmVyIG9mIHByb2Nlc3NvcnMgdGhhdAlhbiBTTVAga2VybmVsCiAJCQljb3VsZCBzdXBwb3J0LiAgbnJfY3B1cz1uIDogbiA+PSAxIGxpbWl0cyB0aGUga2VybmVsIHRvCi0JCQlzdXBwb3J0aW5nICduJyBwcm9jZXNzb3JzLiBMYXRlciBpbiBydW50aW1lIHlvdSBjYW4gbm90Ci0JCQl1c2UgaG90cGx1ZyBjcHUgZmVhdHVyZSB0byBwdXQgbW9yZSBjcHUgYmFjayB0byBvbmxpbmUuCi0JCQlqdXN0IGxpa2UgeW91IGNvbXBpbGUgdGhlIGtlcm5lbCBOUl9DUFVTPW4KKwkJCXN1cHBvcnQgJ24nIHByb2Nlc3NvcnMuIEl0IGNvdWxkIGJlIGxhcmdlciB0aGFuIHRoZQorCQkJbnVtYmVyIG9mIGFscmVhZHkgcGx1Z2dlZCBDUFUgZHVyaW5nIGJvb3R1cCwgbGF0ZXIgaW4KKwkJCXJ1bnRpbWUgeW91IGNhbiBwaHlzaWNhbGx5IGFkZCBleHRyYSBjcHUgdW50aWwgaXQgcmVhY2hlcworCQkJbi4gU28gZHVyaW5nIGJvb3QgdXAgc29tZSBib290IHRpbWUgbWVtb3J5IGZvciBwZXItY3B1CisJCQl2YXJpYWJsZXMgbmVlZCBiZSBwcmUtYWxsb2NhdGVkIGZvciBsYXRlciBwaHlzaWNhbCBjcHUKKwkJCWhvdCBwbHVnZ2luZy4KIAogCW5yX3VhcnRzPQlbU0VSSUFMXSBtYXhpbXVtIG51bWJlciBvZiBVQVJUcyB0byBiZSByZWdpc3RlcmVkLgogCkBAIC0zMDMyLDYgKzMwNTAsMTAgQEAKIAkJCQlQQUdFX1NJWkUgaXMgdXNlZCBhcyBhbGlnbm1lbnQuCiAJCQkJUENJLVBDSSBicmlkZ2UgY2FuIGJlIHNwZWNpZmllZCwgaWYgcmVzb3VyY2UKIAkJCQl3aW5kb3dzIG5lZWQgdG8gYmUgZXhwYW5kZWQuCisJCQkJVG8gc3BlY2lmeSB0aGUgYWxpZ25tZW50IGZvciBzZXZlcmFsCisJCQkJaW5zdGFuY2VzIG9mIGEgZGV2aWNlLCB0aGUgUENJIHZlbmRvciwKKwkJCQlkZXZpY2UsIHN1YnZlbmRvciwgYW5kIHN1YmRldmljZSBtYXkgYmUKKwkJCQlzcGVjaWZpZWQsIGUuZy4sIDQwOTZAcGNpOjgwODY6OWMyMjoxMDNjOjE5OGYKIAkJZWNyYz0JCUVuYWJsZS9kaXNhYmxlIFBDSWUgRUNSQyAodHJhbnNhY3Rpb24gbGF5ZXIKIAkJCQllbmQtdG8tZW5kIENSQyBjaGVja2luZykuCiAJCQkJYmlvczogVXNlIEJJT1MvZmlybXdhcmUgc2V0dGluZ3MuIFRoaXMgaXMgdGhlCkBAIC00MjM0LDYgKzQyNTYsOCBAQAogCQkJCXUgPSBJR05PUkVfVUFTIChkb24ndCBiaW5kIHRvIHRoZSB1YXMgZHJpdmVyKTsKIAkJCQl3ID0gTk9fV1BfREVURUNUIChkb24ndCB0ZXN0IHdoZXRoZXIgdGhlCiAJCQkJCW1lZGl1bSBpcyB3cml0ZS1wcm90ZWN0ZWQpLgorCQkJCXkgPSBBTFdBWVNfU1lOQyAoaXNzdWUgYSBTWU5DSFJPTklaRV9DQUNIRQorCQkJCQlldmVuIGlmIHRoZSBkZXZpY2UgY2xhaW1zIG5vIGNhY2hlKQogCQkJRXhhbXBsZTogcXVpcmtzPTA0MTk6YWFmNTpybCwwNDIxOjA0MzM6cmMKIAogCXVzZXJfZGVidWc9CVtLTkwsQVJNXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rbWVtY2hlY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9rbWVtY2hlY2sudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGFhZTg1Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24va21lbWNoZWNrLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDc1NCArMCwwIEBACi1HRVRUSU5HIFNUQVJURUQgV0lUSCBLTUVNQ0hFQ0sKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1WZWdhcmQgTm9zc3VtIDx2ZWdhcmRub0BpZmkudWlvLm5vPgotCi0KLUNvbnRlbnRzCi09PT09PT09PQotMC4gSW50cm9kdWN0aW9uCi0xLiBEb3dubG9hZGluZwotMi4gQ29uZmlndXJpbmcgYW5kIGNvbXBpbGluZwotMy4gSG93IHRvIHVzZQotMy4xLiBCb290aW5nCi0zLjIuIFJ1bi10aW1lIGVuYWJsZS9kaXNhYmxlCi0zLjMuIERlYnVnZ2luZwotMy40LiBBbm5vdGF0aW5nIGZhbHNlIHBvc2l0aXZlcwotNC4gUmVwb3J0aW5nIGVycm9ycwotNS4gVGVjaG5pY2FsIGRlc2NyaXB0aW9uCi0KLQotMC4gSW50cm9kdWN0aW9uCi09PT09PT09PT09PT09PT0KLQota21lbWNoZWNrIGlzIGEgZGVidWdnaW5nIGZlYXR1cmUgZm9yIHRoZSBMaW51eCBLZXJuZWwuIE1vcmUgc3BlY2lmaWNhbGx5LCBpdAotaXMgYSBkeW5hbWljIGNoZWNrZXIgdGhhdCBkZXRlY3RzIGFuZCB3YXJucyBhYm91dCBzb21lIHVzZXMgb2YgdW5pbml0aWFsaXplZAotbWVtb3J5LgotCi1Vc2Vyc3BhY2UgcHJvZ3JhbW1lcnMgbWlnaHQgYmUgZmFtaWxpYXIgd2l0aCBWYWxncmluZCdzIG1lbWNoZWNrLiBUaGUgbWFpbgotZGlmZmVyZW5jZSBiZXR3ZWVuIG1lbWNoZWNrIGFuZCBrbWVtY2hlY2sgaXMgdGhhdCBtZW1jaGVjayB3b3JrcyBmb3IgdXNlcnNwYWNlCi1wcm9ncmFtcyBvbmx5LCBhbmQga21lbWNoZWNrIHdvcmtzIGZvciB0aGUga2VybmVsIG9ubHkuIFRoZSBpbXBsZW1lbnRhdGlvbnMKLWFyZSBvZiBjb3Vyc2UgdmFzdGx5IGRpZmZlcmVudC4gQmVjYXVzZSBvZiB0aGlzLCBrbWVtY2hlY2sgaXMgbm90IGFzIGFjY3VyYXRlCi1hcyBtZW1jaGVjaywgYnV0IGl0IHR1cm5zIG91dCB0byBiZSBnb29kIGVub3VnaCBpbiBwcmFjdGljZSB0byBkaXNjb3ZlciByZWFsCi1wcm9ncmFtbWVyIGVycm9ycyB0aGF0IHRoZSBjb21waWxlciBpcyBub3QgYWJsZSB0byBmaW5kIHRocm91Z2ggc3RhdGljCi1hbmFseXNpcy4KLQotRW5hYmxpbmcga21lbWNoZWNrIG9uIGEga2VybmVsIHdpbGwgcHJvYmFibHkgc2xvdyBpdCBkb3duIHRvIHRoZSBleHRlbnQgdGhhdAotdGhlIG1hY2hpbmUgd2lsbCBub3QgYmUgdXNhYmxlIGZvciBub3JtYWwgd29ya2xvYWRzIHN1Y2ggYXMgZS5nLiBhbgotaW50ZXJhY3RpdmUgZGVza3RvcC4ga21lbWNoZWNrIHdpbGwgYWxzbyBjYXVzZSB0aGUga2VybmVsIHRvIHVzZSBhYm91dCB0d2ljZQotYXMgbXVjaCBtZW1vcnkgYXMgbm9ybWFsLiBGb3IgdGhpcyByZWFzb24sIGttZW1jaGVjayBpcyBzdHJpY3RseSBhIGRlYnVnZ2luZwotZmVhdHVyZS4KLQotCi0xLiBEb3dubG9hZGluZwotPT09PT09PT09PT09PT0KLQotQXMgb2YgdmVyc2lvbiAyLjYuMzEtcmMxLCBrbWVtY2hlY2sgaXMgaW5jbHVkZWQgaW4gdGhlIG1haW5saW5lIGtlcm5lbC4KLQotCi0yLiBDb25maWd1cmluZyBhbmQgY29tcGlsaW5nCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWttZW1jaGVjayBvbmx5IHdvcmtzIGZvciB0aGUgeDg2IChib3RoIDMyLSBhbmQgNjQtYml0KSBwbGF0Zm9ybS4gQSBudW1iZXIgb2YKLWNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIG11c3QgaGF2ZSBzcGVjaWZpYyBzZXR0aW5ncyBpbiBvcmRlciBmb3IgdGhlIGttZW1jaGVjawotbWVudSB0byBldmVuIGFwcGVhciBpbiAibWVudWNvbmZpZyIuIFRoZXNlIGFyZToKLQotICBvIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT1uCi0KLQlUaGlzIG9wdGlvbiBpcyBsb2NhdGVkIHVuZGVyICJHZW5lcmFsIHNldHVwIiAvICJPcHRpbWl6ZSBmb3Igc2l6ZSIuCi0KLQlXaXRob3V0IHRoaXMsIGdjYyB3aWxsIHVzZSBjZXJ0YWluIG9wdGltaXphdGlvbnMgdGhhdCB1c3VhbGx5IGxlYWQgdG8KLQlmYWxzZSBwb3NpdGl2ZSB3YXJuaW5ncyBmcm9tIGttZW1jaGVjay4gQW4gZXhhbXBsZSBvZiB0aGlzIGlzIGEgMTYtYml0Ci0JZmllbGQgaW4gYSBzdHJ1Y3QsIHdoZXJlIGdjYyBtYXkgbG9hZCAzMiBiaXRzLCB0aGVuIGRpc2NhcmQgdGhlIHVwcGVyCi0JMTYgYml0cy4ga21lbWNoZWNrIHNlZXMgb25seSB0aGUgMzItYml0IGxvYWQsIGFuZCBtYXkgdHJpZ2dlciBhCi0Jd2FybmluZyBmb3IgdGhlIHVwcGVyIDE2IGJpdHMgKGlmIHRoZXkncmUgdW5pbml0aWFsaXplZCkuCi0KLSAgbyBDT05GSUdfU0xBQj15IG9yIENPTkZJR19TTFVCPXkKLQotCVRoaXMgb3B0aW9uIGlzIGxvY2F0ZWQgdW5kZXIgIkdlbmVyYWwgc2V0dXAiIC8gIkNob29zZSBTTEFCCi0JYWxsb2NhdG9yIi4KLQotICBvIENPTkZJR19GVU5DVElPTl9UUkFDRVI9bgotCi0JVGhpcyBvcHRpb24gaXMgbG9jYXRlZCB1bmRlciAiS2VybmVsIGhhY2tpbmciIC8gIlRyYWNlcnMiIC8gIktlcm5lbAotCUZ1bmN0aW9uIFRyYWNlciIKLQotCVdoZW4gZnVuY3Rpb24gdHJhY2luZyBpcyBjb21waWxlZCBpbiwgZ2NjIGVtaXRzIGEgY2FsbCB0byBhbm90aGVyCi0JZnVuY3Rpb24gYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeSBmdW5jdGlvbi4gVGhpcyBtZWFucyB0aGF0IHdoZW4gdGhlCi0JcGFnZSBmYXVsdCBoYW5kbGVyIGlzIGNhbGxlZCwgdGhlIGZ0cmFjZSBmcmFtZXdvcmsgd2lsbCBiZSBjYWxsZWQKLQliZWZvcmUga21lbWNoZWNrIGhhcyBoYWQgYSBjaGFuY2UgdG8gaGFuZGxlIHRoZSBmYXVsdC4gSWYgZnRyYWNlIHRoZW4KLQltb2RpZmllcyBtZW1vcnkgdGhhdCB3YXMgdHJhY2tlZCBieSBrbWVtY2hlY2ssIHRoZSByZXN1bHQgaXMgYW4KLQllbmRsZXNzIHJlY3Vyc2l2ZSBwYWdlIGZhdWx0LgotCi0gIG8gQ09ORklHX0RFQlVHX1BBR0VBTExPQz1uCi0KLQlUaGlzIG9wdGlvbiBpcyBsb2NhdGVkIHVuZGVyICJLZXJuZWwgaGFja2luZyIgLyAiTWVtb3J5IERlYnVnZ2luZyIKLQkgLyAiRGVidWcgcGFnZSBtZW1vcnkgYWxsb2NhdGlvbnMiLgotCi1JbiBhZGRpdGlvbiwgSSBoaWdobHkgcmVjb21tZW5kIHR1cm5pbmcgb24gQ09ORklHX0RFQlVHX0lORk89eS4gVGhpcyBpcyBhbHNvCi1sb2NhdGVkIHVuZGVyICJLZXJuZWwgaGFja2luZyIuIFdpdGggdGhpcywgeW91IHdpbGwgYmUgYWJsZSB0byBnZXQgbGluZSBudW1iZXIKLWluZm9ybWF0aW9uIGZyb20gdGhlIGttZW1jaGVjayB3YXJuaW5ncywgd2hpY2ggaXMgZXh0cmVtZWx5IHZhbHVhYmxlIGluCi1kZWJ1Z2dpbmcgYSBwcm9ibGVtLiBUaGlzIG9wdGlvbiBpcyBub3QgbWFuZGF0b3J5LCBob3dldmVyLCBiZWNhdXNlIGl0IHNsb3dzCi1kb3duIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzIGFuZCBwcm9kdWNlcyBhIG11Y2ggYmlnZ2VyIGtlcm5lbCBpbWFnZS4KLQotTm93IHRoZSBrbWVtY2hlY2sgbWVudSBzaG91bGQgYmUgdmlzaWJsZSAodW5kZXIgIktlcm5lbCBoYWNraW5nIiAvICJNZW1vcnkKLURlYnVnZ2luZyIgLyAia21lbWNoZWNrOiB0cmFwIHVzZSBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSIpLiBIZXJlIGZvbGxvd3MKLWEgZGVzY3JpcHRpb24gb2YgdGhlIGttZW1jaGVjayBjb25maWd1cmF0aW9uIHZhcmlhYmxlczoKLQotICBvIENPTkZJR19LTUVNQ0hFQ0sKLQotCVRoaXMgbXVzdCBiZSBlbmFibGVkIGluIG9yZGVyIHRvIHVzZSBrbWVtY2hlY2sgYXQgYWxsLi4uCi0KLSAgbyBDT05GSUdfS01FTUNIRUNLX1tESVNBQkxFRCB8IEVOQUJMRUQgfCBPTkVTSE9UXV9CWV9ERUZBVUxUCi0KLQlUaGlzIG9wdGlvbiBjb250cm9scyB0aGUgc3RhdHVzIG9mIGttZW1jaGVjayBhdCBib290LXRpbWUuICJFbmFibGVkIgotCXdpbGwgZW5hYmxlIGttZW1jaGVjayByaWdodCBmcm9tIHRoZSBzdGFydCwgImRpc2FibGVkIiB3aWxsIGJvb3QgdGhlCi0Ja2VybmVsIGFzIG5vcm1hbCAoYnV0IHdpdGggdGhlIGttZW1jaGVjayBjb2RlIGNvbXBpbGVkIGluLCBzbyBpdCBjYW4KLQliZSBlbmFibGVkIGF0IHJ1bi10aW1lIGFmdGVyIHRoZSBrZXJuZWwgaGFzIGJvb3RlZCksIGFuZCAib25lLXNob3QiIGlzCi0JYSBzcGVjaWFsIG1vZGUgd2hpY2ggd2lsbCB0dXJuIGttZW1jaGVjayBvZmYgYXV0b21hdGljYWxseSBhZnRlcgotCWRldGVjdGluZyB0aGUgZmlyc3QgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LgotCi0JSWYgeW91IGFyZSB1c2luZyBrbWVtY2hlY2sgdG8gYWN0aXZlbHkgZGVidWcgYSBwcm9ibGVtLCB0aGVuIHlvdQotCXByb2JhYmx5IHdhbnQgdG8gY2hvb3NlICJlbmFibGVkIiBoZXJlLgotCi0JVGhlIG9uZS1zaG90IG1vZGUgaXMgbW9zdGx5IHVzZWZ1bCBpbiBhdXRvbWF0ZWQgdGVzdCBzZXR1cHMgYmVjYXVzZSBpdAotCWNhbiBwcmV2ZW50IGZsb29kcyBvZiB3YXJuaW5ncyBhbmQgaW5jcmVhc2UgdGhlIGNoYW5jZXMgb2YgdGhlIG1hY2hpbmUKLQlzdXJ2aXZpbmcgaW4gY2FzZSBzb21ldGhpbmcgaXMgcmVhbGx5IHdyb25nLiBJbiBvdGhlciBjYXNlcywgdGhlIG9uZS0KLQlzaG90IG1vZGUgY291bGQgYWN0dWFsbHkgYmUgY291bnRlci1wcm9kdWN0aXZlIGJlY2F1c2UgaXQgd291bGQgdHVybgotCWl0c2VsZiBvZmYgYXQgdGhlIHZlcnkgZmlyc3QgZXJyb3IgLS0gaW4gdGhlIGNhc2Ugb2YgYSBmYWxzZSBwb3NpdGl2ZQotCXRvbyAtLSBhbmQgdGhpcyB3b3VsZCBjb21lIGluIHRoZSB3YXkgb2YgZGVidWdnaW5nIHRoZSBzcGVjaWZpYwotCXByb2JsZW0geW91IHdlcmUgaW50ZXJlc3RlZCBpbi4KLQotCUlmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB5b3VyIGtlcm5lbCBhcyBub3JtYWwsIGJ1dCB3aXRoIGEgY2hhbmNlIHRvCi0JZW5hYmxlIGttZW1jaGVjayBpbiBjYXNlIG9mIHNvbWUgcHJvYmxlbSwgaXQgbWlnaHQgYmUgYSBnb29kIGlkZWEgdG8KLQljaG9vc2UgImRpc2FibGVkIiBoZXJlLiBXaGVuIGttZW1jaGVjayBpcyBkaXNhYmxlZCwgbW9zdCBvZiB0aGUgcnVuLQotCXRpbWUgb3ZlcmhlYWQgaXMgbm90IGluY3VycmVkLCBhbmQgdGhlIGtlcm5lbCB3aWxsIGJlIGFsbW9zdCBhcyBmYXN0Ci0JYXMgbm9ybWFsLgotCi0gIG8gQ09ORklHX0tNRU1DSEVDS19RVUVVRV9TSVpFCi0KLQlTZWxlY3QgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVycm9yIHJlcG9ydHMgdG8gc3RvcmUgaW4gYW4gaW50ZXJuYWwKLQkoZml4ZWQtc2l6ZSkgYnVmZmVyLiBTaW5jZSBlcnJvcnMgY2FuIG9jY3VyIHZpcnR1YWxseSBhbnl3aGVyZSBhbmQgaW4KLQlhbnkgY29udGV4dCwgd2UgbmVlZCBhIHRlbXBvcmFyeSBzdG9yYWdlIGFyZWEgd2hpY2ggaXMgZ3VhcmFudGVlZCBub3QKLQl0byBnZW5lcmF0ZSBhbnkgb3RoZXIgcGFnZSBmYXVsdHMgd2hlbiBhY2Nlc3NlZC4gVGhlIHF1ZXVlIHdpbGwgYmUKLQllbXB0aWVkIGFzIHNvb24gYXMgYSB0YXNrbGV0IG1heSBiZSBzY2hlZHVsZWQuIElmIHRoZSBxdWV1ZSBpcyBmdWxsLAotCW5ldyBlcnJvciByZXBvcnRzIHdpbGwgYmUgbG9zdC4KLQotCVRoZSBkZWZhdWx0IHZhbHVlIG9mIDY0IGlzIHByb2JhYmx5IGZpbmUuIElmIHNvbWUgY29kZSBwcm9kdWNlcyBtb3JlCi0JdGhhbiA2NCBlcnJvcnMgd2l0aGluIGFuIGlycXMtb2ZmIHNlY3Rpb24sIHRoZW4gdGhlIGNvZGUgaXMgbGlrZWx5IHRvCi0JcHJvZHVjZSBtYW55LCBtYW55IG1vcmUsIHRvbywgYW5kIHRoZXNlIGFkZGl0aW9uYWwgcmVwb3J0cyBzZWxkb20gZ2l2ZQotCWFueSBtb3JlIGluZm9ybWF0aW9uICh0aGUgZmlyc3QgcmVwb3J0IGlzIHVzdWFsbHkgdGhlIG1vc3QgdmFsdWFibGUKLQlhbnl3YXkpLgotCi0JVGhpcyBudW1iZXIgbWlnaHQgaGF2ZSB0byBiZSBhZGp1c3RlZCBpZiB5b3UgYXJlIG5vdCB1c2luZyBzZXJpYWwKLQljb25zb2xlIG9yIHNpbWlsYXIgdG8gY2FwdHVyZSB0aGUga2VybmVsIGxvZy4gSWYgeW91IGFyZSB1c2luZyB0aGUKLQkiZG1lc2ciIGNvbW1hbmQgdG8gc2F2ZSB0aGUgbG9nLCB0aGVuIGdldHRpbmcgYSBsb3Qgb2Yga21lbWNoZWNrCi0Jd2FybmluZ3MgbWlnaHQgb3ZlcmZsb3cgdGhlIGtlcm5lbCBsb2cgaXRzZWxmLCBhbmQgdGhlIGVhcmxpZXIgcmVwb3J0cwotCXdpbGwgZ2V0IGxvc3QgaW4gdGhhdCB3YXkgaW5zdGVhZC4gVHJ5IHNldHRpbmcgdGhpcyB0byAxMCBvciBzbyBvbgotCXN1Y2ggYSBzZXR1cC4KLQotICBvIENPTkZJR19LTUVNQ0hFQ0tfU0hBRE9XX0NPUFlfU0hJRlQKLQotCVNlbGVjdCB0aGUgbnVtYmVyIG9mIHNoYWRvdyBieXRlcyB0byBzYXZlIGFsb25nIHdpdGggZWFjaCBlbnRyeSBvZiB0aGUKLQllcnJvci1yZXBvcnQgcXVldWUuIFRoZXNlIGJ5dGVzIGluZGljYXRlIHdoYXQgcGFydHMgb2YgYW4gYWxsb2NhdGlvbgotCWFyZSBpbml0aWFsaXplZCwgdW5pbml0aWFsaXplZCwgZXRjLiBhbmQgd2lsbCBiZSBkaXNwbGF5ZWQgd2hlbiBhbgotCWVycm9yIGlzIGRldGVjdGVkIHRvIGhlbHAgdGhlIGRlYnVnZ2luZyBvZiBhIHBhcnRpY3VsYXIgcHJvYmxlbS4KLQotCVRoZSBudW1iZXIgZW50ZXJlZCBoZXJlIGlzIGFjdHVhbGx5IHRoZSBsb2dhcml0aG0gb2YgdGhlIG51bWJlciBvZgotCWJ5dGVzIHRoYXQgd2lsbCBiZSBzYXZlZC4gU28gaWYgeW91IHBpY2sgZm9yIGV4YW1wbGUgNSBoZXJlLCBrbWVtY2hlY2sKLQl3aWxsIHNhdmUgMl41ID0gMzIgYnl0ZXMuCi0KLQlUaGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgZmluZSBmb3IgZGVidWdnaW5nIG1vc3QgcHJvYmxlbXMuIEl0IGFsc28KLQlmaXRzIG5pY2VseSB3aXRoaW4gODAgY29sdW1ucy4KLQotICBvIENPTkZJR19LTUVNQ0hFQ0tfUEFSVElBTF9PSwotCi0JVGhpcyBvcHRpb24gKHdoZW4gZW5hYmxlZCkgd29ya3MgYXJvdW5kIGNlcnRhaW4gR0NDIG9wdGltaXphdGlvbnMgdGhhdAotCXByb2R1Y2UgMzItYml0IHJlYWRzIGZyb20gMTYtYml0IHZhcmlhYmxlcyB3aGVyZSB0aGUgdXBwZXIgMTYgYml0cyBhcmUKLQl0aHJvd24gYXdheSBhZnRlcndhcmRzLgotCi0JVGhlIGRlZmF1bHQgdmFsdWUgKGVuYWJsZWQpIGlzIHJlY29tbWVuZGVkLiBUaGlzIG1heSBvZiBjb3Vyc2UgaGlkZQotCXNvbWUgcmVhbCBlcnJvcnMsIGJ1dCBkaXNhYmxpbmcgaXQgd291bGQgcHJvYmFibHkgcHJvZHVjZSBhIGxvdCBvZgotCWZhbHNlIHBvc2l0aXZlcy4KLQotICBvIENPTkZJR19LTUVNQ0hFQ0tfQklUT1BTX09LCi0KLQlUaGlzIG9wdGlvbiBzaWxlbmNlcyB3YXJuaW5ncyB0aGF0IHdvdWxkIGJlIGdlbmVyYXRlZCBmb3IgYml0LWZpZWxkCi0JYWNjZXNzZXMgd2hlcmUgbm90IGFsbCB0aGUgYml0cyBhcmUgaW5pdGlhbGl6ZWQgYXQgdGhlIHNhbWUgdGltZS4gVGhpcwotCW1heSBhbHNvIGhpZGUgc29tZSByZWFsIGJ1Z3MuCi0KLQlUaGlzIG9wdGlvbiBpcyBwcm9iYWJseSBvYnNvbGV0ZSwgb3IgaXQgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGgKLQl0aGUga21lbWNoZWNrLS9iaXRmaWVsZC1hbm5vdGF0aW9ucyBmb3IgdGhlIGNvZGUgaW4gcXVlc3Rpb24uIFRoZQotCWRlZmF1bHQgdmFsdWUgaXMgdGhlcmVmb3JlIGZpbmUuCi0KLU5vdyBjb21waWxlIHRoZSBrZXJuZWwgYXMgdXN1YWwuCi0KLQotMy4gSG93IHRvIHVzZQotPT09PT09PT09PT09PQotCi0zLjEuIEJvb3RpbmcKLT09PT09PT09PT09PQotCi1GaXJzdCBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucy4gVGhlcmUgaXMgb25seSBvbmUKLW9wdGlvbiBzcGVjaWZpYyB0byBrbWVtY2hlY2ssIGFuZCB0aGlzIGlzIGNhbGxlZCAia21lbWNoZWNrIi4gSXQgY2FuIGJlIHVzZWQKLXRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG1vZGUgYXMgY2hvc2VuIGJ5IHRoZSBDT05GSUdfS01FTUNIRUNLXypfQllfREVGQVVMVAotb3B0aW9uLiBJdHMgcG9zc2libGUgc2V0dGluZ3MgYXJlOgotCi0gIG8ga21lbWNoZWNrPTAgKGRpc2FibGVkKQotICBvIGttZW1jaGVjaz0xIChlbmFibGVkKQotICBvIGttZW1jaGVjaz0yIChvbmUtc2hvdCBtb2RlKQotCi1JZiBTTFVCIGRlYnVnZ2luZyBoYXMgYmVlbiBlbmFibGVkIGluIHRoZSBrZXJuZWwsIGl0IG1heSB0YWtlIHByZWNlZGVuY2Ugb3Zlcgota21lbWNoZWNrIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgc2xhYiBjYWNoZXMgd2hpY2ggYXJlIHVuZGVyIFNMVUIgZGVidWdnaW5nCi13aWxsIG5vdCBiZSB0cmFja2VkIGJ5IGttZW1jaGVjay4gSW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhpcyBkb2Vzbid0IGhhcHBlbgotKGV2ZW4gdGhvdWdoIGl0IHNob3VsZG4ndCBieSBkZWZhdWx0KSwgdXNlIFNMVUIncyBib290IG9wdGlvbiAic2x1Yl9kZWJ1ZyIsCi1saWtlIHRoaXM6IHNsdWJfZGVidWc9LQotCi1JbiBmYWN0LCB0aGlzIG9wdGlvbiBtYXkgYWxzbyBiZSB1c2VkIGZvciBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIFNMVUIgdnMuCi1rbWVtY2hlY2suIEZvciBleGFtcGxlLCBpZiB0aGUgY29tbWFuZCBsaW5lIGluY2x1ZGVzICJrbWVtY2hlY2s9MQotc2x1Yl9kZWJ1Zz0sZGVudHJ5IiwgdGhlbiBTTFVCIGRlYnVnZ2luZyB3aWxsIGJlIHVzZWQgb25seSBmb3IgdGhlICJkZW50cnkiCi1zbGFiIGNhY2hlLCBhbmQgd2l0aCBrbWVtY2hlY2sgdHJhY2tpbmcgYWxsIHRoZSBvdGhlciBjYWNoZXMuIFRoaXMgaXMgYWR2YW5jZWQKLXVzYWdlLCBob3dldmVyLCBhbmQgaXMgbm90IGdlbmVyYWxseSByZWNvbW1lbmRlZC4KLQotCi0zLjIuIFJ1bi10aW1lIGVuYWJsZS9kaXNhYmxlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVdoZW4gdGhlIGtlcm5lbCBoYXMgYm9vdGVkLCBpdCBpcyBwb3NzaWJsZSB0byBlbmFibGUgb3IgZGlzYWJsZSBrbWVtY2hlY2sgYXQKLXJ1bi10aW1lLiBXQVJOSU5HOiBUaGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2F1c2UgZmFsc2UKLXBvc2l0aXZlIHdhcm5pbmdzIHRvIGFwcGVhci4gVGhlcmVmb3JlLCB0cnkgbm90IHRvIHVzZSB0aGlzLiBJZiB5b3UgZmluZCB0aGF0Ci1pdCBkb2Vzbid0IHdvcmsgcHJvcGVybHkgKGUuZy4geW91IHNlZSBhbiB1bnJlYXNvbmFibGUgYW1vdW50IG9mIHdhcm5pbmdzKSwgSQotd2lsbCBiZSBoYXBweSB0byB0YWtlIGJ1ZyByZXBvcnRzLgotCi1Vc2UgdGhlIGZpbGUgL3Byb2Mvc3lzL2tlcm5lbC9rbWVtY2hlY2sgZm9yIHRoaXMgcHVycG9zZSwgZS5nLjoKLQotCSQgZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9rbWVtY2hlY2sgIyBkaXNhYmxlcyBrbWVtY2hlY2sKLQotVGhlIG51bWJlcnMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUga21lbWNoZWNrPSBjb21tYW5kLWxpbmUgb3B0aW9uLgotCi0KLTMuMy4gRGVidWdnaW5nCi09PT09PT09PT09PT09PQotCi1BIHR5cGljYWwgcmVwb3J0IHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi1XQVJOSU5HOiBrbWVtY2hlY2s6IENhdWdodCAzMi1iaXQgcmVhZCBmcm9tIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IChmZmZmODgwMDNlNGEyMDI0KQotODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODhmZmZmMDAwMDAwMDAwMDAwMDAwMAotIGkgaSBpIGkgdSB1IHUgdSBpIGkgaSBpIGkgaSBpIGkgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdQotICAgICAgICAgXgotCi1QaWQ6IDE4NTYsIGNvbW06IG50cGRhdGUgTm90IHRhaW50ZWQgMi42LjI5LXJjNSAjMjY0IDk0NVAtQQotUklQOiAwMDEwOls8ZmZmZmZmZmY4MTA0ZWRlOD5dICBbPGZmZmZmZmZmODEwNGVkZTg+XSBfX2RlcXVldWVfc2lnbmFsKzB4YzgvMHgxOTAKLVJTUDogMDAxODpmZmZmODgwMDNjZGY3ZDk4ICBFRkxBR1M6IDAwMjEwMDAyCi1SQVg6IDAwMDAwMDAwMDAwMDAwMzAgUkJYOiBmZmZmODgwMDNkNGVhOTY4IFJDWDogMDAwMDAwMDAwMDAwMDAwOQotUkRYOiBmZmZmODgwMDNlNWQ2MDE4IFJTSTogZmZmZjg4MDAzZTVkNjAyNCBSREk6IGZmZmY4ODAwM2NkZjdlODQKLVJCUDogZmZmZjg4MDAzY2RmN2RiOCBSMDg6IGZmZmY4ODAwM2U1ZDYwMDAgUjA5OiAwMDAwMDAwMDAwMDAwMDAwCi1SMTA6IDAwMDAwMDAwMDAwMDAwODAgUjExOiAwMDAwMDAwMDAwMDAwMDAwIFIxMjogMDAwMDAwMDAwMDAwMDAwZQotUjEzOiBmZmZmODgwMDNjZGY3ZTc4IFIxNDogZmZmZjg4MDAzZDUzMDcxMCBSMTU6IGZmZmY4ODAwM2Q1YTk4YzgKLUZTOiAgMDAwMDAwMDAwMDAwMDAwMCgwMDAwKSBHUzpmZmZmODgwMDAxOTgyMDAwKDAwNjMpIGtubEdTOjAwMDAwCi1DUzogIDAwMTAgRFM6IDAwMmIgRVM6IDAwMmIgQ1IwOiAwMDAwMDAwMDgwMDUwMDMzCi1DUjI6IGZmZmY4ODAwM2Y4MDZlYTAgQ1IzOiAwMDAwMDAwMDNjMDM2MDAwIENSNDogMDAwMDAwMDAwMDAwMDZhMAotRFIwOiAwMDAwMDAwMDAwMDAwMDAwIERSMTogMDAwMDAwMDAwMDAwMDAwMCBEUjI6IDAwMDAwMDAwMDAwMDAwMDAKLURSMzogMDAwMDAwMDAwMDAwMDAwMCBEUjY6IDAwMDAwMDAwZmZmZjRmZjAgRFI3OiAwMDAwMDAwMDAwMDAwNDAwCi0gWzxmZmZmZmZmZjgxMDRmMDRlPl0gZGVxdWV1ZV9zaWduYWwrMHg4ZS8weDE3MAotIFs8ZmZmZmZmZmY4MTA1MGJkOD5dIGdldF9zaWduYWxfdG9fZGVsaXZlcisweDk4LzB4MzkwCi0gWzxmZmZmZmZmZjgxMDBiODdkPl0gZG9fbm90aWZ5X3Jlc3VtZSsweGFkLzB4N2QwCi0gWzxmZmZmZmZmZjgxMDBjN2I1Pl0gaW50X3NpZ25hbCsweDEyLzB4MTcKLSBbPGZmZmZmZmZmZmZmZmZmZmY+XSAweGZmZmZmZmZmZmZmZmZmZmYKLQotVGhlIHNpbmdsZSBtb3N0IHZhbHVhYmxlIGluZm9ybWF0aW9uIGluIHRoaXMgcmVwb3J0IGlzIHRoZSBSSVAgKG9yIEVJUCBvbiAzMi0KLWJpdCkgdmFsdWUuIFRoaXMgd2lsbCBoZWxwIHVzIHBpbnBvaW50IGV4YWN0bHkgd2hpY2ggaW5zdHJ1Y3Rpb24gdGhhdCBjYXVzZWQKLXRoZSB3YXJuaW5nLgotCi1JZiB5b3VyIGtlcm5lbCB3YXMgY29tcGlsZWQgd2l0aCBDT05GSUdfREVCVUdfSU5GTz15LCB0aGVuIGFsbCB3ZSBoYXZlIHRvIGRvCi1pcyBnaXZlIHRoaXMgYWRkcmVzcyB0byB0aGUgYWRkcjJsaW5lIHByb2dyYW0sIGxpa2UgdGhpczoKLQotCSQgYWRkcjJsaW5lIC1lIHZtbGludXggLWkgZmZmZmZmZmY4MTA0ZWRlOAotCWFyY2gveDg2L2luY2x1ZGUvYXNtL3N0cmluZ182NC5oOjEyCi0JaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWdpbmZvLmg6Mjg3Ci0Ja2VybmVsL3NpZ25hbC5jOjM4MAotCWtlcm5lbC9zaWduYWwuYzo0MTAKLQotVGhlICItZSB2bWxpbnV4IiB0ZWxscyBhZGRyMmxpbmUgd2hpY2ggZmlsZSB0byBsb29rIGluLiBJTVBPUlRBTlQ6IFRoaXMgbXVzdAotYmUgdGhlIHZtbGludXggb2YgdGhlIGtlcm5lbCB0aGF0IHByb2R1Y2VkIHRoZSB3YXJuaW5nIGluIHRoZSBmaXJzdCBwbGFjZSEgSWYKLW5vdCwgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSB3cm9uZy4KLQotVGhlICItaSIgdGVsbHMgYWRkcjJsaW5lIHRvIGFsc28gcHJpbnQgdGhlIGxpbmUgbnVtYmVycyBvZiBpbmxpbmVkIGZ1bmN0aW9ucy4KLUluIHRoaXMgY2FzZSwgdGhlIGZsYWcgd2FzIHZlcnkgaW1wb3J0YW50LCBiZWNhdXNlIG90aGVyd2lzZSwgaXQgd291bGQgb25seQotaGF2ZSBwcmludGVkIHRoZSBmaXJzdCBsaW5lLCB3aGljaCBpcyBqdXN0IGEgY2FsbCB0byBtZW1jcHkoKSwgd2hpY2ggY291bGQgYmUKLWNhbGxlZCBmcm9tIGEgdGhvdXNhbmQgcGxhY2VzIGluIHRoZSBrZXJuZWwsIGFuZCBpcyB0aGVyZWZvcmUgbm90IHZlcnkgdXNlZnVsLgotVGhlc2UgaW5saW5lZCBmdW5jdGlvbnMgd291bGQgbm90IHNob3cgdXAgaW4gdGhlIHN0YWNrIHRyYWNlIGFib3ZlLCBzaW1wbHkKLWJlY2F1c2UgdGhlIGtlcm5lbCBkb2Vzbid0IGxvYWQgdGhlIGV4dHJhIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gVGhpcwotdGVjaG5pcXVlIGNhbiBvZiBjb3Vyc2UgYmUgdXNlZCB3aXRoIG9yZGluYXJ5IGtlcm5lbCBvb3BzZXMgYXMgd2VsbC4KLQotSW4gdGhpcyBjYXNlLCBpdCdzIHRoZSBjYWxsZXIgb2YgbWVtY3B5KCkgdGhhdCBpcyBpbnRlcmVzdGluZywgYW5kIGl0IGNhbiBiZQotZm91bmQgaW4gaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWdpbmZvLmgsIGxpbmUgMjg3OgotCi0yODEgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfc2lnaW5mbyhzdHJ1Y3Qgc2lnaW5mbyAqdG8sIHN0cnVjdCBzaWdpbmZvICpmcm9tKQotMjgyIHsKLTI4MyAgICAgICAgIGlmIChmcm9tLT5zaV9jb2RlIDwgMCkKLTI4NCAgICAgICAgICAgICAgICAgbWVtY3B5KHRvLCBmcm9tLCBzaXplb2YoKnRvKSk7Ci0yODUgICAgICAgICBlbHNlCi0yODYgICAgICAgICAgICAgICAgIC8qIF9zaWdjaGxkIGlzIGN1cnJlbnRseSB0aGUgbGFyZ2VzdCBrbm93IHVuaW9uIG1lbWJlciAqLwotMjg3ICAgICAgICAgICAgICAgICBtZW1jcHkodG8sIGZyb20sIF9fQVJDSF9TSV9QUkVBTUJMRV9TSVpFICsgc2l6ZW9mKGZyb20tPl9zaWZpZWxkcy5fc2lnY2hsZCkpOwotMjg4IH0KLQotU2luY2UgdGhpcyB3YXMgYSByZWFkIChrbWVtY2hlY2sgdXN1YWxseSB3YXJucyBhYm91dCByZWFkcyBvbmx5LCB0aG91Z2ggaXQgY2FuCi13YXJuIGFib3V0IHdyaXRlcyB0byB1bmFsbG9jYXRlZCBvciBmcmVlZCBtZW1vcnkgYXMgd2VsbCksIGl0IHdhcyBwcm9iYWJseSB0aGUKLSJmcm9tIiBhcmd1bWVudCB3aGljaCBjb250YWluZWQgc29tZSB1bmluaXRpYWxpemVkIGJ5dGVzLiBGb2xsb3dpbmcgdGhlIGNoYWluCi1vZiBjYWxscywgd2UgbW92ZSB1cHdhcmRzIHRvIHNlZSB3aGVyZSAiZnJvbSIgd2FzIGFsbG9jYXRlZCBvciBpbml0aWFsaXplZCwKLWtlcm5lbC9zaWduYWwuYywgbGluZSAzODA6Ci0KLTM1OSBzdGF0aWMgdm9pZCBjb2xsZWN0X3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3Qgc2lncGVuZGluZyAqbGlzdCwgc2lnaW5mb190ICppbmZvKQotMzYwIHsKLS4uLgotMzY3ICAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeShxLCAmbGlzdC0+bGlzdCwgbGlzdCkgewotMzY4ICAgICAgICAgICAgICAgICBpZiAocS0+aW5mby5zaV9zaWdubyA9PSBzaWcpIHsKLTM2OSAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCi0zNzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHN0aWxsX3BlbmRpbmc7Ci0zNzEgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBxOwotLi4uCi0zNzcgICAgICAgICBpZiAoZmlyc3QpIHsKLTM3OCBzdGlsbF9wZW5kaW5nOgotMzc5ICAgICAgICAgICAgICAgICBsaXN0X2RlbF9pbml0KCZmaXJzdC0+bGlzdCk7Ci0zODAgICAgICAgICAgICAgICAgIGNvcHlfc2lnaW5mbyhpbmZvLCAmZmlyc3QtPmluZm8pOwotMzgxICAgICAgICAgICAgICAgICBfX3NpZ3F1ZXVlX2ZyZWUoZmlyc3QpOwotLi4uCi0zOTIgICAgICAgICB9Ci0zOTMgfQotCi1IZXJlLCBpdCBpcyAmZmlyc3QtPmluZm8gdGhhdCBpcyBiZWluZyBwYXNzZWQgb24gdG8gY29weV9zaWdpbmZvKCkuIFRoZQotdmFyaWFibGUgImZpcnN0IiB3YXMgZm91bmQgb24gYSBsaXN0IC0tIHBhc3NlZCBpbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvCi1jb2xsZWN0X3NpZ25hbCgpLiBXZSAgY29udGludWUgb3VyIGpvdXJuZXkgdGhyb3VnaCB0aGUgc3RhY2ssIHRvIGZpZ3VyZSBvdXQKLXdoZXJlIHRoZSBpdGVtIG9uICJsaXN0IiB3YXMgYWxsb2NhdGVkIG9yIGluaXRpYWxpemVkLiBXZSBtb3ZlIHRvIGxpbmUgNDEwOgotCi0zOTUgc3RhdGljIGludCBfX2RlcXVldWVfc2lnbmFsKHN0cnVjdCBzaWdwZW5kaW5nICpwZW5kaW5nLCBzaWdzZXRfdCAqbWFzaywKLTM5NiAgICAgICAgICAgICAgICAgICAgICAgICBzaWdpbmZvX3QgKmluZm8pCi0zOTcgewotLi4uCi00MTAgICAgICAgICAgICAgICAgIGNvbGxlY3Rfc2lnbmFsKHNpZywgcGVuZGluZywgaW5mbyk7Ci0uLi4KLTQxNCB9Ci0KLU5vdyB3ZSBuZWVkIHRvIGZvbGxvdyB0aGUgInBlbmRpbmciIHBvaW50ZXIsIHNpbmNlIHRoYXQgaXMgYmVpbmcgcGFzc2VkIG9uIHRvCi1jb2xsZWN0X3NpZ25hbCgpIGFzICJsaXN0Ii4gQXQgdGhpcyBwb2ludCwgd2UndmUgcnVuIG91dCBvZiBsaW5lcyBmcm9tIHRoZQotImFkZHIybGluZSIgb3V0cHV0LiBOb3QgdG8gd29ycnksIHdlIGp1c3QgcGFzdGUgdGhlIG5leHQgYWRkcmVzc2VzIGZyb20gdGhlCi1rbWVtY2hlY2sgc3RhY2sgZHVtcCwgaS5lLjoKLQotIFs8ZmZmZmZmZmY4MTA0ZjA0ZT5dIGRlcXVldWVfc2lnbmFsKzB4OGUvMHgxNzAKLSBbPGZmZmZmZmZmODEwNTBiZDg+XSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIrMHg5OC8weDM5MAotIFs8ZmZmZmZmZmY4MTAwYjg3ZD5dIGRvX25vdGlmeV9yZXN1bWUrMHhhZC8weDdkMAotIFs8ZmZmZmZmZmY4MTAwYzdiNT5dIGludF9zaWduYWwrMHgxMi8weDE3Ci0KLQkkIGFkZHIybGluZSAtZSB2bWxpbnV4IC1pIGZmZmZmZmZmODEwNGYwNGUgZmZmZmZmZmY4MTA1MGJkOCBcCi0JCWZmZmZmZmZmODEwMGI4N2QgZmZmZmZmZmY4MTAwYzdiNQotCWtlcm5lbC9zaWduYWwuYzo0NDYKLQlrZXJuZWwvc2lnbmFsLmM6MTgwNgotCWFyY2gveDg2L2tlcm5lbC9zaWduYWwuYzo4MDUKLQlhcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmM6ODcxCi0JYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlM6Njk0Ci0KLVJlbWVtYmVyIHRoYXQgc2luY2UgdGhlc2UgYWRkcmVzc2VzIHdlcmUgZm91bmQgb24gdGhlIHN0YWNrIGFuZCBub3QgYXMgdGhlCi1SSVAgdmFsdWUsIHRoZXkgYWN0dWFsbHkgcG9pbnQgdG8gdGhlIF9uZXh0XyBpbnN0cnVjdGlvbiAodGhleSBhcmUgcmV0dXJuCi1hZGRyZXNzZXMpLiBUaGlzIGJlY29tZXMgb2J2aW91cyB3aGVuIHdlIGxvb2sgYXQgdGhlIGNvZGUgZm9yIGxpbmUgNDQ2OgotCi00MjIgaW50IGRlcXVldWVfc2lnbmFsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzaWdzZXRfdCAqbWFzaywgc2lnaW5mb190ICppbmZvKQotNDIzIHsKLS4uLgotNDMxICAgICAgICAgICAgICAgICBzaWduciA9IF9fZGVxdWV1ZV9zaWduYWwoJnRzay0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZywKLTQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2ssIGluZm8pOwotNDMzICAgICAgICAgICAgICAgICAvKgotNDM0ICAgICAgICAgICAgICAgICAgKiBpdGltZXIgc2lnbmFsID8KLTQzNSAgICAgICAgICAgICAgICAgICoKLTQzNiAgICAgICAgICAgICAgICAgICogaXRpbWVycyBhcmUgcHJvY2VzcyBzaGFyZWQgYW5kIHdlIHJlc3RhcnQgcGVyaW9kaWMKLTQzNyAgICAgICAgICAgICAgICAgICogaXRpbWVycyBpbiB0aGUgc2lnbmFsIGRlbGl2ZXJ5IHBhdGggdG8gcHJldmVudCBEb1MKLTQzOCAgICAgICAgICAgICAgICAgICogYXR0YWNrcyBpbiB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyIGNhc2UuIFRoaXMgaXMKLTQzOSAgICAgICAgICAgICAgICAgICogY29tcGxpYW50IHdpdGggdGhlIG9sZCB3YXkgb2Ygc2VsZiByZXN0YXJ0aW5nCi00NDAgICAgICAgICAgICAgICAgICAqIGl0aW1lcnMsIGFzIHRoZSBTSUdBTFJNIGlzIGEgbGVnYWN5IHNpZ25hbCBhbmQgb25seQotNDQxICAgICAgICAgICAgICAgICAgKiBxdWV1ZWQgb25jZS4gQ2hhbmdpbmcgdGhlIHJlc3RhcnQgYmVoYXZpb3VyIHRvCi00NDIgICAgICAgICAgICAgICAgICAqIHJlc3RhcnQgdGhlIHRpbWVyIGluIHRoZSBzaWduYWwgZGVxdWV1ZSBwYXRoIGlzCi00NDMgICAgICAgICAgICAgICAgICAqIHJlZHVjaW5nIHRoZSB0aW1lciBub2lzZSBvbiBoZWF2eSBsb2FkZWQgIWhpZ2hyZXMKLTQ0NCAgICAgICAgICAgICAgICAgICogc3lzdGVtcyB0b28uCi00NDUgICAgICAgICAgICAgICAgICAqLwotNDQ2ICAgICAgICAgICAgICAgICBpZiAodW5saWtlbHkoc2lnbnIgPT0gU0lHQUxSTSkpIHsKLS4uLgotNDg5IH0KLQotU28gaW5zdGVhZCBvZiBsb29raW5nIGF0IDQ0Niwgd2Ugc2hvdWxkIGJlIGxvb2tpbmcgYXQgNDMxLCB3aGljaCBpcyB0aGUgbGluZQotdGhhdCBleGVjdXRlcyBqdXN0IGJlZm9yZSA0NDYuIEhlcmUgd2Ugc2VlIHRoYXQgd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IgaXMKLSZ0c2stPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcuCi0KLU91ciBuZXh0IHRhc2sgaXMgbm93IHRvIGZpZ3VyZSBvdXQgd2hpY2ggZnVuY3Rpb24gdGhhdCBwdXRzIGl0ZW1zIG9uIHRoaXMKLSJzaGFyZWRfcGVuZGluZyIgbGlzdC4gQSBjcnVkZSwgYnV0IGVmZmljaWVudCB0b29sLCBpcyBnaXQgZ3JlcDoKLQotCSQgZ2l0IGdyZXAgLW4gJ3NoYXJlZF9wZW5kaW5nJyBrZXJuZWwvCi0JLi4uCi0Ja2VybmVsL3NpZ25hbC5jOjgyODogICAgcGVuZGluZyA9IGdyb3VwID8gJnQtPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcgOiAmdC0+cGVuZGluZzsKLQlrZXJuZWwvc2lnbmFsLmM6MTMzOTogICBwZW5kaW5nID0gZ3JvdXAgPyAmdC0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZyA6ICZ0LT5wZW5kaW5nOwotCS4uLgotCi1UaGVyZSB3ZXJlIG1vcmUgcmVzdWx0cywgYnV0IG5vbmUgb2YgdGhlbSB3ZXJlIHJlbGF0ZWQgdG8gbGlzdCBvcGVyYXRpb25zLAotYW5kIHRoZXNlIHdlcmUgdGhlIG9ubHkgYXNzaWdubWVudHMuIFdlIGluc3BlY3QgdGhlIGxpbmUgbnVtYmVycyBtb3JlIGNsb3NlbHkKLWFuZCBmaW5kIHRoYXQgdGhpcyBpcyBpbmRlZWQgd2hlcmUgaXRlbXMgYXJlIGJlaW5nIGFkZGVkIHRvIHRoZSBsaXN0OgotCi04MTYgc3RhdGljIGludCBzZW5kX3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbywgc3RydWN0IHRhc2tfc3RydWN0ICp0LAotODE3ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncm91cCkKLTgxOCB7Ci0uLi4KLTgyOCAgICAgICAgIHBlbmRpbmcgPSBncm91cCA/ICZ0LT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nIDogJnQtPnBlbmRpbmc7Ci0uLi4KLTg1MSAgICAgICAgIHEgPSBfX3NpZ3F1ZXVlX2FsbG9jKHQsIEdGUF9BVE9NSUMsIChzaWcgPCBTSUdSVE1JTiAmJgotODUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc19zaV9zcGVjaWFsKGluZm8pIHx8Ci04NTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNpX2NvZGUgPj0gMCkpKTsKLTg1NCAgICAgICAgIGlmIChxKSB7Ci04NTUgICAgICAgICAgICAgICAgIGxpc3RfYWRkX3RhaWwoJnEtPmxpc3QsICZwZW5kaW5nLT5saXN0KTsKLS4uLgotODkwIH0KLQotYW5kOgotCi0xMzA5IGludCBzZW5kX3NpZ3F1ZXVlKHN0cnVjdCBzaWdxdWV1ZSAqcSwgc3RydWN0IHRhc2tfc3RydWN0ICp0LCBpbnQgZ3JvdXApCi0xMzEwIHsKLS4uLi4KLTEzMzkgICAgICAgICBwZW5kaW5nID0gZ3JvdXAgPyAmdC0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZyA6ICZ0LT5wZW5kaW5nOwotMTM0MCAgICAgICAgIGxpc3RfYWRkX3RhaWwoJnEtPmxpc3QsICZwZW5kaW5nLT5saXN0KTsKLS4uLi4KLTEzNDcgfQotCi1JbiB0aGUgZmlyc3QgY2FzZSwgdGhlIGxpc3QgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IsICJxIiwgaXMgYmVpbmcgcmV0dXJuZWQKLWZyb20gdGhlIGZ1bmN0aW9uIF9fc2lncXVldWVfYWxsb2MoKSwgd2hpY2ggbG9va3MgbGlrZSBhbiBhbGxvY2F0aW9uIGZ1bmN0aW9uLgotTGV0J3MgdGFrZSBhIGxvb2sgYXQgaXQ6Ci0KLTE4NyBzdGF0aWMgc3RydWN0IHNpZ3F1ZXVlICpfX3NpZ3F1ZXVlX2FsbG9jKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgZ2ZwX3QgZmxhZ3MsCi0xODggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3ZlcnJpZGVfcmxpbWl0KQotMTg5IHsKLTE5MCAgICAgICAgIHN0cnVjdCBzaWdxdWV1ZSAqcSA9IE5VTEw7Ci0xOTEgICAgICAgICBzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnVzZXI7Ci0xOTIgCi0xOTMgICAgICAgICAvKgotMTk0ICAgICAgICAgICogV2Ugd29uJ3QgZ2V0IHByb2JsZW1zIHdpdGggdGhlIHRhcmdldCdzIFVJRCBjaGFuZ2luZyB1bmRlciB1cwotMTk1ICAgICAgICAgICogYmVjYXVzZSBjaGFuZ2luZyBpdCByZXF1aXJlcyBSQ1UgYmUgdXNlZCwgYW5kIGlmIHQgIT0gY3VycmVudCwgdGhlCi0xOTYgICAgICAgICAgKiBjYWxsZXIgbXVzdCBiZSBob2xkaW5nIHRoZSBSQ1UgcmVhZGxvY2sgKGJ5IHdheSBvZiBhIHNwaW5sb2NrKSBhbmQKLTE5NyAgICAgICAgICAqIHdlIHVzZSBSQ1UgcHJvdGVjdGlvbiBoZXJlCi0xOTggICAgICAgICAgKi8KLTE5OSAgICAgICAgIHVzZXIgPSBnZXRfdWlkKF9fdGFza19jcmVkKHQpLT51c2VyKTsKLTIwMCAgICAgICAgIGF0b21pY19pbmMoJnVzZXItPnNpZ3BlbmRpbmcpOwotMjAxICAgICAgICAgaWYgKG92ZXJyaWRlX3JsaW1pdCB8fAotMjAyICAgICAgICAgICAgIGF0b21pY19yZWFkKCZ1c2VyLT5zaWdwZW5kaW5nKSA8PQotMjAzICAgICAgICAgICAgICAgICAgICAgICAgIHQtPnNpZ25hbC0+cmxpbVtSTElNSVRfU0lHUEVORElOR10ucmxpbV9jdXIpCi0yMDQgICAgICAgICAgICAgICAgIHEgPSBrbWVtX2NhY2hlX2FsbG9jKHNpZ3F1ZXVlX2NhY2hlcCwgZmxhZ3MpOwotMjA1ICAgICAgICAgaWYgKHVubGlrZWx5KHEgPT0gTlVMTCkpIHsKLTIwNiAgICAgICAgICAgICAgICAgYXRvbWljX2RlYygmdXNlci0+c2lncGVuZGluZyk7Ci0yMDcgICAgICAgICAgICAgICAgIGZyZWVfdWlkKHVzZXIpOwotMjA4ICAgICAgICAgfSBlbHNlIHsKLTIwOSAgICAgICAgICAgICAgICAgSU5JVF9MSVNUX0hFQUQoJnEtPmxpc3QpOwotMjEwICAgICAgICAgICAgICAgICBxLT5mbGFncyA9IDA7Ci0yMTEgICAgICAgICAgICAgICAgIHEtPnVzZXIgPSB1c2VyOwotMjEyICAgICAgICAgfQotMjEzIAotMjE0ICAgICAgICAgcmV0dXJuIHE7Ci0yMTUgfQotCi1XZSBzZWUgdGhhdCB0aGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHEtPmxpc3QsIHEtPmZsYWdzLCBhbmQgcS0+dXNlci4gSXQgc2VlbXMKLXRoYXQgbm93IGlzIHRoZSB0aW1lIHRvIGxvb2sgYXQgdGhlIGRlZmluaXRpb24gb2YgInN0cnVjdCBzaWdxdWV1ZSIsIGUuZy46Ci0KLTE0IHN0cnVjdCBzaWdxdWV1ZSB7Ci0xNSAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLTE2ICAgICAgICAgaW50IGZsYWdzOwotMTcgICAgICAgICBzaWdpbmZvX3QgaW5mbzsKLTE4ICAgICAgICAgc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyOwotMTkgfTsKLQotQW5kLCB5b3UgbWlnaHQgcmVtZW1iZXIsIGl0IHdhcyBhIG1lbWNweSgpIG9uICZmaXJzdC0+aW5mbyB0aGF0IGNhdXNlZCB0aGUKLXdhcm5pbmcsIHNvIHRoaXMgbWFrZXMgcGVyZmVjdCBzZW5zZS4gSXQgYWxzbyBzZWVtcyByZWFzb25hYmxlIHRvIGFzc3VtZSB0aGF0Ci1pdCBpcyB0aGUgY2FsbGVyIG9mIF9fc2lncXVldWVfYWxsb2MoKSB0aGF0IGhhcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgZmlsbGluZwotb3V0IChpbml0aWFsaXppbmcpIHRoaXMgbWVtYmVyLgotCi1CdXQganVzdCB3aGljaCBmaWVsZHMgb2YgdGhlIHN0cnVjdCB3ZXJlIHVuaW5pdGlhbGl6ZWQ/IExldCdzIGxvb2sgYXQKLWttZW1jaGVjaydzIHJlcG9ydCBhZ2FpbjoKLQotV0FSTklORzoga21lbWNoZWNrOiBDYXVnaHQgMzItYml0IHJlYWQgZnJvbSB1bmluaXRpYWxpemVkIG1lbW9yeSAoZmZmZjg4MDAzZTRhMjAyNCkKLTgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg4ZmZmZjAwMDAwMDAwMDAwMDAwMDAKLSBpIGkgaSBpIHUgdSB1IHUgaSBpIGkgaSBpIGkgaSBpIHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUKLSAgICAgICAgIF4KLQotVGhlc2UgZmlyc3QgdHdvIGxpbmVzIGFyZSB0aGUgbWVtb3J5IGR1bXAgb2YgdGhlIG1lbW9yeSBvYmplY3QgaXRzZWxmLCBhbmQgdGhlCi1zaGFkb3cgYnl0ZW1hcCwgcmVzcGVjdGl2ZWx5LiBUaGUgbWVtb3J5IG9iamVjdCBpdHNlbGYgaXMgaW4gdGhpcyBjYXNlCi0mZmlyc3QtPmluZm8uIEp1c3QgYmV3YXJlIHRoYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZHVtcCBpcyBOT1QgdGhlIHN0YXJ0IG9mIHRoZQotb2JqZWN0IGl0c2VsZiEgVGhlIHBvc2l0aW9uIG9mIHRoZSBjYXJldCAoXikgY29ycmVzcG9uZHMgd2l0aCB0aGUgYWRkcmVzcyBvZgotdGhlIHJlYWQgKGZmZmY4ODAwM2U0YTIwMjQpLgotCi1UaGUgc2hhZG93IGJ5dGVtYXAgZHVtcCBsZWdlbmQgaXMgYXMgZm9sbG93czoKLQotICBpIC0gaW5pdGlhbGl6ZWQKLSAgdSAtIHVuaW5pdGlhbGl6ZWQKLSAgYSAtIHVuYWxsb2NhdGVkIChtZW1vcnkgaGFzIGJlZW4gYWxsb2NhdGVkIGJ5IHRoZSBzbGFiIGxheWVyLCBidXQgaGFzIG5vdAotICAgICAgeWV0IGJlZW4gaGFuZGVkIG9mZiB0byBhbnlib2R5KQotICBmIC0gZnJlZWQgKG1lbW9yeSBoYXMgYmVlbiBhbGxvY2F0ZWQgYnkgdGhlIHNsYWIgbGF5ZXIsIGJ1dCBoYXMgYmVlbiBmcmVlZAotICAgICAgYnkgdGhlIHByZXZpb3VzIG93bmVyKQotCi1JbiBvcmRlciB0byBmaWd1cmUgb3V0IHdoZXJlIChyZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIG9iamVjdCkgdGhlCi11bmluaXRpYWxpemVkIG1lbW9yeSB3YXMgbG9jYXRlZCwgd2UgaGF2ZSB0byBsb29rIGF0IHRoZSBkaXNhc3NlbWJseS4gRm9yCi10aGF0LCB3ZSdsbCBuZWVkIHRoZSBSSVAgYWRkcmVzcyBhZ2FpbjoKLQotUklQOiAwMDEwOls8ZmZmZmZmZmY4MTA0ZWRlOD5dICBbPGZmZmZmZmZmODEwNGVkZTg+XSBfX2RlcXVldWVfc2lnbmFsKzB4YzgvMHgxOTAKLQotCSQgb2JqZHVtcCAtZCAtLW5vLXNob3ctcmF3LWluc24gdm1saW51eCB8IGdyZXAgLUMgOCBmZmZmZmZmZjgxMDRlZGU4OgotCWZmZmZmZmZmODEwNGVkYzg6ICAgICAgIG1vdiAgICAlcjgsMHg4KCVyOCkKLQlmZmZmZmZmZjgxMDRlZGNjOiAgICAgICB0ZXN0ICAgJXIxMGQsJXIxMGQKLQlmZmZmZmZmZjgxMDRlZGNmOiAgICAgICBqcyAgICAgZmZmZmZmZmY4MTA0ZWU4OCA8X19kZXF1ZXVlX3NpZ25hbCsweDE2OD4KLQlmZmZmZmZmZjgxMDRlZGQ1OiAgICAgICBtb3YgICAgJXJheCwlcmR4Ci0JZmZmZmZmZmY4MTA0ZWRkODogICAgICAgbW92ICAgICQweGMsJWVjeAotCWZmZmZmZmZmODEwNGVkZGQ6ICAgICAgIG1vdiAgICAlcjEzLCVyZGkKLQlmZmZmZmZmZjgxMDRlZGUwOiAgICAgICBtb3YgICAgJDB4MzAsJWVheAotCWZmZmZmZmZmODEwNGVkZTU6ICAgICAgIG1vdiAgICAlcmR4LCVyc2kKLQlmZmZmZmZmZjgxMDRlZGU4OiAgICAgICByZXAgbW92c2wgJWRzOiglcnNpKSwlZXM6KCVyZGkpCi0JZmZmZmZmZmY4MTA0ZWRlYTogICAgICAgdGVzdCAgICQweDIsJWFsCi0JZmZmZmZmZmY4MTA0ZWRlYzogICAgICAgamUgICAgIGZmZmZmZmZmODEwNGVkZjAgPF9fZGVxdWV1ZV9zaWduYWwrMHhkMD4KLQlmZmZmZmZmZjgxMDRlZGVlOiAgICAgICBtb3ZzdyAgJWRzOiglcnNpKSwlZXM6KCVyZGkpCi0JZmZmZmZmZmY4MTA0ZWRmMDogICAgICAgdGVzdCAgICQweDEsJWFsCi0JZmZmZmZmZmY4MTA0ZWRmMjogICAgICAgamUgICAgIGZmZmZmZmZmODEwNGVkZjUgPF9fZGVxdWV1ZV9zaWduYWwrMHhkNT4KLQlmZmZmZmZmZjgxMDRlZGY0OiAgICAgICBtb3ZzYiAgJWRzOiglcnNpKSwlZXM6KCVyZGkpCi0JZmZmZmZmZmY4MTA0ZWRmNTogICAgICAgbW92ICAgICVyOCwlcmRpCi0JZmZmZmZmZmY4MTA0ZWRmODogICAgICAgY2FsbHEgIGZmZmZmZmZmODEwNGRlNjAgPF9fc2lncXVldWVfZnJlZT4KLQotQXMgZXhwZWN0ZWQsIGl0J3MgdGhlICJyZXAgbW92c2wiIGluc3RydWN0aW9uIGZyb20gdGhlIG1lbWNweSgpIHRoYXQgY2F1c2VzCi10aGUgd2FybmluZy4gV2Uga25vdyBhYm91dCBSRVAgTU9WU0wgdGhhdCBpdCB1c2VzIHRoZSByZWdpc3RlciBSQ1ggdG8gY291bnQKLXRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGl0ZXJhdGlvbnMuIEJ5IHRha2luZyBhIGxvb2sgYXQgdGhlIHJlZ2lzdGVyIGR1bXAKLWFnYWluIChmcm9tIHRoZSBrbWVtY2hlY2sgcmVwb3J0KSwgd2UgY2FuIGZpZ3VyZSBvdXQgaG93IG1hbnkgYnl0ZXMgd2VyZSBsZWZ0Ci10byBjb3B5OgotCi1SQVg6IDAwMDAwMDAwMDAwMDAwMzAgUkJYOiBmZmZmODgwMDNkNGVhOTY4IFJDWDogMDAwMDAwMDAwMDAwMDAwOQotCi1CeSBsb29raW5nIGF0IHRoZSBkaXNhc3NlbWJseSwgd2UgYWxzbyBzZWUgdGhhdCAlZWN4IGlzIGJlaW5nIGxvYWRlZCB3aXRoIHRoZQotdmFsdWUgJDB4YyBqdXN0IGJlZm9yZSAoZmZmZmZmZmY4MTA0ZWRkOCksIHNvIHdlIGFyZSB2ZXJ5IGx1Y2t5LiBLZWVwIGluIG1pbmQKLXRoYXQgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMsIG5vdCBieXRlcy4gQW5kIHNpbmNlIHRoaXMgaXMgYSAibG9uZyIKLW9wZXJhdGlvbiwgd2UgbmVlZCB0byBtdWx0aXBseSBieSA0IHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzLiBTbyB0aGlzIG1lYW5zCi10aGF0IHRoZSB1bmluaXRpYWxpemVkIHZhbHVlIHdhcyBlbmNvdW50ZXJlZCBhdCA0ICogKDB4YyAtIDB4OSkgPSAxMiBieXRlcwotZnJvbSB0aGUgc3RhcnQgb2YgdGhlIG9iamVjdC4KLQotV2UgY2FuIG5vdyB0cnkgdG8gZmlndXJlIG91dCB3aGljaCBmaWVsZCBvZiB0aGUgInN0cnVjdCBzaWdpbmZvIiB0aGF0IHdhcyBub3QKLWluaXRpYWxpemVkLiBUaGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cnVjdDoKLQotNDAgdHlwZWRlZiBzdHJ1Y3Qgc2lnaW5mbyB7Ci00MSAgICAgICAgIGludCBzaV9zaWdubzsKLTQyICAgICAgICAgaW50IHNpX2Vycm5vOwotNDMgICAgICAgICBpbnQgc2lfY29kZTsKLTQ0ICAgICAgICAgICAgICAgICAKLTQ1ICAgICAgICAgdW5pb24gewotLi4KLTkyICAgICAgICAgfSBfc2lmaWVsZHM7Ci05MyB9IHNpZ2luZm9fdDsKLQotT24gNjQtYml0LCB0aGUgaW50IGlzIDQgYnl0ZXMgbG9uZywgc28gaXQgbXVzdCB0aGUgdW5pb24gbWVtYmVyIHRoYXQgaGFzCi1ub3QgYmVlbiBpbml0aWFsaXplZC4gV2UgY2FuIHZlcmlmeSB0aGlzIHVzaW5nIGdkYjoKLQotCSQgZ2RiIHZtbGludXgKLQkuLi4KLQkoZ2RiKSBwICYoKHN0cnVjdCBzaWdpbmZvICopIDApLT5fc2lmaWVsZHMKLQkkMSA9ICh1bmlvbiB7Li4ufSAqKSAweDEwCi0KLUFjdHVhbGx5LCBpdCBzZWVtcyB0aGF0IHRoZSB1bmlvbiBtZW1iZXIgaXMgbG9jYXRlZCBhdCBvZmZzZXQgMHgxMCAtLSB3aGljaAotbWVhbnMgdGhhdCBnY2MgaGFzIGluc2VydGVkIDQgYnl0ZXMgb2YgcGFkZGluZyBiZXR3ZWVuIHRoZSBtZW1iZXJzIHNpX2NvZGUKLWFuZCBfc2lmaWVsZHMuIFdlIGNhbiBub3cgZ2V0IGEgZnVsbGVyIHBpY3R1cmUgb2YgdGhlIG1lbW9yeSBkdW1wOgotCi0gICAgICAgICBfLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT0+IHNpX2NvZGUKLSAgICAgICAgLyAgICAgICAgXy0tLS0tLS0tLS0tLS0tLS0tLS0tPT4gKHBhZGRpbmcpCi0gICAgICAgfCAgICAgICAgLyAgICAgICAgXy0tLS0tLS0tLS0tLT0+IF9zaWZpZWxkcyguX2tpbGwuX3BpZCkKLSAgICAgICB8ICAgICAgIHwgICAgICAgIC8gICAgICAgIF8tLS0tPT4gX3NpZmllbGRzKC5fa2lsbC5fdWlkKQotICAgICAgIHwgICAgICAgfCAgICAgICB8ICAgICAgICAvIAotLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwKLTgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg4ZmZmZjAwMDAwMDAwMDAwMDAwMDAKLSBpIGkgaSBpIHUgdSB1IHUgaSBpIGkgaSBpIGkgaSBpIHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUKLQotVGhpcyBhbGxvd3MgdXMgdG8gcmVhbGl6ZSBhbm90aGVyIGltcG9ydGFudCBmYWN0OiBzaV9jb2RlIGNvbnRhaW5zIHRoZSB2YWx1ZQotMHg4MC4gUmVtZW1iZXIgdGhhdCB4ODYgaXMgbGl0dGxlIGVuZGlhbiwgc28gdGhlIGZpcnN0IDQgYnl0ZXMgIjgwMDAwMDAwIiBhcmUKLXJlYWxseSB0aGUgbnVtYmVyIDB4MDAwMDAwODAuIFdpdGggYSBiaXQgb2YgcmVzZWFyY2gsIHdlIGZpbmQgdGhhdCB0aGlzIGlzCi1hY3R1YWxseSB0aGUgY29uc3RhbnQgU0lfS0VSTkVMIGRlZmluZWQgaW4gaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWdpbmZvLmg6Ci0KLTE0NCAjZGVmaW5lIFNJX0tFUk5FTCAgICAgICAweDgwICAgICAgICAgICAgLyogc2VudCBieSB0aGUga2VybmVsIGZyb20gc29tZXdoZXJlICAgICAqLwotCi1UaGlzIG1hY3JvIGlzIHVzZWQgaW4gZXhhY3RseSBvbmUgcGxhY2UgaW4gdGhlIHg4NiBrZXJuZWw6IEluIHNlbmRfc2lnbmFsKCkKLWluIGtlcm5lbC9zaWduYWwuYzoKLQotODE2IHN0YXRpYyBpbnQgc2VuZF9zaWduYWwoaW50IHNpZywgc3RydWN0IHNpZ2luZm8gKmluZm8sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwKLTgxNyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXApCi04MTggewotLi4uCi04MjggICAgICAgICBwZW5kaW5nID0gZ3JvdXAgPyAmdC0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZyA6ICZ0LT5wZW5kaW5nOwotLi4uCi04NTEgICAgICAgICBxID0gX19zaWdxdWV1ZV9hbGxvYyh0LCBHRlBfQVRPTUlDLCAoc2lnIDwgU0lHUlRNSU4gJiYKLTg1MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNfc2lfc3BlY2lhbChpbmZvKSB8fAotODUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaV9jb2RlID49IDApKSk7Ci04NTQgICAgICAgICBpZiAocSkgewotODU1ICAgICAgICAgICAgICAgICBsaXN0X2FkZF90YWlsKCZxLT5saXN0LCAmcGVuZGluZy0+bGlzdCk7Ci04NTYgICAgICAgICAgICAgICAgIHN3aXRjaCAoKHVuc2lnbmVkIGxvbmcpIGluZm8pIHsKLS4uLgotODY1ICAgICAgICAgICAgICAgICBjYXNlICh1bnNpZ25lZCBsb25nKSBTRU5EX1NJR19QUklWOgotODY2ICAgICAgICAgICAgICAgICAgICAgICAgIHEtPmluZm8uc2lfc2lnbm8gPSBzaWc7Ci04NjcgICAgICAgICAgICAgICAgICAgICAgICAgcS0+aW5mby5zaV9lcnJubyA9IDA7Ci04NjggICAgICAgICAgICAgICAgICAgICAgICAgcS0+aW5mby5zaV9jb2RlID0gU0lfS0VSTkVMOwotODY5ICAgICAgICAgICAgICAgICAgICAgICAgIHEtPmluZm8uc2lfcGlkID0gMDsKLTg3MCAgICAgICAgICAgICAgICAgICAgICAgICBxLT5pbmZvLnNpX3VpZCA9IDA7Ci04NzEgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0uLi4KLTg5MCB9Ci0KLU5vdCBvbmx5IGRvZXMgdGhpcyBtYXRjaCB3aXRoIHRoZSAuc2lfY29kZSBtZW1iZXIsIGl0IGFsc28gbWF0Y2hlcyB0aGUgcGxhY2UKLXdlIGZvdW5kIGVhcmxpZXIgd2hlbiBsb29raW5nIGZvciB3aGVyZSBzaWdpbmZvX3Qgb2JqZWN0cyBhcmUgZW5xdWV1ZWQgb24gdGhlCi0ic2hhcmVkX3BlbmRpbmciIGxpc3QuCi0KLVNvIHRvIHN1bSB1cDogSXQgc2VlbXMgdGhhdCBpdCBpcyB0aGUgcGFkZGluZyBpbnRyb2R1Y2VkIGJ5IHRoZSBjb21waWxlcgotYmV0d2VlbiB0d28gc3RydWN0IGZpZWxkcyB0aGF0IGlzIHVuaW5pdGlhbGl6ZWQsIGFuZCB0aGlzIGdldHMgcmVwb3J0ZWQgd2hlbgotd2UgZG8gYSBtZW1jcHkoKSBvbiB0aGUgc3RydWN0LiBUaGlzIG1lYW5zIHRoYXQgd2UgaGF2ZSBpZGVudGlmaWVkIGEgZmFsc2UKLXBvc2l0aXZlIHdhcm5pbmcuCi0KLU5vcm1hbGx5LCBrbWVtY2hlY2sgd2lsbCBub3QgcmVwb3J0IHVuaW5pdGlhbGl6ZWQgYWNjZXNzZXMgaW4gbWVtY3B5KCkgY2FsbHMKLXdoZW4gYm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgYXJlIHRyYWNrZWQuIChJbnN0ZWFkLCB3ZSBjb3B5Ci10aGUgc2hhZG93IGJ5dGVtYXAgYXMgd2VsbCkuIEluIHRoaXMgY2FzZSwgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgY2xlYXJseQotd2FzIG5vdCB0cmFja2VkLiBXZSBjYW4gZGlnIGEgbGl0dGxlIGRlZXBlciBpbnRvIHRoZSBzdGFjayB0cmFjZSBmcm9tIGFib3ZlOgotCi0JYXJjaC94ODYva2VybmVsL3NpZ25hbC5jOjgwNQotCWFyY2gveDg2L2tlcm5lbC9zaWduYWwuYzo4NzEKLQlhcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUzo2OTQKLQotQW5kIHdlIGNsZWFybHkgc2VlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIHNpZ2luZm8gb2JqZWN0IGlzIGxvY2F0ZWQgb24gdGhlCi1zdGFjazoKLQotNzgyIHN0YXRpYyB2b2lkIGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKLTc4MyB7Ci03ODQgICAgICAgICBzdHJ1Y3Qga19zaWdhY3Rpb24ga2E7Ci03ODUgICAgICAgICBzaWdpbmZvX3QgaW5mbzsKLS4uLgotODA0ICAgICAgICAgc2lnbnIgPSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIoJmluZm8sICZrYSwgcmVncywgTlVMTCk7Ci0uLi4KLTg1NCB9Ci0KLUFuZCB0aGlzICZpbmZvIGlzIHdoYXQgZXZlbnR1YWxseSBnZXRzIHBhc3NlZCB0byBjb3B5X3NpZ2luZm8oKSBhcyB0aGUKLWRlc3RpbmF0aW9uIGFyZ3VtZW50LgotCi1Ob3csIGV2ZW4gdGhvdWdoIHdlIGRpZG4ndCBmaW5kIGFuIGFjdHVhbCBlcnJvciBoZXJlLCB0aGUgZXhhbXBsZSBpcyBzdGlsbCBhCi1nb29kIG9uZSwgYmVjYXVzZSBpdCBzaG93cyBob3cgb25lIHdvdWxkIGdvIGFib3V0IHRvIGZpbmQgb3V0IHdoYXQgdGhlIHJlcG9ydAotd2FzIGFsbCBhYm91dC4KLQotCi0zLjQuIEFubm90YXRpbmcgZmFsc2UgcG9zaXRpdmVzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoZXJlIGFyZSBhIGZldyBkaWZmZXJlbnQgd2F5cyB0byBtYWtlIGFubm90YXRpb25zIGluIHRoZSBzb3VyY2UgY29kZSB0aGF0Ci13aWxsIGtlZXAga21lbWNoZWNrIGZyb20gY2hlY2tpbmcgYW5kIHJlcG9ydGluZyBjZXJ0YWluIGFsbG9jYXRpb25zLiBIZXJlCi10aGV5IGFyZToKLQotICBvIF9fR0ZQX05PVFJBQ0tfRkFMU0VfUE9TSVRJVkUKLQotCVRoaXMgZmxhZyBjYW4gYmUgcGFzc2VkIHRvIGttYWxsb2MoKSBvciBrbWVtX2NhY2hlX2FsbG9jKCkgKHRoZXJlZm9yZQotCWFsc28gdG8gb3RoZXIgZnVuY3Rpb25zIHRoYXQgZW5kIHVwIGNhbGxpbmcgb25lIG9mIHRoZXNlKSB0byBpbmRpY2F0ZQotCXRoYXQgdGhlIGFsbG9jYXRpb24gc2hvdWxkIG5vdCBiZSB0cmFja2VkIGJlY2F1c2UgaXQgd291bGQgbGVhZCB0bwotCWEgZmFsc2UgcG9zaXRpdmUgcmVwb3J0LiBUaGlzIGlzIGEgImJpZyBoYW1tZXIiIHdheSBvZiBzaWxlbmNpbmcKLQlrbWVtY2hlY2s7IGFmdGVyIGFsbCwgZXZlbiBpZiB0aGUgZmFsc2UgcG9zaXRpdmUgcGVydGFpbnMgdG8gCi0JcGFydGljdWxhciBmaWVsZCBpbiBhIHN0cnVjdCwgZm9yIGV4YW1wbGUsIHdlIHdpbGwgbm93IGxvc2UgdGhlCi0JYWJpbGl0eSB0byBmaW5kIChyZWFsKSBlcnJvcnMgaW4gb3RoZXIgcGFydHMgb2YgdGhlIHNhbWUgc3RydWN0LgotCi0JRXhhbXBsZToKLQotCSAgICAvKiBObyB3YXJuaW5ncyB3aWxsIGV2ZXIgdHJpZ2dlciBvbiBhY2Nlc3NpbmcgYW55IHBhcnQgb2YgeCAqLwotCSAgICB4ID0ga21hbGxvYyhzaXplb2YgKngsIEdGUF9LRVJORUwgfCBfX0dGUF9OT1RSQUNLX0ZBTFNFX1BPU0lUSVZFKTsKLQotICBvIGttZW1jaGVja19iaXRmaWVsZF9iZWdpbihuYW1lKS9rbWVtY2hlY2tfYml0ZmllbGRfZW5kKG5hbWUpIGFuZAotCWttZW1jaGVja19hbm5vdGF0ZV9iaXRmaWVsZChwdHIsIG5hbWUpCi0KLQlUaGUgZmlyc3QgdHdvIG9mIHRoZXNlIHRocmVlIG1hY3JvcyBjYW4gYmUgdXNlZCBpbnNpZGUgc3RydWN0Ci0JZGVmaW5pdGlvbnMgdG8gc2lnbmFsLCByZXNwZWN0aXZlbHksIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhCi0JYml0ZmllbGQuIEFkZGl0aW9uYWxseSwgdGhpcyB3aWxsIGFzc2lnbiB0aGUgYml0ZmllbGQgYSBuYW1lLCB3aGljaAotCWlzIGdpdmVuIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBtYWNyb3MuCi0KLQlIYXZpbmcgdXNlZCB0aGVzZSBtYXJrZXJzLCBvbmUgY2FuIGxhdGVyIHVzZQotCWttZW1jaGVja19hbm5vdGF0ZV9iaXRmaWVsZCgpIGF0IHRoZSBwb2ludCBvZiBhbGxvY2F0aW9uLCB0byBpbmRpY2F0ZQotCXdoaWNoIHBhcnRzIG9mIHRoZSBhbGxvY2F0aW9uIGlzIHBhcnQgb2YgYSBiaXRmaWVsZC4KLQotCUV4YW1wbGU6Ci0KLQkgICAgc3RydWN0IGZvbyB7Ci0JCWludCB4OwotCi0JCWttZW1jaGVja19iaXRmaWVsZF9iZWdpbihmbGFncyk7Ci0JCWludCBmbGFnX2E6MTsKLQkJaW50IGZsYWdfYjoxOwotCQlrbWVtY2hlY2tfYml0ZmllbGRfZW5kKGZsYWdzKTsKLQotCQlpbnQgeTsKLQkgICAgfTsKLQotCSAgICBzdHJ1Y3QgZm9vICp4ID0ga21hbGxvYyhzaXplb2YgKngpOwotCi0JICAgIC8qIE5vIHdhcm5pbmdzIHdpbGwgdHJpZ2dlciBvbiBhY2Nlc3NpbmcgdGhlIGJpdGZpZWxkIG9mIHggKi8KLQkgICAga21lbWNoZWNrX2Fubm90YXRlX2JpdGZpZWxkKHgsIGZsYWdzKTsKLQotCU5vdGUgdGhhdCBrbWVtY2hlY2tfYW5ub3RhdGVfYml0ZmllbGQoKSBjYW4gYmUgdXNlZCBldmVuIGJlZm9yZSB0aGUKLQlyZXR1cm4gdmFsdWUgb2Yga21hbGxvYygpIGlzIGNoZWNrZWQgLS0gaW4gb3RoZXIgd29yZHMsIHBhc3NpbmcgTlVMTAotCWFzIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBsZWdhbCAoYW5kIHdpbGwgZG8gbm90aGluZykuCi0KLQotNC4gUmVwb3J0aW5nIGVycm9ycwotPT09PT09PT09PT09PT09PT09PQotCi1BcyB3ZSBoYXZlIHNlZW4sIGttZW1jaGVjayB3aWxsIHByb2R1Y2UgZmFsc2UgcG9zaXRpdmUgcmVwb3J0cy4gVGhlcmVmb3JlLCBpdAotaXMgbm90IHZlcnkgd2lzZSB0byBibGluZGx5IHBvc3Qga21lbWNoZWNrIHdhcm5pbmdzIHRvIG1haWxpbmcgbGlzdHMgYW5kCi1tYWludGFpbmVycy4gSW5zdGVhZCwgSSBlbmNvdXJhZ2UgbWFpbnRhaW5lcnMgYW5kIGRldmVsb3BlcnMgdG8gZmluZCBlcnJvcnMKLWluIHRoZWlyIG93biBjb2RlLiBJZiB5b3UgZ2V0IGEgd2FybmluZywgeW91IGNhbiB0cnkgdG8gd29yayBhcm91bmQgaXQsIHRyeQotdG8gZmlndXJlIG91dCBpZiBpdCdzIGEgcmVhbCBlcnJvciBvciBub3QsIG9yIHNpbXBseSBpZ25vcmUgaXQuIE1vc3QKLWRldmVsb3BlcnMga25vdyB0aGVpciBvd24gY29kZSBhbmQgd2lsbCBxdWlja2x5IGFuZCBlZmZpY2llbnRseSBkZXRlcm1pbmUgdGhlCi1yb290IGNhdXNlIG9mIGEga21lbWNoZWNrIHJlcG9ydC4gVGhpcyBpcyB0aGVyZWZvcmUgYWxzbyB0aGUgbW9zdCBlZmZpY2llbnQKLXdheSB0byB3b3JrIHdpdGgga21lbWNoZWNrLgotCi1UaGF0IHNhaWQsIHdlICh0aGUga21lbWNoZWNrIG1haW50YWluZXJzKSB3aWxsIGFsd2F5cyBiZSBvbiB0aGUgbG9va291dCBmb3IKLWZhbHNlIHBvc2l0aXZlcyB0aGF0IHdlIGNhbiBhbm5vdGF0ZSBhbmQgc2lsZW5jZS4gU28gd2hhdGV2ZXIgeW91IGZpbmQsCi1wbGVhc2UgZHJvcCB1cyBhIG5vdGUgcHJpdmF0ZWx5ISBLZXJuZWwgY29uZmlncyBhbmQgc3RlcHMgdG8gcmVwcm9kdWNlIChpZgotYXZhaWxhYmxlKSBhcmUgb2YgY291cnNlIGEgZ3JlYXQgaGVscCB0b28uCi0KLUhhcHB5IGhhY2tpbmchCi0KLQotNS4gVGVjaG5pY2FsIGRlc2NyaXB0aW9uCi09PT09PT09PT09PT09PT09PT09PT09PT0KLQota21lbWNoZWNrIHdvcmtzIGJ5IG1hcmtpbmcgbWVtb3J5IHBhZ2VzIG5vbi1wcmVzZW50LiBUaGlzIG1lYW5zIHRoYXQgd2hlbmV2ZXIKLXNvbWVib2R5IGF0dGVtcHRzIHRvIGFjY2VzcyB0aGUgcGFnZSwgYSBwYWdlIGZhdWx0IGlzIGdlbmVyYXRlZC4gVGhlIHBhZ2UKLWZhdWx0IGhhbmRsZXIgbm90aWNlcyB0aGF0IHRoZSBwYWdlIHdhcyBpbiBmYWN0IG9ubHkgaGlkZGVuLCBhbmQgc28gaXQgY2FsbHMKLW9uIHRoZSBrbWVtY2hlY2sgY29kZSB0byBtYWtlIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbnMuCi0KLVdoZW4gdGhlIGludmVzdGlnYXRpb25zIGFyZSBjb21wbGV0ZWQsIGttZW1jaGVjayAic2hvd3MiIHRoZSBwYWdlIGJ5IG1hcmtpbmcKLWl0IHByZXNlbnQgKGFzIGl0IHdvdWxkIGJlIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzKS4gVGhpcyB3YXksIHRoZQotaW50ZXJydXB0ZWQgY29kZSBjYW4gY29udGludWUgYXMgdXN1YWwuCi0KLUJ1dCBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQsIHdlIHNob3VsZCBoaWRlIHRoZSBwYWdlIGFnYWluLCBzbwotdGhhdCB3ZSBjYW4gY2F0Y2ggdGhlIG5leHQgYWNjZXNzIHRvbyEgTm93IGttZW1jaGVjayBtYWtlcyB1c2Ugb2YgYSBkZWJ1Z2dpbmcKLWZlYXR1cmUgb2YgdGhlIHByb2Nlc3NvciwgbmFtZWx5IHNpbmdsZS1zdGVwcGluZy4gV2hlbiB0aGUgcHJvY2Vzc29yIGhhcwotZmluaXNoZWQgdGhlIG9uZSBpbnN0cnVjdGlvbiB0aGF0IGdlbmVyYXRlZCB0aGUgbWVtb3J5IGFjY2VzcywgYSBkZWJ1ZwotZXhjZXB0aW9uIGlzIHJhaXNlZC4gRnJvbSBoZXJlLCB3ZSBzaW1wbHkgaGlkZSB0aGUgcGFnZSBhZ2FpbiBhbmQgY29udGludWUKLWV4ZWN1dGlvbiwgdGhpcyB0aW1lIHdpdGggdGhlIHNpbmdsZS1zdGVwcGluZyBmZWF0dXJlIHR1cm5lZCBvZmYuCi0KLWttZW1jaGVjayByZXF1aXJlcyBzb21lIGFzc2lzdGFuY2UgZnJvbSB0aGUgbWVtb3J5IGFsbG9jYXRvciBpbiBvcmRlciB0byB3b3JrLgotVGhlIG1lbW9yeSBhbGxvY2F0b3IgbmVlZHMgdG8KLQotICAxLiBUZWxsIGttZW1jaGVjayBhYm91dCBuZXdseSBhbGxvY2F0ZWQgcGFnZXMgYW5kIHBhZ2VzIHRoYXQgYXJlIGFib3V0IHRvCi0gICAgIGJlIGZyZWVkLiBUaGlzIGFsbG93cyBrbWVtY2hlY2sgdG8gc2V0IHVwIGFuZCB0ZWFyIGRvd24gdGhlIHNoYWRvdyBtZW1vcnkKLSAgICAgZm9yIHRoZSBwYWdlcyBpbiBxdWVzdGlvbi4gVGhlIHNoYWRvdyBtZW1vcnkgc3RvcmVzIHRoZSBzdGF0dXMgb2YgZWFjaAotICAgICBieXRlIGluIHRoZSBhbGxvY2F0aW9uIHByb3BlciwgZS5nLiB3aGV0aGVyIGl0IGlzIGluaXRpYWxpemVkIG9yCi0gICAgIHVuaW5pdGlhbGl6ZWQuCi0KLSAgMi4gVGVsbCBrbWVtY2hlY2sgd2hpY2ggcGFydHMgb2YgbWVtb3J5IHNob3VsZCBiZSBtYXJrZWQgdW5pbml0aWFsaXplZC4KLSAgICAgVGhlcmUgYXJlIGFjdHVhbGx5IGEgZmV3IG1vcmUgc3RhdGVzLCBzdWNoIGFzICJub3QgeWV0IGFsbG9jYXRlZCIgYW5kCi0gICAgICJyZWNlbnRseSBmcmVlZCIuCi0KLUlmIGEgc2xhYiBjYWNoZSBpcyBzZXQgdXAgdXNpbmcgdGhlIFNMQUJfTk9UUkFDSyBmbGFnLCBpdCB3aWxsIG5ldmVyIHJldHVybgotbWVtb3J5IHRoYXQgY2FuIHRha2UgcGFnZSBmYXVsdHMgYmVjYXVzZSBvZiBrbWVtY2hlY2suCi0KLUlmIGEgc2xhYiBjYWNoZSBpcyBOT1Qgc2V0IHVwIHVzaW5nIHRoZSBTTEFCX05PVFJBQ0sgZmxhZywgY2FsbGVycyBjYW4gc3RpbGwKLXJlcXVlc3QgbWVtb3J5IHdpdGggdGhlIF9fR0ZQX05PVFJBQ0sgb3IgX19HRlBfTk9UUkFDS19GQUxTRV9QT1NJVElWRSBmbGFncy4KLVRoaXMgZG9lcyBub3QgcHJldmVudCB0aGUgcGFnZSBmYXVsdHMgZnJvbSBvY2N1cnJpbmcsIGhvd2V2ZXIsIGJ1dCBtYXJrcyB0aGUKLW9iamVjdCBpbiBxdWVzdGlvbiBhcyBiZWluZyBpbml0aWFsaXplZCBzbyB0aGF0IG5vIHdhcm5pbmdzIHdpbGwgZXZlciBiZQotcHJvZHVjZWQgZm9yIHRoaXMgb2JqZWN0LgotCi1DdXJyZW50bHksIHRoZSBTTEFCIGFuZCBTTFVCIGFsbG9jYXRvcnMgYXJlIHN1cHBvcnRlZCBieSBrbWVtY2hlY2suCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ttZW1sZWFrLnR4dCBiL0RvY3VtZW50YXRpb24va21lbWxlYWsudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGUyNGFiLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24va21lbWxlYWsudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLUtlcm5lbCBNZW1vcnkgTGVhayBEZXRlY3RvcgotPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUludHJvZHVjdGlvbgotLS0tLS0tLS0tLS0tCi0KLUttZW1sZWFrIHByb3ZpZGVzIGEgd2F5IG9mIGRldGVjdGluZyBwb3NzaWJsZSBrZXJuZWwgbWVtb3J5IGxlYWtzIGluIGEKLXdheSBzaW1pbGFyIHRvIGEgdHJhY2luZyBnYXJiYWdlIGNvbGxlY3RvcgotKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dhcmJhZ2VfY29sbGVjdGlvbl8lMjhjb21wdXRlcl9zY2llbmNlJTI5I1RyYWNpbmdfZ2FyYmFnZV9jb2xsZWN0b3JzKSwKLXdpdGggdGhlIGRpZmZlcmVuY2UgdGhhdCB0aGUgb3JwaGFuIG9iamVjdHMgYXJlIG5vdCBmcmVlZCBidXQgb25seQotcmVwb3J0ZWQgdmlhIC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrLiBBIHNpbWlsYXIgbWV0aG9kIGlzIHVzZWQgYnkgdGhlCi1WYWxncmluZCB0b29sIChtZW1jaGVjayAtLWxlYWstY2hlY2spIHRvIGRldGVjdCB0aGUgbWVtb3J5IGxlYWtzIGluCi11c2VyLXNwYWNlIGFwcGxpY2F0aW9ucy4KLUttZW1sZWFrIGlzIHN1cHBvcnRlZCBvbiB4ODYsIGFybSwgcG93ZXJwYywgc3BhcmMsIHNoLCBtaWNyb2JsYXplLCBwcGMsIG1pcHMsIHMzOTAsIG1ldGFnIGFuZCB0aWxlLgotCi1Vc2FnZQotLS0tLS0KLQotQ09ORklHX0RFQlVHX0tNRU1MRUFLIGluICJLZXJuZWwgaGFja2luZyIgaGFzIHRvIGJlIGVuYWJsZWQuIEEga2VybmVsCi10aHJlYWQgc2NhbnMgdGhlIG1lbW9yeSBldmVyeSAxMCBtaW51dGVzIChieSBkZWZhdWx0KSBhbmQgcHJpbnRzIHRoZQotbnVtYmVyIG9mIG5ldyB1bnJlZmVyZW5jZWQgb2JqZWN0cyBmb3VuZC4gVG8gZGlzcGxheSB0aGUgZGV0YWlscyBvZiBhbGwKLXRoZSBwb3NzaWJsZSBtZW1vcnkgbGVha3M6Ci0KLSAgIyBtb3VudCAtdCBkZWJ1Z2ZzIG5vZGV2IC9zeXMva2VybmVsL2RlYnVnLwotICAjIGNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhawotCi1UbyB0cmlnZ2VyIGFuIGludGVybWVkaWF0ZSBtZW1vcnkgc2NhbjoKLQotICAjIGVjaG8gc2NhbiA+IC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCi0KLVRvIGNsZWFyIHRoZSBsaXN0IG9mIGFsbCBjdXJyZW50IHBvc3NpYmxlIG1lbW9yeSBsZWFrczoKLQotICAjIGVjaG8gY2xlYXIgPiAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhawotCi1OZXcgbGVha3Mgd2lsbCB0aGVuIGNvbWUgdXAgdXBvbiByZWFkaW5nIC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCi1hZ2Fpbi4KLQotTm90ZSB0aGF0IHRoZSBvcnBoYW4gb2JqZWN0cyBhcmUgbGlzdGVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgYWxsb2NhdGVkCi1hbmQgb25lIG9iamVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0IG1heSBjYXVzZSBvdGhlciBzdWJzZXF1ZW50Ci1vYmplY3RzIHRvIGJlIHJlcG9ydGVkIGFzIG9ycGhhbi4KLQotTWVtb3J5IHNjYW5uaW5nIHBhcmFtZXRlcnMgY2FuIGJlIG1vZGlmaWVkIGF0IHJ1bi10aW1lIGJ5IHdyaXRpbmcgdG8gdGhlCi0vc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhayBmaWxlLiBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZDoKLQotICBvZmYJCS0gZGlzYWJsZSBrbWVtbGVhayAoaXJyZXZlcnNpYmxlKQotICBzdGFjaz1vbgktIGVuYWJsZSB0aGUgdGFzayBzdGFja3Mgc2Nhbm5pbmcgKGRlZmF1bHQpCi0gIHN0YWNrPW9mZgktIGRpc2FibGUgdGhlIHRhc2tzIHN0YWNrcyBzY2FubmluZwotICBzY2FuPW9uCS0gc3RhcnQgdGhlIGF1dG9tYXRpYyBtZW1vcnkgc2Nhbm5pbmcgdGhyZWFkIChkZWZhdWx0KQotICBzY2FuPW9mZgktIHN0b3AgdGhlIGF1dG9tYXRpYyBtZW1vcnkgc2Nhbm5pbmcgdGhyZWFkCi0gIHNjYW49PHNlY3M+CS0gc2V0IHRoZSBhdXRvbWF0aWMgbWVtb3J5IHNjYW5uaW5nIHBlcmlvZCBpbiBzZWNvbmRzCi0JCSAgKGRlZmF1bHQgNjAwLCAwIHRvIHN0b3AgdGhlIGF1dG9tYXRpYyBzY2FubmluZykKLSAgc2NhbgkJLSB0cmlnZ2VyIGEgbWVtb3J5IHNjYW4KLSAgY2xlYXIJCS0gY2xlYXIgbGlzdCBvZiBjdXJyZW50IG1lbW9yeSBsZWFrIHN1c3BlY3RzLCBkb25lIGJ5Ci0JCSAgbWFya2luZyBhbGwgY3VycmVudCByZXBvcnRlZCB1bnJlZmVyZW5jZWQgb2JqZWN0cyBncmV5LAotCQkgIG9yIGZyZWUgYWxsIGttZW1sZWFrIG9iamVjdHMgaWYga21lbWxlYWsgaGFzIGJlZW4gZGlzYWJsZWQuCi0gIGR1bXA9PGFkZHI+CS0gZHVtcCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGZvdW5kIGF0IDxhZGRyPgotCi1LbWVtbGVhayBjYW4gYWxzbyBiZSBkaXNhYmxlZCBhdCBib290LXRpbWUgYnkgcGFzc2luZyAia21lbWxlYWs9b2ZmIiBvbgotdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuCi0KLU1lbW9yeSBtYXkgYmUgYWxsb2NhdGVkIG9yIGZyZWVkIGJlZm9yZSBrbWVtbGVhayBpcyBpbml0aWFsaXNlZCBhbmQKLXRoZXNlIGFjdGlvbnMgYXJlIHN0b3JlZCBpbiBhbiBlYXJseSBsb2cgYnVmZmVyLiBUaGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlcgotaXMgY29uZmlndXJlZCB2aWEgdGhlIENPTkZJR19ERUJVR19LTUVNTEVBS19FQVJMWV9MT0dfU0laRSBvcHRpb24uCi0KLUlmIENPTkZJR19ERUJVR19LTUVNTEVBS19ERUZBVUxUX09GRiBhcmUgZW5hYmxlZCwgdGhlIGttZW1sZWFrIGlzCi1kaXNhYmxlZCBieSBkZWZhdWx0LiBQYXNzaW5nICJrbWVtbGVhaz1vbiIgb24gdGhlIGtlcm5lbCBjb21tYW5kCi1saW5lIGVuYWJsZXMgdGhlIGZ1bmN0aW9uLiAKLQotQmFzaWMgQWxnb3JpdGhtCi0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIG1lbW9yeSBhbGxvY2F0aW9ucyB2aWEga21hbGxvYywgdm1hbGxvYywga21lbV9jYWNoZV9hbGxvYyBhbmQKLWZyaWVuZHMgYXJlIHRyYWNlZCBhbmQgdGhlIHBvaW50ZXJzLCB0b2dldGhlciB3aXRoIGFkZGl0aW9uYWwKLWluZm9ybWF0aW9uIGxpa2Ugc2l6ZSBhbmQgc3RhY2sgdHJhY2UsIGFyZSBzdG9yZWQgaW4gYSByYnRyZWUuCi1UaGUgY29ycmVzcG9uZGluZyBmcmVlaW5nIGZ1bmN0aW9uIGNhbGxzIGFyZSB0cmFja2VkIGFuZCB0aGUgcG9pbnRlcnMKLXJlbW92ZWQgZnJvbSB0aGUga21lbWxlYWsgZGF0YSBzdHJ1Y3R1cmVzLgotCi1BbiBhbGxvY2F0ZWQgYmxvY2sgb2YgbWVtb3J5IGlzIGNvbnNpZGVyZWQgb3JwaGFuIGlmIG5vIHBvaW50ZXIgdG8gaXRzCi1zdGFydCBhZGRyZXNzIG9yIHRvIGFueSBsb2NhdGlvbiBpbnNpZGUgdGhlIGJsb2NrIGNhbiBiZSBmb3VuZCBieQotc2Nhbm5pbmcgdGhlIG1lbW9yeSAoaW5jbHVkaW5nIHNhdmVkIHJlZ2lzdGVycykuIFRoaXMgbWVhbnMgdGhhdCB0aGVyZQotbWlnaHQgYmUgbm8gd2F5IGZvciB0aGUga2VybmVsIHRvIHBhc3MgdGhlIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZAotYmxvY2sgdG8gYSBmcmVlaW5nIGZ1bmN0aW9uIGFuZCB0aGVyZWZvcmUgdGhlIGJsb2NrIGlzIGNvbnNpZGVyZWQgYQotbWVtb3J5IGxlYWsuCi0KLVRoZSBzY2FubmluZyBhbGdvcml0aG0gc3RlcHM6Ci0KLSAgMS4gbWFyayBhbGwgb2JqZWN0cyBhcyB3aGl0ZSAocmVtYWluaW5nIHdoaXRlIG9iamVjdHMgd2lsbCBsYXRlciBiZQotICAgICBjb25zaWRlcmVkIG9ycGhhbikKLSAgMi4gc2NhbiB0aGUgbWVtb3J5IHN0YXJ0aW5nIHdpdGggdGhlIGRhdGEgc2VjdGlvbiBhbmQgc3RhY2tzLCBjaGVja2luZwotICAgICB0aGUgdmFsdWVzIGFnYWluc3QgdGhlIGFkZHJlc3NlcyBzdG9yZWQgaW4gdGhlIHJidHJlZS4gSWYKLSAgICAgYSBwb2ludGVyIHRvIGEgd2hpdGUgb2JqZWN0IGlzIGZvdW5kLCB0aGUgb2JqZWN0IGlzIGFkZGVkIHRvIHRoZQotICAgICBncmF5IGxpc3QKLSAgMy4gc2NhbiB0aGUgZ3JheSBvYmplY3RzIGZvciBtYXRjaGluZyBhZGRyZXNzZXMgKHNvbWUgd2hpdGUgb2JqZWN0cwotICAgICBjYW4gYmVjb21lIGdyYXkgYW5kIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGdyYXkgbGlzdCkgdW50aWwgdGhlCi0gICAgIGdyYXkgc2V0IGlzIGZpbmlzaGVkCi0gIDQuIHRoZSByZW1haW5pbmcgd2hpdGUgb2JqZWN0cyBhcmUgY29uc2lkZXJlZCBvcnBoYW4gYW5kIHJlcG9ydGVkIHZpYQotICAgICAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhawotCi1Tb21lIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2tzIGhhdmUgcG9pbnRlcnMgc3RvcmVkIGluIHRoZSBrZXJuZWwncwotaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGFuZCB0aGV5IGNhbm5vdCBiZSBkZXRlY3RlZCBhcyBvcnBoYW5zLiBUbwotYXZvaWQgdGhpcywga21lbWxlYWsgY2FuIGFsc28gc3RvcmUgdGhlIG51bWJlciBvZiB2YWx1ZXMgcG9pbnRpbmcgdG8gYW4KLWFkZHJlc3MgaW5zaWRlIHRoZSBibG9jayBhZGRyZXNzIHJhbmdlIHRoYXQgbmVlZCB0byBiZSBmb3VuZCBzbyB0aGF0IHRoZQotYmxvY2sgaXMgbm90IGNvbnNpZGVyZWQgYSBsZWFrLiBPbmUgZXhhbXBsZSBpcyBfX3ZtYWxsb2MoKS4KLQotVGVzdGluZyBzcGVjaWZpYyBzZWN0aW9ucyB3aXRoIGttZW1sZWFrCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVXBvbiBpbml0aWFsIGJvb3R1cCB5b3VyIC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrIG91dHB1dCBwYWdlIG1heSBiZQotcXVpdGUgZXh0ZW5zaXZlLiBUaGlzIGNhbiBhbHNvIGJlIHRoZSBjYXNlIGlmIHlvdSBoYXZlIHZlcnkgYnVnZ3kgY29kZQotd2hlbiBkb2luZyBkZXZlbG9wbWVudC4gVG8gd29yayBhcm91bmQgdGhlc2Ugc2l0dWF0aW9ucyB5b3UgY2FuIHVzZSB0aGUKLSdjbGVhcicgY29tbWFuZCB0byBjbGVhciBhbGwgcmVwb3J0ZWQgdW5yZWZlcmVuY2VkIG9iamVjdHMgZnJvbSB0aGUKLS9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrIG91dHB1dC4gQnkgaXNzdWluZyBhICdzY2FuJyBhZnRlciBhICdjbGVhcicKLXlvdSBjYW4gZmluZCBuZXcgdW5yZWZlcmVuY2VkIG9iamVjdHM7IHRoaXMgc2hvdWxkIGhlbHAgd2l0aCB0ZXN0aW5nCi1zcGVjaWZpYyBzZWN0aW9ucyBvZiBjb2RlLgotCi1UbyB0ZXN0IGEgY3JpdGljYWwgc2VjdGlvbiBvbiBkZW1hbmQgd2l0aCBhIGNsZWFuIGttZW1sZWFrIGRvOgotCi0gICMgZWNobyBjbGVhciA+IC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCi0gIC4uLiB0ZXN0IHlvdXIga2VybmVsIG9yIG1vZHVsZXMgLi4uCi0gICMgZWNobyBzY2FuID4gL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsKLQotVGhlbiBhcyB1c3VhbCB0byBnZXQgeW91ciByZXBvcnQgd2l0aDoKLQotICAjIGNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhawotCi1GcmVlaW5nIGttZW1sZWFrIGludGVybmFsIG9iamVjdHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UbyBhbGxvdyBhY2Nlc3MgdG8gcHJldmlvdXNseSBmb3VuZCBtZW1vcnkgbGVha3MgYWZ0ZXIga21lbWxlYWsgaGFzIGJlZW4KLWRpc2FibGVkIGJ5IHRoZSB1c2VyIG9yIGR1ZSB0byBhbiBmYXRhbCBlcnJvciwgaW50ZXJuYWwga21lbWxlYWsgb2JqZWN0cwotd29uJ3QgYmUgZnJlZWQgd2hlbiBrbWVtbGVhayBpcyBkaXNhYmxlZCwgYW5kIHRob3NlIG9iamVjdHMgbWF5IG9jY3VweQotYSBsYXJnZSBwYXJ0IG9mIHBoeXNpY2FsIG1lbW9yeS4KLQotSW4gdGhpcyBzaXR1YXRpb24sIHlvdSBtYXkgcmVjbGFpbSBtZW1vcnkgd2l0aDoKLQotICAjIGVjaG8gY2xlYXIgPiAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhawotCi1LbWVtbGVhayBBUEkKLS0tLS0tLS0tLS0tLQotCi1TZWUgdGhlIGluY2x1ZGUvbGludXgva21lbWxlYWsuaCBoZWFkZXIgZm9yIHRoZSBmdW5jdGlvbnMgcHJvdG90eXBlLgotCi1rbWVtbGVha19pbml0CQkgLSBpbml0aWFsaXplIGttZW1sZWFrCi1rbWVtbGVha19hbGxvYwkJIC0gbm90aWZ5IG9mIGEgbWVtb3J5IGJsb2NrIGFsbG9jYXRpb24KLWttZW1sZWFrX2FsbG9jX3BlcmNwdQkgLSBub3RpZnkgb2YgYSBwZXJjcHUgbWVtb3J5IGJsb2NrIGFsbG9jYXRpb24KLWttZW1sZWFrX2ZyZWUJCSAtIG5vdGlmeSBvZiBhIG1lbW9yeSBibG9jayBmcmVlaW5nCi1rbWVtbGVha19mcmVlX3BhcnQJIC0gbm90aWZ5IG9mIGEgcGFydGlhbCBtZW1vcnkgYmxvY2sgZnJlZWluZwota21lbWxlYWtfZnJlZV9wZXJjcHUJIC0gbm90aWZ5IG9mIGEgcGVyY3B1IG1lbW9yeSBibG9jayBmcmVlaW5nCi1rbWVtbGVha191cGRhdGVfdHJhY2UJIC0gdXBkYXRlIG9iamVjdCBhbGxvY2F0aW9uIHN0YWNrIHRyYWNlCi1rbWVtbGVha19ub3RfbGVhawkgLSBtYXJrIGFuIG9iamVjdCBhcyBub3QgYSBsZWFrCi1rbWVtbGVha19pZ25vcmUJCSAtIGRvIG5vdCBzY2FuIG9yIHJlcG9ydCBhbiBvYmplY3QgYXMgbGVhawota21lbWxlYWtfc2Nhbl9hcmVhCSAtIGFkZCBzY2FuIGFyZWFzIGluc2lkZSBhIG1lbW9yeSBibG9jawota21lbWxlYWtfbm9fc2NhbgkgLSBkbyBub3Qgc2NhbiBhIG1lbW9yeSBibG9jawota21lbWxlYWtfZXJhc2UJCSAtIGVyYXNlIGFuIG9sZCB2YWx1ZSBpbiBhIHBvaW50ZXIgdmFyaWFibGUKLWttZW1sZWFrX2FsbG9jX3JlY3Vyc2l2ZSAtIGFzIGttZW1sZWFrX2FsbG9jIGJ1dCBjaGVja3MgdGhlIHJlY3Vyc2l2ZW5lc3MKLWttZW1sZWFrX2ZyZWVfcmVjdXJzaXZlCSAtIGFzIGttZW1sZWFrX2ZyZWUgYnV0IGNoZWNrcyB0aGUgcmVjdXJzaXZlbmVzcwotCi1EZWFsaW5nIHdpdGggZmFsc2UgcG9zaXRpdmVzL25lZ2F0aXZlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGZhbHNlIG5lZ2F0aXZlcyBhcmUgcmVhbCBtZW1vcnkgbGVha3MgKG9ycGhhbiBvYmplY3RzKSBidXQgbm90Ci1yZXBvcnRlZCBieSBrbWVtbGVhayBiZWNhdXNlIHZhbHVlcyBmb3VuZCBkdXJpbmcgdGhlIG1lbW9yeSBzY2FubmluZwotcG9pbnQgdG8gc3VjaCBvYmplY3RzLiBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBmYWxzZSBuZWdhdGl2ZXMsIGttZW1sZWFrCi1wcm92aWRlcyB0aGUga21lbWxlYWtfaWdub3JlLCBrbWVtbGVha19zY2FuX2FyZWEsIGttZW1sZWFrX25vX3NjYW4gYW5kCi1rbWVtbGVha19lcmFzZSBmdW5jdGlvbnMgKHNlZSBhYm92ZSkuIFRoZSB0YXNrIHN0YWNrcyBhbHNvIGluY3JlYXNlIHRoZQotYW1vdW50IG9mIGZhbHNlIG5lZ2F0aXZlcyBhbmQgdGhlaXIgc2Nhbm5pbmcgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4KLQotVGhlIGZhbHNlIHBvc2l0aXZlcyBhcmUgb2JqZWN0cyB3cm9uZ2x5IHJlcG9ydGVkIGFzIGJlaW5nIG1lbW9yeSBsZWFrcwotKG9ycGhhbikuIEZvciBvYmplY3RzIGtub3duIG5vdCB0byBiZSBsZWFrcywga21lbWxlYWsgcHJvdmlkZXMgdGhlCi1rbWVtbGVha19ub3RfbGVhayBmdW5jdGlvbi4gVGhlIGttZW1sZWFrX2lnbm9yZSBjb3VsZCBhbHNvIGJlIHVzZWQgaWYKLXRoZSBtZW1vcnkgYmxvY2sgaXMga25vd24gbm90IHRvIGNvbnRhaW4gb3RoZXIgcG9pbnRlcnMgYW5kIGl0IHdpbGwgbm8KLWxvbmdlciBiZSBzY2FubmVkLgotCi1Tb21lIG9mIHRoZSByZXBvcnRlZCBsZWFrcyBhcmUgb25seSB0cmFuc2llbnQsIGVzcGVjaWFsbHkgb24gU01QCi1zeXN0ZW1zLCBiZWNhdXNlIG9mIHBvaW50ZXJzIHRlbXBvcmFyaWx5IHN0b3JlZCBpbiBDUFUgcmVnaXN0ZXJzIG9yCi1zdGFja3MuIEttZW1sZWFrIGRlZmluZXMgTVNFQ1NfTUlOX0FHRSAoZGVmYXVsdGluZyB0byAxMDAwKSByZXByZXNlbnRpbmcKLXRoZSBtaW5pbXVtIGFnZSBvZiBhbiBvYmplY3QgdG8gYmUgcmVwb3J0ZWQgYXMgYSBtZW1vcnkgbGVhay4KLQotTGltaXRhdGlvbnMgYW5kIERyYXdiYWNrcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgbWFpbiBkcmF3YmFjayBpcyB0aGUgcmVkdWNlZCBwZXJmb3JtYW5jZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBhbmQKLWZyZWVpbmcuIFRvIGF2b2lkIG90aGVyIHBlbmFsdGllcywgdGhlIG1lbW9yeSBzY2FubmluZyBpcyBvbmx5IHBlcmZvcm1lZAotd2hlbiB0aGUgL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsgZmlsZSBpcyByZWFkLiBBbnl3YXksIHRoaXMgdG9vbCBpcwotaW50ZW5kZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB3aGVyZSB0aGUgcGVyZm9ybWFuY2UgbWlnaHQgbm90IGJlIHRoZQotbW9zdCBpbXBvcnRhbnQgcmVxdWlyZW1lbnQuCi0KLVRvIGtlZXAgdGhlIGFsZ29yaXRobSBzaW1wbGUsIGttZW1sZWFrIHNjYW5zIGZvciB2YWx1ZXMgcG9pbnRpbmcgdG8gYW55Ci1hZGRyZXNzIGluc2lkZSBhIGJsb2NrJ3MgYWRkcmVzcyByYW5nZS4gVGhpcyBtYXkgbGVhZCB0byBhbiBpbmNyZWFzZWQKLW51bWJlciBvZiBmYWxzZSBuZWdhdGl2ZXMuIEhvd2V2ZXIsIGl0IGlzIGxpa2VseSB0aGF0IGEgcmVhbCBtZW1vcnkgbGVhawotd2lsbCBldmVudHVhbGx5IGJlY29tZSB2aXNpYmxlLgotCi1Bbm90aGVyIHNvdXJjZSBvZiBmYWxzZSBuZWdhdGl2ZXMgaXMgdGhlIGRhdGEgc3RvcmVkIGluIG5vbi1wb2ludGVyCi12YWx1ZXMuIEluIGEgZnV0dXJlIHZlcnNpb24sIGttZW1sZWFrIGNvdWxkIG9ubHkgc2NhbiB0aGUgcG9pbnRlcgotbWVtYmVycyBpbiB0aGUgYWxsb2NhdGVkIHN0cnVjdHVyZXMuIFRoaXMgZmVhdHVyZSB3b3VsZCBzb2x2ZSBtYW55IG9mCi10aGUgZmFsc2UgbmVnYXRpdmUgY2FzZXMgZGVzY3JpYmVkIGFib3ZlLgotCi1UaGUgdG9vbCBjYW4gcmVwb3J0IGZhbHNlIHBvc2l0aXZlcy4gVGhlc2UgYXJlIGNhc2VzIHdoZXJlIGFuIGFsbG9jYXRlZAotYmxvY2sgZG9lc24ndCBuZWVkIHRvIGJlIGZyZWVkIChzb21lIGNhc2VzIGluIHRoZSBpbml0X2NhbGwgZnVuY3Rpb25zKSwKLXRoZSBwb2ludGVyIGlzIGNhbGN1bGF0ZWQgYnkgb3RoZXIgbWV0aG9kcyB0aGFuIHRoZSB1c3VhbCBjb250YWluZXJfb2YKLW1hY3JvIG9yIHRoZSBwb2ludGVyIGlzIHN0b3JlZCBpbiBhIGxvY2F0aW9uIG5vdCBzY2FubmVkIGJ5IGttZW1sZWFrLgotCi1QYWdlIGFsbG9jYXRpb25zIGFuZCBpb3JlbWFwIGFyZSBub3QgdHJhY2tlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va29fS1IvbWVtb3J5LWJhcnJpZXJzLnR4dCBiL0RvY3VtZW50YXRpb24va29fS1IvbWVtb3J5LWJhcnJpZXJzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGQzZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9rb19LUi9tZW1vcnktYmFycmllcnMudHh0CkBAIC0wLDAgKzEsMzEzNSBAQAorTk9URToKK1RoaXMgaXMgYSB2ZXJzaW9uIG9mIERvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dCB0cmFuc2xhdGVkIGludG8gS29yZWFuLgorVGhpcyBkb2N1bWVudCBpcyBtYWludGFpbmVkIGJ5IFNlb25nSmFlIFBhcmsgPHNqMzgucGFya0BnbWFpbC5jb20+LgorSWYgeW91IGZpbmQgYW55IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGRvY3VtZW50IGFuZCB0aGUgb3JpZ2luYWwgZmlsZSBvcgorYSBwcm9ibGVtIHdpdGggdGhlIHRyYW5zbGF0aW9uLCBwbGVhc2UgY29udGFjdCB0aGUgbWFpbnRhaW5lciBvZiB0aGlzIGZpbGUuCisKK1BsZWFzZSBhbHNvIG5vdGUgdGhhdCB0aGUgcHVycG9zZSBvZiB0aGlzIGZpbGUgaXMgdG8gYmUgZWFzaWVyIHRvCityZWFkIGZvciBub24gRW5nbGlzaCAocmVhZDogS29yZWFuKSBzcGVha2VycyBhbmQgaXMgbm90IGludGVuZGVkIGFzCithIGZvcmsuICBTbyBpZiB5b3UgaGF2ZSBhbnkgY29tbWVudHMgb3IgdXBkYXRlcyBmb3IgdGhpcyBmaWxlIHBsZWFzZQordXBkYXRlIHRoZSBvcmlnaW5hbCBFbmdsaXNoIGZpbGUgZmlyc3QuICBUaGUgRW5nbGlzaCB2ZXJzaW9uIGlzCitkZWZpbml0aXZlLCBhbmQgcmVhZGVycyBzaG91bGQgbG9vayB0aGVyZSBpZiB0aGV5IGhhdmUgYW55IGRvdWJ0LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQor7J20IOusuOyEnOuKlAorRG9jdW1lbnRhdGlvbi9tZW1vcnktYmFycmllcnMudHh0CivsnZgg7ZWc6riAIOuyiOyXreyeheuLiOuLpC4KKwor7Jet7J6Q77yaIOuwleyEseyerCA8c2ozOC5wYXJrQGdtYWlsLmNvbT4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworCQkJID09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJCSDrpqzriIXsiqQg7Luk64SQIOuplOuqqOumrCDrsLDrpqzslrQKKwkJCSA9PT09PT09PT09PT09PT09PT09PT09PT09CisKK+yggOyekDogRGF2aWQgSG93ZWxscyA8ZGhvd2VsbHNAcmVkaGF0LmNvbT4KKyAgICAgIFBhdWwgRS4gTWNLZW5uZXkgPHBhdWxtY2tAbGludXgudm5ldC5pYm0uY29tPgorICAgICAgV2lsbCBEZWFjb24gPHdpbGwuZGVhY29uQGFybS5jb20+CisgICAgICBQZXRlciBaaWpsc3RyYSA8cGV0ZXJ6QGluZnJhZGVhZC5vcmc+CisKKz09PT09PT09CivrqbTssYXsobDtla0KKz09PT09PT09CisKK+ydtCDrrLjshJzripQg66qF7IS47ISc6rCAIOyVhOuLmeuLiOuLpDsg7J20IOusuOyEnOuKlCDsmYTrsr3tlZjsp4Ag7JWK7J2A642wLCDqsITqsrDshLHsnYQg7JyE7ZW0IOydmOuPhOuQnAor67aA67aE64+EIOyeiOqzoCwg7J2Y64+E7ZWY7KeEIOyViuyVmOyngOunjCDsgqzrnozsl5Ag7J2Y7ZW0IOyTsOyYgOuLpOuztOuLiCDrtojsmYTsoITtlZwg67aA67aE64+EIOyeiOyKteuLiOuLpC4KK+ydtCDrrLjshJzripQg66as64iF7Iqk7JeQ7IScIOygnOqzte2VmOuKlCDri6TslpHtlZwg66mU66qo66asIOuwsOumrOyWtOuTpOydhCDsgqzsmqntlZjquLAg7JyE7ZWcCivslYjrgrTshJzsnoXri4jri6Trp4wsIOutlOqwgCDsnbTsg4HtlZjri6Qg7Iu27Jy866m0ICjqt7jrn7Dqsowg66eO7J2EIOqygeuLiOuLpCkg7KeI66y47J2EIOu2gO2DgeuTnOumveuLiOuLpC4KKwor64uk7IucIOunkO2VmOyngOunjCwg7J20IOusuOyEnOuKlCDrpqzriIXsiqTqsIAg7ZWY65Oc7Juo7Ja07JeQIOq4sOuMgO2VmOuKlCDsgqztla3sl5Ag64yA7ZWcIOuqheyEuOyEnOqwgAor7JWE64uZ64uI64ukLgorCivsnbQg66y47ISc7J2YIOuqqeyggeydgCDrkZDqsIDsp4DsnoXri4jri6Q6CisKKyAoMSkg7Ja065akIO2KueyglSDrsLDrpqzslrTsl5Ag64yA7ZW0IOq4sOuMgO2VoCDsiJgg7J6I64qUIOy1nOyGjO2VnOydmCDquLDriqXsnYQg66qF7IS47ZWY6riwIOychO2VtOyEnCwKKyAgICAg6re466as6rOgCisKKyAoMikg7IKs7JqpIOqwgOuKpe2VnCDrsLDrpqzslrTrk6Tsl5Ag64yA7ZW0IOyWtOuWu+qyjCDsgqzsmqntlbTslbwg7ZWY64qU7KeA7JeQIOuMgO2VnCDslYjrgrTrpbwg7KCc6rO17ZWY6riwCisgICAgIOychO2VtOyEnC4KKwor7Ja065akIOyVhO2CpO2FjeyzkOuKlCDtirnsoJXtlZwg67Cw66as7Ja065Ok7JeQIOuMgO2VtOyEnOuKlCDsl6zquLDshJwg7J207JW86riw7ZWY64qUIOy1nOyGjO2VnOydmAor7JqU6rWs7IKs7ZWt65Ok67O064ukIOunjuydgCDquLDriqXsnYQg7KCc6rO17ZWgIOyImOuPhCDsnojsirXri4jri6Trp4wsIOyXrOq4sOyEnCDsnbTslbzquLDtlZjripQKK+yalOq1rOyCrO2VreuTpOydhCDstqnsobHtlZjsp4Ag7JWK64qUIOyVhO2CpO2FjeyzkOqwgCDsnojri6TrqbQg6re4IOyVhO2CpO2FjeyzkOqwgCDsnpjrqrvrkJwg6rKD7J20656AIOygkOydhAor7JWM7JWE65GQ7Iuc6riwIOuwlOuejeuLiOuLpC4KKwor65iQ7ZWcLCDtirnsoJUg7JWE7YKk7YWN7LOQ7JeQ7IScIOydvOu2gCDrsLDrpqzslrTripQg7ZW064u5IOyVhO2CpO2FjeyzkOydmCDtirnsiJjtlZwg64+Z7J6RIOuwqeyLneycvOuhnCDsnbjtlbQKK+2VtOuLuSDrsLDrpqzslrTsnZgg66qF7Iuc7KCBIOyCrOyaqeydtCDrtojtlYTsmpTtlbTshJwgbm8tb3Ag7J20IOuQoOyImOuPhCDsnojsnYzsnYQg7JWM7JWE65GQ7Iuc6riwCivrsJTrno3ri4jri6QuCisKK+yXreyekDog67O4IOuyiOyXrSDsl63si5wg7JmE67K97ZWY7KeAIOyViuydgOuNsCwg7J20IOyXreyLnCDrtoDrtoTsoIHsnLzroZzripQg7J2Y64+E65CcIOqyg+ydtOq4sOuPhAor7ZWp64uI64ukLiAg7Jes7YOAIOq4sOyIoCDrrLjshJzrk6TsnbQg6re466CH65OvIOyZhOuyve2VnCDsnbTtlbTrpbwg7JyE7ZW07ISc64qUIOuyiOyXreusuOqzvCDsm5DrrLjsnYQg7ZWo6ruYCivsnb3snLzsi5zrkJgg67KI7Jet66y47J2EIO2VmOuCmOydmCDqsIDsnbTrk5zroZwg7Zmc7Jqp7ZWY7Iuc6ri4IOy2lOyynOuTnOumrOupsCwg67Cc6rKs65CY64qUIOyYpOyXrSDrk7Hsl5AKK+uMgO2VtOyEnOuKlCDslrjsoJzrk6Ag7J2Y6rKs7J2EIOu2gO2DgeuTnOumveuLiOuLpC4gIOqzvO2VnCDrsojsl63snLzroZwg7J247ZWcIOyYpO2VtOulvCDstZzshoztmZTtlZjquLAg7JyE7ZW0CivslaDrp6TtlZwg67aA67aE7J20IOyeiOydhCDqsr3smrDsl5DripQg7Ja07IOJ7ZWo7J20IOyeiOuNlOudvOuPhCDsm5DrnpjsnZgg7Jqp7Ja066W8IOywqOyaqe2VqeuLiOuLpC4KKworCis9PT09PQor66qp7LCoOgorPT09PT0KKworICgqKSDstpTsg4Eg66mU66qo66asIOyVoeyEuOyKpCDrqqjrjbguCisKKyAgICAgLSDrlJTrsJTsnbTsiqQg7Jik7Y2866CI7J207IWYLgorICAgICAtIOuztOyepeyCrO2VrS4KKworICgqKSDrqZTrqqjrpqwg67Cw66as7Ja0656AIOustOyXh+yduOqwgD8KKworICAgICAtIOuplOuqqOumrCDrsLDrpqzslrTsnZgg7KKF66WYLgorICAgICAtIOuplOuqqOumrCDrsLDrpqzslrTsl5Ag64yA7ZW0IOqwgOygle2VtOyEoCDslYjrkKAg6rKDLgorICAgICAtIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja0LgorICAgICAtIOy7qO2KuOuhpCDsnZjsobTshLEuCisgICAgIC0gU01QIOuwsOumrOyWtCDsp53rp57stpTquLAuCisgICAgIC0g66mU66qo66asIOuwsOumrOyWtCDsi5ztgIDsiqTsnZgg7JiILgorICAgICAtIOydveq4sCDrqZTrqqjrpqwg67Cw66as7Ja0IHZzIOuhnOuTnCDsmIjsuKEuCisgICAgIC0g7J207ZaJ7ISxCisKKyAoKikg66qF7Iuc7KCBIOy7pOuEkCDrsLDrpqzslrQuCisKKyAgICAgLSDsu7TtjIzsnbzrn6wg67Cw66as7Ja0LgorICAgICAtIENQVSDrqZTrqqjrpqwg67Cw66as7Ja0LgorICAgICAtIE1NSU8g7JOw6riwIOuwsOumrOyWtC4KKworICgqKSDslZTrrLXsoIEg7Luk64SQIOuplOuqqOumrCDrsLDrpqzslrQuCisKKyAgICAgLSDrnb0gQWNxdWlzaXRpb24g7ZWo7IiYLgorICAgICAtIOyduO2EsOufve2KuCDruYTtmZzshLHtmZQg7ZWo7IiYLgorICAgICAtIOyKrOumveqzvCDsm6jsnbTtgazsl4Ug7ZWo7IiYLgorICAgICAtIOq3uOyZuOydmCDtlajsiJjrk6QuCisKKyAoKikgQ1BVIOqwhCBBQ1FVSVJJTkcg67Cw66as7Ja07J2YIO2aqOqzvC4KKworICAgICAtIEFjcXVpcmUgdnMg66mU66qo66asIOyVoeyEuOyKpC4KKyAgICAgLSBBY3F1aXJlIHZzIEkvTyDslaHshLjsiqQuCisKKyAoKikg66mU66qo66asIOuwsOumrOyWtOqwgCDtlYTsmpTtlZwg6rOzCisKKyAgICAgLSDtlITroZzshLjshJzqsIQg7IOB7Zi4IOyekeyaqS4KKyAgICAgLSDslrTthqDrr7kg7Jik7Y2866CI7J207IWYLgorICAgICAtIOuUlOuwlOydtOyKpCDslaHshLjsiqQuCisgICAgIC0g7J247YSw65+97Yq4LgorCisgKCopIOy7pOuEkCBJL08g67Cw66as7Ja07J2YIO2aqOqzvC4KKworICgqKSDqsIDsoJXrkJjripQg6rCA7J6lIOyZhO2ZlOuQnCDsi6Ttlokg7Iic7IScIOuqqOuNuC4KKworICgqKSBDUFUg7LqQ7Iuc7J2YIOyYge2WpS4KKworICAgICAtIOy6kOyLnCDsnbzqtIDshLEuCisgICAgIC0g7LqQ7IucIOydvOq0gOyEsSB2cyBETUEuCisgICAgIC0g7LqQ7IucIOydvOq0gOyEsSB2cyBNTUlPLgorCisgKCopIENQVSDrk6TsnbQg7KCA7KeA66W064qUIOydvOuTpC4KKworICAgICAtIOq3uOumrOqzoCwgQWxwaGEg6rCAIOyeiOuLpC4KKyAgICAgLSDqsIDsg4Eg66i47IugIOqyjOyKpO2KuC4KKworICgqKSDsgqzsmqkg7JiILgorCisgICAgIC0g7Iic7ZmY7IudIOuyhO2NvC4KKworICgqKSDssLjqs6Ag66y47ZeMLgorCisKKz09PT09PT09PT09PT09PT09PT09PT09CivstpTsg4Eg66mU66qo66asIOyVoeyEuOyKpCDrqqjrjbgKKz09PT09PT09PT09PT09PT09PT09PT09CisKK+uLpOydjOqzvCDqsJnsnbQg7LaU7IOB7ZmU65CcIOyLnOyKpO2FnCDrqqjrjbjsnYQg7IOd6rCB7ZW0IOu0heyLnOuLpDoKKworCQkgICAgICAgICAgICA6ICAgICAgICAgICAgICAgIDoKKwkJICAgICAgICAgICAgOiAgICAgICAgICAgICAgICA6CisJCSAgICAgICAgICAgIDogICAgICAgICAgICAgICAgOgorCQkrLS0tLS0tLSsgICA6ICAgKy0tLS0tLS0tKyAgIDogICArLS0tLS0tLSsKKwkJfCAgICAgICB8ICAgOiAgIHwgICAgICAgIHwgICA6ICAgfCAgICAgICB8CisJCXwgICAgICAgfCAgIDogICB8ICAgICAgICB8ICAgOiAgIHwgICAgICAgfAorCQl8IENQVSAxIHw8LS0tLS0+fCBNZW1vcnkgfDwtLS0tLT58IENQVSAyIHwKKwkJfCAgICAgICB8ICAgOiAgIHwgICAgICAgIHwgICA6ICAgfCAgICAgICB8CisJCXwgICAgICAgfCAgIDogICB8ICAgICAgICB8ICAgOiAgIHwgICAgICAgfAorCQkrLS0tLS0tLSsgICA6ICAgKy0tLS0tLS0tKyAgIDogICArLS0tLS0tLSsKKwkJICAgIF4gICAgICAgOiAgICAgICBeICAgICAgICA6ICAgICAgIF4KKwkJICAgIHwgICAgICAgOiAgICAgICB8ICAgICAgICA6ICAgICAgIHwKKwkJICAgIHwgICAgICAgOiAgICAgICB8ICAgICAgICA6ICAgICAgIHwKKwkJICAgIHwgICAgICAgOiAgICAgICB2ICAgICAgICA6ICAgICAgIHwKKwkJICAgIHwgICAgICAgOiAgICstLS0tLS0tLSsgICA6ICAgICAgIHwKKwkJICAgIHwgICAgICAgOiAgIHwgICAgICAgIHwgICA6ICAgICAgIHwKKwkJICAgIHwgICAgICAgOiAgIHwgICAgICAgIHwgICA6ICAgICAgIHwKKwkJICAgICstLS0tLS0tLS0tPnwgRGV2aWNlIHw8LS0tLS0tLS0tLSsKKwkJICAgICAgICAgICAgOiAgIHwgICAgICAgIHwgICA6CisJCSAgICAgICAgICAgIDogICB8ICAgICAgICB8ICAgOgorCQkgICAgICAgICAgICA6ICAgKy0tLS0tLS0tKyAgIDoKKwkJICAgICAgICAgICAgOiAgICAgICAgICAgICAgICA6CisKK+2UhOuhnOq3uOueqOydgCDsl6zrn6wg66mU66qo66asIOyVoeyEuOyKpCDsmKTtjbzroIjsnbTshZjsnYQg67Cc7IOd7Iuc7YKk6rOgLCDqsIHqsIHsnZggQ1BVIOuKlCDqt7jrn7AKK+2UhOuhnOq3uOueqOuTpOydhCDsi6Ttlontlanri4jri6QuICDstpTsg4HtmZTrkJwgQ1BVIOuqqOuNuOyXkOyEnCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWY65Ok7J2YIOyInOyEnOuKlAor66ek7JqwIOyZhO2ZlOuQmOyWtCDsnojqs6AsIENQVSDripQg7ZSE66Gc6re4656o7J20IOyduOqzvOq0gOqzhOulvCDslrTquLDsp4Ag7JWK64qUIOyDge2DnOuhnCDqtIDrpqzrkJzri6Tqs6AKK+uztOydvCDsiJjrp4wg7J6I64uk66m0IOuplOuqqOumrCDsmKTtjbzroIjsnbTshZjsnYQg7J6Q7Iug7J20IOybkO2VmOuKlCDslrTrlqQg7Iic7ISc64yA66Gc65OgIOyerOuwsOy5mO2VtAor64+Z7J6R7Iuc7YKsIOyImCDsnojsirXri4jri6QuICDruYTsirftlZjqsowsIOy7tO2MjOydvOufrCDrmJDtlZwg7ZSE66Gc6re4656o7J2YIOygleyDgeyggSDrj5nsnpHsnYQg7ZW07LmY7KeACivslYrripQg7ZWc64+EIOuCtOyXkOyEnOuKlCDslrTrlqQg7Iic7ISc66Gc65OgIOyekOyLoOydtCDsm5DtlZjripQg64yA66GcIOyduOyKpO2KuOufreyFmOydhCDsnqzrsLDsuZgg7ZWgIOyImAor7J6I7Iq164uI64ukLgorCivrlLDrnbzshJwg7JyE7J2YIOuLpOydtOyWtOq3uOueqOyXkOyEnCDtlZwgQ1BV6rCAIOuPmeyekeyLnO2CpOuKlCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWY7J20IOunjOuTpOyWtOuCtOuKlAor67OA7ZmU64qUIO2VtOuLuSDsmKTtjbzroIjsnbTshZjsnbQgQ1BVIOyZgCDsi5zsiqTthZzsnZgg64uk66W4IOu2gOu2hOuTpCDsgqzsnbTsnZgg7J247YSw7Y6Y7J207IqkKOygkOyEoCnrpbwKK+yngOuCmOqwgOuptOyEnCDsi5zsiqTthZzsnZgg64KY66i47KeAIOu2gOu2hOuTpOyXkCDsnbjsp4DrkKnri4jri6QuCisKKwor7JiI66W8IOuTpOyWtCwg64uk7J2M7J2YIOydvOugqOydmCDsnbTrsqTtirjrk6TsnYQg7IOd6rCB7ZW0IOu0heyLnOuLpDoKKworCUNQVSAxCQlDUFUgMgorCT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT0KKwl7IEEgPT0gMTsgQiA9PSAyIH0KKwlBID0gMzsJCXggPSBCOworCUIgPSA0OwkJeSA9IEE7CisKK+uLpOydtOyWtOq3uOueqOydmCDqsIDsmrTrjbDsl5Ag7JyE7LmY7ZWcIOuplOuqqOumrCDsi5zsiqTthZzsl5Ag67O07Jes7KeA6rKMIOuQmOuKlCDslaHshLjsiqTrk6TsnYAg64uk7J2M7J2YIOy0nQorMjTqsJzsnZgg7KGw7ZWp7Jy866GcIOyerOq1rOyEseuQoCDsiJgg7J6I7Iq164uI64ukOgorCisJU1RPUkUgQT0zLAlTVE9SRSBCPTQsCXk9TE9BRCBBLT4zLAl4PUxPQUQgQi0+NAorCVNUT1JFIEE9MywJU1RPUkUgQj00LAl4PUxPQUQgQi0+NCwJeT1MT0FEIEEtPjMKKwlTVE9SRSBBPTMsCXk9TE9BRCBBLT4zLAlTVE9SRSBCPTQsCXg9TE9BRCBCLT40CisJU1RPUkUgQT0zLAl5PUxPQUQgQS0+MywJeD1MT0FEIEItPjIsCVNUT1JFIEI9NAorCVNUT1JFIEE9MywJeD1MT0FEIEItPjIsCVNUT1JFIEI9NCwJeT1MT0FEIEEtPjMKKwlTVE9SRSBBPTMsCXg9TE9BRCBCLT4yLAl5PUxPQUQgQS0+MywJU1RPUkUgQj00CisJU1RPUkUgQj00LAlTVE9SRSBBPTMsCXk9TE9BRCBBLT4zLAl4PUxPQUQgQi0+NAorCVNUT1JFIEI9NCwgLi4uCisJLi4uCisKK+uUsOudvOyEnCDri6TsnYzsnZgg64Sk6rCA7KeAIOyhsO2VqeydmCDqsJLrk6TsnbQg64KY7JisIOyImCDsnojsirXri4jri6Q6CisKKwl4ID09IDIsIHkgPT0gMQorCXggPT0gMiwgeSA9PSAzCisJeCA9PSA0LCB5ID09IDEKKwl4ID09IDQsIHkgPT0gMworCisKK+2VnOuwnCDrjZQg64KY7JWE6rCA7IScLCDtlZwgQ1BVIOqwgCDrqZTrqqjrpqwg7Iuc7Iqk7YWc7JeQIOuwmOyYge2VnCDsiqTthqDslrQg7Jik7Y2866CI7J207IWY65Ok7J2YIOqysOqzvOuKlAor64uk66W4IENQVSDsl5DshJzsnZgg66Gc65OcIOyYpO2NvOugiOydtOyFmOydhCDthrXtlbQg7J247KeA65CY64qU642wLCDsnbQg65WMIOyKpO2GoOyWtOqwgCDrsJjsmIHrkJwg7Iic7ISc7JmACivri6Trpbgg7Iic7ISc66GcIOyduOyngOuQoCDsiJjrj4Qg7J6I7Iq164uI64ukLgorCisKK+yYiOuhnCwg7JWE656Y7J2YIOydvOugqOydmCDsnbTrsqTtirjrk6TsnYQg7IOd6rCB7ZW0IOu0heyLnOuLpDoKKworCUNQVSAxCQlDUFUgMgorCT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT0KKwl7IEEgPT0gMSwgQiA9PSAyLCBDID09IDMsIFAgPT0gJkEsIFEgPT0gJkMgfQorCUIgPSA0OwkJUSA9IFA7CisJUCA9ICZCCQlEID0gKlE7CisKK0Qg66GcIOydve2YgOyngOuKlCDqsJLsnYAgQ1BVIDIg7JeQ7IScIFAg66Gc67aA7YSwIOydve2YgOynhCDso7zshozqsJLsl5Ag7J2Y7KG07KCB7J206riwIOuVjOusuOyXkCDsl6zquLDsl5QKK+u2hOuqhe2VnCDrjbDsnbTthLAg7J2Y7KG07ISx7J20IOyeiOyKteuLiOuLpC4gIO2VmOyngOunjCDsnbQg7J2067Kk7Yq465Ok7J2YIOyLpO2WiSDqsrDqs7zroZzripQg7JWE656Y7J2YCivqsrDqs7zrk6TsnbQg66qo65GQIOuCmO2DgOuCoCDsiJgg7J6I7Iq164uI64ukOgorCisJKFEgPT0gJkEpIGFuZCAoRCA9PSAxKQorCShRID09ICZCKSBhbmQgKEQgPT0gMikKKwkoUSA9PSAmQikgYW5kIChEID09IDQpCisKK0NQVSAyIOuKlCAqUSDsnZgg66Gc65Oc66W8IOyalOyyre2VmOq4sCDsoITsl5AgUCDrpbwgUSDsl5Ag64Sj6riwIOuVjOusuOyXkCBEIOyXkCBDIOulvCDsp5HslrTrhKPripQKK+ydvOydgCDsl4bsnYzsnYQg7JWM7JWE65GQ7IS47JqULgorCisKK+uUlOuwlOydtOyKpCDsmKTtjbzroIjsnbTshZgKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKwor7J2867aAIOuUlOuwlOydtOyKpOuKlCDsnpDsi6DsnZgg7Luo7Yq466GkIOyduO2EsO2OmOydtOyKpOulvCDrqZTrqqjrpqzsnZgg7Yq57KCVIOyYgeyXreycvOuhnCDrp6TtlZHtlbTshJwKK+ygnOqzte2VmOuKlOuNsChNZW1vcnkgbWFwcGVkIEkvTyksIO2VtOuLuSDsu6jtirjroaQg66CI7KeA7Iqk7YSw7JeQIOygkeq3vO2VmOuKlCDsiJzshJzripQg66ek7JqwCivspJHsmpTtlanri4jri6QuICDsmIjrpbwg65Ok7Ja0LCDslrTrk5zroIjsiqQg7Y+s7Yq4IOugiOyngOyKpO2EsCAoQSkg7JmAIOuNsOydtO2EsCDtj6ztirgg66CI7KeA7Iqk7YSwIChEKQor66W8IO2Gte2VtCDsoJHqt7zrkJjripQg64K067aAIOugiOyngOyKpO2EsCDsp5HtlansnYQg6rCW64qUIOydtOuNlOuEtyDsubTrk5zrpbwg7IOd6rCB7ZW0IOu0heyLnOuLpC4gIOuCtOu2gOydmAorNeuyiCDroIjsp4DsiqTthLDrpbwg7J296riwIOychO2VtCDri6TsnYzsnZgg7L2U65Oc6rCAIOyCrOyaqeuQoCDsiJgg7J6I7Iq164uI64ukOgorCisJKkEgPSA1OworCXggPSAqRDsKKwor7ZWY7KeA66eMLCDsnbTqsbQg64uk7J2M7J2YIOuRkCDsobDtlakg7KSRIO2VmOuCmOuhnCDrp4zrk6TslrTsp4gg7IiYIOyeiOyKteuLiOuLpDoKKworCVNUT1JFICpBID0gNSwgeCA9IExPQUQgKkQKKwl4ID0gTE9BRCAqRCwgU1RPUkUgKkEgPSA1CisKK+uRkOuyiOynuCDsobDtlansnYAg642w7J207YSw66W8IOydveyWtOyYqCBf7ZuE7JeQXyDso7zshozrpbwg7ISk7KCV7ZWY66+A66GcLCDsmKTrj5nsnpHsnYQg7J287Jy87YKsIOqygeuLiOuLpC4KKworCivrs7TsnqXsgqztla0KKy0tLS0tLS0tCisKK0NQVSDsl5Dqsowg6riw64yA7ZWgIOyImCDsnojripQg7LWc7IaM7ZWc7J2YIOuztOyepeyCrO2VrSDrqofqsIDsp4DqsIAg7J6I7Iq164uI64ukOgorCisgKCopIOyWtOuWpCBDUFUg65OgLCDsnZjsobTshLHsnbQg7KG07J6s7ZWY64qUIOuplOuqqOumrCDslaHshLjsiqTrk6TsnYAg7ZW064u5IENQVSDsnpDsi6Dsl5DqsowKKyAgICAg7J6I7Ja07ISc64qUIOyInOyEnOuMgOuhnCDrqZTrqqjrpqwg7Iuc7Iqk7YWc7JeQIOyImO2WiSDsmpTssq3rkKnri4jri6QuIOymiSwg64uk7J2M7JeQIOuMgO2VtOyEnDoKKworCVEgPSBSRUFEX09OQ0UoUCk7IHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOyBEID0gUkVBRF9PTkNFKCpRKTsKKworICAgICBDUFUg64qUIOuLpOydjOqzvCDqsJnsnYAg66mU66qo66asIOyYpO2NvOugiOydtOyFmCDsi5ztgIDsiqTrpbwg7IiY7ZaJIOyalOyyre2VqeuLiOuLpDoKKworCVEgPSBMT0FEIFAsIEQgPSBMT0FEICpRCisKKyAgICAg6re466as6rOgIOq3uCDsi5ztgIDsiqQg64K07JeQ7ISc7J2YIOyInOyEnOuKlCDtla3sg4Eg7KeA7Lyc7KeR64uI64ukLiAg64yA67aA67aE7J2YIOyLnOyKpO2FnOyXkOyEnAorICAgICBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKSDripQg7JWE66y07J2864+EIOyViO2VmOyngOunjCBERUMgQWxwaGEg7JeQ7ISc64qUCisgICAgIOuqheyLnOyggeycvOuhnCDsgqzsmqnrkJjslrTslbwg7ZWp64uI64ukLiAg67O07Ya17J2YIOqyveyasOyXkOuKlCBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQorICAgICDrpbwg7KeB7KCRIOyCrOyaqe2VmOuKlCDrjIDsi6AgcmN1X2RlcmVmZXJlbmNlKCkg6rCZ7J2AIOqyg+uTpOydhCDsgqzsmqntlbTslbwg7ZWo7J2ECisgICAgIOyVjOyVhOuRkOyEuOyalC4KKworICgqKSDtirnsoJUgQ1BVIOuCtOyXkOyEnCDqsrnsuZjripQg7JiB7Jet7J2YIOuplOuqqOumrOyXkCDtlontlbTsp4DripQg66Gc65Oc7JmAIOyKpO2GoOyWtCDrk6TsnYAg7ZW064u5CisgICAgIENQVSDslYjsl5DshJzripQg7Iic7ISc6rCAIOuwlOuAjOyngCDslYrsnYAg6rKD7Jy866GcIOuztOyXrOynkeuLiOuLpC4gIOymiSwg64uk7J2M7JeQIOuMgO2VtOyEnDoKKworCWEgPSBSRUFEX09OQ0UoKlgpOyBXUklURV9PTkNFKCpYLCBiKTsKKworICAgICBDUFUg64qUIOuLpOydjOydmCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWYIOyLnO2AgOyKpOunjOydhCDrqZTrqqjrpqzsl5Ag7JqU7LKt7ZWgIOqygeuLiOuLpDoKKworCWEgPSBMT0FEICpYLCBTVE9SRSAqWCA9IGIKKworICAgICDqt7jrpqzqs6Ag64uk7J2M7JeQIOuMgO2VtOyEnOuKlDoKKworCVdSSVRFX09OQ0UoKlgsIGMpOyBkID0gUkVBRF9PTkNFKCpYKTsKKworICAgICBDUFUg64qUIOuLpOydjOydmCDsiJjtlokg7JqU7LKt66eM7J2EIOunjOuTpOyWtCDrg4Xri4jri6Q6CisKKwlTVE9SRSAqWCA9IGMsIGQgPSBMT0FEICpYCisKKyAgICAgKOuhnOuTnCDsmKTtjbzroIjsnbTshZjqs7wg7Iqk7Yag7Ja0IOyYpO2NvOugiOydtOyFmOydtCDqsrnsuZjripQg66mU66qo66asIOyYgeyXreyXkCDrjIDtlbQKKyAgICAg7IiY7ZaJ65Cc64uk66m0IO2VtOuLuSDsmKTtjbzroIjsnbTshZjrk6TsnYAg6rK57Lmc64uk6rOgIO2RnO2YhOuQqeuLiOuLpCkuCisKK+q3uOumrOqzoCBf67CY65Oc7IucXyDrmJDripQgX+ygiOuMgOuhnF8g6rCA7KCV7ZWY6rGw64KYIOqwgOygle2VmOyngCDrp5DslYTslbwg7ZWY64qUIOqyg+uTpOydtCDsnojsirXri4jri6Q6CisKKyAoKikg7Lu07YyM7J2865+s6rCAIFJFQURfT05DRSgpIOuCmCBXUklURV9PTkNFKCkg66GcIOuztO2YuOuQmOyngCDslYrsnYAg66mU66qo66asIOyVoeyEuOyKpOulvAorICAgICDri7nsi6DsnbQg7JuQ7ZWY64qUIOuMgOuhnCDtlaAg6rKD7J20652864qUIOqwgOygleydgCBf7KCI64yA66GcXyDtlbTshKAg7JWI65Cp64uI64ukLiAg6re46rKD65Ok7J20CisgICAgIOyXhuuLpOuptCwg7Lu07YyM7J2865+s64qUIOy7tO2MjOydvOufrCDrsLDrpqzslrQg7IS57IWY7JeQ7IScIOuLpOujqOqyjCDrkKAsIOuqqOuToCAi7LC97J2Y7KCB7J24IgorICAgICDrs4Dqsr3rk6TsnYQg66eM65Ok7Ja064K8IOq2jO2VnOydhCDqsJbqsowg65Cp64uI64ukLgorCisgKCopIOqwnOuzhOyggeyduCDroZzrk5zsmYAg7Iqk7Yag7Ja065Ok7J20IOyjvOyWtOynhCDsiJzshJzrjIDroZwg7JqU7LKt65CgIOqyg+ydtOudvOuKlCDqsIDsoJXsnYAgX+ygiOuMgOuhnF8KKyAgICAg7ZWY7KeAIOunkOyVhOyVvCDtlanri4jri6QuICDsnbQg66eQ7J2AIOqzpzoKKworCVggPSAqQTsgWSA9ICpCOyAqRCA9IFo7CisKKyAgICAg64qUIOuLpOydjOydmCDqsoPrk6Qg7KSRIOyWtOuKkCDqsoPsnLzroZzrk6Ag66eM65Ok7Ja07KeIIOyImCDsnojri6TripQg7J2Y66+47J6F64uI64ukOgorCisJWCA9IExPQUQgKkEsICBZID0gTE9BRCAqQiwgIFNUT1JFICpEID0gWgorCVggPSBMT0FEICpBLCAgU1RPUkUgKkQgPSBaLCBZID0gTE9BRCAqQgorCVkgPSBMT0FEICpCLCAgWCA9IExPQUQgKkEsICBTVE9SRSAqRCA9IFoKKwlZID0gTE9BRCAqQiwgIFNUT1JFICpEID0gWiwgWCA9IExPQUQgKkEKKwlTVE9SRSAqRCA9IFosIFggPSBMT0FEICpBLCAgWSA9IExPQUQgKkIKKwlTVE9SRSAqRCA9IFosIFkgPSBMT0FEICpCLCAgWCA9IExPQUQgKkEKKworICgqKSDqsrnsuZjripQg66mU66qo66asIOyVoeyEuOyKpOuTpOydgCDtlanss5Dsp4DqsbDrgpgg67KE66Ck7KeIIOyImCDsnojsnYzsnYQgX+uwmOuTnOyLnF8g6rCA7KCV7ZW07JW8CisgICAgIO2VqeuLiOuLpC4gIOuLpOydjOydmCDsvZTrk5zripQ6CisKKwlYID0gKkE7IFkgPSAqKEEgKyA0KTsKKworICAgICDri6TsnYzsnZgg6rKD65OkIOykkSDrrZDrk6Ag65CgIOyImCDsnojsirXri4jri6Q6CisKKwlYID0gTE9BRCAqQTsgWSA9IExPQUQgKihBICsgNCk7CisJWSA9IExPQUQgKihBICsgNCk7IFggPSBMT0FEICpBOworCXtYLCBZfSA9IExPQUQgeypBLCAqKEEgKyA0KSB9OworCisgICAgIOq3uOumrOqzoDoKKworCSpBID0gWDsgKihBICsgNCkgPSBZOworCisgICAgIOuKlCDri6TsnYwg7KSRIOutkOuToCDrkKAg7IiYIOyeiOyKteuLiOuLpDoKKworCVNUT1JFICpBID0gWDsgU1RPUkUgKihBICsgNCkgPSBZOworCVNUT1JFICooQSArIDQpID0gWTsgU1RPUkUgKkEgPSBYOworCVNUT1JFIHsqQSwgKihBICsgNCkgfSA9IHtYLCBZfTsKKwor6re466as6rOgIOuztOyepeyCrO2VreyXkCDrsJjrjIDrkJjripQg6rKD65OkKGFudGktZ3VhcmFudGVlcynsnbQg7J6I7Iq164uI64ukOgorCisgKCopIOydtCDrs7TsnqXsgqztla3rk6TsnYAgYml0ZmllbGQg7JeQ64qUIOyggeyaqeuQmOyngCDslYrripTrjbAsIOy7tO2MjOydvOufrOuTpOydgCBiaXRmaWVsZCDrpbwKKyAgICAg7IiY7KCV7ZWY64qUIOy9lOuTnOulvCDsg53shLHtlaAg65WMIOybkOyekOyEsSDsl4bripQobm9uLWF0b21pYykg7J296rOgLeyImOygle2VmOqzoC3sk7DripQKKyAgICAg7J247Iqk7Yq465+t7IWY65Ok7J2YIOyhsO2VqeydhCDrp4zrk5zripQg6rK97Jqw6rCAIOunjuq4sCDrlYzrrLjsnoXri4jri6QuICDrs5HroKwg7JWM6rOg66as7KaY7J2YCisgICAgIOuPmeq4sO2ZlOyXkCBiaXRmaWVsZCDrpbwg7IKs7Jqp7ZWY66CkIO2VmOyngCDrp4jsi63si5zsmKQuCisKKyAoKikgYml0ZmllbGQg65Ok7J20IOyXrOufrCDrnb3snLzroZwg67O07Zi465CY64qUIOqyveyasOudvCDtlZjrjZTrnbzrj4QsIO2VmOuCmOydmCBiaXRmaWVsZCDsnZgKKyAgICAg66qo65OgIO2VhOuTnOuTpOydgCDtlZjrgpjsnZgg65297Jy866GcIOuztO2YuOuQmOyWtOyVvCDtlanri4jri6QuICDrp4zslb0g7ZWcIGJpdGZpZWxkIOydmCDrkZAKKyAgICAg7ZWE65Oc6rCAIOyEnOuhnCDri6Trpbgg65297Jy866GcIOuztO2YuOuQnOuLpOuptCwg7Lu07YyM7J2865+s7J2YIOybkOyekOyEsSDsl4bripQKKyAgICAg7J296rOgLeyImOygle2VmOqzoC3sk7DripQg7J247Iqk7Yq465+t7IWYIOyhsO2VqeydgCDtlZwg7ZWE65Oc7JeQ7J2YIOyXheuNsOydtO2KuOqwgCDqt7zsspjsnZgKKyAgICAg7ZWE65Oc7JeQ64+EIOyYge2WpeydhCDrgbzsuZjqsowg7ZWgIOyImCDsnojsirXri4jri6QuCisKKyAoKikg7J20IOuztOyepeyCrO2VreuTpOydgCDsoIHsoIjtlZjqsowg7KCV66Cs65CY6rOgIO2BrOq4sOqwgCDsnqHtnowg7Iqk7Lm86528IOuzgOyImOuTpOyXkCDrjIDtlbTshJzrp4wKKyAgICAg7KCB7Jqp65Cp64uI64ukLiAgIuyggeygiO2VmOqyjCDtgazquLDqsIAg7J6h7Z6MIiDsnbTrnbztlajsnYAg7ZiE7J6s66Gc7I2o64qUICJjaGFyIiwgInNob3J0IiwKKyAgICAgImludCIg6re466as6rOgICJsb25nIiDqs7wg6rCZ7J2AIO2BrOq4sOydmCDrs4DsiJjrk6TsnYQg7J2Y66+47ZWp64uI64ukLiAgIuyggeygiO2VmOqyjCDsoJXroKzrkJwiCisgICAgIOydgCDsnpDsl7DsiqTrn7Ag7KCV66Cs7J2EIOydmOuvuO2VmOuKlOuNsCwg65Sw65287IScICJjaGFyIiDsl5Ag64yA7ZW07ISc64qUIOyVhOustCDsoJzslb3snbQg7JeG6rOgLAorICAgICAic2hvcnQiIOyXkCDrjIDtlbTshJzripQgMuuwlOydtO2KuCDsoJXroKzsnYQsICJpbnQiIOyXkOuKlCA067CU7J207Yq4IOygleugrOydhCwg6re466as6rOgCisgICAgICJsb25nIiDsl5Ag64yA7ZW07ISc64qUIDMyLWJpdCDsi5zsiqTthZzsnbjsp4AgNjQtYml0IOyLnOyKpO2FnOyduOyngOyXkCDrlLDrnbwgNOuwlOydtO2KuCDrmJDripQKKyAgICAgOOuwlOydtO2KuCDsoJXroKzsnYQg7J2Y66+47ZWp64uI64ukLiAg7J20IOuztOyepeyCrO2VreuTpOydgCBDMTEg7ZGc7KSA7JeQ7IScIOyGjOqwnOuQmOyXiOycvOuvgOuhnCwKKyAgICAgQzExIOyghOydmCDsmKTrnpjrkJwg7Lu07YyM7J2865+sKOyYiOulvCDrk6TslrQsIGdjYyA0LjYpIOulvCDsgqzsmqntlaAg65WM7JeUIOyjvOydmO2VmOyLnOq4sAorICAgICDrsJTrno3ri4jri6QuICDtkZzspIDsl5Ag7J20IOuztOyepeyCrO2VreuTpOydgCAibWVtb3J5IGxvY2F0aW9uIiDsnYQg7KCV7J2Y7ZWY64qUIDMuMTQKKyAgICAg7IS57IWY7JeQIOuLpOydjOqzvCDqsJnsnbQg7ISk66qF65CY7Ja0IOyeiOyKteuLiOuLpDoKKyAgICAgKOyXreyekDog7J247Jqp66y47J2066+A66GcIOuyiOyXre2VmOyngCDslYrsirXri4jri6QpCisKKwltZW1vcnkgbG9jYXRpb24KKwkJZWl0aGVyIGFuIG9iamVjdCBvZiBzY2FsYXIgdHlwZSwgb3IgYSBtYXhpbWFsIHNlcXVlbmNlCisJCW9mIGFkamFjZW50IGJpdC1maWVsZHMgYWxsIGhhdmluZyBub256ZXJvIHdpZHRoCisKKwkJTk9URSAxOiBUd28gdGhyZWFkcyBvZiBleGVjdXRpb24gY2FuIHVwZGF0ZSBhbmQgYWNjZXNzCisJCXNlcGFyYXRlIG1lbW9yeSBsb2NhdGlvbnMgd2l0aG91dCBpbnRlcmZlcmluZyB3aXRoCisJCWVhY2ggb3RoZXIuCisKKwkJTk9URSAyOiBBIGJpdC1maWVsZCBhbmQgYW4gYWRqYWNlbnQgbm9uLWJpdC1maWVsZCBtZW1iZXIKKwkJYXJlIGluIHNlcGFyYXRlIG1lbW9yeSBsb2NhdGlvbnMuIFRoZSBzYW1lIGFwcGxpZXMKKwkJdG8gdHdvIGJpdC1maWVsZHMsIGlmIG9uZSBpcyBkZWNsYXJlZCBpbnNpZGUgYSBuZXN0ZWQKKwkJc3RydWN0dXJlIGRlY2xhcmF0aW9uIGFuZCB0aGUgb3RoZXIgaXMgbm90LCBvciBpZiB0aGUgdHdvCisJCWFyZSBzZXBhcmF0ZWQgYnkgYSB6ZXJvLWxlbmd0aCBiaXQtZmllbGQgZGVjbGFyYXRpb24sCisJCW9yIGlmIHRoZXkgYXJlIHNlcGFyYXRlZCBieSBhIG5vbi1iaXQtZmllbGQgbWVtYmVyCisJCWRlY2xhcmF0aW9uLiBJdCBpcyBub3Qgc2FmZSB0byBjb25jdXJyZW50bHkgdXBkYXRlIHR3bworCQliaXQtZmllbGRzIGluIHRoZSBzYW1lIHN0cnVjdHVyZSBpZiBhbGwgbWVtYmVycyBkZWNsYXJlZAorCQliZXR3ZWVuIHRoZW0gYXJlIGFsc28gYml0LWZpZWxkcywgbm8gbWF0dGVyIHdoYXQgdGhlCisJCXNpemVzIG9mIHRob3NlIGludGVydmVuaW5nIGJpdC1maWVsZHMgaGFwcGVuIHRvIGJlLgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT0KK+uplOuqqOumrCDrsLDrpqzslrTrnoAg66y07JeH7J246rCAPworPT09PT09PT09PT09PT09PT09PT09PT09PQorCivslZ7sl5DshJwg67Sk65Ov7J20LCDsg4HtmLjqsIQg7J2Y7KG07ISx7J20IOyXhuuKlCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWY65Ok7J2AIOyLpOygnOuhnOuKlCDrrLTsnpHsnITsoIEKK+yInOyEnOuhnCDsiJjtlonrkKAg7IiYIOyeiOycvOupsCwg7J2064qUIENQVSDsmYAgQ1BVIOqwhOydmCDsg4HtmLjsnpHsmqnsnbTrgpggSS9PIOyXkCDrrLjsoJzqsIAg65CgIOyImAor7J6I7Iq164uI64ukLiAg65Sw65287IScIOy7tO2MjOydvOufrOyZgCBDUFUg6rCAIOyInOyEnOulvCDrsJTqvrjripTrjbAg7KCc7JW97J2EIOqxuCDsiJgg7J6I64+E66GdIOqwnOyehe2VoAor7IiYIOyeiOuKlCDslrTrlqQg67Cp67KV7J20IO2VhOyalO2VqeuLiOuLpC4KKwor66mU66qo66asIOuwsOumrOyWtOuKlCDqt7jrn7Ag6rCc7J6FIOyImOuLqOyeheuLiOuLpC4gIOuplOuqqOumrCDrsLDrpqzslrTripQg67Cw66as7Ja066W8IOyCrOydtOyXkCDrkZQg7JWe6rO8CivrkqQg7JaR7Lih7J2YIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZjrk6Qg6rCE7JeQIOu2gOu2hOyggSDsiJzshJzqsIAg7KG07J6s7ZWY64+E66GdIO2VmOuKlCDtmqjqs7zrpbwg7KSN64uI64ukLgorCivsi5zsiqTthZzsnZggQ1BVIOuTpOqzvCDsl6zrn6wg65SU67CU7J207Iqk65Ok7J2AIOyEseuKpeydhCDsmKzrpqzquLAg7JyE7ZW0IOuqheugueyWtCDsnqzrsLDsuZgsIOyLpO2WiQor7Jyg7JiILCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWY65Ok7J2YIOyhsO2VqSwg7JiI7Lih7KCBIOuhnOuTnChzcGVjdWxhdGl2ZSBsb2FkKSwg67iM656c7LmYCivsmIjsuKEoc3BlY3VsYXRpdmUgYnJhbmNoIHByZWRpY3Rpb24pLCDri6TslpHtlZwg7KKF66WY7J2YIOy6kOyLsShjYWNoaW5nKSDrk7HsnZgg64uk7JaR7ZWcCivtirjrpq3snYQg7IKs7Jqp7ZWgIOyImCDsnojquLAg65WM66y47JeQIOydtOufsCDqsJXsoJzroKXsnYAg7KSR7JqU7ZWp64uI64ukLiAg66mU66qo66asIOuwsOumrOyWtOuTpOydgCDsnbTrn7AKK+2KuOumreuTpOydhCDrrLTtmqjroZwg7ZWY6rGw64KYIOyWteygnO2VmOuKlCDrqqnsoIHsnLzroZwg7IKs7Jqp65CY7Ja07KC47IScIOy9lOuTnOqwgCDsl6zrn6wgQ1BVIOyZgAor65SU67CU7J207Iqk65OkIOqwhOydmCDsg4HtmLjsnpHsmqnsnYQg7KCV7IOB7KCB7Jy866GcIOygnOyWtO2VoCDsiJgg7J6I6rKMIO2VtOykjeuLiOuLpC4KKworCivrqZTrqqjrpqwg67Cw66as7Ja07J2YIOyiheulmAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwor66mU66qo66asIOuwsOumrOyWtOuKlCDrhKTqsJzsnZgg6riw67O4IO2DgOyeheycvOuhnCDrtoTrpZjrkKnri4jri6Q6CisKKyAoMSkg7JOw6riwICjrmJDripQg7Iqk7Yag7Ja0KSDrqZTrqqjrpqwg67Cw66as7Ja0LgorCisgICAgIOyTsOq4sCDrqZTrqqjrpqwg67Cw66as7Ja064qUIOyLnOyKpO2FnOydmCDri6Trpbgg7Lu07Y+s64SM7Yq465Ok7JeQIO2VtOuLuSDrsLDrpqzslrTrs7Tri6Qg7JWe7IScCisgICAgIOuqheyLnOuQnCDrqqjrk6AgU1RPUkUg7Jik7Y2866CI7J207IWY65Ok7J20IO2VtOuLuSDrsLDrpqzslrQg65Kk7JeQIOuqheyLnOuQnCDrqqjrk6AgU1RPUkUKKyAgICAg7Jik7Y2866CI7J207IWY65Ok67O064ukIOuovOyggCDsiJjtlonrkJwg6rKD7Jy866GcIOuztOydvCDqsoPsnYQg67O07J6l7ZWp64uI64ukLgorCisgICAgIOyTsOq4sCDrsLDrpqzslrTripQg7Iqk7Yag7Ja0IOyYpO2NvOugiOydtOyFmOuTpOyXkCDrjIDtlZwg67aA67aE7KCBIOyInOyEnCDshLjsmrDquLDsnoXri4jri6Q7IOuhnOuTnAorICAgICDsmKTtjbzroIjsnbTshZjrk6Tsl5Ag64yA7ZW07ISc64qUIOyWtOuWpCDsmIHtlqXrj4Qg64G87LmY7KeAIOyViuyKteuLiOuLpC4KKworICAgICBDUFUg64qUIOyLnOqwhOydmCDtnZDrpoTsl5Ag65Sw6528IOuplOuqqOumrCDsi5zsiqTthZzsl5Ag7J2866Co7J2YIOyKpO2GoOyWtCDsmKTtjbzroIjsnbTshZjrk6TsnYQKKyAgICAg7ZWY64KY7JSpIOyalOyyre2VtCDsp5HslrTrhKPsirXri4jri6QuICDsk7DquLAg67Cw66as7Ja0IOyVnuydmCDrqqjrk6Ag7Iqk7Yag7Ja0IOyYpO2NvOugiOydtOyFmOuTpOydgAorICAgICDsk7DquLAg67Cw66as7Ja0IOuSpOydmCDrqqjrk6Ag7Iqk7Yag7Ja0IOyYpO2NvOugiOydtOyFmOuTpOuztOuLpCBf7JWe7IScXyDsiJjtlonrkKAg6rKB64uI64ukLgorCisgICAgIFshXSDsk7DquLAg67Cw66as7Ja065Ok7J2AIOydveq4sCDrmJDripQg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTsmYAg7ZWo6ruYIOynneydhCDrp57strAKKyAgICAg7IKs7Jqp65CY7Ja07JW866eMIO2VqOydhCDslYzslYTrkZDshLjsmpQ7ICJTTVAg67Cw66as7Ja0IOynneunnuy2lOq4sCIg7ISc67iM7IS57IWY7J2EIOywuOqzoO2VmOyEuOyalC4KKworCisgKDIpIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja0LgorCisgICAgIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja064qUIOydveq4sCDrsLDrpqzslrTsnZgg67O064ukIOyZhO2ZlOuQnCDtmJXtg5zsnoXri4jri6QuICDrkZDqsJzsnZgg66Gc65OcCisgICAgIOyYpO2NvOugiOydtOyFmOydtCDsnojqs6Ag65GQ67KI7Ke4IOqyg+ydtCDssqvrsojsp7gg6rKD7J2YIOqysOqzvOyXkCDsnZjsobTtlZjqs6Ag7J6I7J2EIOuVjCjsmIg6CisgICAgIOuRkOuyiOynuCDroZzrk5zqsIAg7LC47KGw7ZWgIOyjvOyGjOulvCDssqvrsojsp7gg66Gc65Oc6rCAIOydveuKlCDqsr3smrApLCDrkZDrsojsp7gg66Gc65Oc6rCAIOydveyWtOyYrAorICAgICDrjbDsnbTthLDripQg7LKr67KI7Ke4IOuhnOuTnOyXkCDsnZjtlbQg6re4IOyjvOyGjOqwgCDslrvslrTsp4DquLAg7KCE7JeQIOyXheuNsOydtO2KuCDrkJjslrQg7J6I7J2M7J2ECisgICAgIOuztOyepe2VmOq4sCDsnITtlbTshJwg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTqsIAg7ZWE7JqU7ZWgIOyImCDsnojsirXri4jri6QuCisKKyAgICAg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTripQg7IOB7Zi4IOydmOyhtOyggeyduCDroZzrk5wg7Jik7Y2866CI7J207IWY65OkIOyCrOydtOydmCDrtoDrtoTsoIEg7Iic7IScCisgICAgIOyEuOyasOq4sOyeheuLiOuLpDsg7Iqk7Yag7Ja0IOyYpO2NvOugiOydtOyFmOuTpOydtOuCmCDrj4Xrpr3soIHsnbgg66Gc65Oc65OkLCDrmJDripQg7KSR67O165CY64qUCisgICAgIOuhnOuTnOuTpOyXkCDrjIDtlbTshJzripQg7Ja065akIOyYge2WpeuPhCDrgbzsuZjsp4Ag7JWK7Iq164uI64ukLgorCisgICAgICgxKSDsl5DshJwg7Ja46riJ7ZaI65Ov7J20LCDsi5zsiqTthZzsnZggQ1BVIOuTpOydgCDrqZTrqqjrpqwg7Iuc7Iqk7YWc7JeQIOydvOugqOydmCDsiqTthqDslrQKKyAgICAg7Jik7Y2866CI7J207IWY65Ok7J2EIOuNmOyguCDrhKPqs6Ag7J6I7Jy866mwLCDqsbDquLDsl5Ag6rSA7Ius7J20IOyeiOuKlCDri6TrpbggQ1BVIOuKlCDqt7gKKyAgICAg7Jik7Y2866CI7J207IWY65Ok7J2EIOuplOuqqOumrCDsi5zsiqTthZzsnbQg7Iuk7ZaJ7ZWcIOqysOqzvOulvCDsnbjsp4DtlaAg7IiYIOyeiOyKteuLiOuLpC4gIOydtOyymOufvAorICAgICDri6TrpbggQ1BVIOydmCDsiqTthqDslrQg7Jik7Y2866CI7J207IWY7J2YIOqysOqzvOyXkCDqtIDsi6zsnYQg65GQ6rOgIOyeiOuKlCBDUFUg6rCAIOyImO2WiSDsmpTssq3tlZwKKyAgICAg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTripQsIOuwsOumrOyWtCDslZ7snZgg7Ja065akIOuhnOuTnCDsmKTtjbzroIjsnbTshZjsnbQg64uk66W4IENQVSDsl5DshJwKKyAgICAg642Y7KC4IOuEo+ydgCDsiqTthqDslrQg7Jik7Y2866CI7J207IWY6rO8IOqwmeydgCDsmIHsl63snYQg7Zal7ZaI64uk66m0LCDqt7jrn7Ag7Iqk7Yag7Ja0CisgICAgIOyYpO2NvOugiOydtOyFmOuTpOydtCDrp4zrk6TslrTrgrTripQg6rKw6rO86rCAIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja0IOuSpOydmCDroZzrk5wKKyAgICAg7Jik7Y2866CI7J207IWY65Ok7JeQ6rKM64qUIOuztOydvCDqsoPsnYQg67O07J6l7ZWp64uI64ukLgorCisgICAgIOydtCDsiJzshJwg7IS47Jqw6riwIOygnOyVveyXkCDrjIDtlZwg6re466a87J2EIOuztOq4sCDsnITtlbTshKAgIuuplOuqqOumrCDrsLDrpqzslrQg7Iuc7YCA7Iqk7J2YIOyYiCIKKyAgICAg7ISc67iM7IS57IWY7J2EIOywuOqzoO2VmOyLnOq4sCDrsJTrno3ri4jri6QuCisKKyAgICAgWyFdIOyyq+uyiOynuCDroZzrk5zripQg67CY65Oc7IucIF/rjbDsnbTthLBfIOydmOyhtOyEseydhCDqsIDsoLjslbzsp4Ag7Luo7Yq466GkIOydmOyhtOyEseydhCDqsIDsoLjslbwKKyAgICAg7ZWY64qU6rKMIOyVhOuLmOydhCDslYzslYTrkZDsi63si5zsmKQuICDrp4zslb0g65GQ67KI7Ke4IOuhnOuTnOulvCDsnITtlZwg7KO87IaM6rCAIOyyq+uyiOynuCDroZzrk5zsl5AKKyAgICAg7J2Y7KG07KCB7J207KeA66eMIOq3uCDsnZjsobTshLHsnYAg7KGw6rG07KCB7J207KeAIOq3uCDso7zshowg7J6Q7LK066W8IOqwgOyguOyYpOuKlOqyjCDslYTri4jrnbzrqbQsCisgICAgIOq3uOqyg+ydgCBf7Luo7Yq466GkXyDsnZjsobTshLHsnbTqs6AsIOydtCDqsr3smrDsl5DripQg7J296riwIOuwsOumrOyWtOuCmCDqt7jrs7Tri6Qg6rCV66Cl7ZWcCisgICAgIOustOyWuOqwgOqwgCDtlYTsmpTtlanri4jri6QuICDrjZQg7J6Q7IS47ZWcIOuCtOyaqeydhCDsnITtlbTshJzripQgIuy7qO2KuOuhpCDsnZjsobTshLEiIOyEnOu4jOyEueyFmOydhAorICAgICDssLjqs6DtlZjsi5zquLAg67CU656N64uI64ukLgorCisgICAgIFshXSDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOuKlCDrs7TthrUg7JOw6riwIOuwsOumrOyWtOuTpOqzvCDtlajqu5gg7Ked7J2EIOunnuy2sCDsgqzsmqnrkJjslrTslbwKKyAgICAg7ZWp64uI64ukOyAiU01QIOuwsOumrOyWtCDsp53rp57stpTquLAiIOyEnOu4jOyEueyFmOydhCDssLjqs6DtlZjshLjsmpQuCisKKworICgzKSDsnb3quLAgKOuYkOuKlCDroZzrk5wpIOuplOuqqOumrCDrsLDrpqzslrQuCisKKyAgICAg7J296riwIOuwsOumrOyWtOuKlCDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtCDquLDriqXsnZgg67O07J6l7IKs7ZWt7JeQIOuNlO2VtOyEnCDrsLDrpqzslrTrs7Tri6QKKyAgICAg7JWe7IScIOuqheyLnOuQnCDrqqjrk6AgTE9BRCDsmKTtjbzroIjsnbTshZjrk6TsnbQg67Cw66as7Ja0IOuSpOyXkCDrqoXsi5zrkJjripQg66qo65OgIExPQUQKKyAgICAg7Jik7Y2866CI7J207IWY65Ok67O064ukIOuovOyggCDtlontlbTsp4Qg6rKD7Jy866GcIOyLnOyKpO2FnOydmCDri6Trpbgg7Lu07Y+s64SM7Yq465Ok7JeQIOuztOyXrOyniCDqsoPsnYQKKyAgICAg67O07J6l7ZWp64uI64ukLgorCisgICAgIOydveq4sCDrsLDrpqzslrTripQg66Gc65OcIOyYpO2NvOugiOydtOyFmOyXkCDtlontlbTsp4DripQg67aA67aE7KCBIOyInOyEnCDshLjsmrDquLDsnoXri4jri6Q7IOyKpO2GoOyWtAorICAgICDsmKTtjbzroIjsnbTshZjsl5Ag64yA7ZW07ISc64qUIOyWtOuWpCDsmIHtlqXrj4Qg64G87LmY7KeAIOyViuyKteuLiOuLpC4KKworICAgICDsnb3quLAg66mU66qo66asIOuwsOumrOyWtOuKlCDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOulvCDrgrTsnqXtlZjrr4DroZwg642w7J207YSwIOydmOyhtOyEsQorICAgICDrsLDrpqzslrTrpbwg64yA7Iug7ZWgIOyImCDsnojsirXri4jri6QuCisKKyAgICAgWyFdIOydveq4sCDrsLDrpqzslrTripQg7J2867CY7KCB7Jy866GcIOyTsOq4sCDrsLDrpqzslrTrk6Tqs7wg7ZWo6ruYIOynneydhCDrp57strAg7IKs7Jqp65CY7Ja07JW8CisgICAgIO2VqeuLiOuLpDsgIlNNUCDrsLDrpqzslrQg7Ked66ee7LaU6riwIiDshJzruIzshLnshZjsnYQg7LC46rOg7ZWY7IS47JqULgorCisKKyAoNCkg67KU7JqpIOuplOuqqOumrCDrsLDrpqzslrQuCisKKyAgICAg67KU7JqpKGdlbmVyYWwpIOuplOuqqOumrCDrsLDrpqzslrTripQg67Cw66as7Ja067O064ukIOyVnuyEnCDrqoXsi5zrkJwg66qo65OgIExPQUQg7JmAIFNUT1JFCisgICAgIOyYpO2NvOugiOydtOyFmOuTpOydtCDrsLDrpqzslrQg65Kk7JeQIOuqheyLnOuQnCDrqqjrk6AgTE9BRCDsmYAgU1RPUkUg7Jik7Y2866CI7J207IWY65Ok67O064ukCisgICAgIOuovOyggCDsiJjtlonrkJwg6rKD7Jy866GcIOyLnOyKpO2FnOydmCDrgpjrqLjsp4Ag7Lu07Y+s64SM7Yq465Ok7JeQIOuztOydtOqyjCDrkKjsnYQg67O07J6l7ZWp64uI64ukLgorCisgICAgIOuylOyaqSDrqZTrqqjrpqwg67Cw66as7Ja064qUIOuhnOuTnOyZgCDsiqTthqDslrQg66qo65GQ7JeQIOuMgO2VnCDrtoDrtoTsoIEg7Iic7IScIOyEuOyasOq4sOyeheuLiOuLpC4KKworICAgICDrspTsmqkg66mU66qo66asIOuwsOumrOyWtOuKlCDsnb3quLAg66mU66qo66asIOuwsOumrOyWtCwg7JOw6riwIOuplOuqqOumrCDrsLDrpqzslrQg66qo65GQ66W8CisgICAgIOuCtOyepe2VmOuvgOuhnCwg65GQIOuwsOumrOyWtOulvCDrqqjrkZAg64yA7Iug7ZWgIOyImCDsnojsirXri4jri6QuCisKKwor6re466as6rOgIOuRkOqwnOydmCDrqoXsi5zsoIHsnbTsp4Ag7JWK7J2AIO2DgOyeheydtCDsnojsirXri4jri6Q6CisKKyAoNSkgQUNRVUlSRSDsmKTtjbzroIjsnbTshZguCisKKyAgICAg7J20IO2DgOyeheydmCDsmKTtjbzroIjsnbTshZjsnYAg64uo67Cp7Zal7J2YIO2IrOqzvOyEsSDrsLDrpqzslrTsspjrn7wg64+Z7J6R7ZWp64uI64ukLiAgQUNRVUlSRQorICAgICDsmKTtjbzroIjsnbTshZgg65Kk7J2YIOuqqOuToCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWY65Ok7J20IEFDUVVJUkUg7Jik7Y2866CI7J207IWYIO2bhOyXkAorICAgICDsnbzslrTrgpwg6rKD7Jy866GcIOyLnOyKpO2FnOydmCDrgpjrqLjsp4Ag7Lu07Y+s64SM7Yq465Ok7JeQIOuztOydtOqyjCDrkKAg6rKD7J20IOuztOyepeuQqeuLiOuLpC4KKyAgICAgTE9DSyDsmKTtjbzroIjsnbTshZjqs7wgc21wX2xvYWRfYWNxdWlyZSgpLCBzbXBfY29uZF9hY3F1aXJlKCkg7Jik7Y2866CI7J207IWY64+ECisgICAgIEFDUVVJUkUg7Jik7Y2866CI7J207IWY7JeQIO2PrO2VqOuQqeuLiOuLpC4gIHNtcF9jb25kX2FjcXVpcmUoKSDsmKTtjbzroIjsnbTshZjsnYAg7Luo7Yq466GkCisgICAgIOydmOyhtOyEseqzvCBzbXBfcm1iKCkg66W8IOyCrOyaqe2VtOyEnCBBQ1FVSVJFIOydmCDsnZjrr7jsoIEg7JqU6rWs7IKs7ZWtKHNlbWFudGljKeydhAorICAgICDstqnsobHsi5ztgrXri4jri6QuCisKKyAgICAgQUNRVUlSRSDsmKTtjbzroIjsnbTshZgg7JWe7J2YIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZjrk6TsnYAgQUNRVUlSRSDsmKTtjbzroIjsnbTshZgg7JmE66OMIO2bhOyXkAorICAgICDsiJjtlonrkJwg6rKD7LKY65+8IOuztOydvCDsiJgg7J6I7Iq164uI64ukLgorCisgICAgIEFDUVVJUkUg7Jik7Y2866CI7J207IWY7J2AIOqxsOydmCDtla3sg4EgUkVMRUFTRSDsmKTtjbzroIjsnbTshZjqs7wg7Ked7J2EIOyngOyWtCDsgqzsmqnrkJjslrTslbwKKyAgICAg7ZWp64uI64ukLgorCisKKyAoNikgUkVMRUFTRSDsmKTtjbzroIjsnbTshZguCisKKyAgICAg7J20IO2DgOyeheydmCDsmKTtjbzroIjsnbTshZjrk6Trj4Qg64uo67Cp7ZalIO2IrOqzvOyEsSDrsLDrpqzslrTsspjrn7wg64+Z7J6R7ZWp64uI64ukLiAgUkVMRUFTRQorICAgICDsmKTtjbzroIjsnbTshZgg7JWe7J2YIOuqqOuToCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWY65Ok7J2AIFJFTEVBU0Ug7Jik7Y2866CI7J207IWYIOyghOyXkCDsmYTro4zrkJwKKyAgICAg6rKD7Jy866GcIOyLnOyKpO2FnOydmCDri6Trpbgg7Lu07Y+s64SM7Yq465Ok7JeQIOuztOyXrOyniCDqsoPsnbQg67O07J6l65Cp64uI64ukLiAgVU5MT0NLIOulmOydmAorICAgICDsmKTtjbzroIjsnbTshZjrk6Tqs7wgc21wX3N0b3JlX3JlbGVhc2UoKSDsmKTtjbzroIjsnbTshZjrj4QgUkVMRUFTRSDsmKTtjbzroIjsnbTshZjsnZgKKyAgICAg7J287KKF7J6F64uI64ukLgorCisgICAgIFJFTEVBU0Ug7Jik7Y2866CI7J207IWYIOuSpOydmCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWY65Ok7J2AIFJFTEVBU0Ug7Jik7Y2866CI7J207IWY7J20CisgICAgIOyZhOujjOuQmOq4sCDsoITsl5Ag7ZaJ7ZW07KeEIOqyg+yymOufvCDrs7Tsnbwg7IiYIOyeiOyKteuLiOuLpC4KKworICAgICBBQ1FVSVJFIOyZgCBSRUxFQVNFIOyYpO2NvOugiOydtOyFmOydmCDsgqzsmqnsnYAg7J2867CY7KCB7Jy866GcIOuLpOuluCDrqZTrqqjrpqwg67Cw66as7Ja07J2YCisgICAgIO2VhOyalOyEseydhCDsl4bslbHri4jri6QgKO2VmOyngOunjCAiTU1JTyDsk7DquLAg67Cw66as7Ja0IiDshJzruIzshLnshZjsl5DshJwg7ISk66qF65CY64qUIOyYiOyZuOulvAorICAgICDslYzslYTrkZDshLjsmpQpLiAg65iQ7ZWcLCBSRUxFQVNFK0FDUVVJUkUg7KGw7ZWp7J2AIOuylOyaqSDrqZTrqqjrpqwg67Cw66as7Ja07LKY65+8IOuPmeyeke2VoAorICAgICDqsoPsnYQg67O07J6l7ZWY7KeAIC3slYrsirXri4jri6QtLiAg7ZWY7KeA66eMLCDslrTrlqQg67OA7IiY7JeQIOuMgO2VnCBSRUxFQVNFIOyYpO2NvOugiOydtOyFmOydhAorICAgICDslZ7shJzripQg66mU66qo66asIOyVoeyEuOyKpOuTpOydmCDsiJjtlokg6rKw6rO864qUIOydtCBSRUxFQVNFIOyYpO2NvOugiOydtOyFmOydhCDrkqTsnbTslrQg6rCZ7J2ACisgICAgIOuzgOyImOyXkCDrjIDtlbQg7IiY7ZaJ65CcIEFDUVVJUkUg7Jik7Y2866CI7J207IWY7J2EIOuSpOuUsOultOuKlCDrqZTrqqjrpqwg7JWh7IS47Iqk7JeQ64qUIOuztOyXrOyniAorICAgICDqsoPsnbQg67O07J6l65Cp64uI64ukLiAg64uk66W06rKMIOunkO2VmOyekOuptCwg7KO87Ja07KeEIOuzgOyImOydmCDtgazrpqzti7Dsu6wg7IS57IWY7JeQ7ISc64qULCDtlbTri7kKKyAgICAg67OA7IiY7JeQIOuMgO2VnCDslZ7snZgg7YGs66as7Yuw7LusIOyEueyFmOyXkOyEnOydmCDrqqjrk6Ag7JWh7IS47Iqk65Ok7J20IOyZhOujjOuQmOyXiOydhCDqsoPsnYQKKyAgICAg67O07J6l7ZWp64uI64ukLgorCisgICAgIOymiSwgQUNRVUlSRSDripQg7LWc7IaM7ZWc7J2YICLst6jrk50iIOuPmeyekeyymOufvCwg6re466as6rOgIFJFTEVBU0Ug64qUIOy1nOyGjO2VnOydmCAi6rO16rCcIgorICAgICDsspjrn7wg64+Z7J6R7ZWc64uk64qUIOydmOuvuOyeheuLiOuLpC4KKworYXRvbWljX29wcy50eHQg7JeQ7IScIOyEpOuqheuQmOuKlCDslrTthqDrr7kg7Jik7Y2866CI7J207IWY65OkIOykkeyXkOuKlCDsmYTsoITtnogg7Iic7ISc7J6h7Z6MIOqyg+uTpOqzvAorKOuwsOumrOyWtOulvCDsgqzsmqntlZjsp4Ag7JWK64qUKSDsmYTtmZTrkJwg7Iic7ISc7J2YIOqyg+uTpCDsmbjsl5AgQUNRVUlSRSDsmYAgUkVMRUFTRSDrtoDrpZjsnZgKK+qyg+uTpOuPhCDsobTsnqztlanri4jri6QuICDroZzrk5zsmYAg7Iqk7Yag7Ja066W8IOuqqOuRkCDsiJjtlontlZjripQg7KGw7ZWp65CcIOyWtO2GoOuvuSDsmKTtjbzroIjsnbTshZjsl5DshJwsCitBQ1FVSVJFIOuKlCDtlbTri7kg7Jik7Y2866CI7J207IWY7J2YIOuhnOuTnCDrtoDrtoTsl5Drp4wg7KCB7Jqp65CY6rOgIFJFTEVBU0Ug64qUIO2VtOuLuQor7Jik7Y2866CI7J207IWY7J2YIOyKpO2GoOyWtCDrtoDrtoTsl5Drp4wg7KCB7Jqp65Cp64uI64ukLgorCivrqZTrqqjrpqwg67Cw66as7Ja065Ok7J2AIOuRkCBDUFUg6rCELCDrmJDripQgQ1BVIOyZgCDrlJTrsJTsnbTsiqQg6rCE7JeQIOyDge2YuOyekeyaqeydmCDqsIDriqXshLHsnbQg7J6I7J2ECivrlYzsl5Drp4wg7ZWE7JqU7ZWp64uI64ukLiAg66eM7JW9IOyWtOuWpCDsvZTrk5zsl5Ag6re465+wIOyDge2YuOyekeyaqeydtCDsl4bsnYQg6rKD7J20IOuztOyepeuQnOuLpOuptCwg7ZW064u5CivsvZTrk5zsl5DshJzripQg66mU66qo66asIOuwsOumrOyWtOulvCDsgqzsmqntlaAg7ZWE7JqU6rCAIOyXhuyKteuLiOuLpC4KKworCivsnbTqsoPrk6TsnYAgX+y1nOyGjO2VnOydmF8g67O07J6l7IKs7ZWt65Ok7J6E7J2EIOyVjOyVhOuRkOyEuOyalC4gIOuLpOuluCDslYTtgqTthY3ss5Dsl5DshJzripQg642UIOqwleugpe2VnAor67O07J6l7IKs7ZWt7J2EIOygnOqzte2VoCDsiJjrj4Qg7J6I7Iq164uI64uk66eMLCDqt7jrn7Ag67O07J6l7IKs7ZWt7J2AIOyVhO2CpO2FjeyzkCDsooXsho3soIEg7L2U65OcIOydtOyZuOydmAor67aA67aE7JeQ7ISc64qUIOyLoOuisOuQmOyngCBf7JWK7J2EXyDqsoHri4jri6QuCisKKwor66mU66qo66asIOuwsOumrOyWtOyXkCDrjIDtlbQg6rCA7KCV7ZW07ISgIOyViOuQoCDqsoMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwor66as64iF7IqkIOy7pOuEkCDrqZTrqqjrpqwg67Cw66as7Ja065Ok7J20IOuztOyepe2VmOyngCDslYrripQg6rKD65Ok7J20IOyeiOyKteuLiOuLpDoKKworICgqKSDrqZTrqqjrpqwg67Cw66as7Ja0IOyVnuyXkOyEnCDrqoXsi5zrkJwg7Ja065akIOuplOuqqOumrCDslaHshLjsiqTrj4Qg66mU66qo66asIOuwsOumrOyWtCDrqoXroLnsnZgg7IiY7ZaJCisgICAgIOyZhOujjCDsi5zsoJDquYzsp4AgX+yZhOujjF8g65CgIOqyg+ydtOuegCDrs7TsnqXsnYAg7JeG7Iq164uI64ukOyDrsLDrpqzslrTqsIAg7ZWY64qUIOydvOydgCBDUFUg7J2YCisgICAgIOyVoeyEuOyKpCDtgZDsl5Ag7Yq57KCVIO2DgOyeheydmCDslaHshLjsiqTrk6TsnYAg64SY7J2EIOyImCDsl4bripQg7ISg7J2EIOq4i+uKlCDqsoPsnLzroZwg7IOd6rCB65CgIOyImAorICAgICDsnojsirXri4jri6QuCisKKyAoKikg7ZWcIENQVSDsl5DshJwg66mU66qo66asIOuwsOumrOyWtOulvCDsiJjtlontlZjripTqsowg7Iuc7Iqk7YWc7J2YIOuLpOuluCBDUFUg64KYIO2VmOuTnOybqOyWtOyXkAorICAgICDslrTrlqQg7KeB7KCR7KCB7J24IOyYge2WpeydhCDrgbzsuZzri6TripQg67O07J6l7J2AIOyhtOyerO2VmOyngCDslYrsirXri4jri6QuICDrsLDrpqzslrQg7IiY7ZaJ7J20CisgICAgIOunjOuTnOuKlCDqsITsoJHsoIEg7JiB7Zal7J2AIOuRkOuyiOynuCBDUFUg6rCAIOyyq+uyiOynuCBDUFUg7J2YIOyVoeyEuOyKpOuTpOydmCDqsrDqs7zrpbwKKyAgICAg67CU652867O064qUIOyInOyEnOqwgCDrkKnri4jri6Trp4wsIOuLpOydjCDtla3rqqnsnYQg67O07IS47JqUOgorCisgKCopIOyyq+uyiOynuCBDUFUg6rCAIOuRkOuyiOynuCBDUFUg7J2YIOuplOuqqOumrCDslaHshLjsiqTrk6TsnZgg6rKw6rO866W8IOuwlOudvOuzvCDrlYwsIF/shKTroLlfCisgICAgIOuRkOuyiOynuCBDUFUg6rCAIOuplOuqqOumrCDrsLDrpqzslrTrpbwg7IKs7Jqp7ZWc64ukIO2VtOuPhCwg7LKr67KI7Ke4IENQVSBf65iQ7ZWcXyDqt7jsl5Ag66ee64qUCisgICAgIOuplOuqqOumrCDrsLDrpqzslrTrpbwg7IKs7Jqp7ZWY7KeAIOyViuuKlOuLpOuptCAoIlNNUCDrsLDrpqzslrQg7Ked66ee7LaU6riwIiDshJzruIzshLnshZjsnYQKKyAgICAg7LC46rOg7ZWY7IS47JqUKSDqt7gg6rKw6rO86rCAIOyYrOuwlOuluCDsiJzshJzroZwg67O07Jes7KeE64uk64qUIOuztOyepeydgCDsl4bsirXri4jri6QuCisKKyAoKikgQ1BVIOuwlOq5peydmCDtlZjrk5zsm6jslrRbKl0g6rCAIOuplOuqqOumrCDslaHshLjsiqTrk6TsnZgg7Iic7ISc66W8IOuwlOq+uOyngCDslYrripTri6TripQg67O07J6l7J2ACisgICAgIOyhtOyerO2VmOyngCDslYrsirXri4jri6QuICBDUFUg7LqQ7IucIOydvOq0gOyEsSDrqZTsu6Tri4jsppjsnYAg66mU66qo66asIOuwsOumrOyWtOydmCDqsITsoJHsoIEKKyAgICAg7JiB7Zal7J2EIENQVSDsgqzsnbTsl5Ag7KCE7YyM7ZWY6ri0IO2VmOyngOunjCwg7Iic7ISc64yA66GcIOyghO2MjO2VmOyngOuKlCDslYrsnYQg7IiYIOyeiOyKteuLiOuLpC4KKworCVsqXSDrsoTsiqQg66eI7Iqk7YSw66eBIERNQSDsmYAg7J286rSA7ISx7JeQIOuMgO2VtOyEnOuKlCDri6TsnYzsnYQg7LC46rOg7ZWY7Iuc6riwIOuwlOuejeuLiOuLpDoKKworCSAgICBEb2N1bWVudGF0aW9uL1BDSS9wY2kudHh0CisJICAgIERvY3VtZW50YXRpb24vRE1BLUFQSS1IT1dUTy50eHQKKwkgICAgRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dAorCisKK+uNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja0CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCivrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOydmCDsgqzsmqnsl5Ag7J6I7Ja0IOyngOy8nOyVvCDtlZjripQg7IKs7ZWt65Ok7J2AIOyVveqwhCDrr7jrrJjtlZjqs6AsIOuNsOydtO2EsAor7J2Y7KG07ISxIOuwsOumrOyWtOqwgCDsgqzsmqnrkJjslrTslbwg7ZWY64qUIOyDge2ZqeuPhCDtla3sg4Eg66qF67Cx7ZWY7KeA64qUIOyViuyKteuLiOuLpC4gIOyEpOuqheydhCDsnITtlbQKK+uLpOydjOydmCDsnbTrsqTtirgg7Iuc7YCA7Iqk66W8IOyDneqwge2VtCDrtIXsi5zri6Q6CisKKwlDUFUgMQkJICAgICAgQ1BVIDIKKwk9PT09PT09PT09PT09PT0JICAgICAgPT09PT09PT09PT09PT09CisJeyBBID09IDEsIEIgPT0gMiwgQyA9PSAzLCBQID09ICZBLCBRID09ICZDIH0KKwlCID0gNDsKKwk87JOw6riwIOuwsOumrOyWtD4KKwlXUklURV9PTkNFKFAsICZCKQorCQkJICAgICAgUSA9IFJFQURfT05DRShQKTsKKwkJCSAgICAgIEQgPSAqUTsKKwor7Jes6riw7JeUIOu2hOuqhe2VnCDrjbDsnbTthLAg7J2Y7KG07ISx7J20IOyhtOyerO2VmOuvgOuhnCwg7J20IOyLnO2AgOyKpOqwgCDrgZ3rgqzsnYQg65WMIFEg64qUICZBIOuYkOuKlCAmQgor7J28IOqyg+ydtOqzoCwg65Sw65287IScOgorCisJKFEgPT0gJkEpIOuKlCAoRCA9PSAxKSDrpbwsCisJKFEgPT0gJkIpIOuKlCAoRCA9PSA0KSDrpbwg7J2Y66+47ZWp64uI64ukLgorCivtlZjsp4Drp4whICBDUFUgMiDripQgQiDsnZgg7JeF642w7J207Yq466W8IOyduOyLne2VmOq4sCDsoITsl5AgUCDsnZgg7JeF642w7J207Yq466W8IOyduOyLne2VoCDsiJgg7J6I6rOgLAor65Sw65287IScIOuLpOydjOydmCDqsrDqs7zqsIAg6rCA64ql7ZWp64uI64ukOgorCisJKFEgPT0gJkIpIGFuZCAoRCA9PSAyKSA/Pz8/CisKK+ydtOufsCDqsrDqs7zripQg7J286rSA7ISx7J2064KYIOyduOqzvCDqtIDqs4Qg7Jyg7KeA6rCAIOyLpO2MqO2VnCDqsoPsspjrn7wg67O07J28IOyImOuPhCDsnojqsqDsp4Drp4wsCivqt7jroIfsp4Ag7JWK7Iq164uI64ukLCDqt7jrpqzqs6Ag7J20IO2YhOyDgeydgCAoREVDIEFscGhhIOyZgCDqsJnsnYApIOyXrOufrCBDUFUg7JeQ7IScIOyLpOygnOuhnAor67Cc6rKs65CgIOyImCDsnojsirXri4jri6QuCisKK+ydtCDrrLjsoJwg7IOB7Zmp7J2EIOygnOuMgOuhnCDtlbTqsrDtlZjquLAg7JyE7ZW0LCDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOuCmCDqt7jrs7Tri6Qg6rCV7ZmU65CcCivrrLTslrjqsIDqsIAg7KO87IaM66W8IOydveyWtOyYrCDrlYzsmYAg642w7J207YSw66W8IOydveyWtOyYrCDrlYwg7IKs7J207JeQIOy2lOqwgOuQmOyWtOyVvOunjCDtlanri4jri6Q6CisKKwlDUFUgMQkJICAgICAgQ1BVIDIKKwk9PT09PT09PT09PT09PT0JICAgICAgPT09PT09PT09PT09PT09CisJeyBBID09IDEsIEIgPT0gMiwgQyA9PSAzLCBQID09ICZBLCBRID09ICZDIH0KKwlCID0gNDsKKwk87JOw6riwIOuwsOumrOyWtD4KKwlXUklURV9PTkNFKFAsICZCKTsKKwkJCSAgICAgIFEgPSBSRUFEX09OQ0UoUCk7CisJCQkgICAgICA8642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrQ+CisJCQkgICAgICBEID0gKlE7CisKK+ydtCDrs4Dqsr3snYAg7JWe7J2YIOyymOydjCDrkZDqsIDsp4Ag6rKw6rO8IOykkSDtlZjrgpjrp4zsnbQg67Cc7IOd7ZWgIOyImCDsnojqs6AsIOyEuOuyiOynuOydmCDqsrDqs7zripQKK+uwnOyDne2VoCDsiJgg7JeG64+E66GdIO2VqeuLiOuLpC4KKwor642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTripQg7J2Y7KG07KCBIOyTsOq4sOyXkCDrjIDtlbTshJzrj4Qg7Iic7ISc66W8IOyeoeyVhOykjeuLiOuLpDoKKworCUNQVSAxCQkgICAgICBDUFUgMgorCT09PT09PT09PT09PT09PQkgICAgICA9PT09PT09PT09PT09PT0KKwl7IEEgPT0gMSwgQiA9PSAyLCBDID0gMywgUCA9PSAmQSwgUSA9PSAmQyB9CisJQiA9IDQ7CisJPOyTsOq4sCDrsLDrpqzslrQ+CisJV1JJVEVfT05DRShQLCAmQik7CisJCQkgICAgICBRID0gUkVBRF9PTkNFKFApOworCQkJICAgICAgPOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja0PgorCQkJICAgICAgKlEgPSA1OworCivsnbQg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTripQgUSDroZzsnZgg7J296riw6rCAICpRIOuhnOydmCDsiqTthqDslrTsmYAg7Iic7ISc66W8IOunnuy2lOqyjAor7ZW07KSN64uI64ukLiAg7J2064qUIOuLpOydjOqzvCDqsJnsnYAg6rKw6rO866W8IOunieyKteuLiOuLpDoKKworCShRID09ICZCKSAmJiAoQiA9PSA0KQorCivsnbTrn7Ag7Yyo7YS07J2AIOuTnOusvOqyjCDsgqzsmqnrkJjslrTslbwg7ZWo7J2EIOyVjOyVhCDrkZDsi5zquLAg67CU656N64uI64ukLiAg66y07JeH67O064uk64+ELCDsnZjsobTshLEKK+yInOyEnCDqt5zsuZnsnZgg7J2Y64+E64qUIOyTsOq4sCDsnpHsl4XsnYQgLeyYiOuwqS0g7ZW07IScIOq3uOuhnCDsnbjtlbQg67Cc7IOd7ZWY64qUIOu5hOyLvCDsupDsi5wg66+47Iqk64+ECivsl4bslaDroKTripQg6rKD7J6F64uI64ukLiAg7J20IO2MqO2EtOydgCDrk5zrrLzqsowg67Cc7IOd7ZWY64qUIOyXkOufrCDsobDqsbQg6rCZ7J2A6rKD65Ok7J2EIOq4sOuhne2VmOuKlOuNsAor7IKs7Jqp65CgIOyImCDsnojqs6AsIOydtOugh+qyjCDrsLDrpqzslrTrpbwg7IKs7Jqp7ZW0IOyInOyEnOulvCDsp4DtgqTqsowg7ZWo7Jy866Gc7I2oIOq3uOufsCDquLDroZ3snbQKK+yCrOudvOyngOuKlCDqsoPsnYQg66eJ7Iq164uI64ukLgorCisKK1shXSDsg4Hri7ntnogg67mE7KeB6rSA7KCB7J24IOydtCDsg4HtmansnYAg67aE66as65CcIOy6kOyLnOulvCDqsIDsp4Qg6riw6rOELCDsmIjrpbwg65Ok7Ja0IO2VnCDsupDsi5wKK+uxhe2BrOqwgCDsp53siJjrsogg7LqQ7IucIOudvOyduOydhCDsspjrpqztlZjqs6Ag64uk66W4IOuxhe2BrOuKlCDtmYDsiJjrsogg7LqQ7IucIOudvOyduOydhCDsspjrpqztlZjripQg6riw6rOECivrk7Hsl5DshJwg6rCA7J6lIOyemCDrsJzsg53tlanri4jri6QuICDtj6zsnbjthLAgUCDripQg7ZmA7IiYIOuyiO2YuOydmCDsupDsi5wg65287J247JeQIOyeiOqzoCwg67OA7IiYIEIg64qUCivsp53siJgg67KI7Zi4IOy6kOyLnCDrnbzsnbjsl5Ag7J6I64uk6rOgIOyDneqwge2VtCDrtIXsi5zri6QuICDqt7jrn7Ag7IOB7YOc7JeQ7IScIOydveq4sCDsnpHsl4XsnYQg7ZWY64qUIENQVQor7J2YIOynneyImOuyiCDrsYXtgazripQg7ZWgIOydvOydtCDsjJPsl6wg66ek7JqwIOuwlOyBmOyngOunjCDtmYDsiJjrsogg67GF7YGs64qUIO2VoCDsnbzsnbQg7JeG7Ja0IOyVhOustAor7J2864+EIO2VmOyngCDslYrqs6AgIOyeiOyXiOuLpOuptCwg7Y+s7J247YSwIFAg64qUIOyDiCDqsJIgKCZCKSDsnYQsIOq3uOumrOqzoCDrs4DsiJggQiDripQg7Jib64KgIOqwkgorKDIpIOydhCDqsIDsp4Dqs6Ag7J6I64qUIOyDge2DnOqwgCDrs7Tsl6zsp4gg7IiY64+EIOyeiOyKteuLiOuLpC4KKworCivrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOuKlCDrp6TsmrAg7KSR7JqU7ZWc642wLCDsmIjrpbwg65Ok7Ja0IFJDVSDsi5zsiqTthZzsl5DshJwg6re466CH7Iq164uI64ukLgoraW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oIOydmCByY3VfYXNzaWduX3BvaW50ZXIoKSDsmYAgcmN1X2RlcmVmZXJlbmNlKCkg66W8CivssLjqs6DtlZjshLjsmpQuICDsl6zquLDshJwg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTripQgUkNVIOuhnCDqtIDrpqzrkJjripQg7Y+s7J247YSw7J2YIO2DgOqyn+ydhCDtmITsnqwKK+2DgOqyn+yXkOyEnCDsiJjsoJXrkJwg7IOI66Gc7Jq0IO2DgOqyn+ycvOuhnCDrsJTqvrjripQg7J6R7JeF7JeQ7IScIOyDiOuhnCDsiJjsoJXrkJwg7YOA6rKf7J20IOy0iOq4sO2ZlOqwgAor7JmE66OM65CY7KeAIOyViuydgCDssYTroZwg67O07Jes7KeA64qUIOydvOydtCDsnbzslrTrgpjsp4Ag7JWK6rKMIO2VtOykjeuLiOuLpC4KKwor642UIOunjuydgCDsmIjrpbwg7JyE7ZW07ISgICLsupDsi5wg7J286rSA7ISxIiDshJzruIzshLnshZjsnYQg7LC46rOg7ZWY7IS47JqULgorCisKK+y7qO2KuOuhpCDsnZjsobTshLEKKy0tLS0tLS0tLS0tLS0KKwor66Gc65OcLeuhnOuTnCDsu6jtirjroaQg7J2Y7KG07ISx7J2AIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja066eM7Jy866Gc64qUIOygle2Zle2eiCDrj5nsnpHtlaAg7IiY6rCACivsl4bslrTshJwg7J296riwIOuplOuqqOumrCDrsLDrpqzslrTrpbwg7ZWE7JqU66GcIO2VqeuLiOuLpC4gIOyVhOuemOydmCDsvZTrk5zrpbwg67SF7Iuc64ukOgorCisJcSA9IFJFQURfT05DRShhKTsKKwlpZiAocSkgeworCQk8642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrQ+ICAvKiBCVUc6IE5vIGRhdGEgZGVwZW5kZW5jeSEhISAqLworCQlwID0gUkVBRF9PTkNFKGIpOworCX0KKwor7J20IOy9lOuTnOuKlCDsm5DtlZjripQg64yA66Gc7J2YIO2aqOqzvOulvCDrgrTsp4Ag66q77ZWgIOyImCDsnojripTrjbAsIOydtCDsvZTrk5zsl5DripQg642w7J207YSwIOydmOyhtOyEseydtAor7JWE64uI6528IOy7qO2KuOuhpCDsnZjsobTshLHsnbQg7KG07J6s7ZWY6riwIOuVjOusuOycvOuhnCwg7J2065+wIOyDge2ZqeyXkOyEnCBDUFUg64qUIOyLpO2WiSDsho3rj4Trpbwg642UCivruaDrpbTqsowg7ZWY6riwIOychO2VtCDrtoTquLAg7KGw6rG07J2YIOqysOqzvOulvCDsmIjsuKHtlZjqs6Ag7L2U65Oc66W8IOyerOuwsOy5mCDtlaAg7IiYIOyeiOyWtOyEnCDri6TrpbgKK0NQVSDripQgYiDroZzrtoDthLDsnZgg66Gc65OcIOyYpO2NvOugiOydtOyFmOydtCBhIOuhnOu2gO2EsOydmCDroZzrk5wg7Jik7Y2866CI7J207IWY67O064ukIOuovOyggCDrsJzsg53tlZwKK+qxuOuhnCDsnbjsi53tlaAg7IiYIOyeiOyKteuLiOuLpC4gIOyXrOq4sOyXkCDsoJXrp5DroZwg7ZWE7JqU7ZaI642YIOqxtCDri6TsnYzqs7wg6rCZ7Iq164uI64ukOgorCisJcSA9IFJFQURfT05DRShhKTsKKwlpZiAocSkgeworCQk87J296riwIOuwsOumrOyWtD4KKwkJcCA9IFJFQURfT05DRShiKTsKKwl9CisKK+2VmOyngOunjCwg7Iqk7Yag7Ja0IOyYpO2NvOugiOydtOyFmOydgCDsmIjsuKHsoIHsnLzroZwg7IiY7ZaJ65CY7KeAIOyViuyKteuLiOuLpC4gIOymiSwg64uk7J2MIOyYiOyXkOyEnOyZgAor6rCZ7J20IOuhnOuTnC3siqTthqDslrQg7Luo7Yq466GkIOydmOyhtOyEseydtCDsobTsnqztlZjripQg6rK97Jqw7JeQ64qUIOyInOyEnOqwgCAt7KeA7Lyc7KeE64ukLeuKlAor7J2Y66+47J6F64uI64ukLgorCisJcSA9IFJFQURfT05DRShhKTsKKwlpZiAocSkgeworCQlXUklURV9PTkNFKGIsIHApOworCX0KKwor7Luo7Yq466GkIOydmOyhtOyEseydgCDrs7TthrUg64uk66W4IO2DgOyeheydmCDrsLDrpqzslrTrk6Tqs7wg7Ked7J2EIOunnuy2sCDsgqzsmqnrkKnri4jri6QuICDqt7jroIfri6Tqs6QKK+2VmOuCmCwgUkVBRF9PTkNFKCkg64qUIOuwmOuTnOyLnCDsgqzsmqntlbTslbwg7ZWo7J2EIOu2gOuUlCDrqoXsi6ztlZjshLjsmpQhICBSRUFEX09OQ0UoKSDqsIAKK+yXhuuLpOuptCwg7Lu07YyM7J2865+s6rCAICdhJyDroZzrtoDthLDsnZgg66Gc65Oc66W8ICdhJyDroZzrtoDthLDsnZgg65iQ64uk66W4IOuhnOuTnOyZgCwgJ2InIOuhnOydmAor7Iqk7Yag7Ja066W8ICdiJyDroZzsnZgg65iQ64uk66W4IOyKpO2GoOyWtOyZgCDsobDtlantlbQg67KE66CkIOunpOyasCDruYTsp4HqtIDsoIHsnbgg6rKw6rO866W8IOy0iOuemO2VoCDsiJgKK+yeiOyKteuLiOuLpC4KKwor7J206rG466GcIOuBneydtCDslYTri4zqsowsIOy7tO2MjOydvOufrOqwgCDrs4DsiJggJ2EnIOydmCDqsJLsnbQg7ZWt7IOBIDDsnbQg7JWE64uI65286rOgIOymneuqhe2VoCDsiJgKK+yeiOuLpOuptCwg7JWe7J2YIOyYiOyXkOyEnCAiaWYiIOusuOydhCDsl4bslaDshJwg64uk7J2M6rO8IOqwmeydtCDstZzsoIHtmZQg7ZWgIOyImOuPhCDsnojsirXri4jri6Q6CisKKwlxID0gYTsKKwliID0gcDsgIC8qIEJVRzogQ29tcGlsZXIgYW5kIENQVSBjYW4gYm90aCByZW9yZGVyISEhICovCisKK+q3uOufrOuLiCBSRUFEX09OQ0UoKSDrpbwg67CY65Oc7IucIOyCrOyaqe2VmOyEuOyalC4KKwor64uk7J2M6rO8IOqwmeydtCAiaWYiIOusuOydmCDslpHqsIjrnpgg67iM656c7LmY7JeQIOuqqOuRkCDsobTsnqztlZjripQg64+Z7J287ZWcIOyKpO2GoOyWtOyXkCDrjIDtlbQg7Iic7ISc66W8CivqsJXsoJztlZjqs6Ag7Iu27J2AIOqyveyasOqwgCDsnojsnYQg7IiYIOyeiOyKteuLiOuLpDoKKworCXEgPSBSRUFEX09OQ0UoYSk7CisJaWYgKHEpIHsKKwkJYmFycmllcigpOworCQlXUklURV9PTkNFKGIsIHApOworCQlkb19zb21ldGhpbmcoKTsKKwl9IGVsc2UgeworCQliYXJyaWVyKCk7CisJCVdSSVRFX09OQ0UoYiwgcCk7CisJCWRvX3NvbWV0aGluZ19lbHNlKCk7CisJfQorCivslYjtg4DquZ3qsozrj4QsIO2YhOyerOydmCDsu7TtjIzsnbzrn6zrk6TsnYAg64aS7J2AIOy1nOygge2ZlCDroIjrsqjsl5DshJzripQg7J206rG4IOuLpOydjOqzvCDqsJnsnbQKK+uwlOq/lOuyhOumveuLiOuLpDoKKworCXEgPSBSRUFEX09OQ0UoYSk7CisJYmFycmllcigpOworCVdSSVRFX09OQ0UoYiwgcCk7ICAvKiBCVUc6IE5vIG9yZGVyaW5nIHZzLiBsb2FkIGZyb20gYSEhISAqLworCWlmIChxKSB7CisJCS8qIFdSSVRFX09OQ0UoYiwgcCk7IC0tIG1vdmVkIHVwLCBCVUchISEgKi8KKwkJZG9fc29tZXRoaW5nKCk7CisJfSBlbHNlIHsKKwkJLyogV1JJVEVfT05DRShiLCBwKTsgLS0gbW92ZWQgdXAsIEJVRyEhISAqLworCQlkb19zb21ldGhpbmdfZWxzZSgpOworCX0KKwor7J207KCcICdhJyDsl5DshJzsnZgg66Gc65Oc7JmAICdiJyDroZzsnZgg7Iqk7Yag7Ja0IOyCrOydtOyXkOuKlCDsobDqsbTsoIEg6rSA6rOE6rCAIOyXhuq4sCDrlYzrrLjsl5AgQ1BVCivripQg7J2065Ok7J2YIOyInOyEnOulvCDrsJTqv4Ag7IiYIOyeiOqyjCDrkKnri4jri6Q6IOydtOufsCDqsr3smrDsl5Ag7KGw6rG07KCBIOq0gOqzhOuKlCDrsJjrk5zsi5wKK+2VhOyalO2VnOuNsCwg66qo65OgIOy7tO2MjOydvOufrCDstZzsoIHtmZTqsIAg7J2066Oo7Ja07KeA6rOgIOuCnCDtm4TsnZgg7Ja07IWI67iU66asIOy9lOuTnOyXkOyEnOuPhAor66eI7LCs6rCA7KeA7J6F64uI64ukLiAg65Sw65287IScLCDsnbQg7JiI7JeQ7IScIOyInOyEnOulvCDsp4DtgqTquLAg7JyE7ZW07ISc64qUIHNtcF9zdG9yZV9yZWxlYXNlKCkKK+yZgCDqsJnsnYAg66qF7Iuc7KCBIOuplOuqqOumrCDrsLDrpqzslrTqsIAg7ZWE7JqU7ZWp64uI64ukOgorCisJcSA9IFJFQURfT05DRShhKTsKKwlpZiAocSkgeworCQlzbXBfc3RvcmVfcmVsZWFzZSgmYiwgcCk7CisJCWRvX3NvbWV0aGluZygpOworCX0gZWxzZSB7CisJCXNtcF9zdG9yZV9yZWxlYXNlKCZiLCBwKTsKKwkJZG9fc29tZXRoaW5nX2Vsc2UoKTsKKwl9CisKK+uwmOuptOyXkCDrqoXsi5zsoIEg66mU66qo66asIOuwsOumrOyWtOqwgCDsl4bri6TrqbQsIOydtOufsCDqsr3smrDsnZgg7Iic7ISc64qUIOyKpO2GoOyWtCDsmKTtjbzroIjsnbTshZjrk6TsnbQKK+yEnOuhnCDri6Trpbwg65WM7JeQ66eMIOuztOyepeuQmOuKlOuNsCwg7JiI66W8IOuTpOuptCDri6TsnYzqs7wg6rCZ7J2AIOqyveyasOyeheuLiOuLpDoKKworCXEgPSBSRUFEX09OQ0UoYSk7CisJaWYgKHEpIHsKKwkJV1JJVEVfT05DRShiLCBwKTsKKwkJZG9fc29tZXRoaW5nKCk7CisJfSBlbHNlIHsKKwkJV1JJVEVfT05DRShiLCByKTsKKwkJZG9fc29tZXRoaW5nX2Vsc2UoKTsKKwl9CisKK+yymOydjOydmCBSRUFEX09OQ0UoKSDripQg7Lu07YyM7J2865+s6rCAICdhJyDsnZgg6rCS7J2EIOymneuqhe2VtOuCtOuKlCDqsoPsnYQg66eJ6riwIOychO2VtCDsl6zsoITtnogKK+2VhOyalO2VqeuLiOuLpC4KKwor65iQ7ZWcLCDroZzsu6wg67OA7IiYICdxJyDrpbwg6rCA7KeA6rOgIO2VmOuKlCDsnbzsl5Ag64yA7ZW0IOyjvOydmO2VtOyVvCDtlZjripTrjbAsIOq3uOufrOyngCDslYrsnLzrqbQKK+y7tO2MjOydvOufrOuKlCDqt7gg6rCS7J2EIOy2lOy4oe2VmOqzoCDrmJDri6Tsi5wg7ZWE7JqU7ZWcIOyhsOqxtOq0gOqzhOulvCDsl4bslaDrsoTrprQg7IiYIOyeiOyKteuLiOuLpC4KK+yYiOulvCDrk6TrqbQ6CisKKwlxID0gUkVBRF9PTkNFKGEpOworCWlmIChxICUgTUFYKSB7CisJCVdSSVRFX09OQ0UoYiwgcCk7CisJCWRvX3NvbWV0aGluZygpOworCX0gZWxzZSB7CisJCVdSSVRFX09OQ0UoYiwgcik7CisJCWRvX3NvbWV0aGluZ19lbHNlKCk7CisJfQorCivrp4zslb0gTUFYIOqwgCAxIOuhnCDsoJXsnZjrkJwg7IOB7IiY652866m0LCDsu7TtjIzsnbzrn6zripQgKHEgJSBNQVgpIOuKlCAw7J20656AIOqyg+ydhCDslYzslYTssYTqs6AsCivsnITsnZgg7L2U65Oc66W8IOyVhOuemOyZgCDqsJnsnbQg67CU6r+U67KE66a0IOyImCDsnojsirXri4jri6Q6CisKKwlxID0gUkVBRF9PTkNFKGEpOworCVdSSVRFX09OQ0UoYiwgcCk7CisJZG9fc29tZXRoaW5nX2Vsc2UoKTsKKwor7J2066CH6rKMIOuQmOuptCwgQ1BVIOuKlCDrs4DsiJggJ2EnIOuhnOu2gO2EsOydmCDroZzrk5zsmYAg67OA7IiYICdiJyDroZzsnZgg7Iqk7Yag7Ja0IOyCrOydtOydmCDsiJzshJzrpbwKK+yngOy8nOykhCDtlYTsmpTqsIAg7JeG7Ja07KeR64uI64ukLiAgYmFycmllcigpIOulvCDstpTqsIDtlbQg7ZW06rKw7ZW0IOuztOqzoCDsi7bqsqDsp4Drp4wsIOq3uOqxtAor64+E7JuA7J20IOyViOuQqeuLiOuLpC4gIOyhsOqxtCDqtIDqs4TripQg7IKs65287KGM6rOgLCBiYXJyaWVyKCkg64qUIOydtOulvCDrkJjrj4zrpqzsp4Ag66q77ZWp64uI64ukLgor65Sw65287IScLCDsnbQg7Iic7ISc66W8IOyngOy8nOyVvCDtlZzri6TrqbQsIE1BWCDqsIAgMSDrs7Tri6Qg7YGs64uk64qUIOqyg+ydhCwg64uk7J2M6rO8IOqwmeydgCDrsKnrspXsnYQKK+yCrOyaqe2VtCDrtoTrqoXtnogg7ZW07JW8IO2VqeuLiOuLpDoKKworCXEgPSBSRUFEX09OQ0UoYSk7CisJQlVJTERfQlVHX09OKE1BWCA8PSAxKTsgLyogT3JkZXIgbG9hZCBmcm9tIGEgd2l0aCBzdG9yZSB0byBiLiAqLworCWlmIChxICUgTUFYKSB7CisJCVdSSVRFX09OQ0UoYiwgcCk7CisJCWRvX3NvbWV0aGluZygpOworCX0gZWxzZSB7CisJCVdSSVRFX09OQ0UoYiwgcik7CisJCWRvX3NvbWV0aGluZ19lbHNlKCk7CisJfQorCisnYicg66Gc7J2YIOyKpO2GoOyWtOuTpOydgCDsl6zsoITtnogg7ISc66GcIOuLpOumhOydhCDslYzslYTrkZDshLjsmpQuICDrp4zslb0g6re46rKD65Ok7J20IOuPmeydvO2VmOuptCwKK+yVnuyXkOyEnCDsnbTslbzquLDtlojrk68sIOy7tO2MjOydvOufrOqwgCDqt7gg7Iqk7Yag7Ja0IOyYpO2NvOugiOydtOyFmOuTpOydhCAnaWYnIOusuCDrsJTquaXsnLzroZwKK+uBhOynkeyWtOuCvCDsiJgg7J6I7Iq164uI64ukLgorCivrmJDtlZwg7J207KeEIOyhsOqxtOusuCDtj4nqsIDsl5Ag64SI66y0IOydmOyhtO2VmOyngCDslYrrj4TroZ0g7KGw7Ius7ZW07JW8IO2VqeuLiOuLpC4gIOuLpOydjOydmCDsmIjrpbwKK+u0heyLnOuLpDoKKworCXEgPSBSRUFEX09OQ0UoYSk7CisJaWYgKHEgfHwgMSA+IDApCisJCVdSSVRFX09OQ0UoYiwgMSk7CisKK+yyq+uyiOynuCDsobDqsbTrp4zsnLzroZzripQg67iM656c7LmYIOyhsOqxtCDsoITssrTrpbwg6rGw7KeT7Jy866GcIOunjOuTpCDsiJgg7JeG6rOgIOuRkOuyiOynuCDsobDqsbTsnYAg7ZWt7IOBCivssLjsnbTquLAg65WM66y47JeQLCDsu7TtjIzsnbzrn6zripQg7J20IOyYiOulvCDri6TsnYzqs7wg6rCZ7J20IOuwlOq/lOyEnCDsu6jtirjroaQg7J2Y7KG07ISx7J2EIOyXhuyVoOuyhOumtAor7IiYIOyeiOyKteuLiOuLpDoKKworCXEgPSBSRUFEX09OQ0UoYSk7CisJV1JJVEVfT05DRShiLCAxKTsKKwor7J20IOyYiOuKlCDsu7TtjIzsnbzrn6zqsIAg7L2U65Oc66W8IOy2lOy4oeycvOuhnCDsiJjsoJXtlaAg7IiYIOyXhuuPhOuhnSDrtoTrqoXtnogg7ZW07JW8IO2VnOuLpOuKlCDsoJDsnYQKK+qwleyhsO2VqeuLiOuLpC4gIOyhsOq4iCDrjZQg7J2867CY7KCB7Jy866GcIOunkO2VtOyEnCwgUkVBRF9PTkNFKCkg64qUIOy7tO2MjOydvOufrOyXkOqyjCDso7zslrTsp4Qg66Gc65OcCivsmKTtjbzroIjsnbTshZjsnYQg7JyE7ZWcIOy9lOuTnOulvCDsoJXrp5DroZwg66eM65Ok64+E66GdIO2VmOyngOunjCwg7Lu07YyM7J2865+s6rCAIOq3uOugh+qyjCDrp4zrk6TslrTsp4QKK+y9lOuTnOydmCDsiJjtlokg6rKw6rO866W8IOyCrOyaqe2VmOuPhOuhnSDqsJXsoJztlZjsp4DripQg7JWK7Iq164uI64ukLgorCivrp4jsp4Drp4nsnLzroZwsIOy7qO2KuOuhpCDsnZjsobTshLHsnYAg7J207ZaJ7ISxICh0cmFuc2l0aXZpdHkpIOydhCDsoJzqs7XtlZjsp4AgLeyViuyKteuLiOuLpC0uICDsnbTqsbQKK3gg7JmAIHkg6rCAIOuRmCDri6QgMCDsnbTrnbzripQg7LSI6riw6rCS7J2EIOqwgOyhjOuLpOuKlCDqsIDsoJUg7ZWY7J2YIOuRkOqwnOydmCDsmIjsoJzroZwKK+uztOydtOqyoOyKteuLiOuLpDoKKworCUNQVSAwICAgICAgICAgICAgICAgICAgICAgQ1BVIDEKKwk9PT09PT09PT09PT09PT09PT09PT09PSAgID09PT09PT09PT09PT09PT09PT09PT09CisJcjEgPSBSRUFEX09OQ0UoeCk7ICAgICAgICByMiA9IFJFQURfT05DRSh5KTsKKwlpZiAocjEgPiAwKSAgICAgICAgICAgICAgIGlmIChyMiA+IDApCisJICBXUklURV9PTkNFKHksIDEpOyAgICAgICAgIFdSSVRFX09OQ0UoeCwgMSk7CisKKwlhc3NlcnQoIShyMSA9PSAxICYmIHIyID09IDEpKTsKKwor7J20IOuRkCBDUFUg7JiI7KCc7JeQ7IScIGFzc2VydCgpIOydmCDsobDqsbTsnYAg7ZWt7IOBIOywuOydvCDqsoPsnoXri4jri6QuICDqt7jrpqzqs6AsIOunjOyVvSDsu6jtirjroaQKK+ydmOyhtOyEseydtCDsnbTtlonshLHsnYQgKOyLpOygnOuhnOuKlCDqt7jrn6zsp4Ag7JWK7KeA66eMKSDrs7TsnqXtlZzri6TrqbQsIOuLpOydjOydmCBDUFUg6rCAIOy2lOqwgOuQmOyWtOuPhAor7JWE656Y7J2YIGFzc2VydCgpIOyhsOqxtOydgCDssLjsnbQg65Cg6rKD7J6F64uI64ukOgorCisJQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09PT0KKwlXUklURV9PTkNFKHgsIDIpOworCisJYXNzZXJ0KCEocjEgPT0gMiAmJiByMiA9PSAxICYmIHggPT0gMikpOyAvKiBGQUlMUyEhISAqLworCivtlZjsp4Drp4wg7Luo7Yq466GkIOydmOyhtOyEseydgCDsnbTtlonshLHsnYQg7KCc6rO17ZWY7KeAIC3slYrquLAtIOuVjOusuOyXkCwg7IS46rCc7J2YIENQVSDsmIjsoJzqsIAg7Iuk7ZaJCivsmYTro4zrkJwg7ZuE7JeQIOychOydmCBhc3NlcnQoKSDsnZgg7KGw6rG07J2AIOqxsOynk+ycvOuhnCDtj4nqsIDrkKAg7IiYIOyeiOyKteuLiOuLpC4gIOyEuOqwnOydmCBDUFUKK+yYiOygnOqwgCDsiJzshJzrpbwg7KeA7YKk6ri4IOybkO2VnOuLpOuptCwgQ1BVIDAg7JmAIENQVSAxIOy9lOuTnOydmCDroZzrk5zsmYAg7Iqk7Yag7Ja0IOyCrOydtCwgImlmIgor66y4IOuwlOuhnCDri6TsnYzsl5Agc21wX21iKCnrpbwg64Sj7Ja07JW8IO2VqeuLiOuLpC4gIOuNlCDrgpjslYTqsIDshJwsIOy1nOy0iOydmCDrkZAgQ1BVIOyYiOygnOuKlAor66ek7JqwIOychO2XmO2VmOuvgOuhnCDsgqzsmqnrkJjsp4Ag7JWK7JWE7JW8IO2VqeuLiOuLpC4KKwor7J20IOuRkOqwnOydmCDsmIjsoJzripQg64uk7J2MIOuFvOusuDoKK2h0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL3VzZXJzL3BlczIwL3BwYy1zdXBwbGVtZW50YWwvdGVzdDYucGRmIOyZgAor7J20IOyCrOydtO2KuDogaHR0cHM6Ly93d3cuY2wuY2FtLmFjLnVrL35wZXMyMC9wcGNtZW0vaW5kZXguaHRtbCDsl5Ag64KY7JioIExCIOyZgCBXV0MKK+umrO2KuOuouOyKpCDthYzsiqTtirjsnoXri4jri6QuCisKK+yalOyVve2VmOyekOuptDoKKworICAoKikg7Luo7Yq466GkIOydmOyhtOyEseydgCDslZ7snZgg66Gc65Oc65Ok7J2EIOuSpOydmCDsiqTthqDslrTrk6Tsl5Ag64yA7ZW0IOyInOyEnOulvCDrp57strDspI3ri4jri6QuCisgICAgICDtlZjsp4Drp4wsIOq3uCDsmbjsnZgg7Ja065akIOyInOyEnOuPhCDrs7TsnqXtlZjsp4AgLeyViuyKteuLiOuLpC06IOyVnuydmCDroZzrk5zsmYAg65Kk7J2YIOuhnOuTnOuTpAorICAgICAg7IKs7J207JeQ64+ELCDslZ7snZgg7Iqk7Yag7Ja07JmAIOuSpOydmCDsiqTthqDslrTrk6Qg7IKs7J207JeQ64+E7JqULiAg7J2065+wIOuLpOuluCDtmJXtg5zsnZgKKyAgICAgIOyInOyEnOqwgCDtlYTsmpTtlZjri6TrqbQgc21wX3JtYigpIOuCmCBzbXBfd21iKCnrpbwsIOuYkOuKlCwg7JWe7J2YIOyKpO2GoOyWtOuTpOqzvCDrkqTsnZgKKyAgICAgIOuhnOuTnOuTpCDsgqzsnbTsnZgg7Iic7ISc66W8IOychO2VtOyEnOuKlCBzbXBfbWIoKSDrpbwg7IKs7Jqp7ZWY7IS47JqULgorCisgICgqKSAiaWYiIOusuOydmCDslpHqsIjrnpgg67iM656c7LmY6rCAIOqwmeydgCDrs4DsiJjsl5DsnZgg64+Z7J287ZWcIOyKpO2GoOyWtOuhnCDsi5zsnpHtlZzri6TrqbQsIOq3uAorICAgICAg7Iqk7Yag7Ja065Ok7J2AIOqwgSDsiqTthqDslrQg7JWe7JeQIHNtcF9tYigpIOulvCDrhKPqsbDrgpggc21wX3N0b3JlX3JlbGVhc2UoKSDrpbwKKyAgICAgIOyCrOyaqe2VtOyEnCDsiqTthqDslrTrpbwg7ZWY64qUIOyLneycvOuhnCDsiJzshJzrpbwg66ee7Law7KSY7JW8IO2VqeuLiOuLpC4gIOydtCDrrLjsoJzrpbwg7ZW06rKw7ZWY6riwCisgICAgICDsnITtlbQgImlmIiDrrLjsnZgg7JaR6rCI656YIOu4jOuenOy5mOydmCDsi5zsnpEg7KeA7KCQ7JeQIGJhcnJpZXIoKSDrpbwg64Sj64qUIOqyg+unjOycvOuhnOuKlAorICAgICAg7Lap67aE7ZWcIO2VtOqysOydtCDrkJjsp4Ag7JWK64qU642wLCDsnbTripQg7JWe7J2YIOyYiOyXkOyEnCDrs7jqsoPqs7wg6rCZ7J20LCDsu7TtjIzsnbzrn6zsnZgKKyAgICAgIOy1nOygge2ZlOuKlCBiYXJyaWVyKCkg6rCAIOydmOuvuO2VmOuKlCDrsJTrpbwg7KeA7YKk66m07ISc64+EIOy7qO2KuOuhpCDsnZjsobTshLHsnYQg7IaQ7IOB7Iuc7YKsCisgICAgICDsiJgg7J6I6riwIOuVjOusuOydtOudvOuKlCDsoJDsnYQg67aA65SUIOyVjOyVhOuRkOyLnOq4sCDrsJTrno3ri4jri6QuCisKKyAgKCopIOy7qO2KuOuhpCDsnZjsobTshLHsnYAg7JWe7J2YIOuhnOuTnOyZgCDrkqTsnZgg7Iqk7Yag7Ja0IOyCrOydtOyXkCDstZzshowg7ZWY64KY7J2YLCDsi6TtlokKKyAgICAgIOyLnOygkOyXkOyEnOydmCDsobDqsbTqtIDqs4Trpbwg7ZWE7JqU66GcIO2VmOupsCwg7J20IOyhsOqxtOq0gOqzhOuKlCDslZ7snZgg66Gc65Oc7JmAIOq0gOqzhOuQmOyWtOyVvAorICAgICAg7ZWp64uI64ukLiAg66eM7JW9IOy7tO2MjOydvOufrOqwgCDsobDqsbQg6rSA6rOE66W8IOy1nOygge2ZlOuhnCDsl4bslajsiJgg7J6I64uk66m0LCDsiJzshJzrj4QKKyAgICAgIOy1nOygge2ZlOuhnCDsl4bslaDrsoTroLjsnYQg6rKB64uI64ukLiAgUkVBRF9PTkNFKCkg7JmAIFdSSVRFX09OQ0UoKSDsnZgg7KO87J2YIOq5iuydgAorICAgICAg7IKs7Jqp7J2AIOyjvOyWtOynhCDsobDqsbQg6rSA6rOE66W8IOycoOyngO2VmOuKlOuNsCDrj4Tsm4DsnbQg65CgIOyImCDsnojsirXri4jri6QuCisKKyAgKCopIOy7qO2KuOuhpCDsnZjsobTshLHsnYQg7JyE7ZW07ISgIOy7tO2MjOydvOufrOqwgCDsobDqsbTqtIDqs4Trpbwg7JeG7JWg67KE66as64qUIOqyg+ydhCDrp4nslYTslbwKKyAgICAgIO2VqeuLiOuLpC4gIOyjvOydmCDquYrsnYAgUkVBRF9PTkNFKCkg64KYIGF0b21pY3ssNjR9X3JlYWQoKSDsnZgg7IKs7Jqp7J20IOy7qO2KuOuhpAorICAgICAg7J2Y7KG07ISx7J20IOyCrOudvOyngOyngCDslYrqsowg7ZWY64qU642wIOuPhOybgOydhCDspIQg7IiYIOyeiOyKteuLiOuLpC4gIOuNlCDrp47snYAg7KCV67O066W8CisgICAgICDsnITtlbTshKAgIuy7tO2MjOydvOufrCDrsLDrpqzslrQiIOyEueyFmOydhCDssLjqs6DtlZjsi5zquLAg67CU656N64uI64ukLgorCisgICgqKSDsu6jtirjroaQg7J2Y7KG07ISx7J2AIOuztO2GtSDri6Trpbgg7YOA7J6F7J2YIOuwsOumrOyWtOuTpOqzvCDsp53snYQg66ee7LawIOyCrOyaqeuQqeuLiOuLpC4KKworICAoKikg7Luo7Yq466GkIOydmOyhtOyEseydgCDsnbTtlonshLHsnYQg7KCc6rO17ZWY7KeAIC3slYrsirXri4jri6QtLiAg7J207ZaJ7ISx7J20IO2VhOyalO2VmOuLpOuptCwKKyAgICAgIHNtcF9tYigpIOulvCDsgqzsmqntlZjshLjsmpQuCisKKworU01QIOuwsOumrOyWtCDsp53rp57stpTquLAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NQVSDqsIQg7IOB7Zi47J6R7Jqp7J2EIOuLpOujsCDrlYzsl5Ag7J2867aAIO2DgOyeheydmCDrqZTrqqjrpqwg67Cw66as7Ja064qUIO2VreyDgSDsp53snYQg66ee7LawCivsgqzsmqnrkJjslrTslbwg7ZWp64uI64ukLiAg7KCB7KCI7ZWY6rKMIOynneydhCDrp57stpTsp4Ag7JWK7J2AIOy9lOuTnOuKlCDsgqzsi6Tsg4Eg7JeQ65+s7JeQIOqwgOq5neyKteuLiOuLpC4KKwor67KU7JqpIOuwsOumrOyWtOuTpOydgCDrspTsmqkg67Cw66as7Ja064G866as64+EIOynneydhCDrp57stpTsp4Drp4wg7J207ZaJ7ISx7J20IOyXhuuKlCDrjIDrtoDrtoTsnZgg64uk66W4Civtg4DsnoXsnZgg67Cw66as7Ja065Ok6rO864+EIOynneydhCDrp57stqXri4jri6QuICBBQ1FVSVJFIOuwsOumrOyWtOuKlCBSRUxFQVNFIOuwsOumrOyWtOyZgCDsp53snYQKK+unnuy2peuLiOuLpOunjCwg65GYIOuLpCDrspTsmqkg67Cw66as7Ja066W8IO2PrO2VqO2VtCDri6Trpbgg67Cw66as7Ja065Ok6rO864+EIOynneydhCDrp57stpwg7IiYIOyeiOyKteuLiOuLpC4KK+yTsOq4sCDrsLDrpqzslrTripQg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTrgpgg7Luo7Yq466GkIOydmOyhtOyEsSwgQUNRVUlSRSDrsLDrpqzslrQsIFJFTEVBU0UKK+uwsOumrOyWtCwg7J296riwIOuwsOumrOyWtCwg65iQ64qUIOuylOyaqSDrsLDrpqzslrTsmYAg7Ked7J2EIOunnuy2peuLiOuLpC4gIOu5hOyKt+2VmOqyjCDsnb3quLAg67Cw66as7Ja064KYCivsu6jtirjroaQg7J2Y7KG07ISxLCDrmJDripQg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTripQg7JOw6riwIOuwsOumrOyWtOuCmCBBQ1FVSVJFIOuwsOumrOyWtCwKK1JFTEVBU0Ug67Cw66as7Ja0LCDrmJDripQg67KU7JqpIOuwsOumrOyWtOyZgCDsp53snYQg66ee7LaU64qU642wLCDri6TsnYzqs7wg6rCZ7Iq164uI64ukOgorCisJQ1BVIDEJCSAgICAgIENQVSAyCisJPT09PT09PT09PT09PT09CSAgICAgID09PT09PT09PT09PT09PQorCVdSSVRFX09OQ0UoYSwgMSk7CisJPOyTsOq4sCDrsLDrpqzslrQ+CisJV1JJVEVfT05DRShiLCAyKTsgICAgIHggPSBSRUFEX09OQ0UoYik7CisJCQkgICAgICA87J296riwIOuwsOumrOyWtD4KKwkJCSAgICAgIHkgPSBSRUFEX09OQ0UoYSk7CisKK+uYkOuKlDoKKworCUNQVSAxCQkgICAgICBDUFUgMgorCT09PT09PT09PT09PT09PQkgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJYSA9IDE7CisJPOyTsOq4sCDrsLDrpqzslrQ+CisJV1JJVEVfT05DRShiLCAmYSk7ICAgIHggPSBSRUFEX09OQ0UoYik7CisJCQkgICAgICA8642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrQ+CisJCQkgICAgICB5ID0gKng7CisKK+uYkOuKlDoKKworCUNQVSAxCQkgICAgICBDUFUgMgorCT09PT09PT09PT09PT09PQkgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJcjEgPSBSRUFEX09OQ0UoeSk7CisJPOuylOyaqSDrsLDrpqzslrQ+CisJV1JJVEVfT05DRSh5LCAxKTsgICAgIGlmIChyMiA9IFJFQURfT05DRSh4KSkgeworCQkJICAgICAgICAgPOusteyLnOyggSDsu6jtirjroaQg7J2Y7KG07ISxPgorCQkJICAgICAgICAgV1JJVEVfT05DRSh5LCAxKTsKKwkJCSAgICAgIH0KKworCWFzc2VydChyMSA9PSAwIHx8IHIyID09IDApOworCivquLDrs7jsoIHsnLzroZwsIOyXrOq4sOyEnOydmCDsnb3quLAg67Cw66as7Ja064qUICLrjZQg7JmE7ZmU65CcIiDtg4DsnoXsnbwg7IicIOyeiOyWtOuPhCDtla3sg4Eg7KG07J6s7ZW07JW8Civtlanri4jri6QuCisKK1shXSDsk7DquLAg67Cw66as7Ja0IOyVnuydmCDsiqTthqDslrQg7Jik7Y2866CI7J207IWY7J2AIOydvOuwmOyggeycvOuhnCDsnb3quLAg67Cw66as7Ja064KYIOuNsOydtO2EsAor7J2Y7KG07ISxIOuwsOumrOyWtCDrkqTsnZgg66Gc65OcIOyYpO2NvOugiOydtOyFmOqzvCDrp6TsuZjrkKAg6rKD7J206rOgLCDrsJjrjIDrj4Qg66eI7LCs6rCA7KeA7J6F64uI64ukOgorCisJQ1BVIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09ICAgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09CisJV1JJVEVfT05DRShhLCAxKTsgICAgfS0tLS0gICAtLS0+eyAgdiA9IFJFQURfT05DRShjKTsKKwlXUklURV9PTkNFKGIsIDIpOyAgICB9ICAgIFwgLyAgICB7ICB3ID0gUkVBRF9PTkNFKGQpOworCTzsk7DquLAg67Cw66as7Ja0PiAgICAgICAgICAgICAgXCAgICAgICAgPOydveq4sCDrsLDrpqzslrQ+CisJV1JJVEVfT05DRShjLCAzKTsgICAgfSAgICAvIFwgICAgeyAgeCA9IFJFQURfT05DRShhKTsKKwlXUklURV9PTkNFKGQsIDQpOyAgICB9LS0tLSAgIC0tLT57ICB5ID0gUkVBRF9PTkNFKGIpOworCisKK+uplOuqqOumrCDrsLDrpqzslrQg7Iuc7YCA7Iqk7J2YIOyYiAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCivssqvsp7gsIOyTsOq4sCDrsLDrpqzslrTripQg7Iqk7Yag7Ja0IOyYpO2NvOugiOydtOyFmOuTpOydmCDrtoDrtoTsoIEg7Iic7IScIOyEuOyasOq4sOuhnCDrj5nsnpHtlanri4jri6QuCivslYTrnpjsnZgg7J2067Kk7Yq4IOyLnO2AgOyKpOulvCDrs7TshLjsmpQ6CisKKwlDUFUgMQorCT09PT09PT09PT09PT09PT09PT09PT09CisJU1RPUkUgQSA9IDEKKwlTVE9SRSBCID0gMgorCVNUT1JFIEMgPSAzCisJPOyTsOq4sCDrsLDrpqzslrQ+CisJU1RPUkUgRCA9IDQKKwlTVE9SRSBFID0gNQorCivsnbQg7J2067Kk7Yq4IOyLnO2AgOyKpOuKlCDrqZTrqqjrpqwg7J286rSA7ISxIOyLnOyKpO2FnOyXkCDsm5DshozrgbzrpqzsnZgg7Iic7ISc6rCAIOyhtOyerO2VmOyngCDslYrripQg7KeR7ZWpCit7IFNUT1JFIEEsIFNUT1JFIEIsIFNUT1JFIEMgfSDqsIAg7Jet7IucIOybkOyGjOuBvOumrOydmCDsiJzshJzqsIAg7KG07J6s7ZWY7KeAIOyViuuKlCDsp5HtlakKK3sgU1RPUkUgRCwgU1RPUkUgRSB9IOuztOuLpCDrqLzsoIAg7J287Ja064KcIOqyg+ycvOuhnCDsi5zsiqTthZzsnZgg64KY66i47KeAIOyalOyGjOuTpOyXkCDrs7TsnbTrj4TroZ0KK+yghOuLrOuQqeuLiOuLpDoKKworCSstLS0tLS0tKyAgICAgICA6ICAgICAgOgorCXwgICAgICAgfCAgICAgICArLS0tLS0tKworCXwgICAgICAgfC0tLS0tLT58IEM9MyAgfCAgICAgfSAgICAgL1wKKwl8ICAgICAgIHwgIDogICAgKy0tLS0tLSsgICAgIH0tLS0tLSAgXCAgLS0tLS0+IOyLnOyKpO2FnOydmCDrgpjrqLjsp4Ag7JqU7IaM7JeQCisJfCAgICAgICB8ICA6ICAgIHwgQT0xICB8ICAgICB9ICAgICAgICBcLyAgICAgICDrs7Tsl6zsp4gg7IiYIOyeiOuKlCDsnbTrsqTtirjrk6QKKwl8ICAgICAgIHwgIDogICAgKy0tLS0tLSsgICAgIH0KKwl8IENQVSAxIHwgIDogICAgfCBCPTIgIHwgICAgIH0KKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgIH0KKwl8ICAgICAgIHwgICB3d3d3d3d3d3d3d3d3d3d3IH0gICA8LS0tIOyXrOq4sOyEnCDsk7DquLAg67Cw66as7Ja064qUIOuwsOumrOyWtCDslZ7snZgKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgIH0gICAgICAgIOuqqOuToCDsiqTthqDslrTqsIAg67Cw66as7Ja0IOuSpOydmCDsiqTthqDslrQKKwl8ICAgICAgIHwgIDogICAgfCBFPTUgIHwgICAgIH0gICAgICAgIOyghOyXkCDrqZTrqqjrpqwg7Iuc7Iqk7YWc7JeQIOyghOuLrOuQmOuPhOuhnQorCXwgICAgICAgfCAgOiAgICArLS0tLS0tKyAgICAgfSAgICAgICAg7ZWp64uI64ukCisJfCAgICAgICB8LS0tLS0tPnwgRD00ICB8ICAgICB9CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rCisJKy0tLS0tLS0rICAgICAgIDogICAgICA6CisJICAgICAgICAgICAgICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgfCBDUFUgMSDsl5Ag7J2Y7ZW0IOuplOuqqOumrCDsi5zsiqTthZzsl5Ag7KCE64us65CY64qUCisJICAgICAgICAgICAgICAgICAgIHwg7J2866Co7J2YIOyKpO2GoOyWtCDsmKTtjbzroIjsnbTshZjrk6QKKwkgICAgICAgICAgICAgICAgICAgVgorCisKK+uRmOynuCwg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTripQg642w7J207YSwIOydmOyhtOyggSDroZzrk5wg7Jik7Y2866CI7J207IWY65Ok7J2YIOu2gOu2hOyggSDsiJzshJwKK+yEuOyasOq4sOuhnCDrj5nsnpHtlanri4jri6QuICDri6TsnYwg7J2866Co7J2YIOydtOuypO2KuOuTpOydhCDrs7TshLjsmpQ6CisKKwlDUFUgMQkJCUNQVSAyCisJPT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT0KKwkJeyBCID0gNzsgWCA9IDk7IFkgPSA4OyBDID0gJlkgfQorCVNUT1JFIEEgPSAxCisJU1RPUkUgQiA9IDIKKwk87JOw6riwIOuwsOumrOyWtD4KKwlTVE9SRSBDID0gJkIJCUxPQUQgWAorCVNUT1JFIEQgPSA0CQlMT0FEIEMgKGdldHMgJkIpCisJCQkJTE9BRCAqQyAocmVhZHMgQikKKwor7Jes6riw7JeQIOuzhOuLpOuluCDqsJzsnoXsnbQg7JeG64uk66m0LCBDUFUgMSDsnZgg7JOw6riwIOuwsOumrOyWtOyXkOuPhCDrtojqtaztlZjqs6AgQ1BVIDIg64qUIENQVSAxCivsnZgg7J2067Kk7Yq465Ok7J2EIOyZhOyghO2eiCDrrLTsnpHsnITsoIEg7Iic7ISc66GcIOyduOyngO2VmOqyjCDrkKnri4jri6Q6CisKKwkrLS0tLS0tLSsgICAgICAgOiAgICAgIDogICAgICAgICAgICAgICAgOiAgICAgICA6CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgICAgICAgICAgICstLS0tLS0tKyAgfCBDUFUgMiDsl5Ag7J247KeA65CY64qUCisJfCAgICAgICB8LS0tLS0tPnwgQj0yICB8LS0tLS0gICAgICAgLS0tPnwgWS0+OCAgfCAgfCDsl4XrjbDsnbTtirgg7J2067Kk7Yq4CisJfCAgICAgICB8ICA6ICAgICstLS0tLS0rICAgICBcICAgICAgICAgICstLS0tLS0tKyAgfCDsi5ztgIDsiqQKKwl8IENQVSAxIHwgIDogICAgfCBBPTEgIHwgICAgICBcICAgICAtLS0+fCBDLT4mWSB8ICBWCisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgIHwgICAgICAgICstLS0tLS0tKworCXwgICAgICAgfCAgIHd3d3d3d3d3d3d3d3d3d3cgICB8ICAgICAgICA6ICAgICAgIDoKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICAgfCAgICAgICAgOiAgICAgICA6CisJfCAgICAgICB8ICA6ICAgIHwgQz0mQiB8LS0tICAgIHwgICAgICAgIDogICAgICAgOiAgICAgICArLS0tLS0tLSsKKwl8ICAgICAgIHwgIDogICAgKy0tLS0tLSsgICBcICAgfCAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCXwgICAgICAgfC0tLS0tLT58IEQ9NCAgfCAgICAtLS0tLS0tLS0tLT58IEMtPiZCIHwtLS0tLS0+fCAgICAgICB8CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgIHwgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkrLS0tLS0tLSsgICAgICAgOiAgICAgIDogICAgICAgfCAgICAgICAgOiAgICAgICA6ICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICA6ICAgICAgIDogICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIDogICAgICAgOiAgICAgICB8IENQVSAyIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICDrtoTrqoXtnogg7J6Y66q765CcICAgICAgICAtLS0+ICB8ICAgICAgICB8IEItPjcgIHwtLS0tLS0+fCAgICAgICB8CisJICAgIEIg7J2YIOqwkiDsnbjsp4AgKCEpICAgICAgICAgICB8ICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIDogICAgICAgOiAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICBYIOydmCDroZzrk5zqsIAgQiDsnZggICAgLS0tPiAgICBcICAgICAgIHwgWC0+OSAgfC0tLS0tLT58ICAgICAgIHwKKwkgICAg7J286rSA7ISxIOycoOyngOulvCAgICAgICAgICAgICAgICBcICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICDsp4Dsl7Dsi5ztgrQgICAgICAgICAgICAgICAgICAgICAgLS0tLS0+fCBCLT4yICB8ICAgICAgICstLS0tLS0tKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6CisKKwor7JWe7J2YIOyYiOyXkOyEnCwgQ1BVIDIg64qUIChCIOydmCDqsJLsnbQg65CgKSAqQyDsnZgg6rCSIOydveq4sOqwgCBDIOydmCBMT0FEIOuSpOyXkCDsnbTslrTsp5Dsl5Drj4QKK0Ig6rCAIDcg7J20652864qUIOqysOqzvOulvCDslrvsirXri4jri6QuCisKK+2VmOyngOunjCwg66eM7JW9IOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja06rCAIEMg7J2YIOuhnOuTnOyZgCAqQyAo7KaJLCBCKSDsnZgg66Gc65OcIOyCrOydtOyXkAor7J6I7JeI64uk66m0OgorCisJQ1BVIDEJCQlDUFUgMgorCT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09CisJCXsgQiA9IDc7IFggPSA5OyBZID0gODsgQyA9ICZZIH0KKwlTVE9SRSBBID0gMQorCVNUT1JFIEIgPSAyCisJPOyTsOq4sCDrsLDrpqzslrQ+CisJU1RPUkUgQyA9ICZCCQlMT0FEIFgKKwlTVE9SRSBEID0gNAkJTE9BRCBDIChnZXRzICZCKQorCQkJCTzrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtD4KKwkJCQlMT0FEICpDIChyZWFkcyBCKQorCivri6TsnYzqs7wg6rCZ7J20IOuQqeuLiOuLpDoKKworCSstLS0tLS0tKyAgICAgICA6ICAgICAgOiAgICAgICAgICAgICAgICA6ICAgICAgIDoKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICAgICAgICAgICAgKy0tLS0tLS0rCisJfCAgICAgICB8LS0tLS0tPnwgQj0yICB8LS0tLS0gICAgICAgLS0tPnwgWS0+OCAgfAorCXwgICAgICAgfCAgOiAgICArLS0tLS0tKyAgICAgXCAgICAgICAgICArLS0tLS0tLSsKKwl8IENQVSAxIHwgIDogICAgfCBBPTEgIHwgICAgICBcICAgICAtLS0+fCBDLT4mWSB8CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgIHwgICAgICAgICstLS0tLS0tKworCXwgICAgICAgfCAgIHd3d3d3d3d3d3d3d3d3d3cgICB8ICAgICAgICA6ICAgICAgIDoKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICAgfCAgICAgICAgOiAgICAgICA6CisJfCAgICAgICB8ICA6ICAgIHwgQz0mQiB8LS0tICAgIHwgICAgICAgIDogICAgICAgOiAgICAgICArLS0tLS0tLSsKKwl8ICAgICAgIHwgIDogICAgKy0tLS0tLSsgICBcICAgfCAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCXwgICAgICAgfC0tLS0tLT58IEQ9NCAgfCAgICAtLS0tLS0tLS0tLT58IEMtPiZCIHwtLS0tLS0+fCAgICAgICB8CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgIHwgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkrLS0tLS0tLSsgICAgICAgOiAgICAgIDogICAgICAgfCAgICAgICAgOiAgICAgICA6ICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICA6ICAgICAgIDogICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIDogICAgICAgOiAgICAgICB8IENQVSAyIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8IFgtPjkgIHwtLS0tLS0+fCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgIEMg66Gc7J2YIOyKpO2GoOyWtCDslZ7snZggICAgIC0tLT4gICBcICAgZGRkZGRkZGRkZGRkZGRkZGQgICB8ICAgICAgIHwKKwkgIOuqqOuToCDsnbTrsqTtirgg6rKw6rO86rCAICAgICAgICAgICAgIFwgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICDrkqTsnZgg66Gc65Oc7JeQ6rKMICAgICAgICAgICAgICAgICAgIC0tLS0tPnwgQi0+MiAgfC0tLS0tLT58ICAgICAgIHwKKwkgIOuztOydtOqyjCDqsJXsoJztlZzri6QgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgICAgICstLS0tLS0tKworCisKK+yFi+ynuCwg7J296riwIOuwsOumrOyWtOuKlCDroZzrk5wg7Jik7Y2866CI7J207IWY65Ok7JeQ7J2YIOu2gOu2hOyggSDsiJzshJwg7IS47Jqw6riw66GcIOuPmeyeke2VqeuLiOuLpC4KK+yVhOuemOydmCDsnbzroKjsnZgg7J2067Kk7Yq466W8IOu0heyLnOuLpDoKKworCUNQVSAxCQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PQorCQl7IEEgPSAwLCBCID0gOSB9CisJU1RPUkUgQT0xCisJPOyTsOq4sCDrsLDrpqzslrQ+CisJU1RPUkUgQj0yCisJCQkJTE9BRCBCCisJCQkJTE9BRCBBCisKK0NQVSAxIOydgCDsk7DquLAg67Cw66as7Ja066W8IOyzpOyngOunjCwg67OE64uk66W4IOqwnOyeheydtCDsl4bri6TrqbQgQ1BVIDIg64qUIENQVSAxIOyXkOyEnCDtlontlbTsp4QKK+ydtOuypO2KuOydmCDqsrDqs7zrpbwg66y07J6R7JyE7KCBIOyInOyEnOuhnCDsnbjsp4DtlZjqsowg65Cp64uI64ukLgorCisJKy0tLS0tLS0rICAgICAgIDogICAgICA6ICAgICAgICAgICAgICAgIDogICAgICAgOgorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgICAgICAgICAgICArLS0tLS0tLSsKKwl8ICAgICAgIHwtLS0tLS0+fCBBPTEgIHwtLS0tLS0gICAgICAtLS0+fCBBLT4wICB8CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgXCAgICAgICAgICstLS0tLS0tKworCXwgQ1BVIDEgfCAgIHd3d3d3d3d3d3d3d3d3d3cgICBcICAgIC0tLT58IEItPjkgIHwKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICAgIHwgICAgICAgKy0tLS0tLS0rCisJfCAgICAgICB8LS0tLS0tPnwgQj0yICB8LS0tICAgICB8ICAgICAgIDogICAgICAgOgorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgIFwgICAgfCAgICAgICA6ICAgICAgIDogICAgICAgKy0tLS0tLS0rCisJKy0tLS0tLS0rICAgICAgIDogICAgICA6ICAgIFwgICB8ICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0+fCBCLT4yICB8LS0tLS0tPnwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICArLS0tLS0tLSsgICAgICAgfCBDUFUgMiB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwgQS0+MCAgfC0tLS0tLT58ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICA6ICAgICAgIDogICAgICAgKy0tLS0tLS0rCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAgICAgIDogICAgICAgOgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcICAgICArLS0tLS0tLSsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0+fCBBLT4xICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDoKKworCivtlZjsp4Drp4wsIOunjOyVvSDsnb3quLAg67Cw66as7Ja06rCAIEIg7J2YIOuhnOuTnOyZgCBBIOydmCDroZzrk5wg7IKs7J207JeQIOyhtOyerO2VnOuLpOuptDoKKworCUNQVSAxCQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PQorCQl7IEEgPSAwLCBCID0gOSB9CisJU1RPUkUgQT0xCisJPOyTsOq4sCDrsLDrpqzslrQ+CisJU1RPUkUgQj0yCisJCQkJTE9BRCBCCisJCQkJPOydveq4sCDrsLDrpqzslrQ+CisJCQkJTE9BRCBBCisKK0NQVSAxIOyXkCDsnZjtlbQg66eM65Ok7Ja07KeEIOu2gOu2hOyggSDsiJzshJzqsIAgQ1BVIDIg7JeQ64+EIOq3uOuMgOuhnCDsnbjsp4DrkKnri4jri6Q6CisKKwkrLS0tLS0tLSsgICAgICAgOiAgICAgIDogICAgICAgICAgICAgICAgOiAgICAgICA6CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgICAgICAgICAgICstLS0tLS0tKworCXwgICAgICAgfC0tLS0tLT58IEE9MSAgfC0tLS0tLSAgICAgIC0tLT58IEEtPjAgIHwKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICBcICAgICAgICAgKy0tLS0tLS0rCisJfCBDUFUgMSB8ICAgd3d3d3d3d3d3d3d3d3d3dyAgIFwgICAgLS0tPnwgQi0+OSAgfAorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgICAgfCAgICAgICArLS0tLS0tLSsKKwl8ICAgICAgIHwtLS0tLS0+fCBCPTIgIHwtLS0gICAgIHwgICAgICAgOiAgICAgICA6CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgXCAgICB8ICAgICAgIDogICAgICAgOiAgICAgICArLS0tLS0tLSsKKwkrLS0tLS0tLSsgICAgICAgOiAgICAgIDogICAgXCAgIHwgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLT58IEItPjIgIHwtLS0tLS0+fCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICstLS0tLS0tKyAgICAgICB8IENQVSAyIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgOiAgICAgICA6ICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICA6ICAgICAgIDogICAgICAgfCAgICAgICB8CisJICDsl6zquLDshJwg7J296riwIOuwsOumrOyWtOuKlCAgIC0tLS0+ICAgXCAgcnJycnJycnJycnJycnJycnIgICB8ICAgICAgIHwKKwkgIEIg66Gc7J2YIOyKpO2GoOyWtCDsoITsnZggICAgICAgICAgICAgIFwgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgIOuqqOuToCDqsrDqs7zrpbwgQ1BVIDIg7JeQICAgICAgICAgICAgIC0tLS0+fCBBLT4xICB8LS0tLS0tPnwgICAgICAgfAorCSAg67O07J2064+E66GdIO2VnOuLpCAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgICAgICArLS0tLS0tLSsKKworCivrjZQg7JmE67K97ZWcIOyEpOuqheydhCDsnITtlbQsIEEg7J2YIOuhnOuTnOqwgCDsnb3quLAg67Cw66as7Ja0IOyVnuqzvCDrkqTsl5Ag7J6I7Jy866m0IOyWtOuWu+qyjCDrkKDsp4AKK+yDneqwge2VtCDrtIXsi5zri6Q6CisKKwlDUFUgMQkJCUNQVSAyCisJPT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT0KKwkJeyBBID0gMCwgQiA9IDkgfQorCVNUT1JFIEE9MQorCTzsk7DquLAg67Cw66as7Ja0PgorCVNUT1JFIEI9MgorCQkJCUxPQUQgQgorCQkJCUxPQUQgQSBbZmlyc3QgbG9hZCBvZiBBXQorCQkJCTzsnb3quLAg67Cw66as7Ja0PgorCQkJCUxPQUQgQSBbc2Vjb25kIGxvYWQgb2YgQV0KKworQSDsnZgg66Gc65OcIOuRkOqwnOqwgCDrqqjrkZAgQiDsnZgg66Gc65OcIOuSpOyXkCDsnojsp4Drp4wsIOyEnOuhnCDri6Trpbgg6rCS7J2EIOyWu+yWtOyYrCDsiJgKK+yeiOyKteuLiOuLpDoKKworCSstLS0tLS0tKyAgICAgICA6ICAgICAgOiAgICAgICAgICAgICAgICA6ICAgICAgIDoKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICAgICAgICAgICAgKy0tLS0tLS0rCisJfCAgICAgICB8LS0tLS0tPnwgQT0xICB8LS0tLS0tICAgICAgLS0tPnwgQS0+MCAgfAorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgIFwgICAgICAgICArLS0tLS0tLSsKKwl8IENQVSAxIHwgICB3d3d3d3d3d3d3d3d3d3d3ICAgXCAgICAtLS0+fCBCLT45ICB8CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgICB8ICAgICAgICstLS0tLS0tKworCXwgICAgICAgfC0tLS0tLT58IEI9MiAgfC0tLSAgICAgfCAgICAgICA6ICAgICAgIDoKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICBcICAgIHwgICAgICAgOiAgICAgICA6ICAgICAgICstLS0tLS0tKworCSstLS0tLS0tKyAgICAgICA6ICAgICAgOiAgICBcICAgfCAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tPnwgQi0+MiAgfC0tLS0tLT58ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgKy0tLS0tLS0rICAgICAgIHwgQ1BVIDIgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICA6ICAgICAgIDogICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIDogICAgICAgOiAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8IEEtPjAgIHwtLS0tLS0+fCAxc3QgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgIOyXrOq4sOyEnCDsnb3quLAg67Cw66as7Ja064qUICAgLS0tLT4gICBcICBycnJycnJycnJycnJycnJyciAgIHwgICAgICAgfAorCSAgQiDroZzsnZgg7Iqk7Yag7Ja0IOyghOydmCAgICAgICAgICAgICAgXCAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAg66qo65OgIOqysOqzvOulvCBDUFUgMiDsl5AgICAgICAgICAgICAgLS0tLT58IEEtPjEgIHwtLS0tLS0+fCAybmQgICB8CisJICDrs7TsnbTrj4TroZ0g7ZWc64ukICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgICAgICstLS0tLS0tKworCisKK+2VmOyngOunjCBDUFUgMSDsl5DshJzsnZggQSDsl4XrjbDsnbTtirjripQg7J296riwIOuwsOumrOyWtOqwgCDsmYTro4zrkJjquLAg7KCE7JeQ64+EIOuztOydvCDsiJjrj4QKK+yeiOq4tCDtlanri4jri6Q6CisKKwkrLS0tLS0tLSsgICAgICAgOiAgICAgIDogICAgICAgICAgICAgICAgOiAgICAgICA6CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgICAgICAgICAgICstLS0tLS0tKworCXwgICAgICAgfC0tLS0tLT58IEE9MSAgfC0tLS0tLSAgICAgIC0tLT58IEEtPjAgIHwKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICBcICAgICAgICAgKy0tLS0tLS0rCisJfCBDUFUgMSB8ICAgd3d3d3d3d3d3d3d3d3d3dyAgIFwgICAgLS0tPnwgQi0+OSAgfAorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgICAgfCAgICAgICArLS0tLS0tLSsKKwl8ICAgICAgIHwtLS0tLS0+fCBCPTIgIHwtLS0gICAgIHwgICAgICAgOiAgICAgICA6CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgXCAgICB8ICAgICAgIDogICAgICAgOiAgICAgICArLS0tLS0tLSsKKwkrLS0tLS0tLSsgICAgICAgOiAgICAgIDogICAgXCAgIHwgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLT58IEItPjIgIHwtLS0tLS0+fCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICstLS0tLS0tKyAgICAgICB8IENQVSAyIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgOiAgICAgICA6ICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgICAgICA6ICAgICAgIDogICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0+fCBBLT4xICB8LS0tLS0tPnwgMXN0ICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnJycnJycnJycnJycnJycnIgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEtPjEgIHwtLS0tLS0+fCAybmQgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgICAgICstLS0tLS0tKworCisKK+yXrOq4sOyEnCDrs7TsnqXrkJjripQg6rG0LCDrp4zslb0gQiDsnZgg66Gc65Oc6rCAIEIgPT0gMiDrnbzripQg6rKw6rO866W8IOu0pOuLpOuptCwgQSDsl5DsnZgg65GQ67KI7Ke4CivroZzrk5zripQg7ZWt7IOBIEEgPT0gMSDsnYQg67O06rKMIOuQoCDqsoPsnbTrnbzripQg6rKB64uI64ukLiAgQSDsl5DsnZgg7LKr67KI7Ke4IOuhnOuTnOyXkOuKlCDqt7jrn7AKK+uztOyepeydtCDsl4bsirXri4jri6Q7IEEgPT0gMCDsnbTqsbDrgpggQSA9PSAxIOydtOqxsOuCmCDrkZgg7KSRIO2VmOuCmOydmCDqsrDqs7zrpbwg67O06rKMIOuQoOqygeuLiOuLpC4KKworCivsnb3quLAg66mU66qo66asIOuwsOumrOyWtCBWUyDroZzrk5wg7JiI7LihCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK+unjuydgCBDUFXrk6TsnbQg66Gc65Oc66W8IOyYiOy4oeyggeycvOuhnCAoc3BlY3VsYXRpdmVseSkg7ZWp64uI64ukOiDslrTrlqQg642w7J207YSw66W8IOuplOuqqOumrOyXkOyEnAor66Gc65Oc7ZW07JW8IO2VmOqyjCDrkKDsp4Ag7JiI7Lih7J2EIO2WiOuLpOuptCwg7ZW064u5IOuNsOydtO2EsOulvCDroZzrk5ztlZjripQg7J247Iqk7Yq465+t7IWY7J2EIOyLpOygnOuhnOuKlAor7JWE7KeBIOunjOuCmOyngCDslYrslZjrjZTrnbzrj4Qg64uk66W4IOuhnOuTnCDsnpHsl4XsnbQg7JeG7Ja0IOuyhOyKpCAoYnVzKSDqsIAg7JWE66y0IOydvOuPhCDtlZjqs6Ag7J6I7KeACivslYrri6TrqbQsIOq3uCDrjbDsnbTthLDrpbwg66Gc65Oc7ZWp64uI64ukLiAg7J207ZuE7JeQIOyLpOygnCDroZzrk5wg7J247Iqk7Yq465+t7IWY7J20IOyLpO2WieuQmOuptCBDUFUg6rCACivsnbTrr7gg6re4IOqwkuydhCDqsIDsp4Dqs6Ag7J6I6riwIOuVjOusuOyXkCDqt7gg66Gc65OcIOyduOyKpO2KuOufreyFmOydgCDsponsi5wg7JmE66OM65Cp64uI64ukLgorCivtlbTri7kgQ1BVIOuKlCDsi6TsoJzroZzripQg6re4IOqwkuydtCDtlYTsmpTsuZgg7JWK7JWY64uk64qUIOyCrOyLpOydtCDrgpjspJHsl5Ag65Oc65+s64KgIOyImOuPhCDsnojripTrjbAgLQor7ZW064u5IOuhnOuTnCDsnbjsiqTtirjrn63shZjsnbQg67iM656c7LmY66GcIOyasO2ajOuQmOqxsOuCmCDtlojsnYQg7IiYIOyeiOqyoOyjoCAtICwg6re466CH6rKMIOuQmOuptCDslZ7shJwKK+ydveyWtOuRlCDqsJLsnYQg67KE66as6rGw64KYIOuCmOykkeydmCDsgqzsmqnsnYQg7JyE7ZW0IOy6kOyLnOyXkCDrhKPslrTrkZgg7IiYIOyeiOyKteuLiOuLpC4KKwor64uk7J2M7J2EIOyDneqwge2VtCDrtIXsi5zri6Q6CisKKwlDUFUgMQkJCUNQVSAyCisJPT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT0KKwkJCQlMT0FEIEIKKwkJCQlESVZJREUJCX0g64KY64iE6riwIOuqheugueydgCDsnbzrsJjsoIHsnLzroZwKKwkJCQlESVZJREUJCX0g6ri0IOyLnOqwhOydhCDtlYTsmpTroZwg7ZWp64uI64ukCisJCQkJTE9BRCBBCisKK+uKlCDsnbTroIfqsowg65CgIOyImCDsnojsirXri4jri6Q6CisKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgICAgICstLS0tLS0tKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tPnwgQi0+MiAgfC0tLS0tLT58ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgQ1BVIDIgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDpESVZJREUgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwnrgpjriITquLAg7ZWY64qQ6528IOuwlOyBnCAgICAgICAtLS0+ICAgICAgIC0tLT58IEEtPjAgIHx+fn5+ICAgfCAgICAgICB8CisJQ1BVIOuKlCBBIOydmCBMT0FEIOulvCAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgIH4gICB8ICAgICAgIHwKKwnsmIjsuKHtlbTshJwg7IiY7ZaJ7ZWc64ukICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICB+ICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOkRJVklERSB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgfiAgIHwgICAgICAgfAorCeuCmOuIhOq4sOqwgCDrgZ3rgpjrqbQgICAgICAgLS0tPiAgICAgLS0tPiAgICAgOiAgICAgICA6ICAgfi0tPnwgICAgICAgfAorCUNQVSDripQg7ZW064u5IExPQUQg66W8ICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgICAgIHwgICAgICAgfAorCeymieqwgSDsmYTro4ztlZzri6QgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICAgICAgKy0tLS0tLS0rCisKKwor7J296riwIOuwsOumrOyWtOuCmCDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOulvCDrkZDrsojsp7gg66Gc65OcIOyngeyghOyXkCDrhpPripTri6TrqbQ6CisKKwlDUFUgMQkJCUNQVSAyCisJPT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT0KKwkJCQlMT0FEIEIKKwkJCQlESVZJREUKKwkJCQlESVZJREUKKwkJCQk87J296riwIOuwsOumrOyWtD4KKwkJCQlMT0FEIEEKKwor7JiI7Lih7Jy866GcIOyWu+yWtOynhCDqsJLsnYAg7IKs7Jqp65CcIOuwsOumrOyWtOydmCDtg4DsnoXsl5Ag65Sw65287IScIO2VtOuLuSDqsJLsnbQg7Jiz7J2A7KeAIOqygO2GoOuQmOqyjAor65Cp64uI64ukLiAg66eM7JW9IO2VtOuLuSDrqZTrqqjrpqwg7JiB7Jet7JeQIOuzgO2ZlOqwgCDsl4bsl4jri6TrqbQsIOyYiOy4oeycvOuhnCDslrvslrTrkZDsl4jrjZgg6rCS7J20CivsgqzsmqnrkKnri4jri6Q6CisKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgICAgICstLS0tLS0tKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tPnwgQi0+MiAgfC0tLS0tLT58ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgQ1BVIDIgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDpESVZJREUgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwnrgpjriITquLAg7ZWY64qQ6528IOuwlOyBnCAgICAgICAtLS0+ICAgICAgIC0tLT58IEEtPjAgIHx+fn5+ICAgfCAgICAgICB8CisJQ1BVIOuKlCBBIOydmCBMT0FEIOulvCAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgIH4gICB8ICAgICAgIHwKKwnsmIjsuKHtlZzri6QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgIH4gICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6RElWSURFIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICB+ICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgIH4gICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycnJycnJycnJycnJycnJyfiAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICB+ICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgIH4tLT58ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICAgICAgKy0tLS0tLS0rCisKKwor7ZWY7KeA66eMIOuLpOuluCBDUFUg7JeQ7IScIOyXheuNsOydtO2KuOuCmCDrrLTtmqjtmZTqsIAg7J6I7JeI64uk66m0LCDqt7gg7JiI7Lih7J2AIOustO2aqO2ZlOuQmOqzoCDqt7gg6rCS7J2ACivri6Tsi5wg7J297ZiA7KeR64uI64ukOgorCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgICAgICArLS0tLS0tLSsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLT58IEItPjIgIHwtLS0tLS0+fCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICB8IENQVSAyIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6RElWSURFIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJ64KY64iE6riwIO2VmOuKkOudvCDrsJTsgZwgICAgICAgLS0tPiAgICAgICAtLS0+fCBBLT4wICB8fn5+fiAgIHwgICAgICAgfAorCUNQVSDripQgQSDsnZggTE9BRCDrpbwgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICB+ICAgfCAgICAgICB8CisJ7JiI7Lih7ZWc64ukICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICB+ICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOkRJVklERSB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgfiAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICB+ICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnJycnJycnJycnJycnJycnIgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCeyYiOy4oeyEsSDrj5nsnpHsnYAg66y07Zqo7ZmUIOuQmOqzoCAgICAtLS0+ICAgLS0tPnwgQS0+MSAgfC0tLS0tLT58ICAgICAgIHwKKwnsl4XrjbDsnbTtirjrkJwg6rCS7J20IOuLpOyLnCDsnb3tmIDsp4Tri6QgICAgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgICAgICstLS0tLS0tKworCisKK+ydtO2WieyEsQorLS0tLS0tCisKK+ydtO2WieyEsSh0cmFuc2l0aXZpdHkp7J2AIOyLpOygnOydmCDsu7Ttk6jthLAg7Iuc7Iqk7YWc7JeQ7IScIO2VreyDgSDsoJzqs7XrkJjsp4DripQg7JWK64qULCDsiJzshJwKK+unnuy2lOq4sOyXkCDrjIDtlZwg7IOB64u57Z6IIOyngeq0gOyggeyduCDqsJzrhZDsnoXri4jri6QuICDri6TsnYzsnZgg7JiI6rCAIOydtO2WieyEseydhCDrs7Tsl6zspI3ri4jri6Q6CisKKwlDUFUgMQkJCUNQVSAyCQkJQ1BVIDMKKwk9PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PQorCQl7IFggPSAwLCBZID0gMCB9CisJU1RPUkUgWD0xCQlMT0FEIFgJCQlTVE9SRSBZPTEKKwkJCQk867KU7JqpIOuwsOumrOyWtD4JCTzrspTsmqkg67Cw66as7Ja0PgorCQkJCUxPQUQgWQkJCUxPQUQgWAorCitDUFUgMiDsnZggWCDroZzrk5zqsIAgMeydhCDrpqzthLTtlojqs6AgWSDroZzrk5zqsIAgMOydhCDrpqzthLTtlojri6Tqs6Ag7ZW067SF7Iuc64ukLiAg7J2064qUIENQVSAyIOydmAorWCDroZzrk5zqsIAgQ1BVIDEg7J2YIFgg7Iqk7Yag7Ja0IOuSpOyXkCDsnbTro6jslrTsoYzqs6AgQ1BVIDIg7J2YIFkg66Gc65Oc64qUIENQVSAzIOydmCBZIOyKpO2GoOyWtAor7KCE7JeQIOydtOujqOyWtOyhjOydjOydhCDsnZjrr7jtlanri4jri6QuICDqt7jrn7wgIkNQVSAzIOydmCBYIOuhnOuTnOuKlCAw7J2EIOumrO2EtO2VoCDsiJgg7J6I64KY7JqUPyIKKworQ1BVIDIg7J2YIFgg66Gc65Oc64qUIENQVSAxIOydmCDsiqTthqDslrQg7ZuE7JeQIOydtOujqOyWtOyhjOycvOuLiCwgQ1BVIDMg7J2YIFgg66Gc65Oc64qUIDHsnYQKK+umrO2EtO2VmOuKlOqyjCDsnpDsl7DsiqTrn73sirXri4jri6QuICDsnbTrn7Ag7IOd6rCB7J20IOydtO2WieyEseydmCDtlZwg7JiI7J6F64uI64ukOiBDUFUgQSDsl5DshJwg7Iuk7ZaJ65CcCivroZzrk5zqsIAgQ1BVIEIg7JeQ7ISc7J2YIOqwmeydgCDrs4DsiJjsl5Ag64yA7ZWcIOuhnOuTnOulvCDrkqTrlLDrpbjri6TrqbQsIENQVSBBIOydmCDroZzrk5zripQgQ1BVIEIKK+ydmCDroZzrk5zqsIAg64K064aT7J2AIOqwkuqzvCDqsJnqsbDrgpgg6re4IO2bhOydmCDqsJLsnYQg64K064aT7JWE7JW8IO2VqeuLiOuLpC4KKwor66as64iF7IqkIOy7pOuEkOyXkOyEnCDrspTsmqkg67Cw66as7Ja07J2YIOyCrOyaqeydgCDsnbTtlonshLHsnYQg67O07J6l7ZWp64uI64ukLiAg65Sw65287IScLCDslZ7snZgg7JiI7JeQ7IScCitDUFUgMiDsnZggWCDroZzrk5zqsIAgMeydhCwgWSDroZzrk5zripQgMOydhCDrpqzthLTtlojri6TrqbQsIENQVSAzIOydmCBYIOuhnOuTnOuKlCDrsJjrk5zsi5wgMeydhAor66as7YS07ZWp64uI64ukLgorCivtlZjsp4Drp4wsIOydveq4sOuCmCDsk7DquLAg67Cw66as7Ja07JeQIOuMgO2VtOyEnOuKlCDsnbTtlonshLHsnbQg67O07J6l65CY7KeAIC3slYrsirXri4jri6QtLiAg7JiI66W8IOuTpOyWtCwKK+yVnuydmCDsmIjsl5DshJwgQ1BVIDIg7J2YIOuylOyaqSDrsLDrpqzslrTqsIAg7JWE656Y7LKY65+8IOydveq4sCDrsLDrpqzslrTroZwg67CU64CQIOqyveyasOulvCDsg53qsIHtlbQKK+u0heyLnOuLpDoKKworCUNQVSAxCQkJQ1BVIDIJCQlDUFUgMworCT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09CisJCXsgWCA9IDAsIFkgPSAwIH0KKwlTVE9SRSBYPTEJCUxPQUQgWAkJCVNUT1JFIFk9MQorCQkJCTzsnb3quLAg67Cw66as7Ja0PgkJPOuylOyaqSDrsLDrpqzslrQ+CisJCQkJTE9BRCBZCQkJTE9BRCBYCisKK+ydtCDsvZTrk5zripQg7J207ZaJ7ISx7J2EIOqwluyngCDslYrsirXri4jri6Q6IOydtCDsmIjsl5DshJzripQsIENQVSAyIOydmCBYIOuhnOuTnOqwgCAx7J2ECivrpqzthLTtlZjqs6AsIFkg66Gc65Oc64qUIDDsnYQg66as7YS07ZWY7KeA66eMIENQVSAzIOydmCBYIOuhnOuTnOqwgCAw7J2EIOumrO2EtO2VmOuKlCDqsoPrj4Qg7JmE7KCE7Z6ICivtlanrspXsoIHsnoXri4jri6QuCisKK0NQVSAyIOydmCDsnb3quLAg67Cw66as7Ja06rCAIOyekOyLoOydmCDsnb3quLDripQg7Iic7ISc66W8IOunnuy2sOykmOuPhCwgQ1BVIDEg7J2YIOyKpO2GoOyWtOyZgOydmAor7Iic7ISc66W8IOunnuy2sOykgOuLpOqzoOuKlCDrs7TsnqXtlaAg7IiYIOyXhuuLpOuKlOqyjCDtlbXsi6zsnoXri4jri6QuICDrlLDrnbzshJwsIENQVSAxIOqzvCBDUFUgMiDqsIAKK+uyhO2NvOuCmCDsupDsi5zrpbwg6rO17Jyg7ZWY64qUIOyLnOyKpO2FnOyXkOyEnCDsnbQg7JiI7KCcIOy9lOuTnOqwgCDsi6TtlonrkJzri6TrqbQsIENQVSAyIOuKlCBDUFUgMSDsnbQKK+yTtCDqsJLsl5Ag7KKAIOu5qOumrCDsoJHqt7ztlaAg7IiYIOyeiOydhCDqsoPsnoXri4jri6QuICDrlLDrnbzshJwgQ1BVIDEg6rO8IENQVSAyIOydmCDsoJHqt7zsnLzroZwKK+yhsO2VqeuQnCDsiJzshJzrpbwg66qo65OgIENQVSDqsIAg64+Z7J2Y7ZWgIOyImCDsnojrj4TroZ0g7ZWY6riwIOychO2VtCDrspTsmqkg67Cw66as7Ja06rCAIO2VhOyalO2VqeuLiOuLpC4KKwor67KU7JqpIOuwsOumrOyWtOuKlCAi6riA66Gc67KMIOydtO2WieyEsSLsnYQg7KCc6rO17ZW07IScLCDrqqjrk6AgQ1BVIOuTpOydtCDsmKTtjbzroIjsnbTshZjrk6TsnZgg7Iic7ISc7JeQCivrj5nsnZjtlZjqsowg7ZWgIOqyg+yeheuLiOuLpC4gIOuwmOuptCwgcmVsZWFzZS1hY3F1aXJlIOyhsO2VqeydgCAi66Gc7LusIOydtO2WieyEsSIg66eM7J2ECivsoJzqs7XtlbTshJwsIO2VtOuLuSDsobDtlansnbQg7IKs7Jqp65CcIENQVSDrk6Trp4zsnbQg7ZW064u5IOyVoeyEuOyKpOuTpOydmCDsobDtlanrkJwg7Iic7ISc7JeQIOuPmeydmO2VqOydtAor67O07J6l65Cp64uI64ukLiAg7JiI66W8IOuTpOyWtCwg7KG06rK97Iqk65+wIEhlcm1hbiBIb2xsZXJpdGgg7J2YIEMg7L2U65Oc66GcIOuztOuptDoKKworCWludCB1LCB2LCB4LCB5LCB6OworCisJdm9pZCBjcHUwKHZvaWQpCisJeworCQlyMCA9IHNtcF9sb2FkX2FjcXVpcmUoJngpOworCQlXUklURV9PTkNFKHUsIDEpOworCQlzbXBfc3RvcmVfcmVsZWFzZSgmeSwgMSk7CisJfQorCisJdm9pZCBjcHUxKHZvaWQpCisJeworCQlyMSA9IHNtcF9sb2FkX2FjcXVpcmUoJnkpOworCQlyNCA9IFJFQURfT05DRSh2KTsKKwkJcjUgPSBSRUFEX09OQ0UodSk7CisJCXNtcF9zdG9yZV9yZWxlYXNlKCZ6LCAxKTsKKwl9CisKKwl2b2lkIGNwdTIodm9pZCkKKwl7CisJCXIyID0gc21wX2xvYWRfYWNxdWlyZSgmeik7CisJCXNtcF9zdG9yZV9yZWxlYXNlKCZ4LCAxKTsKKwl9CisKKwl2b2lkIGNwdTModm9pZCkKKwl7CisJCVdSSVRFX09OQ0UodiwgMSk7CisJCXNtcF9tYigpOworCQlyMyA9IFJFQURfT05DRSh1KTsKKwl9CisKK2NwdTAoKSwgY3B1MSgpLCDqt7jrpqzqs6AgY3B1MigpIOuKlCBzbXBfc3RvcmVfcmVsZWFzZSgpL3NtcF9sb2FkX2FjcXVpcmUoKSDsjI3snZgKK+yXsOqysOydhCDthrXtlZwg66Gc7LusIOydtO2WieyEseyXkCDrj5nssLjtlZjqs6Ag7J6I7Jy866+A66GcLCDri6TsnYzqs7wg6rCZ7J2AIOqysOqzvOuKlCDrgpjsmKTsp4Ag7JWK7J2ECivqsoHri4jri6Q6CisKKwlyMCA9PSAxICYmIHIxID09IDEgJiYgcjIgPT0gMQorCivrjZQg64KY7JWE6rCA7IScLCBjcHUwKCkg7JmAIGNwdTEoKSDsgqzsnbTsnZggcmVsZWFzZS1hY3F1aXJlIOq0gOqzhOuhnCDsnbjtlbQsIGNwdTEoKSDsnYAKK2NwdTAoKSDsnZgg7JOw6riw66W8IOu0kOyVvOunjCDtlZjrr4DroZwsIOuLpOydjOqzvCDqsJnsnYAg6rKw6rO864+EIOyXhuydhCDqsoHri4jri6Q6CisKKwlyMSA9PSAxICYmIHI1ID09IDAKKwor7ZWY7KeA66eMLCByZWxlYXNlLWFjcXVpcmUg7YOA64+Z7ISx7J2AIOuPmeywuO2VnCBDUFUg65Ok7JeQ66eMIOyggeyaqeuQmOuvgOuhnCBjcHUzKCkg7JeQ64qUCivsoIHsmqnrkJjsp4Ag7JWK7Iq164uI64ukLiAg65Sw65287IScLCDri6TsnYzqs7wg6rCZ7J2AIOqysOqzvOqwgCDqsIDriqXtlanri4jri6Q6CisKKwlyMCA9PSAwICYmIHIxID09IDEgJiYgcjIgPT0gMSAmJiByMyA9PSAwICYmIHI0ID09IDAKKwor67mE7Iq37ZWY6rKMLCDri6TsnYzqs7wg6rCZ7J2AIOqysOqzvOuPhCDqsIDriqXtlanri4jri6Q6CisKKwlyMCA9PSAwICYmIHIxID09IDEgJiYgcjIgPT0gMSAmJiByMyA9PSAwICYmIHI0ID09IDAgJiYgcjUgPT0gMQorCitjcHUwKCksIGNwdTEoKSwg6re466as6rOgIGNwdTIoKSDripQg6re465Ok7J2YIOydveq4sOyZgCDsk7DquLDrpbwg7Iic7ISc64yA66GcIOuztOqyjCDrkJjsp4Drp4wsCityZWxlYXNlLWFjcXVpcmUg7LK07J247JeQIOq0gOyXrOuQmOyngCDslYrsnYAgQ1BVIOuTpOydgCDqt7gg7Iic7ISc7JeQIOydtOqyrOydhCDqsIDsp4gg7IiYCivsnojsirXri4jri6QuICDsnbTrn7Ag7J206rKs7J2AIHNtcF9sb2FkX2FjcXVpcmUoKSDsmYAgc21wX3N0b3JlX3JlbGVhc2UoKSDsnZgg6rWs7ZiE7JeQCivsgqzsmqnrkJjripQg7JmE7ZmU65CcIOuplOuqqOumrCDrsLDrpqzslrQg7J247Iqk7Yq465+t7IWY65Ok7J2AIO2VreyDgSDrsLDrpqzslrQg7JWe7J2YIOyKpO2GoOyWtOuTpOydhCDrkqTsnZgKK+uhnOuTnOuTpOyXkCDslZ7shLjsmrgg7ZWE7JqU64qUIOyXhuuLpOuKlCDsgqzsi6Tsl5DshJwg6riw7J247ZWp64uI64ukLiAg7J20IOunkOydgCBjcHUzKCkg64qUIGNwdTAoKSDsnZgKK3Ug66Gc7J2YIOyKpO2GoOyWtOulvCBjcHUxKCkg7J2YIHYg66Gc67aA7YSw7J2YIOuhnOuTnCDrkqTsl5Ag7J287Ja064KcIOqyg+ycvOuhnCDrs7wg7IiYIOyeiOuLpOuKlAor65y77J6F64uI64ukLCBjcHUwKCkg7JmAIGNwdTEoKSDsnYAg7J20IOuRkCDsmKTtjbzroIjsnbTshZjsnbQg7J2Y64+E65CcIOyInOyEnOuMgOuhnCDsnbzslrTrgqzsnYzsl5AKK+uqqOuRkCDrj5nsnZjtlZjripTrjbDrj4Qg66eQ7J6F64uI64ukLgorCivtlZjsp4Drp4wsIHNtcF9sb2FkX2FjcXVpcmUoKSDripQg66eI7Iig7J20IOyVhOuLmOydhCDrqoXsi6ztlZjsi5zquLAg67CU656N64uI64ukLiAg6rWs7LK07KCB7Jy866GcLAor7J20IO2VqOyImOuKlCDri6jsiJztnogg7Iic7IScIOq3nOy5meydhCDsp4DtgqTrqbAg7J247J6Q66Gc67aA7YSw7J2YIOydveq4sOulvCDsiJjtlontlanri4jri6QuICDsnbTqsoPsnYAKK+yWtOuWpCDtirnsoJXtlZwg6rCS7J20IOydve2ekCDqsoPsnbjsp4DripQg67O07J6l7ZWY7KeAIC3slYrsirXri4jri6QtLiAg65Sw65287IScLCDri6TsnYzqs7wg6rCZ7J2AIOqysOqzvOuPhAor6rCA64ql7ZWp64uI64ukOgorCisJcjAgPT0gMCAmJiByMSA9PSAwICYmIHIyID09IDAgJiYgcjUgPT0gMAorCivsnbTrn7Ag6rKw6rO864qUIOyWtOuWpCDqsoPrj4Qg7J6s67Cw7LmYIOuQmOyngCDslYrripQsIOyInOywqOyggSDsnbzqtIDshLHsnYQg6rCA7KeEIOqwgOyDgeydmAor7Iuc7Iqk7YWc7JeQ7ISc64+EIOydvOyWtOuCoCDsiJgg7J6I7J2M7J2EIOq4sOyWte2VtCDrkZDsi5zquLAg67CU656N64uI64ukLgorCivri6Tsi5wg66eQ7ZWY7KeA66eMLCDri7nsi6DsnZgg7L2U65Oc6rCAIOq4gOuhnOuyjCDsnbTtlonshLHsnYQg7ZWE7JqU66GcIO2VnOuLpOuptCwg67KU7JqpIOuwsOumrOyWtOulvAor7IKs7Jqp7ZWY7Iut7Iuc7JikLgorCisKKz09PT09PT09PT09PT09PT09PQor66qF7Iuc7KCBIOy7pOuEkCDrsLDrpqzslrQKKz09PT09PT09PT09PT09PT09PQorCivrpqzriIXsiqQg7Luk64SQ7J2AIOyEnOuhnCDri6Trpbgg64uo6rOE7JeQ7IScIOuPmeyeke2VmOuKlCDri6TslpHtlZwg67Cw66as7Ja065Ok7J2EIOqwgOyngOqzoCDsnojsirXri4jri6Q6CisKKyAgKCopIOy7tO2MjOydvOufrCDrsLDrpqzslrQuCisKKyAgKCopIENQVSDrqZTrqqjrpqwg67Cw66as7Ja0LgorCisgICgqKSBNTUlPIOyTsOq4sCDrsLDrpqzslrQuCisKKwor7Lu07YyM7J2865+sIOuwsOumrOyWtAorLS0tLS0tLS0tLS0tLS0tCisKK+umrOuIheyKpCDsu6TrhJDsnYAg7Lu07YyM7J2865+s6rCAIOuplOuqqOumrCDslaHshLjsiqTrpbwg7J6s67Cw7LmYIO2VmOuKlCDqsoPsnYQg66eJ7JWE7KO864qUIOuqheyLnOyggeyduAor7Lu07YyM7J2865+sIOuwsOumrOyWtOulvCDqsIDsp4Dqs6Ag7J6I7Iq164uI64ukOgorCisJYmFycmllcigpOworCivsnbTqsbQg67KU7JqpIOuwsOumrOyWtOyeheuLiOuLpCAtLSBiYXJyaWVyKCkg7J2YIOydveq4sC3snb3quLAg64KYIOyTsOq4sC3sk7DquLAg67OA7KKF7J2AIOyXhuyKteuLiOuLpC4KK+2VmOyngOunjCwgUkVBRF9PTkNFKCkg7JmAIFdSSVRFX09OQ0UoKSDripQg7Yq57KCVIOyVoeyEuOyKpOuTpOyXkCDrjIDtlbTshJzrp4wg64+Z7J6R7ZWY64qUCitiYXJyaWVyKCkg7J2YIOyZhO2ZlOuQnCDtmJXtg5zroZwg67O8IOyImCDsnojsirXri4jri6QuCisKK2JhcnJpZXIoKSDtlajsiJjripQg64uk7J2M6rO8IOqwmeydgCDtmqjqs7zrpbwg6rCW7Iq164uI64ukOgorCisgKCopIOy7tO2MjOydvOufrOqwgCBiYXJyaWVyKCkg65Kk7J2YIOyVoeyEuOyKpOuTpOydtCBiYXJyaWVyKCkg7JWe7J2YIOyVoeyEuOyKpOuztOuLpCDslZ7snLzroZwKKyAgICAg7J6s67Cw7LmY65CY7KeAIOuqu+2VmOqyjCDtlanri4jri6QuICDsmIjrpbwg65Ok7Ja0LCDsnbjthLDrn73tirgg7ZW465Ok65+sIOy9lOuTnOyZgCDsnbjthLDrn73tirgg64u57ZWcCisgICAgIOy9lOuTnCDsgqzsnbTsnZgg7Ya17Iug7J2EIOyLoOykke2eiCDtlZjquLAg7JyE7ZW0IOyCrOyaqeuQoCDsiJgg7J6I7Iq164uI64ukLgorCisgKCopIOujqO2UhOyXkOyEnCwg7Lu07YyM7J2865+s6rCAIOujqO2UhCDsobDqsbTsl5Ag7IKs7Jqp65CcIOuzgOyImOulvCDrp6Qg7J207YSw66CI7J207IWY66eI64ukCisgICAgIOuplOuqqOumrOyXkOyEnCDroZzrk5ztlZjsp4Ag7JWK7JWE64+EIOuQmOuPhOuhnSDstZzsoIHtmZQg7ZWY64qU6rG4IOuwqeyngO2VqeuLiOuLpC4KKworUkVBRF9PTkNFKCkg7JmAIFdSSVRFX09OQ0UoKSDtlajsiJjripQg7Iux6riAIOyTsOugiOuTnCDsvZTrk5zsl5DshJzripQg66y47KCcIOyXhuyngOunjCDrj5nsi5zshLHsnbQKK+yeiOuKlCDsvZTrk5zsl5DshJzripQg66y47KCc6rCAIOuQoCDsiJgg7J6I64qUIOuqqOuToCDstZzsoIHtmZTrpbwg66eJ7Iq164uI64ukLiAg7J2065+wIOulmOydmCDstZzsoIHtmZTsl5AKK+uMgO2VnCDsmIjrpbwg66qH6rCA7KeAIOuTpOyWtOuztOuptCDri6TsnYzqs7wg6rCZ7Iq164uI64ukOgorCisgKCopIOy7tO2MjOydvOufrOuKlCDqsJnsnYAg67OA7IiY7JeQIOuMgO2VnCDroZzrk5zsmYAg7Iqk7Yag7Ja066W8IOyerOuwsOy5mCDtlaAg7IiYIOyeiOqzoCwg7Ja065akCisgICAgIOqyveyasOyXkOuKlCBDUFXqsIAg6rCZ7J2AIOuzgOyImOuhnOu2gO2EsOydmCDroZzrk5zrk6TsnYQg7J6s67Cw7LmY7ZWgIOyImOuPhCDsnojsirXri4jri6QuICDsnbTripQKKyAgICAg64uk7J2M7J2YIOy9lOuTnOqwgDoKKworCWFbMF0gPSB4OworCWFbMV0gPSB4OworCisgICAgIHgg7J2YIOyYiOyghCDqsJLsnbQgYVsxXSDsl5AsIOyDiCDqsJLsnbQgYVswXSDsl5Ag7J6I6rKMIO2VoCDsiJgg7J6I64uk64qUIOucu+yeheuLiOuLpC4KKyAgICAg7Lu07YyM7J2865+s7JmAIENQVeqwgCDsnbTrn7Ag7J287J2EIOuqu+2VmOqyjCDtlZjroKTrqbQg64uk7J2M6rO8IOqwmeydtCDtlbTslbwg7ZWp64uI64ukOgorCisJYVswXSA9IFJFQURfT05DRSh4KTsKKwlhWzFdID0gUkVBRF9PTkNFKHgpOworCisgICAgIOymiSwgUkVBRF9PTkNFKCkg7JmAIFdSSVRFX09OQ0UoKSDripQg7Jes65+sIENQVSDsl5DshJwg7ZWY64KY7J2YIOuzgOyImOyXkCDqsIDtlbTsp4DripQKKyAgICAg7JWh7IS47Iqk65Ok7JeQIOy6kOyLnCDsnbzqtIDshLHsnYQg7KCc6rO17ZWp64uI64ukLgorCisgKCopIOy7tO2MjOydvOufrOuKlCDqsJnsnYAg67OA7IiY7JeQIOuMgO2VnCDsl7Dsho3soIHsnbgg66Gc65Oc65Ok7J2EIOuzke2Vqe2VoCDsiJgg7J6I7Iq164uI64ukLiAg6re465+wCisgICAgIOuzke2VqSDsnpHsl4XsnLzroZwg7Lu07YyM7J2865+s64qUIOuLpOydjOydmCDsvZTrk5zrpbw6CisKKwl3aGlsZSAodG1wID0gYSkKKwkJZG9fc29tZXRoaW5nX3dpdGgodG1wKTsKKworICAgICDri6TsnYzqs7wg6rCZ7J20LCDsi7HquIAg7JOw66CI65OcIOy9lOuTnOyXkOyEnOuKlCDrp5DsnbQg65CY7KeA66eMIOqwnOuwnOyekOydmCDsnZjrj4TsmYAg7KCE7ZiAIOunnuyngAorICAgICDslYrripQg67Cp7Zal7Jy866GcICLstZzsoIHtmZQiIO2VoCDsiJgg7J6I7Iq164uI64ukOgorCisJaWYgKHRtcCA9IGEpCisJCWZvciAoOzspCisJCQlkb19zb21ldGhpbmdfd2l0aCh0bXApOworCisgICAgIOy7tO2MjOydvOufrOqwgCDsnbTrn7Ag7KeT7J2EIO2VmOyngCDrqrvtlZjqsowg7ZWY66Ck66m0IFJFQURfT05DRSgpIOulvCDsgqzsmqntlZjshLjsmpQ6CisKKwl3aGlsZSAodG1wID0gUkVBRF9PTkNFKGEpKQorCQlkb19zb21ldGhpbmdfd2l0aCh0bXApOworCisgKCopIOyYiOy7qOuMgCDroIjsp4DsiqTthLAg7IKs7Jqp65+J7J20IOunjuyVhCDsu7TtjIzsnbzrn6zqsIAg66qo65OgIOuNsOydtO2EsOulvCDroIjsp4DsiqTthLDsl5Ag64u07J2EIOyImAorICAgICDsl4bripQg6rK97JqwLCDsu7TtjIzsnbzrn6zripQg67OA7IiY66W8IOuLpOyLnCDroZzrk5ztlaAg7IiYIOyeiOyKteuLiOuLpC4gIOuUsOudvOyEnCDsu7TtjIzsnbzrn6zripQKKyAgICAg7JWe7J2YIOyYiOyXkOyEnCDrs4DsiJggJ3RtcCcg7IKs7Jqp7J2EIOy1nOygge2ZlOuhnCDsl4bslaDrsoTrprQg7IiYIOyeiOyKteuLiOuLpDoKKworCXdoaWxlICh0bXAgPSBhKQorCQlkb19zb21ldGhpbmdfd2l0aCh0bXApOworCisgICAgIOydtCDsvZTrk5zripQg64uk7J2M6rO8IOqwmeydtCDsi7HquIAg7JOw66CI65Oc7JeQ7ISc64qUIOyZhOuyve2VmOyngOunjCDrj5nsi5zshLHsnbQg7KG07J6s7ZWY64qUCisgICAgIOqyveyasOyXlCDsuZjrqoXsoIHsnbgg7L2U65Oc66GcIOuwlOuAlCDsiJgg7J6I7Iq164uI64ukOgorCisJd2hpbGUgKGEpCisJCWRvX3NvbWV0aGluZ193aXRoKGEpOworCisgICAgIOyYiOulvCDrk6TslrQsIOy1nOygge2ZlOuQnCDsnbQg7L2U65Oc64qUIOuzgOyImCBhIOqwgCDri6TrpbggQ1BVIOyXkCDsnZjtlbQgIndoaWxlIiDrrLjqs7wKKyAgICAgZG9fc29tZXRoaW5nX3dpdGgoKSDtmLjstpwg7IKs7J207JeQIOuwlOuAjOyWtCBkb19zb21ldGhpbmdfd2l0aCgpIOyXkCAw7J2EIOuEmOq4uAorICAgICDsiJjrj4Qg7J6I7Iq164uI64ukLgorCisgICAgIOydtOuyiOyXkOuPhCwg7Lu07YyM7J2865+s6rCAIOq3uOufsCDsp5PsnYQg7ZWY64qU6rG4IOunieq4sCDsnITtlbQgUkVBRF9PTkNFKCkg66W8IOyCrOyaqe2VmOyEuOyalDoKKworCXdoaWxlICh0bXAgPSBSRUFEX09OQ0UoYSkpCisJCWRvX3NvbWV0aGluZ193aXRoKHRtcCk7CisKKyAgICAg66CI7KeA7Iqk7YSw6rCAIOu2gOyhse2VnCDsg4HtmansnYQg6rKq64qUIOqyveyasCwg7Lu07YyM7J2865+s64qUIHRtcCDrpbwg7Iqk7YOd7JeQIOyggOyepe2VtOuRmCDsiJjrj4QKKyAgICAg7J6I7Iq164uI64ukLiAg7Lu07YyM7J2865+s6rCAIOuzgOyImOulvCDri6Tsi5wg7J297Ja065Ok7J2064qU6rG0IOydtOugh+qyjCDsoIDsnqXtlbTrkZDqs6Ag7ZuE7JeQIOuLpOyLnAorICAgICDsnb3slrTrk6TsnbTripTrjbAg65Oc64qUIOyYpOuyhO2XpOuTnCDrlYzrrLjsnoXri4jri6QuICDqt7jroIfqsowg7ZWY64qU6rKMIOyLseq4gCDsk7DroIjrk5wKKyAgICAg7L2U65Oc7JeQ7ISc64qUIOyViOyghO2VmOuvgOuhnCwg7JWI7KCE7ZWY7KeAIOyViuydgCDqsr3smrDsl5DripQg7Lu07YyM7J2865+s7JeQ6rKMIOyngeygkSDslYzroKTspJjslbwKKyAgICAg7ZWp64uI64ukLgorCisgKCopIOy7tO2MjOydvOufrOuKlCDqt7gg6rCS7J20IOustOyXh+ydvOyngCDslYzqs6Ag7J6I64uk66m0IOuhnOuTnOulvCDslYTsmIgg7JWI7ZWgIOyImOuPhCDsnojsirXri4jri6QuCisgICAgIOyYiOulvCDrk6TslrQsIOuLpOydjOydmCDsvZTrk5zripQg67OA7IiYICdhJyDsnZgg6rCS7J20IO2VreyDgSAw7J6E7J2EIOymneuqhe2VoCDsiJgg7J6I64uk66m0OgorCisJd2hpbGUgKHRtcCA9IGEpCisJCWRvX3NvbWV0aGluZ193aXRoKHRtcCk7CisKKyAgICAg7J2066CH6rKMIOy1nOygge2ZlCDrkJjslrTrsoTrprQg7IiYIOyeiOyKteuLiOuLpDoKKworCWRvIHsgfSB3aGlsZSAoMCk7CisKKyAgICAg7J20IOuzgO2ZmOydgCDsi7HquIAg7JOw66CI65OcIOy9lOuTnOyXkOyEnOuKlCDrj4Tsm4DsnbQg65CY64qU642wIOuhnOuTnOyZgCDruIzrnpzsuZjrpbwg7KCc6rGw7ZaI6riwCisgICAgIOuVjOusuOyeheuLiOuLpC4gIOusuOygnOuKlCDsu7TtjIzsnbzrn6zqsIAgJ2EnIOydmCDqsJLsnYQg7JeF642w7J207Yq4IO2VmOuKlOqxtCDtmITsnqzsnZggQ1BVIO2VmOuCmAorICAgICDrv5DsnbTrnbzripQg6rCA7KCVIOychOyXkOyEnCDspp3rqoXsnYQg7ZaI64uk64qU642wIOyeiOyKteuLiOuLpC4gIOunjOyVvSDrs4DsiJggJ2EnIOqwgCDqs7XsnKDrkJjslrQKKyAgICAg7J6I64uk66m0LCDsu7TtjIzsnbzrn6zsnZgg7Kad66qF7J2AIO2LgOumsCDqsoPsnbQg65Cg6rKB64uI64ukLiAg7Lu07YyM7J2865+s64qUIOq3uCDsnpDsi6DsnbQKKyAgICAg7IOd6rCB7ZWY64qUIOqyg+unjO2BvCDrp47snYAg6rKD7J2EIOyVjOqzoCDsnojsp4Ag66q77ZWo7J2EIOy7tO2MjOydvOufrOyXkOqyjCDslYzrpqzquLAg7JyE7ZW0CisgICAgIFJFQURfT05DRSgpIOulvCDsgqzsmqntlZjshLjsmpQ6CisKKwl3aGlsZSAodG1wID0gUkVBRF9PTkNFKGEpKQorCQlkb19zb21ldGhpbmdfd2l0aCh0bXApOworCisgICAgIO2VmOyngOunjCDsu7TtjIzsnbzrn6zripQgUkVBRF9PTkNFKCkg65Kk7JeQIOuCmOyYpOuKlCDqsJLsl5Ag64yA7ZW07ISc64+EIOuIiOq4uOydhCDrkZDqs6Ag7J6I7J2M7J2ECisgICAgIOq4sOyWte2VmOyEuOyalC4gIOyYiOulvCDrk6TslrQsIOuLpOydjOydmCDsvZTrk5zsl5DshJwgTUFYIOuKlCDsoITsspjrpqzquLAg66ek7YGs66Gc66GcLCAx7J2YIOqwkuydhAorICAgICDqsJbripTri6Tqs6Ag7ZW067SF7Iuc64ukOgorCisJd2hpbGUgKCh0bXAgPSBSRUFEX09OQ0UoYSkpICUgTUFYKQorCQlkb19zb21ldGhpbmdfd2l0aCh0bXApOworCisgICAgIOydtOugh+qyjCDrkJjrqbQg7Lu07YyM7J2865+s64qUIE1BWCDrpbwg6rCA7KeA6rOgIOyImO2WieuQmOuKlCAiJSIg7Jik7Y2866CI7J207YSw7J2YIOqysOqzvOqwgCDtla3sg4EKKyAgICAgMOydtOudvOuKlCDqsoPsnYQg7JWM6rKMIOuQmOqzoCwg7Lu07YyM7J2865+s6rCAIOy9lOuTnOulvCDsi6Tsp4jsoIHsnLzroZzripQg7KG07J6s7ZWY7KeAIOyViuuKlAorICAgICDqsoPsspjrn7wg7LWc7KCB7ZmUIO2VmOuKlCDqsoPsnbQg7ZeI7Jqp65CY7Ja0IOuyhOumveuLiOuLpC4gICgnYScg67OA7IiY7J2YIOuhnOuTnOuKlCDsl6zsoITtnogKKyAgICAg7ZaJ7ZW07KeIIOqygeuLiOuLpC4pCisKKyAoKikg67mE7Iq37ZWY6rKMLCDsu7TtjIzsnbzrn6zripQg67OA7IiY6rCAIOyggOyepe2VmOugpCDtlZjripQg6rCS7J2EIOydtOuvuCDqsIDsp4Dqs6Ag7J6I64uk64qUIOqyg+ydhAorICAgICDslYzrqbQg7Iqk7Yag7Ja0IOyekOyytOulvCDsoJzqsbDtlaAg7IiYIOyeiOyKteuLiOuLpC4gIOydtOuyiOyXkOuPhCwg7Lu07YyM7J2865+s64qUIO2YhOyerOydmCBDUFUKKyAgICAg66eM7J20IOq3uCDrs4DsiJjsl5Ag6rCS7J2EIOyTsOuKlCDsmKTroZzsp4Ag7ZWY64KY7J2YIOyhtOyerOudvOqzoCDsg53qsIHtlZjsl6wg6rO17Jyg65CcIOuzgOyImOyXkAorICAgICDrjIDtlbTshJzripQg7J6Y66q765CcIOydvOydhCDtlZjqsowg65Cp64uI64ukLiAg7JiI66W8IOuTpOyWtCwg64uk7J2M6rO8IOqwmeydgCDqsr3smrDqsIAg7J6I7J2EIOyImAorICAgICDsnojsirXri4jri6Q6CisKKwlhID0gMDsKKwkuLi4g67OA7IiYIGEg7JeQIOyKpO2GoOyWtOulvCDtlZjsp4Ag7JWK64qUIOy9lOuTnCAuLi4KKwlhID0gMDsKKworICAgICDsu7TtjIzsnbzrn6zripQg67OA7IiYICdhJyDsnZgg6rCS7J2AIOydtOuvuCAw7J20652864qUIOqyg+ydhCDslYzqs6AsIOuUsOudvOyEnCDrkZDrsojsp7gg7Iqk7Yag7Ja066W8CisgICAgIOyCreygnO2VoCDqsoHri4jri6QuICDrp4zslb0g64uk66W4IENQVSDqsIAg6re4IOyCrOydtCDrs4DsiJggJ2EnIOyXkCDri6Trpbgg6rCS7J2EIOyNvOuLpOuptAorICAgICDtmanri7ntlZwg6rKw6rO86rCAIOuCmOyYrCDqsoHri4jri6QuCisKKyAgICAg7Lu07YyM7J2865+s6rCAIOq3uOufsCDsnpjrqrvrkJwg7LaU7Lih7J2EIO2VmOyngCDslYrrj4TroZ0gV1JJVEVfT05DRSgpIOulvCDsgqzsmqntlZjshLjsmpQ6CisKKwlXUklURV9PTkNFKGEsIDApOworCS4uLiDrs4DsiJggYSDsl5Ag7Iqk7Yag7Ja066W8IO2VmOyngCDslYrripQg7L2U65OcIC4uLgorCVdSSVRFX09OQ0UoYSwgMCk7CisKKyAoKikg7Lu07YyM7J2865+s64qUIO2VmOyngCDrp5Drnbzqs6Ag7ZWY7KeAIOyViuycvOuptCDrqZTrqqjrpqwg7JWh7IS47Iqk65Ok7J2EIOyerOuwsOy5mCDtlaAg7IiYCisgICAgIOyeiOyKteuLiOuLpC4gIOyYiOulvCDrk6TslrQsIOuLpOydjOydmCDtlITroZzshLjsiqQg66CI67KoIOy9lOuTnOyZgCDsnbjthLDrn73tirgg7ZW465Ok65+sIOyCrOydtOydmAorICAgICDsg4HtmLjsnpHsmqnsnYQg7IOd6rCB7ZW0IOu0heyLnOuLpDoKKworCXZvaWQgcHJvY2Vzc19sZXZlbCh2b2lkKQorCXsKKwkJbXNnID0gZ2V0X21lc3NhZ2UoKTsKKwkJZmxhZyA9IHRydWU7CisJfQorCisJdm9pZCBpbnRlcnJ1cHRfaGFuZGxlcih2b2lkKQorCXsKKwkJaWYgKGZsYWcpCisJCQlwcm9jZXNzX21lc3NhZ2UobXNnKTsKKwl9CisKKyAgICAg7J20IOy9lOuTnOyXkOuKlCDsu7TtjIzsnbzrn6zqsIAgcHJvY2Vzc19sZXZlbCgpIOydhCDri6TsnYzqs7wg6rCZ7J20IOuzgO2ZmO2VmOuKlCDqsoPsnYQg66eJ7J2ECisgICAgIOyImOuLqOydtCDsl4bqs6AsIOydtOufsCDrs4DtmZjsnYAg7Iux6riA7JOw66CI65Oc7JeQ7ISc652866m0IOyLpOygnOuhnCDtm4zrpa3tlZwg7ISg7YOd7J28IOyImAorICAgICDsnojsirXri4jri6Q6CisKKwl2b2lkIHByb2Nlc3NfbGV2ZWwodm9pZCkKKwl7CisJCWZsYWcgPSB0cnVlOworCQltc2cgPSBnZXRfbWVzc2FnZSgpOworCX0KKworICAgICDsnbQg65GQ6rCc7J2YIOusuOyepSDsgqzsnbTsl5Ag7J247YSw65+97Yq46rCAIOuwnOyDne2VnOuLpOuptCwgaW50ZXJydXB0X2hhbmRsZXIoKSDripQg7J2Y66+466W8CisgICAgIOyVjCDsiJgg7JeG64qUIOuplOyEuOyngOulvCDrsJvsnYQg7IiY64+EIOyeiOyKteuLiOuLpC4gIOydtOqxuCDrp4nquLAg7JyE7ZW0IOuLpOydjOqzvCDqsJnsnbQKKyAgICAgV1JJVEVfT05DRSgpIOulvCDsgqzsmqntlZjshLjsmpQ6CisKKwl2b2lkIHByb2Nlc3NfbGV2ZWwodm9pZCkKKwl7CisJCVdSSVRFX09OQ0UobXNnLCBnZXRfbWVzc2FnZSgpKTsKKwkJV1JJVEVfT05DRShmbGFnLCB0cnVlKTsKKwl9CisKKwl2b2lkIGludGVycnVwdF9oYW5kbGVyKHZvaWQpCisJeworCQlpZiAoUkVBRF9PTkNFKGZsYWcpKQorCQkJcHJvY2Vzc19tZXNzYWdlKFJFQURfT05DRShtc2cpKTsKKwl9CisKKyAgICAgaW50ZXJydXB0X2hhbmRsZXIoKSDslYjsl5DshJzrj4Qg7KSR7LKp65CcIOyduO2EsOufve2KuOuCmCBOTUkg7JmAIOqwmeydtCDsnbjthLDrn73tirgg7ZW465Ok65+sCisgICAgIOyXreyLnCAnZmxhZycg7JmAICdtc2cnIOyXkCDsoJHqt7ztlZjripQg65iQ64uk66W4IOustOyWuOqwgOyXkCDsnbjthLDrn73tirgg65CgIOyImCDsnojri6TrqbQKKyAgICAgUkVBRF9PTkNFKCkg7JmAIFdSSVRFX09OQ0UoKSDrpbwg7IKs7Jqp7ZW07JW8IO2VqOydhCDquLDslrXtlbQg65GQ7IS47JqULiAg66eM7JW9IOq3uOufsAorICAgICDqsIDriqXshLHsnbQg7JeG64uk66m0LCBpbnRlcnJ1cHRfaGFuZGxlcigpIOyViOyXkOyEnOuKlCDrrLjshJztmZQg66qp7KCB7J20IOyVhOuLiOudvOuptAorICAgICBSRUFEX09OQ0UoKSDsmYAgV1JJVEVfT05DRSgpIOuKlCDtlYTsmpTsuZgg7JWK7Iq164uI64ukLiAgKOq3vOuemOydmCDrpqzriIXsiqQg7Luk64SQ7JeQ7IScCisgICAgIOykkeyyqeuQnCDsnbjthLDrn73tirjripQg67O07Ya1IOyemCDsnbzslrTrgpjsp4Ag7JWK7J2M64+EIOq4sOyWte2VtCDrkZDshLjsmpQsIOyLpOygnOuhnCwg7Ja065akCisgICAgIOyduO2EsOufve2KuCDtlbjrk6Trn6zqsIAg7J247YSw65+97Yq46rCAIO2ZnOyEse2ZlOuQnCDssYTroZwg66as7YS07ZWY66m0IFdBUk5fT05DRSgpIOqwgAorICAgICDsi6TtlonrkKnri4jri6QuKQorCisgICAgIOy7tO2MjOydvOufrOuKlCBSRUFEX09OQ0UoKSDsmYAgV1JJVEVfT05DRSgpIOuSpOydmCBSRUFEX09OQ0UoKSDrgpggV1JJVEVfT05DRSgpLAorICAgICBiYXJyaWVyKCksIOuYkOuKlCDruYTsirftlZwg6rKD65Ok7J2EIOuLtOqzoCDsnojsp4Ag7JWK7J2AIOy9lOuTnOulvCDsm4Dsp4Hsnbwg7IiYIOyeiOydhCDqsoPsnLzroZwKKyAgICAg6rCA7KCV65CY7Ja07JW8IO2VqeuLiOuLpC4KKworICAgICDsnbQg7Zqo6rO864qUIGJhcnJpZXIoKSDrpbwg7Ya17ZW07ISc64+EIOunjOuTpCDsiJgg7J6I7KeA66eMLCBSRUFEX09OQ0UoKSDsmYAKKyAgICAgV1JJVEVfT05DRSgpIOqwgCDsooAg642UIOyViOuqqSDrhpLsnYAg7ISg7YOd7J6F64uI64ukOiBSRUFEX09OQ0UoKSDsmYAgV1JJVEVfT05DRSgp64qUCisgICAgIOy7tO2MjOydvOufrOyXkCDso7zslrTsp4Qg66mU66qo66asIOyYgeyXreyXkCDrjIDtlbTshJzrp4wg7LWc7KCB7ZmUIOqwgOuKpeyEseydhCDtj6zquLDtlZjrj4TroZ0KKyAgICAg7ZWY7KeA66eMLCBiYXJyaWVyKCkg64qUIOy7tO2MjOydvOufrOqwgCDsp4DquIjquYzsp4Ag6riw6rOE7J2YIOugiOyngOyKpO2EsOyXkCDsupDsi5ztlbQg64aT7J2ACisgICAgIOuqqOuToCDrqZTrqqjrpqwg7JiB7Jet7J2YIOqwkuydhCDrsoTroKTslbwg7ZWY6rKMIO2VmOq4sCDrlYzrrLjsnoXri4jri6QuICDrrLzroaAsIOy7tO2MjOydvOufrOuKlAorICAgICBSRUFEX09OQ0UoKSDsmYAgV1JJVEVfT05DRSgpIOqwgCDsnbzslrTrgpwg7Iic7ISc64+EIOyngOy8nOykjeuLiOuLpCwgQ1BVIOuKlCDri7nsl7DtnogKKyAgICAg6re4IOyInOyEnOulvCDsp4Dtgqwg7J2Y66y06rCAIOyXhuyngOunjOyalC4KKworICgqKSDsu7TtjIzsnbzrn6zripQg64uk7J2M7J2YIOyYiOyXkOyEnOyZgCDqsJnsnbQg67OA7IiY7JeQ7J2YIOyKpO2GoOyWtOulvCDrgqDsobDtlbTrgrwg7IiY64+EIOyeiOyKteuLiOuLpDoKKworCWlmIChhKQorCQliID0gYTsKKwllbHNlCisJCWIgPSA0MjsKKworICAgICDsu7TtjIzsnbzrn6zripQg7JWE656Y7JmAIOqwmeydgCDstZzsoIHtmZTroZwg67iM656c7LmY66W8IOykhOydvCDqsoHri4jri6Q6CisKKwliID0gNDI7CisJaWYgKGEpCisJCWIgPSBhOworCisgICAgIOyLseq4gCDsk7DroIjrk5wg7L2U65Oc7JeQ7IScIOydtCDstZzsoIHtmZTripQg7JWI7KCE7ZWgIOu/kCDslYTri4jrnbwg67iM656c7LmYIOqwr+yImOulvAorICAgICDspITsl6zspI3ri4jri6QuICDtlZjsp4Drp4wg7JWI7YOA6rmd6rKM64+ELCDrj5nsi5zshLHsnbQg7J6I64qUIOy9lOuTnOyXkOyEnOuKlCDsnbQg7LWc7KCB7ZmU64qUIOuLpOuluAorICAgICBDUFUg6rCAICdiJyDrpbwg66Gc65Oc7ZWgIOuVjCwgLS0gJ2EnIOqwgCAw7J20IOyVhOuLjOuNsOuPhCAtLSDqsIDsp5zsnbgg6rCSLCA0MuulvCDrs7TqsowKKyAgICAg65CY64qUIOqyveyasOulvCDqsIDriqXtlZjqsowg7ZWp64uI64ukLiAg7J206rG4IOuwqeyngO2VmOq4sCDsnITtlbQgV1JJVEVfT05DRSgpIOulvAorICAgICDsgqzsmqntlZjshLjsmpQ6CisKKwlpZiAoYSkKKwkJV1JJVEVfT05DRShiLCBhKTsKKwllbHNlCisJCVdSSVRFX09OQ0UoYiwgNDIpOworCisgICAgIOy7tO2MjOydvOufrOuKlCDroZzrk5zrpbwg66eM65Ok7Ja064K8IOyImOuPhCDsnojsirXri4jri6QuICDsnbzrsJjsoIHsnLzroZzripQg66y47KCc66W8IOydvOycvO2CpOyngAorICAgICDslYrsp4Drp4wsIOy6kOyLnCDrnbzsnbgg67CU7Jq07Iux7J2EIOydvOycvOy8nCDshLHriqXqs7wg7ZmV7J6l7ISx7J2EIOuWqOyWtOucqOumtCDsiJgg7J6I7Iq164uI64ukLgorICAgICDrgqDsobDrkJwg66Gc65Oc66W8IOunieq4sCDsnITtlbTshKAgUkVBRF9PTkNFKCkg66W8IOyCrOyaqe2VmOyEuOyalC4KKworICgqKSDsoJXroKzrkJwg66mU66qo66asIOyjvOyGjOyXkCDsnITsuZjtlZwsIO2VnOuyiOydmCDrqZTrqqjrpqwg7LC47KGwIOyduOyKpO2KuOufreyFmOycvOuhnCDslaHshLjsiqQKKyAgICAg6rCA64ql7ZWcIO2BrOq4sOydmCDrjbDsnbTthLDripQg7ZWY64KY7J2YIO2BsCDslaHshLjsiqTqsIAg7Jes65+s6rCc7J2YIOyekeydgCDslaHshLjsiqTrk6TroZwKKyAgICAg64yA7LK065CY64qUICLroZzrk5wg7Yuw7Ja066eBKGxvYWQgdGVhcmluZykiIOqzvCAi7Iqk7Yag7Ja0IO2LsOyWtOungShzdG9yZSB0ZWFyaW5nKSIg7J2ECisgICAgIOuwqeyngO2VqeuLiOuLpC4gIOyYiOulvCDrk6TslrQsIOyjvOyWtOynhCDslYTtgqTthY3ss5DqsIAgNy1iaXQgaW1lZWRpYXRlIGZpZWxkIOulvCDqsJbripQKKyAgICAgMTYtYml0IOyKpO2GoOyWtCDsnbjsiqTtirjrn63shZjsnYQg7KCc6rO17ZWc64uk66m0LCDsu7TtjIzsnbzrn6zripQg64uk7J2M7J2YIDMyLWJpdCDsiqTthqDslrTrpbwKKyAgICAg6rWs7ZiE7ZWY64qU642w7JeQIOuRkOqwnOydmCAxNi1iaXQgc3RvcmUtaW1tZWRpYXRlIOuqheugueydhCDsgqzsmqntlZjroKQg7ZWg6rKB64uI64ukOgorCisJcCA9IDB4MDAwMTAwMDI7CisKKyAgICAg7Iqk7Yag7Ja0IO2VoCDsg4HsiJjrpbwg66eM65Ok6rOgIOq3uCDqsJLsnYQg7Iqk7Yag7Ja0IO2VmOq4sCDsnITtlbQg65GQ6rCc6rCAIOuEmOuKlCDsnbjsiqTtirjrn63shZjsnYQKKyAgICAg7IKs7Jqp7ZWY6rKMIOuQmOuKlCwg7J2065+wIOyiheulmOydmCDstZzsoIHtmZTrpbwgR0NDIOuKlCDsi6TsoJzroZwg7ZWo7J2EIOu2gOuUlCDslYzslYQg65GQ7Iut7Iuc7JikLgorICAgICDsnbQg7LWc7KCB7ZmU64qUIOyLseq4gCDsk7DroIjrk5wg7L2U65Oc7JeQ7ISc64qUIOyEseqzteyggeyduCDstZzsoIHtmZQg7J6F64uI64ukLiAg7Iuk7KCc66GcLCDqt7zrnpjsl5AKKyAgICAg67Cc7IOd7ZWcICjqt7jrpqzqs6Ag6rOg7LOQ7KeEKSDrsoTqt7jripQgR0NDIOqwgCB2b2xhdGlsZSDsiqTthqDslrTsl5Ag67mE7KCV7IOB7KCB7Jy866GcIOydtAorICAgICDstZzsoIHtmZTrpbwg7IKs7Jqp7ZWY6rKMIO2WiOyKteuLiOuLpC4gIOq3uOufsCDrsoTqt7jqsIAg7JeG64uk66m0LCDri6TsnYzsnZgg7JiI7JeQ7IScCisgICAgIFdSSVRFX09OQ0UoKSDsnZgg7IKs7Jqp7J2AIOyKpO2GoOyWtCDti7DslrTrp4HsnYQg67Cp7KeA7ZWp64uI64ukOgorCisJV1JJVEVfT05DRShwLCAweDAwMDEwMDAyKTsKKworICAgICBQYWNrZWQg6rWs7KGw7LK07J2YIOyCrOyaqSDsl63si5wg64uk7J2M7J2YIOyYiOyymOufvCAg66Gc65OcIC8g7Iqk7Yag7Ja0IO2LsOyWtOungeydhCDsnKDrsJztlaAg7IiYCisgICAgIOyeiOyKteuLiOuLpDoKKworCXN0cnVjdCBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkgZm9vIHsKKwkJc2hvcnQgYTsKKwkJaW50IGI7CisJCXNob3J0IGM7CisJfTsKKwlzdHJ1Y3QgZm9vIGZvbzEsIGZvbzI7CisJLi4uCisKKwlmb28yLmEgPSBmb28xLmE7CisJZm9vMi5iID0gZm9vMS5iOworCWZvbzIuYyA9IGZvbzEuYzsKKworICAgICBSRUFEX09OQ0UoKSDrgpggV1JJVEVfT05DRSgpIOuPhCDsl4bqs6Agdm9sYXRpbGUg66eI7YK564+EIOyXhuq4sCDrlYzrrLjsl5AsCisgICAgIOy7tO2MjOydvOufrOuKlCDsnbQg7IS46rCc7J2YIOuMgOyeheusuOydhCDrkZDqsJzsnZggMzItYml0IOuhnOuTnOyZgCDrkZDqsJzsnZggMzItYml0IOyKpO2GoOyWtOuhnAorICAgICDrs4DtmZjtlaAg7IiYIOyeiOyKteuLiOuLpC4gIOydtOuKlCAnZm9vMS5iJyDsnZgg6rCS7J2YIOuhnOuTnCDti7DslrTrp4Hqs7wgJ2ZvbzIuYicg7J2YCisgICAgIOyKpO2GoOyWtCDti7DslrTrp4HsnYQg7LSI656Y7ZWgIOqygeuLiOuLpC4gIOydtCDsmIjsl5DshJzrj4QgUkVBRF9PTkNFKCkg7JmAIFdSSVRFX09OQ0UoKQorICAgICDqsIAg7Yuw7Ja066eB7J2EIOunieydhCDsiJgg7J6I7Iq164uI64ukOgorCisJZm9vMi5hID0gZm9vMS5hOworCVdSSVRFX09OQ0UoZm9vMi5iLCBSRUFEX09OQ0UoZm9vMS5iKSk7CisJZm9vMi5jID0gZm9vMS5jOworCivqt7jroIfsp4Drp4wsIHZvbGF0aWxlIOuhnCDrp4jtgazrkJwg67OA7IiY7JeQIOuMgO2VtOyEnOuKlCBSRUFEX09OQ0UoKSDsmYAgV1JJVEVfT05DRSgpIOqwgAor7ZWE7JqU7LmYIOyViuyKteuLiOuLpC4gIOyYiOulvCDrk6TslrQsICdqaWZmaWVzJyDripQgdm9sYXRpbGUg66GcIOuniO2BrOuQmOyWtCDsnojquLAg65WM66y47JeQLAorUkVBRF9PTkNFKGppZmZpZXMpIOudvOqzoCDtlaAg7ZWE7JqU6rCAIOyXhuyKteuLiOuLpC4gIFJFQURfT05DRSgpIOyZgCBXUklURV9PTkNFKCkg6rCACivsi6TsnYAgdm9sYXRpbGUg7LqQ7Iqk7YyF7Jy866GcIOq1rO2YhOuQmOyWtCDsnojslrTshJwg7J247J6Q6rCAIOydtOuvuCB2b2xhdGlsZSDroZwg66eI7YGs65CY7Ja0Civsnojri6TrqbQg65iQ64uk66W4IO2aqOqzvOulvCDrgrTsp4DripQg7JWK6riwIOuVjOusuOyeheuLiOuLpC4KKwor7J20IOy7tO2MjOydvOufrCDrsLDrpqzslrTrk6TsnYAgQ1BVIOyXkOuKlCDsp4HsoJHsoIEg7Zqo6rO866W8IOyghO2YgCDrp4zrk6Tsp4Ag7JWK6riwIOuVjOusuOyXkCwg6rKw6rWt7J2ACivsnqzrsLDsuZjqsIAg7J287Ja064KgIOyImOuPhCDsnojsnYzsnYQg67aA65SUIOq4sOyWte2VtCDrkZDsi63si5zsmKQuCisKKworQ1BVIOuplOuqqOumrCDrsLDrpqzslrQKKy0tLS0tLS0tLS0tLS0tLS0tCisKK+umrOuIheyKpCDsu6TrhJDsnYAg64uk7J2M7J2YIOyXrOuNn+qwnCDquLDrs7ggQ1BVIOuplOuqqOumrCDrsLDrpqzslrTrpbwg6rCA7KeA6rOgIOyeiOyKteuLiOuLpDoKKworCVRZUEUJCU1BTkRBVE9SWQkJU01QIENPTkRJVElPTkFMCisJPT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCeuylOyaqQkJbWIoKQkJCXNtcF9tYigpCisJ7JOw6riwCQl3bWIoKQkJCXNtcF93bWIoKQorCeydveq4sAkJcm1iKCkJCQlzbXBfcm1iKCkKKwnrjbDsnbTthLAg7J2Y7KG07ISxCXJlYWRfYmFycmllcl9kZXBlbmRzKCkJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkKKworCivrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOulvCDsoJzsmbjtlZwg66qo65OgIOuplOuqqOumrCDrsLDrpqzslrTripQg7Lu07YyM7J2865+sIOuwsOumrOyWtOulvAor7Y+s7ZWo7ZWp64uI64ukLiAg642w7J207YSwIOydmOyhtOyEseydgCDsu7TtjIzsnbzrn6zsl5DsnZgg7LaU6rCA7KCB7J24IOyInOyEnCDrs7TsnqXsnYQg7Y+s7ZWo7ZWY7KeACivslYrsirXri4jri6QuCisKK+uwqeuwsTog642w7J207YSwIOydmOyhtOyEseydtCDsnojripQg6rK97JqwLCDsu7TtjIzsnbzrn6zripQg7ZW064u5IOuhnOuTnOulvCDsmKzrsJTrpbgg7Iic7ISc66GcIOydvOycvO2CrAor6rKD7Jy866GcICjsmIg6IGBhW2JdYCDripQgYVtiXSDrpbwg66Gc65OcIO2VmOq4sCDsoITsl5AgYiDsnZgg6rCS7J2EIOuovOyggCDroZzrk5ztlZzri6QpCivquLDrjIDrkJjsp4Drp4wsIEMg7Ja47Ja0IOyCrOyWkeyXkOuKlCDsu7TtjIzsnbzrn6zqsIAgYiDsnZgg6rCS7J2EIOy2lOy4oSAo7JiIOiAxIOqzvCDqsJnsnYwpIO2VtOyEnAorYiAg66Gc65OcIOyghOyXkCBhIOuhnOuTnOulvCDtlZjripQg7L2U65OcICjsmIg6IHRtcCA9IGFbMV07IGlmIChiICE9IDEpIHRtcCA9IGFbYl07ICkg66W8Civrp4zrk6Tsp4Ag7JWK7JWE7JW8IO2VnOuLpOuKlCDrgrTsmqkg6rCZ7J2AIOqxtCDsl4bsirXri4jri6QuICDrmJDtlZwg7Lu07YyM7J2865+s64qUIGFbYl0g66W8IOuhnOuTnO2VnAor7ZuE7JeQIGIg66W8IOuYkOuLpOyLnCDroZzrk5ztlaAg7IiY64+EIOyeiOyWtOyEnCwgYVtiXSDrs7Tri6Qg7LWc7IugIOuyhOyghOydmCBiIOqwkuydhCDqsIDsp4gg7IiY64+ECivsnojsirXri4jri6QuICDsnbTrn7Ag66y47KCc65Ok7J2YIO2VtOqysOyxheyXkCDrjIDtlZwg7J2Y6rKsIOydvOy5mOuKlCDslYTsp4Eg7JeG7Iq164uI64uk66eMLCDsnbzri6gKK1JFQURfT05DRSgpIOunpO2BrOuhnOu2gO2EsCDrs7TquLAg7Iuc7J6R7ZWY64qU6rKMIOyii+ydgCDsi5zsnpHsnbQg65Cg6rKB64uI64ukLgorCitTTVAg66mU66qo66asIOuwsOumrOyWtOuTpOydgCDsnKDri4jtlITroZzshLjshJzroZwg7Lu07YyM7J2865CcIOyLnOyKpO2FnOyXkOyEnOuKlCDsu7TtjIzsnbzrn6wg67Cw66as7Ja066GcCivrsJTrgIzripTrjbAsIO2VmOuCmOydmCBDUFUg64qUIOyKpOyKpOuhnCDsnbzqtIDshLHsnYQg7Jyg7KeA7ZWY6rOgLCDqsrnsuZjripQg7JWh7IS47Iqk65OkIOyXreyLnCDsmKzrsJTrpbgKK+yInOyEnOuhnCDtlontlbTsp4gg6rKD7Jy866GcIOyDneqwgeuQmOq4sCDrlYzrrLjsnoXri4jri6QuICDtlZjsp4Drp4wsIOyVhOuemOydmCAiVmlydHVhbCBNYWNoaW5lCitHdWVzdHMiIOyEnOu4jOyEueyFmOydhCDssLjqs6DtlZjsi63si5zsmKQuCisKK1shXSBTTVAg7Iuc7Iqk7YWc7JeQ7IScIOqzteycoOuplOuqqOumrOuhnOydmCDsoJHqt7zrk6TsnYQg7Iic7IScIOyEuOybjOyVvCDtlaAg65WMLCBTTVAg66mU66qo66asCivrsLDrpqzslrTripQgX+uwmOuTnOyLnF8g7IKs7Jqp65CY7Ja07JW8IO2VqOydhCDquLDslrXtlZjshLjsmpQsIOq3uOuMgOyLoCDrnb3snYQg7IKs7Jqp7ZWY64qUIOqyg+ycvOuhnOuPhAor7Lap67aE7ZWY6ri0IO2VmOyngOunjCDrp5DsnbTso6AuCisKK01hbmRhdG9yeSDrsLDrpqzslrTrk6TsnYAgU01QIOyLnOyKpO2FnOyXkOyEnOuPhCBVUCDsi5zsiqTthZzsl5DshJzrj4QgU01QIO2aqOqzvOunjCDthrXsoJztlZjquLDsl5DripQKK+u2iO2VhOyalO2VnCDsmKTrsoTtl6Trk5zrpbwg6rCW6riwIOuVjOusuOyXkCBTTVAg7Zqo6rO866eMIO2GteygnO2VmOuptCDrkJjripQg6rOz7JeQ64qUIOyCrOyaqeuQmOyngCDslYrslYTslbwKK+2VqeuLiOuLpC4gIO2VmOyngOunjCwg64qQ7Iqo7ZWcIOyInOyEnCDqt5zsuZnsnZgg66mU66qo66asIEkvTyDsnIjrj4TsmrDrpbwg7Ya17ZWcIE1NSU8g7J2YIO2aqOqzvOulvAor7Ya17KCc7ZWgIOuVjOyXkOuKlCBtYW5kYXRvcnkg67Cw66as7Ja065Ok7J20IOyCrOyaqeuQoCDsiJgg7J6I7Iq164uI64ukLiAg7J20IOuwsOumrOyWtOuTpOydgAor7Lu07YyM7J2865+s7JmAIENQVSDrqqjrkZAg7J6s67Cw7LmY66W8IOuqu+2VmOuPhOuhnSDtlajsnLzroZzsjagg66mU66qo66asIOyYpO2NvOugiOydtOyFmOuTpOydtCDrlJTrsJTsnbTsiqTsl5AKK+uztOyXrOyngOuKlCDsiJzshJzsl5Drj4Qg7JiB7Zal7J2EIOyjvOq4sCDrlYzrrLjsl5AsIFNNUCDqsIAg7JWE64uMIOyLnOyKpO2FnOydtOudvCDtlaDsp4Drnbzrj4Qg7ZWE7JqU7ZWgIOyImAor7J6I7Iq164uI64ukLgorCisKK+ydvOu2gCDqs6DquIkg67Cw66as7Ja0IO2VqOyImOuTpOuPhCDsnojsirXri4jri6Q6CisKKyAoKikgc21wX3N0b3JlX21iKHZhciwgdmFsdWUpCisKKyAgICAg7J20IO2VqOyImOuKlCDtirnsoJUg67OA7IiY7JeQIO2KueyglSDqsJLsnYQg64yA7J6F7ZWY6rOgIOuylOyaqSDrqZTrqqjrpqwg67Cw66as7Ja066W8IOy5qeuLiOuLpC4KKyAgICAgVVAg7Lu07YyM7J287JeQ7ISc64qUIOy7tO2MjOydvOufrCDrsLDrpqzslrTrs7Tri6Qg642U7ZWcIOqyg+ydhCDsuZzri6Tqs6DripQg67O07J6l65CY7KeAIOyViuyKteuLiOuLpC4KKworCisgKCopIHNtcF9tYl9fYmVmb3JlX2F0b21pYygpOworICgqKSBzbXBfbWJfX2FmdGVyX2F0b21pYygpOworCisgICAgIOydtOqyg+uTpOydgCDqsJLsnYQg66as7YS07ZWY7KeAIOyViuuKlCAo642U7ZWY6riwLCDrubzquLAsIOymneqwgCwg6rCQ7IaM7JmAIOqwmeydgCkg7Ja07Yag66+5CisgICAgIO2VqOyImOuTpOydhCDsnITtlZwsIO2Kue2eiCDqt7jqsoPrk6TsnbQg66CI7Y2865+w7IqkIOy5tOyatO2MheyXkCDsgqzsmqnrkKAg65WM66W8IOychO2VnAorICAgICDtlajsiJjrk6TsnoXri4jri6QuICDsnbQg7ZWo7IiY65Ok7J2AIOuplOuqqOumrCDrsLDrpqzslrTrpbwg64K07Y+s7ZWY6rOgIOyeiOyngOuKlCDslYrsirXri4jri6QuCisKKyAgICAg7J206rKD65Ok7J2AIOqwkuydhCDrpqzthLTtlZjsp4Ag7JWK7Jy866mwIOyWtO2GoOuvue2VnCAoc2V0X2JpdCDqs7wgY2xlYXJfYml0IOqwmeydgCkg67mE7Yq4CisgICAgIOyXsOyCsOyXkOuPhCDsgqzsmqnrkKAg7IiYIOyeiOyKteuLiOuLpC4KKworICAgICDtlZwg7JiI66GcLCDqsJ3ssrQg7ZWY64KY66W8IOustO2aqO2VnCDqsoPsnLzroZwg7ZGc7Iuc7ZWY6rOgIOq3uCDqsJ3ssrTsnZgg66CI7Y2865+w7IqkIOy5tOyatO2KuOulvAorICAgICDqsJDshozsi5ztgqTripQg64uk7J2MIOy9lOuTnOulvCDrs7TshLjsmpQ6CisKKwlvYmotPmRlYWQgPSAxOworCXNtcF9tYl9fYmVmb3JlX2F0b21pYygpOworCWF0b21pY19kZWMoJm9iai0+cmVmX2NvdW50KTsKKworICAgICDsnbQg7L2U65Oc64qUIOqwneyytOydmCDsl4XrjbDsnbTtirjrkJwgZGVhdGgg66eI7YGs6rCAIOugiO2NvOufsOyKpCDsubTsmrTthLAg6rCQ7IaMIOuPmeyekQorICAgICAq7KCE7JeQKiDrs7Tsnbwg6rKD7J2EIOuztOyepe2VqeuLiOuLpC4KKworICAgICDrjZQg66eO7J2AIOygleuztOulvCDsnITtlbTshKAgRG9jdW1lbnRhdGlvbi9hdG9taWNfb3BzLnR4dCDrrLjshJzrpbwg7LC46rOg7ZWY7IS47JqULgorICAgICDslrTrlJTshJwg7J206rKD65Ok7J2EIOyCrOyaqe2VtOyVvCDtlaDsp4Ag6raB6riI7ZWY64uk66m0ICLslrTthqDrr7kg7Jik7Y2866CI7J207IWYIiDshJzruIzshLnshZjsnYQKKyAgICAg7LC46rOg7ZWY7IS47JqULgorCisKKyAoKikgbG9ja2xlc3NfZGVyZWZlcmVuY2UoKTsKKworICAgICDsnbQg7ZWo7IiY64qUIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja066W8IOyCrOyaqe2VmOuKlAorICAgICDtj6zsnbjthLAg7J297Ja07Jik6riwIOuemO2NvCh3cmFwcGVyKSDtlajsiJjroZwg7IOd6rCB65CgIOyImCDsnojsirXri4jri6QuCisKKyAgICAg6rCd7LK07J2YIOudvOydtO2UhO2DgOyehOydtCBSQ1Ug7Jm47J2YIOuplOy7pOuLiOymmOycvOuhnCDqtIDrpqzrkJzri6TripQg7KCQ7J2EIOygnOyZuO2VmOuptAorICAgICByY3VfZGVyZWZlcmVuY2UoKSDsmYDrj4Qg7Jyg7IKs7ZWc642wLCDsmIjrpbwg65Ok66m0IOqwneyytOqwgCDsi5zsiqTthZzsnbQg6rq87KeIIOuVjOyXkOunjAorICAgICDsoJzqsbDrkJjripQg6rK97JqwIOuTseyeheuLiOuLpC4gIOuYkO2VnCwgbG9ja2xlc3NfZGVyZWZlcmVuY2UoKSDsnYAgUkNVIOyZgCDtlajqu5gKKyAgICAg7IKs7Jqp65Cg7IiY64+ELCBSQ1Ug7JeG7J20IOyCrOyaqeuQoCDsiJjrj4Qg7J6I64qUIOydvOu2gCDrjbDsnbTthLAg6rWs7KGw7JeQIOyCrOyaqeuQmOqzoAorICAgICDsnojsirXri4jri6QuCisKKworICgqKSBkbWFfd21iKCk7CisgKCopIGRtYV9ybWIoKTsKKworICAgICDsnbTqsoPrk6TsnYAgQ1BVIOyZgCBETUEg6rCA64ql7ZWcIOuUlOuwlOydtOyKpOyXkOyEnCDrqqjrkZAg7JWh7IS47IqkIOqwgOuKpe2VnCDqs7XsnKAg66mU66qo66as7J2YCisgICAgIOydveq4sCwg7JOw6riwIOyekeyXheuTpOydmCDsiJzshJzrpbwg67O07J6l7ZWY6riwIOychO2VtCBjb25zaXN0ZW50IG1lbW9yeSDsl5DshJwg7IKs7Jqp7ZWY6riwCisgICAgIOychO2VnCDqsoPrk6TsnoXri4jri6QuCisKKyAgICAg7JiI66W8IOuTpOyWtCwg65SU67CU7J207Iqk7JmAIOuplOuqqOumrOulvCDqs7XsnKDtlZjrqbAsIOuUlOyKpO2BrOumve2EsCDsg4Htg5wg6rCS7J2EIOyCrOyaqe2VtAorICAgICDrlJTsiqTtgazrpr3thLDqsIAg65SU67CU7J207Iqk7JeQIOyGje2VtCDsnojripTsp4Ag7JWE64uI66m0IENQVSDsl5Ag7IaN7ZW0IOyeiOuKlOyngCDtkZzsi5ztlZjqs6AsCisgICAgIOqzteyngOyaqSDstIjsnbjsooUoZG9vcmJlbGwpIOydhCDsgqzsmqntlbQg7JeF642w7J207Yq465CcIOuUlOyKpO2BrOumve2EsOqwgCDrlJTrsJTsnbTsiqTsl5Ag7IKs7JqpCisgICAgIOqwgOuKpe2VtOyhjOydjOydhCDqs7Xsp4DtlZjripQg65SU67CU7J207IqkIOuTnOudvOydtOuyhOulvCDsg53qsIHtlbQg67SF7Iuc64ukOgorCisJaWYgKGRlc2MtPnN0YXR1cyAhPSBERVZJQ0VfT1dOKSB7CisJCS8qIOuUlOyKpO2BrOumve2EsOulvCDshozsnKDtlZjquLAg7KCE7JeQ64qUIOuNsOydtO2EsOulvCDsnb3sp4Ag7JWK7J2MICovCisJCWRtYV9ybWIoKTsKKworCQkvKiDrjbDsnbTthLDrpbwg7J296rOgIOyUgCAqLworCQlyZWFkX2RhdGEgPSBkZXNjLT5kYXRhOworCQlkZXNjLT5kYXRhID0gd3JpdGVfZGF0YTsKKworCQkvKiDsg4Htg5wg7JeF642w7J207Yq4IOyghCDsiJjsoJXsgqztla3snYQg67CY7JiBICovCisJCWRtYV93bWIoKTsKKworCQkvKiDshozsnKDqtozsnYQg7IiY7KCVICovCisJCWRlc2MtPnN0YXR1cyA9IERFVklDRV9PV047CisKKwkJLyogTU1JTyDrpbwg7Ya17ZW0IOuUlOuwlOydtOyKpOyXkCDqs7Xsp4Drpbwg7ZWY6riwIOyghOyXkCDrqZTrqqjrpqzrpbwg64+Z6riw7ZmUICovCisJCXdtYigpOworCisJCS8qIOyXheuNsOydtO2KuOuQnCDrlJTsiqTtgazrpr3thLDsnZgg65SU67CU7J207Iqk7JeQIOqzteyngCAqLworCQl3cml0ZWwoREVTQ19OT1RJRlksIGRvb3JiZWxsKTsKKwl9CisKKyAgICAgZG1hX3JtYigpIOuKlCDrlJTsiqTtgazrpr3thLDroZzrtoDthLAg642w7J207YSw66W8IOydveyWtOyYpOq4sCDsoITsl5Ag65SU67CU7J207Iqk6rCAIOyGjOycoOq2jOydhAorICAgICDrgrTrhpPslZjsnYzsnYQg67O07J6l7ZWY6rKMIO2VmOqzoCwgZG1hX3dtYigpIOuKlCDrlJTrsJTsnbTsiqTqsIAg7J6Q7Iug7J20IOyGjOycoOq2jOydhCDri6Tsi5wKKyAgICAg6rCA7KGM7J2M7J2EIOuztOq4sCDsoITsl5Ag65SU7Iqk7YGs66a97YSw7JeQIOuNsOydtO2EsOqwgCDsk7DsmIDsnYzsnYQg67O07J6l7ZWp64uI64ukLiAgd21iKCkg64qUCisgICAgIOy6kOyLnCDsnbzqtIDshLHsnbQg7JeG64qUIChjYWNoZSBpbmNvaGVyZW50KSBNTUlPIOyYgeyXreyXkCDsk7DquLDrpbwg7Iuc64+E7ZWY6riwIOyghOyXkAorICAgICDsupDsi5wg7J286rSA7ISx7J20IOyeiOuKlCDrqZTrqqjrpqwgKGNhY2hlIGNvaGVyZW50IG1lbW9yeSkg7JOw6riw6rCAIOyZhOujjOuQmOyXiOydjOydhAorICAgICDrs7TsnqXtlbTso7zquLAg7JyE7ZW0IO2VhOyalO2VqeuLiOuLpC4KKworICAgICBjb25zaXN0ZW50IG1lbW9yeSDsl5Ag64yA7ZWcIOyekOyEuO2VnCDrgrTsmqnsnYQg7JyE7ZW07ISgIERvY3VtZW50YXRpb24vRE1BLUFQSS50eHQKKyAgICAg66y47ISc66W8IOywuOqzoO2VmOyEuOyalC4KKworCitNTUlPIOyTsOq4sCDrsLDrpqzslrQKKy0tLS0tLS0tLS0tLS0tLS0KKwor66as64iF7IqkIOy7pOuEkOydgCDrmJDtlZwgbWVtb3J5LW1hcHBlZCBJL08g7JOw6riw66W8IOychO2VnCDtirnrs4TtlZwg67Cw66as7Ja064+EIOqwgOyngOqzoAor7J6I7Iq164uI64ukOgorCisJbW1pb3diKCk7CisKK+ydtOqyg+ydgCBtYW5kYXRvcnkg7JOw6riwIOuwsOumrOyWtOydmCDrs4DsooXsnLzroZwsIOyZhO2ZlOuQnCDsiJzshJwg6rec7LmZ7J2YIEkvTyDsmIHsl63sl5DsnLzroZzsnZgKK+yTsOq4sOqwgCDrtoDrtoTsoIHsnLzroZwg7Iic7ISc66W8IOunnuy2lOuPhOuhnSDtlbTspI3ri4jri6QuICDsnbQg7ZWo7IiY64qUIENQVS0+7ZWY65Oc7Juo7Ja0IOyCrOydtOulvAor64SY7Ja07IScIOyLpOygnCDtlZjrk5zsm6jslrTsl5DquYzsp4Ag7J2867aAIOyImOykgOydmCDsmIHtlqXsnYQg64G87Lmp64uI64ukLgorCivrjZQg66eO7J2AIOygleuztOulvCDsnITtlbTshKAgIkFjcXVpcmUgdnMgSS9PIOyVoeyEuOyKpCIg7ISc67iM7IS57IWY7J2EIOywuOqzoO2VmOyEuOyalC4KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09CivslZTrrLXsoIEg7Luk64SQIOuplOuqqOumrCDrsLDrpqzslrQKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKwor66as64iF7IqkIOy7pOuEkOydmCDsnbzrtoAg7ZWo7IiY65Ok7J2AIOuplOuqqOumrCDrsLDrpqzslrTrpbwg64K07J6l7ZWY6rOgIOyeiOuKlOuNsCwg6529KGxvY2sp6rO8CivsiqTsvIDspbTrp4Eg6rSA66CoIO2VqOyImOuTpOydtCDrjIDrtoDrtoTsnoXri4jri6QuCisKK+yXrOq4sOyEoCBf7LWc7IaM7ZWc7J2YXyDrs7TsnqXsnYQg7ISk66qF7ZWp64uI64ukOyDtirnsoJUg7JWE7YKk7YWN7LOQ7JeQ7ISc64qUIOydtCDshKTrqoXrs7Tri6Qg642UIOunjuydgAor67O07J6l7J2EIOygnOqzte2VoCDsiJjrj4Qg7J6I7Iq164uI64uk66eMIO2VtOuLuSDslYTtgqTthY3ss5Dsl5Ag7KKF7IaN7KCB7J24IOy9lOuTnCDsmbjsnZgg67aA67aE7JeQ7ISc64qUCivqt7jrn7Ag67O07J6l7J2EIOq4sOuMgO2VtOyEoCDslYjrkKDqsoHri4jri6QuCisKKwor6529IEFDUVVJU0lUSU9OIO2VqOyImAorLS0tLS0tLS0tLS0tLS0tLS0tLQorCivrpqzriIXsiqQg7Luk64SQ7J2AIOuLpOyWke2VnCDrnb0g6rWs7ISx7LK066W8IOqwgOyngOqzoCDsnojsirXri4jri6Q6CisKKyAoKikg7Iqk7ZWAIOudvQorICgqKSBSL1cg7Iqk7ZWAIOudvQorICgqKSDrrqTthY3siqQKKyAoKikg7IS466eI7Y+s7Ja0CisgKCopIFIvVyDshLjrp4jtj6zslrQKKwor6rCBIOq1rOyEseyytOuniOuLpCDrqqjrk6Ag6rK97Jqw7JeQICJBQ1FVSVJFIiDsmKTtjbzroIjsnbTshZjqs7wgIlJFTEVBU0UiIOyYpO2NvOugiOydtOyFmOydmCDrs4DsooXsnbQKK+yhtOyerO2VqeuLiOuLpC4gIOydtCDsmKTtjbzroIjsnbTshZjrk6TsnYAg66qo65GQIOyggeygiO2VnCDrsLDrpqzslrTrpbwg64K07Y+s7ZWY6rOgIOyeiOyKteuLiOuLpDoKKworICgxKSBBQ1FVSVJFIOyYpO2NvOugiOydtOyFmOydmCDsmIHtlqU6CisKKyAgICAgQUNRVUlSRSDrkqTsl5DshJwg7JqU7LKt65CcIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZjsnYAgQUNRVUlSRSDsmKTtjbzroIjsnbTshZjsnbQg7JmE66OM65CcCisgICAgIOuSpOyXkCDsmYTro4zrkKnri4jri6QuCisKKyAgICAgQUNRVUlSRSDslZ7sl5DshJwg7JqU7LKt65CcIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZjsnYAgQUNRVUlSRSDsmKTtjbzroIjsnbTshZjsnbQg7JmE66OM65CcIO2bhOyXkAorICAgICDsmYTro4zrkKAg7IiYIOyeiOyKteuLiOuLpC4gIHNtcF9tYl9fYmVmb3JlX3NwaW5sb2NrKCkg65Kk7JeQIEFDUVVJUkUg6rCAIOyLpO2WieuQmOuKlAorICAgICDsvZTrk5wg67iU66Gd7J2AIOu4lOuhnSDslZ7snZgg7Iqk7Yag7Ja066W8IOu4lOuhnSDrkqTsnZgg66Gc65Oc7JmAIOyKpO2GoOyWtOyXkCDrjIDtlbQg7Iic7IScCisgICAgIOunnuy2peuLiOuLpC4gIOydtOqxtCBzbXBfbWIoKSDrs7Tri6Qg7JmE7ZmU65CcIOqyg+yehOydhCDquLDslrXtlZjshLjsmpQhICDrp47snYAg7JWE7YKk7YWN7LOQ7JeQ7IScCisgICAgIHNtcF9tYl9fYmVmb3JlX3NwaW5sb2NrKCkg7J2AIOyCrOyLpCDslYTrrLTsnbzrj4Qg7ZWY7KeAIOyViuyKteuLiOuLpC4KKworICgyKSBSRUxFQVNFIOyYpO2NvOugiOydtOyFmOydmCDsmIHtlqU6CisKKyAgICAgUkVMRUFTRSDslZ7sl5DshJwg7JqU7LKt65CcIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZjsnYAgUkVMRUFTRSDsmKTtjbzroIjsnbTshZjsnbQg7JmE66OM65CY6riwCisgICAgIOyghOyXkCDsmYTro4zrkKnri4jri6QuCisKKyAgICAgUkVMRUFTRSDrkqTsl5DshJwg7JqU7LKt65CcIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZjsnYAgUkVMRUFTRSDsmKTtjbzroIjsnbTshZgg7JmE66OMIOyghOyXkAorICAgICDsmYTro4zrkKAg7IiYIOyeiOyKteuLiOuLpC4KKworICgzKSBBQ1FVSVJFIHZzIEFDUVVJUkUg7JiB7ZalOgorCisgICAgIOyWtOuWpCBBQ1FVSVJFIOyYpO2NvOugiOydtOyFmOuztOuLpCDslZ7sl5DshJwg7JqU7LKt65CcIOuqqOuToCBBQ1FVSVJFIOyYpO2NvOugiOydtOyFmOydgCDqt7gKKyAgICAgQUNRVUlSRSDsmKTtjbzroIjsnbTshZgg7KCE7JeQIOyZhOujjOuQqeuLiOuLpC4KKworICg0KSBBQ1FVSVJFIHZzIFJFTEVBU0UgaW1wbGljYXRpb246CisKKyAgICAg7Ja065akIFJFTEVBU0Ug7Jik7Y2866CI7J207IWY67O064ukIOyVnuyEnCDsmpTssq3rkJwgQUNRVUlSRSDsmKTtjbzroIjsnbTshZjsnYAg6re4IFJFTEVBU0UKKyAgICAg7Jik7Y2866CI7J207IWY67O064ukIOuovOyggCDsmYTro4zrkKnri4jri6QuCisKKyAoNSkg7Iuk7Yyo7ZWcIOyhsOqxtOyggSBBQ1FVSVJFIOyYge2WpToKKworICAgICBBQ1FVSVJFIOyYpO2NvOugiOydtOyFmOydmCDsnbzrtoAg6529KGxvY2spIOuzgOyiheydgCDrnb3snbQg6rOn67CU66GcIO2ajeuTne2VmOq4sOyXkOuKlAorICAgICDrtojqsIDriqXtlZwg7IOB7YOc7J206rGw64KYIOudveydtCDtmo3rk50g6rCA64ql7ZW07KeA64+E66GdIOq4sOuLpOumrOuKlCDrj4TspJEg7Iuc6re464SQ7J2EIOuwm+qxsOuCmAorICAgICDtlbTshJwg7Iuk7Yyo7ZWgIOyImCDsnojsirXri4jri6QuICDsi6TtjKjtlZwg65297J2AIOyWtOuWpCDrsLDrpqzslrTrj4Qg64K07Y+s7ZWY7KeAIOyViuyKteuLiOuLpC4KKworWyFdIOywuOqzoDog6529IEFDUVVJUkUg7JmAIFJFTEVBU0Ug6rCAIOuLqOuwqe2WpSDrsLDrpqzslrTsl6zshJwg64KY7YOA64KY64qUIO2YhOyDgSDspJEg7ZWY64KY64qUCivtgazrpqzti7Dsu6wg7IS57IWYIOuwlOq5peydmCDsnbjsiqTtirjrn63shZjsnZgg7JiB7Zal7J20IO2BrOumrO2LsOy7rCDshLnshZgg64K067aA66Gc64+EIOuTpOyWtOyYrCDsiJgKK+yeiOuLpOuKlCDqsoPsnoXri4jri6QuCisKK1JFTEVBU0Ug7ZuE7JeQIOyalOyyreuQmOuKlCBBQ1FVSVJFIOuKlCDsoITssrQg66mU66qo66asIOuwsOumrOyWtOudvCDsl6zqsqjsp4DrqbQg7JWI65CY64qU642wLAorQUNRVUlSRSDslZ7snZgg7JWh7IS47Iqk6rCAIEFDUVVJUkUg7ZuE7JeQIOyImO2WieuQoCDsiJgg7J6I6rOgLCBSRUxFQVNFIO2bhOydmCDslaHshLjsiqTqsIAKK1JFTEVBU0Ug7KCE7JeQIOyImO2WieuQoCDsiJjrj4Qg7J6I7Jy866mwLCDqt7gg65GQ6rCc7J2YIOyVoeyEuOyKpOqwgCDshJzroZzrpbwg7KeA64KY7LmgIOyImOuPhCDsnojquLAKK+uVjOusuOyeheuLiOuLpDoKKworCSpBID0gYTsKKwlBQ1FVSVJFIE0KKwlSRUxFQVNFIE0KKwkqQiA9IGI7CisKK+uKlCDri6TsnYzqs7wg6rCZ7J20IOuQoCDsiJjrj4Qg7J6I7Iq164uI64ukOgorCisJQUNRVUlSRSBNLCBTVE9SRSAqQiwgU1RPUkUgKkEsIFJFTEVBU0UgTQorCitBQ1FVSVJFIOyZgCBSRUxFQVNFIOqwgCDrnb0g7ZqN65Od6rO8IO2VtOygnOudvOuptCwg6re466as6rOgIOudveydmCBBQ1FVSVJFIOyZgCBSRUxFQVNFIOqwgAor6rCZ7J2AIOudvSDrs4DsiJjsl5Ag64yA7ZWcIOqyg+ydtOudvOuptCwg7ZW064u5IOudveydhCDspZDqs6Ag7J6I7KeAIOyViuydgCDri6TrpbggQ1BVIOydmCDsi5zslbzsl5DripQKK+ydtOyZgCDqsJnsnYAg7J6s67Cw7LmY6rCAIOydvOyWtOuCmOuKlCDqsoPsnLzroZwg67O07J28IOyImCDsnojsirXri4jri6QuICDsmpTslb3tlZjsnpDrqbQsIEFDUVVJUkUg7JeQCivsnbTslrQgUkVMRUFTRSDsmKTtjbzroIjsnbTshZjsnYQg7Iic7LCo7KCB7Jy866GcIOyLpO2Wie2VmOuKlCDtlonsnITqsIAg7KCE7LK0IOuplOuqqOumrCDrsLDrpqzslrTroZwKK+yDneqwgeuQmOyWtOyEoCAt7JWI65Cp64uI64ukLS4KKwor67mE7Iq37ZWY6rKMLCDslZ7snZgg67CY64yAIOy8gOydtOyKpOyduCBSRUxFQVNFIOyZgCBBQ1FVSVJFIOuRkOqwnCDsmKTtjbzroIjsnbTshZjsnZgg7Iic7LCo7KCBIOyLpO2WiQor7Jet7IucIOyghOyytCDrqZTrqqjrpqwg67Cw66as7Ja066W8IOuCtO2PrO2VmOyngCDslYrsirXri4jri6QuICDrlLDrnbzshJwsIFJFTEVBU0UsIEFDUVVJUkUg66GcCivqt5zsoJXrkJjripQg7YGs66as7Yuw7LusIOyEueyFmOydmCBDUFUg7IiY7ZaJ7J2AIFJFTEVBU0Ug7JmAIEFDUVVJUkUg66W8IOqwgOuhnOyngOulvCDsiJgg7J6I7Jy866+A66GcLAor64uk7J2M6rO8IOqwmeydgCDsvZTrk5zripQ6CisKKwkqQSA9IGE7CisJUkVMRUFTRSBNCisJQUNRVUlSRSBOCisJKkIgPSBiOworCivri6TsnYzqs7wg6rCZ7J20IOyImO2WieuQoCDsiJgg7J6I7Iq164uI64ukOgorCisJQUNRVUlSRSBOLCBTVE9SRSAqQiwgU1RPUkUgKkEsIFJFTEVBU0UgTQorCivsnbTrn7Ag7J6s67Cw7LmY64qUIOuNsOuTnOudveydhCDsnbzsnLztgqwg7IiY64+EIOyeiOydhCDqsoPsspjrn7wg67O07J28IOyImCDsnojsirXri4jri6QuICDtlZjsp4Drp4wsIOq3uOufsAor642w65Oc65297J2YIOyhsOynkOydtCDsnojri6TrqbQgUkVMRUFTRSDripQg64uo7Iic7Z6IIOyZhOujjOuQoCDqsoPsnbTrr4DroZwg642w65Oc65297J2AIOyhtOyerO2VoCDsiJgKK+yXhuyKteuLiOuLpC4KKworCeydtOqyjCDslrTrlrvqsowg7Jis67CU66W4IOuPmeyekeydhCDtlaAg7IiYIOyeiOydhOq5jOyalD8KKworCeyasOumrOqwgCDsnbTslbzquLAg7ZWY6rOgIOyeiOuKlOqxtCDsnqzrsLDsuZjrpbwg7ZWY64qUIENQVSDsl5Ag64yA7ZWcIOydtOyVvOq4sOydtOyngCwKKwnsu7TtjIzsnbzrn6zsl5Ag64yA7ZWcIOqyg+ydtCDslYTri4jrnoAg7KCQ7J20IO2VteyLrOyeheuLiOuLpC4gIOy7tO2MjOydvOufrCAo65iQ64qULCDqsJzrsJzsnpApCisJ6rCAIOyYpO2NvOugiOydtOyFmOuTpOydhCDsnbTroIfqsowg7J6s67Cw7LmY7ZWY66m0LCDrjbDrk5zrnb3snbQg7J287Ja064KgIOyImCAt7J6I7Iq1LeuLiOuLpC4KKworCe2VmOyngOunjCBDUFUg6rCAIOyYpO2NvOugiOydtOyFmOuTpOydhCDsnqzrsLDsuZgg7ZaI64uk64qU6rG4IOyDneqwge2VtCDrs7TshLjsmpQuICDsnbQg7JiI7JeQ7IScLAorCeyWtOyFiOu4lOumrCDsvZTrk5wg7IOB7Jy866Gc64qUIOyWuOudveydtCDrnb3snYQg7JWe7ISc6rKMIOuQmOyWtCDsnojsirXri4jri6QuICBDUFUg6rCAIOydtOulvAorCeyerOuwsOy5mO2VtOyEnCDrkqTsnZgg6529IOyYpO2NvOugiOydtOyFmOydhCDrqLzsoIAg7Iuk7ZaJ7ZWY6rKMIOuQqeuLiOuLpC4gIOunjOyVvSDrjbDrk5zrnb3snbQKKwnsobTsnqztlZzri6TrqbQsIOydtCDrnb0g7Jik7Y2866CI7J207IWY7J2AIOq3uOyggCDsiqTtlYDsnYQg7ZWY66mwIOqzhOyGje2VtOyEnCDrnb3snYQKKwnsi5zrj4Ttlanri4jri6QgKOuYkOuKlCwg7ZWc7LC4IO2bhOyXkOqyoOyngOunjCwg7J6g65Ot64uI64ukKS4gIENQVSDripQg7Ja47KCg6rCA64qUCisJKOyWtOyFiOu4lOumrCDsvZTrk5zsl5DshJzripQg65297J2EIOyVnuyEnOuKlCkg7Ja46529IOyYpO2NvOugiOydtOyFmOydhCDsi6TtlontlZjripTrjbAsIOydtCDslrjrnb0KKwnsmKTtjbzroIjsnbTshZjsnbQg7J6g7J6s7KCBIOuNsOuTnOudveydhCDtlbTqsrDtlZjqs6AsIOudvSDsmKTtjbzroIjsnbTshZjrj4Qg65Kk7J207Ja0IOyEseqzte2VmOqyjAorCeuQqeuLiOuLpC4KKworCe2VmOyngOunjCDrp4zslb0g65297J20IOyeoOydhCDsnpDripQg7YOA7J6F7J207JeI64uk66m07JqUPyAg6re465+wIOqyveyasOyXkCDsvZTrk5zripQKKwnsiqTsvIDspbTrn6zroZwg65Ok7Ja06rCA66CkIO2VoCDqsbDqs6AsIOyXrOq4sOyEnCDqsrDqta3snYAg66mU66qo66asIOuwsOumrOyWtOulvCDrp4zrgpjqsowKKwnrkJjripTrjbAsIOydtCDrqZTrqqjrpqwg67Cw66as7Ja064qUIOyVnuydmCDslrjrnb0g7Jik7Y2866CI7J207IWY7J20IOyZhOujjOuQmOuPhOuhnSDrp4zrk6Tqs6AsCisJ642w65Oc65297J2AIOydtOuyiOyXkOuPhCDtlbTqsrDrkKnri4jri6QuICDsnqDsnYQg7J6Q64qUIO2WieychOyZgCDslrjrnb0g7IKs7J207J2YIOqyveyjvCDsg4HtmakKKwkocmFjZSkg64+EIOyeiOydhCDsiJgg7J6I6rKg7Iq164uI64uk66eMLCDrnb0g6rSA66CoIOq4sOuKpeuTpOydgCDqt7jrn7Ag6rK97KO8IOyDge2ZqeydhCDrqqjrk6AKKwnqsr3smrDsl5Ag7KCc64yA66GcIO2VtOqysO2VoCDsiJgg7J6I7Ja07JW8IO2VqeuLiOuLpC4KKwor65296rO8IOyEuOuniO2PrOyWtOuKlCBVUCDsu7TtjIzsnbzrkJwg7Iuc7Iqk7YWc7JeQ7ISc7J2YIOyInOyEnOyXkCDrjIDtlbQg67O07J6l7J2EIO2VmOyngCDslYrquLAg65WM66y47JeQLAor6re465+wIOyDge2ZqeyXkOyEnCDsnbjthLDrn73tirgg67mE7Zmc7ISx7ZmUIOyYpO2NvOugiOydtOyFmOqzvCDtlajqu5jqsIAg7JWE64uI652866m0IOyWtOuWpCDsnbzsl5Drj4QgLSDtirntnogKK0kvTyDslaHshLjsiqTsmYAg6rSA66Co7ZW07ISc64qUIC0g7KCc64yA66GcIOyCrOyaqeuQoCDsiJgg7JeG7J2EIOqygeuLiOuLpC4KKworIkNQVSDqsIQgQUNRVUlSSU5HIOuwsOumrOyWtCDtmqjqs7wiIOyEueyFmOuPhCDssLjqs6DtlZjsi5zquLAg67CU656N64uI64ukLgorCisKK+yYiOulvCDrk6TslrQsIOuLpOydjOqzvCDqsJnsnYAg7L2U65Oc66W8IOyDneqwge2VtCDrtIXsi5zri6Q6CisKKwkqQSA9IGE7CisJKkIgPSBiOworCUFDUVVJUkUKKwkqQyA9IGM7CisJKkQgPSBkOworCVJFTEVBU0UKKwkqRSA9IGU7CisJKkYgPSBmOworCivsl6zquLDshKAg64uk7J2M7J2YIOydtOuypO2KuCDsi5ztgIDsiqTqsIAg7IOd6ri4IOyImCDsnojsirXri4jri6Q6CisKKwlBQ1FVSVJFLCB7KkYsKkF9LCAqRSwgeypDLCpEfSwgKkIsIFJFTEVBU0UKKworCVsrXSB7KkYsKkF9IOuKlCDsobDtlanrkJwg7JWh7IS47Iqk66W8IOydmOuvuO2VqeuLiOuLpC4KKwor7ZWY7KeA66eMIOuLpOydjOqzvCDqsJnsnYAg6rG0IOu2iOqwgOuKpe2VmOyjoDoKKworCXsqRiwqQX0sICpCLAlBQ1FVSVJFLCAqQywgKkQsCVJFTEVBU0UsICpFCisJKkEsICpCLCAqQywJQUNRVUlSRSwgKkQsCQlSRUxFQVNFLCAqRSwgKkYKKwkqQSwgKkIsCQlBQ1FVSVJFLCAqQywJCVJFTEVBU0UsICpELCAqRSwgKkYKKwkqQiwJCUFDUVVJUkUsICpDLCAqRCwJUkVMRUFTRSwgeypGLCpBfSwgKkUKKworCisKK+yduO2EsOufve2KuCDruYTtmZzshLHtmZQg7ZWo7IiYCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK+yduO2EsOufve2KuOulvCDruYTtmZzshLHtmZQg7ZWY64qUIO2VqOyImCAoQUNRVUlSRSDsmYAg64+Z7J28KSDsmYAg7J247YSw65+97Yq466W8IO2ZnOyEse2ZlCDtlZjripQg7ZWo7IiYCisoUkVMRUFTRSDsmYAg64+Z7J28KSDripQg7Lu07YyM7J2865+sIOuwsOumrOyWtOyymOufvOunjCDrj5nsnpHtlanri4jri6QuICDrlLDrnbzshJwsIOuzhOuPhOydmCDrqZTrqqjrpqwKK+uwsOumrOyWtOuCmCBJL08g67Cw66as7Ja06rCAIO2VhOyalO2VnCDsg4HtmansnbTrnbzrqbQg6re4IOuwsOumrOyWtOuTpOydgCDsnbjthLDrn73tirgg67mE7Zmc7ISx7ZmUIO2VqOyImAor7Jm47J2YIOuwqeuyleycvOuhnCDsoJzqs7XrkJjslrTslbzrp4wg7ZWp64uI64ukLgorCisKK+yKrOumveqzvCDsm6jsnbTtgazsl4Ug7ZWo7IiYCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCivquIDroZzrsowg642w7J207YSw7JeQIO2RnOyLnOuQnCDsnbTrsqTtirjsl5Ag7J2Y7ZW0IO2UhOuhnOyEuOyKpOulvCDsnqDsl5Ag67mg7Yq466as64qUIOqyg+qzvCDquajsmrDripQg6rKD7J2ACivtlbTri7kg7J2067Kk7Yq466W8IOq4sOuLpOumrOuKlCDtg5zsiqTtgazsnZgg7YOc7Iqk7YGsIOyDge2DnOyZgCDqt7gg7J2067Kk7Yq466W8IOyVjOumrOq4sCDsnITtlbQg7IKs7Jqp65CY64qUCivquIDroZzrsowg642w7J207YSwLCDrkZAg642w7J207YSw6rCE7J2YIOyDge2YuOyekeyaqeycvOuhnCDrs7wg7IiYIOyeiOyKteuLiOuLpC4gIOydtOqyg+ydtCDsmLPsnYAg7Iic7ISc64yA66GcCivsnbzslrTrgqjsnYQg67aE66qF7Z6IIO2VmOq4sCDsnITtlbQsIO2UhOuhnOyEuOyKpOulvCDsnqDsl5Ag65Ok6rKMIO2VmOuKlCDquLDriqXqs7wg6rmo7Jqw64qUIOq4sOuKpeydgAor66qH6rCA7KeAIOuwsOumrOyWtOulvCDrgrTtj6ztlanri4jri6QuCisKK+uovOyggCwg7J6g7J2EIOyerOyasOuKlCDsqr3snYAg7J2867CY7KCB7Jy866GcIOuLpOydjOqzvCDqsJnsnYAg7J2067Kk7Yq4IOyLnO2AgOyKpOulvCDrlLDrpoXri4jri6Q6CisKKwlmb3IgKDs7KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGV2ZW50X2luZGljYXRlZCkKKwkJCWJyZWFrOworCQlzY2hlZHVsZSgpOworCX0KKworc2V0X2N1cnJlbnRfc3RhdGUoKSDsl5Ag7J2Y7ZW0LCDtg5zsiqTtgawg7IOB7YOc6rCAIOuwlOuAkCDtm4Qg67KU7JqpIOuplOuqqOumrCDrsLDrpqzslrTqsIAKK+yekOuPmeycvOuhnCDsgr3snoXrkKnri4jri6Q6CisKKwlDUFUgMQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlzZXRfY3VycmVudF9zdGF0ZSgpOworCSAgc21wX3N0b3JlX21iKCk7CisJICAgIFNUT1JFIGN1cnJlbnQtPnN0YXRlCisJICAgIDzrspTsmqkg67Cw66as7Ja0PgorCUxPQUQgZXZlbnRfaW5kaWNhdGVkCisKK3NldF9jdXJyZW50X3N0YXRlKCkg64qUIOuLpOydjOydmCDqsoPrk6TroZwg6rCQ7Iu47KeIIOyImOuPhCDsnojsirXri4jri6Q6CisKKwlwcmVwYXJlX3RvX3dhaXQoKTsKKwlwcmVwYXJlX3RvX3dhaXRfZXhjbHVzaXZlKCk7CisKK+ydtOqyg+uTpCDsl63si5wg7IOB7YOc66W8IOyEpOygle2VnCDtm4Qg67KU7JqpIOuplOuqqOumrCDrsLDrpqzslrTrpbwg7IK97J6F7ZWp64uI64ukLgor7JWe7J2YIOyghOyytCDsi5ztgIDsiqTripQg64uk7J2M6rO8IOqwmeydgCDtlajsiJjrk6TroZwg7ZWc67KI7JeQIOyImO2WiSDqsIDriqXtlZzrjbAsIOydtOqyg+uTpOydgCDrqqjrkZAKK+yYrOuwlOuluCDsnqXshozsl5Ag66mU66qo66asIOuwsOumrOyWtOulvCDsgr3snoXtlanri4jri6Q6CisKKwl3YWl0X2V2ZW50KCk7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKCk7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX2V4Y2x1c2l2ZSgpOworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KCk7CisJd2FpdF9ldmVudF9raWxsYWJsZSgpOworCXdhaXRfZXZlbnRfdGltZW91dCgpOworCXdhaXRfb25fYml0KCk7CisJd2FpdF9vbl9iaXRfbG9jaygpOworCisKK+uRkOuyiOynuOuhnCwg6rmo7Jqw6riw66W8IOyImO2Wie2VmOuKlCDsvZTrk5zripQg7J2867CY7KCB7Jy866GcIOuLpOydjOqzvCDqsJnsnYQg6rKB64uI64ukOgorCisJZXZlbnRfaW5kaWNhdGVkID0gMTsKKwl3YWtlX3VwKCZldmVudF93YWl0X3F1ZXVlKTsKKwor65iQ64qUOgorCisJZXZlbnRfaW5kaWNhdGVkID0gMTsKKwl3YWtlX3VwX3Byb2Nlc3MoZXZlbnRfZGFlbW9uKTsKKword2FrZV91cCgpIOulmOyXkCDsnZjtlbQg7JOw6riwIOuplOuqqOumrCDrsLDrpqzslrTqsIAg64K07Y+s65Cp64uI64ukLiAg66eM7JW9IOq3uOqyg+uTpOydtCDrrZTqsIDrpbwKK+q5qOyatOuLpOuptOyalC4gIOydtCDrsLDrpqzslrTripQg7YOc7Iqk7YGsIOyDge2DnOqwgCDsp4Dsm4zsp4DquLAg7KCE7JeQIOyImO2WieuQmOuvgOuhnCwg7J2067Kk7Yq466W8CivslYzrpqzquLAg7JyE7ZWcIFNUT1JFIOyZgCDtg5zsiqTtgawg7IOB7YOc66W8IFRBU0tfUlVOTklORyDsnLzroZwg7ISk7KCV7ZWY64qUIFNUT1JFIOyCrOydtOyXkAor7JyE7LmY7ZWY6rKMIOuQqeuLiOuLpC4KKworCUNQVSAxCQkJCUNQVSAyCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJc2V0X2N1cnJlbnRfc3RhdGUoKTsJCVNUT1JFIGV2ZW50X2luZGljYXRlZAorCSAgc21wX3N0b3JlX21iKCk7CQl3YWtlX3VwKCk7CisJICAgIFNUT1JFIGN1cnJlbnQtPnN0YXRlCSAgPOyTsOq4sCDrsLDrpqzslrQ+CisJICAgIDzrspTsmqkg67Cw66as7Ja0PgkJICBTVE9SRSBjdXJyZW50LT5zdGF0ZQorCUxPQUQgZXZlbnRfaW5kaWNhdGVkCisKK+2VnOuyiOuNlCDrp5Dtlanri4jri6Trp4wsIOydtCDsk7DquLAg66mU66qo66asIOuwsOumrOyWtOuKlCDsnbQg7L2U65Oc6rCAIOygleunkOuhnCDrrZTqsIDrpbwg6rmo7Jq4IOuVjOyXkOunjAor7Iuk7ZaJ65Cp64uI64ukLiAg7J206rG4IOyEpOuqhe2VmOq4sCDsnITtlbQsIFgg7JmAIFkg64qUIOuqqOuRkCAwIOycvOuhnCDstIjquLDtmZQg65CY7Ja0IOyeiOuLpOuKlCDqsIDsoJUKK+2VmOyXkCDslYTrnpjsnZgg7J2067Kk7Yq4IOyLnO2AgOyKpOulvCDsg53qsIHtlbQg67SF7Iuc64ukOgorCisJQ1BVIDEJCQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlYID0gMTsJCQkJU1RPUkUgZXZlbnRfaW5kaWNhdGVkCisJc21wX21iKCk7CQkJd2FrZV91cCgpOworCVkgPSAxOwkJCQl3YWl0X2V2ZW50KHdxLCBZID09IDEpOworCXdha2VfdXAoKTsJCQkgIGxvYWQgZnJvbSBZIHNlZXMgMSwgbm8gbWVtb3J5IGJhcnJpZXIKKwkJCQkJbG9hZCBmcm9tIFggbWlnaHQgc2VlIDAKKwor7JyEIOyYiOygnOyXkOyEnOydmCDqsr3smrDsmYAg64us66asIOq5qOyasOq4sOqwgCDsoJXrp5DroZwg7ZaJ7ZW07KGM64uk66m0LCBDUFUgMiDsnZggWCDroZzrk5zripQgMSDsnYQKK+uzuOuLpOqzoCDrs7TsnqXrkKAg7IiYIOyeiOydhCDqsoHri4jri6QuCisKK+yCrOyaqSDqsIDriqXtlZwg6rmo7Jqw6riw66WYIO2VqOyImOuTpOuhnCDri6TsnYzqs7wg6rCZ7J2AIOqyg+uTpOydtCDsnojsirXri4jri6Q6CisKKwljb21wbGV0ZSgpOworCXdha2VfdXAoKTsKKwl3YWtlX3VwX2FsbCgpOworCXdha2VfdXBfYml0KCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9ucigpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9wb2xsKCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3N5bmMoKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfc3luY19wb2xsKCk7CisJd2FrZV91cF9sb2NrZWQoKTsKKwl3YWtlX3VwX2xvY2tlZF9wb2xsKCk7CisJd2FrZV91cF9ucigpOworCXdha2VfdXBfcG9sbCgpOworCXdha2VfdXBfcHJvY2VzcygpOworCisKK1shXSDsnqDsnqzsmrDripQg7L2U65Oc7JmAIOq5qOyasOuKlCDsvZTrk5zsl5Ag64K07Y+s65CY64qUIOuplOuqqOumrCDrsLDrpqzslrTrk6TsnYAg6rmo7Jqw6riwIOyghOyXkAor7J2066Oo7Ja07KeEIOyKpO2GoOyWtOulvCDsnqDsnqzsmrDripQg7L2U65Oc6rCAIHNldF9jdXJyZW50X3N0YXRlKCkg66W8IO2YuOy2nO2VnCDtm4Tsl5Ag7ZaJ7ZWY64qUCivroZzrk5zsl5Ag64yA7ZW0IOyInOyEnOulvCDrp57stpTsp4AgX+yViuuKlOuLpOuKlF8g7KCQ7J2EIOq4sOyWte2VmOyEuOyalC4gIOyYiOulvCDrk6TslrQsIOyeoOyerOyasOuKlAor7L2U65Oc6rCAIOuLpOydjOqzvCDqsJnqs6A6CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCWlmIChldmVudF9pbmRpY2F0ZWQpCisJCWJyZWFrOworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlkb19zb21ldGhpbmcobXlfZGF0YSk7CisKK+q5qOyasOuKlCDsvZTrk5zripQg64uk7J2M6rO8IOqwmeuLpOuptDoKKworCW15X2RhdGEgPSB2YWx1ZTsKKwlldmVudF9pbmRpY2F0ZWQgPSAxOworCXdha2VfdXAoJmV2ZW50X3dhaXRfcXVldWUpOworCitldmVudF9pbmRlY2F0ZWQg7JeQ7J2YIOuzgOqyveydtCDsnqDsnqzsmrDripQg7L2U65Oc7JeQ6rKMIG15X2RhdGEg7JeQ7J2YIOuzgOqyvSDtm4Tsl5Ag7J2066Oo7Ja07KeECivqsoPsnLzroZwg7J247KeA65CgIOqyg+ydtOudvOuKlCDrs7TsnqXsnbQg7JeG7Iq164uI64ukLiAg7J2065+wIOqyveyasOyXkOuKlCDslpHsqr0g7L2U65OcIOuqqOuRkCDqsIHqsIHsnZgKK+uNsOydtO2EsCDslaHshLjsiqQg7IKs7J207JeQIOuplOuqqOumrCDrsLDrpqzslrTrpbwg7KeB7KCRIOyzkOyVvCDtlanri4jri6QuICDrlLDrnbzshJwg7JWe7J2YIOyerOyasOuKlAor7L2U65Oc64qUIOuLpOydjOqzvCDqsJnsnbQ6CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCWlmIChldmVudF9pbmRpY2F0ZWQpIHsKKwkJc21wX3JtYigpOworCQlkb19zb21ldGhpbmcobXlfZGF0YSk7CisJfQorCivqt7jrpqzqs6Ag6rmo7Jqw64qUIOy9lOuTnOuKlCDri6TsnYzqs7wg6rCZ7J20IOuQmOyWtOyVvCDtlanri4jri6Q6CisKKwlteV9kYXRhID0gdmFsdWU7CisJc21wX3dtYigpOworCWV2ZW50X2luZGljYXRlZCA9IDE7CisJd2FrZV91cCgmZXZlbnRfd2FpdF9xdWV1ZSk7CisKKwor6re47Jm47J2YIO2VqOyImOuTpAorLS0tLS0tLS0tLS0tLQorCivqt7jsmbjsnZgg67Cw66as7Ja066W8IOuCtO2PrO2VmOuKlCDtlajsiJjrk6TsnYAg64uk7J2M6rO8IOqwmeyKteuLiOuLpDoKKworICgqKSBzY2hlZHVsZSgpIOqzvCDqt7gg7Jyg7IKs7ZWcIOqyg+uTpOydtCDsmYTsoITtlZwg66mU66qo66asIOuwsOumrOyWtOulvCDrgrTtj6ztlanri4jri6QuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitDUFUg6rCEIEFDUVVJUklORyDrsLDrpqzslrTsnZgg7Zqo6rO8Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU01QIOyLnOyKpO2FnOyXkOyEnOydmCDrnb0g6riw64ql65Ok7J2AIOuNlOyasSDqsJXroKXtlZwg7ZiV7YOc7J2YIOuwsOumrOyWtOulvCDsoJzqs7Xtlanri4jri6Q6IOydtAor67Cw66as7Ja064qUIOuPmeydvO2VnCDrnb3snYQg7IKs7Jqp7ZWY64qUIOuLpOuluCBDUFUg65Ok7J2YIOuplOuqqOumrCDslaHshLjsiqQg7Iic7ISc7JeQ64+EIOyYge2WpeydhAor64G87Lmp64uI64ukLgorCisKK0FDUVVJUkUgVlMg66mU66qo66asIOyVoeyEuOyKpAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK+uLpOydjOydmCDsmIjrpbwg7IOd6rCB7ZW0IOu0heyLnOuLpDog7Iuc7Iqk7YWc7J2AIOuRkOqwnOydmCDsiqTtlYDrnb0gKE0pIOqzvCAoUSksIOq3uOumrOqzoCDshLjqsJzsnZggQ1BVCivrpbwg6rCA7KeA6rOgIOyeiOyKteuLiOuLpDsg7Jes6riw7JeQIOuLpOydjOydmCDsnbTrsqTtirgg7Iuc7YCA7Iqk6rCAIOuwnOyDne2VqeuLiOuLpDoKKworCUNQVSAxCQkJCUNQVSAyCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJV1JJVEVfT05DRSgqQSwgYSk7CQlXUklURV9PTkNFKCpFLCBlKTsKKwlBQ1FVSVJFIE0JCQlBQ1FVSVJFIFEKKwlXUklURV9PTkNFKCpCLCBiKTsJCVdSSVRFX09OQ0UoKkYsIGYpOworCVdSSVRFX09OQ0UoKkMsIGMpOwkJV1JJVEVfT05DRSgqRywgZyk7CisJUkVMRUFTRSBNCQkJUkVMRUFTRSBRCisJV1JJVEVfT05DRSgqRCwgZCk7CQlXUklURV9PTkNFKCpILCBoKTsKKworKkEg66Gc7J2YIOyVoeyEuOyKpOu2gO2EsCAqSCDroZzsnZgg7JWh7IS47Iqk6rmM7KeA6rCAIOyWtOuWpCDsiJzshJzroZwgQ1BVIDMg7JeQ6rKMIOuztOyXrOyniOyngOyXkAor64yA7ZW07ISc64qUIOqwgSBDUFUg7JeQ7ISc7J2YIOudvSDsgqzsmqnsl5Ag7J2Y7ZW0IOuCtO2PrOuQmOyWtCDsnojripQg7KCc7JW97J2EIOygnOyZuO2VmOqzoOuKlCDslrTrlqQKK+uztOyepeuPhCDsobTsnqztlZjsp4Ag7JWK7Iq164uI64ukLiAg7JiI66W8IOuTpOyWtCwgQ1BVIDMg7JeQ6rKMIOuLpOydjOqzvCDqsJnsnYAg7Iic7ISc66GcIOuztOyXrOyngOuKlAor6rKD7J20IOqwgOuKpe2VqeuLiOuLpDoKKworCSpFLCBBQ1FVSVJFIE0sIEFDUVVJUkUgUSwgKkcsICpDLCAqRiwgKkEsICpCLCBSRUxFQVNFIFEsICpELCAqSCwgUkVMRUFTRSBNCisKK+2VmOyngOunjCDri6TsnYzqs7wg6rCZ7J20IOuztOydtOyngOuKlCDslYrsnYQg6rKB64uI64ukOgorCisJKkIsICpDIG9yICpEIHByZWNlZGluZyBBQ1FVSVJFIE0KKwkqQSwgKkIgb3IgKkMgZm9sbG93aW5nIFJFTEVBU0UgTQorCSpGLCAqRyBvciAqSCBwcmVjZWRpbmcgQUNRVUlSRSBRCisJKkUsICpGIG9yICpHIGZvbGxvd2luZyBSRUxFQVNFIFEKKworCisKK0FDUVVJUkUgVlMgSS9PIOyVoeyEuOyKpAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCivtirnsoJXtlZwgKO2Kue2eiCBOVU1BIOqwgCDqtIDroKjrkJwpIO2ZmOqyvSDtlZjsl5DshJwg65GQ6rCc7J2YIENQVSDsl5DshJwg64+Z7J287ZWcIOyKpO2VgOudveycvOuhnAor67O07Zi465CY64qUIOuRkOqwnOydmCDtgazrpqzti7Dsu6wg7IS57IWYIOyViOydmCBJL08g7JWh7IS47Iqk64qUIFBDSSDruIzrpr/sp4Dsl5Ag6rK57LOQ7KeEIEkvTwor7JWh7IS47Iqk66GcIOuztOydvCDsiJgg7J6I64qU642wLCBQQ0kg67iM66a/7KeA64qUIOy6kOyLnCDsnbzqtIDshLEg7ZSE66Gc7Yag7L2c6rO8IO2VqeydhCDrp57strDslbwg7ZWgCivsnZjrrLTqsIAg7JeG7Jy866+A66GcLCDtlYTsmpTtlZwg7J296riwIOuplOuqqOumrCDrsLDrpqzslrTqsIAg7JqU7LKt65CY7KeAIOyViuq4sCDrlYzrrLjsnoXri4jri6QuCisKK+yYiOulvCDrk6TslrTshJw6CisKKwlDUFUgMQkJCQlDUFUgMgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCXNwaW5fbG9jayhRKQorCXdyaXRlbCgwLCBBRERSKQorCXdyaXRlbCgxLCBEQVRBKTsKKwlzcGluX3VubG9jayhRKTsKKwkJCQkJc3Bpbl9sb2NrKFEpOworCQkJCQl3cml0ZWwoNCwgQUREUik7CisJCQkJCXdyaXRlbCg1LCBEQVRBKTsKKwkJCQkJc3Bpbl91bmxvY2soUSk7CisKK+uKlCBQQ0kg67iM66a/7KeA7JeQIOuLpOydjOqzvCDqsJnsnbQg67O07J28IOyImCDsnojsirXri4jri6Q6CisKKwlTVE9SRSAqQUREUiA9IDAsIFNUT1JFICpBRERSID0gNCwgU1RPUkUgKkRBVEEgPSAxLCBTVE9SRSAqREFUQSA9IDUKKwor7J2066CH6rKMIOuQmOuptCDtlZjrk5zsm6jslrTsnZgg7Jik64+Z7J6R7J2EIOydvOycvO2CrCDsiJgg7J6I7Iq164uI64ukLgorCisKK+ydtOufsCDqsr3smrDsl5Qg7J6h7JWE65GUIOyKpO2VgOudveydhCDrgrTroKTrhpPquLAg7KCE7JeQIG1taW93YigpIOulvCDsiJjtlontlbTslbwg7ZWY64qU642wLCDsmIjrpbwKK+uTpOuptCDri6TsnYzqs7wg6rCZ7Iq164uI64ukOgorCisJQ1BVIDEJCQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlzcGluX2xvY2soUSkKKwl3cml0ZWwoMCwgQUREUikKKwl3cml0ZWwoMSwgREFUQSk7CisJbW1pb3diKCk7CisJc3Bpbl91bmxvY2soUSk7CisJCQkJCXNwaW5fbG9jayhRKTsKKwkJCQkJd3JpdGVsKDQsIEFERFIpOworCQkJCQl3cml0ZWwoNSwgREFUQSk7CisJCQkJCW1taW93YigpOworCQkJCQlzcGluX3VubG9jayhRKTsKKwor7J20IOy9lOuTnOuKlCBDUFUgMSDsl5DshJwg7JqU7LKt65CcIOuRkOqwnOydmCDsiqTthqDslrTqsIAgUENJIOu4jOumv+yngOyXkCBDUFUgMiDsl5DshJwg7JqU7LKt65CcCivsiqTthqDslrTrk6Trs7Tri6Qg66i87KCAIOuztOyXrOynkOydhCDrs7TsnqXtlanri4jri6QuCisKKwor65iQ7ZWcLCDqsJnsnYAg65SU67CU7J207Iqk7JeQ7IScIOyKpO2GoOyWtOulvCDsnbTslrQg66Gc65Oc6rCAIOyImO2WieuQmOuptCDsnbQg66Gc65Oc64qUIOuhnOuTnOqwgCDsiJjtlonrkJjquLAKK+yghOyXkCDsiqTthqDslrTqsIAg7JmE66OM65CY6riw66W8IOqwleygnO2VmOuvgOuhnCBtbWlvd2IoKSDsnZgg7ZWE7JqU6rCAIOyXhuyWtOynkeuLiOuLpDoKKworCUNQVSAxCQkJCUNQVSAyCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJc3Bpbl9sb2NrKFEpCisJd3JpdGVsKDAsIEFERFIpCisJYSA9IHJlYWRsKERBVEEpOworCXNwaW5fdW5sb2NrKFEpOworCQkJCQlzcGluX2xvY2soUSk7CisJCQkJCXdyaXRlbCg0LCBBRERSKTsKKwkJCQkJYiA9IHJlYWRsKERBVEEpOworCQkJCQlzcGluX3VubG9jayhRKTsKKworCivrjZQg66eO7J2AIOygleuztOulvCDsnITtlbTshKAgRG9jdW1lbmF0YWlvbi9Eb2NCb29rL2RldmljZWlvYm9vay50bXBsIOydhCDssLjqs6DtlZjshLjsmpQuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PQor66mU66qo66asIOuwsOumrOyWtOqwgCDtlYTsmpTtlZwg6rOzCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK+yEpOuguSBTTVAg7Luk64SQ7J2EIOyCrOyaqe2VmOuNlOudvOuPhCDsi7HquIAg7JOw66CI65Oc66GcIOuPmeyeke2VmOuKlCDsvZTrk5zripQg7Jis67CU66W06rKMIOuPmeyeke2VmOuKlAor6rKD7Jy866GcIOuztOyXrOyniCDqsoPsnbTquLAg65WM66y47JeQLCDtj4nrspTtlZwg7Iuc7Iqk7YWcIOyatOyYgeykkeyXkCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWYIOyerOuwsOy5mOuKlAor7J2867CY7KCB7Jy866GcIOusuOygnOqwgCDrkJjsp4Ag7JWK7Iq164uI64ukLiAg7ZWY7KeA66eMLCDsnqzrsLDsuZjqsIAg66y47KCc6rCAIF/rkKAg7IiYIOyeiOuKlF8g64Sk6rCA7KeACivtmZjqsr3snbQg7J6I7Iq164uI64ukOgorCisgKCopIO2UhOuhnOyEuOyEnOqwhCDsg4HtmLgg7J6R7JqpLgorCisgKCopIOyWtO2GoOuvuSDsmKTtjbzroIjsnbTshZguCisKKyAoKikg65SU67CU7J207IqkIOyVoeyEuOyKpC4KKworICgqKSDsnbjthLDrn73tirguCisKKwor7ZSE66Gc7IS47ISc6rCEIOyDge2YuCDsnpHsmqkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK+uRkOqwnCDsnbTsg4HsnZgg7ZSE66Gc7IS47ISc66W8IOqwgOynhCDsi5zsiqTthZzsnbQg7J6I64uk66m0LCDsi5zsiqTthZzsnZgg65GQ6rCcIOydtOyDgeydmCBDUFUg64qUIOuPmeyLnOyXkAor6rCZ7J2AIOuNsOydtO2EsOyXkCDrjIDtlZwg7J6R7JeF7J2EIO2VoCDsiJgg7J6I7Iq164uI64ukLiAg7J2064qUIOuPmeq4sO2ZlCDrrLjsoJzrpbwg7J287Jy87YKsIOyImCDsnojqs6AsCivsnbQg66y47KCc66W8IO2VtOqysO2VmOuKlCDsnbzrsJjsoIEg67Cp67KV7J2AIOudveydhCDsgqzsmqntlZjripQg6rKD7J6F64uI64ukLiAg7ZWY7KeA66eMLCDrnb3snYAg7IOB64u57Z6ICivruYTsmqnsnbQg67mE7Iu47IScIOqwgOuKpe2VmOuptCDrnb3snYQg7IKs7Jqp7ZWY7KeAIOyViuqzoCDsnbzsnYQg7LKY66as7ZWY64qUIOqyg+ydtCDrgqvsirXri4jri6QuICDsnbTrn7AKK+qyveyasCwg65GQIENQVSDrqqjrkZDsl5Ag7JiB7Zal7J2EIOuBvOy5mOuKlCDsmKTtjbzroIjsnbTshZjrk6TsnYAg7Jik64+Z7J6R7J2EIOunieq4sCDsnITtlbQg7Iug7KSR7ZWY6rKMCivsiJzshJzqsIAg66ee7Law7KC47JW8IO2VqeuLiOuLpC4KKwor7JiI66W8IOuTpOyWtCwgUi9XIOyEuOuniO2PrOyWtOydmCDripDrprAg7IiY7ZaJ6rK966GcIChzbG93IHBhdGgpIOulvCDsg53qsIHtlbQg67SF7Iuc64ukLgor7IS466eI7Y+s7Ja066W8IOychO2VtCDrjIDquLDrpbwg7ZWY64qUIO2VmOuCmOydmCDtlITroZzshLjsiqTqsIAg7J6Q7Iug7J2YIOyKpO2DnSDspJEg7J2867aA66W8IOydtAor7IS466eI7Y+s7Ja07J2YIOuMgOq4sCDtlITroZzshLjsiqQg66as7Iqk7Yq47JeQIOunge2BrO2VnCDssYTroZwg7J6I7Iq164uI64ukOgorCisJc3RydWN0IHJ3X3NlbWFwaG9yZSB7CisJCS4uLgorCQlzcGlubG9ja190IGxvY2s7CisJCXN0cnVjdCBsaXN0X2hlYWQgd2FpdGVyczsKKwl9OworCisJc3RydWN0IHJ3c2VtX3dhaXRlciB7CisJCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwkJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCX07CisKK+2KueyglSDrjIDquLAg7IOB7YOcIO2UhOuhnOyEuOyKpOulvCDquajsmrDquLAg7JyE7ZW0LCB1cF9yZWFkKCkg64KYIHVwX3dyaXRlKCkg7ZWo7IiY64qUIOuLpOydjOqzvAor6rCZ7J2AIOydvOydhCDtlanri4jri6Q6CisKKyAoMSkg64uk7J2MIOuMgOq4sCDsg4Htg5wg7ZSE66Gc7IS47IqkIOugiOy9lOuTnOuKlCDslrTrlJTsnojripTsp4Ag7JWM6riwIOychO2VtCDsnbQg64yA6riwIOyDge2DnAorICAgICDtlITroZzshLjsiqQg66CI7L2U65Oc7J2YIG5leHQg7Y+s7J247YSw66W8IOydveyKteuLiOuLpDsKKworICgyKSDsnbQg64yA6riwIOyDge2DnCDtlITroZzshLjsiqTsnZggdGFzayDqtazsobDssrTroZzsnZgg7Y+s7J247YSw66W8IOydveyKteuLiOuLpDsKKworICgzKSDsnbQg64yA6riwIOyDge2DnCDtlITroZzshLjsiqTqsIAg7IS466eI7Y+s7Ja066W8IO2ajeuTne2WiOydjOydhCDslYzrpqzquLAg7JyE7ZW0IHRhc2sKKyAgICAg7Y+s7J247YSw66W8IOy0iOq4sO2ZlCDtlanri4jri6Q7CisKKyAoNCkg7ZW064u5IO2DnOyKpO2BrOyXkCDrjIDtlbQgd2FrZV91cF9wcm9jZXNzKCkg66W8IO2YuOy2nO2VqeuLiOuLpDsg6re466as6rOgCisKKyAoNSkg7ZW064u5IOuMgOq4sCDsg4Htg5wg7ZSE66Gc7IS47Iqk7J2YIHRhc2sg6rWs7KGw7LK066W8IOyeoeqzoCDsnojrjZgg66CI7Y2865+w7Iqk66W8IO2VtOygnO2VqeuLiOuLpC4KKwor64us66asIOunkO2VmOyekOuptCwg64uk7J2MIOydtOuypO2KuCDsi5ztgIDsiqTrpbwg7IiY7ZaJ7ZW07JW8IO2VqeuLiOuLpDoKKworCUxPQUQgd2FpdGVyLT5saXN0Lm5leHQ7CisJTE9BRCB3YWl0ZXItPnRhc2s7CisJU1RPUkUgd2FpdGVyLT50YXNrOworCUNBTEwgd2FrZXVwCisJUkVMRUFTRSB0YXNrCisKK+q3uOumrOqzoCDsnbQg7J2067Kk7Yq465Ok7J20IOuLpOuluCDsiJzshJzroZwg7IiY7ZaJ65Cc64uk66m0LCDsmKTrj5nsnpHsnbQg7J287Ja064KgIOyImCDsnojsirXri4jri6QuCisKK+2VnOuyiCDshLjrp4jtj6zslrTsnZgg64yA6riw7KSE7JeQIOuTpOyWtOqwlOqzoCDshLjrp4jtj6zslrQg65297J2EIOuGk+yVmOuLpOuptCwg7ZW064u5IOuMgOq4sCDtlITroZzshLjsiqTripQKK+udveydhCDri6Tsi5zripQg7J6h7KeAIOyViuyKteuLiOuLpDsg64yA7IugIOyekOyLoOydmCB0YXNrIO2PrOyduO2EsOqwgCDstIjquLDtmZQg65CY6ri4IOq4sOuLpOumveuLiOuLpC4KK+q3uCDroIjsvZTrk5zripQg64yA6riwIO2UhOuhnOyEuOyKpOydmCDsiqTtg53sl5Ag7J6I6riwIOuVjOusuOyXkCwg66as7Iqk7Yq47J2YIG5leHQg7Y+s7J247YSw6rCAIOydve2YgOyngOq4sAorX+yghOyXkF8gdGFzayDtj6zsnbjthLDqsIAg7KeA7JuM7KeE64uk66m0LCDri6TrpbggQ1BVIOuKlCDtlbTri7kg64yA6riwIO2UhOuhnOyEuOyKpOulvCDsi5zsnpHtlbQg67KE66as6rOgCit1cCooKSDtlajsiJjqsIAgbmV4dCDtj6zsnbjthLDrpbwg7J296riwIOyghOyXkCDrjIDquLAg7ZSE66Gc7IS47Iqk7J2YIOyKpO2DneydhCDrp4jqtawg6rG065Oc66a0IOyImAor7J6I7Iq164uI64ukLgorCivqt7jroIfqsowg65CY66m0IOychOydmCDsnbTrsqTtirgg7Iuc7YCA7Iqk7JeQIOyWtOuWpCDsnbzsnbQg7J287Ja064KY64qU7KeAIOyDneqwge2VtCDrs7Tso6A6CisKKwlDUFUgMQkJCQlDUFUgMgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkJCQlkb3duX3h4eCgpCisJCQkJCVF1ZXVlIHdhaXRlcgorCQkJCQlTbGVlcAorCXVwX3l5eSgpCisJTE9BRCB3YWl0ZXItPnRhc2s7CisJU1RPUkUgd2FpdGVyLT50YXNrOworCQkJCQlXb2tlbiB1cCBieSBvdGhlciBldmVudAorCTxwcmVlbXB0PgorCQkJCQlSZXN1bWUgcHJvY2Vzc2luZworCQkJCQlkb3duX3h4eCgpIHJldHVybnMKKwkJCQkJY2FsbCBmb28oKQorCQkJCQlmb28oKSBjbG9iYmVycyAqd2FpdGVyCisJPC9wcmVlbXB0PgorCUxPQUQgd2FpdGVyLT5saXN0Lm5leHQ7CisJLS0tIE9PUFMgLS0tCisKK+ydtCDrrLjsoJzripQg7IS466eI7Y+s7Ja0IOudveydmCDsgqzsmqnsnLzroZwg7ZW06rKw65CgIOyImOuPhCDsnojqsqDsp4Drp4wsIOq3uOugh+qyjCDrkJjrqbQg6rmo7Ja064KcIO2bhOyXkAorZG93bl94eHgoKSDtlajsiJjqsIAg67aI7ZWE7JqU7ZWY6rKMIOyKpO2VgOudveydhCDrmJDri6Tsi5wg7Ja77Ja07JW866eMIO2VqeuLiOuLpC4KKwor7J20IOusuOygnOulvCDtlbTqsrDtlZjripQg67Cp67KV7J2AIOuylOyaqSBTTVAg66mU66qo66asIOuwsOumrOyWtOulvCDstpTqsIDtlZjripQg6rKB64uI64ukOgorCisJTE9BRCB3YWl0ZXItPmxpc3QubmV4dDsKKwlMT0FEIHdhaXRlci0+dGFzazsKKwlzbXBfbWIoKTsKKwlTVE9SRSB3YWl0ZXItPnRhc2s7CisJQ0FMTCB3YWtldXAKKwlSRUxFQVNFIHRhc2sKKwor7J20IOqyveyasOyXkCwg67Cw66as7Ja064qUIOyLnOyKpO2FnOydmCDrgpjrqLjsp4AgQ1BVIOuTpOyXkOqyjCDrqqjrk6Ag67Cw66as7Ja0IOyVnuydmCDrqZTrqqjrpqwg7JWh7IS47Iqk6rCACivrsLDrpqzslrQg65Kk7J2YIOuplOuqqOumrCDslaHshLjsiqTrs7Tri6Qg7JWe7IScIOydvOyWtOuCnCDqsoPsnLzroZwg67O07J206rKMIOunjOuTreuLiOuLpC4gIOuwsOumrOyWtCDslZ7snZgKK+uplOuqqOumrCDslaHshLjsiqTrk6TsnbQg67Cw66as7Ja0IOuqheuguSDsnpDssrTqsIAg7JmE66OM65CY64qUIOyLnOygkOq5jOyngCDsmYTro4zrkJzri6Tqs6DripQg67O07J6l7ZWY7KeACitf7JWK7Iq164uI64ukXy4KKworKOydtOqyjCDrrLjsoJzqsIAg65CY7KeAIOyViuydhCkg64uo7J28IO2UhOuhnOyEuOyEnCDsi5zsiqTthZzsl5DshJwgc21wX21iKCkg64qUIOyLpOygnOuhnOuKlCDqt7jsoIAKK+y7tO2MjOydvOufrOqwgCBDUFUg7JWI7JeQ7ISc7J2YIOyInOyEnOulvCDrsJTqvrjqsbDrgpgg7ZWY7KeAIOyViuqzoCDso7zslrTsp4Qg7Iic7ISc64yA66GcIOuqheugueydhAor64K066as64+E66GdIO2VmOuKlCDsu7TtjIzsnbzrn6wg67Cw66as7Ja07J28IOu/kOyeheuLiOuLpC4gIOyYpOyngSDtlZjrgpjsnZggQ1BVIOunjCDsnojsnLzri4gsIENQVSDsnZgKK+ydmOyhtOyEsSDsiJzshJwg66Gc7KeB7J20IOq3uCDsmbjsnZgg66qo65Og6rKD7J2EIOyVjOyVhOyEnCDsspjrpqztlaAg6rKB64uI64ukLgorCisKK+yWtO2GoOuvuSDsmKTtjbzroIjsnbTshZgKKy0tLS0tLS0tLS0tLS0tLS0tCisKK+yWtO2GoOuvuSDsmKTtjbzroIjsnbTshZjsnYAg6riw7Iig7KCB7Jy866GcIO2UhOuhnOyEuOyEnOqwhCDsg4HtmLjsnpHsmqnsnLzroZwg67aE66WY65CY66mwIOq3uCDspJEg7J2867aA64qUCivsoITssrQg66mU66qo66asIOuwsOumrOyWtOulvCDrgrTtj6ztlZjqs6Ag65iQIOydvOu2gOuKlCDrgrTtj6ztlZjsp4Ag7JWK7KeA66eMLCDsu6TrhJDsl5DshJwg7IOB64u57Z6ICivsnZjsobTsoIHsnLzroZwg7IKs7Jqp7ZWY64qUIOq4sOuKpSDspJEg7ZWY64KY7J6F64uI64ukLgorCivrqZTrqqjrpqzsnZgg7Ja065akIOyDge2DnOulvCDsiJjsoJXtlZjqs6Ag7ZW064u5IOyDge2DnOyXkCDrjIDtlZwgKOyYiOyghOydmCDrmJDripQg7LWc7Iug7J2YKSDsoJXrs7TrpbwKK+umrO2EtO2VmOuKlCDslrTthqDrr7kg7Jik7Y2866CI7J207IWY7J2AIOuqqOuRkCBTTVAt7KGw6rG07KCBIOuylOyaqSDrqZTrqqjrpqwg67Cw66as7Ja0KHNtcF9tYigpKeulvAor7Iuk7KCcIOyYpO2NvOugiOydtOyFmOydmCDslZ7qs7wg65Kk7JeQIOuCtO2PrO2VqeuLiOuLpC4gIOydtOufsCDsmKTtjbzroIjsnbTshZjsnYAg64uk7J2M7J2YIOqyg+uTpOydhAor7Y+s7ZWo7ZWp64uI64ukOgorCisJeGNoZygpOworCWF0b21pY194Y2hnKCk7CQkJYXRvbWljX2xvbmdfeGNoZygpOworCWF0b21pY19pbmNfcmV0dXJuKCk7CQlhdG9taWNfbG9uZ19pbmNfcmV0dXJuKCk7CisJYXRvbWljX2RlY19yZXR1cm4oKTsJCWF0b21pY19sb25nX2RlY19yZXR1cm4oKTsKKwlhdG9taWNfYWRkX3JldHVybigpOwkJYXRvbWljX2xvbmdfYWRkX3JldHVybigpOworCWF0b21pY19zdWJfcmV0dXJuKCk7CQlhdG9taWNfbG9uZ19zdWJfcmV0dXJuKCk7CisJYXRvbWljX2luY19hbmRfdGVzdCgpOwkJYXRvbWljX2xvbmdfaW5jX2FuZF90ZXN0KCk7CisJYXRvbWljX2RlY19hbmRfdGVzdCgpOwkJYXRvbWljX2xvbmdfZGVjX2FuZF90ZXN0KCk7CisJYXRvbWljX3N1Yl9hbmRfdGVzdCgpOwkJYXRvbWljX2xvbmdfc3ViX2FuZF90ZXN0KCk7CisJYXRvbWljX2FkZF9uZWdhdGl2ZSgpOwkJYXRvbWljX2xvbmdfYWRkX25lZ2F0aXZlKCk7CisJdGVzdF9hbmRfc2V0X2JpdCgpOworCXRlc3RfYW5kX2NsZWFyX2JpdCgpOworCXRlc3RfYW5kX2NoYW5nZV9iaXQoKTsKKworCS8qIGV4Y2hhbmdlIOyhsOqxtOydtCDshLHqs7XtlaAg65WMICovCisJY21weGNoZygpOworCWF0b21pY19jbXB4Y2hnKCk7CQlhdG9taWNfbG9uZ19jbXB4Y2hnKCk7CisJYXRvbWljX2FkZF91bmxlc3MoKTsJCWF0b21pY19sb25nX2FkZF91bmxlc3MoKTsKKwor7J206rKD65Ok7J2AIOuplOuqqOumrCDrsLDrpqzslrQg7Zqo6rO86rCAIO2VhOyalO2VnCBBQ1FVSVJFIOu2gOulmOyZgCBSRUxFQVNFIOu2gOulmCDsmKTtjbzroIjsnbTshZjrk6TsnYQKK+q1rO2YhO2VoCDrlYwsIOq3uOumrOqzoCDqsJ3ssrQg7ZW07KCc66W8IOychO2VtCDroIjtjbzrn7DsiqQg7Lm07Jq07YSw66W8IOyhsOygle2VoCDrlYwsIOyVlOusteyggSDrqZTrqqjrpqwKK+uwsOumrOyWtCDtmqjqs7zqsIAg7ZWE7JqU7ZWcIOqzsyDrk7Hsl5Ag7IKs7Jqp65Cp64uI64ukLgorCisKK+uLpOydjOydmCDsmKTtjbzroIjsnbTshZjrk6TsnYAg66mU66qo66asIOuwsOumrOyWtOulvCDrgrTtj6ztlZjsp4AgX+yViuq4sF8g65WM66y47JeQIOusuOygnOqwgCDrkKAg7IiYCivsnojsp4Drp4wsIFJFTEVBU0Ug67aA66WY7J2YIOyYpO2NvOugiOydtOyFmOuTpOqzvCDqsJnsnYAg6rKD65Ok7J2EIOq1rO2YhO2VoCDrlYwg7IKs7Jqp65CgIOyImOuPhAor7J6I7Iq164uI64ukOgorCisJYXRvbWljX3NldCgpOworCXNldF9iaXQoKTsKKwljbGVhcl9iaXQoKTsKKwljaGFuZ2VfYml0KCk7CisKK+ydtOqyg+uTpOydhCDsgqzsmqntlaAg65WM7JeQ64qUIO2VhOyalO2VmOuLpOuptCDsoIHsoIjtlZwgKOyYiOulvCDrk6TrqbQgc21wX21iX19iZWZvcmVfYXRvbWljKCkKK+qwmeydgCkg66mU66qo66asIOuwsOumrOyWtOqwgCDrqoXsi5zsoIHsnLzroZwg7ZWo6ruYIOyCrOyaqeuQmOyWtOyVvCDtlanri4jri6QuCisKKwor7JWE656Y7J2YIOqyg+uTpOuPhCDrqZTrqqjrpqwg67Cw66as7Ja066W8IOuCtO2PrO2VmOyngCBf7JWK6riwXyDrlYzrrLjsl5AsIOydvOu2gCDtmZjqsr3sl5DshJzripQgKOyYiOulvAor65Ok66m0IHNtcF9tYl9fYmVmb3JlX2F0b21pYygpIOqzvCDqsJnsnYApIOuqheyLnOyggeyduCDrqZTrqqjrpqwg67Cw66as7Ja0IOyCrOyaqeydtCDtlYTsmpTtlanri4jri6QuCisKKwlhdG9taWNfYWRkKCk7CisJYXRvbWljX3N1YigpOworCWF0b21pY19pbmMoKTsKKwlhdG9taWNfZGVjKCk7CisKK+ydtOqyg+uTpOydtCDthrXqs4Qg7IOd7ISx7J2EIOychO2VtCDsgqzsmqnrkJzri6TrqbQsIOq3uOumrOqzoCDthrXqs4Qg642w7J207YSwIOyCrOydtOyXkCDqtIDqs4TqsIAg7KG07J6s7ZWY7KeACivslYrripTri6TrqbQg66mU66qo66asIOuwsOumrOyWtOuKlCDtlYTsmpTsuZgg7JWK7J2EIOqygeuLiOuLpC4KKwor6rCd7LK07J2YIOyImOuqheydhCDqtIDrpqztlZjquLAg7JyE7ZW0IOugiO2NvOufsOyKpCDsubTsmrTtjIUg66qp7KCB7Jy866GcIOyCrOyaqeuQnOuLpOuptCwg66CI7Y2865+w7IqkCivsubTsmrTthLDripQg65297Jy866GcIOuztO2YuOuQmOuKlCDshLnshZjsl5DshJzrp4wg7KGw7KCV65CY6rGw64KYIO2YuOy2nO2VmOuKlCDsqr3snbQg7J2066+4IOy2qeu2hO2VnAor66CI7Y2865+w7Iqk66W8IOyeoeqzoCDsnojsnYQg6rKD7J206riwIOuVjOusuOyXkCDrqZTrqqjrpqwg67Cw66as7Ja064qUIOyVhOuniCDtlYTsmpQg7JeG7J2EIOqygeuLiOuLpC4KKwor66eM7JW9IOyWtOuWpCDrnb3snYQg6rWs7ISx7ZWY6riwIOychO2VtCDsgqzsmqnrkJzri6TrqbQsIOudvSDqtIDroKgg64+Z7J6R7J2AIOydvOuwmOyggeycvOuhnCDsnpHsl4XsnYQg7Yq57KCVCivsiJzshJzrjIDroZwg7KeE7ZaJ7ZW07JW8IO2VmOuvgOuhnCDrqZTrqqjrpqwg67Cw66as7Ja06rCAIO2VhOyalO2VoCDsiJgg7J6I7Iq164uI64ukLgorCivquLDrs7jsoIHsnLzroZwsIOqwgSDsgqzsmqnsspjsl5DshJzripQg66mU66qo66asIOuwsOumrOyWtOqwgCDtlYTsmpTtlZzsp4Ag7JWE64uM7KeAIOy2qeu2hO2eiCDqs6DroKTtlbTslbwKK+2VqeuLiOuLpC4KKwor7JWE656Y7J2YIOyYpO2NvOugiOydtOyFmOuTpOydgCDtirnrs4TtlZwg6529IOq0gOugqCDrj5nsnpHrk6TsnoXri4jri6Q6CisKKwl0ZXN0X2FuZF9zZXRfYml0X2xvY2soKTsKKwljbGVhcl9iaXRfdW5sb2NrKCk7CisJX19jbGVhcl9iaXRfdW5sb2NrKCk7CisKK+ydtOqyg+uTpOydgCBBQ1FVSVJFIOulmOyZgCBSRUxFQVNFIOulmOydmCDsmKTtjbzroIjsnbTshZjrk6TsnYQg6rWs7ZiE7ZWp64uI64ukLiAg6529IOq0gOugqCDrj4TqtazrpbwKK+q1rO2YhO2VoCDrlYzsl5DripQg7J206rKD65Ok7J2EIOyigCDrjZQg7ISg7Zi47ZWY64qUIO2OuOydtCDrgpjsnYDrjbAsIOydtOqyg+uTpOydmCDqtaztmITsnYAg66eO7J2ACivslYTtgqTthY3ss5Dsl5DshJwg7LWc7KCB7ZmUIOuQoCDsiJgg7J6I6riwIOuVjOusuOyeheuLiOuLpC4KKworWyFdIOydtOufsCDsg4Htmansl5Ag7IKs7Jqp7ZWgIOyImCDsnojripQg7Yq57IiY7ZWcIOuplOuqqOumrCDrsLDrpqzslrQg64+E6rWs65Ok7J20IOyeiOyKteuLiOuLpOunjCwg7J2867aACitDUFUg7JeQ7ISc64qUIOyCrOyaqeuQmOuKlCDslrTthqDrr7kg7J247Iqk7Yq465+t7IWYIOyekOyytOyXkCDrqZTrqqjrpqwg67Cw66as7Ja06rCAIOuCtO2PrOuQmOyWtCDsnojslrTshJwKK+yWtO2GoOuvuSDsmKTtjbzroIjsnbTshZjqs7wg66mU66qo66asIOuwsOumrOyWtOulvCDtlajqu5gg7IKs7Jqp7ZWY64qUIOqyjCDrtojtlYTsmpTtlZwg7J287J20IOuQoCDsiJgKK+yeiOuKlOuNsCwg6re465+wIOqyveyasOyXkCDsnbQg7Yq57IiYIOuplOuqqOumrCDrsLDrpqzslrQg64+E6rWs65Ok7J2AIG5vLW9wIOydtCDrkJjslrQg7Iuk7KeI7KCB7Jy866GcCivslYTrrLTsnbzrj4Qg7ZWY7KeAIOyViuyKteuLiOuLpC4KKwor642UIOunjuydgCDrgrTsmqnsnYQg7JyE7ZW07ISgIERvY3VtZW50YXRpb24vYXRvbWljX29wcy50eHQg66W8IOywuOqzoO2VmOyEuOyalC4KKworCivrlJTrsJTsnbTsiqQg7JWh7IS47IqkCistLS0tLS0tLS0tLS0tLS0KKwor66eO7J2AIOuUlOuwlOydtOyKpOqwgCDrqZTrqqjrpqwg66ek7ZWRIOq4sOuyleycvOuhnCDsoJzslrTrkKAg7IiYIOyeiOuKlOuNsCwg6re466CH6rKMIOygnOyWtOuQmOuKlAor65SU67CU7J207Iqk64qUIENQVSDsl5DripQg64uo7KeAIO2KueyglSDrqZTrqqjrpqwg7JiB7Jet7J2YIOynke2VqeyymOufvCDrs7TsnbTqsowg65Cp64uI64ukLiAg65Oc65287J2067KE64qUCivqt7jrn7Ag65SU67CU7J207Iqk66W8IOygnOyWtO2VmOq4sCDsnITtlbQg7KCV7ZmV7Z6IIOyYrOuwlOuluCDsiJzshJzroZwg7Jis67CU66W4IOuplOuqqOumrCDslaHshLjsiqTrpbwKK+unjOuTpOyWtOyVvCDtlanri4jri6QuCisKK+2VmOyngOunjCwg7JWh7IS47Iqk65Ok7J2EIOyerOuwsOy5mCDtlZjqsbDrgpgg7KGw7ZWp7ZWY6rGw64KYIOuzke2Vqe2VmOuKlOqyjCDrjZQg7Zqo7Jyo7KCB7J206528IO2MkOuLqO2VmOuKlAor7JiB66as7ZWcIENQVSDrgpgg7Lu07YyM7J2865+s65Ok7J2EIOyCrOyaqe2VmOuptCDrk5zrnbzsnbTrsoQg7L2U65Oc7J2YIOyhsOyLrOyKpOufveqyjCDsiJzshJwg66ee7Law7KeECivslaHshLjsiqTrk6TsnbQg65SU67CU7J207Iqk7JeQ64qUIOyalOyyreuQnCDsiJzshJzrjIDroZwg64+E7LCp7ZWY7KeAIOuqu+2VmOqyjCDtlaAg7IiYIOyeiOuKlCAtIOuUlOuwlOydtOyKpOqwgAor7Jik64+Z7J6R7J2EIO2VmOqyjCDtlaAgLSDsnqDsnqzsoIEg66y47KCc6rCAIOyDneq4uCDsiJgg7J6I7Iq164uI64ukLgorCivrpqzriIXsiqQg7Luk64SQIOuCtOu2gOyXkOyEnCwgSS9PIOuKlCDslrTrlrvqsowg7JWh7IS47Iqk65Ok7J2EIOyggeygiO2eiCDsiJzssKjsoIHsnbTqsowg66eM65OkIOyImCDsnojripTsp4AKK+yVjOqzoCDsnojripQsIC0gaW5iKCkg64KYIHdyaXRlbCgpIOqzvCDqsJnsnYAgLSDsoIHsoIjtlZwg7JWh7IS47IqkIOujqO2LtOydhCDthrXtlbQg7J2066Oo7Ja07KC47JW866eMCivtlanri4jri6QuICDsnbTqsoPrk6TsnYAg64yA67aA67aE7J2YIOqyveyasOyXkOuKlCDrqoXsi5zsoIEg66mU66qo66asIOuwsOumrOyWtCDsmYAg7ZWo6ruYIOyCrOyaqeuQoCDtlYTsmpTqsIAKK+yXhuyKteuLiOuLpOunjCwg64uk7J2M7J2YIOuRkOqwgOyngCDsg4Htmansl5DshJzripQg66qF7Iuc7KCBIOuplOuqqOumrCDrsLDrpqzslrTqsIAg7ZWE7JqU7ZWgIOyImCDsnojsirXri4jri6Q6CisKKyAoMSkg7J2867aAIOyLnOyKpO2FnOyXkOyEnCBJL08g7Iqk7Yag7Ja064qUIOuqqOuToCBDUFUg7JeQIOydvOq0gOuQmOqyjCDsiJzshJwg66ee7Law7KeA7KeAIOyViuuKlOuNsCwKKyAgICAg65Sw65287IScIF/rqqjrk6BfIOydvOuwmOyggeyduCDrk5zrnbzsnbTrsoTrk6Tsl5Ag65297J20IOyCrOyaqeuQmOyWtOyVvOunjCDtlZjqs6Ag7J20IO2BrOumrO2LsOy7rAorICAgICDshLnshZjsnYQg67mg7KC464KY7Jik6riwIOyghOyXkCBtbWlvd2IoKSDqsIAg6rytIO2YuOy2nOuQmOyWtOyVvCDtlanri4jri6QuCisKKyAoMikg66eM7JW9IOyVoeyEuOyKpCDtlajsiJjrk6TsnbQg7JmE7ZmU65CcIOuplOuqqOumrCDslaHshLjsiqQg7IaN7ISx7J2EIOqwluuKlCBJL08g66mU66qo66asIOyciOuPhOyasOulvAorICAgICDsgqzsmqntlZzri6TrqbQsIOyInOyEnOulvCDqsJXsoJztlZjquLAg7JyE7ZW07ISgIF9tYW5kYXRvcnlfIOuplOuqqOumrCDrsLDrpqzslrTqsIAg7ZWE7JqU7ZWp64uI64ukLgorCivrjZQg66eO7J2AIOygleuztOulvCDsnITtlbTshKAgRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2RldmljZWlvYm9vay50bXBsIOydhCDssLjqs6DtlZjsi63si5zsmKQuCisKKwor7J247YSw65+97Yq4CistLS0tLS0tLQorCivrk5zrnbzsnbTrsoTripQg7J6Q7Iug7J2YIOyduO2EsOufve2KuCDshJzruYTsiqQg66Oo7Yu07JeQIOydmO2VtCDsnbjthLDrn73tirgg64u57ZWgIOyImCDsnojquLAg65WM66y47JeQCivrk5zrnbzsnbTrsoTsnZgg7J20IOuRkCDrtoDrtoTsnYAg7ISc66Gc7J2YIOuUlOuwlOydtOyKpCDsoJzslrQg65iQ64qUIOyVoeyEuOyKpCDrtoDrtoTqs7wg7IOB7Zi4IOqwhOyEre2VoCDsiJgKK+yeiOyKteuLiOuLpC4KKwor7Iqk7Iqk66Gc7JeQ6rKMIOyduO2EsOufve2KuCDri7ntlZjripQg6rG4IOu2iOqwgOuKpe2VmOqyjCDtlZjqs6AsIOuTnOudvOydtOuyhOydmCDtgazrpqzti7Dsu6ztlZwKK+yYpO2NvOugiOydtOyFmOuTpOydhCDrqqjrkZAg7J247YSw65+97Yq46rCAIOu2iOqwgOuKpe2VmOqyjCDrkJwg7JiB7Jet7JeQIOynkeyWtOuEo+qxsOuCmCDtlZjripQg67Cp67KVICjrnb3snZgKK+2VnCDtmJXtg5wpIOycvOuhnCDsnbTrn7Ag7IOB7Zi4IOqwhOyEreydhCAtIOy1nOyGjO2VnCDrtoDrtoTsoIHsnLzroZzrnbzrj4QgLSDspITsnbwg7IiYIOyeiOyKteuLiOuLpC4KK+uTnOudvOydtOuyhOydmCDsnbjthLDrn73tirgg66Oo7Yu07J20IOyLpO2WiSDspJHsnbgg64+Z7JWILCDtlbTri7kg65Oc65287J2067KE7J2YIOy9lOyWtOuKlCDqsJnsnYAgQ1BVIOyXkOyEnAor7IiY7ZaJ65CY7KeAIOyViuydhCDqsoPsnbTrqbAsIO2YhOyerOydmCDsnbjthLDrn73tirjqsIAg7LKY66as65CY64qUIOykkeyXkOuKlCDrmJDri6Tsi5wg7J247YSw65+97Yq46rCACivsnbzslrTrgpjsp4Ag66q77ZWY64+E66GdIOuQmOyWtCDsnojsnLzri4gg7J247YSw65+97Yq4IO2VuOuTpOufrOuKlCDqt7jsl5Ag64yA7ZW07ISc64qUIOudveydhCDsnqHsp4Ag7JWK7JWE64+ECivrkKnri4jri6QuCisKK+2VmOyngOunjCwg7Ja065Oc66CI7IqkIOugiOyngOyKpO2EsOyZgCDrjbDsnbTthLAg66CI7KeA7Iqk7YSw66W8IOqwluuKlCDsnbTrjZTrhLcg7Lm065Oc66W8IOuLpOujqOuKlAor65Oc65287J2067KE66W8IOyDneqwge2VtCDrtIXsi5zri6QuICDrp4zslb0g7J20IOuTnOudvOydtOuyhOydmCDsvZTslrTqsIAg7J247YSw65+97Yq466W8IOu5hO2ZnOyEse2ZlOyLnO2CqAor7LGE66GcIOydtOuNlOuEtyDsubTrk5zsmYAg64yA7ZmU7ZWY6rOgIOuTnOudvOydtOuyhOydmCDsnbjthLDrn73tirgg7ZW465Ok65+s6rCAIO2YuOy2nOuQmOyXiOuLpOuptDoKKworCUxPQ0FMIElSUSBESVNBQkxFCisJd3JpdGV3KEFERFIsIDMpOworCXdyaXRldyhEQVRBLCB5KTsKKwlMT0NBTCBJUlEgRU5BQkxFCisJPGludGVycnVwdD4KKwl3cml0ZXcoQUREUiwgNCk7CisJcSA9IHJlYWR3KERBVEEpOworCTwvaW50ZXJydXB0PgorCivrp4zslb0g7Iic7IScIOq3nOy5meydtCDstqnrtoTtnogg7JmE7ZmU65CY7Ja0IOyeiOuLpOuptCDrjbDsnbTthLAg66CI7KeA7Iqk7YSw7JeQ7J2YIOyKpO2GoOyWtOuKlCDslrTrk5zroIjsiqQKK+ugiOyngOyKpO2EsOyXkCDrkZDrsojsp7jroZwg7ZaJ7ZW07KeA64qUIOyKpO2GoOyWtCDrkqTsl5Ag7J287Ja064KgIOyImOuPhCDsnojsirXri4jri6Q6CisKKwlTVE9SRSAqQUREUiA9IDMsIFNUT1JFICpBRERSID0gNCwgU1RPUkUgKkRBVEEgPSB5LCBxID0gTE9BRCAqREFUQQorCisKK+unjOyVvSDsiJzshJwg6rec7LmZ7J20IOy2qeu2hO2eiCDsmYTtmZTrkJjslrQg7J6I6rOgIOusteyLnOyggeycvOuhnOuToCDrqoXsi5zsoIHsnLzroZzrk6Ag67Cw66as7Ja06rCACivsgqzsmqnrkJjsp4Ag7JWK7JWY64uk66m0IOyduO2EsOufve2KuCDruYTtmZzshLHtmZQg7IS57IWY7JeQ7IScIOydvOyWtOuCnCDslaHshLjsiqTqsIAg67CU6rml7Jy866GcIOyDiOyWtOyEnAor7J247YSw65+97Yq4IOuCtOyXkOyEnCDsnbzslrTrgpwg7JWh7IS47Iqk7JmAIOyEnuydvCDsiJgg7J6I64uk6rOgIC0g6re466as6rOgIOq3uCDrsJjrjIDrj4QgLSDqsIDsoJXtlbTslbzrp4wKK+2VqeuLiOuLpC4KKwor6re465+wIOyYgeyXrSDslYjsl5DshJwg7J287Ja064KY64qUIEkvTyDslaHshLjsiqTrk6TsnYAg7JeE6rKp7ZWcIOyInOyEnCDqt5zsuZnsnZggSS9PIOugiOyngOyKpO2EsOyXkAor66y17Iuc7KCBIEkvTyDrsLDrpqzslrTrpbwg7ZiV7ISx7ZWY64qUIOuPmeq4sOyggSAoc3luY2hyb25vdXMpIOuhnOuTnCDsmKTtjbzroIjsnbTshZjsnYQg7Y+s7ZWo7ZWY6riwCivrlYzrrLjsl5Ag7J2867CY7KCB7Jy866Gc64qUIOydtOufsOqyjCDrrLjsoJzqsIAg65CY7KeAIOyViuyKteuLiOuLpC4gIOunjOyVvSDsnbTqsbjroZzripQg7Lap67aE7LmYIOyViuuLpOuptAorbW1pb3diKCkg6rCAIOuqheyLnOyggeycvOuhnCDsgqzsmqnrkKAg7ZWE7JqU6rCAIOyeiOyKteuLiOuLpC4KKworCivtlZjrgpjsnZgg7J247YSw65+97Yq4IOujqO2LtOqzvCDrs4Trj4TsnZggQ1BVIOyXkOyEnCDsiJjtlonspJHsnbTrqbAg7ISc66GcIO2GteyLoOydhCDtlZjripQg65GQIOujqO2LtAor7IKs7J207JeQ64+EIOu5hOyKt+2VnCDsg4HtmansnbQg7J287Ja064KgIOyImCDsnojsirXri4jri6QuICDrp4zslb0g6re465+wIOqyveyasOqwgCDrsJzsg53tlaAg6rCA64ql7ISx7J20Civsnojri6TrqbQsIOyInOyEnOulvCDrs7TsnqXtlZjquLAg7JyE7ZW0IOyduO2EsOufve2KuCDruYTtmZzshLHtmZQg65297J20IOyCrOyaqeuQmOyWtOyguOyVvOunjCDtlanri4jri6QuCisKKworPT09PT09PT09PT09PT09PT09PT09PQor7Luk64SQIEkvTyDrsLDrpqzslrTsnZgg7Zqo6rO8Cis9PT09PT09PT09PT09PT09PT09PT09CisKK0kvTyDrqZTrqqjrpqzsl5Ag7JWh7IS47Iqk7ZWgIOuVjCwg65Oc65287J2067KE64qUIOyggeygiO2VnCDslaHshLjsiqQg7ZWo7IiY66W8IOyCrOyaqe2VtOyVvCDtlanri4jri6Q6CisKKyAoKikgaW5YKCksIG91dFgoKToKKworICAgICDsnbTqsoPrk6TsnYAg66mU66qo66asIOqzteqwhOuztOuLpOuKlCBJL08g6rO16rCE7JeQIOydtOyVvOq4sOulvCDtlZjroKTripQg7J2Y64+E66GcCisgICAgIOunjOuTpOyWtOyhjOyKteuLiOuLpOunjCwg6re46rG0IOq4sOuzuOyggeycvOuhnCBDUFUg66eI64ukIOuLpOuluCDsu6jshYnsnoXri4jri6QuICBpMzg2IOqzvAorICAgICB4ODZfNjQg7ZSE66Gc7IS47ISc65Ok7J2AIO2KueuzhO2VnCBJL08g6rO16rCEIOyVoeyEuOyKpCDsgqzsnbTtgbTqs7wg66qF66C57Ja066W8IOyLpOygnOuhnCDqsIDsp4Dqs6AKKyAgICAg7J6I7KeA66eMLCDri6Trpbgg66eO7J2AIENQVSDrk6Tsl5DripQg6re465+wIOy7qOyFieydtCDsobTsnqztlZjsp4Ag7JWK7Iq164uI64ukLgorCisgICAgIOuLpOuluCDqsoPrk6Qg7KSR7JeQ7ISc64+EIFBDSSDrsoTsiqTqsIAgSS9PIOqzteqwhCDsu6jshYnsnYQg7KCV7J2Y7ZWY64qU642wLCDsnbTripQgLSBpMzg2IOqzvAorICAgICB4ODZfNjQg6rCZ7J2AIENQVSDsl5DshJwgLSBDUFUg7J2YIEkvTyDqs7XqsIQg7Luo7IWJ7Jy866GcIOyJveqyjCDrp6TsuZjrkKnri4jri6QuICDtlZjsp4Drp4wsCisgICAgIOuMgOyytO2VoCBJL08g6rO16rCE7J20IOyXhuuKlCBDUFUg7JeQ7ISc64qUIENQVSDsnZgg66mU66qo66asIOunteydmCDqsIDsg4EgSS9PIOqzteqwhOycvOuhnAorICAgICDrp6TtlZHrkKAg7IiY64+EIOyeiOyKteuLiOuLpC4KKworICAgICDsnbQg6rO16rCE7Jy866Gc7J2YIOyVoeyEuOyKpOuKlCAoaTM4NiDrk7Hsl5DshJzripQpIOyZhOyghO2VmOqyjCDrj5nquLDtmZQg65Cp64uI64uk66eMLCDspJHqsITsnZgKKyAgICAgKFBDSSDtmLjsiqTtirgg67iM66as7KeA7JmAIOqwmeydgCkg67iM66as7KeA65Ok7J2AIOydtOulvCDsmYTsoITtnogg67O07J6l7ZWY7KeEIOyViuydhOyImOuPhAorICAgICDsnojsirXri4jri6QuCisKKyAgICAg7J206rKD65Ok7J2YIOyDge2YuOqwhOydmCDsiJzshJzripQg7JmE7KCE7ZWY6rKMIOuztOyepeuQqeuLiOuLpC4KKworICAgICDri6Trpbgg7YOA7J6F7J2YIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZgsIEkvTyDsmKTtjbzroIjsnbTshZjsl5Ag64yA7ZWcIOyInOyEnOuKlCDsmYTsoITtlZjqsowKKyAgICAg67O07J6l65CY7KeA64qUIOyViuyKteuLiOuLpC4KKworICgqKSByZWFkWCgpLCB3cml0ZVgoKToKKworICAgICDsnbTqsoPrk6TsnbQg7IiY7ZaJIOyalOyyreuQmOuKlCBDUFUg7JeQ7IScIOyEnOuhnOyXkOqyjCDsmYTsoITtnogg7Iic7ISc6rCAIOunnuy2sOyngOqzoCDrj4Xrpr3soIHsnLzroZwKKyAgICAg7IiY7ZaJ65CY64qU7KeA7JeQIOuMgO2VnCDrs7TsnqUg7Jes67aA64qUIOydtOuTpOydtCDslaHshLjsiqQg7ZWY64qUIOuplOuqqOumrCDsnIjrj4TsmrDsl5Ag7KCV7J2Y65CcCisgICAgIO2KueyEseyXkCDsnZjtlbQg6rKw7KCV65Cp64uI64ukLiAg7JiI66W8IOuTpOyWtCwg7LWc7Iug7J2YIGkzODYg7JWE7YKk7YWN7LOQIOuouOyLoOyXkOyEnOuKlCBNVFJSCisgICAgIOugiOyngOyKpO2EsOuhnCDsnbQg7Yq57ISx7J20IOyhsOygleuQqeuLiOuLpC4KKworICAgICDsnbzrsJjsoIHsnLzroZzripQsIO2UhOumrO2OmOy5mCAocHJlZmV0Y2gpIOqwgOuKpe2VnCDrlJTrsJTsnbTsiqTrpbwg7JWh7IS47IqkIO2VmOuKlOqyjAorICAgICDslYTri4jrnbzrqbQsIOydtOqyg+uTpOydgCDsmYTsoITtnogg7Iic7ISc6rCAIOunnuy2sOyngOqzoCDqsrDtlanrkJjsp4Ag7JWK6rKMIOuztOyepeuQoCDqsoHri4jri6QuCisKKyAgICAg7ZWY7KeA66eMLCAoUENJIOu4jOumrOyngOyZgCDqsJnsnYApIOykkeqwhOydmCDtlZjrk5zsm6jslrTripQg7J6Q7Iug7J20IOybkO2VnOuLpOuptCDsp5HtlonsnYQKKyAgICAg7Jew6riw7Iuc7YKsIOyImCDsnojsirXri4jri6Q7IOyKpO2GoOyWtCDrqoXroLnsnYQg7Iuk7KCc66GcIO2VmOuTnOybqOyWtOuhnCDrgrTroKTrs7TrgrTquLAoZmx1c2gpCisgICAgIOychO2VtOyEnOuKlCDqsJnsnYAg7JyE7LmY66Gc67aA7YSwIOuhnOuTnOulvCDtlZjripQg67Cp67KV7J20IOyeiOyKteuLiOuLpOunjFsqXSwgUENJIOydmCDqsr3smrDripQKKyAgICAg6rCZ7J2AIOuUlOuwlOydtOyKpOuCmCDtmZjqsr0g6rWs7ISxIOyYgeyXreyXkOyEnOydmCDroZzrk5zrp4zsnLzroZzrj4Qg7Lap67aE7ZWgIOqygeuLiOuLpC4KKworICAgICBbKl0g7KO87J2YISDsk7Dsl6zsp4Qg6rKD6rO8IOqwmeydgCDsnITsuZjroZzrtoDthLDsnZgg66Gc65Oc66W8IOyLnOuPhO2VmOuKlCDqsoPsnYAg7Jik64+Z7J6R7J2ECisJIOydvOycvO2CrCDsiJjrj4Qg7J6I7Iq164uI64ukIC0g7JiI66GcIDE2NjUwIFJ4L1R4IOyLnOumrOyWvCDroIjsp4DsiqTthLDrpbwg7IOd6rCB7ZW0CisJIOuztOyEuOyalC4KKworICAgICDtlITrpqztjpjsuZgg6rCA64ql7ZWcIEkvTyDrqZTrqqjrpqzqsIAg7IKs7Jqp65CY66m0LCDsiqTthqDslrQg66qF66C565Ok7J20IOyInOyEnOulvCDsp4DtgqTrj4TroZ0KKyAgICAg7ZWY6riwIOychO2VtCBtbWlvd2IoKSDrsLDrpqzslrTqsIAg7ZWE7JqU7ZWgIOyImCDsnojsirXri4jri6QuCisKKyAgICAgUENJIO2KuOuenOyereyFmCDsgqzsnbTsnZgg7IOB7Zi47J6R7Jqp7JeQIOuMgO2VtCDrjZQg66eO7J2AIOygleuztOulvCDsnITtlbTshKAgUENJIOuqheyEuOyEnOulvAorICAgICDssLjqs6DtlZjsi5zquLAg67CU656N64uI64ukLgorCisgKCopIHJlYWRYX3JlbGF4ZWQoKSwgd3JpdGVYX3JlbGF4ZWQoKQorCisgICAgIOydtOqyg+uTpOydgCByZWFkWCgpIOyZgCB3cml0ZVgoKSDrnpEg67mE7Iq37ZWY7KeA66eMLCDrjZQg7JmE7ZmU65CcIOuplOuqqOumrCDsiJzshJwg67O07J6l7J2ECisgICAgIOygnOqzte2VqeuLiOuLpC4gIOq1rOyytOyggeycvOuhnCwg7J206rKD65Ok7J2AIOydvOuwmOyggSDrqZTrqqjrpqwg7JWh7IS47IqkICjsmIg6IERNQSDrsoTtjbwpIOyXkOuPhAorICAgICBMT0NLIOydtOuCmCBVTkxPQ0sg7Jik7Y2866CI7J207IWY65Ok7JeQ64+EIOyInOyEnOulvCDrs7TsnqXtlZjsp4Ag7JWK7Iq164uI64ukLiAgTE9DSyDsnbTrgpgKKyAgICAgVU5MT0NLIOyYpO2NvOugiOydtOyFmOuTpOyXkCDrp57strDsp4DripQg7Iic7ISc6rCAIO2VhOyalO2VmOuLpOuptCwgbW1pb3diKCkg67Cw66as7Ja06rCAIOyCrOyaqeuQoAorICAgICDsiJgg7J6I7Iq164uI64ukLiAg6rCZ7J2AIOyjvOuzgCDsnqXsuZjsl5DsnZgg7JmE7ZmU65CcIOyVoeyEuOyKpOuBvOumrOuKlCDsiJzshJzqsIAg7KeA7Lyc7KeQ7J2EIOyVjOyVhAorICAgICDrkZDsi5zquLAg67CU656N64uI64ukLgorCisgKCopIGlvcmVhZFgoKSwgaW93cml0ZVgoKQorCisgICAgIOydtOqyg+uTpOydgCBpblgoKS9vdXRYKCkg64KYIHJlYWRYKCkvd3JpdGVYKCkg7LKY65+8IOyLpOygnOuhnCDsiJjtlontlZjripQg7JWh7IS47Iqk7J2YCisgICAgIOyiheulmOyXkCDrlLDrnbwg7KCB7KCI7ZWY6rKMIOyImO2WieuQoCDqsoPsnoXri4jri6QuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK+qwgOygleuQmOuKlCDqsIDsnqUg7JmE7ZmU65CcIOyLpO2WiSDsiJzshJwg66qo6424Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCivsu6jshYnsoIHsnLzroZwgQ1BVIOuKlCDso7zslrTsp4Qg7ZSE66Gc6re4656o7JeQIOuMgO2VtCDtlITroZzqt7jrnqgg6re4IOyekOyytOyXkOuKlCDsnbjqs7zshLEgKHByb2dyYW0KK2NhdXNhbGl0eSkg7J2EIOyngO2CpOuKlCDqsoPsspjrn7wg67O07J206rKMIO2VmOyngOunjCDsnbzrsJjsoIHsnLzroZzripQg7Iic7ISc66W8IOqxsOydmCDsp4DsvJzso7zsp4AKK+yViuuKlOuLpOqzoCDqsIDsoJXrkJjslrTslbzrp4wg7ZWp64uI64ukLiAgKGkzODYg7J2064KYIHg4Nl82NCDqsJnsnYApIOydvOu2gCBDUFUg65Ok7J2AIOy9lOuTnAor7J6s67Cw7LmY7JeQIChwb3dlcnBjIOuCmCBmcnYg7JmAIOqwmeydgCkg64uk66W4IOqyg+uTpOyXkCDruYTtlbQg6rCV7ZWcIOygnOyVveydhCDqsJbsp4Drp4wsIOyVhO2CpO2FjeyzkAor7KKF7IaN7KCBIOy9lOuTnCDsnbTsmbjsnZgg7L2U65Oc7JeQ7ISc64qUIOyInOyEnOyXkCDrjIDtlZwg7KCc7JW97J20IOqwgOyepSDsmYTtmZTrkJwg6rK97JqwIChERUMgQWxwaGEpCivrpbwg6rCA7KCV7ZW07JW8IO2VqeuLiOuLpC4KKwor7J20IOunkOydgCwgQ1BVIOyXkOqyjCDso7zslrTsp4DripQg7J247Iqk7Yq465+t7IWYIOyKpO2KuOumvCDrgrTsnZgg7ZWcIOyduOyKpO2KuOufreyFmOydtCDslZ7snZgKK+yduOyKpO2KuOufreyFmOyXkCDsooXsho3soIHsnbTrnbzrqbQg7JWe7J2YIOyduOyKpO2KuOufreyFmOydgCDrkqTsnZgg7KKF7IaN7KCBIOyduOyKpO2KuOufreyFmOydtCDsi6TtlonrkJjquLAKK+yghOyXkCDsmYTro4xbKl3rkKAg7IiYIOyeiOyWtOyVvCDtlZzri6TripQg7KCc7JW9ICjri6zrpqwg66eQ7ZW07IScLCDsnbjqs7zshLHsnbQg7KeA7Lyc7KeA64qUIOqyg+ycvOuhnAor67O07J206rKMIO2VqCkg7Jm47JeQ64qUIOyekOyLoOydtCDsm5DtlZjripQg7Iic7ISc64yA66GcIC0g7Ius7KeA7Ja0IOuzkeugrOyggeycvOuhnOuPhCAtIOq3uCDsiqTtirjrprzsnYQKK+yLpO2Wie2VoCDsiJgg7J6I7J2M7J2EIOydmOuvuO2VqeuLiOuLpAorCisgWypdIOydvOu2gCDsnbjsiqTtirjrn63shZjsnYAg7ZWY64KYIOydtOyDgeydmCDsmIHtlqUgLSDsobDqsbQg7L2U65Oc66W8IOuwlOq+vOuLpOuNmOyngCwg66CI7KeA7Iqk7YSw64KYCisgICAgIOuplOuqqOumrOulvCDrsJTqvrzri6TrjZjsp4AgLSDsnYQg66eM65Ok7Ja064K066mwLCDri6Trpbgg7J247Iqk7Yq465+t7IWY7J2AIOuLpOuluCDtmqjqs7zsl5AKKyAgICAg7KKF7IaN7KCB7J28IOyImCDsnojsirXri4jri6QuCisKK0NQVSDripQg7LWc7KKF7KCB7Jy866GcIOyVhOustCDtmqjqs7zrj4Qg66eM65Ok7KeAIOyViuuKlCDsnbjsiqTtirjrn63shZgg7Iuc7YCA7Iqk64qUIOyXhuyVoOuyhOumtCDsiJjrj4QKK+yeiOyKteuLiOuLpC4gIOyYiOulvCDrk6TslrQsIOunjOyVvSDrkZDqsJzsnZgg7Jew7IaN65CY64qUIOyduOyKpO2KuOufreyFmOydtCDrkZgg64ukIOqwmeydgCDroIjsp4DsiqTthLDsl5AKK+yngeygkeyggeyduCDqsJIgKGltbWVkaWF0ZSB2YWx1ZSkg7J2EIOynkeyWtOuEo+uKlOuLpOuptCwg7LKr67KI7Ke4IOyduOyKpO2KuOufreyFmOydgCDrsoTroKTsp4gg7IiY64+ECivsnojsirXri4jri6QuCisKKwor67mE7Iq37ZWY6rKMLCDsu7TtjIzsnbzrn6wg7Jet7IucIO2UhOuhnOq3uOueqOydmCDsnbjqs7zshLHrp4wg7KeA7Lyc7KSA64uk66m0IOyduOyKpO2KuOufreyFmCDsiqTtirjrprzsnYQKK+yekOyLoOydtCDrs7TquLDsl5Ag7Jis67CU66W064ukIOyDneqwgeuQmOuKlOuMgOuhnCDsnqzrsLDsuZgg7ZWgIOyImCDsnojsirXri4jri6QuCisKKworPT09PT09PT09PT09PT09CitDUFUg7LqQ7Iuc7J2YIOyYge2WpQorPT09PT09PT09PT09PT09CisKK+y6kOyLnOuQnCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWY65Ok7J20IOyLnOyKpO2FnCDsoITssrTsl5Ag7Ja065a76rKMIOyduOyngOuQmOuKlOyngOuKlCBDUFUg7JmAIOuplOuqqOumrAor7IKs7J207JeQIOyhtOyerO2VmOuKlCDsupDsi5zrk6QsIOq3uOumrOqzoCDsi5zsiqTthZwg7IOB7YOc7J2YIOydvOq0gOyEseydhCDqtIDrpqztlZjripQg66mU66qo66asIOydvOq0gOyEsQor7Iuc7Iqk7YWc7JeQIOyDgeuLuSDrtoDrtoQg7JiB7Zal7J2EIOuwm+yKteuLiOuLpC4KKwor7ZWcIENQVSDqsIAg7Iuc7Iqk7YWc7J2YIOuLpOuluCDrtoDrtoTrk6Tqs7wg7LqQ7Iuc66W8IO2Gte2VtCDsg4HtmLjsnpHsmqntlZzri6TrqbQsIOuplOuqqOumrCDsi5zsiqTthZzsnYAKK0NQVSDsnZgg7LqQ7Iuc65Ok7J2EIO2PrO2VqO2VtOyVvCDtlZjrqbAsIENQVSDsmYAgQ1BVIOyekOyLoOydmCDsupDsi5wg7IKs7J207JeQ7ISc7J2YIOuPmeyekeydhCDsnITtlZwKK+uplOuqqOumrCDrsLDrpqzslrTrpbwg6rCA7KC47JW8IO2VqeuLiOuLpC4gKOuplOuqqOumrCDrsLDrpqzslrTripQg64W866as7KCB7Jy866Gc64qUIOuLpOydjCDqt7jrprzsnZgKK+ygkOyEoOyXkOyEnCDrj5nsnpHtlanri4jri6QpOgorCisJICAgIDwtLS0gQ1BVIC0tLT4gICAgICAgICA6ICAgICAgIDwtLS0tLS0tLS0tLSBNZW1vcnkgLS0tLS0tLS0tLS0+CisJICAgICAgICAgICAgICAgICAgICAgICAgICA6CisJKy0tLS0tLS0tKyAgICArLS0tLS0tLS0rICA6ICAgKy0tLS0tLS0tKyAgICArLS0tLS0tLS0tLS0rCisJfCAgICAgICAgfCAgICB8ICAgICAgICB8ICA6ICAgfCAgICAgICAgfCAgICB8ICAgICAgICAgICB8ICAgICstLS0tLS0tLSsKKwl8ICBDUFUgICB8ICAgIHwgTWVtb3J5IHwgIDogICB8IENQVSAgICB8ICAgIHwgICAgICAgICAgIHwgICAgfCAgICAgICAgfAorCXwgIENvcmUgIHwtLS0+fCBBY2Nlc3MgfC0tLS0tPnwgQ2FjaGUgIHw8LS0+fCAgICAgICAgICAgfCAgICB8ICAgICAgICB8CisJfCAgICAgICAgfCAgICB8IFF1ZXVlICB8ICA6ICAgfCAgICAgICAgfCAgICB8ICAgICAgICAgICB8LS0tPnwgTWVtb3J5IHwKKwl8ICAgICAgICB8ICAgIHwgICAgICAgIHwgIDogICB8ICAgICAgICB8ICAgIHwgICAgICAgICAgIHwgICAgfCAgICAgICAgfAorCSstLS0tLS0tLSsgICAgKy0tLS0tLS0tKyAgOiAgICstLS0tLS0tLSsgICAgfCAgICAgICAgICAgfCAgICB8ICAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICB8IENhY2hlICAgICB8ICAgICstLS0tLS0tLSsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgIHwgQ29oZXJlbmN5IHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgIHwgTWVjaGFuaXNtIHwgICAgKy0tLS0tLS0tKworCSstLS0tLS0tLSsgICAgKy0tLS0tLS0tKyAgOiAgICstLS0tLS0tLSsgICAgfCAgICAgICAgICAgfCAgICB8CSAgICAgIHwKKwl8ICAgICAgICB8ICAgIHwgICAgICAgIHwgIDogICB8ICAgICAgICB8ICAgIHwgICAgICAgICAgIHwgICAgfCAgICAgICAgfAorCXwgIENQVSAgIHwgICAgfCBNZW1vcnkgfCAgOiAgIHwgQ1BVICAgIHwgICAgfCAgICAgICAgICAgfC0tLT58IERldmljZSB8CisJfCAgQ29yZSAgfC0tLT58IEFjY2VzcyB8LS0tLS0+fCBDYWNoZSAgfDwtLT58ICAgICAgICAgICB8ICAgIHwgICAgICAgIHwKKwl8ICAgICAgICB8ICAgIHwgUXVldWUgIHwgIDogICB8ICAgICAgICB8ICAgIHwgICAgICAgICAgIHwgICAgfCAgICAgICAgfAorCXwgICAgICAgIHwgICAgfCAgICAgICAgfCAgOiAgIHwgICAgICAgIHwgICAgfCAgICAgICAgICAgfCAgICArLS0tLS0tLS0rCisJKy0tLS0tLS0tKyAgICArLS0tLS0tLS0rICA6ICAgKy0tLS0tLS0tKyAgICArLS0tLS0tLS0tLS0rCisJICAgICAgICAgICAgICAgICAgICAgICAgICA6CisJICAgICAgICAgICAgICAgICAgICAgICAgICA6CisKK+2KueyglSDroZzrk5zrgpgg7Iqk7Yag7Ja064qUIO2VtOuLuSDsmKTtjbzroIjsnbTshZjsnYQg7JqU7LKt7ZWcIENQVSDsnZgg7LqQ7IucIOuCtOyXkOyEnCDrj5nsnpHsnYQg7JmE66OM7ZWgCivsiJjrj4Qg7J6I6riwIOuVjOusuOyXkCDtlbTri7kgQ1BVIOydmCDrsJTquaXsl5DripQg67O07J207KeAIOyViuydhCDsiJgg7J6I7KeA66eMLCDri6TrpbggQ1BVIOqwgCDqtIDsi6zsnYQKK+qwluuKlOuLpOuptCDsupDsi5wg7J286rSA7ISxIOuplOy7pOuLiOymmOydtCDtlbTri7kg7LqQ7Iuc65287J247J2EIO2VtOuLuSBDUFUg7JeQ6rKMIOyghOuLrO2VmOqzoCwg7ZW064u5CivrqZTrqqjrpqwg7JiB7Jet7JeQIOuMgO2VnCDsmKTtjbzroIjsnbTshZjsnbQg67Cc7IOd7ZWgIOuVjOuniOuLpCDqt7gg7JiB7Zal7J2EIOyghO2MjOyLnO2CpOq4sCDrlYzrrLjsl5AsIO2VtOuLuQor7Jik7Y2866CI7J207IWY7J2AIOuplOuqqOumrOyXkCDsi6TsoJzroZwg7JWh7IS47Iqk66W8IO2VnOqyg+yymOufvCDrgpjtg4DrgqAg6rKD7J6F64uI64ukLgorCitDUFUg7L2U7Ja064qUIO2UhOuhnOq3uOueqOydmCDsnbjqs7zshLHsnbQg7Jyg7KeA65Cc64uk6rOg66eMIOyXrOqyqOynhOuLpOuptCDsnbjsiqTtirjrn63shZjrk6TsnYQg7Ja065akCivsiJzshJzroZzrk6Ag7J6s67Cw7LmY7ZW07IScIOyImO2Wie2VoCDsiJgg7J6I7Iq164uI64ukLiAg7J2867aAIOyduOyKpO2KuOufreyFmOuTpOydgCDroZzrk5zrgpgg7Iqk7Yag7Ja0CivsmKTtjbzroIjsnbTshZjsnYQg66eM65Oc64qU642wIOydtCDsmKTtjbzroIjsnbTshZjrk6TsnYAg7J207ZuEIOyImO2WieuQoCDrqZTrqqjrpqwg7JWh7IS47IqkIO2BkOyXkCDrk6TslrTqsIDqsowKK+uQqeuLiOuLpC4gIOy9lOyWtOuKlCDsnbQg7Jik7Y2866CI7J207IWY65Ok7J2EIO2VtOuLuSDtgZDsl5Ag7Ja065akIOyInOyEnOuhnOuToCDsm5DtlZjripTrjIDroZwg64Sj7J2EIOyImAor7J6I6rOgLCDri6Trpbgg7J247Iqk7Yq465+t7IWY7J2YIOyZhOujjOulvCDquLDri6Trpqzrj4TroZ0g6rCV7KCc65CY6riwIOyghOq5jOyngOuKlCDsiJjtlonsnYQg6rOE7IaN7ZWp64uI64ukLgorCivrqZTrqqjrpqwg67Cw66as7Ja06rCAIO2VmOuKlCDsnbzsnYAgQ1BVIOyqveyXkOyEnCDrqZTrqqjrpqwg7Kq97Jy866GcIOuEmOyWtOqwgOuKlCDslaHshLjsiqTrk6TsnZgg7Iic7IScLAor6re466as6rOgIOq3uCDslaHshLjsiqTsnZgg6rKw6rO86rCAIOyLnOyKpO2FnOydmCDri6Trpbgg6rSA7LCw7J6Q65Ok7JeQ6rKMIOyduOyngOuQmOuKlCDsiJzshJzrpbwg7KCc7Ja07ZWY64qUCivqsoPsnoXri4jri6QuCisKK1shXSBDUFUg65Ok7J2AIO2VreyDgSDqt7jrk6Qg7J6Q7Iug7J2YIOuhnOuTnOyZgCDsiqTthqDslrTripQg7ZSE66Gc6re4656oIOyInOyEnOuMgOuhnCDsnbzslrTrgpwg6rKD7Jy866GcCivrs7TquLAg65WM66y47JeQLCDso7zslrTsp4QgQ1BVIOuCtOyXkOyEnOuKlCDrqZTrqqjrpqwg67Cw66as7Ja066W8IOyCrOyaqe2VoCDtlYTsmpTqsIAgX+yXhuyKteuLiOuLpF8uCisKK1shXSBNTUlPIOuCmCDri6Trpbgg65SU67CU7J207IqkIOyVoeyEuOyKpOuTpOydgCDsupDsi5wg7Iuc7Iqk7YWc7J2EIOyasO2ajO2VoCDsiJjrj4Qg7J6I7Iq164uI64ukLiAg7Jqw7ZqMCivsl6zrtoDripQg65SU67CU7J207Iqk6rCAIOyVoeyEuOyKpCDrkJjripQg66mU66qo66asIOyciOuPhOyasOydmCDtirnshLHsl5Ag7J2Y7ZW0IOqysOygleuQoCDsiJjrj4Qg7J6I6rOgLCBDUFUKK+qwgCDqsIDsp4Dqs6Ag7J6I7J2EIOyImCDsnojripQg7Yq57IiY7ZWcIOuUlOuwlOydtOyKpCDthrXsi6Ag7J247Iqk7Yq465+t7IWY7J2YIOyCrOyaqeyXkCDsnZjtlbTshJwg6rKw7KCV65CgCivsiJjrj4Qg7J6I7Iq164uI64ukLgorCisKK+y6kOyLnCDsnbzqtIDshLEKKy0tLS0tLS0tLS0tCisKK+2VmOyngOunjCDsgrbsnYAg7JWe7JeQ7IScIOydtOyVvOq4sO2VnCDqsoPsspjrn7wg64uo7Iic7ZWY7KeAIOyViuyKteuLiOuLpDog7LqQ7Iuc65Ok7J2AIOydvOq0gOyggeydvCDqsoPsnLzroZwKK+q4sOuMgOuQmOyngOunjCwg6re4IOydvOq0gOyEseydtCDsiJzshJzsl5Drj4Qg7KCB7Jqp65CgIOqxsOudvOuKlCDrs7TsnqXsnYAg7JeG7Iq164uI64ukLiAg7ZWcIENQVSDsl5DshJwKK+unjOuTpOyWtOynhCDrs4Dqsr0g7IKs7ZWt7J2AIOy1nOyiheyggeycvOuhnOuKlCDsi5zsiqTthZzsnZgg66qo65OgIENQVSDsl5Dqsowg67O07Jes7KeA6rKMIOuQmOyngOunjCwg64uk66W4CitDUFUg65Ok7JeQ6rKM64+EIOqwmeydgCDsiJzshJzroZwg67O07J206rKMIOuQoCDqsbDrnbzripQg67O07J6l7J2AIOyXhuuLpOuKlCDrnLvsnoXri4jri6QuCisKKwor65GQ6rCc7J2YIENQVSAoMSAmIDIpIOqwgCDri6zroKQg7J6I6rOgLCDqsIEgQ1BVIOyXkCDrkZDqsJzsnZgg642w7J207YSwIOy6kOyLnChDUFUgMSDsnYAgQS9CIOulvCwKK0NQVSAyIOuKlCBDL0Qg66W8IOqwluyKteuLiOuLpCnqsIAg67OR66Cs66GcIOyXsOqysOuQmOyWtCDsnojripQg7Iuc7Iqk7YWc7J2EIOuLpOujrOuLpOqzoCDsg53qsIHtlbQKK+u0heyLnOuLpDoKKworCSAgICAgICAgICAgIDoKKwkgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0rCisJICAgICAgICAgICAgOiAgICAgICstLS0tLS0tLS0rICAgICAgICAgfCAgICAgICAgfAorCSstLS0tLS0tLSsgIDogKy0tLT58IENhY2hlIEEgfDwtLS0tLS0tPnwgICAgICAgIHwKKwl8ICAgICAgICB8ICA6IHwgICAgKy0tLS0tLS0tLSsgICAgICAgICB8ICAgICAgICB8CisJfCAgQ1BVIDEgfDwtLS0rICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgfAorCXwgICAgICAgIHwgIDogfCAgICArLS0tLS0tLS0tKyAgICAgICAgIHwgICAgICAgIHwKKwkrLS0tLS0tLS0rICA6ICstLS0+fCBDYWNoZSBCIHw8LS0tLS0tLT58ICAgICAgICB8CisJICAgICAgICAgICAgOiAgICAgICstLS0tLS0tLS0rICAgICAgICAgfCAgICAgICAgfAorCSAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgIHwgTWVtb3J5IHwKKwkgICAgICAgICAgICA6ICAgICAgKy0tLS0tLS0tLSsgICAgICAgICB8IFN5c3RlbSB8CisJKy0tLS0tLS0tKyAgOiArLS0tPnwgQ2FjaGUgQyB8PC0tLS0tLS0+fCAgICAgICAgfAorCXwgICAgICAgIHwgIDogfCAgICArLS0tLS0tLS0tKyAgICAgICAgIHwgICAgICAgIHwKKwl8ICBDUFUgMiB8PC0tLSsgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8CisJfCAgICAgICAgfCAgOiB8ICAgICstLS0tLS0tLS0rICAgICAgICAgfCAgICAgICAgfAorCSstLS0tLS0tLSsgIDogKy0tLT58IENhY2hlIEQgfDwtLS0tLS0tPnwgICAgICAgIHwKKwkgICAgICAgICAgICA6ICAgICAgKy0tLS0tLS0tLSsgICAgICAgICB8ICAgICAgICB8CisJICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tKworCSAgICAgICAgICAgIDoKKwor7J20IOyLnOyKpO2FnOydtCDri6TsnYzqs7wg6rCZ7J2AIO2KueyEseydhCDqsJbripTri6Qg7IOd6rCB7ZW0IOu0heyLnOuLpDoKKworICgqKSDtmYDsiJjrsogg7LqQ7Iuc65287J247J2AIOy6kOyLnCBBLCDsupDsi5wgQyDrmJDripQg66mU66qo66as7JeQIOychOy5mO2VoCDsiJgg7J6I7J2MOworCisgKCopIOynneyImOuyiCDsupDsi5zrnbzsnbjsnYAg7LqQ7IucIEIsIOy6kOyLnCBEIOuYkOuKlCDrqZTrqqjrpqzsl5Ag7JyE7LmY7ZWgIOyImCDsnojsnYw7CisKKyAoKikgQ1BVIOy9lOyWtOqwgCDtlZzqsJzsnZgg7LqQ7Iuc7JeQIOygkeq3vO2VmOuKlCDrj5nslYgsIOuLpOuluCDsupDsi5zripQgLSDrjZTti7Ag7LqQ7Iuc65287J247J2ECisgICAgIOuplOuqqOumrOyXkCDrgrTrpqzqsbDrgpgg7LaU7Lih7ISxIOuhnOuTnOulvCDtlZjqsbDrgpgg7ZWY6riwIOychO2VtCAtIOyLnOyKpO2FnOydmCDri6Trpbgg67aA67aE7JeQCisgICAgIOyVoeyEuOyKpCDtlZjquLAg7JyE7ZW0IOuyhOyKpOulvCDsgqzsmqntlaAg7IiYIOyeiOydjDsKKworICgqKSDqsIEg7LqQ7Iuc64qUIOyLnOyKpO2FnOydmCDrgpjrqLjsp4Ag67aA67aE65Ok6rO8IOydvOq0gOyEseydhCDrp57stpTquLAg7JyE7ZW0IO2VtOuLuSDsupDsi5zsl5AKKyAgICAg7KCB7Jqp65CY7Ja07JW8IO2VoCDsmKTtjbzroIjsnbTshZjrk6TsnZgg7YGQ66W8IOqwgOynkDsKKworICgqKSDsnbQg7J286rSA7ISxIO2BkOuKlCDsupDsi5zsl5Ag7J2066+4IOyhtOyerO2VmOuKlCDrnbzsnbjsl5Ag6rCA7ZW07KeA64qUIO2PieuylO2VnCDroZzrk5zsl5Ag7J2Y7ZW07ISc64qUCisgICAgIOu5hOybjOyngOyngCDslYrripTrjbAsIO2BkOydmCDsmKTtjbzroIjsnbTshZjrk6TsnbQg7J20IOuhnOuTnOydmCDqsrDqs7zsl5Ag7JiB7Zal7J2EIOuBvOy5oCDsiJgg7J6I64ukCisgICAgIO2VoOyngOudvOuPhCDqt7jrn6ztlaguCisKK+ydtOygnCwg7LKr67KI7Ke4IENQVSDsl5DshJwg65GQ6rCc7J2YIOyTsOq4sCDsmKTtjbzroIjsnbTshZjsnYQg66eM65Oc64qU642wLCDtlbTri7kgQ1BVIOydmCDsupDsi5zsl5AKK+yalOyyreuQnCDsiJzshJzroZwg7Jik7Y2866CI7J207IWY7J20IOuPhOuLrOuQqOydhCDrs7TsnqXtlZjquLAg7JyE7ZW0IOuRkCDsmKTtjbzroIjsnbTshZgg7IKs7J207JeQIOyTsOq4sAor67Cw66as7Ja066W8IOyCrOyaqe2VmOuKlCDsg4HtmansnYQg7IOB7IOB7ZW0IOu0heyLnOuLpDoKKworCUNQVSAxCQlDUFUgMgkJQ09NTUVOVAorCT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCQkJCXUgPT0gMCwgdiA9PSAxIGFuZCBwID09ICZ1LCBxID09ICZ1CisJdiA9IDI7CisJc21wX3dtYigpOwkJCXYg7J2YIOuzgOqyveydtCBwIOydmCDrs4Dqsr0g7KCE7JeQIOuztOydvCDqsoPsnYQKKwkJCQkJIOu2hOuqhe2eiCDtlagKKwk8QTptb2RpZnkgdj0yPgkJCXYg64qUIOydtOygnCDsupDsi5wgQSDsl5Ag64+F7KCQ7KCB7Jy866GcIOyhtOyerO2VqAorCXAgPSAmdjsKKwk8Qjptb2RpZnkgcD0mdj4JCQlwIOuKlCDsnbTsoJwg7LqQ7IucIEIg7JeQIOuPheygkOyggeycvOuhnCDsobTsnqztlagKKwor7Jes6riw7ISc7J2YIOyTsOq4sCDrqZTrqqjrpqwg67Cw66as7Ja064qUIENQVSAxIOydmCDsupDsi5zqsIAg7Jis67CU66W4IOyInOyEnOuhnCDsl4XrjbDsnbTtirgg65CcIOqyg+ycvOuhnAor7Iuc7Iqk7YWc7J2YIOuLpOuluCBDUFUg65Ok7J20IOyduOyngO2VmOqyjCDrp4zrk63ri4jri6QuICDtlZjsp4Drp4wsIOydtOygnCDrkZDrsojsp7ggQ1BVIOqwgCDqt7gg6rCS65Ok7J2ECivsnb3snLzroKQg7ZWY64qUIOyDge2ZqeydhCDsg53qsIHtlbQg67SF7Iuc64ukOgorCisJQ1BVIDEJCUNQVSAyCQlDT01NRU5UCisJPT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkuLi4KKwkJCXEgPSBwOworCQkJeCA9ICpxOworCivsnITsnZgg65GQ6rCc7J2YIOydveq4sCDsmKTtjbzroIjsnbTshZjsnYAg7JiI7IOB65CcIOyInOyEnOuhnCDsnbzslrTrgpjsp4Ag66q77ZWgIOyImCDsnojripTrjbAsIOuRkOuyiOynuCBDUFUKK+ydmCDtlZwg7LqQ7Iuc7JeQIOuLpOuluCDsupDsi5wg7J2067Kk7Yq46rCAIOuwnOyDne2VtCB2IOulvCDri7Tqs6Ag7J6I64qUIOy6kOyLnOudvOyduOydmCDtlbTri7kg7LqQ7Iuc7JeQ7J2YCivsl4XrjbDsnbTtirjqsIAg7KeA7Jew65CY64qUIOyCrOydtCwgcCDrpbwg64u06rOgIOyeiOuKlCDsupDsi5zrnbzsnbjsnYAg65GQ67KI7Ke4IENQVSDsnZgg64uk66W4IOy6kOyLnOyXkAor7JeF642w7J207Yq4IOuQmOyWtOuyhOuguOydhCDsiJgg7J6I6riwIOuVjOusuOyeheuLiOuLpC4KKworCUNQVSAxCQlDUFUgMgkJQ09NTUVOVAorCT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCQkJCXUgPT0gMCwgdiA9PSAxIGFuZCBwID09ICZ1LCBxID09ICZ1CisJdiA9IDI7CisJc21wX3dtYigpOworCTxBOm1vZGlmeSB2PTI+CTxDOmJ1c3k+CisJCQk8QzpxdWV1ZSB2PTI+CisJcCA9ICZ2OwkJcSA9IHA7CisJCQk8RDpyZXF1ZXN0IHA+CisJPEI6bW9kaWZ5IHA9JnY+CTxEOmNvbW1pdCBwPSZ2PgorCQkJPEQ6cmVhZCBwPgorCQkJeCA9ICpxOworCQkJPEM6cmVhZCAqcT4J7LqQ7Iuc7JeQIOyXheuNsOydtO2KuCDrkJjquLAg7KCE7J2YIHYg66W8IOydveydjAorCQkJPEM6dW5idXN5PgorCQkJPEM6Y29tbWl0IHY9Mj4KKwor6riw67O47KCB7Jy866GcLCDrkZDqsJzsnZgg7LqQ7Iuc65287J24IOuqqOuRkCBDUFUgMiDsl5Ag7LWc7KKF7KCB7Jy866Gc64qUIOyXheuNsOydtO2KuCDrkKAg6rKD7J207KeA66eMLAor67OE64+E7J2YIOqwnOyehSDsl4bsnbTripQsIOyXheuNsOydtO2KuOydmCDsiJzshJzqsIAgQ1BVIDEg7JeQ7IScIOunjOuTpOyWtOynhCDsiJzshJzsmYAg64+Z7J287ZWgCivqsoPsnbTrnbzripQg67O07J6l7J20IOyXhuyKteuLiOuLpC4KKworCivsl6zquLDsl5Ag6rCc7J6F7ZWY6riwIOychO2VtOyEoCwg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTrgpgg7J296riwIOuwsOumrOyWtOulvCDroZzrk5wg7Jik7Y2866CI7J207IWY65OkCivsgqzsnbTsl5Ag64Sj7Ja07JW8IO2VqeuLiOuLpC4gIOydtOugh+qyjCDtlajsnLzroZzsjagg7LqQ7Iuc6rCAIOuLpOydjCDsmpTssq3snYQg7LKY66as7ZWY6riwIOyghOyXkCDsnbzqtIDshLEKK+2BkOulvCDsspjrpqztlZjrj4TroZ0g6rCV7KCc7ZWY6rKMIOuQqeuLiOuLpC4KKworCUNQVSAxCQlDUFUgMgkJQ09NTUVOVAorCT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCQkJCXUgPT0gMCwgdiA9PSAxIGFuZCBwID09ICZ1LCBxID09ICZ1CisJdiA9IDI7CisJc21wX3dtYigpOworCTxBOm1vZGlmeSB2PTI+CTxDOmJ1c3k+CisJCQk8QzpxdWV1ZSB2PTI+CisJcCA9ICZ2OwkJcSA9IHA7CisJCQk8RDpyZXF1ZXN0IHA+CisJPEI6bW9kaWZ5IHA9JnY+CTxEOmNvbW1pdCBwPSZ2PgorCQkJPEQ6cmVhZCBwPgorCQkJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkKKwkJCTxDOnVuYnVzeT4KKwkJCTxDOmNvbW1pdCB2PTI+CisJCQl4ID0gKnE7CisJCQk8QzpyZWFkICpxPgnsupDsi5zsl5Ag7JeF642w7J207Yq4IOuQnCB2IOulvCDsnb3snYwKKworCivsnbTrn7Ag67aA66WY7J2YIOusuOygnOuKlCBERUMgQWxwaGEg6rOE7Je0IO2UhOuhnOyEuOyEnOuTpOyXkOyEnCDrsJzqsqzrkKAg7IiYIOyeiOuKlOuNsCwg7J2065Ok7J2ACivrjbDsnbTthLAg67KE7Iqk66W8IOyigCDrjZQg7J6YIOyCrOyaqe2VtCDshLHriqXsnYQg6rCc7ISg7ZWgIOyImCDsnojripQsIOu2hO2VoOuQnCDsupDsi5zrpbwg6rCA7KeA6rOgIOyeiOq4sAor65WM66y47J6F64uI64ukLiAg64yA67aA67aE7J2YIENQVSDripQg7ZWY64KY7J2YIOydveq4sCDsmKTtjbzroIjsnbTshZjsnZgg66mU66qo66asIOyVoeyEuOyKpOqwgCDri6Trpbgg7J296riwCivsmKTtjbzroIjsnbTshZjsl5Ag7J2Y7KG07KCB7J20652866m0IOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja066W8IOuCtO2PrOyLnO2CteuLiOuLpOunjCwg66qo65GQ6rCAIOq3uOufsOqxtAor7JWE64uI6riwIOuVjOusuOyXkCDsnbTsoJDsl5Ag7J2Y7KG07ZW07ISgIOyViOuQqeuLiOuLpC4KKwor64uk66W4IENQVSDrk6Trj4Qg67aE7ZWg65CcIOy6kOyLnOulvCDqsIDsp4Dqs6Ag7J6I7J2EIOyImCDsnojsp4Drp4wsIOq3uOufsCBDUFUg65Ok7J2AIO2PieuylO2VnCDrqZTrqqjrpqwKK+yVoeyEuOyKpOulvCDsnITtlbTshJzrj4Qg7J20IOu2hO2VoOuQnCDsupDsi5zrk6Qg7IKs7J207J2YIOyhsOygleydhCDtlbTslbzrp4wg7ZWp64uI64ukLiAgQWxwaGEg64qUIOqwgOyepQor7JW97ZWcIOuplOuqqOumrCDsiJzshJwg7Iuc66eo7YuxIChzZW1hbnRpYykg7J2EIOyEoO2Dne2VqOycvOuhnOyNqCDrqZTrqqjrpqwg67Cw66as7Ja06rCAIOuqheyLnOyggeycvOuhnAor7IKs7Jqp65CY7KeAIOyViuyVmOydhCDrlYzsl5DripQg6re465+wIOyhsOygleydtCDtlYTsmpTtlZjsp4Ag7JWK6rKMIO2WiOyKteuLiOuLpC4KKworCivsupDsi5wg7J286rSA7ISxIFZTIERNQQorLS0tLS0tLS0tLS0tLS0tLS0tCisKK+uqqOuToCDsi5zsiqTthZzsnbQgRE1BIOulvCDtlZjripQg65SU67CU7J207Iqk7JeQIOuMgO2VtOyEnOq5jOyngCDsupDsi5wg7J286rSA7ISx7J2EIOycoOyngO2VmOyngOuKlAor7JWK7Iq164uI64ukLiAg6re465+wIOqyveyasCwgRE1BIOulvCDsi5zrj4TtlZjripQg65SU67CU7J207Iqk64qUIFJBTSDsnLzroZzrtoDthLAg7J6Y66q765CcIOuNsOydtO2EsOulvAor7J297J2EIOyImCDsnojripTrjbAsIOuNlO2LsCDsupDsi5wg65287J247J20IENQVSDsnZgg7LqQ7Iuc7JeQIOuouOustOultOqzoCDsnojqs6AsIOuwlOuAkCDqsJLsnbQg7JWE7KeBCitSQU0g7JeQIOyNqOyngOyngCDslYrslZjsnYQg7IiYIOyeiOq4sCDrlYzrrLjsnoXri4jri6QuICDsnbQg66y47KCc66W8IO2VtOqysO2VmOq4sCDsnITtlbTshKAsIOy7pOuEkOydmAor7KCB7KCI7ZWcIOu2gOu2hOyXkOyEnCDqsIEgQ1BVIOy6kOyLnOydmCDrrLjsoJzrkJjripQg67mE7Yq465Ok7J2EIO2UjOufrOyLnCAoZmx1c2gpIOyLnOy8nOyVvOunjCDtlanri4jri6QKKyjqt7jrpqzqs6Ag6re46rKD65Ok7J2EIOustO2aqO2ZlCAtIGludmFsaWRhdGlvbiAtIOyLnO2CrCDsiJjrj4Qg7J6I6rKg7KOgKS4KKwor65iQ7ZWcLCDrlJTrsJTsnbTsiqTsl5Ag7J2Y7ZW0IFJBTSDsl5AgRE1BIOuhnCDsk7Dsl6zsp4Qg6rCS7J2AIOuUlOuwlOydtOyKpOqwgCDsk7DquLDrpbwg7JmE66OM7ZWcIO2bhOyXkAorQ1BVIOydmCDsupDsi5zsl5DshJwgUkFNIOycvOuhnCDsk7Dsl6zsp4DripQg642U7YuwIOy6kOyLnCDrnbzsnbjsl5Ag7J2Y7ZW0IOuNruyWtOyNqOyniCDsiJjrj4Qg7J6I6rOgLCBDUFUKK+ydmCDsupDsi5zsl5Ag7KG07J6s7ZWY64qUIOy6kOyLnCDrnbzsnbjsnbQg7ZW064u5IOy6kOyLnOyXkOyEnCDsgq3soJzrkJjqs6Ag64uk7IucIOqwkuydhCDsnb3slrTrk6TsnbTquLAKK+yghOq5jOyngOuKlCBSQU0g7J20IOyXheuNsOydtO2KuCDrkJjsl4jri6TripQg7IKs7IukIOyekOyytOqwgCDsiKjqsqjsoLgg67KE66a0IOyImOuPhCDsnojsirXri4jri6QuICDsnbQKK+usuOygnOulvCDtlbTqsrDtlZjquLAg7JyE7ZW07ISgLCDsu6TrhJDsnZgg7KCB7KCI7ZWcIOu2gOu2hOyXkOyEnCDqsIEgQ1BVIOydmCDsupDsi5wg7JWI7J2YIOusuOygnOqwgCDrkJjripQKK+u5hO2KuOuTpOydhCDrrLTtmqjtmZQg7Iuc7Lyc7JW8IO2VqeuLiOuLpC4KKwor7LqQ7IucIOq0gOumrOyXkCDrjIDtlZwg642UIOunjuydgCDsoJXrs7Trpbwg7JyE7ZW07ISgIERvY3VtZW50YXRpb24vY2FjaGV0bGIudHh0IOulvAor7LC46rOg7ZWY7IS47JqULgorCisKK+y6kOyLnCDsnbzqtIDshLEgVlMgTU1JTworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNZW1vcnkgbWFwcGVkIEkvTyDripQg7J2867CY7KCB7Jy866GcIENQVSDsnZgg66mU66qo66asIOqzteqwhCDrgrTsnZgg7ZWcIOyciOuPhOyasOydmCDtirnsoJUg67aA67aECivrgrTsnZgg66mU66qo66asIOyngOyXreyXkCDsnbTro6jslrTsp4DripTrjbAsIOydtCDsnIjrj4TsmrDripQg7J2867CY7KCB7J24LCBSQU0g7Jy866GcIO2Wpe2VmOuKlAor7JyI64+E7Jqw7JmA64qUIOuLpOuluCDtirnshLHsnYQg6rCW7Iq164uI64ukLgorCivqt7jrn7Ag7Yq57ISxIOqwgOyatOuNsCDtlZjrgpjripQsIOydvOuwmOyggeycvOuhnCDqt7jrn7Ag7JWh7IS47Iqk64qUIOy6kOyLnOulvCDsmYTsoITtnogg7Jqw7ZqM7ZWY6rOgCivrlJTrsJTsnbTsiqQg67KE7Iqk66GcIOqzp+uwlOuhnCDtlqXtlZzri6TripQg6rKD7J6F64uI64ukLiAg7J20IOunkOydgCBNTUlPIOyVoeyEuOyKpOuKlCDrqLzsoIAKK+yLnOyekeuQmOyWtOyEnCDsupDsi5zsl5DshJwg7JmE66OM65CcIOuplOuqqOumrCDslaHshLjsiqTrpbwg7LaU7JuU7ZWgIOyImCDsnojri6TripQg65y77J6F64uI64ukLiAg7J2065+wCivqsr3smrDsl5Qg66mU66qo66asIOuwsOumrOyWtOunjOycvOuhnOuKlCDstqnrtoTsuZgg7JWK6rOgLCDrp4zslb0g7LqQ7Iuc65CcIOuplOuqqOumrCDsk7DquLAg7Jik7Y2866CI7J207IWY6rO8CitNTUlPIOyVoeyEuOyKpOqwgCDslrTrlqQg67Cp7Iud7Jy866Gc65OgIOydmOyhtOyggeydtOudvOuptCDtlbTri7kg7LqQ7Iuc64qUIOuRkCDsmKTtjbzroIjsnbTshZgg7IKs7J207JeQCivruYTsm4zsoLgoZmx1c2gp7JW866eMIO2VqeuLiOuLpC4KKworCis9PT09PT09PT09PT09PT09PT09PT09CitDUFUg65Ok7J20IOyggOyngOultOuKlCDsnbzrk6QKKz09PT09PT09PT09PT09PT09PT09PT0KKwor7ZSE66Gc6re4656Y66i464qUIENQVSDqsIAg66mU66qo66asIOyYpO2NvOugiOydtOyFmOuTpOydhCDsoJXtmZXtnogg7JqU7LKt7ZWc64yA66GcIOyImO2Wie2VtCDspIQg6rKD7J2065286rOgCivsg53qsIHtlZjripTrjbAsIOyYiOulvCDrk6TslrQg64uk7J2M6rO8IOqwmeydgCDsvZTrk5zrpbwgQ1BVIOyXkOqyjCDrhJjquLTri6TrqbQ6CisKKwlhID0gUkVBRF9PTkNFKCpBKTsKKwlXUklURV9PTkNFKCpCLCBiKTsKKwljID0gUkVBRF9PTkNFKCpDKTsKKwlkID0gUkVBRF9PTkNFKCpEKTsKKwlXUklURV9PTkNFKCpFLCBlKTsKKworQ1BVIOuKlCDri6TsnYwg7J247Iqk7Yq465+t7IWY7J2EIOyymOumrO2VmOq4sCDsoITsl5Ag7ZiE7J6s7J2YIOyduOyKpO2KuOufreyFmOydhCDsnITtlZwg66mU66qo66asCivsmKTtjbzroIjsnbTshZjsnYQg7JmE66OM7ZWgIOqyg+ydtOudvCDsg53qsIHtlZjqs6AsIOuUsOudvOyEnCDsi5zsiqTthZwg7Jm467aA7JeQ7IScIOq0gOywsO2VmOq4sOyXkOuPhCDsoJXtlbTsp4QKK+yInOyEnOuMgOuhnCDsmKTtjbzroIjsnbTshZjsnbQg7IiY7ZaJ65CgIOqyg+ycvOuhnCDsmIjsg4Htlanri4jri6Q6CisKKwlMT0FEICpBLCBTVE9SRSAqQiwgTE9BRCAqQywgTE9BRCAqRCwgU1RPUkUgKkUuCisKKwor64u57Jew7ZWY7KeA66eMLCDsi6TsoJzroZzripQg7Zuo7JSsIOyXieunneyeheuLiOuLpC4gIOunjuydgCBDUFUg7JmAIOy7tO2MjOydvOufrOyXkOyEnCDslZ7snZgg6rCA7KCV7J2ACivshLHrpr3tlZjsp4Ag66q77ZWY64qU642wIOq3uCDsnbTsnKDripQg64uk7J2M6rO8IOqwmeyKteuLiOuLpDoKKworICgqKSDroZzrk5wg7Jik7Y2866CI7J207IWY65Ok7J2AIOyLpO2WieydhCDqs4Tsho0g7ZW064KY6rCA6riwIOychO2VtCDqs6frsJTroZwg7JmE66OM65CgIO2VhOyalOqwgCDsnojripQKKyAgICAg6rK97Jqw6rCAIOunjuydgCDrsJjrqbQsIOyKpO2GoOyWtCDsmKTtjbzroIjsnbTshZjrk6TsnYAg7KKF7KKFIOuzhOuLpOuluCDrrLjsoJwg7JeG7J20IOycoOyYiOuQoCDsiJgKKyAgICAg7J6I7Iq164uI64ukOworCisgKCopIOuhnOuTnCDsmKTtjbzroIjsnbTshZjrk6TsnYAg7JiI7Lih7KCB7Jy866GcIOyImO2WieuQoCDsiJgg7J6I7Jy866mwLCDtlYTsmpTsl4bripQg66Gc65Oc7JiA64uk6rOgCisgICAgIOymneuqheuQnCDsmIjsuKHsoIEg66Gc65Oc7J2YIOqysOqzvOuKlCDrsoTroKTsp5Hri4jri6Q7CisKKyAoKikg66Gc65OcIOyYpO2NvOugiOydtOyFmOuTpOydgCDsmIjsuKHsoIHsnLzroZwg7IiY7ZaJ65CgIOyImCDsnojsnLzrr4DroZwsIOyYiOyDgeuQnCDsnbTrsqTtirjsnZgKKyAgICAg7Iuc7YCA7Iqk7JmAIOuLpOuluCDsi5zqsITsl5Ag66Gc65Oc6rCAIOydtOukhOyniCDsiJgg7J6I7Iq164uI64ukOworCisgKCopIOuplOuqqOumrCDslaHshLjsiqQg7Iic7ISc64qUIENQVSDrsoTsiqTsmYAg7LqQ7Iuc66W8IOyigCDrjZQg7J6YIOyCrOyaqe2VoCDsiJgg7J6I64+E66GdIOyerOuwsOy5mAorICAgICDrkKAg7IiYIOyeiOyKteuLiOuLpDsKKworICgqKSDroZzrk5zsmYAg7Iqk7Yag7Ja064qUIOyduOygke2VnCDsnITsuZjsl5DsnZgg7JWh7IS47Iqk65Ok7J2EIOydvOq0hOyggeycvOuhnCDsspjrpqztlaAg7IiYIOyeiOuKlAorICAgICDrqZTrqqjrpqzrgpggSS9PIO2VmOuTnOybqOyWtCAo66mU66qo66as7JmAIFBDSSDrlJTrsJTsnbTsiqQg65GYIOuLpCDsnbTqsowg6rCA64ql7ZWgIOyImAorICAgICDsnojsirXri4jri6QpIOyXkCDrjIDtlbQg7JqU7LKt65CY64qUIOqyveyasCwg6rCc67OEIOyYpO2NvOugiOydtOyFmOydhCDsnITtlZwg7Yq4656c7J6t7IWYIOyEpOyglQorICAgICDruYTsmqnsnYQg7JWE64G86riwIOychO2VtCDsobDtlanrkJjslrQg7Iuk7ZaJ65CgIOyImCDsnojsirXri4jri6Q7IOq3uOumrOqzoAorCisgKCopIO2VtOuLuSBDUFUg7J2YIOuNsOydtO2EsCDsupDsi5zqsIAg7Iic7ISc7JeQIOyYge2WpeydhCDrgbzsuaAg7IiY64+EIOyeiOqzoCwg7LqQ7IucIOydvOq0gOyEsQorICAgICDrqZTsu6Tri4jsppjsnbQgLSDsiqTthqDslrTqsIAg7Iuk7KCc66GcIOy6kOyLnOyXkCDrj4Tri6ztlZzri6TrqbQgLSDsnbQg66y47KCc66W8IOyZhO2ZlOyLnO2CrCDsiJjripQKKyAgICAg7J6I7KeA66eMIOydtCDsnbzqtIDshLEg6rSA66as6rCAIOuLpOuluCBDUFUg65Ok7JeQ64+EIOqwmeydgCDsiJzshJzroZwg7KCE64us65Cc64uk64qUIOuztOyepeydgAorICAgICDsl4bsirXri4jri6QuCisKK+uUsOudvOyEnCwg7JWe7J2YIOy9lOuTnOyXkCDrjIDtlbQg64uk66W4IENQVSDqsIAg67O064qUIOqysOqzvOuKlCDri6TsnYzqs7wg6rCZ7J2EIOyImCDsnojsirXri4jri6Q6CisKKwlMT0FEICpBLCAuLi4sIExPQUQgeypDLCpEfSwgU1RPUkUgKkUsIFNUT1JFICpCCisKKwkoIkxPQUQgeypDLCpEfSIg64qUIOyhsO2VqeuQnCDroZzrk5zsnoXri4jri6QpCisKKwor7ZWY7KeA66eMLCBDUFUg64qUIOyKpOyKpOuhnOuKlCDsnbzqtIDsoIHsnbwg6rKD7J2EIOuztOyepe2VqeuLiOuLpDogQ1BVIF/snpDsi6BfIOydmCDslaHshLjsiqTrk6TsnYAKK+yekOyLoOyXkOqyjOuKlCDrqZTrqqjrpqwg67Cw66as7Ja06rCAIOyXhuydjOyXkOuPhCDrtojqtaztlZjqs6Ag7KCV7ZmV7Z6IIOyInOyEnCDshLjsm4zsp4Qg6rKD7Jy866GcIOuztOyXrOyniAor6rKD7J6F64uI64ukLiAg7JiI66W8IOuTpOyWtCDri6TsnYzsnZgg7L2U65Oc6rCAIOyjvOyWtOyhjOuLpOuptDoKKworCVUgPSBSRUFEX09OQ0UoKkEpOworCVdSSVRFX09OQ0UoKkEsIFYpOworCVdSSVRFX09OQ0UoKkEsIFcpOworCVggPSBSRUFEX09OQ0UoKkEpOworCVdSSVRFX09OQ0UoKkEsIFkpOworCVogPSBSRUFEX09OQ0UoKkEpOworCivqt7jrpqzqs6Ag7Jm467aA7J2YIOyYge2WpeyXkCDsnZjtlZwg6rCE7ISt7J20IOyXhuuLpOqzoCDqsIDsoJXtlZjrqbQsIOy1nOyihSDqsrDqs7zripQg64uk7J2M6rO8IOqwmeydtAor64KY7YOA64KgIOqyg+ydtOudvOqzoCDsmIjsg4HrkKAg7IiYIOyeiOyKteuLiOuLpDoKKworCVUgPT0gKkEg7J2YIOy1nOy0iCDqsJIKKwlYID09IFcKKwlaID09IFkKKwkqQSA9PSBZCisKK+yVnuydmCDsvZTrk5zripQgQ1BVIOqwgCDri6TsnYzsnZgg66mU66qo66asIOyVoeyEuOyKpCDsi5ztgIDsiqTrpbwg66eM65Ok64+E66GdIO2VoOqygeuLiOuLpDoKKworCVU9TE9BRCAqQSwgU1RPUkUgKkE9ViwgU1RPUkUgKkE9VywgWD1MT0FEICpBLCBTVE9SRSAqQT1ZLCBaPUxPQUQgKkEKKwor7ZWY7KeA66eMLCDrs4Tri6Trpbgg6rCc7J6F7J20IOyXhuqzoCDtlITroZzqt7jrnqjsnZgg7Iuc7JW87JeQIOydtCDshLjsg4HsnbQg7Jes7KCE7Z6IIOydvOq0gOyggeydtOudvOqzoAor67O07J2464uk64qUIOuztOyepeunjCDsp4DsvJzsp4Tri6TrqbQg7J20IOyLnO2AgOyKpOuKlCDslrTrlqQg7KGw7ZWp7Jy866Gc65OgIOyerOq1rOyEseuQoCDsiJgg7J6I7Jy866mwLCDqsIEKK+yVoeyEuOyKpOuTpOydgCDtlanss5Dsp4DqsbDrgpgg67KE66Ck7KeIIOyImCDsnojsirXri4jri6QuICDsnbzrtoAg7JWE7YKk7YWN7LOQ7JeQ7IScIENQVSDripQg6rCZ7J2AIOychOy5mOyXkAor64yA7ZWcIOyXsOyGjeyggeyduCDroZzrk5wg7Jik7Y2866CI7J207IWY65Ok7J2EIOyerOuwsOy5mCDtlaAg7IiYIOyeiOq4sCDrlYzrrLjsl5Ag7JWe7J2YIOyYiOyXkOyEnOydmAorUkVBRF9PTkNFKCkg7JmAIFdSSVRFX09OQ0UoKSDripQg67CY65Oc7IucIOyhtOyerO2VtOyVvCDtlajsnYQg7JWM7JWE65GQ7IS47JqULiAg6re465+wIOyiheulmOydmAor7JWE7YKk7YWN7LOQ7JeQ7IScIFJFQURfT05DRSgpIOyZgCBXUklURV9PTkNFKCkg64qUIOydtCDrrLjsoJzrpbwg66eJ6riwIOychO2VtCDtlYTsmpTtlZwg7J287J2ECivrrZDqsIAg65CQ65Og7KeAIO2VmOqyjCDrkJjripTrjbAsIOyYiOulvCDrk6TslrQgSXRhbml1bSDsl5DshJzripQgUkVBRF9PTkNFKCkg7JmAIFdSSVRFX09OQ0UoKQor6rCAIOyCrOyaqe2VmOuKlCB2b2xhdGlsZSDsupDsiqTtjIXsnYAgR0NDIOqwgCDqt7jrn7Ag7J6s67Cw7LmY66W8IOuwqeyngO2VmOuKlCDtirnsiJgg7J247Iqk7Yq465+t7IWY7J24CitsZC5hY3Eg7JmAIHN0bC5yZWwg7J247Iqk7Yq465+t7IWY7J2EIOqwgeqwgSDrp4zrk6TslrQg64K064+E66GdIO2VqeuLiOuLpC4KKwor7Lu07YyM7J2865+sIOyXreyLnCDsnbQg7Iuc7YCA7Iqk7J2YIOyVoeyEuOyKpOuTpOydhCBDUFUg6rCAIOuztOq4sOuPhCDsoITsl5Ag7ZWp7LmY6rGw64KYIOuyhOumrOqxsOuCmCDrkqTroZwKK+uvuOukhOuyhOumtCDsiJgg7J6I7Iq164uI64ukLgorCivsmIjrpbwg65Ok7Ja0OgorCisJKkEgPSBWOworCSpBID0gVzsKKwor64qUIOuLpOydjOqzvCDqsJnsnbQg67OA7ZiV65CgIOyImCDsnojsirXri4jri6Q6CisKKwkqQSA9IFc7CisKK+uUsOudvOyEnCwg7JOw6riwIOuwsOumrOyWtOuCmCBXUklURV9PTkNFKCkg6rCAIOyXhuuLpOuptCAqQSDroZzsnZggViDqsJLsnZgg7KCA7J6l7J2YIO2aqOqzvOuKlAor7IKs65287KeE64uk6rOgIOqwgOygleuQoCDsiJgg7J6I7Iq164uI64ukLiAg67mE7Iq37ZWY6rKMOgorCisJKkEgPSBZOworCVogPSAqQTsKKwor64qULCDrqZTrqqjrpqwg67Cw66as7Ja064KYIFJFQURfT05DRSgpIOyZgCBXUklURV9PTkNFKCkg7JeG7J2064qUIOuLpOydjOqzvCDqsJnsnbQg67OA7ZiV65CgIOyImAor7J6I7Iq164uI64ukOgorCisJKkEgPSBZOworCVogPSBZOworCivqt7jrpqzqs6Ag7J20IExPQUQg7Jik7Y2866CI7J207IWY7J2AIENQVSDrsJTquaXsl5DripQg7JWE7JiIIOuztOydtOyngCDslYrsirXri4jri6QuCisKKwor6re466as6rOgLCBBTFBIQSDqsIAg7J6I64ukCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworREVDIEFscGhhIENQVSDripQg6rCA7J6lIOyZhO2ZlOuQnCDrqZTrqqjrpqwg7Iic7ISc7J2YIENQVSDspJEg7ZWY64KY7J6F64uI64ukLiAg67+Q66eMIOyVhOuLiOudvCwKK0FscGhhIENQVSDsnZgg7J2867aAIOuyhOyghOydgCDrtoTtlaDrkJwg642w7J207YSwIOy6kOyLnOulvCDqsIDsp4Dqs6Ag7J6I7Ja07IScLCDsnZjrr7jsoIHsnLzroZwKK+q0gOqzhOuQmOyWtCDsnojripQg65GQ6rCc7J2YIOy6kOyLnCDrnbzsnbjsnbQg7ISc66GcIOuLpOuluCDsi5zqsITsl5Ag7JeF642w7J207Yq4IOuQmOuKlOqyjCDqsIDriqXtlanri4jri6QuCivsnbTqsowg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTqsIAg7KCV66eQIO2VhOyalO2VtOyngOuKlCDrtoDrtoTsnbjrjbAsIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja064qUCivrqZTrqqjrpqwg7J286rSA7ISxIOyLnOyKpO2FnOqzvCDtlajqu5gg65GQ6rCc7J2YIOy6kOyLnOulvCDrj5nquLDtmZQg7Iuc7Lyc7IScLCDtj6zsnbjthLAg67OA6rK96rO8IOyDiOuhnOyatAor642w7J207YSw7J2YIOuwnOqyrOydhCDsmKzrsJTrpbgg7Iic7ISc66GcIOydvOyWtOuCmOqyjCDtlZjquLAg65WM66y47J6F64uI64ukLgorCivrpqzriIXsiqQg7Luk64SQ7J2YIOuplOuqqOumrCDrsLDrpqzslrQg66qo64247J2AIEFscGhhIOyXkCDquLDstIjtlbTshJwg7KCV7J2Y65CY7JeI7Iq164uI64ukLgorCivsnITsnZggIuy6kOyLnCDsnbzqtIDshLEiIOyEnOu4jOyEueyFmOydhCDssLjqs6DtlZjshLjsmpQuCisKKwor6rCA7IOBIOuouOyLoCDqsozsiqTtirgKKy0tLS0tLS0tLS0tLS0tLS0KKwor6rCA7IOBIOuouOyLoOyXkOyEnCDrj5nsnpHtlZjripQg6rKM7Iqk7Yq465Ok7J2AIOqyjOyKpO2KuCDsnpDssrTripQgU01QIOyngOybkCDsl4bsnbQg7Lu07YyM7J28IOuQmOyXiOuLpAor7ZW064+EIFNNUCDsmIHtlqXsnYQg67Cb7J2EIOyImCDsnojsirXri4jri6QuICDsnbTqsbQgVVAg7Luk64SQ7J2EIOyCrOyaqe2VmOuptOyEnCBTTVAg7Zi47Iqk7Yq47JmACivqsrDrtoDrkJjslrQg67Cc7IOd7ZWY64qUIOu2gOyekeyaqeyeheuLiOuLpC4gIOydtCDqsr3smrDsl5DripQgbWFuZGF0b3J5IOuwsOumrOyWtOulvCDsgqzsmqntlbTshJwg66y47KCc66W8CivtlbTqsrDtlaAg7IiYIOyeiOqyoOyngOunjCDqt7jrn7Ag7ZW06rKw7J2AIOuMgOu2gOu2hOydmCDqsr3smrAg7LWc7KCB7J2YIO2VtOqysOyxheydtCDslYTri5nri4jri6QuCisKK+ydtCDrrLjsoJzrpbwg7JmE67K97ZWY6rKMIO2VtOqysO2VmOq4sCDsnITtlbQsIOuhnOyasCDroIjrsqjsnZggdmlydF9tYigpIOuTseydmCDrp6TtgazroZzrpbwg7IKs7Jqp7ZWgIOyImAor7J6I7Iq164uI64ukLiDsnbTqsoPrk6TsnYAgU01QIOqwgCDtmZzshLHtmZQg65CY7Ja0IOyeiOuLpOuptCBzbXBfbWIoKSDrk7Hqs7wg64+Z7J287ZWcIO2aqOqzvOulvAor6rCW7Iq164uI64uk66eMLCBTTVAg7JmAIFNNUCDslYTri4wg7Iuc7Iqk7YWcIOuqqOuRkOyXkCDrjIDtlbQg64+Z7J287ZWcIOy9lOuTnOulvCDrp4zrk6TslrTrg4Xri4jri6QuCivsmIjrpbwg65Ok7Ja0LCDqsIDsg4Eg66i47IugIOqyjOyKpO2KuOuTpOydgCAoU01QIOydvCDsiJgg7J6I64qUKSDtmLjsiqTtirjsmYAg64+Z6riw7ZmU66W8IO2VoCDrlYzsl5DripQKK3NtcF9tYigpIOqwgCDslYTri4jrnbwgdmlydF9tYigpIOulvCDsgqzsmqntlbTslbwg7ZWp64uI64ukLgorCivsnbTqsoPrk6TsnYAgc21wX21iKCkg66WY7J2YIOqyg+uTpOqzvCDrqqjrk6Ag67aA67aE7JeQ7IScIOuPmeydvO2VmOupsCwg7Yq57Z6ILCBNTUlPIOydmCDsmIHtlqXsl5AKK+uMgO2VtOyEnOuKlCDqsITsl6ztlZjsp4Ag7JWK7Iq164uI64ukOiBNTUlPIOydmCDsmIHtlqXsnYQg7KCc7Ja07ZWY66Ck66m0LCBtYW5kYXRvcnkg67Cw66as7Ja066W8CivsgqzsmqntlZjsi5zquLAg67CU656N64uI64ukLgorCisKKz09PT09PT0KK+yCrOyaqSDsmIgKKz09PT09PT0KKwor7Iic7ZmY7IudIOuyhO2NvAorLS0tLS0tLS0tLS0KKwor66mU66qo66asIOuwsOumrOyWtOuKlCDsiJztmZjsi50g67KE7Y2866W8IOyDneyEseyekChwcm9kdWNlcinsmYAg7IaM67mE7J6QKGNvbnN1bWVyKSDsgqzsnbTsnZgKK+uPmeq4sO2ZlOyXkCDrnb3snYQg7IKs7Jqp7ZWY7KeAIOyViuqzoCDqtaztmITtlZjripTrjbDsl5Ag7IKs7Jqp65CgIOyImCDsnojsirXri4jri6QuICDrjZQg7J6Q7IS47ZWcIOuCtOyaqeydhAor7JyE7ZW07ISgIOuLpOydjOydhCDssLjqs6DtlZjshLjsmpQ6CisKKwlEb2N1bWVudGF0aW9uL2NpcmN1bGFyLWJ1ZmZlcnMudHh0CisKKworPT09PT09PT09CivssLjqs6Ag66y47ZeMCis9PT09PT09PT0KKworQWxwaGEgQVhQIEFyY2hpdGVjdHVyZSBSZWZlcmVuY2UgTWFudWFsLCBTZWNvbmQgRWRpdGlvbiAoU2l0ZXMgJiBXaXRlaywKK0RpZ2l0YWwgUHJlc3MpCisJQ2hhcHRlciA1LjI6IFBoeXNpY2FsIEFkZHJlc3MgU3BhY2UgQ2hhcmFjdGVyaXN0aWNzCisJQ2hhcHRlciA1LjQ6IENhY2hlcyBhbmQgV3JpdGUgQnVmZmVycworCUNoYXB0ZXIgNS41OiBEYXRhIFNoYXJpbmcKKwlDaGFwdGVyIDUuNjogUmVhZC9Xcml0ZSBPcmRlcmluZworCitBTUQ2NCBBcmNoaXRlY3R1cmUgUHJvZ3JhbW1lcidzIE1hbnVhbCBWb2x1bWUgMjogU3lzdGVtIFByb2dyYW1taW5nCisJQ2hhcHRlciA3LjE6IE1lbW9yeS1BY2Nlc3MgT3JkZXJpbmcKKwlDaGFwdGVyIDcuNDogQnVmZmVyaW5nIGFuZCBDb21iaW5pbmcgTWVtb3J5IFdyaXRlcworCitJQS0zMiBJbnRlbCBBcmNoaXRlY3R1cmUgU29mdHdhcmUgRGV2ZWxvcGVyJ3MgTWFudWFsLCBWb2x1bWUgMzoKK1N5c3RlbSBQcm9ncmFtbWluZyBHdWlkZQorCUNoYXB0ZXIgNy4xOiBMb2NrZWQgQXRvbWljIE9wZXJhdGlvbnMKKwlDaGFwdGVyIDcuMjogTWVtb3J5IE9yZGVyaW5nCisJQ2hhcHRlciA3LjQ6IFNlcmlhbGl6aW5nIEluc3RydWN0aW9ucworCitUaGUgU1BBUkMgQXJjaGl0ZWN0dXJlIE1hbnVhbCwgVmVyc2lvbiA5CisJQ2hhcHRlciA4OiBNZW1vcnkgTW9kZWxzCisJQXBwZW5kaXggRDogRm9ybWFsIFNwZWNpZmljYXRpb24gb2YgdGhlIE1lbW9yeSBNb2RlbHMKKwlBcHBlbmRpeCBKOiBQcm9ncmFtbWluZyB3aXRoIHRoZSBNZW1vcnkgTW9kZWxzCisKK1VsdHJhU1BBUkMgUHJvZ3JhbW1lciBSZWZlcmVuY2UgTWFudWFsCisJQ2hhcHRlciA1OiBNZW1vcnkgQWNjZXNzZXMgYW5kIENhY2hlYWJpbGl0eQorCUNoYXB0ZXIgMTU6IFNwYXJjLVY5IE1lbW9yeSBNb2RlbHMKKworVWx0cmFTUEFSQyBJSUkgQ3UgVXNlcidzIE1hbnVhbAorCUNoYXB0ZXIgOTogTWVtb3J5IE1vZGVscworCitVbHRyYVNQQVJDIElJSWkgUHJvY2Vzc29yIFVzZXIncyBNYW51YWwKKwlDaGFwdGVyIDg6IE1lbW9yeSBNb2RlbHMKKworVWx0cmFTUEFSQyBBcmNoaXRlY3R1cmUgMjAwNQorCUNoYXB0ZXIgOTogTWVtb3J5CisJQXBwZW5kaXggRDogRm9ybWFsIFNwZWNpZmljYXRpb25zIG9mIHRoZSBNZW1vcnkgTW9kZWxzCisKK1VsdHJhU1BBUkMgVDEgU3VwcGxlbWVudCB0byB0aGUgVWx0cmFTUEFSQyBBcmNoaXRlY3R1cmUgMjAwNQorCUNoYXB0ZXIgODogTWVtb3J5IE1vZGVscworCUFwcGVuZGl4IEY6IENhY2hlcyBhbmQgQ2FjaGUgQ29oZXJlbmN5CisKK1NvbGFyaXMgSW50ZXJuYWxzLCBDb3JlIEtlcm5lbCBBcmNoaXRlY3R1cmUsIHA2My02ODoKKwlDaGFwdGVyIDMuMzogSGFyZHdhcmUgQ29uc2lkZXJhdGlvbnMgZm9yIExvY2tzIGFuZAorCQkJU3luY2hyb25pemF0aW9uCisKK1VuaXggU3lzdGVtcyBmb3IgTW9kZXJuIEFyY2hpdGVjdHVyZXMsIFN5bW1ldHJpYyBNdWx0aXByb2Nlc3NpbmcgYW5kIENhY2hpbmcKK2ZvciBLZXJuZWwgUHJvZ3JhbW1lcnM6CisJQ2hhcHRlciAxMzogT3RoZXIgTWVtb3J5IE1vZGVscworCitJbnRlbCBJdGFuaXVtIEFyY2hpdGVjdHVyZSBTb2Z0d2FyZSBEZXZlbG9wZXIncyBNYW51YWw6IFZvbHVtZSAxOgorCVNlY3Rpb24gMi42OiBTcGVjdWxhdGlvbgorCVNlY3Rpb24gNC40OiBNZW1vcnkgQWNjZXNzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2twcm9iZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9rcHJvYmVzLnR4dAppbmRleCAxZjliM2UyLi4xZjZkNDVhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2twcm9iZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQKQEAgLTEwMyw2ICsxMDMsMTYgQEAKIG9yIGluIHJlZ2lzdGVycy4gIFRoZSBqcHJvYmUgd2lsbCB3b3JrIGluIGVpdGhlciBjYXNlLCBzbyBsb25nIGFzIHRoZQogaGFuZGxlcidzIHByb3RvdHlwZSBtYXRjaGVzIHRoYXQgb2YgdGhlIHByb2JlZCBmdW5jdGlvbi4KIAorTm90ZSB0aGF0IGluIHNvbWUgYXJjaGl0ZWN0dXJlcyAoZS5nLjogYXJtNjQgYW5kIHNwYXJjNjQpIHRoZSBzdGFjaworY29weSBpcyBub3QgZG9uZSwgYXMgdGhlIGFjdHVhbCBsb2NhdGlvbiBvZiBzdGFja2VkIHBhcmFtZXRlcnMgbWF5IGJlCitvdXRzaWRlIG9mIGEgcmVhc29uYWJsZSBNQVhfU1RBQ0tfU0laRSB2YWx1ZSBhbmQgYmVjYXVzZSB0aGF0IGxvY2F0aW9uCitjYW5ub3QgYmUgZGV0ZXJtaW5lZCBieSB0aGUganByb2JlcyBjb2RlLiBJbiB0aGlzIGNhc2UgdGhlIGpwcm9iZXMKK3VzZXIgbXVzdCBiZSBjYXJlZnVsIHRvIG1ha2UgY2VydGFpbiB0aGUgY2FsbGluZyBzaWduYXR1cmUgb2YgdGhlCitmdW5jdGlvbiBkb2VzIG5vdCBjYXVzZSBwYXJhbWV0ZXJzIHRvIGJlIHBhc3NlZCBvbiB0aGUgc3RhY2sgKGUuZy46Cittb3JlIHRoYW4gZWlnaHQgZnVuY3Rpb24gYXJndW1lbnRzLCBhbiBhcmd1bWVudCBvZiBtb3JlIHRoYW4gc2l4dGVlbgorYnl0ZXMsIG9yIG1vcmUgdGhhbiA2NCBieXRlcyBvZiBhcmd1bWVudCBkYXRhLCBkZXBlbmRpbmcgb24KK2FyY2hpdGVjdHVyZSkuCisKIDEuMyBSZXR1cm4gUHJvYmVzCiAKIDEuMy4xIEhvdyBEb2VzIGEgUmV0dXJuIFByb2JlIFdvcms/CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2xlZHMvbGVkcy1tbHhjcGxkLnR4dCBiL0RvY3VtZW50YXRpb24vbGVkcy9sZWRzLW1seGNwbGQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZThmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2xlZHMvbGVkcy1tbHhjcGxkLnR4dApAQCAtMCwwICsxLDExMCBAQAorS2VybmVsIGRyaXZlciBmb3IgTWVsbGFub3ggc3lzdGVtcyBMRURzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUHJvdmlkZSBzeXN0ZW0gTEVEIHN1cHBvcnQgZm9yIHRoZSBuZXggTWVsbGFub3ggc3lzdGVtczoKKyJtc3g2NzEwIiwgIm1zeDY3MjAiLCAibXNiNzcwMCIsICJtc24yNzAwIiwgIm1zeDE0MTAiLAorIm1zbjI0MTAiLCAibXNiNzgwMCIsICJtc24yNzQwIiwgIm1zbjIxMDAiLgorCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KK0RyaXZlciBwcm92aWRlcyB0aGUgZm9sbG93aW5nIExFRHMgZm9yIHRoZSBzeXN0ZW1zICJtc3g2NzEwIiwgIm1zeDY3MjAiLAorIm1zYjc3MDAiLCAibXNuMjcwMCIsICJtc3gxNDEwIiwgIm1zbjI0MTAiLCAibXNiNzgwMCIsICJtc24yNzQwIjoKKyAgbWx4Y3BsZDpmYW4xOmdyZWVuCisgIG1seGNwbGQ6ZmFuMTpyZWQKKyAgbWx4Y3BsZDpmYW4yOmdyZWVuCisgIG1seGNwbGQ6ZmFuMjpyZWQKKyAgbWx4Y3BsZDpmYW4zOmdyZWVuCisgIG1seGNwbGQ6ZmFuMzpyZWQKKyAgbWx4Y3BsZDpmYW40OmdyZWVuCisgIG1seGNwbGQ6ZmFuNDpyZWQKKyAgbWx4Y3BsZDpwc3U6Z3JlZW4KKyAgbWx4Y3BsZDpwc3U6cmVkCisgIG1seGNwbGQ6c3RhdHVzOmdyZWVuCisgIG1seGNwbGQ6c3RhdHVzOnJlZAorCisgInN0YXR1cyIKKyAgQ1BMRCByZWcgb2Zmc2V0OiAweDIwCisgIEJpdHMgWzM6MF0KKworICJwc3UiCisgIENQTEQgcmVnIG9mZnNldDogMHgyMAorICBCaXRzIFs3OjRdCisKKyAiZmFuMSIKKyAgQ1BMRCByZWcgb2Zmc2V0OiAweDIxCisgIEJpdHMgWzM6MF0KKworICJmYW4yIgorICBDUExEIHJlZyBvZmZzZXQ6IDB4MjEKKyAgQml0cyBbNzo0XQorCisgImZhbjMiCisgIENQTEQgcmVnIG9mZnNldDogMHgyMgorICBCaXRzIFszOjBdCisKKyAiZmFuNCIKKyAgQ1BMRCByZWcgb2Zmc2V0OiAweDIyCisgIEJpdHMgWzc6NF0KKworIENvbG9yIG1hc2sgZm9yIGFsbCB0aGUgYWJvdmUgTEVEczoKKyAgW2JpdDMsYml0MixiaXQxLGJpdDBdIG9yCisgIFtiaXQ3LGJpdDYsYml0NSxiaXQ0XToKKwlbMCwwLDAsMF0gPSBMRUQgT0ZGCisJWzAsMSwwLDFdID0gUmVkIHN0YXRpYyBPTgorCVsxLDEsMCwxXSA9IEdyZWVuIHN0YXRpYyBPTgorCVswLDEsMSwwXSA9IFJlZCBibGluayAzSHoKKwlbMSwxLDEsMF0gPSBHcmVlbiBibGluayAzSHoKKwlbMCwxLDEsMV0gPSBSZWQgYmxpbmsgNkh6CisJWzEsMSwxLDFdID0gR3JlZW4gYmxpbmsgNkh6CisKK0RyaXZlciBwcm92aWRlcyB0aGUgZm9sbG93aW5nIExFRHMgZm9yIHRoZSBzeXN0ZW0gIm1zbjIxMDAiOgorICBtbHhjcGxkOmZhbjpncmVlbgorICBtbHhjcGxkOmZhbjpyZWQKKyAgbWx4Y3BsZDpwc3UxOmdyZWVuCisgIG1seGNwbGQ6cHN1MTpyZWQKKyAgbWx4Y3BsZDpwc3UyOmdyZWVuCisgIG1seGNwbGQ6cHN1MjpyZWQKKyAgbWx4Y3BsZDpzdGF0dXM6Z3JlZW4KKyAgbWx4Y3BsZDpzdGF0dXM6cmVkCisgIG1seGNwbGQ6dWlkOmJsdWUKKworICJzdGF0dXMiCisgIENQTEQgcmVnIG9mZnNldDogMHgyMAorICBCaXRzIFszOjBdCisKKyAiZmFuIgorICBDUExEIHJlZyBvZmZzZXQ6IDB4MjEKKyAgQml0cyBbMzowXQorCisgInBzdTEiCisgIENQTEQgcmVnIG9mZnNldDogMHgyMworICBCaXRzIFszOjBdCisKKyAicHN1MiIKKyAgQ1BMRCByZWcgb2Zmc2V0OiAweDIzCisgIEJpdHMgWzc6NF0KKworICJ1aWQiCisgIENQTEQgcmVnIG9mZnNldDogMHgyNAorICBCaXRzIFszOjBdCisKKyBDb2xvciBtYXNrIGZvciBhbGwgdGhlIGFib3ZlIExFRHMsIGV4Y2VwdGVkIHVpZDoKKyAgW2JpdDMsYml0MixiaXQxLGJpdDBdIG9yCisgIFtiaXQ3LGJpdDYsYml0NSxiaXQ0XToKKwlbMCwwLDAsMF0gPSBMRUQgT0ZGCisJWzAsMSwwLDFdID0gUmVkIHN0YXRpYyBPTgorCVsxLDEsMCwxXSA9IEdyZWVuIHN0YXRpYyBPTgorCVswLDEsMSwwXSA9IFJlZCBibGluayAzSHoKKwlbMSwxLDEsMF0gPSBHcmVlbiBibGluayAzSHoKKwlbMCwxLDEsMV0gPSBSZWQgYmxpbmsgNkh6CisJWzEsMSwxLDFdID0gR3JlZW4gYmxpbmsgNkh6CisKKyBDb2xvciBtYXNrIGZvciB1aWQgTEVEOgorICBbYml0MyxiaXQyLGJpdDEsYml0MF06CisJWzAsMCwwLDBdID0gTEVEIE9GRgorCVsxLDEsMCwxXSA9IEJsdWUgc3RhdGljIE9OCisJWzEsMSwxLDBdID0gQmx1ZSBibGluayAzSHoKKwlbMSwxLDEsMV0gPSBCbHVlIGJsaW5rIDZIegorCitEcml2ZXIgc3VwcG9ydHMgSFcgYmxpbmtpbmcgYXQgM0h6IGFuZCA2SHogZnJlcXVlbmN5ICg1MCUgZHV0eSBjeWNsZSkuCitGb3IgM0h6IGR1dHkgY3lsY2UgaXMgYWJvdXQgMTY3IG1zZWMsIGZvciA2SHogaXMgYWJvdXQgODMgbXNlYy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbGVkcy9sZWR0cmlnLW9uZXNob3QudHh0IGIvRG9jdW1lbnRhdGlvbi9sZWRzL2xlZHRyaWctb25lc2hvdC50eHQKaW5kZXggMDdjZDFmYS4uZmU1NzQ3NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9sZWRzL2xlZHRyaWctb25lc2hvdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9sZWRzL2xlZHRyaWctb25lc2hvdC50eHQKQEAgLTIxLDI0ICsyMSw4IEBACiAKICAgZWNobyBvbmVzaG90ID4gdHJpZ2dlcgogCi1UaGlzIGFkZHMgdGhlIGZvbGxvd2luZyBzeXNmcyBhdHRyaWJ1dGVzIHRvIHRoZSBMRUQ6Ci0KLSAgZGVsYXlfb24gLSBzcGVjaWZpZXMgZm9yIGhvdyBtYW55IG1pbGxpc2Vjb25kcyB0aGUgTEVEIGhhcyB0byBzdGF5IGF0Ci0gICAgICAgICAgICAgTEVEX0ZVTEwgYnJpZ2h0bmVzcyBhZnRlciBpdCBoYXMgYmVlbiBhcm1lZC4KLSAgICAgICAgICAgICBEZWZhdWx0IHRvIDEwMCBtcy4KLQotICBkZWxheV9vZmYgLSBzcGVjaWZpZXMgZm9yIGhvdyBtYW55IG1pbGxpc2Vjb25kcyB0aGUgTEVEIGhhcyB0byBzdGF5IGF0Ci0gICAgICAgICAgICAgIExFRF9PRkYgYnJpZ2h0bmVzcyBhZnRlciBpdCBoYXMgYmVlbiBhcm1lZC4KLSAgICAgICAgICAgICAgRGVmYXVsdCB0byAxMDAgbXMuCi0KLSAgaW52ZXJ0IC0gcmV2ZXJzZSB0aGUgYmxpbmsgbG9naWMuICBJZiBzZXQgdG8gMCAoZGVmYXVsdCkgYmxpbmsgb24gZm9yIGRlbGF5X29uCi0gICAgICAgICAgIG1zLCB0aGVuIGJsaW5rIG9mZiBmb3IgZGVsYXlfb2ZmIG1zLCBsZWF2aW5nIHRoZSBMRUQgbm9ybWFsbHkgb2ZmLiAgSWYKLSAgICAgICAgICAgc2V0IHRvIDEsIGJsaW5rIG9mZiBmb3IgZGVsYXlfb2ZmIG1zLCB0aGVuIGJsaW5rIG9uIGZvciBkZWxheV9vbiBtcywKLSAgICAgICAgICAgbGVhdmluZyB0aGUgTEVEIG5vcm1hbGx5IG9uLgotICAgICAgICAgICBTZXR0aW5nIHRoaXMgdmFsdWUgYWxzbyBpbW1lZGlhdGVseSBjaGFuZ2UgdGhlIExFRCBzdGF0ZS4KLQotICBzaG90IC0gd3JpdGUgYW55IG5vbi1lbXB0eSBzdHJpbmcgdG8gc2lnbmFsIGFuIGV2ZW50cywgdGhpcyBzdGFydHMgYSBibGluawotICAgICAgICAgc2VxdWVuY2UgaWYgbm90IGFscmVhZHkgcnVubmluZy4KK1RoaXMgYWRkcyBzeXNmcyBhdHRyaWJ1dGVzIHRvIHRoZSBMRUQgdGhhdCBhcmUgZG9jdW1lbnRlZCBpbjoKK0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbGVkLXRyaWdnZXItb25lc2hvdAogCiBFeGFtcGxlIHVzZS1jYXNlOiBuZXR3b3JrIGRldmljZXMsIGluaXRpYWxpemF0aW9uOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2xlZHMvbGVkdHJpZy11c2Jwb3J0LnR4dCBiL0RvY3VtZW50YXRpb24vbGVkcy9sZWR0cmlnLXVzYnBvcnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZjU0YmYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2xlZHMvbGVkdHJpZy11c2Jwb3J0LnR4dApAQCAtMCwwICsxLDQxIEBACitVU0IgcG9ydCBMRUQgdHJpZ2dlcgorPT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBMRUQgdHJpZ2dlciBjYW4gYmUgdXNlZCBmb3Igc2lnbmFsbGluZyB0byB0aGUgdXNlciBhIHByZXNlbmNlIG9mIFVTQiBkZXZpY2UKK2luIGEgZ2l2ZW4gcG9ydC4gSXQgc2ltcGx5IHR1cm5zIG9uIExFRCB3aGVuIGRldmljZSBhcHBlYXJzIGFuZCB0dXJucyBpdCBvZmYKK3doZW4gaXQgZGlzYXBwZWFycy4KKworSXQgcmVxdWlyZXMgc2VsZWN0aW5nIFVTQiBwb3J0cyB0aGF0IHNob3VsZCBiZSBvYnNlcnZlZC4gQWxsIGF2YWlsYWJsZSBvbmVzIGFyZQorbGlzdGVkIGFzIHNlcGFyYXRlZCBlbnRyaWVzIGluIGEgInBvcnRzIiBzdWJkaXJlY3RvcnkuIFNlbGVjdGluZyBpcyBoYW5kbGVkIGJ5CitlY2hvaW5nICIxIiB0byBhIGNob3NlbiBwb3J0LgorCitQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgdHJpZ2dlciBhbGxvd3Mgc2VsZWN0aW5nIG11bHRpcGxlIFVTQiBwb3J0cyBmb3IgYSBzaW5nbGUKK0xFRC4gVGhpcyBjYW4gYmUgdXNlZnVsIGluIHR3byBjYXNlczoKKworMSkgRGV2aWNlIHdpdGggc2luZ2xlIFVTQiBMRUQgYW5kIGZldyBwaHlzaWNhbCBwb3J0cworCitJbiBzdWNoIGEgY2FzZSBMRUQgd2lsbCBiZSB0dXJuZWQgb24gYXMgbG9uZyBhcyB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY29ubmVjdGVkCitVU0IgZGV2aWNlLgorCisyKSBEZXZpY2Ugd2l0aCBhIHBoeXNpY2FsIHBvcnQgaGFuZGxlZCBieSBmZXcgY29udHJvbGxlcnMKKworU29tZSBkZXZpY2VzIG1heSBoYXZlIG9uZSBjb250cm9sbGVyIHBlciBQSFkgc3RhbmRhcmQuIEUuZy4gVVNCIDMuMCBwaHlzaWNhbAorcG9ydCBtYXkgYmUgaGFuZGxlZCBieSBvaGNpLXBsYXRmb3JtLCBlaGNpLXBsYXRmb3JtIGFuZCB4aGNpLWhjZC4gSWYgdGhlcmUgaXMKK29ubHkgb25lIExFRCB1c2VyIHdpbGwgbW9zdCBsaWtlbHkgd2FudCB0byBhc3NpZ24gcG9ydHMgZnJvbSBhbGwgMyBodWJzLgorCisKK1RoaXMgdHJpZ2dlciBjYW4gYmUgYWN0aXZhdGVkIGZyb20gdXNlciBzcGFjZSBvbiBsZWQgY2xhc3MgZGV2aWNlcyBhcyBzaG93bgorYmVsb3c6CisKKyAgZWNobyB1c2Jwb3J0ID4gdHJpZ2dlcgorCitUaGlzIGFkZHMgc3lzZnMgYXR0cmlidXRlcyB0byB0aGUgTEVEIHRoYXQgYXJlIGRvY3VtZW50ZWQgaW46CitEb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLWxlZC10cmlnZ2VyLXVzYnBvcnQKKworRXhhbXBsZSB1c2UtY2FzZToKKworICBlY2hvIHVzYnBvcnQgPiB0cmlnZ2VyCisgIGVjaG8gMSA+IHBvcnRzL3VzYjEtcG9ydDEKKyAgZWNobyAxID4gcG9ydHMvdXNiMi1wb3J0MQorICBjYXQgcG9ydHMvdXNiMS1wb3J0MQorICBlY2hvIDAgPiBwb3J0cy91c2IxLXBvcnQxCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2xvY2tpbmcvbGdsb2NrLnR4dCBiL0RvY3VtZW50YXRpb24vbG9ja2luZy9sZ2xvY2sudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjk3MWUzLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vbG9ja2luZy9sZ2xvY2sudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLWxnbG9jayAtIGxvY2FsL2dsb2JhbCBsb2NrcyBmb3IgbW9zdGx5IGxvY2FsIGFjY2VzcyBwYXR0ZXJucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU9yaWdpbjogTmljayBQaWdnaW4ncyBWRlMgc2NhbGFiaWxpdHkgc2VyaWVzIGludHJvZHVjZWQgZHVyaW5nCi0JMi42LjM1KysgWzFdIFsyXQotTG9jYXRpb246IGtlcm5lbC9sb2NraW5nL2xnbG9jay5jCi0JaW5jbHVkZS9saW51eC9sZ2xvY2suaAotVXNlcnM6IGN1cnJlbnRseSBvbmx5IHRoZSBWRlMgYW5kIHN0b3BfbWFjaGluZSByZWxhdGVkIGNvZGUKLQotRGVzaWduIEdvYWw6Ci0tLS0tLS0tLS0tLS0KLQotSW1wcm92ZSBzY2FsYWJpbGl0eSBvZiBnbG9iYWxseSB1c2VkIGxhcmdlIGRhdGEgc2V0cyB0aGF0IGFyZQotZGlzdHJpYnV0ZWQgb3ZlciBhbGwgQ1BVcyBhcyBwZXJfY3B1IGVsZW1lbnRzLgotCi1UbyBtYW5hZ2UgZ2xvYmFsIGRhdGEgc3RydWN0dXJlcyB0aGF0IGFyZSBwYXJ0aXRpb25lZCBvdmVyIGFsbCBDUFVzCi1hcyBwZXJfY3B1IGVsZW1lbnRzIGJ1dCBjYW4gYmUgbW9zdGx5IGhhbmRsZWQgYnkgQ1BVIGxvY2FsIGFjdGlvbnMKLWxnbG9jayB3aWxsIGJlIHVzZWQgd2hlcmUgdGhlIG1ham9yaXR5IG9mIGFjY2Vzc2VzIGFyZSBjcHUgbG9jYWwKLXJlYWRpbmcgYW5kIG9jY2FzaW9uYWwgY3B1IGxvY2FsIHdyaXRpbmcgd2l0aCB2ZXJ5IGluZnJlcXVlbnQKLWdsb2JhbCB3cml0ZSBhY2Nlc3MuCi0KLQotKiBkZWFsIHdpdGggdGhpbmdzIGxvY2FsbHkgd2hlbmV2ZXIgcG9zc2libGUKLQktIHZlcnkgZmFzdCBhY2Nlc3MgdG8gdGhlIGxvY2FsIHBlcl9jcHUgZGF0YQotCS0gcmVhc29uYWJseSBmYXN0IGFjY2VzcyB0byBzcGVjaWZpYyBwZXJfY3B1IGRhdGEgb24gYSBkaWZmZXJlbnQKLQkgIENQVQotKiB3aGlsZSBtYWtpbmcgZ2xvYmFsIGFjdGlvbiBwb3NzaWJsZSB3aGVuIG5lZWRlZAotCS0gYnkgZXhwZW5zaXZlIGFjY2VzcyB0byBhbGwgQ1BVcyBsb2NrcyAtIGVmZmVjdGl2ZWx5Ci0JICByZXN1bHRpbmcgaW4gYSBnbG9iYWxseSB2aXNpYmxlIGNyaXRpY2FsIHNlY3Rpb24uCi0KLURlc2lnbjoKLS0tLS0tLS0KLQotQmFzaWNhbGx5IGl0IGlzIGFuIGFycmF5IG9mIHBlcl9jcHUgc3BpbmxvY2tzIHdpdGggdGhlCi1sZ19sb2NhbF9sb2NrL3VubG9jayBhY2Nlc3NpbmcgdGhlIGxvY2FsIENQVXMgbG9jayBvYmplY3QgYW5kIHRoZQotbGdfbG9jYWxfbG9ja19jcHUvdW5sb2NrX2NwdSBhY2Nlc3NpbmcgYSByZW1vdGUgQ1BVcyBsb2NrIG9iamVjdAotdGhlIGxnX2xvY2FsX2xvY2sgaGFzIHRvIGRpc2FibGUgcHJlZW1wdGlvbiBhcyBtaWdyYXRpb24gcHJvdGVjdGlvbiBzbwotdGhhdCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBsb2NhbCBDUFVzIGxvY2sgZG9lcyBub3QgZ28gb3V0IG9mIHNjb3BlLgotRHVlIHRvIHRoZSBsZ19sb2NhbF9sb2NrL3VubG9jayBvbmx5IHRvdWNoaW5nIGNwdS1sb2NhbCByZXNvdXJjZXMgaXQKLWlzIGZhc3QuIFRha2luZyB0aGUgbG9jYWwgbG9jayBvbiBhIGRpZmZlcmVudCBDUFUgd2lsbCBiZSBtb3JlCi1leHBlbnNpdmUgYnV0IHN0aWxsIHJlbGF0aXZlbHkgY2hlYXAuCi0KLU9uZSBjYW4gcmVsYXggdGhlIG1pZ3JhdGlvbiBjb25zdHJhaW50cyBieSBhY3F1aXJpbmcgdGhlIGN1cnJlbnQKLUNQVXMgbG9jayB3aXRoIGxnX2xvY2FsX2xvY2tfY3B1LCByZW1lbWJlciB0aGUgY3B1LCBhbmQgcmVsZWFzZSB0aGF0Ci1sb2NrIGF0IHRoZSBlbmQgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24gZXZlbiBpZiBtaWdyYXRlZC4gVGhpcyBzaG91bGQKLWdpdmUgbW9zdCBvZiB0aGUgcGVyZm9ybWFuY2UgYmVuZWZpdHMgd2l0aG91dCBpbmhpYml0aW5nIG1pZ3JhdGlvbgotdGhvdWdoIG5lZWRzIGNhcmVmdWwgY29uc2lkZXJhdGlvbnMgZm9yIG5lc3Rpbmcgb2YgbGdsb2NrcyBhbmQKLWNvbnNpZGVyYXRpb24gb2YgZGVhZGxvY2tzIHdpdGggbGdfZ2xvYmFsX2xvY2suCi0KLVRoZSBsZ19nbG9iYWxfbG9jay91bmxvY2sgbG9ja3MgYWxsIHVuZGVybHlpbmcgc3BpbmxvY2tzIG9mIGFsbAotcG9zc2libGUgQ1BVcyAoaW5jbHVkaW5nIHRob3NlIG9mZi1saW5lKS4gVGhlIHByZWVtcHRpb24gZGlzYWJsZS9lbmFibGUKLWFyZSBuZWVkZWQgaW4gdGhlIG5vbi1SVCBrZXJuZWxzIHRvIHByZXZlbnQgZGVhZGxvY2tzIGxpa2U6Ci0KLSAgICAgICAgICAgICAgICAgICAgIG9uIGNwdSAxCi0KLSAgICAgICAgICAgICAgdGFzayBBICAgICAgICAgIHRhc2sgQgotICAgICAgICAgbGdfZ2xvYmFsX2xvY2sKLSAgICAgICAgICAgZ290IGNwdSAwIGxvY2sKLSAgICAgICAgICAgICAgICAgPDw8PCBwcmVlbXB0IDw8PDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsZ19sb2NhbF9sb2NrX2NwdSBmb3IgY3B1IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW4gb24gY3B1IDAgbG9jawotCi1PbiAtUlQgdGhpcyBkZWFkbG9jayBzY2VuYXJpbyBpcyByZXNvbHZlZCBieSB0aGUgYXJjaF9zcGluX2xvY2tzIGluIHRoZQotbGdsb2NrcyBiZWluZyByZXBsYWNlZCBieSBydF9tdXRleGVzIHdoaWNoIHJlc29sdmUgdGhlIGFib3ZlIGRlYWRsb2NrCi1ieSBib29zdGluZyB0aGUgbG9jay1ob2xkZXIuCi0KLQotSW1wbGVtZW50YXRpb246Ci0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGluaXRpYWwgbGdsb2NrIGltcGxlbWVudGF0aW9uIGZyb20gTmljayBQaWdnaW4gdXNlZCBzb21lIGNvbXBsZXgKLW1hY3JvcyB0byBnZW5lcmF0ZSB0aGUgbGdsb2NrL2JybG9jayBpbiBsZ2xvY2suaCAtIHRoZXkgd2VyZSBsYXRlcgotdHVybmVkIGludG8gYSBzZXQgb2YgZnVuY3Rpb25zIGJ5IEFuZGkgS2xlZW4gWzddLiBUaGUgY2hhbmdlIHRvIGZ1bmN0aW9ucwotd2FzIG1vdGl2YXRlZCBieSB0aGUgcHJlc2VuY2Ugb2YgbXVsdGlwbGUgbG9jayB1c2VycyBhbmQgYWxzbyBieSB0aGVtCi1iZWluZyBlYXNpZXIgdG8gbWFpbnRhaW4gdGhhbiB0aGUgZ2VuZXJhdGluZyBtYWNyb3MuIFRoaXMgY2hhbmdlIHRvCi1mdW5jdGlvbnMgaXMgYWxzbyB0aGUgYmFzaXMgdG8gZWxpbWluYXRlZCB0aGUgcmVzdHJpY3Rpb24gb2Ygbm90Ci1iZWluZyBpbml0aWFsaXplYWJsZSBpbiBrZXJuZWwgbW9kdWxlcyAodGhlIHJlbWFpbmluZyBwcm9ibGVtIGlzIHRoYXQKLWxvY2tzIGFyZSBub3QgZXhwbGljaXRseSBpbml0aWFsaXplZCAtIHNlZSBsb2NrZGVwLWRlc2lnbi50eHQpCi0KLURlY2xhcmF0aW9uIGFuZCBpbml0aWFsaXphdGlvbjoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAjaW5jbHVkZSA8bGludXgvbGdsb2NrLmg+Ci0KLSAgREVGSU5FX0xHTE9DSyhuYW1lKQotICBvcjoKLSAgREVGSU5FX1NUQVRJQ19MR0xPQ0sobmFtZSk7Ci0KLSAgbGdfbG9ja19pbml0KCZuYW1lLCAibG9ja2RlcF9uYW1lX3N0cmluZyIpOwotCi0gIG9uIFVQIHRoaXMgaXMgbWFwcGVkIHRvIERFRklORV9TUElOTE9DSyhuYW1lKSBpbiBib3RoIGNhc2VzLCBub3RlCi0gIGFsc28gdGhhdCBhcyBvZiAzLjE4LXJjNiBhbGwgZGVjbGFyYXRpb24gaW4gdXNlIGFyZSBvZiB0aGUgX1NUQVRJQ18KLSAgdmFyaWFudCAoYW5kIGl0IHNlZW1zIHRoYXQgdGhlIG5vbi1zdGF0aWMgd2FzIG5ldmVyIGluIHVzZSkuCi0gIGxnX2xvY2tfaW5pdCBpcyBpbml0aWFsaXppbmcgdGhlIGxvY2tkZXAgbWFwIG9ubHkuCi0KLVVzYWdlOgotLS0tLS0tCi0KLUZyb20gdGhlIGxvY2tpbmcgc2VtYW50aWNzIGl0IGlzIGEgc3BpbmxvY2suIEl0IGNvdWxkIGJlIGNhbGxlZCBhCi1sb2NhbGl0eSBhd2FyZSBzcGlubG9jay4gbGdfbG9jYWxfKiBiZWhhdmVzIGxpa2UgYSBwZXJfY3B1Ci1zcGlubG9jayBhbmQgbGdfZ2xvYmFsXyogbGlrZSBhIGdsb2JhbCBzcGlubG9jay4KLU5vIHN1cnByaXNlcyBpbiB0aGUgQVBJLgotCi0gIGxnX2xvY2FsX2xvY2soKmxnbG9jayk7Ci0gICAgIGFjY2VzcyB0byBwcm90ZWN0ZWQgcGVyX2NwdSBvYmplY3Qgb24gdGhpcyBDUFUKLSAgbGdfbG9jYWxfdW5sb2NrKCpsZ2xvY2spOwotCi0gIGxnX2xvY2FsX2xvY2tfY3B1KCpsZ2xvY2ssIGNwdSk7Ci0gICAgIGFjY2VzcyB0byBwcm90ZWN0ZWQgcGVyX2NwdSBvYmplY3Qgb24gb3RoZXIgQ1BVIGNwdQotICBsZ19sb2NhbF91bmxvY2tfY3B1KCpsZ2xvY2ssIGNwdSk7Ci0KLSAgbGdfZ2xvYmFsX2xvY2soKmxnbG9jayk7Ci0gICAgIGFjY2VzcyBhbGwgcHJvdGVjdGVkIHBlcl9jcHUgb2JqZWN0cyBvbiBhbGwgQ1BVcwotICBsZ19nbG9iYWxfdW5sb2NrKCpsZ2xvY2spOwotCi0gIFRoZXJlIGFyZSBubyBfdHJ5bG9jayB2YXJpYW50cyBvZiB0aGUgbGdsb2Nrcy4KLQotTm90ZSB0aGF0IHRoZSBsZ19nbG9iYWxfbG9jay91bmxvY2sgaGFzIHRvIGl0ZXJhdGUgb3ZlciBhbGwgcG9zc2libGUKLUNQVXMgcmF0aGVyIHRoYW4gdGhlIGFjdHVhbGx5IHByZXNlbnQgQ1BVcyBvciBhIENQVSBjb3VsZCBnbyBvZmYtbGluZQotd2l0aCBhIGhlbGQgbG9jayBbNF0gYW5kIHRoYXQgbWFrZXMgaXQgdmVyeSBleHBlbnNpdmUuIEEgZGlzY3Vzc2lvbiBvbgotdGhlc2UgaXNzdWVzIGNhbiBiZSBmb3VuZCBhdCBbNV0KLQotQ29uc3RyYWludHM6Ci0tLS0tLS0tLS0tLS0KLQotICAqIGN1cnJlbnRseSB0aGUgZGVjbGFyYXRpb24gb2YgbGdsb2NrcyBpbiBrZXJuZWwgbW9kdWxlcyBpcyBub3QKLSAgICBwb3NzaWJsZSwgdGhvdWdoIHRoaXMgc2hvdWxkIGJlIGRvYWJsZSB3aXRoIGxpdHRsZSBjaGFuZ2UuCi0gICogbGdsb2NrcyBhcmUgbm90IHJlY3Vyc2l2ZS4KLSAgKiBzdWl0YWJsZSBmb3IgY29kZSB0aGF0IGNhbiBkbyBtb3N0IG9wZXJhdGlvbnMgb24gdGhlIENQVSBsb2NhbAotICAgIGRhdGEgYW5kIHdpbGwgdmVyeSByYXJlbHkgbmVlZCB0aGUgZ2xvYmFsIGxvY2sKLSAgKiBsZ19nbG9iYWxfbG9jay91bmxvY2sgaXMgKnZlcnkqIGV4cGVuc2l2ZSBhbmQgZG9lcyBub3Qgc2NhbGUKLSAgKiBvbiBVUCBzeXN0ZW1zIGFsbCBsZ18qIHByaW1pdGl2ZXMgYXJlIHNpbXBseSBzcGlubG9ja3MKLSAgKiBpbiBQUkVFTVBUX1JUIHRoZSBzcGlubG9jayBiZWNvbWVzIGFuIHJ0LW11dGV4IGFuZCBjYW4gc2xlZXAgYnV0Ci0gICAgZG9lcyBub3QgY2hhbmdlIHRoZSB0YXNrcyBzdGF0ZSB3aGlsZSBzbGVlcGluZyBbNl0uCi0gICogaW4gUFJFRU1QVF9SVCB0aGUgcHJlZW1wdF9kaXNhYmxlL2VuYWJsZSBpbiBsZ19sb2NhbF9sb2NrL3VubG9jawotICAgIGlzIGRvd25ncmFkZWQgdG8gYSBtaWdyYXRlX2Rpc2FibGUvZW5hYmxlLCB0aGUgb3RoZXIKLSAgICBwcmVlbXB0X2Rpc2FibGUvZW5hYmxlIGFyZSBkb3duZ3JhZGVkIHRvIGJhcnJpZXJzIFs2XS4KLSAgICBUaGUgZGVhZGxvY2sgbm90ZWQgZm9yIG5vbi1SVCBhYm92ZSBpcyByZXNvbHZlZCBkdWUgdG8gcnRfbXV0ZXhlcwotICAgIGJvb3N0aW5nIHRoZSBsb2NrLWhvbGRlciBpbiB0aGlzIGNhc2Ugd2hpY2ggYXJjaF9zcGluX2xvY2tzIGRvCi0gICAgbm90IGRvLgotCi1sZ2xvY2tzIHdlcmUgZGVzaWduZWQgZm9yIHZlcnkgc3BlY2lmaWMgcHJvYmxlbXMgaW4gdGhlIFZGUyBhbmQgcHJvYmFibHkKLW9ubHkgYXJlIHRoZSByaWdodCBhbnN3ZXIgaW4gdGhlc2UgY29ybmVyIGNhc2VzLiBBbnkgbmV3IHVzZXIgdGhhdCBsb29rcwotYXQgbGdsb2NrcyBwcm9iYWJseSB3YW50cyB0byBsb29rIGF0IHRoZSBzZXFsb2NrIGFuZCBSQ1UgYWx0ZXJuYXRpdmVzIGFzCi1oZXIgZmlyc3QgY2hvaWNlLiBUaGVyZSBhcmUgYWxzbyBlZmZvcnRzIHRvIHJlc29sdmUgdGhlIFJDVSBpc3N1ZXMgdGhhdAotY3VycmVudGx5IHByZXZlbnQgdXNpbmcgUkNVIGluIHBsYWNlIG9mIHZpZXcgcmVtYWluaW5nIGxnbG9ja3MuCi0KLU5vdGUgb24gYnJsb2NrIGhpc3Rvcnk6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgJ0JpZyBSZWFkZXInIHJlYWQtd3JpdGUgc3BpbmxvY2tzIHdlcmUgb3JpZ2luYWxseSBpbnRyb2R1Y2VkIGJ5Ci1JbmdvIE1vbG5hciBpbiAyMDAwICgyLjQvMi41IGtlcm5lbCBzZXJpZXMpIGFuZCByZW1vdmVkIGluIDIwMDMuIFRoZXkKLWxhdGVyIHdlcmUgaW50cm9kdWNlZCBieSB0aGUgVkZTIHNjYWxhYmlsaXR5IHBhdGNoIHNldCBpbiAyLjYgc2VyaWVzCi1hZ2FpbiBhcyB0aGUgImJpZyByZWFkZXIgbG9jayIgYnJsb2NrIFsyXSB2YXJpYW50IG9mIGxnbG9jayB3aGljaCBoYXMKLWJlZW4gcmVwbGFjZWQgYnkgc2VxbG9jayBwcmltaXRpdmVzIG9yIGJ5IFJDVSBiYXNlZCBwcmltaXRpdmVzIGluIHRoZQotMy4xMyBrZXJuZWwgc2VyaWVzIGFzIHdhcyBzdWdnZXN0ZWQgaW4gWzNdIGluIDIwMDMuIFRoZSBicmxvY2sgd2FzCi1lbnRpcmVseSByZW1vdmVkIGluIHRoZSAzLjEzIGtlcm5lbCBzZXJpZXMuCi0KLUxpbms6IDEgaHR0cDovL2xrbWwub3JnL2xrbWwvMjAxMC84LzIvODEKLUxpbms6IDIgaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvNDAxNzM4LwotTGluazogMyBodHRwOi8vbGttbC5vcmcvbGttbC8yMDAzLzMvOS8yMDUKLUxpbms6IDQgaHR0cHM6Ly9sa21sLm9yZy9sa21sLzIwMTEvOC8yNC8xODUKLUxpbms6IDUgaHR0cDovL2xrbWwub3JnL2xrbWwvMjAxMS8xMi8xOC8xODkKLUxpbms6IDYgaHR0cHM6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3Byb2plY3RzL3J0LwotICAgICAgICBwYXRjaCBzZXJpZXMgLSBsZ2xvY2tzLXJ0LnBhdGNoLnBhdGNoCi1MaW5rOiA3IGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMTIvMy81LzI2CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lZGlhL01ha2VmaWxlIGIvRG9jdW1lbnRhdGlvbi9tZWRpYS9NYWtlZmlsZQppbmRleCAzOWUyZDc2Li5hN2ZiMzUyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21lZGlhL01ha2VmaWxlCisrKyBiL0RvY3VtZW50YXRpb24vbWVkaWEvTWFrZWZpbGUKQEAgLTEwLDcgKzEwLDggQEAKIAogVEFSR0VUUyA6PSAkKGFkZHByZWZpeCAkKEJVSUxERElSKS8sICQoRklMRVMpKQogCi1odG1sZG9jczogJChCVUlMRERJUikgJHtUQVJHRVRTfQorLlBIT05ZOiBhbGwKK2FsbDogJChCVUlMRERJUikgJHtUQVJHRVRTfQogCiAkKEJVSUxERElSKToKIAkkKFEpbWtkaXIgLXAgJEAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWVkaWEvY29uZi5weSBiL0RvY3VtZW50YXRpb24vbWVkaWEvY29uZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWY5MjdiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9tZWRpYS9jb25mLnB5CkBAIC0wLDAgKzEsMTAgQEAKKyMgLSotIGNvZGluZzogdXRmLTg7IG1vZGU6IHB5dGhvbiAtKi0KKworcHJvamVjdCA9ICdMaW51eCBNZWRpYSBTdWJzeXN0ZW0gRG9jdW1lbnRhdGlvbicKKwordGFncy5hZGQoInN1YnByb2plY3QiKQorCitsYXRleF9kb2N1bWVudHMgPSBbCisgICAgKCdpbmRleCcsICdtZWRpYS50ZXgnLCAnTGludXggTWVkaWEgU3Vic3lzdGVtIERvY3VtZW50YXRpb24nLAorICAgICAnVGhlIGtlcm5lbCBkZXZlbG9wbWVudCBjb21tdW5pdHknLCAnbWFudWFsJyksCitdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lZGlhL2NvbmZfbml0cGljay5weSBiL0RvY3VtZW50YXRpb24vbWVkaWEvY29uZl9uaXRwaWNrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYmVhYzIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL21lZGlhL2NvbmZfbml0cGljay5weQpAQCAtMCwwICsxLDkzIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04OyBtb2RlOiBweXRob24gLSotCisKK3Byb2plY3QgPSAnTGludXggTWVkaWEgU3Vic3lzdGVtIERvY3VtZW50YXRpb24nCisKKyMgSXQgaXMgcG9zc2libGUgdG8gcnVuIFNwaGlueCBpbiBuaWNrcGljayBtb2RlIHdpdGg6CituaXRwaWNreSA9IFRydWUKKworIyB3aXRoaW4gbml0LXBpY2tpbmcgYnVpbGQsIGRvIG5vdCByZWZlciB0byBhbnkgaW50ZXJzcGhpbnggb2JqZWN0CitpbnRlcnNwaGlueF9tYXBwaW5nID0ge30KKworIyBJbiBuaWNrcGljayBtb2RlLCBpdCB3aWxsIGNvbXBsYWluIGFib3V0IGxvdHMgb2YgbWlzc2luZyByZWZlcmVuY2VzIHRoYXQKKyMKKyMgMSkgYXJlIGp1c3QgdHlwZWRlZnMgbGlrZTogYm9vbCwgX191MzIsIGV0YzsKKyMgMikgSXQgd2lsbCBjb21wbGFpbiBmb3IgdGhpbmdzIGxpa2U6IGVudW0sIE5VTEw7CisjIDMpIEl0IHdpbGwgY29tcGxhaW4gZm9yIHN5bWJvbHMgdGhhdCBzaG91bGQgYmUgb24gZGlmZmVyZW50CisjICAgIGJvb2tzIChidXQgY3VycmVudGx5IGFyZW4ndCBwb3J0ZWQgdG8gUmVTVCkKKyMKKyMgVGhlIGxpc3QgYmVsb3cgaGFzIGEgbGlzdCBvZiBzdWNoIHN5bWJvbHMgdG8gYmUgaWdub3JlZCBpbiBuaXRwaWNrIG1vZGUKKyMKK25pdHBpY2tfaWdub3JlID0gWworICAgICgiYzpmdW5jIiwgImNsb2NrX2dldHRpbWUiKSwKKyAgICAoImM6ZnVuYyIsICJjbG9zZSIpLAorICAgICgiYzpmdW5jIiwgImNvbnRhaW5lcl9vZiIpLAorICAgICgiYzpmdW5jIiwgImRldGVybWluZV92YWxpZF9pb2N0bHMiKSwKKyAgICAoImM6ZnVuYyIsICJFUlJfUFRSIiksCisgICAgKCJjOmZ1bmMiLCAiaW9jdGwiKSwKKyAgICAoImM6ZnVuYyIsICJJU19FUlIiKSwKKyAgICAoImM6ZnVuYyIsICJtbWFwIiksCisgICAgKCJjOmZ1bmMiLCAib3BlbiIpLAorICAgICgiYzpmdW5jIiwgInBjaV9uYW1lIiksCisgICAgKCJjOmZ1bmMiLCAicG9sbCIpLAorICAgICgiYzpmdW5jIiwgIlBUUl9FUlIiKSwKKyAgICAoImM6ZnVuYyIsICJyZWFkIiksCisgICAgKCJjOmZ1bmMiLCAicmVsZWFzZSIpLAorICAgICgiYzpmdW5jIiwgInNldCIpLAorICAgICgiYzpmdW5jIiwgInN0cnVjdCBmZF9zZXQiKSwKKyAgICAoImM6ZnVuYyIsICJzdHJ1Y3QgcG9sbGZkIiksCisgICAgKCJjOmZ1bmMiLCAidXNiX21ha2VfcGF0aCIpLAorICAgICgiYzpmdW5jIiwgIndyaXRlIiksCisgICAgKCJjOnR5cGUiLCAiYXRvbWljX3QiKSwKKyAgICAoImM6dHlwZSIsICJib29sIiksCisgICAgKCJjOnR5cGUiLCAiYnVmX3F1ZXVlIiksCisgICAgKCJjOnR5cGUiLCAiZGV2aWNlIiksCisgICAgKCJjOnR5cGUiLCAiZGV2aWNlX2RyaXZlciIpLAorICAgICgiYzp0eXBlIiwgImRldmljZV9ub2RlIiksCisgICAgKCJjOnR5cGUiLCAiZW51bSIpLAorICAgICgiYzp0eXBlIiwgImZpbGUiKSwKKyAgICAoImM6dHlwZSIsICJpMmNfYWRhcHRlciIpLAorICAgICgiYzp0eXBlIiwgImkyY19ib2FyZF9pbmZvIiksCisgICAgKCJjOnR5cGUiLCAiaTJjX2NsaWVudCIpLAorICAgICgiYzp0eXBlIiwgImt0aW1lX3QiKSwKKyAgICAoImM6dHlwZSIsICJsZWRfY2xhc3NkZXZfZmxhc2giKSwKKyAgICAoImM6dHlwZSIsICJsaXN0X2hlYWQiKSwKKyAgICAoImM6dHlwZSIsICJsb2NrX2NsYXNzX2tleSIpLAorICAgICgiYzp0eXBlIiwgIm1vZHVsZSIpLAorICAgICgiYzp0eXBlIiwgIm11dGV4IiksCisgICAgKCJjOnR5cGUiLCAicGNpX2RldiIpLAorICAgICgiYzp0eXBlIiwgInBkdmJkZXYiKSwKKyAgICAoImM6dHlwZSIsICJwb2xsX3RhYmxlX3N0cnVjdCIpLAorICAgICgiYzp0eXBlIiwgInMzMiIpLAorICAgICgiYzp0eXBlIiwgInM2NCIpLAorICAgICgiYzp0eXBlIiwgInNkIiksCisgICAgKCJjOnR5cGUiLCAic3BpX2JvYXJkX2luZm8iKSwKKyAgICAoImM6dHlwZSIsICJzcGlfZGV2aWNlIiksCisgICAgKCJjOnR5cGUiLCAic3BpX21hc3RlciIpLAorICAgICgiYzp0eXBlIiwgInN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyIpLAorICAgICgiYzp0eXBlIiwgInN0cnVjdCBwb2xsZmQiKSwKKyAgICAoImM6dHlwZSIsICJzdHJ1Y3QgdGltZXZhbCIpLAorICAgICgiYzp0eXBlIiwgInN0cnVjdCB2aWRlb19jYXBhYmlsaXR5IiksCisgICAgKCJjOnR5cGUiLCAidTE2IiksCisgICAgKCJjOnR5cGUiLCAidTMyIiksCisgICAgKCJjOnR5cGUiLCAidTY0IiksCisgICAgKCJjOnR5cGUiLCAidTgiKSwKKyAgICAoImM6dHlwZSIsICJ1bmlvbiIpLAorICAgICgiYzp0eXBlIiwgInVzYl9kZXZpY2UiKSwKKworICAgICgiY3BwOnR5cGUiLCAiYm9vbGVhbiIpLAorICAgICgiY3BwOnR5cGUiLCAiZmQiKSwKKyAgICAoImNwcDp0eXBlIiwgImZkX3NldCIpLAorICAgICgiY3BwOnR5cGUiLCAiaW50MTZfdCIpLAorICAgICgiY3BwOnR5cGUiLCAiTlVMTCIpLAorICAgICgiY3BwOnR5cGUiLCAib2ZmX3QiKSwKKyAgICAoImNwcDp0eXBlIiwgInBvbGxmZCIpLAorICAgICgiY3BwOnR5cGUiLCAic2l6ZV90IiksCisgICAgKCJjcHA6dHlwZSIsICJzc2l6ZV90IiksCisgICAgKCJjcHA6dHlwZSIsICJ0aW1ldmFsIiksCisgICAgKCJjcHA6dHlwZSIsICJfX3UxNiIpLAorICAgICgiY3BwOnR5cGUiLCAiX191MzIiKSwKKyAgICAoImNwcDp0eXBlIiwgIl9fdTY0IiksCisgICAgKCJjcHA6dHlwZSIsICJ1aW50MTZfdCIpLAorICAgICgiY3BwOnR5cGUiLCAidWludDMyX3QiKSwKKyAgICAoImNwcDp0eXBlIiwgInZpZGVvX3N5c3RlbV90IiksCitdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lZGlhL2luZGV4LnJzdCBiL0RvY3VtZW50YXRpb24vbWVkaWEvaW5kZXgucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOGYwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL21lZGlhL2luZGV4LnJzdApAQCAtMCwwICsxLDE5IEBACitMaW51eCBNZWRpYSBTdWJzeXN0ZW0gRG9jdW1lbnRhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29udGVudHM6CisKKy4uIHRvY3RyZWU6OgorICAgOm1heGRlcHRoOiAyCisKKyAgIG1lZGlhX3VhcGkKKyAgIG1lZGlhX2thcGkKKyAgIGR2Yi1kcml2ZXJzL2luZGV4CisgICB2NGwtZHJpdmVycy9pbmRleAorCisuLiBvbmx5OjogIHN1YnByb2plY3QKKworICAgSW5kaWNlcworICAgPT09PT09PQorCisgICAqIDpyZWY6YGdlbmluZGV4YApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tZWRpYS91YXBpL2NlYy9jZWMtZnVuYy1vcGVuLnJzdCBiL0RvY3VtZW50YXRpb24vbWVkaWEvdWFwaS9jZWMvY2VjLWZ1bmMtb3Blbi5yc3QKaW5kZXggMzhmZDdlMC4uN2MwZjk4MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tZWRpYS91YXBpL2NlYy9jZWMtZnVuYy1vcGVuLnJzdAorKysgYi9Eb2N1bWVudGF0aW9uL21lZGlhL3VhcGkvY2VjL2NlYy1mdW5jLW9wZW4ucnN0CkBAIC0zMiw3ICszMiw3IEBACiAgICAgT3BlbiBmbGFncy4gQWNjZXNzIG1vZGUgbXVzdCBiZSBgYE9fUkRXUmBgLgogCiAgICAgV2hlbiB0aGUgYGBPX05PTkJMT0NLYGAgZmxhZyBpcyBnaXZlbiwgdGhlCi0gICAgOnJlZjpgQ0VDX1JFQ0VJVkUgPENFQ19SRUNFSVZFPmAgYW5kIDpyZWY6YENFQ19EUUVWRU5UIDxDRUNfRFFFVkVOVD5gIGlvY3RscworICAgIDpyZWY6YENFQ19SRUNFSVZFIDxDRUNfUkVDRUlWRT5gIGFuZCA6YzpmdW5jOmBDRUNfRFFFVkVOVGAgaW9jdGxzCiAgICAgd2lsbCByZXR1cm4gdGhlIGBgRUFHQUlOYGAgZXJyb3IgY29kZSB3aGVuIG5vIG1lc3NhZ2Ugb3IgZXZlbnQgaXMgYXZhaWxhYmxlLCBhbmQKICAgICBpb2N0bHMgOnJlZjpgQ0VDX1RSQU5TTUlUIDxDRUNfVFJBTlNNSVQ+YCwKICAgICA6cmVmOmBDRUNfQURBUF9TX1BIWVNfQUREUiA8Q0VDX0FEQVBfU19QSFlTX0FERFI+YCBhbmQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWVkaWEvdWFwaS9jZWMvY2VjLWlvYy1hZGFwLWctbG9nLWFkZHJzLnJzdCBiL0RvY3VtZW50YXRpb24vbWVkaWEvdWFwaS9jZWMvY2VjLWlvYy1hZGFwLWctbG9nLWFkZHJzLnJzdAppbmRleCAwNGVlOTAwLi4yMDFkNDgzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21lZGlhL3VhcGkvY2VjL2NlYy1pb2MtYWRhcC1nLWxvZy1hZGRycy5yc3QKKysrIGIvRG9jdW1lbnRhdGlvbi9tZWRpYS91YXBpL2NlYy9jZWMtaW9jLWFkYXAtZy1sb2ctYWRkcnMucnN0CkBAIC0xNDQsNyArMTQ0LDcgQEAKIAogICAgICAgIC0gIGBgZmxhZ3NgYAogCi0gICAgICAgLSAgRmxhZ3MuIE5vIGZsYWdzIGFyZSBkZWZpbmVkIHlldCwgc28gc2V0IHRoaXMgdG8gMC4KKyAgICAgICAtICBGbGFncy4gU2VlIDpyZWY6YGNlYy1sb2ctYWRkcnMtZmxhZ3NgIGZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIGZsYWdzLgogCiAgICAgLSAgLi4gcm93IDcKIApAQCAtMjAxLDYgKzIwMSwyNSBAQAogICAgICAgICAgIGdpdmUgdGhlIENFQyBmcmFtZXdvcmsgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlIHR5cGUsIGV2ZW4KICAgICAgICAgICB0aG91Z2ggdGhlIGZyYW1ld29yayB3b24ndCB1c2UgaXQgZGlyZWN0bHkgaW4gdGhlIENFQyBtZXNzYWdlLgogCisuLiBfY2VjLWxvZy1hZGRycy1mbGFnczoKKworLi4gZmxhdC10YWJsZTo6IEZsYWdzIGZvciBzdHJ1Y3QgY2VjX2xvZ19hZGRycworICAgIDpoZWFkZXItcm93czogIDAKKyAgICA6c3R1Yi1jb2x1bW5zOiAwCisgICAgOndpZHRoczogICAgICAgMyAxIDQKKworCisgICAgLSAgLi4gX2BDRUMtTE9HLUFERFJTLUZMLUFMTE9XLVVOUkVHLUZBTExCQUNLYDoKKworICAgICAgIC0gIGBgQ0VDX0xPR19BRERSU19GTF9BTExPV19VTlJFR19GQUxMQkFDS2BgCisKKyAgICAgICAtICAxCisKKyAgICAgICAtICBCeSBkZWZhdWx0IGlmIG5vIGxvZ2ljYWwgYWRkcmVzcyBvZiB0aGUgcmVxdWVzdGVkIHR5cGUgY2FuIGJlIGNsYWltZWQsIHRoZW4KKwkgIGl0IHdpbGwgZ28gYmFjayB0byB0aGUgdW5jb25maWd1cmVkIHN0YXRlLiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIGl0IHdpbGwKKwkgIGZhbGxiYWNrIHRvIHRoZSBVbnJlZ2lzdGVyZWQgbG9naWNhbCBhZGRyZXNzLiBOb3RlIHRoYXQgaWYgdGhlIFVucmVnaXN0ZXJlZAorCSAgbG9naWNhbCBhZGRyZXNzIHdhcyBleHBsaWNpdGx5IHJlcXVlc3RlZCwgdGhlbiB0aGlzIGZsYWcgaGFzIG5vIGVmZmVjdC4KKwogLi4gX2NlYy12ZXJzaW9uczoKIAogLi4gZmxhdC10YWJsZTo6IENFQyBWZXJzaW9ucwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tZWRpYS91YXBpL2NlYy9jZWMtaW9jLWRxZXZlbnQucnN0IGIvRG9jdW1lbnRhdGlvbi9tZWRpYS91YXBpL2NlYy9jZWMtaW9jLWRxZXZlbnQucnN0CmluZGV4IDdhNmQ2ZDAuLmY4Y2FhMjggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbWVkaWEvdWFwaS9jZWMvY2VjLWlvYy1kcWV2ZW50LnJzdAorKysgYi9Eb2N1bWVudGF0aW9uL21lZGlhL3VhcGkvY2VjL2NlYy1pb2MtZHFldmVudC5yc3QKQEAgLTE1LDcgKzE1LDggQEAKIFN5bm9wc2lzCiA9PT09PT09PQogCi0uLiBjcHA6ZnVuY3Rpb246OiBpbnQgaW9jdGwoIGludCBmZCwgaW50IHJlcXVlc3QsIHN0cnVjdCBjZWNfZXZlbnQgKmFyZ3AgKQorLi4gYzpmdW5jdGlvbjo6IGludCBpb2N0bCggaW50IGZkLCBpbnQgcmVxdWVzdCwgc3RydWN0IGNlY19ldmVudCAqYXJncCApCisgICA6bmFtZTogQ0VDX0RRRVZFTlQKIAogQXJndW1lbnRzCiA9PT09PT09PT0KQEAgLTM2LDcgKzM3LDcgQEAKICAgIGFuZCBpcyBjdXJyZW50bHkgb25seSBhdmFpbGFibGUgYXMgYSBzdGFnaW5nIGtlcm5lbCBtb2R1bGUuCiAKIENFQyBkZXZpY2VzIGNhbiBzZW5kIGFzeW5jaHJvbm91cyBldmVudHMuIFRoZXNlIGNhbiBiZSByZXRyaWV2ZWQgYnkKLWNhbGxpbmcgOnJlZjpgaW9jdGwgQ0VDX0RRRVZFTlQgPENFQ19EUUVWRU5UPmAuIElmIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgaW4KK2NhbGxpbmcgOmM6ZnVuYzpgQ0VDX0RRRVZFTlRgLiBJZiB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGluCiBub24tYmxvY2tpbmcgbW9kZSBhbmQgbm8gZXZlbnQgaXMgcGVuZGluZywgdGhlbiBpdCB3aWxsIHJldHVybiAtMSBhbmQKIHNldCBlcnJubyB0byB0aGUgYGBFQUdBSU5gYCBlcnJvciBjb2RlLgogCkBAIC02NCw3ICs2NSw4IEBACiAKICAgICAgICAtICBgYHBoeXNfYWRkcmBgCiAKLSAgICAgICAtICBUaGUgY3VycmVudCBwaHlzaWNhbCBhZGRyZXNzLgorICAgICAgIC0gIFRoZSBjdXJyZW50IHBoeXNpY2FsIGFkZHJlc3MuIFRoaXMgaXMgYGBDRUNfUEhZU19BRERSX0lOVkFMSURgYCBpZiBubworICAgICAgICAgIHZhbGlkIHBoeXNpY2FsIGFkZHJlc3MgaXMgc2V0LgogCiAgICAgLSAgLi4gcm93IDIKIApAQCAtNzIsNyArNzQsMTAgQEAKIAogICAgICAgIC0gIGBgbG9nX2FkZHJfbWFza2BgCiAKLSAgICAgICAtICBUaGUgY3VycmVudCBzZXQgb2YgY2xhaW1lZCBsb2dpY2FsIGFkZHJlc3Nlcy4KKyAgICAgICAtICBUaGUgY3VycmVudCBzZXQgb2YgY2xhaW1lZCBsb2dpY2FsIGFkZHJlc3Nlcy4gVGhpcyBpcyAwIGlmIG5vIGxvZ2ljYWwKKyAgICAgICAgICBhZGRyZXNzZXMgYXJlIGNsYWltZWQgb3IgaWYgYGBwaHlzX2FkZHJgYCBpcyBgYENFQ19QSFlTX0FERFJfSU5WQUxJRGBgLgorCSAgSWYgYml0IDE1IGlzIHNldCAoYGAxIDw8IENFQ19MT0dfQUREUl9VTlJFR0lTVEVSRURgYCkgdGhlbiB0aGlzIGRldmljZQorCSAgaGFzIHRoZSB1bnJlZ2lzdGVyZWQgbG9naWNhbCBhZGRyZXNzLiBJbiB0aGF0IGNhc2UgYWxsIG90aGVyIGJpdHMgYXJlIDAuCiAKIAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQgYi9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQKaW5kZXggYTRkMGE5OS4uYmE4MThlYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tZW1vcnktYmFycmllcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dApAQCAtNjA5LDcgKzYwOSw3IEBACiBUaGUgZGF0YS1kZXBlbmRlbmN5IGJhcnJpZXIgbXVzdCBvcmRlciB0aGUgcmVhZCBpbnRvIFEgd2l0aCB0aGUgc3RvcmUKIGludG8gKlEuICBUaGlzIHByb2hpYml0cyB0aGlzIG91dGNvbWU6CiAKLQkoUSA9PSBCKSAmJiAoQiA9PSA0KQorCShRID09ICZCKSAmJiAoQiA9PSA0KQogCiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgcGF0dGVybiBzaG91bGQgYmUgcmFyZS4gIEFmdGVyIGFsbCwgdGhlIHdob2xlIHBvaW50CiBvZiBkZXBlbmRlbmN5IG9yZGVyaW5nIGlzIHRvIC1wcmV2ZW50LSB3cml0ZXMgdG8gdGhlIGRhdGEgc3RydWN0dXJlLCBhbG9uZwpAQCAtMTkyOCw2ICsxOTI4LDcgQEAKIAogICAgICBTZWUgRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb25zaXN0ZW50IG1lbW9yeS4KIAorCiBNTUlPIFdSSVRFIEJBUlJJRVIKIC0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yMDc1LDcgKzIwNzYsNyBAQAogYW55dGhpbmcgYXQgYWxsIC0gZXNwZWNpYWxseSB3aXRoIHJlc3BlY3QgdG8gSS9PIGFjY2Vzc2VzIC0gdW5sZXNzIGNvbWJpbmVkCiB3aXRoIGludGVycnVwdCBkaXNhYmxpbmcgb3BlcmF0aW9ucy4KIAotU2VlIGFsc28gdGhlIHNlY3Rpb24gb24gIkludGVyLUNQVSBsb2NraW5nIGJhcnJpZXIgZWZmZWN0cyIuCitTZWUgYWxzbyB0aGUgc2VjdGlvbiBvbiAiSW50ZXItQ1BVIGFjcXVpcmluZyBiYXJyaWVyIGVmZmVjdHMiLgogCiAKIEFzIGFuIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmc6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvMDAtSU5ERVgKaW5kZXggNDE1MTU0YS4uYTc2OTc3ODMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvMDAtSU5ERVgKQEAgLTc0LDYgKzc0LDggQEAKIAktIFRoZSBETlMgcmVzb2x2ZXIgbW9kdWxlIGFsbG93cyBrZXJuZWwgc2VydmllcyB0byBtYWtlIEROUyBxdWVyaWVzLgogZHJpdmVyLnR4dAogCS0gU29mdG5ldCBkcml2ZXIgaXNzdWVzLgorZW5hLnR4dAorCS0gaW5mbyBvbiBBbWF6b24ncyBFbGFzdGljIE5ldHdvcmsgQWRhcHRlciAoRU5BKQogZTEwMC50eHQKIAktIGluZm8gb24gSW50ZWwncyBFdGhlckV4cHJlc3MgUFJPLzEwMCBsaW5lIG9mIDEwLzEwMCBib2FyZHMKIGUxMDAwLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JhdG1hbi1hZHYudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JhdG1hbi1hZHYudHh0CmluZGV4IDFiNWU3YTcuLjhhOGQzZDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9iYXRtYW4tYWR2LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYmF0bWFuLWFkdi50eHQKQEAgLTQzLDEwICs0MywxNSBAQAogcmVsb2FkIHRoZSBtb2R1bGUgaWYgeW91IHBsdWcgeW91ciBVU0Igd2lmaSBhZGFwdGVyIGludG8geW91ciBtYS0KIGNoaW5lIGFmdGVyIGJhdG1hbiBhZHZhbmNlZCB3YXMgaW5pdGlhbGx5IGxvYWRlZC4KIAotVG8gYWN0aXZhdGUgYSAgZ2l2ZW4gIGludGVyZmFjZSAgc2ltcGx5ICB3cml0ZSAgImJhdDAiICBpbnRvICBpdHMKLSJtZXNoX2lmYWNlIiBmaWxlIGluc2lkZSB0aGUgYmF0bWFuX2FkdiBzdWJmb2xkZXI6CitUaGUgYmF0bWFuLWFkdiBzb2Z0LWludGVyZmFjZSBjYW4gYmUgY3JlYXRlZCB1c2luZyAgdGhlICBpcHJvdXRlMgordG9vbCAiaXAiCiAKLSMgZWNobyBiYXQwID4gL3N5cy9jbGFzcy9uZXQvZXRoMC9iYXRtYW5fYWR2L21lc2hfaWZhY2UKKyMgaXAgbGluayBhZGQgbmFtZSBiYXQwIHR5cGUgYmF0YWR2CisKK1RvICBhY3RpdmF0ZSBhICBnaXZlbiAgaW50ZXJmYWNlICBzaW1wbHkgIGF0dGFjaCBpdCB0byB0aGUgImJhdDAiCitpbnRlcmZhY2UKKworIyBpcCBsaW5rIHNldCBkZXYgZXRoMCBtYXN0ZXIgYmF0MAogCiBSZXBlYXQgIHRoaXMgc3RlcCBmb3IgYWxsIGludGVyZmFjZXMgeW91IHdpc2ggdG8gYWRkLiAgTm93IGJhdG1hbgogc3RhcnRzIHVzaW5nL2Jyb2FkY2FzdGluZyBvbiB0aGlzL3RoZXNlIGludGVyZmFjZShzKS4KQEAgLTU2LDEwICs2MSwxMCBAQAogIyBjYXQgL3N5cy9jbGFzcy9uZXQvZXRoMC9iYXRtYW5fYWR2L2lmYWNlX3N0YXR1cwogIyBhY3RpdmUKIAotVG8gZGVhY3RpdmF0ZSBhbiBpbnRlcmZhY2UgeW91IGhhdmUgIHRvICB3cml0ZSAgIm5vbmUiICBpbnRvICBpdHMKLSJtZXNoX2lmYWNlIiBmaWxlOgorVG8gIGRlYWN0aXZhdGUgIGFuICBpbnRlcmZhY2UgIHlvdSAgaGF2ZSAgIHRvICBkZXRhY2ggaXQgZnJvbSB0aGUKKyJiYXQwIiBpbnRlcmZhY2U6CiAKLSMgZWNobyBub25lID4gL3N5cy9jbGFzcy9uZXQvZXRoMC9iYXRtYW5fYWR2L21lc2hfaWZhY2UKKyMgaXAgbGluayBzZXQgZGV2IGV0aDAgbm9tYXN0ZXIKIAogCiBBbGwgIG1lc2ggIHdpZGUgIHNldHRpbmdzICBjYW4gYmUgZm91bmQgaW4gYmF0bWFuJ3Mgb3duIGludGVyZmFjZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RzYS9kc2EudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RzYS9kc2EudHh0CmluZGV4IDlkMDVlZDcuLjZkNmMwN2MgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kc2EvZHNhLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZHNhL2RzYS50eHQKQEAgLTIyNyw5ICsyMjcsOSBAQAogCiBkc2Ffc3dpdGNoOiBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHN3aXRjaCBkZXZpY2UgaW4gdGhlIHRyZWUsIHJlZmVyZW5jaW5nIGEKIGRzYV9zd2l0Y2hfdHJlZSBhcyBhIGJhY2twb2ludGVyLCBzbGF2ZSBuZXR3b3JrIGRldmljZXMsIG1hc3RlciBuZXR3b3JrIGRldmljZSwKLWFuZCBhIHJlZmVyZW5jZSB0byB0aGUgYmFja2luZyBkc2Ffc3dpdGNoX2RyaXZlcgorYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBiYWNraW5nIGRzYV9zd2l0Y2hfb3BzCiAKLWRzYV9zd2l0Y2hfZHJpdmVyOiBzdHJ1Y3R1cmUgcmVmZXJlbmNpbmcgZnVuY3Rpb24gcG9pbnRlcnMsIHNlZSBiZWxvdyBmb3IgYSBmdWxsCitkc2Ffc3dpdGNoX29wczogc3RydWN0dXJlIHJlZmVyZW5jaW5nIGZ1bmN0aW9uIHBvaW50ZXJzLCBzZWUgYmVsb3cgZm9yIGEgZnVsbAogZGVzY3JpcHRpb24uCiAKIERlc2lnbiBsaW1pdGF0aW9ucwpAQCAtMzU3LDEwICszNTcsMTAgQEAKIERyaXZlciBkZXZlbG9wbWVudAogPT09PT09PT09PT09PT09PT09CiAKLURTQSBzd2l0Y2ggZHJpdmVycyBuZWVkIHRvIGltcGxlbWVudCBhIGRzYV9zd2l0Y2hfZHJpdmVyIHN0cnVjdHVyZSB3aGljaCB3aWxsCitEU0Egc3dpdGNoIGRyaXZlcnMgbmVlZCB0byBpbXBsZW1lbnQgYSBkc2Ffc3dpdGNoX29wcyBzdHJ1Y3R1cmUgd2hpY2ggd2lsbAogY29udGFpbiB0aGUgdmFyaW91cyBtZW1iZXJzIGRlc2NyaWJlZCBiZWxvdy4KIAotcmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigpIHJlZ2lzdGVycyB0aGlzIGRzYV9zd2l0Y2hfZHJpdmVyIGluIGl0cyBpbnRlcm5hbCBsaXN0CityZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKCkgcmVnaXN0ZXJzIHRoaXMgZHNhX3N3aXRjaF9vcHMgaW4gaXRzIGludGVybmFsIGxpc3QKIG9mIGRyaXZlcnMgdG8gcHJvYmUgZm9yLiB1bnJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoKSBkb2VzIHRoZSBleGFjdCBvcHBvc2l0ZS4KIAogVW5sZXNzIHJlcXVlc3RlZCBkaWZmZXJlbnRseSBieSBzZXR0aW5nIHRoZSBwcml2X3NpemUgbWVtYmVyIGFjY29yZGluZ2x5LCBEU0EKQEAgLTM3OSw3ICszNzksNyBAQAogICBidXNlcywgcmV0dXJuIGEgbm9uLU5VTEwgc3RyaW5nCiAKIC0gc2V0dXA6IHNldHVwIGZ1bmN0aW9uIGZvciB0aGUgc3dpdGNoLCB0aGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nCi0gIHVwIHRoZSBkc2Ffc3dpdGNoX2RyaXZlciBwcml2YXRlIHN0cnVjdHVyZSB3aXRoIGFsbCBpdCBuZWVkczogcmVnaXN0ZXIgbWFwcywKKyAgdXAgdGhlIGRzYV9zd2l0Y2hfb3BzIHByaXZhdGUgc3RydWN0dXJlIHdpdGggYWxsIGl0IG5lZWRzOiByZWdpc3RlciBtYXBzLAogICBpbnRlcnJ1cHRzLCBtdXRleGVzLCBsb2NrcyBldGMuLiBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gZXhwZWN0ZWQgdG8gcHJvcGVybHkKICAgY29uZmlndXJlIHRoZSBzd2l0Y2ggdG8gc2VwYXJhdGUgYWxsIG5ldHdvcmsgaW50ZXJmYWNlcyBmcm9tIGVhY2ggb3RoZXIsIHRoYXQKICAgaXMsIHRoZXkgc2hvdWxkIGJlIGlzb2xhdGVkIGJ5IHRoZSBzd2l0Y2ggaGFyZHdhcmUgaXRzZWxmLCB0eXBpY2FsbHkgYnkgY3JlYXRpbmcKQEAgLTU4NCwyOSArNTg0LDMyIEBACiAgIGZ1bmN0aW9uIHRoYXQgdGhlIGRyaXZlciBoYXMgdG8gY2FsbCBmb3IgZWFjaCBNQUMgYWRkcmVzcyBrbm93biB0byBiZSBiZWhpbmQKICAgdGhlIGdpdmVuIHBvcnQuIEEgc3dpdGNoZGV2IG9iamVjdCBpcyB1c2VkIHRvIGNhcnJ5IHRoZSBWSUQgYW5kIEZEQiBpbmZvLgogCistIHBvcnRfbWRiX3ByZXBhcmU6IGJyaWRnZSBsYXllciBmdW5jdGlvbiBpbnZva2VkIHdoZW4gdGhlIGJyaWRnZSBwcmVwYXJlcyB0aGUKKyAgaW5zdGFsbGF0aW9uIG9mIGEgbXVsdGljYXN0IGRhdGFiYXNlIGVudHJ5LiBJZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsCisgIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiAtRU9QTk9UU1VQUCB0byBpbmZvcm0gdGhlIGJyaWRnZSBjb2RlIHRvIGZhbGxiYWNrCisgIHRvIGEgc29mdHdhcmUgaW1wbGVtZW50YXRpb24uIE5vIGhhcmR3YXJlIHNldHVwIG11c3QgYmUgZG9uZSBpbiB0aGlzIGZ1bmN0aW9uLgorICBTZWUgcG9ydF9mZGJfYWRkIGZvciB0aGlzIGFuZCBkZXRhaWxzLgorCistIHBvcnRfbWRiX2FkZDogYnJpZGdlIGxheWVyIGZ1bmN0aW9uIGludm9rZWQgd2hlbiB0aGUgYnJpZGdlIHdhbnRzIHRvIGluc3RhbGwKKyAgYSBtdWx0aWNhc3QgZGF0YWJhc2UgZW50cnksIHRoZSBzd2l0Y2ggaGFyZHdhcmUgc2hvdWxkIGJlIHByb2dyYW1tZWQgd2l0aCB0aGUKKyAgc3BlY2lmaWVkIGFkZHJlc3MgaW4gdGhlIHNwZWNpZmllZCBWTEFOIElEIGluIHRoZSBmb3J3YXJkaW5nIGRhdGFiYXNlCisgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFZMQU4gSUQuCisKK05vdGU6IFZMQU4gSUQgMCBjb3JyZXNwb25kcyB0byB0aGUgcG9ydCBwcml2YXRlIGRhdGFiYXNlLCB3aGljaCwgaW4gdGhlIGNvbnRleHQKK29mIERTQSwgd291bGQgYmUgdGhlIGl0cyBwb3J0LWJhc2VkIFZMQU4sIHVzZWQgYnkgdGhlIGFzc29jaWF0ZWQgYnJpZGdlIGRldmljZS4KKworLSBwb3J0X21kYl9kZWw6IGJyaWRnZSBsYXllciBmdW5jdGlvbiBpbnZva2VkIHdoZW4gdGhlIGJyaWRnZSB3YW50cyB0byByZW1vdmUgYQorICBtdWx0aWNhc3QgZGF0YWJhc2UgZW50cnksIHRoZSBzd2l0Y2ggaGFyZHdhcmUgc2hvdWxkIGJlIHByb2dyYW1tZWQgdG8gZGVsZXRlCisgIHRoZSBzcGVjaWZpZWQgTUFDIGFkZHJlc3MgZnJvbSB0aGUgc3BlY2lmaWVkIFZMQU4gSUQgaWYgaXQgd2FzIG1hcHBlZCBpbnRvCisgIHRoaXMgcG9ydCBmb3J3YXJkaW5nIGRhdGFiYXNlLgorCistIHBvcnRfbWRiX2R1bXA6IGJyaWRnZSBsYXllciBmdW5jdGlvbiBpbnZva2VkIHdpdGggYSBzd2l0Y2hkZXYgY2FsbGJhY2sKKyAgZnVuY3Rpb24gdGhhdCB0aGUgZHJpdmVyIGhhcyB0byBjYWxsIGZvciBlYWNoIE1BQyBhZGRyZXNzIGtub3duIHRvIGJlIGJlaGluZAorICB0aGUgZ2l2ZW4gcG9ydC4gQSBzd2l0Y2hkZXYgb2JqZWN0IGlzIHVzZWQgdG8gY2FycnkgdGhlIFZJRCBhbmQgTURCIGluZm8uCisKIFRPRE8KID09PT0KIAotVGhlIHBsYXRmb3JtIGRldmljZSBwcm9ibGVtCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLURTQSBpcyBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXMgYSBwbGF0Zm9ybSBkZXZpY2UgZHJpdmVyIHdoaWNoIGlzIGZhciBmcm9tIGlkZWFsCi1hcyB3YXMgZGlzY3Vzc2VkIGluIHRoaXMgdGhyZWFkOgotCi1odHRwOi8vcGVybWFsaW5rLmdtYW5lLm9yZy9nbWFuZS5saW51eC5uZXR3b3JrLzMyOTg0OAotCi1UaGlzIGJhc2ljYWxseSBwcmV2ZW50cyB0aGUgZGV2aWNlIGRyaXZlciBtb2RlbCB0byBiZSBwcm9wZXJseSB1c2VkIGFuZCBhcHBsaWVkLAotYW5kIHN1cHBvcnQgbm9uLU1ESU8sIG5vbi1NTUlPIEV0aGVybmV0IGNvbm5lY3RlZCBzd2l0Y2hlcy4KLQotQW5vdGhlciBwcm9ibGVtIHdpdGggdGhlIHBsYXRmb3JtIGRldmljZSBkcml2ZXIgYXBwcm9hY2ggaXMgdGhhdCBpdCBwcmV2ZW50cyB0aGUKLXVzZSBvZiBhIG1vZHVsYXIgc3dpdGNoIGRyaXZlcnMgYnVpbGQgZHVlIHRvIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSwgaWxsdXN0cmF0ZWQKLWhlcmU6Ci0KLWh0dHA6Ly9jb21tZW50cy5nbWFuZS5vcmcvZ21hbmUubGludXgubmV0d29yay8zNDU4MDMKLQotQXR0ZW1wdHMgb2YgcmV3b3JraW5nIHRoaXMgaGFzIGJlZW4gZG9uZSBoZXJlOgotCi1odHRwczovL2x3bi5uZXQvQXJ0aWNsZXMvNjQzMTQ5LwotCiBNYWtpbmcgU1dJVENIREVWIGFuZCBEU0EgY29udmVyZ2UgdG93YXJkcyBhbiB1bmlmaWVkIGNvZGViYXNlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9lbmEudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2VuYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0YjZmNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9lbmEudHh0CkBAIC0wLDAgKzEsMzA1IEBACitMaW51eCBrZXJuZWwgZHJpdmVyIGZvciBFbGFzdGljIE5ldHdvcmsgQWRhcHRlciAoRU5BKSBmYW1pbHk6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK092ZXJ2aWV3OgorPT09PT09PT09CitFTkEgaXMgYSBuZXR3b3JraW5nIGludGVyZmFjZSBkZXNpZ25lZCB0byBtYWtlIGdvb2QgdXNlIG9mIG1vZGVybiBDUFUKK2ZlYXR1cmVzIGFuZCBzeXN0ZW0gYXJjaGl0ZWN0dXJlcy4KKworVGhlIEVOQSBkZXZpY2UgZXhwb3NlcyBhIGxpZ2h0d2VpZ2h0IG1hbmFnZW1lbnQgaW50ZXJmYWNlIHdpdGggYQorbWluaW1hbCBzZXQgb2YgbWVtb3J5IG1hcHBlZCByZWdpc3RlcnMgYW5kIGV4dGVuZGFibGUgY29tbWFuZCBzZXQKK3Rocm91Z2ggYW4gQWRtaW4gUXVldWUuCisKK1RoZSBkcml2ZXIgc3VwcG9ydHMgYSByYW5nZSBvZiBFTkEgZGV2aWNlcywgaXMgbGluay1zcGVlZCBpbmRlcGVuZGVudAorKGkuZS4sIHRoZSBzYW1lIGRyaXZlciBpcyB1c2VkIGZvciAxMEdiRSwgMjVHYkUsIDQwR2JFLCBldGMuKSwgYW5kIGhhcworYSBuZWdvdGlhdGVkIGFuZCBleHRlbmRhYmxlIGZlYXR1cmUgc2V0LgorCitTb21lIEVOQSBkZXZpY2VzIHN1cHBvcnQgU1ItSU9WLiBUaGlzIGRyaXZlciBpcyB1c2VkIGZvciBib3RoIHRoZQorU1ItSU9WIFBoeXNpY2FsIEZ1bmN0aW9uIChQRikgYW5kIFZpcnR1YWwgRnVuY3Rpb24gKFZGKSBkZXZpY2VzLgorCitFTkEgZGV2aWNlcyBlbmFibGUgaGlnaCBzcGVlZCBhbmQgbG93IG92ZXJoZWFkIG5ldHdvcmsgdHJhZmZpYworcHJvY2Vzc2luZyBieSBwcm92aWRpbmcgbXVsdGlwbGUgVHgvUnggcXVldWUgcGFpcnMgKHRoZSBtYXhpbXVtIG51bWJlcgoraXMgYWR2ZXJ0aXNlZCBieSB0aGUgZGV2aWNlIHZpYSB0aGUgQWRtaW4gUXVldWUpLCBhIGRlZGljYXRlZCBNU0ktWAoraW50ZXJydXB0IHZlY3RvciBwZXIgVHgvUnggcXVldWUgcGFpciwgYWRhcHRpdmUgaW50ZXJydXB0IG1vZGVyYXRpb24sCithbmQgQ1BVIGNhY2hlbGluZSBvcHRpbWl6ZWQgZGF0YSBwbGFjZW1lbnQuCisKK1RoZSBFTkEgZHJpdmVyIHN1cHBvcnRzIGluZHVzdHJ5IHN0YW5kYXJkIFRDUC9JUCBvZmZsb2FkIGZlYXR1cmVzIHN1Y2gKK2FzIGNoZWNrc3VtIG9mZmxvYWQgYW5kIFRDUCB0cmFuc21pdCBzZWdtZW50YXRpb24gb2ZmbG9hZCAoVFNPKS4KK1JlY2VpdmUtc2lkZSBzY2FsaW5nIChSU1MpIGlzIHN1cHBvcnRlZCBmb3IgbXVsdGktY29yZSBzY2FsaW5nLgorCitUaGUgRU5BIGRyaXZlciBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgZGV2aWNlcyBpbXBsZW1lbnQgaGVhbHRoCittb25pdG9yaW5nIG1lY2hhbmlzbXMgc3VjaCBhcyB3YXRjaGRvZywgZW5hYmxpbmcgdGhlIGRldmljZSBhbmQgZHJpdmVyCit0byByZWNvdmVyIGluIGEgbWFubmVyIHRyYW5zcGFyZW50IHRvIHRoZSBhcHBsaWNhdGlvbiwgYXMgd2VsbCBhcworZGVidWcgbG9ncy4KKworU29tZSBvZiB0aGUgRU5BIGRldmljZXMgc3VwcG9ydCBhIHdvcmtpbmcgbW9kZSBjYWxsZWQgTG93LWxhdGVuY3kKK1F1ZXVlIChMTFEpLCB3aGljaCBzYXZlcyBzZXZlcmFsIG1vcmUgbWljcm9zZWNvbmRzLgorCitTdXBwb3J0ZWQgUENJIHZlbmRvciBJRC9kZXZpY2UgSURzOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzFkMGY6MGVjMiAtIEVOQSBQRgorMWQwZjoxZWMyIC0gRU5BIFBGIHdpdGggTExRIHN1cHBvcnQKKzFkMGY6ZWMyMCAtIEVOQSBWRgorMWQwZjplYzIxIC0gRU5BIFZGIHdpdGggTExRIHN1cHBvcnQKKworRU5BIFNvdXJjZSBDb2RlIERpcmVjdG9yeSBTdHJ1Y3R1cmU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2VuYV9jb20uW2NoXSAgICAgIC0gTWFuYWdlbWVudCBjb21tdW5pY2F0aW9uIGxheWVyLiBUaGlzIGxheWVyIGlzCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNpYmxlIGZvciB0aGUgaGFuZGxpbmcgYWxsIHRoZSBtYW5hZ2VtZW50CisgICAgICAgICAgICAgICAgICAgIChhZG1pbikgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBkZXZpY2UgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICBkcml2ZXIuCitlbmFfZXRoX2NvbS5bY2hdICAtIFR4L1J4IGRhdGEgcGF0aC4KK2VuYV9hZG1pbl9kZWZzLmggIC0gRGVmaW5pdGlvbiBvZiBFTkEgbWFuYWdlbWVudCBpbnRlcmZhY2UuCitlbmFfZXRoX2lvX2RlZnMuaCAtIERlZmluaXRpb24gb2YgRU5BIGRhdGEgcGF0aCBpbnRlcmZhY2UuCitlbmFfY29tbW9uX2RlZnMuaCAtIENvbW1vbiBkZWZpbml0aW9ucyBmb3IgZW5hX2NvbSBsYXllci4KK2VuYV9yZWdzX2RlZnMuaCAgIC0gRGVmaW5pdGlvbiBvZiBFTkEgUENJIG1lbW9yeS1tYXBwZWQgKE1NSU8pIHJlZ2lzdGVycy4KK2VuYV9uZXRkZXYuW2NoXSAgIC0gTWFpbiBMaW51eCBrZXJuZWwgZHJpdmVyLgorZW5hX3N5ZnNmcy5bY2hdICAgLSBTeXNmcyBmaWxlcy4KK2VuYV9ldGh0b29sLmMgICAgIC0gZXRodG9vbCBjYWxsYmFja3MuCitlbmFfcGNpX2lkX3RibC5oICAtIFN1cHBvcnRlZCBkZXZpY2UgSURzLgorCitNYW5hZ2VtZW50IEludGVyZmFjZToKKz09PT09PT09PT09PT09PT09PT09PQorRU5BIG1hbmFnZW1lbnQgaW50ZXJmYWNlIGlzIGV4cG9zZWQgYnkgbWVhbnMgb2Y6CistIFBDSWUgQ29uZmlndXJhdGlvbiBTcGFjZQorLSBEZXZpY2UgUmVnaXN0ZXJzCistIEFkbWluIFF1ZXVlIChBUSkgYW5kIEFkbWluIENvbXBsZXRpb24gUXVldWUgKEFDUSkKKy0gQXN5bmNocm9ub3VzIEV2ZW50IE5vdGlmaWNhdGlvbiBRdWV1ZSAoQUVOUSkKKworRU5BIGRldmljZSBNTUlPIFJlZ2lzdGVycyBhcmUgYWNjZXNzZWQgb25seSBkdXJpbmcgZHJpdmVyCitpbml0aWFsaXphdGlvbiBhbmQgYXJlIG5vdCBpbnZvbHZlZCBpbiBmdXJ0aGVyIG5vcm1hbCBkZXZpY2UKK29wZXJhdGlvbi4KKworQVEgaXMgdXNlZCBmb3Igc3VibWl0dGluZyBtYW5hZ2VtZW50IGNvbW1hbmRzLCBhbmQgdGhlCityZXN1bHRzL3Jlc3BvbnNlcyBhcmUgcmVwb3J0ZWQgYXN5bmNocm9ub3VzbHkgdGhyb3VnaCBBQ1EuCisKK0VOQSBpbnRyb2R1Y2VzIGEgdmVyeSBzbWFsbCBzZXQgb2YgbWFuYWdlbWVudCBjb21tYW5kcyB3aXRoIHJvb20gZm9yCit2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucy4gTW9zdCBvZiB0aGUgbWFuYWdlbWVudCBvcGVyYXRpb25zIGFyZQorZnJhbWVkIGluIGEgZ2VuZXJpYyBHZXQvU2V0IGZlYXR1cmUgY29tbWFuZC4KKworVGhlIGZvbGxvd2luZyBhZG1pbiBxdWV1ZSBjb21tYW5kcyBhcmUgc3VwcG9ydGVkOgorLSBDcmVhdGUgSS9PIHN1Ym1pc3Npb24gcXVldWUKKy0gQ3JlYXRlIEkvTyBjb21wbGV0aW9uIHF1ZXVlCistIERlc3Ryb3kgSS9PIHN1Ym1pc3Npb24gcXVldWUKKy0gRGVzdHJveSBJL08gY29tcGxldGlvbiBxdWV1ZQorLSBHZXQgZmVhdHVyZQorLSBTZXQgZmVhdHVyZQorLSBDb25maWd1cmUgQUVOUQorLSBHZXQgc3RhdGlzdGljcworCitSZWZlciB0byBlbmFfYWRtaW5fZGVmcy5oIGZvciB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgR2V0L1NldCBGZWF0dXJlCitwcm9wZXJ0aWVzLgorCitUaGUgQXN5bmNocm9ub3VzIEV2ZW50IE5vdGlmaWNhdGlvbiBRdWV1ZSAoQUVOUSkgaXMgYSB1bmktZGlyZWN0aW9uYWwKK3F1ZXVlIHVzZWQgYnkgdGhlIEVOQSBkZXZpY2UgdG8gc2VuZCB0byB0aGUgZHJpdmVyIGV2ZW50cyB0aGF0IGNhbm5vdAorYmUgcmVwb3J0ZWQgdXNpbmcgQUNRLiBBRU5RIGV2ZW50cyBhcmUgc3ViZGl2aWRlZCBpbnRvIGdyb3Vwcy4gRWFjaAorZ3JvdXAgbWF5IGhhdmUgbXVsdGlwbGUgc3luZHJvbWVzLCBhcyBzaG93biBiZWxvdworCitUaGUgZXZlbnRzIGFyZToKKwlHcm91cAkJCVN5bmRyb21lCisJTGluayBzdGF0ZSBjaGFuZ2UJLSBYIC0KKwlGYXRhbCBlcnJvcgkJLSBYIC0KKwlOb3RpZmljYXRpb24JCVN1c3BlbmQgdHJhZmZpYworCU5vdGlmaWNhdGlvbgkJUmVzdW1lIHRyYWZmaWMKKwlLZWVwLUFsaXZlCQktIFggLQorCitBQ1EgYW5kIEFFTlEgc2hhcmUgdGhlIHNhbWUgTVNJLVggdmVjdG9yLgorCitLZWVwLUFsaXZlIGlzIGEgc3BlY2lhbCBtZWNoYW5pc20gdGhhdCBhbGxvd3MgbW9uaXRvcmluZyBvZiB0aGUKK2RldmljZSdzIGhlYWx0aC4gVGhlIGRyaXZlciBtYWludGFpbnMgYSB3YXRjaGRvZyAoV0QpIGhhbmRsZXIgd2hpY2gsCitpZiBmaXJlZCwgbG9ncyB0aGUgY3VycmVudCBzdGF0ZSBhbmQgc3RhdGlzdGljcyB0aGVuIHJlc2V0cyBhbmQKK3Jlc3RhcnRzIHRoZSBFTkEgZGV2aWNlIGFuZCBkcml2ZXIuIEEgS2VlcC1BbGl2ZSBldmVudCBpcyBkZWxpdmVyZWQgYnkKK3RoZSBkZXZpY2UgZXZlcnkgc2Vjb25kLiBUaGUgZHJpdmVyIHJlLWFybXMgdGhlIFdEIHVwb24gcmVjZXB0aW9uIG9mIGEKK0tlZXAtQWxpdmUgZXZlbnQuIEEgbWlzc2VkIEtlZXAtQWxpdmUgZXZlbnQgY2F1c2VzIHRoZSBXRCBoYW5kbGVyIHRvCitmaXJlLgorCitEYXRhIFBhdGggSW50ZXJmYWNlOgorPT09PT09PT09PT09PT09PT09PT0KK0kvTyBvcGVyYXRpb25zIGFyZSBiYXNlZCBvbiBUeCBhbmQgUnggU3VibWlzc2lvbiBRdWV1ZXMgKFR4IFNRIGFuZCBSeAorU1EgY29ycmVzcG9uZGluZ2x5KS4gRWFjaCBTUSBoYXMgYSBjb21wbGV0aW9uIHF1ZXVlIChDUSkgYXNzb2NpYXRlZAord2l0aCBpdC4KKworVGhlIFNRcyBhbmQgQ1FzIGFyZSBpbXBsZW1lbnRlZCBhcyBkZXNjcmlwdG9yIHJpbmdzIGluIGNvbnRpZ3VvdXMKK3BoeXNpY2FsIG1lbW9yeS4KKworVGhlIEVOQSBkcml2ZXIgc3VwcG9ydHMgdHdvIFF1ZXVlIE9wZXJhdGlvbiBtb2RlcyBmb3IgVHggU1FzOgorLSBSZWd1bGFyIG1vZGUKKyAgKiBJbiB0aGlzIG1vZGUgdGhlIFR4IFNRcyByZXNpZGUgaW4gdGhlIGhvc3QncyBtZW1vcnkuIFRoZSBFTkEKKyAgICBkZXZpY2UgZmV0Y2hlcyB0aGUgRU5BIFR4IGRlc2NyaXB0b3JzIGFuZCBwYWNrZXQgZGF0YSBmcm9tIGhvc3QKKyAgICBtZW1vcnkuCistIExvdyBMYXRlbmN5IFF1ZXVlIChMTFEpIG1vZGUgb3IgInB1c2gtbW9kZSIuCisgICogSW4gdGhpcyBtb2RlIHRoZSBkcml2ZXIgcHVzaGVzIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9ycyBhbmQgdGhlCisgICAgZmlyc3QgMTI4IGJ5dGVzIG9mIHRoZSBwYWNrZXQgZGlyZWN0bHkgdG8gdGhlIEVOQSBkZXZpY2UgbWVtb3J5CisgICAgc3BhY2UuIFRoZSByZXN0IG9mIHRoZSBwYWNrZXQgcGF5bG9hZCBpcyBmZXRjaGVkIGJ5IHRoZQorICAgIGRldmljZS4gRm9yIHRoaXMgb3BlcmF0aW9uIG1vZGUsIHRoZSBkcml2ZXIgdXNlcyBhIGRlZGljYXRlZCBQQ0kKKyAgICBkZXZpY2UgbWVtb3J5IEJBUiwgd2hpY2ggaXMgbWFwcGVkIHdpdGggd3JpdGUtY29tYmluZSBjYXBhYmlsaXR5LgorCitUaGUgUnggU1FzIHN1cHBvcnQgb25seSB0aGUgcmVndWxhciBtb2RlLgorCitOb3RlOiBOb3QgYWxsIEVOQSBkZXZpY2VzIHN1cHBvcnQgTExRLCBhbmQgdGhpcyBmZWF0dXJlIGlzIG5lZ290aWF0ZWQKKyAgICAgIHdpdGggdGhlIGRldmljZSB1cG9uIGluaXRpYWxpemF0aW9uLiBJZiB0aGUgRU5BIGRldmljZSBkb2VzIG5vdAorICAgICAgc3VwcG9ydCBMTFEgbW9kZSwgdGhlIGRyaXZlciBmYWxscyBiYWNrIHRvIHRoZSByZWd1bGFyIG1vZGUuCisKK1RoZSBkcml2ZXIgc3VwcG9ydHMgbXVsdGktcXVldWUgZm9yIGJvdGggVHggYW5kIFJ4LiBUaGlzIGhhcyB2YXJpb3VzCitiZW5lZml0czoKKy0gUmVkdWNlZCBDUFUvdGhyZWFkL3Byb2Nlc3MgY29udGVudGlvbiBvbiBhIGdpdmVuIEV0aGVybmV0IGludGVyZmFjZS4KKy0gQ2FjaGUgbWlzcyByYXRlIG9uIGNvbXBsZXRpb24gaXMgcmVkdWNlZCwgcGFydGljdWxhcmx5IGZvciBkYXRhCisgIGNhY2hlIGxpbmVzIHRoYXQgaG9sZCB0aGUgc2tfYnVmZiBzdHJ1Y3R1cmVzLgorLSBJbmNyZWFzZWQgcHJvY2Vzcy1sZXZlbCBwYXJhbGxlbGlzbSB3aGVuIGhhbmRsaW5nIHJlY2VpdmVkIHBhY2tldHMuCistIEluY3JlYXNlZCBkYXRhIGNhY2hlIGhpdCByYXRlLCBieSBzdGVlcmluZyBrZXJuZWwgcHJvY2Vzc2luZyBvZgorICBwYWNrZXRzIHRvIHRoZSBDUFUsIHdoZXJlIHRoZSBhcHBsaWNhdGlvbiB0aHJlYWQgY29uc3VtaW5nIHRoZQorICBwYWNrZXQgaXMgcnVubmluZy4KKy0gSW4gaGFyZHdhcmUgaW50ZXJydXB0IHJlLWRpcmVjdGlvbi4KKworSW50ZXJydXB0IE1vZGVzOgorPT09PT09PT09PT09PT09PQorVGhlIGRyaXZlciBhc3NpZ25zIGEgc2luZ2xlIE1TSS1YIHZlY3RvciBwZXIgcXVldWUgcGFpciAoZm9yIGJvdGggVHgKK2FuZCBSeCBkaXJlY3Rpb25zKS4gVGhlIGRyaXZlciBhc3NpZ25zIGFuIGFkZGl0aW9uYWwgZGVkaWNhdGVkIE1TSS1YIHZlY3RvcgorZm9yIG1hbmFnZW1lbnQgKGZvciBBQ1EgYW5kIEFFTlEpLgorCitNYW5hZ2VtZW50IGludGVycnVwdCByZWdpc3RyYXRpb24gaXMgcGVyZm9ybWVkIHdoZW4gdGhlIExpbnV4IGtlcm5lbAorcHJvYmVzIHRoZSBhZGFwdGVyLCBhbmQgaXQgaXMgZGUtcmVnaXN0ZXJlZCB3aGVuIHRoZSBhZGFwdGVyIGlzCityZW1vdmVkLiBJL08gcXVldWUgaW50ZXJydXB0IHJlZ2lzdHJhdGlvbiBpcyBwZXJmb3JtZWQgd2hlbiB0aGUgTGludXgKK2ludGVyZmFjZSBvZiB0aGUgYWRhcHRlciBpcyBvcGVuZWQsIGFuZCBpdCBpcyBkZS1yZWdpc3RlcmVkIHdoZW4gdGhlCitpbnRlcmZhY2UgaXMgY2xvc2VkLgorCitUaGUgbWFuYWdlbWVudCBpbnRlcnJ1cHQgaXMgbmFtZWQ6CisgICBlbmEtbWdtbnRAcGNpOjxQQ0kgZG9tYWluOmJ1czpzbG90LmZ1bmN0aW9uPgorYW5kIGZvciBlYWNoIHF1ZXVlIHBhaXIsIGFuIGludGVycnVwdCBpcyBuYW1lZDoKKyAgIDxpbnRlcmZhY2UgbmFtZT4tVHgtUngtPHF1ZXVlIGluZGV4PgorCitUaGUgRU5BIGRldmljZSBvcGVyYXRlcyBpbiBhdXRvLW1hc2sgYW5kIGF1dG8tY2xlYXIgaW50ZXJydXB0Cittb2Rlcy4gVGhhdCBpcywgb25jZSBNU0ktWCBpcyBkZWxpdmVyZWQgdG8gdGhlIGhvc3QsIGl0cyBDYXVzZSBiaXQgaXMKK2F1dG9tYXRpY2FsbHkgY2xlYXJlZCBhbmQgdGhlIGludGVycnVwdCBpcyBtYXNrZWQuIFRoZSBpbnRlcnJ1cHQgaXMKK3VubWFza2VkIGJ5IHRoZSBkcml2ZXIgYWZ0ZXIgTkFQSSBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlLgorCitJbnRlcnJ1cHQgTW9kZXJhdGlvbjoKKz09PT09PT09PT09PT09PT09PT09PQorRU5BIGRyaXZlciBhbmQgZGV2aWNlIGNhbiBvcGVyYXRlIGluIGNvbnZlbnRpb25hbCBvciBhZGFwdGl2ZSBpbnRlcnJ1cHQKK21vZGVyYXRpb24gbW9kZS4KKworSW4gY29udmVudGlvbmFsIG1vZGUgdGhlIGRyaXZlciBpbnN0cnVjdHMgZGV2aWNlIHRvIHBvc3Rwb25lIGludGVycnVwdAorcG9zdGluZyBhY2NvcmRpbmcgdG8gc3RhdGljIGludGVycnVwdCBkZWxheSB2YWx1ZS4gVGhlIGludGVycnVwdCBkZWxheQordmFsdWUgY2FuIGJlIGNvbmZpZ3VyZWQgdGhyb3VnaCBldGh0b29sKDgpLiBUaGUgZm9sbG93aW5nIGV0aHRvb2wKK3BhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyOiB0eC11c2VjcywgcngtdXNlY3MKKworSW4gYWRhcHRpdmUgaW50ZXJydXB0IG1vZGVyYXRpb24gbW9kZSB0aGUgaW50ZXJydXB0IGRlbGF5IHZhbHVlIGlzCit1cGRhdGVkIGJ5IHRoZSBkcml2ZXIgZHluYW1pY2FsbHkgYW5kIGFkanVzdGVkIGV2ZXJ5IE5BUEkgY3ljbGUKK2FjY29yZGluZyB0byB0aGUgdHJhZmZpYyBuYXR1cmUuCisKK0J5IGRlZmF1bHQgRU5BIGRyaXZlciBhcHBsaWVzIGFkYXB0aXZlIGNvYWxlc2Npbmcgb24gUnggdHJhZmZpYyBhbmQKK2NvbnZlbnRpb25hbCBjb2FsZXNjaW5nIG9uIFR4IHRyYWZmaWMuCisKK0FkYXB0aXZlIGNvYWxlc2NpbmcgY2FuIGJlIHN3aXRjaGVkIG9uL29mZiB0aHJvdWdoIGV0aHRvb2woOCkKK2FkYXB0aXZlX3J4IG9ufG9mZiBwYXJhbWV0ZXIuCisKK1RoZSBkcml2ZXIgY2hvb3NlcyBpbnRlcnJ1cHQgZGVsYXkgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2YKK2J5dGVzIGFuZCBwYWNrZXRzIHJlY2VpdmVkIGJldHdlZW4gaW50ZXJydXB0IHVubWFza2luZyBhbmQgaW50ZXJydXB0Citwb3N0aW5nLiBUaGUgZHJpdmVyIHVzZXMgaW50ZXJydXB0IGRlbGF5IHRhYmxlIHRoYXQgc3ViZGl2aWRlcyB0aGUKK3JhbmdlIG9mIHJlY2VpdmVkIGJ5dGVzL3BhY2tldHMgaW50byA1IGxldmVscyBhbmQgYXNzaWducyBpbnRlcnJ1cHQKK2RlbGF5IHZhbHVlIHRvIGVhY2ggbGV2ZWwuCisKK1RoZSB1c2VyIGNhbiBlbmFibGUvZGlzYWJsZSBhZGFwdGl2ZSBtb2RlcmF0aW9uLCBtb2RpZnkgdGhlIGludGVycnVwdAorZGVsYXkgdGFibGUgYW5kIHJlc3RvcmUgaXRzIGRlZmF1bHQgdmFsdWVzIHRocm91Z2ggc3lzZnMuCisKK1RoZSByeF9jb3B5YnJlYWsgaXMgaW5pdGlhbGl6ZWQgYnkgZGVmYXVsdCB0byBFTkFfREVGQVVMVF9SWF9DT1BZQlJFQUsKK2FuZCBjYW4gYmUgY29uZmlndXJlZCBieSB0aGUgRVRIVE9PTF9TVFVOQUJMRSBjb21tYW5kIG9mIHRoZQorU0lPQ0VUSFRPT0wgaW9jdGwuCisKK1NLQjoKK1RoZSBkcml2ZXItYWxsb2NhdGVkIFNLQiBmb3IgZnJhbWVzIHJlY2VpdmVkIGZyb20gUnggaGFuZGxpbmcgdXNpbmcKK05BUEkgY29udGV4dC4gVGhlIGFsbG9jYXRpb24gbWV0aG9kIGRlcGVuZHMgb24gdGhlIHNpemUgb2YgdGhlIHBhY2tldC4KK0lmIHRoZSBmcmFtZSBsZW5ndGggaXMgbGFyZ2VyIHRoYW4gcnhfY29weWJyZWFrLCBuYXBpX2dldF9mcmFncygpCitpcyB1c2VkLCBvdGhlcndpc2UgbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbigpIGlzIHVzZWQsIHRoZSBidWZmZXIKK2NvbnRlbnQgaXMgY29waWVkIChieSBDUFUpIHRvIHRoZSBTS0IsIGFuZCB0aGUgYnVmZmVyIGlzIHJlY3ljbGVkLgorCitTdGF0aXN0aWNzOgorPT09PT09PT09PT0KK1RoZSB1c2VyIGNhbiBvYnRhaW4gRU5BIGRldmljZSBhbmQgZHJpdmVyIHN0YXRpc3RpY3MgdXNpbmcgZXRodG9vbC4KK1RoZSBkcml2ZXIgY2FuIGNvbGxlY3QgcmVndWxhciBvciBleHRlbmRlZCBzdGF0aXN0aWNzIChpbmNsdWRpbmcKK3Blci1xdWV1ZSBzdGF0cykgZnJvbSB0aGUgZGV2aWNlLgorCitJbiBhZGRpdGlvbiB0aGUgZHJpdmVyIGxvZ3MgdGhlIHN0YXRzIHRvIHN5c2xvZyB1cG9uIGRldmljZSByZXNldC4KKworTVRVOgorPT09PQorVGhlIGRyaXZlciBzdXBwb3J0cyBhbiBhcmJpdHJhcmlseSBsYXJnZSBNVFUgd2l0aCBhIG1heGltdW0gdGhhdCBpcworbmVnb3RpYXRlZCB3aXRoIHRoZSBkZXZpY2UuIFRoZSBkcml2ZXIgY29uZmlndXJlcyBNVFUgdXNpbmcgdGhlCitTZXRGZWF0dXJlIGNvbW1hbmQgKEVOQV9BRE1JTl9NVFUgcHJvcGVydHkpLiBUaGUgdXNlciBjYW4gY2hhbmdlIE1UVQordmlhIGlwKDgpIGFuZCBzaW1pbGFyIGxlZ2FjeSB0b29scy4KKworU3RhdGVsZXNzIE9mZmxvYWRzOgorPT09PT09PT09PT09PT09PT09PQorVGhlIEVOQSBkcml2ZXIgc3VwcG9ydHM6CistIFRTTyBvdmVyIElQdjQvSVB2NgorLSBUU08gd2l0aCBFQ04KKy0gSVB2NCBoZWFkZXIgY2hlY2tzdW0gb2ZmbG9hZAorLSBUQ1AvVURQIG92ZXIgSVB2NC9JUHY2IGNoZWNrc3VtIG9mZmxvYWRzCisKK1JTUzoKKz09PT0KKy0gVGhlIEVOQSBkZXZpY2Ugc3VwcG9ydHMgUlNTIHRoYXQgYWxsb3dzIGZsZXhpYmxlIFJ4IHRyYWZmaWMKKyAgc3RlZXJpbmcuCistIFRvZXBsaXR6IGFuZCBDUkMzMiBoYXNoIGZ1bmN0aW9ucyBhcmUgc3VwcG9ydGVkLgorLSBEaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIEwyL0wzL0w0IGZpZWxkcyBjYW4gYmUgY29uZmlndXJlZCBhcworICBpbnB1dHMgZm9yIGhhc2ggZnVuY3Rpb25zLgorLSBUaGUgZHJpdmVyIGNvbmZpZ3VyZXMgUlNTIHNldHRpbmdzIHVzaW5nIHRoZSBBUSBTZXRGZWF0dXJlIGNvbW1hbmQKKyAgKEVOQV9BRE1JTl9SU1NfSEFTSF9GVU5DVElPTiwgRU5BX0FETUlOX1JTU19IQVNIX0lOUFVUIGFuZAorICBFTkFfQURNSU5fUlNTX1JFRElSRUNUSU9OX1RBQkxFX0NPTkZJRyBwcm9wZXJ0aWVzKS4KKy0gSWYgdGhlIE5FVElGX0ZfUlhIQVNIIGZsYWcgaXMgc2V0LCB0aGUgMzItYml0IHJlc3VsdCBvZiB0aGUgaGFzaAorICBmdW5jdGlvbiBkZWxpdmVyZWQgaW4gdGhlIFJ4IENRIGRlc2NyaXB0b3IgaXMgc2V0IGluIHRoZSByZWNlaXZlZAorICBTS0IuCistIFRoZSB1c2VyIGNhbiBwcm92aWRlIGEgaGFzaCBrZXksIGhhc2ggZnVuY3Rpb24sIGFuZCBjb25maWd1cmUgdGhlCisgIGluZGlyZWN0aW9uIHRhYmxlIHRocm91Z2ggZXRodG9vbCg4KS4KKworREFUQSBQQVRIOgorPT09PT09PT09PQorVHg6CistLS0KK2VuZF9zdGFydF94bWl0KCkgaXMgY2FsbGVkIGJ5IHRoZSBzdGFjay4gVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBmb2xsb3dpbmc6CistIE1hcHMgZGF0YSBidWZmZXJzIChza2ItPmRhdGEgYW5kIGZyYWdzKS4KKy0gUG9wdWxhdGVzIGVuYV9idWYgZm9yIHRoZSBwdXNoIGJ1ZmZlciAoaWYgdGhlIGRyaXZlciBhbmQgZGV2aWNlIGFyZQorICBpbiBwdXNoIG1vZGUuKQorLSBQcmVwYXJlcyBFTkEgYnVmcyBmb3IgdGhlIHJlbWFpbmluZyBmcmFncy4KKy0gQWxsb2NhdGVzIGEgbmV3IHJlcXVlc3QgSUQgZnJvbSB0aGUgZW1wdHkgcmVxX2lkIHJpbmcuIFRoZSByZXF1ZXN0CisgIElEIGlzIHRoZSBpbmRleCBvZiB0aGUgcGFja2V0IGluIHRoZSBUeCBpbmZvLiBUaGlzIGlzIHVzZWQgZm9yCisgIG91dC1vZi1vcmRlciBUWCBjb21wbGV0aW9ucy4KKy0gQWRkcyB0aGUgcGFja2V0IHRvIHRoZSBwcm9wZXIgcGxhY2UgaW4gdGhlIFR4IHJpbmcuCistIENhbGxzIGVuYV9jb21fcHJlcGFyZV90eCgpLCBhbiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciB0aGF0IGNvbnZlcnRzCisgIHRoZSBlbmFfYnVmcyB0byBFTkEgZGVzY3JpcHRvcnMgKGFuZCBhZGRzIG1ldGEgRU5BIGRlc2NyaXB0b3JzIGFzCisgIG5lZWRlZC4pCisgICogVGhpcyBmdW5jdGlvbiBhbHNvIGNvcGllcyB0aGUgRU5BIGRlc2NyaXB0b3JzIGFuZCB0aGUgcHVzaCBidWZmZXIKKyAgICB0byB0aGUgRGV2aWNlIG1lbW9yeSBzcGFjZSAoaWYgaW4gcHVzaCBtb2RlLikKKy0gV3JpdGVzIGRvb3JiZWxsIHRvIHRoZSBFTkEgZGV2aWNlLgorLSBXaGVuIHRoZSBFTkEgZGV2aWNlIGZpbmlzaGVzIHNlbmRpbmcgdGhlIHBhY2tldCwgYSBjb21wbGV0aW9uCisgIGludGVycnVwdCBpcyByYWlzZWQuCistIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBzY2hlZHVsZXMgTkFQSS4KKy0gVGhlIGVuYV9jbGVhbl90eF9pcnEoKSBmdW5jdGlvbiBpcyBjYWxsZWQuIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUKKyAgY29tcGxldGlvbiBkZXNjcmlwdG9ycyBnZW5lcmF0ZWQgYnkgdGhlIEVOQSwgd2l0aCBhIHNpbmdsZQorICBjb21wbGV0aW9uIGRlc2NyaXB0b3IgcGVyIGNvbXBsZXRlZCBwYWNrZXQuCisgICogcmVxX2lkIGlzIHJldHJpZXZlZCBmcm9tIHRoZSBjb21wbGV0aW9uIGRlc2NyaXB0b3IuIFRoZSB0eF9pbmZvIG9mCisgICAgdGhlIHBhY2tldCBpcyByZXRyaWV2ZWQgdmlhIHRoZSByZXFfaWQuIFRoZSBkYXRhIGJ1ZmZlcnMgYXJlCisgICAgdW5tYXBwZWQgYW5kIHJlcV9pZCBpcyByZXR1cm5lZCB0byB0aGUgZW1wdHkgcmVxX2lkIHJpbmcuCisgICogVGhlIGZ1bmN0aW9uIHN0b3BzIHdoZW4gdGhlIGNvbXBsZXRpb24gZGVzY3JpcHRvcnMgYXJlIGNvbXBsZXRlZCBvcgorICAgIHRoZSBidWRnZXQgaXMgcmVhY2hlZC4KKworUng6CistLS0KKy0gV2hlbiBhIHBhY2tldCBpcyByZWNlaXZlZCBmcm9tIHRoZSBFTkEgZGV2aWNlLgorLSBUaGUgaW50ZXJydXB0IGhhbmRsZXIgc2NoZWR1bGVzIE5BUEkuCistIFRoZSBlbmFfY2xlYW5fcnhfaXJxKCkgZnVuY3Rpb24gaXMgY2FsbGVkLiBUaGlzIGZ1bmN0aW9uIGNhbGxzCisgIGVuYV9yeF9wa3QoKSwgYW4gRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgZnVuY3Rpb24sIHdoaWNoIHJldHVybnMgdGhlCisgIG51bWJlciBvZiBkZXNjcmlwdG9ycyB1c2VkIGZvciBhIG5ldyB1bmhhbmRsZWQgcGFja2V0LCBhbmQgemVybyBpZgorICBubyBuZXcgcGFja2V0IGlzIGZvdW5kLgorLSBUaGVuIGl0IGNhbGxzIHRoZSBlbmFfY2xlYW5fcnhfaXJxKCkgZnVuY3Rpb24uCistIGVuYV9ldGhfcnhfc2tiKCkgY2hlY2tzIHBhY2tldCBsZW5ndGg6CisgICogSWYgdGhlIHBhY2tldCBpcyBzbWFsbCAobGVuIDwgcnhfY29weWJyZWFrKSwgdGhlIGRyaXZlciBhbGxvY2F0ZXMKKyAgICBhIFNLQiBmb3IgdGhlIG5ldyBwYWNrZXQsIGFuZCBjb3BpZXMgdGhlIHBhY2tldCBwYXlsb2FkIGludG8gdGhlCisgICAgU0tCIGRhdGEgYnVmZmVyLgorICAgIC0gSW4gdGhpcyB3YXkgdGhlIG9yaWdpbmFsIGRhdGEgYnVmZmVyIGlzIG5vdCBwYXNzZWQgdG8gdGhlIHN0YWNrCisgICAgICBhbmQgaXMgcmV1c2VkIGZvciBmdXR1cmUgUnggcGFja2V0cy4KKyAgKiBPdGhlcndpc2UgdGhlIGZ1bmN0aW9uIHVubWFwcyB0aGUgUnggYnVmZmVyLCB0aGVuIGFsbG9jYXRlcyB0aGUKKyAgICBuZXcgU0tCIHN0cnVjdHVyZSBhbmQgaG9va3MgdGhlIFJ4IGJ1ZmZlciB0byB0aGUgU0tCIGZyYWdzLgorLSBUaGUgbmV3IFNLQiBpcyB1cGRhdGVkIHdpdGggdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiAocHJvdG9jb2wsCisgIGNoZWNrc3VtIGh3IHZlcmlmeSByZXN1bHQsIGV0Yy4pLCBhbmQgdGhlbiBwYXNzZWQgdG8gdGhlIG5ldHdvcmsKKyAgc3RhY2ssIHVzaW5nIHRoZSBOQVBJIGludGVyZmFjZSBmdW5jdGlvbiBuYXBpX2dyb19yZWNlaXZlKCkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CmluZGV4IDlhZTkyOTMuLjNkYjhjNjcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CkBAIC01NzUsMzIgKzU3NSwzMyBAQAogCXVuY29uZGl0aW9uYWxseSBnZW5lcmF0aW9uIG9mIHN5bmNvb2tpZXMuCiAKIHRjcF9mYXN0b3BlbiAtIElOVEVHRVIKLQlFbmFibGUgVENQIEZhc3QgT3BlbiBmZWF0dXJlIChkcmFmdC1pZXRmLXRjcG0tZmFzdG9wZW4pIHRvIHNlbmQgZGF0YQotCWluIHRoZSBvcGVuaW5nIFNZTiBwYWNrZXQuIFRvIHVzZSB0aGlzIGZlYXR1cmUsIHRoZSBjbGllbnQgYXBwbGljYXRpb24KLQltdXN0IHVzZSBzZW5kbXNnKCkgb3Igc2VuZHRvKCkgd2l0aCBNU0dfRkFTVE9QRU4gZmxhZyByYXRoZXIgdGhhbgotCWNvbm5lY3QoKSB0byBwZXJmb3JtIGEgVENQIGhhbmRzaGFrZSBhdXRvbWF0aWNhbGx5LgorCUVuYWJsZSBUQ1AgRmFzdCBPcGVuIChSRkM3NDEzKSB0byBzZW5kIGFuZCBhY2NlcHQgZGF0YSBpbiB0aGUgb3BlbmluZworCVNZTiBwYWNrZXQuCisKKwlUaGUgY2xpZW50IHN1cHBvcnQgaXMgZW5hYmxlZCBieSBmbGFnIDB4MSAob24gYnkgZGVmYXVsdCkuIFRoZSBjbGllbnQKKwl0aGVuIG11c3QgdXNlIHNlbmRtc2coKSBvciBzZW5kdG8oKSB3aXRoIHRoZSBNU0dfRkFTVE9QRU4gZmxhZywKKwlyYXRoZXIgdGhhbiBjb25uZWN0KCkgdG8gc2VuZCBkYXRhIGluIFNZTi4KKworCVRoZSBzZXJ2ZXIgc3VwcG9ydCBpcyBlbmFibGVkIGJ5IGZsYWcgMHgyIChvZmYgYnkgZGVmYXVsdCkuIFRoZW4KKwllaXRoZXIgZW5hYmxlIGZvciBhbGwgbGlzdGVuZXJzIHdpdGggYW5vdGhlciBmbGFnICgweDQwMCkgb3IKKwllbmFibGUgaW5kaXZpZHVhbCBsaXN0ZW5lcnMgdmlhIFRDUF9GQVNUT1BFTiBzb2NrZXQgb3B0aW9uIHdpdGgKKwl0aGUgb3B0aW9uIHZhbHVlIGJlaW5nIHRoZSBsZW5ndGggb2YgdGhlIHN5bi1kYXRhIGJhY2tsb2cuCiAKIAlUaGUgdmFsdWVzIChiaXRtYXApIGFyZQotCTE6IEVuYWJsZXMgc2VuZGluZyBkYXRhIGluIHRoZSBvcGVuaW5nIFNZTiBvbiB0aGUgY2xpZW50IHcvIE1TR19GQVNUT1BFTi4KLQkyOiBFbmFibGVzIFRDUCBGYXN0IE9wZW4gb24gdGhlIHNlcnZlciBzaWRlLCBpLmUuLCBhbGxvd2luZyBkYXRhIGluCi0JICAgYSBTWU4gcGFja2V0IHRvIGJlIGFjY2VwdGVkIGFuZCBwYXNzZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGJlZm9yZQotCSAgIDMtd2F5IGhhbmQgc2hha2UgZmluaXNoZXMuCi0JNDogU2VuZCBkYXRhIGluIHRoZSBvcGVuaW5nIFNZTiByZWdhcmRsZXNzIG9mIGNvb2tpZSBhdmFpbGFiaWxpdHkgYW5kCi0JICAgd2l0aG91dCBhIGNvb2tpZSBvcHRpb24uCi0JMHgxMDA6IEFjY2VwdCBTWU4gZGF0YSB3L28gdmFsaWRhdGluZyB0aGUgY29va2llLgotCTB4MjAwOiBBY2NlcHQgZGF0YS1pbi1TWU4gdy9vIGFueSBjb29raWUgb3B0aW9uIHByZXNlbnQuCi0JMHg0MDAvMHg4MDA6IEVuYWJsZSBGYXN0IE9wZW4gb24gYWxsIGxpc3RlbmVycyByZWdhcmRsZXNzIG9mIHRoZQotCSAgIFRDUF9GQVNUT1BFTiBzb2NrZXQgb3B0aW9uLiBUaGUgdHdvIGRpZmZlcmVudCBmbGFncyBkZXNpZ25hdGUgdHdvCi0JICAgZGlmZmVyZW50IHdheXMgb2Ygc2V0dGluZyBtYXhfcWxlbiB3aXRob3V0IHRoZSBUQ1BfRkFTVE9QRU4gc29ja2V0Ci0JICAgb3B0aW9uLgorCSAgMHgxOiAoY2xpZW50KSBlbmFibGVzIHNlbmRpbmcgZGF0YSBpbiB0aGUgb3BlbmluZyBTWU4gb24gdGhlIGNsaWVudC4KKwkgIDB4MjogKHNlcnZlcikgZW5hYmxlcyB0aGUgc2VydmVyIHN1cHBvcnQsIGkuZS4sIGFsbG93aW5nIGRhdGEgaW4KKwkJCWEgU1lOIHBhY2tldCB0byBiZSBhY2NlcHRlZCBhbmQgcGFzc2VkIHRvIHRoZQorCQkJYXBwbGljYXRpb24gYmVmb3JlIDMtd2F5IGhhbmRzaGFrZSBmaW5pc2hlcy4KKwkgIDB4NDogKGNsaWVudCkgc2VuZCBkYXRhIGluIHRoZSBvcGVuaW5nIFNZTiByZWdhcmRsZXNzIG9mIGNvb2tpZQorCQkJYXZhaWxhYmlsaXR5IGFuZCB3aXRob3V0IGEgY29va2llIG9wdGlvbi4KKwkweDIwMDogKHNlcnZlcikgYWNjZXB0IGRhdGEtaW4tU1lOIHcvbyBhbnkgY29va2llIG9wdGlvbiBwcmVzZW50LgorCTB4NDAwOiAoc2VydmVyKSBlbmFibGUgYWxsIGxpc3RlbmVycyB0byBzdXBwb3J0IEZhc3QgT3BlbiBieQorCQkJZGVmYXVsdCB3aXRob3V0IGV4cGxpY2l0IFRDUF9GQVNUT1BFTiBzb2NrZXQgb3B0aW9uLgogCi0JRGVmYXVsdDogMQorCURlZmF1bHQ6IDB4MQogCi0JTm90ZSB0aGF0IHRoZSBjbGllbnQgJiBzZXJ2ZXIgc2lkZSBGYXN0IE9wZW4gZmxhZ3MgKDEgYW5kIDIKLQlyZXNwZWN0aXZlbHkpIG11c3QgYmUgYWxzbyBlbmFibGVkIGJlZm9yZSB0aGUgcmVzdCBvZiBmbGFncyBjYW4gdGFrZQotCWVmZmVjdC4KLQotCVNlZSBpbmNsdWRlL25ldC90Y3AuaCBhbmQgdGhlIGNvZGUgZm9yIG1vcmUgZGV0YWlscy4KKwlOb3RlIHRoYXQgdGhhdCBhZGRpdGlvbmFsIGNsaWVudCBvciBzZXJ2ZXIgZmVhdHVyZXMgYXJlIG9ubHkKKwllZmZlY3RpdmUgaWYgdGhlIGJhc2ljIHN1cHBvcnQgKDB4MSBhbmQgMHgyKSBhcmUgZW5hYmxlZCByZXNwZWN0aXZlbHkuCiAKIHRjcF9zeW5fcmV0cmllcyAtIElOVEVHRVIKIAlOdW1iZXIgb2YgdGltZXMgaW5pdGlhbCBTWU5zIGZvciBhbiBhY3RpdmUgVENQIGNvbm5lY3Rpb24gYXR0ZW1wdApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwdmxhbi50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXB2bGFuLnR4dAppbmRleCAxNDQyMmY4Li4yNDE5NmNlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXB2bGFuLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXB2bGFuLnR4dApAQCAtMjIsNyArMjIsNyBAQAogCVRoZXJlIGFyZSBubyBtb2R1bGUgcGFyYW1ldGVycyBmb3IgdGhpcyBkcml2ZXIgYW5kIGl0IGNhbiBiZSBjb25maWd1cmVkCiB1c2luZyBJUHJvdXRlMi9pcCB1dGlsaXR5LgogCi0JaXAgbGluayBhZGQgbGluayA8bWFzdGVyLWRldj4gPHNsYXZlLWRldj4gdHlwZSBpcHZsYW4gbW9kZSB7IGwyIHwgTDMgfQorCWlwIGxpbmsgYWRkIGxpbmsgPG1hc3Rlci1kZXY+IDxzbGF2ZS1kZXY+IHR5cGUgaXB2bGFuIG1vZGUgeyBsMiB8IGwzIHwgbDNzIH0KIAogCWUuZy4gaXAgbGluayBhZGQgbGluayBpcHZsMCBldGgwIHR5cGUgaXB2bGFuIG1vZGUgbDIKIApAQCAtNDgsNiArNDgsMTEgQEAKIHVzZWQgYmVmb3JlIHBhY2tldHMgYXJlIHF1ZXVlZCBvbiB0aGUgb3V0Ym91bmQgZGV2aWNlLiBJbiB0aGlzIG1vZGUgdGhlIHNsYXZlcwogd2lsbCBub3QgcmVjZWl2ZSBub3IgY2FuIHNlbmQgbXVsdGljYXN0IC8gYnJvYWRjYXN0IHRyYWZmaWMuCiAKKzQuMyBMM1MgbW9kZToKKwlUaGlzIGlzIHZlcnkgc2ltaWxhciB0byB0aGUgTDMgbW9kZSBleGNlcHQgdGhhdCBpcHRhYmxlcyAoY29ubi10cmFja2luZykKK3dvcmtzIGluIHRoaXMgbW9kZSBhbmQgaGVuY2UgaXQgaXMgTDMtc3ltbWV0cmljIChMM3MpLiBUaGlzIHdpbGwgaGF2ZSBzbGlnaHRseSBsZXNzCitwZXJmb3JtYW5jZSBidXQgdGhhdCBzaG91bGRuJ3QgbWF0dGVyIHNpbmNlIHlvdSBhcmUgY2hvb3NpbmcgdGhpcyBtb2RlIG92ZXIgcGxhaW4tTDMKK21vZGUgdG8gbWFrZSBjb25uLXRyYWNraW5nIHdvcmsuCiAKIDUuIFdoYXQgdG8gY2hvb3NlIChtYWN2bGFuIHZzLiBpcHZsYW4pPwogCVRoZXNlIHR3byBkZXZpY2VzIGFyZSB2ZXJ5IHNpbWlsYXIgaW4gbWFueSByZWdhcmRzIGFuZCB0aGUgc3BlY2lmaWMgdXNlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcnhycGMudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3J4cnBjLnR4dAppbmRleCAxNmE5MjRjLi4xYjYzYmJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcnhycGMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9yeHJwYy50eHQKQEAgLTcyNSw3ICs3MjUsOCBAQAogCiAgKCopIEVuZCBhIGNsaWVudCBjYWxsLgogCi0Jdm9pZCByeHJwY19rZXJuZWxfZW5kX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOworCXZvaWQgcnhycGNfa2VybmVsX2VuZF9jYWxsKHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkJICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOwogCiAgICAgIFRoaXMgaXMgdXNlZCB0byBlbmQgYSBwcmV2aW91c2x5IGJlZ3VuIGNhbGwuICBUaGUgdXNlcl9jYWxsX0lEIGlzIGV4cHVuZ2VkCiAgICAgIGZyb20gQUZfUlhSUEMncyBrbm93bGVkZ2UgYW5kIHdpbGwgbm90IGJlIHNlZW4gYWdhaW4gaW4gYXNzb2NpYXRpb24gd2l0aApAQCAtNzMzLDcgKzczNCw5IEBACiAKICAoKikgU2VuZCBkYXRhIHRocm91Z2ggYSBjYWxsLgogCi0JaW50IHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBtc2doZHIgKm1zZywKKwlpbnQgcnhycGNfa2VybmVsX3NlbmRfZGF0YShzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCSAgIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgIHN0cnVjdCBtc2doZHIgKm1zZywKIAkJCQkgICBzaXplX3QgbGVuKTsKIAogICAgICBUaGlzIGlzIHVzZWQgdG8gc3VwcGx5IGVpdGhlciB0aGUgcmVxdWVzdCBwYXJ0IG9mIGEgY2xpZW50IGNhbGwgb3IgdGhlCkBAIC03NDUsOSArNzQ4LDQyIEBACiAgICAgIFRoZSBtc2cgbXVzdCBub3Qgc3BlY2lmeSBhIGRlc3RpbmF0aW9uIGFkZHJlc3MsIGNvbnRyb2wgZGF0YSBvciBhbnkgZmxhZ3MKICAgICAgb3RoZXIgdGhhbiBNU0dfTU9SRS4gIGxlbiBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGRhdGEgdG8gdHJhbnNtaXQuCiAKKyAoKikgUmVjZWl2ZSBkYXRhIGZyb20gYSBjYWxsLgorCisJaW50IHJ4cnBjX2tlcm5lbF9yZWN2X2RhdGEoc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQkgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICB2b2lkICpidWYsCisJCQkJICAgc2l6ZV90IHNpemUsCisJCQkJICAgc2l6ZV90ICpfb2Zmc2V0LAorCQkJCSAgIGJvb2wgd2FudF9tb3JlLAorCQkJCSAgIHUzMiAqX2Fib3J0KQorCisgICAgICBUaGlzIGlzIHVzZWQgdG8gcmVjZWl2ZSBkYXRhIGZyb20gZWl0aGVyIHRoZSByZXBseSBwYXJ0IG9mIGEgY2xpZW50IGNhbGwKKyAgICAgIG9yIHRoZSByZXF1ZXN0IHBhcnQgb2YgYSBzZXJ2aWNlIGNhbGwuICBidWYgYW5kIHNpemUgc3BlY2lmeSBob3cgbXVjaAorICAgICAgZGF0YSBpcyBkZXNpcmVkIGFuZCB3aGVyZSB0byBzdG9yZSBpdC4gICpfb2Zmc2V0IGlzIGFkZGVkIG9uIHRvIGJ1ZiBhbmQKKyAgICAgIHN1YnRyYWN0ZWQgZnJvbSBzaXplIGludGVybmFsbHk7IHRoZSBhbW91bnQgY29waWVkIGludG8gdGhlIGJ1ZmZlciBpcworICAgICAgYWRkZWQgdG8gKl9vZmZzZXQgYmVmb3JlIHJldHVybmluZy4KKworICAgICAgd2FudF9tb3JlIHNob3VsZCBiZSB0cnVlIGlmIGZ1cnRoZXIgZGF0YSB3aWxsIGJlIHJlcXVpcmVkIGFmdGVyIHRoaXMgaXMKKyAgICAgIHNhdGlzZmllZCBhbmQgZmFsc2UgaWYgdGhpcyBpcyB0aGUgbGFzdCBpdGVtIG9mIHRoZSByZWNlaXZlIHBoYXNlLgorCisgICAgICBUaGVyZSBhcmUgdGhyZWUgbm9ybWFsIHJldHVybnM6IDAgaWYgdGhlIGJ1ZmZlciB3YXMgZmlsbGVkIGFuZCB3YW50X21vcmUKKyAgICAgIHdhcyB0cnVlOyAxIGlmIHRoZSBidWZmZXIgd2FzIGZpbGxlZCwgdGhlIGxhc3QgREFUQSBwYWNrZXQgaGFzIGJlZW4KKyAgICAgIGVtcHRpZWQgYW5kIHdhbnRfbW9yZSB3YXMgZmFsc2U7IGFuZCAtRUFHQUlOIGlmIHRoZSBmdW5jdGlvbiBuZWVkcyB0byBiZQorICAgICAgY2FsbGVkIGFnYWluLgorCisgICAgICBJZiB0aGUgbGFzdCBEQVRBIHBhY2tldCBpcyBwcm9jZXNzZWQgYnV0IHRoZSBidWZmZXIgY29udGFpbnMgbGVzcyB0aGFuCisgICAgICB0aGUgYW1vdW50IHJlcXVlc3RlZCwgRUJBRE1TRyBpcyByZXR1cm5lZC4gIElmIHdhbnRfbW9yZSB3YXNuJ3Qgc2V0LCBidXQKKyAgICAgIG1vcmUgZGF0YSB3YXMgYXZhaWxhYmxlLCBFTVNHU0laRSBpcyByZXR1cm5lZC4KKworICAgICAgSWYgYSByZW1vdGUgQUJPUlQgaXMgZGV0ZWN0ZWQsIHRoZSBhYm9ydCBjb2RlIHJlY2VpdmVkIHdpbGwgYmUgc3RvcmVkIGluCisgICAgICAqX2Fib3J0IGFuZCBFQ09OTkFCT1JURUQgd2lsbCBiZSByZXR1cm5lZC4KKwogICgqKSBBYm9ydCBhIGNhbGwuCiAKLQl2b2lkIHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1MzIgYWJvcnRfY29kZSk7CisJdm9pZCByeHJwY19rZXJuZWxfYWJvcnRfY2FsbChzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCSAgICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJICAgICB1MzIgYWJvcnRfY29kZSk7CiAKICAgICAgVGhpcyBpcyB1c2VkIHRvIGFib3J0IGEgY2FsbCBpZiBpdCdzIHN0aWxsIGluIGFuIGFib3J0YWJsZSBzdGF0ZS4gIFRoZQogICAgICBhYm9ydCBjb2RlIHNwZWNpZmllZCB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgQUJPUlQgbWVzc2FnZSBzZW50LgpAQCAtNzkwLDEzICs4MjYsMTIgQEAKICAgICAgRGF0YSBtZXNzYWdlcyBjYW4gaGF2ZSB0aGVpciBjb250ZW50cyBleHRyYWN0ZWQgd2l0aCB0aGUgdXN1YWwgYnVuY2ggb2YKICAgICAgc29ja2V0IGJ1ZmZlciBtYW5pcHVsYXRpb24gZnVuY3Rpb25zLiAgQSBkYXRhIG1lc3NhZ2UgY2FuIGJlIGRldGVybWluZWQgdG8KICAgICAgYmUgdGhlIGxhc3Qgb25lIGluIGEgc2VxdWVuY2Ugd2l0aCByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0KCkuICBXaGVuIGEKLSAgICAgZGF0YSBtZXNzYWdlIGhhcyBiZWVuIHVzZWQgdXAsIHJ4cnBjX2tlcm5lbF9kYXRhX2RlbGl2ZXJlZCgpIHNob3VsZCBiZQotICAgICBjYWxsZWQgb24gaXQuLgorICAgICBkYXRhIG1lc3NhZ2UgaGFzIGJlZW4gdXNlZCB1cCwgcnhycGNfa2VybmVsX2RhdGFfY29uc3VtZWQoKSBzaG91bGQgYmUKKyAgICAgY2FsbGVkIG9uIGl0LgogCi0gICAgIE5vbi1kYXRhIG1lc3NhZ2VzIHNob3VsZCBiZSBoYW5kbGVkIHRvIHJ4cnBjX2tlcm5lbF9mcmVlX3NrYigpIHRvIGRpc3Bvc2UKLSAgICAgb2YuICBJdCBpcyBwb3NzaWJsZSB0byBnZXQgZXh0cmEgcmVmcyBvbiBhbGwgdHlwZXMgb2YgbWVzc2FnZSBmb3IgbGF0ZXIKLSAgICAgZnJlZWluZywgYnV0IHRoaXMgbWF5IHBpbiB0aGUgc3RhdGUgb2YgYSBjYWxsIHVudGlsIHRoZSBtZXNzYWdlIGlzIGZpbmFsbHkKLSAgICAgZnJlZWQuCisgICAgIE1lc3NhZ2VzIHNob3VsZCBiZSBoYW5kbGVkIHRvIHJ4cnBjX2tlcm5lbF9mcmVlX3NrYigpIHRvIGRpc3Bvc2Ugb2YuICBJdAorICAgICBpcyBwb3NzaWJsZSB0byBnZXQgZXh0cmEgcmVmcyBvbiBhbGwgdHlwZXMgb2YgbWVzc2FnZSBmb3IgbGF0ZXIgZnJlZWluZywKKyAgICAgYnV0IHRoaXMgbWF5IHBpbiB0aGUgc3RhdGUgb2YgYSBjYWxsIHVudGlsIHRoZSBtZXNzYWdlIGlzIGZpbmFsbHkgZnJlZWQuCiAKICAoKikgQWNjZXB0IGFuIGluY29taW5nIGNhbGwuCiAKQEAgLTgyMSw0NSArODU2LDYgQEAKICAgICAgT3RoZXIgZXJyb3JzIG1heSBiZSByZXR1cm5lZCBpZiB0aGUgY2FsbCBoYWQgYmVlbiBhYm9ydGVkICgtRUNPTk5BQk9SVEVEKQogICAgICBvciBoYWQgdGltZWQgb3V0ICgtRVRJTUUpLgogCi0gKCopIFJlY29yZCB0aGUgZGVsaXZlcnkgb2YgYSBkYXRhIG1lc3NhZ2UgYW5kIGZyZWUgaXQuCi0KLQl2b2lkIHJ4cnBjX2tlcm5lbF9kYXRhX2RlbGl2ZXJlZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQotICAgICBUaGlzIGlzIHVzZWQgdG8gcmVjb3JkIGEgZGF0YSBtZXNzYWdlIGFzIGhhdmluZyBiZWVuIGRlbGl2ZXJlZCBhbmQgdG8KLSAgICAgdXBkYXRlIHRoZSBBQ0sgc3RhdGUgZm9yIHRoZSBjYWxsLiAgVGhlIHNvY2tldCBidWZmZXIgd2lsbCBiZSBmcmVlZC4KLQotICgqKSBGcmVlIGEgbWVzc2FnZS4KLQotCXZvaWQgcnhycGNfa2VybmVsX2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IpOwotCi0gICAgIFRoaXMgaXMgdXNlZCB0byBmcmVlIGEgbm9uLURBVEEgc29ja2V0IGJ1ZmZlciBpbnRlcmNlcHRlZCBmcm9tIGFuIEFGX1JYUlBDCi0gICAgIHNvY2tldC4KLQotICgqKSBEZXRlcm1pbmUgaWYgYSBkYXRhIG1lc3NhZ2UgaXMgdGhlIGxhc3Qgb25lIG9uIGEgY2FsbC4KLQotCWJvb2wgcnhycGNfa2VybmVsX2lzX2RhdGFfbGFzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQotICAgICBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgc29ja2V0IGJ1ZmZlciBob2xkcyB0aGUgbGFzdCBkYXRhIG1lc3NhZ2UKLSAgICAgdG8gYmUgcmVjZWl2ZWQgZm9yIGEgY2FsbCAodHJ1ZSB3aWxsIGJlIHJldHVybmVkIGlmIGl0IGRvZXMsIGZhbHNlCi0gICAgIGlmIG5vdCkuCi0KLSAgICAgVGhlIGRhdGEgbWVzc2FnZSB3aWxsIGJlIHBhcnQgb2YgdGhlIHJlcGx5IG9uIGEgY2xpZW50IGNhbGwgYW5kIHRoZQotICAgICByZXF1ZXN0IG9uIGFuIGluY29taW5nIGNhbGwuICBJbiB0aGUgbGF0dGVyIGNhc2UgdGhlcmUgd2lsbCBiZSBtb3JlCi0gICAgIG1lc3NhZ2VzLCBidXQgaW4gdGhlIGZvcm1lciBjYXNlIHRoZXJlIHdpbGwgbm90LgotCi0gKCopIEdldCB0aGUgYWJvcnQgY29kZSBmcm9tIGFuIGFib3J0IG1lc3NhZ2UuCi0KLQl1MzIgcnhycGNfa2VybmVsX2dldF9hYm9ydF9jb2RlKHN0cnVjdCBza19idWZmICpza2IpOwotCi0gICAgIFRoaXMgaXMgdXNlZCB0byBleHRyYWN0IHRoZSBhYm9ydCBjb2RlIGZyb20gYSByZW1vdGUgYWJvcnQgbWVzc2FnZS4KLQotICgqKSBHZXQgdGhlIGVycm9yIG51bWJlciBmcm9tIGEgbG9jYWwgb3IgbmV0d29yayBlcnJvciBtZXNzYWdlLgotCi0JaW50IHJ4cnBjX2tlcm5lbF9nZXRfZXJyb3JfbnVtYmVyKHN0cnVjdCBza19idWZmICpza2IpOwotCi0gICAgIFRoaXMgaXMgdXNlZCB0byBleHRyYWN0IHRoZSBlcnJvciBudW1iZXIgZnJvbSBhIG1lc3NhZ2UgaW5kaWNhdGluZyBlaXRoZXIKLSAgICAgYSBsb2NhbCBlcnJvciBvY2N1cnJlZCBvciBhIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQuCi0KICAoKikgQWxsb2NhdGUgYSBudWxsIGtleSBmb3IgZG9pbmcgYW5vbnltb3VzIHNlY3VyaXR5LgogCiAJc3RydWN0IGtleSAqcnhycGNfZ2V0X251bGxfa2V5KGNvbnN0IGNoYXIgKmtleW5hbWUpOwpAQCAtODY3LDYgKzg2MywxMyBAQAogICAgICBUaGlzIGlzIHVzZWQgdG8gYWxsb2NhdGUgYSBudWxsIFJ4UlBDIGtleSB0aGF0IGNhbiBiZSB1c2VkIHRvIGluZGljYXRlCiAgICAgIGFub255bW91cyBzZWN1cml0eSBmb3IgYSBwYXJ0aWN1bGFyIGRvbWFpbi4KIAorICgqKSBHZXQgdGhlIHBlZXIgYWRkcmVzcyBvZiBhIGNhbGwuCisKKwl2b2lkIHJ4cnBjX2tlcm5lbF9nZXRfcGVlcihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKl9zcngpOworCisgICAgIFRoaXMgaXMgdXNlZCB0byBmaW5kIHRoZSByZW1vdGUgcGVlciBhZGRyZXNzIG9mIGEgY2FsbC4KKwogCiA9PT09PT09PT09PT09PT09PT09PT09PQogQ09ORklHVVJBQkxFIFBBUkFNRVRFUlMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zdHJwYXJzZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3N0cnBhcnNlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBiZjU3MwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zdHJwYXJzZXIudHh0CkBAIC0wLDAgKzEsMTM2IEBACitTdHJlYW0gUGFyc2VyCistLS0tLS0tLS0tLS0tCisKK1RoZSBzdHJlYW0gcGFyc2VyIChzdHJwYXJzZXIpIGlzIGEgdXRpbGl0eSB0aGF0IHBhcnNlcyBtZXNzYWdlcyBvZiBhbgorYXBwbGljYXRpb24gbGF5ZXIgcHJvdG9jb2wgcnVubmluZyBvdmVyIGEgVENQIGNvbm5lY3Rpb24uIFRoZSBzdHJlYW0KK3BhcnNlciB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIGFuIHVwcGVyIGxheWVyIGluIHRoZSBrZXJuZWwgdG8gcHJvdmlkZQora2VybmVsIHN1cHBvcnQgZm9yIGFwcGxpY2F0aW9uIGxheWVyIG1lc3NhZ2VzLiBGb3IgaW5zdGFuY2UsIEtlcm5lbAorQ29ubmVjdGlvbiBNdWx0aXBsZXhvciAoS0NNKSB1c2VzIHRoZSBTdHJlYW0gUGFyc2VyIHRvIHBhcnNlIG1lc3NhZ2VzCit1c2luZyBhIEJQRiBwcm9ncmFtLgorCitJbnRlcmZhY2UKKy0tLS0tLS0tLQorCitUaGUgQVBJIGluY2x1ZGVzIGEgY29udGV4dCBzdHJ1Y3R1cmUsIGEgc2V0IG9mIGNhbGxiYWNrcywgdXRpbGl0eQorZnVuY3Rpb25zLCBhbmQgYSBkYXRhX3JlYWR5IGZ1bmN0aW9uLiBUaGUgY2FsbGJhY2tzIGluY2x1ZGUKK2EgcGFyc2VfbXNnIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIHBlcmZvcm0gcGFyc2luZyAoZS5nLgorQlBGIHBhcnNpbmcgaW4gY2FzZSBvZiBLQ00pLCBhbmQgYSByY3ZfbXNnIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkCit3aGVuIGEgZnVsbCBtZXNzYWdlIGhhcyBiZWVuIGNvbXBsZXRlZC4KKworQSBzdHJlYW0gcGFyc2VyIGNhbiBiZSBpbnN0YW50aWF0ZWQgZm9yIGEgVENQIGNvbm5lY3Rpb24uIFRoaXMgaXMgZG9uZQorYnk6CisKK3N0cnBfaW5pdChzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc29jayAqY3NrLAorCSAgc3RydWN0IHN0cnBfY2FsbGJhY2tzICpjYikKKworc3RycCBpcyBhIHN0cnVjdCBvZiB0eXBlIHN0cnBhcnNlciB0aGF0IGlzIGFsbG9jYXRlZCBieSB0aGUgdXBwZXIgbGF5ZXIuCitjc2sgaXMgdGhlIFRDUCBzb2NrZXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJlYW0gcGFyc2VyLiBDYWxsYmFja3MgYXJlCitjYWxsZWQgYnkgdGhlIHN0cmVhbSBwYXJzZXIuCisKK0NhbGxiYWNrcworLS0tLS0tLS0tCisKK1RoZXJlIGFyZSBmb3VyIGNhbGxiYWNrczoKKworaW50ICgqcGFyc2VfbXNnKShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworICAgIHBhcnNlX21zZyBpcyBjYWxsZWQgdG8gZGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlIG5leHQgbWVzc2FnZQorICAgIGluIHRoZSBzdHJlYW0uIFRoZSB1cHBlciBsYXllciBtdXN0IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLiBJdAorICAgIHNob3VsZCBwYXJzZSB0aGUgc2tfYnVmZiBhcyBjb250YWluaW5nIHRoZSBoZWFkZXJzIGZvciB0aGUKKyAgICBuZXh0IGFwcGxpY2F0aW9uIGxheWVyIG1lc3NhZ2VzIGluIHRoZSBzdHJlYW0uCisKKyAgICBUaGUgc2tiLT5jYiBpbiB0aGUgaW5wdXQgc2tiIGlzIGEgc3RydWN0IHN0cnBfcnhfbXNnLiBPbmx5CisgICAgdGhlIG9mZnNldCBmaWVsZCBpcyByZWxldmFudCBpbiBwYXJzZV9tc2cgYW5kIGdpdmVzIHRoZSBvZmZzZXQKKyAgICB3aGVyZSB0aGUgbWVzc2FnZSBzdGFydHMgaW4gdGhlIHNrYi4KKworICAgIFRoZSByZXR1cm4gdmFsdWVzIG9mIHRoaXMgZnVuY3Rpb24gYXJlOgorCisgICAgPjAgOiBpbmRpY2F0ZXMgbGVuZ3RoIG9mIHN1Y2Nlc3NmdWxseSBwYXJzZWQgbWVzc2FnZQorICAgIDAgIDogaW5kaWNhdGVzIG1vcmUgZGF0YSBtdXN0IGJlIHJlY2VpdmVkIHRvIHBhcnNlIHRoZSBtZXNzYWdlCisgICAgLUVTVFJQSVBFIDogY3VycmVudCBtZXNzYWdlIHNob3VsZCBub3QgYmUgcHJvY2Vzc2VkIGJ5IHRoZQorICAgICAgICAgIGtlcm5lbCwgcmV0dXJuIGNvbnRyb2wgb2YgdGhlIHNvY2tldCB0byB1c2Vyc3BhY2Ugd2hpY2gKKyAgICAgICAgICBjYW4gcHJvY2VlZCB0byByZWFkIHRoZSBtZXNzYWdlcyBpdHNlbGYKKyAgICBvdGhlciA8IDAgOiBFcnJvciBpcyBwYXJzaW5nLCBnaXZlIGNvbnRyb2wgYmFjayB0byB1c2Vyc3BhY2UKKyAgICAgICAgICBhc3N1bWluZyB0aGF0IHN5bmNocm9uaXphdGlvbiBpcyBsb3N0IGFuZCB0aGUgc3RyZWFtCisgICAgICAgICAgaXMgdW5yZWNvdmVyYWJsZSAoYXBwbGljYXRpb24gZXhwZWN0ZWQgdG8gY2xvc2UgVENQIHNvY2tldCkKKworICAgIEluIHRoZSBjYXNlIHRoYXQgYW4gZXJyb3IgaXMgcmV0dXJuZWQgKHJldHVybiB2YWx1ZSBpcyBsZXNzIHRoYW4KKyAgICB6ZXJvKSB0aGUgc3RyZWFtIHBhcnNlciB3aWxsIHNldCB0aGUgZXJyb3Igb24gVENQIHNvY2tldCBhbmQgd2FrZQorICAgIGl0IHVwLiBJZiBwYXJzZV9tc2cgcmV0dXJuZWQgLUVTVFJQSVBFIGFuZCB0aGUgc3RyZWFtIHBhcnNlciBoYWQKKyAgICBwcmV2aW91c2x5IHJlYWQgc29tZSBieXRlcyBmb3IgdGhlIGN1cnJlbnQgbWVzc2FnZSwgdGhlbiB0aGUgZXJyb3IKKyAgICBzZXQgb24gdGhlIGF0dGFjaGVkIHNvY2tldCBpcyBFTk9EQVRBIHNpbmNlIHRoZSBzdHJlYW0gaXMKKyAgICB1bnJlY292ZXJhYmxlIGluIHRoYXQgY2FzZS4KKwordm9pZCAoKnJjdl9tc2cpKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IpOworCisgICAgcmN2X21zZyBpcyBjYWxsZWQgd2hlbiBhIGZ1bGwgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQKKyAgICBpcyBxdWV1ZWQuIFRoZSBjYWxsZWUgbXVzdCBjb25zdW1lIHRoZSBza19idWZmOyBpdCBjYW4KKyAgICBjYWxsIHN0cnBfcGF1c2UgdG8gcHJldmVudCBhbnkgZnVydGhlciBtZXNzYWdlcyBmcm9tIGJlaW5nCisgICAgcmVjZWl2ZWQgaW4gcmN2X21zZyAoc2VlIHN0cnBfcGF1c2UgYmVsb3cpLiBUaGlzIGNhbGxiYWNrCisgICAgbXVzdCBiZSBzZXQuCisKKyAgICBUaGUgc2tiLT5jYiBpbiB0aGUgaW5wdXQgc2tiIGlzIGEgc3RydWN0IHN0cnBfcnhfbXNnLiBUaGlzCisgICAgc3RydWN0IGNvbnRhaW5zIHR3byBmaWVsZHM6IG9mZnNldCBhbmQgZnVsbF9sZW4uIE9mZnNldCBpcworICAgIHdoZXJlIHRoZSBtZXNzYWdlIHN0YXJ0cyBpbiB0aGUgc2tiLCBhbmQgZnVsbF9sZW4gaXMgdGhlCisgICAgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZS4gc2tiLT5sZW4gLSBvZmZzZXQgbWF5IGJlIGdyZWF0ZXIKKyAgICB0aGVuIGZ1bGxfbGVuIHNpbmNlIHN0cnBhcnNlciBkb2VzIG5vdCB0cmltIHRoZSBza2IuCisKK2ludCAoKnJlYWRfc29ja19kb25lKShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwLCBpbnQgZXJyKTsKKworICAgICByZWFkX3NvY2tfZG9uZSBpcyBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIHBhcnNlciBpcyBkb25lIHJlYWRpbmcKKyAgICAgdGhlIFRDUCBzb2NrZXQuIFRoZSBzdHJlYW0gcGFyc2VyIG1heSByZWFkIG11bHRpcGxlIG1lc3NhZ2VzCisgICAgIGluIGEgbG9vcCBhbmQgdGhpcyBmdW5jdGlvbiBhbGxvd3MgY2xlYW51cCB0byBvY2N1ciB3aGVuIGV4aXN0aW5nCisgICAgIHRoZSBsb29wLiBJZiB0aGUgY2FsbGJhY2sgaXMgbm90IHNldCAoTlVMTCBpbiBzdHJwX2luaXQpIGEKKyAgICAgZGVmYXVsdCBmdW5jdGlvbiBpcyB1c2VkLgorCit2b2lkICgqYWJvcnRfcGFyc2VyKShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwLCBpbnQgZXJyKTsKKworICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHN0cmVhbSBwYXJzZXIgZW5jb3VudGVycyBhbiBlcnJvcgorICAgICBpbiBwYXJzaW5nLiBUaGUgZGVmYXVsdCBmdW5jdGlvbiBzdG9wcyB0aGUgc3RyZWFtIHBhcnNlciBmb3IgdGhlCisgICAgIFRDUCBzb2NrZXQgYW5kIHNldHMgdGhlIGVycm9yIGluIHRoZSBzb2NrZXQuIFRoZSBkZWZhdWx0IGZ1bmN0aW9uCisgICAgIGNhbiBiZSBjaGFuZ2VkIGJ5IHNldHRpbmcgdGhlIGNhbGxiYWNrIHRvIG5vbi1OVUxMIGluIHN0cnBfaW5pdC4KKworRnVuY3Rpb25zCistLS0tLS0tLS0KKworVGhlIHVwcGVyIGxheWVyIGNhbGxzIHN0cnBfdGNwX2RhdGFfcmVhZHkgd2hlbiBkYXRhIGlzIHJlYWR5IG9uIHRoZSBsb3dlcgorc29ja2V0IGZvciBzdHJwYXJzZXIgdG8gcHJvY2Vzcy4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGZyb20gYSBkYXRhX3JlYWR5CitjYWxsYmFjayB0aGF0IGlzIHNldCBvbiB0aGUgc29ja2V0LgorCitzdHJwX3N0b3AgaXMgY2FsbGVkIHRvIGNvbXBsZXRlbHkgc3RvcCBzdHJlYW0gcGFyc2VyIG9wZXJhdGlvbnMuIFRoaXMKK2lzIGNhbGxlZCBpbnRlcm5hbGx5IHdoZW4gdGhlIHN0cmVhbSBwYXJzZXIgZW5jb3VudGVycyBhbiBlcnJvciwgYW5kCitpdCBpcyBjYWxsZWQgZnJvbSB0aGUgdXBwZXIgbGF5ZXIgd2hlbiB1bmF0dGFjaGluZyBhIFRDUCBzb2NrZXQuCisKK3N0cnBfZG9uZSBpcyBjYWxsZWQgdG8gdW5hdHRhY2ggdGhlIHN0cmVhbSBwYXJzZXIgZnJvbSB0aGUgVENQIHNvY2tldC4KK1RoaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHN0cmVhbSBwcm9jZXNzb3IgaGFzIGJlIHN0b3BwZWQuCisKK3N0cnBfY2hlY2tfcmN2IGlzIGNhbGxlZCB0byBjaGVjayBmb3IgbmV3IG1lc3NhZ2VzIG9uIHRoZSBzb2NrZXQuIFRoaXMKK2lzIG5vcm1hbGx5IGNhbGxlZCBhdCBpbml0aWFsaXphdGlvbiBvZiB0aGUgYSBzdHJlYW0gcGFyc2VyIGluc3RhbmNlCitvZiBhZnRlciBzdHJwX3VucGF1c2UuCisKK1N0YXRpc3RpY3MKKy0tLS0tLS0tLS0KKworVmFyaW91cyBjb3VudGVycyBhcmUga2VwdCBmb3IgZWFjaCBzdHJlYW0gcGFyc2VyIGZvciBhIFRDUCBzb2NrZXQuCitUaGVzZSBhcmUgaW4gdGhlIHN0cnBfc3RhdHMgc3RydWN0dXJlLiBzdHJwX2FnZ3Jfc3RhdHMgaXMgYSBjb252ZW5pZW5jZQorc3RydWN0dXJlIGZvciBhY2N1bXVsYXRpbmcgc3RhdGlzdGljcyBmb3IgbXVsdGlwbGUgc3RyZWFtIHBhcnNlcgoraW5zdGFuY2VzLiBzYXZlX3N0cnBfc3RhdHMgYW5kIGFnZ3JlZ2F0ZV9zdHJwX3N0YXRzIGFyZSBoZWxwZXIgZnVuY3Rpb25zCit0byBzYXZlIGFuZCBhZ2dyZWdhdGUgc3RhdGlzdGljcy4KKworTWVzc2FnZSBhc3NlbWJseSBsaW1pdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBzdHJlYW0gcGFyc2VyIHByb3ZpZGUgbWVjaGFuaXNtcyB0byBsaW1pdCB0aGUgcmVzb3VyY2VzIGNvbnN1bWVkIGJ5CittZXNzYWdlIGFzc2VtYmx5LgorCitBIHRpbWVyIGlzIHNldCB3aGVuIGFzc2VtYmx5IHN0YXJ0cyBmb3IgYSBuZXcgbWVzc2FnZS4gVGhlIG1lc3NhZ2UKK3RpbWVvdXQgaXMgdGFrZW4gZnJvbSByY3Z0aW1lIGZvciB0aGUgYXNzb2NpYXRlZCBUQ1Agc29ja2V0LiBJZiB0aGUKK3RpbWVyIGZpcmVzIGJlZm9yZSBhc3NlbWJseSBjb21wbGV0ZXMgdGhlIHN0cmVhbSBwYXJzZXIgaXMgYWJvcnRlZAorYW5kIHRoZSBFVElNRURPVVQgZXJyb3IgaXMgc2V0IG9uIHRoZSBUQ1Agc29ja2V0LgorCitNZXNzYWdlIGxlbmd0aCBpcyBsaW1pdGVkIHRvIHRoZSByZWNlaXZlIGJ1ZmZlciBzaXplIG9mIHRoZSBhc3NvY2lhdGVkCitUQ1Agc29ja2V0LiBJZiB0aGUgbGVuZ3RoIHJldHVybmVkIGJ5IHBhcnNlX21zZyBpcyBncmVhdGVyIHRoYW4KK3RoZSBzb2NrZXQgYnVmZmVyIHNpemUgdGhlbiB0aGUgc3RyZWFtIHBhcnNlciBpcyBhYm9ydGVkIHdpdGgKK0VNU0dTSVpFIGVycm9yIHNldCBvbiB0aGUgVENQIHNvY2tldC4gTm90ZSB0aGF0IHRoaXMgbWFrZXMgdGhlCittYXhpbXVtIHNpemUgb2YgcmVjZWl2ZSBza2J1ZmZzIGZvciBhIHNvY2tldCB3aXRoIGEgc3RyZWFtIHBhcnNlcgordG8gYmUgMipza19yY3ZidWYgb2YgdGhlIFRDUCBzb2NrZXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc3dpdGNoZGV2LnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zd2l0Y2hkZXYudHh0CmluZGV4IDMxYzM5MTEuLjJiYmFjMDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zd2l0Y2hkZXYudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zd2l0Y2hkZXYudHh0CkBAIC0yODMsMTUgKzI4MywxMCBAQAogYnJpZGdlIHNob3VsZCBub3QgcmVmbG9vZCB0aGUgcGFja2V0IHRvIHRoZSBzYW1lIHBvcnRzIHRoZSBkZXZpY2UgZmxvb2RlZCwKIG90aGVyd2lzZSB0aGVyZSB3aWxsIGJlIGR1cGxpY2F0ZSBwYWNrZXRzIG9uIHRoZSB3aXJlLgogCi1UbyBhdm9pZCBkdXBsaWNhdGUgcGFja2V0cywgdGhlIGRldmljZS9kcml2ZXIgc2hvdWxkIG1hcmsgYSBwYWNrZXQgYXMgYWxyZWFkeQotZm9yd2FyZGVkIHVzaW5nIHNrYi0+b2ZmbG9hZF9md2RfbWFyay4gIFRoZSBzYW1lIG1hcmsgaXMgc2V0IG9uIHRoZSBkZXZpY2UKLXBvcnRzIGluIHRoZSBkb21haW4gdXNpbmcgZGV2LT5vZmZsb2FkX2Z3ZF9tYXJrLiAgSWYgdGhlIHNrYi0+b2ZmbG9hZF9md2RfbWFyawotaXMgbm9uLXplcm8gYW5kIG1hdGNoZXMgdGhlIGZvcndhcmRpbmcgZWdyZXNzIHBvcnQncyBkZXYtPnNrYl9tYXJrLCB0aGUga2VybmVsCi13aWxsIGRyb3AgdGhlIHNrYiByaWdodCBiZWZvcmUgdHJhbnNtaXQgb24gdGhlIGVncmVzcyBwb3J0LCB3aXRoIHRoZQotdW5kZXJzdGFuZGluZyB0aGF0IHRoZSBkZXZpY2UgYWxyZWFkeSBmb3J3YXJkZWQgdGhlIHBhY2tldCBvbiBzYW1lIGVncmVzcyBwb3J0LgotVGhlIGRyaXZlciBjYW4gdXNlIHN3aXRjaGRldl9wb3J0X2Z3ZF9tYXJrX3NldCgpIHRvIHNldCBhIGdsb2JhbGx5IHVuaXF1ZSBtYXJrCi1mb3IgcG9ydCdzIGRldi0+b2ZmbG9hZF9md2RfbWFyaywgYmFzZWQgb24gdGhlIHBvcnQncyBwYXJlbnQgSUQgKHN3aXRjaCBJRCkgYW5kCi1hIGdyb3VwIGlmaW5kZXguCitUbyBhdm9pZCBkdXBsaWNhdGUgcGFja2V0cywgdGhlIHN3aXRjaCBkcml2ZXIgc2hvdWxkIG1hcmsgYSBwYWNrZXQgYXMgYWxyZWFkeQorZm9yd2FyZGVkIGJ5IHNldHRpbmcgdGhlIHNrYi0+b2ZmbG9hZF9md2RfbWFyayBiaXQuIFRoZSBicmlkZ2UgZHJpdmVyIHdpbGwgbWFyawordGhlIHNrYiB1c2luZyB0aGUgaW5ncmVzcyBicmlkZ2UgcG9ydCdzIG1hcmsgYW5kIHByZXZlbnQgaXQgZnJvbSBiZWluZyBmb3J3YXJkZWQKK3Rocm91Z2ggYW55IGJyaWRnZSBwb3J0IHdpdGggdGhlIHNhbWUgbWFyay4KIAogSXQgaXMgcG9zc2libGUgZm9yIHRoZSBzd2l0Y2ggZGV2aWNlIHRvIG5vdCBoYW5kbGUgZmxvb2RpbmcgYW5kIHB1c2ggdGhlCiBwYWNrZXRzIHVwIHRvIHRoZSBicmlkZ2UgZHJpdmVyIGZvciBmbG9vZGluZy4gIFRoaXMgaXMgbm90IGlkZWFsIGFzIHRoZSBudW1iZXIKQEAgLTMxOSwzMCArMzE0LDI5IEBACiBkb2VzIGEgbG9uZ2VzdCBwcmVmaXggbWF0Y2ggKExQTSkgb24gRklCIGVudHJpZXMgbWF0Y2hpbmcgcm91dGUgcHJlZml4IGFuZAogZm9yd2FyZHMgdGhlIHBhY2tldCB0byB0aGUgbWF0Y2hpbmcgRklCIGVudHJ5J3MgbmV4dGhvcChzKSBlZ3Jlc3MgcG9ydHMuCiAKLVRvIHByb2dyYW0gdGhlIGRldmljZSwgdGhlIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yCi1TV0lUQ0hERVZfT0JKX0lQVls0fDZdX0ZJQiBvYmplY3QgdXNpbmcgc3dpdGNoZGV2X3BvcnRfb2JqX3h4eCBvcHMuCi1zd2l0Y2hkZXZfcG9ydF9vYmpfYWRkIGlzIHVzZWQgZm9yIGJvdGggYWRkaW5nIGEgbmV3IEZJQiBlbnRyeSB0byB0aGUgZGV2aWNlLAotb3IgbW9kaWZ5aW5nIGFuIGV4aXN0aW5nIGVudHJ5IG9uIHRoZSBkZXZpY2UuCitUbyBwcm9ncmFtIHRoZSBkZXZpY2UsIHRoZSBkcml2ZXIgaGFzIHRvIHJlZ2lzdGVyIGEgRklCIG5vdGlmaWVyIGhhbmRsZXIKK3VzaW5nIHJlZ2lzdGVyX2ZpYl9ub3RpZmllci4gVGhlIGZvbGxvd2luZyBldmVudHMgYXJlIGF2YWlsYWJsZToKK0ZJQl9FVkVOVF9FTlRSWV9BREQ6IHVzZWQgZm9yIGJvdGggYWRkaW5nIGEgbmV3IEZJQiBlbnRyeSB0byB0aGUgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgb3IgbW9kaWZ5aW5nIGFuIGV4aXN0aW5nIGVudHJ5IG9uIHRoZSBkZXZpY2UuCitGSUJfRVZFTlRfRU5UUllfREVMOiB1c2VkIGZvciByZW1vdmluZyBhIEZJQiBlbnRyeQorRklCX0VWRU5UX1JVTEVfQURELCBGSUJfRVZFTlRfUlVMRV9ERUw6IHVzZWQgdG8gcHJvcGFnYXRlIEZJQiBydWxlIGNoYW5nZXMKIAotWFhYOiBDdXJyZW50bHksIG9ubHkgU1dJVENIREVWX09CSl9JRF9JUFY0X0ZJQiBvYmplY3RzIGFyZSBzdXBwb3J0ZWQuCitGSUJfRVZFTlRfRU5UUllfQUREIGFuZCBGSUJfRVZFTlRfRU5UUllfREVMIGV2ZW50cyBwYXNzOgogCi1TV0lUQ0hERVZfT0JKX0lEX0lQVjRfRklCIG9iamVjdCBwYXNzZXM6Ci0KLQlzdHJ1Y3Qgc3dpdGNoZGV2X29ial9pcHY0X2ZpYiB7ICAgICAgICAgLyogSVBWNF9GSUIgKi8KKwlzdHJ1Y3QgZmliX2VudHJ5X25vdGlmaWVyX2luZm8geworCQlzdHJ1Y3QgZmliX25vdGlmaWVyX2luZm8gaW5mbzsgLyogbXVzdCBiZSBmaXJzdCAqLwogCQl1MzIgZHN0OwogCQlpbnQgZHN0X2xlbjsKIAkJc3RydWN0IGZpYl9pbmZvICpmaTsKIAkJdTggdG9zOwogCQl1OCB0eXBlOwotCQl1MzIgbmxmbGFnczsKIAkJdTMyIHRiX2lkOwotCX0gaXB2NF9maWI7CisJCXUzMiBubGZsYWdzOworCX07CiAKIHRvIGFkZC9tb2RpZnkvZGVsZXRlIElQdjQgZHN0L2Rlc3RfbGVuIHByZWZpeCBvbiB0YWJsZSB0Yl9pZC4gIFRoZSAqZmkKIHN0cnVjdHVyZSBob2xkcyBkZXRhaWxzIG9uIHRoZSByb3V0ZSBhbmQgcm91dGUncyBuZXh0aG9wcy4gICpkZXYgaXMgb25lIG9mIHRoZQotcG9ydCBuZXRkZXZzIG1lbnRpb25lZCBpbiB0aGUgcm91dGVzIG5leHQgaG9wIGxpc3QuICBJZiB0aGUgb3V0cHV0IHBvcnQgbmV0ZGV2cwotcmVmZXJlbmNlZCBpbiB0aGUgcm91dGUncyBuZXh0aG9wIGxpc3QgZG9uJ3QgYWxsIGhhdmUgdGhlIHNhbWUgc3dpdGNoIElELCB0aGUKLWRyaXZlciBpcyBub3QgY2FsbGVkIHRvIGFkZC9tb2RpZnkvZGVsZXRlIHRoZSBGSUIgZW50cnkuCitwb3J0IG5ldGRldnMgbWVudGlvbmVkIGluIHRoZSByb3V0ZSdzIG5leHQgaG9wIGxpc3QuCiAKIFJvdXRlcyBvZmZsb2FkZWQgdG8gdGhlIGRldmljZSBhcmUgbGFiZWxlZCB3aXRoICJvZmZsb2FkIiBpbiB0aGUgaXAgcm91dGUKIGxpc3Rpbmc6CkBAIC0zNjAsNiArMzU0LDggQEAKIAkxMi4wLjAuNCB2aWEgMTEuMC4wLjkgZGV2IHN3MXAyICBwcm90byB6ZWJyYSAgbWV0cmljIDIwIG9mZmxvYWQKIAkxOTIuMTY4LjAuMC8yNCBkZXYgZXRoMCAgcHJvdG8ga2VybmVsICBzY29wZSBsaW5rICBzcmMgMTkyLjE2OC4wLjE1CiAKK1RoZSAib2ZmbG9hZCIgZmxhZyBpcyBzZXQgaW4gY2FzZSBhdCBsZWFzdCBvbmUgZGV2aWNlIG9mZmxvYWRzIHRoZSBGSUIgZW50cnkuCisKIFhYWDogYWRkL21vZC9kZWwgSVB2NiBGSUIgQVBJCiAKIE5leHRob3AgUmVzb2x1dGlvbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9iYXNpYy1wbS1kZWJ1Z2dpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9iYXNpYy1wbS1kZWJ1Z2dpbmcudHh0CmluZGV4IGI5NjA5OGMuLjcwOGY4N2YgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvYmFzaWMtcG0tZGVidWdnaW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2Jhc2ljLXBtLWRlYnVnZ2luZy50eHQKQEAgLTE2NCw3ICsxNjQsMzIgQEAKIEFnYWluLCBpZiB5b3UgZmluZCB0aGUgb2ZmZW5kaW5nIG1vZHVsZShzKSwgaXQodGhleSkgbXVzdCBiZSB1bmxvYWRlZCBldmVyeSB0aW1lCiBiZWZvcmUgaGliZXJuYXRpb24sIGFuZCBwbGVhc2UgcmVwb3J0IHRoZSBwcm9ibGVtIHdpdGggaXQodGhlbSkuCiAKLWMpIEFkdmFuY2VkIGRlYnVnZ2luZworYykgVXNpbmcgdGhlICJ0ZXN0X3Jlc3VtZSIgaGliZXJuYXRpb24gb3B0aW9uCisKKy9zeXMvcG93ZXIvZGlzayBnZW5lcmFsbHkgdGVsbHMgdGhlIGtlcm5lbCB3aGF0IHRvIGRvIGFmdGVyIGNyZWF0aW5nIGEKK2hpYmVybmF0aW9uIGltYWdlLiAgT25lIG9mIHRoZSBhdmFpbGFibGUgb3B0aW9ucyBpcyAidGVzdF9yZXN1bWUiIHdoaWNoCitjYXVzZXMgdGhlIGp1c3QgY3JlYXRlZCBpbWFnZSB0byBiZSB1c2VkIGZvciBpbW1lZGlhdGUgcmVzdG9yYXRpb24uICBOYW1lbHksCithZnRlciBkb2luZzoKKworIyBlY2hvIHRlc3RfcmVzdW1lID4gL3N5cy9wb3dlci9kaXNrCisjIGVjaG8gZGlzayA+IC9zeXMvcG93ZXIvc3RhdGUKKworYSBoaWJlcm5hdGlvbiBpbWFnZSB3aWxsIGJlIGNyZWF0ZWQgYW5kIGEgcmVzdW1lIGZyb20gaXQgd2lsbCBiZSB0cmlnZ2VyZWQKK2ltbWVkaWF0ZWx5IHdpdGhvdXQgaW52b2x2aW5nIHRoZSBwbGF0Zm9ybSBmaXJtd2FyZSBpbiBhbnkgd2F5LgorCitUaGF0IHRlc3QgY2FuIGJlIHVzZWQgdG8gY2hlY2sgaWYgZmFpbHVyZXMgdG8gcmVzdW1lIGZyb20gaGliZXJuYXRpb24gYXJlCityZWxhdGVkIHRvIGJhZCBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgcGxhdGZvcm0gZmlybXdhcmUuICBUaGF0IGlzLCBpZiB0aGUgYWJvdmUKK3dvcmtzIGV2ZXJ5IHRpbWUsIGJ1dCByZXN1bWUgZnJvbSBhY3R1YWwgaGliZXJuYXRpb24gZG9lcyBub3Qgd29yayBvciBpcwordW5yZWxpYWJsZSwgdGhlIHBsYXRmb3JtIGZpcm13YXJlIG1heSBiZSByZXNwb25zaWJsZSBmb3IgdGhlIGZhaWx1cmVzLgorCitPbiBhcmNoaXRlY3R1cmVzIGFuZCBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IHVzaW5nIGRpZmZlcmVudCBrZXJuZWxzIHRvIHJlc3RvcmUKK2hpYmVybmF0aW9uIGltYWdlcyAodGhhdCBpcywgdGhlIGtlcm5lbCB1c2VkIHRvIHJlYWQgdGhlIGltYWdlIGZyb20gc3RvcmFnZSBhbmQKK2xvYWQgaXQgaW50byBtZW1vcnkgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9uZSBpbmNsdWRlZCBpbiB0aGUgaW1hZ2UpIG9yIHN1cHBvcnQKK2tlcm5lbCBhZGRyZXNzIHNwYWNlIHJhbmRvbWl6YXRpb24sIGl0IGFsc28gY2FuIGJlIHVzZWQgdG8gY2hlY2sgaWYgZmFpbHVyZXMKK3RvIHJlc3VtZSBtYXkgYmUgcmVsYXRlZCB0byB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgcmVzdG9yZSBhbmQgaW1hZ2UKK2tlcm5lbHMuCisKK2QpIEFkdmFuY2VkIGRlYnVnZ2luZwogCiBJbiBjYXNlIHRoYXQgaGliZXJuYXRpb24gZG9lcyBub3Qgd29yayBvbiB5b3VyIHN5c3RlbSBldmVuIGluIHRoZSBtaW5pbWFsCiBjb25maWd1cmF0aW9uIGFuZCBjb21waWxpbmcgbW9yZSBkcml2ZXJzIGFzIG1vZHVsZXMgaXMgbm90IHByYWN0aWNhbCBvciBzb21lCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2ludGVyZmFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2ludGVyZmFjZS50eHQKaW5kZXggZjFmMGY1OWEuLjk3NDkxNmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvaW50ZXJmYWNlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2ludGVyZmFjZS50eHQKQEAgLTEsNzUgKzEsNzYgQEAKLVBvd2VyIE1hbmFnZW1lbnQgSW50ZXJmYWNlCitQb3dlciBNYW5hZ2VtZW50IEludGVyZmFjZSBmb3IgU3lzdGVtIFNsZWVwCiAKK0NvcHlyaWdodCAoYykgMjAxNiBJbnRlbCBDb3JwLiwgUmFmYWVsIEouIFd5c29ja2kgPHJhZmFlbC5qLnd5c29ja2lAaW50ZWwuY29tPgogCi1UaGUgcG93ZXIgbWFuYWdlbWVudCBzdWJzeXN0ZW0gcHJvdmlkZXMgYSB1bmlmaWVkIHN5c2ZzIGludGVyZmFjZSB0byAKLXVzZXJzcGFjZSwgcmVnYXJkbGVzcyBvZiB3aGF0IGFyY2hpdGVjdHVyZSBvciBwbGF0Zm9ybSBvbmUgaXMKLXJ1bm5pbmcuIFRoZSBpbnRlcmZhY2UgZXhpc3RzIGluIC9zeXMvcG93ZXIvIGRpcmVjdG9yeSAoYXNzdW1pbmcgc3lzZnMKLWlzIG1vdW50ZWQgYXQgL3N5cykuIAorVGhlIHBvd2VyIG1hbmFnZW1lbnQgc3Vic3lzdGVtIHByb3ZpZGVzIHVzZXJzcGFjZSB3aXRoIGEgdW5pZmllZCBzeXNmcyBpbnRlcmZhY2UKK2ZvciBzeXN0ZW0gc2xlZXAgcmVnYXJkbGVzcyBvZiB0aGUgdW5kZXJseWluZyBzeXN0ZW0gYXJjaGl0ZWN0dXJlIG9yIHBsYXRmb3JtLgorVGhlIGludGVyZmFjZSBpcyBsb2NhdGVkIGluIHRoZSAvc3lzL3Bvd2VyLyBkaXJlY3RvcnkgKGFzc3VtaW5nIHRoYXQgc3lzZnMgaXMKK21vdW50ZWQgYXQgL3N5cykuCiAKLS9zeXMvcG93ZXIvc3RhdGUgY29udHJvbHMgc3lzdGVtIHBvd2VyIHN0YXRlLiBSZWFkaW5nIGZyb20gdGhpcyBmaWxlCi1yZXR1cm5zIHdoYXQgc3RhdGVzIGFyZSBzdXBwb3J0ZWQsIHdoaWNoIGlzIGhhcmQtY29kZWQgdG8gJ2ZyZWV6ZScsCi0nc3RhbmRieScgKFBvd2VyLU9uIFN1c3BlbmQpLCAnbWVtJyAoU3VzcGVuZC10by1SQU0pLCBhbmQgJ2Rpc2snCi0oU3VzcGVuZC10by1EaXNrKS4gCisvc3lzL3Bvd2VyL3N0YXRlIGlzIHRoZSBzeXN0ZW0gc2xlZXAgc3RhdGUgY29udHJvbCBmaWxlLgogCi1Xcml0aW5nIHRvIHRoaXMgZmlsZSBvbmUgb2YgdGhvc2Ugc3RyaW5ncyBjYXVzZXMgdGhlIHN5c3RlbSB0bwotdHJhbnNpdGlvbiBpbnRvIHRoYXQgc3RhdGUuIFBsZWFzZSBzZWUgdGhlIGZpbGUKLURvY3VtZW50YXRpb24vcG93ZXIvc3RhdGVzLnR4dCBmb3IgYSBkZXNjcmlwdGlvbiBvZiBlYWNoIG9mIHRob3NlCi1zdGF0ZXMuCitSZWFkaW5nIGZyb20gaXQgcmV0dXJucyBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHNsZWVwIHN0YXRlcywgZW5jb2RlZCBhczoKIAorJ2ZyZWV6ZScgKFN1c3BlbmQtdG8tSWRsZSkKKydzdGFuZGJ5JyAoUG93ZXItT24gU3VzcGVuZCkKKydtZW0nIChTdXNwZW5kLXRvLVJBTSkKKydkaXNrJyAoU3VzcGVuZC10by1EaXNrKQogCi0vc3lzL3Bvd2VyL2Rpc2sgY29udHJvbHMgdGhlIG9wZXJhdGluZyBtb2RlIG9mIHRoZSBzdXNwZW5kLXRvLWRpc2sKLW1lY2hhbmlzbS4gU3VzcGVuZC10by1kaXNrIGNhbiBiZSBoYW5kbGVkIGluIHNldmVyYWwgd2F5cy4gV2UgaGF2ZSBhCi1mZXcgb3B0aW9ucyBmb3IgcHV0dGluZyB0aGUgc3lzdGVtIHRvIHNsZWVwIC0gdXNpbmcgdGhlIHBsYXRmb3JtIGRyaXZlcgotKGUuZy4gQUNQSSBvciBvdGhlciBzdXNwZW5kX29wcyksIHBvd2VyaW5nIG9mZiB0aGUgc3lzdGVtIG9yIHJlYm9vdGluZyB0aGUKLXN5c3RlbSAoZm9yIHRlc3RpbmcpLgorU3VzcGVuZC10by1JZGxlIGlzIGFsd2F5cyBzdXBwb3J0ZWQuICBTdXNwZW5kLXRvLURpc2sgaXMgYWx3YXlzIHN1cHBvcnRlZAordG9vIGFzIGxvbmcgdGhlIGtlcm5lbCBoYXMgYmVlbiBjb25maWd1cmVkIHRvIHN1cHBvcnQgaGliZXJuYXRpb24gYXQgYWxsCisoaWUuIENPTkZJR19ISUJFUk5BVElPTiBpcyBzZXQgaW4gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIGZpbGUpLiAgU3VwcG9ydAorZm9yIFN1c3BlbmQtdG8tUkFNIGFuZCBQb3dlci1PbiBTdXNwZW5kIGRlcGVuZHMgb24gdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUKK3BsYXRmb3JtLgogCi1BZGRpdGlvbmFsbHksIC9zeXMvcG93ZXIvZGlzayBjYW4gYmUgdXNlZCB0byB0dXJuIG9uIG9uZSBvZiB0aGUgdHdvIHRlc3RpbmcKLW1vZGVzIG9mIHRoZSBzdXNwZW5kLXRvLWRpc2sgbWVjaGFuaXNtOiAndGVzdHByb2MnIG9yICd0ZXN0Jy4gIElmIHRoZQotc3VzcGVuZC10by1kaXNrIG1lY2hhbmlzbSBpcyBpbiB0aGUgJ3Rlc3Rwcm9jJyBtb2RlLCB3cml0aW5nICdkaXNrJyB0bwotL3N5cy9wb3dlci9zdGF0ZSB3aWxsIGNhdXNlIHRoZSBrZXJuZWwgdG8gZGlzYWJsZSBub25ib290IENQVXMgYW5kIGZyZWV6ZQotdGFza3MsIHdhaXQgZm9yIDUgc2Vjb25kcywgdW5mcmVlemUgdGFza3MgYW5kIGVuYWJsZSBub25ib290IENQVXMuICBJZiBpdCBpcwotaW4gdGhlICd0ZXN0JyBtb2RlLCB3cml0aW5nICdkaXNrJyB0byAvc3lzL3Bvd2VyL3N0YXRlIHdpbGwgY2F1c2UgdGhlIGtlcm5lbAotdG8gZGlzYWJsZSBub25ib290IENQVXMgYW5kIGZyZWV6ZSB0YXNrcywgc2hyaW5rIG1lbW9yeSwgc3VzcGVuZCBkZXZpY2VzLCB3YWl0Ci1mb3IgNSBzZWNvbmRzLCByZXN1bWUgZGV2aWNlcywgdW5mcmVlemUgdGFza3MgYW5kIGVuYWJsZSBub25ib290IENQVXMuICBUaGVuLAotd2UgYXJlIGFibGUgdG8gbG9vayBpbiB0aGUgbG9nIG1lc3NhZ2VzIGFuZCB3b3JrIG91dCwgZm9yIGV4YW1wbGUsIHdoaWNoIGNvZGUKLWlzIGJlaW5nIHNsb3cgYW5kIHdoaWNoIGRldmljZSBkcml2ZXJzIGFyZSBtaXNiZWhhdmluZy4KK0lmIG9uZSBvZiB0aGUgc3RyaW5ncyBsaXN0ZWQgaW4gL3N5cy9wb3dlci9zdGF0ZSBpcyB3cml0dGVuIHRvIGl0LCB0aGUgc3lzdGVtCit3aWxsIGF0dGVtcHQgdG8gdHJhbnNpdGlvbiBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIHNsZWVwIHN0YXRlLiAgUmVmZXIgdG8KK0RvY3VtZW50YXRpb24vcG93ZXIvc3RhdGVzLnR4dCBmb3IgYSBkZXNjcmlwdGlvbiBvZiBlYWNoIG9mIHRob3NlIHN0YXRlcy4KIAotUmVhZGluZyBmcm9tIHRoaXMgZmlsZSB3aWxsIGRpc3BsYXkgYWxsIHN1cHBvcnRlZCBtb2RlcyBhbmQgdGhlIGN1cnJlbnRseQotc2VsZWN0ZWQgb25lIGluIGJyYWNrZXRzLCBmb3IgZXhhbXBsZQorL3N5cy9wb3dlci9kaXNrIGNvbnRyb2xzIHRoZSBvcGVyYXRpbmcgbW9kZSBvZiBoaWJlcm5hdGlvbiAoU3VzcGVuZC10by1EaXNrKS4KK1NwZWNpZmljYWxseSwgaXQgdGVsbHMgdGhlIGtlcm5lbCB3aGF0IHRvIGRvIGFmdGVyIGNyZWF0aW5nIGEgaGliZXJuYXRpb24gaW1hZ2UuCiAKLQlbc2h1dGRvd25dIHJlYm9vdCB0ZXN0IHRlc3Rwcm9jCitSZWFkaW5nIGZyb20gaXQgcmV0dXJucyBhIGxpc3Qgb2Ygc3VwcG9ydGVkIG9wdGlvbnMgZW5jb2RlZCBhczoKIAotV3JpdGluZyB0byB0aGlzIGZpbGUgd2lsbCBhY2NlcHQgb25lIG9mCisncGxhdGZvcm0nIChwdXQgdGhlIHN5c3RlbSBpbnRvIHNsZWVwIHVzaW5nIGEgcGxhdGZvcm0tcHJvdmlkZWQgbWV0aG9kKQorJ3NodXRkb3duJyAoc2h1dCB0aGUgc3lzdGVtIGRvd24pCisncmVib290JyAocmVib290IHRoZSBzeXN0ZW0pCisnc3VzcGVuZCcgKHRyaWdnZXIgYSBTdXNwZW5kLXRvLVJBTSB0cmFuc2l0aW9uKQorJ3Rlc3RfcmVzdW1lJyAocmVzdW1lLWFmdGVyLWhpYmVybmF0aW9uIHRlc3QgbW9kZSkKIAotICAgICAgICdwbGF0Zm9ybScgKG9ubHkgaWYgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIGl0KQotICAgICAgICdzaHV0ZG93bicKLSAgICAgICAncmVib290JwotICAgICAgICd0ZXN0cHJvYycKLSAgICAgICAndGVzdCcKK1RoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uIGlzIHByaW50ZWQgaW4gc3F1YXJlIGJyYWNrZXRzLgogCi0vc3lzL3Bvd2VyL2ltYWdlX3NpemUgY29udHJvbHMgdGhlIHNpemUgb2YgdGhlIGltYWdlIGNyZWF0ZWQgYnkKLXRoZSBzdXNwZW5kLXRvLWRpc2sgbWVjaGFuaXNtLiAgSXQgY2FuIGJlIHdyaXR0ZW4gYSBzdHJpbmcKLXJlcHJlc2VudGluZyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGFuIHVwcGVyCi1saW1pdCBvZiB0aGUgaW1hZ2Ugc2l6ZSwgaW4gYnl0ZXMuICBUaGUgc3VzcGVuZC10by1kaXNrIG1lY2hhbmlzbSB3aWxsCi1kbyBpdHMgYmVzdCB0byBlbnN1cmUgdGhlIGltYWdlIHNpemUgd2lsbCBub3QgZXhjZWVkIHRoYXQgbnVtYmVyLiAgSG93ZXZlciwKLWlmIHRoaXMgdHVybnMgb3V0IHRvIGJlIGltcG9zc2libGUsIGl0IHdpbGwgdHJ5IHRvIHN1c3BlbmQgYW55d2F5IHVzaW5nIHRoZQotc21hbGxlc3QgaW1hZ2UgcG9zc2libGUuICBJbiBwYXJ0aWN1bGFyLCBpZiAiMCIgaXMgd3JpdHRlbiB0byB0aGlzIGZpbGUsIHRoZQotc3VzcGVuZCBpbWFnZSB3aWxsIGJlIGFzIHNtYWxsIGFzIHBvc3NpYmxlLgorVGhlICdwbGF0Zm9ybScgb3B0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIGlmIHRoZSBwbGF0Zm9ybSBwcm92aWRlcyBhIHNwZWNpYWwKK21lY2hhbmlzbSB0byBwdXQgdGhlIHN5c3RlbSB0byBzbGVlcCBhZnRlciBjcmVhdGluZyBhIGhpYmVybmF0aW9uIGltYWdlIChBQ1BJCitkb2VzIHRoYXQsIGZvciBleGFtcGxlKS4gIFRoZSAnc3VzcGVuZCcgb3B0aW9uIGlzIGF2YWlsYWJsZSBpZiBTdXNwZW5kLXRvLVJBTQoraXMgc3VwcG9ydGVkLiAgUmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9wb3dlci9iYXNpY19wbV9kZWJ1Z2dpbmcudHh0IGZvciB0aGUKK2Rlc2NyaXB0aW9uIG9mIHRoZSAndGVzdF9yZXN1bWUnIG9wdGlvbi4KIAotUmVhZGluZyBmcm9tIHRoaXMgZmlsZSB3aWxsIGRpc3BsYXkgdGhlIGN1cnJlbnQgaW1hZ2Ugc2l6ZSBsaW1pdCwgd2hpY2gKLWlzIHNldCB0byAyLzUgb2YgYXZhaWxhYmxlIFJBTSBieSBkZWZhdWx0LgorVG8gc2VsZWN0IGFuIG9wdGlvbiwgd3JpdGUgdGhlIHN0cmluZyByZXByZXNlbnRpbmcgaXQgdG8gL3N5cy9wb3dlci9kaXNrLgogCi0vc3lzL3Bvd2VyL3BtX3RyYWNlIGNvbnRyb2xzIHRoZSBjb2RlIHdoaWNoIHNhdmVzIHRoZSBsYXN0IFBNIGV2ZW50IHBvaW50IGluCi10aGUgUlRDIGFjcm9zcyByZWJvb3RzLCBzbyB0aGF0IHlvdSBjYW4gZGVidWcgYSBtYWNoaW5lIHRoYXQganVzdCBoYW5ncwotZHVyaW5nIHN1c3BlbmQgKG9yIG1vcmUgY29tbW9ubHksIGR1cmluZyByZXN1bWUpLiAgTmFtZWx5LCB0aGUgUlRDIGlzIG9ubHkKLXVzZWQgdG8gc2F2ZSB0aGUgbGFzdCBQTSBldmVudCBwb2ludCBpZiB0aGlzIGZpbGUgY29udGFpbnMgJzEnLiAgSW5pdGlhbGx5IGl0Ci1jb250YWlucyAnMCcgd2hpY2ggbWF5IGJlIGNoYW5nZWQgdG8gJzEnIGJ5IHdyaXRpbmcgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEKLW5vbnplcm8gaW50ZWdlciBpbnRvIGl0LgorL3N5cy9wb3dlci9pbWFnZV9zaXplIGNvbnRyb2xzIHRoZSBzaXplIG9mIGhpYmVybmF0aW9uIGltYWdlcy4KIAotVG8gdXNlIHRoaXMgZGVidWdnaW5nIGZlYXR1cmUgeW91IHNob3VsZCBhdHRlbXB0IHRvIHN1c3BlbmQgdGhlIG1hY2hpbmUsIHRoZW4KLXJlYm9vdCBpdCBhbmQgcnVuCitJdCBjYW4gYmUgd3JpdHRlbiBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBub24tbmVnYXRpdmUgaW50ZWdlciB0aGF0IHdpbGwgYmUKK3VzZWQgYXMgYSBiZXN0LWVmZm9ydCB1cHBlciBsaW1pdCBvZiB0aGUgaW1hZ2Ugc2l6ZSwgaW4gYnl0ZXMuICBUaGUgaGliZXJuYXRpb24KK2NvcmUgd2lsbCBkbyBpdHMgYmVzdCB0byBlbnN1cmUgdGhhdCB0aGUgaW1hZ2Ugc2l6ZSB3aWxsIG5vdCBleGNlZWQgdGhhdCBudW1iZXIuCitIb3dldmVyLCBpZiB0aGF0IHR1cm5zIG91dCB0byBiZSBpbXBvc3NpYmxlIHRvIGFjaGlldmUsIGEgaGliZXJuYXRpb24gaW1hZ2Ugd2lsbAorc3RpbGwgYmUgY3JlYXRlZCBhbmQgaXRzIHNpemUgd2lsbCBiZSBhcyBzbWFsbCBhcyBwb3NzaWJsZS4gIEluIHBhcnRpY3VsYXIsCit3cml0aW5nICcwJyB0byB0aGlzIGZpbGUgd2lsbCBlbmZvcmNlIGhpYmVybmF0aW9uIGltYWdlcyB0byBiZSBhcyBzbWFsbCBhcworcG9zc2libGUuCiAKLQlkbWVzZyAtcyAxMDAwMDAwIHwgZ3JlcCAnaGFzaCBtYXRjaGVzJworUmVhZGluZyBmcm9tIHRoaXMgZmlsZSByZXR1cm5zIHRoZSBjdXJyZW50IGltYWdlIHNpemUgbGltaXQsIHdoaWNoIGlzIHNldCB0bworYXJvdW5kIDIvNSBvZiBhdmFpbGFibGUgUkFNIGJ5IGRlZmF1bHQuCiAKLUNBVVRJT046IFVzaW5nIGl0IHdpbGwgY2F1c2UgeW91ciBtYWNoaW5lJ3MgcmVhbC10aW1lIChDTU9TKSBjbG9jayB0byBiZQotc2V0IHRvIGEgcmFuZG9tIGludmFsaWQgdGltZSBhZnRlciBhIHJlc3VtZS4KKy9zeXMvcG93ZXIvcG1fdHJhY2UgY29udHJvbHMgdGhlIFBNIHRyYWNlIG1lY2hhbmlzbSBzYXZpbmcgdGhlIGxhc3Qgc3VzcGVuZAorb3IgcmVzdW1lIGV2ZW50IHBvaW50IGluIHRoZSBSVEMgYWNyb3NzIHJlYm9vdHMuCisKK0l0IGhlbHBzIHRvIGRlYnVnIGhhcmQgbG9ja3VwcyBvciByZWJvb3RzIGR1ZSB0byBkZXZpY2UgZHJpdmVyIGZhaWx1cmVzIHRoYXQKK29jY3VyIGR1cmluZyBzeXN0ZW0gc3VzcGVuZCBvciByZXN1bWUgKHdoaWNoIGlzIG1vcmUgY29tbW9uKSBtb3JlIGVmZmVjdGl2ZWx5LgorCitJZiAvc3lzL3Bvd2VyL3BtX3RyYWNlIGNvbnRhaW5zICcxJywgdGhlIGZpbmdlcnByaW50IG9mIGVhY2ggc3VzcGVuZC9yZXN1bWUKK2V2ZW50IHBvaW50IGluIHR1cm4gd2lsbCBiZSBzdG9yZWQgaW4gdGhlIFJUQyBtZW1vcnkgKG92ZXJ3cml0aW5nIHRoZSBhY3R1YWwKK1JUQyBpbmZvcm1hdGlvbiksIHNvIGl0IHdpbGwgc3Vydml2ZSBhIHN5c3RlbSBjcmFzaCBpZiBvbmUgb2NjdXJzIHJpZ2h0IGFmdGVyCitzdG9yaW5nIGl0IGFuZCBpdCBjYW4gYmUgdXNlZCBsYXRlciB0byBpZGVudGlmeSB0aGUgZHJpdmVyIHRoYXQgY2F1c2VkIHRoZSBjcmFzaAordG8gaGFwcGVuIChzZWUgRG9jdW1lbnRhdGlvbi9wb3dlci9zMnJhbS50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24pLgorCitJbml0aWFsbHkgaXQgY29udGFpbnMgJzAnIHdoaWNoIG1heSBiZSBjaGFuZ2VkIHRvICcxJyBieSB3cml0aW5nIGEgc3RyaW5nCityZXByZXNlbnRpbmcgYSBub256ZXJvIGludGVnZXIgaW50byBpdC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy90cmFuc2FjdGlvbmFsX21lbW9yeS50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvdHJhbnNhY3Rpb25hbF9tZW1vcnkudHh0CmluZGV4IGJhMGEyYTQuLmUzMmZkYmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy90cmFuc2FjdGlvbmFsX21lbW9yeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL3RyYW5zYWN0aW9uYWxfbWVtb3J5LnR4dApAQCAtMTY3LDYgKzE2Nyw4IEBACiBGb3Igc2lnbmFscyB0YWtlbiBpbiBub24tVE0gb3Igc3VzcGVuZGVkIG1vZGUsIHdlIHVzZSB0aGUKIG5vcm1hbC9ub24tY2hlY2twb2ludGVkIHN0YWNrIHBvaW50ZXIuCiAKK0FueSB0cmFuc2FjdGlvbiBpbml0aWF0ZWQgaW5zaWRlIGEgc2lnaGFuZGxlciBhbmQgc3VzcGVuZGVkIG9uIHJldHVybgorZnJvbSB0aGUgc2lnaGFuZGxlciB0byB0aGUga2VybmVsIHdpbGwgZ2V0IHJlY2xhaW1lZCBhbmQgZGlzY2FyZGVkLgogCiBGYWlsdXJlIGNhdXNlIGNvZGVzIHVzZWQgYnkga2VybmVsCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3JhcGlkaW8vbXBvcnRfY2Rldi50eHQgYi9Eb2N1bWVudGF0aW9uL3JhcGlkaW8vbXBvcnRfY2Rldi50eHQKaW5kZXggNmU0OTFhNi4uYTUzZjc4NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9yYXBpZGlvL21wb3J0X2NkZXYudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcmFwaWRpby9tcG9ydF9jZGV2LnR4dApAQCAtODAsNiArODAsMTAgQEAKIAogSUlJLiBNb2R1bGUgcGFyYW1ldGVycwogCistICdkbWFfdGltZW91dCcgLSBETUEgdHJhbnNmZXIgY29tcGxldGlvbiB0aW1lb3V0IChpbiBtc2VjLCBkZWZhdWx0IHZhbHVlIDMwMDApLgorICAgICAgICBUaGlzIHBhcmFtZXRlciBzZXQgYSBtYXhpbXVtIGNvbXBsZXRpb24gd2FpdCB0aW1lIGZvciBTWU5DIG1vZGUgRE1BCisgICAgICAgIHRyYW5zZmVyIHJlcXVlc3RzIGFuZCBmb3IgUklPX1dBSVRfRk9SX0FTWU5DIGlvY3RsIHJlcXVlc3RzLgorCiAtICdkYmdfbGV2ZWwnIC0gVGhpcyBwYXJhbWV0ZXIgYWxsb3dzIHRvIGNvbnRyb2wgYW1vdW50IG9mIGRlYnVnIGluZm9ybWF0aW9uCiAgICAgICAgIGdlbmVyYXRlZCBieSB0aGlzIGRldmljZSBkcml2ZXIuIFRoaXMgcGFyYW1ldGVyIGlzIGZvcm1lZCBieSBzZXQgb2YKICAgICAgICAgYml0IG1hc2tzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgc3BlY2lmaWMgZnVuY3Rpb25hbCBibG9ja3MuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZWFkbGluZS50eHQgYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZWFkbGluZS50eHQKaW5kZXggNTNhMmZlMS4uOGUzN2IwYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZGVhZGxpbmUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLWRlYWRsaW5lLnR4dApAQCAtMTYsNiArMTYsNyBAQAogICAgNC4xIFN5c3RlbS13aWRlIHNldHRpbmdzCiAgICA0LjIgVGFzayBpbnRlcmZhY2UKICAgIDQuMyBEZWZhdWx0IGJlaGF2aW9yCisgICA0LjQgQmVoYXZpb3Igb2Ygc2NoZWRfeWllbGQoKQogIDUuIFRhc2tzIENQVSBhZmZpbml0eQogICAgNS4xIFNDSEVEX0RFQURMSU5FIGFuZCBjcHVzZXRzIEhPV1RPCiAgNi4gRnV0dXJlIHBsYW5zCkBAIC00MjYsNiArNDI3LDIzIEBACiAgRmluYWxseSwgbm90aWNlIHRoYXQgaW4gb3JkZXIgbm90IHRvIGplb3BhcmRpemUgdGhlIGFkbWlzc2lvbiBjb250cm9sIGEKICAtZGVhZGxpbmUgdGFzayBjYW5ub3QgZm9yay4KIAorCis0LjQgQmVoYXZpb3Igb2Ygc2NoZWRfeWllbGQoKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIFdoZW4gYSBTQ0hFRF9ERUFETElORSB0YXNrIGNhbGxzIHNjaGVkX3lpZWxkKCksIGl0IGdpdmVzIHVwIGl0cworIHJlbWFpbmluZyBydW50aW1lIGFuZCBpcyBpbW1lZGlhdGVseSB0aHJvdHRsZWQsIHVudGlsIHRoZSBuZXh0CisgcGVyaW9kLCB3aGVuIGl0cyBydW50aW1lIHdpbGwgYmUgcmVwbGVuaXNoZWQgKGEgc3BlY2lhbCBmbGFnCisgZGxfeWllbGRlZCBpcyBzZXQgYW5kIHVzZWQgdG8gaGFuZGxlIGNvcnJlY3RseSB0aHJvdHRsaW5nIGFuZCBydW50aW1lCisgcmVwbGVuaXNobWVudCBhZnRlciBhIGNhbGwgdG8gc2NoZWRfeWllbGQoKSkuCisKKyBUaGlzIGJlaGF2aW9yIG9mIHNjaGVkX3lpZWxkKCkgYWxsb3dzIHRoZSB0YXNrIHRvIHdha2UtdXAgZXhhY3RseSBhdAorIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgcGVyaW9kLiBBbHNvLCB0aGlzIG1heSBiZSB1c2VmdWwgaW4gdGhlCisgZnV0dXJlIHdpdGggYmFuZHdpZHRoIHJlY2xhaW1pbmcgbWVjaGFuaXNtcywgd2hlcmUgc2NoZWRfeWllbGQoKSB3aWxsCisgbWFrZSB0aGUgbGVmdG9ldmVyIHJ1bnRpbWUgYXZhaWxhYmxlIGZvciByZWNsYW1hdGlvbiBieSBvdGhlcgorIFNDSEVEX0RFQURMSU5FIHRhc2tzLgorCisKIDUuIFRhc2tzIENQVSBhZmZpbml0eQogPT09PT09PT09PT09PT09PT09PT09CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2ktcGFyYW1ldGVycy50eHQKaW5kZXggMTI0MWFjMS4uZDVhZTZjZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2ktcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2ktcGFyYW1ldGVycy50eHQKQEAgLTc5LDggKzc5LDYgQEAKIAogCW5jcjUzYzh4eD0JW0hXLFNDU0ldCiAKLQlub2Rpc2Nvbm5lY3QJW0hXLFNDU0ksTTY4S10gRGlzYWJsZXMgU0NTSSBkaXNjb25uZWN0cy4KLQogCW9zc3Q9CQlbSFcsU0NTSV0gU0NTSSBUYXBlIERyaXZlcgogCQkJRm9ybWF0OiA8YnVmZmVyX3NpemU+LDx3cml0ZV90aHJlc2hvbGQ+CiAJCQlTZWUgYWxzbyBEb2N1bWVudGF0aW9uL3Njc2kvc3QudHh0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zZXJpYWwvc2VyaWFsLXJzNDg1LnR4dCBiL0RvY3VtZW50YXRpb24vc2VyaWFsL3NlcmlhbC1yczQ4NS50eHQKaW5kZXggMjI1M2I4Yi4uMzg5ZmNkNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zZXJpYWwvc2VyaWFsLXJzNDg1LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NlcmlhbC9zZXJpYWwtcnM0ODUudHh0CkBAIC00NSw5ICs0NSw4IEBACiAKIAkjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAKLQkvKiBSUzQ4NSBpb2N0bHM6ICovCi0JI2RlZmluZSBUSU9DR1JTNDg1ICAgICAgMHg1NDJFCi0JI2RlZmluZSBUSU9DU1JTNDg1ICAgICAgMHg1NDJGCisJLyogSW5jbHVkZSBkZWZpbml0aW9uIGZvciBSUzQ4NSBpb2N0bHM6IFRJT0NHUlM0ODUgYW5kIFRJT0NTUlM0ODUgKi8KKwkjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAKIAkvKiBPcGVuIHlvdXIgc3BlY2lmaWMgZGV2aWNlIChlLmcuLCAvZGV2L215ZGV2aWNlKTogKi8KIAlpbnQgZmQgPSBvcGVuICgiL2Rldi9teWRldmljZSIsIE9fUkRXUik7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwYXJzZS50eHQgYi9Eb2N1bWVudGF0aW9uL3NwYXJzZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZWFiMTMuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGFyc2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLUNvcHlyaWdodCAyMDA0IExpbnVzIFRvcnZhbGRzCi1Db3B5cmlnaHQgMjAwNCBQYXZlbCBNYWNoZWsgPHBhdmVsQHVjdy5jej4KLUNvcHlyaWdodCAyMDA2IEJvYiBDb3BlbGFuZCA8bWVAYm9iY29wZWxhbmQuY29tPgotCi1Vc2luZyBzcGFyc2UgZm9yIHR5cGVjaGVja2luZwotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotIl9fYml0d2lzZSIgaXMgYSB0eXBlIGF0dHJpYnV0ZSwgc28geW91IGhhdmUgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhpczoKLQotICAgICAgICB0eXBlZGVmIGludCBfX2JpdHdpc2UgcG1fcmVxdWVzdF90OwotCi0gICAgICAgIGVudW0gcG1fcmVxdWVzdCB7Ci0gICAgICAgICAgICAgICAgUE1fU1VTUEVORCA9IChfX2ZvcmNlIHBtX3JlcXVlc3RfdCkgMSwKLSAgICAgICAgICAgICAgICBQTV9SRVNVTUUgPSAoX19mb3JjZSBwbV9yZXF1ZXN0X3QpIDIKLSAgICAgICAgfTsKLQotd2hpY2ggbWFrZXMgUE1fU1VTUEVORCBhbmQgUE1fUkVTVU1FICJiaXR3aXNlIiBpbnRlZ2VycyAodGhlICJfX2ZvcmNlIiBpcwotdGhlcmUgYmVjYXVzZSBzcGFyc2Ugd2lsbCBjb21wbGFpbiBhYm91dCBjYXN0aW5nIHRvL2Zyb20gYSBiaXR3aXNlIHR5cGUsCi1idXQgaW4gdGhpcyBjYXNlIHdlIHJlYWxseSBfZG9fIHdhbnQgdG8gZm9yY2UgdGhlIGNvbnZlcnNpb24pLiBBbmQgYmVjYXVzZQotdGhlIGVudW0gdmFsdWVzIGFyZSBhbGwgdGhlIHNhbWUgdHlwZSwgbm93ICJlbnVtIHBtX3JlcXVlc3QiIHdpbGwgYmUgdGhhdAotdHlwZSB0b28uCi0KLUFuZCB3aXRoIGdjYywgYWxsIHRoZSBfX2JpdHdpc2UvX19mb3JjZSBzdHVmZiBnb2VzIGF3YXksIGFuZCBpdCBhbGwgZW5kcwotdXAgbG9va2luZyBqdXN0IGxpa2UgaW50ZWdlcnMgdG8gZ2NjLgotCi1RdWl0ZSBmcmFua2x5LCB5b3UgZG9uJ3QgbmVlZCB0aGUgZW51bSB0aGVyZS4gVGhlIGFib3ZlIGFsbCByZWFsbHkganVzdAotYm9pbHMgZG93biB0byBvbmUgc3BlY2lhbCAiaW50IF9fYml0d2lzZSIgdHlwZS4KLQotU28gdGhlIHNpbXBsZXIgd2F5IGlzIHRvIGp1c3QgZG8KLQotICAgICAgICB0eXBlZGVmIGludCBfX2JpdHdpc2UgcG1fcmVxdWVzdF90OwotCi0gICAgICAgICNkZWZpbmUgUE1fU1VTUEVORCAoKF9fZm9yY2UgcG1fcmVxdWVzdF90KSAxKQotICAgICAgICAjZGVmaW5lIFBNX1JFU1VNRSAoKF9fZm9yY2UgcG1fcmVxdWVzdF90KSAyKQotCi1hbmQgeW91IG5vdyBoYXZlIGFsbCB0aGUgaW5mcmFzdHJ1Y3R1cmUgbmVlZGVkIGZvciBzdHJpY3QgdHlwZWNoZWNraW5nLgotCi1PbmUgc21hbGwgbm90ZTogdGhlIGNvbnN0YW50IGludGVnZXIgIjAiIGlzIHNwZWNpYWwuIFlvdSBjYW4gdXNlIGEKLWNvbnN0YW50IHplcm8gYXMgYSBiaXR3aXNlIGludGVnZXIgdHlwZSB3aXRob3V0IHNwYXJzZSBldmVyIGNvbXBsYWluaW5nLgotVGhpcyBpcyBiZWNhdXNlICJiaXR3aXNlIiAoYXMgdGhlIG5hbWUgaW1wbGllcykgd2FzIGRlc2lnbmVkIGZvciBtYWtpbmcKLXN1cmUgdGhhdCBiaXR3aXNlIHR5cGVzIGRvbid0IGdldCBtaXhlZCB1cCAobGl0dGxlLWVuZGlhbiB2cyBiaWctZW5kaWFuCi12cyBjcHUtZW5kaWFuIHZzIHdoYXRldmVyKSwgYW5kIHRoZXJlIHRoZSBjb25zdGFudCAiMCIgcmVhbGx5IF9pc18KLXNwZWNpYWwuCi0KLV9fYml0d2lzZV9fIC0gdG8gYmUgdXNlZCBmb3IgcmVsYXRpdmVseSBjb21wYWN0IHN0dWZmIChnZnBfdCwgZXRjLikgdGhhdAotaXMgbW9zdGx5IHdhcm5pbmctZnJlZSBhbmQgaXMgc3VwcG9zZWQgdG8gc3RheSB0aGF0IHdheS4gIFdhcm5pbmdzIHdpbGwKLWJlIGdlbmVyYXRlZCB3aXRob3V0IF9fQ0hFQ0tfRU5ESUFOX18uCi0KLV9fYml0d2lzZSAtIG5vaXN5IHN0dWZmOyBpbiBwYXJ0aWN1bGFyLCBfX2xlKi9fX2JlKiBhcmUgdGhhdC4gIFdlIHJlYWxseQotZG9uJ3Qgd2FudCB0byBkcm93biBpbiBub2lzZSB1bmxlc3Mgd2UnZCBleHBsaWNpdGx5IGFza2VkIGZvciBpdC4KLQotVXNpbmcgc3BhcnNlIGZvciBsb2NrIGNoZWNraW5nCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHVuZGVmaW5lZCBmb3IgZ2NjIGFuZCBkZWZpbmVkIGR1cmluZyBhIHNwYXJzZQotcnVuIHRvIHVzZSB0aGUgImNvbnRleHQiIHRyYWNraW5nIGZlYXR1cmUgb2Ygc3BhcnNlLCBhcHBsaWVkIHRvCi1sb2NraW5nLiAgVGhlc2UgYW5ub3RhdGlvbnMgdGVsbCBzcGFyc2Ugd2hlbiBhIGxvY2sgaXMgaGVsZCwgd2l0aAotcmVnYXJkIHRvIHRoZSBhbm5vdGF0ZWQgZnVuY3Rpb24ncyBlbnRyeSBhbmQgZXhpdC4KLQotX19tdXN0X2hvbGQgLSBUaGUgc3BlY2lmaWVkIGxvY2sgaXMgaGVsZCBvbiBmdW5jdGlvbiBlbnRyeSBhbmQgZXhpdC4KLQotX19hY3F1aXJlcyAtIFRoZSBzcGVjaWZpZWQgbG9jayBpcyBoZWxkIG9uIGZ1bmN0aW9uIGV4aXQsIGJ1dCBub3QgZW50cnkuCi0KLV9fcmVsZWFzZXMgLSBUaGUgc3BlY2lmaWVkIGxvY2sgaXMgaGVsZCBvbiBmdW5jdGlvbiBlbnRyeSwgYnV0IG5vdCBleGl0LgotCi1JZiB0aGUgZnVuY3Rpb24gZW50ZXJzIGFuZCBleGl0cyB3aXRob3V0IHRoZSBsb2NrIGhlbGQsIGFjcXVpcmluZyBhbmQKLXJlbGVhc2luZyB0aGUgbG9jayBpbnNpZGUgdGhlIGZ1bmN0aW9uIGluIGEgYmFsYW5jZWQgd2F5LCBubwotYW5ub3RhdGlvbiBpcyBuZWVkZWQuICBUaGUgdHJlZSBhbm5vdGF0aW9ucyBhYm92ZSBhcmUgZm9yIGNhc2VzIHdoZXJlCi1zcGFyc2Ugd291bGQgb3RoZXJ3aXNlIHJlcG9ydCBhIGNvbnRleHQgaW1iYWxhbmNlLgotCi1HZXR0aW5nIHNwYXJzZQotfn5+fn5+fn5+fn5+fn4KLQotWW91IGNhbiBnZXQgbGF0ZXN0IHJlbGVhc2VkIHZlcnNpb25zIGZyb20gdGhlIFNwYXJzZSBob21lcGFnZSBhdAotaHR0cHM6Ly9zcGFyc2Uud2lraS5rZXJuZWwub3JnL2luZGV4LnBocC9NYWluX1BhZ2UKLQotQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBnZXQgc25hcHNob3RzIG9mIHRoZSBsYXRlc3QgZGV2ZWxvcG1lbnQgdmVyc2lvbgotb2Ygc3BhcnNlIHVzaW5nIGdpdCB0byBjbG9uZS4uCi0KLSAgICAgICAgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9kZXZlbC9zcGFyc2Uvc3BhcnNlLmdpdAotCi1EYXZlSiBoYXMgaG91cmx5IGdlbmVyYXRlZCB0YXJiYWxscyBvZiB0aGUgZ2l0IHRyZWUgYXZhaWxhYmxlIGF0Li4KLQotICAgICAgICBodHRwOi8vd3d3LmNvZGVtb25rZXkub3JnLnVrL3Byb2plY3RzL2dpdC1zbmFwc2hvdHMvc3BhcnNlLwotCi0KLU9uY2UgeW91IGhhdmUgaXQsIGp1c3QgZG8KLQotICAgICAgICBtYWtlCi0gICAgICAgIG1ha2UgaW5zdGFsbAotCi1hcyBhIHJlZ3VsYXIgdXNlciwgYW5kIGl0IHdpbGwgaW5zdGFsbCBzcGFyc2UgaW4geW91ciB+L2JpbiBkaXJlY3RvcnkuCi0KLVVzaW5nIHNwYXJzZQotfn5+fn5+fn5+fn5+Ci0KLURvIGEga2VybmVsIG1ha2Ugd2l0aCAibWFrZSBDPTEiIHRvIHJ1biBzcGFyc2Ugb24gYWxsIHRoZSBDIGZpbGVzIHRoYXQgZ2V0Ci1yZWNvbXBpbGVkLCBvciB1c2UgIm1ha2UgQz0yIiB0byBydW4gc3BhcnNlIG9uIHRoZSBmaWxlcyB3aGV0aGVyIHRoZXkgbmVlZCB0bwotYmUgcmVjb21waWxlZCBvciBub3QuICBUaGUgbGF0dGVyIGlzIGEgZmFzdCB3YXkgdG8gY2hlY2sgdGhlIHdob2xlIHRyZWUgaWYgeW91Ci1oYXZlIGFscmVhZHkgYnVpbHQgaXQuCi0KLVRoZSBvcHRpb25hbCBtYWtlIHZhcmlhYmxlIENGIGNhbiBiZSB1c2VkIHRvIHBhc3MgYXJndW1lbnRzIHRvIHNwYXJzZS4gIFRoZQotYnVpbGQgc3lzdGVtIHBhc3NlcyAtV2JpdHdpc2UgdG8gc3BhcnNlIGF1dG9tYXRpY2FsbHkuICBUbyBwZXJmb3JtIGVuZGlhbm5lc3MKLWNoZWNrcywgeW91IG1heSBkZWZpbmUgX19DSEVDS19FTkRJQU5fXzoKLQotICAgICAgICBtYWtlIEM9MiBDRj0iLURfX0NIRUNLX0VORElBTl9fIgotCi1UaGVzZSBjaGVja3MgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQgYXMgdGhleSBnZW5lcmF0ZSBhIGhvc3Qgb2Ygd2FybmluZ3MuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaGlueC1zdGF0aWMvdGhlbWVfb3ZlcnJpZGVzLmNzcyBiL0RvY3VtZW50YXRpb24vc3BoaW54LXN0YXRpYy90aGVtZV9vdmVycmlkZXMuY3NzCmluZGV4IDNhMmFjNGIuLmQ1NzY0YTQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BoaW54LXN0YXRpYy90aGVtZV9vdmVycmlkZXMuY3NzCisrKyBiL0RvY3VtZW50YXRpb24vc3BoaW54LXN0YXRpYy90aGVtZV9vdmVycmlkZXMuY3NzCkBAIC00MiwxMSArNDIsMjYgQEAKICAgICBjYXB0aW9uIGEuaGVhZGVybGluayB7IG9wYWNpdHk6IDA7IH0KICAgICBjYXB0aW9uIGEuaGVhZGVybGluazpob3ZlciB7IG9wYWNpdHk6IDE7IH0KIAotICAgIC8qIGlubGluZSBsaXRlcmFsOiBkcm9wIHRoZSBib3JkZXJib3ggYW5kIHJlZCBjb2xvciAqLworICAgIC8qIE1lbnUgc2VsZWN0aW9uIGFuZCBrZXlzdHJva2VzICovCisKKyAgICBzcGFuLm1lbnVzZWxlY3Rpb24geworCWNvbG9yOiBibHVlOworCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vc3BhY2UKKyAgICB9CisKKyAgICBjb2RlLmtiZCwgY29kZS5rYmQgc3BhbiB7CisJY29sb3I6IHdoaXRlOworCWJhY2tncm91bmQtY29sb3I6IGRhcmtibHVlOworCWZvbnQtd2VpZ2h0OiBib2xkOworCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vc3BhY2UKKyAgICB9CisKKyAgICAvKiBpbmxpbmUgbGl0ZXJhbDogZHJvcCB0aGUgYm9yZGVyYm94LCBwYWRkaW5nIGFuZCByZWQgY29sb3IgKi8KIAogICAgIGNvZGUsIC5yc3QtY29udGVudCB0dCwgLnJzdC1jb250ZW50IGNvZGUgewogICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICAgYm9yZGVyOiBub25lOworICAgICAgICBwYWRkaW5nOiB1bnNldDsKICAgICAgICAgYmFja2dyb3VuZDogaW5oZXJpdDsKICAgICAgICAgZm9udC1zaXplOiA4NSU7CiAgICAgfQpAQCAtNTQsNSArNjksNCBAQAogICAgIC5yc3QtY29udGVudCB0dC5saXRlcmFsLC5yc3QtY29udGVudCB0dC5saXRlcmFsLC5yc3QtY29udGVudCBjb2RlLmxpdGVyYWwgewogICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BoaW54L2Nkb21haW4ucHkgYi9Eb2N1bWVudGF0aW9uL3NwaGlueC9jZG9tYWluLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMDQxOWMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaGlueC9jZG9tYWluLnB5CkBAIC0wLDAgKzEsMTY1IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04OyBtb2RlOiBweXRob24gLSotCisjIHB5bGludDogZGlzYWJsZT1XMDE0MSxDMDExMyxDMDEwMyxDMDMyNQordSIiIgorICAgIGNkb21haW4KKyAgICB+fn5+fn5+CisKKyAgICBSZXBsYWNlbWVudCBmb3IgdGhlIHNwaGlueCBjLWRvbWFpbi4KKworICAgIDpjb3B5cmlnaHQ6ICBDb3B5cmlnaHQgKEMpIDIwMTYgIE1hcmt1cyBIZWlzZXIKKyAgICA6bGljZW5zZTogICAgR1BMIFZlcnNpb24gMiwgSnVuZSAxOTkxIHNlZSBMaW51eC9DT1BZSU5HIGZvciBkZXRhaWxzLgorCisgICAgTGlzdCBvZiBjdXN0b21pemF0aW9uczoKKworICAgICogTW92ZWQgdGhlICpkdXBsaWNhdGUgQyBvYmplY3QgZGVzY3JpcHRpb24qIHdhcm5pbmdzIGZvciBmdW5jdGlvbgorICAgICAgZGVjbGFyYXRpb25zIGluIHRoZSBuaXRwaWNreSBtb2RlLiBTZWUgU3BoaW54IGRvY3VtZW50YXRpb24gZm9yCisgICAgICB0aGUgY29uZmlnIHZhbHVlcyBmb3IgYGBuaXRwaWNrYGAgYW5kIGBgbml0cGlja19pZ25vcmVgYC4KKworICAgICogQWRkIG9wdGlvbiAnbmFtZScgdG8gdGhlICJjOmZ1bmN0aW9uOiIgZGlyZWN0aXZlLiAgV2l0aCBvcHRpb24gJ25hbWUnIHRoZQorICAgICAgcmVmLW5hbWUgb2YgYSBmdW5jdGlvbiBjYW4gYmUgbW9kaWZpZWQuIEUuZy46OgorCisgICAgICAgICAgLi4gYzpmdW5jdGlvbjo6IGludCBpb2N0bCggaW50IGZkLCBpbnQgcmVxdWVzdCApCisgICAgICAgICAgICAgOm5hbWU6IFZJRElPQ19MT0dfU1RBVFVTCisKKyAgICAgIFRoZSBmdW5jLW5hbWUgKGUuZy4gaW9jdGwpIHJlbWFpbnMgaW4gdGhlIG91dHB1dCBidXQgdGhlIHJlZi1uYW1lIGNoYW5nZWQKKyAgICAgIGZyb20gJ2lvY3RsJyB0byAnVklESU9DX0xPR19TVEFUVVMnLiBUaGUgZnVuY3Rpb24gaXMgcmVmZXJlbmNlZCBieTo6CisKKyAgICAgICAgICAqIDpjOmZ1bmM6YFZJRElPQ19MT0dfU1RBVFVTYCBvcgorICAgICAgICAgICogOmFueTpgVklESU9DX0xPR19TVEFUVVNgIChgYDphbnk6YGAgbmVlZHMgc3BoaW54IDEuMykKKworICAgICAqIEhhbmRsZSBzaWduYXR1cmVzIG9mIGZ1bmN0aW9uLWxpa2UgbWFjcm9zIHdlbGwuIERvbid0IHRyeSB0byBkZWR1Y2UKKyAgICAgICBhcmd1bWVudHMgdHlwZXMgb2YgZnVuY3Rpb24tbGlrZSBtYWNyb3MuCisKKyIiIgorCitmcm9tIGRvY3V0aWxzIGltcG9ydCBub2RlcworZnJvbSBkb2N1dGlscy5wYXJzZXJzLnJzdCBpbXBvcnQgZGlyZWN0aXZlcworCitpbXBvcnQgc3BoaW54Citmcm9tIHNwaGlueCBpbXBvcnQgYWRkbm9kZXMKK2Zyb20gc3BoaW54LmRvbWFpbnMuYyBpbXBvcnQgY19mdW5jcHRyX3NpZ19yZSwgY19zaWdfcmUKK2Zyb20gc3BoaW54LmRvbWFpbnMuYyBpbXBvcnQgQ09iamVjdCBhcyBCYXNlX0NPYmplY3QKK2Zyb20gc3BoaW54LmRvbWFpbnMuYyBpbXBvcnQgQ0RvbWFpbiBhcyBCYXNlX0NEb21haW4KKworX192ZXJzaW9uX18gID0gJzEuMCcKKworIyBHZXQgU3BoaW54IHZlcnNpb24KK21ham9yLCBtaW5vciwgcGF0Y2ggPSBtYXAoaW50LCBzcGhpbnguX192ZXJzaW9uX18uc3BsaXQoIi4iKSkKKworZGVmIHNldHVwKGFwcCk6CisKKyAgICBhcHAub3ZlcnJpZGVfZG9tYWluKENEb21haW4pCisKKyAgICByZXR1cm4gZGljdCgKKyAgICAgICAgdmVyc2lvbiA9IF9fdmVyc2lvbl9fLAorICAgICAgICBwYXJhbGxlbF9yZWFkX3NhZmUgPSBUcnVlLAorICAgICAgICBwYXJhbGxlbF93cml0ZV9zYWZlID0gVHJ1ZQorICAgICkKKworY2xhc3MgQ09iamVjdChCYXNlX0NPYmplY3QpOgorCisgICAgIiIiCisgICAgRGVzY3JpcHRpb24gb2YgYSBDIGxhbmd1YWdlIG9iamVjdC4KKyAgICAiIiIKKyAgICBvcHRpb25fc3BlYyA9IHsKKyAgICAgICAgIm5hbWUiIDogZGlyZWN0aXZlcy51bmNoYW5nZWQKKyAgICB9CisKKyAgICBkZWYgaGFuZGxlX2Z1bmNfbGlrZV9tYWNybyhzZWxmLCBzaWcsIHNpZ25vZGUpOgorICAgICAgICB1IiIiSGFuZGxlcyBzaWduYXR1cmVzIG9mIGZ1bmN0aW9uLWxpa2UgbWFjcm9zLgorCisgICAgICAgIElmIHRoZSBvYmp0eXBlIGlzICdmdW5jdGlvbicgYW5kIHRoZSB0aGUgc2lnbmF0dXJlIGBgc2lnYGAgaXMgYQorICAgICAgICBmdW5jdGlvbi1saWtlIG1hY3JvLCB0aGUgbmFtZSBvZiB0aGUgbWFjcm8gaXMgcmV0dXJuZWQuIE90aGVyd2lzZQorICAgICAgICBgYEZhbHNlYGAgaXMgcmV0dXJuZWQuICAiIiIKKworICAgICAgICBpZiBub3Qgc2VsZi5vYmp0eXBlID09ICdmdW5jdGlvbic6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBtID0gY19mdW5jcHRyX3NpZ19yZS5tYXRjaChzaWcpCisgICAgICAgIGlmIG0gaXMgTm9uZToKKyAgICAgICAgICAgIG0gPSBjX3NpZ19yZS5tYXRjaChzaWcpCisgICAgICAgICAgICBpZiBtIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbm8gbWF0Y2gnKQorCisgICAgICAgIHJldHR5cGUsIGZ1bGxuYW1lLCBhcmdsaXN0LCBfY29uc3QgPSBtLmdyb3VwcygpCisgICAgICAgIGFyZ2xpc3QgPSBhcmdsaXN0LnN0cmlwKCkKKyAgICAgICAgaWYgcmV0dHlwZSBvciBub3QgYXJnbGlzdDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGFyZ2xpc3QgPSBhcmdsaXN0LnJlcGxhY2UoJ2AnLCAnJykucmVwbGFjZSgnXFwgJywgJycpICMgcmVtb3ZlIG1hcmt1cAorICAgICAgICBhcmdsaXN0ID0gW2Euc3RyaXAoKSBmb3IgYSBpbiBhcmdsaXN0LnNwbGl0KCIsIildCisKKyAgICAgICAgIyBoYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGEgdHlwZT8KKyAgICAgICAgaWYgbGVuKGFyZ2xpc3RbMF0uc3BsaXQoIiAiKSkgPiAxOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgIyBUaGlzIGlzIGEgZnVuY3Rpb24tbGlrZSBtYWNybywgaXQncyBhcmd1bWVudHMgYXJlIHR5cGVsZXNzIQorICAgICAgICBzaWdub2RlICArPSBhZGRub2Rlcy5kZXNjX25hbWUoZnVsbG5hbWUsIGZ1bGxuYW1lKQorICAgICAgICBwYXJhbWxpc3QgPSBhZGRub2Rlcy5kZXNjX3BhcmFtZXRlcmxpc3QoKQorICAgICAgICBzaWdub2RlICArPSBwYXJhbWxpc3QKKworICAgICAgICBmb3IgYXJnbmFtZSBpbiBhcmdsaXN0OgorICAgICAgICAgICAgcGFyYW0gPSBhZGRub2Rlcy5kZXNjX3BhcmFtZXRlcignJywgJycsIG5vZW1waD1UcnVlKQorICAgICAgICAgICAgIyBzZXBhcmF0ZSBieSBub24tYnJlYWtpbmcgc3BhY2UgaW4gdGhlIG91dHB1dAorICAgICAgICAgICAgcGFyYW0gKz0gbm9kZXMuZW1waGFzaXMoYXJnbmFtZSwgYXJnbmFtZSkKKyAgICAgICAgICAgIHBhcmFtbGlzdCArPSBwYXJhbQorCisgICAgICAgIHJldHVybiBmdWxsbmFtZQorCisgICAgZGVmIGhhbmRsZV9zaWduYXR1cmUoc2VsZiwgc2lnLCBzaWdub2RlKToKKyAgICAgICAgIiIiVHJhbnNmb3JtIGEgQyBzaWduYXR1cmUgaW50byBSU1Qgbm9kZXMuIiIiCisKKyAgICAgICAgZnVsbG5hbWUgPSBzZWxmLmhhbmRsZV9mdW5jX2xpa2VfbWFjcm8oc2lnLCBzaWdub2RlKQorICAgICAgICBpZiBub3QgZnVsbG5hbWU6CisgICAgICAgICAgICBmdWxsbmFtZSA9IHN1cGVyKENPYmplY3QsIHNlbGYpLmhhbmRsZV9zaWduYXR1cmUoc2lnLCBzaWdub2RlKQorCisgICAgICAgIGlmICJuYW1lIiBpbiBzZWxmLm9wdGlvbnM6CisgICAgICAgICAgICBpZiBzZWxmLm9ianR5cGUgPT0gJ2Z1bmN0aW9uJzoKKyAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IHNlbGYub3B0aW9uc1sibmFtZSJdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgRklYTUU6IGhhbmRsZSA6bmFtZTogdmFsdWUgb2Ygb3RoZXIgZGVjbGFyYXRpb24gdHlwZXM/CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gZnVsbG5hbWUKKworICAgIGRlZiBhZGRfdGFyZ2V0X2FuZF9pbmRleChzZWxmLCBuYW1lLCBzaWcsIHNpZ25vZGUpOgorICAgICAgICAjIGZvciBDIEFQSSBpdGVtcyB3ZSBhZGQgYSBwcmVmaXggc2luY2UgbmFtZXMgYXJlIHVzdWFsbHkgbm90IHF1YWxpZmllZAorICAgICAgICAjIGJ5IGEgbW9kdWxlIG5hbWUgYW5kIHNvIGVhc2lseSBjbGFzaCB3aXRoIGUuZy4gc2VjdGlvbiB0aXRsZXMKKyAgICAgICAgdGFyZ2V0bmFtZSA9ICdjLicgKyBuYW1lCisgICAgICAgIGlmIHRhcmdldG5hbWUgbm90IGluIHNlbGYuc3RhdGUuZG9jdW1lbnQuaWRzOgorICAgICAgICAgICAgc2lnbm9kZVsnbmFtZXMnXS5hcHBlbmQodGFyZ2V0bmFtZSkKKyAgICAgICAgICAgIHNpZ25vZGVbJ2lkcyddLmFwcGVuZCh0YXJnZXRuYW1lKQorICAgICAgICAgICAgc2lnbm9kZVsnZmlyc3QnXSA9IChub3Qgc2VsZi5uYW1lcykKKyAgICAgICAgICAgIHNlbGYuc3RhdGUuZG9jdW1lbnQubm90ZV9leHBsaWNpdF90YXJnZXQoc2lnbm9kZSkKKyAgICAgICAgICAgIGludiA9IHNlbGYuZW52LmRvbWFpbmRhdGFbJ2MnXVsnb2JqZWN0cyddCisgICAgICAgICAgICBpZiAobmFtZSBpbiBpbnYgYW5kIHNlbGYuZW52LmNvbmZpZy5uaXRwaWNreSk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5vYmp0eXBlID09ICdmdW5jdGlvbic6CisgICAgICAgICAgICAgICAgICAgIGlmICgnYzpmdW5jJywgbmFtZSkgbm90IGluIHNlbGYuZW52LmNvbmZpZy5uaXRwaWNrX2lnbm9yZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVfbWFjaGluZS5yZXBvcnRlci53YXJuaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkdXBsaWNhdGUgQyBvYmplY3QgZGVzY3JpcHRpb24gb2YgJXMsICcgJSBuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3RoZXIgaW5zdGFuY2UgaW4gJyArIHNlbGYuZW52LmRvYzJwYXRoKGludltuYW1lXVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZT1zZWxmLmxpbmVubykKKyAgICAgICAgICAgIGludltuYW1lXSA9IChzZWxmLmVudi5kb2NuYW1lLCBzZWxmLm9ianR5cGUpCisKKyAgICAgICAgaW5kZXh0ZXh0ID0gc2VsZi5nZXRfaW5kZXhfdGV4dChuYW1lKQorICAgICAgICBpZiBpbmRleHRleHQ6CisgICAgICAgICAgICBpZiBtYWpvciA9PSAxIGFuZCBtaW5vciA8IDQ6CisgICAgICAgICAgICAgICAgIyBpbmRleG5vZGUncyB0dXBsZSBjaGFuZ2VkIGluIDEuNAorICAgICAgICAgICAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3NwaGlueC1kb2Mvc3BoaW54L2NvbW1pdC9lNmE1YTNhOTJlOTM4ZmNkNzU4NjZiNDIyN2RiOWUwNTI0ZDU4ZjdjCisgICAgICAgICAgICAgICAgc2VsZi5pbmRleG5vZGVbJ2VudHJpZXMnXS5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgICgnc2luZ2xlJywgaW5kZXh0ZXh0LCB0YXJnZXRuYW1lLCAnJykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuaW5kZXhub2RlWydlbnRyaWVzJ10uYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICAoJ3NpbmdsZScsIGluZGV4dGV4dCwgdGFyZ2V0bmFtZSwgJycsIE5vbmUpKQorCitjbGFzcyBDRG9tYWluKEJhc2VfQ0RvbWFpbik6CisKKyAgICAiIiJDIGxhbmd1YWdlIGRvbWFpbi4iIiIKKyAgICBuYW1lID0gJ2MnCisgICAgbGFiZWwgPSAnQycKKyAgICBkaXJlY3RpdmVzID0geworICAgICAgICAnZnVuY3Rpb24nOiBDT2JqZWN0LAorICAgICAgICAnbWVtYmVyJzogICBDT2JqZWN0LAorICAgICAgICAnbWFjcm8nOiAgICBDT2JqZWN0LAorICAgICAgICAndHlwZSc6ICAgICBDT2JqZWN0LAorICAgICAgICAndmFyJzogICAgICBDT2JqZWN0LAorICAgIH0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BoaW54L2tlcm5lbC1kb2MucHkgYi9Eb2N1bWVudGF0aW9uL3NwaGlueC9rZXJuZWwtZG9jLnB5CmluZGV4IGY2OTIwYzAuLmQxNWUwN2YgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BoaW54L2tlcm5lbC1kb2MucHkKKysrIGIvRG9jdW1lbnRhdGlvbi9zcGhpbngva2VybmVsLWRvYy5weQpAQCAtMzksNiArMzksOCBAQAogZnJvbSBzcGhpbngudXRpbC5jb21wYXQgaW1wb3J0IERpcmVjdGl2ZQogZnJvbSBzcGhpbnguZXh0LmF1dG9kb2MgaW1wb3J0IEF1dG9kb2NSZXBvcnRlcgogCitfX3ZlcnNpb25fXyAgPSAnMS4wJworCiBjbGFzcyBLZXJuZWxEb2NEaXJlY3RpdmUoRGlyZWN0aXZlKToKICAgICAiIiJFeHRyYWN0IGtlcm5lbC1kb2MgY29tbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUiIiIKICAgICByZXF1aXJlZF9hcmd1bWVudCA9IDEKQEAgLTEzOSwzICsxNDEsOSBAQAogICAgIGFwcC5hZGRfY29uZmlnX3ZhbHVlKCdrZXJuZWxkb2NfdmVyYm9zaXR5JywgMSwgJ2VudicpCiAKICAgICBhcHAuYWRkX2RpcmVjdGl2ZSgna2VybmVsLWRvYycsIEtlcm5lbERvY0RpcmVjdGl2ZSkKKworICAgIHJldHVybiBkaWN0KAorICAgICAgICB2ZXJzaW9uID0gX192ZXJzaW9uX18sCisgICAgICAgIHBhcmFsbGVsX3JlYWRfc2FmZSA9IFRydWUsCisgICAgICAgIHBhcmFsbGVsX3dyaXRlX3NhZmUgPSBUcnVlCisgICAgKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGhpbngva2VybmVsX2luY2x1ZGUucHkgYi9Eb2N1bWVudGF0aW9uL3NwaGlueC9rZXJuZWxfaW5jbHVkZS5weQppbmRleCBkYjU3MzgyLi5mNTIzYWE2IDEwMDc1NQotLS0gYS9Eb2N1bWVudGF0aW9uL3NwaGlueC9rZXJuZWxfaW5jbHVkZS5weQorKysgYi9Eb2N1bWVudGF0aW9uL3NwaGlueC9rZXJuZWxfaW5jbHVkZS5weQpAQCAtMzksMTEgKzM5LDE4IEBACiBmcm9tIGRvY3V0aWxzLnBhcnNlcnMucnN0LmRpcmVjdGl2ZXMuYm9keSBpbXBvcnQgQ29kZUJsb2NrLCBOdW1iZXJMaW5lcwogZnJvbSBkb2N1dGlscy5wYXJzZXJzLnJzdC5kaXJlY3RpdmVzLm1pc2MgaW1wb3J0IEluY2x1ZGUKIAorX192ZXJzaW9uX18gID0gJzEuMCcKKwogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIGRlZiBzZXR1cChhcHApOgogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogICAgIGFwcC5hZGRfZGlyZWN0aXZlKCJrZXJuZWwtaW5jbHVkZSIsIEtlcm5lbEluY2x1ZGUpCisgICAgcmV0dXJuIGRpY3QoCisgICAgICAgIHZlcnNpb24gPSBfX3ZlcnNpb25fXywKKyAgICAgICAgcGFyYWxsZWxfcmVhZF9zYWZlID0gVHJ1ZSwKKyAgICAgICAgcGFyYWxsZWxfd3JpdGVfc2FmZSA9IFRydWUKKyAgICApCiAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBjbGFzcyBLZXJuZWxJbmNsdWRlKEluY2x1ZGUpOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGhpbngvbG9hZF9jb25maWcucHkgYi9Eb2N1bWVudGF0aW9uL3NwaGlueC9sb2FkX2NvbmZpZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDFhMjFhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zcGhpbngvbG9hZF9jb25maWcucHkKQEAgLTAsMCArMSwzMiBAQAorIyAtKi0gY29kaW5nOiB1dGYtODsgbW9kZTogcHl0aG9uIC0qLQorIyBweWxpbnQ6IGRpc2FibGU9UjA5MDMsIEMwMzMwLCBSMDkxNCwgUjA5MTIsIEUwNDAxCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSBzcGhpbngudXRpbC5weWNvbXBhdCBpbXBvcnQgZXhlY2ZpbGVfCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWYgbG9hZENvbmZpZyhuYW1lc3BhY2UpOgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHUiIiJMb2FkIGFuIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBmaWxlIGludG8gKm5hbWVzcGFjZSouCisKKyAgICBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIHRha2VuIGZyb20gdGhlIGVudmlyb25tZW50CisgICAgYGBTUEhJTlhfQ09ORmBgLiBUaGUgZXh0ZXJuYWwgY29uZmlndXJhdGlvbiBmaWxlIGV4dGVuZHMgKG9yIG92ZXJ3cml0ZXMpIHRoZQorICAgIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGZyb20gdGhlIG9yaWdpbiBgYGNvbmYucHlgYC4gIFdpdGggdGhpcyB5b3UgYXJlIGFibGUgdG8KKyAgICBtYWludGFpbiAqYnVpbGQgdGhlbWVzKi4gICIiIgorCisgICAgY29uZmlnX2ZpbGUgPSBvcy5lbnZpcm9uLmdldCgiU1BISU5YX0NPTkYiLCBOb25lKQorICAgIGlmIChjb25maWdfZmlsZSBpcyBub3QgTm9uZQorICAgICAgICBhbmQgb3MucGF0aC5ub3JtcGF0aChuYW1lc3BhY2VbIl9fZmlsZV9fIl0pICE9IG9zLnBhdGgubm9ybXBhdGgoY29uZmlnX2ZpbGUpICk6CisgICAgICAgIGNvbmZpZ19maWxlID0gb3MucGF0aC5hYnNwYXRoKGNvbmZpZ19maWxlKQorCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGNvbmZpZ19maWxlKToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoImxvYWQgYWRkaXRpb25hbCBzcGhpbngtY29uZmlnOiAlc1xuIiAlIGNvbmZpZ19maWxlKQorICAgICAgICAgICAgY29uZmlnID0gbmFtZXNwYWNlLmNvcHkoKQorICAgICAgICAgICAgY29uZmlnWydfX2ZpbGVfXyddID0gY29uZmlnX2ZpbGUKKyAgICAgICAgICAgIGV4ZWNmaWxlXyhjb25maWdfZmlsZSwgY29uZmlnKQorICAgICAgICAgICAgZGVsIGNvbmZpZ1snX19maWxlX18nXQorICAgICAgICAgICAgbmFtZXNwYWNlLnVwZGF0ZShjb25maWcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJXQVJOSU5HOiBhZGRpdGlvbmFsIHNwaGlueC1jb25maWcgbm90IGZvdW5kOiAlc1xuIiAlIGNvbmZpZ19maWxlKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGhpbngvcGFyc2UtaGVhZGVycy5wbCBiL0RvY3VtZW50YXRpb24vc3BoaW54L3BhcnNlLWhlYWRlcnMucGwKaW5kZXggMzRiZDllMi4uNzQwODliMCAxMDA3NTUKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGhpbngvcGFyc2UtaGVhZGVycy5wbAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaGlueC9wYXJzZS1oZWFkZXJzLnBsCkBAIC0yMjAsNyArMjIwLDcgQEAKICMKICMgQWRkIGVzY2FwZSBjb2RlcyBmb3Igc3BlY2lhbCBjaGFyYWN0ZXJzCiAjCi0kZGF0YSA9fiBzLChbXF9cYFwqXDxcPlwmXFxcXDpcL1x8XSksXFwkMSxnOworJGRhdGEgPX4gcywoW1xfXGBcKlw8XD5cJlxcXFw6XC9cfFwlXCRcI1x7XH1cflxeXSksXFwkMSxnOwogCiAkZGF0YSA9fiBzLERFUFJFQ0FURUQsKipERVBSRUNBVEVEKiosZzsKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGhpbngvcnN0RmxhdFRhYmxlLnB5IGIvRG9jdW1lbnRhdGlvbi9zcGhpbngvcnN0RmxhdFRhYmxlLnB5Cm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMjZkYjg1Mi4uNTVmMjc1NwotLS0gYS9Eb2N1bWVudGF0aW9uL3NwaGlueC9yc3RGbGF0VGFibGUucHkKKysrIGIvRG9jdW1lbnRhdGlvbi9zcGhpbngvcnN0RmxhdFRhYmxlLnB5CkBAIC03Myw2ICs3MywxMiBAQAogICAgIHJvbGVzLnJlZ2lzdGVyX2xvY2FsX3JvbGUoJ2NzcGFuJywgY19zcGFuKQogICAgIHJvbGVzLnJlZ2lzdGVyX2xvY2FsX3JvbGUoJ3JzcGFuJywgcl9zcGFuKQogCisgICAgcmV0dXJuIGRpY3QoCisgICAgICAgIHZlcnNpb24gPSBfX3ZlcnNpb25fXywKKyAgICAgICAgcGFyYWxsZWxfcmVhZF9zYWZlID0gVHJ1ZSwKKyAgICAgICAgcGFyYWxsZWxfd3JpdGVfc2FmZSA9IFRydWUKKyAgICApCisKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBkZWYgY19zcGFuKG5hbWUsIHJhd3RleHQsIHRleHQsIGxpbmVubywgaW5saW5lciwgb3B0aW9ucz1Ob25lLCBjb250ZW50PU5vbmUpOgogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3RhYmxlX2FwaV9ub25zZW5zZS50eHQgYi9Eb2N1bWVudGF0aW9uL3N0YWJsZV9hcGlfbm9uc2Vuc2UudHh0CmluZGV4IGRiM2JlODkuLjI0ZjVhZWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3RhYmxlX2FwaV9ub25zZW5zZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zdGFibGVfYXBpX25vbnNlbnNlLnR4dApAQCAtMSwxNyArMSwyNiBAQAorLi4gX3N0YWJsZV9hcGlfbm9uc2Vuc2U6CisKIFRoZSBMaW51eCBLZXJuZWwgRHJpdmVyIEludGVyZmFjZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCiAoYWxsIG9mIHlvdXIgcXVlc3Rpb25zIGFuc3dlcmVkIGFuZCB0aGVuIHNvbWUpCiAKIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CiAKLVRoaXMgaXMgYmVpbmcgd3JpdHRlbiB0byB0cnkgdG8gZXhwbGFpbiB3aHkgTGludXggZG9lcyBub3QgaGF2ZSBhIGJpbmFyeQota2VybmVsIGludGVyZmFjZSwgbm9yIGRvZXMgaXQgaGF2ZSBhIHN0YWJsZSBrZXJuZWwgaW50ZXJmYWNlLiAgUGxlYXNlCi1yZWFsaXplIHRoYXQgdGhpcyBhcnRpY2xlIGRlc2NyaWJlcyB0aGUgX2luIGtlcm5lbF8gaW50ZXJmYWNlcywgbm90IHRoZQota2VybmVsIHRvIHVzZXJzcGFjZSBpbnRlcmZhY2VzLiAgVGhlIGtlcm5lbCB0byB1c2Vyc3BhY2UgaW50ZXJmYWNlIGlzCi10aGUgb25lIHRoYXQgYXBwbGljYXRpb24gcHJvZ3JhbXMgdXNlLCB0aGUgc3lzY2FsbCBpbnRlcmZhY2UuICBUaGF0Ci1pbnRlcmZhY2UgaXMgX3ZlcnlfIHN0YWJsZSBvdmVyIHRpbWUsIGFuZCB3aWxsIG5vdCBicmVhay4gIEkgaGF2ZSBvbGQKLXByb2dyYW1zIHRoYXQgd2VyZSBidWlsdCBvbiBhIHByZSAwLjlzb21ldGhpbmcga2VybmVsIHRoYXQgc3RpbGwgd29yawotanVzdCBmaW5lIG9uIHRoZSBsYXRlc3QgMi42IGtlcm5lbCByZWxlYXNlLiAgVGhhdCBpbnRlcmZhY2UgaXMgdGhlIG9uZQotdGhhdCB1c2VycyBhbmQgYXBwbGljYXRpb24gcHJvZ3JhbW1lcnMgY2FuIGNvdW50IG9uIGJlaW5nIHN0YWJsZS4KK1RoaXMgaXMgYmVpbmcgd3JpdHRlbiB0byB0cnkgdG8gZXhwbGFpbiB3aHkgTGludXggKipkb2VzIG5vdCBoYXZlIGEgYmluYXJ5CitrZXJuZWwgaW50ZXJmYWNlLCBub3IgZG9lcyBpdCBoYXZlIGEgc3RhYmxlIGtlcm5lbCBpbnRlcmZhY2UqKi4KKworLi4gbm90ZTo6CisKKyAgUGxlYXNlIHJlYWxpemUgdGhhdCB0aGlzIGFydGljbGUgZGVzY3JpYmVzIHRoZSAqKmluIGtlcm5lbCoqIGludGVyZmFjZXMsIG5vdAorICB0aGUga2VybmVsIHRvIHVzZXJzcGFjZSBpbnRlcmZhY2VzLgorCisgIFRoZSBrZXJuZWwgdG8gdXNlcnNwYWNlIGludGVyZmFjZSBpcyB0aGUgb25lIHRoYXQgYXBwbGljYXRpb24gcHJvZ3JhbXMgdXNlLAorICB0aGUgc3lzY2FsbCBpbnRlcmZhY2UuICBUaGF0IGludGVyZmFjZSBpcyAqKnZlcnkqKiBzdGFibGUgb3ZlciB0aW1lLCBhbmQKKyAgd2lsbCBub3QgYnJlYWsuICBJIGhhdmUgb2xkIHByb2dyYW1zIHRoYXQgd2VyZSBidWlsdCBvbiBhIHByZSAwLjlzb21ldGhpbmcKKyAga2VybmVsIHRoYXQgc3RpbGwgd29yayBqdXN0IGZpbmUgb24gdGhlIGxhdGVzdCAyLjYga2VybmVsIHJlbGVhc2UuCisgIFRoYXQgaW50ZXJmYWNlIGlzIHRoZSBvbmUgdGhhdCB1c2VycyBhbmQgYXBwbGljYXRpb24gcHJvZ3JhbW1lcnMgY2FuIGNvdW50CisgIG9uIGJlaW5nIHN0YWJsZS4KIAogCiBFeGVjdXRpdmUgU3VtbWFyeQpAQCAtMzMsNyArNDIsNyBAQAogdGhlIHdvcmxkLCB0aGV5IG5laXRoZXIgc2VlIHRoaXMgaW50ZXJmYWNlLCBub3IgZG8gdGhleSBjYXJlIGFib3V0IGl0IGF0CiBhbGwuCiAKLUZpcnN0IG9mZiwgSSdtIG5vdCBnb2luZyB0byBhZGRyZXNzIF9hbnlfIGxlZ2FsIGlzc3VlcyBhYm91dCBjbG9zZWQKK0ZpcnN0IG9mZiwgSSdtIG5vdCBnb2luZyB0byBhZGRyZXNzICoqYW55KiogbGVnYWwgaXNzdWVzIGFib3V0IGNsb3NlZAogc291cmNlLCBoaWRkZW4gc291cmNlLCBiaW5hcnkgYmxvYnMsIHNvdXJjZSB3cmFwcGVycywgb3IgYW55IG90aGVyIHRlcm0KIHRoYXQgZGVzY3JpYmVzIGtlcm5lbCBkcml2ZXJzIHRoYXQgZG8gbm90IGhhdmUgdGhlaXIgc291cmNlIGNvZGUKIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuICBQbGVhc2UgY29uc3VsdCBhIGxhd3llciBpZiB5b3UgaGF2ZSBhbnkgbGVnYWwKQEAgLTUxLDE5ICs2MCwyMyBAQAogQXNzdW1pbmcgdGhhdCB3ZSBoYWQgYSBzdGFibGUga2VybmVsIHNvdXJjZSBpbnRlcmZhY2UgZm9yIHRoZSBrZXJuZWwsIGEKIGJpbmFyeSBpbnRlcmZhY2Ugd291bGQgbmF0dXJhbGx5IGhhcHBlbiB0b28sIHJpZ2h0PyAgV3JvbmcuICBQbGVhc2UKIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZmFjdHMgYWJvdXQgdGhlIExpbnV4IGtlcm5lbDoKKwogICAtIERlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiB0aGUgQyBjb21waWxlciB5b3UgdXNlLCBkaWZmZXJlbnQga2VybmVsCiAgICAgZGF0YSBzdHJ1Y3R1cmVzIHdpbGwgY29udGFpbiBkaWZmZXJlbnQgYWxpZ25tZW50IG9mIHN0cnVjdHVyZXMsIGFuZAogICAgIHBvc3NpYmx5IGluY2x1ZGUgZGlmZmVyZW50IGZ1bmN0aW9ucyBpbiBkaWZmZXJlbnQgd2F5cyAocHV0dGluZwogICAgIGZ1bmN0aW9ucyBpbmxpbmUgb3Igbm90LikgIFRoZSBpbmRpdmlkdWFsIGZ1bmN0aW9uIG9yZ2FuaXphdGlvbgogICAgIGlzbid0IHRoYXQgaW1wb3J0YW50LCBidXQgdGhlIGRpZmZlcmVudCBkYXRhIHN0cnVjdHVyZSBwYWRkaW5nIGlzCiAgICAgdmVyeSBpbXBvcnRhbnQuCisKICAgLSBEZXBlbmRpbmcgb24gd2hhdCBrZXJuZWwgYnVpbGQgb3B0aW9ucyB5b3Ugc2VsZWN0LCBhIHdpZGUgcmFuZ2Ugb2YKICAgICBkaWZmZXJlbnQgdGhpbmdzIGNhbiBiZSBhc3N1bWVkIGJ5IHRoZSBrZXJuZWw6CisKICAgICAgIC0gZGlmZmVyZW50IHN0cnVjdHVyZXMgY2FuIGNvbnRhaW4gZGlmZmVyZW50IGZpZWxkcwogICAgICAgLSBTb21lIGZ1bmN0aW9ucyBtYXkgbm90IGJlIGltcGxlbWVudGVkIGF0IGFsbCwgKGkuZS4gc29tZSBsb2NrcwogCWNvbXBpbGUgYXdheSB0byBub3RoaW5nIGZvciBub24tU01QIGJ1aWxkcy4pCiAgICAgICAtIE1lbW9yeSB3aXRoaW4gdGhlIGtlcm5lbCBjYW4gYmUgYWxpZ25lZCBpbiBkaWZmZXJlbnQgd2F5cywKIAlkZXBlbmRpbmcgb24gdGhlIGJ1aWxkIG9wdGlvbnMuCisKICAgLSBMaW51eCBydW5zIG9uIGEgd2lkZSByYW5nZSBvZiBkaWZmZXJlbnQgcHJvY2Vzc29yIGFyY2hpdGVjdHVyZXMuCiAgICAgVGhlcmUgaXMgbm8gd2F5IHRoYXQgYmluYXJ5IGRyaXZlcnMgZnJvbSBvbmUgYXJjaGl0ZWN0dXJlIHdpbGwgcnVuCiAgICAgb24gYW5vdGhlciBhcmNoaXRlY3R1cmUgcHJvcGVybHkuCkBAIC0xMDUsNiArMTE4LDcgQEAKIHVuZGVyZ29uZSBhdCBsZWFzdCB0aHJlZSBkaWZmZXJlbnQgcmV3b3JrcyBvdmVyIHRoZSBsaWZldGltZSBvZiB0aGlzCiBzdWJzeXN0ZW0uICBUaGVzZSByZXdvcmtzIHdlcmUgZG9uZSB0byBhZGRyZXNzIGEgbnVtYmVyIG9mIGRpZmZlcmVudAogaXNzdWVzOgorCiAgIC0gQSBjaGFuZ2UgZnJvbSBhIHN5bmNocm9ub3VzIG1vZGVsIG9mIGRhdGEgc3RyZWFtcyB0byBhbiBhc3luY2hyb25vdXMKICAgICBvbmUuICBUaGlzIHJlZHVjZWQgdGhlIGNvbXBsZXhpdHkgb2YgYSBudW1iZXIgb2YgZHJpdmVycyBhbmQKICAgICBpbmNyZWFzZWQgdGhlIHRocm91Z2hwdXQgb2YgYWxsIFVTQiBkcml2ZXJzIHN1Y2ggdGhhdCB3ZSBhcmUgbm93CkBAIC0xNjYsNiArMTgwLDcgQEAKIAogVGhlIHZlcnkgZ29vZCBzaWRlIGVmZmVjdHMgb2YgaGF2aW5nIHlvdXIgZHJpdmVyIGluIHRoZSBtYWluIGtlcm5lbCB0cmVlCiBhcmU6CisKICAgLSBUaGUgcXVhbGl0eSBvZiB0aGUgZHJpdmVyIHdpbGwgcmlzZSBhcyB0aGUgbWFpbnRlbmFuY2UgY29zdHMgKHRvIHRoZQogICAgIG9yaWdpbmFsIGRldmVsb3Blcikgd2lsbCBkZWNyZWFzZS4KICAgLSBPdGhlciBkZXZlbG9wZXJzIHdpbGwgYWRkIGZlYXR1cmVzIHRvIHlvdXIgZHJpdmVyLgpAQCAtMTc1LDcgKzE5MCw3IEBACiAgICAgY2hhbmdlcyByZXF1aXJlIGl0LgogICAtIFRoZSBkcml2ZXIgYXV0b21hdGljYWxseSBnZXRzIHNoaXBwZWQgaW4gYWxsIExpbnV4IGRpc3RyaWJ1dGlvbnMKICAgICB3aXRob3V0IGhhdmluZyB0byBhc2sgdGhlIGRpc3Ryb3MgdG8gYWRkIGl0LgotICAgIAorCiBBcyBMaW51eCBzdXBwb3J0cyBhIGxhcmdlciBudW1iZXIgb2YgZGlmZmVyZW50IGRldmljZXMgIm91dCBvZiB0aGUgYm94IgogdGhhbiBhbnkgb3RoZXIgb3BlcmF0aW5nIHN5c3RlbSwgYW5kIGl0IHN1cHBvcnRzIHRoZXNlIGRldmljZXMgb24gbW9yZQogZGlmZmVyZW50IHByb2Nlc3NvciBhcmNoaXRlY3R1cmVzIHRoYW4gYW55IG90aGVyIG9wZXJhdGluZyBzeXN0ZW0sIHRoaXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3RhYmxlX2tlcm5lbF9ydWxlcy50eHQgYi9Eb2N1bWVudGF0aW9uL3N0YWJsZV9rZXJuZWxfcnVsZXMudHh0CmluZGV4IGZmZDQ1NzUuLjRkODJlMzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3RhYmxlX2tlcm5lbF9ydWxlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zdGFibGVfa2VybmVsX3J1bGVzLnR4dApAQCAtMSw0ICsxLDcgQEAKLUV2ZXJ5dGhpbmcgeW91IGV2ZXIgd2FudGVkIHRvIGtub3cgYWJvdXQgTGludXggLXN0YWJsZSByZWxlYXNlcy4KKy4uIF9zdGFibGVfa2VybmVsX3J1bGVzOgorCitFdmVyeXRoaW5nIHlvdSBldmVyIHdhbnRlZCB0byBrbm93IGFib3V0IExpbnV4IC1zdGFibGUgcmVsZWFzZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBSdWxlcyBvbiB3aGF0IGtpbmQgb2YgcGF0Y2hlcyBhcmUgYWNjZXB0ZWQsIGFuZCB3aGljaCBvbmVzIGFyZSBub3QsIGludG8gdGhlCiAiLXN0YWJsZSIgdHJlZToKQEAgLTIzLDY4ICsyNiw5NCBAQAogICAgcmFjZSBjYW4gYmUgZXhwbG9pdGVkIGlzIGFsc28gcHJvdmlkZWQuCiAgLSBJdCBjYW5ub3QgY29udGFpbiBhbnkgInRyaXZpYWwiIGZpeGVzIGluIGl0IChzcGVsbGluZyBjaGFuZ2VzLAogICAgd2hpdGVzcGFjZSBjbGVhbnVwcywgZXRjKS4KLSAtIEl0IG11c3QgZm9sbG93IHRoZSBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzIHJ1bGVzLgorIC0gSXQgbXVzdCBmb2xsb3cgdGhlCisgICA6cmVmOmBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzIDxzdWJtaXR0aW5ncGF0Y2hlcz5gCisgICBydWxlcy4KICAtIEl0IG9yIGFuIGVxdWl2YWxlbnQgZml4IG11c3QgYWxyZWFkeSBleGlzdCBpbiBMaW51cycgdHJlZSAodXBzdHJlYW0pLgogCiAKLVByb2NlZHVyZSBmb3Igc3VibWl0dGluZyBwYXRjaGVzIHRvIHRoZSAtc3RhYmxlIHRyZWU6CitQcm9jZWR1cmUgZm9yIHN1Ym1pdHRpbmcgcGF0Y2hlcyB0byB0aGUgLXN0YWJsZSB0cmVlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAtIElmIHRoZSBwYXRjaCBjb3ZlcnMgZmlsZXMgaW4gbmV0LyBvciBkcml2ZXJzL25ldCBwbGVhc2UgZm9sbG93IG5ldGRldiBzdGFibGUKICAgIHN1Ym1pc3Npb24gZ3VpZGVsaW5lcyBhcyBkZXNjcmliZWQgaW4KICAgIERvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXRkZXYtRkFRLnR4dAogIC0gU2VjdXJpdHkgcGF0Y2hlcyBzaG91bGQgbm90IGJlIGhhbmRsZWQgKHNvbGVseSkgYnkgdGhlIC1zdGFibGUgcmV2aWV3Ci0gICBwcm9jZXNzIGJ1dCBzaG91bGQgZm9sbG93IHRoZSBwcm9jZWR1cmVzIGluIERvY3VtZW50YXRpb24vU2VjdXJpdHlCdWdzLgorICAgcHJvY2VzcyBidXQgc2hvdWxkIGZvbGxvdyB0aGUgcHJvY2VkdXJlcyBpbgorICAgOnJlZjpgRG9jdW1lbnRhdGlvbi9TZWN1cml0eUJ1Z3MgPHNlY3VyaXR5YnVncz5gLgogCi1Gb3IgYWxsIG90aGVyIHN1Ym1pc3Npb25zLCBjaG9vc2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlczoKK0ZvciBhbGwgb3RoZXIgc3VibWlzc2lvbnMsIGNob29zZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICAtLS0gT3B0aW9uIDEgLS0tCisuLiBfb3B0aW9uXzE6CiAKLSAgIFRvIGhhdmUgdGhlIHBhdGNoIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgaW4gdGhlIHN0YWJsZSB0cmVlLCBhZGQgdGhlIHRhZworT3B0aW9uIDEKKyoqKioqKioqCisKK1RvIGhhdmUgdGhlIHBhdGNoIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgaW4gdGhlIHN0YWJsZSB0cmVlLCBhZGQgdGhlIHRhZworCisuLiBjb2RlLWJsb2NrOjogbm9uZQorCiAgICAgIENjOiBzdGFibGVAdmdlci5rZXJuZWwub3JnCi0gICBpbiB0aGUgc2lnbi1vZmYgYXJlYS4gT25jZSB0aGUgcGF0Y2ggaXMgbWVyZ2VkIGl0IHdpbGwgYmUgYXBwbGllZCB0bwotICAgdGhlIHN0YWJsZSB0cmVlIHdpdGhvdXQgYW55dGhpbmcgZWxzZSBuZWVkaW5nIHRvIGJlIGRvbmUgYnkgdGhlIGF1dGhvcgotICAgb3Igc3Vic3lzdGVtIG1haW50YWluZXIuCiAKLSAgIC0tLSBPcHRpb24gMiAtLS0KK2luIHRoZSBzaWduLW9mZiBhcmVhLiBPbmNlIHRoZSBwYXRjaCBpcyBtZXJnZWQgaXQgd2lsbCBiZSBhcHBsaWVkIHRvCit0aGUgc3RhYmxlIHRyZWUgd2l0aG91dCBhbnl0aGluZyBlbHNlIG5lZWRpbmcgdG8gYmUgZG9uZSBieSB0aGUgYXV0aG9yCitvciBzdWJzeXN0ZW0gbWFpbnRhaW5lci4KIAotICAgQWZ0ZXIgdGhlIHBhdGNoIGhhcyBiZWVuIG1lcmdlZCB0byBMaW51cycgdHJlZSwgc2VuZCBhbiBlbWFpbCB0bwotICAgc3RhYmxlQHZnZXIua2VybmVsLm9yZyBjb250YWluaW5nIHRoZSBzdWJqZWN0IG9mIHRoZSBwYXRjaCwgdGhlIGNvbW1pdCBJRCwKLSAgIHdoeSB5b3UgdGhpbmsgaXQgc2hvdWxkIGJlIGFwcGxpZWQsIGFuZCB3aGF0IGtlcm5lbCB2ZXJzaW9uIHlvdSB3aXNoIGl0IHRvCi0gICBiZSBhcHBsaWVkIHRvLgorLi4gX29wdGlvbl8yOgogCi0gICAtLS0gT3B0aW9uIDMgLS0tCitPcHRpb24gMgorKioqKioqKioKIAotICAgU2VuZCB0aGUgcGF0Y2gsIGFmdGVyIHZlcmlmeWluZyB0aGF0IGl0IGZvbGxvd3MgdGhlIGFib3ZlIHJ1bGVzLCB0bwotICAgc3RhYmxlQHZnZXIua2VybmVsLm9yZy4gIFlvdSBtdXN0IG5vdGUgdGhlIHVwc3RyZWFtIGNvbW1pdCBJRCBpbiB0aGUKLSAgIGNoYW5nZWxvZyBvZiB5b3VyIHN1Ym1pc3Npb24sIGFzIHdlbGwgYXMgdGhlIGtlcm5lbCB2ZXJzaW9uIHlvdSB3aXNoCi0gICBpdCB0byBiZSBhcHBsaWVkIHRvLgorQWZ0ZXIgdGhlIHBhdGNoIGhhcyBiZWVuIG1lcmdlZCB0byBMaW51cycgdHJlZSwgc2VuZCBhbiBlbWFpbCB0bworc3RhYmxlQHZnZXIua2VybmVsLm9yZyBjb250YWluaW5nIHRoZSBzdWJqZWN0IG9mIHRoZSBwYXRjaCwgdGhlIGNvbW1pdCBJRCwKK3doeSB5b3UgdGhpbmsgaXQgc2hvdWxkIGJlIGFwcGxpZWQsIGFuZCB3aGF0IGtlcm5lbCB2ZXJzaW9uIHlvdSB3aXNoIGl0IHRvCitiZSBhcHBsaWVkIHRvLgogCi1PcHRpb24gMSBpcyAqc3Ryb25nbHkqIHByZWZlcnJlZCwgaXMgdGhlIGVhc2llc3QgYW5kIG1vc3QgY29tbW9uLiAgT3B0aW9ucyAyIGFuZAotMyBhcmUgbW9yZSB1c2VmdWwgaWYgdGhlIHBhdGNoIGlzbid0IGRlZW1lZCB3b3J0aHkgYXQgdGhlIHRpbWUgaXQgaXMgYXBwbGllZCB0bwotYSBwdWJsaWMgZ2l0IHRyZWUgKGZvciBpbnN0YW5jZSwgYmVjYXVzZSBpdCBkZXNlcnZlcyBtb3JlIHJlZ3Jlc3Npb24gdGVzdGluZwotZmlyc3QpLiAgT3B0aW9uIDMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaWYgdGhlIHBhdGNoIG5lZWRzIHNvbWUgc3BlY2lhbCBoYW5kbGluZwotdG8gYXBwbHkgdG8gYW4gb2xkZXIga2VybmVsIChlLmcuLCBpZiBBUEkncyBoYXZlIGNoYW5nZWQgaW4gdGhlIG1lYW50aW1lKS4KKy4uIF9vcHRpb25fMzoKIAotTm90ZSB0aGF0IGZvciBPcHRpb24gMywgaWYgdGhlIHBhdGNoIGRldmlhdGVzIGZyb20gdGhlIG9yaWdpbmFsIHVwc3RyZWFtIHBhdGNoCi0oZm9yIGV4YW1wbGUgYmVjYXVzZSBpdCBoYWQgdG8gYmUgYmFja3BvcnRlZCkgdGhpcyBtdXN0IGJlIHZlcnkgY2xlYXJseQotZG9jdW1lbnRlZCBhbmQganVzdGlmaWVkIGluIHRoZSBwYXRjaCBkZXNjcmlwdGlvbi4KK09wdGlvbiAzCisqKioqKioqKgorCitTZW5kIHRoZSBwYXRjaCwgYWZ0ZXIgdmVyaWZ5aW5nIHRoYXQgaXQgZm9sbG93cyB0aGUgYWJvdmUgcnVsZXMsIHRvCitzdGFibGVAdmdlci5rZXJuZWwub3JnLiAgWW91IG11c3Qgbm90ZSB0aGUgdXBzdHJlYW0gY29tbWl0IElEIGluIHRoZQorY2hhbmdlbG9nIG9mIHlvdXIgc3VibWlzc2lvbiwgYXMgd2VsbCBhcyB0aGUga2VybmVsIHZlcnNpb24geW91IHdpc2gKK2l0IHRvIGJlIGFwcGxpZWQgdG8uCisKKzpyZWY6YG9wdGlvbl8xYCBpcyAqKnN0cm9uZ2x5KiogcHJlZmVycmVkLCBpcyB0aGUgZWFzaWVzdCBhbmQgbW9zdCBjb21tb24uCis6cmVmOmBvcHRpb25fMmAgYW5kIDpyZWY6YG9wdGlvbl8zYCBhcmUgbW9yZSB1c2VmdWwgaWYgdGhlIHBhdGNoIGlzbid0IGRlZW1lZAord29ydGh5IGF0IHRoZSB0aW1lIGl0IGlzIGFwcGxpZWQgdG8gYSBwdWJsaWMgZ2l0IHRyZWUgKGZvciBpbnN0YW5jZSwgYmVjYXVzZQoraXQgZGVzZXJ2ZXMgbW9yZSByZWdyZXNzaW9uIHRlc3RpbmcgZmlyc3QpLiAgOnJlZjpgb3B0aW9uXzNgIGlzIGVzcGVjaWFsbHkKK3VzZWZ1bCBpZiB0aGUgcGF0Y2ggbmVlZHMgc29tZSBzcGVjaWFsIGhhbmRsaW5nIHRvIGFwcGx5IHRvIGFuIG9sZGVyIGtlcm5lbAorKGUuZy4sIGlmIEFQSSdzIGhhdmUgY2hhbmdlZCBpbiB0aGUgbWVhbnRpbWUpLgorCitOb3RlIHRoYXQgZm9yIDpyZWY6YG9wdGlvbl8zYCwgaWYgdGhlIHBhdGNoIGRldmlhdGVzIGZyb20gdGhlIG9yaWdpbmFsCit1cHN0cmVhbSBwYXRjaCAoZm9yIGV4YW1wbGUgYmVjYXVzZSBpdCBoYWQgdG8gYmUgYmFja3BvcnRlZCkgdGhpcyBtdXN0IGJlIHZlcnkKK2NsZWFybHkgZG9jdW1lbnRlZCBhbmQganVzdGlmaWVkIGluIHRoZSBwYXRjaCBkZXNjcmlwdGlvbi4KIAogVGhlIHVwc3RyZWFtIGNvbW1pdCBJRCBtdXN0IGJlIHNwZWNpZmllZCB3aXRoIGEgc2VwYXJhdGUgbGluZSBhYm92ZSB0aGUgY29tbWl0CiB0ZXh0LCBsaWtlIHRoaXM6CiAKKy4uIGNvZGUtYmxvY2s6OiBub25lCisKICAgICBjb21taXQgPHNoYTE+IHVwc3RyZWFtLgogCiBBZGRpdGlvbmFsbHksIHNvbWUgcGF0Y2hlcyBzdWJtaXR0ZWQgdmlhIE9wdGlvbiAxIG1heSBoYXZlIGFkZGl0aW9uYWwgcGF0Y2gKIHByZXJlcXVpc2l0ZXMgd2hpY2ggY2FuIGJlIGNoZXJyeS1waWNrZWQuIFRoaXMgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgZm9sbG93aW5nCiBmb3JtYXQgaW4gdGhlIHNpZ24tb2ZmIGFyZWE6CiAKKy4uIGNvZGUtYmxvY2s6OiBub25lCisKICAgICAgQ2M6IDxzdGFibGVAdmdlci5rZXJuZWwub3JnPiAjIDMuMy54OiBhMWY4NGEzOiBzY2hlZDogQ2hlY2sgZm9yIGlkbGUKICAgICAgQ2M6IDxzdGFibGVAdmdlci5rZXJuZWwub3JnPiAjIDMuMy54OiAxYjk1MDhmOiBzY2hlZDogUmF0ZS1saW1pdCBuZXdpZGxlCiAgICAgIENjOiA8c3RhYmxlQHZnZXIua2VybmVsLm9yZz4gIyAzLjMueDogZmQyMTA3Mzogc2NoZWQ6IEZpeCBhZmZpbml0eSBsb2dpYwogICAgICBDYzogPHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmc+ICMgMy4zLngKLSAgICBTaWduZWQtb2ZmLWJ5OiBJbmdvIE1vbG5hciA8bWluZ29AZWx0ZS5odT4KKyAgICAgU2lnbmVkLW9mZi1ieTogSW5nbyBNb2xuYXIgPG1pbmdvQGVsdGUuaHU+CiAKLSAgIFRoZSB0YWcgc2VxdWVuY2UgaGFzIHRoZSBtZWFuaW5nIG9mOgorVGhlIHRhZyBzZXF1ZW5jZSBoYXMgdGhlIG1lYW5pbmcgb2Y6CisKKy4uIGNvZGUtYmxvY2s6OiBub25lCisKICAgICAgZ2l0IGNoZXJyeS1waWNrIGExZjg0YTMKICAgICAgZ2l0IGNoZXJyeS1waWNrIDFiOTUwOGYKICAgICAgZ2l0IGNoZXJyeS1waWNrIGZkMjEwNzMKQEAgLTkzLDEyICsxMjIsMTcgQEAKIEFsc28sIHNvbWUgcGF0Y2hlcyBtYXkgaGF2ZSBrZXJuZWwgdmVyc2lvbiBwcmVyZXF1aXNpdGVzLiAgVGhpcyBjYW4gYmUKIHNwZWNpZmllZCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdCBpbiB0aGUgc2lnbi1vZmYgYXJlYToKIAorLi4gY29kZS1ibG9jazo6IG5vbmUKKwogICAgICBDYzogPHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmc+ICMgMy4zLngtCiAKLSAgIFRoZSB0YWcgaGFzIHRoZSBtZWFuaW5nIG9mOgorVGhlIHRhZyBoYXMgdGhlIG1lYW5pbmcgb2Y6CisKKy4uIGNvZGUtYmxvY2s6OiBub25lCisKICAgICAgZ2l0IGNoZXJyeS1waWNrIDx0aGlzIGNvbW1pdD4KIAotICAgRm9yIGVhY2ggIi1zdGFibGUiIHRyZWUgc3RhcnRpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHZlcnNpb24uCitGb3IgZWFjaCAiLXN0YWJsZSIgdHJlZSBzdGFydGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgdmVyc2lvbi4KIAogRm9sbG93aW5nIHRoZSBzdWJtaXNzaW9uOgogCkBAIC0xMDksNyArMTQzLDggQEAKICAgIG90aGVyIGRldmVsb3BlcnMgYW5kIGJ5IHRoZSByZWxldmFudCBzdWJzeXN0ZW0gbWFpbnRhaW5lci4KIAogCi1SZXZpZXcgY3ljbGU6CitSZXZpZXcgY3ljbGUKKy0tLS0tLS0tLS0tLQogCiAgLSBXaGVuIHRoZSAtc3RhYmxlIG1haW50YWluZXJzIGRlY2lkZSBmb3IgYSByZXZpZXcgY3ljbGUsIHRoZSBwYXRjaGVzIHdpbGwgYmUKICAgIHNlbnQgdG8gdGhlIHJldmlldyBjb21taXR0ZWUsIGFuZCB0aGUgbWFpbnRhaW5lciBvZiB0aGUgYWZmZWN0ZWQgYXJlYSBvZgpAQCAtMTI1LDE3ICsxNjAsMjIgQEAKICAgIHNlY3VyaXR5IGtlcm5lbCB0ZWFtLCBhbmQgbm90IGdvIHRocm91Z2ggdGhlIG5vcm1hbCByZXZpZXcgY3ljbGUuCiAgICBDb250YWN0IHRoZSBrZXJuZWwgc2VjdXJpdHkgdGVhbSBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMgcHJvY2VkdXJlLgogCi1UcmVlczoKK1RyZWVzCistLS0tLQogCiAgLSBUaGUgcXVldWVzIG9mIHBhdGNoZXMsIGZvciBib3RoIGNvbXBsZXRlZCB2ZXJzaW9ucyBhbmQgaW4gcHJvZ3Jlc3MKICAgIHZlcnNpb25zIGNhbiBiZSBmb3VuZCBhdDoKKwogCWh0dHA6Ly9naXQua2VybmVsLm9yZy8/cD1saW51eC9rZXJuZWwvZ2l0L3N0YWJsZS9zdGFibGUtcXVldWUuZ2l0CisKICAtIFRoZSBmaW5hbGl6ZWQgYW5kIHRhZ2dlZCByZWxlYXNlcyBvZiBhbGwgc3RhYmxlIGtlcm5lbHMgY2FuIGJlIGZvdW5kCiAgICBpbiBzZXBhcmF0ZSBicmFuY2hlcyBwZXIgdmVyc2lvbiBhdDoKKwogCWh0dHA6Ly9naXQua2VybmVsLm9yZy8/cD1saW51eC9rZXJuZWwvZ2l0L3N0YWJsZS9saW51eC1zdGFibGUuZ2l0CiAKIAotUmV2aWV3IGNvbW1pdHRlZToKK1JldmlldyBjb21taXR0ZWUKKy0tLS0tLS0tLS0tLS0tLS0KIAogIC0gVGhpcyBpcyBtYWRlIHVwIG9mIGEgbnVtYmVyIG9mIGtlcm5lbCBkZXZlbG9wZXJzIHdobyBoYXZlIHZvbHVudGVlcmVkIGZvcgogICAgdGhpcyB0YXNrLCBhbmQgYSBmZXcgdGhhdCBoYXZlbid0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zdGF0aWMta2V5cy50eHQgYi9Eb2N1bWVudGF0aW9uL3N0YXRpYy1rZXlzLnR4dAppbmRleCA0Nzc5MjdiLi5lYThkN2I0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N0YXRpYy1rZXlzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N0YXRpYy1rZXlzLnR4dApAQCAtMTUsNiArMTUsOCBAQAogCiBERUZJTkVfU1RBVElDX0tFWV9UUlVFKGtleSk7CiBERUZJTkVfU1RBVElDX0tFWV9GQUxTRShrZXkpOworREVGSU5FX1NUQVRJQ19LRVlfQVJSQVlfVFJVRShrZXlzLCBjb3VudCk7CitERUZJTkVfU1RBVElDX0tFWV9BUlJBWV9GQUxTRShrZXlzLCBjb3VudCk7CiBzdGF0aWNfYnJhbmNoX2xpa2VseSgpCiBzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCkKIApAQCAtMTQwLDYgKzE0MiwxMyBAQAoga2V5IGlzIGluaXRpYWxpemVkIGZhbHNlLCBhICdzdGF0aWNfYnJhbmNoX2luYygpJywgd2lsbCBjaGFuZ2UgdGhlIGJyYW5jaCB0bwogdHJ1ZS4gQW5kIHRoZW4gYSAnc3RhdGljX2JyYW5jaF9kZWMoKScsIHdpbGwgYWdhaW4gbWFrZSB0aGUgYnJhbmNoIGZhbHNlLgogCitXaGVyZSBhbiBhcnJheSBvZiBrZXlzIGlzIHJlcXVpcmVkLCBpdCBjYW4gYmUgZGVmaW5lZCBhczoKKworCURFRklORV9TVEFUSUNfS0VZX0FSUkFZX1RSVUUoa2V5cywgY291bnQpOworCitvcjoKKworCURFRklORV9TVEFUSUNfS0VZX0FSUkFZX0ZBTFNFKGtleXMsIGNvdW50KTsKIAogNCkgQXJjaGl0ZWN0dXJlIGxldmVsIGNvZGUgcGF0Y2hpbmcgaW50ZXJmYWNlLCAnanVtcCBsYWJlbHMnCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHJhY2UvZnRyYWNlLWRlc2lnbi50eHQgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL2Z0cmFjZS1kZXNpZ24udHh0CmluZGV4IGRkNWY5MTYuLmEyNzNkZDAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdHJhY2UvZnRyYWNlLWRlc2lnbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi90cmFjZS9mdHJhY2UtZGVzaWduLnR4dApAQCAtMjAzLDYgKzIwMywxNyBAQAogCiBTaW1pbGFybHksIHdoZW4geW91IGNhbGwgZnRyYWNlX3JldHVybl90b19oYW5kbGVyKCksIHBhc3MgaXQgdGhlIGZyYW1lIHBvaW50ZXIuCiAKK0hBVkVfRlVOQ1RJT05fR1JBUEhfUkVUX0FERFJfUFRSCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbiBhcmNoIG1heSBwYXNzIGluIGEgcG9pbnRlciB0byB0aGUgcmV0dXJuIGFkZHJlc3Mgb24gdGhlIHN0YWNrLiAgVGhpcworcHJldmVudHMgcG90ZW50aWFsIHN0YWNrIHVud2luZGluZyBpc3N1ZXMgd2hlcmUgdGhlIHVud2luZGVyIGdldHMgb3V0IG9mCitzeW5jIHdpdGggcmV0X3N0YWNrIGFuZCB0aGUgd3JvbmcgYWRkcmVzc2VzIGFyZSByZXBvcnRlZCBieQorZnRyYWNlX2dyYXBoX3JldF9hZGRyKCkuCisKK0FkZGluZyBzdXBwb3J0IGZvciBpdCBpcyBlYXN5OiBqdXN0IGRlZmluZSB0aGUgbWFjcm8gaW4gYXNtL2Z0cmFjZS5oIGFuZAorcGFzcyB0aGUgcmV0dXJuIGFkZHJlc3MgcG9pbnRlciBhcyB0aGUgJ3JldHAnIGFyZ3VtZW50IHRvCitmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2UoKS4KIAogSEFWRV9GVFJBQ0VfTk1JX0VOVEVSCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHJhY2Uva3Byb2JldHJhY2UudHh0IGIvRG9jdW1lbnRhdGlvbi90cmFjZS9rcHJvYmV0cmFjZS50eHQKaW5kZXggZWE1MmVjMS4uZTQ5OTFmYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi90cmFjZS9rcHJvYmV0cmFjZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi90cmFjZS9rcHJvYmV0cmFjZS50eHQKQEAgLTQ0LDggKzQ0LDggQEAKICAgK3wtb2ZmcyhGRVRDSEFSRykgOiBGZXRjaCBtZW1vcnkgYXQgRkVUQ0hBUkcgK3wtIG9mZnMgYWRkcmVzcy4oKiopCiAgIE5BTUU9RkVUQ0hBUkcgOiBTZXQgTkFNRSBhcyB0aGUgYXJndW1lbnQgbmFtZSBvZiBGRVRDSEFSRy4KICAgRkVUQ0hBUkc6VFlQRSA6IFNldCBUWVBFIGFzIHRoZSB0eXBlIG9mIEZFVENIQVJHLiBDdXJyZW50bHksIGJhc2ljIHR5cGVzCi0JCSAgKHU4L3UxNi91MzIvdTY0L3M4L3MxNi9zMzIvczY0KSwgInN0cmluZyIgYW5kIGJpdGZpZWxkCi0JCSAgYXJlIHN1cHBvcnRlZC4KKwkJICAodTgvdTE2L3UzMi91NjQvczgvczE2L3MzMi9zNjQpLCBoZXhhZGVjaW1hbCB0eXBlcworCQkgICh4OC94MTYveDMyL3g2NCksICJzdHJpbmciIGFuZCBiaXRmaWVsZCBhcmUgc3VwcG9ydGVkLgogCiAgICgqKSBvbmx5IGZvciByZXR1cm4gcHJvYmUuCiAgICgqKikgdGhpcyBpcyB1c2VmdWwgZm9yIGZldGNoaW5nIGEgZmllbGQgb2YgZGF0YSBzdHJ1Y3R1cmVzLgpAQCAtNTQsNyArNTQsMTAgQEAKIC0tLS0tCiBTZXZlcmFsIHR5cGVzIGFyZSBzdXBwb3J0ZWQgZm9yIGZldGNoLWFyZ3MuIEtwcm9iZSB0cmFjZXIgd2lsbCBhY2Nlc3MgbWVtb3J5CiBieSBnaXZlbiB0eXBlLiBQcmVmaXggJ3MnIGFuZCAndScgbWVhbnMgdGhvc2UgdHlwZXMgYXJlIHNpZ25lZCBhbmQgdW5zaWduZWQKLXJlc3BlY3RpdmVseS4gVHJhY2VkIGFyZ3VtZW50cyBhcmUgc2hvd24gaW4gZGVjaW1hbCAoc2lnbmVkKSBvciBoZXggKHVuc2lnbmVkKS4KK3Jlc3BlY3RpdmVseS4gJ3gnIHByZWZpeCBpbXBsaWVzIGl0IGlzIHVuc2lnbmVkLiBUcmFjZWQgYXJndW1lbnRzIGFyZSBzaG93bgoraW4gZGVjaW1hbCAoJ3MnIGFuZCAndScpIG9yIGhleGFkZWNpbWFsICgneCcpLiBXaXRob3V0IHR5cGUgY2FzdGluZywgJ3gzMicKK29yICd4NjQnIGlzIHVzZWQgZGVwZW5kcyBvbiB0aGUgYXJjaGl0ZWN0dXJlIChlLmcuIHg4Ni0zMiB1c2VzIHgzMiwgYW5kCit4ODYtNjQgdXNlcyB4NjQpLgogU3RyaW5nIHR5cGUgaXMgYSBzcGVjaWFsIHR5cGUsIHdoaWNoIGZldGNoZXMgYSAibnVsbC10ZXJtaW5hdGVkIiBzdHJpbmcgZnJvbQoga2VybmVsIHNwYWNlLiBUaGlzIG1lYW5zIGl0IHdpbGwgZmFpbCBhbmQgc3RvcmUgTlVMTCBpZiB0aGUgc3RyaW5nIGNvbnRhaW5lcgogaGFzIGJlZW4gcGFnZWQgb3V0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90cmFjZS91cHJvYmV0cmFjZXIudHh0IGIvRG9jdW1lbnRhdGlvbi90cmFjZS91cHJvYmV0cmFjZXIudHh0CmluZGV4IDcyZDFjZDQuLjk0YjZiNDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdHJhY2UvdXByb2JldHJhY2VyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL3Vwcm9iZXRyYWNlci50eHQKQEAgLTQwLDggKzQwLDggQEAKICAgICt8LW9mZnMoRkVUQ0hBUkcpIDogRmV0Y2ggbWVtb3J5IGF0IEZFVENIQVJHICt8LSBvZmZzIGFkZHJlc3MuKCoqKQogICAgTkFNRT1GRVRDSEFSRyAgICAgOiBTZXQgTkFNRSBhcyB0aGUgYXJndW1lbnQgbmFtZSBvZiBGRVRDSEFSRy4KICAgIEZFVENIQVJHOlRZUEUgICAgIDogU2V0IFRZUEUgYXMgdGhlIHR5cGUgb2YgRkVUQ0hBUkcuIEN1cnJlbnRseSwgYmFzaWMgdHlwZXMKLQkJICAgICAgICh1OC91MTYvdTMyL3U2NC9zOC9zMTYvczMyL3M2NCksICJzdHJpbmciIGFuZCBiaXRmaWVsZAotCQkgICAgICAgYXJlIHN1cHBvcnRlZC4KKwkJICAgICAgICh1OC91MTYvdTMyL3U2NC9zOC9zMTYvczMyL3M2NCksIGhleGFkZWNpbWFsIHR5cGVzCisJCSAgICAgICAoeDgveDE2L3gzMi94NjQpLCAic3RyaW5nIiBhbmQgYml0ZmllbGQgYXJlIHN1cHBvcnRlZC4KIAogICAoKikgb25seSBmb3IgcmV0dXJuIHByb2JlLgogICAoKiopIHRoaXMgaXMgdXNlZnVsIGZvciBmZXRjaGluZyBhIGZpZWxkIG9mIGRhdGEgc3RydWN0dXJlcy4KQEAgLTUwLDcgKzUwLDEwIEBACiAtLS0tLQogU2V2ZXJhbCB0eXBlcyBhcmUgc3VwcG9ydGVkIGZvciBmZXRjaC1hcmdzLiBVcHJvYmUgdHJhY2VyIHdpbGwgYWNjZXNzIG1lbW9yeQogYnkgZ2l2ZW4gdHlwZS4gUHJlZml4ICdzJyBhbmQgJ3UnIG1lYW5zIHRob3NlIHR5cGVzIGFyZSBzaWduZWQgYW5kIHVuc2lnbmVkCi1yZXNwZWN0aXZlbHkuIFRyYWNlZCBhcmd1bWVudHMgYXJlIHNob3duIGluIGRlY2ltYWwgKHNpZ25lZCkgb3IgaGV4ICh1bnNpZ25lZCkuCityZXNwZWN0aXZlbHkuICd4JyBwcmVmaXggaW1wbGllcyBpdCBpcyB1bnNpZ25lZC4gVHJhY2VkIGFyZ3VtZW50cyBhcmUgc2hvd24KK2luIGRlY2ltYWwgKCdzJyBhbmQgJ3UnKSBvciBoZXhhZGVjaW1hbCAoJ3gnKS4gV2l0aG91dCB0eXBlIGNhc3RpbmcsICd4MzInCitvciAneDY0JyBpcyB1c2VkIGRlcGVuZHMgb24gdGhlIGFyY2hpdGVjdHVyZSAoZS5nLiB4ODYtMzIgdXNlcyB4MzIsIGFuZAoreDg2LTY0IHVzZXMgeDY0KS4KIFN0cmluZyB0eXBlIGlzIGEgc3BlY2lhbCB0eXBlLCB3aGljaCBmZXRjaGVzIGEgIm51bGwtdGVybWluYXRlZCIgc3RyaW5nIGZyb20KIHVzZXIgc3BhY2UuCiBCaXRmaWVsZCBpcyBhbm90aGVyIHNwZWNpYWwgdHlwZSwgd2hpY2ggdGFrZXMgMyBwYXJhbWV0ZXJzLCBiaXQtd2lkdGgsIGJpdC0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdWJzYW4udHh0IGIvRG9jdW1lbnRhdGlvbi91YnNhbi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODIxNWUuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi91YnNhbi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi1VbmRlZmluZWQgQmVoYXZpb3IgU2FuaXRpemVyIC0gVUJTQU4KLQotT3ZlcnZpZXcKLS0tLS0tLS0tCi0KLVVCU0FOIGlzIGEgcnVudGltZSB1bmRlZmluZWQgYmVoYXZpb3VyIGNoZWNrZXIuCi0KLVVCU0FOIHVzZXMgY29tcGlsZS10aW1lIGluc3RydW1lbnRhdGlvbiB0byBjYXRjaCB1bmRlZmluZWQgYmVoYXZpb3IgKFVCKS4KLUNvbXBpbGVyIGluc2VydHMgY29kZSB0aGF0IHBlcmZvcm0gY2VydGFpbiBraW5kcyBvZiBjaGVja3MgYmVmb3JlIG9wZXJhdGlvbnMKLXRoYXQgbWF5IGNhdXNlIFVCLiBJZiBjaGVjayBmYWlscyAoaS5lLiBVQiBkZXRlY3RlZCkgX191YnNhbl9oYW5kbGVfKgotZnVuY3Rpb24gY2FsbGVkIHRvIHByaW50IGVycm9yIG1lc3NhZ2UuCi0KLUdDQyBoYXMgdGhhdCBmZWF0dXJlIHNpbmNlIDQuOS54IFsxXSAoc2VlIC1mc2FuaXRpemU9dW5kZWZpbmVkIG9wdGlvbiBhbmQKLWl0cyBzdWJvcHRpb25zKS4gR0NDIDUueCBoYXMgbW9yZSBjaGVja2VycyBpbXBsZW1lbnRlZCBbMl0uCi0KLVJlcG9ydCBleGFtcGxlCi0tLS0tLS0tLS0tLS0tLS0KLQotCSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCSBVQlNBTjogVW5kZWZpbmVkIGJlaGF2aW91ciBpbiAuLi9pbmNsdWRlL2xpbnV4L2JpdG9wcy5oOjExMDozMwotCSBzaGlmdCBleHBvbmVudCAzMiBpcyB0byBsYXJnZSBmb3IgMzItYml0IHR5cGUgJ3Vuc2lnbmVkIGludCcKLQkgQ1BVOiAwIFBJRDogMCBDb21tOiBzd2FwcGVyIE5vdCB0YWludGVkIDQuNC4wLXJjMSsgIzI2Ci0JICAwMDAwMDAwMDAwMDAwMDAwIGZmZmZmZmZmODI0MDNjYzggZmZmZmZmZmY4MTVlNmNkNiAwMDAwMDAwMDAwMDAwMDAxCi0JICBmZmZmZmZmZjgyNDAzY2Y4IGZmZmZmZmZmODI0MDNjZTAgZmZmZmZmZmY4MTYzYTVlZCAwMDAwMDAwMDAwMDAwMDIwCi0JICBmZmZmZmZmZjgyNDAzZDc4IGZmZmZmZmZmODE2M2FjMmIgZmZmZmZmZmY4MTVmMDAwMSAwMDAwMDAwMDAwMDAwMDAyCi0JIENhbGwgVHJhY2U6Ci0JICBbPGZmZmZmZmZmODE1ZTZjZDY+XSBkdW1wX3N0YWNrKzB4NDUvMHg1ZgotCSAgWzxmZmZmZmZmZjgxNjNhNWVkPl0gdWJzYW5fZXBpbG9ndWUrMHhkLzB4NDAKLQkgIFs8ZmZmZmZmZmY4MTYzYWMyYj5dIF9fdWJzYW5faGFuZGxlX3NoaWZ0X291dF9vZl9ib3VuZHMrMHhlYi8weDEzMAotCSAgWzxmZmZmZmZmZjgxNWYwMDAxPl0gPyByYWRpeF90cmVlX2dhbmdfbG9va3VwX3Nsb3QrMHg1MS8weDE1MAotCSAgWzxmZmZmZmZmZjgxNzNjNTg2Pl0gX21peF9wb29sX2J5dGVzKzB4MWU2LzB4NDgwCi0JICBbPGZmZmZmZmZmODMxMDU2NTM+XSA/IGRtaV93YWxrX2Vhcmx5KzB4NDgvMHg1YwotCSAgWzxmZmZmZmZmZjgxNzNjODgxPl0gYWRkX2RldmljZV9yYW5kb21uZXNzKzB4NjEvMHgxMzAKLQkgIFs8ZmZmZmZmZmY4MzEwNWIzNT5dID8gZG1pX3NhdmVfb25lX2RldmljZSsweGFhLzB4YWEKLQkgIFs8ZmZmZmZmZmY4MzEwNTY1Mz5dIGRtaV93YWxrX2Vhcmx5KzB4NDgvMHg1YwotCSAgWzxmZmZmZmZmZjgzMTA2NmFlPl0gZG1pX3NjYW5fbWFjaGluZSsweDI3OC8weDRiNAotCSAgWzxmZmZmZmZmZjgxMTFkNThhPl0gPyB2cHJpbnRrX2RlZmF1bHQrMHgxYS8weDIwCi0JICBbPGZmZmZmZmZmODMwYWQxMjA+XSA/IGVhcmx5X2lkdF9oYW5kbGVyX2FycmF5KzB4MTIwLzB4MTIwCi0JICBbPGZmZmZmZmZmODMwYjIyNDA+XSBzZXR1cF9hcmNoKzB4NDA1LzB4YzJjCi0JICBbPGZmZmZmZmZmODMwYWQxMjA+XSA/IGVhcmx5X2lkdF9oYW5kbGVyX2FycmF5KzB4MTIwLzB4MTIwCi0JICBbPGZmZmZmZmZmODMwYWUwNTM+XSBzdGFydF9rZXJuZWwrMHg4My8weDQ5YQotCSAgWzxmZmZmZmZmZjgzMGFkMTIwPl0gPyBlYXJseV9pZHRfaGFuZGxlcl9hcnJheSsweDEyMC8weDEyMAotCSAgWzxmZmZmZmZmZjgzMGFkMzg2Pl0geDg2XzY0X3N0YXJ0X3Jlc2VydmF0aW9ucysweDJhLzB4MmMKLQkgIFs8ZmZmZmZmZmY4MzBhZDRmMz5dIHg4Nl82NF9zdGFydF9rZXJuZWwrMHgxNmIvMHgxN2EKLQkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVXNhZ2UKLS0tLS0tCi0KLVRvIGVuYWJsZSBVQlNBTiBjb25maWd1cmUga2VybmVsIHdpdGg6Ci0KLQlDT05GSUdfVUJTQU49eQotCi1hbmQgdG8gY2hlY2sgdGhlIGVudGlyZSBrZXJuZWw6Ci0KLSAgICAgICAgQ09ORklHX1VCU0FOX1NBTklUSVpFX0FMTD15Ci0KLVRvIGVuYWJsZSBpbnN0cnVtZW50YXRpb24gZm9yIHNwZWNpZmljIGZpbGVzIG9yIGRpcmVjdG9yaWVzLCBhZGQgYSBsaW5lCi1zaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgdG8gdGhlIHJlc3BlY3RpdmUga2VybmVsIE1ha2VmaWxlOgotCi0gICAgICAgIEZvciBhIHNpbmdsZSBmaWxlIChlLmcuIG1haW4ubyk6Ci0gICAgICAgICAgICAgICAgVUJTQU5fU0FOSVRJWkVfbWFpbi5vIDo9IHkKLQotICAgICAgICBGb3IgYWxsIGZpbGVzIGluIG9uZSBkaXJlY3Rvcnk6Ci0gICAgICAgICAgICAgICAgVUJTQU5fU0FOSVRJWkUgOj0geQotCi1UbyBleGNsdWRlIGZpbGVzIGZyb20gYmVpbmcgaW5zdHJ1bWVudGVkIGV2ZW4gaWYKLUNPTkZJR19VQlNBTl9TQU5JVElaRV9BTEw9eSwgdXNlOgotCi0gICAgICAgICAgICAgICAgVUJTQU5fU0FOSVRJWkVfbWFpbi5vIDo9IG4KLSAgICAgICAgYW5kOgotICAgICAgICAgICAgICAgIFVCU0FOX1NBTklUSVpFIDo9IG4KLQotRGV0ZWN0aW9uIG9mIHVuYWxpZ25lZCBhY2Nlc3NlcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIHNlcGFyYXRlIG9wdGlvbiAtCi1DT05GSUdfVUJTQU5fQUxJR05NRU5ULiBJdCdzIG9mZiBieSBkZWZhdWx0IG9uIGFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0Ci11bmFsaWduZWQgYWNjZXNzZXMgKENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTPXkpLiBPbmUgY291bGQKLXN0aWxsIGVuYWJsZSBpdCBpbiBjb25maWcsIGp1c3Qgbm90ZSB0aGF0IGl0IHdpbGwgcHJvZHVjZSBhIGxvdCBvZiBVQlNBTgotcmVwb3J0cy4KLQotUmVmZXJlbmNlcwotLS0tLS0tLS0tLQotCi1bMV0gLSBodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjLTQuOS4wL2djYy9EZWJ1Z2dpbmctT3B0aW9ucy5odG1sCi1bMl0gLSBodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjL0RlYnVnZ2luZy1PcHRpb25zLmh0bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdm1lX2FwaS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZtZV9hcGkudHh0CmluZGV4IGNhNWI4MjcuLjkwMDA2NTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdm1lX2FwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92bWVfYXBpLnR4dApAQCAtOCwxMyArOCwxNCBAQAogd2l0aCB0aGUgVk1FIHN1YnN5c3RlbSwgdHlwaWNhbGx5IGNhbGxlZCBmcm9tIHRoZSBkZXZpY2VzIGluaXQgcm91dGluZS4gIFRoaXMgaXMKIGFjaGlldmVkIHZpYSBhIGNhbGwgdG8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKIAotCWludCB2bWVfcmVnaXN0ZXJfZHJpdmVyIChzdHJ1Y3Qgdm1lX2RyaXZlciAqZHJpdmVyKTsKKwlpbnQgdm1lX3JlZ2lzdGVyX2RyaXZlciAoc3RydWN0IHZtZV9kcml2ZXIgKmRyaXZlciwgdW5zaWduZWQgaW50IG5kZXZzKTsKIAogSWYgZHJpdmVyIHJlZ2lzdHJhdGlvbiBpcyBzdWNjZXNzZnVsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvLCBpZiBhbiBlcnJvcgogb2NjdXJyZWQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIHdpbGwgYmUgcmV0dXJuZWQuCiAKIEEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBvZiB0eXBlICd2bWVfZHJpdmVyJyBtdXN0IGJlIHByb3ZpZGVkIHRvIHRoZQotcmVnaXN0cmF0aW9uIGZ1bmN0aW9uLiBUaGUgc3RydWN0dXJlIGlzIGFzIGZvbGxvd3M6CityZWdpc3RyYXRpb24gZnVuY3Rpb24uIEFsb25nIHdpdGggbmRldnMsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgZGV2aWNlcyB5b3VyCitkcml2ZXIgaXMgYWJsZSB0byBzdXBwb3J0LiBUaGUgc3RydWN0dXJlIGlzIGFzIGZvbGxvd3M6CiAKIAlzdHJ1Y3Qgdm1lX2RyaXZlciB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKQEAgLTMyLDggKzMzLDggQEAKIHNob3VsZCBiZSBjb3JyZWN0bHkgc2V0LiBUaGUgJy5uYW1lJyBlbGVtZW50IGlzIGEgcG9pbnRlciB0byBhIHN0cmluZyBob2xkaW5nCiB0aGUgZGV2aWNlIGRyaXZlcidzIG5hbWUuCiAKLVRoZSAnLm1hdGNoJyBmdW5jdGlvbiBhbGxvd3MgY29udHJvbGxpbmcgdGhlIG51bWJlciBvZiBkZXZpY2VzIHRoYXQgbmVlZCB0bwotYmUgcmVnaXN0ZXJlZC4gVGhlIG1hdGNoIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gMSBpZiBhIGRldmljZSBzaG91bGQgYmUKK1RoZSAnLm1hdGNoJyBmdW5jdGlvbiBhbGxvd3MgY29udHJvbCBvdmVyIHdoaWNoIFZNRSBkZXZpY2VzIHNob3VsZCBiZSByZWdpc3RlcmVkCit3aXRoIHRoZSBkcml2ZXIuIFRoZSBtYXRjaCBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIDEgaWYgYSBkZXZpY2Ugc2hvdWxkIGJlCiBwcm9iZWQgYW5kIDAgb3RoZXJ3aXNlLiBUaGlzIGV4YW1wbGUgbWF0Y2ggZnVuY3Rpb24gKGZyb20gdm1lX3VzZXIuYykgbGltaXRzCiB0aGUgbnVtYmVyIG9mIGRldmljZXMgcHJvYmVkIHRvIG9uZToKIApAQCAtMzg1LDEzICszODYsMTMgQEAKIGFkamFjZW50IGxvY2F0aW9uczoKIAogCWludCB2bWVfbG1fYXR0YWNoKHN0cnVjdCB2bWVfcmVzb3VyY2UgKnJlcywgaW50IG51bSwKLQkJdm9pZCAoKmNhbGxiYWNrKShpbnQpKTsKKwkJdm9pZCAoKmNhbGxiYWNrKSh2b2lkICopKTsKIAogCWludCB2bWVfbG1fZGV0YWNoKHN0cnVjdCB2bWVfcmVzb3VyY2UgKnJlcywgaW50IG51bSk7CiAKIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBkZWNsYXJlZCBhcyBmb2xsb3dzLgogCi0Jdm9pZCBjYWxsYmFjayhpbnQgbnVtKTsKKwl2b2lkIGNhbGxiYWNrKHZvaWQgKmRhdGEpOwogCiAKIFNsb3QgRGV0ZWN0aW9uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvbW0udHh0IGIvRG9jdW1lbnRhdGlvbi94ODYveDg2XzY0L21tLnR4dAppbmRleCA4YzdkZDU5NS4uNTcyNDA5MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi94ODYveDg2XzY0L21tLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvbW0udHh0CkBAIC0xMiwxMyArMTIsMTMgQEAKIGZmZmZlOTAwMDAwMDAwMDAgLSBmZmZmZTlmZmZmZmZmZmZmICg9NDAgYml0cykgaG9sZQogZmZmZmVhMDAwMDAwMDAwMCAtIGZmZmZlYWZmZmZmZmZmZmYgKD00MCBiaXRzKSB2aXJ0dWFsIG1lbW9yeSBtYXAgKDFUQikKIC4uLiB1bnVzZWQgaG9sZSAuLi4KLWZmZmZlYzAwMDAwMDAwMDAgLSBmZmZmZmMwMDAwMDAwMDAwICg9NDQgYml0cykga2FzYW4gc2hhZG93IG1lbW9yeSAoMTZUQikKK2ZmZmZlYzAwMDAwMDAwMDAgLSBmZmZmZmJmZmZmZmZmZmZmICg9NDQgYml0cykga2FzYW4gc2hhZG93IG1lbW9yeSAoMTZUQikKIC4uLiB1bnVzZWQgaG9sZSAuLi4KIGZmZmZmZjAwMDAwMDAwMDAgLSBmZmZmZmY3ZmZmZmZmZmZmICg9MzkgYml0cykgJWVzcCBmaXh1cCBzdGFja3MKIC4uLiB1bnVzZWQgaG9sZSAuLi4KLWZmZmZmZmVmMDAwMDAwMDAgLSBmZmZmZmZmZjAwMDAwMDAwICg9NjQgR0IpIEVGSSByZWdpb24gbWFwcGluZyBzcGFjZQorZmZmZmZmZWYwMDAwMDAwMCAtIGZmZmZmZmZlZmZmZmZmZmYgKD02NCBHQikgRUZJIHJlZ2lvbiBtYXBwaW5nIHNwYWNlCiAuLi4gdW51c2VkIGhvbGUgLi4uCi1mZmZmZmZmZjgwMDAwMDAwIC0gZmZmZmZmZmZhMDAwMDAwMCAoPTUxMiBNQikgIGtlcm5lbCB0ZXh0IG1hcHBpbmcsIGZyb20gcGh5cyAwCitmZmZmZmZmZjgwMDAwMDAwIC0gZmZmZmZmZmY5ZmZmZmZmZiAoPTUxMiBNQikgIGtlcm5lbCB0ZXh0IG1hcHBpbmcsIGZyb20gcGh5cyAwCiBmZmZmZmZmZmEwMDAwMDAwIC0gZmZmZmZmZmZmZjVmZmZmZiAoPTE1MjYgTUIpIG1vZHVsZSBtYXBwaW5nIHNwYWNlCiBmZmZmZmZmZmZmNjAwMDAwIC0gZmZmZmZmZmZmZmRmZmZmZiAoPTggTUIpIHZzeXNjYWxscwogZmZmZmZmZmZmZmUwMDAwMCAtIGZmZmZmZmZmZmZmZmZmZmYgKD0yIE1CKSB1bnVzZWQgaG9sZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94dGVuc2EvbW11LnR4dCBiL0RvY3VtZW50YXRpb24veHRlbnNhL21tdS50eHQKaW5kZXggMDMxMmZlNi4uMjIyYTJjNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi94dGVuc2EvbW11LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3h0ZW5zYS9tbXUudHh0CkBAIC0zLDE1ICszLDggQEAKIFRoZSBjb2RlIGluIHRoZSBpbml0aWFsaXplX21tdSBtYWNybyBzZXRzIHVwIE1NVXYzIG1lbW9yeSBtYXBwaW5nCiBpZGVudGljYWxseSB0byBNTVV2MiBmaXhlZCBtZW1vcnkgbWFwcGluZy4gRGVwZW5kaW5nIG9uCiBDT05GSUdfSU5JVElBTElaRV9YVEVOU0FfTU1VX0lOU0lERV9WTUxJTlVYIHN5bWJvbCB0aGlzIGNvZGUgaXMKLWxvY2F0ZWQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgYWRkcmVzcyByYW5nZXM6Ci0KLSAgICAweEYwMDAwMDAwLi4weEZGRkZGRkZGICh3aWxsIGtlZXAgc2FtZSBhZGRyZXNzIGluIE1NVSB2MiBsYXlvdXQ7Ci0gICAgCQkJIHR5cGljYWxseSBST00pCi0gICAgMHgwMDAwMDAwMC4uMHgwN0ZGRkZGRiAoc3lzdGVtIFJBTTsgdGhpcyBjb2RlIGlzIGFjdHVhbGx5IGxpbmtlZAotICAgIAkJCSBhdCAweEQwMDAwMDAwLi4weEQ3RkZGRkZGIFtjYWNoZWRdCi0gICAgCQkJIG9yIDB4RDgwMDAwMDAuLjB4REZGRkZGRkYgW3VuY2FjaGVkXTsKLSAgICAJCQkgaW4gYW55IGNhc2UsIGluaXRpYWxseSBydW5zIGVsc2V3aGVyZQotICAgIAkJCSB0aGFuIGxpbmtlZCwgc28gaGF2ZSB0byBiZSBjYXJlZnVsKQorbG9jYXRlZCBpbiBhZGRyZXNzZXMgaXQgd2FzIGxpbmtlZCBmb3IgKHN5bWJvbCB1bmRlZmluZWQpLCBvciBub3QKKyhzeW1ib2wgZGVmaW5lZCksIHNvIGl0IG5lZWRzIHRvIGJlIHBvc2l0aW9uLWluZGVwZW5kZW50LgogCiBUaGUgY29kZSBoYXMgdGhlIGZvbGxvd2luZyBhc3N1bXB0aW9uczoKICAgVGhpcyBjb2RlIGZyYWdtZW50IGlzIHJ1biBvbmx5IG9uIGFuIE1NVSB2My4KQEAgLTI4LDI0ICsyMSwyNiBAQAogICAgIFBBID0gcGh5c2ljYWwgYWRkcmVzcyAodHdvIHVwcGVyIG5pYmJsZXMgb2YgaXQpOwogICAgIHBjID0gcGh5c2ljYWwgcmFuZ2UgdGhhdCBjb250YWlucyB0aGlzIGNvZGU7CiAKLUFmdGVyIHN0ZXAgMiwgd2UganVtcCB0byB2aXJ0dWFsIGFkZHJlc3MgaW4gMHg0MDAwMDAwMC4uMHg1ZmZmZmZmZgotdGhhdCBjb3JyZXNwb25kcyB0byBuZXh0IGluc3RydWN0aW9uIHRvIGV4ZWN1dGUgaW4gdGhpcyBjb2RlLgotQWZ0ZXIgc3RlcCA0LCB3ZSBqdW1wIHRvIGludGVuZGVkIChsaW5rZWQpIGFkZHJlc3Mgb2YgdGhpcyBjb2RlLgorQWZ0ZXIgc3RlcCAyLCB3ZSBqdW1wIHRvIHZpcnR1YWwgYWRkcmVzcyBpbiB0aGUgcmFuZ2UgMHg0MDAwMDAwMC4uMHg1ZmZmZmZmZgorb3IgMHgwMDAwMDAwMC4uMHgxZmZmZmZmZiwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGtlcm5lbCB3YXMgbG9hZGVkIGJlbG93CisweDQwMDAwMDAwIG9yIGFib3ZlLiBUaGF0IGFkZHJlc3MgY29ycmVzcG9uZHMgdG8gbmV4dCBpbnN0cnVjdGlvbiB0byBleGVjdXRlCitpbiB0aGlzIGNvZGUuIEFmdGVyIHN0ZXAgNCwgd2UganVtcCB0byBpbnRlbmRlZCAobGlua2VkKSBhZGRyZXNzIG9mIHRoaXMgY29kZS4KK1RoZSBzY2hlbWUgYmVsb3cgYXNzdW1lcyB0aGF0IHRoZSBrZXJuZWwgaXMgbG9hZGVkIGJlbG93IDB4NDAwMDAwMDAuCiAKLSAgICBTdGVwIDAgICAgIFN0ZXAxICAgICBTdGVwIDIgICAgIFN0ZXAzICAgICBTdGVwIDQgICAgIFN0ZXA1Ci0gPT09PT09PT09PT09ICA9PT09PSAgPT09PT09PT09PT09ICA9PT09PSAgPT09PT09PT09PT09ICA9PT09PQotICAgVkEgICAgICBQQSAgICAgUEEgICAgVkEgICAgICBQQSAgICAgUEEgICAgVkEgICAgICBQQSAgICAgUEEKLSAtLS0tLS0gICAgLS0gICAgIC0tICAtLS0tLS0gICAgLS0gICAgIC0tICAtLS0tLS0gICAgLS0gICAgIC0tCi0gRTAuLkZGIC0+IEUwICAtPiBFMCAgRTAuLkZGIC0+IEUwICAgICAgICAgRjAuLkZGIC0+IEYwICAtPiBGMAotIEMwLi5ERiAtPiBDMCAgLT4gQzAgIEMwLi5ERiAtPiBDMCAgICAgICAgIEUwLi5FRiAtPiBGMCAgLT4gRjAKLSBBMC4uQkYgLT4gQTAgIC0+IEEwICBBMC4uQkYgLT4gQTAgICAgICAgICBEOC4uREYgLT4gMDAgIC0+IDAwCi0gODAuLjlGIC0+IDgwICAtPiA4MCAgODAuLjlGIC0+IDgwICAgICAgICAgRDAuLkQ3IC0+IDAwICAtPiAwMAotIDYwLi43RiAtPiA2MCAgLT4gNjAgIDYwLi43RiAtPiA2MAotIDQwLi41RiAtPiA0MCAgICAgICAgIDQwLi41RiAtPiBwYyAgLT4gcGMgIDQwLi41RiAtPiBwYwotIDIwLi4zRiAtPiAyMCAgLT4gMjAgIDIwLi4zRiAtPiAyMAotIDAwLi4xRiAtPiAwMCAgLT4gMDAgIDAwLi4xRiAtPiAwMAorICAgICAgICBTdGVwMCAgU3RlcDEgIFN0ZXAyICBTdGVwMyAgICAgICAgICBTdGVwNCAgU3RlcDUKKyAgICAgICAgPT09PT0gID09PT09ICA9PT09PSAgPT09PT0gICAgICAgICAgPT09PT0gID09PT09CisgICBWQSAgICAgIFBBICAgICBQQSAgICAgUEEgICAgIFBBICAgICBWQSAgICAgIFBBICAgICBQQQorIC0tLS0tLSAgICAtLSAgICAgLS0gICAgIC0tICAgICAtLSAgIC0tLS0tLSAgICAtLSAgICAgLS0KKyBFMC4uRkYgLT4gRTAgIC0+IEUwICAtPiBFMCAgICAgICAgICBGMC4uRkYgLT4gRjAgIC0+IEYwCisgQzAuLkRGIC0+IEMwICAtPiBDMCAgLT4gQzAgICAgICAgICAgRTAuLkVGIC0+IEYwICAtPiBGMAorIEEwLi5CRiAtPiBBMCAgLT4gQTAgIC0+IEEwICAgICAgICAgIEQ4Li5ERiAtPiAwMCAgLT4gMDAKKyA4MC4uOUYgLT4gODAgIC0+IDgwICAtPiA4MCAgICAgICAgICBEMC4uRDcgLT4gMDAgIC0+IDAwCisgNjAuLjdGIC0+IDYwICAtPiA2MCAgLT4gNjAKKyA0MC4uNUYgLT4gNDAgICAgICAgICAtPiBwYyAgLT4gcGMgICA0MC4uNUYgLT4gcGMKKyAyMC4uM0YgLT4gMjAgIC0+IDIwICAtPiAyMAorIDAwLi4xRiAtPiAwMCAgLT4gMDAgIC0+IDAwCiAKLVRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIElPIHBlcmlwaGVyYWxzIGlzIGFib3ZlIDB4ZjAwMDAwMDAuIFRoaXMgbWF5IGNoYW5nZQorVGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgSU8gcGVyaXBoZXJhbHMgaXMgYWJvdmUgMHhmMDAwMDAwMC4gVGhpcyBtYXkgYmUgY2hhbmdlZAogdXNpbmcgYSAicmFuZ2VzIiBwcm9wZXJ0eSBpbiBhIGRldmljZSB0cmVlIHNpbXBsZS1idXMgbm9kZS4gU2VlIGVQQVBSIDEuMSwgwqc2LjUKIGZvciBkZXRhaWxzIG9uIHRoZSBzeW50YXggYW5kIHNlbWFudGljIG9mIHNpbXBsZS1idXMgbm9kZXMuIFRoZSBmb2xsb3dpbmcKIGxpbWl0YXRpb25zIGFwcGx5OgpAQCAtNjIsMyArNTcsMTI3IEBACiAKIDYuIFRoZSBJTyBhcmVhIGNvdmVycyB0aGUgZW50aXJlIDI1Nk1CIHNlZ21lbnQgb2YgcGFyZW50LWJ1cy1hZGRyZXNzOyB0aGUKICAgICJyYW5nZXMiIHRyaXBsZXQgbGVuZ3RoIGZpZWxkIGlzIGlnbm9yZWQKKworCitNTVV2MyBhZGRyZXNzIHNwYWNlIGxheW91dHMuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0RlZmF1bHQgTU1VdjItY29tcGF0aWJsZSBsYXlvdXQuCisKKyAgICAgICAgICAgICAgICAgICAgICBTeW1ib2wgICAgICAgICAgICAgICAgICAgVkFERFIgICAgICAgU2l6ZQorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgVXNlcnNwYWNlICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMCAgVEFTS19TSVpFCisrLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IFBhZ2UgdGFibGUgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKystLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDQwMDAwMAorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgS01BUCBhcmVhICAgICAgICB8ICBQS01BUF9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRSU19QRVJfUFRFICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRENBQ0hFX05fQ09MT1JTICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9TSVpFCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0TUIgKiBEQ0FDSEVfTl9DT0xPUlMpCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBBdG9taWMgS01BUCBhcmVhIHwgIEZJWEFERFJfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICBLTV9UWVBFX05SICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlJfQ1BVUyAqCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQUNIRV9OX0NPTE9SUyAqCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfU0laRQorKy0tLS0tLS0tLS0tLS0tLS0tLSsgIEZJWEFERFJfVE9QICAgICAgICAgICAgICAweGJmZmZmMDAwCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBWTUFMTE9DIGFyZWEgICAgIHwgIFZNQUxMT0NfU1RBUlQgICAgICAgICAgICAweGMwMDAwMDAwICAxMjhNQiAtIDY0S0IKKystLS0tLS0tLS0tLS0tLS0tLS0rICBWTUFMTE9DX0VORAorfCBDYWNoZSBhbGlhc2luZyAgIHwgIFRMQlRFTVBfQkFTRV8xICAgICAgICAgICAweGM3ZmYwMDAwICBEQ0FDSEVfV0FZX1NJWkUKK3wgcmVtYXAgYXJlYSAxICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBDYWNoZSBhbGlhc2luZyAgIHwgIFRMQlRFTVBfQkFTRV8yICAgICAgICAgICAgICAgICAgICAgICBEQ0FDSEVfV0FZX1NJWkUKK3wgcmVtYXAgYXJlYSAyICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tKworKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgQ2FjaGVkIEtTRUcgICAgICB8ICBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiAgMHhkMDAwMDAwMCAgMTI4TUIKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IFVuY2FjaGVkIEtTRUcgICAgfCAgWENIQUxfS1NFR19CWVBBU1NfVkFERFIgIDB4ZDgwMDAwMDAgIDEyOE1CCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBDYWNoZWQgS0lPICAgICAgIHwgIFhDSEFMX0tJT19DQUNIRURfVkFERFIgICAweGUwMDAwMDAwICAyNTZNQgorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgVW5jYWNoZWQgS0lPICAgICB8ICBYQ0hBTF9LSU9fQllQQVNTX1ZBRERSICAgMHhmMDAwMDAwMCAgMjU2TUIKKystLS0tLS0tLS0tLS0tLS0tLS0rCisKKworMjU2TUIgY2FjaGVkICsgMjU2TUIgdW5jYWNoZWQgbGF5b3V0LgorCisgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sICAgICAgICAgICAgICAgICAgIFZBRERSICAgICAgIFNpemUKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IFVzZXJzcGFjZSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAgIFRBU0tfU0laRQorKy0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBQYWdlIHRhYmxlICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisrLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA0MDAwMDAKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IEtNQVAgYXJlYSAgICAgICAgfCAgUEtNQVBfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUUlNfUEVSX1BURSAqCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQUNIRV9OX0NPTE9SUyAqCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfU0laRQorfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNE1CICogRENBQ0hFX05fQ09MT1JTKQorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgQXRvbWljIEtNQVAgYXJlYSB8ICBGSVhBRERSX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgS01fVFlQRV9OUiAqCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5SX0NQVVMgKgorfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0FDSEVfTl9DT0xPUlMgKgorfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX1NJWkUKKystLS0tLS0tLS0tLS0tLS0tLS0rICBGSVhBRERSX1RPUCAgICAgICAgICAgICAgMHg5ZmZmZjAwMAorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgVk1BTExPQyBhcmVhICAgICB8ICBWTUFMTE9DX1NUQVJUICAgICAgICAgICAgMHhhMDAwMDAwMCAgMTI4TUIgLSA2NEtCCisrLS0tLS0tLS0tLS0tLS0tLS0tKyAgVk1BTExPQ19FTkQKK3wgQ2FjaGUgYWxpYXNpbmcgICB8ICBUTEJURU1QX0JBU0VfMSAgICAgICAgICAgMHhhN2ZmMDAwMCAgRENBQ0hFX1dBWV9TSVpFCit8IHJlbWFwIGFyZWEgMSAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgQ2FjaGUgYWxpYXNpbmcgICB8ICBUTEJURU1QX0JBU0VfMiAgICAgICAgICAgICAgICAgICAgICAgRENBQ0hFX1dBWV9TSVpFCit8IHJlbWFwIGFyZWEgMiAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLSsKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IENhY2hlZCBLU0VHICAgICAgfCAgWENIQUxfS1NFR19DQUNIRURfVkFERFIgIDB4YjAwMDAwMDAgIDI1Nk1CCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBVbmNhY2hlZCBLU0VHICAgIHwgIFhDSEFMX0tTRUdfQllQQVNTX1ZBRERSICAweGMwMDAwMDAwICAyNTZNQgorKy0tLS0tLS0tLS0tLS0tLS0tLSsKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IENhY2hlZCBLSU8gICAgICAgfCAgWENIQUxfS0lPX0NBQ0hFRF9WQUREUiAgIDB4ZTAwMDAwMDAgIDI1Nk1CCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBVbmNhY2hlZCBLSU8gICAgIHwgIFhDSEFMX0tJT19CWVBBU1NfVkFERFIgICAweGYwMDAwMDAwICAyNTZNQgorKy0tLS0tLS0tLS0tLS0tLS0tLSsKKworCis1MTJNQiBjYWNoZWQgKyA1MTJNQiB1bmNhY2hlZCBsYXlvdXQuCisKKyAgICAgICAgICAgICAgICAgICAgICBTeW1ib2wgICAgICAgICAgICAgICAgICAgVkFERFIgICAgICAgU2l6ZQorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgVXNlcnNwYWNlICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMCAgVEFTS19TSVpFCisrLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IFBhZ2UgdGFibGUgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKystLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDQwMDAwMAorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgS01BUCBhcmVhICAgICAgICB8ICBQS01BUF9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRSU19QRVJfUFRFICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRENBQ0hFX05fQ09MT1JTICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9TSVpFCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0TUIgKiBEQ0FDSEVfTl9DT0xPUlMpCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBBdG9taWMgS01BUCBhcmVhIHwgIEZJWEFERFJfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICBLTV9UWVBFX05SICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlJfQ1BVUyAqCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQUNIRV9OX0NPTE9SUyAqCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfU0laRQorKy0tLS0tLS0tLS0tLS0tLS0tLSsgIEZJWEFERFJfVE9QICAgICAgICAgICAgICAweDhmZmZmMDAwCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBWTUFMTE9DIGFyZWEgICAgIHwgIFZNQUxMT0NfU1RBUlQgICAgICAgICAgICAweDkwMDAwMDAwICAxMjhNQiAtIDY0S0IKKystLS0tLS0tLS0tLS0tLS0tLS0rICBWTUFMTE9DX0VORAorfCBDYWNoZSBhbGlhc2luZyAgIHwgIFRMQlRFTVBfQkFTRV8xICAgICAgICAgICAweDk3ZmYwMDAwICBEQ0FDSEVfV0FZX1NJWkUKK3wgcmVtYXAgYXJlYSAxICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBDYWNoZSBhbGlhc2luZyAgIHwgIFRMQlRFTVBfQkFTRV8yICAgICAgICAgICAgICAgICAgICAgICBEQ0FDSEVfV0FZX1NJWkUKK3wgcmVtYXAgYXJlYSAyICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tKworKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgQ2FjaGVkIEtTRUcgICAgICB8ICBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiAgMHhhMDAwMDAwMCAgNTEyTUIKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IFVuY2FjaGVkIEtTRUcgICAgfCAgWENIQUxfS1NFR19CWVBBU1NfVkFERFIgIDB4YzAwMDAwMDAgIDUxMk1CCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBDYWNoZWQgS0lPICAgICAgIHwgIFhDSEFMX0tJT19DQUNIRURfVkFERFIgICAweGUwMDAwMDAwICAyNTZNQgorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgVW5jYWNoZWQgS0lPICAgICB8ICBYQ0hBTF9LSU9fQllQQVNTX1ZBRERSICAgMHhmMDAwMDAwMCAgMjU2TUIKKystLS0tLS0tLS0tLS0tLS0tLS0rCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDMyNDZjODUuLmVmNGY3YzQxIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtNjM2LDYgKzYzNiwxNSBAQAogRjoJaW5jbHVkZS9saW51eC9hbHRlcmFfdWFydC5oCiBGOglpbmNsdWRlL2xpbnV4L2FsdGVyYV9qdGFndWFydC5oCiAKK0FNQVpPTiBFVEhFUk5FVCBEUklWRVJTCitNOglOZXRhbmVsIEJlbGdhemFsIDxuZXRhbmVsQGFubmFwdXJuYWxhYnMuY29tPgorUjoJU2FlZWQgQmlzaGFyYSA8c2FlZWRAYW5uYXB1cm5hbGFicy5jb20+CitSOglab3JpayBNYWNodWxza3kgPHpvcmlrQGFubmFwdXJuYWxhYnMuY29tPgorTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCitGOglEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZW5hLnR4dAorRjoJZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uLworCiBBTUQgQ1JZUFRPR1JBUEhJQyBDT1BST0NFU1NPUiAoQ0NQKSBEUklWRVIKIE06CVRvbSBMZW5kYWNreSA8dGhvbWFzLmxlbmRhY2t5QGFtZC5jb20+CiBNOglHYXJ5IEhvb2sgPGdhcnkuaG9va0BhbWQuY29tPgpAQCAtNzk4LDYgKzgwNyw3IEBACiBNOglTdW1pdCBTZW13YWwgPHN1bWl0LnNlbXdhbEBsaW5hcm8ub3JnPgogTDoJZGV2ZWxAZHJpdmVyZGV2Lm9zdW9zbC5vcmcKIFM6CVN1cHBvcnRlZAorRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3N0YWdpbmcvaW9uLwogRjoJZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uCiBGOglkcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC91YXBpL2lvbi5oCiBGOglkcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC91YXBpL2lvbl90ZXN0LmgKQEAgLTgwOSwxMSArODE5LDExIEBACiBTOglNYWludGFpbmVkCiBGOglzb3VuZC9hb2EvCiAKLUFQRVggRU1CRURERUQgU1lTVEVNUyBTVFgxMDQgREFDIERSSVZFUgorQVBFWCBFTUJFRERFRCBTWVNURU1TIFNUWDEwNCBJSU8gRFJJVkVSCiBNOglXaWxsaWFtIEJyZWF0aGl0dCBHcmF5IDx2aWxoZWxtLmdyYXlAZ21haWwuY29tPgogTDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAotRjoJZHJpdmVycy9paW8vZGFjL3N0eDEwNC5jCitGOglkcml2ZXJzL2lpby9hZGMvc3R4MTA0LmMKIAogQVBNIERSSVZFUgogTToJSmlyaSBLb3NpbmEgPGppa29zQGtlcm5lbC5vcmc+CkBAIC04ODEsNiArODkxLDE1IEBACiBGOglkcml2ZXJzL2dwdS9kcm0vYXJjLwogRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Rpc3BsYXkvc25wcyxhcmNwZ3UudHh0CiAKK0FSTSBBUkNISVRFQ1RFRCBUSU1FUiBEUklWRVIKK006CU1hcmsgUnV0bGFuZCA8bWFyay5ydXRsYW5kQGFybS5jb20+CitNOglNYXJjIFp5bmdpZXIgPG1hcmMuenluZ2llckBhcm0uY29tPgorTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKK1M6CU1haW50YWluZWQKK0Y6CWFyY2gvYXJtL2luY2x1ZGUvYXNtL2FyY2hfdGltZXIuaAorRjoJYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hcmNoX3RpbWVyLmgKK0Y6CWRyaXZlcnMvY2xvY2tzb3VyY2UvYXJtX2FyY2hfdGltZXIuYworCiBBUk0gSERMQ0QgRFJNIERSSVZFUgogTToJTGl2aXUgRHVkYXUgPGxpdml1LmR1ZGF1QGFybS5jb20+CiBTOglTdXBwb3J0ZWQKQEAgLTkwMywxNSArOTIyLDE3IEBACiAKIEFSTSBQTVUgUFJPRklMSU5HIEFORCBERUJVR0dJTkcKIE06CVdpbGwgRGVhY29uIDx3aWxsLmRlYWNvbkBhcm0uY29tPgotUjoJTWFyayBSdXRsYW5kIDxtYXJrLnJ1dGxhbmRAYXJtLmNvbT4KK006CU1hcmsgUnV0bGFuZCA8bWFyay5ydXRsYW5kQGFybS5jb20+CiBTOglNYWludGFpbmVkCitMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQogRjoJYXJjaC9hcm0qL2tlcm5lbC9wZXJmXyoKIEY6CWFyY2gvYXJtL29wcm9maWxlL2NvbW1vbi5jCiBGOglhcmNoL2FybSova2VybmVsL2h3X2JyZWFrcG9pbnQuYwogRjoJYXJjaC9hcm0qL2luY2x1ZGUvYXNtL2h3X2JyZWFrcG9pbnQuaAogRjoJYXJjaC9hcm0qL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaAotRjoJZHJpdmVycy9wZXJmL2FybV9wbXUuYworRjoJZHJpdmVycy9wZXJmLyoKIEY6CWluY2x1ZGUvbGludXgvcGVyZi9hcm1fcG11LmgKK0Y6CURvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vcG11LnR4dAogCiBBUk0gUE9SVAogTToJUnVzc2VsbCBLaW5nIDxsaW51eEBhcm1saW51eC5vcmcudWs+CkBAIC0xMTEzLDYgKzExMzQsMTEgQEAKIEY6CURvY3VtZW50YXRpb24vdHJhY2UvY29yZXNpZ2h0LnR4dAogRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9jb3Jlc2lnaHQudHh0CiBGOglEb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1jb3Jlc2lnaHQtZGV2aWNlcy0qCitGOgl0b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvcG11LmMKK0Y6CXRvb2xzL3BlcmYvYXJjaC9hcm0vdXRpbC9hdXh0cmFjZS5jCitGOgl0b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvY3MtZXRtLmMKK0Y6CXRvb2xzL3BlcmYvYXJjaC9hcm0vdXRpbC9jcy1ldG0uaAorRjoJdG9vbHMvcGVyZi91dGlsL2NzLWV0bS5oCiAKIEFSTS9DT1JHSSBNQUNISU5FIFNVUFBPUlQKIE06CVJpY2hhcmQgUHVyZGllIDxycHVyZGllQHJwc3lzLm5ldD4KQEAgLTE2MTQsNyArMTY0MCw4IEBACiAKIEFSTS9TQU1TVU5HIEVYWU5PUyBBUk0gQVJDSElURUNUVVJFUwogTToJS3VramluIEtpbSA8a2dlbmVAa2VybmVsLm9yZz4KLU06CUtyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPgorTToJS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPgorUjoJSmF2aWVyIE1hcnRpbmV6IENhbmlsbGFzIDxqYXZpZXJAb3NnLnNhbXN1bmcuY29tPgogTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIEw6CWxpbnV4LXNhbXN1bmctc29jQHZnZXIua2VybmVsLm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCiBTOglNYWludGFpbmVkCkBAIC0xNjM0LDcgKzE2NjEsNiBAQAogRjoJZHJpdmVycy8qLypzNXB2MjEwKgogRjoJZHJpdmVycy9tZW1vcnkvc2Ftc3VuZy8qCiBGOglkcml2ZXJzL3NvYy9zYW1zdW5nLyoKLUY6CWRyaXZlcnMvc3BpL3NwaS1zM2MqCiBGOglEb2N1bWVudGF0aW9uL2FybS9TYW1zdW5nLwogRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9zYW1zdW5nLwogRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NyYW0vc2Ftc3VuZy1zcmFtLnR4dApAQCAtMTgyMiw2ICsxODQ4LDcgQEAKIEFSTS9VTklQSElFUiBBUkNISVRFQ1RVUkUKIE06CU1hc2FoaXJvIFlhbWFkYSA8eWFtYWRhLm1hc2FoaXJvQHNvY2lvbmV4dC5jb20+CiBMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQorVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tYXNhaGlyb3kvbGludXgtdW5pcGhpZXIuZ2l0CiBTOglNYWludGFpbmVkCiBGOglhcmNoL2FybS9ib290L2R0cy91bmlwaGllcioKIEY6CWFyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2NhY2hlLXVuaXBoaWVyLmgKQEAgLTE4MjksNiArMTg1Niw3IEBACiBGOglhcmNoL2FybS9tbS9jYWNoZS11bmlwaGllci5jCiBGOglhcmNoL2FybTY0L2Jvb3QvZHRzL3NvY2lvbmV4dC8KIEY6CWRyaXZlcnMvYnVzL3VuaXBoaWVyLXN5c3RlbS1idXMuYworRjoJZHJpdmVycy9jbGsvdW5pcGhpZXIvCiBGOglkcml2ZXJzL2kyYy9idXNzZXMvaTJjLXVuaXBoaWVyKgogRjoJZHJpdmVycy9waW5jdHJsL3VuaXBoaWVyLwogRjoJZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF91bmlwaGllci5jCkBAIC0xOTY1LDYgKzE5OTMsMTMgQEAKIEY6CWRyaXZlcnMvbWVkaWEvaTJjL2FzMzY0NWEuYwogRjoJaW5jbHVkZS9tZWRpYS9pMmMvYXMzNjQ1YS5oCiAKK0FTQUhJIEtBU0VJIEFLODk3NCBEUklWRVIKK006CUxpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAbGluYXJvLm9yZz4KK0w6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly93d3cuYWttLmNvbS8KK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL2FrODk3NC5jCisKIEFTQzc2MjEgSEFSRFdBUkUgTU9OSVRPUiBEUklWRVIKIE06CUdlb3JnZSBKb3NlcGggPGdlb3JnZS5qb3NlcGhAZmFpcnZpZXc1LmNvbT4KIEw6CWxpbnV4LWh3bW9uQHZnZXIua2VybmVsLm9yZwpAQCAtMjEwMywxMSArMjEzOCw2IEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS5jCiAKLUFUTUVMIEFUOTEgLyBBVDMyIFNFUklBTCBEUklWRVIKLU06CU5pY29sYXMgRmVycmUgPG5pY29sYXMuZmVycmVAYXRtZWwuY29tPgotUzoJU3VwcG9ydGVkCi1GOglkcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKLQogQVRNRUwgQVQ5MSBTQU1BNUQyLUNvbXBhdGlibGUgU2h1dGRvd24gQ29udHJvbGxlcgogTToJTmljb2xhcyBGZXJyZSA8bmljb2xhcy5mZXJyZUBhdG1lbC5jb20+CiBTOglTdXBwb3J0ZWQKQEAgLTI0NzUsNyArMjUwNSw3IEBACiBCT05ESU5HIERSSVZFUgogTToJSmF5IFZvc2J1cmdoIDxqLnZvc2J1cmdoQGdtYWlsLmNvbT4KIE06CVZlYWNlc2xhdiBGYWxpY28gPHZmYWxpY29AZ21haWwuY29tPgotTToJQW5keSBHb3Nwb2RhcmVrIDxnb3Nwb0BjdW11bHVzbmV0d29ya3MuY29tPgorTToJQW5keSBHb3Nwb2RhcmVrIDxhbmR5QGdyZXlob3VzZS5uZXQ+CiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2JvbmRpbmcvCiBTOglTdXBwb3J0ZWQKQEAgLTI0OTAsNyArMjUyMCw3IEBACiBGOglrZXJuZWwvYnBmLwogCiBCUk9BRENPTSBCNDQgMTAvMTAwIEVUSEVSTkVUIERSSVZFUgotTToJR2FyeSBaYW1icmFubyA8emFtYnJhbm9AYnJvYWRjb20uY29tPgorTToJTWljaGFlbCBDaGFuIDxtaWNoYWVsLmNoYW5AYnJvYWRjb20uY29tPgogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iNDQuKgpAQCAtMzEyNSw3ICszMTU1LDcgQEAKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbW1hcmVrL2tidWlsZC5naXQgbWlzYwogVzoJaHR0cDovL2NvY2NpbmVsbGUubGlwNi5mci8KIFM6CVN1cHBvcnRlZAotRjoJRG9jdW1lbnRhdGlvbi9jb2NjaW5lbGxlLnR4dAorRjoJRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvY29jY2luZWxsZS5yc3QKIEY6CXNjcmlwdHMvY29jY2luZWxsZS8KIEY6CXNjcmlwdHMvY29jY2ljaGVjawogCkBAIC0zMTUxLDYgKzMxODEsNyBAQAogTToJTWljaGFlbCBUdXJxdWV0dGUgPG10dXJxdWV0dGVAYmF5bGlicmUuY29tPgogTToJU3RlcGhlbiBCb3lkIDxzYm95ZEBjb2RlYXVyb3JhLm9yZz4KIEw6CWxpbnV4LWNsa0B2Z2VyLmtlcm5lbC5vcmcKK1E6CWh0dHA6Ly9wYXRjaHdvcmsua2VybmVsLm9yZy9wcm9qZWN0L2xpbnV4LWNsay9saXN0LwogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9jbGsvbGludXguZ2l0CiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svCkBAIC0zMjM4LDcgKzMyNjksNyBAQAogQ09OVFJPTCBHUk9VUCAtIE1FTU9SWSBSRVNPVVJDRSBDT05UUk9MTEVSIChNRU1DRykKIE06CUpvaGFubmVzIFdlaW5lciA8aGFubmVzQGNtcHhjaGcub3JnPgogTToJTWljaGFsIEhvY2tvIDxtaG9ja29Aa2VybmVsLm9yZz4KLU06CVZsYWRpbWlyIERhdnlkb3YgPHZkYXZ5ZG92QHZpcnR1b3p6by5jb20+CitNOglWbGFkaW1pciBEYXZ5ZG92IDx2ZGF2eWRvdi5kZXZAZ21haWwuY29tPgogTDoJY2dyb3Vwc0B2Z2VyLmtlcm5lbC5vcmcKIEw6CWxpbnV4LW1tQGt2YWNrLm9yZwogUzoJTWFpbnRhaW5lZApAQCAtMzI1OSw3ICszMjkwLDcgQEAKIEY6CWRyaXZlcnMvbmV0L3dhbi9jb3NhKgogCiBDUE1BQyBFVEhFUk5FVCBEUklWRVIKLU06CUZsb3JpYW4gRmFpbmVsbGkgPGZsb3JpYW5Ab3BlbndydC5vcmc+CitNOglGbG9yaWFuIEZhaW5lbGxpIDxmLmZhaW5lbGxpQGdtYWlsLmNvbT4KIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2NwbWFjLmMKQEAgLTMyNzEsNiArMzMwMiw3IEBACiBTOglNYWludGFpbmVkCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3JhZmFlbC9saW51eC1wbS5naXQKIFQ6CWdpdCBnaXQ6Ly9naXQubGluYXJvLm9yZy9wZW9wbGUvdmlyZXNoay9saW51eC5naXQgKEZvciBBUk0gVXBkYXRlcykKK0Y6CURvY3VtZW50YXRpb24vY3B1LWZyZXEvCiBGOglkcml2ZXJzL2NwdWZyZXEvCiBGOglpbmNsdWRlL2xpbnV4L2NwdWZyZXEuaAogCkBAIC0zNzY5LDYgKzM4MDEsMTIgQEAKIEY6CWluY2x1ZGUvc291bmQvZGFbNzldKi5oCiBGOglzb3VuZC9zb2MvY29kZWNzL2RhWzc5XSouW2NoXQogCitESUFNT05EIFNZU1RFTVMgR1BJTy1NTSBHUElPIERSSVZFUgorTToJV2lsbGlhbSBCcmVhdGhpdHQgR3JheSA8dmlsaGVsbS5ncmF5QGdtYWlsLmNvbT4KK0w6CWxpbnV4LWdwaW9Admdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL2dwaW8vZ3Bpby1ncGlvLW1tLmMKKwogRElHSSBORU8gQU5EIENMQVNTSUMgUENJIFBST0RVQ1RTCiBNOglMaWR6YSBMb3VpbmEgPGxpZHphLmxvdWluYUBnbWFpbC5jb20+CiBNOglNYXJrIEhvdW5zY2hlbGwgPG1hcmtoQGNvbXByby5uZXQ+CkBAIC00Mzk0LDcgKzQ0MzIsNiBAQAogRjoJZnMvZWNyeXB0ZnMvCiAKIEVEQUMtQ09SRQotTToJRG91ZyBUaG9tcHNvbiA8ZG91Z3Rob21wc29uQHhtaXNzaW9uLmNvbT4KIE06CUJvcmlzbGF2IFBldGtvdiA8YnBAYWxpZW44LmRlPgogTToJTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHMtb3BlbnNvdXJjZS5jb20+CiBNOglNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAa2VybmVsLm9yZz4KQEAgLTQ0MDcsMTQgKzQ0NDQsMTIgQEAKIEY6CWluY2x1ZGUvbGludXgvZWRhYy5oCiAKIEVEQUMtQU1ENjQKLU06CURvdWcgVGhvbXBzb24gPGRvdWd0aG9tcHNvbkB4bWlzc2lvbi5jb20+CiBNOglCb3Jpc2xhdiBQZXRrb3YgPGJwQGFsaWVuOC5kZT4KIEw6CWxpbnV4LWVkYWNAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL2VkYWMvYW1kNjRfZWRhYyoKIAogRURBQy1DQUxYRURBCi1NOglEb3VnIFRob21wc29uIDxkb3VndGhvbXBzb25AeG1pc3Npb24uY29tPgogTToJUm9iZXJ0IFJpY2h0ZXIgPHJyaWNAa2VybmVsLm9yZz4KIEw6CWxpbnV4LWVkYWNAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCkBAIC00NDMwLDE3ICs0NDY1LDIxIEBACiAKIEVEQUMtRTc1MlgKIE06CU1hcmsgR3Jvc3MgPG1hcmsuZ3Jvc3NAaW50ZWwuY29tPgotTToJRG91ZyBUaG9tcHNvbiA8ZG91Z3Rob21wc29uQHhtaXNzaW9uLmNvbT4KIEw6CWxpbnV4LWVkYWNAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL2VkYWMvZTc1MnhfZWRhYy5jCiAKIEVEQUMtRTdYWFgKLU06CURvdWcgVGhvbXBzb24gPGRvdWd0aG9tcHNvbkB4bWlzc2lvbi5jb20+CiBMOglsaW51eC1lZGFjQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9lZGFjL2U3eHh4X2VkYWMuYwogCitFREFDLUZTTF9ERFIKK006CVlvcmsgU3VuIDx5b3JrLnN1bkBueHAuY29tPgorTDoJbGludXgtZWRhY0B2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKK0Y6CWRyaXZlcnMvZWRhYy9mc2xfZGRyX2VkYWMuKgorCiBFREFDLUdIRVMKIE06CU1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBzLW9wZW5zb3VyY2UuY29tPgogTToJTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGtlcm5lbC5vcmc+CkBAIC00NDU1LDEzICs0NDk0LDExIEBACiBGOglkcml2ZXJzL2VkYWMvaTgyNDQzYnhneF9lZGFjLmMKIAogRURBQy1JMzAwMAotTToJSmFzb24gVWhsZW5rb3R0IDxqdWhsZW5rb0Bha2FtYWkuY29tPgogTDoJbGludXgtZWRhY0B2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKK1M6CU9ycGhhbgogRjoJZHJpdmVycy9lZGFjL2kzMDAwX2VkYWMuYwogCiBFREFDLUk1MDAwCi1NOglEb3VnIFRob21wc29uIDxkb3VndGhvbXBzb25AeG1pc3Npb24uY29tPgogTDoJbGludXgtZWRhY0B2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvZWRhYy9pNTAwMF9lZGFjLmMKQEAgLTQ1MjUsNiArNDU2MiwxMiBAQAogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9lZGFjL3NiX2VkYWMuYwogCitFREFDLVNLWUxBS0UKK006CVRvbnkgTHVjayA8dG9ueS5sdWNrQGludGVsLmNvbT4KK0w6CWxpbnV4LWVkYWNAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL2VkYWMvc2t4X2VkYWMuYworCiBFREFDLVhHRU5FCiBBUFBMSUVEIE1JQ1JPIChBUE0pIFgtR0VORSBTT0MgRURBQwogTTogICAgIExvYyBIbyA8bGhvQGFwbS5jb20+CkBAIC00NTY3LDYgKzQ2MTAsMTMgQEAKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvdmlkZW8vZmJkZXYvZWZpZmIuYwogCitFRkkgVEVTVCBEUklWRVIKK0w6CWxpbnV4LWVmaUB2Z2VyLmtlcm5lbC5vcmcKK006CUl2YW4gSHUgPGl2YW4uaHVAY2Fub25pY2FsLmNvbT4KK006CU1hdHQgRmxlbWluZyA8bWF0dEBjb2RlYmx1ZXByaW50LmNvLnVrPgorUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9maXJtd2FyZS9lZmkvdGVzdC8KKwogRUZTIEZJTEVTWVNURU0KIFc6CWh0dHA6Ly9hZXNjaGkuY2guZXUub3JnL2Vmcy8KIFM6CU9ycGhhbgpAQCAtNDgzNCw2ICs0ODg0LDcgQEAKIAogRklSTVdBUkUgTE9BREVSIChyZXF1ZXN0X2Zpcm13YXJlKQogTToJTWluZyBMZWkgPG1pbmcubGVpQGNhbm9uaWNhbC5jb20+CitNOglMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQGtlcm5lbC5vcmc+CiBMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL2Zpcm13YXJlX2NsYXNzLwpAQCAtNTExOSw3ICs1MTcwLDcgQEAKIE06CVBldGVyIE9iZXJwYXJsZWl0ZXIgPG9iZXJwYXJAbGludXgudm5ldC5pYm0uY29tPgogUzoJTWFpbnRhaW5lZAogRjoJa2VybmVsL2djb3YvCi1GOglEb2N1bWVudGF0aW9uL2djb3YudHh0CitGOglEb2N1bWVudGF0aW9uL2Rldi10b29scy9nY292LnJzdAogCiBHRFQgU0NTSSBESVNLIEFSUkFZIENPTlRST0xMRVIgRFJJVkVSCiBNOglBY2hpbSBMZXVibmVyIDxhY2hpbV9sZXVibmVyQGFkYXB0ZWMuY29tPgpAQCAtNTIzNiw2ICs1Mjg3LDEzIEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2dvb2RpeC5jCiAKK0dQSU8gTU9DS1VQIERSSVZFUgorTToJQmFtdm9yIEppYW4gWmhhbmcgPGJhbXZvci56aGFuZ2ppYW5AbGluYXJvLm9yZz4KK0w6CWxpbnV4LWdwaW9Admdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL2dwaW8vZ3Bpby1tb2NrdXAuYworRjoJdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZ3Bpby8KKwogR1BJTyBTVUJTWVNURU0KIE06CUxpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAbGluYXJvLm9yZz4KIE06CUFsZXhhbmRyZSBDb3VyYm90IDxnbnVyb3VAZ21haWwuY29tPgpAQCAtNTI2Nyw2ICs1MzI1LDc3IEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL25ldC9ldGhlcm5ldC9hZXJvZmxleC8KIAorR1JFWUJVUyBTVUJTWVNURU0KK006CUpvaGFuIEhvdm9sZCA8am9oYW5Aa2VybmVsLm9yZz4KK006CUFsZXggRWxkZXIgPGVsZGVyQGtlcm5lbC5vcmc+CitNOglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBsaW51eGZvdW5kYXRpb24ub3JnPgorUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvCisKK0dSRVlCVVMgQVVESU8gUFJPVE9DT0xTIERSSVZFUlMKK006CVZhaWJoYXYgQWdhcndhbCA8dmFpYmhhdi5zckBnbWFpbC5jb20+CitNOglNYXJrIEdyZWVyIDxtZ3JlZXJAYW5pbWFsY3JlZWsuY29tPgorUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fYXBicmlkZ2VhLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX2FwYnJpZGdlYS5oCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19jb2RlYy5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19jb2RlYy5oCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19nYi5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19tYW5hZ2VyLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXIuaAorRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbWFuYWdlcl9tb2R1bGUuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbWFuYWdlcl9wcml2YXRlLmgKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXJfc3lzZnMuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbW9kdWxlLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX3RvcG9sb2d5LmMKKworR1JFWUJVUyBQUk9UT0NPTFMgRFJJVkVSUworTToJUnVpIE1pZ3VlbCBTaWx2YSA8cm1mcmZzQGdtYWlsLmNvbT4KK1M6CU1haW50YWluZWQKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3NkaW8uYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvbGlnaHQuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3Bpby5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9wb3dlcl9zdXBwbHkuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3BpLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3NwaWxpYi5jCisKK0dSRVlCVVMgUFJPVE9DT0xTIERSSVZFUlMKK006CUJyeWFuIE8nRG9ub2dodWUgPHB1cmUubG9naWNAbmV4dXMtc29mdHdhcmUuaWU+CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9sb29wYmFjay5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90aW1lc3luYy5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90aW1lc3luY19wbGF0Zm9ybS5jCisKK0dSRVlCVVMgUFJPVE9DT0xTIERSSVZFUlMKK006CVZpcmVzaCBLdW1hciA8dmlyZXNoa0BrZXJuZWwub3JnPgorUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXV0aGVudGljYXRpb24uYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYm9vdHJvbS5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9maXJtd2FyZS5oCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9mdy1jb3JlLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Z3LWRvd25sb2FkLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Z3LW1hbmFnYW1lbnQuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3JleWJ1c19hdXRoZW50aWNhdGlvbi5oCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncmV5YnVzX2Zpcm13YXJlLmgKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2hpZC5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9pMmMuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3BpLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3NwaWxpYi5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zcGlsaWIuaAorCitHUkVZQlVTIFBST1RPQ09MUyBEUklWRVJTCitNOglEYXZpZCBMaW4gPGR0d2xpbkBnbWFpbC5jb20+CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy91YXJ0LmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2xvZy5jCisKK0dSRVlCVVMgUExBVEZPUk0gRFJJVkVSUworTToJVmFpYmhhdiBIaXJlbWF0aCA8aHZhaWJoYXYubGludXhAZ21haWwuY29tPgorUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXJjaGUtcGxhdGZvcm0uYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXJjaGUtYXBiLWN0cmwuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXJjaGVfcGxhdGZvcm0uaAorCiBHU1BDQSBGSU5FUElYIFNVQkRSSVZFUgogTToJRnJhbmsgWmFnbyA8ZnJhbmtAemFnby5uZXQ+CiBMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKQEAgLTU1NjcsMTAgKzU2OTYsOSBAQAogCiBIT1NUIEFQIERSSVZFUgogTToJSm91bmkgTWFsaW5lbiA8akB3MS5maT4KLUw6CWhvc3RhcEBzaG1vby5jb20gKHN1YnNjcmliZXJzLW9ubHkpCiBMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKLVc6CWh0dHA6Ly9ob3N0YXAuZXBpdGVzdC5maS8KLVM6CU1haW50YWluZWQKK1c6CWh0dHA6Ly93MS5maS9ob3N0YXAtZHJpdmVyLmh0bWwKK1M6CU9ic29sZXRlCiBGOglkcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlcnNpbC9ob3N0YXAvCiAKIEhQIENPTVBBUSBUQzExMDAgVEFCTEVUIFdNSSBFWFRSQVMgRFJJVkVSCkBAIC01NjA3LDcgKzU3MzUsNyBAQAogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9zcmUvbGludXgtaHNpLmdpdAogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtaHNpCi1GOglEb2N1bWVudGF0aW9uL2hzaS50eHQKK0Y6CURvY3VtZW50YXRpb24vZGV2aWNlLWRyaXZlcnMvc2VyaWFsLWludGVyZmFjZXMucnN0CiBGOglkcml2ZXJzL2hzaS8KIEY6CWluY2x1ZGUvbGludXgvaHNpLwogRjoJaW5jbHVkZS91YXBpL2xpbnV4L2hzaS8KQEAgLTYwODYsNyArNjIxNCw3IEBACiBGOglkcml2ZXJzL2NwdWZyZXEvaW50ZWxfcHN0YXRlLmMKIAogSU5URUwgRlJBTUVCVUZGRVIgRFJJVkVSIChleGNsdWRpbmcgODEwIGFuZCA4MTUpCi1NOglNYWlrIEJyb2VtbWUgPG1icm9lbW1lQHBsdXNzZXJ2ZXIuZGU+CitNOglNYWlrIEJyb2VtbWUgPG1icm9lbW1lQGxpYm1wcS5vcmc+CiBMOglsaW51eC1mYmRldkB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vZmIvaW50ZWxmYi50eHQKQEAgLTY1ODgsNyArNjcxNiw3IEBACiBTOglNYWludGFpbmVkCiBGOglhcmNoLyovaW5jbHVkZS9hc20va2FzYW4uaAogRjoJYXJjaC8qL21tL2thc2FuX2luaXQqCi1GOglEb2N1bWVudGF0aW9uL2thc2FuLnR4dAorRjoJRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva2FzYW4ucnN0CiBGOglpbmNsdWRlL2xpbnV4L2thc2FuKi5oCiBGOglsaWIvdGVzdF9rYXNhbi5jCiBGOgltbS9rYXNhbi8KQEAgLTY4MDQsNyArNjkzMiw3IEBACiBNOglWZWdhcmQgTm9zc3VtIDx2ZWdhcmRub0BpZmkudWlvLm5vPgogTToJUGVra2EgRW5iZXJnIDxwZW5iZXJnQGtlcm5lbC5vcmc+CiBTOglNYWludGFpbmVkCi1GOglEb2N1bWVudGF0aW9uL2ttZW1jaGVjay50eHQKK0Y6CURvY3VtZW50YXRpb24vZGV2LXRvb2xzL2ttZW1jaGVjay5yc3QKIEY6CWFyY2gveDg2L2luY2x1ZGUvYXNtL2ttZW1jaGVjay5oCiBGOglhcmNoL3g4Ni9tbS9rbWVtY2hlY2svCiBGOglpbmNsdWRlL2xpbnV4L2ttZW1jaGVjay5oCkBAIC02ODEzLDcgKzY5NDEsNyBAQAogS01FTUxFQUsKIE06CUNhdGFsaW4gTWFyaW5hcyA8Y2F0YWxpbi5tYXJpbmFzQGFybS5jb20+CiBTOglNYWludGFpbmVkCi1GOglEb2N1bWVudGF0aW9uL2ttZW1sZWFrLnR4dAorRjoJRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva21lbWxlYWsucnN0CiBGOglpbmNsdWRlL2xpbnV4L2ttZW1sZWFrLmgKIEY6CW1tL2ttZW1sZWFrLmMKIEY6CW1tL2ttZW1sZWFrLXRlc3QuYwpAQCAtNzQyNiw5ICs3NTU0LDggQEAKIEY6CWRyaXZlcnMvaHdtb24vbWF4MjA3NTEuYwogCiBNQVg2NjUwIEhBUkRXQVJFIE1PTklUT1IgQU5EIEZBTiBDT05UUk9MTEVSIERSSVZFUgotTToJIkhhbnMgSi4gS29jaCIgPGhqa0BoYW5zamtvY2guZGU+CiBMOglsaW51eC1od21vbkB2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKK1M6CU9ycGhhbgogRjoJRG9jdW1lbnRhdGlvbi9od21vbi9tYXg2NjUwCiBGOglkcml2ZXJzL2h3bW9uL21heDY2NTAuYwogCkBAIC03NDQ5LDcgKzc1NzYsOCBAQAogRjoJc291bmQvc29jL2NvZGVjcy9tYXg5ODYwLioKIAogTUFYSU0gTVVJQyBDSEFSR0VSIERSSVZFUlMgRk9SIEVYWU5PUyBCQVNFRCBCT0FSRFMKLU06CUtyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPgorTToJS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPgorTToJQmFydGxvbWllaiBab2xuaWVya2lld2ljeiA8Yi56b2xuaWVya2llQHNhbXN1bmcuY29tPgogTDoJbGludXgtcG1Admdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvcG93ZXIvbWF4MTQ1NzdfY2hhcmdlci5jCkBAIC03NDY1LDcgKzc1OTMsOCBAQAogCiBNQVhJTSBQTUlDIEFORCBNVUlDIERSSVZFUlMgRk9SIEVYWU5PUyBCQVNFRCBCT0FSRFMKIE06CUNoYW53b28gQ2hvaSA8Y3cwMC5jaG9pQHNhbXN1bmcuY29tPgotTToJS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+CitNOglLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+CitNOglCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6IDxiLnpvbG5pZXJraWVAc2Ftc3VuZy5jb20+CiBMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvKi9tYXgxNDU3NyouYwpAQCAtNzQ5Nyw2ICs3NjI2LDEyIEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL2lpby9wb3RlbnRpb21ldGVyL21jcDQ1MzEuYwogCitNRUFTVVJFTUVOVCBDT01QVVRJTkcgQ0lPLURBQyBJSU8gRFJJVkVSCitNOglXaWxsaWFtIEJyZWF0aGl0dCBHcmF5IDx2aWxoZWxtLmdyYXlAZ21haWwuY29tPgorTDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9paW8vZGFjL2Npby1kYWMuYworCiBNRURJQSBEUklWRVJTIEZPUiBSRU5FU0FTIC0gRkNQCiBNOglMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+CiBMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKQEAgLTc2NDksMTMgKzc3ODQsMjYgQEAKIFE6CWh0dHA6Ly9wYXRjaHdvcmsub3psYWJzLm9yZy9wcm9qZWN0L25ldGRldi9saXN0LwogRjoJZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvCiAKK01FTExBTk9YIE1MWENQTEQgTEVEIERSSVZFUgorTToJVmFkaW0gUGFzdGVybmFrIDx2YWRpbXBAbWVsbGFub3guY29tPgorTDoJbGludXgtbGVkc0B2Z2VyLmtlcm5lbC5vcmcKK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9sZWRzL2xlZHMtbWx4Y3BsZC5jCitGOglEb2N1bWVudGF0aW9uL2xlZHMvbGVkcy1tbHhjcGxkLnR4dAorCitNRUxMQU5PWCBQTEFURk9STSBEUklWRVIKK006ICAgICAgVmFkaW0gUGFzdGVybmFrIDx2YWRpbXBAbWVsbGFub3guY29tPgorTDogICAgICBwbGF0Zm9ybS1kcml2ZXIteDg2QHZnZXIua2VybmVsLm9yZworUzogICAgICBTdXBwb3J0ZWQKK0Y6ICAgICAgYXJjaC94ODYvcGxhdGZvcm0vbWVsbGFub3gvbWx4LXBsYXRmb3JtLmMKKwogU09GVC1ST0NFIERSSVZFUiAocnhlKQogTToJTW9uaSBTaG91YSA8bW9uaXNAbWVsbGFub3guY29tPgogTDoJbGludXgtcmRtYUB2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAogVzoJaHR0cHM6Ly9naXRodWIuY29tL1NvZnRSb0NFL3J4ZS1kZXYvd2lraS9yeGUtZGV2Oi1Ib21lCiBROglodHRwOi8vcGF0Y2h3b3JrLmtlcm5lbC5vcmcvcHJvamVjdC9saW51eC1yZG1hL2xpc3QvCi1GOglkcml2ZXJzL2luZmluaWJhbmQvaHcvcnhlLworRjoJZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS8KIEY6CWluY2x1ZGUvdWFwaS9yZG1hL3JkbWFfdXNlcl9yeGUuaAogCiBNRU1CQVJSSUVSIFNVUFBPUlQKQEAgLTc3MzQsNiArNzg4MiwxMiBAQAogUzoJU3VwcG9ydGVkCiBGOglhcmNoL21pY3JvYmxhemUvCiAKK01JQ1JPQ0hJUCAvIEFUTUVMIEFUOTEgLyBBVDMyIFNFUklBTCBEUklWRVIKK006CVJpY2hhcmQgR2Vub3VkIDxyaWNoYXJkLmdlbm91ZEBnbWFpbC5jb20+CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKK0Y6CWluY2x1ZGUvbGludXgvYXRtZWxfc2VyaWFsLmgKKwogTUlDUk9TT0ZUIFNVUkZBQ0UgUFJPIDMgQlVUVE9OIERSSVZFUgogTToJQ2hlbiBZdSA8eXUuYy5jaGVuQGludGVsLmNvbT4KIEw6CXBsYXRmb3JtLWRyaXZlci14ODZAdmdlci5rZXJuZWwub3JnCkBAIC04MTQyLDYgKzgyOTYsMTUgQEAKIFc6CWh0dHBzOi8vZmVkb3JhaG9zdGVkLm9yZy9kcm9wd2F0Y2gvCiBGOgluZXQvY29yZS9kcm9wX21vbml0b3IuYwogCitORVRXT1JLSU5HIFtEU0FdCitNOglBbmRyZXcgTHVubiA8YW5kcmV3QGx1bm4uY2g+CitNOglWaXZpZW4gRGlkZWxvdCA8dml2aWVuLmRpZGVsb3RAc2F2b2lyZmFpcmVsaW51eC5jb20+CitNOglGbG9yaWFuIEZhaW5lbGxpIDxmLmZhaW5lbGxpQGdtYWlsLmNvbT4KK1M6CU1haW50YWluZWQKK0Y6CW5ldC9kc2EvCitGOglpbmNsdWRlL25ldC9kc2EuaAorRjoJZHJpdmVycy9uZXQvZHNhLworCiBORVRXT1JLSU5HIFtHRU5FUkFMXQogTToJIkRhdmlkIFMuIE1pbGxlciIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCkBAIC04NzE3LDcgKzg4ODAsNyBAQAogRjoJaW5jbHVkZS9saW51eC9vcHJvZmlsZS5oCiAKIE9SQUNMRSBDTFVTVEVSIEZJTEVTWVNURU0gMiAoT0NGUzIpCi1NOglNYXJrIEZhc2hlaCA8bWZhc2hlaEBzdXNlLmNvbT4KK006CU1hcmsgRmFzaGVoIDxtZmFzaGVoQHZlcnNpdHkuY29tPgogTToJSm9lbCBCZWNrZXIgPGpsYmVjQGV2aWxwbGFuLm9yZz4KIEw6CW9jZnMyLWRldmVsQG9zcy5vcmFjbGUuY29tIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFc6CWh0dHA6Ly9vY2ZzMi53aWtpLmtlcm5lbC5vcmcKQEAgLTg4MjksNiArODk5Miw3IEBACiBGOglEb2N1bWVudGF0aW9uL3ZpcnR1YWwvcGFyYXZpcnRfb3BzLnR4dAogRjoJYXJjaC8qL2tlcm5lbC9wYXJhdmlydCoKIEY6CWFyY2gvKi9pbmNsdWRlL2FzbS9wYXJhdmlydC5oCitGOglpbmNsdWRlL2xpbnV4L2h5cGVydmlzb3IuaAogCiBQQVJJREUgRFJJVkVSUyBGT1IgUEFSQUxMRUwgUE9SVCBJREUgREVWSUNFUwogTToJVGltIFdhdWdoIDx0aW1AY3liZXJlbGsubmV0PgpAQCAtOTIzMSw3ICs5Mzk1LDcgQEAKIAogUElOIENPTlRST0xMRVIgLSBTQU1TVU5HCiBNOglUb21hc3ogRmlnYSA8dG9tYXN6LmZpZ2FAZ21haWwuY29tPgotTToJS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+CitNOglLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+CiBNOglTeWx3ZXN0ZXIgTmF3cm9ja2kgPHMubmF3cm9ja2lAc2Ftc3VuZy5jb20+CiBMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQogTDoJbGludXgtc2Ftc3VuZy1zb2NAdmdlci5rZXJuZWwub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKQEAgLTk2NzIsNiArOTgzNiwxMiBAQAogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrLwogCitRVUFMQ09NTSBFTUFDIEdJR0FCSVQgRVRIRVJORVQgRFJJVkVSCitNOglUaW11ciBUYWJpIDx0aW11ckBjb2RlYXVyb3JhLm9yZz4KK0w6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy8KKwogUVVBTENPTU0gSEVYQUdPTiBBUkNISVRFQ1RVUkUKIE06CVJpY2hhcmQgS3VvIDxya3VvQGNvZGVhdXJvcmEub3JnPgogTDoJbGludXgtaGV4YWdvbkB2Z2VyLmtlcm5lbC5vcmcKQEAgLTk4OTIsNiArMTAwNjIsMTIgQEAKIEY6CURvY3VtZW50YXRpb24vcnBtc2cudHh0CiBGOglpbmNsdWRlL2xpbnV4L3JwbXNnLmgKIAorUkVORVNBUyBDTE9DSyBEUklWRVJTCitNOglHZWVydCBVeXR0ZXJob2V2ZW4gPGdlZXJ0K3JlbmVzYXNAZ2xpZGVyLmJlPgorTDoJbGludXgtcmVuZXNhcy1zb2NAdmdlci5rZXJuZWwub3JnCitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvY2xrL3JlbmVzYXMvCisKIFJFTkVTQVMgRVRIRVJORVQgRFJJVkVSUwogUjoJU2VyZ2VpIFNodHlseW92IDxzZXJnZWkuc2h0eWx5b3ZAY29nZW50ZW1iZWRkZWQuY29tPgogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwpAQCAtOTkyNyw2ICsxMDEwMyw3IEBACiAKIFJIQVNIVEFCTEUKIE06CVRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgorTToJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJbGliL3JoYXNodGFibGUuYwpAQCAtMTAwNzAsOCArMTAyNDcsOCBAQAogRjoJZHJpdmVycy9zMzkwL2Npby8KIAogUzM5MCBEQVNEIERSSVZFUgotTToJU3RlZmFuIFdlaW5odWJlciA8d2VpbkBkZS5pYm0uY29tPgotTToJU3RlZmFuIEhhYmVybGFuZCA8c3RlZmFuLmhhYmVybGFuZEBkZS5pYm0uY29tPgorTToJU3RlZmFuIEhhYmVybGFuZCA8c3RoQGxpbnV4LnZuZXQuaWJtLmNvbT4KK006CUphbiBIb2VwcG5lciA8aG9lcHBuZXJAbGludXgudm5ldC5pYm0uY29tPgogTDoJbGludXgtczM5MEB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saW51eC9saW51eDM5MC8KIFM6CVN1cHBvcnRlZApAQCAtMTAxNjQsNyArMTAzNDEsNyBAQAogRjoJZHJpdmVycy9wbGF0Zm9ybS94ODYvc2Ftc3VuZy1sYXB0b3AuYwogCiBTQU1TVU5HIEFVRElPIChBU29DKSBEUklWRVJTCi1NOglLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraUBzYW1zdW5nLmNvbT4KK006CUtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KIE06CVNhbmdiZW9tIEtpbSA8c2JraW03M0BzYW1zdW5nLmNvbT4KIE06CVN5bHdlc3RlciBOYXdyb2NraSA8cy5uYXdyb2NraUBzYW1zdW5nLmNvbT4KIEw6CWFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCkBAIC0xMDE3OSw3ICsxMDM1Niw4IEBACiAKIFNBTVNVTkcgTVVMVElGVU5DVElPTiBQTUlDIERFVklDRSBEUklWRVJTCiBNOglTYW5nYmVvbSBLaW0gPHNia2ltNzNAc2Ftc3VuZy5jb20+Ci1NOglLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraUBzYW1zdW5nLmNvbT4KK006CUtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KK006CUJhcnRsb21pZWogWm9sbmllcmtpZXdpY3ogPGIuem9sbmllcmtpZUBzYW1zdW5nLmNvbT4KIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIEw6CWxpbnV4LXNhbXN1bmctc29jQHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCkBAIC0xMDIzNCw5ICsxMDQxMiwyMyBAQAogU0FNU1VORyBTT0MgQ0xPQ0sgRFJJVkVSUwogTToJU3lsd2VzdGVyIE5hd3JvY2tpIDxzLm5hd3JvY2tpQHNhbXN1bmcuY29tPgogTToJVG9tYXN6IEZpZ2EgPHRvbWFzei5maWdhQGdtYWlsLmNvbT4KK006CUNoYW53b28gQ2hvaSA8Y3cwMC5jaG9pQHNhbXN1bmcuY29tPgogUzoJU3VwcG9ydGVkCiBMOglsaW51eC1zYW1zdW5nLXNvY0B2Z2VyLmtlcm5lbC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQogRjoJZHJpdmVycy9jbGsvc2Ftc3VuZy8KK0Y6CWluY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZXh5bm9zKi5oCitGOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svZXh5bm9zKi50eHQKKworU0FNU1VORyBTUEkgRFJJVkVSUworTToJS3VramluIEtpbSA8a2dlbmVAa2VybmVsLm9yZz4KK006CUtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KK006CUFuZGkgU2h5dGkgPGFuZGkuc2h5dGlAc2Ftc3VuZy5jb20+CitMOglsaW51eC1zcGlAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC1zYW1zdW5nLXNvY0B2Z2VyLmtlcm5lbC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQorUzoJTWFpbnRhaW5lZAorRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktc2Ftc3VuZy50eHQKK0Y6CWRyaXZlcnMvc3BpL3NwaS1zM2MqCitGOglpbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvc3BpLXMzYzY0eHguaAogCiBTQU1TVU5HIFNYR0JFIERSSVZFUlMKIE06CUJ5dW5naG8gQW4gPGJoNzQuYW5Ac2Ftc3VuZy5jb20+CkBAIC0xMTA4NCw2ICsxMTI3Niw3IEBACiBGOglkcml2ZXJzL3NwaS8KIEY6CWluY2x1ZGUvbGludXgvc3BpLwogRjoJaW5jbHVkZS91YXBpL2xpbnV4L3NwaS8KK0Y6CXRvb2xzL3NwaS8KIAogU1BJREVSTkVUIE5FVFdPUksgRFJJVkVSIGZvciBDRUxMCiBNOglJc2hpemFraSBLb3UgPGtvdS5pc2hpemFraUB0b3NoaWJhLmNvLmpwPgpAQCAtMTExNTQsNiArMTEzNDcsNyBAQAogU1RBR0lORyAtIExVU1RSRSBQQVJBTExFTCBGSUxFU1lTVEVNCiBNOglPbGVnIERyb2tpbiA8b2xlZy5kcm9raW5AaW50ZWwuY29tPgogTToJQW5kcmVhcyBEaWxnZXIgPGFuZHJlYXMuZGlsZ2VyQGludGVsLmNvbT4KK006CUphbWVzIFNpbW1vbnMgPGpzaW1tb25zQGluZnJhZGVhZC5vcmc+CiBMOglsdXN0cmUtZGV2ZWxAbGlzdHMubHVzdHJlLm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCiBXOglodHRwOi8vd2lraS5sdXN0cmUub3JnLwogUzoJTWFpbnRhaW5lZApAQCAtMTExODAsMTMgKzExMzc0LDYgQEAKIFM6CU9kZCBGaXhlcwogRjoJZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvCiAKLVNUQUdJTkcgLSBSRUFMVEVLIFJUTDg3MjNVIFdJUkVMRVNTIERSSVZFUgotTToJTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgotTToJSmVzIFNvcmVuc2VuIDxKZXMuU29yZW5zZW5AcmVkaGF0LmNvbT4KLUw6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwotUzoJTWFpbnRhaW5lZAotRjoJZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS8KLQogU1RBR0lORyAtIFNJTElDT04gTU9USU9OIFNNNzUwIEZSQU1FIEJVRkZFUiBEUklWRVIKIE06CVN1ZGlwIE11a2hlcmplZSA8c3VkaXBtLm11a2hlcmplZUBnbWFpbC5jb20+CiBNOglUZWRkeSBXYW5nIDx0ZWRkeS53YW5nQHNpbGljb25tb3Rpb24uY29tPgpAQCAtMTEyMTcsMTIgKzExNDA0LDggQEAKIEY6CWRyaXZlcnMvc3RhZ2luZy92dDY2NT8vCiAKIFNUQUdJTkcgLSBXSUxDMTAwMCBXSUZJIERSSVZFUgotTToJSm9obm55IEtpbSA8am9obm55LmtpbUBhdG1lbC5jb20+Ci1NOglBdXN0aW4gU2hpbiA8YXVzdGluLnNoaW5AYXRtZWwuY29tPgotTToJQ2hyaXMgUGFyayA8Y2hyaXMucGFya0BhdG1lbC5jb20+Ci1NOglUb255IENobyA8dG9ueS5jaG9AYXRtZWwuY29tPgotTToJR2xlbiBMZWUgPGdsZW4ubGVlQGF0bWVsLmNvbT4KLU06CUxlbyBLaW0gPGxlby5raW1AYXRtZWwuY29tPgorTToJQWRpdHlhIFNoYW5rYXIgPGFkaXR5YS5zaGFua2FyQG1pY3JvY2hpcC5jb20+CitNOglHYW5lc2ggS3Jpc2huYSA8Z2FuZXNoLmtyaXNobmFAbWljcm9jaGlwLmNvbT4KIEw6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvCkBAIC0xMTU5MCw3ICsxMTc3Myw3IEBACiBUSEVSTUFML0NQVV9DT09MSU5HCiBNOglBbWl0IERhbmllbCBLYWNoaGFwIDxhbWl0LmthY2hoYXBAZ21haWwuY29tPgogTToJVmlyZXNoIEt1bWFyIDx2aXJlc2gua3VtYXJAbGluYXJvLm9yZz4KLU06CUphdmkgTWVyaW5vIDxqYXZpLm1lcmlub0Bhcm0uY29tPgorTToJSmF2aSBNZXJpbm8gPGphdmkubWVyaW5vQGtlcm5lbC5vcmc+CiBMOglsaW51eC1wbUB2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAogRjoJRG9jdW1lbnRhdGlvbi90aGVybWFsL2NwdS1jb29saW5nLWFwaS50eHQKQEAgLTEyMTU3LDcgKzEyMzQwLDcgQEAKIEY6CWRyaXZlcnMvbmV0L3VzYi9sYW43OHh4LioKIAogVVNCIE1BU1MgU1RPUkFHRSBEUklWRVIKLU06CU1hdHRoZXcgRGhhcm0gPG1kaGFybS11c2JAb25lLWV5ZWQtYWxpZW4ubmV0PgorTToJQWxhbiBTdGVybiA8c3Rlcm5Acm93bGFuZC5oYXJ2YXJkLmVkdT4KIEw6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKIEw6CXVzYi1zdG9yYWdlQGxpc3RzLm9uZS1leWVkLWFsaWVuLm5ldAogUzoJTWFpbnRhaW5lZApAQCAtMTIyNDEsNiArMTI0MjQsNyBAQAogVVNCIFNFUklBTCBTVUJTWVNURU0KIE06CUpvaGFuIEhvdm9sZCA8am9oYW5Aa2VybmVsLm9yZz4KIEw6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvam9oYW4vdXNiLXNlcmlhbC5naXQKIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vdXNiL3VzYi1zZXJpYWwudHh0CiBGOglkcml2ZXJzL3VzYi9zZXJpYWwvCkBAIC0xMjI1NCw2ICsxMjQzOCw3IEBACiAKIFVTQiBTTVNDOTVYWCBFVEhFUk5FVCBEUklWRVIKIE06CVN0ZXZlIEdsZW5kaW5uaW5nIDxzdGV2ZS5nbGVuZGlubmluZ0BzaGF3ZWxsLm5ldD4KK006CU1pY3JvY2hpcCBMaW51eCBEcml2ZXIgU3VwcG9ydCA8VU5HTGludXhEcml2ZXJAbWljcm9jaGlwLmNvbT4KIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC4qCkBAIC0xMjM2MCw3ICsxMjU0NSw2IEBACiBGOglmcy9ocHBmcy8KIAogVVNFUlNQQUNFIEkvTyAoVUlPKQotTToJIkhhbnMgSi4gS29jaCIgPGhqa0BoYW5zamtvY2guZGU+CiBNOglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBsaW51eGZvdW5kYXRpb24ub3JnPgogUzoJTWFpbnRhaW5lZAogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9ncmVna2gvY2hhci1taXNjLmdpdApAQCAtMTI1NDIsNyArMTI3MjYsNyBAQAogRjoJbmV0LzgwMjFxLwogCiBWTFlOUSBCVVMKLU06CUZsb3JpYW4gRmFpbmVsbGkgPGZsb3JpYW5Ab3BlbndydC5vcmc+CitNOglGbG9yaWFuIEZhaW5lbGxpIDxmLmZhaW5lbGxpQGdtYWlsLmNvbT4KIEw6CW9wZW53cnQtZGV2ZWxAbGlzdHMub3BlbndydC5vcmcgKHN1YnNjcmliZXJzLW9ubHkpCiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL3ZseW5xL3ZseW5xLmMKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggNWMxOGJhYS4uYWRkYjIzNSAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACiBWRVJTSU9OID0gNAogUEFUQ0hMRVZFTCA9IDgKIFNVQkxFVkVMID0gMAotRVhUUkFWRVJTSU9OID0gLXJjMgorRVhUUkFWRVJTSU9OID0KIE5BTUUgPSBQc3ljaG90aWMgU3RvbmVkIFNoZWVwCiAKICMgKkRPQ1VNRU5UQVRJT04qCkBAIC0xNDI1LDcgKzE0MjUsNyBAQAogCiAjIERvY3VtZW50YXRpb24gdGFyZ2V0cwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLURPQ19UQVJHRVRTIDo9IHhtbGRvY3Mgc2dtbGRvY3MgcHNkb2NzIHBkZmRvY3MgaHRtbGRvY3MgbWFuZG9jcyBpbnN0YWxsbWFuZG9jcyBlcHViZG9jcyBjbGVhbmRvY3MKK0RPQ19UQVJHRVRTIDo9IHhtbGRvY3Mgc2dtbGRvY3MgcHNkb2NzIGxhdGV4ZG9jcyBwZGZkb2NzIGh0bWxkb2NzIG1hbmRvY3MgaW5zdGFsbG1hbmRvY3MgZXB1YmRvY3MgY2xlYW5kb2NzCiBQSE9OWSArPSAkKERPQ19UQVJHRVRTKQogJChET0NfVEFSR0VUUyk6IHNjcmlwdHNfYmFzaWMgRk9SQ0UKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT1zY3JpcHRzIGJ1aWxkX2RvY3Byb2MgYnVpbGRfY2hlY2stbGNfY3R5cGUKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQppbmRleCBlOGM4YTZkLi4wOWYzNGY3IDEwMDY0NAotLS0gYS9SRUFETUUKKysrIGIvUkVBRE1FCkBAIC0yMjksMTAgKzIyOSw2IEBACiAgICAgICB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMgbGVhZCB0byBwcm9ibGVtczogcHJvYmluZyBmb3IgYQogICAgICAgbm9uZXhpc3RlbnQgY29udHJvbGxlciBjYXJkIG1heSBjb25mdXNlIHlvdXIgb3RoZXIgY29udHJvbGxlcnMKIAotICAgIC0gQ29tcGlsaW5nIHRoZSBrZXJuZWwgd2l0aCAiUHJvY2Vzc29yIHR5cGUiIHNldCBoaWdoZXIgdGhhbiAzODYKLSAgICAgIHdpbGwgcmVzdWx0IGluIGEga2VybmVsIHRoYXQgZG9lcyBOT1Qgd29yayBvbiBhIDM4Ni4gIFRoZQotICAgICAga2VybmVsIHdpbGwgZGV0ZWN0IHRoaXMgb24gYm9vdHVwLCBhbmQgZ2l2ZSB1cC4KLQogICAgIC0gQSBrZXJuZWwgd2l0aCBtYXRoLWVtdWxhdGlvbiBjb21waWxlZCBpbiB3aWxsIHN0aWxsIHVzZSB0aGUKICAgICAgIGNvcHJvY2Vzc29yIGlmIG9uZSBpcyBwcmVzZW50OiB0aGUgbWF0aCBlbXVsYXRpb24gd2lsbCBqdXN0CiAgICAgICBuZXZlciBnZXQgdXNlZCBpbiB0aGF0IGNhc2UuICBUaGUga2VybmVsIHdpbGwgYmUgc2xpZ2h0bHkgbGFyZ2VyLApAQCAtMjg5LDcgKzI4NSw3IEBACiAgICBMT0NBTFZFUlNJT04gY2FuIGJlIHNldCBpbiB0aGUgIkdlbmVyYWwgU2V0dXAiIG1lbnUuCiAKICAtIEluIG9yZGVyIHRvIGJvb3QgeW91ciBuZXcga2VybmVsLCB5b3UnbGwgbmVlZCB0byBjb3B5IHRoZSBrZXJuZWwKLSAgIGltYWdlIChlLmcuIC4uLi9saW51eC9hcmNoL2kzODYvYm9vdC9iekltYWdlIGFmdGVyIGNvbXBpbGF0aW9uKQorICAgaW1hZ2UgKGUuZy4gLi4uL2xpbnV4L2FyY2gveDg2L2Jvb3QvYnpJbWFnZSBhZnRlciBjb21waWxhdGlvbikKICAgIHRvIHRoZSBwbGFjZSB3aGVyZSB5b3VyIHJlZ3VsYXIgYm9vdGFibGUga2VybmVsIGlzIGZvdW5kLgogCiAgLSBCb290aW5nIGEga2VybmVsIGRpcmVjdGx5IGZyb20gYSBmbG9wcHkgd2l0aG91dCB0aGUgYXNzaXN0YW5jZSBvZiBhCkBAIC0zOTEsNyArMzg3LDcgQEAKIAogIC0gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1c2UgZ2RiIG9uIGEgcnVubmluZyBrZXJuZWwuIChyZWFkLW9ubHk7IGkuZS4geW91CiAgICBjYW5ub3QgY2hhbmdlIHZhbHVlcyBvciBzZXQgYnJlYWsgcG9pbnRzLikgVG8gZG8gdGhpcywgZmlyc3QgY29tcGlsZSB0aGUKLSAgIGtlcm5lbCB3aXRoIC1nOyBlZGl0IGFyY2gvaTM4Ni9NYWtlZmlsZSBhcHByb3ByaWF0ZWx5LCB0aGVuIGRvIGEgIm1ha2UKKyAgIGtlcm5lbCB3aXRoIC1nOyBlZGl0IGFyY2gveDg2L01ha2VmaWxlIGFwcHJvcHJpYXRlbHksIHRoZW4gZG8gYSAibWFrZQogICAgY2xlYW4iLiBZb3UnbGwgYWxzbyBuZWVkIHRvIGVuYWJsZSBDT05GSUdfUFJPQ19GUyAodmlhICJtYWtlIGNvbmZpZyIpLgogCiAgICBBZnRlciB5b3UndmUgcmVib290ZWQgd2l0aCB0aGUgbmV3IGtlcm5lbCwgZG8gImdkYiB2bWxpbnV4IC9wcm9jL2tjb3JlIi4KZGlmZiAtLWdpdCBhL2FyY2gvS2NvbmZpZyBiL2FyY2gvS2NvbmZpZwppbmRleCBlOWM5MzM0Li4xODBlYTMzIDEwMDY0NAotLS0gYS9hcmNoL0tjb25maWcKKysrIGIvYXJjaC9LY29uZmlnCkBAIC0zMzYsMTcgKzMzNiw2IEBACiAJICAgIHJlc3VsdHMgaW4gdGhlIHN5c3RlbSBjYWxsIGJlaW5nIHNraXBwZWQgaW1tZWRpYXRlbHkuCiAJICAtIHNlY2NvbXAgc3lzY2FsbCB3aXJlZCB1cAogCi0JICBGb3IgYmVzdCBwZXJmb3JtYW5jZSwgYW4gYXJjaCBzaG91bGQgdXNlIHNlY2NvbXBfcGhhc2UxIGFuZAotCSAgc2VjY29tcF9waGFzZTIgZGlyZWN0bHkuICBJdCBzaG91bGQgY2FsbCBzZWNjb21wX3BoYXNlMSBmb3IgYWxsCi0JICBzeXNjYWxscyBpZiBUSUZfU0VDQ09NUCBpcyBzZXQsIGJ1dCBzZWNjb21wX3BoYXNlMSBkb2VzIG5vdAotCSAgbmVlZCB0byBiZSBjYWxsZWQgZnJvbSBhIHB0cmFjZS1zYWZlIGNvbnRleHQuICBJdCBtdXN0IHRoZW4KLQkgIGNhbGwgc2VjY29tcF9waGFzZTIgaWYgc2VjY29tcF9waGFzZTEgcmV0dXJucyBhbnl0aGluZyBvdGhlcgotCSAgdGhhbiBTRUNDT01QX1BIQVNFMV9PSyBvciBTRUNDT01QX1BIQVNFMV9TS0lQLgotCi0JICBBcyBhbiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbiwgYW4gYXJjaCBtYXkgcHJvdmlkZSBzZWNjb21wX2RhdGEKLQkgIGRpcmVjdGx5IHRvIHNlY2NvbXBfcGhhc2UxOyB0aGlzIGF2b2lkcyBtdWx0aXBsZSBjYWxscwotCSAgdG8gdGhlIHN5c2NhbGxfeHl6IGhlbHBlcnMgZm9yIGV2ZXJ5IHN5c2NhbGwuCi0KIGNvbmZpZyBTRUNDT01QX0ZJTFRFUgogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIEhBVkVfQVJDSF9TRUNDT01QX0ZJTFRFUiAmJiBTRUNDT01QICYmIE5FVApAQCAtNzA3LDQgKzY5NiwzOCBAQAogY29uZmlnIENQVV9OT19FRkZJQ0lFTlRfRkZTCiAJZGVmX2Jvb2wgbgogCitjb25maWcgSEFWRV9BUkNIX1ZNQVBfU1RBQ0sKKwlkZWZfYm9vbCBuCisJaGVscAorCSAgQW4gYXJjaCBzaG91bGQgc2VsZWN0IHRoaXMgc3ltYm9sIGlmIGl0IGNhbiBzdXBwb3J0IGtlcm5lbCBzdGFja3MKKwkgIGluIHZtYWxsb2Mgc3BhY2UuICBUaGlzIG1lYW5zOgorCisJICAtIHZtYWxsb2Mgc3BhY2UgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBtYW55IGtlcm5lbCBzdGFja3MuCisJICAgIFRoaXMgbWF5IHJ1bGUgb3V0IG1hbnkgMzItYml0IGFyY2hpdGVjdHVyZXMuCisKKwkgIC0gU3RhY2tzIGluIHZtYWxsb2Mgc3BhY2UgbmVlZCB0byB3b3JrIHJlbGlhYmx5LiAgRm9yIGV4YW1wbGUsIGlmCisJICAgIHZtYXAgcGFnZSB0YWJsZXMgYXJlIGNyZWF0ZWQgb24gZGVtYW5kLCBlaXRoZXIgdGhpcyBtZWNoYW5pc20KKwkgICAgbmVlZHMgdG8gd29yayB3aGlsZSB0aGUgc3RhY2sgcG9pbnRzIHRvIGEgdmlydHVhbCBhZGRyZXNzIHdpdGgKKwkgICAgdW5wb3B1bGF0ZWQgcGFnZSB0YWJsZXMgb3IgYXJjaCBjb2RlIChzd2l0Y2hfdG8oKSBhbmQgc3dpdGNoX21tKCksCisJICAgIG1vc3QgbGlrZWx5KSBuZWVkcyB0byBlbnN1cmUgdGhhdCB0aGUgc3RhY2sncyBwYWdlIHRhYmxlIGVudHJpZXMKKwkgICAgYXJlIHBvcHVsYXRlZCBiZWZvcmUgcnVubmluZyBvbiBhIHBvc3NpYmx5IHVucG9wdWxhdGVkIHN0YWNrLgorCisJICAtIElmIHRoZSBzdGFjayBvdmVyZmxvd3MgaW50byBhIGd1YXJkIHBhZ2UsIHNvbWV0aGluZyByZWFzb25hYmxlCisJICAgIHNob3VsZCBoYXBwZW4uICBUaGUgZGVmaW5pdGlvbiBvZiAicmVhc29uYWJsZSIgaXMgZmxleGlibGUsIGJ1dAorCSAgICBpbnN0YW50bHkgcmVib290aW5nIHdpdGhvdXQgbG9nZ2luZyBhbnl0aGluZyB3b3VsZCBiZSB1bmZyaWVuZGx5LgorCitjb25maWcgVk1BUF9TVEFDSworCWRlZmF1bHQgeQorCWJvb2wgIlVzZSBhIHZpcnR1YWxseS1tYXBwZWQgc3RhY2siCisJZGVwZW5kcyBvbiBIQVZFX0FSQ0hfVk1BUF9TVEFDSyAmJiAhS0FTQU4KKwktLS1oZWxwLS0tCisJICBFbmFibGUgdGhpcyBpZiB5b3Ugd2FudCB0aGUgdXNlIHZpcnR1YWxseS1tYXBwZWQga2VybmVsIHN0YWNrcworCSAgd2l0aCBndWFyZCBwYWdlcy4gIFRoaXMgY2F1c2VzIGtlcm5lbCBzdGFjayBvdmVyZmxvd3MgdG8gYmUKKwkgIGNhdWdodCBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiBjYXVzaW5nIGRpZmZpY3VsdC10by1kaWFnbm9zZQorCSAgY29ycnVwdGlvbi4KKworCSAgVGhpcyBpcyBwcmVzZW50bHkgaW5jb21wYXRpYmxlIHdpdGggS0FTQU4gYmVjYXVzZSBLQVNBTiBleHBlY3RzCisJICB0aGUgc3RhY2sgdG8gbWFwIGRpcmVjdGx5IHRvIHRoZSBLQVNBTiBzaGFkb3cgbWFwIHVzaW5nIGEgZm9ybXVsYQorCSAgdGhhdCBpcyBpbmNvcnJlY3QgaWYgdGhlIHN0YWNrIGlzIGluIHZtYWxsb2Mgc3BhY2UuCisKIHNvdXJjZSAia2VybmVsL2djb3YvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggYzQxOWI0My4uNDY2ZTQyZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTM3MSwxNCArMzcxLDYgQEAKIAlyZXR1cm4gX19jdV9sZW47CiB9CiAKLWV4dGVybiBpbmxpbmUgbG9uZwotX19jb3B5X3RvZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBsb25nIGxlbiwgY29uc3Qgdm9pZCBfX3VzZXIgKnZhbGlkYXRlKQotewotCWlmIChfX2FjY2Vzc19vaygodW5zaWduZWQgbG9uZyl2YWxpZGF0ZSwgbGVuLCBnZXRfZnMoKSkpCi0JCWxlbiA9IF9fY29weV90b2Zyb21fdXNlcl9ub2NoZWNrKHRvLCBmcm9tLCBsZW4pOwotCXJldHVybiBsZW47Ci19Ci0KICNkZWZpbmUgX19jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pCQkJCQlcCiAoewkJCQkJCQkJCVwKIAlfX2Noa191c2VyX3B0cih0byk7CQkJCQkJXApAQCAtMzkzLDE3ICszODUsMjIgQEAKICNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWMgX19jb3B5X3RvX3VzZXIKICNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyBfX2NvcHlfZnJvbV91c2VyCiAKLQogZXh0ZXJuIGlubGluZSBsb25nCiBjb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBsb25nIG4pCiB7Ci0JcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcigoX19mb3JjZSB2b2lkICopdG8sIGZyb20sIG4sIHRvKTsKKwlpZiAobGlrZWx5KF9fYWNjZXNzX29rKCh1bnNpZ25lZCBsb25nKXRvLCBuLCBnZXRfZnMoKSkpKQorCQluID0gX19jb3B5X3RvZnJvbV91c2VyX25vY2hlY2soKF9fZm9yY2Ugdm9pZCAqKXRvLCBmcm9tLCBuKTsKKwlyZXR1cm4gbjsKIH0KIAogZXh0ZXJuIGlubGluZSBsb25nCiBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIGxvbmcgbikKIHsKLQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKHRvLCAoX19mb3JjZSB2b2lkICopZnJvbSwgbiwgZnJvbSk7CisJaWYgKGxpa2VseShfX2FjY2Vzc19vaygodW5zaWduZWQgbG9uZylmcm9tLCBuLCBnZXRfZnMoKSkpKQorCQluID0gX19jb3B5X3RvZnJvbV91c2VyX25vY2hlY2sodG8sIChfX2ZvcmNlIHZvaWQgKilmcm9tLCBuKTsKKwllbHNlCisJCW1lbXNldCh0bywgMCwgbik7CisJcmV0dXJuIG47CiB9CiAKIGV4dGVybiB2b2lkIF9fZG9fY2xlYXJfdXNlcih2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL0tjb25maWcgYi9hcmNoL2FyYy9LY29uZmlnCmluZGV4IDBkM2U1OWYuLmVjZDEyMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL0tjb25maWcKKysrIGIvYXJjaC9hcmMvS2NvbmZpZwpAQCAtMTMsNyArMTMsNyBAQAogCXNlbGVjdCBDTEtTUkNfT0YKIAlzZWxlY3QgQ0xPTkVfQkFDS1dBUkRTCiAJc2VsZWN0IENPTU1PTl9DTEsKLQlzZWxlY3QgR0VORVJJQ19BVE9NSUM2NAorCXNlbGVjdCBHRU5FUklDX0FUT01JQzY0IGlmICFJU0FfQVJDVjIgfHwgIShBUkNfSEFTX0xMNjQgJiYgQVJDX0hBU19MTFNDKQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IEdFTkVSSUNfRklORF9GSVJTVF9CSVQKIAkjIGZvciBub3csIHdlIGRvbid0IG5lZWQgR0VORVJJQ19JUlFfUFJPQkUsIENPTkZJR19HRU5FUklDX0lSUV9DSElQCkBAIC0zNTMsOCArMzUzLDggQEAKIAogY29uZmlnIE5PREVTX1NISUZUCiAJaW50ICJNYXhpbXVtIE5VTUEgTm9kZXMgKGFzIGEgcG93ZXIgb2YgMikiCi0JZGVmYXVsdCAiMSIgaWYgIURJU0NPTlRJR01FTQotCWRlZmF1bHQgIjIiIGlmIERJU0NPTlRJR01FTQorCWRlZmF1bHQgIjAiIGlmICFESVNDT05USUdNRU0KKwlkZWZhdWx0ICIxIiBpZiBESVNDT05USUdNRU0KIAlkZXBlbmRzIG9uIE5FRURfTVVMVElQTEVfTk9ERVMKIAktLS1oZWxwLS0tCiAJICBBY2Nlc3NpbmcgbWVtb3J5IGJleW9uZCAxR0IgKHdpdGggb3Igdy9vIFBBRSkgcmVxdWlyZXMgMiBtZW1vcnkKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL01ha2VmaWxlIGIvYXJjaC9hcmMvTWFrZWZpbGUKaW5kZXggNjAxZWQxNy4uYWE4MmQxMyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvTWFrZWZpbGUKKysrIGIvYXJjaC9hcmMvTWFrZWZpbGUKQEAgLTQ3LDcgKzQ3LDYgQEAKIAogdXB0b19nY2M0NCAgICA6PSAgJChjYWxsIGNjLWlmdmVyc2lvbiwgLWxlLCAwNDA0LCB5KQogYXRsZWFzdF9nY2M0NCA6PSAgJChjYWxsIGNjLWlmdmVyc2lvbiwgLWdlLCAwNDA0LCB5KQotYXRsZWFzdF9nY2M0OCA6PSAgJChjYWxsIGNjLWlmdmVyc2lvbiwgLWdlLCAwNDA4LCB5KQogCiBjZmxhZ3MtJChhdGxlYXN0X2djYzQ0KQkJCSs9IC1mc2VjdGlvbi1hbmNob3JzCiAKQEAgLTY2LDEwICs2NSw4IEBACiAKIGVuZGlmCiAKLSMgQnkgZGVmYXVsdCBnY2MgNC44IGdlbmVyYXRlcyBkd2FyZjQgd2hpY2gga2VybmVsIHVud2luZGVyIGNhbid0IGdyb2sKLWlmZXEgKCQoYXRsZWFzdF9nY2M0OCkseSkKLWNmbGFncy0kKENPTkZJR19BUkNfRFcyX1VOV0lORCkJCSs9IC1nZHdhcmYtMgotZW5kaWYKK2NmaSA6PSAkKGNhbGwgYXMtaW5zdHIsLmNmaV9zdGFydHByb2Ncbi5jZmlfZW5kcHJvYywtREFSQ19EVzJfVU5XSU5EX0FTX0NGSSkKK2NmbGFncy0kKENPTkZJR19BUkNfRFcyX1VOV0lORCkJCSs9IC1mYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgJChjZmkpCiAKIGlmbmRlZiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUKICMgR2VuZXJpYyBidWlsZCBzeXN0ZW0gdXNlcyAtTzIsIHdlIHdhbnQgLU8zCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy9hYmlsaXNfdGIxMDBfZHZrLmR0cyBiL2FyY2gvYXJjL2Jvb3QvZHRzL2FiaWxpc190YjEwMF9kdmsuZHRzCmluZGV4IDNkZDZlZDkuLjNhY2YwNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL2FiaWxpc190YjEwMF9kdmsuZHRzCisrKyBiL2FyY2gvYXJjL2Jvb3QvZHRzL2FiaWxpc190YjEwMF9kdmsuZHRzCkBAIC0yNCw2ICsyNCw3IEBACiAvaW5jbHVkZS8gImFiaWxpc190YjEwMC5kdHNpIgogCiAvIHsKKwltb2RlbCA9ICJhYmlsaXMsdGIxMDAiOwogCWNob3NlbiB7CiAJCWJvb3RhcmdzID0gImVhcmx5Y29uPXVhcnQ4MjUwLG1taW8zMiwweGZmMTAwMDAwLDk2MDBuOCBjb25zb2xlPXR0eVMwLDk2MDBuOCI7CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2Jvb3QvZHRzL2FiaWxpc190YjEwMV9kdmsuZHRzIGIvYXJjaC9hcmMvYm9vdC9kdHMvYWJpbGlzX3RiMTAxX2R2ay5kdHMKaW5kZXggMWNmNTFjMi4uMzdkODhjNSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvYm9vdC9kdHMvYWJpbGlzX3RiMTAxX2R2ay5kdHMKKysrIGIvYXJjaC9hcmMvYm9vdC9kdHMvYWJpbGlzX3RiMTAxX2R2ay5kdHMKQEAgLTI0LDYgKzI0LDcgQEAKIC9pbmNsdWRlLyAiYWJpbGlzX3RiMTAxLmR0c2kiCiAKIC8geworCW1vZGVsID0gImFiaWxpcyx0YjEwMSI7CiAJY2hvc2VuIHsKIAkJYm9vdGFyZ3MgPSAiZWFybHljb249dWFydDgyNTAsbW1pbzMyLDB4ZmYxMDAwMDAsOTYwMG44IGNvbnNvbGU9dHR5UzAsOTYwMG44IjsKIAl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvYm9vdC9kdHMvYXhzMTAxLmR0cyBiL2FyY2gvYXJjL2Jvb3QvZHRzL2F4czEwMS5kdHMKaW5kZXggM2Y5YjA1OC4uZDliOWI5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvYm9vdC9kdHMvYXhzMTAxLmR0cworKysgYi9hcmNoL2FyYy9ib290L2R0cy9heHMxMDEuZHRzCkBAIC0xMyw2ICsxMyw3IEBACiAvaW5jbHVkZS8gImF4czEweF9tYi5kdHNpIgogCiAvIHsKKwltb2RlbCA9ICJzbnBzLGF4czEwMSI7CiAJY29tcGF0aWJsZSA9ICJzbnBzLGF4czEwMSIsICJzbnBzLGFyYy1zZHAiOwogCiAJY2hvc2VuIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2Jvb3QvZHRzL2F4czEwMy5kdHMgYi9hcmNoL2FyYy9ib290L2R0cy9heHMxMDMuZHRzCmluZGV4IGU2ZDBlMzEuLmVjN2ZiMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL2F4czEwMy5kdHMKKysrIGIvYXJjaC9hcmMvYm9vdC9kdHMvYXhzMTAzLmR0cwpAQCAtMTYsNiArMTYsNyBAQAogL2luY2x1ZGUvICJheHMxMHhfbWIuZHRzaSIKIAogLyB7CisJbW9kZWwgPSAic25wcyxheHMxMDMiOwogCWNvbXBhdGlibGUgPSAic25wcyxheHMxMDMiLCAic25wcyxhcmMtc2RwIjsKIAogCWNob3NlbiB7CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy9heHMxMDNfaWR1LmR0cyBiL2FyY2gvYXJjL2Jvb3QvZHRzL2F4czEwM19pZHUuZHRzCmluZGV4IGY5OTlmZWYuLjA3MGMyOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL2F4czEwM19pZHUuZHRzCisrKyBiL2FyY2gvYXJjL2Jvb3QvZHRzL2F4czEwM19pZHUuZHRzCkBAIC0xNiw2ICsxNiw3IEBACiAvaW5jbHVkZS8gImF4czEweF9tYi5kdHNpIgogCiAvIHsKKwltb2RlbCA9ICJzbnBzLGF4czEwMy1zbXAiOwogCWNvbXBhdGlibGUgPSAic25wcyxheHMxMDMiLCAic25wcyxhcmMtc2RwIjsKIAogCWNob3NlbiB7CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy9uc2ltXzcwMC5kdHMgYi9hcmNoL2FyYy9ib290L2R0cy9uc2ltXzcwMC5kdHMKaW5kZXggNjM5NzA1MS4uY2UwY2NkMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1fNzAwLmR0cworKysgYi9hcmNoL2FyYy9ib290L2R0cy9uc2ltXzcwMC5kdHMKQEAgLTEwLDYgKzEwLDcgQEAKIC9pbmNsdWRlLyAic2tlbGV0b24uZHRzaSIKIAogLyB7CisJbW9kZWwgPSAic25wcyxuc2ltIjsKIAljb21wYXRpYmxlID0gInNucHMsbnNpbSI7CiAJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJI3NpemUtY2VsbHMgPSA8MT47CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy9uc2ltX2hzLmR0cyBiL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1faHMuZHRzCmluZGV4IGJmMDVmZTUuLjM3NzJjNDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1faHMuZHRzCisrKyBiL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1faHMuZHRzCkBAIC0xMCw2ICsxMCw3IEBACiAvaW5jbHVkZS8gInNrZWxldG9uX2hzLmR0c2kiCiAKIC8geworCW1vZGVsID0gInNucHMsbnNpbV9ocyI7CiAJY29tcGF0aWJsZSA9ICJzbnBzLG5zaW1faHMiOwogCSNhZGRyZXNzLWNlbGxzID0gPDI+OwogCSNzaXplLWNlbGxzID0gPDI+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbV9oc19pZHUuZHRzIGIvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbV9oc19pZHUuZHRzCmluZGV4IDk5ZWFiZTEuLjQ4NDM0ZDdjIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9ib290L2R0cy9uc2ltX2hzX2lkdS5kdHMKKysrIGIvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbV9oc19pZHUuZHRzCkBAIC0xMCw2ICsxMCw3IEBACiAvaW5jbHVkZS8gInNrZWxldG9uX2hzX2lkdS5kdHNpIgogCiAvIHsKKwltb2RlbCA9ICJzbnBzLG5zaW1faHMtc21wIjsKIAljb21wYXRpYmxlID0gInNucHMsbnNpbV9ocyI7CiAJaW50ZXJydXB0LXBhcmVudCA9IDwmY29yZV9pbnRjPjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbW9zY2kuZHRzIGIvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbW9zY2kuZHRzCmluZGV4IGU2NTlhMzQuLmJjZjYwMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1vc2NpLmR0cworKysgYi9hcmNoL2FyYy9ib290L2R0cy9uc2ltb3NjaS5kdHMKQEAgLTEwLDYgKzEwLDcgQEAKIC9pbmNsdWRlLyAic2tlbGV0b24uZHRzaSIKIAogLyB7CisJbW9kZWwgPSAic25wcyxuc2ltb3NjaSI7CiAJY29tcGF0aWJsZSA9ICJzbnBzLG5zaW1vc2NpIjsKIAkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkjc2l6ZS1jZWxscyA9IDwxPjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1vc2NpX2hzLmR0cyBiL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1vc2NpX2hzLmR0cwppbmRleCAxNmNlNWQ2Li4xNGE3MjdjIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9ib290L2R0cy9uc2ltb3NjaV9ocy5kdHMKKysrIGIvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbW9zY2lfaHMuZHRzCkBAIC0xMCw2ICsxMCw3IEBACiAvaW5jbHVkZS8gInNrZWxldG9uX2hzLmR0c2kiCiAKIC8geworCW1vZGVsID0gInNucHMsbnNpbW9zY2lfaHMiOwogCWNvbXBhdGlibGUgPSAic25wcyxuc2ltb3NjaV9ocyI7CiAJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJI3NpemUtY2VsbHMgPSA8MT47CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy9uc2ltb3NjaV9oc19pZHUuZHRzIGIvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbW9zY2lfaHNfaWR1LmR0cwppbmRleCBjZThkZmJjLi5jYmY2NWI2IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9ib290L2R0cy9uc2ltb3NjaV9oc19pZHUuZHRzCisrKyBiL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1vc2NpX2hzX2lkdS5kdHMKQEAgLTEwLDYgKzEwLDcgQEAKIC9pbmNsdWRlLyAic2tlbGV0b25faHNfaWR1LmR0c2kiCiAKIC8geworCW1vZGVsID0gInNucHMsbnNpbW9zY2lfaHMtc21wIjsKIAljb21wYXRpYmxlID0gInNucHMsbnNpbW9zY2lfaHMiOwogCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCSNzaXplLWNlbGxzID0gPDE+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvYm9vdC9kdHMvdmRrX2hzMzguZHRzIGIvYXJjaC9hcmMvYm9vdC9kdHMvdmRrX2hzMzguZHRzCmluZGV4IDVkODAzZGQuLjNjNTExMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL3Zka19oczM4LmR0cworKysgYi9hcmNoL2FyYy9ib290L2R0cy92ZGtfaHMzOC5kdHMKQEAgLTEzLDYgKzEzLDcgQEAKIC9pbmNsdWRlLyAidmRrX2F4czEweF9tYi5kdHNpIgogCiAvIHsKKwltb2RlbCA9ICJzbnBzLHZka19hcmNocyI7CiAJY29tcGF0aWJsZSA9ICJzbnBzLGF4czEwMyI7CiAKIAljaG9zZW4gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvYm9vdC9kdHMvdmRrX2hzMzhfc21wLmR0cyBiL2FyY2gvYXJjL2Jvb3QvZHRzL3Zka19oczM4X3NtcC5kdHMKaW5kZXggMmJhNjBjMzkuLjZiZTY4MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL3Zka19oczM4X3NtcC5kdHMKKysrIGIvYXJjaC9hcmMvYm9vdC9kdHMvdmRrX2hzMzhfc21wLmR0cwpAQCAtMTMsNiArMTMsNyBAQAogL2luY2x1ZGUvICJ2ZGtfYXhzMTB4X21iLmR0c2kiCiAKIC8geworCW1vZGVsID0gInNucHMsdmRrX2FyY2hzLXNtcCI7CiAJY29tcGF0aWJsZSA9ICJzbnBzLGF4czEwMyI7CiAKIAljaG9zZW4gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvYm9vdC9kdHMvemVidV9ocy5kdHMgYi9hcmNoL2FyYy9ib290L2R0cy96ZWJ1X2hzLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzEzMjRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcmMvYm9vdC9kdHMvemVidV9ocy5kdHMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNi0yMDE0IFN5bm9wc3lzLCBJbmMuICh3d3cuc3lub3BzeXMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKy9kdHMtdjEvOworCisvaW5jbHVkZS8gInNrZWxldG9uX2hzLmR0c2kiCisKKy8geworCW1vZGVsID0gInNucHMsemVidV9ocyI7CisJY29tcGF0aWJsZSA9ICJzbnBzLHplYnVfaHMiOworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWludGVycnVwdC1wYXJlbnQgPSA8JmNvcmVfaW50Yz47CisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MHg4MDAwMDAwMCAweDIwMDAwMDAwPjsJLyogNTEyICovCisJfTsKKworCWNob3NlbiB7CisJCWJvb3RhcmdzID0gImVhcmx5Y29uPXVhcnQ4MjUwLG1taW8zMiwweGYwMDAwMDAwLDExNTIwMG44IGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggZGVidWcgcHJpbnQtZmF0YWwtc2lnbmFscz0xIjsKKwl9OworCisJYWxpYXNlcyB7CisJCXNlcmlhbDAgPSAmdWFydDA7CisJfTsKKworCWZwZ2EgeworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisKKwkJLyogY2hpbGQgYW5kIHBhcmVudCBhZGRyZXNzIHNwYWNlIDE6MSBtYXBwZWQgKi8KKwkJcmFuZ2VzOworCisJCWNvcmVfY2xrOiBjb3JlX2NsayB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZpeGVkLWNsb2NrIjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CisJCX07CisKKwkJY29yZV9pbnRjOiBpbnRlcnJ1cHQtY29udHJvbGxlciB7CisJCQljb21wYXRpYmxlID0gInNucHMsYXJjaHMtaW50YyI7CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCX07CisKKwkJdWFydDA6IHNlcmlhbEBmMDAwMDAwMCB7CisJCQljb21wYXRpYmxlID0gIm5zODI1MCI7CisJCQlyZWcgPSA8MHhmMDAwMDAwMCAweDIwMDA+OworCQkJaW50ZXJydXB0cyA9IDwyND47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8NTAwMDAwMDA+OworCQkJYmF1ZCA9IDwxMTUyMDA+OworCQkJcmVnLXNoaWZ0ID0gPDI+OworCQkJcmVnLWlvLXdpZHRoID0gPDQ+OworCQkJbm8tbG9vcGJhY2stdGVzdCA9IDwxPjsKKwkJfTsKKworCQlhcmNwY3QwOiBwY3QgeworCQkJY29tcGF0aWJsZSA9ICJzbnBzLGFyY2hzLXBjdCI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJaW50ZXJydXB0cyA9IDwyMD47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy96ZWJ1X2hzX2lkdS5kdHMgYi9hcmNoL2FyYy9ib290L2R0cy96ZWJ1X2hzX2lkdS5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyMDRiNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJjL2Jvb3QvZHRzL3plYnVfaHNfaWR1LmR0cwpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2LTIwMTQgU3lub3BzeXMsIEluYy4gKHd3dy5zeW5vcHN5cy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworL2R0cy12MS87CisKKy9pbmNsdWRlLyAic2tlbGV0b25faHNfaWR1LmR0c2kiCisKKy8geworCW1vZGVsID0gInNucHMsemVidV9ocy1zbXAiOworCWNvbXBhdGlibGUgPSAic25wcyx6ZWJ1X2hzIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZjb3JlX2ludGM+OworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwkJcmVnID0gPDB4ODAwMDAwMDAgMHgyMDAwMDAwMD47CS8qIDUxMiAqLworCX07CisKKwljaG9zZW4geworCQlib290YXJncyA9ICJlYXJseWNvbj11YXJ0ODI1MCxtbWlvMzIsMHhmMDAwMDAwMCwxMTUyMDBuOCBjb25zb2xlPXR0eVMwLDExNTIwMG44IGRlYnVnIjsKKwl9OworCisJYWxpYXNlcyB7CisJCXNlcmlhbDAgPSAmdWFydDA7CisJfTsKKworCWZwZ2EgeworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisKKwkJLyogY2hpbGQgYW5kIHBhcmVudCBhZGRyZXNzIHNwYWNlIDE6MSBtYXBwZWQgKi8KKwkJcmFuZ2VzOworCisJCWNvcmVfY2xrOiBjb3JlX2NsayB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZpeGVkLWNsb2NrIjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CS8qIDUwIE1IWiAqLworCQl9OworCisJCWNvcmVfaW50YzogaW50ZXJydXB0LWNvbnRyb2xsZXIgeworCQkJY29tcGF0aWJsZSA9ICJzbnBzLGFyY2hzLWludGMiOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworLyoJCQlpbnRlcnJ1cHRzID0gPDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1PjsgKi8KKwkJfTsKKworCQlpZHVfaW50YzogaWR1LWludGVycnVwdC1jb250cm9sbGVyIHsKKwkJCWNvbXBhdGlibGUgPSAic25wcyxhcmNocy1pZHUtaW50YyI7CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JmNvcmVfaW50Yz47CisJCQkvKiA8aHdpcnEgIGRpc3RyaWJ1dGlvbj4KKwkJCWRpc3RyaWJ1dGlvbjogMD1SUjsgMT1jcHUwLCAyPWNwdTEsIDQ9Y3B1MiwgOD1jcHUzICovCisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJaW50ZXJydXB0cyA9IDwyNCAyNSAyNiAyNyAyOCAyOSAzMCAzMT47CisKKwkJfTsKKworCQl1YXJ0MDogc2VyaWFsQGYwMDAwMDAwIHsKKwkJCS8qIGNvbXBhdGlibGUgPSAibnM4MjUwIjsgRG9lc24ndCB1c2UgRklGT3MgKi8KKwkJCWNvbXBhdGlibGUgPSAibnMxNjU1MGEiOworCQkJcmVnID0gPDB4ZjAwMDAwMDAgMHgyMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlkdV9pbnRjPjsKKwkJCS8qIGludGVycnVwdHMgPSA8MCAxPjsgIERFU1Q9MSovCisJCQkvKiBpbnRlcnJ1cHRzID0gPDAgMj47ICBERVNUPTIqLworCQkJaW50ZXJydXB0cyA9IDwwIDA+OyAgLyogUlIqLworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDUwMDAwMDAwPjsKKwkJCWJhdWQgPSA8MTE1MjAwPjsKKwkJCXJlZy1zaGlmdCA9IDwyPjsKKwkJCXJlZy1pby13aWR0aCA9IDw0PjsKKwkJCW5vLWxvb3BiYWNrLXRlc3QgPSA8MT47CisJCX07CisKKwkJYXJjcGN0MDogcGN0IHsKKwkJCWNvbXBhdGlibGUgPSAic25wcyxhcmNocy1wY3QiOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCWludGVycnVwdHMgPSA8MjA+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvY29uZmlncy9heHMxMDFfZGVmY29uZmlnIGIvYXJjaC9hcmMvY29uZmlncy9heHMxMDFfZGVmY29uZmlnCmluZGV4IDZjZGZmZWEuLjBhMGVhZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2NvbmZpZ3MvYXhzMTAxX2RlZmNvbmZpZworKysgYi9hcmNoL2FyYy9jb25maWdzL2F4czEwMV9kZWZjb25maWcKQEAgLTE4LDYgKzE4LDkgQEAKICMgQ09ORklHX1NMVUJfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQ9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQogQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CiBDT05GSUdfQVJDX1BMQVRfQVhTMTBYPXkKIENPTkZJR19BWFMxMDE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvY29uZmlncy9heHMxMDNfZGVmY29uZmlnIGIvYXJjaC9hcmMvY29uZmlncy9heHMxMDNfZGVmY29uZmlnCmluZGV4IDQ5MWIzYjUuLjIyMzNmNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2NvbmZpZ3MvYXhzMTAzX2RlZmNvbmZpZworKysgYi9hcmNoL2FyYy9jb25maWdzL2F4czEwM19kZWZjb25maWcKQEAgLTE4LDYgKzE4LDkgQEAKICMgQ09ORklHX1NMVUJfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQ9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQogQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CiBDT05GSUdfQVJDX1BMQVRfQVhTMTBYPXkKIENPTkZJR19BWFMxMDM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvY29uZmlncy9heHMxMDNfc21wX2RlZmNvbmZpZyBiL2FyY2gvYXJjL2NvbmZpZ3MvYXhzMTAzX3NtcF9kZWZjb25maWcKaW5kZXggYjI1ZWU3My4uMTEwODc0NyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvY29uZmlncy9heHMxMDNfc21wX2RlZmNvbmZpZworKysgYi9hcmNoL2FyYy9jb25maWdzL2F4czEwM19zbXBfZGVmY29uZmlnCkBAIC0xOCw2ICsxOCw5IEBACiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCPXkKIENPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRD15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CiBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKIENPTkZJR19BUkNfUExBVF9BWFMxMFg9eQogQ09ORklHX0FYUzEwMz15CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9jb25maWdzL25zaW1faHNfZGVmY29uZmlnIGIvYXJjaC9hcmMvY29uZmlncy9uc2ltX2hzX2RlZmNvbmZpZwppbmRleCBhOTlkYzdhLi42NWFiOWZiIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9jb25maWdzL25zaW1faHNfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJjL2NvbmZpZ3MvbnNpbV9oc19kZWZjb25maWcKQEAgLTExLDEzICsxMSwxNiBAQAogIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9Ii4uL2FyY19pbml0cmFtZnNfaHMvIgorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9Ii4uLy4uL2FyY19pbml0cmFtZnNfaHMvIgogQ09ORklHX0tBTExTWU1TX0FMTD15CiBDT05GSUdfRU1CRURERUQ9eQogIyBDT05GSUdfU0xVQl9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKIENPTkZJR19LUFJPQkVTPXkKIENPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRD15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CiAjIENPTkZJR19MQkRBRiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2NvbmZpZ3MvbnNpbV9oc19zbXBfZGVmY29uZmlnIGIvYXJjaC9hcmMvY29uZmlncy9uc2ltX2hzX3NtcF9kZWZjb25maWcKaW5kZXggNTlmMjIxZi4uM2IzOTkwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvY29uZmlncy9uc2ltX2hzX3NtcF9kZWZjb25maWcKKysrIGIvYXJjaC9hcmMvY29uZmlncy9uc2ltX2hzX3NtcF9kZWZjb25maWcKQEAgLTE2LDYgKzE2LDkgQEAKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAogQ09ORklHX0tQUk9CRVM9eQogQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKICMgQ09ORklHX0xCREFGIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvY29uZmlncy96ZWJ1X2hzX2RlZmNvbmZpZyBiL2FyY2gvYXJjL2NvbmZpZ3MvemVidV9oc19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2MTY2YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJjL2NvbmZpZ3MvemVidV9oc19kZWZjb25maWcKQEAgLTAsMCArMSw4NiBAQAorQ09ORklHX0RFRkFVTFRfSE9TVE5BTUU9IkFSQ0xpbnV4IgorIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfUE9TSVhfTVFVRVVFPXkKKyMgQ09ORklHX0NST1NTX01FTU9SWV9BVFRBQ0ggaXMgbm90IHNldAorQ09ORklHX05PX0haX0lETEU9eQorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX05BTUVTUEFDRVM9eQorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9Ii4uLy4uL2FyY19pbml0cmFtZnNfaHMvIgorQ09ORklHX0VYUEVSVD15CitDT05GSUdfUEVSRl9FVkVOVFM9eQorIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CitDT05GSUdfU0xBQj15CitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19MQkRBRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNfUExBVF9TSU09eQorQ09ORklHX0lTQV9BUkNWMj15CitDT05GSUdfQVJDX0JVSUxUSU5fRFRCX05BTUU9InplYnVfaHMiCitDT05GSUdfUFJFRU1QVD15CisjIENPTkZJR19DT01QQUNUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19ORVQ9eQorQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFDS0VUX0RJQUc9eQorQ09ORklHX1VOSVg9eQorQ09ORklHX1VOSVhfRElBRz15CitDT05GSUdfTkVUX0tFWT15CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CitDT05GSUdfREVWVE1QRlM9eQorIyBDT05GSUdfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX05FVF9WRU5ET1JfQVJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfQlJPQURDT00gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9JTlRFTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX01BUlZFTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9NSUNSRUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU0VFUSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NUTUlDUk8gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9XSVpORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9eQorQ09ORklHX01PVVNFX1BTMl9UT1VDSEtJVD15CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJT19BUkNfUFMyPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0xCitDT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz0xCitDT05GSUdfU0VSSUFMXzgyNTBfRFc9eQorQ09ORklHX1NFUklBTF9PRl9QTEFURk9STT15CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorQ09ORklHX0ZCPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKK0NPTkZJR19MT0dPPXkKKyMgQ09ORklHX0hJRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19JT01NVV9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19FWFQyX0ZTX1hBVFRSPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19NSVNDX0ZJTEVTWVNURU1TIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNfRlM9eQorIyBDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQ9eQorIyBDT05GSUdfREVCVUdfUFJFRU1QVCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9jb25maWdzL3plYnVfaHNfc21wX2RlZmNvbmZpZyBiL2FyY2gvYXJjL2NvbmZpZ3MvemVidV9oc19zbXBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZTk2OTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FyYy9jb25maWdzL3plYnVfaHNfc21wX2RlZmNvbmZpZwpAQCAtMCwwICsxLDg5IEBACitDT05GSUdfREVGQVVMVF9IT1NUTkFNRT0iQVJDTGludXgiCisjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorIyBDT05GSUdfQ1JPU1NfTUVNT1JZX0FUVEFDSCBpcyBub3Qgc2V0CitDT05GSUdfTk9fSFpfSURMRT15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTkFNRVNQQUNFUz15CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iLi4vLi4vYXJjX2luaXRyYW1mc19ocy8iCitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1BFUkZfRVZFTlRTPXkKKyMgQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAorQ09ORklHX1NMQUI9eQorQ09ORklHX0tQUk9CRVM9eQorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTEJEQUYgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CitDT05GSUdfQVJDX1BMQVRfU0lNPXkKK0NPTkZJR19JU0FfQVJDVjI9eQorQ09ORklHX1NNUD15CitDT05GSUdfQVJDX0JVSUxUSU5fRFRCX05BTUU9InplYnVfaHNfaWR1IgorQ09ORklHX1BSRUVNUFQ9eQorIyBDT05GSUdfQ09NUEFDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTkVUPXkKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9ESUFHPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19VTklYX0RJQUc9eQorQ09ORklHX05FVF9LRVk9eQorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAorQ09ORklHX0RFVlRNUEZTPXkKKyMgQ09ORklHX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRCBpcyBub3Qgc2V0CisjIENPTkZJR19GSVJNV0FSRV9JTl9LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFViBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19ORVRfVkVORE9SX0FSQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0JST0FEQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfSU5URUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9NQVJWRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfTUlDUkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfTkFUU0VNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NFRVEgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TVE1JQ1JPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfV0laTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU4gaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0VWREVWPXkKK0NPTkZJR19NT1VTRV9QUzJfVE9VQ0hLSVQ9eQorIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fQVJDX1BTMj15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MQorQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9MQorQ09ORklHX1NFUklBTF84MjUwX0RXPXkKK0NPTkZJR19TRVJJQUxfT0ZfUExBVEZPUk09eQorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19GQj15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CitDT05GSUdfTE9HTz15CisjIENPTkZJR19ISUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU9NTVVfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUMl9GU19YQVRUUj15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfTUlTQ19GSUxFU1lTVEVNUyBpcyBub3Qgc2V0CitDT05GSUdfTkZTX0ZTPXkKKyMgQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0xPQ0tVUF9ERVRFQ1RPUj15CisjIENPTkZJR19ERUJVR19QUkVFTVBUIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2FyY3JlZ3MuaCBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2FyY3JlZ3MuaAppbmRleCA3ZmJhZWEwLi5kYjI1YzY1IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9hcmNyZWdzLmgKKysrIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vYXJjcmVncy5oCkBAIC05NSw3ICs5NSw3IEBACiAvKiBBdXhpbGlhcnkgcmVnaXN0ZXJzICovCiAjZGVmaW5lIEFVWF9JREVOVElUWQkJNAogI2RlZmluZSBBVVhfSU5UUl9WRUNfQkFTRQkweDI1Ci0jZGVmaW5lIEFVWF9OT05fVk9MCQkweDVlCisjZGVmaW5lIEFVWF9WT0wJCQkweDVlCiAKIC8qCiAgKiBGbG9hdGluZyBQdCBSZWdpc3RlcnMKQEAgLTI0MCwxNCArMjQwLDYgQEAKICNlbmRpZgogfTsKIAotc3RydWN0IGJjcl9wZXJpcCB7Ci0jaWZkZWYgQ09ORklHX0NQVV9CSUdfRU5ESUFOCi0JdW5zaWduZWQgaW50IHN0YXJ0OjgsIHBhZDI6OCwgc3o6OCwgdmVyOjg7Ci0jZWxzZQotCXVuc2lnbmVkIGludCB2ZXI6OCwgc3o6OCwgcGFkMjo4LCBzdGFydDo4OwotI2VuZGlmCi19OwotCiBzdHJ1Y3QgYmNyX2ljY21fYXJjb21wYWN0IHsKICNpZmRlZiBDT05GSUdfQ1BVX0JJR19FTkRJQU4KIAl1bnNpZ25lZCBpbnQgYmFzZToxNiwgcGFkOjUsIHN6OjMsIHZlcjo4OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCA0ZTNjMWI2Li5iNjU5MzBhIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMjAsNiArMjAsNyBAQAogI2lmbmRlZiBDT05GSUdfQVJDX1BMQVRfRVpOUFMKIAogI2RlZmluZSBhdG9taWNfcmVhZCh2KSAgUkVBRF9PTkNFKCh2KS0+Y291bnRlcikKKyNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQogCiAjaWZkZWYgQ09ORklHX0FSQ19IQVNfTExTQwogCkBAIC0yODQsNiArMjg1LDcgQEAKIEFUT01JQ19PUFMoYWRkLCArPSwgQ1RPUF9JTlNUX0FBRERfRElfUjJfUjJfUjMpCiAjZGVmaW5lIGF0b21pY19zdWIoaSwgdikgYXRvbWljX2FkZCgtKGkpLCAodikpCiAjZGVmaW5lIGF0b21pY19zdWJfcmV0dXJuKGksIHYpIGF0b21pY19hZGRfcmV0dXJuKC0oaSksICh2KSkKKyNkZWZpbmUgYXRvbWljX2ZldGNoX3N1YihpLCB2KSBhdG9taWNfZmV0Y2hfYWRkKC0oaSksICh2KSkKIAogI3VuZGVmIEFUT01JQ19PUFMKICNkZWZpbmUgQVRPTUlDX09QUyhvcCwgY19vcCwgYXNtX29wKQkJCQkJXApAQCAtMjkyLDYgKzI5NCw3IEBACiAKIEFUT01JQ19PUFMoYW5kLCAmPSwgQ1RPUF9JTlNUX0FBTkRfRElfUjJfUjJfUjMpCiAjZGVmaW5lIGF0b21pY19hbmRub3QobWFzaywgdikgYXRvbWljX2FuZCh+KG1hc2spLCAodikpCisjZGVmaW5lIGF0b21pY19mZXRjaF9hbmRub3QobWFzaywgdikgYXRvbWljX2ZldGNoX2FuZCh+KG1hc2spLCAodikpCiBBVE9NSUNfT1BTKG9yLCB8PSwgQ1RPUF9JTlNUX0FPUl9ESV9SMl9SMl9SMykKIEFUT01JQ19PUFMoeG9yLCBePSwgQ1RPUF9JTlNUX0FYT1JfRElfUjJfUjJfUjMpCiAKQEAgLTM0MywxMCArMzQ2LDI2NiBAQAogCiAjZGVmaW5lIGF0b21pY19hZGRfbmVnYXRpdmUoaSwgdikJKGF0b21pY19hZGRfcmV0dXJuKGksIHYpIDwgMCkKIAotI2RlZmluZSBBVE9NSUNfSU5JVChpKQkJCXsgKGkpIH0KKworI2lmZGVmIENPTkZJR19HRU5FUklDX0FUT01JQzY0CiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdG9taWM2NC5oPgogCi0jZW5kaWYKKyNlbHNlCS8qIEtjb25maWcgZW5zdXJlcyB0aGlzIGlzIG9ubHkgZW5hYmxlZCB3aXRoIG5lZWRlZCBoL3cgYXNzaXN0ICovCisKKy8qCisgKiBBUkN2MiBzdXBwb3J0cyA2NC1iaXQgZXhjbHVzaXZlIGxvYWQgKExMT0NLRCkgLyBzdG9yZSAoU0NPTkREKQorICogIC0gVGhlIGFkZHJlc3MgSEFTIHRvIGJlIDY0LWJpdCBhbGlnbmVkCisgKiAgLSBUaGVyZSBhcmUgMiBzZW1hbnRpY3MgaW52b2x2ZWQgaGVyZToKKyAqICAgID0gZXhjbHVzaXZlIGltcGxpZXMgbm8gaW50ZXJpbSB1cGRhdGUgYmV0d2VlbiBsb2FkL3N0b3JlIHRvIHNhbWUgYWRkcgorICogICAgPSBib3RoIHdvcmRzIGFyZSBvYnNlcnZlZC91cGRhdGVkIHRvZ2V0aGVyOiB0aGlzIGlzIGd1YXJhbnRlZWQgZXZlbgorICogICAgICBmb3IgcmVndWxhciA2NC1iaXQgbG9hZCAoTEREKSAvIHN0b3JlIChTVEQpLiBUaHVzIGF0b21pYzY0X3NldCgpCisgKiAgICAgIGlzIE5PVCByZXF1aXJlZCB0byB1c2UgTExPQ0tEK1NDT05ERCwgU1REIHN1ZmZpY2VzCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWFsaWduZWRfdTY0IGNvdW50ZXI7Cit9IGF0b21pYzY0X3Q7CisKKyNkZWZpbmUgQVRPTUlDNjRfSU5JVChhKSB7IChhKSB9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBsb25nIGF0b21pYzY0X3JlYWQoY29uc3QgYXRvbWljNjRfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJIglsZGQgICAlMCwgWyUxXQlcbiIKKwk6ICI9ciIodmFsKQorCTogInIiKCZ2LT5jb3VudGVyKSk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljNjRfc2V0KGF0b21pYzY0X3QgKnYsIGxvbmcgbG9uZyBhKQoreworCS8qCisJICogVGhpcyBjb3VsZCBoYXZlIGJlZW4gYSBzaW1wbGUgYXNzaWdubWVudCBpbiAiQyIgYnV0IHdvdWxkIG5lZWQKKwkgKiBleHBsaWNpdCB2b2xhdGlsZS4gT3RoZXJ3aXNlIGdjYyBvcHRpbWl6ZXJzIGNvdWxkIGVsaWRlIHRoZSBzdG9yZQorCSAqIHdoaWNoIGJvcmtlZCBhdG9taWM2NCBzZWxmLXRlc3QKKwkgKiBJbiB0aGUgaW5saW5lIGFzbSB2ZXJzaW9uLCBtZW1vcnkgY2xvYmJlciBuZWVkZWQgZm9yIGV4YWN0IHNhbWUKKwkgKiByZWFzb24sIHRvIHRlbGwgZ2NjIGFib3V0IHRoZSBzdG9yZS4KKwkgKgorCSAqIFRoaXMgaG93ZXZlciBpcyBub3QgbmVlZGVkIGZvciBzaWJsaW5nIGF0b21pYzY0X2FkZCgpIGV0YyBzaW5jZSBib3RoCisJICogbG9hZC9zdG9yZSBhcmUgZXhwbGljaXRseSBkb25lIGluIGlubGluZSBhc20uIEFzIGxvbmcgYXMgQVBJIGlzIHVzZWQKKwkgKiBmb3IgZWFjaCBhY2Nlc3MsIGdjYyBoYXMgbm8gd2F5IHRvIG9wdGltaXplIGF3YXkgYW55IGxvYWQvc3RvcmUKKwkgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiCXN0ZCAgICUwLCBbJTFdCVxuIgorCToKKwk6ICJyIihhKSwgInIiKCZ2LT5jb3VudGVyKQorCTogIm1lbW9yeSIpOworfQorCisjZGVmaW5lIEFUT01JQzY0X09QKG9wLCBvcDEsIG9wMikJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWM2NF8jI29wKGxvbmcgbG9uZyBhLCBhdG9taWM2NF90ICp2KQkJXAorewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJIjE6CQkJCVxuIgkJCQlcCisJIglsbG9ja2QgICUwLCBbJTFdCVxuIgkJCQlcCisJIgkiICNvcDEgIiAlTDAsICVMMCwgJUwyCVxuIgkJCQlcCisJIgkiICNvcDIgIiAlSDAsICVIMCwgJUgyCVxuIgkJCQlcCisJIglzY29uZGQgICAlMCwgWyUxXQlcbiIJCQkJXAorCSIJYm56ICAgICAxYgkJXG4iCQkJCVwKKwk6ICI9JnIiKHZhbCkJCQkJCQkJXAorCTogInIiKCZ2LT5jb3VudGVyKSwgImlyIihhKQkJCQkJXAorCTogImNjIik7CQkJCQkJXAorfQkJCQkJCQkJCVwKKworI2RlZmluZSBBVE9NSUM2NF9PUF9SRVRVUk4ob3AsIG9wMSwgb3AyKQkJICAgICAgICAJXAorc3RhdGljIGlubGluZSBsb25nIGxvbmcgYXRvbWljNjRfIyNvcCMjX3JldHVybihsb25nIGxvbmcgYSwgYXRvbWljNjRfdCAqdikJXAorewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlzbXBfbWIoKTsJCQkJCQkJXAorCQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkiMToJCQkJXG4iCQkJCVwKKwkiCWxsb2NrZCAgICUwLCBbJTFdCVxuIgkJCQlcCisJIgkiICNvcDEgIiAlTDAsICVMMCwgJUwyCVxuIgkJCQlcCisJIgkiICNvcDIgIiAlSDAsICVIMCwgJUgyCVxuIgkJCQlcCisJIglzY29uZGQgICAlMCwgWyUxXQlcbiIJCQkJXAorCSIJYm56ICAgICAxYgkJXG4iCQkJCVwKKwk6IFt2YWxdICI9JnIiKHZhbCkJCQkJCQlcCisJOiAiciIoJnYtPmNvdW50ZXIpLCAiaXIiKGEpCQkJCQlcCisJOiAiY2MiKTsJLyogbWVtb3J5IGNsb2JiZXIgY29tZXMgZnJvbSBzbXBfbWIoKSAqLwlcCisJCQkJCQkJCQlcCisJc21wX21iKCk7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gdmFsOwkJCQkJCQlcCit9CisKKyNkZWZpbmUgQVRPTUlDNjRfRkVUQ0hfT1Aob3AsIG9wMSwgb3AyKQkJICAgICAgICAJCVwKK3N0YXRpYyBpbmxpbmUgbG9uZyBsb25nIGF0b21pYzY0X2ZldGNoXyMjb3AobG9uZyBsb25nIGEsIGF0b21pYzY0X3QgKnYpCVwKK3sJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBsb25nIHZhbCwgb3JpZzsJCQkJCVwKKwkJCQkJCQkJCVwKKwlzbXBfbWIoKTsJCQkJCQkJXAorCQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkiMToJCQkJXG4iCQkJCVwKKwkiCWxsb2NrZCAgICUwLCBbJTJdCVxuIgkJCQlcCisJIgkiICNvcDEgIiAlTDEsICVMMCwgJUwzCVxuIgkJCQlcCisJIgkiICNvcDIgIiAlSDEsICVIMCwgJUgzCVxuIgkJCQlcCisJIglzY29uZGQgICAlMSwgWyUyXQlcbiIJCQkJXAorCSIJYm56ICAgICAxYgkJXG4iCQkJCVwKKwk6ICI9JnIiKG9yaWcpLCAiPSZyIih2YWwpCQkJCQlcCisJOiAiciIoJnYtPmNvdW50ZXIpLCAiaXIiKGEpCQkJCQlcCisJOiAiY2MiKTsJLyogbWVtb3J5IGNsb2JiZXIgY29tZXMgZnJvbSBzbXBfbWIoKSAqLwlcCisJCQkJCQkJCQlcCisJc21wX21iKCk7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gb3JpZzsJCQkJCQkJXAorfQorCisjZGVmaW5lIEFUT01JQzY0X09QUyhvcCwgb3AxLCBvcDIpCQkJCQlcCisJQVRPTUlDNjRfT1Aob3AsIG9wMSwgb3AyKQkJCQkJXAorCUFUT01JQzY0X09QX1JFVFVSTihvcCwgb3AxLCBvcDIpCQkJCVwKKwlBVE9NSUM2NF9GRVRDSF9PUChvcCwgb3AxLCBvcDIpCisKKyNkZWZpbmUgYXRvbWljNjRfYW5kbm90IGF0b21pYzY0X2FuZG5vdAorCitBVE9NSUM2NF9PUFMoYWRkLCBhZGQuZiwgYWRjKQorQVRPTUlDNjRfT1BTKHN1Yiwgc3ViLmYsIHNiYykKK0FUT01JQzY0X09QUyhhbmQsIGFuZCwgYW5kKQorQVRPTUlDNjRfT1BTKGFuZG5vdCwgYmljLCBiaWMpCitBVE9NSUM2NF9PUFMob3IsIG9yLCBvcikKK0FUT01JQzY0X09QUyh4b3IsIHhvciwgeG9yKQorCisjdW5kZWYgQVRPTUlDNjRfT1BTCisjdW5kZWYgQVRPTUlDNjRfRkVUQ0hfT1AKKyN1bmRlZiBBVE9NSUM2NF9PUF9SRVRVUk4KKyN1bmRlZiBBVE9NSUM2NF9PUAorCitzdGF0aWMgaW5saW5lIGxvbmcgbG9uZworYXRvbWljNjRfY21weGNoZyhhdG9taWM2NF90ICpwdHIsIGxvbmcgbG9uZyBleHBlY3RlZCwgbG9uZyBsb25nIG5ldykKK3sKKwlsb25nIGxvbmcgcHJldjsKKworCXNtcF9tYigpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJIjE6CWxsb2NrZCAgJTAsIFslMV0JXG4iCisJIglicm5lICAgICVMMCwgJUwyLCAyZglcbiIKKwkiCWJybmUgICAgJUgwLCAlSDIsIDJmCVxuIgorCSIJc2NvbmRkICAlMywgWyUxXQlcbiIKKwkiCWJueiAgICAgMWIJCVxuIgorCSIyOgkJCQlcbiIKKwk6ICI9JnIiKHByZXYpCisJOiAiciIocHRyKSwgImlyIihleHBlY3RlZCksICJyIihuZXcpCisJOiAiY2MiKTsJLyogbWVtb3J5IGNsb2JiZXIgY29tZXMgZnJvbSBzbXBfbWIoKSAqLworCisJc21wX21iKCk7CisKKwlyZXR1cm4gcHJldjsKK30KKworc3RhdGljIGlubGluZSBsb25nIGxvbmcgYXRvbWljNjRfeGNoZyhhdG9taWM2NF90ICpwdHIsIGxvbmcgbG9uZyBuZXcpCit7CisJbG9uZyBsb25nIHByZXY7CisKKwlzbXBfbWIoKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSIxOglsbG9ja2QgICUwLCBbJTFdCVxuIgorCSIJc2NvbmRkICAlMiwgWyUxXQlcbiIKKwkiCWJueiAgICAgMWIJCVxuIgorCSIyOgkJCQlcbiIKKwk6ICI9JnIiKHByZXYpCisJOiAiciIocHRyKSwgInIiKG5ldykKKwk6ICJjYyIpOwkvKiBtZW1vcnkgY2xvYmJlciBjb21lcyBmcm9tIHNtcF9tYigpICovCisKKwlzbXBfbWIoKTsKKworCXJldHVybiBwcmV2OworfQorCisvKioKKyAqIGF0b21pYzY0X2RlY19pZl9wb3NpdGl2ZSAtIGRlY3JlbWVudCBieSAxIGlmIG9sZCB2YWx1ZSBwb3NpdGl2ZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWM2NF90CisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG9sZCB2YWx1ZSBvZiAqdiBtaW51cyAxLCBldmVuIGlmCisgKiB0aGUgYXRvbWljIHZhcmlhYmxlLCB2LCB3YXMgbm90IGRlY3JlbWVudGVkLgorICovCisKK3N0YXRpYyBpbmxpbmUgbG9uZyBsb25nIGF0b21pYzY0X2RlY19pZl9wb3NpdGl2ZShhdG9taWM2NF90ICp2KQoreworCWxvbmcgbG9uZyB2YWw7CisKKwlzbXBfbWIoKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSIxOglsbG9ja2QgICUwLCBbJTFdCVxuIgorCSIJc3ViLmYgICAlTDAsICVMMCwgMQkjIHcwIC0gMSwgc2V0IEMgb24gYm9ycm93XG4iCisJIglzdWIuYyAgICVIMCwgJUgwLCAxCSMgaWYgQyBzZXQsIHcxIC0gMVxuIgorCSIJYnJsdCAgICAlSDAsIDAsIDJmCVxuIgorCSIJc2NvbmRkICAlMCwgWyUxXQlcbiIKKwkiCWJueiAgICAgMWIJCVxuIgorCSIyOgkJCQlcbiIKKwk6ICI9JnIiKHZhbCkKKwk6ICJyIigmdi0+Y291bnRlcikKKwk6ICJjYyIpOwkvKiBtZW1vcnkgY2xvYmJlciBjb21lcyBmcm9tIHNtcF9tYigpICovCisKKwlzbXBfbWIoKTsKKworCXJldHVybiB2YWw7Cit9CisKKy8qKgorICogYXRvbWljNjRfYWRkX3VubGVzcyAtIGFkZCB1bmxlc3MgdGhlIG51bWJlciBpcyBhIGdpdmVuIHZhbHVlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pYzY0X3QKKyAqIEBhOiB0aGUgYW1vdW50IHRvIGFkZCB0byB2Li4uCisgKiBAdTogLi4udW5sZXNzIHYgaXMgZXF1YWwgdG8gdS4KKyAqCisgKiBpZiAodiAhPSB1KSB7IHYgKz0gYTsgcmV0ID0gMX0gZWxzZSB7cmV0ID0gMH0KKyAqIFJldHVybnMgMSBpZmYgQHYgd2FzIG5vdCBAdSAoaS5lLiBpZiBhZGQgYWN0dWFsbHkgaGFwcGVuZWQpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pYzY0X2FkZF91bmxlc3MoYXRvbWljNjRfdCAqdiwgbG9uZyBsb25nIGEsIGxvbmcgbG9uZyB1KQoreworCWxvbmcgbG9uZyB2YWw7CisJaW50IG9wX2RvbmU7CisKKwlzbXBfbWIoKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSIxOglsbG9ja2QgICUwLCBbJTJdCVxuIgorCSIJbW92CSUxLCAxCQlcbiIKKwkiCWJybmUJJUwwLCAlTDQsIDJmCSMgY29udGludWUgdG8gYWRkIHNpbmNlIHYgIT0gdSBcbiIKKwkiCWJyZXEuZAklSDAsICVINCwgM2YJIyByZXR1cm4gc2luY2UgdiA9PSB1IFxuIgorCSIJbW92CSUxLCAwCQlcbiIKKwkiMjoJCQkJXG4iCisJIglhZGQuZiAgICVMMCwgJUwwLCAlTDMJXG4iCisJIglhZGMgICAgICVIMCwgJUgwLCAlSDMJXG4iCisJIglzY29uZGQgICUwLCBbJTJdCVxuIgorCSIJYm56ICAgICAxYgkJXG4iCisJIjM6CQkJCVxuIgorCTogIj0mciIodmFsKSwgIj0mciIgKG9wX2RvbmUpCisJOiAiciIoJnYtPmNvdW50ZXIpLCAiciIoYSksICJyIih1KQorCTogImNjIik7CS8qIG1lbW9yeSBjbG9iYmVyIGNvbWVzIGZyb20gc21wX21iKCkgKi8KKworCXNtcF9tYigpOworCisJcmV0dXJuIG9wX2RvbmU7Cit9CisKKyNkZWZpbmUgYXRvbWljNjRfYWRkX25lZ2F0aXZlKGEsIHYpCShhdG9taWM2NF9hZGRfcmV0dXJuKChhKSwgKHYpKSA8IDApCisjZGVmaW5lIGF0b21pYzY0X2luYyh2KQkJCWF0b21pYzY0X2FkZCgxTEwsICh2KSkKKyNkZWZpbmUgYXRvbWljNjRfaW5jX3JldHVybih2KQkJYXRvbWljNjRfYWRkX3JldHVybigxTEwsICh2KSkKKyNkZWZpbmUgYXRvbWljNjRfaW5jX2FuZF90ZXN0KHYpCShhdG9taWM2NF9pbmNfcmV0dXJuKHYpID09IDApCisjZGVmaW5lIGF0b21pYzY0X3N1Yl9hbmRfdGVzdChhLCB2KQkoYXRvbWljNjRfc3ViX3JldHVybigoYSksICh2KSkgPT0gMCkKKyNkZWZpbmUgYXRvbWljNjRfZGVjKHYpCQkJYXRvbWljNjRfc3ViKDFMTCwgKHYpKQorI2RlZmluZSBhdG9taWM2NF9kZWNfcmV0dXJuKHYpCQlhdG9taWM2NF9zdWJfcmV0dXJuKDFMTCwgKHYpKQorI2RlZmluZSBhdG9taWM2NF9kZWNfYW5kX3Rlc3QodikJKGF0b21pYzY0X2RlY19yZXR1cm4oKHYpKSA9PSAwKQorI2RlZmluZSBhdG9taWM2NF9pbmNfbm90X3plcm8odikJYXRvbWljNjRfYWRkX3VubGVzcygodiksIDFMTCwgMExMKQorCisjZW5kaWYJLyogIUNPTkZJR19HRU5FUklDX0FUT01JQzY0ICovCisKKyNlbmRpZgkvKiAhX19BU1NFTUJMWV9fICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vY2FjaGUuaCBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2NhY2hlLmgKaW5kZXggMjM3MDZjNi4uZmI3ODFlMyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vY2FjaGUuaAorKysgYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9jYWNoZS5oCkBAIC01NCw3ICs1NCw3IEBACiBleHRlcm4gdm9pZCByZWFkX2RlY29kZV9jYWNoZV9iY3Iodm9pZCk7CiAKIGV4dGVybiBpbnQgaW9jX2V4aXN0czsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHBlcmlwX2Jhc2U7CitleHRlcm4gdW5zaWduZWQgbG9uZyBwZXJpcF9iYXNlLCBwZXJpcF9lbmQ7CiAKICNlbmRpZgkvKiAhX19BU1NFTUJMWV9fICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2R3YXJmLmggYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9kd2FyZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiN2JkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9kd2FyZi5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYtMTcgU3lub3BzeXMsIEluYy4gKHd3dy5zeW5vcHN5cy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9BU01fQVJDX0RXQVJGX0gKKyNkZWZpbmUgX0FTTV9BUkNfRFdBUkZfSAorCisjaWZkZWYgX19BU1NFTUJMWV9fCisKKyNpZmRlZiBBUkNfRFcyX1VOV0lORF9BU19DRkkKKworI2RlZmluZSBDRklfU1RBUlRQUk9DCS5jZmlfc3RhcnRwcm9jCisjZGVmaW5lIENGSV9FTkRQUk9DCS5jZmlfZW5kcHJvYworI2RlZmluZSBDRklfREVGX0NGQQkuY2ZpX2RlZl9jZmEKKyNkZWZpbmUgQ0ZJX1JFR0lTVEVSCS5jZmlfcmVnaXN0ZXIKKyNkZWZpbmUgQ0ZJX1JFTF9PRkZTRVQJLmNmaV9yZWxfb2Zmc2V0CisjZGVmaW5lIENGSV9VTkRFRklORUQJLmNmaV91bmRlZmluZWQKKworI2Vsc2UKKworI2RlZmluZSBDRklfSUdOT1JFCSMKKworI2RlZmluZSBDRklfU1RBUlRQUk9DCUNGSV9JR05PUkUKKyNkZWZpbmUgQ0ZJX0VORFBST0MJQ0ZJX0lHTk9SRQorI2RlZmluZSBDRklfREVGX0NGQQlDRklfSUdOT1JFCisjZGVmaW5lIENGSV9SRUdJU1RFUglDRklfSUdOT1JFCisjZGVmaW5lIENGSV9SRUxfT0ZGU0VUCUNGSV9JR05PUkUKKyNkZWZpbmUgQ0ZJX1VOREVGSU5FRAlDRklfSUdOT1JFCisKKyNlbmRpZgkvKiAhQVJDX0RXMl9VTldJTkRfQVNfQ0ZJICovCisKKyNlbmRpZgkvKiBfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmCS8qIF9BU01fQVJDX0RXQVJGX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2VsZi5oIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vZWxmLmgKaW5kZXggNTFhOTllMi4uNzA5NmY5NyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vZWxmLmgKQEAgLTIzLDggKzIzLDcgQEAKIC8qIEFSQyBSZWxvY2F0aW9ucyAoa2VybmVsIE1vZHVsZXMgb25seSkgKi8KICNkZWZpbmUgIFJfQVJDXzMyCQkweDQKICNkZWZpbmUgIFJfQVJDXzMyX01FCQkweDFCCi0jZGVmaW5lICBSX0FSQ19TMjVIX1BDUkVMCTB4MTAKLSNkZWZpbmUgIFJfQVJDX1MyNVdfUENSRUwJMHgxMQorI2RlZmluZSAgUl9BUkNfMzJfUENSRUwJCTB4MzEKIAogLyp0byBzZXQgcGFyYW1ldGVycyBpbiB0aGUgY29yZSBkdW1wcyAqLwogI2RlZmluZSBFTEZfQVJDSAkJRU1fQVJDT01QQUNUCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9lbnRyeS5oIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vZW50cnkuaAppbmRleCBhZDc4NjBjLi41MTU5N2YzIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9lbnRyeS5oCisrKyBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2VudHJ5LmgKQEAgLTE0Miw3ICsxNDIsNyBAQAogCiAjaWZkZWYgQ09ORklHX0FSQ19DVVJSX0lOX1JFRwogCTsgUmV0cmlldmUgb3JpZyByMjUgYW5kIHNhdmUgaXQgd2l0aCByZXN0IG9mIGNhbGxlZV9yZWdzCi0JbGQuYXMgICByMTIsIFtyMTIsIFBUX3VzZXJfcjI1XQorCWxkCXIxMiwgW3IxMiwgUFRfdXNlcl9yMjVdCiAJUFVTSAlyMTIKICNlbHNlCiAJUFVTSAlyMjUKQEAgLTE5OCw3ICsxOTgsNyBAQAogCiAJOyBTUCBpcyBiYWNrIHRvIHN0YXJ0IG9mIHB0X3JlZ3MKICNpZmRlZiBDT05GSUdfQVJDX0NVUlJfSU5fUkVHCi0Jc3QuYXMgICByMTIsIFtzcCwgUFRfdXNlcl9yMjVdCisJc3QJcjEyLCBbc3AsIFBUX3VzZXJfcjI1XQogI2VuZGlmCiAuZW5kbQogCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9pcnFmbGFncy1hcmN2Mi5oIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3MtYXJjdjIuaAppbmRleCBkMWVjN2Y2Li5lODgwZGZhIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9pcnFmbGFncy1hcmN2Mi5oCisrKyBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2lycWZsYWdzLWFyY3YyLmgKQEAgLTExMiw3ICsxMTIsNyBAQAogCSAqLwogCXRlbXAgPSAoMSA8PCA1KSB8CiAJCSgoISEodGVtcCAmIFNUQVRVU19JRV9NQVNLKSkgPDwgQ0xSSV9TVEFUVVNfSUVfQklUKSB8Ci0JCSh0ZW1wICYgQ0xSSV9TVEFUVVNfRV9NQVNLKTsKKwkJKCh0ZW1wID4+IDEpICYgQ0xSSV9TVEFUVVNfRV9NQVNLKTsKIAlyZXR1cm4gdGVtcDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3MtY29tcGFjdC5oIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3MtY29tcGFjdC5oCmluZGV4IGMxZDM2NDUuLjRjNmVlZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2lycWZsYWdzLWNvbXBhY3QuaAorKysgYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9pcnFmbGFncy1jb21wYWN0LmgKQEAgLTE4OCwxMCArMTg4LDEwIEBACiAuZW5kbQogCiAubWFjcm8gSVJRX0VOQUJMRSAgc2NyYXRjaAorCVRSQUNFX0FTTV9JUlFfRU5BQkxFCiAJbHIJXHNjcmF0Y2gsIFtzdGF0dXMzMl0KIAlvcglcc2NyYXRjaCwgXHNjcmF0Y2gsIChTVEFUVVNfRTFfTUFTSyB8IFNUQVRVU19FMl9NQVNLKQogCWZsYWcJXHNjcmF0Y2gKLQlUUkFDRV9BU01fSVJRX0VOQUJMRQogLmVuZG0KIAogI2VuZGlmCS8qIF9fQVNTRU1CTFlfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vbGlua2FnZS5oIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vbGlua2FnZS5oCmluZGV4IDVmYWFkMTcuLmIyOWYxYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2xpbmthZ2UuaAorKysgYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9saW5rYWdlLmgKQEAgLTksNiArOSw4IEBACiAjaWZuZGVmIF9fQVNNX0xJTktBR0VfSAogI2RlZmluZSBfX0FTTV9MSU5LQUdFX0gKIAorI2luY2x1ZGUgPGFzbS9kd2FyZi5oPgorCiAjaWZkZWYgX19BU1NFTUJMWV9fCiAKICNkZWZpbmUgQVNNX05MCQkgYAkvKiB1c2UgJ2AnIHRvIG1hcmsgbmV3IGxpbmUgaW4gbWFjcm8gKi8KQEAgLTMyLDYgKzM0LDE2IEBACiAjZW5kaWYKIC5lbmRtCiAKKyNkZWZpbmUgRU5UUllfQ0ZJKG5hbWUpCQlcCisJLmdsb2JsIG5hbWUgQVNNX05MCVwKKwlBTElHTiBBU01fTkwgCQlcCisJbmFtZTogQVNNX05MCQlcCisJQ0ZJX1NUQVJUUFJPQyBBU01fTkwKKworI2RlZmluZSBFTkRfQ0ZJKG5hbWUpIAkJXAorCUNGSV9FTkRQUk9DIEFTTV9OTAlcCisJLnNpemUgbmFtZSwgLi1uYW1lCisKICNlbHNlCS8qICFfX0FTU0VNQkxZX18gKi8KIAogI2lmZGVmIENPTkZJR19BUkNfSEFTX0lDQ00KZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaCBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaAppbmRleCA1ZjA3MTc2Li45MTg1NTQxIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmgKKysrIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vcGVyZl9ldmVudC5oCkBAIC0xMTgsNiArMTE4LDkgQEAKIAlbUEVSRl9DT1VOVF9BUkNfSUNNXSA9ICJpY20iLAkJLyogSS1jYWNoZSBNaXNzICovCiAJW1BFUkZfQ09VTlRfQVJDX0VEVExCXSA9ICJlZHRsYiIsCS8qIEQtVExCIE1pc3MgKi8KIAlbUEVSRl9DT1VOVF9BUkNfRUlUTEJdID0gImVpdGxiIiwJLyogSS1UTEIgTWlzcyAqLworCisJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFU10gPSAiaW1lbXJkYyIsCS8qIEluc3RyOiBtZW0gcmVhZCBjYWNoZWQgKi8KKwlbUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVNdID0gImRjbG0iLAkJLyogRC1jYWNoZSBMb2FkIE1pc3MgKi8KIH07CiAKICNkZWZpbmUgQyhfeCkJCQlQRVJGX0NPVU5UX0hXX0NBQ0hFXyMjX3gKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCAwZjkyZDk3Li44OWVlYjM3IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKKysrIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC0yODAsNyArMjgwLDcgQEAKIAogI2RlZmluZSBwdGVfcGFnZShwdGUpCQlwZm5fdG9fcGFnZShwdGVfcGZuKHB0ZSkpCiAjZGVmaW5lIG1rX3B0ZShwYWdlLCBwcm90KQlwZm5fcHRlKHBhZ2VfdG9fcGZuKHBhZ2UpLCBwcm90KQotI2RlZmluZSBwZm5fcHRlKHBmbiwgcHJvdCkJKF9fcHRlKCgocHRlX3QpKHBmbikgPDwgUEFHRV9TSElGVCkgfCBwZ3Byb3RfdmFsKHByb3QpKSkKKyNkZWZpbmUgcGZuX3B0ZShwZm4sIHByb3QpCV9fcHRlKCgocGZuKSA8PCBQQUdFX1NISUZUKSB8IHBncHJvdF92YWwocHJvdCkpCiAKIC8qIERvbid0IHVzZSB2aXJ0X3RvX3BmbiBmb3IgbWFjcm9zIGJlbG93OiBjb3VsZCBjYXVzZSB0cnVuY2F0aW9ucyBmb3IgUEFFNDAqLwogI2RlZmluZSBwdGVfcGZuKHB0ZSkJCShwdGVfdmFsKHB0ZSkgPj4gUEFHRV9TSElGVCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCBhNzhkNTY3Li40MWZhZjE3IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC04Myw3ICs4MywxMCBAQAogCSIyOgk7bm9wXG4iCQkJCVwKIAkiCS5zZWN0aW9uIC5maXh1cCwgXCJheFwiXG4iCVwKIAkiCS5hbGlnbiA0XG4iCQkJXAotCSIzOgltb3YgJTAsICUzXG4iCQkJXAorCSIzOgkjIHJldHVybiAtRUZBVUxUXG4iCQlcCisJIgltb3YgJTAsICUzXG4iCQkJXAorCSIJIyB6ZXJvIG91dCBkc3QgcHRyXG4iCQlcCisJIgltb3YgJTEsICAwXG4iCQkJXAogCSIJaiAgIDJiXG4iCQkJXAogCSIJLnByZXZpb3VzXG4iCQkJXAogCSIJLnNlY3Rpb24gX19leF90YWJsZSwgXCJhXCJcbiIJXApAQCAtMTAxLDcgKzEwNCwxMSBAQAogCSIyOgk7bm9wXG4iCQkJCVwKIAkiCS5zZWN0aW9uIC5maXh1cCwgXCJheFwiXG4iCVwKIAkiCS5hbGlnbiA0XG4iCQkJXAotCSIzOgltb3YgJTAsICUzXG4iCQkJXAorCSIzOgkjIHJldHVybiAtRUZBVUxUXG4iCQlcCisJIgltb3YgJTAsICUzXG4iCQkJXAorCSIJIyB6ZXJvIG91dCBkc3QgcHRyXG4iCQlcCisJIgltb3YgJTEsICAwXG4iCQkJXAorCSIJbW92ICVSMSwgMFxuIgkJCVwKIAkiCWogICAyYlxuIgkJCVwKIAkiCS5wcmV2aW91c1xuIgkJCVwKIAkiCS5zZWN0aW9uIF9fZXhfdGFibGUsIFwiYVwiXG4iCVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvdWFwaS9hc20vZWxmLmggYi9hcmNoL2FyYy9pbmNsdWRlL3VhcGkvYXNtL2VsZi5oCmluZGV4IDBmOTlhYzguLjAwMzdhNTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2luY2x1ZGUvdWFwaS9hc20vZWxmLmgKKysrIGIvYXJjaC9hcmMvaW5jbHVkZS91YXBpL2FzbS9lbGYuaApAQCAtMTMsOCArMTMsMTUgQEAKIAogLyogTWFjaGluZSBzcGVjaWZpYyBFTEYgSGRyIGZsYWdzICovCiAjZGVmaW5lIEVGX0FSQ19PU0FCSV9NU0sJMHgwMDAwMGYwMAotI2RlZmluZSBFRl9BUkNfT1NBQklfT1JJRwkweDAwMDAwMDAwICAgLyogTVVTVCBiZSB6ZXJvIGZvciBiYWNrLWNvbXBhdCAqLwotI2RlZmluZSBFRl9BUkNfT1NBQklfQ1VSUkVOVAkweDAwMDAwMzAwICAgLyogdjMgKG5vIGxlZ2FjeSBzeXNjYWxscykgKi8KKworI2RlZmluZSBFRl9BUkNfT1NBQklfVjMJCTB4MDAwMDAzMDAgICAvKiB2MyAobm8gbGVnYWN5IHN5c2NhbGxzKSAqLworI2RlZmluZSBFRl9BUkNfT1NBQklfVjQJCTB4MDAwMDA0MDAgICAvKiB2NCAoNjRiaXQgZGF0YSBhbnkgcmVnIGFsaWduKSAqLworCisjaWYgX19HTlVDX18gPCA2CisjZGVmaW5lIEVGX0FSQ19PU0FCSV9DVVJSRU5UCUVGX0FSQ19PU0FCSV9WMworI2Vsc2UKKyNkZWZpbmUgRUZfQVJDX09TQUJJX0NVUlJFTlQJRUZfQVJDX09TQUJJX1Y0CisjZW5kaWYKIAogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGVsZl9ncmVnX3Q7CiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZWxmX2ZwcmVnc2V0X3Q7CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9rZXJuZWwvYXJja3N5bXMuYyBiL2FyY2gvYXJjL2tlcm5lbC9hcmNrc3ltcy5jCmluZGV4IDRkOWU3NzcuLjAwMGRkMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2tlcm5lbC9hcmNrc3ltcy5jCisrKyBiL2FyY2gvYXJjL2tlcm5lbC9hcmNrc3ltcy5jCkBAIC0yOCw2ICsyOCw3IEBACiBleHRlcm4gdm9pZCBfX2RpdmRmMyh2b2lkKTsKIGV4dGVybiB2b2lkIF9fZmxvYXR1bnNpZGYodm9pZCk7CiBleHRlcm4gdm9pZCBfX2Zsb2F0dW5zaXNmKHZvaWQpOworZXh0ZXJuIHZvaWQgX191ZGl2ZGkzKHZvaWQpOwogCiBFWFBPUlRfU1lNQk9MKF9fYXNobGRpMyk7CiBFWFBPUlRfU1lNQk9MKF9fYXNocmRpMyk7CkBAIC00NSw2ICs0Niw3IEBACiBFWFBPUlRfU1lNQk9MKF9fZGl2ZGYzKTsKIEVYUE9SVF9TWU1CT0woX19mbG9hdHVuc2lkZik7CiBFWFBPUlRfU1lNQk9MKF9fZmxvYXR1bnNpc2YpOworRVhQT1JUX1NZTUJPTChfX3VkaXZkaTMpOwogCiAvKiBBUkMgb3B0aW1pc2VkIGFzc2VtYmxlciByb3V0aW5lcyAqLwogRVhQT1JUX1NZTUJPTChtZW1zZXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMva2VybmVsL2N0eF9zd19hc20uUyBiL2FyY2gvYXJjL2tlcm5lbC9jdHhfc3dfYXNtLlMKaW5kZXggZTY4OTBiMS4uN2MxZjM2NSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMva2VybmVsL2N0eF9zd19hc20uUworKysgYi9hcmNoL2FyYy9rZXJuZWwvY3R4X3N3X2FzbS5TCkBAIC0yMyw2ICsyMyw3IEBACiAJLmdsb2JhbCBfX3N3aXRjaF90bwogCS50eXBlICAgX19zd2l0Y2hfdG8sIEBmdW5jdGlvbgogX19zd2l0Y2hfdG86CisJQ0ZJX1NUQVJUUFJPQwogCiAJLyogU2F2ZSByZWdzIG9uIGtlcm5lbCBtb2RlIHN0YWNrIG9mIHRhc2sgKi8KIAlzdC5hICAgIGJsaW5rLCBbc3AsIC00XQpAQCAtNTksNCArNjAsNCBAQAogCWxkLmFiICAgYmxpbmssIFtzcCwgNF0KIAlqICAgICAgIFtibGlua10KIAotRU5EKF9fc3dpdGNoX3RvKQorRU5EX0NGSShfX3N3aXRjaF90bykKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9hcmMva2VybmVsL2VudHJ5LlMKaW5kZXggMmVmYjA2MjUuLjFlZWE5OWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvYXJjL2tlcm5lbC9lbnRyeS5TCkBAIC0zNSw3ICszNSw3IEBACiAJYnRzdCByMTAsIFRJRl9TWVNDQUxMX1RSQUNFCiAJYm56ICB0cmFjZXN5c19leGl0CiAKLQliIHJldF9mcm9tX3N5c3RlbV9jYWxsCisJYiAuTHJldF9mcm9tX3N5c3RlbV9jYWxsCiBFTkQoc3lzX2Nsb25lX3dyYXBwZXIpCiAKIEVOVFJZKHJldF9mcm9tX2ZvcmspCkBAIC02MSwxOCArNjEsNiBAQAogCWIgICAgcmV0X2Zyb21fZXhjZXB0aW9uCiBFTkQocmV0X2Zyb21fZm9yaykKIAotI2lmZGVmIENPTkZJR19BUkNfRFcyX1VOV0lORAotOyBXb3JrYXJvdW5kIGZvciBidWcgOTQxNzkgKFNUQVIgKToKLTsgRGVzcGl0ZSAtZmFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzLCBsaW5rZXIgaXMgbm90IG1ha2luZyBkd2FyZjIgdW53aW5kZXIKLTsgc2VjdGlvbiAoLmRlYnVnX2ZyYW1lKSBhcyBsb2FkYWJsZS4gU28gd2UgZm9yY2UgaXQgaGVyZS4KLTsgVGhpcyBhbHNvIGZpeGVzIFNUQVIgOTAwMDQ4NzkzMyB3aGVyZSB0aGUgcHJldi13b3JrYXJvdW5kIChvYmpjb3B5IC0tc2V0ZmxhZykKLTsgd291bGQgbm90IHdvcmsgYWZ0ZXIgYSBjbGVhbiBidWlsZCBkdWUgdG8ga2VybmVsIGJ1aWxkIHN5c3RlbSBkZXBlbmRlbmNpZXMuCi0uc2VjdGlvbiAuZGVidWdfZnJhbWUsICJ3YSIsQHByb2diaXRzCi0KLTsgUmVzZXQgdG8gLnRleHQgYXMgdGhpcyBmaWxlIGlzIGluY2x1ZGVkIGluIGVudHJ5LTxpc2E+LlMKLS5zZWN0aW9uIC50ZXh0LCAiYXgiLEBwcm9nYml0cwotI2VuZGlmCi0KIDsjIyMjIyMjIyMjIyMjIyMjIyMjIE5vbiBUTEIgRXhjZXB0aW9uIEhhbmRsaW5nICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yNjAsMjAgKzI0OCwxOCBAQAogCTsgc3lzY2FsbCBudW0gc2hkIG5vdCBleGNlZWQgdGhlIHRvdGFsIHN5c3RlbSBjYWxscyBhdmFpbAogCWNtcCAgICAgcjgsICBOUl9zeXNjYWxscwogCW1vdi5oaSAgcjAsIC1FTk9TWVMKLQliaGkgICAgIHJldF9mcm9tX3N5c3RlbV9jYWxsCisJYmhpICAgICAuTHJldF9mcm9tX3N5c3RlbV9jYWxsCiAKIAk7IE9mZnNldCBpbnRvIHRoZSBzeXNjYWxsX3RhYmxlIGFuZCBjYWxsIGhhbmRsZXIKIAlsZC5hcyAgIHI5LFtzeXNfY2FsbF90YWJsZSwgcjhdCiAJamwgICAgICBbcjldICAgICAgICA7IEVudHJ5IGludG8gU3lzIENhbGwgSGFuZGxlcgogCi0JOyBmYWxsIHRocm91Z2ggdG8gcmV0X2Zyb21fc3lzdGVtX2NhbGwKLUVORChFVl9UcmFwKQotCi1FTlRSWShyZXRfZnJvbV9zeXN0ZW1fY2FsbCkKKy5McmV0X2Zyb21fc3lzdGVtX2NhbGw6CiAKIAlzdCAgcjAsIFtzcCwgUFRfcjBdICAgICA7IHN5cyBjYWxsIHJldHVybiB2YWx1ZSBpbiBwdF9yZWdzCiAKLQk7IGZhbGwgdGhyb3VnaCB5ZXQgYWdhaW4gdG8gcmV0X2Zyb21fZXhjZXB0aW9uCisJOyBmYWxsIHRocm91Z2ggdG8gcmV0X2Zyb21fZXhjZXB0aW9uCitFTkQoRVZfVHJhcCkKIAogOyMjIyMjIyMjIyMjIyMgUmV0dXJuIGZyb20gSW50ci9FeGNwL1RyYXAgKExpbnV4IFNwZWNpZmljcykgIyMjIyMjIyMjIyMjIyMKIDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2tlcm5lbC9pbnRjLWFyY3YyLmMgYi9hcmNoL2FyYy9rZXJuZWwvaW50Yy1hcmN2Mi5jCmluZGV4IDZjMjRmYWYuLjYyYjU5NDA5IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9rZXJuZWwvaW50Yy1hcmN2Mi5jCisrKyBiL2FyY2gvYXJjL2tlcm5lbC9pbnRjLWFyY3YyLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAl0bXAgPSByZWFkX2F1eF9yZWcoMHhhKTsKIAl0bXAgfD0gU1RBVFVTX0FEX01BU0sgfCAoaXJxX3ByaW8gPDwgMSk7CiAJdG1wICY9IH5TVEFUVVNfSUVfTUFTSzsKLQlhc20gdm9sYXRpbGUoImZsYWcgJTAJXG4iOjoiciIodG1wKSk7CisJYXNtIHZvbGF0aWxlKCJrZmxhZyAlMAlcbiI6OiJyIih0bXApKTsKIH0KIAogc3RhdGljIHZvaWQgYXJjdjJfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMva2VybmVsL21vZHVsZS5jIGIvYXJjaC9hcmMva2VybmVsL21vZHVsZS5jCmluZGV4IDM3NmUwNDYuLjlhMjg0OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL2FyYy9rZXJuZWwvbW9kdWxlLmMKQEAgLTIyLDEzICsyMiw5IEBACiAJKihhZGRyICsgMSkgPSAodmFsdWUgJiAweGZmZmYpOwogfQogCi0vKiBBUkMgc3BlY2lmaWMgc2VjdGlvbiBxdWlya3MgLSBiZWZvcmUgcmVsb2NhdGlvbiBsb29wIGluIGdlbmVyaWMgbG9hZGVyCi0gKgotICogRm9yIGR3YXJmIHVud2luZGluZyBvdXQgb2YgbW9kdWxlcywgdGhpcyBuZWVkcyB0bwotICogMS4gRW5zdXJlIHRoZSAuZGVidWdfZnJhbWUgaXMgYWxsb2NhdGFibGUgKEFSQyBMaW5rZXIgYnVnOiBkZXNwaXRlCi0gKiAgICAtZmFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIGl0IGRvZXNuJ3QpLgotICogMi4gU2luY2Ugd2UgYXJlIGl0ZXJhdGluZyB0aHJ1IHNlYyBoZHIgdGJsIGFueXdheXMsIG1ha2UgYSBub3RlIG9mCi0gKiAgICB0aGUgZXhhY3Qgc2VjdGlvbiBpbmRleCwgZm9yIGxhdGVyIHVzZS4KKy8qCisgKiBUaGlzIGdldHMgY2FsbGVkIGJlZm9yZSByZWxvY2F0aW9uIGxvb3AgaW4gZ2VuZXJpYyBsb2FkZXIKKyAqIE1ha2UgYSBub3RlIG9mIHRoZSBzZWN0aW9uIGluZGV4IG9mIHVud2luZGluZyBzZWN0aW9uCiAgKi8KIGludCBtb2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zKEVsZl9FaGRyICpoZHIsIEVsZl9TaGRyICpzZWNoZHJzLAogCQkJICAgICAgY2hhciAqc2Vjc3RyLCBzdHJ1Y3QgbW9kdWxlICptb2QpCkBAIC00MCw4ICszNiw3IEBACiAJbW9kLT5hcmNoLnVud19pbmZvID0gTlVMTDsKIAogCWZvciAoaSA9IDE7IGkgPCBoZHItPmVfc2hudW07IGkrKykgewotCQlpZiAoc3RyY21wKHNlY3N0citzZWNoZHJzW2ldLnNoX25hbWUsICIuZGVidWdfZnJhbWUiKSA9PSAwKSB7Ci0JCQlzZWNoZHJzW2ldLnNoX2ZsYWdzIHw9IFNIRl9BTExPQzsKKwkJaWYgKHN0cmNtcChzZWNzdHIrc2VjaGRyc1tpXS5zaF9uYW1lLCAiLmVoX2ZyYW1lIikgPT0gMCkgewogCQkJbW9kLT5hcmNoLnVud19zZWNfaWR4ID0gaTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xMDYsMTAgKzEwMSwxMiBAQAogCQkgKi8KIAkJcmVsb190eXBlID0gRUxGMzJfUl9UWVBFKHJlbF9lbnRyeVtpXS5yX2luZm8pOwogCi0JCWlmIChsaWtlbHkoUl9BUkNfMzJfTUUgPT0gcmVsb190eXBlKSkKKwkJaWYgKGxpa2VseShSX0FSQ18zMl9NRSA9PSByZWxvX3R5cGUpKQkvKiBNRSAoIFMgKyBBICkgKi8KIAkJCWFyY193cml0ZV9tZSgodW5zaWduZWQgc2hvcnQgKilsb2NhdGlvbiwgcmVsb2NhdGlvbik7Ci0JCWVsc2UgaWYgKFJfQVJDXzMyID09IHJlbG9fdHlwZSkKKwkJZWxzZSBpZiAoUl9BUkNfMzIgPT0gcmVsb190eXBlKQkJLyogKCBTICsgQSApICovCiAJCQkqKChFbGYzMl9BZGRyICopIGxvY2F0aW9uKSA9IHJlbG9jYXRpb247CisJCWVsc2UgaWYgKFJfQVJDXzMyX1BDUkVMID09IHJlbG9fdHlwZSkJLyogKCBTICsgQSApIC0gUERBVEEgKSAqLworCQkJKigoRWxmMzJfQWRkciAqKSBsb2NhdGlvbikgPSByZWxvY2F0aW9uIC0gbG9jYXRpb247CiAJCWVsc2UKIAkJCWdvdG8gcmVsb19lcnI7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9hcmNoL2FyYy9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IDA4ZjAzZDkuLjJjZTI0ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9hcmMva2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtMTc5LDggKzE3OSw4IEBACiAJCWlmIChhcmNfcG11LT5ldl9od19pZHhbZXZlbnQtPmF0dHIuY29uZmlnXSA8IDApCiAJCQlyZXR1cm4gLUVOT0VOVDsKIAkJaHdjLT5jb25maWcgfD0gYXJjX3BtdS0+ZXZfaHdfaWR4W2V2ZW50LT5hdHRyLmNvbmZpZ107Ci0JCXByX2RlYnVnKCJpbml0IGV2ZW50ICVkIHdpdGggaC93ICVkIFwnJXNcJ1xuIiwKLQkJCSAoaW50KSBldmVudC0+YXR0ci5jb25maWcsIChpbnQpIGh3Yy0+Y29uZmlnLAorCQlwcl9kZWJ1ZygiaW5pdCBldmVudCAlZCB3aXRoIGgvdyAlMDh4IFwnJXNcJ1xuIiwKKwkJCSAoaW50KWV2ZW50LT5hdHRyLmNvbmZpZywgKGludClod2MtPmNvbmZpZywKIAkJCSBhcmNfcG11X2V2X2h3X21hcFtldmVudC0+YXR0ci5jb25maWddKTsKIAkJcmV0dXJuIDA7CiAKQEAgLTE4OSw2ICsxODksOCBAQAogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJCWh3Yy0+Y29uZmlnIHw9IGFyY19wbXUtPmV2X2h3X2lkeFtyZXRdOworCQlwcl9kZWJ1ZygiaW5pdCBjYWNoZSBldmVudCB3aXRoIGgvdyAlMDh4IFwnJXNcJ1xuIiwKKwkJCSAoaW50KWh3Yy0+Y29uZmlnLCBhcmNfcG11X2V2X2h3X21hcFtyZXRdKTsKIAkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9FTlQ7CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9hcmMva2VybmVsL3Byb2Nlc3MuYwppbmRleCBiNWRiOWU3Li5iZTE5NzJiIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYXJjL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE5OSw3ICsxOTksNyBAQAogCX0KIAogCWVmbGFncyA9IHgtPmVfZmxhZ3M7Ci0JaWYgKChlZmxhZ3MgJiBFRl9BUkNfT1NBQklfTVNLKSA8IEVGX0FSQ19PU0FCSV9DVVJSRU5UKSB7CisJaWYgKChlZmxhZ3MgJiBFRl9BUkNfT1NBQklfTVNLKSAhPSBFRl9BUkNfT1NBQklfQ1VSUkVOVCkgewogCQlwcl9lcnIoIkFCSSBtaXNtYXRjaCAtIHlvdSBuZWVkIG5ld2VyIHRvb2xjaGFpblxuIik7CiAJCWZvcmNlX3NpZ3NlZ3YoU0lHU0VHViwgY3VycmVudCk7CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMva2VybmVsL3NldHVwLmMgYi9hcmNoL2FyYy9rZXJuZWwvc2V0dXAuYwppbmRleCBhOTQ2NDAwLi4zZGY3ZjljIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2FyYy9rZXJuZWwvc2V0dXAuYwpAQCAtMTcxLDYgKzE3MSw3IEBACiAjZWxzZQogCXsgezB4NTAsICJBUkMgSFMzOCBSMi4wIn0sIDB4NTF9LAogCXsgezB4NTIsICJBUkMgSFMzOCBSMi4xIn0sIDB4NTJ9LAorCXsgezB4NTMsICJBUkMgSFMzOCBSMy4wIn0sIDB4NTN9LAogI2VuZGlmCiAJeyB7MHgwMCwgTlVMTAkJfSB9CiB9OwpAQCAtMjcyLDggKzI3Myw4IEBACiAJRklYX1BUUihjcHUpOwogCiAJbiArPSBzY25wcmludGYoYnVmICsgbiwgbGVuIC0gbiwKLQkJICAgICAgICJWZWN0b3IgVGFibGVcdDogJSN4XG5VbmNhY2hlZCBCYXNlXHQ6ICUjbHhcbiIsCi0JCSAgICAgICBjcHUtPnZlY19iYXNlLCBwZXJpcF9iYXNlKTsKKwkJICAgICAgICJWZWN0b3IgVGFibGVcdDogJSN4XG5QZXJpcGhlcmFsc1x0OiAlI2x4OiUjbHhcbiIsCisJCSAgICAgICBjcHUtPnZlY19iYXNlLCBwZXJpcF9iYXNlLCBwZXJpcF9lbmQpOwogCiAJaWYgKGNwdS0+ZXh0bi5mcHVfc3AgfHwgY3B1LT5leHRuLmZwdV9kcCkKIAkJbiArPSBzY25wcmludGYoYnVmICsgbiwgbGVuIC0gbiwgIkZQVVx0XHQ6ICVzJXNcbiIsCkBAIC0yOTEsOCArMjkyLDEwIEBACiAJCQkgICAgICAgY3B1LT5kY2NtLmJhc2VfYWRkciwgVE9fS0IoY3B1LT5kY2NtLnN6KSwKIAkJCSAgICAgICBjcHUtPmljY20uYmFzZV9hZGRyLCBUT19LQihjcHUtPmljY20uc3opKTsKIAotCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIGxlbiAtIG4sCi0JCSAgICAgICAiT1MgQUJJIFt2M11cdDogbm8tbGVnYWN5LXN5c2NhbGxzXG4iKTsKKwluICs9IHNjbnByaW50ZihidWYgKyBuLCBsZW4gLSBuLCAiT1MgQUJJIFt2JWRdXHQ6ICVzXG4iLAorCQkJRUZfQVJDX09TQUJJX0NVUlJFTlQgPj4gOCwKKwkJCUVGX0FSQ19PU0FCSV9DVVJSRU5UID09IEVGX0FSQ19PU0FCSV9WMyA/CisJCQkibm8tbGVnYWN5LXN5c2NhbGxzIiA6ICI2NC1iaXQgZGF0YSBhbnkgcmVnaXN0ZXIgYWxpZ25lZCIpOwogCiAJcmV0dXJuIGJ1ZjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2tlcm5lbC91bndpbmQuYyBiL2FyY2gvYXJjL2tlcm5lbC91bndpbmQuYwppbmRleCAwNTg3YmYxLi42MWZkMWNlIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9rZXJuZWwvdW53aW5kLmMKKysrIGIvYXJjaC9hcmMva2VybmVsL3Vud2luZC5jCkBAIC0xMTEsNiArMTExLDggQEAKICNkZWZpbmUgRFdfRUhfUEVfaW5kaXJlY3QgMHg4MAogI2RlZmluZSBEV19FSF9QRV9vbWl0ICAgICAweGZmCiAKKyNkZWZpbmUgQ0lFX0lECTAKKwogdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVsZWIxMjhfdDsKIHR5cGVkZWYgc2lnbmVkIGxvbmcgc2xlYjEyOF90OwogCkBAIC0yMzIsNiArMjM0LDcgQEAKIAogc3RhdGljIGNvbnN0IHUzMiBiYWRfY2llLCBub3RfZmRlOwogc3RhdGljIGNvbnN0IHUzMiAqY2llX2Zvcl9mZGUoY29uc3QgdTMyICpmZGUsIGNvbnN0IHN0cnVjdCB1bndpbmRfdGFibGUgKik7CitzdGF0aWMgY29uc3QgdTMyICpfX2NpZV9mb3JfZmRlKGNvbnN0IHUzMiAqZmRlKTsKIHN0YXRpYyBzaWduZWQgZmRlX3BvaW50ZXJfdHlwZShjb25zdCB1MzIgKmNpZSk7CiAKIHN0cnVjdCBlaF9mcmFtZV9oZHJfdGFibGVfZW50cnkgewpAQCAtMzM4LDEwICszNDEsOSBAQAogCWZvciAoZmRlID0gdGFibGUtPmFkZHJlc3MsIHRhYmxlU2l6ZSA9IHRhYmxlLT5zaXplLCBuID0gMDsKIAkgICAgIHRhYmxlU2l6ZTsKIAkgICAgIHRhYmxlU2l6ZSAtPSBzaXplb2YoKmZkZSkgKyAqZmRlLCBmZGUgKz0gMSArICpmZGUgLyBzaXplb2YoKmZkZSkpIHsKLQkJLyogY29uc3QgdTMyICpjaWUgPSBmZGUgKyAxIC0gZmRlWzFdIC8gc2l6ZW9mKCpmZGUpOyAqLwotCQljb25zdCB1MzIgKmNpZSA9IChjb25zdCB1MzIgKikoZmRlWzFdKTsKKwkJY29uc3QgdTMyICpjaWUgPSBfX2NpZV9mb3JfZmRlKGZkZSk7CiAKLQkJaWYgKGZkZVsxXSA9PSAweGZmZmZmZmZmKQorCQlpZiAoZmRlWzFdID09IENJRV9JRCkKIAkJCWNvbnRpbnVlOwkvKiB0aGlzIGlzIGEgQ0lFICovCiAJCXB0ciA9IChjb25zdCB1OCAqKShmZGUgKyAyKTsKIAkJaGVhZGVyLT50YWJsZVtuXS5zdGFydCA9IHJlYWRfcG9pbnRlcigmcHRyLApAQCAtNTA0LDYgKzUwNiwxNSBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAorc3RhdGljIGNvbnN0IHUzMiAqX19jaWVfZm9yX2ZkZShjb25zdCB1MzIgKmZkZSkKK3sKKwljb25zdCB1MzIgKmNpZTsKKworCWNpZSA9IGZkZSArIDEgLSBmZGVbMV0gLyBzaXplb2YoKmZkZSk7CisKKwlyZXR1cm4gY2llOworfQorCiBzdGF0aWMgY29uc3QgdTMyICpjaWVfZm9yX2ZkZShjb25zdCB1MzIgKmZkZSwgY29uc3Qgc3RydWN0IHVud2luZF90YWJsZSAqdGFibGUpCiB7CiAJY29uc3QgdTMyICpjaWU7CkBAIC01MTEsMTkgKzUyMiwxOCBAQAogCWlmICghKmZkZSB8fCAoKmZkZSAmIChzaXplb2YoKmZkZSkgLSAxKSkpCiAJCXJldHVybiAmYmFkX2NpZTsKIAotCWlmIChmZGVbMV0gPT0gMHhmZmZmZmZmZikKKwlpZiAoZmRlWzFdID09IENJRV9JRCkKIAkJcmV0dXJuICZub3RfZmRlOwkvKiB0aGlzIGlzIGEgQ0lFICovCiAKIAlpZiAoKGZkZVsxXSAmIChzaXplb2YoKmZkZSkgLSAxKSkpCiAvKiB8fCBmZGVbMV0gPiAodW5zaWduZWQgbG9uZykoZmRlICsgMSkgLSAodW5zaWduZWQgbG9uZyl0YWJsZS0+YWRkcmVzcykgKi8KIAkJcmV0dXJuIE5VTEw7CS8qIHRoaXMgaXMgbm90IGEgdmFsaWQgRkRFICovCiAKLQkvKiBjaWUgPSBmZGUgKyAxIC0gZmRlWzFdIC8gc2l6ZW9mKCpmZGUpOyAqLwotCWNpZSA9ICh1MzIgKikgZmRlWzFdOworCWNpZSA9IF9fY2llX2Zvcl9mZGUoZmRlKTsKIAogCWlmICgqY2llIDw9IHNpemVvZigqY2llKSArIDQgfHwgKmNpZSA+PSBmZGVbMV0gLSBzaXplb2YoKmZkZSkKIAkgICAgfHwgKCpjaWUgJiAoc2l6ZW9mKCpjaWUpIC0gMSkpCi0JICAgIHx8IChjaWVbMV0gIT0gMHhmZmZmZmZmZikpCisJICAgIHx8IChjaWVbMV0gIT0gQ0lFX0lEKSkKIAkJcmV0dXJuIE5VTEw7CS8qIHRoaXMgaXMgbm90IGEgKHZhbGlkKSBDSUUgKi8KIAlyZXR1cm4gY2llOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2FyYy9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA4OTRlNjk2Li4zNjYxMTA3IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2FyYy9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtODIsMTQgKzgyLDYgQEAKIAogCVBFUkNQVV9TRUNUSU9OKEwxX0NBQ0hFX0JZVEVTKQogCi0JLyoKLQkgKiAuZXhpdC50ZXh0IGlzIGRpc2NhcmQgYXQgcnVudGltZSwgbm90IGxpbmsgdGltZSwgdG8gZGVhbCB3aXRoCi0JICogcmVmZXJlbmNlcyBmcm9tIC5kZWJ1Z19mcmFtZQotCSAqIEl0IHdpbGwgYmUgaW5pdCBmcmVlZCwgYmVpbmcgaW5zaWRlIFtfX2luaXRfc3RhcnQgOiBfX2luaXRfZW5kXQotCSAqLwotCS5leGl0LnRleHQgOiB7IEVYSVRfVEVYVCB9Ci0JLmV4aXQuZGF0YSA6IHsgRVhJVF9EQVRBIH0KLQogCS4gPSBBTElHTihQQUdFX1NJWkUpOwogCV9faW5pdF9lbmQgPSAuOwogCkBAIC0xMjAsMTggKzExMiwxMyBAQAogCiAjaWZkZWYgQ09ORklHX0FSQ19EVzJfVU5XSU5ECiAJLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JLmRlYnVnX2ZyYW1lICA6IHsKKwkuZWhfZnJhbWUgIDogewogCQlfX3N0YXJ0X3Vud2luZCA9IC47Ci0JCSooLmRlYnVnX2ZyYW1lKQorCQkqKC5laF9mcmFtZSkKIAkJX19lbmRfdW53aW5kID0gLjsKIAl9Ci0JLyoKLQkgKiBnY2MgNC44IGdlbmVyYXRlcyB0aGlzIGZvciAtZmFzeW5jaG9ub3VzLXVud2luZC10YWJsZXMsCi0JICogd2hpbGUgd2Ugc3RpbGwgdXNlIHRoZSAuZGVidWdfZnJhbWUgYmFzZWQgdW53aW5kZXIKLQkgKi8KLQkvRElTQ0FSRC8gOiB7CSooLmVoX2ZyYW1lKSB9CiAjZWxzZQotCS9ESVNDQVJELyA6IHsJKiguZGVidWdfZnJhbWUpIH0KKwkvRElTQ0FSRC8gOiB7CSooLmVoX2ZyYW1lKSB9CiAjZW5kaWYKIAogCU5PVEVTCkBAIC0xNDgsNyArMTM1LDcgQEAKIAl9CiAKICNpZm5kZWYgQ09ORklHX0RFQlVHX0lORk8KLQkvKiBvcGVuLWNvZGVkIGJlY2F1c2Ugd2UgbmVlZCAuZGVidWdfZnJhbWUgc2VwZXJhdGVseSBmb3IgdW53aW5kaW5nICovCisJL0RJU0NBUkQvIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQogCS9ESVNDQVJELyA6IHsgKiguZGVidWdfYXJhbmdlcykgfQogCS9ESVNDQVJELyA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KIAkvRElTQ0FSRC8gOiB7ICooLmRlYnVnX2luZm8pIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2xpYi9tZW1jbXAuUyBiL2FyY2gvYXJjL2xpYi9tZW1jbXAuUwppbmRleCBhNDAxNWU3Li4yMWExMDMwIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9saWIvbWVtY21wLlMKKysrIGIvYXJjaC9hcmMvbGliL21lbWNtcC5TCkBAIC0xNiw3ICsxNiw3IEBACiAjZGVmaW5lIFNISUZUIHIyCiAjZW5kaWYKIAotRU5UUlkobWVtY21wKQorRU5UUllfQ0ZJKG1lbWNtcCkKIAlvcglyMTIscjAscjEKIAlhc2xfcwlyMTIscjEyLDMwCiAJc3ViCXIzLHIyLDEKQEAgLTE0OSw0ICsxNDksNCBAQAogLkxuaWw6CiAJal9zLmQJW2JsaW5rXQogCW1vdglyMCwwCi1FTkQobWVtY21wKQorRU5EX0NGSShtZW1jbXApCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9saWIvbWVtY3B5LTcwMC5TIGIvYXJjaC9hcmMvbGliL21lbWNweS03MDAuUwppbmRleCAzMjIyNTczLi5iYTBiZWNjIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9saWIvbWVtY3B5LTcwMC5TCisrKyBiL2FyY2gvYXJjL2xpYi9tZW1jcHktNzAwLlMKQEAgLTgsNyArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKLUVOVFJZKG1lbWNweSkKK0VOVFJZX0NGSShtZW1jcHkpCiAJb3IJcjMscjAscjEKIAlhc2xfcwlyMyxyMywzMAogCW1vdl9zCXI1LHIwCkBAIC02Myw0ICs2Myw0IEBACiAuTGVuZGJsb29wOgogCWpfcy5kCVtibGlua10KIAlzdGIJcjEyLFtyNSwwXQotRU5EKG1lbWNweSkKK0VORF9DRkkobWVtY3B5KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvbGliL21lbWNweS1hcmNocy5TIGIvYXJjaC9hcmMvbGliL21lbWNweS1hcmNocy5TCmluZGV4IGY5NmM3NWUuLmQ2MTA0NGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2xpYi9tZW1jcHktYXJjaHMuUworKysgYi9hcmNoL2FyYy9saWIvbWVtY3B5LWFyY2hzLlMKQEAgLTQwLDcgKzQwLDcgQEAKICMgZGVmaW5lIFpPTEFORAkJCTB4RgogI2VuZGlmCiAKLUVOVFJZKG1lbWNweSkKK0VOVFJZX0NGSShtZW1jcHkpCiAJcHJlZmV0Y2ggW3IxXQkJOyBQcmVmZXRjaCB0aGUgcmVhZCBsb2NhdGlvbgogCXByZWZldGNodyBbcjBdCQk7IFByZWZldGNoIHRoZSB3cml0ZSBsb2NhdGlvbgogCW1vdi5mCTAsIHIyCkBAIC0yMzMsNCArMjMzLDQgQEAKIC5MY29weWJ5dGV3aXNlXzM6CiAJaglbYmxpbmtdCiAKLUVORChtZW1jcHkpCitFTkRfQ0ZJKG1lbWNweSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2xpYi9tZW1zZXQtYXJjaHMuUyBiL2FyY2gvYXJjL2xpYi9tZW1zZXQtYXJjaHMuUwppbmRleCAzNjViMTgzLi42MmFkNGJjIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9saWIvbWVtc2V0LWFyY2hzLlMKKysrIGIvYXJjaC9hcmMvbGliL21lbXNldC1hcmNocy5TCkBAIC0xMCw3ICsxMCw3IEBACiAKICN1bmRlZiBQUkVBTExPQ19OT1RfQVZBSUwKIAotRU5UUlkobWVtc2V0KQorRU5UUllfQ0ZJKG1lbXNldCkKIAlwcmVmZXRjaHcgW3IwXQkJOyBQcmVmZXRjaCB0aGUgd3JpdGUgbG9jYXRpb24KIAltb3YuZgkwLCByMgogOzs7IGlmIHNpemUgaXMgemVybwpAQCAtMTEyLDExICsxMTIsMTEgQEAKIAogCWoJW2JsaW5rXQogCi1FTkQobWVtc2V0KQorRU5EX0NGSShtZW1zZXQpCiAKLUVOVFJZKG1lbXplcm8pCitFTlRSWV9DRkkobWVtemVybykKICAgICA7IGFkanVzdCBiemVybyBhcmdzIHRvIG1lbXNldCBhcmdzCiAgICAgbW92IHIyLCByMQogICAgIGIuZCAgbWVtc2V0ICAgIDt0YWlsIGNhbGwgc28gbmVlZCB0byB0aW5rZXIgd2l0aCBibGluawogICAgIG1vdiByMSwgMAotRU5EKG1lbXplcm8pCitFTkRfQ0ZJKG1lbXplcm8pCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9saWIvbWVtc2V0LlMgYi9hcmNoL2FyYy9saWIvbWVtc2V0LlMKaW5kZXggZDM2YmQ0My4uY2Y3MzZmOSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvbGliL21lbXNldC5TCisrKyBiL2FyY2gvYXJjL2xpYi9tZW1zZXQuUwpAQCAtMTAsNyArMTAsNyBAQAogCiAjZGVmaW5lIFNNQUxMCTcgLyogTXVzdCBiZSBhdCBsZWFzdCA2IHRvIGRlYWwgd2l0aCBhbGlnbm1lbnQvbG9vcCBpc3N1ZXMuICAqLwogCi1FTlRSWShtZW1zZXQpCitFTlRSWV9DRkkobWVtc2V0KQogCW1vdl9zCXI0LHIwCiAJb3IJcjEyLHIwLHIyCiAJYm1zay5mCXIxMixyMTIsMQpAQCAtNDYsMTQgKzQ2LDE0IEBACiAJc3RiLmFiCXIxLFtyNCwxXQogLkx0aW55X2VuZDoKIAlqX3MJW2JsaW5rXQotRU5EKG1lbXNldCkKK0VORF9DRkkobWVtc2V0KQogCiA7IG1lbXplcm86IEByMCA9IG1lbSwgQHIxID0gc2l6ZV90CiA7IG1lbXNldDogIEByMCA9IG1lbSwgQHIxID0gY2hhciwgQHIyID0gc2l6ZV90CiAKLUVOVFJZKG1lbXplcm8pCitFTlRSWV9DRkkobWVtemVybykKICAgICA7IGFkanVzdCBiemVybyBhcmdzIHRvIG1lbXNldCBhcmdzCiAgICAgbW92IHIyLCByMQogICAgIG1vdiByMSwgMAogICAgIGIgIG1lbXNldCAgICA7dGFpbCBjYWxsIHNvIG5lZWQgdG8gdGlua2VyIHdpdGggYmxpbmsKLUVORChtZW16ZXJvKQorRU5EX0NGSShtZW16ZXJvKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvbGliL3N0cmNoci03MDAuUyBiL2FyY2gvYXJjL2xpYi9zdHJjaHItNzAwLlMKaW5kZXggYjcyNWQ1OC4uMmQzMDBkYSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvbGliL3N0cmNoci03MDAuUworKysgYi9hcmNoL2FyYy9saWIvc3RyY2hyLTcwMC5TCkBAIC0xMyw3ICsxMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKLUVOVFJZKHN0cmNocikKK0VOVFJZX0NGSShzdHJjaHIpCiAJZXh0Yl9zCXIxLHIxCiAJYXNsCXI1LHIxLDgKIAlibXNrCXIyLHIwLDEKQEAgLTEzMCw0ICsxMzAsNCBAQAogCWpfcy5kCVtibGlua10KIAltb3YubWkJcjAsMAogI2VuZGlmIC8qIEVORElBTiAqLwotRU5EKHN0cmNocikKK0VORF9DRkkoc3RyY2hyKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvbGliL3N0cmNtcC1hcmNocy5TIGIvYXJjaC9hcmMvbGliL3N0cmNtcC1hcmNocy5TCmluZGV4IDRmMzM4ZWUuLmZhZTllODIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2xpYi9zdHJjbXAtYXJjaHMuUworKysgYi9hcmNoL2FyYy9saWIvc3RyY21wLWFyY2hzLlMKQEAgLTgsNyArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKLUVOVFJZKHN0cmNtcCkKK0VOVFJZX0NGSShzdHJjbXApCiAJb3IJcjIsIHIwLCByMQogCWJtc2tfcwlyMiwgcjIsIDEKIAlicm5lCXIyLCAwLCBALkxjaGFybG9vcApAQCAtNzUsNCArNzUsNCBAQAogLkxjbXBlbmQ6CiAJal9zLmQJW2JsaW5rXQogCXN1YglyMCwgcjIsIHIzCi1FTkQoc3RyY21wKQorRU5EX0NGSShzdHJjbXApCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9saWIvc3RyY21wLlMgYi9hcmNoL2FyYy9saWIvc3RyY21wLlMKaW5kZXggMzU0NDYwMC4uZmIyMDA5NiAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvbGliL3N0cmNtcC5TCisrKyBiL2FyY2gvYXJjL2xpYi9zdHJjbXAuUwpAQCAtMTUsNyArMTUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogCi1FTlRSWShzdHJjbXApCitFTlRSWV9DRkkoc3RyY21wKQogCW9yCXIyLHIwLHIxCiAJYm1za19zCXIyLHIyLDEKIAlicm5lCXIyLDAsLkxjaGFybG9vcApAQCAtOTMsNCArOTMsNCBAQAogLkxjbXBlbmQ6CiAJal9zLmQJW2JsaW5rXQogCXN1YglyMCxyMixyMwotRU5EKHN0cmNtcCkKK0VORF9DRkkoc3RyY21wKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvbGliL3N0cmNweS03MDAuUyBiL2FyY2gvYXJjL2xpYi9zdHJjcHktNzAwLlMKaW5kZXggODQyMmYzOC4uNmE2YzE1NSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvbGliL3N0cmNweS03MDAuUworKysgYi9hcmNoL2FyYy9saWIvc3RyY3B5LTcwMC5TCkBAIC0xOCw3ICsxOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKLUVOVFJZKHN0cmNweSkKK0VOVFJZX0NGSShzdHJjcHkpCiAJb3IJcjIscjAscjEKIAlibXNrX3MJcjIscjIsMQogCWJybmUuZAlyMiwwLGNoYXJsb29wCkBAIC02Nyw0ICs2Nyw0IEBACiAJYnJuZS5kCXIzLDAsY2hhcmxvb3AKIAlzdGIuYWIJcjMsW3IxMCwxXQogCWoJW2JsaW5rXQotRU5EKHN0cmNweSkKK0VORF9DRkkoc3RyY3B5KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvbGliL3N0cmxlbi5TIGIvYXJjaC9hcmMvbGliL3N0cmxlbi5TCmluZGV4IDUzY2ZkNTYuLjgzOWI0NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2xpYi9zdHJsZW4uUworKysgYi9hcmNoL2FyYy9saWIvc3RybGVuLlMKQEAgLTgsNyArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKLUVOVFJZKHN0cmxlbikKK0VOVFJZX0NGSShzdHJsZW4pCiAJb3IJcjMscjAsNwogCWxkCXIyLFtyMywtN10KIAlsZC5hCXI2LFtyMywtM10KQEAgLTgwLDQgKzgwLDQgQEAKIC5MZWFybHlfZW5kOgogCWIuZAkuTGVuZAogCXN1Yl9zLm5lIHIxLHIxLHIxCi1FTkQoc3RybGVuKQorRU5EX0NGSShzdHJsZW4pCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9tbS9jYWNoZS5jIGIvYXJjaC9hcmMvbW0vY2FjaGUuYwppbmRleCA1YTI5NGIyLi45N2RkZGJlIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9tbS9jYWNoZS5jCisrKyBiL2FyY2gvYXJjL21tL2NhY2hlLmMKQEAgLTI1LDYgKzI1LDcgQEAKIGludCBpb2NfZXhpc3RzOwogdm9sYXRpbGUgaW50IHNsY19lbmFibGUgPSAxLCBpb2NfZW5hYmxlID0gMTsKIHVuc2lnbmVkIGxvbmcgcGVyaXBfYmFzZSA9IEFSQ19VTkNBQ0hFRF9BRERSX1NQQUNFOyAvKiBsZWdhY3kgdmFsdWUgZm9yIGJvb3QgKi8KK3Vuc2lnbmVkIGxvbmcgcGVyaXBfZW5kID0gMHhGRkZGRkZGRjsgLyogbGVnYWN5IHZhbHVlICovCiAKIHZvaWQgKCpfY2FjaGVfbGluZV9sb29wX2ljX2ZuKShwaHlzX2FkZHJfdCBwYWRkciwgdW5zaWduZWQgbG9uZyB2YWRkciwKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nIHN6LCBjb25zdCBpbnQgY2FjaGVvcCk7CkBAIC03Niw3ICs3Nyw2IEBACiBzdGF0aWMgdm9pZCByZWFkX2RlY29kZV9jYWNoZV9iY3JfYXJjdjIoaW50IGNwdSkKIHsKIAlzdHJ1Y3QgY3B1aW5mb19hcmNfY2FjaGUgKnBfc2xjID0gJmNwdWluZm9fYXJjNzAwW2NwdV0uc2xjOwotCXN0cnVjdCBiY3JfZ2VuZXJpYyB1bmNhY2hlZF9zcGFjZTsKIAlzdHJ1Y3QgYmNyX2dlbmVyaWMgc2JjcjsKIAogCXN0cnVjdCBiY3Jfc2xjX2NmZyB7CkBAIC05NSw2ICs5NSwxNSBAQAogI2VuZGlmCiAJfSBjYmNyOwogCisJc3RydWN0IGJjcl92b2xhdGlsZSB7CisjaWZkZWYgQ09ORklHX0NQVV9CSUdfRU5ESUFOCisJCXVuc2lnbmVkIGludCBzdGFydDo0LCBsaW1pdDo0LCBwYWQ6MjIsIG9yZGVyOjEsIGRpc2FibGU6MTsKKyNlbHNlCisJCXVuc2lnbmVkIGludCBkaXNhYmxlOjEsIG9yZGVyOjEsIHBhZDoyMiwgbGltaXQ6NCwgc3RhcnQ6NDsKKyNlbmRpZgorCX0gdm9sOworCisKIAlSRUFEX0JDUihBUkNfUkVHX1NMQ19CQ1IsIHNiY3IpOwogCWlmIChzYmNyLnZlcikgewogCQlSRUFEX0JDUihBUkNfUkVHX1NMQ19DRkcsIHNsY19jZmcpOwpAQCAtMTA3LDEwICsxMTYsMTQgQEAKIAlpZiAoY2Jjci5jICYmIGlvY19lbmFibGUpCiAJCWlvY19leGlzdHMgPSAxOwogCi0JLyogTGVnYWN5IERhdGEgVW5jYWNoZWQgQkNSIGlzIGRlcHJlY2F0ZWQgZnJvbSB2MyBvbndhcmRzICovCi0JUkVBRF9CQ1IoQVJDX1JFR19EX1VOQ0FDSF9CQ1IsIHVuY2FjaGVkX3NwYWNlKTsKLQlpZiAodW5jYWNoZWRfc3BhY2UudmVyID4gMikKLQkJcGVyaXBfYmFzZSA9IHJlYWRfYXV4X3JlZyhBVVhfTk9OX1ZPTCkgJiAweEYwMDAwMDAwOworCS8qIEhTIDIuMCBkaWRuJ3QgaGF2ZSBBVVhfVk9MICovCisJaWYgKGNwdWluZm9fYXJjNzAwW2NwdV0uY29yZS5mYW1pbHkgPiAweDUxKSB7CisJCVJFQURfQkNSKEFVWF9WT0wsIHZvbCk7CisJCXBlcmlwX2Jhc2UgPSB2b2wuc3RhcnQgPDwgMjg7CisJCS8qIEhTIDMuMCBoYXMgbGltaXQgYW5kIHN0cmljdC1vcmRlcmluZyBmaWVsZHMgKi8KKwkJaWYgKGNwdWluZm9fYXJjNzAwW2NwdV0uY29yZS5mYW1pbHkgPiAweDUyKQorCQkJcGVyaXBfZW5kID0gKHZvbC5saW1pdCA8PCAyOCkgLSAxOworCX0KIH0KIAogdm9pZCByZWFkX2RlY29kZV9jYWNoZV9iY3Iodm9pZCkKQEAgLTkyMSw2ICs5MzQsMTUgQEAKIAogCXByaW50ayhhcmNfY2FjaGVfbXVtYm9qdW1ibygwLCBzdHIsIHNpemVvZihzdHIpKSk7CiAKKwkvKgorCSAqIE9ubHkgbWFzdGVyIENQVSBuZWVkcyB0byBleGVjdXRlIHJlc3Qgb2YgZnVuY3Rpb246CisJICogIC0gQXNzdW1lIFNNUCBzbyBhbGwgY29yZXMgd2lsbCBoYXZlIHNhbWUgY2FjaGUgY29uZmlnIHNvCisJICogICAgYW55IGdlb210cnkgY2hlY2tzIHdpbGwgYmUgc2FtZSBmb3IgYWxsCisJICogIC0gSU9DIHNldHVwIC8gZG1hIGNhbGxiYWNrcyBvbmx5IG5lZWQgdG8gYmUgc2V0dXAgb25jZQorCSAqLworCWlmIChjcHUpCisJCXJldHVybjsKKwogCWlmIChJU19FTkFCTEVEKENPTkZJR19BUkNfSEFTX0lDQUNIRSkpIHsKIAkJc3RydWN0IGNwdWluZm9fYXJjX2NhY2hlICppYyA9ICZjcHVpbmZvX2FyYzcwMFtjcHVdLmljYWNoZTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvbW0vaGlnaG1lbS5jIGIvYXJjaC9hcmMvbW0vaGlnaG1lbS5jCmluZGV4IDA0ZjgzMzIuLjc3ZmY2NGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL21tL2hpZ2htZW0uYworKysgYi9hcmNoL2FyYy9tbS9oaWdobWVtLmMKQEAgLTYxLDYgKzYxLDcgQEAKIAogCXJldHVybiBrbWFwX2hpZ2gocGFnZSk7CiB9CitFWFBPUlRfU1lNQk9MKGttYXApOwogCiB2b2lkICprbWFwX2F0b21pYyhzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL21tL2lvcmVtYXAuYyBiL2FyY2gvYXJjL21tL2lvcmVtYXAuYwppbmRleCBmNTJiN2RiNi4uOTg4MWJkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvbW0vaW9yZW1hcC5jCisrKyBiL2FyY2gvYXJjL21tL2lvcmVtYXAuYwpAQCAtMTksNyArMTksNyBAQAogCWlmIChpc19pc2FfYXJjb21wYWN0KCkpIHsKIAkJaWYgKHBhZGRyID49IEFSQ19VTkNBQ0hFRF9BRERSX1NQQUNFKQogCQkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlIGlmIChwYWRkciA+PSBwZXJpcF9iYXNlICYmIHBhZGRyIDw9IDB4RkZGRkZGRkYpIHsKKwl9IGVsc2UgaWYgKHBhZGRyID49IHBlcmlwX2Jhc2UgJiYgcGFkZHIgPD0gcGVyaXBfZW5kKSB7CiAJCXJldHVybiB0cnVlOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvcGxhdC1zaW0vcGxhdGZvcm0uYyBiL2FyY2gvYXJjL3BsYXQtc2ltL3BsYXRmb3JtLmMKaW5kZXggZTRmZTUxNC4uYWVhODczOCAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvcGxhdC1zaW0vcGxhdGZvcm0uYworKysgYi9hcmNoL2FyYy9wbGF0LXNpbS9wbGF0Zm9ybS5jCkBAIC0yNCw2ICsyNCw3IEBACiAJInNucHMsbnNpbV9ocyIsCiAJInNucHMsbnNpbW9zY2kiLAogCSJzbnBzLG5zaW1vc2NpX2hzIiwKKwkic25wcyx6ZWJ1X2hzIiwKIAlOVUxMLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZyBiL2FyY2gvYXJtL0tjb25maWcKaW5kZXggYTljNGU0OC4uM2NkOTA0MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZworKysgYi9hcmNoL2FybS9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIEFSTQogCWJvb2wKIAlkZWZhdWx0IHkKKwlzZWxlY3QgQVJDSF9DTE9DS1NPVVJDRV9EQVRBCiAJc2VsZWN0IEFSQ0hfSEFTX0FUT01JQzY0X0RFQ19JRl9QT1NJVElWRQogCXNlbGVjdCBBUkNIX0hBU19ERVZNRU1fSVNfQUxMT1dFRAogCXNlbGVjdCBBUkNIX0hBU19FTEZfUkFORE9NSVpFCkBAIC04NzgsNiArODc5LDcgQEAKIAlzZWxlY3QgQ0xLU1JDX1NUTTMyCiAJc2VsZWN0IFBJTkNUUkwKIAlzZWxlY3QgUkVTRVRfQ09OVFJPTExFUgorCXNlbGVjdCBTVE0zMl9FWFRJCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgU1RNaWNyb2VsZWN0cm9uaWNzIFNUTTMyIHByb2Nlc3NvcnMuCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL01ha2VmaWxlIGIvYXJjaC9hcm0vTWFrZWZpbGUKaW5kZXggNjFmNmNjYy4uNmJlOWVlMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vTWFrZWZpbGUKQEAgLTIzLDcgKzIzLDYgQEAKIExERkxBR1NfTU9EVUxFCSs9IC1UICQoc3JjdHJlZSkvYXJjaC9hcm0va2VybmVsL21vZHVsZS5sZHMKIGVuZGlmCiAKLU9CSkNPUFlGTEFHUwk6PS1PIGJpbmFyeSAtUiAuY29tbWVudCAtUwogR1pGTEFHUwkJOj0tOQogI0tCVUlMRF9DRkxBR1MJKz0tcGlwZQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L01ha2VmaWxlIGIvYXJjaC9hcm0vYm9vdC9NYWtlZmlsZQppbmRleCBiZGMxZDVhLi41MGY4ZDFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2Jvb3QvTWFrZWZpbGUKQEAgLTExLDYgKzExLDggQEAKICMgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgUnVzc2VsbCBLaW5nCiAjCiAKK09CSkNPUFlGTEFHUwk6PS1PIGJpbmFyeSAtUiAuY29tbWVudCAtUworCiBpZm5lcSAoJChNQUNISU5FKSwpCiBpbmNsdWRlICQoTUFDSElORSkvTWFrZWZpbGUuYm9vdAogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCmluZGV4IGFmMTFjMmYuLmZjNmQ1NDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUwpAQCAtNzc5LDcgKzc3OSw3IEBACiAJCW9ycm5lCXIwLCByMCwgIzEJCUAgTU1VIGVuYWJsZWQKIAkJbW92bmUJcjEsICMweGZmZmZmZmZkCQlAIGRvbWFpbiAwID0gY2xpZW50CiAJCWJpYyAgICAgcjYsIHI2LCAjMSA8PCAzMSAgICAgICAgQCAzMi1iaXQgdHJhbnNsYXRpb24gc3lzdGVtCi0JCWJpYyAgICAgcjYsIHI2LCAjMyA8PCAwICAgICAgICAgQCB1c2Ugb25seSB0dGJyMAorCQliaWMgICAgIHI2LCByNiwgIyg3IDw8IDApIHwgKDEgPDwgNCkJQCB1c2Ugb25seSB0dGJyMAogCQltY3JuZQlwMTUsIDAsIHIzLCBjMiwgYzAsIDAJQCBsb2FkIHBhZ2UgdGFibGUgcG9pbnRlcgogCQltY3JuZQlwMTUsIDAsIHIxLCBjMywgYzAsIDAJQCBsb2FkIGRvbWFpbiBhY2Nlc3MgY29udHJvbAogCQltY3JuZSAgIHAxNSwgMCwgcjYsIGMyLCBjMCwgMiAgIEAgbG9hZCB0dGIgY29udHJvbApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvYW0zMzV4LWJhbHRvcy5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvYW0zMzV4LWJhbHRvcy5kdHNpCmluZGV4IGM4NjA5ZDguLmI2ODkxNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2FtMzM1eC1iYWx0b3MuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9hbTMzNXgtYmFsdG9zLmR0c2kKQEAgLTIyNiw3ICsyMjYsNyBAQAogCiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJZWxtX2lkID0gPCZlbG0+OworCQl0aSxlbG0taWQgPSA8JmVsbT47CiAJfTsKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2FtMzM1eC1pZ2VwMDAzMy5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvYW0zMzV4LWlnZXAwMDMzLmR0c2kKaW5kZXggZGY2MzQ4NC4uZTdkOWNhMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvYW0zMzV4LWlnZXAwMDMzLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvYW0zMzV4LWlnZXAwMDMzLmR0c2kKQEAgLTE2MSw3ICsxNjEsNyBAQAogCiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJZWxtX2lkID0gPCZlbG0+OworCQl0aSxlbG0taWQgPSA8JmVsbT47CiAKIAkJLyogTVREIHBhcnRpdGlvbiB0YWJsZSAqLwogCQlwYXJ0aXRpb25AMCB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9hbTMzNXgtcGh5Y29yZS1zb20uZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2FtMzM1eC1waHljb3JlLXNvbS5kdHNpCmluZGV4IDg2Zjc3MzEuLjEyNjNjOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2FtMzM1eC1waHljb3JlLXNvbS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2FtMzM1eC1waHljb3JlLXNvbS5kdHNpCkBAIC0xOTcsNyArMTk3LDcgQEAKIAkJZ3BtYyx3ci1hY2Nlc3MtbnMgPSA8MzA+OwogCQlncG1jLHdyLWRhdGEtbXV4LWJ1cy1ucyA9IDwwPjsKIAotCQllbG1faWQgPSA8JmVsbT47CisJCXRpLGVsbS1pZCA9IDwmZWxtPjsKIAogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MT47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9hcm1hZGEtMzg4LWNsZWFyZm9nLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2FybWFkYS0zODgtY2xlYXJmb2cuZHRzCmluZGV4IDJlMDU1NmEuLmQzZTZiZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2FybWFkYS0zODgtY2xlYXJmb2cuZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2FybWFkYS0zODgtY2xlYXJmb2cuZHRzCkBAIC0zOTAsMTIgKzM5MCwxMiBAQAogCiAJCQlwb3J0QDAgewogCQkJCXJlZyA9IDwwPjsKLQkJCQlsYWJlbCA9ICJsYW4xIjsKKwkJCQlsYWJlbCA9ICJsYW41IjsKIAkJCX07CiAKIAkJCXBvcnRAMSB7CiAJCQkJcmVnID0gPDE+OwotCQkJCWxhYmVsID0gImxhbjIiOworCQkJCWxhYmVsID0gImxhbjQiOwogCQkJfTsKIAogCQkJcG9ydEAyIHsKQEAgLTQwNSwxMiArNDA1LDEyIEBACiAKIAkJCXBvcnRAMyB7CiAJCQkJcmVnID0gPDM+OwotCQkJCWxhYmVsID0gImxhbjQiOworCQkJCWxhYmVsID0gImxhbjIiOwogCQkJfTsKIAogCQkJcG9ydEA0IHsKIAkJCQlyZWcgPSA8ND47Ci0JCQkJbGFiZWwgPSAibGFuNSI7CisJCQkJbGFiZWwgPSAibGFuMSI7CiAJCQl9OwogCiAJCQlwb3J0QDUgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvYmNtMjgzNS1ycGkuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2JjbTI4MzUtcnBpLmR0c2kKaW5kZXggY2FmMjcwNy4uZTliNDdiMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvYmNtMjgzNS1ycGkuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9iY20yODM1LXJwaS5kdHNpCkBAIC0yLDYgKzIsNyBAQAogCiAvIHsKIAltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwogCQlyZWcgPSA8MCAweDEwMDAwMDAwPjsKIAl9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9iY20yODN4LmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9iY20yODN4LmR0c2kKaW5kZXggYjk4MjUyMi4uNDQ1NjI0YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvYmNtMjgzeC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2JjbTI4M3guZHRzaQpAQCAtMiw3ICsyLDYgQEAKICNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9iY20yODM1Lmg+CiAjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svYmNtMjgzNS1hdXguaD4KICNpbmNsdWRlIDxkdC1iaW5kaW5ncy9ncGlvL2dwaW8uaD4KLSNpbmNsdWRlICJza2VsZXRvbi5kdHNpIgogCiAvKiBUaGlzIGluY2x1ZGUgZmlsZSBjb3ZlcnMgdGhlIGNvbW1vbiBwZXJpcGhlcmFscyBhbmQgY29uZmlndXJhdGlvbiBiZXR3ZWVuCiAgKiBiY20yODM1IGFuZCBiY20yODM2IGltcGxlbWVudGF0aW9ucywgbGVhdmluZyB0aGUgQ1BVIGNvbmZpZ3VyYXRpb24gdG8KQEAgLTEzLDYgKzEyLDggQEAKIAljb21wYXRpYmxlID0gImJyY20sYmNtMjgzNSI7CiAJbW9kZWwgPSAiQkNNMjgzNSI7CiAJaW50ZXJydXB0LXBhcmVudCA9IDwmaW50Yz47CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CiAKIAljaG9zZW4gewogCQlib290YXJncyA9ICJlYXJseXByaW50ayBjb25zb2xlPXR0eUFNQTAiOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvZXh5bm9zNTQxMC1vZHJvaWR4dS5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9leHlub3M1NDEwLW9kcm9pZHh1LmR0cwppbmRleCBkOTQ5OTMxLi5mNmQxMzUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9leHlub3M1NDEwLW9kcm9pZHh1LmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy9leHlub3M1NDEwLW9kcm9pZHh1LmR0cwpAQCAtNDQ3LDE0ICs0NDcsMTEgQEAKIAlzYW1zdW5nLGR3LW1zaGMtY2l1LWRpdiA9IDwzPjsKIAlzYW1zdW5nLGR3LW1zaGMtc2RyLXRpbWluZyA9IDwwIDQ+OwogCXNhbXN1bmcsZHctbXNoYy1kZHItdGltaW5nID0gPDAgMj47Ci0Jc2Ftc3VuZyxkdy1tc2hjLWhzNDAwLXRpbWluZyA9IDwwIDI+OwotCXNhbXN1bmcscmVhZC1zdHJvYmUtZGVsYXkgPSA8OTA+OwogCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CiAJcGluY3RybC0wID0gPCZzZDBfY2xrICZzZDBfY21kICZzZDBfYnVzMSAmc2QwX2J1czQgJnNkMF9idXM4ICZzZDBfY2Q+OwogCWJ1cy13aWR0aCA9IDw4PjsKIAljYXAtbW1jLWhpZ2hzcGVlZDsKIAltbWMtaHMyMDAtMV84djsKLQltbWMtaHM0MDAtMV84djsKIAl2bW1jLXN1cHBseSA9IDwmbGRvMjBfcmVnPjsKIAl2cW1tYy1zdXBwbHkgPSA8JmxkbzExX3JlZz47CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnFkbC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnFkbC5kdHNpCmluZGV4IGI2MjBhYzguLmIxM2IwYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZxZGwuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg2cWRsLmR0c2kKQEAgLTI0Myw3ICsyNDMsNyBAQAogCQkJCQljbG9ja3MgPSA8JmNsa3MgSU1YNlFETF9DTEtfU1BESUZfR0NMSz4sIDwmY2xrcyBJTVg2UURMX0NMS19PU0M+LAogCQkJCQkJIDwmY2xrcyBJTVg2UURMX0NMS19TUERJRj4sIDwmY2xrcyBJTVg2UURMX0NMS19BU1JDPiwKIAkJCQkJCSA8JmNsa3MgSU1YNlFETF9DTEtfRFVNTVk+LCA8JmNsa3MgSU1YNlFETF9DTEtfRVNBSV9FWFRBTD4sCi0JCQkJCQkgPCZjbGtzIElNWDZRRExfQ0xLX0lQRz4sIDwmY2xrcyBJTVg2UURMX0NMS19NTEI+LAorCQkJCQkJIDwmY2xrcyBJTVg2UURMX0NMS19JUEc+LCA8JmNsa3MgSU1YNlFETF9DTEtfRFVNTVk+LAogCQkJCQkJIDwmY2xrcyBJTVg2UURMX0NMS19EVU1NWT4sIDwmY2xrcyBJTVg2UURMX0NMS19TUEJBPjsKIAkJCQkJY2xvY2stbmFtZXMgPSAiY29yZSIsICAicnh0eDAiLAogCQkJCQkJICAgICAgInJ4dHgxIiwgInJ4dHgyIiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZzeC1zYWJyZWF1dG8uZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnN4LXNhYnJlYXV0by5kdHMKaW5kZXggOTZlYTkzNi4uMjQwYTI4NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnN4LXNhYnJlYXV0by5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnN4LXNhYnJlYXV0by5kdHMKQEAgLTY0LDcgKzY0LDcgQEAKIAljZC1ncGlvcyA9IDwmZ3BpbzcgMTEgR1BJT19BQ1RJVkVfTE9XPjsKIAluby0xLTgtdjsKIAlrZWVwLXBvd2VyLWluLXN1c3BlbmQ7Ci0JZW5hYmxlLXNkaW8td2FrdXA7CisJd2FrZXVwLXNvdXJjZTsKIAlzdGF0dXMgPSAib2theSI7CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg3ZC1zZGIuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14N2Qtc2RiLmR0cwppbmRleCA5NWVlMjY4Li4yZjMzYzQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9pbXg3ZC1zZGIuZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDdkLXNkYi5kdHMKQEAgLTEzMSw3ICsxMzEsNyBAQAogCQl0aSx5LW1pbiA9IC9iaXRzLyAxNiA8MD47CiAJCXRpLHktbWF4ID0gL2JpdHMvIDE2IDwwPjsKIAkJdGkscHJlc3N1cmUtbWF4ID0gL2JpdHMvIDE2IDwwPjsKLQkJdGkseC1wbGF0LW9obXMgPSAvYml0cy8gMTYgPDQwMD47CisJCXRpLHgtcGxhdGUtb2htcyA9IC9iaXRzLyAxNiA8NDAwPjsKIAkJd2FrZXVwLXNvdXJjZTsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2tpcmt3b29kLWliNjJ4MC5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9raXJrd29vZC1pYjYyeDAuZHRzCmluZGV4IGVmODRkODYuLjViZjYyODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2tpcmt3b29kLWliNjJ4MC5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMva2lya3dvb2QtaWI2MngwLmR0cwpAQCAtMTEzLDcgKzExMyw3IEBACiAKIAlwYXJ0aXRpb25AZTAwMDAgewogCQlsYWJlbCA9ICJ1LWJvb3QgZW52aXJvbm1lbnQiOwotCQlyZWcgPSA8MHhlMDAwMCAweDEwMDAwMD47CisJCXJlZyA9IDwweGUwMDAwIDB4MjAwMDA+OwogCX07CiAKIAlwYXJ0aXRpb25AMTAwMDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2tpcmt3b29kLW9wZW5yZC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMva2lya3dvb2Qtb3BlbnJkLmR0c2kKaW5kZXggZTRlY2FiMS4uNzE3NTUxMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMva2lya3dvb2Qtb3BlbnJkLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMva2lya3dvb2Qtb3BlbnJkLmR0c2kKQEAgLTExNiw2ICsxMTYsMTAgQEAKIAl9OwogfTsKIAorJnBjaWVjIHsKKwlzdGF0dXMgPSAib2theSI7Cit9OworCiAmcGNpZTAgewogCXN0YXR1cyA9ICJva2F5IjsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9sb2dpY3BkLXNvbS1sdi5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvbG9naWNwZC1zb20tbHYuZHRzaQppbmRleCAzNjVmMzlmZi4uMGZmMWMyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbG9naWNwZC1zb20tbHYuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9sb2dpY3BkLXNvbS1sdi5kdHNpCkBAIC0zNSwxMCArMzUsMTUgQEAKIAlyYW5nZXMgPSA8MCAwIDB4MDAwMDAwMDAgMHgxMDAwMDAwPjsJLyogQ1MwOiAxNk1CIGZvciBOQU5EICovCiAKIAluYW5kQDAsMCB7Ci0JCWxpbnV4LG10ZC1uYW1lID0gIm1pY3JvbixtdDI5ZjRnMTZhYmJkYTN3IjsKKwkJY29tcGF0aWJsZSA9ICJ0aSxvbWFwMi1uYW5kIjsKIAkJcmVnID0gPDAgMCA0PjsgLyogQ1MwLCBvZmZzZXQgMCwgSU8gc2l6ZSA0ICovCisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdwbWM+OworCQlpbnRlcnJ1cHRzID0gPDAgSVJRX1RZUEVfTk9ORT4sIC8qIGZpZm9ldmVudCAqLworCQkJICAgICA8MSBJUlFfVFlQRV9OT05FPjsJLyogdGVybWNvdW50ICovCisJCWxpbnV4LG10ZC1uYW1lID0gIm1pY3JvbixtdDI5ZjRnMTZhYmJkYTN3IjsKIAkJbmFuZC1idXMtd2lkdGggPSA8MTY+OwogCQl0aSxuYW5kLWVjYy1vcHQgPSAiYmNoOCI7CisJCXJiLWdwaW9zID0gPCZncG1jIDAgR1BJT19BQ1RJVkVfSElHSD47IC8qIGdwbWNfd2FpdDAgKi8KIAkJZ3BtYyxzeW5jLWNsay1wcyA9IDwwPjsKIAkJZ3BtYyxjcy1vbi1ucyA9IDwwPjsKIAkJZ3BtYyxjcy1yZC1vZmYtbnMgPSA8NDQ+OwpAQCAtNTQsMTAgKzU5LDYgQEAKIAkJZ3BtYyx3ci1hY2Nlc3MtbnMgPSA8NDA+OwogCQlncG1jLHdyLWRhdGEtbXV4LWJ1cy1ucyA9IDwwPjsKIAkJZ3BtYyxkZXZpY2Utd2lkdGggPSA8Mj47Ci0KLQkJZ3BtYyxwYWdlLWJ1cnN0LWFjY2Vzcy1ucyA9IDw1PjsKLQkJZ3BtYyxjeWNsZTJjeWNsZS1kZWxheS1ucyA9IDw1MD47Ci0KIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDE+OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9sb2dpY3BkLXRvcnBlZG8tc29tLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9sb2dpY3BkLXRvcnBlZG8tc29tLmR0c2kKaW5kZXggNWU5YTEzYy4uMWMyYzc0NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbG9naWNwZC10b3JwZWRvLXNvbS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2xvZ2ljcGQtdG9ycGVkby1zb20uZHRzaQpAQCAtNDYsNiArNDYsNyBAQAogCQlsaW51eCxtdGQtbmFtZSA9ICJtaWNyb24sbXQyOWY0ZzE2YWJiZGEzdyI7CiAJCW5hbmQtYnVzLXdpZHRoID0gPDE2PjsKIAkJdGksbmFuZC1lY2Mtb3B0ID0gImJjaDgiOworCQlyYi1ncGlvcyA9IDwmZ3BtYyAwIEdQSU9fQUNUSVZFX0hJR0g+OyAvKiBncG1jX3dhaXQwICovCiAJCWdwbWMsc3luYy1jbGstcHMgPSA8MD47CiAJCWdwbWMsY3Mtb24tbnMgPSA8MD47CiAJCWdwbWMsY3MtcmQtb2ZmLW5zID0gPDQ0PjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLW92ZXJvLWJhc2UuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLW92ZXJvLWJhc2UuZHRzaQppbmRleCBkZTI1NmZhLi4zZTk0NmNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9vbWFwMy1vdmVyby1iYXNlLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMtb3Zlcm8tYmFzZS5kdHNpCkBAIC0yMjMsNyArMjIzLDkgQEAKIH07CiAKICZncG1jIHsKLQlyYW5nZXMgPSA8MCAwIDB4MDAwMDAwMDAgMHgyMDAwMDAwMD47CisJcmFuZ2VzID0gPDAgMCAweDMwMDAwMDAwIDB4MTAwMDAwMD4sCS8qIENTMCAqLworCQkgPDQgMCAweDJiMDAwMDAwIDB4MTAwMDAwMD4sCS8qIENTNCAqLworCQkgPDUgMCAweDJjMDAwMDAwIDB4MTAwMDAwMD47CS8qIENTNSAqLwogCiAJbmFuZEAwLDAgewogCQljb21wYXRpYmxlID0gInRpLG9tYXAyLW5hbmQiOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMtb3Zlcm8tY2hlc3RudXQ0My1jb21tb24uZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLW92ZXJvLWNoZXN0bnV0NDMtY29tbW9uLmR0c2kKaW5kZXggN2RmMjc5Mi4uNGY0YzZlZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMtb3Zlcm8tY2hlc3RudXQ0My1jb21tb24uZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwMy1vdmVyby1jaGVzdG51dDQzLWNvbW1vbi5kdHNpCkBAIC01NSw4ICs1NSw2IEBACiAjaW5jbHVkZSAib21hcC1ncG1jLXNtc2M5MjIxLmR0c2kiCiAKICZncG1jIHsKLQlyYW5nZXMgPSA8NSAwIDB4MmMwMDAwMDAgMHgxMDAwMDAwPjsJLyogQ1M1ICovCi0KIAlldGhlcm5ldEBncG1jIHsKIAkJcmVnID0gPDUgMCAweGZmPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ3BpbzY+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMtb3Zlcm8tdG9iaS1jb21tb24uZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLW92ZXJvLXRvYmktY29tbW9uLmR0c2kKaW5kZXggOWUyNGI2YS4uMWIzMDRlMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMtb3Zlcm8tdG9iaS1jb21tb24uZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwMy1vdmVyby10b2JpLWNvbW1vbi5kdHNpCkBAIC0yNyw4ICsyNyw2IEBACiAjaW5jbHVkZSAib21hcC1ncG1jLXNtc2M5MjIxLmR0c2kiCiAKICZncG1jIHsKLQlyYW5nZXMgPSA8NSAwIDB4MmMwMDAwMDAgMHgxMDAwMDAwPjsJLyogQ1M1ICovCi0KIAlldGhlcm5ldEBncG1jIHsKIAkJcmVnID0gPDUgMCAweGZmPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ3BpbzY+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMtb3Zlcm8tdG9iaWR1by1jb21tb24uZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLW92ZXJvLXRvYmlkdW8tY29tbW9uLmR0c2kKaW5kZXggMzM0MTA5ZS4uODJlOThlZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMtb3Zlcm8tdG9iaWR1by1jb21tb24uZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwMy1vdmVyby10b2JpZHVvLWNvbW1vbi5kdHNpCkBAIC0xNSw5ICsxNSw2IEBACiAjaW5jbHVkZSAib21hcC1ncG1jLXNtc2M5MjIxLmR0c2kiCiAKICZncG1jIHsKLQlyYW5nZXMgPSA8NCAwIDB4MmIwMDAwMDAgMHgxMDAwMDAwPiwJLyogQ1M0ICovCi0JCSA8NSAwIDB4MmMwMDAwMDAgMHgxMDAwMDAwPjsJLyogQ1M1ICovCi0KIAlzbXNjMTogZXRoZXJuZXRAZ3BtYyB7CiAJCXJlZyA9IDw1IDAgMHhmZj47CiAJCWludGVycnVwdC1wYXJlbnQgPSA8JmdwaW82PjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3JrMzA2NmEuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3JrMzA2NmEuZHRzaQppbmRleCBjMGJhODZjLi4wZDBkYWUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9yazMwNjZhLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvcmszMDY2YS5kdHNpCkBAIC0xOTcsNiArMTk3LDggQEAKIAkJY2xvY2stbmFtZXMgPSAic2FyYWRjIiwgImFwYl9wY2xrIjsKIAkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDIxIElSUV9UWVBFX0xFVkVMX0hJR0g+OwogCQkjaW8tY2hhbm5lbC1jZWxscyA9IDwxPjsKKwkJcmVzZXRzID0gPCZjcnUgU1JTVF9TQVJBREM+OworCQlyZXNldC1uYW1lcyA9ICJzYXJhZGMtYXBiIjsKIAkJc3RhdHVzID0gImRpc2FibGVkIjsKIAl9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9yazMyODguZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3JrMzI4OC5kdHNpCmluZGV4IGNkMzNmMDEuLjkxYzRiM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3JrMzI4OC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3JrMzI4OC5kdHNpCkBAIC0yNzksNiArMjc5LDggQEAKIAkJI2lvLWNoYW5uZWwtY2VsbHMgPSA8MT47CiAJCWNsb2NrcyA9IDwmY3J1IFNDTEtfU0FSQURDPiwgPCZjcnUgUENMS19TQVJBREM+OwogCQljbG9jay1uYW1lcyA9ICJzYXJhZGMiLCAiYXBiX3BjbGsiOworCQlyZXNldHMgPSA8JmNydSBTUlNUX1NBUkFEQz47CisJCXJlc2V0LW5hbWVzID0gInNhcmFkYy1hcGIiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3JrM3h4eC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvcmszeHh4LmR0c2kKaW5kZXggOTliYmNjMi4uZTJjZDY4MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvcmszeHh4LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvcmszeHh4LmR0c2kKQEAgLTM5OSw2ICszOTksOCBAQAogCQkjaW8tY2hhbm5lbC1jZWxscyA9IDwxPjsKIAkJY2xvY2tzID0gPCZjcnUgU0NMS19TQVJBREM+LCA8JmNydSBQQ0xLX1NBUkFEQz47CiAJCWNsb2NrLW5hbWVzID0gInNhcmFkYyIsICJhcGJfcGNsayI7CisJCXJlc2V0cyA9IDwmY3J1IFNSU1RfU0FSQURDPjsKKwkJcmVzZXQtbmFtZXMgPSAic2FyYWRjLWFwYiI7CiAJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvc29jZnBnYV9hcnJpYTEwLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zb2NmcGdhX2FycmlhMTAuZHRzaQppbmRleCA5NDAwMGNiLi5mNTIwY2JmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9zb2NmcGdhX2FycmlhMTAuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9zb2NmcGdhX2FycmlhMTAuZHRzaQpAQCAtNjM5LDYgKzYzOSwyMiBAQAogCQkJCWludGVycnVwdHMgPSA8NSBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKIAkJCQkJICAgICA8MzcgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAJCQl9OworCisJCQlkbWEtZWNjQGZmOGM4MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImFsdHIsc29jZnBnYS1kbWEtZWNjIjsKKwkJCQlyZWcgPSA8MHhmZjhjODAwMCAweDQwMD47CisJCQkJYWx0cixlY2MtcGFyZW50ID0gPCZwZG1hPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEwIElSUV9UWVBFX0xFVkVMX0hJR0g+LAorCQkJCQkgICAgIDw0MiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCX07CisKKwkJCXVzYjAtZWNjQGZmOGM4ODAwIHsKKwkJCQljb21wYXRpYmxlID0gImFsdHIsc29jZnBnYS11c2ItZWNjIjsKKwkJCQlyZWcgPSA8MHhmZjhjODgwMCAweDQwMD47CisJCQkJYWx0cixlY2MtcGFyZW50ID0gPCZ1c2IwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJCSAgICAgPDM0IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkJfTsKIAkJfTsKIAogCQlyc3Q6IHJzdG1nckBmZmQwNTAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zb2NmcGdhX2FycmlhMTBfc29jZGtfc2RtbWMuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvc29jZnBnYV9hcnJpYTEwX3NvY2RrX3NkbW1jLmR0cwppbmRleCA4YTdkZmE0Li4wNDBhMTY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9zb2NmcGdhX2FycmlhMTBfc29jZGtfc2RtbWMuZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3NvY2ZwZ2FfYXJyaWExMF9zb2Nka19zZG1tYy5kdHMKQEAgLTI1LDMgKzI1LDE1IEBACiAJYnJva2VuLWNkOwogCWJ1cy13aWR0aCA9IDw0PjsKIH07CisKKyZlY2NtZ3IgeworCXNkbW1jYS1lY2NAZmY4YzJjMDAgeworCQljb21wYXRpYmxlID0gImFsdHIsc29jZnBnYS1zZG1tYy1lY2MiOworCQlyZWcgPSA8MHhmZjhjMmMwMCAweDQwMD47CisJCWFsdHIsZWNjLXBhcmVudCA9IDwmbW1jPjsKKwkJaW50ZXJydXB0cyA9IDwxNSBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJCSAgICAgPDQ3IElSUV9UWVBFX0xFVkVMX0hJR0g+LAorCQkJICAgICA8MTYgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkgICAgIDw0OCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N0aWg0MDctZmFtaWx5LmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zdGloNDA3LWZhbWlseS5kdHNpCmluZGV4IGQyOTRlODIuLjhiMDYzYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N0aWg0MDctZmFtaWx5LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3RpaDQwNy1mYW1pbHkuZHRzaQpAQCAtNTUwLDggKzU1MCw5IEBACiAJCQlpbnRlcnJ1cHQtbmFtZXMgPSAibW1jaXJxIjsKIAkJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CiAJCQlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfbW1jMD47Ci0JCQljbG9jay1uYW1lcyA9ICJtbWMiOwotCQkJY2xvY2tzID0gPCZjbGtfc19jMF9mbGV4Z2VuIENMS19NTUNfMD47CisJCQljbG9jay1uYW1lcyA9ICJtbWMiLCAiaWNuIjsKKwkJCWNsb2NrcyA9IDwmY2xrX3NfYzBfZmxleGdlbiBDTEtfTU1DXzA+LAorCQkJCSA8JmNsa19zX2MwX2ZsZXhnZW4gQ0xLX1JYX0lDTl9IVkE+OwogCQkJYnVzLXdpZHRoID0gPDg+OwogCQkJbm9uLXJlbW92YWJsZTsKIAkJfTsKQEAgLTU2NSw4ICs1NjYsOSBAQAogCQkJaW50ZXJydXB0LW5hbWVzID0gIm1tY2lycSI7CiAJCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOwogCQkJcGluY3RybC0wID0gPCZwaW5jdHJsX3NkMT47Ci0JCQljbG9jay1uYW1lcyA9ICJtbWMiOwotCQkJY2xvY2tzID0gPCZjbGtfc19jMF9mbGV4Z2VuIENMS19NTUNfMT47CisJCQljbG9jay1uYW1lcyA9ICJtbWMiLCAiaWNuIjsKKwkJCWNsb2NrcyA9IDwmY2xrX3NfYzBfZmxleGdlbiBDTEtfTU1DXzE+LAorCQkJCSA8JmNsa19zX2MwX2ZsZXhnZW4gQ0xLX1JYX0lDTl9IVkE+OwogCQkJcmVzZXRzID0gPCZzb2Z0cmVzZXQgU1RJSDQwN19NTUMxX1NPRlRSRVNFVD47CiAJCQlidXMtd2lkdGggPSA8ND47CiAJCX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zdGloNDEwLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zdGloNDEwLmR0c2kKaW5kZXggMThlZDFhZC4uNDAzMTg4NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvc3RpaDQxMC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N0aWg0MTAuZHRzaQpAQCAtNDEsNyArNDEsOCBAQAogCQkJY29tcGF0aWJsZSA9ICJzdCxzdC1vaGNpLTMwMHgiOwogCQkJcmVnID0gPDB4OWEwM2MwMCAweDEwMD47CiAJCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMTgwIElSUV9UWVBFX05PTkU+OwotCQkJY2xvY2tzID0gPCZjbGtfc19jMF9mbGV4Z2VuIENMS19UWF9JQ05fRElTUF8wPjsKKwkJCWNsb2NrcyA9IDwmY2xrX3NfYzBfZmxleGdlbiBDTEtfVFhfSUNOX0RJU1BfMD4sCisJCQkJIDwmY2xrX3NfYzBfZmxleGdlbiBDTEtfUlhfSUNOX0RJU1BfMD47CiAJCQlyZXNldHMgPSA8JnBvd2VyZG93biBTVElINDA3X1VTQjJfUE9SVDBfUE9XRVJET1dOPiwKIAkJCQkgPCZzb2Z0cmVzZXQgU1RJSDQwN19VU0IyX1BPUlQwX1NPRlRSRVNFVD47CiAJCQlyZXNldC1uYW1lcyA9ICJwb3dlciIsICJzb2Z0cmVzZXQiOwpAQCAtNTcsNyArNTgsOCBAQAogCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDE1MSBJUlFfVFlQRV9OT05FPjsKIAkJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CiAJCQlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfdXNiMD47Ci0JCQljbG9ja3MgPSA8JmNsa19zX2MwX2ZsZXhnZW4gQ0xLX1RYX0lDTl9ESVNQXzA+OworCQkJY2xvY2tzID0gPCZjbGtfc19jMF9mbGV4Z2VuIENMS19UWF9JQ05fRElTUF8wPiwKKwkJCQkgPCZjbGtfc19jMF9mbGV4Z2VuIENMS19SWF9JQ05fRElTUF8wPjsKIAkJCXJlc2V0cyA9IDwmcG93ZXJkb3duIFNUSUg0MDdfVVNCMl9QT1JUMF9QT1dFUkRPV04+LAogCQkJCSA8JnNvZnRyZXNldCBTVElINDA3X1VTQjJfUE9SVDBfU09GVFJFU0VUPjsKIAkJCXJlc2V0LW5hbWVzID0gInBvd2VyIiwgInNvZnRyZXNldCI7CkBAIC03MSw3ICs3Myw4IEBACiAJCQljb21wYXRpYmxlID0gInN0LHN0LW9oY2ktMzAweCI7CiAJCQlyZWcgPSA8MHg5YTgzYzAwIDB4MTAwPjsKIAkJCWludGVycnVwdHMgPSA8R0lDX1NQSSAxODEgSVJRX1RZUEVfTk9ORT47Ci0JCQljbG9ja3MgPSA8JmNsa19zX2MwX2ZsZXhnZW4gQ0xLX1RYX0lDTl9ESVNQXzA+OworCQkJY2xvY2tzID0gPCZjbGtfc19jMF9mbGV4Z2VuIENMS19UWF9JQ05fRElTUF8wPiwKKwkJCQkgPCZjbGtfc19jMF9mbGV4Z2VuIENMS19SWF9JQ05fRElTUF8wPjsKIAkJCXJlc2V0cyA9IDwmcG93ZXJkb3duIFNUSUg0MDdfVVNCMl9QT1JUMV9QT1dFUkRPV04+LAogCQkJCSA8JnNvZnRyZXNldCBTVElINDA3X1VTQjJfUE9SVDFfU09GVFJFU0VUPjsKIAkJCXJlc2V0LW5hbWVzID0gInBvd2VyIiwgInNvZnRyZXNldCI7CkBAIC04Nyw3ICs5MCw4IEBACiAJCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMTUzIElSUV9UWVBFX05PTkU+OwogCQkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAkJCXBpbmN0cmwtMCA9IDwmcGluY3RybF91c2IxPjsKLQkJCWNsb2NrcyA9IDwmY2xrX3NfYzBfZmxleGdlbiBDTEtfVFhfSUNOX0RJU1BfMD47CisJCQljbG9ja3MgPSA8JmNsa19zX2MwX2ZsZXhnZW4gQ0xLX1RYX0lDTl9ESVNQXzA+LAorCQkJCSA8JmNsa19zX2MwX2ZsZXhnZW4gQ0xLX1JYX0lDTl9ESVNQXzA+OwogCQkJcmVzZXRzID0gPCZwb3dlcmRvd24gU1RJSDQwN19VU0IyX1BPUlQxX1BPV0VSRE9XTj4sCiAJCQkJIDwmc29mdHJlc2V0IFNUSUg0MDdfVVNCMl9QT1JUMV9TT0ZUUkVTRVQ+OwogCQkJcmVzZXQtbmFtZXMgPSAicG93ZXIiLCAic29mdHJlc2V0IjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N0bTMyZjQyOS5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3RtMzJmNDI5LmR0c2kKaW5kZXggMzVkZjQ2Mi4uMWExODlkNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvc3RtMzJmNDI5LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3RtMzJmNDI5LmR0c2kKQEAgLTE3Niw2ICsxNzYsMTQgQEAKIAkJCXJlZyA9IDwweDQwMDEzODAwIDB4NDAwPjsKIAkJfTsKIAorCQlleHRpOiBpbnRlcnJ1cHQtY29udHJvbGxlckA0MDAxM2MwMCB7CisJCQljb21wYXRpYmxlID0gInN0LHN0bTMyLWV4dGkiOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJcmVnID0gPDB4NDAwMTNDMDAgMHg0MDA+OworCQkJaW50ZXJydXB0cyA9IDwxPiwgPDI+LCA8Mz4sIDw2PiwgPDc+LCA8OD4sIDw5PiwgPDEwPiwgPDIzPiwgPDQwPiwgPDQxPiwgPDQyPiwgPDYyPiwgPDc2PjsKKwkJfTsKKwogCQlwaW4tY29udHJvbGxlciB7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDE+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNWktYTEzLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTMuZHRzaQppbmRleCBlMDEyODkwLi5hMTdiYTAyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTMuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTMuZHRzaQpAQCAtODQsNyArODQsNyBAQAogCQkJdHJpcHMgewogCQkJCWNwdV9hbGVydDA6IGNwdV9hbGVydDAgewogCQkJCQkvKiBtaWxsaUNlbHNpdXMgKi8KLQkJCQkJdGVtcGVyYXR1cmUgPSA8ODUwMDAwPjsKKwkJCQkJdGVtcGVyYXR1cmUgPSA8ODUwMDA+OwogCQkJCQloeXN0ZXJlc2lzID0gPDIwMDA+OwogCQkJCQl0eXBlID0gInBhc3NpdmUiOwogCQkJCX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zdW42aS1hMzEuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjZpLWEzMS5kdHNpCmluZGV4IDE4NjdhZjIuLjBkMjRmMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjZpLWEzMS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjZpLWEzMS5kdHNpCkBAIC00NjksNyArNDY5LDcgQEAKIAkJfTsKIAogCQltbWMwOiBtbWNAMDFjMGYwMDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNWktYTEzLW1tYyI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW43aS1hMjAtbW1jIjsKIAkJCXJlZyA9IDwweDAxYzBmMDAwIDB4MTAwMD47CiAJCQljbG9ja3MgPSA8JmFoYjFfZ2F0ZXMgOD4sCiAJCQkJIDwmbW1jMF9jbGsgMD4sCkBAIC00ODgsNyArNDg4LDcgQEAKIAkJfTsKIAogCQltbWMxOiBtbWNAMDFjMTAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNWktYTEzLW1tYyI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW43aS1hMjAtbW1jIjsKIAkJCXJlZyA9IDwweDAxYzEwMDAwIDB4MTAwMD47CiAJCQljbG9ja3MgPSA8JmFoYjFfZ2F0ZXMgOT4sCiAJCQkJIDwmbW1jMV9jbGsgMD4sCkBAIC01MDcsNyArNTA3LDcgQEAKIAkJfTsKIAogCQltbWMyOiBtbWNAMDFjMTEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNWktYTEzLW1tYyI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW43aS1hMjAtbW1jIjsKIAkJCXJlZyA9IDwweDAxYzExMDAwIDB4MTAwMD47CiAJCQljbG9ja3MgPSA8JmFoYjFfZ2F0ZXMgMTA+LAogCQkJCSA8Jm1tYzJfY2xrIDA+LApAQCAtNTI2LDcgKzUyNiw3IEBACiAJCX07CiAKIAkJbW1jMzogbW1jQDAxYzEyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLW1tYyI7CiAJCQlyZWcgPSA8MHgwMWMxMjAwMCAweDEwMDA+OwogCQkJY2xvY2tzID0gPCZhaGIxX2dhdGVzIDExPiwKIAkJCQkgPCZtbWMzX2NsayAwPiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjdpLWEyMC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuN2ktYTIwLmR0c2kKaW5kZXggYmQwYzQ3Ni4uOTRjZjVhMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuN2ktYTIwLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuN2ktYTIwLmR0c2kKQEAgLTkwNSw3ICs5MDUsNyBAQAogCQl9OwogCiAJCW1tYzA6IG1tY0AwMWMwZjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW41aS1hMTMtbW1jIjsKKwkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjdpLWEyMC1tbWMiOwogCQkJcmVnID0gPDB4MDFjMGYwMDAgMHgxMDAwPjsKIAkJCWNsb2NrcyA9IDwmYWhiX2dhdGVzIDg+LAogCQkJCSA8Jm1tYzBfY2xrIDA+LApAQCAtOTIyLDcgKzkyMiw3IEBACiAJCX07CiAKIAkJbW1jMTogbW1jQDAxYzEwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLW1tYyI7CiAJCQlyZWcgPSA8MHgwMWMxMDAwMCAweDEwMDA+OwogCQkJY2xvY2tzID0gPCZhaGJfZ2F0ZXMgOT4sCiAJCQkJIDwmbW1jMV9jbGsgMD4sCkBAIC05MzksNyArOTM5LDcgQEAKIAkJfTsKIAogCQltbWMyOiBtbWNAMDFjMTEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNWktYTEzLW1tYyI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW43aS1hMjAtbW1jIjsKIAkJCXJlZyA9IDwweDAxYzExMDAwIDB4MTAwMD47CiAJCQljbG9ja3MgPSA8JmFoYl9nYXRlcyAxMD4sCiAJCQkJIDwmbW1jMl9jbGsgMD4sCkBAIC05NTYsNyArOTU2LDcgQEAKIAkJfTsKIAogCQltbWMzOiBtbWNAMDFjMTIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNWktYTEzLW1tYyI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW43aS1hMjAtbW1jIjsKIAkJCXJlZyA9IDwweDAxYzEyMDAwIDB4MTAwMD47CiAJCQljbG9ja3MgPSA8JmFoYl9nYXRlcyAxMT4sCiAJCQkJIDwmbW1jM19jbGsgMD4sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zdW44aS1hMjMtYTMzLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zdW44aS1hMjMtYTMzLmR0c2kKaW5kZXggN2UwNWUwOS4uZTNiMTk2ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuOGktYTIzLWEzMy5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjhpLWEyMy1hMzMuZHRzaQpAQCAtMjY2LDcgKzI2Niw3IEBACiAJCX07CiAKIAkJbW1jMDogbW1jQDAxYzBmMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLW1tYyI7CiAJCQlyZWcgPSA8MHgwMWMwZjAwMCAweDEwMDA+OwogCQkJY2xvY2tzID0gPCZhaGIxX2dhdGVzIDg+LAogCQkJCSA8Jm1tYzBfY2xrIDA+LApAQCAtMjg1LDcgKzI4NSw3IEBACiAJCX07CiAKIAkJbW1jMTogbW1jQDAxYzEwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLW1tYyI7CiAJCQlyZWcgPSA8MHgwMWMxMDAwMCAweDEwMDA+OwogCQkJY2xvY2tzID0gPCZhaGIxX2dhdGVzIDk+LAogCQkJCSA8Jm1tYzFfY2xrIDA+LApAQCAtMzA0LDcgKzMwNCw3IEBACiAJCX07CiAKIAkJbW1jMjogbW1jQDAxYzExMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLW1tYyI7CiAJCQlyZWcgPSA8MHgwMWMxMTAwMCAweDEwMDA+OwogCQkJY2xvY2tzID0gPCZhaGIxX2dhdGVzIDEwPiwKIAkJCQkgPCZtbWMyX2NsayAwPiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjhpLWgzLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zdW44aS1oMy5kdHNpCmluZGV4IGZkZjlmZGIuLjhhOTVlMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjhpLWgzLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuOGktaDMuZHRzaQpAQCAtMTUwLDcgKzE1MCw3IEBACiAJCX07CiAKIAkJbW1jMDogbW1jQDAxYzBmMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLW1tYyI7CiAJCQlyZWcgPSA8MHgwMWMwZjAwMCAweDEwMDA+OwogCQkJY2xvY2tzID0gPCZjY3UgQ0xLX0JVU19NTUMwPiwKIAkJCQkgPCZjY3UgQ0xLX01NQzA+LApAQCAtMTY5LDcgKzE2OSw3IEBACiAJCX07CiAKIAkJbW1jMTogbW1jQDAxYzEwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLW1tYyI7CiAJCQlyZWcgPSA8MHgwMWMxMDAwMCAweDEwMDA+OwogCQkJY2xvY2tzID0gPCZjY3UgQ0xLX0JVU19NTUMxPiwKIAkJCQkgPCZjY3UgQ0xLX01NQzE+LApAQCAtMTg4LDcgKzE4OCw3IEBACiAJCX07CiAKIAkJbW1jMjogbW1jQDAxYzExMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLW1tYyI7CiAJCQlyZWcgPSA8MHgwMWMxMTAwMCAweDEwMDA+OwogCQkJY2xvY2tzID0gPCZjY3UgQ0xLX0JVU19NTUMyPiwKIAkJCQkgPCZjY3UgQ0xLX01NQzI+LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMTQtZGFsbW9yZS5kdHMgYi9hcmNoL2FybS9ib290L2R0cy90ZWdyYTExNC1kYWxtb3JlLmR0cwppbmRleCAxZGZjNDkyLi4xNDQ0ZmJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy90ZWdyYTExNC1kYWxtb3JlLmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy90ZWdyYTExNC1kYWxtb3JlLmR0cwpAQCAtODk3LDcgKzg5Nyw3IEBACiAJCXBhbG1hczogdHBzNjU5MTNANTggewogCQkJY29tcGF0aWJsZSA9ICJ0aSxwYWxtYXMiOwogCQkJcmVnID0gPDB4NTg+OwotCQkJaW50ZXJydXB0cyA9IDwwIDg2IElSUV9UWVBFX0xFVkVMX0xPVz47CisJCQlpbnRlcnJ1cHRzID0gPDAgODYgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMTE0LXJvdGguZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMTQtcm90aC5kdHMKaW5kZXggNzBjZjQwOS4uOTY2YTdmYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMTQtcm90aC5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMTQtcm90aC5kdHMKQEAgLTgwMiw3ICs4MDIsNyBAQAogCQlwYWxtYXM6IHBtaWNANTggewogCQkJY29tcGF0aWJsZSA9ICJ0aSxwYWxtYXMiOwogCQkJcmVnID0gPDB4NTg+OwotCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDg2IElSUV9UWVBFX0xFVkVMX0xPVz47CisJCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgODYgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMTE0LXRuNy5kdHMgYi9hcmNoL2FybS9ib290L2R0cy90ZWdyYTExNC10bjcuZHRzCmluZGV4IDE3ZGQxNDUuLmExNjFmYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMTE0LXRuNy5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMTQtdG43LmR0cwpAQCAtNjMsNyArNjMsNyBAQAogCQlwYWxtYXM6IHBtaWNANTggewogCQkJY29tcGF0aWJsZSA9ICJ0aSxwYWxtYXMiOwogCQkJcmVnID0gPDB4NTg+OwotCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDg2IElSUV9UWVBFX0xFVkVMX0xPVz47CisJCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgODYgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMTI0LWpldHNvbi10azEuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMjQtamV0c29uLXRrMS5kdHMKaW5kZXggNjQwM2UwZC4uZTUyYjgyNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMjQtamV0c29uLXRrMS5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMjQtamV0c29uLXRrMS5kdHMKQEAgLTEzODIsNyArMTM4Miw3IEBACiAJICogICBQaW4gNDE6IEJSX1VBUlQxX1RYRAogCSAqICAgUGluIDQ0OiBCUl9VQVJUMV9SWEQKIAkgKi8KLQlzZXJpYWxAMCw3MDAwNjAwMCB7CisJc2VyaWFsQDcwMDA2MDAwIHsKIAkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmExMjQtaHN1YXJ0IiwgIm52aWRpYSx0ZWdyYTMwLWhzdWFydCI7CiAJCXN0YXR1cyA9ICJva2F5IjsKIAl9OwpAQCAtMTM5NCw3ICsxMzk0LDcgQEAKIAkgKiAgIFBpbiA3MTogVUFSVDJfQ1RTX0wKIAkgKiAgIFBpbiA3NDogVUFSVDJfUlRTX0wKIAkgKi8KLQlzZXJpYWxAMCw3MDAwNjA0MCB7CisJc2VyaWFsQDcwMDA2MDQwIHsKIAkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmExMjQtaHN1YXJ0IiwgIm52aWRpYSx0ZWdyYTMwLWhzdWFydCI7CiAJCXN0YXR1cyA9ICJva2F5IjsKIAl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2JMX3N3aXRjaGVyX2R1bW15X2lmLmMgYi9hcmNoL2FybS9jb21tb24vYkxfc3dpdGNoZXJfZHVtbXlfaWYuYwppbmRleCAzZjQ3ZjEyLi42MDUzZjY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vYkxfc3dpdGNoZXJfZHVtbXlfaWYuYworKysgYi9hcmNoL2FybS9jb21tb24vYkxfc3dpdGNoZXJfZHVtbXlfaWYuYwpAQCAtNTYsMTYgKzU2LDQgQEAKIAkiYi5MX3N3aXRjaGVyIiwKIAkmYkxfc3dpdGNoZXJfZm9wcwogfTsKLQotc3RhdGljIGludCBfX2luaXQgYkxfc3dpdGNoZXJfZHVtbXlfaWZfaW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZiTF9zd2l0Y2hlcl9kZXZpY2UpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYkxfc3dpdGNoZXJfZHVtbXlfaWZfZXhpdCh2b2lkKQotewotCW1pc2NfZGVyZWdpc3RlcigmYkxfc3dpdGNoZXJfZGV2aWNlKTsKLX0KLQotbW9kdWxlX2luaXQoYkxfc3dpdGNoZXJfZHVtbXlfaWZfaW5pdCk7Ci1tb2R1bGVfZXhpdChiTF9zd2l0Y2hlcl9kdW1teV9pZl9leGl0KTsKK21vZHVsZV9taXNjX2RldmljZShiTF9zd2l0Y2hlcl9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jIGIvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jCmluZGV4IDBlOTdiNGIuLjZjN2IwNjg1NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9sb2NvbW8uYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAKIHN0YXRpYyB2b2lkIGxvY29tb19oYW5kbGVyKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKLQlzdHJ1Y3QgbG9jb21vICpsY2hpcCA9IGlycV9kZXNjX2dldF9jaGlwX2RhdGEoZGVzYyk7CisJc3RydWN0IGxvY29tbyAqbGNoaXAgPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOwogCWludCByZXEsIGk7CiAKIAkvKiBBY2tub3dsZWRnZSB0aGUgcGFyZW50IElSUSAqLwpAQCAtMjAwLDggKzIwMCw3IEBACiAJICogSW5zdGFsbCBoYW5kbGVyIGZvciBJUlFfTE9DT01PX0hXLgogCSAqLwogCWlycV9zZXRfaXJxX3R5cGUobGNoaXAtPmlycSwgSVJRX1RZUEVfRURHRV9GQUxMSU5HKTsKLQlpcnFfc2V0X2NoaXBfZGF0YShsY2hpcC0+aXJxLCBsY2hpcCk7Ci0JaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIobGNoaXAtPmlycSwgbG9jb21vX2hhbmRsZXIpOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyX2FuZF9kYXRhKGxjaGlwLT5pcnEsIGxvY29tb19oYW5kbGVyLCBsY2hpcCk7CiAKIAkvKiBJbnN0YWxsIGhhbmRsZXJzIGZvciBJUlFfTE9DT01PXyogKi8KIAlmb3IgKCA7IGlycSA8PSBsY2hpcC0+aXJxX2Jhc2UgKyAzOyBpcnErKykgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jIGIvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jCmluZGV4IGZiMGEwYTQuLjRlY2Q1MTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYworKysgYi9hcmNoL2FybS9jb21tb24vc2ExMTExLmMKQEAgLTE1LDYgKzE1LDcgQEAKICAqIGZyb20gbWFjaGluZSBzcGVjaWZpYyBjb2RlIHdpdGggcHJvcGVyIGFyZ3VtZW50cyB3aGVuIHJlcXVpcmVkLgogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xMDcsNiArMTA4LDcgQEAKIAlzcGlubG9ja190CWxvY2s7CiAJdm9pZCBfX2lvbWVtCSpiYXNlOwogCXN0cnVjdCBzYTExMTFfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGdwaW9fY2hpcCBnYzsKICNpZmRlZiBDT05GSUdfUE0KIAl2b2lkCQkqc2F2ZWRfc3RhdGU7CiAjZW5kaWYKQEAgLTIzMSwzMCArMjMzLDQ0IEBACiAjZGVmaW5lIFNBMTExMV9JUlFNQVNLX0xPKHgpCSgxIDw8ICh4IC0gc2FjaGlwLT5pcnFfYmFzZSkpCiAjZGVmaW5lIFNBMTExMV9JUlFNQVNLX0hJKHgpCSgxIDw8ICh4IC0gc2FjaGlwLT5pcnFfYmFzZSAtIDMyKSkKIAorc3RhdGljIHUzMiBzYTExMTFfaXJxbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisKKwlyZXR1cm4gQklUKChkLT5pcnEgLSBzYWNoaXAtPmlycV9iYXNlKSAmIDMxKTsKK30KKworc3RhdGljIGludCBzYTExMTFfaXJxYmFuayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisKKwlyZXR1cm4gKChkLT5pcnEgLSBzYWNoaXAtPmlycV9iYXNlKSAvIDMyKSAqIDQ7Cit9CisKIHN0YXRpYyB2b2lkIHNhMTExMV9hY2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIH0KIAotc3RhdGljIHZvaWQgc2ExMTExX21hc2tfbG93aXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3N0YXRpYyB2b2lkIHNhMTExMV9tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CiAJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0Jdm9pZCBfX2lvbWVtICptYXBiYXNlID0gc2FjaGlwLT5iYXNlICsgU0ExMTExX0lOVEM7Ci0JdW5zaWduZWQgbG9uZyBpZTA7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gc2FjaGlwLT5iYXNlICsgU0ExMTExX0lOVEMgKyBzYTExMTFfaXJxYmFuayhkKTsKKwl1MzIgaWU7CiAKLQlpZTAgPSBzYTExMTFfcmVhZGwobWFwYmFzZSArIFNBMTExMV9JTlRFTjApOwotCWllMCAmPSB+U0ExMTExX0lSUU1BU0tfTE8oZC0+aXJxKTsKLQl3cml0ZWwoaWUwLCBtYXBiYXNlICsgU0ExMTExX0lOVEVOMCk7CisJaWUgPSBzYTExMTFfcmVhZGwobWFwYmFzZSArIFNBMTExMV9JTlRFTjApOworCWllICY9IH5zYTExMTFfaXJxbWFzayhkKTsKKwlzYTExMTFfd3JpdGVsKGllLCBtYXBiYXNlICsgU0ExMTExX0lOVEVOMCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNhMTExMV91bm1hc2tfbG93aXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3N0YXRpYyB2b2lkIHNhMTExMV91bm1hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQzsKLQl1bnNpZ25lZCBsb25nIGllMDsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQyArIHNhMTExMV9pcnFiYW5rKGQpOworCXUzMiBpZTsKIAotCWllMCA9IHNhMTExMV9yZWFkbChtYXBiYXNlICsgU0ExMTExX0lOVEVOMCk7Ci0JaWUwIHw9IFNBMTExMV9JUlFNQVNLX0xPKGQtPmlycSk7Ci0Jc2ExMTExX3dyaXRlbChpZTAsIG1hcGJhc2UgKyBTQTExMTFfSU5URU4wKTsKKwlpZSA9IHNhMTExMV9yZWFkbChtYXBiYXNlICsgU0ExMTExX0lOVEVOMCk7CisJaWUgfD0gc2ExMTExX2lycW1hc2soZCk7CisJc2ExMTExX3dyaXRlbChpZSwgbWFwYmFzZSArIFNBMTExMV9JTlRFTjApOwogfQogCiAvKgpAQCAtMjY0LDE4ICsyODAsMTcgQEAKICAqIGJlIHRyaWdnZXJlZC4gIEluIGZhY3QsIGl0cyB2ZXJ5IGRpZmZpY3VsdCwgaWYgbm90IGltcG9zc2libGUgdG8gZ2V0CiAgKiBJTlRTRVQgdG8gcmUtdHJpZ2dlciB0aGUgaW50ZXJydXB0LgogICovCi1zdGF0aWMgaW50IHNhMTExMV9yZXRyaWdnZXJfbG93aXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3N0YXRpYyBpbnQgc2ExMTExX3JldHJpZ2dlcl9pcnEoc3RydWN0IGlycV9kYXRhICpkKQogewogCXN0cnVjdCBzYTExMTEgKnNhY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IHNhY2hpcC0+YmFzZSArIFNBMTExMV9JTlRDOwotCXVuc2lnbmVkIGludCBtYXNrID0gU0ExMTExX0lSUU1BU0tfTE8oZC0+aXJxKTsKLQl1bnNpZ25lZCBsb25nIGlwMDsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQyArIHNhMTExMV9pcnFiYW5rKGQpOworCXUzMiBpcCwgbWFzayA9IHNhMTExMV9pcnFtYXNrKGQpOwogCWludCBpOwogCi0JaXAwID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfSU5UUE9MMCk7CisJaXAgPSBzYTExMTFfcmVhZGwobWFwYmFzZSArIFNBMTExMV9JTlRQT0wwKTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXNhMTExMV93cml0ZWwoaXAwIF4gbWFzaywgbWFwYmFzZSArIFNBMTExMV9JTlRQT0wwKTsKLQkJc2ExMTExX3dyaXRlbChpcDAsIG1hcGJhc2UgKyBTQTExMTFfSU5UUE9MMCk7CisJCXNhMTExMV93cml0ZWwoaXAgXiBtYXNrLCBtYXBiYXNlICsgU0ExMTExX0lOVFBPTDApOworCQlzYTExMTFfd3JpdGVsKGlwLCBtYXBiYXNlICsgU0ExMTExX0lOVFBPTDApOwogCQlpZiAoc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfSU5UU1RBVENMUjApICYgbWFzaykKIAkJCWJyZWFrOwogCX0KQEAgLTI4NiwxMiArMzAxLDExIEBACiAJcmV0dXJuIGkgPT0gOCA/IC0xIDogMDsKIH0KIAotc3RhdGljIGludCBzYTExMTFfdHlwZV9sb3dpcnEoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IHNhMTExMV90eXBlX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQzsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IFNBMTExMV9JUlFNQVNLX0xPKGQtPmlycSk7Ci0JdW5zaWduZWQgbG9uZyBpcDA7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gc2FjaGlwLT5iYXNlICsgU0ExMTExX0lOVEMgKyBzYTExMTFfaXJxYmFuayhkKTsKKwl1MzIgaXAsIG1hc2sgPSBzYTExMTFfaXJxbWFzayhkKTsKIAogCWlmIChmbGFncyA9PSBJUlFfVFlQRV9QUk9CRSkKIAkJcmV0dXJuIDA7CkBAIC0yOTksMTQ0ICszMTMsNDEgQEAKIAlpZiAoKCEoZmxhZ3MgJiBJUlFfVFlQRV9FREdFX1JJU0lORykgXiAhKGZsYWdzICYgSVJRX1RZUEVfRURHRV9GQUxMSU5HKSkgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpcDAgPSBzYTExMTFfcmVhZGwobWFwYmFzZSArIFNBMTExMV9JTlRQT0wwKTsKKwlpcCA9IHNhMTExMV9yZWFkbChtYXBiYXNlICsgU0ExMTExX0lOVFBPTDApOwogCWlmIChmbGFncyAmIElSUV9UWVBFX0VER0VfUklTSU5HKQotCQlpcDAgJj0gfm1hc2s7CisJCWlwICY9IH5tYXNrOwogCWVsc2UKLQkJaXAwIHw9IG1hc2s7Ci0Jc2ExMTExX3dyaXRlbChpcDAsIG1hcGJhc2UgKyBTQTExMTFfSU5UUE9MMCk7Ci0Jc2ExMTExX3dyaXRlbChpcDAsIG1hcGJhc2UgKyBTQTExMTFfV0FLRVBPTDApOworCQlpcCB8PSBtYXNrOworCXNhMTExMV93cml0ZWwoaXAsIG1hcGJhc2UgKyBTQTExMTFfSU5UUE9MMCk7CisJc2ExMTExX3dyaXRlbChpcCwgbWFwYmFzZSArIFNBMTExMV9XQUtFUE9MMCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzYTExMTFfd2FrZV9sb3dpcnEoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgb24pCitzdGF0aWMgaW50IHNhMTExMV93YWtlX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBvbikKIHsKIAlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQzsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IFNBMTExMV9JUlFNQVNLX0xPKGQtPmlycSk7Ci0JdW5zaWduZWQgbG9uZyB3ZTA7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gc2FjaGlwLT5iYXNlICsgU0ExMTExX0lOVEMgKyBzYTExMTFfaXJxYmFuayhkKTsKKwl1MzIgd2UsIG1hc2sgPSBzYTExMTFfaXJxbWFzayhkKTsKIAotCXdlMCA9IHNhMTExMV9yZWFkbChtYXBiYXNlICsgU0ExMTExX1dBS0VFTjApOworCXdlID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfV0FLRUVOMCk7CiAJaWYgKG9uKQotCQl3ZTAgfD0gbWFzazsKKwkJd2UgfD0gbWFzazsKIAllbHNlCi0JCXdlMCAmPSB+bWFzazsKLQlzYTExMTFfd3JpdGVsKHdlMCwgbWFwYmFzZSArIFNBMTExMV9XQUtFRU4wKTsKKwkJd2UgJj0gfm1hc2s7CisJc2ExMTExX3dyaXRlbCh3ZSwgbWFwYmFzZSArIFNBMTExMV9XQUtFRU4wKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIHNhMTExMV9sb3dfY2hpcCA9IHsKLQkubmFtZQkJPSAiU0ExMTExLWwiLAorc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzYTExMTFfaXJxX2NoaXAgPSB7CisJLm5hbWUJCT0gIlNBMTExMSIsCiAJLmlycV9hY2sJPSBzYTExMTFfYWNrX2lycSwKLQkuaXJxX21hc2sJPSBzYTExMTFfbWFza19sb3dpcnEsCi0JLmlycV91bm1hc2sJPSBzYTExMTFfdW5tYXNrX2xvd2lycSwKLQkuaXJxX3JldHJpZ2dlcgk9IHNhMTExMV9yZXRyaWdnZXJfbG93aXJxLAotCS5pcnFfc2V0X3R5cGUJPSBzYTExMTFfdHlwZV9sb3dpcnEsCi0JLmlycV9zZXRfd2FrZQk9IHNhMTExMV93YWtlX2xvd2lycSwKLX07Ci0KLXN0YXRpYyB2b2lkIHNhMTExMV9tYXNrX2hpZ2hpcnEoc3RydWN0IGlycV9kYXRhICpkKQotewotCXN0cnVjdCBzYTExMTEgKnNhY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IHNhY2hpcC0+YmFzZSArIFNBMTExMV9JTlRDOwotCXVuc2lnbmVkIGxvbmcgaWUxOwotCi0JaWUxID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfSU5URU4xKTsKLQlpZTEgJj0gflNBMTExMV9JUlFNQVNLX0hJKGQtPmlycSk7Ci0Jc2ExMTExX3dyaXRlbChpZTEsIG1hcGJhc2UgKyBTQTExMTFfSU5URU4xKTsKLX0KLQotc3RhdGljIHZvaWQgc2ExMTExX3VubWFza19oaWdoaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQzsKLQl1bnNpZ25lZCBsb25nIGllMTsKLQotCWllMSA9IHNhMTExMV9yZWFkbChtYXBiYXNlICsgU0ExMTExX0lOVEVOMSk7Ci0JaWUxIHw9IFNBMTExMV9JUlFNQVNLX0hJKGQtPmlycSk7Ci0Jc2ExMTExX3dyaXRlbChpZTEsIG1hcGJhc2UgKyBTQTExMTFfSU5URU4xKTsKLX0KLQotLyoKLSAqIEF0dGVtcHQgdG8gcmUtdHJpZ2dlciB0aGUgaW50ZXJydXB0LiAgVGhlIFNBMTExMSBjb250YWlucyBhIHJlZ2lzdGVyCi0gKiAoSU5UU0VUKSB3aGljaCBjbGFpbXMgdG8gZG8gdGhpcy4gIEhvd2V2ZXIsIGluIHByYWN0aWNlIG5vIGFtb3VudCBvZgotICogbWFuaXB1bGF0aW9uIG9mIElOVEVOIGFuZCBJTlRTRVQgZ3VhcmFudGVlcyB0aGF0IHRoZSBpbnRlcnJ1cHQgd2lsbAotICogYmUgdHJpZ2dlcmVkLiAgSW4gZmFjdCwgaXRzIHZlcnkgZGlmZmljdWx0LCBpZiBub3QgaW1wb3NzaWJsZSB0byBnZXQKLSAqIElOVFNFVCB0byByZS10cmlnZ2VyIHRoZSBpbnRlcnJ1cHQuCi0gKi8KLXN0YXRpYyBpbnQgc2ExMTExX3JldHJpZ2dlcl9oaWdoaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQzsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IFNBMTExMV9JUlFNQVNLX0hJKGQtPmlycSk7Ci0JdW5zaWduZWQgbG9uZyBpcDE7Ci0JaW50IGk7Ci0KLQlpcDEgPSBzYTExMTFfcmVhZGwobWFwYmFzZSArIFNBMTExMV9JTlRQT0wxKTsKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXNhMTExMV93cml0ZWwoaXAxIF4gbWFzaywgbWFwYmFzZSArIFNBMTExMV9JTlRQT0wxKTsKLQkJc2ExMTExX3dyaXRlbChpcDEsIG1hcGJhc2UgKyBTQTExMTFfSU5UUE9MMSk7Ci0JCWlmIChzYTExMTFfcmVhZGwobWFwYmFzZSArIFNBMTExMV9JTlRTVEFUQ0xSMSkgJiBtYXNrKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPT0gOCkKLQkJcHJfZXJyKCJEYW5nZXIgV2lsbCBSb2JpbnNvbjogZmFpbGVkIHRvIHJlLXRyaWdnZXIgSVJRJWRcbiIsCi0JCSAgICAgICBkLT5pcnEpOwotCXJldHVybiBpID09IDggPyAtMSA6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2ExMTExX3R5cGVfaGlnaGlycShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQzsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IFNBMTExMV9JUlFNQVNLX0hJKGQtPmlycSk7Ci0JdW5zaWduZWQgbG9uZyBpcDE7Ci0KLQlpZiAoZmxhZ3MgPT0gSVJRX1RZUEVfUFJPQkUpCi0JCXJldHVybiAwOwotCi0JaWYgKCghKGZsYWdzICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpIF4gIShmbGFncyAmIElSUV9UWVBFX0VER0VfRkFMTElORykpID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaXAxID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfSU5UUE9MMSk7Ci0JaWYgKGZsYWdzICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpCi0JCWlwMSAmPSB+bWFzazsKLQllbHNlCi0JCWlwMSB8PSBtYXNrOwotCXNhMTExMV93cml0ZWwoaXAxLCBtYXBiYXNlICsgU0ExMTExX0lOVFBPTDEpOwotCXNhMTExMV93cml0ZWwoaXAxLCBtYXBiYXNlICsgU0ExMTExX1dBS0VQT0wxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNhMTExMV93YWtlX2hpZ2hpcnEoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgb24pCi17Ci0Jc3RydWN0IHNhMTExMSAqc2FjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0Jdm9pZCBfX2lvbWVtICptYXBiYXNlID0gc2FjaGlwLT5iYXNlICsgU0ExMTExX0lOVEM7Ci0JdW5zaWduZWQgaW50IG1hc2sgPSBTQTExMTFfSVJRTUFTS19ISShkLT5pcnEpOwotCXVuc2lnbmVkIGxvbmcgd2UxOwotCi0Jd2UxID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfV0FLRUVOMSk7Ci0JaWYgKG9uKQotCQl3ZTEgfD0gbWFzazsKLQllbHNlCi0JCXdlMSAmPSB+bWFzazsKLQlzYTExMTFfd3JpdGVsKHdlMSwgbWFwYmFzZSArIFNBMTExMV9XQUtFRU4xKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIHNhMTExMV9oaWdoX2NoaXAgPSB7Ci0JLm5hbWUJCT0gIlNBMTExMS1oIiwKLQkuaXJxX2Fjawk9IHNhMTExMV9hY2tfaXJxLAotCS5pcnFfbWFzawk9IHNhMTExMV9tYXNrX2hpZ2hpcnEsCi0JLmlycV91bm1hc2sJPSBzYTExMTFfdW5tYXNrX2hpZ2hpcnEsCi0JLmlycV9yZXRyaWdnZXIJPSBzYTExMTFfcmV0cmlnZ2VyX2hpZ2hpcnEsCi0JLmlycV9zZXRfdHlwZQk9IHNhMTExMV90eXBlX2hpZ2hpcnEsCi0JLmlycV9zZXRfd2FrZQk9IHNhMTExMV93YWtlX2hpZ2hpcnEsCisJLmlycV9tYXNrCT0gc2ExMTExX21hc2tfaXJxLAorCS5pcnFfdW5tYXNrCT0gc2ExMTExX3VubWFza19pcnEsCisJLmlycV9yZXRyaWdnZXIJPSBzYTExMTFfcmV0cmlnZ2VyX2lycSwKKwkuaXJxX3NldF90eXBlCT0gc2ExMTExX3R5cGVfaXJxLAorCS5pcnFfc2V0X3dha2UJPSBzYTExMTFfd2FrZV9pcnEsCiB9OwogCiBzdGF0aWMgaW50IHNhMTExMV9zZXR1cF9pcnEoc3RydWN0IHNhMTExMSAqc2FjaGlwLCB1bnNpZ25lZCBpcnFfYmFzZSkKQEAgLTQ3Miw4ICszODMsOCBAQAogCSAqIHNwZWNpZmllcyB0aGF0IFMwUmVhZHlJbnQgYW5kIFMxUmVhZHlJbnQgc2hvdWxkIGJlICcxJy4KIAkgKi8KIAlzYTExMTFfd3JpdGVsKDAsIGlycWJhc2UgKyBTQTExMTFfSU5UUE9MMCk7Ci0Jc2ExMTExX3dyaXRlbChTQTExMTFfSVJRTUFTS19ISShJUlFfUzBfUkVBRFlfTklOVCkgfAotCQkgICAgICBTQTExMTFfSVJRTUFTS19ISShJUlFfUzFfUkVBRFlfTklOVCksCisJc2ExMTExX3dyaXRlbChCSVQoSVJRX1MwX1JFQURZX05JTlQgJiAzMSkgfAorCQkgICAgICBCSVQoSVJRX1MxX1JFQURZX05JTlQgJiAzMSksCiAJCSAgICAgIGlycWJhc2UgKyBTQTExMTFfSU5UUE9MMSk7CiAKIAkvKiBjbGVhciBhbGwgSVJRcyAqLwpAQCAtNDgyLDE2ICszOTMsMTQgQEAKIAogCWZvciAoaSA9IElSUV9HUEFJTjA7IGkgPD0gU1NQUk9SOyBpKyspIHsKIAkJaXJxID0gc2FjaGlwLT5pcnFfYmFzZSArIGk7Ci0JCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZzYTExMTFfbG93X2NoaXAsCi0JCQkJCSBoYW5kbGVfZWRnZV9pcnEpOworCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmc2ExMTExX2lycV9jaGlwLCBoYW5kbGVfZWRnZV9pcnEpOwogCQlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIHNhY2hpcCk7CiAJCWlycV9jbGVhcl9zdGF0dXNfZmxhZ3MoaXJxLCBJUlFfTk9SRVFVRVNUIHwgSVJRX05PUFJPQkUpOwogCX0KIAogCWZvciAoaSA9IEFVRFhNVERNQURPTkVBOyBpIDw9IElSUV9TMV9CVkQxX1NUU0NIRzsgaSsrKSB7CiAJCWlycSA9IHNhY2hpcC0+aXJxX2Jhc2UgKyBpOwotCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmc2ExMTExX2hpZ2hfY2hpcCwKLQkJCQkJIGhhbmRsZV9lZGdlX2lycSk7CisJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZzYTExMTFfaXJxX2NoaXAsIGhhbmRsZV9lZGdlX2lycSk7CiAJCWlycV9zZXRfY2hpcF9kYXRhKGlycSwgc2FjaGlwKTsKIAkJaXJxX2NsZWFyX3N0YXR1c19mbGFncyhpcnEsIElSUV9OT1JFUVVFU1QgfCBJUlFfTk9QUk9CRSk7CiAJfQpAQCAtNTA5LDYgKzQxOCwxODEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgc2ExMTExX3JlbW92ZV9pcnEoc3RydWN0IHNhMTExMSAqc2FjaGlwKQoreworCXZvaWQgX19pb21lbSAqaXJxYmFzZSA9IHNhY2hpcC0+YmFzZSArIFNBMTExMV9JTlRDOworCisJLyogZGlzYWJsZSBhbGwgSVJRcyAqLworCXNhMTExMV93cml0ZWwoMCwgaXJxYmFzZSArIFNBMTExMV9JTlRFTjApOworCXNhMTExMV93cml0ZWwoMCwgaXJxYmFzZSArIFNBMTExMV9JTlRFTjEpOworCXNhMTExMV93cml0ZWwoMCwgaXJxYmFzZSArIFNBMTExMV9XQUtFRU4wKTsKKwlzYTExMTFfd3JpdGVsKDAsIGlycWJhc2UgKyBTQTExMTFfV0FLRUVOMSk7CisKKwlpZiAoc2FjaGlwLT5pcnEgIT0gTk9fSVJRKSB7CisJCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyX2FuZF9kYXRhKHNhY2hpcC0+aXJxLCBOVUxMLCBOVUxMKTsKKwkJaXJxX2ZyZWVfZGVzY3Moc2FjaGlwLT5pcnFfYmFzZSwgU0ExMTExX0lSUV9OUik7CisKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHNhY2hpcC0+cGh5cyArIFNBMTExMV9JTlRDLCA1MTIpOworCX0KK30KKworZW51bSB7CisJU0ExMTExX0dQSU9fUFhERFIgPSAoU0ExMTExX0dQSU9fUEFERFIgLSBTQTExMTFfR1BJT19QQUREUiksCisJU0ExMTExX0dQSU9fUFhEUlIgPSAoU0ExMTExX0dQSU9fUEFEUlIgLSBTQTExMTFfR1BJT19QQUREUiksCisJU0ExMTExX0dQSU9fUFhEV1IgPSAoU0ExMTExX0dQSU9fUEFEV1IgLSBTQTExMTFfR1BJT19QQUREUiksCisJU0ExMTExX0dQSU9fUFhTRFIgPSAoU0ExMTExX0dQSU9fUEFTRFIgLSBTQTExMTFfR1BJT19QQUREUiksCisJU0ExMTExX0dQSU9fUFhTU1IgPSAoU0ExMTExX0dQSU9fUEFTU1IgLSBTQTExMTFfR1BJT19QQUREUiksCit9OworCitzdGF0aWMgc3RydWN0IHNhMTExMSAqZ2NfdG9fc2ExMTExKHN0cnVjdCBncGlvX2NoaXAgKmdjKQoreworCXJldHVybiBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBzYTExMTEsIGdjKTsKK30KKworc3RhdGljIHZvaWQgX19pb21lbSAqc2ExMTExX2dwaW9fbWFwX3JlZyhzdHJ1Y3Qgc2ExMTExICpzYWNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZyA9IHNhY2hpcC0+YmFzZSArIFNBMTExMV9HUElPOworCisJaWYgKG9mZnNldCA8IDQpCisJCXJldHVybiByZWcgKyBTQTExMTFfR1BJT19QQUREUjsKKwlpZiAob2Zmc2V0IDwgMTApCisJCXJldHVybiByZWcgKyBTQTExMTFfR1BJT19QQkREUjsKKwlpZiAob2Zmc2V0IDwgMTgpCisJCXJldHVybiByZWcgKyBTQTExMTFfR1BJT19QQ0REUjsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHUzMiBzYTExMTFfZ3Bpb19tYXBfYml0KHVuc2lnbmVkIG9mZnNldCkKK3sKKwlpZiAob2Zmc2V0IDwgNCkKKwkJcmV0dXJuIEJJVChvZmZzZXQpOworCWlmIChvZmZzZXQgPCAxMCkKKwkJcmV0dXJuIEJJVChvZmZzZXQgLSA0KTsKKwlpZiAob2Zmc2V0IDwgMTgpCisJCXJldHVybiBCSVQob2Zmc2V0IC0gMTApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzYTExMTFfZ3Bpb19tb2RpZnkodm9pZCBfX2lvbWVtICpyZWcsIHUzMiBtYXNrLCB1MzIgc2V0KQoreworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbF9yZWxheGVkKHJlZyk7CisJdmFsICY9IH5tYXNrOworCXZhbCB8PSBtYXNrICYgc2V0OworCXdyaXRlbF9yZWxheGVkKHZhbCwgcmVnKTsKK30KKworc3RhdGljIGludCBzYTExMTFfZ3Bpb19nZXRfZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gZ2NfdG9fc2ExMTExKGdjKTsKKwl2b2lkIF9faW9tZW0gKnJlZyA9IHNhMTExMV9ncGlvX21hcF9yZWcoc2FjaGlwLCBvZmZzZXQpOworCXUzMiBtYXNrID0gc2ExMTExX2dwaW9fbWFwX2JpdChvZmZzZXQpOworCisJcmV0dXJuICEhKHJlYWRsX3JlbGF4ZWQocmVnICsgU0ExMTExX0dQSU9fUFhERFIpICYgbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTExX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gZ2NfdG9fc2ExMTExKGdjKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgX19pb21lbSAqcmVnID0gc2ExMTExX2dwaW9fbWFwX3JlZyhzYWNoaXAsIG9mZnNldCk7CisJdTMyIG1hc2sgPSBzYTExMTFfZ3Bpb19tYXBfYml0KG9mZnNldCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2FjaGlwLT5sb2NrLCBmbGFncyk7CisJc2ExMTExX2dwaW9fbW9kaWZ5KHJlZyArIFNBMTExMV9HUElPX1BYRERSLCBtYXNrLCBtYXNrKTsKKwlzYTExMTFfZ3Bpb19tb2RpZnkocmVnICsgU0ExMTExX0dQSU9fUFhTRFIsIG1hc2ssIG1hc2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNhY2hpcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTExX2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0LAorCWludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBnY190b19zYTExMTEoZ2MpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBzYTExMTFfZ3Bpb19tYXBfcmVnKHNhY2hpcCwgb2Zmc2V0KTsKKwl1MzIgbWFzayA9IHNhMTExMV9ncGlvX21hcF9iaXQob2Zmc2V0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzYWNoaXAtPmxvY2ssIGZsYWdzKTsKKwlzYTExMTFfZ3Bpb19tb2RpZnkocmVnICsgU0ExMTExX0dQSU9fUFhEV1IsIG1hc2ssIHZhbHVlID8gbWFzayA6IDApOworCXNhMTExMV9ncGlvX21vZGlmeShyZWcgKyBTQTExMTFfR1BJT19QWFNTUiwgbWFzaywgdmFsdWUgPyBtYXNrIDogMCk7CisJc2ExMTExX2dwaW9fbW9kaWZ5KHJlZyArIFNBMTExMV9HUElPX1BYRERSLCBtYXNrLCAwKTsKKwlzYTExMTFfZ3Bpb19tb2RpZnkocmVnICsgU0ExMTExX0dQSU9fUFhTRFIsIG1hc2ssIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNhY2hpcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTExX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gZ2NfdG9fc2ExMTExKGdjKTsKKwl2b2lkIF9faW9tZW0gKnJlZyA9IHNhMTExMV9ncGlvX21hcF9yZWcoc2FjaGlwLCBvZmZzZXQpOworCXUzMiBtYXNrID0gc2ExMTExX2dwaW9fbWFwX2JpdChvZmZzZXQpOworCisJcmV0dXJuICEhKHJlYWRsX3JlbGF4ZWQocmVnICsgU0ExMTExX0dQSU9fUFhEUlIpICYgbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIHNhMTExMV9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gZ2NfdG9fc2ExMTExKGdjKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgX19pb21lbSAqcmVnID0gc2ExMTExX2dwaW9fbWFwX3JlZyhzYWNoaXAsIG9mZnNldCk7CisJdTMyIG1hc2sgPSBzYTExMTFfZ3Bpb19tYXBfYml0KG9mZnNldCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2FjaGlwLT5sb2NrLCBmbGFncyk7CisJc2ExMTExX2dwaW9fbW9kaWZ5KHJlZyArIFNBMTExMV9HUElPX1BYRFdSLCBtYXNrLCB2YWx1ZSA/IG1hc2sgOiAwKTsKKwlzYTExMTFfZ3Bpb19tb2RpZnkocmVnICsgU0ExMTExX0dQSU9fUFhTU1IsIG1hc2ssIHZhbHVlID8gbWFzayA6IDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNhY2hpcC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzYTExMTFfZ3Bpb19zZXRfbXVsdGlwbGUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGxvbmcgKm1hc2ssCisJdW5zaWduZWQgbG9uZyAqYml0cykKK3sKKwlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBnY190b19zYTExMTEoZ2MpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfR1BJTzsKKwl1MzIgbXNrLCB2YWw7CisKKwltc2sgPSAqbWFzazsKKwl2YWwgPSAqYml0czsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzYWNoaXAtPmxvY2ssIGZsYWdzKTsKKwlzYTExMTFfZ3Bpb19tb2RpZnkocmVnICsgU0ExMTExX0dQSU9fUEFEV1IsIG1zayAmIDE1LCB2YWwpOworCXNhMTExMV9ncGlvX21vZGlmeShyZWcgKyBTQTExMTFfR1BJT19QQVNTUiwgbXNrICYgMTUsIHZhbCk7CisJc2ExMTExX2dwaW9fbW9kaWZ5KHJlZyArIFNBMTExMV9HUElPX1BCRFdSLCAobXNrID4+IDQpICYgMjU1LCB2YWwgPj4gNCk7CisJc2ExMTExX2dwaW9fbW9kaWZ5KHJlZyArIFNBMTExMV9HUElPX1BCU1NSLCAobXNrID4+IDQpICYgMjU1LCB2YWwgPj4gNCk7CisJc2ExMTExX2dwaW9fbW9kaWZ5KHJlZyArIFNBMTExMV9HUElPX1BDRFdSLCAobXNrID4+IDEyKSAmIDI1NSwgdmFsID4+IDEyKTsKKwlzYTExMTFfZ3Bpb19tb2RpZnkocmVnICsgU0ExMTExX0dQSU9fUENTU1IsIChtc2sgPj4gMTIpICYgMjU1LCB2YWwgPj4gMTIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNhY2hpcC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHNhMTExMV9ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBzYTExMTEgKnNhY2hpcCA9IGdjX3RvX3NhMTExMShnYyk7CisKKwlyZXR1cm4gc2FjaGlwLT5pcnFfYmFzZSArIG9mZnNldDsKK30KKworc3RhdGljIGludCBzYTExMTFfc2V0dXBfZ3Bpb3Moc3RydWN0IHNhMTExMSAqc2FjaGlwKQoreworCXNhY2hpcC0+Z2MubGFiZWwgPSAic2ExMTExIjsKKwlzYWNoaXAtPmdjLnBhcmVudCA9IHNhY2hpcC0+ZGV2OworCXNhY2hpcC0+Z2Mub3duZXIgPSBUSElTX01PRFVMRTsKKwlzYWNoaXAtPmdjLmdldF9kaXJlY3Rpb24gPSBzYTExMTFfZ3Bpb19nZXRfZGlyZWN0aW9uOworCXNhY2hpcC0+Z2MuZGlyZWN0aW9uX2lucHV0ID0gc2ExMTExX2dwaW9fZGlyZWN0aW9uX2lucHV0OworCXNhY2hpcC0+Z2MuZGlyZWN0aW9uX291dHB1dCA9IHNhMTExMV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7CisJc2FjaGlwLT5nYy5nZXQgPSBzYTExMTFfZ3Bpb19nZXQ7CisJc2FjaGlwLT5nYy5zZXQgPSBzYTExMTFfZ3Bpb19zZXQ7CisJc2FjaGlwLT5nYy5zZXRfbXVsdGlwbGUgPSBzYTExMTFfZ3Bpb19zZXRfbXVsdGlwbGU7CisJc2FjaGlwLT5nYy50b19pcnEgPSBzYTExMTFfZ3Bpb190b19pcnE7CisJc2FjaGlwLT5nYy5iYXNlID0gLTE7CisJc2FjaGlwLT5nYy5uZ3BpbyA9IDE4OworCisJcmV0dXJuIGRldm1fZ3Bpb2NoaXBfYWRkX2RhdGEoc2FjaGlwLT5kZXYsICZzYWNoaXAtPmdjLCBzYWNoaXApOworfQorCiAvKgogICogQnJpbmcgdGhlIFNBMTExMSBvdXQgb2YgcmVzZXQuICBUaGlzIHJlcXVpcmVzIGEgc2V0IHByb2NlZHVyZToKICAqICAxLiBuUkVTRVQgYXNzZXJ0ZWQgKGJ5IGhhcmR3YXJlKQpAQCAtNjA3LDcgKzY5MSw3IEBACiAKIHN0YXRpYyB2b2lkIHNhMTExMV9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQogewotCXN0cnVjdCBzYTExMTFfZGV2ICpkZXYgPSBTQTExMTFfREVWKF9kZXYpOworCXN0cnVjdCBzYTExMTFfZGV2ICpkZXYgPSB0b19zYTExMTFfZGV2aWNlKF9kZXYpOwogCiAJa2ZyZWUoZGV2KTsKIH0KQEAgLTY5NiwxOSArNzgwLDE3IEBACiAJaWYgKCFwZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzYWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2ExMTExKSwgR0ZQX0tFUk5FTCk7CisJc2FjaGlwID0gZGV2bV9remFsbG9jKG1lLCBzaXplb2Yoc3RydWN0IHNhMTExMSksIEdGUF9LRVJORUwpOwogCWlmICghc2FjaGlwKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNhY2hpcC0+Y2xrID0gY2xrX2dldChtZSwgIlNBMTExMV9DTEsiKTsKLQlpZiAoSVNfRVJSKHNhY2hpcC0+Y2xrKSkgewotCQlyZXQgPSBQVFJfRVJSKHNhY2hpcC0+Y2xrKTsKLQkJZ290byBlcnJfZnJlZTsKLQl9CisJc2FjaGlwLT5jbGsgPSBkZXZtX2Nsa19nZXQobWUsICJTQTExMTFfQ0xLIik7CisJaWYgKElTX0VSUihzYWNoaXAtPmNsaykpCisJCXJldHVybiBQVFJfRVJSKHNhY2hpcC0+Y2xrKTsKIAogCXJldCA9IGNsa19wcmVwYXJlKHNhY2hpcC0+Y2xrKTsKIAlpZiAocmV0KQotCQlnb3RvIGVycl9jbGtwdXQ7CisJCXJldHVybiByZXQ7CiAKIAlzcGluX2xvY2tfaW5pdCgmc2FjaGlwLT5sb2NrKTsKIApAQCAtNzU0LDkgKzgzNiwxNCBAQAogCWlmIChzYWNoaXAtPmlycSAhPSBOT19JUlEpIHsKIAkJcmV0ID0gc2ExMTExX3NldHVwX2lycShzYWNoaXAsIHBkLT5pcnFfYmFzZSk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIGVycl91bm1hcDsKKwkJCWdvdG8gZXJyX2NsazsKIAl9CiAKKwkvKiBTZXR1cCB0aGUgR1BJT3MgLSBzaG91bGQgcmVhbGx5IGJlIGRvbmUgYWZ0ZXIgdGhlIElSUSBzZXR1cCAqLworCXJldCA9IHNhMTExMV9zZXR1cF9ncGlvcyhzYWNoaXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2lycTsKKwogI2lmZGVmIENPTkZJR19BUkNIX1NBMTEwMAogCXsKIAl1bnNpZ25lZCBpbnQgdmFsOwpAQCAtNzk5LDIwICs4ODYsMjIgQEAKIAogCXJldHVybiAwOwogCisgZXJyX2lycToKKwlzYTExMTFfcmVtb3ZlX2lycShzYWNoaXApOworIGVycl9jbGs6CisJY2xrX2Rpc2FibGUoc2FjaGlwLT5jbGspOwogIGVycl91bm1hcDoKIAlpb3VubWFwKHNhY2hpcC0+YmFzZSk7CiAgZXJyX2Nsa191bnByZXA6CiAJY2xrX3VucHJlcGFyZShzYWNoaXAtPmNsayk7Ci0gZXJyX2Nsa3B1dDoKLQljbGtfcHV0KHNhY2hpcC0+Y2xrKTsKLSBlcnJfZnJlZToKLQlrZnJlZShzYWNoaXApOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgc2ExMTExX3JlbW92ZV9vbmUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBzYTExMTFfZGV2ICpzYWRldiA9IFNBMTExMV9ERVYoZGV2KTsKKwlzdHJ1Y3Qgc2ExMTExX2RldiAqc2FkZXYgPSB0b19zYTExMTFfZGV2aWNlKGRldik7CisJaWYgKGRldi0+YnVzICE9ICZzYTExMTFfYnVzX3R5cGUpCisJCXJldHVybiAwOwogCWRldmljZV9kZWwoJnNhZGV2LT5kZXYpOwogCXJlbGVhc2VfcmVzb3VyY2UoJnNhZGV2LT5yZXMpOwogCXB1dF9kZXZpY2UoJnNhZGV2LT5kZXYpOwpAQCAtODIxLDI5ICs5MTAsMTQgQEAKIAogc3RhdGljIHZvaWQgX19zYTExMTFfcmVtb3ZlKHN0cnVjdCBzYTExMTEgKnNhY2hpcCkKIHsKLQl2b2lkIF9faW9tZW0gKmlycWJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQzsKLQogCWRldmljZV9mb3JfZWFjaF9jaGlsZChzYWNoaXAtPmRldiwgTlVMTCwgc2ExMTExX3JlbW92ZV9vbmUpOwogCi0JLyogZGlzYWJsZSBhbGwgSVJRcyAqLwotCXNhMTExMV93cml0ZWwoMCwgaXJxYmFzZSArIFNBMTExMV9JTlRFTjApOwotCXNhMTExMV93cml0ZWwoMCwgaXJxYmFzZSArIFNBMTExMV9JTlRFTjEpOwotCXNhMTExMV93cml0ZWwoMCwgaXJxYmFzZSArIFNBMTExMV9XQUtFRU4wKTsKLQlzYTExMTFfd3JpdGVsKDAsIGlycWJhc2UgKyBTQTExMTFfV0FLRUVOMSk7CisJc2ExMTExX3JlbW92ZV9pcnEoc2FjaGlwKTsKIAogCWNsa19kaXNhYmxlKHNhY2hpcC0+Y2xrKTsKIAljbGtfdW5wcmVwYXJlKHNhY2hpcC0+Y2xrKTsKIAotCWlmIChzYWNoaXAtPmlycSAhPSBOT19JUlEpIHsKLQkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXJfYW5kX2RhdGEoc2FjaGlwLT5pcnEsIE5VTEwsIE5VTEwpOwotCQlpcnFfZnJlZV9kZXNjcyhzYWNoaXAtPmlycV9iYXNlLCBTQTExMTFfSVJRX05SKTsKLQotCQlyZWxlYXNlX21lbV9yZWdpb24oc2FjaGlwLT5waHlzICsgU0ExMTExX0lOVEMsIDUxMik7Ci0JfQotCiAJaW91bm1hcChzYWNoaXAtPmJhc2UpOwotCWNsa19wdXQoc2FjaGlwLT5jbGspOwotCWtmcmVlKHNhY2hpcCk7CiB9CiAKIHN0cnVjdCBzYTExMTFfc2F2ZV9kYXRhIHsKQEAgLTg2OSw5ICs5NDMsOSBAQAogCiAjaWZkZWYgQ09ORklHX1BNCiAKLXN0YXRpYyBpbnQgc2ExMTExX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IHNhMTExMV9zdXNwZW5kX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzYTExMTEgKnNhY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBzYTExMTFfc2F2ZV9kYXRhICpzYXZlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IHZhbDsKQEAgLTkzNCw5ICsxMDA4LDkgQEAKICAqCXJlc3RvcmVkIGJ5IHRoZWlyIHJlc3BlY3RpdmUgZHJpdmVycywgYW5kIG11c3QgYmUgY2FsbGVkCiAgKgl2aWEgTERNIGFmdGVyIHRoaXMgZnVuY3Rpb24uCiAgKi8KLXN0YXRpYyBpbnQgc2ExMTExX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHNhMTExMV9yZXN1bWVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBzYTExMTEgKnNhY2hpcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHNhMTExMV9zYXZlX2RhdGEgKnNhdmU7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgaWQ7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwpAQCAtOTUyLDcgKzEwMjYsNyBAQAogCWlkID0gc2ExMTExX3JlYWRsKHNhY2hpcC0+YmFzZSArIFNBMTExMV9TS0lEKTsKIAlpZiAoKGlkICYgU0tJRF9JRF9NQVNLKSAhPSBTS0lEX1NBMTExMV9JRCkgewogCQlfX3NhMTExMV9yZW1vdmUoc2FjaGlwKTsKLQkJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKwkJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CiAJCWtmcmVlKHNhdmUpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMDAzLDggKzEwNzcsOCBAQAogfQogCiAjZWxzZQotI2RlZmluZSBzYTExMTFfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIHNhMTExMV9yZXN1bWUgIE5VTEwKKyNkZWZpbmUgc2ExMTExX3N1c3BlbmRfbm9pcnEgTlVMTAorI2RlZmluZSBzYTExMTFfcmVzdW1lX25vaXJxICBOVUxMCiAjZW5kaWYKIAogc3RhdGljIGludCBzYTExMTFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTEwMTcsNyArMTA5MSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAJaWYgKGlycSA8IDApCi0JCXJldHVybiAtRU5YSU87CisJCXJldHVybiBpcnE7CiAKIAlyZXR1cm4gX19zYTExMTFfcHJvYmUoJnBkZXYtPmRldiwgbWVtLCBpcnEpOwogfQpAQCAtMTAzOCw2ICsxMTEyLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZGV2X3BtX29wcyBzYTExMTFfcG1fb3BzID0geworCS5zdXNwZW5kX25vaXJxID0gc2ExMTExX3N1c3BlbmRfbm9pcnEsCisJLnJlc3VtZV9ub2lycSA9IHNhMTExMV9yZXN1bWVfbm9pcnEsCit9OworCiAvKgogICoJTm90IHN1cmUgaWYgdGhpcyBzaG91bGQgYmUgb24gdGhlIHN5c3RlbSBidXMgb3Igbm90IHlldC4KICAqCVdlIHJlYWxseSB3YW50IHNvbWUgd2F5IHRvIHJlZ2lzdGVyIGEgc3lzdGVtIGRldmljZSBhdApAQCAtMTA1MCwxMCArMTEyOSw5IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzYTExMTFfZGV2aWNlX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gc2ExMTExX3Byb2JlLAogCS5yZW1vdmUJCT0gc2ExMTExX3JlbW92ZSwKLQkuc3VzcGVuZAk9IHNhMTExMV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gc2ExMTExX3Jlc3VtZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAic2ExMTExIiwKKwkJLnBtCT0gJnNhMTExMV9wbV9vcHMsCiAJfSwKIH07CiAKQEAgLTEyNzksNiArMTM1NywxNCBAQAogfQogRVhQT1JUX1NZTUJPTChzYTExMTFfZGlzYWJsZV9kZXZpY2UpOwogCitpbnQgc2ExMTExX2dldF9pcnEoc3RydWN0IHNhMTExMV9kZXYgKnNhZGV2LCB1bnNpZ25lZCBudW0pCit7CisJaWYgKG51bSA+PSBBUlJBWV9TSVpFKHNhZGV2LT5pcnEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gc2FkZXYtPmlycVtudW1dOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2ExMTExX2dldF9pcnEpOworCiAvKgogICoJU0ExMTExICJSZWdpc3RlciBBY2Nlc3MgQnVzLiIKICAqCkBAIC0xMjg3LDcgKzEzNzMsNyBAQAogICovCiBzdGF0aWMgaW50IHNhMTExMV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqX2RydikKIHsKLQlzdHJ1Y3Qgc2ExMTExX2RldiAqZGV2ID0gU0ExMTExX0RFVihfZGV2KTsKKwlzdHJ1Y3Qgc2ExMTExX2RldiAqZGV2ID0gdG9fc2ExMTExX2RldmljZShfZGV2KTsKIAlzdHJ1Y3Qgc2ExMTExX2RyaXZlciAqZHJ2ID0gU0ExMTExX0RSVihfZHJ2KTsKIAogCXJldHVybiAhIShkZXYtPmRldmlkICYgZHJ2LT5kZXZpZCk7CkBAIC0xMjk1LDcgKzEzODEsNyBAQAogCiBzdGF0aWMgaW50IHNhMTExMV9idXNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlzdHJ1Y3Qgc2ExMTExX2RldiAqc2FkZXYgPSBTQTExMTFfREVWKGRldik7CisJc3RydWN0IHNhMTExMV9kZXYgKnNhZGV2ID0gdG9fc2ExMTExX2RldmljZShkZXYpOwogCXN0cnVjdCBzYTExMTFfZHJpdmVyICpkcnYgPSBTQTExMTFfRFJWKGRldi0+ZHJpdmVyKTsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMTMwNiw3ICsxMzkyLDcgQEAKIAogc3RhdGljIGludCBzYTExMTFfYnVzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHNhMTExMV9kZXYgKnNhZGV2ID0gU0ExMTExX0RFVihkZXYpOworCXN0cnVjdCBzYTExMTFfZGV2ICpzYWRldiA9IHRvX3NhMTExMV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3Qgc2ExMTExX2RyaXZlciAqZHJ2ID0gU0ExMTExX0RSVihkZXYtPmRyaXZlcik7CiAJaW50IHJldCA9IDA7CiAKQEAgLTEzMjAsMTIgKzE0MDYsMTIgQEAKIAlzdHJ1Y3Qgc2ExMTExX2RyaXZlciAqZHJ2ID0gU0ExMTExX0RSVihkZXYtPmRyaXZlcik7CiAKIAlpZiAoZHJ2ICYmIGRydi0+c2h1dGRvd24pCi0JCWRydi0+c2h1dGRvd24oU0ExMTExX0RFVihkZXYpKTsKKwkJZHJ2LT5zaHV0ZG93bih0b19zYTExMTFfZGV2aWNlKGRldikpOwogfQogCiBzdGF0aWMgaW50IHNhMTExMV9idXNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBzYTExMTFfZGV2ICpzYWRldiA9IFNBMTExMV9ERVYoZGV2KTsKKwlzdHJ1Y3Qgc2ExMTExX2RldiAqc2FkZXYgPSB0b19zYTExMTFfZGV2aWNlKGRldik7CiAJc3RydWN0IHNhMTExMV9kcml2ZXIgKmRydiA9IFNBMTExMV9EUlYoZGV2LT5kcml2ZXIpOwogCWludCByZXQgPSAtRU5PREVWOwogCkBAIC0xMzM2LDcgKzE0MjIsNyBAQAogCiBzdGF0aWMgaW50IHNhMTExMV9idXNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc2ExMTExX2RldiAqc2FkZXYgPSBTQTExMTFfREVWKGRldik7CisJc3RydWN0IHNhMTExMV9kZXYgKnNhZGV2ID0gdG9fc2ExMTExX2RldmljZShkZXYpOwogCXN0cnVjdCBzYTExMTFfZHJpdmVyICpkcnYgPSBTQTExMTFfRFJWKGRldi0+ZHJpdmVyKTsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMTQwMSw3ICsxNDg3LDcgQEAKIHN0YXRpYyBpbnQgc2ExMTExX25vdGlmaWVyX2NhbGwoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKIAl2b2lkICpkYXRhKQogewotCXN0cnVjdCBzYTExMTFfZGV2ICpkZXYgPSBTQTExMTFfREVWKGRhdGEpOworCXN0cnVjdCBzYTExMTFfZGV2ICpkZXYgPSB0b19zYTExMTFfZGV2aWNlKGRhdGEpOwogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIEJVU19OT1RJRllfQUREX0RFVklDRToKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvZXh5bm9zX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvZXh5bm9zX2RlZmNvbmZpZwppbmRleCAwMTk4NmRlLi4zNmNjN2NjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2V4eW5vc19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9leHlub3NfZGVmY29uZmlnCkBAIC0yOCw3ICsyOCw3IEBACiBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRT1tCiBDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT1tCiBDT05GSUdfQ1BVX0ZSRVFfR09WX0NPTlNFUlZBVElWRT1tCi1DT05GSUdfQ1BVX0ZSRVFfR09WX1NDSEVEVVRJTD1tCitDT05GSUdfQ1BVX0ZSRVFfR09WX1NDSEVEVVRJTD15CiBDT05GSUdfQ1BVRlJFUV9EVD15CiBDT05GSUdfQ1BVX0lETEU9eQogQ09ORklHX0FSTV9FWFlOT1NfQ1BVSURMRT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2tleXN0b25lX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mva2V5c3RvbmVfZGVmY29uZmlnCmluZGV4IDcxYjQyZTYuLjc4Y2QyZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3Mva2V5c3RvbmVfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3Mva2V5c3RvbmVfZGVmY29uZmlnCkBAIC0xNjEsNiArMTYxLDcgQEAKIENPTkZJR19VU0JfWEhDSV9IQ0Q9eQogQ09ORklHX1VTQl9TVE9SQUdFPXkKIENPTkZJR19VU0JfRFdDMz15CitDT05GSUdfTk9QX1VTQl9YQ0VJVj15CiBDT05GSUdfS0VZU1RPTkVfVVNCX1BIWT15CiBDT05GSUdfTkVXX0xFRFM9eQogQ09ORklHX0xFRFNfQ0xBU1M9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9tdWx0aV92N19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL211bHRpX3Y3X2RlZmNvbmZpZwppbmRleCAyYzg2NjVjLi41ODQ1OTEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL211bHRpX3Y3X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL211bHRpX3Y3X2RlZmNvbmZpZwpAQCAtMTM1LDcgKzEzNSw3IEBACiBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRT1tCiBDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT1tCiBDT05GSUdfQ1BVX0ZSRVFfR09WX0NPTlNFUlZBVElWRT1tCi1DT05GSUdfQ1BVX0ZSRVFfR09WX1NDSEVEVVRJTD1tCitDT05GSUdfQ1BVX0ZSRVFfR09WX1NDSEVEVVRJTD15CiBDT05GSUdfUU9SSVFfQ1BVRlJFUT15CiBDT05GSUdfQ1BVX0lETEU9eQogQ09ORklHX0FSTV9DUFVJRExFPXkKQEAgLTc4MSw3ICs3ODEsNyBAQAogQ09ORklHX0RNQV9CQ00yODM1PXkKIENPTkZJR19ETUFfT01BUD15CiBDT05GSUdfUUNPTV9CQU1fRE1BPXkKLUNPTkZJR19YSUxJTlhfVkRNQT15CitDT05GSUdfWElMSU5YX0RNQT15CiBDT05GSUdfRE1BX1NVTjZJPXkKIENPTkZJR19TVEFHSU5HPXkKIENPTkZJR19TRU5TT1JTX0lTTDI5MDE4PXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NyeXB0by9hZXMtY2UtZ2x1ZS5jIGIvYXJjaC9hcm0vY3J5cHRvL2Flcy1jZS1nbHVlLmMKaW5kZXggZGEzYzA0Mi4uYWVmMDIyYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY3J5cHRvL2Flcy1jZS1nbHVlLmMKKysrIGIvYXJjaC9hcm0vY3J5cHRvL2Flcy1jZS1nbHVlLmMKQEAgLTI4NCw3ICsyODQsNyBAQAogCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLAogCQkJCQkgIHdhbGsubmJ5dGVzICUgQUVTX0JMT0NLX1NJWkUpOwogCX0KLQlpZiAobmJ5dGVzKSB7CisJaWYgKHdhbGsubmJ5dGVzICUgQUVTX0JMT0NLX1NJWkUpIHsKIAkJdTggKnRkc3QgPSB3YWxrLmRzdC52aXJ0LmFkZHIgKyBibG9ja3MgKiBBRVNfQkxPQ0tfU0laRTsKIAkJdTggKnRzcmMgPSB3YWxrLnNyYy52aXJ0LmFkZHIgKyBibG9ja3MgKiBBRVNfQkxPQ0tfU0laRTsKIAkJdTggX19hbGlnbmVkKDgpIHRhaWxbQUVTX0JMT0NLX1NJWkVdOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXJjaF9naWN2My5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXJjaF9naWN2My5oCmluZGV4IGUwOGQxNTEuLmRmZTQwMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2FyY2hfZ2ljdjMuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9hcmNoX2dpY3YzLmgKQEAgLTM0LDYgKzM0LDcgQEAKICNkZWZpbmUgSUNDX0NUTFIJCQlfX0FDQ0VTU19DUDE1KGMxMiwgMCwgYzEyLCA0KQogI2RlZmluZSBJQ0NfU1JFCQkJCV9fQUNDRVNTX0NQMTUoYzEyLCAwLCBjMTIsIDUpCiAjZGVmaW5lIElDQ19JR1JQRU4xCQkJX19BQ0NFU1NfQ1AxNShjMTIsIDAsIGMxMiwgNykKKyNkZWZpbmUgSUNDX0JQUjEJCQlfX0FDQ0VTU19DUDE1KGMxMiwgMCwgYzEyLCAzKQogCiAjZGVmaW5lIElDQ19IU1JFCQkJX19BQ0NFU1NfQ1AxNShjMTIsIDQsIGM5LCA1KQogCkBAIC0xNTcsNiArMTU4LDExIEBACiAJaXNiKCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBnaWNfd3JpdGVfYnByMSh1MzIgdmFsKQoreworCWFzbSB2b2xhdGlsZSgibWNyICIgX19zdHJpbmdpZnkoSUNDX0JQUjEpIDogOiAiciIgKHZhbCkpOworfQorCiAvKgogICogRXZlbiBpbiAzMmJpdCBzeXN0ZW1zIHRoYXQgdXNlIExQQUUsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBJL08KICAqIGludGVyZmFjZSBwcm92aWRlcyB0cnVlIDY0Yml0IGF0b21pYyBhY2Nlc3Nlcywgc28gdXNpbmcgc3RyZC9sZHJkIGRvZXNuJ3QKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2Fzc2VtYmxlci5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXNzZW1ibGVyLmgKaW5kZXggNGVhZWEyMS4uNjhiMDZmOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXNzZW1ibGVyLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXNzZW1ibGVyLmgKQEAgLTE1OSw3ICsxNTksMTEgQEAKIAkuZW5kbQogCiAJLm1hY3JvCXNhdmVfYW5kX2Rpc2FibGVfaXJxc19ub3RyYWNlLCBvbGRjcHNyCisjaWZkZWYgQ09ORklHX0NQVV9WN00KKwltcnMJXG9sZGNwc3IsIHByaW1hc2sKKyNlbHNlCiAJbXJzCVxvbGRjcHNyLCBjcHNyCisjZW5kaWYKIAlkaXNhYmxlX2lycV9ub3RyYWNlCiAJLmVuZG0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCmluZGV4IDkxNTZmYzMuLmJkZDI4M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKQEAgLTUwMSwyMSArNTAxLDQgQEAKIHZvaWQgZmx1c2hfdXByb2JlX3hvbF9hY2Nlc3Moc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgdWFkZHIsCiAJCQkgICAgIHZvaWQgKmthZGRyLCB1bnNpZ25lZCBsb25nIGxlbik7CiAKLS8qKgotICogc2VjdXJlX2ZsdXNoX2FyZWEgLSBlbnN1cmUgY29oZXJlbmN5IGFjcm9zcyB0aGUgc2VjdXJlIGJvdW5kYXJ5Ci0gKiBAYWRkcjogdmlydHVhbCBhZGRyZXNzCi0gKiBAc2l6ZTogc2l6ZSBvZiByZWdpb24KLSAqCi0gKiBFbnN1cmUgdGhhdCB0aGUgc3BlY2lmaWVkIGFyZWEgb2YgbWVtb3J5IGlzIGNvaGVyZW50IGFjcm9zcyB0aGUgc2VjdXJlCi0gKiBib3VuZGFyeSBmcm9tIHRoZSBub24tc2VjdXJlIHNpZGUuICBUaGlzIGlzIHVzZWQgd2hlbiBjYWxsaW5nIHNlY3VyZQotICogZmlybXdhcmUgd2hlcmUgdGhlIHNlY3VyZSBmaXJtd2FyZSBkb2VzIG5vdCBlbnN1cmUgY29oZXJlbmN5LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc2VjdXJlX2ZsdXNoX2FyZWEoY29uc3Qgdm9pZCAqYWRkciwgc2l6ZV90IHNpemUpCi17Ci0JcGh5c19hZGRyX3QgcGh5cyA9IF9fcGEoYWRkcik7Ci0KLQlfX2NwdWNfZmx1c2hfZGNhY2hlX2FyZWEoKHZvaWQgKilhZGRyLCBzaXplKTsKLQlvdXRlcl9mbHVzaF9yYW5nZShwaHlzLCBwaHlzICsgc2l6ZSk7Ci19Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGV0eXBlLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZXR5cGUuaAppbmRleCA3ZWE3ODE0Li4wMTUwOWFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZXR5cGUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZXR5cGUuaApAQCAtNTYsNCArNTYsNDMgQEAKIAkgICAgICAgKH5fX0NBQ0hFSURfTkVWRVIgJiBfX0NBQ0hFSURfQVJDSF9NSU4gJiBtYXNrICYgY2FjaGVpZCk7CiB9CiAKKyNkZWZpbmUgQ1NTRUxSX0lDQUNIRQkxCisjZGVmaW5lIENTU0VMUl9EQ0FDSEUJMAorCisjZGVmaW5lIENTU0VMUl9MMQkoMCA8PCAxKQorI2RlZmluZSBDU1NFTFJfTDIJKDEgPDwgMSkKKyNkZWZpbmUgQ1NTRUxSX0wzCSgyIDw8IDEpCisjZGVmaW5lIENTU0VMUl9MNAkoMyA8PCAxKQorI2RlZmluZSBDU1NFTFJfTDUJKDQgPDwgMSkKKyNkZWZpbmUgQ1NTRUxSX0w2CSg1IDw8IDEpCisjZGVmaW5lIENTU0VMUl9MNwkoNiA8PCAxKQorCisjaWZuZGVmIENPTkZJR19DUFVfVjdNCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2Nzc2Vscih1bnNpZ25lZCBpbnQgY2FjaGVfc2VsZWN0b3IpCit7CisJYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAyLCAlMCwgYzAsIGMwLCAwIiA6IDogInIiIChjYWNoZV9zZWxlY3RvcikpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByZWFkX2Njc2lkcih2b2lkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwlhc20gdm9sYXRpbGUoIm1yYyBwMTUsIDEsICUwLCBjMCwgYzAsIDAiIDogIj1yIiAodmFsKSk7CisJcmV0dXJuIHZhbDsKK30KKyNlbHNlIC8qIENPTkZJR19DUFVfVjdNICovCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlICJhc20vdjdtLmgiCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3NzZWxyKHVuc2lnbmVkIGludCBjYWNoZV9zZWxlY3RvcikKK3sKKwl3cml0ZWwoY2FjaGVfc2VsZWN0b3IsIEJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0NUUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHJlYWRfY2NzaWRyKHZvaWQpCit7CisJcmV0dXJuIHJlYWRsKEJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0NDU0lEUik7Cit9CisjZW5kaWYKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9jbG9ja3NvdXJjZS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2xvY2tzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjM1MGE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2xvY2tzb3VyY2UuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX0FTTV9DTE9DS1NPVVJDRV9ICisjZGVmaW5lIF9BU01fQ0xPQ0tTT1VSQ0VfSAorCitzdHJ1Y3QgYXJjaF9jbG9ja3NvdXJjZV9kYXRhIHsKKwlib29sIHZkc29fZGlyZWN0OwkvKiBVc2FibGUgZm9yIGRpcmVjdCBWRFNPIGFjY2Vzcz8gKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY3B1dHlwZS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY3B1dHlwZS5oCmluZGV4IDFlZTk0YzcuLjc1NGY4NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NwdXR5cGUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jcHV0eXBlLmgKQEAgLTYwLDYgKzYwLDcgQEAKIAkoKG1waWRyID4+IChNUElEUl9MRVZFTF9CSVRTICogbGV2ZWwpKSAmIE1QSURSX0xFVkVMX01BU0spCiAKICNkZWZpbmUgQVJNX0NQVV9JTVBfQVJNCQkJMHg0MQorI2RlZmluZSBBUk1fQ1BVX0lNUF9ERUMJCQkweDQ0CiAjZGVmaW5lIEFSTV9DUFVfSU1QX0lOVEVMCQkweDY5CiAKIC8qIEFSTSBpbXBsZW1lbnRlZCBwcm9jZXNzb3JzICovCkBAIC03Niw2ICs3NywxNyBAQAogI2RlZmluZSBBUk1fQ1BVX1BBUlRfQ09SVEVYX0ExNQkJMHg0MTAwYzBmMAogI2RlZmluZSBBUk1fQ1BVX1BBUlRfTUFTSwkJMHhmZjAwZmZmMAogCisvKiBERUMgaW1wbGVtZW50ZWQgY29yZXMgKi8KKyNkZWZpbmUgQVJNX0NQVV9QQVJUX1NBMTEwMAkJMHg0NDAwYTExMAorCisvKiBJbnRlbCBpbXBsZW1lbnRlZCBjb3JlcyAqLworI2RlZmluZSBBUk1fQ1BVX1BBUlRfU0ExMTEwCQkweDY5MDBiMTEwCisjZGVmaW5lIEFSTV9DUFVfUkVWX1NBMTExMF9BMAkJMAorI2RlZmluZSBBUk1fQ1BVX1JFVl9TQTExMTBfQjAJCTQKKyNkZWZpbmUgQVJNX0NQVV9SRVZfU0ExMTEwX0IxCQk1CisjZGVmaW5lIEFSTV9DUFVfUkVWX1NBMTExMF9CMgkJNgorI2RlZmluZSBBUk1fQ1BVX1JFVl9TQTExMTBfQjQJCTgKKwogI2RlZmluZSBBUk1fQ1BVX1hTQ0FMRV9BUkNIX01BU0sJMHhlMDAwCiAjZGVmaW5lIEFSTV9DUFVfWFNDQUxFX0FSQ0hfVjEJCTB4MjAwMAogI2RlZmluZSBBUk1fQ1BVX1hTQ0FMRV9BUkNIX1YyCQkweDQwMDAKQEAgLTE1Miw2ICsxNjQsMTEgQEAKIAlyZXR1cm4gcmVhZF9jcHVpZChDUFVJRF9JRCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX2NvbnN0X18gcmVhZF9jcHVpZF9jYWNoZXR5cGUodm9pZCkKK3sKKwlyZXR1cm4gcmVhZF9jcHVpZChDUFVJRF9DQUNIRVRZUEUpOworfQorCiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfVjdNKQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fIHJlYWRfY3B1aWRfaWQodm9pZCkKQEAgLTE1OSw2ICsxNzYsMTEgQEAKIAlyZXR1cm4gcmVhZGwoQkFTRUFERFJfVjdNX1NDQiArIFY3TV9TQ0JfQ1BVSUQpOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fIHJlYWRfY3B1aWRfY2FjaGV0eXBlKHZvaWQpCit7CisJcmV0dXJuIHJlYWRsKEJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0NUUik7Cit9CisKICNlbHNlIC8qIGlmZGVmIENPTkZJR19DUFVfQ1AxNSAvIGVsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1Y3TSkgKi8KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfY29uc3RfXyByZWFkX2NwdWlkX2lkKHZvaWQpCkBAIC0xNzMsNiArMTk1LDExIEBACiAJcmV0dXJuIChyZWFkX2NwdWlkX2lkKCkgJiAweEZGMDAwMDAwKSA+PiAyNDsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfY29uc3RfXyByZWFkX2NwdWlkX3JldmlzaW9uKHZvaWQpCit7CisJcmV0dXJuIHJlYWRfY3B1aWRfaWQoKSAmIDB4MDAwMDAwMGY7Cit9CisKIC8qCiAgKiBUaGUgQ1BVIHBhcnQgbnVtYmVyIGlzIG1lYW5pbmdsZXNzIHdpdGhvdXQgcmVmZXJyaW5nIHRvIHRoZSBDUFUKICAqIGltcGxlbWVudGVyOiBpbXBsZW1lbnRlcnMgYXJlIGZyZWUgdG8gZGVmaW5lIHRoZWlyIG93biBwYXJ0IG51bWJlcnMKQEAgLTE5MywxMSArMjIwLDYgQEAKIAlyZXR1cm4gcmVhZF9jcHVpZF9pZCgpICYgQVJNX0NQVV9YU0NBTEVfQVJDSF9NQVNLOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fIHJlYWRfY3B1aWRfY2FjaGV0eXBlKHZvaWQpCi17Ci0JcmV0dXJuIHJlYWRfY3B1aWQoQ1BVSURfQ0FDSEVUWVBFKTsKLX0KLQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfY29uc3RfXyByZWFkX2NwdWlkX3RjbXN0YXR1cyh2b2lkKQogewogCXJldHVybiByZWFkX2NwdWlkKENQVUlEX1RDTSk7CkBAIC0yMDgsNiArMjMwLDEwIEBACiAJcmV0dXJuIHJlYWRfY3B1aWQoQ1BVSURfTVBJRFIpOwogfQogCisvKiBTdHJvbmdBUk0tMTF4MCBDUFVzICovCisjZGVmaW5lIGNwdV9pc19zYTExMDAoKSAocmVhZF9jcHVpZF9wYXJ0KCkgPT0gQVJNX0NQVV9QQVJUX1NBMTEwMCkKKyNkZWZpbmUgY3B1X2lzX3NhMTExMCgpIChyZWFkX2NwdWlkX3BhcnQoKSA9PSBBUk1fQ1BVX1BBUlRfU0ExMTEwKQorCiAvKgogICogSW50ZWwncyBYU2NhbGUzIGNvcmUgc3VwcG9ydHMgc29tZSB2NiBmZWF0dXJlcyAoc3VwZXJzZWN0aW9ucywgTDIpCiAgKiBidXQgYWR2ZXJ0aXNlcyBpdHNlbGYgYXMgdjUgYXMgaXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgdjYgSVNBLiAgRm9yCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9kZWxheS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZGVsYXkuaAppbmRleCBiN2E0MjgxLi5iMWNlMDM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9kZWxheS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RlbGF5LmgKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxhc20vcGFyYW0uaD4JLyogSFogKi8KIAogI2RlZmluZSBNQVhfVURFTEFZX01TCTIKLSNkZWZpbmUgVURFTEFZX01VTFQJVUwoMjA0NyAqIEhaICsgNDgzNjQ4ICogSFogLyAxMDAwMDAwKQorI2RlZmluZSBVREVMQVlfTVVMVAlVTCgyMTQ3ICogSFogKyA0ODM2NDggKiBIWiAvIDEwMDAwMDApCiAjZGVmaW5lIFVERUxBWV9TSElGVAkzMQogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKaW5kZXggZDAwOWY3OS4uYmYwMmRiZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCkBAIC0xMTEsNyArMTExLDcgQEAKIC8qIFRoZSBBUk0gb3ZlcnJpZGUgZm9yIGRtYV9tYXhfcGZuKCkgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkbWFfbWF4X3BmbihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIFBIWVNfUEZOX09GRlNFVCArIGRtYV90b19wZm4oZGV2LCAqZGV2LT5kbWFfbWFzayk7CisJcmV0dXJuIGRtYV90b19wZm4oZGV2LCAqZGV2LT5kbWFfbWFzayk7CiB9CiAjZGVmaW5lIGRtYV9tYXhfcGZuKGRldikgZG1hX21heF9wZm4oZGV2KQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9mbGF0LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9mbGF0LmgKaW5kZXggZTg0N2QyMy4uYWNmMWQxNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZmxhdC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2ZsYXQuaApAQCAtOCw4ICs4LDkgQEAKICNkZWZpbmUJZmxhdF9hcmd2cF9lbnZwX29uX3N0YWNrKCkJCTEKICNkZWZpbmUJZmxhdF9vbGRfcmFtX2ZsYWcoZmxhZ3MpCQkoZmxhZ3MpCiAjZGVmaW5lCWZsYXRfcmVsb2NfdmFsaWQocmVsb2MsIHNpemUpCQkoKHJlbG9jKSA8PSAoc2l6ZSkpCi0jZGVmaW5lCWZsYXRfZ2V0X2FkZHJfZnJvbV9ycChycCwgcmVsdmFsLCBmbGFncywgcGVyc2lzdGVudCkgKCh2b2lkKXBlcnNpc3RlbnQsZ2V0X3VuYWxpZ25lZChycCkpCi0jZGVmaW5lCWZsYXRfcHV0X2FkZHJfYXRfcnAocnAsIHZhbCwgcmVsdmFsKQlwdXRfdW5hbGlnbmVkKHZhbCxycCkKKyNkZWZpbmUJZmxhdF9nZXRfYWRkcl9mcm9tX3JwKHJwLCByZWx2YWwsIGZsYWdzLCBwZXJzaXN0ZW50KSBcCisJKHsgdW5zaWduZWQgbG9uZyBfX3ZhbDsgX19nZXRfdXNlcl91bmFsaWduZWQoX192YWwsIHJwKTsgX192YWw7IH0pCisjZGVmaW5lCWZsYXRfcHV0X2FkZHJfYXRfcnAocnAsIHZhbCwgcmVsdmFsKQlfX3B1dF91c2VyX3VuYWxpZ25lZCh2YWwsIHJwKQogI2RlZmluZQlmbGF0X2dldF9yZWxvY2F0ZV9hZGRyKHJlbCkJCShyZWwpCiAjZGVmaW5lCWZsYXRfc2V0X3BlcnNpc3RlbnQocmVsdmFsLCBwKQkJMAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9nbHVlLWNhY2hlLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9nbHVlLWNhY2hlLmgKaW5kZXggY2FiMDdmNi4uMDFjM2Q5MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZ2x1ZS1jYWNoZS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2dsdWUtY2FjaGUuaApAQCAtMTE4LDExICsxMTgsNyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfVjdNKQotIyBpZmRlZiBfQ0FDSEUKICMgIGRlZmluZSBNVUxUSV9DQUNIRSAxCi0jIGVsc2UKLSMgIGRlZmluZSBfQ0FDSEUgbm9wCi0jIGVuZGlmCiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKF9DQUNIRSkgJiYgIWRlZmluZWQoTVVMVElfQ0FDSEUpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmgKaW5kZXggM2E1ZWMxYy4uNzM2MjkyYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaApAQCAtODcsNiArODcsMTUgQEAKICNkZWZpbmUgTDMxMF9DQUNIRV9JRF9SVExfUjNQMgkJMHgwOAogI2RlZmluZSBMMzEwX0NBQ0hFX0lEX1JUTF9SM1AzCQkweDA5CiAKKyNkZWZpbmUgTDJYMF9FVkVOVF9DTlRfQ1RSTF9FTkFCTEUJQklUKDApCisKKyNkZWZpbmUgTDJYMF9FVkVOVF9DTlRfQ0ZHX1NSQ19TSElGVAkyCisjZGVmaW5lIEwyWDBfRVZFTlRfQ05UX0NGR19TUkNfTUFTSwkweGYKKyNkZWZpbmUgTDJYMF9FVkVOVF9DTlRfQ0ZHX1NSQ19ESVNBQkxFRAkwCisjZGVmaW5lIEwyWDBfRVZFTlRfQ05UX0NGR19JTlRfRElTQUJMRUQJMAorI2RlZmluZSBMMlgwX0VWRU5UX0NOVF9DRkdfSU5UX0lOQ1IJMQorI2RlZmluZSBMMlgwX0VWRU5UX0NOVF9DRkdfSU5UX09WRVJGTE9XCTIKKwogLyogTDJDIGF1eGlsaWFyeSBjb250cm9sIHJlZ2lzdGVyIC0gYml0cyBjb21tb24gdG8gTDJDLTIxMC8yMjAvMzEwICovCiAjZGVmaW5lIEwyQ19BVVhfQ1RSTF9XQVlfU0laRV9TSElGVAkJMTcKICNkZWZpbmUgTDJDX0FVWF9DVFJMX1dBWV9TSVpFX01BU0sJCSg3IDw8IDE3KQpAQCAtMTU3LDYgKzE2NiwxNiBAQAogfQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfQ0FDSEVfTDJYMF9QTVUKK3ZvaWQgbDJ4MF9wbXVfcmVnaXN0ZXIodm9pZCBfX2lvbWVtICpiYXNlLCB1MzIgcGFydCk7Cit2b2lkIGwyeDBfcG11X3N1c3BlbmQodm9pZCk7Cit2b2lkIGwyeDBfcG11X3Jlc3VtZSh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgbDJ4MF9wbXVfcmVnaXN0ZXIodm9pZCBfX2lvbWVtICpiYXNlLCB1MzIgcGFydCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBsMngwX3BtdV9zdXNwZW5kKHZvaWQpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgbDJ4MF9wbXVfcmVzdW1lKHZvaWQpIHt9CisjZW5kaWYKKwogc3RydWN0IGwyeDBfcmVncyB7CiAJdW5zaWduZWQgbG9uZyBwaHlfYmFzZTsKIAl1bnNpZ25lZCBsb25nIGF1eF9jdHJsOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvc2ExMTExLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9zYTExMTEuaAppbmRleCA3YzJiYmM3Li44OTc5ZmEzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9zYTExMTEuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9zYTExMTEuaApAQCAtNDIwLDcgKzQyMCw3IEBACiAJdTY0CQlkbWFfbWFzazsKIH07CiAKLSNkZWZpbmUgU0ExMTExX0RFVihfZCkJY29udGFpbmVyX29mKChfZCksIHN0cnVjdCBzYTExMTFfZGV2LCBkZXYpCisjZGVmaW5lIHRvX3NhMTExMV9kZXZpY2UoeCkJY29udGFpbmVyX29mKHgsIHN0cnVjdCBzYTExMTFfZGV2LCBkZXYpCiAKICNkZWZpbmUgc2ExMTExX2dldF9kcnZkYXRhKGQpCWRldl9nZXRfZHJ2ZGF0YSgmKGQpLT5kZXYpCiAjZGVmaW5lIHNhMTExMV9zZXRfZHJ2ZGF0YShkLHApCWRldl9zZXRfZHJ2ZGF0YSgmKGQpLT5kZXYsIHApCkBAIC00NDYsNiArNDQ2LDggQEAKIGludCBzYTExMTFfZW5hYmxlX2RldmljZShzdHJ1Y3Qgc2ExMTExX2RldiAqKTsKIHZvaWQgc2ExMTExX2Rpc2FibGVfZGV2aWNlKHN0cnVjdCBzYTExMTFfZGV2ICopOwogCitpbnQgc2ExMTExX2dldF9pcnEoc3RydWN0IHNhMTExMV9kZXYgKiwgdW5zaWduZWQgbnVtKTsKKwogdW5zaWduZWQgaW50IHNhMTExMV9wbGxfY2xvY2soc3RydWN0IHNhMTExMV9kZXYgKik7CiAKICNkZWZpbmUgU0ExMTExX0FVRElPX0FDTElOSwkwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9od19icmVha3BvaW50LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9od19icmVha3BvaW50LmgKaW5kZXggOGU0MjdjNy4uYWZjYWY4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaHdfYnJlYWtwb2ludC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2h3X2JyZWFrcG9pbnQuaApAQCAtMTE0LDcgKzExNCw2IEBACiBzdHJ1Y3QgcGVyZl9ldmVudDsKIHN0cnVjdCBwbXU7CiAKLWV4dGVybiBzdHJ1Y3QgcG11IHBlcmZfb3BzX2JwOwogZXh0ZXJuIGludCBhcmNoX2JwX2dlbmVyaWNfZmllbGRzKHN0cnVjdCBhcmNoX2h3X2JyZWFrcG9pbnRfY3RybCBjdHJsLAogCQkJCSAgaW50ICpnZW5fbGVuLCBpbnQgKmdlbl90eXBlKTsKIGV4dGVybiBpbnQgYXJjaF9jaGVja19icF9pbl9rZXJuZWxzcGFjZShzdHJ1Y3QgcGVyZl9ldmVudCAqYnApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tZW1vcnkuaAppbmRleCAzMWMwN2EyLi43NmNiZDljIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tZW1vcnkuaApAQCAtMTU5LDEzICsxNTksOCBAQAogICogUEZOcyBhcmUgdXNlZCB0byBkZXNjcmliZSBhbnkgcGh5c2ljYWwgcGFnZTsgdGhpcyBtZWFucwogICogUEZOIDAgPT0gcGh5c2ljYWwgYWRkcmVzcyAwLgogICovCi0jaWYgZGVmaW5lZChfX3ZpcnRfdG9fcGh5cykKLSNkZWZpbmUgUEhZU19PRkZTRVQJUExBVF9QSFlTX09GRlNFVAotI2RlZmluZSBQSFlTX1BGTl9PRkZTRVQJKCh1bnNpZ25lZCBsb25nKShQSFlTX09GRlNFVCA+PiBQQUdFX1NISUZUKSkKIAotI2RlZmluZSB2aXJ0X3RvX3BmbihrYWRkcikgKF9fcGEoa2FkZHIpID4+IFBBR0VfU0hJRlQpCi0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSTV9QQVRDSF9QSFlTX1ZJUlQpCisjaWYgZGVmaW5lZChDT05GSUdfQVJNX1BBVENIX1BIWVNfVklSVCkKIAogLyoKICAqIENvbnN0YW50cyB1c2VkIHRvIGZvcmNlIHRoZSByaWdodCBpbnN0cnVjdGlvbiBlbmNvZGluZ3MgYW5kIHNoaWZ0cwpAQCAtMTgyLDEwICsxNzcsNiBAQAogI2RlZmluZSBQSFlTX09GRlNFVAkoKHBoeXNfYWRkcl90KV9fcHZfcGh5c19wZm5fb2Zmc2V0IDw8IFBBR0VfU0hJRlQpCiAjZGVmaW5lIFBIWVNfUEZOX09GRlNFVAkoX19wdl9waHlzX3Bmbl9vZmZzZXQpCiAKLSNkZWZpbmUgdmlydF90b19wZm4oa2FkZHIpIFwKLQkoKCgodW5zaWduZWQgbG9uZykoa2FkZHIpIC0gUEFHRV9PRkZTRVQpID4+IFBBR0VfU0hJRlQpICsgXAotCSBQSFlTX1BGTl9PRkZTRVQpCi0KICNkZWZpbmUgX19wdl9zdHViKGZyb20sdG8saW5zdHIsdHlwZSkJCQlcCiAJX19hc21fXygiQCBfX3B2X3N0dWJcbiIJCQkJXAogCSIxOgkiIGluc3RyICIJJTAsICUxLCAlMlxuIgkJXApAQCAtMjU3LDEyICsyNDgsMTIgQEAKIAlyZXR1cm4geCAtIFBIWVNfT0ZGU0VUICsgUEFHRV9PRkZTRVQ7CiB9CiAKKyNlbmRpZgorCiAjZGVmaW5lIHZpcnRfdG9fcGZuKGthZGRyKSBcCiAJKCgoKHVuc2lnbmVkIGxvbmcpKGthZGRyKSAtIFBBR0VfT0ZGU0VUKSA+PiBQQUdFX1NISUZUKSArIFwKIAkgUEhZU19QRk5fT0ZGU0VUKQogCi0jZW5kaWYKLQogLyoKICAqIFRoZXNlIGFyZSAqb25seSogdmFsaWQgb24gdGhlIGtlcm5lbCBkaXJlY3QgbWFwcGVkIFJBTSBtZW1vcnkuCiAgKiBOb3RlOiBEcml2ZXJzIHNob3VsZCBOT1QgdXNlIHRoZXNlLiAgVGhleSBhcmUgdGhlIHdyb25nCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tb2R1bGUuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21vZHVsZS5oCmluZGV4IGUzNThiNzkuLjQ2NDc0OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21vZHVsZS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21vZHVsZS5oCkBAIC0yMywxMCArMjMsOCBAQAogCXN0cnVjdCB1bndpbmRfdGFibGUgKnVud2luZFtBUk1fU0VDX01BWF07CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQVJNX01PRFVMRV9QTFRTCi0Jc3RydWN0IGVsZjMyX3NoZHIgICAqY29yZV9wbHQ7Ci0Jc3RydWN0IGVsZjMyX3NoZHIgICAqaW5pdF9wbHQ7Ci0JaW50CQkgICAgY29yZV9wbHRfY291bnQ7Ci0JaW50CQkgICAgaW5pdF9wbHRfY291bnQ7CisJc3RydWN0IGVsZjMyX3NoZHIgICAqcGx0OworCWludAkJICAgIHBsdF9jb3VudDsKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS0ybGV2ZWwtaHdkZWYuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BndGFibGUtMmxldmVsLWh3ZGVmLmgKaW5kZXggZDAxMzFlZS4uM2Y4MmU5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS0ybGV2ZWwtaHdkZWYuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLTJsZXZlbC1od2RlZi5oCkBAIC00Nyw2ICs0Nyw3IEBACiAjZGVmaW5lIFBNRF9TRUNUX1dCCQkoUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgUE1EX1NFQ1RfQlVGRkVSQUJMRSkKICNkZWZpbmUgUE1EX1NFQ1RfTUlOSUNBQ0hFCShQTURfU0VDVF9URVgoMSkgfCBQTURfU0VDVF9DQUNIRUFCTEUpCiAjZGVmaW5lIFBNRF9TRUNUX1dCV0EJCShQTURfU0VDVF9URVgoMSkgfCBQTURfU0VDVF9DQUNIRUFCTEUgfCBQTURfU0VDVF9CVUZGRVJBQkxFKQorI2RlZmluZSBQTURfU0VDVF9DQUNIRV9NQVNLCShQTURfU0VDVF9URVgoMSkgfCBQTURfU0VDVF9DQUNIRUFCTEUgfCBQTURfU0VDVF9CVUZGRVJBQkxFKQogI2RlZmluZSBQTURfU0VDVF9OT05TSEFSRURfREVWCShQTURfU0VDVF9URVgoMikpCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLTNsZXZlbC1od2RlZi5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS0zbGV2ZWwtaHdkZWYuaAppbmRleCBmOGYxY2ZmLi40Y2Q2NjRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLTNsZXZlbC1od2RlZi5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BndGFibGUtM2xldmVsLWh3ZGVmLmgKQEAgLTYyLDYgKzYyLDcgQEAKICNkZWZpbmUgUE1EX1NFQ1RfV1QJCShfQVQocG1kdmFsX3QsIDIpIDw8IDIpCS8qIG5vcm1hbCBpbm5lciB3cml0ZS10aHJvdWdoICovCiAjZGVmaW5lIFBNRF9TRUNUX1dCCQkoX0FUKHBtZHZhbF90LCAzKSA8PCAyKQkvKiBub3JtYWwgaW5uZXIgd3JpdGUtYmFjayAqLwogI2RlZmluZSBQTURfU0VDVF9XQldBCQkoX0FUKHBtZHZhbF90LCA3KSA8PCAyKQkvKiBub3JtYWwgaW5uZXIgd3JpdGUtYWxsb2MgKi8KKyNkZWZpbmUgUE1EX1NFQ1RfQ0FDSEVfTUFTSwkoX0FUKHBtZHZhbF90LCA3KSA8PCAyKQogCiAvKgogICogKyBMZXZlbCAzIGRlc2NyaXB0b3IgKFBURSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Y3bS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdjdtLmgKaW5kZXggNjE1NzgxYy4uMWZkNzc1YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdjdtLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdjdtLmgKQEAgLTI0LDYgKzI0LDkgQEAKIAogI2RlZmluZSBWN01fU0NCX0NDUgkJCTB4MTQKICNkZWZpbmUgVjdNX1NDQl9DQ1JfU1RLQUxJR04JCQkoMSA8PCA5KQorI2RlZmluZSBWN01fU0NCX0NDUl9EQwkJCQkoMSA8PCAxNikKKyNkZWZpbmUgVjdNX1NDQl9DQ1JfSUMJCQkJKDEgPDwgMTcpCisjZGVmaW5lIFY3TV9TQ0JfQ0NSX0JQCQkJCSgxIDw8IDE4KQogCiAjZGVmaW5lIFY3TV9TQ0JfU0hQUjIJCQkweDFjCiAjZGVmaW5lIFY3TV9TQ0JfU0hQUjMJCQkweDIwCkBAIC00Nyw2ICs1MCwyNSBAQAogI2RlZmluZSBFWENfUkVUX1NUQUNLX01BU0sJCQkweDAwMDAwMDA0CiAjZGVmaW5lIEVYQ19SRVRfVEhSRUFETU9ERV9QUk9DRVNTU1RBQ0sJCTB4ZmZmZmZmZmQKIAorLyogQ2FjaGUgcmVsYXRlZCBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lCVY3TV9TQ0JfQ0xJRFIJCTB4NzgJLyogQ2FjaGUgTGV2ZWwgSUQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVjdNX1NDQl9DVFIJCTB4N2MJLyogQ2FjaGUgVHlwZSByZWdpc3RlciAqLworI2RlZmluZQlWN01fU0NCX0NDU0lEUgkJMHg4MAkvKiBDYWNoZSBzaXplIElEIHJlZ2lzdGVyICovCisjZGVmaW5lCVY3TV9TQ0JfQ1NTRUxSCQkweDg0CS8qIENhY2hlIHNpemUgc2VsZWN0aW9uIHJlZ2lzdGVyICovCisKKy8qIENhY2hlIG9wZWFydGlvbnMgKi8KKyNkZWZpbmUJVjdNX1NDQl9JQ0lBTExVCQkweDI1MAkvKiBJLWNhY2hlIGludmFsaWRhdGUgYWxsIHRvIFBvVSAqLworI2RlZmluZQlWN01fU0NCX0lDSU1WQVUJCTB4MjU4CS8qIEktY2FjaGUgaW52YWxpZGF0ZSBieSBNVkEgdG8gUG9VICovCisjZGVmaW5lCVY3TV9TQ0JfRENJTVZBQwkJMHgyNWMJLyogRC1jYWNoZSBpbnZhbGlkYXRlIGJ5IE1WQSB0byBQb0MgKi8KKyNkZWZpbmUJVjdNX1NDQl9EQ0lTVwkJMHgyNjAJLyogRC1jYWNoZSBpbnZhbGlkYXRlIGJ5IHNldC13YXkgKi8KKyNkZWZpbmUJVjdNX1NDQl9EQ0NNVkFVCQkweDI2NAkvKiBELWNhY2hlIGNsZWFuIGJ5IE1WQSB0byBQb1UgKi8KKyNkZWZpbmUJVjdNX1NDQl9EQ0NNVkFDCQkweDI2OAkvKiBELWNhY2hlIGNsZWFuIGJ5IE1WQSB0byBQb0MgKi8KKyNkZWZpbmUJVjdNX1NDQl9EQ0NTVwkJMHgyNmMJLyogRC1jYWNoZSBjbGVhbiBieSBzZXQtd2F5ICovCisjZGVmaW5lCVY3TV9TQ0JfRENDSU1WQUMJMHgyNzAJLyogRC1jYWNoZSBjbGVhbiBhbmQgaW52YWxpZGF0ZSBieSBNVkEgdG8gUG9DICovCisjZGVmaW5lCVY3TV9TQ0JfRENDSVNXCQkweDI3NAkvKiBELWNhY2hlIGNsZWFuIGFuZCBpbnZhbGlkYXRlIGJ5IHNldC13YXkgKi8KKyNkZWZpbmUJVjdNX1NDQl9CUElBTEwJCTB4Mjc4CS8qIEQtY2FjaGUgY2xlYW4gYW5kIGludmFsaWRhdGUgYnkgc2V0LXdheSAqLworCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiBlbnVtIHJlYm9vdF9tb2RlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2NwdWlkbGUuYyBiL2FyY2gvYXJtL2tlcm5lbC9jcHVpZGxlLmMKaW5kZXggN2RjY2M5Ni4uYTMzMDhhZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2NwdWlkbGUuYworKysgYi9hcmNoL2FybS9rZXJuZWwvY3B1aWRsZS5jCkBAIC0xOSw3ICsxOSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2NwdWlkbGVfbWV0aG9kIF9fY3B1aWRsZV9tZXRob2Rfb2ZfdGFibGVfc2VudGluZWwKIAlfX3VzZWQgX19zZWN0aW9uKF9fY3B1aWRsZV9tZXRob2Rfb2ZfdGFibGVfZW5kKTsKIAotc3RhdGljIHN0cnVjdCBjcHVpZGxlX29wcyBjcHVpZGxlX29wc1tOUl9DUFVTXTsKK3N0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9vcHMgY3B1aWRsZV9vcHNbTlJfQ1BVU10gX19yb19hZnRlcl9pbml0OwogCiAvKioKICAqIGFybV9jcHVpZGxlX3NpbXBsZV9lbnRlcigpIC0gYSB3cmFwcGVyIHRvIGNwdV9kb19pZGxlKCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9kZXZ0cmVlLmMgYi9hcmNoL2FybS9rZXJuZWwvZGV2dHJlZS5jCmluZGV4IDQwZWNkNWYuLmY2NzZmZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9kZXZ0cmVlLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2RldnRyZWUuYwpAQCAtODgsNiArODgsOCBAQAogCQlyZXR1cm47CiAKIAlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKGNwdXMsIGNwdSkgeworCQljb25zdCBfX2JlMzIgKmNlbGw7CisJCWludCBwcm9wX2J5dGVzOwogCQl1MzIgaHdpZDsKIAogCQlpZiAob2Zfbm9kZV9jbXAoY3B1LT50eXBlLCAiY3B1IikpCkBAIC05OSw3ICsxMDEsOCBAQAogCQkgKiBwcm9wZXJ0aWVzIGlzIGNvbnNpZGVyZWQgaW52YWxpZCB0byBidWlsZCB0aGUKIAkJICogY3B1X2xvZ2ljYWxfbWFwLgogCQkgKi8KLQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNwdSwgInJlZyIsICZod2lkKSkgeworCQljZWxsID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdSwgInJlZyIsICZwcm9wX2J5dGVzKTsKKwkJaWYgKCFjZWxsIHx8IHByb3BfYnl0ZXMgPCBzaXplb2YoKmNlbGwpKSB7CiAJCQlwcl9kZWJ1ZygiICogJXMgbWlzc2luZyByZWcgcHJvcGVydHlcbiIsCiAJCQkJICAgICBjcHUtPmZ1bGxfbmFtZSk7CiAJCQlvZl9ub2RlX3B1dChjcHUpOwpAQCAtMTA3LDEwICsxMTAsMTUgQEAKIAkJfQogCiAJCS8qCi0JCSAqIDggTVNCcyBtdXN0IGJlIHNldCB0byAwIGluIHRoZSBEVCBzaW5jZSB0aGUgcmVnIHByb3BlcnR5CisJCSAqIEJpdHMgbjoyNCBtdXN0IGJlIHNldCB0byAwIGluIHRoZSBEVCBzaW5jZSB0aGUgcmVnIHByb3BlcnR5CiAJCSAqIGRlZmluZXMgdGhlIE1QSURSWzIzOjBdLgogCQkgKi8KLQkJaWYgKGh3aWQgJiB+TVBJRFJfSFdJRF9CSVRNQVNLKSB7CisJCWRvIHsKKwkJCWh3aWQgPSBiZTMyX3RvX2NwdSgqY2VsbCsrKTsKKwkJCXByb3BfYnl0ZXMgLT0gc2l6ZW9mKCpjZWxsKTsKKwkJfSB3aGlsZSAoIWh3aWQgJiYgcHJvcF9ieXRlcyA+IDApOworCisJCWlmIChwcm9wX2J5dGVzIHx8IChod2lkICYgfk1QSURSX0hXSURfQklUTUFTSykpIHsKIAkJCW9mX25vZGVfcHV0KGNwdSk7CiAJCQlyZXR1cm47CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TCmluZGV4IGJjNWY1MDcuLjlmMTU3ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUwpAQCAtMjk1LDYgKzI5NSw3IEBACiAJYmwJX191bmRfZmF1bHQKIAogX191bmRfc3ZjX2ZpbmlzaDoKKwlnZXRfdGhyZWFkX2luZm8gdHNrCiAJbGRyCXI1LCBbc3AsICNTX1BTUl0JCUAgR2V0IFNWQyBjcHNyCiAJc3ZjX2V4aXQgcjUJCQkJQCByZXR1cm4gZnJvbSBleGNlcHRpb24KICBVTldJTkQoLmZuZW5kCQkpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL2FybS9rZXJuZWwvZnRyYWNlLmMKaW5kZXggNzA5ZWUxZC4uM2YxNzU5NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2Z0cmFjZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9mdHJhY2UuYwpAQCAtMjE4LDcgKzIxOCw3IEBACiAJfQogCiAJZXJyID0gZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKG9sZCwgc2VsZl9hZGRyLCAmdHJhY2UuZGVwdGgsCi0JCQkJICAgICAgIGZyYW1lX3BvaW50ZXIpOworCQkJCSAgICAgICBmcmFtZV9wb2ludGVyLCBOVUxMKTsKIAlpZiAoZXJyID09IC1FQlVTWSkgewogCQkqcGFyZW50ID0gb2xkOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaGVhZC1ub21tdS5TIGIvYXJjaC9hcm0va2VybmVsL2hlYWQtbm9tbXUuUwppbmRleCBmYjFhNjllLi42YjRlYjI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvaGVhZC1ub21tdS5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9oZWFkLW5vbW11LlMKQEAgLTE1OCw3ICsxNTgsMjEgQEAKIAliaWMJcjAsIHIwLCAjQ1JfVgogI2VuZGlmCiAJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCB3cml0ZSBjb250cm9sIHJlZwotI2VuZGlmIC8qIENPTkZJR19DUFVfQ1AxNSAqLworI2VsaWYgZGVmaW5lZCAoQ09ORklHX0NQVV9WN00pCisJLyogRm9yIFY3TSBzeXN0ZW1zIHdlIHdhbnQgdG8gbW9kaWZ5IHRoZSBDQ1Igc2ltaWxhcmx5IHRvIHRoZSBTQ1RMUiAqLworI2lmZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKKwliaWMJcjAsIHIwLCAjVjdNX1NDQl9DQ1JfREMKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DUFVfQlBSRURJQ1RfRElTQUJMRQorCWJpYwlyMCwgcjAsICNWN01fU0NCX0NDUl9CUAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRQorCWJpYwlyMCwgcjAsICNWN01fU0NCX0NDUl9JQworI2VuZGlmCisJbW92dwlyMywgIzpsb3dlcjE2OihCQVNFQUREUl9WN01fU0NCICsgVjdNX1NDQl9DQ1IpCisJbW92dAlyMywgIzp1cHBlcjE2OihCQVNFQUREUl9WN01fU0NCICsgVjdNX1NDQl9DQ1IpCisJc3RyCXIwLCBbcjNdCisjZW5kaWYgLyogQ09ORklHX0NQVV9DUDE1IGVsaWYgQ09ORklHX0NQVV9WN00gKi8KIAlyZXQJbHIKIEVORFBST0MoX19hZnRlcl9wcm9jX2luaXQpCiAJLmx0b3JnCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaHlwLXN0dWIuUyBiL2FyY2gvYXJtL2tlcm5lbC9oeXAtc3R1Yi5TCmluZGV4IDBiMWU0YTkuLjE1ZDA3M2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9oeXAtc3R1Yi5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9oeXAtc3R1Yi5TCkBAIC0xNDIsNiArMTQyLDE5IEBACiAJYW5kCXI3LCAjMHgxZgkJQCBQcmVzZXJ2ZSBIUE1OCiAJbWNyCXAxNSwgNCwgcjcsIGMxLCBjMSwgMQlAIEhEQ1IKIAorCUAgTWFrZSBzdXJlIE5TLVNWQyBpcyBpbml0aWFsaXNlZCBhcHByb3ByaWF0ZWx5CisJbXJjCXAxNSwgMCwgcjcsIGMxLCBjMCwgMAlAIFNDVExSCisJb3JyCXI3LCAjKDEgPDwgNSkJCUAgQ1AxNSBiYXJyaWVycyBlbmFibGVkCisJYmljCXI3LCAjKDMgPDwgNykJCUAgQ2xlYXIgU0VEL0lURCBmb3IgdjggKFJFUzAgZm9yIHY3KQorCWJpYwlyNywgIygzIDw8IDE5KQkJQCBXWE4gYW5kIFVXWE4gZGlzYWJsZWQKKwltY3IJcDE1LCAwLCByNywgYzEsIGMwLCAwCUAgU0NUTFIKKworCW1yYwlwMTUsIDAsIHI3LCBjMCwgYzAsIDAJQCBNSURSCisJbWNyCXAxNSwgNCwgcjcsIGMwLCBjMCwgMAlAIFZQSURSCisKKwltcmMJcDE1LCAwLCByNywgYzAsIGMwLCA1CUAgTVBJRFIKKwltY3IJcDE1LCA0LCByNywgYzAsIGMwLCA1CUAgVk1QSURSCisKICNpZiAhZGVmaW5lZChaSU1BR0UpICYmIGRlZmluZWQoQ09ORklHX0FSTV9BUkNIX1RJTUVSKQogCUAgbWFrZSBDTlRQXyogYW5kIENOVFBDVCBhY2Nlc3NpYmxlIGZyb20gUEwxCiAJbXJjCXAxNSwgMCwgcjcsIGMwLCBjMSwgMQlAIElEX1BGUjEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9tb2R1bGUtcGx0cy5jIGIvYXJjaC9hcm0va2VybmVsL21vZHVsZS1wbHRzLmMKaW5kZXggMGM3ZWZjMy4uM2E1Y2JhOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL21vZHVsZS1wbHRzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL21vZHVsZS1wbHRzLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc29ydC5oPgogCiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CiAjaW5jbHVkZSA8YXNtL29wY29kZXMuaD4KQEAgLTMwLDE1NCArMzEsMTk4IEBACiAJdTMyCWxpdFtQTFRfRU5UX0NPVU5UXTsKIH07CiAKLXN0YXRpYyBib29sIGluX2luaXQoY29uc3Qgc3RydWN0IG1vZHVsZSAqbW9kLCB1MzIgYWRkcikKLXsKLQlyZXR1cm4gYWRkciAtICh1MzIpbW9kLT5pbml0X2xheW91dC5iYXNlIDwgbW9kLT5pbml0X2xheW91dC5zaXplOwotfQotCiB1MzIgZ2V0X21vZHVsZV9wbHQoc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIGxvYywgRWxmMzJfQWRkciB2YWwpCiB7Ci0Jc3RydWN0IHBsdF9lbnRyaWVzICpwbHQsICpwbHRfZW5kOwotCWludCBjLCAqY291bnQ7CisJc3RydWN0IHBsdF9lbnRyaWVzICpwbHQgPSAoc3RydWN0IHBsdF9lbnRyaWVzICopbW9kLT5hcmNoLnBsdC0+c2hfYWRkcjsKKwlpbnQgaWR4ID0gMDsKIAotCWlmIChpbl9pbml0KG1vZCwgbG9jKSkgewotCQlwbHQgPSAodm9pZCAqKW1vZC0+YXJjaC5pbml0X3BsdC0+c2hfYWRkcjsKLQkJcGx0X2VuZCA9ICh2b2lkICopcGx0ICsgbW9kLT5hcmNoLmluaXRfcGx0LT5zaF9zaXplOwotCQljb3VudCA9ICZtb2QtPmFyY2guaW5pdF9wbHRfY291bnQ7Ci0JfSBlbHNlIHsKLQkJcGx0ID0gKHZvaWQgKiltb2QtPmFyY2guY29yZV9wbHQtPnNoX2FkZHI7Ci0JCXBsdF9lbmQgPSAodm9pZCAqKXBsdCArIG1vZC0+YXJjaC5jb3JlX3BsdC0+c2hfc2l6ZTsKLQkJY291bnQgPSAmbW9kLT5hcmNoLmNvcmVfcGx0X2NvdW50OworCS8qCisJICogTG9vayBmb3IgYW4gZXhpc3RpbmcgZW50cnkgcG9pbnRpbmcgdG8gJ3ZhbCcuIEdpdmVuIHRoYXQgdGhlCisJICogcmVsb2NhdGlvbnMgYXJlIHNvcnRlZCwgdGhpcyB3aWxsIGJlIHRoZSBsYXN0IGVudHJ5IHdlIGFsbG9jYXRlZC4KKwkgKiAoaWYgb25lIGV4aXN0cykuCisJICovCisJaWYgKG1vZC0+YXJjaC5wbHRfY291bnQgPiAwKSB7CisJCXBsdCArPSAobW9kLT5hcmNoLnBsdF9jb3VudCAtIDEpIC8gUExUX0VOVF9DT1VOVDsKKwkJaWR4ID0gKG1vZC0+YXJjaC5wbHRfY291bnQgLSAxKSAlIFBMVF9FTlRfQ09VTlQ7CisKKwkJaWYgKHBsdC0+bGl0W2lkeF0gPT0gdmFsKQorCQkJcmV0dXJuICh1MzIpJnBsdC0+bGRyW2lkeF07CisKKwkJaWR4ID0gKGlkeCArIDEpICUgUExUX0VOVF9DT1VOVDsKKwkJaWYgKCFpZHgpCisJCQlwbHQrKzsKIAl9CiAKLQkvKiBMb29rIGZvciBhbiBleGlzdGluZyBlbnRyeSBwb2ludGluZyB0byAndmFsJyAqLwotCWZvciAoYyA9ICpjb3VudDsgcGx0IDwgcGx0X2VuZDsgYyAtPSBQTFRfRU5UX0NPVU5ULCBwbHQrKykgewotCQlpbnQgaTsKKwltb2QtPmFyY2gucGx0X2NvdW50Kys7CisJQlVHX09OKG1vZC0+YXJjaC5wbHRfY291bnQgKiBQTFRfRU5UX1NJWkUgPiBtb2QtPmFyY2gucGx0LT5zaF9zaXplKTsKIAotCQlpZiAoIWMpIHsKLQkJCS8qIFBvcHVsYXRlIGEgbmV3IHNldCBvZiBlbnRyaWVzICovCi0JCQkqcGx0ID0gKHN0cnVjdCBwbHRfZW50cmllcyl7Ci0JCQkJeyBbMCAuLi4gUExUX0VOVF9DT1VOVCAtIDFdID0gUExUX0VOVF9MRFIsIH0sCi0JCQkJeyB2YWwsIH0KLQkJCX07Ci0JCQkrKypjb3VudDsKLQkJCXJldHVybiAodTMyKXBsdC0+bGRyOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBQTFRfRU5UX0NPVU5UOyBpKyspIHsKLQkJCWlmICghcGx0LT5saXRbaV0pIHsKLQkJCQlwbHQtPmxpdFtpXSA9IHZhbDsKLQkJCQkrKypjb3VudDsKLQkJCX0KLQkJCWlmIChwbHQtPmxpdFtpXSA9PSB2YWwpCi0JCQkJcmV0dXJuICh1MzIpJnBsdC0+bGRyW2ldOwotCQl9CisJaWYgKCFpZHgpCisJCS8qIFBvcHVsYXRlIGEgbmV3IHNldCBvZiBlbnRyaWVzICovCisJCSpwbHQgPSAoc3RydWN0IHBsdF9lbnRyaWVzKXsKKwkJCXsgWzAgLi4uIFBMVF9FTlRfQ09VTlQgLSAxXSA9IFBMVF9FTlRfTERSLCB9LAorCQkJeyB2YWwsIH0KKwkJfTsKKwllbHNlCisJCXBsdC0+bGl0W2lkeF0gPSB2YWw7CisKKwlyZXR1cm4gKHUzMikmcGx0LT5sZHJbaWR4XTsKK30KKworI2RlZmluZSBjbXBfM3dheShhLGIpCSgoYSkgPCAoYikgPyAtMSA6IChhKSA+IChiKSkKKworc3RhdGljIGludCBjbXBfcmVsKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJY29uc3QgRWxmMzJfUmVsICp4ID0gYSwgKnkgPSBiOworCWludCBpOworCisJLyogc29ydCBieSB0eXBlIGFuZCBzeW1ib2wgaW5kZXggKi8KKwlpID0gY21wXzN3YXkoRUxGMzJfUl9UWVBFKHgtPnJfaW5mbyksIEVMRjMyX1JfVFlQRSh5LT5yX2luZm8pKTsKKwlpZiAoaSA9PSAwKQorCQlpID0gY21wXzN3YXkoRUxGMzJfUl9TWU0oeC0+cl9pbmZvKSwgRUxGMzJfUl9TWU0oeS0+cl9pbmZvKSk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBib29sIGlzX3plcm9fYWRkZW5kX3JlbG9jYXRpb24oRWxmMzJfQWRkciBiYXNlLCBjb25zdCBFbGYzMl9SZWwgKnJlbCkKK3sKKwl1MzIgKnR2YWwgPSAodTMyICopKGJhc2UgKyByZWwtPnJfb2Zmc2V0KTsKKworCS8qCisJICogRG8gYSBiaXR3aXNlIGNvbXBhcmUgb24gdGhlIHJhdyBhZGRlbmQgcmF0aGVyIHRoYW4gZnVsbHkgZGVjb2RpbmcKKwkgKiB0aGUgb2Zmc2V0IGFuZCBkb2luZyBhbiBhcml0aG1ldGljIGNvbXBhcmlzb24uCisJICogTm90ZSB0aGF0IGEgemVyby1hZGRlbmQganVtcC9jYWxsIHJlbG9jYXRpb24gaXMgZW5jb2RlZCB0YWtpbmcgdGhlCisJICogUEMgYmlhcyBpbnRvIGFjY291bnQsIGkuZS4sIC04IGZvciBBUk0gYW5kIC00IGZvciBUaHVtYjIuCisJICovCisJc3dpdGNoIChFTEYzMl9SX1RZUEUocmVsLT5yX2luZm8pKSB7CisJCXUxNiB1cHBlciwgbG93ZXI7CisKKwljYXNlIFJfQVJNX1RITV9DQUxMOgorCWNhc2UgUl9BUk1fVEhNX0pVTVAyNDoKKwkJdXBwZXIgPSBfX21lbV90b19vcGNvZGVfdGh1bWIxNigoKHUxNiAqKXR2YWwpWzBdKTsKKwkJbG93ZXIgPSBfX21lbV90b19vcGNvZGVfdGh1bWIxNigoKHUxNiAqKXR2YWwpWzFdKTsKKworCQlyZXR1cm4gKHVwcGVyICYgMHg3ZmYpID09IDB4N2ZmICYmIChsb3dlciAmIDB4MmZmZikgPT0gMHgyZmZlOworCisJY2FzZSBSX0FSTV9DQUxMOgorCWNhc2UgUl9BUk1fUEMyNDoKKwljYXNlIFJfQVJNX0pVTVAyNDoKKwkJcmV0dXJuIChfX21lbV90b19vcGNvZGVfYXJtKCp0dmFsKSAmIDB4ZmZmZmZmKSA9PSAweGZmZmZmZTsKIAl9CiAJQlVHKCk7CiB9CiAKLXN0YXRpYyBpbnQgZHVwbGljYXRlX3JlbChFbGYzMl9BZGRyIGJhc2UsIGNvbnN0IEVsZjMyX1JlbCAqcmVsLCBpbnQgbnVtLAotCQkJICAgdTMyIG1hc2spCitzdGF0aWMgYm9vbCBkdXBsaWNhdGVfcmVsKEVsZjMyX0FkZHIgYmFzZSwgY29uc3QgRWxmMzJfUmVsICpyZWwsIGludCBudW0pCiB7Ci0JdTMyICpsb2MxLCAqbG9jMjsKLQlpbnQgaTsKKwljb25zdCBFbGYzMl9SZWwgKnByZXY7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJaWYgKHJlbFtpXS5yX2luZm8gIT0gcmVsW251bV0ucl9pbmZvKQotCQkJY29udGludWU7CisJLyoKKwkgKiBFbnRyaWVzIGFyZSBzb3J0ZWQgYnkgdHlwZSBhbmQgc3ltYm9sIGluZGV4LiBUaGF0IG1lYW5zIHRoYXQsCisJICogaWYgYSBkdXBsaWNhdGUgZW50cnkgZXhpc3RzLCBpdCBtdXN0IGJlIGluIHRoZSBwcmVjZWRpbmcKKwkgKiBzbG90LgorCSAqLworCWlmICghbnVtKQorCQlyZXR1cm4gZmFsc2U7CiAKLQkJLyoKLQkJICogSWRlbnRpY2FsIHJlbG9jYXRpb24gdHlwZXMgYWdhaW5zdCBpZGVudGljYWwgc3ltYm9scyBjYW4KLQkJICogc3RpbGwgcmVzdWx0IGluIGRpZmZlcmVudCBQTFQgZW50cmllcyBpZiB0aGUgYWRkZW5kIGluIHRoZQotCQkgKiBwbGFjZSBpcyBkaWZmZXJlbnQuIFNvIHJlc29sdmUgdGhlIHRhcmdldCBvZiB0aGUgcmVsb2NhdGlvbgotCQkgKiB0byBjb21wYXJlIHRoZSB2YWx1ZXMuCi0JCSAqLwotCQlsb2MxID0gKHUzMiAqKShiYXNlICsgcmVsW2ldLnJfb2Zmc2V0KTsKLQkJbG9jMiA9ICh1MzIgKikoYmFzZSArIHJlbFtudW1dLnJfb2Zmc2V0KTsKLQkJaWYgKCgoKmxvYzEgXiAqbG9jMikgJiBtYXNrKSA9PSAwKQotCQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOworCXByZXYgPSByZWwgKyBudW0gLSAxOworCXJldHVybiBjbXBfcmVsKHJlbCArIG51bSwgcHJldikgPT0gMCAmJgorCSAgICAgICBpc196ZXJvX2FkZGVuZF9yZWxvY2F0aW9uKGJhc2UsIHByZXYpOwogfQogCiAvKiBDb3VudCBob3cgbWFueSBQTFQgZW50cmllcyB3ZSBtYXkgbmVlZCAqLwotc3RhdGljIHVuc2lnbmVkIGludCBjb3VudF9wbHRzKEVsZjMyX0FkZHIgYmFzZSwgY29uc3QgRWxmMzJfUmVsICpyZWwsIGludCBudW0pCitzdGF0aWMgdW5zaWduZWQgaW50IGNvdW50X3BsdHMoY29uc3QgRWxmMzJfU3ltICpzeW1zLCBFbGYzMl9BZGRyIGJhc2UsCisJCQkgICAgICAgY29uc3QgRWxmMzJfUmVsICpyZWwsIGludCBudW0pCiB7CiAJdW5zaWduZWQgaW50IHJldCA9IDA7CisJY29uc3QgRWxmMzJfU3ltICpzOwogCWludCBpOwogCi0JLyoKLQkgKiBTdXJlLCB0aGlzIGlzIG9yZGVyKG5eMiksIGJ1dCBpdCdzIHVzdWFsbHkgc2hvcnQsIGFuZCBub3QKLQkgKiB0aW1lIGNyaXRpY2FsCi0JICovCi0JZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewogCQlzd2l0Y2ggKEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSkgewogCQljYXNlIFJfQVJNX0NBTEw6CiAJCWNhc2UgUl9BUk1fUEMyNDoKIAkJY2FzZSBSX0FSTV9KVU1QMjQ6Ci0JCQlpZiAoIWR1cGxpY2F0ZV9yZWwoYmFzZSwgcmVsLCBpLAotCQkJCQkgICBfX29wY29kZV90b19tZW1fYXJtKDB4MDBmZmZmZmYpKSkKLQkJCQlyZXQrKzsKLQkJCWJyZWFrOwotI2lmZGVmIENPTkZJR19USFVNQjJfS0VSTkVMCiAJCWNhc2UgUl9BUk1fVEhNX0NBTEw6CiAJCWNhc2UgUl9BUk1fVEhNX0pVTVAyNDoKLQkJCWlmICghZHVwbGljYXRlX3JlbChiYXNlLCByZWwsIGksCi0JCQkJCSAgIF9fb3Bjb2RlX3RvX21lbV90aHVtYjMyKDB4MDdmZjJmZmYpKSkKKwkJCS8qCisJCQkgKiBXZSBvbmx5IGhhdmUgdG8gY29uc2lkZXIgYnJhbmNoIHRhcmdldHMgdGhhdCByZXNvbHZlCisJCQkgKiB0byB1bmRlZmluZWQgc3ltYm9scy4gVGhpcyBpcyBub3Qgc2ltcGx5IGEgaGV1cmlzdGljLAorCQkJICogaXQgaXMgYSBmdW5kYW1lbnRhbCBsaW1pdGF0aW9uLCBzaW5jZSB0aGUgUExUIGl0c2VsZgorCQkJICogaXMgcGFydCBvZiB0aGUgbW9kdWxlLCBhbmQgbmVlZHMgdG8gYmUgd2l0aGluIHJhbmdlCisJCQkgKiBhcyB3ZWxsLCBzbyBtb2R1bGVzIGNhbiBuZXZlciBncm93IGJleW9uZCB0aGF0IGxpbWl0LgorCQkJICovCisJCQlzID0gc3ltcyArIEVMRjMyX1JfU1lNKHJlbFtpXS5yX2luZm8pOworCQkJaWYgKHMtPnN0X3NobmR4ICE9IFNITl9VTkRFRikKKwkJCQlicmVhazsKKworCQkJLyoKKwkJCSAqIEp1bXAgcmVsb2NhdGlvbnMgd2l0aCBub24temVybyBhZGRlbmRzIGFnYWluc3QKKwkJCSAqIHVuZGVmaW5lZCBzeW1ib2xzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIEVMRiBzcGVjLCBidXQKKwkJCSAqIGRvIG5vdCBvY2N1ciBpbiBwcmFjdGljZSAoZS5nLiwgJ2p1bXAgbiBieXRlcyBwYXN0CisJCQkgKiB0aGUgZW50cnkgcG9pbnQgb2YgdW5kZWZpbmVkIGZ1bmN0aW9uIHN5bWJvbCBmJykuCisJCQkgKiBTbyB3ZSBuZWVkIHRvIHN1cHBvcnQgdGhlbSwgYnV0IHRoZXJlIGlzIG5vIG5lZWQgdG8KKwkJCSAqIHRha2UgdGhlbSBpbnRvIGNvbnNpZGVyYXRpb24gd2hlbiB0cnlpbmcgdG8gb3B0aW1pemUKKwkJCSAqIHRoaXMgY29kZS4gU28gbGV0J3Mgb25seSBjaGVjayBmb3IgZHVwbGljYXRlcyB3aGVuCisJCQkgKiB0aGUgYWRkZW5kIGlzIHplcm8uCisJCQkgKi8KKwkJCWlmICghaXNfemVyb19hZGRlbmRfcmVsb2NhdGlvbihiYXNlLCByZWwgKyBpKSB8fAorCQkJICAgICFkdXBsaWNhdGVfcmVsKGJhc2UsIHJlbCwgaSkpCiAJCQkJcmV0Kys7Ci0jZW5kaWYKIAkJfQorCX0KIAlyZXR1cm4gcmV0OwogfQogCiBpbnQgbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhFbGZfRWhkciAqZWhkciwgRWxmX1NoZHIgKnNlY2hkcnMsCiAJCQkgICAgICBjaGFyICpzZWNzdHJpbmdzLCBzdHJ1Y3QgbW9kdWxlICptb2QpCiB7Ci0JdW5zaWduZWQgbG9uZyBjb3JlX3BsdHMgPSAwLCBpbml0X3BsdHMgPSAwOworCXVuc2lnbmVkIGxvbmcgcGx0cyA9IDA7CiAJRWxmMzJfU2hkciAqcywgKnNlY2hkcnNfZW5kID0gc2VjaGRycyArIGVoZHItPmVfc2hudW07CisJRWxmMzJfU3ltICpzeW1zID0gTlVMTDsKIAogCS8qCiAJICogVG8gc3RvcmUgdGhlIFBMVHMsIHdlIGV4cGFuZCB0aGUgLnRleHQgc2VjdGlvbiBmb3IgY29yZSBtb2R1bGUgY29kZQotCSAqIGFuZCB0aGUgLmluaXQudGV4dCBzZWN0aW9uIGZvciBpbml0aWFsaXphdGlvbiBjb2RlLgorCSAqIGFuZCBmb3IgaW5pdGlhbGl6YXRpb24gY29kZS4KIAkgKi8KLQlmb3IgKHMgPSBzZWNoZHJzOyBzIDwgc2VjaGRyc19lbmQ7ICsrcykKLQkJaWYgKHN0cmNtcCgiLmNvcmUucGx0Iiwgc2Vjc3RyaW5ncyArIHMtPnNoX25hbWUpID09IDApCi0JCQltb2QtPmFyY2guY29yZV9wbHQgPSBzOwotCQllbHNlIGlmIChzdHJjbXAoIi5pbml0LnBsdCIsIHNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lKSA9PSAwKQotCQkJbW9kLT5hcmNoLmluaXRfcGx0ID0gczsKKwlmb3IgKHMgPSBzZWNoZHJzOyBzIDwgc2VjaGRyc19lbmQ7ICsrcykgeworCQlpZiAoc3RyY21wKCIucGx0Iiwgc2Vjc3RyaW5ncyArIHMtPnNoX25hbWUpID09IDApCisJCQltb2QtPmFyY2gucGx0ID0gczsKKwkJZWxzZSBpZiAocy0+c2hfdHlwZSA9PSBTSFRfU1lNVEFCKQorCQkJc3ltcyA9IChFbGYzMl9TeW0gKilzLT5zaF9hZGRyOworCX0KIAotCWlmICghbW9kLT5hcmNoLmNvcmVfcGx0IHx8ICFtb2QtPmFyY2guaW5pdF9wbHQpIHsKLQkJcHJfZXJyKCIlczogc2VjdGlvbnMgbWlzc2luZ1xuIiwgbW9kLT5uYW1lKTsKKwlpZiAoIW1vZC0+YXJjaC5wbHQpIHsKKwkJcHJfZXJyKCIlczogbW9kdWxlIFBMVCBzZWN0aW9uIG1pc3NpbmdcbiIsIG1vZC0+bmFtZSk7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisJaWYgKCFzeW1zKSB7CisJCXByX2VycigiJXM6IG1vZHVsZSBzeW10YWIgc2VjdGlvbiBtaXNzaW5nXG4iLCBtb2QtPm5hbWUpOwogCQlyZXR1cm4gLUVOT0VYRUM7CiAJfQogCiAJZm9yIChzID0gc2VjaGRycyArIDE7IHMgPCBzZWNoZHJzX2VuZDsgKytzKSB7Ci0JCWNvbnN0IEVsZjMyX1JlbCAqcmVscyA9ICh2b2lkICopZWhkciArIHMtPnNoX29mZnNldDsKKwkJRWxmMzJfUmVsICpyZWxzID0gKHZvaWQgKillaGRyICsgcy0+c2hfb2Zmc2V0OwogCQlpbnQgbnVtcmVscyA9IHMtPnNoX3NpemUgLyBzaXplb2YoRWxmMzJfUmVsKTsKIAkJRWxmMzJfU2hkciAqZHN0c2VjID0gc2VjaGRycyArIHMtPnNoX2luZm87CiAKIAkJaWYgKHMtPnNoX3R5cGUgIT0gU0hUX1JFTCkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChzdHJzdHIoc2Vjc3RyaW5ncyArIHMtPnNoX25hbWUsICIuaW5pdCIpKQotCQkJaW5pdF9wbHRzICs9IGNvdW50X3BsdHMoZHN0c2VjLT5zaF9hZGRyLCByZWxzLCBudW1yZWxzKTsKLQkJZWxzZQotCQkJY29yZV9wbHRzICs9IGNvdW50X3BsdHMoZHN0c2VjLT5zaF9hZGRyLCByZWxzLCBudW1yZWxzKTsKKwkJLyogaWdub3JlIHJlbG9jYXRpb25zIHRoYXQgb3BlcmF0ZSBvbiBub24tZXhlYyBzZWN0aW9ucyAqLworCQlpZiAoIShkc3RzZWMtPnNoX2ZsYWdzICYgU0hGX0VYRUNJTlNUUikpCisJCQljb250aW51ZTsKKworCQkvKiBzb3J0IGJ5IHR5cGUgYW5kIHN5bWJvbCBpbmRleCAqLworCQlzb3J0KHJlbHMsIG51bXJlbHMsIHNpemVvZihFbGYzMl9SZWwpLCBjbXBfcmVsLCBOVUxMKTsKKworCQlwbHRzICs9IGNvdW50X3BsdHMoc3ltcywgZHN0c2VjLT5zaF9hZGRyLCByZWxzLCBudW1yZWxzKTsKIAl9CiAKLQltb2QtPmFyY2guY29yZV9wbHQtPnNoX3R5cGUgPSBTSFRfTk9CSVRTOwotCW1vZC0+YXJjaC5jb3JlX3BsdC0+c2hfZmxhZ3MgPSBTSEZfRVhFQ0lOU1RSIHwgU0hGX0FMTE9DOwotCW1vZC0+YXJjaC5jb3JlX3BsdC0+c2hfYWRkcmFsaWduID0gTDFfQ0FDSEVfQllURVM7Ci0JbW9kLT5hcmNoLmNvcmVfcGx0LT5zaF9zaXplID0gcm91bmRfdXAoY29yZV9wbHRzICogUExUX0VOVF9TSVpFLAotCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwbHRfZW50cmllcykpOwotCW1vZC0+YXJjaC5jb3JlX3BsdF9jb3VudCA9IDA7CisJbW9kLT5hcmNoLnBsdC0+c2hfdHlwZSA9IFNIVF9OT0JJVFM7CisJbW9kLT5hcmNoLnBsdC0+c2hfZmxhZ3MgPSBTSEZfRVhFQ0lOU1RSIHwgU0hGX0FMTE9DOworCW1vZC0+YXJjaC5wbHQtPnNoX2FkZHJhbGlnbiA9IEwxX0NBQ0hFX0JZVEVTOworCW1vZC0+YXJjaC5wbHQtPnNoX3NpemUgPSByb3VuZF91cChwbHRzICogUExUX0VOVF9TSVpFLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgcGx0X2VudHJpZXMpKTsKKwltb2QtPmFyY2gucGx0X2NvdW50ID0gMDsKIAotCW1vZC0+YXJjaC5pbml0X3BsdC0+c2hfdHlwZSA9IFNIVF9OT0JJVFM7Ci0JbW9kLT5hcmNoLmluaXRfcGx0LT5zaF9mbGFncyA9IFNIRl9FWEVDSU5TVFIgfCBTSEZfQUxMT0M7Ci0JbW9kLT5hcmNoLmluaXRfcGx0LT5zaF9hZGRyYWxpZ24gPSBMMV9DQUNIRV9CWVRFUzsKLQltb2QtPmFyY2guaW5pdF9wbHQtPnNoX3NpemUgPSByb3VuZF91cChpbml0X3BsdHMgKiBQTFRfRU5UX1NJWkUsCi0JCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHBsdF9lbnRyaWVzKSk7Ci0JbW9kLT5hcmNoLmluaXRfcGx0X2NvdW50ID0gMDsKLQlwcl9kZWJ1ZygiJXM6IGNvcmUucGx0PSV4LCBpbml0LnBsdD0leFxuIiwgX19mdW5jX18sCi0JCSBtb2QtPmFyY2guY29yZV9wbHQtPnNoX3NpemUsIG1vZC0+YXJjaC5pbml0X3BsdC0+c2hfc2l6ZSk7CisJcHJfZGVidWcoIiVzOiBwbHQ9JXhcbiIsIF9fZnVuY19fLCBtb2QtPmFyY2gucGx0LT5zaF9zaXplKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9tb2R1bGUubGRzIGIvYXJjaC9hcm0va2VybmVsL21vZHVsZS5sZHMKaW5kZXggMzY4MmZhMS4uMDU4ODFlMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL21vZHVsZS5sZHMKKysrIGIvYXJjaC9hcm0va2VybmVsL21vZHVsZS5sZHMKQEAgLTEsNCArMSwzIEBACiBTRUNUSU9OUyB7Ci0gICAgICAgIC5jb3JlLnBsdCA6IHsgQllURSgwKSB9Ci0gICAgICAgIC5pbml0LnBsdCA6IHsgQllURSgwKSB9CisJLnBsdCA6IHsgQllURSgwKSB9CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF92Ny5jIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfdjcuYwppbmRleCAxNTA2Mzg1Li5iOTQyMzQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF92Ny5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3Y3LmMKQEAgLTU5NiwxMiArNTk2LDYgQEAKIAkuYXR0cnMgPSBhcm12N19wbXV2MV9ldmVudF9hdHRycywKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphcm12N19wbXV2MV9hdHRyX2dyb3Vwc1tdID0gewotCSZhcm12N19wbXV2MV9ldmVudHNfYXR0cl9ncm91cCwKLQkmYXJtdjdfcG11X2Zvcm1hdF9hdHRyX2dyb3VwLAotCU5VTEwsCi19OwotCiBBUk1WN19FVkVOVF9BVFRSKG1lbV9hY2Nlc3MsIEFSTVY3X1BFUkZDVFJfTUVNX0FDQ0VTUyk7CiBBUk1WN19FVkVOVF9BVFRSKGwxaV9jYWNoZSwgQVJNVjdfUEVSRkNUUl9MMV9JQ0FDSEVfQUNDRVNTKTsKIEFSTVY3X0VWRU5UX0FUVFIobDFkX2NhY2hlX3diLCBBUk1WN19QRVJGQ1RSX0wxX0RDQUNIRV9XQik7CkBAIC02NTMsMTIgKzY0Nyw2IEBACiAJLmF0dHJzID0gYXJtdjdfcG11djJfZXZlbnRfYXR0cnMsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYXJtdjdfcG11djJfYXR0cl9ncm91cHNbXSA9IHsKLQkmYXJtdjdfcG11djJfZXZlbnRzX2F0dHJfZ3JvdXAsCi0JJmFybXY3X3BtdV9mb3JtYXRfYXR0cl9ncm91cCwKLQlOVUxMLAotfTsKLQogLyoKICAqIFBlcmYgRXZlbnRzJyBpbmRpY2VzCiAgKi8KQEAgLTEyMDgsNyArMTE5NiwxMCBAQAogCWFybXY3cG11X2luaXQoY3B1X3BtdSk7CiAJY3B1X3BtdS0+bmFtZQkJPSAiYXJtdjdfY29ydGV4X2E4IjsKIAljcHVfcG11LT5tYXBfZXZlbnQJPSBhcm12N19hOF9tYXBfZXZlbnQ7Ci0JY3B1X3BtdS0+cG11LmF0dHJfZ3JvdXBzID0gYXJtdjdfcG11djFfYXR0cl9ncm91cHM7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRVZFTlRTXSA9CisJCSZhcm12N19wbXV2MV9ldmVudHNfYXR0cl9ncm91cDsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9GT1JNQVRTXSA9CisJCSZhcm12N19wbXVfZm9ybWF0X2F0dHJfZ3JvdXA7CiAJcmV0dXJuIGFybXY3X3Byb2JlX251bV9ldmVudHMoY3B1X3BtdSk7CiB9CiAKQEAgLTEyMTcsNyArMTIwOCwxMCBAQAogCWFybXY3cG11X2luaXQoY3B1X3BtdSk7CiAJY3B1X3BtdS0+bmFtZQkJPSAiYXJtdjdfY29ydGV4X2E5IjsKIAljcHVfcG11LT5tYXBfZXZlbnQJPSBhcm12N19hOV9tYXBfZXZlbnQ7Ci0JY3B1X3BtdS0+cG11LmF0dHJfZ3JvdXBzID0gYXJtdjdfcG11djFfYXR0cl9ncm91cHM7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRVZFTlRTXSA9CisJCSZhcm12N19wbXV2MV9ldmVudHNfYXR0cl9ncm91cDsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9GT1JNQVRTXSA9CisJCSZhcm12N19wbXVfZm9ybWF0X2F0dHJfZ3JvdXA7CiAJcmV0dXJuIGFybXY3X3Byb2JlX251bV9ldmVudHMoY3B1X3BtdSk7CiB9CiAKQEAgLTEyMjYsNyArMTIyMCwxMCBAQAogCWFybXY3cG11X2luaXQoY3B1X3BtdSk7CiAJY3B1X3BtdS0+bmFtZQkJPSAiYXJtdjdfY29ydGV4X2E1IjsKIAljcHVfcG11LT5tYXBfZXZlbnQJPSBhcm12N19hNV9tYXBfZXZlbnQ7Ci0JY3B1X3BtdS0+cG11LmF0dHJfZ3JvdXBzID0gYXJtdjdfcG11djFfYXR0cl9ncm91cHM7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRVZFTlRTXSA9CisJCSZhcm12N19wbXV2MV9ldmVudHNfYXR0cl9ncm91cDsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9GT1JNQVRTXSA9CisJCSZhcm12N19wbXVfZm9ybWF0X2F0dHJfZ3JvdXA7CiAJcmV0dXJuIGFybXY3X3Byb2JlX251bV9ldmVudHMoY3B1X3BtdSk7CiB9CiAKQEAgLTEyMzYsNyArMTIzMywxMCBAQAogCWNwdV9wbXUtPm5hbWUJCT0gImFybXY3X2NvcnRleF9hMTUiOwogCWNwdV9wbXUtPm1hcF9ldmVudAk9IGFybXY3X2ExNV9tYXBfZXZlbnQ7CiAJY3B1X3BtdS0+c2V0X2V2ZW50X2ZpbHRlciA9IGFybXY3cG11X3NldF9ldmVudF9maWx0ZXI7Ci0JY3B1X3BtdS0+cG11LmF0dHJfZ3JvdXBzID0gYXJtdjdfcG11djJfYXR0cl9ncm91cHM7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRVZFTlRTXSA9CisJCSZhcm12N19wbXV2Ml9ldmVudHNfYXR0cl9ncm91cDsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9GT1JNQVRTXSA9CisJCSZhcm12N19wbXVfZm9ybWF0X2F0dHJfZ3JvdXA7CiAJcmV0dXJuIGFybXY3X3Byb2JlX251bV9ldmVudHMoY3B1X3BtdSk7CiB9CiAKQEAgLTEyNDYsNyArMTI0NiwxMCBAQAogCWNwdV9wbXUtPm5hbWUJCT0gImFybXY3X2NvcnRleF9hNyI7CiAJY3B1X3BtdS0+bWFwX2V2ZW50CT0gYXJtdjdfYTdfbWFwX2V2ZW50OwogCWNwdV9wbXUtPnNldF9ldmVudF9maWx0ZXIgPSBhcm12N3BtdV9zZXRfZXZlbnRfZmlsdGVyOwotCWNwdV9wbXUtPnBtdS5hdHRyX2dyb3VwcyA9IGFybXY3X3BtdXYyX2F0dHJfZ3JvdXBzOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0VWRU5UU10gPQorCQkmYXJtdjdfcG11djJfZXZlbnRzX2F0dHJfZ3JvdXA7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRk9STUFUU10gPQorCQkmYXJtdjdfcG11X2Zvcm1hdF9hdHRyX2dyb3VwOwogCXJldHVybiBhcm12N19wcm9iZV9udW1fZXZlbnRzKGNwdV9wbXUpOwogfQogCkBAIC0xMjU2LDcgKzEyNTksMTAgQEAKIAljcHVfcG11LT5uYW1lCQk9ICJhcm12N19jb3J0ZXhfYTEyIjsKIAljcHVfcG11LT5tYXBfZXZlbnQJPSBhcm12N19hMTJfbWFwX2V2ZW50OwogCWNwdV9wbXUtPnNldF9ldmVudF9maWx0ZXIgPSBhcm12N3BtdV9zZXRfZXZlbnRfZmlsdGVyOwotCWNwdV9wbXUtPnBtdS5hdHRyX2dyb3VwcyA9IGFybXY3X3BtdXYyX2F0dHJfZ3JvdXBzOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0VWRU5UU10gPQorCQkmYXJtdjdfcG11djJfZXZlbnRzX2F0dHJfZ3JvdXA7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRk9STUFUU10gPQorCQkmYXJtdjdfcG11X2Zvcm1hdF9hdHRyX2dyb3VwOwogCXJldHVybiBhcm12N19wcm9iZV9udW1fZXZlbnRzKGNwdV9wbXUpOwogfQogCkBAIC0xMjY0LDcgKzEyNzAsMTAgQEAKIHsKIAlpbnQgcmV0ID0gYXJtdjdfYTEyX3BtdV9pbml0KGNwdV9wbXUpOwogCWNwdV9wbXUtPm5hbWUgPSAiYXJtdjdfY29ydGV4X2ExNyI7Ci0JY3B1X3BtdS0+cG11LmF0dHJfZ3JvdXBzID0gYXJtdjdfcG11djJfYXR0cl9ncm91cHM7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRVZFTlRTXSA9CisJCSZhcm12N19wbXV2Ml9ldmVudHNfYXR0cl9ncm91cDsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9GT1JNQVRTXSA9CisJCSZhcm12N19wbXVfZm9ybWF0X2F0dHJfZ3JvdXA7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NldHVwLmMgYi9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYwppbmRleCBkZjdmMmE3Li4zNGUzZjNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYwpAQCAtMTE0LDE5ICsxMTQsMTkgQEAKIAogCiAjaWZkZWYgTVVMVElfQ1BVCi1zdHJ1Y3QgcHJvY2Vzc29yIHByb2Nlc3NvciBfX3JlYWRfbW9zdGx5Oworc3RydWN0IHByb2Nlc3NvciBwcm9jZXNzb3IgX19yb19hZnRlcl9pbml0OwogI2VuZGlmCiAjaWZkZWYgTVVMVElfVExCCi1zdHJ1Y3QgY3B1X3RsYl9mbnMgY3B1X3RsYiBfX3JlYWRfbW9zdGx5Oworc3RydWN0IGNwdV90bGJfZm5zIGNwdV90bGIgX19yb19hZnRlcl9pbml0OwogI2VuZGlmCiAjaWZkZWYgTVVMVElfVVNFUgotc3RydWN0IGNwdV91c2VyX2ZucyBjcHVfdXNlciBfX3JlYWRfbW9zdGx5Oworc3RydWN0IGNwdV91c2VyX2ZucyBjcHVfdXNlciBfX3JvX2FmdGVyX2luaXQ7CiAjZW5kaWYKICNpZmRlZiBNVUxUSV9DQUNIRQotc3RydWN0IGNwdV9jYWNoZV9mbnMgY3B1X2NhY2hlIF9fcmVhZF9tb3N0bHk7CitzdHJ1Y3QgY3B1X2NhY2hlX2ZucyBjcHVfY2FjaGUgX19yb19hZnRlcl9pbml0OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX09VVEVSX0NBQ0hFCi1zdHJ1Y3Qgb3V0ZXJfY2FjaGVfZm5zIG91dGVyX2NhY2hlIF9fcmVhZF9tb3N0bHk7CitzdHJ1Y3Qgb3V0ZXJfY2FjaGVfZm5zIG91dGVyX2NhY2hlIF9fcm9fYWZ0ZXJfaW5pdDsKIEVYUE9SVF9TWU1CT0wob3V0ZXJfY2FjaGUpOwogI2VuZGlmCiAKQEAgLTI5MCwxMiArMjkwLDkgQEAKIAkvKiBhcmNoIHNwZWNpZmllcyB0aGUgcmVnaXN0ZXIgZm9ybWF0ICovCiAJc3dpdGNoIChhcmNoKSB7CiAJY2FzZSBDUFVfQVJDSF9BUk12NzoKLQkJYXNtKCJtY3IJcDE1LCAyLCAlMCwgYzAsIGMwLCAwIEAgc2V0IENTU0VMUiIKLQkJICAgIDogLyogTm8gb3V0cHV0IG9wZXJhbmRzICovCi0JCSAgICA6ICJyIiAoMSkpOworCQlzZXRfY3NzZWxyKENTU0VMUl9JQ0FDSEUgfCBDU1NFTFJfTDEpOwogCQlpc2IoKTsKLQkJYXNtKCJtcmMJcDE1LCAxLCAlMCwgYzAsIGMwLCAwIEAgcmVhZCBDQ1NJRFIiCi0JCSAgICA6ICI9ciIgKGlkX3JlZykpOworCQlpZF9yZWcgPSByZWFkX2Njc2lkcigpOwogCQlsaW5lX3NpemUgPSA0IDw8ICgoaWRfcmVnICYgMHg3KSArIDIpOwogCQludW1fc2V0cyA9ICgoaWRfcmVnID4+IDEzKSAmIDB4N2ZmZikgKyAxOwogCQlhbGlhc2luZ19pY2FjaGUgPSAobGluZV9zaXplICogbnVtX3NldHMpID4gUEFHRV9TSVpFOwpAQCAtMzE1LDExICszMTIsMTIgQEAKIHsKIAl1bnNpZ25lZCBpbnQgYXJjaCA9IGNwdV9hcmNoaXRlY3R1cmUoKTsKIAotCWlmIChhcmNoID09IENQVV9BUkNIX0FSTXY3TSkgewotCQljYWNoZWlkID0gMDsKLQl9IGVsc2UgaWYgKGFyY2ggPj0gQ1BVX0FSQ0hfQVJNdjYpIHsKKwlpZiAoYXJjaCA+PSBDUFVfQVJDSF9BUk12NikgewogCQl1bnNpZ25lZCBpbnQgY2FjaGV0eXBlID0gcmVhZF9jcHVpZF9jYWNoZXR5cGUoKTsKLQkJaWYgKChjYWNoZXR5cGUgJiAoNyA8PCAyOSkpID09IDQgPDwgMjkpIHsKKworCQlpZiAoKGFyY2ggPT0gQ1BVX0FSQ0hfQVJNdjdNKSAmJiAhY2FjaGV0eXBlKSB7CisJCQljYWNoZWlkID0gMDsKKwkJfSBlbHNlIGlmICgoY2FjaGV0eXBlICYgKDcgPDwgMjkpKSA9PSA0IDw8IDI5KSB7CiAJCQkvKiBBUk12NyByZWdpc3RlciBmb3JtYXQgKi8KIAkJCWFyY2ggPSBDUFVfQVJDSF9BUk12NzsKIAkJCWNhY2hlaWQgPSBDQUNIRUlEX1ZJUFRfTk9OQUxJQVNJTkc7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc21wLmMgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKaW5kZXggODYxNTIxNi4uOTM3Yzg5MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NtcC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zbXAuYwpAQCAtODIsNyArODIsNyBAQAogCiBzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGNwdV9ydW5uaW5nKTsKIAotc3RhdGljIHN0cnVjdCBzbXBfb3BlcmF0aW9ucyBzbXBfb3BzOworc3RhdGljIHN0cnVjdCBzbXBfb3BlcmF0aW9ucyBzbXBfb3BzIF9fcm9fYWZ0ZXJfaW5pdDsKIAogdm9pZCBfX2luaXQgc21wX3NldF9vcHMoY29uc3Qgc3RydWN0IHNtcF9vcGVyYXRpb25zICpvcHMpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvdmRzby5jIGIvYXJjaC9hcm0va2VybmVsL3Zkc28uYwppbmRleCA5OTRlOTcxLi41M2NmODZjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdmRzby5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC92ZHNvLmMKQEAgLTE3LDYgKzE3LDcgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMzksNyArNDAsNyBAQAogc3RhdGljIHN0cnVjdCBwYWdlICoqdmRzb190ZXh0X3BhZ2VsaXN0OwogCiAvKiBUb3RhbCBudW1iZXIgb2YgcGFnZXMgbmVlZGVkIGZvciB0aGUgZGF0YSBhbmQgdGV4dCBwb3J0aW9ucyBvZiB0aGUgVkRTTy4gKi8KLXVuc2lnbmVkIGludCB2ZHNvX3RvdGFsX3BhZ2VzIF9fcmVhZF9tb3N0bHk7Cit1bnNpZ25lZCBpbnQgdmRzb190b3RhbF9wYWdlcyBfX3JvX2FmdGVyX2luaXQ7CiAKIC8qCiAgKiBUaGUgVkRTTyBkYXRhIHBhZ2UuCkBAIC00NywxMyArNDgsMTMgQEAKIHN0YXRpYyB1bmlvbiB2ZHNvX2RhdGFfc3RvcmUgdmRzb19kYXRhX3N0b3JlIF9fcGFnZV9hbGlnbmVkX2RhdGE7CiBzdGF0aWMgc3RydWN0IHZkc29fZGF0YSAqdmRzb19kYXRhID0gJnZkc29fZGF0YV9zdG9yZS5kYXRhOwogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKnZkc29fZGF0YV9wYWdlOwotc3RhdGljIHN0cnVjdCB2bV9zcGVjaWFsX21hcHBpbmcgdmRzb19kYXRhX21hcHBpbmcgPSB7CitzdGF0aWMgc3RydWN0IHBhZ2UgKnZkc29fZGF0YV9wYWdlIF9fcm9fYWZ0ZXJfaW5pdDsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fc3BlY2lhbF9tYXBwaW5nIHZkc29fZGF0YV9tYXBwaW5nID0gewogCS5uYW1lID0gIlt2dmFyXSIsCiAJLnBhZ2VzID0gJnZkc29fZGF0YV9wYWdlLAogfTsKIAotc3RhdGljIHN0cnVjdCB2bV9zcGVjaWFsX21hcHBpbmcgdmRzb190ZXh0X21hcHBpbmcgPSB7CitzdGF0aWMgc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZyB2ZHNvX3RleHRfbWFwcGluZyBfX3JvX2FmdGVyX2luaXQgPSB7CiAJLm5hbWUgPSAiW3Zkc29dIiwKIH07CiAKQEAgLTY3LDcgKzY4LDcgQEAKIC8qIENhY2hlZCByZXN1bHQgb2YgYm9vdC10aW1lIGNoZWNrIGZvciB3aGV0aGVyIHRoZSBhcmNoIHRpbWVyIGV4aXN0cywKICAqIGFuZCBpZiBzbywgd2hldGhlciB0aGUgdmlydHVhbCBjb3VudGVyIGlzIHVzZWFibGUuCiAgKi8KLXN0YXRpYyBib29sIGNudHZjdF9vayBfX3JlYWRfbW9zdGx5Oworc3RhdGljIGJvb2wgY250dmN0X29rIF9fcm9fYWZ0ZXJfaW5pdDsKIAogc3RhdGljIGJvb2wgX19pbml0IGNudHZjdF9mdW5jdGlvbmFsKHZvaWQpCiB7CkBAIC0yNzAsNyArMjcxLDcgQEAKIAlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX0FSTV9BUkNIX1RJTUVSKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKHN0cmNtcCh0ay0+dGtyX21vbm8uY2xvY2stPm5hbWUsICJhcmNoX3N5c19jb3VudGVyIikgIT0gMCkKKwlpZiAoIXRrLT50a3JfbW9uby5jbG9jay0+YXJjaGRhdGEudmRzb19kaXJlY3QpCiAJCXJldHVybiBmYWxzZTsKIAogCXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va3ZtL2FybS5jIGIvYXJjaC9hcm0va3ZtL2FybS5jCmluZGV4IDc1ZjEzMGUuLmM5NGI5MGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2t2bS9hcm0uYworKysgYi9hcmNoL2FybS9rdm0vYXJtLmMKQEAgLTE1OCw4ICsxNTgsNiBAQAogewogCWludCBpOwogCi0Ja3ZtX2ZyZWVfc3RhZ2UyX3BnZChrdm0pOwotCiAJZm9yIChpID0gMDsgaSA8IEtWTV9NQVhfVkNQVVM7ICsraSkgewogCQlpZiAoa3ZtLT52Y3B1c1tpXSkgewogCQkJa3ZtX2FyY2hfdmNwdV9mcmVlKGt2bS0+dmNwdXNbaV0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va3ZtL21tdS5jIGIvYXJjaC9hcm0va3ZtL21tdS5jCmluZGV4IGJkYTI3YjYuLmU5YTVjMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2t2bS9tbXUuYworKysgYi9hcmNoL2FybS9rdm0vbW11LmMKQEAgLTEzMDksNyArMTMwOSw3IEBACiAJc21wX3JtYigpOwogCiAJcGZuID0gZ2ZuX3RvX3Bmbl9wcm90KGt2bSwgZ2ZuLCB3cml0ZV9mYXVsdCwgJndyaXRhYmxlKTsKLQlpZiAoaXNfZXJyb3JfcGZuKHBmbikpCisJaWYgKGlzX2Vycm9yX25vc2xvdF9wZm4ocGZuKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAoa3ZtX2lzX2RldmljZV9wZm4ocGZuKSkgewpAQCAtMTcxNCw3ICsxNzE0LDggQEAKIAkJIGtlcm5faHlwX3ZhKFBBR0VfT0ZGU0VUKSwga2Vybl9oeXBfdmEofjBVTCkpOwogCiAJaWYgKGh5cF9pZG1hcF9zdGFydCA+PSBrZXJuX2h5cF92YShQQUdFX09GRlNFVCkgJiYKLQkgICAgaHlwX2lkbWFwX3N0YXJ0IDwgIGtlcm5faHlwX3ZhKH4wVUwpKSB7CisJICAgIGh5cF9pZG1hcF9zdGFydCA8ICBrZXJuX2h5cF92YSh+MFVMKSAmJgorCSAgICBoeXBfaWRtYXBfc3RhcnQgIT0gKHVuc2lnbmVkIGxvbmcpX19oeXBfaWRtYXBfdGV4dF9zdGFydCkgewogCQkvKgogCQkgKiBUaGUgaWRtYXAgcGFnZSBpcyBpbnRlcnNlY3Rpbmcgd2l0aCB0aGUgVkEgc3BhY2UsCiAJCSAqIGl0IGlzIG5vdCBzYWZlIHRvIGNvbnRpbnVlIGZ1cnRoZXIuCkBAIC0xODkzLDYgKzE4OTQsNyBAQAogCiB2b2lkIGt2bV9hcmNoX2ZsdXNoX3NoYWRvd19hbGwoc3RydWN0IGt2bSAqa3ZtKQogeworCWt2bV9mcmVlX3N0YWdlMl9wZ2Qoa3ZtKTsKIH0KIAogdm9pZCBrdm1fYXJjaF9mbHVzaF9zaGFkb3dfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvZGVsYXkuYyBiL2FyY2gvYXJtL2xpYi9kZWxheS5jCmluZGV4IDgwNDQ1OTEuLjJjZWYxMTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9kZWxheS5jCisrKyBiL2FyY2gvYXJtL2xpYi9kZWxheS5jCkBAIC0yOSw3ICsyOSw3IEBACiAvKgogICogRGVmYXVsdCB0byB0aGUgbG9vcC1iYXNlZCBkZWxheSBpbXBsZW1lbnRhdGlvbi4KICAqLwotc3RydWN0IGFybV9kZWxheV9vcHMgYXJtX2RlbGF5X29wcyA9IHsKK3N0cnVjdCBhcm1fZGVsYXlfb3BzIGFybV9kZWxheV9vcHMgX19yb19hZnRlcl9pbml0ID0gewogCS5kZWxheQkJPSBfX2xvb3BfZGVsYXksCiAJLmNvbnN0X3VkZWxheQk9IF9fbG9vcF9jb25zdF91ZGVsYXksCiAJLnVkZWxheQkJPSBfX2xvb3BfdWRlbGF5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1iY20vS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtYmNtL0tjb25maWcKaW5kZXggMzRmMGZjYS4uN2JmM2FlNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1iY20vS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWJjbS9LY29uZmlnCkBAIC0xNSw3ICsxNSw2IEBACiAJc2VsZWN0IEhBVkVfQVJNX1NDVSBpZiBTTVAKIAlzZWxlY3QgSEFWRV9BUk1fVFdEIGlmIFNNUAogCXNlbGVjdCBBUk1fR0xPQkFMX1RJTUVSCi0Jc2VsZWN0IENPTU1PTl9DTEtfSVBST0MKIAlzZWxlY3QgQ0xLU1JDX01NSU8KIAlzZWxlY3QgR1BJT0xJQgogCXNlbGVjdCBBUk1fQU1CQQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3Mvc3VzcGVuZC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3Mvc3VzcGVuZC5jCmluZGV4IDM3NTA1NzUuLjA2MzMyZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL3N1c3BlbmQuYworKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9zdXNwZW5kLmMKQEAgLTI1NSw2ICsyNTUsMTIgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJLyoKKwkgKiBDbGVhciB0aGUgT0ZfUE9QVUxBVEVEIGZsYWcgc2V0IGluIG9mX2lycV9pbml0IHNvIHRoYXQKKwkgKiBsYXRlciB0aGUgRXh5bm9zIFBNVSBwbGF0Zm9ybSBkZXZpY2Ugd29uJ3QgYmUgc2tpcHBlZC4KKwkgKi8KKwlvZl9ub2RlX2NsZWFyX2ZsYWcobm9kZSwgT0ZfUE9QVUxBVEVEKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmggYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKaW5kZXggMDJmNmQ3YS4uMjBkNWFkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApAQCAtNTksNyArNTksNyBAQAogI2RlZmluZSBYQlVTX1NXSVRDSF9KMTdfMTEJKCgqWEJVU19TV0lUQ0gpICYgKDEgPDwgNSkpCiAjZGVmaW5lIFhCVVNfU1dJVENIX0oxN185CSgoKlhCVVNfU1dJVENIKSAmICgxIDw8IDYpKQogCi0jZGVmaW5lIFVOQ0FDSEVBQkxFX0FERFIJKEFSTUNTUl9CQVNFICsgMHgxMDgpCisjZGVmaW5lIFVOQ0FDSEVBQkxFX0FERFIJKEFSTUNTUl9CQVNFICsgMHgxMDgpCS8qIENTUl9ST01CQVNFTUFTSyAqLwogCiAKIC8qIFBJQyBpcnEgY29udHJvbCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvZ3BjLmMgYi9hcmNoL2FybS9tYWNoLWlteC9ncGMuYwppbmRleCBmZDg3MjA1Li4wZGYwNjJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9ncGMuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9ncGMuYwpAQCAtMjcxLDYgKzI3MSwxMiBAQAogCWZvciAoaSA9IDA7IGkgPCBJTVJfTlVNOyBpKyspCiAJCXdyaXRlbF9yZWxheGVkKH4wLCBncGNfYmFzZSArIEdQQ19JTVIxICsgaSAqIDQpOwogCisJLyoKKwkgKiBDbGVhciB0aGUgT0ZfUE9QVUxBVEVEIGZsYWcgc2V0IGluIG9mX2lycV9pbml0IHNvIHRoYXQKKwkgKiBsYXRlciB0aGUgR1BDIHBvd2VyIGRvbWFpbiBkcml2ZXIgd2lsbCBub3QgYmUgc2tpcHBlZC4KKwkgKi8KKwlvZl9ub2RlX2NsZWFyX2ZsYWcobm9kZSwgT0ZfUE9QVUxBVEVEKTsKKwogCXJldHVybiAwOwogfQogSVJRQ0hJUF9ERUNMQVJFKGlteF9ncGMsICJmc2wsaW14NnEtZ3BjIiwgaW14X2dwY19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14NnVsLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDZ1bC5jCmluZGV4IDVkOWJmYWIuLjZiYjdkOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14NnVsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXg2dWwuYwpAQCAtNjQsNiArNjQsNyBAQAogCWlmIChwYXJlbnQgPT0gTlVMTCkKIAkJcHJfd2FybigiZmFpbGVkIHRvIGluaXRpYWxpemUgc29jIGRldmljZVxuIik7CiAKKwlvZl9wbGF0Zm9ybV9kZWZhdWx0X3BvcHVsYXRlKE5VTEwsIE5VTEwsIHBhcmVudCk7CiAJaW14NnVsX2VuZXRfaW5pdCgpOwogCWlteF9hbmF0b3BfaW5pdCgpOwogCWlteDZ1bF9wbV9pbml0KCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9wbS1pbXg2LmMgYi9hcmNoL2FybS9tYWNoLWlteC9wbS1pbXg2LmMKaW5kZXggNTg5MjRiMy4uZmU3MDhlMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvcG0taW14Ni5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L3BtLWlteDYuYwpAQCAtMjk1LDcgKzI5NSw3IEBACiAJCXZhbCAmPSB+Qk1fQ0xQQ1JfU0JZT1M7CiAJCWlmIChjcHVfaXNfaW14NnNsKCkpCiAJCQl2YWwgfD0gQk1fQ0xQQ1JfQllQQVNTX1BNSUNfUkVBRFk7Ci0JCWlmIChjcHVfaXNfaW14NnNsKCkgfHwgY3B1X2lzX2lteDZzeCgpKQorCQlpZiAoY3B1X2lzX2lteDZzbCgpIHx8IGNwdV9pc19pbXg2c3goKSB8fCBjcHVfaXNfaW14NnVsKCkpCiAJCQl2YWwgfD0gQk1fQ0xQQ1JfQllQX01NRENfQ0gwX0xQTV9IUzsKIAkJZWxzZQogCQkJdmFsIHw9IEJNX0NMUENSX0JZUF9NTURDX0NIMV9MUE1fSFM7CkBAIC0zMTAsNyArMzEwLDcgQEAKIAkJdmFsIHw9IDB4MyA8PCBCUF9DTFBDUl9TVEJZX0NPVU5UOwogCQl2YWwgfD0gQk1fQ0xQQ1JfVlNUQlk7CiAJCXZhbCB8PSBCTV9DTFBDUl9TQllPUzsKLQkJaWYgKGNwdV9pc19pbXg2c2woKSkKKwkJaWYgKGNwdV9pc19pbXg2c2woKSB8fCBjcHVfaXNfaW14NnN4KCkpCiAJCQl2YWwgfD0gQk1fQ0xQQ1JfQllQQVNTX1BNSUNfUkVBRFk7CiAJCWlmIChjcHVfaXNfaW14NnNsKCkgfHwgY3B1X2lzX2lteDZzeCgpIHx8IGNwdV9pc19pbXg2dWwoKSkKIAkJCXZhbCB8PSBCTV9DTFBDUl9CWVBfTU1EQ19DSDBfTFBNX0hTOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLXBlcmlwaGVyYWxzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYwppbmRleCBhNWFiNzEyLi42ZDNhZjQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Bvd2VyL2lzcDE3MDRfY2hhcmdlci5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvc3BpLW9tYXAyLW1jc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9tdGQtb25lbmFuZC1vbWFwMi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8cGxhdC9kbXRpbWVyLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY20zM3h4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NtMzN4eC5jCmluZGV4IGMwNzNmYjUuLjZmMmQwYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY20zM3h4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbTMzeHguYwpAQCAtMjIwLDkgKzIyMCw2IEBACiB7CiAJaW50IGkgPSAwOwogCi0JaWYgKCFjbGtjdHJsX29mZnMpCi0JCXJldHVybiAwOwotCiAJb21hcF90ZXN0X3RpbWVvdXQoX2lzX21vZHVsZV9yZWFkeShpbnN0LCBjbGtjdHJsX29mZnMpLAogCQkJICBNQVhfTU9EVUxFX1JFQURZX1RJTUUsIGkpOwogCkBAIC0yNDYsOSArMjQzLDYgQEAKIHsKIAlpbnQgaSA9IDA7CiAKLQlpZiAoIWNsa2N0cmxfb2ZmcykKLQkJcmV0dXJuIDA7Ci0KIAlvbWFwX3Rlc3RfdGltZW91dCgoX2Nsa2N0cmxfaWRsZXN0KGluc3QsIGNsa2N0cmxfb2ZmcykgPT0KIAkJCQlDTEtDVFJMX0lETEVTVF9ESVNBQkxFRCksCiAJCQkJTUFYX01PRFVMRV9SRUFEWV9USU1FLCBpKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY21pbnN0NDR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbWluc3Q0NHh4LmMKaW5kZXggMmMwZTA3ZS4uMmFiMjdhZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbWluc3Q0NHh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbWluc3Q0NHh4LmMKQEAgLTI3OCw5ICsyNzgsNiBAQAogewogCWludCBpID0gMDsKIAotCWlmICghY2xrY3RybF9vZmZzKQotCQlyZXR1cm4gMDsKLQogCW9tYXBfdGVzdF90aW1lb3V0KF9pc19tb2R1bGVfcmVhZHkocGFydCwgaW5zdCwgY2xrY3RybF9vZmZzKSwKIAkJCSAgTUFYX01PRFVMRV9SRUFEWV9USU1FLCBpKTsKIApAQCAtMzA0LDkgKzMwMSw2IEBACiB7CiAJaW50IGkgPSAwOwogCi0JaWYgKCFjbGtjdHJsX29mZnMpCi0JCXJldHVybiAwOwotCiAJb21hcF90ZXN0X3RpbWVvdXQoKF9jbGtjdHJsX2lkbGVzdChwYXJ0LCBpbnN0LCBjbGtjdHJsX29mZnMpID09CiAJCQkgICBDTEtDVFJMX0lETEVTVF9ESVNBQkxFRCksCiAJCQkgIE1BWF9NT0RVTEVfRElTQUJMRV9USU1FLCBpKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC13YWtldXBnZW4uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC13YWtldXBnZW4uYwppbmRleCAwYzQ3NTQzLi4zNjlmOTVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXAtd2FrZXVwZ2VuLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLXdha2V1cGdlbi5jCkBAIC0zMjIsMzQgKzMyMiwyNSBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLXN0YXRpYyBpbnQgaXJxX2NwdV9ob3RwbHVnX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCi0JCQkJICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgb21hcF93YWtldXBnZW5fY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1KQogewotCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgaW50KWhjcHU7Ci0KLQkvKgotCSAqIENvcnJlc3BvbmRpbmcgRlJPWkVOIHRyYW5zaXRpb25zIGRvIG5vdCBoYXZlIHRvIGJlIGhhbmRsZWQsCi0JICogdGhleSBhcmUgaGFuZGxlZCBieSBhdCBhIGhpZ2hlciBsZXZlbAotCSAqIChkcml2ZXJzL2NwdWlkbGUvY291cGxlZC5jKS4KLQkgKi8KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ1BVX09OTElORToKLQkJd2FrZXVwZ2VuX2lycW1hc2tfYWxsKGNwdSwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX0RFQUQ6Ci0JCXdha2V1cGdlbl9pcnFtYXNrX2FsbChjcHUsIDEpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKKwl3YWtldXBnZW5faXJxbWFza19hbGwoY3B1LCAwKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBpcnFfaG90cGx1Z19ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IGlycV9jcHVfaG90cGx1Z19ub3RpZnksCi19Oworc3RhdGljIGludCBvbWFwX3dha2V1cGdlbl9jcHVfZGVhZCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXdha2V1cGdlbl9pcnFtYXNrX2FsbChjcHUsIDEpOworCXJldHVybiAwOworfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgaXJxX2hvdHBsdWdfaW5pdCh2b2lkKQogewotCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmaXJxX2hvdHBsdWdfbm90aWZpZXIpOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfT05MSU5FX0RZTiwgImFybS9vbWFwLXdha2U6b25saW5lIiwKKwkJCQkgIG9tYXBfd2FrZXVwZ2VuX2NwdV9vbmxpbmUsIE5VTEwpOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVJNX09NQVBfV0FLRV9ERUFELAorCQkJCSAgImFybS9vbWFwLXdha2U6ZGVhZCIsIE5VTEwsCisJCQkJICBvbWFwX3dha2V1cGdlbl9jcHVfZGVhZCk7CiB9CiAjZWxzZQogc3RhdGljIHZvaWQgX19pbml0IGlycV9ob3RwbHVnX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMKaW5kZXggNWI3MDkzOC4uMTA1MmIyOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMKQEAgLTEwNTMsNiArMTA1MywxMCBAQAogCWlmIChvaC0+ZmxhZ3MgJiBIV01PRF9OT19JRExFU1QpCiAJCXJldHVybiAwOwogCisJaWYgKCFvaC0+cHJjbS5vbWFwNC5jbGtjdHJsX29mZnMgJiYKKwkgICAgIShvaC0+cHJjbS5vbWFwNC5mbGFncyAmIEhXTU9EX09NQVA0X1pFUk9fQ0xLQ1RSTF9PRkZTRVQpKQorCQlyZXR1cm4gMDsKKwogCXJldHVybiBvbWFwX2NtX3dhaXRfbW9kdWxlX2lkbGUob2gtPmNsa2RtLT5wcmNtX3BhcnRpdGlvbiwKIAkJCQkJb2gtPmNsa2RtLT5jbV9pbnN0LAogCQkJCQlvaC0+cHJjbS5vbWFwNC5jbGtjdHJsX29mZnMsIDApOwpAQCAtMjk3MSw2ICsyOTc1LDEwIEBACiAJaWYgKCFfZmluZF9tcHVfcnRfcG9ydChvaCkpCiAJCXJldHVybiAwOwogCisJaWYgKCFvaC0+cHJjbS5vbWFwNC5jbGtjdHJsX29mZnMgJiYKKwkgICAgIShvaC0+cHJjbS5vbWFwNC5mbGFncyAmIEhXTU9EX09NQVA0X1pFUk9fQ0xLQ1RSTF9PRkZTRVQpKQorCQlyZXR1cm4gMDsKKwogCS8qIFhYWCBjaGVjayBtb2R1bGUgU0lETEVNT0RFLCBoYXJkcmVzZXQgc3RhdHVzICovCiAKIAlyZXR1cm4gb21hcF9jbV93YWl0X21vZHVsZV9yZWFkeShvaC0+Y2xrZG0tPnByY21fcGFydGl0aW9uLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuaAppbmRleCA0MDQxYmFkLi43ODkwNDAxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuaApAQCAtNDQzLDggKzQ0MywxMiBAQAogICogSFdNT0RfT01BUDRfTk9fQ09OVEVYVF9MT1NTX0JJVDogU29tZSBJUCBibG9ja3MgZG9uJ3QgaGF2ZSBhIFBSQ00KICAqICAgICBtb2R1bGUtbGV2ZWwgY29udGV4dCBsb3NzIHJlZ2lzdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGVtOyB0aGlzCiAgKiAgICAgZmxhZyBiaXQgc2hvdWxkIGJlIHNldCBpbiB0aG9zZSBjYXNlcworICogSFdNT0RfT01BUDRfWkVST19DTEtDVFJMX09GRlNFVDogU29tZSBJUCBibG9ja3MgaGF2ZSBhIHZhbGlkIENMS0NUUkwKKyAqCW9mZnNldCBvZiB6ZXJvOyB0aGlzIGZsYWcgYml0IHNob3VsZCBiZSBzZXQgaW4gdGhvc2UgY2FzZXMgdG8KKyAqCWRpc3Rpbmd1aXNoIGZyb20gaHdtb2RzIHRoYXQgaGF2ZSBubyBjbGtjdHJsIG9mZnNldC4KICAqLwogI2RlZmluZSBIV01PRF9PTUFQNF9OT19DT05URVhUX0xPU1NfQklUCQkoMSA8PCAwKQorI2RlZmluZSBIV01PRF9PTUFQNF9aRVJPX0NMS0NUUkxfT0ZGU0VUCQkoMSA8PCAxKQogCiAvKioKICAqIHN0cnVjdCBvbWFwX2h3bW9kX29tYXA0X3ByY20gLSBPTUFQNC1zcGVjaWZpYyBQUkNNIGRhdGEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8zM3h4XzQzeHhfaXBibG9ja19kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfMzN4eF80M3h4X2lwYmxvY2tfZGF0YS5jCmluZGV4IDU1YzU4NzguLmUyZDg0YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8zM3h4XzQzeHhfaXBibG9ja19kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzMzeHhfNDN4eF9pcGJsb2NrX2RhdGEuYwpAQCAtMjksNiArMjksNyBAQAogI2RlZmluZSBDTEtDVFJMKG9oLCBjbGtjdHJsKSAoKG9oKS5wcmNtLm9tYXA0LmNsa2N0cmxfb2ZmcyA9IChjbGtjdHJsKSkKICNkZWZpbmUgUlNUQ1RSTChvaCwgcnN0Y3RybCkgKChvaCkucHJjbS5vbWFwNC5yc3RjdHJsX29mZnMgPSAocnN0Y3RybCkpCiAjZGVmaW5lIFJTVFNUKG9oLCByc3RzdCkgKChvaCkucHJjbS5vbWFwNC5yc3RzdF9vZmZzID0gKHJzdHN0KSkKKyNkZWZpbmUgUFJDTV9GTEFHUyhvaCwgZmxhZykgKChvaCkucHJjbS5vbWFwNC5mbGFncyA9IChmbGFnKSkKIAogLyoKICAqICdsMycgY2xhc3MKQEAgLTEyOTYsNiArMTI5Nyw3IEBACiAJQ0xLQ1RSTChhbTMzeHhfaTJjMV9od21vZCwgQU0zM1hYX0NNX1dLVVBfSTJDMF9DTEtDVFJMX09GRlNFVCk7CiAJQ0xLQ1RSTChhbTMzeHhfd2RfdGltZXIxX2h3bW9kLCBBTTMzWFhfQ01fV0tVUF9XRFQxX0NMS0NUUkxfT0ZGU0VUKTsKIAlDTEtDVFJMKGFtMzN4eF9ydGNfaHdtb2QsIEFNMzNYWF9DTV9SVENfUlRDX0NMS0NUUkxfT0ZGU0VUKTsKKwlQUkNNX0ZMQUdTKGFtMzN4eF9ydGNfaHdtb2QsIEhXTU9EX09NQVA0X1pFUk9fQ0xLQ1RSTF9PRkZTRVQpOwogCUNMS0NUUkwoYW0zM3h4X21tYzJfaHdtb2QsIEFNMzNYWF9DTV9QRVJfTU1DMl9DTEtDVFJMX09GRlNFVCk7CiAJQ0xLQ1RSTChhbTMzeHhfZ3BtY19od21vZCwgQU0zM1hYX0NNX1BFUl9HUE1DX0NMS0NUUkxfT0ZGU0VUKTsKIAlDTEtDVFJMKGFtMzN4eF9sNF9sc19od21vZCwgQU0zM1hYX0NNX1BFUl9MNExTX0NMS0NUUkxfT0ZGU0VUKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8zeHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8zeHh4X2RhdGEuYwppbmRleCBkNzJlZTYxLi4xY2M0YTZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfM3h4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzN4eHhfZGF0YS5jCkBAIC03MjIsOCArNzIyLDIwIEBACiAgKiBkaXNwbGF5IHNlcmlhbCBpbnRlcmZhY2UgY29udHJvbGxlcgogICovCiAKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzc19zeXNjb25maWcgb21hcDN4eHhfZHNpX3N5c2MgPSB7CisJLnJldl9vZmZzCT0gMHgwMDAwLAorCS5zeXNjX29mZnMJPSAweDAwMTAsCisJLnN5c3Nfb2Zmcwk9IDB4MDAxNCwKKwkuc3lzY19mbGFncwk9IChTWVNDX0hBU19BVVRPSURMRSB8IFNZU0NfSEFTX0NMT0NLQUNUSVZJVFkgfAorCQkJICAgU1lTQ19IQVNfRU5BV0FLRVVQIHwgU1lTQ19IQVNfU0lETEVNT0RFIHwKKwkJCSAgIFNZU0NfSEFTX1NPRlRSRVNFVCB8IFNZU1NfSEFTX1JFU0VUX1NUQVRVUyksCisJLmlkbGVtb2Rlcwk9IChTSURMRV9GT1JDRSB8IFNJRExFX05PIHwgU0lETEVfU01BUlQpLAorCS5zeXNjX2ZpZWxkcwk9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCit9OworCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDN4eHhfZHNpX2h3bW9kX2NsYXNzID0gewogCS5uYW1lID0gImRzaSIsCisJLnN5c2MJPSAmb21hcDN4eHhfZHNpX3N5c2MsCiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDN4eHhfZHNpMV9pcnFzW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9oeDQ3MDAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2h4NDcwMC5jCmluZGV4IDRhMmY5YWIuLjY2MTg0ZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2h4NDcwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2h4NDcwMC5jCkBAIC0yNCwxMCArMjQsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0L25hdnBvaW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbGNkLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2h0Yy1lZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9hc2ljMy5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcGRhX3Bvd2VyLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9ncGlvLWh0Yy1lZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3B3bS5oPgogI2luY2x1ZGUgPGxpbnV4L3B3bV9iYWNrbGlnaHQuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pZHAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2lkcC5jCmluZGV4IGM0MTBkODQuLjY2MDcwYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2lkcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2lkcC5jCkBAIC04Myw3ICs4Myw4IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNtYzkxeF9wbGF0ZGF0YSBzbWM5MXhfcGxhdGRhdGEgPSB7Ci0JLmZsYWdzID0gU01DOTFYX1VTRV8zMkJJVCB8IFNNQzkxWF9VU0VfRE1BIHwgU01DOTFYX05PV0FJVCwKKwkuZmxhZ3MgPSBTTUM5MVhfVVNFXzhCSVQgfCBTTUM5MVhfVVNFXzE2QklUIHwgU01DOTFYX1VTRV8zMkJJVCB8CisJCSBTTUM5MVhfVVNFX0RNQSB8IFNNQzkxWF9OT1dBSVQsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWM5MXhfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCmluZGV4IDcyNDVmMzMuLmQ2MTU5ZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMKQEAgLTEzNyw2ICsxMzcsMTggQEAKIAkvLyBubyBEKyBwdWxsdXA7IGx1YmJvY2sgY2FuJ3QgY29ubmVjdC9kaXNjb25uZWN0IGluIHNvZnR3YXJlCiB9OwogCitzdGF0aWMgdm9pZCBsdWJib2NrX2luaXRfcGNtY2lhKHZvaWQpCit7CisJc3RydWN0IGNsayAqY2xrOworCisJLyogQWRkIGFuIGFsaWFzIGZvciB0aGUgU0ExMTExIFBDTUNJQSBjbG9jayAqLworCWNsayA9IGNsa19nZXRfc3lzKCJweGEyeHgtcGNtY2lhIiwgTlVMTCk7CisJaWYgKCFJU19FUlIoY2xrKSkgeworCQljbGtkZXZfY3JlYXRlKGNsaywgTlVMTCwgIjE4MDAiKTsKKwkJY2xrX3B1dChjbGspOworCX0KK30KKwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzYTExMTFfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewogCQkuc3RhcnQJPSAweDEwMDAwMDAwLApAQCAtNDY3LDYgKzQ3OSw4IEBACiAJcHhhX3NldF9idHVhcnRfaW5mbyhOVUxMKTsKIAlweGFfc2V0X3N0dWFydF9pbmZvKE5VTEwpOwogCisJbHViYm9ja19pbml0X3BjbWNpYSgpOworCiAJY2xrX2FkZF9hbGlhcygiU0ExMTExX0NMSyIsIE5VTEwsICJHUElPMTFfQ0xLIiwgTlVMTCk7CiAJcHhhX3NldF91ZGNfaW5mbygmdWRjX2luZm8pOwogCXB4YV9zZXRfZmJfaW5mbyhOVUxMLCAmc2hhcnBfbG04djMxKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL21hZ2ljaWFuLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9tYWdpY2lhbi5jCmluZGV4IGFiYzkxODEuLjI2NWY0OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL21hZ2ljaWFuLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbWFnaWNpYW4uYwpAQCAtMjAsMTAgKzIwLDEwIEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2h0Yy1lZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9odGMtcGFzaWMzLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9wZGFfcG93ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2dwaW8taHRjLWVncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcHdtLmg+CiAjaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3hjZXAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3hjZXAuYwppbmRleCAzZjA2Y2Q5Li4wNTYzNjllIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS94Y2VwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEveGNlcC5jCkBAIC0xMjAsNyArMTIwLDggQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc21jOTF4X3BsYXRkYXRhIHhjZXBfc21jOTF4X2luZm8gPSB7Ci0JLmZsYWdzCT0gU01DOTFYX1VTRV8zMkJJVCB8IFNNQzkxWF9OT1dBSVQgfCBTTUM5MVhfVVNFX0RNQSwKKwkuZmxhZ3MJPSBTTUM5MVhfVVNFXzhCSVQgfCBTTUM5MVhfVVNFXzE2QklUIHwgU01DOTFYX1VTRV8zMkJJVCB8CisJCSAgU01DOTFYX05PV0FJVCB8IFNNQzkxWF9VU0VfRE1BLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21jOTF4X2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmMKaW5kZXggYmFmMTc0NS4uYTBlYWQwYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmMKQEAgLTkzLDcgKzkzLDggQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc21jOTF4X3BsYXRkYXRhIHNtYzkxeF9wbGF0ZGF0YSA9IHsKLQkuZmxhZ3MgPSBTTUM5MVhfVVNFXzMyQklUIHwgU01DOTFYX05PV0FJVCwKKwkuZmxhZ3MgPSBTTUM5MVhfVVNFXzhCSVQgfCBTTUM5MVhfVVNFXzE2QklUIHwgU01DOTFYX1VTRV8zMkJJVCB8CisJCSBTTUM5MVhfTk9XQUlULAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcmVhbHZpZXdfZXRoX2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oIGIvYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKaW5kZXggMjU3MTY2Yi4uYWE3OWZhNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKQEAgLTQwLDcgKzQwLDcgQEAKICNkZWZpbmUgU0NSRUVOX0VORAkJMHhkZmMwMDAwMAogI2RlZmluZSBTQ1JFRU5fQkFTRQkJMHhkZjgwMDAwMAogCi0jZGVmaW5lIFVOQ0FDSEVBQkxFX0FERFIJMHhkZjAxMDAwMAorI2RlZmluZSBVTkNBQ0hFQUJMRV9BRERSCShGTFVTSF9CQVNFICsgMHgxMDAwMCkKIAogLyoKICAqIElPIEFkZHJlc3NlcwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNHh4L21hY2gtbWluaTI0NDAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjR4eC9tYWNoLW1pbmkyNDQwLmMKaW5kZXggYTg1MjE2OC4uMTM5OTljMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNHh4L21hY2gtbWluaTI0NDAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0eHgvbWFjaC1taW5pMjQ0MC5jCkBAIC00OTcsOSArNDk3LDI4IEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgdWRhMTM0eF9wbGF0Zm9ybV9kYXRhIHMzYzI0eHhfdWRhMTM0eCA9IHsKKwkubDMgPSB7CisJCS5ncGlvX2NsayA9IFMzQzI0MTBfR1BCKDQpLAorCQkuZ3Bpb19kYXRhID0gUzNDMjQxMF9HUEIoMyksCisJCS5ncGlvX21vZGUgPSBTM0MyNDEwX0dQQigyKSwKKwkJLnVzZV9ncGlvcyA9IDEsCisJCS5kYXRhX2hvbGQgPSAxLAorCQkuZGF0YV9zZXR1cCA9IDEsCisJCS5jbG9ja19oaWdoID0gMSwKKwkJLm1vZGVfaG9sZCA9IDEsCisJCS5tb2RlID0gMSwKKwkJLm1vZGVfc2V0dXAgPSAxLAorCX0sCisJLm1vZGVsID0gVURBMTM0WF9VREExMzQxLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdWRhMTM0MF9jb2RlYyA9IHsKIAkJLm5hbWUgPSAidWRhMTM0eC1jb2RlYyIsCiAJCS5pZCA9IC0xLAorCQkuZGV2ID0geworCQkJLnBsYXRmb3JtX2RhdGEJPSAmczNjMjR4eF91ZGExMzR4LAorCQl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm1pbmkyNDQwX2RldmljZXNbXSBfX2luaXRkYXRhID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2Nsb2NrLmMKaW5kZXggY2JmNTNiYi4uMGRiNDY4OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jbG9jay5jCkBAIC0xMjUsNiArMTI1LDggQEAKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtvcHMgY2xrXzM2ODY0X29wcyA9IHsKKwkuZW5hYmxlCQk9IGNsa19jcHVfZW5hYmxlLAorCS5kaXNhYmxlCT0gY2xrX2NwdV9kaXNhYmxlLAogCS5nZXRfcmF0ZQk9IGNsa18zNjg2NF9nZXRfcmF0ZSwKIH07CiAKQEAgLTE0MCw5ICsxNDIsOCBAQAogCUNMS0RFVl9JTklUKE5VTEwsICJPU1RJTUVSMCIsICZjbGtfMzY4NjQpLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgc2ExMXh4X2Nsa19pbml0KHZvaWQpCitpbnQgX19pbml0IHNhMTF4eF9jbGtfaW5pdCh2b2lkKQogewogCWNsa2Rldl9hZGRfdGFibGUoc2ExMXh4X2Nsa3JlZ3MsIEFSUkFZX1NJWkUoc2ExMXh4X2Nsa3JlZ3MpKTsKIAlyZXR1cm4gMDsKIH0KLWNvcmVfaW5pdGNhbGwoc2ExMXh4X2Nsa19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuYwppbmRleCAzNDVlNjNmLi4zZTA5YmVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9nZW5lcmljLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5jCkBAIC0zNCw2ICszNCw3IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisjaW5jbHVkZSA8bWFjaC9yZXNldC5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgPGNsb2Nrc291cmNlL3B4YS5oPgpAQCAtOTUsNiArOTYsOCBAQAogCiB2b2lkIHNhMTF4MF9yZXN0YXJ0KGVudW0gcmVib290X21vZGUgbW9kZSwgY29uc3QgY2hhciAqY21kKQogeworCWNsZWFyX3Jlc2V0X3N0YXR1cyhSRVNFVF9TVEFUVVNfQUxMKTsKKwogCWlmIChtb2RlID09IFJFQk9PVF9TT0ZUKSB7CiAJCS8qIEp1bXAgaW50byBST00gYXQgYWRkcmVzcyAwICovCiAJCXNvZnRfcmVzdGFydCgwKTsKQEAgLTM4OCw2ICszOTEsNyBAQAogCXNhMTF4MF9pbml0X2lycV9ub2R0KElSUV9HUElPMF9TQywgaXJxX3Jlc291cmNlLnN0YXJ0KTsKIAogCXNhMTEwMF9pbml0X2dwaW8oKTsKKwlzYTExeHhfY2xrX2luaXQoKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuaCBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuaAppbmRleCAwZDkyZTExLi42ODE5OWI2MDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuaAorKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9nZW5lcmljLmgKQEAgLTQ0LDMgKzQ0LDUgQEAKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBzYTExeDBfcG1faW5pdCh2b2lkKSB7IHJldHVybiAwOyB9CiAjZW5kaWYKKworaW50IHNhMTF4eF9jbGtfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzeHh4LmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9oM3h4eC5jCmluZGV4IGIxZDRmYWEuLmI2OWU3NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzeHh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaDN4eHguYwpAQCAtMTQsOSArMTQsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9odGMtZWdwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2dwaW8taHRjLWVncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9zYTExeDAtc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKaW5kZXggY2JlZGQ3NS4uZDk0NGZkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKQEAgLTEzLDcgKzEzLDcgQEAKICNkZWZpbmUgX19BU01fQVJDSF9IQVJEV0FSRV9ICiAKIAotI2RlZmluZSBVTkNBQ0hFQUJMRV9BRERSCTB4ZmEwNTAwMDAKKyNkZWZpbmUgVU5DQUNIRUFCTEVfQUREUgkweGZhMDUwMDAwCS8qIElDSVAgKi8KIAogCiAvKgpAQCAtMzYsMjggKzM2LDEwIEBACiAjZGVmaW5lIGlvX3YycCggeCApICAgICAgICAgICAgIFwKICAgICggKCgoeCkmMHgwMGZmZmZmZikgfCAoKCh4KSYoMHgzMDAwMDAwMD4+VklPX1NISUZUKSk8PFZJT19TSElGVCkpICsgUElPX1NUQVJUICkKIAotI2RlZmluZSBDUFVfU0ExMTEwX0EwCSgwKQotI2RlZmluZSBDUFVfU0ExMTEwX0IwCSg0KQotI2RlZmluZSBDUFVfU0ExMTEwX0IxCSg1KQotI2RlZmluZSBDUFVfU0ExMTEwX0IyCSg2KQotI2RlZmluZSBDUFVfU0ExMTEwX0I0CSg4KQotCi0jZGVmaW5lIENQVV9TQTExMDBfSUQJKDB4NDQwMWExMTApCi0jZGVmaW5lIENQVV9TQTExMDBfTUFTSwkoMHhmZmZmZmZmMCkKLSNkZWZpbmUgQ1BVX1NBMTExMF9JRAkoMHg2OTAxYjExMCkKLSNkZWZpbmUgQ1BVX1NBMTExMF9NQVNLCSgweGZmZmZmZmYwKQotCiAjZGVmaW5lIF9fTVJFRyh4KQlJT01FTShpb19wMnYoeCkpCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLSNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgotCi0jZGVmaW5lIENQVV9SRVZJU0lPTgkocmVhZF9jcHVpZF9pZCgpICYgMTUpCi0KLSNkZWZpbmUgY3B1X2lzX3NhMTEwMCgpCSgocmVhZF9jcHVpZF9pZCgpICYgQ1BVX1NBMTEwMF9NQVNLKSA9PSBDUFVfU0ExMTAwX0lEKQotI2RlZmluZSBjcHVfaXNfc2ExMTEwKCkJKChyZWFkX2NwdWlkX2lkKCkgJiBDUFVfU0ExMTEwX01BU0spID09IENQVV9TQTExMTBfSUQpCi0KICMgZGVmaW5lIF9fUkVHKHgpCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9faW9tZW0gKilpb19wMnYoeCkpKQogIyBkZWZpbmUgX19QUkVHKHgpCShpb192MnAoKHVuc2lnbmVkIGxvbmcpJih4KSkpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BsZWIuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BsZWIuYwppbmRleCAxNTI1ZDdiLi44ODE0OWY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9wbGViLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGxlYi5jCkBAIC00NSw3ICs0NSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNtYzkxeF9wbGF0ZGF0YSBzbWM5MXhfcGxhdGRhdGEgPSB7Ci0JLmZsYWdzID0gU01DOTFYX1VTRV8xNkJJVCB8IFNNQzkxWF9OT1dBSVQsCisJLmZsYWdzID0gU01DOTFYX1VTRV8xNkJJVCB8IFNNQzkxWF9VU0VfOEJJVCB8IFNNQzkxWF9OT1dBSVQsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWM5MXhfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbGF0c21wLXNjdS5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbGF0c21wLXNjdS5jCmluZGV4IDhkNDc4ZjEuLmQxZWNhZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcGxhdHNtcC1zY3UuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BsYXRzbXAtc2N1LmMKQEAgLTIxLDI2ICsyMSwxNCBAQAogc3RhdGljIHBoeXNfYWRkcl90IHNobW9iaWxlX3NjdV9iYXNlX3BoeXM7CiBzdGF0aWMgdm9pZCBfX2lvbWVtICpzaG1vYmlsZV9zY3VfYmFzZTsKIAotc3RhdGljIGludCBzaG1vYmlsZV9zbXBfc2N1X25vdGlmaWVyX2NhbGwoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCi0JCQkJCSAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IHNobW9iaWxlX3NjdV9jcHVfcHJlcGFyZSh1bnNpZ25lZCBpbnQgY3B1KQogewotCXVuc2lnbmVkIGludCBjcHUgPSAobG9uZyloY3B1OwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIENQVV9VUF9QUkVQQVJFOgotCQkvKiBGb3IgdGhpcyBwYXJ0aWN1bGFyIENQVSByZWdpc3RlciBTQ1UgU01QIGJvb3QgdmVjdG9yICovCi0JCXNobW9iaWxlX3NtcF9ob29rKGNwdSwgdmlydF90b19waHlzKHNobW9iaWxlX2Jvb3Rfc2N1KSwKLQkJCQkgIHNobW9iaWxlX3NjdV9iYXNlX3BoeXMpOwotCQlicmVhazsKLQl9OwotCi0JcmV0dXJuIE5PVElGWV9PSzsKKwkvKiBGb3IgdGhpcyBwYXJ0aWN1bGFyIENQVSByZWdpc3RlciBTQ1UgU01QIGJvb3QgdmVjdG9yICovCisJc2htb2JpbGVfc21wX2hvb2soY3B1LCB2aXJ0X3RvX3BoeXMoc2htb2JpbGVfYm9vdF9zY3UpLAorCQkJICBzaG1vYmlsZV9zY3VfYmFzZV9waHlzKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzaG1vYmlsZV9zbXBfc2N1X25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gc2htb2JpbGVfc21wX3NjdV9ub3RpZmllcl9jYWxsLAotfTsKLQogdm9pZCBfX2luaXQgc2htb2JpbGVfc21wX3NjdV9wcmVwYXJlX2NwdXMocGh5c19hZGRyX3Qgc2N1X2Jhc2VfcGh5cywKIAkJCQkJICB1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCiB7CkBAIC01NCw3ICs0Miw5IEBACiAJc2N1X3Bvd2VyX21vZGUoc2htb2JpbGVfc2N1X2Jhc2UsIFNDVV9QTV9OT1JNQUwpOwogCiAJLyogVXNlIENQVSBub3RpZmllciBmb3IgcmVzZXQgdmVjdG9yIGNvbnRyb2wgKi8KLQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnNobW9iaWxlX3NtcF9zY3Vfbm90aWZpZXIpOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVJNX1NITU9CSUxFX1NDVV9QUkVQQVJFLAorCQkJCSAgImFybS9zaG1vYmlsZS1zY3U6cHJlcGFyZSIsCisJCQkJICBzaG1vYmlsZV9zY3VfY3B1X3ByZXBhcmUsIE5VTEwpOwogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3JlZ3VsYXRvci1xdWlyay1yY2FyLWdlbjIuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcmVndWxhdG9yLXF1aXJrLXJjYXItZ2VuMi5jCmluZGV4IDYyNDM3YjUuLjczZTNhZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcmVndWxhdG9yLXF1aXJrLXJjYXItZ2VuMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcmVndWxhdG9yLXF1aXJrLXJjYXItZ2VuMi5jCkBAIC00MSw0MCArNDEsMjcgQEAKIAogI2RlZmluZSBSRUdVTEFUT1JfSVJRX01BU0sJQklUKDIpCS8qIElSUTIsIGFjdGl2ZSBsb3cgKi8KIAorLyogc3RhcnQgb2YgREE5MjEwIFN5c3RlbSBDb250cm9sIGFuZCBFdmVudCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgREE5MjEwX1JFR19NQVNLX0EJCTB4NTQKKwogc3RhdGljIHZvaWQgX19pb21lbSAqaXJxYzsKIAotc3RhdGljIGNvbnN0IHU4IGRhOTA2M19tYXNrX3JlZ3NbXSA9IHsKLQlEQTkwNjNfUkVHX0lSUV9NQVNLX0EsCi0JREE5MDYzX1JFR19JUlFfTUFTS19CLAotCURBOTA2M19SRUdfSVJRX01BU0tfQywKLQlEQTkwNjNfUkVHX0lSUV9NQVNLX0QsCisvKiBmaXJzdCBieXRlIHNldHMgdGhlIG1lbW9yeSBwb2ludGVyLCBmb2xsb3dpbmcgYXJlIGNvbnNlY3V0aXZlIHJlZyB2YWx1ZXMgKi8KK3N0YXRpYyB1OCBkYTkwNjNfaXJxX2NscltdID0geyBEQTkwNjNfUkVHX0lSUV9NQVNLX0EsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKK3N0YXRpYyB1OCBkYTkyMTBfaXJxX2NscltdID0geyBEQTkyMTBfUkVHX01BU0tfQSwgMHhmZiwgMHhmZiB9OworCitzdGF0aWMgc3RydWN0IGkyY19tc2cgZGE5eHh4X21zZ3NbMl0gPSB7CisJeworCQkuYWRkciA9IDB4NTgsCisJCS5sZW4gPSBBUlJBWV9TSVpFKGRhOTA2M19pcnFfY2xyKSwKKwkJLmJ1ZiA9IGRhOTA2M19pcnFfY2xyLAorCX0sIHsKKwkJLmFkZHIgPSAweDY4LAorCQkubGVuID0gQVJSQVlfU0laRShkYTkyMTBfaXJxX2NsciksCisJCS5idWYgPSBkYTkyMTBfaXJxX2NsciwKKwl9LAogfTsKIAotLyogREE5MjEwIFN5c3RlbSBDb250cm9sIGFuZCBFdmVudCBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgREE5MjEwX1JFR19NQVNLX0EJCTB4NTQKLSNkZWZpbmUgREE5MjEwX1JFR19NQVNLX0IJCTB4NTUKLQotc3RhdGljIGNvbnN0IHU4IGRhOTIxMF9tYXNrX3JlZ3NbXSA9IHsKLQlEQTkyMTBfUkVHX01BU0tfQSwKLQlEQTkyMTBfUkVHX01BU0tfQiwKLX07Ci0KLXN0YXRpYyB2b2lkIGRhOXh4eF9tYXNrX2lycXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY29uc3QgdTggcmVnc1tdLAotCQkJICAgICB1bnNpZ25lZCBpbnQgbnJlZ3MpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJNYXNraW5nICVzIGludGVycnVwdCBzb3VyY2VzXG4iLCBjbGllbnQtPm5hbWUpOwotCi0JZm9yIChpID0gMDsgaSA8IG5yZWdzOyBpKyspIHsKLQkJaW50IGVycm9yID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZ3NbaV0sIH4wKTsKLQkJaWYgKGVycm9yKSB7Ci0JCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImkyYyBlcnJvciAlZFxuIiwgZXJyb3IpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotfQotCiBzdGF0aWMgaW50IHJlZ3VsYXRvcl9xdWlya19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKQogewpAQCAtOTMsMTIgKzgwLDE1IEBACiAJY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCWRldl9kYmcoZGV2LCAiRGV0ZWN0ZWQgJXNcbiIsIGNsaWVudC0+bmFtZSk7CiAKLQlpZiAoKGNsaWVudC0+YWRkciA9PSAweDU4ICYmICFzdHJjbXAoY2xpZW50LT5uYW1lLCAiZGE5MDYzIikpKQotCQlkYTl4eHhfbWFza19pcnFzKGNsaWVudCwgZGE5MDYzX21hc2tfcmVncywKLQkJCQkgQVJSQVlfU0laRShkYTkwNjNfbWFza19yZWdzKSk7Ci0JZWxzZSBpZiAoY2xpZW50LT5hZGRyID09IDB4NjggJiYgIXN0cmNtcChjbGllbnQtPm5hbWUsICJkYTkyMTAiKSkKLQkJZGE5eHh4X21hc2tfaXJxcyhjbGllbnQsIGRhOTIxMF9tYXNrX3JlZ3MsCi0JCQkJIEFSUkFZX1NJWkUoZGE5MjEwX21hc2tfcmVncykpOworCWlmICgoY2xpZW50LT5hZGRyID09IDB4NTggJiYgIXN0cmNtcChjbGllbnQtPm5hbWUsICJkYTkwNjMiKSkgfHwKKwkgICAgKGNsaWVudC0+YWRkciA9PSAweDY4ICYmICFzdHJjbXAoY2xpZW50LT5uYW1lLCAiZGE5MjEwIikpKSB7CisJCWludCByZXQ7CisKKwkJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiY2xlYXJpbmcgZGE5MDYzL2RhOTIxMCBpbnRlcnJ1cHRzXG4iKTsKKwkJcmV0ID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgZGE5eHh4X21zZ3MsIEFSUkFZX1NJWkUoZGE5eHh4X21zZ3MpKTsKKwkJaWYgKHJldCAhPSBBUlJBWV9TSVpFKGRhOXh4eF9tc2dzKSkKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaTJjIGVycm9yICVkXG4iLCByZXQpOworCX0KIAogCW1vbiA9IGlvcmVhZDMyKGlycWMgKyBJUlFDX01PTklUT1IpOwogCWlmIChtb24gJiBSRUdVTEFUT1JfSVJRX01BU0spCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9LY29uZmlnIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwppbmRleCBkMTVhN2ZlLi5jMTc5OWRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21tL0tjb25maWcKQEAgLTQwMyw2ICs0MDMsNyBAQAogCWJvb2wKIAlzZWxlY3QgQ1BVXzMydjdNCiAJc2VsZWN0IENQVV9BQlJUX05PTU1VCisJc2VsZWN0IENQVV9DQUNIRV9WN00KIAlzZWxlY3QgQ1BVX0NBQ0hFX05PUAogCXNlbGVjdCBDUFVfUEFCUlRfTEVHQUNZCiAJc2VsZWN0IENQVV9USFVNQk9OTFkKQEAgLTUxOCw2ICs1MTksOSBAQAogY29uZmlnIENQVV9DQUNIRV9GQQogCWJvb2wKIAorY29uZmlnIENQVV9DQUNIRV9WN00KKwlib29sCisKIGlmIE1NVQogIyBUaGUgY29weS1wYWdlIG1vZGVsCiBjb25maWcgQ1BVX0NPUFlfVjRXVApAQCAtNzUwLDE0ICs3NTQsMTQgQEAKIAogY29uZmlnIENQVV9JQ0FDSEVfRElTQUJMRQogCWJvb2wgIkRpc2FibGUgSS1DYWNoZSAoSS1iaXQpIgotCWRlcGVuZHMgb24gQ1BVX0NQMTUgJiYgIShDUFVfQVJNNzIwVCB8fCBDUFVfQVJNNzQwVCB8fCBDUFVfWFNDQUxFIHx8IENQVV9YU0MzKQorCWRlcGVuZHMgb24gKENQVV9DUDE1ICYmICEoQ1BVX0FSTTcyMFQgfHwgQ1BVX0FSTTc0MFQgfHwgQ1BVX1hTQ0FMRSB8fCBDUFVfWFNDMykpIHx8IENQVV9WN00KIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGRpc2FibGUgdGhlIHByb2Nlc3NvciBpbnN0cnVjdGlvbiBjYWNoZS4gVW5sZXNzCiAJICB5b3UgaGF2ZSBhIHJlYXNvbiBub3QgdG8gb3IgYXJlIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBDUFVfRENBQ0hFX0RJU0FCTEUKIAlib29sICJEaXNhYmxlIEQtQ2FjaGUgKEMtYml0KSIKLQlkZXBlbmRzIG9uIENQVV9DUDE1ICYmICFTTVAKKwlkZXBlbmRzIG9uIChDUFVfQ1AxNSAmJiAhU01QKSB8fCBDUFVfVjdNCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBkaXNhYmxlIHRoZSBwcm9jZXNzb3IgZGF0YSBjYWNoZS4gVW5sZXNzCiAJICB5b3UgaGF2ZSBhIHJlYXNvbiBub3QgdG8gb3IgYXJlIHVuc3VyZSwgc2F5IE4uCkBAIC03OTIsNyArNzk2LDcgQEAKIAogY29uZmlnIENQVV9CUFJFRElDVF9ESVNBQkxFCiAJYm9vbCAiRGlzYWJsZSBicmFuY2ggcHJlZGljdGlvbiIKLQlkZXBlbmRzIG9uIENQVV9BUk0xMDIwIHx8IENQVV9WNiB8fCBDUFVfVjZLIHx8IENQVV9NT0hBV0sgfHwgQ1BVX1hTQzMgfHwgQ1BVX1Y3IHx8IENQVV9GQTUyNgorCWRlcGVuZHMgb24gQ1BVX0FSTTEwMjAgfHwgQ1BVX1Y2IHx8IENQVV9WNksgfHwgQ1BVX01PSEFXSyB8fCBDUFVfWFNDMyB8fCBDUFVfVjcgfHwgQ1BVX0ZBNTI2IHx8IENQVV9WN00KIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGRpc2FibGUgYnJhbmNoIHByZWRpY3Rpb24uICBJZiB1bnN1cmUsIHNheSBOLgogCkBAIC05MTYsNiArOTIwLDEzIEBACiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgTDJ4MCBQcmltZUNlbGwuCiAKK2NvbmZpZyBDQUNIRV9MMlgwX1BNVQorCWJvb2wgIkwyeDAgcGVyZm9ybWFuY2UgbW9uaXRvciBzdXBwb3J0IiBpZiBDQUNIRV9MMlgwCisJZGVwZW5kcyBvbiBQRVJGX0VWRU5UUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgZmVhdHVyZXMKKwkgIG9mIHRoZSBMMjIwIGFuZCBQTDMxMCBvdXRlciBjYWNoZSBjb250cm9sbGVycy4KKwogaWYgQ0FDSEVfTDJYMAogCiBjb25maWcgUEwzMTBfRVJSQVRBXzU4ODM2OQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vTWFrZWZpbGUgYi9hcmNoL2FybS9tbS9NYWtlZmlsZQppbmRleCA3Zjc2ZDk2Li5lODY5ODI0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tbS9NYWtlZmlsZQpAQCAtNDMsOSArNDMsMTEgQEAKIG9iai0kKENPTkZJR19DUFVfQ0FDSEVfVjcpCSs9IGNhY2hlLXY3Lm8KIG9iai0kKENPTkZJR19DUFVfQ0FDSEVfRkEpCSs9IGNhY2hlLWZhLm8KIG9iai0kKENPTkZJR19DUFVfQ0FDSEVfTk9QKQkrPSBjYWNoZS1ub3Aubworb2JqLSQoQ09ORklHX0NQVV9DQUNIRV9WN00pCSs9IGNhY2hlLXY3bS5vCiAKIEFGTEFHU19jYWNoZS12Ni5vCTo9LVdhLC1tYXJjaD1hcm12NgogQUZMQUdTX2NhY2hlLXY3Lm8JOj0tV2EsLW1hcmNoPWFybXY3LWEKK0FGTEFHU19jYWNoZS12N20ubwk6PS1XYSwtbWFyY2g9YXJtdjctbQogCiBvYmotJChDT05GSUdfQ1BVX0NPUFlfVjRXVCkJKz0gY29weXBhZ2UtdjR3dC5vCiBvYmotJChDT05GSUdfQ1BVX0NPUFlfVjRXQikJKz0gY29weXBhZ2UtdjR3Yi5vCkBAIC0xMDEsNiArMTAzLDcgQEAKIG9iai0kKENPTkZJR19PVVRFUl9DQUNIRSkJKz0gbDJjLWNvbW1vbi5vCiBvYmotJChDT05GSUdfQ0FDSEVfRkVST0NFT05fTDIpCSs9IGNhY2hlLWZlcm9jZW9uLWwyLm8KIG9iai0kKENPTkZJR19DQUNIRV9MMlgwKQkrPSBjYWNoZS1sMngwLm8gbDJjLWwyeDAtcmVzdW1lLm8KK29iai0kKENPTkZJR19DQUNIRV9MMlgwX1BNVSkJKz0gY2FjaGUtbDJ4MC1wbXUubwogb2JqLSQoQ09ORklHX0NBQ0hFX1hTQzNMMikJKz0gY2FjaGUteHNjM2wyLm8KIG9iai0kKENPTkZJR19DQUNIRV9UQVVST1MyKQkrPSBjYWNoZS10YXVyb3MyLm8KIG9iai0kKENPTkZJR19DQUNIRV9VTklQSElFUikJKz0gY2FjaGUtdW5pcGhpZXIubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY2FjaGUtbDJ4MC1wbXUuYyBiL2FyY2gvYXJtL21tL2NhY2hlLWwyeDAtcG11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2ZDMwNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLWwyeDAtcG11LmMKQEAgLTAsMCArMSw1ODQgQEAKKy8qCisgKiBMMjIwL0wzMTAgY2FjaGUgY29udHJvbGxlciBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFSTSBMaW1pdGVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmg+CisKKyNkZWZpbmUgUE1VX05SX0NPVU5URVJTIDIKKworc3RhdGljIHZvaWQgX19pb21lbSAqbDJ4MF9iYXNlOworc3RhdGljIHN0cnVjdCBwbXUgKmwyeDBfcG11Oworc3RhdGljIGNwdW1hc2tfdCBwbXVfY3B1OworCitzdGF0aWMgY29uc3QgY2hhciAqbDJ4MF9uYW1lOworCitzdGF0aWMga3RpbWVfdCBsMngwX3BtdV9wb2xsX3BlcmlvZDsKK3N0YXRpYyBzdHJ1Y3QgaHJ0aW1lciBsMngwX3BtdV9ocnRpbWVyOworCisvKgorICogVGhlIEwyMjAvUEwzMTAgUE1VIGhhcyB0d28gZXF1aXZhbGVudCBjb3VudGVycywgQ291bnRlcjEgYW5kIENvdW50ZXIwLgorICogUmVnaXN0ZXJzIGNvbnRyb2xsaW5nIHRoZXNlIGFyZSBsYWlkIG91dCBpbiBwYWlycywgaW4gZGVzY2VuZGluZyBvcmRlciwgaS5lLgorICogdGhlIHJlZ2lzdGVyIGZvciBDb3VudGVyMSBjb21lcyBmaXJzdCwgZm9sbG93ZWQgYnkgdGhlIHJlZ2lzdGVyIGZvcgorICogQ291bnRlcjAuCisgKiBXZSBlbnN1cmUgdGhhdCBpZHggMCAtPiBDb3VudGVyMCwgYW5kIGlkeDEgLT4gQ291bnRlcjEuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnRzW1BNVV9OUl9DT1VOVEVSU107CisKKy8qIEZpbmQgYW4gdW51c2VkIGNvdW50ZXIgKi8KK3N0YXRpYyBpbnQgbDJ4MF9wbXVfZmluZF9pZHgodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBQTVVfTlJfQ09VTlRFUlM7IGkrKykgeworCQlpZiAoIWV2ZW50c1tpXSkKKwkJCXJldHVybiBpOworCX0KKworCXJldHVybiAtMTsKK30KKworLyogSG93IG1hbnkgY291bnRlcnMgYXJlIGFsbG9jYXRlZD8gKi8KK3N0YXRpYyBpbnQgbDJ4MF9wbXVfbnVtX2FjdGl2ZV9jb3VudGVycyh2b2lkKQoreworCWludCBpLCBjbnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IFBNVV9OUl9DT1VOVEVSUzsgaSsrKSB7CisJCWlmIChldmVudHNbaV0pCisJCQljbnQrKzsKKwl9CisKKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgdm9pZCBsMngwX3BtdV9jb3VudGVyX2NvbmZpZ193cml0ZShpbnQgaWR4LCB1MzIgdmFsKQoreworCXdyaXRlbF9yZWxheGVkKHZhbCwgbDJ4MF9iYXNlICsgTDJYMF9FVkVOVF9DTlQwX0NGRyAtIDQgKiBpZHgpOworfQorCitzdGF0aWMgdTMyIGwyeDBfcG11X2NvdW50ZXJfcmVhZChpbnQgaWR4KQoreworCXJldHVybiByZWFkbF9yZWxheGVkKGwyeDBfYmFzZSArIEwyWDBfRVZFTlRfQ05UMF9WQUwgLSA0ICogaWR4KTsKK30KKworc3RhdGljIHZvaWQgbDJ4MF9wbXVfY291bnRlcl93cml0ZShpbnQgaWR4LCB1MzIgdmFsKQoreworCXdyaXRlbF9yZWxheGVkKHZhbCwgbDJ4MF9iYXNlICsgTDJYMF9FVkVOVF9DTlQwX1ZBTCAtIDQgKiBpZHgpOworfQorCitzdGF0aWMgdm9pZCBfX2wyeDBfcG11X2VuYWJsZSh2b2lkKQoreworCXUzMiB2YWwgPSByZWFkbF9yZWxheGVkKGwyeDBfYmFzZSArIEwyWDBfRVZFTlRfQ05UX0NUUkwpOworCXZhbCB8PSBMMlgwX0VWRU5UX0NOVF9DVFJMX0VOQUJMRTsKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIGwyeDBfYmFzZSArIEwyWDBfRVZFTlRfQ05UX0NUUkwpOworfQorCitzdGF0aWMgdm9pZCBfX2wyeDBfcG11X2Rpc2FibGUodm9pZCkKK3sKKwl1MzIgdmFsID0gcmVhZGxfcmVsYXhlZChsMngwX2Jhc2UgKyBMMlgwX0VWRU5UX0NOVF9DVFJMKTsKKwl2YWwgJj0gfkwyWDBfRVZFTlRfQ05UX0NUUkxfRU5BQkxFOworCXdyaXRlbF9yZWxheGVkKHZhbCwgbDJ4MF9iYXNlICsgTDJYMF9FVkVOVF9DTlRfQ1RSTCk7Cit9CisKK3N0YXRpYyB2b2lkIGwyeDBfcG11X2VuYWJsZShzdHJ1Y3QgcG11ICpwbXUpCit7CisJaWYgKGwyeDBfcG11X251bV9hY3RpdmVfY291bnRlcnMoKSA9PSAwKQorCQlyZXR1cm47CisKKwlfX2wyeDBfcG11X2VuYWJsZSgpOworfQorCitzdGF0aWMgdm9pZCBsMngwX3BtdV9kaXNhYmxlKHN0cnVjdCBwbXUgKnBtdSkKK3sKKwlpZiAobDJ4MF9wbXVfbnVtX2FjdGl2ZV9jb3VudGVycygpID09IDApCisJCXJldHVybjsKKworCV9fbDJ4MF9wbXVfZGlzYWJsZSgpOworfQorCitzdGF0aWMgdm9pZCB3YXJuX2lmX3NhdHVyYXRlZCh1MzIgY291bnQpCit7CisJaWYgKGNvdW50ICE9IDB4ZmZmZmZmZmYpCisJCXJldHVybjsKKworCXByX3dhcm5fcmF0ZWxpbWl0ZWQoIkwyWDAgY291bnRlciBzYXR1cmF0ZWQuIFBvbGwgcGVyaW9kIHRvbyBsb25nXG4iKTsKK30KKworc3RhdGljIHZvaWQgbDJ4MF9wbXVfZXZlbnRfcmVhZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3ID0gJmV2ZW50LT5odzsKKwl1NjQgcHJldl9jb3VudCwgbmV3X2NvdW50LCBtYXNrOworCisJZG8geworCQkgcHJldl9jb3VudCA9IGxvY2FsNjRfcmVhZCgmaHctPnByZXZfY291bnQpOworCQkgbmV3X2NvdW50ID0gbDJ4MF9wbXVfY291bnRlcl9yZWFkKGh3LT5pZHgpOworCX0gd2hpbGUgKGxvY2FsNjRfeGNoZygmaHctPnByZXZfY291bnQsIG5ld19jb3VudCkgIT0gcHJldl9jb3VudCk7CisKKwltYXNrID0gR0VOTUFTS19VTEwoMzEsIDApOworCWxvY2FsNjRfYWRkKChuZXdfY291bnQgLSBwcmV2X2NvdW50KSAmIG1hc2ssICZldmVudC0+Y291bnQpOworCisJd2Fybl9pZl9zYXR1cmF0ZWQobmV3X2NvdW50KTsKK30KKworc3RhdGljIHZvaWQgbDJ4MF9wbXVfZXZlbnRfY29uZmlndXJlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHcgPSAmZXZlbnQtPmh3OworCisJLyoKKwkgKiBUaGUgTDJYMCBjb3VudGVycyBzYXR1cmF0ZSBhdCAweGZmZmZmZmZmIHJhdGhlciB0aGFuIHdyYXBwaW5nLCBzbyB3ZQorCSAqIHdpbGwgKmFsd2F5cyogbG9zZSBzb21lIG51bWJlciBvZiBldmVudHMgd2hlbiBhIGNvdW50ZXIgc2F0dXJhdGVzLAorCSAqIGFuZCBoYXZlIG5vIHdheSBvZiBkZXRlY3RpbmcgaG93IG1hbnkgd2VyZSBsb3N0LgorCSAqCisJICogVG8gbWluaW1pemUgdGhlIGltcGFjdCBvZiB0aGlzLCB3ZSB0cnkgdG8gbWF4aW1pemUgdGhlIHBlcmlvZCBieQorCSAqIGFsd2F5cyBzdGFydGluZyBjb3VudGVycyBhdCB6ZXJvLiBUbyBlbnN1cmUgdGhhdCBncm91cCByYXRpb3MgYXJlCisJICogcmVwcmVzZW50YXRpdmUsIHdlIHBvbGwgcGVyaW9kaWNhbGx5IHRvIGF2b2lkIGNvdW50ZXJzIHNhdHVyYXRpbmcuCisJICogU2VlIGwyeDBfcG11X3BvbGwoKS4KKwkgKi8KKwlsb2NhbDY0X3NldCgmaHctPnByZXZfY291bnQsIDApOworCWwyeDBfcG11X2NvdW50ZXJfd3JpdGUoaHctPmlkeCwgMCk7Cit9CisKK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBsMngwX3BtdV9wb2xsKHN0cnVjdCBocnRpbWVyICpocnRpbWVyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJX19sMngwX3BtdV9kaXNhYmxlKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUE1VX05SX0NPVU5URVJTOyBpKyspIHsKKwkJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gZXZlbnRzW2ldOworCisJCWlmICghZXZlbnQpCisJCQljb250aW51ZTsKKworCQlsMngwX3BtdV9ldmVudF9yZWFkKGV2ZW50KTsKKwkJbDJ4MF9wbXVfZXZlbnRfY29uZmlndXJlKGV2ZW50KTsKKwl9CisKKwlfX2wyeDBfcG11X2VuYWJsZSgpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWhydGltZXJfZm9yd2FyZF9ub3coaHJ0aW1lciwgbDJ4MF9wbXVfcG9sbF9wZXJpb2QpOworCXJldHVybiBIUlRJTUVSX1JFU1RBUlQ7Cit9CisKKworc3RhdGljIHZvaWQgX19sMngwX3BtdV9ldmVudF9lbmFibGUoaW50IGlkeCwgdTMyIGV2ZW50KQoreworCXUzMiB2YWw7CisKKwl2YWwgPSBldmVudCA8PCBMMlgwX0VWRU5UX0NOVF9DRkdfU1JDX1NISUZUOworCXZhbCB8PSBMMlgwX0VWRU5UX0NOVF9DRkdfSU5UX0RJU0FCTEVEOworCWwyeDBfcG11X2NvdW50ZXJfY29uZmlnX3dyaXRlKGlkeCwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgbDJ4MF9wbXVfZXZlbnRfc3RhcnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3ID0gJmV2ZW50LT5odzsKKworCWlmIChXQVJOX09OX09OQ0UoIShldmVudC0+aHcuc3RhdGUgJiBQRVJGX0hFU19TVE9QUEVEKSkpCisJCXJldHVybjsKKworCWlmIChmbGFncyAmIFBFUkZfRUZfUkVMT0FEKSB7CisJCVdBUk5fT05fT05DRSghKGh3LT5zdGF0ZSAmIFBFUkZfSEVTX1VQVE9EQVRFKSk7CisJCWwyeDBfcG11X2V2ZW50X2NvbmZpZ3VyZShldmVudCk7CisJfQorCisJaHctPnN0YXRlID0gMDsKKworCV9fbDJ4MF9wbXVfZXZlbnRfZW5hYmxlKGh3LT5pZHgsIGh3LT5jb25maWdfYmFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fbDJ4MF9wbXVfZXZlbnRfZGlzYWJsZShpbnQgaWR4KQoreworCXUzMiB2YWw7CisKKwl2YWwgPSBMMlgwX0VWRU5UX0NOVF9DRkdfU1JDX0RJU0FCTEVEIDw8IEwyWDBfRVZFTlRfQ05UX0NGR19TUkNfU0hJRlQ7CisJdmFsIHw9IEwyWDBfRVZFTlRfQ05UX0NGR19JTlRfRElTQUJMRUQ7CisJbDJ4MF9wbXVfY291bnRlcl9jb25maWdfd3JpdGUoaWR4LCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBsMngwX3BtdV9ldmVudF9zdG9wKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpodyA9ICZldmVudC0+aHc7CisKKwlpZiAoV0FSTl9PTl9PTkNFKGV2ZW50LT5ody5zdGF0ZSAmIFBFUkZfSEVTX1NUT1BQRUQpKQorCQlyZXR1cm47CisKKwlfX2wyeDBfcG11X2V2ZW50X2Rpc2FibGUoaHctPmlkeCk7CisKKwlody0+c3RhdGUgfD0gUEVSRl9IRVNfU1RPUFBFRDsKKworCWlmIChmbGFncyAmIFBFUkZfRUZfVVBEQVRFKSB7CisJCWwyeDBfcG11X2V2ZW50X3JlYWQoZXZlbnQpOworCQlody0+c3RhdGUgfD0gUEVSRl9IRVNfVVBUT0RBVEU7CisJfQorfQorCitzdGF0aWMgaW50IGwyeDBfcG11X2V2ZW50X2FkZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHcgPSAmZXZlbnQtPmh3OworCWludCBpZHggPSBsMngwX3BtdV9maW5kX2lkeCgpOworCisJaWYgKGlkeCA9PSAtMSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKgorCSAqIFBpbiB0aGUgdGltZXIsIHNvIHRoYXQgdGhlIG92ZXJmbG93cyBhcmUgaGFuZGxlZCBieSB0aGUgY2hvc2VuCisJICogZXZlbnQtPmNwdSAodGhpcyBpcyB0aGUgc2FtZSBvbmUgYXMgcHJlc2VudGVkIGluICJjcHVtYXNrIgorCSAqIGF0dHJpYnV0ZSkuCisJICovCisJaWYgKGwyeDBfcG11X251bV9hY3RpdmVfY291bnRlcnMoKSA9PSAwKQorCQlocnRpbWVyX3N0YXJ0KCZsMngwX3BtdV9ocnRpbWVyLCBsMngwX3BtdV9wb2xsX3BlcmlvZCwKKwkJCSAgICAgIEhSVElNRVJfTU9ERV9SRUxfUElOTkVEKTsKKworCWV2ZW50c1tpZHhdID0gZXZlbnQ7CisJaHctPmlkeCA9IGlkeDsKKworCWwyeDBfcG11X2V2ZW50X2NvbmZpZ3VyZShldmVudCk7CisKKwlody0+c3RhdGUgPSBQRVJGX0hFU19TVE9QUEVEIHwgUEVSRl9IRVNfVVBUT0RBVEU7CisKKwlpZiAoZmxhZ3MgJiBQRVJGX0VGX1NUQVJUKQorCQlsMngwX3BtdV9ldmVudF9zdGFydChldmVudCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbDJ4MF9wbXVfZXZlbnRfZGVsKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpodyA9ICZldmVudC0+aHc7CisKKwlsMngwX3BtdV9ldmVudF9zdG9wKGV2ZW50LCBQRVJGX0VGX1VQREFURSk7CisKKwlldmVudHNbaHctPmlkeF0gPSBOVUxMOworCWh3LT5pZHggPSAtMTsKKworCWlmIChsMngwX3BtdV9udW1fYWN0aXZlX2NvdW50ZXJzKCkgPT0gMCkKKwkJaHJ0aW1lcl9jYW5jZWwoJmwyeDBfcG11X2hydGltZXIpOworfQorCitzdGF0aWMgYm9vbCBsMngwX3BtdV9ncm91cF9pc192YWxpZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IHBtdSAqcG11ID0gZXZlbnQtPnBtdTsKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqbGVhZGVyID0gZXZlbnQtPmdyb3VwX2xlYWRlcjsKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqc2libGluZzsKKwlpbnQgbnVtX2h3ID0gMDsKKworCWlmIChsZWFkZXItPnBtdSA9PSBwbXUpCisJCW51bV9odysrOworCWVsc2UgaWYgKCFpc19zb2Z0d2FyZV9ldmVudChsZWFkZXIpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNpYmxpbmcsICZsZWFkZXItPnNpYmxpbmdfbGlzdCwgZ3JvdXBfZW50cnkpIHsKKwkJaWYgKHNpYmxpbmctPnBtdSA9PSBwbXUpCisJCQludW1faHcrKzsKKwkJZWxzZSBpZiAoIWlzX3NvZnR3YXJlX2V2ZW50KHNpYmxpbmcpKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiBudW1faHcgPD0gUE1VX05SX0NPVU5URVJTOworfQorCitzdGF0aWMgaW50IGwyeDBfcG11X2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpodyA9ICZldmVudC0+aHc7CisKKwlpZiAoZXZlbnQtPmF0dHIudHlwZSAhPSBsMngwX3BtdS0+dHlwZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlpZiAoaXNfc2FtcGxpbmdfZXZlbnQoZXZlbnQpIHx8CisJICAgIGV2ZW50LT5hdHRhY2hfc3RhdGUgJiBQRVJGX0FUVEFDSF9UQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChldmVudC0+YXR0ci5leGNsdWRlX3VzZXIgICB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2tlcm5lbCB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2h2ICAgICB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2lkbGUgICB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2hvc3QgICB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2d1ZXN0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChldmVudC0+Y3B1IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZXZlbnQtPmF0dHIuY29uZmlnICYgfkwyWDBfRVZFTlRfQ05UX0NGR19TUkNfTUFTSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlody0+Y29uZmlnX2Jhc2UgPSBldmVudC0+YXR0ci5jb25maWc7CisKKwlpZiAoIWwyeDBfcG11X2dyb3VwX2lzX3ZhbGlkKGV2ZW50KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlldmVudC0+Y3B1ID0gY3B1bWFza19maXJzdCgmcG11X2NwdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGwyeDBfZXZlbnRfYXR0cmlidXRlIHsKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBhdHRyOworCXVuc2lnbmVkIGludCBjb25maWc7CisJYm9vbCBwbDMxMF9vbmx5OworfTsKKworI2RlZmluZSBMMlgwX0VWRU5UX0FUVFIoX25hbWUsIF9jb25maWcsIF9wbDMxMF9vbmx5KQkJCQlcCisJKCYoKHN0cnVjdCBsMngwX2V2ZW50X2F0dHJpYnV0ZVtdKSB7ewkJCQkJXAorCQkuYXR0ciA9IF9fQVRUUihfbmFtZSwgU19JUlVHTywgbDJ4MF9wbXVfZXZlbnRfc2hvdywgTlVMTCksCVwKKwkJLmNvbmZpZyA9IF9jb25maWcsCQkJCQkJXAorCQkucGwzMTBfb25seSA9IF9wbDMxMF9vbmx5LAkJCQkJXAorCX19KVswXS5hdHRyLmF0dHIpCisKKyNkZWZpbmUgTDIyMF9QTFVTX0VWRU5UX0FUVFIoX25hbWUsIF9jb25maWcpCQkJCQlcCisJTDJYMF9FVkVOVF9BVFRSKF9uYW1lLCBfY29uZmlnLCBmYWxzZSkKKworI2RlZmluZSBQTDMxMF9FVkVOVF9BVFRSKF9uYW1lLCBfY29uZmlnKQkJCQkJXAorCUwyWDBfRVZFTlRfQVRUUihfbmFtZSwgX2NvbmZpZywgdHJ1ZSkKKworc3RhdGljIHNzaXplX3QgbDJ4MF9wbXVfZXZlbnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbDJ4MF9ldmVudF9hdHRyaWJ1dGUgKmxhdHRyOworCisJbGF0dHIgPSBjb250YWluZXJfb2YoYXR0ciwgdHlwZW9mKCpsYXR0ciksIGF0dHIpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgImNvbmZpZz0weCV4XG4iLCBsYXR0ci0+Y29uZmlnKTsKK30KKworc3RhdGljIHVtb2RlX3QgbDJ4MF9wbXVfZXZlbnRfYXR0cl9pc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQkgICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJCQkgICAgICBpbnQgdW51c2VkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGtvYmpfdG9fZGV2KGtvYmopOworCXN0cnVjdCBwbXUgKnBtdSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBsMngwX2V2ZW50X2F0dHJpYnV0ZSAqbGF0dHI7CisKKwlsYXR0ciA9IGNvbnRhaW5lcl9vZihhdHRyLCB0eXBlb2YoKmxhdHRyKSwgYXR0ci5hdHRyKTsKKworCWlmICghbGF0dHItPnBsMzEwX29ubHkgfHwgc3RyY21wKCJsMmNfMzEwIiwgcG11LT5uYW1lKSA9PSAwKQorCQlyZXR1cm4gYXR0ci0+bW9kZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbDJ4MF9wbXVfZXZlbnRfYXR0cnNbXSA9IHsKKwlMMjIwX1BMVVNfRVZFTlRfQVRUUihjbywJMHgxKSwKKwlMMjIwX1BMVVNfRVZFTlRfQVRUUihkcmhpdCwJMHgyKSwKKwlMMjIwX1BMVVNfRVZFTlRfQVRUUihkcnJlcSwJMHgzKSwKKwlMMjIwX1BMVVNfRVZFTlRfQVRUUihkd2hpdCwJMHg0KSwKKwlMMjIwX1BMVVNfRVZFTlRfQVRUUihkd3JlcSwJMHg1KSwKKwlMMjIwX1BMVVNfRVZFTlRfQVRUUihkd3RyZXEsCTB4NiksCisJTDIyMF9QTFVTX0VWRU5UX0FUVFIoaXJoaXQsCTB4NyksCisJTDIyMF9QTFVTX0VWRU5UX0FUVFIoaXJyZXEsCTB4OCksCisJTDIyMF9QTFVTX0VWRU5UX0FUVFIod2EsCTB4OSksCisJUEwzMTBfRVZFTlRfQVRUUihpcGZhbGxvYywJMHhhKSwKKwlQTDMxMF9FVkVOVF9BVFRSKGVwZmhpdCwJMHhiKSwKKwlQTDMxMF9FVkVOVF9BVFRSKGVwZmFsbG9jLAkweGMpLAorCVBMMzEwX0VWRU5UX0FUVFIoc3JyY3ZkLAkweGQpLAorCVBMMzEwX0VWRU5UX0FUVFIoc3Jjb25mLAkweGUpLAorCVBMMzEwX0VWRU5UX0FUVFIoZXBmcmN2ZCwJMHhmKSwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsMngwX3BtdV9ldmVudF9hdHRyc19ncm91cCA9IHsKKwkubmFtZSA9ICJldmVudHMiLAorCS5hdHRycyA9IGwyeDBfcG11X2V2ZW50X2F0dHJzLAorCS5pc192aXNpYmxlID0gbDJ4MF9wbXVfZXZlbnRfYXR0cl9pc192aXNpYmxlLAorfTsKKworc3RhdGljIHNzaXplX3QgbDJ4MF9wbXVfY3B1bWFza19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIGNwdW1hcF9wcmludF90b19wYWdlYnVmKHRydWUsIGJ1ZiwgJnBtdV9jcHUpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgbDJ4MF9wbXVfY3B1bWFza19hdHRyID0KKwkJX19BVFRSKGNwdW1hc2ssIFNfSVJVR08sIGwyeDBfcG11X2NwdW1hc2tfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsMngwX3BtdV9jcHVtYXNrX2F0dHJzW10gPSB7CisJJmwyeDBfcG11X2NwdW1hc2tfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsMngwX3BtdV9jcHVtYXNrX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gbDJ4MF9wbXVfY3B1bWFza19hdHRycywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpsMngwX3BtdV9hdHRyX2dyb3Vwc1tdID0geworCSZsMngwX3BtdV9ldmVudF9hdHRyc19ncm91cCwKKwkmbDJ4MF9wbXVfY3B1bWFza19hdHRyX2dyb3VwLAorCU5VTEwsCit9OworCitzdGF0aWMgdm9pZCBsMngwX3BtdV9yZXNldCh2b2lkKQoreworCWludCBpOworCisJX19sMngwX3BtdV9kaXNhYmxlKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUE1VX05SX0NPVU5URVJTOyBpKyspCisJCV9fbDJ4MF9wbXVfZXZlbnRfZGlzYWJsZShpKTsKK30KKworc3RhdGljIGludCBsMngwX3BtdV9vZmZsaW5lX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXVuc2lnbmVkIGludCB0YXJnZXQ7CisKKwlpZiAoIWNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgJnBtdV9jcHUpKQorCQlyZXR1cm4gMDsKKworCXRhcmdldCA9IGNwdW1hc2tfYW55X2J1dChjcHVfb25saW5lX21hc2ssIGNwdSk7CisJaWYgKHRhcmdldCA+PSBucl9jcHVfaWRzKQorCQlyZXR1cm4gMDsKKworCXBlcmZfcG11X21pZ3JhdGVfY29udGV4dChsMngwX3BtdSwgY3B1LCB0YXJnZXQpOworCWNwdW1hc2tfc2V0X2NwdSh0YXJnZXQsICZwbXVfY3B1KTsKKworCXJldHVybiAwOworfQorCit2b2lkIGwyeDBfcG11X3N1c3BlbmQodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICghbDJ4MF9wbXUpCisJCXJldHVybjsKKworCWwyeDBfcG11X2Rpc2FibGUobDJ4MF9wbXUpOworCisJZm9yIChpID0gMDsgaSA8IFBNVV9OUl9DT1VOVEVSUzsgaSsrKSB7CisJCWlmIChldmVudHNbaV0pCisJCQlsMngwX3BtdV9ldmVudF9zdG9wKGV2ZW50c1tpXSwgUEVSRl9FRl9VUERBVEUpOworCX0KKworfQorCit2b2lkIGwyeDBfcG11X3Jlc3VtZSh2b2lkKQoreworCWludCBpOworCisJaWYgKCFsMngwX3BtdSkKKwkJcmV0dXJuOworCisJbDJ4MF9wbXVfcmVzZXQoKTsKKworCWZvciAoaSA9IDA7IGkgPCBQTVVfTlJfQ09VTlRFUlM7IGkrKykgeworCQlpZiAoZXZlbnRzW2ldKQorCQkJbDJ4MF9wbXVfZXZlbnRfc3RhcnQoZXZlbnRzW2ldLCBQRVJGX0VGX1JFTE9BRCk7CisJfQorCisJbDJ4MF9wbXVfZW5hYmxlKGwyeDBfcG11KTsKK30KKwordm9pZCBfX2luaXQgbDJ4MF9wbXVfcmVnaXN0ZXIodm9pZCBfX2lvbWVtICpiYXNlLCB1MzIgcGFydCkKK3sKKwkvKgorCSAqIERldGVybWluZSB3aGV0aGVyIHdlIHN1cHBvcnQgdGhlIFBNVSwgYW5kIGNob29zZSB0aGUgbmFtZSBmb3Igc3lzZnMuCisJICogVGhpcyBpcyBhbHNvIHVzZWQgYnkgbDJ4MF9wbXVfZXZlbnRfYXR0cl9pc192aXNpYmxlIHRvIGRldGVybWluZQorCSAqIHdoaWNoIGV2ZW50cyB0byBkaXNwbGF5LCBhcyB0aGUgUEwzMTAgUE1VIHN1cHBvcnRzIGEgc3VwZXJzZXQgb2YKKwkgKiBMMjIwIGV2ZW50cy4KKwkgKgorCSAqIFRoZSBMMjEwIFBNVSBoYXMgYSBkaWZmZXJlbnQgcHJvZ3JhbW1lcidzIGludGVyZmFjZSwgYW5kIGlzIG5vdAorCSAqIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KKwkgKgorCSAqIFdlIG11c3QgZGVmZXIgcmVnaXN0ZXJpbmcgdGhlIFBNVSB1bnRpbCB0aGUgcGVyZiBzdWJzeXN0ZW0gaXMgdXAgYW5kCisJICogcnVubmluZywgc28ganVzdCBzdGFzaCB0aGUgbmFtZSBhbmQgYmFzZSwgYW5kIGxlYXZlIHRoYXQgdG8gYW5vdGhlcgorCSAqIGluaXRjYWxsLgorCSAqLworCXN3aXRjaCAocGFydCAmIEwyWDBfQ0FDSEVfSURfUEFSVF9NQVNLKSB7CisJY2FzZSBMMlgwX0NBQ0hFX0lEX1BBUlRfTDIyMDoKKwkJbDJ4MF9uYW1lID0gImwyY18yMjAiOworCQlicmVhazsKKwljYXNlIEwyWDBfQ0FDSEVfSURfUEFSVF9MMzEwOgorCQlsMngwX25hbWUgPSAibDJjXzMxMCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwlsMngwX2Jhc2UgPSBiYXNlOworfQorCitzdGF0aWMgX19pbml0IGludCBsMngwX3BtdV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWlmICghbDJ4MF9iYXNlKQorCQlyZXR1cm4gMDsKKworCWwyeDBfcG11ID0ga3phbGxvYyhzaXplb2YoKmwyeDBfcG11KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsMngwX3BtdSkgeworCQlwcl93YXJuKCJVbmFibGUgdG8gYWxsb2NhdGUgTDJ4MCBQTVVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkqbDJ4MF9wbXUgPSAoc3RydWN0IHBtdSkgeworCQkudGFza19jdHhfbnIgPSBwZXJmX2ludmFsaWRfY29udGV4dCwKKwkJLnBtdV9lbmFibGUgPSBsMngwX3BtdV9lbmFibGUsCisJCS5wbXVfZGlzYWJsZSA9IGwyeDBfcG11X2Rpc2FibGUsCisJCS5yZWFkID0gbDJ4MF9wbXVfZXZlbnRfcmVhZCwKKwkJLnN0YXJ0ID0gbDJ4MF9wbXVfZXZlbnRfc3RhcnQsCisJCS5zdG9wID0gbDJ4MF9wbXVfZXZlbnRfc3RvcCwKKwkJLmFkZCA9IGwyeDBfcG11X2V2ZW50X2FkZCwKKwkJLmRlbCA9IGwyeDBfcG11X2V2ZW50X2RlbCwKKwkJLmV2ZW50X2luaXQgPSBsMngwX3BtdV9ldmVudF9pbml0LAorCQkuYXR0cl9ncm91cHMgPSBsMngwX3BtdV9hdHRyX2dyb3VwcywKKwl9OworCisJbDJ4MF9wbXVfcmVzZXQoKTsKKworCS8qCisJICogV2UgYWx3YXlzIHVzZSBhIGhydGltZXIgcmF0aGVyIHRoYW4gYW4gaW50ZXJydXB0LgorCSAqIFNlZSBjb21tZW50cyBpbiBsMngwX3BtdV9ldmVudF9jb25maWd1cmUgYW5kIGwyeDBfcG11X3BvbGwuCisJICoKKwkgKiBQb2xsaW5nIG9uY2UgYSBzZWNvbmQgYWxsb3dzIHRoZSBjb3VudGVycyB0byBmaWxsIHVwIHRvIDEvMTI4dGggb24gYQorCSAqIHF1YWQtY29yZSB0ZXN0IGNoaXAgd2l0aCBjb3JlcyBjbG9ja2VkIGF0IDQwME1Iei4gSG9wZWZ1bGx5IHRoaXMKKwkgKiBsZWF2ZXMgc3VmZmljaWVudCBoZWFkcm9vbSB0byBhdm9pZCBvdmVyZmxvdyBvbiBwcm9kdWN0aW9uIHNpbGljb24KKwkgKiBhdCBoaWdoZXIgZnJlcXVlbmNpZXMuCisJICovCisJbDJ4MF9wbXVfcG9sbF9wZXJpb2QgPSBtc190b19rdGltZSgxMDAwKTsKKwlocnRpbWVyX2luaXQoJmwyeDBfcG11X2hydGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CisJbDJ4MF9wbXVfaHJ0aW1lci5mdW5jdGlvbiA9IGwyeDBfcG11X3BvbGw7CisKKwljcHVtYXNrX3NldF9jcHUoMCwgJnBtdV9jcHUpOworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfUEVSRl9BUk1fTDJYMF9PTkxJTkUsCisJCQkJCSJBUF9QRVJGX0FSTV9MMlgwX09OTElORSIsIE5VTEwsCisJCQkJCWwyeDBfcG11X29mZmxpbmVfY3B1KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9wbXU7CisKKwlyZXQgPSBwZXJmX3BtdV9yZWdpc3RlcihsMngwX3BtdSwgbDJ4MF9uYW1lLCAtMSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfY3B1aHA7CisKKwlyZXR1cm4gMDsKKworb3V0X2NwdWhwOgorCWNwdWhwX3JlbW92ZV9zdGF0ZV9ub2NhbGxzKENQVUhQX0FQX1BFUkZfQVJNX0wyWDBfT05MSU5FKTsKK291dF9wbXU6CisJa2ZyZWUobDJ4MF9wbXUpOworCWwyeDBfcG11ID0gTlVMTDsKKwlyZXR1cm4gcmV0OworfQorZGV2aWNlX2luaXRjYWxsKGwyeDBfcG11X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY2FjaGUtbDJ4MC5jIGIvYXJjaC9hcm0vbW0vY2FjaGUtbDJ4MC5jCmluZGV4IGNjMTI5MDUuLmQxODcwYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2NhY2hlLWwyeDAuYworKysgYi9hcmNoL2FybS9tbS9jYWNoZS1sMngwLmMKQEAgLTE0Miw2ICsxNDIsOCBAQAogewogCXZvaWQgX19pb21lbSAqYmFzZSA9IGwyeDBfYmFzZTsKIAorCWwyeDBfcG11X3N1c3BlbmQoKTsKKwogCW91dGVyX2NhY2hlLmZsdXNoX2FsbCgpOwogCWwyY193cml0ZV9zZWMoMCwgYmFzZSwgTDJYMF9DVFJMKTsKIAlkc2Ioc3QpOwpAQCAtMTU5LDYgKzE2MSw4IEBACiAJLyogRG8gbm90IHRvdWNoIHRoZSBjb250cm9sbGVyIGlmIGFscmVhZHkgZW5hYmxlZC4gKi8KIAlpZiAoIShyZWFkbF9yZWxheGVkKGJhc2UgKyBMMlgwX0NUUkwpICYgTDJYMF9DVFJMX0VOKSkKIAkJbDJjX2VuYWJsZShiYXNlLCBsMngwX2RhdGEtPm51bV9sb2NrKTsKKworCWwyeDBfcG11X3Jlc3VtZSgpOwogfQogCiAvKgpAQCAtNzA5LDkgKzcxMyw4IEBACiAJaWYgKHJldmlzaW9uID49IEwzMTBfQ0FDSEVfSURfUlRMX1IzUDAgJiYKIAkgICAgcmV2aXNpb24gPCBMMzEwX0NBQ0hFX0lEX1JUTF9SM1AyKSB7CiAJCXUzMiB2YWwgPSBsMngwX3NhdmVkX3JlZ3MucHJlZmV0Y2hfY3RybDsKLQkJLyogSSBkb24ndCB0aGluayBiaXQyMyBpcyByZXF1aXJlZCBoZXJlLi4uIGJ1dCBpTVg2IGRvZXMgc28gKi8KLQkJaWYgKHZhbCAmIChCSVQoMzApIHwgQklUKDIzKSkpIHsKLQkJCXZhbCAmPSB+KEJJVCgzMCkgfCBCSVQoMjMpKTsKKwkJaWYgKHZhbCAmIEwzMTBfUFJFRkVUQ0hfQ1RSTF9EQkxfTElORUZJTEwpIHsKKwkJCXZhbCAmPSB+TDMxMF9QUkVGRVRDSF9DVFJMX0RCTF9MSU5FRklMTDsKIAkJCWwyeDBfc2F2ZWRfcmVncy5wcmVmZXRjaF9jdHJsID0gdmFsOwogCQkJZXJyYXRhW24rK10gPSAiNzUyMjcxIjsKIAkJfQpAQCAtODkyLDYgKzg5NSw4IEBACiAJcHJfaW5mbygiJXM6IENBQ0hFX0lEIDB4JTA4eCwgQVVYX0NUUkwgMHglMDh4XG4iLAogCQlkYXRhLT50eXBlLCBjYWNoZV9pZCwgYXV4KTsKIAorCWwyeDBfcG11X3JlZ2lzdGVyKGwyeDBfYmFzZSwgY2FjaGVfaWQpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NhY2hlLXY3bS5TIGIvYXJjaC9hcm0vbW0vY2FjaGUtdjdtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE2YTdlNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLXY3bS5TCkBAIC0wLDAgKzEsNDUzIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21tL2NhY2hlLXY3bS5TCisgKgorICogIEJhc2VkIG9uIGxpbnV4L2FyY2gvYXJtL21tL2NhY2hlLXY3LlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkLgorICogIENvcHlyaWdodCAoQykgMjAwNSBBUk0gTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgaXMgdGhlICJzaGVsbCIgb2YgdGhlIEFSTXY3TSBwcm9jZXNzb3Igc3VwcG9ydC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91bndpbmQuaD4KKyNpbmNsdWRlIDxhc20vdjdtLmg+CisKKyNpbmNsdWRlICJwcm9jLW1hY3Jvcy5TIgorCisvKiBHZW5lcmljIFY3TSByZWFkL3dyaXRlIG1hY3JvcyBmb3IgbWVtb3J5IG1hcHBlZCBjYWNoZSBvcGVyYXRpb25zICovCisubWFjcm8gdjdtX2NhY2hlX3JlYWQsIHJ0LCByZWcKKwltb3Z3CVxydCwgIzpsb3dlcjE2OkJBU0VBRERSX1Y3TV9TQ0IgKyBccmVnCisJbW92dAlccnQsICM6dXBwZXIxNjpCQVNFQUREUl9WN01fU0NCICsgXHJlZworCWxkciAgICAgXHJ0LCBbXHJ0XQorLmVuZG0KKworLm1hY3JvIHY3bV9jYWNoZW9wLCBydCwgdG1wLCBvcCwgYyA9IGFsCisJbW92d1xjCVx0bXAsICM6bG93ZXIxNjpCQVNFQUREUl9WN01fU0NCICsgXG9wCisJbW92dFxjCVx0bXAsICM6dXBwZXIxNjpCQVNFQUREUl9WN01fU0NCICsgXG9wCisJc3RyXGMJXHJ0LCBbXHRtcF0KKy5lbmRtCisKKworLm1hY3JvCXJlYWRfY2NzaWRyLCBydAorCXY3bV9jYWNoZV9yZWFkIFxydCwgVjdNX1NDQl9DQ1NJRFIKKy5lbmRtCisKKy5tYWNybyByZWFkX2NsaWRyLCBydAorCXY3bV9jYWNoZV9yZWFkIFxydCwgVjdNX1NDQl9DTElEUgorLmVuZG0KKworLm1hY3JvCXdyaXRlX2Nzc2VsciwgcnQsIHRtcAorCXY3bV9jYWNoZW9wIFxydCwgXHRtcCwgVjdNX1NDQl9DU1NFTFIKKy5lbmRtCisKKy8qCisgKiBkY2lzdzogSW52YWxpZGF0ZSBkYXRhIGNhY2hlIGJ5IHNldC93YXkKKyAqLworLm1hY3JvIGRjaXN3LCBydCwgdG1wCisJdjdtX2NhY2hlb3AgXHJ0LCBcdG1wLCBWN01fU0NCX0RDSVNXCisuZW5kbQorCisvKgorICogZGNjaXN3OiBDbGVhbiBhbmQgaW52YWxpZGF0ZSBkYXRhIGNhY2hlIGJ5IHNldC93YXkKKyAqLworLm1hY3JvIGRjY2lzdywgcnQsIHRtcAorCXY3bV9jYWNoZW9wIFxydCwgXHRtcCwgVjdNX1NDQl9EQ0NJU1cKKy5lbmRtCisKKy8qCisgKiBkY2NpbXZhYzogQ2xlYW4gYW5kIGludmFsaWRhdGUgZGF0YSBjYWNoZSBsaW5lIGJ5IE1WQSB0byBQb0MuCisgKi8KKy5pcnAgICAgYywsZXEsbmUsY3MsY2MsbWkscGwsdnMsdmMsaGksbHMsZ2UsbHQsZ3QsbGUsaHMsbG8KKy5tYWNybyBkY2NpbXZhY1xjLCBydCwgdG1wCisJdjdtX2NhY2hlb3AgXHJ0LCBcdG1wLCBWN01fU0NCX0RDQ0lNVkFDLCBcYworLmVuZG0KKy5lbmRyCisKKy8qCisgKiBkY2ltdmFjOiBJbnZhbGlkYXRlIGRhdGEgY2FjaGUgbGluZSBieSBNVkEgdG8gUG9DCisgKi8KKy5tYWNybyBkY2ltdmFjLCBydCwgdG1wCisJdjdtX2NhY2hlb3AgXHJ0LCBcdG1wLCBWN01fU0NCX0RDSU1WQUMKKy5lbmRtCisKKy8qCisgKiBkY2NtdmF1OiBDbGVhbiBkYXRhIGNhY2hlIGxpbmUgYnkgTVZBIHRvIFBvVQorICovCisubWFjcm8gZGNjbXZhdSwgcnQsIHRtcAorCXY3bV9jYWNoZW9wIFxydCwgXHRtcCwgVjdNX1NDQl9EQ0NNVkFVCisuZW5kbQorCisvKgorICogZGNjbXZhYzogQ2xlYW4gZGF0YSBjYWNoZSBsaW5lIGJ5IE1WQSB0byBQb0MKKyAqLworLm1hY3JvIGRjY212YWMsICBydCwgdG1wCisJdjdtX2NhY2hlb3AgXHJ0LCBcdG1wLCBWN01fU0NCX0RDQ01WQUMKKy5lbmRtCisKKy8qCisgKiBpY2ltdmF1OiBJbnZhbGlkYXRlIGluc3RydWN0aW9uIGNhY2hlcyBieSBNVkEgdG8gUG9VCisgKi8KKy5tYWNybyBpY2ltdmF1LCBydCwgdG1wCisJdjdtX2NhY2hlb3AgXHJ0LCBcdG1wLCBWN01fU0NCX0lDSU1WQVUKKy5lbmRtCisKKy8qCisgKiBJbnZhbGlkYXRlIHRoZSBpY2FjaGUsIGlubmVyIHNoYXJlYWJsZSBpZiBTTVAsIGludmFsaWRhdGUgQlRCIGZvciBVUC4KKyAqIHJ0IGRhdGEgaWdub3JlZCBieSBJQ0lBTExVKElTKSwgc28gY2FuIGJlIHVzZWQgZm9yIHRoZSBhZGRyZXNzCisgKi8KKy5tYWNybyBpbnZhbGlkYXRlX2ljYWNoZSwgcnQKKwl2N21fY2FjaGVvcCBccnQsIFxydCwgVjdNX1NDQl9JQ0lBTExVCisJbW92IFxydCwgIzAKKy5lbmRtCisKKy8qCisgKiBJbnZhbGlkYXRlIHRoZSBCVEIsIGlubmVyIHNoYXJlYWJsZSBpZiBTTVAuCisgKiBydCBkYXRhIGlnbm9yZWQgYnkgQlBJQUxMLCBzbyBpdCBjYW4gYmUgdXNlZCBmb3IgdGhlIGFkZHJlc3MKKyAqLworLm1hY3JvIGludmFsaWRhdGVfYnAsIHJ0CisJdjdtX2NhY2hlb3AgXHJ0LCBccnQsIFY3TV9TQ0JfQlBJQUxMCisJbW92IFxydCwgIzAKKy5lbmRtCisKK0VOVFJZKHY3bV9pbnZhbGlkYXRlX2wxKQorCW1vdglyMCwgIzAKKworCXdyaXRlX2Nzc2VsciByMCwgcjEKKwlyZWFkX2Njc2lkciByMAorCisJbW92dwlyMSwgIzB4N2ZmZgorCWFuZAlyMiwgcjEsIHIwLCBsc3IgIzEzCisKKwltb3Z3CXIxLCAjMHgzZmYKKworCWFuZAlyMywgcjEsIHIwLCBsc3IgIzMgICAgICBAIE51bVdheXMgLSAxCisJYWRkCXIyLCByMiwgIzEgICAgICAgICAgICAgIEAgTnVtU2V0cworCisJYW5kCXIwLCByMCwgIzB4NworCWFkZAlyMCwgcjAsICM0ICAgICAgQCBTZXRTaGlmdAorCisJY2x6CXIxLCByMyAgICAgICAgICBAIFdheVNoaWZ0CisJYWRkCXI0LCByMywgIzEgICAgICBAIE51bVdheXMKKzE6CXN1YglyMiwgcjIsICMxICAgICAgQCBOdW1TZXRzLS0KKwltb3YJcjMsIHI0ICAgICAgICAgIEAgVGVtcCA9IE51bVdheXMKKzI6CXN1YnMJcjMsIHIzLCAjMSAgICAgIEAgVGVtcC0tCisJbW92CXI1LCByMywgbHNsIHIxCisJbW92CXI2LCByMiwgbHNsIHIwCisJb3JyCXI1LCByNSwgcjYgICAgICBAIFJlZyA9IChUZW1wPDxXYXlTaGlmdCl8KE51bVNldHM8PFNldFNoaWZ0KQorCWRjaXN3CXI1LCByNgorCWJndAkyYgorCWNtcAlyMiwgIzAKKwliZ3QJMWIKKwlkc2IJc3QKKwlpc2IKKwlyZXQJbHIKK0VORFBST0ModjdtX2ludmFsaWRhdGVfbDEpCisKKy8qCisgKgl2N21fZmx1c2hfaWNhY2hlX2FsbCgpCisgKgorICoJRmx1c2ggdGhlIHdob2xlIEktY2FjaGUuCisgKgorICoJUmVnaXN0ZXJzOgorICoJcjAgLSBzZXQgdG8gMAorICovCitFTlRSWSh2N21fZmx1c2hfaWNhY2hlX2FsbCkKKwlpbnZhbGlkYXRlX2ljYWNoZSByMAorCXJldAlscgorRU5EUFJPQyh2N21fZmx1c2hfaWNhY2hlX2FsbCkKKworLyoKKyAqCXY3bV9mbHVzaF9kY2FjaGVfYWxsKCkKKyAqCisgKglGbHVzaCB0aGUgd2hvbGUgRC1jYWNoZS4KKyAqCisgKglDb3JydXB0ZWQgcmVnaXN0ZXJzOiByMC1yNywgcjktcjExCisgKi8KK0VOVFJZKHY3bV9mbHVzaF9kY2FjaGVfYWxsKQorCWRtYgkJCQkJQCBlbnN1cmUgb3JkZXJpbmcgd2l0aCBwcmV2aW91cyBtZW1vcnkgYWNjZXNzZXMKKwlyZWFkX2NsaWRyIHIwCisJbW92CXIzLCByMCwgbHNyICMyMwkJCUAgbW92ZSBMb0MgaW50byBwb3NpdGlvbgorCWFuZHMJcjMsIHIzLCAjNyA8PCAxCQkJQCBleHRyYWN0IExvQyoyIGZyb20gY2xpZHIKKwliZXEJZmluaXNoZWQJCQlAIGlmIGxvYyBpcyAwLCB0aGVuIG5vIG5lZWQgdG8gY2xlYW4KK3N0YXJ0X2ZsdXNoX2xldmVsczoKKwltb3YJcjEwLCAjMAkJCQlAIHN0YXJ0IGNsZWFuIGF0IGNhY2hlIGxldmVsIDAKK2ZsdXNoX2xldmVsczoKKwlhZGQJcjIsIHIxMCwgcjEwLCBsc3IgIzEJCUAgd29yayBvdXQgM3ggY3VycmVudCBjYWNoZSBsZXZlbAorCW1vdglyMSwgcjAsIGxzciByMgkJCUAgZXh0cmFjdCBjYWNoZSB0eXBlIGJpdHMgZnJvbSBjbGlkcgorCWFuZAlyMSwgcjEsICM3CQkJQCBtYXNrIG9mIHRoZSBiaXRzIGZvciBjdXJyZW50IGNhY2hlIG9ubHkKKwljbXAJcjEsICMyCQkJCUAgc2VlIHdoYXQgY2FjaGUgd2UgaGF2ZSBhdCB0aGlzIGxldmVsCisJYmx0CXNraXAJCQkJQCBza2lwIGlmIG5vIGNhY2hlLCBvciBqdXN0IGktY2FjaGUKKyNpZmRlZiBDT05GSUdfUFJFRU1QVAorCXNhdmVfYW5kX2Rpc2FibGVfaXJxc19ub3RyYWNlIHI5CUAgbWFrZSBjc3NyJmNzaWRyIHJlYWQgYXRvbWljCisjZW5kaWYKKwl3cml0ZV9jc3NlbHIgcjEwLCByMQkJCUAgc2V0IGN1cnJlbnQgY2FjaGUgbGV2ZWwKKwlpc2IJCQkJCUAgaXNiIHRvIHN5Y2ggdGhlIG5ldyBjc3NyJmNzaWRyCisJcmVhZF9jY3NpZHIgcjEJCQkJQCByZWFkIHRoZSBuZXcgY3NpZHIKKyNpZmRlZiBDT05GSUdfUFJFRU1QVAorCXJlc3RvcmVfaXJxc19ub3RyYWNlIHI5CisjZW5kaWYKKwlhbmQJcjIsIHIxLCAjNwkJCUAgZXh0cmFjdCB0aGUgbGVuZ3RoIG9mIHRoZSBjYWNoZSBsaW5lcworCWFkZAlyMiwgcjIsICM0CQkJQCBhZGQgNCAobGluZSBsZW5ndGggb2Zmc2V0KQorCW1vdncJcjQsICMweDNmZgorCWFuZHMJcjQsIHI0LCByMSwgbHNyICMzCQlAIGZpbmQgbWF4aW11bSBudW1iZXIgb24gdGhlIHdheSBzaXplCisJY2x6CXI1LCByNAkJCQlAIGZpbmQgYml0IHBvc2l0aW9uIG9mIHdheSBzaXplIGluY3JlbWVudAorCW1vdncJcjcsICMweDdmZmYKKwlhbmRzCXI3LCByNywgcjEsIGxzciAjMTMJCUAgZXh0cmFjdCBtYXggbnVtYmVyIG9mIHRoZSBpbmRleCBzaXplCitsb29wMToKKwltb3YJcjksIHI3CQkJCUAgY3JlYXRlIHdvcmtpbmcgY29weSBvZiBtYXggaW5kZXgKK2xvb3AyOgorCWxzbAlyNiwgcjQsIHI1CisJb3JyCXIxMSwgcjEwLCByNgkJCUAgZmFjdG9yIHdheSBhbmQgY2FjaGUgbnVtYmVyIGludG8gcjExCisJbHNsCXI2LCByOSwgcjIKKwlvcnIJcjExLCByMTEsIHI2CQkJQCBmYWN0b3IgaW5kZXggbnVtYmVyIGludG8gcjExCisJZGNjaXN3CXIxMSwgcjYJCQkJQCBjbGVhbi9pbnZhbGlkYXRlIGJ5IHNldC93YXkKKwlzdWJzCXI5LCByOSwgIzEJCQlAIGRlY3JlbWVudCB0aGUgaW5kZXgKKwliZ2UJbG9vcDIKKwlzdWJzCXI0LCByNCwgIzEJCQlAIGRlY3JlbWVudCB0aGUgd2F5CisJYmdlCWxvb3AxCitza2lwOgorCWFkZAlyMTAsIHIxMCwgIzIJCQlAIGluY3JlbWVudCBjYWNoZSBudW1iZXIKKwljbXAJcjMsIHIxMAorCWJndAlmbHVzaF9sZXZlbHMKK2ZpbmlzaGVkOgorCW1vdglyMTAsICMwCQkJCUAgc3dpdGggYmFjayB0byBjYWNoZSBsZXZlbCAwCisJd3JpdGVfY3NzZWxyIHIxMCwgcjMJCQlAIHNlbGVjdCBjdXJyZW50IGNhY2hlIGxldmVsIGluIGNzc3IKKwlkc2IJc3QKKwlpc2IKKwlyZXQJbHIKK0VORFBST0ModjdtX2ZsdXNoX2RjYWNoZV9hbGwpCisKKy8qCisgKgl2N21fZmx1c2hfY2FjaGVfYWxsKCkKKyAqCisgKglGbHVzaCB0aGUgZW50aXJlIGNhY2hlIHN5c3RlbS4KKyAqICBUaGUgZGF0YSBjYWNoZSBmbHVzaCBpcyBub3cgYWNoaWV2ZWQgdXNpbmcgYXRvbWljIGNsZWFuIC8gaW52YWxpZGF0ZXMKKyAqICB3b3JraW5nIG91dHdhcmRzIGZyb20gTDEgY2FjaGUuIFRoaXMgaXMgZG9uZSB1c2luZyBTZXQvV2F5IGJhc2VkIGNhY2hlCisgKiAgbWFpbnRlbmFuY2UgaW5zdHJ1Y3Rpb25zLgorICogIFRoZSBpbnN0cnVjdGlvbiBjYWNoZSBjYW4gc3RpbGwgYmUgaW52YWxpZGF0ZWQgYmFjayB0byB0aGUgcG9pbnQgb2YKKyAqICB1bmlmaWNhdGlvbiBpbiBhIHNpbmdsZSBpbnN0cnVjdGlvbi4KKyAqCisgKi8KK0VOVFJZKHY3bV9mbHVzaF9rZXJuX2NhY2hlX2FsbCkKKwlzdG1mZAlzcCEsIHtyNC1yNywgcjktcjExLCBscn0KKwlibAl2N21fZmx1c2hfZGNhY2hlX2FsbAorCWludmFsaWRhdGVfaWNhY2hlIHIwCisJbGRtZmQJc3AhLCB7cjQtcjcsIHI5LXIxMSwgbHJ9CisJcmV0CWxyCitFTkRQUk9DKHY3bV9mbHVzaF9rZXJuX2NhY2hlX2FsbCkKKworLyoKKyAqCXY3bV9mbHVzaF9jYWNoZV9hbGwoKQorICoKKyAqCUZsdXNoIGFsbCBUTEIgZW50cmllcyBpbiBhIHBhcnRpY3VsYXIgYWRkcmVzcyBzcGFjZQorICoKKyAqCS0gbW0gICAgLSBtbV9zdHJ1Y3QgZGVzY3JpYmluZyBhZGRyZXNzIHNwYWNlCisgKi8KK0VOVFJZKHY3bV9mbHVzaF91c2VyX2NhY2hlX2FsbCkKKwkvKkZBTExUSFJPVUdIKi8KKworLyoKKyAqCXY3bV9mbHVzaF9jYWNoZV9yYW5nZShzdGFydCwgZW5kLCBmbGFncykKKyAqCisgKglGbHVzaCBhIHJhbmdlIG9mIFRMQiBlbnRyaWVzIGluIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBzcGFjZS4KKyAqCisgKgktIHN0YXJ0IC0gc3RhcnQgYWRkcmVzcyAobWF5IG5vdCBiZSBhbGlnbmVkKQorICoJLSBlbmQgICAtIGVuZCBhZGRyZXNzIChleGNsdXNpdmUsIG1heSBub3QgYmUgYWxpZ25lZCkKKyAqCS0gZmxhZ3MJLSB2bV9hcmVhX3N0cnVjdCBmbGFncyBkZXNjcmliaW5nIGFkZHJlc3Mgc3BhY2UKKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQ6CisgKgktIHdlIGhhdmUgYSBWSVBUIGNhY2hlLgorICovCitFTlRSWSh2N21fZmx1c2hfdXNlcl9jYWNoZV9yYW5nZSkKKwlyZXQJbHIKK0VORFBST0ModjdtX2ZsdXNoX3VzZXJfY2FjaGVfYWxsKQorRU5EUFJPQyh2N21fZmx1c2hfdXNlcl9jYWNoZV9yYW5nZSkKKworLyoKKyAqCXY3bV9jb2hlcmVudF9rZXJuX3JhbmdlKHN0YXJ0LGVuZCkKKyAqCisgKglFbnN1cmUgdGhhdCB0aGUgSSBhbmQgRCBjYWNoZXMgYXJlIGNvaGVyZW50IHdpdGhpbiBzcGVjaWZpZWQKKyAqCXJlZ2lvbi4gIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiBjb2RlIGhhcyBiZWVuIHdyaXR0ZW4gdG8KKyAqCWEgbWVtb3J5IHJlZ2lvbiwgYW5kIHdpbGwgYmUgZXhlY3V0ZWQuCisgKgorICoJLSBzdGFydCAgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzIG9mIHJlZ2lvbgorICoJLSBlbmQgICAgIC0gdmlydHVhbCBlbmQgYWRkcmVzcyBvZiByZWdpb24KKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQ6CisgKgktIHRoZSBJY2FjaGUgZG9lcyBub3QgcmVhZCBkYXRhIGZyb20gdGhlIHdyaXRlIGJ1ZmZlcgorICovCitFTlRSWSh2N21fY29oZXJlbnRfa2Vybl9yYW5nZSkKKwkvKiBGQUxMVEhST1VHSCAqLworCisvKgorICoJdjdtX2NvaGVyZW50X3VzZXJfcmFuZ2Uoc3RhcnQsZW5kKQorICoKKyAqCUVuc3VyZSB0aGF0IHRoZSBJIGFuZCBEIGNhY2hlcyBhcmUgY29oZXJlbnQgd2l0aGluIHNwZWNpZmllZAorICoJcmVnaW9uLiAgVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCB3aGVuIGNvZGUgaGFzIGJlZW4gd3JpdHRlbiB0bworICoJYSBtZW1vcnkgcmVnaW9uLCBhbmQgd2lsbCBiZSBleGVjdXRlZC4KKyAqCisgKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCisgKgktIGVuZCAgICAgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzIG9mIHJlZ2lvbgorICoKKyAqCUl0IGlzIGFzc3VtZWQgdGhhdDoKKyAqCS0gdGhlIEljYWNoZSBkb2VzIG5vdCByZWFkIGRhdGEgZnJvbSB0aGUgd3JpdGUgYnVmZmVyCisgKi8KK0VOVFJZKHY3bV9jb2hlcmVudF91c2VyX3JhbmdlKQorIFVOV0lORCguZm5zdGFydAkJKQorCWRjYWNoZV9saW5lX3NpemUgcjIsIHIzCisJc3ViCXIzLCByMiwgIzEKKwliaWMJcjEyLCByMCwgcjMKKzE6CisvKgorICogV2UgdXNlIG9wZW4gY29kZWQgdmVyc2lvbiBvZiBkY2NtdmF1IG90aGVyd2lzZSBVU0VSKCkgd291bGQKKyAqIHBvaW50IGF0IG1vdncgaW5zdHJ1Y3Rpb24uCisgKi8KKwlkY2NtdmF1CXIxMiwgcjMKKwlhZGQJcjEyLCByMTIsIHIyCisJY21wCXIxMiwgcjEKKwlibG8JMWIKKwlkc2IJaXNoc3QKKwlpY2FjaGVfbGluZV9zaXplIHIyLCByMworCXN1YglyMywgcjIsICMxCisJYmljCXIxMiwgcjAsIHIzCisyOgorCWljaW12YXUgcjEyLCByMworCWFkZAlyMTIsIHIxMiwgcjIKKwljbXAJcjEyLCByMQorCWJsbwkyYgorCWludmFsaWRhdGVfYnAgcjAKKwlkc2IJaXNoc3QKKwlpc2IKKwlyZXQJbHIKKyBVTldJTkQoLmZuZW5kCQkpCitFTkRQUk9DKHY3bV9jb2hlcmVudF9rZXJuX3JhbmdlKQorRU5EUFJPQyh2N21fY29oZXJlbnRfdXNlcl9yYW5nZSkKKworLyoKKyAqCXY3bV9mbHVzaF9rZXJuX2RjYWNoZV9hcmVhKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKQorICoKKyAqCUVuc3VyZSB0aGF0IHRoZSBkYXRhIGhlbGQgaW4gdGhlIHBhZ2Uga2FkZHIgaXMgd3JpdHRlbiBiYWNrCisgKgl0byB0aGUgcGFnZSBpbiBxdWVzdGlvbi4KKyAqCisgKgktIGFkZHIJLSBrZXJuZWwgYWRkcmVzcworICoJLSBzaXplCS0gcmVnaW9uIHNpemUKKyAqLworRU5UUlkodjdtX2ZsdXNoX2tlcm5fZGNhY2hlX2FyZWEpCisJZGNhY2hlX2xpbmVfc2l6ZSByMiwgcjMKKwlhZGQJcjEsIHIwLCByMQorCXN1YglyMywgcjIsICMxCisJYmljCXIwLCByMCwgcjMKKzE6CisJZGNjaW12YWMgcjAsIHIzCQlAIGNsZWFuICYgaW52YWxpZGF0ZSBEIGxpbmUgLyB1bmlmaWVkIGxpbmUKKwlhZGQJcjAsIHIwLCByMgorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwlkc2IJc3QKKwlyZXQJbHIKK0VORFBST0ModjdtX2ZsdXNoX2tlcm5fZGNhY2hlX2FyZWEpCisKKy8qCisgKgl2N21fZG1hX2ludl9yYW5nZShzdGFydCxlbmQpCisgKgorICoJSW52YWxpZGF0ZSB0aGUgZGF0YSBjYWNoZSB3aXRoaW4gdGhlIHNwZWNpZmllZCByZWdpb247IHdlIHdpbGwKKyAqCWJlIHBlcmZvcm1pbmcgYSBETUEgb3BlcmF0aW9uIGluIHRoaXMgcmVnaW9uIGFuZCB3ZSB3YW50IHRvCisgKglwdXJnZSBvbGQgZGF0YSBpbiB0aGUgY2FjaGUuCisgKgorICoJLSBzdGFydCAgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzIG9mIHJlZ2lvbgorICoJLSBlbmQgICAgIC0gdmlydHVhbCBlbmQgYWRkcmVzcyBvZiByZWdpb24KKyAqLwordjdtX2RtYV9pbnZfcmFuZ2U6CisJZGNhY2hlX2xpbmVfc2l6ZSByMiwgcjMKKwlzdWIJcjMsIHIyLCAjMQorCXRzdAlyMCwgcjMKKwliaWMJcjAsIHIwLCByMworCWRjY2ltdmFjbmUgcjAsIHIzCisJc3VibmUJcjMsIHIyLCAjMQlAIHJlc3RvcmUgcjMsIGNvcnJ1cHRlZCBieSB2N20ncyBkY2NpbXZhYworCXRzdAlyMSwgcjMKKwliaWMJcjEsIHIxLCByMworCWRjY2ltdmFjbmUgcjEsIHIzCisxOgorCWRjaW12YWMgcjAsIHIzCisJYWRkCXIwLCByMCwgcjIKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJZHNiCXN0CisJcmV0CWxyCitFTkRQUk9DKHY3bV9kbWFfaW52X3JhbmdlKQorCisvKgorICoJdjdtX2RtYV9jbGVhbl9yYW5nZShzdGFydCxlbmQpCisgKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCisgKgktIGVuZCAgICAgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzIG9mIHJlZ2lvbgorICovCit2N21fZG1hX2NsZWFuX3JhbmdlOgorCWRjYWNoZV9saW5lX3NpemUgcjIsIHIzCisJc3ViCXIzLCByMiwgIzEKKwliaWMJcjAsIHIwLCByMworMToKKwlkY2NtdmFjIHIwLCByMwkJCUAgY2xlYW4gRCAvIFUgbGluZQorCWFkZAlyMCwgcjAsIHIyCisJY21wCXIwLCByMQorCWJsbwkxYgorCWRzYglzdAorCXJldAlscgorRU5EUFJPQyh2N21fZG1hX2NsZWFuX3JhbmdlKQorCisvKgorICoJdjdtX2RtYV9mbHVzaF9yYW5nZShzdGFydCxlbmQpCisgKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCisgKgktIGVuZCAgICAgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzIG9mIHJlZ2lvbgorICovCitFTlRSWSh2N21fZG1hX2ZsdXNoX3JhbmdlKQorCWRjYWNoZV9saW5lX3NpemUgcjIsIHIzCisJc3ViCXIzLCByMiwgIzEKKwliaWMJcjAsIHIwLCByMworMToKKwlkY2NpbXZhYyByMCwgcjMJCQkgQCBjbGVhbiAmIGludmFsaWRhdGUgRCAvIFUgbGluZQorCWFkZAlyMCwgcjAsIHIyCisJY21wCXIwLCByMQorCWJsbwkxYgorCWRzYglzdAorCXJldAlscgorRU5EUFJPQyh2N21fZG1hX2ZsdXNoX3JhbmdlKQorCisvKgorICoJZG1hX21hcF9hcmVhKHN0YXJ0LCBzaXplLCBkaXIpCisgKgktIHN0YXJ0CS0ga2VybmVsIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBzaXplCS0gc2l6ZSBvZiByZWdpb24KKyAqCS0gZGlyCS0gRE1BIGRpcmVjdGlvbgorICovCitFTlRSWSh2N21fZG1hX21hcF9hcmVhKQorCWFkZAlyMSwgcjEsIHIwCisJdGVxCXIyLCAjRE1BX0ZST01fREVWSUNFCisJYmVxCXY3bV9kbWFfaW52X3JhbmdlCisJYgl2N21fZG1hX2NsZWFuX3JhbmdlCitFTkRQUk9DKHY3bV9kbWFfbWFwX2FyZWEpCisKKy8qCisgKglkbWFfdW5tYXBfYXJlYShzdGFydCwgc2l6ZSwgZGlyKQorICoJLSBzdGFydAktIGtlcm5lbCB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gc2l6ZQktIHNpemUgb2YgcmVnaW9uCisgKgktIGRpcgktIERNQSBkaXJlY3Rpb24KKyAqLworRU5UUlkodjdtX2RtYV91bm1hcF9hcmVhKQorCWFkZAlyMSwgcjEsIHIwCisJdGVxCXIyLCAjRE1BX1RPX0RFVklDRQorCWJuZQl2N21fZG1hX2ludl9yYW5nZQorCXJldAlscgorRU5EUFJPQyh2N21fZG1hX3VubWFwX2FyZWEpCisKKwkuZ2xvYmwJdjdtX2ZsdXNoX2tlcm5fY2FjaGVfbG91aXMKKwkuZXF1CXY3bV9mbHVzaF9rZXJuX2NhY2hlX2xvdWlzLCB2N21fZmx1c2hfa2Vybl9jYWNoZV9hbGwKKworCV9fSU5JVERBVEEKKworCUAgZGVmaW5lIHN0cnVjdCBjcHVfY2FjaGVfZm5zIChzZWUgPGFzbS9jYWNoZWZsdXNoLmg+IGFuZCBwcm9jLW1hY3Jvcy5TKQorCWRlZmluZV9jYWNoZV9mdW5jdGlvbnMgdjdtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9kbWEtbWFwcGluZy5jIGIvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcuYwppbmRleCBjNjgzNGMwLi5hMjMwMmFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9kbWEtbWFwcGluZy5jCisrKyBiL2FyY2gvYXJtL21tL2RtYS1tYXBwaW5nLmMKQEAgLTQzNiw3ICs0MzYsNyBAQAogCQlnZW5fcG9vbF9zZXRfYWxnbyhhdG9taWNfcG9vbCwKIAkJCQlnZW5fcG9vbF9maXJzdF9maXRfb3JkZXJfYWxpZ24sCiAJCQkJKHZvaWQgKilQQUdFX1NISUZUKTsKLQkJcHJfaW5mbygiRE1BOiBwcmVhbGxvY2F0ZWQgJXpkIEtpQiBwb29sIGZvciBhdG9taWMgY29oZXJlbnQgYWxsb2NhdGlvbnNcbiIsCisJCXByX2luZm8oIkRNQTogcHJlYWxsb2NhdGVkICV6dSBLaUIgcG9vbCBmb3IgYXRvbWljIGNvaGVyZW50IGFsbG9jYXRpb25zXG4iLAogCQkgICAgICAgYXRvbWljX3Bvb2xfc2l6ZSAvIDEwMjQpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC00NDUsNyArNDQ1LDcgQEAKIAlnZW5fcG9vbF9kZXN0cm95KGF0b21pY19wb29sKTsKIAlhdG9taWNfcG9vbCA9IE5VTEw7CiBvdXQ6Ci0JcHJfZXJyKCJETUE6IGZhaWxlZCB0byBhbGxvY2F0ZSAlenggS2lCIHBvb2wgZm9yIGF0b21pYyBjb2hlcmVudCBhbGxvY2F0aW9uXG4iLAorCXByX2VycigiRE1BOiBmYWlsZWQgdG8gYWxsb2NhdGUgJXp1IEtpQiBwb29sIGZvciBhdG9taWMgY29oZXJlbnQgYWxsb2NhdGlvblxuIiwKIAkgICAgICAgYXRvbWljX3Bvb2xfc2l6ZSAvIDEwMjQpOwogCXJldHVybiAtRU5PTUVNOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vbW11LmMgYi9hcmNoL2FybS9tbS9tbXUuYwppbmRleCA2MmY0ZDAxLi40MDAxZGQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9tbXUuYworKysgYi9hcmNoL2FybS9tbS9tbXUuYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAKIAlpbml0aWFsX3BtZF92YWx1ZSA9IHBtZDsKIAotCXBtZCAmPSBQTURfU0VDVF9URVgoMSkgfCBQTURfU0VDVF9CVUZGRVJBQkxFIHwgUE1EX1NFQ1RfQ0FDSEVBQkxFOworCXBtZCAmPSBQTURfU0VDVF9DQUNIRV9NQVNLOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2FjaGVfcG9saWNpZXMpOyBpKyspCiAJCWlmIChjYWNoZV9wb2xpY2llc1tpXS5wbWQgPT0gcG1kKSB7CkBAIC0yNDMsNyArMjQzLDcgQEAKICNkZWZpbmUgUFJPVF9QVEVfUzJfREVWSUNFCVBST1RfUFRFX0RFVklDRQogI2RlZmluZSBQUk9UX1NFQ1RfREVWSUNFCVBNRF9UWVBFX1NFQ1R8UE1EX1NFQ1RfQVBfV1JJVEUKIAotc3RhdGljIHN0cnVjdCBtZW1fdHlwZSBtZW1fdHlwZXNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgbWVtX3R5cGUgbWVtX3R5cGVzW10gX19yb19hZnRlcl9pbml0ID0gewogCVtNVF9ERVZJQ0VdID0gewkJICAvKiBTdHJvbmdseSBvcmRlcmVkIC8gQVJNdjYgc2hhcmVkIGRldmljZSAqLwogCQkucHJvdF9wdGUJPSBQUk9UX1BURV9ERVZJQ0UgfCBMX1BURV9NVF9ERVZfU0hBUkVEIHwKIAkJCQkgIExfUFRFX1NIQVJFRCwKQEAgLTcyOCw3ICs3MjgsOCBAQAogewogCXZvaWQgKnB0ciA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhQR0FMTE9DX0dGUCwgZ2V0X29yZGVyKHN6KSk7CiAKLQlCVUdfT04oIXB0cik7CisJaWYgKCFwdHIgfHwgIXBndGFibGVfcGFnZV9jdG9yKHZpcnRfdG9fcGFnZShwdHIpKSkKKwkJQlVHKCk7CiAJcmV0dXJuIHB0cjsKIH0KIApAQCAtMTE1NSwxMCArMTE1NiwxOSBAQAogewogCXBoeXNfYWRkcl90IG1lbWJsb2NrX2xpbWl0ID0gMDsKIAlpbnQgaGlnaG1lbSA9IDA7Ci0JcGh5c19hZGRyX3Qgdm1hbGxvY19saW1pdCA9IF9fcGEodm1hbGxvY19taW4gLSAxKSArIDE7CisJdTY0IHZtYWxsb2NfbGltaXQ7CiAJc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcmVnOwogCWJvb2wgc2hvdWxkX3VzZV9oaWdobWVtID0gZmFsc2U7CiAKKwkvKgorCSAqIExldCdzIHVzZSBvdXIgb3duICh1bm9wdGltaXplZCkgZXF1aXZhbGVudCBvZiBfX3BhKCkgdGhhdCBpcworCSAqIG5vdCBhZmZlY3RlZCBieSB3cmFwLWFyb3VuZHMgd2hlbiBzaXplb2YocGh5c19hZGRyX3QpID09IDQuCisJICogVGhlIHJlc3VsdCBpcyB1c2VkIGFzIHRoZSB1cHBlciBib3VuZCBvbiBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcworCSAqIGFuZCBtYXkgaXRzZWxmIGJlIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlIGZvciB3aGljaCBwaHlzX2FkZHJfdAorCSAqIGFuZCB0aGVyZWZvcmUgX19wYSgpIGlzIGRlZmluZWQuCisJICovCisJdm1hbGxvY19saW1pdCA9ICh1NjQpKHVpbnRwdHJfdCl2bWFsbG9jX21pbiAtIFBBR0VfT0ZGU0VUICsgUEhZU19PRkZTRVQ7CisKIAlmb3JfZWFjaF9tZW1ibG9jayhtZW1vcnksIHJlZykgewogCQlwaHlzX2FkZHJfdCBibG9ja19zdGFydCA9IHJlZy0+YmFzZTsKIAkJcGh5c19hZGRyX3QgYmxvY2tfZW5kID0gcmVnLT5iYXNlICsgcmVnLT5zaXplOwpAQCAtMTE4MywxMCArMTE5MywxMSBAQAogCQkJaWYgKHJlZy0+c2l6ZSA+IHNpemVfbGltaXQpIHsKIAkJCQlwaHlzX2FkZHJfdCBvdmVybGFwX3NpemUgPSByZWctPnNpemUgLSBzaXplX2xpbWl0OwogCi0JCQkJcHJfbm90aWNlKCJUcnVuY2F0aW5nIFJBTSBhdCAlcGEtJXBhIHRvIC0lcGEiLAotCQkJCQkgICZibG9ja19zdGFydCwgJmJsb2NrX2VuZCwgJnZtYWxsb2NfbGltaXQpOwotCQkJCW1lbWJsb2NrX3JlbW92ZSh2bWFsbG9jX2xpbWl0LCBvdmVybGFwX3NpemUpOworCQkJCXByX25vdGljZSgiVHJ1bmNhdGluZyBSQU0gYXQgJXBhLSVwYSIsCisJCQkJCSAgJmJsb2NrX3N0YXJ0LCAmYmxvY2tfZW5kKTsKIAkJCQlibG9ja19lbmQgPSB2bWFsbG9jX2xpbWl0OworCQkJCXByX2NvbnQoIiB0byAtJXBhIiwgJmJsb2NrX2VuZCk7CisJCQkJbWVtYmxvY2tfcmVtb3ZlKHZtYWxsb2NfbGltaXQsIG92ZXJsYXBfc2l6ZSk7CiAJCQkJc2hvdWxkX3VzZV9oaWdobWVtID0gdHJ1ZTsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1tYWNyb3MuUyBiL2FyY2gvYXJtL21tL3Byb2MtbWFjcm9zLlMKaW5kZXggYzY3MWYzNC4uMGQ0MGMyOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1tYWNyb3MuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLW1hY3Jvcy5TCkBAIC03LDYgKzcsMTAgQEAKICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KIAorI2lmZGVmIENPTkZJR19DUFVfVjdNCisjaW5jbHVkZSA8YXNtL3Y3bS5oPgorI2VuZGlmCisKIC8qCiAgKiB2bWFfdm1fbW0gLSBnZXQgbW0gcG9pbnRlciBmcm9tIHZtYSBwb2ludGVyICh2bWEtPnZtX21tKQogICovCkBAIC03MCw3ICs3NCwxMyBAQAogICogb24gQVJNdjcuCiAgKi8KIAkubWFjcm8JZGNhY2hlX2xpbmVfc2l6ZSwgcmVnLCB0bXAKKyNpZmRlZiBDT05GSUdfQ1BVX1Y3TQorCW1vdncJXHRtcCwgIzpsb3dlcjE2OkJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0NUUgorCW1vdnQJXHRtcCwgIzp1cHBlcjE2OkJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0NUUgorCWxkciAgICAgXHRtcCwgW1x0bXBdCisjZWxzZQogCW1yYwlwMTUsIDAsIFx0bXAsIGMwLCBjMCwgMQkJQCByZWFkIGN0cgorI2VuZGlmCiAJbHNyCVx0bXAsIFx0bXAsICMxNgogCWFuZAlcdG1wLCBcdG1wLCAjMHhmCQlAIGNhY2hlIGxpbmUgc2l6ZSBlbmNvZGluZwogCW1vdglccmVnLCAjNAkJCUAgYnl0ZXMgcGVyIHdvcmQKQEAgLTgyLDcgKzkyLDEzIEBACiAgKiBvbiBBUk12Ny4KICAqLwogCS5tYWNybwlpY2FjaGVfbGluZV9zaXplLCByZWcsIHRtcAorI2lmZGVmIENPTkZJR19DUFVfVjdNCisJbW92dwlcdG1wLCAjOmxvd2VyMTY6QkFTRUFERFJfVjdNX1NDQiArIFY3TV9TQ0JfQ1RSCisJbW92dAlcdG1wLCAjOnVwcGVyMTY6QkFTRUFERFJfVjdNX1NDQiArIFY3TV9TQ0JfQ1RSCisJbGRyICAgICBcdG1wLCBbXHRtcF0KKyNlbHNlCiAJbXJjCXAxNSwgMCwgXHRtcCwgYzAsIGMwLCAxCQlAIHJlYWQgY3RyCisjZW5kaWYKIAlhbmQJXHRtcCwgXHRtcCwgIzB4ZgkJQCBjYWNoZSBsaW5lIHNpemUgZW5jb2RpbmcKIAltb3YJXHJlZywgIzQJCQlAIGJ5dGVzIHBlciB3b3JkCiAJbW92CVxyZWcsIFxyZWcsIGxzbCBcdG1wCQlAIGFjdHVhbCBjYWNoZSBsaW5lIHNpemUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtdjcuUyBiL2FyY2gvYXJtL21tL3Byb2MtdjcuUwppbmRleCBhNzEyM2I0Li5kMDBkNTJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXY3LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy12Ny5TCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8YXNtL2h3Y2FwLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUtaHdkZWYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KIAogI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtdjdtLlMgYi9hcmNoL2FybS9tbS9wcm9jLXY3bS5TCmluZGV4IDcyMjlkOGQuLmY2ZDMzM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtdjdtLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy12N20uUwpAQCAtNzQsMTQgKzc0LDQyIEBACiBFTkRQUk9DKGNwdV92N21fZG9fcmVzdW1lKQogI2VuZGlmCiAKK0VOVFJZKGNwdV9jbTdfZGNhY2hlX2NsZWFuX2FyZWEpCisJZGNhY2hlX2xpbmVfc2l6ZSByMiwgcjMKKwltb3Z3CXIzLCAjOmxvd2VyMTY6QkFTRUFERFJfVjdNX1NDQiArIFY3TV9TQ0JfRENDTVZBQworCW1vdnQJcjMsICM6dXBwZXIxNjpCQVNFQUREUl9WN01fU0NCICsgVjdNX1NDQl9EQ0NNVkFDCisKKzE6CXN0cglyMCwgW3IzXQkJQCBjbGVhbiBEIGVudHJ5CisJYWRkCXIwLCByMCwgcjIKKwlzdWJzCXIxLCByMSwgcjIKKwliaGkJMWIKKwlkc2IKKwlyZXQJbHIKK0VORFBST0MoY3B1X2NtN19kY2FjaGVfY2xlYW5fYXJlYSkKKworRU5UUlkoY3B1X2NtN19wcm9jX2ZpbikKKwltb3Z3CXIyLCAjOmxvd2VyMTY6KEJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0NDUikKKwltb3Z0CXIyLCAjOnVwcGVyMTY6KEJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0NDUikKKwlsZHIJcjAsIFtyMl0KKwliaWMJcjAsIHIwLCAjKFY3TV9TQ0JfQ0NSX0RDIHwgVjdNX1NDQl9DQ1JfSUMpCisJc3RyCXIwLCBbcjJdCisJcmV0CWxyCitFTkRQUk9DKGNwdV9jbTdfcHJvY19maW4pCisKIAkuc2VjdGlvbiAiLnRleHQuaW5pdCIsICNhbGxvYywgI2V4ZWNpbnN0cgogCitfX3Y3bV9jbTdfc2V0dXA6CisJbW92CXI4LCAjKFY3TV9TQ0JfQ0NSX0RDIHwgVjdNX1NDQl9DQ1JfSUN8IFY3TV9TQ0JfQ0NSX0JQKQorCWIJX192N21fc2V0dXBfY29udAogLyoKICAqCV9fdjdtX3NldHVwCiAgKgogICoJVGhpcyBzaG91bGQgYmUgYWJsZSB0byBjb3ZlciBhbGwgQVJNdjctTSBjb3Jlcy4KICAqLwogX192N21fc2V0dXA6CisJbW92CXI4LCAwCisKK19fdjdtX3NldHVwX2NvbnQ6CiAJQCBDb25maWd1cmUgdGhlIHZlY3RvciB0YWJsZSBiYXNlIGFkZHJlc3MKIAlsZHIJcjAsID1CQVNFQUREUl9WN01fU0NCCiAJbGRyCXIxMiwgPXZlY3Rvcl90YWJsZQpAQCAtMTA0LDYgKzEzMiw3IEBACiAJYmFkcglyMSwgMWYKIAlsZHIJcjUsIFtyMTIsICMxMSAqIDRdCUAgcmVhZCB0aGUgU1ZDIHZlY3RvciBlbnRyeQogCXN0cglyMSwgW3IxMiwgIzExICogNF0JQCB3cml0ZSB0aGUgdGVtcG9yYXJ5IFNWQyB2ZWN0b3IgZW50cnkKKwlkc2IKIAltb3YJcjYsIGxyCQkJQCBzYXZlIExSCiAJbGRyCXNwLCA9aW5pdF90aHJlYWRfdW5pb24gKyBUSFJFQURfU1RBUlRfU1AKIAljcHNpZQlpCkBAIC0xMTYsMTUgKzE0NSwzMiBAQAogCW1vdglyMSwgIzEKIAltc3IJY29udHJvbCwgcjEJCUAgVGhyZWFkIG1vZGUgaGFzIHVucHJpdmlsZWRnZWQgYWNjZXNzCiAKKwlAIENvbmZpZ3VyZSBjYWNoZXMgKGlmIGltcGxlbWVudGVkKQorCXRlcSAgICAgcjgsICMwCisJc3RtbmVpYQlyMTIsIHtyMC1yNiwgbHJ9CUAgdjdtX2ludmFsaWRhdGVfbDEgdG91Y2hlcyByMC1yNgorCWJsbmUJdjdtX2ludmFsaWRhdGVfbDEKKwl0ZXEgICAgIHI4LCAjMAkJCUAgcmUtZXZhbHV0YWUgY29uZGl0aW9uCisJbGRtbmVpYQlyMTIsIHtyMC1yNiwgbHJ9CisKIAlAIENvbmZpZ3VyZSB0aGUgU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgdG8gZW5zdXJlIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKIAlAIE5vdGUgdGhlIFNUS0FMSUdOIGJpdCBpcyBlaXRoZXIgUlcgb3IgUkFPLgotCWxkcglyMTIsIFtyMCwgVjdNX1NDQl9DQ1JdCUAgc3lzdGVtIGNvbnRyb2wgcmVnaXN0ZXIKLQlvcnIJcjEyLCAjVjdNX1NDQl9DQ1JfU1RLQUxJR04KLQlzdHIJcjEyLCBbcjAsIFY3TV9TQ0JfQ0NSXQorCWxkcglyMCwgW3IwLCBWN01fU0NCX0NDUl0gICBAIHN5c3RlbSBjb250cm9sIHJlZ2lzdGVyCisJb3JyCXIwLCAjVjdNX1NDQl9DQ1JfU1RLQUxJR04KKwlvcnIJcjAsIHIwLCByOAorCiAJcmV0CWxyCiBFTkRQUk9DKF9fdjdtX3NldHVwKQogCisvKgorICogQ29ydGV4LU03IHByb2Nlc3NvciBmdW5jdGlvbnMKKyAqLworCWdsb2JsX2VxdQljcHVfY203X3Byb2NfaW5pdCwJY3B1X3Y3bV9wcm9jX2luaXQKKwlnbG9ibF9lcXUJY3B1X2NtN19yZXNldCwJCWNwdV92N21fcmVzZXQKKwlnbG9ibF9lcXUJY3B1X2NtN19kb19pZGxlLAljcHVfdjdtX2RvX2lkbGUKKwlnbG9ibF9lcXUJY3B1X2NtN19zd2l0Y2hfbW0sCWNwdV92N21fc3dpdGNoX21tCisKIAlkZWZpbmVfcHJvY2Vzc29yX2Z1bmN0aW9ucyB2N20sIGRhYm9ydD1ub21tdV9lYXJseV9hYm9ydCwgcGFib3J0PWxlZ2FjeV9wYWJvcnQsIG5vbW11PTEKKwlkZWZpbmVfcHJvY2Vzc29yX2Z1bmN0aW9ucyBjbTcsIGRhYm9ydD1ub21tdV9lYXJseV9hYm9ydCwgcGFib3J0PWxlZ2FjeV9wYWJvcnQsIG5vbW11PTEKIAogCS5zZWN0aW9uICIucm9kYXRhIgogCXN0cmluZyBjcHVfYXJjaF9uYW1lLCAiYXJtdjdtIgpAQCAtMTMzLDYgKzE3OSw1MCBAQAogCiAJLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYwogCisubWFjcm8gX192N21fcHJvYyBuYW1lLCBpbml0ZnVuYywgY2FjaGVfZm5zID0gbm9wX2NhY2hlX2ZucywgaHdjYXBzID0gMCwgIHByb2NfZm5zID0gdjdtX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkubG9uZwkwCQkJLyogcHJvY19pbmZvX2xpc3QuX19jcHVfbW1fbW11X2ZsYWdzICovCisJLmxvbmcJMAkJCS8qIHByb2NfaW5mb19saXN0Ll9fY3B1X2lvX21tdV9mbGFncyAqLworCWluaXRmbglcaW5pdGZ1bmMsIFxuYW1lCisJLmxvbmcJY3B1X2FyY2hfbmFtZQorCS5sb25nCWNwdV9lbGZfbmFtZQorCS5sb25nCUhXQ0FQX0hBTEYgfCBIV0NBUF9USFVNQiB8IEhXQ0FQX0ZBU1RfTVVMVCB8IFxod2NhcHMKKwkubG9uZwljcHVfdjdtX25hbWUKKwkubG9uZyAgIFxwcm9jX2ZucworCS5sb25nCTAJCQkvKiBwcm9jX2luZm9fbGlzdC50bGIgKi8KKwkubG9uZwkwCQkJLyogcHJvY19pbmZvX2xpc3QudXNlciAqLworCS5sb25nCVxjYWNoZV9mbnMKKy5lbmRtCisKKwkvKgorCSAqIE1hdGNoIEFSTSBDb3J0ZXgtTTcgcHJvY2Vzc29yLgorCSAqLworCS50eXBlCV9fdjdtX2NtN19wcm9jX2luZm8sICNvYmplY3QKK19fdjdtX2NtN19wcm9jX2luZm86CisJLmxvbmcJMHg0MTBmYzI3MAkJLyogQVJNIENvcnRleC1NNyAweEMyNyAqLworCS5sb25nCTB4ZmYwZmZmZjAJCS8qIE1hc2sgb2ZmIHJldmlzaW9uLCBwYXRjaCByZWxlYXNlICovCisJX192N21fcHJvYyBfX3Y3bV9jbTdfcHJvY19pbmZvLCBfX3Y3bV9jbTdfc2V0dXAsIGh3Y2FwcyA9IEhXQ0FQX0VEU1AsIGNhY2hlX2ZucyA9IHY3bV9jYWNoZV9mbnMsIHByb2NfZm5zID0gY203X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkuc2l6ZQlfX3Y3bV9jbTdfcHJvY19pbmZvLCAuIC0gX192N21fY203X3Byb2NfaW5mbworCisJLyoKKwkgKiBNYXRjaCBBUk0gQ29ydGV4LU00IHByb2Nlc3Nvci4KKwkgKi8KKwkudHlwZQlfX3Y3bV9jbTRfcHJvY19pbmZvLCAjb2JqZWN0CitfX3Y3bV9jbTRfcHJvY19pbmZvOgorCS5sb25nCTB4NDEwZmMyNDAJCS8qIEFSTSBDb3J0ZXgtTTQgMHhDMjQgKi8KKwkubG9uZwkweGZmMGZmZmYwCQkvKiBNYXNrIG9mZiByZXZpc2lvbiwgcGF0Y2ggcmVsZWFzZSAqLworCV9fdjdtX3Byb2MgX192N21fY200X3Byb2NfaW5mbywgX192N21fc2V0dXAsIGh3Y2FwcyA9IEhXQ0FQX0VEU1AKKwkuc2l6ZQlfX3Y3bV9jbTRfcHJvY19pbmZvLCAuIC0gX192N21fY200X3Byb2NfaW5mbworCisJLyoKKwkgKiBNYXRjaCBBUk0gQ29ydGV4LU0zIHByb2Nlc3Nvci4KKwkgKi8KKwkudHlwZQlfX3Y3bV9jbTNfcHJvY19pbmZvLCAjb2JqZWN0CitfX3Y3bV9jbTNfcHJvY19pbmZvOgorCS5sb25nCTB4NDEwZmMyMzAJCS8qIEFSTSBDb3J0ZXgtTTMgMHhDMjMgKi8KKwkubG9uZwkweGZmMGZmZmYwCQkvKiBNYXNrIG9mZiByZXZpc2lvbiwgcGF0Y2ggcmVsZWFzZSAqLworCV9fdjdtX3Byb2MgX192N21fY20zX3Byb2NfaW5mbywgX192N21fc2V0dXAKKwkuc2l6ZQlfX3Y3bV9jbTNfcHJvY19pbmZvLCAuIC0gX192N21fY20zX3Byb2NfaW5mbworCiAJLyoKIAkgKiBNYXRjaCBhbnkgQVJNdjctTSBwcm9jZXNzb3IgY29yZS4KIAkgKi8KQEAgLTE0MCwxNiArMjMwLDYgQEAKIF9fdjdtX3Byb2NfaW5mbzoKIAkubG9uZwkweDAwMGYwMDAwCQlAIFJlcXVpcmVkIElEIHZhbHVlCiAJLmxvbmcJMHgwMDBmMDAwMAkJQCBNYXNrIGZvciBJRAotCS5sb25nICAgMAkJCUAgcHJvY19pbmZvX2xpc3QuX19jcHVfbW1fbW11X2ZsYWdzCi0JLmxvbmcgICAwCQkJQCBwcm9jX2luZm9fbGlzdC5fX2NwdV9pb19tbXVfZmxhZ3MKLQlpbml0Zm4JX192N21fc2V0dXAsIF9fdjdtX3Byb2NfaW5mbwlAIHByb2NfaW5mb19saXN0Ll9fY3B1X2ZsdXNoCi0JLmxvbmcJY3B1X2FyY2hfbmFtZQotCS5sb25nCWNwdV9lbGZfbmFtZQotCS5sb25nCUhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUCi0JLmxvbmcJY3B1X3Y3bV9uYW1lCi0JLmxvbmcJdjdtX3Byb2Nlc3Nvcl9mdW5jdGlvbnMJQCBwcm9jX2luZm9fbGlzdC5wcm9jCi0JLmxvbmcJMAkJCUAgcHJvY19pbmZvX2xpc3QudGxiCi0JLmxvbmcJMAkJCUAgcHJvY19pbmZvX2xpc3QudXNlcgotCS5sb25nCW5vcF9jYWNoZV9mbnMJCUAgcHJvY19pbmZvX2xpc3QuY2FjaGUKKwlfX3Y3bV9wcm9jIF9fdjdtX3Byb2NfaW5mbywgX192N21fc2V0dXAKIAkuc2l6ZQlfX3Y3bV9wcm9jX2luZm8sIC4gLSBfX3Y3bV9wcm9jX2luZm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0veGVuL2VubGlnaHRlbi5jIGIvYXJjaC9hcm0veGVuL2VubGlnaHRlbi5jCmluZGV4IGIwYjgyZjUuLmYxOTM0MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3hlbi9lbmxpZ2h0ZW4uYworKysgYi9hcmNoL2FybS94ZW4vZW5saWdodGVuLmMKQEAgLTUwLDcgKzUwLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgdmNwdV9pbmZvIF9fcGVyY3B1ICp4ZW5fdmNwdV9pbmZvOwogCiAvKiBMaW51eCA8LT4gWGVuIHZDUFUgaWQgbWFwcGluZyAqLwotREVGSU5FX1BFUl9DUFUoaW50LCB4ZW5fdmNwdV9pZCkgPSAtMTsKK0RFRklORV9QRVJfQ1BVKHVpbnQzMl90LCB4ZW5fdmNwdV9pZCk7CiBFWFBPUlRfUEVSX0NQVV9TWU1CT0woeGVuX3ZjcHVfaWQpOwogCiAvKiBUaGVzZSBhcmUgdW51c2VkIHVudGlsIHdlIHN1cHBvcnQgYm9vdGluZyAicHJlLWJhbGxvb25lZCIgKi8KQEAgLTE3MCw5ICsxNzAsNiBAQAogCXByX2luZm8oIlhlbjogaW5pdGlhbGl6aW5nIGNwdSVkXG4iLCBjcHUpOwogCXZjcHVwID0gcGVyX2NwdV9wdHIoeGVuX3ZjcHVfaW5mbywgY3B1KTsKIAotCS8qIERpcmVjdCB2Q1BVIGlkIG1hcHBpbmcgZm9yIEFSTSBndWVzdHMuICovCi0JcGVyX2NwdSh4ZW5fdmNwdV9pZCwgY3B1KSA9IGNwdTsKLQogCWluZm8ubWZuID0gdmlydF90b19nZm4odmNwdXApOwogCWluZm8ub2Zmc2V0ID0geGVuX29mZnNldF9pbl9wYWdlKHZjcHVwKTsKIApAQCAtMzMwLDYgKzMyNyw3IEBACiB7CiAJc3RydWN0IHhlbl9hZGRfdG9fcGh5c21hcCB4YXRwOwogCXN0cnVjdCBzaGFyZWRfaW5mbyAqc2hhcmVkX2luZm9fcGFnZSA9IE5VTEw7CisJaW50IGNwdTsKIAogCWlmICgheGVuX2RvbWFpbigpKQogCQlyZXR1cm4gMDsKQEAgLTM4MCw3ICszNzgsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIERpcmVjdCB2Q1BVIGlkIG1hcHBpbmcgZm9yIEFSTSBndWVzdHMuICovCi0JcGVyX2NwdSh4ZW5fdmNwdV9pZCwgMCkgPSAwOworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCisJCXBlcl9jcHUoeGVuX3ZjcHVfaWQsIGNwdSkgPSBjcHU7CiAKIAl4ZW5fYXV0b194bGF0X2dyYW50X2ZyYW1lcy5jb3VudCA9IGdudHRhYl9tYXhfZ3JhbnRfZnJhbWVzKCk7CiAJaWYgKHhlbl94bGF0ZV9tYXBfYmFsbG9vbmVkX3BhZ2VzKCZ4ZW5fYXV0b194bGF0X2dyYW50X2ZyYW1lcy5wZm4sCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcgYi9hcmNoL2FybTY0L0tjb25maWcKaW5kZXggYmMzZjAwZi4uMDE2MDA0MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9LY29uZmlnCisrKyBiL2FyY2gvYXJtNjQvS2NvbmZpZwpAQCAtNCw2ICs0LDggQEAKIAlzZWxlY3QgQUNQSV9HRU5FUklDX0dTSSBpZiBBQ1BJCiAJc2VsZWN0IEFDUElfUkVEVUNFRF9IQVJEV0FSRV9PTkxZIGlmIEFDUEkKIAlzZWxlY3QgQUNQSV9NQ0ZHIGlmIEFDUEkKKwlzZWxlY3QgQUNQSV9TUENSX1RBQkxFIGlmIEFDUEkKKwlzZWxlY3QgQVJDSF9DTE9DS1NPVVJDRV9EQVRBCiAJc2VsZWN0IEFSQ0hfSEFTX0RFVk1FTV9JU19BTExPV0VECiAJc2VsZWN0IEFSQ0hfSEFTX0FDUElfVEFCTEVfVVBHUkFERSBpZiBBQ1BJCiAJc2VsZWN0IEFSQ0hfSEFTX0FUT01JQzY0X0RFQ19JRl9QT1NJVElWRQpAQCAtMTUsNyArMTcsNiBAQAogCXNlbGVjdCBBUkNIX1VTRV9DTVBYQ0hHX0xPQ0tSRUYKIAlzZWxlY3QgQVJDSF9TVVBQT1JUU19BVE9NSUNfUk1XCiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTlVNQV9CQUxBTkNJTkcKLQlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKIAlzZWxlY3QgQVJDSF9XQU5UX0NPTVBBVF9JUENfUEFSU0VfVkVSU0lPTgogCXNlbGVjdCBBUkNIX1dBTlRfRlJBTUVfUE9JTlRFUlMKIAlzZWxlY3QgQVJDSF9IQVNfVUJTQU5fU0FOSVRJWkVfQUxMCkBAIC0xMDIsMTAgKzEwMyw4IEBACiAJc2VsZWN0IE5PX0JPT1RNRU0KIAlzZWxlY3QgT0YKIAlzZWxlY3QgT0ZfRUFSTFlfRkxBVFRSRUUKLQlzZWxlY3QgT0ZfTlVNQSBpZiBOVU1BICYmIE9GCiAJc2VsZWN0IE9GX1JFU0VSVkVEX01FTQogCXNlbGVjdCBQQ0lfRUNBTSBpZiBBQ1BJCi0Jc2VsZWN0IFBFUkZfVVNFX1ZNQUxMT0MKIAlzZWxlY3QgUE9XRVJfUkVTRVQKIAlzZWxlY3QgUE9XRVJfU1VQUExZCiAJc2VsZWN0IFNQQVJTRV9JUlEKQEAgLTEyMiw2ICsxMjEsOSBAQAogY29uZmlnIE1NVQogCWRlZl9ib29sIHkKIAorY29uZmlnIERFQlVHX1JPREFUQQorCWRlZl9ib29sIHkKKwogY29uZmlnIEFSTTY0X1BBR0VfU0hJRlQKIAlpbnQKIAlkZWZhdWx0IDE2IGlmIEFSTTY0XzY0S19QQUdFUwpAQCAtNDE1LDE4ICs0MTcsMTMgQEAKIAogY29uZmlnIEFSTTY0X0VSUkFUVU1fODQzNDE5CiAJYm9vbCAiQ29ydGV4LUE1MzogODQzNDE5OiBBIGxvYWQgb3Igc3RvcmUgbWlnaHQgYWNjZXNzIGFuIGluY29ycmVjdCBhZGRyZXNzIgotCWRlcGVuZHMgb24gTU9EVUxFUwogCWRlZmF1bHQgeQotCXNlbGVjdCBBUk02NF9NT0RVTEVfQ01PREVMX0xBUkdFCisJc2VsZWN0IEFSTTY0X01PRFVMRV9DTU9ERUxfTEFSR0UgaWYgTU9EVUxFUwogCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGJ1aWxkcyBrZXJuZWwgbW9kdWxlcyB1c2luZyB0aGUgbGFyZ2UgbWVtb3J5IG1vZGVsIGluCi0JICBvcmRlciB0byBhdm9pZCB0aGUgdXNlIG9mIHRoZSBBRFJQIGluc3RydWN0aW9uLCB3aGljaCBjYW4gY2F1c2UKLQkgIGEgc3Vic2VxdWVudCBtZW1vcnkgYWNjZXNzIHRvIHVzZSBhbiBpbmNvcnJlY3QgYWRkcmVzcyBvbiBDb3J0ZXgtQTUzCi0JICBwYXJ0cyB1cCB0byByMHA0LgotCi0JICBOb3RlIHRoYXQgdGhlIGtlcm5lbCBpdHNlbGYgbXVzdCBiZSBsaW5rZWQgd2l0aCBhIHZlcnNpb24gb2YgbGQKLQkgIHdoaWNoIGZpeGVzIHBvdGVudGlhbGx5IGFmZmVjdGVkIEFEUlAgaW5zdHJ1Y3Rpb25zIHRocm91Z2ggdGhlCi0JICB1c2Ugb2YgdmVuZWVycy4KKwkgIFRoaXMgb3B0aW9uIGxpbmtzIHRoZSBrZXJuZWwgd2l0aCAnLS1maXgtY29ydGV4LWE1My04NDM0MTknIGFuZAorCSAgYnVpbGRzIG1vZHVsZXMgdXNpbmcgdGhlIGxhcmdlIG1lbW9yeSBtb2RlbCBpbiBvcmRlciB0byBhdm9pZCB0aGUgdXNlCisJICBvZiB0aGUgQURSUCBpbnN0cnVjdGlvbiwgd2hpY2ggY2FuIGNhdXNlIGEgc3Vic2VxdWVudCBtZW1vcnkgYWNjZXNzCisJICB0byB1c2UgYW4gaW5jb3JyZWN0IGFkZHJlc3Mgb24gQ29ydGV4LUE1MyBwYXJ0cyB1cCB0byByMHA0LgogCiAJICBJZiB1bnN1cmUsIHNheSBZLgogCkBAIC01ODIsNyArNTc5LDggQEAKICMgQ29tbW9uIE5VTUEgRmVhdHVyZXMKIGNvbmZpZyBOVU1BCiAJYm9vbCAiTnVtYSBNZW1vcnkgQWxsb2NhdGlvbiBhbmQgU2NoZWR1bGVyIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTTVAKKwlzZWxlY3QgQUNQSV9OVU1BIGlmIEFDUEkKKwlzZWxlY3QgT0ZfTlVNQQogCWhlbHAKIAkgIEVuYWJsZSBOVU1BIChOb24gVW5pZm9ybSBNZW1vcnkgQWNjZXNzKSBzdXBwb3J0LgogCkBAIC02MDMsMTEgKzYwMSwxOCBAQAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIE5VTUEKIAorY29uZmlnIEhBVkVfU0VUVVBfUEVSX0NQVV9BUkVBCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gTlVNQQorCitjb25maWcgTkVFRF9QRVJfQ1BVX0VNQkVEX0ZJUlNUX0NIVU5LCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gTlVNQQorCiBzb3VyY2Uga2VybmVsL0tjb25maWcucHJlZW1wdAogc291cmNlIGtlcm5lbC9LY29uZmlnLmh6CiAKIGNvbmZpZyBBUkNIX1NVUFBPUlRTX0RFQlVHX1BBR0VBTExPQwotCWRlcGVuZHMgb24gIUhJQkVSTkFUSU9OCiAJZGVmX2Jvb2wgeQogCiBjb25maWcgQVJDSF9IQVNfSE9MRVNfTUVNT1JZTU9ERUwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvYXJtNjQvS2NvbmZpZy5kZWJ1ZwppbmRleCAwY2M3NThjLi5iNjYxZmU3IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9hcm02NC9LY29uZmlnLmRlYnVnCkBAIC00OSwxNiArNDksNiBAQAogCiAJICBJZiBpbiBkb3VidCwgc2F5IFkuCiAKLWNvbmZpZyBERUJVR19ST0RBVEEKLQlib29sICJNYWtlIGtlcm5lbCB0ZXh0IGFuZCByb2RhdGEgcmVhZC1vbmx5IgotCWRlZmF1bHQgeQotCWhlbHAKLQkgIElmIHRoaXMgaXMgc2V0LCBrZXJuZWwgdGV4dCBhbmQgcm9kYXRhIHdpbGwgYmUgbWFkZSByZWFkLW9ubHkuIFRoaXMKLQkgIGlzIHRvIGhlbHAgY2F0Y2ggYWNjaWRlbnRhbCBvciBtYWxpY2lvdXMgYXR0ZW1wdHMgdG8gY2hhbmdlIHRoZQotCSAga2VybmVsJ3MgZXhlY3V0YWJsZSBjb2RlLgotCi0JICBJZiBpbiBkb3VidCwgc2F5IFkuCi0KIGNvbmZpZyBERUJVR19BTElHTl9ST0RBVEEKIAlkZXBlbmRzIG9uIERFQlVHX1JPREFUQQogCWJvb2wgIkFsaWduIGxpbmtlciBzZWN0aW9ucyB1cCB0byBTRUNUSU9OX1NJWkUiCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcucGxhdGZvcm1zIGIvYXJjaC9hcm02NC9LY29uZmlnLnBsYXRmb3JtcwppbmRleCBiZTVkODI0Li5iNmIzNjU3IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L0tjb25maWcucGxhdGZvcm1zCisrKyBiL2FyY2gvYXJtNjQvS2NvbmZpZy5wbGF0Zm9ybXMKQEAgLTE1LDggKzE1LDggQEAKIAogY29uZmlnIEFSQ0hfQkNNMjgzNQogCWJvb2wgIkJyb2FkY29tIEJDTTI4MzUgZmFtaWx5IgotCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgogCXNlbGVjdCBDTEtTUkNfT0YKKwlzZWxlY3QgR1BJT0xJQgogCXNlbGVjdCBQSU5DVFJMCiAJc2VsZWN0IFBJTkNUUkxfQkNNMjgzNQogCXNlbGVjdCBBUk1fQU1CQQpAQCAtMjksMTUgKzI5LDE1IEBACiBjb25maWcgQVJDSF9CQ01fSVBST0MKIAlib29sICJCcm9hZGNvbSBpUHJvYyBTb0MgRmFtaWx5IgogCXNlbGVjdCBDT01NT05fQ0xLX0lQUk9DCisJc2VsZWN0IEdQSU9MSUIKIAlzZWxlY3QgUElOQ1RSTAotCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBCcm9hZGNvbSBpUHJvYyBiYXNlZCBTb0NzCiAKIGNvbmZpZyBBUkNIX0JFUkxJTgogCWJvb2wgIk1hcnZlbGwgQmVybGluIFNvQyBGYW1pbHkiCi0Jc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAJc2VsZWN0IERXX0FQQl9JQ1RMCisJc2VsZWN0IEdQSU9MSUIKIAlzZWxlY3QgUElOQ1RSTAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBNYXJ2ZWxsIEJlcmxpbiBTb0MgRmFtaWx5CkBAIC01NSw2ICs1NSw3IEBACiAKIGNvbmZpZyBBUkNIX0xBWUVSU0NBUEUKIAlib29sICJBUk12OCBiYXNlZCBGcmVlc2NhbGUgTGF5ZXJzY2FwZSBTb0MgZmFtaWx5IgorCXNlbGVjdCBFREFDX1NVUFBPUlQKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEZyZWVzY2FsZSBMYXllcnNjYXBlIFNvQyBmYW1pbHkuCiAKQEAgLTkzLDYgKzk0LDcgQEAKIAlzZWxlY3QgQVJNQURBX0NQMTEwX1NZU0NPTgogCXNlbGVjdCBBUk1BREFfMzdYWF9DTEsKIAlzZWxlY3QgTVZFQlVfT0RNSQorCXNlbGVjdCBNVkVCVV9QSUMKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgTWFydmVsbCBFQlUgZmFtaWxseSwgaW5jbHVkaW5nOgogCSAgIC0gQXJtYWRhIDM3MDAgU29DIEZhbWlseQpAQCAtMTA4LDcgKzExMCw3IEBACiBjb25maWcgQVJDSF9ST0NLQ0hJUAogCWJvb2wgIlJvY2tjaGlwIFBsYXRmb3JtcyIKIAlzZWxlY3QgQVJDSF9IQVNfUkVTRVRfQ09OVFJPTExFUgotCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgorCXNlbGVjdCBHUElPTElCCiAJc2VsZWN0IFBJTkNUUkwKIAlzZWxlY3QgUElOQ1RSTF9ST0NLQ0hJUAogCXNlbGVjdCBST0NLQ0hJUF9USU1FUgpAQCAtMTU0LDEyICsxNTYsMTEgQEAKIGNvbmZpZyBBUkNIX1RFR1JBCiAJYm9vbCAiTlZJRElBIFRlZ3JhIFNvQyBGYW1pbHkiCiAJc2VsZWN0IEFSQ0hfSEFTX1JFU0VUX0NPTlRST0xMRVIKLQlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKIAlzZWxlY3QgQ0xLREVWX0xPT0tVUAogCXNlbGVjdCBDTEtTUkNfTU1JTwogCXNlbGVjdCBDTEtTUkNfT0YKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwotCXNlbGVjdCBIQVZFX0NMSworCXNlbGVjdCBHUElPTElCCiAJc2VsZWN0IFBJTkNUUkwKIAlzZWxlY3QgUkVTRVRfQ09OVFJPTExFUgogCWhlbHAKQEAgLTE4Myw4ICsxODQsOCBAQAogCiBjb25maWcgQVJDSF9WRVhQUkVTUwogCWJvb2wgIkFSTXY4IHNvZnR3YXJlIG1vZGVsIChWZXJzYXRpbGUgRXhwcmVzcykiCi0Jc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAJc2VsZWN0IENPTU1PTl9DTEtfVkVSU0FUSUxFCisJc2VsZWN0IEdQSU9MSUIKIAlzZWxlY3QgUE0KIAlzZWxlY3QgUE1fR0VORVJJQ19ET01BSU5TCiAJc2VsZWN0IFBPV0VSX1JFU0VUX1ZFWFBSRVNTCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L01ha2VmaWxlIGIvYXJjaC9hcm02NC9NYWtlZmlsZQppbmRleCA1YjU0ZjhjLi5hYjUxYWVkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtNjQvTWFrZWZpbGUKQEAgLTE4LDYgKzE4LDE0IEBACiBMREZMQUdTX3ZtbGludXgJCSs9IC1waWUgLUJzeW1ib2xpYwogZW5kaWYKIAoraWZlcSAoJChDT05GSUdfQVJNNjRfRVJSQVRVTV84NDM0MTkpLHkpCisgIGlmZXEgKCQoY2FsbCBsZC1vcHRpb24sIC0tZml4LWNvcnRleC1hNTMtODQzNDE5KSwpCiskKHdhcm5pbmcgbGQgZG9lcyBub3Qgc3VwcG9ydCAtLWZpeC1jb3J0ZXgtYTUzLTg0MzQxOTsga2VybmVsIG1heSBiZSBzdXNjZXB0aWJsZSB0byBlcnJhdHVtKQorICBlbHNlCitMREZMQUdTX3ZtbGludXgJKz0gLS1maXgtY29ydGV4LWE1My04NDM0MTkKKyAgZW5kaWYKK2VuZGlmCisKIEtCVUlMRF9ERUZDT05GSUcgOj0gZGVmY29uZmlnCiAKICMgQ2hlY2sgZm9yIGJpbnV0aWxzIHN1cHBvcnQgZm9yIHNwZWNpZmljIGV4dGVuc2lvbnMKQEAgLTM4LDEwICs0NiwxMiBAQAogS0JVSUxEX0NQUEZMQUdTCSs9IC1tYmlnLWVuZGlhbgogQVMJCSs9IC1FQgogTEQJCSs9IC1FQgorVVRTX01BQ0hJTkUJOj0gYWFyY2g2NF9iZQogZWxzZQogS0JVSUxEX0NQUEZMQUdTCSs9IC1tbGl0dGxlLWVuZGlhbgogQVMJCSs9IC1FTAogTEQJCSs9IC1FTAorVVRTX01BQ0hJTkUJOj0gYWFyY2g2NAogZW5kaWYKIAogQ0hFQ0tGTEFHUwkrPSAtRF9fYWFyY2g2NF9fCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2FsdGVyYS9zb2NmcGdhX3N0cmF0aXgxMC5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9hbHRlcmEvc29jZnBnYV9zdHJhdGl4MTAuZHRzaQppbmRleCA0NDVhYTY3Li5jMmI5YmNiIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2FsdGVyYS9zb2NmcGdhX3N0cmF0aXgxMC5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYWx0ZXJhL3NvY2ZwZ2Ffc3RyYXRpeDEwLmR0c2kKQEAgLTI1NSwxMCArMjU1LDEwIEBACiAJCS8qIExvY2FsIHRpbWVyICovCiAJCXRpbWVyIHsKIAkJCWNvbXBhdGlibGUgPSAiYXJtLGFybXY4LXRpbWVyIjsKLQkJCWludGVycnVwdHMgPSA8MSAxMyAweGYwMT4sCi0JCQkJICAgICA8MSAxNCAweGYwMT4sCi0JCQkJICAgICA8MSAxMSAweGYwMT4sCi0JCQkJICAgICA8MSAxMCAweGYwMT47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTMgMHhmMDg+LAorCQkJCSAgICAgPDEgMTQgMHhmMDg+LAorCQkJCSAgICAgPDEgMTEgMHhmMDg+LAorCQkJCSAgICAgPDEgMTAgMHhmMDg+OwogCQl9OwogCiAJCXRpbWVyMDogdGltZXIwQGZmYzAzMDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYW1sb2dpYy9tZXNvbi1neGJiLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2FtbG9naWMvbWVzb24tZ3hiYi5kdHNpCmluZGV4IGU1MDJjMjQuLmJmNmM4ZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYW1sb2dpYy9tZXNvbi1neGJiLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9hbWxvZ2ljL21lc29uLWd4YmIuZHRzaQpAQCAtMTAyLDEzICsxMDIsMTMgQEAKIAl0aW1lciB7CiAJCWNvbXBhdGlibGUgPSAiYXJtLGFybXY4LXRpbWVyIjsKIAkJaW50ZXJydXB0cyA9IDxHSUNfUFBJIDEzCi0JCQkoR0lDX0NQVV9NQVNLX1JBVygweGZmKSB8IElSUV9UWVBFX0VER0VfUklTSU5HKT4sCisJCQkoR0lDX0NQVV9NQVNLX1JBVygweGZmKSB8IElSUV9UWVBFX0xFVkVMX0xPVyk+LAogCQkJICAgICA8R0lDX1BQSSAxNAotCQkJKEdJQ19DUFVfTUFTS19SQVcoMHhmZikgfCBJUlFfVFlQRV9FREdFX1JJU0lORyk+LAorCQkJKEdJQ19DUFVfTUFTS19SQVcoMHhmZikgfCBJUlFfVFlQRV9MRVZFTF9MT1cpPiwKIAkJCSAgICAgPEdJQ19QUEkgMTEKLQkJCShHSUNfQ1BVX01BU0tfUkFXKDB4ZmYpIHwgSVJRX1RZUEVfRURHRV9SSVNJTkcpPiwKKwkJCShHSUNfQ1BVX01BU0tfUkFXKDB4ZmYpIHwgSVJRX1RZUEVfTEVWRUxfTE9XKT4sCiAJCQkgICAgIDxHSUNfUFBJIDEwCi0JCQkoR0lDX0NQVV9NQVNLX1JBVygweGZmKSB8IElSUV9UWVBFX0VER0VfUklTSU5HKT47CisJCQkoR0lDX0NQVV9NQVNLX1JBVygweGZmKSB8IElSUV9UWVBFX0xFVkVMX0xPVyk+OwogCX07CiAKIAl4dGFsOiB4dGFsLWNsayB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2FwbS9hcG0tbXVzdGFuZy5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2FwbS9hcG0tbXVzdGFuZy5kdHMKaW5kZXggYjdmYjVkOS4uMzJhOTYxYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9hcG0vYXBtLW11c3RhbmcuZHRzCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtL2FwbS1tdXN0YW5nLmR0cwpAQCAtNzQsNiArNzQsNyBAQAogCiAmeGdlbmV0IHsKIAlzdGF0dXMgPSAib2siOworCXJ4bG9zLWdwaW9zID0gPCZzYmdwaW8gMTIgMT47CiB9OwogCiAmbW1jMCB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2FwbS9hcG0tc3Rvcm0uZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtL2FwbS1zdG9ybS5kdHNpCmluZGV4IGYxYzJjNzEuLjMxZWE3MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtL2FwbS1zdG9ybS5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtL2FwbS1zdG9ybS5kdHNpCkBAIC0xMTAsMTAgKzExMCwxMCBAQAogCiAJdGltZXIgewogCQljb21wYXRpYmxlID0gImFybSxhcm12OC10aW1lciI7Ci0JCWludGVycnVwdHMgPSA8MSAwIDB4ZmYwMT4sCS8qIFNlY3VyZSBQaHlzIElSUSAqLwotCQkJICAgICA8MSAxMyAweGZmMDE+LAkvKiBOb24tc2VjdXJlIFBoeXMgSVJRICovCi0JCQkgICAgIDwxIDE0IDB4ZmYwMT4sCS8qIFZpcnQgSVJRICovCi0JCQkgICAgIDwxIDE1IDB4ZmYwMT47CS8qIEh5cCBJUlEgKi8KKwkJaW50ZXJydXB0cyA9IDwxIDAgMHhmZjA4PiwJLyogU2VjdXJlIFBoeXMgSVJRICovCisJCQkgICAgIDwxIDEzIDB4ZmYwOD4sCS8qIE5vbi1zZWN1cmUgUGh5cyBJUlEgKi8KKwkJCSAgICAgPDEgMTQgMHhmZjA4PiwJLyogVmlydCBJUlEgKi8KKwkJCSAgICAgPDEgMTUgMHhmZjA4PjsJLyogSHlwIElSUSAqLwogCQljbG9jay1mcmVxdWVuY3kgPSA8NTAwMDAwMDA+OwogCX07CiAKQEAgLTkyMyw3ICs5MjMsNyBAQAogCQkJLyogbWFjIGFkZHJlc3Mgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgYm9vdGxvYWRlciAqLwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbMDAgMDAgMDAgMDAgMDAgMDBdOwogCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paSI7Ci0JCQlwaHktaGFuZGxlID0gPCZtZW5ldDBwaHk+LDwmbWVuZXRwaHk+OworCQkJcGh5LWhhbmRsZSA9IDwmbWVuZXRwaHk+LDwmbWVuZXQwcGh5PjsKIAkJCW1kaW8gewogCQkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLW1kaW8iOwogCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9iY20yODM1LXJwaS5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9iY20yODM1LXJwaS5kdHNpCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjM5MzdiNzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL2JjbTI4MzUtcnBpLmR0c2kKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vYXJtL2Jvb3QvZHRzL2JjbTI4MzUtcnBpLmR0c2kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL2JjbTI4MzctcnBpLTMtYi5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL2JjbTI4MzctcnBpLTMtYi5kdHMKaW5kZXggNmY0N2RkMi4uNzg0MWI3MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9iY20yODM3LXJwaS0zLWIuZHRzCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzNy1ycGktMy1iLmR0cwpAQCAtMSw3ICsxLDcgQEAKIC9kdHMtdjEvOwogI2luY2x1ZGUgImJjbTI4MzcuZHRzaSIKLSNpbmNsdWRlICIuLi8uLi8uLi8uLi9hcm0vYm9vdC9kdHMvYmNtMjgzNS1ycGkuZHRzaSIKLSNpbmNsdWRlICIuLi8uLi8uLi8uLi9hcm0vYm9vdC9kdHMvYmNtMjgzeC1ycGktc21zYzk1MTQuZHRzaSIKKyNpbmNsdWRlICJiY20yODM1LXJwaS5kdHNpIgorI2luY2x1ZGUgImJjbTI4M3gtcnBpLXNtc2M5NTE0LmR0c2kiCiAKIC8gewogCWNvbXBhdGlibGUgPSAicmFzcGJlcnJ5cGksMy1tb2RlbC1iIiwgImJyY20sYmNtMjgzNyI7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL2JjbTI4MzcuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzNy5kdHNpCmluZGV4IGYyYTMxZDAuLjgyMTZiYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzNy5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzNy5kdHNpCkBAIC0xLDQgKzEsNCBAQAotI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2FybS9ib290L2R0cy9iY20yODN4LmR0c2kiCisjaW5jbHVkZSAiYmNtMjgzeC5kdHNpIgogCiAvIHsKIAljb21wYXRpYmxlID0gImJyY20sYmNtMjgzNiI7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL2JjbTI4M3gtcnBpLXNtc2M5NTE0LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL2JjbTI4M3gtcnBpLXNtc2M5NTE0LmR0c2kKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZGNhN2MwNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzeC1ycGktc21zYzk1MTQuZHRzaQpAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi9hcm0vYm9vdC9kdHMvYmNtMjgzeC1ycGktc21zYzk1MTQuZHRzaQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzeC5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9iY20yODN4LmR0c2kKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNWY1NGU0YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzeC5kdHNpCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uLy4uL2FybS9ib290L2R0cy9iY20yODN4LmR0c2kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL25zMi5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9uczIuZHRzaQppbmRleCBmNTNiMDk1Li5kNGExMmZhIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL25zMi5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vbnMyLmR0c2kKQEAgLTg4LDEzICs4OCwxMyBAQAogCXRpbWVyIHsKIAkJY29tcGF0aWJsZSA9ICJhcm0sYXJtdjgtdGltZXIiOwogCQlpbnRlcnJ1cHRzID0gPEdJQ19QUEkgMTMgKEdJQ19DUFVfTUFTS19SQVcoMHhmZikgfAotCQkJICAgICAgSVJRX1RZUEVfRURHRV9SSVNJTkcpPiwKKwkJCSAgICAgIElSUV9UWVBFX0xFVkVMX0xPVyk+LAogCQkJICAgICA8R0lDX1BQSSAxNCAoR0lDX0NQVV9NQVNLX1JBVygweGZmKSB8Ci0JCQkgICAgICBJUlFfVFlQRV9FREdFX1JJU0lORyk+LAorCQkJICAgICAgSVJRX1RZUEVfTEVWRUxfTE9XKT4sCiAJCQkgICAgIDxHSUNfUFBJIDExIChHSUNfQ1BVX01BU0tfUkFXKDB4ZmYpIHwKLQkJCSAgICAgIElSUV9UWVBFX0VER0VfUklTSU5HKT4sCisJCQkgICAgICBJUlFfVFlQRV9MRVZFTF9MT1cpPiwKIAkJCSAgICAgPEdJQ19QUEkgMTAgKEdJQ19DUFVfTUFTS19SQVcoMHhmZikgfAotCQkJICAgICAgSVJRX1RZUEVfRURHRV9SSVNJTkcpPjsKKwkJCSAgICAgIElSUV9UWVBFX0xFVkVMX0xPVyk+OwogCX07CiAKIAlwbXUgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9jYXZpdW0vdGh1bmRlci04OHh4LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2Nhdml1bS90aHVuZGVyLTg4eHguZHRzaQppbmRleCAyZWI5YjIyLi4wNGRjOGE4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2Nhdml1bS90aHVuZGVyLTg4eHguZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2Nhdml1bS90aHVuZGVyLTg4eHguZHRzaQpAQCAtMzU0LDEwICszNTQsMTAgQEAKIAogCXRpbWVyIHsKIAkJY29tcGF0aWJsZSA9ICJhcm0sYXJtdjgtdGltZXIiOwotCQlpbnRlcnJ1cHRzID0gPDEgMTMgMHhmZjAxPiwKLQkJICAgICAgICAgICAgIDwxIDE0IDB4ZmYwMT4sCi0JCSAgICAgICAgICAgICA8MSAxMSAweGZmMDE+LAotCQkgICAgICAgICAgICAgPDEgMTAgMHhmZjAxPjsKKwkJaW50ZXJydXB0cyA9IDwxIDEzIDQ+LAorCQkgICAgICAgICAgICAgPDEgMTQgND4sCisJCSAgICAgICAgICAgICA8MSAxMSA0PiwKKwkJICAgICAgICAgICAgIDwxIDEwIDQ+OwogCX07CiAKIAlwbXUgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9leHlub3MvZXh5bm9zNy5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9leHlub3MvZXh5bm9zNy5kdHNpCmluZGV4IGNhNjYzZGYuLjE2MjgzMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvZXh5bm9zL2V4eW5vczcuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2V4eW5vcy9leHlub3M3LmR0c2kKQEAgLTQ3MywxMCArNDczLDEwIEBACiAKIAkJdGltZXIgewogCQkJY29tcGF0aWJsZSA9ICJhcm0sYXJtdjgtdGltZXIiOwotCQkJaW50ZXJydXB0cyA9IDwxIDEzIDB4ZmYwMT4sCi0JCQkJICAgICA8MSAxNCAweGZmMDE+LAotCQkJCSAgICAgPDEgMTEgMHhmZjAxPiwKLQkJCQkgICAgIDwxIDEwIDB4ZmYwMT47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTMgMHhmZjA4PiwKKwkJCQkgICAgIDwxIDE0IDB4ZmYwOD4sCisJCQkJICAgICA8MSAxMSAweGZmMDg+LAorCQkJCSAgICAgPDEgMTAgMHhmZjA4PjsKIAkJfTsKIAogCQlwbXVfc3lzdGVtX2NvbnRyb2xsZXI6IHN5c3RlbS1jb250cm9sbGVyQDEwNWMwMDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvZnJlZXNjYWxlL2ZzbC1sczEwNDNhLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2ZyZWVzY2FsZS9mc2wtbHMxMDQzYS5kdHNpCmluZGV4IGU2NjlmYmQuLmE2N2UyMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvZnJlZXNjYWxlL2ZzbC1sczEwNDNhLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9mcmVlc2NhbGUvZnNsLWxzMTA0M2EuZHRzaQpAQCAtMTE5LDEwICsxMTksMTAgQEAKIAogCXRpbWVyIHsKIAkJY29tcGF0aWJsZSA9ICJhcm0sYXJtdjgtdGltZXIiOwotCQlpbnRlcnJ1cHRzID0gPDEgMTMgMHgxPiwgLyogUGh5c2ljYWwgU2VjdXJlIFBQSSAqLwotCQkJICAgICA8MSAxNCAweDE+LCAvKiBQaHlzaWNhbCBOb24tU2VjdXJlIFBQSSAqLwotCQkJICAgICA8MSAxMSAweDE+LCAvKiBWaXJ0dWFsIFBQSSAqLwotCQkJICAgICA8MSAxMCAweDE+OyAvKiBIeXBlcnZpc29yIFBQSSAqLworCQlpbnRlcnJ1cHRzID0gPDEgMTMgMHhmMDg+LCAvKiBQaHlzaWNhbCBTZWN1cmUgUFBJICovCisJCQkgICAgIDwxIDE0IDB4ZjA4PiwgLyogUGh5c2ljYWwgTm9uLVNlY3VyZSBQUEkgKi8KKwkJCSAgICAgPDEgMTEgMHhmMDg+LCAvKiBWaXJ0dWFsIFBQSSAqLworCQkJICAgICA8MSAxMCAweGYwOD47IC8qIEh5cGVydmlzb3IgUFBJICovCiAJfTsKIAogCXBtdSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2ZyZWVzY2FsZS9mc2wtbHMyMDgwYS5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9mcmVlc2NhbGUvZnNsLWxzMjA4MGEuZHRzaQppbmRleCAyMTAyM2EzLi5lM2I2MDM0IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2ZyZWVzY2FsZS9mc2wtbHMyMDgwYS5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvZnJlZXNjYWxlL2ZzbC1sczIwODBhLmR0c2kKQEAgLTE5MSwxMCArMTkxLDEwIEBACiAKIAl0aW1lciB7CiAJCWNvbXBhdGlibGUgPSAiYXJtLGFybXY4LXRpbWVyIjsKLQkJaW50ZXJydXB0cyA9IDwxIDEzIDB4OD4sIC8qIFBoeXNpY2FsIFNlY3VyZSBQUEksIGFjdGl2ZS1sb3cgKi8KLQkJCSAgICAgPDEgMTQgMHg4PiwgLyogUGh5c2ljYWwgTm9uLVNlY3VyZSBQUEksIGFjdGl2ZS1sb3cgKi8KLQkJCSAgICAgPDEgMTEgMHg4PiwgLyogVmlydHVhbCBQUEksIGFjdGl2ZS1sb3cgKi8KLQkJCSAgICAgPDEgMTAgMHg4PjsgLyogSHlwZXJ2aXNvciBQUEksIGFjdGl2ZS1sb3cgKi8KKwkJaW50ZXJydXB0cyA9IDwxIDEzIDQ+LCAvKiBQaHlzaWNhbCBTZWN1cmUgUFBJLCBhY3RpdmUtbG93ICovCisJCQkgICAgIDwxIDE0IDQ+LCAvKiBQaHlzaWNhbCBOb24tU2VjdXJlIFBQSSwgYWN0aXZlLWxvdyAqLworCQkJICAgICA8MSAxMSA0PiwgLyogVmlydHVhbCBQUEksIGFjdGl2ZS1sb3cgKi8KKwkJCSAgICAgPDEgMTAgND47IC8qIEh5cGVydmlzb3IgUFBJLCBhY3RpdmUtbG93ICovCiAJfTsKIAogCXBtdSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL21hcnZlbGwvYXJtYWRhLWFwODA2LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL21hcnZlbGwvYXJtYWRhLWFwODA2LmR0c2kKaW5kZXggZWFiMWE0Mi4uYzJhNjc0NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9tYXJ2ZWxsL2FybWFkYS1hcDgwNi5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvbWFydmVsbC9hcm1hZGEtYXA4MDYuZHRzaQpAQCAtMTIyLDEwICsxMjIsMTAgQEAKIAogCQkJdGltZXIgewogCQkJCWNvbXBhdGlibGUgPSAiYXJtLGFybXY4LXRpbWVyIjsKLQkJCQlpbnRlcnJ1cHRzID0gPEdJQ19QUEkgMTMgKEdJQ19DUFVfTUFTS19TSU1QTEUoNCkgfCBJUlFfVFlQRV9FREdFX1JJU0lORyk+LAotCQkJCQkgICAgIDxHSUNfUFBJIDE0IChHSUNfQ1BVX01BU0tfU0lNUExFKDQpIHwgSVJRX1RZUEVfRURHRV9SSVNJTkcpPiwKLQkJCQkJICAgICA8R0lDX1BQSSAxMSAoR0lDX0NQVV9NQVNLX1NJTVBMRSg0KSB8IElSUV9UWVBFX0VER0VfUklTSU5HKT4sCi0JCQkJCSAgICAgPEdJQ19QUEkgMTAgKEdJQ19DUFVfTUFTS19TSU1QTEUoNCkgfCBJUlFfVFlQRV9FREdFX1JJU0lORyk+OworCQkJCWludGVycnVwdHMgPSA8R0lDX1BQSSAxMyAoR0lDX0NQVV9NQVNLX1NJTVBMRSg0KSB8IElSUV9UWVBFX0xFVkVMX0xPVyk+LAorCQkJCQkgICAgIDxHSUNfUFBJIDE0IChHSUNfQ1BVX01BU0tfU0lNUExFKDQpIHwgSVJRX1RZUEVfTEVWRUxfTE9XKT4sCisJCQkJCSAgICAgPEdJQ19QUEkgMTEgKEdJQ19DUFVfTUFTS19TSU1QTEUoNCkgfCBJUlFfVFlQRV9MRVZFTF9MT1cpPiwKKwkJCQkJICAgICA8R0lDX1BQSSAxMCAoR0lDX0NQVV9NQVNLX1NJTVBMRSg0KSB8IElSUV9UWVBFX0xFVkVMX0xPVyk+OwogCQkJfTsKIAogCQkJb2RtaTogb2RtaUAzMDAwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9yb2NrY2hpcC9yazMzNjguZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcm9ja2NoaXAvcmszMzY4LmR0c2kKaW5kZXggZDAyYTkwMDMuLjRmNDRkMTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcm9ja2NoaXAvcmszMzY4LmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9yb2NrY2hpcC9yazMzNjguZHRzaQpAQCAtMjcwLDYgKzI3MCw4IEBACiAJCSNpby1jaGFubmVsLWNlbGxzID0gPDE+OwogCQljbG9ja3MgPSA8JmNydSBTQ0xLX1NBUkFEQz4sIDwmY3J1IFBDTEtfU0FSQURDPjsKIAkJY2xvY2stbmFtZXMgPSAic2FyYWRjIiwgImFwYl9wY2xrIjsKKwkJcmVzZXRzID0gPCZjcnUgU1JTVF9TQVJBREM+OworCQlyZXNldC1uYW1lcyA9ICJzYXJhZGMtYXBiIjsKIAkJc3RhdHVzID0gImRpc2FibGVkIjsKIAl9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3NvY2lvbmV4dC91bmlwaGllci1waDEtbGQyMC5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9zb2Npb25leHQvdW5pcGhpZXItcGgxLWxkMjAuZHRzaQppbmRleCBjMjIzOTE1Li5kNzNiZGM4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3NvY2lvbmV4dC91bmlwaGllci1waDEtbGQyMC5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvc29jaW9uZXh0L3VuaXBoaWVyLXBoMS1sZDIwLmR0c2kKQEAgLTEyOSwxMCArMTI5LDEwIEBACiAKIAl0aW1lciB7CiAJCWNvbXBhdGlibGUgPSAiYXJtLGFybXY4LXRpbWVyIjsKLQkJaW50ZXJydXB0cyA9IDwxIDEzIDB4ZjAxPiwKLQkJCSAgICAgPDEgMTQgMHhmMDE+LAotCQkJICAgICA8MSAxMSAweGYwMT4sCi0JCQkgICAgIDwxIDEwIDB4ZjAxPjsKKwkJaW50ZXJydXB0cyA9IDwxIDEzIDQ+LAorCQkJICAgICA8MSAxNCA0PiwKKwkJCSAgICAgPDEgMTEgND4sCisJCQkgICAgIDwxIDEwIDQ+OwogCX07CiAKIAlzb2MgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy94aWxpbngvenlucW1wLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3hpbGlueC96eW5xbXAuZHRzaQppbmRleCBlNTk1ZjIyLi4zZTJlNTFmIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3hpbGlueC96eW5xbXAuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3hpbGlueC96eW5xbXAuZHRzaQpAQCAtNjUsMTAgKzY1LDEwIEBACiAJdGltZXIgewogCQljb21wYXRpYmxlID0gImFybSxhcm12OC10aW1lciI7CiAJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47Ci0JCWludGVycnVwdHMgPSA8MSAxMyAweGYwMT4sCi0JCQkgICAgIDwxIDE0IDB4ZjAxPiwKLQkJCSAgICAgPDEgMTEgMHhmMDE+LAotCQkJICAgICA8MSAxMCAweGYwMT47CisJCWludGVycnVwdHMgPSA8MSAxMyAweGYwOD4sCisJCQkgICAgIDwxIDE0IDB4ZjA4PiwKKwkJCSAgICAgPDEgMTEgMHhmMDg+LAorCQkJICAgICA8MSAxMCAweGYwOD47CiAJfTsKIAogCWFtYmFfYXB1IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvY3J5cHRvL2Flcy1nbHVlLmMgYi9hcmNoL2FybTY0L2NyeXB0by9hZXMtZ2x1ZS5jCmluZGV4IDVjODg4MDQuLjZiMmFhMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvY3J5cHRvL2Flcy1nbHVlLmMKKysrIGIvYXJjaC9hcm02NC9jcnlwdG8vYWVzLWdsdWUuYwpAQCAtMjE2LDcgKzIxNiw3IEBACiAJCWVyciA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgJndhbGssCiAJCQkJCSAgd2Fsay5uYnl0ZXMgJSBBRVNfQkxPQ0tfU0laRSk7CiAJfQotCWlmIChuYnl0ZXMpIHsKKwlpZiAod2Fsay5uYnl0ZXMgJSBBRVNfQkxPQ0tfU0laRSkgewogCQl1OCAqdGRzdCA9IHdhbGsuZHN0LnZpcnQuYWRkciArIGJsb2NrcyAqIEFFU19CTE9DS19TSVpFOwogCQl1OCAqdHNyYyA9IHdhbGsuc3JjLnZpcnQuYWRkciArIGJsb2NrcyAqIEFFU19CTE9DS19TSVpFOwogCQl1OCBfX2FsaWduZWQoOCkgdGFpbFtBRVNfQkxPQ0tfU0laRV07CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IGY0M2QyYzQuLjQ0ZTFkN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDQgKzEsMyBAQAotZ2VuZXJpYy15ICs9IGJ1Zy5oCiBnZW5lcmljLXkgKz0gYnVncy5oCiBnZW5lcmljLXkgKz0gY2xrZGV2LmgKIGdlbmVyaWMteSArPSBjcHV0aW1lLmgKQEAgLTEwLDcgKzksNiBAQAogZ2VuZXJpYy15ICs9IGVhcmx5X2lvcmVtYXAuaAogZ2VuZXJpYy15ICs9IGVtZXJnZW5jeS1yZXN0YXJ0LmgKIGdlbmVyaWMteSArPSBlcnJuby5oCi1nZW5lcmljLXkgKz0gZnRyYWNlLmgKIGdlbmVyaWMteSArPSBod19pcnEuaAogZ2VuZXJpYy15ICs9IGlvY3RsLmgKIGdlbmVyaWMteSArPSBpb2N0bHMuaApAQCAtMjcsMTIgKzI1LDEwIEBACiBnZW5lcmljLXkgKz0gbXNnYnVmLmgKIGdlbmVyaWMteSArPSBtc2kuaAogZ2VuZXJpYy15ICs9IG11dGV4LmgKLWdlbmVyaWMteSArPSBwY2kuaAogZ2VuZXJpYy15ICs9IHBvbGwuaAogZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IHJlc291cmNlLmgKIGdlbmVyaWMteSArPSByd3NlbS5oCi1nZW5lcmljLXkgKz0gc2VjdGlvbnMuaAogZ2VuZXJpYy15ICs9IHNlZ21lbnQuaAogZ2VuZXJpYy15ICs9IHNlbWJ1Zi5oCiBnZW5lcmljLXkgKz0gc2VyaWFsLmgKQEAgLTQ1LDcgKzQxLDYgQEAKIGdlbmVyaWMteSArPSBzd2l0Y2hfdG8uaAogZ2VuZXJpYy15ICs9IHRlcm1iaXRzLmgKIGdlbmVyaWMteSArPSB0ZXJtaW9zLmgKLWdlbmVyaWMteSArPSB0b3BvbG9neS5oCiBnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAogZ2VuZXJpYy15ICs9IHR5cGVzLmgKIGdlbmVyaWMteSArPSB1bmFsaWduZWQuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hY3BpLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FjcGkuaAppbmRleCA1NDIwY2IwLi5lNTE3MDg4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FjcGkuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FjcGkuaApAQCAtMTIsNyArMTIsNyBAQAogI2lmbmRlZiBfQVNNX0FDUElfSAogI2RlZmluZSBfQVNNX0FDUElfSAogCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BzY2kuaD4KIAogI2luY2x1ZGUgPGFzbS9jcHV0eXBlLmg+CkBAIC0zMiw3ICszMiwxMSBAQAogc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKmFjcGlfb3NfaW9yZW1hcChhY3BpX3BoeXNpY2FsX2FkZHJlc3MgcGh5cywKIAkJCQkJICAgIGFjcGlfc2l6ZSBzaXplKQogewotCWlmICghcGFnZV9pc19yYW0ocGh5cyA+PiBQQUdFX1NISUZUKSkKKwkvKgorCSAqIEVGSSdzIHJlc2VydmVfcmVnaW9ucygpIGNhbGwgYWRkcyBtZW1vcnkgd2l0aCB0aGUgV0IgYXR0cmlidXRlCisJICogdG8gbWVtYmxvY2sgdmlhIGVhcmx5X2luaXRfZHRfYWRkX21lbW9yeV9hcmNoKCkuCisJICovCisJaWYgKCFtZW1ibG9ja19pc19tZW1vcnkocGh5cykpCiAJCXJldHVybiBpb3JlbWFwKHBoeXMsIHNpemUpOwogCiAJcmV0dXJuIGlvcmVtYXBfY2FjaGUocGh5cywgc2l6ZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLmgKaW5kZXggODc0NmZmNi4uNTUxMDFiZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgX19BU01fQUxURVJOQVRJVkVfSAogCiAjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vaW5zbi5oPgogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCkBAIC05MCwyNCArOTEsMTUgQEAKIC5lbmRtCiAKIC8qCi0gKiBCZWdpbiBhbiBhbHRlcm5hdGl2ZSBjb2RlIHNlcXVlbmNlLgorICogQWx0ZXJuYXRpdmUgc2VxdWVuY2VzCiAgKgotICogVGhlIGNvZGUgdGhhdCBmb2xsb3dzIHRoaXMgbWFjcm8gd2lsbCBiZSBhc3NlbWJsZWQgYW5kIGxpbmtlZCBhcwotICogbm9ybWFsLiBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoaXMgY29kZS4KLSAqLwotLm1hY3JvIGFsdGVybmF0aXZlX2lmX25vdCBjYXAKLQkucHVzaHNlY3Rpb24gLmFsdGluc3RydWN0aW9ucywgImEiCi0JYWx0aW5zdHJ1Y3Rpb25fZW50cnkgNjYxZiwgNjYzZiwgXGNhcCwgNjYyZi02NjFmLCA2NjRmLTY2M2YKLQkucG9wc2VjdGlvbgotNjYxOgotLmVuZG0KLQotLyoKLSAqIFByb3ZpZGUgdGhlIGFsdGVybmF0aXZlIGNvZGUgc2VxdWVuY2UuCisgKiBUaGUgY29kZSBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGNhcGFiaWxpdHkgaXMgbm90IHByZXNlbnQgd2lsbCBiZQorICogYXNzZW1ibGVkIGFuZCBsaW5rZWQgYXMgbm9ybWFsLiBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoaXMKKyAqIGNvZGUuCiAgKgotICogVGhlIGNvZGUgdGhhdCBmb2xsb3dzIHRoaXMgbWFjcm8gaXMgYXNzZW1ibGVkIGludG8gYSBzcGVjaWFsCi0gKiBzZWN0aW9uIHRvIGJlIHVzZWQgZm9yIGR5bmFtaWMgcGF0Y2hpbmcuIENvZGUgdGhhdCBmb2xsb3dzIHRoaXMKLSAqIG1hY3JvIG11c3Q6CisgKiBUaGUgY29kZSBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGNhcGFiaWxpdHkgaXMgcHJlc2VudCB3aWxsIGJlCisgKiBhc3NlbWJsZWQgaW50byBhIHNwZWNpYWwgc2VjdGlvbiB0byBiZSB1c2VkIGZvciBkeW5hbWljIHBhdGNoaW5nLgorICogQ29kZSBmb3IgdGhhdCBjYXNlIG11c3Q6CiAgKgogICogMS4gQmUgZXhhY3RseSB0aGUgc2FtZSBsZW5ndGggKGluIGJ5dGVzKSBhcyB0aGUgZGVmYXVsdCBjb2RlCiAgKiAgICBzZXF1ZW5jZS4KQEAgLTExNiw4ICsxMDgsMzggQEAKICAqICAgIGFsdGVybmF0aXZlIHNlcXVlbmNlIGl0IGlzIGRlZmluZWQgaW4gKGJyYW5jaGVzIGludG8gYW4KICAqICAgIGFsdGVybmF0aXZlIHNlcXVlbmNlIGFyZSBub3QgZml4ZWQgdXApLgogICovCisKKy8qCisgKiBCZWdpbiBhbiBhbHRlcm5hdGl2ZSBjb2RlIHNlcXVlbmNlLgorICovCisubWFjcm8gYWx0ZXJuYXRpdmVfaWZfbm90IGNhcAorCS5zZXQgLkxhc21fYWx0X21vZGUsIDAKKwkucHVzaHNlY3Rpb24gLmFsdGluc3RydWN0aW9ucywgImEiCisJYWx0aW5zdHJ1Y3Rpb25fZW50cnkgNjYxZiwgNjYzZiwgXGNhcCwgNjYyZi02NjFmLCA2NjRmLTY2M2YKKwkucG9wc2VjdGlvbgorNjYxOgorLmVuZG0KKworLm1hY3JvIGFsdGVybmF0aXZlX2lmIGNhcAorCS5zZXQgLkxhc21fYWx0X21vZGUsIDEKKwkucHVzaHNlY3Rpb24gLmFsdGluc3RydWN0aW9ucywgImEiCisJYWx0aW5zdHJ1Y3Rpb25fZW50cnkgNjYzZiwgNjYxZiwgXGNhcCwgNjY0Zi02NjNmLCA2NjJmLTY2MWYKKwkucG9wc2VjdGlvbgorCS5wdXNoc2VjdGlvbiAuYWx0aW5zdHJfcmVwbGFjZW1lbnQsICJheCIKKwkuYWxpZ24gMgkvKiBTbyBHQVMga25vd3MgbGFiZWwgNjYxIGlzIHN1aXRhYmx5IGFsaWduZWQgKi8KKzY2MToKKy5lbmRtCisKKy8qCisgKiBQcm92aWRlIHRoZSBvdGhlciBoYWxmIG9mIHRoZSBhbHRlcm5hdGl2ZSBjb2RlIHNlcXVlbmNlLgorICovCiAubWFjcm8gYWx0ZXJuYXRpdmVfZWxzZQotNjYyOgkucHVzaHNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LCAiYXgiCis2NjI6CisJLmlmIC5MYXNtX2FsdF9tb2RlPT0wCisJLnB1c2hzZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwgImF4IgorCS5lbHNlCisJLnBvcHNlY3Rpb24KKwkuZW5kaWYKIDY2MzoKIC5lbmRtCiAKQEAgLTEyNSwxMSArMTQ3LDI1IEBACiAgKiBDb21wbGV0ZSBhbiBhbHRlcm5hdGl2ZSBjb2RlIHNlcXVlbmNlLgogICovCiAubWFjcm8gYWx0ZXJuYXRpdmVfZW5kaWYKLTY2NDoJLnBvcHNlY3Rpb24KKzY2NDoKKwkuaWYgLkxhc21fYWx0X21vZGU9PTAKKwkucG9wc2VjdGlvbgorCS5lbmRpZgogCS5vcmcJLiAtICg2NjRiLTY2M2IpICsgKDY2MmItNjYxYikKIAkub3JnCS4gLSAoNjYyYi02NjFiKSArICg2NjRiLTY2M2IpCiAuZW5kbQogCisvKgorICogUHJvdmlkZXMgYSB0cml2aWFsIGFsdGVybmF0aXZlIG9yIGRlZmF1bHQgc2VxdWVuY2UgY29uc2lzdGluZyBzb2xlbHkKKyAqIG9mIE5PUHMuIFRoZSBudW1iZXIgb2YgTk9QcyBpcyBjaG9zZW4gYXV0b21hdGljYWxseSB0byBtYXRjaCB0aGUKKyAqIHByZXZpb3VzIGNhc2UuCisgKi8KKy5tYWNybyBhbHRlcm5hdGl2ZV9lbHNlX25vcF9lbmRpZgorYWx0ZXJuYXRpdmVfZWxzZQorCW5vcHMJKDY2MmItNjYxYikgLyBBQVJDSDY0X0lOU05fU0laRQorYWx0ZXJuYXRpdmVfZW5kaWYKKy5lbmRtCisKICNkZWZpbmUgX0FMVEVSTkFUSVZFX0NGRyhpbnNuMSwgaW5zbjIsIGNhcCwgY2ZnLCAuLi4pCVwKIAlhbHRlcm5hdGl2ZV9pbnNuIGluc24xLCBpbnNuMiwgY2FwLCBJU19FTkFCTEVEKGNmZykKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hcmNoX2dpY3YzLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FyY2hfZ2ljdjMuaAppbmRleCA4ZWM4OGU1Li5mYzJhMGNiIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FyY2hfZ2ljdjMuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FyY2hfZ2ljdjMuaApAQCAtMjgsNiArMjgsNyBAQAogI2RlZmluZSBJQ0NfQ1RMUl9FTDEJCQlzeXNfcmVnKDMsIDAsIDEyLCAxMiwgNCkKICNkZWZpbmUgSUNDX1NSRV9FTDEJCQlzeXNfcmVnKDMsIDAsIDEyLCAxMiwgNSkKICNkZWZpbmUgSUNDX0dSUEVOMV9FTDEJCQlzeXNfcmVnKDMsIDAsIDEyLCAxMiwgNykKKyNkZWZpbmUgSUNDX0JQUjFfRUwxCQkJc3lzX3JlZygzLCAwLCAxMiwgMTIsIDMpCiAKICNkZWZpbmUgSUNDX1NSRV9FTDIJCQlzeXNfcmVnKDMsIDQsIDEyLCA5LCA1KQogCkBAIC0xNjUsNiArMTY2LDExIEBACiAJaXNiKCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBnaWNfd3JpdGVfYnByMSh1MzIgdmFsKQoreworCWFzbSB2b2xhdGlsZSgibXNyX3MgIiBfX3N0cmluZ2lmeShJQ0NfQlBSMV9FTDEpICIsICUwIiA6IDogInIiICh2YWwpKTsKK30KKwogI2RlZmluZSBnaWNfcmVhZF90eXBlcihjKQkJcmVhZHFfcmVsYXhlZChjKQogI2RlZmluZSBnaWNfd3JpdGVfaXJvdXRlcih2LCBjKQkJd3JpdGVxX3JlbGF4ZWQodiwgYykKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hcmNoX3RpbWVyLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FyY2hfdGltZXIuaAppbmRleCBmYmUwY2EzLi5lYWE1YmJlIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FyY2hfdGltZXIuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FyY2hfdGltZXIuaApAQCAtMjAsMTMgKzIwLDU1IEBACiAjZGVmaW5lIF9fQVNNX0FSQ0hfVElNRVJfSAogCiAjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4KKyNpbmNsdWRlIDxhc20vc3lzcmVnLmg+CiAKICNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxjbG9ja3NvdXJjZS9hcm1fYXJjaF90aW1lci5oPgogCisjaWYgSVNfRU5BQkxFRChDT05GSUdfRlNMX0VSUkFUVU1fQTAwODU4NSkKK2V4dGVybiBzdHJ1Y3Qgc3RhdGljX2tleV9mYWxzZSBhcmNoX3RpbWVyX3JlYWRfb29sX2VuYWJsZWQ7CisjZGVmaW5lIG5lZWRzX2ZzbF9hMDA4NTg1X3dvcmthcm91bmQoKSBcCisJc3RhdGljX2JyYW5jaF91bmxpa2VseSgmYXJjaF90aW1lcl9yZWFkX29vbF9lbmFibGVkKQorI2Vsc2UKKyNkZWZpbmUgbmVlZHNfZnNsX2EwMDg1ODVfd29ya2Fyb3VuZCgpICBmYWxzZQorI2VuZGlmCisKK3UzMiBfX2ZzbF9hMDA4NTg1X3JlYWRfY250cF90dmFsX2VsMCh2b2lkKTsKK3UzMiBfX2ZzbF9hMDA4NTg1X3JlYWRfY250dl90dmFsX2VsMCh2b2lkKTsKK3U2NCBfX2ZzbF9hMDA4NTg1X3JlYWRfY250dmN0X2VsMCh2b2lkKTsKKworLyoKKyAqIFRoZSBudW1iZXIgb2YgcmV0cmllcyBpcyBhbiBhcmJpdHJhcnkgdmFsdWUgd2VsbCBiZXlvbmQgdGhlIGhpZ2hlc3QgbnVtYmVyCisgKiBvZiBpdGVyYXRpb25zIHRoZSBsb29wIGhhcyBiZWVuIG9ic2VydmVkIHRvIHRha2UuCisgKi8KKyNkZWZpbmUgX19mc2xfYTAwODU4NV9yZWFkX3JlZyhyZWcpICh7CQkJXAorCXU2NCBfb2xkLCBfbmV3OwkJCQkJXAorCWludCBfcmV0cmllcyA9IDIwMDsJCQkJXAorCQkJCQkJCVwKKwlkbyB7CQkJCQkJXAorCQlfb2xkID0gcmVhZF9zeXNyZWcocmVnKTsJCVwKKwkJX25ldyA9IHJlYWRfc3lzcmVnKHJlZyk7CQlcCisJCV9yZXRyaWVzLS07CQkJCVwKKwl9IHdoaWxlICh1bmxpa2VseShfb2xkICE9IF9uZXcpICYmIF9yZXRyaWVzKTsJXAorCQkJCQkJCVwKKwlXQVJOX09OX09OQ0UoIV9yZXRyaWVzKTsJCQlcCisJX25ldzsJCQkJCQlcCit9KQorCisjZGVmaW5lIGFyY2hfdGltZXJfcmVnX3JlYWRfc3RhYmxlKHJlZykgCQlcCisoewkJCQkJCQlcCisJdTY0IF92YWw7CQkJCQlcCisJaWYgKG5lZWRzX2ZzbF9hMDA4NTg1X3dvcmthcm91bmQoKSkJCVwKKwkJX3ZhbCA9IF9fZnNsX2EwMDg1ODVfcmVhZF8jI3JlZygpOwlcCisJZWxzZQkJCQkJCVwKKwkJX3ZhbCA9IHJlYWRfc3lzcmVnKHJlZyk7CQlcCisJX3ZhbDsJCQkJCQlcCit9KQorCiAvKgogICogVGhlc2UgcmVnaXN0ZXIgYWNjZXNzb3JzIGFyZSBtYXJrZWQgaW5saW5lIHNvIHRoZSBjb21waWxlciBjYW4KICAqIG5pY2VseSB3b3JrIG91dCB3aGljaCByZWdpc3RlciB3ZSB3YW50LCBhbmQgY2h1Y2sgYXdheSB0aGUgcmVzdCBvZgpAQCAtMzgsMTkgKzgwLDE5IEBACiAJaWYgKGFjY2VzcyA9PSBBUkNIX1RJTUVSX1BIWVNfQUNDRVNTKSB7CiAJCXN3aXRjaCAocmVnKSB7CiAJCWNhc2UgQVJDSF9USU1FUl9SRUdfQ1RSTDoKLQkJCWFzbSB2b2xhdGlsZSgibXNyIGNudHBfY3RsX2VsMCwgICUwIiA6IDogInIiICh2YWwpKTsKKwkJCXdyaXRlX3N5c3JlZyh2YWwsIGNudHBfY3RsX2VsMCk7CiAJCQlicmVhazsKIAkJY2FzZSBBUkNIX1RJTUVSX1JFR19UVkFMOgotCQkJYXNtIHZvbGF0aWxlKCJtc3IgY250cF90dmFsX2VsMCwgJTAiIDogOiAiciIgKHZhbCkpOworCQkJd3JpdGVfc3lzcmVnKHZhbCwgY250cF90dmFsX2VsMCk7CiAJCQlicmVhazsKIAkJfQogCX0gZWxzZSBpZiAoYWNjZXNzID09IEFSQ0hfVElNRVJfVklSVF9BQ0NFU1MpIHsKIAkJc3dpdGNoIChyZWcpIHsKIAkJY2FzZSBBUkNIX1RJTUVSX1JFR19DVFJMOgotCQkJYXNtIHZvbGF0aWxlKCJtc3IgY250dl9jdGxfZWwwLCAgJTAiIDogOiAiciIgKHZhbCkpOworCQkJd3JpdGVfc3lzcmVnKHZhbCwgY250dl9jdGxfZWwwKTsKIAkJCWJyZWFrOwogCQljYXNlIEFSQ0hfVElNRVJfUkVHX1RWQUw6Ci0JCQlhc20gdm9sYXRpbGUoIm1zciBjbnR2X3R2YWxfZWwwLCAlMCIgOiA6ICJyIiAodmFsKSk7CisJCQl3cml0ZV9zeXNyZWcodmFsLCBjbnR2X3R2YWxfZWwwKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNjEsNDggKzEwMywzOCBAQAogc3RhdGljIF9fYWx3YXlzX2lubGluZQogdTMyIGFyY2hfdGltZXJfcmVnX3JlYWRfY3AxNShpbnQgYWNjZXNzLCBlbnVtIGFyY2hfdGltZXJfcmVnIHJlZykKIHsKLQl1MzIgdmFsOwotCiAJaWYgKGFjY2VzcyA9PSBBUkNIX1RJTUVSX1BIWVNfQUNDRVNTKSB7CiAJCXN3aXRjaCAocmVnKSB7CiAJCWNhc2UgQVJDSF9USU1FUl9SRUdfQ1RSTDoKLQkJCWFzbSB2b2xhdGlsZSgibXJzICUwLCAgY250cF9jdGxfZWwwIiA6ICI9ciIgKHZhbCkpOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gcmVhZF9zeXNyZWcoY250cF9jdGxfZWwwKTsKIAkJY2FzZSBBUkNIX1RJTUVSX1JFR19UVkFMOgotCQkJYXNtIHZvbGF0aWxlKCJtcnMgJTAsIGNudHBfdHZhbF9lbDAiIDogIj1yIiAodmFsKSk7Ci0JCQlicmVhazsKKwkJCXJldHVybiBhcmNoX3RpbWVyX3JlZ19yZWFkX3N0YWJsZShjbnRwX3R2YWxfZWwwKTsKIAkJfQogCX0gZWxzZSBpZiAoYWNjZXNzID09IEFSQ0hfVElNRVJfVklSVF9BQ0NFU1MpIHsKIAkJc3dpdGNoIChyZWcpIHsKIAkJY2FzZSBBUkNIX1RJTUVSX1JFR19DVFJMOgotCQkJYXNtIHZvbGF0aWxlKCJtcnMgJTAsICBjbnR2X2N0bF9lbDAiIDogIj1yIiAodmFsKSk7Ci0JCQlicmVhazsKKwkJCXJldHVybiByZWFkX3N5c3JlZyhjbnR2X2N0bF9lbDApOwogCQljYXNlIEFSQ0hfVElNRVJfUkVHX1RWQUw6Ci0JCQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgY250dl90dmFsX2VsMCIgOiAiPXIiICh2YWwpKTsKLQkJCWJyZWFrOworCQkJcmV0dXJuIGFyY2hfdGltZXJfcmVnX3JlYWRfc3RhYmxlKGNudHZfdHZhbF9lbDApOwogCQl9CiAJfQogCi0JcmV0dXJuIHZhbDsKKwlCVUcoKTsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgYXJjaF90aW1lcl9nZXRfY250ZnJxKHZvaWQpCiB7Ci0JdTMyIHZhbDsKLQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgICBjbnRmcnFfZWwwIiA6ICI9ciIgKHZhbCkpOwotCXJldHVybiB2YWw7CisJcmV0dXJuIHJlYWRfc3lzcmVnKGNudGZycV9lbDApOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBhcmNoX3RpbWVyX2dldF9jbnRrY3RsKHZvaWQpCiB7Ci0JdTMyIGNudGtjdGw7Ci0JYXNtIHZvbGF0aWxlKCJtcnMJJTAsIGNudGtjdGxfZWwxIiA6ICI9ciIgKGNudGtjdGwpKTsKLQlyZXR1cm4gY250a2N0bDsKKwlyZXR1cm4gcmVhZF9zeXNyZWcoY250a2N0bF9lbDEpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF90aW1lcl9zZXRfY250a2N0bCh1MzIgY250a2N0bCkKIHsKLQlhc20gdm9sYXRpbGUoIm1zcgljbnRrY3RsX2VsMSwgJTAiIDogOiAiciIgKGNudGtjdGwpKTsKKwl3cml0ZV9zeXNyZWcoY250a2N0bCwgY250a2N0bF9lbDEpOwogfQogCiBzdGF0aWMgaW5saW5lIHU2NCBhcmNoX2NvdW50ZXJfZ2V0X2NudHBjdCh2b2lkKQpAQCAtMTE2LDEyICsxNDgsOCBAQAogCiBzdGF0aWMgaW5saW5lIHU2NCBhcmNoX2NvdW50ZXJfZ2V0X2NudHZjdCh2b2lkKQogewotCXU2NCBjdmFsOwotCiAJaXNiKCk7Ci0JYXNtIHZvbGF0aWxlKCJtcnMgJTAsIGNudHZjdF9lbDAiIDogIj1yIiAoY3ZhbCkpOwotCi0JcmV0dXJuIGN2YWw7CisJcmV0dXJuIGFyY2hfdGltZXJfcmVnX3JlYWRfc3RhYmxlKGNudHZjdF9lbDApOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhcmNoX3RpbWVyX2FyY2hfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hc3NlbWJsZXIuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYXNzZW1ibGVyLmgKaW5kZXggZDUwMjVjNi4uMjhiZmU2MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hc3NlbWJsZXIuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Fzc2VtYmxlci5oCkBAIC04Nyw2ICs4NywxNSBAQAogCS5lbmRtCiAKIC8qCisgKiBOT1Agc2VxdWVuY2UKKyAqLworCS5tYWNybwlub3BzLCBudW0KKwkucmVwdAlcbnVtCisJbm9wCisJLmVuZHIKKwkuZW5kbQorCisvKgogICogRW1pdCBhbiBlbnRyeSBpbnRvIHRoZSBleGNlcHRpb24gdGFibGUKICAqLwogCS5tYWNybwkJX2FzbV9leHRhYmxlLCBmcm9tLCB0bwpAQCAtMjE2LDExICsyMjUsMjYgQEAKIAkubWFjcm8JbW1pZCwgcmQsIHJuCiAJbGRyCVxyZCwgW1xybiwgI01NX0NPTlRFWFRfSURdCiAJLmVuZG0KKy8qCisgKiByZWFkX2N0ciAtIHJlYWQgQ1RSX0VMMC4gSWYgdGhlIHN5c3RlbSBoYXMgbWlzbWF0Y2hlZAorICogY2FjaGUgbGluZSBzaXplcywgcHJvdmlkZSB0aGUgc3lzdGVtIHdpZGUgc2FmZSB2YWx1ZQorICogZnJvbSBhcm02NF9mdHJfcmVnX2N0cmVsMC5zeXNfdmFsCisgKi8KKwkubWFjcm8JcmVhZF9jdHIsIHJlZworYWx0ZXJuYXRpdmVfaWZfbm90IEFSTTY0X01JU01BVENIRURfQ0FDSEVfTElORV9TSVpFCisJbXJzCVxyZWcsIGN0cl9lbDAJCQkvLyByZWFkIENUUgorCW5vcAorYWx0ZXJuYXRpdmVfZWxzZQorCWxkcl9sCVxyZWcsIGFybTY0X2Z0cl9yZWdfY3RyZWwwICsgQVJNNjRfRlRSX1NZU1ZBTAorYWx0ZXJuYXRpdmVfZW5kaWYKKwkuZW5kbQorCiAKIC8qCi0gKiBkY2FjaGVfbGluZV9zaXplIC0gZ2V0IHRoZSBtaW5pbXVtIEQtY2FjaGUgbGluZSBzaXplIGZyb20gdGhlIENUUiByZWdpc3Rlci4KKyAqIHJhd19kY2FjaGVfbGluZV9zaXplIC0gZ2V0IHRoZSBtaW5pbXVtIEQtY2FjaGUgbGluZSBzaXplIG9uIHRoaXMgQ1BVCisgKiBmcm9tIHRoZSBDVFIgcmVnaXN0ZXIuCiAgKi8KLQkubWFjcm8JZGNhY2hlX2xpbmVfc2l6ZSwgcmVnLCB0bXAKKwkubWFjcm8JcmF3X2RjYWNoZV9saW5lX3NpemUsIHJlZywgdG1wCiAJbXJzCVx0bXAsIGN0cl9lbDAJCQkvLyByZWFkIENUUgogCXViZm0JXHRtcCwgXHRtcCwgIzE2LCAjMTkJCS8vIGNhY2hlIGxpbmUgc2l6ZSBlbmNvZGluZwogCW1vdglccmVnLCAjNAkJCS8vIGJ5dGVzIHBlciB3b3JkCkBAIC0yMjgsOSArMjUyLDIwIEBACiAJLmVuZG0KIAogLyoKLSAqIGljYWNoZV9saW5lX3NpemUgLSBnZXQgdGhlIG1pbmltdW0gSS1jYWNoZSBsaW5lIHNpemUgZnJvbSB0aGUgQ1RSIHJlZ2lzdGVyLgorICogZGNhY2hlX2xpbmVfc2l6ZSAtIGdldCB0aGUgc2FmZSBELWNhY2hlIGxpbmUgc2l6ZSBhY3Jvc3MgYWxsIENQVXMKICAqLwotCS5tYWNybwlpY2FjaGVfbGluZV9zaXplLCByZWcsIHRtcAorCS5tYWNybwlkY2FjaGVfbGluZV9zaXplLCByZWcsIHRtcAorCXJlYWRfY3RyCVx0bXAKKwl1YmZtCQlcdG1wLCBcdG1wLCAjMTYsICMxOQkvLyBjYWNoZSBsaW5lIHNpemUgZW5jb2RpbmcKKwltb3YJCVxyZWcsICM0CQkvLyBieXRlcyBwZXIgd29yZAorCWxzbAkJXHJlZywgXHJlZywgXHRtcAkvLyBhY3R1YWwgY2FjaGUgbGluZSBzaXplCisJLmVuZG0KKworLyoKKyAqIHJhd19pY2FjaGVfbGluZV9zaXplIC0gZ2V0IHRoZSBtaW5pbXVtIEktY2FjaGUgbGluZSBzaXplIG9uIHRoaXMgQ1BVCisgKiBmcm9tIHRoZSBDVFIgcmVnaXN0ZXIuCisgKi8KKwkubWFjcm8JcmF3X2ljYWNoZV9saW5lX3NpemUsIHJlZywgdG1wCiAJbXJzCVx0bXAsIGN0cl9lbDAJCQkvLyByZWFkIENUUgogCWFuZAlcdG1wLCBcdG1wLCAjMHhmCQkvLyBjYWNoZSBsaW5lIHNpemUgZW5jb2RpbmcKIAltb3YJXHJlZywgIzQJCQkvLyBieXRlcyBwZXIgd29yZApAQCAtMjM4LDYgKzI3MywxNiBAQAogCS5lbmRtCiAKIC8qCisgKiBpY2FjaGVfbGluZV9zaXplIC0gZ2V0IHRoZSBzYWZlIEktY2FjaGUgbGluZSBzaXplIGFjcm9zcyBhbGwgQ1BVcworICovCisJLm1hY3JvCWljYWNoZV9saW5lX3NpemUsIHJlZywgdG1wCisJcmVhZF9jdHIJXHRtcAorCWFuZAkJXHRtcCwgXHRtcCwgIzB4ZgkvLyBjYWNoZSBsaW5lIHNpemUgZW5jb2RpbmcKKwltb3YJCVxyZWcsICM0CQkvLyBieXRlcyBwZXIgd29yZAorCWxzbAkJXHJlZywgXHJlZywgXHRtcAkvLyBhY3R1YWwgY2FjaGUgbGluZSBzaXplCisJLmVuZG0KKworLyoKICAqIHRjcl9zZXRfaWRtYXBfdDBzeiAtIHVwZGF0ZSBUQ1IuVDBTWiBzbyB0aGF0IHdlIGNhbiBsb2FkIHRoZSBJRCBtYXAKICAqLwogCS5tYWNybwl0Y3Jfc2V0X2lkbWFwX3Qwc3osIHZhbHJlZywgdG1wcmVnCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2F0b21pY19sc2UuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYXRvbWljX2xzZS5oCmluZGV4IGI1ODkwYmUuLjc0NTdjZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYXRvbWljX2xzZS5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYXRvbWljX2xzZS5oCkBAIC04Niw4ICs4Niw4IEBACiAJCQkJCQkJCQlcCiAJYXNtIHZvbGF0aWxlKEFSTTY0X0xTRV9BVE9NSUNfSU5TTigJCQkJXAogCS8qIExML1NDICovCQkJCQkJCVwKLQkiCW5vcFxuIgkJCQkJCQlcCi0JX19MTF9TQ19BVE9NSUMoYWRkX3JldHVybiMjbmFtZSksCQkJCVwKKwlfX0xMX1NDX0FUT01JQyhhZGRfcmV0dXJuIyNuYW1lKQkJCQlcCisJX19ub3BzKDEpLAkJCQkJCQlcCiAJLyogTFNFIGF0b21pY3MgKi8JCQkJCQlcCiAJIglsZGFkZCIgI21iICIJJXdbaV0sIHczMCwgJVt2XVxuIgkJCVwKIAkiCWFkZAkld1tpXSwgJXdbaV0sIHczMCIpCQkJCVwKQEAgLTExMiw4ICsxMTIsOCBAQAogCiAJYXNtIHZvbGF0aWxlKEFSTTY0X0xTRV9BVE9NSUNfSU5TTigKIAkvKiBMTC9TQyAqLwotCSIJbm9wXG4iCi0JX19MTF9TQ19BVE9NSUMoYW5kKSwKKwlfX0xMX1NDX0FUT01JQyhhbmQpCisJX19ub3BzKDEpLAogCS8qIExTRSBhdG9taWNzICovCiAJIgltdm4JJXdbaV0sICV3W2ldXG4iCiAJIglzdGNscgkld1tpXSwgJVt2XSIpCkBAIC0xMzAsOCArMTMwLDggQEAKIAkJCQkJCQkJCVwKIAlhc20gdm9sYXRpbGUoQVJNNjRfTFNFX0FUT01JQ19JTlNOKAkJCQlcCiAJLyogTEwvU0MgKi8JCQkJCQkJXAotCSIJbm9wXG4iCQkJCQkJCVwKLQlfX0xMX1NDX0FUT01JQyhmZXRjaF9hbmQjI25hbWUpLAkJCQlcCisJX19MTF9TQ19BVE9NSUMoZmV0Y2hfYW5kIyNuYW1lKQkJCQkJXAorCV9fbm9wcygxKSwJCQkJCQkJXAogCS8qIExTRSBhdG9taWNzICovCQkJCQkJXAogCSIJbXZuCSV3W2ldLCAld1tpXVxuIgkJCQkJXAogCSIJbGRjbHIiICNtYiAiCSV3W2ldLCAld1tpXSwgJVt2XSIpCQkJXApAQCAtMTU2LDggKzE1Niw4IEBACiAKIAlhc20gdm9sYXRpbGUoQVJNNjRfTFNFX0FUT01JQ19JTlNOKAogCS8qIExML1NDICovCi0JIglub3BcbiIKLQlfX0xMX1NDX0FUT01JQyhzdWIpLAorCV9fTExfU0NfQVRPTUlDKHN1YikKKwlfX25vcHMoMSksCiAJLyogTFNFIGF0b21pY3MgKi8KIAkiCW5lZwkld1tpXSwgJXdbaV1cbiIKIAkiCXN0YWRkCSV3W2ldLCAlW3ZdIikKQEAgLTE3NCw5ICsxNzQsOCBAQAogCQkJCQkJCQkJXAogCWFzbSB2b2xhdGlsZShBUk02NF9MU0VfQVRPTUlDX0lOU04oCQkJCVwKIAkvKiBMTC9TQyAqLwkJCQkJCQlcCi0JIglub3BcbiIJCQkJCQkJXAogCV9fTExfU0NfQVRPTUlDKHN1Yl9yZXR1cm4jI25hbWUpCQkJCVwKLQkiCW5vcCIsCQkJCQkJCVwKKwlfX25vcHMoMiksCQkJCQkJCVwKIAkvKiBMU0UgYXRvbWljcyAqLwkJCQkJCVwKIAkiCW5lZwkld1tpXSwgJXdbaV1cbiIJCQkJCVwKIAkiCWxkYWRkIiAjbWIgIgkld1tpXSwgdzMwLCAlW3ZdXG4iCQkJXApAQCAtMjAzLDggKzIwMiw4IEBACiAJCQkJCQkJCQlcCiAJYXNtIHZvbGF0aWxlKEFSTTY0X0xTRV9BVE9NSUNfSU5TTigJCQkJXAogCS8qIExML1NDICovCQkJCQkJCVwKLQkiCW5vcFxuIgkJCQkJCQlcCi0JX19MTF9TQ19BVE9NSUMoZmV0Y2hfc3ViIyNuYW1lKSwJCQkJXAorCV9fTExfU0NfQVRPTUlDKGZldGNoX3N1YiMjbmFtZSkJCQkJCVwKKwlfX25vcHMoMSksCQkJCQkJCVwKIAkvKiBMU0UgYXRvbWljcyAqLwkJCQkJCVwKIAkiCW5lZwkld1tpXSwgJXdbaV1cbiIJCQkJCVwKIAkiCWxkYWRkIiAjbWIgIgkld1tpXSwgJXdbaV0sICVbdl0iKQkJCVwKQEAgLTI4NCw4ICsyODMsOCBAQAogCQkJCQkJCQkJXAogCWFzbSB2b2xhdGlsZShBUk02NF9MU0VfQVRPTUlDX0lOU04oCQkJCVwKIAkvKiBMTC9TQyAqLwkJCQkJCQlcCi0JIglub3BcbiIJCQkJCQkJXAotCV9fTExfU0NfQVRPTUlDNjQoYWRkX3JldHVybiMjbmFtZSksCQkJCVwKKwlfX0xMX1NDX0FUT01JQzY0KGFkZF9yZXR1cm4jI25hbWUpCQkJCVwKKwlfX25vcHMoMSksCQkJCQkJCVwKIAkvKiBMU0UgYXRvbWljcyAqLwkJCQkJCVwKIAkiCWxkYWRkIiAjbWIgIgklW2ldLCB4MzAsICVbdl1cbiIJCQlcCiAJIglhZGQJJVtpXSwgJVtpXSwgeDMwIikJCQkJXApAQCAtMzEwLDggKzMwOSw4IEBACiAKIAlhc20gdm9sYXRpbGUoQVJNNjRfTFNFX0FUT01JQ19JTlNOKAogCS8qIExML1NDICovCi0JIglub3BcbiIKLQlfX0xMX1NDX0FUT01JQzY0KGFuZCksCisJX19MTF9TQ19BVE9NSUM2NChhbmQpCisJX19ub3BzKDEpLAogCS8qIExTRSBhdG9taWNzICovCiAJIgltdm4JJVtpXSwgJVtpXVxuIgogCSIJc3RjbHIJJVtpXSwgJVt2XSIpCkBAIC0zMjgsOCArMzI3LDggQEAKIAkJCQkJCQkJCVwKIAlhc20gdm9sYXRpbGUoQVJNNjRfTFNFX0FUT01JQ19JTlNOKAkJCQlcCiAJLyogTEwvU0MgKi8JCQkJCQkJXAotCSIJbm9wXG4iCQkJCQkJCVwKLQlfX0xMX1NDX0FUT01JQzY0KGZldGNoX2FuZCMjbmFtZSksCQkJCVwKKwlfX0xMX1NDX0FUT01JQzY0KGZldGNoX2FuZCMjbmFtZSkJCQkJXAorCV9fbm9wcygxKSwJCQkJCQkJXAogCS8qIExTRSBhdG9taWNzICovCQkJCQkJXAogCSIJbXZuCSVbaV0sICVbaV1cbiIJCQkJCVwKIAkiCWxkY2xyIiAjbWIgIgklW2ldLCAlW2ldLCAlW3ZdIikJCQlcCkBAIC0zNTQsOCArMzUzLDggQEAKIAogCWFzbSB2b2xhdGlsZShBUk02NF9MU0VfQVRPTUlDX0lOU04oCiAJLyogTEwvU0MgKi8KLQkiCW5vcFxuIgotCV9fTExfU0NfQVRPTUlDNjQoc3ViKSwKKwlfX0xMX1NDX0FUT01JQzY0KHN1YikKKwlfX25vcHMoMSksCiAJLyogTFNFIGF0b21pY3MgKi8KIAkiCW5lZwklW2ldLCAlW2ldXG4iCiAJIglzdGFkZAklW2ldLCAlW3ZdIikKQEAgLTM3Miw5ICszNzEsOCBAQAogCQkJCQkJCQkJXAogCWFzbSB2b2xhdGlsZShBUk02NF9MU0VfQVRPTUlDX0lOU04oCQkJCVwKIAkvKiBMTC9TQyAqLwkJCQkJCQlcCi0JIglub3BcbiIJCQkJCQkJXAogCV9fTExfU0NfQVRPTUlDNjQoc3ViX3JldHVybiMjbmFtZSkJCQkJXAotCSIJbm9wIiwJCQkJCQkJXAorCV9fbm9wcygyKSwJCQkJCQkJXAogCS8qIExTRSBhdG9taWNzICovCQkJCQkJXAogCSIJbmVnCSVbaV0sICVbaV1cbiIJCQkJCVwKIAkiCWxkYWRkIiAjbWIgIgklW2ldLCB4MzAsICVbdl1cbiIJCQlcCkBAIC00MDEsOCArMzk5LDggQEAKIAkJCQkJCQkJCVwKIAlhc20gdm9sYXRpbGUoQVJNNjRfTFNFX0FUT01JQ19JTlNOKAkJCQlcCiAJLyogTEwvU0MgKi8JCQkJCQkJXAotCSIJbm9wXG4iCQkJCQkJCVwKLQlfX0xMX1NDX0FUT01JQzY0KGZldGNoX3N1YiMjbmFtZSksCQkJCVwKKwlfX0xMX1NDX0FUT01JQzY0KGZldGNoX3N1YiMjbmFtZSkJCQkJXAorCV9fbm9wcygxKSwJCQkJCQkJXAogCS8qIExTRSBhdG9taWNzICovCQkJCQkJXAogCSIJbmVnCSVbaV0sICVbaV1cbiIJCQkJCVwKIAkiCWxkYWRkIiAjbWIgIgklW2ldLCAlW2ldLCAlW3ZdIikJCQlcCkBAIC00MjYsMTMgKzQyNCw4IEBACiAKIAlhc20gdm9sYXRpbGUoQVJNNjRfTFNFX0FUT01JQ19JTlNOKAogCS8qIExML1NDICovCi0JIglub3BcbiIKIAlfX0xMX1NDX0FUT01JQzY0KGRlY19pZl9wb3NpdGl2ZSkKLQkiCW5vcFxuIgotCSIJbm9wXG4iCi0JIglub3BcbiIKLQkiCW5vcFxuIgotCSIJbm9wIiwKKwlfX25vcHMoNiksCiAJLyogTFNFIGF0b21pY3MgKi8KIAkiMToJbGRyCXgzMCwgJVt2XVxuIgogCSIJc3VicwklW3JldF0sIHgzMCwgIzFcbiIKQEAgLTQ2NCw5ICs0NTcsOCBAQAogCQkJCQkJCQkJXAogCWFzbSB2b2xhdGlsZShBUk02NF9MU0VfQVRPTUlDX0lOU04oCQkJCVwKIAkvKiBMTC9TQyAqLwkJCQkJCQlcCi0JIglub3BcbiIJCQkJCQkJXAotCQlfX0xMX1NDX0NNUFhDSEcobmFtZSkJCQkJCVwKLQkiCW5vcCIsCQkJCQkJCVwKKwlfX0xMX1NDX0NNUFhDSEcobmFtZSkJCQkJCQlcCisJX19ub3BzKDIpLAkJCQkJCQlcCiAJLyogTFNFIGF0b21pY3MgKi8JCQkJCQlcCiAJIgltb3YJIiAjdyAiMzAsICUiICN3ICJbb2xkXVxuIgkJCVwKIAkiCWNhcyIgI21iICNzeiAiXHQiICN3ICIzMCwgJSIgI3cgIltuZXddLCAlW3ZdXG4iCQlcCkBAIC01MTcsMTAgKzUwOSw4IEBACiAJCQkJCQkJCQlcCiAJYXNtIHZvbGF0aWxlKEFSTTY0X0xTRV9BVE9NSUNfSU5TTigJCQkJXAogCS8qIExML1NDICovCQkJCQkJCVwKLQkiCW5vcFxuIgkJCQkJCQlcCi0JIglub3BcbiIJCQkJCQkJXAotCSIJbm9wXG4iCQkJCQkJCVwKLQlfX0xMX1NDX0NNUFhDSEdfREJMKG5hbWUpLAkJCQkJXAorCV9fTExfU0NfQ01QWENIR19EQkwobmFtZSkJCQkJCVwKKwlfX25vcHMoMyksCQkJCQkJCVwKIAkvKiBMU0UgYXRvbWljcyAqLwkJCQkJCVwKIAkiCWNhc3AiICNtYiAiXHQlW29sZDFdLCAlW29sZDJdLCAlW25ldzFdLCAlW25ldzJdLCAlW3ZdXG4iXAogCSIJZW9yCSVbb2xkMV0sICVbb2xkMV0sICVbb2xkdmFsMV1cbiIJCQlcCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2JhcnJpZXIuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYmFycmllci5oCmluZGV4IDRlZWE3ZjYuLjRlMDQ5N2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYmFycmllci5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYmFycmllci5oCkBAIC0yMCw2ICsyMCw5IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKKyNkZWZpbmUgX19ub3BzKG4pCSIucmVwdAkiICNuICJcbm5vcFxuLmVuZHJcbiIKKyNkZWZpbmUgbm9wcyhuKQkJYXNtIHZvbGF0aWxlKF9fbm9wcyhuKSkKKwogI2RlZmluZSBzZXYoKQkJYXNtIHZvbGF0aWxlKCJzZXYiIDogOiA6ICJtZW1vcnkiKQogI2RlZmluZSB3ZmUoKQkJYXNtIHZvbGF0aWxlKCJ3ZmUiIDogOiA6ICJtZW1vcnkiKQogI2RlZmluZSB3ZmkoKQkJYXNtIHZvbGF0aWxlKCJ3ZmkiIDogOiA6ICJtZW1vcnkiKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaAppbmRleCBjNjQyNjhkLi4yZTVmYjk3IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaApAQCAtNjgsNiArNjgsNyBAQAogZXh0ZXJuIHZvaWQgZmx1c2hfY2FjaGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKIGV4dGVybiB2b2lkIGZsdXNoX2ljYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CiBleHRlcm4gdm9pZCBfX2ZsdXNoX2RjYWNoZV9hcmVhKHZvaWQgKmFkZHIsIHNpemVfdCBsZW4pOworZXh0ZXJuIHZvaWQgX19jbGVhbl9kY2FjaGVfYXJlYV9wb2Modm9pZCAqYWRkciwgc2l6ZV90IGxlbik7CiBleHRlcm4gdm9pZCBfX2NsZWFuX2RjYWNoZV9hcmVhX3BvdSh2b2lkICphZGRyLCBzaXplX3QgbGVuKTsKIGV4dGVybiBsb25nIF9fZmx1c2hfY2FjaGVfdXNlcl9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CiAKQEAgLTg1LDcgKzg2LDcgQEAKICAqLwogZXh0ZXJuIHZvaWQgX19kbWFfbWFwX2FyZWEoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7CiBleHRlcm4gdm9pZCBfX2RtYV91bm1hcF9hcmVhKGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBpbnQpOwotZXh0ZXJuIHZvaWQgX19kbWFfZmx1c2hfcmFuZ2UoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOworZXh0ZXJuIHZvaWQgX19kbWFfZmx1c2hfYXJlYShjb25zdCB2b2lkICosIHNpemVfdCk7CiAKIC8qCiAgKiBDb3B5IHVzZXIgZGF0YSBmcm9tL3RvIGEgcGFnZSB3aGljaCBpcyBtYXBwZWQgaW50byBhIGRpZmZlcmVudApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jbG9ja3NvdXJjZS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jbG9ja3NvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzUwYTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Nsb2Nrc291cmNlLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9BU01fQ0xPQ0tTT1VSQ0VfSAorI2RlZmluZSBfQVNNX0NMT0NLU09VUkNFX0gKKworc3RydWN0IGFyY2hfY2xvY2tzb3VyY2VfZGF0YSB7CisJYm9vbCB2ZHNvX2RpcmVjdDsJLyogVXNhYmxlIGZvciBkaXJlY3QgVkRTTyBhY2Nlc3M/ICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY21weGNoZy5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jbXB4Y2hnLmgKaW5kZXggYmQ4NmE3OS4uOTFiMjZkMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jbXB4Y2hnLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jbXB4Y2hnLmgKQEAgLTQzLDEwICs0Myw4IEBACiAJIgljYm56CSV3MSwgMWJcbiIJCQkJCVwKIAkiCSIgI21iLAkJCQkJCQlcCiAJLyogTFNFIGF0b21pY3MgKi8JCQkJCQlcCi0JIglub3BcbiIJCQkJCQkJXAotCSIJbm9wXG4iCQkJCQkJCVwKIAkiCXN3cCIgI2FjcV9sc2UgI3JlbCAjc3ogIlx0JSIgI3cgIjMsICUiICN3ICIwLCAlMlxuIglcCi0JIglub3BcbiIJCQkJCQkJXAorCQlfX25vcHMoMykJCQkJCQlcCiAJIgkiICNub3BfbHNlKQkJCQkJCVwKIAk6ICI9JnIiIChyZXQpLCAiPSZyIiAodG1wKSwgIitRIiAoKih1OCAqKXB0cikJCQlcCiAJOiAiciIgKHgpCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKaW5kZXggNzA5OWYyNi4uNzU4ZDc0ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKQEAgLTksNiArOSw4IEBACiAjaWZuZGVmIF9fQVNNX0NQVUZFQVRVUkVfSAogI2RlZmluZSBfX0FTTV9DUFVGRUFUVVJFX0gKIAorI2luY2x1ZGUgPGxpbnV4L2p1bXBfbGFiZWwuaD4KKwogI2luY2x1ZGUgPGFzbS9od2NhcC5oPgogI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KIApAQCAtMzcsOCArMzksOSBAQAogI2RlZmluZSBBUk02NF9XT1JLQVJPVU5EX0NBVklVTV8yNzQ1NgkJMTIKICNkZWZpbmUgQVJNNjRfSEFTXzMyQklUX0VMMAkJCTEzCiAjZGVmaW5lIEFSTTY0X0hZUF9PRkZTRVRfTE9XCQkJMTQKKyNkZWZpbmUgQVJNNjRfTUlTTUFUQ0hFRF9DQUNIRV9MSU5FX1NJWkUJMTUKIAotI2RlZmluZSBBUk02NF9OQ0FQUwkJCQkxNQorI2RlZmluZSBBUk02NF9OQ0FQUwkJCQkxNgogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCkBAIC02Myw3ICs2Niw3IEBACiAJZW51bSBmdHJfdHlwZQl0eXBlOwogCXU4CQlzaGlmdDsKIAl1OAkJd2lkdGg7Ci0JczY0CQlzYWZlX3ZhbDsgLyogc2FmZSB2YWx1ZSBmb3IgZGlzY3JldGUgZmVhdHVyZXMgKi8KKwlzNjQJCXNhZmVfdmFsOyAvKiBzYWZlIHZhbHVlIGZvciBGVFJfRVhBQ1QgZmVhdHVyZXMgKi8KIH07CiAKIC8qCkBAIC03MiwxMyArNzUsMTQgQEAKICAqIEBzeXNfdmFsCQlTYWZlIHZhbHVlIGFjcm9zcyB0aGUgQ1BVcyAoc3lzdGVtIHZpZXcpCiAgKi8KIHN0cnVjdCBhcm02NF9mdHJfcmVnIHsKLQl1MzIJCQlzeXNfaWQ7Ci0JY29uc3QgY2hhcgkJKm5hbWU7Ci0JdTY0CQkJc3RyaWN0X21hc2s7Ci0JdTY0CQkJc3lzX3ZhbDsKLQlzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMJKmZ0cl9iaXRzOworCWNvbnN0IGNoYXIJCQkqbmFtZTsKKwl1NjQJCQkJc3RyaWN0X21hc2s7CisJdTY0CQkJCXN5c192YWw7CisJY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzCSpmdHJfYml0czsKIH07CiAKK2V4dGVybiBzdHJ1Y3QgYXJtNjRfZnRyX3JlZyBhcm02NF9mdHJfcmVnX2N0cmVsMDsKKwogLyogc2NvcGUgb2YgY2FwYWJpbGl0eSBjaGVjayAqLwogZW51bSB7CiAJU0NPUEVfU1lTVEVNLApAQCAtMTA5LDYgKzExMyw3IEBACiB9OwogCiBleHRlcm4gREVDTEFSRV9CSVRNQVAoY3B1X2h3Y2FwcywgQVJNNjRfTkNBUFMpOworZXh0ZXJuIHN0cnVjdCBzdGF0aWNfa2V5X2ZhbHNlIGNwdV9od2NhcF9rZXlzW0FSTTY0X05DQVBTXTsKIAogYm9vbCB0aGlzX2NwdV9oYXNfY2FwKHVuc2lnbmVkIGludCBjYXApOwogCkBAIC0xMjEsMTYgKzEyNiwyMSBAQAogewogCWlmIChudW0gPj0gQVJNNjRfTkNBUFMpCiAJCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gdGVzdF9iaXQobnVtLCBjcHVfaHdjYXBzKTsKKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3AobnVtKSkKKwkJcmV0dXJuIHN0YXRpY19icmFuY2hfdW5saWtlbHkoJmNwdV9od2NhcF9rZXlzW251bV0pOworCWVsc2UKKwkJcmV0dXJuIHRlc3RfYml0KG51bSwgY3B1X2h3Y2Fwcyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjcHVzX3NldF9jYXAodW5zaWduZWQgaW50IG51bSkKIHsKLQlpZiAobnVtID49IEFSTTY0X05DQVBTKQorCWlmIChudW0gPj0gQVJNNjRfTkNBUFMpIHsKIAkJcHJfd2FybigiQXR0ZW1wdCB0byBzZXQgYW4gaWxsZWdhbCBDUFUgY2FwYWJpbGl0eSAoJWQgPj0gJWQpXG4iLAogCQkJbnVtLCBBUk02NF9OQ0FQUyk7Ci0JZWxzZQorCX0gZWxzZSB7CiAJCV9fc2V0X2JpdChudW0sIGNwdV9od2NhcHMpOworCQlzdGF0aWNfYnJhbmNoX2VuYWJsZSgmY3B1X2h3Y2FwX2tleXNbbnVtXSk7CisJfQogfQogCiBzdGF0aWMgaW5saW5lIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fCkBAIC0xNTcsNyArMTY3LDcgQEAKIAlyZXR1cm4gY3B1aWRfZmVhdHVyZV9leHRyYWN0X3Vuc2lnbmVkX2ZpZWxkX3dpZHRoKGZlYXR1cmVzLCBmaWVsZCwgNCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTY0IGFybTY0X2Z0cl9tYXNrKHN0cnVjdCBhcm02NF9mdHJfYml0cyAqZnRycCkKK3N0YXRpYyBpbmxpbmUgdTY0IGFybTY0X2Z0cl9tYXNrKGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyAqZnRycCkKIHsKIAlyZXR1cm4gKHU2NClHRU5NQVNLKGZ0cnAtPnNoaWZ0ICsgZnRycC0+d2lkdGggLSAxLCBmdHJwLT5zaGlmdCk7CiB9CkBAIC0xNzAsNyArMTgwLDcgQEAKIAkJY3B1aWRfZmVhdHVyZV9leHRyYWN0X3Vuc2lnbmVkX2ZpZWxkKGZlYXR1cmVzLCBmaWVsZCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgczY0IGFybTY0X2Z0cl92YWx1ZShzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgKmZ0cnAsIHU2NCB2YWwpCitzdGF0aWMgaW5saW5lIHM2NCBhcm02NF9mdHJfdmFsdWUoY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzICpmdHJwLCB1NjQgdmFsKQogewogCXJldHVybiAoczY0KWNwdWlkX2ZlYXR1cmVfZXh0cmFjdF9maWVsZCh2YWwsIGZ0cnAtPnNoaWZ0LCBmdHJwLT5zaWduKTsKIH0KQEAgLTE5MywxMSArMjAzLDExIEBACiB2b2lkIHVwZGF0ZV9jcHVfY2FwYWJpbGl0aWVzKGNvbnN0IHN0cnVjdCBhcm02NF9jcHVfY2FwYWJpbGl0aWVzICpjYXBzLAogCQkJICAgIGNvbnN0IGNoYXIgKmluZm8pOwogdm9pZCBlbmFibGVfY3B1X2NhcGFiaWxpdGllcyhjb25zdCBzdHJ1Y3QgYXJtNjRfY3B1X2NhcGFiaWxpdGllcyAqY2Fwcyk7Ci12b2lkIGNoZWNrX2xvY2FsX2NwdV9lcnJhdGEodm9pZCk7Ci12b2lkIF9faW5pdCBlbmFibGVfZXJyYXRhX3dvcmthcm91bmRzKHZvaWQpOwordm9pZCBjaGVja19sb2NhbF9jcHVfY2FwYWJpbGl0aWVzKHZvaWQpOwogCi12b2lkIHZlcmlmeV9sb2NhbF9jcHVfZXJyYXRhKHZvaWQpOwotdm9pZCB2ZXJpZnlfbG9jYWxfY3B1X2NhcGFiaWxpdGllcyh2b2lkKTsKK3ZvaWQgdXBkYXRlX2NwdV9lcnJhdGFfd29ya2Fyb3VuZHModm9pZCk7Cit2b2lkIF9faW5pdCBlbmFibGVfZXJyYXRhX3dvcmthcm91bmRzKHZvaWQpOwordm9pZCB2ZXJpZnlfbG9jYWxfY3B1X2VycmF0YV93b3JrYXJvdW5kcyh2b2lkKTsKIAogdTY0IHJlYWRfc3lzdGVtX3JlZyh1MzIgaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NwdXR5cGUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY3B1dHlwZS5oCmluZGV4IDlkOWZkNGIuLjI2YTY4ZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY3B1dHlwZS5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY3B1dHlwZS5oCkBAIC05MywxMSArOTMsNyBAQAogCiAjaW5jbHVkZSA8YXNtL3N5c3JlZy5oPgogCi0jZGVmaW5lIHJlYWRfY3B1aWQocmVnKSAoewkJCQkJCVwKLQl1NjQgX192YWw7CQkJCQkJCVwKLQlhc20oIm1yc19zCSUwLCAiIF9fc3RyaW5naWZ5KFNZU18gIyMgcmVnKSA6ICI9ciIgKF9fdmFsKSk7CVwKLQlfX3ZhbDsJCQkJCQkJCVwKLX0pCisjZGVmaW5lIHJlYWRfY3B1aWQocmVnKQkJCXJlYWRfc3lzcmVnX3MoU1lTXyAjIyByZWcpCiAKIC8qCiAgKiBUaGUgQ1BVIElEIG5ldmVyIGNoYW5nZXMgYXQgcnVuIHRpbWUsIHNvIHdlIG1pZ2h0IGFzIHdlbGwgdGVsbCB0aGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZGNjLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RjYy5oCmluZGV4IDY1ZTAxOTAuLjgzNmIwNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZGNjLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9kY2MuaApAQCAtMjEsMjEgKzIxLDE2IEBACiAjZGVmaW5lIF9fQVNNX0RDQ19ICiAKICNpbmNsdWRlIDxhc20vYmFycmllci5oPgorI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KIAogc3RhdGljIGlubGluZSB1MzIgX19kY2NfZ2V0c3RhdHVzKHZvaWQpCiB7Ci0JdTMyIHJldDsKLQotCWFzbSB2b2xhdGlsZSgibXJzICUwLCBtZGNjc3JfZWwwIiA6ICI9ciIgKHJldCkpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcmVhZF9zeXNyZWcobWRjY3NyX2VsMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgY2hhciBfX2RjY19nZXRjaGFyKHZvaWQpCiB7Ci0JY2hhciBjOwotCi0JYXNtIHZvbGF0aWxlKCJtcnMgJTAsIGRiZ2R0cnJ4X2VsMCIgOiAiPXIiIChjKSk7CisJY2hhciBjID0gcmVhZF9zeXNyZWcoZGJnZHRycnhfZWwwKTsKIAlpc2IoKTsKIAogCXJldHVybiBjOwpAQCAtNDcsOCArNDIsNyBAQAogCSAqIFRoZSB0eXBlY2FzdCBpcyB0byBtYWtlIGFic29sdXRlbHkgY2VydGFpbiB0aGF0ICdjJyBpcwogCSAqIHplcm8tZXh0ZW5kZWQuCiAJICovCi0JYXNtIHZvbGF0aWxlKCJtc3IgZGJnZHRydHhfZWwwLCAlMCIKLQkJCTogOiAiciIgKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBjaGFyKWMpKTsKKwl3cml0ZV9zeXNyZWcoKHVuc2lnbmVkIGNoYXIpYywgZGJnZHRydHhfZWwwKTsKIAlpc2IoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9kZWJ1Zy1tb25pdG9ycy5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9kZWJ1Zy1tb25pdG9ycy5oCmluZGV4IDRiNmIzZjcuLmI3MTQyMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZGVidWctbW9uaXRvcnMuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RlYnVnLW1vbml0b3JzLmgKQEAgLTYxLDggKzYxLDYgQEAKIAogI2RlZmluZSBBQVJDSDY0X0JSRUFLX0tHREJfRFlOX0RCRwlcCiAJKEFBUkNINjRfQlJFQUtfTU9OIHwgKEtHREJfRFlOX0RCR19CUktfSU1NIDw8IDUpKQotI2RlZmluZSBLR0RCX0RZTl9CUktfSU5TX0JZVEUoeCkJXAotCSgoQUFSQ0g2NF9CUkVBS19LR0RCX0RZTl9EQkcgPj4gKDggKiAoeCkpKSAmIDB4ZmYpCiAKICNkZWZpbmUgQ0FDSEVfRkxVU0hfSVNfU0FGRQkJMQogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lc3IuaAppbmRleCBmNzcyZTE1Li5kMTRjNDc4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmgKQEAgLTc4LDYgKzc4LDIzIEBACiAKICNkZWZpbmUgRVNSX0VMeF9JTAkJKFVMKDEpIDw8IDI1KQogI2RlZmluZSBFU1JfRUx4X0lTU19NQVNLCShFU1JfRUx4X0lMIC0gMSkKKworLyogSVNTIGZpZWxkIGRlZmluaXRpb25zIHNoYXJlZCBieSBkaWZmZXJlbnQgY2xhc3NlcyAqLworI2RlZmluZSBFU1JfRUx4X1dOUgkJKFVMKDEpIDw8IDYpCisKKy8qIFNoYXJlZCBJU1MgZmllbGQgZGVmaW5pdGlvbnMgZm9yIERhdGEvSW5zdHJ1Y3Rpb24gYWJvcnRzICovCisjZGVmaW5lIEVTUl9FTHhfRUEJCShVTCgxKSA8PCA5KQorI2RlZmluZSBFU1JfRUx4X1MxUFRXCQkoVUwoMSkgPDwgNykKKworLyogU2hhcmVkIElTUyBmYXVsdCBzdGF0dXMgY29kZShJRlNDL0RGU0MpIGZvciBEYXRhL0luc3RydWN0aW9uIGFib3J0cyAqLworI2RlZmluZSBFU1JfRUx4X0ZTQwkJKDB4M0YpCisjZGVmaW5lIEVTUl9FTHhfRlNDX1RZUEUJKDB4M0MpCisjZGVmaW5lIEVTUl9FTHhfRlNDX0VYVEFCVAkoMHgxMCkKKyNkZWZpbmUgRVNSX0VMeF9GU0NfQUNDRVNTCSgweDA4KQorI2RlZmluZSBFU1JfRUx4X0ZTQ19GQVVMVAkoMHgwNCkKKyNkZWZpbmUgRVNSX0VMeF9GU0NfUEVSTQkoMHgwQykKKworLyogSVNTIGZpZWxkIGRlZmluaXRpb25zIGZvciBEYXRhIEFib3J0cyAqLwogI2RlZmluZSBFU1JfRUx4X0lTVgkJKFVMKDEpIDw8IDI0KQogI2RlZmluZSBFU1JfRUx4X1NBU19TSElGVAkoMjIpCiAjZGVmaW5lIEVTUl9FTHhfU0FTCQkoVUwoMykgPDwgRVNSX0VMeF9TQVNfU0hJRlQpCkBAIC04NiwxNiArMTAzLDkgQEAKICNkZWZpbmUgRVNSX0VMeF9TUlRfTUFTSwkoVUwoMHgxRikgPDwgRVNSX0VMeF9TUlRfU0hJRlQpCiAjZGVmaW5lIEVTUl9FTHhfU0YgCQkoVUwoMSkgPDwgMTUpCiAjZGVmaW5lIEVTUl9FTHhfQVIgCQkoVUwoMSkgPDwgMTQpCi0jZGVmaW5lIEVTUl9FTHhfRUEgCQkoVUwoMSkgPDwgOSkKICNkZWZpbmUgRVNSX0VMeF9DTSAJCShVTCgxKSA8PCA4KQotI2RlZmluZSBFU1JfRUx4X1MxUFRXIAkJKFVMKDEpIDw8IDcpCi0jZGVmaW5lIEVTUl9FTHhfV05SCQkoVUwoMSkgPDwgNikKLSNkZWZpbmUgRVNSX0VMeF9GU0MJCSgweDNGKQotI2RlZmluZSBFU1JfRUx4X0ZTQ19UWVBFCSgweDNDKQotI2RlZmluZSBFU1JfRUx4X0ZTQ19FWFRBQlQJKDB4MTApCi0jZGVmaW5lIEVTUl9FTHhfRlNDX0FDQ0VTUwkoMHgwOCkKLSNkZWZpbmUgRVNSX0VMeF9GU0NfRkFVTFQJKDB4MDQpCi0jZGVmaW5lIEVTUl9FTHhfRlNDX1BFUk0JKDB4MEMpCisKKy8qIElTUyBmaWVsZCBkZWZpbml0aW9ucyBmb3IgZXhjZXB0aW9ucyB0YWtlbiBpbiB0byBIeXAgKi8KICNkZWZpbmUgRVNSX0VMeF9DVgkJKFVMKDEpIDw8IDI0KQogI2RlZmluZSBFU1JfRUx4X0NPTkRfU0hJRlQJKDIwKQogI2RlZmluZSBFU1JfRUx4X0NPTkRfTUFTSwkoVUwoMHhGKSA8PCBFU1JfRUx4X0NPTkRfU0hJRlQpCkBAIC0xMDksNiArMTE5LDYyIEBACiAJKChFU1JfRUx4X0VDX0JSSzY0IDw8IEVTUl9FTHhfRUNfU0hJRlQpIHwgRVNSX0VMeF9JTCB8CVwKIAkgKChpbW0pICYgMHhmZmZmKSkKIAorLyogSVNTIGZpZWxkIGRlZmluaXRpb25zIGZvciBTeXN0ZW0gaW5zdHJ1Y3Rpb24gdHJhcHMgKi8KKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfUkVTMF9TSElGVAkyMgorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19SRVMwX01BU0sJKFVMKDB4NykgPDwgRVNSX0VMeF9TWVM2NF9JU1NfUkVTMF9TSElGVCkKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfRElSX01BU0sJMHgxCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX0RJUl9SRUFECTB4MQorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19ESVJfV1JJVEUJMHgwCisKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfUlRfU0hJRlQJNQorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19SVF9NQVNLCShVTCgweDFmKSA8PCBFU1JfRUx4X1NZUzY0X0lTU19SVF9TSElGVCkKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfQ1JNX1NISUZUCTEKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfQ1JNX01BU0sJKFVMKDB4ZikgPDwgRVNSX0VMeF9TWVM2NF9JU1NfQ1JNX1NISUZUKQorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19DUk5fU0hJRlQJMTAKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfQ1JOX01BU0sJKFVMKDB4ZikgPDwgRVNSX0VMeF9TWVM2NF9JU1NfQ1JOX1NISUZUKQorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19PUDFfU0hJRlQJMTQKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfT1AxX01BU0sJKFVMKDB4NykgPDwgRVNSX0VMeF9TWVM2NF9JU1NfT1AxX1NISUZUKQorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19PUDJfU0hJRlQJMTcKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfT1AyX01BU0sJKFVMKDB4NykgPDwgRVNSX0VMeF9TWVM2NF9JU1NfT1AyX1NISUZUKQorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19PUDBfU0hJRlQJMjAKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfT1AwX01BU0sJKFVMKDB4MykgPDwgRVNSX0VMeF9TWVM2NF9JU1NfT1AwX1NISUZUKQorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19TWVNfTUFTSwkoRVNSX0VMeF9TWVM2NF9JU1NfT1AwX01BU0sgfCBcCisJCQkJCSBFU1JfRUx4X1NZUzY0X0lTU19PUDFfTUFTSyB8IFwKKwkJCQkJIEVTUl9FTHhfU1lTNjRfSVNTX09QMl9NQVNLIHwgXAorCQkJCQkgRVNSX0VMeF9TWVM2NF9JU1NfQ1JOX01BU0sgfCBcCisJCQkJCSBFU1JfRUx4X1NZUzY0X0lTU19DUk1fTUFTSykKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfU1lTX1ZBTChvcDAsIG9wMSwgb3AyLCBjcm4sIGNybSkgXAorCQkJCQkoKChvcDApIDw8IEVTUl9FTHhfU1lTNjRfSVNTX09QMF9TSElGVCkgfCBcCisJCQkJCSAoKG9wMSkgPDwgRVNSX0VMeF9TWVM2NF9JU1NfT1AxX1NISUZUKSB8IFwKKwkJCQkJICgob3AyKSA8PCBFU1JfRUx4X1NZUzY0X0lTU19PUDJfU0hJRlQpIHwgXAorCQkJCQkgKChjcm4pIDw8IEVTUl9FTHhfU1lTNjRfSVNTX0NSTl9TSElGVCkgfCBcCisJCQkJCSAoKGNybSkgPDwgRVNSX0VMeF9TWVM2NF9JU1NfQ1JNX1NISUZUKSkKKworI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19TWVNfT1BfTUFTSwkoRVNSX0VMeF9TWVM2NF9JU1NfU1lTX01BU0sgfCBcCisJCQkJCSBFU1JfRUx4X1NZUzY0X0lTU19ESVJfTUFTSykKKy8qCisgKiBVc2VyIHNwYWNlIGNhY2hlIG9wZXJhdGlvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIHN5c3JlZyBlbmNvZGluZworICogaW4gU3lzdGVtIGluc3RydWN0aW9ucy4KKyAqIG9wMD0xLCBvcDE9Mywgb3AyPTEsIGNybj03LCBjcm09eyA1LCAxMCwgMTEsIDE0IH0sIFdSSVRFIChMPTApCisgKi8KKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfQ1JNX0RDX0NJVkFDCTE0CisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX0NSTV9EQ19DVkFVCTExCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX0NSTV9EQ19DVkFDCTEwCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX0NSTV9JQ19JVkFVCTUKKworI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19FTDBfQ0FDSEVfT1BfTUFTSwkoRVNSX0VMeF9TWVM2NF9JU1NfT1AwX01BU0sgfCBcCisJCQkJCQkgRVNSX0VMeF9TWVM2NF9JU1NfT1AxX01BU0sgfCBcCisJCQkJCQkgRVNSX0VMeF9TWVM2NF9JU1NfT1AyX01BU0sgfCBcCisJCQkJCQkgRVNSX0VMeF9TWVM2NF9JU1NfQ1JOX01BU0sgfCBcCisJCQkJCQkgRVNSX0VMeF9TWVM2NF9JU1NfRElSX01BU0spCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX0VMMF9DQUNIRV9PUF9WQUwgXAorCQkJCShFU1JfRUx4X1NZUzY0X0lTU19TWVNfVkFMKDEsIDMsIDEsIDcsIDApIHwgXAorCQkJCSBFU1JfRUx4X1NZUzY0X0lTU19ESVJfV1JJVEUpCisKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfU1lTX0NUUglFU1JfRUx4X1NZUzY0X0lTU19TWVNfVkFMKDMsIDMsIDEsIDAsIDApCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX1NZU19DVFJfUkVBRAkoRVNSX0VMeF9TWVM2NF9JU1NfU1lTX0NUUiB8IFwKKwkJCQkJIEVTUl9FTHhfU1lTNjRfSVNTX0RJUl9SRUFEKQorCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2h3X2JyZWFrcG9pbnQuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaHdfYnJlYWtwb2ludC5oCmluZGV4IDExNWVhMmEuLjk1MTBhY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaHdfYnJlYWtwb2ludC5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaHdfYnJlYWtwb2ludC5oCkBAIC0xOCw2ICsxOCw3IEBACiAKICNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgogI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3JlZy5oPgogI2luY2x1ZGUgPGFzbS92aXJ0Lmg+CiAKICNpZmRlZiBfX0tFUk5FTF9fCkBAIC05OCwxOCArOTksMTggQEAKICNkZWZpbmUgQUFSQ0g2NF9EQkdfUkVHX1dDUgkoQUFSQ0g2NF9EQkdfUkVHX1dWUiArIEFSTV9NQVhfV1JQKQogCiAvKiBEZWJ1ZyByZWdpc3RlciBuYW1lcy4gKi8KLSNkZWZpbmUgQUFSQ0g2NF9EQkdfUkVHX05BTUVfQlZSCSJidnIiCi0jZGVmaW5lIEFBUkNINjRfREJHX1JFR19OQU1FX0JDUgkiYmNyIgotI2RlZmluZSBBQVJDSDY0X0RCR19SRUdfTkFNRV9XVlIJInd2ciIKLSNkZWZpbmUgQUFSQ0g2NF9EQkdfUkVHX05BTUVfV0NSCSJ3Y3IiCisjZGVmaW5lIEFBUkNINjRfREJHX1JFR19OQU1FX0JWUglidnIKKyNkZWZpbmUgQUFSQ0g2NF9EQkdfUkVHX05BTUVfQkNSCWJjcgorI2RlZmluZSBBQVJDSDY0X0RCR19SRUdfTkFNRV9XVlIJd3ZyCisjZGVmaW5lIEFBUkNINjRfREJHX1JFR19OQU1FX1dDUgl3Y3IKIAogLyogQWNjZXNzb3IgbWFjcm9zIGZvciB0aGUgZGVidWcgcmVnaXN0ZXJzLiAqLwogI2RlZmluZSBBQVJDSDY0X0RCR19SRUFEKE4sIFJFRywgVkFMKSBkbyB7XAotCWFzbSB2b2xhdGlsZSgibXJzICUwLCBkYmciIFJFRyAjTiAiX2VsMSIgOiAiPXIiIChWQUwpKTtcCisJVkFMID0gcmVhZF9zeXNyZWcoZGJnIyNSRUcjI04jI19lbDEpO1wKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgQUFSQ0g2NF9EQkdfV1JJVEUoTiwgUkVHLCBWQUwpIGRvIHtcCi0JYXNtIHZvbGF0aWxlKCJtc3IgZGJnIiBSRUcgI04gIl9lbDEsICUwIiA6OiAiciIgKFZBTCkpO1wKKwl3cml0ZV9zeXNyZWcoVkFMLCBkYmcjI1JFRyMjTiMjX2VsMSk7XAogfSB3aGlsZSAoMCkKIAogc3RydWN0IHRhc2tfc3RydWN0OwpAQCAtMTQxLDggKzE0Miw2IEBACiB9CiAjZW5kaWYKIAotZXh0ZXJuIHN0cnVjdCBwbXUgcGVyZl9vcHNfYnA7Ci0KIC8qIERldGVybWluZSBudW1iZXIgb2YgQlJQIHJlZ2lzdGVycyBhdmFpbGFibGUuICovCiBzdGF0aWMgaW5saW5lIGludCBnZXRfbnVtX2JycHModm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaW5zbi5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pbnNuLmgKaW5kZXggMWRiYWE5MC4uYmM4NTM2NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pbnNuLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pbnNuLmgKQEAgLTI0Niw3ICsyNDYsOCBAQAogc3RhdGljIF9fYWx3YXlzX2lubGluZSB1MzIgYWFyY2g2NF9pbnNuX2dldF8jI2FiYnIjI192YWx1ZSh2b2lkKSBcCiB7IHJldHVybiAodmFsKTsgfQogCi1fX0FBUkNINjRfSU5TTl9GVU5DUyhhZHJfYWRycCwJMHgxRjAwMDAwMCwgMHgxMDAwMDAwMCkKK19fQUFSQ0g2NF9JTlNOX0ZVTkNTKGFkciwJMHg5RjAwMDAwMCwgMHgxMDAwMDAwMCkKK19fQUFSQ0g2NF9JTlNOX0ZVTkNTKGFkcnAsCTB4OUYwMDAwMDAsIDB4OTAwMDAwMDApCiBfX0FBUkNINjRfSU5TTl9GVU5DUyhwcmZtX2xpdCwJMHhGRjAwMDAwMCwgMHhEODAwMDAwMCkKIF9fQUFSQ0g2NF9JTlNOX0ZVTkNTKHN0cl9yZWcsCTB4M0ZFMEVDMDAsIDB4MzgyMDY4MDApCiBfX0FBUkNINjRfSU5TTl9GVU5DUyhsZHJfcmVnLAkweDNGRTBFQzAwLCAweDM4NjA2ODAwKQpAQCAtMzE4LDYgKzMxOSwxMSBAQAogYm9vbCBhYXJjaDY0X2luc25faXNfbm9wKHUzMiBpbnNuKTsKIGJvb2wgYWFyY2g2NF9pbnNuX2lzX2JyYW5jaF9pbW0odTMyIGluc24pOwogCitzdGF0aWMgaW5saW5lIGJvb2wgYWFyY2g2NF9pbnNuX2lzX2Fkcl9hZHJwKHUzMiBpbnNuKQoreworCXJldHVybiBhYXJjaDY0X2luc25faXNfYWRyKGluc24pIHx8IGFhcmNoNjRfaW5zbl9pc19hZHJwKGluc24pOworfQorCiBpbnQgYWFyY2g2NF9pbnNuX3JlYWQodm9pZCAqYWRkciwgdTMyICppbnNucCk7CiBpbnQgYWFyY2g2NF9pbnNuX3dyaXRlKHZvaWQgKmFkZHIsIHUzMiBpbnNuKTsKIGVudW0gYWFyY2g2NF9pbnNuX2VuY29kaW5nX2NsYXNzIGFhcmNoNjRfZ2V0X2luc25fY2xhc3ModTMyIGluc24pOwpAQCAtMzk4LDYgKzQwNCw5IEBACiBpbnQgYWFyY2g2NF9pbnNuX3BhdGNoX3RleHRfc3luYyh2b2lkICphZGRyc1tdLCB1MzIgaW5zbnNbXSwgaW50IGNudCk7CiBpbnQgYWFyY2g2NF9pbnNuX3BhdGNoX3RleHQodm9pZCAqYWRkcnNbXSwgdTMyIGluc25zW10sIGludCBjbnQpOwogCitzMzIgYWFyY2g2NF9pbnNuX2FkcnBfZ2V0X29mZnNldCh1MzIgaW5zbik7Cit1MzIgYWFyY2g2NF9pbnNuX2FkcnBfc2V0X29mZnNldCh1MzIgaW5zbiwgczMyIG9mZnNldCk7CisKIGJvb2wgYWFyY2gzMl9pbnNuX2lzX3dpZGUodTMyIGluc24pOwogCiAjZGVmaW5lIEEzMl9STl9PRkZTRVQJMTYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaW8uaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaW8uaAppbmRleCA5YjZlNDA4Li4wYmJhNDI3IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lvLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pby5oCkBAIC00MCwyNSArNDAsMjUgQEAKICNkZWZpbmUgX19yYXdfd3JpdGViIF9fcmF3X3dyaXRlYgogc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlYih1OCB2YWwsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlhc20gdm9sYXRpbGUoInN0cmIgJXcwLCBbJTFdIiA6IDogInIiICh2YWwpLCAiciIgKGFkZHIpKTsKKwlhc20gdm9sYXRpbGUoInN0cmIgJXcwLCBbJTFdIiA6IDogInJaIiAodmFsKSwgInIiIChhZGRyKSk7CiB9CiAKICNkZWZpbmUgX19yYXdfd3JpdGV3IF9fcmF3X3dyaXRldwogc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRldyh1MTYgdmFsLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JYXNtIHZvbGF0aWxlKCJzdHJoICV3MCwgWyUxXSIgOiA6ICJyIiAodmFsKSwgInIiIChhZGRyKSk7CisJYXNtIHZvbGF0aWxlKCJzdHJoICV3MCwgWyUxXSIgOiA6ICJyWiIgKHZhbCksICJyIiAoYWRkcikpOwogfQogCiAjZGVmaW5lIF9fcmF3X3dyaXRlbCBfX3Jhd193cml0ZWwKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZWwodTMyIHZhbCwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCWFzbSB2b2xhdGlsZSgic3RyICV3MCwgWyUxXSIgOiA6ICJyIiAodmFsKSwgInIiIChhZGRyKSk7CisJYXNtIHZvbGF0aWxlKCJzdHIgJXcwLCBbJTFdIiA6IDogInJaIiAodmFsKSwgInIiIChhZGRyKSk7CiB9CiAKICNkZWZpbmUgX19yYXdfd3JpdGVxIF9fcmF3X3dyaXRlcQogc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlcSh1NjQgdmFsLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JYXNtIHZvbGF0aWxlKCJzdHIgJTAsIFslMV0iIDogOiAiciIgKHZhbCksICJyIiAoYWRkcikpOworCWFzbSB2b2xhdGlsZSgic3RyICV4MCwgWyUxXSIgOiA6ICJyWiIgKHZhbCksICJyIiAoYWRkcikpOwogfQogCiAjZGVmaW5lIF9fcmF3X3JlYWRiIF9fcmF3X3JlYWRiCkBAIC0xODQsMTcgKzE4NCw2IEBACiAjZGVmaW5lIGlvd3JpdGUzMmJlKHYscCkJKHsgX19pb3dtYigpOyBfX3Jhd193cml0ZWwoKF9fZm9yY2UgX191MzIpY3B1X3RvX2JlMzIodiksIHApOyB9KQogI2RlZmluZSBpb3dyaXRlNjRiZSh2LHApCSh7IF9faW93bWIoKTsgX19yYXdfd3JpdGVxKChfX2ZvcmNlIF9fdTY0KWNwdV90b19iZTY0KHYpLCBwKTsgfSkKIAotLyoKLSAqIENvbnZlcnQgYSBwaHlzaWNhbCBwb2ludGVyIHRvIGEgdmlydHVhbCBrZXJuZWwgcG9pbnRlciBmb3IgL2Rldi9tZW0KLSAqIGFjY2VzcwotICovCi0jZGVmaW5lIHhsYXRlX2Rldl9tZW1fcHRyKHApCV9fdmEocCkKLQotLyoKLSAqIENvbnZlcnQgYSB2aXJ0dWFsIGNhY2hlZCBwb2ludGVyIHRvIGFuIHVuY2FjaGVkIHBvaW50ZXIKLSAqLwotI2RlZmluZSB4bGF0ZV9kZXZfa21lbV9wdHIocCkJcAotCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW8uaD4KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX21tdS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fbW11LmgKaW5kZXggYjZiYjgzNC4uZGZmMTA5OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fbW11LmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fbW11LmgKQEAgLTk5LDE0ICs5OSwxMCBAQAogLm1hY3JvIGtlcm5faHlwX3ZhCXJlZwogYWx0ZXJuYXRpdmVfaWZfbm90IEFSTTY0X0hBU19WSVJUX0hPU1RfRVhUTgogCWFuZCAgICAgXHJlZywgXHJlZywgI0hZUF9QQUdFX09GRlNFVF9ISUdIX01BU0sKLWFsdGVybmF0aXZlX2Vsc2UKLQlub3AKLWFsdGVybmF0aXZlX2VuZGlmCi1hbHRlcm5hdGl2ZV9pZl9ub3QgQVJNNjRfSFlQX09GRlNFVF9MT1cKLQlub3AKLWFsdGVybmF0aXZlX2Vsc2UKK2FsdGVybmF0aXZlX2Vsc2Vfbm9wX2VuZGlmCithbHRlcm5hdGl2ZV9pZiBBUk02NF9IWVBfT0ZGU0VUX0xPVwogCWFuZCAgICAgXHJlZywgXHJlZywgI0hZUF9QQUdFX09GRlNFVF9MT1dfTUFTSwotYWx0ZXJuYXRpdmVfZW5kaWYKK2FsdGVybmF0aXZlX2Vsc2Vfbm9wX2VuZGlmCiAuZW5kbQogCiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9tZW1vcnkuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vbWVtb3J5LmgKaW5kZXggMzFiNzMyMi4uYmE2MmRmOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9tZW1vcnkuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL21lbW9yeS5oCkBAIC0yMTQsNyArMjE0LDcgQEAKIAogI2lmbmRlZiBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVAKICNkZWZpbmUgdmlydF90b19wYWdlKGthZGRyKQlwZm5fdG9fcGFnZShfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQotI2RlZmluZSB2aXJ0X2FkZHJfdmFsaWQoa2FkZHIpCXBmbl92YWxpZChfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQorI2RlZmluZSBfdmlydF9hZGRyX3ZhbGlkKGthZGRyKQlwZm5fdmFsaWQoX19wYShrYWRkcikgPj4gUEFHRV9TSElGVCkKICNlbHNlCiAjZGVmaW5lIF9fdmlydF90b19wZ29mZihrYWRkcikJKCgodTY0KShrYWRkcikgJiB+UEFHRV9PRkZTRVQpIC8gUEFHRV9TSVpFICogc2l6ZW9mKHN0cnVjdCBwYWdlKSkKICNkZWZpbmUgX19wYWdlX3RvX3ZvZmYoa2FkZHIpCSgoKHU2NCkocGFnZSkgJiB+Vk1FTU1BUF9TVEFSVCkgKiBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IHBhZ2UpKQpAQCAtMjIyLDExICsyMjIsMTUgQEAKICNkZWZpbmUgcGFnZV90b192aXJ0KHBhZ2UpCSgodm9pZCAqKSgoX19wYWdlX3RvX3ZvZmYocGFnZSkpIHwgUEFHRV9PRkZTRVQpKQogI2RlZmluZSB2aXJ0X3RvX3BhZ2UodmFkZHIpCSgoc3RydWN0IHBhZ2UgKikoKF9fdmlydF90b19wZ29mZih2YWRkcikpIHwgVk1FTU1BUF9TVEFSVCkpCiAKLSNkZWZpbmUgdmlydF9hZGRyX3ZhbGlkKGthZGRyKQlwZm5fdmFsaWQoKCgodTY0KShrYWRkcikgJiB+UEFHRV9PRkZTRVQpIFwKKyNkZWZpbmUgX3ZpcnRfYWRkcl92YWxpZChrYWRkcikJcGZuX3ZhbGlkKCgoKHU2NCkoa2FkZHIpICYgflBBR0VfT0ZGU0VUKSBcCiAJCQkJCSAgICsgUEhZU19PRkZTRVQpID4+IFBBR0VfU0hJRlQpCiAjZW5kaWYKICNlbmRpZgogCisjZGVmaW5lIF92aXJ0X2FkZHJfaXNfbGluZWFyKGthZGRyKQkoKCh1NjQpKGthZGRyKSkgPj0gUEFHRV9PRkZTRVQpCisjZGVmaW5lIHZpcnRfYWRkcl92YWxpZChrYWRkcikJCShfdmlydF9hZGRyX2lzX2xpbmVhcihrYWRkcikgJiYgXAorCQkJCQkgX3ZpcnRfYWRkcl92YWxpZChrYWRkcikpCisKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tZW1vcnlfbW9kZWwuaD4KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKaW5kZXggYjE4OTJhMC4uYTUwMTg1MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaApAQCAtMjcsMjIgKzI3LDE3IEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbW1faG9va3MuaD4KICNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3JlZy5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogCi0jaWZkZWYgQ09ORklHX1BJRF9JTl9DT05URVhUSURSCiBzdGF0aWMgaW5saW5lIHZvaWQgY29udGV4dGlkcl90aHJlYWRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKIHsKLQlhc20oCi0JIgltc3IJY29udGV4dGlkcl9lbDEsICUwXG4iCi0JIglpc2IiCi0JOgotCTogInIiICh0YXNrX3BpZF9ucihuZXh0KSkpOworCWlmICghSVNfRU5BQkxFRChDT05GSUdfUElEX0lOX0NPTlRFWFRJRFIpKQorCQlyZXR1cm47CisKKwl3cml0ZV9zeXNyZWcodGFza19waWRfbnIobmV4dCksIGNvbnRleHRpZHJfZWwxKTsKKwlpc2IoKTsKIH0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgY29udGV4dGlkcl90aHJlYWRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKLXsKLX0KLSNlbmRpZgogCiAvKgogICogU2V0IFRUQlIwIHRvIGVtcHR5X3plcm9fcGFnZS4gTm8gdHJhbnNsYXRpb25zIHdpbGwgYmUgcG9zc2libGUgdmlhIFRUQlIwLgpAQCAtNTEsMTEgKzQ2LDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIHR0YnIgPSB2aXJ0X3RvX3BoeXMoZW1wdHlfemVyb19wYWdlKTsKIAotCWFzbSgKLQkiCW1zcgl0dGJyMF9lbDEsICUwCQkJLy8gc2V0IFRUQlIwXG4iCi0JIglpc2IiCi0JOgotCTogInIiICh0dGJyKSk7CisJd3JpdGVfc3lzcmVnKHR0YnIsIHR0YnIwX2VsMSk7CisJaXNiKCk7CiB9CiAKIC8qCkBAIC04MSwxMyArNzMsMTEgQEAKIAlpZiAoIV9fY3B1X3VzZXNfZXh0ZW5kZWRfaWRtYXAoKSkKIAkJcmV0dXJuOwogCi0JYXNtIHZvbGF0aWxlICgKLQkiCW1ycwklMCwgdGNyX2VsMQk7IgotCSIJYmZpCSUwLCAlMSwgJTIsICUzCTsiCi0JIgltc3IJdGNyX2VsMSwgJTAJOyIKLQkiCWlzYiIKLQk6ICI9JnIiICh0Y3IpCi0JOiAiciIodDBzeiksICJJIihUQ1JfVDBTWl9PRkZTRVQpLCAiSSIoVENSX1R4U1pfV0lEVEgpKTsKKwl0Y3IgPSByZWFkX3N5c3JlZyh0Y3JfZWwxKTsKKwl0Y3IgJj0gflRDUl9UMFNaX01BU0s7CisJdGNyIHw9IHQwc3ogPDwgVENSX1QwU1pfT0ZGU0VUOworCXdyaXRlX3N5c3JlZyh0Y3IsIHRjcl9lbDEpOworCWlzYigpOwogfQogCiAjZGVmaW5lIGNwdV9zZXRfZGVmYXVsdF90Y3JfdDBzeigpCV9fY3B1X3NldF90Y3JfdDBzeihUQ1JfVDBTWihWQV9CSVRTKSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGVyY3B1LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BlcmNwdS5oCmluZGV4IDBhNDU2YmUuLjJmZWUyZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGVyY3B1LmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZXJjcHUuaApAQCAtMTk5LDE5ICsxOTksMTkgQEAKICNkZWZpbmUgX3BlcmNwdV9yZWFkKHBjcCkJCQkJCQlcCiAoewkJCQkJCQkJCVwKIAl0eXBlb2YocGNwKSBfX3JldHZhbDsJCQkJCQlcCi0JcHJlZW1wdF9kaXNhYmxlKCk7CQkJCQkJXAorCXByZWVtcHRfZGlzYWJsZV9ub3RyYWNlKCk7CQkJCQlcCiAJX19yZXR2YWwgPSAodHlwZW9mKHBjcCkpX19wZXJjcHVfcmVhZChyYXdfY3B1X3B0cigmKHBjcCkpLCAJXAogCQkJCQkgICAgICBzaXplb2YocGNwKSk7CQlcCi0JcHJlZW1wdF9lbmFibGUoKTsJCQkJCQlcCisJcHJlZW1wdF9lbmFibGVfbm90cmFjZSgpOwkJCQkJXAogCV9fcmV0dmFsOwkJCQkJCQlcCiB9KQogCiAjZGVmaW5lIF9wZXJjcHVfd3JpdGUocGNwLCB2YWwpCQkJCQkJXAogZG8gewkJCQkJCQkJCVwKLQlwcmVlbXB0X2Rpc2FibGUoKTsJCQkJCQlcCisJcHJlZW1wdF9kaXNhYmxlX25vdHJhY2UoKTsJCQkJCVwKIAlfX3BlcmNwdV93cml0ZShyYXdfY3B1X3B0cigmKHBjcCkpLCAodW5zaWduZWQgbG9uZykodmFsKSwgCVwKIAkJCQlzaXplb2YocGNwKSk7CQkJCVwKLQlwcmVlbXB0X2VuYWJsZSgpOwkJCQkJCVwKKwlwcmVlbXB0X2VuYWJsZV9ub3RyYWNlKCk7CQkJCQlcCiB9IHdoaWxlKDApCQkJCQkJCQlcCiAKICNkZWZpbmUgX3BjcF9wcm90ZWN0KG9wZXJhdGlvbiwgcGNwLCB2YWwpCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLWh3ZGVmLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUtaHdkZWYuaAppbmRleCBjM2FlMjM5Li5lYjBjMmJkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUtaHdkZWYuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUtaHdkZWYuaApAQCAtMjA4LDYgKzIwOCw3IEBACiAjZGVmaW5lIFRDUl9UMVNaKHgpCQkoKFVMKDY0KSAtICh4KSkgPDwgVENSX1QxU1pfT0ZGU0VUKQogI2RlZmluZSBUQ1JfVHhTWih4KQkJKFRDUl9UMFNaKHgpIHwgVENSX1QxU1ooeCkpCiAjZGVmaW5lIFRDUl9UeFNaX1dJRFRICQk2CisjZGVmaW5lIFRDUl9UMFNaX01BU0sJCSgoKFVMKDEpIDw8IFRDUl9UeFNaX1dJRFRIKSAtIDEpIDw8IFRDUl9UMFNaX09GRlNFVCkKIAogI2RlZmluZSBUQ1JfSVJHTjBfU0hJRlQJCTgKICNkZWZpbmUgVENSX0lSR04wX01BU0sJCShVTCgzKSA8PCBUQ1JfSVJHTjBfU0hJRlQpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUtcHJvdC5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLXByb3QuaAppbmRleCAzOWY1MjUyLi4yMTQyYzc3IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUtcHJvdC5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS1wcm90LmgKQEAgLTcwLDEyICs3MCwxMyBAQAogI2RlZmluZSBQQUdFX0NPUFlfRVhFQwkJX19wZ3Byb3QoX1BBR0VfREVGQVVMVCB8IFBURV9VU0VSIHwgUFRFX05HIHwgUFRFX1BYTikKICNkZWZpbmUgUEFHRV9SRUFET05MWQkJX19wZ3Byb3QoX1BBR0VfREVGQVVMVCB8IFBURV9VU0VSIHwgUFRFX05HIHwgUFRFX1BYTiB8IFBURV9VWE4pCiAjZGVmaW5lIFBBR0VfUkVBRE9OTFlfRVhFQwlfX3BncHJvdChfUEFHRV9ERUZBVUxUIHwgUFRFX1VTRVIgfCBQVEVfTkcgfCBQVEVfUFhOKQorI2RlZmluZSBQQUdFX0VYRUNPTkxZCQlfX3BncHJvdChfUEFHRV9ERUZBVUxUIHwgUFRFX05HIHwgUFRFX1BYTikKIAogI2RlZmluZSBfX1AwMDAgIFBBR0VfTk9ORQogI2RlZmluZSBfX1AwMDEgIFBBR0VfUkVBRE9OTFkKICNkZWZpbmUgX19QMDEwICBQQUdFX0NPUFkKICNkZWZpbmUgX19QMDExICBQQUdFX0NPUFkKLSNkZWZpbmUgX19QMTAwICBQQUdFX1JFQURPTkxZX0VYRUMKKyNkZWZpbmUgX19QMTAwICBQQUdFX0VYRUNPTkxZCiAjZGVmaW5lIF9fUDEwMSAgUEFHRV9SRUFET05MWV9FWEVDCiAjZGVmaW5lIF9fUDExMCAgUEFHRV9DT1BZX0VYRUMKICNkZWZpbmUgX19QMTExICBQQUdFX0NPUFlfRVhFQwpAQCAtODQsNyArODUsNyBAQAogI2RlZmluZSBfX1MwMDEgIFBBR0VfUkVBRE9OTFkKICNkZWZpbmUgX19TMDEwICBQQUdFX1NIQVJFRAogI2RlZmluZSBfX1MwMTEgIFBBR0VfU0hBUkVECi0jZGVmaW5lIF9fUzEwMCAgUEFHRV9SRUFET05MWV9FWEVDCisjZGVmaW5lIF9fUzEwMCAgUEFHRV9FWEVDT05MWQogI2RlZmluZSBfX1MxMDEgIFBBR0VfUkVBRE9OTFlfRVhFQwogI2RlZmluZSBfX1MxMTAgIFBBR0VfU0hBUkVEX0VYRUMKICNkZWZpbmUgX19TMTExICBQQUdFX1NIQVJFRF9FWEVDCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oCmluZGV4IGUyMGJkNDMuLmZmYmI5YTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC03Myw3ICs3Myw3IEBACiAjZGVmaW5lIHB0ZV93cml0ZShwdGUpCQkoISEocHRlX3ZhbChwdGUpICYgUFRFX1dSSVRFKSkKICNkZWZpbmUgcHRlX2V4ZWMocHRlKQkJKCEocHRlX3ZhbChwdGUpICYgUFRFX1VYTikpCiAjZGVmaW5lIHB0ZV9jb250KHB0ZSkJCSghIShwdGVfdmFsKHB0ZSkgJiBQVEVfQ09OVCkpCi0jZGVmaW5lIHB0ZV91c2VyKHB0ZSkJCSghIShwdGVfdmFsKHB0ZSkgJiBQVEVfVVNFUikpCisjZGVmaW5lIHB0ZV9uZyhwdGUpCQkoISEocHRlX3ZhbChwdGUpICYgUFRFX05HKSkKIAogI2lmZGVmIENPTkZJR19BUk02NF9IV19BRkRCTQogI2RlZmluZSBwdGVfaHdfZGlydHkocHRlKQkocHRlX3dyaXRlKHB0ZSkgJiYgIShwdGVfdmFsKHB0ZSkgJiBQVEVfUkRPTkxZKSkKQEAgLTg0LDggKzg0LDggQEAKICNkZWZpbmUgcHRlX2RpcnR5KHB0ZSkJCShwdGVfc3dfZGlydHkocHRlKSB8fCBwdGVfaHdfZGlydHkocHRlKSkKIAogI2RlZmluZSBwdGVfdmFsaWQocHRlKQkJKCEhKHB0ZV92YWwocHRlKSAmIFBURV9WQUxJRCkpCi0jZGVmaW5lIHB0ZV92YWxpZF9ub3RfdXNlcihwdGUpIFwKLQkoKHB0ZV92YWwocHRlKSAmIChQVEVfVkFMSUQgfCBQVEVfVVNFUikpID09IFBURV9WQUxJRCkKKyNkZWZpbmUgcHRlX3ZhbGlkX2dsb2JhbChwdGUpIFwKKwkoKHB0ZV92YWwocHRlKSAmIChQVEVfVkFMSUQgfCBQVEVfTkcpKSA9PSBQVEVfVkFMSUQpCiAjZGVmaW5lIHB0ZV92YWxpZF95b3VuZyhwdGUpIFwKIAkoKHB0ZV92YWwocHRlKSAmIChQVEVfVkFMSUQgfCBQVEVfQUYpKSA9PSAoUFRFX1ZBTElEIHwgUFRFX0FGKSkKIApAQCAtMTU1LDYgKzE1NSwxNiBAQAogCXJldHVybiBjbGVhcl9wdGVfYml0KHB0ZSwgX19wZ3Byb3QoUFRFX0NPTlQpKTsKIH0KIAorc3RhdGljIGlubGluZSBwdGVfdCBwdGVfY2xlYXJfcmRvbmx5KHB0ZV90IHB0ZSkKK3sKKwlyZXR1cm4gY2xlYXJfcHRlX2JpdChwdGUsIF9fcGdwcm90KFBURV9SRE9OTFkpKTsKK30KKworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtwcmVzZW50KHB0ZV90IHB0ZSkKK3sKKwlyZXR1cm4gc2V0X3B0ZV9iaXQocHRlLCBfX3BncHJvdChQVEVfVkFMSUQpKTsKK30KKwogc3RhdGljIGlubGluZSBwbWRfdCBwbWRfbWtjb250KHBtZF90IHBtZCkKIHsKIAlyZXR1cm4gX19wbWQocG1kX3ZhbChwbWQpIHwgUE1EX1NFQ1RfQ09OVCk7CkBAIC0xNjgsNyArMTc4LDcgQEAKIAkgKiBPbmx5IGlmIHRoZSBuZXcgcHRlIGlzIHZhbGlkIGFuZCBrZXJuZWwsIG90aGVyd2lzZSBUTEIgbWFpbnRlbmFuY2UKIAkgKiBvciB1cGRhdGVfbW11X2NhY2hlKCkgaGF2ZSB0aGUgbmVjZXNzYXJ5IGJhcnJpZXJzLgogCSAqLwotCWlmIChwdGVfdmFsaWRfbm90X3VzZXIocHRlKSkgeworCWlmIChwdGVfdmFsaWRfZ2xvYmFsKHB0ZSkpIHsKIAkJZHNiKGlzaHN0KTsKIAkJaXNiKCk7CiAJfQpAQCAtMjAyLDcgKzIxMiw3IEBACiAJCQlwdGVfdmFsKHB0ZSkgJj0gflBURV9SRE9OTFk7CiAJCWVsc2UKIAkJCXB0ZV92YWwocHRlKSB8PSBQVEVfUkRPTkxZOwotCQlpZiAocHRlX3VzZXIocHRlKSAmJiBwdGVfZXhlYyhwdGUpICYmICFwdGVfc3BlY2lhbChwdGUpKQorCQlpZiAocHRlX25nKHB0ZSkgJiYgcHRlX2V4ZWMocHRlKSAmJiAhcHRlX3NwZWNpYWwocHRlKSkKIAkJCV9fc3luY19pY2FjaGVfZGNhY2hlKHB0ZSwgYWRkcik7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCBhY2UwYTk2Li5kZjJlNTNkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKLSNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIFNUQUNLX1RPUF9NQVgJCVRBU0tfU0laRV82NAogI2lmZGVmIENPTkZJR19DT01QQVQKICNkZWZpbmUgQUFSQ0gzMl9WRUNUT1JTX0JBU0UJMHhmZmZmMDAwMApAQCAtNDksNyArNDgsNiBAQAogCiBleHRlcm4gcGh5c19hZGRyX3QgYXJtNjRfZG1hX3BoeXNfbGltaXQ7CiAjZGVmaW5lIEFSQ0hfTE9XX0FERFJFU1NfTElNSVQJKGFybTY0X2RtYV9waHlzX2xpbWl0IC0gMSkKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKIHN0cnVjdCBkZWJ1Z19pbmZvIHsKIAkvKiBIYXZlIHdlIHN1c3BlbmRlZCBzdGVwcGluZyBieSBhIGRlYnVnZ2VyPyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlN2U3MDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3NlY3Rpb25zLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBUk0gTGltaXRlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKyNpZm5kZWYgX19BU01fU0VDVElPTlNfSAorI2RlZmluZSBfX0FTTV9TRUNUSU9OU19ICisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zZWN0aW9ucy5oPgorCitleHRlcm4gY2hhciBfX2FsdF9pbnN0cnVjdGlvbnNbXSwgX19hbHRfaW5zdHJ1Y3Rpb25zX2VuZFtdOworZXh0ZXJuIGNoYXIgX19leGNlcHRpb25fdGV4dF9zdGFydFtdLCBfX2V4Y2VwdGlvbl90ZXh0X2VuZFtdOworZXh0ZXJuIGNoYXIgX19oaWJlcm5hdGVfZXhpdF90ZXh0X3N0YXJ0W10sIF9faGliZXJuYXRlX2V4aXRfdGV4dF9lbmRbXTsKK2V4dGVybiBjaGFyIF9faHlwX2lkbWFwX3RleHRfc3RhcnRbXSwgX19oeXBfaWRtYXBfdGV4dF9lbmRbXTsKK2V4dGVybiBjaGFyIF9faHlwX3RleHRfc3RhcnRbXSwgX19oeXBfdGV4dF9lbmRbXTsKK2V4dGVybiBjaGFyIF9faWRtYXBfdGV4dF9zdGFydFtdLCBfX2lkbWFwX3RleHRfZW5kW107CitleHRlcm4gY2hhciBfX2lycWVudHJ5X3RleHRfc3RhcnRbXSwgX19pcnFlbnRyeV90ZXh0X2VuZFtdOworZXh0ZXJuIGNoYXIgX19tbXVvZmZfZGF0YV9zdGFydFtdLCBfX21tdW9mZl9kYXRhX2VuZFtdOworCisjZW5kaWYgLyogX19BU01fU0VDVElPTlNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zcGlubG9jay5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zcGlubG9jay5oCmluZGV4IGU4NzVhNWEuLmNhZTMzMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vc3BpbmxvY2suaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKQEAgLTY2LDggKzY2LDcgQEAKIAlBUk02NF9MU0VfQVRPTUlDX0lOU04oCiAJLyogTEwvU0MgKi8KICIJc3R4cgkldzEsICV3MCwgJTJcbiIKLSIJbm9wXG4iCi0iCW5vcFxuIiwKKwlfX25vcHMoMiksCiAJLyogTFNFIGF0b21pY3MgKi8KICIJbW92CSV3MSwgJXcwXG4iCiAiCWNhcwkldzAsICV3MCwgJTJcbiIKQEAgLTk5LDkgKzk4LDcgQEAKIAkvKiBMU0UgYXRvbWljcyAqLwogIgltb3YJJXcyLCAldzVcbiIKICIJbGRhZGRhCSV3MiwgJXcwLCAlM1xuIgotIglub3BcbiIKLSIJbm9wXG4iCi0iCW5vcFxuIgorCV9fbm9wcygzKQogCSkKIAogCS8qIERpZCB3ZSBnZXQgdGhlIGxvY2s/ICovCkBAIC0xNjUsOCArMTYyLDggQEAKIAkiCXN0bHJoCSV3MSwgJTAiLAogCS8qIExTRSBhdG9taWNzICovCiAJIgltb3YJJXcxLCAjMVxuIgotCSIJbm9wXG4iCi0JIglzdGFkZGxoCSV3MSwgJTAiKQorCSIJc3RhZGRsaAkldzEsICUwXG4iCisJX19ub3BzKDEpKQogCTogIj1RIiAobG9jay0+b3duZXIpLCAiPSZyIiAodG1wKQogCToKIAk6ICJtZW1vcnkiKTsKQEAgLTIxMiw3ICsyMDksNyBAQAogCSIJY2JuegkldzAsIDFiXG4iCiAJIglzdHhyCSV3MCwgJXcyLCAlMVxuIgogCSIJY2JuegkldzAsIDJiXG4iCi0JIglub3AiLAorCV9fbm9wcygxKSwKIAkvKiBMU0UgYXRvbWljcyAqLwogCSIxOgltb3YJJXcwLCB3enJcbiIKIAkiMjoJY2FzYQkldzAsICV3MiwgJTFcbiIKQEAgLTI0MSw4ICsyMzgsNyBAQAogCS8qIExTRSBhdG9taWNzICovCiAJIgltb3YJJXcwLCB3enJcbiIKIAkiCWNhc2EJJXcwLCAldzIsICUxXG4iCi0JIglub3BcbiIKLQkiCW5vcCIpCisJX19ub3BzKDIpKQogCTogIj0mciIgKHRtcCksICIrUSIgKHJ3LT5sb2NrKQogCTogInIiICgweDgwMDAwMDAwKQogCTogIm1lbW9yeSIpOwpAQCAtMjkwLDggKzI4Niw4IEBACiAJIglhZGQJJXcwLCAldzAsICMxXG4iCiAJIgl0Ym56CSV3MCwgIzMxLCAxYlxuIgogCSIJc3R4cgkldzEsICV3MCwgJTJcbiIKLQkiCW5vcFxuIgotCSIJY2JuegkldzEsIDJiIiwKKwkiCWNibnoJJXcxLCAyYlxuIgorCV9fbm9wcygxKSwKIAkvKiBMU0UgYXRvbWljcyAqLwogCSIxOgl3ZmVcbiIKIAkiMjoJbGR4cgkldzAsICUyXG4iCkBAIC0zMTcsOSArMzEzLDggQEAKIAkiCWNibnoJJXcxLCAxYiIsCiAJLyogTFNFIGF0b21pY3MgKi8KIAkiCW1vdm4JJXcwLCAjMFxuIgotCSIJbm9wXG4iCi0JIglub3BcbiIKLQkiCXN0YWRkbAkldzAsICUyIikKKwkiCXN0YWRkbAkldzAsICUyXG4iCisJX19ub3BzKDIpKQogCTogIj0mciIgKHRtcCksICI9JnIiICh0bXAyKSwgIitRIiAocnctPmxvY2spCiAJOgogCTogIm1lbW9yeSIpOwpAQCAtMzQ0LDcgKzMzOSw3IEBACiAJIgl0Ym56CSV3MSwgIzMxLCAxZlxuIgogCSIJY2FzYQkldzAsICV3MSwgJTJcbiIKIAkiCXNiYwkldzEsICV3MSwgJXcwXG4iCi0JIglub3BcbiIKKwlfX25vcHMoMSkKIAkiMToiKQogCTogIj0mciIgKHRtcCksICI9JnIiICh0bXAyKSwgIitRIiAocnctPmxvY2spCiAJOgpAQCAtMzYzLDQgKzM1OCwxNCBAQAogI2RlZmluZSBhcmNoX3JlYWRfcmVsYXgobG9jaykJY3B1X3JlbGF4KCkKICNkZWZpbmUgYXJjaF93cml0ZV9yZWxheChsb2NrKQljcHVfcmVsYXgoKQogCisvKgorICogQWNjZXNzZXMgYXBwZWFyaW5nIGluIHByb2dyYW0gb3JkZXIgYmVmb3JlIGEgc3Bpbl9sb2NrKCkgb3BlcmF0aW9uCisgKiBjYW4gYmUgcmVvcmRlcmVkIHdpdGggYWNjZXNzZXMgaW5zaWRlIHRoZSBjcml0aWNhbCBzZWN0aW9uLCBieSB2aXJ0dWUKKyAqIG9mIGFyY2hfc3Bpbl9sb2NrIGJlaW5nIGNvbnN0cnVjdGVkIHVzaW5nIGFjcXVpcmUgc2VtYW50aWNzLgorICoKKyAqIEluIGNhc2VzIHdoZXJlIHRoaXMgaXMgcHJvYmxlbWF0aWMgKGUuZy4gdHJ5X3RvX3dha2VfdXApLCBhbgorICogc21wX21iX19iZWZvcmVfc3BpbmxvY2soKSBjYW4gcmVzdG9yZSB0aGUgcmVxdWlyZWQgb3JkZXJpbmcuCisgKi8KKyNkZWZpbmUgc21wX21iX19iZWZvcmVfc3BpbmxvY2soKQlzbXBfbWIoKQorCiAjZW5kaWYgLyogX19BU01fU1BJTkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zdXNwZW5kLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3N1c3BlbmQuaAppbmRleCAwMjRkNjIzLi5iOGEzMTNmIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3N1c3BlbmQuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3N1c3BlbmQuaApAQCAtNDcsNCArNDcsNyBAQAogaW50IGFyY2hfaGliZXJuYXRpb25faGVhZGVyX3NhdmUodm9pZCAqYWRkciwgdW5zaWduZWQgaW50IG1heF9zaXplKTsKIGludCBhcmNoX2hpYmVybmF0aW9uX2hlYWRlcl9yZXN0b3JlKHZvaWQgKmFkZHIpOwogCisvKiBVc2VkIHRvIHJlc3VtZSBvbiB0aGUgQ1BVIHdlIGhpYmVybmF0ZWQgb24gKi8KK2ludCBoaWJlcm5hdGVfcmVzdW1lX25vbmJvb3RfY3B1X2Rpc2FibGUodm9pZCk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zeXNyZWcuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vc3lzcmVnLmgKaW5kZXggY2MwNjc5NC4uZThkNDZlOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zeXNyZWcuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3N5c3JlZy5oCkBAIC0xMDAsNiArMTAwLDcgQEAKIC8qIFNDVExSX0VMMSBzcGVjaWZpYyBmbGFncy4gKi8KICNkZWZpbmUgU0NUTFJfRUwxX1VDSQkJKDEgPDwgMjYpCiAjZGVmaW5lIFNDVExSX0VMMV9TUEFOCQkoMSA8PCAyMykKKyNkZWZpbmUgU0NUTFJfRUwxX1VDVAkJKDEgPDwgMTUpCiAjZGVmaW5lIFNDVExSX0VMMV9TRUQJCSgxIDw8IDgpCiAjZGVmaW5lIFNDVExSX0VMMV9DUDE1QkVOCSgxIDw8IDUpCiAKQEAgLTI1MywxNiArMjU0LDYgQEAKICIJLmVuZG1cbiIKICk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjb25maWdfc2N0bHJfZWwxKHUzMiBjbGVhciwgdTMyIHNldCkKLXsKLQl1MzIgdmFsOwotCi0JYXNtIHZvbGF0aWxlKCJtcnMgJTAsIHNjdGxyX2VsMSIgOiAiPXIiICh2YWwpKTsKLQl2YWwgJj0gfmNsZWFyOwotCXZhbCB8PSBzZXQ7Ci0JYXNtIHZvbGF0aWxlKCJtc3Igc2N0bHJfZWwxLCAlMCIgOiA6ICJyIiAodmFsKSk7Ci19Ci0KIC8qCiAgKiBVbmxpa2UgcmVhZF9jcHVpZCwgY2FsbHMgdG8gcmVhZF9zeXNyZWcgYXJlIG5ldmVyIGV4cGVjdGVkIHRvIGJlCiAgKiBvcHRpbWl6ZWQgYXdheSBvciByZXBsYWNlZCB3aXRoIHN5bnRoZXRpYyB2YWx1ZXMuCkBAIC0yNzMsMTIgKzI2NCw0MSBAQAogCV9fdmFsOwkJCQkJCQlcCiB9KQogCisvKgorICogVGhlICJaIiBjb25zdHJhaW50IG5vcm1hbGx5IG1lYW5zIGEgemVybyBpbW1lZGlhdGUsIGJ1dCB3aGVuIGNvbWJpbmVkIHdpdGgKKyAqIHRoZSAiJXgwIiB0ZW1wbGF0ZSBtZWFucyBYWlIuCisgKi8KICNkZWZpbmUgd3JpdGVfc3lzcmVnKHYsIHIpIGRvIHsJCQkJCVwKIAl1NjQgX192YWwgPSAodTY0KXY7CQkJCQlcCi0JYXNtIHZvbGF0aWxlKCJtc3IgIiBfX3N0cmluZ2lmeShyKSAiLCAlMCIJCVwKLQkJICAgICA6IDogInIiIChfX3ZhbCkpOwkJCQlcCisJYXNtIHZvbGF0aWxlKCJtc3IgIiBfX3N0cmluZ2lmeShyKSAiLCAleDAiCQlcCisJCSAgICAgOiA6ICJyWiIgKF9fdmFsKSk7CQkJCVwKIH0gd2hpbGUgKDApCiAKKy8qCisgKiBGb3IgcmVnaXN0ZXJzIHdpdGhvdXQgYXJjaGl0ZWN0dXJhbCBuYW1lcywgb3Igc2ltcGx5IHVuc3VwcG9ydGVkIGJ5CisgKiBHQVMuCisgKi8KKyNkZWZpbmUgcmVhZF9zeXNyZWdfcyhyKSAoewkJCQkJCVwKKwl1NjQgX192YWw7CQkJCQkJCVwKKwlhc20gdm9sYXRpbGUoIm1yc19zICUwLCAiIF9fc3RyaW5naWZ5KHIpIDogIj1yIiAoX192YWwpKTsJXAorCV9fdmFsOwkJCQkJCQkJXAorfSkKKworI2RlZmluZSB3cml0ZV9zeXNyZWdfcyh2LCByKSBkbyB7CQkJCQlcCisJdTY0IF9fdmFsID0gKHU2NCl2OwkJCQkJCVwKKwlhc20gdm9sYXRpbGUoIm1zcl9zICIgX19zdHJpbmdpZnkocikgIiwgJTAiIDogOiAicloiIChfX3ZhbCkpOwlcCit9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29uZmlnX3NjdGxyX2VsMSh1MzIgY2xlYXIsIHUzMiBzZXQpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHJlYWRfc3lzcmVnKHNjdGxyX2VsMSk7CisJdmFsICY9IH5jbGVhcjsKKwl2YWwgfD0gc2V0OworCXdyaXRlX3N5c3JlZyh2YWwsIHNjdGxyX2VsMSk7Cit9CisKICNlbmRpZgogCiAjZW5kaWYJLyogX19BU01fU1lTUkVHX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vc3lzdGVtX21pc2MuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vc3lzdGVtX21pc2MuaAppbmRleCA1N2YxMTBiLi5iYzgxMjQzIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3N5c3RlbV9taXNjLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zeXN0ZW1fbWlzYy5oCkBAIC01NiwxMiArNTYsNiBAQAogCV9fc2hvd19yYXRlbGltaXRlZDsJCQkJCQlcCiB9KQogCi0jZGVmaW5lIFVEQkdfVU5ERUZJTkVECSgxIDw8IDApCi0jZGVmaW5lIFVEQkdfU1lTQ0FMTAkoMSA8PCAxKQotI2RlZmluZSBVREJHX0JBREFCT1JUCSgxIDw8IDIpCi0jZGVmaW5lIFVEQkdfU0VHVgkoMSA8PCAzKQotI2RlZmluZSBVREJHX0JVUwkoMSA8PCA0KQotCiAjZW5kaWYJLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZgkvKiBfX0FTTV9TWVNURU1fTUlTQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggYWJkNjRiZC4uZTllYTVhNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtNzUsNiArNzUsOSBAQAogCiAvKgogICogc3RydWN0IHRocmVhZF9pbmZvIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSB2aWEgc3BfZWwwLgorICoKKyAqIFdlIGRvbid0IHVzZSByZWFkX3N5c3JlZygpIGFzIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNhY2hlIHRoZSB2YWx1ZSB3aGVyZQorICogcG9zc2libGUuCiAgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRocmVhZF9pbmZvICpjdXJyZW50X3RocmVhZF9pbmZvKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RsYmZsdXNoLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKaW5kZXggYjQ2MGFlMi4uZGVhYjUyMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdGxiZmx1c2guaApAQCAtMjUsNiArMjUsMjQgQEAKICNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgogCiAvKgorICogUmF3IFRMQkkgb3BlcmF0aW9ucy4KKyAqCisgKiBXaGVyZSBuZWNlc3NhcnksIHVzZSB0aGUgX190bGJpKCkgbWFjcm8gdG8gYXZvaWQgYXNtKCkKKyAqIGJvaWxlcnBsYXRlLiBEcml2ZXJzIGFuZCBtb3N0IGtlcm5lbCBjb2RlIHNob3VsZCB1c2UgdGhlIFRMQgorICogbWFuYWdlbWVudCByb3V0aW5lcyBpbiBwcmVmZXJlbmNlIHRvIHRoZSBtYWNybyBiZWxvdy4KKyAqCisgKiBUaGUgbWFjcm8gY2FuIGJlIHVzZWQgYXMgX190bGJpKG9wKSBvciBfX3RsYmkob3AsIGFyZyksIGRlcGVuZGluZworICogb24gd2hldGhlciBhIHBhcnRpY3VsYXIgVExCSSBvcGVyYXRpb24gdGFrZXMgYW4gYXJndW1lbnQgb3IKKyAqIG5vdC4gVGhlIG1hY3JvcyBoYW5kbGVzIGludm9raW5nIHRoZSBhc20gd2l0aCBvciB3aXRob3V0IHRoZQorICogcmVnaXN0ZXIgYXJndW1lbnQgYXMgYXBwcm9wcmlhdGUuCisgKi8KKyNkZWZpbmUgX19UTEJJXzAob3AsIGFyZykJCWFzbSAoInRsYmkgIiAjb3ApCisjZGVmaW5lIF9fVExCSV8xKG9wLCBhcmcpCQlhc20gKCJ0bGJpICIgI29wICIsICUwIiA6IDogInIiIChhcmcpKQorI2RlZmluZSBfX1RMQklfTihvcCwgYXJnLCBuLCAuLi4pCV9fVExCSV8jI24ob3AsIGFyZykKKworI2RlZmluZSBfX3RsYmkob3AsIC4uLikJCV9fVExCSV9OKG9wLCAjI19fVkFfQVJHU19fLCAxLCAwKQorCisvKgogICoJVExCIE1hbmFnZW1lbnQKICAqCT09PT09PT09PT09PT09CiAgKgpAQCAtNjYsNyArODQsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX2ZsdXNoX3RsYl9hbGwodm9pZCkKIHsKIAlkc2IobnNoc3QpOwotCWFzbSgidGxiaQl2bWFsbGUxIik7CisJX190bGJpKHZtYWxsZTEpOwogCWRzYihuc2gpOwogCWlzYigpOwogfQpAQCAtNzQsNyArOTIsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3RsYl9hbGwodm9pZCkKIHsKIAlkc2IoaXNoc3QpOwotCWFzbSgidGxiaQl2bWFsbGUxaXMiKTsKKwlfX3RsYmkodm1hbGxlMWlzKTsKIAlkc2IoaXNoKTsKIAlpc2IoKTsKIH0KQEAgLTg0LDcgKzEwMiw3IEBACiAJdW5zaWduZWQgbG9uZyBhc2lkID0gQVNJRChtbSkgPDwgNDg7CiAKIAlkc2IoaXNoc3QpOwotCWFzbSgidGxiaQlhc2lkZTFpcywgJTAiIDogOiAiciIgKGFzaWQpKTsKKwlfX3RsYmkoYXNpZGUxaXMsIGFzaWQpOwogCWRzYihpc2gpOwogfQogCkBAIC05NCw3ICsxMTIsNyBAQAogCXVuc2lnbmVkIGxvbmcgYWRkciA9IHVhZGRyID4+IDEyIHwgKEFTSUQodm1hLT52bV9tbSkgPDwgNDgpOwogCiAJZHNiKGlzaHN0KTsKLQlhc20oInRsYmkJdmFsZTFpcywgJTAiIDogOiAiciIgKGFkZHIpKTsKKwlfX3RsYmkodmFsZTFpcywgYWRkcik7CiAJZHNiKGlzaCk7CiB9CiAKQEAgLTEyMiw5ICsxNDAsOSBAQAogCWRzYihpc2hzdCk7CiAJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMSA8PCAoUEFHRV9TSElGVCAtIDEyKSkgewogCQlpZiAobGFzdF9sZXZlbCkKLQkJCWFzbSgidGxiaSB2YWxlMWlzLCAlMCIgOiA6ICJyIihhZGRyKSk7CisJCQlfX3RsYmkodmFsZTFpcywgYWRkcik7CiAJCWVsc2UKLQkJCWFzbSgidGxiaSB2YWUxaXMsICUwIiA6IDogInIiKGFkZHIpKTsKKwkJCV9fdGxiaSh2YWUxaXMsIGFkZHIpOwogCX0KIAlkc2IoaXNoKTsKIH0KQEAgLTE0OSw3ICsxNjcsNyBAQAogCiAJZHNiKGlzaHN0KTsKIAlmb3IgKGFkZHIgPSBzdGFydDsgYWRkciA8IGVuZDsgYWRkciArPSAxIDw8IChQQUdFX1NISUZUIC0gMTIpKQotCQlhc20oInRsYmkgdmFhZTFpcywgJTAiIDogOiAiciIoYWRkcikpOworCQlfX3RsYmkodmFhZTFpcywgYWRkcik7CiAJZHNiKGlzaCk7CiAJaXNiKCk7CiB9CkBAIC0xNjMsNyArMTgxLDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSB1YWRkciA+PiAxMiB8IChBU0lEKG1tKSA8PCA0OCk7CiAKLQlhc20oInRsYmkJdmFlMWlzLCAlMCIgOiA6ICJyIiAoYWRkcikpOworCV9fdGxiaSh2YWUxaXMsIGFkZHIpOwogCWRzYihpc2gpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RyYXBzLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RyYXBzLmgKaW5kZXggOWNkMDNmMy4uMDJlOTAzNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90cmFwcy5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdHJhcHMuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBfX0FTTV9UUkFQX0gKIAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KIAogc3RydWN0IHB0X3JlZ3M7CiAKQEAgLTM5LDkgKzQwLDYgQEAKICNpZmRlZiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSCiBzdGF0aWMgaW5saW5lIGludCBfX2luX2lycWVudHJ5X3RleHQodW5zaWduZWQgbG9uZyBwdHIpCiB7Ci0JZXh0ZXJuIGNoYXIgX19pcnFlbnRyeV90ZXh0X3N0YXJ0W107Ci0JZXh0ZXJuIGNoYXIgX19pcnFlbnRyeV90ZXh0X2VuZFtdOwotCiAJcmV0dXJuIHB0ciA+PSAodW5zaWduZWQgbG9uZykmX19pcnFlbnRyeV90ZXh0X3N0YXJ0ICYmCiAJICAgICAgIHB0ciA8ICh1bnNpZ25lZCBsb25nKSZfX2lycWVudHJ5X3RleHRfZW5kOwogfQpAQCAtNTQsOCArNTIsNiBAQAogCiBzdGF0aWMgaW5saW5lIGludCBpbl9leGNlcHRpb25fdGV4dCh1bnNpZ25lZCBsb25nIHB0cikKIHsKLQlleHRlcm4gY2hhciBfX2V4Y2VwdGlvbl90ZXh0X3N0YXJ0W107Ci0JZXh0ZXJuIGNoYXIgX19leGNlcHRpb25fdGV4dF9lbmRbXTsKIAlpbnQgaW47CiAKIAlpbiA9IHB0ciA+PSAodW5zaWduZWQgbG9uZykmX19leGNlcHRpb25fdGV4dF9zdGFydCAmJgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS92aXJ0LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3ZpcnQuaAppbmRleCAxNzg4NTQ1Li5mZWExMDczIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3ZpcnQuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3ZpcnQuaApAQCAtNDUsNiArNDUsOCBAQAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vc3lzcmVnLmg+CiAKIC8qCiAgKiBfX2Jvb3RfY3B1X21vZGUgcmVjb3JkcyB3aGF0IG1vZGUgQ1BVcyB3ZXJlIGJvb3RlZCBpbi4KQEAgLTc1LDEwICs3Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19rZXJuZWxfaW5faHlwX21vZGUodm9pZCkKIHsKLQl1NjQgZWw7Ci0KLQlhc20oIm1ycyAlMCwgQ3VycmVudEVMIiA6ICI9ciIgKGVsKSk7Ci0JcmV0dXJuIGVsID09IEN1cnJlbnRFTF9FTDI7CisJcmV0dXJuIHJlYWRfc3lzcmVnKEN1cnJlbnRFTCkgPT0gQ3VycmVudEVMX0VMMjsKIH0KIAogI2lmZGVmIENPTkZJR19BUk02NF9WSEUKQEAgLTg3LDE0ICs4Niw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgdmVyaWZ5X2NwdV9ydW5fZWwodm9pZCkge30KICNlbmRpZgogCi0vKiBUaGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBoeXBlcnZpc29yIGlkbWFwIHRleHQgKi8KLWV4dGVybiBjaGFyIF9faHlwX2lkbWFwX3RleHRfc3RhcnRbXTsKLWV4dGVybiBjaGFyIF9faHlwX2lkbWFwX3RleHRfZW5kW107Ci0KLS8qIFRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGh5cGVydmlzb3IgdGV4dCAqLwotZXh0ZXJuIGNoYXIgX19oeXBfdGV4dF9zdGFydFtdOwotZXh0ZXJuIGNoYXIgX19oeXBfdGV4dF9lbmRbXTsKLQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogISBfX0FTTV9fVklSVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCmluZGV4IDE0ZjdiNjUuLjdkNjZiYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCkBAIC0xMCw2ICsxMCw4IEBACiBDRkxBR1NfUkVNT1ZFX2luc24ubyA9IC1wZwogQ0ZMQUdTX1JFTU9WRV9yZXR1cm5fYWRkcmVzcy5vID0gLXBnCiAKK0NGTEFHU19zZXR1cC5vID0gLURVVFNfTUFDSElORT0nIiQoVVRTX01BQ0hJTkUpIicKKwogIyBPYmplY3QgZmlsZSBsaXN0cy4KIGFybTY0LW9iai15CQk6PSBkZWJ1Zy1tb25pdG9ycy5vIGVudHJ5Lm8gaXJxLm8gZnBzaW1kLm8JCVwKIAkJCSAgIGVudHJ5LWZwc2ltZC5vIHByb2Nlc3MubyBwdHJhY2UubyBzZXR1cC5vIHNpZ25hbC5vCVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2FjcGkuYyBiL2FyY2gvYXJtNjQva2VybmVsL2FjcGkuYwppbmRleCAzZTRmMWE0Li4yNTJhNmQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9hY3BpLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvYWNwaS5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogCiAjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KICNpbmNsdWRlIDxhc20vY3B1X29wcy5oPgpAQCAtMjA2LDcgKzIwNyw3IEBACiAJaWYgKHBhcmFtX2FjcGlfb2ZmIHx8CiAJICAgICghcGFyYW1fYWNwaV9vbiAmJiAhcGFyYW1fYWNwaV9mb3JjZSAmJgogCSAgICAgb2Zfc2Nhbl9mbGF0X2R0KGR0X3NjYW5fZGVwdGgxX25vZGVzLCBOVUxMKSkpCi0JCXJldHVybjsKKwkJZ290byBkb25lOwogCiAJLyoKIAkgKiBBQ1BJIGlzIGRpc2FibGVkIGF0IHRoaXMgcG9pbnQuIEVuYWJsZSBpdCBpbiBvcmRlciB0byBwYXJzZQpAQCAtMjI2LDYgKzIyNywxNCBAQAogCQlpZiAoIXBhcmFtX2FjcGlfZm9yY2UpCiAJCQlkaXNhYmxlX2FjcGkoKTsKIAl9CisKK2RvbmU6CisJaWYgKGFjcGlfZGlzYWJsZWQpIHsKKwkJaWYgKGVhcmx5Y29uX2luaXRfaXNfZGVmZXJyZWQpCisJCQllYXJseV9pbml0X2R0X3NjYW5fY2hvc2VuX3N0ZG91dCgpOworCX0gZWxzZSB7CisJCXBhcnNlX3NwY3IoZWFybHljb25faW5pdF9pc19kZWZlcnJlZCk7CisJfQogfQogCiAjaWZkZWYgQ09ORklHX0FDUElfQVBFSQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvYWNwaV9udW1hLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9hY3BpX251bWEuYwppbmRleCBmODUxNDljLi5mMDFmYWI2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9hY3BpX251bWEuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9hY3BpX251bWEuYwpAQCAtMTA1LDggKzEwNSwxMCBAQAogCWludCByZXQ7CiAKIAlyZXQgPSBhY3BpX251bWFfaW5pdCgpOwotCWlmIChyZXQpCisJaWYgKHJldCkgeworCQlwcl9pbmZvKCJGYWlsZWQgdG8gaW5pdGlhbGlzZSBmcm9tIGZpcm13YXJlXG4iKTsKIAkJcmV0dXJuIHJldDsKKwl9CiAKIAlyZXR1cm4gc3JhdF9kaXNhYmxlZCgpID8gLUVJTlZBTCA6IDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9hbHRlcm5hdGl2ZS5jIGIvYXJjaC9hcm02NC9rZXJuZWwvYWx0ZXJuYXRpdmUuYwppbmRleCBkMmVlMWIyLi4wNmQ2NTBmIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9hbHRlcm5hdGl2ZS5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2FsdGVybmF0aXZlLmMKQEAgLTI1LDE0ICsyNSwxMyBAQAogI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS5oPgogI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CiAjaW5jbHVkZSA8YXNtL2luc24uaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9zdG9wX21hY2hpbmUuaD4KIAogI2RlZmluZSBfX0FMVF9QVFIoYSxmKQkJKHUzMiAqKSgodm9pZCAqKSYoYSktPmYgKyAoYSktPmYpCiAjZGVmaW5lIEFMVF9PUklHX1BUUihhKQkJX19BTFRfUFRSKGEsIG9yaWdfb2Zmc2V0KQogI2RlZmluZSBBTFRfUkVQTF9QVFIoYSkJCV9fQUxUX1BUUihhLCBhbHRfb2Zmc2V0KQogCi1leHRlcm4gc3RydWN0IGFsdF9pbnN0ciBfX2FsdF9pbnN0cnVjdGlvbnNbXSwgX19hbHRfaW5zdHJ1Y3Rpb25zX2VuZFtdOwotCiBzdHJ1Y3QgYWx0X3JlZ2lvbiB7CiAJc3RydWN0IGFsdF9pbnN0ciAqYmVnaW47CiAJc3RydWN0IGFsdF9pbnN0ciAqZW5kOwpAQCAtNTksNiArNTgsOCBAQAogCUJVRygpOwogfQogCisjZGVmaW5lIGFsaWduX2Rvd24oeCwgYSkJKCh1bnNpZ25lZCBsb25nKSh4KSAmIH4oKCh1bnNpZ25lZCBsb25nKShhKSkgLSAxKSkKKwogc3RhdGljIHUzMiBnZXRfYWx0X2luc24oc3RydWN0IGFsdF9pbnN0ciAqYWx0LCB1MzIgKmluc25wdHIsIHUzMiAqYWx0aW5zbnB0cikKIHsKIAl1MzIgaW5zbjsKQEAgLTgwLDYgKzgxLDI1IEBACiAJCQlvZmZzZXQgPSB0YXJnZXQgLSAodW5zaWduZWQgbG9uZylpbnNucHRyOwogCQkJaW5zbiA9IGFhcmNoNjRfc2V0X2JyYW5jaF9vZmZzZXQoaW5zbiwgb2Zmc2V0KTsKIAkJfQorCX0gZWxzZSBpZiAoYWFyY2g2NF9pbnNuX2lzX2FkcnAoaW5zbikpIHsKKwkJczMyIG9yaWdfb2Zmc2V0LCBuZXdfb2Zmc2V0OworCQl1bnNpZ25lZCBsb25nIHRhcmdldDsKKworCQkvKgorCQkgKiBJZiB3ZSdyZSByZXBsYWNpbmcgYW4gYWRycCBpbnN0cnVjdGlvbiwgd2hpY2ggdXNlcyBQQy1yZWxhdGl2ZQorCQkgKiBpbW1lZGlhdGUgYWRkcmVzc2luZywgYWRqdXN0IHRoZSBvZmZzZXQgdG8gcmVmbGVjdCB0aGUgbmV3CisJCSAqIFBDLiBhZHJwIG9wZXJhdGVzIG9uIDRLIGFsaWduZWQgYWRkcmVzc2VzLgorCQkgKi8KKwkJb3JpZ19vZmZzZXQgID0gYWFyY2g2NF9pbnNuX2FkcnBfZ2V0X29mZnNldChpbnNuKTsKKwkJdGFyZ2V0ID0gYWxpZ25fZG93bihhbHRpbnNucHRyLCBTWl80SykgKyBvcmlnX29mZnNldDsKKwkJbmV3X29mZnNldCA9IHRhcmdldCAtIGFsaWduX2Rvd24oaW5zbnB0ciwgU1pfNEspOworCQlpbnNuID0gYWFyY2g2NF9pbnNuX2FkcnBfc2V0X29mZnNldChpbnNuLCBuZXdfb2Zmc2V0KTsKKwl9IGVsc2UgaWYgKGFhcmNoNjRfaW5zbl91c2VzX2xpdGVyYWwoaW5zbikpIHsKKwkJLyoKKwkJICogRGlzYWxsb3cgcGF0Y2hpbmcgdW5oYW5kbGVkIGluc3RydWN0aW9ucyB1c2luZyBQQyByZWxhdGl2ZQorCQkgKiBsaXRlcmFsIGFkZHJlc3NlcworCQkgKi8KKwkJQlVHKCk7CiAJfQogCiAJcmV0dXJuIGluc247CkBAIC0xMjQsOCArMTQ0LDggQEAKIHsKIAlzdGF0aWMgaW50IHBhdGNoZWQgPSAwOwogCXN0cnVjdCBhbHRfcmVnaW9uIHJlZ2lvbiA9IHsKLQkJLmJlZ2luCT0gX19hbHRfaW5zdHJ1Y3Rpb25zLAotCQkuZW5kCT0gX19hbHRfaW5zdHJ1Y3Rpb25zX2VuZCwKKwkJLmJlZ2luCT0gKHN0cnVjdCBhbHRfaW5zdHIgKilfX2FsdF9pbnN0cnVjdGlvbnMsCisJCS5lbmQJPSAoc3RydWN0IGFsdF9pbnN0ciAqKV9fYWx0X2luc3RydWN0aW9uc19lbmQsCiAJfTsKIAogCS8qIFdlIGFsd2F5cyBoYXZlIGEgQ1BVIDAgYXQgdGhpcyBwb2ludCAoX19pbml0KSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvYXJtNjQva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggMDUwNzBiNy4uNGEyZjBmMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KICNpbmNsdWRlIDxhc20vc21wX3BsYXQuaD4KQEAgLTE0NSw1ICsxNDYsNiBAQAogICBERUZJTkUoSElCRVJOX1BCRV9PUklHLAlvZmZzZXRvZihzdHJ1Y3QgcGJlLCBvcmlnX2FkZHJlc3MpKTsKICAgREVGSU5FKEhJQkVSTl9QQkVfQUREUiwJb2Zmc2V0b2Yoc3RydWN0IHBiZSwgYWRkcmVzcykpOwogICBERUZJTkUoSElCRVJOX1BCRV9ORVhULAlvZmZzZXRvZihzdHJ1Y3QgcGJlLCBuZXh0KSk7CisgIERFRklORShBUk02NF9GVFJfU1lTVkFMLAlvZmZzZXRvZihzdHJ1Y3QgYXJtNjRfZnRyX3JlZywgc3lzX3ZhbCkpOwogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NhY2hlaW5mby5jIGIvYXJjaC9hcm02NC9rZXJuZWwvY2FjaGVpbmZvLmMKaW5kZXggYjg2MjlkNS4uOTYxNzMwMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY2FjaGVpbmZvLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvY2FjaGVpbmZvLmMKQEAgLTM5LDcgKzM5LDcgQEAKIAogCWlmIChsZXZlbCA+IE1BWF9DQUNIRV9MRVZFTCkKIAkJcmV0dXJuIENBQ0hFX1RZUEVfTk9DQUNIRTsKLQlhc20gdm9sYXRpbGUgKCJtcnMgICAgICV4MCwgY2xpZHJfZWwxIiA6ICI9ciIgKGNsaWRyKSk7CisJY2xpZHIgPSByZWFkX3N5c3JlZyhjbGlkcl9lbDEpOwogCXJldHVybiBDTElEUl9DVFlQRShjbGlkciwgbGV2ZWwpOwogfQogCkBAIC01NSwxMSArNTUsOSBAQAogCiAJV0FSTl9PTihwcmVlbXB0aWJsZSgpKTsKIAotCS8qIFB1dCB2YWx1ZSBpbnRvIENTU0VMUiAqLwotCWFzbSB2b2xhdGlsZSgibXNyIGNzc2Vscl9lbDEsICV4MCIgOiA6ICJyIiAoY3NzZWxyKSk7CisJd3JpdGVfc3lzcmVnKGNzc2VsciwgY3NzZWxyX2VsMSk7CiAJaXNiKCk7Ci0JLyogUmVhZCByZXN1bHQgb3V0IG9mIENDU0lEUiAqLwotCWFzbSB2b2xhdGlsZSgibXJzICV4MCwgY2NzaWRyX2VsMSIgOiAiPXIiIChjY3NpZHIpKTsKKwljY3NpZHIgPSByZWFkX3N5c3JlZyhjY3NpZHJfZWwxKTsKIAogCXJldHVybiBjY3NpZHI7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVfZXJyYXRhLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVfZXJyYXRhLmMKaW5kZXggODJiMGZjMi4uMDE1MDM5NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1X2VycmF0YS5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdV9lcnJhdGEuYwpAQCAtMzAsNiArMzAsMjEgQEAKIAkJCQkgICAgICAgZW50cnktPm1pZHJfcmFuZ2VfbWF4KTsKIH0KIAorc3RhdGljIGJvb2wKK2hhc19taXNtYXRjaGVkX2NhY2hlX2xpbmVfc2l6ZShjb25zdCBzdHJ1Y3QgYXJtNjRfY3B1X2NhcGFiaWxpdGllcyAqZW50cnksCisJCQkJaW50IHNjb3BlKQoreworCVdBUk5fT04oc2NvcGUgIT0gU0NPUEVfTE9DQUxfQ1BVIHx8IHByZWVtcHRpYmxlKCkpOworCXJldHVybiAocmVhZF9jcHVpZF9jYWNoZXR5cGUoKSAmIGFybTY0X2Z0cl9yZWdfY3RyZWwwLnN0cmljdF9tYXNrKSAhPQorCQkoYXJtNjRfZnRyX3JlZ19jdHJlbDAuc3lzX3ZhbCAmIGFybTY0X2Z0cl9yZWdfY3RyZWwwLnN0cmljdF9tYXNrKTsKK30KKworc3RhdGljIHZvaWQgY3B1X2VuYWJsZV90cmFwX2N0cl9hY2Nlc3Modm9pZCAqX191bnVzZWQpCit7CisJLyogQ2xlYXIgU0NUTFJfRUwxLlVDVCAqLworCWNvbmZpZ19zY3Rscl9lbDEoU0NUTFJfRUwxX1VDVCwgMCk7Cit9CisKICNkZWZpbmUgTUlEUl9SQU5HRShtb2RlbCwgbWluLCBtYXgpIFwKIAkuZGVmX3Njb3BlID0gU0NPUEVfTE9DQUxfQ1BVLCBcCiAJLm1hdGNoZXMgPSBpc19hZmZlY3RlZF9taWRyX3JhbmdlLCBcCkBAIC0xMDgsNiArMTIzLDEzIEBACiAJfSwKICNlbmRpZgogCXsKKwkJLmRlc2MgPSAiTWlzbWF0Y2hlZCBjYWNoZSBsaW5lIHNpemUiLAorCQkuY2FwYWJpbGl0eSA9IEFSTTY0X01JU01BVENIRURfQ0FDSEVfTElORV9TSVpFLAorCQkubWF0Y2hlcyA9IGhhc19taXNtYXRjaGVkX2NhY2hlX2xpbmVfc2l6ZSwKKwkJLmRlZl9zY29wZSA9IFNDT1BFX0xPQ0FMX0NQVSwKKwkJLmVuYWJsZSA9IGNwdV9lbmFibGVfdHJhcF9jdHJfYWNjZXNzLAorCX0sCisJewogCX0KIH07CiAKQEAgLTExNiw3ICsxMzgsNyBAQAogICogYW5kIHRoZSByZWxhdGVkIGluZm9ybWF0aW9uIGlzIGZyZWVkIHNvb24gYWZ0ZXIuIElmIHRoZSBuZXcgQ1BVIHJlcXVpcmVzCiAgKiBhbiBlcnJhdGEgbm90IGRldGVjdGVkIGF0IGJvb3QsIGZhaWwgdGhpcyBDUFUuCiAgKi8KLXZvaWQgdmVyaWZ5X2xvY2FsX2NwdV9lcnJhdGEodm9pZCkKK3ZvaWQgdmVyaWZ5X2xvY2FsX2NwdV9lcnJhdGFfd29ya2Fyb3VuZHModm9pZCkKIHsKIAljb25zdCBzdHJ1Y3QgYXJtNjRfY3B1X2NhcGFiaWxpdGllcyAqY2FwcyA9IGFybTY0X2VycmF0YTsKIApAQCAtMTMxLDcgKzE1Myw3IEBACiAJCX0KIH0KIAotdm9pZCBjaGVja19sb2NhbF9jcHVfZXJyYXRhKHZvaWQpCit2b2lkIHVwZGF0ZV9jcHVfZXJyYXRhX3dvcmthcm91bmRzKHZvaWQpCiB7CiAJdXBkYXRlX2NwdV9jYXBhYmlsaXRpZXMoYXJtNjRfZXJyYXRhLCAiZW5hYmxpbmcgd29ya2Fyb3VuZCBmb3IiKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NwdV9vcHMuYyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdV9vcHMuYwppbmRleCBjN2NmYjhmLi5lMTM3Y2VhIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVfb3BzLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1X29wcy5jCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KQEAgLTI4LDcgKzI5LDcgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgY3B1X29wZXJhdGlvbnMgYWNwaV9wYXJraW5nX3Byb3RvY29sX29wczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgY3B1X29wZXJhdGlvbnMgY3B1X3BzY2lfb3BzOwogCi1jb25zdCBzdHJ1Y3QgY3B1X29wZXJhdGlvbnMgKmNwdV9vcHNbTlJfQ1BVU107Citjb25zdCBzdHJ1Y3QgY3B1X29wZXJhdGlvbnMgKmNwdV9vcHNbTlJfQ1BVU10gX19yb19hZnRlcl9pbml0OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNwdV9vcGVyYXRpb25zICpkdF9zdXBwb3J0ZWRfY3B1X29wc1tdIF9faW5pdGNvbnN0ID0gewogCSZzbXBfc3Bpbl90YWJsZV9vcHMsCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMKaW5kZXggNjIyNzJlYS4uZDU3N2YyNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYwpAQCAtNDYsNiArNDYsOSBAQAogCiBERUNMQVJFX0JJVE1BUChjcHVfaHdjYXBzLCBBUk02NF9OQ0FQUyk7CiAKK0RFRklORV9TVEFUSUNfS0VZX0FSUkFZX0ZBTFNFKGNwdV9od2NhcF9rZXlzLCBBUk02NF9OQ0FQUyk7CitFWFBPUlRfU1lNQk9MKGNwdV9od2NhcF9rZXlzKTsKKwogI2RlZmluZSBfX0FSTTY0X0ZUUl9CSVRTKFNJR05FRCwgU1RSSUNULCBUWVBFLCBTSElGVCwgV0lEVEgsIFNBRkVfVkFMKSBcCiAJewkJCQkJCVwKIAkJLnNpZ24gPSBTSUdORUQsCQkJCVwKQEAgLTc0LDcgKzc3LDcgQEAKIGNwdWZlYXR1cmVfcGFuX25vdF91YW8oY29uc3Qgc3RydWN0IGFybTY0X2NwdV9jYXBhYmlsaXRpZXMgKmVudHJ5LCBpbnQgX191bnVzZWQpOwogCiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRpc2FyMFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NGlzYXIwW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAzMiwgMzIsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgSURfQUE2NElTQVIwX1JETV9TSElGVCwgNCwgMCksCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAyNCwgNCwgMCksCkBAIC04Nyw3ICs5MCw3IEBACiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRwZnIwW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0cGZyMFtdID0gewogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgMzIsIDMyLCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDI4LCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIElEX0FBNjRQRlIwX0dJQ19TSElGVCwgNCwgMCksCkBAIC0xMDEsNyArMTA0LDcgQEAKIAlBUk02NF9GVFJfRU5ELAogfTsKIAotc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NG1tZnIwW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0bW1mcjBbXSA9IHsKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDMyLCAzMiwgMCksCiAJU19BUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIElEX0FBNjRNTUZSMF9UR1JBTjRfU0hJRlQsIDQsIElEX0FBNjRNTUZSMF9UR1JBTjRfTkkpLAogCVNfQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCBJRF9BQTY0TU1GUjBfVEdSQU42NF9TSElGVCwgNCwgSURfQUE2NE1NRlIwX1RHUkFONjRfTkkpLApAQCAtMTE5LDcgKzEyMiw3IEBACiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRtbWZyMVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NG1tZnIxW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAzMiwgMzIsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0TU1GUjFfUEFOX1NISUZULCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIElEX0FBNjRNTUZSMV9MT1JfU0hJRlQsIDQsIDApLApAQCAtMTMwLDcgKzEzMyw3IEBACiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRtbWZyMltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NG1tZnIyW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCBJRF9BQTY0TU1GUjJfTFZBX1NISUZULCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIElEX0FBNjRNTUZSMl9JRVNCX1NISUZULCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIElEX0FBNjRNTUZSMl9MU01fU0hJRlQsIDQsIDApLApAQCAtMTM5LDcgKzE0Miw3IEBACiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2N0cltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfY3RyW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAzMSwgMSwgMSksCS8qIFJBTyAqLwogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgMjgsIDMsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9ISUdIRVJfU0FGRSwgMjQsIDQsIDApLAkvKiBDV0cgKi8KQEAgLTE0NywxNSArMTUwLDIxIEBACiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIDE2LCA0LCAxKSwJLyogRG1pbkxpbmUgKi8KIAkvKgogCSAqIExpbnV4IGNhbiBoYW5kbGUgZGlmZmVyaW5nIEktY2FjaGUgcG9saWNpZXMuIFVzZXJzcGFjZSBKSVRzIHdpbGwKLQkgKiBtYWtlIHVzZSBvZiAqbWluTGluZQorCSAqIG1ha2UgdXNlIG9mICptaW5MaW5lLgorCSAqIElmIHdlIGhhdmUgZGlmZmVyaW5nIEktY2FjaGUgcG9saWNpZXMsIHJlcG9ydCBpdCBhcyB0aGUgd2Vha2VzdCAtIEFJVklWVC4KIAkgKi8KLQlBUk02NF9GVFJfQklUUyhGVFJfTk9OU1RSSUNULCBGVFJfRVhBQ1QsIDE0LCAyLCAwKSwJLyogTDFJcCAqLworCUFSTTY0X0ZUUl9CSVRTKEZUUl9OT05TVFJJQ1QsIEZUUl9FWEFDVCwgMTQsIDIsIElDQUNIRV9QT0xJQ1lfQUlWSVZUKSwJLyogTDFJcCAqLwogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgNCwgMTAsIDApLAkvKiBSQVogKi8KIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgMCwgNCwgMCksCS8qIEltaW5MaW5lICovCiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX21tZnIwW10gPSB7CitzdHJ1Y3QgYXJtNjRfZnRyX3JlZyBhcm02NF9mdHJfcmVnX2N0cmVsMCA9IHsKKwkubmFtZQkJPSAiU1lTX0NUUl9FTDAiLAorCS5mdHJfYml0cwk9IGZ0cl9jdHIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX21tZnIwW10gPSB7CiAJU19BUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDI4LCA0LCAweGYpLAkvKiBJbm5lclNociAqLwogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgMjQsIDQsIDApLAkvKiBGQ1NFICovCiAJQVJNNjRfRlRSX0JJVFMoRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIDIwLCA0LCAwKSwJLyogQXV4UmVnICovCkBAIC0xNjcsNyArMTc2LDcgQEAKIAlBUk02NF9GVFJfRU5ELAogfTsKIAotc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NGRmcjBbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRkZnIwW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAzMiwgMzIsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0REZSMF9DVFhfQ01QU19TSElGVCwgNCwgMCksCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRERlIwX1dSUFNfU0hJRlQsIDQsIDApLApAQCAtMTc4LDE0ICsxODcsMTQgQEAKIAlBUk02NF9GVFJfRU5ELAogfTsKIAotc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfbXZmcjJbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX212ZnIyW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCA4LCAyNCwgMCksCS8qIFJBWiAqLwogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgNCwgNCwgMCksCQkvKiBGUE1pc2MgKi8KIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDAsIDQsIDApLAkJLyogU0lNRE1pc2MgKi8KIAlBUk02NF9GVFJfRU5ELAogfTsKIAotc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfZGN6aWRbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2RjemlkW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCA1LCAyNywgMCksCS8qIFJBWiAqLwogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgNCwgMSwgMSksCQkvKiBEWlAgKi8KIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgMCwgNCwgMCksCS8qIEJTICovCkBAIC0xOTMsNyArMjAyLDcgQEAKIH07CiAKIAotc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfaXNhcjVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2lzYXI1W10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCBJRF9JU0FSNV9SRE1fU0hJRlQsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgMjAsIDQsIDApLAkvKiBSQVogKi8KIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIElEX0lTQVI1X0NSQzMyX1NISUZULCA0LCAwKSwKQEAgLTIwNCwxNCArMjEzLDE0IEBACiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX21tZnI0W10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9tbWZyNFtdID0gewogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgOCwgMjQsIDApLAkvKiBSQVogKi8KIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDQsIDQsIDApLAkJLyogYWMyICovCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAwLCA0LCAwKSwJCS8qIFJBWiAqLwogCUFSTTY0X0ZUUl9FTkQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9wZnIwW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9wZnIwW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAxNiwgMTYsIDApLAkvKiBSQVogKi8KIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDEyLCA0LCAwKSwJLyogU3RhdGUzICovCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCA4LCA0LCAwKSwJCS8qIFN0YXRlMiAqLwpAQCAtMjIwLDcgKzIyOSw3IEBACiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2RmcjBbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2RmcjBbXSA9IHsKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgMjgsIDQsIDApLAogCVNfQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIDI0LCA0LCAweGYpLAkvKiBQZXJmTW9uICovCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIDIwLCA0LCAwKSwKQEAgLTIzOCw3ICsyNDcsNyBAQAogICogMC4gQ292ZXJzIHRoZSBmb2xsb3dpbmcgMzJiaXQgcmVnaXN0ZXJzOgogICogaWRfaXNhclswLTRdLCBpZF9tbWZyWzEtM10sIGlkX3BmcjEsIG12ZnJbMC0xXQogICovCi1zdGF0aWMgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9nZW5lcmljXzMyYml0c1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfZ2VuZXJpY18zMmJpdHNbXSA9IHsKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgMjgsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCAyNCwgNCwgMCksCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIDIwLCA0LCAwKSwKQEAgLTI1MCwyOSArMjU5LDMyIEBACiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2dlbmVyaWNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2dlbmVyaWNbXSA9IHsKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDAsIDY0LCAwKSwKIAlBUk02NF9GVFJfRU5ELAogfTsKIAotc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfZ2VuZXJpYzMyW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9nZW5lcmljMzJbXSA9IHsKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDAsIDMyLCAwKSwKIAlBUk02NF9GVFJfRU5ELAogfTsKIAotc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfYWE2NHJheltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfYWE2NHJheltdID0gewogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgMCwgNjQsIDApLAogCUFSTTY0X0ZUUl9FTkQsCiB9OwogCi0jZGVmaW5lIEFSTTY0X0ZUUl9SRUcoaWQsIHRhYmxlKQkJXAotCXsJCQkJCVwKLQkJLnN5c19pZCA9IGlkLAkJCVwKKyNkZWZpbmUgQVJNNjRfRlRSX1JFRyhpZCwgdGFibGUpIHsJCVwKKwkuc3lzX2lkID0gaWQsCQkJCVwKKwkucmVnID0gCSYoc3RydWN0IGFybTY0X2Z0cl9yZWcpewlcCiAJCS5uYW1lID0gI2lkLAkJCVwKIAkJLmZ0cl9iaXRzID0gJigodGFibGUpWzBdKSwJXAotCX0KKwl9fQogCi1zdGF0aWMgc3RydWN0IGFybTY0X2Z0cl9yZWcgYXJtNjRfZnRyX3JlZ3NbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgX19mdHJfcmVnX2VudHJ5IHsKKwl1MzIJCQlzeXNfaWQ7CisJc3RydWN0IGFybTY0X2Z0cl9yZWcgCSpyZWc7Cit9IGFybTY0X2Z0cl9yZWdzW10gPSB7CiAKIAkvKiBPcDEgPSAwLCBDUm4gPSAwLCBDUm0gPSAxICovCiAJQVJNNjRfRlRSX1JFRyhTWVNfSURfUEZSMF9FTDEsIGZ0cl9pZF9wZnIwKSwKQEAgLTMxNSw3ICszMjcsNyBAQAogCUFSTTY0X0ZUUl9SRUcoU1lTX0lEX0FBNjRNTUZSMl9FTDEsIGZ0cl9pZF9hYTY0bW1mcjIpLAogCiAJLyogT3AxID0gMywgQ1JuID0gMCwgQ1JtID0gMCAqLwotCUFSTTY0X0ZUUl9SRUcoU1lTX0NUUl9FTDAsIGZ0cl9jdHIpLAorCXsgU1lTX0NUUl9FTDAsICZhcm02NF9mdHJfcmVnX2N0cmVsMCB9LAogCUFSTTY0X0ZUUl9SRUcoU1lTX0RDWklEX0VMMCwgZnRyX2RjemlkKSwKIAogCS8qIE9wMSA9IDMsIENSbiA9IDE0LCBDUm0gPSAwICovCkBAIC0zMjQsNyArMzM2LDcgQEAKIAogc3RhdGljIGludCBzZWFyY2hfY21wX2Z0cl9yZWcoY29uc3Qgdm9pZCAqaWQsIGNvbnN0IHZvaWQgKnJlZ3ApCiB7Ci0JcmV0dXJuIChpbnQpKHVuc2lnbmVkIGxvbmcpaWQgLSAoaW50KSgoY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9yZWcgKilyZWdwKS0+c3lzX2lkOworCXJldHVybiAoaW50KSh1bnNpZ25lZCBsb25nKWlkIC0gKGludCkoKGNvbnN0IHN0cnVjdCBfX2Z0cl9yZWdfZW50cnkgKilyZWdwKS0+c3lzX2lkOwogfQogCiAvKgpAQCAtMzM5LDE0ICszNTEsMjAgQEAKICAqLwogc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfcmVnICpnZXRfYXJtNjRfZnRyX3JlZyh1MzIgc3lzX2lkKQogewotCXJldHVybiBic2VhcmNoKChjb25zdCB2b2lkICopKHVuc2lnbmVkIGxvbmcpc3lzX2lkLAorCWNvbnN0IHN0cnVjdCBfX2Z0cl9yZWdfZW50cnkgKnJldDsKKworCXJldCA9IGJzZWFyY2goKGNvbnN0IHZvaWQgKikodW5zaWduZWQgbG9uZylzeXNfaWQsCiAJCQlhcm02NF9mdHJfcmVncywKIAkJCUFSUkFZX1NJWkUoYXJtNjRfZnRyX3JlZ3MpLAogCQkJc2l6ZW9mKGFybTY0X2Z0cl9yZWdzWzBdKSwKIAkJCXNlYXJjaF9jbXBfZnRyX3JlZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldC0+cmVnOworCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdTY0IGFybTY0X2Z0cl9zZXRfdmFsdWUoc3RydWN0IGFybTY0X2Z0cl9iaXRzICpmdHJwLCBzNjQgcmVnLCBzNjQgZnRyX3ZhbCkKK3N0YXRpYyB1NjQgYXJtNjRfZnRyX3NldF92YWx1ZShjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgKmZ0cnAsIHM2NCByZWcsCisJCQkgICAgICAgczY0IGZ0cl92YWwpCiB7CiAJdTY0IG1hc2sgPSBhcm02NF9mdHJfbWFzayhmdHJwKTsKIApAQCAtMzU1LDcgKzM3Myw4IEBACiAJcmV0dXJuIHJlZzsKIH0KIAotc3RhdGljIHM2NCBhcm02NF9mdHJfc2FmZV92YWx1ZShzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgKmZ0cnAsIHM2NCBuZXcsIHM2NCBjdXIpCitzdGF0aWMgczY0IGFybTY0X2Z0cl9zYWZlX3ZhbHVlKGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyAqZnRycCwgczY0IG5ldywKKwkJCQlzNjQgY3VyKQogewogCXM2NCByZXQgPSAwOwogCkBAIC0zNzYsMjcgKzM5NSwxMyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHNvcnRfY21wX2Z0cl9yZWdzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCi17Ci0JcmV0dXJuICgoY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9yZWcgKilhKS0+c3lzX2lkIC0KLQkJICgoY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9yZWcgKiliKS0+c3lzX2lkOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgc3dhcF9mdHJfcmVncyh2b2lkICphLCB2b2lkICpiLCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgYXJtNjRfZnRyX3JlZyB0bXAgPSAqKHN0cnVjdCBhcm02NF9mdHJfcmVnICopYTsKLQkqKHN0cnVjdCBhcm02NF9mdHJfcmVnICopYSA9ICooc3RydWN0IGFybTY0X2Z0cl9yZWcgKiliOwotCSooc3RydWN0IGFybTY0X2Z0cl9yZWcgKiliID0gdG1wOwotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgc29ydF9mdHJfcmVncyh2b2lkKQogewotCS8qIEtlZXAgdGhlIGFycmF5IHNvcnRlZCBzbyB0aGF0IHdlIGNhbiBkbyB0aGUgYmluYXJ5IHNlYXJjaCAqLwotCXNvcnQoYXJtNjRfZnRyX3JlZ3MsCi0JCUFSUkFZX1NJWkUoYXJtNjRfZnRyX3JlZ3MpLAotCQlzaXplb2YoYXJtNjRfZnRyX3JlZ3NbMF0pLAotCQlzb3J0X2NtcF9mdHJfcmVncywKLQkJc3dhcF9mdHJfcmVncyk7CisJaW50IGk7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBhcnJheSBpcyBzb3J0ZWQgc28gdGhhdCB3ZSBjYW4gZG8gdGhlIGJpbmFyeSBzZWFyY2ggKi8KKwlmb3IgKGkgPSAxOyBpIDwgQVJSQVlfU0laRShhcm02NF9mdHJfcmVncyk7IGkrKykKKwkJQlVHX09OKGFybTY0X2Z0cl9yZWdzW2ldLnN5c19pZCA8IGFybTY0X2Z0cl9yZWdzW2kgLSAxXS5zeXNfaWQpOwogfQogCiAvKgpAQCAtNDA3LDcgKzQxMiw3IEBACiB7CiAJdTY0IHZhbCA9IDA7CiAJdTY0IHN0cmljdF9tYXNrID0gfjB4MFVMTDsKLQlzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgKmZ0cnA7CisJY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzICpmdHJwOwogCXN0cnVjdCBhcm02NF9mdHJfcmVnICpyZWcgPSBnZXRfYXJtNjRfZnRyX3JlZyhzeXNfcmVnKTsKIAogCUJVR19PTighcmVnKTsKQEAgLTQ2NCw3ICs0NjksNyBAQAogCiBzdGF0aWMgdm9pZCB1cGRhdGVfY3B1X2Z0cl9yZWcoc3RydWN0IGFybTY0X2Z0cl9yZWcgKnJlZywgdTY0IG5ldykKIHsKLQlzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgKmZ0cnA7CisJY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzICpmdHJwOwogCiAJZm9yIChmdHJwID0gcmVnLT5mdHJfYml0czsgZnRycC0+d2lkdGg7IGZ0cnArKykgewogCQlzNjQgZnRyX2N1ciA9IGFybTY0X2Z0cl92YWx1ZShmdHJwLCByZWctPnN5c192YWwpOwpAQCAtMTAwNCwyNSArMTAwOSwzNSBAQAogICogY2Fubm90IGRvIGFueXRoaW5nIHRvIGZpeCBpdCB1cCBhbmQgY291bGQgY2F1c2UgdW5leHBlY3RlZCBmYWlsdXJlcy4gU28KICAqIHdlIHBhcmsgdGhlIENQVS4KICAqLwotdm9pZCB2ZXJpZnlfbG9jYWxfY3B1X2NhcGFiaWxpdGllcyh2b2lkKQorc3RhdGljIHZvaWQgdmVyaWZ5X2xvY2FsX2NwdV9jYXBhYmlsaXRpZXModm9pZCkKIHsKLQotCWNoZWNrX2Vhcmx5X2NwdV9mZWF0dXJlcygpOwotCi0JLyoKLQkgKiBJZiB3ZSBoYXZlbid0IGNvbXB1dGVkIHRoZSBzeXN0ZW0gY2FwYWJpbGl0aWVzLCB0aGVyZSBpcyBub3RoaW5nCi0JICogdG8gdmVyaWZ5LgotCSAqLwotCWlmICghc3lzX2NhcHNfaW5pdGlhbGlzZWQpCi0JCXJldHVybjsKLQotCXZlcmlmeV9sb2NhbF9jcHVfZXJyYXRhKCk7CisJdmVyaWZ5X2xvY2FsX2NwdV9lcnJhdGFfd29ya2Fyb3VuZHMoKTsKIAl2ZXJpZnlfbG9jYWxfY3B1X2ZlYXR1cmVzKGFybTY0X2ZlYXR1cmVzKTsKIAl2ZXJpZnlfbG9jYWxfZWxmX2h3Y2Fwcyhhcm02NF9lbGZfaHdjYXBzKTsKIAlpZiAoc3lzdGVtX3N1cHBvcnRzXzMyYml0X2VsMCgpKQogCQl2ZXJpZnlfbG9jYWxfZWxmX2h3Y2Fwcyhjb21wYXRfZWxmX2h3Y2Fwcyk7CiB9CiAKK3ZvaWQgY2hlY2tfbG9jYWxfY3B1X2NhcGFiaWxpdGllcyh2b2lkKQoreworCS8qCisJICogQWxsIHNlY29uZGFyeSBDUFVzIHNob3VsZCBjb25mb3JtIHRvIHRoZSBlYXJseSBDUFUgZmVhdHVyZXMKKwkgKiBpbiB1c2UgYnkgdGhlIGtlcm5lbCBiYXNlZCBvbiBib290IENQVS4KKwkgKi8KKwljaGVja19lYXJseV9jcHVfZmVhdHVyZXMoKTsKKworCS8qCisJICogSWYgd2UgaGF2ZW4ndCBmaW5hbGlzZWQgdGhlIHN5c3RlbSBjYXBhYmlsaXRpZXMsIHRoaXMgQ1BVIGdldHMKKwkgKiBhIGNoYW5jZSB0byB1cGRhdGUgdGhlIGVycmF0YSB3b3JrIGFyb3VuZHMuCisJICogT3RoZXJ3aXNlLCB0aGlzIENQVSBzaG91bGQgdmVyaWZ5IHRoYXQgaXQgaGFzIGFsbCB0aGUgc3lzdGVtCisJICogYWR2ZXJ0aXNlZCBjYXBhYmlsaXRpZXMuCisJICovCisJaWYgKCFzeXNfY2Fwc19pbml0aWFsaXNlZCkKKwkJdXBkYXRlX2NwdV9lcnJhdGFfd29ya2Fyb3VuZHMoKTsKKwllbHNlCisJCXZlcmlmeV9sb2NhbF9jcHVfY2FwYWJpbGl0aWVzKCk7Cit9CisKIHN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9mZWF0dXJlX2NhcGFiaWxpdGllcyh2b2lkKQogewogCXVwZGF0ZV9jcHVfY2FwYWJpbGl0aWVzKGFybTY0X2ZlYXR1cmVzLCAiZGV0ZWN0ZWQgZmVhdHVyZToiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWluZm8uYyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWluZm8uYwppbmRleCBlZDFiODRmLi5iM2Q1YjNlIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVpbmZvLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1aW5mby5jCkBAIC0zNjMsOCArMzYzLDYgQEAKIAl9CiAKIAljcHVpbmZvX2RldGVjdF9pY2FjaGVfcG9saWN5KGluZm8pOwotCi0JY2hlY2tfbG9jYWxfY3B1X2VycmF0YSgpOwogfQogCiB2b2lkIGNwdWluZm9fc3RvcmVfY3B1KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9kZWJ1Zy1tb25pdG9ycy5jIGIvYXJjaC9hcm02NC9rZXJuZWwvZGVidWctbW9uaXRvcnMuYwppbmRleCA5MWZmZjQ4Li43M2FlOTBlIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9kZWJ1Zy1tb25pdG9ycy5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2RlYnVnLW1vbml0b3JzLmMKQEAgLTQ2LDE2ICs0NiwxNCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJbG9jYWxfZGJnX3NhdmUoZmxhZ3MpOwotCWFzbSB2b2xhdGlsZSgibXNyIG1kc2NyX2VsMSwgJTAiIDo6ICJyIiAobWRzY3IpKTsKKwl3cml0ZV9zeXNyZWcobWRzY3IsIG1kc2NyX2VsMSk7CiAJbG9jYWxfZGJnX3Jlc3RvcmUoZmxhZ3MpOwogfQogTk9LUFJPQkVfU1lNQk9MKG1kc2NyX3dyaXRlKTsKIAogc3RhdGljIHUzMiBtZHNjcl9yZWFkKHZvaWQpCiB7Ci0JdTMyIG1kc2NyOwotCWFzbSB2b2xhdGlsZSgibXJzICUwLCBtZHNjcl9lbDEiIDogIj1yIiAobWRzY3IpKTsKLQlyZXR1cm4gbWRzY3I7CisJcmV0dXJuIHJlYWRfc3lzcmVnKG1kc2NyX2VsMSk7CiB9CiBOT0tQUk9CRV9TWU1CT0wobWRzY3JfcmVhZCk7CiAKQEAgLTEzMiwzNiArMTMwLDE4IEBACiAvKgogICogT1MgbG9jayBjbGVhcmluZy4KICAqLwotc3RhdGljIHZvaWQgY2xlYXJfb3NfbG9jayh2b2lkICp1bnVzZWQpCitzdGF0aWMgaW50IGNsZWFyX29zX2xvY2sodW5zaWduZWQgaW50IGNwdSkKIHsKLQlhc20gdm9sYXRpbGUoIm1zciBvc2xhcl9lbDEsICUwIiA6IDogInIiICgwKSk7CisJd3JpdGVfc3lzcmVnKDAsIG9zbGFyX2VsMSk7CisJaXNiKCk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3NfbG9ja19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSkKLXsKLQlpZiAoKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSA9PSBDUFVfT05MSU5FKQotCQljbGVhcl9vc19sb2NrKE5VTEwpOwotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgb3NfbG9ja19uYiA9IHsKLQkubm90aWZpZXJfY2FsbCA9IG9zX2xvY2tfbm90aWZ5LAotfTsKLQogc3RhdGljIGludCBkZWJ1Z19tb25pdG9yc19pbml0KHZvaWQpCiB7Ci0JY3B1X25vdGlmaWVyX3JlZ2lzdGVyX2JlZ2luKCk7Ci0KLQkvKiBDbGVhciB0aGUgT1MgbG9jay4gKi8KLQlvbl9lYWNoX2NwdShjbGVhcl9vc19sb2NrLCBOVUxMLCAxKTsKLQlpc2IoKTsKLQotCS8qIFJlZ2lzdGVyIGhvdHBsdWcgaGFuZGxlci4gKi8KLQlfX3JlZ2lzdGVyX2NwdV9ub3RpZmllcigmb3NfbG9ja19uYik7Ci0KLQljcHVfbm90aWZpZXJfcmVnaXN0ZXJfZG9uZSgpOwotCXJldHVybiAwOworCXJldHVybiBjcHVocF9zZXR1cF9zdGF0ZShDUFVIUF9BUF9BUk02NF9ERUJVR19NT05JVE9SU19TVEFSVElORywKKwkJCQkgIkNQVUhQX0FQX0FSTTY0X0RFQlVHX01PTklUT1JTX1NUQVJUSU5HIiwKKwkJCQkgY2xlYXJfb3NfbG9jaywgTlVMTCk7CiB9CiBwb3N0Y29yZV9pbml0Y2FsbChkZWJ1Z19tb25pdG9yc19pbml0KTsKIApAQCAtMjU0LDcgKzIzNCw3IEBACiAJCXJldHVybiAwOwogCiAJaWYgKHVzZXJfbW9kZShyZWdzKSkgewotCQlzZW5kX3VzZXJfc2lndHJhcChUUkFQX0hXQktQVCk7CisJCXNlbmRfdXNlcl9zaWd0cmFwKFRSQVBfVFJBQ0UpOwogCiAJCS8qCiAJCSAqIHB0cmFjZSB3aWxsIGRpc2FibGUgc2luZ2xlIHN0ZXAgdW5sZXNzIGV4cGxpY2l0bHkKQEAgLTM4Miw3ICszNjIsNyBAQAogc3RhdGljIGludCBfX2luaXQgZGVidWdfdHJhcHNfaW5pdCh2b2lkKQogewogCWhvb2tfZGVidWdfZmF1bHRfY29kZShEQkdfRVNSX0VWVF9IV1NTLCBzaW5nbGVfc3RlcF9oYW5kbGVyLCBTSUdUUkFQLAotCQkJICAgICAgVFJBUF9IV0JLUFQsICJzaW5nbGUtc3RlcCBoYW5kbGVyIik7CisJCQkgICAgICBUUkFQX1RSQUNFLCAic2luZ2xlLXN0ZXAgaGFuZGxlciIpOwogCWhvb2tfZGVidWdfZmF1bHRfY29kZShEQkdfRVNSX0VWVF9CUkssIGJya19oYW5kbGVyLCBTSUdUUkFQLAogCQkJICAgICAgVFJBUF9CUktQVCwgInB0cmFjZSBCUksgaGFuZGxlciIpOwogCXJldHVybiAwOwpAQCAtNDM1LDggKzQxNSwxMCBAQAogLyogcHRyYWNlIEFQSSAqLwogdm9pZCB1c2VyX2VuYWJsZV9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0Jc2V0X3RpX3RocmVhZF9mbGFnKHRhc2tfdGhyZWFkX2luZm8odGFzayksIFRJRl9TSU5HTEVTVEVQKTsKLQlzZXRfcmVnc19zcHNyX3NzKHRhc2tfcHRfcmVncyh0YXNrKSk7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IHRhc2tfdGhyZWFkX2luZm8odGFzayk7CisKKwlpZiAoIXRlc3RfYW5kX3NldF90aV90aHJlYWRfZmxhZyh0aSwgVElGX1NJTkdMRVNURVApKQorCQlzZXRfcmVnc19zcHNyX3NzKHRhc2tfcHRfcmVncyh0YXNrKSk7CiB9CiBOT0tQUk9CRV9TWU1CT0wodXNlcl9lbmFibGVfc2luZ2xlX3N0ZXApOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9lbnRyeS1mdHJhY2UuUyBiL2FyY2gvYXJtNjQva2VybmVsL2VudHJ5LWZ0cmFjZS5TCmluZGV4IDBmMDNhOGYuLmFlZjAyZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2VudHJ5LWZ0cmFjZS5TCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2VudHJ5LWZ0cmFjZS5TCkBAIC0yMTksNyArMjE5LDcgQEAKICAqCiAgKiBSdW4gZnRyYWNlX3JldHVybl90b19oYW5kbGVyKCkgYmVmb3JlIGdvaW5nIGJhY2sgdG8gcGFyZW50LgogICogQGZwIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgdmFsdWUgcGFzc2VkIGJ5IGZ0cmFjZV9ncmFwaF9jYWxsZXIoKQotICogb25seSB3aGVuIENPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1QgaXMgZW5hYmxlZC4KKyAqIG9ubHkgd2hlbiBIQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1QgaXMgZW5hYmxlZC4KICAqLwogRU5UUlkocmV0dXJuX3RvX2hhbmRsZXIpCiAJc2F2ZV9yZXR1cm5fcmVncwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvYXJtNjQva2VybmVsL2VudHJ5LlMKaW5kZXggNDQxNDIwYy4uMjIzZDU0YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9lbnRyeS5TCkBAIC0xMDQsNyArMTA0LDcgQEAKIAlzdHIJeDIwLCBbc3AsICNTX09SSUdfQUREUl9MSU1JVF0KIAltb3YJeDIwLCAjVEFTS19TSVpFXzY0CiAJc3RyCXgyMCwgW3RzaywgI1RJX0FERFJfTElNSVRdCi0JQUxURVJOQVRJVkUobm9wLCBTRVRfUFNUQVRFX1VBTygwKSwgQVJNNjRfSEFTX1VBTywgQ09ORklHX0FSTTY0X1VBTykKKwkvKiBObyBuZWVkIHRvIHJlc2V0IFBTVEFURS5VQU8sIGhhcmR3YXJlJ3MgYWxyZWFkeSBzZXQgaXQgdG8gMCBmb3IgdXMgKi8KIAkuZW5kaWYgLyogXGVsID09IDAgKi8KIAltcnMJeDIyLCBlbHJfZWwxCiAJbXJzCXgyMywgc3Bzcl9lbDEKQEAgLTE1MCwxMyArMTUwLDcgQEAKIAlsZHIJeDIzLCBbc3AsICNTX1NQXQkJLy8gbG9hZCByZXR1cm4gc3RhY2sgcG9pbnRlcgogCW1zcglzcF9lbDAsIHgyMwogI2lmZGVmIENPTkZJR19BUk02NF9FUlJBVFVNXzg0NTcxOQotYWx0ZXJuYXRpdmVfaWZfbm90IEFSTTY0X1dPUktBUk9VTkRfODQ1NzE5Ci0Jbm9wCi0Jbm9wCi0jaWZkZWYgQ09ORklHX1BJRF9JTl9DT05URVhUSURSCi0Jbm9wCi0jZW5kaWYKLWFsdGVybmF0aXZlX2Vsc2UKK2FsdGVybmF0aXZlX2lmIEFSTTY0X1dPUktBUk9VTkRfODQ1NzE5CiAJdGJ6CXgyMiwgIzQsIDFmCiAjaWZkZWYgQ09ORklHX1BJRF9JTl9DT05URVhUSURSCiAJbXJzCXgyOSwgY29udGV4dGlkcl9lbDEKQEAgLTE2NSw3ICsxNTksNyBAQAogCW1zciBjb250ZXh0aWRyX2VsMSwgeHpyCiAjZW5kaWYKIDE6Ci1hbHRlcm5hdGl2ZV9lbmRpZgorYWx0ZXJuYXRpdmVfZWxzZV9ub3BfZW5kaWYKICNlbmRpZgogCS5lbmRpZgogCW1zcgllbHJfZWwxLCB4MjEJCQkvLyBzZXQgdXAgdGhlIHJldHVybiBkYXRhCkBAIC03MDcsMTggKzcwMSwxMyBAQAogICogT2ssIHdlIG5lZWQgdG8gZG8gZXh0cmEgcHJvY2Vzc2luZywgZW50ZXIgdGhlIHNsb3cgcGF0aC4KICAqLwogd29ya19wZW5kaW5nOgotCXRibnoJeDEsICNUSUZfTkVFRF9SRVNDSEVELCB3b3JrX3Jlc2NoZWQKLQkvKiBUSUZfU0lHUEVORElORywgVElGX05PVElGWV9SRVNVTUUgb3IgVElGX0ZPUkVJR05fRlBTVEFURSBjYXNlICovCiAJbW92CXgwLCBzcAkJCQkvLyAncmVncycKLQllbmFibGVfaXJxCQkJCS8vIGVuYWJsZSBpbnRlcnJ1cHRzIGZvciBkb19ub3RpZnlfcmVzdW1lKCkKIAlibAlkb19ub3RpZnlfcmVzdW1lCi0JYglyZXRfdG9fdXNlcgotd29ya19yZXNjaGVkOgogI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUwotCWJsCXRyYWNlX2hhcmRpcnFzX29mZgkJLy8gdGhlIElSUXMgYXJlIG9mZiBoZXJlLCBpbmZvcm0gdGhlIHRyYWNpbmcgY29kZQorCWJsCXRyYWNlX2hhcmRpcnFzX29uCQkvLyBlbmFibGVkIHdoaWxlIGluIHVzZXJzcGFjZQogI2VuZGlmCi0JYmwJc2NoZWR1bGUKLQorCWxkcgl4MSwgW3RzaywgI1RJX0ZMQUdTXQkJLy8gcmUtY2hlY2sgZm9yIHNpbmdsZS1zdGVwCisJYglmaW5pc2hfcmV0X3RvX3VzZXIKIC8qCiAgKiAic2xvdyIgc3lzY2FsbCByZXR1cm4gcGF0aC4KICAqLwpAQCAtNzI3LDYgKzcxNiw3IEBACiAJbGRyCXgxLCBbdHNrLCAjVElfRkxBR1NdCiAJYW5kCXgyLCB4MSwgI19USUZfV09SS19NQVNLCiAJY2Juegl4Miwgd29ya19wZW5kaW5nCitmaW5pc2hfcmV0X3RvX3VzZXI6CiAJZW5hYmxlX3N0ZXBfdHNrIHgxLCB4MgogCWtlcm5lbF9leGl0IDAKIEVORFBST0MocmV0X3RvX3VzZXIpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9mcHNpbWQuYyBiL2FyY2gvYXJtNjQva2VybmVsL2Zwc2ltZC5jCmluZGV4IDk3NWIyNzQuLjM5NGM2MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2Zwc2ltZC5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2Zwc2ltZC5jCkBAIC0yOTksMjggKzI5OSwxNiBAQAogI2VuZGlmIC8qIENPTkZJR19DUFVfUE0gKi8KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotc3RhdGljIGludCBmcHNpbWRfY3B1X2hvdHBsdWdfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCi0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAotCQkJCSAgICAgICB2b2lkICpoY3B1KQorc3RhdGljIGludCBmcHNpbWRfY3B1X2RlYWQodW5zaWduZWQgaW50IGNwdSkKIHsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gKGxvbmcpaGNwdTsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfREVBRDoKLQljYXNlIENQVV9ERUFEX0ZST1pFTjoKLQkJcGVyX2NwdShmcHNpbWRfbGFzdF9zdGF0ZSwgY3B1KSA9IE5VTEw7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXBlcl9jcHUoZnBzaW1kX2xhc3Rfc3RhdGUsIGNwdSkgPSBOVUxMOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGZwc2ltZF9jcHVfaG90cGx1Z19ub3RpZmllcl9ibG9jayA9IHsKLQkubm90aWZpZXJfY2FsbCA9IGZwc2ltZF9jcHVfaG90cGx1Z19ub3RpZmllciwKLX07Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBmcHNpbWRfaG90cGx1Z19pbml0KHZvaWQpCiB7Ci0JcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZmcHNpbWRfY3B1X2hvdHBsdWdfbm90aWZpZXJfYmxvY2spOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVJNNjRfRlBTSU1EX0RFQUQsICJhcm02NC9mcHNpbWQ6ZGVhZCIsCisJCQkJICBOVUxMLCBmcHNpbWRfY3B1X2RlYWQpOwogfQogCiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9mdHJhY2UuYwppbmRleCBlYmVjZjlhLi40MGFkMDhhIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9mdHJhY2UuYwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJCXJldHVybjsKIAogCWVyciA9IGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZShvbGQsIHNlbGZfYWRkciwgJnRyYWNlLmRlcHRoLAotCQkJCSAgICAgICBmcmFtZV9wb2ludGVyKTsKKwkJCQkgICAgICAgZnJhbWVfcG9pbnRlciwgTlVMTCk7CiAJaWYgKGVyciA9PSAtRUJVU1kpCiAJCXJldHVybjsKIAllbHNlCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9oZWFkLlMgYi9hcmNoL2FybTY0L2tlcm5lbC9oZWFkLlMKaW5kZXggYjc3ZjU4My4uNDI3ZjZkMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2hlYWQuUwpAQCAtMjA4LDEzICsyMDgsMjMgQEAKIAogCV9fSU5JVAogCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGNhbGxlZSBzYXZlZCBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIGFyZSB1c2VkIG9uIHRoZQorCSAqIHByaW1hcnkgbG93bGV2ZWwgYm9vdCBwYXRoOgorCSAqCisJICogIFJlZ2lzdGVyICAgU2NvcGUgICAgICAgICAgICAgICAgICAgICAgUHVycG9zZQorCSAqICB4MjEgICAgICAgIHN0ZXh0KCkgLi4gc3RhcnRfa2VybmVsKCkgIEZEVCBwb2ludGVyIHBhc3NlZCBhdCBib290IGluIHgwCisJICogIHgyMyAgICAgICAgc3RleHQoKSAuLiBzdGFydF9rZXJuZWwoKSAgcGh5c2ljYWwgbWlzYWxpZ25tZW50L0tBU0xSIG9mZnNldAorCSAqICB4MjggICAgICAgIF9fY3JlYXRlX3BhZ2VfdGFibGVzKCkgICAgIGNhbGxlZSBwcmVzZXJ2ZWQgdGVtcCByZWdpc3RlcgorCSAqICB4MTkveDIwICAgIF9fcHJpbWFyeV9zd2l0Y2goKSAgICAgICAgIGNhbGxlZSBwcmVzZXJ2ZWQgdGVtcCByZWdpc3RlcnMKKwkgKi8KIEVOVFJZKHN0ZXh0KQogCWJsCXByZXNlcnZlX2Jvb3RfYXJncwotCWJsCWVsMl9zZXR1cAkJCS8vIERyb3AgdG8gRUwxLCB3MjA9Y3B1X2Jvb3RfbW9kZQotCWFkcnAJeDI0LCBfX1BIWVNfT0ZGU0VUCi0JYW5kCXgyMywgeDI0LCBNSU5fS0lNR19BTElHTiAtIDEJLy8gS0FTTFIgb2Zmc2V0LCBkZWZhdWx0cyB0byAwCisJYmwJZWwyX3NldHVwCQkJLy8gRHJvcCB0byBFTDEsIHcwPWNwdV9ib290X21vZGUKKwlhZHJwCXgyMywgX19QSFlTX09GRlNFVAorCWFuZAl4MjMsIHgyMywgTUlOX0tJTUdfQUxJR04gLSAxCS8vIEtBU0xSIG9mZnNldCwgZGVmYXVsdHMgdG8gMAogCWJsCXNldF9jcHVfYm9vdF9tb2RlX2ZsYWcKLQlibAlfX2NyZWF0ZV9wYWdlX3RhYmxlcwkJLy8geDI1PVRUQlIwLCB4MjY9VFRCUjEKKwlibAlfX2NyZWF0ZV9wYWdlX3RhYmxlcwogCS8qCiAJICogVGhlIGZvbGxvd2luZyBjYWxscyBDUFUgc2V0dXAgY29kZSwgc2VlIGFyY2gvYXJtNjQvbW0vcHJvYy5TIGZvcgogCSAqIGRldGFpbHMuCkBAIC0yMjIsOSArMjMyLDcgQEAKIAkgKiB0aGUgVENSIHdpbGwgaGF2ZSBiZWVuIHNldC4KIAkgKi8KIAlibAlfX2NwdV9zZXR1cAkJCS8vIGluaXRpYWxpc2UgcHJvY2Vzc29yCi0JYWRyX2wJeDI3LCBfX3ByaW1hcnlfc3dpdGNoCQkvLyBhZGRyZXNzIHRvIGp1bXAgdG8gYWZ0ZXIKLQkJCQkJCS8vIE1NVSBoYXMgYmVlbiBlbmFibGVkCi0JYglfX2VuYWJsZV9tbXUKKwliCV9fcHJpbWFyeV9zd2l0Y2gKIEVORFBST0Moc3RleHQpCiAKIC8qCkBAIC0zMTEsMjMgKzMxOSwyMSBAQAogICogICAgIGJlZW4gZW5hYmxlZAogICovCiBfX2NyZWF0ZV9wYWdlX3RhYmxlczoKLQlhZHJwCXgyNSwgaWRtYXBfcGdfZGlyCi0JYWRycAl4MjYsIHN3YXBwZXJfcGdfZGlyCiAJbW92CXgyOCwgbHIKIAogCS8qCiAJICogSW52YWxpZGF0ZSB0aGUgaWRtYXAgYW5kIHN3YXBwZXIgcGFnZSB0YWJsZXMgdG8gYXZvaWQgcG90ZW50aWFsCiAJICogZGlydHkgY2FjaGUgbGluZXMgYmVpbmcgZXZpY3RlZC4KIAkgKi8KLQltb3YJeDAsIHgyNQotCWFkZAl4MSwgeDI2LCAjU1dBUFBFUl9ESVJfU0laRQorCWFkcnAJeDAsIGlkbWFwX3BnX2RpcgorCWFkcnAJeDEsIHN3YXBwZXJfcGdfZGlyICsgU1dBUFBFUl9ESVJfU0laRQogCWJsCV9faW52YWxfY2FjaGVfcmFuZ2UKIAogCS8qCiAJICogQ2xlYXIgdGhlIGlkbWFwIGFuZCBzd2FwcGVyIHBhZ2UgdGFibGVzLgogCSAqLwotCW1vdgl4MCwgeDI1Ci0JYWRkCXg2LCB4MjYsICNTV0FQUEVSX0RJUl9TSVpFCisJYWRycAl4MCwgaWRtYXBfcGdfZGlyCisJYWRycAl4Niwgc3dhcHBlcl9wZ19kaXIgKyBTV0FQUEVSX0RJUl9TSVpFCiAxOglzdHAJeHpyLCB4enIsIFt4MF0sICMxNgogCXN0cAl4enIsIHh6ciwgW3gwXSwgIzE2CiAJc3RwCXh6ciwgeHpyLCBbeDBdLCAjMTYKQEAgLTM0MCw3ICszNDYsNyBAQAogCS8qCiAJICogQ3JlYXRlIHRoZSBpZGVudGl0eSBtYXBwaW5nLgogCSAqLwotCW1vdgl4MCwgeDI1CQkJCS8vIGlkbWFwX3BnX2RpcgorCWFkcnAJeDAsIGlkbWFwX3BnX2RpcgogCWFkcnAJeDMsIF9faWRtYXBfdGV4dF9zdGFydAkJLy8gX19wYShfX2lkbWFwX3RleHRfc3RhcnQpCiAKICNpZm5kZWYgQ09ORklHX0FSTTY0X1ZBX0JJVFNfNDgKQEAgLTM5MCw3ICszOTYsNyBAQAogCS8qCiAJICogTWFwIHRoZSBrZXJuZWwgaW1hZ2UgKHN0YXJ0aW5nIHdpdGggUEhZU19PRkZTRVQpLgogCSAqLwotCW1vdgl4MCwgeDI2CQkJCS8vIHN3YXBwZXJfcGdfZGlyCisJYWRycAl4MCwgc3dhcHBlcl9wZ19kaXIKIAltb3ZfcQl4NSwgS0lNQUdFX1ZBRERSICsgVEVYVF9PRkZTRVQJLy8gY29tcGlsZSB0aW1lIF9fdmEoX3RleHQpCiAJYWRkCXg1LCB4NSwgeDIzCQkJLy8gYWRkIEtBU0xSIGRpc3BsYWNlbWVudAogCWNyZWF0ZV9wZ2RfZW50cnkgeDAsIHg1LCB4MywgeDYKQEAgLTQwNSw4ICs0MTEsOCBAQAogCSAqIGFjY2Vzc2VzIChNTVUgZGlzYWJsZWQpLCBpbnZhbGlkYXRlIHRoZSBpZG1hcCBhbmQgc3dhcHBlciBwYWdlCiAJICogdGFibGVzIGFnYWluIHRvIHJlbW92ZSBhbnkgc3BlY3VsYXRpdmVseSBsb2FkZWQgY2FjaGUgbGluZXMuCiAJICovCi0JbW92CXgwLCB4MjUKLQlhZGQJeDEsIHgyNiwgI1NXQVBQRVJfRElSX1NJWkUKKwlhZHJwCXgwLCBpZG1hcF9wZ19kaXIKKwlhZHJwCXgxLCBzd2FwcGVyX3BnX2RpciArIFNXQVBQRVJfRElSX1NJWkUKIAlkbWIJc3kKIAlibAlfX2ludmFsX2NhY2hlX3JhbmdlCiAKQEAgLTQxNiwxNCArNDIyLDI3IEBACiAKIC8qCiAgKiBUaGUgZm9sbG93aW5nIGZyYWdtZW50IG9mIGNvZGUgaXMgZXhlY3V0ZWQgd2l0aCB0aGUgTU1VIGVuYWJsZWQuCisgKgorICogICB4MCA9IF9fUEhZU19PRkZTRVQKICAqLwotCS5zZXQJaW5pdGlhbF9zcCwgaW5pdF90aHJlYWRfdW5pb24gKyBUSFJFQURfU1RBUlRfU1AKIF9fcHJpbWFyeV9zd2l0Y2hlZDoKLQltb3YJeDI4LCBscgkJCQkvLyBwcmVzZXJ2ZSBMUgorCWFkcnAJeDQsIGluaXRfdGhyZWFkX3VuaW9uCisJYWRkCXNwLCB4NCwgI1RIUkVBRF9TSVpFCisJbXNyCXNwX2VsMCwgeDQJCQkvLyBTYXZlIHRocmVhZF9pbmZvCisKIAlhZHJfbAl4OCwgdmVjdG9ycwkJCS8vIGxvYWQgVkJBUl9FTDEgd2l0aCB2aXJ0dWFsCiAJbXNyCXZiYXJfZWwxLCB4OAkJCS8vIHZlY3RvciB0YWJsZSBhZGRyZXNzCiAJaXNiCiAKKwlzdHAJeHpyLCB4MzAsIFtzcCwgIy0xNl0hCisJbW92CXgyOSwgc3AKKworCXN0cl9sCXgyMSwgX19mZHRfcG9pbnRlciwgeDUJCS8vIFNhdmUgRkRUIHBvaW50ZXIKKworCWxkcl9sCXg0LCBraW1hZ2VfdmFkZHIJCS8vIFNhdmUgdGhlIG9mZnNldCBiZXR3ZWVuCisJc3ViCXg0LCB4NCwgeDAJCQkvLyB0aGUga2VybmVsIHZpcnR1YWwgYW5kCisJc3RyX2wJeDQsIGtpbWFnZV92b2Zmc2V0LCB4NQkJLy8gcGh5c2ljYWwgbWFwcGluZ3MKKwogCS8vIENsZWFyIEJTUwogCWFkcl9sCXgwLCBfX2Jzc19zdGFydAogCW1vdgl4MSwgeHpyCkBAIC00MzIsMTcgKzQ1MSw2IEBACiAJYmwJX19waV9tZW1zZXQKIAlkc2IJaXNoc3QJCQkJLy8gTWFrZSB6ZXJvIHBhZ2UgdmlzaWJsZSB0byBQVFcKIAotCWFkcl9sCXNwLCBpbml0aWFsX3NwLCB4NAotCW1vdgl4NCwgc3AKLQlhbmQJeDQsIHg0LCAjfihUSFJFQURfU0laRSAtIDEpCi0JbXNyCXNwX2VsMCwgeDQJCQkvLyBTYXZlIHRocmVhZF9pbmZvCi0Jc3RyX2wJeDIxLCBfX2ZkdF9wb2ludGVyLCB4NQkJLy8gU2F2ZSBGRFQgcG9pbnRlcgotCi0JbGRyX2wJeDQsIGtpbWFnZV92YWRkcgkJLy8gU2F2ZSB0aGUgb2Zmc2V0IGJldHdlZW4KLQlzdWIJeDQsIHg0LCB4MjQJCQkvLyB0aGUga2VybmVsIHZpcnR1YWwgYW5kCi0Jc3RyX2wJeDQsIGtpbWFnZV92b2Zmc2V0LCB4NQkJLy8gcGh5c2ljYWwgbWFwcGluZ3MKLQotCW1vdgl4MjksICMwCiAjaWZkZWYgQ09ORklHX0tBU0FOCiAJYmwJa2FzYW5fZWFybHlfaW5pdAogI2VuZGlmCkBAIC00NTQsOCArNDYyLDggQEAKIAlibAlrYXNscl9lYXJseV9pbml0CQkvLyBwYXJzZSBGRFQgZm9yIEtBU0xSIG9wdGlvbnMKIAljYnoJeDAsIDBmCQkJCS8vIEtBU0xSIGRpc2FibGVkPyBqdXN0IHByb2NlZWQKIAlvcnIJeDIzLCB4MjMsIHgwCQkJLy8gcmVjb3JkIEtBU0xSIG9mZnNldAotCXJldAl4MjgJCQkJLy8gd2UgbXVzdCBlbmFibGUgS0FTTFIsIHJldHVybgotCQkJCQkJLy8gdG8gX19lbmFibGVfbW11KCkKKwlsZHAJeDI5LCB4MzAsIFtzcF0sICMxNgkJLy8gd2UgbXVzdCBlbmFibGUgS0FTTFIsIHJldHVybgorCXJldAkJCQkJLy8gdG8gX19wcmltYXJ5X3N3aXRjaCgpCiAwOgogI2VuZGlmCiAJYglzdGFydF9rZXJuZWwKQEAgLTQ2NSw3ICs0NzMsNyBAQAogICogZW5kIGVhcmx5IGhlYWQgc2VjdGlvbiwgYmVnaW4gaGVhZCBjb2RlIHRoYXQgaXMgYWxzbyB1c2VkIGZvcgogICogaG90cGx1ZyBhbmQgbmVlZHMgdG8gaGF2ZSB0aGUgc2FtZSBwcm90ZWN0aW9ucyBhcyB0aGUgdGV4dCByZWdpb24KICAqLwotCS5zZWN0aW9uICIudGV4dCIsImF4IgorCS5zZWN0aW9uICIuaWRtYXAudGV4dCIsImF4IgogCiBFTlRSWShraW1hZ2VfdmFkZHIpCiAJLnF1YWQJCV90ZXh0IC0gVEVYVF9PRkZTRVQKQEAgLTQ5MCw3ICs0OTgsNyBAQAogQ1BVX0JFKAlvcnIJeDAsIHgwLCAjKDMgPDwgMjQpCSkJLy8gU2V0IHRoZSBFRSBhbmQgRTBFIGJpdHMgZm9yIEVMMQogQ1BVX0xFKAliaWMJeDAsIHgwLCAjKDMgPDwgMjQpCSkJLy8gQ2xlYXIgdGhlIEVFIGFuZCBFMEUgYml0cyBmb3IgRUwxCiAJbXNyCXNjdGxyX2VsMSwgeDAKLQltb3YJdzIwLCAjQk9PVF9DUFVfTU9ERV9FTDEJCS8vIFRoaXMgY3B1IGJvb3RlZCBpbiBFTDEKKwltb3YJdzAsICNCT09UX0NQVV9NT0RFX0VMMQkJLy8gVGhpcyBjcHUgYm9vdGVkIGluIEVMMQogCWlzYgogCXJldAogCkBAIC01ODYsNyArNTk0LDcgQEAKIAogCWNiegl4MiwgaW5zdGFsbF9lbDJfc3R1YgogCi0JbW92CXcyMCwgI0JPT1RfQ1BVX01PREVfRUwyCQkvLyBUaGlzIENQVSBib290ZWQgaW4gRUwyCisJbW92CXcwLCAjQk9PVF9DUFVfTU9ERV9FTDIJCS8vIFRoaXMgQ1BVIGJvb3RlZCBpbiBFTDIKIAlpc2IKIAlyZXQKIApAQCAtNjAxLDcgKzYwOSw3IEBACiAJCSAgICAgIFBTUl9NT0RFX0VMMWgpCiAJbXNyCXNwc3JfZWwyLCB4MAogCW1zcgllbHJfZWwyLCBscgotCW1vdgl3MjAsICNCT09UX0NQVV9NT0RFX0VMMgkJLy8gVGhpcyBDUFUgYm9vdGVkIGluIEVMMgorCW1vdgl3MCwgI0JPT1RfQ1BVX01PREVfRUwyCQkvLyBUaGlzIENQVSBib290ZWQgaW4gRUwyCiAJZXJldAogRU5EUFJPQyhlbDJfc2V0dXApCiAKQEAgLTYxMSwyNyArNjE5LDM5IEBACiAgKi8KIHNldF9jcHVfYm9vdF9tb2RlX2ZsYWc6CiAJYWRyX2wJeDEsIF9fYm9vdF9jcHVfbW9kZQotCWNtcAl3MjAsICNCT09UX0NQVV9NT0RFX0VMMgorCWNtcAl3MCwgI0JPT1RfQ1BVX01PREVfRUwyCiAJYi5uZQkxZgogCWFkZAl4MSwgeDEsICM0Ci0xOglzdHIJdzIwLCBbeDFdCQkJLy8gVGhpcyBDUFUgaGFzIGJvb3RlZCBpbiBFTDEKKzE6CXN0cgl3MCwgW3gxXQkJCS8vIFRoaXMgQ1BVIGhhcyBib290ZWQgaW4gRUwxCiAJZG1iCXN5CiAJZGMJaXZhYywgeDEJCQkvLyBJbnZhbGlkYXRlIHBvdGVudGlhbGx5IHN0YWxlIGNhY2hlIGxpbmUKIAlyZXQKIEVORFBST0Moc2V0X2NwdV9ib290X21vZGVfZmxhZykKIAogLyoKKyAqIFRoZXNlIHZhbHVlcyBhcmUgd3JpdHRlbiB3aXRoIHRoZSBNTVUgb2ZmLCBidXQgcmVhZCB3aXRoIHRoZSBNTVUgb24uCisgKiBXcml0ZXJzIHdpbGwgaW52YWxpZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBhZGRyZXNzLCBkaXNjYXJkaW5nIHVwIHRvIGEKKyAqICdDYWNoZSBXcml0ZWJhY2sgR3JhbnVsZScgKENXRykgd29ydGggb2YgZGF0YS4gVGhlIGxpbmtlciBzY3JpcHQgZW5zdXJlcworICogc3VmZmljaWVudCBhbGlnbm1lbnQgdGhhdCB0aGUgQ1dHIGRvZXNuJ3Qgb3ZlcmxhcCBhbm90aGVyIHNlY3Rpb24uCisgKi8KKwkucHVzaHNlY3Rpb24gIi5tbXVvZmYuZGF0YS53cml0ZSIsICJhdyIKKy8qCiAgKiBXZSBuZWVkIHRvIGZpbmQgb3V0IHRoZSBDUFUgYm9vdCBtb2RlIGxvbmcgYWZ0ZXIgYm9vdCwgc28gd2UgbmVlZCB0bwogICogc3RvcmUgaXQgaW4gYSB3cml0YWJsZSB2YXJpYWJsZS4KICAqCiAgKiBUaGlzIGlzIG5vdCBpbiAuYnNzLCBiZWNhdXNlIHdlIHNldCBpdCBzdWZmaWNpZW50bHkgZWFybHkgdGhhdCB0aGUgYm9vdC10aW1lCiAgKiB6ZXJvaW5nIG9mIC5ic3Mgd291bGQgY2xvYmJlciBpdC4KICAqLwotCS5wdXNoc2VjdGlvbgkuZGF0YS4uY2FjaGVsaW5lX2FsaWduZWQKLQkuYWxpZ24JTDFfQ0FDSEVfU0hJRlQKIEVOVFJZKF9fYm9vdF9jcHVfbW9kZSkKIAkubG9uZwlCT09UX0NQVV9NT0RFX0VMMgogCS5sb25nCUJPT1RfQ1BVX01PREVfRUwxCisvKgorICogVGhlIGJvb3RpbmcgQ1BVIHVwZGF0ZXMgdGhlIGZhaWxlZCBzdGF0dXMgQF9fZWFybHlfY3B1X2Jvb3Rfc3RhdHVzLAorICogd2l0aCBNTVUgdHVybmVkIG9mZi4KKyAqLworRU5UUlkoX19lYXJseV9jcHVfYm9vdF9zdGF0dXMpCisJLmxvbmcgCTAKKwogCS5wb3BzZWN0aW9uCiAKIAkvKgpAQCAtNjM5LDcgKzY1OSw3IEBACiAJICogY29yZXMgYXJlIGhlbGQgdW50aWwgd2UncmUgcmVhZHkgZm9yIHRoZW0gdG8gaW5pdGlhbGlzZS4KIAkgKi8KIEVOVFJZKHNlY29uZGFyeV9ob2xkaW5nX3BlbikKLQlibAllbDJfc2V0dXAJCQkvLyBEcm9wIHRvIEVMMSwgdzIwPWNwdV9ib290X21vZGUKKwlibAllbDJfc2V0dXAJCQkvLyBEcm9wIHRvIEVMMSwgdzA9Y3B1X2Jvb3RfbW9kZQogCWJsCXNldF9jcHVfYm9vdF9tb2RlX2ZsYWcKIAltcnMJeDAsIG1waWRyX2VsMQogCW1vdl9xCXgxLCBNUElEUl9IV0lEX0JJVE1BU0sKQEAgLTY2NiwxMiArNjg2LDEwIEBACiAJLyoKIAkgKiBDb21tb24gZW50cnkgcG9pbnQgZm9yIHNlY29uZGFyeSBDUFVzLgogCSAqLwotCWFkcnAJeDI1LCBpZG1hcF9wZ19kaXIKLQlhZHJwCXgyNiwgc3dhcHBlcl9wZ19kaXIKIAlibAlfX2NwdV9zZXR1cAkJCS8vIGluaXRpYWxpc2UgcHJvY2Vzc29yCi0KLQlhZHJfbAl4MjcsIF9fc2Vjb25kYXJ5X3N3aXRjaAkJLy8gYWRkcmVzcyB0byBqdW1wIHRvIGFmdGVyIGVuYWJsaW5nIHRoZSBNTVUKLQliCV9fZW5hYmxlX21tdQorCWJsCV9fZW5hYmxlX21tdQorCWxkcgl4OCwgPV9fc2Vjb25kYXJ5X3N3aXRjaGVkCisJYnIJeDgKIEVORFBST0Moc2Vjb25kYXJ5X3N0YXJ0dXApCiAKIF9fc2Vjb25kYXJ5X3N3aXRjaGVkOgpAQCAtNzA2LDMzICs3MjQsMjcgQEAKIAlkYwlpdmFjLCBcdG1wMQkJCS8vIEludmFsaWRhdGUgcG90ZW50aWFsbHkgc3RhbGUgY2FjaGUgbGluZQogCS5lbmRtCiAKLQkucHVzaHNlY3Rpb24JLmRhdGEuLmNhY2hlbGluZV9hbGlnbmVkCi0JLmFsaWduCUwxX0NBQ0hFX1NISUZUCi1FTlRSWShfX2Vhcmx5X2NwdV9ib290X3N0YXR1cykKLQkubG9uZyAJMAotCS5wb3BzZWN0aW9uCi0KIC8qCiAgKiBFbmFibGUgdGhlIE1NVS4KICAqCiAgKiAgeDAgID0gU0NUTFJfRUwxIHZhbHVlIGZvciB0dXJuaW5nIG9uIHRoZSBNTVUuCi0gKiAgeDI3ID0gKnZpcnR1YWwqIGFkZHJlc3MgdG8ganVtcCB0byB1cG9uIGNvbXBsZXRpb24KICAqCi0gKiBPdGhlciByZWdpc3RlcnMgZGVwZW5kIG9uIHRoZSBmdW5jdGlvbiBjYWxsZWQgdXBvbiBjb21wbGV0aW9uLgorICogUmV0dXJucyB0byB0aGUgY2FsbGVyIHZpYSB4MzAvbHIuIFRoaXMgcmVxdWlyZXMgdGhlIGNhbGxlciB0byBiZSBjb3ZlcmVkCisgKiBieSB0aGUgLmlkbWFwLnRleHQgc2VjdGlvbi4KICAqCiAgKiBDaGVja3MgaWYgdGhlIHNlbGVjdGVkIGdyYW51bGUgc2l6ZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIENQVS4KICAqIElmIGl0IGlzbid0LCBwYXJrIHRoZSBDUFUKICAqLwotCS5zZWN0aW9uCSIuaWRtYXAudGV4dCIsICJheCIKIEVOVFJZKF9fZW5hYmxlX21tdSkKLQltcnMJeDIyLCBzY3Rscl9lbDEJCQkvLyBwcmVzZXJ2ZSBvbGQgU0NUTFJfRUwxIHZhbHVlCiAJbXJzCXgxLCBJRF9BQTY0TU1GUjBfRUwxCiAJdWJmeAl4MiwgeDEsICNJRF9BQTY0TU1GUjBfVEdSQU5fU0hJRlQsIDQKIAljbXAJeDIsICNJRF9BQTY0TU1GUjBfVEdSQU5fU1VQUE9SVEVECiAJYi5uZQlfX25vX2dyYW51bGVfc3VwcG9ydAogCXVwZGF0ZV9lYXJseV9jcHVfYm9vdF9zdGF0dXMgMCwgeDEsIHgyCi0JbXNyCXR0YnIwX2VsMSwgeDI1CQkJLy8gbG9hZCBUVEJSMAotCW1zcgl0dGJyMV9lbDEsIHgyNgkJCS8vIGxvYWQgVFRCUjEKKwlhZHJwCXgxLCBpZG1hcF9wZ19kaXIKKwlhZHJwCXgyLCBzd2FwcGVyX3BnX2RpcgorCW1zcgl0dGJyMF9lbDEsIHgxCQkJLy8gbG9hZCBUVEJSMAorCW1zcgl0dGJyMV9lbDEsIHgyCQkJLy8gbG9hZCBUVEJSMQogCWlzYgogCW1zcglzY3Rscl9lbDEsIHgwCiAJaXNiCkBAIC03NDQsMjYgKzc1Niw3IEBACiAJaWMJaWFsbHUKIAlkc2IJbnNoCiAJaXNiCi0jaWZkZWYgQ09ORklHX1JBTkRPTUlaRV9CQVNFCi0JbW92CXgxOSwgeDAJCQkJLy8gcHJlc2VydmUgbmV3IFNDVExSX0VMMSB2YWx1ZQotCWJscgl4MjcKLQotCS8qCi0JICogSWYgd2UgcmV0dXJuIGhlcmUsIHdlIGhhdmUgYSBLQVNMUiBkaXNwbGFjZW1lbnQgaW4geDIzIHdoaWNoIHdlIG5lZWQKLQkgKiB0byB0YWtlIGludG8gYWNjb3VudCBieSBkaXNjYXJkaW5nIHRoZSBjdXJyZW50IGtlcm5lbCBtYXBwaW5nIGFuZAotCSAqIGNyZWF0aW5nIGEgbmV3IG9uZS4KLQkgKi8KLQltc3IJc2N0bHJfZWwxLCB4MjIJCQkvLyBkaXNhYmxlIHRoZSBNTVUKLQlpc2IKLQlibAlfX2NyZWF0ZV9wYWdlX3RhYmxlcwkJLy8gcmVjcmVhdGUga2VybmVsIG1hcHBpbmcKLQotCW1zcglzY3Rscl9lbDEsIHgxOQkJCS8vIHJlLWVuYWJsZSB0aGUgTU1VCi0JaXNiCi0JaWMJaWFsbHUJCQkJLy8gZmx1c2ggaW5zdHJ1Y3Rpb25zIGZldGNoZWQKLQlkc2IJbnNoCQkJCS8vIHZpYSBvbGQgbWFwcGluZwotCWlzYgotI2VuZGlmCi0JYnIJeDI3CisJcmV0CiBFTkRQUk9DKF9fZW5hYmxlX21tdSkKIAogX19ub19ncmFudWxlX3N1cHBvcnQ6CkBAIC03NzIsMTEgKzc2NSwxMSBAQAogMToKIAl3ZmUKIAl3ZmkKLQliIDFiCisJYgkxYgogRU5EUFJPQyhfX25vX2dyYW51bGVfc3VwcG9ydCkKIAotX19wcmltYXJ5X3N3aXRjaDoKICNpZmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKK19fcmVsb2NhdGVfa2VybmVsOgogCS8qCiAJICogSXRlcmF0ZSBvdmVyIGVhY2ggZW50cnkgaW4gdGhlIHJlbG9jYXRpb24gdGFibGUsIGFuZCBhcHBseSB0aGUKIAkgKiByZWxvY2F0aW9ucyBpbiBwbGFjZS4KQEAgLTc5OCwxNCArNzkxLDQ2IEBACiAJYWRkCXgxMywgeDEzLCB4MjMJCQkvLyByZWxvY2F0ZQogCXN0cgl4MTMsIFt4MTEsIHgyM10KIAliCTBiCisxOglyZXQKK0VORFBST0MoX19yZWxvY2F0ZV9rZXJuZWwpCisjZW5kaWYKIAotMToKK19fcHJpbWFyeV9zd2l0Y2g6CisjaWZkZWYgQ09ORklHX1JBTkRPTUlaRV9CQVNFCisJbW92CXgxOSwgeDAJCQkJLy8gcHJlc2VydmUgbmV3IFNDVExSX0VMMSB2YWx1ZQorCW1ycwl4MjAsIHNjdGxyX2VsMQkJCS8vIHByZXNlcnZlIG9sZCBTQ1RMUl9FTDEgdmFsdWUKKyNlbmRpZgorCisJYmwJX19lbmFibGVfbW11CisjaWZkZWYgQ09ORklHX1JFTE9DQVRBQkxFCisJYmwJX19yZWxvY2F0ZV9rZXJuZWwKKyNpZmRlZiBDT05GSUdfUkFORE9NSVpFX0JBU0UKKwlsZHIJeDgsID1fX3ByaW1hcnlfc3dpdGNoZWQKKwlhZHJwCXgwLCBfX1BIWVNfT0ZGU0VUCisJYmxyCXg4CisKKwkvKgorCSAqIElmIHdlIHJldHVybiBoZXJlLCB3ZSBoYXZlIGEgS0FTTFIgZGlzcGxhY2VtZW50IGluIHgyMyB3aGljaCB3ZSBuZWVkCisJICogdG8gdGFrZSBpbnRvIGFjY291bnQgYnkgZGlzY2FyZGluZyB0aGUgY3VycmVudCBrZXJuZWwgbWFwcGluZyBhbmQKKwkgKiBjcmVhdGluZyBhIG5ldyBvbmUuCisJICovCisJbXNyCXNjdGxyX2VsMSwgeDIwCQkJLy8gZGlzYWJsZSB0aGUgTU1VCisJaXNiCisJYmwJX19jcmVhdGVfcGFnZV90YWJsZXMJCS8vIHJlY3JlYXRlIGtlcm5lbCBtYXBwaW5nCisKKwl0bGJpCXZtYWxsZTEJCQkJLy8gUmVtb3ZlIGFueSBzdGFsZSBUTEIgZW50cmllcworCWRzYgluc2gKKworCW1zcglzY3Rscl9lbDEsIHgxOQkJCS8vIHJlLWVuYWJsZSB0aGUgTU1VCisJaXNiCisJaWMJaWFsbHUJCQkJLy8gZmx1c2ggaW5zdHJ1Y3Rpb25zIGZldGNoZWQKKwlkc2IJbnNoCQkJCS8vIHZpYSBvbGQgbWFwcGluZworCWlzYgorCisJYmwJX19yZWxvY2F0ZV9rZXJuZWwKKyNlbmRpZgogI2VuZGlmCiAJbGRyCXg4LCA9X19wcmltYXJ5X3N3aXRjaGVkCisJYWRycAl4MCwgX19QSFlTX09GRlNFVAogCWJyCXg4CiBFTkRQUk9DKF9fcHJpbWFyeV9zd2l0Y2gpCi0KLV9fc2Vjb25kYXJ5X3N3aXRjaDoKLQlsZHIJeDgsID1fX3NlY29uZGFyeV9zd2l0Y2hlZAotCWJyCXg4Ci1FTkRQUk9DKF9fc2Vjb25kYXJ5X3N3aXRjaCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2hpYmVybmF0ZS1hc20uUyBiL2FyY2gvYXJtNjQva2VybmVsL2hpYmVybmF0ZS1hc20uUwppbmRleCA0NmYyOWI2Li5lNTZkODQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9oaWJlcm5hdGUtYXNtLlMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvaGliZXJuYXRlLWFzbS5TCkBAIC0zNiw4ICszNiw4IEBACiAubWFjcm8gYnJlYWtfYmVmb3JlX21ha2VfdHRicl9zd2l0Y2ggemVyb19wYWdlLCBwYWdlX3RhYmxlCiAJbXNyCXR0YnIxX2VsMSwgXHplcm9fcGFnZQogCWlzYgotCXRsYmkJdm1hbGxlMWlzCi0JZHNiCWlzaAorCXRsYmkJdm1hbGxlMQorCWRzYgluc2gKIAltc3IJdHRicjFfZWwxLCBccGFnZV90YWJsZQogCWlzYgogLmVuZG0KQEAgLTk2LDcgKzk2LDcgQEAKIAogCWFkZAl4MSwgeDEwLCAjUEFHRV9TSVpFCiAJLyogQ2xlYW4gdGhlIGNvcGllZCBwYWdlIHRvIFBvVSAtIGJhc2VkIG9uIGZsdXNoX2ljYWNoZV9yYW5nZSgpICovCi0JZGNhY2hlX2xpbmVfc2l6ZSB4MiwgeDMKKwlyYXdfZGNhY2hlX2xpbmVfc2l6ZSB4MiwgeDMKIAlzdWIJeDMsIHgyLCAjMQogCWJpYwl4NCwgeDEwLCB4MwogMjoJZGMJY3ZhdSwgeDQJLyogY2xlYW4gRCBsaW5lIC8gdW5pZmllZCBsaW5lICovCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9oaWJlcm5hdGUuYyBiL2FyY2gvYXJtNjQva2VybmVsL2hpYmVybmF0ZS5jCmluZGV4IDY1ZDgxZjkuLmQ1NWE3YjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2hpYmVybmF0ZS5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2hpYmVybmF0ZS5jCkBAIC0xNSw5ICsxNSw5IEBACiAgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKICAqLwogI2RlZmluZSBwcl9mbXQoeCkgImhpYmVybmF0ZTogIiB4CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KQEAgLTI2LDYgKzI2LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9iYXJyaWVyLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgogI2luY2x1ZGUgPGFzbS9pcnFmbGFncy5oPgogI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KQEAgLTM0LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS1od2RlZi5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vc21wX3BsYXQuaD4KICNpbmNsdWRlIDxhc20vc3VzcGVuZC5oPgogI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KICNpbmNsdWRlIDxhc20vdmlydC5oPgpAQCAtNTQsMTIgKzU2LDYgQEAKIC8qIERvIHdlIG5lZWQgdG8gcmVzZXQgZWwyPyAqLwogI2RlZmluZSBlbDJfcmVzZXRfbmVlZGVkKCkgKGlzX2h5cF9tb2RlX2F2YWlsYWJsZSgpICYmICFpc19rZXJuZWxfaW5faHlwX21vZGUoKSkKIAotLyoKLSAqIFN0YXJ0L2VuZCBvZiB0aGUgaGliZXJuYXRlIGV4aXQgY29kZSwgdGhpcyBtdXN0IGJlIGNvcGllZCB0byBhICdzYWZlJwotICogbG9jYXRpb24gaW4gbWVtb3J5LCBhbmQgZXhlY3V0ZWQgZnJvbSB0aGVyZS4KLSAqLwotZXh0ZXJuIGNoYXIgX19oaWJlcm5hdGVfZXhpdF90ZXh0X3N0YXJ0W10sIF9faGliZXJuYXRlX2V4aXRfdGV4dF9lbmRbXTsKLQogLyogdGVtcG9yYXJ5IGVsMiB2ZWN0b3JzIGluIHRoZSBfX2hpYmVybmF0ZV9leGl0X3RleHQgc2VjdGlvbi4gKi8KIGV4dGVybiBjaGFyIGhpYmVybmF0ZV9lbDJfdmVjdG9yc1tdOwogCkBAIC02Nyw2ICs2MywxMiBAQAogZXh0ZXJuIGNoYXIgX19oeXBfc3R1Yl92ZWN0b3JzW107CiAKIC8qCisgKiBUaGUgbG9naWNhbCBjcHUgbnVtYmVyIHdlIHNob3VsZCByZXN1bWUgb24sIGluaXRpYWxpc2VkIHRvIGEgbm9uLWNwdQorICogbnVtYmVyLgorICovCitzdGF0aWMgaW50IHNsZWVwX2NwdSA9IC1FSU5WQUw7CisKKy8qCiAgKiBWYWx1ZXMgdGhhdCBtYXkgbm90IGNoYW5nZSBvdmVyIGhpYmVybmF0ZS9yZXN1bWUuIFdlIHB1dCB0aGUgYnVpbGQgbnVtYmVyCiAgKiBhbmQgZGF0ZSBpbiBoZXJlIHNvIHRoYXQgd2UgZ3VhcmFudGVlIG5vdCB0byByZXN1bWUgd2l0aCBhIGRpZmZlcmVudAogICoga2VybmVsLgpAQCAtODgsNiArOTAsOCBAQAogCSAqIHJlLWNvbmZpZ3VyZSBlbDIuCiAJICovCiAJcGh5c19hZGRyX3QJX19oeXBfc3R1Yl92ZWN0b3JzOworCisJdTY0CQlzbGVlcF9jcHVfbXBpZHI7CiB9IHJlc3VtZV9oZHI7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2hkcl9pbnZhcmlhbnRzKHN0cnVjdCBhcmNoX2hpYmVybmF0ZV9oZHJfaW52YXJpYW50cyAqaSkKQEAgLTEzMCwxMiArMTM0LDIyIEBACiAJZWxzZQogCQloZHItPl9faHlwX3N0dWJfdmVjdG9ycyA9IDA7CiAKKwkvKiBTYXZlIHRoZSBtcGlkciBvZiB0aGUgY3B1IHdlIGNhbGxlZCBjcHVfc3VzcGVuZCgpIG9uLi4uICovCisJaWYgKHNsZWVwX2NwdSA8IDApIHsKKwkJcHJfZXJyKCJGYWlsaW5nIHRvIGhpYmVybmF0ZSBvbiBhbiB1bmtvd24gQ1BVLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwloZHItPnNsZWVwX2NwdV9tcGlkciA9IGNwdV9sb2dpY2FsX21hcChzbGVlcF9jcHUpOworCXByX2luZm8oIkhpYmVybmF0aW5nIG9uIENQVSAlZCBbbXBpZHI6MHglbGx4XVxuIiwgc2xlZXBfY3B1LAorCQloZHItPnNsZWVwX2NwdV9tcGlkcik7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woYXJjaF9oaWJlcm5hdGlvbl9oZWFkZXJfc2F2ZSk7CiAKIGludCBhcmNoX2hpYmVybmF0aW9uX2hlYWRlcl9yZXN0b3JlKHZvaWQgKmFkZHIpCiB7CisJaW50IHJldDsKIAlzdHJ1Y3QgYXJjaF9oaWJlcm5hdGVfaGRyX2ludmFyaWFudHMgaW52YXJpYW50czsKIAlzdHJ1Y3QgYXJjaF9oaWJlcm5hdGVfaGRyICpoZHIgPSBhZGRyOwogCkBAIC0xNDUsNiArMTU5LDI0IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCXNsZWVwX2NwdSA9IGdldF9sb2dpY2FsX2luZGV4KGhkci0+c2xlZXBfY3B1X21waWRyKTsKKwlwcl9pbmZvKCJIaWJlcm5hdGVkIG9uIENQVSAlZCBbbXBpZHI6MHglbGx4XVxuIiwgc2xlZXBfY3B1LAorCQloZHItPnNsZWVwX2NwdV9tcGlkcik7CisJaWYgKHNsZWVwX2NwdSA8IDApIHsKKwkJcHJfY3JpdCgiSGliZXJuYXRlZCBvbiBhIENQVSBub3Qga25vd24gdG8gdGhpcyBrZXJuZWwhXG4iKTsKKwkJc2xlZXBfY3B1ID0gLUVJTlZBTDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghY3B1X29ubGluZShzbGVlcF9jcHUpKSB7CisJCXByX2luZm8oIkhpYmVybmF0ZWQgb24gYSBDUFUgdGhhdCBpcyBvZmZsaW5lISBCcmluZ2luZyBDUFUgdXAuXG4iKTsKKwkJcmV0ID0gY3B1X3VwKHNsZWVwX2NwdSk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIGJyaW5nIGhpYmVybmF0ZS1DUFUgdXAhXG4iKTsKKwkJCXNsZWVwX2NwdSA9IC1FSU5WQUw7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCiAJcmVzdW1lX2hkciA9ICpoZHI7CiAKIAlyZXR1cm4gMDsKQEAgLTI0MSw2ICsyNzMsNyBAQAogCXJldHVybiByYzsKIH0KIAorI2RlZmluZSBkY2FjaGVfY2xlYW5fcmFuZ2Uoc3RhcnQsIGVuZCkJX19mbHVzaF9kY2FjaGVfYXJlYShzdGFydCwgKGVuZCAtIHN0YXJ0KSkKIAogaW50IHN3c3VzcF9hcmNoX3N1c3BlbmQodm9pZCkKIHsKQEAgLTI1NiwxMCArMjg5LDE2IEBACiAJbG9jYWxfZGJnX3NhdmUoZmxhZ3MpOwogCiAJaWYgKF9fY3B1X3N1c3BlbmRfZW50ZXIoJnN0YXRlKSkgeworCQlzbGVlcF9jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJCXJldCA9IHN3c3VzcF9zYXZlKCk7CiAJfSBlbHNlIHsKLQkJLyogQ2xlYW4ga2VybmVsIHRvIFBvQyBmb3Igc2Vjb25kYXJ5IGNvcmUgc3RhcnR1cCAqLwotCQlfX2ZsdXNoX2RjYWNoZV9hcmVhKExNQUREUihLRVJORUxfU1RBUlQpLCBLRVJORUxfRU5EIC0gS0VSTkVMX1NUQVJUKTsKKwkJLyogQ2xlYW4ga2VybmVsIGNvcmUgc3RhcnR1cC9pZGxlIGNvZGUgdG8gUG9DKi8KKwkJZGNhY2hlX2NsZWFuX3JhbmdlKF9fbW11b2ZmX2RhdGFfc3RhcnQsIF9fbW11b2ZmX2RhdGFfZW5kKTsKKwkJZGNhY2hlX2NsZWFuX3JhbmdlKF9faWRtYXBfdGV4dF9zdGFydCwgX19pZG1hcF90ZXh0X2VuZCk7CisKKwkJLyogQ2xlYW4ga3ZtIHNldHVwIGNvZGUgdG8gUG9DPyAqLworCQlpZiAoZWwyX3Jlc2V0X25lZWRlZCgpKQorCQkJZGNhY2hlX2NsZWFuX3JhbmdlKF9faHlwX2lkbWFwX3RleHRfc3RhcnQsIF9faHlwX2lkbWFwX3RleHRfZW5kKTsKIAogCQkvKgogCQkgKiBUZWxsIHRoZSBoaWJlcm5hdGlvbiBjb3JlIHRoYXQgd2UndmUganVzdCByZXN0b3JlZApAQCAtMjY3LDYgKzMwNiw3IEBACiAJCSAqLwogCQlpbl9zdXNwZW5kID0gMDsKIAorCQlzbGVlcF9jcHUgPSAtRUlOVkFMOwogCQlfX2NwdV9zdXNwZW5kX2V4aXQoKTsKIAl9CiAKQEAgLTI3NSw2ICszMTUsMzMgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBfY29weV9wdGUocHRlX3QgKmRzdF9wdGUsIHB0ZV90ICpzcmNfcHRlLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJcHRlX3QgcHRlID0gKnNyY19wdGU7CisKKwlpZiAocHRlX3ZhbGlkKHB0ZSkpIHsKKwkJLyoKKwkJICogUmVzdW1lIHdpbGwgb3ZlcndyaXRlIGFyZWFzIHRoYXQgbWF5IGJlIG1hcmtlZAorCQkgKiByZWFkIG9ubHkgKGNvZGUsIHJvZGF0YSkuIENsZWFyIHRoZSBSRE9OTFkgYml0IGZyb20KKwkJICogdGhlIHRlbXBvcmFyeSBtYXBwaW5ncyB3ZSB1c2UgZHVyaW5nIHJlc3RvcmUuCisJCSAqLworCQlzZXRfcHRlKGRzdF9wdGUsIHB0ZV9jbGVhcl9yZG9ubHkocHRlKSk7CisJfSBlbHNlIGlmIChkZWJ1Z19wYWdlYWxsb2NfZW5hYmxlZCgpICYmICFwdGVfbm9uZShwdGUpKSB7CisJCS8qCisJCSAqIGRlYnVnX3BhZ2VhbGxvYyB3aWxsIHJlbW92ZWQgdGhlIFBURV9WQUxJRCBiaXQgaWYKKwkJICogdGhlIHBhZ2UgaXNuJ3QgaW4gdXNlIGJ5IHRoZSByZXN1bWUga2VybmVsLiBJdCBtYXkgaGF2ZQorCQkgKiBiZWVuIGluIHVzZSBieSB0aGUgb3JpZ2luYWwga2VybmVsLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQKKwkJICogdG8gcHV0IGl0IGJhY2sgaW4gb3VyIGNvcHkgdG8gZG8gdGhlIHJlc3RvcmUuCisJCSAqCisJCSAqIEJlZm9yZSBtYXJraW5nIHRoaXMgZW50cnkgdmFsaWQsIGNoZWNrIHRoZSBwZm4gc2hvdWxkCisJCSAqIGJlIG1hcHBlZC4KKwkJICovCisJCUJVR19PTighcGZuX3ZhbGlkKHB0ZV9wZm4ocHRlKSkpOworCisJCXNldF9wdGUoZHN0X3B0ZSwgcHRlX21rcHJlc2VudChwdGVfY2xlYXJfcmRvbmx5KHB0ZSkpKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgY29weV9wdGUocG1kX3QgKmRzdF9wbWQsIHBtZF90ICpzcmNfcG1kLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAogCQkgICAgdW5zaWduZWQgbG9uZyBlbmQpCiB7CkBAIC0yOTAsMTMgKzM1Nyw3IEBACiAKIAlzcmNfcHRlID0gcHRlX29mZnNldF9rZXJuZWwoc3JjX3BtZCwgc3RhcnQpOwogCWRvIHsKLQkJaWYgKCFwdGVfbm9uZSgqc3JjX3B0ZSkpCi0JCQkvKgotCQkJICogUmVzdW1lIHdpbGwgb3ZlcndyaXRlIGFyZWFzIHRoYXQgbWF5IGJlIG1hcmtlZAotCQkJICogcmVhZCBvbmx5IChjb2RlLCByb2RhdGEpLiBDbGVhciB0aGUgUkRPTkxZIGJpdCBmcm9tCi0JCQkgKiB0aGUgdGVtcG9yYXJ5IG1hcHBpbmdzIHdlIHVzZSBkdXJpbmcgcmVzdG9yZS4KLQkJCSAqLwotCQkJc2V0X3B0ZShkc3RfcHRlLCBfX3B0ZShwdGVfdmFsKCpzcmNfcHRlKSAmIH5QVEVfUkRPTkxZKSk7CisJCV9jb3B5X3B0ZShkc3RfcHRlLCBzcmNfcHRlLCBhZGRyKTsKIAl9IHdoaWxlIChkc3RfcHRlKyssIHNyY19wdGUrKywgYWRkciArPSBQQUdFX1NJWkUsIGFkZHIgIT0gZW5kKTsKIAogCXJldHVybiAwOwpAQCAtNDgzLDI3ICs1NDQsMTIgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfYm9vdF9jcHVfb25saW5lX3BtX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCi0JCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKnB0cikKK2ludCBoaWJlcm5hdGVfcmVzdW1lX25vbmJvb3RfY3B1X2Rpc2FibGUodm9pZCkKIHsKLQlpZiAoYWN0aW9uID09IFBNX0hJQkVSTkFUSU9OX1BSRVBBUkUgJiYKLQkgICAgIGNwdW1hc2tfZmlyc3QoY3B1X29ubGluZV9tYXNrKSAhPSAwKSB7Ci0JCXByX3dhcm4oIkNQVTAgaXMgb2ZmbGluZS5cbiIpOwotCQlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubygtRU5PREVWKTsKKwlpZiAoc2xlZXBfY3B1IDwgMCkgeworCQlwcl9lcnIoIkZhaWxpbmcgdG8gcmVzdW1lIGZyb20gaGliZXJuYXRlIG9uIGFuIHVua293biBDUFUuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JcmV0dXJuIE5PVElGWV9PSzsKKwlyZXR1cm4gZnJlZXplX3NlY29uZGFyeV9jcHVzKHNsZWVwX2NwdSk7CiB9Ci0KLXN0YXRpYyBpbnQgX19pbml0IGNoZWNrX2Jvb3RfY3B1X29ubGluZV9pbml0KHZvaWQpCi17Ci0JLyoKLQkgKiBTZXQgdGhpcyBwbV9ub3RpZmllciBjYWxsYmFjayB3aXRoIGEgbG93ZXIgcHJpb3JpdHkgdGhhbgotCSAqIGNwdV9ob3RwbHVnX3BtX2NhbGxiYWNrLCBzbyB0aGF0IGNwdV9ob3RwbHVnX3BtX2NhbGxiYWNrIHdpbGwgYmUKLQkgKiBjYWxsZWQgZWFybGllciB0byBkaXNhYmxlIGNwdSBob3RwbHVnIGJlZm9yZSB0aGUgY3B1IG9ubGluZSBjaGVjay4KLQkgKi8KLQlwbV9ub3RpZmllcihjaGVja19ib290X2NwdV9vbmxpbmVfcG1fY2FsbGJhY2ssIC1JTlRfTUFYKTsKLQotCXJldHVybiAwOwotfQotY29yZV9pbml0Y2FsbChjaGVja19ib290X2NwdV9vbmxpbmVfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9od19icmVha3BvaW50LmMgYi9hcmNoL2FybTY0L2tlcm5lbC9od19icmVha3BvaW50LmMKaW5kZXggMjZhNmJmNy4uOTQ4YjczMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2h3X2JyZWFrcG9pbnQuYwpAQCAtODU3LDcgKzg1Nyw3IEBACiAvKgogICogQ1BVIGluaXRpYWxpc2F0aW9uLgogICovCi1zdGF0aWMgdm9pZCBod19icmVha3BvaW50X3Jlc2V0KHZvaWQgKnVudXNlZCkKK3N0YXRpYyBpbnQgaHdfYnJlYWtwb2ludF9yZXNldCh1bnNpZ25lZCBpbnQgY3B1KQogewogCWludCBpOwogCXN0cnVjdCBwZXJmX2V2ZW50ICoqc2xvdHM7CkBAIC04ODgsMjggKzg4OCwxNCBAQAogCQkJd3JpdGVfd2JfcmVnKEFBUkNINjRfREJHX1JFR19XVlIsIGksIDBVTCk7CiAJCX0KIAl9Ci19CiAKLXN0YXRpYyBpbnQgaHdfYnJlYWtwb2ludF9yZXNldF9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAotCQkJCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sCi0JCQkJCQl2b2lkICpoY3B1KQotewotCWlmICgoYWN0aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pID09IENQVV9PTkxJTkUpIHsKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJaHdfYnJlYWtwb2ludF9yZXNldChOVUxMKTsKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGh3X2JyZWFrcG9pbnRfcmVzZXRfbmIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBod19icmVha3BvaW50X3Jlc2V0X25vdGlmeSwKLX07Ci0KICNpZmRlZiBDT05GSUdfQ1BVX1BNCi1leHRlcm4gdm9pZCBjcHVfc3VzcGVuZF9zZXRfZGJnX3Jlc3RvcmVyKHZvaWQgKCpod19icF9yZXN0b3JlKSh2b2lkICopKTsKK2V4dGVybiB2b2lkIGNwdV9zdXNwZW5kX3NldF9kYmdfcmVzdG9yZXIoaW50ICgqaHdfYnBfcmVzdG9yZSkodW5zaWduZWQgaW50KSk7CiAjZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGNwdV9zdXNwZW5kX3NldF9kYmdfcmVzdG9yZXIodm9pZCAoKmh3X2JwX3Jlc3RvcmUpKHZvaWQgKikpCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X3N1c3BlbmRfc2V0X2RiZ19yZXN0b3JlcihpbnQgKCpod19icF9yZXN0b3JlKSh1bnNpZ25lZCBpbnQpKQogewogfQogI2VuZGlmCkBAIC05MTksMzYgKzkwNSwzNCBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBhcmNoX2h3X2JyZWFrcG9pbnRfaW5pdCh2b2lkKQogeworCWludCByZXQ7CisKIAljb3JlX251bV9icnBzID0gZ2V0X251bV9icnBzKCk7CiAJY29yZV9udW1fd3JwcyA9IGdldF9udW1fd3JwcygpOwogCiAJcHJfaW5mbygiZm91bmQgJWQgYnJlYWtwb2ludCBhbmQgJWQgd2F0Y2hwb2ludCByZWdpc3RlcnMuXG4iLAogCQljb3JlX251bV9icnBzLCBjb3JlX251bV93cnBzKTsKIAotCWNwdV9ub3RpZmllcl9yZWdpc3Rlcl9iZWdpbigpOwotCi0JLyoKLQkgKiBSZXNldCB0aGUgYnJlYWtwb2ludCByZXNvdXJjZXMuIFdlIGFzc3VtZSB0aGF0IGEgaGFsdGluZwotCSAqIGRlYnVnZ2VyIHdpbGwgbGVhdmUgdGhlIHdvcmxkIGluIGEgbmljZSBzdGF0ZSBmb3IgdXMuCi0JICovCi0Jc21wX2NhbGxfZnVuY3Rpb24oaHdfYnJlYWtwb2ludF9yZXNldCwgTlVMTCwgMSk7Ci0JaHdfYnJlYWtwb2ludF9yZXNldChOVUxMKTsKLQogCS8qIFJlZ2lzdGVyIGRlYnVnIGZhdWx0IGhhbmRsZXJzLiAqLwogCWhvb2tfZGVidWdfZmF1bHRfY29kZShEQkdfRVNSX0VWVF9IV0JQLCBicmVha3BvaW50X2hhbmRsZXIsIFNJR1RSQVAsCiAJCQkgICAgICBUUkFQX0hXQktQVCwgImh3LWJyZWFrcG9pbnQgaGFuZGxlciIpOwogCWhvb2tfZGVidWdfZmF1bHRfY29kZShEQkdfRVNSX0VWVF9IV1dQLCB3YXRjaHBvaW50X2hhbmRsZXIsIFNJR1RSQVAsCiAJCQkgICAgICBUUkFQX0hXQktQVCwgImh3LXdhdGNocG9pbnQgaGFuZGxlciIpOwogCi0JLyogUmVnaXN0ZXIgaG90cGx1ZyBub3RpZmllci4gKi8KLQlfX3JlZ2lzdGVyX2NwdV9ub3RpZmllcigmaHdfYnJlYWtwb2ludF9yZXNldF9uYik7Ci0KLQljcHVfbm90aWZpZXJfcmVnaXN0ZXJfZG9uZSgpOworCS8qCisJICogUmVzZXQgdGhlIGJyZWFrcG9pbnQgcmVzb3VyY2VzLiBXZSBhc3N1bWUgdGhhdCBhIGhhbHRpbmcKKwkgKiBkZWJ1Z2dlciB3aWxsIGxlYXZlIHRoZSB3b3JsZCBpbiBhIG5pY2Ugc3RhdGUgZm9yIHVzLgorCSAqLworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlKENQVUhQX0FQX1BFUkZfQVJNX0hXX0JSRUFLUE9JTlRfU1RBUlRJTkcsCisJCQkgICJDUFVIUF9BUF9QRVJGX0FSTV9IV19CUkVBS1BPSU5UX1NUQVJUSU5HIiwKKwkJCSAgaHdfYnJlYWtwb2ludF9yZXNldCwgTlVMTCk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgQ1BVIGhvdHBsdWcgbm90aWZpZXI6ICVkXG4iLCByZXQpOwogCiAJLyogUmVnaXN0ZXIgY3B1X3N1c3BlbmQgaHcgYnJlYWtwb2ludCByZXN0b3JlIGhvb2sgKi8KIAljcHVfc3VzcGVuZF9zZXRfZGJnX3Jlc3RvcmVyKGh3X2JyZWFrcG9pbnRfcmVzZXQpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIGFyY2hfaW5pdGNhbGwoYXJjaF9od19icmVha3BvaW50X2luaXQpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9pbnNuLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9pbnNuLmMKaW5kZXggNjNmOTQzMi4uNmYyYWM0ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvaW5zbi5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2luc24uYwpAQCAtOTYsNyArOTYsNyBAQAogCiAJaWYgKG1vZHVsZSAmJiBJU19FTkFCTEVEKENPTkZJR19ERUJVR19TRVRfTU9EVUxFX1JPTlgpKQogCQlwYWdlID0gdm1hbGxvY190b19wYWdlKGFkZHIpOwotCWVsc2UgaWYgKCFtb2R1bGUgJiYgSVNfRU5BQkxFRChDT05GSUdfREVCVUdfUk9EQVRBKSkKKwllbHNlIGlmICghbW9kdWxlKQogCQlwYWdlID0gcGZuX3RvX3BhZ2UoUEhZU19QRk4oX19wYShhZGRyKSkpOwogCWVsc2UKIAkJcmV0dXJuIGFkZHI7CkBAIC0xMjAyLDYgKzEyMDIsMTkgQEAKIAlCVUcoKTsKIH0KIAorczMyIGFhcmNoNjRfaW5zbl9hZHJwX2dldF9vZmZzZXQodTMyIGluc24pCit7CisJQlVHX09OKCFhYXJjaDY0X2luc25faXNfYWRycChpbnNuKSk7CisJcmV0dXJuIGFhcmNoNjRfaW5zbl9kZWNvZGVfaW1tZWRpYXRlKEFBUkNINjRfSU5TTl9JTU1fQURSLCBpbnNuKSA8PCAxMjsKK30KKwordTMyIGFhcmNoNjRfaW5zbl9hZHJwX3NldF9vZmZzZXQodTMyIGluc24sIHMzMiBvZmZzZXQpCit7CisJQlVHX09OKCFhYXJjaDY0X2luc25faXNfYWRycChpbnNuKSk7CisJcmV0dXJuIGFhcmNoNjRfaW5zbl9lbmNvZGVfaW1tZWRpYXRlKEFBUkNINjRfSU5TTl9JTU1fQURSLCBpbnNuLAorCQkJCQkJb2Zmc2V0ID4+IDEyKTsKK30KKwogLyoKICAqIEV4dHJhY3QgdGhlIE9wL0NSIGRhdGEgZnJvbSBhIG1zci9tcnMgaW5zdHJ1Y3Rpb24uCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2thc2xyLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9rYXNsci5jCmluZGV4IGIwNTQ2OTEuLjc2OWYyNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2thc2xyLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwva2FzbHIuYwpAQCAtNiw2ICs2LDcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpYmZkdC5oPgpAQCAtMjAsNyArMjEsNyBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAKLXU2NCBfX3JlYWRfbW9zdGx5IG1vZHVsZV9hbGxvY19iYXNlOwordTY0IF9fcm9fYWZ0ZXJfaW5pdCBtb2R1bGVfYWxsb2NfYmFzZTsKIHUxNiBfX2luaXRkYXRhIG1lbXN0YXJ0X29mZnNldF9zZWVkOwogCiBzdGF0aWMgX19pbml0IHU2NCBnZXRfa2FzbHJfc2VlZCh2b2lkICpmZHQpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9rZ2RiLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9rZ2RiLmMKaW5kZXggOGM1N2Y2NC4uZTAxN2E5NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwva2dkYi5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2tnZGIuYwpAQCAtMTksMTAgKzE5LDEzIEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgva2dkYi5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKyNpbmNsdWRlIDxhc20vZGVidWctbW9uaXRvcnMuaD4KKyNpbmNsdWRlIDxhc20vaW5zbi5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogCiBzdHJ1Y3QgZGJnX3JlZ19kZWZfdCBkYmdfcmVnX2RlZltEQkdfTUFYX1JFR19OVU1dID0gewpAQCAtMzM4LDE1ICszNDEsMjQgQEAKIAl1bnJlZ2lzdGVyX2RpZV9ub3RpZmllcigma2dkYl9ub3RpZmllcik7CiB9CiAKLS8qCi0gKiBBUk0gaW5zdHJ1Y3Rpb25zIGFyZSBhbHdheXMgaW4gTEUuCi0gKiBCcmVhayBpbnN0cnVjdGlvbiBpcyBlbmNvZGVkIGluIExFIGZvcm1hdAotICovCi1zdHJ1Y3Qga2dkYl9hcmNoIGFyY2hfa2dkYl9vcHMgPSB7Ci0JLmdkYl9icHRfaW5zdHIgPSB7Ci0JCUtHREJfRFlOX0JSS19JTlNfQllURSgwKSwKLQkJS0dEQl9EWU5fQlJLX0lOU19CWVRFKDEpLAotCQlLR0RCX0RZTl9CUktfSU5TX0JZVEUoMiksCi0JCUtHREJfRFlOX0JSS19JTlNfQllURSgzKSwKLQl9Ci19Oworc3RydWN0IGtnZGJfYXJjaCBhcmNoX2tnZGJfb3BzOworCitpbnQga2dkYl9hcmNoX3NldF9icmVha3BvaW50KHN0cnVjdCBrZ2RiX2JrcHQgKmJwdCkKK3sKKwlpbnQgZXJyOworCisJQlVJTERfQlVHX09OKEFBUkNINjRfSU5TTl9TSVpFICE9IEJSRUFLX0lOU1RSX1NJWkUpOworCisJZXJyID0gYWFyY2g2NF9pbnNuX3JlYWQoKHZvaWQgKilicHQtPmJwdF9hZGRyLCAodTMyICopYnB0LT5zYXZlZF9pbnN0cik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBhYXJjaDY0X2luc25fd3JpdGUoKHZvaWQgKilicHQtPmJwdF9hZGRyLAorCQkJKHUzMilBQVJDSDY0X0JSRUFLX0tHREJfRFlOX0RCRyk7Cit9CisKK2ludCBrZ2RiX2FyY2hfcmVtb3ZlX2JyZWFrcG9pbnQoc3RydWN0IGtnZGJfYmtwdCAqYnB0KQoreworCXJldHVybiBhYXJjaDY0X2luc25fd3JpdGUoKHZvaWQgKilicHQtPmJwdF9hZGRyLAorCQkJKih1MzIgKilicHQtPnNhdmVkX2luc3RyKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3BlcmZfZXZlbnQuYyBiL2FyY2gvYXJtNjQva2VybmVsL3BlcmZfZXZlbnQuYwppbmRleCA4MzhjY2YxLi5hOTMxMGE2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvcGVyZl9ldmVudC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8YXNtL3N5c3JlZy5oPgogI2luY2x1ZGUgPGFzbS92aXJ0Lmg+CiAKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJmL2FybV9wbXUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTE5MCwxMyArMTkxLDIzIEBACiAjZGVmaW5lIEFSTVY4X1RIVU5ERVJfUEVSRkNUUl9MMUlfQ0FDSEVfUFJFRl9NSVNTCQkweEVECiAKIC8qIFBNVXYzIEhXIGV2ZW50cyBtYXBwaW5nLiAqLworCisvKgorICogQVJNdjggQXJjaGl0ZWN0dXJhbCBkZWZpbmVkIGV2ZW50cywgbm90IGFsbCBvZiB0aGVzZSBtYXkKKyAqIGJlIHN1cHBvcnRlZCBvbiBhbnkgZ2l2ZW4gaW1wbGVtZW50YXRpb24uIFVuZGVmaW5lZCBldmVudHMgd2lsbAorICogYmUgZGlzYWJsZWQgYXQgcnVuLXRpbWUuCisgKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBhcm12OF9wbXV2M19wZXJmX21hcFtQRVJGX0NPVU5UX0hXX01BWF0gPSB7CiAJUEVSRl9NQVBfQUxMX1VOU1VQUE9SVEVELAogCVtQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVNdCQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfQ1BVX0NZQ0xFUywKIAlbUEVSRl9DT1VOVF9IV19JTlNUUlVDVElPTlNdCQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfSU5TVF9SRVRJUkVELAogCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFRkVSRU5DRVNdCT0gQVJNVjhfUE1VVjNfUEVSRkNUUl9MMURfQ0FDSEUsCiAJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTXQkJPSBBUk1WOF9QTVVWM19QRVJGQ1RSX0wxRF9DQUNIRV9SRUZJTEwsCisJW1BFUkZfQ09VTlRfSFdfQlJBTkNIX0lOU1RSVUNUSU9OU10JPSBBUk1WOF9QTVVWM19QRVJGQ1RSX1BDX1dSSVRFX1JFVElSRUQsCiAJW1BFUkZfQ09VTlRfSFdfQlJBTkNIX01JU1NFU10JCT0gQVJNVjhfUE1VVjNfUEVSRkNUUl9CUl9NSVNfUFJFRCwKKwlbUEVSRl9DT1VOVF9IV19CVVNfQ1lDTEVTXQkJPSBBUk1WOF9QTVVWM19QRVJGQ1RSX0JVU19DWUNMRVMsCisJW1BFUkZfQ09VTlRfSFdfU1RBTExFRF9DWUNMRVNfRlJPTlRFTkRdCT0gQVJNVjhfUE1VVjNfUEVSRkNUUl9TVEFMTF9GUk9OVEVORCwKKwlbUEVSRl9DT1VOVF9IV19TVEFMTEVEX0NZQ0xFU19CQUNLRU5EXQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfU1RBTExfQkFDS0VORCwKIH07CiAKIC8qIEFSTSBDb3J0ZXgtQTUzIEhXIGV2ZW50cyBtYXBwaW5nLiAqLwpAQCAtMjU4LDYgKzI2OSwxNSBAQAogCVtDKEwxRCldW0MoT1BfV1JJVEUpXVtDKFJFU1VMVF9BQ0NFU1MpXQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfTDFEX0NBQ0hFLAogCVtDKEwxRCldW0MoT1BfV1JJVEUpXVtDKFJFU1VMVF9NSVNTKV0JPSBBUk1WOF9QTVVWM19QRVJGQ1RSX0wxRF9DQUNIRV9SRUZJTEwsCiAKKwlbQyhMMUkpXVtDKE9QX1JFQUQpXVtDKFJFU1VMVF9BQ0NFU1MpXQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfTDFJX0NBQ0hFLAorCVtDKEwxSSldW0MoT1BfUkVBRCldW0MoUkVTVUxUX01JU1MpXQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfTDFJX0NBQ0hFX1JFRklMTCwKKworCVtDKERUTEIpXVtDKE9QX1JFQUQpXVtDKFJFU1VMVF9NSVNTKV0JPSBBUk1WOF9QTVVWM19QRVJGQ1RSX0wxRF9UTEJfUkVGSUxMLAorCVtDKERUTEIpXVtDKE9QX1JFQUQpXVtDKFJFU1VMVF9BQ0NFU1MpXQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfTDFEX1RMQiwKKworCVtDKElUTEIpXVtDKE9QX1JFQUQpXVtDKFJFU1VMVF9NSVNTKV0JPSBBUk1WOF9QTVVWM19QRVJGQ1RSX0wxSV9UTEJfUkVGSUxMLAorCVtDKElUTEIpXVtDKE9QX1JFQUQpXVtDKFJFU1VMVF9BQ0NFU1MpXQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfTDFJX1RMQiwKKwogCVtDKEJQVSldW0MoT1BfUkVBRCldW0MoUkVTVUxUX0FDQ0VTUyldCT0gQVJNVjhfUE1VVjNfUEVSRkNUUl9CUl9QUkVELAogCVtDKEJQVSldW0MoT1BfUkVBRCldW0MoUkVTVUxUX01JU1MpXQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfQlJfTUlTX1BSRUQsCiAJW0MoQlBVKV1bQyhPUF9XUklURSldW0MoUkVTVUxUX0FDQ0VTUyldCT0gQVJNVjhfUE1VVjNfUEVSRkNUUl9CUl9QUkVELApAQCAtNTIzLDEyICs1NDMsNiBAQAogCS5hdHRycyA9IGFybXY4X3BtdXYzX2Zvcm1hdF9hdHRycywKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphcm12OF9wbXV2M19hdHRyX2dyb3Vwc1tdID0gewotCSZhcm12OF9wbXV2M19ldmVudHNfYXR0cl9ncm91cCwKLQkmYXJtdjhfcG11djNfZm9ybWF0X2F0dHJfZ3JvdXAsCi0JTlVMTCwKLX07Ci0KIC8qCiAgKiBQZXJmIEV2ZW50cycgaW5kaWNlcwogICovCkBAIC05MDUsOSArOTE5LDIyIEBACiAKIHN0YXRpYyBpbnQgYXJtdjhfcG11djNfbWFwX2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKLQlyZXR1cm4gYXJtcG11X21hcF9ldmVudChldmVudCwgJmFybXY4X3BtdXYzX3BlcmZfbWFwLAotCQkJCSZhcm12OF9wbXV2M19wZXJmX2NhY2hlX21hcCwKLQkJCQlBUk1WOF9QTVVfRVZUWVBFX0VWRU5UKTsKKwlpbnQgaHdfZXZlbnRfaWQ7CisJc3RydWN0IGFybV9wbXUgKmFybXBtdSA9IHRvX2FybV9wbXUoZXZlbnQtPnBtdSk7CisKKwlod19ldmVudF9pZCA9IGFybXBtdV9tYXBfZXZlbnQoZXZlbnQsICZhcm12OF9wbXV2M19wZXJmX21hcCwKKwkJCQkgICAgICAgJmFybXY4X3BtdXYzX3BlcmZfY2FjaGVfbWFwLAorCQkJCSAgICAgICBBUk1WOF9QTVVfRVZUWVBFX0VWRU5UKTsKKwlpZiAoaHdfZXZlbnRfaWQgPCAwKQorCQlyZXR1cm4gaHdfZXZlbnRfaWQ7CisKKwkvKiBkaXNhYmxlIG1pY3JvL2FyY2ggZXZlbnRzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBQTVUgKi8KKwlpZiAoKGh3X2V2ZW50X2lkIDwgQVJNVjhfUE1VVjNfTUFYX0NPTU1PTl9FVkVOVFMpICYmCisJCSF0ZXN0X2JpdChod19ldmVudF9pZCwgYXJtcG11LT5wbWNlaWRfYml0bWFwKSkgeworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiBod19ldmVudF9pZDsKIH0KIAogc3RhdGljIGludCBhcm12OF9hNTNfbWFwX2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKQEAgLTk4NSw3ICsxMDEyLDEwIEBACiAJYXJtdjhfcG11X2luaXQoY3B1X3BtdSk7CiAJY3B1X3BtdS0+bmFtZQkJCT0gImFybXY4X3BtdXYzIjsKIAljcHVfcG11LT5tYXBfZXZlbnQJCT0gYXJtdjhfcG11djNfbWFwX2V2ZW50OwotCWNwdV9wbXUtPnBtdS5hdHRyX2dyb3Vwcwk9IGFybXY4X3BtdXYzX2F0dHJfZ3JvdXBzOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0VWRU5UU10gPQorCQkmYXJtdjhfcG11djNfZXZlbnRzX2F0dHJfZ3JvdXA7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRk9STUFUU10gPQorCQkmYXJtdjhfcG11djNfZm9ybWF0X2F0dHJfZ3JvdXA7CiAJcmV0dXJuIGFybXY4cG11X3Byb2JlX3BtdShjcHVfcG11KTsKIH0KIApAQCAtOTk0LDcgKzEwMjQsMTAgQEAKIAlhcm12OF9wbXVfaW5pdChjcHVfcG11KTsKIAljcHVfcG11LT5uYW1lCQkJPSAiYXJtdjhfY29ydGV4X2E1MyI7CiAJY3B1X3BtdS0+bWFwX2V2ZW50CQk9IGFybXY4X2E1M19tYXBfZXZlbnQ7Ci0JY3B1X3BtdS0+cG11LmF0dHJfZ3JvdXBzCT0gYXJtdjhfcG11djNfYXR0cl9ncm91cHM7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRVZFTlRTXSA9CisJCSZhcm12OF9wbXV2M19ldmVudHNfYXR0cl9ncm91cDsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9GT1JNQVRTXSA9CisJCSZhcm12OF9wbXV2M19mb3JtYXRfYXR0cl9ncm91cDsKIAlyZXR1cm4gYXJtdjhwbXVfcHJvYmVfcG11KGNwdV9wbXUpOwogfQogCkBAIC0xMDAzLDcgKzEwMzYsMTAgQEAKIAlhcm12OF9wbXVfaW5pdChjcHVfcG11KTsKIAljcHVfcG11LT5uYW1lCQkJPSAiYXJtdjhfY29ydGV4X2E1NyI7CiAJY3B1X3BtdS0+bWFwX2V2ZW50CQk9IGFybXY4X2E1N19tYXBfZXZlbnQ7Ci0JY3B1X3BtdS0+cG11LmF0dHJfZ3JvdXBzCT0gYXJtdjhfcG11djNfYXR0cl9ncm91cHM7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRVZFTlRTXSA9CisJCSZhcm12OF9wbXV2M19ldmVudHNfYXR0cl9ncm91cDsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9GT1JNQVRTXSA9CisJCSZhcm12OF9wbXV2M19mb3JtYXRfYXR0cl9ncm91cDsKIAlyZXR1cm4gYXJtdjhwbXVfcHJvYmVfcG11KGNwdV9wbXUpOwogfQogCkBAIC0xMDEyLDcgKzEwNDgsMTAgQEAKIAlhcm12OF9wbXVfaW5pdChjcHVfcG11KTsKIAljcHVfcG11LT5uYW1lCQkJPSAiYXJtdjhfY29ydGV4X2E3MiI7CiAJY3B1X3BtdS0+bWFwX2V2ZW50CQk9IGFybXY4X2E1N19tYXBfZXZlbnQ7Ci0JY3B1X3BtdS0+cG11LmF0dHJfZ3JvdXBzCT0gYXJtdjhfcG11djNfYXR0cl9ncm91cHM7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRVZFTlRTXSA9CisJCSZhcm12OF9wbXV2M19ldmVudHNfYXR0cl9ncm91cDsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9GT1JNQVRTXSA9CisJCSZhcm12OF9wbXV2M19mb3JtYXRfYXR0cl9ncm91cDsKIAlyZXR1cm4gYXJtdjhwbXVfcHJvYmVfcG11KGNwdV9wbXUpOwogfQogCkBAIC0xMDIxLDcgKzEwNjAsMTAgQEAKIAlhcm12OF9wbXVfaW5pdChjcHVfcG11KTsKIAljcHVfcG11LT5uYW1lCQkJPSAiYXJtdjhfY2F2aXVtX3RodW5kZXIiOwogCWNwdV9wbXUtPm1hcF9ldmVudAkJPSBhcm12OF90aHVuZGVyX21hcF9ldmVudDsKLQljcHVfcG11LT5wbXUuYXR0cl9ncm91cHMJPSBhcm12OF9wbXV2M19hdHRyX2dyb3VwczsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9FVkVOVFNdID0KKwkJJmFybXY4X3BtdXYzX2V2ZW50c19hdHRyX2dyb3VwOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0ZPUk1BVFNdID0KKwkJJmFybXY4X3BtdXYzX2Zvcm1hdF9hdHRyX2dyb3VwOwogCXJldHVybiBhcm12OHBtdV9wcm9iZV9wbXUoY3B1X3BtdSk7CiB9CiAKQEAgLTEwMzAsNyArMTA3MiwxMCBAQAogCWFybXY4X3BtdV9pbml0KGNwdV9wbXUpOwogCWNwdV9wbXUtPm5hbWUJCQk9ICJhcm12OF9icmNtX3Z1bGNhbiI7CiAJY3B1X3BtdS0+bWFwX2V2ZW50CQk9IGFybXY4X3Z1bGNhbl9tYXBfZXZlbnQ7Ci0JY3B1X3BtdS0+cG11LmF0dHJfZ3JvdXBzCT0gYXJtdjhfcG11djNfYXR0cl9ncm91cHM7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRVZFTlRTXSA9CisJCSZhcm12OF9wbXV2M19ldmVudHNfYXR0cl9ncm91cDsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9GT1JNQVRTXSA9CisJCSZhcm12OF9wbXV2M19mb3JtYXRfYXR0cl9ncm91cDsKIAlyZXR1cm4gYXJtdjhwbXVfcHJvYmVfcG11KGNwdV9wbXUpOwogfQogCkBAIC0xMDQ0LDIxICsxMDg5LDMyIEBACiAJe30sCiB9OwogCisvKgorICogTm9uIERUIHN5c3RlbXMgaGF2ZSB0aGVpciBtaWNyby9hcmNoIGV2ZW50cyBwcm9iZWQgYXQgcnVuLXRpbWUuCisgKiBBIGZhaXJseSBjb21wbGV0ZSBsaXN0IG9mIGdlbmVyaWMgZXZlbnRzIGFyZSBwcm92aWRlZCBhbmQgb25lcyB0aGF0CisgKiBhcmVuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IFBNVSBhcmUgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG11X3Byb2JlX2luZm8gYXJtdjhfcG11X3Byb2JlX3RhYmxlW10gPSB7CisJUE1VX1BST0JFKDAsIDAsIGFybXY4X3BtdXYzX2luaXQpLCAvKiBlbmFibGUgYWxsIGRlZmluZWQgY291bnRlcnMgKi8KKwl7IC8qIHNlbnRpbmVsIHZhbHVlICovIH0KK307CisKIHN0YXRpYyBpbnQgYXJtdjhfcG11X2RldmljZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXJldHVybiBhcm1fcG11X2RldmljZV9wcm9iZShwZGV2LCBhcm12OF9wbXVfb2ZfZGV2aWNlX2lkcywgTlVMTCk7CisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCXJldHVybiBhcm1fcG11X2RldmljZV9wcm9iZShwZGV2LCBhcm12OF9wbXVfb2ZfZGV2aWNlX2lkcywKKwkJCQkJICAgIE5VTEwpOworCisJcmV0dXJuIGFybV9wbXVfZGV2aWNlX3Byb2JlKHBkZXYsIGFybXY4X3BtdV9vZl9kZXZpY2VfaWRzLAorCQkJCSAgICBhcm12OF9wbXVfcHJvYmVfdGFibGUpOwogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhcm12OF9wbXVfZHJpdmVyID0gewogCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJhcm12OC1wbXUiLAorCQkubmFtZQk9IEFSTVY4X1BNVV9QREVWX05BTUUsCiAJCS5vZl9tYXRjaF90YWJsZSA9IGFybXY4X3BtdV9vZl9kZXZpY2VfaWRzLAogCX0sCiAJLnByb2JlCQk9IGFybXY4X3BtdV9kZXZpY2VfcHJvYmUsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCByZWdpc3Rlcl9hcm12OF9wbXVfZHJpdmVyKHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXJtdjhfcG11X2RyaXZlcik7Ci19Ci1kZXZpY2VfaW5pdGNhbGwocmVnaXN0ZXJfYXJtdjhfcG11X2RyaXZlcik7CitidWlsdGluX3BsYXRmb3JtX2RyaXZlcihhcm12OF9wbXVfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3Byb2Jlcy9kZWNvZGUtaW5zbi5jIGIvYXJjaC9hcm02NC9rZXJuZWwvcHJvYmVzL2RlY29kZS1pbnNuLmMKaW5kZXggMzdlNDdhOS4uZDE3MzFiZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvcHJvYmVzL2RlY29kZS1pbnNuLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvcHJvYmVzL2RlY29kZS1pbnNuLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxhc20va3Byb2Jlcy5oPgogI2luY2x1ZGUgPGFzbS9pbnNuLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CkBAIC0xMjIsNyArMTIzLDcgQEAKIHN0YXRpYyBib29sIF9fa3Byb2JlcwogaXNfcHJvYmVkX2FkZHJlc3NfYXRvbWljKGtwcm9iZV9vcGNvZGVfdCAqc2Nhbl9zdGFydCwga3Byb2JlX29wY29kZV90ICpzY2FuX2VuZCkKIHsKLQl3aGlsZSAoc2Nhbl9zdGFydCA+IHNjYW5fZW5kKSB7CisJd2hpbGUgKHNjYW5fc3RhcnQgPj0gc2Nhbl9lbmQpIHsKIAkJLyoKIAkJICogYXRvbWljIHJlZ2lvbiBzdGFydHMgZnJvbSBleGNsdXNpdmUgbG9hZCBhbmQgZW5kcyB3aXRoCiAJCSAqIGV4Y2x1c2l2ZSBzdG9yZS4KQEAgLTE0MiwzMyArMTQzLDMwIEBACiB7CiAJZW51bSBrcHJvYmVfaW5zbiBkZWNvZGVkOwogCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gbGUzMl90b19jcHUoKmFkZHIpOwotCWtwcm9iZV9vcGNvZGVfdCAqc2Nhbl9zdGFydCA9IGFkZHIgLSAxOwotCWtwcm9iZV9vcGNvZGVfdCAqc2Nhbl9lbmQgPSBhZGRyIC0gTUFYX0FUT01JQ19DT05URVhUX1NJWkU7Ci0jaWYgZGVmaW5lZChDT05GSUdfTU9EVUxFUykgJiYgZGVmaW5lZChNT0RVTEVTX1ZBRERSKQotCXN0cnVjdCBtb2R1bGUgKm1vZDsKLSNlbmRpZgorCWtwcm9iZV9vcGNvZGVfdCAqc2Nhbl9lbmQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDAsIG9mZnNldCA9IDA7CiAKLQlpZiAoYWRkciA+PSAoa3Byb2JlX29wY29kZV90ICopX3RleHQgJiYKLQkgICAgc2Nhbl9lbmQgPCAoa3Byb2JlX29wY29kZV90ICopX3RleHQpCi0JCXNjYW5fZW5kID0gKGtwcm9iZV9vcGNvZGVfdCAqKV90ZXh0OwotI2lmIGRlZmluZWQoQ09ORklHX01PRFVMRVMpICYmIGRlZmluZWQoTU9EVUxFU19WQUREUikKLQllbHNlIHsKLQkJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JCW1vZCA9IF9fbW9kdWxlX2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcpYWRkcik7Ci0JCWlmIChtb2QgJiYgd2l0aGluX21vZHVsZV9pbml0KCh1bnNpZ25lZCBsb25nKWFkZHIsIG1vZCkgJiYKLQkJCSF3aXRoaW5fbW9kdWxlX2luaXQoKHVuc2lnbmVkIGxvbmcpc2Nhbl9lbmQsIG1vZCkpCi0JCQlzY2FuX2VuZCA9IChrcHJvYmVfb3Bjb2RlX3QgKiltb2QtPmluaXRfbGF5b3V0LmJhc2U7Ci0JCWVsc2UgaWYgKG1vZCAmJiB3aXRoaW5fbW9kdWxlX2NvcmUoKHVuc2lnbmVkIGxvbmcpYWRkciwgbW9kKSAmJgotCQkJIXdpdGhpbl9tb2R1bGVfY29yZSgodW5zaWduZWQgbG9uZylzY2FuX2VuZCwgbW9kKSkKLQkJCXNjYW5fZW5kID0gKGtwcm9iZV9vcGNvZGVfdCAqKW1vZC0+Y29yZV9sYXlvdXQuYmFzZTsKLQkJcHJlZW1wdF9lbmFibGUoKTsKKwkvKgorCSAqIElmIHRoZXJlJ3MgYSBzeW1ib2wgZGVmaW5lZCBpbiBmcm9udCBvZiBhbmQgbmVhciBlbm91Z2ggdG8KKwkgKiB0aGUgcHJvYmUgYWRkcmVzcyBhc3N1bWUgaXQgaXMgdGhlIGVudHJ5IHBvaW50IHRvIHRoaXMKKwkgKiBjb2RlIGFuZCB1c2UgaXQgdG8gZnVydGhlciBsaW1pdCBob3cgZmFyIGJhY2sgd2Ugc2VhcmNoCisJICogd2hlbiBkZXRlcm1pbmluZyBpZiB3ZSdyZSBpbiBhbiBhdG9taWMgc2VxdWVuY2UuIElmIHdlIGNvdWxkCisJICogbm90IGZpbmQgYW55IHN5bWJvbCBza2lwIHRoZSBhdG9taWMgdGVzdCBhbHRvZ2V0aGVyIGFzIHdlCisJICogY291bGQgb3RoZXJ3aXNlIGVuZCB1cCBzZWFyY2hpbmcgaXJyZWxldmFudCB0ZXh0L2xpdGVyYWxzLgorCSAqIEtQUk9CRVMgZGVwZW5kcyBvbiBLQUxMU1lNUyBzbyB0aGlzIGxhc3QgY2FzZSBzaG91bGQgbmV2ZXIKKwkgKiBoYXBwZW4uCisJICovCisJaWYgKGthbGxzeW1zX2xvb2t1cF9zaXplX29mZnNldCgodW5zaWduZWQgbG9uZykgYWRkciwgJnNpemUsICZvZmZzZXQpKSB7CisJCWlmIChvZmZzZXQgPCAoTUFYX0FUT01JQ19DT05URVhUX1NJWkUqc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpKQorCQkJc2Nhbl9lbmQgPSBhZGRyIC0gKG9mZnNldCAvIHNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKKwkJZWxzZQorCQkJc2Nhbl9lbmQgPSBhZGRyIC0gTUFYX0FUT01JQ19DT05URVhUX1NJWkU7CiAJfQotI2VuZGlmCiAJZGVjb2RlZCA9IGFybV9wcm9iZV9kZWNvZGVfaW5zbihpbnNuLCBhc2kpOwogCi0JaWYgKGRlY29kZWQgPT0gSU5TTl9SRUpFQ1RFRCB8fAotCQkJaXNfcHJvYmVkX2FkZHJlc3NfYXRvbWljKHNjYW5fc3RhcnQsIHNjYW5fZW5kKSkKLQkJcmV0dXJuIElOU05fUkVKRUNURUQ7CisJaWYgKGRlY29kZWQgIT0gSU5TTl9SRUpFQ1RFRCAmJiBzY2FuX2VuZCkKKwkJaWYgKGlzX3Byb2JlZF9hZGRyZXNzX2F0b21pYyhhZGRyIC0gMSwgc2Nhbl9lbmQpKQorCQkJcmV0dXJuIElOU05fUkVKRUNURUQ7CiAKIAlyZXR1cm4gZGVjb2RlZDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3Byb2Jlcy9rcHJvYmVzLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9wcm9iZXMva3Byb2Jlcy5jCmluZGV4IGM2YjBmNDAuLmY1MDc3ZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3Byb2Jlcy9rcHJvYmVzLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvcHJvYmVzL2twcm9iZXMuYwpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2thc2FuLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RvcF9tYWNoaW5lLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2luc24uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zZWN0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogCiAjaW5jbHVkZSAiZGVjb2RlLWluc24uaCIKIApAQCAtMTY2LDEzICsxNjYsMTggQEAKIH0KIAogLyoKLSAqIFRoZSBELWZsYWcgKERlYnVnIG1hc2spIGlzIHNldCAobWFza2VkKSB1cG9uIGRlYnVnIGV4Y2VwdGlvbiBlbnRyeS4KLSAqIEtwcm9iZXMgbmVlZHMgdG8gY2xlYXIgKHVubWFzaykgRC1mbGFnIC1PTkxZLSBpbiBjYXNlIG9mIHJlY3Vyc2l2ZQotICogcHJvYmUgaS5lLiB3aGVuIHByb2JlIGhpdCBmcm9tIGtwcm9iZSBoYW5kbGVyIGNvbnRleHQgdXBvbgotICogZXhlY3V0aW5nIHRoZSBwcmUvcG9zdCBoYW5kbGVycy4gSW4gdGhpcyBjYXNlIHdlIHJldHVybiB3aXRoCi0gKiBELWZsYWcgY2xlYXIgc28gdGhhdCBzaW5nbGUtc3RlcHBpbmcgY2FuIGJlIGNhcnJpZWQtb3V0LgotICoKLSAqIExlYXZlIEQtZmxhZyBzZXQgaW4gYWxsIG90aGVyIGNhc2VzLgorICogV2hlbiBQU1RBVEUuRCBpcyBzZXQgKG1hc2tlZCksIHRoZW4gc29mdHdhcmUgc3RlcCBleGNlcHRpb25zIGNhbiBub3QgYmUKKyAqIGdlbmVyYXRlZC4KKyAqIFNQU1IncyBEIGJpdCBzaG93cyB0aGUgdmFsdWUgb2YgUFNUQVRFLkQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZQorICogZXhjZXB0aW9uIHdhcyB0YWtlbi4gUFNUQVRFLkQgaXMgc2V0IHdoaWxlIGVudGVyaW5nIGludG8gYW55IGV4Y2VwdGlvbgorICogbW9kZSwgaG93ZXZlciBzb2Z0d2FyZSBjbGVhcnMgaXQgZm9yIGFueSBub3JtYWwgKG5vbmUtZGVidWctZXhjZXB0aW9uKQorICogbW9kZSBpbiB0aGUgZXhjZXB0aW9uIGVudHJ5LiBUaGVyZWZvcmUsIHdoZW4gd2UgYXJlIGVudGVyaW5nIGludG8ga3Byb2JlCisgKiBicmVha3BvaW50IGhhbmRsZXIgZnJvbSBhbnkgbm9ybWFsIG1vZGUgdGhlbiBTUFNSLkQgYml0IGlzIGFscmVhZHkKKyAqIGNsZWFyZWQsIGhvd2V2ZXIgaXQgaXMgc2V0IHdoZW4gd2UgYXJlIGVudGVyaW5nIGZyb20gYW55IGRlYnVnIGV4Y2VwdGlvbgorICogbW9kZS4KKyAqIFNpbmNlIHdlIGFsd2F5cyBuZWVkIHRvIGdlbmVyYXRlIHNpbmdsZSBzdGVwIGV4Y2VwdGlvbiBhZnRlciBhIGtwcm9iZQorICogYnJlYWtwb2ludCBleGNlcHRpb24gdGhlcmVmb3JlIHdlIG5lZWQgdG8gY2xlYXIgaXQgdW5jb25kaXRpb25hbGx5LCB3aGVuCisgKiB3ZSBiZWNvbWUgc3VyZSB0aGF0IHRoZSBjdXJyZW50IGJyZWFrcG9pbnQgZXhjZXB0aW9uIGlzIGZvciBrcHJvYmUuCiAgKi8KIHN0YXRpYyB2b2lkIF9fa3Byb2Jlcwogc3Bzcl9zZXRfZGVidWdfZmxhZyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IG1hc2spCkBAIC0yNDUsMTAgKzI1MCw3IEBACiAKIAkJc2V0X3NzX2NvbnRleHQoa2NiLCBzbG90KTsJLyogbWFyayBwZW5kaW5nIHNzICovCiAKLQkJaWYgKGtjYi0+a3Byb2JlX3N0YXR1cyA9PSBLUFJPQkVfUkVFTlRFUikKLQkJCXNwc3Jfc2V0X2RlYnVnX2ZsYWcocmVncywgMCk7Ci0JCWVsc2UKLQkJCVdBUk5fT04ocmVncy0+cHN0YXRlICYgUFNSX0RfQklUKTsKKwkJc3Bzcl9zZXRfZGVidWdfZmxhZyhyZWdzLCAwKTsKIAogCQkvKiBJUlFzIGFuZCBzaW5nbGUgc3RlcHBpbmcgZG8gbm90IG1peCB3ZWxsLiAqLwogCQlrcHJvYmVzX3NhdmVfbG9jYWxfaXJxZmxhZyhrY2IsIHJlZ3MpOwpAQCAtMzMzLDggKzMzNSw2IEBACiAJCQlCVUcoKTsKIAogCQlrZXJuZWxfZGlzYWJsZV9zaW5nbGVfc3RlcCgpOwotCQlpZiAoa2NiLT5rcHJvYmVfc3RhdHVzID09IEtQUk9CRV9SRUVOVEVSKQotCQkJc3Bzcl9zZXRfZGVidWdfZmxhZyhyZWdzLCAxKTsKIAogCQlpZiAoa2NiLT5rcHJvYmVfc3RhdHVzID09IEtQUk9CRV9SRUVOVEVSKQogCQkJcmVzdG9yZV9wcmV2aW91c19rcHJvYmUoa2NiKTsKQEAgLTQ1Nyw5ICs0NTcsNiBAQAogCQlrcHJvYmVzX3Jlc3RvcmVfbG9jYWxfaXJxZmxhZyhrY2IsIHJlZ3MpOwogCQlrZXJuZWxfZGlzYWJsZV9zaW5nbGVfc3RlcCgpOwogCi0JCWlmIChrY2ItPmtwcm9iZV9zdGF0dXMgPT0gS1BST0JFX1JFRU5URVIpCi0JCQlzcHNyX3NldF9kZWJ1Z19mbGFnKHJlZ3MsIDEpOwotCiAJCXBvc3Rfa3Byb2JlX2hhbmRsZXIoa2NiLCByZWdzKTsKIAl9CiAKQEAgLTU0Myw5ICs1NDAsNiBAQAogCiBib29sIGFyY2hfd2l0aGluX2twcm9iZV9ibGFja2xpc3QodW5zaWduZWQgbG9uZyBhZGRyKQogewotCWV4dGVybiBjaGFyIF9faWRtYXBfdGV4dF9zdGFydFtdLCBfX2lkbWFwX3RleHRfZW5kW107Ci0JZXh0ZXJuIGNoYXIgX19oeXBfaWRtYXBfdGV4dF9zdGFydFtdLCBfX2h5cF9pZG1hcF90ZXh0X2VuZFtdOwotCiAJaWYgKChhZGRyID49ICh1bnNpZ25lZCBsb25nKV9fa3Byb2Jlc190ZXh0X3N0YXJ0ICYmCiAJICAgIGFkZHIgPCAodW5zaWduZWQgbG9uZylfX2twcm9iZXNfdGV4dF9lbmQpIHx8CiAJICAgIChhZGRyID49ICh1bnNpZ25lZCBsb25nKV9fZW50cnlfdGV4dF9zdGFydCAmJgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9hcm02NC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDZjZDI2MTIuLmE0ZjVmNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTIwMiw3ICsyMDIsNyBAQAogCiBzdGF0aWMgdm9pZCB0bHNfdGhyZWFkX2ZsdXNoKHZvaWQpCiB7Ci0JYXNtICgibXNyIHRwaWRyX2VsMCwgeHpyIik7CisJd3JpdGVfc3lzcmVnKDAsIHRwaWRyX2VsMCk7CiAKIAlpZiAoaXNfY29tcGF0X3Rhc2soKSkgewogCQljdXJyZW50LT50aHJlYWQudHBfdmFsdWUgPSAwOwpAQCAtMjEzLDcgKzIxMyw3IEBACiAJCSAqIHdpdGggYSBzdGFsZSBzaGFkb3cgc3RhdGUgZHVyaW5nIGNvbnRleHQgc3dpdGNoLgogCQkgKi8KIAkJYmFycmllcigpOwotCQlhc20gKCJtc3IgdHBpZHJyb19lbDAsIHh6ciIpOworCQl3cml0ZV9zeXNyZWcoMCwgdHBpZHJyb19lbDApOwogCX0KIH0KIApAQCAtMjUzLDcgKzI1Myw3IEBACiAJCSAqIFJlYWQgdGhlIGN1cnJlbnQgVExTIHBvaW50ZXIgZnJvbSB0cGlkcl9lbDAgYXMgaXQgbWF5IGJlCiAJCSAqIG91dC1vZi1zeW5jIHdpdGggdGhlIHNhdmVkIHZhbHVlLgogCQkgKi8KLQkJYXNtKCJtcnMgJTAsIHRwaWRyX2VsMCIgOiAiPXIiICgqdGFza191c2VyX3RscyhwKSkpOworCQkqdGFza191c2VyX3RscyhwKSA9IHJlYWRfc3lzcmVnKHRwaWRyX2VsMCk7CiAKIAkJaWYgKHN0YWNrX3N0YXJ0KSB7CiAJCQlpZiAoaXNfY29tcGF0X3RocmVhZCh0YXNrX3RocmVhZF9pbmZvKHApKSkKQEAgLTI4OSwxNyArMjg5LDE1IEBACiB7CiAJdW5zaWduZWQgbG9uZyB0cGlkciwgdHBpZHJybzsKIAotCWFzbSgibXJzICUwLCB0cGlkcl9lbDAiIDogIj1yIiAodHBpZHIpKTsKKwl0cGlkciA9IHJlYWRfc3lzcmVnKHRwaWRyX2VsMCk7CiAJKnRhc2tfdXNlcl90bHMoY3VycmVudCkgPSB0cGlkcjsKIAogCXRwaWRyID0gKnRhc2tfdXNlcl90bHMobmV4dCk7CiAJdHBpZHJybyA9IGlzX2NvbXBhdF90aHJlYWQodGFza190aHJlYWRfaW5mbyhuZXh0KSkgPwogCQkgIG5leHQtPnRocmVhZC50cF92YWx1ZSA6IDA7CiAKLQlhc20oCi0JIgltc3IJdHBpZHJfZWwwLCAlMFxuIgotCSIJbXNyCXRwaWRycm9fZWwwLCAlMSIKLQk6IDogInIiICh0cGlkciksICJyIiAodHBpZHJybykpOworCXdyaXRlX3N5c3JlZyh0cGlkciwgdHBpZHJfZWwwKTsKKwl3cml0ZV9zeXNyZWcodHBpZHJybywgdHBpZHJyb19lbDApOwogfQogCiAvKiBSZXN0b3JlIHRoZSBVQU8gc3RhdGUgZGVwZW5kaW5nIG9uIG5leHQncyBhZGRyX2xpbWl0ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUyBiL2FyY2gvYXJtNjQva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCmluZGV4IDUxYjczY2QuLmNlNzA0YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCkBAIC0zNCw3ICszNCw3IEBACiAJLyogU2V0dXAgdGhlIGxpc3QgbG9vcCB2YXJpYWJsZXMuICovCiAJbW92CXgxNywgeDEJCQkJLyogeDE3ID0ga2ltYWdlX3N0YXJ0ICovCiAJbW92CXgxNiwgeDAJCQkJLyogeDE2ID0ga2ltYWdlX2hlYWQgKi8KLQlkY2FjaGVfbGluZV9zaXplIHgxNSwgeDAJCS8qIHgxNSA9IGRjYWNoZSBsaW5lIHNpemUgKi8KKwlyYXdfZGNhY2hlX2xpbmVfc2l6ZSB4MTUsIHgwCQkvKiB4MTUgPSBkY2FjaGUgbGluZSBzaXplICovCiAJbW92CXgxNCwgeHpyCQkJLyogeDE0ID0gZW50cnkgcHRyICovCiAJbW92CXgxMywgeHpyCQkJLyogeDEzID0gY29weSBkZXN0ICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IDUzNmRjZTIuLmY1MzRmNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvc2V0dXAuYwpAQCAtMjA2LDEwICsyMDYsMTUgQEAKIAogCWZvcl9lYWNoX21lbWJsb2NrKG1lbW9yeSwgcmVnaW9uKSB7CiAJCXJlcyA9IGFsbG9jX2Jvb3RtZW1fbG93KHNpemVvZigqcmVzKSk7Ci0JCXJlcy0+bmFtZSAgPSAiU3lzdGVtIFJBTSI7CisJCWlmIChtZW1ibG9ja19pc19ub21hcChyZWdpb24pKSB7CisJCQlyZXMtPm5hbWUgID0gInJlc2VydmVkIjsKKwkJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfQlVTWTsKKwkJfSBlbHNlIHsKKwkJCXJlcy0+bmFtZSAgPSAiU3lzdGVtIFJBTSI7CisJCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9TWVNURU1fUkFNIHwgSU9SRVNPVVJDRV9CVVNZOworCQl9CiAJCXJlcy0+c3RhcnQgPSBfX3Bmbl90b19waHlzKG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfYmFzZV9wZm4ocmVnaW9uKSk7CiAJCXJlcy0+ZW5kID0gX19wZm5fdG9fcGh5cyhtZW1ibG9ja19yZWdpb25fbWVtb3J5X2VuZF9wZm4ocmVnaW9uKSkgLSAxOwotCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9TWVNURU1fUkFNIHwgSU9SRVNPVVJDRV9CVVNZOwogCiAJCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCByZXMpOwogCkBAIC0yMjgsNyArMjMzLDcgQEAKIHsKIAlwcl9pbmZvKCJCb290IENQVTogQUFyY2g2NCBQcm9jZXNzb3IgWyUwOHhdXG4iLCByZWFkX2NwdWlkX2lkKCkpOwogCi0Jc3ByaW50Zihpbml0X3V0c25hbWUoKS0+bWFjaGluZSwgRUxGX1BMQVRGT1JNKTsKKwlzcHJpbnRmKGluaXRfdXRzbmFtZSgpLT5tYWNoaW5lLCBVVFNfTUFDSElORSk7CiAJaW5pdF9tbS5zdGFydF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpIF90ZXh0OwogCWluaXRfbW0uZW5kX2NvZGUgICA9ICh1bnNpZ25lZCBsb25nKSBfZXRleHQ7CiAJaW5pdF9tbS5lbmRfZGF0YSAgID0gKHVuc2lnbmVkIGxvbmcpIF9lZGF0YTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9hcm02NC9rZXJuZWwvc2lnbmFsLmMKaW5kZXggYThlYWZkYi4uNDA0ZGQ2NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvc2lnbmFsLmMKQEAgLTQwMiwxNSArNDAyLDMxIEBACiBhc21saW5rYWdlIHZvaWQgZG9fbm90aWZ5X3Jlc3VtZShzdHJ1Y3QgcHRfcmVncyAqcmVncywKIAkJCQkgdW5zaWduZWQgaW50IHRocmVhZF9mbGFncykKIHsKLQlpZiAodGhyZWFkX2ZsYWdzICYgX1RJRl9TSUdQRU5ESU5HKQotCQlkb19zaWduYWwocmVncyk7CisJLyoKKwkgKiBUaGUgYXNzZW1ibHkgY29kZSBlbnRlcnMgdXMgd2l0aCBJUlFzIG9mZiwgYnV0IGl0IGhhc24ndAorCSAqIGluZm9ybWVkIHRoZSB0cmFjaW5nIGNvZGUgb2YgdGhhdCBmb3IgZWZmaWNpZW5jeSByZWFzb25zLgorCSAqIFVwZGF0ZSB0aGUgdHJhY2UgY29kZSB3aXRoIHRoZSBjdXJyZW50IHN0YXR1cy4KKwkgKi8KKwl0cmFjZV9oYXJkaXJxc19vZmYoKTsKKwlkbyB7CisJCWlmICh0aHJlYWRfZmxhZ3MgJiBfVElGX05FRURfUkVTQ0hFRCkgeworCQkJc2NoZWR1bGUoKTsKKwkJfSBlbHNlIHsKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKIAotCWlmICh0aHJlYWRfZmxhZ3MgJiBfVElGX05PVElGWV9SRVNVTUUpIHsKLQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX05PVElGWV9SRVNVTUUpOwotCQl0cmFjZWhvb2tfbm90aWZ5X3Jlc3VtZShyZWdzKTsKLQl9CisJCQlpZiAodGhyZWFkX2ZsYWdzICYgX1RJRl9TSUdQRU5ESU5HKQorCQkJCWRvX3NpZ25hbChyZWdzKTsKIAotCWlmICh0aHJlYWRfZmxhZ3MgJiBfVElGX0ZPUkVJR05fRlBTVEFURSkKLQkJZnBzaW1kX3Jlc3RvcmVfY3VycmVudF9zdGF0ZSgpOworCQkJaWYgKHRocmVhZF9mbGFncyAmIF9USUZfTk9USUZZX1JFU1VNRSkgeworCQkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9OT1RJRllfUkVTVU1FKTsKKwkJCQl0cmFjZWhvb2tfbm90aWZ5X3Jlc3VtZShyZWdzKTsKKwkJCX0KIAorCQkJaWYgKHRocmVhZF9mbGFncyAmIF9USUZfRk9SRUlHTl9GUFNUQVRFKQorCQkJCWZwc2ltZF9yZXN0b3JlX2N1cnJlbnRfc3RhdGUoKTsKKwkJfQorCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCXRocmVhZF9mbGFncyA9IFJFQURfT05DRShjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzKTsKKwl9IHdoaWxlICh0aHJlYWRfZmxhZ3MgJiBfVElGX1dPUktfTUFTSyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9zbGVlcC5TIGIvYXJjaC9hcm02NC9rZXJuZWwvc2xlZXAuUwppbmRleCA5YTNhZWM5Li5iODc5OWU3IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9zbGVlcC5TCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3NsZWVwLlMKQEAgLTczLDEwICs3Myw5IEBACiAJc3RyCXgyLCBbeDAsICNTTEVFUF9TVEFDS19EQVRBX1NZU1RFTV9SRUdTICsgQ1BVX0NUWF9TUF0KIAogCS8qIGZpbmQgdGhlIG1waWRyX2hhc2ggKi8KLQlsZHIJeDEsID1zbGVlcF9zYXZlX3N0YXNoCi0JbGRyCXgxLCBbeDFdCisJbGRyX2wJeDEsIHNsZWVwX3NhdmVfc3Rhc2gKIAltcnMJeDcsIG1waWRyX2VsMQotCWxkcgl4OSwgPW1waWRyX2hhc2gKKwlhZHJfbAl4OSwgbXBpZHJfaGFzaAogCWxkcgl4MTAsIFt4OSwgI01QSURSX0hBU0hfTUFTS10KIAkvKgogCSAqIEZvbGxvd2luZyBjb2RlIHJlbGllcyBvbiB0aGUgc3RydWN0IG1waWRyX2hhc2gKQEAgLTk1LDI4ICs5NCwzMCBAQAogCW1vdgl4MCwgIzEKIAlyZXQKIEVORFBST0MoX19jcHVfc3VzcGVuZF9lbnRlcikKLQkubHRvcmcKIAorCS5wdXNoc2VjdGlvbiAiLmlkbWFwLnRleHQiLCAiYXgiCiBFTlRSWShjcHVfcmVzdW1lKQogCWJsCWVsMl9zZXR1cAkJLy8gaWYgaW4gRUwyIGRyb3AgdG8gRUwxIGNsZWFubHkKKwlibAlfX2NwdV9zZXR1cAogCS8qIGVuYWJsZSB0aGUgTU1VIGVhcmx5IC0gc28gd2UgY2FuIGFjY2VzcyBzbGVlcF9zYXZlX3N0YXNoIGJ5IHZhICovCi0JYWRyX2wJbHIsIF9fZW5hYmxlX21tdQkvKiBfX2NwdV9zZXR1cCB3aWxsIHJldHVybiBoZXJlICovCi0JbGRyCXgyNywgPV9jcHVfcmVzdW1lCS8qIF9fZW5hYmxlX21tdSB3aWxsIGJyYW5jaCBoZXJlICovCi0JYWRycAl4MjUsIGlkbWFwX3BnX2RpcgotCWFkcnAJeDI2LCBzd2FwcGVyX3BnX2RpcgotCWIJX19jcHVfc2V0dXAKKwlibAlfX2VuYWJsZV9tbXUKKwlsZHIJeDgsID1fY3B1X3Jlc3VtZQorCWJyCXg4CiBFTkRQUk9DKGNwdV9yZXN1bWUpCisJLmx0b3JnCisJLnBvcHNlY3Rpb24KIAogRU5UUlkoX2NwdV9yZXN1bWUpCiAJbXJzCXgxLCBtcGlkcl9lbDEKLQlhZHJwCXg4LCBtcGlkcl9oYXNoCi0JYWRkIHg4LCB4OCwgIzpsbzEyOm1waWRyX2hhc2ggLy8geDggPSBzdHJ1Y3QgbXBpZHJfaGFzaCBwaHlzIGFkZHJlc3MKLSAgICAgICAgLyogcmV0cmlldmUgbXBpZHJfaGFzaCBtZW1iZXJzIHRvIGNvbXB1dGUgdGhlIGhhc2ggKi8KKwlhZHJfbAl4OCwgbXBpZHJfaGFzaAkJLy8geDggPSBzdHJ1Y3QgbXBpZHJfaGFzaCB2aXJ0IGFkZHJlc3MKKworCS8qIHJldHJpZXZlIG1waWRyX2hhc2ggbWVtYmVycyB0byBjb21wdXRlIHRoZSBoYXNoICovCiAJbGRyCXgyLCBbeDgsICNNUElEUl9IQVNIX01BU0tdCiAJbGRwCXczLCB3NCwgW3g4LCAjTVBJRFJfSEFTSF9TSElGVFNdCiAJbGRwCXc1LCB3NiwgW3g4LCAjKE1QSURSX0hBU0hfU0hJRlRTICsgOCldCiAJY29tcHV0ZV9tcGlkcl9oYXNoIHg3LCB4MywgeDQsIHg1LCB4NiwgeDEsIHgyCi0gICAgICAgIC8qIHg3IGNvbnRhaW5zIGhhc2ggaW5kZXgsIGxldCdzIHVzZSBpdCB0byBncmFiIGNvbnRleHQgcG9pbnRlciAqLworCisJLyogeDcgY29udGFpbnMgaGFzaCBpbmRleCwgbGV0J3MgdXNlIGl0IHRvIGdyYWIgY29udGV4dCBwb2ludGVyICovCiAJbGRyX2wJeDAsIHNsZWVwX3NhdmVfc3Rhc2gKIAlsZHIJeDAsIFt4MCwgeDcsIGxzbCAjM10KIAlhZGQJeDI5LCB4MCwgI1NMRUVQX1NUQUNLX0RBVEFfQ0FMTEVFX1JFR1MKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3NtcC5jIGIvYXJjaC9hcm02NC9rZXJuZWwvc21wLmMKaW5kZXggZDkzZDQzMy4uZDNmMTUxYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvc21wLmMKQEAgLTIwMSwxMiArMjAxLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBzbXBfc3RvcmVfY3B1X2luZm8odW5zaWduZWQgaW50IGNwdWlkKQotewotCXN0b3JlX2NwdV90b3BvbG9neShjcHVpZCk7Ci0JbnVtYV9zdG9yZV9jcHVfaW5mbyhjcHVpZCk7Ci19Ci0KIC8qCiAgKiBUaGlzIGlzIHRoZSBzZWNvbmRhcnkgQ1BVIGJvb3QgZW50cnkuICBXZSdyZSB1c2luZyB0aGlzIENQVXMKICAqIGlkbGUgdGhyZWFkIHN0YWNrLCBidXQgYSBzZXQgb2YgdGVtcG9yYXJ5IHBhZ2UgdGFibGVzLgpAQCAtMjM5LDcgKzIzMyw3IEBACiAJICogdGhpcyBDUFUgdGlja3MgYWxsIG9mIHRob3NlLiBJZiBpdCBkb2Vzbid0LCB0aGUgQ1BVIHdpbGwKIAkgKiBmYWlsIHRvIGNvbWUgb25saW5lLgogCSAqLwotCXZlcmlmeV9sb2NhbF9jcHVfY2FwYWJpbGl0aWVzKCk7CisJY2hlY2tfbG9jYWxfY3B1X2NhcGFiaWxpdGllcygpOwogCiAJaWYgKGNwdV9vcHNbY3B1XS0+Y3B1X3Bvc3Rib290KQogCQljcHVfb3BzW2NwdV0tPmNwdV9wb3N0Ym9vdCgpOwpAQCAtMjU0LDcgKzI0OCw3IEBACiAJICovCiAJbm90aWZ5X2NwdV9zdGFydGluZyhjcHUpOwogCi0Jc21wX3N0b3JlX2NwdV9pbmZvKGNwdSk7CisJc3RvcmVfY3B1X3RvcG9sb2d5KGNwdSk7CiAKIAkvKgogCSAqIE9LLCBub3cgaXQncyBzYWZlIHRvIGxldCB0aGUgYm9vdCBDUFUgY29udGludWUuICBXYWl0IGZvcgpAQCAtNDM3LDggKzQzMSwxOSBAQAogdm9pZCBfX2luaXQgc21wX3ByZXBhcmVfYm9vdF9jcHUodm9pZCkKIHsKIAlzZXRfbXlfY3B1X29mZnNldChwZXJfY3B1X29mZnNldChzbXBfcHJvY2Vzc29yX2lkKCkpKTsKKwkvKgorCSAqIEluaXRpYWxpc2UgdGhlIHN0YXRpYyBrZXlzIGVhcmx5IGFzIHRoZXkgbWF5IGJlIGVuYWJsZWQgYnkgdGhlCisJICogY3B1ZmVhdHVyZSBjb2RlLgorCSAqLworCWp1bXBfbGFiZWxfaW5pdCgpOwogCWNwdWluZm9fc3RvcmVfYm9vdF9jcHUoKTsKIAlzYXZlX2Jvb3RfY3B1X3J1bl9lbCgpOworCS8qCisJICogUnVuIHRoZSBlcnJhdGEgd29yayBhcm91bmQgY2hlY2tzIG9uIHRoZSBib290IENQVSwgb25jZSB3ZSBoYXZlCisJICogaW5pdGlhbGlzZWQgdGhlIGNwdSBmZWF0dXJlIGluZnJhc3RydWN0dXJlIGZyb20KKwkgKiBjcHVpbmZvX3N0b3JlX2Jvb3RfY3B1KCkgYWJvdmUuCisJICovCisJdXBkYXRlX2NwdV9lcnJhdGFfd29ya2Fyb3VuZHMoKTsKIH0KIAogc3RhdGljIHU2NCBfX2luaXQgb2ZfZ2V0X2NwdV9tcGlkcihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQpAQCAtNjE5LDYgKzYyNCw3IEBACiAJCQl9CiAKIAkJCWJvb3RjcHVfdmFsaWQgPSB0cnVlOworCQkJZWFybHlfbWFwX2NwdV90b19ub2RlKDAsIG9mX25vZGVfdG9fbmlkKGRuKSk7CiAKIAkJCS8qCiAJCQkgKiBjcHVfbG9naWNhbF9tYXAgaGFzIGFscmVhZHkgYmVlbgpAQCAtNjg5LDEwICs2OTUsMTMgQEAKIHsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGludCBjcHU7CisJdW5zaWduZWQgaW50IHRoaXNfY3B1OwogCiAJaW5pdF9jcHVfdG9wb2xvZ3koKTsKIAotCXNtcF9zdG9yZV9jcHVfaW5mbyhzbXBfcHJvY2Vzc29yX2lkKCkpOworCXRoaXNfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0b3JlX2NwdV90b3BvbG9neSh0aGlzX2NwdSk7CisJbnVtYV9zdG9yZV9jcHVfaW5mbyh0aGlzX2NwdSk7CiAKIAkvKgogCSAqIElmIFVQIGlzIG1hbmRhdGVkIGJ5ICJub3NtcCIgKHdoaWNoIGltcGxpZXMgIm1heGNwdXM9MCIpLCBkb24ndCBzZXQKQEAgLTcxOSw2ICs3MjgsNyBAQAogCQkJY29udGludWU7CiAKIAkJc2V0X2NwdV9wcmVzZW50KGNwdSwgdHJ1ZSk7CisJCW51bWFfc3RvcmVfY3B1X2luZm8oY3B1KTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3NtcF9zcGluX3RhYmxlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9zbXBfc3Bpbl90YWJsZS5jCmluZGV4IDE4YTcxYmMuLjlhMDBlZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3NtcF9zcGluX3RhYmxlLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvc21wX3NwaW5fdGFibGUuYwpAQCAtMjksNyArMjksOCBAQAogI2luY2x1ZGUgPGFzbS9zbXBfcGxhdC5oPgogCiBleHRlcm4gdm9pZCBzZWNvbmRhcnlfaG9sZGluZ19wZW4odm9pZCk7Ci12b2xhdGlsZSB1bnNpZ25lZCBsb25nIHNlY29uZGFyeV9ob2xkaW5nX3Blbl9yZWxlYXNlID0gSU5WQUxJRF9IV0lEOwordm9sYXRpbGUgdW5zaWduZWQgbG9uZyBfX3NlY3Rpb24oIi5tbXVvZmYuZGF0YS5yZWFkIikKK3NlY29uZGFyeV9ob2xkaW5nX3Blbl9yZWxlYXNlID0gSU5WQUxJRF9IV0lEOwogCiBzdGF0aWMgcGh5c19hZGRyX3QgY3B1X3JlbGVhc2VfYWRkcltOUl9DUFVTXTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvc3RhY2t0cmFjZS5jIGIvYXJjaC9hcm02NC9rZXJuZWwvc3RhY2t0cmFjZS5jCmluZGV4IGQ5NzUxYTQuLmMyZWZkZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3N0YWNrdHJhY2UuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9zdGFja3RyYWNlLmMKQEAgLTQzLDYgKzQzLDkgQEAKIAl1bnNpZ25lZCBsb25nIGZwID0gZnJhbWUtPmZwOwogCXVuc2lnbmVkIGxvbmcgaXJxX3N0YWNrX3B0cjsKIAorCWlmICghdHNrKQorCQl0c2sgPSBjdXJyZW50OworCiAJLyoKIAkgKiBTd2l0Y2hpbmcgYmV0d2VlbiBzdGFja3MgaXMgdmFsaWQgd2hlbiB0cmFjaW5nIGN1cnJlbnQgYW5kIGluCiAJICogbm9uLXByZWVtcHRpYmxlIGNvbnRleHQuCkBAIC02Nyw3ICs3MCw3IEBACiAJZnJhbWUtPnBjID0gUkVBRF9PTkNFX05PQ0hFQ0soKih1bnNpZ25lZCBsb25nICopKGZwICsgOCkpOwogCiAjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgotCWlmICh0c2sgJiYgdHNrLT5yZXRfc3RhY2sgJiYKKwlpZiAodHNrLT5yZXRfc3RhY2sgJiYKIAkJCShmcmFtZS0+cGMgPT0gKHVuc2lnbmVkIGxvbmcpcmV0dXJuX3RvX2hhbmRsZXIpKSB7CiAJCS8qCiAJCSAqIFRoaXMgaXMgYSBjYXNlIHdoZXJlIGZ1bmN0aW9uIGdyYXBoIHRyYWNlciBoYXMKQEAgLTE1Miw2ICsxNTUsMjcgQEAKIAlyZXR1cm4gdHJhY2UtPm5yX2VudHJpZXMgPj0gdHJhY2UtPm1heF9lbnRyaWVzOwogfQogCit2b2lkIHNhdmVfc3RhY2tfdHJhY2VfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKK3sKKwlzdHJ1Y3Qgc3RhY2tfdHJhY2VfZGF0YSBkYXRhOworCXN0cnVjdCBzdGFja2ZyYW1lIGZyYW1lOworCisJZGF0YS50cmFjZSA9IHRyYWNlOworCWRhdGEuc2tpcCA9IHRyYWNlLT5za2lwOworCWRhdGEubm9fc2NoZWRfZnVuY3Rpb25zID0gMDsKKworCWZyYW1lLmZwID0gcmVncy0+cmVnc1syOV07CisJZnJhbWUuc3AgPSByZWdzLT5zcDsKKwlmcmFtZS5wYyA9IHJlZ3MtPnBjOworI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKKwlmcmFtZS5ncmFwaCA9IGN1cnJlbnQtPmN1cnJfcmV0X3N0YWNrOworI2VuZGlmCisKKwl3YWxrX3N0YWNrZnJhbWUoY3VycmVudCwgJmZyYW1lLCBzYXZlX3RyYWNlLCAmZGF0YSk7CisJaWYgKHRyYWNlLT5ucl9lbnRyaWVzIDwgdHJhY2UtPm1heF9lbnRyaWVzKQorCQl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IFVMT05HX01BWDsKK30KKwogdm9pZCBzYXZlX3N0YWNrX3RyYWNlX3RzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKIHsKIAlzdHJ1Y3Qgc3RhY2tfdHJhY2VfZGF0YSBkYXRhOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvc3VzcGVuZC5jIGIvYXJjaC9hcm02NC9rZXJuZWwvc3VzcGVuZC5jCmluZGV4IGI2MTZlMzYuLmFkNzM0MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3N1c3BlbmQuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9zdXNwZW5kLmMKQEAgLTIzLDggKzIzLDggQEAKICAqIHRpbWUgdGhlIG5vdGlmaWVyIHJ1bnMgZGVidWcgZXhjZXB0aW9ucyBtaWdodCBoYXZlIGJlZW4gZW5hYmxlZCBhbHJlYWR5LAogICogd2l0aCBIVyBicmVha3BvaW50cyByZWdpc3RlcnMgY29udGVudCBzdGlsbCBpbiBhbiB1bmtub3duIHN0YXRlLgogICovCi1zdGF0aWMgdm9pZCAoKmh3X2JyZWFrcG9pbnRfcmVzdG9yZSkodm9pZCAqKTsKLXZvaWQgX19pbml0IGNwdV9zdXNwZW5kX3NldF9kYmdfcmVzdG9yZXIodm9pZCAoKmh3X2JwX3Jlc3RvcmUpKHZvaWQgKikpCitzdGF0aWMgaW50ICgqaHdfYnJlYWtwb2ludF9yZXN0b3JlKSh1bnNpZ25lZCBpbnQpOwordm9pZCBfX2luaXQgY3B1X3N1c3BlbmRfc2V0X2RiZ19yZXN0b3JlcihpbnQgKCpod19icF9yZXN0b3JlKSh1bnNpZ25lZCBpbnQpKQogewogCS8qIFByZXZlbnQgbXVsdGlwbGUgcmVzdG9yZSBob29rIGluaXRpYWxpemF0aW9ucyAqLwogCWlmIChXQVJOX09OKGh3X2JyZWFrcG9pbnRfcmVzdG9yZSkpCkBAIC0zNCw2ICszNCw4IEBACiAKIHZvaWQgbm90cmFjZSBfX2NwdV9zdXNwZW5kX2V4aXQodm9pZCkKIHsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCiAJLyoKIAkgKiBXZSBhcmUgcmVzdW1pbmcgZnJvbSByZXNldCB3aXRoIHRoZSBpZG1hcCBhY3RpdmUgaW4gVFRCUjBfRUwxLgogCSAqIFdlIG11c3QgdW5pbnN0YWxsIHRoZSBpZG1hcCBhbmQgcmVzdG9yZSB0aGUgZXhwZWN0ZWQgTU1VCkBAIC00NSw3ICs0Nyw3IEBACiAJICogUmVzdG9yZSBwZXItY3B1IG9mZnNldCBiZWZvcmUgYW55IGtlcm5lbAogCSAqIHN1YnN5c3RlbSByZWx5aW5nIG9uIGl0IGhhcyBhIGNoYW5jZSB0byBydW4uCiAJICovCi0Jc2V0X215X2NwdV9vZmZzZXQocGVyX2NwdV9vZmZzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpKSk7CisJc2V0X215X2NwdV9vZmZzZXQocGVyX2NwdV9vZmZzZXQoY3B1KSk7CiAKIAkvKgogCSAqIFJlc3RvcmUgSFcgYnJlYWtwb2ludCByZWdpc3RlcnMgdG8gc2FuZSB2YWx1ZXMKQEAgLTUzLDcgKzU1LDcgQEAKIAkgKiB0aHJvdWdoIGxvY2FsX2RiZ19yZXN0b3JlLgogCSAqLwogCWlmIChod19icmVha3BvaW50X3Jlc3RvcmUpCi0JCWh3X2JyZWFrcG9pbnRfcmVzdG9yZShOVUxMKTsKKwkJaHdfYnJlYWtwb2ludF9yZXN0b3JlKGNwdSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9zeXNfY29tcGF0LmMgYi9hcmNoL2FybTY0L2tlcm5lbC9zeXNfY29tcGF0LmMKaW5kZXggMjhjNTExYi4uYWJhZjU4MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvc3lzX2NvbXBhdC5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3N5c19jb21wYXQuYwpAQCAtOTQsNyArOTQsNyBAQAogCQkgKiBTZWUgY29tbWVudCBpbiB0bHNfdGhyZWFkX2ZsdXNoLgogCQkgKi8KIAkJYmFycmllcigpOwotCQlhc20gKCJtc3IgdHBpZHJyb19lbDAsICUwIiA6IDogInIiIChyZWdzLT5yZWdzWzBdKSk7CisJCXdyaXRlX3N5c3JlZyhyZWdzLT5yZWdzWzBdLCB0cGlkcnJvX2VsMCk7CiAJCXJldHVybiAwOwogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL2FybTY0L2tlcm5lbC90cmFwcy5jCmluZGV4IGUwNGY4MzguLjVmZjAyMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvdHJhcHMuYwpAQCAtMTQyLDYgKzE0MiwxMSBAQAogCXVuc2lnbmVkIGxvbmcgaXJxX3N0YWNrX3B0cjsKIAlpbnQgc2tpcDsKIAorCXByX2RlYnVnKCIlcyhyZWdzID0gJXAgdHNrID0gJXApXG4iLCBfX2Z1bmNfXywgcmVncywgdHNrKTsKKworCWlmICghdHNrKQorCQl0c2sgPSBjdXJyZW50OworCiAJLyoKIAkgKiBTd2l0Y2hpbmcgYmV0d2VlbiBzdGFja3MgaXMgdmFsaWQgd2hlbiB0cmFjaW5nIGN1cnJlbnQgYW5kIGluCiAJICogbm9uLXByZWVtcHRpYmxlIGNvbnRleHQuCkBAIC0xNTEsMTEgKzE1Niw2IEBACiAJZWxzZQogCQlpcnFfc3RhY2tfcHRyID0gMDsKIAotCXByX2RlYnVnKCIlcyhyZWdzID0gJXAgdHNrID0gJXApXG4iLCBfX2Z1bmNfXywgcmVncywgdHNrKTsKLQotCWlmICghdHNrKQotCQl0c2sgPSBjdXJyZW50OwotCiAJaWYgKHRzayA9PSBjdXJyZW50KSB7CiAJCWZyYW1lLmZwID0gKHVuc2lnbmVkIGxvbmcpX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CiAJCWZyYW1lLnNwID0gY3VycmVudF9zdGFja19wb2ludGVyOwpAQCAtNDQ3LDM2ICs0NDcsMjkgQEAKIAkJOiAiPXIiIChyZXMpCQkJCQlcCiAJCTogInIiIChhZGRyZXNzKSwgImkiICgtRUZBVUxUKSApCiAKLWFzbWxpbmthZ2Ugdm9pZCBfX2V4Y2VwdGlvbiBkb19zeXNpbnN0cih1bnNpZ25lZCBpbnQgZXNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIHVzZXJfY2FjaGVfbWFpbnRfaGFuZGxlcih1bnNpZ25lZCBpbnQgZXNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0JaW50IHJldDsKKwlpbnQgcnQgPSAoZXNyICYgRVNSX0VMeF9TWVM2NF9JU1NfUlRfTUFTSykgPj4gRVNSX0VMeF9TWVM2NF9JU1NfUlRfU0hJRlQ7CisJaW50IGNybSA9IChlc3IgJiBFU1JfRUx4X1NZUzY0X0lTU19DUk1fTUFTSykgPj4gRVNSX0VMeF9TWVM2NF9JU1NfQ1JNX1NISUZUOworCWludCByZXQgPSAwOwogCi0JLyogaWYgdGhpcyBpcyBhIHdyaXRlIHdpdGg6IE9wMD0xLCBPcDI9MSwgT3AxPTMsIENSbj03ICovCi0JaWYgKChlc3IgJiAweDAxZmZmYzAxKSA9PSAweDAwMTJkYzAwKSB7Ci0JCWludCBydCA9IChlc3IgPj4gNSkgJiAweDFmOwotCQlpbnQgY3JtID0gKGVzciA+PiAxKSAmIDB4MGY7CisJYWRkcmVzcyA9IChydCA9PSAzMSkgPyAwIDogcmVncy0+cmVnc1tydF07CiAKLQkJYWRkcmVzcyA9IChydCA9PSAzMSkgPyAwIDogcmVncy0+cmVnc1tydF07Ci0KLQkJc3dpdGNoIChjcm0pIHsKLQkJY2FzZSAxMToJCS8qIERDIENWQVUsIGdldHMgcHJvbW90ZWQgKi8KLQkJCV9fdXNlcl9jYWNoZV9tYWludCgiZGMgY2l2YWMiLCBhZGRyZXNzLCByZXQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTA6CQkvKiBEQyBDVkFDLCBnZXRzIHByb21vdGVkICovCi0JCQlfX3VzZXJfY2FjaGVfbWFpbnQoImRjIGNpdmFjIiwgYWRkcmVzcywgcmV0KTsKLQkJCWJyZWFrOwotCQljYXNlIDE0OgkJLyogREMgQ0lWQUMgKi8KLQkJCV9fdXNlcl9jYWNoZV9tYWludCgiZGMgY2l2YWMiLCBhZGRyZXNzLCByZXQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNToJCQkvKiBJQyBJVkFVICovCi0JCQlfX3VzZXJfY2FjaGVfbWFpbnQoImljIGl2YXUiLCBhZGRyZXNzLCByZXQpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlmb3JjZV9zaWduYWxfaW5qZWN0KFNJR0lMTCwgSUxMX0lMTE9QQywgcmVncywgMCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9IGVsc2UgeworCXN3aXRjaCAoY3JtKSB7CisJY2FzZSBFU1JfRUx4X1NZUzY0X0lTU19DUk1fRENfQ1ZBVToJLyogREMgQ1ZBVSwgZ2V0cyBwcm9tb3RlZCAqLworCQlfX3VzZXJfY2FjaGVfbWFpbnQoImRjIGNpdmFjIiwgYWRkcmVzcywgcmV0KTsKKwkJYnJlYWs7CisJY2FzZSBFU1JfRUx4X1NZUzY0X0lTU19DUk1fRENfQ1ZBQzoJLyogREMgQ1ZBQywgZ2V0cyBwcm9tb3RlZCAqLworCQlfX3VzZXJfY2FjaGVfbWFpbnQoImRjIGNpdmFjIiwgYWRkcmVzcywgcmV0KTsKKwkJYnJlYWs7CisJY2FzZSBFU1JfRUx4X1NZUzY0X0lTU19DUk1fRENfQ0lWQUM6CS8qIERDIENJVkFDICovCisJCV9fdXNlcl9jYWNoZV9tYWludCgiZGMgY2l2YWMiLCBhZGRyZXNzLCByZXQpOworCQlicmVhazsKKwljYXNlIEVTUl9FTHhfU1lTNjRfSVNTX0NSTV9JQ19JVkFVOgkvKiBJQyBJVkFVICovCisJCV9fdXNlcl9jYWNoZV9tYWludCgiaWMgaXZhdSIsIGFkZHJlc3MsIHJldCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCWZvcmNlX3NpZ25hbF9pbmplY3QoU0lHSUxMLCBJTExfSUxMT1BDLCByZWdzLCAwKTsKIAkJcmV0dXJuOwogCX0KQEAgLTQ4Nyw2ICs0ODAsNDggQEAKIAkJcmVncy0+cGMgKz0gNDsKIH0KIAorc3RhdGljIHZvaWQgY3RyX3JlYWRfaGFuZGxlcih1bnNpZ25lZCBpbnQgZXNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgcnQgPSAoZXNyICYgRVNSX0VMeF9TWVM2NF9JU1NfUlRfTUFTSykgPj4gRVNSX0VMeF9TWVM2NF9JU1NfUlRfU0hJRlQ7CisKKwlyZWdzLT5yZWdzW3J0XSA9IGFybTY0X2Z0cl9yZWdfY3RyZWwwLnN5c192YWw7CisJcmVncy0+cGMgKz0gNDsKK30KKworc3RydWN0IHN5czY0X2hvb2sgeworCXVuc2lnbmVkIGludCBlc3JfbWFzazsKKwl1bnNpZ25lZCBpbnQgZXNyX3ZhbDsKKwl2b2lkICgqaGFuZGxlcikodW5zaWduZWQgaW50IGVzciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworfTsKKworc3RhdGljIHN0cnVjdCBzeXM2NF9ob29rIHN5czY0X2hvb2tzW10gPSB7CisJeworCQkuZXNyX21hc2sgPSBFU1JfRUx4X1NZUzY0X0lTU19FTDBfQ0FDSEVfT1BfTUFTSywKKwkJLmVzcl92YWwgPSBFU1JfRUx4X1NZUzY0X0lTU19FTDBfQ0FDSEVfT1BfVkFMLAorCQkuaGFuZGxlciA9IHVzZXJfY2FjaGVfbWFpbnRfaGFuZGxlciwKKwl9LAorCXsKKwkJLyogVHJhcCByZWFkIGFjY2VzcyB0byBDVFJfRUwwICovCisJCS5lc3JfbWFzayA9IEVTUl9FTHhfU1lTNjRfSVNTX1NZU19PUF9NQVNLLAorCQkuZXNyX3ZhbCA9IEVTUl9FTHhfU1lTNjRfSVNTX1NZU19DVFJfUkVBRCwKKwkJLmhhbmRsZXIgPSBjdHJfcmVhZF9oYW5kbGVyLAorCX0sCisJe30sCit9OworCithc21saW5rYWdlIHZvaWQgX19leGNlcHRpb24gZG9fc3lzaW5zdHIodW5zaWduZWQgaW50IGVzciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHN5czY0X2hvb2sgKmhvb2s7CisKKwlmb3IgKGhvb2sgPSBzeXM2NF9ob29rczsgaG9vay0+aGFuZGxlcjsgaG9vaysrKQorCQlpZiAoKGhvb2stPmVzcl9tYXNrICYgZXNyKSA9PSBob29rLT5lc3JfdmFsKSB7CisJCQlob29rLT5oYW5kbGVyKGVzciwgcmVncyk7CisJCQlyZXR1cm47CisJCX0KKworCWZvcmNlX3NpZ25hbF9pbmplY3QoU0lHSUxMLCBJTExfSUxMT1BDLCByZWdzLCAwKTsKK30KKwogbG9uZyBjb21wYXRfYXJtX3N5c2NhbGwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCiBhc21saW5rYWdlIGxvbmcgZG9fbmlfc3lzY2FsbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3Zkc28uYyBiL2FyY2gvYXJtNjQva2VybmVsL3Zkc28uYwppbmRleCAwNzYzMTJiLi5hMmMyNDc4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC92ZHNvLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvdmRzby5jCkBAIC0xOCwxMiArMTgsMTMgQEAKICAqIEF1dGhvcjogV2lsbCBEZWFjb24gPHdpbGwuZGVhY29uQGFybS5jb20+CiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lbGYuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KQEAgLTM3LDggKzM4LDcgQEAKICNpbmNsdWRlIDxhc20vdmRzb19kYXRhcGFnZS5oPgogCiBleHRlcm4gY2hhciB2ZHNvX3N0YXJ0LCB2ZHNvX2VuZDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZkc29fcGFnZXM7Ci1zdGF0aWMgc3RydWN0IHBhZ2UgKip2ZHNvX3BhZ2VsaXN0Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgdmRzb19wYWdlcyBfX3JvX2FmdGVyX2luaXQ7CiAKIC8qCiAgKiBUaGUgdkRTTyBkYXRhIHBhZ2UuCkBAIC01Myw5ICs1Myw5IEBACiAvKgogICogQ3JlYXRlIGFuZCBtYXAgdGhlIHZlY3RvcnMgcGFnZSBmb3IgQUFyY2gzMiB0YXNrcy4KICAqLwotc3RhdGljIHN0cnVjdCBwYWdlICp2ZWN0b3JzX3BhZ2VbMV07CitzdGF0aWMgc3RydWN0IHBhZ2UgKnZlY3RvcnNfcGFnZVsxXSBfX3JvX2FmdGVyX2luaXQ7CiAKLXN0YXRpYyBpbnQgYWxsb2NfdmVjdG9yc19wYWdlKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhbGxvY192ZWN0b3JzX3BhZ2Uodm9pZCkKIHsKIAlleHRlcm4gY2hhciBfX2t1c2VyX2hlbHBlcl9zdGFydFtdLCBfX2t1c2VyX2hlbHBlcl9lbmRbXTsKIAlleHRlcm4gY2hhciBfX2FhcmNoMzJfc2lncmV0X2NvZGVfc3RhcnRbXSwgX19hYXJjaDMyX3NpZ3JldF9jb2RlX2VuZFtdOwpAQCAtODgsNyArODgsNyBAQAogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gQUFSQ0gzMl9WRUNUT1JTX0JBU0U7Ci0Jc3RhdGljIHN0cnVjdCB2bV9zcGVjaWFsX21hcHBpbmcgc3BlYyA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZyBzcGVjID0gewogCQkubmFtZQk9ICJbdmVjdG9yc10iLAogCQkucGFnZXMJPSB2ZWN0b3JzX3BhZ2UsCiAKQEAgLTExMCwxMSArMTEwLDE5IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLwogCi1zdGF0aWMgc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZyB2ZHNvX3NwZWNbMl07CitzdGF0aWMgc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZyB2ZHNvX3NwZWNbMl0gX19yb19hZnRlcl9pbml0ID0geworCXsKKwkJLm5hbWUJPSAiW3Z2YXJdIiwKKwl9LAorCXsKKwkJLm5hbWUJPSAiW3Zkc29dIiwKKwl9LAorfTsKIAogc3RhdGljIGludCBfX2luaXQgdmRzb19pbml0KHZvaWQpCiB7CiAJaW50IGk7CisJc3RydWN0IHBhZ2UgKip2ZHNvX3BhZ2VsaXN0OwogCiAJaWYgKG1lbWNtcCgmdmRzb19zdGFydCwgIlwxNzdFTEYiLCA0KSkgewogCQlwcl9lcnIoInZEU08gaXMgbm90IGEgdmFsaWQgRUxGIG9iamVjdCFcbiIpOwpAQCAtMTM4LDE2ICsxNDYsOCBAQAogCWZvciAoaSA9IDA7IGkgPCB2ZHNvX3BhZ2VzOyBpKyspCiAJCXZkc29fcGFnZWxpc3RbaSArIDFdID0gcGZuX3RvX3BhZ2UoUEhZU19QRk4oX19wYSgmdmRzb19zdGFydCkpICsgaSk7CiAKLQkvKiBQb3B1bGF0ZSB0aGUgc3BlY2lhbCBtYXBwaW5nIHN0cnVjdHVyZXMgKi8KLQl2ZHNvX3NwZWNbMF0gPSAoc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZykgewotCQkubmFtZQk9ICJbdnZhcl0iLAotCQkucGFnZXMJPSB2ZHNvX3BhZ2VsaXN0LAotCX07Ci0KLQl2ZHNvX3NwZWNbMV0gPSAoc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZykgewotCQkubmFtZQk9ICJbdmRzb10iLAotCQkucGFnZXMJPSAmdmRzb19wYWdlbGlzdFsxXSwKLQl9OworCXZkc29fc3BlY1swXS5wYWdlcyA9ICZ2ZHNvX3BhZ2VsaXN0WzBdOworCXZkc29fc3BlY1sxXS5wYWdlcyA9ICZ2ZHNvX3BhZ2VsaXN0WzFdOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMDEsNyArMjAxLDcgQEAKICAqLwogdm9pZCB1cGRhdGVfdnN5c2NhbGwoc3RydWN0IHRpbWVrZWVwZXIgKnRrKQogewotCXUzMiB1c2Vfc3lzY2FsbCA9IHN0cmNtcCh0ay0+dGtyX21vbm8uY2xvY2stPm5hbWUsICJhcmNoX3N5c19jb3VudGVyIik7CisJdTMyIHVzZV9zeXNjYWxsID0gIXRrLT50a3JfbW9uby5jbG9jay0+YXJjaGRhdGEudmRzb19kaXJlY3Q7CiAKIAkrK3Zkc29fZGF0YS0+dGJfc2VxX2NvdW50OwogCXNtcF93bWIoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2FybTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDY1OTk2M2QuLjVjZTliMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTg1LDYgKzE4NSwyNSBAQAogCV9kYXRhID0gLjsKIAlfc2RhdGEgPSAuOwogCVJXX0RBVEFfU0VDVElPTihMMV9DQUNIRV9CWVRFUywgUEFHRV9TSVpFLCBUSFJFQURfU0laRSkKKworCS8qCisJICogRGF0YSB3cml0dGVuIHdpdGggdGhlIE1NVSBvZmYgYnV0IHJlYWQgd2l0aCB0aGUgTU1VIG9uIHJlcXVpcmVzCisJICogY2FjaGUgbGluZXMgdG8gYmUgaW52YWxpZGF0ZWQsIGRpc2NhcmRpbmcgdXAgdG8gYSBDYWNoZSBXcml0ZWJhY2sKKwkgKiBHcmFudWxlIChDV0cpIG9mIGRhdGEgZnJvbSB0aGUgY2FjaGUuIEtlZXAgdGhlIHNlY3Rpb24gdGhhdAorCSAqIHJlcXVpcmVzIHRoaXMgdHlwZSBvZiBtYWludGVuYW5jZSB0byBiZSBpbiBpdHMgb3duIENhY2hlIFdyaXRlYmFjaworCSAqIEdyYW51bGUgKENXRykgYXJlYSBzbyB0aGUgY2FjaGUgbWFpbnRlbmFuY2Ugb3BlcmF0aW9ucyBkb24ndAorCSAqIGludGVyZmVyZSB3aXRoIGFkamFjZW50IGRhdGEuCisJICovCisJLm1tdW9mZi5kYXRhLndyaXRlIDogQUxJR04oU1pfMkspIHsKKwkJX19tbXVvZmZfZGF0YV9zdGFydCA9IC47CisJCSooLm1tdW9mZi5kYXRhLndyaXRlKQorCX0KKwkuID0gQUxJR04oU1pfMkspOworCS5tbXVvZmYuZGF0YS5yZWFkIDogeworCQkqKC5tbXVvZmYuZGF0YS5yZWFkKQorCQlfX21tdW9mZl9kYXRhX2VuZCA9IC47CisJfQorCiAJUEVDT0ZGX0VEQVRBX1BBRERJTkcKIAlfZWRhdGEgPSAuOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAuUyBiL2FyY2gvYXJtNjQva3ZtL2h5cC5TCmluZGV4IDdjZTkzMTUuLjI3MjY2MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva3ZtL2h5cC5TCisrKyBiL2FyY2gvYXJtNjQva3ZtL2h5cC5TCkBAIC00NiwxMCArNDYsNiBAQAogCWh2YwkjMAogCWxkciAgICAgbHIsIFtzcF0sICMxNgogCXJldAotYWx0ZXJuYXRpdmVfZWxzZQorYWx0ZXJuYXRpdmVfZWxzZV9ub3BfZW5kaWYKIAliCV9fdmhlX2h5cF9jYWxsCi0Jbm9wCi0Jbm9wCi0Jbm9wCi1hbHRlcm5hdGl2ZV9lbmRpZgogRU5EUFJPQyhfX2t2bV9jYWxsX2h5cCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2h5cC9zd2l0Y2guYyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9zd2l0Y2guYwppbmRleCBhZTc4NTVmLi41YTg0YjQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9oeXAvc3dpdGNoLmMKKysrIGIvYXJjaC9hcm02NC9rdm0vaHlwL3N3aXRjaC5jCkBAIC0yNTYsNyArMjU2LDcgQEAKIAogCS8qCiAJICogV2UgbXVzdCByZXN0b3JlIHRoZSAzMi1iaXQgc3RhdGUgYmVmb3JlIHRoZSBzeXNyZWdzLCB0aGFua3MKLQkgKiB0byBDb3J0ZXgtQTU3IGVycmF0dW0gIzg1MjUyMy4KKwkgKiB0byBlcnJhdHVtICM4NTI1MjMgKENvcnRleC1BNTcpIG9yICM4NTM3MDkgKENvcnRleC1BNzIpLgogCSAqLwogCV9fc3lzcmVnMzJfcmVzdG9yZV9zdGF0ZSh2Y3B1KTsKIAlfX3N5c3JlZ19yZXN0b3JlX2d1ZXN0X3N0YXRlKGd1ZXN0X2N0eHQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vc3lzX3JlZ3MuYyBiL2FyY2gvYXJtNjQva3ZtL3N5c19yZWdzLmMKaW5kZXggYjBiMjI1Yy4uZjMwMmZkYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rdm0vc3lzX3JlZ3MuYworKysgYi9hcmNoL2FybTY0L2t2bS9zeXNfcmVncy5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8YXNtL2t2bV9ob3N0Lmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9tbXUuaD4KICNpbmNsdWRlIDxhc20vcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KIAogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9rdm0uaD4KIApAQCAtNjcsMTEgKzY4LDkgQEAKIAogCS8qIE1ha2Ugc3VyZSBub29uZSBlbHNlIGNoYW5nZXMgQ1NTRUxSIGR1cmluZyB0aGlzISAqLwogCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JLyogUHV0IHZhbHVlIGludG8gQ1NTRUxSICovCi0JYXNtIHZvbGF0aWxlKCJtc3IgY3NzZWxyX2VsMSwgJXgwIiA6IDogInIiIChjc3NlbHIpKTsKKwl3cml0ZV9zeXNyZWcoY3NzZWxyLCBjc3NlbHJfZWwxKTsKIAlpc2IoKTsKLQkvKiBSZWFkIHJlc3VsdCBvdXQgb2YgQ0NTSURSICovCi0JYXNtIHZvbGF0aWxlKCJtcnMgJTAsIGNjc2lkcl9lbDEiIDogIj1yIiAoY2NzaWRyKSk7CisJY2NzaWRyID0gcmVhZF9zeXNyZWcoY2NzaWRyX2VsMSk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJcmV0dXJuIGNjc2lkcjsKQEAgLTE3NCw5ICsxNzMsNyBAQAogCWlmIChwLT5pc193cml0ZSkgewogCQlyZXR1cm4gaWdub3JlX3dyaXRlKHZjcHUsIHApOwogCX0gZWxzZSB7Ci0JCXUzMiB2YWw7Ci0JCWFzbSB2b2xhdGlsZSgibXJzICUwLCBkYmdhdXRoc3RhdHVzX2VsMSIgOiAiPXIiICh2YWwpKTsKLQkJcC0+cmVndmFsID0gdmFsOworCQlwLT5yZWd2YWwgPSByZWFkX3N5c3JlZyhkYmdhdXRoc3RhdHVzX2VsMSk7CiAJCXJldHVybiB0cnVlOwogCX0KIH0KQEAgLTQyOSwxMCArNDI2LDcgQEAKIAogc3RhdGljIHZvaWQgcmVzZXRfYW1haXJfZWwxKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgY29uc3Qgc3RydWN0IHN5c19yZWdfZGVzYyAqcikKIHsKLQl1NjQgYW1haXI7Ci0KLQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgYW1haXJfZWwxXG4iIDogIj1yIiAoYW1haXIpKTsKLQl2Y3B1X3N5c19yZWcodmNwdSwgQU1BSVJfRUwxKSA9IGFtYWlyOworCXZjcHVfc3lzX3JlZyh2Y3B1LCBBTUFJUl9FTDEpID0gcmVhZF9zeXNyZWcoYW1haXJfZWwxKTsKIH0KIAogc3RhdGljIHZvaWQgcmVzZXRfbXBpZHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBjb25zdCBzdHJ1Y3Qgc3lzX3JlZ19kZXNjICpyKQpAQCAtNDU2LDggKzQ1MCw5IEBACiB7CiAJdTY0IHBtY3IsIHZhbDsKIAotCWFzbSB2b2xhdGlsZSgibXJzICUwLCBwbWNyX2VsMFxuIiA6ICI9ciIgKHBtY3IpKTsKLQkvKiBXcml0YWJsZSBiaXRzIG9mIFBNQ1JfRUwwIChBUk1WOF9QTVVfUE1DUl9NQVNLKSBpcyByZXNldCB0byBVTktOT1dOCisJcG1jciA9IHJlYWRfc3lzcmVnKHBtY3JfZWwwKTsKKwkvKgorCSAqIFdyaXRhYmxlIGJpdHMgb2YgUE1DUl9FTDAgKEFSTVY4X1BNVV9QTUNSX01BU0spIGFyZSByZXNldCB0byBVTktOT1dOCiAJICogZXhjZXB0IFBNQ1IuRSByZXNldHRpbmcgdG8gemVyby4KIAkgKi8KIAl2YWwgPSAoKHBtY3IgJiB+QVJNVjhfUE1VX1BNQ1JfTUFTSykKQEAgLTU1Nyw5ICs1NTIsOSBAQAogCQlyZXR1cm4gZmFsc2U7CiAKIAlpZiAoIShwLT5PcDIgJiAxKSkKLQkJYXNtIHZvbGF0aWxlKCJtcnMgJTAsIHBtY2VpZDBfZWwwXG4iIDogIj1yIiAocG1jZWlkKSk7CisJCXBtY2VpZCA9IHJlYWRfc3lzcmVnKHBtY2VpZDBfZWwwKTsKIAllbHNlCi0JCWFzbSB2b2xhdGlsZSgibXJzICUwLCBwbWNlaWQxX2VsMFxuIiA6ICI9ciIgKHBtY2VpZCkpOworCQlwbWNlaWQgPSByZWFkX3N5c3JlZyhwbWNlaWQxX2VsMCk7CiAKIAlwLT5yZWd2YWwgPSBwbWNlaWQ7CiAKQEAgLTgyMywxNCArODE4LDYgQEAKICAqIEFyY2hpdGVjdGVkIHN5c3RlbSByZWdpc3RlcnMuCiAgKiBJbXBvcnRhbnQ6IE11c3QgYmUgc29ydGVkIGFzY2VuZGluZyBieSBPcDAsIE9wMSwgQ1JuLCBDUm0sIE9wMgogICoKLSAqIFdlIGNvdWxkIHRyYXAgSURfREZSMCBhbmQgdGVsbCB0aGUgZ3Vlc3Qgd2UgZG9uJ3Qgc3VwcG9ydCBwZXJmb3JtYW5jZQotICogbW9uaXRvcmluZy4gIFVuZm9ydHVuYXRlbHkgdGhlIHBhdGNoIHRvIG1ha2UgdGhlIGtlcm5lbCBjaGVjayBJRF9ERlIwIHdhcwotICogTkFLZWQsIHNvIGl0IHdpbGwgcmVhZCB0aGUgUE1DUiBhbnl3YXkuCi0gKgotICogVGhlcmVmb3JlIHdlIHRlbGwgdGhlIGd1ZXN0IHdlIGhhdmUgMCBjb3VudGVycy4gIFVuZm9ydHVuYXRlbHksIHdlCi0gKiBtdXN0IGFsd2F5cyBzdXBwb3J0IFBNQ0NOVFIgKHRoZSBjeWNsZSBjb3VudGVyKTogd2UganVzdCBSQVovV0kgZm9yCi0gKiBhbGwgUE0gcmVnaXN0ZXJzLCB3aGljaCBkb2Vzbid0IGNyYXNoIHRoZSBndWVzdCBrZXJuZWwgYXQgbGVhc3QuCi0gKgogICogRGVidWcgaGFuZGxpbmc6IFdlIGRvIHRyYXAgbW9zdCwgaWYgbm90IGFsbCBkZWJ1ZyByZWxhdGVkIHN5c3RlbQogICogcmVnaXN0ZXJzLiBUaGUgaW1wbGVtZW50YXRpb24gaXMgZ29vZCBlbm91Z2ggdG8gZW5zdXJlIHRoYXQgYSBndWVzdAogICogY2FuIHVzZSB0aGVzZSB3aXRoIG1pbmltYWwgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24uIFRoZSBkcmF3YmFjayBpcwpAQCAtMTM2MCw3ICsxMzQ3LDcgQEAKIAl7IE9wMSggMCksIENSbigxMCksIENSbSggMyksIE9wMiggMSksIGFjY2Vzc192bV9yZWcsIE5VTEwsIGMxMF9BTUFJUjEgfSwKIAogCS8qIElDQ19TUkUgKi8KLQl7IE9wMSggMCksIENSbigxMiksIENSbSgxMiksIE9wMiggNSksIHRyYXBfcmF6X3dpIH0sCisJeyBPcDEoIDApLCBDUm4oMTIpLCBDUm0oMTIpLCBPcDIoIDUpLCBhY2Nlc3NfZ2ljX3NyZSB9LAogCiAJeyBPcDEoIDApLCBDUm4oMTMpLCBDUm0oIDApLCBPcDIoIDEpLCBhY2Nlc3Nfdm1fcmVnLCBOVUxMLCBjMTNfQ0lEIH0sCiAKQEAgLTE4NDEsMTEgKzE4MjgsNyBAQAogCXN0YXRpYyB2b2lkIGdldF8jI3JlZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnYsCQkJXAogCQkJICAgICAgY29uc3Qgc3RydWN0IHN5c19yZWdfZGVzYyAqcikJCVwKIAl7CQkJCQkJCQlcCi0JCXU2NCB2YWw7CQkJCQkJXAotCQkJCQkJCQkJXAotCQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgIiBfX3N0cmluZ2lmeShyZWcpICJcbiIJCVwKLQkJCSAgICAgOiAiPXIiICh2YWwpKTsJCQkJXAotCQkoKHN0cnVjdCBzeXNfcmVnX2Rlc2MgKilyKS0+dmFsID0gdmFsOwkJCVwKKwkJKChzdHJ1Y3Qgc3lzX3JlZ19kZXNjICopciktPnZhbCA9IHJlYWRfc3lzcmVnKHJlZyk7CVwKIAl9CiAKIEZVTkNUSU9OX0lOVkFSSUFOVChtaWRyX2VsMSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL3N5c19yZWdzX2dlbmVyaWNfdjguYyBiL2FyY2gvYXJtNjQva3ZtL3N5c19yZWdzX2dlbmVyaWNfdjguYwppbmRleCBlZDkwNTc4Li40NmFmNzE4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9zeXNfcmVnc19nZW5lcmljX3Y4LmMKKysrIGIvYXJjaC9hcm02NC9rdm0vc3lzX3JlZ3NfZ2VuZXJpY192OC5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8YXNtL2t2bV9ob3N0Lmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9lbXVsYXRlLmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9jb3Byb2MuaD4KKyNpbmNsdWRlIDxhc20vc3lzcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSAic3lzX3JlZ3MuaCIKQEAgLTQzLDEwICs0NCw3IEBACiAKIHN0YXRpYyB2b2lkIHJlc2V0X2FjdGxyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgY29uc3Qgc3RydWN0IHN5c19yZWdfZGVzYyAqcikKIHsKLQl1NjQgYWN0bHI7Ci0KLQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgYWN0bHJfZWwxXG4iIDogIj1yIiAoYWN0bHIpKTsKLQl2Y3B1X3N5c19yZWcodmNwdSwgQUNUTFJfRUwxKSA9IGFjdGxyOworCXZjcHVfc3lzX3JlZyh2Y3B1LCBBQ1RMUl9FTDEpID0gcmVhZF9zeXNyZWcoYWN0bHJfZWwxKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbGliL2NvcHlfcGFnZS5TIGIvYXJjaC9hcm02NC9saWIvY29weV9wYWdlLlMKaW5kZXggNGMxZTcwMC4uYzNjZDY1ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9saWIvY29weV9wYWdlLlMKKysrIGIvYXJjaC9hcm02NC9saWIvY29weV9wYWdlLlMKQEAgLTI5LDE0ICsyOSwxMSBAQAogICoJeDEgLSBzcmMKICAqLwogRU5UUlkoY29weV9wYWdlKQotYWx0ZXJuYXRpdmVfaWZfbm90IEFSTTY0X0hBU19OT19IV19QUkVGRVRDSAotCW5vcAotCW5vcAotYWx0ZXJuYXRpdmVfZWxzZQorYWx0ZXJuYXRpdmVfaWYgQVJNNjRfSEFTX05PX0hXX1BSRUZFVENICiAJIyBQcmVmZXRjaCB0d28gY2FjaGUgbGluZXMgYWhlYWQuCiAJcHJmbSAgICBwbGRsMXN0cm0sIFt4MSwgIzEyOF0KIAlwcmZtICAgIHBsZGwxc3RybSwgW3gxLCAjMjU2XQotYWx0ZXJuYXRpdmVfZW5kaWYKK2FsdGVybmF0aXZlX2Vsc2Vfbm9wX2VuZGlmCiAKIAlsZHAJeDIsIHgzLCBbeDFdCiAJbGRwCXg0LCB4NSwgW3gxLCAjMTZdCkBAIC01MiwxMSArNDksOSBAQAogMToKIAlzdWJzCXgxOCwgeDE4LCAjMTI4CiAKLWFsdGVybmF0aXZlX2lmX25vdCBBUk02NF9IQVNfTk9fSFdfUFJFRkVUQ0gKLQlub3AKLWFsdGVybmF0aXZlX2Vsc2UKK2FsdGVybmF0aXZlX2lmIEFSTTY0X0hBU19OT19IV19QUkVGRVRDSAogCXByZm0gICAgcGxkbDFzdHJtLCBbeDEsICMzODRdCi1hbHRlcm5hdGl2ZV9lbmRpZgorYWx0ZXJuYXRpdmVfZWxzZV9ub3BfZW5kaWYKIAogCXN0bnAJeDIsIHgzLCBbeDBdCiAJbGRwCXgyLCB4MywgW3gxXQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9jYWNoZS5TIGIvYXJjaC9hcm02NC9tbS9jYWNoZS5TCmluZGV4IDA3ZDczNTIuLjU4YjVhOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvbW0vY2FjaGUuUworKysgYi9hcmNoL2FybTY0L21tL2NhY2hlLlMKQEAgLTEwNSwxOSArMTA1LDIwIEBACiBFTkRQUk9DKF9fY2xlYW5fZGNhY2hlX2FyZWFfcG91KQogCiAvKgorICoJX19kbWFfaW52X2FyZWEoc3RhcnQsIHNpemUpCisgKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCisgKgktIHNpemUgICAgLSBzaXplIGluIHF1ZXN0aW9uCisgKi8KK19fZG1hX2ludl9hcmVhOgorCWFkZAl4MSwgeDEsIHgwCisJLyogRkFMTFRIUk9VR0ggKi8KKworLyoKICAqCV9faW52YWxfY2FjaGVfcmFuZ2Uoc3RhcnQsIGVuZCkKICAqCS0gc3RhcnQgICAtIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCiAgKgktIGVuZCAgICAgLSBlbmQgYWRkcmVzcyBvZiByZWdpb24KICAqLwogRU5UUlkoX19pbnZhbF9jYWNoZV9yYW5nZSkKLQkvKiBGQUxMVEhST1VHSCAqLwotCi0vKgotICoJX19kbWFfaW52X3JhbmdlKHN0YXJ0LCBlbmQpCi0gKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCi0gKgktIGVuZCAgICAgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzIG9mIHJlZ2lvbgotICovCi1fX2RtYV9pbnZfcmFuZ2U6CiAJZGNhY2hlX2xpbmVfc2l6ZSB4MiwgeDMKIAlzdWIJeDMsIHgyLCAjMQogCXRzdAl4MSwgeDMJCQkJLy8gZW5kIGNhY2hlIGxpbmUgYWxpZ25lZD8KQEAgLTEzNiw0NiArMTM3LDQzIEBACiAJZHNiCXN5CiAJcmV0CiBFTkRQSVBST0MoX19pbnZhbF9jYWNoZV9yYW5nZSkKLUVORFBST0MoX19kbWFfaW52X3JhbmdlKQorRU5EUFJPQyhfX2RtYV9pbnZfYXJlYSkKIAogLyoKLSAqCV9fZG1hX2NsZWFuX3JhbmdlKHN0YXJ0LCBlbmQpCi0gKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCi0gKgktIGVuZCAgICAgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzIG9mIHJlZ2lvbgorICoJX19jbGVhbl9kY2FjaGVfYXJlYV9wb2Moa2FkZHIsIHNpemUpCisgKgorICogCUVuc3VyZSB0aGF0IGFueSBELWNhY2hlIGxpbmVzIGZvciB0aGUgaW50ZXJ2YWwgW2thZGRyLCBrYWRkcitzaXplKQorICogCWFyZSBjbGVhbmVkIHRvIHRoZSBQb0MuCisgKgorICoJLSBrYWRkciAgIC0ga2VybmVsIGFkZHJlc3MKKyAqCS0gc2l6ZSAgICAtIHNpemUgaW4gcXVlc3Rpb24KICAqLwotX19kbWFfY2xlYW5fcmFuZ2U6Ci0JZGNhY2hlX2xpbmVfc2l6ZSB4MiwgeDMKLQlzdWIJeDMsIHgyLCAjMQotCWJpYwl4MCwgeDAsIHgzCi0xOgotYWx0ZXJuYXRpdmVfaWZfbm90IEFSTTY0X1dPUktBUk9VTkRfQ0xFQU5fQ0FDSEUKLQlkYwljdmFjLCB4MAotYWx0ZXJuYXRpdmVfZWxzZQotCWRjCWNpdmFjLCB4MAotYWx0ZXJuYXRpdmVfZW5kaWYKLQlhZGQJeDAsIHgwLCB4MgotCWNtcAl4MCwgeDEKLQliLmxvCTFiCi0JZHNiCXN5Ci0JcmV0Ci1FTkRQUk9DKF9fZG1hX2NsZWFuX3JhbmdlKQorRU5UUlkoX19jbGVhbl9kY2FjaGVfYXJlYV9wb2MpCisJLyogRkFMTFRIUk9VR0ggKi8KIAogLyoKLSAqCV9fZG1hX2ZsdXNoX3JhbmdlKHN0YXJ0LCBlbmQpCisgKglfX2RtYV9jbGVhbl9hcmVhKHN0YXJ0LCBzaXplKQogICoJLSBzdGFydCAgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzIG9mIHJlZ2lvbgotICoJLSBlbmQgICAgIC0gdmlydHVhbCBlbmQgYWRkcmVzcyBvZiByZWdpb24KKyAqCS0gc2l6ZSAgICAtIHNpemUgaW4gcXVlc3Rpb24KICAqLwotRU5UUlkoX19kbWFfZmx1c2hfcmFuZ2UpCi0JZGNhY2hlX2xpbmVfc2l6ZSB4MiwgeDMKLQlzdWIJeDMsIHgyLCAjMQotCWJpYwl4MCwgeDAsIHgzCi0xOglkYwljaXZhYywgeDAJCQkvLyBjbGVhbiAmIGludmFsaWRhdGUgRCAvIFUgbGluZQotCWFkZAl4MCwgeDAsIHgyCi0JY21wCXgwLCB4MQotCWIubG8JMWIKLQlkc2IJc3kKK19fZG1hX2NsZWFuX2FyZWE6CisJZGNhY2hlX2J5X2xpbmVfb3AgY3ZhYywgc3ksIHgwLCB4MSwgeDIsIHgzCiAJcmV0Ci1FTkRQSVBST0MoX19kbWFfZmx1c2hfcmFuZ2UpCitFTkRQSVBST0MoX19jbGVhbl9kY2FjaGVfYXJlYV9wb2MpCitFTkRQUk9DKF9fZG1hX2NsZWFuX2FyZWEpCisKKy8qCisgKglfX2RtYV9mbHVzaF9hcmVhKHN0YXJ0LCBzaXplKQorICoKKyAqCWNsZWFuICYgaW52YWxpZGF0ZSBEIC8gVSBsaW5lCisgKgorICoJLSBzdGFydCAgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzIG9mIHJlZ2lvbgorICoJLSBzaXplICAgIC0gc2l6ZSBpbiBxdWVzdGlvbgorICovCitFTlRSWShfX2RtYV9mbHVzaF9hcmVhKQorCWRjYWNoZV9ieV9saW5lX29wIGNpdmFjLCBzeSwgeDAsIHgxLCB4MiwgeDMKKwlyZXQKK0VORFBJUFJPQyhfX2RtYV9mbHVzaF9hcmVhKQogCiAvKgogICoJX19kbWFfbWFwX2FyZWEoc3RhcnQsIHNpemUsIGRpcikKQEAgLTE4NCwxMCArMTgyLDkgQEAKICAqCS0gZGlyCS0gRE1BIGRpcmVjdGlvbgogICovCiBFTlRSWShfX2RtYV9tYXBfYXJlYSkKLQlhZGQJeDEsIHgxLCB4MAogCWNtcAl3MiwgI0RNQV9GUk9NX0RFVklDRQotCWIuZXEJX19kbWFfaW52X3JhbmdlCi0JYglfX2RtYV9jbGVhbl9yYW5nZQorCWIuZXEJX19kbWFfaW52X2FyZWEKKwliCV9fZG1hX2NsZWFuX2FyZWEKIEVORFBJUFJPQyhfX2RtYV9tYXBfYXJlYSkKIAogLyoKQEAgLTE5Nyw4ICsxOTQsNyBAQAogICoJLSBkaXIJLSBETUEgZGlyZWN0aW9uCiAgKi8KIEVOVFJZKF9fZG1hX3VubWFwX2FyZWEpCi0JYWRkCXgxLCB4MSwgeDAKIAljbXAJdzIsICNETUFfVE9fREVWSUNFCi0JYi5uZQlfX2RtYV9pbnZfcmFuZ2UKKwliLm5lCV9fZG1hX2ludl9hcmVhCiAJcmV0CiBFTkRQSVBST0MoX19kbWFfdW5tYXBfYXJlYSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vZG1hLW1hcHBpbmcuYyBiL2FyY2gvYXJtNjQvbW0vZG1hLW1hcHBpbmcuYwppbmRleCBjNDI4NGM0Li5iZGFjZWFkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL2RtYS1tYXBwaW5nLmMKKysrIGIvYXJjaC9hcm02NC9tbS9kbWEtbWFwcGluZy5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9nZW5hbGxvYy5oPgpAQCAtMzAsNyArMzEsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAotc3RhdGljIGludCBzd2lvdGxiIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgaW50IHN3aW90bGIgX19yb19hZnRlcl9pbml0OwogCiBzdGF0aWMgcGdwcm90X3QgX19nZXRfZG1hX3BncHJvdCh1bnNpZ25lZCBsb25nIGF0dHJzLCBwZ3Byb3RfdCBwcm90LAogCQkJCSBib29sIGNvaGVyZW50KQpAQCAtMTY4LDcgKzE2OSw3IEBACiAJCXJldHVybiBwdHI7CiAKIAkvKiByZW1vdmUgYW55IGRpcnR5IGNhY2hlIGxpbmVzIG9uIHRoZSBrZXJuZWwgYWxpYXMgKi8KLQlfX2RtYV9mbHVzaF9yYW5nZShwdHIsIHB0ciArIHNpemUpOworCV9fZG1hX2ZsdXNoX2FyZWEocHRyLCBzaXplKTsKIAogCS8qIGNyZWF0ZSBhIGNvaGVyZW50IG1hcHBpbmcgKi8KIAlwYWdlID0gdmlydF90b19wYWdlKHB0cik7CkBAIC0zODcsNyArMzg4LDcgQEAKIAkJdm9pZCAqcGFnZV9hZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwogCiAJCW1lbXNldChwYWdlX2FkZHIsIDAsIGF0b21pY19wb29sX3NpemUpOwotCQlfX2RtYV9mbHVzaF9yYW5nZShwYWdlX2FkZHIsIHBhZ2VfYWRkciArIGF0b21pY19wb29sX3NpemUpOworCQlfX2RtYV9mbHVzaF9hcmVhKHBhZ2VfYWRkciwgYXRvbWljX3Bvb2xfc2l6ZSk7CiAKIAkJYXRvbWljX3Bvb2wgPSBnZW5fcG9vbF9jcmVhdGUoUEFHRV9TSElGVCwgLTEpOwogCQlpZiAoIWF0b21pY19wb29sKQpAQCAtNTQ4LDcgKzU0OSw3IEBACiAvKiBUaGFua2Z1bGx5LCBhbGwgY2FjaGUgb3BzIGFyZSBieSBWQSBzbyB3ZSBjYW4gaWdub3JlIHBoeXMgaGVyZSAqLwogc3RhdGljIHZvaWQgZmx1c2hfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHZvaWQgKnZpcnQsIHBoeXNfYWRkcl90IHBoeXMpCiB7Ci0JX19kbWFfZmx1c2hfcmFuZ2UodmlydCwgdmlydCArIFBBR0VfU0laRSk7CisJX19kbWFfZmx1c2hfYXJlYSh2aXJ0LCBQQUdFX1NJWkUpOwogfQogCiBzdGF0aWMgdm9pZCAqX19pb21tdV9hbGxvY19hdHRycyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9kdW1wLmMgYi9hcmNoL2FybTY0L21tL2R1bXAuYwppbmRleCBmOTRiODBlLi45YzNlNzVkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL2R1bXAuYworKysgYi9hcmNoL2FybTY0L21tL2R1bXAuYwpAQCAtMjQyLDcgKzI0Miw3IEBACiAKIHN0YXRpYyB2b2lkIHdhbGtfcHRlKHN0cnVjdCBwZ19zdGF0ZSAqc3QsIHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQpCiB7Ci0JcHRlX3QgKnB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgMCk7CisJcHRlX3QgKnB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgMFVMKTsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJdW5zaWduZWQgaTsKIApAQCAtMjU0LDcgKzI1NCw3IEBACiAKIHN0YXRpYyB2b2lkIHdhbGtfcG1kKHN0cnVjdCBwZ19zdGF0ZSAqc3QsIHB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQpCiB7Ci0JcG1kX3QgKnBtZCA9IHBtZF9vZmZzZXQocHVkLCAwKTsKKwlwbWRfdCAqcG1kID0gcG1kX29mZnNldChwdWQsIDBVTCk7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCXVuc2lnbmVkIGk7CiAKQEAgLTI3MSw3ICsyNzEsNyBAQAogCiBzdGF0aWMgdm9pZCB3YWxrX3B1ZChzdHJ1Y3QgcGdfc3RhdGUgKnN0LCBwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIHN0YXJ0KQogewotCXB1ZF90ICpwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgMCk7CisJcHVkX3QgKnB1ZCA9IHB1ZF9vZmZzZXQocGdkLCAwVUwpOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAl1bnNpZ25lZCBpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL2V4dGFibGUuYyBiL2FyY2gvYXJtNjQvbW0vZXh0YWJsZS5jCmluZGV4IDgxYWNkNDcuLmM5ZjExOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvbW0vZXh0YWJsZS5jCisrKyBiL2FyY2gvYXJtNjQvbW0vZXh0YWJsZS5jCkBAIC0yLDcgKzIsNyBAQAogICogQmFzZWQgb24gYXJjaC9hcm0vbW0vZXh0YWJsZS5jCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKIGludCBmaXh1cF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL2ZhdWx0LmMgYi9hcmNoL2FybTY0L21tL2ZhdWx0LmMKaW5kZXggMDVkMmJkNy4uNTNkOTE1OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9mYXVsdC5jCisrKyBiL2FyY2gvYXJtNjQvbW0vZmF1bHQuYwpAQCAtMTgsNyArMTgsNyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KQEAgLTI1MSw4ICsyNTEsNyBAQAogZ29vZF9hcmVhOgogCS8qCiAJICogQ2hlY2sgdGhhdCB0aGUgcGVybWlzc2lvbnMgb24gdGhlIFZNQSBhbGxvdyBmb3IgdGhlIGZhdWx0IHdoaWNoCi0JICogb2NjdXJyZWQuIElmIHdlIGVuY291bnRlcmVkIGEgd3JpdGUgb3IgZXhlYyBmYXVsdCwgd2UgbXVzdCBoYXZlCi0JICogYXBwcm9wcmlhdGUgcGVybWlzc2lvbnMsIG90aGVyd2lzZSB3ZSBhbGxvdyBhbnkgcGVybWlzc2lvbi4KKwkgKiBvY2N1cnJlZC4KIAkgKi8KIAlpZiAoISh2bWEtPnZtX2ZsYWdzICYgdm1fZmxhZ3MpKSB7CiAJCWZhdWx0ID0gVk1fRkFVTFRfQkFEQUNDRVNTOwpAQCAtMjg4LDcgKzI4Nyw3IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW07CiAJaW50IGZhdWx0LCBzaWcsIGNvZGU7Ci0JdW5zaWduZWQgbG9uZyB2bV9mbGFncyA9IFZNX1JFQUQgfCBWTV9XUklURSB8IFZNX0VYRUM7CisJdW5zaWduZWQgbG9uZyB2bV9mbGFncyA9IFZNX1JFQUQgfCBWTV9XUklURTsKIAl1bnNpZ25lZCBpbnQgbW1fZmxhZ3MgPSBGQVVMVF9GTEFHX0FMTE9XX1JFVFJZIHwgRkFVTFRfRkxBR19LSUxMQUJMRTsKIAogCWlmIChub3RpZnlfcGFnZV9mYXVsdChyZWdzLCBlc3IpKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9mbHVzaC5jIGIvYXJjaC9hcm02NC9tbS9mbHVzaC5jCmluZGV4IDQzYTc2YjAuLjgzNzczMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvbW0vZmx1c2guYworKysgYi9hcmNoL2FybTY0L21tL2ZsdXNoLmMKQEAgLTI1LDggKzI1LDYgQEAKICNpbmNsdWRlIDxhc20vY2FjaGV0eXBlLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKLSNpbmNsdWRlICJtbS5oIgotCiB2b2lkIGZsdXNoX2NhY2hlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAogCQkgICAgICAgdW5zaWduZWQgbG9uZyBlbmQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL2luaXQuYyBiL2FyY2gvYXJtNjQvbW0vaW5pdC5jCmluZGV4IGJiYjdlZTcuLjIxYzQ4OWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvbW0vaW5pdC5jCisrKyBiL2FyY2gvYXJtNjQvbW0vaW5pdC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KQEAgLTM0LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtY29udGlndW91cy5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N3aW90bGIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKICNpbmNsdWRlIDxhc20vYm9vdC5oPgogI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KQEAgLTQ3LDE2ICs0OSwxNCBAQAogI2luY2x1ZGUgPGFzbS90bGIuaD4KICNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUuaD4KIAotI2luY2x1ZGUgIm1tLmgiCi0KIC8qCiAgKiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gY2F0Y2ggaW5hZHZlcnRlbnQgcmVmZXJlbmNlcyB0byBtZW1zdGFydF9hZGRyCiAgKiB0aGF0IG9jY3VyIChwb3RlbnRpYWxseSBpbiBnZW5lcmljIGNvZGUpIGJlZm9yZSBhcm02NF9tZW1ibG9ja19pbml0KCkKICAqIGV4ZWN1dGVzLCB3aGljaCBhc3NpZ25zIGl0IGl0cyBhY3R1YWwgdmFsdWUuIFNvIHVzZSBhIGRlZmF1bHQgdmFsdWUKICAqIHRoYXQgY2Fubm90IGJlIG1pc3Rha2VuIGZvciBhIHJlYWwgcGh5c2ljYWwgYWRkcmVzcy4KICAqLwotczY0IG1lbXN0YXJ0X2FkZHIgX19yZWFkX21vc3RseSA9IC0xOwotcGh5c19hZGRyX3QgYXJtNjRfZG1hX3BoeXNfbGltaXQgX19yZWFkX21vc3RseTsKK3M2NCBtZW1zdGFydF9hZGRyIF9fcm9fYWZ0ZXJfaW5pdCA9IC0xOworcGh5c19hZGRyX3QgYXJtNjRfZG1hX3BoeXNfbGltaXQgX19yb19hZnRlcl9pbml0OwogCiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECiBzdGF0aWMgaW50IF9faW5pdCBlYXJseV9pbml0cmQoY2hhciAqcCkKQEAgLTQ4NSw3ICs0ODUsMTIgQEAKIHsKIAlmcmVlX3Jlc2VydmVkX2FyZWEoX192YShfX3BhKF9faW5pdF9iZWdpbikpLCBfX3ZhKF9fcGEoX19pbml0X2VuZCkpLAogCQkJICAgMCwgInVudXNlZCBrZXJuZWwiKTsKLQlmaXh1cF9pbml0KCk7CisJLyoKKwkgKiBVbm1hcCB0aGUgX19pbml0IHJlZ2lvbiBidXQgbGVhdmUgdGhlIFZNIGFyZWEgaW4gcGxhY2UuIFRoaXMKKwkgKiBwcmV2ZW50cyB0aGUgcmVnaW9uIGZyb20gYmVpbmcgcmV1c2VkIGZvciBrZXJuZWwgbW9kdWxlcywgd2hpY2gKKwkgKiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGthbGxzeW1zLgorCSAqLworCXVubWFwX2tlcm5lbF9yYW5nZSgodTY0KV9faW5pdF9iZWdpbiwgKHU2NCkoX19pbml0X2VuZCAtIF9faW5pdF9iZWdpbikpOwogfQogCiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL21tLmggYi9hcmNoL2FybTY0L21tL21tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZmU5ODkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm02NC9tbS9tbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0KLXZvaWQgZml4dXBfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vbW11LmMgYi9hcmNoL2FybTY0L21tL21tdS5jCmluZGV4IDQ5ODk5NDguLjA1NjE1YTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvbW0vbW11LmMKKysrIGIvYXJjaC9hcm02NC9tbS9tbXUuYwpAQCAtMTcsNiArMTcsNyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTQyLDExICs0Myw5IEBACiAjaW5jbHVkZSA8YXNtL21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAKLSNpbmNsdWRlICJtbS5oIgotCiB1NjQgaWRtYXBfdDBzeiA9IFRDUl9UMFNaKFZBX0JJVFMpOwogCi11NjQga2ltYWdlX3ZvZmZzZXQgX19yZWFkX21vc3RseTsKK3U2NCBraW1hZ2Vfdm9mZnNldCBfX3JvX2FmdGVyX2luaXQ7CiBFWFBPUlRfU1lNQk9MKGtpbWFnZV92b2Zmc2V0KTsKIAogLyoKQEAgLTM5OSwxNiArMzk4LDYgQEAKIAkJCSAgICBzZWN0aW9uX3NpemUsIFBBR0VfS0VSTkVMX1JPKTsKIH0KIAotdm9pZCBmaXh1cF9pbml0KHZvaWQpCi17Ci0JLyoKLQkgKiBVbm1hcCB0aGUgX19pbml0IHJlZ2lvbiBidXQgbGVhdmUgdGhlIFZNIGFyZWEgaW4gcGxhY2UuIFRoaXMKLQkgKiBwcmV2ZW50cyB0aGUgcmVnaW9uIGZyb20gYmVpbmcgcmV1c2VkIGZvciBrZXJuZWwgbW9kdWxlcywgd2hpY2gKLQkgKiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGthbGxzeW1zLgotCSAqLwotCXVubWFwX2tlcm5lbF9yYW5nZSgodTY0KV9faW5pdF9iZWdpbiwgKHU2NCkoX19pbml0X2VuZCAtIF9faW5pdF9iZWdpbikpOwotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgbWFwX2tlcm5lbF9zZWdtZW50KHBnZF90ICpwZ2QsIHZvaWQgKnZhX3N0YXJ0LCB2b2lkICp2YV9lbmQsCiAJCQkJICAgICAgcGdwcm90X3QgcHJvdCwgc3RydWN0IHZtX3N0cnVjdCAqdm1hKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9udW1hLmMgYi9hcmNoL2FybTY0L21tL251bWEuYwppbmRleCBjN2ZlM2VjLi43NzhhOTg1IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL251bWEuYworKysgYi9hcmNoL2FybTY0L21tL251bWEuYwpAQCAtMTcsMTIgKzE3LDE3IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpICJOVU1BOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKKyNpbmNsdWRlIDxhc20vYWNwaS5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorCiBzdHJ1Y3QgcGdsaXN0X2RhdGEgKm5vZGVfZGF0YVtNQVhfTlVNTk9ERVNdIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MKG5vZGVfZGF0YSk7CiBub2RlbWFza190IG51bWFfbm9kZXNfcGFyc2VkIF9faW5pdGRhdGE7CkBAIC0zNiwxMCArNDEsOSBAQAogewogCWlmICghb3B0KQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoIXN0cm5jbXAob3B0LCAib2ZmIiwgMykpIHsKLQkJcHJfaW5mbygiJXNcbiIsICJOVU1BIHR1cm5lZCBvZmYiKTsKKwlpZiAoIXN0cm5jbXAob3B0LCAib2ZmIiwgMykpCiAJCW51bWFfb2ZmID0gdHJ1ZTsKLQl9CisKIAlyZXR1cm4gMDsKIH0KIGVhcmx5X3BhcmFtKCJudW1hIiwgbnVtYV9wYXJzZV9lYXJseV9wYXJhbSk7CkBAIC05MSw3ICs5NSw2IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9ub2RlX3RvX2NwdW1hc2tfbWFwKHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IGNwdTsKIAlpbnQgbm9kZTsKIAogCS8qIHNldHVwIG5yX25vZGVfaWRzIGlmIG5vdCBkb25lIHlldCAqLwpAQCAtMTA0LDExICsxMDcsOCBAQAogCQljcHVtYXNrX2NsZWFyKG5vZGVfdG9fY3B1bWFza19tYXBbbm9kZV0pOwogCX0KIAotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCi0JCXNldF9jcHVfbnVtYV9ub2RlKGNwdSwgTlVNQV9OT19OT0RFKTsKLQogCS8qIGNwdW1hc2tfb2Zfbm9kZSgpIHdpbGwgbm93IHdvcmsgKi8KLQlwcl9kZWJ1ZygiTlVNQTogTm9kZSB0byBjcHVtYXNrIG1hcCBmb3IgJWQgbm9kZXNcbiIsIG5yX25vZGVfaWRzKTsKKwlwcl9kZWJ1ZygiTm9kZSB0byBjcHVtYXNrIG1hcCBmb3IgJWQgbm9kZXNcbiIsIG5yX25vZGVfaWRzKTsKIH0KIAogLyoKQEAgLTExNiwxOCArMTE2LDc3IEBACiAgKi8KIHZvaWQgbnVtYV9zdG9yZV9jcHVfaW5mbyh1bnNpZ25lZCBpbnQgY3B1KQogewotCW1hcF9jcHVfdG9fbm9kZShjcHUsIG51bWFfb2ZmID8gMCA6IGNwdV90b19ub2RlX21hcFtjcHVdKTsKKwltYXBfY3B1X3RvX25vZGUoY3B1LCBjcHVfdG9fbm9kZV9tYXBbY3B1XSk7CiB9CiAKIHZvaWQgX19pbml0IGVhcmx5X21hcF9jcHVfdG9fbm9kZSh1bnNpZ25lZCBpbnQgY3B1LCBpbnQgbmlkKQogewogCS8qIGZhbGxiYWNrIHRvIG5vZGUgMCAqLwotCWlmIChuaWQgPCAwIHx8IG5pZCA+PSBNQVhfTlVNTk9ERVMpCisJaWYgKG5pZCA8IDAgfHwgbmlkID49IE1BWF9OVU1OT0RFUyB8fCBudW1hX29mZikKIAkJbmlkID0gMDsKIAogCWNwdV90b19ub2RlX21hcFtjcHVdID0gbmlkOworCisJLyoKKwkgKiBXZSBzaG91bGQgc2V0IHRoZSBudW1hIG5vZGUgb2YgY3B1MCBhcyBzb29uIGFzIHBvc3NpYmxlLCBiZWNhdXNlIGl0CisJICogaGFzIGFscmVhZHkgYmVlbiBzZXQgdXAgb25saW5lIGJlZm9yZS4gY3B1X3RvX25vZGUoMCkgd2lsbCBzb29uIGJlCisJICogY2FsbGVkLgorCSAqLworCWlmICghY3B1KQorCQlzZXRfY3B1X251bWFfbm9kZShjcHUsIG5pZCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfSEFWRV9TRVRVUF9QRVJfQ1BVX0FSRUEKK3Vuc2lnbmVkIGxvbmcgX19wZXJfY3B1X29mZnNldFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTChfX3Blcl9jcHVfb2Zmc2V0KTsKKworc3RhdGljIGludCBfX2luaXQgZWFybHlfY3B1X3RvX25vZGUoaW50IGNwdSkKK3sKKwlyZXR1cm4gY3B1X3RvX25vZGVfbWFwW2NwdV07Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBjcHVfY3B1X2Rpc3RhbmNlKHVuc2lnbmVkIGludCBmcm9tLCB1bnNpZ25lZCBpbnQgdG8pCit7CisJcmV0dXJuIG5vZGVfZGlzdGFuY2UoZnJvbSwgdG8pOworfQorCitzdGF0aWMgdm9pZCAqIF9faW5pdCBwY3B1X2ZjX2FsbG9jKHVuc2lnbmVkIGludCBjcHUsIHNpemVfdCBzaXplLAorCQkJCSAgICAgICBzaXplX3QgYWxpZ24pCit7CisJaW50IG5pZCA9IGVhcmx5X2NwdV90b19ub2RlKGNwdSk7CisKKwlyZXR1cm4gIG1lbWJsb2NrX3ZpcnRfYWxsb2NfdHJ5X25pZChzaXplLCBhbGlnbiwKKwkJCV9fcGEoTUFYX0RNQV9BRERSRVNTKSwgTUVNQkxPQ0tfQUxMT0NfQUNDRVNTSUJMRSwgbmlkKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBjcHVfZmNfZnJlZSh2b2lkICpwdHIsIHNpemVfdCBzaXplKQoreworCW1lbWJsb2NrX2ZyZWVfZWFybHkoX19wYShwdHIpLCBzaXplKTsKK30KKwordm9pZCBfX2luaXQgc2V0dXBfcGVyX2NwdV9hcmVhcyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZGVsdGE7CisJdW5zaWduZWQgaW50IGNwdTsKKwlpbnQgcmM7CisKKwkvKgorCSAqIEFsd2F5cyByZXNlcnZlIGFyZWEgZm9yIG1vZHVsZSBwZXJjcHUgdmFyaWFibGVzLiAgVGhhdCdzCisJICogd2hhdCB0aGUgbGVnYWN5IGFsbG9jYXRvciBkaWQuCisJICovCisJcmMgPSBwY3B1X2VtYmVkX2ZpcnN0X2NodW5rKFBFUkNQVV9NT0RVTEVfUkVTRVJWRSwKKwkJCQkgICAgUEVSQ1BVX0RZTkFNSUNfUkVTRVJWRSwgUEFHRV9TSVpFLAorCQkJCSAgICBwY3B1X2NwdV9kaXN0YW5jZSwKKwkJCQkgICAgcGNwdV9mY19hbGxvYywgcGNwdV9mY19mcmVlKTsKKwlpZiAocmMgPCAwKQorCQlwYW5pYygiRmFpbGVkIHRvIGluaXRpYWxpemUgcGVyY3B1IGFyZWFzLiIpOworCisJZGVsdGEgPSAodW5zaWduZWQgbG9uZylwY3B1X2Jhc2VfYWRkciAtICh1bnNpZ25lZCBsb25nKV9fcGVyX2NwdV9zdGFydDsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQorCQlfX3Blcl9jcHVfb2Zmc2V0W2NwdV0gPSBkZWx0YSArIHBjcHVfdW5pdF9vZmZzZXRzW2NwdV07Cit9CisjZW5kaWYKKwogLyoqCiAgKiBudW1hX2FkZF9tZW1ibGsgLSBTZXQgbm9kZSBpZCB0byBtZW1ibGsKICAqIEBuaWQ6IE5VTUEgbm9kZSBJRCBvZiB0aGUgbmV3IG1lbWJsawpAQCAtMTQzLDEzICsyMDIsMTMgQEAKIAogCXJldCA9IG1lbWJsb2NrX3NldF9ub2RlKHN0YXJ0LCAoZW5kIC0gc3RhcnQpLCAmbWVtYmxvY2subWVtb3J5LCBuaWQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiTlVNQTogbWVtYmxvY2sgWzB4JWxseCAtIDB4JWxseF0gZmFpbGVkIHRvIGFkZCBvbiBub2RlICVkXG4iLAorCQlwcl9lcnIoIm1lbWJsb2NrIFsweCVsbHggLSAweCVsbHhdIGZhaWxlZCB0byBhZGQgb24gbm9kZSAlZFxuIiwKIAkJCXN0YXJ0LCAoZW5kIC0gMSksIG5pZCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJbm9kZV9zZXQobmlkLCBudW1hX25vZGVzX3BhcnNlZCk7Ci0JcHJfaW5mbygiTlVNQTogQWRkaW5nIG1lbWJsb2NrIFsweCVsbHggLSAweCVsbHhdIG9uIG5vZGUgJWRcbiIsCisJcHJfaW5mbygiQWRkaW5nIG1lbWJsb2NrIFsweCVsbHggLSAweCVsbHhdIG9uIG5vZGUgJWRcbiIsCiAJCQlzdGFydCwgKGVuZCAtIDEpLCBuaWQpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xNjQsMTkgKzIyMywxOCBAQAogCXZvaWQgKm5kOwogCWludCB0bmlkOwogCi0JcHJfaW5mbygiTlVNQTogSW5pdG1lbSBzZXR1cCBub2RlICVkIFttZW0gJSMwMTBMeC0lIzAxMEx4XVxuIiwKLQkJCW5pZCwgc3RhcnRfcGZuIDw8IFBBR0VfU0hJRlQsCi0JCQkoZW5kX3BmbiA8PCBQQUdFX1NISUZUKSAtIDEpOworCXByX2luZm8oIkluaXRtZW0gc2V0dXAgbm9kZSAlZCBbbWVtICUjMDEwTHgtJSMwMTBMeF1cbiIsCisJCW5pZCwgc3RhcnRfcGZuIDw8IFBBR0VfU0hJRlQsIChlbmRfcGZuIDw8IFBBR0VfU0hJRlQpIC0gMSk7CiAKIAluZF9wYSA9IG1lbWJsb2NrX2FsbG9jX3RyeV9uaWQobmRfc2l6ZSwgU01QX0NBQ0hFX0JZVEVTLCBuaWQpOwogCW5kID0gX192YShuZF9wYSk7CiAKIAkvKiByZXBvcnQgYW5kIGluaXRpYWxpemUgKi8KLQlwcl9pbmZvKCJOVU1BOiBOT0RFX0RBVEEgW21lbSAlIzAxMEx4LSUjMDEwTHhdXG4iLAorCXByX2luZm8oIk5PREVfREFUQSBbbWVtICUjMDEwTHgtJSMwMTBMeF1cbiIsCiAJCW5kX3BhLCBuZF9wYSArIG5kX3NpemUgLSAxKTsKIAl0bmlkID0gZWFybHlfcGZuX3RvX25pZChuZF9wYSA+PiBQQUdFX1NISUZUKTsKIAlpZiAodG5pZCAhPSBuaWQpCi0JCXByX2luZm8oIk5VTUE6IE5PREVfREFUQSglZCkgb24gbm9kZSAlZFxuIiwgbmlkLCB0bmlkKTsKKwkJcHJfaW5mbygiTk9ERV9EQVRBKCVkKSBvbiBub2RlICVkXG4iLCBuaWQsIHRuaWQpOwogCiAJbm9kZV9kYXRhW25pZF0gPSBuZDsKIAltZW1zZXQoTk9ERV9EQVRBKG5pZCksIDAsIHNpemVvZihwZ19kYXRhX3QpKTsKQEAgLTIzMyw4ICsyOTEsNyBAQAogCQkJbnVtYV9kaXN0YW5jZVtpICogbnVtYV9kaXN0YW5jZV9jbnQgKyBqXSA9IGkgPT0gaiA/CiAJCQkJTE9DQUxfRElTVEFOQ0UgOiBSRU1PVEVfRElTVEFOQ0U7CiAKLQlwcl9kZWJ1ZygiTlVNQTogSW5pdGlhbGl6ZWQgZGlzdGFuY2UgdGFibGUsIGNudD0lZFxuIiwKLQkJCW51bWFfZGlzdGFuY2VfY250KTsKKwlwcl9kZWJ1ZygiSW5pdGlhbGl6ZWQgZGlzdGFuY2UgdGFibGUsIGNudD0lZFxuIiwgbnVtYV9kaXN0YW5jZV9jbnQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNTUsMjAgKzMxMiwyMCBAQAogdm9pZCBfX2luaXQgbnVtYV9zZXRfZGlzdGFuY2UoaW50IGZyb20sIGludCB0bywgaW50IGRpc3RhbmNlKQogewogCWlmICghbnVtYV9kaXN0YW5jZSkgewotCQlwcl93YXJuX29uY2UoIk5VTUE6IFdhcm5pbmc6IGRpc3RhbmNlIHRhYmxlIG5vdCBhbGxvY2F0ZWQgeWV0XG4iKTsKKwkJcHJfd2Fybl9vbmNlKCJXYXJuaW5nOiBkaXN0YW5jZSB0YWJsZSBub3QgYWxsb2NhdGVkIHlldFxuIik7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAoZnJvbSA+PSBudW1hX2Rpc3RhbmNlX2NudCB8fCB0byA+PSBudW1hX2Rpc3RhbmNlX2NudCB8fAogCQkJZnJvbSA8IDAgfHwgdG8gPCAwKSB7Ci0JCXByX3dhcm5fb25jZSgiTlVNQTogV2FybmluZzogbm9kZSBpZHMgYXJlIG91dCBvZiBib3VuZCwgZnJvbT0lZCB0bz0lZCBkaXN0YW5jZT0lZFxuIiwKKwkJcHJfd2Fybl9vbmNlKCJXYXJuaW5nOiBub2RlIGlkcyBhcmUgb3V0IG9mIGJvdW5kLCBmcm9tPSVkIHRvPSVkIGRpc3RhbmNlPSVkXG4iLAogCQkJICAgIGZyb20sIHRvLCBkaXN0YW5jZSk7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAoKHU4KWRpc3RhbmNlICE9IGRpc3RhbmNlIHx8CiAJICAgIChmcm9tID09IHRvICYmIGRpc3RhbmNlICE9IExPQ0FMX0RJU1RBTkNFKSkgewotCQlwcl93YXJuX29uY2UoIk5VTUE6IFdhcm5pbmc6IGludmFsaWQgZGlzdGFuY2UgcGFyYW1ldGVyLCBmcm9tPSVkIHRvPSVkIGRpc3RhbmNlPSVkXG4iLAorCQlwcl93YXJuX29uY2UoIldhcm5pbmc6IGludmFsaWQgZGlzdGFuY2UgcGFyYW1ldGVyLCBmcm9tPSVkIHRvPSVkIGRpc3RhbmNlPSVkXG4iLAogCQkJICAgICBmcm9tLCB0bywgZGlzdGFuY2UpOwogCQlyZXR1cm47CiAJfQpAQCAtMjk1LDcgKzM1Miw3IEBACiAJLyogQ2hlY2sgdGhhdCB2YWxpZCBuaWQgaXMgc2V0IHRvIG1lbWJsa3MgKi8KIAlmb3JfZWFjaF9tZW1ibG9jayhtZW1vcnksIG1ibGspCiAJCWlmIChtYmxrLT5uaWQgPT0gTlVNQV9OT19OT0RFIHx8IG1ibGstPm5pZCA+PSBNQVhfTlVNTk9ERVMpIHsKLQkJCXByX3dhcm4oIk5VTUE6IFdhcm5pbmc6IGludmFsaWQgbWVtYmxrIG5vZGUgJWQgW21lbSAlIzAxMEx4LSUjMDEwTHhdXG4iLAorCQkJcHJfd2FybigiV2FybmluZzogaW52YWxpZCBtZW1ibGsgbm9kZSAlZCBbbWVtICUjMDEwTHgtJSMwMTBMeF1cbiIsCiAJCQkJbWJsay0+bmlkLCBtYmxrLT5iYXNlLAogCQkJCW1ibGstPmJhc2UgKyBtYmxrLT5zaXplIC0gMSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMzMyw4ICszOTAsMTAgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChub2Rlc19lbXB0eShudW1hX25vZGVzX3BhcnNlZCkpCisJaWYgKG5vZGVzX2VtcHR5KG51bWFfbm9kZXNfcGFyc2VkKSkgeworCQlwcl9pbmZvKCJObyBOVU1BIGNvbmZpZ3VyYXRpb24gZm91bmRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlyZXQgPSBudW1hX3JlZ2lzdGVyX25vZGVzKCk7CiAJaWYgKHJldCA8IDApCkBAIC0zNDIsMTAgKzQwMSw2IEBACiAKIAlzZXR1cF9ub2RlX3RvX2NwdW1hc2tfbWFwKCk7CiAKLQkvKiBpbml0IGJvb3QgcHJvY2Vzc29yICovCi0JY3B1X3RvX25vZGVfbWFwWzBdID0gMDsKLQltYXBfY3B1X3RvX25vZGUoMCwgMCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzY1LDEwICs0MjAsOCBAQAogCiAJaWYgKG51bWFfb2ZmKQogCQlwcl9pbmZvKCJOVU1BIGRpc2FibGVkXG4iKTsgLyogRm9yY2VkIG9mZiBvbiBjb21tYW5kIGxpbmUuICovCi0JZWxzZQotCQlwcl9pbmZvKCJObyBOVU1BIGNvbmZpZ3VyYXRpb24gZm91bmRcbiIpOwotCXByX2luZm8oIk5VTUE6IEZha2luZyBhIG5vZGUgYXQgW21lbSAlIzAxOEx4LSUjMDE4THhdXG4iLAotCSAgICAgICAwTExVLCBQRk5fUEhZUyhtYXhfcGZuKSAtIDEpOworCXByX2luZm8oIkZha2luZyBhIG5vZGUgYXQgW21lbSAlIzAxOEx4LSUjMDE4THhdXG4iLAorCQkwTExVLCBQRk5fUEhZUyhtYXhfcGZuKSAtIDEpOwogCiAJZm9yX2VhY2hfbWVtYmxvY2sobWVtb3J5LCBtYmxrKSB7CiAJCXJldCA9IG51bWFfYWRkX21lbWJsaygwLCBtYmxrLT5iYXNlLCBtYmxrLT5iYXNlICsgbWJsay0+c2l6ZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL3BhZ2VhdHRyLmMgYi9hcmNoL2FybTY0L21tL3BhZ2VhdHRyLmMKaW5kZXggY2E2ZDI2OC4uOGRlZjU1ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9wYWdlYXR0ci5jCisrKyBiL2FyY2gvYXJtNjQvbW0vcGFnZWF0dHIuYwpAQCAtMTM5LDQgKzEzOSw0MyBAQAogCQkJCQlfX3BncHJvdCgwKSwKIAkJCQkJX19wZ3Byb3QoUFRFX1ZBTElEKSk7CiB9Ci0jZW5kaWYKKyNpZmRlZiBDT05GSUdfSElCRVJOQVRJT04KKy8qCisgKiBXaGVuIGJ1aWx0IHdpdGggQ09ORklHX0RFQlVHX1BBR0VBTExPQyBhbmQgQ09ORklHX0hJQkVSTkFUSU9OLCB0aGlzIGZ1bmN0aW9uCisgKiBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIGxpbmVhciBtYXAgcGFnZSBoYXMgYmVlbiBtYXJrZWQgYXMgbm90LXZhbGlkIGJ5CisgKiBDT05GSUdfREVCVUdfUEFHRUFMTE9DLiBXYWxrIHRoZSBwYWdlIHRhYmxlIGFuZCBjaGVjayB0aGUgUFRFX1ZBTElEIGJpdC4KKyAqIFRoaXMgaXMgYmFzZWQgb24ga2Vybl9hZGRyX3ZhbGlkKCksIHdoaWNoIGFsbW9zdCBkb2VzIHdoYXQgd2UgbmVlZC4KKyAqCisgKiBCZWNhdXNlIHRoaXMgaXMgb25seSBjYWxsZWQgb24gdGhlIGtlcm5lbCBsaW5lYXIgbWFwLCAgcD9kX3NlY3QoKSBpbXBsaWVzCisgKiBwP2RfcHJlc2VudCgpLiBXaGVuIGRlYnVnX3BhZ2VhbGxvYyBpcyBlbmFibGVkLCBzZWN0aW9ucyBtYXBwaW5ncyBhcmUKKyAqIGRpc2FibGVkLgorICovCitib29sIGtlcm5lbF9wYWdlX3ByZXNlbnQoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcGdkX3QgKnBnZDsKKwlwdWRfdCAqcHVkOworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZTsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7CisKKwlwZ2QgPSBwZ2Rfb2Zmc2V0X2soYWRkcik7CisJaWYgKHBnZF9ub25lKCpwZ2QpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcik7CisJaWYgKHB1ZF9ub25lKCpwdWQpKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKHB1ZF9zZWN0KCpwdWQpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyKTsKKwlpZiAocG1kX25vbmUoKnBtZCkpCisJCXJldHVybiBmYWxzZTsKKwlpZiAocG1kX3NlY3QoKnBtZCkpCisJCXJldHVybiB0cnVlOworCisJcHRlID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCBhZGRyKTsKKwlyZXR1cm4gcHRlX3ZhbGlkKCpwdGUpOworfQorI2VuZGlmIC8qIENPTkZJR19ISUJFUk5BVElPTiAqLworI2VuZGlmIC8qIENPTkZJR19ERUJVR19QQUdFQUxMT0MgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vcGdkLmMgYi9hcmNoL2FybTY0L21tL3BnZC5jCmluZGV4IGFlMTFkNGUuLjM3MWM1ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvbW0vcGdkLmMKKysrIGIvYXJjaC9hcm02NC9tbS9wZ2QuYwpAQCAtMjYsOCArMjYsNiBAQAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKLSNpbmNsdWRlICJtbS5oIgotCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnBnZF9jYWNoZTsKIAogcGdkX3QgKnBnZF9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vcHJvYy5TIGIvYXJjaC9hcm02NC9tbS9wcm9jLlMKaW5kZXggNWJiNjFkZS4uMzUyYzczYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9wcm9jLlMKKysrIGIvYXJjaC9hcm02NC9tbS9wcm9jLlMKQEAgLTgzLDYgKzgzLDcgQEAKICAqCiAgKiB4MDogQWRkcmVzcyBvZiBjb250ZXh0IHBvaW50ZXIKICAqLworCS5wdXNoc2VjdGlvbiAiLmlkbWFwLnRleHQiLCAiYXgiCiBFTlRSWShjcHVfZG9fcmVzdW1lKQogCWxkcAl4MiwgeDMsIFt4MF0KIAlsZHAJeDQsIHg1LCBbeDAsICMxNl0KQEAgLTEwMCw3ICsxMDEsMTYgQEAKIAogCW1zcgl0Y3JfZWwxLCB4OAogCW1zcgl2YmFyX2VsMSwgeDkKKworCS8qCisJICogX19jcHVfc2V0dXAoKSBjbGVhcmVkIE1EU0NSX0VMMS5NREUgYW5kIGZyaWVuZHMsIGJlZm9yZSB1bm1hc2tpbmcKKwkgKiBkZWJ1ZyBleGNlcHRpb25zLiBCeSByZXN0b3JpbmcgTURTQ1JfRUwxIGhlcmUsIHdlIG1heSB0YWtlIGEgZGVidWcKKwkgKiBleGNlcHRpb24uIE1hc2sgdGhlbSB1bnRpbCBsb2NhbF9kYmdfcmVzdG9yZSgpIGluIGNwdV9zdXNwZW5kKCkKKwkgKiByZXNldHMgdGhlbS4KKwkgKi8KKwlkaXNhYmxlX2RiZwogCW1zcgltZHNjcl9lbDEsIHgxMAorCiAJbXNyCXNjdGxyX2VsMSwgeDEyCiAJLyoKIAkgKiBSZXN0b3JlIG9zbHNyX2VsMSBieSB3cml0aW5nIG9zbGFyX2VsMQpAQCAtMTExLDYgKzEyMSw3IEBACiAJaXNiCiAJcmV0CiBFTkRQUk9DKGNwdV9kb19yZXN1bWUpCisJLnBvcHNlY3Rpb24KICNlbmRpZgogCiAvKgpAQCAtMTI1LDE3ICsxMzYsMTIgQEAKIAliZmkJeDAsIHgxLCAjNDgsICMxNgkJLy8gc2V0IHRoZSBBU0lECiAJbXNyCXR0YnIwX2VsMSwgeDAJCQkvLyBzZXQgVFRCUjAKIAlpc2IKLWFsdGVybmF0aXZlX2lmX25vdCBBUk02NF9XT1JLQVJPVU5EX0NBVklVTV8yNzQ1NgotCXJldAotCW5vcAotCW5vcAotCW5vcAotYWx0ZXJuYXRpdmVfZWxzZQorYWx0ZXJuYXRpdmVfaWYgQVJNNjRfV09SS0FST1VORF9DQVZJVU1fMjc0NTYKIAlpYwlpYWxsdQogCWRzYgluc2gKIAlpc2IKK2FsdGVybmF0aXZlX2Vsc2Vfbm9wX2VuZGlmCiAJcmV0Ci1hbHRlcm5hdGl2ZV9lbmRpZgogRU5EUFJPQyhjcHVfZG9fc3dpdGNoX21tKQogCiAJLnB1c2hzZWN0aW9uICIuaWRtYXAudGV4dCIsICJheCIKQEAgLTE3Miw2ICsxNzgsNyBAQAogICoJSW5pdGlhbGlzZSB0aGUgcHJvY2Vzc29yIGZvciB0dXJuaW5nIHRoZSBNTVUgb24uICBSZXR1cm4gaW4geDAgdGhlCiAgKgl2YWx1ZSBvZiB0aGUgU0NUTFJfRUwxIHJlZ2lzdGVyLgogICovCisJLnB1c2hzZWN0aW9uICIuaWRtYXAudGV4dCIsICJheCIKIEVOVFJZKF9fY3B1X3NldHVwKQogCXRsYmkJdm1hbGxlMQkJCQkvLyBJbnZhbGlkYXRlIGxvY2FsIFRMQgogCWRzYgluc2gKQEAgLTI1NywzICsyNjQsNCBAQAogY3J2YWw6CiAJLndvcmQJMHhmY2ZmZmZmZgkJCS8vIGNsZWFyCiAJLndvcmQJMHgzNGQ1ZDkxZAkJCS8vIHNldAorCS5wb3BzZWN0aW9uCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDY4Y2Y2MzguLmIxZWMxZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC03NCw3ICs3NCw3IEBACiAKIGV4dGVybiBfX2tlcm5lbF9zaXplX3QgY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwKIAkJCQkgICAgX19rZXJuZWxfc2l6ZV90IG4pOwotZXh0ZXJuIF9fa2VybmVsX3NpemVfdCBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sCitleHRlcm4gX19rZXJuZWxfc2l6ZV90IF9fX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwKIAkJCQkgICAgICBfX2tlcm5lbF9zaXplX3Qgbik7CiAKIHN0YXRpYyBpbmxpbmUgX19rZXJuZWxfc2l6ZV90IF9fY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwKQEAgLTg4LDYgKzg4LDE1IEBACiB7CiAJcmV0dXJuIF9fY29weV91c2VyKHRvLCAoY29uc3Qgdm9pZCBfX2ZvcmNlICopZnJvbSwgbik7CiB9CitzdGF0aWMgaW5saW5lIF9fa2VybmVsX3NpemVfdCBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywKKwkJCQkJICAgICAgIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLAorCQkJCQkgICAgICAgX19rZXJuZWxfc2l6ZV90IG4pCit7CisJc2l6ZV90IHJlcyA9IF9fX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKKwlpZiAodW5saWtlbHkocmVzKSkKKwkJbWVtc2V0KHRvICsgKG4gLSByZXMpLCAwLCByZXMpOworCXJldHVybiByZXM7Cit9CiAKICNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWMgX19jb3B5X3RvX3VzZXIKICNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyBfX2NvcHlfZnJvbV91c2VyCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9hdnIzMl9rc3ltcy5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvYXZyMzJfa3N5bXMuYwppbmRleCBkOTNlYWQwLi43YzZjZjE0IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9hdnIzMl9rc3ltcy5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL2F2cjMyX2tzeW1zLmMKQEAgLTM2LDcgKzM2LDcgQEAKIC8qCiAgKiBVc2Vyc3BhY2UgYWNjZXNzIHN0dWZmLgogICovCi1FWFBPUlRfU1lNQk9MKGNvcHlfZnJvbV91c2VyKTsKK0VYUE9SVF9TWU1CT0woX19fY29weV9mcm9tX3VzZXIpOwogRVhQT1JUX1NZTUJPTChjb3B5X3RvX3VzZXIpOwogRVhQT1JUX1NZTUJPTChfX2NvcHlfdXNlcik7CiBFWFBPUlRfU1lNQk9MKHN0cm5jcHlfZnJvbV91c2VyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbGliL2NvcHlfdXNlci5TIGIvYXJjaC9hdnIzMi9saWIvY29weV91c2VyLlMKaW5kZXggZWE1OWMwNC4uMDc1MzczNCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9saWIvY29weV91c2VyLlMKKysrIGIvYXJjaC9hdnIzMi9saWIvY29weV91c2VyLlMKQEAgLTIzLDEzICsyMywxMyBAQAogCSAqLwogCS50ZXh0CiAJLmFsaWduCTEKLQkuZ2xvYmFsCWNvcHlfZnJvbV91c2VyCi0JLnR5cGUJY29weV9mcm9tX3VzZXIsIEBmdW5jdGlvbgotY29weV9mcm9tX3VzZXI6CisJLmdsb2JhbAlfX19jb3B5X2Zyb21fdXNlcgorCS50eXBlCV9fX2NvcHlfZnJvbV91c2VyLCBAZnVuY3Rpb24KK19fX2NvcHlfZnJvbV91c2VyOgogCWJyYW5jaF9pZl9rZXJuZWwgcjgsIF9fY29weV91c2VyCiAJcmV0X2lmX3ByaXZpbGVnZWQgcjgsIHIxMSwgcjEwLCByMTAKIAlyam1wCV9fY29weV91c2VyCi0JLnNpemUJY29weV9mcm9tX3VzZXIsIC4gLSBjb3B5X2Zyb21fdXNlcgorCS5zaXplCV9fX2NvcHlfZnJvbV91c2VyLCAuIC0gX19fY29weV9mcm9tX3VzZXIKIAogCS5nbG9iYWwJY29weV90b191c2VyCiAJLnR5cGUJY29weV90b191c2VyLCBAZnVuY3Rpb24KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vS2NvbmZpZyBiL2FyY2gvYmxhY2tmaW4vS2NvbmZpZwppbmRleCAyOGM2M2ZlLi4zYzFiZDY0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL0tjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9LY29uZmlnCkBAIC0yNiw3ICsyNiw3IEBACiAJc2VsZWN0IEhBVkVfT1BST0ZJTEUKIAlzZWxlY3QgSEFWRV9QRVJGX0VWRU5UUwogCXNlbGVjdCBBUkNIX0hBVkVfQ1VTVE9NX0dQSU9fSAotCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgorCXNlbGVjdCBHUElPTElCCiAJc2VsZWN0IEhBVkVfVUlEMTYKIAlzZWxlY3QgSEFWRV9VTkRFUlNDT1JFX1NZTUJPTF9QUkVGSVgKIAlzZWxlY3QgVklSVF9UT19CVVMKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggMTJmNWQ2OC4uMGEyYTcwMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTE3MSwxMSArMTcxLDEyIEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCiBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKLQlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkKKwlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpKSB7CiAJCW1lbWNweSh0bywgKGNvbnN0IHZvaWQgX19mb3JjZSAqKWZyb20sIG4pOwotCWVsc2UKLQkJcmV0dXJuIG47Ci0JcmV0dXJuIDA7CisJCXJldHVybiAwOworCX0KKwltZW1zZXQodG8sIDAsIG4pOworCXJldHVybiBuOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9mdHJhY2UtZW50cnkuUyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2Z0cmFjZS1lbnRyeS5TCmluZGV4IDI4ZDA1OTUuLjNiOGJkY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2Z0cmFjZS1lbnRyeS5TCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2Z0cmFjZS1lbnRyeS5TCkBAIC0xNjksNyArMTY5LDcgQEAKIAlyMCA9IHNwOwkvKiB1bnNpZ25lZCBsb25nICpwYXJlbnQgKi8KIAlyMSA9IFtzcF07CS8qIHVuc2lnbmVkIGxvbmcgc2VsZl9hZGRyICovCiAjIGVuZGlmCi0jIGlmZGVmIENPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1QKKyMgaWZkZWYgSEFWRV9GVU5DVElPTl9HUkFQSF9GUF9URVNUCiAJcjIgPSBmcDsJLyogdW5zaWduZWQgbG9uZyBmcmFtZV9wb2ludGVyICovCiAjIGVuZGlmCiAJcjAgKz0gMTY7CS8qIHNraXAgdGhlIDQgbG9jYWwgcmVncyBvbiBzdGFjayAqLwpAQCAtMTkwLDcgKzE5MCw3IEBACiAJWy0tc3BdID0gcjE7CiAKIAkvKiBnZXQgb3JpZ2luYWwgcmV0dXJuIGFkZHJlc3MgKi8KLSMgaWZkZWYgQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVAorIyBpZmRlZiBIQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1QKIAlyMCA9IGZwOwkvKiBCbGFja2ZpbiBpcyBzYW5lLCBzbyBvbWl0IHRoaXMgKi8KICMgZW5kaWYKIAljYWxsIF9mdHJhY2VfcmV0dXJuX3RvX2hhbmRsZXI7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2Z0cmFjZS5jCmluZGV4IDA5NWRlMGYuLjhkYWQ3NTggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2Z0cmFjZS5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2Z0cmFjZS5jCkBAIC0xMDcsNyArMTA3LDcgQEAKIAkJcmV0dXJuOwogCiAJaWYgKGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZSgqcGFyZW50LCBzZWxmX2FkZHIsICZ0cmFjZS5kZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3BvaW50ZXIpID09IC1FQlVTWSkKKwkJCQkgICAgIGZyYW1lX3BvaW50ZXIsIE5VTEwpID09IC1FQlVTWSkKIAkJcmV0dXJuOwogCiAJdHJhY2UuZnVuYyA9IHNlbGZfYWRkcjsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYwppbmRleCBjNmRiNTJiLi4xMGM1Nzc3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2NtX2JmNTYxLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9jbV9iZjU2MS5jCkBAIC0xNDYsNyArMTQ2LDggQEAKICNpbmNsdWRlIDxsaW51eC9zbWM5MXguaD4KIAogc3RhdGljIHN0cnVjdCBzbWM5MXhfcGxhdGRhdGEgc21jOTF4X2luZm8gPSB7Ci0JLmZsYWdzID0gU01DOTFYX1VTRV8zMkJJVCB8IFNNQzkxWF9OT1dBSVQsCisJLmZsYWdzID0gU01DOTFYX1VTRV84QklUIHwgU01DOTFYX1VTRV8xNkJJVCB8IFNNQzkxWF9VU0VfMzJCSVQgfAorCQkgU01DOTFYX05PV0FJVCwKIAkubGVkYSA9IFJQQ19MRURfMTAwXzEwLAogCS5sZWRiID0gUlBDX0xFRF9UWF9SWCwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2V6a2l0LmMKaW5kZXggZjM1NTI1Yi4uNTdkMWM0MyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZXpraXQuYwpAQCAtMTM0LDcgKzEzNCw4IEBACiAjaW5jbHVkZSA8bGludXgvc21jOTF4Lmg+CiAKIHN0YXRpYyBzdHJ1Y3Qgc21jOTF4X3BsYXRkYXRhIHNtYzkxeF9pbmZvID0gewotCS5mbGFncyA9IFNNQzkxWF9VU0VfMzJCSVQgfCBTTUM5MVhfTk9XQUlULAorCS5mbGFncyA9IFNNQzkxWF9VU0VfOEJJVCB8IFNNQzkxWF9VU0VfMTZCSVQgfCBTTUM5MVhfVVNFXzMyQklUIHwKKwkJIFNNQzkxWF9OT1dBSVQsCiAJLmxlZGEgPSBSUENfTEVEXzEwMF8xMCwKIAkubGVkYiA9IFJQQ19MRURfVFhfUlgsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2NvcmViLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvY29yZWIuYwppbmRleCA3OGVjYjUwLi44YTI1NDNjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvY29yZWIuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvY29yZWIuYwpAQCAtNTksMTggKzU5LDcgQEAKIAkubmFtZSAgPSAiY29yZWIiLAogCS5mb3BzICA9ICZjb3JlYl9mb3BzLAogfTsKLQotc3RhdGljIGludCBfX2luaXQgYmY1NjFfY29yZWJfaW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZjb3JlYl9kZXYpOwotfQotbW9kdWxlX2luaXQoYmY1NjFfY29yZWJfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBiZjU2MV9jb3JlYl9leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZjb3JlYl9kZXYpOwotfQotbW9kdWxlX2V4aXQoYmY1NjFfY29yZWJfZXhpdCk7Cittb2R1bGVfbWlzY19kZXZpY2UoY29yZWJfZGV2KTsKIAogTU9EVUxFX0FVVEhPUigiQmFzIFZlcm1ldWxlbiA8YnZlcm1ldWxAYmxhY2tzdGFyLnhzNGFsbC5ubD4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQkY1NjEgQ29yZSBCIFN1cHBvcnQiKTsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IGUzNTMwZDAuLjU2YzdkNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMTk0LDMwICsxOTQsNiBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19jb3B5X3VzZXJfemVyb2luZyh2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBfX2RvX2NsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIG4pOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLV9fZ2VuZXJpY19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCi17Ci0JaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHRvLCBuKSkKLQkJcmV0dXJuIF9fY29weV91c2VyKHRvLCBmcm9tLCBuKTsKLQlyZXR1cm4gbjsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1fX2dlbmVyaWNfY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCi17Ci0JaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpCi0JCXJldHVybiBfX2NvcHlfdXNlcl96ZXJvaW5nKHRvLCBmcm9tLCBuKTsKLQlyZXR1cm4gbjsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1fX2dlbmVyaWNfY2xlYXJfdXNlcih2b2lkIF9fdXNlciAqdG8sIHVuc2lnbmVkIGxvbmcgbikKLXsKLQlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgdG8sIG4pKQotCQlyZXR1cm4gX19kb19jbGVhcl91c2VyKHRvLCBuKTsKLQlyZXR1cm4gbjsKLX0KLQogc3RhdGljIGlubGluZSBsb25nCiBfX3N0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgbG9uZyBjb3VudCkKIHsKQEAgLTI4Miw3ICsyNTgsNyBAQAogCWVsc2UgaWYgKG4gPT0gMjQpCiAJCV9fYXNtX2NvcHlfZnJvbV91c2VyXzI0KHRvLCBmcm9tLCByZXQpOwogCWVsc2UKLQkJcmV0ID0gX19nZW5lcmljX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKKwkJcmV0ID0gX19jb3B5X3VzZXJfemVyb2luZyh0bywgZnJvbSwgbik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzMzLDcgKzMwOSw3IEBACiAJZWxzZSBpZiAobiA9PSAyNCkKIAkJX19hc21fY29weV90b191c2VyXzI0KHRvLCBmcm9tLCByZXQpOwogCWVsc2UKLQkJcmV0ID0gX19nZW5lcmljX2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbik7CisJCXJldCA9IF9fY29weV91c2VyKHRvLCBmcm9tLCBuKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0zNjYsMjYgKzM0Miw0MyBAQAogCWVsc2UgaWYgKG4gPT0gMjQpCiAJCV9fYXNtX2NsZWFyXzI0KHRvLCByZXQpOwogCWVsc2UKLQkJcmV0ID0gX19nZW5lcmljX2NsZWFyX3VzZXIodG8sIG4pOworCQlyZXQgPSBfX2RvX2NsZWFyX3VzZXIodG8sIG4pOwogCiAJcmV0dXJuIHJldDsKIH0KIAogCi0jZGVmaW5lIGNsZWFyX3VzZXIodG8sIG4pCQkJCVwKLQkoX19idWlsdGluX2NvbnN0YW50X3AobikgPwkJCVwKLQkgX19jb25zdGFudF9jbGVhcl91c2VyKHRvLCBuKSA6CQkJXAotCSBfX2dlbmVyaWNfY2xlYXJfdXNlcih0bywgbikpCitzdGF0aWMgaW5saW5lIHNpemVfdCBjbGVhcl91c2VyKHZvaWQgX191c2VyICp0bywgc2l6ZV90IG4pCit7CisJaWYgKHVubGlrZWx5KCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbikpKQorCQlyZXR1cm4gbjsKKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3AobikpCisJCXJldHVybiBfX2NvbnN0YW50X2NsZWFyX3VzZXIodG8sIG4pOworCWVsc2UKKwkJcmV0dXJuIF9fZG9fY2xlYXJfdXNlcih0bywgbik7Cit9CiAKLSNkZWZpbmUgY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pCQkJXAotCShfX2J1aWx0aW5fY29uc3RhbnRfcChuKSA/CQkJXAotCSBfX2NvbnN0YW50X2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKSA6CVwKLQkgX19nZW5lcmljX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKSkKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgc2l6ZV90IG4pCit7CisJaWYgKHVubGlrZWx5KCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKSkgeworCQltZW1zZXQodG8sIDAsIG4pOworCQlyZXR1cm4gbjsKKwl9CisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQorCQlyZXR1cm4gX19jb25zdGFudF9jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbik7CisJZWxzZQorCQlyZXR1cm4gX19jb3B5X3VzZXJfemVyb2luZyh0bywgZnJvbSwgbik7Cit9CiAKLSNkZWZpbmUgY29weV90b191c2VyKHRvLCBmcm9tLCBuKQkJCVwKLQkoX19idWlsdGluX2NvbnN0YW50X3AobikgPwkJCVwKLQkgX19jb25zdGFudF9jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pIDoJCVwKLQkgX19nZW5lcmljX2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbikpCitzdGF0aWMgaW5saW5lIHNpemVfdCBjb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBzaXplX3QgbikKK3sKKwlpZiAodW5saWtlbHkoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHRvLCBuKSkpCisJCXJldHVybiBuOworCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKKwkJcmV0dXJuIF9fY29uc3RhbnRfY29weV90b191c2VyKHRvLCBmcm9tLCBuKTsKKwllbHNlCisJCXJldHVybiBfX2NvcHlfdXNlcih0bywgZnJvbSwgbik7Cit9CiAKIC8qIFdlIGxldCB0aGUgX18gdmVyc2lvbnMgb2YgY29weV9mcm9tL3RvX3VzZXIgaW5saW5lLCBiZWNhdXNlIHRoZXkncmUgb2Z0ZW4KICAqIHVzZWQgaW4gZmFzdCBwYXRocyBhbmQgaGF2ZSBvbmx5IGEgc21hbGwgc3BhY2Ugb3ZlcmhlYWQuCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL2Zydi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggM2FjOWE1OS4uODdkOWUzNCAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMjYzLDE5ICsyNjMsMjUgQEAKIGV4dGVybiBsb25nIF9fbWVtc2V0X3VzZXIodm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KTsKIGV4dGVybiBsb25nIF9fbWVtY3B5X3VzZXIodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpOwogCi0jZGVmaW5lIGNsZWFyX3VzZXIoZHN0LGNvdW50KQkJCV9fbWVtc2V0X3VzZXIoX19fX2ZvcmNlKGRzdCksIChjb3VudCkpCisjZGVmaW5lIF9fY2xlYXJfdXNlcihkc3QsY291bnQpCQkJX19tZW1zZXRfdXNlcihfX19fZm9yY2UoZHN0KSwgKGNvdW50KSkKICNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh0bywgZnJvbSwgbikJX19tZW1jcHlfdXNlcigodG8pLCBfX19fZm9yY2UoZnJvbSksIChuKSkKICNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pCV9fbWVtY3B5X3VzZXIoX19fX2ZvcmNlKHRvKSwgKGZyb20pLCAobikpCiAKICNlbHNlCiAKLSNkZWZpbmUgY2xlYXJfdXNlcihkc3QsY291bnQpCQkJKG1lbXNldChfX19fZm9yY2UoZHN0KSwgMCwgKGNvdW50KSksIDApCisjZGVmaW5lIF9fY2xlYXJfdXNlcihkc3QsY291bnQpCQkJKG1lbXNldChfX19fZm9yY2UoZHN0KSwgMCwgKGNvdW50KSksIDApCiAjZGVmaW5lIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pCShtZW1jcHkoKHRvKSwgX19fX2ZvcmNlKGZyb20pLCAobikpLCAwKQogI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyh0bywgZnJvbSwgbikJKG1lbWNweShfX19fZm9yY2UodG8pLCAoZnJvbSksIChuKSksIDApCiAKICNlbmRpZgogCi0jZGVmaW5lIF9fY2xlYXJfdXNlciBjbGVhcl91c2VyCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCitjbGVhcl91c2VyKHZvaWQgX191c2VyICp0bywgdW5zaWduZWQgbG9uZyBuKQoreworCWlmIChsaWtlbHkoX19hY2Nlc3Nfb2sodG8sIG4pKSkKKwkJbiA9IF9fY2xlYXJfdXNlcih0bywgbik7CisJcmV0dXJuIG47Cit9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKIF9fY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggZjAwMGEzOC4uZjYxY2ZiMiAxMDA2NDQKLS0tIGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0xMDMsNyArMTAzLDggQEAKIHsKIAlsb25nIHJlcyA9IF9fc3Rybmxlbl91c2VyKHNyYywgbik7CiAKLQkvKiByZXR1cm4gZnJvbSBzdHJubGVuIGNhbid0IGJlIHplcm8gLS0gdGhhdCB3b3VsZCBiZSBydWJiaXNoLiAqLworCWlmICh1bmxpa2VseSghcmVzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAocmVzID4gbikgewogCQljb3B5X2Zyb21fdXNlcihkc3QsIHNyYywgbik7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IDI5YmQ1OTcuLmM3MDI2NDIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC01Niw3ICs1Niw3IEBACiAjZGVmaW5lIGFsbG9jX3RocmVhZF9zdGFja19ub2RlKHRzaywgbm9kZSkJKCh1bnNpZ25lZCBsb25nICopIDApCiAjZGVmaW5lIHRhc2tfdGhyZWFkX2luZm8odHNrKQkoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSAwKQogI2VuZGlmCi0jZGVmaW5lIGZyZWVfdGhyZWFkX3N0YWNrKHRpKQkvKiBub3RoaW5nICovCisjZGVmaW5lIGZyZWVfdGhyZWFkX3N0YWNrKHRzaykJLyogbm90aGluZyAqLwogI2RlZmluZSB0YXNrX3N0YWNrX3BhZ2UodHNrKQkoKHZvaWQgKikodHNrKSkKIAogI2RlZmluZSBfX0hBVkVfVEhSRUFEX0ZVTkNUSU9OUwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggNDY1YzcwOS4uYmZlMTMxOSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0yNDEsOCArMjQxLDcgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwogX19jb3B5X3RvX3VzZXIgKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKGNvdW50KSkKLQkJY2hlY2tfb2JqZWN0X3NpemUoZnJvbSwgY291bnQsIHRydWUpOworCWNoZWNrX29iamVjdF9zaXplKGZyb20sIGNvdW50LCB0cnVlKTsKIAogCXJldHVybiBfX2NvcHlfdXNlcih0bywgKF9fZm9yY2Ugdm9pZCBfX3VzZXIgKikgZnJvbSwgY291bnQpOwogfQpAQCAtMjUwLDggKzI0OSw3IEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKIF9fY29weV9mcm9tX3VzZXIgKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKGNvdW50KSkKLQkJY2hlY2tfb2JqZWN0X3NpemUodG8sIGNvdW50LCBmYWxzZSk7CisJY2hlY2tfb2JqZWN0X3NpemUodG8sIGNvdW50LCBmYWxzZSk7CiAKIAlyZXR1cm4gX19jb3B5X3VzZXIoKF9fZm9yY2Ugdm9pZCBfX3VzZXIgKikgdG8sIGZyb20sIGNvdW50KTsKIH0KQEAgLTI2NSwyNyArMjYzLDIyIEBACiAJbG9uZyBfX2N1X2xlbiA9IChuKTsJCQkJCQkJCVwKIAkJCQkJCQkJCQkJXAogCWlmIChfX2FjY2Vzc19vayhfX2N1X3RvLCBfX2N1X2xlbiwgZ2V0X2ZzKCkpKSB7CQkJCQlcCi0JCWlmICghX19idWlsdGluX2NvbnN0YW50X3AobikpCQkJCQkJXAotCQkJY2hlY2tfb2JqZWN0X3NpemUoX19jdV9mcm9tLCBfX2N1X2xlbiwgdHJ1ZSk7CQkJXAorCQljaGVja19vYmplY3Rfc2l6ZShfX2N1X2Zyb20sIF9fY3VfbGVuLCB0cnVlKTsJCQlcCiAJCV9fY3VfbGVuID0gX19jb3B5X3VzZXIoX19jdV90bywgKF9fZm9yY2Ugdm9pZCBfX3VzZXIgKikgIF9fY3VfZnJvbSwgX19jdV9sZW4pOwlcCiAJfQkJCQkJCQkJCQlcCiAJX19jdV9sZW47CQkJCQkJCQkJXAogfSkKIAotI2RlZmluZSBjb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikJCQkJCQkJXAotKHsJCQkJCQkJCQkJCVwKLQl2b2lkICpfX2N1X3RvID0gKHRvKTsJCQkJCQkJCVwKLQljb25zdCB2b2lkIF9fdXNlciAqX19jdV9mcm9tID0gKGZyb20pOwkJCQkJCVwKLQlsb25nIF9fY3VfbGVuID0gKG4pOwkJCQkJCQkJXAotCQkJCQkJCQkJCQlcCi0JX19jaGtfdXNlcl9wdHIoX19jdV9mcm9tKTsJCQkJCQkJXAotCWlmIChfX2FjY2Vzc19vayhfX2N1X2Zyb20sIF9fY3VfbGVuLCBnZXRfZnMoKSkpIHsJCQkJXAotCQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQkJCQkJCVwKLQkJCWNoZWNrX29iamVjdF9zaXplKF9fY3VfdG8sIF9fY3VfbGVuLCBmYWxzZSk7CQkJXAotCQlfX2N1X2xlbiA9IF9fY29weV91c2VyKChfX2ZvcmNlIHZvaWQgX191c2VyICopIF9fY3VfdG8sIF9fY3VfZnJvbSwgX19jdV9sZW4pOwlcCi0JfQkJCQkJCQkJCQlcCi0JX19jdV9sZW47CQkJCQkJCQkJXAotfSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCit7CisJY2hlY2tfb2JqZWN0X3NpemUodG8sIG4sIGZhbHNlKTsKKwlpZiAobGlrZWx5KF9fYWNjZXNzX29rKGZyb20sIG4sIGdldF9mcygpKSkpCisJCW4gPSBfX2NvcHlfdXNlcigoX19mb3JjZSB2b2lkIF9fdXNlciAqKSB0bywgZnJvbSwgbik7CisJZWxzZQorCQltZW1zZXQodG8sIDAsIG4pOworCXJldHVybiBuOworfQogCiAjZGVmaW5lIF9fY29weV9pbl91c2VyKHRvLCBmcm9tLCBzaXplKQlfX2NvcHlfdXNlcigodG8pLCAoZnJvbSksIChzaXplKSkKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwppbmRleCA5MmI3YmM5Li45MjczZTAzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwpAQCAtNzk2LDcgKzc5Niw3IEBACiAgKiAgQUNQSSBiYXNlZCBob3RwbHVnIENQVSBzdXBwb3J0CiAgKi8KICNpZmRlZiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVQotc3RhdGljIGludCBhY3BpX21hcF9jcHUybm9kZShhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBjcHUsIGludCBwaHlzaWQpCitpbnQgYWNwaV9tYXBfY3B1Mm5vZGUoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgY3B1LCBpbnQgcGh5c2lkKQogewogI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYyBiL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKaW5kZXggZWI5MjIwYy4uOTUwOWNjNyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYworKysgYi9hcmNoL2lhNjQva2VybmVsL21jYS5jCkBAIC05ODYsNyArOTg2LDcgQEAKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJcHJldmlvdXNfY3VycmVudCA9IGN1cnJfdGFzayhjcHUpOwotCXNldF9jdXJyX3Rhc2soY3B1LCBjdXJyZW50KTsKKwlpYTY0X3NldF9jdXJyX3Rhc2soY3B1LCBjdXJyZW50KTsKIAlpZiAoKHAgPSBzdHJjaHIoY3VycmVudC0+Y29tbSwgJyAnKSkpCiAJCSpwID0gJ1wwJzsKIApAQCAtMTM2MCwxNCArMTM2MCwxNCBAQAogCQkJCWNwdW1hc2tfY2xlYXJfY3B1KGksICZtY2FfY3B1KTsJLyogd2FrZSBuZXh0IGNwdSAqLwogCQkJCXdoaWxlIChtb25hcmNoX2NwdSAhPSAtMSkKIAkJCQkJY3B1X3JlbGF4KCk7CS8qIHNwaW4gdW50aWwgbGFzdCBjcHUgbGVhdmVzICovCi0JCQkJc2V0X2N1cnJfdGFzayhjcHUsIHByZXZpb3VzX2N1cnJlbnQpOworCQkJCWlhNjRfc2V0X2N1cnJfdGFzayhjcHUsIHByZXZpb3VzX2N1cnJlbnQpOwogCQkJCWlhNjRfbWNfaW5mby5pbWlfcmVuZGV6X2NoZWNraW5bY3B1XQogCQkJCQkJPSBJQTY0X01DQV9SRU5ERVpfQ0hFQ0tJTl9OT1RET05FOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfQogCX0KLQlzZXRfY3Vycl90YXNrKGNwdSwgcHJldmlvdXNfY3VycmVudCk7CisJaWE2NF9zZXRfY3Vycl90YXNrKGNwdSwgcHJldmlvdXNfY3VycmVudCk7CiAJaWE2NF9tY19pbmZvLmltaV9yZW5kZXpfY2hlY2tpbltjcHVdID0gSUE2NF9NQ0FfUkVOREVaX0NIRUNLSU5fTk9URE9ORTsKIAltb25hcmNoX2NwdSA9IC0xOwkvKiBUaGlzIGZyZWVzIHRoZSBzbGF2ZXMgYW5kIHByZXZpb3VzIG1vbmFyY2hzICovCiB9CkBAIC0xNzI5LDcgKzE3MjksNyBAQAogCQlOT1RJRllfSU5JVChESUVfSU5JVF9TTEFWRV9MRUFWRSwgcmVncywgKGxvbmcpJm5kLCAxKTsKIAogCQltcHJpbnRrKCJTbGF2ZSBvbiBjcHUgJWQgcmV0dXJuaW5nIHRvIG5vcm1hbCBzZXJ2aWNlLlxuIiwgY3B1KTsKLQkJc2V0X2N1cnJfdGFzayhjcHUsIHByZXZpb3VzX2N1cnJlbnQpOworCQlpYTY0X3NldF9jdXJyX3Rhc2soY3B1LCBwcmV2aW91c19jdXJyZW50KTsKIAkJaWE2NF9tY19pbmZvLmltaV9yZW5kZXpfY2hlY2tpbltjcHVdID0gSUE2NF9NQ0FfUkVOREVaX0NIRUNLSU5fTk9URE9ORTsKIAkJYXRvbWljX2RlYygmc2xhdmVzKTsKIAkJcmV0dXJuOwpAQCAtMTc1Niw3ICsxNzU2LDcgQEAKIAogCW1wcmludGsoIlxuSU5JVCBkdW1wIGNvbXBsZXRlLiAgTW9uYXJjaCBvbiBjcHUgJWQgcmV0dXJuaW5nIHRvIG5vcm1hbCBzZXJ2aWNlLlxuIiwgY3B1KTsKIAlhdG9taWNfZGVjKCZtb25hcmNocyk7Ci0Jc2V0X2N1cnJfdGFzayhjcHUsIHByZXZpb3VzX2N1cnJlbnQpOworCWlhNjRfc2V0X2N1cnJfdGFzayhjcHUsIHByZXZpb3VzX2N1cnJlbnQpOwogCW1vbmFyY2hfY3B1ID0gLTE7CiAJcmV0dXJuOwogfQpAQCAtMTg5MCw3ICsxODkwLDcgQEAKIAkJCQkJCQkgICAgICBQQUdFX0tFUk5FTCkpKTsKIH0KIAotc3RhdGljIHZvaWQgaWE2NF9tY2FfY21jX3ZlY3Rvcl9hZGp1c3Qodm9pZCAqZHVtbXkpCitzdGF0aWMgaW50IGlhNjRfbWNhX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xODk4LDI1ICsxODk4LDkgQEAKIAlpZiAoIWNtY19wb2xsaW5nX2VuYWJsZWQpCiAJCWlhNjRfbWNhX2NtY192ZWN0b3JfZW5hYmxlKE5VTEwpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtY2FfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAotCQkJCSAgICAgIHZvaWQgKmhjcHUpCi17Ci0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKLQkJaWE2NF9tY2FfY21jX3ZlY3Rvcl9hZGp1c3QoTlVMTCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gTk9USUZZX09LOwotfQotCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG1jYV9jcHVfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBtY2FfY3B1X2NhbGxiYWNrCi19OwotCiAvKgogICogaWE2NF9tY2FfaW5pdAogICoKQEAgLTIxMTEsMTUgKzIwOTUsMTMgQEAKIAlpZiAoIW1jYV9pbml0KQogCQlyZXR1cm4gMDsKIAotCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmbWNhX2NwdV9ub3RpZmllcik7Ci0KIAkvKiBTZXR1cCB0aGUgQ01DSS9QIHZlY3RvciBhbmQgaGFuZGxlciAqLwogCXNldHVwX3RpbWVyKCZjbWNfcG9sbF90aW1lciwgaWE2NF9tY2FfY21jX3BvbGwsIDBVTCk7CiAKIAkvKiBVbm1hc2svZW5hYmxlIHRoZSB2ZWN0b3IgKi8KIAljbWNfcG9sbGluZ19lbmFibGVkID0gMDsKLQlzY2hlZHVsZV93b3JrKCZjbWNfZW5hYmxlX3dvcmspOwotCisJY3B1aHBfc2V0dXBfc3RhdGUoQ1BVSFBfQVBfT05MSU5FX0RZTiwgImlhNjQvbWNhOm9ubGluZSIsCisJCQkgIGlhNjRfbWNhX2NwdV9vbmxpbmUsIE5VTEwpOwogCUlBNjRfTUNBX0RFQlVHKCIlczogQ01DSS9QIHNldHVwIGFuZCBlbmFibGVkLlxuIiwgX19mdW5jX18pOwogCiAjaWZkZWYgQ09ORklHX0FDUEkKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL20zMnIvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IGNhYzcwMTQuLjZmODk4MjEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMjE5LDcgKzIxOSw3IEBACiAjZGVmaW5lIF9fZ2V0X3VzZXJfbm9jaGVjayh4LCBwdHIsIHNpemUpCQkJCVwKICh7CQkJCQkJCQkJXAogCWxvbmcgX19ndV9lcnIgPSAwOwkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIF9fZ3VfdmFsOwkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIF9fZ3VfdmFsID0gMDsJCQkJCVwKIAltaWdodF9mYXVsdCgpOwkJCQkJCQlcCiAJX19nZXRfdXNlcl9zaXplKF9fZ3VfdmFsLCAocHRyKSwgKHNpemUpLCBfX2d1X2Vycik7CQlcCiAJKHgpID0gKF9fZm9yY2UgX190eXBlb2ZfXygqKHB0cikpKV9fZ3VfdmFsOwkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9LY29uZmlnIGIvYXJjaC9tNjhrL0tjb25maWcKaW5kZXggNDk4YjU2Ny4uZDE0MDIwNiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL0tjb25maWcKKysrIGIvYXJjaC9tNjhrL0tjb25maWcKQEAgLTE0LDcgKzE0LDYgQEAKIAlzZWxlY3QgR0VORVJJQ19JT01BUAogCXNlbGVjdCBHRU5FUklDX1NUUk5DUFlfRlJPTV9VU0VSIGlmIE1NVQogCXNlbGVjdCBHRU5FUklDX1NUUk5MRU5fVVNFUiBpZiBNTVUKLQlzZWxlY3QgRlBVIGlmIE1NVQogCXNlbGVjdCBBUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KIAlzZWxlY3QgQVJDSF9VU0VTX0dFVFRJTUVPRkZTRVQgaWYgTU1VICYmICFDT0xERklSRQogCXNlbGVjdCBIQVZFX0ZVVEVYX0NNUFhDSEcgaWYgTU1VICYmIEZVVEVYCmRpZmYgLS1naXQgYS9hcmNoL202OGsvS2NvbmZpZy5jcHUgYi9hcmNoL202OGsvS2NvbmZpZy5jcHUKaW5kZXggOTY3MjYwZi4uZDIyMTlmMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9LY29uZmlnLmNwdQorKysgYi9hcmNoL202OGsvS2NvbmZpZy5jcHUKQEAgLTYyLDYgKzYyLDcgQEAKIGNvbmZpZyBNNjgwMjAKIAlib29sICI2ODAyMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gTU1VCisJc2VsZWN0IEZQVQogCXNlbGVjdCBDUFVfSEFTX0FERFJFU1NfU1BBQ0VTCiAJaGVscAogCSAgSWYgeW91IGFudGljaXBhdGUgcnVubmluZyB0aGlzIGtlcm5lbCBvbiBhIGNvbXB1dGVyIHdpdGggYSBNQzY4MDIwCkBAIC03Miw2ICs3Myw3IEBACiBjb25maWcgTTY4MDMwCiAJYm9vbCAiNjgwMzAgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE1NVSAmJiAhTU1VX1NVTjMKKwlzZWxlY3QgRlBVCiAJc2VsZWN0IENQVV9IQVNfQUREUkVTU19TUEFDRVMKIAloZWxwCiAJICBJZiB5b3UgYW50aWNpcGF0ZSBydW5uaW5nIHRoaXMga2VybmVsIG9uIGEgY29tcHV0ZXIgd2l0aCBhIE1DNjgwMzAKQEAgLTgxLDYgKzgzLDcgQEAKIGNvbmZpZyBNNjgwNDAKIAlib29sICI2ODA0MCBzdXBwb3J0IgogCWRlcGVuZHMgb24gTU1VICYmICFNTVVfU1VOMworCXNlbGVjdCBGUFUKIAlzZWxlY3QgQ1BVX0hBU19BRERSRVNTX1NQQUNFUwogCWhlbHAKIAkgIElmIHlvdSBhbnRpY2lwYXRlIHJ1bm5pbmcgdGhpcyBrZXJuZWwgb24gYSBjb21wdXRlciB3aXRoIGEgTUM2OExDMDQwCkBAIC05MSw2ICs5NCw3IEBACiBjb25maWcgTTY4MDYwCiAJYm9vbCAiNjgwNjAgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE1NVSAmJiAhTU1VX1NVTjMKKwlzZWxlY3QgRlBVCiAJc2VsZWN0IENQVV9IQVNfQUREUkVTU19TUEFDRVMKIAloZWxwCiAJICBJZiB5b3UgYW50aWNpcGF0ZSBydW5uaW5nIHRoaXMga2VybmVsIG9uIGEgY29tcHV0ZXIgd2l0aCBhIE1DNjgwNjAKQEAgLTI1OSw2ICsyNjMsNyBAQAogCWJvb2wgIk1DRjU0N3giCiAJc2VsZWN0IE01NHh4CiAJc2VsZWN0IE1NVV9DT0xERklSRSBpZiBNTVUKKwlzZWxlY3QgRlBVIGlmIE1NVQogCXNlbGVjdCBIQVZFX0NBQ0hFX0NCCiAJc2VsZWN0IEhBVkVfTUJBUgogCXNlbGVjdCBDUFVfTk9fRUZGSUNJRU5UX0ZGUwpAQCAtMjY4LDYgKzI3Myw3IEBACiBjb25maWcgTTU0OHgKIAlib29sICJNQ0Y1NDh4IgogCXNlbGVjdCBNTVVfQ09MREZJUkUgaWYgTU1VCisJc2VsZWN0IEZQVSBpZiBNTVUKIAlzZWxlY3QgTTU0eHgKIAlzZWxlY3QgSEFWRV9DQUNIRV9DQgogCXNlbGVjdCBIQVZFX01CQVIKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hbWlnYS9jb25maWcuYyBiL2FyY2gvbTY4ay9hbWlnYS9jb25maWcuYwppbmRleCBlYzljYzFmLi5kZGI4MTkyIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYW1pZ2EvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL2FtaWdhL2NvbmZpZy5jCkBAIC0zOTYsNyArMzk2LDcgQEAKIAltYWNoX21heF9kbWFfYWRkcmVzcyA9IDB4ZmZmZmZmZmY7CiAKIAltYWNoX3Jlc2V0ICAgICAgICAgICA9IGFtaWdhX3Jlc2V0OwotI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUX002OEtfQkVFUCkgfHwgZGVmaW5lZChDT05GSUdfSU5QVVRfTTY4S19CRUVQX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JTlBVVF9NNjhLX0JFRVApCiAJbWFjaF9iZWVwICAgICAgICAgICAgPSBhbWlnYV9ta3NvdW5kOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hdGFyaS9jb25maWcuYyBiL2FyY2gvbTY4ay9hdGFyaS9jb25maWcuYwppbmRleCBjYmQ1OTkxLi45N2EzYzM4IDEwMDY0NAotLS0gYS9hcmNoL202OGsvYXRhcmkvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL2F0YXJpL2NvbmZpZy5jCkBAIC0yMTEsNyArMjExLDcgQEAKIAlhcmNoX2dldHRpbWVvZmZzZXQgICA9IGF0YXJpX2dldHRpbWVvZmZzZXQ7CiAJbWFjaF9yZXNldCAgICAgICAgICAgPSBhdGFyaV9yZXNldDsKIAltYWNoX21heF9kbWFfYWRkcmVzcyA9IDB4ZmZmZmZmOwotI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUX002OEtfQkVFUCkgfHwgZGVmaW5lZChDT05GSUdfSU5QVVRfTTY4S19CRUVQX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JTlBVVF9NNjhLX0JFRVApCiAJbWFjaF9iZWVwICAgICAgICAgID0gYXRhcmlfbWtzb3VuZDsKICNlbmRpZgogI2lmZGVmIENPTkZJR19IRUFSVEJFQVQKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb2xkZmlyZS9jbGsuYyBiL2FyY2gvbTY4ay9jb2xkZmlyZS9jbGsuYwppbmRleCBmZGRmZGNjLi4xZTNjN2U5IDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29sZGZpcmUvY2xrLmMKKysrIGIvYXJjaC9tNjhrL2NvbGRmaXJlL2Nsay5jCkBAIC0xMDEsNiArMTAxLDEwIEBACiB2b2lkIGNsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFjbGspCisJCXJldHVybjsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZjbGtfbG9jaywgZmxhZ3MpOwogCWlmICgoLS1jbGstPmVuYWJsZWQgPT0gMCkgJiYgY2xrLT5jbGtfb3BzKQogCQljbGstPmNsa19vcHMtPmRpc2FibGUoY2xrKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb2xkZmlyZS9oZWFkLlMgYi9hcmNoL202OGsvY29sZGZpcmUvaGVhZC5TCmluZGV4IDczZDkyZWEuLmJkYjQ3MmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb2xkZmlyZS9oZWFkLlMKKysrIGIvYXJjaC9tNjhrL2NvbGRmaXJlL2hlYWQuUwpAQCAtMjgwLDEwICsyODAsMTAgQEAKIAltb3ZlbAklZDAsbTY4a19jcHV0eXBlCQkvKiBNYXJrIHVzIGFzIGEgQ29sZEZpcmUgKi8KIAltb3ZlbAkjTU1VX0NPTERGSVJFLCVkMAogCW1vdmVsCSVkMCxtNjhrX21tdXR5cGUKLQltb3ZlbAkjRlBVX0NPTERGSVJFLCVkMAotCW1vdmVsCSVkMCxtNjhrX2ZwdXR5cGUKLQltb3ZlbAkjTUFDSF9NNTRYWCwlZDAKLQltb3ZlbAklZDAsbTY4a19tYWNodHlwZQkJLyogTWFyayB1cyBhcyBhIDU0eHggbWFjaGluZSAqLworCW1vdmVsCSNGUFVUWVBFLCVkMAorCW1vdmVsCSVkMCxtNjhrX2ZwdXR5cGUJCS8qIE1hcmsgRlBVIHR5cGUgKi8KKwltb3ZlbAkjTUFDSElORSwlZDAKKwltb3ZlbAklZDAsbTY4a19tYWNodHlwZQkJLyogTWFyayBtYWNoaW5lIHR5cGUgKi8KIAlsZWEJaW5pdF90YXNrLCVhMgkJCS8qIFNldCAiY3VycmVudCIgaW5pdCB0YXNrICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbGRmaXJlL201Mjh4LmMgYi9hcmNoL202OGsvY29sZGZpcmUvbTUyOHguYwppbmRleCA0NWU5NDdhLi4xMmY5ZTM3IDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29sZGZpcmUvbTUyOHguYworKysgYi9hcmNoL202OGsvY29sZGZpcmUvbTUyOHguYwpAQCAtMTAyLDE0ICsxMDIsMTQgQEAKIAlwcmludGsoS0VSTl9JTkZPICJXaWxkRmlyZU1vZCBoaWJlcm5hdGluZy4uLlxuIik7CiAKIAkvKiBTZXQgcG9ydEUuNSB0byBEaWdpdGFsIElPICovCi0JTUNGNTI4Ml9HUElPX1BFUEFSICY9IH4oMSA8PCAoNSAqIDIpKTsKKwl3cml0ZXcocmVhZHcoTUNGR1BJT19QRVBBUikgJiB+KDEgPDwgKDUgKiAyKSksIE1DRkdQSU9fUEVQQVIpOwogCiAJLyogTWFrZSBwb3J0RS41IGFuIG91dHB1dCAqLwotCU1DRjUyODJfR1BJT19ERFJFIHw9ICgxIDw8IDUpOworCXdyaXRlYihyZWFkYihNQ0ZHUElPX1BERFJfRSkgfCAoMSA8PCA1KSwgTUNGR1BJT19QRERSX0UpOwogCiAJLyogTm93IHRvZ2dsZSBwb3J0RS41IGZyb20gbG93IHRvIGhpZ2ggKi8KLQlNQ0Y1MjgyX0dQSU9fUE9SVEUgJj0gfigxIDw8IDUpOwotCU1DRjUyODJfR1BJT19QT1JURSB8PSAoMSA8PCA1KTsKKwl3cml0ZWIocmVhZGIoTUNGR1BJT19QT0RSX0UpICYgfigxIDw8IDUpLCBNQ0ZHUElPX1BPRFJfRSk7CisJd3JpdGViKHJlYWRiKE1DRkdQSU9fUE9EUl9FKSB8ICgxIDw8IDUpLCBNQ0ZHUElPX1BPRFJfRSk7CiAKIAlwcmludGsoS0VSTl9FTUVSRyAiRmFpbGVkIHRvIGhpYmVybmF0ZS4gSGFsdGluZyFcbiIpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbGRmaXJlL201M3h4LmMgYi9hcmNoL202OGsvY29sZGZpcmUvbTUzeHguYwppbmRleCA4MDg3OWE3Li4yNTAyZjYzIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29sZGZpcmUvbTUzeHguYworKysgYi9hcmNoL202OGsvY29sZGZpcmUvbTUzeHguYwpAQCAtMjcxLDkgKzI3MSw2IEBACiAKICNkZWZpbmUgTkFORF9GTEFTSF9BRERSRVNTCSgweEQwMDAwMDAwKQogCi1pbnQgc3lzX2Nsa19raHogPSAwOwotaW50IHN5c19jbGtfbWh6ID0gMDsKLQogdm9pZCB3dG1faW5pdCh2b2lkKTsKIHZvaWQgc2NtX2luaXQodm9pZCk7CiB2b2lkIGdwaW9faW5pdCh2b2lkKTsKQEAgLTI4Niw5ICsyODMsOCBAQAogCiBhc21saW5rYWdlIHZvaWQgX19pbml0IHN5c2luaXQodm9pZCkKIHsKLQlzeXNfY2xrX2toeiA9IGNsb2NrX3BsbCgwLCAwKTsKLQlzeXNfY2xrX21oeiA9IHN5c19jbGtfa2h6LzEwMDA7Ci0JCisJY2xvY2tfcGxsKDAsIDApOworCiAJd3RtX2luaXQoKTsKIAlzY21faW5pdCgpOwogCWdwaW9faW5pdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbGRmaXJlL201NHh4LmMgYi9hcmNoL202OGsvY29sZGZpcmUvbTU0eHguYwppbmRleCBjMzJmNzY3Li4zODZkZjNiIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29sZGZpcmUvbTU0eHguYworKysgYi9hcmNoL202OGsvY29sZGZpcmUvbTU0eHguYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGFzbS9tNTR4eGdwdC5oPgogI2lmZGVmIENPTkZJR19NTVUKICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wZm4uaD4KICNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNzgsNDcgKzc3LDEwIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBDT05GSUdfTU1VCi0KLXVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgbWNmNTR4eF9ib290bWVtX2FsbG9jKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBzdGFydF9wZm47Ci0JdW5zaWduZWQgbG9uZyBtZW1zdGFydDsKLQotCS8qIF9yYW1iYXNlIGFuZCBfcmFtZW5kIHdpbGwgYmUgbmF0dXJhbGx5IHBhZ2UgYWxpZ25lZCAqLwotCW02OGtfbWVtb3J5WzBdLmFkZHIgPSBfcmFtYmFzZTsKLQltNjhrX21lbW9yeVswXS5zaXplID0gX3JhbWVuZCAtIF9yYW1iYXNlOwotCi0JLyogY29tcHV0ZSB0b3RhbCBwYWdlcyBpbiBzeXN0ZW0gKi8KLQludW1fcGFnZXMgPSBQRk5fRE9XTihfcmFtZW5kIC0gX3JhbWJhc2UpOwotCi0JLyogcGFnZSBudW1iZXJzICovCi0JbWVtc3RhcnQgPSBQQUdFX0FMSUdOKF9yYW1zdGFydCk7Ci0JbWluX2xvd19wZm4gPSBQRk5fRE9XTihfcmFtYmFzZSk7Ci0Jc3RhcnRfcGZuID0gUEZOX0RPV04obWVtc3RhcnQpOwotCW1heF9wZm4gPSBtYXhfbG93X3BmbiA9IFBGTl9ET1dOKF9yYW1lbmQpOwotCWhpZ2hfbWVtb3J5ID0gKHZvaWQgKilfcmFtZW5kOwotCi0JbTY4a192aXJ0X3RvX25vZGVfc2hpZnQgPSBmbHMoX3JhbWVuZCAtIF9yYW1iYXNlIC0gMSkgLSA2OwotCW1vZHVsZV9maXh1cChOVUxMLCBfX3N0YXJ0X2ZpeHVwLCBfX3N0b3BfZml4dXApOwotCi0JLyogc2V0dXAgYm9vdG1lbSBkYXRhICovCi0JbTY4a19zZXR1cF9ub2RlKDApOwotCW1lbXN0YXJ0ICs9IGluaXRfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwgc3RhcnRfcGZuLAotCQltaW5fbG93X3BmbiwgbWF4X2xvd19wZm4pOwotCWZyZWVfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwgbWVtc3RhcnQsIF9yYW1lbmQgLSBtZW1zdGFydCk7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfTU1VICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIHZvaWQgX19pbml0IGNvbmZpZ19CU1AoY2hhciAqY29tbWFuZHAsIGludCBzaXplKQogewogI2lmZGVmIENPTkZJR19NTVUKLQltY2Y1NHh4X2Jvb3RtZW1fYWxsb2MoKTsKKwljZl9ib290bWVtX2FsbG9jKCk7CiAJbW11X2NvbnRleHRfaW5pdCgpOwogI2VuZGlmCiAJbWFjaF9yZXNldCA9IG1jZjU0eHhfcmVzZXQ7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9hbWlnYV9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9hbWlnYV9kZWZjb25maWcKaW5kZXggOGY1YjZmNy4uNTViZTdlMyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvYW1pZ2FfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL2FtaWdhX2RlZmNvbmZpZwpAQCAtNTY2LDYgKzU2Niw4IEBACiBDT05GSUdfVEVTVF9TVEFUSUNfS0VZUz1tCiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKIENPTkZJR19DUllQVE9fUlNBPW0KK0NPTkZJR19DUllQVE9fREg9bQorQ09ORklHX0NSWVBUT19FQ0RIPW0KIENPTkZJR19DUllQVE9fTUFOQUdFUj15CiBDT05GSUdfQ1JZUFRPX1VTRVI9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQpAQCAtNTg0LDYgKzU4Niw3IEBACiBDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCiBDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCitDT05GSUdfQ1JZUFRPX1NIQTM9bQogQ09ORklHX0NSWVBUT19UR1IxOTI9bQogQ09ORklHX0NSWVBUT19XUDUxMj1tCiBDT05GSUdfQ1JZUFRPX0FOVUJJUz1tCmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9hcG9sbG9fZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYXBvbGxvX2RlZmNvbmZpZwppbmRleCAzMWJkZWQ5Li4zNjVkZGE2NiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvYXBvbGxvX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9hcG9sbG9fZGVmY29uZmlnCkBAIC01MjUsNiArNTI1LDggQEAKIENPTkZJR19URVNUX1NUQVRJQ19LRVlTPW0KIENPTkZJR19FQVJMWV9QUklOVEs9eQogQ09ORklHX0NSWVBUT19SU0E9bQorQ09ORklHX0NSWVBUT19ESD1tCitDT05GSUdfQ1JZUFRPX0VDREg9bQogQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKIENPTkZJR19DUllQVE9fVVNFUj1tCiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tCkBAIC01NDMsNiArNTQ1LDcgQEAKIENPTkZJR19DUllQVE9fUk1EMjU2PW0KIENPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBNTEyPW0KK0NPTkZJR19DUllQVE9fU0hBMz1tCiBDT05GSUdfQ1JZUFRPX1RHUjE5Mj1tCiBDT05GSUdfQ1JZUFRPX1dQNTEyPW0KIENPTkZJR19DUllQVE9fQU5VQklTPW0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL2F0YXJpX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL2F0YXJpX2RlZmNvbmZpZwppbmRleCAwZDc3MzllLi5jZTNjYmZkIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9hdGFyaV9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYXRhcmlfZGVmY29uZmlnCkBAIC01NDYsNiArNTQ2LDggQEAKIENPTkZJR19URVNUX1NUQVRJQ19LRVlTPW0KIENPTkZJR19FQVJMWV9QUklOVEs9eQogQ09ORklHX0NSWVBUT19SU0E9bQorQ09ORklHX0NSWVBUT19ESD1tCitDT05GSUdfQ1JZUFRPX0VDREg9bQogQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKIENPTkZJR19DUllQVE9fVVNFUj1tCiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tCkBAIC01NjQsNiArNTY2LDcgQEAKIENPTkZJR19DUllQVE9fUk1EMjU2PW0KIENPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBNTEyPW0KK0NPTkZJR19DUllQVE9fU0hBMz1tCiBDT05GSUdfQ1JZUFRPX1RHUjE5Mj1tCiBDT05GSUdfQ1JZUFRPX1dQNTEyPW0KIENPTkZJR19DUllQVE9fQU5VQklTPW0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL2J2bWU2MDAwX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL2J2bWU2MDAwX2RlZmNvbmZpZwppbmRleCAyY2JiNWM0Li44ZGI0OTZhIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9idm1lNjAwMF9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYnZtZTYwMDBfZGVmY29uZmlnCkBAIC01MTcsNiArNTE3LDggQEAKIENPTkZJR19URVNUX1NUQVRJQ19LRVlTPW0KIENPTkZJR19FQVJMWV9QUklOVEs9eQogQ09ORklHX0NSWVBUT19SU0E9bQorQ09ORklHX0NSWVBUT19ESD1tCitDT05GSUdfQ1JZUFRPX0VDREg9bQogQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKIENPTkZJR19DUllQVE9fVVNFUj1tCiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tCkBAIC01MzUsNiArNTM3LDcgQEAKIENPTkZJR19DUllQVE9fUk1EMjU2PW0KIENPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBNTEyPW0KK0NPTkZJR19DUllQVE9fU0hBMz1tCiBDT05GSUdfQ1JZUFRPX1RHUjE5Mj1tCiBDT05GSUdfQ1JZUFRPX1dQNTEyPW0KIENPTkZJR19DUllQVE9fQU5VQklTPW0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL2hwMzAwX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL2hwMzAwX2RlZmNvbmZpZwppbmRleCA5NjEwMmE0Li44MzE0MTU2IDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9ocDMwMF9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvaHAzMDBfZGVmY29uZmlnCkBAIC01MjcsNiArNTI3LDggQEAKIENPTkZJR19URVNUX1NUQVRJQ19LRVlTPW0KIENPTkZJR19FQVJMWV9QUklOVEs9eQogQ09ORklHX0NSWVBUT19SU0E9bQorQ09ORklHX0NSWVBUT19ESD1tCitDT05GSUdfQ1JZUFRPX0VDREg9bQogQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKIENPTkZJR19DUllQVE9fVVNFUj1tCiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tCkBAIC01NDUsNiArNTQ3LDcgQEAKIENPTkZJR19DUllQVE9fUk1EMjU2PW0KIENPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBNTEyPW0KK0NPTkZJR19DUllQVE9fU0hBMz1tCiBDT05GSUdfQ1JZUFRPX1RHUjE5Mj1tCiBDT05GSUdfQ1JZUFRPX1dQNTEyPW0KIENPTkZJR19DUllQVE9fQU5VQklTPW0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL21hY19kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9tYWNfZGVmY29uZmlnCmluZGV4IDk3ZDg4ZjcuLjY2MDAyNzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL21hY19kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbWFjX2RlZmNvbmZpZwpAQCAtNTQ5LDYgKzU0OSw4IEBACiBDT05GSUdfVEVTVF9TVEFUSUNfS0VZUz1tCiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKIENPTkZJR19DUllQVE9fUlNBPW0KK0NPTkZJR19DUllQVE9fREg9bQorQ09ORklHX0NSWVBUT19FQ0RIPW0KIENPTkZJR19DUllQVE9fTUFOQUdFUj15CiBDT05GSUdfQ1JZUFRPX1VTRVI9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQpAQCAtNTY3LDYgKzU2OSw3IEBACiBDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCiBDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCitDT05GSUdfQ1JZUFRPX1NIQTM9bQogQ09ORklHX0NSWVBUT19UR1IxOTI9bQogQ09ORklHX0NSWVBUT19XUDUxMj1tCiBDT05GSUdfQ1JZUFRPX0FOVUJJUz1tCmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9tdWx0aV9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9tdWx0aV9kZWZjb25maWcKaW5kZXggYmUyNWVmMi4uOTBhYmZlOSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvbXVsdGlfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL211bHRpX2RlZmNvbmZpZwpAQCAtNjI5LDYgKzYyOSw4IEBACiBDT05GSUdfVEVTVF9TVEFUSUNfS0VZUz1tCiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKIENPTkZJR19DUllQVE9fUlNBPW0KK0NPTkZJR19DUllQVE9fREg9bQorQ09ORklHX0NSWVBUT19FQ0RIPW0KIENPTkZJR19DUllQVE9fTUFOQUdFUj15CiBDT05GSUdfQ1JZUFRPX1VTRVI9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQpAQCAtNjQ3LDYgKzY0OSw3IEBACiBDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCiBDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCitDT05GSUdfQ1JZUFRPX1NIQTM9bQogQ09ORklHX0NSWVBUT19UR1IxOTI9bQogQ09ORklHX0NSWVBUT19XUDUxMj1tCiBDT05GSUdfQ1JZUFRPX0FOVUJJUz1tCmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9tdm1lMTQ3X2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL212bWUxNDdfZGVmY29uZmlnCmluZGV4IGEwMDgzNDQuLjBkNTAyYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL212bWUxNDdfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL212bWUxNDdfZGVmY29uZmlnCkBAIC01MTcsNiArNTE3LDggQEAKIENPTkZJR19URVNUX1NUQVRJQ19LRVlTPW0KIENPTkZJR19FQVJMWV9QUklOVEs9eQogQ09ORklHX0NSWVBUT19SU0E9bQorQ09ORklHX0NSWVBUT19ESD1tCitDT05GSUdfQ1JZUFRPX0VDREg9bQogQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKIENPTkZJR19DUllQVE9fVVNFUj1tCiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tCkBAIC01MzUsNiArNTM3LDcgQEAKIENPTkZJR19DUllQVE9fUk1EMjU2PW0KIENPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBNTEyPW0KK0NPTkZJR19DUllQVE9fU0hBMz1tCiBDT05GSUdfQ1JZUFRPX1RHUjE5Mj1tCiBDT05GSUdfQ1JZUFRPX1dQNTEyPW0KIENPTkZJR19DUllQVE9fQU5VQklTPW0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL212bWUxNnhfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE2eF9kZWZjb25maWcKaW5kZXggNjczNWEyNS4uNTkzMGU5MSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE2eF9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE2eF9kZWZjb25maWcKQEAgLTUxNyw2ICs1MTcsOCBAQAogQ09ORklHX1RFU1RfU1RBVElDX0tFWVM9bQogQ09ORklHX0VBUkxZX1BSSU5USz15CiBDT05GSUdfQ1JZUFRPX1JTQT1tCitDT05GSUdfQ1JZUFRPX0RIPW0KK0NPTkZJR19DUllQVE9fRUNESD1tCiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQogQ09ORklHX0NSWVBUT19VU0VSPW0KIENPTkZJR19DUllQVE9fQ1JZUFREPW0KQEAgLTUzNSw2ICs1MzcsNyBAQAogQ09ORklHX0NSWVBUT19STUQyNTY9bQogQ09ORklHX0NSWVBUT19STUQzMjA9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19TSEEzPW0KIENPTkZJR19DUllQVE9fVEdSMTkyPW0KIENPTkZJR19DUllQVE9fV1A1MTI9bQogQ09ORklHX0NSWVBUT19BTlVCSVM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvcTQwX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL3E0MF9kZWZjb25maWcKaW5kZXggNzgwYzZlOS4uNzRlM2FkOCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvcTQwX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9xNDBfZGVmY29uZmlnCkBAIC01NDAsNiArNTQwLDggQEAKIENPTkZJR19URVNUX1NUQVRJQ19LRVlTPW0KIENPTkZJR19FQVJMWV9QUklOVEs9eQogQ09ORklHX0NSWVBUT19SU0E9bQorQ09ORklHX0NSWVBUT19ESD1tCitDT05GSUdfQ1JZUFRPX0VDREg9bQogQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKIENPTkZJR19DUllQVE9fVVNFUj1tCiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tCkBAIC01NTgsNiArNTYwLDcgQEAKIENPTkZJR19DUllQVE9fUk1EMjU2PW0KIENPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBNTEyPW0KK0NPTkZJR19DUllQVE9fU0hBMz1tCiBDT05GSUdfQ1JZUFRPX1RHUjE5Mj1tCiBDT05GSUdfQ1JZUFRPX1dQNTEyPW0KIENPTkZJR19DUllQVE9fQU5VQklTPW0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL3N1bjNfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3Mvc3VuM19kZWZjb25maWcKaW5kZXggNDQ2OTNjZi4uNGJhODYwNiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3Mvc3VuM19kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3Mvc3VuM19kZWZjb25maWcKQEAgLTUxOCw2ICs1MTgsOCBAQAogQ09ORklHX1RFU1RfVURFTEFZPW0KIENPTkZJR19URVNUX1NUQVRJQ19LRVlTPW0KIENPTkZJR19DUllQVE9fUlNBPW0KK0NPTkZJR19DUllQVE9fREg9bQorQ09ORklHX0NSWVBUT19FQ0RIPW0KIENPTkZJR19DUllQVE9fTUFOQUdFUj15CiBDT05GSUdfQ1JZUFRPX1VTRVI9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQpAQCAtNTM2LDYgKzUzOCw3IEBACiBDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCiBDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCitDT05GSUdfQ1JZUFRPX1NIQTM9bQogQ09ORklHX0NSWVBUT19UR1IxOTI9bQogQ09ORklHX0NSWVBUT19XUDUxMj1tCiBDT05GSUdfQ1JZUFRPX0FOVUJJUz1tCmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9zdW4zeF9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9zdW4zeF9kZWZjb25maWcKaW5kZXggZWYwMDcxZC4uYzZmNDk3MiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3Mvc3VuM3hfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL3N1bjN4X2RlZmNvbmZpZwpAQCAtNTE5LDYgKzUxOSw4IEBACiBDT05GSUdfVEVTVF9TVEFUSUNfS0VZUz1tCiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKIENPTkZJR19DUllQVE9fUlNBPW0KK0NPTkZJR19DUllQVE9fREg9bQorQ09ORklHX0NSWVBUT19FQ0RIPW0KIENPTkZJR19DUllQVE9fTUFOQUdFUj15CiBDT05GSUdfQ1JZUFRPX1VTRVI9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQpAQCAtNTM3LDYgKzUzOSw3IEBACiBDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCiBDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCitDT05GSUdfQ1JZUFRPX1NIQTM9bQogQ09ORklHX0NSWVBUT19UR1IxOTI9bQogQ09ORklHX0NSWVBUT19XUDUxMj1tCiBDT05GSUdfQ1JZUFRPX0FOVUJJUz1tCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vYm9vdGluZm8uaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9ib290aW5mby5oCmluZGV4IDhlMjEzMjYuLjgxYzkxYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9ib290aW5mby5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9ib290aW5mby5oCkBAIC0yMiw2ICsyMiwxMiBAQAogc3RhdGljIGlubGluZSB2b2lkIHNhdmVfYm9vdGluZm8oY29uc3Qgc3RydWN0IGJpX3JlY29yZCAqYmkpIHt9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19VQk9PVAordm9pZCBwcm9jZXNzX3Vib290X2NvbW1hbmRsaW5lKGNoYXIgKmNvbW1hbmRwLCBpbnQgc2l6ZSk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHByb2Nlc3NfdWJvb3RfY29tbWFuZGxpbmUoY2hhciAqY29tbWFuZHAsIGludCBzaXplKSB7fQorI2VuZGlmCisKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vbTU0NDF4c2ltLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbTU0NDF4c2ltLmgKaW5kZXggY2M3OThhYi4uNjRmNjBiZSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL201NDQxeHNpbS5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tNTQ0MXhzaW0uaApAQCAtMTAsNiArMTAsMTAgQEAKICNkZWZpbmUgQ1BVX05BTUUJCSJDT0xERklSRShtNTQ0MXgpIgogI2RlZmluZSBDUFVfSU5TVFJfUEVSX0pJRkZZCTIKICNkZWZpbmUgTUNGX0JVU0NMSwkJKE1DRl9DTEsgLyAyKQorI2RlZmluZSBNQUNISU5FCQkJTUFDSF9NNTQ0MVgKKyNkZWZpbmUgRlBVVFlQRQkJCTAKKyNkZWZpbmUgSU9NRU1CQVNFCQkweGUwMDAwMDAwCisjZGVmaW5lIElPTUVNU0laRQkJMHgyMDAwMDAwMAogCiAjaW5jbHVkZSA8YXNtL201NHh4YWNyLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tNTR4eGFjci5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL201NHh4YWNyLmgKaW5kZXggNTllMTcxMC4uYzZhYzA1YyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL201NHh4YWNyLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL201NHh4YWNyLmgKQEAgLTk0LDcgKzk0LDcgQEAKICAqCXJlZ2lzdGVyIHJlZ2lvbiBhcyBub24tY2FjaGVhYmxlLiBBbmQgdGhlbiB3ZSBtYXAgYWxsIG91ciBSQU0gYXMKICAqCWNhY2hlYWJsZSBhbmQgc3VwZXJ2aXNvciBhY2Nlc3Mgb25seS4KICAqLwotI2RlZmluZSBBQ1IwX01PREUJKEFDUl9CQShDT05GSUdfTUJBUikrQUNSX0FETVNLKDB4MTAwMDAwMCkrIFwKKyNkZWZpbmUgQUNSMF9NT0RFCShBQ1JfQkEoSU9NRU1CQVNFKStBQ1JfQURNU0soSU9NRU1TSVpFKSsgXAogCQkJIEFDUl9FTkFCTEUrQUNSX1NVUEVSK0FDUl9DTV9PRkZfUFJFK0FDUl9TUCkKICNpZiBkZWZpbmVkKENPTkZJR19DQUNIRV9DT1BZQkFDSykKICNkZWZpbmUgQUNSMV9NT0RFCShBQ1JfQkEoQ09ORklHX1JBTUJBU0UpK0FDUl9BRE1TSyhDT05GSUdfUkFNU0laRSkrIFwKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tNTR4eHNpbS5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL201NHh4c2ltLmgKaW5kZXggYTVmYmQxNy4uNzNkOTM3ZiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL201NHh4c2ltLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL201NHh4c2ltLmgKQEAgLTgsNiArOCwxMCBAQAogI2RlZmluZQlDUFVfTkFNRQkJIkNPTERGSVJFKG01NHh4KSIKICNkZWZpbmUJQ1BVX0lOU1RSX1BFUl9KSUZGWQkyCiAjZGVmaW5lCU1DRl9CVVNDTEsJCShNQ0ZfQ0xLIC8gMikKKyNkZWZpbmUJTUFDSElORQkJCU1BQ0hfTTU0WFgKKyNkZWZpbmUJRlBVVFlQRQkJCUZQVV9DT0xERklSRQorI2RlZmluZQlJT01FTUJBU0UJCU1DRl9NQkFSCisjZGVmaW5lCUlPTUVNU0laRQkJMHgwMTAwMDAwMAogCiAjaW5jbHVkZSA8YXNtL201NHh4YWNyLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tY2ZtbXUuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tY2ZtbXUuaAppbmRleCA4ODI0MjM2Li4xMGY5OTMwIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vbWNmbW11LmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21jZm1tdS5oCkBAIC0xMDUsNiArMTA1LDcgQEAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm5vcCIpOwogfQogCit2b2lkIGNmX2Jvb3RtZW1fYWxsb2Modm9pZCk7CiBpbnQgY2ZfdGxiX21pc3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCB3cml0ZSwgaW50IGR0bGIsIGludCBleHRlbnNpb25fd29yZCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL25ldHRlbC5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL25ldHRlbC5oCmluZGV4IDJhN2E3NjYuLjkyNjM3NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9uZXR0ZWwuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbmV0dGVsLmgKQEAgLTkyLDcgKzkyLDcgQEAKIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBtY2Zfc2V0cHBkYXRhKHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgYml0cykKIHsKLQl3cml0ZSgocmVhZHcoTUNGU0lNX1BCREFUKSAmIH5tYXNrKSB8IGJpdHMsIE1DRlNJTV9QQkRBVCk7CisJd3JpdGV3KChyZWFkdyhNQ0ZTSU1fUEJEQVQpICYgfm1hc2spIHwgYml0cywgTUNGU0lNX1BCREFUKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS91YXBpL2FzbS9ib290aW5mby5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvdWFwaS9hc20vYm9vdGluZm8uaAppbmRleCBjZGViMjZhMC4uYTQ4Y2Y1NCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvdWFwaS9hc20vYm9vdGluZm8uaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS91YXBpL2FzbS9ib290aW5mby5oCkBAIC04MSw2ICs4MSw3IEBACiAjZGVmaW5lIE1BQ0hfUTQwCQkxMAogI2RlZmluZSBNQUNIX1NVTjNYCQkxMQogI2RlZmluZSBNQUNIX001NFhYCQkxMgorI2RlZmluZSBNQUNIX001NDQxWAkJMTMKIAogCiAgICAgLyoKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL202OGsva2VybmVsL01ha2VmaWxlCmluZGV4IGU0Nzc3OGYuLjhhMWM0ZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9NYWtlZmlsZQpAQCAtMjQsNiArMjQsNyBAQAogCiBvYmotJChDT05GSUdfS0VYRUMpCQkrPSBtYWNoaW5lX2tleGVjLm8gcmVsb2NhdGVfa2VybmVsLm8KIG9iai0kKENPTkZJR19CT09USU5GT19QUk9DKQkrPSBib290aW5mb19wcm9jLm8KK29iai0kKENPTkZJR19VQk9PVCkJCSs9IHVib290Lm8KIAogb2JqLSQoQ09ORklHX0VBUkxZX1BSSU5USykJKz0gZWFybHlfcHJpbnRrLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYwppbmRleCBjNTVmZjcxLi40YmExYWU3IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjAzLDExICsyMDMsOCBAQAogfQogCiAvKiBGaWxsIGluIHRoZSBmcHUgc3RydWN0dXJlIGZvciBhIGNvcmUgZHVtcC4gICovCi0jaWZkZWYgQ09ORklHX0ZQVQogaW50IGR1bXBfZnB1IChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHVzZXJfbTY4a2ZwX3N0cnVjdCAqZnB1KQogewotCWNoYXIgZnB1c3RhdGVbMjE2XTsKLQogCWlmIChGUFVfSVNfRU1VKSB7CiAJCWludCBpOwogCkBAIC0yMjIsMzcgKzIxOSw0MCBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQkvKiBGaXJzdCBkdW1wIHRoZSBmcHUgY29udGV4dCB0byBhdm9pZCBwcm90b2NvbCB2aW9sYXRpb24uICAqLwotCWFzbSB2b2xhdGlsZSAoImZzYXZlICUwIiA6OiAibSIgKGZwdXN0YXRlWzBdKSA6ICJtZW1vcnkiKTsKLQlpZiAoIUNQVV9JU18wNjAgPyAhZnB1c3RhdGVbMF0gOiAhZnB1c3RhdGVbMl0pCi0JCXJldHVybiAwOworCWlmIChJU19FTkFCTEVEKENPTkZJR19GUFUpKSB7CisJCWNoYXIgZnB1c3RhdGVbMjE2XTsKIAotCWlmIChDUFVfSVNfQ09MREZJUkUpIHsKLQkJYXNtIHZvbGF0aWxlICgiZm1vdmVsICUvZnBpYXIsJTBcblx0IgotCQkJICAgICAgImZtb3ZlbCAlL2ZwY3IsJTFcblx0IgotCQkJICAgICAgImZtb3ZlbCAlL2Zwc3IsJTJcblx0IgotCQkJICAgICAgImZtb3ZlbWQgJS9mcDAtJS9mcDcsJTMiCi0JCQkgICAgICA6Ci0JCQkgICAgICA6ICJtIiAoZnB1LT5mcGNudGxbMF0pLAotCQkJCSJtIiAoZnB1LT5mcGNudGxbMV0pLAotCQkJCSJtIiAoZnB1LT5mcGNudGxbMl0pLAotCQkJCSJtIiAoZnB1LT5mcHJlZ3NbMF0pCi0JCQkgICAgICA6ICJtZW1vcnkiKTsKLQl9IGVsc2UgewotCQlhc20gdm9sYXRpbGUgKCJmbW92ZW0gJS9mcGlhci8lL2ZwY3IvJS9mcHNyLCUwIgotCQkJICAgICAgOgotCQkJICAgICAgOiAibSIgKGZwdS0+ZnBjbnRsWzBdKQotCQkJICAgICAgOiAibWVtb3J5Iik7Ci0JCWFzbSB2b2xhdGlsZSAoImZtb3ZlbXggJS9mcDAtJS9mcDcsJTAiCi0JCQkgICAgICA6Ci0JCQkgICAgICA6ICJtIiAoZnB1LT5mcHJlZ3NbMF0pCi0JCQkgICAgICA6ICJtZW1vcnkiKTsKKwkJLyogRmlyc3QgZHVtcCB0aGUgZnB1IGNvbnRleHQgdG8gYXZvaWQgcHJvdG9jb2wgdmlvbGF0aW9uLiAgKi8KKwkJYXNtIHZvbGF0aWxlICgiZnNhdmUgJTAiIDo6ICJtIiAoZnB1c3RhdGVbMF0pIDogIm1lbW9yeSIpOworCQlpZiAoIUNQVV9JU18wNjAgPyAhZnB1c3RhdGVbMF0gOiAhZnB1c3RhdGVbMl0pCisJCQlyZXR1cm4gMDsKKworCQlpZiAoQ1BVX0lTX0NPTERGSVJFKSB7CisJCQlhc20gdm9sYXRpbGUgKCJmbW92ZWwgJS9mcGlhciwlMFxuXHQiCisJCQkJICAgICAgImZtb3ZlbCAlL2ZwY3IsJTFcblx0IgorCQkJCSAgICAgICJmbW92ZWwgJS9mcHNyLCUyXG5cdCIKKwkJCQkgICAgICAiZm1vdmVtZCAlL2ZwMC0lL2ZwNywlMyIKKwkJCQkgICAgICA6CisJCQkJICAgICAgOiAibSIgKGZwdS0+ZnBjbnRsWzBdKSwKKwkJCQkJIm0iIChmcHUtPmZwY250bFsxXSksCisJCQkJCSJtIiAoZnB1LT5mcGNudGxbMl0pLAorCQkJCQkibSIgKGZwdS0+ZnByZWdzWzBdKQorCQkJCSAgICAgIDogIm1lbW9yeSIpOworCQl9IGVsc2UgeworCQkJYXNtIHZvbGF0aWxlICgiZm1vdmVtICUvZnBpYXIvJS9mcGNyLyUvZnBzciwlMCIKKwkJCQkgICAgICA6CisJCQkJICAgICAgOiAibSIgKGZwdS0+ZnBjbnRsWzBdKQorCQkJCSAgICAgIDogIm1lbW9yeSIpOworCQkJYXNtIHZvbGF0aWxlICgiZm1vdmVteCAlL2ZwMC0lL2ZwNywlMCIKKwkJCQkgICAgICA6CisJCQkJICAgICAgOiAibSIgKGZwdS0+ZnByZWdzWzBdKQorCQkJCSAgICAgIDogIm1lbW9yeSIpOworCQl9CiAJfQogCiAJcmV0dXJuIDE7CiB9CiBFWFBPUlRfU1lNQk9MKGR1bXBfZnB1KTsKLSNlbmRpZiAvKiBDT05GSUdfRlBVICovCiAKIHVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXBfbW0uYyBiL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXBfbW0uYwppbmRleCA1YjhlYzRkLi43YTJjMjEyIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3NldHVwX21tLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cF9tbS5jCkBAIC0xMDUsNyArMTA1LDcgQEAKICNpZmRlZiBDT05GSUdfTTY4S19MMl9DQUNIRQogdm9pZCAoKm1hY2hfbDJfZmx1c2gpIChpbnQpOwogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfSU5QVVRfTTY4S19CRUVQKSB8fCBkZWZpbmVkKENPTkZJR19JTlBVVF9NNjhLX0JFRVBfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lOUFVUX002OEtfQkVFUCkKIHZvaWQgKCptYWNoX2JlZXApKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKIEVYUE9SVF9TWU1CT0wobWFjaF9iZWVwKTsKICNlbmRpZgpAQCAtMjQ1LDcgKzI0NSw3IEBACiAJICogV2Ugc2hvdWxkIHJlYWxseSBkbyBvdXIgb3duIEZQVSBjaGVjayBhdCBzdGFydHVwLgogCSAqIFt3aGF0IGRvIHdlIGRvIHdpdGggYnVnZ3kgNjhMQzA0MHM/IGlmIHdlIGhhdmUgcHJvYmxlbXMKIAkgKiAgd2l0aCB0aGVtLCB3ZSBzaG91bGQgYWRkIGEgdGVzdCB0byBjaGVja19idWdzKCkgYmVsb3ddICovCi0jaWZuZGVmIENPTkZJR19NNjhLRlBVX0VNVV9PTkxZCisjaWYgZGVmaW5lZChDT05GSUdfRlBVKSAmJiAhZGVmaW5lZChDT05GSUdfTTY4S0ZQVV9FTVVfT05MWSkKIAkvKiBjbGVhciB0aGUgZnB1IGlmIHdlIGhhdmUgb25lICovCiAJaWYgKG02OGtfZnB1dHlwZSAmIChGUFVfNjg4ODF8RlBVXzY4ODgyfEZQVV82ODA0MHxGUFVfNjgwNjB8RlBVX0NPTERGSVJFKSkgewogCQl2b2xhdGlsZSBpbnQgemVybyA9IDA7CkBAIC0yNzQsNiArMjc0LDcgQEAKIAlzdHJuY3B5KG02OGtfY29tbWFuZF9saW5lLCBDT05GSUdfQk9PVFBBUkFNX1NUUklORywgQ0xfU0laRSk7CiAJbTY4a19jb21tYW5kX2xpbmVbQ0xfU0laRSAtIDFdID0gMDsKICNlbmRpZiAvKiBDT05GSUdfQk9PVFBBUkFNICovCisJcHJvY2Vzc191Ym9vdF9jb21tYW5kbGluZSgmbTY4a19jb21tYW5kX2xpbmVbMF0sIENMX1NJWkUpOwogCSpjbWRsaW5lX3AgPSBtNjhrX2NvbW1hbmRfbGluZTsKIAltZW1jcHkoYm9vdF9jb21tYW5kX2xpbmUsICpjbWRsaW5lX3AsIENMX1NJWkUpOwogCkBAIC0zNDEsNiArMzQyLDcgQEAKICNlbmRpZgogI2lmZGVmIENPTkZJR19DT0xERklSRQogCWNhc2UgTUFDSF9NNTRYWDoKKwljYXNlIE1BQ0hfTTU0NDFYOgogCQljb25maWdfQlNQKE5VTEwsIDApOwogCQlicmVhazsKICNlbmRpZgpAQCAtNTQ4LDcgKzU1MCw3IEBACiAKIHZvaWQgY2hlY2tfYnVncyh2b2lkKQogewotI2lmbmRlZiBDT05GSUdfTTY4S0ZQVV9FTVUKKyNpZiBkZWZpbmVkKENPTkZJR19GUFUpICYmICFkZWZpbmVkKENPTkZJR19NNjhLRlBVX0VNVSkKIAlpZiAobTY4a19mcHV0eXBlID09IDApIHsKIAkJcHJfZW1lcmcoIioqKiBZT1UgRE8gTk9UIEhBVkUgQSBGTE9BVElORyBQT0lOVCBVTklULCAiCiAJCQkiV0hJQ0ggSVMgUkVRVUlSRUQgQlkgTElOVVgvTTY4SyAqKipcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cF9uby5jIGIvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cF9uby5jCmluZGV4IDkzMDk3ODkuLjhhZmU2ZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXBfbm8uYworKysgYi9hcmNoL202OGsva2VybmVsL3NldHVwX25vLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC04Miw2OSArODMsNiBAQAogI2RlZmluZQlDUFVfSU5TVFJfUEVSX0pJRkZZCTE2CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1VCT09UKQotLyoKLSAqIHBhcnNlX3Vib290X2NvbW1hbmRsaW5lCi0gKgotICogQ29waWVzIHUtYm9vdCBjb21tYW5kbGluZSBhcmd1bWVudHMgYW5kIHN0b3JlIHRoZW0gaW4gdGhlIHByb3BlciBsaW51eAotICogdmFyaWFibGVzLgotICoKLSAqIEFzc3VtZXM6Ci0gKglfaW5pdF9zcCBnbG9iYWwgY29udGFpbnMgdGhlIGFkZHJlc3MgaW4gdGhlIHN0YWNrIHBvaW50ZXIgd2hlbiB0aGUKLSAqCWtlcm5lbCBzdGFydHMgKHNlZSBoZWFkLlM6Ol9zdGFydCkKLSAqCi0gKglVLUJvb3QgY2FsbGluZyBjb252ZW50aW9uOgotICoJKCprZXJuZWwpIChrYmQsIGluaXRyZF9zdGFydCwgaW5pdHJkX2VuZCwgY21kX3N0YXJ0LCBjbWRfZW5kKTsKLSAqCi0gKglfaW5pdF9zcCBjYW4gYmUgcGFyc2VkIGFzIHN1Y2gKLSAqCi0gKglfaW5pdF9zcCswMCA9IHUtYm9vdCBjbWQgYWZ0ZXIganNyIGludG8ga2VybmVsIChza2lwKQotICoJX2luaXRfc3ArMDQgPSAma2VybmVsIGJvYXJkX2luZm8gKHJlc2lkdWFsIGRhdGEpCi0gKglfaW5pdF9zcCswOCA9ICZpbml0cmRfc3RhcnQKLSAqCV9pbml0X3NwKzEyID0gJmluaXRyZF9lbmQKLSAqCV9pbml0X3NwKzE2ID0gJmNtZF9zdGFydAotICoJX2luaXRfc3ArMjAgPSAmY21kX2VuZAotICoKLSAqCVRoaXMgYWxzbyBhc3N1bWVzIHRoYXQgdGhlIG1lbW9yeSBsb2NhdGlvbnMgcG9pbnRlZCB0byBhcmUgc3RpbGwKLSAqCXVubW9kaWZpZWQuIFUtYm9vdCBwbGFjZXMgdGhlbSBuZWFyIHRoZSBlbmQgb2YgZXh0ZXJuYWwgU0RSQU0uCi0gKgotICogQXJndW1lbnQocyk6Ci0gKgljb21tYW5kcCA9IHRoZSBsaW51eCBjb21tYW5kbGluZSBhcmcgY29udGFpbmVyIHRvIGZpbGwuCi0gKglzaXplICAgICA9IHRoZSBzaXplb2YgY29tbWFuZHAuCi0gKgotICogUmV0dXJuczoKLSAqLwotc3RhdGljIHZvaWQgX19pbml0IHBhcnNlX3Vib290X2NvbW1hbmRsaW5lKGNoYXIgKmNvbW1hbmRwLCBpbnQgc2l6ZSkKLXsKLQlleHRlcm4gdW5zaWduZWQgbG9uZyBfaW5pdF9zcDsKLQl1bnNpZ25lZCBsb25nICpzcDsKLQl1bnNpZ25lZCBsb25nIHVib290X2tiZDsKLQl1bnNpZ25lZCBsb25nIHVib290X2luaXRyZF9zdGFydCwgdWJvb3RfaW5pdHJkX2VuZDsKLQl1bnNpZ25lZCBsb25nIHVib290X2NtZF9zdGFydCwgdWJvb3RfY21kX2VuZDsKLQotCi0Jc3AgPSAodW5zaWduZWQgbG9uZyAqKV9pbml0X3NwOwotCXVib290X2tiZCA9IHNwWzFdOwotCXVib290X2luaXRyZF9zdGFydCA9IHNwWzJdOwotCXVib290X2luaXRyZF9lbmQgPSBzcFszXTsKLQl1Ym9vdF9jbWRfc3RhcnQgPSBzcFs0XTsKLQl1Ym9vdF9jbWRfZW5kID0gc3BbNV07Ci0KLQlpZiAodWJvb3RfY21kX3N0YXJ0ICYmIHVib290X2NtZF9lbmQpCi0JCXN0cm5jcHkoY29tbWFuZHAsIChjb25zdCBjaGFyICopdWJvb3RfY21kX3N0YXJ0LCBzaXplKTsKLSNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lOSVRSRCkKLQlpZiAodWJvb3RfaW5pdHJkX3N0YXJ0ICYmIHVib290X2luaXRyZF9lbmQgJiYKLQkJKHVib290X2luaXRyZF9lbmQgPiB1Ym9vdF9pbml0cmRfc3RhcnQpKSB7Ci0JCWluaXRyZF9zdGFydCA9IHVib290X2luaXRyZF9zdGFydDsKLQkJaW5pdHJkX2VuZCA9IHVib290X2luaXRyZF9lbmQ7Ci0JCVJPT1RfREVWID0gUm9vdF9SQU0wOwotCQlwcmludGsoS0VSTl9JTkZPICJpbml0cmQgYXQgMHglbHg6MHglbHhcbiIsCi0JCQlpbml0cmRfc3RhcnQsIGluaXRyZF9lbmQpOwotCX0KLSNlbmRpZiAvKiBpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lOSVRSRCkgKi8KLX0KLSNlbmRpZiAvKiAjaWYgZGVmaW5lZChDT05GSUdfVUJPT1QpICovCi0KIHZvaWQgX19pbml0IHNldHVwX2FyY2goY2hhciAqKmNtZGxpbmVfcCkKIHsKIAlpbnQgYm9vdG1hcF9zaXplOwpAQCAtMTY0LDUzICsxMDIsMzggQEAKIAljb21tYW5kX2xpbmVbc2l6ZW9mKGNvbW1hbmRfbGluZSkgLSAxXSA9IDA7CiAjZW5kaWYgLyogQ09ORklHX0JPT1RQQVJBTSAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfVUJPT1QpCi0JLyogQ09ORklHX1VCT09UIGFuZCBDT05GSUdfQk9PVFBBUkFNIGRlZmluZWQsIGNvbmNhdGVuYXRlIGNtZGxpbmUgKi8KLQkjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBBUkFNKQotCQkvKiBBZGQgdGhlIHdoaXRlc3BhY2Ugc2VwYXJhdG9yICovCi0JCWNvbW1hbmRfbGluZVtzdHJsZW4oQ09ORklHX0JPT1RQQVJBTV9TVFJJTkcpXSA9ICcgJzsKLQkJLyogUGFyc2UgdWJvb3QgY29tbWFuZCBsaW5lIGludG8gdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlciAqLwotCQlwYXJzZV91Ym9vdF9jb21tYW5kbGluZSgKLQkJCSZjb21tYW5kX2xpbmVbKHN0cmxlbihDT05GSUdfQk9PVFBBUkFNX1NUUklORykrMSldLAotCQkJKHNpemVvZihjb21tYW5kX2xpbmUpIC0KLQkJCShzdHJsZW4oQ09ORklHX0JPT1RQQVJBTV9TVFJJTkcpKzEpKSk7Ci0JLyogT25seSBDT05GSUdfVUJPT1QgZGVmaW5lZCwgY3JlYXRlIGNtZGxpbmUgKi8KLQkjZWxzZQotCQlwYXJzZV91Ym9vdF9jb21tYW5kbGluZSgmY29tbWFuZF9saW5lWzBdLCBzaXplb2YoY29tbWFuZF9saW5lKSk7Ci0JI2VuZGlmIC8qIENPTkZJR19CT09UUEFSQU0gKi8KLQljb21tYW5kX2xpbmVbc2l6ZW9mKGNvbW1hbmRfbGluZSkgLSAxXSA9IDA7Ci0jZW5kaWYgLyogQ09ORklHX1VCT09UICovCisJcHJvY2Vzc191Ym9vdF9jb21tYW5kbGluZSgmY29tbWFuZF9saW5lWzBdLCBzaXplb2YoY29tbWFuZF9saW5lKSk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJceDBGXHJcblxudUNsaW51eC8iIENQVV9OQU1FICJcbiIpOworCXByX2luZm8oInVDbGludXggd2l0aCBDUFUgIiBDUFVfTkFNRSAiXG4iKTsKIAogI2lmZGVmIENPTkZJR19VQ0RJTU0KLQlwcmludGsoS0VSTl9JTkZPICJ1Q2RpbW0gYnkgTGluZW8sIEluYy4gPHd3dy5saW5lby5jb20+XG4iKTsKKwlwcl9pbmZvKCJ1Q2RpbW0gYnkgTGluZW8sIEluYy4gPHd3dy5saW5lby5jb20+XG4iKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19NNjhWWjMyOAotCXByaW50ayhLRVJOX0lORk8gIk02OFZaMzI4IHN1cHBvcnQgYnkgRXZhbiBTdGF3bnljenkgPGVAbGluZW8uY2E+XG4iKTsKKwlwcl9pbmZvKCJNNjhWWjMyOCBzdXBwb3J0IGJ5IEV2YW4gU3Rhd255Y3p5IDxlQGxpbmVvLmNhPlxuIik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQ09MREZJUkUKLQlwcmludGsoS0VSTl9JTkZPICJDT0xERklSRSBwb3J0IGRvbmUgYnkgR3JlZyBVbmdlcmVyLCBnZXJnQHNuYXBnZWFyLmNvbVxuIik7CisJcHJfaW5mbygiQ09MREZJUkUgcG9ydCBkb25lIGJ5IEdyZWcgVW5nZXJlciwgZ2VyZ0BzbmFwZ2Vhci5jb21cbiIpOwogI2lmZGVmIENPTkZJR19NNTMwNwotCXByaW50ayhLRVJOX0lORk8gIk1vZGlmaWVkIGZvciBNNTMwNyBieSBEYXZlIE1pbGxlciwgZG1pbGxlckBpbnRlbGxpc3Rvci5jb21cbiIpOworCXByX2luZm8oIk1vZGlmaWVkIGZvciBNNTMwNyBieSBEYXZlIE1pbGxlciwgZG1pbGxlckBpbnRlbGxpc3Rvci5jb21cbiIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0VMSVRFCi0JcHJpbnRrKEtFUk5fSU5GTyAiTW9kaWZpZWQgZm9yIE01MjA2ZUxJVEUgYnkgUm9iIFNjb3R0LCByc2NvdHRAbXRyb2IuZmRucy5uZXRcbiIpOworCXByX2luZm8oIk1vZGlmaWVkIGZvciBNNTIwNmVMSVRFIGJ5IFJvYiBTY290dCwgcnNjb3R0QG10cm9iLmZkbnMubmV0XG4iKTsKICNlbmRpZgogI2VuZGlmCi0JcHJpbnRrKEtFUk5fSU5GTyAiRmxhdCBtb2RlbCBzdXBwb3J0IChDKSAxOTk4LDE5OTkgS2VubmV0aCBBbGJhbm93c2tpLCBELiBKZWZmIERpb25uZVxuIik7CisJcHJfaW5mbygiRmxhdCBtb2RlbCBzdXBwb3J0IChDKSAxOTk4LDE5OTkgS2VubmV0aCBBbGJhbm93c2tpLCBELiBKZWZmIERpb25uZVxuIik7CiAKICNpZiBkZWZpbmVkKCBDT05GSUdfUElMT1QgKSAmJiBkZWZpbmVkKCBDT05GSUdfTTY4MzI4ICkKLQlwcmludGsoS0VSTl9JTkZPICJUUkcgU3VwZXJQaWxvdCBGTEFTSCBjYXJkIHN1cHBvcnQgPGluZm9AdHJnbmV0LmNvbT5cbiIpOworCXByX2luZm8oIlRSRyBTdXBlclBpbG90IEZMQVNIIGNhcmQgc3VwcG9ydCA8aW5mb0B0cmduZXQuY29tPlxuIik7CiAjZW5kaWYKICNpZiBkZWZpbmVkKCBDT05GSUdfUElMT1QgKSAmJiBkZWZpbmVkKCBDT05GSUdfTTY4RVozMjggKQotCXByaW50ayhLRVJOX0lORk8gIlBhbG1WIHN1cHBvcnQgYnkgTGluZW8gSW5jLiA8amVmZkB1Y2xpbnV4LmNvbT5cbiIpOworCXByX2luZm8oIlBhbG1WIHN1cHBvcnQgYnkgTGluZW8gSW5jLiA8amVmZkB1Y2xpbnV4LmNvbT5cbiIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0RSQUdFTjIKLQlwcmludGsoS0VSTl9JTkZPICJEcmFnb25FbmdpbmUgSUkgYm9hcmQgc3VwcG9ydCBieSBHZW9yZ2VzIE1lbmllXG4iKTsKKwlwcl9pbmZvKCJEcmFnb25FbmdpbmUgSUkgYm9hcmQgc3VwcG9ydCBieSBHZW9yZ2VzIE1lbmllXG4iKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19NNTIzNUVWQgotCXByaW50ayhLRVJOX0lORk8gIk1vdG9yb2xhIE01MjM1RVZCIHN1cHBvcnQgKEMpMjAwNSBTeW4tdGVjaCBTeXN0ZW1zLCBJbmMuIChKYXRlIFN1amphdmFuaWNoKVxuIik7CisJcHJfaW5mbygiTW90b3JvbGEgTTUyMzVFVkIgc3VwcG9ydCAoQykyMDA1IFN5bi10ZWNoIFN5c3RlbXMsIEluYy4gKEphdGUgU3VqamF2YW5pY2gpXG4iKTsKICNlbmRpZgogCiAJcHJfZGVidWcoIktFUk5FTCAtPiBURVhUPTB4JXAtMHglcCBEQVRBPTB4JXAtMHglcCBCU1M9MHglcC0weCVwXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvbTY4ay9rZXJuZWwvc2lnbmFsLmMKaW5kZXggOTIwMmY4Mi4uNTg1MDdlZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL202OGsva2VybmVsL3NpZ25hbC5jCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RyYWNlaG9vay5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3Vib290LmMgYi9hcmNoL202OGsva2VybmVsL3Vib290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1MzZhOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvdWJvb3QuYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIHVib290LmMgLS0gdWJvb3QgYXJndW1lbnRzIHN1cHBvcnQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorCisvKgorICogcGFyc2VfdWJvb3RfY29tbWFuZGxpbmUKKyAqCisgKiBDb3BpZXMgdS1ib290IGNvbW1hbmRsaW5lIGFyZ3VtZW50cyBhbmQgc3RvcmUgdGhlbSBpbiB0aGUgcHJvcGVyIGxpbnV4CisgKiB2YXJpYWJsZXMuCisgKgorICogQXNzdW1lczoKKyAqCV9pbml0X3NwIGdsb2JhbCBjb250YWlucyB0aGUgYWRkcmVzcyBpbiB0aGUgc3RhY2sgcG9pbnRlciB3aGVuIHRoZQorICoJa2VybmVsIHN0YXJ0cyAoc2VlIGhlYWQuUzo6X3N0YXJ0KQorICoKKyAqCVUtQm9vdCBjYWxsaW5nIGNvbnZlbnRpb246CisgKgkoKmtlcm5lbCkgKGtiZCwgaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kLCBjbWRfc3RhcnQsIGNtZF9lbmQpOworICoKKyAqCV9pbml0X3NwIGNhbiBiZSBwYXJzZWQgYXMgc3VjaAorICoKKyAqCV9pbml0X3NwKzAwID0gdS1ib290IGNtZCBhZnRlciBqc3IgaW50byBrZXJuZWwgKHNraXApCisgKglfaW5pdF9zcCswNCA9ICZrZXJuZWwgYm9hcmRfaW5mbyAocmVzaWR1YWwgZGF0YSkKKyAqCV9pbml0X3NwKzA4ID0gJmluaXRyZF9zdGFydAorICoJX2luaXRfc3ArMTIgPSAmaW5pdHJkX2VuZAorICoJX2luaXRfc3ArMTYgPSAmY21kX3N0YXJ0CisgKglfaW5pdF9zcCsyMCA9ICZjbWRfZW5kCisgKgorICoJVGhpcyBhbHNvIGFzc3VtZXMgdGhhdCB0aGUgbWVtb3J5IGxvY2F0aW9ucyBwb2ludGVkIHRvIGFyZSBzdGlsbAorICoJdW5tb2RpZmllZC4gVS1ib290IHBsYWNlcyB0aGVtIG5lYXIgdGhlIGVuZCBvZiBleHRlcm5hbCBTRFJBTS4KKyAqCisgKiBBcmd1bWVudChzKToKKyAqCWNvbW1hbmRwID0gdGhlIGxpbnV4IGNvbW1hbmRsaW5lIGFyZyBjb250YWluZXIgdG8gZmlsbC4KKyAqCXNpemUgICAgID0gdGhlIHNpemVvZiBjb21tYW5kcC4KKyAqCisgKiBSZXR1cm5zOgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgcGFyc2VfdWJvb3RfY29tbWFuZGxpbmUoY2hhciAqY29tbWFuZHAsIGludCBzaXplKQoreworCWV4dGVybiB1bnNpZ25lZCBsb25nIF9pbml0X3NwOworCXVuc2lnbmVkIGxvbmcgKnNwOworCXVuc2lnbmVkIGxvbmcgdWJvb3Rfa2JkOworCXVuc2lnbmVkIGxvbmcgdWJvb3RfaW5pdHJkX3N0YXJ0LCB1Ym9vdF9pbml0cmRfZW5kOworCXVuc2lnbmVkIGxvbmcgdWJvb3RfY21kX3N0YXJ0LCB1Ym9vdF9jbWRfZW5kOworCisJc3AgPSAodW5zaWduZWQgbG9uZyAqKV9pbml0X3NwOworCXVib290X2tiZCA9IHNwWzFdOworCXVib290X2luaXRyZF9zdGFydCA9IHNwWzJdOworCXVib290X2luaXRyZF9lbmQgPSBzcFszXTsKKwl1Ym9vdF9jbWRfc3RhcnQgPSBzcFs0XTsKKwl1Ym9vdF9jbWRfZW5kID0gc3BbNV07CisKKwlpZiAodWJvb3RfY21kX3N0YXJ0ICYmIHVib290X2NtZF9lbmQpCisJCXN0cm5jcHkoY29tbWFuZHAsIChjb25zdCBjaGFyICopdWJvb3RfY21kX3N0YXJ0LCBzaXplKTsKKyNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lOSVRSRCkKKwlpZiAodWJvb3RfaW5pdHJkX3N0YXJ0ICYmIHVib290X2luaXRyZF9lbmQgJiYKKwkgICAgKHVib290X2luaXRyZF9lbmQgPiB1Ym9vdF9pbml0cmRfc3RhcnQpKSB7CisJCWluaXRyZF9zdGFydCA9IHVib290X2luaXRyZF9zdGFydDsKKwkJaW5pdHJkX2VuZCA9IHVib290X2luaXRyZF9lbmQ7CisJCVJPT1RfREVWID0gUm9vdF9SQU0wOworCQlwcmludGsoS0VSTl9JTkZPICJpbml0cmQgYXQgMHglbHg6MHglbHhcbiIsCisJCQlpbml0cmRfc3RhcnQsIGluaXRyZF9lbmQpOworCX0KKyNlbmRpZiAvKiBpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lOSVRSRCkgKi8KK30KKworX19pbml0IHZvaWQgcHJvY2Vzc191Ym9vdF9jb21tYW5kbGluZShjaGFyICpjb21tYW5kcCwgaW50IHNpemUpCit7CisJaW50IGxlbiwgbjsKKworCW4gPSBzdHJubGVuKGNvbW1hbmRwLCBzaXplKTsKKwljb21tYW5kcCArPSBuOworCWxlbiA9IHNpemUgLSBuOworCWlmIChsZW4pIHsKKwkJLyogQWRkIHRoZSB3aGl0ZXNwYWNlIHNlcGFyYXRvciAqLworCQkqY29tbWFuZHArKyA9ICcgJzsKKwkJbGVuLS07CisJfQorCisJcGFyc2VfdWJvb3RfY29tbWFuZGxpbmUoY29tbWFuZHAsIGxlbik7CisJY29tbWFuZHBbc2l6ZSAtIDFdID0gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYWMvY29uZmlnLmMgYi9hcmNoL202OGsvbWFjL2NvbmZpZy5jCmluZGV4IDJmMzNhMzMuLmU0Njg5NTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYWMvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL21hYy9jb25maWcuYwpAQCAtMTYyLDcgKzE2Miw3IEBACiAJbWFjaF9oYWx0ID0gbWFjX3Bvd2Vyb2ZmOwogCW1hY2hfcG93ZXJfb2ZmID0gbWFjX3Bvd2Vyb2ZmOwogCW1hY2hfbWF4X2RtYV9hZGRyZXNzID0gMHhmZmZmZmZmZjsKLSNpZiBkZWZpbmVkKENPTkZJR19JTlBVVF9NNjhLX0JFRVApIHx8IGRlZmluZWQoQ09ORklHX0lOUFVUX002OEtfQkVFUF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSU5QVVRfTTY4S19CRUVQKQogCW1hY2hfYmVlcCA9IG1hY19ta3NvdW5kOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tbS9tY2ZtbXUuYyBiL2FyY2gvbTY4ay9tbS9tY2ZtbXUuYwppbmRleCBmNThmYWZlLi44NzEzMWNkIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbW0vbWNmbW11LmMKKysrIGIvYXJjaC9tNjhrL21tL21jZm1tdS5jCkBAIC0yNyw3ICsyNyw3IEBACiB1bnNpZ25lZCBsb25nIGNvbnRleHRfbWFwW0xBU1RfQ09OVEVYVCAvIEJJVFNfUEVSX0xPTkcgKyAxXTsKIGF0b21pY190IG5yX2ZyZWVfY29udGV4dHM7CiBzdHJ1Y3QgbW1fc3RydWN0ICpjb250ZXh0X21tW0xBU1RfQ09OVEVYVCsxXTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIG51bV9wYWdlczsKK3Vuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzOwogCiAvKgogICogQ29sZEZpcmUgcGFnaW5nX2luaXQgZGVyaXZlZCBmcm9tIHN1bjMuCkBAIC0xNTAsNiArMTUwLDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgX19pbml0IGNmX2Jvb3RtZW1fYWxsb2Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbjsKKwl1bnNpZ25lZCBsb25nIG1lbXN0YXJ0OworCisJLyogX3JhbWJhc2UgYW5kIF9yYW1lbmQgd2lsbCBiZSBuYXR1cmFsbHkgcGFnZSBhbGlnbmVkICovCisJbTY4a19tZW1vcnlbMF0uYWRkciA9IF9yYW1iYXNlOworCW02OGtfbWVtb3J5WzBdLnNpemUgPSBfcmFtZW5kIC0gX3JhbWJhc2U7CisKKwkvKiBjb21wdXRlIHRvdGFsIHBhZ2VzIGluIHN5c3RlbSAqLworCW51bV9wYWdlcyA9IFBGTl9ET1dOKF9yYW1lbmQgLSBfcmFtYmFzZSk7CisKKwkvKiBwYWdlIG51bWJlcnMgKi8KKwltZW1zdGFydCA9IFBBR0VfQUxJR04oX3JhbXN0YXJ0KTsKKwltaW5fbG93X3BmbiA9IFBGTl9ET1dOKF9yYW1iYXNlKTsKKwlzdGFydF9wZm4gPSBQRk5fRE9XTihtZW1zdGFydCk7CisJbWF4X3BmbiA9IG1heF9sb3dfcGZuID0gUEZOX0RPV04oX3JhbWVuZCk7CisJaGlnaF9tZW1vcnkgPSAodm9pZCAqKV9yYW1lbmQ7CisKKwltNjhrX3ZpcnRfdG9fbm9kZV9zaGlmdCA9IGZscyhfcmFtZW5kIC0gX3JhbWJhc2UgLSAxKSAtIDY7CisJbW9kdWxlX2ZpeHVwKE5VTEwsIF9fc3RhcnRfZml4dXAsIF9fc3RvcF9maXh1cCk7CisKKwkvKiBzZXR1cCBib290bWVtIGRhdGEgKi8KKwltNjhrX3NldHVwX25vZGUoMCk7CisJbWVtc3RhcnQgKz0gaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCBzdGFydF9wZm4sCisJCW1pbl9sb3dfcGZuLCBtYXhfbG93X3Bmbik7CisJZnJlZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCBtZW1zdGFydCwgX3JhbWVuZCAtIG1lbXN0YXJ0KTsKK30KKwogLyoKICAqIEluaXRpYWxpemUgdGhlIGNvbnRleHQgbWFuYWdlbWVudCBzdHVmZi4KICAqIFRoZSBmb2xsb3dpbmcgd2FzIHRha2VuIGZyb20gYXJjaC9wcGMvbW11X2NvbnRleHQuYwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3E0MC9jb25maWcuYyBiL2FyY2gvbTY4ay9xNDAvY29uZmlnLmMKaW5kZXggZmNiN2YwNS4uZWE4OWEyNCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3E0MC9jb25maWcuYworKysgYi9hcmNoL202OGsvcTQwL2NvbmZpZy5jCkBAIC0xODAsNyArMTgwLDcgQEAKIAltYWNoX3Jlc2V0ID0gcTQwX3Jlc2V0OwogCW1hY2hfZ2V0X21vZGVsID0gcTQwX2dldF9tb2RlbDsKIAotI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUX002OEtfQkVFUCkgfHwgZGVmaW5lZChDT05GSUdfSU5QVVRfTTY4S19CRUVQX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JTlBVVF9NNjhLX0JFRVApCiAJbWFjaF9iZWVwID0gcTQwX21rc291bmQ7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCmRpZmYgLS1naXQgYS9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvbWV0YWcvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDgyODJjYmMuLjI3M2U2MTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWV0YWcvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvbWV0YWcvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0yMDQsOCArMjA0LDkgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwogY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7Ci0JaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpCisJaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKSkKIAkJcmV0dXJuIF9fY29weV91c2VyX3plcm9pbmcodG8sIGZyb20sIG4pOworCW1lbXNldCh0bywgMCwgbik7CiAJcmV0dXJuIG47CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDMzMWIwZDMuLjgyNjY3NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMjI3LDcgKzIyNyw3IEBACiAKICNkZWZpbmUgX19nZXRfdXNlcih4LCBwdHIpCQkJCQkJXAogKHsJCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyBfX2d1X3ZhbDsJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBfX2d1X3ZhbCA9IDA7CQkJCQlcCiAJLyp1bnNpZ25lZCBsb25nIF9fZ3VfcHRyID0gKHVuc2lnbmVkIGxvbmcpKHB0cik7Ki8JCVwKIAlsb25nIF9fZ3VfZXJyOwkJCQkJCQlcCiAJc3dpdGNoIChzaXplb2YoKihwdHIpKSkgewkJCQkJXApAQCAtMzczLDEwICszNzMsMTMgQEAKIHN0YXRpYyBpbmxpbmUgbG9uZyBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywKIAkJY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKKwl1bnNpZ25lZCBsb25nIHJlcyA9IG47CiAJbWlnaHRfZmF1bHQoKTsKLQlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkKLQkJcmV0dXJuIF9fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOwotCXJldHVybiBuOworCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkpCisJCXJlcyA9IF9fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOworCWlmICh1bmxpa2VseShyZXMpKQorCQltZW1zZXQodG8gKyAobiAtIHJlcyksIDAsIHJlcyk7CisJcmV0dXJuIHJlczsKIH0KIAogI2RlZmluZSBfX2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbikJXApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZnRyYWNlLmMKaW5kZXggZmM3YjQ4YS4uZDU3NTYzYyAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2Z0cmFjZS5jCkBAIC02Myw3ICs2Myw3IEBACiAJCXJldHVybjsKIAl9CiAKLQllcnIgPSBmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2Uob2xkLCBzZWxmX2FkZHIsICZ0cmFjZS5kZXB0aCwgMCk7CisJZXJyID0gZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKG9sZCwgc2VsZl9hZGRyLCAmdHJhY2UuZGVwdGgsIDAsIE5VTEwpOwogCWlmIChlcnIgPT0gLUVCVVNZKSB7CiAJCSpwYXJlbnQgPSBvbGQ7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9LY29uZmlnIGIvYXJjaC9taXBzL0tjb25maWcKaW5kZXggMjYzODg1Ni4uMjEyZmY5MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL0tjb25maWcKKysrIGIvYXJjaC9taXBzL0tjb25maWcKQEAgLTY1LDYgKzY1LDcgQEAKIAlzZWxlY3QgQVJDSF9DTE9DS1NPVVJDRV9EQVRBCiAJc2VsZWN0IEhBTkRMRV9ET01BSU5fSVJRCiAJc2VsZWN0IEhBVkVfRVhJVF9USFJFQUQKKwlzZWxlY3QgSEFWRV9SRUdTX0FORF9TVEFDS19BQ0NFU1NfQVBJCiAKIG1lbnUgIk1hY2hpbmUgc2VsZWN0aW9uIgogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvbWlwcy9LY29uZmlnLmRlYnVnCmluZGV4IGYwZTMxNGMuLjdmOTc1YjIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvbWlwcy9LY29uZmlnLmRlYnVnCkBAIC0xMTMsNDIgKzExMyw2IEBACiAJaGVscAogCSAgQWRkIHNldmVyYWwgZmlsZXMgdG8gdGhlIGRlYnVnZnMgdG8gdGVzdCBzcGlubG9jayBzcGVlZC4KIAotaWYgQ1BVX01JUFNSNgotCi1jaG9pY2UKLQlwcm9tcHQgIkNvbXBhY3QgYnJhbmNoIHBvbGljeSIKLQlkZWZhdWx0IE1JUFNfQ09NUEFDVF9CUkFOQ0hFU19PUFRJTUFMCi0KLWNvbmZpZyBNSVBTX0NPTVBBQ1RfQlJBTkNIRVNfTkVWRVIKLQlib29sICJOZXZlciAoZm9yY2UgZGVsYXkgc2xvdCBicmFuY2hlcykiCi0JaGVscAotCSAgUGFzcyB0aGUgLW1jb21wYWN0LWJyYW5jaGVzPW5ldmVyIGZsYWcgdG8gdGhlIGNvbXBpbGVyIGluIG9yZGVyIHRvCi0JICBmb3JjZSBpdCB0byBhbHdheXMgZW1pdCBicmFuY2hlcyB3aXRoIGRlbGF5IHNsb3RzLCBhbmQgbWFrZSBubyB1c2UKLQkgIG9mIHRoZSBjb21wYWN0IGJyYW5jaCBpbnN0cnVjdGlvbnMgaW50cm9kdWNlZCBieSBNSVBTcjYuIFRoaXMgaXMKLQkgIHVzZWZ1bCBpZiB5b3Ugc3VzcGVjdCB0aGVyZSBtYXkgYmUgYW4gaXNzdWUgd2l0aCBjb21wYWN0IGJyYW5jaGVzIGluCi0JICBlaXRoZXIgdGhlIGNvbXBpbGVyIG9yIHRoZSBDUFUuCi0KLWNvbmZpZyBNSVBTX0NPTVBBQ1RfQlJBTkNIRVNfT1BUSU1BTAotCWJvb2wgIk9wdGltYWwgKHVzZSB3aGVyZSBiZW5lZmljaWFsKSIKLQloZWxwCi0JICBQYXNzIHRoZSAtbWNvbXBhY3QtYnJhbmNoZXM9b3B0aW1hbCBmbGFnIHRvIHRoZSBjb21waWxlciBpbiBvcmRlciBmb3IKLQkgIGl0IHRvIG1ha2UgdXNlIG9mIGNvbXBhY3QgYnJhbmNoIGluc3RydWN0aW9ucyB3aGVyZSBpdCBkZWVtcyB0aGVtCi0JICBiZW5lZmljaWFsLCBhbmQgdXNlIGJyYW5jaGVzIHdpdGggZGVsYXkgc2xvdHMgZWxzZXdoZXJlLiBUaGlzIGlzIHRoZQotCSAgZGVmYXVsdCBjb21waWxlciBiZWhhdmlvdXIsIGFuZCBzaG91bGQgYmUgdXNlZCB1bmxlc3MgeW91IGhhdmUgYQotCSAgcmVhc29uIHRvIGNob29zZSBvdGhlcndpc2UuCi0KLWNvbmZpZyBNSVBTX0NPTVBBQ1RfQlJBTkNIRVNfQUxXQVlTCi0JYm9vbCAiQWx3YXlzIChmb3JjZSBjb21wYWN0IGJyYW5jaGVzKSIKLQloZWxwCi0JICBQYXNzIHRoZSAtbWNvbXBhY3QtYnJhbmNoZXM9YWx3YXlzIGZsYWcgdG8gdGhlIGNvbXBpbGVyIGluIG9yZGVyIHRvCi0JICBmb3JjZSBpdCB0byBhbHdheXMgZW1pdCBjb21wYWN0IGJyYW5jaGVzLCBtYWtpbmcgbm8gdXNlIG9mIGJyYW5jaAotCSAgaW5zdHJ1Y3Rpb25zIHdpdGggZGVsYXkgc2xvdHMuIFRoaXMgY2FuIHJlc3VsdCBpbiBtb3JlIGNvbXBhY3QgY29kZQotCSAgd2hpY2ggbWF5IGJlIGJlbmVmaWNpYWwgaW4gc29tZSBzY2VuYXJpb3MuCi0KLWVuZGNob2ljZQotCi1lbmRpZiAjIENQVV9NSVBTUjYKLQogY29uZmlnIFNDQUNIRV9ERUJVR0ZTCiAJYm9vbCAiTDIgY2FjaGUgZGVidWdmcyBlbnRyaWVzIgogCWRlcGVuZHMgb24gREVCVUdfRlMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9NYWtlZmlsZQppbmRleCBlZmQ3YTlkLi41OThhYjI5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL01ha2VmaWxlCkBAIC0yMDMsMTAgKzIwMyw2IEBACiB0b29sY2hhaW4tdmlydAkJCQk6PSAkKGNhbGwgY2Mtb3B0aW9uLXluLCQobWlwcy1jZmxhZ3MpIC1tdmlydCkKIGNmbGFncy0kKHRvb2xjaGFpbi12aXJ0KQkJKz0gLURUT09MQ0hBSU5fU1VQUE9SVFNfVklSVAogCi1jZmxhZ3MtJChDT05GSUdfTUlQU19DT01QQUNUX0JSQU5DSEVTX05FVkVSKQkrPSAtbWNvbXBhY3QtYnJhbmNoZXM9bmV2ZXIKLWNmbGFncy0kKENPTkZJR19NSVBTX0NPTVBBQ1RfQlJBTkNIRVNfT1BUSU1BTCkJKz0gLW1jb21wYWN0LWJyYW5jaGVzPW9wdGltYWwKLWNmbGFncy0kKENPTkZJR19NSVBTX0NPTVBBQ1RfQlJBTkNIRVNfQUxXQVlTKQkrPSAtbWNvbXBhY3QtYnJhbmNoZXM9YWx3YXlzCi0KICMKICMgRmlybXdhcmUgc3VwcG9ydAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F0aDc5L2Nsb2NrLmMgYi9hcmNoL21pcHMvYXRoNzkvY2xvY2suYwppbmRleCAyZTczNzg0Li5jYzNhMWUzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYXRoNzkvY2xvY2suYworKysgYi9hcmNoL21pcHMvYXRoNzkvY2xvY2suYwpAQCAtOTYsNyArOTYsNyBAQAogCXN0cnVjdCBjbGsgKmNsazsKIAogCWNsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgbmFtZSwgcGFyZW50X25hbWUsIDAsIG11bHQsIGRpdik7Ci0JaWYgKCFjbGspCisJaWYgKElTX0VSUihjbGspKQogCQlwYW5pYygiZmFpbGVkIHRvIGFsbG9jYXRlICVzIGNsb2NrIHN0cnVjdHVyZSIsIG5hbWUpOwogCiAJcmV0dXJuIGNsazsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL29jdGVvbi1pcnEuYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL29jdGVvbi1pcnEuYwppbmRleCA1YTliODdiLi5jMWViMWZmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24taXJxLmMKKysrIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLWlycS5jCkBAIC0xNjE5LDYgKzE2MTksMTIgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJLyoKKwkgKiBDbGVhciB0aGUgT0ZfUE9QVUxBVEVEIGZsYWcgdGhhdCB3YXMgc2V0IGJ5IG9mX2lycV9pbml0KCkKKwkgKiBzbyB0aGF0IGFsbCBHUElPIGRldmljZXMgd2lsbCBiZSBwcm9iZWQuCisJICovCisJb2Zfbm9kZV9jbGVhcl9mbGFnKGdwaW9fbm9kZSwgT0ZfUE9QVUxBVEVEKTsKKwogCXJldHVybiAwOwogfQogLyoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL29jdGVvbi1wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLXBsYXRmb3JtLmMKaW5kZXggYjMxZmJjOS4uMzdhOTMyZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLXBsYXRmb3JtLmMKKysrIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLXBsYXRmb3JtLmMKQEAgLTEwNTksNyArMTA1OSw3IEBACiB7CiAJcmV0dXJuIG9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBvY3Rlb25faWRzLCBOVUxMKTsKIH0KLWRldmljZV9pbml0Y2FsbChvY3Rlb25fcHVibGlzaF9kZXZpY2VzKTsKK2FyY2hfaW5pdGNhbGwob2N0ZW9uX3B1Ymxpc2hfZGV2aWNlcyk7CiAKIE1PRFVMRV9BVVRIT1IoIkRhdmlkIERhbmV5IDxkZGFuZXlAY2F2aXVtbmV0d29ya3MuY29tPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vc21wLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zbXAuYwppbmRleCA0ZDQ1N2Q2MC4uMjU2ZmU2ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vc21wLmMKKysrIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vc21wLmMKQEAgLTM4MCwyOSArMzgwLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb2N0ZW9uX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKLQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKLXsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKLQotCXN3aXRjaCAoYWN0aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pIHsKLQljYXNlIENQVV9VUF9QUkVQQVJFOgotCQlvY3Rlb25fdXBkYXRlX2Jvb3RfdmVjdG9yKGNwdSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX09OTElORToKLQkJcHJfaW5mbygiQ3B1ICVkIG9ubGluZVxuIiwgY3B1KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfREVBRDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQogc3RhdGljIGludCByZWdpc3Rlcl9jYXZpdW1fbm90aWZpZXIodm9pZCkKIHsKLQlob3RjcHVfbm90aWZpZXIob2N0ZW9uX2NwdV9jYWxsYmFjaywgMCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfTUlQU19TT0NfUFJFUEFSRSwKKwkJCQkJICJtaXBzL2Nhdml1bTpwcmVwYXJlIiwKKwkJCQkJIG9jdGVvbl91cGRhdGVfYm9vdF92ZWN0b3IsIE5VTEwpOwogfQogbGF0ZV9pbml0Y2FsbChyZWdpc3Rlcl9jYXZpdW1fbm90aWZpZXIpOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZGVjL2ludC1oYW5kbGVyLlMgYi9hcmNoL21pcHMvZGVjL2ludC1oYW5kbGVyLlMKaW5kZXggZDdiOTkxOC4uMTkxMDIyMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2RlYy9pbnQtaGFuZGxlci5TCisrKyBiL2FyY2gvbWlwcy9kZWMvaW50LWhhbmRsZXIuUwpAQCAtMTQ2LDcgKzE0NiwyNSBAQAogCQkvKgogCQkgKiBGaW5kIGlycSB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkKIAkJICovCi0JCSBQVFJfTEEJdDEsY3B1X21hc2tfbnJfdGJsCisJCSMgb3BlbiBjb2RlZCBQVFJfTEEgdDEsIGNwdV9tYXNrX25yX3RibAorI2lmIChfTUlQU19TWlBUUiA9PSAzMikKKwkJIyBvcGVuIGNvZGVkIGxhIHQxLCBjcHVfbWFza19ucl90YmwKKwkJbHVpCXQxLCAlaGkoY3B1X21hc2tfbnJfdGJsKQorCQlhZGRpdQl0MSwgJWxvKGNwdV9tYXNrX25yX3RibCkKKworI2VuZGlmCisjaWYgKF9NSVBTX1NaUFRSID09IDY0KQorCQkjIG9wZW4gY29kZWQgZGxhIHQxLCBjcHVfbWFza19ucl90YmwKKwkJLnNldAlwdXNoCisJCS5zZXQJbm9hdAorCQlsdWkJdDEsICVoaWdoZXN0KGNwdV9tYXNrX25yX3RibCkKKwkJbHVpCUFULCAlaGkoY3B1X21hc2tfbnJfdGJsKQorCQlkYWRkaXUJdDEsIHQxLCAlaGlnaGVyKGNwdV9tYXNrX25yX3RibCkKKwkJZGFkZGl1CUFULCBBVCwgJWxvKGNwdV9tYXNrX25yX3RibCkKKwkJZHNsbAl0MSwgMzIKKwkJZGFkZHUJdDEsIHQxLCBBVAorCQkuc2V0CXBvcAorI2VuZGlmCiAxOgkJbHcJdDIsKHQxKQogCQlub3AKIAkJYW5kCXQyLHQwCkBAIC0xOTUsNyArMjEzLDI1IEBACiAJCS8qCiAJCSAqIEZpbmQgaXJxIHdpdGggaGlnaGVzdCBwcmlvcml0eQogCQkgKi8KLQkJIFBUUl9MQQl0MSxhc2ljX21hc2tfbnJfdGJsCisJCSMgb3BlbiBjb2RlZCBQVFJfTEEgdDEsYXNpY19tYXNrX25yX3RibAorI2lmIChfTUlQU19TWlBUUiA9PSAzMikKKwkJIyBvcGVuIGNvZGVkIGxhIHQxLCBhc2ljX21hc2tfbnJfdGJsCisJCWx1aQl0MSwgJWhpKGFzaWNfbWFza19ucl90YmwpCisJCWFkZGl1CXQxLCAlbG8oYXNpY19tYXNrX25yX3RibCkKKworI2VuZGlmCisjaWYgKF9NSVBTX1NaUFRSID09IDY0KQorCQkjIG9wZW4gY29kZWQgZGxhIHQxLCBhc2ljX21hc2tfbnJfdGJsCisJCS5zZXQJcHVzaAorCQkuc2V0CW5vYXQKKwkJbHVpCXQxLCAlaGlnaGVzdChhc2ljX21hc2tfbnJfdGJsKQorCQlsdWkJQVQsICVoaShhc2ljX21hc2tfbnJfdGJsKQorCQlkYWRkaXUJdDEsIHQxLCAlaGlnaGVyKGFzaWNfbWFza19ucl90YmwpCisJCWRhZGRpdQlBVCwgQVQsICVsbyhhc2ljX21hc2tfbnJfdGJsKQorCQlkc2xsCXQxLCAzMgorCQlkYWRkdQl0MSwgdDEsIEFUCisJCS5zZXQJcG9wCisjZW5kaWYKIDI6CQlsdwl0MiwodDEpCiAJCW5vcAogCQlhbmQJdDIsdDAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc21tYWNyby5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbW1hY3JvLmgKaW5kZXggNTY1ODRhNi4uODMwNTRmNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbW1hY3JvLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbW1hY3JvLmgKQEAgLTE1Nyw2ICsxNTcsNyBAQAogCWxkYzEJJGYyOCwgVEhSRUFEX0ZQUjI4KFx0aHJlYWQpCiAJbGRjMQkkZjMwLCBUSFJFQURfRlBSMzAoXHRocmVhZCkKIAljdGMxCVx0bXAsIGZjcjMxCisJLnNldAlwb3AKIAkuZW5kbQogCiAJLm1hY3JvCWZwdV9yZXN0b3JlXzE2b2RkIHRocmVhZApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtY2F2aXVtLW9jdGVvbi9tYW5nbGUtcG9ydC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtY2F2aXVtLW9jdGVvbi9tYW5nbGUtcG9ydC5oCmluZGV4IDBjZjVhYzEuLjhmZjJjYmRmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uL21hbmdsZS1wb3J0LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtY2F2aXVtLW9jdGVvbi9tYW5nbGUtcG9ydC5oCkBAIC0xNSw4ICsxNSw4IEBACiBzdGF0aWMgaW5saW5lIGJvb2wgX19zaG91bGRfc3dpenpsZV9iaXRzKHZvbGF0aWxlIHZvaWQgKmEpCiB7CiAJZXh0ZXJuIGNvbnN0IGJvb2wgb2N0ZW9uX3Nob3VsZF9zd2l6emxlX3RhYmxlW107CisJdTY0IGRpZCA9ICgodTY0KSh1aW50cHRyX3QpYSA+PiA0MCkgJiAweGZmOwogCi0JdW5zaWduZWQgbG9uZyBkaWQgPSAoKHVuc2lnbmVkIGxvbmcpYSA+PiA0MCkgJiAweGZmOwogCXJldHVybiBvY3Rlb25fc2hvdWxkX3N3aXp6bGVfdGFibGVbZGlkXTsKIH0KIApAQCAtMjksNyArMjksNyBAQAogCiAjZGVmaW5lIF9fc2hvdWxkX3N3aXp6bGVfYml0cyhhKQlmYWxzZQogCi1zdGF0aWMgaW5saW5lIGJvb2wgX19zaG91bGRfc3dpenpsZV9hZGRyKHVuc2lnbmVkIGxvbmcgcCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX3Nob3VsZF9zd2l6emxlX2FkZHIodTY0IHApCiB7CiAJLyogYm9vdCBidXM/ICovCiAJcmV0dXJuICgocCA+PiA0MCkgJiAweGZmKSA9PSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcGFyYXZpcnQva2VybmVsLWVudHJ5LWluaXQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBhcmF2aXJ0L2tlcm5lbC1lbnRyeS1pbml0LmgKaW5kZXggMmY4MmJmYS4uYzlmNTc2OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcGFyYXZpcnQva2VybmVsLWVudHJ5LWluaXQuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYXJhdmlydC9rZXJuZWwtZW50cnktaW5pdC5oCkBAIC0xMSwxMSArMTEsMTMgQEAKICNkZWZpbmUgQ1AwX0VCQVNFICQxNSwgMQogCiAJLm1hY3JvICBrZXJuZWxfZW50cnlfc2V0dXAKKyNpZmRlZiBDT05GSUdfU01QCiAJbWZjMAl0MCwgQ1AwX0VCQVNFCiAJYW5kaQl0MCwgdDAsIDB4M2ZmCQkjIENQVU51bQogCWJlcXoJdDAsIDFmCiAJIyBDUFVzIG90aGVyIHRoYW4gemVybyBnb3RvIHNtcF9ib290c3RyYXAKIAlqCXNtcF9ib290c3RyYXAKKyNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKIDE6CiAJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWNtLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1jbS5oCmluZGV4IDU4ZTc4NzQuLjRmYWZlZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWNtLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtY20uaApAQCAtNDU4LDEwICs0NTgsMjEgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1pcHNfY21fbWF4X3ZwX3dpZHRoKHZvaWQpCiB7CiAJZXh0ZXJuIGludCBzbXBfbnVtX3NpYmxpbmdzOworCXVpbnQzMl90IGNmZzsKIAogCWlmIChtaXBzX2NtX3JldmlzaW9uKCkgPj0gQ01fUkVWX0NNMykKIAkJcmV0dXJuIHJlYWRfZ2NyX3N5c19jb25maWcyKCkgJiBDTV9HQ1JfU1lTX0NPTkZJRzJfTUFYVlBXX01TSzsKIAorCWlmIChtaXBzX2NtX3ByZXNlbnQoKSkgeworCQkvKgorCQkgKiBXZSBwcmVzdW1lIHRoYXQgYWxsIGNvcmVzIGluIHRoZSBzeXN0ZW0gd2lsbCBoYXZlIHRoZSBzYW1lCisJCSAqIG51bWJlciBvZiBWUChFKXMsIGFuZCBpZiB0aGF0IGV2ZXIgY2hhbmdlcyB0aGVuIHRoaXMgd2lsbAorCQkgKiBuZWVkIHJldmlzaXRpbmcuCisJCSAqLworCQljZmcgPSByZWFkX2djcl9jbF9jb25maWcoKSAmIENNX0dDUl9DeF9DT05GSUdfUFZQRV9NU0s7CisJCXJldHVybiAoY2ZnID4+IENNX0dDUl9DeF9DT05GSUdfUFZQRV9TSEYpICsgMTsKKwl9CisKIAlpZiAoSVNfRU5BQkxFRChDT05GSUdfU01QKSkKIAkJcmV0dXJuIHNtcF9udW1fc2libGluZ3M7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcmVncy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNyZWdzLmgKaW5kZXggZGVmOWQ4ZC4uN2RkMmRkNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNyZWdzLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNyZWdzLmgKQEAgLTY2MCw4ICs2NjAsNiBAQAogCiAjZGVmaW5lIE1JUFNfQ09ORjdfSUFSCQkoX1VMQ0FTVF8oMSkgPDwgMTApCiAjZGVmaW5lIE1JUFNfQ09ORjdfQVIJCShfVUxDQVNUXygxKSA8PCAxNikKLS8qIEZUTEIgcHJvYmFiaWxpdHkgYml0cyBmb3IgUjYgKi8KLSNkZWZpbmUgTUlQU19DT05GN19GVExCUF9TSElGVAkoMTgpCiAKIC8qIFdhdGNoTG8qIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCiAjZGVmaW5lIE1JUFNfV0FUQ0hMT19JUlcJKF9VTENBU1RfKDB4NykgPDwgMCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wYWdlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcGFnZS5oCmluZGV4IGVhMGNkOTcuLjVmOTg3NTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wYWdlLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BhZ2UuaApAQCAtMTY0LDcgKzE2NCw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX19wYSh1bnNpZ25lZCBsb25nIHgpCiB7Ci0JaWYgKGNvbmZpZ19lbmFibGVkKENPTkZJR182NEJJVCkpIHsKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfNjRCSVQpKSB7CiAJCS8qCiAJCSAqIEZvciBNSVBTNjQgdGhlIHZpcnR1YWwgYWRkcmVzcyBtYXkgZWl0aGVyIGJlIGluIG9uZSBvZgogCQkgKiB0aGUgY29tcGF0aWJpbGl0eSBzZWdlbWVudHMgY2tzZWcwIG9yIGNrc2VnMSwgb3IgaXQgbWF5CkBAIC0xNzMsNyArMTczLDcgQEAKIAkJcmV0dXJuIHggPCBDS1NFRzAgPyBYUEhZU0FERFIoeCkgOiBDUEhZU0FERFIoeCk7CiAJfQogCi0JaWYgKCFjb25maWdfZW5hYmxlZChDT05GSUdfRVZBKSkgeworCWlmICghSVNfRU5BQkxFRChDT05GSUdfRVZBKSkgewogCQkvKgogCQkgKiBXZSdyZSB1c2luZyB0aGUgc3RhbmRhcmQgTUlQUzMyIGxlZ2FjeSBtZW1vcnkgbWFwLCBpZS4KIAkJICogdGhlIGFkZHJlc3MgeCBpcyBnb2luZyB0byBiZSBpbiBrc2VnMCBvciBrc2VnMS4gV2UgY2FuCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCAxMWI5NjVmLi4yMWEyYWFiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1ldmEuaD4KIAogLyoKQEAgLTExNzAsNiArMTE3MSw4IEBACiAJCQlfX2N1X2xlbiA9IF9faW52b2tlX2NvcHlfZnJvbV91c2VyKF9fY3VfdG8sCVwKIAkJCQkJCQkgICBfX2N1X2Zyb20sCVwKIAkJCQkJCQkgICBfX2N1X2xlbik7ICAgXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJCW1lbXNldChfX2N1X3RvLCAwLCBfX2N1X2xlbik7CQkJXAogCQl9CQkJCQkJCVwKIAl9CQkJCQkJCQlcCiAJX19jdV9sZW47CQkJCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91cHJvYmVzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdXByb2Jlcy5oCmluZGV4IDM0YzMyNWMuLjcwYTRhMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91cHJvYmVzLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Vwcm9iZXMuaApAQCAtMzYsNyArMzYsNiBAQAogCXVuc2lnbmVkIGxvbmcJcmVzdW1lX2VwYzsKIAl1MzIJaW5zblsyXTsKIAl1MzIJaXhvbFsyXTsKLQl1bmlvbgltaXBzX2luc3RydWN0aW9uIG9yaWdfaW5zdFtNQVhfVUlOU05fQllURVMgLyA0XTsKIH07CiAKIHN0cnVjdCBhcmNoX3Vwcm9iZV90YXNrIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMgYi9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCmluZGV4IGE4OGQ0NDIuLmRkMzE3NTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYwpAQCAtMzUyLDcgKzM1MiwxMiBAQAogc3RhdGljIGludCBtaXBzX2Z0bGJfZGlzYWJsZWQ7CiBzdGF0aWMgaW50IG1pcHNfaGFzX2Z0bGJfY29uZmlndXJlZDsKIAotc3RhdGljIGludCBzZXRfZnRsYl9lbmFibGUoc3RydWN0IGNwdWluZm9fbWlwcyAqYywgaW50IGVuYWJsZSk7CitlbnVtIGZ0bGJfZmxhZ3MgeworCUZUTEJfRU4JCT0gMSA8PCAwLAorCUZUTEJfU0VUX1BST0IJPSAxIDw8IDEsCit9OworCitzdGF0aWMgaW50IHNldF9mdGxiX2VuYWJsZShzdHJ1Y3QgY3B1aW5mb19taXBzICpjLCBlbnVtIGZ0bGJfZmxhZ3MgZmxhZ3MpOwogCiBzdGF0aWMgaW50IF9faW5pdCBmdGxiX2Rpc2FibGUoY2hhciAqcykKIHsKQEAgLTM3MSw4ICszNzYsNiBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQliYWNrX3RvX2JhY2tfYzBfaGF6YXJkKCk7Ci0KIAljb25maWc0ID0gcmVhZF9jMF9jb25maWc0KCk7CiAKIAkvKiBDaGVjayB0aGF0IEZUTEIgaGFzIGJlZW4gZGlzYWJsZWQgKi8KQEAgLTUzMSw3ICs1MzQsNyBAQAogCQlyZXR1cm4gMzsKIH0KIAotc3RhdGljIGludCBzZXRfZnRsYl9lbmFibGUoc3RydWN0IGNwdWluZm9fbWlwcyAqYywgaW50IGVuYWJsZSkKK3N0YXRpYyBpbnQgc2V0X2Z0bGJfZW5hYmxlKHN0cnVjdCBjcHVpbmZvX21pcHMgKmMsIGVudW0gZnRsYl9mbGFncyBmbGFncykKIHsKIAl1bnNpZ25lZCBpbnQgY29uZmlnOwogCkBAIC01NDIsMzMgKzU0NSwzMyBAQAogCWNhc2UgQ1BVX1A2NjAwOgogCQkvKiBwcm9BcHRpdiAmIHJlbGF0ZWQgY29yZXMgdXNlIENvbmZpZzYgdG8gZW5hYmxlIHRoZSBGVExCICovCiAJCWNvbmZpZyA9IHJlYWRfYzBfY29uZmlnNigpOwotCQkvKiBDbGVhciB0aGUgb2xkIHByb2JhYmlsaXR5IHZhbHVlICovCi0JCWNvbmZpZyAmPSB+KDMgPDwgTUlQU19DT05GNl9GVExCUF9TSElGVCk7Ci0JCWlmIChlbmFibGUpCi0JCQkvKiBFbmFibGUgRlRMQiAqLwotCQkJd3JpdGVfYzBfY29uZmlnNihjb25maWcgfAotCQkJCQkgKGNhbGN1bGF0ZV9mdGxiX3Byb2JhYmlsaXR5KGMpCi0JCQkJCSAgPDwgTUlQU19DT05GNl9GVExCUF9TSElGVCkKLQkJCQkJIHwgTUlQU19DT05GNl9GVExCRU4pOworCisJCWlmIChmbGFncyAmIEZUTEJfRU4pCisJCQljb25maWcgfD0gTUlQU19DT05GNl9GVExCRU47CiAJCWVsc2UKLQkJCS8qIERpc2FibGUgRlRMQiAqLwotCQkJd3JpdGVfYzBfY29uZmlnNihjb25maWcgJiAgfk1JUFNfQ09ORjZfRlRMQkVOKTsKKwkJCWNvbmZpZyAmPSB+TUlQU19DT05GNl9GVExCRU47CisKKwkJaWYgKGZsYWdzICYgRlRMQl9TRVRfUFJPQikgeworCQkJY29uZmlnICY9IH4oMyA8PCBNSVBTX0NPTkY2X0ZUTEJQX1NISUZUKTsKKwkJCWNvbmZpZyB8PSBjYWxjdWxhdGVfZnRsYl9wcm9iYWJpbGl0eShjKQorCQkJCSAgPDwgTUlQU19DT05GNl9GVExCUF9TSElGVDsKKwkJfQorCisJCXdyaXRlX2MwX2NvbmZpZzYoY29uZmlnKTsKKwkJYmFja190b19iYWNrX2MwX2hhemFyZCgpOwogCQlicmVhazsKIAljYXNlIENQVV9JNjQwMDoKLQkJLyogSTY0MDAgJiByZWxhdGVkIGNvcmVzIHVzZSBDb25maWc3IHRvIGNvbmZpZ3VyZSBGVExCICovCi0JCWNvbmZpZyA9IHJlYWRfYzBfY29uZmlnNygpOwotCQkvKiBDbGVhciB0aGUgb2xkIHByb2JhYmlsaXR5IHZhbHVlICovCi0JCWNvbmZpZyAmPSB+KDMgPDwgTUlQU19DT05GN19GVExCUF9TSElGVCk7Ci0JCXdyaXRlX2MwX2NvbmZpZzcoY29uZmlnIHwgKGNhbGN1bGF0ZV9mdGxiX3Byb2JhYmlsaXR5KGMpCi0JCQkJCSAgIDw8IE1JUFNfQ09ORjdfRlRMQlBfU0hJRlQpKTsKLQkJYnJlYWs7CisJCS8qIFRoZXJlJ3Mgbm8gd2F5IHRvIGRpc2FibGUgdGhlIEZUTEIgKi8KKwkJaWYgKCEoZmxhZ3MgJiBGVExCX0VOKSkKKwkJCXJldHVybiAxOworCQlyZXR1cm4gMDsKIAljYXNlIENQVV9MT09OR1NPTjM6CiAJCS8qIEZsdXNoIElUTEIsIERUTEIsIFZUTEIgYW5kIEZUTEIgKi8KIAkJd3JpdGVfYzBfZGlhZyhMT09OR1NPTl9ESUFHX0lUTEIgfCBMT09OR1NPTl9ESUFHX0RUTEIgfAogCQkJICAgICAgTE9PTkdTT05fRElBR19WVExCIHwgTE9PTkdTT05fRElBR19GVExCKTsKIAkJLyogTG9vbmdzb24tMyBjb3JlcyB1c2UgQ29uZmlnNiB0byBlbmFibGUgdGhlIEZUTEIgKi8KIAkJY29uZmlnID0gcmVhZF9jMF9jb25maWc2KCk7Ci0JCWlmIChlbmFibGUpCisJCWlmIChmbGFncyAmIEZUTEJfRU4pCiAJCQkvKiBFbmFibGUgRlRMQiAqLwogCQkJd3JpdGVfYzBfY29uZmlnNihjb25maWcgJiB+TUlQU19DT05GNl9GVExCRElTKTsKIAkJZWxzZQpAQCAtNzg4LDYgKzc5MSw3IEBACiAJCQkJICAgICAgIFBBR0VfU0laRSwgY29uZmlnNCk7CiAJCQkJLyogU3dpdGNoIEZUTEIgb2ZmICovCiAJCQkJc2V0X2Z0bGJfZW5hYmxlKGMsIDApOworCQkJCW1pcHNfZnRsYl9kaXNhYmxlZCA9IDE7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQljLT50bGJzaXplZnRsYnNldHMgPSAxIDw8CkBAIC04NTIsNyArODU2LDcgQEAKIAljLT5zY2FjaGUuZmxhZ3MgPSBNSVBTX0NBQ0hFX05PVF9QUkVTRU5UOwogCiAJLyogRW5hYmxlIEZUTEIgaWYgcHJlc2VudCBhbmQgbm90IGRpc2FibGVkICovCi0Jc2V0X2Z0bGJfZW5hYmxlKGMsICFtaXBzX2Z0bGJfZGlzYWJsZWQpOworCXNldF9mdGxiX2VuYWJsZShjLCBtaXBzX2Z0bGJfZGlzYWJsZWQgPyAwIDogRlRMQl9FTik7CiAKIAlvayA9IGRlY29kZV9jb25maWcwKGMpOwkJCS8qIFJlYWQgQ29uZmlnIHJlZ2lzdGVycy4gICovCiAJQlVHX09OKCFvayk7CQkJCS8qIEFyY2ggc3BlYyB2aW9sYXRpb24hCSAqLwpAQCAtOTAyLDYgKzkwNiw5IEBACiAJCX0KIAl9CiAKKwkvKiBjb25maWd1cmUgdGhlIEZUTEIgd3JpdGUgcHJvYmFiaWxpdHkgKi8KKwlzZXRfZnRsYl9lbmFibGUoYywgKG1pcHNfZnRsYl9kaXNhYmxlZCA/IDAgOiBGVExCX0VOKSB8IEZUTEJfU0VUX1BST0IpOworCiAJbWlwc19wcm9iZV93YXRjaF9yZWdpc3RlcnMoYyk7CiAKICNpZm5kZWYgQ09ORklHX01JUFNfQ1BTCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2Z0cmFjZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9mdHJhY2UuYwppbmRleCA5MzdjNTRiLi4zMGEzYjc1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2Z0cmFjZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvZnRyYWNlLmMKQEAgLTM4Miw4ICszODIsOCBAQAogCWlmICh1bmxpa2VseShmYXVsdGVkKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKG9sZF9wYXJlbnRfcmEsIHNlbGZfcmEsICZ0cmFjZS5kZXB0aCwgZnApCi0JICAgID09IC1FQlVTWSkgeworCWlmIChmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2Uob2xkX3BhcmVudF9yYSwgc2VsZl9yYSwgJnRyYWNlLmRlcHRoLCBmcCwKKwkJCQkgICAgIE5VTEwpID09IC1FQlVTWSkgewogCQkqcGFyZW50X3JhX2FkZHIgPSBvbGRfcGFyZW50X3JhOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9nZW5leC5TIGIvYXJjaC9taXBzL2tlcm5lbC9nZW5leC5TCmluZGV4IDE3MzI2YTkuLmRjMGIyOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvZ2VuZXguUworKysgYi9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMKQEAgLTE0Miw5ICsxNDIsOCBAQAogCVBUUl9MQQlrMSwgX19yNGtfd2FpdAogCW9yaQlrMCwgMHgxZgkvKiAzMiBieXRlIHJvbGxiYWNrIHJlZ2lvbiAqLwogCXhvcmkJazAsIDB4MWYKLQlibmUJazAsIGsxLCA5ZgorCWJuZQlrMCwgazEsIFxoYW5kbGVyCiAJTVRDMAlrMCwgQ1AwX0VQQwotOToKIAkuc2V0IHBvcAogCS5lbmRtCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvbWlwcy1yMi10by1yNi1lbXVsLmMgYi9hcmNoL21pcHMva2VybmVsL21pcHMtcjItdG8tcjYtZW11bC5jCmluZGV4IGMzMzcyY2EuLjBhN2UxMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvbWlwcy1yMi10by1yNi1lbXVsLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9taXBzLXIyLXRvLXI2LWVtdWwuYwpAQCAtMTE2NCw3ICsxMTY0LDkgQEAKIAkJcmVncy0+cmVnc1szMV0gPSByMzE7CiAJCXJlZ3MtPmNwMF9lcGMgPSBlcGM7CiAJCWlmICghdXNlZF9tYXRoKCkpIHsgICAgIC8qIEZpcnN0IHRpbWUgRlBVIHVzZXIuICAqLworCQkJcHJlZW1wdF9kaXNhYmxlKCk7CiAJCQllcnIgPSBpbml0X2ZwdSgpOworCQkJcHJlZW1wdF9lbmFibGUoKTsKIAkJCXNldF91c2VkX21hdGgoKTsKIAkJfQogCQlsb3NlX2ZwdSgxKTsgICAgLyogU2F2ZSBGUFUgc3RhdGUgZm9yIHRoZSBlbXVsYXRvci4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNzQyOWFkMC4uZDJkMDYxNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTYwNSwxNCArNjA1LDE0IEBACiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCS8qIEF2b2lkIGluYWR2ZXJ0ZW50bHkgdHJpZ2dlcmluZyBlbXVsYXRpb24gKi8KLQlpZiAoKHZhbHVlICYgUFJfRlBfTU9ERV9GUikgJiYgY3B1X2hhc19mcHUgJiYKLQkgICAgIShjdXJyZW50X2NwdV9kYXRhLmZwdV9pZCAmIE1JUFNfRlBJUl9GNjQpKQorCWlmICgodmFsdWUgJiBQUl9GUF9NT0RFX0ZSKSAmJiByYXdfY3B1X2hhc19mcHUgJiYKKwkgICAgIShyYXdfY3VycmVudF9jcHVfZGF0YS5mcHVfaWQgJiBNSVBTX0ZQSVJfRjY0KSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCWlmICgodmFsdWUgJiBQUl9GUF9NT0RFX0ZSRSkgJiYgY3B1X2hhc19mcHUgJiYgIWNwdV9oYXNfZnJlKQorCWlmICgodmFsdWUgJiBQUl9GUF9NT0RFX0ZSRSkgJiYgcmF3X2NwdV9oYXNfZnB1ICYmICFjcHVfaGFzX2ZyZSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJLyogRlIgPSAwIG5vdCBzdXBwb3J0ZWQgaW4gTUlQUyBSNiAqLwotCWlmICghKHZhbHVlICYgUFJfRlBfTU9ERV9GUikgJiYgY3B1X2hhc19mcHUgJiYgY3B1X2hhc19taXBzX3I2KQorCWlmICghKHZhbHVlICYgUFJfRlBfTU9ERV9GUikgJiYgcmF3X2NwdV9oYXNfZnB1ICYmIGNwdV9oYXNfbWlwc19yNikKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJLyogUHJvY2VlZCB3aXRoIHRoZSBtb2RlIHN3aXRjaCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jCmluZGV4IDM2Y2Y4ZDYuLjBkNTc5MDkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NldHVwLmMKQEAgLTg3LDYgKzg3LDEzIEBACiAJaW50IHggPSBib290X21lbV9tYXAubnJfbWFwOwogCWludCBpOwogCisJLyoKKwkgKiBJZiB0aGUgcmVnaW9uIHJlYWNoZXMgdGhlIHRvcCBvZiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSwgYWRqdXN0CisJICogdGhlIHNpemUgc2xpZ2h0bHkgc28gdGhhdCAoc3RhcnQgKyBzaXplKSBkb2Vzbid0IG92ZXJmbG93CisJICovCisJaWYgKHN0YXJ0ICsgc2l6ZSAtIDEgPT0gKHBoeXNfYWRkcl90KVVMTE9OR19NQVgpCisJCS0tc2l6ZTsKKwogCS8qIFNhbml0eSBjaGVjayAqLwogCWlmIChzdGFydCArIHNpemUgPCBzdGFydCkgewogCQlwcl93YXJuKCJUcnlpbmcgdG8gYWRkIGFuIGludmFsaWQgbWVtb3J5IHJlZ2lvbiwgc2tpcHBlZFxuIik7CkBAIC03NTcsNyArNzY0LDYgQEAKIAlkZXZpY2VfdHJlZV9pbml0KCk7CiAJc3BhcnNlX2luaXQoKTsKIAlwbGF0X3N3aW90bGJfc2V0dXAoKTsKLQlwYWdpbmdfaW5pdCgpOwogCiAJZG1hX2NvbnRpZ3VvdXNfcmVzZXJ2ZShQRk5fUEhZUyhtYXhfbG93X3BmbikpOwogCS8qIFRlbGwgYm9vdG1lbSBhYm91dCBjbWEgcmVzZXJ2ZWQgbWVtYmxvY2sgc2VjdGlvbiAqLwpAQCAtODcwLDYgKzg3Niw3IEBACiAJcHJlZmlsbF9wb3NzaWJsZV9tYXAoKTsKIAogCWNwdV9jYWNoZV9pbml0KCk7CisJcGFnaW5nX2luaXQoKTsKIH0KIAogdW5zaWduZWQgbG9uZyBrZXJuZWxzcFtOUl9DUFVTXTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLWNwcy5jIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAtY3BzLmMKaW5kZXggZTlkOWZjNi4uNjE4M2FkOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zbXAtY3BzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAtY3BzLmMKQEAgLTUxMyw3ICs1MTMsNyBAQAogCQkgKiBpbiB3aGljaCBjYXNlIHRoZSBDUEMgd2lsbCByZWZ1c2UgdG8gcG93ZXIgZG93biB0aGUgY29yZS4KIAkJICovCiAJCWRvIHsKLQkJCW1pcHNfY21fbG9ja19vdGhlcihjb3JlLCB2cGVfaWQpOworCQkJbWlwc19jbV9sb2NrX290aGVyKGNvcmUsIDApOwogCQkJbWlwc19jcGNfbG9ja19vdGhlcihjb3JlKTsKIAkJCXN0YXQgPSByZWFkX2NwY19jb19zdGF0X2NvbmYoKTsKIAkJCXN0YXQgJj0gQ1BDX0N4X1NUQVRfQ09ORl9TRVFTVEFURV9NU0s7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NtcC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAuYwppbmRleCBmOTVmMDk0Li5iMGJhZjQ4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLmMKQEAgLTMyMiw2ICszMjIsOSBAQAogCWNwdW1hc2tfc2V0X2NwdShjcHUsICZjcHVfY29oZXJlbnRfbWFzayk7CiAJbm90aWZ5X2NwdV9zdGFydGluZyhjcHUpOwogCisJY3B1bWFza19zZXRfY3B1KGNwdSwgJmNwdV9jYWxsaW5fbWFwKTsKKwlzeW5jaHJvbmlzZV9jb3VudF9zbGF2ZShjcHUpOworCiAJc2V0X2NwdV9vbmxpbmUoY3B1LCB0cnVlKTsKIAogCXNldF9jcHVfc2libGluZ19tYXAoY3B1KTsKQEAgLTMyOSwxMCArMzMyLDYgQEAKIAogCWNhbGN1bGF0ZV9jcHVfZm9yZWlnbl9tYXAoKTsKIAotCWNwdW1hc2tfc2V0X2NwdShjcHUsICZjcHVfY2FsbGluX21hcCk7Ci0KLQlzeW5jaHJvbmlzZV9jb3VudF9zbGF2ZShjcHUpOwotCiAJLyoKIAkgKiBpcnEgd2lsbCBiZSBlbmFibGVkIGluIC0+c21wX2ZpbmlzaCgpLCBlbmFibGluZyBpdCB0b28gZWFybHkKIAkgKiBpcyBkYW5nZXJvdXMuCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3Vwcm9iZXMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdXByb2Jlcy5jCmluZGV4IDg0NTJkOTMuLjRjN2MxNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdXByb2Jlcy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdXByb2Jlcy5jCkBAIC0xNTcsNyArMTU3LDYgQEAKIGludCBhcmNoX3Vwcm9iZV9wcmVfeG9sKHN0cnVjdCBhcmNoX3Vwcm9iZSAqYXVwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgdXByb2JlX3Rhc2sgKnV0YXNrID0gY3VycmVudC0+dXRhc2s7Ci0JdW5pb24gbWlwc19pbnN0cnVjdGlvbiBpbnNuOwogCiAJLyoKIAkgKiBOb3cgZmluZCB0aGUgRVBDIHdoZXJlIHRvIHJlc3VtZSBhZnRlciB0aGUgYnJlYWtwb2ludCBoYXMgYmVlbgpAQCAtMTY4LDEwICsxNjcsMTAgQEAKIAkJdW5zaWduZWQgbG9uZyBlcGM7CiAKIAkJZXBjID0gcmVncy0+Y3AwX2VwYzsKLQkJX19jb21wdXRlX3JldHVybl9lcGNfZm9yX2luc24ocmVncywgaW5zbik7CisJCV9fY29tcHV0ZV9yZXR1cm5fZXBjX2Zvcl9pbnNuKHJlZ3MsCisJCQkodW5pb24gbWlwc19pbnN0cnVjdGlvbikgYXVwLT5pbnNuWzBdKTsKIAkJYXVwLT5yZXN1bWVfZXBjID0gcmVncy0+Y3AwX2VwYzsKIAl9Ci0KIAl1dGFzay0+YXV0YXNrLnNhdmVkX3RyYXBfbnIgPSBjdXJyZW50LT50aHJlYWQudHJhcF9ucjsKIAljdXJyZW50LT50aHJlYWQudHJhcF9uciA9IFVQUk9CRV9UUkFQX05SOwogCXJlZ3MtPmNwMF9lcGMgPSBjdXJyZW50LT51dGFzay0+eG9sX3ZhZGRyOwpAQCAtMjIyLDcgKzIyMSw3IEBACiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAogCXN3aXRjaCAodmFsKSB7Ci0JY2FzZSBESUVfQlJFQUs6CisJY2FzZSBESUVfVVBST0JFOgogCQlpZiAodXByb2JlX3ByZV9zc3RlcF9ub3RpZmllcihyZWdzKSkKIAkJCXJldHVybiBOT1RJRllfU1RPUDsKIAkJYnJlYWs7CkBAIC0yNTcsNyArMjU2LDcgQEAKIAlyYSA9IHJlZ3MtPnJlZ3NbMzFdOwogCiAJLyogUmVwbGFjZSB0aGUgcmV0dXJuIGFkZHJlc3Mgd2l0aCB0aGUgdHJhbXBvbGluZSBhZGRyZXNzICovCi0JcmVncy0+cmVnc1szMV0gPSByYTsKKwlyZWdzLT5yZWdzWzMxXSA9IHRyYW1wb2xpbmVfdmFkZHI7CiAKIAlyZXR1cm4gcmE7CiB9CkBAIC0yODAsMjQgKzI3OSw2IEBACiAJcmV0dXJuIHVwcm9iZV93cml0ZV9vcGNvZGUobW0sIHZhZGRyLCBVUFJPQkVfU1dCUF9JTlNOKTsKIH0KIAotLyoqCi0gKiBzZXRfb3JpZ19pbnNuIC0gUmVzdG9yZSB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24uCi0gKiBAbW06IHRoZSBwcm9iZWQgcHJvY2VzcyBhZGRyZXNzIHNwYWNlLgotICogQGF1cHJvYmU6IGFyY2ggc3BlY2lmaWMgcHJvYmVwb2ludCBpbmZvcm1hdGlvbi4KLSAqIEB2YWRkcjogdGhlIHZpcnR1YWwgYWRkcmVzcyB0byBpbnNlcnQgdGhlIG9wY29kZS4KLSAqCi0gKiBGb3IgbW0gQG1tLCByZXN0b3JlIHRoZSBvcmlnaW5hbCBvcGNvZGUgKG9wY29kZSkgYXQgQHZhZGRyLgotICogUmV0dXJuIDAgKHN1Y2Nlc3MpIG9yIGEgbmVnYXRpdmUgZXJybm8uCi0gKgotICogVGhpcyBvdmVycmlkZXMgdGhlIHdlYWsgdmVyc2lvbiBpbiBrZXJuZWwvZXZlbnRzL3Vwcm9iZXMuYy4KLSAqLwotaW50IHNldF9vcmlnX2luc24oc3RydWN0IGFyY2hfdXByb2JlICphdXByb2JlLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKLQkJIHVuc2lnbmVkIGxvbmcgdmFkZHIpCi17Ci0JcmV0dXJuIHVwcm9iZV93cml0ZV9vcGNvZGUobW0sIHZhZGRyLAotCQkJKih1cHJvYmVfb3Bjb2RlX3QgKikmYXVwcm9iZS0+b3JpZ19pbnN0WzBdLndvcmQpOwotfQotCiB2b2lkIF9fd2VhayBhcmNoX3Vwcm9iZV9jb3B5X2l4b2woc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgdmFkZHIsCiAJCQkJICB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgbGVuKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC92ZHNvLmMgYi9hcmNoL21pcHMva2VybmVsL3Zkc28uYwppbmRleCA5YWJlNDQ3Li5mOWRiZmIxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3Zkc28uYworKysgYi9hcmNoL21pcHMva2VybmVsL3Zkc28uYwpAQCAtMzksMTYgKzM5LDE2IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF92ZHNvX2ltYWdlKHN0cnVjdCBtaXBzX3Zkc29faW1hZ2UgKmltYWdlKQogewogCXVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzLCBpOworCXVuc2lnbmVkIGxvbmcgZGF0YV9wZm47CiAKIAlCVUdfT04oIVBBR0VfQUxJR05FRChpbWFnZS0+ZGF0YSkpOwogCUJVR19PTighUEFHRV9BTElHTkVEKGltYWdlLT5zaXplKSk7CiAKIAludW1fcGFnZXMgPSBpbWFnZS0+c2l6ZSAvIFBBR0VfU0laRTsKIAotCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykgewotCQlpbWFnZS0+bWFwcGluZy5wYWdlc1tpXSA9Ci0JCQl2aXJ0X3RvX3BhZ2UoaW1hZ2UtPmRhdGEgKyAoaSAqIFBBR0VfU0laRSkpOwotCX0KKwlkYXRhX3BmbiA9IF9fcGh5c190b19wZm4oX19wYV9zeW1ib2woaW1hZ2UtPmRhdGEpKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspCisJCWltYWdlLT5tYXBwaW5nLnBhZ2VzW2ldID0gcGZuX3RvX3BhZ2UoZGF0YV9wZm4gKyBpKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaW5pdF92ZHNvKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva3ZtL21tdS5jIGIvYXJjaC9taXBzL2t2bS9tbXUuYwppbmRleCA2Y2ZkY2Y1Li4xMjEwMDhjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva3ZtL21tdS5jCisrKyBiL2FyY2gvbWlwcy9rdm0vbW11LmMKQEAgLTQwLDcgKzQwLDcgQEAKIAlzcmN1X2lkeCA9IHNyY3VfcmVhZF9sb2NrKCZrdm0tPnNyY3UpOwogCXBmbiA9IGdmbl90b19wZm4oa3ZtLCBnZm4pOwogCi0JaWYgKGlzX2Vycm9yX3BmbihwZm4pKSB7CisJaWYgKGlzX2Vycm9yX25vc2xvdF9wZm4ocGZuKSkgewogCQlrdm1fZXJyKCJDb3VsZG4ndCBnZXQgcGZuIGZvciBnZm4gJSNsbHghXG4iLCBnZm4pOwogCQllcnIgPSAtRUZBVUxUOwogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3NvbjY0L2xvb25nc29uLTMvc21wLmMgYi9hcmNoL21pcHMvbG9vbmdzb242NC9sb29uZ3Nvbi0zL3NtcC5jCmluZGV4IDJmZWM2ZjcuLjk5YWFiOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sb29uZ3NvbjY0L2xvb25nc29uLTMvc21wLmMKKysrIGIvYXJjaC9taXBzL2xvb25nc29uNjQvbG9vbmdzb24tMy9zbXAuYwpAQCAtNjc3LDcgKzY3Nyw3IEBACiAJcGxheV9kZWFkX2F0X2Nrc2VnMShzdGF0ZV9hZGRyKTsKIH0KIAotdm9pZCBsb29uZ3NvbjNfZGlzYWJsZV9jbG9jayhpbnQgY3B1KQorc3RhdGljIGludCBsb29uZ3NvbjNfZGlzYWJsZV9jbG9jayh1bnNpZ25lZCBpbnQgY3B1KQogewogCXVpbnQ2NF90IGNvcmVfaWQgPSBjcHVfZGF0YVtjcHVdLmNvcmU7CiAJdWludDY0X3QgcGFja2FnZV9pZCA9IGNwdV9kYXRhW2NwdV0ucGFja2FnZTsKQEAgLTY4OCw5ICs2ODgsMTAgQEAKIAkJaWYgKCEobG9vbmdzb25fc3lzY29uZi53b3JrYXJvdW5kcyAmIFdPUktBUk9VTkRfQ1BVSE9UUExVRykpCiAJCQlMT09OR1NPTl9GUkVRQ1RSTChwYWNrYWdlX2lkKSAmPSB+KDEgPDwgKGNvcmVfaWQgKiA0ICsgMykpOwogCX0KKwlyZXR1cm4gMDsKIH0KIAotdm9pZCBsb29uZ3NvbjNfZW5hYmxlX2Nsb2NrKGludCBjcHUpCitzdGF0aWMgaW50IGxvb25nc29uM19lbmFibGVfY2xvY2sodW5zaWduZWQgaW50IGNwdSkKIHsKIAl1aW50NjRfdCBjb3JlX2lkID0gY3B1X2RhdGFbY3B1XS5jb3JlOwogCXVpbnQ2NF90IHBhY2thZ2VfaWQgPSBjcHVfZGF0YVtjcHVdLnBhY2thZ2U7CkBAIC03MDEsMzQgKzcwMiwxNSBAQAogCQlpZiAoIShsb29uZ3Nvbl9zeXNjb25mLndvcmthcm91bmRzICYgV09SS0FST1VORF9DUFVIT1RQTFVHKSkKIAkJCUxPT05HU09OX0ZSRVFDVFJMKHBhY2thZ2VfaWQpIHw9IDEgPDwgKGNvcmVfaWQgKiA0ICsgMyk7CiAJfQotfQotCi0jZGVmaW5lIENQVV9QT1NUX0RFQURfRlJPWkVOCShDUFVfUE9TVF9ERUFEIHwgQ1BVX1RBU0tTX0ZST1pFTikKLXN0YXRpYyBpbnQgbG9vbmdzb24zX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKLQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKLXsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfUE9TVF9ERUFEOgotCWNhc2UgQ1BVX1BPU1RfREVBRF9GUk9aRU46Ci0JCXByX2luZm8oIkRpc2FibGUgY2xvY2sgZm9yIENQVSMlZFxuIiwgY3B1KTsKLQkJbG9vbmdzb24zX2Rpc2FibGVfY2xvY2soY3B1KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRToKLQljYXNlIENQVV9VUF9QUkVQQVJFX0ZST1pFTjoKLQkJcHJfaW5mbygiRW5hYmxlIGNsb2NrIGZvciBDUFUjJWRcbiIsIGNwdSk7Ci0JCWxvb25nc29uM19lbmFibGVfY2xvY2soY3B1KTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIE5PVElGWV9PSzsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCByZWdpc3Rlcl9sb29uZ3NvbjNfbm90aWZpZXIodm9pZCkKIHsKLQlob3RjcHVfbm90aWZpZXIobG9vbmdzb24zX2NwdV9jYWxsYmFjaywgMCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfTUlQU19TT0NfUFJFUEFSRSwKKwkJCQkJICJtaXBzL2xvb25nc29uOnByZXBhcmUiLAorCQkJCQkgbG9vbmdzb24zX2VuYWJsZV9jbG9jaywKKwkJCQkJIGxvb25nc29uM19kaXNhYmxlX2Nsb2NrKTsKIH0KIGVhcmx5X2luaXRjYWxsKHJlZ2lzdGVyX2xvb25nc29uM19ub3RpZmllcik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tYXRoLWVtdS9kc2VtdWwuYyBiL2FyY2gvbWlwcy9tYXRoLWVtdS9kc2VtdWwuYwppbmRleCA3MmE0NjQyLi40YTA5NGY3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWF0aC1lbXUvZHNlbXVsLmMKKysrIGIvYXJjaC9taXBzL21hdGgtZW11L2RzZW11bC5jCkBAIC0yOTgsNSArMjk4LDYgQEAKIAkvKiBTZXQgRVBDIHRvIHJldHVybiB0byBwb3N0LWJyYW5jaCBpbnN0cnVjdGlvbiAqLwogCXhjcC0+Y3AwX2VwYyA9IGN1cnJlbnQtPnRocmVhZC5iZF9lbXVfY29udF9wYzsKIAlwcl9kZWJ1ZygiZHNlbXVscmV0IHRvIDB4JTA4bHhcbiIsIHhjcC0+Y3AwX2VwYyk7CisJTUlQU19GUFVfRU1VX0lOQ19TVEFUUyhkc19lbXVsKTsKIAlyZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jLXI0ay5jIGIvYXJjaC9taXBzL21tL2MtcjRrLmMKaW5kZXggY2Q3MjgwNS4uZmE3ZDhkMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2MtcjRrLmMKKysrIGIvYXJjaC9taXBzL21tL2MtcjRrLmMKQEAgLTgwMCw3ICs4MDAsNyBAQAogCQkgKiBJZiBhZGRyZXNzLWJhc2VkIGNhY2hlIG9wcyBkb24ndCByZXF1aXJlIGFuIFNNUCBjYWxsLCB0aGVuCiAJCSAqIHVzZSB0aGVtIGV4Y2x1c2l2ZWx5IGZvciBzbWFsbCBmbHVzaGVzLgogCQkgKi8KLQkJc2l6ZSA9IHN0YXJ0IC0gZW5kOworCQlzaXplID0gZW5kIC0gc3RhcnQ7CiAJCWNhY2hlX3NpemUgPSBpY2FjaGVfc2l6ZTsKIAkJaWYgKCFjcHVfaGFzX2ljX2ZpbGxzX2ZfZGMpIHsKIAkJCXNpemUgKj0gMjsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9pbml0LmMgYi9hcmNoL21pcHMvbW0vaW5pdC5jCmluZGV4IGE1NTA5ZTcuLjcyZjc0NzggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9pbml0LmMKKysrIGIvYXJjaC9taXBzL21tL2luaXQuYwpAQCAtMjYxLDcgKzI2MSw2IEBACiB7CiAJc3RydWN0IG1hYXJfY29uZmlnIGNmZ1tCT09UX01FTV9NQVBfTUFYXTsKIAl1bnNpZ25lZCBpLCBudW1fY29uZmlndXJlZCwgbnVtX2NmZyA9IDA7Ci0JcGh5c19hZGRyX3Qgc2tpcDsKIAogCWZvciAoaSA9IDA7IGkgPCBib290X21lbV9tYXAubnJfbWFwOyBpKyspIHsKIAkJc3dpdGNoIChib290X21lbV9tYXAubWFwW2ldLnR5cGUpIHsKQEAgLTI3MiwxNCArMjcxLDE0IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCXNraXAgPSAweDEwMDAwIC0gKGJvb3RfbWVtX21hcC5tYXBbaV0uYWRkciAmIDB4ZmZmZik7Ci0KKwkJLyogUm91bmQgbG93ZXIgdXAgKi8KIAkJY2ZnW251bV9jZmddLmxvd2VyID0gYm9vdF9tZW1fbWFwLm1hcFtpXS5hZGRyOwotCQljZmdbbnVtX2NmZ10ubG93ZXIgKz0gc2tpcDsKKwkJY2ZnW251bV9jZmddLmxvd2VyID0gKGNmZ1tudW1fY2ZnXS5sb3dlciArIDB4ZmZmZikgJiB+MHhmZmZmOwogCi0JCWNmZ1tudW1fY2ZnXS51cHBlciA9IGNmZ1tudW1fY2ZnXS5sb3dlcjsKLQkJY2ZnW251bV9jZmddLnVwcGVyICs9IGJvb3RfbWVtX21hcC5tYXBbaV0uc2l6ZSAtIDE7Ci0JCWNmZ1tudW1fY2ZnXS51cHBlciAtPSBza2lwOworCQkvKiBSb3VuZCB1cHBlciBkb3duICovCisJCWNmZ1tudW1fY2ZnXS51cHBlciA9IGJvb3RfbWVtX21hcC5tYXBbaV0uYWRkciArCisJCQkJCWJvb3RfbWVtX21hcC5tYXBbaV0uc2l6ZTsKKwkJY2ZnW251bV9jZmddLnVwcGVyID0gKGNmZ1tudW1fY2ZnXS51cHBlciAmIH4weGZmZmYpIC0gMTsKIAogCQljZmdbbnVtX2NmZ10uYXR0cnMgPSBNSVBTX01BQVJfUzsKIAkJbnVtX2NmZysrOwpAQCAtNDQxLDYgKzQ0MCw5IEBACiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KIAl1bnNpZ25lZCBsb25nIHRtcDsKIAorCWlmIChjcHVfaGFzX2RjX2FsaWFzZXMpCisJCXJldHVybjsKKwogCWZvciAodG1wID0gaGlnaHN0YXJ0X3BmbjsgdG1wIDwgaGlnaGVuZF9wZm47IHRtcCsrKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UodG1wKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1zZXR1cC5jIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1zZXR1cC5jCmluZGV4IGVjNWIyMTYuLjdlNzM2NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtc2V0dXAuYworKysgYi9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLXNldHVwLmMKQEAgLTM5LDYgKzM5LDkgQEAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjZW5kaWYKIAorI2RlZmluZSBST0NJVF9DT05GSUdfR0VOMAkJMHgxZjQwMzAwMAorI2RlZmluZSAgUk9DSVRfQ09ORklHX0dFTjBfUENJX0lPQ1UJQklUKDcpCisKIGV4dGVybiB2b2lkIG1hbHRhX2JlX2luaXQodm9pZCk7CiBleHRlcm4gaW50IG1hbHRhX2JlX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBpc19maXh1cCk7CiAKQEAgLTEwNyw2ICsxMTAsOCBAQAogc3RhdGljIGludCBfX2luaXQgcGxhdF9lbmFibGVfaW9jb2hlcmVuY3kodm9pZCkKIHsKIAlpbnQgc3VwcG9ydGVkID0gMDsKKwl1MzIgY2ZnOworCiAJaWYgKG1pcHNfcmV2aXNpb25fc2NvbmlkID09IE1JUFNfUkVWSVNJT05fU0NPTl9CT05JVE8pIHsKIAkJaWYgKEJPTklUT19QQ0lDQUNIRUNUUkwgJiBCT05JVE9fUENJQ0FDSEVDVFJMX0NQVUNPSF9QUkVTKSB7CiAJCQlCT05JVE9fUENJQ0FDSEVDVFJMIHw9IEJPTklUT19QQ0lDQUNIRUNUUkxfQ1BVQ09IX0VOOwpAQCAtMTI5LDcgKzEzNCw4IEBACiAJfSBlbHNlIGlmIChtaXBzX2NtX251bWlvY3UoKSAhPSAwKSB7CiAJCS8qIE5vdGhpbmcgc3BlY2lhbCBuZWVkcyB0byBiZSBkb25lIHRvIGVuYWJsZSBjb2hlcmVuY3kgKi8KIAkJcHJfaW5mbygiQ01QIElPQ1UgZGV0ZWN0ZWRcbiIpOwotCQlpZiAoKCoodW5zaWduZWQgaW50ICopMHhiZjQwMzAwMCAmIDB4ODEpICE9IDB4ODEpIHsKKwkJY2ZnID0gX19yYXdfcmVhZGwoKHUzMiAqKUNLU0VHMUFERFIoUk9DSVRfQ09ORklHX0dFTjApKTsKKwkJaWYgKCEoY2ZnICYgUk9DSVRfQ09ORklHX0dFTjBfUENJX0lPQ1UpKSB7CiAJCQlwcl9jcml0KCJJT0NVIE9QRVJBVElPTiBESVNBQkxFRCBCWSBTV0lUQ0ggLSBERUZBVUxUSU5HIFRPIFNXIElPIENPSEVSRU5DWVxuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggMjBmN2JmNi4uZDAxMmU4NyAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0xNjYsNiArMTY2LDcgQEAKIAkJIjI6XG4iCQkJCQkJXAogCQkiCS5zZWN0aW9uCS5maXh1cCxcImF4XCJcbiIJXAogCQkiMzpcblx0IgkJCQkJXAorCQkiCW1vdgkJMCwlMVxuIgkJCVwKIAkJIgltb3YJCSUzLCUwXG4iCQlcCiAJCSIJam1wCQkyYlxuIgkJCVwKIAkJIgkucHJldmlvdXNcbiIJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2xpYi91c2VyY29weS5jIGIvYXJjaC9tbjEwMzAwL2xpYi91c2VyY29weS5jCmluZGV4IDc4MjZlNmMuLmNlODg5OWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9saWIvdXNlcmNvcHkuYworKysgYi9hcmNoL21uMTAzMDAvbGliL3VzZXJjb3B5LmMKQEAgLTksNyArOSw3IEBACiAgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KICAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogdW5zaWduZWQgbG9uZwogX19nZW5lcmljX2NvcHlfdG9fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQpAQCAtMjQsNiArMjQsOCBAQAogewogCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKQogCQlfX2NvcHlfdXNlcl96ZXJvaW5nKHRvLCBmcm9tLCBuKTsKKwllbHNlCisJCW1lbXNldCh0bywgMCwgbik7CiAJcmV0dXJuIG47CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbmlvczIvYm9vdC9kdHMvMTBtNTBfZGV2Ym9hcmQuZHRzIGIvYXJjaC9uaW9zMi9ib290L2R0cy8xMG01MF9kZXZib2FyZC5kdHMKaW5kZXggM2U0MTFjNi4uZjM2MmIyMiAxMDA3NTUKLS0tIGEvYXJjaC9uaW9zMi9ib290L2R0cy8xMG01MF9kZXZib2FyZC5kdHMKKysrIGIvYXJjaC9uaW9zMi9ib290L2R0cy8xMG01MF9kZXZib2FyZC5kdHMKQEAgLTgzLDYgKzgzLDcgQEAKIAkJCWZpZm8tc2l6ZSA9IDwzMj47CiAJCQlyZWctaW8td2lkdGggPSA8ND47CiAJCQlyZWctc2hpZnQgPSA8Mj47CisJCQl0eC10aHJlc2hvbGQgPSA8MTY+OwogCQl9OwogCiAJCXN5c2lkOiBzeXNpZEAxODAwMTUyOCB7CmRpZmYgLS1naXQgYS9hcmNoL25pb3MyL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvbmlvczIvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IGNhYTUxZmYuLjBhYjgyMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbmlvczIvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvbmlvczIvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0xMDIsOSArMTAyLDEyIEBACiBzdGF0aWMgaW5saW5lIGxvbmcgY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLAogCQkJCXVuc2lnbmVkIGxvbmcgbikKIHsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpCi0JCXJldHVybiBuOwotCXJldHVybiBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKKwl1bnNpZ25lZCBsb25nIHJlcyA9IG47CisJaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpCisJCXJlcyA9IF9fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOworCWlmICh1bmxpa2VseShyZXMpKQorCQltZW1zZXQodG8gKyAobiAtIHJlcyksIDAsIHJlcyk7CisJcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGlubGluZSBsb25nIGNvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sCkBAIC0xMzksNyArMTQyLDcgQEAKIAogI2RlZmluZSBfX2dldF91c2VyX3Vua25vd24odmFsLCBzaXplLCBwdHIsIGVycikgZG8gewkJCVwKIAllcnIgPSAwOwkJCQkJCQlcCi0JaWYgKGNvcHlfZnJvbV91c2VyKCYodmFsKSwgcHRyLCBzaXplKSkgewkJCVwKKwlpZiAoX19jb3B5X2Zyb21fdXNlcigmKHZhbCksIHB0ciwgc2l6ZSkpIHsJCQlcCiAJCWVyciA9IC1FRkFVTFQ7CQkJCQkJXAogCX0JCQkJCQkJCVwKIAl9IHdoaWxlICgwKQpAQCAtMTY2LDcgKzE2OSw3IEBACiAJKHsJCQkJCQkJCVwKIAlsb25nIF9fZ3VfZXJyID0gLUVGQVVMVDsJCQkJCVwKIAljb25zdCBfX3R5cGVvZl9fKCoocHRyKSkgX191c2VyICpfX2d1X3B0ciA9IChwdHIpOwkJXAotCXVuc2lnbmVkIGxvbmcgX19ndV92YWw7CQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX19ndV92YWwgPSAwOwkJCQkJXAogCV9fZ2V0X3VzZXJfY29tbW9uKF9fZ3VfdmFsLCBzaXplb2YoKihwdHIpKSwgX19ndV9wdHIsIF9fZ3VfZXJyKTtcCiAJKHgpID0gKF9fZm9yY2UgX190eXBlb2ZfXyh4KSlfX2d1X3ZhbDsJCQkJXAogCV9fZ3VfZXJyOwkJCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IGE2YmQwN2MuLjVjYzZiNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0yNzMsMjggKzI3MywyMCBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCiBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewotCXVuc2lnbmVkIGxvbmcgb3ZlcjsKKwl1bnNpZ25lZCBsb25nIHJlcyA9IG47CiAKLQlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkKLQkJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbik7Ci0JaWYgKCh1bnNpZ25lZCBsb25nKWZyb20gPCBUQVNLX1NJWkUpIHsKLQkJb3ZlciA9ICh1bnNpZ25lZCBsb25nKWZyb20gKyBuIC0gVEFTS19TSVpFOwotCQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBuIC0gb3ZlcikgKyBvdmVyOwotCX0KLQlyZXR1cm4gbjsKKwlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpKQorCQlyZXMgPSBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIGZyb20sIG4pOworCWlmICh1bmxpa2VseShyZXMpKQorCQltZW1zZXQodG8gKyAobiAtIHJlcyksIDAsIHJlcyk7CisJcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCiBjb3B5X3RvX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKLQl1bnNpZ25lZCBsb25nIG92ZXI7Ci0KLQlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgdG8sIG4pKQotCQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKLQlpZiAoKHVuc2lnbmVkIGxvbmcpdG8gPCBUQVNLX1NJWkUpIHsKLQkJb3ZlciA9ICh1bnNpZ25lZCBsb25nKXRvICsgbiAtIFRBU0tfU0laRTsKLQkJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbiAtIG92ZXIpICsgb3ZlcjsKLQl9CisJaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbikpKQorCQluID0gX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKIAlyZXR1cm4gbjsKIH0KIApAQCAtMzAzLDEzICsyOTUsOCBAQAogc3RhdGljIGlubGluZSBfX211c3RfY2hlY2sgdW5zaWduZWQgbG9uZwogY2xlYXJfdXNlcih2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0KLQlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgYWRkciwgc2l6ZSkpCi0JCXJldHVybiBfX2NsZWFyX3VzZXIoYWRkciwgc2l6ZSk7Ci0JaWYgKCh1bnNpZ25lZCBsb25nKWFkZHIgPCBUQVNLX1NJWkUpIHsKLQkJdW5zaWduZWQgbG9uZyBvdmVyID0gKHVuc2lnbmVkIGxvbmcpYWRkciArIHNpemUgLSBUQVNLX1NJWkU7Ci0JCXJldHVybiBfX2NsZWFyX3VzZXIoYWRkciwgc2l6ZSAtIG92ZXIpICsgb3ZlcjsKLQl9CisJaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhZGRyLCBzaXplKSkpCisJCXNpemUgPSBfX2NsZWFyX3VzZXIoYWRkciwgc2l6ZSk7CiAJcmV0dXJuIHNpemU7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL0tjb25maWcgYi9hcmNoL3BhcmlzYy9LY29uZmlnCmluZGV4IGNkODc3ODEuLmFmMTJjMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL0tjb25maWcKKysrIGIvYXJjaC9wYXJpc2MvS2NvbmZpZwpAQCAtMSw2ICsxLDUgQEAKIGNvbmZpZyBQQVJJU0MKIAlkZWZfYm9vbCB5Ci0Jc2VsZWN0IEFSQ0hfSEFTX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTCiAJc2VsZWN0IEFSQ0hfTUlHSFRfSEFWRV9QQ19QQVJQT1JUCiAJc2VsZWN0IEhBVkVfSURFCiAJc2VsZWN0IEhBVkVfT1BST0ZJTEUKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2NvbmZpZ3MvYzgwMDBfZGVmY29uZmlnIGIvYXJjaC9wYXJpc2MvY29uZmlncy9jODAwMF9kZWZjb25maWcKaW5kZXggMWE4ZjZmOTUuLmY2YTRjMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2NvbmZpZ3MvYzgwMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvcGFyaXNjL2NvbmZpZ3MvYzgwMDBfZGVmY29uZmlnCkBAIC0yNDUsNyArMjQ1LDYgQEAKIENPTkZJR19QUk9WRV9SQ1VfREVMQVk9eQogQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUPXkKIENPTkZJR19MQVRFTkNZVE9QPXkKLUNPTkZJR19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUz15CiBDT05GSUdfS0VZUz15CiAjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAogQ09ORklHX0ZPTlRTPXkKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2NvbmZpZ3MvZ2VuZXJpYy02NGJpdF9kZWZjb25maWcgYi9hcmNoL3BhcmlzYy9jb25maWdzL2dlbmVyaWMtNjRiaXRfZGVmY29uZmlnCmluZGV4IDdlMDc5MjYuLmM1NjRlNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2NvbmZpZ3MvZ2VuZXJpYy02NGJpdF9kZWZjb25maWcKKysrIGIvYXJjaC9wYXJpc2MvY29uZmlncy9nZW5lcmljLTY0Yml0X2RlZmNvbmZpZwpAQCAtMjkxLDcgKzI5MSw2IEBACiBDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQz15CiAjIENPTkZJR19TQ0hFRF9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfVElNRVJfU1RBVFM9eQotQ09ORklHX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTPXkKIENPTkZJR19DUllQVE9fTUFOQUdFUj15CiBDT05GSUdfQ1JZUFRPX0VDQj1tCiBDT05GSUdfQ1JZUFRPX1BDQkM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDBmNTlmZDkuLjQ4Mjg0NzggMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy91YWNjZXNzLXVuYWxpZ25lZC5oPgogCiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKICNkZWZpbmUgVkVSSUZZX1JFQUQgMAogI2RlZmluZSBWRVJJRllfV1JJVEUgMQpAQCAtMjA4LDI2ICsyMDksMzAgQEAKICNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWMgX19jb3B5X3RvX3VzZXIKICNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyBfX2NvcHlfZnJvbV91c2VyCiAKLWV4dGVybiB2b2lkIGNvcHlfZnJvbV91c2VyX292ZXJmbG93KHZvaWQpCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTCi0gICAgICAgIF9fY29tcGlsZXRpbWVfZXJyb3IoImNvcHlfZnJvbV91c2VyKCkgYnVmZmVyIHNpemUgaXMgbm90IHByb3ZhYmx5IGNvcnJlY3QiKQotI2Vsc2UKLSAgICAgICAgX19jb21waWxldGltZV93YXJuaW5nKCJjb3B5X2Zyb21fdXNlcigpIGJ1ZmZlciBzaXplIGlzIG5vdCBwcm92YWJseSBjb3JyZWN0IikKLSNlbmRpZgotOworZXh0ZXJuIHZvaWQgX19jb21waWxldGltZV9lcnJvcigidXNlcmNvcHkgYnVmZmVyIHNpemUgaXMgdG9vIHNtYWxsIikKK19fYmFkX2NvcHlfdXNlcih2b2lkKTsKKworc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdXNlcl9vdmVyZmxvdyhpbnQgc2l6ZSwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlXQVJOKDEsICJCdWZmZXIgb3ZlcmZsb3cgZGV0ZWN0ZWQgKCVkIDwgJWx1KSFcbiIsIHNpemUsIGNvdW50KTsKK30KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjayBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBuKQogewogICAgICAgICBpbnQgc3ogPSBfX2NvbXBpbGV0aW1lX29iamVjdF9zaXplKHRvKTsKLSAgICAgICAgaW50IHJldCA9IC1FRkFVTFQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgcmV0ID0gbjsKIAotICAgICAgICBpZiAobGlrZWx5KHN6ID09IC0xIHx8ICFfX2J1aWx0aW5fY29uc3RhbnRfcChuKSB8fCBzeiA+PSBuKSkKKyAgICAgICAgaWYgKGxpa2VseShzeiA9PSAtMSB8fCBzeiA+PSBuKSkKICAgICAgICAgICAgICAgICByZXQgPSBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNvcHlfZnJvbV91c2VyX292ZXJmbG93KCk7CisgICAgICAgIGVsc2UgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKKwkJY29weV91c2VyX292ZXJmbG93KHN6LCBuKTsKKwllbHNlCisgICAgICAgICAgICAgICAgX19iYWRfY29weV91c2VyKCk7CiAKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJbWVtc2V0KHRvICsgKG4gLSByZXQpLCAwLCByZXQpOwogICAgICAgICByZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL2Vycm5vLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL2Vycm5vLmgKaW5kZXggYzBhZTYyNS4uMjc0ZDViYyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS9lcnJuby5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vZXJybm8uaApAQCAtOTcsMTAgKzk3LDEwIEBACiAjZGVmaW5lCUVOT1RDT05OCTIzNQkvKiBUcmFuc3BvcnQgZW5kcG9pbnQgaXMgbm90IGNvbm5lY3RlZCAqLwogI2RlZmluZQlFU0hVVERPV04JMjM2CS8qIENhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93biAqLwogI2RlZmluZQlFVE9PTUFOWVJFRlMJMjM3CS8qIFRvbyBtYW55IHJlZmVyZW5jZXM6IGNhbm5vdCBzcGxpY2UgKi8KLSNkZWZpbmUgRVJFRlVTRUQJRUNPTk5SRUZVU0VECS8qIGZvciBIUCdzIE5GUyBhcHBhcmVudGx5ICovCiAjZGVmaW5lCUVUSU1FRE9VVAkyMzgJLyogQ29ubmVjdGlvbiB0aW1lZCBvdXQgKi8KICNkZWZpbmUJRUNPTk5SRUZVU0VECTIzOQkvKiBDb25uZWN0aW9uIHJlZnVzZWQgKi8KLSNkZWZpbmUgRVJFTU9URVJFTEVBU0UJMjQwCS8qIFJlbW90ZSBwZWVyIHJlbGVhc2VkIGNvbm5lY3Rpb24gKi8KKyNkZWZpbmUJRVJFRlVTRUQJRUNPTk5SRUZVU0VECS8qIGZvciBIUCdzIE5GUyBhcHBhcmVudGx5ICovCisjZGVmaW5lCUVSRU1PVEVSRUxFQVNFCTI0MAkvKiBSZW1vdGUgcGVlciByZWxlYXNlZCBjb25uZWN0aW9uICovCiAjZGVmaW5lCUVIT1NURE9XTgkyNDEJLyogSG9zdCBpcyBkb3duICovCiAjZGVmaW5lCUVIT1NUVU5SRUFDSAkyNDIJLyogTm8gcm91dGUgdG8gaG9zdCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZnRyYWNlLmMKaW5kZXggYTgyOGEwYS4uNWE1NTA2YSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL2Z0cmFjZS5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9mdHJhY2UuYwpAQCAtNDgsNyArNDgsNyBAQAogCQlyZXR1cm47CiAKICAgICAgICAgaWYgKGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZShvbGQsIHNlbGZfYWRkciwgJnRyYWNlLmRlcHRoLAotCQkJMCApID09IC1FQlVTWSkKKwkJCQkgICAgIDAsIE5VTEwpID09IC1FQlVTWSkKICAgICAgICAgICAgICAgICByZXR1cm47CiAKIAkvKiBhY3RpdmF0ZSBwYXJpc2NfcmV0dXJuX3RvX2hhbmRsZXIoKSBhcyByZXR1cm4gcG9pbnQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wcm9jZXNzb3IuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9wcm9jZXNzb3IuYwppbmRleCA1YWRjMzM5Li4wYzJhOTRhIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzc29yLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3Byb2Nlc3Nvci5jCkBAIC01MSw4ICs1MSw2IEBACiAKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVpbmZvX3BhcmlzYywgY3B1X2RhdGEpOwogCi1leHRlcm4gaW50IHVwZGF0ZV9jcjE2X2Nsb2Nrc291cmNlKHZvaWQpOwkvKiBmcm9tIHRpbWUuYyAqLwotCiAvKgogKiogIAlQQVJJU0MgQ1BVIGRyaXZlciAtIGNsYWltICJkZXZpY2UiIGFuZCBpbml0aWFsaXplIENQVSBkYXRhIHN0cnVjdHVyZXMuCiAqKgpAQCAtMjI4LDEyICsyMjYsNiBAQAogCX0KICNlbmRpZgogCi0JLyogSWYgd2UndmUgcmVnaXN0ZXJlZCBtb3JlIHRoYW4gb25lIGNwdSwKLQkgKiB3ZSdsbCB1c2UgdGhlIGppZmZpZXMgY2xvY2tzb3VyY2Ugc2luY2UgY3IxNgotCSAqIGlzIG5vdCBzeW5jaHJvbml6ZWQgYmV0d2VlbiBDUFVzLgotCSAqLwotCXVwZGF0ZV9jcjE2X2Nsb2Nrc291cmNlKCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3RpbWUuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC90aW1lLmMKaW5kZXggNTA1Y2YxYS4uNGIwYjk2MyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdGltZS5jCkBAIC0yMjEsMTggKzIyMSw2IEBACiAJLmZsYWdzCQkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CiAKLWludCB1cGRhdGVfY3IxNl9jbG9ja3NvdXJjZSh2b2lkKQotewotCS8qIHNpbmNlIHRoZSBjcjE2IGN5Y2xlIGNvdW50ZXJzIGFyZSBub3Qgc3luY2hyb25pemVkIGFjcm9zcyBDUFVzLAotCSAgIHdlJ2xsIGNoZWNrIGlmIHdlIHNob3VsZCBzd2l0Y2ggdG8gYSBzYWZlIGNsb2Nrc291cmNlOiAqLwotCWlmIChjbG9ja3NvdXJjZV9jcjE2LnJhdGluZyAhPSAwICYmIG51bV9vbmxpbmVfY3B1cygpID4gMSkgewotCQljbG9ja3NvdXJjZV9jaGFuZ2VfcmF0aW5nKCZjbG9ja3NvdXJjZV9jcjE2LCAwKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHZvaWQgX19pbml0IHN0YXJ0X2NwdV9pdGltZXIodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdV9oYXNfZmVhdHVyZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdV9oYXNfZmVhdHVyZS5oCmluZGV4IDJlZjU1ZjguLmIzMTJiMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHVfaGFzX2ZlYXR1cmUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1X2hhc19mZWF0dXJlLmgKQEAgLTE1LDcgKzE1LDcgQEAKICNpZmRlZiBDT05GSUdfSlVNUF9MQUJFTF9GRUFUVVJFX0NIRUNLUwogI2luY2x1ZGUgPGxpbnV4L2p1bXBfbGFiZWwuaD4KIAotI2RlZmluZSBOVU1fQ1BVX0ZUUl9LRVlTCTY0CisjZGVmaW5lIE5VTV9DUFVfRlRSX0tFWVMJQklUU19QRVJfTE9ORwogCiBleHRlcm4gc3RydWN0IHN0YXRpY19rZXlfdHJ1ZSBjcHVfZmVhdHVyZV9rZXlzW05VTV9DUFVfRlRSX0tFWVNdOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGhyZWFkcy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRocmVhZHMuaAppbmRleCA2NjZiZWY0ZS4uOTM3N2JkZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRocmVhZHMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGhyZWFkcy5oCkBAIC0zLDYgKzMsNyBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxhc20vY3B1X2hhc19mZWF0dXJlLmg+CiAKIC8qCiAgKiBNYXBwaW5nIG9mIHRocmVhZHMgdG8gY29yZXMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9obWkuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9obWkuaAppbmRleCA4OGI0OTAxLi44NWI3YTFhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaG1pLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2htaS5oCkBAIC0yMSw3ICsyMSw3IEBACiAjaWZuZGVmIF9fQVNNX1BQQzY0X0hNSV9IX18KICNkZWZpbmUgX19BU01fUFBDNjRfSE1JX0hfXwogCi0jaWZkZWYgQ09ORklHX1BQQ19CT09LM1NfNjQKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU19IVl9QT1NTSUJMRQogCiAjZGVmaW5lCUNPUkVfVEJfUkVTWU5DX1JFUV9CSVQJCTYzCiAjZGVmaW5lIE1BWF9TVUJDT1JFX1BFUl9DT1JFCQk0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaAppbmRleCAxNDgzMDNlNy4uNmE2NzkyYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oCkBAIC0xODMsMTEgKzE4Myw2IEBACiAJICovCiAJdTE2IGluX21jZTsKIAl1OCBobWlfZXZlbnRfYXZhaWxhYmxlOwkJIC8qIEhNSSBldmVudCBpcyBhdmFpbGFibGUgKi8KLQkvKgotCSAqIEJpdG1hcCBmb3Igc2libGluZyBzdWJjb3JlIHN0YXR1cy4gU2VlIGt2bS9ib29rM3NfaHZfcmFzLmMgZm9yCi0JICogbW9yZSBkZXRhaWxzCi0JICovCi0Jc3RydWN0IHNpYmxpbmdfc3ViY29yZV9zdGF0ZSAqc2libGluZ19zdWJjb3JlX3N0YXRlOwogI2VuZGlmCiAKIAkvKiBTdHVmZiBmb3IgYWNjdXJhdGUgdGltZSBhY2NvdW50aW5nICovCkBAIC0yMDIsNiArMTk3LDEzIEBACiAJc3RydWN0IGt2bXBwY19ib29rM3Nfc2hhZG93X3ZjcHUgc2hhZG93X3ZjcHU7CiAjZW5kaWYKIAlzdHJ1Y3Qga3ZtcHBjX2hvc3Rfc3RhdGUga3ZtX2hzdGF0ZTsKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU19IVl9QT1NTSUJMRQorCS8qCisJICogQml0bWFwIGZvciBzaWJsaW5nIHN1YmNvcmUgc3RhdHVzLiBTZWUga3ZtL2Jvb2szc19odl9yYXMuYyBmb3IKKwkgKiBtb3JlIGRldGFpbHMKKwkgKi8KKwlzdHJ1Y3Qgc2libGluZ19zdWJjb3JlX3N0YXRlICpzaWJsaW5nX3N1YmNvcmVfc3RhdGU7CisjZW5kaWYKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BjaS1icmlkZ2UuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmgKaW5kZXggYjVlODhlNC4uYzAzMDljNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BjaS1icmlkZ2UuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGNpLWJyaWRnZS5oCkBAIC0zMDEsNiArMzAxLDcgQEAKIC8qIEFsbG9jYXRlICYgZnJlZSBhIFBDSSBob3N0IGJyaWRnZSBzdHJ1Y3R1cmUgKi8KIGV4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CiBleHRlcm4gdm9pZCBwY2liaW9zX2ZyZWVfY29udHJvbGxlcihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYik7CitleHRlcm4gdm9pZCBwY2liaW9zX2ZyZWVfY29udHJvbGxlcl9kZWZlcnJlZChzdHJ1Y3QgcGNpX2hvc3RfYnJpZGdlICpicmlkZ2UpOwogCiAjaWZkZWYgQ09ORklHX1BDSQogZXh0ZXJuIGludCBwY2liaW9zX3ZhZGRyX2lzX2lvcG9ydCh2b2lkIF9faW9tZW0gKmFkZHJlc3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggYzFkYzZjMS4uYzI2NjIyNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0zMDgsNDAgKzMwOCwyMSBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLAogCQljb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewotCXVuc2lnbmVkIGxvbmcgb3ZlcjsKLQotCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKSB7Ci0JCWlmICghX19idWlsdGluX2NvbnN0YW50X3AobikpCi0JCQljaGVja19vYmplY3Rfc2l6ZSh0bywgbiwgZmFsc2UpOworCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkpIHsKKwkJY2hlY2tfb2JqZWN0X3NpemUodG8sIG4sIGZhbHNlKTsKIAkJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcigoX19mb3JjZSB2b2lkIF9fdXNlciAqKXRvLCBmcm9tLCBuKTsKIAl9Ci0JaWYgKCh1bnNpZ25lZCBsb25nKWZyb20gPCBUQVNLX1NJWkUpIHsKLQkJb3ZlciA9ICh1bnNpZ25lZCBsb25nKWZyb20gKyBuIC0gVEFTS19TSVpFOwotCQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4gLSBvdmVyKSkKLQkJCWNoZWNrX29iamVjdF9zaXplKHRvLCBuIC0gb3ZlciwgZmFsc2UpOwotCQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKChfX2ZvcmNlIHZvaWQgX191c2VyICopdG8sIGZyb20sCi0JCQkJbiAtIG92ZXIpICsgb3ZlcjsKLQl9CisJbWVtc2V0KHRvLCAwLCBuKTsKIAlyZXR1cm4gbjsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sCiAJCWNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKLQl1bnNpZ25lZCBsb25nIG92ZXI7Ci0KIAlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgdG8sIG4pKSB7Ci0JCWlmICghX19idWlsdGluX2NvbnN0YW50X3AobikpCi0JCQljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBuLCB0cnVlKTsKKwkJY2hlY2tfb2JqZWN0X3NpemUoZnJvbSwgbiwgdHJ1ZSk7CiAJCXJldHVybiBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIChfX2ZvcmNlIHZvaWQgX191c2VyICopZnJvbSwgbik7CiAJfQotCWlmICgodW5zaWduZWQgbG9uZyl0byA8IFRBU0tfU0laRSkgewotCQlvdmVyID0gKHVuc2lnbmVkIGxvbmcpdG8gKyBuIC0gVEFTS19TSVpFOwotCQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQotCQkJY2hlY2tfb2JqZWN0X3NpemUoZnJvbSwgbiAtIG92ZXIsIHRydWUpOwotCQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKHRvLCAoX19mb3JjZSB2b2lkIF9fdXNlciAqKWZyb20sCi0JCQkJbiAtIG92ZXIpICsgb3ZlcjsKLQl9CiAJcmV0dXJuIG47CiB9CiAKQEAgLTM4Myw4ICszNjQsNyBAQAogCQkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKLQkJY2hlY2tfb2JqZWN0X3NpemUodG8sIG4sIGZhbHNlKTsKKwljaGVja19vYmplY3Rfc2l6ZSh0bywgbiwgZmFsc2UpOwogCiAJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcigoX19mb3JjZSB2b2lkIF9fdXNlciAqKXRvLCBmcm9tLCBuKTsKIH0KQEAgLTQxMiw4ICszOTIsOCBAQAogCQlpZiAocmV0ID09IDApCiAJCQlyZXR1cm4gMDsKIAl9Ci0JaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKLQkJY2hlY2tfb2JqZWN0X3NpemUoZnJvbSwgbiwgdHJ1ZSk7CisKKwljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBuLCB0cnVlKTsKIAogCXJldHVybiBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIChfX2ZvcmNlIGNvbnN0IHZvaWQgX191c2VyICopZnJvbSwgbik7CiB9CkBAIC00MzksMTAgKzQxOSw2IEBACiAJbWlnaHRfZmF1bHQoKTsKIAlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGFkZHIsIHNpemUpKSkKIAkJcmV0dXJuIF9fY2xlYXJfdXNlcihhZGRyLCBzaXplKTsKLQlpZiAoKHVuc2lnbmVkIGxvbmcpYWRkciA8IFRBU0tfU0laRSkgewotCQl1bnNpZ25lZCBsb25nIG92ZXIgPSAodW5zaWduZWQgbG9uZylhZGRyICsgc2l6ZSAtIFRBU0tfU0laRTsKLQkJcmV0dXJuIF9fY2xlYXJfdXNlcihhZGRyLCBzaXplIC0gb3ZlcikgKyBvdmVyOwotCX0KIAlyZXR1cm4gc2l6ZTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKaW5kZXggYjIwMjdhNS4uZmU0YzA3NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCkBAIC00MSw3ICs0MSw3IEBACiBvYmotJChDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UKQkrPSBod19icmVha3BvaW50Lm8KIG9iai0kKENPTkZJR19QUENfQk9PSzNTXzY0KQkrPSBjcHVfc2V0dXBfcHBjOTcwLm8gY3B1X3NldHVwX3BhNnQubwogb2JqLSQoQ09ORklHX1BQQ19CT09LM1NfNjQpCSs9IGNwdV9zZXR1cF9wb3dlci5vCi1vYmotJChDT05GSUdfUFBDX0JPT0szU182NCkJKz0gbWNlLm8gbWNlX3Bvd2VyLm8gaG1pLm8KK29iai0kKENPTkZJR19QUENfQk9PSzNTXzY0KQkrPSBtY2UubyBtY2VfcG93ZXIubwogb2JqLSQoQ09ORklHX1BQQ19CT09LM0VfNjQpCSs9IGV4Y2VwdGlvbnMtNjRlLm8gaWRsZV9ib29rM2Uubwogb2JqLSQoQ09ORklHX1BQQzY0KQkJKz0gdmRzbzY0Lwogb2JqLSQoQ09ORklHX0FMVElWRUMpCQkrPSB2ZWNlbXUubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TCmluZGV4IDZiOGJjMGQuLjVhZmQwM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfNjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMKQEAgLTM2OCwxMyArMzY4LDEzIEBACiB0YWJvcnRfc3lzY2FsbDoKIAkvKiBGaXJzdGx5IHdlIG5lZWQgdG8gZW5hYmxlIFRNIGluIHRoZSBrZXJuZWwgKi8KIAltZm1zcglyMTAKLQlsaQlyMTMsIDEKLQlybGRpbWkJcjEwLCByMTMsIE1TUl9UTV9MRywgNjMtTVNSX1RNX0xHCisJbGkJcjksIDEKKwlybGRpbWkJcjEwLCByOSwgTVNSX1RNX0xHLCA2My1NU1JfVE1fTEcKIAltdG1zcmQJcjEwLCAwCiAKIAkvKiB0YWJvcnQsIHRoaXMgZG9vbXMgdGhlIHRyYW5zYWN0aW9uLCBub3RoaW5nIGVsc2UgKi8KLQlsaQlyMTMsIChUTV9DQVVTRV9TWVNDQUxMfFRNX0NBVVNFX1BFUlNJU1RFTlQpCi0JVEFCT1JUKFIxMykKKwlsaQlyOSwgKFRNX0NBVVNFX1NZU0NBTEx8VE1fQ0FVU0VfUEVSU0lTVEVOVCkKKwlUQUJPUlQoUjkpCiAKIAkvKgogCSAqIFJldHVybiBkaXJlY3RseSB0byB1c2Vyc3BhY2UuIFdlIGhhdmUgY29ycnVwdGVkIHVzZXIgcmVnaXN0ZXIgc3RhdGUsCkBAIC0zODIsOCArMzgyLDggQEAKIAkgKiByZXN1bWUgYWZ0ZXIgdGhlIHRiZWdpbiBvZiB0aGUgYWJvcnRlZCB0cmFuc2FjdGlvbiB3aXRoIHRoZQogCSAqIGNoZWNrcG9pbnRlZCByZWdpc3RlciBzdGF0ZS4KIAkgKi8KLQlsaQlyMTMsIE1TUl9SSQotCWFuZGMJcjEwLCByMTAsIHIxMworCWxpCXI5LCBNU1JfUkkKKwlhbmRjCXIxMCwgcjEwLCByOQogCW10bXNyZAlyMTAsIDEKIAltdHNwcglTUFJOX1NSUjAsIHIxMQogCW10c3ByCVNQUk5fU1JSMSwgcjEyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMKaW5kZXggZGY2ZDQ1ZS4uYmZmZWM3MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUwpAQCAtNDg1LDcgKzQ4NSwyMyBAQAogCUVYQ0VQVElPTl9QUk9MT0dfMChQQUNBX0VYTUMpCiBtYWNoaW5lX2NoZWNrX3BTZXJpZXNfMDoKIAlFWENFUFRJT05fUFJPTE9HXzEoUEFDQV9FWE1DLCBLVk1URVNULCAweDIwMCkKLQlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVNfMShtYWNoaW5lX2NoZWNrX2NvbW1vbiwgRVhDX1NURCkKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgaXMgZXNzZW50aWFsbHkgRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTXzEgd2l0aCB0aGUKKwkgKiBkaWZmZXJlbmNlIHRoYXQgTVNSX1JJIGlzIG5vdCBlbmFibGVkLCBiZWNhdXNlIFBBQ0FfRVhNQyBpcyBiZWluZworCSAqIHVzZWQsIHNvIG5lc3RlZCBtYWNoaW5lIGNoZWNrIGNvcnJ1cHRzIGl0LiBtYWNoaW5lX2NoZWNrX2NvbW1vbgorCSAqIGVuYWJsZXMgTVNSX1JJLgorCSAqLworCWxkCXIxMixQQUNBS0JBU0UocjEzKQorCWxkCXIxMCxQQUNBS01TUihyMTMpCisJeG9yaQlyMTAscjEwLE1TUl9SSQorCW1mc3ByCXIxMSxTUFJOX1NSUjAKKwlMT0FEX0hBTkRMRVIocjEyLCBtYWNoaW5lX2NoZWNrX2NvbW1vbikKKwltdHNwcglTUFJOX1NSUjAscjEyCisJbWZzcHIJcjEyLFNQUk5fU1JSMQorCW10c3ByCVNQUk5fU1JSMSxyMTAKKwlyZmlkCisJYgkuCS8qIHByZXZlbnQgc3BlY3VsYXRpdmUgZXhlY3V0aW9uICovCisKIAlLVk1fSEFORExFUl9TS0lQKFBBQ0FfRVhNQywgRVhDX1NURCwgMHgyMDApCiAJS1ZNX0hBTkRMRVJfU0tJUChQQUNBX0VYR0VOLCBFWENfU1RELCAweDMwMCkKIAlLVk1fSEFORExFUl9TS0lQKFBBQ0FfRVhTTEIsIEVYQ19TVEQsIDB4MzgwKQpAQCAtOTY5LDE0ICs5ODUsMTcgQEAKIG1hY2hpbmVfY2hlY2tfY29tbW9uOgogCiAJbWZzcHIJcjEwLFNQUk5fREFSCi0Jc3RkCXIxMCxQQUNBX0VYR0VOK0VYX0RBUihyMTMpCisJc3RkCXIxMCxQQUNBX0VYTUMrRVhfREFSKHIxMykKIAltZnNwcglyMTAsU1BSTl9EU0lTUgotCXN0dwlyMTAsUEFDQV9FWEdFTitFWF9EU0lTUihyMTMpCisJc3R3CXIxMCxQQUNBX0VYTUMrRVhfRFNJU1IocjEzKQogCUVYQ0VQVElPTl9QUk9MT0dfQ09NTU9OKDB4MjAwLCBQQUNBX0VYTUMpCiAJRklOSVNIX05BUAogCVJFQ09OQ0lMRV9JUlFfU1RBVEUocjEwLCByMTEpCi0JbGQJcjMsUEFDQV9FWEdFTitFWF9EQVIocjEzKQotCWx3eglyNCxQQUNBX0VYR0VOK0VYX0RTSVNSKHIxMykKKwlsZAlyMyxQQUNBX0VYTUMrRVhfREFSKHIxMykKKwlsd3oJcjQsUEFDQV9FWE1DK0VYX0RTSVNSKHIxMykKKwkvKiBFbmFibGUgTVNSX1JJIHdoZW4gZmluaXNoZWQgd2l0aCBQQUNBX0VYTUMgKi8KKwlsaQlyMTAsTVNSX1JJCisJbXRtc3JkIAlyMTAsMQogCXN0ZAlyMyxfREFSKHIxKQogCXN0ZAlyNCxfRFNJU1IocjEpCiAJYmwJc2F2ZV9udmdwcnMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2Z0cmFjZS5jCmluZGV4IGNjNTJkOTcuLmE5NTYzOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZnRyYWNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9mdHJhY2UuYwpAQCAtNTkzLDcgKzU5Myw4IEBACiAJaWYgKCFmdHJhY2VfZ3JhcGhfZW50cnkoJnRyYWNlKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKHBhcmVudCwgaXAsICZ0cmFjZS5kZXB0aCwgMCkgPT0gLUVCVVNZKQorCWlmIChmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2UocGFyZW50LCBpcCwgJnRyYWNlLmRlcHRoLCAwLAorCQkJCSAgICAgTlVMTCkgPT0gLUVCVVNZKQogCQlnb3RvIG91dDsKIAogCXBhcmVudCA9IHJldHVybl9ob29rZXI7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfYm9vazNzLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfYm9vazNzLlMKaW5kZXggMjI2NWM2My4uYmQ3MzlmZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX2Jvb2szcy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZV9ib29rM3MuUwpAQCAtNDExLDcgKzQxMSw3IEBACiAgKgogICogcjEzIC0gUEFDQQogICogY3IzIC0gZ3QgaWYgd2FraW5nIHVwIHdpdGggcGFydGlhbC9jb21wbGV0ZSBoeXBlcnZpc29yIHN0YXRlIGxvc3MKLSAqIGNyNCAtIGVxIGlmIHdha2luZyB1cCBmcm9tIGNvbXBsZXRlIGh5cGVydmlzb3Igc3RhdGUgbG9zcy4KKyAqIGNyNCAtIGd0IG9yIGVxIGlmIHdha2luZyB1cCBmcm9tIGNvbXBsZXRlIGh5cGVydmlzb3Igc3RhdGUgbG9zcy4KICAqLwogX0dMT0JBTChwbnZfd2FrZXVwX3RiX2xvc3MpCiAJbGQJcjEsUEFDQVIxKHIxMykKQEAgLTQ1Myw3ICs0NTMsNyBAQAogCSAqIEF0IHRoaXMgc3RhZ2UKIAkgKiBjcjIgLSBlcSBpZiBmaXJzdCB0aHJlYWQgdG8gd2FrZXVwIGluIGNvcmUKIAkgKiBjcjMtICBndCBpZiB3YWtpbmcgdXAgd2l0aCBwYXJ0aWFsL2NvbXBsZXRlIGh5cGVydmlzb3Igc3RhdGUgbG9zcwotCSAqIGNyNCAtIGVxIGlmIHdha2luZyB1cCBmcm9tIGNvbXBsZXRlIGh5cGVydmlzb3Igc3RhdGUgbG9zcy4KKwkgKiBjcjQgLSBndCBvciBlcSBpZiB3YWtpbmcgdXAgZnJvbSBjb21wbGV0ZSBoeXBlcnZpc29yIHN0YXRlIGxvc3MuCiAJICovCiAKIAlvcmkJcjE1LHIxNSxQTlZfQ09SRV9JRExFX0xPQ0tfQklUCkBAIC00ODEsNyArNDgxLDcgQEAKIAkgKiBJZiB3YWtpbmcgdXAgZnJvbSBzbGVlcCwgc3ViY29yZSBzdGF0ZSBpcyBub3QgbG9zdC4gSGVuY2UKIAkgKiBza2lwIHN1YmNvcmUgc3RhdGUgcmVzdG9yZQogCSAqLwotCWJuZQljcjQsc3ViY29yZV9zdGF0ZV9yZXN0b3JlZAorCWJsdAljcjQsc3ViY29yZV9zdGF0ZV9yZXN0b3JlZAogCiAJLyogUmVzdG9yZSBwZXItc3ViY29yZSBzdGF0ZSAqLwogCWxkICAgICAgcjQsX1NEUjEocjEpCkBAIC01MjYsNyArNTI2LDcgQEAKIAkgKiBJZiB3YWtpbmcgdXAgZnJvbSBzbGVlcCwgcGVyIGNvcmUgc3RhdGUgaXMgbm90IGxvc3QsIHNraXAgdG8KIAkgKiBjbGVhcl9sb2NrLgogCSAqLwotCWJuZQljcjQsY2xlYXJfbG9jaworCWJsdAljcjQsY2xlYXJfbG9jawogCiAJLyoKIAkgKiBGaXJzdCB0aHJlYWQgaW4gdGhlIGNvcmUgdG8gd2FrZSB1cCBhbmQgaXRzIHdha2luZyB1cCB3aXRoCkBAIC01NTcsNyArNTU3LDcgQEAKIAkgKiBJZiB3YWtpbmcgdXAgZnJvbSBzbGVlcCwgaHlwZXJ2aXNvciBzdGF0ZSBpcyBub3QgbG9zdC4gSGVuY2UKIAkgKiBza2lwIGh5cGVydmlzb3Igc3RhdGUgcmVzdG9yZS4KIAkgKi8KLQlibmUJY3I0LGh5cGVydmlzb3Jfc3RhdGVfcmVzdG9yZWQKKwlibHQJY3I0LGh5cGVydmlzb3Jfc3RhdGVfcmVzdG9yZWQKIAogCS8qIFdha2luZyB1cCBmcm9tIHdpbmtsZSAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDNlZDhlYzA5Li5lNzg1Y2M5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2twcm9iZXMuYwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vY29kZS1wYXRjaGluZy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYwppbmRleCA3ZmRmMzI0Li5lNTg5MDgwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYwpAQCAtMTU0LDYgKzE1NCw0MiBAQAogRVhQT1JUX1NZTUJPTF9HUEwocGNpYmlvc19mcmVlX2NvbnRyb2xsZXIpOwogCiAvKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNhbGwgcGNpYmlvc19mcmVlX2NvbnRyb2xsZXIoKQorICogaW4gYSBkZWZlcnJlZCBtYW5uZXI6IGEgY2FsbGJhY2sgZnJvbSB0aGUgUENJIHN1YnN5c3RlbS4KKyAqCisgKiBfKkRPIE5PVCpfIGNhbGwgcGNpYmlvc19mcmVlX2NvbnRyb2xsZXIoKSBleHBsaWNpdGx5IGlmCisgKiB0aGlzIGlzIHVzZWQgKG9yIGl0IG1heSBhY2Nlc3MgYW4gaW52YWxpZCAqcGhiIHBvaW50ZXIpLgorICoKKyAqIFRoZSBjYWxsYmFjayBvY2N1cnMgd2hlbiBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcm9vdCBidXMKKyAqIGFyZSBkcm9wcGVkIChlLmcuLCBjaGlsZCBidXNlcy9kZXZpY2VzIGFuZCB0aGVpciB1c2VycykuCisgKgorICogSXQncyBjYWxsZWQgYXMgLnJlbGVhc2VfZm4oKSBvZiAnc3RydWN0IHBjaV9ob3N0X2JyaWRnZScKKyAqIHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgJ3N0cnVjdCBwY2lfY29udHJvbGxlci5idXMnCisgKiAocm9vdCBidXMpIC0gaXQgZXhwZWN0cyAucmVsZWFzZV9kYXRhIHRvIGhvbGQgYSBwb2ludGVyCisgKiB0byAnc3RydWN0IHBjaV9jb250cm9sbGVyJy4KKyAqCisgKiBJbiBvcmRlciB0byB1c2UgaXQsIHJlZ2lzdGVyIC5yZWxlYXNlX2ZuKCkvcmVsZWFzZV9kYXRhCisgKiBsaWtlIHRoaXM6CisgKgorICogcGNpX3NldF9ob3N0X2JyaWRnZV9yZWxlYXNlKGJyaWRnZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2liaW9zX2ZyZWVfY29udHJvbGxlcl9kZWZlcnJlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIHBoYik7CisgKgorICogZS5nLiBpbiB0aGUgcGNpYmlvc19yb290X2JyaWRnZV9wcmVwYXJlKCkgY2FsbGJhY2sgZnJvbQorICogcGNpX2NyZWF0ZV9yb290X2J1cygpLgorICovCit2b2lkIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyX2RlZmVycmVkKHN0cnVjdCBwY2lfaG9zdF9icmlkZ2UgKmJyaWRnZSkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYiA9IChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKikKKwkJCQkJIGJyaWRnZS0+cmVsZWFzZV9kYXRhOworCisJcHJfZGVidWcoImRvbWFpbiAlZCwgZHluYW1pYyAlZFxuIiwgcGhiLT5nbG9iYWxfbnVtYmVyLCBwaGItPmlzX2R5bmFtaWMpOworCisJcGNpYmlvc19mcmVlX2NvbnRyb2xsZXIocGhiKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaWJpb3NfZnJlZV9jb250cm9sbGVyX2RlZmVycmVkKTsKKworLyoKICAqIFRoZSBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbWluaW1hbCBhbGlnbm1lbnQKICAqIGZvciBtZW1vcnkgb3IgSS9PIHdpbmRvd3Mgb2YgdGhlIGFzc29jaWF0ZWQgUDJQIGJyaWRnZS4KICAqIEJ5IGRlZmF1bHQsIDRLaUIgYWxpZ25tZW50IGZvciBJL08gd2luZG93cyBhbmQgMU1pQiBmb3IKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCmluZGV4IDRlNzRmYzUuLmQzZWZmOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYwpAQCAtNjk1LDcgKzY5NSw3IEBACiAJT1Y0X01JTl9FTlRfQ0FQLAkJLyogbWluaW11bSBWUCBlbnRpdGxlZCBjYXBhY2l0eSAqLwogCiAJLyogb3B0aW9uIHZlY3RvciA1OiBQQVBSL09GIG9wdGlvbnMgKi8KLQlWRUNUT1JfTEVOR1RIKDE4KSwJCS8qIGxlbmd0aCAqLworCVZFQ1RPUl9MRU5HVEgoMjEpLAkJLyogbGVuZ3RoICovCiAJMCwJCQkJLyogZG9uJ3QgaWdub3JlLCBkb24ndCBoYWx0ICovCiAJT1Y1X0ZFQVQoT1Y1X0xQQVIpIHwgT1Y1X0ZFQVQoT1Y1X1NQTFBBUikgfCBPVjVfRkVBVChPVjVfTEFSR0VfUEFHRVMpIHwKIAlPVjVfRkVBVChPVjVfRFJDT05GX01FTU9SWSkgfCBPVjVfRkVBVChPVjVfRE9OQVRFX0RFRElDQVRFX0NQVSkgfApAQCAtNzI2LDggKzcyNiwxMSBAQAogCTAsCiAJMCwKIAlPVjVfRkVBVChPVjVfUEZPX0hXX1JORykgfCBPVjVfRkVBVChPVjVfUEZPX0hXX0VOQ1IpIHwKLQlPVjVfRkVBVChPVjVfUEZPX0hXXzg0MiksCi0JT1Y1X0ZFQVQoT1Y1X1NVQl9QUk9DRVNTT1JTKSwKKwlPVjVfRkVBVChPVjVfUEZPX0hXXzg0MiksCQkJCS8qIEJ5dGUgMTcgKi8KKwkwLAkJCQkJCQkvKiBCeXRlIDE4ICovCisJMCwJCQkJCQkJLyogQnl0ZSAxOSAqLworCTAsCQkJCQkJCS8qIEJ5dGUgMjAgKi8KKwlPVjVfRkVBVChPVjVfU1VCX1BST0NFU1NPUlMpLAkJCQkvKiBCeXRlIDIxICovCiAKIAkvKiBvcHRpb24gdmVjdG9yIDY6IElCTSBQQVBSIGhpbnRzICovCiAJVkVDVE9SX0xFTkdUSCgzKSwJCS8qIGxlbmd0aCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMKaW5kZXggYjZhYTM3OC4uYTdkYWY3NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jCkBAIC0xMjI2LDcgKzEyMjYsMjEgQEAKIAkJKHJlZ3MtPmdwclsxXSArIF9fU0lHTkFMX0ZSQU1FU0laRSArIDE2KTsKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgcnRfc2YsIHNpemVvZigqcnRfc2YpKSkKIAkJZ290byBiYWQ7CisKICNpZmRlZiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIHRyYW5zYWN0aW9uYWwgc3RhdGUgdGhlbiB0aHJvdyBpdCBhd2F5LgorCSAqIFRoZSBwdXJwb3NlIG9mIGEgc2lncmV0dXJuIGlzIHRvIGRlc3Ryb3kgYWxsIHRyYWNlcyBvZiB0aGUKKwkgKiBzaWduYWwgZnJhbWUsIHRoaXMgaW5jbHVkZXMgYW55IHRyYW5zYWN0aW9uYWwgc3RhdGUgY3JlYXRlZAorCSAqIHdpdGhpbiBpbi4gV2Ugb25seSBjaGVjayBmb3Igc3VzcGVuZGVkIGFzIHdlIGNhbiBuZXZlciBiZQorCSAqIGFjdGl2ZSBpbiB0aGUga2VybmVsLCB3ZSBhcmUgYWN0aXZlLCB0aGVyZSBpcyBub3RoaW5nIGJldHRlciB0bworCSAqIGRvIHRoYW4gZ28gYWhlYWQgYW5kIEJhZCBUaGluZyBsYXRlci4KKwkgKiBUaGUgY2F1c2UgaXMgbm90IGltcG9ydGFudCBhcyB0aGVyZSB3aWxsIG5ldmVyIGJlIGEKKwkgKiByZWNoZWNrcG9pbnQgc28gaXQncyBub3QgdXNlciB2aXNpYmxlLgorCSAqLworCWlmIChNU1JfVE1fU1VTUEVOREVEKG1mbXNyKCkpKQorCQl0bV9yZWNsYWltX2N1cnJlbnQoMCk7CisKIAlpZiAoX19nZXRfdXNlcih0bXAsICZydF9zZi0+dWMudWNfbGluaykpCiAJCWdvdG8gYmFkOwogCXVjX3RyYW5zYWN0ID0gKHN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKikodWludHB0cl90KXRtcDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jCmluZGV4IDdlNDk5ODQuLjcwNDA5YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYwpAQCAtNjc2LDcgKzY3NiwyMSBAQAogCWlmIChfX2NvcHlfZnJvbV91c2VyKCZzZXQsICZ1Yy0+dWNfc2lnbWFzaywgc2l6ZW9mKHNldCkpKQogCQlnb3RvIGJhZGZyYW1lOwogCXNldF9jdXJyZW50X2Jsb2NrZWQoJnNldCk7CisKICNpZmRlZiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIHRyYW5zYWN0aW9uYWwgc3RhdGUgdGhlbiB0aHJvdyBpdCBhd2F5LgorCSAqIFRoZSBwdXJwb3NlIG9mIGEgc2lncmV0dXJuIGlzIHRvIGRlc3Ryb3kgYWxsIHRyYWNlcyBvZiB0aGUKKwkgKiBzaWduYWwgZnJhbWUsIHRoaXMgaW5jbHVkZXMgYW55IHRyYW5zYWN0aW9uYWwgc3RhdGUgY3JlYXRlZAorCSAqIHdpdGhpbiBpbi4gV2Ugb25seSBjaGVjayBmb3Igc3VzcGVuZGVkIGFzIHdlIGNhbiBuZXZlciBiZQorCSAqIGFjdGl2ZSBpbiB0aGUga2VybmVsLCB3ZSBhcmUgYWN0aXZlLCB0aGVyZSBpcyBub3RoaW5nIGJldHRlciB0bworCSAqIGRvIHRoYW4gZ28gYWhlYWQgYW5kIEJhZCBUaGluZyBsYXRlci4KKwkgKiBUaGUgY2F1c2UgaXMgbm90IGltcG9ydGFudCBhcyB0aGVyZSB3aWxsIG5ldmVyIGJlIGEKKwkgKiByZWNoZWNrcG9pbnQgc28gaXQncyBub3QgdXNlciB2aXNpYmxlLgorCSAqLworCWlmIChNU1JfVE1fU1VTUEVOREVEKG1mbXNyKCkpKQorCQl0bV9yZWNsYWltX2N1cnJlbnQoMCk7CisKIAlpZiAoX19nZXRfdXNlcihtc3IsICZ1Yy0+dWNfbWNvbnRleHQuZ3BfcmVnc1tQVF9NU1JdKSkKIAkJZ290byBiYWRmcmFtZTsKIAlpZiAoTVNSX1RNX0FDVElWRShtc3IpKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYwppbmRleCAyNWEzOTA1Li45YzZmM2ZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKQEAgLTgzMCw3ICs4MzAsNyBAQAogCiAJLyogVXBkYXRlIHNpYmxpbmcgbWFwcyAqLwogCWJhc2UgPSBjcHVfZmlyc3RfdGhyZWFkX3NpYmxpbmcoY3B1KTsKLQlmb3IgKGkgPSAwOyBpIDwgdGhyZWFkc19wZXJfY29yZTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHRocmVhZHNfcGVyX2NvcmUgJiYgYmFzZSArIGkgPCBucl9jcHVfaWRzOyBpKyspIHsKIAkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBjcHVfc2libGluZ19tYXNrKGJhc2UgKyBpKSk7CiAJCWNwdW1hc2tfY2xlYXJfY3B1KGJhc2UgKyBpLCBjcHVfc2libGluZ19tYXNrKGNwdSkpOwogCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIGNwdV9jb3JlX21hc2soYmFzZSArIGkpKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYwppbmRleCAyY2I1ODkyLi42Mjg1OWViIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCkBAIC0yNSw3ICsyNSw4IEBACiAjaW5jbHVkZSA8bGludXgvdXNlci5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIHByaW50X21vZHVsZXMgKi8KICNpbmNsdWRlIDxsaW51eC9wcmN0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9rdm0vTWFrZWZpbGUKaW5kZXggMWY5ZTU1Mi4uODU1ZDRiOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMva3ZtL01ha2VmaWxlCkBAIC03OCw2ICs3OCw3IEBACiAKIGlmZGVmIENPTkZJR19LVk1fQk9PSzNTX0hWX1BPU1NJQkxFCiBrdm0tYm9vazNzXzY0LWJ1aWx0aW4tb2Jqcy0kKENPTkZJR19LVk1fQk9PSzNTXzY0X0hBTkRMRVIpICs9IFwKKwlib29rM3NfaHZfaG1pLm8gXAogCWJvb2szc19odl9ybWhhbmRsZXJzLm8gXAogCWJvb2szc19odl9ybV9tbXUubyBcCiAJYm9vazNzX2h2X3Jhcy5vIFwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaG1pLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9obWkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9wb3dlcnBjL2tlcm5lbC9obWkuYwpyZW5hbWUgdG8gYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfaG1pLmMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9saWIvY2hlY2tzdW1fMzIuUyBiL2FyY2gvcG93ZXJwYy9saWIvY2hlY2tzdW1fMzIuUwppbmRleCAwYTU3ZmU2Li5hYTgyMTRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbGliL2NoZWNrc3VtXzMyLlMKKysrIGIvYXJjaC9wb3dlcnBjL2xpYi9jaGVja3N1bV8zMi5TCkBAIC0xMjcsMTggKzEyNywxOSBAQAogCXN0dwlyNywxMihyMSkKIAlzdHcJcjgsOChyMSkKIAotCXJsd2lubQlyMCxyNCwzLDB4OAotCXJsd25tCXI2LHI2LHIwLDAsMzEJLyogb2RkIGRlc3RpbmF0aW9uIGFkZHJlc3M6IHJvdGF0ZSBvbmUgYnl0ZSAqLwotCWNtcGx3aQljcjcscjAsMAkvKiBpcyBkZXN0aW5hdGlvbiBhZGRyZXNzIGV2ZW4gPyAqLwogCWFkZGljCXIxMixyNiwwCiAJYWRkaQlyNixyNCwtNAogCW5lZwlyMCxyNAogCWFkZGkJcjQscjMsLTQKIAlhbmRpLglyMCxyMCxDQUNIRUxJTkVfTUFTSwkvKiAjIGJ5dGVzIHRvIHN0YXJ0IG9mIGNhY2hlIGxpbmUgKi8KKwljcnNldAk0KmNyNytlcQogCWJlcQk1OGYKIAogCWNtcGx3CTAscjUscjAJCQkvKiBpcyB0aGlzIG1vcmUgdGhhbiB0b3RhbCB0byBkbz8gKi8KIAlibHQJNjNmCQkJLyogaWYgbm90IG11Y2ggdG8gZG8gKi8KKwlybHdpbm0JcjcscjYsMywweDgKKwlybHdubQlyMTIscjEyLHI3LDAsMzEJLyogb2RkIGRlc3RpbmF0aW9uIGFkZHJlc3M6IHJvdGF0ZSBvbmUgYnl0ZSAqLworCWNtcGx3aQljcjcscjcsMAkvKiBpcyBkZXN0aW5hdGlvbiBhZGRyZXNzIGV2ZW4gPyAqLwogCWFuZGkuCXI4LHIwLDMJCQkvKiBnZXQgaXQgd29yZC1hbGlnbmVkIGZpcnN0ICovCiAJbXRjdHIJcjgKIAliZXErCTYxZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMgYi9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYwppbmRleCBhNGRiMjJmLi5iYjFmZmM1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X25vaGFzaC5jIGIvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X25vaGFzaC5jCmluZGV4IDdkOTViYzQuLmM0OTFmMmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9ub2hhc2guYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfbm9oYXNoLmMKQEAgLTM2OSw0NCArMzY5LDM0IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCi0KLXN0YXRpYyBpbnQgbW11X2NvbnRleHRfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCi0JCQkJICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgbW11X2N0eF9jcHVfcHJlcGFyZSh1bnNpZ25lZCBpbnQgY3B1KQogewotCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgaW50KShsb25nKWhjcHU7Ci0KIAkvKiBXZSBkb24ndCB0b3VjaCBDUFUgMCBtYXAsIGl0J3MgYWxsb2NhdGVkIGF0IGFib290IGFuZCBrZXB0CiAJICogYXJvdW5kIGZvcmV2ZXIKIAkgKi8KIAlpZiAoY3B1ID09IGJvb3RfY3B1aWQpCi0JCXJldHVybiBOT1RJRllfT0s7CisJCXJldHVybiAwOwogCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIENQVV9VUF9QUkVQQVJFOgotCWNhc2UgQ1BVX1VQX1BSRVBBUkVfRlJPWkVOOgotCQlwcl9kZXZlbCgiTU1VOiBBbGxvY2F0aW5nIHN0YWxlIGNvbnRleHQgbWFwIGZvciBDUFUgJWRcbiIsIGNwdSk7Ci0JCXN0YWxlX21hcFtjcHVdID0ga3phbGxvYyhDVFhfTUFQX1NJWkUsIEdGUF9LRVJORUwpOwotCQlicmVhazsKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLQljYXNlIENQVV9VUF9DQU5DRUxFRDoKLQljYXNlIENQVV9VUF9DQU5DRUxFRF9GUk9aRU46Ci0JY2FzZSBDUFVfREVBRDoKLQljYXNlIENQVV9ERUFEX0ZST1pFTjoKLQkJcHJfZGV2ZWwoIk1NVTogRnJlZWluZyBzdGFsZSBjb250ZXh0IG1hcCBmb3IgQ1BVICVkXG4iLCBjcHUpOwotCQlrZnJlZShzdGFsZV9tYXBbY3B1XSk7Ci0JCXN0YWxlX21hcFtjcHVdID0gTlVMTDsKLQotCQkvKiBXZSBhbHNvIGNsZWFyIHRoZSBjcHVfdm1fbWFzayBiaXRzIG9mIENQVXMgZ29pbmcgYXdheSAqLwotCQljbGVhcl90YXNrc19tbV9jcHVtYXNrKGNwdSk7Ci0JYnJlYWs7Ci0jZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCi0JfQotCXJldHVybiBOT1RJRllfT0s7CisJcHJfZGV2ZWwoIk1NVTogQWxsb2NhdGluZyBzdGFsZSBjb250ZXh0IG1hcCBmb3IgQ1BVICVkXG4iLCBjcHUpOworCXN0YWxlX21hcFtjcHVdID0ga3phbGxvYyhDVFhfTUFQX1NJWkUsIEdGUF9LRVJORUwpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG1tdV9jb250ZXh0X2NwdV9uYiA9IHsKLQkubm90aWZpZXJfY2FsbAk9IG1tdV9jb250ZXh0X2NwdV9ub3RpZnksCi19Oworc3RhdGljIGludCBtbXVfY3R4X2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUpCit7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJaWYgKGNwdSA9PSBib290X2NwdWlkKQorCQlyZXR1cm4gMDsKKworCXByX2RldmVsKCJNTVU6IEZyZWVpbmcgc3RhbGUgY29udGV4dCBtYXAgZm9yIENQVSAlZFxuIiwgY3B1KTsKKwlrZnJlZShzdGFsZV9tYXBbY3B1XSk7CisJc3RhbGVfbWFwW2NwdV0gPSBOVUxMOworCisJLyogV2UgYWxzbyBjbGVhciB0aGUgY3B1X3ZtX21hc2sgYml0cyBvZiBDUFVzIGdvaW5nIGF3YXkgKi8KKwljbGVhcl90YXNrc19tbV9jcHVtYXNrKGNwdSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KIAogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIApAQCAtNDY5LDcgKzQ1OSw5IEBACiAjZWxzZQogCXN0YWxlX21hcFtib290X2NwdWlkXSA9IG1lbWJsb2NrX3ZpcnRfYWxsb2MoQ1RYX01BUF9TSVpFLCAwKTsKIAotCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmbW11X2NvbnRleHRfY3B1X25iKTsKKwljcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX1BPV0VSUENfTU1VX0NUWF9QUkVQQVJFLAorCQkJCSAgInBvd2VycGMvbW11L2N0eDpwcmVwYXJlIiwKKwkJCQkgIG1tdV9jdHhfY3B1X3ByZXBhcmUsIG1tdV9jdHhfY3B1X2RlYWQpOwogI2VuZGlmCiAKIAlwcmludGsoS0VSTl9JTkZPCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vc2xiX2xvdy5TIGIvYXJjaC9wb3dlcnBjL21tL3NsYl9sb3cuUwppbmRleCBkZmRiOTBjLi45ZjE5ODM0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vc2xiX2xvdy5TCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9zbGJfbG93LlMKQEAgLTExMyw3ICsxMTMsMTIgQEAKIEVORF9NTVVfRlRSX1NFQ1RJT05fSUZDTFIoTU1VX0ZUUl8xVF9TRUdNRU5UKQogCWIJc2xiX2ZpbmlzaF9sb2FkXzFUCiAKLTA6CiswOgkvKgorCSAqIEZvciB1c2Vyc3BhY2UgYWRkcmVzc2VzLCBtYWtlIHN1cmUgdGhpcyBpcyByZWdpb24gMC4KKwkgKi8KKwljbXBkaQlyOSwgMAorCWJuZQk4ZgorCiAJLyogd2hlbiB1c2luZyBzbGljZXMsIHdlIGV4dHJhY3QgdGhlIHBzaXplIG9mZiB0aGUgc2xpY2UgYml0bWFwcwogCSAqIGFuZCB0aGVuIHdlIG5lZWQgdG8gZ2V0IHRoZSBzbGxwIGVuY29kaW5nIG9mZiB0aGUgbW11X3BzaXplX2RlZnMKIAkgKiBhcnJheS4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTJ4X2xwYmZpZm8uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTJ4X2xwYmZpZm8uYwppbmRleCA4ZWI4MmIwLi5kOTNkZDRhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyeF9scGJmaWZvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMnhfbHBiZmlmby5jCkBAIC01MjgsNyArNTI4LDYgQEAKIAkucmVtb3ZlID0gbXBjNTEyeF9scGJmaWZvX3JlbW92ZSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9IERSVl9OQU1FLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAkJLm9mX21hdGNoX3RhYmxlID0gbXBjNTEyeF9scGJmaWZvX21hdGNoLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21jdV9tcGM4MzQ5ZW1pdHguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tY3VfbXBjODM0OWVtaXR4LmMKaW5kZXggZGJjZDAzMC4uNjNjNWFiNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tY3VfbXBjODM0OWVtaXR4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21jdV9tcGM4MzQ5ZW1pdHguYwpAQCAtMjIyLDcgKzIyMiw2IEBACiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWN1X2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJtY3UtbXBjODM0OWVtaXR4IiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJCS5vZl9tYXRjaF90YWJsZSA9IG1jdV9vZl9tYXRjaF90YWJsZSwKIAl9LAogCS5wcm9iZSA9IG1jdV9wcm9iZSwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvaG9sbHkuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvaG9sbHkuYwppbmRleCBkYWZiYTEwLi5kZmQzMTAwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2hvbGx5LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9ob2xseS5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KIAogI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5jCmluZGV4IDgwODA0ZjkuLmY5N2JhYjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc21wLmMKaW5kZXggODM0ODY4Yi4uMzY2ZTRmNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NtcC5jCkBAIC04NTIsMzcgKzg1MiwzMyBAQAogCiAjaWZkZWYgQ09ORklHX1BQQzY0CiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi1zdGF0aWMgaW50IHNtcF9jb3JlOTlfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCi0JCQkJIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQorc3RhdGljIHVuc2lnbmVkIGludCBzbXBfY29yZTk5X2hvc3Rfb3BlbjsKKworc3RhdGljIGludCBzbXBfY29yZTk5X2NwdV9wcmVwYXJlKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJaW50IHJjOwogCi0Jc3dpdGNoKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRToKLQkJLyogT3BlbiBpMmMgYnVzIGlmIGl0IHdhcyB1c2VkIGZvciB0YiBzeW5jICovCi0JCWlmIChwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdCkgewotCQkJcmMgPSBwbWFjX2kyY19vcGVuKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0LCAxKTsKLQkJCWlmIChyYykgewotCQkJCXByX2VycigiRmFpbGVkIHRvIG9wZW4gaTJjIGJ1cyBmb3IgdGltZSBzeW5jXG4iKTsKLQkJCQlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubyhyYyk7Ci0JCQl9CisJLyogT3BlbiBpMmMgYnVzIGlmIGl0IHdhcyB1c2VkIGZvciB0YiBzeW5jICovCisJaWYgKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0ICYmICFzbXBfY29yZTk5X2hvc3Rfb3BlbikgeworCQlyYyA9IHBtYWNfaTJjX29wZW4ocG1hY190Yl9jbG9ja19jaGlwX2hvc3QsIDEpOworCQlpZiAocmMpIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIG9wZW4gaTJjIGJ1cyBmb3IgdGltZSBzeW5jXG4iKTsKKwkJCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKHJjKTsKIAkJfQotCQlicmVhazsKLQljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6Ci0JCS8qIENsb3NlIGkyYyBidXMgaWYgaXQgd2FzIHVzZWQgZm9yIHRiIHN5bmMgKi8KLQkJaWYgKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0KQotCQkJcG1hY19pMmNfY2xvc2UocG1hY190Yl9jbG9ja19jaGlwX2hvc3QpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKKwkJc21wX2NvcmU5OV9ob3N0X29wZW4gPSAxOwogCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNtcF9jb3JlOTlfY3B1X25iID0gewotCS5ub3RpZmllcl9jYWxsCT0gc21wX2NvcmU5OV9jcHVfbm90aWZ5LAotfTsKK3N0YXRpYyBpbnQgc21wX2NvcmU5OV9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUpCit7CisJLyogQ2xvc2UgaTJjIGJ1cyBpZiBpdCB3YXMgdXNlZCBmb3IgdGIgc3luYyAqLworCWlmIChwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdCAmJiBzbXBfY29yZTk5X2hvc3Rfb3BlbikgeworCQlwbWFjX2kyY19jbG9zZShwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdCk7CisJCXNtcF9jb3JlOTlfaG9zdF9vcGVuID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzbXBfY29yZTk5X2JyaW5ndXBfZG9uZSh2b2lkKQpAQCAtOTAyLDcgKzg5OCwxMSBAQAogCQlnNV9waHlfZGlzYWJsZV9jcHUxKCk7CiAJfQogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmc21wX2NvcmU5OV9jcHVfbmIpOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfUE9XRVJQQ19QTUFDX1BSRVBBUkUsCisJCQkJICAicG93ZXJwYy9wbWFjOnByZXBhcmUiLCBzbXBfY29yZTk5X2NwdV9wcmVwYXJlLAorCQkJCSAgTlVMTCk7CisJY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9PTkxJTkVfRFlOLCAicG93ZXJwYy9wbWFjOm9ubGluZSIsCisJCQkJICBzbXBfY29yZTk5X2NwdV9vbmxpbmUsIE5VTEwpOwogI2VuZGlmCiAKIAlpZiAocHBjX21kLnByb2dyZXNzKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtZHVtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtZHVtcC5jCmluZGV4IDJlZTk2NDMuLjRjODI3ODIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLWR1bXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1kdW1wLmMKQEAgLTM3MCw2ICszNzAsNyBAQAogCXVpbnQzMl90IGR1bXBfaWQsIGR1bXBfc2l6ZSwgZHVtcF90eXBlOwogCXN0cnVjdCBkdW1wX29iaiAqZHVtcDsKIAljaGFyIG5hbWVbMjJdOworCXN0cnVjdCBrb2JqZWN0ICprb2JqOwogCiAJcmMgPSBkdW1wX3JlYWRfaW5mbygmZHVtcF9pZCwgJmR1bXBfc2l6ZSwgJmR1bXBfdHlwZSk7CiAJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUykKQEAgLTM4MSw4ICszODIsMTIgQEAKIAkgKiB0aGF0IGdyYWNlZnVsbHkgYW5kIG5vdCBjcmVhdGUgdHdvIGNvbmZsaWN0aW5nCiAJICogZW50cmllcy4KIAkgKi8KLQlpZiAoa3NldF9maW5kX29iaihkdW1wX2tzZXQsIG5hbWUpKQorCWtvYmogPSBrc2V0X2ZpbmRfb2JqKGR1bXBfa3NldCwgbmFtZSk7CisJaWYgKGtvYmopIHsKKwkJLyogRHJvcCByZWZlcmVuY2UgYWRkZWQgYnkga3NldF9maW5kX29iaigpICovCisJCWtvYmplY3RfcHV0KGtvYmopOwogCQlyZXR1cm4gMDsKKwl9CiAKIAlkdW1wID0gY3JlYXRlX2R1bXBfb2JqKGR1bXBfaWQsIGR1bXBfc2l6ZSwgZHVtcF90eXBlKTsKIAlpZiAoIWR1bXApCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1lbG9nLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1lbG9nLmMKaW5kZXggMzdmOTU5Yi4uZjIzNDRjYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtZWxvZy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLWVsb2cuYwpAQCAtMjQ3LDYgKzI0Nyw3IEBACiAJdWludDY0X3QgZWxvZ190eXBlOwogCWludCByYzsKIAljaGFyIG5hbWVbMisxNisxXTsKKwlzdHJ1Y3Qga29iamVjdCAqa29iajsKIAogCXJjID0gb3BhbF9nZXRfZWxvZ19zaXplKCZpZCwgJnNpemUsICZ0eXBlKTsKIAlpZiAocmMgIT0gT1BBTF9TVUNDRVNTKSB7CkBAIC0yNjksOCArMjcwLDEyIEBACiAJICogdGhhdCBncmFjZWZ1bGx5IGFuZCBub3QgY3JlYXRlIHR3byBjb25mbGljdGluZwogCSAqIGVudHJpZXMuCiAJICovCi0JaWYgKGtzZXRfZmluZF9vYmooZWxvZ19rc2V0LCBuYW1lKSkKKwlrb2JqID0ga3NldF9maW5kX29iaihlbG9nX2tzZXQsIG5hbWUpOworCWlmIChrb2JqKSB7CisJCS8qIERyb3AgcmVmZXJlbmNlIGFkZGVkIGJ5IGtzZXRfZmluZF9vYmooKSAqLworCQlrb2JqZWN0X3B1dChrb2JqKTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KIAogCWNyZWF0ZV9lbG9nX29iaihsb2dfaWQsIGVsb2dfc2l6ZSwgZWxvZ190eXBlKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS1pb2RhLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLWlvZGEuYwppbmRleCBmZDk0NDRmLi4zOGE1YzY1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLWlvZGEuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLWlvZGEuYwpAQCAtMTI0LDYgKzEyNCwxMyBAQAogCQlyLT5zdGFydCA8IChwaGItPmlvZGEubTY0X2Jhc2UgKyBwaGItPmlvZGEubTY0X3NpemUpKTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIHBudl9wY2lfaXNfbTY0X2ZsYWdzKHVuc2lnbmVkIGxvbmcgcmVzb3VyY2VfZmxhZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IChJT1JFU09VUkNFX01FTV82NCB8IElPUkVTT1VSQ0VfUFJFRkVUQ0gpOworCisJcmV0dXJuIChyZXNvdXJjZV9mbGFncyAmIGZsYWdzKSA9PSBmbGFnczsKK30KKwogc3RhdGljIHN0cnVjdCBwbnZfaW9kYV9wZSAqcG52X2lvZGFfaW5pdF9wZShzdHJ1Y3QgcG52X3BoYiAqcGhiLCBpbnQgcGVfbm8pCiB7CiAJcGhiLT5pb2RhLnBlX2FycmF5W3BlX25vXS5waGIgPSBwaGI7CkBAIC0xNDksNyArMTU2LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbnZfaW9kYV9wZSAqcG52X2lvZGFfYWxsb2NfcGUoc3RydWN0IHBudl9waGIgKnBoYikKIHsKLQl1bnNpZ25lZCBsb25nIHBlID0gcGhiLT5pb2RhLnRvdGFsX3BlX251bSAtIDE7CisJbG9uZyBwZTsKIAogCWZvciAocGUgPSBwaGItPmlvZGEudG90YWxfcGVfbnVtIC0gMTsgcGUgPj0gMDsgcGUtLSkgewogCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQocGUsIHBoYi0+aW9kYS5wZV9hbGxvYykpCkBAIC0xNjIsMTEgKzE2OSwxMiBAQAogc3RhdGljIHZvaWQgcG52X2lvZGFfZnJlZV9wZShzdHJ1Y3QgcG52X2lvZGFfcGUgKnBlKQogewogCXN0cnVjdCBwbnZfcGhiICpwaGIgPSBwZS0+cGhiOworCXVuc2lnbmVkIGludCBwZV9udW0gPSBwZS0+cGVfbnVtYmVyOwogCiAJV0FSTl9PTihwZS0+cGRldik7CiAKIAltZW1zZXQocGUsIDAsIHNpemVvZihzdHJ1Y3QgcG52X2lvZGFfcGUpKTsKLQljbGVhcl9iaXQocGUtPnBlX251bWJlciwgcGhiLT5pb2RhLnBlX2FsbG9jKTsKKwljbGVhcl9iaXQocGVfbnVtLCBwaGItPmlvZGEucGVfYWxsb2MpOwogfQogCiAvKiBUaGUgZGVmYXVsdCBNNjQgQkFSIGlzIHNoYXJlZCBieSBhbGwgUEVzICovCkBAIC0yMjE2LDcgKzIyMjQsNyBAQAogCiAJcG52X3BjaV9saW5rX3RhYmxlX2FuZF9ncm91cChwaGItPmhvc2UtPm5vZGUsIG51bSwKIAkJCXRibCwgJnBlLT50YWJsZV9ncm91cCk7Ci0JcG52X3BjaV9waGIzX3RjZV9pbnZhbGlkYXRlX3BlKHBlKTsKKwlwbnZfcGNpX2lvZGEyX3RjZV9pbnZhbGlkYXRlX3BlKHBlKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjM1NCw3ICsyMzYyLDcgQEAKIAlpZiAocmV0KQogCQlwZV93YXJuKHBlLCAiVW5tYXBwaW5nIGZhaWxlZCwgcmV0ID0gJWxkXG4iLCByZXQpOwogCWVsc2UKLQkJcG52X3BjaV9waGIzX3RjZV9pbnZhbGlkYXRlX3BlKHBlKTsKKwkJcG52X3BjaV9pb2RhMl90Y2VfaW52YWxpZGF0ZV9wZShwZSk7CiAKIAlwbnZfcGNpX3VubGlua190YWJsZV9hbmRfZ3JvdXAodGFibGVfZ3JvdXAtPnRhYmxlc1tudW1dLCB0YWJsZV9ncm91cCk7CiAKQEAgLTI4NzAsNyArMjg3OCw3IEBACiAJCXJlcyA9ICZwZGV2LT5yZXNvdXJjZVtpICsgUENJX0lPVl9SRVNPVVJDRVNdOwogCQlpZiAoIXJlcy0+ZmxhZ3MgfHwgcmVzLT5wYXJlbnQpCiAJCQljb250aW51ZTsKLQkJaWYgKCFwbnZfcGNpX2lzX202NChwaGIsIHJlcykpIHsKKwkJaWYgKCFwbnZfcGNpX2lzX202NF9mbGFncyhyZXMtPmZsYWdzKSkgewogCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkRvbid0IHN1cHBvcnQgU1ItSU9WIHdpdGgiCiAJCQkJCSIgbm9uIE02NCBWRiBCQVIlZDogJXBSLiBcbiIsCiAJCQkJIGksIHJlcyk7CkBAIC0zMDk1LDcgKzMxMDMsNyBAQAogCSAqIGFsaWdubWVudCBmb3IgYW55IDY0LWJpdCByZXNvdXJjZSwgUENJZSBkb2Vzbid0IGNhcmUgYW5kCiAJICogYnJpZGdlcyBvbmx5IGRvIDY0LWJpdCBwcmVmZXRjaGFibGUgYW55d2F5LgogCSAqLwotCWlmIChwaGItPmlvZGEubTY0X3NlZ3NpemUgJiYgKHR5cGUgJiBJT1JFU09VUkNFX01FTV82NCkpCisJaWYgKHBoYi0+aW9kYS5tNjRfc2Vnc2l6ZSAmJiBwbnZfcGNpX2lzX202NF9mbGFncyh0eXBlKSkKIAkJcmV0dXJuIHBoYi0+aW9kYS5tNjRfc2Vnc2l6ZTsKIAlpZiAodHlwZSAmIElPUkVTT1VSQ0VfTUVNKQogCQlyZXR1cm4gcGhiLT5pb2RhLm0zMl9zZWdzaXplOwpAQCAtMzQwMiwxMiArMzQxMCw2IEBACiAJc3RydWN0IHBudl9waGIgKnBoYiA9IHBlLT5waGI7CiAJc3RydWN0IHBudl9pb2RhX3BlICpzbGF2ZSwgKnRtcDsKIAotCS8qIFJlbGVhc2Ugc2xhdmUgUEVzIGluIGNvbXBvdW5kIFBFICovCi0JaWYgKHBlLT5mbGFncyAmIFBOVl9JT0RBX1BFX01BU1RFUikgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2xhdmUsIHRtcCwgJnBlLT5zbGF2ZXMsIGxpc3QpCi0JCQlwbnZfaW9kYV9yZWxlYXNlX3BlKHNsYXZlKTsKLQl9Ci0KIAlsaXN0X2RlbCgmcGUtPmxpc3QpOwogCXN3aXRjaCAocGhiLT50eXBlKSB7CiAJY2FzZSBQTlZfUEhCX0lPREExOgpAQCAtMzQyMiw3ICszNDI0LDI2IEBACiAKIAlwbnZfaW9kYV9yZWxlYXNlX3BlX3NlZyhwZSk7CiAJcG52X2lvZGFfZGVjb25maWd1cmVfcGUocGUtPnBoYiwgcGUpOwotCXBudl9pb2RhX2ZyZWVfcGUocGUpOworCisJLyogUmVsZWFzZSBzbGF2ZSBQRXMgaW4gdGhlIGNvbXBvdW5kIFBFICovCisJaWYgKHBlLT5mbGFncyAmIFBOVl9JT0RBX1BFX01BU1RFUikgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2xhdmUsIHRtcCwgJnBlLT5zbGF2ZXMsIGxpc3QpIHsKKwkJCWxpc3RfZGVsKCZzbGF2ZS0+bGlzdCk7CisJCQlwbnZfaW9kYV9mcmVlX3BlKHNsYXZlKTsKKwkJfQorCX0KKworCS8qCisJICogVGhlIFBFIGZvciByb290IGJ1cyBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIG9mIGhvdHBsdWcgaW4gRUVICisJICogcmVjb3ZlcnkgZm9yIGZlbmNlZCBQSEIgZXJyb3IuIFdlIG5lZWQgdG8gbWFyayB0aGUgUEUgZGVhZCBzbworCSAqIHRoYXQgaXQgY2FuIGJlIHBvcHVsYXRlZCBhZ2FpbiBpbiBQQ0kgaG90IGFkZCBwYXRoLiBUaGUgUEUKKwkgKiBzaG91bGRuJ3QgYmUgZGVzdHJveWVkIGFzIGl0J3MgdGhlIGdsb2JhbCByZXNlcnZlZCByZXNvdXJjZS4KKwkgKi8KKwlpZiAocGhiLT5pb2RhLnJvb3RfcGVfcG9wdWxhdGVkICYmCisJICAgIHBoYi0+aW9kYS5yb290X3BlX2lkeCA9PSBwZS0+cGVfbnVtYmVyKQorCQlwaGItPmlvZGEucm9vdF9wZV9wb3B1bGF0ZWQgPSBmYWxzZTsKKwllbHNlCisJCXBudl9pb2RhX2ZyZWVfcGUocGUpOwogfQogCiBzdGF0aWMgdm9pZCBwbnZfcGNpX3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQpAQCAtMzQzOCw3ICszNDU5LDE3IEBACiAJaWYgKCFwZG4gfHwgcGRuLT5wZV9udW1iZXIgPT0gSU9EQV9JTlZBTElEX1BFKQogCQlyZXR1cm47CiAKKwkvKgorCSAqIFBDSSBob3RwbHVnIGNhbiBoYXBwZW4gYXMgcGFydCBvZiBFRUggZXJyb3IgcmVjb3ZlcnkuIFRoZSBAcGRuCisJICogaXNuJ3QgcmVtb3ZlZCBhbmQgYWRkZWQgYWZ0ZXJ3YXJkcyBpbiB0aGlzIHNjZW5hcmlvLiBXZSBzaG91bGQKKwkgKiBzZXQgdGhlIFBFIG51bWJlciBpbiBAcGRuIHRvIGFuIGludmFsaWQgb25lLiBPdGhlcndpc2UsIHRoZSBQRSdzCisJICogZGV2aWNlIGNvdW50IGlzIGRlY3JlYXNlZCBvbiByZW1vdmluZyBkZXZpY2VzIHdoaWxlIGZhaWxpbmcgdG8KKwkgKiBiZSBpbmNyZWFzZWQgb24gYWRkaW5nIGRldmljZXMuIEl0IGxlYWRzIHRvIHVuYmFsYW5jZWQgUEUncyBkZXZpY2UKKwkgKiBjb3VudCBhbmQgZXZlbnR1YWxseSBtYWtlIG5vcm1hbCBQQ0kgaG90cGx1ZyBwYXRoIGJyb2tlbi4KKwkgKi8KIAlwZSA9ICZwaGItPmlvZGEucGVfYXJyYXlbcGRuLT5wZV9udW1iZXJdOworCXBkbi0+cGVfbnVtYmVyID0gSU9EQV9JTlZBTElEX1BFOworCiAJV0FSTl9PTigtLXBlLT5kZXZpY2VfY291bnQgPCAwKTsKIAlpZiAocGUtPmRldmljZV9jb3VudCA9PSAwKQogCQlwbnZfaW9kYV9yZWxlYXNlX3BlKHBlKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2kuYwppbmRleCBmZTE2YTUwLi4wOWViYTVhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaS5jCkBAIC0xMTksNiArMTE5LDEwIEBACiAKIAlidXMgPSBicmlkZ2UtPmJ1czsKIAorCS8qIFJlbHkgb24gdGhlIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyX2RlZmVycmVkKCkgY2FsbGJhY2suICovCisJcGNpX3NldF9ob3N0X2JyaWRnZV9yZWxlYXNlKGJyaWRnZSwgcGNpYmlvc19mcmVlX2NvbnRyb2xsZXJfZGVmZXJyZWQsCisJCQkJCSh2b2lkICopIHBjaV9idXNfdG9faG9zdChidXMpKTsKKwogCWRuID0gcGNpYmlvc19nZXRfcGhiX29mX25vZGUoYnVzKTsKIAlpZiAoIWRuKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYwppbmRleCA5MDZkYmFhLi41NDdmZDEzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jCkBAIC0xMDYsOCArMTA2LDExIEBACiAJCXJlbGVhc2VfcmVzb3VyY2UocmVzKTsKIAl9CiAKLQkvKiBGcmVlIHBjaV9jb250cm9sbGVyIGRhdGEgc3RydWN0dXJlICovCi0JcGNpYmlvc19mcmVlX2NvbnRyb2xsZXIocGhiKTsKKwkvKgorCSAqIFRoZSBwY2lfY29udHJvbGxlciBkYXRhIHN0cnVjdHVyZSBpcyBmcmVlZCBieQorCSAqIHRoZSBwY2liaW9zX2ZyZWVfY29udHJvbGxlcl9kZWZlcnJlZCgpIGNhbGxiYWNrOworCSAqIHNlZSBwc2VyaWVzX3Jvb3RfYnJpZGdlX3ByZXBhcmUoKS4KKwkgKi8KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwppbmRleCA0ZmZjYWE2Li5hMzlkMjBlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwpAQCAtNDEsNyArNDEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogCiAjaW5jbHVkZSA8YXNtL21tdS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTY2LDYgKzY1LDcgQEAKICNpbmNsdWRlIDxhc20vZWVoLmg+CiAjaW5jbHVkZSA8YXNtL3JlZy5oPgogI2luY2x1ZGUgPGFzbS9wbHBhcl93cmFwcGVycy5oPgorI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgogCiAjaW5jbHVkZSAicHNlcmllcy5oIgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbTEuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtMS5jCmluZGV4IDZjMTEwOTkuLjgxZDQ5NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtMS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtMS5jCkBAIC01MzQsNyArNTM0LDggQEAKIAogc3RhdGljIHZvaWQgY3BtMV9ncGlvMTZfc2F2ZV9yZWdzKHN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djKQogewotCXN0cnVjdCBjcG0xX2dwaW8xNl9jaGlwICpjcG0xX2djID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoJm1tX2djLT5nYyk7CisJc3RydWN0IGNwbTFfZ3BpbzE2X2NoaXAgKmNwbTFfZ2MgPQorCQljb250YWluZXJfb2YobW1fZ2MsIHN0cnVjdCBjcG0xX2dwaW8xNl9jaGlwLCBtbV9nYyk7CiAJc3RydWN0IGNwbV9pb3BvcnQxNiBfX2lvbWVtICppb3AgPSBtbV9nYy0+cmVnczsKIAogCWNwbTFfZ2MtPmNwZGF0YSA9IGluX2JlMTYoJmlvcC0+ZGF0KTsKQEAgLTY0OSw3ICs2NTAsOCBAQAogCiBzdGF0aWMgdm9pZCBjcG0xX2dwaW8zMl9zYXZlX3JlZ3Moc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2MpCiB7Ci0Jc3RydWN0IGNwbTFfZ3BpbzMyX2NoaXAgKmNwbTFfZ2MgPSBncGlvY2hpcF9nZXRfZGF0YSgmbW1fZ2MtPmdjKTsKKwlzdHJ1Y3QgY3BtMV9ncGlvMzJfY2hpcCAqY3BtMV9nYyA9CisJCWNvbnRhaW5lcl9vZihtbV9nYywgc3RydWN0IGNwbTFfZ3BpbzMyX2NoaXAsIG1tX2djKTsKIAlzdHJ1Y3QgY3BtX2lvcG9ydDMyYiBfX2lvbWVtICppb3AgPSBtbV9nYy0+cmVnczsKIAogCWNwbTFfZ2MtPmNwZGF0YSA9IGluX2JlMzIoJmlvcC0+ZGF0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtX2NvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9jcG1fY29tbW9uLmMKaW5kZXggOTExNDU2ZC4uOTQ3ZjQyMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9jcG1fY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9jcG1fY29tbW9uLmMKQEAgLTk0LDcgKzk0LDggQEAKIAogc3RhdGljIHZvaWQgY3BtMl9ncGlvMzJfc2F2ZV9yZWdzKHN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djKQogewotCXN0cnVjdCBjcG0yX2dwaW8zMl9jaGlwICpjcG0yX2djID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoJm1tX2djLT5nYyk7CisJc3RydWN0IGNwbTJfZ3BpbzMyX2NoaXAgKmNwbTJfZ2MgPQorCQljb250YWluZXJfb2YobW1fZ2MsIHN0cnVjdCBjcG0yX2dwaW8zMl9jaGlwLCBtbV9nYyk7CiAJc3RydWN0IGNwbTJfaW9wb3J0cyBfX2lvbWVtICppb3AgPSBtbV9nYy0+cmVnczsKIAogCWNwbTJfZ2MtPmNwZGF0YSA9IGluX2JlMzIoJmlvcC0+ZGF0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcmlvLmMKaW5kZXggNjhlN2MwZC4uM2NjN2NhYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcmlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcmlvLmMKQEAgLTIzLDcgKzIzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvaWNwLW9wYWwuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy9pY3Atb3BhbC5jCmluZGV4IDU3ZDcyZjEuLjkxMTQyNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy9pY3Atb3BhbC5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy9pY3Atb3BhbC5jCkBAIC0yMywxMCArMjMsMTAgQEAKIAogc3RhdGljIHZvaWQgaWNwX29wYWxfdGVhcmRvd25fY3B1KHZvaWQpCiB7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpbnQgaHdfY3B1ID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAkvKiBDbGVhciBhbnkgcGVuZGluZyBJUEkgKi8KLQlvcGFsX2ludF9zZXRfbWZycihjcHUsIDB4ZmYpOworCW9wYWxfaW50X3NldF9tZnJyKGh3X2NwdSwgMHhmZik7CiB9CiAKIHN0YXRpYyB2b2lkIGljcF9vcGFsX2ZsdXNoX2lwaSh2b2lkKQpAQCAtMTAxLDE0ICsxMDEsMTYgQEAKIAogc3RhdGljIHZvaWQgaWNwX29wYWxfY2F1c2VfaXBpKGludCBjcHUsIHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlvcGFsX2ludF9zZXRfbWZycihjcHUsIElQSV9QUklPUklUWSk7CisJaW50IGh3X2NwdSA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoY3B1KTsKKworCW9wYWxfaW50X3NldF9tZnJyKGh3X2NwdSwgSVBJX1BSSU9SSVRZKTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGljcF9vcGFsX2lwaV9hY3Rpb24oaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJaW50IGh3X2NwdSA9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCi0Jb3BhbF9pbnRfc2V0X21mcnIoY3B1LCAweGZmKTsKKwlvcGFsX2ludF9zZXRfbWZycihod19jcHUsIDB4ZmYpOwogCiAJcmV0dXJuIHNtcF9pcGlfZGVtdXgoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9LY29uZmlnIGIvYXJjaC9zMzkwL0tjb25maWcKaW5kZXggZTc1MWZlMi4uZGVlYWRmYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL0tjb25maWcKKysrIGIvYXJjaC9zMzkwL0tjb25maWcKQEAgLTY4LDEyICs2OCwxMiBAQAogY29uZmlnIFMzOTAKIAlkZWZfYm9vbCB5CiAJc2VsZWN0IEFSQ0hfSEFTX0FUT01JQzY0X0RFQ19JRl9QT1NJVElWRQotCXNlbGVjdCBBUkNIX0hBU19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUwogCXNlbGVjdCBBUkNIX0hBU19ERVZNRU1fSVNfQUxMT1dFRAogCXNlbGVjdCBBUkNIX0hBU19FTEZfUkFORE9NSVpFCiAJc2VsZWN0IEFSQ0hfSEFTX0dDT1ZfUFJPRklMRV9BTEwKIAlzZWxlY3QgQVJDSF9IQVNfS0NPVgogCXNlbGVjdCBBUkNIX0hBU19TR19DSEFJTgorCXNlbGVjdCBBUkNIX0hBU19VQlNBTl9TQU5JVElaRV9BTEwKIAlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKIAlzZWxlY3QgQVJDSF9JTkxJTkVfUkVBRF9MT0NLCiAJc2VsZWN0IEFSQ0hfSU5MSU5FX1JFQURfTE9DS19CSApAQCAtMTEwLDYgKzExMCw3IEBACiAJc2VsZWN0IEFSQ0hfVVNFX0NNUFhDSEdfTE9DS1JFRgogCXNlbGVjdCBBUkNIX1dBTlRTX0RZTkFNSUNfVEFTS19TVFJVQ1QKIAlzZWxlY3QgQVJDSF9XQU5UU19QUk9UX05VTUFfUFJPVF9OT05FCisJc2VsZWN0IEFSQ0hfV0FOVFNfVUJTQU5fTk9fTlVMTAogCXNlbGVjdCBBUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KIAlzZWxlY3QgQlVJTERUSU1FX0VYVEFCTEVfU09SVAogCXNlbGVjdCBDTE9ORV9CQUNLV0FSRFMyCkBAIC0xMzcsNiArMTM4LDcgQEAKIAlzZWxlY3QgSEFWRV9ETUFfQVBJX0RFQlVHCiAJc2VsZWN0IEhBVkVfRFlOQU1JQ19GVFJBQ0UKIAlzZWxlY3QgSEFWRV9EWU5BTUlDX0ZUUkFDRV9XSVRIX1JFR1MKKwlzZWxlY3QgSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUwogCXNlbGVjdCBIQVZFX0VYSVRfVEhSRUFECiAJc2VsZWN0IEhBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVIKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9NYWtlZmlsZSBiL2FyY2gvczM5MC9NYWtlZmlsZQppbmRleCAyMjRiNDI3Li41NGUwMDUyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL01ha2VmaWxlCkBAIC00Niw2ICs0Niw4IEBACiBjZmxhZ3MtJChDT05GSUdfTUFSQ0hfWkVDMTJfVFVORSkJKz0gLW10dW5lPXpFQzEyCiBjZmxhZ3MtJChDT05GSUdfTUFSQ0hfWjEzX1RVTkUpCSs9IC1tdHVuZT16MTMKIAorY2ZsYWdzLXkgKz0gLVdhLC1JJChzcmN0cmVlKS9hcmNoLyQoQVJDSCkvaW5jbHVkZQorCiAjS0JVSUxEX0lNQUdFIGlzIG5lY2Vzc2FyeSBmb3IgbWFrZSBycG0KIEtCVUlMRF9JTUFHRQk6PWFyY2gvczM5MC9ib290L2ltYWdlCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9iYXNlLmMgYi9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfYmFzZS5jCmluZGV4IDE1Yzk0MjQuLmY1ODdjNDggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9iYXNlLmMKKysrIGIvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX2Jhc2UuYwpAQCAtNTQyLDcgKzU0Miw3IEBACiAJCXJjID0gUFRSX0VSUihhcHBsZGF0YV9wZGV2KTsKIAkJZ290byBvdXRfZHJpdmVyOwogCX0KLQlhcHBsZGF0YV93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJhcHBsZGF0YSIpOworCWFwcGxkYXRhX3dxID0gYWxsb2Nfb3JkZXJlZF93b3JrcXVldWUoImFwcGxkYXRhIiwgMCk7CiAJaWYgKCFhcHBsZGF0YV93cSkgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X2RldmljZTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUgYi9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCmluZGV4IDMzYmE2OTdjLi4wZGFhMDcwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKQEAgLTE3LDYgKzE3LDcgQEAKIEtCVUlMRF9DRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtZmZyZWVzdGFuZGluZykKIAogR0NPVl9QUk9GSUxFIDo9IG4KK1VCU0FOX1NBTklUSVpFIDo9IG4KIAogT0JKRUNUUyA6PSAkKGFkZHByZWZpeCAkKG9ianRyZWUpL2FyY2gvczM5MC9rZXJuZWwvLCBoZWFkLm8gc2NscC5vIGViY2RpYy5vIGFscy5vKQogT0JKRUNUUyArPSAkKG9iaikvaGVhZC5vICQob2JqKS9taXNjLm8gJChvYmopL3BpZ2d5Lm8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9ib290L2NvbXByZXNzZWQvaGVhZC5TIGIvYXJjaC9zMzkwL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKaW5kZXggZjg2YTRlZS4uMjhjNGY5NiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKKysrIGIvYXJjaC9zMzkwL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKQEAgLTIxLDE2ICsyMSwyMSBAQAogCWxnCSVyMTUsLkxzdGFjay0uTFBHMSglcjEzKQogCWFnaGkJJXIxNSwtMTYwCiAJYnJhc2wJJXIxNCxkZWNvbXByZXNzX2tlcm5lbAotCSMgc2V0dXAgcmVnaXN0ZXJzIGZvciBtZW1vcnkgbW92ZXIgJiBicmFuY2ggdG8gdGFyZ2V0CisJIyBTZXQgdXAgcmVnaXN0ZXJzIGZvciBtZW1vcnkgbW92ZXIuIFdlIG1vdmUgdGhlIGRlY29tcHJlc3NlZCBpbWFnZSB0bworCSMgMHgxMTAwMCwgc3RhcnRpbmcgYXQgb2Zmc2V0IDB4MTEwMDAgaW4gdGhlIGRlY29tcHJlc3NlZCBpbWFnZSBzbworCSMgdGhhdCBjb2RlIGxpdmluZyBhdCAweDExMDAwIGluIHRoZSBpbWFnZSB3aWxsIGVuZCB1cCBhdCAweDExMDAwIGluCisJIyBtZW1vcnkuCiAJbGdyCSVyNCwlcjIKIAlsZwklcjIsLkxvZmZzZXQtLkxQRzEoJXIxMykKIAlsYQklcjQsMCglcjIsJXI0KQogCWxnCSVyMywuTG12c2l6ZS0uTFBHMSglcjEzKQogCWxncgklcjUsJXIzCi0JIyBtb3ZlIHRoZSBtZW1vcnkgbW92ZXIgc29tZXBsYWNlIHNhZmUKKwkjIE1vdmUgdGhlIG1lbW9yeSBtb3ZlciBzb21lcGxhY2Ugc2FmZSBzbyBpdCBkb2Vzbid0IG92ZXJ3cml0ZSBpdHNlbGYuCiAJbGEJJXIxLDB4MjAwCiAJbXZjCTAobW92ZXJfZW5kLW1vdmVyLCVyMSksbW92ZXItLkxQRzEoJXIxMykKLQkjIGRlY29tcHJlc3MgaW1hZ2UgaXMgc3RhcnRlZCBhdCAweDExMDAwCisJIyBXaGVuIHRoZSBtZW1vcnkgbW92ZXIgaXMgZG9uZSB3ZSBwYXNzIGNvbnRyb2wgdG8KKwkjIGFyY2gvczM5MC9rZXJuZWwvaGVhZDY0LlM6c3RhcnR1cF9jb250aW51ZSB3aGljaCBsaXZlcyBhdCAweDExMDAwIGluCisJIyB0aGUgZGVjb21wcmVzc2VkIGltYWdlLgogCWxncgklcjYsJXIyCiAJYnIJJXIxCiBtb3ZlcjoKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jb25maWdzL2RlZmF1bHRfZGVmY29uZmlnIGIvYXJjaC9zMzkwL2NvbmZpZ3MvZGVmYXVsdF9kZWZjb25maWcKaW5kZXggODg5ZWEzNC4uNDU5Njg2OCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NvbmZpZ3MvZGVmYXVsdF9kZWZjb25maWcKKysrIGIvYXJjaC9zMzkwL2NvbmZpZ3MvZGVmYXVsdF9kZWZjb25maWcKQEAgLTI2MCw3ICsyNjAsNiBAQAogQ09ORklHX05GX1RBQkxFU19JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWND1tCiBDT05GSUdfTkZfVEFCTEVTX0FSUD1tCi1DT05GSUdfTkZfTkFUX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWND1tCiBDT05GSUdfSVBfTkZfSVBUQUJMRVM9bQogQ09ORklHX0lQX05GX01BVENIX0FIPW0KQEAgLTI2OSw2ICsyNjgsOCBAQAogQ09ORklHX0lQX05GX01BVENIX1RUTD1tCiBDT05GSUdfSVBfTkZfRklMVEVSPW0KIENPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPW0KK0NPTkZJR19JUF9ORl9OQVQ9bQorQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFPW0KIENPTkZJR19JUF9ORl9NQU5HTEU9bQogQ09ORklHX0lQX05GX1RBUkdFVF9DTFVTVEVSSVA9bQogQ09ORklHX0lQX05GX1RBUkdFVF9FQ049bQpAQCAtMjgxLDcgKzI4Miw2IEBACiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9bQogQ09ORklHX05GX1RBQkxFU19JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWNj1tCi1DT05GSUdfTkZfTkFUX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWNj1tCiBDT05GSUdfSVA2X05GX0lQVEFCTEVTPW0KIENPTkZJR19JUDZfTkZfTUFUQ0hfQUg9bQpAQCAtMjk5LDYgKzI5OSw4IEBACiBDT05GSUdfSVA2X05GX01BTkdMRT1tCiBDT05GSUdfSVA2X05GX1JBVz1tCiBDT05GSUdfSVA2X05GX1NFQ1VSSVRZPW0KK0NPTkZJR19JUDZfTkZfTkFUPW0KK0NPTkZJR19JUDZfTkZfVEFSR0VUX01BU1FVRVJBREU9bQogQ09ORklHX05GX1RBQkxFU19CUklER0U9bQogQ09ORklHX05FVF9TQ1RQUFJPQkU9bQogQ09ORklHX1JEUz1tCkBAIC0zNTksNiArMzYxLDcgQEAKIENPTkZJR19ORVRfQUNUX1NLQkVESVQ9bQogQ09ORklHX05FVF9BQ1RfQ1NVTT1tCiBDT05GSUdfRE5TX1JFU09MVkVSPXkKK0NPTkZJR19DR1JPVVBfTkVUX1BSSU89eQogQ09ORklHX0JQRl9KSVQ9eQogQ09ORklHX05FVF9QS1RHRU49bQogQ09ORklHX05FVF9UQ1BQUk9CRT1tCkBAIC00MDksNiArNDEyLDcgQEAKIENPTkZJR19CTEtfREVWX0RNPW0KIENPTkZJR19ETV9DUllQVD1tCiBDT05GSUdfRE1fU05BUFNIT1Q9bQorQ09ORklHX0RNX1RISU5fUFJPVklTSU9OSU5HPW0KIENPTkZJR19ETV9NSVJST1I9bQogQ09ORklHX0RNX0xPR19VU0VSU1BBQ0U9bQogQ09ORklHX0RNX1JBSUQ9bQpAQCAtNDI4LDYgKzQzMiw3IEBACiBDT05GSUdfSUZCPW0KIENPTkZJR19NQUNWTEFOPW0KIENPTkZJR19NQUNWVEFQPW0KK0NPTkZJR19JUFZMQU49bQogQ09ORklHX1ZYTEFOPW0KIENPTkZJR19UVU49bQogQ09ORklHX1ZFVEg9bQpAQCAtNDUzLDcgKzQ1OCw2IEBACiAjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0Ci1DT05GSUdfREVWUFRTX01VTFRJUExFX0lOU1RBTkNFUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0wCiBDT05GSUdfSFdfUkFORE9NX1ZJUlRJTz1tCiBDT05GSUdfUkFXX0RSSVZFUj1tCkBAIC00OTUsNiArNDk5LDcgQEAKIENPTkZJR19BVVRPRlM0X0ZTPW0KIENPTkZJR19GVVNFX0ZTPXkKIENPTkZJR19DVVNFPW0KK0NPTkZJR19PVkVSTEFZX0ZTPW0KIENPTkZJR19GU0NBQ0hFPW0KIENPTkZJR19DQUNIRUZJTEVTPW0KIENPTkZJR19JU085NjYwX0ZTPXkKQEAgLTYwMiw3ICs2MDcsNiBAQAogQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUz15CiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX1NUQUNLVFJBQ0VfRklMVEVSPXkKIENPTkZJR19MQVRFTkNZVE9QPXkKLUNPTkZJR19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUz15CiBDT05GSUdfSVJRU09GRl9UUkFDRVI9eQogQ09ORklHX1BSRUVNUFRfVFJBQ0VSPXkKIENPTkZJR19TQ0hFRF9UUkFDRVI9eQpAQCAtNjc4LDcgKzY4Miw3IEBACiBDT05GSUdfQ1JZUFRPX0RFU19TMzkwPW0KIENPTkZJR19DUllQVE9fQUVTX1MzOTA9bQogQ09ORklHX0NSWVBUT19HSEFTSF9TMzkwPW0KLUNPTkZJR19DUllQVE9fQ1JDMzJfUzM5MD1tCitDT05GSUdfQ1JZUFRPX0NSQzMyX1MzOTA9eQogQ09ORklHX0FTWU1NRVRSSUNfS0VZX1RZUEU9eQogQ09ORklHX0FTWU1NRVRSSUNfUFVCTElDX0tFWV9TVUJUWVBFPW0KIENPTkZJR19YNTA5X0NFUlRJRklDQVRFX1BBUlNFUj1tCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY29uZmlncy9nY292X2RlZmNvbmZpZyBiL2FyY2gvczM5MC9jb25maWdzL2djb3ZfZGVmY29uZmlnCmluZGV4IDFiY2ZkNzYuLjFkZDA1ZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jb25maWdzL2djb3ZfZGVmY29uZmlnCisrKyBiL2FyY2gvczM5MC9jb25maWdzL2djb3ZfZGVmY29uZmlnCkBAIC0xNSw2ICsxNSw4IEBACiBDT05GSUdfTUVNQ0c9eQogQ09ORklHX01FTUNHX1NXQVA9eQogQ09ORklHX0JMS19DR1JPVVA9eQorQ09ORklHX0NGU19CQU5EV0lEVEg9eQorQ09ORklHX1JUX0dST1VQX1NDSEVEPXkKIENPTkZJR19DR1JPVVBfUElEUz15CiBDT05GSUdfQ0dST1VQX0ZSRUVaRVI9eQogQ09ORklHX0NHUk9VUF9IVUdFVExCPXkKQEAgLTI1NSw3ICsyNTcsNiBAQAogQ09ORklHX05GX1RBQkxFU19JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWND1tCiBDT05GSUdfTkZfVEFCTEVTX0FSUD1tCi1DT05GSUdfTkZfTkFUX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWND1tCiBDT05GSUdfSVBfTkZfSVBUQUJMRVM9bQogQ09ORklHX0lQX05GX01BVENIX0FIPW0KQEAgLTI2NCw2ICsyNjUsOCBAQAogQ09ORklHX0lQX05GX01BVENIX1RUTD1tCiBDT05GSUdfSVBfTkZfRklMVEVSPW0KIENPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPW0KK0NPTkZJR19JUF9ORl9OQVQ9bQorQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFPW0KIENPTkZJR19JUF9ORl9NQU5HTEU9bQogQ09ORklHX0lQX05GX1RBUkdFVF9DTFVTVEVSSVA9bQogQ09ORklHX0lQX05GX1RBUkdFVF9FQ049bQpAQCAtMjc2LDcgKzI3OSw2IEBACiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9bQogQ09ORklHX05GX1RBQkxFU19JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWNj1tCi1DT05GSUdfTkZfTkFUX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWNj1tCiBDT05GSUdfSVA2X05GX0lQVEFCTEVTPW0KIENPTkZJR19JUDZfTkZfTUFUQ0hfQUg9bQpAQCAtMjk0LDYgKzI5Niw4IEBACiBDT05GSUdfSVA2X05GX01BTkdMRT1tCiBDT05GSUdfSVA2X05GX1JBVz1tCiBDT05GSUdfSVA2X05GX1NFQ1VSSVRZPW0KK0NPTkZJR19JUDZfTkZfTkFUPW0KK0NPTkZJR19JUDZfTkZfVEFSR0VUX01BU1FVRVJBREU9bQogQ09ORklHX05GX1RBQkxFU19CUklER0U9bQogQ09ORklHX05FVF9TQ1RQUFJPQkU9bQogQ09ORklHX1JEUz1tCkBAIC0zNTMsNiArMzU3LDcgQEAKIENPTkZJR19ORVRfQUNUX1NLQkVESVQ9bQogQ09ORklHX05FVF9BQ1RfQ1NVTT1tCiBDT05GSUdfRE5TX1JFU09MVkVSPXkKK0NPTkZJR19DR1JPVVBfTkVUX1BSSU89eQogQ09ORklHX0JQRl9KSVQ9eQogQ09ORklHX05FVF9QS1RHRU49bQogQ09ORklHX05FVF9UQ1BQUk9CRT1tCkBAIC00MDMsNiArNDA4LDcgQEAKIENPTkZJR19CTEtfREVWX0RNPW0KIENPTkZJR19ETV9DUllQVD1tCiBDT05GSUdfRE1fU05BUFNIT1Q9bQorQ09ORklHX0RNX1RISU5fUFJPVklTSU9OSU5HPW0KIENPTkZJR19ETV9NSVJST1I9bQogQ09ORklHX0RNX0xPR19VU0VSU1BBQ0U9bQogQ09ORklHX0RNX1JBSUQ9bQpAQCAtNDIyLDYgKzQyOCw3IEBACiBDT05GSUdfSUZCPW0KIENPTkZJR19NQUNWTEFOPW0KIENPTkZJR19NQUNWVEFQPW0KK0NPTkZJR19JUFZMQU49bQogQ09ORklHX1ZYTEFOPW0KIENPTkZJR19UVU49bQogQ09ORklHX1ZFVEg9bQpAQCAtNDQ3LDcgKzQ1NCw2IEBACiAjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0Ci1DT05GSUdfREVWUFRTX01VTFRJUExFX0lOU1RBTkNFUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0wCiBDT05GSUdfSFdfUkFORE9NX1ZJUlRJTz1tCiBDT05GSUdfUkFXX0RSSVZFUj1tCkBAIC00ODcsNiArNDkzLDcgQEAKIENPTkZJR19BVVRPRlM0X0ZTPW0KIENPTkZJR19GVVNFX0ZTPXkKIENPTkZJR19DVVNFPW0KK0NPTkZJR19PVkVSTEFZX0ZTPW0KIENPTkZJR19GU0NBQ0hFPW0KIENPTkZJR19DQUNIRUZJTEVTPW0KIENPTkZJR19JU085NjYwX0ZTPXkKQEAgLTU1Miw3ICs1NTksNiBAQAogQ09ORklHX0NQVV9OT1RJRklFUl9FUlJPUl9JTkpFQ1Q9bQogQ09ORklHX1BNX05PVElGSUVSX0VSUk9SX0lOSkVDVD1tCiBDT05GSUdfTEFURU5DWVRPUD15Ci1DT05GSUdfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1M9eQogQ09ORklHX0JMS19ERVZfSU9fVFJBQ0U9eQogIyBDT05GSUdfS1BST0JFX0VWRU5UIGlzIG5vdCBzZXQKIENPTkZJR19UUkFDRV9FTlVNX01BUF9GSUxFPXkKQEAgLTYxNiw3ICs2MjIsNyBAQAogQ09ORklHX0NSWVBUT19ERVNfUzM5MD1tCiBDT05GSUdfQ1JZUFRPX0FFU19TMzkwPW0KIENPTkZJR19DUllQVE9fR0hBU0hfUzM5MD1tCi1DT05GSUdfQ1JZUFRPX0NSQzMyX1MzOTA9bQorQ09ORklHX0NSWVBUT19DUkMzMl9TMzkwPXkKIENPTkZJR19BU1lNTUVUUklDX0tFWV9UWVBFPXkKIENPTkZJR19BU1lNTUVUUklDX1BVQkxJQ19LRVlfU1VCVFlQRT1tCiBDT05GSUdfWDUwOV9DRVJUSUZJQ0FURV9QQVJTRVI9bQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NvbmZpZ3MvcGVyZm9ybWFuY2VfZGVmY29uZmlnIGIvYXJjaC9zMzkwL2NvbmZpZ3MvcGVyZm9ybWFuY2VfZGVmY29uZmlnCmluZGV4IDEzZmYwOTAuLjI5ZDExNzggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jb25maWdzL3BlcmZvcm1hbmNlX2RlZmNvbmZpZworKysgYi9hcmNoL3MzOTAvY29uZmlncy9wZXJmb3JtYW5jZV9kZWZjb25maWcKQEAgLTE2LDYgKzE2LDggQEAKIENPTkZJR19NRU1DRz15CiBDT05GSUdfTUVNQ0dfU1dBUD15CiBDT05GSUdfQkxLX0NHUk9VUD15CitDT05GSUdfQ0ZTX0JBTkRXSURUSD15CitDT05GSUdfUlRfR1JPVVBfU0NIRUQ9eQogQ09ORklHX0NHUk9VUF9QSURTPXkKIENPTkZJR19DR1JPVVBfRlJFRVpFUj15CiBDT05GSUdfQ0dST1VQX0hVR0VUTEI9eQpAQCAtMjU1LDcgKzI1Nyw2IEBACiBDT05GSUdfTkZfVEFCTEVTX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY0PW0KIENPTkZJR19ORl9UQUJMRVNfQVJQPW0KLUNPTkZJR19ORl9OQVRfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY0PW0KIENPTkZJR19JUF9ORl9JUFRBQkxFUz1tCiBDT05GSUdfSVBfTkZfTUFUQ0hfQUg9bQpAQCAtMjY0LDYgKzI2NSw4IEBACiBDT05GSUdfSVBfTkZfTUFUQ0hfVFRMPW0KIENPTkZJR19JUF9ORl9GSUxURVI9bQogQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9bQorQ09ORklHX0lQX05GX05BVD1tCitDT05GSUdfSVBfTkZfVEFSR0VUX01BU1FVRVJBREU9bQogQ09ORklHX0lQX05GX01BTkdMRT1tCiBDT05GSUdfSVBfTkZfVEFSR0VUX0NMVVNURVJJUD1tCiBDT05GSUdfSVBfTkZfVEFSR0VUX0VDTj1tCkBAIC0yNzYsNyArMjc5LDYgQEAKIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj1tCiBDT05GSUdfTkZfVEFCTEVTX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY2PW0KLUNPTkZJR19ORl9OQVRfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY2PW0KIENPTkZJR19JUDZfTkZfSVBUQUJMRVM9bQogQ09ORklHX0lQNl9ORl9NQVRDSF9BSD1tCkBAIC0yOTQsNiArMjk2LDggQEAKIENPTkZJR19JUDZfTkZfTUFOR0xFPW0KIENPTkZJR19JUDZfTkZfUkFXPW0KIENPTkZJR19JUDZfTkZfU0VDVVJJVFk9bQorQ09ORklHX0lQNl9ORl9OQVQ9bQorQ09ORklHX0lQNl9ORl9UQVJHRVRfTUFTUVVFUkFERT1tCiBDT05GSUdfTkZfVEFCTEVTX0JSSURHRT1tCiBDT05GSUdfTkVUX1NDVFBQUk9CRT1tCiBDT05GSUdfUkRTPW0KQEAgLTM1Myw2ICszNTcsNyBAQAogQ09ORklHX05FVF9BQ1RfU0tCRURJVD1tCiBDT05GSUdfTkVUX0FDVF9DU1VNPW0KIENPTkZJR19ETlNfUkVTT0xWRVI9eQorQ09ORklHX0NHUk9VUF9ORVRfUFJJTz15CiBDT05GSUdfQlBGX0pJVD15CiBDT05GSUdfTkVUX1BLVEdFTj1tCiBDT05GSUdfTkVUX1RDUFBST0JFPW0KQEAgLTQwMyw2ICs0MDgsNyBAQAogQ09ORklHX0JMS19ERVZfRE09bQogQ09ORklHX0RNX0NSWVBUPW0KIENPTkZJR19ETV9TTkFQU0hPVD1tCitDT05GSUdfRE1fVEhJTl9QUk9WSVNJT05JTkc9bQogQ09ORklHX0RNX01JUlJPUj1tCiBDT05GSUdfRE1fTE9HX1VTRVJTUEFDRT1tCiBDT05GSUdfRE1fUkFJRD1tCkBAIC00MjIsNiArNDI4LDcgQEAKIENPTkZJR19JRkI9bQogQ09ORklHX01BQ1ZMQU49bQogQ09ORklHX01BQ1ZUQVA9bQorQ09ORklHX0lQVkxBTj1tCiBDT05GSUdfVlhMQU49bQogQ09ORklHX1RVTj1tCiBDT05GSUdfVkVUSD1tCkBAIC00NDcsNyArNDU0LDYgQEAKICMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKLUNPTkZJR19ERVZQVFNfTVVMVElQTEVfSU5TVEFOQ0VTPXkKIENPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTAKIENPTkZJR19IV19SQU5ET01fVklSVElPPW0KIENPTkZJR19SQVdfRFJJVkVSPW0KQEAgLTQ4OCw2ICs0OTQsNyBAQAogQ09ORklHX0FVVE9GUzRfRlM9bQogQ09ORklHX0ZVU0VfRlM9eQogQ09ORklHX0NVU0U9bQorQ09ORklHX09WRVJMQVlfRlM9bQogQ09ORklHX0ZTQ0FDSEU9bQogQ09ORklHX0NBQ0hFRklMRVM9bQogQ09ORklHX0lTTzk2NjBfRlM9eQpAQCAtNTQ5LDcgKzU1Niw2IEBACiBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVD1tCiBDT05GSUdfUkNVX0NQVV9TVEFMTF9USU1FT1VUPTYwCiBDT05GSUdfTEFURU5DWVRPUD15Ci1DT05GSUdfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1M9eQogQ09ORklHX1NDSEVEX1RSQUNFUj15CiBDT05GSUdfRlRSQUNFX1NZU0NBTExTPXkKIENPTkZJR19TVEFDS19UUkFDRVI9eQpAQCAtNjE1LDcgKzYyMSw3IEBACiBDT05GSUdfQ1JZUFRPX0RFU19TMzkwPW0KIENPTkZJR19DUllQVE9fQUVTX1MzOTA9bQogQ09ORklHX0NSWVBUT19HSEFTSF9TMzkwPW0KLUNPTkZJR19DUllQVE9fQ1JDMzJfUzM5MD1tCitDT05GSUdfQ1JZUFRPX0NSQzMyX1MzOTA9eQogQ09ORklHX0FTWU1NRVRSSUNfS0VZX1RZUEU9eQogQ09ORklHX0FTWU1NRVRSSUNfUFVCTElDX0tFWV9TVUJUWVBFPW0KIENPTkZJR19YNTA5X0NFUlRJRklDQVRFX1BBUlNFUj1tCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY3J5cHRvL2Flc19zMzkwLmMgYi9hcmNoL3MzOTAvY3J5cHRvL2Flc19zMzkwLmMKaW5kZXggMmVhMThiMC4uMzAzZDI4ZSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NyeXB0by9hZXNfczM5MC5jCisrKyBiL2FyY2gvczM5MC9jcnlwdG8vYWVzX3MzOTAuYwpAQCAtMzEsNjkgKzMxLDI5IEBACiAjaW5jbHVkZSA8Y3J5cHRvL3h0cy5oPgogI2luY2x1ZGUgPGFzbS9jcGFjZi5oPgogCi0jZGVmaW5lIEFFU19LRVlMRU5fMTI4CQkxCi0jZGVmaW5lIEFFU19LRVlMRU5fMTkyCQkyCi0jZGVmaW5lIEFFU19LRVlMRU5fMjU2CQk0Ci0KIHN0YXRpYyB1OCAqY3RyYmxrOwogc3RhdGljIERFRklORV9TUElOTE9DSyhjdHJibGtfbG9jayk7Ci1zdGF0aWMgY2hhciBrZXlsZW5fZmxhZzsKKworc3RhdGljIGNwYWNmX21hc2tfdCBrbV9mdW5jdGlvbnMsIGttY19mdW5jdGlvbnMsIGttY3RyX2Z1bmN0aW9uczsKIAogc3RydWN0IHMzOTBfYWVzX2N0eCB7CiAJdTgga2V5W0FFU19NQVhfS0VZX1NJWkVdOwotCWxvbmcgZW5jOwotCWxvbmcgZGVjOwogCWludCBrZXlfbGVuOworCXVuc2lnbmVkIGxvbmcgZmM7CiAJdW5pb24gewogCQlzdHJ1Y3QgY3J5cHRvX3NrY2lwaGVyICpibGs7CiAJCXN0cnVjdCBjcnlwdG9fY2lwaGVyICpjaXA7CiAJfSBmYWxsYmFjazsKIH07CiAKLXN0cnVjdCBwY2NfcGFyYW0gewotCXU4IGtleVszMl07Ci0JdTggdHdlYWtbMTZdOwotCXU4IGJsb2NrWzE2XTsKLQl1OCBiaXRbMTZdOwotCXU4IHh0c1sxNl07Ci19OwotCiBzdHJ1Y3QgczM5MF94dHNfY3R4IHsKIAl1OCBrZXlbMzJdOwogCXU4IHBjY19rZXlbMzJdOwotCWxvbmcgZW5jOwotCWxvbmcgZGVjOwogCWludCBrZXlfbGVuOworCXVuc2lnbmVkIGxvbmcgZmM7CiAJc3RydWN0IGNyeXB0b19za2NpcGhlciAqZmFsbGJhY2s7CiB9OwogCi0vKgotICogQ2hlY2sgaWYgdGhlIGtleV9sZW4gaXMgc3VwcG9ydGVkIGJ5IHRoZSBIVy4KLSAqIFJldHVybnMgMCBpZiBpdCBpcywgYSBwb3NpdGl2ZSBudW1iZXIgaWYgaXQgaXMgbm90IGFuZCBzb2Z0d2FyZSBmYWxsYmFjayBpcwotICogcmVxdWlyZWQgb3IgYSBuZWdhdGl2ZSBudW1iZXIgaW4gY2FzZSB0aGUga2V5IHNpemUgaXMgbm90IHZhbGlkCi0gKi8KLXN0YXRpYyBpbnQgbmVlZF9mYWxsYmFjayh1bnNpZ25lZCBpbnQga2V5X2xlbikKLXsKLQlzd2l0Y2ggKGtleV9sZW4pIHsKLQljYXNlIDE2OgotCQlpZiAoIShrZXlsZW5fZmxhZyAmIEFFU19LRVlMRU5fMTI4KSkKLQkJCXJldHVybiAxOwotCQlicmVhazsKLQljYXNlIDI0OgotCQlpZiAoIShrZXlsZW5fZmxhZyAmIEFFU19LRVlMRU5fMTkyKSkKLQkJCXJldHVybiAxOwotCQlicmVhazsKLQljYXNlIDMyOgotCQlpZiAoIShrZXlsZW5fZmxhZyAmIEFFU19LRVlMRU5fMjU2KSkKLQkJCXJldHVybiAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLTE7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBzZXRrZXlfZmFsbGJhY2tfY2lwKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICppbl9rZXksCiAJCXVuc2lnbmVkIGludCBrZXlfbGVuKQogewpAQCAtMTE3LDcyICs3Nyw0NCBAQAogCQkgICAgICAgdW5zaWduZWQgaW50IGtleV9sZW4pCiB7CiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7Ci0JdTMyICpmbGFncyA9ICZ0Zm0tPmNydF9mbGFnczsKLQlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmM7CiAKLQlyZXQgPSBuZWVkX2ZhbGxiYWNrKGtleV9sZW4pOwotCWlmIChyZXQgPCAwKSB7Ci0JCSpmbGFncyB8PSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTjsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCS8qIFBpY2sgdGhlIGNvcnJlY3QgZnVuY3Rpb24gY29kZSBiYXNlZCBvbiB0aGUga2V5IGxlbmd0aCAqLworCWZjID0gKGtleV9sZW4gPT0gMTYpID8gQ1BBQ0ZfS01fQUVTXzEyOCA6CisJICAgICAoa2V5X2xlbiA9PSAyNCkgPyBDUEFDRl9LTV9BRVNfMTkyIDoKKwkgICAgIChrZXlfbGVuID09IDMyKSA/IENQQUNGX0tNX0FFU18yNTYgOiAwOworCisJLyogQ2hlY2sgaWYgdGhlIGZ1bmN0aW9uIGNvZGUgaXMgYXZhaWxhYmxlICovCisJc2N0eC0+ZmMgPSAoZmMgJiYgY3BhY2ZfdGVzdF9mdW5jKCZrbV9mdW5jdGlvbnMsIGZjKSkgPyBmYyA6IDA7CisJaWYgKCFzY3R4LT5mYykKKwkJcmV0dXJuIHNldGtleV9mYWxsYmFja19jaXAodGZtLCBpbl9rZXksIGtleV9sZW4pOwogCiAJc2N0eC0+a2V5X2xlbiA9IGtleV9sZW47Ci0JaWYgKCFyZXQpIHsKLQkJbWVtY3B5KHNjdHgtPmtleSwgaW5fa2V5LCBrZXlfbGVuKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIHNldGtleV9mYWxsYmFja19jaXAodGZtLCBpbl9rZXksIGtleV9sZW4pOworCW1lbWNweShzY3R4LT5rZXksIGluX2tleSwga2V5X2xlbik7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGFlc19lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKIHsKIAlzdHJ1Y3QgczM5MF9hZXNfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAotCWlmICh1bmxpa2VseShuZWVkX2ZhbGxiYWNrKHNjdHgtPmtleV9sZW4pKSkgeworCWlmICh1bmxpa2VseSghc2N0eC0+ZmMpKSB7CiAJCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUoc2N0eC0+ZmFsbGJhY2suY2lwLCBvdXQsIGluKTsKIAkJcmV0dXJuOwogCX0KLQotCXN3aXRjaCAoc2N0eC0+a2V5X2xlbikgewotCWNhc2UgMTY6Ci0JCWNwYWNmX2ttKENQQUNGX0tNX0FFU18xMjhfRU5DLCAmc2N0eC0+a2V5LCBvdXQsIGluLAotCQkJIEFFU19CTE9DS19TSVpFKTsKLQkJYnJlYWs7Ci0JY2FzZSAyNDoKLQkJY3BhY2Zfa20oQ1BBQ0ZfS01fQUVTXzE5Ml9FTkMsICZzY3R4LT5rZXksIG91dCwgaW4sCi0JCQkgQUVTX0JMT0NLX1NJWkUpOwotCQlicmVhazsKLQljYXNlIDMyOgotCQljcGFjZl9rbShDUEFDRl9LTV9BRVNfMjU2X0VOQywgJnNjdHgtPmtleSwgb3V0LCBpbiwKLQkJCSBBRVNfQkxPQ0tfU0laRSk7Ci0JCWJyZWFrOwotCX0KKwljcGFjZl9rbShzY3R4LT5mYywgJnNjdHgtPmtleSwgb3V0LCBpbiwgQUVTX0JMT0NLX1NJWkUpOwogfQogCiBzdGF0aWMgdm9pZCBhZXNfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCiB7CiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAKLQlpZiAodW5saWtlbHkobmVlZF9mYWxsYmFjayhzY3R4LT5rZXlfbGVuKSkpIHsKKwlpZiAodW5saWtlbHkoIXNjdHgtPmZjKSkgewogCQljcnlwdG9fY2lwaGVyX2RlY3J5cHRfb25lKHNjdHgtPmZhbGxiYWNrLmNpcCwgb3V0LCBpbik7CiAJCXJldHVybjsKIAl9Ci0KLQlzd2l0Y2ggKHNjdHgtPmtleV9sZW4pIHsKLQljYXNlIDE2OgotCQljcGFjZl9rbShDUEFDRl9LTV9BRVNfMTI4X0RFQywgJnNjdHgtPmtleSwgb3V0LCBpbiwKLQkJCSBBRVNfQkxPQ0tfU0laRSk7Ci0JCWJyZWFrOwotCWNhc2UgMjQ6Ci0JCWNwYWNmX2ttKENQQUNGX0tNX0FFU18xOTJfREVDLCAmc2N0eC0+a2V5LCBvdXQsIGluLAotCQkJIEFFU19CTE9DS19TSVpFKTsKLQkJYnJlYWs7Ci0JY2FzZSAzMjoKLQkJY3BhY2Zfa20oQ1BBQ0ZfS01fQUVTXzI1Nl9ERUMsICZzY3R4LT5rZXksIG91dCwgaW4sCi0JCQkgQUVTX0JMT0NLX1NJWkUpOwotCQlicmVhazsKLQl9CisJY3BhY2Zfa20oc2N0eC0+ZmMgfCBDUEFDRl9ERUNSWVBULAorCQkgJnNjdHgtPmtleSwgb3V0LCBpbiwgQUVTX0JMT0NLX1NJWkUpOwogfQogCiBzdGF0aWMgaW50IGZhbGxiYWNrX2luaXRfY2lwKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCkBAIC0yOTEsNTAgKzIyMywzNyBAQAogCQkJICAgdW5zaWduZWQgaW50IGtleV9sZW4pCiB7CiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7Ci0JaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZjOwogCi0JcmV0ID0gbmVlZF9mYWxsYmFjayhrZXlfbGVuKTsKLQlpZiAocmV0ID4gMCkgewotCQlzY3R4LT5rZXlfbGVuID0ga2V5X2xlbjsKKwkvKiBQaWNrIHRoZSBjb3JyZWN0IGZ1bmN0aW9uIGNvZGUgYmFzZWQgb24gdGhlIGtleSBsZW5ndGggKi8KKwlmYyA9IChrZXlfbGVuID09IDE2KSA/IENQQUNGX0tNX0FFU18xMjggOgorCSAgICAgKGtleV9sZW4gPT0gMjQpID8gQ1BBQ0ZfS01fQUVTXzE5MiA6CisJICAgICAoa2V5X2xlbiA9PSAzMikgPyBDUEFDRl9LTV9BRVNfMjU2IDogMDsKKworCS8qIENoZWNrIGlmIHRoZSBmdW5jdGlvbiBjb2RlIGlzIGF2YWlsYWJsZSAqLworCXNjdHgtPmZjID0gKGZjICYmIGNwYWNmX3Rlc3RfZnVuYygma21fZnVuY3Rpb25zLCBmYykpID8gZmMgOiAwOworCWlmICghc2N0eC0+ZmMpCiAJCXJldHVybiBzZXRrZXlfZmFsbGJhY2tfYmxrKHRmbSwgaW5fa2V5LCBrZXlfbGVuKTsKLQl9CiAKLQlzd2l0Y2ggKGtleV9sZW4pIHsKLQljYXNlIDE2OgotCQlzY3R4LT5lbmMgPSBDUEFDRl9LTV9BRVNfMTI4X0VOQzsKLQkJc2N0eC0+ZGVjID0gQ1BBQ0ZfS01fQUVTXzEyOF9ERUM7Ci0JCWJyZWFrOwotCWNhc2UgMjQ6Ci0JCXNjdHgtPmVuYyA9IENQQUNGX0tNX0FFU18xOTJfRU5DOwotCQlzY3R4LT5kZWMgPSBDUEFDRl9LTV9BRVNfMTkyX0RFQzsKLQkJYnJlYWs7Ci0JY2FzZSAzMjoKLQkJc2N0eC0+ZW5jID0gQ1BBQ0ZfS01fQUVTXzI1Nl9FTkM7Ci0JCXNjdHgtPmRlYyA9IENQQUNGX0tNX0FFU18yNTZfREVDOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gYWVzX3NldF9rZXkodGZtLCBpbl9rZXksIGtleV9sZW4pOworCXNjdHgtPmtleV9sZW4gPSBrZXlfbGVuOworCW1lbWNweShzY3R4LT5rZXksIGluX2tleSwga2V5X2xlbik7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZWNiX2Flc19jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIGxvbmcgZnVuYywgdm9pZCAqcGFyYW0sCitzdGF0aWMgaW50IGVjYl9hZXNfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCB1bnNpZ25lZCBsb25nIG1vZGlmaWVyLAogCQkJIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKIHsKLQlpbnQgcmV0ID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCB3YWxrKTsKLQl1bnNpZ25lZCBpbnQgbmJ5dGVzOworCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXVuc2lnbmVkIGludCBuYnl0ZXMsIG47CisJaW50IHJldDsKIAotCXdoaWxlICgobmJ5dGVzID0gd2Fsay0+bmJ5dGVzKSkgeworCXJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZGVzYywgd2Fsayk7CisJd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpID49IEFFU19CTE9DS19TSVpFKSB7CiAJCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLwotCQl1bnNpZ25lZCBpbnQgbiA9IG5ieXRlcyAmIH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKLQkJdTggKm91dCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7Ci0JCXU4ICppbiA9IHdhbGstPnNyYy52aXJ0LmFkZHI7Ci0KLQkJcmV0ID0gY3BhY2Zfa20oZnVuYywgcGFyYW0sIG91dCwgaW4sIG4pOwotCQlpZiAocmV0IDwgMCB8fCByZXQgIT0gbikKLQkJCXJldHVybiAtRUlPOwotCi0JCW5ieXRlcyAmPSBBRVNfQkxPQ0tfU0laRSAtIDE7Ci0JCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzKTsKKwkJbiA9IG5ieXRlcyAmIH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKKwkJY3BhY2Zfa20oc2N0eC0+ZmMgfCBtb2RpZmllciwgc2N0eC0+a2V5LAorCQkJIHdhbGstPmRzdC52aXJ0LmFkZHIsIHdhbGstPnNyYy52aXJ0LmFkZHIsIG4pOworCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIG5ieXRlcyAtIG4pOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0zNDcsMTEgKzI2NiwxMSBAQAogCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCi0JaWYgKHVubGlrZWx5KG5lZWRfZmFsbGJhY2soc2N0eC0+a2V5X2xlbikpKQorCWlmICh1bmxpa2VseSghc2N0eC0+ZmMpKQogCQlyZXR1cm4gZmFsbGJhY2tfYmxrX2VuYyhkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBlY2JfYWVzX2NyeXB0KGRlc2MsIHNjdHgtPmVuYywgc2N0eC0+a2V5LCAmd2Fsayk7CisJcmV0dXJuIGVjYl9hZXNfY3J5cHQoZGVzYywgMCwgJndhbGspOwogfQogCiBzdGF0aWMgaW50IGVjYl9hZXNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCkBAIC0zNjEsMTEgKzI4MCwxMSBAQAogCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCi0JaWYgKHVubGlrZWx5KG5lZWRfZmFsbGJhY2soc2N0eC0+a2V5X2xlbikpKQorCWlmICh1bmxpa2VseSghc2N0eC0+ZmMpKQogCQlyZXR1cm4gZmFsbGJhY2tfYmxrX2RlYyhkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBlY2JfYWVzX2NyeXB0KGRlc2MsIHNjdHgtPmRlYywgc2N0eC0+a2V5LCAmd2Fsayk7CisJcmV0dXJuIGVjYl9hZXNfY3J5cHQoZGVzYywgQ1BBQ0ZfREVDUllQVCwgJndhbGspOwogfQogCiBzdGF0aWMgaW50IGZhbGxiYWNrX2luaXRfYmxrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCkBAIC00MjAsNjQgKzMzOSw0NSBAQAogCQkJICAgdW5zaWduZWQgaW50IGtleV9sZW4pCiB7CiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7Ci0JaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZjOwogCi0JcmV0ID0gbmVlZF9mYWxsYmFjayhrZXlfbGVuKTsKLQlpZiAocmV0ID4gMCkgewotCQlzY3R4LT5rZXlfbGVuID0ga2V5X2xlbjsKKwkvKiBQaWNrIHRoZSBjb3JyZWN0IGZ1bmN0aW9uIGNvZGUgYmFzZWQgb24gdGhlIGtleSBsZW5ndGggKi8KKwlmYyA9IChrZXlfbGVuID09IDE2KSA/IENQQUNGX0tNQ19BRVNfMTI4IDoKKwkgICAgIChrZXlfbGVuID09IDI0KSA/IENQQUNGX0tNQ19BRVNfMTkyIDoKKwkgICAgIChrZXlfbGVuID09IDMyKSA/IENQQUNGX0tNQ19BRVNfMjU2IDogMDsKKworCS8qIENoZWNrIGlmIHRoZSBmdW5jdGlvbiBjb2RlIGlzIGF2YWlsYWJsZSAqLworCXNjdHgtPmZjID0gKGZjICYmIGNwYWNmX3Rlc3RfZnVuYygma21jX2Z1bmN0aW9ucywgZmMpKSA/IGZjIDogMDsKKwlpZiAoIXNjdHgtPmZjKQogCQlyZXR1cm4gc2V0a2V5X2ZhbGxiYWNrX2Jsayh0Zm0sIGluX2tleSwga2V5X2xlbik7Ci0JfQogCi0Jc3dpdGNoIChrZXlfbGVuKSB7Ci0JY2FzZSAxNjoKLQkJc2N0eC0+ZW5jID0gQ1BBQ0ZfS01DX0FFU18xMjhfRU5DOwotCQlzY3R4LT5kZWMgPSBDUEFDRl9LTUNfQUVTXzEyOF9ERUM7Ci0JCWJyZWFrOwotCWNhc2UgMjQ6Ci0JCXNjdHgtPmVuYyA9IENQQUNGX0tNQ19BRVNfMTkyX0VOQzsKLQkJc2N0eC0+ZGVjID0gQ1BBQ0ZfS01DX0FFU18xOTJfREVDOwotCQlicmVhazsKLQljYXNlIDMyOgotCQlzY3R4LT5lbmMgPSBDUEFDRl9LTUNfQUVTXzI1Nl9FTkM7Ci0JCXNjdHgtPmRlYyA9IENQQUNGX0tNQ19BRVNfMjU2X0RFQzsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGFlc19zZXRfa2V5KHRmbSwgaW5fa2V5LCBrZXlfbGVuKTsKKwlzY3R4LT5rZXlfbGVuID0ga2V5X2xlbjsKKwltZW1jcHkoc2N0eC0+a2V5LCBpbl9rZXksIGtleV9sZW4pOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNiY19hZXNfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBsb25nIGZ1bmMsCitzdGF0aWMgaW50IGNiY19hZXNfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCB1bnNpZ25lZCBsb25nIG1vZGlmaWVyLAogCQkJIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKIHsKIAlzdHJ1Y3QgczM5MF9hZXNfY3R4ICpzY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKLQlpbnQgcmV0ID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCB3YWxrKTsKLQl1bnNpZ25lZCBpbnQgbmJ5dGVzID0gd2Fsay0+bmJ5dGVzOworCXVuc2lnbmVkIGludCBuYnl0ZXMsIG47CisJaW50IHJldDsKIAlzdHJ1Y3QgewogCQl1OCBpdltBRVNfQkxPQ0tfU0laRV07CiAJCXU4IGtleVtBRVNfTUFYX0tFWV9TSVpFXTsKIAl9IHBhcmFtOwogCi0JaWYgKCFuYnl0ZXMpCi0JCWdvdG8gb3V0OwotCisJcmV0ID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCB3YWxrKTsKIAltZW1jcHkocGFyYW0uaXYsIHdhbGstPml2LCBBRVNfQkxPQ0tfU0laRSk7CiAJbWVtY3B5KHBhcmFtLmtleSwgc2N0eC0+a2V5LCBzY3R4LT5rZXlfbGVuKTsKLQlkbyB7CisJd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpID49IEFFU19CTE9DS19TSVpFKSB7CiAJCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLwotCQl1bnNpZ25lZCBpbnQgbiA9IG5ieXRlcyAmIH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKLQkJdTggKm91dCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7Ci0JCXU4ICppbiA9IHdhbGstPnNyYy52aXJ0LmFkZHI7Ci0KLQkJcmV0ID0gY3BhY2Zfa21jKGZ1bmMsICZwYXJhbSwgb3V0LCBpbiwgbik7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCAhPSBuKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJbmJ5dGVzICY9IEFFU19CTE9DS19TSVpFIC0gMTsKLQkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCBuYnl0ZXMpOwotCX0gd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpKTsKKwkJbiA9IG5ieXRlcyAmIH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKKwkJY3BhY2Zfa21jKHNjdHgtPmZjIHwgbW9kaWZpZXIsICZwYXJhbSwKKwkJCSAgd2Fsay0+ZHN0LnZpcnQuYWRkciwgd2Fsay0+c3JjLnZpcnQuYWRkciwgbik7CisJCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzIC0gbik7CisJfQogCW1lbWNweSh3YWxrLT5pdiwgcGFyYW0uaXYsIEFFU19CTE9DS19TSVpFKTsKLQotb3V0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQ4OCwxMSArMzg4LDExIEBACiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CiAJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CiAKLQlpZiAodW5saWtlbHkobmVlZF9mYWxsYmFjayhzY3R4LT5rZXlfbGVuKSkpCisJaWYgKHVubGlrZWx5KCFzY3R4LT5mYykpCiAJCXJldHVybiBmYWxsYmFja19ibGtfZW5jKGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGNiY19hZXNfY3J5cHQoZGVzYywgc2N0eC0+ZW5jLCAmd2Fsayk7CisJcmV0dXJuIGNiY19hZXNfY3J5cHQoZGVzYywgMCwgJndhbGspOwogfQogCiBzdGF0aWMgaW50IGNiY19hZXNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCkBAIC01MDIsMTEgKzQwMiwxMSBAQAogCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCi0JaWYgKHVubGlrZWx5KG5lZWRfZmFsbGJhY2soc2N0eC0+a2V5X2xlbikpKQorCWlmICh1bmxpa2VseSghc2N0eC0+ZmMpKQogCQlyZXR1cm4gZmFsbGJhY2tfYmxrX2RlYyhkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBjYmNfYWVzX2NyeXB0KGRlc2MsIHNjdHgtPmRlYywgJndhbGspOworCXJldHVybiBjYmNfYWVzX2NyeXB0KGRlc2MsIENQQUNGX0RFQ1JZUFQsICZ3YWxrKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGNiY19hZXNfYWxnID0gewpAQCAtNTk0LDgzICs0OTQsNjcgQEAKIAkJCSAgIHVuc2lnbmVkIGludCBrZXlfbGVuKQogewogCXN0cnVjdCBzMzkwX3h0c19jdHggKnh0c19jdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwotCXUzMiAqZmxhZ3MgPSAmdGZtLT5jcnRfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmYzsKIAlpbnQgZXJyOwogCiAJZXJyID0geHRzX2NoZWNrX2tleSh0Zm0sIGluX2tleSwga2V5X2xlbik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCXN3aXRjaCAoa2V5X2xlbikgewotCWNhc2UgMzI6Ci0JCXh0c19jdHgtPmVuYyA9IENQQUNGX0tNX1hUU18xMjhfRU5DOwotCQl4dHNfY3R4LT5kZWMgPSBDUEFDRl9LTV9YVFNfMTI4X0RFQzsKLQkJbWVtY3B5KHh0c19jdHgtPmtleSArIDE2LCBpbl9rZXksIDE2KTsKLQkJbWVtY3B5KHh0c19jdHgtPnBjY19rZXkgKyAxNiwgaW5fa2V5ICsgMTYsIDE2KTsKLQkJYnJlYWs7Ci0JY2FzZSA0ODoKLQkJeHRzX2N0eC0+ZW5jID0gMDsKLQkJeHRzX2N0eC0+ZGVjID0gMDsKLQkJeHRzX2ZhbGxiYWNrX3NldGtleSh0Zm0sIGluX2tleSwga2V5X2xlbik7Ci0JCWJyZWFrOwotCWNhc2UgNjQ6Ci0JCXh0c19jdHgtPmVuYyA9IENQQUNGX0tNX1hUU18yNTZfRU5DOwotCQl4dHNfY3R4LT5kZWMgPSBDUEFDRl9LTV9YVFNfMjU2X0RFQzsKLQkJbWVtY3B5KHh0c19jdHgtPmtleSwgaW5fa2V5LCAzMik7Ci0JCW1lbWNweSh4dHNfY3R4LT5wY2Nfa2V5LCBpbl9rZXkgKyAzMiwgMzIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU47Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwkvKiBQaWNrIHRoZSBjb3JyZWN0IGZ1bmN0aW9uIGNvZGUgYmFzZWQgb24gdGhlIGtleSBsZW5ndGggKi8KKwlmYyA9IChrZXlfbGVuID09IDMyKSA/IENQQUNGX0tNX1hUU18xMjggOgorCSAgICAgKGtleV9sZW4gPT0gNjQpID8gQ1BBQ0ZfS01fWFRTXzI1NiA6IDA7CisKKwkvKiBDaGVjayBpZiB0aGUgZnVuY3Rpb24gY29kZSBpcyBhdmFpbGFibGUgKi8KKwl4dHNfY3R4LT5mYyA9IChmYyAmJiBjcGFjZl90ZXN0X2Z1bmMoJmttX2Z1bmN0aW9ucywgZmMpKSA/IGZjIDogMDsKKwlpZiAoIXh0c19jdHgtPmZjKQorCQlyZXR1cm4geHRzX2ZhbGxiYWNrX3NldGtleSh0Zm0sIGluX2tleSwga2V5X2xlbik7CisKKwkvKiBTcGxpdCB0aGUgWFRTIGtleSBpbnRvIHRoZSB0d28gc3Via2V5cyAqLworCWtleV9sZW4gPSBrZXlfbGVuIC8gMjsKIAl4dHNfY3R4LT5rZXlfbGVuID0ga2V5X2xlbjsKKwltZW1jcHkoeHRzX2N0eC0+a2V5LCBpbl9rZXksIGtleV9sZW4pOworCW1lbWNweSh4dHNfY3R4LT5wY2Nfa2V5LCBpbl9rZXkgKyBrZXlfbGVuLCBrZXlfbGVuKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB4dHNfYWVzX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgbG9uZyBmdW5jLAotCQkJIHN0cnVjdCBzMzkwX3h0c19jdHggKnh0c19jdHgsCitzdGF0aWMgaW50IHh0c19hZXNfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCB1bnNpZ25lZCBsb25nIG1vZGlmaWVyLAogCQkJIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKIHsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gKHh0c19jdHgtPmtleV9sZW4gPj4gMSkgJiAweDEwOwotCWludCByZXQgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsIHdhbGspOwotCXVuc2lnbmVkIGludCBuYnl0ZXMgPSB3YWxrLT5uYnl0ZXM7Ci0JdW5zaWduZWQgaW50IG47Ci0JdTggKmluLCAqb3V0OwotCXN0cnVjdCBwY2NfcGFyYW0gcGNjX3BhcmFtOworCXN0cnVjdCBzMzkwX3h0c19jdHggKnh0c19jdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXVuc2lnbmVkIGludCBvZmZzZXQsIG5ieXRlcywgbjsKKwlpbnQgcmV0OworCXN0cnVjdCB7CisJCXU4IGtleVszMl07CisJCXU4IHR3ZWFrWzE2XTsKKwkJdTggYmxvY2tbMTZdOworCQl1OCBiaXRbMTZdOworCQl1OCB4dHNbMTZdOworCX0gcGNjX3BhcmFtOwogCXN0cnVjdCB7CiAJCXU4IGtleVszMl07CiAJCXU4IGluaXRbMTZdOwogCX0geHRzX3BhcmFtOwogCi0JaWYgKCFuYnl0ZXMpCi0JCWdvdG8gb3V0OwotCisJcmV0ID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCB3YWxrKTsKKwlvZmZzZXQgPSB4dHNfY3R4LT5rZXlfbGVuICYgMHgxMDsKIAltZW1zZXQocGNjX3BhcmFtLmJsb2NrLCAwLCBzaXplb2YocGNjX3BhcmFtLmJsb2NrKSk7CiAJbWVtc2V0KHBjY19wYXJhbS5iaXQsIDAsIHNpemVvZihwY2NfcGFyYW0uYml0KSk7CiAJbWVtc2V0KHBjY19wYXJhbS54dHMsIDAsIHNpemVvZihwY2NfcGFyYW0ueHRzKSk7CiAJbWVtY3B5KHBjY19wYXJhbS50d2Vhaywgd2Fsay0+aXYsIHNpemVvZihwY2NfcGFyYW0udHdlYWspKTsKLQltZW1jcHkocGNjX3BhcmFtLmtleSwgeHRzX2N0eC0+cGNjX2tleSwgMzIpOwotCS8qIHJlbW92ZSBkZWNpcGhlciBtb2RpZmllciBiaXQgZnJvbSAnZnVuYycgYW5kIGNhbGwgUENDICovCi0JcmV0ID0gY3BhY2ZfcGNjKGZ1bmMgJiAweDdmLCAmcGNjX3BhcmFtLmtleVtvZmZzZXRdKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIC1FSU87CisJbWVtY3B5KHBjY19wYXJhbS5rZXkgKyBvZmZzZXQsIHh0c19jdHgtPnBjY19rZXksIHh0c19jdHgtPmtleV9sZW4pOworCWNwYWNmX3BjYyh4dHNfY3R4LT5mYywgcGNjX3BhcmFtLmtleSArIG9mZnNldCk7CiAKLQltZW1jcHkoeHRzX3BhcmFtLmtleSwgeHRzX2N0eC0+a2V5LCAzMik7CisJbWVtY3B5KHh0c19wYXJhbS5rZXkgKyBvZmZzZXQsIHh0c19jdHgtPmtleSwgeHRzX2N0eC0+a2V5X2xlbik7CiAJbWVtY3B5KHh0c19wYXJhbS5pbml0LCBwY2NfcGFyYW0ueHRzLCAxNik7Ci0JZG8geworCisJd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpID49IEFFU19CTE9DS19TSVpFKSB7CiAJCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLwogCQluID0gbmJ5dGVzICYgfihBRVNfQkxPQ0tfU0laRSAtIDEpOwotCQlvdXQgPSB3YWxrLT5kc3QudmlydC5hZGRyOwotCQlpbiA9IHdhbGstPnNyYy52aXJ0LmFkZHI7Ci0KLQkJcmV0ID0gY3BhY2Zfa20oZnVuYywgJnh0c19wYXJhbS5rZXlbb2Zmc2V0XSwgb3V0LCBpbiwgbik7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCAhPSBuKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJbmJ5dGVzICY9IEFFU19CTE9DS19TSVpFIC0gMTsKLQkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCBuYnl0ZXMpOwotCX0gd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpKTsKLW91dDoKKwkJY3BhY2Zfa20oeHRzX2N0eC0+ZmMgfCBtb2RpZmllciwgeHRzX3BhcmFtLmtleSArIG9mZnNldCwKKwkJCSB3YWxrLT5kc3QudmlydC5hZGRyLCB3YWxrLT5zcmMudmlydC5hZGRyLCBuKTsKKwkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCBuYnl0ZXMgLSBuKTsKKwl9CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjgxLDExICs1NjUsMTEgQEAKIAlzdHJ1Y3QgczM5MF94dHNfY3R4ICp4dHNfY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAotCWlmICh1bmxpa2VseSh4dHNfY3R4LT5rZXlfbGVuID09IDQ4KSkKKwlpZiAodW5saWtlbHkoIXh0c19jdHgtPmZjKSkKIAkJcmV0dXJuIHh0c19mYWxsYmFja19lbmNyeXB0KGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIHh0c19hZXNfY3J5cHQoZGVzYywgeHRzX2N0eC0+ZW5jLCB4dHNfY3R4LCAmd2Fsayk7CisJcmV0dXJuIHh0c19hZXNfY3J5cHQoZGVzYywgMCwgJndhbGspOwogfQogCiBzdGF0aWMgaW50IHh0c19hZXNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCkBAIC02OTUsMTEgKzU3OSwxMSBAQAogCXN0cnVjdCBzMzkwX3h0c19jdHggKnh0c19jdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCi0JaWYgKHVubGlrZWx5KHh0c19jdHgtPmtleV9sZW4gPT0gNDgpKQorCWlmICh1bmxpa2VseSgheHRzX2N0eC0+ZmMpKQogCQlyZXR1cm4geHRzX2ZhbGxiYWNrX2RlY3J5cHQoZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CiAKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4geHRzX2Flc19jcnlwdChkZXNjLCB4dHNfY3R4LT5kZWMsIHh0c19jdHgsICZ3YWxrKTsKKwlyZXR1cm4geHRzX2Flc19jcnlwdChkZXNjLCBDUEFDRl9ERUNSWVBULCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBpbnQgeHRzX2ZhbGxiYWNrX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKQEAgLTc1MCwxMDggKzYzNCw3OSBAQAogCX0KIH07CiAKLXN0YXRpYyBpbnQgeHRzX2Flc19hbGdfcmVnOwotCiBzdGF0aWMgaW50IGN0cl9hZXNfc2V0X2tleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqaW5fa2V5LAogCQkJICAgdW5zaWduZWQgaW50IGtleV9sZW4pCiB7CiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisJdW5zaWduZWQgbG9uZyBmYzsKIAotCXN3aXRjaCAoa2V5X2xlbikgewotCWNhc2UgMTY6Ci0JCXNjdHgtPmVuYyA9IENQQUNGX0tNQ1RSX0FFU18xMjhfRU5DOwotCQlzY3R4LT5kZWMgPSBDUEFDRl9LTUNUUl9BRVNfMTI4X0RFQzsKLQkJYnJlYWs7Ci0JY2FzZSAyNDoKLQkJc2N0eC0+ZW5jID0gQ1BBQ0ZfS01DVFJfQUVTXzE5Ml9FTkM7Ci0JCXNjdHgtPmRlYyA9IENQQUNGX0tNQ1RSX0FFU18xOTJfREVDOwotCQlicmVhazsKLQljYXNlIDMyOgotCQlzY3R4LT5lbmMgPSBDUEFDRl9LTUNUUl9BRVNfMjU2X0VOQzsKLQkJc2N0eC0+ZGVjID0gQ1BBQ0ZfS01DVFJfQUVTXzI1Nl9ERUM7Ci0JCWJyZWFrOwotCX0KKwkvKiBQaWNrIHRoZSBjb3JyZWN0IGZ1bmN0aW9uIGNvZGUgYmFzZWQgb24gdGhlIGtleSBsZW5ndGggKi8KKwlmYyA9IChrZXlfbGVuID09IDE2KSA/IENQQUNGX0tNQ1RSX0FFU18xMjggOgorCSAgICAgKGtleV9sZW4gPT0gMjQpID8gQ1BBQ0ZfS01DVFJfQUVTXzE5MiA6CisJICAgICAoa2V5X2xlbiA9PSAzMikgPyBDUEFDRl9LTUNUUl9BRVNfMjU2IDogMDsKIAotCXJldHVybiBhZXNfc2V0X2tleSh0Zm0sIGluX2tleSwga2V5X2xlbik7CisJLyogQ2hlY2sgaWYgdGhlIGZ1bmN0aW9uIGNvZGUgaXMgYXZhaWxhYmxlICovCisJc2N0eC0+ZmMgPSAoZmMgJiYgY3BhY2ZfdGVzdF9mdW5jKCZrbWN0cl9mdW5jdGlvbnMsIGZjKSkgPyBmYyA6IDA7CisJaWYgKCFzY3R4LT5mYykKKwkJcmV0dXJuIHNldGtleV9mYWxsYmFja19ibGsodGZtLCBpbl9rZXksIGtleV9sZW4pOworCisJc2N0eC0+a2V5X2xlbiA9IGtleV9sZW47CisJbWVtY3B5KHNjdHgtPmtleSwgaW5fa2V5LCBrZXlfbGVuKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2N0cmJsa19pbml0KHU4ICpjdHJwdHIsIHVuc2lnbmVkIGludCBuYnl0ZXMpCitzdGF0aWMgdW5zaWduZWQgaW50IF9fY3RyYmxrX2luaXQodTggKmN0cnB0ciwgdTggKml2LCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewogCXVuc2lnbmVkIGludCBpLCBuOwogCiAJLyogb25seSB1c2UgY29tcGxldGUgYmxvY2tzLCBtYXguIFBBR0VfU0laRSAqLworCW1lbWNweShjdHJwdHIsIGl2LCBBRVNfQkxPQ0tfU0laRSk7CiAJbiA9IChuYnl0ZXMgPiBQQUdFX1NJWkUpID8gUEFHRV9TSVpFIDogbmJ5dGVzICYgfihBRVNfQkxPQ0tfU0laRSAtIDEpOwotCWZvciAoaSA9IEFFU19CTE9DS19TSVpFOyBpIDwgbjsgaSArPSBBRVNfQkxPQ0tfU0laRSkgewotCQltZW1jcHkoY3RycHRyICsgaSwgY3RycHRyICsgaSAtIEFFU19CTE9DS19TSVpFLAotCQkgICAgICAgQUVTX0JMT0NLX1NJWkUpOwotCQljcnlwdG9faW5jKGN0cnB0ciArIGksIEFFU19CTE9DS19TSVpFKTsKKwlmb3IgKGkgPSAobiAvIEFFU19CTE9DS19TSVpFKSAtIDE7IGkgPiAwOyBpLS0pIHsKKwkJbWVtY3B5KGN0cnB0ciArIEFFU19CTE9DS19TSVpFLCBjdHJwdHIsIEFFU19CTE9DS19TSVpFKTsKKwkJY3J5cHRvX2luYyhjdHJwdHIgKyBBRVNfQkxPQ0tfU0laRSwgQUVTX0JMT0NLX1NJWkUpOworCQljdHJwdHIgKz0gQUVTX0JMT0NLX1NJWkU7CiAJfQogCXJldHVybiBuOwogfQogCi1zdGF0aWMgaW50IGN0cl9hZXNfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBsb25nIGZ1bmMsCi0JCQkgc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCwgc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrKQorc3RhdGljIGludCBjdHJfYWVzX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgdW5zaWduZWQgbG9uZyBtb2RpZmllciwKKwkJCSBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCiB7Ci0JaW50IHJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnRfYmxvY2soZGVzYywgd2FsaywgQUVTX0JMT0NLX1NJWkUpOworCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXU4IGJ1ZltBRVNfQkxPQ0tfU0laRV0sICpjdHJwdHI7CiAJdW5zaWduZWQgaW50IG4sIG5ieXRlczsKLQl1OCBidWZbQUVTX0JMT0NLX1NJWkVdLCBjdHJidWZbQUVTX0JMT0NLX1NJWkVdOwotCXU4ICpvdXQsICppbiwgKmN0cnB0ciA9IGN0cmJ1ZjsKKwlpbnQgcmV0LCBsb2NrZWQ7CiAKLQlpZiAoIXdhbGstPm5ieXRlcykKLQkJcmV0dXJuIHJldDsKKwlsb2NrZWQgPSBzcGluX3RyeWxvY2soJmN0cmJsa19sb2NrKTsKIAotCWlmIChzcGluX3RyeWxvY2soJmN0cmJsa19sb2NrKSkKLQkJY3RycHRyID0gY3RyYmxrOwotCi0JbWVtY3B5KGN0cnB0ciwgd2Fsay0+aXYsIEFFU19CTE9DS19TSVpFKTsKKwlyZXQgPSBibGtjaXBoZXJfd2Fsa192aXJ0X2Jsb2NrKGRlc2MsIHdhbGssIEFFU19CTE9DS19TSVpFKTsKIAl3aGlsZSAoKG5ieXRlcyA9IHdhbGstPm5ieXRlcykgPj0gQUVTX0JMT0NLX1NJWkUpIHsKLQkJb3V0ID0gd2Fsay0+ZHN0LnZpcnQuYWRkcjsKLQkJaW4gPSB3YWxrLT5zcmMudmlydC5hZGRyOwotCQl3aGlsZSAobmJ5dGVzID49IEFFU19CTE9DS19TSVpFKSB7Ci0JCQlpZiAoY3RycHRyID09IGN0cmJsaykKLQkJCQluID0gX19jdHJibGtfaW5pdChjdHJwdHIsIG5ieXRlcyk7Ci0JCQllbHNlCi0JCQkJbiA9IEFFU19CTE9DS19TSVpFOwotCQkJcmV0ID0gY3BhY2Zfa21jdHIoZnVuYywgc2N0eC0+a2V5LCBvdXQsIGluLCBuLCBjdHJwdHIpOwotCQkJaWYgKHJldCA8IDAgfHwgcmV0ICE9IG4pIHsKLQkJCQlpZiAoY3RycHRyID09IGN0cmJsaykKLQkJCQkJc3Bpbl91bmxvY2soJmN0cmJsa19sb2NrKTsKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCX0KLQkJCWlmIChuID4gQUVTX0JMT0NLX1NJWkUpCi0JCQkJbWVtY3B5KGN0cnB0ciwgY3RycHRyICsgbiAtIEFFU19CTE9DS19TSVpFLAotCQkJCSAgICAgICBBRVNfQkxPQ0tfU0laRSk7Ci0JCQljcnlwdG9faW5jKGN0cnB0ciwgQUVTX0JMT0NLX1NJWkUpOwotCQkJb3V0ICs9IG47Ci0JCQlpbiArPSBuOwotCQkJbmJ5dGVzIC09IG47Ci0JCX0KLQkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCBuYnl0ZXMpOworCQluID0gQUVTX0JMT0NLX1NJWkU7CisJCWlmIChuYnl0ZXMgPj0gMipBRVNfQkxPQ0tfU0laRSAmJiBsb2NrZWQpCisJCQluID0gX19jdHJibGtfaW5pdChjdHJibGssIHdhbGstPml2LCBuYnl0ZXMpOworCQljdHJwdHIgPSAobiA+IEFFU19CTE9DS19TSVpFKSA/IGN0cmJsayA6IHdhbGstPml2OworCQljcGFjZl9rbWN0cihzY3R4LT5mYyB8IG1vZGlmaWVyLCBzY3R4LT5rZXksCisJCQkgICAgd2Fsay0+ZHN0LnZpcnQuYWRkciwgd2Fsay0+c3JjLnZpcnQuYWRkciwKKwkJCSAgICBuLCBjdHJwdHIpOworCQlpZiAoY3RycHRyID09IGN0cmJsaykKKwkJCW1lbWNweSh3YWxrLT5pdiwgY3RycHRyICsgbiAtIEFFU19CTE9DS19TSVpFLAorCQkJICAgICAgIEFFU19CTE9DS19TSVpFKTsKKwkJY3J5cHRvX2luYyh3YWxrLT5pdiwgQUVTX0JMT0NLX1NJWkUpOworCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIG5ieXRlcyAtIG4pOwogCX0KLQlpZiAoY3RycHRyID09IGN0cmJsaykgewotCQlpZiAobmJ5dGVzKQotCQkJbWVtY3B5KGN0cmJ1ZiwgY3RycHRyLCBBRVNfQkxPQ0tfU0laRSk7Ci0JCWVsc2UKLQkJCW1lbWNweSh3YWxrLT5pdiwgY3RycHRyLCBBRVNfQkxPQ0tfU0laRSk7CisJaWYgKGxvY2tlZCkKIAkJc3Bpbl91bmxvY2soJmN0cmJsa19sb2NrKTsKLQl9IGVsc2UgewotCQlpZiAoIW5ieXRlcykKLQkJCW1lbWNweSh3YWxrLT5pdiwgY3RycHRyLCBBRVNfQkxPQ0tfU0laRSk7Ci0JfQogCS8qCiAJICogZmluYWwgYmxvY2sgbWF5IGJlIDwgQUVTX0JMT0NLX1NJWkUsIGNvcHkgb25seSBuYnl0ZXMKIAkgKi8KIAlpZiAobmJ5dGVzKSB7Ci0JCW91dCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7Ci0JCWluID0gd2Fsay0+c3JjLnZpcnQuYWRkcjsKLQkJcmV0ID0gY3BhY2Zfa21jdHIoZnVuYywgc2N0eC0+a2V5LCBidWYsIGluLAotCQkJCSAgQUVTX0JMT0NLX1NJWkUsIGN0cmJ1Zik7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCAhPSBBRVNfQkxPQ0tfU0laRSkKLQkJCXJldHVybiAtRUlPOwotCQltZW1jcHkob3V0LCBidWYsIG5ieXRlcyk7Ci0JCWNyeXB0b19pbmMoY3RyYnVmLCBBRVNfQkxPQ0tfU0laRSk7CisJCWNwYWNmX2ttY3RyKHNjdHgtPmZjIHwgbW9kaWZpZXIsIHNjdHgtPmtleSwKKwkJCSAgICBidWYsIHdhbGstPnNyYy52aXJ0LmFkZHIsCisJCQkgICAgQUVTX0JMT0NLX1NJWkUsIHdhbGstPml2KTsKKwkJbWVtY3B5KHdhbGstPmRzdC52aXJ0LmFkZHIsIGJ1ZiwgbmJ5dGVzKTsKKwkJY3J5cHRvX2luYyh3YWxrLT5pdiwgQUVTX0JMT0NLX1NJWkUpOwogCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIDApOwotCQltZW1jcHkod2Fsay0+aXYsIGN0cmJ1ZiwgQUVTX0JMT0NLX1NJWkUpOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC04NjQsOCArNzE5LDExIEBACiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CiAJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CiAKKwlpZiAodW5saWtlbHkoIXNjdHgtPmZjKSkKKwkJcmV0dXJuIGZhbGxiYWNrX2Jsa19lbmMoZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CisKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4gY3RyX2Flc19jcnlwdChkZXNjLCBzY3R4LT5lbmMsIHNjdHgsICZ3YWxrKTsKKwlyZXR1cm4gY3RyX2Flc19jcnlwdChkZXNjLCAwLCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBpbnQgY3RyX2Flc19kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKQEAgLTg3NSwxOSArNzMzLDI1IEBACiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CiAJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CiAKKwlpZiAodW5saWtlbHkoIXNjdHgtPmZjKSkKKwkJcmV0dXJuIGZhbGxiYWNrX2Jsa19kZWMoZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CisKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4gY3RyX2Flc19jcnlwdChkZXNjLCBzY3R4LT5kZWMsIHNjdHgsICZ3YWxrKTsKKwlyZXR1cm4gY3RyX2Flc19jcnlwdChkZXNjLCBDUEFDRl9ERUNSWVBULCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBjdHJfYWVzX2FsZyA9IHsKIAkuY3JhX25hbWUJCT0JImN0cihhZXMpIiwKIAkuY3JhX2RyaXZlcl9uYW1lCT0JImN0ci1hZXMtczM5MCIsCiAJLmNyYV9wcmlvcml0eQkJPQk0MDAsCS8qIGNvbWJvOiBhZXMgKyBjdHIgKi8KLQkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPQlDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkJQ1JZUFRPX0FMR19ORUVEX0ZBTExCQUNLLAogCS5jcmFfYmxvY2tzaXplCQk9CTEsCiAJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgczM5MF9hZXNfY3R4KSwKIAkuY3JhX3R5cGUJCT0JJmNyeXB0b19ibGtjaXBoZXJfdHlwZSwKIAkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKKwkuY3JhX2luaXQJCT0JZmFsbGJhY2tfaW5pdF9ibGssCisJLmNyYV9leGl0CQk9CWZhbGxiYWNrX2V4aXRfYmxrLAogCS5jcmFfdQkJCT0JewogCQkuYmxrY2lwaGVyID0gewogCQkJLm1pbl9rZXlzaXplCQk9CUFFU19NSU5fS0VZX1NJWkUsCkBAIC05MDAsODkgKzc2NCw3OSBAQAogCX0KIH07CiAKLXN0YXRpYyBpbnQgY3RyX2Flc19hbGdfcmVnOworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnICphZXNfczM5MF9hbGdzX3B0cls1XTsKK3N0YXRpYyBpbnQgYWVzX3MzOTBfYWxnc19udW07CisKK3N0YXRpYyBpbnQgYWVzX3MzOTBfcmVnaXN0ZXJfYWxnKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJaW50IHJldDsKKworCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoYWxnKTsKKwlpZiAoIXJldCkKKwkJYWVzX3MzOTBfYWxnc19wdHJbYWVzX3MzOTBfYWxnc19udW0rK10gPSBhbGc7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYWVzX3MzOTBfZmluaSh2b2lkKQoreworCXdoaWxlIChhZXNfczM5MF9hbGdzX251bS0tKQorCQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoYWVzX3MzOTBfYWxnc19wdHJbYWVzX3MzOTBfYWxnc19udW1dKTsKKwlpZiAoY3RyYmxrKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGN0cmJsayk7Cit9CiAKIHN0YXRpYyBpbnQgX19pbml0IGFlc19zMzkwX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwogCi0JaWYgKGNwYWNmX3F1ZXJ5KENQQUNGX0tNLCBDUEFDRl9LTV9BRVNfMTI4X0VOQykpCi0JCWtleWxlbl9mbGFnIHw9IEFFU19LRVlMRU5fMTI4OwotCWlmIChjcGFjZl9xdWVyeShDUEFDRl9LTSwgQ1BBQ0ZfS01fQUVTXzE5Ml9FTkMpKQotCQlrZXlsZW5fZmxhZyB8PSBBRVNfS0VZTEVOXzE5MjsKLQlpZiAoY3BhY2ZfcXVlcnkoQ1BBQ0ZfS00sIENQQUNGX0tNX0FFU18yNTZfRU5DKSkKLQkJa2V5bGVuX2ZsYWcgfD0gQUVTX0tFWUxFTl8yNTY7CisJLyogUXVlcnkgYXZhaWxhYmxlIGZ1bmN0aW9ucyBmb3IgS00sIEtNQyBhbmQgS01DVFIgKi8KKwljcGFjZl9xdWVyeShDUEFDRl9LTSwgJmttX2Z1bmN0aW9ucyk7CisJY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DLCAma21jX2Z1bmN0aW9ucyk7CisJY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DVFIsICZrbWN0cl9mdW5jdGlvbnMpOwogCi0JaWYgKCFrZXlsZW5fZmxhZykKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JLyogejkgMTA5IGFuZCB6OSBCQy9FQyBvbmx5IHN1cHBvcnQgMTI4IGJpdCBrZXkgbGVuZ3RoICovCi0JaWYgKGtleWxlbl9mbGFnID09IEFFU19LRVlMRU5fMTI4KQotCQlwcl9pbmZvKCJBRVMgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIGZvciIKLQkJCSIgMTI4LWJpdCBrZXlzXG4iKTsKLQotCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmFlc19hbGcpOwotCWlmIChyZXQpCi0JCWdvdG8gYWVzX2VycjsKLQotCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmVjYl9hZXNfYWxnKTsKLQlpZiAocmV0KQotCQlnb3RvIGVjYl9hZXNfZXJyOwotCi0JcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmY2JjX2Flc19hbGcpOwotCWlmIChyZXQpCi0JCWdvdG8gY2JjX2Flc19lcnI7Ci0KLQlpZiAoY3BhY2ZfcXVlcnkoQ1BBQ0ZfS00sIENQQUNGX0tNX1hUU18xMjhfRU5DKSAmJgotCSAgICBjcGFjZl9xdWVyeShDUEFDRl9LTSwgQ1BBQ0ZfS01fWFRTXzI1Nl9FTkMpKSB7Ci0JCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJnh0c19hZXNfYWxnKTsKKwlpZiAoY3BhY2ZfdGVzdF9mdW5jKCZrbV9mdW5jdGlvbnMsIENQQUNGX0tNX0FFU18xMjgpIHx8CisJICAgIGNwYWNmX3Rlc3RfZnVuYygma21fZnVuY3Rpb25zLCBDUEFDRl9LTV9BRVNfMTkyKSB8fAorCSAgICBjcGFjZl90ZXN0X2Z1bmMoJmttX2Z1bmN0aW9ucywgQ1BBQ0ZfS01fQUVTXzI1NikpIHsKKwkJcmV0ID0gYWVzX3MzOTBfcmVnaXN0ZXJfYWxnKCZhZXNfYWxnKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8geHRzX2Flc19lcnI7Ci0JCXh0c19hZXNfYWxnX3JlZyA9IDE7CisJCQlnb3RvIG91dF9lcnI7CisJCXJldCA9IGFlc19zMzkwX3JlZ2lzdGVyX2FsZygmZWNiX2Flc19hbGcpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZXJyOwogCX0KIAotCWlmIChjcGFjZl9xdWVyeShDUEFDRl9LTUNUUiwgQ1BBQ0ZfS01DVFJfQUVTXzEyOF9FTkMpICYmCi0JICAgIGNwYWNmX3F1ZXJ5KENQQUNGX0tNQ1RSLCBDUEFDRl9LTUNUUl9BRVNfMTkyX0VOQykgJiYKLQkgICAgY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DVFIsIENQQUNGX0tNQ1RSX0FFU18yNTZfRU5DKSkgeworCWlmIChjcGFjZl90ZXN0X2Z1bmMoJmttY19mdW5jdGlvbnMsIENQQUNGX0tNQ19BRVNfMTI4KSB8fAorCSAgICBjcGFjZl90ZXN0X2Z1bmMoJmttY19mdW5jdGlvbnMsIENQQUNGX0tNQ19BRVNfMTkyKSB8fAorCSAgICBjcGFjZl90ZXN0X2Z1bmMoJmttY19mdW5jdGlvbnMsIENQQUNGX0tNQ19BRVNfMjU2KSkgeworCQlyZXQgPSBhZXNfczM5MF9yZWdpc3Rlcl9hbGcoJmNiY19hZXNfYWxnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlpZiAoY3BhY2ZfdGVzdF9mdW5jKCZrbV9mdW5jdGlvbnMsIENQQUNGX0tNX1hUU18xMjgpIHx8CisJICAgIGNwYWNmX3Rlc3RfZnVuYygma21fZnVuY3Rpb25zLCBDUEFDRl9LTV9YVFNfMjU2KSkgeworCQlyZXQgPSBhZXNfczM5MF9yZWdpc3Rlcl9hbGcoJnh0c19hZXNfYWxnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlpZiAoY3BhY2ZfdGVzdF9mdW5jKCZrbWN0cl9mdW5jdGlvbnMsIENQQUNGX0tNQ1RSX0FFU18xMjgpIHx8CisJICAgIGNwYWNmX3Rlc3RfZnVuYygma21jdHJfZnVuY3Rpb25zLCBDUEFDRl9LTUNUUl9BRVNfMTkyKSB8fAorCSAgICBjcGFjZl90ZXN0X2Z1bmMoJmttY3RyX2Z1bmN0aW9ucywgQ1BBQ0ZfS01DVFJfQUVTXzI1NikpIHsKIAkJY3RyYmxrID0gKHU4ICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKIAkJaWYgKCFjdHJibGspIHsKIAkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGN0cl9hZXNfZXJyOworCQkJZ290byBvdXRfZXJyOwogCQl9Ci0JCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmN0cl9hZXNfYWxnKTsKLQkJaWYgKHJldCkgewotCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBjdHJibGspOwotCQkJZ290byBjdHJfYWVzX2VycjsKLQkJfQotCQljdHJfYWVzX2FsZ19yZWcgPSAxOworCQlyZXQgPSBhZXNfczM5MF9yZWdpc3Rlcl9hbGcoJmN0cl9hZXNfYWxnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKIAl9CiAKLW91dDoKKwlyZXR1cm4gMDsKK291dF9lcnI6CisJYWVzX3MzOTBfZmluaSgpOwogCXJldHVybiByZXQ7Ci0KLWN0cl9hZXNfZXJyOgotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmeHRzX2Flc19hbGcpOwoteHRzX2Flc19lcnI6Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjYmNfYWVzX2FsZyk7Ci1jYmNfYWVzX2VycjoKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmVjYl9hZXNfYWxnKTsKLWVjYl9hZXNfZXJyOgotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmYWVzX2FsZyk7Ci1hZXNfZXJyOgotCWdvdG8gb3V0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYWVzX3MzOTBfZmluaSh2b2lkKQotewotCWlmIChjdHJfYWVzX2FsZ19yZWcpIHsKLQkJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjdHJfYWVzX2FsZyk7Ci0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgY3RyYmxrKTsKLQl9Ci0JaWYgKHh0c19hZXNfYWxnX3JlZykKLQkJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZ4dHNfYWVzX2FsZyk7Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjYmNfYWVzX2FsZyk7Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZlY2JfYWVzX2FsZyk7Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZhZXNfYWxnKTsKIH0KIAogbW9kdWxlX2NwdV9mZWF0dXJlX21hdGNoKE1TQSwgYWVzX3MzOTBfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY3J5cHRvL2NyYzMyLXZ4LmMgYi9hcmNoL3MzOTAvY3J5cHRvL2NyYzMyLXZ4LmMKaW5kZXggNTc3YWUxZC4uOTkyZTYzMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NyeXB0by9jcmMzMi12eC5jCisrKyBiL2FyY2gvczM5MC9jcnlwdG8vY3JjMzItdnguYwpAQCAtNTEsNiArNTEsOSBAQAogCQlzdHJ1Y3Qga2VybmVsX2ZwdSB2eHN0YXRlOwkJCQkgICAgXAogCQl1bnNpZ25lZCBsb25nIHByZWFsaWduLCBhbGlnbmVkLCByZW1haW5pbmc7CQkgICAgXAogCQkJCQkJCQkJICAgIFwKKwkJaWYgKGRhdGFsZW4gPCBWWF9NSU5fTEVOICsgVlhfQUxJR05fTUFTSykJCSAgICBcCisJCQlyZXR1cm4gX19fY3JjMzJfc3coY3JjLCBkYXRhLCBkYXRhbGVuKTsJCSAgICBcCisJCQkJCQkJCQkgICAgXAogCQlpZiAoKHVuc2lnbmVkIGxvbmcpZGF0YSAmIFZYX0FMSUdOX01BU0spIHsJCSAgICBcCiAJCQlwcmVhbGlnbiA9IFZYX0FMSUdOTUVOVCAtCQkJICAgIFwKIAkJCQkgICgodW5zaWduZWQgbG9uZylkYXRhICYgVlhfQUxJR05fTUFTSyk7ICAgIFwKQEAgLTU5LDE1ICs2MiwxMiBAQAogCQkJZGF0YSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWRhdGEgKyBwcmVhbGlnbik7ICAgIFwKIAkJfQkJCQkJCQkgICAgXAogCQkJCQkJCQkJICAgIFwKLQkJaWYgKGRhdGFsZW4gPCBWWF9NSU5fTEVOKQkJCQkgICAgXAotCQkJcmV0dXJuIF9fX2NyYzMyX3N3KGNyYywgZGF0YSwgZGF0YWxlbik7CQkgICAgXAotCQkJCQkJCQkJICAgIFwKIAkJYWxpZ25lZCA9IGRhdGFsZW4gJiB+VlhfQUxJR05fTUFTSzsJCQkgICAgXAogCQlyZW1haW5pbmcgPSBkYXRhbGVuICYgVlhfQUxJR05fTUFTSzsJCQkgICAgXAogCQkJCQkJCQkJICAgIFwKIAkJa2VybmVsX2ZwdV9iZWdpbigmdnhzdGF0ZSwgS0VSTkVMX1ZYUl9MT1cpOwkJICAgIFwKIAkJY3JjID0gX19fY3JjMzJfdngoY3JjLCBkYXRhLCBhbGlnbmVkKTsJCQkgICAgXAotCQlrZXJuZWxfZnB1X2VuZCgmdnhzdGF0ZSk7CQkJCSAgICBcCisJCWtlcm5lbF9mcHVfZW5kKCZ2eHN0YXRlLCBLRVJORUxfVlhSX0xPVyk7CQkgICAgXAogCQkJCQkJCQkJICAgIFwKIAkJaWYgKHJlbWFpbmluZykJCQkJCQkgICAgXAogCQkJY3JjID0gX19fY3JjMzJfc3coY3JjLCBkYXRhICsgYWxpZ25lZCwgcmVtYWluaW5nKTsgIFwKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jcnlwdG8vZGVzX3MzOTAuYyBiL2FyY2gvczM5MC9jcnlwdG8vZGVzX3MzOTAuYwppbmRleCA2OTdlNzFhLi44YjgzMTQ0IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY3J5cHRvL2Rlc19zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2NyeXB0by9kZXNfczM5MC5jCkBAIC0yNyw2ICsyNyw4IEBACiBzdGF0aWMgdTggKmN0cmJsazsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY3RyYmxrX2xvY2spOwogCitzdGF0aWMgY3BhY2ZfbWFza190IGttX2Z1bmN0aW9ucywga21jX2Z1bmN0aW9ucywga21jdHJfZnVuY3Rpb25zOworCiBzdHJ1Y3QgczM5MF9kZXNfY3R4IHsKIAl1OCBpdltERVNfQkxPQ0tfU0laRV07CiAJdTgga2V5W0RFUzNfS0VZX1NJWkVdOwpAQCAtMzYsMTIgKzM4LDEyIEBACiAJCSAgICAgIHVuc2lnbmVkIGludCBrZXlfbGVuKQogewogCXN0cnVjdCBzMzkwX2Rlc19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7Ci0JdTMyICpmbGFncyA9ICZ0Zm0tPmNydF9mbGFnczsKIAl1MzIgdG1wW0RFU19FWFBLRVlfV09SRFNdOwogCiAJLyogY2hlY2sgZm9yIHdlYWsga2V5cyAqLwotCWlmICghZGVzX2VrZXkodG1wLCBrZXkpICYmICgqZmxhZ3MgJiBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSkpIHsKLQkJKmZsYWdzIHw9IENSWVBUT19URk1fUkVTX1dFQUtfS0VZOworCWlmICghZGVzX2VrZXkodG1wLCBrZXkpICYmCisJICAgICh0Zm0tPmNydF9mbGFncyAmIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKSkgeworCQl0Zm0tPmNydF9mbGFncyB8PSBDUllQVE9fVEZNX1JFU19XRUFLX0tFWTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01MywxNCArNTUsMTUgQEAKIHsKIAlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCi0JY3BhY2Zfa20oQ1BBQ0ZfS01fREVBX0VOQywgY3R4LT5rZXksIG91dCwgaW4sIERFU19CTE9DS19TSVpFKTsKKwljcGFjZl9rbShDUEFDRl9LTV9ERUEsIGN0eC0+a2V5LCBvdXQsIGluLCBERVNfQkxPQ0tfU0laRSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRlc19kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKIHsKIAlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCi0JY3BhY2Zfa20oQ1BBQ0ZfS01fREVBX0RFQywgY3R4LT5rZXksIG91dCwgaW4sIERFU19CTE9DS19TSVpFKTsKKwljcGFjZl9rbShDUEFDRl9LTV9ERUEgfCBDUEFDRl9ERUNSWVBULAorCQkgY3R4LT5rZXksIG91dCwgaW4sIERFU19CTE9DS19TSVpFKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGRlc19hbGcgPSB7CkBAIC04Miw2MSArODUsNDYgQEAKIAl9CiB9OwogCi1zdGF0aWMgaW50IGVjYl9kZXNhbGxfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBsb25nIGZ1bmMsCi0JCQkgICAgdTggKmtleSwgc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrKQotewotCWludCByZXQgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsIHdhbGspOwotCXVuc2lnbmVkIGludCBuYnl0ZXM7Ci0KLQl3aGlsZSAoKG5ieXRlcyA9IHdhbGstPm5ieXRlcykpIHsKLQkJLyogb25seSB1c2UgY29tcGxldGUgYmxvY2tzICovCi0JCXVuc2lnbmVkIGludCBuID0gbmJ5dGVzICYgfihERVNfQkxPQ0tfU0laRSAtIDEpOwotCQl1OCAqb3V0ID0gd2Fsay0+ZHN0LnZpcnQuYWRkcjsKLQkJdTggKmluID0gd2Fsay0+c3JjLnZpcnQuYWRkcjsKLQotCQlyZXQgPSBjcGFjZl9rbShmdW5jLCBrZXksIG91dCwgaW4sIG4pOwotCQlpZiAocmV0IDwgMCB8fCByZXQgIT0gbikKLQkJCXJldHVybiAtRUlPOwotCi0JCW5ieXRlcyAmPSBERVNfQkxPQ0tfU0laRSAtIDE7Ci0JCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNiY19kZXNhbGxfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBsb25nIGZ1bmMsCitzdGF0aWMgaW50IGVjYl9kZXNhbGxfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCB1bnNpZ25lZCBsb25nIGZjLAogCQkJICAgIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKIHsKIAlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwotCWludCByZXQgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsIHdhbGspOwotCXVuc2lnbmVkIGludCBuYnl0ZXMgPSB3YWxrLT5uYnl0ZXM7CisJdW5zaWduZWQgaW50IG5ieXRlcywgbjsKKwlpbnQgcmV0OworCisJcmV0ID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCB3YWxrKTsKKwl3aGlsZSAoKG5ieXRlcyA9IHdhbGstPm5ieXRlcykgPj0gREVTX0JMT0NLX1NJWkUpIHsKKwkJLyogb25seSB1c2UgY29tcGxldGUgYmxvY2tzICovCisJCW4gPSBuYnl0ZXMgJiB+KERFU19CTE9DS19TSVpFIC0gMSk7CisJCWNwYWNmX2ttKGZjLCBjdHgtPmtleSwgd2Fsay0+ZHN0LnZpcnQuYWRkciwKKwkJCSB3YWxrLT5zcmMudmlydC5hZGRyLCBuKTsKKwkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCBuYnl0ZXMgLSBuKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjYmNfZGVzYWxsX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgdW5zaWduZWQgbG9uZyBmYywKKwkJCSAgICBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCit7CisJc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKKwl1bnNpZ25lZCBpbnQgbmJ5dGVzLCBuOworCWludCByZXQ7CiAJc3RydWN0IHsKIAkJdTggaXZbREVTX0JMT0NLX1NJWkVdOwogCQl1OCBrZXlbREVTM19LRVlfU0laRV07CiAJfSBwYXJhbTsKIAotCWlmICghbmJ5dGVzKQotCQlnb3RvIG91dDsKLQorCXJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZGVzYywgd2Fsayk7CiAJbWVtY3B5KHBhcmFtLml2LCB3YWxrLT5pdiwgREVTX0JMT0NLX1NJWkUpOwogCW1lbWNweShwYXJhbS5rZXksIGN0eC0+a2V5LCBERVMzX0tFWV9TSVpFKTsKLQlkbyB7CisJd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpID49IERFU19CTE9DS19TSVpFKSB7CiAJCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLwotCQl1bnNpZ25lZCBpbnQgbiA9IG5ieXRlcyAmIH4oREVTX0JMT0NLX1NJWkUgLSAxKTsKLQkJdTggKm91dCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7Ci0JCXU4ICppbiA9IHdhbGstPnNyYy52aXJ0LmFkZHI7Ci0KLQkJcmV0ID0gY3BhY2Zfa21jKGZ1bmMsICZwYXJhbSwgb3V0LCBpbiwgbik7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCAhPSBuKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJbmJ5dGVzICY9IERFU19CTE9DS19TSVpFIC0gMTsKLQkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCBuYnl0ZXMpOwotCX0gd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpKTsKKwkJbiA9IG5ieXRlcyAmIH4oREVTX0JMT0NLX1NJWkUgLSAxKTsKKwkJY3BhY2Zfa21jKGZjLCAmcGFyYW0sIHdhbGstPmRzdC52aXJ0LmFkZHIsCisJCQkgIHdhbGstPnNyYy52aXJ0LmFkZHIsIG4pOworCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIG5ieXRlcyAtIG4pOworCX0KIAltZW1jcHkod2Fsay0+aXYsIHBhcmFtLml2LCBERVNfQkxPQ0tfU0laRSk7Ci0KLW91dDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDQsMjIgKzEzMiwyMCBAQAogCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGVjYl9kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01fREVBX0VOQywgY3R4LT5rZXksICZ3YWxrKTsKKwlyZXR1cm4gZWNiX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTV9ERUEsICZ3YWxrKTsKIH0KIAogc3RhdGljIGludCBlY2JfZGVzX2RlY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAogCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGVjYl9kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01fREVBX0RFQywgY3R4LT5rZXksICZ3YWxrKTsKKwlyZXR1cm4gZWNiX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTV9ERUEgfCBDUEFDRl9ERUNSWVBULCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBlY2JfZGVzX2FsZyA9IHsKQEAgLTE4OSw3ICsxNzUsNyBAQAogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGNiY19kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01DX0RFQV9FTkMsICZ3YWxrKTsKKwlyZXR1cm4gY2JjX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNfREVBLCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBpbnQgY2JjX2Rlc19kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKQEAgLTE5OSw3ICsxODUsNyBAQAogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGNiY19kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01DX0RFQV9ERUMsICZ3YWxrKTsKKwlyZXR1cm4gY2JjX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNfREVBIHwgQ1BBQ0ZfREVDUllQVCwgJndhbGspOwogfQogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgY2JjX2Rlc19hbGcgPSB7CkBAIC0yNDAsMTMgKzIyNiwxMiBAQAogCQkgICAgICAgdW5zaWduZWQgaW50IGtleV9sZW4pCiB7CiAJc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKLQl1MzIgKmZsYWdzID0gJnRmbS0+Y3J0X2ZsYWdzOwogCiAJaWYgKCEoY3J5cHRvX21lbW5lcShrZXksICZrZXlbREVTX0tFWV9TSVpFXSwgREVTX0tFWV9TSVpFKSAmJgogCSAgICBjcnlwdG9fbWVtbmVxKCZrZXlbREVTX0tFWV9TSVpFXSwgJmtleVtERVNfS0VZX1NJWkUgKiAyXSwKIAkJCSAgREVTX0tFWV9TSVpFKSkgJiYKLQkgICAgKCpmbGFncyAmIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKSkgewotCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfV0VBS19LRVk7CisJICAgICh0Zm0tPmNydF9mbGFncyAmIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKSkgeworCQl0Zm0tPmNydF9mbGFncyB8PSBDUllQVE9fVEZNX1JFU19XRUFLX0tFWTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCW1lbWNweShjdHgtPmtleSwga2V5LCBrZXlfbGVuKTsKQEAgLTI1NywxNCArMjQyLDE1IEBACiB7CiAJc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAotCWNwYWNmX2ttKENQQUNGX0tNX1RERUFfMTkyX0VOQywgY3R4LT5rZXksIGRzdCwgc3JjLCBERVNfQkxPQ0tfU0laRSk7CisJY3BhY2Zfa20oQ1BBQ0ZfS01fVERFQV8xOTIsIGN0eC0+a2V5LCBkc3QsIHNyYywgREVTX0JMT0NLX1NJWkUpOwogfQogCiBzdGF0aWMgdm9pZCBkZXMzX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKIHsKIAlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCi0JY3BhY2Zfa20oQ1BBQ0ZfS01fVERFQV8xOTJfREVDLCBjdHgtPmtleSwgZHN0LCBzcmMsIERFU19CTE9DS19TSVpFKTsKKwljcGFjZl9rbShDUEFDRl9LTV9UREVBXzE5MiB8IENQQUNGX0RFQ1JZUFQsCisJCSBjdHgtPmtleSwgZHN0LCBzcmMsIERFU19CTE9DS19TSVpFKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGRlczNfYWxnID0gewpAQCAtMjkwLDIyICsyNzYsMjEgQEAKIAkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCiAJCQkgICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGVjYl9kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01fVERFQV8xOTJfRU5DLCBjdHgtPmtleSwgJndhbGspOworCXJldHVybiBlY2JfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNX1RERUFfMTkyLCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBpbnQgZWNiX2RlczNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCiAJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkJICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0Jc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBlY2JfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNX1RERUFfMTkyX0RFQywgY3R4LT5rZXksICZ3YWxrKTsKKwlyZXR1cm4gZWNiX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTV9UREVBXzE5MiB8IENQQUNGX0RFQ1JZUFQsCisJCQkJJndhbGspOwogfQogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgZWNiX2RlczNfYWxnID0gewpAQCAtMzM1LDcgKzMyMCw3IEBACiAJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CiAKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4gY2JjX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNfVERFQV8xOTJfRU5DLCAmd2Fsayk7CisJcmV0dXJuIGNiY19kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01DX1RERUFfMTkyLCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBpbnQgY2JjX2RlczNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCkBAIC0zNDUsNyArMzMwLDggQEAKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBjYmNfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNQ19UREVBXzE5Ml9ERUMsICZ3YWxrKTsKKwlyZXR1cm4gY2JjX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNfVERFQV8xOTIgfCBDUEFDRl9ERUNSWVBULAorCQkJCSZ3YWxrKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGNiY19kZXMzX2FsZyA9IHsKQEAgLTM2OSw4MSArMzU1LDU0IEBACiAJfQogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2N0cmJsa19pbml0KHU4ICpjdHJwdHIsIHVuc2lnbmVkIGludCBuYnl0ZXMpCitzdGF0aWMgdW5zaWduZWQgaW50IF9fY3RyYmxrX2luaXQodTggKmN0cnB0ciwgdTggKml2LCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewogCXVuc2lnbmVkIGludCBpLCBuOwogCiAJLyogYWxpZ24gdG8gYmxvY2sgc2l6ZSwgbWF4LiBQQUdFX1NJWkUgKi8KIAluID0gKG5ieXRlcyA+IFBBR0VfU0laRSkgPyBQQUdFX1NJWkUgOiBuYnl0ZXMgJiB+KERFU19CTE9DS19TSVpFIC0gMSk7Ci0JZm9yIChpID0gREVTX0JMT0NLX1NJWkU7IGkgPCBuOyBpICs9IERFU19CTE9DS19TSVpFKSB7Ci0JCW1lbWNweShjdHJwdHIgKyBpLCBjdHJwdHIgKyBpIC0gREVTX0JMT0NLX1NJWkUsIERFU19CTE9DS19TSVpFKTsKLQkJY3J5cHRvX2luYyhjdHJwdHIgKyBpLCBERVNfQkxPQ0tfU0laRSk7CisJbWVtY3B5KGN0cnB0ciwgaXYsIERFU19CTE9DS19TSVpFKTsKKwlmb3IgKGkgPSAobiAvIERFU19CTE9DS19TSVpFKSAtIDE7IGkgPiAwOyBpLS0pIHsKKwkJbWVtY3B5KGN0cnB0ciArIERFU19CTE9DS19TSVpFLCBjdHJwdHIsIERFU19CTE9DS19TSVpFKTsKKwkJY3J5cHRvX2luYyhjdHJwdHIgKyBERVNfQkxPQ0tfU0laRSwgREVTX0JMT0NLX1NJWkUpOworCQljdHJwdHIgKz0gREVTX0JMT0NLX1NJWkU7CiAJfQogCXJldHVybiBuOwogfQogCi1zdGF0aWMgaW50IGN0cl9kZXNhbGxfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBsb25nIGZ1bmMsCi0JCQkgICAgc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4LAorc3RhdGljIGludCBjdHJfZGVzYWxsX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgdW5zaWduZWQgbG9uZyBmYywKIAkJCSAgICBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCiB7Ci0JaW50IHJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnRfYmxvY2soZGVzYywgd2FsaywgREVTX0JMT0NLX1NJWkUpOworCXN0cnVjdCBzMzkwX2Rlc19jdHggKmN0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CisJdTggYnVmW0RFU19CTE9DS19TSVpFXSwgKmN0cnB0cjsKIAl1bnNpZ25lZCBpbnQgbiwgbmJ5dGVzOwotCXU4IGJ1ZltERVNfQkxPQ0tfU0laRV0sIGN0cmJ1ZltERVNfQkxPQ0tfU0laRV07Ci0JdTggKm91dCwgKmluLCAqY3RycHRyID0gY3RyYnVmOworCWludCByZXQsIGxvY2tlZDsKIAotCWlmICghd2Fsay0+bmJ5dGVzKQotCQlyZXR1cm4gcmV0OworCWxvY2tlZCA9IHNwaW5fdHJ5bG9jaygmY3RyYmxrX2xvY2spOwogCi0JaWYgKHNwaW5fdHJ5bG9jaygmY3RyYmxrX2xvY2spKQotCQljdHJwdHIgPSBjdHJibGs7Ci0KLQltZW1jcHkoY3RycHRyLCB3YWxrLT5pdiwgREVTX0JMT0NLX1NJWkUpOworCXJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnRfYmxvY2soZGVzYywgd2FsaywgREVTX0JMT0NLX1NJWkUpOwogCXdoaWxlICgobmJ5dGVzID0gd2Fsay0+bmJ5dGVzKSA+PSBERVNfQkxPQ0tfU0laRSkgewotCQlvdXQgPSB3YWxrLT5kc3QudmlydC5hZGRyOwotCQlpbiA9IHdhbGstPnNyYy52aXJ0LmFkZHI7Ci0JCXdoaWxlIChuYnl0ZXMgPj0gREVTX0JMT0NLX1NJWkUpIHsKLQkJCWlmIChjdHJwdHIgPT0gY3RyYmxrKQotCQkJCW4gPSBfX2N0cmJsa19pbml0KGN0cnB0ciwgbmJ5dGVzKTsKLQkJCWVsc2UKLQkJCQluID0gREVTX0JMT0NLX1NJWkU7Ci0JCQlyZXQgPSBjcGFjZl9rbWN0cihmdW5jLCBjdHgtPmtleSwgb3V0LCBpbiwgbiwgY3RycHRyKTsKLQkJCWlmIChyZXQgPCAwIHx8IHJldCAhPSBuKSB7Ci0JCQkJaWYgKGN0cnB0ciA9PSBjdHJibGspCi0JCQkJCXNwaW5fdW5sb2NrKCZjdHJibGtfbG9jayk7Ci0JCQkJcmV0dXJuIC1FSU87Ci0JCQl9Ci0JCQlpZiAobiA+IERFU19CTE9DS19TSVpFKQotCQkJCW1lbWNweShjdHJwdHIsIGN0cnB0ciArIG4gLSBERVNfQkxPQ0tfU0laRSwKLQkJCQkgICAgICAgREVTX0JMT0NLX1NJWkUpOwotCQkJY3J5cHRvX2luYyhjdHJwdHIsIERFU19CTE9DS19TSVpFKTsKLQkJCW91dCArPSBuOwotCQkJaW4gKz0gbjsKLQkJCW5ieXRlcyAtPSBuOwotCQl9Ci0JCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzKTsKKwkJbiA9IERFU19CTE9DS19TSVpFOworCQlpZiAobmJ5dGVzID49IDIqREVTX0JMT0NLX1NJWkUgJiYgbG9ja2VkKQorCQkJbiA9IF9fY3RyYmxrX2luaXQoY3RyYmxrLCB3YWxrLT5pdiwgbmJ5dGVzKTsKKwkJY3RycHRyID0gKG4gPiBERVNfQkxPQ0tfU0laRSkgPyBjdHJibGsgOiB3YWxrLT5pdjsKKwkJY3BhY2Zfa21jdHIoZmMsIGN0eC0+a2V5LCB3YWxrLT5kc3QudmlydC5hZGRyLAorCQkJICAgIHdhbGstPnNyYy52aXJ0LmFkZHIsIG4sIGN0cnB0cik7CisJCWlmIChjdHJwdHIgPT0gY3RyYmxrKQorCQkJbWVtY3B5KHdhbGstPml2LCBjdHJwdHIgKyBuIC0gREVTX0JMT0NLX1NJWkUsCisJCQkJREVTX0JMT0NLX1NJWkUpOworCQljcnlwdG9faW5jKHdhbGstPml2LCBERVNfQkxPQ0tfU0laRSk7CisJCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzIC0gbik7CiAJfQotCWlmIChjdHJwdHIgPT0gY3RyYmxrKSB7Ci0JCWlmIChuYnl0ZXMpCi0JCQltZW1jcHkoY3RyYnVmLCBjdHJwdHIsIERFU19CTE9DS19TSVpFKTsKLQkJZWxzZQotCQkJbWVtY3B5KHdhbGstPml2LCBjdHJwdHIsIERFU19CTE9DS19TSVpFKTsKKwlpZiAobG9ja2VkKQogCQlzcGluX3VubG9jaygmY3RyYmxrX2xvY2spOwotCX0gZWxzZSB7Ci0JCWlmICghbmJ5dGVzKQotCQkJbWVtY3B5KHdhbGstPml2LCBjdHJwdHIsIERFU19CTE9DS19TSVpFKTsKLQl9CiAJLyogZmluYWwgYmxvY2sgbWF5IGJlIDwgREVTX0JMT0NLX1NJWkUsIGNvcHkgb25seSBuYnl0ZXMgKi8KIAlpZiAobmJ5dGVzKSB7Ci0JCW91dCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7Ci0JCWluID0gd2Fsay0+c3JjLnZpcnQuYWRkcjsKLQkJcmV0ID0gY3BhY2Zfa21jdHIoZnVuYywgY3R4LT5rZXksIGJ1ZiwgaW4sCi0JCQkJICBERVNfQkxPQ0tfU0laRSwgY3RyYnVmKTsKLQkJaWYgKHJldCA8IDAgfHwgcmV0ICE9IERFU19CTE9DS19TSVpFKQotCQkJcmV0dXJuIC1FSU87Ci0JCW1lbWNweShvdXQsIGJ1ZiwgbmJ5dGVzKTsKLQkJY3J5cHRvX2luYyhjdHJidWYsIERFU19CTE9DS19TSVpFKTsKKwkJY3BhY2Zfa21jdHIoZmMsIGN0eC0+a2V5LCBidWYsIHdhbGstPnNyYy52aXJ0LmFkZHIsCisJCQkgICAgREVTX0JMT0NLX1NJWkUsIHdhbGstPml2KTsKKwkJbWVtY3B5KHdhbGstPmRzdC52aXJ0LmFkZHIsIGJ1ZiwgbmJ5dGVzKTsKKwkJY3J5cHRvX2luYyh3YWxrLT5pdiwgREVTX0JMT0NLX1NJWkUpOwogCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIDApOwotCQltZW1jcHkod2Fsay0+aXYsIGN0cmJ1ZiwgREVTX0JMT0NLX1NJWkUpOwogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtNDUyLDIyICs0MTEsMjAgQEAKIAkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKIAkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0Jc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBjdHJfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNQ1RSX0RFQV9FTkMsIGN0eCwgJndhbGspOworCXJldHVybiBjdHJfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNQ1RSX0RFQSwgJndhbGspOwogfQogCiBzdGF0aWMgaW50IGN0cl9kZXNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCiAJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCiAJCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewotCXN0cnVjdCBzMzkwX2Rlc19jdHggKmN0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CiAJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CiAKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4gY3RyX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNUUl9ERUFfREVDLCBjdHgsICZ3YWxrKTsKKwlyZXR1cm4gY3RyX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNUUl9ERUEgfCBDUEFDRl9ERUNSWVBULCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBjdHJfZGVzX2FsZyA9IHsKQEAgLTQ5NSwyMiArNDUyLDIxIEBACiAJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkJICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0Jc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBjdHJfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNQ1RSX1RERUFfMTkyX0VOQywgY3R4LCAmd2Fsayk7CisJcmV0dXJuIGN0cl9kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01DVFJfVERFQV8xOTIsICZ3YWxrKTsKIH0KIAogc3RhdGljIGludCBjdHJfZGVzM19kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKIAkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCiAJCQkgICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGN0cl9kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01DVFJfVERFQV8xOTJfREVDLCBjdHgsICZ3YWxrKTsKKwlyZXR1cm4gY3RyX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNUUl9UREVBXzE5MiB8IENQQUNGX0RFQ1JZUFQsCisJCQkJJndhbGspOwogfQogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgY3RyX2RlczNfYWxnID0gewpAQCAtNTM0LDgzICs0OTAsODcgQEAKIAl9CiB9OwogCitzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgKmRlc19zMzkwX2FsZ3NfcHRyWzhdOworc3RhdGljIGludCBkZXNfczM5MF9hbGdzX251bTsKKworc3RhdGljIGludCBkZXNfczM5MF9yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZyhhbGcpOworCWlmICghcmV0KQorCQlkZXNfczM5MF9hbGdzX3B0cltkZXNfczM5MF9hbGdzX251bSsrXSA9IGFsZzsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkZXNfczM5MF9leGl0KHZvaWQpCit7CisJd2hpbGUgKGRlc19zMzkwX2FsZ3NfbnVtLS0pCisJCWNyeXB0b191bnJlZ2lzdGVyX2FsZyhkZXNfczM5MF9hbGdzX3B0cltkZXNfczM5MF9hbGdzX251bV0pOworCWlmIChjdHJibGspCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgY3RyYmxrKTsKK30KKwogc3RhdGljIGludCBfX2luaXQgZGVzX3MzOTBfaW5pdCh2b2lkKQogewogCWludCByZXQ7CiAKLQlpZiAoIWNwYWNmX3F1ZXJ5KENQQUNGX0tNLCBDUEFDRl9LTV9ERUFfRU5DKSB8fAotCSAgICAhY3BhY2ZfcXVlcnkoQ1BBQ0ZfS00sIENQQUNGX0tNX1RERUFfMTkyX0VOQykpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKKwkvKiBRdWVyeSBhdmFpbGFibGUgZnVuY3Rpb25zIGZvciBLTSwgS01DIGFuZCBLTUNUUiAqLworCWNwYWNmX3F1ZXJ5KENQQUNGX0tNLCAma21fZnVuY3Rpb25zKTsKKwljcGFjZl9xdWVyeShDUEFDRl9LTUMsICZrbWNfZnVuY3Rpb25zKTsKKwljcGFjZl9xdWVyeShDUEFDRl9LTUNUUiwgJmttY3RyX2Z1bmN0aW9ucyk7CiAKLQlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZkZXNfYWxnKTsKLQlpZiAocmV0KQotCQlnb3RvIGRlc19lcnI7Ci0JcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmZWNiX2Rlc19hbGcpOwotCWlmIChyZXQpCi0JCWdvdG8gZWNiX2Rlc19lcnI7Ci0JcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmY2JjX2Rlc19hbGcpOwotCWlmIChyZXQpCi0JCWdvdG8gY2JjX2Rlc19lcnI7Ci0JcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmZGVzM19hbGcpOwotCWlmIChyZXQpCi0JCWdvdG8gZGVzM19lcnI7Ci0JcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmZWNiX2RlczNfYWxnKTsKLQlpZiAocmV0KQotCQlnb3RvIGVjYl9kZXMzX2VycjsKLQlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZjYmNfZGVzM19hbGcpOwotCWlmIChyZXQpCi0JCWdvdG8gY2JjX2RlczNfZXJyOworCWlmIChjcGFjZl90ZXN0X2Z1bmMoJmttX2Z1bmN0aW9ucywgQ1BBQ0ZfS01fREVBKSkgeworCQlyZXQgPSBkZXNfczM5MF9yZWdpc3Rlcl9hbGcoJmRlc19hbGcpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZXJyOworCQlyZXQgPSBkZXNfczM5MF9yZWdpc3Rlcl9hbGcoJmVjYl9kZXNfYWxnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisJaWYgKGNwYWNmX3Rlc3RfZnVuYygma21jX2Z1bmN0aW9ucywgQ1BBQ0ZfS01DX0RFQSkpIHsKKwkJcmV0ID0gZGVzX3MzOTBfcmVnaXN0ZXJfYWxnKCZjYmNfZGVzX2FsZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9lcnI7CisJfQorCWlmIChjcGFjZl90ZXN0X2Z1bmMoJmttX2Z1bmN0aW9ucywgQ1BBQ0ZfS01fVERFQV8xOTIpKSB7CisJCXJldCA9IGRlc19zMzkwX3JlZ2lzdGVyX2FsZygmZGVzM19hbGcpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZXJyOworCQlyZXQgPSBkZXNfczM5MF9yZWdpc3Rlcl9hbGcoJmVjYl9kZXMzX2FsZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9lcnI7CisJfQorCWlmIChjcGFjZl90ZXN0X2Z1bmMoJmttY19mdW5jdGlvbnMsIENQQUNGX0tNQ19UREVBXzE5MikpIHsKKwkJcmV0ID0gZGVzX3MzOTBfcmVnaXN0ZXJfYWxnKCZjYmNfZGVzM19hbGcpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZXJyOworCX0KIAotCWlmIChjcGFjZl9xdWVyeShDUEFDRl9LTUNUUiwgQ1BBQ0ZfS01DVFJfREVBX0VOQykgJiYKLQkgICAgY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DVFIsIENQQUNGX0tNQ1RSX1RERUFfMTkyX0VOQykpIHsKLQkJcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmY3RyX2Rlc19hbGcpOwotCQlpZiAocmV0KQotCQkJZ290byBjdHJfZGVzX2VycjsKLQkJcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmY3RyX2RlczNfYWxnKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gY3RyX2RlczNfZXJyOworCWlmIChjcGFjZl90ZXN0X2Z1bmMoJmttY3RyX2Z1bmN0aW9ucywgQ1BBQ0ZfS01DVFJfREVBKSB8fAorCSAgICBjcGFjZl90ZXN0X2Z1bmMoJmttY3RyX2Z1bmN0aW9ucywgQ1BBQ0ZfS01DVFJfVERFQV8xOTIpKSB7CiAJCWN0cmJsayA9ICh1OCAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJCWlmICghY3RyYmxrKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBjdHJfbWVtX2VycjsKKwkJCWdvdG8gb3V0X2VycjsKIAkJfQogCX0KLW91dDoKLQlyZXR1cm4gcmV0OwogCi1jdHJfbWVtX2VycjoKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmN0cl9kZXMzX2FsZyk7Ci1jdHJfZGVzM19lcnI6Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjdHJfZGVzX2FsZyk7Ci1jdHJfZGVzX2VycjoKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmNiY19kZXMzX2FsZyk7Ci1jYmNfZGVzM19lcnI6Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZlY2JfZGVzM19hbGcpOwotZWNiX2RlczNfZXJyOgotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmZGVzM19hbGcpOwotZGVzM19lcnI6Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjYmNfZGVzX2FsZyk7Ci1jYmNfZGVzX2VycjoKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmVjYl9kZXNfYWxnKTsKLWVjYl9kZXNfZXJyOgotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmZGVzX2FsZyk7Ci1kZXNfZXJyOgotCWdvdG8gb3V0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZGVzX3MzOTBfZXhpdCh2b2lkKQotewotCWlmIChjdHJibGspIHsKLQkJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjdHJfZGVzX2FsZyk7Ci0JCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmY3RyX2RlczNfYWxnKTsKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBjdHJibGspOworCWlmIChjcGFjZl90ZXN0X2Z1bmMoJmttY3RyX2Z1bmN0aW9ucywgQ1BBQ0ZfS01DVFJfREVBKSkgeworCQlyZXQgPSBkZXNfczM5MF9yZWdpc3Rlcl9hbGcoJmN0cl9kZXNfYWxnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKIAl9Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjYmNfZGVzM19hbGcpOwotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmZWNiX2RlczNfYWxnKTsKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmRlczNfYWxnKTsKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmNiY19kZXNfYWxnKTsKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmVjYl9kZXNfYWxnKTsKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmRlc19hbGcpOworCWlmIChjcGFjZl90ZXN0X2Z1bmMoJmttY3RyX2Z1bmN0aW9ucywgQ1BBQ0ZfS01DVFJfVERFQV8xOTIpKSB7CisJCXJldCA9IGRlc19zMzkwX3JlZ2lzdGVyX2FsZygmY3RyX2RlczNfYWxnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlyZXR1cm4gMDsKK291dF9lcnI6CisJZGVzX3MzOTBfZXhpdCgpOworCXJldHVybiByZXQ7CiB9CiAKIG1vZHVsZV9jcHVfZmVhdHVyZV9tYXRjaChNU0EsIGRlc19zMzkwX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9naGFzaF9zMzkwLmMgYi9hcmNoL3MzOTAvY3J5cHRvL2doYXNoX3MzOTAuYwppbmRleCBhYjY4ZGU3Li41NjQ2MTZkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY3J5cHRvL2doYXNoX3MzOTAuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL2doYXNoX3MzOTAuYwpAQCAtNTgsNyArNTgsNiBAQAogCXN0cnVjdCBnaGFzaF9kZXNjX2N0eCAqZGN0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwogCXVuc2lnbmVkIGludCBuOwogCXU4ICpidWYgPSBkY3R4LT5idWZmZXI7Ci0JaW50IHJldDsKIAogCWlmIChkY3R4LT5ieXRlcykgewogCQl1OCAqcG9zID0gYnVmICsgKEdIQVNIX0JMT0NLX1NJWkUgLSBkY3R4LT5ieXRlcyk7CkBAIC03MSwxOCArNzAsMTQgQEAKIAkJc3JjICs9IG47CiAKIAkJaWYgKCFkY3R4LT5ieXRlcykgewotCQkJcmV0ID0gY3BhY2Zfa2ltZChDUEFDRl9LSU1EX0dIQVNILCBkY3R4LCBidWYsCi0JCQkJCSBHSEFTSF9CTE9DS19TSVpFKTsKLQkJCWlmIChyZXQgIT0gR0hBU0hfQkxPQ0tfU0laRSkKLQkJCQlyZXR1cm4gLUVJTzsKKwkJCWNwYWNmX2tpbWQoQ1BBQ0ZfS0lNRF9HSEFTSCwgZGN0eCwgYnVmLAorCQkJCSAgIEdIQVNIX0JMT0NLX1NJWkUpOwogCQl9CiAJfQogCiAJbiA9IHNyY2xlbiAmIH4oR0hBU0hfQkxPQ0tfU0laRSAtIDEpOwogCWlmIChuKSB7Ci0JCXJldCA9IGNwYWNmX2tpbWQoQ1BBQ0ZfS0lNRF9HSEFTSCwgZGN0eCwgc3JjLCBuKTsKLQkJaWYgKHJldCAhPSBuKQotCQkJcmV0dXJuIC1FSU87CisJCWNwYWNmX2tpbWQoQ1BBQ0ZfS0lNRF9HSEFTSCwgZGN0eCwgc3JjLCBuKTsKIAkJc3JjICs9IG47CiAJCXNyY2xlbiAtPSBuOwogCX0KQEAgLTk4LDE3ICs5MywxMiBAQAogc3RhdGljIGludCBnaGFzaF9mbHVzaChzdHJ1Y3QgZ2hhc2hfZGVzY19jdHggKmRjdHgpCiB7CiAJdTggKmJ1ZiA9IGRjdHgtPmJ1ZmZlcjsKLQlpbnQgcmV0OwogCiAJaWYgKGRjdHgtPmJ5dGVzKSB7CiAJCXU4ICpwb3MgPSBidWYgKyAoR0hBU0hfQkxPQ0tfU0laRSAtIGRjdHgtPmJ5dGVzKTsKIAogCQltZW1zZXQocG9zLCAwLCBkY3R4LT5ieXRlcyk7Ci0KLQkJcmV0ID0gY3BhY2Zfa2ltZChDUEFDRl9LSU1EX0dIQVNILCBkY3R4LCBidWYsIEdIQVNIX0JMT0NLX1NJWkUpOwotCQlpZiAocmV0ICE9IEdIQVNIX0JMT0NLX1NJWkUpCi0JCQlyZXR1cm4gLUVJTzsKLQorCQljcGFjZl9raW1kKENQQUNGX0tJTURfR0hBU0gsIGRjdHgsIGJ1ZiwgR0hBU0hfQkxPQ0tfU0laRSk7CiAJCWRjdHgtPmJ5dGVzID0gMDsKIAl9CiAKQEAgLTE0Niw3ICsxMzYsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBnaGFzaF9tb2RfaW5pdCh2b2lkKQogewotCWlmICghY3BhY2ZfcXVlcnkoQ1BBQ0ZfS0lNRCwgQ1BBQ0ZfS0lNRF9HSEFTSCkpCisJaWYgKCFjcGFjZl9xdWVyeV9mdW5jKENQQUNGX0tJTUQsIENQQUNGX0tJTURfR0hBU0gpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX3NoYXNoKCZnaGFzaF9hbGcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9wcm5nLmMgYi9hcmNoL3MzOTAvY3J5cHRvL3BybmcuYwppbmRleCA0MTUyN2IxLi45Y2MwNTBmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY3J5cHRvL3BybmcuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL3BybmcuYwpAQCAtMTM1LDEyICsxMzUsNyBAQAogCQllbHNlCiAJCQloID0gZWJ1ZjsKIAkJLyogZ2VuZXJhdGUgc2hhMjU2IGZyb20gdGhpcyBwYWdlICovCi0JCWlmIChjcGFjZl9raW1kKENQQUNGX0tJTURfU0hBXzI1NiwgaCwKLQkJCSAgICAgICBwZywgUEFHRV9TSVpFKSAhPSBQQUdFX1NJWkUpIHsKLQkJCXBybmdfZXJyb3JmbGFnID0gUFJOR19HRU5fRU5UUk9QWV9GQUlMRUQ7Ci0JCQlyZXQgPSAtRUlPOwotCQkJZ290byBvdXQ7Ci0JCX0KKwkJY3BhY2Zfa2ltZChDUEFDRl9LSU1EX1NIQV8yNTYsIGgsIHBnLCBQQUdFX1NJWkUpOwogCQlpZiAobiA8IHNpemVvZihoYXNoKSkKIAkJCW1lbWNweShlYnVmLCBoYXNoLCBuKTsKIAkJcmV0ICs9IG47CkBAIC0xNDgsNyArMTQzLDYgQEAKIAkJbmJ5dGVzIC09IG47CiAJfQogCi1vdXQ6CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBnKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTYwLDEzICsxNTQsMTEgQEAKIHsKIAlfX3U2NCBlbnRyb3B5WzRdOwogCXVuc2lnbmVkIGludCBpOwotCWludCByZXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQlyZXQgPSBjcGFjZl9rbWMoQ1BBQ0ZfS01DX1BSTkcsIHBybmdfZGF0YS0+cHJuZ3dzLnBhcm1fYmxvY2ssCi0JCQkJKGNoYXIgKillbnRyb3B5LCAoY2hhciAqKWVudHJvcHksCi0JCQkJc2l6ZW9mKGVudHJvcHkpKTsKLQkJQlVHX09OKHJldCA8IDAgfHwgcmV0ICE9IHNpemVvZihlbnRyb3B5KSk7CisJCWNwYWNmX2ttYyhDUEFDRl9LTUNfUFJORywgcHJuZ19kYXRhLT5wcm5nd3MucGFybV9ibG9jaywKKwkJCSAgKGNoYXIgKikgZW50cm9weSwgKGNoYXIgKikgZW50cm9weSwKKwkJCSAgc2l6ZW9mKGVudHJvcHkpKTsKIAkJbWVtY3B5KHBybmdfZGF0YS0+cHJuZ3dzLnBhcm1fYmxvY2ssIGVudHJvcHksIHNpemVvZihlbnRyb3B5KSk7CiAJfQogfQpAQCAtMzAzLDIxICsyOTUsMTQgQEAKIAkJMHgyMSwgMHhlNCwgMHhiMCwgMHg4NiwgMHg0NCwgMHhmNiwgMHg3MiwgMHg3YywKIAkJMHgzNiwgMHg4YywgMHg1YSwgMHg5ZiwgMHg3YSwgMHg0YiwgMHgzZSwgMHhlMiB9OwogCi0JaW50IHJldCA9IDA7CiAJdTggYnVmW3NpemVvZihyYW5kb20pXTsKIAlzdHJ1Y3QgcHBub193c19zIHdzOwogCiAJbWVtc2V0KCZ3cywgMCwgc2l6ZW9mKHdzKSk7CiAKIAkvKiBpbml0aWFsIHNlZWQgKi8KLQlyZXQgPSBjcGFjZl9wcG5vKENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfU0VFRCwgJndzLCBOVUxMLCAwLAotCQkJIHNlZWQsIHNpemVvZihzZWVkKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJUaGUgcHJuZyBzZWxmIHRlc3Qgc2VlZCBvcGVyYXRpb24gZm9yIHRoZSAiCi0JCSAgICAgICAiU0hBLTUxMiBtb2RlIGZhaWxlZCB3aXRoIHJjPSVkXG4iLCByZXQpOwotCQlwcm5nX2Vycm9yZmxhZyA9IFBSTkdfU0VMRlRFU1RfRkFJTEVEOwotCQlyZXR1cm4gLUVJTzsKLQl9CisJY3BhY2ZfcHBubyhDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX1NFRUQsCisJCSAgICZ3cywgTlVMTCwgMCwgc2VlZCwgc2l6ZW9mKHNlZWQpKTsKIAogCS8qIGNoZWNrIHdvcmtpbmcgc3RhdGVzIFYgYW5kIEMgKi8KIAlpZiAobWVtY21wKHdzLlYsIFYwLCBzaXplb2YoVjApKSAhPSAwCkBAIC0zMjksMjIgKzMxNCwxMCBAQAogCX0KIAogCS8qIGdlbmVyYXRlIHJhbmRvbSBieXRlcyAqLwotCXJldCA9IGNwYWNmX3Bwbm8oQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19HRU4sCi0JCQkgJndzLCBidWYsIHNpemVvZihidWYpLCBOVUxMLCAwKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIlRoZSBwcm5nIHNlbGYgdGVzdCBnZW5lcmF0ZSBvcGVyYXRpb24gZm9yICIKLQkJICAgICAgICJ0aGUgU0hBLTUxMiBtb2RlIGZhaWxlZCB3aXRoIHJjPSVkXG4iLCByZXQpOwotCQlwcm5nX2Vycm9yZmxhZyA9IFBSTkdfU0VMRlRFU1RfRkFJTEVEOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JcmV0ID0gY3BhY2ZfcHBubyhDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX0dFTiwKLQkJCSAmd3MsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIE5VTEwsIDApOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiVGhlIHBybmcgc2VsZiB0ZXN0IGdlbmVyYXRlIG9wZXJhdGlvbiBmb3IgIgotCQkgICAgICAgInRoZSBTSEEtNTEyIG1vZGUgZmFpbGVkIHdpdGggcmM9JWRcbiIsIHJldCk7Ci0JCXBybmdfZXJyb3JmbGFnID0gUFJOR19TRUxGVEVTVF9GQUlMRUQ7Ci0JCXJldHVybiAtRUlPOwotCX0KKwljcGFjZl9wcG5vKENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfR0VOLAorCQkgICAmd3MsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIE5VTEwsIDApOworCWNwYWNmX3Bwbm8oQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19HRU4sCisJCSAgICZ3cywgYnVmLCBzaXplb2YoYnVmKSwgTlVMTCwgMCk7CiAKIAkvKiBjaGVjayBhZ2FpbnN0IGV4cGVjdGVkIGRhdGEgKi8KIAlpZiAobWVtY21wKGJ1ZiwgcmFuZG9tLCBzaXplb2YocmFuZG9tKSkgIT0gMCkgewpAQCAtMzkyLDI2ICszNjUsMTYgQEAKIAlnZXRfdG9kX2Nsb2NrX2V4dChzZWVkICsgNDgpOwogCiAJLyogaW5pdGlhbCBzZWVkIG9mIHRoZSBwcG5vIGRybmcgKi8KLQlyZXQgPSBjcGFjZl9wcG5vKENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfU0VFRCwKLQkJCSAmcHJuZ19kYXRhLT5wcG5vd3MsIE5VTEwsIDAsIHNlZWQsIHNpemVvZihzZWVkKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJuZ19lcnJvcmZsYWcgPSBQUk5HX1NFRURfRkFJTEVEOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIG91dGZyZWU7Ci0JfQorCWNwYWNmX3Bwbm8oQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19TRUVELAorCQkgICAmcHJuZ19kYXRhLT5wcG5vd3MsIE5VTEwsIDAsIHNlZWQsIHNpemVvZihzZWVkKSk7CiAKIAkvKiBpZiBmaXBzIG1vZGUgaXMgZW5hYmxlZCwgZ2VuZXJhdGUgYSBmaXJzdCBibG9jayBvZiByYW5kb20KIAkgICBieXRlcyBmb3IgdGhlIEZJUFMgMTQwLTIgQ29uZGl0aW9uYWwgU2VsZiBUZXN0ICovCiAJaWYgKGZpcHNfZW5hYmxlZCkgewogCQlwcm5nX2RhdGEtPnByZXYgPSBwcm5nX2RhdGEtPmJ1ZiArIHBybmdfY2h1bmtfc2l6ZTsKLQkJcmV0ID0gY3BhY2ZfcHBubyhDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX0dFTiwKLQkJCQkgJnBybmdfZGF0YS0+cHBub3dzLAotCQkJCSBwcm5nX2RhdGEtPnByZXYsIHBybmdfY2h1bmtfc2l6ZSwgTlVMTCwgMCk7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCAhPSBwcm5nX2NodW5rX3NpemUpIHsKLQkJCXBybmdfZXJyb3JmbGFnID0gUFJOR19HRU5fRkFJTEVEOwotCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gb3V0ZnJlZTsKLQkJfQorCQljcGFjZl9wcG5vKENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfR0VOLAorCQkJICAgJnBybmdfZGF0YS0+cHBub3dzLAorCQkJICAgcHJuZ19kYXRhLT5wcmV2LCBwcm5nX2NodW5rX3NpemUsIE5VTEwsIDApOwogCX0KIAogCXJldHVybiAwOwpAQCAtNDQwLDEyICs0MDMsOCBAQAogCQlyZXR1cm4gcmV0OwogCiAJLyogZG8gYSByZXNlZWQgb2YgdGhlIHBwbm8gZHJuZyB3aXRoIHRoaXMgYnl0ZXN0cmluZyAqLwotCXJldCA9IGNwYWNmX3Bwbm8oQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19TRUVELAotCQkJICZwcm5nX2RhdGEtPnBwbm93cywgTlVMTCwgMCwgc2VlZCwgc2l6ZW9mKHNlZWQpKTsKLQlpZiAocmV0KSB7Ci0JCXBybmdfZXJyb3JmbGFnID0gUFJOR19SRVNFRURfRkFJTEVEOwotCQlyZXR1cm4gLUVJTzsKLQl9CisJY3BhY2ZfcHBubyhDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX1NFRUQsCisJCSAgICZwcm5nX2RhdGEtPnBwbm93cywgTlVMTCwgMCwgc2VlZCwgc2l6ZW9mKHNlZWQpKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDYzLDEyICs0MjIsOCBAQAogCX0KIAogCS8qIFBQTk8gZ2VuZXJhdGUgKi8KLQlyZXQgPSBjcGFjZl9wcG5vKENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfR0VOLAotCQkJICZwcm5nX2RhdGEtPnBwbm93cywgYnVmLCBuYnl0ZXMsIE5VTEwsIDApOwotCWlmIChyZXQgPCAwIHx8IHJldCAhPSBuYnl0ZXMpIHsKLQkJcHJuZ19lcnJvcmZsYWcgPSBQUk5HX0dFTl9GQUlMRUQ7Ci0JCXJldHVybiAtRUlPOwotCX0KKwljcGFjZl9wcG5vKENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfR0VOLAorCQkgICAmcHJuZ19kYXRhLT5wcG5vd3MsIGJ1ZiwgbmJ5dGVzLCBOVUxMLCAwKTsKIAogCS8qIEZJUFMgMTQwLTIgQ29uZGl0aW9uYWwgU2VsZiBUZXN0ICovCiAJaWYgKGZpcHNfZW5hYmxlZCkgewpAQCAtNDc5LDcgKzQzNCw3IEBACiAJCW1lbWNweShwcm5nX2RhdGEtPnByZXYsIGJ1ZiwgbmJ5dGVzKTsKIAl9CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBuYnl0ZXM7CiB9CiAKIApAQCAtNDk0LDcgKzQ0OSw3IEBACiBzdGF0aWMgc3NpemVfdCBwcm5nX3RkZXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVidWYsCiAJCQkgICAgICBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JaW50IGNodW5rLCBuLCB0bXAsIHJldCA9IDA7CisJaW50IGNodW5rLCBuLCByZXQgPSAwOwogCiAJLyogbG9jayBwcm5nX2RhdGEgc3RydWN0ICovCiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcHJuZ19kYXRhLT5tdXRleCkpCkBAIC01NDUsMTMgKzUwMCw5IEBACiAJCSAqCiAJCSAqIE5vdGU6IHlvdSBjYW4gc3RpbGwgZ2V0IHN0cmljdCBYOS4xNyBjb25mb3JtaXR5IGJ5IHNldHRpbmcKIAkJICogcHJuZ19jaHVua19zaXplIHRvIDggYnl0ZXMuCi0JCSovCi0JCXRtcCA9IGNwYWNmX2ttYyhDUEFDRl9LTUNfUFJORywgcHJuZ19kYXRhLT5wcm5nd3MucGFybV9ibG9jaywKLQkJCQlwcm5nX2RhdGEtPmJ1ZiwgcHJuZ19kYXRhLT5idWYsIG4pOwotCQlpZiAodG1wIDwgMCB8fCB0bXAgIT0gbikgewotCQkJcmV0ID0gLUVJTzsKLQkJCWJyZWFrOwotCQl9CisJCSAqLworCQljcGFjZl9rbWMoQ1BBQ0ZfS01DX1BSTkcsIHBybmdfZGF0YS0+cHJuZ3dzLnBhcm1fYmxvY2ssCisJCQkgIHBybmdfZGF0YS0+YnVmLCBwcm5nX2RhdGEtPmJ1Ziwgbik7CiAKIAkJcHJuZ19kYXRhLT5wcm5nd3MuYnl0ZV9jb3VudGVyICs9IG47CiAJCXBybmdfZGF0YS0+cHJuZ3dzLnJlc2VlZF9jb3VudGVyICs9IG47CkBAIC04MDYsMTMgKzc1NywxMyBAQAogCWludCByZXQ7CiAKIAkvKiBjaGVjayBpZiB0aGUgQ1BVIGhhcyBhIFBSTkcgKi8KLQlpZiAoIWNwYWNmX3F1ZXJ5KENQQUNGX0tNQywgQ1BBQ0ZfS01DX1BSTkcpKQorCWlmICghY3BhY2ZfcXVlcnlfZnVuYyhDUEFDRl9LTUMsIENQQUNGX0tNQ19QUk5HKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJLyogY2hvb3NlIHBybmcgbW9kZSAqLwogCWlmIChwcm5nX21vZGUgIT0gUFJOR19NT0RFX1RERVMpIHsKIAkJLyogY2hlY2sgZm9yIE1TQTUgc3VwcG9ydCBmb3IgUFBOTyBvcGVyYXRpb25zICovCi0JCWlmICghY3BhY2ZfcXVlcnkoQ1BBQ0ZfUFBOTywgQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19HRU4pKSB7CisJCWlmICghY3BhY2ZfcXVlcnlfZnVuYyhDUEFDRl9QUE5PLCBDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX0dFTikpIHsKIAkJCWlmIChwcm5nX21vZGUgPT0gUFJOR19NT0RFX1NIQTUxMikgewogCQkJCXByX2VycigiVGhlIHBybmcgbW9kdWxlIGNhbm5vdCAiCiAJCQkJICAgICAgICJzdGFydCBpbiBTSEEtNTEyIG1vZGVcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9zaGExX3MzOTAuYyBiL2FyY2gvczM5MC9jcnlwdG8vc2hhMV9zMzkwLmMKaW5kZXggNWZiZjkxYi4uYzdkZTUzZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NyeXB0by9zaGExX3MzOTAuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL3NoYTFfczM5MC5jCkBAIC05MSw3ICs5MSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNoYTFfczM5MF9pbml0KHZvaWQpCiB7Ci0JaWYgKCFjcGFjZl9xdWVyeShDUEFDRl9LSU1ELCBDUEFDRl9LSU1EX1NIQV8xKSkKKwlpZiAoIWNwYWNmX3F1ZXJ5X2Z1bmMoQ1BBQ0ZfS0lNRCwgQ1BBQ0ZfS0lNRF9TSEFfMSkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX3NoYXNoKCZhbGcpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9zaGEyNTZfczM5MC5jIGIvYXJjaC9zMzkwL2NyeXB0by9zaGEyNTZfczM5MC5jCmluZGV4IDEwYWFjMGIuLjUzYzI3NzkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vc2hhMjU2X3MzOTAuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL3NoYTI1Nl9zMzkwLmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogewogCWludCByZXQ7CiAKLQlpZiAoIWNwYWNmX3F1ZXJ5KENQQUNGX0tJTUQsIENQQUNGX0tJTURfU0hBXzI1NikpCisJaWYgKCFjcGFjZl9xdWVyeV9mdW5jKENQQUNGX0tJTUQsIENQQUNGX0tJTURfU0hBXzI1NikpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfc2hhc2goJnNoYTI1Nl9hbGcpOwogCWlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9zaGE1MTJfczM5MC5jIGIvYXJjaC9zMzkwL2NyeXB0by9zaGE1MTJfczM5MC5jCmluZGV4IGVhODU3NTcuLjJmNGNhYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vc2hhNTEyX3MzOTAuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL3NoYTUxMl9zMzkwLmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogewogCWludCByZXQ7CiAKLQlpZiAoIWNwYWNmX3F1ZXJ5KENQQUNGX0tJTUQsIENQQUNGX0tJTURfU0hBXzUxMikpCisJaWYgKCFjcGFjZl9xdWVyeV9mdW5jKENQQUNGX0tJTUQsIENQQUNGX0tJTURfU0hBXzUxMikpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAlpZiAoKHJldCA9IGNyeXB0b19yZWdpc3Rlcl9zaGFzaCgmc2hhNTEyX2FsZykpIDwgMCkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY3J5cHRvL3NoYV9jb21tb24uYyBiL2FyY2gvczM5MC9jcnlwdG8vc2hhX2NvbW1vbi5jCmluZGV4IDhlOTA4MTYuLmM3NDBmNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vc2hhX2NvbW1vbi5jCisrKyBiL2FyY2gvczM5MC9jcnlwdG8vc2hhX2NvbW1vbi5jCkBAIC0yMiw4ICsyMiw3IEBACiB7CiAJc3RydWN0IHMzOTBfc2hhX2N0eCAqY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CiAJdW5zaWduZWQgaW50IGJzaXplID0gY3J5cHRvX3NoYXNoX2Jsb2Nrc2l6ZShkZXNjLT50Zm0pOwotCXVuc2lnbmVkIGludCBpbmRleDsKLQlpbnQgcmV0OworCXVuc2lnbmVkIGludCBpbmRleCwgbjsKIAogCS8qIGhvdyBtdWNoIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcj8gKi8KIAlpbmRleCA9IGN0eC0+Y291bnQgJiAoYnNpemUgLSAxKTsKQEAgLTM1LDkgKzM0LDcgQEAKIAkvKiBwcm9jZXNzIG9uZSBzdG9yZWQgYmxvY2sgKi8KIAlpZiAoaW5kZXgpIHsKIAkJbWVtY3B5KGN0eC0+YnVmICsgaW5kZXgsIGRhdGEsIGJzaXplIC0gaW5kZXgpOwotCQlyZXQgPSBjcGFjZl9raW1kKGN0eC0+ZnVuYywgY3R4LT5zdGF0ZSwgY3R4LT5idWYsIGJzaXplKTsKLQkJaWYgKHJldCAhPSBic2l6ZSkKLQkJCXJldHVybiAtRUlPOworCQljcGFjZl9raW1kKGN0eC0+ZnVuYywgY3R4LT5zdGF0ZSwgY3R4LT5idWYsIGJzaXplKTsKIAkJZGF0YSArPSBic2l6ZSAtIGluZGV4OwogCQlsZW4gLT0gYnNpemUgLSBpbmRleDsKIAkJaW5kZXggPSAwOwpAQCAtNDUsMTIgKzQyLDEwIEBACiAKIAkvKiBwcm9jZXNzIGFzIG1hbnkgYmxvY2tzIGFzIHBvc3NpYmxlICovCiAJaWYgKGxlbiA+PSBic2l6ZSkgewotCQlyZXQgPSBjcGFjZl9raW1kKGN0eC0+ZnVuYywgY3R4LT5zdGF0ZSwgZGF0YSwKLQkJCQkgbGVuICYgfihic2l6ZSAtIDEpKTsKLQkJaWYgKHJldCAhPSAobGVuICYgfihic2l6ZSAtIDEpKSkKLQkJCXJldHVybiAtRUlPOwotCQlkYXRhICs9IHJldDsKLQkJbGVuIC09IHJldDsKKwkJbiA9IGxlbiAmIH4oYnNpemUgLSAxKTsKKwkJY3BhY2Zfa2ltZChjdHgtPmZ1bmMsIGN0eC0+c3RhdGUsIGRhdGEsIG4pOworCQlkYXRhICs9IG47CisJCWxlbiAtPSBuOwogCX0KIHN0b3JlOgogCWlmIChsZW4pCkBAIC02Niw3ICs2MSw2IEBACiAJdW5zaWduZWQgaW50IGJzaXplID0gY3J5cHRvX3NoYXNoX2Jsb2Nrc2l6ZShkZXNjLT50Zm0pOwogCXU2NCBiaXRzOwogCXVuc2lnbmVkIGludCBpbmRleCwgZW5kLCBwbGVuOwotCWludCByZXQ7CiAKIAkvKiBTSEEtNTEyIHVzZXMgMTI4IGJpdCBwYWRkaW5nIGxlbmd0aCAqLwogCXBsZW4gPSAoYnNpemUgPiBTSEEyNTZfQkxPQ0tfU0laRSkgPyAxNiA6IDg7CkBAIC04OCwxMCArODIsNyBAQAogCSAqLwogCWJpdHMgPSBjdHgtPmNvdW50ICogODsKIAltZW1jcHkoY3R4LT5idWYgKyBlbmQgLSA4LCAmYml0cywgc2l6ZW9mKGJpdHMpKTsKLQotCXJldCA9IGNwYWNmX2tpbWQoY3R4LT5mdW5jLCBjdHgtPnN0YXRlLCBjdHgtPmJ1ZiwgZW5kKTsKLQlpZiAocmV0ICE9IGVuZCkKLQkJcmV0dXJuIC1FSU87CisJY3BhY2Zfa2ltZChjdHgtPmZ1bmMsIGN0eC0+c3RhdGUsIGN0eC0+YnVmLCBlbmQpOwogCiAJLyogY29weSBkaWdlc3QgdG8gb3V0ICovCiAJbWVtY3B5KG91dCwgY3R4LT5zdGF0ZSwgY3J5cHRvX3NoYXNoX2RpZ2VzdHNpemUoZGVzYy0+dGZtKSk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvZGVmY29uZmlnIGIvYXJjaC9zMzkwL2RlZmNvbmZpZwppbmRleCBjY2NjZWJlLi4yZDQwZWYwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvZGVmY29uZmlnCisrKyBiL2FyY2gvczM5MC9kZWZjb25maWcKQEAgLTE3Miw3ICsxNzIsNiBAQAogQ09ORklHX1JDVV9DUFVfU1RBTExfVElNRU9VVD02MAogQ09ORklHX1JDVV9UUkFDRT15CiBDT05GSUdfTEFURU5DWVRPUD15Ci1DT05GSUdfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1M9eQogQ09ORklHX1NDSEVEX1RSQUNFUj15CiBDT05GSUdfRlRSQUNFX1NZU0NBTExTPXkKIENPTkZJR19UUkFDRVJfU05BUFNIT1RfUEVSX0NQVV9TV0FQPXkKQEAgLTIzNCw3ICsyMzMsNyBAQAogQ09ORklHX0NSWVBUT19TSEE1MTJfUzM5MD1tCiBDT05GSUdfQ1JZUFRPX0RFU19TMzkwPW0KIENPTkZJR19DUllQVE9fQUVTX1MzOTA9bQotQ09ORklHX0NSWVBUT19DUkMzMl9TMzkwPW0KK0NPTkZJR19DUllQVE9fQ1JDMzJfUzM5MD15CiBDT05GSUdfQ1JDNz1tCiAjIENPTkZJR19YWl9ERUNfWDg2IGlzIG5vdCBzZXQKICMgQ09ORklHX1haX0RFQ19QT1dFUlBDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jcGFjZi5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NwYWNmLmgKaW5kZXggZDI4NjIxZC4uMmM2ODBkYiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NwYWNmLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NwYWNmLmgKQEAgLTI4LDY3ICsyOCw1MSBAQAogI2RlZmluZSBDUEFDRl9QUE5PCQkweGI5M2MJCS8qIE1TQTUgKi8KIAogLyoKLSAqIEZ1bmN0aW9uIGNvZGVzIGZvciB0aGUgS00gKENJUEhFUiBNRVNTQUdFKQotICogaW5zdHJ1Y3Rpb24gKDB4ODAgaXMgdGhlIGRlY2lwaGVyIG1vZGlmaWVyIGJpdCkKKyAqIERlY3J5cHRpb24gbW9kaWZpZXIgYml0CisgKi8KKyNkZWZpbmUgQ1BBQ0ZfREVDUllQVAkJMHg4MAorCisvKgorICogRnVuY3Rpb24gY29kZXMgZm9yIHRoZSBLTSAoQ0lQSEVSIE1FU1NBR0UpIGluc3RydWN0aW9uCiAgKi8KICNkZWZpbmUgQ1BBQ0ZfS01fUVVFUlkJCTB4MDAKLSNkZWZpbmUgQ1BBQ0ZfS01fREVBX0VOQwkweDAxCi0jZGVmaW5lIENQQUNGX0tNX0RFQV9ERUMJMHg4MQotI2RlZmluZSBDUEFDRl9LTV9UREVBXzEyOF9FTkMJMHgwMgotI2RlZmluZSBDUEFDRl9LTV9UREVBXzEyOF9ERUMJMHg4MgotI2RlZmluZSBDUEFDRl9LTV9UREVBXzE5Ml9FTkMJMHgwMwotI2RlZmluZSBDUEFDRl9LTV9UREVBXzE5Ml9ERUMJMHg4MwotI2RlZmluZSBDUEFDRl9LTV9BRVNfMTI4X0VOQwkweDEyCi0jZGVmaW5lIENQQUNGX0tNX0FFU18xMjhfREVDCTB4OTIKLSNkZWZpbmUgQ1BBQ0ZfS01fQUVTXzE5Ml9FTkMJMHgxMwotI2RlZmluZSBDUEFDRl9LTV9BRVNfMTkyX0RFQwkweDkzCi0jZGVmaW5lIENQQUNGX0tNX0FFU18yNTZfRU5DCTB4MTQKLSNkZWZpbmUgQ1BBQ0ZfS01fQUVTXzI1Nl9ERUMJMHg5NAotI2RlZmluZSBDUEFDRl9LTV9YVFNfMTI4X0VOQwkweDMyCi0jZGVmaW5lIENQQUNGX0tNX1hUU18xMjhfREVDCTB4YjIKLSNkZWZpbmUgQ1BBQ0ZfS01fWFRTXzI1Nl9FTkMJMHgzNAotI2RlZmluZSBDUEFDRl9LTV9YVFNfMjU2X0RFQwkweGI0CisjZGVmaW5lIENQQUNGX0tNX0RFQQkJMHgwMQorI2RlZmluZSBDUEFDRl9LTV9UREVBXzEyOAkweDAyCisjZGVmaW5lIENQQUNGX0tNX1RERUFfMTkyCTB4MDMKKyNkZWZpbmUgQ1BBQ0ZfS01fQUVTXzEyOAkweDEyCisjZGVmaW5lIENQQUNGX0tNX0FFU18xOTIJMHgxMworI2RlZmluZSBDUEFDRl9LTV9BRVNfMjU2CTB4MTQKKyNkZWZpbmUgQ1BBQ0ZfS01fWFRTXzEyOAkweDMyCisjZGVmaW5lIENQQUNGX0tNX1hUU18yNTYJMHgzNAogCiAvKgogICogRnVuY3Rpb24gY29kZXMgZm9yIHRoZSBLTUMgKENJUEhFUiBNRVNTQUdFIFdJVEggQ0hBSU5JTkcpCi0gKiBpbnN0cnVjdGlvbiAoMHg4MCBpcyB0aGUgZGVjaXBoZXIgbW9kaWZpZXIgYml0KQorICogaW5zdHJ1Y3Rpb24KICAqLwogI2RlZmluZSBDUEFDRl9LTUNfUVVFUlkJCTB4MDAKLSNkZWZpbmUgQ1BBQ0ZfS01DX0RFQV9FTkMJMHgwMQotI2RlZmluZSBDUEFDRl9LTUNfREVBX0RFQwkweDgxCi0jZGVmaW5lIENQQUNGX0tNQ19UREVBXzEyOF9FTkMJMHgwMgotI2RlZmluZSBDUEFDRl9LTUNfVERFQV8xMjhfREVDCTB4ODIKLSNkZWZpbmUgQ1BBQ0ZfS01DX1RERUFfMTkyX0VOQwkweDAzCi0jZGVmaW5lIENQQUNGX0tNQ19UREVBXzE5Ml9ERUMJMHg4MwotI2RlZmluZSBDUEFDRl9LTUNfQUVTXzEyOF9FTkMJMHgxMgotI2RlZmluZSBDUEFDRl9LTUNfQUVTXzEyOF9ERUMJMHg5MgotI2RlZmluZSBDUEFDRl9LTUNfQUVTXzE5Ml9FTkMJMHgxMwotI2RlZmluZSBDUEFDRl9LTUNfQUVTXzE5Ml9ERUMJMHg5MwotI2RlZmluZSBDUEFDRl9LTUNfQUVTXzI1Nl9FTkMJMHgxNAotI2RlZmluZSBDUEFDRl9LTUNfQUVTXzI1Nl9ERUMJMHg5NAorI2RlZmluZSBDUEFDRl9LTUNfREVBCQkweDAxCisjZGVmaW5lIENQQUNGX0tNQ19UREVBXzEyOAkweDAyCisjZGVmaW5lIENQQUNGX0tNQ19UREVBXzE5MgkweDAzCisjZGVmaW5lIENQQUNGX0tNQ19BRVNfMTI4CTB4MTIKKyNkZWZpbmUgQ1BBQ0ZfS01DX0FFU18xOTIJMHgxMworI2RlZmluZSBDUEFDRl9LTUNfQUVTXzI1NgkweDE0CiAjZGVmaW5lIENQQUNGX0tNQ19QUk5HCQkweDQzCiAKIC8qCiAgKiBGdW5jdGlvbiBjb2RlcyBmb3IgdGhlIEtNQ1RSIChDSVBIRVIgTUVTU0FHRSBXSVRIIENPVU5URVIpCi0gKiBpbnN0cnVjdGlvbiAoMHg4MCBpcyB0aGUgZGVjaXBoZXIgbW9kaWZpZXIgYml0KQorICogaW5zdHJ1Y3Rpb24KICAqLwotI2RlZmluZSBDUEFDRl9LTUNUUl9RVUVSWQkgMHgwMAotI2RlZmluZSBDUEFDRl9LTUNUUl9ERUFfRU5DCSAweDAxCi0jZGVmaW5lIENQQUNGX0tNQ1RSX0RFQV9ERUMJIDB4ODEKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfVERFQV8xMjhfRU5DIDB4MDIKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfVERFQV8xMjhfREVDIDB4ODIKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfVERFQV8xOTJfRU5DIDB4MDMKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfVERFQV8xOTJfREVDIDB4ODMKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfQUVTXzEyOF9FTkMJIDB4MTIKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfQUVTXzEyOF9ERUMJIDB4OTIKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfQUVTXzE5Ml9FTkMJIDB4MTMKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfQUVTXzE5Ml9ERUMJIDB4OTMKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfQUVTXzI1Nl9FTkMJIDB4MTQKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfQUVTXzI1Nl9ERUMJIDB4OTQKKyNkZWZpbmUgQ1BBQ0ZfS01DVFJfUVVFUlkJMHgwMAorI2RlZmluZSBDUEFDRl9LTUNUUl9ERUEJCTB4MDEKKyNkZWZpbmUgQ1BBQ0ZfS01DVFJfVERFQV8xMjgJMHgwMgorI2RlZmluZSBDUEFDRl9LTUNUUl9UREVBXzE5MgkweDAzCisjZGVmaW5lIENQQUNGX0tNQ1RSX0FFU18xMjgJMHgxMgorI2RlZmluZSBDUEFDRl9LTUNUUl9BRVNfMTkyCTB4MTMKKyNkZWZpbmUgQ1BBQ0ZfS01DVFJfQUVTXzI1NgkweDE0CiAKIC8qCiAgKiBGdW5jdGlvbiBjb2RlcyBmb3IgdGhlIEtJTUQgKENPTVBVVEUgSU5URVJNRURJQVRFIE1FU1NBR0UgRElHRVNUKQotICogaW5zdHJ1Y3Rpb24gKDB4ODAgaXMgdGhlIGRlY2lwaGVyIG1vZGlmaWVyIGJpdCkKKyAqIGluc3RydWN0aW9uCiAgKi8KICNkZWZpbmUgQ1BBQ0ZfS0lNRF9RVUVSWQkweDAwCiAjZGVmaW5lIENQQUNGX0tJTURfU0hBXzEJMHgwMQpAQCAtOTgsNyArODIsNyBAQAogCiAvKgogICogRnVuY3Rpb24gY29kZXMgZm9yIHRoZSBLTE1EIChDT01QVVRFIExBU1QgTUVTU0FHRSBESUdFU1QpCi0gKiBpbnN0cnVjdGlvbiAoMHg4MCBpcyB0aGUgZGVjaXBoZXIgbW9kaWZpZXIgYml0KQorICogaW5zdHJ1Y3Rpb24KICAqLwogI2RlZmluZSBDUEFDRl9LTE1EX1FVRVJZCTB4MDAKICNkZWZpbmUgQ1BBQ0ZfS0xNRF9TSEFfMQkweDAxCkBAIC0xMDcsNyArOTEsNyBAQAogCiAvKgogICogZnVuY3Rpb24gY29kZXMgZm9yIHRoZSBLTUFDIChDT01QVVRFIE1FU1NBR0UgQVVUSEVOVElDQVRJT04gQ09ERSkKLSAqIGluc3RydWN0aW9uICgweDgwIGlzIHRoZSBkZWNpcGhlciBtb2RpZmllciBiaXQpCisgKiBpbnN0cnVjdGlvbgogICovCiAjZGVmaW5lIENQQUNGX0tNQUNfUVVFUlkJMHgwMAogI2RlZmluZSBDUEFDRl9LTUFDX0RFQQkJMHgwMQpAQCAtMTE2LDEyICsxMDAsMTQgQEAKIAogLyoKICAqIEZ1bmN0aW9uIGNvZGVzIGZvciB0aGUgUFBOTyAoUEVSRk9STSBQU0VVRE9SQU5ET00gTlVNQkVSIE9QRVJBVElPTikKLSAqIGluc3RydWN0aW9uICgweDgwIGlzIHRoZSBkZWNpcGhlciBtb2RpZmllciBiaXQpCisgKiBpbnN0cnVjdGlvbgogICovCiAjZGVmaW5lIENQQUNGX1BQTk9fUVVFUlkJCTB4MDAKICNkZWZpbmUgQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19HRU4JMHgwMwogI2RlZmluZSBDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX1NFRUQJMHg4MwogCit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGNoYXIgYnl0ZXNbMTZdOyB9IGNwYWNmX21hc2tfdDsKKwogLyoqCiAgKiBjcGFjZl9xdWVyeSgpIC0gY2hlY2sgaWYgYSBzcGVjaWZpYyBDUEFDRiBmdW5jdGlvbiBpcyBhdmFpbGFibGUKICAqIEBvcGNvZGU6IHRoZSBvcGNvZGUgb2YgdGhlIGNyeXB0byBpbnN0cnVjdGlvbgpAQCAtMTMyLDU1ICsxMTgsNjYgQEAKICAqCiAgKiBSZXR1cm5zIDEgaWYgQGZ1bmMgaXMgYXZhaWxhYmxlIGZvciBAb3Bjb2RlLCAwIG90aGVyd2lzZQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jcGFjZl9xdWVyeSh1bnNpZ25lZCBpbnQgb3Bjb2RlLCB1bnNpZ25lZCBjaGFyICpzdGF0dXMpCitzdGF0aWMgaW5saW5lIHZvaWQgX19jcGFjZl9xdWVyeSh1bnNpZ25lZCBpbnQgb3Bjb2RlLCBjcGFjZl9tYXNrX3QgKm1hc2spCiB7Ci0JdHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBjaGFyIF9bMTZdOyB9IHN0YXR1c190eXBlOwogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjAgYXNtKCIwIikgPSAwOwkvKiBxdWVyeSBmdW5jdGlvbiAqLwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjEgYXNtKCIxIikgPSAodW5zaWduZWQgbG9uZykgc3RhdHVzOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjEgYXNtKCIxIikgPSAodW5zaWduZWQgbG9uZykgbWFzazsKIAogCWFzbSB2b2xhdGlsZSgKIAkJIglzcG0gMFxuIiAvKiBwY2ttbyBkb2Vzbid0IGNoYW5nZSB0aGUgY2MgKi8KIAkJLyogUGFyYW1ldGVyIHJlZ2lzdGVycyBhcmUgaWdub3JlZCwgYnV0IG1heSBub3QgYmUgMCAqLwogCQkiMDoJLmluc24JcnJmLCVbb3BjXSA8PCAxNiwyLDIsMiwwXG4iCiAJCSIJYnJjCTEsMGJcbiIJLyogaGFuZGxlIHBhcnRpYWwgY29tcGxldGlvbiAqLwotCQk6ICI9bSIgKCooc3RhdHVzX3R5cGUgKikgc3RhdHVzKQorCQk6ICI9bSIgKCptYXNrKQogCQk6IFtmY10gImQiIChyMCksIFtwYmFdICJhIiAocjEpLCBbb3BjXSAiaSIgKG9wY29kZSkKIAkJOiAiY2MiKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY3BhY2ZfcXVlcnkodW5zaWduZWQgaW50IG9wY29kZSwgdW5zaWduZWQgaW50IGZ1bmMpCitzdGF0aWMgaW5saW5lIGludCBfX2NwYWNmX2NoZWNrX29wY29kZSh1bnNpZ25lZCBpbnQgb3Bjb2RlKQogewotCXVuc2lnbmVkIGNoYXIgc3RhdHVzWzE2XTsKLQogCXN3aXRjaCAob3Bjb2RlKSB7CiAJY2FzZSBDUEFDRl9LTUFDOgogCWNhc2UgQ1BBQ0ZfS006CiAJY2FzZSBDUEFDRl9LTUM6CiAJY2FzZSBDUEFDRl9LSU1EOgogCWNhc2UgQ1BBQ0ZfS0xNRDoKLQkJaWYgKCF0ZXN0X2ZhY2lsaXR5KDE3KSkJLyogY2hlY2sgZm9yIE1TQSAqLwotCQkJcmV0dXJuIDA7Ci0JCWJyZWFrOworCQlyZXR1cm4gdGVzdF9mYWNpbGl0eSgxNyk7CS8qIGNoZWNrIGZvciBNU0EgKi8KIAljYXNlIENQQUNGX1BDS01POgotCQlpZiAoIXRlc3RfZmFjaWxpdHkoNzYpKQkvKiBjaGVjayBmb3IgTVNBMyAqLwotCQkJcmV0dXJuIDA7Ci0JCWJyZWFrOworCQlyZXR1cm4gdGVzdF9mYWNpbGl0eSg3Nik7CS8qIGNoZWNrIGZvciBNU0EzICovCiAJY2FzZSBDUEFDRl9LTUY6CiAJY2FzZSBDUEFDRl9LTU86CiAJY2FzZSBDUEFDRl9QQ0M6CiAJY2FzZSBDUEFDRl9LTUNUUjoKLQkJaWYgKCF0ZXN0X2ZhY2lsaXR5KDc3KSkJLyogY2hlY2sgZm9yIE1TQTQgKi8KLQkJCXJldHVybiAwOwotCQlicmVhazsKKwkJcmV0dXJuIHRlc3RfZmFjaWxpdHkoNzcpOwkvKiBjaGVjayBmb3IgTVNBNCAqLwogCWNhc2UgQ1BBQ0ZfUFBOTzoKLQkJaWYgKCF0ZXN0X2ZhY2lsaXR5KDU3KSkJLyogY2hlY2sgZm9yIE1TQTUgKi8KLQkJCXJldHVybiAwOwotCQlicmVhazsKKwkJcmV0dXJuIHRlc3RfZmFjaWxpdHkoNTcpOwkvKiBjaGVjayBmb3IgTVNBNSAqLwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KLQlfX2NwYWNmX3F1ZXJ5KG9wY29kZSwgc3RhdHVzKTsKLQlyZXR1cm4gKHN0YXR1c1tmdW5jID4+IDNdICYgKDB4ODAgPj4gKGZ1bmMgJiA3KSkpICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNwYWNmX3F1ZXJ5KHVuc2lnbmVkIGludCBvcGNvZGUsIGNwYWNmX21hc2tfdCAqbWFzaykKK3sKKwlpZiAoX19jcGFjZl9jaGVja19vcGNvZGUob3Bjb2RlKSkgeworCQlfX2NwYWNmX3F1ZXJ5KG9wY29kZSwgbWFzayk7CisJCXJldHVybiAxOworCX0KKwltZW1zZXQobWFzaywgMCwgc2l6ZW9mKCptYXNrKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNwYWNmX3Rlc3RfZnVuYyhjcGFjZl9tYXNrX3QgKm1hc2ssIHVuc2lnbmVkIGludCBmdW5jKQoreworCXJldHVybiAobWFzay0+Ynl0ZXNbZnVuYyA+PiAzXSAmICgweDgwID4+IChmdW5jICYgNykpKSAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcGFjZl9xdWVyeV9mdW5jKHVuc2lnbmVkIGludCBvcGNvZGUsIHVuc2lnbmVkIGludCBmdW5jKQoreworCWNwYWNmX21hc2tfdCBtYXNrOworCisJaWYgKGNwYWNmX3F1ZXJ5KG9wY29kZSwgJm1hc2spKQorCQlyZXR1cm4gY3BhY2ZfdGVzdF9mdW5jKCZtYXNrLCBmdW5jKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xOTQsNyArMTkxLDcgQEAKICAqIFJldHVybnMgMCBmb3IgdGhlIHF1ZXJ5IGZ1bmMsIG51bWJlciBvZiBwcm9jZXNzZWQgYnl0ZXMgZm9yCiAgKiBlbmNyeXB0aW9uL2RlY3J5cHRpb24gZnVuY3MKICAqLwotc3RhdGljIGlubGluZSBpbnQgY3BhY2Zfa20obG9uZyBmdW5jLCB2b2lkICpwYXJhbSwKK3N0YXRpYyBpbmxpbmUgaW50IGNwYWNmX2ttKHVuc2lnbmVkIGxvbmcgZnVuYywgdm9pZCAqcGFyYW0sCiAJCQkgICB1OCAqZGVzdCwgY29uc3QgdTggKnNyYywgbG9uZyBzcmNfbGVuKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjAgYXNtKCIwIikgPSAodW5zaWduZWQgbG9uZykgZnVuYzsKQEAgLTIyNCw3ICsyMjEsNyBAQAogICogUmV0dXJucyAwIGZvciB0aGUgcXVlcnkgZnVuYywgbnVtYmVyIG9mIHByb2Nlc3NlZCBieXRlcyBmb3IKICAqIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBmdW5jcwogICovCi1zdGF0aWMgaW5saW5lIGludCBjcGFjZl9rbWMobG9uZyBmdW5jLCB2b2lkICpwYXJhbSwKK3N0YXRpYyBpbmxpbmUgaW50IGNwYWNmX2ttYyh1bnNpZ25lZCBsb25nIGZ1bmMsIHZvaWQgKnBhcmFtLAogCQkJICAgIHU4ICpkZXN0LCBjb25zdCB1OCAqc3JjLCBsb25nIHNyY19sZW4pCiB7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByMCBhc20oIjAiKSA9ICh1bnNpZ25lZCBsb25nKSBmdW5jOwpAQCAtMjUwLDExICsyNDcsOSBAQAogICogQHBhcmFtOiBhZGRyZXNzIG9mIHBhcmFtZXRlciBibG9jazsgc2VlIFBPUCBmb3IgZGV0YWlscyBvbiBlYWNoIGZ1bmMKICAqIEBzcmM6IGFkZHJlc3Mgb2Ygc291cmNlIG1lbW9yeSBhcmVhCiAgKiBAc3JjX2xlbjogbGVuZ3RoIG9mIHNyYyBvcGVyYW5kIGluIGJ5dGVzCi0gKgotICogUmV0dXJucyAwIGZvciB0aGUgcXVlcnkgZnVuYywgbnVtYmVyIG9mIHByb2Nlc3NlZCBieXRlcyBmb3IgZGlnZXN0IGZ1bmNzCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNwYWNmX2tpbWQobG9uZyBmdW5jLCB2b2lkICpwYXJhbSwKLQkJCSAgICAgY29uc3QgdTggKnNyYywgbG9uZyBzcmNfbGVuKQorc3RhdGljIGlubGluZSB2b2lkIGNwYWNmX2tpbWQodW5zaWduZWQgbG9uZyBmdW5jLCB2b2lkICpwYXJhbSwKKwkJCSAgICAgIGNvbnN0IHU4ICpzcmMsIGxvbmcgc3JjX2xlbikKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHIwIGFzbSgiMCIpID0gKHVuc2lnbmVkIGxvbmcpIGZ1bmM7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByMSBhc20oIjEiKSA9ICh1bnNpZ25lZCBsb25nKSBwYXJhbTsKQEAgLTI2Nyw4ICsyNjIsNiBAQAogCQk6IFtzcmNdICIrYSIgKHIyKSwgW2xlbl0gIitkIiAocjMpCiAJCTogW2ZjXSAiZCIgKHIwKSwgW3BiYV0gImEiIChyMSksIFtvcGNdICJpIiAoQ1BBQ0ZfS0lNRCkKIAkJOiAiY2MiLCAibWVtb3J5Iik7Ci0KLQlyZXR1cm4gc3JjX2xlbiAtIHIzOwogfQogCiAvKioKQEAgLTI3NywxMSArMjcwLDkgQEAKICAqIEBwYXJhbTogYWRkcmVzcyBvZiBwYXJhbWV0ZXIgYmxvY2s7IHNlZSBQT1AgZm9yIGRldGFpbHMgb24gZWFjaCBmdW5jCiAgKiBAc3JjOiBhZGRyZXNzIG9mIHNvdXJjZSBtZW1vcnkgYXJlYQogICogQHNyY19sZW46IGxlbmd0aCBvZiBzcmMgb3BlcmFuZCBpbiBieXRlcwotICoKLSAqIFJldHVybnMgMCBmb3IgdGhlIHF1ZXJ5IGZ1bmMsIG51bWJlciBvZiBwcm9jZXNzZWQgYnl0ZXMgZm9yIGRpZ2VzdCBmdW5jcwogICovCi1zdGF0aWMgaW5saW5lIGludCBjcGFjZl9rbG1kKGxvbmcgZnVuYywgdm9pZCAqcGFyYW0sCi0JCQkgICAgIGNvbnN0IHU4ICpzcmMsIGxvbmcgc3JjX2xlbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcGFjZl9rbG1kKHVuc2lnbmVkIGxvbmcgZnVuYywgdm9pZCAqcGFyYW0sCisJCQkgICAgICBjb25zdCB1OCAqc3JjLCBsb25nIHNyY19sZW4pCiB7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByMCBhc20oIjAiKSA9ICh1bnNpZ25lZCBsb25nKSBmdW5jOwogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjEgYXNtKCIxIikgPSAodW5zaWduZWQgbG9uZykgcGFyYW07CkBAIC0yOTQsOCArMjg1LDYgQEAKIAkJOiBbc3JjXSAiK2EiIChyMiksIFtsZW5dICIrZCIgKHIzKQogCQk6IFtmY10gImQiIChyMCksIFtwYmFdICJhIiAocjEpLCBbb3BjXSAiaSIgKENQQUNGX0tMTUQpCiAJCTogImNjIiwgIm1lbW9yeSIpOwotCi0JcmV0dXJuIHNyY19sZW4gLSByMzsKIH0KIAogLyoqCkBAIC0zMDgsNyArMjk3LDcgQEAKICAqCiAgKiBSZXR1cm5zIDAgZm9yIHRoZSBxdWVyeSBmdW5jLCBudW1iZXIgb2YgcHJvY2Vzc2VkIGJ5dGVzIGZvciBkaWdlc3QgZnVuY3MKICAqLwotc3RhdGljIGlubGluZSBpbnQgY3BhY2Zfa21hYyhsb25nIGZ1bmMsIHZvaWQgKnBhcmFtLAorc3RhdGljIGlubGluZSBpbnQgY3BhY2Zfa21hYyh1bnNpZ25lZCBsb25nIGZ1bmMsIHZvaWQgKnBhcmFtLAogCQkJICAgICBjb25zdCB1OCAqc3JjLCBsb25nIHNyY19sZW4pCiB7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByMCBhc20oIjAiKSA9ICh1bnNpZ25lZCBsb25nKSBmdW5jOwpAQCAtMzM4LDcgKzMyNyw3IEBACiAgKiBSZXR1cm5zIDAgZm9yIHRoZSBxdWVyeSBmdW5jLCBudW1iZXIgb2YgcHJvY2Vzc2VkIGJ5dGVzIGZvcgogICogZW5jcnlwdGlvbi9kZWNyeXB0aW9uIGZ1bmNzCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNwYWNmX2ttY3RyKGxvbmcgZnVuYywgdm9pZCAqcGFyYW0sIHU4ICpkZXN0LAorc3RhdGljIGlubGluZSBpbnQgY3BhY2Zfa21jdHIodW5zaWduZWQgbG9uZyBmdW5jLCB2b2lkICpwYXJhbSwgdTggKmRlc3QsCiAJCQkgICAgICBjb25zdCB1OCAqc3JjLCBsb25nIHNyY19sZW4sIHU4ICpjb3VudGVyKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjAgYXNtKCIwIikgPSAodW5zaWduZWQgbG9uZykgZnVuYzsKQEAgLTM2OCwxMyArMzU3LDEwIEBACiAgKiBAZGVzdF9sZW46IHNpemUgb2YgZGVzdGluYXRpb24gbWVtb3J5IGFyZWEgaW4gYnl0ZXMKICAqIEBzZWVkOiBhZGRyZXNzIG9mIHNlZWQgZGF0YQogICogQHNlZWRfbGVuOiBzaXplIG9mIHNlZWQgZGF0YSBpbiBieXRlcwotICoKLSAqIFJldHVybnMgMCBmb3IgdGhlIHF1ZXJ5IGZ1bmMsIG51bWJlciBvZiByYW5kb20gYnl0ZXMgc3RvcmVkIGluCi0gKiBkZXN0IGJ1ZmZlciBmb3IgZ2VuZXJhdGUgZnVuY3Rpb24KICAqLwotc3RhdGljIGlubGluZSBpbnQgY3BhY2ZfcHBubyhsb25nIGZ1bmMsIHZvaWQgKnBhcmFtLAotCQkJICAgICB1OCAqZGVzdCwgbG9uZyBkZXN0X2xlbiwKLQkJCSAgICAgY29uc3QgdTggKnNlZWQsIGxvbmcgc2VlZF9sZW4pCitzdGF0aWMgaW5saW5lIHZvaWQgY3BhY2ZfcHBubyh1bnNpZ25lZCBsb25nIGZ1bmMsIHZvaWQgKnBhcmFtLAorCQkJICAgICAgdTggKmRlc3QsIGxvbmcgZGVzdF9sZW4sCisJCQkgICAgICBjb25zdCB1OCAqc2VlZCwgbG9uZyBzZWVkX2xlbikKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHIwIGFzbSgiMCIpID0gKHVuc2lnbmVkIGxvbmcpIGZ1bmM7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByMSBhc20oIjEiKSA9ICh1bnNpZ25lZCBsb25nKSBwYXJhbTsKQEAgLTM5MCw4ICszNzYsNiBAQAogCQk6IFtmY10gImQiIChyMCksIFtwYmFdICJhIiAocjEpLAogCQkgIFtzZWVkXSAiYSIgKHI0KSwgW3NsZW5dICJkIiAocjUpLCBbb3BjXSAiaSIgKENQQUNGX1BQTk8pCiAJCTogImNjIiwgIm1lbW9yeSIpOwotCi0JcmV0dXJuIGRlc3RfbGVuIC0gcjM7CiB9CiAKIC8qKgpAQCAtMzk5LDEwICszODMsOCBAQAogICoJCSBpbnN0cnVjdGlvbgogICogQGZ1bmM6IHRoZSBmdW5jdGlvbiBjb2RlIHBhc3NlZCB0byBQQ0M7IHNlZSBDUEFDRl9LTV94eHggZGVmaW5lcwogICogQHBhcmFtOiBhZGRyZXNzIG9mIHBhcmFtZXRlciBibG9jazsgc2VlIFBPUCBmb3IgZGV0YWlscyBvbiBlYWNoIGZ1bmMKLSAqCi0gKiBSZXR1cm5zIDAuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNwYWNmX3BjYyhsb25nIGZ1bmMsIHZvaWQgKnBhcmFtKQorc3RhdGljIGlubGluZSB2b2lkIGNwYWNmX3BjYyh1bnNpZ25lZCBsb25nIGZ1bmMsIHZvaWQgKnBhcmFtKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjAgYXNtKCIwIikgPSAodW5zaWduZWQgbG9uZykgZnVuYzsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHIxIGFzbSgiMSIpID0gKHVuc2lnbmVkIGxvbmcpIHBhcmFtOwpAQCAtNDEzLDggKzM5NSw2IEBACiAJCToKIAkJOiBbZmNdICJkIiAocjApLCBbcGJhXSAiYSIgKHIxKSwgW29wY10gImkiIChDUEFDRl9QQ0MpCiAJCTogImNjIiwgIm1lbW9yeSIpOwotCi0JcmV0dXJuIDA7CiB9CiAKICNlbmRpZgkvKiBfQVNNX1MzOTBfQ1BBQ0ZfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2ZhY2lsaXRpZXNfc3JjLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZmFjaWxpdGllc19zcmMuaAppbmRleCA0OTE3NzI4Li4zYjc1OGY2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZmFjaWxpdGllc19zcmMuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZmFjaWxpdGllc19zcmMuaApAQCAtNTUsNCArNTUsMjggQEAKIAkJCS0xIC8qIEVORCAqLwogCQl9CiAJfSwKKwl7CisJCS5uYW1lID0gIkZBQ0lMSVRJRVNfS1ZNIiwKKwkJLmJpdHMgPSAoaW50W10peworCQkJMCwgIC8qIE4zIGluc3RydWN0aW9ucyAqLworCQkJMSwgIC8qIHovQXJjaCBtb2RlIGluc3RhbGxlZCAqLworCQkJMiwgIC8qIHovQXJjaCBtb2RlIGFjdGl2ZSAqLworCQkJMywgIC8qIERBVC1lbmhhbmNlbWVudCAqLworCQkJNCwgIC8qIGlkdGUgc2VnbWVudCB0YWJsZSAqLworCQkJNSwgIC8qIGlkdGUgcmVnaW9uIHRhYmxlICovCisJCQk2LCAgLyogQVNOLWFuZC1MWCByZXVzZSAqLworCQkJNywgIC8qIHN0ZmxlICovCisJCQk4LCAgLyogZW5oYW5jZWQtREFUIDEgKi8KKwkJCTksICAvKiBzZW5zZS1ydW5uaW5nLXN0YXR1cyAqLworCQkJMTAsIC8qIGNvbmRpdGlvbmFsIHNza2UgKi8KKwkJCTEzLCAvKiBpcHRlLXJhbmdlICovCisJCQkxNCwgLyogbm9ucXVpZXNjaW5nIGtleS1zZXR0aW5nICovCisJCQk3MywgLyogdHJhbnNhY3Rpb25hbCBleGVjdXRpb24gKi8KKwkJCTc1LCAvKiBhY2Nlc3MtZXhjZXB0aW9uLWZldGNoL3N0b3JlIGluZGljYXRpb24gKi8KKwkJCTc2LCAvKiBtc2EgZXh0ZW5zaW9uIDMgKi8KKwkJCTc3LCAvKiBtc2EgZXh0ZW5zaW9uIDQgKi8KKwkJCTc4LCAvKiBlbmhhbmNlZC1EQVQgMiAqLworCQkJLTEgIC8qIEVORCAqLworCQl9CisJfSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZnB1L2FwaS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2ZwdS9hcGkuaAppbmRleCA2YWJhNmZjLi4wMjEyNGQ2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZnB1L2FwaS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9mcHUvYXBpLmgKQEAgLTY0LDE4ICs2NCwxOCBAQAogCXJldHVybiByYzsKIH0KIAotI2RlZmluZSBLRVJORUxfVlhSX1YwVjcJCTEKLSNkZWZpbmUgS0VSTkVMX1ZYUl9WOFYxNQkyCi0jZGVmaW5lIEtFUk5FTF9WWFJfVjE2VjIzCTQKLSNkZWZpbmUgS0VSTkVMX1ZYUl9WMjRWMzEJOAotI2RlZmluZSBLRVJORUxfRlBSCQkxNgotI2RlZmluZSBLRVJORUxfRlBDCQkyNTYKKyNkZWZpbmUgS0VSTkVMX0ZQQwkJMQorI2RlZmluZSBLRVJORUxfVlhSX1YwVjcJCTIKKyNkZWZpbmUgS0VSTkVMX1ZYUl9WOFYxNQk0CisjZGVmaW5lIEtFUk5FTF9WWFJfVjE2VjIzCTgKKyNkZWZpbmUgS0VSTkVMX1ZYUl9WMjRWMzEJMTYKIAogI2RlZmluZSBLRVJORUxfVlhSX0xPVwkJKEtFUk5FTF9WWFJfVjBWN3xLRVJORUxfVlhSX1Y4VjE1KQogI2RlZmluZSBLRVJORUxfVlhSX01JRAkJKEtFUk5FTF9WWFJfVjhWMTV8S0VSTkVMX1ZYUl9WMTZWMjMpCiAjZGVmaW5lIEtFUk5FTF9WWFJfSElHSAkJKEtFUk5FTF9WWFJfVjE2VjIzfEtFUk5FTF9WWFJfVjI0VjMxKQogCi0jZGVmaW5lIEtFUk5FTF9GUFVfTUFTSwkJKEtFUk5FTF9WWFJfTE9XfEtFUk5FTF9WWFJfSElHSHxLRVJORUxfRlBSKQorI2RlZmluZSBLRVJORUxfVlhSCQkoS0VSTkVMX1ZYUl9MT1d8S0VSTkVMX1ZYUl9ISUdIKQorI2RlZmluZSBLRVJORUxfRlBSCQkoS0VSTkVMX0ZQQ3xLRVJORUxfVlhSX1YwVjcpCiAKIHN0cnVjdCBrZXJuZWxfZnB1OwogCkBAIC04NywxOCArODcsMjggQEAKICAqIFByZWZlciB1c2luZyB0aGUga2VybmVsX2ZwdV9iZWdpbigpL2tlcm5lbF9mcHVfZW5kKCkgcGFpciBvZiBmdW5jdGlvbnMuCiAgKi8KIHZvaWQgX19rZXJuZWxfZnB1X2JlZ2luKHN0cnVjdCBrZXJuZWxfZnB1ICpzdGF0ZSwgdTMyIGZsYWdzKTsKLXZvaWQgX19rZXJuZWxfZnB1X2VuZChzdHJ1Y3Qga2VybmVsX2ZwdSAqc3RhdGUpOwordm9pZCBfX2tlcm5lbF9mcHVfZW5kKHN0cnVjdCBrZXJuZWxfZnB1ICpzdGF0ZSwgdTMyIGZsYWdzKTsKIAogCiBzdGF0aWMgaW5saW5lIHZvaWQga2VybmVsX2ZwdV9iZWdpbihzdHJ1Y3Qga2VybmVsX2ZwdSAqc3RhdGUsIHUzMiBmbGFncykKIHsKIAlwcmVlbXB0X2Rpc2FibGUoKTsKLQlfX2tlcm5lbF9mcHVfYmVnaW4oc3RhdGUsIGZsYWdzKTsKKwlzdGF0ZS0+bWFzayA9IFMzOTBfbG93Y29yZS5mcHVfZmxhZ3M7CisJaWYgKCF0ZXN0X2NwdV9mbGFnKENJRl9GUFUpKQorCQkvKiBTYXZlIHVzZXIgc3BhY2UgRlBVIHN0YXRlIGFuZCByZWdpc3RlciBjb250ZW50cyAqLworCQlzYXZlX2ZwdV9yZWdzKCk7CisJZWxzZSBpZiAoc3RhdGUtPm1hc2sgJiBmbGFncykKKwkJLyogU2F2ZSBGUFUvdmVjdG9yIHJlZ2lzdGVyIGluLXVzZSBieSB0aGUga2VybmVsICovCisJCV9fa2VybmVsX2ZwdV9iZWdpbihzdGF0ZSwgZmxhZ3MpOworCVMzOTBfbG93Y29yZS5mcHVfZmxhZ3MgfD0gZmxhZ3M7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBrZXJuZWxfZnB1X2VuZChzdHJ1Y3Qga2VybmVsX2ZwdSAqc3RhdGUpCitzdGF0aWMgaW5saW5lIHZvaWQga2VybmVsX2ZwdV9lbmQoc3RydWN0IGtlcm5lbF9mcHUgKnN0YXRlLCB1MzIgZmxhZ3MpCiB7Ci0JX19rZXJuZWxfZnB1X2VuZChzdGF0ZSk7CisJUzM5MF9sb3djb3JlLmZwdV9mbGFncyA9IHN0YXRlLT5tYXNrOworCWlmIChzdGF0ZS0+bWFzayAmIGZsYWdzKQorCQkvKiBSZXN0b3JlIEZQVS92ZWN0b3IgcmVnaXN0ZXIgaW4tdXNlIGJ5IHRoZSBrZXJuZWwgKi8KKwkJX19rZXJuZWxfZnB1X2VuZChzdGF0ZSwgZmxhZ3MpOwogCXByZWVtcHRfZW5hYmxlKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9sb3djb3JlLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbG93Y29yZS5oCmluZGV4IGQ3OWJhN2MuLjdiOTNiNzggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9sb3djb3JlLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2xvd2NvcmUuaApAQCAtMTI5LDcgKzEyOSw4IEBACiAJX191OAlwYWRfMHgwMzkwWzB4MDM5OC0weDAzOTBdOwkvKiAweDAzOTAgKi8KIAlfX3U2NAlnbWFwOwkJCQkvKiAweDAzOTggKi8KIAlfX3UzMglzcGlubG9ja19sb2NrdmFsOwkJLyogMHgwM2EwICovCi0JX191OAlwYWRfMHgwM2EwWzB4MDQwMC0weDAzYTRdOwkvKiAweDAzYTQgKi8KKwlfX3UzMglmcHVfZmxhZ3M7CQkJLyogMHgwM2E0ICovCisJX191OAlwYWRfMHgwM2E4WzB4MDQwMC0weDAzYThdOwkvKiAweDAzYTggKi8KIAogCS8qIFBlciBjcHUgcHJpbWFyeSBzcGFjZSBhY2Nlc3MgbGlzdCAqLwogCV9fdTMyCXBhc3RlWzE2XTsJCQkvKiAweDA0MDAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9tbXUuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9tbXUuaAppbmRleCA2ZDM5MzI5Li5iZWE3ODVkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbW11LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tdS5oCkBAIC0xMiw2ICsxMiw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBwZ3RhYmxlX2xpc3Q7CiAJc3BpbmxvY2tfdCBnbWFwX2xvY2s7CiAJc3RydWN0IGxpc3RfaGVhZCBnbWFwX2xpc3Q7CisJdW5zaWduZWQgbG9uZyBnbWFwX2FzY2U7CiAJdW5zaWduZWQgbG9uZyBhc2NlOwogCXVuc2lnbmVkIGxvbmcgYXNjZV9saW1pdDsKIAl1bnNpZ25lZCBsb25nIHZkc29fYmFzZTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKaW5kZXggYzZhMDg4Yy4uNTE1ZmVhNSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKQEAgLTIxLDYgKzIxLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmbW0tPmNvbnRleHQuZ21hcF9saXN0KTsKIAljcHVtYXNrX2NsZWFyKCZtbS0+Y29udGV4dC5jcHVfYXR0YWNoX21hc2spOwogCWF0b21pY19zZXQoJm1tLT5jb250ZXh0LmZsdXNoX2NvdW50LCAwKTsKKwltbS0+Y29udGV4dC5nbWFwX2FzY2UgPSAwOwogCW1tLT5jb250ZXh0LmZsdXNoX21tID0gMDsKICNpZmRlZiBDT05GSUdfUEdTVEUKIAltbS0+Y29udGV4dC5hbGxvY19wZ3N0ZSA9IHBhZ2VfdGFibGVfYWxsb2NhdGVfcGdzdGU7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGNpLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGNpLmgKaW5kZXggMGRhOTFjNC4uNjYxMWY3OSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BjaS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wY2kuaApAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BjaS5oPgogI2luY2x1ZGUgPGFzbS9wY2lfY2xwLmg+CiAjaW5jbHVkZSA8YXNtL3BjaV9kZWJ1Zy5oPgorI2luY2x1ZGUgPGFzbS9zY2xwLmg+CiAKICNkZWZpbmUgUENJQklPU19NSU5fSU8JCTB4MTAwMAogI2RlZmluZSBQQ0lCSU9TX01JTl9NRU0JCTB4MTAwMDAwMDAKQEAgLTExNyw2ICsxMTgsNyBAQAogCiAJc3BpbmxvY2tfdAlpb21tdV9iaXRtYXBfbG9jazsKIAl1bnNpZ25lZCBsb25nCSppb21tdV9iaXRtYXA7CisJdW5zaWduZWQgbG9uZwkqbGF6eV9iaXRtYXA7CiAJdW5zaWduZWQgbG9uZwlpb21tdV9zaXplOwogCXVuc2lnbmVkIGxvbmcJaW9tbXVfcGFnZXM7CiAJdW5zaWduZWQgaW50CW5leHRfYml0OwpAQCAtMjE2LDYgKzIxOCw5IEBACiB2b2lkIHpwY2lfZGVidWdfZXhpdF9kZXZpY2Uoc3RydWN0IHpwY2lfZGV2ICopOwogdm9pZCB6cGNpX2RlYnVnX2luZm8oc3RydWN0IHpwY2lfZGV2ICosIHN0cnVjdCBzZXFfZmlsZSAqKTsKIAorLyogRXJyb3IgcmVwb3J0aW5nICovCitpbnQgenBjaV9yZXBvcnRfZXJyb3Ioc3RydWN0IHBjaV9kZXYgKiwgc3RydWN0IHpwY2lfcmVwb3J0X2Vycm9yX2hlYWRlciAqKTsKKwogI2lmZGVmIENPTkZJR19OVU1BCiAKIC8qIFJldHVybnMgdGhlIG5vZGUgYmFzZWQgb24gUENJIGJ1cyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggNzJjN2Y2MC4uMDM2MmNkNSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC04NzQsMzUgKzg3NCwzMSBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3B0ZXBfaXB0ZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwKQorI2RlZmluZSBJUFRFX0dMT0JBTAkwCisjZGVmaW5lCUlQVEVfTE9DQUwJMQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19wdGVwX2lwdGUodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCwgaW50IGxvY2FsKQogewogCXVuc2lnbmVkIGxvbmcgcHRvID0gKHVuc2lnbmVkIGxvbmcpIHB0ZXA7CiAKLQkvKiBJbnZhbGlkYXRpb24gKyBnbG9iYWwgVExCIGZsdXNoIGZvciB0aGUgcHRlICovCisJLyogSW52YWxpZGF0aW9uICsgVExCIGZsdXNoIGZvciB0aGUgcHRlICovCiAJYXNtIHZvbGF0aWxlKAotCQkiCWlwdGUJJTIsJTMiCi0JCTogIj1tIiAoKnB0ZXApIDogIm0iICgqcHRlcCksICJhIiAocHRvKSwgImEiIChhZGRyZXNzKSk7CisJCSIgICAgICAgLmluc24gcnJmLDB4YjIyMTAwMDAsJVtyMV0sJVtyMl0sMCwlW200XSIKKwkJOiAiK20iICgqcHRlcCkgOiBbcjFdICJhIiAocHRvKSwgW3IyXSAiYSIgKGFkZHJlc3MpLAorCQkgIFttNF0gImkiIChsb2NhbCkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19wdGVwX2lwdGVfbG9jYWwodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3B0ZXBfaXB0ZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCBuciwKKwkJCQkgICAgIHB0ZV90ICpwdGVwLCBpbnQgbG9jYWwpCiB7CiAJdW5zaWduZWQgbG9uZyBwdG8gPSAodW5zaWduZWQgbG9uZykgcHRlcDsKIAotCS8qIEludmFsaWRhdGlvbiArIGxvY2FsIFRMQiBmbHVzaCBmb3IgdGhlIHB0ZSAqLwotCWFzbSB2b2xhdGlsZSgKLQkJIgkuaW5zbiBycmYsMHhiMjIxMDAwMCwlMiwlMywwLDEiCi0JCTogIj1tIiAoKnB0ZXApIDogIm0iICgqcHRlcCksICJhIiAocHRvKSwgImEiIChhZGRyZXNzKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3B0ZXBfaXB0ZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCBuciwgcHRlX3QgKnB0ZXApCi17Ci0JdW5zaWduZWQgbG9uZyBwdG8gPSAodW5zaWduZWQgbG9uZykgcHRlcDsKLQotCS8qIEludmFsaWRhdGUgYSByYW5nZSBvZiBwdGVzICsgZ2xvYmFsIFRMQiBmbHVzaCBvZiB0aGUgcHRlcyAqLworCS8qIEludmFsaWRhdGUgYSByYW5nZSBvZiBwdGVzICsgVExCIGZsdXNoIG9mIHRoZSBwdGVzICovCiAJZG8gewogCQlhc20gdm9sYXRpbGUoCi0JCQkiCS5pbnNuIHJyZiwweGIyMjEwMDAwLCUyLCUwLCUxLDAiCi0JCQk6ICIrYSIgKGFkZHJlc3MpLCAiK2EiIChucikgOiAiYSIgKHB0bykgOiAibWVtb3J5Iik7CisJCQkiICAgICAgIC5pbnNuIHJyZiwweGIyMjEwMDAwLCVbcjFdLCVbcjJdLCVbcjNdLCVbbTRdIgorCQkJOiBbcjJdICIrYSIgKGFkZHJlc3MpLCBbcjNdICIrYSIgKG5yKQorCQkJOiBbcjFdICJhIiAocHRvKSwgW200XSAiaSIgKGxvY2FsKSA6ICJtZW1vcnkiKTsKIAl9IHdoaWxlIChuciAhPSAyNTUpOwogfQogCkBAIC0xMjM5LDUzICsxMjM1LDMzIEBACiAJICAgIHBtZF92YWwoKnBtZHApIHwgX1NFR01FTlRfRU5UUllfSU5WQUxJRCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3BtZHBfaWR0ZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWRwKQorI2RlZmluZSBJRFRFX0dMT0JBTAkwCisjZGVmaW5lIElEVEVfTE9DQUwJMQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19wbWRwX2lkdGUodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwbWRfdCAqcG1kcCwgaW50IGxvY2FsKQogewogCXVuc2lnbmVkIGxvbmcgc3RvOwogCiAJc3RvID0gKHVuc2lnbmVkIGxvbmcpIHBtZHAgLSBwbWRfaW5kZXgoYWRkcmVzcykgKiBzaXplb2YocG1kX3QpOwogCWFzbSB2b2xhdGlsZSgKLQkJIgkuaW5zbglycmYsMHhiOThlMDAwMCwlMiwlMywwLDAiCi0JCTogIj1tIiAoKnBtZHApCi0JCTogIm0iICgqcG1kcCksICJhIiAoc3RvKSwgImEiICgoYWRkcmVzcyAmIEhQQUdFX01BU0spKQorCQkiCS5pbnNuCXJyZiwweGI5OGUwMDAwLCVbcjFdLCVbcjJdLDAsJVttNF0iCisJCTogIittIiAoKnBtZHApCisJCTogW3IxXSAiYSIgKHN0byksIFtyMl0gImEiICgoYWRkcmVzcyAmIEhQQUdFX01BU0spKSwKKwkJICBbbTRdICJpIiAobG9jYWwpCiAJCTogImNjIiApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19wdWRwX2lkdGUodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdWRfdCAqcHVkcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3B1ZHBfaWR0ZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB1ZF90ICpwdWRwLCBpbnQgbG9jYWwpCiB7CiAJdW5zaWduZWQgbG9uZyByM287CiAKIAlyM28gPSAodW5zaWduZWQgbG9uZykgcHVkcCAtIHB1ZF9pbmRleChhZGRyZXNzKSAqIHNpemVvZihwdWRfdCk7CiAJcjNvIHw9IF9BU0NFX1RZUEVfUkVHSU9OMzsKIAlhc20gdm9sYXRpbGUoCi0JCSIJLmluc24JcnJmLDB4Yjk4ZTAwMDAsJTIsJTMsMCwwIgotCQk6ICI9bSIgKCpwdWRwKQotCQk6ICJtIiAoKnB1ZHApLCAiYSIgKHIzbyksICJhIiAoKGFkZHJlc3MgJiBQVURfTUFTSykpCi0JCTogImNjIik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3BtZHBfaWR0ZV9sb2NhbCh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWRwKQotewotCXVuc2lnbmVkIGxvbmcgc3RvOwotCi0Jc3RvID0gKHVuc2lnbmVkIGxvbmcpIHBtZHAgLSBwbWRfaW5kZXgoYWRkcmVzcykgKiBzaXplb2YocG1kX3QpOwotCWFzbSB2b2xhdGlsZSgKLQkJIgkuaW5zbglycmYsMHhiOThlMDAwMCwlMiwlMywwLDEiCi0JCTogIj1tIiAoKnBtZHApCi0JCTogIm0iICgqcG1kcCksICJhIiAoc3RvKSwgImEiICgoYWRkcmVzcyAmIEhQQUdFX01BU0spKQotCQk6ICJjYyIgKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fcHVkcF9pZHRlX2xvY2FsKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHVkX3QgKnB1ZHApCi17Ci0JdW5zaWduZWQgbG9uZyByM287Ci0KLQlyM28gPSAodW5zaWduZWQgbG9uZykgcHVkcCAtIHB1ZF9pbmRleChhZGRyZXNzKSAqIHNpemVvZihwdWRfdCk7Ci0JcjNvIHw9IF9BU0NFX1RZUEVfUkVHSU9OMzsKLQlhc20gdm9sYXRpbGUoCi0JCSIJLmluc24JcnJmLDB4Yjk4ZTAwMDAsJTIsJTMsMCwxIgotCQk6ICI9bSIgKCpwdWRwKQotCQk6ICJtIiAoKnB1ZHApLCAiYSIgKHIzbyksICJhIiAoKGFkZHJlc3MgJiBQVURfTUFTSykpCisJCSIJLmluc24JcnJmLDB4Yjk4ZTAwMDAsJVtyMV0sJVtyMl0sMCwlW200XSIKKwkJOiAiK20iICgqcHVkcCkKKwkJOiBbcjFdICJhIiAocjNvKSwgW3IyXSAiYSIgKChhZGRyZXNzICYgUFVEX01BU0spKSwKKwkJICBbbTRdICJpIiAobG9jYWwpCiAJCTogImNjIik7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90bGJmbHVzaC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKaW5kZXggMWE2OTFlZi4uMzk4NDYxMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKQEAgLTI2LDE3ICsyNiw2IEBACiAJCTogOiAiYSIgKDIwNDgpLCAiYSIgKGFzY2UpIDogImNjIik7CiB9CiAKLS8qCi0gKiBGbHVzaCBUTEIgZW50cmllcyBmb3IgYSBzcGVjaWZpYyBBU0NFIG9uIHRoZSBsb2NhbCBDUFUKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fdGxiX2ZsdXNoX2lkdGVfbG9jYWwodW5zaWduZWQgbG9uZyBhc2NlKQotewotCS8qIExvY2FsIFRMQiBmbHVzaCBmb3IgdGhlIG1tICovCi0JYXNtIHZvbGF0aWxlKAotCQkiCS5pbnNuCXJyZiwweGI5OGUwMDAwLDAsJTAsJTEsMSIKLQkJOiA6ICJhIiAoMjA0OCksICJhIiAoYXNjZSkgOiAiY2MiKTsKLX0KLQogI2lmZGVmIENPTkZJR19TTVAKIHZvaWQgc21wX3B0bGJfYWxsKHZvaWQpOwogCkBAIC02NSwzNSArNTQsMzMgQEAKIAkJLyogR2xvYmFsIFRMQiBmbHVzaCAqLwogCQlfX3RsYl9mbHVzaF9nbG9iYWwoKTsKIAkJLyogUmVzZXQgVExCIGZsdXNoIG1hc2sgKi8KLQkJaWYgKE1BQ0hJTkVfSEFTX1RMQl9MQykKLQkJCWNwdW1hc2tfY29weShtbV9jcHVtYXNrKG1tKSwKLQkJCQkgICAgICZtbS0+Y29udGV4dC5jcHVfYXR0YWNoX21hc2spOworCQljcHVtYXNrX2NvcHkobW1fY3B1bWFzayhtbSksICZtbS0+Y29udGV4dC5jcHVfYXR0YWNoX21hc2spOwogCX0KIAlhdG9taWNfZGVjKCZtbS0+Y29udGV4dC5mbHVzaF9jb3VudCk7CiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KIAotLyoKLSAqIEZsdXNoIFRMQiBlbnRyaWVzIGZvciBhIHNwZWNpZmljIEFTQ0Ugb24gYWxsIENQVXMuIFNob3VsZCBuZXZlciBiZSB1c2VkCi0gKiB3aGVuIG1vcmUgdGhhbiBvbmUgYXNjZSAoZS5nLiBnbWFwKSByYW4gb24gdGhpcyBtbS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fdGxiX2ZsdXNoX2FzY2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYXNjZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3RsYl9mbHVzaF9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKKwl1bnNpZ25lZCBsb25nIGdtYXBfYXNjZTsKKworCS8qCisJICogSWYgdGhlIG1hY2hpbmUgaGFzIElEVEUgd2UgcHJlZmVyIHRvIGRvIGEgcGVyIG1tIGZsdXNoCisJICogb24gYWxsIGNwdXMgaW5zdGVhZCBvZiBkb2luZyBhIGxvY2FsIGZsdXNoIGlmIHRoZSBtbQorCSAqIG9ubHkgcmFuIG9uIHRoZSBsb2NhbCBjcHUuCisJICovCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJYXRvbWljX2luYygmbW0tPmNvbnRleHQuZmx1c2hfY291bnQpOwotCWlmIChNQUNISU5FX0hBU19UTEJfTEMgJiYKLQkgICAgY3B1bWFza19lcXVhbChtbV9jcHVtYXNrKG1tKSwgY3B1bWFza19vZihzbXBfcHJvY2Vzc29yX2lkKCkpKSkgewotCQlfX3RsYl9mbHVzaF9pZHRlX2xvY2FsKGFzY2UpOworCWdtYXBfYXNjZSA9IFJFQURfT05DRShtbS0+Y29udGV4dC5nbWFwX2FzY2UpOworCWlmIChNQUNISU5FX0hBU19JRFRFICYmIGdtYXBfYXNjZSAhPSAtMVVMKSB7CisJCWlmIChnbWFwX2FzY2UpCisJCQlfX3RsYl9mbHVzaF9pZHRlKGdtYXBfYXNjZSk7CisJCV9fdGxiX2ZsdXNoX2lkdGUobW0tPmNvbnRleHQuYXNjZSk7CiAJfSBlbHNlIHsKLQkJaWYgKE1BQ0hJTkVfSEFTX0lEVEUpCi0JCQlfX3RsYl9mbHVzaF9pZHRlKGFzY2UpOwotCQllbHNlCi0JCQlfX3RsYl9mbHVzaF9nbG9iYWwoKTsKLQkJLyogUmVzZXQgVExCIGZsdXNoIG1hc2sgKi8KLQkJaWYgKE1BQ0hJTkVfSEFTX1RMQl9MQykKLQkJCWNwdW1hc2tfY29weShtbV9jcHVtYXNrKG1tKSwKLQkJCQkgICAgICZtbS0+Y29udGV4dC5jcHVfYXR0YWNoX21hc2spOworCQlfX3RsYl9mbHVzaF9mdWxsKG1tKTsKIAl9CisJLyogUmVzZXQgVExCIGZsdXNoIG1hc2sgKi8KKwljcHVtYXNrX2NvcHkobW1fY3B1bWFzayhtbSksICZtbS0+Y29udGV4dC5jcHVfYXR0YWNoX21hc2spOwogCWF0b21pY19kZWMoJm1tLT5jb250ZXh0LmZsdXNoX2NvdW50KTsKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQpAQCAtMTEyLDM2ICs5OSwxNyBAQAogLyoKICAqIEZsdXNoIFRMQiBlbnRyaWVzIGZvciBhIHNwZWNpZmljIEFTQ0Ugb24gYWxsIENQVXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3RsYl9mbHVzaF9hc2NlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFzY2UpCitzdGF0aWMgaW5saW5lIHZvaWQgX190bGJfZmx1c2hfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JaWYgKE1BQ0hJTkVfSEFTX1RMQl9MQykKLQkJX190bGJfZmx1c2hfaWR0ZV9sb2NhbChhc2NlKTsKLQllbHNlCi0JCV9fdGxiX2ZsdXNoX2xvY2FsKCk7CisJX190bGJfZmx1c2hfbG9jYWwoKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIF9fdGxiX2ZsdXNoX2tlcm5lbCh2b2lkKQogewotCWlmIChNQUNISU5FX0hBU19UTEJfTEMpCi0JCV9fdGxiX2ZsdXNoX2lkdGVfbG9jYWwoaW5pdF9tbS5jb250ZXh0LmFzY2UpOwotCWVsc2UKLQkJX190bGJfZmx1c2hfbG9jYWwoKTsKKwlfX3RsYl9mbHVzaF9sb2NhbCgpOwogfQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3RsYl9mbHVzaF9tbShzdHJ1Y3QgbW1fc3RydWN0ICogbW0pCi17Ci0JLyoKLQkgKiBJZiB0aGUgbWFjaGluZSBoYXMgSURURSB3ZSBwcmVmZXIgdG8gZG8gYSBwZXIgbW0gZmx1c2gKLQkgKiBvbiBhbGwgY3B1cyBpbnN0ZWFkIG9mIGRvaW5nIGEgbG9jYWwgZmx1c2ggaWYgdGhlIG1tCi0JICogb25seSByYW4gb24gdGhlIGxvY2FsIGNwdS4KLQkgKi8KLQlpZiAoTUFDSElORV9IQVNfSURURSAmJiBsaXN0X2VtcHR5KCZtbS0+Y29udGV4dC5nbWFwX2xpc3QpKQotCQlfX3RsYl9mbHVzaF9hc2NlKG1tLCBtbS0+Y29udGV4dC5hc2NlKTsKLQllbHNlCi0JCV9fdGxiX2ZsdXNoX2Z1bGwobW0pOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgX190bGJfZmx1c2hfbW1fbGF6eShzdHJ1Y3QgbW1fc3RydWN0ICogbW0pCiB7CiAJaWYgKG1tLT5jb250ZXh0LmZsdXNoX21tKSB7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCA5YjQ5Y2YxLi41MmQ3Yzg3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTI2NiwyOCArMjY2LDI4IEBACiAJX19jaGtfdXNlcl9wdHIocHRyKTsJCQkJCVwKIAlzd2l0Y2ggKHNpemVvZigqKHB0cikpKSB7CQkJCVwKIAljYXNlIDE6IHsJCQkJCQlcCi0JCXVuc2lnbmVkIGNoYXIgX194OwkJCQlcCisJCXVuc2lnbmVkIGNoYXIgX194ID0gMDsJCQkJXAogCQlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfZm4oJl9feCwgcHRyLAkJXAogCQkJCQkgc2l6ZW9mKCoocHRyKSkpOwlcCiAJCSh4KSA9ICooX19mb3JjZSBfX3R5cGVvZl9fKCoocHRyKSkgKikgJl9feDsJXAogCQlicmVhazsJCQkJCQlcCiAJfTsJCQkJCQkJXAogCWNhc2UgMjogewkJCQkJCVwKLQkJdW5zaWduZWQgc2hvcnQgX194OwkJCQlcCisJCXVuc2lnbmVkIHNob3J0IF9feCA9IDA7CQkJCVwKIAkJX19ndV9lcnIgPSBfX2dldF91c2VyX2ZuKCZfX3gsIHB0ciwJCVwKIAkJCQkJIHNpemVvZigqKHB0cikpKTsJXAogCQkoeCkgPSAqKF9fZm9yY2UgX190eXBlb2ZfXygqKHB0cikpICopICZfX3g7CVwKIAkJYnJlYWs7CQkJCQkJXAogCX07CQkJCQkJCVwKIAljYXNlIDQ6IHsJCQkJCQlcCi0JCXVuc2lnbmVkIGludCBfX3g7CQkJCVwKKwkJdW5zaWduZWQgaW50IF9feCA9IDA7CQkJCVwKIAkJX19ndV9lcnIgPSBfX2dldF91c2VyX2ZuKCZfX3gsIHB0ciwJCVwKIAkJCQkJIHNpemVvZigqKHB0cikpKTsJXAogCQkoeCkgPSAqKF9fZm9yY2UgX190eXBlb2ZfXygqKHB0cikpICopICZfX3g7CVwKIAkJYnJlYWs7CQkJCQkJXAogCX07CQkJCQkJCVwKIAljYXNlIDg6IHsJCQkJCQlcCi0JCXVuc2lnbmVkIGxvbmcgbG9uZyBfX3g7CQkJCVwKKwkJdW5zaWduZWQgbG9uZyBsb25nIF9feCA9IDA7CQkJXAogCQlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfZm4oJl9feCwgcHRyLAkJXAogCQkJCQkgc2l6ZW9mKCoocHRyKSkpOwlcCiAJCSh4KSA9ICooX19mb3JjZSBfX3R5cGVvZl9fKCoocHRyKSkgKikgJl9feDsJXApAQCAtMzExLDYgKzMxMSwxNCBAQAogI2RlZmluZSBfX3B1dF91c2VyX3VuYWxpZ25lZCBfX3B1dF91c2VyCiAjZGVmaW5lIF9fZ2V0X3VzZXJfdW5hbGlnbmVkIF9fZ2V0X3VzZXIKIAorZXh0ZXJuIHZvaWQgX19jb21waWxldGltZV9lcnJvcigidXNlcmNvcHkgYnVmZmVyIHNpemUgaXMgdG9vIHNtYWxsIikKK19fYmFkX2NvcHlfdXNlcih2b2lkKTsKKworc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdXNlcl9vdmVyZmxvdyhpbnQgc2l6ZSwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlXQVJOKDEsICJCdWZmZXIgb3ZlcmZsb3cgZGV0ZWN0ZWQgKCVkIDwgJWx1KSFcbiIsIHNpemUsIGNvdW50KTsKK30KKwogLyoqCiAgKiBjb3B5X3RvX3VzZXI6IC0gQ29weSBhIGJsb2NrIG9mIGRhdGEgaW50byB1c2VyIHNwYWNlLgogICogQHRvOiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCkBAIC0zMzIsMTIgKzM0MCw2IEBACiAJcmV0dXJuIF9fY29weV90b191c2VyKHRvLCBmcm9tLCBuKTsKIH0KIAotdm9pZCBjb3B5X2Zyb21fdXNlcl9vdmVyZmxvdyh2b2lkKQotI2lmZGVmIENPTkZJR19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUwotX19jb21waWxldGltZV93YXJuaW5nKCJjb3B5X2Zyb21fdXNlcigpIGJ1ZmZlciBzaXplIGlzIG5vdCBwcm92YWJseSBjb3JyZWN0IikKLSNlbmRpZgotOwotCiAvKioKICAqIGNvcHlfZnJvbV91c2VyOiAtIENvcHkgYSBibG9jayBvZiBkYXRhIGZyb20gdXNlciBzcGFjZS4KICAqIEB0bzogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuCkBAIC0zNjIsNyArMzY0LDEwIEBACiAKIAltaWdodF9mYXVsdCgpOwogCWlmICh1bmxpa2VseShzeiAhPSAtMSAmJiBzeiA8IG4pKSB7Ci0JCWNvcHlfZnJvbV91c2VyX292ZXJmbG93KCk7CisJCWlmICghX19idWlsdGluX2NvbnN0YW50X3AobikpCisJCQljb3B5X3VzZXJfb3ZlcmZsb3coc3osIG4pOworCQllbHNlCisJCQlfX2JhZF9jb3B5X3VzZXIoKTsKIAkJcmV0dXJuIG47CiAJfQogCXJldHVybiBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS92eC1pbnNuLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdngtaW5zbi5oCmluZGV4IDRhMzEzNTYuLjQ5YzI0YTIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS92eC1pbnNuLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Z4LWluc24uaApAQCAtMTYsMTUgKzE2LDEzIEBACiAKIC8qIE1hY3JvcyB0byBnZW5lcmF0ZSB2ZWN0b3IgaW5zdHJ1Y3Rpb24gYnl0ZSBjb2RlICovCiAKLSNkZWZpbmUgUkVHX05VTV9JTlZBTElECSAgICAgICAyNTUKLQogLyogR1JfTlVNIC0gUmV0cmlldmUgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyIG51bWJlcgogICoKICAqIEBvcGQ6CU9wZXJhbmQgdG8gc3RvcmUgcmVnaXN0ZXIgbnVtYmVyCiAgKiBAcjY0OglTdHJpbmcgZGVzaWduYXRpb24gcmVnaXN0ZXIgaW4gdGhlIGZvcm1hdCAiJXJOIgogICovCiAubWFjcm8JR1JfTlVNCW9wZCBncgotCVxvcGQgPSBSRUdfTlVNX0lOVkFMSUQKKwlcb3BkID0gMjU1CiAJLmlmYyBcZ3IsJXIwCiAJCVxvcGQgPSAwCiAJLmVuZGlmCkBAIC03MywxNCArNzEsMTEgQEAKIAkuaWZjIFxnciwlcjE1CiAJCVxvcGQgPSAxNQogCS5lbmRpZgotCS5pZiBcb3BkID09IFJFR19OVU1fSU5WQUxJRAotCQkuZXJyb3IgIkludmFsaWQgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyIGRlc2lnbmF0aW9uOiBcZ3IiCisJLmlmIFxvcGQgPT0gMjU1CisJCVxvcGQgPSBcZ3IKIAkuZW5kaWYKIC5lbmRtCiAKLS8qIFZYX1IoKSAtIE1hY3JvIHRvIGVuY29kZSB0aGUgVlhfTlVNIGludG8gdGhlIGluc3RydWN0aW9uICovCi0jZGVmaW5lIFZYX1IodikJCSh2ICYgMHgwRikKLQogLyogVlhfTlVNIC0gUmV0cmlldmUgdmVjdG9yIHJlZ2lzdGVyIG51bWJlcgogICoKICAqIEBvcGQ6CU9wZXJhbmQgdG8gc3RvcmUgcmVnaXN0ZXIgbnVtYmVyCkBAIC04OCwxMSArODMsMTAgQEAKICAqCiAgKiBUaGUgdmVjdG9yIHJlZ2lzdGVyIG51bWJlciBpcyB1c2VkIGZvciBhcyBpbnB1dCBudW1iZXIgdG8gdGhlCiAgKiBpbnN0cnVjdGlvbiBhbmQsIGFzIHdlbGwgYXMsIHRvIGNvbXB1dGUgdGhlIFJYQiBmaWVsZCBvZiB0aGUKLSAqIGluc3RydWN0aW9uLiAgVG8gZW5jb2RlIHRoZSBwYXJ0aWN1bGFyIHZlY3RvciByZWdpc3RlciBudW1iZXIsCi0gKiB1c2UgdGhlIFZYX1IodikgbWFjcm8gdG8gZXh0cmFjdCB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgorICogaW5zdHJ1Y3Rpb24uCiAgKi8KIC5tYWNybwlWWF9OVU0Jb3BkIHZ4cgotCVxvcGQgPSBSRUdfTlVNX0lOVkFMSUQKKwlcb3BkID0gMjU1CiAJLmlmYyBcdnhyLCV2MAogCQlcb3BkID0gMAogCS5lbmRpZgpAQCAtMTg5LDggKzE4Myw4IEBACiAJLmlmYyBcdnhyLCV2MzEKIAkJXG9wZCA9IDMxCiAJLmVuZGlmCi0JLmlmIFxvcGQgPT0gUkVHX05VTV9JTlZBTElECi0JCS5lcnJvciAiSW52YWxpZCB2ZWN0b3IgcmVnaXN0ZXIgZGVzaWduYXRpb246IFx2eHIiCisJLmlmIFxvcGQgPT0gMjU1CisJCVxvcGQgPSBcdnhyCiAJLmVuZGlmCiAuZW5kbQogCkBAIC0yNTEsNyArMjQ1LDcgQEAKIC8qIFZFQ1RPUiBHRU5FUkFURSBCWVRFIE1BU0sgKi8KIC5tYWNybwlWR0JNCXZyIGltbTIKIAlWWF9OVU0JdjEsIFx2cgotCS53b3JkCSgweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkpCisJLndvcmQJKDB4RTcwMCB8ICgodjEmMTUpIDw8IDQpKQogCS53b3JkCVxpbW0yCiAJTVJYQk9QQwkwLCAweDQ0LCB2MQogLmVuZG0KQEAgLTI2Nyw3ICsyNjEsNyBAQAogCVZYX05VTQl2MSwgXHYKIAlHUl9OVU0JYjIsICIlcjAiCiAJR1JfTlVNCXIzLCBcZ3IKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCByMworCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgcjMKIAkud29yZAkoYjIgPDwgMTIpIHwgKFxkaXNwKQogCU1SWEJPUEMJXG0sIDB4MjIsIHYxCiAuZW5kbQpAQCAtMjg0LDEyICsyNzgsMjEgQEAKIAlWTFZHCVx2LCBcZ3IsIFxpbmRleCwgMwogLmVuZG0KIAorLyogVkVDVE9SIExPQUQgUkVHSVNURVIgKi8KKy5tYWNybwlWTFIJdjEsIHYyCisJVlhfTlVNCXYxLCBcdjEKKwlWWF9OVU0JdjIsIFx2MgorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgKHYyJjE1KQorCS53b3JkCTAKKwlNUlhCT1BDCTAsIDB4NTYsIHYxLCB2MgorLmVuZG0KKwogLyogVkVDVE9SIExPQUQgKi8KIC5tYWNybwlWTAl2LCBkaXNwLCBpbmRleD0iJXIwIiwgYmFzZQogCVZYX05VTQl2MSwgXHYKIAlHUl9OVU0JeDIsIFxpbmRleAogCUdSX05VTQliMiwgXGJhc2UKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCB4MgorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgeDIKIAkud29yZAkoYjIgPDwgMTIpIHwgKFxkaXNwKQogCU1SWEJPUEMgMCwgMHgwNiwgdjEKIC5lbmRtCkBAIC0yOTksNyArMzAyLDcgQEAKIAlWWF9OVU0JdjEsIFx2cjEKIAlHUl9OVU0JeDIsIFxpbmRleAogCUdSX05VTQliMiwgXGJhc2UKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCB4MgorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgeDIKIAkud29yZAkoYjIgPDwgMTIpIHwgKFxkaXNwKQogCU1SWEJPUEMJXG0zLCBcb3BjLCB2MQogLmVuZG0KQEAgLTMxOSw3ICszMjIsNyBAQAogLyogVkVDVE9SIExPQUQgRUxFTUVOVCBJTU1FRElBVEUgKi8KIC5tYWNybwlWTEVJeAl2cjEsIGltbTIsIG0zLCBvcGMKIAlWWF9OVU0JdjEsIFx2cjEKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkKKwkud29yZAkweEU3MDAgfCAoKHYxJjE1KSA8PCA0KQogCS53b3JkCVxpbW0yCiAJTVJYQk9QQwlcbTMsIFxvcGMsIHYxCiAuZW5kbQpAQCAtMzQxLDcgKzM0NCw3IEBACiAJR1JfTlVNCXIxLCBcZ3IKIAlHUl9OVU0JYjIsIFxiYXNlCiAJVlhfTlVNCXYzLCBcdnIKLQkud29yZAkweEU3MDAgfCAocjEgPDwgNCkgfCBWWF9SKHYzKQorCS53b3JkCTB4RTcwMCB8IChyMSA8PCA0KSB8ICh2MyYxNSkKIAkud29yZAkoYjIgPDwgMTIpIHwgKFxkaXNwKQogCU1SWEJPUEMJXG0sIDB4MjEsIHYzCiAuZW5kbQpAQCAtMzYzLDcgKzM2Niw3IEBACiAJVlhfTlVNCXYxLCBcdmZyb20KIAlWWF9OVU0JdjMsIFx2dG8KIAlHUl9OVU0JYjIsIFxiYXNlCSAgICAvKiBCYXNlIHJlZ2lzdGVyICovCi0JLndvcmQJMHhFNzAwIHwgKFZYX1IodjEpIDw8IDQpIHwgVlhfUih2MykKKwkud29yZAkweEU3MDAgfCAoKHYxJjE1KSA8PCA0KSB8ICh2MyYxNSkKIAkud29yZAkoYjIgPDwgMTIpIHwgKFxkaXNwKQogCU1SWEJPUEMJMCwgMHgzNiwgdjEsIHYzCiAuZW5kbQpAQCAtMzczLDcgKzM3Niw3IEBACiAJVlhfTlVNCXYxLCBcdmZyb20KIAlWWF9OVU0JdjMsIFx2dG8KIAlHUl9OVU0JYjIsIFxiYXNlCSAgICAvKiBCYXNlIHJlZ2lzdGVyICovCi0JLndvcmQJMHhFNzAwIHwgKFZYX1IodjEpIDw8IDQpIHwgVlhfUih2MykKKwkud29yZAkweEU3MDAgfCAoKHYxJjE1KSA8PCA0KSB8ICh2MyYxNSkKIAkud29yZAkoYjIgPDwgMTIpIHwgKFxkaXNwKQogCU1SWEJPUEMJMCwgMHgzRSwgdjEsIHYzCiAuZW5kbQpAQCAtMzg0LDE2ICszODcsMTYgQEAKIAlWWF9OVU0JdjIsIFx2cjIKIAlWWF9OVU0JdjMsIFx2cjMKIAlWWF9OVU0JdjQsIFx2cjQKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCBWWF9SKHYyKQotCS53b3JkCShWWF9SKHYzKSA8PCAxMikKLQlNUlhCT1BDCVZYX1IodjQpLCAweDhDLCB2MSwgdjIsIHYzLCB2NAorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgKHYyJjE1KQorCS53b3JkCSgodjMmMTUpIDw8IDEyKQorCU1SWEJPUEMJKHY0JjE1KSwgMHg4QywgdjEsIHYyLCB2MywgdjQKIC5lbmRtCiAKIC8qIFZFQ1RPUiBVTlBBQ0sgTE9HSUNBTCBMT1cgKi8KIC5tYWNybwlWVVBMTAl2cjEsIHZyMiwgbTMKIAlWWF9OVU0JdjEsIFx2cjEKIAlWWF9OVU0JdjIsIFx2cjIKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCBWWF9SKHYyKQorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgKHYyJjE1KQogCS53b3JkCTB4MDAwMAogCU1SWEJPUEMJXG0zLCAweEQ0LCB2MSwgdjIKIC5lbmRtCkBAIC00MTAsMTMgKzQxMywyMyBAQAogCiAvKiBWZWN0b3IgaW50ZWdlciBpbnN0cnVjdGlvbnMgKi8KIAorLyogVkVDVE9SIEFORCAqLworLm1hY3JvCVZOCXZyMSwgdnIyLCB2cjMKKwlWWF9OVU0JdjEsIFx2cjEKKwlWWF9OVU0JdjIsIFx2cjIKKwlWWF9OVU0JdjMsIFx2cjMKKwkud29yZAkweEU3MDAgfCAoKHYxJjE1KSA8PCA0KSB8ICh2MiYxNSkKKwkud29yZAkoKHYzJjE1KSA8PCAxMikKKwlNUlhCT1BDCTAsIDB4NjgsIHYxLCB2MiwgdjMKKy5lbmRtCisKIC8qIFZFQ1RPUiBFWENMVVNJVkUgT1IgKi8KIC5tYWNybwlWWAl2cjEsIHZyMiwgdnIzCiAJVlhfTlVNCXYxLCBcdnIxCiAJVlhfTlVNCXYyLCBcdnIyCiAJVlhfTlVNCXYzLCBcdnIzCi0JLndvcmQJMHhFNzAwIHwgKFZYX1IodjEpIDw8IDQpIHwgVlhfUih2MikKLQkud29yZAkoVlhfUih2MykgPDwgMTIpCisJLndvcmQJMHhFNzAwIHwgKCh2MSYxNSkgPDwgNCkgfCAodjImMTUpCisJLndvcmQJKCh2MyYxNSkgPDwgMTIpCiAJTVJYQk9QQwkwLCAweDZELCB2MSwgdjIsIHYzCiAuZW5kbQogCkBAIC00MjUsOCArNDM4LDggQEAKIAlWWF9OVU0JdjEsIFx2cjEKIAlWWF9OVU0JdjIsIFx2cjIKIAlWWF9OVU0JdjMsIFx2cjMKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCBWWF9SKHYyKQotCS53b3JkCShWWF9SKHYzKSA8PCAxMikKKwkud29yZAkweEU3MDAgfCAoKHYxJjE1KSA8PCA0KSB8ICh2MiYxNSkKKwkud29yZAkoKHYzJjE1KSA8PCAxMikKIAlNUlhCT1BDCVxtNCwgMHhCNCwgdjEsIHYyLCB2MwogLmVuZG0KIC5tYWNybwlWR0ZNQgl2cjEsIHZyMiwgdnIzCkBAIC00NDgsOSArNDYxLDkgQEAKIAlWWF9OVU0JdjIsIFx2cjIKIAlWWF9OVU0JdjMsIFx2cjMKIAlWWF9OVU0JdjQsIFx2cjQKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCBWWF9SKHYyKQotCS53b3JkCShWWF9SKHYzKSA8PCAxMikgfCAoXG01IDw8IDgpCi0JTVJYQk9QQwlWWF9SKHY0KSwgMHhCQywgdjEsIHYyLCB2MywgdjQKKwkud29yZAkweEU3MDAgfCAoKHYxJjE1KSA8PCA0KSB8ICh2MiYxNSkKKwkud29yZAkoKHYzJjE1KSA8PCAxMikgfCAoXG01IDw8IDgpCisJTVJYQk9QQwkodjQmMTUpLCAweEJDLCB2MSwgdjIsIHYzLCB2NAogLmVuZG0KIC5tYWNybwlWR0ZNQUIJdnIxLCB2cjIsIHZyMywgdnI0CiAJVkdGTUEJXHZyMSwgXHZyMiwgXHZyMywgXHZyNCwgMApAQCAtNDcwLDExICs0ODMsNzggQEAKIAlWWF9OVU0JdjEsIFx2cjEKIAlWWF9OVU0JdjIsIFx2cjIKIAlWWF9OVU0JdjMsIFx2cjMKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCBWWF9SKHYyKQotCS53b3JkCShWWF9SKHYzKSA8PCAxMikKKwkud29yZAkweEU3MDAgfCAoKHYxJjE1KSA8PCA0KSB8ICh2MiYxNSkKKwkud29yZAkoKHYzJjE1KSA8PCAxMikKIAlNUlhCT1BDCTAsIDB4N0QsIHYxLCB2MiwgdjMKIC5lbmRtCiAKKy8qIFZFQ1RPUiBSRVBMSUNBVEUgSU1NRURJQVRFICovCisubWFjcm8JVlJFUEkJdnIxLCBpbW0yLCBtMworCVZYX05VTQl2MSwgXHZyMQorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpCisJLndvcmQJXGltbTIKKwlNUlhCT1BDCVxtMywgMHg0NSwgdjEKKy5lbmRtCisubWFjcm8JVlJFUElCCXZyMSwgaW1tMgorCVZSRVBJCVx2cjEsIFxpbW0yLCAwCisuZW5kbQorLm1hY3JvCVZSRVBJSAl2cjEsIGltbTIKKwlWUkVQSQlcdnIxLCBcaW1tMiwgMQorLmVuZG0KKy5tYWNybwlWUkVQSUYJdnIxLCBpbW0yCisJVlJFUEkJXHZyMSwgXGltbTIsIDIKKy5lbmRtCisubWFjcm8JVlJFUElHCXZyMSwgaW1tMgorCVZSRVAJXHZyMSwgXGltbTIsIDMKKy5lbmRtCisKKy8qIFZFQ1RPUiBBREQgKi8KKy5tYWNybwlWQQl2cjEsIHZyMiwgdnIzLCBtNAorCVZYX05VTQl2MSwgXHZyMQorCVZYX05VTQl2MiwgXHZyMgorCVZYX05VTQl2MywgXHZyMworCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgKHYyJjE1KQorCS53b3JkCSgodjMmMTUpIDw8IDEyKQorCU1SWEJPUEMJXG00LCAweEYzLCB2MSwgdjIsIHYzCisuZW5kbQorLm1hY3JvCVZBQgl2cjEsIHZyMiwgdnIzCisJVkEJXHZyMSwgXHZyMiwgXHZyMywgMAorLmVuZG0KKy5tYWNybwlWQUgJdnIxLCB2cjIsIHZyMworCVZBCVx2cjEsIFx2cjIsIFx2cjMsIDEKKy5lbmRtCisubWFjcm8JVkFGCXZyMSwgdnIyLCB2cjMKKwlWQQlcdnIxLCBcdnIyLCBcdnIzLCAyCisuZW5kbQorLm1hY3JvCVZBRwl2cjEsIHZyMiwgdnIzCisJVkEJXHZyMSwgXHZyMiwgXHZyMywgMworLmVuZG0KKy5tYWNybwlWQVEJdnIxLCB2cjIsIHZyMworCVZBCVx2cjEsIFx2cjIsIFx2cjMsIDQKKy5lbmRtCisKKy8qIFZFQ1RPUiBFTEVNRU5UIFNISUZUIFJJR0hUIEFSSVRITUVUSUMgKi8KKy5tYWNybwlWRVNSQVYJdnIxLCB2cjIsIHZyMywgbTQKKwlWWF9OVU0JdjEsIFx2cjEKKwlWWF9OVU0JdjIsIFx2cjIKKwlWWF9OVU0JdjMsIFx2cjMKKwkud29yZAkweEU3MDAgfCAoKHYxJjE1KSA8PCA0KSB8ICh2MiYxNSkKKwkud29yZAkoKHYzJjE1KSA8PCAxMikKKwlNUlhCT1BDIFxtNCwgMHg3QSwgdjEsIHYyLCB2MworLmVuZG0KKworLm1hY3JvCVZFU1JBVkIJdnIxLCB2cjIsIHZyMworCVZFU1JBVglcdnIxLCBcdnIyLCBcdnIzLCAwCisuZW5kbQorLm1hY3JvCVZFU1JBVkgJdnIxLCB2cjIsIHZyMworCVZFU1JBVglcdnIxLCBcdnIyLCBcdnIzLCAxCisuZW5kbQorLm1hY3JvCVZFU1JBVkYJdnIxLCB2cjIsIHZyMworCVZFU1JBVglcdnIxLCBcdnIyLCBcdnIzLCAyCisuZW5kbQorLm1hY3JvCVZFU1JBVkcJdnIxLCB2cjIsIHZyMworCVZFU1JBVglcdnIxLCBcdnIyLCBcdnIzLCAzCisuZW5kbQogCiAjZW5kaWYJLyogX19BU1NFTUJMWV9fICovCiAjZW5kaWYJLyogX19BU01fUzM5MF9WWF9JTlNOX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL0tidWlsZCBiL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL0tidWlsZAppbmRleCAwOGZlNmRhLi5jYzQ0YjA5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS91YXBpL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvdWFwaS9hc20vS2J1aWxkCkBAIC02LDYgKzYsNyBAQAogaGVhZGVyLXkgKz0gYnl0ZW9yZGVyLmgKIGhlYWRlci15ICs9IGNocGlkLmgKIGhlYWRlci15ICs9IGNoc2MuaAoraGVhZGVyLXkgKz0gY2xwLmgKIGhlYWRlci15ICs9IGNtYi5oCiBoZWFkZXIteSArPSBkYXNkLmgKIGhlYWRlci15ICs9IGRlYnVnLmgKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCmluZGV4IDMyMzQ4MTcuLjcyY2NjNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZQpAQCAtNDgsNiArNDgsOSBAQAogZW5kaWYKIEdDT1ZfUFJPRklMRV9zY2xwLm8gOj0gbgogR0NPVl9QUk9GSUxFX2Fscy5vIDo9IG4KK1VCU0FOX1NBTklUSVpFX2Fscy5vIDo9IG4KK1VCU0FOX1NBTklUSVpFX2Vhcmx5Lm8gOj0gbgorVUJTQU5fU0FOSVRJWkVfc2NscC5vIDo9IG4KIAogb2JqLXkJOj0gdHJhcHMubyB0aW1lLm8gcHJvY2Vzcy5vIGJhc2UubyBlYXJseS5vIHNldHVwLm8gaWRsZS5vIHZ0aW1lLm8KIG9iai15CSs9IHByb2Nlc3Nvci5vIHN5c19zMzkwLm8gcHRyYWNlLm8gc2lnbmFsLm8gY3BjbWQubyBlYmNkaWMubyBubWkubwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jcmFzaF9kdW1wLmMgYi9hcmNoL3MzOTAva2VybmVsL2NyYXNoX2R1bXAuYwppbmRleCAyOWRmODQ4NC4uZjkyOTNiZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jcmFzaF9kdW1wLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jcmFzaF9kdW1wLmMKQEAgLTcxLDkgKzcxLDcgQEAKICAqLwogc3RydWN0IHNhdmVfYXJlYSAqIF9faW5pdCBzYXZlX2FyZWFfYm9vdF9jcHUodm9pZCkKIHsKLQlpZiAobGlzdF9lbXB0eSgmZHVtcF9zYXZlX2FyZWFzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGxpc3RfZmlyc3RfZW50cnkoJmR1bXBfc2F2ZV9hcmVhcywgc3RydWN0IHNhdmVfYXJlYSwgbGlzdCk7CisJcmV0dXJuIGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZHVtcF9zYXZlX2FyZWFzLCBzdHJ1Y3Qgc2F2ZV9hcmVhLCBsaXN0KTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZWFybHkuYyBiL2FyY2gvczM5MC9rZXJuZWwvZWFybHkuYwppbmRleCA3MTdiMDNhLi4yMzc0YzViIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2Vhcmx5LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9lYXJseS5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZnB1LmMgYi9hcmNoL3MzOTAva2VybmVsL2ZwdS5jCmluZGV4IDgxZDFkMTguLjEyMzViOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZnB1LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9mcHUuYwpAQCAtMTAsMjQwICsxMCwxNjcgQEAKICNpbmNsdWRlIDxhc20vZnB1L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2ZwdS9hcGkuaD4KIAotLyoKLSAqIFBlci1DUFUgdmFyaWFibGUgdG8gbWFpbnRhaW4gRlBVIHJlZ2lzdGVyIHJhbmdlcyB0aGF0IGFyZSBpbiB1c2UKLSAqIGJ5IHRoZSBrZXJuZWwuCi0gKi8KLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1MzIsIGtlcm5lbF9mcHVfc3RhdGUpOwotCi0jZGVmaW5lIEtFUk5FTF9GUFVfU1RBVEVfTUFTSwkoS0VSTkVMX0ZQVV9NQVNLfEtFUk5FTF9GUEMpCi0KK2FzbSgiLmluY2x1ZGUgXCJhc20vdngtaW5zbi5oXCJcbiIpOwogCiB2b2lkIF9fa2VybmVsX2ZwdV9iZWdpbihzdHJ1Y3Qga2VybmVsX2ZwdSAqc3RhdGUsIHUzMiBmbGFncykKIHsKLQlpZiAoIV9fdGhpc19jcHVfcmVhZChrZXJuZWxfZnB1X3N0YXRlKSkgewotCQkvKgotCQkgKiBTYXZlIHVzZXIgc3BhY2UgRlBVIHN0YXRlIGFuZCByZWdpc3RlciBjb250ZW50cy4gIE11bHRpcGxlCi0JCSAqIGNhbGxzIGJlY2F1c2Ugb2YgaW50ZXJydXB0aW9ucyBkbyBub3QgbWF0dGVyIGFuZCByZXR1cm4KLQkJICogaW1tZWRpYXRlbHkuICBUaGlzIGFsc28gc2V0cyBDSUZfRlBVIHRvIGxhenkgcmVzdG9yZSBGUC9WWAotCQkgKiByZWdpc3RlciBjb250ZW50cyB3aGVuIHJldHVybmluZyB0byB1c2VyIHNwYWNlLgotCQkgKi8KLQkJc2F2ZV9mcHVfcmVncygpOwotCX0KLQotCS8qIFVwZGF0ZSBmbGFncyB0byB1c2UgdGhlIHZlY3RvciBmYWNpbGl0eSBmb3IgS0VSTkVMX0ZQUiAqLwotCWlmIChNQUNISU5FX0hBU19WWCAmJiAoc3RhdGUtPm1hc2sgJiBLRVJORUxfRlBSKSkgewotCQlmbGFncyB8PSBLRVJORUxfVlhSX0xPVyB8IEtFUk5FTF9GUEM7Ci0JCWZsYWdzICY9IH5LRVJORUxfRlBSOwotCX0KLQotCS8qIFNhdmUgYW5kIHVwZGF0ZSBjdXJyZW50IGtlcm5lbCBWWCBzdGF0ZSAqLwotCXN0YXRlLT5tYXNrID0gX190aGlzX2NwdV9yZWFkKGtlcm5lbF9mcHVfc3RhdGUpOwotCV9fdGhpc19jcHVfb3Ioa2VybmVsX2ZwdV9zdGF0ZSwgZmxhZ3MgJiBLRVJORUxfRlBVX1NUQVRFX01BU0spOwotCiAJLyoKLQkgKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsIHRvIF9fa2VybmVsX2ZwdV9iZWdpbigpLCBubyBhZGRpdGlvbmFsCi0JICogd29yayBpcyByZXF1aXJlZC4KKwkgKiBMaW1pdCB0aGUgc2F2ZSB0byB0aGUgRlBVL3ZlY3RvciByZWdpc3RlcnMgYWxyZWFkeQorCSAqIGluIHVzZSBieSB0aGUgcHJldmlvdXMgY29udGV4dAogCSAqLwotCWlmICghKHN0YXRlLT5tYXNrICYgS0VSTkVMX0ZQVV9TVEFURV9NQVNLKSkKLQkJcmV0dXJuOworCWZsYWdzICY9IHN0YXRlLT5tYXNrOwogCi0JLyoKLQkgKiBJZiBLRVJORUxfRlBSIGlzIHN0aWxsIHNldCwgdGhlIHZlY3RvciBmYWNpbGl0eSBpcyBub3QgYXZhaWxhYmxlCi0JICogYW5kLCB0aHVzLCBzYXZlIGZsb2F0aW5nLXBvaW50IGNvbnRyb2wgYW5kIHJlZ2lzdGVycyBvbmx5LgotCSAqLwotCWlmIChzdGF0ZS0+bWFzayAmIEtFUk5FTF9GUFIpIHsKLQkJYXNtIHZvbGF0aWxlKCJzdGZwYyAlMCIgOiAiPVEiIChzdGF0ZS0+ZnBjKSk7Ci0JCWFzbSB2b2xhdGlsZSgic3RkIDAsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMF0pKTsKLQkJYXNtIHZvbGF0aWxlKCJzdGQgMSwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1sxXSkpOwotCQlhc20gdm9sYXRpbGUoInN0ZCAyLCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzJdKSk7Ci0JCWFzbSB2b2xhdGlsZSgic3RkIDMsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbM10pKTsKLQkJYXNtIHZvbGF0aWxlKCJzdGQgNCwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1s0XSkpOwotCQlhc20gdm9sYXRpbGUoInN0ZCA1LCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzVdKSk7Ci0JCWFzbSB2b2xhdGlsZSgic3RkIDYsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbNl0pKTsKLQkJYXNtIHZvbGF0aWxlKCJzdGQgNywlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1s3XSkpOwotCQlhc20gdm9sYXRpbGUoInN0ZCA4LCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzhdKSk7Ci0JCWFzbSB2b2xhdGlsZSgic3RkIDksJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbOV0pKTsKLQkJYXNtIHZvbGF0aWxlKCJzdGQgMTAsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMTBdKSk7Ci0JCWFzbSB2b2xhdGlsZSgic3RkIDExLCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzExXSkpOwotCQlhc20gdm9sYXRpbGUoInN0ZCAxMiwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1sxMl0pKTsKLQkJYXNtIHZvbGF0aWxlKCJzdGQgMTMsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMTNdKSk7Ci0JCWFzbSB2b2xhdGlsZSgic3RkIDE0LCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzE0XSkpOwotCQlhc20gdm9sYXRpbGUoInN0ZCAxNSwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1sxNV0pKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogSWYgdGhpcyBpcyBhIG5lc3RlZCBjYWxsIHRvIF9fa2VybmVsX2ZwdV9iZWdpbigpLCBjaGVjayB0aGUgc2F2ZWQKLQkgKiBzdGF0ZSBtYXNrIHRvIHNhdmUgYW5kIGxhdGVyIHJlc3RvcmUgdGhlIHZlY3RvciByZWdpc3RlcnMgdGhhdAotCSAqIGFyZSBhbHJlYWR5IGluIHVzZS4JTGV0J3Mgc3RhcnQgd2l0aCBjaGVja2luZyBmbG9hdGluZy1wb2ludAotCSAqIGNvbnRyb2xzLgotCSAqLwotCWlmIChzdGF0ZS0+bWFzayAmIEtFUk5FTF9GUEMpCisJaWYgKGZsYWdzICYgS0VSTkVMX0ZQQykKKwkJLyogU2F2ZSBmbG9hdGluZyBwb2ludCBjb250cm9sICovCiAJCWFzbSB2b2xhdGlsZSgic3RmcGMgJTAiIDogIj1tIiAoc3RhdGUtPmZwYykpOwogCisJaWYgKCFNQUNISU5FX0hBU19WWCkgeworCQlpZiAoZmxhZ3MgJiBLRVJORUxfVlhSX1YwVjcpIHsKKwkJCS8qIFNhdmUgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzICovCisJCQlhc20gdm9sYXRpbGUoInN0ZCAwLCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzBdKSk7CisJCQlhc20gdm9sYXRpbGUoInN0ZCAxLCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzFdKSk7CisJCQlhc20gdm9sYXRpbGUoInN0ZCAyLCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzJdKSk7CisJCQlhc20gdm9sYXRpbGUoInN0ZCAzLCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzNdKSk7CisJCQlhc20gdm9sYXRpbGUoInN0ZCA0LCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzRdKSk7CisJCQlhc20gdm9sYXRpbGUoInN0ZCA1LCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzVdKSk7CisJCQlhc20gdm9sYXRpbGUoInN0ZCA2LCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzZdKSk7CisJCQlhc20gdm9sYXRpbGUoInN0ZCA3LCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzddKSk7CisJCQlhc20gdm9sYXRpbGUoInN0ZCA4LCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzhdKSk7CisJCQlhc20gdm9sYXRpbGUoInN0ZCA5LCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzldKSk7CisJCQlhc20gdm9sYXRpbGUoInN0ZCAxMCwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1sxMF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgic3RkIDExLCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzExXSkpOworCQkJYXNtIHZvbGF0aWxlKCJzdGQgMTIsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMTJdKSk7CisJCQlhc20gdm9sYXRpbGUoInN0ZCAxMywlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1sxM10pKTsKKwkJCWFzbSB2b2xhdGlsZSgic3RkIDE0LCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzE0XSkpOworCQkJYXNtIHZvbGF0aWxlKCJzdGQgMTUsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMTVdKSk7CisJCX0KKwkJcmV0dXJuOworCX0KKwogCS8qIFRlc3QgYW5kIHNhdmUgdmVjdG9yIHJlZ2lzdGVycyAqLwogCWFzbSB2b2xhdGlsZSAoCiAJCS8qCiAJCSAqIFRlc3QgaWYgYW55IHZlY3RvciByZWdpc3RlciBtdXN0IGJlIHNhdmVkIGFuZCwgaWYgc28sCiAJCSAqIHRlc3QgaWYgYWxsIHJlZ2lzdGVyIGNhbiBiZSBzYXZlZC4KIAkJICovCi0JCSIJdG1sbAklW21dLDE1XG4iCS8qIEtFUk5FTF9WWFJfTUFTSyAqLwotCQkiCWp6CTIwZlxuIgkJLyogbm8gd29yayAtPiBkb25lICovCiAJCSIJbGEJMSwlW3Z4cnNdXG4iCS8qIGxvYWQgc2F2ZSBhcmVhICovCi0JCSIJam8JMThmXG4iCQkvKiAtPiBzYXZlIFYwLi5WMzEgKi8KLQorCQkiCXRtbGwJJVttXSwzMFxuIgkvKiBLRVJORUxfVlhSICovCisJCSIJanoJN2ZcbiIJCS8qIG5vIHdvcmsgLT4gZG9uZSAqLworCQkiCWpvCTVmXG4iCQkvKiAtPiBzYXZlIFYwLi5WMzEgKi8KIAkJLyoKLQkJICogVGVzdCBpZiBWOC4uVjIzIGNhbiBiZSBzYXZlZCBhdCBvbmNlLi4uIHRoaXMgc3BlZWRzIHVwCi0JCSAqIGZvciBLRVJORUxfZnB1X01JRCBvbmx5LiBPdGhlcndpc2UgY29udGludWUgdG8gc3BsaXQgdGhlCi0JCSAqIHJhbmdlIG9mIHZlY3RvciByZWdpc3RlcnMgaW50byB0d28gaGFsdmVzIGFuZCB0ZXN0IHRoZW0KLQkJICogc2VwYXJhdGVseS4KKwkJICogVGVzdCBmb3Igc3BlY2lhbCBjYXNlIEtFUk5FTF9GUFVfTUlEIG9ubHkuIEluIHRoaXMKKwkJICogY2FzZSBhIHZzdG0gVjguLlYyMyBpcyB0aGUgYmVzdCBpbnN0cnVjdGlvbgogCQkgKi8KLQkJIgl0bWxsCSVbbV0sNlxuIgkvKiBLRVJORUxfVlhSX01JRCAqLwotCQkiCWpvCTE3ZlxuIgkJLyogLT4gc2F2ZSBWOC4uVjIzICovCi0KKwkJIgljaGkJJVttXSwxMlxuIgkvKiBLRVJORUxfVlhSX01JRCAqLworCQkiCWpuZQkwZlxuIgkJLyogLT4gc2F2ZSBWOC4uVjIzICovCisJCSIJVlNUTQk4LDIzLDEyOCwxXG4iCS8qIHZzdG0gJXY4LCV2MjMsMTI4KCVyMSkgKi8KKwkJIglqCTdmXG4iCiAJCS8qIFRlc3QgYW5kIHNhdmUgdGhlIGZpcnN0IGhhbGYgb2YgMTYgdmVjdG9yIHJlZ2lzdGVycyAqLwotCQkiMToJdG1sbAklW21dLDNcbiIJLyogS0VSTkVMX1ZYUl9MT1cgKi8KLQkJIglqegkxMGZcbiIJCS8qIC0+IEtFUk5FTF9WWFJfSElHSCAqLworCQkiMDoJdG1sbAklW21dLDZcbiIJLyogS0VSTkVMX1ZYUl9MT1cgKi8KKwkJIglqegkzZlxuIgkJLyogLT4gS0VSTkVMX1ZYUl9ISUdIICovCiAJCSIJam8JMmZcbiIJCS8qIDExIC0+IHNhdmUgVjAuLlYxNSAqLwotCQkiCWJyYwk0LDNmXG4iCQkvKiAwMSAtPiBzYXZlIFYwLi5WNyAgKi8KLQkJIglicmMJMiw0ZlxuIgkJLyogMTAgLT4gc2F2ZSBWOC4uVjE1ICovCi0KKwkJIglicmMJMiwxZlxuIgkJLyogMTAgLT4gc2F2ZSBWOC4uVjE1ICovCisJCSIJVlNUTQkwLDcsMCwxXG4iCS8qIHZzdG0gJXYwLCV2NywwKCVyMSkgKi8KKwkJIglqCTNmXG4iCisJCSIxOglWU1RNCTgsMTUsMTI4LDFcbiIJLyogdnN0bSAldjgsJXYxNSwxMjgoJXIxKSAqLworCQkiCWoJM2ZcbiIKKwkJIjI6CVZTVE0JMCwxNSwwLDFcbiIJLyogdnN0bSAldjAsJXYxNSwwKCVyMSkgKi8KIAkJLyogVGVzdCBhbmQgc2F2ZSB0aGUgc2Vjb25kIGhhbGYgb2YgMTYgdmVjdG9yIHJlZ2lzdGVycyAqLwotCQkiMTA6CXRtbGwJJVttXSwxMlxuIgkvKiBLRVJORUxfVlhSX0hJR0ggKi8KLQkJIglqbwkxOWZcbiIJCS8qIDExIC0+IHNhdmUgVjE2Li5WMzEgKi8KLQkJIglicmMJNCwxMWZcbiIJLyogMDEgLT4gc2F2ZSBWMTYuLlYyMwkqLwotCQkiCWJyYwkyLDEyZlxuIgkvKiAxMCAtPiBzYXZlIFYyNC4uVjMxICovCi0JCSIJagkyMGZcbiIJCS8qIDAwIC0+IGRvbmUgKi8KLQotCQkvKgotCQkgKiBCZWxvdyBhcmUgdGhlIHZzdG0gY29tYmluYXRpb25zIHRvIHNhdmUgbXVsdGlwbGUgdmVjdG9yCi0JCSAqIHJlZ2lzdGVycyBhdCBvbmNlLgotCQkgKi8KLQkJIjI6CS53b3JkCTB4ZTcwZiwweDEwMDAsMHgwMDNlXG4iCS8qIHZzdG0gMCwxNSwwKDEpICovCi0JCSIJagkxMGJcbiIJCQkvKiAtPiBWWFJfSElHSCAqLwotCQkiMzoJLndvcmQJMHhlNzA3LDB4MTAwMCwweDAwM2VcbiIgLyogdnN0bSAwLDcsMCgxKSAqLwotCQkiCWoJMTBiXG4iCQkJLyogLT4gVlhSX0hJR0ggKi8KLQkJIjQ6CS53b3JkCTB4ZTc4ZiwweDEwODAsMHgwMDNlXG4iIC8qIHZzdG0gOCwxNSwxMjgoMSkgKi8KLQkJIglqCTEwYlxuIgkJCS8qIC0+IFZYUl9ISUdIICovCi0JCSJcbiIKLQkJIjExOgkud29yZAkweGU3MDcsMHgxMTAwLDB4MGMzZVxuIgkvKiB2c3RtIDE2LDIzLDI1NigxKSAqLwotCQkiCWoJMjBmXG4iCQkJLyogLT4gZG9uZSAqLwotCQkiMTI6CS53b3JkCTB4ZTc4ZiwweDExODAsMHgwYzNlXG4iIC8qIHZzdG0gMjQsMzEsMzg0KDEpICovCi0JCSIJagkyMGZcbiIJCQkvKiAtPiBkb25lICovCi0JCSJcbiIKLQkJIjE3Ogkud29yZAkweGU3ODcsMHgxMDgwLDB4MDQzZVxuIgkvKiB2c3RtIDgsMjMsMTI4KDEpICovCi0JCSIJbmlsbAklW21dLDI0OVxuIgkJLyogbSAmPSB+VlhSX01JRCAgICAqLwotCQkiCWoJMWJcbiIJCQkvKiAtPiBWWFJfTE9XICovCi0JCSJcbiIKLQkJIjE4Ogkud29yZAkweGU3MGYsMHgxMDAwLDB4MDAzZVxuIgkvKiB2c3RtIDAsMTUsMCgxKSAqLwotCQkiMTk6CS53b3JkCTB4ZTcwZiwweDExMDAsMHgwYzNlXG4iCS8qIHZzdG0gMTYsMzEsMjU2KDEpICovCi0JCSIyMDoiCisJCSIzOgl0bWxsCSVbbV0sMjRcbiIJLyogS0VSTkVMX1ZYUl9ISUdIICovCisJCSIJanoJN2ZcbiIKKwkJIglqbwk2ZlxuIgkJLyogMTEgLT4gc2F2ZSBWMTYuLlYzMSAqLworCQkiCWJyYwkyLDRmXG4iCQkvKiAxMCAtPiBzYXZlIFYyNC4uVjMxICovCisJCSIJVlNUTQkxNiwyMywyNTYsMVxuIgkvKiB2c3RtICV2MTYsJXYyMywyNTYoJXIxKSAqLworCQkiCWoJN2ZcbiIKKwkJIjQ6CVZTVE0JMjQsMzEsMzg0LDFcbiIJLyogdnN0bSAldjI0LCV2MzEsMzg0KCVyMSkgKi8KKwkJIglqCTdmXG4iCisJCSI1OglWU1RNCTAsMTUsMCwxXG4iCS8qIHZzdG0gJXYwLCV2MTUsMCglcjEpICovCisJCSI2OglWU1RNCTE2LDMxLDI1NiwxXG4iCS8qIHZzdG0gJXYxNiwldjMxLDI1NiglcjEpICovCisJCSI3OiIKIAkJOiBbdnhyc10gIj1RIiAoKihzdHJ1Y3QgdnhfYXJyYXkgKikgJnN0YXRlLT52eHJzKQotCQk6IFttXSAiZCIgKHN0YXRlLT5tYXNrKQorCQk6IFttXSAiZCIgKGZsYWdzKQogCQk6ICIxIiwgImNjIik7CiB9CiBFWFBPUlRfU1lNQk9MKF9fa2VybmVsX2ZwdV9iZWdpbik7CiAKLXZvaWQgX19rZXJuZWxfZnB1X2VuZChzdHJ1Y3Qga2VybmVsX2ZwdSAqc3RhdGUpCit2b2lkIF9fa2VybmVsX2ZwdV9lbmQoc3RydWN0IGtlcm5lbF9mcHUgKnN0YXRlLCB1MzIgZmxhZ3MpCiB7Ci0JLyogSnVzdCB1cGRhdGUgdGhlIHBlci1DUFUgc3RhdGUgaWYgdGhlcmUgaXMgbm90aGluZyB0byByZXN0b3JlICovCi0JaWYgKCEoc3RhdGUtPm1hc2sgJiBLRVJORUxfRlBVX1NUQVRFX01BU0spKQotCQlnb3RvIHVwZGF0ZV9mcHVfc3RhdGU7Ci0KIAkvKgotCSAqIElmIEtFUk5FTF9GUFIgaXMgc3BlY2lmaWVkLCB0aGUgdmVjdG9yIGZhY2lsaXR5IGlzIG5vdCBhdmFpbGFibGUKLQkgKiBhbmQsIHRodXMsIHJlc3RvcmUgZmxvYXRpbmctcG9pbnQgY29udHJvbCBhbmQgcmVnaXN0ZXJzIG9ubHkuCisJICogTGltaXQgdGhlIHJlc3RvcmUgdG8gdGhlIEZQVS92ZWN0b3IgcmVnaXN0ZXJzIG9mIHRoZQorCSAqIHByZXZpb3VzIGNvbnRleHQgdGhhdCBoYXZlIGJlZW4gb3ZlcndyaXR0ZSBieSB0aGUKKwkgKiBjdXJyZW50IGNvbnRleHQKIAkgKi8KLQlpZiAoc3RhdGUtPm1hc2sgJiBLRVJORUxfRlBSKSB7Ci0JCWFzbSB2b2xhdGlsZSgibGZwYyAlMCIgOiA6ICJRIiAoc3RhdGUtPmZwYykpOwotCQlhc20gdm9sYXRpbGUoImxkIDAsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzBdKSk7Ci0JCWFzbSB2b2xhdGlsZSgibGQgMSwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMV0pKTsKLQkJYXNtIHZvbGF0aWxlKCJsZCAyLCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1syXSkpOwotCQlhc20gdm9sYXRpbGUoImxkIDMsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzNdKSk7Ci0JCWFzbSB2b2xhdGlsZSgibGQgNCwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbNF0pKTsKLQkJYXNtIHZvbGF0aWxlKCJsZCA1LCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1s1XSkpOwotCQlhc20gdm9sYXRpbGUoImxkIDYsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzZdKSk7Ci0JCWFzbSB2b2xhdGlsZSgibGQgNywlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbN10pKTsKLQkJYXNtIHZvbGF0aWxlKCJsZCA4LCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1s4XSkpOwotCQlhc20gdm9sYXRpbGUoImxkIDksJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzldKSk7Ci0JCWFzbSB2b2xhdGlsZSgibGQgMTAsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzEwXSkpOwotCQlhc20gdm9sYXRpbGUoImxkIDExLCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1sxMV0pKTsKLQkJYXNtIHZvbGF0aWxlKCJsZCAxMiwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMTJdKSk7Ci0JCWFzbSB2b2xhdGlsZSgibGQgMTMsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzEzXSkpOwotCQlhc20gdm9sYXRpbGUoImxkIDE0LCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1sxNF0pKTsKLQkJYXNtIHZvbGF0aWxlKCJsZCAxNSwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMTVdKSk7Ci0JCWdvdG8gdXBkYXRlX2ZwdV9zdGF0ZTsKLQl9CisJZmxhZ3MgJj0gc3RhdGUtPm1hc2s7CiAKLQkvKiBUZXN0IGFuZCByZXN0b3JlIGZsb2F0aW5nLXBvaW50IGNvbnRyb2xzICovCi0JaWYgKHN0YXRlLT5tYXNrICYgS0VSTkVMX0ZQQykKKwlpZiAoZmxhZ3MgJiBLRVJORUxfRlBDKQorCQkvKiBSZXN0b3JlIGZsb2F0aW5nLXBvaW50IGNvbnRyb2xzICovCiAJCWFzbSB2b2xhdGlsZSgibGZwYyAlMCIgOiA6ICJRIiAoc3RhdGUtPmZwYykpOwogCisJaWYgKCFNQUNISU5FX0hBU19WWCkgeworCQlpZiAoZmxhZ3MgJiBLRVJORUxfVlhSX1YwVjcpIHsKKwkJCS8qIFJlc3RvcmUgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzICovCisJCQlhc20gdm9sYXRpbGUoImxkIDAsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzBdKSk7CisJCQlhc20gdm9sYXRpbGUoImxkIDEsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzFdKSk7CisJCQlhc20gdm9sYXRpbGUoImxkIDIsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzJdKSk7CisJCQlhc20gdm9sYXRpbGUoImxkIDMsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzNdKSk7CisJCQlhc20gdm9sYXRpbGUoImxkIDQsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzRdKSk7CisJCQlhc20gdm9sYXRpbGUoImxkIDUsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzVdKSk7CisJCQlhc20gdm9sYXRpbGUoImxkIDYsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzZdKSk7CisJCQlhc20gdm9sYXRpbGUoImxkIDcsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzddKSk7CisJCQlhc20gdm9sYXRpbGUoImxkIDgsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzhdKSk7CisJCQlhc20gdm9sYXRpbGUoImxkIDksJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzldKSk7CisJCQlhc20gdm9sYXRpbGUoImxkIDEwLCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1sxMF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgibGQgMTEsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzExXSkpOworCQkJYXNtIHZvbGF0aWxlKCJsZCAxMiwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMTJdKSk7CisJCQlhc20gdm9sYXRpbGUoImxkIDEzLCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1sxM10pKTsKKwkJCWFzbSB2b2xhdGlsZSgibGQgMTQsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzE0XSkpOworCQkJYXNtIHZvbGF0aWxlKCJsZCAxNSwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMTVdKSk7CisJCX0KKwkJcmV0dXJuOworCX0KKwogCS8qIFRlc3QgYW5kIHJlc3RvcmUgKGxvYWQpIHZlY3RvciByZWdpc3RlcnMgKi8KIAlhc20gdm9sYXRpbGUgKAogCQkvKgotCQkgKiBUZXN0IGlmIGFueSB2ZWN0b3IgcmVnaXN0ZXJzIG11c3QgYmUgbG9hZGVkIGFuZCwgaWYgc28sCisJCSAqIFRlc3QgaWYgYW55IHZlY3RvciByZWdpc3RlciBtdXN0IGJlIGxvYWRlZCBhbmQsIGlmIHNvLAogCQkgKiB0ZXN0IGlmIGFsbCByZWdpc3RlcnMgY2FuIGJlIGxvYWRlZCBhdCBvbmNlLgogCQkgKi8KLQkJIgl0bWxsCSVbbV0sMTVcbiIJLyogS0VSTkVMX1ZYUl9NQVNLICovCi0JCSIJanoJMjBmXG4iCQkvKiBubyB3b3JrIC0+IGRvbmUgKi8KLQkJIglsYQkxLCVbdnhyc11cbiIJLyogbG9hZCBsb2FkIGFyZWEgKi8KLQkJIglqbwkxOGZcbiIJCS8qIC0+IGxvYWQgVjAuLlYzMSAqLwotCisJCSIJbGEJMSwlW3Z4cnNdXG4iCS8qIGxvYWQgcmVzdG9yZSBhcmVhICovCisJCSIJdG1sbAklW21dLDMwXG4iCS8qIEtFUk5FTF9WWFIgKi8KKwkJIglqegk3ZlxuIgkJLyogbm8gd29yayAtPiBkb25lICovCisJCSIJam8JNWZcbiIJCS8qIC0+IHJlc3RvcmUgVjAuLlYzMSAqLwogCQkvKgotCQkgKiBUZXN0IGlmIFY4Li5WMjMgY2FuIGJlIHJlc3RvcmVkIGF0IG9uY2UuLi4gdGhpcyBzcGVlZHMgdXAKLQkJICogZm9yIEtFUk5FTF9WWFJfTUlEIG9ubHkuIE90aGVyd2lzZSBjb250aW51ZSB0byBzcGxpdCB0aGUKLQkJICogcmFuZ2Ugb2YgdmVjdG9yIHJlZ2lzdGVycyBpbnRvIHR3byBoYWx2ZXMgYW5kIHRlc3QgdGhlbQotCQkgKiBzZXBhcmF0ZWx5LgorCQkgKiBUZXN0IGZvciBzcGVjaWFsIGNhc2UgS0VSTkVMX0ZQVV9NSUQgb25seS4gSW4gdGhpcworCQkgKiBjYXNlIGEgdmxtIFY4Li5WMjMgaXMgdGhlIGJlc3QgaW5zdHJ1Y3Rpb24KIAkJICovCi0JCSIJdG1sbAklW21dLDZcbiIJLyogS0VSTkVMX1ZYUl9NSUQgKi8KLQkJIglqbwkxN2ZcbiIJCS8qIC0+IGxvYWQgVjguLlYyMyAqLwotCi0JCS8qIFRlc3QgYW5kIGxvYWQgdGhlIGZpcnN0IGhhbGYgb2YgMTYgdmVjdG9yIHJlZ2lzdGVycyAqLwotCQkiMToJdG1sbAklW21dLDNcbiIJLyogS0VSTkVMX1ZYUl9MT1cgKi8KLQkJIglqegkxMGZcbiIJCS8qIC0+IEtFUk5FTF9WWFJfSElHSCAqLwotCQkiCWpvCTJmXG4iCQkvKiAxMSAtPiBsb2FkIFYwLi5WMTUgKi8KLQkJIglicmMJNCwzZlxuIgkJLyogMDEgLT4gbG9hZCBWMC4uVjcgICovCi0JCSIJYnJjCTIsNGZcbiIJCS8qIDEwIC0+IGxvYWQgVjguLlYxNSAqLwotCi0JCS8qIFRlc3QgYW5kIGxvYWQgdGhlIHNlY29uZCBoYWxmIG9mIDE2IHZlY3RvciByZWdpc3RlcnMgKi8KLQkJIjEwOgl0bWxsCSVbbV0sMTJcbiIJLyogS0VSTkVMX1ZYUl9ISUdIICovCi0JCSIJam8JMTlmXG4iCQkvKiAxMSAtPiBsb2FkIFYxNi4uVjMxICovCi0JCSIJYnJjCTQsMTFmXG4iCS8qIDAxIC0+IGxvYWQgVjE2Li5WMjMJKi8KLQkJIglicmMJMiwxMmZcbiIJLyogMTAgLT4gbG9hZCBWMjQuLlYzMSAqLwotCQkiCWoJMjBmXG4iCQkvKiAwMCAtPiBkb25lICovCi0KLQkJLyoKLQkJICogQmVsb3cgYXJlIHRoZSB2c3RtIGNvbWJpbmF0aW9ucyB0byBsb2FkIG11bHRpcGxlIHZlY3RvcgotCQkgKiByZWdpc3RlcnMgYXQgb25jZS4KLQkJICovCi0JCSIyOgkud29yZAkweGU3MGYsMHgxMDAwLDB4MDAzNlxuIgkvKiB2bG0gMCwxNSwwKDEpICovCi0JCSIJagkxMGJcbiIJCQkvKiAtPiBWWFJfSElHSCAqLwotCQkiMzoJLndvcmQJMHhlNzA3LDB4MTAwMCwweDAwMzZcbiIgLyogdmxtIDAsNywwKDEpICovCi0JCSIJagkxMGJcbiIJCQkvKiAtPiBWWFJfSElHSCAqLwotCQkiNDoJLndvcmQJMHhlNzhmLDB4MTA4MCwweDAwMzZcbiIgLyogdmxtIDgsMTUsMTI4KDEpICovCi0JCSIJagkxMGJcbiIJCQkvKiAtPiBWWFJfSElHSCAqLwotCQkiXG4iCi0JCSIxMToJLndvcmQJMHhlNzA3LDB4MTEwMCwweDBjMzZcbiIJLyogdmxtIDE2LDIzLDI1NigxKSAqLwotCQkiCWoJMjBmXG4iCQkJLyogLT4gZG9uZSAqLwotCQkiMTI6CS53b3JkCTB4ZTc4ZiwweDExODAsMHgwYzM2XG4iIC8qIHZsbSAyNCwzMSwzODQoMSkgKi8KLQkJIglqCTIwZlxuIgkJCS8qIC0+IGRvbmUgKi8KLQkJIlxuIgotCQkiMTc6CS53b3JkCTB4ZTc4NywweDEwODAsMHgwNDM2XG4iCS8qIHZsbSA4LDIzLDEyOCgxKSAqLwotCQkiCW5pbGwJJVttXSwyNDlcbiIJCS8qIG0gJj0gflZYUl9NSUQgICAgKi8KLQkJIglqCTFiXG4iCQkJLyogLT4gVlhSX0xPVyAqLwotCQkiXG4iCi0JCSIxODoJLndvcmQJMHhlNzBmLDB4MTAwMCwweDAwMzZcbiIJLyogdmxtIDAsMTUsMCgxKSAqLwotCQkiMTk6CS53b3JkCTB4ZTcwZiwweDExMDAsMHgwYzM2XG4iCS8qIHZsbSAxNiwzMSwyNTYoMSkgKi8KLQkJIjIwOiIKLQkJOgotCQk6IFt2eHJzXSAiUSIgKCooc3RydWN0IHZ4X2FycmF5ICopICZzdGF0ZS0+dnhycyksCi0JCSAgW21dICJkIiAoc3RhdGUtPm1hc2spCisJCSIJY2hpCSVbbV0sMTJcbiIJLyogS0VSTkVMX1ZYUl9NSUQgKi8KKwkJIglqbmUJMGZcbiIJCS8qIC0+IHJlc3RvcmUgVjguLlYyMyAqLworCQkiCVZMTQk4LDIzLDEyOCwxXG4iCS8qIHZsbSAldjgsJXYyMywxMjgoJXIxKSAqLworCQkiCWoJN2ZcbiIKKwkJLyogVGVzdCBhbmQgcmVzdG9yZSB0aGUgZmlyc3QgaGFsZiBvZiAxNiB2ZWN0b3IgcmVnaXN0ZXJzICovCisJCSIwOgl0bWxsCSVbbV0sNlxuIgkvKiBLRVJORUxfVlhSX0xPVyAqLworCQkiCWp6CTNmXG4iCQkvKiAtPiBLRVJORUxfVlhSX0hJR0ggKi8KKwkJIglqbwkyZlxuIgkJLyogMTEgLT4gcmVzdG9yZSBWMC4uVjE1ICovCisJCSIJYnJjCTIsMWZcbiIJCS8qIDEwIC0+IHJlc3RvcmUgVjguLlYxNSAqLworCQkiCVZMTQkwLDcsMCwxXG4iCS8qIHZsbSAldjAsJXY3LDAoJXIxKSAqLworCQkiCWoJM2ZcbiIKKwkJIjE6CVZMTQk4LDE1LDEyOCwxXG4iCS8qIHZsbSAldjgsJXYxNSwxMjgoJXIxKSAqLworCQkiCWoJM2ZcbiIKKwkJIjI6CVZMTQkwLDE1LDAsMVxuIgkvKiB2bG0gJXYwLCV2MTUsMCglcjEpICovCisJCS8qIFRlc3QgYW5kIHJlc3RvcmUgdGhlIHNlY29uZCBoYWxmIG9mIDE2IHZlY3RvciByZWdpc3RlcnMgKi8KKwkJIjM6CXRtbGwJJVttXSwyNFxuIgkvKiBLRVJORUxfVlhSX0hJR0ggKi8KKwkJIglqegk3ZlxuIgorCQkiCWpvCTZmXG4iCQkvKiAxMSAtPiByZXN0b3JlIFYxNi4uVjMxICovCisJCSIJYnJjCTIsNGZcbiIJCS8qIDEwIC0+IHJlc3RvcmUgVjI0Li5WMzEgKi8KKwkJIglWTE0JMTYsMjMsMjU2LDFcbiIJLyogdmxtICV2MTYsJXYyMywyNTYoJXIxKSAqLworCQkiCWoJN2ZcbiIKKwkJIjQ6CVZMTQkyNCwzMSwzODQsMVxuIgkvKiB2bG0gJXYyNCwldjMxLDM4NCglcjEpICovCisJCSIJagk3ZlxuIgorCQkiNToJVkxNCTAsMTUsMCwxXG4iCS8qIHZsbSAldjAsJXYxNSwwKCVyMSkgKi8KKwkJIjY6CVZMTQkxNiwzMSwyNTYsMVxuIgkvKiB2bG0gJXYxNiwldjMxLDI1NiglcjEpICovCisJCSI3OiIKKwkJOiBbdnhyc10gIj1RIiAoKihzdHJ1Y3QgdnhfYXJyYXkgKikgJnN0YXRlLT52eHJzKQorCQk6IFttXSAiZCIgKGZsYWdzKQogCQk6ICIxIiwgImNjIik7Ci0KLXVwZGF0ZV9mcHVfc3RhdGU6Ci0JLyogVXBkYXRlIGN1cnJlbnQga2VybmVsIFZYIHN0YXRlICovCi0JX190aGlzX2NwdV93cml0ZShrZXJuZWxfZnB1X3N0YXRlLCBzdGF0ZS0+bWFzayk7CiB9CiBFWFBPUlRfU1lNQk9MKF9fa2VybmVsX2ZwdV9lbmQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gvczM5MC9rZXJuZWwvZnRyYWNlLmMKaW5kZXggMGY3YmZlYi4uNjBhOGE0ZSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2Z0cmFjZS5jCkBAIC0yMDksNyArMjA5LDggQEAKIAkvKiBPbmx5IHRyYWNlIGlmIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGV4cGVjdHMgdG8uICovCiAJaWYgKCFmdHJhY2VfZ3JhcGhfZW50cnkoJnRyYWNlKSkKIAkJZ290byBvdXQ7Ci0JaWYgKGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZShwYXJlbnQsIGlwLCAmdHJhY2UuZGVwdGgsIDApID09IC1FQlVTWSkKKwlpZiAoZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKHBhcmVudCwgaXAsICZ0cmFjZS5kZXB0aCwgMCwKKwkJCQkgICAgIE5VTEwpID09IC1FQlVTWSkKIAkJZ290byBvdXQ7CiAJcGFyZW50ID0gKHVuc2lnbmVkIGxvbmcpIHJldHVybl90b19oYW5kbGVyOwogb3V0OgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkLlMgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQuUwppbmRleCA1NmU0ZDgyLi40NDMxOTA1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2hlYWQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQuUwpAQCAtMzA5LDcgKzMwOSw5IEBACiAJbAklcjE1LC5Mc3RhY2stLkxQRzAoJXIxMykKIAlhaGkJJXIxNSwtU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIAlicmFzbAklcjE0LHZlcmlmeV9mYWNpbGl0aWVzCi0JLyogQ29udGludWUgd2l0aCBzdGFydHVwIGNvZGUgaW4gaGVhZDY0LlMgKi8KKyMgRm9yIHVuY29tcHJlc3NlZCBpbWFnZXMsIGNvbnRpbnVlIGluCisjIGFyY2gvczM5MC9rZXJuZWwvaGVhZDY0LlMuIEZvciBjb21wcmVzc2VkIGltYWdlcywgY29udGludWUgaW4KKyMgYXJjaC9zMzkwL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMuCiAJamcJc3RhcnR1cF9jb250aW51ZQogCiAuTHN0YWNrOgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYwppbmRleCBkZDYzMDZjLi5mZGI0MDQyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYwpAQCAtMjYsMTIgKzI2LDE0IEBACiAjaW5jbHVkZSA8bGludXgvc3RvcF9tYWNoaW5lLmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vZGlzLmg+CiAKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBrcHJvYmUgKiwgY3VycmVudF9rcHJvYmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9ubWkuYyBiL2FyY2gvczM5MC9rZXJuZWwvbm1pLmMKaW5kZXggMjkzNzZmMC4uOWEzMmY3NCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9ubWkuYworKysgYi9hcmNoL3MzOTAva2VybmVsL25taS5jCkBAIC05OCw3ICs5OCw3IEBACiAgKiByZXR1cm5zIDAgaWYgYWxsIHJlZ2lzdGVycyBjb3VsZCBiZSB2YWxpZGF0ZWQKICAqIHJldHVybnMgMSBvdGhlcndpc2UKICAqLwotc3RhdGljIGludCBub3RyYWNlIHMzOTBfdmFsaWRhdGVfcmVnaXN0ZXJzKHVuaW9uIG1jaSBtY2kpCitzdGF0aWMgaW50IG5vdHJhY2UgczM5MF92YWxpZGF0ZV9yZWdpc3RlcnModW5pb24gbWNpIG1jaSwgaW50IHVtb2RlKQogewogCWludCBraWxsX3Rhc2s7CiAJdTY0IHplcm87CkBAIC0xMTAsMjYgKzExMCw0MSBAQAogCWlmICghbWNpLmdyKSB7CiAJCS8qCiAJCSAqIEdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgY291bGRuJ3QgYmUgcmVzdG9yZWQgYW5kIGhhdmUKLQkJICogdW5rbm93biBjb250ZW50cy4gUHJvY2VzcyBuZWVkcyB0byBiZSB0ZXJtaW5hdGVkLgorCQkgKiB1bmtub3duIGNvbnRlbnRzLiBTdG9wIHN5c3RlbSBvciB0ZXJtaW5hdGUgcHJvY2Vzcy4KIAkJICovCisJCWlmICghdW1vZGUpCisJCQlzMzkwX2hhbmRsZV9kYW1hZ2UoKTsKIAkJa2lsbF90YXNrID0gMTsKIAl9CiAJaWYgKCFtY2kuZnApIHsKIAkJLyoKLQkJICogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGNhbid0IGJlIHJlc3RvcmVkIGFuZAotCQkgKiB0aGVyZWZvcmUgdGhlIHByb2Nlc3MgbmVlZHMgdG8gYmUgdGVybWluYXRlZC4KKwkJICogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGNhbid0IGJlIHJlc3RvcmVkLiBJZiB0aGUKKwkJICoga2VybmVsIGN1cnJlbnRseSB1c2VzIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyB0aGUKKwkJICogc3lzdGVtIGlzIHN0b3BwZWQuIElmIHRoZSBwcm9jZXNzIGhhcyBpdHMgZmxvYXRpbmcKKwkJICogcG9pbnRlciByZWdpc3RlcnMgbG9hZGVkIGl0IGlzIHRlcm1pbmF0ZWQuCisJCSAqIE90aGVyd2lzZSBqdXN0IHJldmFsaWRhdGUgdGhlIHJlZ2lzdGVycy4KIAkJICovCi0JCWtpbGxfdGFzayA9IDE7CisJCWlmIChTMzkwX2xvd2NvcmUuZnB1X2ZsYWdzICYgS0VSTkVMX1ZYUl9WMFY3KQorCQkJczM5MF9oYW5kbGVfZGFtYWdlKCk7CisJCWlmICghdGVzdF9jcHVfZmxhZyhDSUZfRlBVKSkKKwkJCWtpbGxfdGFzayA9IDE7CiAJfQogCWZwdF9zYXZlX2FyZWEgPSAmUzM5MF9sb3djb3JlLmZsb2F0aW5nX3B0X3NhdmVfYXJlYTsKIAlmcHRfY3JlZ19zYXZlX2FyZWEgPSAmUzM5MF9sb3djb3JlLmZwdF9jcmVnX3NhdmVfYXJlYTsKIAlpZiAoIW1jaS5mYykgewogCQkvKgogCQkgKiBGbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVyIGNhbid0IGJlIHJlc3RvcmVkLgotCQkgKiBUYXNrIHdpbGwgYmUgdGVybWluYXRlZC4KKwkJICogSWYgdGhlIGtlcm5lbCBjdXJyZW50bHkgdXNlcyB0aGUgZmxvYXRpbmcgcG9pbnRlcgorCQkgKiByZWdpc3RlcnMgYW5kIG5lZWRzIHRoZSBGUEMgcmVnaXN0ZXIgdGhlIHN5c3RlbSBpcworCQkgKiBzdG9wcGVkLiBJZiB0aGUgcHJvY2VzcyBoYXMgaXRzIGZsb2F0aW5nIHBvaW50ZXIKKwkJICogcmVnaXN0ZXJzIGxvYWRlZCBpdCBpcyB0ZXJtaW5hdGVkLiBPdGhlcndpZXNlIHRoZQorCQkgKiBGUEMgaXMganVzdCByZXZhbGlkYXRlZC4KIAkJICovCisJCWlmIChTMzkwX2xvd2NvcmUuZnB1X2ZsYWdzICYgS0VSTkVMX0ZQQykKKwkJCXMzOTBfaGFuZGxlX2RhbWFnZSgpOwogCQlhc20gdm9sYXRpbGUoImxmcGMgMCglMCkiIDogOiAiYSIgKCZ6ZXJvKSwgIm0iICh6ZXJvKSk7Ci0JCWtpbGxfdGFzayA9IDE7CisJCWlmICghdGVzdF9jcHVfZmxhZyhDSUZfRlBVKSkKKwkJCWtpbGxfdGFzayA9IDE7CiAJfSBlbHNlCiAJCWFzbSB2b2xhdGlsZSgibGZwYyAwKCUwKSIgOiA6ICJhIiAoZnB0X2NyZWdfc2F2ZV9hcmVhKSk7CiAKQEAgLTE1OSwxMCArMTc0LDE2IEBACiAKIAkJaWYgKCFtY2kudnIpIHsKIAkJCS8qCi0JCQkgKiBWZWN0b3IgcmVnaXN0ZXJzIGNhbid0IGJlIHJlc3RvcmVkIGFuZCB0aGVyZWZvcmUKLQkJCSAqIHRoZSBwcm9jZXNzIG5lZWRzIHRvIGJlIHRlcm1pbmF0ZWQuCisJCQkgKiBWZWN0b3IgcmVnaXN0ZXJzIGNhbid0IGJlIHJlc3RvcmVkLiBJZiB0aGUga2VybmVsCisJCQkgKiBjdXJyZW50bHkgdXNlcyB2ZWN0b3IgcmVnaXN0ZXJzIHRoZSBzeXN0ZW0gaXMKKwkJCSAqIHN0b3BwZWQuIElmIHRoZSBwcm9jZXNzIGhhcyBpdHMgdmVjdG9yIHJlZ2lzdGVycworCQkJICogbG9hZGVkIGl0IGlzIHRlcm1pbmF0ZWQuIE90aGVyd2lzZSBqdXN0IHJldmFsaWRhdGUKKwkJCSAqIHRoZSByZWdpc3RlcnMuCiAJCQkgKi8KLQkJCWtpbGxfdGFzayA9IDE7CisJCQlpZiAoUzM5MF9sb3djb3JlLmZwdV9mbGFncyAmIEtFUk5FTF9WWFIpCisJCQkJczM5MF9oYW5kbGVfZGFtYWdlKCk7CisJCQlpZiAoIXRlc3RfY3B1X2ZsYWcoQ0lGX0ZQVSkpCisJCQkJa2lsbF90YXNrID0gMTsKIAkJfQogCQljcjAudmFsID0gUzM5MF9sb3djb3JlLmNyZWdzX3NhdmVfYXJlYVswXTsKIAkJY3IwLmFmcCA9IGNyMC52eCA9IDE7CkBAIC0yNTAsMTMgKzI3MSwxMSBAQAogCXN0cnVjdCBtY2NrX3N0cnVjdCAqbWNjazsKIAl1bnNpZ25lZCBsb25nIGxvbmcgdG1wOwogCXVuaW9uIG1jaSBtY2k7Ci0JaW50IHVtb2RlOwogCiAJbm1pX2VudGVyKCk7CiAJaW5jX2lycV9zdGF0KE5NSV9OTUkpOwogCW1jaS52YWwgPSBTMzkwX2xvd2NvcmUubWNja19pbnRlcnJ1cHRpb25fY29kZTsKIAltY2NrID0gdGhpc19jcHVfcHRyKCZjcHVfbWNjayk7Ci0JdW1vZGUgPSB1c2VyX21vZGUocmVncyk7CiAKIAlpZiAobWNpLnNkKSB7CiAJCS8qIFN5c3RlbSBkYW1hZ2UgLT4gc3RvcHBpbmcgbWFjaGluZSAqLwpAQCAtMjk3LDIyICszMTYsMTQgQEAKIAkJCXMzOTBfaGFuZGxlX2RhbWFnZSgpOwogCQl9CiAJfQotCWlmIChzMzkwX3ZhbGlkYXRlX3JlZ2lzdGVycyhtY2kpKSB7Ci0JCWlmICh1bW9kZSkgewotCQkJLyoKLQkJCSAqIENvdWxkbid0IHJlc3RvcmUgYWxsIHJlZ2lzdGVyIGNvbnRlbnRzIHdoaWxlIGluCi0JCQkgKiB1c2VyIG1vZGUgLT4gbWFyayB0YXNrIGZvciB0ZXJtaW5hdGlvbi4KLQkJCSAqLwotCQkJbWNjay0+a2lsbF90YXNrID0gMTsKLQkJCW1jY2stPm1jY2tfY29kZSA9IG1jaS52YWw7Ci0JCQlzZXRfY3B1X2ZsYWcoQ0lGX01DQ0tfUEVORElORyk7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogQ291bGRuJ3QgcmVzdG9yZSBhbGwgcmVnaXN0ZXIgY29udGVudHMgd2hpbGUgaW4KLQkJCSAqIGtlcm5lbCBtb2RlIC0+IHN0b3BwaW5nIG1hY2hpbmUuCi0JCQkgKi8KLQkJCXMzOTBfaGFuZGxlX2RhbWFnZSgpOwotCQl9CisJaWYgKHMzOTBfdmFsaWRhdGVfcmVnaXN0ZXJzKG1jaSwgdXNlcl9tb2RlKHJlZ3MpKSkgeworCQkvKgorCQkgKiBDb3VsZG4ndCByZXN0b3JlIGFsbCByZWdpc3RlciBjb250ZW50cyBmb3IgdGhlCisJCSAqIHVzZXIgc3BhY2UgcHJvY2VzcyAtPiBtYXJrIHRhc2sgZm9yIHRlcm1pbmF0aW9uLgorCQkgKi8KKwkJbWNjay0+a2lsbF90YXNrID0gMTsKKwkJbWNjay0+bWNja19jb2RlID0gbWNpLnZhbDsKKwkJc2V0X2NwdV9mbGFnKENJRl9NQ0NLX1BFTkRJTkcpOwogCX0KIAlpZiAobWNpLmNkKSB7CiAJCS8qIFRpbWluZyBmYWNpbGl0eSBkYW1hZ2UgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYwppbmRleCBiYTVmNDU2Li43ZjdiYTVmMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYwpAQCAtMjA0LDExICsyMDQsOSBAQAogI2VuZGlmCiAJCX0KIAl9IGVsc2UgaWYgKE1BQ0hJTkVfSVNfS1ZNKSB7Ci0JCWlmIChzY2xwLmhhc192dDIyMCAmJgotCQkgICAgY29uZmlnX2VuYWJsZWQoQ09ORklHX1NDTFBfVlQyMjBfQ09OU09MRSkpCisJCWlmIChzY2xwLmhhc192dDIyMCAmJiBJU19FTkFCTEVEKENPTkZJR19TQ0xQX1ZUMjIwX0NPTlNPTEUpKQogCQkJU0VUX0NPTlNPTEVfVlQyMjA7Ci0JCWVsc2UgaWYgKHNjbHAuaGFzX2xpbmVtb2RlICYmCi0JCQkgY29uZmlnX2VuYWJsZWQoQ09ORklHX1NDTFBfQ09OU09MRSkpCisJCWVsc2UgaWYgKHNjbHAuaGFzX2xpbmVtb2RlICYmIElTX0VOQUJMRUQoQ09ORklHX1NDTFBfQ09OU09MRSkpCiAJCQlTRVRfQ09OU09MRV9TQ0xQOwogCQllbHNlCiAJCQlTRVRfQ09OU09MRV9IVkM7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3N5c2luZm8uYyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzaW5mby5jCmluZGV4IDA1MGI4ZDAuLmJmZGE2YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc3lzaW5mby5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzaW5mby5jCkBAIC00NTQsNyArNDU0LDcgQEAKIAkJCTogIlEiIChpbmZvLT5jYXBhYmlsaXR5KSwgImQiICgxMDAwMDAwMCksICJkIiAoMCkKIAkJCTogImNjIgogCQkJKTsKLQkJa2VybmVsX2ZwdV9lbmQoJmZwdSk7CisJCWtlcm5lbF9mcHVfZW5kKCZmcHUsIEtFUk5FTF9GUFIpOwogCX0gZWxzZQogCQkvKgogCQkgKiBSZWFsbHkgb2xkIG1hY2hpbmUgd2l0aG91dCBzdHNpIGJsb2NrIGZvciBiYXNpYwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMgYi9hcmNoL3MzOTAva2VybmVsL3RpbWUuYwppbmRleCA0ZTk5NDk4Li4wYmZjYzQ5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3RpbWUuYwpAQCAtNTAsMTAgKzUwLDYgQEAKICNpbmNsdWRlIDxhc20vY2lvLmg+CiAjaW5jbHVkZSAiZW50cnkuaCIKIAotLyogY2hhbmdlIHRoaXMgaWYgeW91IGhhdmUgc29tZSBjb25zdGFudCB0aW1lIGRyaWZ0ICovCi0jZGVmaW5lIFVTRUNTX1BFUl9KSUZGWSAgICAgKCh1bnNpZ25lZCBsb25nKSAxMDAwMDAwL0haKQotI2RlZmluZSBDTEtfVElDS1NfUEVSX0pJRkZZICgodW5zaWduZWQgbG9uZykgVVNFQ1NfUEVSX0pJRkZZIDw8IDEyKQotCiB1NjQgc2NoZWRfY2xvY2tfYmFzZV9jYyA9IC0xOwkvKiBGb3JjZSB0byBkYXRhIHNlY3Rpb24uICovCiBFWFBPUlRfU1lNQk9MX0dQTChzY2hlZF9jbG9ja19iYXNlX2NjKTsKIApAQCAtMjgyLDEzICsyNzgsOCBAQAogCiB2b2lkIHVwZGF0ZV92c3lzY2FsbF90eih2b2lkKQogewotCS8qIE1ha2UgdXNlcnNwYWNlIGdldHRpbWVvZmRheSBzcGluIHVudGlsIHdlJ3JlIGRvbmUuICovCi0JKyt2ZHNvX2RhdGEtPnRiX3VwZGF0ZV9jb3VudDsKLQlzbXBfd21iKCk7CiAJdmRzb19kYXRhLT50el9taW51dGVzd2VzdCA9IHN5c190ei50el9taW51dGVzd2VzdDsKIAl2ZHNvX2RhdGEtPnR6X2RzdHRpbWUgPSBzeXNfdHoudHpfZHN0dGltZTsKLQlzbXBfd21iKCk7Ci0JKyt2ZHNvX2RhdGEtPnRiX3VwZGF0ZV9jb3VudDsKIH0KIAogLyoKQEAgLTMxOCw1MSArMzA5LDEyIEBACiAJdnRpbWVfaW5pdCgpOwogfQogCi0vKgotICogVGhlIHRpbWUgaXMgImNsb2NrIi4gb2xkIGlzIHdoYXQgd2UgdGhpbmsgdGhlIHRpbWUgaXMuCi0gKiBBZGp1c3QgdGhlIHZhbHVlIGJ5IGEgbXVsdGlwbGUgb2YgamlmZmllcyBhbmQgYWRkIHRoZSBkZWx0YSB0byBudHAuCi0gKiAiZGVsYXkiIGlzIGFuIGFwcHJveGltYXRpb24gaG93IGxvbmcgdGhlIHN5bmNocm9uaXphdGlvbiB0b29rLiBJZgotICogdGhlIHRpbWUgY29ycmVjdGlvbiBpcyBwb3NpdGl2ZSwgdGhlbiAiZGVsYXkiIGlzIHN1YnRyYWN0ZWQgZnJvbQotICogdGhlIHRpbWUgZGlmZmVyZW5jZSBhbmQgb25seSB0aGUgcmVtYWluaW5nIHBhcnQgaXMgcGFzc2VkIHRvIG50cC4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBhZGp1c3RfdGltZSh1bnNpZ25lZCBsb25nIGxvbmcgb2xkLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBjbG9jaywKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgZGVsYXkpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIGRlbHRhLCB0aWNrczsKLQlzdHJ1Y3QgdGltZXggYWRqdXN0OwotCi0JaWYgKGNsb2NrID4gb2xkKSB7Ci0JCS8qIEl0IGlzIGxhdGVyIHRoYW4gd2UgdGhvdWdodC4gKi8KLQkJZGVsdGEgPSB0aWNrcyA9IGNsb2NrIC0gb2xkOwotCQlkZWx0YSA9IHRpY2tzID0gKGRlbHRhIDwgZGVsYXkpID8gMCA6IGRlbHRhIC0gZGVsYXk7Ci0JCWRlbHRhIC09IGRvX2Rpdih0aWNrcywgQ0xLX1RJQ0tTX1BFUl9KSUZGWSk7Ci0JCWFkanVzdC5vZmZzZXQgPSB0aWNrcyAqICgxMDAwMDAwIC8gSFopOwotCX0gZWxzZSB7Ci0JCS8qIEl0IGlzIGVhcmxpZXIgdGhhbiB3ZSB0aG91Z2h0LiAqLwotCQlkZWx0YSA9IHRpY2tzID0gb2xkIC0gY2xvY2s7Ci0JCWRlbHRhIC09IGRvX2Rpdih0aWNrcywgQ0xLX1RJQ0tTX1BFUl9KSUZGWSk7Ci0JCWRlbHRhID0gLWRlbHRhOwotCQlhZGp1c3Qub2Zmc2V0ID0gLXRpY2tzICogKDEwMDAwMDAgLyBIWik7Ci0JfQotCXNjaGVkX2Nsb2NrX2Jhc2VfY2MgKz0gZGVsdGE7Ci0JaWYgKGFkanVzdC5vZmZzZXQgIT0gMCkgewotCQlwcl9ub3RpY2UoIlRoZSBFVFIgaW50ZXJmYWNlIGhhcyBhZGp1c3RlZCB0aGUgY2xvY2sgIgotCQkJICAiYnkgJWxpIG1pY3Jvc2Vjb25kc1xuIiwgYWRqdXN0Lm9mZnNldCk7Ci0JCWFkanVzdC5tb2RlcyA9IEFESl9PRkZTRVRfU0lOR0xFU0hPVDsKLQkJZG9fYWRqdGltZXgoJmFkanVzdCk7Ci0JfQotCXJldHVybiBkZWx0YTsKLX0KLQogc3RhdGljIERFRklORV9QRVJfQ1BVKGF0b21pY190LCBjbG9ja19zeW5jX3dvcmQpOwogc3RhdGljIERFRklORV9NVVRFWChjbG9ja19zeW5jX211dGV4KTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGNsb2NrX3N5bmNfZmxhZ3M7CiAKLSNkZWZpbmUgQ0xPQ0tfU1lOQ19IQVNfRVRSCTAKLSNkZWZpbmUgQ0xPQ0tfU1lOQ19IQVNfU1RQCTEKLSNkZWZpbmUgQ0xPQ0tfU1lOQ19FVFIJCTIKLSNkZWZpbmUgQ0xPQ0tfU1lOQ19TVFAJCTMKKyNkZWZpbmUgQ0xPQ0tfU1lOQ19IQVNfU1RQCTAKKyNkZWZpbmUgQ0xPQ0tfU1lOQ19TVFAJCTEKIAogLyoKICAqIFRoZSBnZXRfY2xvY2sgZnVuY3Rpb24gZm9yIHRoZSBwaHlzaWNhbCBjbG9jay4gSXQgd2lsbCBnZXQgdGhlIGN1cnJlbnQKQEAgLTM4NCwzNCArMzM2LDMyIEBACiAJaWYgKHN3MCA9PSBzdzEgJiYgKHN3MCAmIDB4ODAwMDAwMDBVKSkKIAkJLyogU3VjY2VzczogdGltZSBpcyBpbiBzeW5jLiAqLwogCQlyZXR1cm4gMDsKLQlpZiAoIXRlc3RfYml0KENMT0NLX1NZTkNfSEFTX0VUUiwgJmNsb2NrX3N5bmNfZmxhZ3MpICYmCi0JICAgICF0ZXN0X2JpdChDTE9DS19TWU5DX0hBU19TVFAsICZjbG9ja19zeW5jX2ZsYWdzKSkKKwlpZiAoIXRlc3RfYml0KENMT0NLX1NZTkNfSEFTX1NUUCwgJmNsb2NrX3N5bmNfZmxhZ3MpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JaWYgKCF0ZXN0X2JpdChDTE9DS19TWU5DX0VUUiwgJmNsb2NrX3N5bmNfZmxhZ3MpICYmCi0JICAgICF0ZXN0X2JpdChDTE9DS19TWU5DX1NUUCwgJmNsb2NrX3N5bmNfZmxhZ3MpKQorCWlmICghdGVzdF9iaXQoQ0xPQ0tfU1lOQ19TVFAsICZjbG9ja19zeW5jX2ZsYWdzKSkKIAkJcmV0dXJuIC1FQUNDRVM7CiAJcmV0dXJuIC1FQUdBSU47CiB9CiBFWFBPUlRfU1lNQk9MKGdldF9waHlzX2Nsb2NrKTsKIAogLyoKLSAqIE1ha2UgZ2V0X3N5bmNfY2xvY2sgcmV0dXJuIC1FQUdBSU4uCisgKiBNYWtlIGdldF9waHlzX2Nsb2NrKCkgcmV0dXJuIC1FQUdBSU4uCiAgKi8KIHN0YXRpYyB2b2lkIGRpc2FibGVfc3luY19jbG9jayh2b2lkICpkdW1teSkKIHsKIAlhdG9taWNfdCAqc3dfcHRyID0gdGhpc19jcHVfcHRyKCZjbG9ja19zeW5jX3dvcmQpOwogCS8qCi0JICogQ2xlYXIgdGhlIGluLXN5bmMgYml0IDJeMzEuIEFsbCBnZXRfc3luY19jbG9jayBjYWxscyB3aWxsCisJICogQ2xlYXIgdGhlIGluLXN5bmMgYml0IDJeMzEuIEFsbCBnZXRfcGh5c19jbG9jayBjYWxscyB3aWxsCiAJICogZmFpbCB1bnRpbCB0aGUgc3luYyBiaXQgaXMgdHVybmVkIGJhY2sgb24uIEluIGFkZGl0aW9uCiAJICogaW5jcmVhc2UgdGhlICJzZXF1ZW5jZSIgY291bnRlciB0byBhdm9pZCB0aGUgcmFjZSBvZiBhbgotCSAqIGV0ciBldmVudCBhbmQgdGhlIGNvbXBsZXRlIHJlY292ZXJ5IGFnYWluc3QgZ2V0X3N5bmNfY2xvY2suCisJICogc3RwIGV2ZW50IGFuZCB0aGUgY29tcGxldGUgcmVjb3ZlcnkgYWdhaW5zdCBnZXRfcGh5c19jbG9jay4KIAkgKi8KIAlhdG9taWNfYW5kbm90KDB4ODAwMDAwMDAsIHN3X3B0cik7CiAJYXRvbWljX2luYyhzd19wdHIpOwogfQogCiAvKgotICogTWFrZSBnZXRfc3luY19jbG9jayByZXR1cm4gMCBhZ2Fpbi4KKyAqIE1ha2UgZ2V0X3BoeXNfY2xvY2soKSByZXR1cm4gMCBhZ2Fpbi4KICAqIE5lZWRzIHRvIGJlIGNhbGxlZCBmcm9tIGEgY29udGV4dCBkaXNhYmxlZCBmb3IgcHJlZW1wdGlvbi4KICAqLwogc3RhdGljIHZvaWQgZW5hYmxlX3N5bmNfY2xvY2sodm9pZCkKQEAgLTQzNCw3ICszODQsNyBAQAogCXJldHVybiByYzsKIH0KIAotLyogU2luZ2xlIHRocmVhZGVkIHdvcmtxdWV1ZSB1c2VkIGZvciBldHIgYW5kIHN0cCBzeW5jIGV2ZW50cyAqLworLyogU2luZ2xlIHRocmVhZGVkIHdvcmtxdWV1ZSB1c2VkIGZvciBzdHAgc3luYyBldmVudHMgKi8KIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqdGltZV9zeW5jX3dxOwogCiBzdGF0aWMgdm9pZCBfX2luaXQgdGltZV9pbml0X3dxKHZvaWQpCkBAIC00NDgsMjAgKzM5OCwxMiBAQAogCWF0b21pY190IGNwdXM7CiAJaW50IGluX3N5bmM7CiAJdW5zaWduZWQgbG9uZyBsb25nIGZpeHVwX2NjOwotCWludCBldHJfcG9ydDsKLQlzdHJ1Y3QgZXRyX2FpYiAqZXRyX2FpYjsKIH07CiAKIHN0YXRpYyB2b2lkIGNsb2NrX3N5bmNfY3B1KHN0cnVjdCBjbG9ja19zeW5jX2RhdGEgKnN5bmMpCiB7CiAJYXRvbWljX2RlYygmc3luYy0+Y3B1cyk7CiAJZW5hYmxlX3N5bmNfY2xvY2soKTsKLQkvKgotCSAqIFRoaXMgbG9va3MgbGlrZSBhIGJ1c3kgd2FpdCBsb29wIGJ1dCBpdCBpc24ndC4gZXRyX3N5bmNfY3B1cwotCSAqIGlzIGNhbGxlZCBvbiBhbGwgb3RoZXIgY3B1cyB3aGlsZSB0aGUgVE9EIGNsb2NrcyBpcyBzdG9wcGVkLgotCSAqIF9fdWRlbGF5IHdpbGwgc3RvcCB0aGUgY3B1IG9uIGFuIGVuYWJsZWQgd2FpdCBwc3cgdW50aWwgdGhlCi0JICogVE9EIGlzIHJ1bm5pbmcgYWdhaW4uCi0JICovCiAJd2hpbGUgKHN5bmMtPmluX3N5bmMgPT0gMCkgewogCQlfX3VkZWxheSgxKTsKIAkJLyoKQEAgLTU4Miw3ICs1MjQsNyBAQAogc3RhdGljIGludCBzdHBfc3luY19jbG9jayh2b2lkICpkYXRhKQogewogCXN0YXRpYyBpbnQgZmlyc3Q7Ci0JdW5zaWduZWQgbG9uZyBsb25nIG9sZF9jbG9jaywgZGVsdGEsIG5ld19jbG9jaywgY2xvY2tfZGVsdGE7CisJdW5zaWduZWQgbG9uZyBsb25nIGNsb2NrX2RlbHRhOwogCXN0cnVjdCBjbG9ja19zeW5jX2RhdGEgKnN0cF9zeW5jOwogCXN0cnVjdCBwdGZmX3F0byBxdG87CiAJaW50IHJjOwpAQCAtNjA1LDE4ICs1NDcsMTggQEAKIAlpZiAoc3RwX2luZm8udG9kb2ZmWzBdIHx8IHN0cF9pbmZvLnRvZG9mZlsxXSB8fAogCSAgICBzdHBfaW5mby50b2RvZmZbMl0gfHwgc3RwX2luZm8udG9kb2ZmWzNdIHx8CiAJICAgIHN0cF9pbmZvLnRtZCAhPSAyKSB7Ci0JCW9sZF9jbG9jayA9IGdldF90b2RfY2xvY2soKTsKIAkJcmMgPSBjaHNjX3NzdHBjKHN0cF9wYWdlLCBTVFBfT1BfU1lOQywgMCwgJmNsb2NrX2RlbHRhKTsKIAkJaWYgKHJjID09IDApIHsKLQkJCW5ld19jbG9jayA9IG9sZF9jbG9jayArIGNsb2NrX2RlbHRhOwotCQkJZGVsdGEgPSBhZGp1c3RfdGltZShvbGRfY2xvY2ssIG5ld19jbG9jaywgMCk7CisJCQkvKiBmaXh1cCB0aGUgbW9ub3RvbmljIHNjaGVkIGNsb2NrICovCisJCQlzY2hlZF9jbG9ja19iYXNlX2NjICs9IGNsb2NrX2RlbHRhOwogCQkJaWYgKHB0ZmZfcXVlcnkoUFRGRl9RVE8pICYmCiAJCQkgICAgcHRmZigmcXRvLCBzaXplb2YocXRvKSwgUFRGRl9RVE8pID09IDApCiAJCQkJLyogVXBkYXRlIExQQVIgb2Zmc2V0ICovCiAJCQkJbHBhcl9vZmZzZXQgPSBxdG8udG9kX2Vwb2NoX2RpZmZlcmVuY2U7CiAJCQlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmczM5MF9lcG9jaF9kZWx0YV9ub3RpZmllciwKIAkJCQkJCSAgIDAsICZjbG9ja19kZWx0YSk7Ci0JCQlmaXh1cF9jbG9ja19jb21wYXJhdG9yKGRlbHRhKTsKKwkJCXN0cF9zeW5jLT5maXh1cF9jYyA9IGNsb2NrX2RlbHRhOworCQkJZml4dXBfY2xvY2tfY29tcGFyYXRvcihjbG9ja19kZWx0YSk7CiAJCQlyYyA9IGNoc2Nfc3N0cGkoc3RwX3BhZ2UsICZzdHBfaW5mbywKIAkJCQkJc2l6ZW9mKHN0cnVjdCBzdHBfc3N0cGkpKTsKIAkJCWlmIChyYyA9PSAwICYmIHN0cF9pbmZvLnRtZCAhPSAyKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCmluZGV4IGRkOTdhM2UuLmQwNTM5ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKQEAgLTE0LDExICsxNCwxMiBAQAogICovCiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2ZwdS9hcGkuaD4KICNpbmNsdWRlICJlbnRyeS5oIgogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Zkc28zMi9NYWtlZmlsZSBiL2FyY2gvczM5MC9rZXJuZWwvdmRzbzMyL01ha2VmaWxlCmluZGV4IDY4MTQ1NDUuLjZjYzk0NzggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdmRzbzMyL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdmRzbzMyL01ha2VmaWxlCkBAIC0yNCw4ICsyNCw5IEBACiBleHRyYS15ICs9IHZkc28zMi5sZHMKIENQUEZMQUdTX3Zkc28zMi5sZHMgKz0gLVAgLUMgLVUkKEFSQ0gpCiAKLSMgRGlzYWJsZSBnY292IHByb2ZpbGluZyBmb3IgVkRTTyBjb2RlCisjIERpc2FibGUgZ2NvdiBwcm9maWxpbmcgYW5kIHVic2FuIGZvciBWRFNPIGNvZGUKIEdDT1ZfUFJPRklMRSA6PSBuCitVQlNBTl9TQU5JVElaRSA6PSBuCiAKICMgRm9yY2UgZGVwZW5kZW5jeSAoaW5jYmluIGlzIGJhZCkKICQob2JqKS92ZHNvMzJfd3JhcHBlci5vIDogJChvYmopL3Zkc28zMi5zbwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC92ZHNvNjQvTWFrZWZpbGUgYi9hcmNoL3MzOTAva2VybmVsL3Zkc282NC9NYWtlZmlsZQppbmRleCAwYjBmZDIyLi4yZDU0YzE4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3Zkc282NC9NYWtlZmlsZQorKysgYi9hcmNoL3MzOTAva2VybmVsL3Zkc282NC9NYWtlZmlsZQpAQCAtMjQsOCArMjQsOSBAQAogZXh0cmEteSArPSB2ZHNvNjQubGRzCiBDUFBGTEFHU192ZHNvNjQubGRzICs9IC1QIC1DIC1VJChBUkNIKQogCi0jIERpc2FibGUgZ2NvdiBwcm9maWxpbmcgZm9yIFZEU08gY29kZQorIyBEaXNhYmxlIGdjb3YgcHJvZmlsaW5nIGFuZCB1YnNhbiBmb3IgVkRTTyBjb2RlCiBHQ09WX1BST0ZJTEUgOj0gbgorVUJTQU5fU0FOSVRJWkUgOj0gbgogCiAjIEZvcmNlIGRlcGVuZGVuY3kgKGluY2JpbiBpcyBiYWQpCiAkKG9iaikvdmRzbzY0X3dyYXBwZXIubyA6ICQob2JqKS92ZHNvNjQuc28KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYyBiL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYwppbmRleCBmMTQyMjE1Li43ZThjYjZhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jCkBAIC0xMzIsMTAgKzEzMiw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKG5lc3RlZCwgIk5lc3RlZCB2aXJ0dWFsaXphdGlvbiBzdXBwb3J0Iik7CiAKIC8qIHVwcGVyIGZhY2lsaXRpZXMgbGltaXQgZm9yIGt2bSAqLwotdW5zaWduZWQgbG9uZyBrdm1fczM5MF9mYWNfbGlzdF9tYXNrWzE2XSA9IHsKLQkweGZmZTYwMDAwMDAwMDAwMDBVTCwKLQkweDAwNWUwMDAwMDAwMDAwMDBVTCwKLX07Cit1bnNpZ25lZCBsb25nIGt2bV9zMzkwX2ZhY19saXN0X21hc2tbMTZdID0geyBGQUNJTElUSUVTX0tWTSB9OwogCiB1bnNpZ25lZCBsb25nIGt2bV9zMzkwX2ZhY19saXN0X21hc2tfc2l6ZSh2b2lkKQogewpAQCAtMjQ4LDIyICsyNDUsMzMgQEAKIAkJICAgICBQVEZGX1FBRik7CiAKIAlpZiAodGVzdF9mYWNpbGl0eSgxNykpIHsgLyogTVNBICovCi0JCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01BQywga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua21hYyk7Ci0JCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DLCBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5rbWMpOwotCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tNLCBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5rbSk7Ci0JCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS0lNRCwga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua2ltZCk7Ci0JCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS0xNRCwga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua2xtZCk7CisJCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01BQywgKGNwYWNmX21hc2tfdCAqKQorCQkJICAgICAga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua21hYyk7CisJCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DLCAoY3BhY2ZfbWFza190ICopCisJCQkgICAgICBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5rbWMpOworCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tNLCAoY3BhY2ZfbWFza190ICopCisJCQkgICAgICBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5rbSk7CisJCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS0lNRCwgKGNwYWNmX21hc2tfdCAqKQorCQkJICAgICAga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua2ltZCk7CisJCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS0xNRCwgKGNwYWNmX21hc2tfdCAqKQorCQkJICAgICAga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua2xtZCk7CiAJfQogCWlmICh0ZXN0X2ZhY2lsaXR5KDc2KSkgLyogTVNBMyAqLwotCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX1BDS01PLCBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5wY2ttbyk7CisJCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfUENLTU8sIChjcGFjZl9tYXNrX3QgKikKKwkJCSAgICAgIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLnBja21vKTsKIAlpZiAodGVzdF9mYWNpbGl0eSg3NykpIHsgLyogTVNBNCAqLwotCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tNQ1RSLCBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5rbWN0cik7Ci0JCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01GLCBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5rbWYpOwotCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tNTywga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua21vKTsKLQkJX19jcGFjZl9xdWVyeShDUEFDRl9QQ0MsIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLnBjYyk7CisJCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DVFIsIChjcGFjZl9tYXNrX3QgKikKKwkJCSAgICAgIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLmttY3RyKTsKKwkJX19jcGFjZl9xdWVyeShDUEFDRl9LTUYsIChjcGFjZl9tYXNrX3QgKikKKwkJCSAgICAgIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLmttZik7CisJCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01PLCAoY3BhY2ZfbWFza190ICopCisJCQkgICAgICBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5rbW8pOworCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX1BDQywgKGNwYWNmX21hc2tfdCAqKQorCQkJICAgICAga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMucGNjKTsKIAl9CiAJaWYgKHRlc3RfZmFjaWxpdHkoNTcpKSAvKiBNU0E1ICovCi0JCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfUFBOTywga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMucHBubyk7CisJCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfUFBOTywgKGNwYWNmX21hc2tfdCAqKQorCQkJICAgICAga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMucHBubyk7CiAKIAlpZiAoTUFDSElORV9IQVNfRVNPUCkKIAkJYWxsb3dfY3B1X2ZlYXQoS1ZNX1MzOTBfVk1fQ1BVX0ZFQVRfRVNPUCk7CkBAIC0yMjMxLDkgKzIyMzksMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJY3VycmVudC0+dGhyZWFkLmZwdS5mcGMgPSBmcHUtPmZwYzsKIAlpZiAoTUFDSElORV9IQVNfVlgpCi0JCWNvbnZlcnRfZnBfdG9fdngoY3VycmVudC0+dGhyZWFkLmZwdS52eHJzLCAoZnJlZ190ICopZnB1LT5mcHJzKTsKKwkJY29udmVydF9mcF90b192eCgoX192ZWN0b3IxMjggKikgdmNwdS0+cnVuLT5zLnJlZ3MudnJzLAorCQkJCSAoZnJlZ190ICopIGZwdS0+ZnBycyk7CiAJZWxzZQotCQltZW1jcHkoY3VycmVudC0+dGhyZWFkLmZwdS5mcHJzLCAmZnB1LT5mcHJzLCBzaXplb2YoZnB1LT5mcHJzKSk7CisJCW1lbWNweSh2Y3B1LT5ydW4tPnMucmVncy5mcHJzLCAmZnB1LT5mcHJzLCBzaXplb2YoZnB1LT5mcHJzKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyNDIsOSArMjI1MSwxMCBAQAogCS8qIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBsYXRlc3QgdmFsdWVzICovCiAJc2F2ZV9mcHVfcmVncygpOwogCWlmIChNQUNISU5FX0hBU19WWCkKLQkJY29udmVydF92eF90b19mcCgoZnJlZ190ICopZnB1LT5mcHJzLCBjdXJyZW50LT50aHJlYWQuZnB1LnZ4cnMpOworCQljb252ZXJ0X3Z4X3RvX2ZwKChmcmVnX3QgKikgZnB1LT5mcHJzLAorCQkJCSAoX192ZWN0b3IxMjggKikgdmNwdS0+cnVuLT5zLnJlZ3MudnJzKTsKIAllbHNlCi0JCW1lbWNweShmcHUtPmZwcnMsIGN1cnJlbnQtPnRocmVhZC5mcHUuZnBycywgc2l6ZW9mKGZwdS0+ZnBycykpOworCQltZW1jcHkoZnB1LT5mcHJzLCB2Y3B1LT5ydW4tPnMucmVncy5mcHJzLCBzaXplb2YoZnB1LT5mcHJzKSk7CiAJZnB1LT5mcGMgPSBjdXJyZW50LT50aHJlYWQuZnB1LmZwYzsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vdnNpZS5jIGIvYXJjaC9zMzkwL2t2bS92c2llLmMKaW5kZXggYzEwNjQ4OGIuLmQ4NjczZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0vdnNpZS5jCisrKyBiL2FyY2gvczM5MC9rdm0vdnNpZS5jCkBAIC01ODQsNyArNTg0LDcgQEAKIAkJLyogVmFsaWRpdHkgMHgwMDQ0IHdpbGwgYmUgY2hlY2tlZCBieSBTSUUgKi8KIAkJaWYgKHJjKQogCQkJZ290byB1bnBpbjsKLQkJc2NiX3MtPmd2cmQgPSBocGE7CisJCXNjYl9zLT5yaWNjYmQgPSBocGE7CiAJfQogCXJldHVybiAwOwogdW5waW46CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL3N0cmluZy5jIGIvYXJjaC9zMzkwL2xpYi9zdHJpbmcuYwppbmRleCBlMzkwYmJiLi40ODM1MmJmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbGliL3N0cmluZy5jCisrKyBiL2FyY2gvczM5MC9saWIvc3RyaW5nLmMKQEAgLTIzNywxMSArMjM3LDEwIEBACiBFWFBPUlRfU1lNQk9MKHN0cnJjaHIpOwogCiBzdGF0aWMgaW5saW5lIGludCBjbGNsZShjb25zdCBjaGFyICpzMSwgdW5zaWduZWQgbG9uZyBsMSwKLQkJCWNvbnN0IGNoYXIgKnMyLCB1bnNpZ25lZCBsb25nIGwyLAotCQkJaW50ICpkaWZmKQorCQkJY29uc3QgY2hhciAqczIsIHVuc2lnbmVkIGxvbmcgbDIpCiB7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByMiBhc20oIjIiKSA9ICh1bnNpZ25lZCBsb25nKSBzMTsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHIzIGFzbSgiMyIpID0gKHVuc2lnbmVkIGxvbmcpIGwyOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjMgYXNtKCIzIikgPSAodW5zaWduZWQgbG9uZykgbDE7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByNCBhc20oIjQiKSA9ICh1bnNpZ25lZCBsb25nKSBzMjsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHI1IGFzbSgiNSIpID0gKHVuc2lnbmVkIGxvbmcpIGwyOwogCWludCBjYzsKQEAgLTI1Miw3ICsyNTEsNiBAQAogCQkgICAgICAiICAgc3JsICAgJTAsMjgiCiAJCSAgICAgIDogIj0mZCIgKGNjKSwgIithIiAocjIpLCAiK2EiIChyMyksCiAJCQkiK2EiIChyNCksICIrYSIgKHI1KSA6IDogImNjIik7Ci0JKmRpZmYgPSAqKGNoYXIgKilyMiAtICooY2hhciAqKXI0OwogCXJldHVybiBjYzsKIH0KIApAQCAtMjcwLDkgKzI2OCw5IEBACiAJCXJldHVybiAoY2hhciAqKSBzMTsKIAlsMSA9IF9fc3RyZW5kKHMxKSAtIHMxOwogCXdoaWxlIChsMS0tID49IGwyKSB7Ci0JCWludCBjYywgZHVtbXk7CisJCWludCBjYzsKIAotCQljYyA9IGNsY2xlKHMxLCBsMSwgczIsIGwyLCAmZHVtbXkpOworCQljYyA9IGNsY2xlKHMxLCBsMiwgczIsIGwyKTsKIAkJaWYgKCFjYykKIAkJCXJldHVybiAoY2hhciAqKSBzMTsKIAkJczErKzsKQEAgLTMxMywxMSArMzExLDExIEBACiAgKi8KIGludCBtZW1jbXAoY29uc3Qgdm9pZCAqY3MsIGNvbnN0IHZvaWQgKmN0LCBzaXplX3QgbikKIHsKLQlpbnQgcmV0LCBkaWZmOworCWludCByZXQ7CiAKLQlyZXQgPSBjbGNsZShjcywgbiwgY3QsIG4sICZkaWZmKTsKKwlyZXQgPSBjbGNsZShjcywgbiwgY3QsIG4pOwogCWlmIChyZXQpCi0JCXJldCA9IGRpZmY7CisJCXJldCA9IHJldCA9PSAxID8gLTEgOiAxOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKG1lbWNtcCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vZmF1bHQuYyBiL2FyY2gvczM5MC9tbS9mYXVsdC5jCmluZGV4IGE1OGJjYTYuLjY2MWQ5ZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9mYXVsdC5jCisrKyBiL2FyY2gvczM5MC9tbS9mYXVsdC5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CkBAIC03NDAsMjggKzc0MCwyMSBAQAogCXB1dF90YXNrX3N0cnVjdCh0c2spOwogfQogCi1zdGF0aWMgaW50IHBmYXVsdF9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sCi0JCQkgICAgIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IHBmYXVsdF9jcHVfZGVhZCh1bnNpZ25lZCBpbnQgY3B1KQogewogCXN0cnVjdCB0aHJlYWRfc3RydWN0ICp0aHJlYWQsICpuZXh0OwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCi0Jc3dpdGNoIChhY3Rpb24gJiB+Q1BVX1RBU0tTX0ZST1pFTikgewotCWNhc2UgQ1BVX0RFQUQ6Ci0JCXNwaW5fbG9ja19pcnEoJnBmYXVsdF9sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRocmVhZCwgbmV4dCwgJnBmYXVsdF9saXN0LCBsaXN0KSB7Ci0JCQl0aHJlYWQtPnBmYXVsdF93YWl0ID0gMDsKLQkJCWxpc3RfZGVsKCZ0aHJlYWQtPmxpc3QpOwotCQkJdHNrID0gY29udGFpbmVyX29mKHRocmVhZCwgc3RydWN0IHRhc2tfc3RydWN0LCB0aHJlYWQpOwotCQkJd2FrZV91cF9wcm9jZXNzKHRzayk7Ci0JCQlwdXRfdGFza19zdHJ1Y3QodHNrKTsKLQkJfQotCQlzcGluX3VubG9ja19pcnEoJnBmYXVsdF9sb2NrKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7CisJc3Bpbl9sb2NrX2lycSgmcGZhdWx0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0aHJlYWQsIG5leHQsICZwZmF1bHRfbGlzdCwgbGlzdCkgeworCQl0aHJlYWQtPnBmYXVsdF93YWl0ID0gMDsKKwkJbGlzdF9kZWwoJnRocmVhZC0+bGlzdCk7CisJCXRzayA9IGNvbnRhaW5lcl9vZih0aHJlYWQsIHN0cnVjdCB0YXNrX3N0cnVjdCwgdGhyZWFkKTsKKwkJd2FrZV91cF9wcm9jZXNzKHRzayk7CisJCXB1dF90YXNrX3N0cnVjdCh0c2spOwogCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXNwaW5fdW5sb2NrX2lycSgmcGZhdWx0X2xvY2spOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBwZmF1bHRfaXJxX2luaXQodm9pZCkKQEAgLTc3NSw3ICs3NjgsOCBAQAogCWlmIChyYykKIAkJZ290byBvdXRfcGZhdWx0OwogCWlycV9zdWJjbGFzc19yZWdpc3RlcihJUlFfU1VCQ0xBU1NfU0VSVklDRV9TSUdOQUwpOwotCWhvdGNwdV9ub3RpZmllcihwZmF1bHRfY3B1X25vdGlmeSwgMCk7CisJY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9TMzkwX1BGQVVMVF9ERUFELCAiczM5MC9wZmF1bHQ6ZGVhZCIsCisJCQkJICBOVUxMLCBwZmF1bHRfY3B1X2RlYWQpOwogCXJldHVybiAwOwogCiBvdXRfcGZhdWx0OgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL2dtYXAuYyBiL2FyY2gvczM5MC9tbS9nbWFwLmMKaW5kZXggMmNlNmJiMy4uM2JhNjIyNyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL2dtYXAuYworKysgYi9hcmNoL3MzOTAvbW0vZ21hcC5jCkBAIC05NCw2ICs5NCw3IEBACiBzdHJ1Y3QgZ21hcCAqZ21hcF9jcmVhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgbGltaXQpCiB7CiAJc3RydWN0IGdtYXAgKmdtYXA7CisJdW5zaWduZWQgbG9uZyBnbWFwX2FzY2U7CiAKIAlnbWFwID0gZ21hcF9hbGxvYyhsaW1pdCk7CiAJaWYgKCFnbWFwKQpAQCAtMTAxLDYgKzEwMiwxMSBAQAogCWdtYXAtPm1tID0gbW07CiAJc3Bpbl9sb2NrKCZtbS0+Y29udGV4dC5nbWFwX2xvY2spOwogCWxpc3RfYWRkX3JjdSgmZ21hcC0+bGlzdCwgJm1tLT5jb250ZXh0LmdtYXBfbGlzdCk7CisJaWYgKGxpc3RfaXNfc2luZ3VsYXIoJm1tLT5jb250ZXh0LmdtYXBfbGlzdCkpCisJCWdtYXBfYXNjZSA9IGdtYXAtPmFzY2U7CisJZWxzZQorCQlnbWFwX2FzY2UgPSAtMVVMOworCVdSSVRFX09OQ0UobW0tPmNvbnRleHQuZ21hcF9hc2NlLCBnbWFwX2FzY2UpOwogCXNwaW5fdW5sb2NrKCZtbS0+Y29udGV4dC5nbWFwX2xvY2spOwogCXJldHVybiBnbWFwOwogfQpAQCAtMjMwLDYgKzIzNiw3IEBACiB2b2lkIGdtYXBfcmVtb3ZlKHN0cnVjdCBnbWFwICpnbWFwKQogewogCXN0cnVjdCBnbWFwICpzZywgKm5leHQ7CisJdW5zaWduZWQgbG9uZyBnbWFwX2FzY2U7CiAKIAkvKiBSZW1vdmUgYWxsIHNoYWRvdyBnbWFwcyBsaW5rZWQgdG8gdGhpcyBnbWFwICovCiAJaWYgKCFsaXN0X2VtcHR5KCZnbWFwLT5jaGlsZHJlbikpIHsKQEAgLTI0Myw2ICsyNTAsMTQgQEAKIAkvKiBSZW1vdmUgZ21hcCBmcm9tIHRoZSBwcmUtbW0gbGlzdCAqLwogCXNwaW5fbG9jaygmZ21hcC0+bW0tPmNvbnRleHQuZ21hcF9sb2NrKTsKIAlsaXN0X2RlbF9yY3UoJmdtYXAtPmxpc3QpOworCWlmIChsaXN0X2VtcHR5KCZnbWFwLT5tbS0+Y29udGV4dC5nbWFwX2xpc3QpKQorCQlnbWFwX2FzY2UgPSAwOworCWVsc2UgaWYgKGxpc3RfaXNfc2luZ3VsYXIoJmdtYXAtPm1tLT5jb250ZXh0LmdtYXBfbGlzdCkpCisJCWdtYXBfYXNjZSA9IGxpc3RfZmlyc3RfZW50cnkoJmdtYXAtPm1tLT5jb250ZXh0LmdtYXBfbGlzdCwKKwkJCQkJICAgICBzdHJ1Y3QgZ21hcCwgbGlzdCktPmFzY2U7CisJZWxzZQorCQlnbWFwX2FzY2UgPSAtMVVMOworCVdSSVRFX09OQ0UoZ21hcC0+bW0tPmNvbnRleHQuZ21hcF9hc2NlLCBnbWFwX2FzY2UpOwogCXNwaW5fdW5sb2NrKCZnbWFwLT5tbS0+Y29udGV4dC5nbWFwX2xvY2spOwogCXN5bmNocm9uaXplX3JjdSgpOwogCS8qIFB1dCByZWZlcmVuY2UgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9wYWdlYXR0ci5jIGIvYXJjaC9zMzkwL21tL3BhZ2VhdHRyLmMKaW5kZXggNzEwNGZmYi4uNDRmMTUwMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL3BhZ2VhdHRyLmMKKysrIGIvYXJjaC9zMzkwL21tL3BhZ2VhdHRyLmMKQEAgLTI1Miw2ICsyNTIsOCBAQAogCWludCByYyA9IC1FSU5WQUw7CiAJcGdkX3QgKnBnZHA7CiAKKwlpZiAoYWRkciA9PSBlbmQpCisJCXJldHVybiAwOwogCWlmIChlbmQgPj0gTU9EVUxFU19FTkQpCiAJCXJldHVybiAtRUlOVkFMOwogCW11dGV4X2xvY2soJmNwYV9tdXRleCk7CkBAIC0zMDcsMTEgKzMwOSwxMSBAQAogCWludCBpOwogCiAJaWYgKHRlc3RfZmFjaWxpdHkoMTMpKSB7Ci0JCV9fcHRlcF9pcHRlX3JhbmdlKGFkZHJlc3MsIG5yIC0gMSwgcHRlKTsKKwkJX19wdGVwX2lwdGVfcmFuZ2UoYWRkcmVzcywgbnIgLSAxLCBwdGUsIElQVEVfR0xPQkFMKTsKIAkJcmV0dXJuOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgewotCQlfX3B0ZXBfaXB0ZShhZGRyZXNzLCBwdGUpOworCQlfX3B0ZXBfaXB0ZShhZGRyZXNzLCBwdGUsIElQVEVfR0xPQkFMKTsKIAkJYWRkcmVzcyArPSBQQUdFX1NJWkU7CiAJCXB0ZSsrOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMgYi9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCmluZGV4IDVmMDkyMDEuLjdhMTg5N2MgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMKKysrIGIvYXJjaC9zMzkwL21tL3BndGFibGUuYwpAQCAtMzUsOSArMzUsOSBAQAogCWF0b21pY19pbmMoJm1tLT5jb250ZXh0LmZsdXNoX2NvdW50KTsKIAlpZiAoTUFDSElORV9IQVNfVExCX0xDICYmCiAJICAgIGNwdW1hc2tfZXF1YWwobW1fY3B1bWFzayhtbSksIGNwdW1hc2tfb2Yoc21wX3Byb2Nlc3Nvcl9pZCgpKSkpCi0JCV9fcHRlcF9pcHRlX2xvY2FsKGFkZHIsIHB0ZXApOworCQlfX3B0ZXBfaXB0ZShhZGRyLCBwdGVwLCBJUFRFX0xPQ0FMKTsKIAllbHNlCi0JCV9fcHRlcF9pcHRlKGFkZHIsIHB0ZXApOworCQlfX3B0ZXBfaXB0ZShhZGRyLCBwdGVwLCBJUFRFX0dMT0JBTCk7CiAJYXRvbWljX2RlYygmbW0tPmNvbnRleHQuZmx1c2hfY291bnQpOwogCXJldHVybiBvbGQ7CiB9CkBAIC01Niw3ICs1Niw3IEBACiAJCXB0ZV92YWwoKnB0ZXApIHw9IF9QQUdFX0lOVkFMSUQ7CiAJCW1tLT5jb250ZXh0LmZsdXNoX21tID0gMTsKIAl9IGVsc2UKLQkJX19wdGVwX2lwdGUoYWRkciwgcHRlcCk7CisJCV9fcHRlcF9pcHRlKGFkZHIsIHB0ZXAsIElQVEVfR0xPQkFMKTsKIAlhdG9taWNfZGVjKCZtbS0+Y29udGV4dC5mbHVzaF9jb3VudCk7CiAJcmV0dXJuIG9sZDsKIH0KQEAgLTMwMSw5ICszMDEsOSBAQAogCWF0b21pY19pbmMoJm1tLT5jb250ZXh0LmZsdXNoX2NvdW50KTsKIAlpZiAoTUFDSElORV9IQVNfVExCX0xDICYmCiAJICAgIGNwdW1hc2tfZXF1YWwobW1fY3B1bWFzayhtbSksIGNwdW1hc2tfb2Yoc21wX3Byb2Nlc3Nvcl9pZCgpKSkpCi0JCV9fcG1kcF9pZHRlX2xvY2FsKGFkZHIsIHBtZHApOworCQlfX3BtZHBfaWR0ZShhZGRyLCBwbWRwLCBJRFRFX0xPQ0FMKTsKIAllbHNlCi0JCV9fcG1kcF9pZHRlKGFkZHIsIHBtZHApOworCQlfX3BtZHBfaWR0ZShhZGRyLCBwbWRwLCBJRFRFX0dMT0JBTCk7CiAJYXRvbWljX2RlYygmbW0tPmNvbnRleHQuZmx1c2hfY291bnQpOwogCXJldHVybiBvbGQ7CiB9CkBAIC0zMjIsNyArMzIyLDcgQEAKIAkJcG1kX3ZhbCgqcG1kcCkgfD0gX1NFR01FTlRfRU5UUllfSU5WQUxJRDsKIAkJbW0tPmNvbnRleHQuZmx1c2hfbW0gPSAxOwogCX0gZWxzZSBpZiAoTUFDSElORV9IQVNfSURURSkKLQkJX19wbWRwX2lkdGUoYWRkciwgcG1kcCk7CisJCV9fcG1kcF9pZHRlKGFkZHIsIHBtZHAsIElEVEVfR0xPQkFMKTsKIAllbHNlCiAJCV9fcG1kcF9jc3AocG1kcCk7CiAJYXRvbWljX2RlYygmbW0tPmNvbnRleHQuZmx1c2hfY291bnQpOwpAQCAtMzc0LDkgKzM3NCw5IEBACiAJYXRvbWljX2luYygmbW0tPmNvbnRleHQuZmx1c2hfY291bnQpOwogCWlmIChNQUNISU5FX0hBU19UTEJfTEMgJiYKIAkgICAgY3B1bWFza19lcXVhbChtbV9jcHVtYXNrKG1tKSwgY3B1bWFza19vZihzbXBfcHJvY2Vzc29yX2lkKCkpKSkKLQkJX19wdWRwX2lkdGVfbG9jYWwoYWRkciwgcHVkcCk7CisJCV9fcHVkcF9pZHRlKGFkZHIsIHB1ZHAsIElEVEVfTE9DQUwpOwogCWVsc2UKLQkJX19wdWRwX2lkdGUoYWRkciwgcHVkcCk7CisJCV9fcHVkcF9pZHRlKGFkZHIsIHB1ZHAsIElEVEVfR0xPQkFMKTsKIAlhdG9taWNfZGVjKCZtbS0+Y29udGV4dC5mbHVzaF9jb3VudCk7CiAJcmV0dXJuIG9sZDsKIH0KQEAgLTYyMCw3ICs2MjAsNyBAQAogCXB0ZSA9ICpwdGVwOwogCWlmIChkaXJ0eSAmJiAocHRlX3ZhbChwdGUpICYgX1BBR0VfUFJFU0VOVCkpIHsKIAkJcGdzdGUgPSBwZ3N0ZV9wdGVfbm90aWZ5KG1tLCBhZGRyLCBwdGVwLCBwZ3N0ZSk7Ci0JCV9fcHRlcF9pcHRlKGFkZHIsIHB0ZXApOworCQlfX3B0ZXBfaXB0ZShhZGRyLCBwdGVwLCBJUFRFX0dMT0JBTCk7CiAJCWlmIChNQUNISU5FX0hBU19FU09QIHx8ICEocHRlX3ZhbChwdGUpICYgX1BBR0VfV1JJVEUpKQogCQkJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1BST1RFQ1Q7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9wY2kvcGNpLmMgYi9hcmNoL3MzOTAvcGNpL3BjaS5jCmluZGV4IDg3MWFmNzUuLjE1ZmZjMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9wY2kvcGNpLmMKKysrIGIvYXJjaC9zMzkwL3BjaS9wY2kuYwpAQCAtODU0LDYgKzg1NCwxNSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoenBjaV9zdG9wX2RldmljZSk7CiAKK2ludCB6cGNpX3JlcG9ydF9lcnJvcihzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJICAgICAgc3RydWN0IHpwY2lfcmVwb3J0X2Vycm9yX2hlYWRlciAqcmVwb3J0KQoreworCXN0cnVjdCB6cGNpX2RldiAqemRldiA9IHRvX3pwY2kocGRldik7CisKKwlyZXR1cm4gc2NscF9wY2lfcmVwb3J0KHJlcG9ydCwgemRldi0+ZmgsIHpkZXYtPmZpZCk7Cit9CitFWFBPUlRfU1lNQk9MKHpwY2lfcmVwb3J0X2Vycm9yKTsKKwogc3RhdGljIGlubGluZSBpbnQgYmFyc2l6ZSh1OCBzaXplKQogewogCXJldHVybiAoc2l6ZSkgPyAoMSA8PCBzaXplKSA+PiAxMCA6IDA7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvcGNpL3BjaV9kbWEuYyBiL2FyY2gvczM5MC9wY2kvcGNpX2RtYS5jCmluZGV4IDcyOTdmY2UuLjczNTBjOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9wY2kvcGNpX2RtYS5jCisrKyBiL2FyY2gvczM5MC9wY2kvcGNpX2RtYS5jCkBAIC0xMjksMTIgKzEyOSwxMSBAQAogCQllbnRyeV9jbHJfcHJvdGVjdGVkKGVudHJ5KTsKIH0KIAotc3RhdGljIGludCBkbWFfdXBkYXRlX3RyYW5zKHN0cnVjdCB6cGNpX2RldiAqemRldiwgdW5zaWduZWQgbG9uZyBwYSwKLQkJCSAgICBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQorc3RhdGljIGludCBfX2RtYV91cGRhdGVfdHJhbnMoc3RydWN0IHpwY2lfZGV2ICp6ZGV2LCB1bnNpZ25lZCBsb25nIHBhLAorCQkJICAgICAgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKIAl1bnNpZ25lZCBpbnQgbnJfcGFnZXMgPSBQQUdFX0FMSUdOKHNpemUpID4+IFBBR0VfU0hJRlQ7CiAJdTggKnBhZ2VfYWRkciA9ICh1OCAqKSAocGEgJiBQQUdFX01BU0spOwotCWRtYV9hZGRyX3Qgc3RhcnRfZG1hX2FkZHIgPSBkbWFfYWRkcjsKIAl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKIAl1bnNpZ25lZCBsb25nICplbnRyeTsKIAlpbnQgaSwgcmMgPSAwOwpAQCAtMTQ1LDcgKzE0NCw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnpkZXYtPmRtYV90YWJsZV9sb2NrLCBpcnFfZmxhZ3MpOwogCWlmICghemRldi0+ZG1hX3RhYmxlKSB7CiAJCXJjID0gLUVJTlZBTDsKLQkJZ290byBub19yZWZyZXNoOworCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKQEAgLTE1OSwyMCArMTU4LDYgQEAKIAkJZG1hX2FkZHIgKz0gUEFHRV9TSVpFOwogCX0KIAotCS8qCi0JICogV2l0aCB6ZGV2LT50bGJfcmVmcmVzaCA9PSAwLCBycGNpdCBpcyBub3QgcmVxdWlyZWQgdG8gZXN0YWJsaXNoIG5ldwotCSAqIHRyYW5zbGF0aW9ucyB3aGVuIHByZXZpb3VzbHkgaW52YWxpZCB0cmFuc2xhdGlvbi10YWJsZSBlbnRyaWVzIGFyZQotCSAqIHZhbGlkYXRlZC4gV2l0aCBsYXp5IHVubWFwLCBpdCBhbHNvIGlzIHNraXBwZWQgZm9yIHByZXZpb3VzbHkgdmFsaWQKLQkgKiBlbnRyaWVzLCBidXQgYSBnbG9iYWwgcnBjaXQgaXMgdGhlbiByZXF1aXJlZCBiZWZvcmUgYW55IGFkZHJlc3MgY2FuCi0JICogYmUgcmUtdXNlZCwgaS5lLiBhZnRlciBlYWNoIGlvbW11IGJpdG1hcCB3cmFwLWFyb3VuZC4KLQkgKi8KLQlpZiAoIXpkZXYtPnRsYl9yZWZyZXNoICYmCi0JCQkoIXMzOTBfaW9tbXVfc3RyaWN0IHx8Ci0JCQkoKGZsYWdzICYgWlBDSV9QVEVfVkFMSURfTUFTSykgPT0gWlBDSV9QVEVfVkFMSUQpKSkKLQkJZ290byBub19yZWZyZXNoOwotCi0JcmMgPSB6cGNpX3JlZnJlc2hfdHJhbnMoKHU2NCkgemRldi0+ZmggPDwgMzIsIHN0YXJ0X2RtYV9hZGRyLAotCQkJCW5yX3BhZ2VzICogUEFHRV9TSVpFKTsKIHVuZG9fY3B1X3RyYW5zOgogCWlmIChyYyAmJiAoKGZsYWdzICYgWlBDSV9QVEVfVkFMSURfTUFTSykgPT0gWlBDSV9QVEVfVkFMSUQpKSB7CiAJCWZsYWdzID0gWlBDSV9QVEVfSU5WQUxJRDsKQEAgLTE4NSwxMiArMTcwLDQ2IEBACiAJCQlkbWFfdXBkYXRlX2NwdV90cmFucyhlbnRyeSwgcGFnZV9hZGRyLCBmbGFncyk7CiAJCX0KIAl9Ci0KLW5vX3JlZnJlc2g6CitvdXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpkZXYtPmRtYV90YWJsZV9sb2NrLCBpcnFfZmxhZ3MpOwogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBfX2RtYV9wdXJnZV90bGIoc3RydWN0IHpwY2lfZGV2ICp6ZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCQkJICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwkvKgorCSAqIFdpdGggemRldi0+dGxiX3JlZnJlc2ggPT0gMCwgcnBjaXQgaXMgbm90IHJlcXVpcmVkIHRvIGVzdGFibGlzaCBuZXcKKwkgKiB0cmFuc2xhdGlvbnMgd2hlbiBwcmV2aW91c2x5IGludmFsaWQgdHJhbnNsYXRpb24tdGFibGUgZW50cmllcyBhcmUKKwkgKiB2YWxpZGF0ZWQuIFdpdGggbGF6eSB1bm1hcCwgaXQgYWxzbyBpcyBza2lwcGVkIGZvciBwcmV2aW91c2x5IHZhbGlkCisJICogZW50cmllcywgYnV0IGEgZ2xvYmFsIHJwY2l0IGlzIHRoZW4gcmVxdWlyZWQgYmVmb3JlIGFueSBhZGRyZXNzIGNhbgorCSAqIGJlIHJlLXVzZWQsIGkuZS4gYWZ0ZXIgZWFjaCBpb21tdSBiaXRtYXAgd3JhcC1hcm91bmQuCisJICovCisJaWYgKCF6ZGV2LT50bGJfcmVmcmVzaCAmJgorCQkJKCFzMzkwX2lvbW11X3N0cmljdCB8fAorCQkJKChmbGFncyAmIFpQQ0lfUFRFX1ZBTElEX01BU0spID09IFpQQ0lfUFRFX1ZBTElEKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIHpwY2lfcmVmcmVzaF90cmFucygodTY0KSB6ZGV2LT5maCA8PCAzMiwgZG1hX2FkZHIsCisJCQkJICBQQUdFX0FMSUdOKHNpemUpKTsKK30KKworc3RhdGljIGludCBkbWFfdXBkYXRlX3RyYW5zKHN0cnVjdCB6cGNpX2RldiAqemRldiwgdW5zaWduZWQgbG9uZyBwYSwKKwkJCSAgICBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWludCByYzsKKworCXJjID0gX19kbWFfdXBkYXRlX3RyYW5zKHpkZXYsIHBhLCBkbWFfYWRkciwgc2l6ZSwgZmxhZ3MpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBfX2RtYV9wdXJnZV90bGIoemRldiwgZG1hX2FkZHIsIHNpemUsIGZsYWdzKTsKKwlpZiAocmMgJiYgKChmbGFncyAmIFpQQ0lfUFRFX1ZBTElEX01BU0spID09IFpQQ0lfUFRFX1ZBTElEKSkKKwkJX19kbWFfdXBkYXRlX3RyYW5zKHpkZXYsIHBhLCBkbWFfYWRkciwgc2l6ZSwgWlBDSV9QVEVfSU5WQUxJRCk7CisKKwlyZXR1cm4gcmM7Cit9CisKIHZvaWQgZG1hX2ZyZWVfc2VnX3RhYmxlKHVuc2lnbmVkIGxvbmcgZW50cnkpCiB7CiAJdW5zaWduZWQgbG9uZyAqc3RvID0gZ2V0X3J0X3N0byhlbnRyeSk7CkBAIC0yMzAsNDUgKzI0OSw1NCBAQAogCQkJCWJvdW5kYXJ5X3NpemUsIDApOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBkbWFfYWxsb2NfaW9tbXUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc2l6ZSkKK3N0YXRpYyBkbWFfYWRkcl90IGRtYV9hbGxvY19hZGRyZXNzKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNpemUpCiB7CiAJc3RydWN0IHpwY2lfZGV2ICp6ZGV2ID0gdG9fenBjaSh0b19wY2lfZGV2KGRldikpOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBmbGFnczsKLQlpbnQgd3JhcCA9IDA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmemRldi0+aW9tbXVfYml0bWFwX2xvY2ssIGZsYWdzKTsKIAlvZmZzZXQgPSBfX2RtYV9hbGxvY19pb21tdShkZXYsIHpkZXYtPm5leHRfYml0LCBzaXplKTsKIAlpZiAob2Zmc2V0ID09IC0xKSB7CisJCWlmICghemRldi0+dGxiX3JlZnJlc2ggJiYgIXMzOTBfaW9tbXVfc3RyaWN0KSB7CisJCQkvKiBnbG9iYWwgZmx1c2ggYmVmb3JlIERNQSBhZGRyZXNzZXMgYXJlIHJldXNlZCAqLworCQkJaWYgKHpwY2lfcmVmcmVzaF9nbG9iYWwoemRldikpCisJCQkJZ290byBvdXRfZXJyb3I7CisKKwkJCWJpdG1hcF9hbmRub3QoemRldi0+aW9tbXVfYml0bWFwLCB6ZGV2LT5pb21tdV9iaXRtYXAsCisJCQkJICAgICAgemRldi0+bGF6eV9iaXRtYXAsIHpkZXYtPmlvbW11X3BhZ2VzKTsKKwkJCWJpdG1hcF96ZXJvKHpkZXYtPmxhenlfYml0bWFwLCB6ZGV2LT5pb21tdV9wYWdlcyk7CisJCX0KIAkJLyogd3JhcC1hcm91bmQgKi8KIAkJb2Zmc2V0ID0gX19kbWFfYWxsb2NfaW9tbXUoZGV2LCAwLCBzaXplKTsKLQkJd3JhcCA9IDE7CisJCWlmIChvZmZzZXQgPT0gLTEpCisJCQlnb3RvIG91dF9lcnJvcjsKIAl9Ci0KLQlpZiAob2Zmc2V0ICE9IC0xKSB7Ci0JCXpkZXYtPm5leHRfYml0ID0gb2Zmc2V0ICsgc2l6ZTsKLQkJaWYgKCF6ZGV2LT50bGJfcmVmcmVzaCAmJiAhczM5MF9pb21tdV9zdHJpY3QgJiYgd3JhcCkKLQkJCS8qIGdsb2JhbCBmbHVzaCBhZnRlciB3cmFwLWFyb3VuZCB3aXRoIGxhenkgdW5tYXAgKi8KLQkJCXpwY2lfcmVmcmVzaF9nbG9iYWwoemRldik7Ci0JfQorCXpkZXYtPm5leHRfYml0ID0gb2Zmc2V0ICsgc2l6ZTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6ZGV2LT5pb21tdV9iaXRtYXBfbG9jaywgZmxhZ3MpOwotCXJldHVybiBvZmZzZXQ7CisKKwlyZXR1cm4gemRldi0+c3RhcnRfZG1hICsgb2Zmc2V0ICogUEFHRV9TSVpFOworCitvdXRfZXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmemRldi0+aW9tbXVfYml0bWFwX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gRE1BX0VSUk9SX0NPREU7CiB9CiAKLXN0YXRpYyB2b2lkIGRtYV9mcmVlX2lvbW11KHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBzaXplKQorc3RhdGljIHZvaWQgZG1hX2ZyZWVfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIGludCBzaXplKQogewogCXN0cnVjdCB6cGNpX2RldiAqemRldiA9IHRvX3pwY2kodG9fcGNpX2RldihkZXYpKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG9mZnNldDsKKworCW9mZnNldCA9IChkbWFfYWRkciAtIHpkZXYtPnN0YXJ0X2RtYSkgPj4gUEFHRV9TSElGVDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ6ZGV2LT5pb21tdV9iaXRtYXBfbG9jaywgZmxhZ3MpOwogCWlmICghemRldi0+aW9tbXVfYml0bWFwKQogCQlnb3RvIG91dDsKLQliaXRtYXBfY2xlYXIoemRldi0+aW9tbXVfYml0bWFwLCBvZmZzZXQsIHNpemUpOwotCS8qCi0JICogTGF6eSBmbHVzaCBmb3IgdW5tYXA6IG5lZWQgdG8gbW92ZSBuZXh0X2JpdCB0byBhdm9pZCBhZGRyZXNzIHJlLXVzZQotCSAqIHVudGlsIHdyYXAtYXJvdW5kLgotCSAqLwotCWlmICghczM5MF9pb21tdV9zdHJpY3QgJiYgb2Zmc2V0ID49IHpkZXYtPm5leHRfYml0KQotCQl6ZGV2LT5uZXh0X2JpdCA9IG9mZnNldCArIHNpemU7CisKKwlpZiAoemRldi0+dGxiX3JlZnJlc2ggfHwgczM5MF9pb21tdV9zdHJpY3QpCisJCWJpdG1hcF9jbGVhcih6ZGV2LT5pb21tdV9iaXRtYXAsIG9mZnNldCwgc2l6ZSk7CisJZWxzZQorCQliaXRtYXBfc2V0KHpkZXYtPmxhenlfYml0bWFwLCBvZmZzZXQsIHNpemUpOworCiBvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmemRldi0+aW9tbXVfYml0bWFwX2xvY2ssIGZsYWdzKTsKIH0KQEAgLTI4OSwxNiArMzE3LDE2IEBACiAJCQkJICAgICB1bnNpZ25lZCBsb25nIGF0dHJzKQogewogCXN0cnVjdCB6cGNpX2RldiAqemRldiA9IHRvX3pwY2kodG9fcGNpX2RldihkZXYpKTsKLQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCBpb21tdV9wYWdlX2luZGV4OwogCXVuc2lnbmVkIGxvbmcgcGEgPSBwYWdlX3RvX3BoeXMocGFnZSkgKyBvZmZzZXQ7CiAJaW50IGZsYWdzID0gWlBDSV9QVEVfVkFMSUQ7CisJdW5zaWduZWQgbG9uZyBucl9wYWdlczsKIAlkbWFfYWRkcl90IGRtYV9hZGRyOwogCWludCByZXQ7CiAKIAkvKiBUaGlzIHJvdW5kcyB1cCBudW1iZXIgb2YgcGFnZXMgYmFzZWQgb24gc2l6ZSBhbmQgb2Zmc2V0ICovCiAJbnJfcGFnZXMgPSBpb21tdV9udW1fcGFnZXMocGEsIHNpemUsIFBBR0VfU0laRSk7Ci0JaW9tbXVfcGFnZV9pbmRleCA9IGRtYV9hbGxvY19pb21tdShkZXYsIG5yX3BhZ2VzKTsKLQlpZiAoaW9tbXVfcGFnZV9pbmRleCA9PSAtMSkgeworCWRtYV9hZGRyID0gZG1hX2FsbG9jX2FkZHJlc3MoZGV2LCBucl9wYWdlcyk7CisJaWYgKGRtYV9hZGRyID09IERNQV9FUlJPUl9DT0RFKSB7CiAJCXJldCA9IC1FTk9TUEM7CiAJCWdvdG8gb3V0X2VycjsKIAl9CkBAIC0zMDYsMTIgKzMzNCw2IEBACiAJLyogVXNlIHJvdW5kZWQgdXAgc2l6ZSAqLwogCXNpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTsKIAotCWRtYV9hZGRyID0gemRldi0+c3RhcnRfZG1hICsgaW9tbXVfcGFnZV9pbmRleCAqIFBBR0VfU0laRTsKLQlpZiAoZG1hX2FkZHIgKyBzaXplID4gemRldi0+ZW5kX2RtYSkgewotCQlyZXQgPSAtRVJBTkdFOwotCQlnb3RvIG91dF9mcmVlOwotCX0KLQogCWlmIChkaXJlY3Rpb24gPT0gRE1BX05PTkUgfHwgZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCiAJCWZsYWdzIHw9IFpQQ0lfVEFCTEVfUFJPVEVDVEVEOwogCkBAIC0zMjMsNyArMzQ1LDcgQEAKIAlyZXR1cm4gZG1hX2FkZHIgKyAob2Zmc2V0ICYgflBBR0VfTUFTSyk7CiAKIG91dF9mcmVlOgotCWRtYV9mcmVlX2lvbW11KGRldiwgaW9tbXVfcGFnZV9pbmRleCwgbnJfcGFnZXMpOworCWRtYV9mcmVlX2FkZHJlc3MoZGV2LCBkbWFfYWRkciwgbnJfcGFnZXMpOwogb3V0X2VycjoKIAl6cGNpX2VycigibWFwIGVycm9yOlxuIik7CiAJenBjaV9lcnJfZG1hKHJldCwgcGEpOwpAQCAtMzM1LDcgKzM1Nyw2IEBACiAJCQkJIHVuc2lnbmVkIGxvbmcgYXR0cnMpCiB7CiAJc3RydWN0IHpwY2lfZGV2ICp6ZGV2ID0gdG9fenBjaSh0b19wY2lfZGV2KGRldikpOwotCXVuc2lnbmVkIGxvbmcgaW9tbXVfcGFnZV9pbmRleDsKIAlpbnQgbnBhZ2VzLCByZXQ7CiAKIAlucGFnZXMgPSBpb21tdV9udW1fcGFnZXMoZG1hX2FkZHIsIHNpemUsIFBBR0VfU0laRSk7CkBAIC0zNDksOCArMzcwLDcgQEAKIAl9CiAKIAlhdG9taWM2NF9hZGQobnBhZ2VzLCAmemRldi0+dW5tYXBwZWRfcGFnZXMpOwotCWlvbW11X3BhZ2VfaW5kZXggPSAoZG1hX2FkZHIgLSB6ZGV2LT5zdGFydF9kbWEpID4+IFBBR0VfU0hJRlQ7Ci0JZG1hX2ZyZWVfaW9tbXUoZGV2LCBpb21tdV9wYWdlX2luZGV4LCBucGFnZXMpOworCWRtYV9mcmVlX2FkZHJlc3MoZGV2LCBkbWFfYWRkciwgbnBhZ2VzKTsKIH0KIAogc3RhdGljIHZvaWQgKnMzOTBfZG1hX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCkBAIC0zOTQsMzcgKzQxNCw5OCBAQAogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHBhLCBnZXRfb3JkZXIoc2l6ZSkpOwogfQogCisvKiBNYXAgYSBzZWdtZW50IGludG8gYSBjb250aWd1b3VzIGRtYSBhZGRyZXNzIGFyZWEgKi8KK3N0YXRpYyBpbnQgX19zMzkwX2RtYV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJICAgICBzaXplX3Qgc2l6ZSwgZG1hX2FkZHJfdCAqaGFuZGxlLAorCQkJICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJc3RydWN0IHpwY2lfZGV2ICp6ZGV2ID0gdG9fenBjaSh0b19wY2lfZGV2KGRldikpOworCWRtYV9hZGRyX3QgZG1hX2FkZHJfYmFzZSwgZG1hX2FkZHI7CisJaW50IGZsYWdzID0gWlBDSV9QVEVfVkFMSUQ7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzOworCXVuc2lnbmVkIGxvbmcgcGE7CisJaW50IHJldDsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCWRtYV9hZGRyX2Jhc2UgPSBkbWFfYWxsb2NfYWRkcmVzcyhkZXYsIHNpemUgPj4gUEFHRV9TSElGVCk7CisJaWYgKGRtYV9hZGRyX2Jhc2UgPT0gRE1BX0VSUk9SX0NPREUpCisJCXJldHVybiAtRU5PTUVNOworCisJZG1hX2FkZHIgPSBkbWFfYWRkcl9iYXNlOworCWlmIChkaXIgPT0gRE1BX05PTkUgfHwgZGlyID09IERNQV9UT19ERVZJQ0UpCisJCWZsYWdzIHw9IFpQQ0lfVEFCTEVfUFJPVEVDVEVEOworCisJZm9yIChzID0gc2c7IGRtYV9hZGRyIDwgZG1hX2FkZHJfYmFzZSArIHNpemU7IHMgPSBzZ19uZXh0KHMpKSB7CisJCXBhID0gcGFnZV90b19waHlzKHNnX3BhZ2UocykpICsgcy0+b2Zmc2V0OworCQlyZXQgPSBfX2RtYV91cGRhdGVfdHJhbnMoemRldiwgcGEsIGRtYV9hZGRyLCBzLT5sZW5ndGgsIGZsYWdzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gdW5tYXA7CisKKwkJZG1hX2FkZHIgKz0gcy0+bGVuZ3RoOworCX0KKwlyZXQgPSBfX2RtYV9wdXJnZV90bGIoemRldiwgZG1hX2FkZHJfYmFzZSwgc2l6ZSwgZmxhZ3MpOworCWlmIChyZXQpCisJCWdvdG8gdW5tYXA7CisKKwkqaGFuZGxlID0gZG1hX2FkZHJfYmFzZTsKKwlhdG9taWM2NF9hZGQoc2l6ZSA+PiBQQUdFX1NISUZULCAmemRldi0+bWFwcGVkX3BhZ2VzKTsKKworCXJldHVybiByZXQ7CisKK3VubWFwOgorCWRtYV91cGRhdGVfdHJhbnMoemRldiwgMCwgZG1hX2FkZHJfYmFzZSwgZG1hX2FkZHIgLSBkbWFfYWRkcl9iYXNlLAorCQkJIFpQQ0lfUFRFX0lOVkFMSUQpOworCWRtYV9mcmVlX2FkZHJlc3MoZGV2LCBkbWFfYWRkcl9iYXNlLCBzaXplID4+IFBBR0VfU0hJRlQpOworCXpwY2lfZXJyKCJtYXAgZXJyb3I6XG4iKTsKKwl6cGNpX2Vycl9kbWEocmV0LCBwYSk7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBzMzkwX2RtYV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAogCQkJICAgaW50IG5yX2VsZW1lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCiAJCQkgICB1bnNpZ25lZCBsb25nIGF0dHJzKQogewotCWludCBtYXBwZWRfZWxlbWVudHMgPSAwOwotCXN0cnVjdCBzY2F0dGVybGlzdCAqczsKLQlpbnQgaTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnMgPSBzZywgKnN0YXJ0ID0gc2csICpkbWEgPSBzZzsKKwl1bnNpZ25lZCBpbnQgbWF4ID0gZG1hX2dldF9tYXhfc2VnX3NpemUoZGV2KTsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IHMtPm9mZnNldCArIHMtPmxlbmd0aDsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gcy0+b2Zmc2V0OworCWludCBjb3VudCA9IDAsIGk7CiAKLQlmb3JfZWFjaF9zZyhzZywgcywgbnJfZWxlbWVudHMsIGkpIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBzZ19wYWdlKHMpOwotCQlzLT5kbWFfYWRkcmVzcyA9IHMzOTBfZG1hX21hcF9wYWdlcyhkZXYsIHBhZ2UsIHMtPm9mZnNldCwKLQkJCQkJCSAgICBzLT5sZW5ndGgsIGRpciwgMCk7Ci0JCWlmICghZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBzLT5kbWFfYWRkcmVzcykpIHsKLQkJCXMtPmRtYV9sZW5ndGggPSBzLT5sZW5ndGg7Ci0JCQltYXBwZWRfZWxlbWVudHMrKzsKLQkJfSBlbHNlCi0JCQlnb3RvIHVubWFwOwotCX0KLW91dDoKLQlyZXR1cm4gbWFwcGVkX2VsZW1lbnRzOworCWZvciAoaSA9IDE7IGkgPCBucl9lbGVtZW50czsgaSsrKSB7CisJCXMgPSBzZ19uZXh0KHMpOwogCi11bm1hcDoKLQlmb3JfZWFjaF9zZyhzZywgcywgbWFwcGVkX2VsZW1lbnRzLCBpKSB7Ci0JCWlmIChzLT5kbWFfYWRkcmVzcykKLQkJCXMzOTBfZG1hX3VubWFwX3BhZ2VzKGRldiwgcy0+ZG1hX2FkZHJlc3MsIHMtPmRtYV9sZW5ndGgsCi0JCQkJCSAgICAgZGlyLCAwKTsKLQkJcy0+ZG1hX2FkZHJlc3MgPSAwOworCQlzLT5kbWFfYWRkcmVzcyA9IERNQV9FUlJPUl9DT0RFOwogCQlzLT5kbWFfbGVuZ3RoID0gMDsKKworCQlpZiAocy0+b2Zmc2V0IHx8IChzaXplICYgflBBR0VfTUFTSykgfHwKKwkJICAgIHNpemUgKyBzLT5sZW5ndGggPiBtYXgpIHsKKwkJCWlmIChfX3MzOTBfZG1hX21hcF9zZyhkZXYsIHN0YXJ0LCBzaXplLAorCQkJCQkgICAgICAmZG1hLT5kbWFfYWRkcmVzcywgZGlyKSkKKwkJCQlnb3RvIHVubWFwOworCisJCQlkbWEtPmRtYV9hZGRyZXNzICs9IG9mZnNldDsKKwkJCWRtYS0+ZG1hX2xlbmd0aCA9IHNpemUgLSBvZmZzZXQ7CisKKwkJCXNpemUgPSBvZmZzZXQgPSBzLT5vZmZzZXQ7CisJCQlzdGFydCA9IHM7CisJCQlkbWEgPSBzZ19uZXh0KGRtYSk7CisJCQljb3VudCsrOworCQl9CisJCXNpemUgKz0gcy0+bGVuZ3RoOwogCX0KLQltYXBwZWRfZWxlbWVudHMgPSAwOwotCWdvdG8gb3V0OworCWlmIChfX3MzOTBfZG1hX21hcF9zZyhkZXYsIHN0YXJ0LCBzaXplLCAmZG1hLT5kbWFfYWRkcmVzcywgZGlyKSkKKwkJZ290byB1bm1hcDsKKworCWRtYS0+ZG1hX2FkZHJlc3MgKz0gb2Zmc2V0OworCWRtYS0+ZG1hX2xlbmd0aCA9IHNpemUgLSBvZmZzZXQ7CisKKwlyZXR1cm4gY291bnQgKyAxOwordW5tYXA6CisJZm9yX2VhY2hfc2coc2csIHMsIGNvdW50LCBpKQorCQlzMzkwX2RtYV91bm1hcF9wYWdlcyhkZXYsIHNnX2RtYV9hZGRyZXNzKHMpLCBzZ19kbWFfbGVuKHMpLAorCQkJCSAgICAgZGlyLCBhdHRycyk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgczM5MF9kbWFfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLApAQCAtNDM1LDggKzUxNiw5IEBACiAJaW50IGk7CiAKIAlmb3JfZWFjaF9zZyhzZywgcywgbnJfZWxlbWVudHMsIGkpIHsKLQkJczM5MF9kbWFfdW5tYXBfcGFnZXMoZGV2LCBzLT5kbWFfYWRkcmVzcywgcy0+ZG1hX2xlbmd0aCwgZGlyLAotCQkJCSAgICAgMCk7CisJCWlmIChzLT5kbWFfbGVuZ3RoKQorCQkJczM5MF9kbWFfdW5tYXBfcGFnZXMoZGV2LCBzLT5kbWFfYWRkcmVzcywgcy0+ZG1hX2xlbmd0aCwKKwkJCQkJICAgICBkaXIsIGF0dHJzKTsKIAkJcy0+ZG1hX2FkZHJlc3MgPSAwOwogCQlzLT5kbWFfbGVuZ3RoID0gMDsKIAl9CkBAIC00ODIsNyArNTY0LDE0IEBACiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBmcmVlX2RtYV90YWJsZTsKIAl9CisJaWYgKCF6ZGV2LT50bGJfcmVmcmVzaCAmJiAhczM5MF9pb21tdV9zdHJpY3QpIHsKKwkJemRldi0+bGF6eV9iaXRtYXAgPSB2emFsbG9jKHpkZXYtPmlvbW11X3BhZ2VzIC8gOCk7CisJCWlmICghemRldi0+bGF6eV9iaXRtYXApIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gZnJlZV9iaXRtYXA7CisJCX0KIAorCX0KIAlyYyA9IHpwY2lfcmVnaXN0ZXJfaW9hdCh6ZGV2LCAwLCB6ZGV2LT5zdGFydF9kbWEsIHpkZXYtPmVuZF9kbWEsCiAJCQkJKHU2NCkgemRldi0+ZG1hX3RhYmxlKTsKIAlpZiAocmMpCkBAIC00OTIsNiArNTgxLDggQEAKIGZyZWVfYml0bWFwOgogCXZmcmVlKHpkZXYtPmlvbW11X2JpdG1hcCk7CiAJemRldi0+aW9tbXVfYml0bWFwID0gTlVMTDsKKwl2ZnJlZSh6ZGV2LT5sYXp5X2JpdG1hcCk7CisJemRldi0+bGF6eV9iaXRtYXAgPSBOVUxMOwogZnJlZV9kbWFfdGFibGU6CiAJZG1hX2ZyZWVfY3B1X3RhYmxlKHpkZXYtPmRtYV90YWJsZSk7CiAJemRldi0+ZG1hX3RhYmxlID0gTlVMTDsKQEAgLTUxMyw2ICs2MDQsOSBAQAogCXpkZXYtPmRtYV90YWJsZSA9IE5VTEw7CiAJdmZyZWUoemRldi0+aW9tbXVfYml0bWFwKTsKIAl6ZGV2LT5pb21tdV9iaXRtYXAgPSBOVUxMOworCXZmcmVlKHpkZXYtPmxhenlfYml0bWFwKTsKKwl6ZGV2LT5sYXp5X2JpdG1hcCA9IE5VTEw7CisKIAl6ZGV2LT5uZXh0X2JpdCA9IDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2NvcmUvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9zY29yZS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggMjBhMzU5MS4uMDFhZWM4YyAxMDA2NDQKLS0tIGEvYXJjaC9zY29yZS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9zY29yZS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTE2Myw3ICsxNjMsNyBAQAogCQlfX2dldF91c2VyX2FzbSh2YWwsICJsdyIsIHB0cik7CQkJCVwKIAkJIGJyZWFrOwkJCQkJCQlcCiAJY2FzZSA4OiAJCQkJCQkJXAotCQlpZiAoKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJnZhbCwgcHRyLCA4KSkgPT0gMCkJXAorCQlpZiAoX19jb3B5X2Zyb21fdXNlcigodm9pZCAqKSZ2YWwsIHB0ciwgOCkgPT0gMCkJXAogCQkJX19ndV9lcnIgPSAwOwkJCQkJXAogCQllbHNlCQkJCQkJCVwKIAkJCV9fZ3VfZXJyID0gLUVGQVVMVDsJCQkJXApAQCAtMTg4LDYgKzE4OCw4IEBACiAJCQkJCQkJCQlcCiAJaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIF9fZ3VfcHRyLCBzaXplKSkpCQlcCiAJCV9fZ2V0X3VzZXJfY29tbW9uKCh4KSwgc2l6ZSwgX19ndV9wdHIpOwkJCVwKKwllbHNlCQkJCQkJCQlcCisJCSh4KSA9IDA7CQkJCQkJXAogCQkJCQkJCQkJXAogCV9fZ3VfZXJyOwkJCQkJCQlcCiB9KQpAQCAtMjAxLDYgKzIwMyw3IEBACiAJCSIyOlxuIgkJCQkJCQlcCiAJCSIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJCVwKIAkJIjM6bGkJJTAsICU0XG4iCQkJCQlcCisJCSJsaQklMSwgMFxuIgkJCQkJXAogCQkiagkyYlxuIgkJCQkJCVwKIAkJIi5wcmV2aW91c1xuIgkJCQkJCVwKIAkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCQkJXApAQCAtMjk4LDM1ICszMDEsMzQgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwogY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbGVuKQogewotCXVuc2lnbmVkIGxvbmcgb3ZlcjsKKwl1bnNpZ25lZCBsb25nIHJlcyA9IGxlbjsKIAotCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIGxlbikpCi0JCXJldHVybiBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIGZyb20sIGxlbik7CisJaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIGxlbikpKQorCQlyZXMgPSBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIGZyb20sIGxlbik7CiAKLQlpZiAoKHVuc2lnbmVkIGxvbmcpZnJvbSA8IFRBU0tfU0laRSkgewotCQlvdmVyID0gKHVuc2lnbmVkIGxvbmcpZnJvbSArIGxlbiAtIFRBU0tfU0laRTsKLQkJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbGVuIC0gb3ZlcikgKyBvdmVyOwotCX0KLQlyZXR1cm4gbGVuOworCWlmICh1bmxpa2VseShyZXMpKQorCQltZW1zZXQodG8gKyAobGVuIC0gcmVzKSwgMCwgcmVzKTsKKworCXJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwogY29weV90b191c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIGxlbikKIHsKLQl1bnNpZ25lZCBsb25nIG92ZXI7CisJaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbGVuKSkpCisJCWxlbiA9IF9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbGVuKTsKIAotCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbGVuKSkKLQkJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbGVuKTsKLQotCWlmICgodW5zaWduZWQgbG9uZyl0byA8IFRBU0tfU0laRSkgewotCQlvdmVyID0gKHVuc2lnbmVkIGxvbmcpdG8gKyBsZW4gLSBUQVNLX1NJWkU7Ci0JCXJldHVybiBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIGZyb20sIGxlbiAtIG92ZXIpICsgb3ZlcjsKLQl9CiAJcmV0dXJuIGxlbjsKIH0KIAotI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBsZW4pCVwKLQkJX19jb3B5X3RvZnJvbV91c2VyKCh0byksIChmcm9tKSwgKGxlbikpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK19fY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgbGVmdCA9IF9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbGVuKTsKKwlpZiAodW5saWtlbHkobGVmdCkpCisJCW1lbXNldCh0byArIChsZW4gLSBsZWZ0KSwgMCwgbGVmdCk7CisJcmV0dXJuIGxlZnQ7Cit9CiAKICNkZWZpbmUgX19jb3B5X3RvX3VzZXIodG8sIGZyb20sIGxlbikJCVwKIAkJX19jb3B5X3RvZnJvbV91c2VyKCh0byksIChmcm9tKSwgKGxlbikpCkBAIC0zNDAsMTcgKzM0MiwxNyBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCiBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIGxlbikKIHsKLQlyZXR1cm4gX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbGVuKTsKKwlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBsZW4pOwogfQogCi0jZGVmaW5lIF9fY29weV9pbl91c2VyKHRvLCBmcm9tLCBsZW4pCV9fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIGxlbikKKyNkZWZpbmUgX19jb3B5X2luX3VzZXIodG8sIGZyb20sIGxlbikJX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBsZW4pCiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwogY29weV9pbl91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIGxlbikKIHsKIAlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBsZW4pICYmCiAJCSAgICAgIGFjY2Vzc19vayhWRVJGSVRZX1dSSVRFLCB0bywgbGVuKSkKLQkJcmV0dXJuIGNvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBsZW4pOworCQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBsZW4pOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9hdG9taWMtbGxzYy5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9hdG9taWMtbGxzYy5oCmluZGV4IGNhZWEyYzQuLjFkMTU5Y2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vYXRvbWljLWxsc2MuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2F0b21pYy1sbHNjLmgKQEAgLTYwLDcgKzYwLDcgQEAKICIJbW92Y28ubAklMCwgQCUzCQkJCQlcbiIJCVwKICIJYmYJMWIJCQkJCVxuIgkJXAogIglzeW5jbwkJCQkJCVxuIgkJXAotCTogIj0meiIgKHRlbXApLCAiPSZ6IiAocmVzKQkJCQkJXAorCTogIj0meiIgKHRlbXApLCAiPSZyIiAocmVzKQkJCQkJXAogCTogInIiIChpKSwgInIiICgmdi0+Y291bnRlcikJCQkJCVwKIAk6ICJ0Iik7CQkJCQkJCQlcCiAJCQkJCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IGE0OTYzNWMuLjkyYWRlNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0xNTEsNyArMTUxLDEwIEBACiAJX19rZXJuZWxfc2l6ZV90IF9fY29weV9zaXplID0gKF9fa2VybmVsX3NpemVfdCkgbjsKIAogCWlmIChfX2NvcHlfc2l6ZSAmJiBfX2FjY2Vzc19vayhfX2NvcHlfZnJvbSwgX19jb3B5X3NpemUpKQotCQlyZXR1cm4gX19jb3B5X3VzZXIodG8sIGZyb20sIF9fY29weV9zaXplKTsKKwkJX19jb3B5X3NpemUgPSBfX2NvcHlfdXNlcih0bywgZnJvbSwgX19jb3B5X3NpemUpOworCisJaWYgKHVubGlrZWx5KF9fY29weV9zaXplKSkKKwkJbWVtc2V0KHRvICsgKG4gLSBfX2NvcHlfc2l6ZSksIDAsIF9fY29weV9zaXplKTsKIAogCXJldHVybiBfX2NvcHlfc2l6ZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmgKaW5kZXggYzAxMzc2Yy4uY2E1MDczZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmgKQEAgLTI0LDYgKzI0LDcgQEAKICNkZWZpbmUgX19nZXRfdXNlcl9zaXplKHgscHRyLHNpemUscmV0dmFsKQkJCVwKIGRvIHsJCQkJCQkJCVwKIAlyZXR2YWwgPSAwOwkJCQkJCVwKKwl4ID0gMDsJCQkJCQkJXAogCXN3aXRjaCAoc2l6ZSkgewkJCQkJCVwKIAljYXNlIDE6CQkJCQkJCVwKIAkJcmV0dmFsID0gX19nZXRfdXNlcl9hc21fYigodm9pZCAqKSZ4LAkJXApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc21wLXNoeDMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NtcC1zaHgzLmMKaW5kZXggODM5NjEyYy4uMGQzNjM3YyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc21wLXNoeDMuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zbXAtc2h4My5jCkBAIC0xMjIsMzIgKzEyMiwxNiBAQAogCV9fcmF3X3dyaXRlbChTVEJDUl9SRVNFVCwgU1RCQ1JfUkVHKGNwdSkpOwogfQogCi1zdGF0aWMgaW50Ci1zaHgzX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IHNoeDNfY3B1X3ByZXBhcmUodW5zaWduZWQgaW50IGNwdSkKIHsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gKHVuc2lnbmVkIGludCloY3B1OwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIENQVV9VUF9QUkVQQVJFOgotCQlzaHgzX3VwZGF0ZV9ib290X3ZlY3RvcihjcHUpOwotCQlicmVhazsKLQljYXNlIENQVV9PTkxJTkU6Ci0JCXByX2luZm8oIkNQVSAldSBpcyBub3cgb25saW5lXG4iLCBjcHUpOwotCQlicmVhazsKLQljYXNlIENQVV9ERUFEOgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gTk9USUZZX09LOworCXNoeDNfdXBkYXRlX2Jvb3RfdmVjdG9yKGNwdSk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgc2h4M19jcHVfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwJCT0gc2h4M19jcHVfY2FsbGJhY2ssCi19OwotCiBzdGF0aWMgaW50IHJlZ2lzdGVyX3NoeDNfY3B1X25vdGlmaWVyKHZvaWQpCiB7Ci0JcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZzaHgzX2NwdV9ub3RpZmllcik7CisJY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9TSF9TSDNYX1BSRVBBUkUsICJzaC9zaHgzOnByZXBhcmUiLAorCQkJCSAgc2h4M19jcHVfcHJlcGFyZSwgTlVMTCk7CiAJcmV0dXJuIDA7CiB9CiBsYXRlX2luaXRjYWxsKHJlZ2lzdGVyX3NoeDNfY3B1X25vdGlmaWVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2Z0cmFjZS5jIGIvYXJjaC9zaC9rZXJuZWwvZnRyYWNlLmMKaW5kZXggMzg5OTNlMC4uOTVlY2NkNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvZnRyYWNlLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvZnRyYWNlLmMKQEAgLTM4Miw3ICszODIsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JZXJyID0gZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKG9sZCwgc2VsZl9hZGRyLCAmdHJhY2UuZGVwdGgsIDApOworCWVyciA9IGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZShvbGQsIHNlbGZfYWRkciwgJnRyYWNlLmRlcHRoLCAwLCBOVUxMKTsKIAlpZiAoZXJyID09IC1FQlVTWSkgewogCQlfX3Jhd193cml0ZWwob2xkLCBwYXJlbnQpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL0tjb25maWcgYi9hcmNoL3NwYXJjL0tjb25maWcKaW5kZXggNTliMDk2MC4uZjVkNjBmMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvS2NvbmZpZwpAQCAtNTYsNyArNTYsNiBAQAogCWRlZl9ib29sIDY0QklUCiAJc2VsZWN0IEhBVkVfRlVOQ1RJT05fVFJBQ0VSCiAJc2VsZWN0IEhBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSCi0Jc2VsZWN0IEhBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVAogCXNlbGVjdCBIQVZFX0tSRVRQUk9CRVMKIAlzZWxlY3QgSEFWRV9LUFJPQkVTCiAJc2VsZWN0IEhBVkVfUkNVX1RBQkxFX0ZSRUUgaWYgU01QCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2Z0cmFjZS5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mdHJhY2UuaAppbmRleCAzMTkyYThlLi42Mjc1NWEzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2Z0cmFjZS5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZnRyYWNlLmgKQEAgLTksNiArOSwxMCBAQAogdm9pZCBfbWNvdW50KHZvaWQpOwogI2VuZGlmCiAKKyNlbmRpZiAvKiBDT05GSUdfTUNPVU5UICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUEFSQzY0KSAmJiAhZGVmaW5lZChDQ19VU0VfRkVOVFJZKQorI2RlZmluZSBIQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1QKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0RZTkFNSUNfRlRSQUNFCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2h5cGVydmlzb3IuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaHlwZXJ2aXNvci5oCmluZGV4IGY1YjY1MzcuLjY2NmQ1YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaHlwZXJ2aXNvci5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaHlwZXJ2aXNvci5oCkBAIC0xNzQ0LDYgKzE3NDQsNyBAQAogCiAjZGVmaW5lIEhWX1BDSV9NQVBfQVRUUl9SRUFECQkweDAxCiAjZGVmaW5lIEhWX1BDSV9NQVBfQVRUUl9XUklURQkJMHgwMgorI2RlZmluZSBIVl9QQ0lfTUFQX0FUVFJfUkVMQVhFRF9PUkRFUgkweDA0CiAKICNkZWZpbmUgSFZfUENJX0RFVklDRV9CVUlMRChiLGQsZikJXAogCSgoKChiKSAmIDB4ZmYpIDw8IDE2KSB8IFwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGFnZV82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wYWdlXzY0LmgKaW5kZXggOGMyYThjOS4uYzEyNjNmYyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wYWdlXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wYWdlXzY0LmgKQEAgLTI1LDYgKzI1LDcgQEAKICNkZWZpbmUgSFBBR0VfTUFTSwkJKH4oSFBBR0VfU0laRSAtIDFVTCkpCiAjZGVmaW5lIEhVR0VUTEJfUEFHRV9PUkRFUgkoSFBBR0VfU0hJRlQgLSBQQUdFX1NISUZUKQogI2RlZmluZSBIQVZFX0FSQ0hfSFVHRVRMQl9VTk1BUFBFRF9BUkVBCisjZGVmaW5lIFJFQUxfSFBBR0VfUEVSX0hQQUdFCShfQUMoMSxVTCkgPDwgKEhQQUdFX1NISUZUIC0gUkVBTF9IUEFHRV9TSElGVCkpCiAjZW5kaWYKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc21wXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NtcF82NC5oCmluZGV4IDI2ZDllNzcuLmNlMjIzM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc21wXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zbXBfNjQuaApAQCAtNDMsNiArNDMsNyBAQAogaW50IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCh2b2lkKTsKICNkZWZpbmUgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSAoY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHUpCiAKK3ZvaWQgc21wX2ZpbGxfaW5fY3B1X3Bvc3NpYmxlX21hcCh2b2lkKTsKIHZvaWQgc21wX2ZpbGxfaW5fc2liX2NvcmVfbWFwcyh2b2lkKTsKIHZvaWQgY3B1X3BsYXlfZGVhZCh2b2lkKTsKIApAQCAtNzIsNiArNzMsNyBAQAogI2RlZmluZSBzbXBfZmlsbF9pbl9zaWJfY29yZV9tYXBzKCkgZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBzbXBfZmV0Y2hfZ2xvYmFsX3JlZ3MoKSBkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHNtcF9mZXRjaF9nbG9iYWxfcG11KCkgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBzbXBfZmlsbF9pbl9jcHVfcG9zc2libGVfbWFwKCkgZG8geyB9IHdoaWxlICgwKQogCiAjZW5kaWYgLyogIShDT05GSUdfU01QKSAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3VhY2Nlc3NfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdWFjY2Vzc18zMi5oCmluZGV4IDM0MWE1YTEuLmVhNTVmODYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdWFjY2Vzc18zMi5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdWFjY2Vzc18zMi5oCkBAIC0yNDksOCArMjQ5LDcgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJaWYgKG4gJiYgX19hY2Nlc3Nfb2soKHVuc2lnbmVkIGxvbmcpIHRvLCBuKSkgewotCQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQotCQkJY2hlY2tfb2JqZWN0X3NpemUoZnJvbSwgbiwgdHJ1ZSk7CisJCWNoZWNrX29iamVjdF9zaXplKGZyb20sIG4sIHRydWUpOwogCQlyZXR1cm4gX19jb3B5X3VzZXIodG8sIChfX2ZvcmNlIHZvaWQgX191c2VyICopIGZyb20sIG4pOwogCX0gZWxzZQogCQlyZXR1cm4gbjsKQEAgLTI1OCwxOSArMjU3LDE5IEBACiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKLQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQotCQljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBuLCB0cnVlKTsKKwljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBuLCB0cnVlKTsKIAlyZXR1cm4gX19jb3B5X3VzZXIodG8sIChfX2ZvcmNlIHZvaWQgX191c2VyICopIGZyb20sIG4pOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJaWYgKG4gJiYgX19hY2Nlc3Nfb2soKHVuc2lnbmVkIGxvbmcpIGZyb20sIG4pKSB7Ci0JCWlmICghX19idWlsdGluX2NvbnN0YW50X3AobikpCi0JCQljaGVja19vYmplY3Rfc2l6ZSh0bywgbiwgZmFsc2UpOworCQljaGVja19vYmplY3Rfc2l6ZSh0bywgbiwgZmFsc2UpOwogCQlyZXR1cm4gX19jb3B5X3VzZXIoKF9fZm9yY2Ugdm9pZCBfX3VzZXIgKikgdG8sIGZyb20sIG4pOwotCX0gZWxzZQorCX0gZWxzZSB7CisJCW1lbXNldCh0bywgMCwgbik7CiAJCXJldHVybiBuOworCX0KIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oCmluZGV4IDhiZGE5NGYuLjM3YTMxNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oCkBAIC0yMTIsOCArMjEyLDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHJldDsKIAotCWlmICghX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkpCi0JCWNoZWNrX29iamVjdF9zaXplKHRvLCBzaXplLCBmYWxzZSk7CisJY2hlY2tfb2JqZWN0X3NpemUodG8sIHNpemUsIGZhbHNlKTsKIAogCXJldCA9IF9fX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBzaXplKTsKIAlpZiAodW5saWtlbHkocmV0KSkKQEAgLTIzMyw4ICsyMzIsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgcmV0OwogCi0JaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSkKLQkJY2hlY2tfb2JqZWN0X3NpemUoZnJvbSwgc2l6ZSwgdHJ1ZSk7CisJY2hlY2tfb2JqZWN0X3NpemUoZnJvbSwgc2l6ZSwgdHJ1ZSk7CisKIAlyZXQgPSBfX19jb3B5X3RvX3VzZXIodG8sIGZyb20sIHNpemUpOwogCWlmICh1bmxpa2VseShyZXQpKQogCQlyZXQgPSBjb3B5X3RvX3VzZXJfZml4dXAodG8sIGZyb20sIHNpemUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9mdHJhY2UuYwppbmRleCAwYTJkMmRkLi42YmNmZjY5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9mdHJhY2UuYwpAQCAtMTMxLDcgKzEzMSw3IEBACiAJCXJldHVybiBwYXJlbnQgKyA4VUw7CiAKIAlpZiAoZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKHBhcmVudCwgc2VsZl9hZGRyLCAmdHJhY2UuZGVwdGgsCi0JCQkJICAgICBmcmFtZV9wb2ludGVyKSA9PSAtRUJVU1kpCisJCQkJICAgICBmcmFtZV9wb2ludGVyLCBOVUxMKSA9PSAtRUJVU1kpCiAJCXJldHVybiBwYXJlbnQgKyA4VUw7CiAKIAl0cmFjZS5mdW5jID0gc2VsZl9hZGRyOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IGNkODNiZTUuLmIwMzc3ZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTUsNyArNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9jb250ZXh0X3RyYWNraW5nLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHYuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zdW40di5jCmluZGV4IDYxYzZmOTMuLmRiNTdkOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zdW40di5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zdW40di5jCkBAIC0zMCw4ICszMCwxOSBAQAogI2RlZmluZSBEUklWRVJfTkFNRQkicGNpX3N1bjR2IgogI2RlZmluZSBQRlgJCURSSVZFUl9OQU1FICI6ICIKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgdnBjaV9tYWpvciA9IDE7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyB2cGNpX21pbm9yID0gMTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHZwY2lfbWFqb3I7CitzdGF0aWMgdW5zaWduZWQgbG9uZyB2cGNpX21pbm9yOworCitzdHJ1Y3QgdnBjaV92ZXJzaW9uIHsKKwl1bnNpZ25lZCBsb25nIG1ham9yOworCXVuc2lnbmVkIGxvbmcgbWlub3I7Cit9OworCisvKiBPcmRlcmVkIGZyb20gbGFyZ2VzdCBtYWpvciB0byBsb3dlc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgdnBjaV92ZXJzaW9uIHZwY2lfdmVyc2lvbnNbXSA9IHsKKwl7IC5tYWpvciA9IDIsIC5taW5vciA9IDAgfSwKKwl7IC5tYWpvciA9IDEsIC5taW5vciA9IDEgfSwKK307CiAKICNkZWZpbmUgUEdMSVNUX05FTlRTCShQQUdFX1NJWkUgLyBzaXplb2YodTY0KSkKIApAQCAtNjcsNiArNzgsMTAgQEAKIAl1NjQgKnBnbGlzdCA9IHAtPnBnbGlzdDsKIAl1bnNpZ25lZCBsb25nIG5wYWdlcyA9IHAtPm5wYWdlczsKIAorCS8qIFZQQ0kgbWFqPTEsIG1pbj1bMCwxXSBvbmx5IHN1cHBvcnRzIHJlYWQgYW5kIHdyaXRlICovCisJaWYgKHZwY2lfbWFqb3IgPCAyKQorCQlwcm90ICY9IChIVl9QQ0lfTUFQX0FUVFJfUkVBRCB8IEhWX1BDSV9NQVBfQVRUUl9XUklURSk7CisKIAl3aGlsZSAobnBhZ2VzICE9IDApIHsKIAkJbG9uZyBudW07CiAKQEAgLTEzMyw2ICsxNDgsNyBAQAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgYXR0cnMpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgb3JkZXIsIGZpcnN0X3BhZ2UsIG5wYWdlcywgbjsKKwl1bnNpZ25lZCBsb25nIHByb3QgPSAwOwogCXN0cnVjdCBpb21tdSAqaW9tbXU7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdm9pZCAqcmV0OwpAQCAtMTQ2LDYgKzE2Miw5IEBACiAKIAlucGFnZXMgPSBzaXplID4+IElPX1BBR0VfU0hJRlQ7CiAKKwlpZiAoYXR0cnMgJiBETUFfQVRUUl9XRUFLX09SREVSSU5HKQorCQlwcm90ID0gSFZfUENJX01BUF9BVFRSX1JFTEFYRURfT1JERVI7CisKIAluaWQgPSBkZXYtPmFyY2hkYXRhLm51bWFfbm9kZTsKIAlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShuaWQsIGdmcCwgb3JkZXIpOwogCWlmICh1bmxpa2VseSghcGFnZSkpCkBAIC0xNjksNyArMTg4LDcgQEAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKIAlpb21tdV9iYXRjaF9zdGFydChkZXYsCi0JCQkgIChIVl9QQ0lfTUFQX0FUVFJfUkVBRCB8CisJCQkgIChIVl9QQ0lfTUFQX0FUVFJfUkVBRCB8IHByb3QgfAogCQkJICAgSFZfUENJX01BUF9BVFRSX1dSSVRFKSwKIAkJCSAgZW50cnkpOwogCkBAIC0yNjYsNiArMjg1LDkgQEAKIAlpZiAoZGlyZWN0aW9uICE9IERNQV9UT19ERVZJQ0UpCiAJCXByb3QgfD0gSFZfUENJX01BUF9BVFRSX1dSSVRFOwogCisJaWYgKGF0dHJzICYgRE1BX0FUVFJfV0VBS19PUkRFUklORykKKwkJcHJvdCB8PSBIVl9QQ0lfTUFQX0FUVFJfUkVMQVhFRF9PUkRFUjsKKwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAogCWlvbW11X2JhdGNoX3N0YXJ0KGRldiwgcHJvdCwgZW50cnkpOwpAQCAtMzQ0LDYgKzM2Niw5IEBACiAJaWYgKGRpcmVjdGlvbiAhPSBETUFfVE9fREVWSUNFKQogCQlwcm90IHw9IEhWX1BDSV9NQVBfQVRUUl9XUklURTsKIAorCWlmIChhdHRycyAmIERNQV9BVFRSX1dFQUtfT1JERVJJTkcpCisJCXByb3QgfD0gSFZfUENJX01BUF9BVFRSX1JFTEFYRURfT1JERVI7CisKIAlvdXRzID0gcyA9IHNlZ3N0YXJ0ID0gJnNnbGlzdFswXTsKIAlvdXRjb3VudCA9IDE7CiAJaW5jb3VudCA9IG5lbGVtczsKQEAgLTkwNywyMiArOTMyLDI3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpkcDsKIAlzdHJ1Y3QgaW9tbXUgKmlvbW11OwogCXUzMiBkZXZoYW5kbGU7Ci0JaW50IGksIGVycjsKKwlpbnQgaSwgZXJyID0gLUVOT0RFVjsKIAogCWRwID0gb3AtPmRldi5vZl9ub2RlOwogCiAJaWYgKCFodmFwaV9uZWdvdGlhdGVkKyspIHsKLQkJZXJyID0gc3VuNHZfaHZhcGlfcmVnaXN0ZXIoSFZfR1JQX1BDSSwKLQkJCQkJICAgdnBjaV9tYWpvciwKLQkJCQkJICAgJnZwY2lfbWlub3IpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2cGNpX3ZlcnNpb25zKTsgaSsrKSB7CisJCQl2cGNpX21ham9yID0gdnBjaV92ZXJzaW9uc1tpXS5tYWpvcjsKKwkJCXZwY2lfbWlub3IgPSB2cGNpX3ZlcnNpb25zW2ldLm1pbm9yOworCisJCQllcnIgPSBzdW40dl9odmFwaV9yZWdpc3RlcihIVl9HUlBfUENJLCB2cGNpX21ham9yLAorCQkJCQkJICAgJnZwY2lfbWlub3IpOworCQkJaWYgKCFlcnIpCisJCQkJYnJlYWs7CisJCX0KIAogCQlpZiAoZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgcmVnaXN0ZXIgaHZhcGksICIKLQkJCSAgICAgICAiZXJyPSVkXG4iLCBlcnIpOworCQkJcHJfZXJyKFBGWCAiQ291bGQgbm90IHJlZ2lzdGVyIGh2YXBpLCBlcnI9JWRcbiIsIGVycik7CiAJCQlyZXR1cm4gZXJyOwogCQl9Ci0JCXByaW50ayhLRVJOX0lORk8gUEZYICJSZWdpc3RlcmVkIGh2YXBpIG1ham9yWyVsdV0gbWlub3JbJWx1XVxuIiwKLQkJICAgICAgIHZwY2lfbWFqb3IsIHZwY2lfbWlub3IpOworCQlwcl9pbmZvKFBGWCAiUmVnaXN0ZXJlZCBodmFwaSBtYWpvclslbHVdIG1pbm9yWyVsdV1cbiIsCisJCQl2cGNpX21ham9yLCB2cGNpX21pbm9yKTsKIAogCQlkbWFfb3BzID0gJnN1bjR2X2RtYV9vcHM7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzY0LmMKaW5kZXggNTk5ZjEyMC4uNmI3MzMxZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cF82NC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhcnRfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgpAQCAtNTAsNiArNTEsOCBAQAogI2luY2x1ZGUgPGFzbS9lbGYuaD4KICNpbmNsdWRlIDxhc20vbWRlc2MuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAKICNpZmRlZiBDT05GSUdfSVBfUE5QCiAjaW5jbHVkZSA8bmV0L2lwY29uZmlnLmg+CkBAIC01OTAsNiArNTkzLDIyIEBACiAJCXBhdXNlX3BhdGNoKCk7CiB9CiAKK3ZvaWQgX19pbml0IGFsbG9jX2lycXN0YWNrX2Jvb3RtZW0odm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgbm9kZTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCW5vZGUgPSBjcHVfdG9fbm9kZShpKTsKKworCQlzb2Z0aXJxX3N0YWNrW2ldID0gX19hbGxvY19ib290bWVtX25vZGUoTk9ERV9EQVRBKG5vZGUpLAorCQkJCQkJCVRIUkVBRF9TSVpFLAorCQkJCQkJCVRIUkVBRF9TSVpFLCAwKTsKKwkJaGFyZGlycV9zdGFja1tpXSA9IF9fYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlKSwKKwkJCQkJCQlUSFJFQURfU0laRSwKKwkJCQkJCQlUSFJFQURfU0laRSwgMCk7CisJfQorfQorCiB2b2lkIF9faW5pdCBzZXR1cF9hcmNoKGNoYXIgKipjbWRsaW5lX3ApCiB7CiAJLyogSW5pdGlhbGl6ZSBQUk9NIGNvbnNvbGUgYW5kIGNvbW1hbmQgbGluZS4gKi8KQEAgLTY1MCw2ICs2NjksMTMgQEAKIAogCXBhZ2luZ19pbml0KCk7CiAJaW5pdF9zcGFyYzY0X2VsZl9od2NhcCgpOworCXNtcF9maWxsX2luX2NwdV9wb3NzaWJsZV9tYXAoKTsKKwkvKgorCSAqIE9uY2UgdGhlIE9GIGRldmljZSB0cmVlIGFuZCBNREVTQyBoYXZlIGJlZW4gc2V0dXAgYW5kIG5yX2NwdXMgaGFzCisJICogYmVlbiBwYXJzZWQsIHdlIGtub3cgdGhlIGxpc3Qgb2YgcG9zc2libGUgY3B1cy4gIFRoZXJlZm9yZSB3ZSBjYW4KKwkgKiBhbGxvY2F0ZSB0aGUgSVJRIHN0YWNrcy4KKwkgKi8KKwlhbGxvY19pcnFzdGFja19ib290bWVtKCk7CiB9CiAKIGV4dGVybiBpbnQgc3RvcF9hX2VuYWJsZWQ7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NtcF8zMi5jCmluZGV4IGZiMzBlN2MuLmU4MGU2YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NtcF8zMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NtcF8zMi5jCkBAIC0zNTIsOSArMzUyLDcgQEAKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQkvKiBJbnZva2UgdGhlIENQVV9TVEFSVElORyBub3RpZmllciBjYWxsYmFja3MgKi8KIAlub3RpZnlfY3B1X3N0YXJ0aW5nKGNwdSk7Ci0KIAlhcmNoX2NwdV9wcmVfb25saW5lKGFyZyk7CiAKIAkvKiBTZXQgdGhlIENQVSBpbiB0aGUgY3B1X29ubGluZV9tYXNrICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jCmluZGV4IDhhNjE1MWEuLmQzMDM1YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jCkBAIC0xMjI3LDYgKzEyMjcsMjAgQEAKIAkJeGNhbGxfZGVsaXZlcl9pbXBsID0gaHlwZXJ2aXNvcl94Y2FsbF9kZWxpdmVyOwogfQogCit2b2lkIF9faW5pdCBzbXBfZmlsbF9pbl9jcHVfcG9zc2libGVfbWFwKHZvaWQpCit7CisJaW50IHBvc3NpYmxlX2NwdXMgPSBudW1fcG9zc2libGVfY3B1cygpOworCWludCBpOworCisJaWYgKHBvc3NpYmxlX2NwdXMgPiBucl9jcHVfaWRzKQorCQlwb3NzaWJsZV9jcHVzID0gbnJfY3B1X2lkczsKKworCWZvciAoaSA9IDA7IGkgPCBwb3NzaWJsZV9jcHVzOyBpKyspCisJCXNldF9jcHVfcG9zc2libGUoaSwgdHJ1ZSk7CisJZm9yICg7IGkgPCBOUl9DUFVTOyBpKyspCisJCXNldF9jcHVfcG9zc2libGUoaSwgZmFsc2UpOworfQorCiB2b2lkIHNtcF9maWxsX2luX3NpYl9jb3JlX21hcHModm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc182NC5jCmluZGV4IGQyMWNkNjIuLjQwOTRhNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfNjQuYwpAQCAtOCw3ICs4LDcgQEAKICAqIEkgbGlrZSB0cmFwcyBvbiB2OSwgOikpKSkKICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC91bmFsaWduZWRfNjQuYwppbmRleCA5YWFjYjkxLi41MmMwMGQ5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC91bmFsaWduZWRfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC91bmFsaWduZWRfNjQuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2FzaS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vcHN0YXRlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2ZhdWx0XzY0LmMgYi9hcmNoL3NwYXJjL21tL2ZhdWx0XzY0LmMKaW5kZXggZTE2ZmRkMi4uNjQzYzE0OSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9mYXVsdF82NC5jCisrKyBiL2FyY2gvc3BhcmMvbW0vZmF1bHRfNjQuYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtNDg0LDYgKzQ4NCw3IEBACiAJCXRzYl9ncm93KG1tLCBNTV9UU0JfQkFTRSwgbW1fcnNzKTsKICNpZiBkZWZpbmVkKENPTkZJR19IVUdFVExCX1BBR0UpIHx8IGRlZmluZWQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKQogCW1tX3JzcyA9IG1tLT5jb250ZXh0Lmh1Z2V0bGJfcHRlX2NvdW50ICsgbW0tPmNvbnRleHQudGhwX3B0ZV9jb3VudDsKKwltbV9yc3MgKj0gUkVBTF9IUEFHRV9QRVJfSFBBR0U7CiAJaWYgKHVubGlrZWx5KG1tX3JzcyA+CiAJCSAgICAgbW0tPmNvbnRleHQudHNiX2Jsb2NrW01NX1RTQl9IVUdFXS50c2JfcnNzX2xpbWl0KSkgewogCQlpZiAobW0tPmNvbnRleHQudHNiX2Jsb2NrW01NX1RTQl9IVUdFXS50c2IpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2luaXRfNjQuYyBiL2FyY2gvc3BhcmMvbW0vaW5pdF82NC5jCmluZGV4IDY1NDU3YzkuLjQzOTc4NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vaW5pdF82NC5jCisrKyBiL2FyY2gvc3BhcmMvbW0vaW5pdF82NC5jCkBAIC01LDcgKzUsNyBAQAogICogIENvcHlyaWdodCAoQykgMTk5Ny0xOTk5IEpha3ViIEplbGluZWsgKGpqQHN1bnNpdGUubWZmLmN1bmkuY3opCiAgKi8KICAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KQEAgLTExNjAsNyArMTE2MCw3IEBACiAJcmV0dXJuIG51bWFfbGF0ZW5jeVtmcm9tXVt0b107CiB9CiAKLXN0YXRpYyBpbnQgZmluZF9iZXN0X251bWFfbm9kZV9mb3JfbWxncm91cChzdHJ1Y3QgbWRlc2NfbWxncm91cCAqZ3JwKQorc3RhdGljIGludCBfX2luaXQgZmluZF9iZXN0X251bWFfbm9kZV9mb3JfbWxncm91cChzdHJ1Y3QgbWRlc2NfbWxncm91cCAqZ3JwKQogewogCWludCBpOwogCkBAIC0xMTczLDggKzExNzMsOCBAQAogCXJldHVybiBpOwogfQogCi1zdGF0aWMgdm9pZCBmaW5kX251bWFfbGF0ZW5jaWVzX2Zvcl9ncm91cChzdHJ1Y3QgbWRlc2NfaGFuZGxlICptZCwgdTY0IGdycCwKLQkJCQkJICBpbnQgaW5kZXgpCitzdGF0aWMgdm9pZCBfX2luaXQgZmluZF9udW1hX2xhdGVuY2llc19mb3JfZ3JvdXAoc3RydWN0IG1kZXNjX2hhbmRsZSAqbWQsCisJCQkJCQkgdTY0IGdycCwgaW50IGluZGV4KQogewogCXU2NCBhcmM7CiAKQEAgLTIwODEsNyArMjA4MSw2IEBACiB7CiAJdW5zaWduZWQgbG9uZyBlbmRfcGZuLCBzaGlmdCwgcGh5c19iYXNlOwogCXVuc2lnbmVkIGxvbmcgcmVhbF9lbmQsIGk7Ci0JaW50IG5vZGU7CiAKIAlzZXR1cF9wYWdlX29mZnNldCgpOwogCkBAIC0yMjUwLDIxICsyMjQ5LDYgQEAKIAkvKiBTZXR1cCBib290bWVtLi4uICovCiAJbGFzdF92YWxpZF9wZm4gPSBlbmRfcGZuID0gYm9vdG1lbV9pbml0KHBoeXNfYmFzZSk7CiAKLQkvKiBPbmNlIHRoZSBPRiBkZXZpY2UgdHJlZSBhbmQgTURFU0MgaGF2ZSBiZWVuIHNldHVwLCB3ZSBrbm93Ci0JICogdGhlIGxpc3Qgb2YgcG9zc2libGUgY3B1cy4gIFRoZXJlZm9yZSB3ZSBjYW4gYWxsb2NhdGUgdGhlCi0JICogSVJRIHN0YWNrcy4KLQkgKi8KLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQlub2RlID0gY3B1X3RvX25vZGUoaSk7Ci0KLQkJc29mdGlycV9zdGFja1tpXSA9IF9fYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlKSwKLQkJCQkJCQlUSFJFQURfU0laRSwKLQkJCQkJCQlUSFJFQURfU0laRSwgMCk7Ci0JCWhhcmRpcnFfc3RhY2tbaV0gPSBfX2FsbG9jX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobm9kZSksCi0JCQkJCQkJVEhSRUFEX1NJWkUsCi0JCQkJCQkJVEhSRUFEX1NJWkUsIDApOwotCX0KLQogCWtlcm5lbF9waHlzaWNhbF9tYXBwaW5nX2luaXQoKTsKIAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vdGxiLmMgYi9hcmNoL3NwYXJjL21tL3RsYi5jCmluZGV4IDM2NTlkMzcuLmM1NmExOTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vdGxiLmMKKysrIGIvYXJjaC9zcGFyYy9tbS90bGIuYwpAQCAtMTc0LDEwICsxNzQsMjUgQEAKIAkJcmV0dXJuOwogCiAJaWYgKChwbWRfdmFsKHBtZCkgXiBwbWRfdmFsKG9yaWcpKSAmIF9QQUdFX1BNRF9IVUdFKSB7Ci0JCWlmIChwbWRfdmFsKHBtZCkgJiBfUEFHRV9QTURfSFVHRSkKLQkJCW1tLT5jb250ZXh0LnRocF9wdGVfY291bnQrKzsKLQkJZWxzZQotCQkJbW0tPmNvbnRleHQudGhwX3B0ZV9jb3VudC0tOworCQkvKgorCQkgKiBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIG9ubHkgc2V0cyBwbWRzIGZvciBUSFAgcGFnZXMuCisJCSAqIEh1Z2V0bGIgcGFnZXMgYXJlIGhhbmRsZWQgZWxzZXdoZXJlLiAgV2UgbmVlZCB0byBjaGVjaworCQkgKiBmb3IgaHVnZSB6ZXJvIHBhZ2UuICBIdWdlIHplcm8gcGFnZXMgYXJlIGxpa2UgaHVnZXRsYgorCQkgKiBwYWdlcyBpbiB0aGF0IHRoZXJlIGlzIG5vIFJTUywgYnV0IHRoZXJlIGlzIHRoZSBuZWVkCisJCSAqIGZvciBUU0IgZW50cmllcy4gIFNvLCBodWdlIHplcm8gcGFnZSBjb3VudHMgZ28gaW50bworCQkgKiBodWdldGxiX3B0ZV9jb3VudC4KKwkJICovCisJCWlmIChwbWRfdmFsKHBtZCkgJiBfUEFHRV9QTURfSFVHRSkgeworCQkJaWYgKGlzX2h1Z2VfemVyb19wYWdlKHBtZF9wYWdlKHBtZCkpKQorCQkJCW1tLT5jb250ZXh0Lmh1Z2V0bGJfcHRlX2NvdW50Kys7CisJCQllbHNlCisJCQkJbW0tPmNvbnRleHQudGhwX3B0ZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJaWYgKGlzX2h1Z2VfemVyb19wYWdlKHBtZF9wYWdlKG9yaWcpKSkKKwkJCQltbS0+Y29udGV4dC5odWdldGxiX3B0ZV9jb3VudC0tOworCQkJZWxzZQorCQkJCW1tLT5jb250ZXh0LnRocF9wdGVfY291bnQtLTsKKwkJfQogCiAJCS8qIERvIG5vdCB0cnkgdG8gYWxsb2NhdGUgdGhlIFRTQiBoYXNoIHRhYmxlIGlmIHdlCiAJCSAqIGRvbid0IGhhdmUgb25lIGFscmVhZHkuICBXZSBoYXZlIHZhcmlvdXMgbG9ja3MgaGVsZApAQCAtMjA0LDYgKzIxOSw5IEBACiAJfQogfQogCisvKgorICogVGhpcyByb3V0aW5lIGlzIG9ubHkgY2FsbGVkIHdoZW4gc3BsaXR0aW5nIGEgVEhQCisgKi8KIHZvaWQgcG1kcF9pbnZhbGlkYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCSAgICAgcG1kX3QgKnBtZHApCiB7CkBAIC0yMTMsNiArMjMxLDE1IEBACiAKIAlzZXRfcG1kX2F0KHZtYS0+dm1fbW0sIGFkZHJlc3MsIHBtZHAsIGVudHJ5KTsKIAlmbHVzaF90bGJfcmFuZ2Uodm1hLCBhZGRyZXNzLCBhZGRyZXNzICsgSFBBR0VfUE1EX1NJWkUpOworCisJLyoKKwkgKiBzZXRfcG1kX2F0KCkgd2lsbCBub3QgYmUgY2FsbGVkIGluIGEgd2F5IHRvIGRlY3JlbWVudAorCSAqIHRocF9wdGVfY291bnQgd2hlbiBzcGxpdHRpbmcgYSBUSFAsIHNvIGRvIGl0IG5vdy4KKwkgKiBTYW5pdHkgY2hlY2sgcG1kIGJlZm9yZSBkb2luZyB0aGUgYWN0dWFsIGRlY3JlbWVudC4KKwkgKi8KKwlpZiAoKHBtZF92YWwoZW50cnkpICYgX1BBR0VfUE1EX0hVR0UpICYmCisJICAgICFpc19odWdlX3plcm9fcGFnZShwbWRfcGFnZShlbnRyeSkpKQorCQkodm1hLT52bV9tbSktPmNvbnRleHQudGhwX3B0ZV9jb3VudC0tOwogfQogCiB2b2lkIHBndGFibGVfdHJhbnNfaHVnZV9kZXBvc2l0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kcCwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vdHNiLmMgYi9hcmNoL3NwYXJjL21tL3RzYi5jCmluZGV4IDY3MjVlZDQuLmYyYjc3MTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vdHNiLmMKKysrIGIvYXJjaC9zcGFyYy9tbS90c2IuYwpAQCAtNDY5LDggKzQ2OSwxMCBAQAogCiBpbnQgaW5pdF9uZXdfY29udGV4dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CisJdW5zaWduZWQgbG9uZyBtbV9yc3MgPSBnZXRfbW1fcnNzKG1tKTsKICNpZiBkZWZpbmVkKENPTkZJR19IVUdFVExCX1BBR0UpIHx8IGRlZmluZWQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKQotCXVuc2lnbmVkIGxvbmcgdG90YWxfaHVnZV9wdGVfY291bnQ7CisJdW5zaWduZWQgbG9uZyBzYXZlZF9odWdldGxiX3B0ZV9jb3VudDsKKwl1bnNpZ25lZCBsb25nIHNhdmVkX3RocF9wdGVfY291bnQ7CiAjZW5kaWYKIAl1bnNpZ25lZCBpbnQgaTsKIApAQCAtNDgzLDEwICs0ODUsMTIgQEAKIAkgKiB3aWxsIHJlLWluY3JlbWVudCB0aGUgY291bnRlcnMgYXMgdGhlIHBhcmVudCBQVEVzIGFyZQogCSAqIGNvcGllZCBpbnRvIHRoZSBjaGlsZCBhZGRyZXNzIHNwYWNlLgogCSAqLwotCXRvdGFsX2h1Z2VfcHRlX2NvdW50ID0gbW0tPmNvbnRleHQuaHVnZXRsYl9wdGVfY291bnQgKwotCQkJIG1tLT5jb250ZXh0LnRocF9wdGVfY291bnQ7CisJc2F2ZWRfaHVnZXRsYl9wdGVfY291bnQgPSBtbS0+Y29udGV4dC5odWdldGxiX3B0ZV9jb3VudDsKKwlzYXZlZF90aHBfcHRlX2NvdW50ID0gbW0tPmNvbnRleHQudGhwX3B0ZV9jb3VudDsKIAltbS0+Y29udGV4dC5odWdldGxiX3B0ZV9jb3VudCA9IDA7CiAJbW0tPmNvbnRleHQudGhwX3B0ZV9jb3VudCA9IDA7CisKKwltbV9yc3MgLT0gc2F2ZWRfdGhwX3B0ZV9jb3VudCAqIChIUEFHRV9TSVpFIC8gUEFHRV9TSVpFKTsKICNlbmRpZgogCiAJLyogY29weV9tbSgpIGNvcGllcyBvdmVyIHRoZSBwYXJlbnQncyBtbV9zdHJ1Y3QgYmVmb3JlIGNhbGxpbmcKQEAgLTQ5OSwxMSArNTAzLDEzIEBACiAJLyogSWYgdGhpcyBpcyBmb3JrLCBpbmhlcml0IHRoZSBwYXJlbnQncyBUU0Igc2l6ZS4gIFdlIHdvdWxkCiAJICogZ3JvdyBpdCB0byB0aGF0IHNpemUgb24gdGhlIGZpcnN0IHBhZ2UgZmF1bHQgYW55d2F5cy4KIAkgKi8KLQl0c2JfZ3JvdyhtbSwgTU1fVFNCX0JBU0UsIGdldF9tbV9yc3MobW0pKTsKKwl0c2JfZ3JvdyhtbSwgTU1fVFNCX0JBU0UsIG1tX3Jzcyk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19IVUdFVExCX1BBR0UpIHx8IGRlZmluZWQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKQotCWlmICh1bmxpa2VseSh0b3RhbF9odWdlX3B0ZV9jb3VudCkpCi0JCXRzYl9ncm93KG1tLCBNTV9UU0JfSFVHRSwgdG90YWxfaHVnZV9wdGVfY291bnQpOworCWlmICh1bmxpa2VseShzYXZlZF9odWdldGxiX3B0ZV9jb3VudCArIHNhdmVkX3RocF9wdGVfY291bnQpKQorCQl0c2JfZ3JvdyhtbSwgTU1fVFNCX0hVR0UsCisJCQkgKHNhdmVkX2h1Z2V0bGJfcHRlX2NvdW50ICsgc2F2ZWRfdGhwX3B0ZV9jb3VudCkgKgorCQkJIFJFQUxfSFBBR0VfUEVSX0hQQUdFKTsKICNlbmRpZgogCiAJaWYgKHVubGlrZWx5KCFtbS0+Y29udGV4dC50c2JfYmxvY2tbTU1fVFNCX0JBU0VdLnRzYikpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL3Byb20vcmFuZ2VzLmMgYi9hcmNoL3NwYXJjL3Byb20vcmFuZ2VzLmMKaW5kZXggYWQxNDNjMS4uNmQ4ZGMyYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL3Jhbmdlcy5jCisrKyBiL2FyY2gvc3BhcmMvcHJvbS9yYW5nZXMuYwpAQCAtMTYsOSArMTYsOCBAQAogc3RhdGljIGludCBudW1fb2Jpb19yYW5nZXM7CiAKIC8qIEFkanVzdCByZWdpc3RlciB2YWx1ZXMgYmFzZWQgdXBvbiB0aGUgcmFuZ2VzIHBhcmFtZXRlcnMuICovCi1zdGF0aWMgdm9pZAotcHJvbV9hZGp1c3RfcmVncyhzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3AsIGludCBucmVncywKLQkJIHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcyAqcmFuZ2VwLCBpbnQgbnJhbmdlcykKK3N0YXRpYyB2b2lkIHByb21fYWRqdXN0X3JlZ3Moc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpyZWdwLCBpbnQgbnJlZ3MsCisJCQkgICAgIHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcyAqcmFuZ2VwLCBpbnQgbnJhbmdlcykKIHsKIAlpbnQgcmVnYywgcm5nYzsKIApAQCAtMzQsMzMgKzMzLDMwIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZAotcHJvbV9hZGp1c3RfcmFuZ2VzKHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcyAqcmFuZ2VzMSwgaW50IG5yYW5nZXMxLAotCQkgICBzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMgKnJhbmdlczIsIGludCBucmFuZ2VzMikKK3N0YXRpYyB2b2lkIHByb21fYWRqdXN0X3JhbmdlcyhzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMgKnJhbmdlczEsIGludCBucmFuZ2VzMSwKKwkJCSAgICAgICBzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMgKnJhbmdlczIsIGludCBucmFuZ2VzMikKIHsKIAlpbnQgcm5nMWMsIHJuZzJjOwogCi0JZm9yKHJuZzFjPTA7IHJuZzFjIDwgbnJhbmdlczE7IHJuZzFjKyspIHsKLQkJZm9yKHJuZzJjPTA7IHJuZzJjIDwgbnJhbmdlczI7IHJuZzJjKyspCi0JCQlpZihyYW5nZXMxW3JuZzFjXS5vdF9wYXJlbnRfc3BhY2UgPT0gcmFuZ2VzMltybmcyY10ub3RfY2hpbGRfc3BhY2UgJiYKKwlmb3IgKHJuZzFjID0gMDsgcm5nMWMgPCBucmFuZ2VzMTsgcm5nMWMrKykgeworCQlmb3IgKHJuZzJjID0gMDsgcm5nMmMgPCBucmFuZ2VzMjsgcm5nMmMrKykKKwkJCWlmIChyYW5nZXMxW3JuZzFjXS5vdF9wYXJlbnRfc3BhY2UgPT0gcmFuZ2VzMltybmcyY10ub3RfY2hpbGRfc3BhY2UgJiYKIAkJCSAgIHJhbmdlczFbcm5nMWNdLm90X3BhcmVudF9iYXNlID49IHJhbmdlczJbcm5nMmNdLm90X2NoaWxkX2Jhc2UgJiYKIAkJCSAgIHJhbmdlczJbcm5nMmNdLm90X2NoaWxkX2Jhc2UgKyByYW5nZXMyW3JuZzJjXS5vcl9zaXplIC0gcmFuZ2VzMVtybmcxY10ub3RfcGFyZW50X2Jhc2UgPiAwVSkKIAkJCWJyZWFrOwotCQlpZihybmcyYyA9PSBucmFuZ2VzMikgLyogb29wcyAqLworCQlpZiAocm5nMmMgPT0gbnJhbmdlczIpIC8qIG9vcHMgKi8KIAkJCXByb21fcHJpbnRmKCJhZGp1c3RfcmFuZ2VzOiBDb3VsZCBub3QgZmluZCBtYXRjaGluZyBidXMgdHlwZS4uLlxuIik7CiAJCWVsc2UgaWYgKHJhbmdlczFbcm5nMWNdLm90X3BhcmVudF9iYXNlICsgcmFuZ2VzMVtybmcxY10ub3Jfc2l6ZSA+IHJhbmdlczJbcm5nMmNdLm90X2NoaWxkX2Jhc2UgKyByYW5nZXMyW3JuZzJjXS5vcl9zaXplKQotCQkJcmFuZ2VzMVtybmcxY10ub3Jfc2l6ZSA9Ci0JCQkJcmFuZ2VzMltybmcyY10ub3RfY2hpbGRfYmFzZSArIHJhbmdlczJbcm5nMmNdLm9yX3NpemUgLSByYW5nZXMxW3JuZzFjXS5vdF9wYXJlbnRfYmFzZTsKKwkJCXJhbmdlczFbcm5nMWNdLm9yX3NpemUgPSByYW5nZXMyW3JuZzJjXS5vdF9jaGlsZF9iYXNlICsgcmFuZ2VzMltybmcyY10ub3Jfc2l6ZSAtIHJhbmdlczFbcm5nMWNdLm90X3BhcmVudF9iYXNlOwogCQlyYW5nZXMxW3JuZzFjXS5vdF9wYXJlbnRfc3BhY2UgPSByYW5nZXMyW3JuZzJjXS5vdF9wYXJlbnRfc3BhY2U7CiAJCXJhbmdlczFbcm5nMWNdLm90X3BhcmVudF9iYXNlICs9IHJhbmdlczJbcm5nMmNdLm90X3BhcmVudF9iYXNlOwogCX0KIH0KIAogLyogQXBwbHkgcHJvYmVkIG9iaW8gcmFuZ2VzIHRvIHJlZ2lzdGVycyBwYXNzZWQsIGlmIG5vIHJhbmdlcyByZXR1cm4uICovCi12b2lkCi1wcm9tX2FwcGx5X29iaW9fcmFuZ2VzKHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVncywgaW50IG5yZWdzKQordm9pZCBwcm9tX2FwcGx5X29iaW9fcmFuZ2VzKHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVncywgaW50IG5yZWdzKQogewotCWlmKG51bV9vYmlvX3JhbmdlcykKKwlpZiAobnVtX29iaW9fcmFuZ2VzKQogCQlwcm9tX2FkanVzdF9yZWdzKHJlZ3MsIG5yZWdzLCBwcm9tbGliX29iaW9fcmFuZ2VzLCBudW1fb2Jpb19yYW5nZXMpOwogfQogRVhQT1JUX1NZTUJPTChwcm9tX2FwcGx5X29iaW9fcmFuZ2VzKTsKQEAgLTc2LDQwICs3Miw0MCBAQAogCW5vZGUgPSBwcm9tX2dldGNoaWxkKHByb21fcm9vdF9ub2RlKTsKIAlvYmlvX25vZGUgPSBwcm9tX3NlYXJjaHNpYmxpbmdzKG5vZGUsICJvYmlvIik7CiAKLQlpZihvYmlvX25vZGUpIHsKKwlpZiAob2Jpb19ub2RlKSB7CiAJCXN1Y2Nlc3MgPSBwcm9tX2dldHByb3BlcnR5KG9iaW9fbm9kZSwgInJhbmdlcyIsCiAJCQkJCSAgIChjaGFyICopIHByb21saWJfb2Jpb19yYW5nZXMsCiAJCQkJCSAgIHNpemVvZihwcm9tbGliX29iaW9fcmFuZ2VzKSk7Ci0JCWlmKHN1Y2Nlc3MgIT0gLTEpCi0JCQludW1fb2Jpb19yYW5nZXMgPSAoc3VjY2Vzcy9zaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzKSk7CisJCWlmIChzdWNjZXNzICE9IC0xKQorCQkJbnVtX29iaW9fcmFuZ2VzID0gKHN1Y2Nlc3MgLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzKSk7CiAJfQogCi0JaWYobnVtX29iaW9fcmFuZ2VzKQorCWlmIChudW1fb2Jpb19yYW5nZXMpCiAJCXByb21fcHJpbnRmKCJQUk9NTElCOiBvYmlvX3JhbmdlcyAlZFxuIiwgbnVtX29iaW9fcmFuZ2VzKTsKIH0KIAogdm9pZCBwcm9tX2FwcGx5X2dlbmVyaWNfcmFuZ2VzKHBoYW5kbGUgbm9kZSwgcGhhbmRsZSBwYXJlbnQsCi0JCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVncywgaW50IG5yZWdzKQorCQkJICAgICAgIHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVncywgaW50IG5yZWdzKQogewogCWludCBzdWNjZXNzOwogCWludCBudW1fcmFuZ2VzOwogCXN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcyByYW5nZXNbUFJPTVJFR19NQVhdOwotCQorCiAJc3VjY2VzcyA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgInJhbmdlcyIsCiAJCQkJICAgKGNoYXIgKikgcmFuZ2VzLAotCQkJCSAgIHNpemVvZiAocmFuZ2VzKSk7CisJCQkJICAgc2l6ZW9mKHJhbmdlcykpOwogCWlmIChzdWNjZXNzICE9IC0xKSB7Ci0JCW51bV9yYW5nZXMgPSAoc3VjY2Vzcy9zaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzKSk7CisJCW51bV9yYW5nZXMgPSAoc3VjY2VzcyAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMpKTsKIAkJaWYgKHBhcmVudCkgewogCQkJc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzIHBhcmVudF9yYW5nZXNbUFJPTVJFR19NQVhdOwogCQkJaW50IG51bV9wYXJlbnRfcmFuZ2VzOwotCQkKKwogCQkJc3VjY2VzcyA9IHByb21fZ2V0cHJvcGVydHkocGFyZW50LCAicmFuZ2VzIiwKLQkJCQkgICAJCSAgIChjaGFyICopIHBhcmVudF9yYW5nZXMsCi0JCQkJICAgCQkgICBzaXplb2YgKHBhcmVudF9yYW5nZXMpKTsKKwkJCQkJCSAgIChjaGFyICopIHBhcmVudF9yYW5nZXMsCisJCQkJCQkgICBzaXplb2YocGFyZW50X3JhbmdlcykpOwogCQkJaWYgKHN1Y2Nlc3MgIT0gLTEpIHsKLQkJCQludW1fcGFyZW50X3JhbmdlcyA9IChzdWNjZXNzL3NpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMpKTsKLQkJCQlwcm9tX2FkanVzdF9yYW5nZXMgKHJhbmdlcywgbnVtX3JhbmdlcywgcGFyZW50X3JhbmdlcywgbnVtX3BhcmVudF9yYW5nZXMpOworCQkJCW51bV9wYXJlbnRfcmFuZ2VzID0gKHN1Y2Nlc3MgLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzKSk7CisJCQkJcHJvbV9hZGp1c3RfcmFuZ2VzKHJhbmdlcywgbnVtX3JhbmdlcywgcGFyZW50X3JhbmdlcywgbnVtX3BhcmVudF9yYW5nZXMpOwogCQkJfQogCQl9CiAJCXByb21fYWRqdXN0X3JlZ3MocmVncywgbnJlZ3MsIHJhbmdlcywgbnVtX3Jhbmdlcyk7CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvS2NvbmZpZyBiL2FyY2gvdGlsZS9LY29uZmlnCmluZGV4IDQ4MjBhMDIuLjc4ZGE3NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9LY29uZmlnCisrKyBiL2FyY2gvdGlsZS9LY29uZmlnCkBAIC00LDcgKzQsNiBAQAogY29uZmlnIFRJTEUKIAlkZWZfYm9vbCB5CiAJc2VsZWN0IEFSQ0hfSEFTX0FUT01JQzY0X0RFQ19JRl9QT1NJVElWRQotCXNlbGVjdCBBUkNIX0hBU19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUwogCXNlbGVjdCBBUkNIX0hBU19ERVZNRU1fSVNfQUxMT1dFRAogCXNlbGVjdCBBUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRwogCXNlbGVjdCBBUkNIX1dBTlRfRlJBTUVfUE9JTlRFUlMKZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDBhOWM0MjY1Li5hNzczNjllIDEwMDY0NAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTQxNiwxNCArNDE2LDEzIEBACiAJcmV0dXJuIG47CiB9CiAKLSNpZmRlZiBDT05GSUdfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1MKLS8qCi0gKiBUaGVyZSBhcmUgc3RpbGwgdW5wcm92YWJsZSBwbGFjZXMgaW4gdGhlIGdlbmVyaWMgY29kZSBhcyBvZiAyLjYuMzQsIHNvIHRoaXMKLSAqIG9wdGlvbiBpcyBub3QgcmVhbGx5IGNvbXBhdGlibGUgd2l0aCAtV2Vycm9yLCB3aGljaCBpcyBtb3JlIHVzZWZ1bCBpbgotICogZ2VuZXJhbC4KLSAqLwotZXh0ZXJuIHZvaWQgY29weV9mcm9tX3VzZXJfb3ZlcmZsb3codm9pZCkKLQlfX2NvbXBpbGV0aW1lX3dhcm5pbmcoImNvcHlfZnJvbV91c2VyKCkgc2l6ZSBpcyBub3QgcHJvdmFibHkgY29ycmVjdCIpOworZXh0ZXJuIHZvaWQgX19jb21waWxldGltZV9lcnJvcigidXNlcmNvcHkgYnVmZmVyIHNpemUgaXMgdG9vIHNtYWxsIikKK19fYmFkX2NvcHlfdXNlcih2b2lkKTsKKworc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdXNlcl9vdmVyZmxvdyhpbnQgc2l6ZSwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlXQVJOKDEsICJCdWZmZXIgb3ZlcmZsb3cgZGV0ZWN0ZWQgKCVkIDwgJWx1KSFcbiIsIHNpemUsIGNvdW50KTsKK30KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjayBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywKIAkJCQkJICBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwKQEAgLTQzMywxNCArNDMyLDEzIEBACiAKIAlpZiAobGlrZWx5KHN6ID09IC0xIHx8IHN6ID49IG4pKQogCQluID0gX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKKwllbHNlIGlmICghX19idWlsdGluX2NvbnN0YW50X3AobikpCisJCWNvcHlfdXNlcl9vdmVyZmxvdyhzeiwgbik7CiAJZWxzZQotCQljb3B5X2Zyb21fdXNlcl9vdmVyZmxvdygpOworCQlfX2JhZF9jb3B5X3VzZXIoKTsKIAogCXJldHVybiBuOwogfQotI2Vsc2UKLSNkZWZpbmUgY29weV9mcm9tX3VzZXIgX2NvcHlfZnJvbV91c2VyCi0jZW5kaWYKIAogI2lmZGVmIF9fdGlsZWd4X18KIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gvdGlsZS9rZXJuZWwvZnRyYWNlLmMKaW5kZXggNGE1NzIwOC4uYjgyN2E0MSAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL3RpbGUva2VybmVsL2Z0cmFjZS5jCkBAIC0xODQsNyArMTg0LDcgQEAKIAkqcGFyZW50ID0gcmV0dXJuX2hvb2tlcjsKIAogCWVyciA9IGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZShvbGQsIHNlbGZfYWRkciwgJnRyYWNlLmRlcHRoLAotCQkJCSAgICAgICBmcmFtZV9wb2ludGVyKTsKKwkJCQkgICAgICAgZnJhbWVfcG9pbnRlciwgTlVMTCk7CiAJaWYgKGVyciA9PSAtRUJVU1kpIHsKIAkJKnBhcmVudCA9IG9sZDsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfa2Vybi5jCmluZGV4IDJkMDI2NmQuLjMyODI3ODcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9oYXJkZG9nX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvaGFyZGRvZ19rZXJuLmMKQEAgLTE3NSwyNyArMTc1LDQgQEAKIAkubmFtZQkJPSAid2F0Y2hkb2ciLAogCS5mb3BzCQk9ICZoYXJkZG9nX2ZvcHMsCiB9OwotCi1zdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPICJVTUwgV2F0Y2hkb2cgVGltZXJcbiI7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGhhcmRkb2dfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZoYXJkZG9nX21pc2NkZXYpOwotCi0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXByaW50ayhiYW5uZXIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBoYXJkZG9nX2V4aXQodm9pZCkKLXsKLQltaXNjX2RlcmVnaXN0ZXIoJmhhcmRkb2dfbWlzY2Rldik7Ci19Ci0KLW1vZHVsZV9pbml0KGhhcmRkb2dfaW5pdCk7Ci1tb2R1bGVfZXhpdChoYXJkZG9nX2V4aXQpOworbW9kdWxlX21pc2NfZGV2aWNlKGhhcmRkb2dfbWlzY2Rldik7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2NvbW1vbi5sZHMuUyBiL2FyY2gvdW0vaW5jbHVkZS9hc20vY29tbW9uLmxkcy5TCmluZGV4IDFkZDViZDguLjEzMzA1NTMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vY29tbW9uLmxkcy5TCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9hc20vY29tbW9uLmxkcy5TCkBAIC04MSw3ICs4MSw3IEBACiAgIC5hbHRpbnN0cl9yZXBsYWNlbWVudCA6IHsgKiguYWx0aW5zdHJfcmVwbGFjZW1lbnQpIH0KICAgLyogLmV4aXQudGV4dCBpcyBkaXNjYXJkIGF0IHJ1bnRpbWUsIG5vdCBsaW5rIHRpbWUsIHRvIGRlYWwgd2l0aCByZWZlcmVuY2VzCiAgICAgIGZyb20gLmFsdGluc3RydWN0aW9ucyBhbmQgLmVoX2ZyYW1lICovCi0gIC5leGl0LnRleHQgOiB7ICooLmV4aXQudGV4dCkgfQorICAuZXhpdC50ZXh0IDogeyBFWElUX1RFWFQgfQogICAuZXhpdC5kYXRhIDogeyAqKC5leGl0LmRhdGEpIH0KIAogICAucHJlaW5pdF9hcnJheSA6IHsKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvc3lzY2FsbC5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy9zeXNjYWxsLmMKaW5kZXggZWY0YjhmOS4uYjc4M2FjOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9zeXNjYWxsLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9zeXNjYWxsLmMKQEAgLTIxLDIxICsyMSwxNyBAQAogCVBUX1JFR1NfU0VUX1NZU0NBTExfUkVUVVJOKHJlZ3MsIC1FTk9TWVMpOwogCiAJaWYgKHN5c2NhbGxfdHJhY2VfZW50ZXIocmVncykpCi0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAKIAkvKiBEbyB0aGUgc2VjY29tcCBjaGVjayBhZnRlciBwdHJhY2U7IGZhaWx1cmVzIHNob3VsZCBiZSBmYXN0LiAqLwogCWlmIChzZWN1cmVfY29tcHV0aW5nKE5VTEwpID09IC0xKQotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCi0JLyogVXBkYXRlIHRoZSBzeXNjYWxsIG51bWJlciBhZnRlciBvcmlnX2F4IGhhcyBwb3RlbnRpYWxseSBiZWVuIHVwZGF0ZWQKLQkgKiB3aXRoIHB0cmFjZS4KLQkgKi8KLQlVUFRfU1lTQ0FMTF9OUihyKSA9IFBUX1NZU0NBTExfTlIoci0+Z3ApOwogCXN5c2NhbGwgPSBVUFRfU1lTQ0FMTF9OUihyKTsKLQogCWlmIChzeXNjYWxsID49IDAgJiYgc3lzY2FsbCA8PSBfX05SX3N5c2NhbGxfbWF4KQogCQlQVF9SRUdTX1NFVF9TWVNDQUxMX1JFVFVSTihyZWdzLAogCQkJCUVYRUNVVEVfU1lTQ0FMTChzeXNjYWxsLCByZWdzKSk7CiAKK291dDoKIAlzeXNjYWxsX3RyYWNlX2xlYXZlKHJlZ3MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvS2NvbmZpZyBiL2FyY2gveDg2L0tjb25maWcKaW5kZXggYzU4MGQ4Yy4uOWIyZDUwYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZworKysgYi9hcmNoL3g4Ni9LY29uZmlnCkBAIC0yNCw3ICsyNCw2IEBACiAJc2VsZWN0IEFSQ0hfRElTQ0FSRF9NRU1CTE9DSwogCXNlbGVjdCBBUkNIX0hBU19BQ1BJX1RBQkxFX1VQR1JBREUgaWYgQUNQSQogCXNlbGVjdCBBUkNIX0hBU19BVE9NSUM2NF9ERUNfSUZfUE9TSVRJVkUKLQlzZWxlY3QgQVJDSF9IQVNfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1MKIAlzZWxlY3QgQVJDSF9IQVNfREVWTUVNX0lTX0FMTE9XRUQKIAlzZWxlY3QgQVJDSF9IQVNfRUxGX1JBTkRPTUlaRQogCXNlbGVjdCBBUkNIX0hBU19GQVNUX01VTFRJUExJRVIKQEAgLTk0LDYgKzkzLDcgQEAKIAlzZWxlY3QgSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFCiAJc2VsZWN0IEhBVkVfQVJDSF9XSVRISU5fU1RBQ0tfRlJBTUVTCiAJc2VsZWN0IEhBVkVfRUJQRl9KSVQJCQlpZiBYODZfNjQKKwlzZWxlY3QgSEFWRV9BUkNIX1ZNQVBfU1RBQ0sJCWlmIFg4Nl82NAogCXNlbGVjdCBIQVZFX0NDX1NUQUNLUFJPVEVDVE9SCiAJc2VsZWN0IEhBVkVfQ01QWENIR19ET1VCTEUKIAlzZWxlY3QgSEFWRV9DTVBYQ0hHX0xPQ0FMCkBAIC0xMTAsNyArMTEwLDYgQEAKIAlzZWxlY3QgSEFWRV9FWElUX1RIUkVBRAogCXNlbGVjdCBIQVZFX0ZFTlRSWQkJCWlmIFg4Nl82NAogCXNlbGVjdCBIQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JECi0Jc2VsZWN0IEhBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVAogCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgogCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX1RSQUNFUgogCXNlbGVjdCBIQVZFX0dDQ19QTFVHSU5TCkBAIC0xNTgsNiArMTU3LDcgQEAKIAlzZWxlY3QgU1BBUlNFX0lSUQogCXNlbGVjdCBTUkNVCiAJc2VsZWN0IFNZU0NUTF9FWENFUFRJT05fVFJBQ0UKKwlzZWxlY3QgVEhSRUFEX0lORk9fSU5fVEFTSwogCXNlbGVjdCBVU0VSX1NUQUNLVFJBQ0VfU1VQUE9SVAogCXNlbGVjdCBWSVJUX1RPX0JVUwogCXNlbGVjdCBYODZfREVWX0RNQV9PUFMJCQlpZiBYODZfNjQKQEAgLTU1MCw2ICs1NTAsMTggQEAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBRdWFyayBiYXNlZCBzeXN0ZW0gc3VjaCBhcyB0aGUgQXJkdWlubwogCSAgY29tcGF0aWJsZSBJbnRlbCBHYWxpbGVvLgogCitjb25maWcgTUxYX1BMQVRGT1JNCisJdHJpc3RhdGUgIk1lbGxhbm94IFRlY2hub2xvZ2llcyBwbGF0Zm9ybSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWDg2XzY0CisJZGVwZW5kcyBvbiBYODZfRVhURU5ERURfUExBVEZPUk0KKwktLS1oZWxwLS0tCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN5c3RlbSBzdXBwb3J0IGZvciB0aGUgTWVsbGFub3ggVGVjaG5vbG9naWVzCisJICBwbGF0Zm9ybS4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBNZWxsYW5veCBzeXN0ZW0uCisKKwkgIE90aGVyd2lzZSwgc2F5IE4uCisKIGNvbmZpZyBYODZfSU5URUxfTFBTUwogCWJvb2wgIkludGVsIExvdyBQb3dlciBTdWJzeXN0ZW0gU3VwcG9ydCIKIAlkZXBlbmRzIG9uIFg4NiAmJiBBQ1BJCkBAIC03MDYsNyArNzE4LDYgQEAKIGNvbmZpZyBQQVJBVklSVF9TUElOTE9DS1MKIAlib29sICJQYXJhdmlydHVhbGl6YXRpb24gbGF5ZXIgZm9yIHNwaW5sb2NrcyIKIAlkZXBlbmRzIG9uIFBBUkFWSVJUICYmIFNNUAotCXNlbGVjdCBVTklOTElORV9TUElOX1VOTE9DSyBpZiAhUVVFVUVEX1NQSU5MT0NLUwogCS0tLWhlbHAtLS0KIAkgIFBhcmF2aXJ0dWFsaXplZCBzcGlubG9ja3MgYWxsb3cgYSBwdm9wcyBiYWNrZW5kIHRvIHJlcGxhY2UgdGhlCiAJICBzcGlubG9jayBpbXBsZW1lbnRhdGlvbiB3aXRoIHNvbWV0aGluZyB2aXJ0dWFsaXphdGlvbi1mcmllbmRseQpAQCAtNzE5LDcgKzczMCw3IEBACiAKIGNvbmZpZyBRVUVVRURfTE9DS19TVEFUCiAJYm9vbCAiUGFyYXZpcnQgcXVldWVkIHNwaW5sb2NrIHN0YXRpc3RpY3MiCi0JZGVwZW5kcyBvbiBQQVJBVklSVF9TUElOTE9DS1MgJiYgREVCVUdfRlMgJiYgUVVFVUVEX1NQSU5MT0NLUworCWRlcGVuZHMgb24gUEFSQVZJUlRfU1BJTkxPQ0tTICYmIERFQlVHX0ZTCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHRoZSBjb2xsZWN0aW9uIG9mIHN0YXRpc3RpY2FsIGRhdGEgb24gdGhlIHNsb3dwYXRoCiAJICBiZWhhdmlvciBvZiBwYXJhdmlydHVhbGl6ZWQgcXVldWVkIHNwaW5sb2NrcyBhbmQgcmVwb3J0CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvZWJvb3QuYyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9lYm9vdC5jCmluZGV4IGZmNTc0ZGEuLmNjNjllMzcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9lYm9vdC5jCisrKyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9lYm9vdC5jCkBAIC0yOSwyMiArMjksMTEgQEAKIHN0YXRpYyB2b2lkIHNldHVwX2Jvb3Rfc2VydmljZXMjI2JpdHMoc3RydWN0IGVmaV9jb25maWcgKmMpCQlcCiB7CQkJCQkJCQkJXAogCWVmaV9zeXN0ZW1fdGFibGVfIyNiaXRzIyNfdCAqdGFibGU7CQkJCVwKLQllZmlfYm9vdF9zZXJ2aWNlc18jI2JpdHMjI190ICpidDsJCQkJXAogCQkJCQkJCQkJXAogCXRhYmxlID0gKHR5cGVvZih0YWJsZSkpc3lzX3RhYmxlOwkJCQlcCiAJCQkJCQkJCQlcCisJYy0+Ym9vdF9zZXJ2aWNlcyA9IHRhYmxlLT5ib290dGltZTsJCQkJXAogCWMtPnRleHRfb3V0cHV0ID0gdGFibGUtPmNvbl9vdXQ7CQkJCVwKLQkJCQkJCQkJCVwKLQlidCA9ICh0eXBlb2YoYnQpKSh1bnNpZ25lZCBsb25nKSh0YWJsZS0+Ym9vdHRpbWUpOwkJXAotCQkJCQkJCQkJXAotCWMtPmFsbG9jYXRlX3Bvb2wgPSBidC0+YWxsb2NhdGVfcG9vbDsJCQkJXAotCWMtPmFsbG9jYXRlX3BhZ2VzID0gYnQtPmFsbG9jYXRlX3BhZ2VzOwkJCQlcCi0JYy0+Z2V0X21lbW9yeV9tYXAgPSBidC0+Z2V0X21lbW9yeV9tYXA7CQkJCVwKLQljLT5mcmVlX3Bvb2wgPSBidC0+ZnJlZV9wb29sOwkJCQkJXAotCWMtPmZyZWVfcGFnZXMgPSBidC0+ZnJlZV9wYWdlczsJCQkJCVwKLQljLT5sb2NhdGVfaGFuZGxlID0gYnQtPmxvY2F0ZV9oYW5kbGU7CQkJCVwKLQljLT5oYW5kbGVfcHJvdG9jb2wgPSBidC0+aGFuZGxlX3Byb3RvY29sOwkJCVwKLQljLT5leGl0X2Jvb3Rfc2VydmljZXMgPSBidC0+ZXhpdF9ib290X3NlcnZpY2VzOwkJCVwKIH0KIEJPT1RfU0VSVklDRVMoMzIpOwogQk9PVF9TRVJWSUNFUyg2NCk7CkBAIC0yODYsMjkgKzI3NSw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBmaW5kX2JpdHModW5zaWduZWQgbG9uZyBtYXNrLCB1OCAqcG9zLCB1OCAqc2l6ZSkKLXsKLQl1OCBmaXJzdCwgbGVuOwotCi0JZmlyc3QgPSAwOwotCWxlbiA9IDA7Ci0KLQlpZiAobWFzaykgewotCQl3aGlsZSAoIShtYXNrICYgMHgxKSkgewotCQkJbWFzayA9IG1hc2sgPj4gMTsKLQkJCWZpcnN0Kys7Ci0JCX0KLQotCQl3aGlsZSAobWFzayAmIDB4MSkgewotCQkJbWFzayA9IG1hc2sgPj4gMTsKLQkJCWxlbisrOwotCQl9Ci0JfQotCi0JKnBvcyA9IGZpcnN0OwotCSpzaXplID0gbGVuOwotfQotCiBzdGF0aWMgZWZpX3N0YXR1c190CiBfX3NldHVwX2VmaV9wY2kzMihlZmlfcGNpX2lvX3Byb3RvY29sXzMyICpwY2ksIHN0cnVjdCBwY2lfc2V0dXBfcm9tICoqX19yb20pCiB7CkBAIC01NzgsNyArNTQ0LDcgQEAKIAllZmlfZ3VpZF90IHVnYV9wcm90byA9IEVGSV9VR0FfUFJPVE9DT0xfR1VJRDsKIAl1bnNpZ25lZCBsb25nIG5yX3VnYXM7CiAJdTMyICpoYW5kbGVzID0gKHUzMiAqKXVnYV9oYW5kbGU7OwotCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJZWZpX3N0YXR1c190IHN0YXR1cyA9IEVGSV9JTlZBTElEX1BBUkFNRVRFUjsKIAlpbnQgaTsKIAogCWZpcnN0X3VnYSA9IE5VTEw7CkBAIC02MjMsNyArNTg5LDcgQEAKIAllZmlfZ3VpZF90IHVnYV9wcm90byA9IEVGSV9VR0FfUFJPVE9DT0xfR1VJRDsKIAl1bnNpZ25lZCBsb25nIG5yX3VnYXM7CiAJdTY0ICpoYW5kbGVzID0gKHU2NCAqKXVnYV9oYW5kbGU7OwotCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJZWZpX3N0YXR1c190IHN0YXR1cyA9IEVGSV9JTlZBTElEX1BBUkFNRVRFUjsKIAlpbnQgaTsKIAogCWZpcnN0X3VnYSA9IE5VTEw7CkBAIC0xMDA0LDc5ICs5NzAsODcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCitzdHJ1Y3QgZXhpdF9ib290X3N0cnVjdCB7CisJc3RydWN0IGJvb3RfcGFyYW1zICpib290X3BhcmFtczsKKwlzdHJ1Y3QgZWZpX2luZm8gKmVmaTsKKwlzdHJ1Y3Qgc2V0dXBfZGF0YSAqZTgyMGV4dDsKKwlfX3UzMiBlODIwZXh0X3NpemU7CisJYm9vbCBpczY0OworfTsKKworc3RhdGljIGVmaV9zdGF0dXNfdCBleGl0X2Jvb3RfZnVuYyhlZmlfc3lzdGVtX3RhYmxlX3QgKnN5c190YWJsZV9hcmcsCisJCQkJICAgc3RydWN0IGVmaV9ib290X21lbW1hcCAqbWFwLAorCQkJCSAgIHZvaWQgKnByaXYpCit7CisJc3RhdGljIGJvb2wgZmlyc3QgPSB0cnVlOworCWNvbnN0IGNoYXIgKnNpZ25hdHVyZTsKKwlfX3UzMiBucl9kZXNjOworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJc3RydWN0IGV4aXRfYm9vdF9zdHJ1Y3QgKnAgPSBwcml2OworCisJaWYgKGZpcnN0KSB7CisJCW5yX2Rlc2MgPSAqbWFwLT5idWZmX3NpemUgLyAqbWFwLT5kZXNjX3NpemU7CisJCWlmIChucl9kZXNjID4gQVJSQVlfU0laRShwLT5ib290X3BhcmFtcy0+ZTgyMF9tYXApKSB7CisJCQl1MzIgbnJfZTgyMGV4dCA9IG5yX2Rlc2MgLQorCQkJCQlBUlJBWV9TSVpFKHAtPmJvb3RfcGFyYW1zLT5lODIwX21hcCk7CisKKwkJCXN0YXR1cyA9IGFsbG9jX2U4MjBleHQobnJfZTgyMGV4dCwgJnAtPmU4MjBleHQsCisJCQkJCSAgICAgICAmcC0+ZTgyMGV4dF9zaXplKTsKKwkJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQlmaXJzdCA9IGZhbHNlOworCX0KKworCXNpZ25hdHVyZSA9IHAtPmlzNjQgPyBFRkk2NF9MT0FERVJfU0lHTkFUVVJFIDogRUZJMzJfTE9BREVSX1NJR05BVFVSRTsKKwltZW1jcHkoJnAtPmVmaS0+ZWZpX2xvYWRlcl9zaWduYXR1cmUsIHNpZ25hdHVyZSwgc2l6ZW9mKF9fdTMyKSk7CisKKwlwLT5lZmktPmVmaV9zeXN0YWIgPSAodW5zaWduZWQgbG9uZylzeXNfdGFibGVfYXJnOworCXAtPmVmaS0+ZWZpX21lbWRlc2Nfc2l6ZSA9ICptYXAtPmRlc2Nfc2l6ZTsKKwlwLT5lZmktPmVmaV9tZW1kZXNjX3ZlcnNpb24gPSAqbWFwLT5kZXNjX3ZlcjsKKwlwLT5lZmktPmVmaV9tZW1tYXAgPSAodW5zaWduZWQgbG9uZykqbWFwLT5tYXA7CisJcC0+ZWZpLT5lZmlfbWVtbWFwX3NpemUgPSAqbWFwLT5tYXBfc2l6ZTsKKworI2lmZGVmIENPTkZJR19YODZfNjQKKwlwLT5lZmktPmVmaV9zeXN0YWJfaGkgPSAodW5zaWduZWQgbG9uZylzeXNfdGFibGVfYXJnID4+IDMyOworCXAtPmVmaS0+ZWZpX21lbW1hcF9oaSA9ICh1bnNpZ25lZCBsb25nKSptYXAtPm1hcCA+PiAzMjsKKyNlbmRpZgorCisJcmV0dXJuIEVGSV9TVUNDRVNTOworfQorCiBzdGF0aWMgZWZpX3N0YXR1c190IGV4aXRfYm9vdChzdHJ1Y3QgYm9vdF9wYXJhbXMgKmJvb3RfcGFyYW1zLAogCQkJICAgICAgdm9pZCAqaGFuZGxlLCBib29sIGlzNjQpCiB7Ci0Jc3RydWN0IGVmaV9pbmZvICplZmkgPSAmYm9vdF9wYXJhbXMtPmVmaV9pbmZvOwotCXVuc2lnbmVkIGxvbmcgbWFwX3N6LCBrZXksIGRlc2Nfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG1hcF9zeiwga2V5LCBkZXNjX3NpemUsIGJ1ZmZfc2l6ZTsKIAllZmlfbWVtb3J5X2Rlc2NfdCAqbWVtX21hcDsKIAlzdHJ1Y3Qgc2V0dXBfZGF0YSAqZTgyMGV4dDsKLQljb25zdCBjaGFyICpzaWduYXR1cmU7CiAJX191MzIgZTgyMGV4dF9zaXplOwotCV9fdTMyIG5yX2Rlc2MsIHByZXZfbnJfZGVzYzsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCV9fdTMyIGRlc2NfdmVyc2lvbjsKLQlib29sIGNhbGxlZF9leGl0ID0gZmFsc2U7Ci0JdTggbnJfZW50cmllczsKLQlpbnQgaTsKKwlzdHJ1Y3QgZWZpX2Jvb3RfbWVtbWFwIG1hcDsKKwlzdHJ1Y3QgZXhpdF9ib290X3N0cnVjdCBwcml2OwogCi0JbnJfZGVzYyA9IDA7Ci0JZTgyMGV4dCA9IE5VTEw7Ci0JZTgyMGV4dF9zaXplID0gMDsKKwltYXAubWFwID0JCSZtZW1fbWFwOworCW1hcC5tYXBfc2l6ZSA9CQkmbWFwX3N6OworCW1hcC5kZXNjX3NpemUgPQkJJmRlc2Nfc2l6ZTsKKwltYXAuZGVzY192ZXIgPQkJJmRlc2NfdmVyc2lvbjsKKwltYXAua2V5X3B0ciA9CQkma2V5OworCW1hcC5idWZmX3NpemUgPQkJJmJ1ZmZfc2l6ZTsKKwlwcml2LmJvb3RfcGFyYW1zID0JYm9vdF9wYXJhbXM7CisJcHJpdi5lZmkgPQkJJmJvb3RfcGFyYW1zLT5lZmlfaW5mbzsKKwlwcml2LmU4MjBleHQgPQkJTlVMTDsKKwlwcml2LmU4MjBleHRfc2l6ZSA9CTA7CisJcHJpdi5pczY0ID0JCWlzNjQ7CiAKLWdldF9tYXA6Ci0Jc3RhdHVzID0gZWZpX2dldF9tZW1vcnlfbWFwKHN5c190YWJsZSwgJm1lbV9tYXAsICZtYXBfc3osICZkZXNjX3NpemUsCi0JCQkJICAgICZkZXNjX3ZlcnNpb24sICZrZXkpOwotCisJLyogTWlnaHQgYXMgd2VsbCBleGl0IGJvb3Qgc2VydmljZXMgbm93ICovCisJc3RhdHVzID0gZWZpX2V4aXRfYm9vdF9zZXJ2aWNlcyhzeXNfdGFibGUsIGhhbmRsZSwgJm1hcCwgJnByaXYsCisJCQkJCWV4aXRfYm9vdF9mdW5jKTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQlyZXR1cm4gc3RhdHVzOwogCi0JcHJldl9ucl9kZXNjID0gbnJfZGVzYzsKLQlucl9kZXNjID0gbWFwX3N6IC8gZGVzY19zaXplOwotCWlmIChucl9kZXNjID4gcHJldl9ucl9kZXNjICYmCi0JICAgIG5yX2Rlc2MgPiBBUlJBWV9TSVpFKGJvb3RfcGFyYW1zLT5lODIwX21hcCkpIHsKLQkJdTMyIG5yX2U4MjBleHQgPSBucl9kZXNjIC0gQVJSQVlfU0laRShib290X3BhcmFtcy0+ZTgyMF9tYXApOwotCi0JCXN0YXR1cyA9IGFsbG9jX2U4MjBleHQobnJfZTgyMGV4dCwgJmU4MjBleHQsICZlODIwZXh0X3NpemUpOwotCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQotCQkJZ290byBmcmVlX21lbV9tYXA7Ci0KLQkJZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCBtZW1fbWFwKTsKLQkJZ290byBnZXRfbWFwOyAvKiBBbGxvY2F0ZWQgbWVtb3J5LCBnZXQgbWFwIGFnYWluICovCi0JfQotCi0Jc2lnbmF0dXJlID0gaXM2NCA/IEVGSTY0X0xPQURFUl9TSUdOQVRVUkUgOiBFRkkzMl9MT0FERVJfU0lHTkFUVVJFOwotCW1lbWNweSgmZWZpLT5lZmlfbG9hZGVyX3NpZ25hdHVyZSwgc2lnbmF0dXJlLCBzaXplb2YoX191MzIpKTsKLQotCWVmaS0+ZWZpX3N5c3RhYiA9ICh1bnNpZ25lZCBsb25nKXN5c190YWJsZTsKLQllZmktPmVmaV9tZW1kZXNjX3NpemUgPSBkZXNjX3NpemU7Ci0JZWZpLT5lZmlfbWVtZGVzY192ZXJzaW9uID0gZGVzY192ZXJzaW9uOwotCWVmaS0+ZWZpX21lbW1hcCA9ICh1bnNpZ25lZCBsb25nKW1lbV9tYXA7Ci0JZWZpLT5lZmlfbWVtbWFwX3NpemUgPSBtYXBfc3o7Ci0KLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JZWZpLT5lZmlfc3lzdGFiX2hpID0gKHVuc2lnbmVkIGxvbmcpc3lzX3RhYmxlID4+IDMyOwotCWVmaS0+ZWZpX21lbW1hcF9oaSA9ICh1bnNpZ25lZCBsb25nKW1lbV9tYXAgPj4gMzI7Ci0jZW5kaWYKLQotCS8qIE1pZ2h0IGFzIHdlbGwgZXhpdCBib290IHNlcnZpY2VzIG5vdyAqLwotCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGV4aXRfYm9vdF9zZXJ2aWNlcywgaGFuZGxlLCBrZXkpOwotCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKLQkJLyoKLQkJICogRXhpdEJvb3RTZXJ2aWNlcygpIHdpbGwgZmFpbCBpZiBhbnkgb2YgdGhlIGV2ZW50Ci0JCSAqIGhhbmRsZXJzIGNoYW5nZSB0aGUgbWVtb3J5IG1hcC4gSW4gd2hpY2ggY2FzZSwgd2UKLQkJICogbXVzdCBiZSBwcmVwYXJlZCB0byByZXRyeSwgYnV0IG9ubHkgb25jZSBzbyB0aGF0Ci0JCSAqIHdlJ3JlIGd1YXJhbnRlZWQgdG8gZXhpdCBvbiByZXBlYXRlZCBmYWlsdXJlcyBpbnN0ZWFkCi0JCSAqIG9mIHNwaW5uaW5nIGZvcmV2ZXIuCi0JCSAqLwotCQlpZiAoY2FsbGVkX2V4aXQpCi0JCQlnb3RvIGZyZWVfbWVtX21hcDsKLQotCQljYWxsZWRfZXhpdCA9IHRydWU7Ci0JCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgbWVtX21hcCk7Ci0JCWdvdG8gZ2V0X21hcDsKLQl9Ci0KKwllODIwZXh0ID0gcHJpdi5lODIwZXh0OworCWU4MjBleHRfc2l6ZSA9IHByaXYuZTgyMGV4dF9zaXplOwogCS8qIEhpc3RvcmljPyAqLwogCWJvb3RfcGFyYW1zLT5hbHRfbWVtX2sgPSAzMiAqIDEwMjQ7CiAKQEAgLTEwODUsMTAgKzEwNTksNiBAQAogCQlyZXR1cm4gc3RhdHVzOwogCiAJcmV0dXJuIEVGSV9TVUNDRVNTOwotCi1mcmVlX21lbV9tYXA6Ci0JZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCBtZW1fbWFwKTsKLQlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfMzIuUyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzMyLlMKaW5kZXggMTAzODUyNC4uZmQwYjZhMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfMzIuUworKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF8zMi5TCkBAIC04Miw3ICs4Miw3IEBACiAKIAkvKiBSZWxvY2F0ZSBlZmlfY29uZmlnLT5jYWxsKCkgKi8KIAlsZWFsCWVmaTMyX2NvbmZpZyglZXNpKSwgJWVheAotCWFkZAklZXNpLCA4OCglZWF4KQorCWFkZAklZXNpLCAzMiglZWF4KQogCXB1c2hsCSVlYXgKIAogCWNhbGwJbWFrZV9ib290X3BhcmFtcwpAQCAtMTA4LDcgKzEwOCw3IEBACiAKIAkvKiBSZWxvY2F0ZSBlZmlfY29uZmlnLT5jYWxsKCkgKi8KIAlsZWFsCWVmaTMyX2NvbmZpZyglZXNpKSwgJWVheAotCWFkZAklZXNpLCA4OCglZWF4KQorCWFkZAklZXNpLCAzMiglZWF4KQogCXB1c2hsCSVlYXgKIDI6CiAJY2FsbAllZmlfbWFpbgpAQCAtMjY0LDcgKzI2NCw3IEBACiAjaWZkZWYgQ09ORklHX0VGSV9TVFVCCiAJLmRhdGEKIGVmaTMyX2NvbmZpZzoKLQkuZmlsbCAxMSw4LDAKKwkuZmlsbCA0LDgsMAogCS5sb25nIGVmaV9jYWxsX3BoeXMKIAkubG9uZyAwCiAJLmJ5dGUgMApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfNjQuUyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzY0LlMKaW5kZXggMGQ4MGE3YS4uZWZkZmJhMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfNjQuUworKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF82NC5TCkBAIC0yNjUsNyArMjY1LDcgQEAKIAkvKgogCSAqIFJlbG9jYXRlIGVmaV9jb25maWctPmNhbGwoKS4KIAkgKi8KLQlhZGRxCSVyYnAsIGVmaTY0X2NvbmZpZys4OCglcmlwKQorCWFkZHEJJXJicCwgZWZpNjRfY29uZmlnKzMyKCVyaXApCiAKIAltb3ZxCSVyYXgsICVyZGkKIAljYWxsCW1ha2VfYm9vdF9wYXJhbXMKQEAgLTI4NSw3ICsyODUsNyBAQAogCSAqIFJlbG9jYXRlIGVmaV9jb25maWctPmNhbGwoKS4KIAkgKi8KIAltb3ZxCWVmaV9jb25maWcoJXJpcCksICVyYXgKLQlhZGRxCSVyYnAsIDg4KCVyYXgpCisJYWRkcQklcmJwLCAzMiglcmF4KQogMjoKIAltb3ZxCWVmaV9jb25maWcoJXJpcCksICVyZGkKIAljYWxsCWVmaV9tYWluCkBAIC00NTcsMTQgKzQ1NywxNCBAQAogI2lmZGVmIENPTkZJR19FRklfTUlYRUQKIAkuZ2xvYmFsIGVmaTMyX2NvbmZpZwogZWZpMzJfY29uZmlnOgotCS5maWxsCTExLDgsMAorCS5maWxsCTQsOCwwCiAJLnF1YWQJZWZpNjRfdGh1bmsKIAkuYnl0ZQkwCiAjZW5kaWYKIAogCS5nbG9iYWwgZWZpNjRfY29uZmlnCiBlZmk2NF9jb25maWc6Ci0JLmZpbGwJMTEsOCwwCisJLmZpbGwJNCw4LDAKIAkucXVhZAllZmlfY2FsbAogCS5ieXRlCTEKICNlbmRpZiAvKiBDT05GSUdfRUZJX1NUVUIgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NvbmZpZ3MvdGlueS5jb25maWcgYi9hcmNoL3g4Ni9jb25maWdzL3RpbnkuY29uZmlnCmluZGV4IDRlMmVjZmEuLjRiNDI5ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NvbmZpZ3MvdGlueS5jb25maWcKKysrIGIvYXJjaC94ODYvY29uZmlncy90aW55LmNvbmZpZwpAQCAtMSArMSwzIEBACiBDT05GSUdfTk9ISUdITUVNPXkKKyMgQ09ORklHX0hJR0hNRU00RyBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdITUVNNjRHIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9zaGEyNTYtbWIvc2hhMjU2X21iLmMgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhMjU2LW1iL3NoYTI1Nl9tYi5jCmluZGV4IDg5ZmE4NWUuLjZmOTdmYjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NyeXB0by9zaGEyNTYtbWIvc2hhMjU2X21iLmMKKysrIGIvYXJjaC94ODYvY3J5cHRvL3NoYTI1Ni1tYi9zaGEyNTZfbWIuYwpAQCAtNDg1LDEwICs0ODUsMTAgQEAKIAogCQkJcmVxID0gY2FzdF9tY3J5cHRkX2N0eF90b19yZXEocmVxX2N0eCk7CiAJCQlpZiAoaXJxc19kaXNhYmxlZCgpKQotCQkJCXJjdHgtPmNvbXBsZXRlKCZyZXEtPmJhc2UsIHJldCk7CisJCQkJcmVxX2N0eC0+Y29tcGxldGUoJnJlcS0+YmFzZSwgcmV0KTsKIAkJCWVsc2UgewogCQkJCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQkJCQlyY3R4LT5jb21wbGV0ZSgmcmVxLT5iYXNlLCByZXQpOworCQkJCXJlcV9jdHgtPmNvbXBsZXRlKCZyZXEtPmJhc2UsIHJldCk7CiAJCQkJbG9jYWxfYmhfZW5hYmxlKCk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9zaGEyNTYtbWIvc2hhMjU2X21iX21ncl9mbHVzaF9hdngyLlMgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhMjU2LW1iL3NoYTI1Nl9tYl9tZ3JfZmx1c2hfYXZ4Mi5TCmluZGV4IGI2OTFkYTkuLmE3OGEwNjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NyeXB0by9zaGEyNTYtbWIvc2hhMjU2X21iX21ncl9mbHVzaF9hdngyLlMKKysrIGIvYXJjaC94ODYvY3J5cHRvL3NoYTI1Ni1tYi9zaGEyNTZfbWJfbWdyX2ZsdXNoX2F2eDIuUwpAQCAtMjY1LDEzICsyNjUsMTQgQEAKIAl2cGluc3JkCSQxLCBfYXJnc19kaWdlc3QrMSozMihzdGF0ZSwgaWR4LCA0KSwgJXhtbTAsICV4bW0wCiAJdnBpbnNyZAkkMiwgX2FyZ3NfZGlnZXN0KzIqMzIoc3RhdGUsIGlkeCwgNCksICV4bW0wLCAleG1tMAogCXZwaW5zcmQJJDMsIF9hcmdzX2RpZ2VzdCszKjMyKHN0YXRlLCBpZHgsIDQpLCAleG1tMCwgJXhtbTAKLQltb3ZsCV9hcmdzX2RpZ2VzdCs0KjMyKHN0YXRlLCBpZHgsIDQpLCB0bXAyX3cKKwl2bW92ZCAgIF9hcmdzX2RpZ2VzdChzdGF0ZSAsIGlkeCwgNCkgLCAleG1tMAogCXZwaW5zcmQJJDEsIF9hcmdzX2RpZ2VzdCs1KjMyKHN0YXRlLCBpZHgsIDQpLCAleG1tMSwgJXhtbTEKIAl2cGluc3JkCSQyLCBfYXJnc19kaWdlc3QrNiozMihzdGF0ZSwgaWR4LCA0KSwgJXhtbTEsICV4bW0xCiAJdnBpbnNyZAkkMywgX2FyZ3NfZGlnZXN0KzcqMzIoc3RhdGUsIGlkeCwgNCksICV4bW0xLCAleG1tMQogCi0Jdm1vdmRxdQkleG1tMCwgX3Jlc3VsdF9kaWdlc3Qoam9iX3JheCkKLQltb3ZsCXRtcDJfdywgX3Jlc3VsdF9kaWdlc3QrMSoxNihqb2JfcmF4KQorICAgICAgICB2bW92ZHF1ICV4bW0wLCBfcmVzdWx0X2RpZ2VzdChqb2JfcmF4KQorICAgICAgICBvZmZzZXQgPSAgKF9yZXN1bHRfZGlnZXN0ICsgMSoxNikKKyAgICAgICAgdm1vdmRxdSAleG1tMSwgb2Zmc2V0KGpvYl9yYXgpCiAKIAlwb3AJJXJieAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vc2hhNTEyLW1iL3NoYTUxMl9tYi5jIGIvYXJjaC94ODYvY3J5cHRvL3NoYTUxMi1tYi9zaGE1MTJfbWIuYwppbmRleCBmNGNmNWI3Li5kMjEwMTc0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9jcnlwdG8vc2hhNTEyLW1iL3NoYTUxMl9tYi5jCisrKyBiL2FyY2gveDg2L2NyeXB0by9zaGE1MTItbWIvc2hhNTEyX21iLmMKQEAgLTQ5NywxMCArNDk3LDEwIEBACiAKIAkJCXJlcSA9IGNhc3RfbWNyeXB0ZF9jdHhfdG9fcmVxKHJlcV9jdHgpOwogCQkJaWYgKGlycXNfZGlzYWJsZWQoKSkKLQkJCQlyY3R4LT5jb21wbGV0ZSgmcmVxLT5iYXNlLCByZXQpOworCQkJCXJlcV9jdHgtPmNvbXBsZXRlKCZyZXEtPmJhc2UsIHJldCk7CiAJCQllbHNlIHsKIAkJCQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JCQkJcmN0eC0+Y29tcGxldGUoJnJlcS0+YmFzZSwgcmV0KTsKKwkJCQlyZXFfY3R4LT5jb21wbGV0ZSgmcmVxLT5iYXNlLCByZXQpOwogCQkJCWxvY2FsX2JoX2VuYWJsZSgpOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9lbnRyeS9jb21tb24uYyBiL2FyY2gveDg2L2VudHJ5L2NvbW1vbi5jCmluZGV4IDE0MzNmNmIuLmJkZDljYzUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2VudHJ5L2NvbW1vbi5jCisrKyBiL2FyY2gveDg2L2VudHJ5L2NvbW1vbi5jCkBAIC0zMSwxMyArMzEsNiBAQAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3N5c2NhbGxzLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgdGhyZWFkX2luZm8gKnB0X3JlZ3NfdG9fdGhyZWFkX2luZm8oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JdW5zaWduZWQgbG9uZyB0b3Bfb2Zfc3RhY2sgPQotCQkodW5zaWduZWQgbG9uZykocmVncyArIDEpICsgVE9QX09GX0tFUk5FTF9TVEFDS19QQURESU5HOwotCXJldHVybiAoc3RydWN0IHRocmVhZF9pbmZvICopKHRvcF9vZl9zdGFjayAtIFRIUkVBRF9TSVpFKTsKLX0KLQogI2lmZGVmIENPTkZJR19DT05URVhUX1RSQUNLSU5HCiAvKiBDYWxsZWQgb24gZW50cnkgZnJvbSB1c2VyIG1vZGUgd2l0aCBJUlFzIG9mZi4gKi8KIF9fdmlzaWJsZSBpbmxpbmUgdm9pZCBlbnRlcl9mcm9tX3VzZXJfbW9kZSh2b2lkKQpAQCAtNzEsNyArNjQsNyBAQAogewogCXUzMiBhcmNoID0gaW5faWEzMl9zeXNjYWxsKCkgPyBBVURJVF9BUkNIX0kzODYgOiBBVURJVF9BUkNIX1g4Nl82NDsKIAotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBwdF9yZWdzX3RvX3RocmVhZF9pbmZvKHJlZ3MpOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CiAJdW5zaWduZWQgbG9uZyByZXQgPSAwOwogCWJvb2wgZW11bGF0ZWQgPSBmYWxzZTsKIAl1MzIgd29yazsKQEAgLTE3MywxOCArMTY2LDE3IEBACiAJCS8qIERpc2FibGUgSVJRcyBhbmQgcmV0cnkgKi8KIAkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAotCQljYWNoZWRfZmxhZ3MgPSBSRUFEX09OQ0UocHRfcmVnc190b190aHJlYWRfaW5mbyhyZWdzKS0+ZmxhZ3MpOworCQljYWNoZWRfZmxhZ3MgPSBSRUFEX09OQ0UoY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncyk7CiAKIAkJaWYgKCEoY2FjaGVkX2ZsYWdzICYgRVhJVF9UT19VU0VSTU9ERV9MT09QX0ZMQUdTKSkKIAkJCWJyZWFrOwotCiAJfQogfQogCiAvKiBDYWxsZWQgd2l0aCBJUlFzIGRpc2FibGVkLiAqLwogX192aXNpYmxlIGlubGluZSB2b2lkIHByZXBhcmVfZXhpdF90b191c2VybW9kZShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gcHRfcmVnc190b190aHJlYWRfaW5mbyhyZWdzKTsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gY3VycmVudF90aHJlYWRfaW5mbygpOwogCXUzMiBjYWNoZWRfZmxhZ3M7CiAKIAlpZiAoSVNfRU5BQkxFRChDT05GSUdfUFJPVkVfTE9DS0lORykgJiYgV0FSTl9PTighaXJxc19kaXNhYmxlZCgpKSkKQEAgLTIwOSw3ICsyMDEsNyBAQAogCSAqIHNwZWNpYWwgY2FzZSBvbmx5IGFwcGxpZXMgYWZ0ZXIgcG9raW5nIHJlZ3MgYW5kIGJlZm9yZSB0aGUKIAkgKiB2ZXJ5IG5leHQgcmV0dXJuIHRvIHVzZXIgbW9kZS4KIAkgKi8KLQl0aS0+c3RhdHVzICY9IH4oVFNfQ09NUEFUfFRTX0kzODZfUkVHU19QT0tFRCk7CisJY3VycmVudC0+dGhyZWFkLnN0YXR1cyAmPSB+KFRTX0NPTVBBVHxUU19JMzg2X1JFR1NfUE9LRUQpOwogI2VuZGlmCiAKIAl1c2VyX2VudGVyX2lycW9mZigpOwpAQCAtMjQ3LDcgKzIzOSw3IEBACiAgKi8KIF9fdmlzaWJsZSBpbmxpbmUgdm9pZCBzeXNjYWxsX3JldHVybl9zbG93cGF0aChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gcHRfcmVnc190b190aHJlYWRfaW5mbyhyZWdzKTsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gY3VycmVudF90aHJlYWRfaW5mbygpOwogCXUzMiBjYWNoZWRfZmxhZ3MgPSBSRUFEX09OQ0UodGktPmZsYWdzKTsKIAogCUNUX1dBUk5fT04oY3Rfc3RhdGUoKSAhPSBDT05URVhUX0tFUk5FTCk7CkBAIC0yNzAsNyArMjYyLDcgQEAKICNpZmRlZiBDT05GSUdfWDg2XzY0CiBfX3Zpc2libGUgdm9pZCBkb19zeXNjYWxsXzY0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBwdF9yZWdzX3RvX3RocmVhZF9pbmZvKHJlZ3MpOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CiAJdW5zaWduZWQgbG9uZyBuciA9IHJlZ3MtPm9yaWdfYXg7CiAKIAllbnRlcl9mcm9tX3VzZXJfbW9kZSgpOwpAQCAtMzAzLDExICsyOTUsMTEgQEAKICAqLwogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGRvX3N5c2NhbGxfMzJfaXJxc19vbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gcHRfcmVnc190b190aHJlYWRfaW5mbyhyZWdzKTsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gY3VycmVudF90aHJlYWRfaW5mbygpOwogCXVuc2lnbmVkIGludCBuciA9ICh1bnNpZ25lZCBpbnQpcmVncy0+b3JpZ19heDsKIAogI2lmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgotCXRpLT5zdGF0dXMgfD0gVFNfQ09NUEFUOworCWN1cnJlbnQtPnRocmVhZC5zdGF0dXMgfD0gVFNfQ09NUEFUOwogI2VuZGlmCiAKIAlpZiAoUkVBRF9PTkNFKHRpLT5mbGFncykgJiBfVElGX1dPUktfU1lTQ0FMTF9FTlRSWSkgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZW50cnkvZW50cnlfMzIuUyBiL2FyY2gveDg2L2VudHJ5L2VudHJ5XzMyLlMKaW5kZXggMGI1NjY2Ni4uYjc1YThiYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZW50cnkvZW50cnlfMzIuUworKysgYi9hcmNoL3g4Ni9lbnRyeS9lbnRyeV8zMi5TCkBAIC0yMDQsMzQgKzIwNCw3MCBAQAogCVBPUF9HU19FWAogLmVuZG0KIAorLyoKKyAqICVlYXg6IHByZXYgdGFzaworICogJWVkeDogbmV4dCB0YXNrCisgKi8KK0VOVFJZKF9fc3dpdGNoX3RvX2FzbSkKKwkvKgorCSAqIFNhdmUgY2FsbGVlLXNhdmVkIHJlZ2lzdGVycworCSAqIFRoaXMgbXVzdCBtYXRjaCB0aGUgb3JkZXIgaW4gc3RydWN0IGluYWN0aXZlX3Rhc2tfZnJhbWUKKwkgKi8KKwlwdXNobAklZWJwCisJcHVzaGwJJWVieAorCXB1c2hsCSVlZGkKKwlwdXNobAklZXNpCisKKwkvKiBzd2l0Y2ggc3RhY2sgKi8KKwltb3ZsCSVlc3AsIFRBU0tfdGhyZWFkc3AoJWVheCkKKwltb3ZsCVRBU0tfdGhyZWFkc3AoJWVkeCksICVlc3AKKworI2lmZGVmIENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUgorCW1vdmwJVEFTS19zdGFja19jYW5hcnkoJWVkeCksICVlYngKKwltb3ZsCSVlYngsIFBFUl9DUFVfVkFSKHN0YWNrX2NhbmFyeSkrc3RhY2tfY2FuYXJ5X29mZnNldAorI2VuZGlmCisKKwkvKiByZXN0b3JlIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMgKi8KKwlwb3BsCSVlc2kKKwlwb3BsCSVlZGkKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKworCWptcAlfX3N3aXRjaF90bworRU5EKF9fc3dpdGNoX3RvX2FzbSkKKworLyoKKyAqIEEgbmV3bHkgZm9ya2VkIHByb2Nlc3MgZGlyZWN0bHkgY29udGV4dCBzd2l0Y2hlcyBpbnRvIHRoaXMgYWRkcmVzcy4KKyAqCisgKiBlYXg6IHByZXYgdGFzayB3ZSBzd2l0Y2hlZCBmcm9tCisgKiBlYng6IGtlcm5lbCB0aHJlYWQgZnVuYyAoTlVMTCBmb3IgdXNlciB0aHJlYWQpCisgKiBlZGk6IGtlcm5lbCB0aHJlYWQgYXJnCisgKi8KIEVOVFJZKHJldF9mcm9tX2ZvcmspCiAJcHVzaGwJJWVheAogCWNhbGwJc2NoZWR1bGVfdGFpbAogCXBvcGwJJWVheAogCisJdGVzdGwJJWVieCwgJWVieAorCWpuegkxZgkJLyoga2VybmVsIHRocmVhZHMgYXJlIHVuY29tbW9uICovCisKKzI6CiAJLyogV2hlbiB3ZSBmb3JrLCB3ZSB0cmFjZSB0aGUgc3lzY2FsbCByZXR1cm4gaW4gdGhlIGNoaWxkLCB0b28uICovCiAJbW92bCAgICAlZXNwLCAlZWF4CiAJY2FsbCAgICBzeXNjYWxsX3JldHVybl9zbG93cGF0aAogCWptcCAgICAgcmVzdG9yZV9hbGwKLUVORChyZXRfZnJvbV9mb3JrKQogCi1FTlRSWShyZXRfZnJvbV9rZXJuZWxfdGhyZWFkKQotCXB1c2hsCSVlYXgKLQljYWxsCXNjaGVkdWxlX3RhaWwKLQlwb3BsCSVlYXgKLQltb3ZsCVBUX0VCUCglZXNwKSwgJWVheAotCWNhbGwJKlBUX0VCWCglZXNwKQotCW1vdmwJJDAsIFBUX0VBWCglZXNwKQotCisJLyoga2VybmVsIHRocmVhZCAqLworMToJbW92bAklZWRpLCAlZWF4CisJY2FsbAkqJWVieAogCS8qCi0JICogS2VybmVsIHRocmVhZHMgcmV0dXJuIHRvIHVzZXJzcGFjZSBhcyBpZiByZXR1cm5pbmcgZnJvbSBhIHN5c2NhbGwuCi0JICogV2Ugc2hvdWxkIGNoZWNrIHdoZXRoZXIgYW55dGhpbmcgYWN0dWFsbHkgdXNlcyB0aGlzIHBhdGggYW5kLCBpZiBzbywKLQkgKiBjb25zaWRlciBzd2l0Y2hpbmcgaXQgb3ZlciB0byByZXRfZnJvbV9mb3JrLgorCSAqIEEga2VybmVsIHRocmVhZCBpcyBhbGxvd2VkIHRvIHJldHVybiBoZXJlIGFmdGVyIHN1Y2Nlc3NmdWxseQorCSAqIGNhbGxpbmcgZG9fZXhlY3ZlKCkuICBFeGl0IHRvIHVzZXJzcGFjZSB0byBjb21wbGV0ZSB0aGUgZXhlY3ZlKCkKKwkgKiBzeXNjYWxsLgogCSAqLwotCW1vdmwgICAgJWVzcCwgJWVheAotCWNhbGwgICAgc3lzY2FsbF9yZXR1cm5fc2xvd3BhdGgKLQlqbXAgICAgIHJlc3RvcmVfYWxsCi1FTkRQUk9DKHJldF9mcm9tX2tlcm5lbF90aHJlYWQpCisJbW92bAkkMCwgUFRfRUFYKCVlc3ApCisJam1wCTJiCitFTkQocmV0X2Zyb21fZm9yaykKIAogLyoKICAqIFJldHVybiB0byB1c2VyIG1vZGUgaXMgbm90IGFzIGNvbXBsZXggYXMgYWxsIHRoaXMgbG9va3MsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9lbnRyeS9lbnRyeV82NC5TIGIvYXJjaC94ODYvZW50cnkvZW50cnlfNjQuUwppbmRleCBkMTcyYzYxLi5mZWUxZDk1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9lbnRyeS9lbnRyeV82NC5TCisrKyBiL2FyY2gveDg2L2VudHJ5L2VudHJ5XzY0LlMKQEAgLTE3OSw3ICsxNzksOCBAQAogCSAqIElmIHdlIG5lZWQgdG8gZG8gZW50cnkgd29yayBvciBpZiB3ZSBndWVzcyB3ZSdsbCBuZWVkIHRvIGRvCiAJICogZXhpdCB3b3JrLCBnbyBzdHJhaWdodCB0byB0aGUgc2xvdyBwYXRoLgogCSAqLwotCXRlc3RsCSRfVElGX1dPUktfU1lTQ0FMTF9FTlRSWXxfVElGX0FMTFdPUktfTUFTSywgQVNNX1RIUkVBRF9JTkZPKFRJX2ZsYWdzLCAlcnNwLCBTSVpFT0ZfUFRSRUdTKQorCW1vdnEJUEVSX0NQVV9WQVIoY3VycmVudF90YXNrKSwgJXIxMQorCXRlc3RsCSRfVElGX1dPUktfU1lTQ0FMTF9FTlRSWXxfVElGX0FMTFdPUktfTUFTSywgVEFTS19USV9mbGFncyglcjExKQogCWpuegllbnRyeV9TWVNDQUxMNjRfc2xvd19wYXRoCiAKIGVudHJ5X1NZU0NBTExfNjRfZmFzdHBhdGg6CkBAIC0yMTcsNyArMjE4LDggQEAKIAkgKi8KIAlESVNBQkxFX0lOVEVSUlVQVFMoQ0xCUl9OT05FKQogCVRSQUNFX0lSUVNfT0ZGCi0JdGVzdGwJJF9USUZfQUxMV09SS19NQVNLLCBBU01fVEhSRUFEX0lORk8oVElfZmxhZ3MsICVyc3AsIFNJWkVPRl9QVFJFR1MpCisJbW92cQlQRVJfQ1BVX1ZBUihjdXJyZW50X3Rhc2spLCAlcjExCisJdGVzdGwJJF9USUZfQUxMV09SS19NQVNLLCBUQVNLX1RJX2ZsYWdzKCVyMTEpCiAJam56CTFmCiAKIAlMT0NLREVQX1NZU19FWElUCkBAIC0zNTEsOCArMzUzLDcgQEAKIAlqbXAJZW50cnlfU1lTQ0FMTDY0X3Nsb3dfcGF0aAogCiAxOgotCS8qIENhbGxlZCBmcm9tIEMgKi8KLQlqbXAJKiVyYXgJCQkJLyogY2FsbGVkIGZyb20gQyAqLworCWptcAkqJXJheAkJCQkvKiBDYWxsZWQgZnJvbSBDICovCiBFTkQoc3R1Yl9wdHJlZ3NfNjQpCiAKIC5tYWNybyBwdHJlZ3Nfc3R1YiBmdW5jCkBAIC0zNjksNDEgKzM3MCw3MyBAQAogI2luY2x1ZGUgPGFzbS9zeXNjYWxsc182NC5oPgogCiAvKgorICogJXJkaTogcHJldiB0YXNrCisgKiAlcnNpOiBuZXh0IHRhc2sKKyAqLworRU5UUlkoX19zd2l0Y2hfdG9fYXNtKQorCS8qCisJICogU2F2ZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzCisJICogVGhpcyBtdXN0IG1hdGNoIHRoZSBvcmRlciBpbiBpbmFjdGl2ZV90YXNrX2ZyYW1lCisJICovCisJcHVzaHEJJXJicAorCXB1c2hxCSVyYngKKwlwdXNocQklcjEyCisJcHVzaHEJJXIxMworCXB1c2hxCSVyMTQKKwlwdXNocQklcjE1CisKKwkvKiBzd2l0Y2ggc3RhY2sgKi8KKwltb3ZxCSVyc3AsIFRBU0tfdGhyZWFkc3AoJXJkaSkKKwltb3ZxCVRBU0tfdGhyZWFkc3AoJXJzaSksICVyc3AKKworI2lmZGVmIENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUgorCW1vdnEJVEFTS19zdGFja19jYW5hcnkoJXJzaSksICVyYngKKwltb3ZxCSVyYngsIFBFUl9DUFVfVkFSKGlycV9zdGFja191bmlvbikrc3RhY2tfY2FuYXJ5X29mZnNldAorI2VuZGlmCisKKwkvKiByZXN0b3JlIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMgKi8KKwlwb3BxCSVyMTUKKwlwb3BxCSVyMTQKKwlwb3BxCSVyMTMKKwlwb3BxCSVyMTIKKwlwb3BxCSVyYngKKwlwb3BxCSVyYnAKKworCWptcAlfX3N3aXRjaF90bworRU5EKF9fc3dpdGNoX3RvX2FzbSkKKworLyoKICAqIEEgbmV3bHkgZm9ya2VkIHByb2Nlc3MgZGlyZWN0bHkgY29udGV4dCBzd2l0Y2hlcyBpbnRvIHRoaXMgYWRkcmVzcy4KICAqCi0gKiByZGk6IHByZXYgdGFzayB3ZSBzd2l0Y2hlZCBmcm9tCisgKiByYXg6IHByZXYgdGFzayB3ZSBzd2l0Y2hlZCBmcm9tCisgKiByYng6IGtlcm5lbCB0aHJlYWQgZnVuYyAoTlVMTCBmb3IgdXNlciB0aHJlYWQpCisgKiByMTI6IGtlcm5lbCB0aHJlYWQgYXJnCiAgKi8KIEVOVFJZKHJldF9mcm9tX2ZvcmspCi0JTE9DSyA7IGJ0ciAkVElGX0ZPUkssIFRJX2ZsYWdzKCVyOCkKLQorCW1vdnEJJXJheCwgJXJkaQogCWNhbGwJc2NoZWR1bGVfdGFpbAkJCS8qIHJkaTogJ3ByZXYnIHRhc2sgcGFyYW1ldGVyICovCiAKLQl0ZXN0YgkkMywgQ1MoJXJzcCkJCQkvKiBmcm9tIGtlcm5lbF90aHJlYWQ/ICovCi0Jam56CTFmCisJdGVzdHEJJXJieCwgJXJieAkJCS8qIGZyb20ga2VybmVsX3RocmVhZD8gKi8KKwlqbnoJMWYJCQkJLyoga2VybmVsIHRocmVhZHMgYXJlIHVuY29tbW9uICovCiAKLQkvKgotCSAqIFdlIGNhbWUgZnJvbSBrZXJuZWxfdGhyZWFkLiAgVGhpcyBjb2RlIHBhdGggaXMgcXVpdGUgdHdpc3RlZCwgYW5kCi0JICogc29tZW9uZSBzaG91bGQgY2xlYW4gaXQgdXAuCi0JICoKLQkgKiBjb3B5X3RocmVhZF90bHMgc3Rhc2hlcyB0aGUgZnVuY3Rpb24gcG9pbnRlciBpbiBSQlggYW5kIHRoZQotCSAqIHBhcmFtZXRlciB0byBiZSBwYXNzZWQgaW4gUkJQLiAgVGhlIGNhbGxlZCBmdW5jdGlvbiBpcyBwZXJtaXR0ZWQKLQkgKiB0byBjYWxsIGRvX2V4ZWN2ZSBhbmQgdGhlcmVieSBqdW1wIHRvIHVzZXIgbW9kZS4KLQkgKi8KLQltb3ZxCVJCUCglcnNwKSwgJXJkaQotCWNhbGwJKlJCWCglcnNwKQotCW1vdmwJJDAsIFJBWCglcnNwKQotCi0JLyoKLQkgKiBGYWxsIHRocm91Z2ggYXMgdGhvdWdoIHdlJ3JlIGV4aXRpbmcgYSBzeXNjYWxsLiAgVGhpcyBtYWtlcyBhCi0JICogdHdpc3RlZCBzb3J0IG9mIHNlbnNlIGlmIHdlIGp1c3QgY2FsbGVkIGRvX2V4ZWN2ZS4KLQkgKi8KLQotMToKKzI6CiAJbW92cQklcnNwLCAlcmRpCiAJY2FsbAlzeXNjYWxsX3JldHVybl9zbG93cGF0aAkvKiByZXR1cm5zIHdpdGggSVJRcyBkaXNhYmxlZCAqLwogCVRSQUNFX0lSUVNfT04JCQkvKiB1c2VyIG1vZGUgaXMgdHJhY2VkIGFzIElSUVMgb24gKi8KIAlTV0FQR1MKIAlqbXAJcmVzdG9yZV9yZWdzX2FuZF9pcmV0CisKKzE6CisJLyoga2VybmVsIHRocmVhZCAqLworCW1vdnEJJXIxMiwgJXJkaQorCWNhbGwJKiVyYngKKwkvKgorCSAqIEEga2VybmVsIHRocmVhZCBpcyBhbGxvd2VkIHRvIHJldHVybiBoZXJlIGFmdGVyIHN1Y2Nlc3NmdWxseQorCSAqIGNhbGxpbmcgZG9fZXhlY3ZlKCkuICBFeGl0IHRvIHVzZXJzcGFjZSB0byBjb21wbGV0ZSB0aGUgZXhlY3ZlKCkKKwkgKiBzeXNjYWxsLgorCSAqLworCW1vdnEJJDAsIFJBWCglcnNwKQorCWptcAkyYgogRU5EKHJldF9mcm9tX2ZvcmspCiAKIC8qCkBAIC01NTUsMjcgKzU4OCw2OSBAQAogCiAjaWZkZWYgQ09ORklHX1g4Nl9FU1BGSVg2NAogbmF0aXZlX2lycV9yZXR1cm5fbGR0OgotCXB1c2hxCSVyYXgKLQlwdXNocQklcmRpCisJLyoKKwkgKiBXZSBhcmUgcnVubmluZyB3aXRoIHVzZXIgR1NCQVNFLiAgQWxsIEdQUnMgY29udGFpbiB0aGVpciB1c2VyCisJICogdmFsdWVzLiAgV2UgaGF2ZSBhIHBlcmNwdSBFU1BGSVggc3RhY2sgdGhhdCBpcyBlaWdodCBzbG90cworCSAqIGxvbmcgKHNlZSBFU1BGSVhfU1RBQ0tfU0laRSkuICBlc3BmaXhfd2FkZHIgcG9pbnRzIHRvIHRoZSBib3R0b20KKwkgKiBvZiB0aGUgRVNQRklYIHN0YWNrLgorCSAqCisJICogV2UgY2xvYmJlciBSQVggYW5kIFJESSBpbiB0aGlzIGNvZGUuICBXZSBzdGFzaCBSREkgb24gdGhlCisJICogbm9ybWFsIHN0YWNrIGFuZCBSQVggb24gdGhlIEVTUEZJWCBzdGFjay4KKwkgKgorCSAqIFRoZSBFU1BGSVggc3RhY2sgbGF5b3V0IHdlIHNldCB1cCBsb29rcyBsaWtlIHRoaXM6CisJICoKKwkgKiAtLS0gdG9wIG9mIEVTUEZJWCBzdGFjayAtLS0KKwkgKiBTUworCSAqIFJTUAorCSAqIFJGTEFHUworCSAqIENTCisJICogUklQICA8LS0gUlNQIHBvaW50cyBoZXJlIHdoZW4gd2UncmUgZG9uZQorCSAqIFJBWCAgPC0tIGVzcGZpeF93YWRkciBwb2ludHMgaGVyZQorCSAqIC0tLSBib3R0b20gb2YgRVNQRklYIHN0YWNrIC0tLQorCSAqLworCisJcHVzaHEJJXJkaQkJCQkvKiBTdGFzaCB1c2VyIFJESSAqLwogCVNXQVBHUwogCW1vdnEJUEVSX0NQVV9WQVIoZXNwZml4X3dhZGRyKSwgJXJkaQotCW1vdnEJJXJheCwgKDAqOCkoJXJkaSkJCS8qIFJBWCAqLwotCW1vdnEJKDIqOCkoJXJzcCksICVyYXgJCS8qIFJJUCAqLworCW1vdnEJJXJheCwgKDAqOCkoJXJkaSkJCS8qIHVzZXIgUkFYICovCisJbW92cQkoMSo4KSglcnNwKSwgJXJheAkJLyogdXNlciBSSVAgKi8KIAltb3ZxCSVyYXgsICgxKjgpKCVyZGkpCi0JbW92cQkoMyo4KSglcnNwKSwgJXJheAkJLyogQ1MgKi8KKwltb3ZxCSgyKjgpKCVyc3ApLCAlcmF4CQkvKiB1c2VyIENTICovCiAJbW92cQklcmF4LCAoMio4KSglcmRpKQotCW1vdnEJKDQqOCkoJXJzcCksICVyYXgJCS8qIFJGTEFHUyAqLworCW1vdnEJKDMqOCkoJXJzcCksICVyYXgJCS8qIHVzZXIgUkZMQUdTICovCiAJbW92cQklcmF4LCAoMyo4KSglcmRpKQotCW1vdnEJKDYqOCkoJXJzcCksICVyYXgJCS8qIFNTICovCisJbW92cQkoNSo4KSglcnNwKSwgJXJheAkJLyogdXNlciBTUyAqLwogCW1vdnEJJXJheCwgKDUqOCkoJXJkaSkKLQltb3ZxCSg1KjgpKCVyc3ApLCAlcmF4CQkvKiBSU1AgKi8KKwltb3ZxCSg0KjgpKCVyc3ApLCAlcmF4CQkvKiB1c2VyIFJTUCAqLwogCW1vdnEJJXJheCwgKDQqOCkoJXJkaSkKLQlhbmRsCSQweGZmZmYwMDAwLCAlZWF4Ci0JcG9wcQklcmRpCisJLyogTm93IFJBWCA9PSBSU1AuICovCisKKwlhbmRsCSQweGZmZmYwMDAwLCAlZWF4CQkvKiBSQVggPSAoUlNQICYgMHhmZmZmMDAwMCkgKi8KKwlwb3BxCSVyZGkJCQkJLyogUmVzdG9yZSB1c2VyIFJESSAqLworCisJLyoKKwkgKiBlc3BmaXhfc3RhY2tbMzE6MTZdID09IDAuICBUaGUgcGFnZSB0YWJsZXMgYXJlIHNldCB1cCBzdWNoIHRoYXQKKwkgKiAoZXNwZml4X3N0YWNrIHwgKFggJiAweGZmZmYwMDAwKSkgcG9pbnRzIHRvIGEgcmVhZC1vbmx5IGFsaWFzIG9mCisJICogZXNwZml4X3dhZGRyIGZvciBhbnkgWC4gIFRoYXQgaXMsIHRoZXJlIGFyZSA2NTUzNiBSTyBhbGlhc2VzIG9mCisJICogdGhlIHNhbWUgcGFnZS4gIFNldCB1cCBSU1Agc28gdGhhdCBSU1BbMzE6MTZdIGNvbnRhaW5zIHRoZQorCSAqIHJlc3BlY3RpdmUgMTYgYml0cyBvZiB0aGUgL3VzZXJzcGFjZS8gUlNQIGFuZCBSU1Agbm9uZXRoZWxlc3MKKwkgKiBzdGlsbCBwb2ludHMgdG8gYW4gUk8gYWxpYXMgb2YgdGhlIEVTUEZJWCBzdGFjay4KKwkgKi8KIAlvcnEJUEVSX0NQVV9WQVIoZXNwZml4X3N0YWNrKSwgJXJheAogCVNXQVBHUwogCW1vdnEJJXJheCwgJXJzcAotCXBvcHEJJXJheAorCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50LCB3ZSBjYW5ub3Qgd3JpdGUgdG8gdGhlIHN0YWNrIGFueSBtb3JlLCBidXQgd2UgY2FuCisJICogc3RpbGwgcmVhZC4KKwkgKi8KKwlwb3BxCSVyYXgJCQkJLyogUmVzdG9yZSB1c2VyIFJBWCAqLworCisJLyoKKwkgKiBSU1Agbm93IHBvaW50cyB0byBhbiBvcmRpbmFyeSBJUkVUIGZyYW1lLCBleGNlcHQgdGhhdCB0aGUgcGFnZQorCSAqIGlzIHJlYWQtb25seSBhbmQgUlNQWzMxOjE2XSBhcmUgcHJlbG9hZGVkIHdpdGggdGhlIHVzZXJzcGFjZQorCSAqIHZhbHVlcy4gIFdlIGNhbiBub3cgSVJFVCBiYWNrIHRvIHVzZXJzcGFjZS4KKwkgKi8KIAlqbXAJbmF0aXZlX2lycV9yZXR1cm5faXJldAogI2VuZGlmCiBFTkQoY29tbW9uX2ludGVycnVwdCkKQEAgLTEwMDIsNyArMTA3Nyw2IEBACiAJdGVzdGIJJDMsIENTKzgoJXJzcCkKIAlqegkuTGVycm9yX2tlcm5lbHNwYWNlCiAKLS5MZXJyb3JfZW50cnlfZnJvbV91c2VybW9kZV9zd2FwZ3M6CiAJLyoKIAkgKiBXZSBlbnRlcmVkIGZyb20gdXNlciBtb2RlIG9yIHdlJ3JlIHByZXRlbmRpbmcgdG8gaGF2ZSBlbnRlcmVkCiAJICogZnJvbSB1c2VyIG1vZGUgZHVlIHRvIGFuIElSRVQgZmF1bHQuCkBAIC0xMDQ1LDcgKzExMTksOCBAQAogCSAqIGdzYmFzZSBhbmQgcHJvY2VlZC4gIFdlJ2xsIGZpeCB1cCB0aGUgZXhjZXB0aW9uIGFuZCBsYW5kIGluCiAJICogLkxnc19jaGFuZ2UncyBlcnJvciBoYW5kbGVyIHdpdGgga2VybmVsIGdzYmFzZS4KIAkgKi8KLQlqbXAJLkxlcnJvcl9lbnRyeV9mcm9tX3VzZXJtb2RlX3N3YXBncworCVNXQVBHUworCWptcCAuTGVycm9yX2VudHJ5X2RvbmUKIAogLkxic3RlcF9pcmV0OgogCS8qIEZpeCB0cnVuY2F0ZWQgUklQICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9lbnRyeS92ZHNvL3Zkc28yYy5oIGIvYXJjaC94ODYvZW50cnkvdmRzby92ZHNvMmMuaAppbmRleCA0Zjc0MTE5Li4zZGFiNzVmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9lbnRyeS92ZHNvL3Zkc28yYy5oCisrKyBiL2FyY2gveDg2L2VudHJ5L3Zkc28vdmRzbzJjLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogCUVMRihQaGRyKSAqcHQgPSAoRUxGKFBoZHIpICopKHJhd19hZGRyICsgR0VUX0xFKCZoZHItPmVfcGhvZmYpKTsKIAotCWlmIChoZHItPmVfdHlwZSAhPSBFVF9EWU4pCisJaWYgKEdFVF9MRSgmaGRyLT5lX3R5cGUpICE9IEVUX0RZTikKIAkJZmFpbCgiaW5wdXQgaXMgbm90IGEgc2hhcmVkIG9iamVjdFxuIik7CiAKIAkvKiBXYWxrIHRoZSBzZWdtZW50IHRhYmxlLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZW50cnkvdmRzby92bWEuYyBiL2FyY2gveDg2L2VudHJ5L3Zkc28vdm1hLmMKaW5kZXggZjg0MDc2Ni4uMjNjODgxYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZW50cnkvdmRzby92bWEuYworKysgYi9hcmNoL3g4Ni9lbnRyeS92ZHNvL3ZtYS5jCkBAIC0zNyw1NCArMzcsNiBAQAogCiBzdHJ1Y3QgbGludXhfYmlucHJtOwogCi0vKgotICogUHV0IHRoZSB2ZHNvIGFib3ZlIHRoZSAocmFuZG9taXplZCkgc3RhY2sgd2l0aCBhbm90aGVyIHJhbmRvbWl6ZWQKLSAqIG9mZnNldC4gIFRoaXMgd2F5IHRoZXJlIGlzIG5vIGhvbGUgaW4gdGhlIG1pZGRsZSBvZiBhZGRyZXNzIHNwYWNlLgotICogVG8gc2F2ZSBtZW1vcnkgbWFrZSBzdXJlIGl0IGlzIHN0aWxsIGluIHRoZSBzYW1lIFBURSBhcyB0aGUgc3RhY2sKLSAqIHRvcC4gIFRoaXMgZG9lc24ndCBnaXZlIHRoYXQgbWFueSByYW5kb20gYml0cy4KLSAqCi0gKiBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gaXMgaW1wZXJmZWN0OiB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB2ZHNvCi0gKiBzdGFydCBhZGRyZXNzIHdpdGhpbiBhIFBNRCBpcyBiaWFzZWQgdG93YXJkIHRoZSBlbmQuCi0gKgotICogT25seSB1c2VkIGZvciB0aGUgNjQtYml0IGFuZCB4MzIgdmRzb3MuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZkc29fYWRkcih1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsZW4pCi17Ci0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCXJldHVybiAwOwotI2Vsc2UKLQl1bnNpZ25lZCBsb25nIGFkZHIsIGVuZDsKLQl1bnNpZ25lZCBvZmZzZXQ7Ci0KLQkvKgotCSAqIFJvdW5kIHVwIHRoZSBzdGFydCBhZGRyZXNzLiAgSXQgY2FuIHN0YXJ0IG91dCB1bmFsaWduZWQgYXMgYSByZXN1bHQKLQkgKiBvZiBzdGFjayBzdGFydCByYW5kb21pemF0aW9uLgotCSAqLwotCXN0YXJ0ID0gUEFHRV9BTElHTihzdGFydCk7Ci0KLQkvKiBSb3VuZCB0aGUgbG93ZXN0IHBvc3NpYmxlIGVuZCBhZGRyZXNzIHVwIHRvIGEgUE1EIGJvdW5kYXJ5LiAqLwotCWVuZCA9IChzdGFydCArIGxlbiArIFBNRF9TSVpFIC0gMSkgJiBQTURfTUFTSzsKLQlpZiAoZW5kID49IFRBU0tfU0laRV9NQVgpCi0JCWVuZCA9IFRBU0tfU0laRV9NQVg7Ci0JZW5kIC09IGxlbjsKLQotCWlmIChlbmQgPiBzdGFydCkgewotCQlvZmZzZXQgPSBnZXRfcmFuZG9tX2ludCgpICUgKCgoZW5kIC0gc3RhcnQpID4+IFBBR0VfU0hJRlQpICsgMSk7Ci0JCWFkZHIgPSBzdGFydCArIChvZmZzZXQgPDwgUEFHRV9TSElGVCk7Ci0JfSBlbHNlIHsKLQkJYWRkciA9IHN0YXJ0OwotCX0KLQotCS8qCi0JICogRm9yY2libHkgYWxpZ24gdGhlIGZpbmFsIGFkZHJlc3MgaW4gY2FzZSB3ZSBoYXZlIGEgaGFyZHdhcmUKLQkgKiBpc3N1ZSB0aGF0IHJlcXVpcmVzIGFsaWdubWVudCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KLQkgKi8KLQlhZGRyID0gYWxpZ25fdmRzb19hZGRyKGFkZHIpOwotCi0JcmV0dXJuIGFkZHI7Ci0jZW5kaWYKLX0KLQogc3RhdGljIGludCB2ZHNvX2ZhdWx0KGNvbnN0IHN0cnVjdCB2bV9zcGVjaWFsX21hcHBpbmcgKnNtLAogCQkgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpCiB7CkBAIC0xNzYsMzAgKzEyOCwyOCBAQAogCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CiB9CiAKLXN0YXRpYyBpbnQgbWFwX3Zkc28oY29uc3Qgc3RydWN0IHZkc29faW1hZ2UgKmltYWdlLCBib29sIGNhbGN1bGF0ZV9hZGRyKQorc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9zcGVjaWFsX21hcHBpbmcgdmRzb19tYXBwaW5nID0geworCS5uYW1lID0gIlt2ZHNvXSIsCisJLmZhdWx0ID0gdmRzb19mYXVsdCwKKwkubXJlbWFwID0gdmRzb19tcmVtYXAsCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9zcGVjaWFsX21hcHBpbmcgdnZhcl9tYXBwaW5nID0geworCS5uYW1lID0gIlt2dmFyXSIsCisJLmZhdWx0ID0gdnZhcl9mYXVsdCwKK307CisKKy8qCisgKiBBZGQgdmRzbyBhbmQgdnZhciBtYXBwaW5ncyB0byBjdXJyZW50IHByb2Nlc3MuCisgKiBAaW1hZ2UgICAgICAgICAgLSBibG9iIHRvIG1hcAorICogQGFkZHIgICAgICAgICAgIC0gcmVxdWVzdCBhIHNwZWNpZmljIGFkZHJlc3MgKHplcm8gdG8gbWFwIGF0IGZyZWUgYWRkcikKKyAqLworc3RhdGljIGludCBtYXBfdmRzbyhjb25zdCBzdHJ1Y3QgdmRzb19pbWFnZSAqaW1hZ2UsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwotCXVuc2lnbmVkIGxvbmcgYWRkciwgdGV4dF9zdGFydDsKKwl1bnNpZ25lZCBsb25nIHRleHRfc3RhcnQ7CiAJaW50IHJldCA9IDA7CiAKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZyB2ZHNvX21hcHBpbmcgPSB7Ci0JCS5uYW1lID0gIlt2ZHNvXSIsCi0JCS5mYXVsdCA9IHZkc29fZmF1bHQsCi0JCS5tcmVtYXAgPSB2ZHNvX21yZW1hcCwKLQl9OwotCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fc3BlY2lhbF9tYXBwaW5nIHZ2YXJfbWFwcGluZyA9IHsKLQkJLm5hbWUgPSAiW3Z2YXJdIiwKLQkJLmZhdWx0ID0gdnZhcl9mYXVsdCwKLQl9OwotCi0JaWYgKGNhbGN1bGF0ZV9hZGRyKSB7Ci0JCWFkZHIgPSB2ZHNvX2FkZHIoY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrLAotCQkJCSBpbWFnZS0+c2l6ZSAtIGltYWdlLT5zeW1fdnZhcl9zdGFydCk7Ci0JfSBlbHNlIHsKLQkJYWRkciA9IDA7Ci0JfQotCiAJaWYgKGRvd25fd3JpdGVfa2lsbGFibGUoJm1tLT5tbWFwX3NlbSkpCiAJCXJldHVybiAtRUlOVFI7CiAKQEAgLTIzOCwyNCArMTg4LDEwNCBAQAogCiAJaWYgKElTX0VSUih2bWEpKSB7CiAJCXJldCA9IFBUUl9FUlIodm1hKTsKLQkJZ290byB1cF9mYWlsOworCQlkb19tdW5tYXAobW0sIHRleHRfc3RhcnQsIGltYWdlLT5zaXplKTsKIAl9CiAKIHVwX2ZhaWw6Ci0JaWYgKHJldCkKKwlpZiAocmV0KSB7CiAJCWN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc28gPSBOVUxMOworCQljdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvX2ltYWdlID0gTlVMTDsKKwl9CiAKIAl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAlyZXR1cm4gcmV0OwogfQogCisjaWZkZWYgQ09ORklHX1g4Nl82NAorLyoKKyAqIFB1dCB0aGUgdmRzbyBhYm92ZSB0aGUgKHJhbmRvbWl6ZWQpIHN0YWNrIHdpdGggYW5vdGhlciByYW5kb21pemVkCisgKiBvZmZzZXQuICBUaGlzIHdheSB0aGVyZSBpcyBubyBob2xlIGluIHRoZSBtaWRkbGUgb2YgYWRkcmVzcyBzcGFjZS4KKyAqIFRvIHNhdmUgbWVtb3J5IG1ha2Ugc3VyZSBpdCBpcyBzdGlsbCBpbiB0aGUgc2FtZSBQVEUgYXMgdGhlIHN0YWNrCisgKiB0b3AuICBUaGlzIGRvZXNuJ3QgZ2l2ZSB0aGF0IG1hbnkgcmFuZG9tIGJpdHMuCisgKgorICogTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGlzIGltcGVyZmVjdDogdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgdmRzbworICogc3RhcnQgYWRkcmVzcyB3aXRoaW4gYSBQTUQgaXMgYmlhc2VkIHRvd2FyZCB0aGUgZW5kLgorICoKKyAqIE9ubHkgdXNlZCBmb3IgdGhlIDY0LWJpdCBhbmQgeDMyIHZkc29zLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB2ZHNvX2FkZHIodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciwgZW5kOworCXVuc2lnbmVkIG9mZnNldDsKKworCS8qCisJICogUm91bmQgdXAgdGhlIHN0YXJ0IGFkZHJlc3MuICBJdCBjYW4gc3RhcnQgb3V0IHVuYWxpZ25lZCBhcyBhIHJlc3VsdAorCSAqIG9mIHN0YWNrIHN0YXJ0IHJhbmRvbWl6YXRpb24uCisJICovCisJc3RhcnQgPSBQQUdFX0FMSUdOKHN0YXJ0KTsKKworCS8qIFJvdW5kIHRoZSBsb3dlc3QgcG9zc2libGUgZW5kIGFkZHJlc3MgdXAgdG8gYSBQTUQgYm91bmRhcnkuICovCisJZW5kID0gKHN0YXJ0ICsgbGVuICsgUE1EX1NJWkUgLSAxKSAmIFBNRF9NQVNLOworCWlmIChlbmQgPj0gVEFTS19TSVpFX01BWCkKKwkJZW5kID0gVEFTS19TSVpFX01BWDsKKwllbmQgLT0gbGVuOworCisJaWYgKGVuZCA+IHN0YXJ0KSB7CisJCW9mZnNldCA9IGdldF9yYW5kb21faW50KCkgJSAoKChlbmQgLSBzdGFydCkgPj4gUEFHRV9TSElGVCkgKyAxKTsKKwkJYWRkciA9IHN0YXJ0ICsgKG9mZnNldCA8PCBQQUdFX1NISUZUKTsKKwl9IGVsc2UgeworCQlhZGRyID0gc3RhcnQ7CisJfQorCisJLyoKKwkgKiBGb3JjaWJseSBhbGlnbiB0aGUgZmluYWwgYWRkcmVzcyBpbiBjYXNlIHdlIGhhdmUgYSBoYXJkd2FyZQorCSAqIGlzc3VlIHRoYXQgcmVxdWlyZXMgYWxpZ25tZW50IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgorCSAqLworCWFkZHIgPSBhbGlnbl92ZHNvX2FkZHIoYWRkcik7CisKKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIGludCBtYXBfdmRzb19yYW5kb21pemVkKGNvbnN0IHN0cnVjdCB2ZHNvX2ltYWdlICppbWFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSB2ZHNvX2FkZHIoY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrLCBpbWFnZS0+c2l6ZS1pbWFnZS0+c3ltX3Z2YXJfc3RhcnQpOworCisJcmV0dXJuIG1hcF92ZHNvKGltYWdlLCBhZGRyKTsKK30KKyNlbmRpZgorCitpbnQgbWFwX3Zkc29fb25jZShjb25zdCBzdHJ1Y3QgdmRzb19pbWFnZSAqaW1hZ2UsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCisJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwkvKgorCSAqIENoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBtYXBwZWQgdmRzbyBibG9iIC0gZmFpbCB0byBwcmV2ZW50CisJICogYWJ1c2luZyBmcm9tIHVzZXJzcGFjZSBpbnN0YWxsX3NwZWNpYWxsX21hcHBpbmcsIHdoaWNoIG1heQorCSAqIG5vdCBkbyBhY2NvdW50aW5nIGFuZCBybGltaXQgcmlnaHQuCisJICogV2UgY291bGQgc2VhcmNoIHZtYSBuZWFyIGNvbnRleHQudmRzbywgYnV0IGl0J3MgYSBzbG93cGF0aCwKKwkgKiBzbyBsZXQncyBleHBsaWNpdGVseSBjaGVjayBhbGwgVk1BcyB0byBiZSBjb21wbGV0ZWx5IHN1cmUuCisJICovCisJZm9yICh2bWEgPSBtbS0+bW1hcDsgdm1hOyB2bWEgPSB2bWEtPnZtX25leHQpIHsKKwkJaWYgKHZtYV9pc19zcGVjaWFsX21hcHBpbmcodm1hLCAmdmRzb19tYXBwaW5nKSB8fAorCQkJCXZtYV9pc19zcGVjaWFsX21hcHBpbmcodm1hLCAmdnZhcl9tYXBwaW5nKSkgeworCQkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJCQlyZXR1cm4gLUVFWElTVDsKKwkJfQorCX0KKwl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKworCXJldHVybiBtYXBfdmRzbyhpbWFnZSwgYWRkcik7Cit9CisKICNpZiBkZWZpbmVkKENPTkZJR19YODZfMzIpIHx8IGRlZmluZWQoQ09ORklHX0lBMzJfRU1VTEFUSU9OKQogc3RhdGljIGludCBsb2FkX3Zkc28zMih2b2lkKQogewogCWlmICh2ZHNvMzJfZW5hYmxlZCAhPSAxKSAgLyogT3RoZXIgdmFsdWVzIGFsbCBtZWFuICJkaXNhYmxlZCIgKi8KIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gbWFwX3Zkc28oJnZkc29faW1hZ2VfMzIsIGZhbHNlKTsKKwlyZXR1cm4gbWFwX3Zkc28oJnZkc29faW1hZ2VfMzIsIDApOwogfQogI2VuZGlmCiAKQEAgLTI2NSw3ICsyOTUsNyBAQAogCWlmICghdmRzbzY0X2VuYWJsZWQpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIG1hcF92ZHNvKCZ2ZHNvX2ltYWdlXzY0LCB0cnVlKTsKKwlyZXR1cm4gbWFwX3Zkc29fcmFuZG9taXplZCgmdmRzb19pbWFnZV82NCk7CiB9CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCkBAIC0yNzYsOCArMzA2LDcgQEAKIAlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfWDMyKSkgewogCQlpZiAoIXZkc282NF9lbmFibGVkKQogCQkJcmV0dXJuIDA7Ci0KLQkJcmV0dXJuIG1hcF92ZHNvKCZ2ZHNvX2ltYWdlX3gzMiwgdHJ1ZSk7CisJCXJldHVybiBtYXBfdmRzb19yYW5kb21pemVkKCZ2ZHNvX2ltYWdlX3gzMik7CiAJfQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ldmVudHMvYW1kL2NvcmUuYyBiL2FyY2gveDg2L2V2ZW50cy9hbWQvY29yZS5jCmluZGV4IGUwN2EyMmIuLmY1ZjRiM2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9hbWQvY29yZS5jCisrKyBiL2FyY2gveDg2L2V2ZW50cy9hbWQvY29yZS5jCkBAIC0xMTksOCArMTE5LDggQEAKIHsKICAgW1BFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFU10JCQk9IDB4MDA3NiwKICAgW1BFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TXQkJCT0gMHgwMGMwLAotICBbUEVSRl9DT1VOVF9IV19DQUNIRV9SRUZFUkVOQ0VTXQkJPSAweDAwODAsCi0gIFtQRVJGX0NPVU5UX0hXX0NBQ0hFX01JU1NFU10JCQk9IDB4MDA4MSwKKyAgW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFU10JCT0gMHgwNzdkLAorICBbUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVNdCQkJPSAweDA3N2UsCiAgIFtQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlNdCQk9IDB4MDBjMiwKICAgW1BFUkZfQ09VTlRfSFdfQlJBTkNIX01JU1NFU10JCQk9IDB4MDBjMywKICAgW1BFUkZfQ09VTlRfSFdfU1RBTExFRF9DWUNMRVNfRlJPTlRFTkRdCT0gMHgwMGQwLCAvKiAiRGVjb2RlciBlbXB0eSIgZXZlbnQgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2V2ZW50cy9hbWQvdW5jb3JlLmMgYi9hcmNoL3g4Ni9ldmVudHMvYW1kL3VuY29yZS5jCmluZGV4IGU2MTMxZDQuLjY1NTc3ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9hbWQvdW5jb3JlLmMKKysrIGIvYXJjaC94ODYvZXZlbnRzL2FtZC91bmNvcmUuYwpAQCAtMjksNiArMjksOCBAQAogCiAjZGVmaW5lIENPVU5URVJfU0hJRlQJCTE2CiAKK3N0YXRpYyBITElTVF9IRUFEKHVuY29yZV91bnVzZWRfbGlzdCk7CisKIHN0cnVjdCBhbWRfdW5jb3JlIHsKIAlpbnQgaWQ7CiAJaW50IHJlZmNudDsKQEAgLTM5LDcgKzQxLDcgQEAKIAljcHVtYXNrX3QgKmFjdGl2ZV9tYXNrOwogCXN0cnVjdCBwbXUgKnBtdTsKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnRzW01BWF9DT1VOVEVSU107Ci0Jc3RydWN0IGFtZF91bmNvcmUgKmZyZWVfd2hlbl9jcHVfb25saW5lOworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGU7CiB9OwogCiBzdGF0aWMgc3RydWN0IGFtZF91bmNvcmUgKiBfX3BlcmNwdSAqYW1kX3VuY29yZV9uYjsKQEAgLTMwNiw2ICszMDgsNyBAQAogCQl1bmNvcmVfbmItPm1zcl9iYXNlID0gTVNSX0YxNUhfTkJfUEVSRl9DVEw7CiAJCXVuY29yZV9uYi0+YWN0aXZlX21hc2sgPSAmYW1kX25iX2FjdGl2ZV9tYXNrOwogCQl1bmNvcmVfbmItPnBtdSA9ICZhbWRfbmJfcG11OworCQl1bmNvcmVfbmItPmlkID0gLTE7CiAJCSpwZXJfY3B1X3B0cihhbWRfdW5jb3JlX25iLCBjcHUpID0gdW5jb3JlX25iOwogCX0KIApAQCAtMzE5LDYgKzMyMiw3IEBACiAJCXVuY29yZV9sMi0+bXNyX2Jhc2UgPSBNU1JfRjE2SF9MMklfUEVSRl9DVEw7CiAJCXVuY29yZV9sMi0+YWN0aXZlX21hc2sgPSAmYW1kX2wyX2FjdGl2ZV9tYXNrOwogCQl1bmNvcmVfbDItPnBtdSA9ICZhbWRfbDJfcG11OworCQl1bmNvcmVfbDItPmlkID0gLTE7CiAJCSpwZXJfY3B1X3B0cihhbWRfdW5jb3JlX2wyLCBjcHUpID0gdW5jb3JlX2wyOwogCX0KIApAQCAtMzQ4LDcgKzM1Miw3IEBACiAJCQljb250aW51ZTsKIAogCQlpZiAodGhpcy0+aWQgPT0gdGhhdC0+aWQpIHsKLQkJCXRoYXQtPmZyZWVfd2hlbl9jcHVfb25saW5lID0gdGhpczsKKwkJCWhsaXN0X2FkZF9oZWFkKCZ0aGlzLT5ub2RlLCAmdW5jb3JlX3VudXNlZF9saXN0KTsKIAkJCXRoaXMgPSB0aGF0OwogCQkJYnJlYWs7CiAJCX0KQEAgLTM4OCwxMyArMzkyLDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHVuY29yZV9jbGVhbl9vbmxpbmUodm9pZCkKK3sKKwlzdHJ1Y3QgYW1kX3VuY29yZSAqdW5jb3JlOworCXN0cnVjdCBobGlzdF9ub2RlICpuOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1bmNvcmUsIG4sICZ1bmNvcmVfdW51c2VkX2xpc3QsIG5vZGUpIHsKKwkJaGxpc3RfZGVsKCZ1bmNvcmUtPm5vZGUpOworCQlrZnJlZSh1bmNvcmUpOworCX0KK30KKwogc3RhdGljIHZvaWQgdW5jb3JlX29ubGluZSh1bnNpZ25lZCBpbnQgY3B1LAogCQkJICBzdHJ1Y3QgYW1kX3VuY29yZSAqIF9fcGVyY3B1ICp1bmNvcmVzKQogewogCXN0cnVjdCBhbWRfdW5jb3JlICp1bmNvcmUgPSAqcGVyX2NwdV9wdHIodW5jb3JlcywgY3B1KTsKIAotCWtmcmVlKHVuY29yZS0+ZnJlZV93aGVuX2NwdV9vbmxpbmUpOwotCXVuY29yZS0+ZnJlZV93aGVuX2NwdV9vbmxpbmUgPSBOVUxMOworCXVuY29yZV9jbGVhbl9vbmxpbmUoKTsKIAogCWlmIChjcHUgPT0gdW5jb3JlLT5jcHUpCiAJCWNwdW1hc2tfc2V0X2NwdShjcHUsIHVuY29yZS0+YWN0aXZlX21hc2spOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2NvcmUuYyBiL2FyY2gveDg2L2V2ZW50cy9jb3JlLmMKaW5kZXggZDBlZmI1Yy4uZDMxNzM1ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZXZlbnRzL2NvcmUuYworKysgYi9hcmNoL3g4Ni9ldmVudHMvY29yZS5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vbGR0Lmg+CisjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgogCiAjaW5jbHVkZSAicGVyZl9ldmVudC5oIgogCkBAIC0xMjAxLDYgKzEyMDIsOSBAQAogCSAqIElmIGdyb3VwIGV2ZW50cyBzY2hlZHVsaW5nIHRyYW5zYWN0aW9uIHdhcyBzdGFydGVkLAogCSAqIHNraXAgdGhlIHNjaGVkdWxhYmlsaXR5IHRlc3QgaGVyZSwgaXQgd2lsbCBiZSBwZXJmb3JtZWQKIAkgKiBhdCBjb21taXQgdGltZSAoLT5jb21taXRfdHhuKSBhcyBhIHdob2xlLgorCSAqCisJICogSWYgY29tbWl0IGZhaWxzLCB3ZSdsbCBjYWxsIC0+ZGVsKCkgb24gYWxsIGV2ZW50cworCSAqIGZvciB3aGljaCAtPmFkZCgpIHdhcyBjYWxsZWQuCiAJICovCiAJaWYgKGNwdWMtPnR4bl9mbGFncyAmIFBFUkZfUE1VX1RYTl9BREQpCiAJCWdvdG8gZG9uZV9jb2xsZWN0OwpAQCAtMTIyMyw2ICsxMjI3LDE0IEBACiAJY3B1Yy0+bl9hZGRlZCArPSBuIC0gbjA7CiAJY3B1Yy0+bl90eG4gKz0gbiAtIG4wOwogCisJaWYgKHg4Nl9wbXUuYWRkKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgYmVmb3JlIHg4Nl9wbXVfZW5hYmxlKCkgd2lsbCBjYWxsIHg4Nl9wbXVfc3RhcnQoKSwKKwkJICogc28gd2UgZW5hYmxlIExCUnMgYmVmb3JlIGFuIGV2ZW50IG5lZWRzIHRoZW0gZXRjLi4KKwkJICovCisJCXg4Nl9wbXUuYWRkKGV2ZW50KTsKKwl9CisKIAlyZXQgPSAwOwogb3V0OgogCXJldHVybiByZXQ7CkBAIC0xMzQ2LDcgKzEzNTgsNyBAQAogCWV2ZW50LT5ody5mbGFncyAmPSB+UEVSRl9YODZfRVZFTlRfQ09NTUlUVEVEOwogCiAJLyoKLQkgKiBJZiB3ZSdyZSBjYWxsZWQgZHVyaW5nIGEgdHhuLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgorCSAqIElmIHdlJ3JlIGNhbGxlZCBkdXJpbmcgYSB0eG4sIHdlIG9ubHkgbmVlZCB0byB1bmRvIHg4Nl9wbXUuYWRkLgogCSAqIFRoZSBldmVudHMgbmV2ZXIgZ290IHNjaGVkdWxlZCBhbmQgLT5jYW5jZWxfdHhuIHdpbGwgdHJ1bmNhdGUKIAkgKiB0aGUgZXZlbnRfbGlzdC4KIAkgKgpAQCAtMTM1NCw3ICsxMzY2LDcgQEAKIAkgKiBhbiBldmVudCBhZGRlZCBkdXJpbmcgdGhhdCBzYW1lIFRYTi4KIAkgKi8KIAlpZiAoY3B1Yy0+dHhuX2ZsYWdzICYgUEVSRl9QTVVfVFhOX0FERCkKLQkJcmV0dXJuOworCQlnb3RvIGRvX2RlbDsKIAogCS8qCiAJICogTm90IGEgVFhOLCB0aGVyZWZvcmUgY2xlYW51cCBwcm9wZXJseS4KQEAgLTEzODQsNiArMTM5NiwxNSBAQAogCS0tY3B1Yy0+bl9ldmVudHM7CiAKIAlwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShldmVudCk7CisKK2RvX2RlbDoKKwlpZiAoeDg2X3BtdS5kZWwpIHsKKwkJLyoKKwkJICogVGhpcyBpcyBhZnRlciB4ODZfcG11X3N0b3AoKTsgc28gd2UgZGlzYWJsZSBMQlJzIGFmdGVyIGFueQorCQkgKiBldmVudCBjYW4gbmVlZCB0aGVtIGV0Yy4uCisJCSAqLworCQl4ODZfcG11LmRlbChldmVudCk7CisJfQogfQogCiBpbnQgeDg2X3BtdV9oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtMjI0NywzOSArMjI2OCwyNiBAQAogCWN5YzJuc19yZWFkX2VuZChkYXRhKTsKIH0KIAotLyoKLSAqIGNhbGxjaGFpbiBzdXBwb3J0Ci0gKi8KLQotc3RhdGljIGludCBiYWNrdHJhY2Vfc3RhY2sodm9pZCAqZGF0YSwgY2hhciAqbmFtZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiYWNrdHJhY2VfYWRkcmVzcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCByZWxpYWJsZSkKLXsKLQlzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnlfY3R4ICplbnRyeSA9IGRhdGE7Ci0KLQlyZXR1cm4gcGVyZl9jYWxsY2hhaW5fc3RvcmUoZW50cnksIGFkZHIpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzIGJhY2t0cmFjZV9vcHMgPSB7Ci0JLnN0YWNrCQkJPSBiYWNrdHJhY2Vfc3RhY2ssCi0JLmFkZHJlc3MJCT0gYmFja3RyYWNlX2FkZHJlc3MsCi0JLndhbGtfc3RhY2sJCT0gcHJpbnRfY29udGV4dF9zdGFja19icCwKLX07Ci0KIHZvaWQKIHBlcmZfY2FsbGNoYWluX2tlcm5lbChzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnlfY3R4ICplbnRyeSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisJc3RydWN0IHVud2luZF9zdGF0ZSBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKIAlpZiAocGVyZl9ndWVzdF9jYnMgJiYgcGVyZl9ndWVzdF9jYnMtPmlzX2luX2d1ZXN0KCkpIHsKIAkJLyogVE9ETzogV2UgZG9uJ3Qgc3VwcG9ydCBndWVzdCBvcyBjYWxsY2hhaW4gbm93ICovCiAJCXJldHVybjsKIAl9CiAKLQlwZXJmX2NhbGxjaGFpbl9zdG9yZShlbnRyeSwgcmVncy0+aXApOworCWlmIChwZXJmX2NhbGxjaGFpbl9zdG9yZShlbnRyeSwgcmVncy0+aXApKQorCQlyZXR1cm47CiAKLQlkdW1wX3RyYWNlKE5VTEwsIHJlZ3MsIE5VTEwsIDAsICZiYWNrdHJhY2Vfb3BzLCBlbnRyeSk7CisJZm9yICh1bndpbmRfc3RhcnQoJnN0YXRlLCBjdXJyZW50LCByZWdzLCBOVUxMKTsgIXVud2luZF9kb25lKCZzdGF0ZSk7CisJICAgICB1bndpbmRfbmV4dF9mcmFtZSgmc3RhdGUpKSB7CisJCWFkZHIgPSB1bndpbmRfZ2V0X3JldHVybl9hZGRyZXNzKCZzdGF0ZSk7CisJCWlmICghYWRkciB8fCBwZXJmX2NhbGxjaGFpbl9zdG9yZShlbnRyeSwgYWRkcikpCisJCQlyZXR1cm47CisJfQogfQogCiBzdGF0aWMgaW5saW5lIGludApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL2J0cy5jIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL2J0cy5jCmluZGV4IDBhNmUzOTMuLjk4MmM5ZTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9idHMuYworKysgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvYnRzLmMKQEAgLTMxLDcgKzMxLDE3IEBACiBzdHJ1Y3QgYnRzX2N0eCB7CiAJc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZQloYW5kbGU7CiAJc3RydWN0IGRlYnVnX3N0b3JlCQlkc19iYWNrOwotCWludAkJCQlzdGFydGVkOworCWludAkJCQlzdGF0ZTsKK307CisKKy8qIEJUUyBjb250ZXh0IHN0YXRlczogKi8KK2VudW0geworCS8qIG5vIG9uZ29pbmcgQVVYIHRyYW5zYWN0aW9ucyAqLworCUJUU19TVEFURV9TVE9QUEVEID0gMCwKKwkvKiBBVVggdHJhbnNhY3Rpb24gaXMgb24sIEJUUyB0cmFjaW5nIGlzIGRpc2FibGVkICovCisJQlRTX1NUQVRFX0lOQUNUSVZFLAorCS8qIEFVWCB0cmFuc2FjdGlvbiBpcyBvbiwgQlRTIHRyYWNpbmcgaXMgcnVubmluZyAqLworCUJUU19TVEFURV9BQ1RJVkUsCiB9OwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGJ0c19jdHgsIGJ0c19jdHgpOwpAQCAtMjA0LDYgKzIxNCwxNSBAQAogc3RhdGljIGludAogYnRzX2J1ZmZlcl9yZXNldChzdHJ1Y3QgYnRzX2J1ZmZlciAqYnVmLCBzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUpOwogCisvKgorICogT3JkZXJpbmcgUE1VIGNhbGxiYWNrcyB3cnQgdGhlbXNlbHZlcyBhbmQgdGhlIFBNSSBpcyBkb25lIGJ5IG1lYW5zCisgKiBvZiBidHM6OnN0YXRlLCB3aGljaDoKKyAqICAtIGlzIHNldCB3aGVuIGJ0czo6aGFuZGxlOjpldmVudCBpcyB2YWxpZCwgdGhhdCBpcywgYmV0d2VlbgorICogICAgcGVyZl9hdXhfb3V0cHV0X2JlZ2luKCkgYW5kIHBlcmZfYXV4X291dHB1dF9lbmQoKTsKKyAqICAtIGlzIHplcm8gb3RoZXJ3aXNlOworICogIC0gaXMgb3JkZXJlZCBhZ2FpbnN0IGJ0czo6aGFuZGxlOjpldmVudCB3aXRoIGEgY29tcGlsZXIgYmFycmllci4KKyAqLworCiBzdGF0aWMgdm9pZCBfX2J0c19ldmVudF9zdGFydChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJc3RydWN0IGJ0c19jdHggKmJ0cyA9IHRoaXNfY3B1X3B0cigmYnRzX2N0eCk7CkBAIC0yMjEsMTAgKzI0MCwxMyBAQAogCiAJLyoKIAkgKiBsb2NhbCBiYXJyaWVyIHRvIG1ha2Ugc3VyZSB0aGF0IGRzIGNvbmZpZ3VyYXRpb24gbWFkZSBpdAotCSAqIGJlZm9yZSB3ZSBlbmFibGUgQlRTCisJICogYmVmb3JlIHdlIGVuYWJsZSBCVFMgYW5kIGJ0czo6c3RhdGUgZ29lcyBBQ1RJVkUKIAkgKi8KIAl3bWIoKTsKIAorCS8qIElOQUNUSVZFL1NUT1BQRUQgLT4gQUNUSVZFICovCisJV1JJVEVfT05DRShidHMtPnN0YXRlLCBCVFNfU1RBVEVfQUNUSVZFKTsKKwogCWludGVsX3BtdV9lbmFibGVfYnRzKGNvbmZpZyk7CiAKIH0KQEAgLTI1MSw5ICsyNzMsNiBAQAogCiAJX19idHNfZXZlbnRfc3RhcnQoZXZlbnQpOwogCi0JLyogUE1JIGhhbmRsZXI6IHRoaXMgY291bnRlciBpcyBydW5uaW5nIGFuZCBsaWtlbHkgZ2VuZXJhdGluZyBQTUlzICovCi0JQUNDRVNTX09OQ0UoYnRzLT5zdGFydGVkKSA9IDE7Ci0KIAlyZXR1cm47CiAKIGZhaWxfZW5kX3N0b3A6CkBAIC0yNjMsMzAgKzI4MiwzNCBAQAogCWV2ZW50LT5ody5zdGF0ZSA9IFBFUkZfSEVTX1NUT1BQRUQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9fYnRzX2V2ZW50X3N0b3Aoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQorc3RhdGljIHZvaWQgX19idHNfZXZlbnRfc3RvcChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBzdGF0ZSkKIHsKKwlzdHJ1Y3QgYnRzX2N0eCAqYnRzID0gdGhpc19jcHVfcHRyKCZidHNfY3R4KTsKKworCS8qIEFDVElWRSAtPiBJTkFDVElWRShQTUkpL1NUT1BQRUQoLT5zdG9wKCkpICovCisJV1JJVEVfT05DRShidHMtPnN0YXRlLCBzdGF0ZSk7CisKIAkvKgogCSAqIE5vIGV4dHJhIHN5bmNocm9uaXphdGlvbiBpcyBtYW5kYXRlZCBieSB0aGUgZG9jdW1lbnRhdGlvbiB0byBoYXZlCiAJICogQlRTIGRhdGEgc3RvcmVzIGdsb2JhbGx5IHZpc2libGUuCiAJICovCiAJaW50ZWxfcG11X2Rpc2FibGVfYnRzKCk7Ci0KLQlpZiAoZXZlbnQtPmh3LnN0YXRlICYgUEVSRl9IRVNfU1RPUFBFRCkKLQkJcmV0dXJuOwotCi0JQUNDRVNTX09OQ0UoZXZlbnQtPmh3LnN0YXRlKSB8PSBQRVJGX0hFU19TVE9QUEVEOwogfQogCiBzdGF0aWMgdm9pZCBidHNfZXZlbnRfc3RvcChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9IHRoaXNfY3B1X3B0cigmY3B1X2h3X2V2ZW50cyk7CiAJc3RydWN0IGJ0c19jdHggKmJ0cyA9IHRoaXNfY3B1X3B0cigmYnRzX2N0eCk7Ci0Jc3RydWN0IGJ0c19idWZmZXIgKmJ1ZiA9IHBlcmZfZ2V0X2F1eCgmYnRzLT5oYW5kbGUpOworCXN0cnVjdCBidHNfYnVmZmVyICpidWYgPSBOVUxMOworCWludCBzdGF0ZSA9IFJFQURfT05DRShidHMtPnN0YXRlKTsKIAotCS8qIFBNSSBoYW5kbGVyOiBkb24ndCByZXN0YXJ0IHRoaXMgY291bnRlciAqLwotCUFDQ0VTU19PTkNFKGJ0cy0+c3RhcnRlZCkgPSAwOworCWlmIChzdGF0ZSA9PSBCVFNfU1RBVEVfQUNUSVZFKQorCQlfX2J0c19ldmVudF9zdG9wKGV2ZW50LCBCVFNfU1RBVEVfU1RPUFBFRCk7CiAKLQlfX2J0c19ldmVudF9zdG9wKGV2ZW50KTsKKwlpZiAoc3RhdGUgIT0gQlRTX1NUQVRFX1NUT1BQRUQpCisJCWJ1ZiA9IHBlcmZfZ2V0X2F1eCgmYnRzLT5oYW5kbGUpOworCisJZXZlbnQtPmh3LnN0YXRlIHw9IFBFUkZfSEVTX1NUT1BQRUQ7CiAKIAlpZiAoZmxhZ3MgJiBQRVJGX0VGX1VQREFURSkgewogCQlidHNfdXBkYXRlKGJ0cyk7CkBAIC0yOTYsNiArMzE5LDcgQEAKIAkJCQlidHMtPmhhbmRsZS5oZWFkID0KIAkJCQkJbG9jYWxfeGNoZygmYnVmLT5kYXRhX3NpemUsCiAJCQkJCQkgICBidWYtPm5yX3BhZ2VzIDw8IFBBR0VfU0hJRlQpOworCiAJCQlwZXJmX2F1eF9vdXRwdXRfZW5kKCZidHMtPmhhbmRsZSwgbG9jYWxfeGNoZygmYnVmLT5kYXRhX3NpemUsIDApLAogCQkJCQkgICAgISFsb2NhbF94Y2hnKCZidWYtPmxvc3QsIDApKTsKIAkJfQpAQCAtMzEwLDggKzMzNCwyMCBAQAogdm9pZCBpbnRlbF9idHNfZW5hYmxlX2xvY2FsKHZvaWQpCiB7CiAJc3RydWN0IGJ0c19jdHggKmJ0cyA9IHRoaXNfY3B1X3B0cigmYnRzX2N0eCk7CisJaW50IHN0YXRlID0gUkVBRF9PTkNFKGJ0cy0+c3RhdGUpOwogCi0JaWYgKGJ0cy0+aGFuZGxlLmV2ZW50ICYmIGJ0cy0+c3RhcnRlZCkKKwkvKgorCSAqIEhlcmUgd2UgdHJhbnNpdGlvbiBmcm9tIElOQUNUSVZFIHRvIEFDVElWRTsKKwkgKiBpZiB3ZSBpbnN0ZWFkIGFyZSBTVE9QUEVEIGZyb20gdGhlIGludGVycnVwdCBoYW5kbGVyLAorCSAqIHN0YXkgdGhhdCB3YXkuIENhbid0IGJlIEFDVElWRSBoZXJlIHRob3VnaC4KKwkgKi8KKwlpZiAoV0FSTl9PTl9PTkNFKHN0YXRlID09IEJUU19TVEFURV9BQ1RJVkUpKQorCQlyZXR1cm47CisKKwlpZiAoc3RhdGUgPT0gQlRTX1NUQVRFX1NUT1BQRUQpCisJCXJldHVybjsKKworCWlmIChidHMtPmhhbmRsZS5ldmVudCkKIAkJX19idHNfZXZlbnRfc3RhcnQoYnRzLT5oYW5kbGUuZXZlbnQpOwogfQogCkBAIC0zMTksOCArMzU1LDE1IEBACiB7CiAJc3RydWN0IGJ0c19jdHggKmJ0cyA9IHRoaXNfY3B1X3B0cigmYnRzX2N0eCk7CiAKKwkvKgorCSAqIEhlcmUgd2UgdHJhbnNpdGlvbiBmcm9tIEFDVElWRSB0byBJTkFDVElWRTsKKwkgKiBkbyBub3RoaW5nIGZvciBTVE9QUEVEIG9yIElOQUNUSVZFLgorCSAqLworCWlmIChSRUFEX09OQ0UoYnRzLT5zdGF0ZSkgIT0gQlRTX1NUQVRFX0FDVElWRSkKKwkJcmV0dXJuOworCiAJaWYgKGJ0cy0+aGFuZGxlLmV2ZW50KQotCQlfX2J0c19ldmVudF9zdG9wKGJ0cy0+aGFuZGxlLmV2ZW50KTsKKwkJX19idHNfZXZlbnRfc3RvcChidHMtPmhhbmRsZS5ldmVudCwgQlRTX1NUQVRFX0lOQUNUSVZFKTsKIH0KIAogc3RhdGljIGludApAQCAtMzM1LDggKzM3OCw2IEBACiAJCXJldHVybiAwOwogCiAJaGVhZCA9IGhhbmRsZS0+aGVhZCAmICgoYnVmLT5ucl9wYWdlcyA8PCBQQUdFX1NISUZUKSAtIDEpOwotCWlmIChXQVJOX09OX09OQ0UoaGVhZCAhPSBsb2NhbF9yZWFkKCZidWYtPmhlYWQpKSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwaHlzID0gJmJ1Zi0+YnVmW2J1Zi0+Y3VyX2J1Zl07CiAJc3BhY2UgPSBwaHlzLT5vZmZzZXQgKyBwaHlzLT5kaXNwbGFjZW1lbnQgKyBwaHlzLT5zaXplIC0gaGVhZDsKQEAgLTQwMywyMiArNDQ0LDM3IEBACiAKIGludCBpbnRlbF9idHNfaW50ZXJydXB0KHZvaWQpCiB7CisJc3RydWN0IGRlYnVnX3N0b3JlICpkcyA9IHRoaXNfY3B1X3B0cigmY3B1X2h3X2V2ZW50cyktPmRzOwogCXN0cnVjdCBidHNfY3R4ICpidHMgPSB0aGlzX2NwdV9wdHIoJmJ0c19jdHgpOwogCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCA9IGJ0cy0+aGFuZGxlLmV2ZW50OwogCXN0cnVjdCBidHNfYnVmZmVyICpidWY7CiAJczY0IG9sZF9oZWFkOwotCWludCBlcnI7CisJaW50IGVyciA9IC1FTk9TUEMsIGhhbmRsZWQgPSAwOwogCi0JaWYgKCFldmVudCB8fCAhYnRzLT5zdGFydGVkKQotCQlyZXR1cm4gMDsKKwkvKgorCSAqIFRoZSBvbmx5IHN1cmVmaXJlIHdheSBvZiBrbm93aW5nIGlmIHRoaXMgTk1JIGlzIG91cnMgaXMgYnkgY2hlY2tpbmcKKwkgKiB0aGUgd3JpdGUgcHRyIGFnYWluc3QgdGhlIFBNSSB0aHJlc2hvbGQuCisJICovCisJaWYgKGRzICYmIChkcy0+YnRzX2luZGV4ID49IGRzLT5idHNfaW50ZXJydXB0X3RocmVzaG9sZCkpCisJCWhhbmRsZWQgPSAxOworCisJLyoKKwkgKiB0aGlzIGlzIHdyYXBwZWQgaW4gaW50ZWxfYnRzX2VuYWJsZV9sb2NhbC9pbnRlbF9idHNfZGlzYWJsZV9sb2NhbCwKKwkgKiBzbyB3ZSBjYW4gb25seSBiZSBJTkFDVElWRSBvciBTVE9QUEVECisJICovCisJaWYgKFJFQURfT05DRShidHMtPnN0YXRlKSA9PSBCVFNfU1RBVEVfU1RPUFBFRCkKKwkJcmV0dXJuIGhhbmRsZWQ7CiAKIAlidWYgPSBwZXJmX2dldF9hdXgoJmJ0cy0+aGFuZGxlKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIGhhbmRsZWQ7CisKIAkvKgogCSAqIFNraXAgc25hcHNob3QgY291bnRlcnM6IHRoZXkgZG9uJ3QgdXNlIHRoZSBpbnRlcnJ1cHQsIGJ1dAogCSAqIHRoZXJlJ3Mgbm8gb3RoZXIgd2F5IG9mIHRlbGxpbmcsIGJlY2F1c2UgdGhlIHBvaW50ZXIgd2lsbAogCSAqIGtlZXAgbW92aW5nCiAJICovCi0JaWYgKCFidWYgfHwgYnVmLT5zbmFwc2hvdCkKKwlpZiAoYnVmLT5zbmFwc2hvdCkKIAkJcmV0dXJuIDA7CiAKIAlvbGRfaGVhZCA9IGxvY2FsX3JlYWQoJmJ1Zi0+aGVhZCk7CkBAIC00MjYsMTggKzQ4MiwyNyBAQAogCiAJLyogbm8gbmV3IGRhdGEgKi8KIAlpZiAob2xkX2hlYWQgPT0gbG9jYWxfcmVhZCgmYnVmLT5oZWFkKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiBoYW5kbGVkOwogCiAJcGVyZl9hdXhfb3V0cHV0X2VuZCgmYnRzLT5oYW5kbGUsIGxvY2FsX3hjaGcoJmJ1Zi0+ZGF0YV9zaXplLCAwKSwKIAkJCSAgICAhIWxvY2FsX3hjaGcoJmJ1Zi0+bG9zdCwgMCkpOwogCiAJYnVmID0gcGVyZl9hdXhfb3V0cHV0X2JlZ2luKCZidHMtPmhhbmRsZSwgZXZlbnQpOwotCWlmICghYnVmKQotCQlyZXR1cm4gMTsKKwlpZiAoYnVmKQorCQllcnIgPSBidHNfYnVmZmVyX3Jlc2V0KGJ1ZiwgJmJ0cy0+aGFuZGxlKTsKIAotCWVyciA9IGJ0c19idWZmZXJfcmVzZXQoYnVmLCAmYnRzLT5oYW5kbGUpOwotCWlmIChlcnIpCi0JCXBlcmZfYXV4X291dHB1dF9lbmQoJmJ0cy0+aGFuZGxlLCAwLCBmYWxzZSk7CisJaWYgKGVycikgeworCQlXUklURV9PTkNFKGJ0cy0+c3RhdGUsIEJUU19TVEFURV9TVE9QUEVEKTsKKworCQlpZiAoYnVmKSB7CisJCQkvKgorCQkJICogQlRTX1NUQVRFX1NUT1BQRUQgc2hvdWxkIGJlIHZpc2libGUgYmVmb3JlCisJCQkgKiBjbGVhcmVkIGhhbmRsZTo6ZXZlbnQKKwkJCSAqLworCQkJYmFycmllcigpOworCQkJcGVyZl9hdXhfb3V0cHV0X2VuZCgmYnRzLT5oYW5kbGUsIDAsIGZhbHNlKTsKKwkJfQorCX0KIAogCXJldHVybiAxOwogfQpAQCAtNTE5LDcgKzU4NCw4IEBACiAJaWYgKCFib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfRFRFUzY0KSB8fCAheDg2X3BtdS5idHMpCiAJCXJldHVybiAtRU5PREVWOwogCi0JYnRzX3BtdS5jYXBhYmlsaXRpZXMJPSBQRVJGX1BNVV9DQVBfQVVYX05PX1NHIHwgUEVSRl9QTVVfQ0FQX0lUUkFDRTsKKwlidHNfcG11LmNhcGFiaWxpdGllcwk9IFBFUkZfUE1VX0NBUF9BVVhfTk9fU0cgfCBQRVJGX1BNVV9DQVBfSVRSQUNFIHwKKwkJCQkgIFBFUkZfUE1VX0NBUF9FWENMVVNJVkU7CiAJYnRzX3BtdS50YXNrX2N0eF9ucgk9IHBlcmZfc3dfY29udGV4dDsKIAlidHNfcG11LmV2ZW50X2luaXQJPSBidHNfZXZlbnRfaW5pdDsKIAlidHNfcG11LmFkZAkJPSBidHNfZXZlbnRfYWRkOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL2NvcmUuYyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9jb3JlLmMKaW5kZXggMmNiZGUyZi4uYTNhOWViOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL2NvcmUuYworKysgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvY29yZS5jCkBAIC0xNzMwLDkgKzE3MzAsMTEgQEAKICAqIGRpc2FibGVkIHN0YXRlIGlmIGNhbGxlZCBjb25zZWN1dGl2ZWx5LgogICoKICAqIER1cmluZyBjb25zZWN1dGl2ZSBjYWxscywgdGhlIHNhbWUgZGlzYWJsZSB2YWx1ZSB3aWxsIGJlIHdyaXR0ZW4gdG8gcmVsYXRlZAotICogcmVnaXN0ZXJzLCBzbyB0aGUgUE1VIHN0YXRlIHJlbWFpbnMgdW5jaGFuZ2VkLiBody5zdGF0ZSBpbgotICogaW50ZWxfYnRzX2Rpc2FibGVfbG9jYWwgd2lsbCByZW1haW4gUEVSRl9IRVNfU1RPUFBFRCB0b28gaW4gY29uc2VjdXRpdmUKLSAqIGNhbGxzLgorICogcmVnaXN0ZXJzLCBzbyB0aGUgUE1VIHN0YXRlIHJlbWFpbnMgdW5jaGFuZ2VkLgorICoKKyAqIGludGVsX2J0cyBldmVudHMgZG9uJ3QgY29leGlzdCB3aXRoIGludGVsIFBNVSdzIEJUUyBldmVudHMgYmVjYXVzZSBvZgorICogeDg2X2FkZF9leGNsdXNpdmUoeDg2X2xicl9leGNsdXNpdmVfbGJyKTsgdGhlcmUncyBubyBuZWVkIHRvIGtlZXAgdGhlbQorICogZGlzYWJsZWQgYXJvdW5kIGludGVsIFBNVSdzIGV2ZW50IGJhdGNoaW5nIGV0Yywgb25seSBpbnNpZGUgdGhlIFBNSSBoYW5kbGVyLgogICovCiBzdGF0aWMgdm9pZCBfX2ludGVsX3BtdV9kaXNhYmxlX2FsbCh2b2lkKQogewpAQCAtMTc0Miw4ICsxNzQ0LDYgQEAKIAogCWlmICh0ZXN0X2JpdChJTlRFTF9QTUNfSURYX0ZJWEVEX0JUUywgY3B1Yy0+YWN0aXZlX21hc2spKQogCQlpbnRlbF9wbXVfZGlzYWJsZV9idHMoKTsKLQllbHNlCi0JCWludGVsX2J0c19kaXNhYmxlX2xvY2FsKCk7CiAKIAlpbnRlbF9wbXVfcGVic19kaXNhYmxlX2FsbCgpOwogfQpAQCAtMTc3MSw4ICsxNzcxLDcgQEAKIAkJCXJldHVybjsKIAogCQlpbnRlbF9wbXVfZW5hYmxlX2J0cyhldmVudC0+aHcuY29uZmlnKTsKLQl9IGVsc2UKLQkJaW50ZWxfYnRzX2VuYWJsZV9sb2NhbCgpOworCX0KIH0KIAogc3RhdGljIHZvaWQgaW50ZWxfcG11X2VuYWJsZV9hbGwoaW50IGFkZGVkKQpAQCAtMTkwNywxMyArMTkwNiw2IEBACiAJY3B1Yy0+aW50ZWxfY3RybF9ob3N0X21hc2sgJj0gfigxdWxsIDw8IGh3Yy0+aWR4KTsKIAljcHVjLT5pbnRlbF9jcF9zdGF0dXMgJj0gfigxdWxsIDw8IGh3Yy0+aWR4KTsKIAotCS8qCi0JICogbXVzdCBkaXNhYmxlIGJlZm9yZSBhbnkgYWN0dWFsIGV2ZW50Ci0JICogYmVjYXVzZSBhbnkgZXZlbnQgbWF5IGJlIGNvbWJpbmVkIHdpdGggTEJSCi0JICovCi0JaWYgKG5lZWRzX2JyYW5jaF9zdGFjayhldmVudCkpCi0JCWludGVsX3BtdV9sYnJfZGlzYWJsZShldmVudCk7Ci0KIAlpZiAodW5saWtlbHkoaHdjLT5jb25maWdfYmFzZSA9PSBNU1JfQVJDSF9QRVJGTU9OX0ZJWEVEX0NUUl9DVFJMKSkgewogCQlpbnRlbF9wbXVfZGlzYWJsZV9maXhlZChod2MpOwogCQlyZXR1cm47CkBAIC0xOTI1LDYgKzE5MTcsMTQgQEAKIAkJaW50ZWxfcG11X3BlYnNfZGlzYWJsZShldmVudCk7CiB9CiAKK3N0YXRpYyB2b2lkIGludGVsX3BtdV9kZWxfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCWlmIChuZWVkc19icmFuY2hfc3RhY2soZXZlbnQpKQorCQlpbnRlbF9wbXVfbGJyX2RlbChldmVudCk7CisJaWYgKGV2ZW50LT5hdHRyLnByZWNpc2VfaXApCisJCWludGVsX3BtdV9wZWJzX2RlbChldmVudCk7Cit9CisKIHN0YXRpYyB2b2lkIGludGVsX3BtdV9lbmFibGVfZml4ZWQoc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YykKIHsKIAlpbnQgaWR4ID0gaHdjLT5pZHggLSBJTlRFTF9QTUNfSURYX0ZJWEVEOwpAQCAtMTk2OCwxMiArMTk2OCw2IEBACiAJCWludGVsX3BtdV9lbmFibGVfYnRzKGh3Yy0+Y29uZmlnKTsKIAkJcmV0dXJuOwogCX0KLQkvKgotCSAqIG11c3QgZW5hYmxlZCBiZWZvcmUgYW55IGFjdHVhbCBldmVudAotCSAqIGJlY2F1c2UgYW55IGV2ZW50IG1heSBiZSBjb21iaW5lZCB3aXRoIExCUgotCSAqLwotCWlmIChuZWVkc19icmFuY2hfc3RhY2soZXZlbnQpKQotCQlpbnRlbF9wbXVfbGJyX2VuYWJsZShldmVudCk7CiAKIAlpZiAoZXZlbnQtPmF0dHIuZXhjbHVkZV9ob3N0KQogCQljcHVjLT5pbnRlbF9jdHJsX2d1ZXN0X21hc2sgfD0gKDF1bGwgPDwgaHdjLT5pZHgpOwpAQCAtMTk5NCw2ICsxOTg4LDE0IEBACiAJX194ODZfcG11X2VuYWJsZV9ldmVudChod2MsIEFSQ0hfUEVSRk1PTl9FVkVOVFNFTF9FTkFCTEUpOwogfQogCitzdGF0aWMgdm9pZCBpbnRlbF9wbXVfYWRkX2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlpZiAoZXZlbnQtPmF0dHIucHJlY2lzZV9pcCkKKwkJaW50ZWxfcG11X3BlYnNfYWRkKGV2ZW50KTsKKwlpZiAobmVlZHNfYnJhbmNoX3N0YWNrKGV2ZW50KSkKKwkJaW50ZWxfcG11X2xicl9hZGQoZXZlbnQpOworfQorCiAvKgogICogU2F2ZSBhbmQgcmVzdGFydCBhbiBleHBpcmVkIGV2ZW50LiBDYWxsZWQgYnkgTk1JIGNvbnRleHRzLAogICogc28gaXQgaGFzIHRvIGJlIGNhcmVmdWwgYWJvdXQgcHJlZW1wdGluZyBub3JtYWwgZXZlbnQgb3BzOgpAQCAtMjA3Myw2ICsyMDc1LDcgQEAKIAkgKi8KIAlpZiAoIXg4Nl9wbXUubGF0ZV9hY2spCiAJCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOworCWludGVsX2J0c19kaXNhYmxlX2xvY2FsKCk7CiAJX19pbnRlbF9wbXVfZGlzYWJsZV9hbGwoKTsKIAloYW5kbGVkID0gaW50ZWxfcG11X2RyYWluX2J0c19idWZmZXIoKTsKIAloYW5kbGVkICs9IGludGVsX2J0c19pbnRlcnJ1cHQoKTsKQEAgLTIxNzIsNiArMjE3NSw3IEBACiAJLyogT25seSByZXN0b3JlIFBNVSBzdGF0ZSB3aGVuIGl0J3MgYWN0aXZlLiBTZWUgeDg2X3BtdV9kaXNhYmxlKCkuICovCiAJaWYgKGNwdWMtPmVuYWJsZWQpCiAJCV9faW50ZWxfcG11X2VuYWJsZV9hbGwoMCwgdHJ1ZSk7CisJaW50ZWxfYnRzX2VuYWJsZV9sb2NhbCgpOwogCiAJLyoKIAkgKiBPbmx5IHVubWFzayB0aGUgTk1JIGFmdGVyIHRoZSBvdmVyZmxvdyBjb3VudGVycwpAQCAtMzI5MCw2ICszMjk0LDggQEAKIAkuZW5hYmxlX2FsbAkJPSBpbnRlbF9wbXVfZW5hYmxlX2FsbCwKIAkuZW5hYmxlCQkJPSBpbnRlbF9wbXVfZW5hYmxlX2V2ZW50LAogCS5kaXNhYmxlCQk9IGludGVsX3BtdV9kaXNhYmxlX2V2ZW50LAorCS5hZGQJCQk9IGludGVsX3BtdV9hZGRfZXZlbnQsCisJLmRlbAkJCT0gaW50ZWxfcG11X2RlbF9ldmVudCwKIAkuaHdfY29uZmlnCQk9IGludGVsX3BtdV9od19jb25maWcsCiAJLnNjaGVkdWxlX2V2ZW50cwk9IHg4Nl9zY2hlZHVsZV9ldmVudHMsCiAJLmV2ZW50c2VsCQk9IE1TUl9BUkNIX1BFUkZNT05fRVZFTlRTRUwwLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL2NxbS5jIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL2NxbS5jCmluZGV4IDc4M2M0OWQuLjhmODJiMDIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9jcW0uYworKysgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvY3FtLmMKQEAgLTQ1OCw2ICs0NTgsMTEgQEAKIHN0YXRpYyB2b2lkIGluaXRfbWJtX3NhbXBsZSh1MzIgcm1pZCwgdTMyIGV2dF90eXBlKTsKIHN0YXRpYyB2b2lkIF9faW50ZWxfbWJtX2V2ZW50X2NvdW50KHZvaWQgKmluZm8pOwogCitzdGF0aWMgYm9vbCBpc19jcW1fZXZlbnQoaW50IGUpCit7CisJcmV0dXJuIChlID09IFFPU19MM19PQ0NVUF9FVkVOVF9JRCk7Cit9CisKIHN0YXRpYyBib29sIGlzX21ibV9ldmVudChpbnQgZSkKIHsKIAlyZXR1cm4gKGUgPj0gUU9TX01CTV9UT1RBTF9FVkVOVF9JRCAmJiBlIDw9IFFPU19NQk1fTE9DQUxfRVZFTlRfSUQpOwpAQCAtMTM2Niw2ICsxMzcxLDEwIEBACiAJICAgICAoZXZlbnQtPmF0dHIuY29uZmlnID4gUU9TX01CTV9MT0NBTF9FVkVOVF9JRCkpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKChpc19jcW1fZXZlbnQoZXZlbnQtPmF0dHIuY29uZmlnKSAmJiAhY3FtX2VuYWJsZWQpIHx8CisJICAgIChpc19tYm1fZXZlbnQoZXZlbnQtPmF0dHIuY29uZmlnKSAmJiAhbWJtX2VuYWJsZWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCS8qIHVuc3VwcG9ydGVkIG1vZGVzIGFuZCBmaWx0ZXJzICovCiAJaWYgKGV2ZW50LT5hdHRyLmV4Y2x1ZGVfdXNlciAgIHx8CiAJICAgIGV2ZW50LT5hdHRyLmV4Y2x1ZGVfa2VybmVsIHx8CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvZHMuYyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9kcy5jCmluZGV4IDdjZTlmM2YuLjAzMTkzMTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9kcy5jCisrKyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9kcy5jCkBAIC04MDYsOSArODA2LDY1IEBACiAJcmV0dXJuICZlbXB0eWNvbnN0cmFpbnQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBwZWJzX2lzX2VuYWJsZWQoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMpCisvKgorICogV2UgbmVlZCB0aGUgc2NoZWRfdGFzayBjYWxsYmFjayBldmVuIGZvciBwZXItY3B1IGV2ZW50cyB3aGVuIHdlIHVzZQorICogdGhlIGxhcmdlIGludGVycnVwdCB0aHJlc2hvbGQsIHN1Y2ggdGhhdCB3ZSBjYW4gcHJvdmlkZSBQSUQgYW5kIFRJRAorICogdG8gUEVCUyBzYW1wbGVzLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgcGVic19uZWVkc19zY2hlZF9jYihzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YykKIHsKLQlyZXR1cm4gKGNwdWMtPnBlYnNfZW5hYmxlZCAmICgoMVVMTCA8PCBNQVhfUEVCU19FVkVOVFMpIC0gMSkpOworCXJldHVybiBjcHVjLT5uX3BlYnMgJiYgKGNwdWMtPm5fcGVicyA9PSBjcHVjLT5uX2xhcmdlX3BlYnMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGVic191cGRhdGVfdGhyZXNob2xkKHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjKQoreworCXN0cnVjdCBkZWJ1Z19zdG9yZSAqZHMgPSBjcHVjLT5kczsKKwl1NjQgdGhyZXNob2xkOworCisJaWYgKGNwdWMtPm5fcGVicyA9PSBjcHVjLT5uX2xhcmdlX3BlYnMpIHsKKwkJdGhyZXNob2xkID0gZHMtPnBlYnNfYWJzb2x1dGVfbWF4aW11bSAtCisJCQl4ODZfcG11Lm1heF9wZWJzX2V2ZW50cyAqIHg4Nl9wbXUucGVic19yZWNvcmRfc2l6ZTsKKwl9IGVsc2UgeworCQl0aHJlc2hvbGQgPSBkcy0+cGVic19idWZmZXJfYmFzZSArIHg4Nl9wbXUucGVic19yZWNvcmRfc2l6ZTsKKwl9CisKKwlkcy0+cGVic19pbnRlcnJ1cHRfdGhyZXNob2xkID0gdGhyZXNob2xkOworfQorCitzdGF0aWMgdm9pZAorcGVic191cGRhdGVfc3RhdGUoYm9vbCBuZWVkZWRfY2IsIHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLCBzdHJ1Y3QgcG11ICpwbXUpCit7CisJLyoKKwkgKiBNYWtlIHN1cmUgd2UgZ2V0IHVwZGF0ZWQgd2l0aCB0aGUgZmlyc3QgUEVCUworCSAqIGV2ZW50LiBJdCB3aWxsIHRyaWdnZXIgYWxzbyBkdXJpbmcgcmVtb3ZhbCwgYnV0CisJICogdGhhdCBkb2VzIG5vdCBodXJ0OgorCSAqLworCWJvb2wgdXBkYXRlID0gY3B1Yy0+bl9wZWJzID09IDE7CisKKwlpZiAobmVlZGVkX2NiICE9IHBlYnNfbmVlZHNfc2NoZWRfY2IoY3B1YykpIHsKKwkJaWYgKCFuZWVkZWRfY2IpCisJCQlwZXJmX3NjaGVkX2NiX2luYyhwbXUpOworCQllbHNlCisJCQlwZXJmX3NjaGVkX2NiX2RlYyhwbXUpOworCisJCXVwZGF0ZSA9IHRydWU7CisJfQorCisJaWYgKHVwZGF0ZSkKKwkJcGVic191cGRhdGVfdGhyZXNob2xkKGNwdWMpOworfQorCit2b2lkIGludGVsX3BtdV9wZWJzX2FkZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSB0aGlzX2NwdV9wdHIoJmNwdV9od19ldmVudHMpOworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OworCWJvb2wgbmVlZGVkX2NiID0gcGVic19uZWVkc19zY2hlZF9jYihjcHVjKTsKKworCWNwdWMtPm5fcGVicysrOworCWlmIChod2MtPmZsYWdzICYgUEVSRl9YODZfRVZFTlRfRlJFRVJVTk5JTkcpCisJCWNwdWMtPm5fbGFyZ2VfcGVicysrOworCisJcGVic191cGRhdGVfc3RhdGUobmVlZGVkX2NiLCBjcHVjLCBldmVudC0+Y3R4LT5wbXUpOwogfQogCiB2b2lkIGludGVsX3BtdV9wZWJzX2VuYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCkBAIC04MTYsMTIgKzg3Miw5IEBACiAJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSB0aGlzX2NwdV9wdHIoJmNwdV9od19ldmVudHMpOwogCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OwogCXN0cnVjdCBkZWJ1Z19zdG9yZSAqZHMgPSBjcHVjLT5kczsKLQlib29sIGZpcnN0X3BlYnM7Ci0JdTY0IHRocmVzaG9sZDsKIAogCWh3Yy0+Y29uZmlnICY9IH5BUkNIX1BFUkZNT05fRVZFTlRTRUxfSU5UOwogCi0JZmlyc3RfcGVicyA9ICFwZWJzX2lzX2VuYWJsZWQoY3B1Yyk7CiAJY3B1Yy0+cGVic19lbmFibGVkIHw9IDFVTEwgPDwgaHdjLT5pZHg7CiAKIAlpZiAoZXZlbnQtPmh3LmZsYWdzICYgUEVSRl9YODZfRVZFTlRfUEVCU19MRExBVCkKQEAgLTgzMCw0NiArODgzLDM0IEBACiAJCWNwdWMtPnBlYnNfZW5hYmxlZCB8PSAxVUxMIDw8IDYzOwogCiAJLyoKLQkgKiBXaGVuIHRoZSBldmVudCBpcyBjb25zdHJhaW5lZCBlbm91Z2ggd2UgY2FuIHVzZSBhIGxhcmdlcgotCSAqIHRocmVzaG9sZCBhbmQgcnVuIHRoZSBldmVudCB3aXRoIGxlc3MgZnJlcXVlbnQgUE1JLgorCSAqIFVzZSBhdXRvLXJlbG9hZCBpZiBwb3NzaWJsZSB0byBzYXZlIGEgTVNSIHdyaXRlIGluIHRoZSBQTUkuCisJICogVGhpcyBtdXN0IGJlIGRvbmUgaW4gcG11OjpzdGFydCgpLCBiZWNhdXNlIFBFUkZfRVZFTlRfSU9DX1BFUklPRC4KIAkgKi8KLQlpZiAoaHdjLT5mbGFncyAmIFBFUkZfWDg2X0VWRU5UX0ZSRUVSVU5OSU5HKSB7Ci0JCXRocmVzaG9sZCA9IGRzLT5wZWJzX2Fic29sdXRlX21heGltdW0gLQotCQkJeDg2X3BtdS5tYXhfcGVic19ldmVudHMgKiB4ODZfcG11LnBlYnNfcmVjb3JkX3NpemU7Ci0KLQkJaWYgKGZpcnN0X3BlYnMpCi0JCQlwZXJmX3NjaGVkX2NiX2luYyhldmVudC0+Y3R4LT5wbXUpOwotCX0gZWxzZSB7Ci0JCXRocmVzaG9sZCA9IGRzLT5wZWJzX2J1ZmZlcl9iYXNlICsgeDg2X3BtdS5wZWJzX3JlY29yZF9zaXplOwotCi0JCS8qCi0JCSAqIElmIG5vdCBhbGwgZXZlbnRzIGNhbiB1c2UgbGFyZ2VyIGJ1ZmZlciwKLQkJICogcm9sbCBiYWNrIHRvIHRocmVzaG9sZCA9IDEKLQkJICovCi0JCWlmICghZmlyc3RfcGVicyAmJgotCQkgICAgKGRzLT5wZWJzX2ludGVycnVwdF90aHJlc2hvbGQgPiB0aHJlc2hvbGQpKQotCQkJcGVyZl9zY2hlZF9jYl9kZWMoZXZlbnQtPmN0eC0+cG11KTsKLQl9Ci0KLQkvKiBVc2UgYXV0by1yZWxvYWQgaWYgcG9zc2libGUgdG8gc2F2ZSBhIE1TUiB3cml0ZSBpbiB0aGUgUE1JICovCiAJaWYgKGh3Yy0+ZmxhZ3MgJiBQRVJGX1g4Nl9FVkVOVF9BVVRPX1JFTE9BRCkgewogCQlkcy0+cGVic19ldmVudF9yZXNldFtod2MtPmlkeF0gPQogCQkJKHU2NCkoLWh3Yy0+c2FtcGxlX3BlcmlvZCkgJiB4ODZfcG11LmNudHZhbF9tYXNrOwogCX0KK30KIAotCWlmIChmaXJzdF9wZWJzIHx8IGRzLT5wZWJzX2ludGVycnVwdF90aHJlc2hvbGQgPiB0aHJlc2hvbGQpCi0JCWRzLT5wZWJzX2ludGVycnVwdF90aHJlc2hvbGQgPSB0aHJlc2hvbGQ7Cit2b2lkIGludGVsX3BtdV9wZWJzX2RlbChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSB0aGlzX2NwdV9wdHIoJmNwdV9od19ldmVudHMpOworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OworCWJvb2wgbmVlZGVkX2NiID0gcGVic19uZWVkc19zY2hlZF9jYihjcHVjKTsKKworCWNwdWMtPm5fcGVicy0tOworCWlmIChod2MtPmZsYWdzICYgUEVSRl9YODZfRVZFTlRfRlJFRVJVTk5JTkcpCisJCWNwdWMtPm5fbGFyZ2VfcGVicy0tOworCisJcGVic191cGRhdGVfc3RhdGUobmVlZGVkX2NiLCBjcHVjLCBldmVudC0+Y3R4LT5wbXUpOwogfQogCiB2b2lkIGludGVsX3BtdV9wZWJzX2Rpc2FibGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gdGhpc19jcHVfcHRyKCZjcHVfaHdfZXZlbnRzKTsKIAlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKLQlzdHJ1Y3QgZGVidWdfc3RvcmUgKmRzID0gY3B1Yy0+ZHM7Ci0JYm9vbCBsYXJnZV9wZWJzID0gZHMtPnBlYnNfaW50ZXJydXB0X3RocmVzaG9sZCA+Ci0JCWRzLT5wZWJzX2J1ZmZlcl9iYXNlICsgeDg2X3BtdS5wZWJzX3JlY29yZF9zaXplOwogCi0JaWYgKGxhcmdlX3BlYnMpCisJaWYgKGNwdWMtPm5fcGVicyA9PSBjcHVjLT5uX2xhcmdlX3BlYnMpCiAJCWludGVsX3BtdV9kcmFpbl9wZWJzX2J1ZmZlcigpOwogCiAJY3B1Yy0+cGVic19lbmFibGVkICY9IH4oMVVMTCA8PCBod2MtPmlkeCk7CkBAIC04NzksOSArOTIwLDYgQEAKIAllbHNlIGlmIChldmVudC0+aHcuZmxhZ3MgJiBQRVJGX1g4Nl9FVkVOVF9QRUJTX1NUKQogCQljcHVjLT5wZWJzX2VuYWJsZWQgJj0gfigxVUxMIDw8IDYzKTsKIAotCWlmIChsYXJnZV9wZWJzICYmICFwZWJzX2lzX2VuYWJsZWQoY3B1YykpCi0JCXBlcmZfc2NoZWRfY2JfZGVjKGV2ZW50LT5jdHgtPnBtdSk7Ci0KIAlpZiAoY3B1Yy0+ZW5hYmxlZCkKIAkJd3Jtc3JsKE1TUl9JQTMyX1BFQlNfRU5BQkxFLCBjcHVjLT5wZWJzX2VuYWJsZWQpOwogCkBAIC0xMjc0LDE4ICsxMzEyLDE4IEBACiAJCXN0cnVjdCBwZWJzX3JlY29yZF9uaG0gKnAgPSBhdDsKIAkJdTY0IHBlYnNfc3RhdHVzOwogCi0JCS8qIFBFQlMgdjMgaGFzIGFjY3VyYXRlIHN0YXR1cyBiaXRzICovCisJCXBlYnNfc3RhdHVzID0gcC0+c3RhdHVzICYgY3B1Yy0+cGVic19lbmFibGVkOworCQlwZWJzX3N0YXR1cyAmPSAoMVVMTCA8PCB4ODZfcG11Lm1heF9wZWJzX2V2ZW50cykgLSAxOworCisJCS8qIFBFQlMgdjMgaGFzIG1vcmUgYWNjdXJhdGUgc3RhdHVzIGJpdHMgKi8KIAkJaWYgKHg4Nl9wbXUuaW50ZWxfY2FwLnBlYnNfZm9ybWF0ID49IDMpIHsKLQkJCWZvcl9lYWNoX3NldF9iaXQoYml0LCAodW5zaWduZWQgbG9uZyAqKSZwLT5zdGF0dXMsCi0JCQkJCSBNQVhfUEVCU19FVkVOVFMpCisJCQlmb3JfZWFjaF9zZXRfYml0KGJpdCwgKHVuc2lnbmVkIGxvbmcgKikmcGVic19zdGF0dXMsCisJCQkJCSB4ODZfcG11Lm1heF9wZWJzX2V2ZW50cykKIAkJCQljb3VudHNbYml0XSsrOwogCiAJCQljb250aW51ZTsKIAkJfQogCi0JCXBlYnNfc3RhdHVzID0gcC0+c3RhdHVzICYgY3B1Yy0+cGVic19lbmFibGVkOwotCQlwZWJzX3N0YXR1cyAmPSAoMVVMTCA8PCB4ODZfcG11Lm1heF9wZWJzX2V2ZW50cykgLSAxOwotCiAJCS8qCiAJCSAqIE9uIHNvbWUgQ1BVcyB0aGUgUEVCUyBzdGF0dXMgY2FuIGJlIHplcm8gd2hlbiBQRUJTIGlzCiAJCSAqIHJhY2luZyB3aXRoIGNsZWFyaW5nIG9mIEdMT0JBTF9TVEFUVVMuCkBAIC0xMzMzLDggKzEzNzEsMTEgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWV2ZW50ID0gY3B1Yy0+ZXZlbnRzW2JpdF07Ci0JCVdBUk5fT05fT05DRSghZXZlbnQpOwotCQlXQVJOX09OX09OQ0UoIWV2ZW50LT5hdHRyLnByZWNpc2VfaXApOworCQlpZiAoV0FSTl9PTl9PTkNFKCFldmVudCkpCisJCQljb250aW51ZTsKKworCQlpZiAoV0FSTl9PTl9PTkNFKCFldmVudC0+YXR0ci5wcmVjaXNlX2lwKSkKKwkJCWNvbnRpbnVlOwogCiAJCS8qIGxvZyBkcm9wcGVkIHNhbXBsZXMgbnVtYmVyICovCiAJCWlmIChlcnJvcltiaXRdKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL2xici5jIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL2xici5jCmluZGV4IDcwN2QzNTguLmZjNmNmMjEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9sYnIuYworKysgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvbGJyLmMKQEAgLTM4MCw3ICszODAsNiBAQAogCiB2b2lkIGludGVsX3BtdV9sYnJfc2NoZWRfdGFzayhzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgsIGJvb2wgc2NoZWRfaW4pCiB7Ci0Jc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSB0aGlzX2NwdV9wdHIoJmNwdV9od19ldmVudHMpOwogCXN0cnVjdCB4ODZfcGVyZl90YXNrX2NvbnRleHQgKnRhc2tfY3R4OwogCiAJLyoKQEAgLTM5MCwzMSArMzg5LDIxIEBACiAJICovCiAJdGFza19jdHggPSBjdHggPyBjdHgtPnRhc2tfY3R4X2RhdGEgOiBOVUxMOwogCWlmICh0YXNrX2N0eCkgewotCQlpZiAoc2NoZWRfaW4pIHsKKwkJaWYgKHNjaGVkX2luKQogCQkJX19pbnRlbF9wbXVfbGJyX3Jlc3RvcmUodGFza19jdHgpOwotCQkJY3B1Yy0+bGJyX2NvbnRleHQgPSBjdHg7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCV9faW50ZWxfcG11X2xicl9zYXZlKHRhc2tfY3R4KTsKLQkJfQogCQlyZXR1cm47CiAJfQogCiAJLyoKLQkgKiBXaGVuIHNhbXBsaW5nIHRoZSBicmFuY2sgc3RhY2sgaW4gc3lzdGVtLXdpZGUsIGl0IG1heSBiZQotCSAqIG5lY2Vzc2FyeSB0byBmbHVzaCB0aGUgc3RhY2sgb24gY29udGV4dCBzd2l0Y2guIFRoaXMgaGFwcGVucwotCSAqIHdoZW4gdGhlIGJyYW5jaCBzdGFjayBkb2VzIG5vdCB0YWcgaXRzIGVudHJpZXMgd2l0aCB0aGUgcGlkCi0JICogb2YgdGhlIGN1cnJlbnQgdGFzay4gT3RoZXJ3aXNlIGl0IGJlY29tZXMgaW1wb3NzaWJsZSB0bwotCSAqIGFzc29jaWF0ZSBhIGJyYW5jaCBlbnRyeSB3aXRoIGEgdGFzay4gVGhpcyBhbWJpZ3VpdHkgaXMgbW9yZQotCSAqIGxpa2VseSB0byBhcHBlYXIgd2hlbiB0aGUgYnJhbmNoIHN0YWNrIHN1cHBvcnRzIHByaXYgbGV2ZWwKLQkgKiBmaWx0ZXJpbmcgYW5kIHRoZSB1c2VyIHNldHMgaXQgdG8gbW9uaXRvciBvbmx5IGF0IHRoZSB1c2VyCi0JICogbGV2ZWwgKHdoaWNoIGNvdWxkIGJlIGEgdXNlZnVsIG1lYXN1cmVtZW50IGluIHN5c3RlbS13aWRlCi0JICogbW9kZSkuIEluIHRoYXQgY2FzZSwgdGhlIHJpc2sgaXMgaGlnaCBvZiBoYXZpbmcgYSBicmFuY2gKLQkgKiBzdGFjayB3aXRoIGJyYW5jaCBmcm9tIG11bHRpcGxlIHRhc2tzLgotIAkgKi8KLQlpZiAoc2NoZWRfaW4pIHsKKwkgKiBTaW5jZSBhIGNvbnRleHQgc3dpdGNoIGNhbiBmbGlwIHRoZSBhZGRyZXNzIHNwYWNlIGFuZCBMQlIgZW50cmllcworCSAqIGFyZSBub3QgdGFnZ2VkIHdpdGggYW4gaWRlbnRpZmllciwgd2UgbmVlZCB0byB3aXBlIHRoZSBMQlIsIGV2ZW4gZm9yCisJICogcGVyLWNwdSBldmVudHMuIFlvdSBzaW1wbHkgY2Fubm90IHJlc29sdmUgdGhlIGJyYW5jaGVzIGZyb20gdGhlIG9sZAorCSAqIGFkZHJlc3Mgc3BhY2UuCisJICovCisJaWYgKHNjaGVkX2luKQogCQlpbnRlbF9wbXVfbGJyX3Jlc2V0KCk7Ci0JCWNwdWMtPmxicl9jb250ZXh0ID0gY3R4OwotCX0KIH0KIAogc3RhdGljIGlubGluZSBib29sIGJyYW5jaF91c2VyX2NhbGxzdGFjayh1bnNpZ25lZCBicl9zZWwpCkBAIC00MjIsNyArNDExLDcgQEAKIAlyZXR1cm4gKGJyX3NlbCAmIFg4Nl9CUl9VU0VSKSAmJiAoYnJfc2VsICYgWDg2X0JSX0NBTExfU1RBQ0spOwogfQogCi12b2lkIGludGVsX3BtdV9sYnJfZW5hYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3ZvaWQgaW50ZWxfcG11X2xicl9hZGQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gdGhpc19jcHVfcHRyKCZjcHVfaHdfZXZlbnRzKTsKIAlzdHJ1Y3QgeDg2X3BlcmZfdGFza19jb250ZXh0ICp0YXNrX2N0eDsKQEAgLTQzMCwyNyArNDE5LDM4IEBACiAJaWYgKCF4ODZfcG11Lmxicl9ucikKIAkJcmV0dXJuOwogCi0JLyoKLQkgKiBSZXNldCB0aGUgTEJSIHN0YWNrIGlmIHdlIGNoYW5nZWQgdGFzayBjb250ZXh0IHRvCi0JICogYXZvaWQgZGF0YSBsZWFrcy4KLQkgKi8KLQlpZiAoZXZlbnQtPmN0eC0+dGFzayAmJiBjcHVjLT5sYnJfY29udGV4dCAhPSBldmVudC0+Y3R4KSB7Ci0JCWludGVsX3BtdV9sYnJfcmVzZXQoKTsKLQkJY3B1Yy0+bGJyX2NvbnRleHQgPSBldmVudC0+Y3R4OwotCX0KIAljcHVjLT5icl9zZWwgPSBldmVudC0+aHcuYnJhbmNoX3JlZy5yZWc7CiAKLQlpZiAoYnJhbmNoX3VzZXJfY2FsbHN0YWNrKGNwdWMtPmJyX3NlbCkgJiYgZXZlbnQtPmN0eCAmJgotCQkJCQlldmVudC0+Y3R4LT50YXNrX2N0eF9kYXRhKSB7CisJaWYgKGJyYW5jaF91c2VyX2NhbGxzdGFjayhjcHVjLT5icl9zZWwpICYmIGV2ZW50LT5jdHgtPnRhc2tfY3R4X2RhdGEpIHsKIAkJdGFza19jdHggPSBldmVudC0+Y3R4LT50YXNrX2N0eF9kYXRhOwogCQl0YXNrX2N0eC0+bGJyX2NhbGxzdGFja191c2VycysrOwogCX0KIAotCWNwdWMtPmxicl91c2VycysrOworCS8qCisJICogUmVxdWVzdCBwbXU6OnNjaGVkX3Rhc2soKSBjYWxsYmFjaywgd2hpY2ggd2lsbCBmaXJlIGluc2lkZSB0aGUKKwkgKiByZWd1bGFyIHBlcmYgZXZlbnQgc2NoZWR1bGluZywgc28gdGhhdCBjYWxsIHdpbGw6CisJICoKKwkgKiAgLSByZXN0b3JlIG9yIHdpcGU7IHdoZW4gTEJSLWNhbGxzdGFjaywKKwkgKiAgLSB3aXBlOyBvdGhlcndpc2UsCisJICoKKwkgKiB3aGVuIHRoaXMgaXMgZnJvbSBfX3BlcmZfZXZlbnRfdGFza19zY2hlZF9pbigpLgorCSAqCisJICogSG93ZXZlciwgaWYgdGhpcyBpcyBmcm9tIHBlcmZfaW5zdGFsbF9pbl9jb250ZXh0KCksIG5vIHN1Y2ggY2FsbGJhY2sKKwkgKiB3aWxsIGZvbGxvdyBhbmQgd2UnbGwgbmVlZCB0byByZXNldCB0aGUgTEJSIGhlcmUgaWYgdGhpcyBpcyB0aGUKKwkgKiBmaXJzdCBMQlIgZXZlbnQuCisJICoKKwkgKiBUaGUgcHJvYmxlbSBpcywgd2UgY2Fubm90IHRlbGwgdGhlc2UgY2FzZXMgYXBhcnQuLi4gYnV0IHdlIGNhbgorCSAqIGV4Y2x1ZGUgdGhlIGJpZ2dlc3QgY2h1bmsgb2YgY2FzZXMgYnkgbG9va2luZyBhdAorCSAqIGV2ZW50LT50b3RhbF90aW1lX3J1bm5pbmcuIEFuIGV2ZW50IHRoYXQgaGFzIGFjY3J1ZWQgcnVudGltZSBjYW5ub3QKKwkgKiBiZSAnbmV3Jy4gQ29udmVyc2VseSwgYSBuZXcgZXZlbnQgY2FuIGdldCBpbnN0YWxsZWQgdGhyb3VnaCB0aGUKKwkgKiBjb250ZXh0IHN3aXRjaCBwYXRoIGZvciB0aGUgZmlyc3QgdGltZS4KKwkgKi8KIAlwZXJmX3NjaGVkX2NiX2luYyhldmVudC0+Y3R4LT5wbXUpOworCWlmICghY3B1Yy0+bGJyX3VzZXJzKysgJiYgIWV2ZW50LT50b3RhbF90aW1lX3J1bm5pbmcpCisJCWludGVsX3BtdV9sYnJfcmVzZXQoKTsKIH0KIAotdm9pZCBpbnRlbF9wbXVfbGJyX2Rpc2FibGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQordm9pZCBpbnRlbF9wbXVfbGJyX2RlbChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSB0aGlzX2NwdV9wdHIoJmNwdV9od19ldmVudHMpOwogCXN0cnVjdCB4ODZfcGVyZl90YXNrX2NvbnRleHQgKnRhc2tfY3R4OwpAQCAtNDY3LDEyICs0NjcsNiBAQAogCWNwdWMtPmxicl91c2Vycy0tOwogCVdBUk5fT05fT05DRShjcHVjLT5sYnJfdXNlcnMgPCAwKTsKIAlwZXJmX3NjaGVkX2NiX2RlYyhldmVudC0+Y3R4LT5wbXUpOwotCi0JaWYgKGNwdWMtPmVuYWJsZWQgJiYgIWNwdWMtPmxicl91c2VycykgewotCQlfX2ludGVsX3BtdV9sYnJfZGlzYWJsZSgpOwotCQkvKiBhdm9pZCBzdGFsZSBwb2ludGVyICovCi0JCWNwdWMtPmxicl9jb250ZXh0ID0gTlVMTDsKLQl9CiB9CiAKIHZvaWQgaW50ZWxfcG11X2xicl9lbmFibGVfYWxsKGJvb2wgcG1pKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL3B0LmMgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvcHQuYwppbmRleCAwNGJiNWZiLi5jNTA0N2I4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvcHQuYworKysgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvcHQuYwpAQCAtNjksNiArNjksOCBAQAogCVBUX0NBUChwc2JfY3ljLAkJCTAsIENSX0VCWCwgQklUKDEpKSwKIAlQVF9DQVAoaXBfZmlsdGVyaW5nLAkJMCwgQ1JfRUJYLCBCSVQoMikpLAogCVBUX0NBUChtdGMsCQkJMCwgQ1JfRUJYLCBCSVQoMykpLAorCVBUX0NBUChwdHdyaXRlLAkJCTAsIENSX0VCWCwgQklUKDQpKSwKKwlQVF9DQVAocG93ZXJfZXZlbnRfdHJhY2UsCTAsIENSX0VCWCwgQklUKDUpKSwKIAlQVF9DQVAodG9wYV9vdXRwdXQsCQkwLCBDUl9FQ1gsIEJJVCgwKSksCiAJUFRfQ0FQKHRvcGFfbXVsdGlwbGVfZW50cmllcywJMCwgQ1JfRUNYLCBCSVQoMSkpLAogCVBUX0NBUChzaW5nbGVfcmFuZ2Vfb3V0cHV0LAkwLCBDUl9FQ1gsIEJJVCgyKSksCkBAIC0yNTksMTAgKzI2MSwxNiBAQAogI2RlZmluZSBSVElUX0NUTF9NVEMJKFJUSVRfQ1RMX01UQ19FTgl8IFwKIAkJCSBSVElUX0NUTF9NVENfUkFOR0UpCiAKKyNkZWZpbmUgUlRJVF9DVExfUFRXCShSVElUX0NUTF9QVFdfRU4JfCBcCisJCQkgUlRJVF9DVExfRlVQX09OX1BUVykKKwogI2RlZmluZSBQVF9DT05GSUdfTUFTSyAoUlRJVF9DVExfVFNDX0VOCQl8IFwKIAkJCVJUSVRfQ1RMX0RJU1JFVEMJfCBcCiAJCQlSVElUX0NUTF9DWUNfUFNCCXwgXAotCQkJUlRJVF9DVExfTVRDKQorCQkJUlRJVF9DVExfTVRDCQl8IFwKKwkJCVJUSVRfQ1RMX1BXUl9FVlRfRU4JfCBcCisJCQlSVElUX0NUTF9GVVBfT05fUFRXCXwgXAorCQkJUlRJVF9DVExfUFRXX0VOKQogCiBzdGF0aWMgYm9vbCBwdF9ldmVudF92YWxpZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CkBAIC0zMTEsNiArMzE5LDIwIEBACiAJCQlyZXR1cm4gZmFsc2U7CiAJfQogCisJaWYgKGNvbmZpZyAmIFJUSVRfQ1RMX1BXUl9FVlRfRU4gJiYKKwkgICAgIXB0X2NhcF9nZXQoUFRfQ0FQX3Bvd2VyX2V2ZW50X3RyYWNlKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGNvbmZpZyAmIFJUSVRfQ1RMX1BUVykgeworCQlpZiAoIXB0X2NhcF9nZXQoUFRfQ0FQX3B0d3JpdGUpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCS8qIEZVUG9uUFRXIHdpdGhvdXQgUFRXIGRvZXNuJ3QgbWFrZSBzZW5zZSAqLworCQlpZiAoKGNvbmZpZyAmIFJUSVRfQ1RMX0ZVUF9PTl9QVFcpICYmCisJCSAgICAhKGNvbmZpZyAmIFJUSVRfQ1RMX1BUV19FTikpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCiAJcmV0dXJuIHRydWU7CiB9CiAKQEAgLTEwNzQsNiArMTA5NiwxMSBAQAogCWV2ZW50LT5ody5hZGRyX2ZpbHRlcnMgPSBOVUxMOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgdmFsaWRfa2VybmVsX2lwKHVuc2lnbmVkIGxvbmcgaXApCit7CisJcmV0dXJuIHZpcnRfYWRkcl92YWxpZChpcCkgJiYga2VybmVsX2lwKGlwKTsKK30KKwogc3RhdGljIGludCBwdF9ldmVudF9hZGRyX2ZpbHRlcnNfdmFsaWRhdGUoc3RydWN0IGxpc3RfaGVhZCAqZmlsdGVycykKIHsKIAlzdHJ1Y3QgcGVyZl9hZGRyX2ZpbHRlciAqZmlsdGVyOwpAQCAtMTA4MSwxMSArMTEwOCwxNiBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmaWx0ZXIsIGZpbHRlcnMsIGVudHJ5KSB7CiAJCS8qIFBUIGRvZXNuJ3Qgc3VwcG9ydCBzaW5nbGUgYWRkcmVzcyB0cmlnZ2VycyAqLwotCQlpZiAoIWZpbHRlci0+cmFuZ2UpCisJCWlmICghZmlsdGVyLT5yYW5nZSB8fCAhZmlsdGVyLT5zaXplKQogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JCWlmICghZmlsdGVyLT5pbm9kZSAmJiAha2VybmVsX2lwKGZpbHRlci0+b2Zmc2V0KSkKLQkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIWZpbHRlci0+aW5vZGUpIHsKKwkJCWlmICghdmFsaWRfa2VybmVsX2lwKGZpbHRlci0+b2Zmc2V0KSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKCF2YWxpZF9rZXJuZWxfaXAoZmlsdGVyLT5vZmZzZXQgKyBmaWx0ZXItPnNpemUpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CiAKIAkJaWYgKCsrcmFuZ2UgPiBwdF9jYXBfZ2V0KFBUX0NBUF9udW1fYWRkcmVzc19yYW5nZXMpKQogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtMTExMSw3ICsxMTQzLDcgQEAKIAkJfSBlbHNlIHsKIAkJCS8qIGFwcGx5IHRoZSBvZmZzZXQgKi8KIAkJCW1zcl9hID0gZmlsdGVyLT5vZmZzZXQgKyBvZmZzW3JhbmdlXTsKLQkJCW1zcl9iID0gZmlsdGVyLT5zaXplICsgbXNyX2E7CisJCQltc3JfYiA9IGZpbHRlci0+c2l6ZSArIG1zcl9hIC0gMTsKIAkJfQogCiAJCWZpbHRlcnMtPmZpbHRlcltyYW5nZV0ubXNyX2EgID0gbXNyX2E7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvcHQuaCBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9wdC5oCmluZGV4IGVmZmZhNGEuLjUzNDczYzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9wdC5oCisrKyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9wdC5oCkBAIC0yNiwxMSArMjYsMTQgQEAKICNkZWZpbmUgUlRJVF9DVExfQ1lDTEVBQ0MJCUJJVCgxKQogI2RlZmluZSBSVElUX0NUTF9PUwkJCUJJVCgyKQogI2RlZmluZSBSVElUX0NUTF9VU1IJCQlCSVQoMykKKyNkZWZpbmUgUlRJVF9DVExfUFdSX0VWVF9FTgkJQklUKDQpCisjZGVmaW5lIFJUSVRfQ1RMX0ZVUF9PTl9QVFcJCUJJVCg1KQogI2RlZmluZSBSVElUX0NUTF9DUjNFTgkJCUJJVCg3KQogI2RlZmluZSBSVElUX0NUTF9UT1BBCQkJQklUKDgpCiAjZGVmaW5lIFJUSVRfQ1RMX01UQ19FTgkJCUJJVCg5KQogI2RlZmluZSBSVElUX0NUTF9UU0NfRU4JCQlCSVQoMTApCiAjZGVmaW5lIFJUSVRfQ1RMX0RJU1JFVEMJCUJJVCgxMSkKKyNkZWZpbmUgUlRJVF9DVExfUFRXX0VOCQkJQklUKDEyKQogI2RlZmluZSBSVElUX0NUTF9CUkFOQ0hfRU4JCUJJVCgxMykKICNkZWZpbmUgUlRJVF9DVExfTVRDX1JBTkdFX09GRlNFVAkxNAogI2RlZmluZSBSVElUX0NUTF9NVENfUkFOR0UJCSgweDBmdWxsIDw8IFJUSVRfQ1RMX01UQ19SQU5HRV9PRkZTRVQpCkBAIC05MSw2ICs5NCw4IEBACiAJUFRfQ0FQX3BzYl9jeWMsCiAJUFRfQ0FQX2lwX2ZpbHRlcmluZywKIAlQVF9DQVBfbXRjLAorCVBUX0NBUF9wdHdyaXRlLAorCVBUX0NBUF9wb3dlcl9ldmVudF90cmFjZSwKIAlQVF9DQVBfdG9wYV9vdXRwdXQsCiAJUFRfQ0FQX3RvcGFfbXVsdGlwbGVfZW50cmllcywKIAlQVF9DQVBfc2luZ2xlX3JhbmdlX291dHB1dCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9yYXBsLmMgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvcmFwbC5jCmluZGV4IDI4ODY1OTMuLmIwZjBlODMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9yYXBsLmMKKysrIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL3JhcGwuYwpAQCAtMzU3LDYgKzM1Nyw4IEBACiAJaWYgKGV2ZW50LT5jcHUgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWV2ZW50LT5ldmVudF9jYXBzIHw9IFBFUkZfRVZfQ0FQX1JFQURfQUNUSVZFX1BLRzsKKwogCS8qCiAJICogY2hlY2sgZXZlbnQgaXMga25vd24gKGRldGVybWluZXMgY291bnRlcikKIAkgKi8KQEAgLTc2NSw2ICs3NjcsOCBAQAogCVg4Nl9SQVBMX01PREVMX01BVENIKElOVEVMX0ZBTTZfU0tZTEFLRV9NT0JJTEUsICBza2xfcmFwbF9pbml0KSwKIAlYODZfUkFQTF9NT0RFTF9NQVRDSChJTlRFTF9GQU02X1NLWUxBS0VfREVTS1RPUCwgc2tsX3JhcGxfaW5pdCksCiAJWDg2X1JBUExfTU9ERUxfTUFUQ0goSU5URUxfRkFNNl9TS1lMQUtFX1gsCSBoc3hfcmFwbF9pbml0KSwKKworCVg4Nl9SQVBMX01PREVMX01BVENIKElOVEVMX0ZBTTZfQVRPTV9HT0xETU9OVCwgaHN3X3JhcGxfaW5pdCksCiAJe30sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlLmMgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlLmMKaW5kZXggNDYzZGM3YS4uZDk4NDRjYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZS5jCisrKyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC91bmNvcmUuYwpAQCAtNjY0LDYgKzY2NCw4IEBACiAJZXZlbnQtPmNwdSA9IGJveC0+Y3B1OwogCWV2ZW50LT5wbXVfcHJpdmF0ZSA9IGJveDsKIAorCWV2ZW50LT5ldmVudF9jYXBzIHw9IFBFUkZfRVZfQ0FQX1JFQURfQUNUSVZFX1BLRzsKKwogCWV2ZW50LT5ody5pZHggPSAtMTsKIAlldmVudC0+aHcubGFzdF90YWcgPSB+MFVMTDsKIAlldmVudC0+aHcuZXh0cmFfcmVnLmlkeCA9IEVYVFJBX1JFR19OT05FOwpAQCAtNjgzLDcgKzY4NSw4IEBACiAJCS8qIGZpeGVkIGNvdW50ZXJzIGhhdmUgZXZlbnQgZmllbGQgaGFyZGNvZGVkIHRvIHplcm8gKi8KIAkJaHdjLT5jb25maWcgPSAwVUxMOwogCX0gZWxzZSB7Ci0JCWh3Yy0+Y29uZmlnID0gZXZlbnQtPmF0dHIuY29uZmlnICYgcG11LT50eXBlLT5ldmVudF9tYXNrOworCQlod2MtPmNvbmZpZyA9IGV2ZW50LT5hdHRyLmNvbmZpZyAmCisJCQkgICAgICAocG11LT50eXBlLT5ldmVudF9tYXNrIHwgKCh1NjQpcG11LT50eXBlLT5ldmVudF9tYXNrX2V4dCA8PCAzMikpOwogCQlpZiAocG11LT50eXBlLT5vcHMtPmh3X2NvbmZpZykgewogCQkJcmV0ID0gcG11LT50eXBlLT5vcHMtPmh3X2NvbmZpZyhib3gsIGV2ZW50KTsKIAkJCWlmIChyZXQpCkBAIC0xMzIxLDYgKzEzMjQsMTEgQEAKIAkucGNpX2luaXQgPSBza2xfdW5jb3JlX3BjaV9pbml0LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF91bmNvcmVfaW5pdF9mdW4gc2t4X3VuY29yZV9pbml0IF9faW5pdGNvbnN0ID0geworCS5jcHVfaW5pdCA9IHNreF91bmNvcmVfY3B1X2luaXQsCisJLnBjaV9pbml0ID0gc2t4X3VuY29yZV9wY2lfaW5pdCwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeDg2X2NwdV9pZCBpbnRlbF91bmNvcmVfbWF0Y2hbXSBfX2luaXRjb25zdCA9IHsKIAlYODZfVU5DT1JFX01PREVMX01BVENIKElOVEVMX0ZBTTZfTkVIQUxFTV9FUCwJICBuaG1fdW5jb3JlX2luaXQpLAogCVg4Nl9VTkNPUkVfTU9ERUxfTUFUQ0goSU5URUxfRkFNNl9ORUhBTEVNLAkgIG5obV91bmNvcmVfaW5pdCksCkBAIC0xMzQzLDYgKzEzNTEsNyBAQAogCVg4Nl9VTkNPUkVfTU9ERUxfTUFUQ0goSU5URUxfRkFNNl9YRU9OX1BISV9LTkwsCSAga25sX3VuY29yZV9pbml0KSwKIAlYODZfVU5DT1JFX01PREVMX01BVENIKElOVEVMX0ZBTTZfU0tZTEFLRV9ERVNLVE9QLHNrbF91bmNvcmVfaW5pdCksCiAJWDg2X1VOQ09SRV9NT0RFTF9NQVRDSChJTlRFTF9GQU02X1NLWUxBS0VfTU9CSUxFLCBza2xfdW5jb3JlX2luaXQpLAorCVg4Nl9VTkNPUkVfTU9ERUxfTUFUQ0goSU5URUxfRkFNNl9TS1lMQUtFX1gsICAgICAgc2t4X3VuY29yZV9pbml0KSwKIAl7fSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC91bmNvcmUuaCBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC91bmNvcmUuaAppbmRleCA3OGI5YzIzLi5hZDk4NmMxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlLmgKKysrIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZS5oCkBAIC00NCw2ICs0NCw3IEBACiAJdW5zaWduZWQgcGVyZl9jdHI7CiAJdW5zaWduZWQgZXZlbnRfY3RsOwogCXVuc2lnbmVkIGV2ZW50X21hc2s7CisJdW5zaWduZWQgZXZlbnRfbWFza19leHQ7CiAJdW5zaWduZWQgZml4ZWRfY3RyOwogCXVuc2lnbmVkIGZpeGVkX2N0bDsKIAl1bnNpZ25lZCBib3hfY3RsOwpAQCAtMTIwLDYgKzEyMSw3IEBACiB9OwogCiAjZGVmaW5lIFVOQ09SRV9CT1hfRkxBR19JTklUSUFURUQJMAorI2RlZmluZSBVTkNPUkVfQk9YX0ZMQUdfQ1RMX09GRlM4CTEgLyogZXZlbnQgY29uZmlnIHJlZ2lzdGVycyBhcmUgOC1ieXRlIGFwYXJ0ICovCiAKIHN0cnVjdCB1bmNvcmVfZXZlbnRfZGVzYyB7CiAJc3RydWN0IGtvYmpfYXR0cmlidXRlIGF0dHI7CkBAIC0xNzIsNiArMTc0LDkgQEAKIHN0YXRpYyBpbmxpbmUKIHVuc2lnbmVkIHVuY29yZV9wY2lfZXZlbnRfY3RsKHN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3gsIGludCBpZHgpCiB7CisJaWYgKHRlc3RfYml0KFVOQ09SRV9CT1hfRkxBR19DVExfT0ZGUzgsICZib3gtPmZsYWdzKSkKKwkJcmV0dXJuIGlkeCAqIDggKyBib3gtPnBtdS0+dHlwZS0+ZXZlbnRfY3RsOworCiAJcmV0dXJuIGlkeCAqIDQgKyBib3gtPnBtdS0+dHlwZS0+ZXZlbnRfY3RsOwogfQogCkBAIC0zNzcsNiArMzgyLDggQEAKIHZvaWQgYmR4X3VuY29yZV9jcHVfaW5pdCh2b2lkKTsKIGludCBrbmxfdW5jb3JlX3BjaV9pbml0KHZvaWQpOwogdm9pZCBrbmxfdW5jb3JlX2NwdV9pbml0KHZvaWQpOworaW50IHNreF91bmNvcmVfcGNpX2luaXQodm9pZCk7Cit2b2lkIHNreF91bmNvcmVfY3B1X2luaXQodm9pZCk7CiAKIC8qIHBlcmZfZXZlbnRfaW50ZWxfdW5jb3JlX25obWV4LmMgKi8KIHZvaWQgbmhtZXhfdW5jb3JlX2NwdV9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZV9zbmIuYyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC91bmNvcmVfc25iLmMKaW5kZXggOWQzNWVjMC4uNWY4NDVlZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZV9zbmIuYworKysgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlX3NuYi5jCkBAIC0zODgsNiArMzg4LDggQEAKIAlldmVudC0+Y3B1ID0gYm94LT5jcHU7CiAJZXZlbnQtPnBtdV9wcml2YXRlID0gYm94OwogCisJZXZlbnQtPmV2ZW50X2NhcHMgfD0gUEVSRl9FVl9DQVBfUkVBRF9BQ1RJVkVfUEtHOworCiAJZXZlbnQtPmh3LmlkeCA9IC0xOwogCWV2ZW50LT5ody5sYXN0X3RhZyA9IH4wVUxMOwogCWV2ZW50LT5ody5leHRyYV9yZWcuaWR4ID0gRVhUUkFfUkVHX05PTkU7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlX3NuYmVwLmMgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlX3NuYmVwLmMKaW5kZXggOGFlZTgzYi4uMjcyNDI3NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZV9zbmJlcC5jCisrKyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC91bmNvcmVfc25iZXAuYwpAQCAtMSw2ICsxLDEwIEBACiAvKiBTYW5keUJyaWRnZS1FUC9JdnlUb3duIHVuY29yZSBzdXBwb3J0ICovCiAjaW5jbHVkZSAidW5jb3JlLmgiCiAKKy8qIFNOQi1FUCBwY2kgYnVzIHRvIHNvY2tldCBtYXBwaW5nICovCisjZGVmaW5lIFNOQkVQX0NQVU5PREVJRAkJCTB4NDAKKyNkZWZpbmUgU05CRVBfR0lETklETUFQCQkJMHg1NAorCiAvKiBTTkItRVAgQm94IGxldmVsIGNvbnRyb2wgKi8KICNkZWZpbmUgU05CRVBfUE1PTl9CT1hfQ1RMX1JTVF9DVFJMCSgxIDw8IDApCiAjZGVmaW5lIFNOQkVQX1BNT05fQk9YX0NUTF9SU1RfQ1RSUwkoMSA8PCAxKQpAQCAtMjY0LDE1ICsyNjgsNzIgQEAKIAkJCQkgU05CRVBfUENVX01TUl9QTU9OX0NUTF9PQ0NfSU5WRVJUIHwgXAogCQkJCSBTTkJFUF9QQ1VfTVNSX1BNT05fQ1RMX09DQ19FREdFX0RFVCkKIAorLyogU0tYIHBjaSBidXMgdG8gc29ja2V0IG1hcHBpbmcgKi8KKyNkZWZpbmUgU0tYX0NQVU5PREVJRAkJCTB4YzAKKyNkZWZpbmUgU0tYX0dJRE5JRE1BUAkJCTB4ZDQKKworLyogU0tYIENIQSAqLworI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfVElECQkoMHgxZmZVTEwgPDwgMCkKKyNkZWZpbmUgU0tYX0NIQV9NU1JfUE1PTl9CT1hfRklMVEVSX0xJTksJKDB4ZlVMTCA8PCA5KQorI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfU1RBVEUJKDB4M2ZmVUxMIDw8IDE3KQorI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfUkVNCQkoMHgxVUxMIDw8IDMyKQorI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfTE9DCQkoMHgxVUxMIDw8IDMzKQorI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfQUxMX09QQwkoMHgxVUxMIDw8IDM1KQorI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfTk0JCSgweDFVTEwgPDwgMzYpCisjZGVmaW5lIFNLWF9DSEFfTVNSX1BNT05fQk9YX0ZJTFRFUl9OT1RfTk0JKDB4MVVMTCA8PCAzNykKKyNkZWZpbmUgU0tYX0NIQV9NU1JfUE1PTl9CT1hfRklMVEVSX09QQzAJKDB4M2ZmVUxMIDw8IDQxKQorI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfT1BDMQkoMHgzZmZVTEwgPDwgNTEpCisjZGVmaW5lIFNLWF9DSEFfTVNSX1BNT05fQk9YX0ZJTFRFUl9DNgkJKDB4MVVMTCA8PCA2MSkKKyNkZWZpbmUgU0tYX0NIQV9NU1JfUE1PTl9CT1hfRklMVEVSX05DCQkoMHgxVUxMIDw8IDYyKQorI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfSVNPQwkoMHgxVUxMIDw8IDYzKQorCisvKiBTS1ggSUlPICovCisjZGVmaW5lIFNLWF9JSU8wX01TUl9QTU9OX0NUTDAJCTB4YTQ4CisjZGVmaW5lIFNLWF9JSU8wX01TUl9QTU9OX0NUUjAJCTB4YTQxCisjZGVmaW5lIFNLWF9JSU8wX01TUl9QTU9OX0JPWF9DVEwJMHhhNDAKKyNkZWZpbmUgU0tYX0lJT19NU1JfT0ZGU0VUCQkweDIwCisKKyNkZWZpbmUgU0tYX1BNT05fQ1RMX1RSRVNIX01BU0sJCSgweGZmIDw8IDI0KQorI2RlZmluZSBTS1hfUE1PTl9DVExfVFJFU0hfTUFTS19FWFQJKDB4ZikKKyNkZWZpbmUgU0tYX1BNT05fQ1RMX0NIX01BU0sJCSgweGZmIDw8IDQpCisjZGVmaW5lIFNLWF9QTU9OX0NUTF9GQ19NQVNLCQkoMHg3IDw8IDEyKQorI2RlZmluZSBTS1hfSUlPX1BNT05fUkFXX0VWRU5UX01BU0sJKFNOQkVQX1BNT05fQ1RMX0VWX1NFTF9NQVNLIHwgXAorCQkJCQkgU05CRVBfUE1PTl9DVExfVU1BU0tfTUFTSyB8IFwKKwkJCQkJIFNOQkVQX1BNT05fQ1RMX0VER0VfREVUIHwgXAorCQkJCQkgU05CRVBfUE1PTl9DVExfSU5WRVJUIHwgXAorCQkJCQkgU0tYX1BNT05fQ1RMX1RSRVNIX01BU0spCisjZGVmaW5lIFNLWF9JSU9fUE1PTl9SQVdfRVZFTlRfTUFTS19FWFQJKFNLWF9QTU9OX0NUTF9UUkVTSF9NQVNLX0VYVCB8IFwKKwkJCQkJIFNLWF9QTU9OX0NUTF9DSF9NQVNLIHwgXAorCQkJCQkgU0tYX1BNT05fQ1RMX0ZDX01BU0spCisKKy8qIFNLWCBJUlAgKi8KKyNkZWZpbmUgU0tYX0lSUDBfTVNSX1BNT05fQ1RMMAkJMHhhNWIKKyNkZWZpbmUgU0tYX0lSUDBfTVNSX1BNT05fQ1RSMAkJMHhhNTkKKyNkZWZpbmUgU0tYX0lSUDBfTVNSX1BNT05fQk9YX0NUTAkweGE1OAorI2RlZmluZSBTS1hfSVJQX01TUl9PRkZTRVQJCTB4MjAKKworLyogU0tYIFVQSSAqLworI2RlZmluZSBTS1hfVVBJX1BDSV9QTU9OX0NUTDAJCTB4MzUwCisjZGVmaW5lIFNLWF9VUElfUENJX1BNT05fQ1RSMAkJMHgzMTgKKyNkZWZpbmUgU0tYX1VQSV9QQ0lfUE1PTl9CT1hfQ1RMCTB4Mzc4CisjZGVmaW5lIFNLWF9QTU9OX0NUTF9VTUFTS19FWFQJCTB4ZmYKKworLyogU0tYIE0yTSAqLworI2RlZmluZSBTS1hfTTJNX1BDSV9QTU9OX0NUTDAJCTB4MjI4CisjZGVmaW5lIFNLWF9NMk1fUENJX1BNT05fQ1RSMAkJMHgyMDAKKyNkZWZpbmUgU0tYX00yTV9QQ0lfUE1PTl9CT1hfQ1RMCTB4MjU4CisKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZXZlbnQsIGV2ZW50LCAiY29uZmlnOjAtNyIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihldmVudDIsIGV2ZW50LCAiY29uZmlnOjAtNiIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihldmVudF9leHQsIGV2ZW50LCAiY29uZmlnOjAtNywyMSIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUih1c2Vfb2NjX2N0ciwgdXNlX29jY19jdHIsICJjb25maWc6NyIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUih1bWFzaywgdW1hc2ssICJjb25maWc6OC0xNSIpOworREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUih1bWFza19leHQsIHVtYXNrLCAiY29uZmlnOjgtMTUsMzItMzkiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIocW9yLCBxb3IsICJjb25maWc6MTYiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZWRnZSwgZWRnZSwgImNvbmZpZzoxOCIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUih0aWRfZW4sIHRpZF9lbiwgImNvbmZpZzoxOSIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihpbnYsIGludiwgImNvbmZpZzoyMyIpOworREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUih0aHJlc2g5LCB0aHJlc2gsICJjb25maWc6MjQtMzUiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIodGhyZXNoOCwgdGhyZXNoLCAiY29uZmlnOjI0LTMxIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKHRocmVzaDYsIHRocmVzaCwgImNvbmZpZzoyNC0yOSIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUih0aHJlc2g1LCB0aHJlc2gsICJjb25maWc6MjQtMjgiKTsKQEAgLTI4MCw2ICszNDEsOCBAQAogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihvY2NfaW52ZXJ0LCBvY2NfaW52ZXJ0LCAiY29uZmlnOjMwIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKG9jY19lZGdlLCBvY2NfZWRnZSwgImNvbmZpZzoxNC01MSIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihvY2NfZWRnZV9kZXQsIG9jY19lZGdlX2RldCwgImNvbmZpZzozMSIpOworREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihjaF9tYXNrLCBjaF9tYXNrLCAiY29uZmlnOjM2LTQzIik7CitERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZjX21hc2ssIGZjX21hc2ssICJjb25maWc6NDQtNDYiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX3RpZCwgZmlsdGVyX3RpZCwgImNvbmZpZzE6MC00Iik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl90aWQyLCBmaWx0ZXJfdGlkLCAiY29uZmlnMTowIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl90aWQzLCBmaWx0ZXJfdGlkLCAiY29uZmlnMTowLTUiKTsKQEAgLTI4OCwxOCArMzUxLDI2IEBACiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9saW5rLCBmaWx0ZXJfbGluaywgImNvbmZpZzE6NS04Iik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9saW5rMiwgZmlsdGVyX2xpbmssICJjb25maWcxOjYtOCIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfbGluazMsIGZpbHRlcl9saW5rLCAiY29uZmlnMToxMiIpOworREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfbGluazQsIGZpbHRlcl9saW5rLCAiY29uZmlnMTo5LTEyIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9uaWQsIGZpbHRlcl9uaWQsICJjb25maWcxOjEwLTE3Iik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9uaWQyLCBmaWx0ZXJfbmlkLCAiY29uZmlnMTozMi00NyIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfc3RhdGUsIGZpbHRlcl9zdGF0ZSwgImNvbmZpZzE6MTgtMjIiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX3N0YXRlMiwgZmlsdGVyX3N0YXRlLCAiY29uZmlnMToxNy0yMiIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfc3RhdGUzLCBmaWx0ZXJfc3RhdGUsICJjb25maWcxOjE3LTIzIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9zdGF0ZTQsIGZpbHRlcl9zdGF0ZSwgImNvbmZpZzE6MTgtMjAiKTsKK0RFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX3N0YXRlNSwgZmlsdGVyX3N0YXRlLCAiY29uZmlnMToxNy0yNiIpOworREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfcmVtLCBmaWx0ZXJfcmVtLCAiY29uZmlnMTozMiIpOworREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfbG9jLCBmaWx0ZXJfbG9jLCAiY29uZmlnMTozMyIpOworREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfbm0sIGZpbHRlcl9ubSwgImNvbmZpZzE6MzYiKTsKK0RFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX25vdF9ubSwgZmlsdGVyX25vdF9ubSwgImNvbmZpZzE6MzciKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX2xvY2FsLCBmaWx0ZXJfbG9jYWwsICJjb25maWcxOjMzIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9hbGxfb3AsIGZpbHRlcl9hbGxfb3AsICJjb25maWcxOjM1Iik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9ubm0sIGZpbHRlcl9ubm0sICJjb25maWcxOjM3Iik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9vcGMsIGZpbHRlcl9vcGMsICJjb25maWcxOjIzLTMxIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9vcGMyLCBmaWx0ZXJfb3BjLCAiY29uZmlnMTo1Mi02MCIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfb3BjMywgZmlsdGVyX29wYywgImNvbmZpZzE6NDEtNjAiKTsKK0RFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX29wY18wLCBmaWx0ZXJfb3BjMCwgImNvbmZpZzE6NDEtNTAiKTsKK0RFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX29wY18xLCBmaWx0ZXJfb3BjMSwgImNvbmZpZzE6NTEtNjAiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX25jLCBmaWx0ZXJfbmMsICJjb25maWcxOjYyIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9jNiwgZmlsdGVyX2M2LCAiY29uZmlnMTo2MSIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfaXNvYywgZmlsdGVyX2lzb2MsICJjb25maWcxOjYzIik7CkBAIC0xMTUzLDcgKzEyMjQsNyBAQAogLyoKICAqIGJ1aWxkIHBjaSBidXMgdG8gc29ja2V0IG1hcHBpbmcKICAqLwotc3RhdGljIGludCBzbmJlcF9wY2kycGh5X21hcF9pbml0KGludCBkZXZpZCkKK3N0YXRpYyBpbnQgc25iZXBfcGNpMnBoeV9tYXBfaW5pdChpbnQgZGV2aWQsIGludCBub2RlaWRfbG9jLCBpbnQgaWRtYXBfbG9jLCBib29sIHJldmVyc2UpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnVib3hfZGV2ID0gTlVMTDsKIAlpbnQgaSwgYnVzLCBub2RlaWQsIHNlZ21lbnQ7CkBAIC0xMTY4LDEyICsxMjM5LDEyIEBACiAJCQlicmVhazsKIAkJYnVzID0gdWJveF9kZXYtPmJ1cy0+bnVtYmVyOwogCQkvKiBnZXQgdGhlIE5vZGUgSUQgb2YgdGhlIGxvY2FsIHJlZ2lzdGVyICovCi0JCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZCh1Ym94X2RldiwgMHg0MCwgJmNvbmZpZyk7CisJCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZCh1Ym94X2Rldiwgbm9kZWlkX2xvYywgJmNvbmZpZyk7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKIAkJbm9kZWlkID0gY29uZmlnOwogCQkvKiBnZXQgdGhlIE5vZGUgSUQgbWFwcGluZyAqLwotCQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQodWJveF9kZXYsIDB4NTQsICZjb25maWcpOworCQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQodWJveF9kZXYsIGlkbWFwX2xvYywgJmNvbmZpZyk7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKIApAQCAtMTIwNywxMSArMTI3OCwyMCBAQAogCQlyYXdfc3Bpbl9sb2NrKCZwY2kycGh5X21hcF9sb2NrKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShtYXAsICZwY2kycGh5X21hcF9oZWFkLCBsaXN0KSB7CiAJCQlpID0gLTE7Ci0JCQlmb3IgKGJ1cyA9IDI1NTsgYnVzID49IDA7IGJ1cy0tKSB7Ci0JCQkJaWYgKG1hcC0+cGJ1c190b19waHlzaWRbYnVzXSA+PSAwKQotCQkJCQlpID0gbWFwLT5wYnVzX3RvX3BoeXNpZFtidXNdOwotCQkJCWVsc2UKLQkJCQkJbWFwLT5wYnVzX3RvX3BoeXNpZFtidXNdID0gaTsKKwkJCWlmIChyZXZlcnNlKSB7CisJCQkJZm9yIChidXMgPSAyNTU7IGJ1cyA+PSAwOyBidXMtLSkgeworCQkJCQlpZiAobWFwLT5wYnVzX3RvX3BoeXNpZFtidXNdID49IDApCisJCQkJCQlpID0gbWFwLT5wYnVzX3RvX3BoeXNpZFtidXNdOworCQkJCQllbHNlCisJCQkJCQltYXAtPnBidXNfdG9fcGh5c2lkW2J1c10gPSBpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZm9yIChidXMgPSAwOyBidXMgPD0gMjU1OyBidXMrKykgeworCQkJCQlpZiAobWFwLT5wYnVzX3RvX3BoeXNpZFtidXNdID49IDApCisJCQkJCQlpID0gbWFwLT5wYnVzX3RvX3BoeXNpZFtidXNdOworCQkJCQllbHNlCisJCQkJCQltYXAtPnBidXNfdG9fcGh5c2lkW2J1c10gPSBpOworCQkJCX0KIAkJCX0KIAkJfQogCQlyYXdfc3Bpbl91bmxvY2soJnBjaTJwaHlfbWFwX2xvY2spOwpAQCAtMTIyNCw3ICsxMzA0LDcgQEAKIAogaW50IHNuYmVwX3VuY29yZV9wY2lfaW5pdCh2b2lkKQogewotCWludCByZXQgPSBzbmJlcF9wY2kycGh5X21hcF9pbml0KDB4M2NlMCk7CisJaW50IHJldCA9IHNuYmVwX3BjaTJwaHlfbWFwX2luaXQoMHgzY2UwLCBTTkJFUF9DUFVOT0RFSUQsIFNOQkVQX0dJRE5JRE1BUCwgdHJ1ZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAl1bmNvcmVfcGNpX3VuY29yZXMgPSBzbmJlcF9wY2lfdW5jb3JlczsKQEAgLTE3ODgsNyArMTg2OCw3IEBACiAKIGludCBpdmJlcF91bmNvcmVfcGNpX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0ID0gc25iZXBfcGNpMnBoeV9tYXBfaW5pdCgweDBlMWUpOworCWludCByZXQgPSBzbmJlcF9wY2kycGh5X21hcF9pbml0KDB4MGUxZSwgU05CRVBfQ1BVTk9ERUlELCBTTkJFUF9HSUROSURNQVAsIHRydWUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJdW5jb3JlX3BjaV91bmNvcmVzID0gaXZiZXBfcGNpX3VuY29yZXM7CkBAIC0yODk3LDcgKzI5NzcsNyBAQAogCiBpbnQgaHN3ZXBfdW5jb3JlX3BjaV9pbml0KHZvaWQpCiB7Ci0JaW50IHJldCA9IHNuYmVwX3BjaTJwaHlfbWFwX2luaXQoMHgyZjFlKTsKKwlpbnQgcmV0ID0gc25iZXBfcGNpMnBoeV9tYXBfaW5pdCgweDJmMWUsIFNOQkVQX0NQVU5PREVJRCwgU05CRVBfR0lETklETUFQLCB0cnVlKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCXVuY29yZV9wY2lfdW5jb3JlcyA9IGhzd2VwX3BjaV91bmNvcmVzOwpAQCAtMzE4Niw3ICszMjY2LDcgQEAKIAogaW50IGJkeF91bmNvcmVfcGNpX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0ID0gc25iZXBfcGNpMnBoeV9tYXBfaW5pdCgweDZmMWUpOworCWludCByZXQgPSBzbmJlcF9wY2kycGh5X21hcF9pbml0KDB4NmYxZSwgU05CRVBfQ1BVTk9ERUlELCBTTkJFUF9HSUROSURNQVAsIHRydWUpOwogCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTMxOTYsMyArMzI3Niw1MjUgQEAKIH0KIAogLyogZW5kIG9mIEJEWCB1bmNvcmUgc3VwcG9ydCAqLworCisvKiBTS1ggdW5jb3JlIHN1cHBvcnQgKi8KKworc3RhdGljIHN0cnVjdCBpbnRlbF91bmNvcmVfdHlwZSBza3hfdW5jb3JlX3Vib3ggPSB7CisJLm5hbWUJCQk9ICJ1Ym94IiwKKwkubnVtX2NvdW50ZXJzCQk9IDIsCisJLm51bV9ib3hlcwkJPSAxLAorCS5wZXJmX2N0cl9iaXRzCQk9IDQ4LAorCS5maXhlZF9jdHJfYml0cwkJPSA0OCwKKwkucGVyZl9jdHIJCT0gSFNXRVBfVV9NU1JfUE1PTl9DVFIwLAorCS5ldmVudF9jdGwJCT0gSFNXRVBfVV9NU1JfUE1PTl9DVEwwLAorCS5ldmVudF9tYXNrCQk9IFNOQkVQX1VfTVNSX1BNT05fUkFXX0VWRU5UX01BU0ssCisJLmZpeGVkX2N0cgkJPSBIU1dFUF9VX01TUl9QTU9OX1VDTEtfRklYRURfQ1RSLAorCS5maXhlZF9jdGwJCT0gSFNXRVBfVV9NU1JfUE1PTl9VQ0xLX0ZJWEVEX0NUTCwKKwkub3BzCQkJPSAmaXZiZXBfdW5jb3JlX21zcl9vcHMsCisJLmZvcm1hdF9ncm91cAkJPSAmaXZiZXBfdW5jb3JlX3Vib3hfZm9ybWF0X2dyb3VwLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnNreF91bmNvcmVfY2hhX2Zvcm1hdHNfYXR0cltdID0geworCSZmb3JtYXRfYXR0cl9ldmVudC5hdHRyLAorCSZmb3JtYXRfYXR0cl91bWFzay5hdHRyLAorCSZmb3JtYXRfYXR0cl9lZGdlLmF0dHIsCisJJmZvcm1hdF9hdHRyX3RpZF9lbi5hdHRyLAorCSZmb3JtYXRfYXR0cl9pbnYuYXR0ciwKKwkmZm9ybWF0X2F0dHJfdGhyZXNoOC5hdHRyLAorCSZmb3JtYXRfYXR0cl9maWx0ZXJfdGlkNC5hdHRyLAorCSZmb3JtYXRfYXR0cl9maWx0ZXJfbGluazQuYXR0ciwKKwkmZm9ybWF0X2F0dHJfZmlsdGVyX3N0YXRlNS5hdHRyLAorCSZmb3JtYXRfYXR0cl9maWx0ZXJfcmVtLmF0dHIsCisJJmZvcm1hdF9hdHRyX2ZpbHRlcl9sb2MuYXR0ciwKKwkmZm9ybWF0X2F0dHJfZmlsdGVyX25tLmF0dHIsCisJJmZvcm1hdF9hdHRyX2ZpbHRlcl9hbGxfb3AuYXR0ciwKKwkmZm9ybWF0X2F0dHJfZmlsdGVyX25vdF9ubS5hdHRyLAorCSZmb3JtYXRfYXR0cl9maWx0ZXJfb3BjXzAuYXR0ciwKKwkmZm9ybWF0X2F0dHJfZmlsdGVyX29wY18xLmF0dHIsCisJJmZvcm1hdF9hdHRyX2ZpbHRlcl9uYy5hdHRyLAorCSZmb3JtYXRfYXR0cl9maWx0ZXJfYzYuYXR0ciwKKwkmZm9ybWF0X2F0dHJfZmlsdGVyX2lzb2MuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgc2t4X3VuY29yZV9jaGFib3hfZm9ybWF0X2dyb3VwID0geworCS5uYW1lID0gImZvcm1hdCIsCisJLmF0dHJzID0gc2t4X3VuY29yZV9jaGFfZm9ybWF0c19hdHRyLAorfTsKKworc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50IHNreF91bmNvcmVfY2hhYm94X2NvbnN0cmFpbnRzW10gPSB7CisJVU5DT1JFX0VWRU5UX0NPTlNUUkFJTlQoMHgxMSwgMHgxKSwKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweDM2LCAweDEpLAorCUVWRU5UX0NPTlNUUkFJTlRfRU5ECit9OworCitzdGF0aWMgc3RydWN0IGV4dHJhX3JlZyBza3hfdW5jb3JlX2NoYV9leHRyYV9yZWdzW10gPSB7CisJU05CRVBfQ0JPX0VWRU5UX0VYVFJBX1JFRygweDAzMzQsIDB4ZmZmZiwgMHg0KSwKKwlTTkJFUF9DQk9fRVZFTlRfRVhUUkFfUkVHKDB4MDUzNCwgMHhmZmZmLCAweDQpLAorCVNOQkVQX0NCT19FVkVOVF9FWFRSQV9SRUcoMHgwOTM0LCAweGZmZmYsIDB4NCksCisJU05CRVBfQ0JPX0VWRU5UX0VYVFJBX1JFRygweDExMzQsIDB4ZmZmZiwgMHg0KSwKKwlTTkJFUF9DQk9fRVZFTlRfRVhUUkFfUkVHKDB4MjEzNCwgMHhmZmZmLCAweDQpLAorCVNOQkVQX0NCT19FVkVOVF9FWFRSQV9SRUcoMHg4MTM0LCAweGZmZmYsIDB4NCksCit9OworCitzdGF0aWMgdTY0IHNreF9jaGFfZmlsdGVyX21hc2soaW50IGZpZWxkcykKK3sKKwl1NjQgbWFzayA9IDA7CisKKwlpZiAoZmllbGRzICYgMHgxKQorCQltYXNrIHw9IFNLWF9DSEFfTVNSX1BNT05fQk9YX0ZJTFRFUl9USUQ7CisJaWYgKGZpZWxkcyAmIDB4MikKKwkJbWFzayB8PSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfTElOSzsKKwlpZiAoZmllbGRzICYgMHg0KQorCQltYXNrIHw9IFNLWF9DSEFfTVNSX1BNT05fQk9YX0ZJTFRFUl9TVEFURTsKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50ICoKK3NreF9jaGFfZ2V0X2NvbnN0cmFpbnQoc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCwgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXJldHVybiBfX3NuYmVwX2Nib3hfZ2V0X2NvbnN0cmFpbnQoYm94LCBldmVudCwgc2t4X2NoYV9maWx0ZXJfbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgc2t4X2NoYV9od19jb25maWcoc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCwgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBod19wZXJmX2V2ZW50X2V4dHJhICpyZWcxID0gJmV2ZW50LT5ody5leHRyYV9yZWc7CisJc3RydWN0IGV4dHJhX3JlZyAqZXI7CisJaW50IGlkeCA9IDA7CisKKwlmb3IgKGVyID0gc2t4X3VuY29yZV9jaGFfZXh0cmFfcmVnczsgZXItPm1zcjsgZXIrKykgeworCQlpZiAoZXItPmV2ZW50ICE9IChldmVudC0+aHcuY29uZmlnICYgZXItPmNvbmZpZ19tYXNrKSkKKwkJCWNvbnRpbnVlOworCQlpZHggfD0gZXItPmlkeDsKKwl9CisKKwlpZiAoaWR4KSB7CisJCXJlZzEtPnJlZyA9IEhTV0VQX0MwX01TUl9QTU9OX0JPWF9GSUxURVIwICsKKwkJCSAgICBIU1dFUF9DQk9fTVNSX09GRlNFVCAqIGJveC0+cG11LT5wbXVfaWR4OworCQlyZWcxLT5jb25maWcgPSBldmVudC0+YXR0ci5jb25maWcxICYgc2t4X2NoYV9maWx0ZXJfbWFzayhpZHgpOworCQlyZWcxLT5pZHggPSBpZHg7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV9vcHMgc2t4X3VuY29yZV9jaGFib3hfb3BzID0geworCS8qIFRoZXJlIGlzIG5vIGZyel9lbiBmb3IgY2hhYm94IGN0bCAqLworCS5pbml0X2JveAkJPSBpdmJlcF91bmNvcmVfbXNyX2luaXRfYm94LAorCS5kaXNhYmxlX2JveAkJPSBzbmJlcF91bmNvcmVfbXNyX2Rpc2FibGVfYm94LAorCS5lbmFibGVfYm94CQk9IHNuYmVwX3VuY29yZV9tc3JfZW5hYmxlX2JveCwKKwkuZGlzYWJsZV9ldmVudAkJPSBzbmJlcF91bmNvcmVfbXNyX2Rpc2FibGVfZXZlbnQsCisJLmVuYWJsZV9ldmVudAkJPSBoc3dlcF9jYm94X2VuYWJsZV9ldmVudCwKKwkucmVhZF9jb3VudGVyCQk9IHVuY29yZV9tc3JfcmVhZF9jb3VudGVyLAorCS5od19jb25maWcJCT0gc2t4X2NoYV9od19jb25maWcsCisJLmdldF9jb25zdHJhaW50CQk9IHNreF9jaGFfZ2V0X2NvbnN0cmFpbnQsCisJLnB1dF9jb25zdHJhaW50CQk9IHNuYmVwX2Nib3hfcHV0X2NvbnN0cmFpbnQsCit9OworCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV90eXBlIHNreF91bmNvcmVfY2hhYm94ID0geworCS5uYW1lCQkJPSAiY2hhIiwKKwkubnVtX2NvdW50ZXJzCQk9IDQsCisJLnBlcmZfY3RyX2JpdHMJCT0gNDgsCisJLmV2ZW50X2N0bAkJPSBIU1dFUF9DMF9NU1JfUE1PTl9DVEwwLAorCS5wZXJmX2N0cgkJPSBIU1dFUF9DMF9NU1JfUE1PTl9DVFIwLAorCS5ldmVudF9tYXNrCQk9IEhTV0VQX1NfTVNSX1BNT05fUkFXX0VWRU5UX01BU0ssCisJLmJveF9jdGwJCT0gSFNXRVBfQzBfTVNSX1BNT05fQk9YX0NUTCwKKwkubXNyX29mZnNldAkJPSBIU1dFUF9DQk9fTVNSX09GRlNFVCwKKwkubnVtX3NoYXJlZF9yZWdzCT0gMSwKKwkuY29uc3RyYWludHMJCT0gc2t4X3VuY29yZV9jaGFib3hfY29uc3RyYWludHMsCisJLm9wcwkJCT0gJnNreF91bmNvcmVfY2hhYm94X29wcywKKwkuZm9ybWF0X2dyb3VwCQk9ICZza3hfdW5jb3JlX2NoYWJveF9mb3JtYXRfZ3JvdXAsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc2t4X3VuY29yZV9paW9fZm9ybWF0c19hdHRyW10gPSB7CisJJmZvcm1hdF9hdHRyX2V2ZW50LmF0dHIsCisJJmZvcm1hdF9hdHRyX3VtYXNrLmF0dHIsCisJJmZvcm1hdF9hdHRyX2VkZ2UuYXR0ciwKKwkmZm9ybWF0X2F0dHJfaW52LmF0dHIsCisJJmZvcm1hdF9hdHRyX3RocmVzaDkuYXR0ciwKKwkmZm9ybWF0X2F0dHJfY2hfbWFzay5hdHRyLAorCSZmb3JtYXRfYXR0cl9mY19tYXNrLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNreF91bmNvcmVfaWlvX2Zvcm1hdF9ncm91cCA9IHsKKwkubmFtZSA9ICJmb3JtYXQiLAorCS5hdHRycyA9IHNreF91bmNvcmVfaWlvX2Zvcm1hdHNfYXR0ciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCBza3hfdW5jb3JlX2lpb19jb25zdHJhaW50c1tdID0geworCVVOQ09SRV9FVkVOVF9DT05TVFJBSU5UKDB4ODMsIDB4MyksCisJVU5DT1JFX0VWRU5UX0NPTlNUUkFJTlQoMHg4OCwgMHhjKSwKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweDk1LCAweGMpLAorCVVOQ09SRV9FVkVOVF9DT05TVFJBSU5UKDB4YzAsIDB4YyksCisJVU5DT1JFX0VWRU5UX0NPTlNUUkFJTlQoMHhjNSwgMHhjKSwKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweGQ0LCAweGMpLAorCUVWRU5UX0NPTlNUUkFJTlRfRU5ECit9OworCitzdGF0aWMgdm9pZCBza3hfaWlvX2VuYWJsZV9ldmVudChzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94LAorCQkJCSBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CisKKwl3cm1zcmwoaHdjLT5jb25maWdfYmFzZSwgaHdjLT5jb25maWcgfCBTTkJFUF9QTU9OX0NUTF9FTik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX29wcyBza3hfdW5jb3JlX2lpb19vcHMgPSB7CisJLmluaXRfYm94CQk9IGl2YmVwX3VuY29yZV9tc3JfaW5pdF9ib3gsCisJLmRpc2FibGVfYm94CQk9IHNuYmVwX3VuY29yZV9tc3JfZGlzYWJsZV9ib3gsCisJLmVuYWJsZV9ib3gJCT0gc25iZXBfdW5jb3JlX21zcl9lbmFibGVfYm94LAorCS5kaXNhYmxlX2V2ZW50CQk9IHNuYmVwX3VuY29yZV9tc3JfZGlzYWJsZV9ldmVudCwKKwkuZW5hYmxlX2V2ZW50CQk9IHNreF9paW9fZW5hYmxlX2V2ZW50LAorCS5yZWFkX2NvdW50ZXIJCT0gdW5jb3JlX21zcl9yZWFkX2NvdW50ZXIsCit9OworCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV90eXBlIHNreF91bmNvcmVfaWlvID0geworCS5uYW1lCQkJPSAiaWlvIiwKKwkubnVtX2NvdW50ZXJzCQk9IDQsCisJLm51bV9ib3hlcwkJPSA1LAorCS5wZXJmX2N0cl9iaXRzCQk9IDQ4LAorCS5ldmVudF9jdGwJCT0gU0tYX0lJTzBfTVNSX1BNT05fQ1RMMCwKKwkucGVyZl9jdHIJCT0gU0tYX0lJTzBfTVNSX1BNT05fQ1RSMCwKKwkuZXZlbnRfbWFzawkJPSBTS1hfSUlPX1BNT05fUkFXX0VWRU5UX01BU0ssCisJLmV2ZW50X21hc2tfZXh0CQk9IFNLWF9JSU9fUE1PTl9SQVdfRVZFTlRfTUFTS19FWFQsCisJLmJveF9jdGwJCT0gU0tYX0lJTzBfTVNSX1BNT05fQk9YX0NUTCwKKwkubXNyX29mZnNldAkJPSBTS1hfSUlPX01TUl9PRkZTRVQsCisJLmNvbnN0cmFpbnRzCQk9IHNreF91bmNvcmVfaWlvX2NvbnN0cmFpbnRzLAorCS5vcHMJCQk9ICZza3hfdW5jb3JlX2lpb19vcHMsCisJLmZvcm1hdF9ncm91cAkJPSAmc2t4X3VuY29yZV9paW9fZm9ybWF0X2dyb3VwLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnNreF91bmNvcmVfZm9ybWF0c19hdHRyW10gPSB7CisJJmZvcm1hdF9hdHRyX2V2ZW50LmF0dHIsCisJJmZvcm1hdF9hdHRyX3VtYXNrLmF0dHIsCisJJmZvcm1hdF9hdHRyX2VkZ2UuYXR0ciwKKwkmZm9ybWF0X2F0dHJfaW52LmF0dHIsCisJJmZvcm1hdF9hdHRyX3RocmVzaDguYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgc2t4X3VuY29yZV9mb3JtYXRfZ3JvdXAgPSB7CisJLm5hbWUgPSAiZm9ybWF0IiwKKwkuYXR0cnMgPSBza3hfdW5jb3JlX2Zvcm1hdHNfYXR0ciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3R5cGUgc2t4X3VuY29yZV9pcnAgPSB7CisJLm5hbWUJCQk9ICJpcnAiLAorCS5udW1fY291bnRlcnMJCT0gMiwKKwkubnVtX2JveGVzCQk9IDUsCisJLnBlcmZfY3RyX2JpdHMJCT0gNDgsCisJLmV2ZW50X2N0bAkJPSBTS1hfSVJQMF9NU1JfUE1PTl9DVEwwLAorCS5wZXJmX2N0cgkJPSBTS1hfSVJQMF9NU1JfUE1PTl9DVFIwLAorCS5ldmVudF9tYXNrCQk9IFNOQkVQX1BNT05fUkFXX0VWRU5UX01BU0ssCisJLmJveF9jdGwJCT0gU0tYX0lSUDBfTVNSX1BNT05fQk9YX0NUTCwKKwkubXNyX29mZnNldAkJPSBTS1hfSVJQX01TUl9PRkZTRVQsCisJLm9wcwkJCT0gJnNreF91bmNvcmVfaWlvX29wcywKKwkuZm9ybWF0X2dyb3VwCQk9ICZza3hfdW5jb3JlX2Zvcm1hdF9ncm91cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX29wcyBza3hfdW5jb3JlX3BjdV9vcHMgPSB7CisJSVZCRVBfVU5DT1JFX01TUl9PUFNfQ09NTU9OX0lOSVQoKSwKKwkuaHdfY29uZmlnCQk9IGhzd2VwX3BjdV9od19jb25maWcsCisJLmdldF9jb25zdHJhaW50CQk9IHNuYmVwX3BjdV9nZXRfY29uc3RyYWludCwKKwkucHV0X2NvbnN0cmFpbnQJCT0gc25iZXBfcGN1X3B1dF9jb25zdHJhaW50LAorfTsKKworc3RhdGljIHN0cnVjdCBpbnRlbF91bmNvcmVfdHlwZSBza3hfdW5jb3JlX3BjdSA9IHsKKwkubmFtZQkJCT0gInBjdSIsCisJLm51bV9jb3VudGVycwkJPSA0LAorCS5udW1fYm94ZXMJCT0gMSwKKwkucGVyZl9jdHJfYml0cwkJPSA0OCwKKwkucGVyZl9jdHIJCT0gSFNXRVBfUENVX01TUl9QTU9OX0NUUjAsCisJLmV2ZW50X2N0bAkJPSBIU1dFUF9QQ1VfTVNSX1BNT05fQ1RMMCwKKwkuZXZlbnRfbWFzawkJPSBTTkJFUF9QQ1VfTVNSX1BNT05fUkFXX0VWRU5UX01BU0ssCisJLmJveF9jdGwJCT0gSFNXRVBfUENVX01TUl9QTU9OX0JPWF9DVEwsCisJLm51bV9zaGFyZWRfcmVncwk9IDEsCisJLm9wcwkJCT0gJnNreF91bmNvcmVfcGN1X29wcywKKwkuZm9ybWF0X2dyb3VwCQk9ICZzbmJlcF91bmNvcmVfcGN1X2Zvcm1hdF9ncm91cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3R5cGUgKnNreF9tc3JfdW5jb3Jlc1tdID0geworCSZza3hfdW5jb3JlX3Vib3gsCisJJnNreF91bmNvcmVfY2hhYm94LAorCSZza3hfdW5jb3JlX2lpbywKKwkmc2t4X3VuY29yZV9pcnAsCisJJnNreF91bmNvcmVfcGN1LAorCU5VTEwsCit9OworCitzdGF0aWMgaW50IHNreF9jb3VudF9jaGFib3godm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqY2hhYm94X2RldiA9IE5VTEw7CisJaW50IGJ1cywgY291bnQgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJY2hhYm94X2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA4ZCwgY2hhYm94X2Rldik7CisJCWlmICghY2hhYm94X2RldikKKwkJCWJyZWFrOworCQlpZiAoY291bnQgPT0gMCkKKwkJCWJ1cyA9IGNoYWJveF9kZXYtPmJ1cy0+bnVtYmVyOworCQlpZiAoYnVzICE9IGNoYWJveF9kZXYtPmJ1cy0+bnVtYmVyKQorCQkJYnJlYWs7CisJCWNvdW50Kys7CisJfQorCisJcGNpX2Rldl9wdXQoY2hhYm94X2Rldik7CisJcmV0dXJuIGNvdW50OworfQorCit2b2lkIHNreF91bmNvcmVfY3B1X2luaXQodm9pZCkKK3sKKwlza3hfdW5jb3JlX2NoYWJveC5udW1fYm94ZXMgPSBza3hfY291bnRfY2hhYm94KCk7CisJdW5jb3JlX21zcl91bmNvcmVzID0gc2t4X21zcl91bmNvcmVzOworfQorCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV90eXBlIHNreF91bmNvcmVfaW1jID0geworCS5uYW1lCQk9ICJpbWMiLAorCS5udW1fY291bnRlcnMgICA9IDQsCisJLm51bV9ib3hlcwk9IDYsCisJLnBlcmZfY3RyX2JpdHMJPSA0OCwKKwkuZml4ZWRfY3RyX2JpdHMJPSA0OCwKKwkuZml4ZWRfY3RyCT0gU05CRVBfTUNfQ0h5X1BDSV9QTU9OX0ZJWEVEX0NUUiwKKwkuZml4ZWRfY3RsCT0gU05CRVBfTUNfQ0h5X1BDSV9QTU9OX0ZJWEVEX0NUTCwKKwkuZXZlbnRfZGVzY3MJPSBoc3dlcF91bmNvcmVfaW1jX2V2ZW50cywKKwkucGVyZl9jdHIJPSBTTkJFUF9QQ0lfUE1PTl9DVFIwLAorCS5ldmVudF9jdGwJPSBTTkJFUF9QQ0lfUE1PTl9DVEwwLAorCS5ldmVudF9tYXNrCT0gU05CRVBfUE1PTl9SQVdfRVZFTlRfTUFTSywKKwkuYm94X2N0bAk9IFNOQkVQX1BDSV9QTU9OX0JPWF9DVEwsCisJLm9wcwkJPSAmaXZiZXBfdW5jb3JlX3BjaV9vcHMsCisJLmZvcm1hdF9ncm91cAk9ICZza3hfdW5jb3JlX2Zvcm1hdF9ncm91cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpza3hfdXBpX3VuY29yZV9mb3JtYXRzX2F0dHJbXSA9IHsKKwkmZm9ybWF0X2F0dHJfZXZlbnRfZXh0LmF0dHIsCisJJmZvcm1hdF9hdHRyX3VtYXNrX2V4dC5hdHRyLAorCSZmb3JtYXRfYXR0cl9lZGdlLmF0dHIsCisJJmZvcm1hdF9hdHRyX2ludi5hdHRyLAorCSZmb3JtYXRfYXR0cl90aHJlc2g4LmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNreF91cGlfdW5jb3JlX2Zvcm1hdF9ncm91cCA9IHsKKwkubmFtZSA9ICJmb3JtYXQiLAorCS5hdHRycyA9IHNreF91cGlfdW5jb3JlX2Zvcm1hdHNfYXR0ciwKK307CisKK3N0YXRpYyB2b2lkIHNreF91cGlfdW5jb3JlX3BjaV9pbml0X2JveChzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYm94LT5wY2lfZGV2OworCisJX19zZXRfYml0KFVOQ09SRV9CT1hfRkxBR19DVExfT0ZGUzgsICZib3gtPmZsYWdzKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFNLWF9VUElfUENJX1BNT05fQk9YX0NUTCwgSVZCRVBfUE1PTl9CT1hfQ1RMX0lOVCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX29wcyBza3hfdXBpX3VuY29yZV9wY2lfb3BzID0geworCS5pbml0X2JveAk9IHNreF91cGlfdW5jb3JlX3BjaV9pbml0X2JveCwKKwkuZGlzYWJsZV9ib3gJPSBzbmJlcF91bmNvcmVfcGNpX2Rpc2FibGVfYm94LAorCS5lbmFibGVfYm94CT0gc25iZXBfdW5jb3JlX3BjaV9lbmFibGVfYm94LAorCS5kaXNhYmxlX2V2ZW50CT0gc25iZXBfdW5jb3JlX3BjaV9kaXNhYmxlX2V2ZW50LAorCS5lbmFibGVfZXZlbnQJPSBzbmJlcF91bmNvcmVfcGNpX2VuYWJsZV9ldmVudCwKKwkucmVhZF9jb3VudGVyCT0gc25iZXBfdW5jb3JlX3BjaV9yZWFkX2NvdW50ZXIsCit9OworCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV90eXBlIHNreF91bmNvcmVfdXBpID0geworCS5uYW1lCQk9ICJ1cGkiLAorCS5udW1fY291bnRlcnMgICA9IDQsCisJLm51bV9ib3hlcwk9IDMsCisJLnBlcmZfY3RyX2JpdHMJPSA0OCwKKwkucGVyZl9jdHIJPSBTS1hfVVBJX1BDSV9QTU9OX0NUUjAsCisJLmV2ZW50X2N0bAk9IFNLWF9VUElfUENJX1BNT05fQ1RMMCwKKwkuZXZlbnRfbWFzawk9IFNOQkVQX1FQSV9QQ0lfUE1PTl9SQVdfRVZFTlRfTUFTSywKKwkuZXZlbnRfbWFza19leHQgPSBTS1hfUE1PTl9DVExfVU1BU0tfRVhULAorCS5ib3hfY3RsCT0gU0tYX1VQSV9QQ0lfUE1PTl9CT1hfQ1RMLAorCS5vcHMJCT0gJnNreF91cGlfdW5jb3JlX3BjaV9vcHMsCisJLmZvcm1hdF9ncm91cAk9ICZza3hfdXBpX3VuY29yZV9mb3JtYXRfZ3JvdXAsCit9OworCitzdGF0aWMgdm9pZCBza3hfbTJtX3VuY29yZV9wY2lfaW5pdF9ib3goc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGJveC0+cGNpX2RldjsKKworCV9fc2V0X2JpdChVTkNPUkVfQk9YX0ZMQUdfQ1RMX09GRlM4LCAmYm94LT5mbGFncyk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBTS1hfTTJNX1BDSV9QTU9OX0JPWF9DVEwsIElWQkVQX1BNT05fQk9YX0NUTF9JTlQpOworfQorCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV9vcHMgc2t4X20ybV91bmNvcmVfcGNpX29wcyA9IHsKKwkuaW5pdF9ib3gJPSBza3hfbTJtX3VuY29yZV9wY2lfaW5pdF9ib3gsCisJLmRpc2FibGVfYm94CT0gc25iZXBfdW5jb3JlX3BjaV9kaXNhYmxlX2JveCwKKwkuZW5hYmxlX2JveAk9IHNuYmVwX3VuY29yZV9wY2lfZW5hYmxlX2JveCwKKwkuZGlzYWJsZV9ldmVudAk9IHNuYmVwX3VuY29yZV9wY2lfZGlzYWJsZV9ldmVudCwKKwkuZW5hYmxlX2V2ZW50CT0gc25iZXBfdW5jb3JlX3BjaV9lbmFibGVfZXZlbnQsCisJLnJlYWRfY291bnRlcgk9IHNuYmVwX3VuY29yZV9wY2lfcmVhZF9jb3VudGVyLAorfTsKKworc3RhdGljIHN0cnVjdCBpbnRlbF91bmNvcmVfdHlwZSBza3hfdW5jb3JlX20ybSA9IHsKKwkubmFtZQkJPSAibTJtIiwKKwkubnVtX2NvdW50ZXJzICAgPSA0LAorCS5udW1fYm94ZXMJPSAyLAorCS5wZXJmX2N0cl9iaXRzCT0gNDgsCisJLnBlcmZfY3RyCT0gU0tYX00yTV9QQ0lfUE1PTl9DVFIwLAorCS5ldmVudF9jdGwJPSBTS1hfTTJNX1BDSV9QTU9OX0NUTDAsCisJLmV2ZW50X21hc2sJPSBTTkJFUF9QTU9OX1JBV19FVkVOVF9NQVNLLAorCS5ib3hfY3RsCT0gU0tYX00yTV9QQ0lfUE1PTl9CT1hfQ1RMLAorCS5vcHMJCT0gJnNreF9tMm1fdW5jb3JlX3BjaV9vcHMsCisJLmZvcm1hdF9ncm91cAk9ICZza3hfdW5jb3JlX2Zvcm1hdF9ncm91cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCBza3hfdW5jb3JlX20ycGNpZV9jb25zdHJhaW50c1tdID0geworCVVOQ09SRV9FVkVOVF9DT05TVFJBSU5UKDB4MjMsIDB4MyksCisJRVZFTlRfQ09OU1RSQUlOVF9FTkQKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3R5cGUgc2t4X3VuY29yZV9tMnBjaWUgPSB7CisJLm5hbWUJCT0gIm0ycGNpZSIsCisJLm51bV9jb3VudGVycyAgID0gNCwKKwkubnVtX2JveGVzCT0gNCwKKwkucGVyZl9jdHJfYml0cwk9IDQ4LAorCS5jb25zdHJhaW50cwk9IHNreF91bmNvcmVfbTJwY2llX2NvbnN0cmFpbnRzLAorCS5wZXJmX2N0cgk9IFNOQkVQX1BDSV9QTU9OX0NUUjAsCisJLmV2ZW50X2N0bAk9IFNOQkVQX1BDSV9QTU9OX0NUTDAsCisJLmV2ZW50X21hc2sJPSBTTkJFUF9QTU9OX1JBV19FVkVOVF9NQVNLLAorCS5ib3hfY3RsCT0gU05CRVBfUENJX1BNT05fQk9YX0NUTCwKKwkub3BzCQk9ICZpdmJlcF91bmNvcmVfcGNpX29wcywKKwkuZm9ybWF0X2dyb3VwCT0gJnNreF91bmNvcmVfZm9ybWF0X2dyb3VwLAorfTsKKworc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50IHNreF91bmNvcmVfbTN1cGlfY29uc3RyYWludHNbXSA9IHsKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweDFkLCAweDEpLAorCVVOQ09SRV9FVkVOVF9DT05TVFJBSU5UKDB4MWUsIDB4MSksCisJVU5DT1JFX0VWRU5UX0NPTlNUUkFJTlQoMHg0MCwgMHg3KSwKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweDRlLCAweDcpLAorCVVOQ09SRV9FVkVOVF9DT05TVFJBSU5UKDB4NGYsIDB4NyksCisJVU5DT1JFX0VWRU5UX0NPTlNUUkFJTlQoMHg1MCwgMHg3KSwKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweDUxLCAweDcpLAorCVVOQ09SRV9FVkVOVF9DT05TVFJBSU5UKDB4NTIsIDB4NyksCisJRVZFTlRfQ09OU1RSQUlOVF9FTkQKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3R5cGUgc2t4X3VuY29yZV9tM3VwaSA9IHsKKwkubmFtZQkJPSAibTN1cGkiLAorCS5udW1fY291bnRlcnMgICA9IDMsCisJLm51bV9ib3hlcwk9IDMsCisJLnBlcmZfY3RyX2JpdHMJPSA0OCwKKwkuY29uc3RyYWludHMJPSBza3hfdW5jb3JlX20zdXBpX2NvbnN0cmFpbnRzLAorCS5wZXJmX2N0cgk9IFNOQkVQX1BDSV9QTU9OX0NUUjAsCisJLmV2ZW50X2N0bAk9IFNOQkVQX1BDSV9QTU9OX0NUTDAsCisJLmV2ZW50X21hc2sJPSBTTkJFUF9QTU9OX1JBV19FVkVOVF9NQVNLLAorCS5ib3hfY3RsCT0gU05CRVBfUENJX1BNT05fQk9YX0NUTCwKKwkub3BzCQk9ICZpdmJlcF91bmNvcmVfcGNpX29wcywKKwkuZm9ybWF0X2dyb3VwCT0gJnNreF91bmNvcmVfZm9ybWF0X2dyb3VwLAorfTsKKworZW51bSB7CisJU0tYX1BDSV9VTkNPUkVfSU1DLAorCVNLWF9QQ0lfVU5DT1JFX00yTSwKKwlTS1hfUENJX1VOQ09SRV9VUEksCisJU0tYX1BDSV9VTkNPUkVfTTJQQ0lFLAorCVNLWF9QQ0lfVU5DT1JFX00zVVBJLAorfTsKKworc3RhdGljIHN0cnVjdCBpbnRlbF91bmNvcmVfdHlwZSAqc2t4X3BjaV91bmNvcmVzW10gPSB7CisJW1NLWF9QQ0lfVU5DT1JFX0lNQ10JPSAmc2t4X3VuY29yZV9pbWMsCisJW1NLWF9QQ0lfVU5DT1JFX00yTV0JPSAmc2t4X3VuY29yZV9tMm0sCisJW1NLWF9QQ0lfVU5DT1JFX1VQSV0JPSAmc2t4X3VuY29yZV91cGksCisJW1NLWF9QQ0lfVU5DT1JFX00yUENJRV0JPSAmc2t4X3VuY29yZV9tMnBjaWUsCisJW1NLWF9QQ0lfVU5DT1JFX00zVVBJXQk9ICZza3hfdW5jb3JlX20zdXBpLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2t4X3VuY29yZV9wY2lfaWRzW10gPSB7CisJeyAvKiBNQzAgQ2hhbm5lbCAwICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDQyKSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDEwLCAyLCBTS1hfUENJX1VOQ09SRV9JTUMsIDApLAorCX0sCisJeyAvKiBNQzAgQ2hhbm5lbCAxICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDQ2KSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDEwLCA2LCBTS1hfUENJX1VOQ09SRV9JTUMsIDEpLAorCX0sCisJeyAvKiBNQzAgQ2hhbm5lbCAyICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDRhKSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDExLCAyLCBTS1hfUENJX1VOQ09SRV9JTUMsIDIpLAorCX0sCisJeyAvKiBNQzEgQ2hhbm5lbCAwICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDQyKSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDEyLCAyLCBTS1hfUENJX1VOQ09SRV9JTUMsIDMpLAorCX0sCisJeyAvKiBNQzEgQ2hhbm5lbCAxICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDQ2KSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDEyLCA2LCBTS1hfUENJX1VOQ09SRV9JTUMsIDQpLAorCX0sCisJeyAvKiBNQzEgQ2hhbm5lbCAyICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDRhKSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDEzLCAyLCBTS1hfUENJX1VOQ09SRV9JTUMsIDUpLAorCX0sCisJeyAvKiBNMk0wICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDY2KSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDgsIDAsIFNLWF9QQ0lfVU5DT1JFX00yTSwgMCksCisJfSwKKwl7IC8qIE0yTTEgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwNjYpLAorCQkuZHJpdmVyX2RhdGEgPSBVTkNPUkVfUENJX0RFVl9GVUxMX0RBVEEoOSwgMCwgU0tYX1BDSV9VTkNPUkVfTTJNLCAxKSwKKwl9LAorCXsgLyogVVBJMCBMaW5rIDAgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwNTgpLAorCQkuZHJpdmVyX2RhdGEgPSBVTkNPUkVfUENJX0RFVl9GVUxMX0RBVEEoMTQsIDAsIFNLWF9QQ0lfVU5DT1JFX1VQSSwgMCksCisJfSwKKwl7IC8qIFVQSTAgTGluayAxICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDU4KSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDE1LCAwLCBTS1hfUENJX1VOQ09SRV9VUEksIDEpLAorCX0sCisJeyAvKiBVUEkxIExpbmsgMiAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA1OCksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0ZVTExfREFUQSgxNiwgMCwgU0tYX1BDSV9VTkNPUkVfVVBJLCAyKSwKKwl9LAorCXsgLyogTTJQQ0llIDAgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwODgpLAorCQkuZHJpdmVyX2RhdGEgPSBVTkNPUkVfUENJX0RFVl9GVUxMX0RBVEEoMjEsIDEsIFNLWF9QQ0lfVU5DT1JFX00yUENJRSwgMCksCisJfSwKKwl7IC8qIE0yUENJZSAxICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDg4KSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDIyLCAxLCBTS1hfUENJX1VOQ09SRV9NMlBDSUUsIDEpLAorCX0sCisJeyAvKiBNMlBDSWUgMiAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA4OCksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0ZVTExfREFUQSgyMywgMSwgU0tYX1BDSV9VTkNPUkVfTTJQQ0lFLCAyKSwKKwl9LAorCXsgLyogTTJQQ0llIDMgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwODgpLAorCQkuZHJpdmVyX2RhdGEgPSBVTkNPUkVfUENJX0RFVl9GVUxMX0RBVEEoMjEsIDUsIFNLWF9QQ0lfVU5DT1JFX00yUENJRSwgMyksCisJfSwKKwl7IC8qIE0zVVBJMCBMaW5rIDAgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwNEMpLAorCQkuZHJpdmVyX2RhdGEgPSBVTkNPUkVfUENJX0RFVl9GVUxMX0RBVEEoMTgsIDAsIFNLWF9QQ0lfVU5DT1JFX00zVVBJLCAwKSwKKwl9LAorCXsgLyogTTNVUEkwIExpbmsgMSAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA0RCksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0ZVTExfREFUQSgxOCwgMSwgU0tYX1BDSV9VTkNPUkVfTTNVUEksIDEpLAorCX0sCisJeyAvKiBNM1VQSTEgTGluayAyICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDRDKSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDE4LCA0LCBTS1hfUENJX1VOQ09SRV9NM1VQSSwgMiksCisJfSwKKwl7IC8qIGVuZDogYWxsIHplcm9lcyAqLyB9Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBza3hfdW5jb3JlX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInNreF91bmNvcmUiLAorCS5pZF90YWJsZQk9IHNreF91bmNvcmVfcGNpX2lkcywKK307CisKK2ludCBza3hfdW5jb3JlX3BjaV9pbml0KHZvaWQpCit7CisJLyogbmVlZCB0byBkb3VibGUgY2hlY2sgcGNpIGFkZHJlc3MgKi8KKwlpbnQgcmV0ID0gc25iZXBfcGNpMnBoeV9tYXBfaW5pdCgweDIwMTQsIFNLWF9DUFVOT0RFSUQsIFNLWF9HSUROSURNQVAsIGZhbHNlKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl1bmNvcmVfcGNpX3VuY29yZXMgPSBza3hfcGNpX3VuY29yZXM7CisJdW5jb3JlX3BjaV9kcml2ZXIgPSAmc2t4X3VuY29yZV9wY2lfZHJpdmVyOworCXJldHVybiAwOworfQorCisvKiBlbmQgb2YgU0tYIHVuY29yZSBzdXBwb3J0ICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ldmVudHMvcGVyZl9ldmVudC5oIGIvYXJjaC94ODYvZXZlbnRzL3BlcmZfZXZlbnQuaAppbmRleCA4YzRhNDc3Li41ODc0ZDhkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ldmVudHMvcGVyZl9ldmVudC5oCisrKyBiL2FyY2gveDg2L2V2ZW50cy9wZXJmX2V2ZW50LmgKQEAgLTE5NCwxMiArMTk0LDEzIEBACiAJICovCiAJc3RydWN0IGRlYnVnX3N0b3JlCSpkczsKIAl1NjQJCQlwZWJzX2VuYWJsZWQ7CisJaW50CQkJbl9wZWJzOworCWludAkJCW5fbGFyZ2VfcGViczsKIAogCS8qCiAJICogSW50ZWwgTEJSIGJpdHMKIAkgKi8KIAlpbnQJCQkJbGJyX3VzZXJzOwotCXZvaWQJCQkJKmxicl9jb250ZXh0OwogCXN0cnVjdCBwZXJmX2JyYW5jaF9zdGFjawlsYnJfc3RhY2s7CiAJc3RydWN0IHBlcmZfYnJhbmNoX2VudHJ5CWxicl9lbnRyaWVzW01BWF9MQlJfRU5UUklFU107CiAJc3RydWN0IGVyX2FjY291bnQJCSpsYnJfc2VsOwpAQCAtNTA4LDYgKzUwOSw4IEBACiAJdm9pZAkJKCplbmFibGVfYWxsKShpbnQgYWRkZWQpOwogCXZvaWQJCSgqZW5hYmxlKShzdHJ1Y3QgcGVyZl9ldmVudCAqKTsKIAl2b2lkCQkoKmRpc2FibGUpKHN0cnVjdCBwZXJmX2V2ZW50ICopOworCXZvaWQJCSgqYWRkKShzdHJ1Y3QgcGVyZl9ldmVudCAqKTsKKwl2b2lkCQkoKmRlbCkoc3RydWN0IHBlcmZfZXZlbnQgKik7CiAJaW50CQkoKmh3X2NvbmZpZykoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKIAlpbnQJCSgqc2NoZWR1bGVfZXZlbnRzKShzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YywgaW50IG4sIGludCAqYXNzaWduKTsKIAl1bnNpZ25lZAlldmVudHNlbDsKQEAgLTg4OCw2ICs4OTEsMTAgQEAKIAogc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgKmludGVsX3BlYnNfY29uc3RyYWludHMoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKIAordm9pZCBpbnRlbF9wbXVfcGVic19hZGQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKKwordm9pZCBpbnRlbF9wbXVfcGVic19kZWwoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKKwogdm9pZCBpbnRlbF9wbXVfcGVic19lbmFibGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKIAogdm9pZCBpbnRlbF9wbXVfcGVic19kaXNhYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CkBAIC05MDYsOSArOTEzLDkgQEAKIAogdm9pZCBpbnRlbF9wbXVfbGJyX3Jlc2V0KHZvaWQpOwogCi12b2lkIGludGVsX3BtdV9sYnJfZW5hYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7Cit2b2lkIGludGVsX3BtdV9sYnJfYWRkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CiAKLXZvaWQgaW50ZWxfcG11X2xicl9kaXNhYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7Cit2b2lkIGludGVsX3BtdV9sYnJfZGVsKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CiAKIHZvaWQgaW50ZWxfcG11X2xicl9lbmFibGVfYWxsKGJvb2wgcG1pKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaWEzMi9pYTMyX3NpZ25hbC5jIGIvYXJjaC94ODYvaWEzMi9pYTMyX3NpZ25hbC5jCmluZGV4IDJmMjlmNGUuLmNiMTNjMDUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2lhMzIvaWEzMl9zaWduYWwuYworKysgYi9hcmNoL3g4Ni9pYTMyL2lhMzJfc2lnbmFsLmMKQEAgLTM3OCw3ICszNzgsNyBAQAogCQlwdXRfdXNlcl9leCgqKCh1NjQgKikmY29kZSksICh1NjQgX191c2VyICopZnJhbWUtPnJldGNvZGUpOwogCX0gcHV0X3VzZXJfY2F0Y2goZXJyKTsKIAotCWVyciB8PSBjb3B5X3NpZ2luZm9fdG9fdXNlcjMyKCZmcmFtZS0+aW5mbywgJmtzaWctPmluZm8pOworCWVyciB8PSBfX2NvcHlfc2lnaW5mb190b191c2VyMzIoJmZyYW1lLT5pbmZvLCAma3NpZy0+aW5mbywgZmFsc2UpOwogCWVyciB8PSBpYTMyX3NldHVwX3NpZ2NvbnRleHQoJmZyYW1lLT51Yy51Y19tY29udGV4dCwgZnBzdGF0ZSwKIAkJCQkgICAgIHJlZ3MsIHNldC0+c2lnWzBdKTsKIAllcnIgfD0gX19jb3B5X3RvX3VzZXIoJmZyYW1lLT51Yy51Y19zaWdtYXNrLCBzZXQsIHNpemVvZigqc2V0KSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUuaAppbmRleCBlNzdhNjQ0Li4xYjAyMDM4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLmgKQEAgLTIxNywxMCArMjE3LDE0IEBACiAgKi8KICNkZWZpbmUgYWx0ZXJuYXRpdmVfY2FsbF8yKG9sZGZ1bmMsIG5ld2Z1bmMxLCBmZWF0dXJlMSwgbmV3ZnVuYzIsIGZlYXR1cmUyLCAgIFwKIAkJCSAgIG91dHB1dCwgaW5wdXQuLi4pCQkJCSAgICAgIFwKK3sJCQkJCQkJCQkgICAgICBcCisJcmVnaXN0ZXIgdm9pZCAqX19zcCBhc20oX0FTTV9TUCk7CQkJCSAgICAgIFwKIAlhc20gdm9sYXRpbGUgKEFMVEVSTkFUSVZFXzIoImNhbGwgJVBbb2xkXSIsICJjYWxsICVQW25ldzFdIiwgZmVhdHVyZTEsXAogCQkiY2FsbCAlUFtuZXcyXSIsIGZlYXR1cmUyKQkJCQkgICAgICBcCi0JCTogb3V0cHV0IDogW29sZF0gImkiIChvbGRmdW5jKSwgW25ldzFdICJpIiAobmV3ZnVuYzEpLAkgICAgICBcCi0JCVtuZXcyXSAiaSIgKG5ld2Z1bmMyKSwgIyMgaW5wdXQpCisJCTogb3V0cHV0LCAiK3IiIChfX3NwKQkJCQkJICAgICAgXAorCQk6IFtvbGRdICJpIiAob2xkZnVuYyksIFtuZXcxXSAiaSIgKG5ld2Z1bmMxKSwJCSAgICAgIFwKKwkJICBbbmV3Ml0gImkiIChuZXdmdW5jMiksICMjIGlucHV0KTsJCQkgICAgICBcCit9CiAKIC8qCiAgKiB1c2UgdGhpcyBtYWNybyhzKSBpZiB5b3UgbmVlZCBtb3JlIHRoYW4gb25lIG91dHB1dCBwYXJhbWV0ZXIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWMuaAppbmRleCAxMjQzNTc3Li5mNWFhZjZjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpYy5oCkBAIC02NTAsOCArNjUwLDggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGlwaV9lbnRlcmluZ19hY2tfaXJxKHZvaWQpCiB7Ci0JYWNrX0FQSUNfaXJxKCk7CiAJaXJxX2VudGVyKCk7CisJYWNrX0FQSUNfaXJxKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBleGl0aW5nX2lycSh2b2lkKQpAQCAtNjYxLDkgKzY2MSw4IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBleGl0aW5nX2Fja19pcnEodm9pZCkKIHsKLQlpcnFfZXhpdCgpOwotCS8qIEFjayBvbmx5IGF0IHRoZSBlbmQgdG8gYXZvaWQgcG90ZW50aWFsIHJlZW50cnkgKi8KIAlhY2tfQVBJQ19pcnEoKTsKKwlpcnFfZXhpdCgpOwogfQogCiBleHRlcm4gdm9pZCBpb2FwaWNfemFwX2xvY2tzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZy5oCmluZGV4IDk3MzMzNjEuLjk3ODQ4Y2QgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGcuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnLmgKQEAgLTE1OCw1MyArMTU4LDkgQEAKICAqIHZhbHVlIG9mICIqcHRyIi4KICAqCiAgKiB4YWRkKCkgaXMgbG9ja2VkIHdoZW4gbXVsdGlwbGUgQ1BVcyBhcmUgb25saW5lCi0gKiB4YWRkX3N5bmMoKSBpcyBhbHdheXMgbG9ja2VkCi0gKiB4YWRkX2xvY2FsKCkgaXMgbmV2ZXIgbG9ja2VkCiAgKi8KICNkZWZpbmUgX194YWRkKHB0ciwgaW5jLCBsb2NrKQlfX3hjaGdfb3AoKHB0ciksIChpbmMpLCB4YWRkLCBsb2NrKQogI2RlZmluZSB4YWRkKHB0ciwgaW5jKQkJX194YWRkKChwdHIpLCAoaW5jKSwgTE9DS19QUkVGSVgpCi0jZGVmaW5lIHhhZGRfc3luYyhwdHIsIGluYykJX194YWRkKChwdHIpLCAoaW5jKSwgImxvY2s7ICIpCi0jZGVmaW5lIHhhZGRfbG9jYWwocHRyLCBpbmMpCV9feGFkZCgocHRyKSwgKGluYyksICIiKQotCi0jZGVmaW5lIF9fYWRkKHB0ciwgaW5jLCBsb2NrKQkJCQkJCVwKLQkoewkJCQkJCQkJXAotCSAgICAgICAgX190eXBlb2ZfXyAoKihwdHIpKSBfX3JldCA9IChpbmMpOwkJCVwKLQkJc3dpdGNoIChzaXplb2YoKihwdHIpKSkgewkJCQlcCi0JCWNhc2UgX19YODZfQ0FTRV9COgkJCQkJXAotCQkJYXNtIHZvbGF0aWxlIChsb2NrICJhZGRiICViMSwgJTBcbiIJCVwKLQkJCQkgICAgICA6ICIrbSIgKCoocHRyKSkgOiAicWkiIChpbmMpCVwKLQkJCQkgICAgICA6ICJtZW1vcnkiLCAiY2MiKTsJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJY2FzZSBfX1g4Nl9DQVNFX1c6CQkJCQlcCi0JCQlhc20gdm9sYXRpbGUgKGxvY2sgImFkZHcgJXcxLCAlMFxuIgkJXAotCQkJCSAgICAgIDogIittIiAoKihwdHIpKSA6ICJyaSIgKGluYykJXAotCQkJCSAgICAgIDogIm1lbW9yeSIsICJjYyIpOwkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIF9fWDg2X0NBU0VfTDoJCQkJCVwKLQkJCWFzbSB2b2xhdGlsZSAobG9jayAiYWRkbCAlMSwgJTBcbiIJCVwKLQkJCQkgICAgICA6ICIrbSIgKCoocHRyKSkgOiAicmkiIChpbmMpCVwKLQkJCQkgICAgICA6ICJtZW1vcnkiLCAiY2MiKTsJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJY2FzZSBfX1g4Nl9DQVNFX1E6CQkJCQlcCi0JCQlhc20gdm9sYXRpbGUgKGxvY2sgImFkZHEgJTEsICUwXG4iCQlcCi0JCQkJICAgICAgOiAiK20iICgqKHB0cikpIDogInJpIiAoaW5jKQlcCi0JCQkJICAgICAgOiAibWVtb3J5IiwgImNjIik7CQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWRlZmF1bHQ6CQkJCQkJXAotCQkJX19hZGRfd3Jvbmdfc2l6ZSgpOwkJCQlcCi0JCX0JCQkJCQkJXAotCQlfX3JldDsJCQkJCQkJXAotCX0pCi0KLS8qCi0gKiBhZGRfKigpIGFkZHMgImluYyIgdG8gIipwdHIiCi0gKgotICogX19hZGQoKSB0YWtlcyBhIGxvY2sgcHJlZml4Ci0gKiBhZGRfc21wKCkgaXMgbG9ja2VkIHdoZW4gbXVsdGlwbGUgQ1BVcyBhcmUgb25saW5lCi0gKiBhZGRfc3luYygpIGlzIGFsd2F5cyBsb2NrZWQKLSAqLwotI2RlZmluZSBhZGRfc21wKHB0ciwgaW5jKQlfX2FkZCgocHRyKSwgKGluYyksIExPQ0tfUFJFRklYKQotI2RlZmluZSBhZGRfc3luYyhwdHIsIGluYykJX19hZGQoKHB0ciksIChpbmMpLCAibG9jazsgIikKIAogI2RlZmluZSBfX2NtcHhjaGdfZG91YmxlKHBmeCwgcDEsIHAyLCBvMSwgbzIsIG4xLCBuMikJCQlcCiAoewkJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NvbXBhdC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY29tcGF0LmgKaW5kZXggYTE4ODA2MS4uMDNkMjY5YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY29tcGF0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY29tcGF0LmgKQEAgLTI3NSwxMCArMjc1LDEwIEBACiAjaWZkZWYgQ09ORklHX1g4Nl9YMzJfQUJJCiB0eXBlZGVmIHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0IGNvbXBhdF9lbGZfZ3JlZ3NldF90OwogCi0jZGVmaW5lIFBSX1JFR19TSVpFKFMpICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9JQTMyKSA/IDY4IDogMjE2KQotI2RlZmluZSBQUlNUQVRVU19TSVpFKFMpICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9JQTMyKSA/IDE0NCA6IDI5NikKLSNkZWZpbmUgU0VUX1BSX0ZQVkFMSUQoUyxWKSBcCi0gIGRvIHsgKihpbnQgKikgKCgodm9pZCAqKSAmKChTKS0+cHJfcmVnKSkgKyBQUl9SRUdfU0laRSgwKSkgPSAoVik7IH0gXAorLyogRnVsbCByZWdzZXQgLS0gcHJzdGF0dXMgb24geDMyLCBvdGhlcndpc2Ugb24gaWEzMiAqLworI2RlZmluZSBQUlNUQVRVU19TSVpFKFMsIFIpIChSICE9IHNpemVvZihTLnByX3JlZykgPyAxNDQgOiAyOTYpCisjZGVmaW5lIFNFVF9QUl9GUFZBTElEKFMsIFYsIFIpIFwKKyAgZG8geyAqKGludCAqKSAoKCh2b2lkICopICYoKFMpLT5wcl9yZWcpKSArIFIpID0gKFYpOyB9IFwKICAgd2hpbGUgKDApCiAKICNkZWZpbmUgQ09NUEFUX1VTRV82NEJJVF9USU1FIFwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlcy5oCmluZGV4IDkyYTgzMDguLjExODhiYzggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZXMuaApAQCAtMTA2LDcgKzEwNiw2IEBACiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0FQRVJGTVBFUkYJKCAzKjMyKzI4KSAvKiBBUEVSRk1QRVJGICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0VBR0VSX0ZQVQkoIDMqMzIrMjkpIC8qICJlYWdlcmZwdSIgTm9uIGxhenkgRlBVIHJlc3RvcmUgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfTk9OU1RPUF9UU0NfUzMgKCAzKjMyKzMwKSAvKiBUU0MgZG9lc24ndCBzdG9wIGluIFMzIHN0YXRlICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX01DRV9SRUNPVkVSWSAoIDMqMzIrMzEpIC8qIGNwdSBoYXMgcmVjb3ZlcmFibGUgbWFjaGluZSBjaGVja3MgKi8KIAogLyogSW50ZWwtZGVmaW5lZCBDUFUgZmVhdHVyZXMsIENQVUlEIGxldmVsIDB4MDAwMDAwMDEgKGVjeCksIHdvcmQgNCAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9YTU0zCSggNCozMisgMCkgLyogInBuaSIgU1NFLTMgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Rlc2MuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Rlc2MuaAppbmRleCA0ZTEwZDczLi4xMjA4MGQ4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kZXNjLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZGVzYy5oCkBAIC0zNiw3ICszNiw3IEBACiAKIGV4dGVybiBzdHJ1Y3QgZGVzY19wdHIgaWR0X2Rlc2NyOwogZXh0ZXJuIGdhdGVfZGVzYyBpZHRfdGFibGVbXTsKLWV4dGVybiBzdHJ1Y3QgZGVzY19wdHIgZGVidWdfaWR0X2Rlc2NyOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXNjX3B0ciBkZWJ1Z19pZHRfZGVzY3I7CiBleHRlcm4gZ2F0ZV9kZXNjIGRlYnVnX2lkdF90YWJsZVtdOwogCiBzdHJ1Y3QgZ2R0X3BhZ2UgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZTgyMC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZTgyMC5oCmluZGV4IDNhYjA1MzcuLjQ3NmI1NzQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2U4MjAuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lODIwLmgKQEAgLTEwLDggKzEwLDggQEAKICNpbmNsdWRlIDx1YXBpL2FzbS9lODIwLmg+CiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogLyogc2VlIGNvbW1lbnQgaW4gYXJjaC94ODYva2VybmVsL2U4MjAuYyAqLwotZXh0ZXJuIHN0cnVjdCBlODIwbWFwIGU4MjA7Ci1leHRlcm4gc3RydWN0IGU4MjBtYXAgZTgyMF9zYXZlZDsKK2V4dGVybiBzdHJ1Y3QgZTgyMG1hcCAqZTgyMDsKK2V4dGVybiBzdHJ1Y3QgZTgyMG1hcCAqZTgyMF9zYXZlZDsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX21lbV9zdGFydDsKIGV4dGVybiBpbnQgZTgyMF9hbnlfbWFwcGVkKHU2NCBzdGFydCwgdTY0IGVuZCwgdW5zaWduZWQgdHlwZSk7CkBAIC01Myw2ICs1Myw4IEBACiBleHRlcm4gdm9pZCBzZXR1cF9tZW1vcnlfbWFwKHZvaWQpOwogZXh0ZXJuIGNoYXIgKmRlZmF1bHRfbWFjaGluZV9zcGVjaWZpY19tZW1vcnlfc2V0dXAodm9pZCk7CiAKK2V4dGVybiB2b2lkIGU4MjBfcmVhbGxvY2F0ZV90YWJsZXModm9pZCk7CisKIC8qCiAgKiBSZXR1cm5zIHRydWUgaWZmIHRoZSBzcGVjaWZpZWQgcmFuZ2UgW3MsZSkgaXMgY29tcGxldGVseSBjb250YWluZWQgaW5zaWRlCiAgKiB0aGUgSVNBIHJlZ2lvbi4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VmaS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZWZpLmgKaW5kZXggZDBiYjc2ZC4uMzg5ZDcwMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZWZpLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZWZpLmgKQEAgLTExNyw3ICsxMTcsNiBAQAogZXh0ZXJuIHBnZF90ICogX19pbml0IGVmaV9jYWxsX3BoeXNfcHJvbG9nKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9jYWxsX3BoeXNfZXBpbG9nKHBnZF90ICpzYXZlX3BnZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgZWZpX3ByaW50X21lbW1hcCh2b2lkKTsKLWV4dGVybiB2b2lkIF9faW5pdCBlZmlfdW5tYXBfbWVtbWFwKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9tZW1vcnlfdWModTY0IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiBleHRlcm4gdm9pZCBfX2luaXQgZWZpX21hcF9yZWdpb24oZWZpX21lbW9yeV9kZXNjX3QgKm1kKTsKIGV4dGVybiB2b2lkIF9faW5pdCBlZmlfbWFwX3JlZ2lvbl9maXhlZChlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpOwpAQCAtMTkyLDE0ICsxOTEsNyBAQAogc3RydWN0IGVmaV9jb25maWcgewogCXU2NCBpbWFnZV9oYW5kbGU7CiAJdTY0IHRhYmxlOwotCXU2NCBhbGxvY2F0ZV9wb29sOwotCXU2NCBhbGxvY2F0ZV9wYWdlczsKLQl1NjQgZ2V0X21lbW9yeV9tYXA7Ci0JdTY0IGZyZWVfcG9vbDsKLQl1NjQgZnJlZV9wYWdlczsKLQl1NjQgbG9jYXRlX2hhbmRsZTsKLQl1NjQgaGFuZGxlX3Byb3RvY29sOwotCXU2NCBleGl0X2Jvb3Rfc2VydmljZXM7CisJdTY0IGJvb3Rfc2VydmljZXM7CiAJdTY0IHRleHRfb3V0cHV0OwogCWVmaV9zdGF0dXNfdCAoKmNhbGwpKHVuc2lnbmVkIGxvbmcsIC4uLik7CiAJYm9vbCBpczY0OwpAQCAtMjA3LDE0ICsxOTksMjcgQEAKIAogX19wdXJlIGNvbnN0IHN0cnVjdCBlZmlfY29uZmlnICpfX2VmaV9lYXJseSh2b2lkKTsKIAorc3RhdGljIGlubGluZSBib29sIGVmaV9pc182NGJpdCh2b2lkKQoreworCWlmICghSVNfRU5BQkxFRChDT05GSUdfWDg2XzY0KSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKCFJU19FTkFCTEVEKENPTkZJR19FRklfTUlYRUQpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBfX2VmaV9lYXJseSgpLT5pczY0OworfQorCiAjZGVmaW5lIGVmaV9jYWxsX2Vhcmx5KGYsIC4uLikJCQkJCQlcCi0JX19lZmlfZWFybHkoKS0+Y2FsbChfX2VmaV9lYXJseSgpLT5mLCBfX1ZBX0FSR1NfXyk7CisJX19lZmlfZWFybHkoKS0+Y2FsbChlZmlfaXNfNjRiaXQoKSA/CQkJCVwKKwkJKChlZmlfYm9vdF9zZXJ2aWNlc182NF90ICopKHVuc2lnbmVkIGxvbmcpCQlcCisJCQlfX2VmaV9lYXJseSgpLT5ib290X3NlcnZpY2VzKS0+ZiA6CQlcCisJCSgoZWZpX2Jvb3Rfc2VydmljZXNfMzJfdCAqKSh1bnNpZ25lZCBsb25nKQkJXAorCQkJX19lZmlfZWFybHkoKS0+Ym9vdF9zZXJ2aWNlcyktPmYsIF9fVkFfQVJHU19fKQogCiAjZGVmaW5lIF9fZWZpX2NhbGxfZWFybHkoZiwgLi4uKQkJCQkJXAogCV9fZWZpX2Vhcmx5KCktPmNhbGwoKHVuc2lnbmVkIGxvbmcpZiwgX19WQV9BUkdTX18pOwogCi0jZGVmaW5lIGVmaV9pc182NGJpdCgpCQlfX2VmaV9lYXJseSgpLT5pczY0Ci0KIGV4dGVybiBib29sIGVmaV9yZWJvb3RfcmVxdWlyZWQodm9pZCk7CiAKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mcHUvc2lnbmFsLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mcHUvc2lnbmFsLmgKaW5kZXggMGU5NzBkMC4uMjBhMWZiZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZnB1L3NpZ25hbC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZwdS9zaWduYWwuaApAQCAtMTksNiArMTksMTIgQEAKICMgZGVmaW5lIGlhMzJfc2V0dXBfcnRfZnJhbWUJX19zZXR1cF9ydF9mcmFtZQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitpbnQgX19jb3B5X3NpZ2luZm9fdG9fdXNlcjMyKGNvbXBhdF9zaWdpbmZvX3QgX191c2VyICp0bywKKwkJY29uc3Qgc2lnaW5mb190ICpmcm9tLCBib29sIHgzMl9BQkkpOworI2VuZGlmCisKKwogZXh0ZXJuIHZvaWQgY29udmVydF9mcm9tX2Z4c3Ioc3RydWN0IHVzZXJfaTM4N19pYTMyX3N0cnVjdCAqZW52LAogCQkJICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogZXh0ZXJuIHZvaWQgY29udmVydF90b19meHNyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZnB1L3hzdGF0ZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZnB1L3hzdGF0ZS5oCmluZGV4IGFlNTVhNDMuLmQ0OTU3YWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZwdS94c3RhdGUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mcHUveHN0YXRlLmgKQEAgLTQ1LDcgKzQ1LDggQEAKIGV4dGVybiB1NjQgeGZlYXR1cmVzX21hc2s7CiBleHRlcm4gdTY0IHhzdGF0ZV9meF9zd19ieXRlc1tVU0VSX1hTVEFURV9GWF9TV19XT1JEU107CiAKLWV4dGVybiB2b2lkIHVwZGF0ZV9yZWdzZXRfeHN0YXRlX2luZm8odW5zaWduZWQgaW50IHNpemUsIHU2NCB4c3RhdGVfbWFzayk7CitleHRlcm4gdm9pZCBfX2luaXQgdXBkYXRlX3JlZ3NldF94c3RhdGVfaW5mbyh1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCQkJICAgICB1NjQgeHN0YXRlX21hc2spOwogCiB2b2lkIGZwdV9feHN0YXRlX2NsZWFyX2FsbF9jcHVfY2Fwcyh2b2lkKTsKIHZvaWQgKmdldF94c2F2ZV9hZGRyKHN0cnVjdCB4cmVnc19zdGF0ZSAqeHNhdmUsIGludCB4c3RhdGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZnRyYWNlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mdHJhY2UuaAppbmRleCBhNDgyMGQ0Li5lY2NkMGFjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mdHJhY2UuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mdHJhY2UuaApAQCAtNiw2ICs2LDcgQEAKICMgZGVmaW5lIE1DT1VOVF9BRERSCQkoKHVuc2lnbmVkIGxvbmcpKF9fZmVudHJ5X18pKQogI2Vsc2UKICMgZGVmaW5lIE1DT1VOVF9BRERSCQkoKHVuc2lnbmVkIGxvbmcpKG1jb3VudCkpCisjIGRlZmluZSBIQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1QKICNlbmRpZgogI2RlZmluZSBNQ09VTlRfSU5TTl9TSVpFCTUgLyogc2l6ZW9mIG1jb3VudCBjYWxsICovCiAKQEAgLTEzLDYgKzE0LDggQEAKICNkZWZpbmUgQVJDSF9TVVBQT1JUU19GVFJBQ0VfT1BTIDEKICNlbmRpZgogCisjZGVmaW5lIEhBVkVfRlVOQ1RJT05fR1JBUEhfUkVUX0FERFJfUFRSCisKICNpZm5kZWYgX19BU1NFTUJMWV9fCiBleHRlcm4gdm9pZCBtY291bnQodm9pZCk7CiBleHRlcm4gYXRvbWljX3QgbW9kaWZ5aW5nX2Z0cmFjZV9jb2RlOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaHlwZXJ2aXNvci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaHlwZXJ2aXNvci5oCmluZGV4IDA1NWVhOTkuLjY3OTQyYjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h5cGVydmlzb3IuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9oeXBlcnZpc29yLmgKQEAgLTQzLDYgKzQzLDkgQEAKIAogCS8qIFgyQVBJQyBkZXRlY3Rpb24gKHJ1biBvbmNlIHBlciBib290KSAqLwogCWJvb2wJCSgqeDJhcGljX2F2YWlsYWJsZSkodm9pZCk7CisKKwkvKiBwaW4gY3VycmVudCB2Y3B1IHRvIHNwZWNpZmllZCBwaHlzaWNhbCBjcHUgKHJ1biByYXJlbHkpICovCisJdm9pZAkJKCpwaW5fdmNwdSkoaW50KTsKIH07CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaHlwZXJ2aXNvcl94ODYgKng4Nl9oeXBlcjsKQEAgLTU2LDYgKzU5LDcgQEAKIGV4dGVybiB2b2lkIGluaXRfaHlwZXJ2aXNvcihzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwogZXh0ZXJuIHZvaWQgaW5pdF9oeXBlcnZpc29yX3BsYXRmb3JtKHZvaWQpOwogZXh0ZXJuIGJvb2wgaHlwZXJ2aXNvcl94MmFwaWNfYXZhaWxhYmxlKHZvaWQpOworZXh0ZXJuIHZvaWQgaHlwZXJ2aXNvcl9waW5fdmNwdShpbnQgY3B1KTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9oeXBlcnZpc29yKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9oeXBlcnZpc29yX3BsYXRmb3JtKHZvaWQpIHsgfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWwtZmFtaWx5LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbC1mYW1pbHkuaAppbmRleCA2Mjc3MTk0Li45YWU1YWI4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbC1mYW1pbHkuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbC1mYW1pbHkuaApAQCAtNTYsOCArNTYsOCBAQAogI2RlZmluZSBJTlRFTF9GQU02X0FUT01fU0lMVkVSTU9OVDEJMHgzNyAvKiBCYXlUcmFpbC9CWVQgLyBWYWxsZXl2aWV3ICovCiAjZGVmaW5lIElOVEVMX0ZBTTZfQVRPTV9TSUxWRVJNT05UMgkweDREIC8qIEF2YXRvbi9SYW5nZWx5ICovCiAjZGVmaW5lIElOVEVMX0ZBTTZfQVRPTV9BSVJNT05UCQkweDRDIC8qIENoZXJyeVRyYWlsIC8gQnJhc3dlbGwgKi8KLSNkZWZpbmUgSU5URUxfRkFNNl9BVE9NX01FUlJJRklFTEQxCTB4NEEgLyogVGFuZ2llciAqLwotI2RlZmluZSBJTlRFTF9GQU02X0FUT01fTUVSUklGSUVMRDIJMHg1QSAvKiBBbm5pZGFsZSAqLworI2RlZmluZSBJTlRFTF9GQU02X0FUT01fTUVSUklGSUVMRAkweDRBIC8qIFRhbmdpZXIgKi8KKyNkZWZpbmUgSU5URUxfRkFNNl9BVE9NX01PT1JFRklFTEQJMHg1QSAvKiBBbm5pZGFsZSAqLwogI2RlZmluZSBJTlRFTF9GQU02X0FUT01fR09MRE1PTlQJMHg1QwogI2RlZmluZSBJTlRFTF9GQU02X0FUT01fREVOVkVSVE9OCTB4NUYgLyogR29sZG1vbnQgTWljcm9zZXJ2ZXIgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWwtbWlkLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbC1taWQuaAppbmRleCA5ZDZiMDk3Li41YjY3NTNkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbC1taWQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbC1taWQuaApAQCAtMTgsNiArMTgsOCBAQAogZXh0ZXJuIGludCBpbnRlbF9taWRfcGNpX2luaXQodm9pZCk7CiBleHRlcm4gaW50IGludGVsX21pZF9wY2lfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwY2lfcG93ZXJfdCBzdGF0ZSk7CiAKK2V4dGVybiB2b2lkIGludGVsX21pZF9wd3JfcG93ZXJfb2ZmKHZvaWQpOworCiAjZGVmaW5lIElOVEVMX01JRF9QV1JfTFNTX09GRlNFVAk0CiAjZGVmaW5lIElOVEVMX01JRF9QV1JfTFNTX1RZUEUJCSgxIDw8IDcpCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ludGVsX3NjdV9pcGMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ludGVsX3NjdV9pcGMuaAppbmRleCA5MjViNjA1Li40ZmIxZDBhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbF9zY3VfaXBjLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWxfc2N1X2lwYy5oCkBAIC0zLDYgKzMsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KIAorI2RlZmluZSBJUENNU0dfQ09MRF9PRkYJCTB4ODAJLyogT25seSBmb3IgVGFuZ2llciAqLworCiAjZGVmaW5lIElQQ01TR19XQVJNX1JFU0VUCTB4RjAKICNkZWZpbmUgSVBDTVNHX0NPTERfUkVTRVQJMHhGMQogI2RlZmluZSBJUENNU0dfU09GVF9SRVNFVAkweEYyCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rYXNsci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va2FzbHIuaAppbmRleCAyNjc0ZWUzLi4xMDUyYTc5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rYXNsci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2thc2xyLmgKQEAgLTYsNiArNiw3IEBACiAjaWZkZWYgQ09ORklHX1JBTkRPTUlaRV9NRU1PUlkKIGV4dGVybiB1bnNpZ25lZCBsb25nIHBhZ2Vfb2Zmc2V0X2Jhc2U7CiBleHRlcm4gdW5zaWduZWQgbG9uZyB2bWFsbG9jX2Jhc2U7CitleHRlcm4gdW5zaWduZWQgbG9uZyB2bWVtbWFwX2Jhc2U7CiAKIHZvaWQga2VybmVsX3JhbmRvbWl6ZV9tZW1vcnkodm9pZCk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20va2RlYnVnLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rZGVidWcuaAppbmRleCAxZWY5ZDU4Li5kMzE4ODExIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rZGVidWcuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rZGVidWcuaApAQCAtMjQsOCArMjQsNiBAQAogZXh0ZXJuIHZvaWQgcHJpbnRrX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKIGV4dGVybiB2b2lkIGRpZShjb25zdCBjaGFyICosIHN0cnVjdCBwdF9yZWdzICosbG9uZyk7CiBleHRlcm4gaW50IF9fbXVzdF9jaGVjayBfX2RpZShjb25zdCBjaGFyICosIHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOwotZXh0ZXJuIHZvaWQgc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyAqc3AsIHVuc2lnbmVkIGxvbmcgYnApOwogZXh0ZXJuIHZvaWQgc2hvd19zdGFja19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiB2b2lkIF9fc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgYWxsKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIG9vcHNfYmVnaW4odm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tY2UuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21jZS5oCmluZGV4IDhiZjc2NmUuLjliZDdmZjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21jZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21jZS5oCkBAIC00MCw5ICs0MCwxMCBAQAogI2RlZmluZSBNQ0lfU1RBVFVTX0FSCSAoMVVMTDw8NTUpICAvKiBBY3Rpb24gcmVxdWlyZWQgKi8KIAogLyogQU1ELXNwZWNpZmljIGJpdHMgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19UQ0MJCSgxVUxMPDw1NSkgIC8qIFRhc2sgY29udGV4dCBjb3JydXB0ICovCisjZGVmaW5lIE1DSV9TVEFUVVNfU1lORFYJKDFVTEw8PDUzKSAgLyogc3luZCByZWcuIHZhbGlkICovCiAjZGVmaW5lIE1DSV9TVEFUVVNfREVGRVJSRUQJKDFVTEw8PDQ0KSAgLyogdW5jb3JyZWN0ZWQgZXJyb3IsIGRlZmVycmVkIGV4Y2VwdGlvbiAqLwogI2RlZmluZSBNQ0lfU1RBVFVTX1BPSVNPTgkoMVVMTDw8NDMpICAvKiBhY2Nlc3MgcG9pc29ub3VzIGRhdGEgKi8KLSNkZWZpbmUgTUNJX1NUQVRVU19UQ0MJCSgxVUxMPDw1NSkgIC8qIFRhc2sgY29udGV4dCBjb3JydXB0ICovCiAKIC8qCiAgKiBNY2FYIGZpZWxkIGlmIHNldCBpbmRpY2F0ZXMgYSBnaXZlbiBiYW5rIHN1cHBvcnRzIE1DQSBleHRlbnNpb25zOgpAQCAtMTEwLDYgKzExMSw3IEBACiAjZGVmaW5lIE1TUl9BTUQ2NF9TTUNBX01DMF9NSVNDMAkweGMwMDAyMDAzCiAjZGVmaW5lIE1TUl9BTUQ2NF9TTUNBX01DMF9DT05GSUcJMHhjMDAwMjAwNAogI2RlZmluZSBNU1JfQU1ENjRfU01DQV9NQzBfSVBJRAkJMHhjMDAwMjAwNQorI2RlZmluZSBNU1JfQU1ENjRfU01DQV9NQzBfU1lORAkJMHhjMDAwMjAwNgogI2RlZmluZSBNU1JfQU1ENjRfU01DQV9NQzBfREVTVEFUCTB4YzAwMDIwMDgKICNkZWZpbmUgTVNSX0FNRDY0X1NNQ0FfTUMwX0RFQUREUgkweGMwMDAyMDA5CiAjZGVmaW5lIE1TUl9BTUQ2NF9TTUNBX01DMF9NSVNDMQkweGMwMDAyMDBhCkBAIC0xMTksNiArMTIxLDcgQEAKICNkZWZpbmUgTVNSX0FNRDY0X1NNQ0FfTUN4X01JU0MoeCkJKE1TUl9BTUQ2NF9TTUNBX01DMF9NSVNDMCArIDB4MTAqKHgpKQogI2RlZmluZSBNU1JfQU1ENjRfU01DQV9NQ3hfQ09ORklHKHgpCShNU1JfQU1ENjRfU01DQV9NQzBfQ09ORklHICsgMHgxMCooeCkpCiAjZGVmaW5lIE1TUl9BTUQ2NF9TTUNBX01DeF9JUElEKHgpCShNU1JfQU1ENjRfU01DQV9NQzBfSVBJRCArIDB4MTAqKHgpKQorI2RlZmluZSBNU1JfQU1ENjRfU01DQV9NQ3hfU1lORCh4KQkoTVNSX0FNRDY0X1NNQ0FfTUMwX1NZTkQgKyAweDEwKih4KSkKICNkZWZpbmUgTVNSX0FNRDY0X1NNQ0FfTUN4X0RFU1RBVCh4KQkoTVNSX0FNRDY0X1NNQ0FfTUMwX0RFU1RBVCArIDB4MTAqKHgpKQogI2RlZmluZSBNU1JfQU1ENjRfU01DQV9NQ3hfREVBRERSKHgpCShNU1JfQU1ENjRfU01DQV9NQzBfREVBRERSICsgMHgxMCooeCkpCiAjZGVmaW5lIE1TUl9BTUQ2NF9TTUNBX01DeF9NSVNDeSh4LCB5KQkoKE1TUl9BTUQ2NF9TTUNBX01DMF9NSVNDMSArIHkpICsgKDB4MTAqKHgpKSkKQEAgLTMzNCw0NCArMzM3LDQ3IEBACiAgKiBTY2FsYWJsZSBNQ0EuCiAgKi8KICNpZmRlZiBDT05GSUdfWDg2X01DRV9BTUQKLWVudW0gYW1kX2lwX3R5cGVzIHsKLQlTTUNBX0YxN0hfQ09SRSA9IDAsCS8qIENvcmUgZXJyb3JzICovCi0JU01DQV9ERiwJCS8qIERhdGEgRmFicmljICovCi0JU01DQV9VTUMsCQkvKiBVbmlmaWVkIE1lbW9yeSBDb250cm9sbGVyICovCi0JU01DQV9QQiwJCS8qIFBhcmFtZXRlciBCbG9jayAqLwotCVNNQ0FfUFNQLAkJLyogUGxhdGZvcm0gU2VjdXJpdHkgUHJvY2Vzc29yICovCi0JU01DQV9TTVUsCQkvKiBTeXN0ZW0gTWFuYWdlbWVudCBVbml0ICovCi0JTl9BTURfSVBfVFlQRVMKLX07CiAKLXN0cnVjdCBhbWRfaHdpZCB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQl1bnNpZ25lZCBpbnQgaHdpZDsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgYW1kX2h3aWQgYW1kX2h3aWRzW05fQU1EX0lQX1RZUEVTXTsKLQotZW51bSBhbWRfY29yZV9tY2FfYmxvY2tzIHsKKy8qIFRoZXNlIG1heSBiZSB1c2VkIGJ5IG11bHRpcGxlIHNtY2FfaHdpZF9tY2F0eXBlcyAqLworZW51bSBzbWNhX2JhbmtfdHlwZXMgewogCVNNQ0FfTFMgPSAwLAkvKiBMb2FkIFN0b3JlICovCiAJU01DQV9JRiwJLyogSW5zdHJ1Y3Rpb24gRmV0Y2ggKi8KLQlTTUNBX0wyX0NBQ0hFLAkvKiBMMiBjYWNoZSAqLwotCVNNQ0FfREUsCS8qIERlY29kZXIgdW5pdCAqLwotCVJFUywJCS8qIFJlc2VydmVkICovCi0JU01DQV9FWCwJLyogRXhlY3V0aW9uIHVuaXQgKi8KKwlTTUNBX0wyX0NBQ0hFLAkvKiBMMiBDYWNoZSAqLworCVNNQ0FfREUsCS8qIERlY29kZXIgVW5pdCAqLworCVNNQ0FfRVgsCS8qIEV4ZWN1dGlvbiBVbml0ICovCiAJU01DQV9GUCwJLyogRmxvYXRpbmcgUG9pbnQgKi8KLQlTTUNBX0wzX0NBQ0hFLAkvKiBMMyBjYWNoZSAqLwotCU5fQ09SRV9NQ0FfQkxPQ0tTCisJU01DQV9MM19DQUNIRSwJLyogTDMgQ2FjaGUgKi8KKwlTTUNBX0NTLAkvKiBDb2hlcmVudCBTbGF2ZSAqLworCVNNQ0FfUElFLAkvKiBQb3dlciwgSW50ZXJydXB0cywgZXRjLiAqLworCVNNQ0FfVU1DLAkvKiBVbmlmaWVkIE1lbW9yeSBDb250cm9sbGVyICovCisJU01DQV9QQiwJLyogUGFyYW1ldGVyIEJsb2NrICovCisJU01DQV9QU1AsCS8qIFBsYXRmb3JtIFNlY3VyaXR5IFByb2Nlc3NvciAqLworCVNNQ0FfU01VLAkvKiBTeXN0ZW0gTWFuYWdlbWVudCBVbml0ICovCisJTl9TTUNBX0JBTktfVFlQRVMKIH07CiAKLWV4dGVybiBjb25zdCBjaGFyICogY29uc3QgYW1kX2NvcmVfbWNhYmxvY2tfbmFtZXNbTl9DT1JFX01DQV9CTE9DS1NdOwotCi1lbnVtIGFtZF9kZl9tY2FfYmxvY2tzIHsKLQlTTUNBX0NTID0gMCwJLyogQ29oZXJlbnQgU2xhdmUgKi8KLQlTTUNBX1BJRSwJLyogUG93ZXIgbWFuYWdlbWVudCwgSW50ZXJydXB0cywgZXRjICovCi0JTl9ERl9CTE9DS1MKK3N0cnVjdCBzbWNhX2JhbmtfbmFtZSB7CisJY29uc3QgY2hhciAqbmFtZTsJLyogU2hvcnQgbmFtZSBmb3Igc3lzZnMgKi8KKwljb25zdCBjaGFyICpsb25nX25hbWU7CS8qIExvbmcgbmFtZSBmb3IgcHJldHR5LXByaW50aW5nICovCiB9OwogCi1leHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IGFtZF9kZl9tY2FibG9ja19uYW1lc1tOX0RGX0JMT0NLU107CitleHRlcm4gc3RydWN0IHNtY2FfYmFua19uYW1lIHNtY2FfYmFua19uYW1lc1tOX1NNQ0FfQkFOS19UWVBFU107CisKKyNkZWZpbmUgSFdJRF9NQ0FUWVBFKGh3aWQsIG1jYXR5cGUpICgoaHdpZCA8PCAxNikgfCBtY2F0eXBlKQorCitzdHJ1Y3Qgc21jYV9od2lkX21jYXR5cGUgeworCXVuc2lnbmVkIGludCBiYW5rX3R5cGU7CS8qIFVzZSB3aXRoIHNtY2FfYmFua190eXBlcyBmb3IgZWFzeSBpbmRleGluZy4gKi8KKwl1MzIgaHdpZF9tY2F0eXBlOwkvKiAoaHdpZCxtY2F0eXBlKSB0dXBsZSAqLworCXUzMiB4ZWNfYml0bWFwOwkJLyogQml0bWFwIG9mIHZhbGlkIEV4dEVycm9yQ29kZXM7IGN1cnJlbnQgbWF4IGlzIDIxLiAqLworfTsKKworc3RydWN0IHNtY2FfYmFua19pbmZvIHsKKwlzdHJ1Y3Qgc21jYV9od2lkX21jYXR5cGUgKnR5cGU7CisJdTMyIHR5cGVfaW5zdGFuY2U7Cit9OworCitleHRlcm4gc3RydWN0IHNtY2FfYmFua19pbmZvIHNtY2FfYmFua3NbTUFYX05SX0JBTktTXTsKKwogI2VuZGlmCiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9NQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbXBzcGVjLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tcHNwZWMuaAppbmRleCBiMDcyMzNiLi4zMjAwNzA0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tcHNwZWMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tcHNwZWMuaApAQCAtNiw3ICs2LDYgQEAKICNpbmNsdWRlIDxhc20veDg2X2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXBpY2RlZi5oPgogCi1leHRlcm4gaW50IGFwaWNfdmVyc2lvbltdOwogZXh0ZXJuIGludCBwaWNfbW9kZTsKIAogI2lmZGVmIENPTkZJR19YODZfMzIKQEAgLTQwLDYgKzM5LDcgQEAKIGV4dGVybiBERUNMQVJFX0JJVE1BUChtcF9idXNfbm90X3BjaSwgTUFYX01QX0JVU1NFUyk7CiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkOworZXh0ZXJuIHU4IGJvb3RfY3B1X2FwaWNfdmVyc2lvbjsKIGV4dGVybiB1bnNpZ25lZCBsb25nIG1wX2xhcGljX2FkZHI7CiAKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKQEAgLTg2LDYgKzg2LDcgQEAKICNlbmRpZgogCiBpbnQgZ2VuZXJpY19wcm9jZXNzb3JfaW5mbyhpbnQgYXBpY2lkLCBpbnQgdmVyc2lvbik7CitpbnQgX19nZW5lcmljX3Byb2Nlc3Nvcl9pbmZvKGludCBhcGljaWQsIGludCB2ZXJzaW9uLCBib29sIGVuYWJsZWQpOwogCiAjZGVmaW5lIFBIWVNJRF9BUlJBWV9TSVpFCUJJVFNfVE9fTE9OR1MoTUFYX0xPQ0FMX0FQSUMpCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydC5oCmluZGV4IDI5NzBkMjIuLmNlOTMyODEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnQuaApAQCAtODAsMTAgKzgwLDYgQEAKIHsKIAlyZXR1cm4gUFZPUF9DQUxMMCh1bnNpZ25lZCBsb25nLCBwdl9jcHVfb3BzLnJlYWRfY3I0KTsKIH0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3JlYWRfY3I0X3NhZmUodm9pZCkKLXsKLQlyZXR1cm4gUFZPUF9DQUxMMCh1bnNpZ25lZCBsb25nLCBwdl9jcHVfb3BzLnJlYWRfY3I0X3NhZmUpOwotfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX193cml0ZV9jcjQodW5zaWduZWQgbG9uZyB4KQogewpAQCAtNjYxLDggKzY1Nyw2IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19TTVApICYmIGRlZmluZWQoQ09ORklHX1BBUkFWSVJUX1NQSU5MT0NLUykKIAotI2lmZGVmIENPTkZJR19RVUVVRURfU1BJTkxPQ0tTCi0KIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBwdl9xdWV1ZWRfc3Bpbl9sb2NrX3Nsb3dwYXRoKHN0cnVjdCBxc3BpbmxvY2sgKmxvY2ssCiAJCQkJCQkJdTMyIHZhbCkKIHsKQEAgLTY4NCwyMiArNjc4LDYgQEAKIAlQVk9QX1ZDQUxMMShwdl9sb2NrX29wcy5raWNrLCBjcHUpOwogfQogCi0jZWxzZSAvKiAhQ09ORklHX1FVRVVFRF9TUElOTE9DS1MgKi8KLQotc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIF9fdGlja2V0X2xvY2tfc3Bpbm5pbmcoc3RydWN0IGFyY2hfc3BpbmxvY2sgKmxvY2ssCi0JCQkJCQkJX190aWNrZXRfdCB0aWNrZXQpCi17Ci0JUFZPUF9WQ0FMTEVFMihwdl9sb2NrX29wcy5sb2NrX3NwaW5uaW5nLCBsb2NrLCB0aWNrZXQpOwotfQotCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX190aWNrZXRfdW5sb2NrX2tpY2soc3RydWN0IGFyY2hfc3BpbmxvY2sgKmxvY2ssCi0JCQkJCQkJX190aWNrZXRfdCB0aWNrZXQpCi17Ci0JUFZPUF9WQ0FMTDIocHZfbG9ja19vcHMudW5sb2NrX2tpY2ssIGxvY2ssIHRpY2tldCk7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfUVVFVUVEX1NQSU5MT0NLUyAqLwotCiAjZW5kaWYgLyogU01QICYmIFBBUkFWSVJUX1NQSU5MT0NLUyAqLwogCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnRfdHlwZXMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0X3R5cGVzLmgKaW5kZXggN2ZhOWU3Ny4uMGY0MDBjMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnRfdHlwZXMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydF90eXBlcy5oCkBAIC0xMDgsNyArMTA4LDYgQEAKIAl1bnNpZ25lZCBsb25nICgqcmVhZF9jcjApKHZvaWQpOwogCXZvaWQgKCp3cml0ZV9jcjApKHVuc2lnbmVkIGxvbmcpOwogCi0JdW5zaWduZWQgbG9uZyAoKnJlYWRfY3I0X3NhZmUpKHZvaWQpOwogCXVuc2lnbmVkIGxvbmcgKCpyZWFkX2NyNCkodm9pZCk7CiAJdm9pZCAoKndyaXRlX2NyNCkodW5zaWduZWQgbG9uZyk7CiAKQEAgLTMwMSwyMyArMzAwLDE2IEBACiBzdHJ1Y3QgYXJjaF9zcGlubG9jazsKICNpZmRlZiBDT05GSUdfU01QCiAjaW5jbHVkZSA8YXNtL3NwaW5sb2NrX3R5cGVzLmg+Ci0jZWxzZQotdHlwZWRlZiB1MTYgX190aWNrZXRfdDsKICNlbmRpZgogCiBzdHJ1Y3QgcXNwaW5sb2NrOwogCiBzdHJ1Y3QgcHZfbG9ja19vcHMgewotI2lmZGVmIENPTkZJR19RVUVVRURfU1BJTkxPQ0tTCiAJdm9pZCAoKnF1ZXVlZF9zcGluX2xvY2tfc2xvd3BhdGgpKHN0cnVjdCBxc3BpbmxvY2sgKmxvY2ssIHUzMiB2YWwpOwogCXN0cnVjdCBwYXJhdmlydF9jYWxsZWVfc2F2ZSBxdWV1ZWRfc3Bpbl91bmxvY2s7CiAKIAl2b2lkICgqd2FpdCkodTggKnB0ciwgdTggdmFsKTsKIAl2b2lkICgqa2ljaykoaW50IGNwdSk7Ci0jZWxzZSAvKiAhQ09ORklHX1FVRVVFRF9TUElOTE9DS1MgKi8KLQlzdHJ1Y3QgcGFyYXZpcnRfY2FsbGVlX3NhdmUgbG9ja19zcGlubmluZzsKLQl2b2lkICgqdW5sb2NrX2tpY2spKHN0cnVjdCBhcmNoX3NwaW5sb2NrICpsb2NrLCBfX3RpY2tldF90IHRpY2tldCk7Ci0jZW5kaWYgLyogIUNPTkZJR19RVUVVRURfU1BJTkxPQ0tTICovCiB9OwogCiAvKiBUaGlzIGNvbnRhaW5zIGFsbCB0aGUgcGFyYXZpcnQgc3RydWN0dXJlczogd2UgZ2V0IGEgY29udmVuaWVudApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV82NF90eXBlcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV82NF90eXBlcy5oCmluZGV4IDZmZGVmOWUuLjNhMjY0MjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfNjRfdHlwZXMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlXzY0X3R5cGVzLmgKQEAgLTU3LDExICs1NywxMyBAQAogI2RlZmluZSBNQVhNRU0JCV9BQyhfX0FDKDEsIFVMKSA8PCBNQVhfUEhZU01FTV9CSVRTLCBVTCkKICNkZWZpbmUgVk1BTExPQ19TSVpFX1RCCV9BQygzMiwgVUwpCiAjZGVmaW5lIF9fVk1BTExPQ19CQVNFCV9BQygweGZmZmZjOTAwMDAwMDAwMDAsIFVMKQotI2RlZmluZSBWTUVNTUFQX1NUQVJUCV9BQygweGZmZmZlYTAwMDAwMDAwMDAsIFVMKQorI2RlZmluZSBfX1ZNRU1NQVBfQkFTRQlfQUMoMHhmZmZmZWEwMDAwMDAwMDAwLCBVTCkKICNpZmRlZiBDT05GSUdfUkFORE9NSVpFX01FTU9SWQogI2RlZmluZSBWTUFMTE9DX1NUQVJUCXZtYWxsb2NfYmFzZQorI2RlZmluZSBWTUVNTUFQX1NUQVJUCXZtZW1tYXBfYmFzZQogI2Vsc2UKICNkZWZpbmUgVk1BTExPQ19TVEFSVAlfX1ZNQUxMT0NfQkFTRQorI2RlZmluZSBWTUVNTUFQX1NUQVJUCV9fVk1FTU1BUF9CQVNFCiAjZW5kaWYgLyogQ09ORklHX1JBTkRPTUlaRV9NRU1PUlkgKi8KICNkZWZpbmUgVk1BTExPQ19FTkQJKFZNQUxMT0NfU1RBUlQgKyBfQUMoKFZNQUxMT0NfU0laRV9UQiA8PCA0MCkgLSAxLCBVTCkpCiAjZGVmaW5lIE1PRFVMRVNfVkFERFIgICAgKF9fU1RBUlRfS0VSTkVMX21hcCArIEtFUk5FTF9JTUFHRV9TSVpFKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcG1lbS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcG1lbS5oCmluZGV4IDY0M2ViYTQuLjJjMWViZWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BtZW0uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wbWVtLmgKQEAgLTQ2LDEwICs0Niw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGFyY2hfbWVtY3B5X2Zyb21fcG1lbSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCiB7Ci0JaWYgKHN0YXRpY19jcHVfaGFzKFg4Nl9GRUFUVVJFX01DRV9SRUNPVkVSWSkpCi0JCXJldHVybiBtZW1jcHlfbWNzYWZlKGRzdCwgc3JjLCBuKTsKLQltZW1jcHkoZHN0LCBzcmMsIG4pOwotCXJldHVybiAwOworCXJldHVybiBtZW1jcHlfbWNzYWZlKGRzdCwgc3JjLCBuKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IDYzZGVmOTUuLjk4NGE3YmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0zODksOSArMzg5LDkgQEAKIAl1bnNpZ25lZCBzaG9ydAkJZnNpbmRleDsKIAl1bnNpZ25lZCBzaG9ydAkJZ3NpbmRleDsKICNlbmRpZgotI2lmZGVmIENPTkZJR19YODZfMzIKLQl1bnNpZ25lZCBsb25nCQlpcDsKLSNlbmRpZgorCisJdTMyCQkJc3RhdHVzOwkJLyogdGhyZWFkIHN5bmNocm9ub3VzIGZsYWdzICovCisKICNpZmRlZiBDT05GSUdfWDg2XzY0CiAJdW5zaWduZWQgbG9uZwkJZnNiYXNlOwogCXVuc2lnbmVkIGxvbmcJCWdzYmFzZTsKQEAgLTQzOCw2ICs0MzgsMTUgQEAKIH07CiAKIC8qCisgKiBUaHJlYWQtc3luY2hyb25vdXMgc3RhdHVzLgorICoKKyAqIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGZsYWdzIGluIHRoYXQgbm9ib2R5IGVsc2UKKyAqIGV2ZXIgdG91Y2hlcyBvdXIgdGhyZWFkLXN5bmNocm9ub3VzIHN0YXR1cywgc28gd2UgZG9uJ3QKKyAqIGhhdmUgdG8gd29ycnkgYWJvdXQgYXRvbWljIGFjY2Vzc2VzLgorICovCisjZGVmaW5lIFRTX0NPTVBBVAkJMHgwMDAyCS8qIDMyYml0IHN5c2NhbGwgYWN0aXZlICg2NEJJVCkqLworCisvKgogICogU2V0IElPUEwgYml0cyBpbiBFRkxBR1MgZnJvbSBnaXZlbiBtYXNrCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBuYXRpdmVfc2V0X2lvcGxfbWFzayh1bnNpZ25lZCBtYXNrKQpAQCAtNzI0LDggKzczMyw2IEBACiAJLmFkZHJfbGltaXQJCT0gS0VSTkVMX0RTLAkJCQkgIFwKIH0KIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdGhyZWFkX3NhdmVkX3BjKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKLQogLyoKICAqIFRPUF9PRl9LRVJORUxfU1RBQ0tfUEFERElORyByZXNlcnZlcyA4IGJ5dGVzIG9uIHRvcCBvZiB0aGUgcmluZzAgc3RhY2suCiAgKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBndWFyYW50ZWUgdGhhdCB0aGUgZW50aXJlICJzdHJ1Y3QgcHRfcmVncyIKQEAgLTc3NiwxNyArNzgzLDEzIEBACiAJLmFkZHJfbGltaXQJCT0gS0VSTkVMX0RTLAkJCVwKIH0KIAotLyoKLSAqIFJldHVybiBzYXZlZCBQQyBvZiBhIGJsb2NrZWQgdGhyZWFkLgotICogV2hhdCBpcyB0aGlzIGdvb2QgZm9yPyBpdCB3aWxsIGJlIGFsd2F5cyB0aGUgc2NoZWR1bGVyIG9yIHJldF9mcm9tX2ZvcmsuCi0gKi8KLSNkZWZpbmUgdGhyZWFkX3NhdmVkX3BjKHQpCVJFQURfT05DRV9OT0NIRUNLKCoodW5zaWduZWQgbG9uZyAqKSgodCktPnRocmVhZC5zcCAtIDgpKQotCiAjZGVmaW5lIHRhc2tfcHRfcmVncyh0c2spCSgoc3RydWN0IHB0X3JlZ3MgKikodHNrKS0+dGhyZWFkLnNwMCAtIDEpCiBleHRlcm4gdW5zaWduZWQgbG9uZyBLU1RLX0VTUChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwogCiAjZW5kaWYgLyogQ09ORklHX1g4Nl82NCAqLwogCitleHRlcm4gdW5zaWduZWQgbG9uZyB0aHJlYWRfc2F2ZWRfcGMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOworCiBleHRlcm4gdm9pZCBzdGFydF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgbmV3X2lwLAogCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBuZXdfc3ApOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9yZWFsbW9kZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcmVhbG1vZGUuaAppbmRleCBiMjk4OGMwLi4yMzBlMTkwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9yZWFsbW9kZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3JlYWxtb2RlLmgKQEAgLTQ0LDkgKzQ0LDkgQEAKIGV4dGVybiBzdHJ1Y3QgcmVhbF9tb2RlX2hlYWRlciAqcmVhbF9tb2RlX2hlYWRlcjsKIGV4dGVybiB1bnNpZ25lZCBjaGFyIHJlYWxfbW9kZV9ibG9iX2VuZFtdOwogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBpbml0X3JzcDsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGluaXRpYWxfY29kZTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGluaXRpYWxfZ3M7CitleHRlcm4gdW5zaWduZWQgbG9uZyBpbml0aWFsX3N0YWNrOwogCiBleHRlcm4gdW5zaWduZWQgY2hhciByZWFsX21vZGVfYmxvYltdOwogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcmVhbF9tb2RlX3JlbG9jc1tdOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcndzZW0uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3J3c2VtLmgKaW5kZXggOGRiYzc2Mi4uM2QzM2E3MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcndzZW0uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9yd3NlbS5oCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkJICAgICA6ICIrbSIgKHNlbS0+Y291bnQpLCAiPSZhIiAodG1wMCksICI9JnIiICh0bXAxKSwKIAkJICAgICAgIENDX09VVChlKSAocmVzdWx0KQogCQkgICAgIDogImVyIiAoUldTRU1fQUNUSVZFX1dSSVRFX0JJQVMpCi0JCSAgICAgOiAibWVtb3J5IiwgImNjIik7CisJCSAgICAgOiAibWVtb3J5Iik7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc2lnbmFsLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zaWduYWwuaAppbmRleCBkZDFlN2Q2Li44YWYyMmJlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zaWduYWwuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zaWduYWwuaApAQCAtMjMsNiArMjMsMTAgQEAKIAl1bnNpZ25lZCBsb25nIHNpZ1tfTlNJR19XT1JEU107CiB9IHNpZ3NldF90OwogCisvKiBub24tdWFwaSBpbi1rZXJuZWwgU0FfRkxBR1MgZm9yIHRob3NlIGluZGljYXRlcyBBQkkgZm9yIGEgc2lnbmFsIGZyYW1lICovCisjZGVmaW5lIFNBX0lBMzJfQUJJCTB4MDIwMDAwMDB1CisjZGVmaW5lIFNBX1gzMl9BQkkJMHgwMTAwMDAwMHUKKwogI2lmbmRlZiBDT05GSUdfQ09NUEFUCiB0eXBlZGVmIHNpZ3NldF90IGNvbXBhdF9zaWdzZXRfdDsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbXAuaAppbmRleCBlYmQwYzE2Li4xOTk4MGIzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbXAuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbXAuaApAQCAtMzksOSArMzksNiBAQAogREVDTEFSRV9FQVJMWV9QRVJfQ1BVX1JFQURfTU9TVExZKGludCwgeDg2X2NwdV90b19sb2dpY2FsX2FwaWNpZCk7CiAjZW5kaWYKIAotLyogU3RhdGljIHN0YXRlIGluIGhlYWQuUyB1c2VkIHRvIHNldCB1cCBhIENQVSAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3RhY2tfc3RhcnQ7IC8qIEluaXRpYWwgc3RhY2sgcG9pbnRlciBhZGRyZXNzICovCi0KIHN0cnVjdCB0YXNrX3N0cnVjdDsKIAogc3RydWN0IHNtcF9vcHMgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BlY2lhbF9pbnNucy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BlY2lhbF9pbnNucy5oCmluZGV4IDU4N2Q3OTEuLjE5YTIyMjQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwZWNpYWxfaW5zbnMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGVjaWFsX2luc25zLmgKQEAgLTU5LDIyICs1OSwxOSBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5hdGl2ZV9yZWFkX2NyNCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgdmFsOwotCWFzbSB2b2xhdGlsZSgibW92ICUlY3I0LCUwXG5cdCIgOiAiPXIiICh2YWwpLCAiPW0iIChfX2ZvcmNlX29yZGVyKSk7Ci0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5hdGl2ZV9yZWFkX2NyNF9zYWZlKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JLyogVGhpcyBjb3VsZCBmYXVsdCBpZiAlY3I0IGRvZXMgbm90IGV4aXN0LiBJbiB4ODZfNjQsIGEgY3I0IGFsd2F5cwotCSAqIGV4aXN0cywgc28gaXQgd2lsbCBuZXZlciBmYWlsLiAqLwogI2lmZGVmIENPTkZJR19YODZfMzIKKwkvKgorCSAqIFRoaXMgY291bGQgZmF1bHQgaWYgQ1I0IGRvZXMgbm90IGV4aXN0LiAgTm9uLWV4aXN0ZW50IENSNAorCSAqIGlzIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIENSNCA9PSAwLiAgS2VlcCBpdCBzaW1wbGUgYW5kIHByZXRlbmQKKwkgKiB0aGF0IENSNCA9PSAwIG9uIENQVXMgdGhhdCBkb24ndCBoYXZlIENSNC4KKwkgKi8KIAlhc20gdm9sYXRpbGUoIjE6IG1vdiAlJWNyNCwgJTBcbiIKIAkJICAgICAiMjpcbiIKIAkJICAgICBfQVNNX0VYVEFCTEUoMWIsIDJiKQogCQkgICAgIDogIj1yIiAodmFsKSwgIj1tIiAoX19mb3JjZV9vcmRlcikgOiAiMCIgKDApKTsKICNlbHNlCi0JdmFsID0gbmF0aXZlX3JlYWRfY3I0KCk7CisJLyogQ1I0IGFsd2F5cyBleGlzdHMgb24geDg2XzY0LiAqLworCWFzbSB2b2xhdGlsZSgibW92ICUlY3I0LCUwXG5cdCIgOiAiPXIiICh2YWwpLCAiPW0iIChfX2ZvcmNlX29yZGVyKSk7CiAjZW5kaWYKIAlyZXR1cm4gdmFsOwogfQpAQCAtMTgyLDExICsxNzksNiBAQAogCXJldHVybiBuYXRpdmVfcmVhZF9jcjQoKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcmVhZF9jcjRfc2FmZSh2b2lkKQotewotCXJldHVybiBuYXRpdmVfcmVhZF9jcjRfc2FmZSgpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgX193cml0ZV9jcjQodW5zaWduZWQgbG9uZyB4KQogewogCW5hdGl2ZV93cml0ZV9jcjQoeCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9jay5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2suaAppbmRleCBiZTBhMDU5Li45MjFiZWE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9jay5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKQEAgLTIwLDE4NyArMjAsMTMgQEAKICAqICh0aGUgdHlwZSBkZWZpbml0aW9ucyBhcmUgaW4gYXNtL3NwaW5sb2NrX3R5cGVzLmgpCiAgKi8KIAotI2lmZGVmIENPTkZJR19YODZfMzIKLSMgZGVmaW5lIExPQ0tfUFRSX1JFRyAiYSIKLSNlbHNlCi0jIGRlZmluZSBMT0NLX1BUUl9SRUcgIkQiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1g4Nl8zMikgJiYgKGRlZmluZWQoQ09ORklHX1g4Nl9QUFJPX0ZFTkNFKSkKLS8qCi0gKiBPbiBQUHJvIFNNUCwgd2UgdXNlIGEgbG9ja2VkIG9wZXJhdGlvbiB0byB1bmxvY2sKLSAqIChQUHJvIGVycmF0YSA2NiwgOTIpCi0gKi8KLSMgZGVmaW5lIFVOTE9DS19MT0NLX1BSRUZJWCBMT0NLX1BSRUZJWAotI2Vsc2UKLSMgZGVmaW5lIFVOTE9DS19MT0NLX1BSRUZJWAotI2VuZGlmCi0KIC8qIEhvdyBsb25nIGEgbG9jayBzaG91bGQgc3BpbiBiZWZvcmUgd2UgY29uc2lkZXIgYmxvY2tpbmcgKi8KICNkZWZpbmUgU1BJTl9USFJFU0hPTEQJKDEgPDwgMTUpCiAKIGV4dGVybiBzdHJ1Y3Qgc3RhdGljX2tleSBwYXJhdmlydF90aWNrZXRsb2Nrc19lbmFibGVkOwogc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIHN0YXRpY19rZXlfZmFsc2Uoc3RydWN0IHN0YXRpY19rZXkgKmtleSk7CiAKLSNpZmRlZiBDT05GSUdfUVVFVUVEX1NQSU5MT0NLUwogI2luY2x1ZGUgPGFzbS9xc3BpbmxvY2suaD4KLSNlbHNlCi0KLSNpZmRlZiBDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3RpY2tldF9lbnRlcl9zbG93cGF0aChhcmNoX3NwaW5sb2NrX3QgKmxvY2spCi17Ci0Jc2V0X2JpdCgwLCAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSZsb2NrLT50aWNrZXRzLmhlYWQpOwotfQotCi0jZWxzZSAgLyogIUNPTkZJR19QQVJBVklSVF9TUElOTE9DS1MgKi8KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBfX3RpY2tldF9sb2NrX3NwaW5uaW5nKGFyY2hfc3BpbmxvY2tfdCAqbG9jaywKLQkJCQkJCQlfX3RpY2tldF90IHRpY2tldCkKLXsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3RpY2tldF91bmxvY2tfa2ljayhhcmNoX3NwaW5sb2NrX3QgKmxvY2ssCi0JCQkJCQkJX190aWNrZXRfdCB0aWNrZXQpCi17Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTICovCi1zdGF0aWMgaW5saW5lIGludCAgX190aWNrZXRzX2VxdWFsKF9fdGlja2V0X3Qgb25lLCBfX3RpY2tldF90IHR3bykKLXsKLQlyZXR1cm4gISgob25lIF4gdHdvKSAmIH5USUNLRVRfU0xPV1BBVEhfRkxBRyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3RpY2tldF9jaGVja19hbmRfY2xlYXJfc2xvd3BhdGgoYXJjaF9zcGlubG9ja190ICpsb2NrLAotCQkJCQkJCV9fdGlja2V0X3QgaGVhZCkKLXsKLQlpZiAoaGVhZCAmIFRJQ0tFVF9TTE9XUEFUSF9GTEFHKSB7Ci0JCWFyY2hfc3BpbmxvY2tfdCBvbGQsIG5ldzsKLQotCQlvbGQudGlja2V0cy5oZWFkID0gaGVhZDsKLQkJbmV3LnRpY2tldHMuaGVhZCA9IGhlYWQgJiB+VElDS0VUX1NMT1dQQVRIX0ZMQUc7Ci0JCW9sZC50aWNrZXRzLnRhaWwgPSBuZXcudGlja2V0cy5oZWFkICsgVElDS0VUX0xPQ0tfSU5DOwotCQluZXcudGlja2V0cy50YWlsID0gb2xkLnRpY2tldHMudGFpbDsKLQotCQkvKiB0cnkgdG8gY2xlYXIgc2xvd3BhdGggZmxhZyB3aGVuIHRoZXJlIGFyZSBubyBjb250ZW5kZXJzICovCi0JCWNtcHhjaGcoJmxvY2stPmhlYWRfdGFpbCwgb2xkLmhlYWRfdGFpbCwgbmV3LmhlYWRfdGFpbCk7Ci0JfQotfQotCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBhcmNoX3NwaW5fdmFsdWVfdW5sb2NrZWQoYXJjaF9zcGlubG9ja190IGxvY2spCi17Ci0JcmV0dXJuIF9fdGlja2V0c19lcXVhbChsb2NrLnRpY2tldHMuaGVhZCwgbG9jay50aWNrZXRzLnRhaWwpOwotfQotCi0vKgotICogVGlja2V0IGxvY2tzIGFyZSBjb25jZXB0dWFsbHkgdHdvIHBhcnRzLCBvbmUgaW5kaWNhdGluZyB0aGUgY3VycmVudCBoZWFkIG9mCi0gKiB0aGUgcXVldWUsIGFuZCB0aGUgb3RoZXIgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0YWlsLiBUaGUgbG9jayBpcyBhY3F1aXJlZAotICogYnkgYXRvbWljYWxseSBub3RpbmcgdGhlIHRhaWwgYW5kIGluY3JlbWVudGluZyBpdCBieSBvbmUgKHRodXMgYWRkaW5nCi0gKiBvdXJzZWxmIHRvIHRoZSBxdWV1ZSBhbmQgbm90aW5nIG91ciBwb3NpdGlvbiksIHRoZW4gd2FpdGluZyB1bnRpbCB0aGUgaGVhZAotICogYmVjb21lcyBlcXVhbCB0byB0aGUgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHRhaWwuCi0gKgotICogV2UgdXNlIGFuIHhhZGQgY292ZXJpbmcgKmJvdGgqIHBhcnRzIG9mIHRoZSBsb2NrLCB0byBpbmNyZW1lbnQgdGhlIHRhaWwgYW5kCi0gKiBhbHNvIGxvYWQgdGhlIHBvc2l0aW9uIG9mIHRoZSBoZWFkLCB3aGljaCB0YWtlcyBjYXJlIG9mIG1lbW9yeSBvcmRlcmluZwotICogaXNzdWVzIGFuZCBzaG91bGQgYmUgb3B0aW1hbCBmb3IgdGhlIHVuY29udGVuZGVkIGNhc2UuIE5vdGUgdGhlIHRhaWwgbXVzdCBiZQotICogaW4gdGhlIGhpZ2ggcGFydCwgYmVjYXVzZSBhIHdpZGUgeGFkZCBpbmNyZW1lbnQgb2YgdGhlIGxvdyBwYXJ0IHdvdWxkIGNhcnJ5Ci0gKiB1cCBhbmQgY29udGFtaW5hdGUgdGhlIGhpZ2ggcGFydC4KLSAqLwotc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGFyY2hfc3Bpbl9sb2NrKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKLXsKLQlyZWdpc3RlciBzdHJ1Y3QgX19yYXdfdGlja2V0cyBpbmMgPSB7IC50YWlsID0gVElDS0VUX0xPQ0tfSU5DIH07Ci0KLQlpbmMgPSB4YWRkKCZsb2NrLT50aWNrZXRzLCBpbmMpOwotCWlmIChsaWtlbHkoaW5jLmhlYWQgPT0gaW5jLnRhaWwpKQotCQlnb3RvIG91dDsKLQotCWZvciAoOzspIHsKLQkJdW5zaWduZWQgY291bnQgPSBTUElOX1RIUkVTSE9MRDsKLQotCQlkbyB7Ci0JCQlpbmMuaGVhZCA9IFJFQURfT05DRShsb2NrLT50aWNrZXRzLmhlYWQpOwotCQkJaWYgKF9fdGlja2V0c19lcXVhbChpbmMuaGVhZCwgaW5jLnRhaWwpKQotCQkJCWdvdG8gY2xlYXJfc2xvd3BhdGg7Ci0JCQljcHVfcmVsYXgoKTsKLQkJfSB3aGlsZSAoLS1jb3VudCk7Ci0JCV9fdGlja2V0X2xvY2tfc3Bpbm5pbmcobG9jaywgaW5jLnRhaWwpOwotCX0KLWNsZWFyX3Nsb3dwYXRoOgotCV9fdGlja2V0X2NoZWNrX2FuZF9jbGVhcl9zbG93cGF0aChsb2NrLCBpbmMuaGVhZCk7Ci1vdXQ6Ci0JYmFycmllcigpOwkvKiBtYWtlIHN1cmUgbm90aGluZyBjcmVlcHMgYmVmb3JlIHRoZSBsb2NrIGlzIHRha2VuICovCi19Ci0KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IGFyY2hfc3Bpbl90cnlsb2NrKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKLXsKLQlhcmNoX3NwaW5sb2NrX3Qgb2xkLCBuZXc7Ci0KLQlvbGQudGlja2V0cyA9IFJFQURfT05DRShsb2NrLT50aWNrZXRzKTsKLQlpZiAoIV9fdGlja2V0c19lcXVhbChvbGQudGlja2V0cy5oZWFkLCBvbGQudGlja2V0cy50YWlsKSkKLQkJcmV0dXJuIDA7Ci0KLQluZXcuaGVhZF90YWlsID0gb2xkLmhlYWRfdGFpbCArIChUSUNLRVRfTE9DS19JTkMgPDwgVElDS0VUX1NISUZUKTsKLQluZXcuaGVhZF90YWlsICY9IH5USUNLRVRfU0xPV1BBVEhfRkxBRzsKLQotCS8qIGNtcHhjaGcgaXMgYSBmdWxsIGJhcnJpZXIsIHNvIG5vdGhpbmcgY2FuIG1vdmUgYmVmb3JlIGl0ICovCi0JcmV0dXJuIGNtcHhjaGcoJmxvY2stPmhlYWRfdGFpbCwgb2xkLmhlYWRfdGFpbCwgbmV3LmhlYWRfdGFpbCkgPT0gb2xkLmhlYWRfdGFpbDsKLX0KLQotc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGFyY2hfc3Bpbl91bmxvY2soYXJjaF9zcGlubG9ja190ICpsb2NrKQotewotCWlmIChUSUNLRVRfU0xPV1BBVEhfRkxBRyAmJgotCQlzdGF0aWNfa2V5X2ZhbHNlKCZwYXJhdmlydF90aWNrZXRsb2Nrc19lbmFibGVkKSkgewotCQlfX3RpY2tldF90IGhlYWQ7Ci0KLQkJQlVJTERfQlVHX09OKCgoX190aWNrZXRfdClOUl9DUFVTKSAhPSBOUl9DUFVTKTsKLQotCQloZWFkID0geGFkZCgmbG9jay0+dGlja2V0cy5oZWFkLCBUSUNLRVRfTE9DS19JTkMpOwotCi0JCWlmICh1bmxpa2VseShoZWFkICYgVElDS0VUX1NMT1dQQVRIX0ZMQUcpKSB7Ci0JCQloZWFkICY9IH5USUNLRVRfU0xPV1BBVEhfRkxBRzsKLQkJCV9fdGlja2V0X3VubG9ja19raWNrKGxvY2ssIChoZWFkICsgVElDS0VUX0xPQ0tfSU5DKSk7Ci0JCX0KLQl9IGVsc2UKLQkJX19hZGQoJmxvY2stPnRpY2tldHMuaGVhZCwgVElDS0VUX0xPQ0tfSU5DLCBVTkxPQ0tfTE9DS19QUkVGSVgpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBhcmNoX3NwaW5faXNfbG9ja2VkKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKLXsKLQlzdHJ1Y3QgX19yYXdfdGlja2V0cyB0bXAgPSBSRUFEX09OQ0UobG9jay0+dGlja2V0cyk7Ci0KLQlyZXR1cm4gIV9fdGlja2V0c19lcXVhbCh0bXAudGFpbCwgdG1wLmhlYWQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBhcmNoX3NwaW5faXNfY29udGVuZGVkKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKLXsKLQlzdHJ1Y3QgX19yYXdfdGlja2V0cyB0bXAgPSBSRUFEX09OQ0UobG9jay0+dGlja2V0cyk7Ci0KLQl0bXAuaGVhZCAmPSB+VElDS0VUX1NMT1dQQVRIX0ZMQUc7Ci0JcmV0dXJuIChfX3RpY2tldF90KSh0bXAudGFpbCAtIHRtcC5oZWFkKSA+IFRJQ0tFVF9MT0NLX0lOQzsKLX0KLSNkZWZpbmUgYXJjaF9zcGluX2lzX2NvbnRlbmRlZAlhcmNoX3NwaW5faXNfY29udGVuZGVkCi0KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBhcmNoX3NwaW5fbG9ja19mbGFncyhhcmNoX3NwaW5sb2NrX3QgKmxvY2ssCi0JCQkJCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JYXJjaF9zcGluX2xvY2sobG9jayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3NwaW5fdW5sb2NrX3dhaXQoYXJjaF9zcGlubG9ja190ICpsb2NrKQotewotCV9fdGlja2V0X3QgaGVhZCA9IFJFQURfT05DRShsb2NrLT50aWNrZXRzLmhlYWQpOwotCi0JZm9yICg7OykgewotCQlzdHJ1Y3QgX19yYXdfdGlja2V0cyB0bXAgPSBSRUFEX09OQ0UobG9jay0+dGlja2V0cyk7Ci0JCS8qCi0JCSAqIFdlIG5lZWQgdG8gY2hlY2sgInVubG9ja2VkIiBpbiBhIGxvb3AsIHRtcC5oZWFkID09IGhlYWQKLQkJICogY2FuIGJlIGZhbHNlIHBvc2l0aXZlIGJlY2F1c2Ugb2Ygb3ZlcmZsb3cuCi0JCSAqLwotCQlpZiAoX190aWNrZXRzX2VxdWFsKHRtcC5oZWFkLCB0bXAudGFpbCkgfHwKLQkJCQkhX190aWNrZXRzX2VxdWFsKHRtcC5oZWFkLCBoZWFkKSkKLQkJCWJyZWFrOwotCi0JCWNwdV9yZWxheCgpOwotCX0KLX0KLSNlbmRpZiAvKiBDT05GSUdfUVVFVUVEX1NQSU5MT0NLUyAqLwogCiAvKgogICogUmVhZC13cml0ZSBzcGlubG9ja3MsIGFsbG93aW5nIG11bHRpcGxlIHJlYWRlcnMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9ja190eXBlcy5oCmluZGV4IDY1YzNlMzcuLjI1MzExZWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2tfdHlwZXMuaApAQCAtMjMsMjAgKzIzLDcgQEAKIAogI2RlZmluZSBUSUNLRVRfU0hJRlQJKHNpemVvZihfX3RpY2tldF90KSAqIDgpCiAKLSNpZmRlZiBDT05GSUdfUVVFVUVEX1NQSU5MT0NLUwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3FzcGlubG9ja190eXBlcy5oPgotI2Vsc2UKLXR5cGVkZWYgc3RydWN0IGFyY2hfc3BpbmxvY2sgewotCXVuaW9uIHsKLQkJX190aWNrZXRwYWlyX3QgaGVhZF90YWlsOwotCQlzdHJ1Y3QgX19yYXdfdGlja2V0cyB7Ci0JCQlfX3RpY2tldF90IGhlYWQsIHRhaWw7Ci0JCX0gdGlja2V0czsKLQl9OwotfSBhcmNoX3NwaW5sb2NrX3Q7Ci0KLSNkZWZpbmUgX19BUkNIX1NQSU5fTE9DS19VTkxPQ0tFRAl7IHsgMCB9IH0KLSNlbmRpZiAvKiBDT05GSUdfUVVFVUVEX1NQSU5MT0NLUyAqLwogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcXJ3bG9ja190eXBlcy5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdGFja3RyYWNlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdGFja3RyYWNlLmgKaW5kZXggMDk0NDIxOC4uMzdmMmUwYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3RhY2t0cmFjZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N0YWNrdHJhY2UuaApAQCAtOCw4NiArOCw4NiBAQAogCiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9zd2l0Y2hfdG8uaD4KKworZW51bSBzdGFja190eXBlIHsKKwlTVEFDS19UWVBFX1VOS05PV04sCisJU1RBQ0tfVFlQRV9UQVNLLAorCVNUQUNLX1RZUEVfSVJRLAorCVNUQUNLX1RZUEVfU09GVElSUSwKKwlTVEFDS19UWVBFX0VYQ0VQVElPTiwKKwlTVEFDS19UWVBFX0VYQ0VQVElPTl9MQVNUID0gU1RBQ0tfVFlQRV9FWENFUFRJT04gKyBOX0VYQ0VQVElPTl9TVEFDS1MtMSwKK307CisKK3N0cnVjdCBzdGFja19pbmZvIHsKKwllbnVtIHN0YWNrX3R5cGUgdHlwZTsKKwl1bnNpZ25lZCBsb25nICpiZWdpbiwgKmVuZCwgKm5leHRfc3A7Cit9OworCitib29sIGluX3Rhc2tfc3RhY2sodW5zaWduZWQgbG9uZyAqc3RhY2ssIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJICAgc3RydWN0IHN0YWNrX2luZm8gKmluZm8pOworCitpbnQgZ2V0X3N0YWNrX2luZm8odW5zaWduZWQgbG9uZyAqc3RhY2ssIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJICAgc3RydWN0IHN0YWNrX2luZm8gKmluZm8sIHVuc2lnbmVkIGxvbmcgKnZpc2l0X21hc2spOworCit2b2lkIHN0YWNrX3R5cGVfc3RyKGVudW0gc3RhY2tfdHlwZSB0eXBlLCBjb25zdCBjaGFyICoqYmVnaW4sCisJCSAgICBjb25zdCBjaGFyICoqZW5kKTsKKworc3RhdGljIGlubGluZSBib29sIG9uX3N0YWNrKHN0cnVjdCBzdGFja19pbmZvICppbmZvLCB2b2lkICphZGRyLCBzaXplX3QgbGVuKQoreworCXZvaWQgKmJlZ2luID0gaW5mby0+YmVnaW47CisJdm9pZCAqZW5kICAgPSBpbmZvLT5lbmQ7CisKKwlyZXR1cm4gKGluZm8tPnR5cGUgIT0gU1RBQ0tfVFlQRV9VTktOT1dOICYmCisJCWFkZHIgPj0gYmVnaW4gJiYgYWRkciA8IGVuZCAmJgorCQlhZGRyICsgbGVuID4gYmVnaW4gJiYgYWRkciArIGxlbiA8PSBlbmQpOworfQogCiBleHRlcm4gaW50IGtzdGFja19kZXB0aF90b19wcmludDsKIAotc3RydWN0IHRocmVhZF9pbmZvOwotc3RydWN0IHN0YWNrdHJhY2Vfb3BzOwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgKCp3YWxrX3N0YWNrX3QpKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nICpzdGFjaywKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGJwLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLAotCQkJCSAgICAgIHZvaWQgKmRhdGEsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyAqZW5kLAotCQkJCSAgICAgIGludCAqZ3JhcGgpOwotCi1leHRlcm4gdW5zaWduZWQgbG9uZwotcHJpbnRfY29udGV4dF9zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCSAgICB1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwKLQkJICAgIGNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLCB2b2lkICpkYXRhLAotCQkgICAgdW5zaWduZWQgbG9uZyAqZW5kLCBpbnQgKmdyYXBoKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcKLXByaW50X2NvbnRleHRfc3RhY2tfYnAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnAsCi0JCSAgICAgICBjb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgKm9wcywgdm9pZCAqZGF0YSwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmVuZCwgaW50ICpncmFwaCk7Ci0KLS8qIEdlbmVyaWMgc3RhY2sgdHJhY2VyIHdpdGggY2FsbGJhY2tzICovCi0KLXN0cnVjdCBzdGFja3RyYWNlX29wcyB7Ci0JaW50ICgqYWRkcmVzcykodm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgcmVsaWFibGUpOwotCS8qIE9uIG5lZ2F0aXZlIHJldHVybiBzdG9wIGR1bXBpbmcgKi8KLQlpbnQgKCpzdGFjaykodm9pZCAqZGF0YSwgY2hhciAqbmFtZSk7Ci0Jd2Fsa19zdGFja190CXdhbGtfc3RhY2s7Ci19OwotCi12b2lkIGR1bXBfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwKLQkJY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEpOwotCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogI2RlZmluZSBTVEFDS1NMT1RTX1BFUl9MSU5FIDgKLSNkZWZpbmUgZ2V0X2JwKGJwKSBhc20oIm1vdmwgJSVlYnAsICUwIiA6ICI9ciIgKGJwKSA6KQogI2Vsc2UKICNkZWZpbmUgU1RBQ0tTTE9UU19QRVJfTElORSA0Ci0jZGVmaW5lIGdldF9icChicCkgYXNtKCJtb3ZxICUlcmJwLCAlMCIgOiAiPXIiIChicCkgOikKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotc3RhY2tfZnJhbWUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyAqCitnZXRfZnJhbWVfcG9pbnRlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXVuc2lnbmVkIGxvbmcgYnA7Ci0KIAlpZiAocmVncykKLQkJcmV0dXJuIHJlZ3MtPmJwOworCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5icDsKIAotCWlmICh0YXNrID09IGN1cnJlbnQpIHsKLQkJLyogR3JhYiBicCByaWdodCBmcm9tIG91ciByZWdzICovCi0JCWdldF9icChicCk7Ci0JCXJldHVybiBicDsKLQl9CisJaWYgKHRhc2sgPT0gY3VycmVudCkKKwkJcmV0dXJuIF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOwogCi0JLyogYnAgaXMgdGhlIGxhc3QgcmVnIHB1c2hlZCBieSBzd2l0Y2hfdG8gKi8KLQlyZXR1cm4gKih1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnNwOworCXJldHVybiAodW5zaWduZWQgbG9uZyAqKSgoc3RydWN0IGluYWN0aXZlX3Rhc2tfZnJhbWUgKil0YXNrLT50aHJlYWQuc3ApLT5icDsKIH0KICNlbHNlCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLXN0YWNrX2ZyYW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgKgorZ2V0X2ZyYW1lX3BvaW50ZXIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gTlVMTDsKIH0KLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19GUkFNRV9QT0lOVEVSICovCiAKLWV4dGVybiB2b2lkCi1zaG93X3RyYWNlX2xvZ19sdmwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJICAgdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnAsIGNoYXIgKmxvZ19sdmwpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICoKK2dldF9zdGFja19wb2ludGVyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHJlZ3MpCisJCXJldHVybiAodW5zaWduZWQgbG9uZyAqKWtlcm5lbF9zdGFja19wb2ludGVyKHJlZ3MpOwogCi1leHRlcm4gdm9pZAotc2hvd19zdGFja19sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCSAgIHVuc2lnbmVkIGxvbmcgKnNwLCB1bnNpZ25lZCBsb25nIGJwLCBjaGFyICpsb2dfbHZsKTsKKwlpZiAodGFzayA9PSBjdXJyZW50KQorCQlyZXR1cm4gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQuc3A7Cit9CisKK3ZvaWQgc2hvd190cmFjZV9sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQl1bnNpZ25lZCBsb25nICpzdGFjaywgY2hhciAqbG9nX2x2bCk7CisKK3ZvaWQgc2hvd19zdGFja19sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQl1bnNpZ25lZCBsb25nICpzcCwgY2hhciAqbG9nX2x2bCk7CiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgY29kZV9ieXRlczsKIApAQCAtMTA2LDcgKzEwNiw3IEBACiB7CiAJc3RydWN0IHN0YWNrX2ZyYW1lICpmcmFtZTsKIAotCWdldF9icChmcmFtZSk7CisJZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKIAogI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCiAJZnJhbWUgPSBmcmFtZS0+bmV4dF9mcmFtZTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N0cmluZ182NC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3RyaW5nXzY0LmgKaW5kZXggOTBkYmJkOS4uYTE2NDg2MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3RyaW5nXzY0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3RyaW5nXzY0LmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIF9BU01fWDg2X1NUUklOR182NF9ICiAKICNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbC5oPgogCiAvKiBXcml0dGVuIDIwMDIgYnkgQW5kaSBLbGVlbiAqLwogCkBAIC03OCw2ICs3OSw5IEBACiAjZGVmaW5lIG1lbXNldChzLCBjLCBuKSBfX21lbXNldChzLCBjLCBuKQogI2VuZGlmCiAKK19fbXVzdF9jaGVjayBpbnQgbWVtY3B5X21jc2FmZV91bnJvbGxlZCh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGNudCk7CitERUNMQVJFX1NUQVRJQ19LRVlfRkFMU0UobWNzYWZlX2tleSk7CisKIC8qKgogICogbWVtY3B5X21jc2FmZSAtIGNvcHkgbWVtb3J5IHdpdGggaW5kaWNhdGlvbiBpZiBhIG1hY2hpbmUgY2hlY2sgaGFwcGVuZWQKICAqCkBAIC04NiwxMCArOTAsMjMgQEAKICAqIEBjbnQ6CW51bWJlciBvZiBieXRlcyB0byBjb3B5CiAgKgogICogTG93IGxldmVsIG1lbW9yeSBjb3B5IGZ1bmN0aW9uIHRoYXQgY2F0Y2hlcyBtYWNoaW5lIGNoZWNrcworICogV2Ugb25seSBjYWxsIGludG8gdGhlICJzYWZlIiBmdW5jdGlvbiBvbiBzeXN0ZW1zIHRoYXQgY2FuCisgKiBhY3R1YWxseSBkbyBtYWNoaW5lIGNoZWNrIHJlY292ZXJ5LiBFdmVyeW9uZSBlbHNlIGNhbiBqdXN0CisgKiB1c2UgbWVtY3B5KCkuCiAgKgogICogUmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIC1FRkFVTFQgZm9yIGZhaWwKICAqLwotaW50IG1lbWNweV9tY3NhZmUodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBjbnQpOworc3RhdGljIF9fYWx3YXlzX2lubGluZSBfX211c3RfY2hlY2sgaW50CittZW1jcHlfbWNzYWZlKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgY250KQoreworI2lmZGVmIENPTkZJR19YODZfTUNFCisJaWYgKHN0YXRpY19icmFuY2hfdW5saWtlbHkoJm1jc2FmZV9rZXkpKQorCQlyZXR1cm4gbWVtY3B5X21jc2FmZV91bnJvbGxlZChkc3QsIHNyYywgY250KTsKKwllbHNlCisjZW5kaWYKKwkJbWVtY3B5KGRzdCwgc3JjLCBjbnQpOworCXJldHVybiAwOworfQogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zd2l0Y2hfdG8uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N3aXRjaF90by5oCmluZGV4IDhmMzIxYTEuLjVjYjQzNmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N3aXRjaF90by5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N3aXRjaF90by5oCkBAIC0yLDEzMCArMiw2NiBAQAogI2RlZmluZSBfQVNNX1g4Nl9TV0lUQ0hfVE9fSAogCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7IC8qIG9uZSBvZiB0aGUgc3RyYW5nZXIgYXNwZWN0cyBvZiBDIGZvcndhcmQgZGVjbGFyYXRpb25zICovCisKK3N0cnVjdCB0YXNrX3N0cnVjdCAqX19zd2l0Y2hfdG9fYXNtKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKKwkJCQkgICAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KTsKKwogX192aXNpYmxlIHN0cnVjdCB0YXNrX3N0cnVjdCAqX19zd2l0Y2hfdG8oc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LAotCQkJCQkgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpOworCQkJCQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCk7CiBzdHJ1Y3QgdHNzX3N0cnVjdDsKIHZvaWQgX19zd2l0Y2hfdG9feHRyYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXZfcCwgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0X3AsCiAJCSAgICAgIHN0cnVjdCB0c3Nfc3RydWN0ICp0c3MpOwogCi0jaWZkZWYgQ09ORklHX1g4Nl8zMgorLyogVGhpcyBydW5zIHJ1bnMgb24gdGhlIHByZXZpb3VzIHRocmVhZCdzIHN0YWNrLiAqLworc3RhdGljIGlubGluZSB2b2lkIHByZXBhcmVfc3dpdGNoX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKKwkJCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKK3sKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworCS8qCisJICogSWYgd2Ugc3dpdGNoIHRvIGEgc3RhY2sgdGhhdCBoYXMgYSB0b3AtbGV2ZWwgcGFnaW5nIGVudHJ5CisJICogdGhhdCBpcyBub3QgcHJlc2VudCBpbiB0aGUgY3VycmVudCBtbSwgdGhlIHJlc3VsdGluZyAjUEYgd2lsbAorCSAqIHdpbGwgYmUgcHJvbW90ZWQgdG8gYSBkb3VibGUtZmF1bHQgYW5kIHdlJ2xsIHBhbmljLiAgUHJvYmUKKwkgKiB0aGUgbmV3IHN0YWNrIG5vdyBzbyB0aGF0IHZtYWxsb2NfZmF1bHQgY2FuIGZpeCB1cCB0aGUgcGFnZQorCSAqIHRhYmxlcyBpZiBuZWVkZWQuICBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB3ZSB1c2UgYSBzdGFjaworCSAqIGluIHZtYXAgc3BhY2UuCisJICoKKwkgKiBXZSBhc3N1bWUgdGhhdCB0aGUgc3RhY2sgaXMgYWxpZ25lZCBzbyB0aGF0IGl0IG5ldmVyIHNwYW5zCisJICogbW9yZSB0aGFuIG9uZSB0b3AtbGV2ZWwgcGFnaW5nIGVudHJ5LgorCSAqCisJICogVG8gbWluaW1pemUgY2FjaGUgcG9sbHV0aW9uLCBqdXN0IGZvbGxvdyB0aGUgc3RhY2sgcG9pbnRlci4KKwkgKi8KKwlSRUFEX09OQ0UoKih1bnNpZ25lZCBjaGFyICopbmV4dC0+dGhyZWFkLnNwKTsKKyNlbmRpZgorfQogCi0jaWZkZWYgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SCi0jZGVmaW5lIF9fc3dpdGNoX2NhbmFyeQkJCQkJCQlcCi0JIm1vdmwgJVBbdGFza19jYW5hcnldKCVbbmV4dF0pLCAlJWVieFxuXHQiCQkJXAotCSJtb3ZsICUlZWJ4LCAiX19wZXJjcHVfYXJnKFtzdGFja19jYW5hcnldKSJcblx0IgotI2RlZmluZSBfX3N3aXRjaF9jYW5hcnlfb3BhcmFtCQkJCQkJXAotCSwgW3N0YWNrX2NhbmFyeV0gIj1tIiAoc3RhY2tfY2FuYXJ5LmNhbmFyeSkKLSNkZWZpbmUgX19zd2l0Y2hfY2FuYXJ5X2lwYXJhbQkJCQkJCVwKLQksIFt0YXNrX2NhbmFyeV0gImkiIChvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHN0YWNrX2NhbmFyeSkpCi0jZWxzZQkvKiBDQ19TVEFDS1BST1RFQ1RPUiAqLwotI2RlZmluZSBfX3N3aXRjaF9jYW5hcnkKLSNkZWZpbmUgX19zd2l0Y2hfY2FuYXJ5X29wYXJhbQotI2RlZmluZSBfX3N3aXRjaF9jYW5hcnlfaXBhcmFtCi0jZW5kaWYJLyogQ0NfU1RBQ0tQUk9URUNUT1IgKi8KK2FzbWxpbmthZ2Ugdm9pZCByZXRfZnJvbV9mb3JrKHZvaWQpOwogCi0vKgotICogU2F2aW5nIGVmbGFncyBpcyBpbXBvcnRhbnQuIEl0IHN3aXRjaGVzIG5vdCBvbmx5IElPUEwgYmV0d2VlbiB0YXNrcywKLSAqIGl0IGFsc28gcHJvdGVjdHMgb3RoZXIgdGFza3MgZnJvbSBOVCBsZWFraW5nIHRocm91Z2ggc3lzZW50ZXIgZXRjLgotICovCisvKiBkYXRhIHRoYXQgaXMgcG9pbnRlZCB0byBieSB0aHJlYWQuc3AgKi8KK3N0cnVjdCBpbmFjdGl2ZV90YXNrX2ZyYW1lIHsKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJdW5zaWduZWQgbG9uZyByMTU7CisJdW5zaWduZWQgbG9uZyByMTQ7CisJdW5zaWduZWQgbG9uZyByMTM7CisJdW5zaWduZWQgbG9uZyByMTI7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgc2k7CisJdW5zaWduZWQgbG9uZyBkaTsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgYng7CisJdW5zaWduZWQgbG9uZyBicDsKKwl1bnNpZ25lZCBsb25nIHJldF9hZGRyOworfTsKKworc3RydWN0IGZvcmtfZnJhbWUgeworCXN0cnVjdCBpbmFjdGl2ZV90YXNrX2ZyYW1lIGZyYW1lOworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7Cit9OworCiAjZGVmaW5lIHN3aXRjaF90byhwcmV2LCBuZXh0LCBsYXN0KQkJCQkJXAogZG8gewkJCQkJCQkJCVwKLQkvKgkJCQkJCQkJXAotCSAqIENvbnRleHQtc3dpdGNoaW5nIGNsb2JiZXJzIGFsbCByZWdpc3RlcnMsIHNvIHdlIGNsb2JiZXIJXAotCSAqIHRoZW0gZXhwbGljaXRseSwgdmlhIHVudXNlZCBvdXRwdXQgdmFyaWFibGVzLgkJXAotCSAqIChFQVggYW5kIEVCUCBpcyBub3QgbGlzdGVkIGJlY2F1c2UgRUJQIGlzIHNhdmVkL3Jlc3RvcmVkCVwKLQkgKiBleHBsaWNpdGx5IGZvciB3Y2hhbiBhY2Nlc3MgYW5kIEVBWCBpcyB0aGUgcmV0dXJuIHZhbHVlIG9mCVwKLQkgKiBfX3N3aXRjaF90bygpKQkJCQkJCVwKLQkgKi8JCQkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIGVieCwgZWN4LCBlZHgsIGVzaSwgZWRpOwkJCQlcCisJcHJlcGFyZV9zd2l0Y2hfdG8ocHJldiwgbmV4dCk7CQkJCQlcCiAJCQkJCQkJCQlcCi0JYXNtIHZvbGF0aWxlKCJwdXNobCAlJWVicFxuXHQiCQkvKiBzYXZlICAgIEVCUCAgICovCVwKLQkJICAgICAibW92bCAlJWVzcCwlW3ByZXZfc3BdXG5cdCIJLyogc2F2ZSAgICBFU1AgICAqLyBcCi0JCSAgICAgIm1vdmwgJVtuZXh0X3NwXSwlJWVzcFxuXHQiCS8qIHJlc3RvcmUgRVNQICAgKi8gXAotCQkgICAgICJtb3ZsICQxZiwlW3ByZXZfaXBdXG5cdCIJLyogc2F2ZSAgICBFSVAgICAqLwlcCi0JCSAgICAgInB1c2hsICVbbmV4dF9pcF1cblx0IgkvKiByZXN0b3JlIEVJUCAgICovCVwKLQkJICAgICBfX3N3aXRjaF9jYW5hcnkJCQkJCVwKLQkJICAgICAiam1wIF9fc3dpdGNoX3RvXG4iCS8qIHJlZ3Bhcm0gY2FsbCAgKi8JXAotCQkgICAgICIxOlx0IgkJCQkJCVwKLQkJICAgICAicG9wbCAlJWVicFxuXHQiCQkvKiByZXN0b3JlIEVCUCAgICovCVwKLQkJCQkJCQkJCVwKLQkJICAgICAvKiBvdXRwdXQgcGFyYW1ldGVycyAqLwkJCQlcCi0JCSAgICAgOiBbcHJldl9zcF0gIj1tIiAocHJldi0+dGhyZWFkLnNwKSwJCVwKLQkJICAgICAgIFtwcmV2X2lwXSAiPW0iIChwcmV2LT50aHJlYWQuaXApLAkJXAotCQkgICAgICAgIj1hIiAobGFzdCksCQkJCQlcCi0JCQkJCQkJCQlcCi0JCSAgICAgICAvKiBjbG9iYmVyZWQgb3V0cHV0IHJlZ2lzdGVyczogKi8JCVwKLQkJICAgICAgICI9YiIgKGVieCksICI9YyIgKGVjeCksICI9ZCIgKGVkeCksCQlcCi0JCSAgICAgICAiPVMiIChlc2kpLCAiPUQiIChlZGkpCQkJCVwKLQkJICAgICAgIAkJCQkJCQlcCi0JCSAgICAgICBfX3N3aXRjaF9jYW5hcnlfb3BhcmFtCQkJCVwKLQkJCQkJCQkJCVwKLQkJICAgICAgIC8qIGlucHV0IHBhcmFtZXRlcnM6ICovCQkJCVwKLQkJICAgICA6IFtuZXh0X3NwXSAgIm0iIChuZXh0LT50aHJlYWQuc3ApLAkJXAotCQkgICAgICAgW25leHRfaXBdICAibSIgKG5leHQtPnRocmVhZC5pcCksCQlcCi0JCSAgICAgICAJCQkJCQkJXAotCQkgICAgICAgLyogcmVncGFybSBwYXJhbWV0ZXJzIGZvciBfX3N3aXRjaF90bygpOiAqLwlcCi0JCSAgICAgICBbcHJldl0gICAgICJhIiAocHJldiksCQkJCVwKLQkJICAgICAgIFtuZXh0XSAgICAgImQiIChuZXh0KQkJCQlcCi0JCQkJCQkJCQlcCi0JCSAgICAgICBfX3N3aXRjaF9jYW5hcnlfaXBhcmFtCQkJCVwKLQkJCQkJCQkJCVwKLQkJICAgICA6IC8qIHJlbG9hZGVkIHNlZ21lbnQgcmVnaXN0ZXJzICovCQkJXAotCQkJIm1lbW9yeSIpOwkJCQkJXAorCSgobGFzdCkgPSBfX3N3aXRjaF90b19hc20oKHByZXYpLCAobmV4dCkpKTsJCQlcCiB9IHdoaWxlICgwKQogCi0jZWxzZSAvKiBDT05GSUdfWDg2XzMyICovCi0KLS8qIGZyYW1lIHBvaW50ZXIgbXVzdCBiZSBsYXN0IGZvciBnZXRfd2NoYW4gKi8KLSNkZWZpbmUgU0FWRV9DT05URVhUICAgICJwdXNocSAlJXJicCA7IG1vdnEgJSVyc2ksJSVyYnBcblx0IgotI2RlZmluZSBSRVNUT1JFX0NPTlRFWFQgIm1vdnEgJSVyYnAsJSVyc2kgOyBwb3BxICUlcmJwXHQiCi0KLSNkZWZpbmUgX19FWFRSQV9DTE9CQkVSICBcCi0JLCAicmN4IiwgInJieCIsICJyZHgiLCAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsIFwKLQkgICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUiLCAiZmxhZ3MiCi0KLSNpZmRlZiBDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IKLSNkZWZpbmUgX19zd2l0Y2hfY2FuYXJ5CQkJCQkJCSAgXAotCSJtb3ZxICVQW3Rhc2tfY2FuYXJ5XSglJXJzaSksJSVyOFxuXHQiCQkJCSAgXAotCSJtb3ZxICUlcjgsIl9fcGVyY3B1X2FyZyhbZ3NfY2FuYXJ5XSkiXG5cdCIKLSNkZWZpbmUgX19zd2l0Y2hfY2FuYXJ5X29wYXJhbQkJCQkJCSAgXAotCSwgW2dzX2NhbmFyeV0gIj1tIiAoaXJxX3N0YWNrX3VuaW9uLnN0YWNrX2NhbmFyeSkKLSNkZWZpbmUgX19zd2l0Y2hfY2FuYXJ5X2lwYXJhbQkJCQkJCSAgXAotCSwgW3Rhc2tfY2FuYXJ5XSAiaSIgKG9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgc3RhY2tfY2FuYXJ5KSkKLSNlbHNlCS8qIENDX1NUQUNLUFJPVEVDVE9SICovCi0jZGVmaW5lIF9fc3dpdGNoX2NhbmFyeQotI2RlZmluZSBfX3N3aXRjaF9jYW5hcnlfb3BhcmFtCi0jZGVmaW5lIF9fc3dpdGNoX2NhbmFyeV9pcGFyYW0KLSNlbmRpZgkvKiBDQ19TVEFDS1BST1RFQ1RPUiAqLwotCi0vKgotICogVGhlcmUgaXMgbm8gbmVlZCB0byBzYXZlIG9yIHJlc3RvcmUgZmxhZ3MsIGJlY2F1c2UgZmxhZ3MgYXJlIGFsd2F5cwotICogY2xlYW4gaW4ga2VybmVsIG1vZGUsIHdpdGggdGhlIHBvc3NpYmxlIGV4Y2VwdGlvbiBvZiBJT1BMLiAgS2VybmVsIElPUEwKLSAqIGhhcyBubyBlZmZlY3QuCi0gKi8KLSNkZWZpbmUgc3dpdGNoX3RvKHByZXYsIG5leHQsIGxhc3QpIFwKLQlhc20gdm9sYXRpbGUoU0FWRV9DT05URVhUCQkJCQkgIFwKLQkgICAgICJtb3ZxICUlcnNwLCVQW3RocmVhZHJzcF0oJVtwcmV2XSlcblx0IiAvKiBzYXZlIFJTUCAqLwkgIFwKLQkgICAgICJtb3ZxICVQW3RocmVhZHJzcF0oJVtuZXh0XSksJSVyc3Bcblx0IiAvKiByZXN0b3JlIFJTUCAqLwkgIFwKLQkgICAgICJjYWxsIF9fc3dpdGNoX3RvXG5cdCIJCQkJCSAgXAotCSAgICAgIm1vdnEgIl9fcGVyY3B1X2FyZyhbY3VycmVudF90YXNrXSkiLCUlcnNpXG5cdCIJCSAgXAotCSAgICAgX19zd2l0Y2hfY2FuYXJ5CQkJCQkJICBcCi0JICAgICAibW92cSAlUFt0aHJlYWRfaW5mb10oJSVyc2kpLCUlcjhcblx0IgkJCSAgXAotCSAgICAgIm1vdnEgJSVyYXgsJSVyZGlcblx0IiAJCQkJCSAgXAotCSAgICAgInRlc3RsICAlW190aWZfZm9ya10sJVBbdGlfZmxhZ3NdKCUlcjgpXG5cdCIJCSAgXAotCSAgICAgImpueiAgIHJldF9mcm9tX2Zvcmtcblx0IgkJCQkJICBcCi0JICAgICBSRVNUT1JFX0NPTlRFWFQJCQkJCQkgIFwKLQkgICAgIDogIj1hIiAobGFzdCkJCQkJCSAgCSAgXAotCSAgICAgICBfX3N3aXRjaF9jYW5hcnlfb3BhcmFtCQkJCQkgIFwKLQkgICAgIDogW25leHRdICJTIiAobmV4dCksIFtwcmV2XSAiRCIgKHByZXYpLAkJCSAgXAotCSAgICAgICBbdGhyZWFkcnNwXSAiaSIgKG9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgdGhyZWFkLnNwKSksIFwKLQkgICAgICAgW3RpX2ZsYWdzXSAiaSIgKG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgZmxhZ3MpKSwJICBcCi0JICAgICAgIFtfdGlmX2ZvcmtdICJpIiAoX1RJRl9GT1JLKSwJCQkgIAkgIFwKLQkgICAgICAgW3RocmVhZF9pbmZvXSAiaSIgKG9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgc3RhY2spKSwgICBcCi0JICAgICAgIFtjdXJyZW50X3Rhc2tdICJtIiAoY3VycmVudF90YXNrKQkJCSAgXAotCSAgICAgICBfX3N3aXRjaF9jYW5hcnlfaXBhcmFtCQkJCQkgIFwKLQkgICAgIDogIm1lbW9yeSIsICJjYyIgX19FWFRSQV9DTE9CQkVSKQotCi0jZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLwotCiAjZW5kaWYgLyogX0FTTV9YODZfU1dJVENIX1RPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c2NhbGwuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c2NhbGwuaAppbmRleCA0ZTIzZGQxLi5lM2M5NWU4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zeXNjYWxsLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzY2FsbC5oCkBAIC02MCw3ICs2MCw3IEBACiAJICogVFNfQ09NUEFUIGlzIHNldCBmb3IgMzItYml0IHN5c2NhbGwgZW50cmllcyBhbmQgdGhlbgogCSAqIHJlbWFpbnMgc2V0IHVudGlsIHdlIHJldHVybiB0byB1c2VyIG1vZGUuCiAJICovCi0JaWYgKHRhc2tfdGhyZWFkX2luZm8odGFzayktPnN0YXR1cyAmIChUU19DT01QQVR8VFNfSTM4Nl9SRUdTX1BPS0VEKSkKKwlpZiAodGFzay0+dGhyZWFkLnN0YXR1cyAmIChUU19DT01QQVR8VFNfSTM4Nl9SRUdTX1BPS0VEKSkKIAkJLyoKIAkJICogU2lnbi1leHRlbmQgdGhlIHZhbHVlIHNvIChpbnQpLUVGT08gYmVjb21lcyAobG9uZyktRUZPTwogCQkgKiBhbmQgd2lsbCBtYXRjaCBjb3JyZWN0bHkgaW4gY29tcGFyaXNvbnMuCkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJCQkJIHVuc2lnbmVkIGxvbmcgKmFyZ3MpCiB7CiAjIGlmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgotCWlmICh0YXNrX3RocmVhZF9pbmZvKHRhc2spLT5zdGF0dXMgJiBUU19DT01QQVQpCisJaWYgKHRhc2stPnRocmVhZC5zdGF0dXMgJiBUU19DT01QQVQpCiAJCXN3aXRjaCAoaSkgewogCQljYXNlIDA6CiAJCQlpZiAoIW4tLSkgYnJlYWs7CkBAIC0xNzcsNyArMTc3LDcgQEAKIAkJCQkJIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmFyZ3MpCiB7CiAjIGlmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgotCWlmICh0YXNrX3RocmVhZF9pbmZvKHRhc2spLT5zdGF0dXMgJiBUU19DT01QQVQpCisJaWYgKHRhc2stPnRocmVhZC5zdGF0dXMgJiBUU19DT01QQVQpCiAJCXN3aXRjaCAoaSkgewogCQljYXNlIDA6CiAJCQlpZiAoIW4tLSkgYnJlYWs7CkBAIC0yMzQsMTggKzIzNCw4IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHN5c2NhbGxfZ2V0X2FyY2godm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KLQkvKgotCSAqIFRTX0NPTVBBVCBpcyBzZXQgZm9yIDMyLWJpdCBzeXNjYWxsIGVudHJ5IGFuZCB0aGVuCi0JICogcmVtYWlucyBzZXQgdW50aWwgd2UgcmV0dXJuIHRvIHVzZXIgbW9kZS4KLQkgKgotCSAqIHgzMiB0YXNrcyBzaG91bGQgYmUgY29uc2lkZXJlZCBBVURJVF9BUkNIX1g4Nl82NC4KLQkgKi8KLQlpZiAodGFza190aHJlYWRfaW5mbyhjdXJyZW50KS0+c3RhdHVzICYgVFNfQ09NUEFUKQotCQlyZXR1cm4gQVVESVRfQVJDSF9JMzg2OwotI2VuZGlmCi0JLyogQm90aCB4MzIgYW5kIHg4Nl82NCBhcmUgY29uc2lkZXJlZCAiNjQtYml0Ii4gKi8KLQlyZXR1cm4gQVVESVRfQVJDSF9YODZfNjQ7CisJLyogeDMyIHRhc2tzIHNob3VsZCBiZSBjb25zaWRlcmVkIEFVRElUX0FSQ0hfWDg2XzY0LiAqLworCXJldHVybiBpbl9pYTMyX3N5c2NhbGwoKSA/IEFVRElUX0FSQ0hfSTM4NiA6IEFVRElUX0FSQ0hfWDg2XzY0OwogfQogI2VuZGlmCS8qIENPTkZJR19YODZfMzIgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggOGI3YzhkOC4uMmFhY2E1MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC01MiwyMSArNTIsNiBAQAogI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAKLXN0cnVjdCB0aHJlYWRfaW5mbyB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOwkJLyogbWFpbiB0YXNrIHN0cnVjdHVyZSAqLwotCV9fdTMyCQkJZmxhZ3M7CQkvKiBsb3cgbGV2ZWwgZmxhZ3MgKi8KLQlfX3UzMgkJCXN0YXR1czsJCS8qIHRocmVhZCBzeW5jaHJvbm91cyBmbGFncyAqLwotCV9fdTMyCQkJY3B1OwkJLyogY3VycmVudCBDUFUgKi8KLX07Ci0KLSNkZWZpbmUgSU5JVF9USFJFQURfSU5GTyh0c2spCQkJXAotewkJCQkJCVwKLQkudGFzawkJPSAmdHNrLAkJCVwKLQkuZmxhZ3MJCT0gMCwJCQlcCi0JLmNwdQkJPSAwLAkJCVwKLX0KLQotI2RlZmluZSBpbml0X3RocmVhZF9pbmZvCShpbml0X3RocmVhZF91bmlvbi50aHJlYWRfaW5mbykKICNkZWZpbmUgaW5pdF9zdGFjawkJKGluaXRfdGhyZWFkX3VuaW9uLnN0YWNrKQogCiAjZWxzZSAvKiAhX19BU1NFTUJMWV9fICovCkBAIC05NSw3ICs4MCw2IEBACiAjZGVmaW5lIFRJRl9VUFJPQkUJCTEyCS8qIGJyZWFrcG9pbnRlZCBvciBzaW5nbGVzdGVwcGluZyAqLwogI2RlZmluZSBUSUZfTk9UU0MJCTE2CS8qIFRTQyBpcyBub3QgYWNjZXNzaWJsZSBpbiB1c2VybGFuZCAqLwogI2RlZmluZSBUSUZfSUEzMgkJMTcJLyogSUEzMiBjb21wYXRpYmlsaXR5IHByb2Nlc3MgKi8KLSNkZWZpbmUgVElGX0ZPUksJCTE4CS8qIHJldF9mcm9tX2ZvcmsgKi8KICNkZWZpbmUgVElGX05PSFoJCTE5CS8qIGluIGFkYXB0aXZlIG5vaHogbW9kZSAqLwogI2RlZmluZSBUSUZfTUVNRElFCQkyMAkvKiBpcyB0ZXJtaW5hdGluZyBkdWUgdG8gT09NIGtpbGxlciAqLwogI2RlZmluZSBUSUZfUE9MTElOR19OUkZMQUcJMjEJLyogaWRsZSBpcyBwb2xsaW5nIGZvciBUSUZfTkVFRF9SRVNDSEVEICovCkBAIC0xMTksNyArMTAzLDYgQEAKICNkZWZpbmUgX1RJRl9VUFJPQkUJCSgxIDw8IFRJRl9VUFJPQkUpCiAjZGVmaW5lIF9USUZfTk9UU0MJCSgxIDw8IFRJRl9OT1RTQykKICNkZWZpbmUgX1RJRl9JQTMyCQkoMSA8PCBUSUZfSUEzMikKLSNkZWZpbmUgX1RJRl9GT1JLCQkoMSA8PCBUSUZfRk9SSykKICNkZWZpbmUgX1RJRl9OT0haCQkoMSA8PCBUSUZfTk9IWikKICNkZWZpbmUgX1RJRl9QT0xMSU5HX05SRkxBRwkoMSA8PCBUSUZfUE9MTElOR19OUkZMQUcpCiAjZGVmaW5lIF9USUZfSU9fQklUTUFQCQkoMSA8PCBUSUZfSU9fQklUTUFQKQpAQCAtMTYwLDExICsxNDMsNiBAQAogICovCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB0aHJlYWRfaW5mbyAqY3VycmVudF90aHJlYWRfaW5mbyh2b2lkKQotewotCXJldHVybiAoc3RydWN0IHRocmVhZF9pbmZvICopKGN1cnJlbnRfdG9wX29mX3N0YWNrKCkgLSBUSFJFQURfU0laRSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjdXJyZW50X3N0YWNrX3BvaW50ZXIodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHNwOwpAQCAtMjI2LDYwICsyMDQsMTkgQEAKICMgZGVmaW5lIGNwdV9jdXJyZW50X3RvcF9vZl9zdGFjayAoY3B1X3RzcyArIFRTU19zcDApCiAjZW5kaWYKIAotLyoKLSAqIEFTTSBvcGVyYW5kIHdoaWNoIGV2YWx1YXRlcyB0byBhICd0aHJlYWRfaW5mbycgYWRkcmVzcyBvZgotICogdGhlIGN1cnJlbnQgdGFzaywgaWYgaXQgaXMga25vd24gdGhhdCAicmVnIiBpcyBleGFjdGx5ICJvZmYiCi0gKiBieXRlcyBiZWxvdyB0aGUgdG9wIG9mIHRoZSBzdGFjayBjdXJyZW50bHkuCi0gKgotICogKCBUaGUga2VybmVsIHN0YWNrJ3Mgc2l6ZSBpcyBrbm93biBhdCBidWlsZCB0aW1lLCBpdCBpcyB1c3VhbGx5Ci0gKiAgIDIgb3IgNCBwYWdlcywgYW5kIHRoZSBib3R0b20gIG9mIHRoZSBrZXJuZWwgc3RhY2sgY29udGFpbnMKLSAqICAgdGhlIHRocmVhZF9pbmZvIHN0cnVjdHVyZS4gU28gdG8gYWNjZXNzIHRoZSB0aHJlYWRfaW5mbyB2ZXJ5Ci0gKiAgIHF1aWNrbHkgZnJvbSBhc3NlbWJseSBjb2RlIHdlIGNhbiBjYWxjdWxhdGUgZG93biBmcm9tIHRoZQotICogICB0b3Agb2YgdGhlIGtlcm5lbCBzdGFjayB0byB0aGUgYm90dG9tLCB1c2luZyBjb25zdGFudCwKLSAqICAgYnVpbGQtdGltZSBjYWxjdWxhdGlvbnMgb25seS4gKQotICoKLSAqIEZvciBleGFtcGxlLCB0byBmZXRjaCB0aGUgY3VycmVudCB0aHJlYWRfaW5mby0+ZmxhZ3MgdmFsdWUgaW50byAlZWF4Ci0gKiBvbiB4ODYtNjQgZGVmY29uZmlnIGtlcm5lbHMsIGluIHN5c2NhbGwgZW50cnkgY29kZSB3aGVyZSBSU1AgaXMKLSAqIGN1cnJlbnRseSBhdCBleGFjdGx5IFNJWkVPRl9QVFJFR1MgYnl0ZXMgYXdheSBmcm9tIHRoZSB0b3Agb2YgdGhlCi0gKiBzdGFjazoKLSAqCi0gKiAgICAgIG1vdiBBU01fVEhSRUFEX0lORk8oVElfZmxhZ3MsICVyc3AsIFNJWkVPRl9QVFJFR1MpLCAlZWF4Ci0gKgotICogd2lsbCB0cmFuc2xhdGUgdG86Ci0gKgotICogICAgICA4YiA4NCAyNCBiOCBjMCBmZiBmZiAgICAgIG1vdiAgICAtMHgzZjQ4KCVyc3ApLCAlZWF4Ci0gKgotICogd2hpY2ggaXMgYmVsb3cgdGhlIGN1cnJlbnQgUlNQIGJ5IGFsbW9zdCAxNksuCi0gKi8KLSNkZWZpbmUgQVNNX1RIUkVBRF9JTkZPKGZpZWxkLCByZWcsIG9mZikgKChmaWVsZCkrKG9mZiktVEhSRUFEX1NJWkUpKHJlZykKLQogI2VuZGlmCiAKLS8qCi0gKiBUaHJlYWQtc3luY2hyb25vdXMgc3RhdHVzLgotICoKLSAqIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGZsYWdzIGluIHRoYXQgbm9ib2R5IGVsc2UKLSAqIGV2ZXIgdG91Y2hlcyBvdXIgdGhyZWFkLXN5bmNocm9ub3VzIHN0YXR1cywgc28gd2UgZG9uJ3QKLSAqIGhhdmUgdG8gd29ycnkgYWJvdXQgYXRvbWljIGFjY2Vzc2VzLgotICovCi0jZGVmaW5lIFRTX0NPTVBBVAkJMHgwMDAyCS8qIDMyYml0IHN5c2NhbGwgYWN0aXZlICg2NEJJVCkqLwogI2lmZGVmIENPTkZJR19DT01QQVQKICNkZWZpbmUgVFNfSTM4Nl9SRUdTX1BPS0VECTB4MDAwNAkvKiByZWdzIHBva2VkIGJ5IDMyLWJpdCBwdHJhY2VyICovCiAjZW5kaWYKLQogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotc3RhdGljIGlubGluZSBib29sIGluX2lhMzJfc3lzY2FsbCh2b2lkKQotewogI2lmZGVmIENPTkZJR19YODZfMzIKLQlyZXR1cm4gdHJ1ZTsKKyNkZWZpbmUgaW5faWEzMl9zeXNjYWxsKCkgdHJ1ZQorI2Vsc2UKKyNkZWZpbmUgaW5faWEzMl9zeXNjYWxsKCkgKElTX0VOQUJMRUQoQ09ORklHX0lBMzJfRU1VTEFUSU9OKSAmJiBcCisJCQkgICBjdXJyZW50LT50aHJlYWQuc3RhdHVzICYgVFNfQ09NUEFUKQogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCi0JaWYgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzICYgVFNfQ09NUEFUKQotCQlyZXR1cm4gdHJ1ZTsKLSNlbmRpZgotCXJldHVybiBmYWxzZTsKLX0KIAogLyoKICAqIEZvcmNlIHN5c2NhbGwgcmV0dXJuIHZpYSBJUkVUIGJ5IG1ha2luZyBpdCBsb29rIGFzIGlmIHRoZXJlIHdhcwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdHJhcHMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RyYXBzLmgKaW5kZXggYzM0OTY2MTkuLjAxZmQwYTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RyYXBzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdHJhcHMuaApAQCAtMTE3LDYgKzExNywxMiBAQAogZXh0ZXJuIHZvaWQgaXN0X2JlZ2luX25vbl9hdG9taWMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIHZvaWQgaXN0X2VuZF9ub25fYXRvbWljKHZvaWQpOwogCisjaWZkZWYgQ09ORklHX1ZNQVBfU1RBQ0sKK3ZvaWQgX19ub3JldHVybiBoYW5kbGVfc3RhY2tfb3ZlcmZsb3coY29uc3QgY2hhciAqbWVzc2FnZSwKKwkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGZhdWx0X2FkZHJlc3MpOworI2VuZGlmCisKIC8qIEludGVycnVwdHMvRXhjZXB0aW9ucyAqLwogZW51bSB7CiAJWDg2X1RSQVBfREUgPSAwLAkvKiAgMCwgRGl2aWRlLWJ5LXplcm8gKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCBhMGFlNjEwLi4yMTMxYzRjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC00MzMsNyArNDMzLDExIEBACiAjZGVmaW5lIF9fZ2V0X3VzZXJfYXNtX2V4KHgsIGFkZHIsIGl0eXBlLCBydHlwZSwgbHR5cGUpCQkJXAogCWFzbSB2b2xhdGlsZSgiMToJbW92Iml0eXBlIiAlMSwlInJ0eXBlIjBcbiIJCVwKIAkJICAgICAiMjpcbiIJCQkJCQlcCi0JCSAgICAgX0FTTV9FWFRBQkxFX0VYKDFiLCAyYikJCQkJXAorCQkgICAgICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICIzOnhvciJpdHlwZSIgJSJydHlwZSIwLCUicnR5cGUiMFxuIgkJXAorCQkgICAgICIgIGptcCAyYlxuIgkJCQkJXAorCQkgICAgICIucHJldmlvdXNcbiIJCQkJCVwKKwkJICAgICBfQVNNX0VYVEFCTEVfRVgoMWIsIDNiKQkJCQlcCiAJCSAgICAgOiBsdHlwZSh4KSA6ICJtIiAoX19tKGFkZHIpKSkKIAogI2RlZmluZSBfX3B1dF91c2VyX25vY2hlY2soeCwgcHRyLCBzaXplKQkJCVwKQEAgLTY5Nyw0NCArNzAxLDE1IEBACiB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjayBfY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwKIAkJCQkJIHVuc2lnbmVkIG4pOwogCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTCi0jIGRlZmluZSBjb3B5X3VzZXJfZGlhZyBfX2NvbXBpbGV0aW1lX2Vycm9yCi0jZWxzZQotIyBkZWZpbmUgY29weV91c2VyX2RpYWcgX19jb21waWxldGltZV93YXJuaW5nCi0jZW5kaWYKK2V4dGVybiB2b2lkIF9fY29tcGlsZXRpbWVfZXJyb3IoInVzZXJjb3B5IGJ1ZmZlciBzaXplIGlzIHRvbyBzbWFsbCIpCitfX2JhZF9jb3B5X3VzZXIodm9pZCk7CiAKLWV4dGVybiB2b2lkIGNvcHlfdXNlcl9kaWFnKCJjb3B5X2Zyb21fdXNlcigpIGJ1ZmZlciBzaXplIGlzIHRvbyBzbWFsbCIpCi1jb3B5X2Zyb21fdXNlcl9vdmVyZmxvdyh2b2lkKTsKLWV4dGVybiB2b2lkIGNvcHlfdXNlcl9kaWFnKCJjb3B5X3RvX3VzZXIoKSBidWZmZXIgc2l6ZSBpcyB0b28gc21hbGwiKQotY29weV90b191c2VyX292ZXJmbG93KHZvaWQpIF9fYXNtX18oImNvcHlfZnJvbV91c2VyX292ZXJmbG93Iik7Ci0KLSN1bmRlZiBjb3B5X3VzZXJfZGlhZwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTCi0KLWV4dGVybiB2b2lkCi1fX2NvbXBpbGV0aW1lX3dhcm5pbmcoImNvcHlfZnJvbV91c2VyKCkgYnVmZmVyIHNpemUgaXMgbm90IHByb3ZhYmx5IGNvcnJlY3QiKQotX19jb3B5X2Zyb21fdXNlcl9vdmVyZmxvdyh2b2lkKSBfX2FzbV9fKCJjb3B5X2Zyb21fdXNlcl9vdmVyZmxvdyIpOwotI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX292ZXJmbG93KHNpemUsIGNvdW50KSBfX2NvcHlfZnJvbV91c2VyX292ZXJmbG93KCkKLQotZXh0ZXJuIHZvaWQKLV9fY29tcGlsZXRpbWVfd2FybmluZygiY29weV90b191c2VyKCkgYnVmZmVyIHNpemUgaXMgbm90IHByb3ZhYmx5IGNvcnJlY3QiKQotX19jb3B5X3RvX3VzZXJfb3ZlcmZsb3codm9pZCkgX19hc21fXygiY29weV9mcm9tX3VzZXJfb3ZlcmZsb3ciKTsKLSNkZWZpbmUgX19jb3B5X3RvX3VzZXJfb3ZlcmZsb3coc2l6ZSwgY291bnQpIF9fY29weV90b191c2VyX292ZXJmbG93KCkKLQotI2Vsc2UKLQotc3RhdGljIGlubGluZSB2b2lkCi1fX2NvcHlfZnJvbV91c2VyX292ZXJmbG93KGludCBzaXplLCB1bnNpZ25lZCBsb25nIGNvdW50KQorc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdXNlcl9vdmVyZmxvdyhpbnQgc2l6ZSwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKIAlXQVJOKDEsICJCdWZmZXIgb3ZlcmZsb3cgZGV0ZWN0ZWQgKCVkIDwgJWx1KSFcbiIsIHNpemUsIGNvdW50KTsKIH0KIAotI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9vdmVyZmxvdyBfX2NvcHlfZnJvbV91c2VyX292ZXJmbG93Ci0KLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCiBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlpbnQgc3ogPSBfX2NvbXBpbGV0aW1lX29iamVjdF9zaXplKHRvKTsKQEAgLTc0MywzNiArNzE4LDE4IEBACiAKIAlrYXNhbl9jaGVja193cml0ZSh0bywgbik7CiAKLQkvKgotCSAqIFdoaWxlIHdlIHdvdWxkIGxpa2UgdG8gaGF2ZSB0aGUgY29tcGlsZXIgZG8gdGhlIGNoZWNraW5nIGZvciB1cwotCSAqIGV2ZW4gaW4gdGhlIG5vbi1jb25zdGFudCBzaXplIGNhc2UsIGFueSBmYWxzZSBwb3NpdGl2ZXMgdGhlcmUgYXJlCi0JICogYSBwcm9ibGVtIChlc3BlY2lhbGx5IHdoZW4gREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1MsIGJ1dCBldmVuCi0JICogd2l0aG91dCAtIHRoZSBbaG9wZWZ1bGx5XSBkYW5nZXJvdXMgbG9va2luZyBuYXR1cmUgb2YgdGhlIHdhcm5pbmcKLQkgKiB3b3VsZCBtYWtlIHBlb3BsZSBnbyBsb29rIGF0IHRoZSByZXNwZWNpdGl2ZSBjYWxsIHNpdGVzIG92ZXIgYW5kCi0JICogb3ZlciBhZ2FpbiBqdXN0IHRvIGZpbmQgdGhhdCB0aGVyZSdzIG5vIHByb2JsZW0pLgotCSAqCi0JICogQW5kIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSBpdCdzIGp1c3Qgbm90IHJlYWxpc3RpYyBmb3IgdGhlIGNvbXBpbGVyCi0JICogdG8gcHJvdmUgdGhlIGNvdW50IHRvIGJlIGluIHJhbmdlLiBGb3IgZXhhbXBsZSB3aGVuIG11bHRpcGxlIGNhbGwKLQkgKiBzaXRlcyBvZiBhIGhlbHBlciBmdW5jdGlvbiAtIHBlcmhhcHMgaW4gZGlmZmVyZW50IHNvdXJjZSBmaWxlcyAtCi0JICogYWxsIGRvaW5nIHByb3BlciByYW5nZSBjaGVja2luZywgeWV0IHRoZSBoZWxwZXIgZnVuY3Rpb24gbm90IGRvaW5nCi0JICogc28gYWdhaW4uCi0JICoKLQkgKiBUaGVyZWZvcmUgbGltaXQgdGhlIGNvbXBpbGUgdGltZSBjaGVja2luZyB0byB0aGUgY29uc3RhbnQgc2l6ZQotCSAqIGNhc2UsIGFuZCBkbyBvbmx5IHJ1bnRpbWUgY2hlY2tpbmcgZm9yIG5vbi1jb25zdGFudCBzaXplcy4KLQkgKi8KLQogCWlmIChsaWtlbHkoc3ogPCAwIHx8IHN6ID49IG4pKSB7CiAJCWNoZWNrX29iamVjdF9zaXplKHRvLCBuLCBmYWxzZSk7CiAJCW4gPSBfY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOwotCX0gZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AobikpCi0JCWNvcHlfZnJvbV91c2VyX292ZXJmbG93KCk7CisJfSBlbHNlIGlmICghX19idWlsdGluX2NvbnN0YW50X3AobikpCisJCWNvcHlfdXNlcl9vdmVyZmxvdyhzeiwgbik7CiAJZWxzZQotCQlfX2NvcHlfZnJvbV91c2VyX292ZXJmbG93KHN6LCBuKTsKKwkJX19iYWRfY29weV91c2VyKCk7CiAKIAlyZXR1cm4gbjsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjaworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawogY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogCWludCBzeiA9IF9fY29tcGlsZXRpbWVfb2JqZWN0X3NpemUoZnJvbSk7CkBAIC03ODEsMjEgKzczOCwxNyBAQAogCiAJbWlnaHRfZmF1bHQoKTsKIAotCS8qIFNlZSB0aGUgY29tbWVudCBpbiBjb3B5X2Zyb21fdXNlcigpIGFib3ZlLiAqLwogCWlmIChsaWtlbHkoc3ogPCAwIHx8IHN6ID49IG4pKSB7CiAJCWNoZWNrX29iamVjdF9zaXplKGZyb20sIG4sIHRydWUpOwogCQluID0gX2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbik7Ci0JfSBlbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKLQkJY29weV90b191c2VyX292ZXJmbG93KCk7CisJfSBlbHNlIGlmICghX19idWlsdGluX2NvbnN0YW50X3AobikpCisJCWNvcHlfdXNlcl9vdmVyZmxvdyhzeiwgbik7CiAJZWxzZQotCQlfX2NvcHlfdG9fdXNlcl9vdmVyZmxvdyhzeiwgbik7CisJCV9fYmFkX2NvcHlfdXNlcigpOwogCiAJcmV0dXJuIG47CiB9CiAKLSN1bmRlZiBfX2NvcHlfZnJvbV91c2VyX292ZXJmbG93Ci0jdW5kZWYgX19jb3B5X3RvX3VzZXJfb3ZlcmZsb3cKLQogLyoKICAqIFdlIHJlbHkgb24gdGhlIG5lc3RlZCBOTUkgd29yayB0byBhbGxvdyBhdG9taWMgZmF1bHRzIGZyb20gdGhlIE5NSSBwYXRoOyB0aGUKICAqIG5lc3RlZCBOTUkgcGF0aHMgYXJlIGNhcmVmdWwgdG8gcHJlc2VydmUgQ1IyLgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdW53aW5kLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bndpbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGI2ZDFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdW53aW5kLmgKQEAgLTAsMCArMSw3MyBAQAorI2lmbmRlZiBfQVNNX1g4Nl9VTldJTkRfSAorI2RlZmluZSBfQVNNX1g4Nl9VTldJTkRfSAorCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KKworc3RydWN0IHVud2luZF9zdGF0ZSB7CisJc3RydWN0IHN0YWNrX2luZm8gc3RhY2tfaW5mbzsKKwl1bnNpZ25lZCBsb25nIHN0YWNrX21hc2s7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCWludCBncmFwaF9pZHg7CisjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKKwl1bnNpZ25lZCBsb25nICpicDsKKyNlbHNlCisJdW5zaWduZWQgbG9uZyAqc3A7CisjZW5kaWYKK307CisKK3ZvaWQgX191bndpbmRfc3RhcnQoc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nICpmaXJzdF9mcmFtZSk7CisKK2Jvb2wgdW53aW5kX25leHRfZnJhbWUoc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUpOworCitzdGF0aWMgaW5saW5lIGJvb2wgdW53aW5kX2RvbmUoc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUpCit7CisJcmV0dXJuIHN0YXRlLT5zdGFja19pbmZvLnR5cGUgPT0gU1RBQ0tfVFlQRV9VTktOT1dOOworfQorCitzdGF0aWMgaW5saW5lCit2b2lkIHVud2luZF9zdGFydChzdHJ1Y3QgdW53aW5kX3N0YXRlICpzdGF0ZSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkgIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nICpmaXJzdF9mcmFtZSkKK3sKKwlmaXJzdF9mcmFtZSA9IGZpcnN0X2ZyYW1lID8gOiBnZXRfc3RhY2tfcG9pbnRlcih0YXNrLCByZWdzKTsKKworCV9fdW53aW5kX3N0YXJ0KHN0YXRlLCB0YXNrLCByZWdzLCBmaXJzdF9mcmFtZSk7Cit9CisKKyNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgorCitzdGF0aWMgaW5saW5lCit1bnNpZ25lZCBsb25nICp1bndpbmRfZ2V0X3JldHVybl9hZGRyZXNzX3B0cihzdHJ1Y3QgdW53aW5kX3N0YXRlICpzdGF0ZSkKK3sKKwlpZiAodW53aW5kX2RvbmUoc3RhdGUpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBzdGF0ZS0+YnAgKyAxOworfQorCit1bnNpZ25lZCBsb25nIHVud2luZF9nZXRfcmV0dXJuX2FkZHJlc3Moc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUpOworCisjZWxzZSAvKiAhQ09ORklHX0ZSQU1FX1BPSU5URVIgKi8KKworc3RhdGljIGlubGluZQordW5zaWduZWQgbG9uZyAqdW53aW5kX2dldF9yZXR1cm5fYWRkcmVzc19wdHIoc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3Vuc2lnbmVkIGxvbmcgdW53aW5kX2dldF9yZXR1cm5fYWRkcmVzcyhzdHJ1Y3QgdW53aW5kX3N0YXRlICpzdGF0ZSkKK3sKKwlpZiAodW53aW5kX2RvbmUoc3RhdGUpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBmdHJhY2VfZ3JhcGhfcmV0X2FkZHIoc3RhdGUtPnRhc2ssICZzdGF0ZS0+Z3JhcGhfaWR4LAorCQkJCSAgICAgKnN0YXRlLT5zcCwgc3RhdGUtPnNwKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19GUkFNRV9QT0lOVEVSICovCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9VTldJTkRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91di91dl9iYXUuaAppbmRleCBjYzQ0ZDkyLi41N2FiODZkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91di91dl9iYXUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91di91dl9iYXUuaApAQCAtNDksMTQgKzQ5LDEyIEBACiAjZGVmaW5lIFVWX05FVF9FTkRQT0lOVF9JTlRECQkoaXNfdXYxX2h1YigpID8JCQlcCiAJCQlVVjFfTkVUX0VORFBPSU5UX0lOVEQgOiBVVjJfTkVUX0VORFBPSU5UX0lOVEQpCiAjZGVmaW5lIFVWX0RFU0NfUFNISUZUCQkJNDkKLSNkZWZpbmUgVVZfUEFZTE9BRFFfUE5PREVfU0hJRlQJCTQ5CisjZGVmaW5lIFVWX1BBWUxPQURRX0dOT0RFX1NISUZUCQk0OQogI2RlZmluZSBVVl9QVENfQkFTRU5BTUUJCQkic2dpX3V2L3B0Y19zdGF0aXN0aWNzIgogI2RlZmluZSBVVl9CQVVfQkFTRU5BTUUJCQkic2dpX3V2L2JhdV90dW5hYmxlcyIKICNkZWZpbmUgVVZfQkFVX1RVTkFCTEVTX0RJUgkJInNnaV91diIKICNkZWZpbmUgVVZfQkFVX1RVTkFCTEVTX0ZJTEUJCSJiYXVfdHVuYWJsZXMiCiAjZGVmaW5lIFdISVRFU1BBQ0UJCQkiIFx0XG4iCi0jZGVmaW5lIHV2X21tYXNrCQkJKCgxVUwgPDwgdXZfaHViX2luZm8tPm1fdmFsKSAtIDEpCi0jZGVmaW5lIHV2X3BoeXNub2RlYWRkcih4KQkJKChfX3BhKCh1bnNpZ25lZCBsb25nKSh4KSkgJiB1dl9tbWFzaykpCiAjZGVmaW5lIGNwdWJpdF9pc3NldChjcHUsIGJhdV9sb2NhbF9jcHVtYXNrKSBcCiAJdGVzdF9iaXQoKGNwdSksIChiYXVfbG9jYWxfY3B1bWFzaykuYml0cykKIApAQCAtMzg3LDYgKzM4NSwxNyBAQAogCS8qIGJpdHMgMTI3OjEyMCAqLwogfTsKIAorLyogQWJzdHJhY3RlZCBCQVUgZnVuY3Rpb25zICovCitzdHJ1Y3QgYmF1X29wZXJhdGlvbnMgeworCXVuc2lnbmVkIGxvbmcgKCpyZWFkX2xfc3dfYWNrKSh2b2lkKTsKKwl1bnNpZ25lZCBsb25nICgqcmVhZF9nX3N3X2FjaykoaW50IHBub2RlKTsKKwl1bnNpZ25lZCBsb25nICgqYmF1X2dwYV90b19vZmZzZXQpKHVuc2lnbmVkIGxvbmcgdmFkZHIpOworCXZvaWQgKCp3cml0ZV9sX3N3X2FjaykodW5zaWduZWQgbG9uZyBtbXIpOworCXZvaWQgKCp3cml0ZV9nX3N3X2FjaykoaW50IHBub2RlLCB1bnNpZ25lZCBsb25nIG1tcik7CisJdm9pZCAoKndyaXRlX3BheWxvYWRfZmlyc3QpKGludCBwbm9kZSwgdW5zaWduZWQgbG9uZyBtbXIpOworCXZvaWQgKCp3cml0ZV9wYXlsb2FkX2xhc3QpKGludCBwbm9kZSwgdW5zaWduZWQgbG9uZyBtbXIpOworfTsKKwogLyoKICAqIFRoZSBhY3RpdmF0aW9uIGRlc2NyaXB0b3I6CiAgKiBUaGUgZm9ybWF0IG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQsIHBsdXMgYWxsIGFjY29tcGFueWluZyBjb250cm9sCkBAIC02NTUsNiArNjY0LDE2IEBACiAJd3JpdGVfZ21tcihwbm9kZSwgVVZIX0xCX0JBVV9TQl9BQ1RJVkFUSU9OX0NPTlRST0wsIG1tcl9pbWFnZSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9tbXJfcHJvY19wYXlsb2FkX2ZpcnN0KGludCBwbm9kZSwgdW5zaWduZWQgbG9uZyBtbXJfaW1hZ2UpCit7CisJd3JpdGVfZ21tcihwbm9kZSwgVVY0SF9MQl9QUk9DX0lOVERfUVVFVUVfRklSU1QsIG1tcl9pbWFnZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9tbXJfcHJvY19wYXlsb2FkX2xhc3QoaW50IHBub2RlLCB1bnNpZ25lZCBsb25nIG1tcl9pbWFnZSkKK3sKKwl3cml0ZV9nbW1yKHBub2RlLCBVVjRIX0xCX1BST0NfSU5URF9RVUVVRV9MQVNULCBtbXJfaW1hZ2UpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbW1yX3BheWxvYWRfZmlyc3QoaW50IHBub2RlLCB1bnNpZ25lZCBsb25nIG1tcl9pbWFnZSkKIHsKIAl3cml0ZV9nbW1yKHBub2RlLCBVVkhfTEJfQkFVX0lOVERfUEFZTE9BRF9RVUVVRV9GSVJTVCwgbW1yX2ltYWdlKTsKQEAgLTcwMCw2ICs3MTksMjYgQEAKIAlyZXR1cm4gcmVhZF9nbW1yKHBub2RlLCBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0UpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbW1yX3Byb2Nfc3dfYWNrKHVuc2lnbmVkIGxvbmcgbXIpCit7CisJdXZfd3JpdGVfbG9jYWxfbW1yKFVWNEhfTEJfUFJPQ19JTlREX1NPRlRfQUNLX0NMRUFSLCBtcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9nbW1yX3Byb2Nfc3dfYWNrKGludCBwbm9kZSwgdW5zaWduZWQgbG9uZyBtcikKK3sKKwl3cml0ZV9nbW1yKHBub2RlLCBVVjRIX0xCX1BST0NfSU5URF9TT0ZUX0FDS19DTEVBUiwgbXIpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9tbXJfcHJvY19zd19hY2sodm9pZCkKK3sKKwlyZXR1cm4gcmVhZF9sbW1yKFVWNEhfTEJfUFJPQ19JTlREX1NPRlRfQUNLX1BFTkRJTkcpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9nbW1yX3Byb2Nfc3dfYWNrKGludCBwbm9kZSkKK3sKKwlyZXR1cm4gcmVhZF9nbW1yKHBub2RlLCBVVjRIX0xCX1BST0NfSU5URF9TT0ZUX0FDS19QRU5ESU5HKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX21tcl9kYXRhX2NvbmZpZyhpbnQgcG5vZGUsIHVuc2lnbmVkIGxvbmcgbXIpCiB7CiAJdXZfd3JpdGVfZ2xvYmFsX21tcjY0KHBub2RlLCBVVkhfQkFVX0RBVEFfQ09ORklHLCBtcik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92ZHNvLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92ZHNvLmgKaW5kZXggNDNkYzU1Yi4uMjQ0NDE4OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdmRzby5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zkc28uaApAQCAtNDEsNiArNDEsOCBAQAogCiBleHRlcm4gdm9pZCBfX2luaXQgaW5pdF92ZHNvX2ltYWdlKGNvbnN0IHN0cnVjdCB2ZHNvX2ltYWdlICppbWFnZSk7CiAKK2V4dGVybiBpbnQgbWFwX3Zkc29fb25jZShjb25zdCBzdHJ1Y3QgdmRzb19pbWFnZSAqaW1hZ2UsIHVuc2lnbmVkIGxvbmcgYWRkcik7CisKICNlbmRpZiAvKiBfX0FTU0VNQkxFUl9fICovCiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9WRFNPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vbWNlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL21jZS5oCmluZGV4IDIxODQ5NDMuLjY5YTZlMDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vbWNlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9tY2UuaApAQCAtMjYsNiArMjYsOCBAQAogCV9fdTMyIHNvY2tldGlkOwkvKiBDUFUgc29ja2V0IElEICovCiAJX191MzIgYXBpY2lkOwkvKiBDUFUgaW5pdGlhbCBhcGljIElEICovCiAJX191NjQgbWNnY2FwOwkvKiBNQ0dDQVAgTVNSOiBtYWNoaW5lIGNoZWNrIGNhcGFiaWxpdGllcyBvZiBDUFUgKi8KKwlfX3U2NCBzeW5kOwkvKiBNQ0FfU1lORCBNU1I6IG9ubHkgdmFsaWQgb24gU01DQSBzeXN0ZW1zICovCisJX191NjQgaXBpZDsJLyogTUNBX0lQSUQgTVNSOiBvbmx5IHZhbGlkIG9uIFNNQ0Egc3lzdGVtcyAqLwogfTsKIAogI2RlZmluZSBNQ0VfR0VUX1JFQ09SRF9MRU4gICBfSU9SKCdNJywgMSwgaW50KQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9wcmN0bC5oIGIvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9wcmN0bC5oCmluZGV4IDNhYzUwMzIuLmFlMTM1ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vcHJjdGwuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL3ByY3RsLmgKQEAgLTYsNCArNiwxMCBAQAogI2RlZmluZSBBUkNIX0dFVF9GUyAweDEwMDMKICNkZWZpbmUgQVJDSF9HRVRfR1MgMHgxMDA0CiAKKyNpZmRlZiBDT05GSUdfQ0hFQ0tQT0lOVF9SRVNUT1JFCisjIGRlZmluZSBBUkNIX01BUF9WRFNPX1gzMgkweDIwMDEKKyMgZGVmaW5lIEFSQ0hfTUFQX1ZEU09fMzIJMHgyMDAyCisjIGRlZmluZSBBUkNIX01BUF9WRFNPXzY0CTB4MjAwMworI2VuZGlmCisKICNlbmRpZiAvKiBfQVNNX1g4Nl9QUkNUTF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUKaW5kZXggMDUwM2Y1Yi4uNDUyNTdjZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQpAQCAtMTI1LDYgKzEyNSwxMiBAQAogb2JqLSQoQ09ORklHX1BFUkZfRVZFTlRTKQkJKz0gcGVyZl9yZWdzLm8KIG9iai0kKENPTkZJR19UUkFDSU5HKQkJCSs9IHRyYWNlcG9pbnQubwogCitpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgorb2JqLXkJCQkJCSs9IHVud2luZF9mcmFtZS5vCitlbHNlCitvYmoteQkJCQkJKz0gdW53aW5kX2d1ZXNzLm8KK2VuZGlmCisKICMjIwogIyA2NCBiaXQgc3BlY2lmaWMgZmlsZXMKIGlmZXEgKCQoQ09ORklHX1g4Nl82NCkseSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL01ha2VmaWxlIGIvYXJjaC94ODYva2VybmVsL2FjcGkvTWFrZWZpbGUKaW5kZXggMzI0MmU1OS4uMjZiNzhkOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FjcGkvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva2VybmVsL2FjcGkvTWFrZWZpbGUKQEAgLTEsNiArMSw3IEBACiBvYmotJChDT05GSUdfQUNQSSkJCSs9IGJvb3Qubwogb2JqLSQoQ09ORklHX0FDUElfU0xFRVApCSs9IHNsZWVwLm8gd2FrZXVwXyQoQklUUykubwogb2JqLSQoQ09ORklHX0FDUElfQVBFSSkJCSs9IGFwZWkubworb2JqLSQoQ09ORklHX0FDUElfQ1BQQ19MSUIpCSs9IGNwcGNfbXNyLm8KIAogaWZuZXEgKCQoQ09ORklHX0FDUElfUFJPQ0VTU09SKSwpCiBvYmoteQkJCQkrPSBjc3RhdGUubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jCmluZGV4IDkwZDg0YzMuLjMyYTdkNzAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMKQEAgLTE3NiwxNSArMTc2LDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmICghZW5hYmxlZCkgewotCQkrK2Rpc2FibGVkX2NwdXM7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCWlmIChib290X2NwdV9waHlzaWNhbF9hcGljaWQgIT0gLTFVKQotCQl2ZXIgPSBhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXTsKKwkJdmVyID0gYm9vdF9jcHVfYXBpY192ZXJzaW9uOwogCi0JY3B1ID0gZ2VuZXJpY19wcm9jZXNzb3JfaW5mbyhpZCwgdmVyKTsKKwljcHUgPSBfX2dlbmVyaWNfcHJvY2Vzc29yX2luZm8oaWQsIHZlciwgZW5hYmxlZCk7CiAJaWYgKGNwdSA+PSAwKQogCQllYXJseV9wZXJfY3B1KHg4Nl9jcHVfdG9fYWNwaWlkLCBjcHUpID0gYWNwaWlkOwogCkBAIC0yODIsNiArMjc3LDggQEAKIAlpZiAoQkFEX01BRFRfRU5UUlkobGFwaWNfYWRkcl9vdnIsIGVuZCkpCiAJCXJldHVybiAtRUlOVkFMOwogCisJYWNwaV90YWJsZV9wcmludF9tYWR0X2VudHJ5KGhlYWRlcik7CisKIAlhY3BpX2xhcGljX2FkZHIgPSBsYXBpY19hZGRyX292ci0+YWRkcmVzczsKIAogCXJldHVybiAwOwpAQCAtNzA1LDcgKzcwMiw3IEBACiAjaWZkZWYgQ09ORklHX0FDUElfSE9UUExVR19DUFUKICNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgogCi1zdGF0aWMgdm9pZCBhY3BpX21hcF9jcHUybm9kZShhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBjcHUsIGludCBwaHlzaWQpCitpbnQgYWNwaV9tYXBfY3B1Mm5vZGUoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgY3B1LCBpbnQgcGh5c2lkKQogewogI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKIAlpbnQgbmlkOwpAQCAtNzE2LDYgKzcxMyw3IEBACiAJCW51bWFfc2V0X25vZGUoY3B1LCBuaWQpOwogCX0KICNlbmRpZgorCXJldHVybiAwOwogfQogCiBpbnQgYWNwaV9tYXBfY3B1KGFjcGlfaGFuZGxlIGhhbmRsZSwgcGh5c19jcHVpZF90IHBoeXNpZCwgaW50ICpwY3B1KQpAQCAtOTk4LDIxICs5OTYsNiBAQAogCWlmICghYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FQSUMpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCS8qCi0JICogTm90ZSB0aGF0IHRoZSBMQVBJQyBhZGRyZXNzIGlzIG9idGFpbmVkIGZyb20gdGhlIE1BRFQgKDMyLWJpdCB2YWx1ZSkKLQkgKiBhbmQgKG9wdGlvbmFsbHkpIG92ZXJyaWRkZW4gYnkgYSBMQVBJQ19BRERSX09WUiBlbnRyeSAoNjQtYml0IHZhbHVlKS4KLQkgKi8KLQotCWNvdW50ID0gYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9UWVBFX0xPQ0FMX0FQSUNfT1ZFUlJJREUsCi0JCQkJICAgICAgYWNwaV9wYXJzZV9sYXBpY19hZGRyX292ciwgMCk7Ci0JaWYgKGNvdW50IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCi0JCSAgICAgICAiRXJyb3IgcGFyc2luZyBMQVBJQyBhZGRyZXNzIG92ZXJyaWRlIGVudHJ5XG4iKTsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXJlZ2lzdGVyX2xhcGljX2FkZHJlc3MoYWNwaV9sYXBpY19hZGRyKTsKLQogCWNvdW50ID0gYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9UWVBFX0xPQ0FMX1NBUElDLAogCQkJCSAgICAgIGFjcGlfcGFyc2Vfc2FwaWMsIE1BWF9MT0NBTF9BUElDKTsKIApAQCAtMTAzMSw4ICsxMDE0LDggQEAKIAkJCXJldHVybiByZXQ7CiAJCX0KIAotCQl4MmNvdW50ID0gbWFkdF9wcm9jWzBdLmNvdW50OwotCQljb3VudCA9IG1hZHRfcHJvY1sxXS5jb3VudDsKKwkJY291bnQgPSBtYWR0X3Byb2NbMF0uY291bnQ7CisJCXgyY291bnQgPSBtYWR0X3Byb2NbMV0uY291bnQ7CiAJfQogCWlmICghY291bnQgJiYgIXgyY291bnQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiTm8gTEFQSUMgZW50cmllcyBwcmVzZW50XG4iKTsKQEAgLTE1MTMsNyArMTQ5Niw3IEBACiAJICogSWYgYWNwaV9kaXNhYmxlZCwgYmFpbCBvdXQKIAkgKi8KIAlpZiAoYWNwaV9kaXNhYmxlZCkKLQkJcmV0dXJuOyAKKwkJcmV0dXJuOwogCiAJLyoKIAkgKiBJbml0aWFsaXplIHRoZSBBQ1BJIGJvb3QtdGltZSB0YWJsZSBwYXJzZXIuCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9jcHBjX21zci5jIGIvYXJjaC94ODYva2VybmVsL2FjcGkvY3BwY19tc3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmI0NzhiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYva2VybmVsL2FjcGkvY3BwY19tc3IuYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogY3BwY19tc3IuYzogIE1TUiBJbnRlcmZhY2UgZm9yIENQUEMKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8YWNwaS9jcHBjX2FjcGkuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisKKy8qIFJlZmVyIHRvIGRyaXZlcnMvYWNwaS9jcHBjX2FjcGkuYyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIGZ1bmN0aW9ucyAqLworCitib29sIGNwY19mZmhfc3VwcG9ydGVkKHZvaWQpCit7CisJcmV0dXJuIHRydWU7Cit9CisKK2ludCBjcGNfcmVhZF9mZmgoaW50IGNwdW51bSwgc3RydWN0IGNwY19yZWcgKnJlZywgdTY0ICp2YWwpCit7CisJaW50IGVycjsKKworCWVyciA9IHJkbXNybF9zYWZlX29uX2NwdShjcHVudW0sIHJlZy0+YWRkcmVzcywgdmFsKTsKKwlpZiAoIWVycikgeworCQl1NjQgbWFzayA9IEdFTk1BU0tfVUxMKHJlZy0+Yml0X29mZnNldCArIHJlZy0+Yml0X3dpZHRoIC0gMSwKKwkJCQkgICAgICAgcmVnLT5iaXRfb2Zmc2V0KTsKKworCQkqdmFsICY9IG1hc2s7CisJCSp2YWwgPj49IHJlZy0+Yml0X29mZnNldDsKKwl9CisJcmV0dXJuIGVycjsKK30KKworaW50IGNwY193cml0ZV9mZmgoaW50IGNwdW51bSwgc3RydWN0IGNwY19yZWcgKnJlZywgdTY0IHZhbCkKK3sKKwl1NjQgcmRfdmFsOworCWludCBlcnI7CisKKwllcnIgPSByZG1zcmxfc2FmZV9vbl9jcHUoY3B1bnVtLCByZWctPmFkZHJlc3MsICZyZF92YWwpOworCWlmICghZXJyKSB7CisJCXU2NCBtYXNrID0gR0VOTUFTS19VTEwocmVnLT5iaXRfb2Zmc2V0ICsgcmVnLT5iaXRfd2lkdGggLSAxLAorCQkJCSAgICAgICByZWctPmJpdF9vZmZzZXQpOworCisJCXZhbCA8PD0gcmVnLT5iaXRfb2Zmc2V0OworCQl2YWwgJj0gbWFzazsKKwkJcmRfdmFsICY9IH5tYXNrOworCQlyZF92YWwgfD0gdmFsOworCQllcnIgPSB3cm1zcmxfc2FmZV9vbl9jcHUoY3B1bnVtLCByZWctPmFkZHJlc3MsIHJkX3ZhbCk7CisJfQorCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jIGIvYXJjaC94ODYva2VybmVsL2FjcGkvc2xlZXAuYwppbmRleCBhZGIzZWFmLi40ODU4NzMzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL3NsZWVwLmMKQEAgLTk5LDcgKzk5LDcgQEAKIAlzYXZlZF9tYWdpYyA9IDB4MTIzNDU2Nzg7CiAjZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KICNpZmRlZiBDT05GSUdfU01QCi0Jc3RhY2tfc3RhcnQgPSAodW5zaWduZWQgbG9uZyl0ZW1wX3N0YWNrICsgc2l6ZW9mKHRlbXBfc3RhY2spOworCWluaXRpYWxfc3RhY2sgPSAodW5zaWduZWQgbG9uZyl0ZW1wX3N0YWNrICsgc2l6ZW9mKHRlbXBfc3RhY2spOwogCWVhcmx5X2dkdF9kZXNjci5hZGRyZXNzID0KIAkJCSh1bnNpZ25lZCBsb25nKWdldF9jcHVfZ2R0X3RhYmxlKHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJaW5pdGlhbF9ncyA9IHBlcl9jcHVfb2Zmc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKaW5kZXggY2VhNGZjMS4uZjI2NmI4YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYwpAQCAtNjQsNiArNjQsOCBAQAogdW5zaWduZWQgaW50IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IC0xVTsKIEVYUE9SVF9TWU1CT0xfR1BMKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7CiAKK3U4IGJvb3RfY3B1X2FwaWNfdmVyc2lvbjsKKwogLyoKICAqIFRoZSBoaWdoZXN0IEFQSUMgSUQgc2VlbiBkdXJpbmcgZW51bWVyYXRpb24uCiAgKi8KQEAgLTEzNzQsNyArMTM3Niw2IEBACiAJICogQWN0dWFsbHkgZGlzYWJsaW5nIHRoZSBmb2N1cyBDUFUgY2hlY2sganVzdCBtYWtlcyB0aGUgaGFuZyBsZXNzCiAJICogZnJlcXVlbnQgYXMgaXQgbWFrZXMgdGhlIGludGVycnVwdCBkaXN0cmlidXRvbiBtb2RlbCBiZSBtb3JlCiAJICogbGlrZSBMUlUgdGhhbiBNUlUgKHRoZSBzaG9ydC10ZXJtIGxvYWQgaXMgbW9yZSBldmVuIGFjcm9zcyBDUFVzKS4KLQkgKiBTZWUgYWxzbyB0aGUgY29tbWVudCBpbiBlbmRfbGV2ZWxfaW9hcGljX2lycSgpLiAgLS1tYWNybwogCSAqLwogCiAJLyoKQEAgLTE2MjMsNiArMTYyNCw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0LCBpcl9zdGF0OwogCisJaWYgKHNraXBfaW9hcGljX3NldHVwKQorCQlyZXR1cm47CisKIAlpcl9zdGF0ID0gaXJxX3JlbWFwcGluZ19wcmVwYXJlKCk7CiAJaWYgKGlyX3N0YXQgPCAwICYmICF4MmFwaWNfc3VwcG9ydGVkKCkpCiAJCXJldHVybjsKQEAgLTE4MTMsOCArMTgxNyw3IEBACiAJCSAqIHNpbmNlIHNtcF9zYW5pdHlfY2hlY2sgaXMgcHJlcGFyZWQgZm9yIHN1Y2ggYSBjYXNlCiAJCSAqIGFuZCBkaXNhYmxlIHNtcCBtb2RlCiAJCSAqLwotCQlhcGljX3ZlcnNpb25bbmV3X2FwaWNpZF0gPQotCQkJIEdFVF9BUElDX1ZFUlNJT04oYXBpY19yZWFkKEFQSUNfTFZSKSk7CisJCWJvb3RfY3B1X2FwaWNfdmVyc2lvbiA9IEdFVF9BUElDX1ZFUlNJT04oYXBpY19yZWFkKEFQSUNfTFZSKSk7CiAJfQogfQogCkBAIC0xODI1LDE3ICsxODI4LDE0IEBACiAJaWYgKCF4MmFwaWNfbW9kZSkgewogCQlzZXRfZml4bWFwX25vY2FjaGUoRklYX0FQSUNfQkFTRSwgYWRkcmVzcyk7CiAJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIm1hcHBlZCBBUElDIHRvICUxNmx4ICglMTZseClcbiIsCi0JCQkgICAgQVBJQ19CQVNFLCBtcF9sYXBpY19hZGRyKTsKKwkJCSAgICBBUElDX0JBU0UsIGFkZHJlc3MpOwogCX0KIAlpZiAoYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID09IC0xVSkgewogCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgID0gcmVhZF9hcGljX2lkKCk7Ci0JCWFwaWNfdmVyc2lvbltib290X2NwdV9waHlzaWNhbF9hcGljaWRdID0KLQkJCSBHRVRfQVBJQ19WRVJTSU9OKGFwaWNfcmVhZChBUElDX0xWUikpOworCQlib290X2NwdV9hcGljX3ZlcnNpb24gPSBHRVRfQVBJQ19WRVJTSU9OKGFwaWNfcmVhZChBUElDX0xWUikpOwogCX0KIH0KIAotaW50IGFwaWNfdmVyc2lvbltNQVhfTE9DQUxfQVBJQ107Ci0KIC8qCiAgKiBMb2NhbCBBUElDIGludGVycnVwdHMKICAqLwpAQCAtMjAyNCw3ICsyMDI0LDUzIEBACiAJYXBpY193cml0ZShBUElDX0xWVDEsIHZhbHVlKTsKIH0KIAotaW50IGdlbmVyaWNfcHJvY2Vzc29yX2luZm8oaW50IGFwaWNpZCwgaW50IHZlcnNpb24pCisvKgorICogVGhlIG51bWJlciBvZiBhbGxvY2F0ZWQgbG9naWNhbCBDUFUgSURzLiBTaW5jZSBsb2dpY2FsIENQVSBJRHMgYXJlIGFsbG9jYXRlZAorICogY29udGlndW91c2x5LCBpdCBlcXVhbHMgdG8gY3VycmVudCBhbGxvY2F0ZWQgbWF4IGxvZ2ljYWwgQ1BVIElEIHBsdXMgMS4KKyAqIEFsbCBhbGxvY2F0ZWQgQ1BVIElEIHNob3VsZCBiZSBpbiBbMCwgbnJfbG9naWNhbF9jcHVpZGkpLCBzbyB0aGUgbWF4aW11bSBvZgorICogbnJfbG9naWNhbF9jcHVpZHMgaXMgbnJfY3B1X2lkcy4KKyAqCisgKiBOT1RFOiBSZXNlcnZlIDAgZm9yIEJTUC4KKyAqLworc3RhdGljIGludCBucl9sb2dpY2FsX2NwdWlkcyA9IDE7CisKKy8qCisgKiBVc2VkIHRvIHN0b3JlIG1hcHBpbmcgYmV0d2VlbiBsb2dpY2FsIENQVSBJRHMgYW5kIEFQSUMgSURzLgorICovCitzdGF0aWMgaW50IGNwdWlkX3RvX2FwaWNpZFtdID0geworCVswIC4uLiBOUl9DUFVTIC0gMV0gPSAtMSwKK307CisKKy8qCisgKiBTaG91bGQgdXNlIHRoaXMgQVBJIHRvIGFsbG9jYXRlIGxvZ2ljYWwgQ1BVIElEcyB0byBrZWVwIG5yX2xvZ2ljYWxfY3B1aWRzCisgKiBhbmQgY3B1aWRfdG9fYXBpY2lkW10gc3luY2hyb25pemVkLgorICovCitzdGF0aWMgaW50IGFsbG9jYXRlX2xvZ2ljYWxfY3B1aWQoaW50IGFwaWNpZCkKK3sKKwlpbnQgaTsKKworCS8qCisJICogY3B1aWQgPC0+IGFwaWNpZCBtYXBwaW5nIGlzIHBlcnNpc3RlbnQsIHNvIHdoZW4gYSBjcHUgaXMgdXAsCisJICogY2hlY2sgaWYgdGhlIGtlcm5lbCBoYXMgYWxsb2NhdGVkIGEgY3B1aWQgZm9yIGl0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBucl9sb2dpY2FsX2NwdWlkczsgaSsrKSB7CisJCWlmIChjcHVpZF90b19hcGljaWRbaV0gPT0gYXBpY2lkKQorCQkJcmV0dXJuIGk7CisJfQorCisJLyogQWxsb2NhdGUgYSBuZXcgY3B1aWQuICovCisJaWYgKG5yX2xvZ2ljYWxfY3B1aWRzID49IG5yX2NwdV9pZHMpIHsKKwkJV0FSTl9PTkNFKDEsICJPbmx5ICVkIHByb2Nlc3NvcnMgc3VwcG9ydGVkLiIKKwkJCSAgICAgIlByb2Nlc3NvciAlZC8weCV4IGFuZCB0aGUgcmVzdCBhcmUgaWdub3JlZC5cbiIsCisJCQkgICAgIG5yX2NwdV9pZHMgLSAxLCBucl9sb2dpY2FsX2NwdWlkcywgYXBpY2lkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNwdWlkX3RvX2FwaWNpZFtucl9sb2dpY2FsX2NwdWlkc10gPSBhcGljaWQ7CisJcmV0dXJuIG5yX2xvZ2ljYWxfY3B1aWRzKys7Cit9CisKK2ludCBfX2dlbmVyaWNfcHJvY2Vzc29yX2luZm8oaW50IGFwaWNpZCwgaW50IHZlcnNpb24sIGJvb2wgZW5hYmxlZCkKIHsKIAlpbnQgY3B1LCBtYXggPSBucl9jcHVfaWRzOwogCWJvb2wgYm9vdF9jcHVfZGV0ZWN0ZWQgPSBwaHlzaWRfaXNzZXQoYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkLApAQCAtMjA5MCw3ICsyMTM2LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbnVtX3Byb2Nlc3NvcnMrKzsKIAlpZiAoYXBpY2lkID09IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCkgewogCQkvKgogCQkgKiB4ODZfYmlvc19jcHVfYXBpY2lkIGlzIHJlcXVpcmVkIHRvIGhhdmUgcHJvY2Vzc29ycyBsaXN0ZWQKQEAgLTIxMDAsOCArMjE0NSwxNiBAQAogCQkgKiBmb3IgQlNQLgogCQkgKi8KIAkJY3B1ID0gMDsKLQl9IGVsc2UKLQkJY3B1ID0gY3B1bWFza19uZXh0X3plcm8oLTEsIGNwdV9wcmVzZW50X21hc2spOworCisJCS8qIExvZ2ljYWwgY3B1aWQgMCBpcyByZXNlcnZlZCBmb3IgQlNQLiAqLworCQljcHVpZF90b19hcGljaWRbMF0gPSBhcGljaWQ7CisJfSBlbHNlIHsKKwkJY3B1ID0gYWxsb2NhdGVfbG9naWNhbF9jcHVpZChhcGljaWQpOworCQlpZiAoY3B1IDwgMCkgeworCQkJZGlzYWJsZWRfY3B1cysrOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CiAKIAkvKgogCSAqIFRoaXMgY2FuIGhhcHBlbiBvbiBwaHlzaWNhbCBob3RwbHVnLiBUaGUgc2FuaXR5IGNoZWNrIGF0IGJvb3QgdGltZQpAQCAtMjExMyw2ICsyMTY2LDcgQEAKIAogCQlwcl93YXJuaW5nKCJBUElDOiBQYWNrYWdlIGxpbWl0IHJlYWNoZWQuIFByb2Nlc3NvciAlZC8weCV4IGlnbm9yZWQuXG4iLAogCQkJICAgdGhpc2NwdSwgYXBpY2lkKTsKKwogCQlkaXNhYmxlZF9jcHVzKys7CiAJCXJldHVybiAtRU5PU1BDOwogCX0KQEAgLTIxMjUsMTQgKzIxNzksMTIgQEAKIAkJCSAgIGNwdSwgYXBpY2lkKTsKIAkJdmVyc2lvbiA9IDB4MTA7CiAJfQotCWFwaWNfdmVyc2lvblthcGljaWRdID0gdmVyc2lvbjsKIAotCWlmICh2ZXJzaW9uICE9IGFwaWNfdmVyc2lvbltib290X2NwdV9waHlzaWNhbF9hcGljaWRdKSB7CisJaWYgKHZlcnNpb24gIT0gYm9vdF9jcHVfYXBpY192ZXJzaW9uKSB7CiAJCXByX3dhcm5pbmcoIkJJT1MgYnVnOiBBUElDIHZlcnNpb24gbWlzbWF0Y2gsIGJvb3QgQ1BVOiAleCwgQ1BVICVkOiB2ZXJzaW9uICV4XG4iLAotCQkJYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF0sIGNwdSwgdmVyc2lvbik7CisJCQlib290X2NwdV9hcGljX3ZlcnNpb24sIGNwdSwgdmVyc2lvbik7CiAJfQogCi0JcGh5c2lkX3NldChhcGljaWQsIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKIAlpZiAoYXBpY2lkID4gbWF4X3BoeXNpY2FsX2FwaWNpZCkKIAkJbWF4X3BoeXNpY2FsX2FwaWNpZCA9IGFwaWNpZDsKIApAQCAtMjE0NSwxMSArMjE5NywyMyBAQAogCQlhcGljLT54ODZfMzJfZWFybHlfbG9naWNhbF9hcGljaWQoY3B1KTsKICNlbmRpZgogCXNldF9jcHVfcG9zc2libGUoY3B1LCB0cnVlKTsKLQlzZXRfY3B1X3ByZXNlbnQoY3B1LCB0cnVlKTsKKworCWlmIChlbmFibGVkKSB7CisJCW51bV9wcm9jZXNzb3JzKys7CisJCXBoeXNpZF9zZXQoYXBpY2lkLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7CisJCXNldF9jcHVfcHJlc2VudChjcHUsIHRydWUpOworCX0gZWxzZSB7CisJCWRpc2FibGVkX2NwdXMrKzsKKwl9CiAKIAlyZXR1cm4gY3B1OwogfQogCitpbnQgZ2VuZXJpY19wcm9jZXNzb3JfaW5mbyhpbnQgYXBpY2lkLCBpbnQgdmVyc2lvbikKK3sKKwlyZXR1cm4gX19nZW5lcmljX3Byb2Nlc3Nvcl9pbmZvKGFwaWNpZCwgdmVyc2lvbiwgdHJ1ZSk7Cit9CisKIGludCBoYXJkX3NtcF9wcm9jZXNzb3JfaWQodm9pZCkKIHsKIAlyZXR1cm4gcmVhZF9hcGljX2lkKCk7CkBAIC0yMjcyLDcgKzIzMzYsNyBAQAogCSAqIENvbXBsYWluIGlmIHRoZSBCSU9TIHByZXRlbmRzIHRoZXJlIGlzIG9uZS4KIAkgKi8KIAlpZiAoIWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BUElDKSAmJgotCSAgICBBUElDX0lOVEVHUkFURUQoYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF0pKSB7CisJICAgIEFQSUNfSU5URUdSQVRFRChib290X2NwdV9hcGljX3ZlcnNpb24pKSB7CiAJCXByX2VycigiQklPUyBidWcsIGxvY2FsIEFQSUMgMHgleCBub3QgZGV0ZWN0ZWQhLi4uXG4iLAogCQkJYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKTsKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19mbGF0XzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX2ZsYXRfNjQuYwppbmRleCA1YjJhZTEwLi5hNGQ3ZmYyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX2ZsYXRfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX2ZsYXRfNjQuYwpAQCAtMjUsNyArMjUsNyBAQAogc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfcGh5c2ZsYXQ7CiBzdGF0aWMgc3RydWN0IGFwaWMgYXBpY19mbGF0OwogCi1zdHJ1Y3QgYXBpYyBfX3JlYWRfbW9zdGx5ICphcGljID0gJmFwaWNfZmxhdDsKK3N0cnVjdCBhcGljICphcGljIF9fcm9fYWZ0ZXJfaW5pdCA9ICZhcGljX2ZsYXQ7CiBFWFBPUlRfU1lNQk9MX0dQTChhcGljKTsKIAogc3RhdGljIGludCBmbGF0X2FjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpCkBAIC0xMTYsMjcgKzExNiwxNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGZsYXRfZ2V0X2FwaWNfaWQodW5zaWduZWQgbG9uZyB4KQogewotCXVuc2lnbmVkIGludCBpZDsKLQotCWlkID0gKCgoeCk+PjI0KSAmIDB4RkZ1KTsKLQotCXJldHVybiBpZDsKKwlyZXR1cm4gKHggPj4gMjQpICYgMHhGRjsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2V0X2FwaWNfaWQodW5zaWduZWQgaW50IGlkKQogewotCXVuc2lnbmVkIGxvbmcgeDsKLQotCXggPSAoKGlkICYgMHhGRnUpPDwyNCk7Ci0JcmV0dXJuIHg7CisJcmV0dXJuIChpZCAmIDB4RkYpIDw8IDI0OwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfeGFwaWNfaWQodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgaWQ7Ci0KLQlpZCA9IGZsYXRfZ2V0X2FwaWNfaWQoYXBpY19yZWFkKEFQSUNfSUQpKTsKLQlyZXR1cm4gaWQ7CisJcmV0dXJuIGZsYXRfZ2V0X2FwaWNfaWQoYXBpY19yZWFkKEFQSUNfSUQpKTsKIH0KIAogc3RhdGljIGludCBmbGF0X2FwaWNfaWRfcmVnaXN0ZXJlZCh2b2lkKQpAQCAtMTU0LDcgKzE0NCw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYXBpYyBhcGljX2ZsYXQgPSAgeworc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfZmxhdCBfX3JvX2FmdGVyX2luaXQgPSB7CiAJLm5hbWUJCQkJPSAiZmxhdCIsCiAJLnByb2JlCQkJCT0gZmxhdF9wcm9iZSwKIAkuYWNwaV9tYWR0X29lbV9jaGVjawkJPSBmbGF0X2FjcGlfbWFkdF9vZW1fY2hlY2ssCkBAIC0yNDgsNyArMjM4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfcGh5c2ZsYXQgPSAgeworc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfcGh5c2ZsYXQgX19yb19hZnRlcl9pbml0ID0gewogCiAJLm5hbWUJCQkJPSAicGh5c2ljYWwgZmxhdCIsCiAJLnByb2JlCQkJCT0gcGh5c2ZsYXRfcHJvYmUsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX25vb3AuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbm9vcC5jCmluZGV4IGMwNTY4OGIuLmIxMDllNDMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbm9vcC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbm9vcC5jCkBAIC0xMDgsNyArMTA4LDcgQEAKIAlXQVJOX09OX09OQ0UoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FQSUMpICYmICFkaXNhYmxlX2FwaWMpOwogfQogCi1zdHJ1Y3QgYXBpYyBhcGljX25vb3AgPSB7CitzdHJ1Y3QgYXBpYyBhcGljX25vb3AgX19yb19hZnRlcl9pbml0ID0gewogCS5uYW1lCQkJCT0gIm5vb3AiLAogCS5wcm9iZQkJCQk9IG5vb3BfcHJvYmUsCiAJLmFjcGlfbWFkdF9vZW1fY2hlY2sJCT0gTlVMTCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbnVtYWNoaXAuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbnVtYWNoaXAuYwppbmRleCA3MTRkNGZkLi5lMDhmZTJjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX251bWFjaGlwLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19udW1hY2hpcC5jCkBAIC00MCwxMCArNDAsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBudW1hY2hpcDFfc2V0X2FwaWNfaWQodW5zaWduZWQgaW50IGlkKQogewotCXVuc2lnbmVkIGxvbmcgeDsKLQotCXggPSAoKGlkICYgMHhmZlUpIDw8IDI0KTsKLQlyZXR1cm4geDsKKwlyZXR1cm4gKGlkICYgMHhmZikgPDwgMjQ7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtYWNoaXAyX2dldF9hcGljX2lkKHVuc2lnbmVkIGxvbmcgeCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2JpZ3NtcF8zMi5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYmlnc21wXzMyLmMKaW5kZXggMDZkYmFhNC4uNTYwMTIwMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvYmlnc21wXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYmlnc21wXzMyLmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogCXJldHVybiBkbWlfYmlnc21wOwogfQogCi1zdGF0aWMgc3RydWN0IGFwaWMgYXBpY19iaWdzbXAgPSB7CitzdGF0aWMgc3RydWN0IGFwaWMgYXBpY19iaWdzbXAgX19yb19hZnRlcl9pbml0ID0gewogCiAJLm5hbWUJCQkJPSAiYmlnc21wIiwKIAkucHJvYmUJCQkJPSBwcm9iZV9iaWdzbXAsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9pb19hcGljLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9pb19hcGljLmMKaW5kZXggNzQ5MWY0MS4uNDhlNmQ4NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvaW9fYXBpYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2lvX2FwaWMuYwpAQCAtMTU5Myw3ICsxNTkzLDcgQEAKIAkgKiBubyBtZWFuaW5nIHdpdGhvdXQgdGhlIHNlcmlhbCBBUElDIGJ1cy4KIAkgKi8KIAlpZiAoIShib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkKLQkJfHwgQVBJQ19YQVBJQyhhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXSkpCisJCXx8IEFQSUNfWEFQSUMoYm9vdF9jcHVfYXBpY192ZXJzaW9uKSkKIAkJcmV0dXJuOwogCXNldHVwX2lvYXBpY19pZHNfZnJvbV9tcGNfbm9jaGVjaygpOwogfQpAQCAtMjQyMyw3ICsyNDIzLDcgQEAKIHN0YXRpYyB1OCBpb19hcGljX3VuaXF1ZV9pZChpbnQgaWR4LCB1OCBpZCkKIHsKIAlpZiAoKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMKSAmJgotCSAgICAhQVBJQ19YQVBJQyhhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXSkpCisJICAgICFBUElDX1hBUElDKGJvb3RfY3B1X2FwaWNfdmVyc2lvbikpCiAJCXJldHVybiBpb19hcGljX2dldF91bmlxdWVfaWQoaWR4LCBpZCk7CiAJZWxzZQogCQlyZXR1cm4gaWQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9tc2kuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL21zaS5jCmluZGV4IGFkZTI1MzIuLjAxNWJiZjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL21zaS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL21zaS5jCkBAIC0yNjksNyArMjY5LDcgQEAKIAlocGV0X21zaV93cml0ZShpcnFfZGF0YV9nZXRfaXJxX2hhbmRsZXJfZGF0YShkYXRhKSwgbXNnKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBocGV0X21zaV9jb250cm9sbGVyID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBocGV0X21zaV9jb250cm9sbGVyIF9fcm9fYWZ0ZXJfaW5pdCA9IHsKIAkubmFtZSA9ICJIUEVULU1TSSIsCiAJLmlycV91bm1hc2sgPSBocGV0X21zaV91bm1hc2ssCiAJLmlycV9tYXNrID0gaHBldF9tc2lfbWFzaywKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3Byb2JlXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9wcm9iZV8zMi5jCmluZGV4IDdjNDNlNzEuLmM0ODI2NGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3Byb2JlXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvcHJvYmVfMzIuYwpAQCAtNzIsNyArNzIsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGFwaWMgYXBpY19kZWZhdWx0ID0geworc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfZGVmYXVsdCBfX3JvX2FmdGVyX2luaXQgPSB7CiAKIAkubmFtZQkJCQk9ICJkZWZhdWx0IiwKIAkucHJvYmUJCQkJPSBwcm9iZV9kZWZhdWx0LApAQCAtMTI2LDcgKzEyNiw3IEBACiAKIGFwaWNfZHJpdmVyKGFwaWNfZGVmYXVsdCk7CiAKLXN0cnVjdCBhcGljICphcGljID0gJmFwaWNfZGVmYXVsdDsKK3N0cnVjdCBhcGljICphcGljIF9fcm9fYWZ0ZXJfaW5pdCA9ICZhcGljX2RlZmF1bHQ7CiBFWFBPUlRfU1lNQk9MX0dQTChhcGljKTsKIAogc3RhdGljIGludCBjbWRsaW5lX2FwaWMgX19pbml0ZGF0YTsKQEAgLTE1Miw3ICsxNTIsNyBAQAogCiB2b2lkIF9faW5pdCBkZWZhdWx0X3NldHVwX2FwaWNfcm91dGluZyh2b2lkKQogewotCWludCB2ZXJzaW9uID0gYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF07CisJaW50IHZlcnNpb24gPSBib290X2NwdV9hcGljX3ZlcnNpb247CiAKIAlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA+IDgpIHsKIAkJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY19jbHVzdGVyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfY2x1c3Rlci5jCmluZGV4IDU0ZjM1ZDkuLjIwMGFmNWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY19jbHVzdGVyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX2NsdXN0ZXIuYwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJCWNwdW1hc2tfYW5kKHJldG1hc2ssIG1hc2ssIHBlcl9jcHUoY3B1c19pbl9jbHVzdGVyLCBjcHUpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfeDJhcGljX2NsdXN0ZXIgPSB7CitzdGF0aWMgc3RydWN0IGFwaWMgYXBpY194MmFwaWNfY2x1c3RlciBfX3JvX2FmdGVyX2luaXQgPSB7CiAKIAkubmFtZQkJCQk9ICJjbHVzdGVyIHgyYXBpYyIsCiAJLnByb2JlCQkJCT0geDJhcGljX2NsdXN0ZXJfcHJvYmUsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfcGh5cy5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3BoeXMuYwppbmRleCA0ZjEzZjU0Zi4uZmYxMTFmMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3BoeXMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfcGh5cy5jCkBAIC05OCw3ICs5OCw3IEBACiAJcmV0dXJuIGFwaWMgPT0gJmFwaWNfeDJhcGljX3BoeXM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYXBpYyBhcGljX3gyYXBpY19waHlzID0geworc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfeDJhcGljX3BoeXMgX19yb19hZnRlcl9pbml0ID0gewogCiAJLm5hbWUJCQkJPSAicGh5c2ljYWwgeDJhcGljIiwKIAkucHJvYmUJCQkJPSB4MmFwaWNfcGh5c19wcm9iZSwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCmluZGV4IGNiMDY3M2MuLmFlZWY1M2MgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYwpAQCAtNTMzLDExICs1MzMsOCBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzZXRfYXBpY19pZCh1bnNpZ25lZCBpbnQgaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyB4OwotCi0JLyogbWFza291dCB4MmFwaWNfZXh0cmFfYml0cyA/ICovCi0JeCA9IGlkOwotCXJldHVybiB4OworCS8qIENIRUNLTUU6IERvIHdlIG5lZWQgdG8gbWFzayBvdXQgdGhlIHhhcGljIGV4dHJhIGJpdHM/ICovCisJcmV0dXJuIGlkOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IHV2X3JlYWRfYXBpY19pZCh2b2lkKQpAQCAtNTYwLDcgKzU1Nyw3IEBACiAJcmV0dXJuIGFwaWMgPT0gJmFwaWNfeDJhcGljX3V2X3g7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYXBpYyBfX3JlZmRhdGEgYXBpY194MmFwaWNfdXZfeCA9IHsKK3N0YXRpYyBzdHJ1Y3QgYXBpYyBhcGljX3gyYXBpY191dl94IF9fcm9fYWZ0ZXJfaW5pdCA9IHsKIAogCS5uYW1lCQkJCT0gIlVWIGxhcmdlIHN5c3RlbSIsCiAJLnByb2JlCQkJCT0gdXZfcHJvYmUsCkBAIC05MjcsNyArOTI0LDcgQEAKIAltb2RfdGltZXIodGltZXIsIGppZmZpZXMgKyBTQ0lSX0NQVV9IQl9JTlRFUlZBTCk7CiB9CiAKLXN0YXRpYyB2b2lkIHV2X2hlYXJ0YmVhdF9lbmFibGUoaW50IGNwdSkKK3N0YXRpYyBpbnQgdXZfaGVhcnRiZWF0X2VuYWJsZSh1bnNpZ25lZCBpbnQgY3B1KQogewogCXdoaWxlICghdXZfY3B1X3NjaXJfaW5mbyhjcHUpLT5lbmFibGVkKSB7CiAJCXN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciA9ICZ1dl9jcHVfc2Npcl9pbmZvKGNwdSktPnRpbWVyOwpAQCAtOTQxLDQzICs5MzgsMjQgQEAKIAkJLyogYWxzbyBlbnN1cmUgdGhhdCBib290IGNwdSBpcyBlbmFibGVkICovCiAJCWNwdSA9IDA7CiAJfQorCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi1zdGF0aWMgdm9pZCB1dl9oZWFydGJlYXRfZGlzYWJsZShpbnQgY3B1KQorc3RhdGljIGludCB1dl9oZWFydGJlYXRfZGlzYWJsZSh1bnNpZ25lZCBpbnQgY3B1KQogewogCWlmICh1dl9jcHVfc2Npcl9pbmZvKGNwdSktPmVuYWJsZWQpIHsKIAkJdXZfY3B1X3NjaXJfaW5mbyhjcHUpLT5lbmFibGVkID0gMDsKIAkJZGVsX3RpbWVyKCZ1dl9jcHVfc2Npcl9pbmZvKGNwdSktPnRpbWVyKTsKIAl9CiAJdXZfc2V0X2NwdV9zY2lyX2JpdHMoY3B1LCAweGZmKTsKLX0KLQotLyoKLSAqIGNwdSBob3RwbHVnIG5vdGlmaWVyCi0gKi8KLXN0YXRpYyBpbnQgdXZfc2Npcl9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sCi0JCQkgICAgICB2b2lkICpoY3B1KQotewotCWxvbmcgY3B1ID0gKGxvbmcpaGNwdTsKLQotCXN3aXRjaCAoYWN0aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pIHsKLQljYXNlIENQVV9ET1dOX0ZBSUxFRDoKLQljYXNlIENQVV9PTkxJTkU6Ci0JCXV2X2hlYXJ0YmVhdF9lbmFibGUoY3B1KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCQl1dl9oZWFydGJlYXRfZGlzYWJsZShjcHUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIF9faW5pdCB2b2lkIHV2X3NjaXJfcmVnaXN0ZXJfY3B1X25vdGlmaWVyKHZvaWQpCiB7Ci0JaG90Y3B1X25vdGlmaWVyKHV2X3NjaXJfY3B1X25vdGlmeSwgMCk7CisJY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9PTkxJTkVfRFlOLCAieDg2L3gyYXBpYy11dng6b25saW5lIiwKKwkJCQkgIHV2X2hlYXJ0YmVhdF9lbmFibGUsIHV2X2hlYXJ0YmVhdF9kaXNhYmxlKTsKIH0KIAogI2Vsc2UgLyogIUNPTkZJR19IT1RQTFVHX0NQVSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCAyYmQ1YzZmLi5jNjJlMDE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMjksMTAgKzI5LDEzIEBACiAKIHZvaWQgY29tbW9uKHZvaWQpIHsKIAlCTEFOSygpOwotCU9GRlNFVChUSV9mbGFncywgdGhyZWFkX2luZm8sIGZsYWdzKTsKLQlPRkZTRVQoVElfc3RhdHVzLCB0aHJlYWRfaW5mbywgc3RhdHVzKTsKKwlPRkZTRVQoVEFTS190aHJlYWRzcCwgdGFza19zdHJ1Y3QsIHRocmVhZC5zcCk7CisjaWZkZWYgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SCisJT0ZGU0VUKFRBU0tfc3RhY2tfY2FuYXJ5LCB0YXNrX3N0cnVjdCwgc3RhY2tfY2FuYXJ5KTsKKyNlbmRpZgogCiAJQkxBTksoKTsKKwlPRkZTRVQoVEFTS19USV9mbGFncywgdGFza19zdHJ1Y3QsIHRocmVhZF9pbmZvLmZsYWdzKTsKIAlPRkZTRVQoVEFTS19hZGRyX2xpbWl0LCB0YXNrX3N0cnVjdCwgdGhyZWFkLmFkZHJfbGltaXQpOwogCiAJQkxBTksoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hc20tb2Zmc2V0c18zMi5jIGIvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzXzMyLmMKaW5kZXggZWNkYzFkMi4uODgwYWEwOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzXzMyLmMKQEAgLTU3LDYgKzU3LDExIEBACiAJLyogU2l6ZSBvZiBTWVNFTlRFUl9zdGFjayAqLwogCURFRklORShTSVpFT0ZfU1lTRU5URVJfc3RhY2ssIHNpemVvZigoKHN0cnVjdCB0c3Nfc3RydWN0ICopMCktPlNZU0VOVEVSX3N0YWNrKSk7CiAKKyNpZmRlZiBDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IKKwlCTEFOSygpOworCU9GRlNFVChzdGFja19jYW5hcnlfb2Zmc2V0LCBzdGFja19jYW5hcnksIGNhbmFyeSk7CisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX0xHVUVTVCkgfHwgZGVmaW5lZChDT05GSUdfTEdVRVNUX0dVRVNUKSB8fCBkZWZpbmVkKENPTkZJR19MR1VFU1RfTU9EVUxFKQogCUJMQU5LKCk7CiAJT0ZGU0VUKExHVUVTVF9EQVRBX2lycV9lbmFibGVkLCBsZ3Vlc3RfZGF0YSwgaXJxX2VuYWJsZWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfNjQuYwppbmRleCBkODc1Zjk3Li4yMTA5MjdlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfNjQuYwpAQCAtNTYsNiArNTYsMTEgQEAKIAlPRkZTRVQoVFNTX3NwMCwgdHNzX3N0cnVjdCwgeDg2X3Rzcy5zcDApOwogCUJMQU5LKCk7CiAKKyNpZmRlZiBDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IKKwlERUZJTkUoc3RhY2tfY2FuYXJ5X29mZnNldCwgb2Zmc2V0b2YodW5pb24gaXJxX3N0YWNrX3VuaW9uLCBzdGFja19jYW5hcnkpKTsKKwlCTEFOSygpOworI2VuZGlmCisKIAlERUZJTkUoX19OUl9zeXNjYWxsX21heCwgc2l6ZW9mKHN5c2NhbGxzXzY0KSAtIDEpOwogCURFRklORShOUl9zeXNjYWxscywgc2l6ZW9mKHN5c2NhbGxzXzY0KSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jCmluZGV4IGY1YzY5ZDguLmI4MWZlMmQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYwpAQCAtNjY5LDYgKzY2OSwxNyBAQAogCQlzZXRfY3B1X2J1ZyhjLCBYODZfQlVHX0FNRF9UTEJfTU1BVENIKTsKIH0KIAorI2RlZmluZSBNU1JfQU1ENjRfREVfQ0ZHCTB4QzAwMTEwMjkKKworc3RhdGljIHZvaWQgaW5pdF9hbWRfbG4oc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCS8qCisJICogQXBwbHkgZXJyYXR1bSA2NjUgZml4IHVuY29uZGl0aW9uYWxseSBzbyBtYWNoaW5lcyB3aXRob3V0IGEgQklPUworCSAqIGZpeCB3b3JrLgorCSAqLworCW1zcl9zZXRfYml0KE1TUl9BTUQ2NF9ERV9DRkcsIDMxKTsKK30KKwogc3RhdGljIHZvaWQgaW5pdF9hbWRfYmQoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogCXU2NCB2YWx1ZTsKQEAgLTcyNiw2ICs3MzcsNyBAQAogCWNhc2UgNjoJICAgaW5pdF9hbWRfazcoYyk7IGJyZWFrOwogCWNhc2UgMHhmOiAgaW5pdF9hbWRfazgoYyk7IGJyZWFrOwogCWNhc2UgMHgxMDogaW5pdF9hbWRfZ2goYyk7IGJyZWFrOworCWNhc2UgMHgxMjogaW5pdF9hbWRfbG4oYyk7IGJyZWFrOwogCWNhc2UgMHgxNTogaW5pdF9hbWRfYmQoYyk7IGJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKaW5kZXggODA5ZWRhMC4uOWJkOTEwYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCkBAIC04MDQsMjEgKzgwNCwyMCBAQAogCQlpZGVudGlmeV9jcHVfd2l0aG91dF9jcHVpZChjKTsKIAogCS8qIGN5cml4IGNvdWxkIGhhdmUgY3B1aWQgZW5hYmxlZCB2aWEgY19pZGVudGlmeSgpKi8KLQlpZiAoIWhhdmVfY3B1aWRfcCgpKQotCQlyZXR1cm47CisJaWYgKGhhdmVfY3B1aWRfcCgpKSB7CisJCWNwdV9kZXRlY3QoYyk7CisJCWdldF9jcHVfdmVuZG9yKGMpOworCQlnZXRfY3B1X2NhcChjKTsKIAotCWNwdV9kZXRlY3QoYyk7Ci0JZ2V0X2NwdV92ZW5kb3IoYyk7Ci0JZ2V0X2NwdV9jYXAoYyk7CisJCWlmICh0aGlzX2NwdS0+Y19lYXJseV9pbml0KQorCQkJdGhpc19jcHUtPmNfZWFybHlfaW5pdChjKTsKIAotCWlmICh0aGlzX2NwdS0+Y19lYXJseV9pbml0KQotCQl0aGlzX2NwdS0+Y19lYXJseV9pbml0KGMpOworCQljLT5jcHVfaW5kZXggPSAwOworCQlmaWx0ZXJfY3B1aWRfZmVhdHVyZXMoYywgZmFsc2UpOwogCi0JYy0+Y3B1X2luZGV4ID0gMDsKLQlmaWx0ZXJfY3B1aWRfZmVhdHVyZXMoYywgZmFsc2UpOwotCi0JaWYgKHRoaXNfY3B1LT5jX2JzcF9pbml0KQotCQl0aGlzX2NwdS0+Y19ic3BfaW5pdChjKTsKKwkJaWYgKHRoaXNfY3B1LT5jX2JzcF9pbml0KQorCQkJdGhpc19jcHUtPmNfYnNwX2luaXQoYyk7CisJfQogCiAJc2V0dXBfZm9yY2VfY3B1X2NhcChYODZfRkVBVFVSRV9BTFdBWVMpOwogCWZwdV9faW5pdF9zeXN0ZW0oYyk7CkBAIC0xMjY1LDkgKzEyNjQsMTQgQEAKIF9fc2V0dXAoImNsZWFyY3B1aWQ9Iiwgc2V0dXBfZGlzYWJsZWNwdWlkKTsKIAogI2lmZGVmIENPTkZJR19YODZfNjQKLXN0cnVjdCBkZXNjX3B0ciBpZHRfZGVzY3IgPSB7IE5SX1ZFQ1RPUlMgKiAxNiAtIDEsICh1bnNpZ25lZCBsb25nKSBpZHRfdGFibGUgfTsKLXN0cnVjdCBkZXNjX3B0ciBkZWJ1Z19pZHRfZGVzY3IgPSB7IE5SX1ZFQ1RPUlMgKiAxNiAtIDEsCi0JCQkJICAgICh1bnNpZ25lZCBsb25nKSBkZWJ1Z19pZHRfdGFibGUgfTsKK3N0cnVjdCBkZXNjX3B0ciBpZHRfZGVzY3IgX19yb19hZnRlcl9pbml0ID0geworCS5zaXplID0gTlJfVkVDVE9SUyAqIDE2IC0gMSwKKwkuYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSBpZHRfdGFibGUsCit9OworY29uc3Qgc3RydWN0IGRlc2NfcHRyIGRlYnVnX2lkdF9kZXNjciA9IHsKKwkuc2l6ZSA9IE5SX1ZFQ1RPUlMgKiAxNiAtIDEsCisJLmFkZHJlc3MgPSAodW5zaWduZWQgbG9uZykgZGVidWdfaWR0X3RhYmxlLAorfTsKIAogREVGSU5FX1BFUl9DUFVfRklSU1QodW5pb24gaXJxX3N0YWNrX3VuaW9uLAogCQkgICAgIGlycV9zdGFja191bmlvbikgX19hbGlnbmVkKFBBR0VfU0laRSkgX192aXNpYmxlOwpAQCAtMTI4MSw3ICsxMjg1LDcgQEAKIEVYUE9SVF9QRVJfQ1BVX1NZTUJPTChjdXJyZW50X3Rhc2spOwogCiBERUZJTkVfUEVSX0NQVShjaGFyICosIGlycV9zdGFja19wdHIpID0KLQlpbml0X3Blcl9jcHVfdmFyKGlycV9zdGFja191bmlvbi5pcnFfc3RhY2spICsgSVJRX1NUQUNLX1NJWkUgLSA2NDsKKwlpbml0X3Blcl9jcHVfdmFyKGlycV9zdGFja191bmlvbi5pcnFfc3RhY2spICsgSVJRX1NUQUNLX1NJWkU7CiAKIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgaXJxX2NvdW50KSBfX3Zpc2libGUgPSAtMTsKIApAQCAtMTMwNSwxMSArMTMwOSw2IEBACiAvKiBNYXkgbm90IGJlIG1hcmtlZCBfX2luaXQ6IHVzZWQgYnkgc29mdHdhcmUgc3VzcGVuZCAqLwogdm9pZCBzeXNjYWxsX2luaXQodm9pZCkKIHsKLQkvKgotCSAqIExTVEFSIGFuZCBTVEFSIGxpdmUgaW4gYSBiaXQgc3RyYW5nZSBzeW1iaW9zaXMuCi0JICogVGhleSBib3RoIHdyaXRlIHRvIHRoZSBzYW1lIGludGVybmFsIHJlZ2lzdGVyLiBTVEFSIGFsbG93cyB0bwotCSAqIHNldCBDUy9EUyBidXQgb25seSBhIDMyYml0IHRhcmdldC4gTFNUQVIgc2V0cyB0aGUgNjRiaXQgcmlwLgotCSAqLwogCXdybXNyKE1TUl9TVEFSLCAwLCAoX19VU0VSMzJfQ1MgPDwgMTYpIHwgX19LRVJORUxfQ1MpOwogCXdybXNybChNU1JfTFNUQVIsICh1bnNpZ25lZCBsb25nKWVudHJ5X1NZU0NBTExfNjQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2h5cGVydmlzb3IuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaHlwZXJ2aXNvci5jCmluZGV4IDI3ZTQ2NjUuLjM1NjkxYTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaHlwZXJ2aXNvci5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaHlwZXJ2aXNvci5jCkBAIC04NiwzICs4NiwxNCBAQAogCSAgICAgICB4ODZfaHlwZXItPngyYXBpY19hdmFpbGFibGUgJiYKIAkgICAgICAgeDg2X2h5cGVyLT54MmFwaWNfYXZhaWxhYmxlKCk7CiB9CisKK3ZvaWQgaHlwZXJ2aXNvcl9waW5fdmNwdShpbnQgY3B1KQoreworCWlmICgheDg2X2h5cGVyKQorCQlyZXR1cm47CisKKwlpZiAoeDg2X2h5cGVyLT5waW5fdmNwdSkKKwkJeDg2X2h5cGVyLT5waW5fdmNwdShjcHUpOworCWVsc2UKKwkJV0FSTl9PTkNFKDEsICJ2Y3B1IHBpbm5pbmcgcmVxdWVzdGVkIGJ1dCBub3Qgc3VwcG9ydGVkIVxuIik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jCmluZGV4IDc5ZDhlYzguLmE3ZmRmNDUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lycV93b3JrLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbC5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgpAQCAtMjkyLDYgKzI5MywxMyBAQAogCWlmIChtLT5taXNjKQogCQlwcl9jb250KCJNSVNDICVsbHggIiwgbS0+bWlzYyk7CiAKKwlpZiAobWNlX2ZsYWdzLnNtY2EpIHsKKwkJaWYgKG0tPnN5bmQpCisJCQlwcl9jb250KCJTWU5EICVsbHggIiwgbS0+c3luZCk7CisJCWlmIChtLT5pcGlkKQorCQkJcHJfY29udCgiSVBJRCAlbGx4ICIsIG0tPmlwaWQpOworCX0KKwogCXByX2NvbnQoIlxuIik7CiAJLyoKIAkgKiBOb3RlIHRoaXMgb3V0cHV0IGlzIHBhcnNlZCBieSBleHRlcm5hbCB0b29scyBhbmQgb2xkIGZpZWxkcwpAQCAtNTY4LDYgKzU3Niw3IEBACiB7CiAJaWYgKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfTUlTQ1YpCiAJCW0tPm1pc2MgPSBtY2VfcmRtc3JsKG1zcl9vcHMubWlzYyhpKSk7CisKIAlpZiAobS0+c3RhdHVzICYgTUNJX1NUQVRVU19BRERSVikgewogCQltLT5hZGRyID0gbWNlX3JkbXNybChtc3Jfb3BzLmFkZHIoaSkpOwogCkBAIC01NzksNiArNTg4LDIzIEBACiAJCQltLT5hZGRyID4+PSBzaGlmdDsKIAkJCW0tPmFkZHIgPDw9IHNoaWZ0OwogCQl9CisKKwkJLyoKKwkJICogRXh0cmFjdCBbNTU6PGxzYj5dIHdoZXJlIGxzYiBpcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQKKwkJICogKnZhbGlkKiBiaXQgb2YgdGhlIGFkZHJlc3MgYml0cy4KKwkJICovCisJCWlmIChtY2VfZmxhZ3Muc21jYSkgeworCQkJdTggbHNiID0gKG0tPmFkZHIgPj4gNTYpICYgMHgzZjsKKworCQkJbS0+YWRkciAmPSBHRU5NQVNLX1VMTCg1NSwgbHNiKTsKKwkJfQorCX0KKworCWlmIChtY2VfZmxhZ3Muc21jYSkgeworCQltLT5pcGlkID0gbWNlX3JkbXNybChNU1JfQU1ENjRfU01DQV9NQ3hfSVBJRChpKSk7CisKKwkJaWYgKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfU1lORFYpCisJCQltLT5zeW5kID0gbWNlX3JkbXNybChNU1JfQU1ENjRfU01DQV9NQ3hfU1lORChpKSk7CiAJfQogfQogCkBAIC0xNjMzLDE3ICsxNjU5LDYgQEAKIAogCQlpZiAoYy0+eDg2ID09IDYgJiYgYy0+eDg2X21vZGVsID09IDQ1KQogCQkJcXVpcmtfbm9fd2F5X291dCA9IHF1aXJrX3NhbmR5YnJpZGdlX2lmdTsKLQkJLyoKLQkJICogTUNHX0NBUC5NQ0dfU0VSX1AgaXMgbmVjZXNzYXJ5IGJ1dCBub3Qgc3VmZmljaWVudCB0byBrbm93Ci0JCSAqIHdoZXRoZXIgdGhpcyBwcm9jZXNzb3Igd2lsbCBhY3R1YWxseSBnZW5lcmF0ZSByZWNvdmVyYWJsZQotCQkgKiBtYWNoaW5lIGNoZWNrcy4gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYW4gRTcgbW9kZWwgWGVvbi4KLQkJICogV2UgY2FuJ3QgZG8gYSBtb2RlbCBudW1iZXIgY2hlY2sgYmVjYXVzZSBFNSBhbmQgRTcgdXNlIHRoZQotCQkgKiBzYW1lIG1vZGVsIG51bWJlci4gRTUgZG9lc24ndCBzdXBwb3J0IHJlY292ZXJ5LCBFNyBkb2VzLgotCQkgKi8KLQkJaWYgKG1jYV9jZmcucmVjb3ZlcnkgfHwgKG1jYV9jZmcuc2VyICYmCi0JCQkhc3RybmNtcChjLT54ODZfbW9kZWxfaWQsCi0JCQkJICJJbnRlbChSKSBYZW9uKFIpIENQVSBFNy0iLCAyNCkpKQotCQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfTUNFX1JFQ09WRVJZKTsKIAl9CiAJaWYgKGNmZy0+bW9uYXJjaF90aW1lb3V0IDwgMCkKIAkJY2ZnLT5tb25hcmNoX3RpbWVvdXQgPSAwOwpAQCAtMjA4MCw2ICsyMDk1LDcgQEAKICAqIG1jZT1ib290bG9nIExvZyBNQ0VzIGZyb20gYmVmb3JlIGJvb3RpbmcuIERpc2FibGVkIGJ5IGRlZmF1bHQgb24gQU1ELgogICogbWNlPW5vYm9vdGxvZyBEb24ndCBsb2cgTUNFcyBmcm9tIGJlZm9yZSBib290aW5nLgogICogbWNlPWJpb3NfY21jaV90aHJlc2hvbGQgRG9uJ3QgcHJvZ3JhbSB0aGUgQ01DSSB0aHJlc2hvbGQKKyAqIG1jZT1yZWNvdmVyeSBmb3JjZSBlbmFibGUgbWVtY3B5X21jc2FmZSgpCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IG1jaGVja19lbmFibGUoY2hhciAqc3RyKQogewpAQCAtMjY3Niw4ICsyNjkyLDE0IEBACiBzdGF0aWMgaW50IF9faW5pdCBtY2hlY2tfZGVidWdmc19pbml0KHZvaWQpIHsgcmV0dXJuIC1FSU5WQUw7IH0KICNlbmRpZgogCitERUZJTkVfU1RBVElDX0tFWV9GQUxTRShtY3NhZmVfa2V5KTsKK0VYUE9SVF9TWU1CT0xfR1BMKG1jc2FmZV9rZXkpOworCiBzdGF0aWMgaW50IF9faW5pdCBtY2hlY2tfbGF0ZV9pbml0KHZvaWQpCiB7CisJaWYgKG1jYV9jZmcucmVjb3ZlcnkpCisJCXN0YXRpY19icmFuY2hfaW5jKCZtY3NhZmVfa2V5KTsKKwogCW1jaGVja19kZWJ1Z2ZzX2luaXQoKTsKIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2VfYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2VfYW1kLmMKaW5kZXggN2I3ZjNiZS4uOWI1NDAzNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlX2FtZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9hbWQuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS9hbWRfbmIuaD4KICNpbmNsdWRlIDxhc20vYXBpYy5oPgpAQCAtNjMsMzQgKzY0LDcxIEBACiAJImV4ZWN1dGlvbl91bml0IiwKIH07CiAKLS8qIERlZmluZSBIV0lEIHRvIElQIHR5cGUgbWFwcGluZ3MgZm9yIFNjYWxhYmxlIE1DQSAqLwotc3RydWN0IGFtZF9od2lkIGFtZF9od2lkc1tdID0gewotCVtTTUNBX0YxN0hfQ09SRV0JPSB7ICJmMTdoX2NvcmUiLAkweEIwIH0sCi0JW1NNQ0FfREZdCQk9IHsgImRhdGFfZmFicmljIiwJMHgyRSB9LAotCVtTTUNBX1VNQ10JCT0geyAidW1jIiwJCTB4OTYgfSwKLQlbU01DQV9QQl0JCT0geyAicGFyYW1fYmxvY2siLAkweDUgfSwKLQlbU01DQV9QU1BdCQk9IHsgInBzcCIsCQkweEZGIH0sCi0JW1NNQ0FfU01VXQkJPSB7ICJzbXUiLAkJMHgxIH0sCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNtY2FfdW1jX2Jsb2NrX25hbWVzW10gPSB7CisJImRyYW1fZWNjIiwKKwkibWlzY191bWMiCiB9OwotRVhQT1JUX1NZTUJPTF9HUEwoYW1kX2h3aWRzKTsKIAotY29uc3QgY2hhciAqIGNvbnN0IGFtZF9jb3JlX21jYWJsb2NrX25hbWVzW10gPSB7Ci0JW1NNQ0FfTFNdCQk9ICJsb2FkX3N0b3JlIiwKLQlbU01DQV9JRl0JCT0gImluc25fZmV0Y2giLAotCVtTTUNBX0wyX0NBQ0hFXQkJPSAibDJfY2FjaGUiLAotCVtTTUNBX0RFXQkJPSAiZGVjb2RlX3VuaXQiLAotCVtSRVNdCQkJPSAiIiwKLQlbU01DQV9FWF0JCT0gImV4ZWN1dGlvbl91bml0IiwKLQlbU01DQV9GUF0JCT0gImZsb2F0aW5nX3BvaW50IiwKLQlbU01DQV9MM19DQUNIRV0JCT0gImwzX2NhY2hlIiwKK3N0cnVjdCBzbWNhX2JhbmtfbmFtZSBzbWNhX2JhbmtfbmFtZXNbXSA9IHsKKwlbU01DQV9MU10JPSB7ICJsb2FkX3N0b3JlIiwJIkxvYWQgU3RvcmUgVW5pdCIgfSwKKwlbU01DQV9JRl0JPSB7ICJpbnNuX2ZldGNoIiwJIkluc3RydWN0aW9uIEZldGNoIFVuaXQiIH0sCisJW1NNQ0FfTDJfQ0FDSEVdCT0geyAibDJfY2FjaGUiLAkJIkwyIENhY2hlIiB9LAorCVtTTUNBX0RFXQk9IHsgImRlY29kZV91bml0IiwJIkRlY29kZSBVbml0IiB9LAorCVtTTUNBX0VYXQk9IHsgImV4ZWN1dGlvbl91bml0IiwJIkV4ZWN1dGlvbiBVbml0IiB9LAorCVtTTUNBX0ZQXQk9IHsgImZsb2F0aW5nX3BvaW50IiwJIkZsb2F0aW5nIFBvaW50IFVuaXQiIH0sCisJW1NNQ0FfTDNfQ0FDSEVdCT0geyAibDNfY2FjaGUiLAkJIkwzIENhY2hlIiB9LAorCVtTTUNBX0NTXQk9IHsgImNvaGVyZW50X3NsYXZlIiwJIkNvaGVyZW50IFNsYXZlIiB9LAorCVtTTUNBX1BJRV0JPSB7ICJwaWUiLAkJIlBvd2VyLCBJbnRlcnJ1cHRzLCBldGMuIiB9LAorCVtTTUNBX1VNQ10JPSB7ICJ1bWMiLAkJIlVuaWZpZWQgTWVtb3J5IENvbnRyb2xsZXIiIH0sCisJW1NNQ0FfUEJdCT0geyAicGFyYW1fYmxvY2siLAkiUGFyYW1ldGVyIEJsb2NrIiB9LAorCVtTTUNBX1BTUF0JPSB7ICJwc3AiLAkJIlBsYXRmb3JtIFNlY3VyaXR5IFByb2Nlc3NvciIgfSwKKwlbU01DQV9TTVVdCT0geyAic211IiwJCSJTeXN0ZW0gTWFuYWdlbWVudCBVbml0IiB9LAogfTsKLUVYUE9SVF9TWU1CT0xfR1BMKGFtZF9jb3JlX21jYWJsb2NrX25hbWVzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNtY2FfYmFua19uYW1lcyk7CiAKLWNvbnN0IGNoYXIgKiBjb25zdCBhbWRfZGZfbWNhYmxvY2tfbmFtZXNbXSA9IHsKLQlbU01DQV9DU10JCT0gImNvaGVyZW50X3NsYXZlIiwKLQlbU01DQV9QSUVdCQk9ICJwaWUiLAorc3RhdGljIHN0cnVjdCBzbWNhX2h3aWRfbWNhdHlwZSBzbWNhX2h3aWRfbWNhdHlwZXNbXSA9IHsKKwkvKiB7IGJhbmtfdHlwZSwgaHdpZF9tY2F0eXBlLCB4ZWNfYml0bWFwIH0gKi8KKworCS8qIFpOIENvcmUgKEhXSUQ9MHhCMCkgTUNBIHR5cGVzICovCisJeyBTTUNBX0xTLAkgSFdJRF9NQ0FUWVBFKDB4QjAsIDB4MCksIDB4MUZGRkVGIH0sCisJeyBTTUNBX0lGLAkgSFdJRF9NQ0FUWVBFKDB4QjAsIDB4MSksIDB4M0ZGRiB9LAorCXsgU01DQV9MMl9DQUNIRSwgSFdJRF9NQ0FUWVBFKDB4QjAsIDB4MiksIDB4RiB9LAorCXsgU01DQV9ERSwJIEhXSURfTUNBVFlQRSgweEIwLCAweDMpLCAweDFGRiB9LAorCS8qIEhXSUQgMHhCMCBNQ0FUWVBFIDB4NCBpcyBSZXNlcnZlZCAqLworCXsgU01DQV9FWCwJIEhXSURfTUNBVFlQRSgweEIwLCAweDUpLCAweDdGRiB9LAorCXsgU01DQV9GUCwJIEhXSURfTUNBVFlQRSgweEIwLCAweDYpLCAweDdGIH0sCisJeyBTTUNBX0wzX0NBQ0hFLCBIV0lEX01DQVRZUEUoMHhCMCwgMHg3KSwgMHhGRiB9LAorCisJLyogRGF0YSBGYWJyaWMgTUNBIHR5cGVzICovCisJeyBTTUNBX0NTLAkgSFdJRF9NQ0FUWVBFKDB4MkUsIDB4MCksIDB4MUZGIH0sCisJeyBTTUNBX1BJRSwJIEhXSURfTUNBVFlQRSgweDJFLCAweDEpLCAweEYgfSwKKworCS8qIFVuaWZpZWQgTWVtb3J5IENvbnRyb2xsZXIgTUNBIHR5cGUgKi8KKwl7IFNNQ0FfVU1DLAkgSFdJRF9NQ0FUWVBFKDB4OTYsIDB4MCksIDB4M0YgfSwKKworCS8qIFBhcmFtZXRlciBCbG9jayBNQ0EgdHlwZSAqLworCXsgU01DQV9QQiwJIEhXSURfTUNBVFlQRSgweDA1LCAweDApLCAweDEgfSwKKworCS8qIFBsYXRmb3JtIFNlY3VyaXR5IFByb2Nlc3NvciBNQ0EgdHlwZSAqLworCXsgU01DQV9QU1AsCSBIV0lEX01DQVRZUEUoMHhGRiwgMHgwKSwgMHgxIH0sCisKKwkvKiBTeXN0ZW0gTWFuYWdlbWVudCBVbml0IE1DQSB0eXBlICovCisJeyBTTUNBX1NNVSwJIEhXSURfTUNBVFlQRSgweDAxLCAweDApLCAweDEgfSwKIH07Ci1FWFBPUlRfU1lNQk9MX0dQTChhbWRfZGZfbWNhYmxvY2tfbmFtZXMpOworCitzdHJ1Y3Qgc21jYV9iYW5rX2luZm8gc21jYV9iYW5rc1tNQVhfTlJfQkFOS1NdOworRVhQT1JUX1NZTUJPTF9HUEwoc21jYV9iYW5rcyk7CisKKy8qCisgKiBJbiBTTUNBIGVuYWJsZWQgcHJvY2Vzc29ycywgd2UgY2FuIGhhdmUgbXVsdGlwbGUgYmFua3MgZm9yIGEgZ2l2ZW4gSVAgdHlwZS4KKyAqIFNvIHRvIGRlZmluZSBhIHVuaXF1ZSBuYW1lIGZvciBlYWNoIGJhbmssIHdlIHVzZSBhIHRlbXAgYy1zdHJpbmcgdG8gYXBwZW5kCisgKiB0aGUgTUNBX0lQSURbSW5zdGFuY2VJZF0gdG8gdHlwZSdzIG5hbWUgaW4gZ2V0X25hbWUoKS4KKyAqCisgKiBJbnN0YW5jZUlkIGlzIDMyIGJpdHMgd2hpY2ggaXMgOCBjaGFyYWN0ZXJzLiBNYWtlIHN1cmUgTUFYX01DQVRZUEVfTkFNRV9MRU4KKyAqIGlzIGdyZWF0ZXIgdGhhbiA4IHBsdXMgMSAoZm9yIHVuZGVyc2NvcmUpIHBsdXMgbGVuZ3RoIG9mIGxvbmdlc3QgdHlwZSBuYW1lLgorICovCisjZGVmaW5lIE1BWF9NQ0FUWVBFX05BTUVfTEVOCTMwCitzdGF0aWMgY2hhciBidWZfbWNhdHlwZVtNQVhfTUNBVFlQRV9OQU1FX0xFTl07CiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdGhyZXNob2xkX2JhbmsgKiosIHRocmVzaG9sZF9iYW5rcyk7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgaW50LCBiYW5rX21hcCk7CS8qIHNlZSB3aGljaCBiYW5rcyBhcmUgb24gKi8KQEAgLTEwOCw2ICsxNDYsMzYgQEAKICAqIENQVSBJbml0aWFsaXphdGlvbgogICovCiAKK3N0YXRpYyB2b2lkIGdldF9zbWNhX2JhbmtfaW5mbyh1bnNpZ25lZCBpbnQgYmFuaykKK3sKKwl1bnNpZ25lZCBpbnQgaSwgaHdpZF9tY2F0eXBlLCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IHNtY2FfaHdpZF9tY2F0eXBlICp0eXBlOworCXUzMiBoaWdoLCBpbnN0YW5jZUlkOworCXUxNiBod2lkLCBtY2F0eXBlOworCisJLyogQ29sbGVjdCBiYW5rX2luZm8gdXNpbmcgQ1BVIDAgZm9yIG5vdy4gKi8KKwlpZiAoY3B1KQorCQlyZXR1cm47CisKKwlpZiAocmRtc3Jfc2FmZV9vbl9jcHUoY3B1LCBNU1JfQU1ENjRfU01DQV9NQ3hfSVBJRChiYW5rKSwgJmluc3RhbmNlSWQsICZoaWdoKSkgeworCQlwcl93YXJuKCJGYWlsZWQgdG8gcmVhZCBNQ0FfSVBJRCBmb3IgYmFuayAlZFxuIiwgYmFuayk7CisJCXJldHVybjsKKwl9CisKKwlod2lkID0gaGlnaCAmIE1DSV9JUElEX0hXSUQ7CisJbWNhdHlwZSA9IChoaWdoICYgTUNJX0lQSURfTUNBVFlQRSkgPj4gMTY7CisJaHdpZF9tY2F0eXBlID0gSFdJRF9NQ0FUWVBFKGh3aWQsIG1jYXR5cGUpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc21jYV9od2lkX21jYXR5cGVzKTsgaSsrKSB7CisJCXR5cGUgPSAmc21jYV9od2lkX21jYXR5cGVzW2ldOworCQlpZiAoaHdpZF9tY2F0eXBlID09IHR5cGUtPmh3aWRfbWNhdHlwZSkgeworCQkJc21jYV9iYW5rc1tiYW5rXS50eXBlID0gdHlwZTsKKwkJCXNtY2FfYmFua3NbYmFua10udHlwZV9pbnN0YW5jZSA9IGluc3RhbmNlSWQ7CisJCQlicmVhazsKKwkJfQorCX0KK30KKwogc3RydWN0IHRocmVzaF9yZXN0YXJ0IHsKIAlzdHJ1Y3QgdGhyZXNob2xkX2Jsb2NrCSpiOwogCWludAkJCXJlc2V0OwpAQCAtMjkzLDcgKzM2MSw3IEBACiAJd3Jtc3IoTVNSX0NVX0RFRl9FUlIsIGxvdywgaGlnaCk7CiB9CiAKLXN0YXRpYyB1MzIgZ2V0X2Jsb2NrX2FkZHJlc3ModTMyIGN1cnJlbnRfYWRkciwgdTMyIGxvdywgdTMyIGhpZ2gsCitzdGF0aWMgdTMyIGdldF9ibG9ja19hZGRyZXNzKHVuc2lnbmVkIGludCBjcHUsIHUzMiBjdXJyZW50X2FkZHIsIHUzMiBsb3csIHUzMiBoaWdoLAogCQkJICAgICB1bnNpZ25lZCBpbnQgYmFuaywgdW5zaWduZWQgaW50IGJsb2NrKQogewogCXUzMiBhZGRyID0gMCwgb2Zmc2V0ID0gMDsKQEAgLTMwOSwxMyArMzc3LDEzIEBACiAJCQkgKi8KIAkJCXUzMiBsb3csIGhpZ2g7CiAKLQkJCWlmIChyZG1zcl9zYWZlKE1TUl9BTUQ2NF9TTUNBX01DeF9DT05GSUcoYmFuayksICZsb3csICZoaWdoKSkKKwkJCWlmIChyZG1zcl9zYWZlX29uX2NwdShjcHUsIE1TUl9BTUQ2NF9TTUNBX01DeF9DT05GSUcoYmFuayksICZsb3csICZoaWdoKSkKIAkJCQlyZXR1cm4gYWRkcjsKIAogCQkJaWYgKCEobG93ICYgTUNJX0NPTkZJR19NQ0FYKSkKIAkJCQlyZXR1cm4gYWRkcjsKIAotCQkJaWYgKCFyZG1zcl9zYWZlKE1TUl9BTUQ2NF9TTUNBX01DeF9NSVNDKGJhbmspLCAmbG93LCAmaGlnaCkgJiYKKwkJCWlmICghcmRtc3Jfc2FmZV9vbl9jcHUoY3B1LCBNU1JfQU1ENjRfU01DQV9NQ3hfTUlTQyhiYW5rKSwgJmxvdywgJmhpZ2gpICYmCiAJCQkgICAgKGxvdyAmIE1BU0tfQkxLUFRSX0xPKSkKIAkJCQlhZGRyID0gTVNSX0FNRDY0X1NNQ0FfTUN4X01JU0N5KGJhbmssIGJsb2NrIC0gMSk7CiAJCX0KQEAgLTM5NSw2ICs0NjMsMjAgQEAKIAkJICovCiAJCXNtY2FfaGlnaCAmPSB+QklUKDIpOwogCisJCS8qCisJCSAqIFNNQ0Egc2V0cyB0aGUgRGVmZXJyZWQgRXJyb3IgSW50ZXJydXB0IHR5cGUgcGVyIGJhbmsuCisJCSAqCisJCSAqIE1DQV9DT05GSUdbRGVmZXJyZWRJbnRUeXBlU3VwcG9ydGVkXSBpcyBiaXQgNSwgYW5kIHRlbGxzIHVzCisJCSAqIGlmIHRoZSBEZWZlcnJlZEludFR5cGUgYml0IGZpZWxkIGlzIGF2YWlsYWJsZS4KKwkJICoKKwkJICogTUNBX0NPTkZJR1tEZWZlcnJlZEludFR5cGVdIGlzIGJpdHMgWzM4OjM3XSAoWzY6NV0gaW4gdGhlCisJCSAqIGhpZ2ggcG9ydGlvbiBvZiB0aGUgTVNSKS4gT1Mgc2hvdWxkIHNldCB0aGlzIHRvIDB4MSB0byBlbmFibGUKKwkJICogQVBJQyBiYXNlZCBpbnRlcnJ1cHQuIEZpcnN0LCBjaGVjayB0aGF0IG5vIGludGVycnVwdCBoYXMgYmVlbgorCQkgKiBzZXQuCisJCSAqLworCQlpZiAoKHNtY2FfbG93ICYgQklUKDUpKSAmJiAhKChzbWNhX2hpZ2ggPj4gNSkgJiAweDMpKQorCQkJc21jYV9oaWdoIHw9IEJJVCg1KTsKKwogCQl3cm1zcihzbWNhX2FkZHIsIHNtY2FfbG93LCBzbWNhX2hpZ2gpOwogCX0KIApAQCAtNDIxLDEyICs1MDMsMTUgQEAKIHZvaWQgbWNlX2FtZF9mZWF0dXJlX2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogCXUzMiBsb3cgPSAwLCBoaWdoID0gMCwgYWRkcmVzcyA9IDA7Ci0JdW5zaWduZWQgaW50IGJhbmssIGJsb2NrOworCXVuc2lnbmVkIGludCBiYW5rLCBibG9jaywgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCWludCBvZmZzZXQgPSAtMTsKIAogCWZvciAoYmFuayA9IDA7IGJhbmsgPCBtY2FfY2ZnLmJhbmtzOyArK2JhbmspIHsKKwkJaWYgKG1jZV9mbGFncy5zbWNhKQorCQkJZ2V0X3NtY2FfYmFua19pbmZvKGJhbmspOworCiAJCWZvciAoYmxvY2sgPSAwOyBibG9jayA8IE5SX0JMT0NLUzsgKytibG9jaykgewotCQkJYWRkcmVzcyA9IGdldF9ibG9ja19hZGRyZXNzKGFkZHJlc3MsIGxvdywgaGlnaCwgYmFuaywgYmxvY2spOworCQkJYWRkcmVzcyA9IGdldF9ibG9ja19hZGRyZXNzKGNwdSwgYWRkcmVzcywgbG93LCBoaWdoLCBiYW5rLCBibG9jayk7CiAJCQlpZiAoIWFkZHJlc3MpCiAJCQkJYnJlYWs7CiAKQEAgLTQ3Niw5ICs1NjEsMjcgQEAKIAlpZiAodGhyZXNob2xkX2VycikKIAkJbS5taXNjID0gbWlzYzsKIAotCWlmIChtLnN0YXR1cyAmIE1DSV9TVEFUVVNfQUREUlYpCisJaWYgKG0uc3RhdHVzICYgTUNJX1NUQVRVU19BRERSVikgewogCQlyZG1zcmwobXNyX2FkZHIsIG0uYWRkcik7CiAKKwkJLyoKKwkJICogRXh0cmFjdCBbNTU6PGxzYj5dIHdoZXJlIGxzYiBpcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQKKwkJICogKnZhbGlkKiBiaXQgb2YgdGhlIGFkZHJlc3MgYml0cy4KKwkJICovCisJCWlmIChtY2VfZmxhZ3Muc21jYSkgeworCQkJdTggbHNiID0gKG0uYWRkciA+PiA1NikgJiAweDNmOworCisJCQltLmFkZHIgJj0gR0VOTUFTS19VTEwoNTUsIGxzYik7CisJCX0KKwl9CisKKwlpZiAobWNlX2ZsYWdzLnNtY2EpIHsKKwkJcmRtc3JsKE1TUl9BTUQ2NF9TTUNBX01DeF9JUElEKGJhbmspLCBtLmlwaWQpOworCisJCWlmIChtLnN0YXR1cyAmIE1DSV9TVEFUVVNfU1lORFYpCisJCQlyZG1zcmwoTVNSX0FNRDY0X1NNQ0FfTUN4X1NZTkQoYmFuayksIG0uc3luZCk7CisJfQorCiAJbWNlX2xvZygmbSk7CiAKIAl3cm1zcmwobXNyX3N0YXR1cywgMCk7CkBAIC01NDEsMTUgKzY0NCwxNCBAQAogc3RhdGljIHZvaWQgYW1kX3RocmVzaG9sZF9pbnRlcnJ1cHQodm9pZCkKIHsKIAl1MzIgbG93ID0gMCwgaGlnaCA9IDAsIGFkZHJlc3MgPSAwOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JdW5zaWduZWQgaW50IGJhbmssIGJsb2NrOworCXVuc2lnbmVkIGludCBiYW5rLCBibG9jaywgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJLyogYXNzdW1lIGZpcnN0IGJhbmsgY2F1c2VkIGl0ICovCiAJZm9yIChiYW5rID0gMDsgYmFuayA8IG1jYV9jZmcuYmFua3M7ICsrYmFuaykgewogCQlpZiAoIShwZXJfY3B1KGJhbmtfbWFwLCBjcHUpICYgKDEgPDwgYmFuaykpKQogCQkJY29udGludWU7CiAJCWZvciAoYmxvY2sgPSAwOyBibG9jayA8IE5SX0JMT0NLUzsgKytibG9jaykgewotCQkJYWRkcmVzcyA9IGdldF9ibG9ja19hZGRyZXNzKGFkZHJlc3MsIGxvdywgaGlnaCwgYmFuaywgYmxvY2spOworCQkJYWRkcmVzcyA9IGdldF9ibG9ja19hZGRyZXNzKGNwdSwgYWRkcmVzcywgbG93LCBoaWdoLCBiYW5rLCBibG9jayk7CiAJCQlpZiAoIWFkZHJlc3MpCiAJCQkJYnJlYWs7CiAKQEAgLTcxMyw2ICs4MTUsMzQgQEAKIAkuZGVmYXVsdF9hdHRycwkJPSBkZWZhdWx0X2F0dHJzLAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKmdldF9uYW1lKHVuc2lnbmVkIGludCBiYW5rLCBzdHJ1Y3QgdGhyZXNob2xkX2Jsb2NrICpiKQoreworCXVuc2lnbmVkIGludCBiYW5rX3R5cGU7CisKKwlpZiAoIW1jZV9mbGFncy5zbWNhKSB7CisJCWlmIChiICYmIGJhbmsgPT0gNCkKKwkJCXJldHVybiBiYW5rNF9uYW1lcyhiKTsKKworCQlyZXR1cm4gdGhfbmFtZXNbYmFua107CisJfQorCisJaWYgKCFzbWNhX2JhbmtzW2JhbmtdLnR5cGUpCisJCXJldHVybiBOVUxMOworCisJYmFua190eXBlID0gc21jYV9iYW5rc1tiYW5rXS50eXBlLT5iYW5rX3R5cGU7CisKKwlpZiAoYiAmJiBiYW5rX3R5cGUgPT0gU01DQV9VTUMpIHsKKwkJaWYgKGItPmJsb2NrIDwgQVJSQVlfU0laRShzbWNhX3VtY19ibG9ja19uYW1lcykpCisJCQlyZXR1cm4gc21jYV91bWNfYmxvY2tfbmFtZXNbYi0+YmxvY2tdOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzbnByaW50ZihidWZfbWNhdHlwZSwgTUFYX01DQVRZUEVfTkFNRV9MRU4sCisJCSAiJXNfJXgiLCBzbWNhX2JhbmtfbmFtZXNbYmFua190eXBlXS5uYW1lLAorCQkJICBzbWNhX2JhbmtzW2JhbmtdLnR5cGVfaW5zdGFuY2UpOworCXJldHVybiBidWZfbWNhdHlwZTsKK30KKwogc3RhdGljIGludCBhbGxvY2F0ZV90aHJlc2hvbGRfYmxvY2tzKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGludCBiYW5rLAogCQkJCSAgICAgdW5zaWduZWQgaW50IGJsb2NrLCB1MzIgYWRkcmVzcykKIHsKQEAgLTc2NywxMSArODk3LDExIEBACiAKIAllcnIgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmYi0+a29iaiwgJnRocmVzaG9sZF9rdHlwZSwKIAkJCQkgICBwZXJfY3B1KHRocmVzaG9sZF9iYW5rcywgY3B1KVtiYW5rXS0+a29iaiwKLQkJCQkgICAoYmFuayA9PSA0ID8gYmFuazRfbmFtZXMoYikgOiB0aF9uYW1lc1tiYW5rXSkpOworCQkJCSAgIGdldF9uYW1lKGJhbmssIGIpKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9mcmVlOwogcmVjdXJzZToKLQlhZGRyZXNzID0gZ2V0X2Jsb2NrX2FkZHJlc3MoYWRkcmVzcywgbG93LCBoaWdoLCBiYW5rLCArK2Jsb2NrKTsKKwlhZGRyZXNzID0gZ2V0X2Jsb2NrX2FkZHJlc3MoY3B1LCBhZGRyZXNzLCBsb3csIGhpZ2gsIGJhbmssICsrYmxvY2spOwogCWlmICghYWRkcmVzcykKIAkJcmV0dXJuIDA7CiAKQEAgLTgyMiw3ICs5NTIsNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBlcl9jcHUobWNlX2RldmljZSwgY3B1KTsKIAlzdHJ1Y3QgYW1kX25vcnRoYnJpZGdlICpuYiA9IE5VTEw7CiAJc3RydWN0IHRocmVzaG9sZF9iYW5rICpiID0gTlVMTDsKLQljb25zdCBjaGFyICpuYW1lID0gdGhfbmFtZXNbYmFua107CisJY29uc3QgY2hhciAqbmFtZSA9IGdldF9uYW1lKGJhbmssIE5VTEwpOwogCWludCBlcnIgPSAwOwogCiAJaWYgKGlzX3NoYXJlZF9iYW5rKGJhbmspKSB7CkBAIC04NjksNyArOTk5LDcgQEAKIAkJfQogCX0KIAotCWVyciA9IGFsbG9jYXRlX3RocmVzaG9sZF9ibG9ja3MoY3B1LCBiYW5rLCAwLCBNU1JfSUEzMl9NQ3hfTUlTQyhiYW5rKSk7CisJZXJyID0gYWxsb2NhdGVfdGhyZXNob2xkX2Jsb2NrcyhjcHUsIGJhbmssIDAsIG1zcl9vcHMubWlzYyhiYW5rKSk7CiAJaWYgKCFlcnIpCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21pY3JvY29kZS9hbWQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2FtZC5jCmluZGV4IDI3YTAyMjguLjYyMGFiMDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2FtZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2FtZC5jCkBAIC01NCw2ICs1NCw3IEBACiAgKi8KIHN0YXRpYyB1OCAqY29udGFpbmVyOwogc3RhdGljIHNpemVfdCBjb250YWluZXJfc2l6ZTsKK3N0YXRpYyBib29sIHVjb2RlX2J1aWx0aW47CiAKIHN0YXRpYyB1MzIgdWNvZGVfbmV3X3JldjsKIHN0YXRpYyB1OCBhbWRfdWNvZGVfcGF0Y2hbUEFUQ0hfTUFYX1NJWkVdOwpAQCAtMjgxLDE4ICsyODIsMjIgQEAKIHZvaWQgX19pbml0IGxvYWRfdWNvZGVfYW1kX2JzcCh1bnNpZ25lZCBpbnQgZmFtaWx5KQogewogCXN0cnVjdCBjcGlvX2RhdGEgY3A7CisJYm9vbCAqYnVpbHRpbjsKIAl2b2lkICoqZGF0YTsKIAlzaXplX3QgKnNpemU7CiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJZGF0YSA9ICAodm9pZCAqKilfX3BhX25vZGVidWcoJnVjb2RlX2NwaW8uZGF0YSk7CiAJc2l6ZSA9IChzaXplX3QgKilfX3BhX25vZGVidWcoJnVjb2RlX2NwaW8uc2l6ZSk7CisJYnVpbHRpbiA9IChib29sICopX19wYV9ub2RlYnVnKCZ1Y29kZV9idWlsdGluKTsKICNlbHNlCiAJZGF0YSA9ICZ1Y29kZV9jcGlvLmRhdGE7CiAJc2l6ZSA9ICZ1Y29kZV9jcGlvLnNpemU7CisJYnVpbHRpbiA9ICZ1Y29kZV9idWlsdGluOwogI2VuZGlmCiAKLQlpZiAoIWxvYWRfYnVpbHRpbl9hbWRfbWljcm9jb2RlKCZjcCwgZmFtaWx5KSkKKwkqYnVpbHRpbiA9IGxvYWRfYnVpbHRpbl9hbWRfbWljcm9jb2RlKCZjcCwgZmFtaWx5KTsKKwlpZiAoISpidWlsdGluKQogCQljcCA9IGZpbmRfdWNvZGVfaW5faW5pdHJkKCk7CiAKIAlpZiAoIShjcC5kYXRhICYmIGNwLnNpemUpKQpAQCAtMzU1LDYgKzM2MCw3IEBACiAJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlzdHJ1Y3QgZXF1aXZfY3B1X2VudHJ5ICplcTsKIAlzdHJ1Y3QgbWljcm9jb2RlX2FtZCAqbWM7CisJdTggKmNvbnQgPSBjb250YWluZXI7CiAJdTMyIHJldiwgZWF4OwogCXUxNiBlcV9pZDsKIApAQCAtMzcxLDggKzM3NywxMiBAQAogCWlmIChjaGVja19jdXJyZW50X3BhdGNoX2xldmVsKCZyZXYsIGZhbHNlKSkKIAkJcmV0dXJuOwogCisJLyogQWRkIENPTkZJR19SQU5ET01JWkVfTUVNT1JZIG9mZnNldC4gKi8KKwlpZiAoIXVjb2RlX2J1aWx0aW4pCisJCWNvbnQgKz0gUEFHRV9PRkZTRVQgLSBfX1BBR0VfT0ZGU0VUX0JBU0U7CisKIAllYXggPSBjcHVpZF9lYXgoMHgwMDAwMDAwMSk7Ci0JZXEgID0gKHN0cnVjdCBlcXVpdl9jcHVfZW50cnkgKikoY29udGFpbmVyICsgQ09OVEFJTkVSX0hEUl9TWik7CisJZXEgID0gKHN0cnVjdCBlcXVpdl9jcHVfZW50cnkgKikoY29udCArIENPTlRBSU5FUl9IRFJfU1opOwogCiAJZXFfaWQgPSBmaW5kX2VxdWl2X2lkKGVxLCBlYXgpOwogCWlmICghZXFfaWQpCkBAIC00MzQsNiArNDQ0LDEwIEBACiAJZWxzZQogCQljb250YWluZXIgPSBjb250X3ZhOwogCisJLyogQWRkIENPTkZJR19SQU5ET01JWkVfTUVNT1JZIG9mZnNldC4gKi8KKwlpZiAoIXVjb2RlX2J1aWx0aW4pCisJCWNvbnRhaW5lciArPSBQQUdFX09GRlNFVCAtIF9fUEFHRV9PRkZTRVRfQkFTRTsKKwogCWVheCAgID0gY3B1aWRfZWF4KDB4MDAwMDAwMDEpOwogCWVheCAgID0gKChlYXggPj4gOCkgJiAweGYpICsgKChlYXggPj4gMjApICYgMHhmZik7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2NvcmUuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2NvcmUuYwppbmRleCBkZjA0YjJkLi41Y2U1MTU1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21pY3JvY29kZS9jb3JlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvY29yZS5jCkBAIC01NTgsNTUgKzU1OCwzNiBAQAogCS5yZXN1bWUJCQk9IG1jX2JwX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBpbnQKLW1jX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgbWNfY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1KQogewotCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAogCWRldiA9IGdldF9jcHVfZGV2aWNlKGNwdSk7CisJbWljcm9jb2RlX3VwZGF0ZV9jcHUoY3B1KTsKKwlwcl9kZWJ1ZygiQ1BVJWQgYWRkZWRcbiIsIGNwdSk7CiAKLQlzd2l0Y2ggKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCQltaWNyb2NvZGVfdXBkYXRlX2NwdShjcHUpOwotCQlwcl9kZWJ1ZygiQ1BVJWQgYWRkZWRcbiIsIGNwdSk7Ci0JCS8qCi0JCSAqICJicmVhayIgaXMgbWlzc2luZyBvbiBwdXJwb3NlIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRvIGZhbGwKLQkJICogdGhyb3VnaCBpbiBvcmRlciB0byBjcmVhdGUgdGhlIHN5c2ZzIGdyb3VwLgotCQkgKi8KKwlpZiAoc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosICZtY19hdHRyX2dyb3VwKSkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIGdyb3VwIGZvciBDUFUlZFxuIiwgY3B1KTsKKwlyZXR1cm4gMDsKK30KIAotCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgotCQlpZiAoc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosICZtY19hdHRyX2dyb3VwKSkKLQkJCXByX2VycigiRmFpbGVkIHRvIGNyZWF0ZSBncm91cCBmb3IgQ1BVJWRcbiIsIGNwdSk7Ci0JCWJyZWFrOworc3RhdGljIGludCBtY19jcHVfZG93bl9wcmVwKHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IGRldmljZSAqZGV2OwogCi0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCQkvKiBTdXNwZW5kIGlzIGluIHByb2dyZXNzLCBvbmx5IHJlbW92ZSB0aGUgaW50ZXJmYWNlICovCi0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCAmbWNfYXR0cl9ncm91cCk7Ci0JCXByX2RlYnVnKCJDUFUlZCByZW1vdmVkXG4iLCBjcHUpOwotCQlicmVhazsKLQorCWRldiA9IGdldF9jcHVfZGV2aWNlKGNwdSk7CisJLyogU3VzcGVuZCBpcyBpbiBwcm9ncmVzcywgb25seSByZW1vdmUgdGhlIGludGVyZmFjZSAqLworCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCAmbWNfYXR0cl9ncm91cCk7CisJcHJfZGVidWcoIkNQVSVkIHJlbW92ZWRcbiIsIGNwdSk7CiAJLyoKLQkgKiBjYXNlIENQVV9ERUFEOgotCSAqCiAJICogV2hlbiBhIENQVSBnb2VzIG9mZmxpbmUsIGRvbid0IGZyZWUgdXAgb3IgaW52YWxpZGF0ZSB0aGUgY29weSBvZgogCSAqIHRoZSBtaWNyb2NvZGUgaW4ga2VybmVsIG1lbW9yeSwgc28gdGhhdCB3ZSBjYW4gcmV1c2UgaXQgd2hlbiB0aGUKIAkgKiBDUFUgY29tZXMgYmFjayBvbmxpbmUgd2l0aG91dCB1bm5lY2Vzc2FyaWx5IHJlcXVlc3RpbmcgdGhlIHVzZXJzcGFjZQogCSAqIGZvciBpdCBhZ2Fpbi4KIAkgKi8KLQl9Ci0KLQkvKiBUaGUgQ1BVIHJlZnVzZWQgdG8gY29tZSB1cCBkdXJpbmcgYSBzeXN0ZW0gcmVzdW1lICovCi0JaWYgKGFjdGlvbiA9PSBDUFVfVVBfQ0FOQ0VMRURfRlJPWkVOKQotCQltaWNyb2NvZGVfZmluaV9jcHUoY3B1KTsKLQotCXJldHVybiBOT1RJRllfT0s7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbWNfY3B1X25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsCT0gbWNfY3B1X2NhbGxiYWNrLAotfTsKLQogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNwdV9yb290X21pY3JvY29kZV9hdHRyc1tdID0gewogCSZkZXZfYXR0cl9yZWxvYWQuYXR0ciwKIAlOVUxMCkBAIC02NjUsNyArNjQ2LDggQEAKIAkJZ290byBvdXRfdWNvZGVfZ3JvdXA7CiAKIAlyZWdpc3Rlcl9zeXNjb3JlX29wcygmbWNfc3lzY29yZV9vcHMpOwotCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmbWNfY3B1X25vdGlmaWVyKTsKKwljcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0FQX09OTElORV9EWU4sICJ4ODYvbWljcm9jb2RlOm9ubGluZSIsCisJCQkJICBtY19jcHVfb25saW5lLCBtY19jcHVfZG93bl9wcmVwKTsKIAogCXByX2luZm8oIk1pY3JvY29kZSBVcGRhdGUgRHJpdmVyOiB2IiBNSUNST0NPREVfVkVSU0lPTgogCQkiIDx0aWdyYW5AYWl2YXppYW4uZnNuZXQuY28udWs+LCBQZXRlciBPcnViYVxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvbWFpbi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL21haW4uYwppbmRleCAyOGYxYjU0Li4yNGU4N2U3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvbWFpbi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMKQEAgLTcyLDE0ICs3MiwxNCBAQAogdTY0IHNpemVfb3JfbWFzaywgc2l6ZV9hbmRfbWFzazsKIHN0YXRpYyBib29sIG10cnJfYXBzX2RlbGF5ZWRfaW5pdDsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBtdHJyX29wcyAqbXRycl9vcHNbWDg2X1ZFTkRPUl9OVU1dOworc3RhdGljIGNvbnN0IHN0cnVjdCBtdHJyX29wcyAqbXRycl9vcHNbWDg2X1ZFTkRPUl9OVU1dIF9fcm9fYWZ0ZXJfaW5pdDsKIAogY29uc3Qgc3RydWN0IG10cnJfb3BzICptdHJyX2lmOwogCiBzdGF0aWMgdm9pZCBzZXRfbXRycih1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBsb25nIGJhc2UsCiAJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBtdHJyX3R5cGUgdHlwZSk7CiAKLXZvaWQgc2V0X210cnJfb3BzKGNvbnN0IHN0cnVjdCBtdHJyX29wcyAqb3BzKQordm9pZCBfX2luaXQgc2V0X210cnJfb3BzKGNvbnN0IHN0cnVjdCBtdHJyX29wcyAqb3BzKQogewogCWlmIChvcHMtPnZlbmRvciAmJiBvcHMtPnZlbmRvciA8IFg4Nl9WRU5ET1JfTlVNKQogCQltdHJyX29wc1tvcHMtPnZlbmRvcl0gPSBvcHM7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvbXRyci5oIGIvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL210cnIuaAppbmRleCA2YzdjZWQwLi5hZDhiZDc2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvbXRyci5oCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9tdHJyLmgKQEAgLTU0LDcgKzU0LDcgQEAKIGJvb2wgZ2V0X210cnJfc3RhdGUodm9pZCk7CiB2b2lkIG10cnJfYnBfcGF0X2luaXQodm9pZCk7CiAKLWV4dGVybiB2b2lkIHNldF9tdHJyX29wcyhjb25zdCBzdHJ1Y3QgbXRycl9vcHMgKm9wcyk7CitleHRlcm4gdm9pZCBfX2luaXQgc2V0X210cnJfb3BzKGNvbnN0IHN0cnVjdCBtdHJyX29wcyAqb3BzKTsKIAogZXh0ZXJuIHU2NCBzaXplX29yX21hc2ssIHNpemVfYW5kX21hc2s7CiBleHRlcm4gY29uc3Qgc3RydWN0IG10cnJfb3BzICptdHJyX2lmOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFjay5jIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFjay5jCmluZGV4IDkyZThmMGEuLjliN2NmNWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2suYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrLmMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogCiAjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KLQorI2luY2x1ZGUgPGFzbS91bndpbmQuaD4KIAogaW50IHBhbmljX29uX3VucmVjb3ZlcmVkX25taTsKIGludCBwYW5pY19vbl9pb19ubWk7CkBAIC0yNSwxMSArMjUsMjkgQEAKIGludCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQgPSAzICogU1RBQ0tTTE9UU19QRVJfTElORTsKIHN0YXRpYyBpbnQgZGllX2NvdW50ZXI7CiAKLXN0YXRpYyB2b2lkIHByaW50a19zdGFja19hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IHJlbGlhYmxlLAotCQl2b2lkICpkYXRhKQorYm9vbCBpbl90YXNrX3N0YWNrKHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCSAgIHN0cnVjdCBzdGFja19pbmZvICppbmZvKQogeworCXVuc2lnbmVkIGxvbmcgKmJlZ2luID0gdGFza19zdGFja19wYWdlKHRhc2spOworCXVuc2lnbmVkIGxvbmcgKmVuZCAgID0gdGFza19zdGFja19wYWdlKHRhc2spICsgVEhSRUFEX1NJWkU7CisKKwlpZiAoc3RhY2sgPCBiZWdpbiB8fCBzdGFjayA+PSBlbmQpCisJCXJldHVybiBmYWxzZTsKKworCWluZm8tPnR5cGUJPSBTVEFDS19UWVBFX1RBU0s7CisJaW5mby0+YmVnaW4JPSBiZWdpbjsKKwlpbmZvLT5lbmQJPSBlbmQ7CisJaW5mby0+bmV4dF9zcAk9IE5VTEw7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRrX3N0YWNrX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgcmVsaWFibGUsCisJCQkJIGNoYXIgKmxvZ19sdmwpCit7CisJdG91Y2hfbm1pX3dhdGNoZG9nKCk7CiAJcHJpbnRrKCIlcyBbPCVwPl0gJXMlcEJcbiIsCi0JCShjaGFyICopZGF0YSwgKHZvaWQgKilhZGRyZXNzLCByZWxpYWJsZSA/ICIiIDogIj8gIiwKKwkJbG9nX2x2bCwgKHZvaWQgKilhZGRyZXNzLCByZWxpYWJsZSA/ICIiIDogIj8gIiwKIAkJKHZvaWQgKilhZGRyZXNzKTsKIH0KIApAQCAtMzgsMTc2ICs1NiwxMjAgQEAKIAlwcl9jb250KCIgWzwlcD5dICVwU1xuIiwgKHZvaWQgKilhZGRyZXNzLCAodm9pZCAqKWFkZHJlc3MpOwogfQogCi0jaWZkZWYgQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgotc3RhdGljIHZvaWQKLXByaW50X2Z0cmFjZV9ncmFwaF9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSwKLQkJCWNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLAotCQkJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgKmdyYXBoKQordm9pZCBzaG93X3RyYWNlX2xvZ19sdmwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCXVuc2lnbmVkIGxvbmcgKnN0YWNrLCBjaGFyICpsb2dfbHZsKQogewotCXVuc2lnbmVkIGxvbmcgcmV0X2FkZHI7Ci0JaW50IGluZGV4OworCXN0cnVjdCB1bndpbmRfc3RhdGUgc3RhdGU7CisJc3RydWN0IHN0YWNrX2luZm8gc3RhY2tfaW5mbyA9IHswfTsKKwl1bnNpZ25lZCBsb25nIHZpc2l0X21hc2sgPSAwOworCWludCBncmFwaF9pZHggPSAwOwogCi0JaWYgKGFkZHIgIT0gKHVuc2lnbmVkIGxvbmcpcmV0dXJuX3RvX2hhbmRsZXIpCi0JCXJldHVybjsKKwlwcmludGsoIiVzQ2FsbCBUcmFjZTpcbiIsIGxvZ19sdmwpOwogCi0JaW5kZXggPSB0YXNrLT5jdXJyX3JldF9zdGFjazsKLQotCWlmICghdGFzay0+cmV0X3N0YWNrIHx8IGluZGV4IDwgKmdyYXBoKQotCQlyZXR1cm47Ci0KLQlpbmRleCAtPSAqZ3JhcGg7Ci0JcmV0X2FkZHIgPSB0YXNrLT5yZXRfc3RhY2tbaW5kZXhdLnJldDsKLQotCW9wcy0+YWRkcmVzcyhkYXRhLCByZXRfYWRkciwgMSk7Ci0KLQkoKmdyYXBoKSsrOwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZAotcHJpbnRfZnRyYWNlX2dyYXBoX2FkZHIodW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkYXRhLAotCQkJY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsCi0JCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCAqZ3JhcGgpCi17IH0KLSNlbmRpZgotCi0vKgotICogeDg2LTY0IGNhbiBoYXZlIHVwIHRvIHRocmVlIGtlcm5lbCBzdGFja3M6Ci0gKiBwcm9jZXNzIHN0YWNrCi0gKiBpbnRlcnJ1cHQgc3RhY2sKLSAqIHNldmVyZSBleGNlcHRpb24gKGRvdWJsZSBmYXVsdCwgbm1pLCBzdGFjayBmYXVsdCwgZGVidWcsIG1jZSkgaGFyZHdhcmUgc3RhY2sKLSAqLwotCi1zdGF0aWMgaW5saW5lIGludCB2YWxpZF9zdGFja19wdHIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAotCQkJdm9pZCAqcCwgdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKmVuZCkKLXsKLQl2b2lkICp0ID0gdGFza19zdGFja19wYWdlKHRhc2spOwotCWlmIChlbmQpIHsKLQkJaWYgKHAgPCBlbmQgJiYgcCA+PSAoZW5kLVRIUkVBRF9TSVpFKSkKLQkJCXJldHVybiAxOwotCQllbHNlCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIHAgPj0gdCAmJiBwIDwgdCArIFRIUkVBRF9TSVpFIC0gc2l6ZTsKLX0KLQotdW5zaWduZWQgbG9uZwotcHJpbnRfY29udGV4dF9zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCXVuc2lnbmVkIGxvbmcgKnN0YWNrLCB1bnNpZ25lZCBsb25nIGJwLAotCQljb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgKm9wcywgdm9pZCAqZGF0YSwKLQkJdW5zaWduZWQgbG9uZyAqZW5kLCBpbnQgKmdyYXBoKQotewotCXN0cnVjdCBzdGFja19mcmFtZSAqZnJhbWUgPSAoc3RydWN0IHN0YWNrX2ZyYW1lICopYnA7CisJdW53aW5kX3N0YXJ0KCZzdGF0ZSwgdGFzaywgcmVncywgc3RhY2spOwogCiAJLyoKLQkgKiBJZiB3ZSBvdmVyZmxvd2VkIHRoZSBzdGFjayBpbnRvIGEgZ3VhcmQgcGFnZSwganVtcCBiYWNrIHRvIHRoZQotCSAqIGJvdHRvbSBvZiB0aGUgdXNhYmxlIHN0YWNrLgorCSAqIEl0ZXJhdGUgdGhyb3VnaCB0aGUgc3RhY2tzLCBzdGFydGluZyB3aXRoIHRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIuCisJICogRWFjaCBzdGFjayBoYXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IG9uZS4KKwkgKgorCSAqIHg4Ni02NCBjYW4gaGF2ZSBzZXZlcmFsIHN0YWNrczoKKwkgKiAtIHRhc2sgc3RhY2sKKwkgKiAtIGludGVycnVwdCBzdGFjaworCSAqIC0gSFcgZXhjZXB0aW9uIHN0YWNrcyAoZG91YmxlIGZhdWx0LCBubWksIGRlYnVnLCBtY2UpCisJICoKKwkgKiB4ODYtMzIgY2FuIGhhdmUgdXAgdG8gdGhyZWUgc3RhY2tzOgorCSAqIC0gdGFzayBzdGFjaworCSAqIC0gc29mdGlycSBzdGFjaworCSAqIC0gaGFyZGlycSBzdGFjawogCSAqLwotCWlmICgodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UodGFzaykgLSAodW5zaWduZWQgbG9uZylzdGFjayA8Ci0JICAgIFBBR0VfU0laRSkKLQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKXRhc2tfc3RhY2tfcGFnZSh0YXNrKTsKKwlmb3IgKDsgc3RhY2s7IHN0YWNrID0gc3RhY2tfaW5mby5uZXh0X3NwKSB7CisJCWNvbnN0IGNoYXIgKnN0cl9iZWdpbiwgKnN0cl9lbmQ7CiAKLQl3aGlsZSAodmFsaWRfc3RhY2tfcHRyKHRhc2ssIHN0YWNrLCBzaXplb2YoKnN0YWNrKSwgZW5kKSkgewotCQl1bnNpZ25lZCBsb25nIGFkZHI7CisJCS8qCisJCSAqIElmIHdlIG92ZXJmbG93ZWQgdGhlIHRhc2sgc3RhY2sgaW50byBhIGd1YXJkIHBhZ2UsIGp1bXAgYmFjaworCQkgKiB0byB0aGUgYm90dG9tIG9mIHRoZSB1c2FibGUgc3RhY2suCisJCSAqLworCQlpZiAodGFza19zdGFja19wYWdlKHRhc2spIC0gKHZvaWQgKilzdGFjayA8IFBBR0VfU0laRSkKKwkJCXN0YWNrID0gdGFza19zdGFja19wYWdlKHRhc2spOwogCi0JCWFkZHIgPSAqc3RhY2s7Ci0JCWlmIChfX2tlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpIHsKLQkJCWlmICgodW5zaWduZWQgbG9uZykgc3RhY2sgPT0gYnAgKyBzaXplb2YobG9uZykpIHsKLQkJCQlvcHMtPmFkZHJlc3MoZGF0YSwgYWRkciwgMSk7Ci0JCQkJZnJhbWUgPSBmcmFtZS0+bmV4dF9mcmFtZTsKLQkJCQlicCA9ICh1bnNpZ25lZCBsb25nKSBmcmFtZTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3BzLT5hZGRyZXNzKGRhdGEsIGFkZHIsIDApOwotCQkJfQotCQkJcHJpbnRfZnRyYWNlX2dyYXBoX2FkZHIoYWRkciwgZGF0YSwgb3BzLCB0YXNrLCBncmFwaCk7CisJCWlmIChnZXRfc3RhY2tfaW5mbyhzdGFjaywgdGFzaywgJnN0YWNrX2luZm8sICZ2aXNpdF9tYXNrKSkKKwkJCWJyZWFrOworCisJCXN0YWNrX3R5cGVfc3RyKHN0YWNrX2luZm8udHlwZSwgJnN0cl9iZWdpbiwgJnN0cl9lbmQpOworCQlpZiAoc3RyX2JlZ2luKQorCQkJcHJpbnRrKCIlcyA8JXM+ICIsIGxvZ19sdmwsIHN0cl9iZWdpbik7CisKKwkJLyoKKwkJICogU2NhbiB0aGUgc3RhY2ssIHByaW50aW5nIGFueSB0ZXh0IGFkZHJlc3NlcyB3ZSBmaW5kLiAgQXQgdGhlCisJCSAqIHNhbWUgdGltZSwgZm9sbG93IHByb3BlciBzdGFjayBmcmFtZXMgd2l0aCB0aGUgdW53aW5kZXIuCisJCSAqCisJCSAqIEFkZHJlc3NlcyBmb3VuZCBkdXJpbmcgdGhlIHNjYW4gd2hpY2ggYXJlIG5vdCByZXBvcnRlZCBieQorCQkgKiB0aGUgdW53aW5kZXIgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYWRkaXRpb25hbCBjbHVlcyB3aGljaCBhcmUKKwkJICogc29tZXRpbWVzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBhcmUgcHJlZml4ZWQgd2l0aCAnPycuCisJCSAqIFRoaXMgYWxzbyBzZXJ2ZXMgYXMgYSBmYWlsc2FmZSBvcHRpb24gaW4gY2FzZSB0aGUgdW53aW5kZXIKKwkJICogZ29lcyBvZmYgaW4gdGhlIHdlZWRzLgorCQkgKi8KKwkJZm9yICg7IHN0YWNrIDwgc3RhY2tfaW5mby5lbmQ7IHN0YWNrKyspIHsKKwkJCXVuc2lnbmVkIGxvbmcgcmVhbF9hZGRyOworCQkJaW50IHJlbGlhYmxlID0gMDsKKwkJCXVuc2lnbmVkIGxvbmcgYWRkciA9ICpzdGFjazsKKwkJCXVuc2lnbmVkIGxvbmcgKnJldF9hZGRyX3AgPQorCQkJCXVud2luZF9nZXRfcmV0dXJuX2FkZHJlc3NfcHRyKCZzdGF0ZSk7CisKKwkJCWlmICghX19rZXJuZWxfdGV4dF9hZGRyZXNzKGFkZHIpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc3RhY2sgPT0gcmV0X2FkZHJfcCkKKwkJCQlyZWxpYWJsZSA9IDE7CisKKwkJCS8qCisJCQkgKiBXaGVuIGZ1bmN0aW9uIGdyYXBoIHRyYWNpbmcgaXMgZW5hYmxlZCBmb3IgYQorCQkJICogZnVuY3Rpb24sIGl0cyByZXR1cm4gYWRkcmVzcyBvbiB0aGUgc3RhY2sgaXMKKwkJCSAqIHJlcGxhY2VkIHdpdGggdGhlIGFkZHJlc3Mgb2YgYW4gZnRyYWNlIGhhbmRsZXIKKwkJCSAqIChyZXR1cm5fdG9faGFuZGxlcikuICBJbiB0aGF0IGNhc2UsIGJlZm9yZSBwcmludGluZworCQkJICogdGhlICJyZWFsIiBhZGRyZXNzLCB3ZSB3YW50IHRvIHByaW50IHRoZSBoYW5kbGVyCisJCQkgKiBhZGRyZXNzIGFzIGFuICJ1bnJlbGlhYmxlIiBoaW50IHRoYXQgZnVuY3Rpb24gZ3JhcGgKKwkJCSAqIHRyYWNpbmcgd2FzIGludm9sdmVkLgorCQkJICovCisJCQlyZWFsX2FkZHIgPSBmdHJhY2VfZ3JhcGhfcmV0X2FkZHIodGFzaywgJmdyYXBoX2lkeCwKKwkJCQkJCQkgIGFkZHIsIHN0YWNrKTsKKwkJCWlmIChyZWFsX2FkZHIgIT0gYWRkcikKKwkJCQlwcmludGtfc3RhY2tfYWRkcmVzcyhhZGRyLCAwLCBsb2dfbHZsKTsKKwkJCXByaW50a19zdGFja19hZGRyZXNzKHJlYWxfYWRkciwgcmVsaWFibGUsIGxvZ19sdmwpOworCisJCQlpZiAoIXJlbGlhYmxlKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogR2V0IHRoZSBuZXh0IGZyYW1lIGZyb20gdGhlIHVud2luZGVyLiAgTm8gbmVlZCB0bworCQkJICogY2hlY2sgZm9yIGFuIGVycm9yOiBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCB0aGUgcmVzdAorCQkJICogb2YgdGhlIGFkZHJlc3NlcyB3aWxsIGp1c3QgYmUgcHJpbnRlZCBhcyB1bnJlbGlhYmxlLgorCQkJICovCisJCQl1bndpbmRfbmV4dF9mcmFtZSgmc3RhdGUpOwogCQl9Ci0JCXN0YWNrKys7CisKKwkJaWYgKHN0cl9lbmQpCisJCQlwcmludGsoIiVzIDwlcz4gIiwgbG9nX2x2bCwgc3RyX2VuZCk7CiAJfQotCXJldHVybiBicDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHByaW50X2NvbnRleHRfc3RhY2spOwotCi11bnNpZ25lZCBsb25nCi1wcmludF9jb250ZXh0X3N0YWNrX2JwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnN0YWNrLCB1bnNpZ25lZCBsb25nIGJwLAotCQkgICAgICAgY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nICplbmQsIGludCAqZ3JhcGgpCi17Ci0Jc3RydWN0IHN0YWNrX2ZyYW1lICpmcmFtZSA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKilicDsKLQl1bnNpZ25lZCBsb25nICpyZXRfYWRkciA9ICZmcmFtZS0+cmV0dXJuX2FkZHJlc3M7Ci0KLQl3aGlsZSAodmFsaWRfc3RhY2tfcHRyKHRhc2ssIHJldF9hZGRyLCBzaXplb2YoKnJldF9hZGRyKSwgZW5kKSkgewotCQl1bnNpZ25lZCBsb25nIGFkZHIgPSAqcmV0X2FkZHI7Ci0KLQkJaWYgKCFfX2tlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpCi0JCQlicmVhazsKLQotCQlpZiAob3BzLT5hZGRyZXNzKGRhdGEsIGFkZHIsIDEpKQotCQkJYnJlYWs7Ci0JCWZyYW1lID0gZnJhbWUtPm5leHRfZnJhbWU7Ci0JCXJldF9hZGRyID0gJmZyYW1lLT5yZXR1cm5fYWRkcmVzczsKLQkJcHJpbnRfZnRyYWNlX2dyYXBoX2FkZHIoYWRkciwgZGF0YSwgb3BzLCB0YXNrLCBncmFwaCk7Ci0JfQotCi0JcmV0dXJuICh1bnNpZ25lZCBsb25nKWZyYW1lOwotfQotRVhQT1JUX1NZTUJPTF9HUEwocHJpbnRfY29udGV4dF9zdGFja19icCk7Ci0KLXN0YXRpYyBpbnQgcHJpbnRfdHJhY2Vfc3RhY2sodm9pZCAqZGF0YSwgY2hhciAqbmFtZSkKLXsKLQlwcmludGsoIiVzIDwlcz4gIiwgKGNoYXIgKilkYXRhLCBuYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFByaW50IG9uZSBhZGRyZXNzL3N5bWJvbCBlbnRyaWVzIHBlciBsaW5lLgotICovCi1zdGF0aWMgaW50IHByaW50X3RyYWNlX2FkZHJlc3Modm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgcmVsaWFibGUpCi17Ci0JdG91Y2hfbm1pX3dhdGNoZG9nKCk7Ci0JcHJpbnRrX3N0YWNrX2FkZHJlc3MoYWRkciwgcmVsaWFibGUsIGRhdGEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzIHByaW50X3RyYWNlX29wcyA9IHsKLQkuc3RhY2sJCQk9IHByaW50X3RyYWNlX3N0YWNrLAotCS5hZGRyZXNzCQk9IHByaW50X3RyYWNlX2FkZHJlc3MsCi0JLndhbGtfc3RhY2sJCT0gcHJpbnRfY29udGV4dF9zdGFjaywKLX07Ci0KLXZvaWQKLXNob3dfdHJhY2VfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwgY2hhciAqbG9nX2x2bCkKLXsKLQlwcmludGsoIiVzQ2FsbCBUcmFjZTpcbiIsIGxvZ19sdmwpOwotCWR1bXBfdHJhY2UodGFzaywgcmVncywgc3RhY2ssIGJwLCAmcHJpbnRfdHJhY2Vfb3BzLCBsb2dfbHZsKTsKLX0KLQotdm9pZCBzaG93X3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCXVuc2lnbmVkIGxvbmcgKnN0YWNrLCB1bnNpZ25lZCBsb25nIGJwKQotewotCXNob3dfdHJhY2VfbG9nX2x2bCh0YXNrLCByZWdzLCBzdGFjaywgYnAsICIiKTsKIH0KIAogdm9pZCBzaG93X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3ApCiB7Ci0JdW5zaWduZWQgbG9uZyBicCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBzdGFjazsKKwl0YXNrID0gdGFzayA/IDogY3VycmVudDsKIAogCS8qCiAJICogU3RhY2sgZnJhbWVzIGJlbG93IHRoaXMgb25lIGFyZW4ndCBpbnRlcmVzdGluZy4gIERvbid0IHNob3cgdGhlbQogCSAqIGlmIHdlJ3JlIHByaW50aW5nIGZvciAlY3VycmVudC4KIAkgKi8KLQlpZiAoIXNwICYmICghdGFzayB8fCB0YXNrID09IGN1cnJlbnQpKSB7Ci0JCXNwID0gJnN0YWNrOwotCQlicCA9IHN0YWNrX2ZyYW1lKGN1cnJlbnQsIE5VTEwpOwotCX0KKwlpZiAoIXNwICYmIHRhc2sgPT0gY3VycmVudCkKKwkJc3AgPSBnZXRfc3RhY2tfcG9pbnRlcihjdXJyZW50LCBOVUxMKTsKIAotCXNob3dfc3RhY2tfbG9nX2x2bCh0YXNrLCBOVUxMLCBzcCwgYnAsICIiKTsKKwlzaG93X3N0YWNrX2xvZ19sdmwodGFzaywgTlVMTCwgc3AsICIiKTsKIH0KIAogdm9pZCBzaG93X3N0YWNrX3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc2hvd19zdGFja19sb2dfbHZsKGN1cnJlbnQsIHJlZ3MsICh1bnNpZ25lZCBsb25nICopcmVncy0+c3AsIHJlZ3MtPmJwLCAiIik7CisJc2hvd19zdGFja19sb2dfbHZsKGN1cnJlbnQsIHJlZ3MsIE5VTEwsICIiKTsKIH0KIAogc3RhdGljIGFyY2hfc3BpbmxvY2tfdCBkaWVfbG9jayA9IF9fQVJDSF9TUElOX0xPQ0tfVU5MT0NLRUQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzMyLmMKaW5kZXggMDk2NzU3MS4uMDZlYjMyMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja18zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfMzIuYwpAQCAtMTYsOTMgKzE2LDEyMSBAQAogCiAjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KIAotc3RhdGljIHZvaWQgKmlzX2lycV9zdGFjayh2b2lkICpwLCB2b2lkICppcnEpCit2b2lkIHN0YWNrX3R5cGVfc3RyKGVudW0gc3RhY2tfdHlwZSB0eXBlLCBjb25zdCBjaGFyICoqYmVnaW4sIGNvbnN0IGNoYXIgKiplbmQpCiB7Ci0JaWYgKHAgPCBpcnEgfHwgcCA+PSAoaXJxICsgVEhSRUFEX1NJWkUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gaXJxICsgVEhSRUFEX1NJWkU7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTVEFDS19UWVBFX0lSUToKKwljYXNlIFNUQUNLX1RZUEVfU09GVElSUToKKwkJKmJlZ2luID0gIklSUSI7CisJCSplbmQgICA9ICJFT0kiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkqYmVnaW4gPSBOVUxMOworCQkqZW5kICAgPSBOVUxMOworCX0KIH0KIAotCi1zdGF0aWMgdm9pZCAqaXNfaGFyZGlycV9zdGFjayh1bnNpZ25lZCBsb25nICpzdGFjaywgaW50IGNwdSkKK3N0YXRpYyBib29sIGluX2hhcmRpcnFfc3RhY2sodW5zaWduZWQgbG9uZyAqc3RhY2ssIHN0cnVjdCBzdGFja19pbmZvICppbmZvKQogewotCXZvaWQgKmlycSA9IHBlcl9jcHUoaGFyZGlycV9zdGFjaywgY3B1KTsKKwl1bnNpZ25lZCBsb25nICpiZWdpbiA9ICh1bnNpZ25lZCBsb25nICopdGhpc19jcHVfcmVhZChoYXJkaXJxX3N0YWNrKTsKKwl1bnNpZ25lZCBsb25nICplbmQgICA9IGJlZ2luICsgKFRIUkVBRF9TSVpFIC8gc2l6ZW9mKGxvbmcpKTsKIAotCXJldHVybiBpc19pcnFfc3RhY2soc3RhY2ssIGlycSk7CisJLyoKKwkgKiBUaGlzIGlzIGEgc29mdHdhcmUgc3RhY2ssIHNvICdlbmQnIGNhbiBiZSBhIHZhbGlkIHN0YWNrIHBvaW50ZXIuCisJICogSXQganVzdCBtZWFucyB0aGUgc3RhY2sgaXMgZW1wdHkuCisJICovCisJaWYgKHN0YWNrIDwgYmVnaW4gfHwgc3RhY2sgPiBlbmQpCisJCXJldHVybiBmYWxzZTsKKworCWluZm8tPnR5cGUJPSBTVEFDS19UWVBFX0lSUTsKKwlpbmZvLT5iZWdpbgk9IGJlZ2luOworCWluZm8tPmVuZAk9IGVuZDsKKworCS8qCisJICogU2VlIGlycV8zMi5jIC0tIHRoZSBuZXh0IHN0YWNrIHBvaW50ZXIgaXMgc3RvcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YKKwkgKiB0aGUgc3RhY2suCisJICovCisJaW5mby0+bmV4dF9zcAk9ICh1bnNpZ25lZCBsb25nICopKmJlZ2luOworCisJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkICppc19zb2Z0aXJxX3N0YWNrKHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBpbnQgY3B1KQorc3RhdGljIGJvb2wgaW5fc29mdGlycV9zdGFjayh1bnNpZ25lZCBsb25nICpzdGFjaywgc3RydWN0IHN0YWNrX2luZm8gKmluZm8pCiB7Ci0Jdm9pZCAqaXJxID0gcGVyX2NwdShzb2Z0aXJxX3N0YWNrLCBjcHUpOworCXVuc2lnbmVkIGxvbmcgKmJlZ2luID0gKHVuc2lnbmVkIGxvbmcgKil0aGlzX2NwdV9yZWFkKHNvZnRpcnFfc3RhY2spOworCXVuc2lnbmVkIGxvbmcgKmVuZCAgID0gYmVnaW4gKyAoVEhSRUFEX1NJWkUgLyBzaXplb2YobG9uZykpOwogCi0JcmV0dXJuIGlzX2lycV9zdGFjayhzdGFjaywgaXJxKTsKKwkvKgorCSAqIFRoaXMgaXMgYSBzb2Z0d2FyZSBzdGFjaywgc28gJ2VuZCcgY2FuIGJlIGEgdmFsaWQgc3RhY2sgcG9pbnRlci4KKwkgKiBJdCBqdXN0IG1lYW5zIHRoZSBzdGFjayBpcyBlbXB0eS4KKwkgKi8KKwlpZiAoc3RhY2sgPCBiZWdpbiB8fCBzdGFjayA+IGVuZCkKKwkJcmV0dXJuIGZhbHNlOworCisJaW5mby0+dHlwZQk9IFNUQUNLX1RZUEVfU09GVElSUTsKKwlpbmZvLT5iZWdpbgk9IGJlZ2luOworCWluZm8tPmVuZAk9IGVuZDsKKworCS8qCisJICogVGhlIG5leHQgc3RhY2sgcG9pbnRlciBpcyBzdG9yZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RhY2suCisJICogU2VlIGlycV8zMi5jLgorCSAqLworCWluZm8tPm5leHRfc3AJPSAodW5zaWduZWQgbG9uZyAqKSpiZWdpbjsKKworCXJldHVybiB0cnVlOwogfQogCi12b2lkIGR1bXBfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnAsCi0JCWNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLCB2b2lkICpkYXRhKQoraW50IGdldF9zdGFja19pbmZvKHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCSAgIHN0cnVjdCBzdGFja19pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nICp2aXNpdF9tYXNrKQogewotCWNvbnN0IHVuc2lnbmVkIGNwdSA9IGdldF9jcHUoKTsKLQlpbnQgZ3JhcGggPSAwOwotCXUzMiAqcHJldl9lc3A7CisJaWYgKCFzdGFjaykKKwkJZ290byB1bmtub3duOwogCi0JaWYgKCF0YXNrKQotCQl0YXNrID0gY3VycmVudDsKKwl0YXNrID0gdGFzayA/IDogY3VycmVudDsKIAotCWlmICghc3RhY2spIHsKLQkJdW5zaWduZWQgbG9uZyBkdW1teTsKKwlpZiAoaW5fdGFza19zdGFjayhzdGFjaywgdGFzaywgaW5mbykpCisJCWdvdG8gcmVjdXJzaW9uX2NoZWNrOwogCi0JCXN0YWNrID0gJmR1bW15OwotCQlpZiAodGFzayAhPSBjdXJyZW50KQotCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5zcDsKKwlpZiAodGFzayAhPSBjdXJyZW50KQorCQlnb3RvIHVua25vd247CisKKwlpZiAoaW5faGFyZGlycV9zdGFjayhzdGFjaywgaW5mbykpCisJCWdvdG8gcmVjdXJzaW9uX2NoZWNrOworCisJaWYgKGluX3NvZnRpcnFfc3RhY2soc3RhY2ssIGluZm8pKQorCQlnb3RvIHJlY3Vyc2lvbl9jaGVjazsKKworCWdvdG8gdW5rbm93bjsKKworcmVjdXJzaW9uX2NoZWNrOgorCS8qCisJICogTWFrZSBzdXJlIHdlIGRvbid0IGl0ZXJhdGUgdGhyb3VnaCBhbnkgZ2l2ZW4gc3RhY2sgbW9yZSB0aGFuIG9uY2UuCisJICogSWYgaXQgY29tZXMgdXAgYSBzZWNvbmQgdGltZSB0aGVuIHRoZXJlJ3Mgc29tZXRoaW5nIHdyb25nIGdvaW5nIG9uOgorCSAqIGp1c3QgYnJlYWsgb3V0IGFuZCByZXBvcnQgYW4gdW5rbm93biBzdGFjayB0eXBlLgorCSAqLworCWlmICh2aXNpdF9tYXNrKSB7CisJCWlmICgqdmlzaXRfbWFzayAmICgxVUwgPDwgaW5mby0+dHlwZSkpCisJCQlnb3RvIHVua25vd247CisJCSp2aXNpdF9tYXNrIHw9IDFVTCA8PCBpbmZvLT50eXBlOwogCX0KIAotCWlmICghYnApCi0JCWJwID0gc3RhY2tfZnJhbWUodGFzaywgcmVncyk7CisJcmV0dXJuIDA7CiAKLQlmb3IgKDs7KSB7Ci0JCXZvaWQgKmVuZF9zdGFjazsKLQotCQllbmRfc3RhY2sgPSBpc19oYXJkaXJxX3N0YWNrKHN0YWNrLCBjcHUpOwotCQlpZiAoIWVuZF9zdGFjaykKLQkJCWVuZF9zdGFjayA9IGlzX3NvZnRpcnFfc3RhY2soc3RhY2ssIGNwdSk7Ci0KLQkJYnAgPSBvcHMtPndhbGtfc3RhY2sodGFzaywgc3RhY2ssIGJwLCBvcHMsIGRhdGEsCi0JCQkJICAgICBlbmRfc3RhY2ssICZncmFwaCk7Ci0KLQkJLyogU3RvcCBpZiBub3Qgb24gaXJxIHN0YWNrICovCi0JCWlmICghZW5kX3N0YWNrKQotCQkJYnJlYWs7Ci0KLQkJLyogVGhlIHByZXZpb3VzIGVzcCBpcyBzYXZlZCBvbiB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayAqLwotCQlwcmV2X2VzcCA9ICh1MzIgKikoZW5kX3N0YWNrIC0gVEhSRUFEX1NJWkUpOwotCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopKnByZXZfZXNwOwotCQlpZiAoIXN0YWNrKQotCQkJYnJlYWs7Ci0KLQkJaWYgKG9wcy0+c3RhY2soZGF0YSwgIklSUSIpIDwgMCkKLQkJCWJyZWFrOwotCQl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKLQl9Ci0JcHV0X2NwdSgpOwordW5rbm93bjoKKwlpbmZvLT50eXBlID0gU1RBQ0tfVFlQRV9VTktOT1dOOworCXJldHVybiAtRUlOVkFMOwogfQotRVhQT1JUX1NZTUJPTChkdW1wX3RyYWNlKTsKIAotdm9pZAotc2hvd19zdGFja19sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCSAgIHVuc2lnbmVkIGxvbmcgKnNwLCB1bnNpZ25lZCBsb25nIGJwLCBjaGFyICpsb2dfbHZsKQordm9pZCBzaG93X3N0YWNrX2xvZ19sdmwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCXVuc2lnbmVkIGxvbmcgKnNwLCBjaGFyICpsb2dfbHZsKQogewogCXVuc2lnbmVkIGxvbmcgKnN0YWNrOwogCWludCBpOwogCi0JaWYgKHNwID09IE5VTEwpIHsKLQkJaWYgKHJlZ3MpCi0JCQlzcCA9ICh1bnNpZ25lZCBsb25nICopcmVncy0+c3A7Ci0JCWVsc2UgaWYgKHRhc2spCi0JCQlzcCA9ICh1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnNwOwotCQllbHNlCi0JCQlzcCA9ICh1bnNpZ25lZCBsb25nICopJnNwOwotCX0KKwlpZiAoIXRyeV9nZXRfdGFza19zdGFjayh0YXNrKSkKKwkJcmV0dXJuOworCisJc3AgPSBzcCA/IDogZ2V0X3N0YWNrX3BvaW50ZXIodGFzaywgcmVncyk7CiAKIAlzdGFjayA9IHNwOwogCWZvciAoaSA9IDA7IGkgPCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQ7IGkrKykgewpAQCAtMTE3LDcgKzE0NSw5IEBACiAJCXRvdWNoX25taV93YXRjaGRvZygpOwogCX0KIAlwcl9jb250KCJcbiIpOwotCXNob3dfdHJhY2VfbG9nX2x2bCh0YXNrLCByZWdzLCBzcCwgYnAsIGxvZ19sdmwpOworCXNob3dfdHJhY2VfbG9nX2x2bCh0YXNrLCByZWdzLCBzcCwgbG9nX2x2bCk7CisKKwlwdXRfdGFza19zdGFjayh0YXNrKTsKIH0KIAogCkBAIC0xMzksNyArMTY5LDcgQEAKIAkJdTggKmlwOwogCiAJCXByX2VtZXJnKCJTdGFjazpcbiIpOwotCQlzaG93X3N0YWNrX2xvZ19sdmwoTlVMTCwgcmVncywgJnJlZ3MtPnNwLCAwLCBLRVJOX0VNRVJHKTsKKwkJc2hvd19zdGFja19sb2dfbHZsKGN1cnJlbnQsIHJlZ3MsIE5VTEwsIEtFUk5fRU1FUkcpOwogCiAJCXByX2VtZXJnKCJDb2RlOiIpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzY0LmMKaW5kZXggOWVlNDUyMC4uMzZjZjFhNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYwpAQCAtMTYsMjYxICsxNiwxNDUgQEAKIAogI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CiAKLQotI2RlZmluZSBOX0VYQ0VQVElPTl9TVEFDS1NfRU5EIFwKLQkJKE5fRVhDRVBUSU9OX1NUQUNLUyArIERFQlVHX1NUS1NaL0VYQ0VQVElPTl9TVEtTWiAtIDIpCi0KLXN0YXRpYyBjaGFyIHg4Nl9zdGFja19pZHNbXVs4XSA9IHsKLQkJWyBERUJVR19TVEFDSy0xCQkJXQk9ICIjREIiLAotCQlbIE5NSV9TVEFDSy0xCQkJXQk9ICJOTUkiLAotCQlbIERPVUJMRUZBVUxUX1NUQUNLLTEJCV0JPSAiI0RGIiwKLQkJWyBNQ0VfU1RBQ0stMQkJCV0JPSAiI01DIiwKLSNpZiBERUJVR19TVEtTWiA+IEVYQ0VQVElPTl9TVEtTWgotCQlbIE5fRVhDRVBUSU9OX1NUQUNLUyAuLi4KLQkJICBOX0VYQ0VQVElPTl9TVEFDS1NfRU5ECV0JPSAiI0RCWz9dIgotI2VuZGlmCitzdGF0aWMgY2hhciAqZXhjZXB0aW9uX3N0YWNrX25hbWVzW05fRVhDRVBUSU9OX1NUQUNLU10gPSB7CisJCVsgRE9VQkxFRkFVTFRfU1RBQ0stMQldCT0gIiNERiIsCisJCVsgTk1JX1NUQUNLLTEJCV0JPSAiTk1JIiwKKwkJWyBERUJVR19TVEFDSy0xCQldCT0gIiNEQiIsCisJCVsgTUNFX1NUQUNLLTEJCV0JPSAiI01DIiwKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nICppbl9leGNlcHRpb25fc3RhY2sodW5zaWduZWQgY3B1LCB1bnNpZ25lZCBsb25nIHN0YWNrLAotCQkJCQkgdW5zaWduZWQgKnVzZWRwLCBjaGFyICoqaWRwKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgZXhjZXB0aW9uX3N0YWNrX3NpemVzW05fRVhDRVBUSU9OX1NUQUNLU10gPSB7CisJWzAgLi4uIE5fRVhDRVBUSU9OX1NUQUNLUyAtIDFdCQk9IEVYQ0VQVElPTl9TVEtTWiwKKwlbREVCVUdfU1RBQ0sgLSAxXQkJCT0gREVCVUdfU1RLU1oKK307CisKK3ZvaWQgc3RhY2tfdHlwZV9zdHIoZW51bSBzdGFja190eXBlIHR5cGUsIGNvbnN0IGNoYXIgKipiZWdpbiwgY29uc3QgY2hhciAqKmVuZCkKIHsKKwlCVUlMRF9CVUdfT04oTl9FWENFUFRJT05fU1RBQ0tTICE9IDQpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTVEFDS19UWVBFX0lSUToKKwkJKmJlZ2luID0gIklSUSI7CisJCSplbmQgICA9ICJFT0kiOworCQlicmVhazsKKwljYXNlIFNUQUNLX1RZUEVfRVhDRVBUSU9OIC4uLiBTVEFDS19UWVBFX0VYQ0VQVElPTl9MQVNUOgorCQkqYmVnaW4gPSBleGNlcHRpb25fc3RhY2tfbmFtZXNbdHlwZSAtIFNUQUNLX1RZUEVfRVhDRVBUSU9OXTsKKwkJKmVuZCAgID0gIkVPRSI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSpiZWdpbiA9IE5VTEw7CisJCSplbmQgICA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgYm9vbCBpbl9leGNlcHRpb25fc3RhY2sodW5zaWduZWQgbG9uZyAqc3RhY2ssIHN0cnVjdCBzdGFja19pbmZvICppbmZvKQoreworCXVuc2lnbmVkIGxvbmcgKmJlZ2luLCAqZW5kOworCXN0cnVjdCBwdF9yZWdzICpyZWdzOwogCXVuc2lnbmVkIGs7CiAKLQkvKgotCSAqIEl0ZXJhdGUgb3ZlciBhbGwgZXhjZXB0aW9uIHN0YWNrcywgYW5kIGZpZ3VyZSBvdXQgd2hldGhlcgotCSAqICdzdGFjaycgaXMgaW4gb25lIG9mIHRoZW06Ci0JICovCisJQlVJTERfQlVHX09OKE5fRVhDRVBUSU9OX1NUQUNLUyAhPSA0KTsKKwogCWZvciAoayA9IDA7IGsgPCBOX0VYQ0VQVElPTl9TVEFDS1M7IGsrKykgewotCQl1bnNpZ25lZCBsb25nIGVuZCA9IHBlcl9jcHUob3JpZ19pc3QsIGNwdSkuaXN0W2tdOwotCQkvKgotCQkgKiBJcyAnc3RhY2snIGFib3ZlIHRoaXMgZXhjZXB0aW9uIGZyYW1lJ3MgZW5kPwotCQkgKiBJZiB5ZXMgdGhlbiBza2lwIHRvIHRoZSBuZXh0IGZyYW1lLgotCQkgKi8KLQkJaWYgKHN0YWNrID49IGVuZCkKKwkJZW5kICAgPSAodW5zaWduZWQgbG9uZyAqKXJhd19jcHVfcHRyKCZvcmlnX2lzdCktPmlzdFtrXTsKKwkJYmVnaW4gPSBlbmQgLSAoZXhjZXB0aW9uX3N0YWNrX3NpemVzW2tdIC8gc2l6ZW9mKGxvbmcpKTsKKwkJcmVncyAgPSAoc3RydWN0IHB0X3JlZ3MgKillbmQgLSAxOworCisJCWlmIChzdGFjayA8IGJlZ2luIHx8IHN0YWNrID49IGVuZCkKIAkJCWNvbnRpbnVlOwotCQkvKgotCQkgKiBJcyAnc3RhY2snIGFib3ZlIHRoaXMgZXhjZXB0aW9uIGZyYW1lJ3Mgc3RhcnQgYWRkcmVzcz8KLQkJICogSWYgeWVzIHRoZW4gd2UgZm91bmQgdGhlIHJpZ2h0IGZyYW1lLgotCQkgKi8KLQkJaWYgKHN0YWNrID49IGVuZCAtIEVYQ0VQVElPTl9TVEtTWikgewotCQkJLyoKLQkJCSAqIE1ha2Ugc3VyZSB3ZSBvbmx5IGl0ZXJhdGUgdGhyb3VnaCBhbiBleGNlcHRpb24KLQkJCSAqIHN0YWNrIG9uY2UuIElmIGl0IGNvbWVzIHVwIGZvciB0aGUgc2Vjb25kIHRpbWUKLQkJCSAqIHRoZW4gdGhlcmUncyBzb21ldGhpbmcgd3JvbmcgZ29pbmcgb24gLSBqdXN0Ci0JCQkgKiBicmVhayBvdXQgYW5kIHJldHVybiBOVUxMOgotCQkJICovCi0JCQlpZiAoKnVzZWRwICYgKDFVIDw8IGspKQotCQkJCWJyZWFrOwotCQkJKnVzZWRwIHw9IDFVIDw8IGs7Ci0JCQkqaWRwID0geDg2X3N0YWNrX2lkc1trXTsKLQkJCXJldHVybiAodW5zaWduZWQgbG9uZyAqKWVuZDsKLQkJfQotCQkvKgotCQkgKiBJZiB0aGlzIGlzIGEgZGVidWcgc3RhY2ssIGFuZCBpZiBpdCBoYXMgYSBsYXJnZXIgc2l6ZSB0aGFuCi0JCSAqIHRoZSB1c3VhbCBleGNlcHRpb24gc3RhY2tzLCB0aGVuICdzdGFjaycgbWlnaHQgc3RpbGwKLQkJICogYmUgd2l0aGluIHRoZSBsb3dlciBwb3J0aW9uIG9mIHRoZSBkZWJ1ZyBzdGFjazoKLQkJICovCi0jaWYgREVCVUdfU1RLU1ogPiBFWENFUFRJT05fU1RLU1oKLQkJaWYgKGsgPT0gREVCVUdfU1RBQ0sgLSAxICYmIHN0YWNrID49IGVuZCAtIERFQlVHX1NUS1NaKSB7Ci0JCQl1bnNpZ25lZCBqID0gTl9FWENFUFRJT05fU1RBQ0tTIC0gMTsKIAotCQkJLyoKLQkJCSAqIEJsYWNrIG1hZ2ljLiBBIGxhcmdlIGRlYnVnIHN0YWNrIGlzIGNvbXBvc2VkIG9mCi0JCQkgKiBtdWx0aXBsZSBleGNlcHRpb24gc3RhY2sgZW50cmllcywgd2hpY2ggd2UKLQkJCSAqIGl0ZXJhdGUgdGhyb3VnaCBub3cuIERvbnQgbG9vazoKLQkJCSAqLwotCQkJZG8gewotCQkJCSsrajsKLQkJCQllbmQgLT0gRVhDRVBUSU9OX1NUS1NaOwotCQkJCXg4Nl9zdGFja19pZHNbal1bNF0gPSAnMScgKwotCQkJCQkJKGogLSBOX0VYQ0VQVElPTl9TVEFDS1MpOwotCQkJfSB3aGlsZSAoc3RhY2sgPCBlbmQgLSBFWENFUFRJT05fU1RLU1opOwotCQkJaWYgKCp1c2VkcCAmICgxVSA8PCBqKSkKLQkJCQlicmVhazsKLQkJCSp1c2VkcCB8PSAxVSA8PCBqOwotCQkJKmlkcCA9IHg4Nl9zdGFja19pZHNbal07Ci0JCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgKillbmQ7Ci0JCX0KLSNlbmRpZgotCX0KLQlyZXR1cm4gTlVMTDsKLX0KKwkJaW5mby0+dHlwZQk9IFNUQUNLX1RZUEVfRVhDRVBUSU9OICsgazsKKwkJaW5mby0+YmVnaW4JPSBiZWdpbjsKKwkJaW5mby0+ZW5kCT0gZW5kOworCQlpbmZvLT5uZXh0X3NwCT0gKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5zcDsKIAotc3RhdGljIGlubGluZSBpbnQKLWluX2lycV9zdGFjayh1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyAqaXJxX3N0YWNrLAotCSAgICAgdW5zaWduZWQgbG9uZyAqaXJxX3N0YWNrX2VuZCkKLXsKLQlyZXR1cm4gKHN0YWNrID49IGlycV9zdGFjayAmJiBzdGFjayA8IGlycV9zdGFja19lbmQpOwotfQotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBpcnFfc3RhY2tfc2l6ZSA9Ci0JKElSUV9TVEFDS19TSVpFIC0gNjQpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwotCi1lbnVtIHN0YWNrX3R5cGUgewotCVNUQUNLX0lTX1VOS05PV04sCi0JU1RBQ0tfSVNfTk9STUFMLAotCVNUQUNLX0lTX0VYQ0VQVElPTiwKLQlTVEFDS19JU19JUlEsCi19OwotCi1zdGF0aWMgZW51bSBzdGFja190eXBlCi1hbmFseXplX3N0YWNrKGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3RhY2ssCi0JICAgICAgdW5zaWduZWQgbG9uZyAqKnN0YWNrX2VuZCwgdW5zaWduZWQgbG9uZyAqaXJxX3N0YWNrLAotCSAgICAgIHVuc2lnbmVkICp1c2VkLCBjaGFyICoqaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBhZGRyOwotCi0JYWRkciA9ICgodW5zaWduZWQgbG9uZylzdGFjayAmICh+KFRIUkVBRF9TSVpFIC0gMSkpKTsKLQlpZiAoKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHRhc2spID09IGFkZHIpCi0JCXJldHVybiBTVEFDS19JU19OT1JNQUw7Ci0KLQkqc3RhY2tfZW5kID0gaW5fZXhjZXB0aW9uX3N0YWNrKGNwdSwgKHVuc2lnbmVkIGxvbmcpc3RhY2ssCi0JCQkJCXVzZWQsIGlkKTsKLQlpZiAoKnN0YWNrX2VuZCkKLQkJcmV0dXJuIFNUQUNLX0lTX0VYQ0VQVElPTjsKLQotCWlmICghaXJxX3N0YWNrKQotCQlyZXR1cm4gU1RBQ0tfSVNfTk9STUFMOwotCi0JKnN0YWNrX2VuZCA9IGlycV9zdGFjazsKLQlpcnFfc3RhY2sgPSBpcnFfc3RhY2sgLSBpcnFfc3RhY2tfc2l6ZTsKLQotCWlmIChpbl9pcnFfc3RhY2soc3RhY2ssIGlycV9zdGFjaywgKnN0YWNrX2VuZCkpCi0JCXJldHVybiBTVEFDS19JU19JUlE7Ci0KLQlyZXR1cm4gU1RBQ0tfSVNfVU5LTk9XTjsKLX0KLQotLyoKLSAqIHg4Ni02NCBjYW4gaGF2ZSB1cCB0byB0aHJlZSBrZXJuZWwgc3RhY2tzOgotICogcHJvY2VzcyBzdGFjawotICogaW50ZXJydXB0IHN0YWNrCi0gKiBzZXZlcmUgZXhjZXB0aW9uIChkb3VibGUgZmF1bHQsIG5taSwgc3RhY2sgZmF1bHQsIGRlYnVnLCBtY2UpIGhhcmR3YXJlIHN0YWNrCi0gKi8KLQotdm9pZCBkdW1wX3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCXVuc2lnbmVkIGxvbmcgKnN0YWNrLCB1bnNpZ25lZCBsb25nIGJwLAotCQljb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgKm9wcywgdm9pZCAqZGF0YSkKLXsKLQljb25zdCB1bnNpZ25lZCBjcHUgPSBnZXRfY3B1KCk7Ci0JdW5zaWduZWQgbG9uZyAqaXJxX3N0YWNrID0gKHVuc2lnbmVkIGxvbmcgKilwZXJfY3B1KGlycV9zdGFja19wdHIsIGNwdSk7Ci0JdW5zaWduZWQgbG9uZyBkdW1teTsKLQl1bnNpZ25lZCB1c2VkID0gMDsKLQlpbnQgZ3JhcGggPSAwOwotCWludCBkb25lID0gMDsKLQotCWlmICghdGFzaykKLQkJdGFzayA9IGN1cnJlbnQ7Ci0KLQlpZiAoIXN0YWNrKSB7Ci0JCWlmIChyZWdzKQotCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKXJlZ3MtPnNwOwotCQllbHNlIGlmICh0YXNrICE9IGN1cnJlbnQpCi0JCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnNwOwotCQllbHNlCi0JCQlzdGFjayA9ICZkdW1teTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCi0JaWYgKCFicCkKLQkJYnAgPSBzdGFja19mcmFtZSh0YXNrLCByZWdzKTsKLQkvKgotCSAqIFByaW50IGZ1bmN0aW9uIGNhbGwgZW50cmllcyBpbiBhbGwgc3RhY2tzLCBzdGFydGluZyBhdCB0aGUKLQkgKiBjdXJyZW50IHN0YWNrIGFkZHJlc3MuIElmIHRoZSBzdGFja3MgY29uc2lzdCBvZiBuZXN0ZWQKLQkgKiBleGNlcHRpb25zCi0JICovCi0Jd2hpbGUgKCFkb25lKSB7Ci0JCXVuc2lnbmVkIGxvbmcgKnN0YWNrX2VuZDsKLQkJZW51bSBzdGFja190eXBlIHN0eXBlOwotCQljaGFyICppZDsKKwlyZXR1cm4gZmFsc2U7Cit9CiAKLQkJc3R5cGUgPSBhbmFseXplX3N0YWNrKGNwdSwgdGFzaywgc3RhY2ssICZzdGFja19lbmQsCi0JCQkJICAgICAgaXJxX3N0YWNrLCAmdXNlZCwgJmlkKTsKLQotCQkvKiBEZWZhdWx0IGZpbmlzaCB1bmxlc3Mgc3BlY2lmaWVkIHRvIGNvbnRpbnVlICovCi0JCWRvbmUgPSAxOwotCi0JCXN3aXRjaCAoc3R5cGUpIHsKLQotCQkvKiBCcmVhayBvdXQgZWFybHkgaWYgd2UgYXJlIG9uIHRoZSB0aHJlYWQgc3RhY2sgKi8KLQkJY2FzZSBTVEFDS19JU19OT1JNQUw6Ci0JCQlicmVhazsKLQotCQljYXNlIFNUQUNLX0lTX0VYQ0VQVElPTjoKLQotCQkJaWYgKG9wcy0+c3RhY2soZGF0YSwgaWQpIDwgMCkKLQkJCQlicmVhazsKLQotCQkJYnAgPSBvcHMtPndhbGtfc3RhY2sodGFzaywgc3RhY2ssIGJwLCBvcHMsCi0JCQkJCSAgICAgZGF0YSwgc3RhY2tfZW5kLCAmZ3JhcGgpOwotCQkJb3BzLT5zdGFjayhkYXRhLCAiPEVPRT4iKTsKLQkJCS8qCi0JCQkgKiBXZSBsaW5rIHRvIHRoZSBuZXh0IHN0YWNrIHZpYSB0aGUKLQkJCSAqIHNlY29uZC10by1sYXN0IHBvaW50ZXIgKGluZGV4IC0yIHRvIGVuZCkgaW4gdGhlCi0JCQkgKiBleGNlcHRpb24gc3RhY2s6Ci0JCQkgKi8KLQkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKikgc3RhY2tfZW5kWy0yXTsKLQkJCWRvbmUgPSAwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTVEFDS19JU19JUlE6Ci0KLQkJCWlmIChvcHMtPnN0YWNrKGRhdGEsICJJUlEiKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQlicCA9IG9wcy0+d2Fsa19zdGFjayh0YXNrLCBzdGFjaywgYnAsCi0JCQkJICAgICBvcHMsIGRhdGEsIHN0YWNrX2VuZCwgJmdyYXBoKTsKLQkJCS8qCi0JCQkgKiBXZSBsaW5rIHRvIHRoZSBuZXh0IHN0YWNrICh3aGljaCB3b3VsZCBiZQotCQkJICogdGhlIHByb2Nlc3Mgc3RhY2sgbm9ybWFsbHkpIHRoZSBsYXN0Ci0JCQkgKiBwb2ludGVyIChpbmRleCAtMSB0byBlbmQpIGluIHRoZSBJUlEgc3RhY2s6Ci0JCQkgKi8KLQkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKikgKHN0YWNrX2VuZFstMV0pOwotCQkJaXJxX3N0YWNrID0gTlVMTDsKLQkJCW9wcy0+c3RhY2soZGF0YSwgIkVPSSIpOwotCQkJZG9uZSA9IDA7Ci0JCQlicmVhazsKLQotCQljYXNlIFNUQUNLX0lTX1VOS05PV046Ci0JCQlvcHMtPnN0YWNrKGRhdGEsICJVTksiKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQorc3RhdGljIGJvb2wgaW5faXJxX3N0YWNrKHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBzdHJ1Y3Qgc3RhY2tfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nICplbmQgICA9ICh1bnNpZ25lZCBsb25nICopdGhpc19jcHVfcmVhZChpcnFfc3RhY2tfcHRyKTsKKwl1bnNpZ25lZCBsb25nICpiZWdpbiA9IGVuZCAtIChJUlFfU1RBQ0tfU0laRSAvIHNpemVvZihsb25nKSk7CiAKIAkvKgotCSAqIFRoaXMgaGFuZGxlcyB0aGUgcHJvY2VzcyBzdGFjazoKKwkgKiBUaGlzIGlzIGEgc29mdHdhcmUgc3RhY2ssIHNvICdlbmQnIGNhbiBiZSBhIHZhbGlkIHN0YWNrIHBvaW50ZXIuCisJICogSXQganVzdCBtZWFucyB0aGUgc3RhY2sgaXMgZW1wdHkuCiAJICovCi0JYnAgPSBvcHMtPndhbGtfc3RhY2sodGFzaywgc3RhY2ssIGJwLCBvcHMsIGRhdGEsIE5VTEwsICZncmFwaCk7Ci0JcHV0X2NwdSgpOwotfQotRVhQT1JUX1NZTUJPTChkdW1wX3RyYWNlKTsKKwlpZiAoc3RhY2sgPCBiZWdpbiB8fCBzdGFjayA+IGVuZCkKKwkJcmV0dXJuIGZhbHNlOwogCi12b2lkCi1zaG93X3N0YWNrX2xvZ19sdmwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJICAgdW5zaWduZWQgbG9uZyAqc3AsIHVuc2lnbmVkIGxvbmcgYnAsIGNoYXIgKmxvZ19sdmwpCisJaW5mby0+dHlwZQk9IFNUQUNLX1RZUEVfSVJROworCWluZm8tPmJlZ2luCT0gYmVnaW47CisJaW5mby0+ZW5kCT0gZW5kOworCisJLyoKKwkgKiBUaGUgbmV4dCBzdGFjayBwb2ludGVyIGlzIHRoZSBmaXJzdCB0aGluZyBwdXNoZWQgYnkgdGhlIGVudHJ5IGNvZGUKKwkgKiBhZnRlciBzd2l0Y2hpbmcgdG8gdGhlIGlycSBzdGFjay4KKwkgKi8KKwlpbmZvLT5uZXh0X3NwID0gKHVuc2lnbmVkIGxvbmcgKikqKGVuZCAtIDEpOworCisJcmV0dXJuIHRydWU7Cit9CisKK2ludCBnZXRfc3RhY2tfaW5mbyh1bnNpZ25lZCBsb25nICpzdGFjaywgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkgICBzdHJ1Y3Qgc3RhY2tfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyAqdmlzaXRfbWFzaykKK3sKKwlpZiAoIXN0YWNrKQorCQlnb3RvIHVua25vd247CisKKwl0YXNrID0gdGFzayA/IDogY3VycmVudDsKKworCWlmIChpbl90YXNrX3N0YWNrKHN0YWNrLCB0YXNrLCBpbmZvKSkKKwkJZ290byByZWN1cnNpb25fY2hlY2s7CisKKwlpZiAodGFzayAhPSBjdXJyZW50KQorCQlnb3RvIHVua25vd247CisKKwlpZiAoaW5fZXhjZXB0aW9uX3N0YWNrKHN0YWNrLCBpbmZvKSkKKwkJZ290byByZWN1cnNpb25fY2hlY2s7CisKKwlpZiAoaW5faXJxX3N0YWNrKHN0YWNrLCBpbmZvKSkKKwkJZ290byByZWN1cnNpb25fY2hlY2s7CisKKwlnb3RvIHVua25vd247CisKK3JlY3Vyc2lvbl9jaGVjazoKKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSBkb24ndCBpdGVyYXRlIHRocm91Z2ggYW55IGdpdmVuIHN0YWNrIG1vcmUgdGhhbiBvbmNlLgorCSAqIElmIGl0IGNvbWVzIHVwIGEgc2Vjb25kIHRpbWUgdGhlbiB0aGVyZSdzIHNvbWV0aGluZyB3cm9uZyBnb2luZyBvbjoKKwkgKiBqdXN0IGJyZWFrIG91dCBhbmQgcmVwb3J0IGFuIHVua25vd24gc3RhY2sgdHlwZS4KKwkgKi8KKwlpZiAodmlzaXRfbWFzaykgeworCQlpZiAoKnZpc2l0X21hc2sgJiAoMVVMIDw8IGluZm8tPnR5cGUpKQorCQkJZ290byB1bmtub3duOworCQkqdmlzaXRfbWFzayB8PSAxVUwgPDwgaW5mby0+dHlwZTsKKwl9CisKKwlyZXR1cm4gMDsKKwordW5rbm93bjoKKwlpbmZvLT50eXBlID0gU1RBQ0tfVFlQRV9VTktOT1dOOworCXJldHVybiAtRUlOVkFMOworfQorCit2b2lkIHNob3dfc3RhY2tfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJdW5zaWduZWQgbG9uZyAqc3AsIGNoYXIgKmxvZ19sdmwpCiB7CiAJdW5zaWduZWQgbG9uZyAqaXJxX3N0YWNrX2VuZDsKIAl1bnNpZ25lZCBsb25nICppcnFfc3RhY2s7CiAJdW5zaWduZWQgbG9uZyAqc3RhY2s7Ci0JaW50IGNwdTsKIAlpbnQgaTsKIAotCXByZWVtcHRfZGlzYWJsZSgpOwotCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpZiAoIXRyeV9nZXRfdGFza19zdGFjayh0YXNrKSkKKwkJcmV0dXJuOwogCi0JaXJxX3N0YWNrX2VuZAk9ICh1bnNpZ25lZCBsb25nICopKHBlcl9jcHUoaXJxX3N0YWNrX3B0ciwgY3B1KSk7Ci0JaXJxX3N0YWNrCT0gKHVuc2lnbmVkIGxvbmcgKikocGVyX2NwdShpcnFfc3RhY2tfcHRyLCBjcHUpIC0gSVJRX1NUQUNLX1NJWkUpOworCWlycV9zdGFja19lbmQgPSAodW5zaWduZWQgbG9uZyAqKXRoaXNfY3B1X3JlYWQoaXJxX3N0YWNrX3B0cik7CisJaXJxX3N0YWNrICAgICA9IGlycV9zdGFja19lbmQgLSAoSVJRX1NUQUNLX1NJWkUgLyBzaXplb2YobG9uZykpOwogCi0JLyoKLQkgKiBEZWJ1Z2dpbmcgYWlkOiAic2hvd19zdGFjayhOVUxMLCBOVUxMKTsiIHByaW50cyB0aGUKLQkgKiBiYWNrIHRyYWNlIGZvciB0aGlzIGNwdToKLQkgKi8KLQlpZiAoc3AgPT0gTlVMTCkgewotCQlpZiAocmVncykKLQkJCXNwID0gKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5zcDsKLQkJZWxzZSBpZiAodGFzaykKLQkJCXNwID0gKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQuc3A7Ci0JCWVsc2UKLQkJCXNwID0gKHVuc2lnbmVkIGxvbmcgKikmc3A7Ci0JfQorCXNwID0gc3AgPyA6IGdldF9zdGFja19wb2ludGVyKHRhc2ssIHJlZ3MpOwogCiAJc3RhY2sgPSBzcDsKIAlmb3IgKGkgPSAwOyBpIDwga3N0YWNrX2RlcHRoX3RvX3ByaW50OyBpKyspIHsKQEAgLTI5OSwxOCArMTgzLDE3IEBACiAJCXN0YWNrKys7CiAJCXRvdWNoX25taV93YXRjaGRvZygpOwogCX0KLQlwcmVlbXB0X2VuYWJsZSgpOwogCiAJcHJfY29udCgiXG4iKTsKLQlzaG93X3RyYWNlX2xvZ19sdmwodGFzaywgcmVncywgc3AsIGJwLCBsb2dfbHZsKTsKKwlzaG93X3RyYWNlX2xvZ19sdmwodGFzaywgcmVncywgc3AsIGxvZ19sdmwpOworCisJcHV0X3Rhc2tfc3RhY2sodGFzayk7CiB9CiAKIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWludCBpOwotCXVuc2lnbmVkIGxvbmcgc3A7CiAKLQlzcCA9IHJlZ3MtPnNwOwogCXNob3dfcmVnc19wcmludF9pbmZvKEtFUk5fREVGQVVMVCk7CiAJX19zaG93X3JlZ3MocmVncywgMSk7CiAKQEAgLTMyNSw4ICsyMDgsNyBAQAogCQl1OCAqaXA7CiAKIAkJcHJpbnRrKEtFUk5fREVGQVVMVCAiU3RhY2s6XG4iKTsKLQkJc2hvd19zdGFja19sb2dfbHZsKE5VTEwsIHJlZ3MsICh1bnNpZ25lZCBsb25nICopc3AsCi0JCQkJICAgMCwgS0VSTl9ERUZBVUxUKTsKKwkJc2hvd19zdGFja19sb2dfbHZsKGN1cnJlbnQsIHJlZ3MsIE5VTEwsIEtFUk5fREVGQVVMVCk7CiAKIAkJcHJpbnRrKEtFUk5fREVGQVVMVCAiQ29kZTogIik7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9lODIwLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jCmluZGV4IDYyMWI1MDEuLmI4NWZlNWYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9lODIwLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2U4MjAuYwpAQCAtNDAsOCArNDAsMTAgQEAKICAqIHVzZXIgY2FuIGUuZy4gYm9vdCB0aGUgb3JpZ2luYWwga2VybmVsIHdpdGggbWVtPTFHIHdoaWxlIHN0aWxsIGJvb3RpbmcgdGhlCiAgKiBuZXh0IGtlcm5lbCB3aXRoIGZ1bGwgbWVtb3J5LgogICovCi1zdHJ1Y3QgZTgyMG1hcCBlODIwOwotc3RydWN0IGU4MjBtYXAgZTgyMF9zYXZlZDsKK3N0YXRpYyBzdHJ1Y3QgZTgyMG1hcCBpbml0aWFsX2U4MjAgIF9faW5pdGRhdGE7CitzdGF0aWMgc3RydWN0IGU4MjBtYXAgaW5pdGlhbF9lODIwX3NhdmVkICBfX2luaXRkYXRhOworc3RydWN0IGU4MjBtYXAgKmU4MjAgX19yZWZkYXRhID0gJmluaXRpYWxfZTgyMDsKK3N0cnVjdCBlODIwbWFwICplODIwX3NhdmVkIF9fcmVmZGF0YSA9ICZpbml0aWFsX2U4MjBfc2F2ZWQ7CiAKIC8qIEZvciBQQ0kgb3Igb3RoZXIgbWVtb3J5LW1hcHBlZCByZXNvdXJjZXMgKi8KIHVuc2lnbmVkIGxvbmcgcGNpX21lbV9zdGFydCA9IDB4YWVlZGJhYmU7CkBAIC01OCw4ICs2MCw4IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgewotCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLm1hcFtpXTsKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC0+bnJfbWFwOyBpKyspIHsKKwkJc3RydWN0IGU4MjBlbnRyeSAqZWkgPSAmZTgyMC0+bWFwW2ldOwogCiAJCWlmICh0eXBlICYmIGVpLT50eXBlICE9IHR5cGUpCiAJCQljb250aW51ZTsKQEAgLTgxLDggKzgzLDggQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAubWFwW2ldOworCWZvciAoaSA9IDA7IGkgPCBlODIwLT5ucl9tYXA7IGkrKykgeworCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLT5tYXBbaV07CiAKIAkJaWYgKHR5cGUgJiYgZWktPnR5cGUgIT0gdHlwZSkKIAkJCWNvbnRpbnVlOwpAQCAtMTI4LDcgKzEzMCw3IEBACiAKIHZvaWQgX19pbml0IGU4MjBfYWRkX3JlZ2lvbih1NjQgc3RhcnQsIHU2NCBzaXplLCBpbnQgdHlwZSkKIHsKLQlfX2U4MjBfYWRkX3JlZ2lvbigmZTgyMCwgc3RhcnQsIHNpemUsIHR5cGUpOworCV9fZTgyMF9hZGRfcmVnaW9uKGU4MjAsIHN0YXJ0LCBzaXplLCB0eXBlKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGU4MjBfcHJpbnRfdHlwZSh1MzIgdHlwZSkKQEAgLTE2NCwxMiArMTY2LDEyIEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBlODIwLT5ucl9tYXA7IGkrKykgewogCQlwcmludGsoS0VSTl9JTkZPICIlczogW21lbSAlIzAxOEx4LSUjMDE4THhdICIsIHdobywKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGU4MjAubWFwW2ldLmFkZHIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBlODIwLT5tYXBbaV0uYWRkciwKIAkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpCi0JCSAgICAgICAoZTgyMC5tYXBbaV0uYWRkciArIGU4MjAubWFwW2ldLnNpemUgLSAxKSk7Ci0JCWU4MjBfcHJpbnRfdHlwZShlODIwLm1hcFtpXS50eXBlKTsKKwkJICAgICAgIChlODIwLT5tYXBbaV0uYWRkciArIGU4MjAtPm1hcFtpXS5zaXplIC0gMSkpOworCQllODIwX3ByaW50X3R5cGUoZTgyMC0+bWFwW2ldLnR5cGUpOwogCQlwcmludGsoS0VSTl9DT05UICJcbiIpOwogCX0KIH0KQEAgLTM0OCw3ICszNTAsNyBAQAogCQkgKiBjb250aW51ZSBidWlsZGluZyB1cCBuZXcgYmlvcyBtYXAgYmFzZWQgb24gdGhpcwogCQkgKiBpbmZvcm1hdGlvbgogCQkgKi8KLQkJaWYgKGN1cnJlbnRfdHlwZSAhPSBsYXN0X3R5cGUgfHwgY3VycmVudF90eXBlID09IEU4MjBfUFJBTSkgeworCQlpZiAoY3VycmVudF90eXBlICE9IGxhc3RfdHlwZSkgewogCQkJaWYgKGxhc3RfdHlwZSAhPSAwKQkgewogCQkJCW5ld19iaW9zW25ld19iaW9zX2VudHJ5XS5zaXplID0KIAkJCQkJY2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHIgLSBsYXN0X2FkZHI7CkBAIC0zODgsMTEgKzM5MCwxMSBAQAogCXdoaWxlIChucl9tYXApIHsKIAkJdTY0IHN0YXJ0ID0gYmlvc21hcC0+YWRkcjsKIAkJdTY0IHNpemUgPSBiaW9zbWFwLT5zaXplOwotCQl1NjQgZW5kID0gc3RhcnQgKyBzaXplOworCQl1NjQgZW5kID0gc3RhcnQgKyBzaXplIC0gMTsKIAkJdTMyIHR5cGUgPSBiaW9zbWFwLT50eXBlOwogCiAJCS8qIE92ZXJmbG93IGluIDY0IGJpdHM/IElnbm9yZSB0aGUgbWVtb3J5IG1hcC4gKi8KLQkJaWYgKHN0YXJ0ID4gZW5kKQorCQlpZiAoc3RhcnQgPiBlbmQgJiYgbGlrZWx5KHNpemUpKQogCQkJcmV0dXJuIC0xOwogCiAJCWU4MjBfYWRkX3JlZ2lvbihzdGFydCwgc2l6ZSwgdHlwZSk7CkBAIC00OTMsMTMgKzQ5NSwxMyBAQAogdTY0IF9faW5pdCBlODIwX3VwZGF0ZV9yYW5nZSh1NjQgc3RhcnQsIHU2NCBzaXplLCB1bnNpZ25lZCBvbGRfdHlwZSwKIAkJCSAgICAgdW5zaWduZWQgbmV3X3R5cGUpCiB7Ci0JcmV0dXJuIF9fZTgyMF91cGRhdGVfcmFuZ2UoJmU4MjAsIHN0YXJ0LCBzaXplLCBvbGRfdHlwZSwgbmV3X3R5cGUpOworCXJldHVybiBfX2U4MjBfdXBkYXRlX3JhbmdlKGU4MjAsIHN0YXJ0LCBzaXplLCBvbGRfdHlwZSwgbmV3X3R5cGUpOwogfQogCiBzdGF0aWMgdTY0IF9faW5pdCBlODIwX3VwZGF0ZV9yYW5nZV9zYXZlZCh1NjQgc3RhcnQsIHU2NCBzaXplLAogCQkJCQkgIHVuc2lnbmVkIG9sZF90eXBlLCB1bnNpZ25lZCBuZXdfdHlwZSkKIHsKLQlyZXR1cm4gX19lODIwX3VwZGF0ZV9yYW5nZSgmZTgyMF9zYXZlZCwgc3RhcnQsIHNpemUsIG9sZF90eXBlLAorCXJldHVybiBfX2U4MjBfdXBkYXRlX3JhbmdlKGU4MjBfc2F2ZWQsIHN0YXJ0LCBzaXplLCBvbGRfdHlwZSwKIAkJCQkgICAgIG5ld190eXBlKTsKIH0KIApAQCAtNTIxLDggKzUyMyw4IEBACiAJCWU4MjBfcHJpbnRfdHlwZShvbGRfdHlwZSk7CiAJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKIAotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAubWFwW2ldOworCWZvciAoaSA9IDA7IGkgPCBlODIwLT5ucl9tYXA7IGkrKykgeworCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLT5tYXBbaV07CiAJCXU2NCBmaW5hbF9zdGFydCwgZmluYWxfZW5kOwogCQl1NjQgZWlfZW5kOwogCkBAIC01NjYsMTUgKzU2OCwxNSBAQAogCiB2b2lkIF9faW5pdCB1cGRhdGVfZTgyMCh2b2lkKQogewotCWlmIChzYW5pdGl6ZV9lODIwX21hcChlODIwLm1hcCwgQVJSQVlfU0laRShlODIwLm1hcCksICZlODIwLm5yX21hcCkpCisJaWYgKHNhbml0aXplX2U4MjBfbWFwKGU4MjAtPm1hcCwgQVJSQVlfU0laRShlODIwLT5tYXApLCAmZTgyMC0+bnJfbWFwKSkKIAkJcmV0dXJuOwogCXByaW50ayhLRVJOX0lORk8gImU4MjA6IG1vZGlmaWVkIHBoeXNpY2FsIFJBTSBtYXA6XG4iKTsKIAllODIwX3ByaW50X21hcCgibW9kaWZpZWQiKTsKIH0KIHN0YXRpYyB2b2lkIF9faW5pdCB1cGRhdGVfZTgyMF9zYXZlZCh2b2lkKQogewotCXNhbml0aXplX2U4MjBfbWFwKGU4MjBfc2F2ZWQubWFwLCBBUlJBWV9TSVpFKGU4MjBfc2F2ZWQubWFwKSwKLQkJCQkmZTgyMF9zYXZlZC5ucl9tYXApOworCXNhbml0aXplX2U4MjBfbWFwKGU4MjBfc2F2ZWQtPm1hcCwgQVJSQVlfU0laRShlODIwX3NhdmVkLT5tYXApLAorCQkJCSZlODIwX3NhdmVkLT5ucl9tYXApOwogfQogI2RlZmluZSBNQVhfR0FQX0VORCAweDEwMDAwMDAwMHVsbAogLyoKQEAgLTU4NCwxNCArNTg2LDE0IEBACiAJCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgdW5zaWduZWQgbG9uZyBsb25nIGVuZF9hZGRyKQogewogCXVuc2lnbmVkIGxvbmcgbG9uZyBsYXN0OwotCWludCBpID0gZTgyMC5ucl9tYXA7CisJaW50IGkgPSBlODIwLT5ucl9tYXA7CiAJaW50IGZvdW5kID0gMDsKIAogCWxhc3QgPSAoZW5kX2FkZHIgJiYgZW5kX2FkZHIgPCBNQVhfR0FQX0VORCkgPyBlbmRfYWRkciA6IE1BWF9HQVBfRU5EOwogCiAJd2hpbGUgKC0taSA+PSAwKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCA9IGU4MjAubWFwW2ldLmFkZHI7Ci0JCXVuc2lnbmVkIGxvbmcgbG9uZyBlbmQgPSBzdGFydCArIGU4MjAubWFwW2ldLnNpemU7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCA9IGU4MjAtPm1hcFtpXS5hZGRyOworCQl1bnNpZ25lZCBsb25nIGxvbmcgZW5kID0gc3RhcnQgKyBlODIwLT5tYXBbaV0uc2l6ZTsKIAogCQlpZiAoZW5kIDwgc3RhcnRfYWRkcikKIAkJCWNvbnRpbnVlOwpAQCAtNjQ5LDYgKzY1MSwzMyBAQAogCSAgICAgICBnYXBzdGFydCwgZ2Fwc3RhcnQgKyBnYXBzaXplIC0gMSk7CiB9CiAKKy8qCisgKiBDYWxsZWQgbGF0ZSBkdXJpbmcgaW5pdCwgaW4gZnJlZV9pbml0bWVtKCkuCisgKgorICogSW5pdGlhbCBlODIwIGFuZCBlODIwX3NhdmVkIGFyZSBsYXJnaXNoIF9faW5pdGRhdGEgYXJyYXlzLgorICogQ29weSB0aGVtIHRvICh1c3VhbGx5IG11Y2ggc21hbGxlcikgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFyZWEuCisgKiBUaGlzIGlzIGRvbmUgYWZ0ZXIgYWxsIHR3ZWFrcyB3ZSBldmVyIGRvIHRvIHRoZW06CisgKiBhbGwgZnVuY3Rpb25zIHdoaWNoIG1vZGlmeSB0aGVtIGFyZSBfX2luaXQgZnVuY3Rpb25zLAorICogdGhleSB3b24ndCBleGlzdCBhZnRlciB0aGlzIHBvaW50LgorICovCitfX2luaXQgdm9pZCBlODIwX3JlYWxsb2NhdGVfdGFibGVzKHZvaWQpCit7CisJc3RydWN0IGU4MjBtYXAgKm47CisJaW50IHNpemU7CisKKwlzaXplID0gb2Zmc2V0b2Yoc3RydWN0IGU4MjBtYXAsIG1hcCkgKyBzaXplb2Yoc3RydWN0IGU4MjBlbnRyeSkgKiBlODIwLT5ucl9tYXA7CisJbiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJQlVHX09OKCFuKTsKKwltZW1jcHkobiwgZTgyMCwgc2l6ZSk7CisJZTgyMCA9IG47CisKKwlzaXplID0gb2Zmc2V0b2Yoc3RydWN0IGU4MjBtYXAsIG1hcCkgKyBzaXplb2Yoc3RydWN0IGU4MjBlbnRyeSkgKiBlODIwX3NhdmVkLT5ucl9tYXA7CisJbiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJQlVHX09OKCFuKTsKKwltZW1jcHkobiwgZTgyMF9zYXZlZCwgc2l6ZSk7CisJZTgyMF9zYXZlZCA9IG47Cit9CisKIC8qKgogICogQmVjYXVzZSBvZiB0aGUgc2l6ZSBsaW1pdGF0aW9uIG9mIHN0cnVjdCBib290X3BhcmFtcywgb25seSBmaXJzdAogICogMTI4IEU4MjAgbWVtb3J5IGVudHJpZXMgYXJlIHBhc3NlZCB0byBrZXJuZWwgdmlhCkBAIC02NjUsNyArNjk0LDcgQEAKIAllbnRyaWVzID0gc2RhdGEtPmxlbiAvIHNpemVvZihzdHJ1Y3QgZTgyMGVudHJ5KTsKIAlleHRtYXAgPSAoc3RydWN0IGU4MjBlbnRyeSAqKShzZGF0YS0+ZGF0YSk7CiAJX19hcHBlbmRfZTgyMF9tYXAoZXh0bWFwLCBlbnRyaWVzKTsKLQlzYW5pdGl6ZV9lODIwX21hcChlODIwLm1hcCwgQVJSQVlfU0laRShlODIwLm1hcCksICZlODIwLm5yX21hcCk7CisJc2FuaXRpemVfZTgyMF9tYXAoZTgyMC0+bWFwLCBBUlJBWV9TSVpFKGU4MjAtPm1hcCksICZlODIwLT5ucl9tYXApOwogCWVhcmx5X21lbXVubWFwKHNkYXRhLCBkYXRhX2xlbik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiZTgyMDogZXh0ZW5kZWQgcGh5c2ljYWwgUkFNIG1hcDpcbiIpOwogCWU4MjBfcHJpbnRfbWFwKCJleHRlbmRlZCIpOwpAQCAtNjg2LDggKzcxNSw4IEBACiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBwZm4gPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKLQkJc3RydWN0IGU4MjBlbnRyeSAqZWkgPSAmZTgyMC5tYXBbaV07CisJZm9yIChpID0gMDsgaSA8IGU4MjAtPm5yX21hcDsgaSsrKSB7CisJCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAtPm1hcFtpXTsKIAogCQlpZiAocGZuIDwgUEZOX1VQKGVpLT5hZGRyKSkKIAkJCXJlZ2lzdGVyX25vc2F2ZV9yZWdpb24ocGZuLCBQRk5fVVAoZWktPmFkZHIpKTsKQEAgLTcxMiw4ICs3NDEsOCBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKLQkJc3RydWN0IGU4MjBlbnRyeSAqZWkgPSAmZTgyMC5tYXBbaV07CisJZm9yIChpID0gMDsgaSA8IGU4MjAtPm5yX21hcDsgaSsrKSB7CisJCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAtPm1hcFtpXTsKIAogCQlpZiAoZWktPnR5cGUgPT0gRTgyMF9OVlMpCiAJCQlhY3BpX252c19yZWdpc3RlcihlaS0+YWRkciwgZWktPnNpemUpOwpAQCAtNzU0LDIyICs3ODMsMTggQEAKIC8qCiAgKiBGaW5kIHRoZSBoaWdoZXN0IHBhZ2UgZnJhbWUgbnVtYmVyIHdlIGhhdmUgYXZhaWxhYmxlCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBlODIwX2VuZF9wZm4odW5zaWduZWQgbG9uZyBsaW1pdF9wZm4pCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgZTgyMF9lbmRfcGZuKHVuc2lnbmVkIGxvbmcgbGltaXRfcGZuLCB1bnNpZ25lZCB0eXBlKQogewogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9wZm4gPSAwOwogCXVuc2lnbmVkIGxvbmcgbWF4X2FyY2hfcGZuID0gTUFYX0FSQ0hfUEZOOwogCi0JZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKLQkJc3RydWN0IGU4MjBlbnRyeSAqZWkgPSAmZTgyMC5tYXBbaV07CisJZm9yIChpID0gMDsgaSA8IGU4MjAtPm5yX21hcDsgaSsrKSB7CisJCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAtPm1hcFtpXTsKIAkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm47CiAJCXVuc2lnbmVkIGxvbmcgZW5kX3BmbjsKIAotCQkvKgotCQkgKiBQZXJzaXN0ZW50IG1lbW9yeSBpcyBhY2NvdW50ZWQgYXMgcmFtIGZvciBwdXJwb3NlcyBvZgotCQkgKiBlc3RhYmxpc2hpbmcgbWF4X3BmbiBhbmQgbWVtX21hcC4KLQkJICovCi0JCWlmIChlaS0+dHlwZSAhPSBFODIwX1JBTSAmJiBlaS0+dHlwZSAhPSBFODIwX1BSQU0pCisJCWlmIChlaS0+dHlwZSAhPSB0eXBlKQogCQkJY29udGludWU7CiAKIAkJc3RhcnRfcGZuID0gZWktPmFkZHIgPj4gUEFHRV9TSElGVDsKQEAgLTc5NCwxNSArODE5LDE1IEBACiB9CiB1bnNpZ25lZCBsb25nIF9faW5pdCBlODIwX2VuZF9vZl9yYW1fcGZuKHZvaWQpCiB7Ci0JcmV0dXJuIGU4MjBfZW5kX3BmbihNQVhfQVJDSF9QRk4pOworCXJldHVybiBlODIwX2VuZF9wZm4oTUFYX0FSQ0hfUEZOLCBFODIwX1JBTSk7CiB9CiAKIHVuc2lnbmVkIGxvbmcgX19pbml0IGU4MjBfZW5kX29mX2xvd19yYW1fcGZuKHZvaWQpCiB7Ci0JcmV0dXJuIGU4MjBfZW5kX3BmbigxVUwgPDwgKDMyLVBBR0VfU0hJRlQpKTsKKwlyZXR1cm4gZTgyMF9lbmRfcGZuKDFVTCA8PCAoMzIgLSBQQUdFX1NISUZUKSwgRTgyMF9SQU0pOwogfQogCi1zdGF0aWMgdm9pZCBlYXJseV9wYW5pYyhjaGFyICptc2cpCitzdGF0aWMgdm9pZCBfX2luaXQgZWFybHlfcGFuaWMoY2hhciAqbXNnKQogewogCWVhcmx5X3ByaW50ayhtc2cpOwogCXBhbmljKG1zZyk7CkBAIC04NTYsNyArODgxLDcgQEAKIAkJICovCiAJCXNhdmVkX21heF9wZm4gPSBlODIwX2VuZF9vZl9yYW1fcGZuKCk7CiAjZW5kaWYKLQkJZTgyMC5ucl9tYXAgPSAwOworCQllODIwLT5ucl9tYXAgPSAwOwogCQl1c2VyZGVmID0gMTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtOTAzLDggKzkyOCw4IEBACiB2b2lkIF9faW5pdCBmaW5pc2hfZTgyMF9wYXJzaW5nKHZvaWQpCiB7CiAJaWYgKHVzZXJkZWYpIHsKLQkJaWYgKHNhbml0aXplX2U4MjBfbWFwKGU4MjAubWFwLCBBUlJBWV9TSVpFKGU4MjAubWFwKSwKLQkJCQkJJmU4MjAubnJfbWFwKSA8IDApCisJCWlmIChzYW5pdGl6ZV9lODIwX21hcChlODIwLT5tYXAsIEFSUkFZX1NJWkUoZTgyMC0+bWFwKSwKKwkJCQkJJmU4MjAtPm5yX21hcCkgPCAwKQogCQkJZWFybHlfcGFuaWMoIkludmFsaWQgdXNlciBzdXBwbGllZCBtZW1vcnkgbWFwIik7CiAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiZTgyMDogdXNlci1kZWZpbmVkIHBoeXNpY2FsIFJBTSBtYXA6XG4iKTsKQEAgLTkxMiw3ICs5MzcsNyBAQAogCX0KIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgKmU4MjBfdHlwZV90b19zdHJpbmcoaW50IGU4MjBfdHlwZSkKK3N0YXRpYyBjb25zdCBjaGFyICpfX2luaXQgZTgyMF90eXBlX3RvX3N0cmluZyhpbnQgZTgyMF90eXBlKQogewogCXN3aXRjaCAoZTgyMF90eXBlKSB7CiAJY2FzZSBFODIwX1JFU0VSVkVEX0tFUk46CkBAIC05MjYsNyArOTUxLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGU4MjBfdHlwZV90b19pb21lbV90eXBlKGludCBlODIwX3R5cGUpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgZTgyMF90eXBlX3RvX2lvbWVtX3R5cGUoaW50IGU4MjBfdHlwZSkKIHsKIAlzd2l0Y2ggKGU4MjBfdHlwZSkgewogCWNhc2UgRTgyMF9SRVNFUlZFRF9LRVJOOgpAQCAtOTQyLDcgKzk2Nyw3IEBACiAJfQogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBlODIwX3R5cGVfdG9faW9yZXNfZGVzYyhpbnQgZTgyMF90eXBlKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGU4MjBfdHlwZV90b19pb3Jlc19kZXNjKGludCBlODIwX3R5cGUpCiB7CiAJc3dpdGNoIChlODIwX3R5cGUpIHsKIAljYXNlIEU4MjBfQUNQSToKQEAgLTk2MSw3ICs5ODYsNyBAQAogCX0KIH0KIAotc3RhdGljIGJvb2wgZG9fbWFya19idXN5KHUzMiB0eXBlLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKK3N0YXRpYyBib29sIF9faW5pdCBkb19tYXJrX2J1c3kodTMyIHR5cGUsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQogewogCS8qIHRoaXMgaXMgdGhlIGxlZ2FjeSBiaW9zL2RvcyByb20tc2hhZG93ICsgbW1pbyByZWdpb24gKi8KIAlpZiAocmVzLT5zdGFydCA8ICgxVUxMPDwyMCkpCkBAIC05OTEsMzUgKzEwMTYsMzUgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAl1NjQgZW5kOwogCi0JcmVzID0gYWxsb2NfYm9vdG1lbShzaXplb2Yoc3RydWN0IHJlc291cmNlKSAqIGU4MjAubnJfbWFwKTsKKwlyZXMgPSBhbGxvY19ib290bWVtKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpICogZTgyMC0+bnJfbWFwKTsKIAllODIwX3JlcyA9IHJlczsKLQlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgewotCQllbmQgPSBlODIwLm1hcFtpXS5hZGRyICsgZTgyMC5tYXBbaV0uc2l6ZSAtIDE7CisJZm9yIChpID0gMDsgaSA8IGU4MjAtPm5yX21hcDsgaSsrKSB7CisJCWVuZCA9IGU4MjAtPm1hcFtpXS5hZGRyICsgZTgyMC0+bWFwW2ldLnNpemUgLSAxOwogCQlpZiAoZW5kICE9IChyZXNvdXJjZV9zaXplX3QpZW5kKSB7CiAJCQlyZXMrKzsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCXJlcy0+bmFtZSA9IGU4MjBfdHlwZV90b19zdHJpbmcoZTgyMC5tYXBbaV0udHlwZSk7Ci0JCXJlcy0+c3RhcnQgPSBlODIwLm1hcFtpXS5hZGRyOworCQlyZXMtPm5hbWUgPSBlODIwX3R5cGVfdG9fc3RyaW5nKGU4MjAtPm1hcFtpXS50eXBlKTsKKwkJcmVzLT5zdGFydCA9IGU4MjAtPm1hcFtpXS5hZGRyOwogCQlyZXMtPmVuZCA9IGVuZDsKIAotCQlyZXMtPmZsYWdzID0gZTgyMF90eXBlX3RvX2lvbWVtX3R5cGUoZTgyMC5tYXBbaV0udHlwZSk7Ci0JCXJlcy0+ZGVzYyA9IGU4MjBfdHlwZV90b19pb3Jlc19kZXNjKGU4MjAubWFwW2ldLnR5cGUpOworCQlyZXMtPmZsYWdzID0gZTgyMF90eXBlX3RvX2lvbWVtX3R5cGUoZTgyMC0+bWFwW2ldLnR5cGUpOworCQlyZXMtPmRlc2MgPSBlODIwX3R5cGVfdG9faW9yZXNfZGVzYyhlODIwLT5tYXBbaV0udHlwZSk7CiAKIAkJLyoKIAkJICogZG9uJ3QgcmVnaXN0ZXIgdGhlIHJlZ2lvbiB0aGF0IGNvdWxkIGJlIGNvbmZsaWN0ZWQgd2l0aAogCQkgKiBwY2kgZGV2aWNlIEJBUiByZXNvdXJjZSBhbmQgaW5zZXJ0IHRoZW0gbGF0ZXIgaW4KIAkJICogcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXkoKQogCQkgKi8KLQkJaWYgKGRvX21hcmtfYnVzeShlODIwLm1hcFtpXS50eXBlLCByZXMpKSB7CisJCWlmIChkb19tYXJrX2J1c3koZTgyMC0+bWFwW2ldLnR5cGUsIHJlcykpIHsKIAkJCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9CVVNZOwogCQkJaW5zZXJ0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgcmVzKTsKIAkJfQogCQlyZXMrKzsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgZTgyMF9zYXZlZC5ucl9tYXA7IGkrKykgewotCQlzdHJ1Y3QgZTgyMGVudHJ5ICplbnRyeSA9ICZlODIwX3NhdmVkLm1hcFtpXTsKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMF9zYXZlZC0+bnJfbWFwOyBpKyspIHsKKwkJc3RydWN0IGU4MjBlbnRyeSAqZW50cnkgPSAmZTgyMF9zYXZlZC0+bWFwW2ldOwogCQlmaXJtd2FyZV9tYXBfYWRkX2Vhcmx5KGVudHJ5LT5hZGRyLAogCQkJZW50cnktPmFkZHIgKyBlbnRyeS0+c2l6ZSwKIAkJCWU4MjBfdHlwZV90b19zdHJpbmcoZW50cnktPnR5cGUpKTsKQEAgLTEwMjcsNyArMTA1Miw3IEBACiB9CiAKIC8qIEhvdyBtdWNoIHNob3VsZCB3ZSBwYWQgUkFNIGVuZGluZyBkZXBlbmRpbmcgb24gd2hlcmUgaXQgaXM/ICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyByYW1fYWxpZ25tZW50KHJlc291cmNlX3NpemVfdCBwb3MpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgcmFtX2FsaWdubWVudChyZXNvdXJjZV9zaXplX3QgcG9zKQogewogCXVuc2lnbmVkIGxvbmcgbWIgPSBwb3MgPj4gMjA7CiAKQEAgLTEwNTEsNyArMTA3Niw3IEBACiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAKIAlyZXMgPSBlODIwX3JlczsKLQlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBlODIwLT5ucl9tYXA7IGkrKykgewogCQlpZiAoIXJlcy0+cGFyZW50ICYmIHJlcy0+ZW5kKQogCQkJaW5zZXJ0X3Jlc291cmNlX2V4cGFuZF90b19maXQoJmlvbWVtX3Jlc291cmNlLCByZXMpOwogCQlyZXMrKzsKQEAgLTEwNjEsOCArMTA4Niw4IEBACiAJICogVHJ5IHRvIGJ1bXAgdXAgUkFNIHJlZ2lvbnMgdG8gcmVhc29uYWJsZSBib3VuZGFyaWVzIHRvCiAJICogYXZvaWQgc3RvbGVuIFJBTToKIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgewotCQlzdHJ1Y3QgZTgyMGVudHJ5ICplbnRyeSA9ICZlODIwLm1hcFtpXTsKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC0+bnJfbWFwOyBpKyspIHsKKwkJc3RydWN0IGU4MjBlbnRyeSAqZW50cnkgPSAmZTgyMC0+bWFwW2ldOwogCQl1NjQgc3RhcnQsIGVuZDsKIAogCQlpZiAoZW50cnktPnR5cGUgIT0gRTgyMF9SQU0pCkBAIC0xMTEwLDcgKzExMzUsNyBAQAogCQkJd2hvID0gIkJJT1MtZTgwMSI7CiAJCX0KIAotCQllODIwLm5yX21hcCA9IDA7CisJCWU4MjAtPm5yX21hcCA9IDA7CiAJCWU4MjBfYWRkX3JlZ2lvbigwLCBMT1dNRU1TSVpFKCksIEU4MjBfUkFNKTsKIAkJZTgyMF9hZGRfcmVnaW9uKEhJR0hfTUVNT1JZLCBtZW1fc2l6ZSA8PCAxMCwgRTgyMF9SQU0pOwogCX0KQEAgLTExMjQsNyArMTE0OSw3IEBACiAJY2hhciAqd2hvOwogCiAJd2hvID0geDg2X2luaXQucmVzb3VyY2VzLm1lbW9yeV9zZXR1cCgpOwotCW1lbWNweSgmZTgyMF9zYXZlZCwgJmU4MjAsIHNpemVvZihzdHJ1Y3QgZTgyMG1hcCkpOworCW1lbWNweShlODIwX3NhdmVkLCBlODIwLCBzaXplb2Yoc3RydWN0IGU4MjBtYXApKTsKIAlwcmludGsoS0VSTl9JTkZPICJlODIwOiBCSU9TLXByb3ZpZGVkIHBoeXNpY2FsIFJBTSBtYXA6XG4iKTsKIAllODIwX3ByaW50X21hcCh3aG8pOwogfQpAQCAtMTE0MSw4ICsxMTY2LDggQEAKIAkgKi8KIAltZW1ibG9ja19hbGxvd19yZXNpemUoKTsKIAotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAubWFwW2ldOworCWZvciAoaSA9IDA7IGkgPCBlODIwLT5ucl9tYXA7IGkrKykgeworCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLT5tYXBbaV07CiAKIAkJZW5kID0gZWktPmFkZHIgKyBlaS0+c2l6ZTsKIAkJaWYgKGVuZCAhPSAocmVzb3VyY2Vfc2l6ZV90KWVuZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9lYXJseS1xdWlya3MuYyBiL2FyY2gveDg2L2tlcm5lbC9lYXJseS1xdWlya3MuYwppbmRleCBkZTc1MDFlLi4xOGJiM2E2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZWFybHktcXVpcmtzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2Vhcmx5LXF1aXJrcy5jCkBAIC01NTUsNyArNTU1LDcgQEAKIAogCS8qIE1hcmsgdGhpcyBzcGFjZSBhcyByZXNlcnZlZCAqLwogCWU4MjBfYWRkX3JlZ2lvbihiYXNlLCBzaXplLCBFODIwX1JFU0VSVkVEKTsKLQlzYW5pdGl6ZV9lODIwX21hcChlODIwLm1hcCwgQVJSQVlfU0laRShlODIwLm1hcCksICZlODIwLm5yX21hcCk7CisJc2FuaXRpemVfZTgyMF9tYXAoZTgyMC0+bWFwLCBBUlJBWV9TSVpFKGU4MjAtPm1hcCksICZlODIwLT5ucl9tYXApOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgaW50ZWxfZ3JhcGhpY3NfcXVpcmtzKGludCBudW0sIGludCBzbG90LCBpbnQgZnVuYykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9mcHUvaW5pdC5jIGIvYXJjaC94ODYva2VybmVsL2ZwdS9pbml0LmMKaW5kZXggOTM5ODJhZS4uMmYyYjhjNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2ZwdS9pbml0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2ZwdS9pbml0LmMKQEAgLTMxNyw3ICszMTcsNiBAQAogCW9uX2Jvb3RfY3B1ID0gMDsKIAogCVdBUk5fT05fRlBVKGN1cnJlbnQtPnRocmVhZC5mcHUuZnBzdGF0ZV9hY3RpdmUpOwotCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzID0gMDsKIAogCWlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfWFNBVkVPUFQpICYmIGVhZ2VyZnB1ICE9IERJU0FCTEUpCiAJCWVhZ2VyZnB1ID0gRU5BQkxFOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2Z0cmFjZS5jIGIvYXJjaC94ODYva2VybmVsL2Z0cmFjZS5jCmluZGV4IGQwMzZjZmIuLjg2MzliYjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZnRyYWNlLmMKQEAgLTEwMjksNyArMTAyOSw3IEBACiAJfQogCiAJaWYgKGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZShvbGQsIHNlbGZfYWRkciwgJnRyYWNlLmRlcHRoLAotCQkgICAgZnJhbWVfcG9pbnRlcikgPT0gLUVCVVNZKSB7CisJCQkJICAgICBmcmFtZV9wb2ludGVyLCBwYXJlbnQpID09IC1FQlVTWSkgewogCQkqcGFyZW50ID0gb2xkOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2hlYWRfMzIuUyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkXzMyLlMKaW5kZXggNmY4OTAyYi4uNWY0MDEyNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2hlYWRfMzIuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaGVhZF8zMi5TCkBAIC05NCw3ICs5NCw3IEBACiAgKi8KIF9fSEVBRAogRU5UUlkoc3RhcnR1cF8zMikKLQltb3ZsIHBhKHN0YWNrX3N0YXJ0KSwlZWN4CisJbW92bCBwYShpbml0aWFsX3N0YWNrKSwlZWN4CiAJCiAJLyogdGVzdCBLRUVQX1NFR01FTlRTIGZsYWcgdG8gc2VlIGlmIHRoZSBib290bG9hZGVyIGlzIGFza2luZwogCQl1cyB0byBub3QgcmVsb2FkIHNlZ21lbnRzICovCkBAIC0yODYsNyArMjg2LDcgQEAKICAqIHN0YXJ0X3NlY29uZGFyeSgpLgogICovCiBFTlRSWShzdGFydF9jcHUwKQotCW1vdmwgc3RhY2tfc3RhcnQsICVlY3gKKwltb3ZsIGluaXRpYWxfc3RhY2ssICVlY3gKIAltb3ZsICVlY3gsICVlc3AKIAlqbXAgICooaW5pdGlhbF9jb2RlKQogRU5EUFJPQyhzdGFydF9jcHUwKQpAQCAtMzA3LDcgKzMwNyw3IEBACiAJbW92bCAlZWF4LCVlcwogCW1vdmwgJWVheCwlZnMKIAltb3ZsICVlYXgsJWdzCi0JbW92bCBwYShzdGFja19zdGFydCksJWVjeAorCW1vdmwgcGEoaW5pdGlhbF9zdGFjayksJWVjeAogCW1vdmwgJWVheCwlc3MKIAlsZWFsIC1fX1BBR0VfT0ZGU0VUKCVlY3gpLCVlc3AKIApAQCAtNzAzLDcgKzcwMyw3IEBACiAKIC5kYXRhCiAuYmFsaWduIDQKLUVOVFJZKHN0YWNrX3N0YXJ0KQorRU5UUlkoaW5pdGlhbF9zdGFjaykKIAkubG9uZyBpbml0X3RocmVhZF91bmlvbitUSFJFQURfU0laRQogCiBfX0lOSVRST0RBVEEKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9oZWFkXzY0LlMgYi9hcmNoL3g4Ni9rZXJuZWwvaGVhZF82NC5TCmluZGV4IDlmOGVmYzkuLmM5OGE1NTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9oZWFkXzY0LlMKKysrIGIvYXJjaC94ODYva2VybmVsL2hlYWRfNjQuUwpAQCAtNjYsNyArNjYsNyBAQAogCSAqLwogCiAJLyoKLQkgKiBTZXR1cCBzdGFjayBmb3IgdmVyaWZ5X2NwdSgpLiAiLTgiIGJlY2F1c2Ugc3RhY2tfc3RhcnQgaXMgZGVmaW5lZAorCSAqIFNldHVwIHN0YWNrIGZvciB2ZXJpZnlfY3B1KCkuICItOCIgYmVjYXVzZSBpbml0aWFsX3N0YWNrIGlzIGRlZmluZWQKIAkgKiB0aGlzIHdheSwgc2VlIGJlbG93LiBPdXIgYmVzdCBndWVzcyBpcyBhIE5VTEwgcHRyIGZvciBzdGFjawogCSAqIHRlcm1pbmF0aW9uIGhldXJpc3RpY3MgYW5kIHdlIGRvbid0IHdhbnQgdG8gYnJlYWsgYW55dGhpbmcgd2hpY2gKIAkgKiBtaWdodCBkZXBlbmQgb24gaXQgKGtnZGIsIC4uLikuCkBAIC0yMjYsNyArMjI2LDcgQEAKIAltb3ZxCSVyYXgsICVjcjAKIAogCS8qIFNldHVwIGEgYm9vdCB0aW1lIHN0YWNrICovCi0JbW92cSBzdGFja19zdGFydCglcmlwKSwgJXJzcAorCW1vdnEgaW5pdGlhbF9zdGFjayglcmlwKSwgJXJzcAogCiAJLyogemVybyBFRkxBR1MgYWZ0ZXIgc2V0dGluZyByc3AgKi8KIAlwdXNocSAkMApAQCAtMzEwLDcgKzMxMCw3IEBACiAgKiBzdGFydF9zZWNvbmRhcnkoKS4KICAqLwogRU5UUlkoc3RhcnRfY3B1MCkKLQltb3ZxIHN0YWNrX3N0YXJ0KCVyaXApLCVyc3AKKwltb3ZxIGluaXRpYWxfc3RhY2soJXJpcCksJXJzcAogCW1vdnEJaW5pdGlhbF9jb2RlKCVyaXApLCVyYXgKIAlwdXNocQkkMAkJIyBmYWtlIHJldHVybiBhZGRyZXNzIHRvIHN0b3AgdW53aW5kZXIKIAlwdXNocQkkX19LRVJORUxfQ1MJIyBzZXQgY29ycmVjdCBjcwpAQCAtMzE5LDE3ICszMTksMTUgQEAKIEVORFBST0Moc3RhcnRfY3B1MCkKICNlbmRpZgogCi0JLyogU01QIGJvb3R1cCBjaGFuZ2VzIHRoZXNlIHR3byAqLworCS8qIEJvdGggU01QIGJvb3R1cCBhbmQgQUNQSSBzdXNwZW5kIGNoYW5nZSB0aGVzZSB2YXJpYWJsZXMgKi8KIAlfX1JFRkRBVEEKIAkuYmFsaWduCTgKIAlHTE9CQUwoaW5pdGlhbF9jb2RlKQogCS5xdWFkCXg4Nl82NF9zdGFydF9rZXJuZWwKIAlHTE9CQUwoaW5pdGlhbF9ncykKIAkucXVhZAlJTklUX1BFUl9DUFVfVkFSKGlycV9zdGFja191bmlvbikKLQotCUdMT0JBTChzdGFja19zdGFydCkKKwlHTE9CQUwoaW5pdGlhbF9zdGFjaykKIAkucXVhZCAgaW5pdF90aHJlYWRfdW5pb24rVEhSRUFEX1NJWkUtOAotCS53b3JkICAwCiAJX19GSU5JVERBVEEKIAogYmFkX2FkZHJlc3M6CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jIGIvYXJjaC94ODYva2VybmVsL2hwZXQuYwppbmRleCBjNmRmZDgwLi4yNzRmYWI5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMKQEAgLTc1NiwxMCArNzU2LDEwNCBAQAogLyoKICAqIENsb2NrIHNvdXJjZSByZWxhdGVkIGNvZGUKICAqLworI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChDT05GSUdfNjRCSVQpCisvKgorICogUmVhZGluZyB0aGUgSFBFVCBjb3VudGVyIGlzIGEgdmVyeSBzbG93IG9wZXJhdGlvbi4gSWYgYSBsYXJnZSBudW1iZXIgb2YKKyAqIENQVXMgYXJlIHRyeWluZyB0byBhY2Nlc3MgdGhlIEhQRVQgY291bnRlciBzaW11bHRhbmVvdXNseSwgaXQgY2FuIGNhdXNlCisgKiBtYXNzaXZlIGRlbGF5IGFuZCBzbG93IGRvd24gc3lzdGVtIHBlcmZvcm1hbmNlIGRyYW1hdGljYWxseS4gVGhpcyBtYXkKKyAqIGhhcHBlbiB3aGVuIEhQRVQgaXMgdGhlIGRlZmF1bHQgY2xvY2sgc291cmNlIGluc3RlYWQgb2YgVFNDLiBGb3IgYQorICogcmVhbGx5IGxhcmdlIHN5c3RlbSB3aXRoIGh1bmRyZWRzIG9mIENQVXMsIHRoZSBzbG93ZG93biBtYXkgYmUgc28KKyAqIHNldmVyZSB0aGF0IGl0IG1heSBhY3R1YWxseSBjcmFzaCB0aGUgc3lzdGVtIGJlY2F1c2Ugb2YgYSBOTUkgd2F0Y2hkb2cKKyAqIHNvZnQgbG9ja3VwLCBmb3IgZXhhbXBsZS4KKyAqCisgKiBJZiBtdWx0aXBsZSBDUFVzIGFyZSB0cnlpbmcgdG8gYWNjZXNzIHRoZSBIUEVUIGNvdW50ZXIgYXQgdGhlIHNhbWUgdGltZSwKKyAqIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gcmVhZCB0aGUgY291bnRlciBtdWx0aXBsZSB0aW1lcy4gSW5zdGVhZCwgdGhlCisgKiBvdGhlciBDUFVzIGNhbiB1c2UgdGhlIGNvdW50ZXIgdmFsdWUgcmVhZCBieSB0aGUgZmlyc3QgQ1BVIGluIHRoZSBncm91cC4KKyAqCisgKiBUaGlzIHNwZWNpYWwgZmVhdHVyZSBpcyBvbmx5IGVuYWJsZWQgb24geDg2LTY0IHN5c3RlbXMuIEl0IGlzIHVubGlrZWx5CisgKiB0aGF0IDMyLWJpdCB4ODYgc3lzdGVtcyB3aWxsIGhhdmUgZW5vdWdoIENQVXMgdG8gcmVxdWlyZSB0aGlzIGZlYXR1cmUKKyAqIHdpdGggaXRzIGFzc29jaWF0ZWQgbG9ja2luZyBvdmVyaGVhZC4gQW5kIHdlIGFsc28gbmVlZCA2NC1iaXQgYXRvbWljCisgKiByZWFkLgorICoKKyAqIFRoZSBsb2NrIGFuZCB0aGUgaHBldCB2YWx1ZSBhcmUgc3RvcmVkIHRvZ2V0aGVyIGFuZCBjYW4gYmUgcmVhZCBpbiBhCisgKiBzaW5nbGUgYXRvbWljIDY0LWJpdCByZWFkLiBJdCBpcyBleHBsaWNpdGx5IGFzc3VtZWQgdGhhdCBhcmNoX3NwaW5sb2NrX3QKKyAqIGlzIDMyIGJpdHMgaW4gc2l6ZS4KKyAqLwordW5pb24gaHBldF9sb2NrIHsKKwlzdHJ1Y3QgeworCQlhcmNoX3NwaW5sb2NrX3QgbG9jazsKKwkJdTMyIHZhbHVlOworCX07CisJdTY0IGxvY2t2YWw7Cit9OworCitzdGF0aWMgdW5pb24gaHBldF9sb2NrIGhwZXQgX19jYWNoZWxpbmVfYWxpZ25lZCA9IHsKKwl7IC5sb2NrID0gX19BUkNIX1NQSU5fTE9DS19VTkxPQ0tFRCwgfSwKK307CisKK3N0YXRpYyBjeWNsZV90IHJlYWRfaHBldChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5pb24gaHBldF9sb2NrIG9sZCwgbmV3OworCisJQlVJTERfQlVHX09OKHNpemVvZih1bmlvbiBocGV0X2xvY2spICE9IDgpOworCisJLyoKKwkgKiBSZWFkIEhQRVQgZGlyZWN0bHkgaWYgaW4gTk1JLgorCSAqLworCWlmIChpbl9ubWkoKSkKKwkJcmV0dXJuIChjeWNsZV90KWhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKKworCS8qCisJICogUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbG9jayBhbmQgSFBFVCB2YWx1ZSBhdG9taWNhbGx5LgorCSAqLworCW9sZC5sb2NrdmFsID0gUkVBRF9PTkNFKGhwZXQubG9ja3ZhbCk7CisKKwlpZiAoYXJjaF9zcGluX2lzX2xvY2tlZCgmb2xkLmxvY2spKQorCQlnb3RvIGNvbnRlbmRlZDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAoYXJjaF9zcGluX3RyeWxvY2soJmhwZXQubG9jaykpIHsKKwkJbmV3LnZhbHVlID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOworCQkvKgorCQkgKiBVc2UgV1JJVEVfT05DRSgpIHRvIHByZXZlbnQgc3RvcmUgdGVhcmluZy4KKwkJICovCisJCVdSSVRFX09OQ0UoaHBldC52YWx1ZSwgbmV3LnZhbHVlKTsKKwkJYXJjaF9zcGluX3VubG9jaygmaHBldC5sb2NrKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gKGN5Y2xlX3QpbmV3LnZhbHVlOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKK2NvbnRlbmRlZDoKKwkvKgorCSAqIENvbnRlbmRlZCBjYXNlCisJICogLS0tLS0tLS0tLS0tLS0KKwkgKiBXYWl0IHVudGlsIHRoZSBIUEVUIHZhbHVlIGNoYW5nZSBvciB0aGUgbG9jayBpcyBmcmVlIHRvIGluZGljYXRlCisJICogaXRzIHZhbHVlIGlzIHVwLXRvLWRhdGUuCisJICoKKwkgKiBJdCBpcyBwb3NzaWJsZSB0aGF0IG9sZC52YWx1ZSBoYXMgYWxyZWFkeSBjb250YWluZWQgdGhlIGxhdGVzdAorCSAqIEhQRVQgdmFsdWUgd2hpbGUgdGhlIGxvY2sgaG9sZGVyIHdhcyBpbiB0aGUgcHJvY2VzcyBvZiByZWxlYXNpbmcKKwkgKiB0aGUgbG9jay4gQ2hlY2tpbmcgZm9yIGxvY2sgc3RhdGUgY2hhbmdlIHdpbGwgZW5hYmxlIHVzIHRvIHJldHVybgorCSAqIHRoZSB2YWx1ZSBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBuZXh0IEhQRVQgcmVhZGVyCisJICogdG8gY29tZSBhbG9uZy4KKwkgKi8KKwlkbyB7CisJCWNwdV9yZWxheCgpOworCQluZXcubG9ja3ZhbCA9IFJFQURfT05DRShocGV0LmxvY2t2YWwpOworCX0gd2hpbGUgKChuZXcudmFsdWUgPT0gb2xkLnZhbHVlKSAmJiBhcmNoX3NwaW5faXNfbG9ja2VkKCZuZXcubG9jaykpOworCisJcmV0dXJuIChjeWNsZV90KW5ldy52YWx1ZTsKK30KKyNlbHNlCisvKgorICogRm9yIFVQIG9yIDMyLWJpdC4KKyAqLwogc3RhdGljIGN5Y2xlX3QgcmVhZF9ocGV0KHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCiB7CiAJcmV0dXJuIChjeWNsZV90KWhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKIH0KKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGNsb2Nrc291cmNlX2hwZXQgPSB7CiAJLm5hbWUJCT0gImhwZXQiLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2lycV82NC5jIGIvYXJjaC94ODYva2VybmVsL2lycV82NC5jCmluZGV4IDRhNzkwMzcuLjllYmQwYjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnFfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxXzY0LmMKQEAgLTQwLDggKzQwLDcgQEAKIAlpZiAodXNlcl9tb2RlKHJlZ3MpKQogCQlyZXR1cm47CiAKLQlpZiAocmVncy0+c3AgPj0gY3VyYmFzZSArIHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pICsKLQkJCQkgIHNpemVvZihzdHJ1Y3QgcHRfcmVncykgKyBTVEFDS19UT1BfTUFSR0lOICYmCisJaWYgKHJlZ3MtPnNwID49IGN1cmJhc2UgKyBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpICsgU1RBQ0tfVE9QX01BUkdJTiAmJgogCSAgICByZWdzLT5zcCA8PSBjdXJiYXNlICsgVEhSRUFEX1NJWkUpCiAJCXJldHVybjsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2tleGVjLWJ6aW1hZ2U2NC5jIGIvYXJjaC94ODYva2VybmVsL2tleGVjLWJ6aW1hZ2U2NC5jCmluZGV4IGYyMzU2YmQuLjM0MDdiMTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rZXhlYy1iemltYWdlNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva2V4ZWMtYnppbWFnZTY0LmMKQEAgLTk5LDE0ICs5OSwxNCBAQAogewogCXVuc2lnbmVkIGludCBucl9lODIwX2VudHJpZXM7CiAKLQlucl9lODIwX2VudHJpZXMgPSBlODIwX3NhdmVkLm5yX21hcDsKKwlucl9lODIwX2VudHJpZXMgPSBlODIwX3NhdmVkLT5ucl9tYXA7CiAKIAkvKiBUT0RPOiBQYXNzIGVudHJpZXMgbW9yZSB0aGFuIEU4MjBNQVggaW4gYm9vdHBhcmFtcyBzZXR1cCBkYXRhICovCiAJaWYgKG5yX2U4MjBfZW50cmllcyA+IEU4MjBNQVgpCiAJCW5yX2U4MjBfZW50cmllcyA9IEU4MjBNQVg7CiAKIAlwYXJhbXMtPmU4MjBfZW50cmllcyA9IG5yX2U4MjBfZW50cmllczsKLQltZW1jcHkoJnBhcmFtcy0+ZTgyMF9tYXAsICZlODIwX3NhdmVkLm1hcCwKKwltZW1jcHkoJnBhcmFtcy0+ZTgyMF9tYXAsICZlODIwX3NhdmVkLT5tYXAsCiAJICAgICAgIG5yX2U4MjBfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgZTgyMGVudHJ5KSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9rZ2RiLmMgYi9hcmNoL3g4Ni9rZXJuZWwva2dkYi5jCmluZGV4IDA0Y2RlNTIuLjhlMzZmMjQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rZ2RiLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2tnZGIuYwpAQCAtNTAsNiArNTAsNyBAQAogI2luY2x1ZGUgPGFzbS9hcGljZGVmLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vbm1pLmg+CisjaW5jbHVkZSA8YXNtL3N3aXRjaF90by5oPgogCiBzdHJ1Y3QgZGJnX3JlZ19kZWZfdCBkYmdfcmVnX2RlZltEQkdfTUFYX1JFR19OVU1dID0KIHsKQEAgLTE2NiwyMSArMTY3LDE5IEBACiAJZ2RiX3JlZ3NbR0RCX0RYXQk9IDA7CiAJZ2RiX3JlZ3NbR0RCX1NJXQk9IDA7CiAJZ2RiX3JlZ3NbR0RCX0RJXQk9IDA7Ci0JZ2RiX3JlZ3NbR0RCX0JQXQk9ICoodW5zaWduZWQgbG9uZyAqKXAtPnRocmVhZC5zcDsKKwlnZGJfcmVnc1tHREJfQlBdCT0gKChzdHJ1Y3QgaW5hY3RpdmVfdGFza19mcmFtZSAqKXAtPnRocmVhZC5zcCktPmJwOwogI2lmZGVmIENPTkZJR19YODZfMzIKIAlnZGJfcmVnc1tHREJfRFNdCT0gX19LRVJORUxfRFM7CiAJZ2RiX3JlZ3NbR0RCX0VTXQk9IF9fS0VSTkVMX0RTOwogCWdkYl9yZWdzW0dEQl9QU10JPSAwOwogCWdkYl9yZWdzW0dEQl9DU10JPSBfX0tFUk5FTF9DUzsKLQlnZGJfcmVnc1tHREJfUENdCT0gcC0+dGhyZWFkLmlwOwogCWdkYl9yZWdzW0dEQl9TU10JPSBfX0tFUk5FTF9EUzsKIAlnZGJfcmVnc1tHREJfRlNdCT0gMHhGRkZGOwogCWdkYl9yZWdzW0dEQl9HU10JPSAweEZGRkY7CiAjZWxzZQotCWdkYl9yZWdzMzJbR0RCX1BTXQk9ICoodW5zaWduZWQgbG9uZyAqKShwLT50aHJlYWQuc3AgKyA4KTsKKwlnZGJfcmVnczMyW0dEQl9QU10JPSAwOwogCWdkYl9yZWdzMzJbR0RCX0NTXQk9IF9fS0VSTkVMX0NTOwogCWdkYl9yZWdzMzJbR0RCX1NTXQk9IF9fS0VSTkVMX0RTOwotCWdkYl9yZWdzW0dEQl9QQ10JPSAwOwogCWdkYl9yZWdzW0dEQl9SOF0JPSAwOwogCWdkYl9yZWdzW0dEQl9SOV0JPSAwOwogCWdkYl9yZWdzW0dEQl9SMTBdCT0gMDsKQEAgLTE5MCw2ICsxODksNyBAQAogCWdkYl9yZWdzW0dEQl9SMTRdCT0gMDsKIAlnZGJfcmVnc1tHREJfUjE1XQk9IDA7CiAjZW5kaWYKKwlnZGJfcmVnc1tHREJfUENdCT0gMDsKIAlnZGJfcmVnc1tHREJfU1BdCT0gcC0+dGhyZWFkLnNwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy9jb3JlLmMgYi9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy9jb3JlLmMKaW5kZXggNzg0N2U1Yy4uMjhjZWUwMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2twcm9iZXMvY29yZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzL2NvcmUuYwpAQCAtNDUsNyArNDUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2twcm9iZXMvb3B0LmMgYi9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy9vcHQuYwppbmRleCA0NDI1ZjU5Li4zYmI0YzVmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy9vcHQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy9vcHQuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2tzeXNmcy5jIGIvYXJjaC94ODYva2VybmVsL2tzeXNmcy5jCmluZGV4IGMyYmVkYWUuLjRhZmM2N2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rc3lzZnMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva3N5c2ZzLmMKQEAgLTE4NCw3ICsxODQsNyBAQAogCiBzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIHR5cGVfYXR0ciA9IF9fQVRUUl9STyh0eXBlKTsKIAotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGRhdGFfYXR0ciA9IHsKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBkYXRhX2F0dHIgX19yb19hZnRlcl9pbml0ID0gewogCS5hdHRyID0gewogCQkubmFtZSA9ICJkYXRhIiwKIAkJLm1vZGUgPSBTX0lSVUdPLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2t2bS5jIGIvYXJjaC94ODYva2VybmVsL2t2bS5jCmluZGV4IDE3MjZjNGMuLmVkYmJmYzggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rdm0uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva3ZtLmMKQEAgLTQyMywxMiArNDIzLDcgQEAKIAlrdm1fc3BpbmxvY2tfaW5pdCgpOwogfQogCi1zdGF0aWMgdm9pZCBrdm1fZ3Vlc3RfY3B1X29ubGluZSh2b2lkICpkdW1teSkKLXsKLQlrdm1fZ3Vlc3RfY3B1X2luaXQoKTsKLX0KLQotc3RhdGljIHZvaWQga3ZtX2d1ZXN0X2NwdV9vZmZsaW5lKHZvaWQgKmR1bW15KQorc3RhdGljIHZvaWQga3ZtX2d1ZXN0X2NwdV9vZmZsaW5lKHZvaWQpCiB7CiAJa3ZtX2Rpc2FibGVfc3RlYWxfdGltZSgpOwogCWlmIChrdm1fcGFyYV9oYXNfZmVhdHVyZShLVk1fRkVBVFVSRV9QVl9FT0kpKQpAQCAtNDM3LDI5ICs0MzIsMjEgQEAKIAlhcGZfdGFza193YWtlX2FsbCgpOwogfQogCi1zdGF0aWMgaW50IGt2bV9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sCi0JCQkgIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IGt2bV9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7Ci0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfRE9XTl9GQUlMRUQ6Ci0JY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKLQkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwga3ZtX2d1ZXN0X2NwdV9vbmxpbmUsIE5VTEwsIDApOwotCQlicmVhazsKLQljYXNlIENQVV9ET1dOX1BSRVBBUkU6Ci0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFX0ZST1pFTjoKLQkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwga3ZtX2d1ZXN0X2NwdV9vZmZsaW5lLCBOVUxMLCAxKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBOT1RJRllfT0s7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlrdm1fZ3Vlc3RfY3B1X2luaXQoKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sga3ZtX2NwdV9ub3RpZmllciA9IHsKLSAgICAgICAgLm5vdGlmaWVyX2NhbGwgID0ga3ZtX2NwdV9ub3RpZnksCi19Oworc3RhdGljIGludCBrdm1fY3B1X2Rvd25fcHJlcGFyZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJa3ZtX2d1ZXN0X2NwdV9vZmZsaW5lKCk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCXJldHVybiAwOworfQogI2VuZGlmCiAKIHN0YXRpYyB2b2lkIF9faW5pdCBrdm1fYXBmX3RyYXBfaW5pdCh2b2lkKQpAQCAtNDk0LDcgKzQ4MSw5IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAJc21wX29wcy5zbXBfcHJlcGFyZV9ib290X2NwdSA9IGt2bV9zbXBfcHJlcGFyZV9ib290X2NwdTsKLQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmt2bV9jcHVfbm90aWZpZXIpOworCWlmIChjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0FQX09OTElORV9EWU4sICJ4ODYva3ZtOm9ubGluZSIsCisJCQkJICAgICAga3ZtX2NwdV9vbmxpbmUsIGt2bV9jcHVfZG93bl9wcmVwYXJlKSA8IDApCisJCXByX2Vycigia3ZtX2d1ZXN0OiBGYWlsZWQgdG8gaW5zdGFsbCBjcHUgaG90cGx1ZyBjYWxsYmFja3NcbiIpOwogI2Vsc2UKIAlrdm1fZ3Vlc3RfY3B1X2luaXQoKTsKICNlbmRpZgpAQCAtNTc1LDkgKzU2NCw2IEBACiAJa3ZtX2h5cGVyY2FsbDIoS1ZNX0hDX0tJQ0tfQ1BVLCBmbGFncywgYXBpY2lkKTsKIH0KIAotCi0jaWZkZWYgQ09ORklHX1FVRVVFRF9TUElOTE9DS1MKLQogI2luY2x1ZGUgPGFzbS9xc3BpbmxvY2suaD4KIAogc3RhdGljIHZvaWQga3ZtX3dhaXQodTggKnB0ciwgdTggdmFsKQpAQCAtNjA2LDI0MyArNTkyLDYgQEAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLSNlbHNlIC8qICFDT05GSUdfUVVFVUVEX1NQSU5MT0NLUyAqLwotCi1lbnVtIGt2bV9jb250ZW50aW9uX3N0YXQgewotCVRBS0VOX1NMT1csCi0JVEFLRU5fU0xPV19QSUNLVVAsCi0JUkVMRUFTRURfU0xPVywKLQlSRUxFQVNFRF9TTE9XX0tJQ0tFRCwKLQlOUl9DT05URU5USU9OX1NUQVRTCi19OwotCi0jaWZkZWYgQ09ORklHX0tWTV9ERUJVR19GUwotI2RlZmluZSBISVNUT19CVUNLRVRTCTMwCi0KLXN0YXRpYyBzdHJ1Y3Qga3ZtX3NwaW5sb2NrX3N0YXRzCi17Ci0JdTMyIGNvbnRlbnRpb25fc3RhdHNbTlJfQ09OVEVOVElPTl9TVEFUU107Ci0JdTMyIGhpc3RvX3NwaW5fYmxvY2tlZFtISVNUT19CVUNLRVRTKzFdOwotCXU2NCB0aW1lX2Jsb2NrZWQ7Ci19IHNwaW5sb2NrX3N0YXRzOwotCi1zdGF0aWMgdTggemVyb19zdGF0czsKLQotc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3plcm8odm9pZCkKLXsKLQl1OCByZXQ7Ci0JdTggb2xkOwotCi0Jb2xkID0gUkVBRF9PTkNFKHplcm9fc3RhdHMpOwotCWlmICh1bmxpa2VseShvbGQpKSB7Ci0JCXJldCA9IGNtcHhjaGcoJnplcm9fc3RhdHMsIG9sZCwgMCk7Ci0JCS8qIFRoaXMgZW5zdXJlcyBvbmx5IG9uZSBmZWxsb3cgcmVzZXRzIHRoZSBzdGF0ICovCi0JCWlmIChyZXQgPT0gb2xkKQotCQkJbWVtc2V0KCZzcGlubG9ja19zdGF0cywgMCwgc2l6ZW9mKHNwaW5sb2NrX3N0YXRzKSk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRkX3N0YXRzKGVudW0ga3ZtX2NvbnRlbnRpb25fc3RhdCB2YXIsIHUzMiB2YWwpCi17Ci0JY2hlY2tfemVybygpOwotCXNwaW5sb2NrX3N0YXRzLmNvbnRlbnRpb25fc3RhdHNbdmFyXSArPSB2YWw7Ci19Ci0KLQotc3RhdGljIGlubGluZSB1NjQgc3Bpbl90aW1lX3N0YXJ0KHZvaWQpCi17Ci0JcmV0dXJuIHNjaGVkX2Nsb2NrKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fc3Bpbl90aW1lX2FjY3VtKHU2NCBkZWx0YSwgdTMyICphcnJheSkKLXsKLQl1bnNpZ25lZCBpbmRleDsKLQotCWluZGV4ID0gaWxvZzIoZGVsdGEpOwotCWNoZWNrX3plcm8oKTsKLQotCWlmIChpbmRleCA8IEhJU1RPX0JVQ0tFVFMpCi0JCWFycmF5W2luZGV4XSsrOwotCWVsc2UKLQkJYXJyYXlbSElTVE9fQlVDS0VUU10rKzsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNwaW5fdGltZV9hY2N1bV9ibG9ja2VkKHU2NCBzdGFydCkKLXsKLQl1MzIgZGVsdGE7Ci0KLQlkZWx0YSA9IHNjaGVkX2Nsb2NrKCkgLSBzdGFydDsKLQlfX3NwaW5fdGltZV9hY2N1bShkZWx0YSwgc3BpbmxvY2tfc3RhdHMuaGlzdG9fc3Bpbl9ibG9ja2VkKTsKLQlzcGlubG9ja19zdGF0cy50aW1lX2Jsb2NrZWQgKz0gZGVsdGE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkX3NwaW5fZGVidWc7Ci1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZF9rdm1fZGVidWc7Ci0KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICprdm1faW5pdF9kZWJ1Z2ZzKHZvaWQpCi17Ci0JZF9rdm1fZGVidWcgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImt2bS1ndWVzdCIsIE5VTEwpOwotCWlmICghZF9rdm1fZGVidWcpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkNvdWxkIG5vdCBjcmVhdGUgJ2t2bScgZGVidWdmcyBkaXJlY3RvcnlcbiIpOwotCi0JcmV0dXJuIGRfa3ZtX2RlYnVnOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBrdm1fc3BpbmxvY2tfZGVidWdmcyh2b2lkKQotewotCXN0cnVjdCBkZW50cnkgKmRfa3ZtOwotCi0JZF9rdm0gPSBrdm1faW5pdF9kZWJ1Z2ZzKCk7Ci0JaWYgKGRfa3ZtID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZF9zcGluX2RlYnVnID0gZGVidWdmc19jcmVhdGVfZGlyKCJzcGlubG9ja3MiLCBkX2t2bSk7Ci0KLQlkZWJ1Z2ZzX2NyZWF0ZV91OCgiemVyb19zdGF0cyIsIDA2NDQsIGRfc3Bpbl9kZWJ1ZywgJnplcm9fc3RhdHMpOwotCi0JZGVidWdmc19jcmVhdGVfdTMyKCJ0YWtlbl9zbG93IiwgMDQ0NCwgZF9zcGluX2RlYnVnLAotCQkgICAmc3BpbmxvY2tfc3RhdHMuY29udGVudGlvbl9zdGF0c1tUQUtFTl9TTE9XXSk7Ci0JZGVidWdmc19jcmVhdGVfdTMyKCJ0YWtlbl9zbG93X3BpY2t1cCIsIDA0NDQsIGRfc3Bpbl9kZWJ1ZywKLQkJICAgJnNwaW5sb2NrX3N0YXRzLmNvbnRlbnRpb25fc3RhdHNbVEFLRU5fU0xPV19QSUNLVVBdKTsKLQotCWRlYnVnZnNfY3JlYXRlX3UzMigicmVsZWFzZWRfc2xvdyIsIDA0NDQsIGRfc3Bpbl9kZWJ1ZywKLQkJICAgJnNwaW5sb2NrX3N0YXRzLmNvbnRlbnRpb25fc3RhdHNbUkVMRUFTRURfU0xPV10pOwotCWRlYnVnZnNfY3JlYXRlX3UzMigicmVsZWFzZWRfc2xvd19raWNrZWQiLCAwNDQ0LCBkX3NwaW5fZGVidWcsCi0JCSAgICZzcGlubG9ja19zdGF0cy5jb250ZW50aW9uX3N0YXRzW1JFTEVBU0VEX1NMT1dfS0lDS0VEXSk7Ci0KLQlkZWJ1Z2ZzX2NyZWF0ZV91NjQoInRpbWVfYmxvY2tlZCIsIDA0NDQsIGRfc3Bpbl9kZWJ1ZywKLQkJCSAgICZzcGlubG9ja19zdGF0cy50aW1lX2Jsb2NrZWQpOwotCi0JZGVidWdmc19jcmVhdGVfdTMyX2FycmF5KCJoaXN0b19ibG9ja2VkIiwgMDQ0NCwgZF9zcGluX2RlYnVnLAotCQkgICAgIHNwaW5sb2NrX3N0YXRzLmhpc3RvX3NwaW5fYmxvY2tlZCwgSElTVE9fQlVDS0VUUyArIDEpOwotCi0JcmV0dXJuIDA7Ci19Ci1mc19pbml0Y2FsbChrdm1fc3BpbmxvY2tfZGVidWdmcyk7Ci0jZWxzZSAgLyogIUNPTkZJR19LVk1fREVCVUdfRlMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZGRfc3RhdHMoZW51bSBrdm1fY29udGVudGlvbl9zdGF0IHZhciwgdTMyIHZhbCkKLXsKLX0KLQotc3RhdGljIGlubGluZSB1NjQgc3Bpbl90aW1lX3N0YXJ0KHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzcGluX3RpbWVfYWNjdW1fYmxvY2tlZCh1NjQgc3RhcnQpCi17Ci19Ci0jZW5kaWYgIC8qIENPTkZJR19LVk1fREVCVUdfRlMgKi8KLQotc3RydWN0IGt2bV9sb2NrX3dhaXRpbmcgewotCXN0cnVjdCBhcmNoX3NwaW5sb2NrICpsb2NrOwotCV9fdGlja2V0X3Qgd2FudDsKLX07Ci0KLS8qIGNwdXMgJ3dhaXRpbmcnIG9uIGEgc3BpbmxvY2sgdG8gYmVjb21lIGF2YWlsYWJsZSAqLwotc3RhdGljIGNwdW1hc2tfdCB3YWl0aW5nX2NwdXM7Ci0KLS8qIFRyYWNrIHNwaW5sb2NrIG9uIHdoaWNoIGEgY3B1IGlzIHdhaXRpbmcgKi8KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qga3ZtX2xvY2tfd2FpdGluZywga2xvY2tfd2FpdGluZyk7Ci0KLV9fdmlzaWJsZSB2b2lkIGt2bV9sb2NrX3NwaW5uaW5nKHN0cnVjdCBhcmNoX3NwaW5sb2NrICpsb2NrLCBfX3RpY2tldF90IHdhbnQpCi17Ci0Jc3RydWN0IGt2bV9sb2NrX3dhaXRpbmcgKnc7Ci0JaW50IGNwdTsKLQl1NjQgc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlfX3RpY2tldF90IGhlYWQ7Ci0KLQlpZiAoaW5fbm1pKCkpCi0JCXJldHVybjsKLQotCXcgPSB0aGlzX2NwdV9wdHIoJmtsb2NrX3dhaXRpbmcpOwotCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlzdGFydCA9IHNwaW5fdGltZV9zdGFydCgpOwotCi0JLyoKLQkgKiBNYWtlIHN1cmUgYW4gaW50ZXJydXB0IGhhbmRsZXIgY2FuJ3QgdXBzZXQgdGhpbmdzIGluIGEKLQkgKiBwYXJ0aWFsbHkgc2V0dXAgc3RhdGUuCi0JICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JLyoKLQkgKiBUaGUgb3JkZXJpbmcgcHJvdG9jb2wgb24gdGhpcyBpcyB0aGF0IHRoZSAibG9jayIgcG9pbnRlcgotCSAqIG1heSBvbmx5IGJlIHNldCBub24tTlVMTCBpZiB0aGUgIndhbnQiIHRpY2tldCBpcyBjb3JyZWN0LgotCSAqIElmIHdlJ3JlIHVwZGF0aW5nICJ3YW50Iiwgd2UgbXVzdCBmaXJzdCBjbGVhciAibG9jayIuCi0JICovCi0Jdy0+bG9jayA9IE5VTEw7Ci0Jc21wX3dtYigpOwotCXctPndhbnQgPSB3YW50OwotCXNtcF93bWIoKTsKLQl3LT5sb2NrID0gbG9jazsKLQotCWFkZF9zdGF0cyhUQUtFTl9TTE9XLCAxKTsKLQotCS8qCi0JICogVGhpcyB1c2VzIHNldF9iaXQsIHdoaWNoIGlzIGF0b21pYyBidXQgd2Ugc2hvdWxkIG5vdCByZWx5IG9uIGl0cwotCSAqIHJlb3JkZXJpbmcgZ3VyYW50ZWVzLiBTbyBiYXJyaWVyIGlzIG5lZWRlZCBhZnRlciB0aGlzIGNhbGwuCi0JICovCi0JY3B1bWFza19zZXRfY3B1KGNwdSwgJndhaXRpbmdfY3B1cyk7Ci0KLQliYXJyaWVyKCk7Ci0KLQkvKgotCSAqIE1hcmsgZW50cnkgdG8gc2xvd3BhdGggYmVmb3JlIGRvaW5nIHRoZSBwaWNrdXAgdGVzdCB0byBtYWtlCi0JICogc3VyZSB3ZSBkb24ndCBkZWFkbG9jayB3aXRoIGFuIHVubG9ja2VyLgotCSAqLwotCV9fdGlja2V0X2VudGVyX3Nsb3dwYXRoKGxvY2spOwotCi0JLyogbWFrZSBzdXJlIGVudGVyX3Nsb3dwYXRoLCB3aGljaCBpcyBhdG9taWMgZG9lcyBub3QgY3Jvc3MgdGhlIHJlYWQgKi8KLQlzbXBfbWJfX2FmdGVyX2F0b21pYygpOwotCi0JLyoKLQkgKiBjaGVjayBhZ2FpbiBtYWtlIHN1cmUgaXQgZGlkbid0IGJlY29tZSBmcmVlIHdoaWxlCi0JICogd2Ugd2VyZW4ndCBsb29raW5nLgotCSAqLwotCWhlYWQgPSBSRUFEX09OQ0UobG9jay0+dGlja2V0cy5oZWFkKTsKLQlpZiAoX190aWNrZXRzX2VxdWFsKGhlYWQsIHdhbnQpKSB7Ci0JCWFkZF9zdGF0cyhUQUtFTl9TTE9XX1BJQ0tVUCwgMSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qCi0JICogaGFsdCB1bnRpbCBpdCdzIG91ciB0dXJuIGFuZCBraWNrZWQuIE5vdGUgdGhhdCB3ZSBkbyBzYWZlIGhhbHQKLQkgKiBmb3IgaXJxIGVuYWJsZWQgY2FzZSB0byBhdm9pZCBoYW5nIHdoZW4gbG9jayBpbmZvIGlzIG92ZXJ3cml0dGVuCi0JICogaW4gaXJxIHNwaW5sb2NrIHNsb3dwYXRoIGFuZCBubyBzcHVyaW91cyBpbnRlcnJ1cHQgb2NjdXIgdG8gc2F2ZSB1cy4KLQkgKi8KLQlpZiAoYXJjaF9pcnFzX2Rpc2FibGVkX2ZsYWdzKGZsYWdzKSkKLQkJaGFsdCgpOwotCWVsc2UKLQkJc2FmZV9oYWx0KCk7Ci0KLW91dDoKLQljcHVtYXNrX2NsZWFyX2NwdShjcHUsICZ3YWl0aW5nX2NwdXMpOwotCXctPmxvY2sgPSBOVUxMOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlzcGluX3RpbWVfYWNjdW1fYmxvY2tlZChzdGFydCk7Ci19Ci1QVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKGt2bV9sb2NrX3NwaW5uaW5nKTsKLQotLyogS2ljayB2Y3B1IHdhaXRpbmcgb24gQGxvY2stPmhlYWQgdG8gcmVhY2ggdmFsdWUgQHRpY2tldCAqLwotc3RhdGljIHZvaWQga3ZtX3VubG9ja19raWNrKHN0cnVjdCBhcmNoX3NwaW5sb2NrICpsb2NrLCBfX3RpY2tldF90IHRpY2tldCkKLXsKLQlpbnQgY3B1OwotCi0JYWRkX3N0YXRzKFJFTEVBU0VEX1NMT1csIDEpOwotCWZvcl9lYWNoX2NwdShjcHUsICZ3YWl0aW5nX2NwdXMpIHsKLQkJY29uc3Qgc3RydWN0IGt2bV9sb2NrX3dhaXRpbmcgKncgPSAmcGVyX2NwdShrbG9ja193YWl0aW5nLCBjcHUpOwotCQlpZiAoUkVBRF9PTkNFKHctPmxvY2spID09IGxvY2sgJiYKLQkJICAgIFJFQURfT05DRSh3LT53YW50KSA9PSB0aWNrZXQpIHsKLQkJCWFkZF9zdGF0cyhSRUxFQVNFRF9TTE9XX0tJQ0tFRCwgMSk7Ci0JCQlrdm1fa2lja19jcHUoY3B1KTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi0jZW5kaWYgLyogIUNPTkZJR19RVUVVRURfU1BJTkxPQ0tTICovCi0KIC8qCiAgKiBTZXR1cCBwdl9sb2NrX29wcyB0byBleHBsb2l0IEtWTV9GRUFUVVJFX1BWX1VOSEFMVCBpZiBwcmVzZW50LgogICovCkBAIC04NTQsMTYgKzYwMywxMSBAQAogCWlmICgha3ZtX3BhcmFfaGFzX2ZlYXR1cmUoS1ZNX0ZFQVRVUkVfUFZfVU5IQUxUKSkKIAkJcmV0dXJuOwogCi0jaWZkZWYgQ09ORklHX1FVRVVFRF9TUElOTE9DS1MKIAlfX3B2X2luaXRfbG9ja19oYXNoKCk7CiAJcHZfbG9ja19vcHMucXVldWVkX3NwaW5fbG9ja19zbG93cGF0aCA9IF9fcHZfcXVldWVkX3NwaW5fbG9ja19zbG93cGF0aDsKIAlwdl9sb2NrX29wcy5xdWV1ZWRfc3Bpbl91bmxvY2sgPSBQVl9DQUxMRUVfU0FWRShfX3B2X3F1ZXVlZF9zcGluX3VubG9jayk7CiAJcHZfbG9ja19vcHMud2FpdCA9IGt2bV93YWl0OwogCXB2X2xvY2tfb3BzLmtpY2sgPSBrdm1fa2lja19jcHU7Ci0jZWxzZSAvKiAhQ09ORklHX1FVRVVFRF9TUElOTE9DS1MgKi8KLQlwdl9sb2NrX29wcy5sb2NrX3NwaW5uaW5nID0gUFZfQ0FMTEVFX1NBVkUoa3ZtX2xvY2tfc3Bpbm5pbmcpOwotCXB2X2xvY2tfb3BzLnVubG9ja19raWNrID0ga3ZtX3VubG9ja19raWNrOwotI2VuZGlmCiB9CiAKIHN0YXRpYyBfX2luaXQgaW50IGt2bV9zcGlubG9ja19pbml0X2p1bXAodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9rdm1jbG9jay5jIGIvYXJjaC94ODYva2VybmVsL2t2bWNsb2NrLmMKaW5kZXggMWQzOWJmYi4uNjBiOTk0OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2t2bWNsb2NrLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2t2bWNsb2NrLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxhc20veDg2X2luaXQuaD4KICNpbmNsdWRlIDxhc20vcmVib290Lmg+CiAKLXN0YXRpYyBpbnQga3ZtY2xvY2sgPSAxOworc3RhdGljIGludCBrdm1jbG9jayBfX3JvX2FmdGVyX2luaXQgPSAxOwogc3RhdGljIGludCBtc3Jfa3ZtX3N5c3RlbV90aW1lID0gTVNSX0tWTV9TWVNURU1fVElNRTsKIHN0YXRpYyBpbnQgbXNyX2t2bV93YWxsX2Nsb2NrID0gTVNSX0tWTV9XQUxMX0NMT0NLOwogc3RhdGljIGN5Y2xlX3Qga3ZtX3NjaGVkX2Nsb2NrX29mZnNldDsKQEAgLTI4OSw2ICsyODksNyBAQAogCXB1dF9jcHUoKTsKIAogCXg4Nl9wbGF0Zm9ybS5jYWxpYnJhdGVfdHNjID0ga3ZtX2dldF90c2Nfa2h6OworCXg4Nl9wbGF0Zm9ybS5jYWxpYnJhdGVfY3B1ID0ga3ZtX2dldF90c2Nfa2h6OwogCXg4Nl9wbGF0Zm9ybS5nZXRfd2FsbGNsb2NrID0ga3ZtX2dldF93YWxsY2xvY2s7CiAJeDg2X3BsYXRmb3JtLnNldF93YWxsY2xvY2sgPSBrdm1fc2V0X3dhbGxjbG9jazsKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9tcHBhcnNlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbXBwYXJzZS5jCmluZGV4IDA2OGM0YTkuLjBmOGQyMDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9tcHBhcnNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21wcGFyc2UuYwpAQCAtNDk5LDYgKzQ5OSw5IEBACiB7CiAJc3RydWN0IG1wZl9pbnRlbCAqbXBmID0gbXBmX2ZvdW5kOwogCisJaWYgKCFzbXBfZm91bmRfY29uZmlnKQorCQlyZXR1cm47CisKIAlpZiAoIW1wZikKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQtc3BpbmxvY2tzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQtc3BpbmxvY2tzLmMKaW5kZXggMTkzOWEwMi4uMmM1NWEwMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LXNwaW5sb2Nrcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC1zcGlubG9ja3MuYwpAQCAtOCw3ICs4LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9wYXJhdmlydC5oPgogCi0jaWZkZWYgQ09ORklHX1FVRVVFRF9TUElOTE9DS1MKIF9fdmlzaWJsZSB2b2lkIF9fbmF0aXZlX3F1ZXVlZF9zcGluX3VubG9jayhzdHJ1Y3QgcXNwaW5sb2NrICpsb2NrKQogewogCW5hdGl2ZV9xdWV1ZWRfc3Bpbl91bmxvY2sobG9jayk7CkBAIC0yMSwxOSArMjAsMTMgQEAKIAlyZXR1cm4gcHZfbG9ja19vcHMucXVldWVkX3NwaW5fdW5sb2NrLmZ1bmMgPT0KIAkJX19yYXdfY2FsbGVlX3NhdmVfX19uYXRpdmVfcXVldWVkX3NwaW5fdW5sb2NrOwogfQotI2VuZGlmCiAKIHN0cnVjdCBwdl9sb2NrX29wcyBwdl9sb2NrX29wcyA9IHsKICNpZmRlZiBDT05GSUdfU01QCi0jaWZkZWYgQ09ORklHX1FVRVVFRF9TUElOTE9DS1MKIAkucXVldWVkX3NwaW5fbG9ja19zbG93cGF0aCA9IG5hdGl2ZV9xdWV1ZWRfc3Bpbl9sb2NrX3Nsb3dwYXRoLAogCS5xdWV1ZWRfc3Bpbl91bmxvY2sgPSBQVl9DQUxMRUVfU0FWRShfX25hdGl2ZV9xdWV1ZWRfc3Bpbl91bmxvY2spLAogCS53YWl0ID0gcGFyYXZpcnRfbm9wLAogCS5raWNrID0gcGFyYXZpcnRfbm9wLAotI2Vsc2UgLyogIUNPTkZJR19RVUVVRURfU1BJTkxPQ0tTICovCi0JLmxvY2tfc3Bpbm5pbmcgPSBfX1BWX0lTX0NBTExFRV9TQVZFKHBhcmF2aXJ0X25vcCksCi0JLnVubG9ja19raWNrID0gcGFyYXZpcnRfbm9wLAotI2VuZGlmIC8qICFDT05GSUdfUVVFVUVEX1NQSU5MT0NLUyAqLwogI2VuZGlmIC8qIFNNUCAqLwogfTsKIEVYUE9SVF9TWU1CT0wocHZfbG9ja19vcHMpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQuYwppbmRleCBhZDViYzk1Li5iYmYzZDU5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQuYwpAQCAtNTYsMTIgKzU2LDEyIEBACiAgICAgICIucG9wc2VjdGlvbiIpOwogCiAvKiBpZGVudGl0eSBmdW5jdGlvbiwgd2hpY2ggY2FuIGJlIGlubGluZWQgKi8KLXUzMiBfcGFyYXZpcnRfaWRlbnRfMzIodTMyIHgpCit1MzIgbm90cmFjZSBfcGFyYXZpcnRfaWRlbnRfMzIodTMyIHgpCiB7CiAJcmV0dXJuIHg7CiB9CiAKLXU2NCBfcGFyYXZpcnRfaWRlbnRfNjQodTY0IHgpCit1NjQgbm90cmFjZSBfcGFyYXZpcnRfaWRlbnRfNjQodTY0IHgpCiB7CiAJcmV0dXJuIHg7CiB9CkBAIC0zMzIsNyArMzMyLDYgQEAKIAkucmVhZF9jcjAgPSBuYXRpdmVfcmVhZF9jcjAsCiAJLndyaXRlX2NyMCA9IG5hdGl2ZV93cml0ZV9jcjAsCiAJLnJlYWRfY3I0ID0gbmF0aXZlX3JlYWRfY3I0LAotCS5yZWFkX2NyNF9zYWZlID0gbmF0aXZlX3JlYWRfY3I0X3NhZmUsCiAJLndyaXRlX2NyNCA9IG5hdGl2ZV93cml0ZV9jcjQsCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCS5yZWFkX2NyOCA9IG5hdGl2ZV9yZWFkX2NyOCwKQEAgLTM4OSw3ICszODgsNyBAQAogI2RlZmluZSBQVEVfSURFTlQJX19QVl9JU19DQUxMRUVfU0FWRShfcGFyYXZpcnRfaWRlbnRfNjQpCiAjZW5kaWYKIAotc3RydWN0IHB2X21tdV9vcHMgcHZfbW11X29wcyA9IHsKK3N0cnVjdCBwdl9tbXVfb3BzIHB2X21tdV9vcHMgX19yb19hZnRlcl9pbml0ID0gewogCiAJLnJlYWRfY3IyID0gbmF0aXZlX3JlYWRfY3IyLAogCS53cml0ZV9jcjIgPSBuYXRpdmVfd3JpdGVfY3IyLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0X3BhdGNoXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnRfcGF0Y2hfMzIuYwppbmRleCAxNThkYzA2Li45MjBjNmFlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnRfcGF0Y2hfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnRfcGF0Y2hfMzIuYwpAQCAtMTAsNyArMTAsNyBAQAogREVGX05BVElWRShwdl9tbXVfb3BzLCByZWFkX2NyMywgIm1vdiAlY3IzLCAlZWF4Iik7CiBERUZfTkFUSVZFKHB2X2NwdV9vcHMsIGNsdHMsICJjbHRzIik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19QQVJBVklSVF9TUElOTE9DS1MpICYmIGRlZmluZWQoQ09ORklHX1FVRVVFRF9TUElOTE9DS1MpCisjaWYgZGVmaW5lZChDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTKQogREVGX05BVElWRShwdl9sb2NrX29wcywgcXVldWVkX3NwaW5fdW5sb2NrLCAibW92YiAkMCwgKCVlYXgpIik7CiAjZW5kaWYKIApAQCAtNDksNyArNDksNyBAQAogCQlQQVRDSF9TSVRFKHB2X21tdV9vcHMsIHJlYWRfY3IzKTsKIAkJUEFUQ0hfU0lURShwdl9tbXVfb3BzLCB3cml0ZV9jcjMpOwogCQlQQVRDSF9TSVRFKHB2X2NwdV9vcHMsIGNsdHMpOwotI2lmIGRlZmluZWQoQ09ORklHX1BBUkFWSVJUX1NQSU5MT0NLUykgJiYgZGVmaW5lZChDT05GSUdfUVVFVUVEX1NQSU5MT0NLUykKKyNpZiBkZWZpbmVkKENPTkZJR19QQVJBVklSVF9TUElOTE9DS1MpCiAJCWNhc2UgUEFSQVZJUlRfUEFUQ0gocHZfbG9ja19vcHMucXVldWVkX3NwaW5fdW5sb2NrKToKIAkJCWlmIChwdl9pc19uYXRpdmVfc3Bpbl91bmxvY2soKSkgewogCQkJCXN0YXJ0ID0gc3RhcnRfcHZfbG9ja19vcHNfcXVldWVkX3NwaW5fdW5sb2NrOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0X3BhdGNoXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnRfcGF0Y2hfNjQuYwppbmRleCBlNzAwODdhLi5iYjM4NDBjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnRfcGF0Y2hfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnRfcGF0Y2hfNjQuYwpAQCAtMTksNyArMTksNyBAQAogREVGX05BVElWRSgsIG1vdjMyLCAibW92ICVlZGksICVlYXgiKTsKIERFRl9OQVRJVkUoLCBtb3Y2NCwgIm1vdiAlcmRpLCAlcmF4Iik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19QQVJBVklSVF9TUElOTE9DS1MpICYmIGRlZmluZWQoQ09ORklHX1FVRVVFRF9TUElOTE9DS1MpCisjaWYgZGVmaW5lZChDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTKQogREVGX05BVElWRShwdl9sb2NrX29wcywgcXVldWVkX3NwaW5fdW5sb2NrLCAibW92YiAkMCwgKCVyZGkpIik7CiAjZW5kaWYKIApAQCAtNjEsNyArNjEsNyBAQAogCQlQQVRDSF9TSVRFKHB2X2NwdV9vcHMsIGNsdHMpOwogCQlQQVRDSF9TSVRFKHB2X21tdV9vcHMsIGZsdXNoX3RsYl9zaW5nbGUpOwogCQlQQVRDSF9TSVRFKHB2X2NwdV9vcHMsIHdiaW52ZCk7Ci0jaWYgZGVmaW5lZChDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTKSAmJiBkZWZpbmVkKENPTkZJR19RVUVVRURfU1BJTkxPQ0tTKQorI2lmIGRlZmluZWQoQ09ORklHX1BBUkFWSVJUX1NQSU5MT0NLUykKIAkJY2FzZSBQQVJBVklSVF9QQVRDSChwdl9sb2NrX29wcy5xdWV1ZWRfc3Bpbl91bmxvY2spOgogCQkJaWYgKHB2X2lzX25hdGl2ZV9zcGluX3VubG9jaygpKSB7CiAJCQkJc3RhcnQgPSBzdGFydF9wdl9sb2NrX29wc19xdWV1ZWRfc3Bpbl91bmxvY2s7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYwppbmRleCA2MmMwYjBlLi40MDAyYjQ3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vbWNlLmg+CiAjaW5jbHVkZSA8YXNtL3ZtODYuaD4KKyNpbmNsdWRlIDxhc20vc3dpdGNoX3RvLmg+CiAKIC8qCiAgKiBwZXItQ1BVIFRTUyBzZWdtZW50cy4gVGhyZWFkcyBhcmUgY29tcGxldGVseSAnc29mdCcgb24gTGludXgsCkBAIC01MTMsNiArNTE0LDE3IEBACiB9CiAKIC8qCisgKiBSZXR1cm4gc2F2ZWQgUEMgb2YgYSBibG9ja2VkIHRocmVhZC4KKyAqIFdoYXQgaXMgdGhpcyBnb29kIGZvcj8gaXQgd2lsbCBiZSBhbHdheXMgdGhlIHNjaGVkdWxlciBvciByZXRfZnJvbV9mb3JrLgorICovCit1bnNpZ25lZCBsb25nIHRocmVhZF9zYXZlZF9wYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlzdHJ1Y3QgaW5hY3RpdmVfdGFza19mcmFtZSAqZnJhbWUgPQorCQkoc3RydWN0IGluYWN0aXZlX3Rhc2tfZnJhbWUgKikgUkVBRF9PTkNFKHRzay0+dGhyZWFkLnNwKTsKKwlyZXR1cm4gUkVBRF9PTkNFX05PQ0hFQ0soZnJhbWUtPnJldF9hZGRyKTsKK30KKworLyoKICAqIENhbGxlZCBmcm9tIGZzL3Byb2Mgd2l0aCBhIHJlZmVyZW5jZSBvbiBAcCB0byBmaW5kIHRoZSBmdW5jdGlvbgogICogd2hpY2ggY2FsbGVkIGludG8gc2NoZWR1bGUoKS4gVGhpcyBuZWVkcyB0byBiZSBkb25lIGNhcmVmdWxseQogICogYmVjYXVzZSB0aGUgdGFzayBtaWdodCB3YWtlIHVwIGFuZCB3ZSBtaWdodCBsb29rIGF0IGEgc3RhY2sKQEAgLTUyMCwxNSArNTMyLDE4IEBACiAgKi8KIHVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBib3R0b20sIHRvcCwgc3AsIGZwLCBpcDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBib3R0b20sIHRvcCwgc3AsIGZwLCBpcCwgcmV0ID0gMDsKIAlpbnQgY291bnQgPSAwOwogCiAJaWYgKCFwIHx8IHAgPT0gY3VycmVudCB8fCBwLT5zdGF0ZSA9PSBUQVNLX1JVTk5JTkcpCiAJCXJldHVybiAwOwogCisJaWYgKCF0cnlfZ2V0X3Rhc2tfc3RhY2socCkpCisJCXJldHVybiAwOworCiAJc3RhcnQgPSAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UocCk7CiAJaWYgKCFzdGFydCkKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCiAJLyoKIAkgKiBMYXlvdXQgb2YgdGhlIHN0YWNrIHBhZ2U6CkBAIC01MzcsOSArNTUyLDcgQEAKIAkgKiBQQURESU5HCiAJICogLS0tLS0tLS0tLS0gdG9wID0gdG9wbWF4IC0gVE9QX09GX0tFUk5FTF9TVEFDS19QQURESU5HCiAJICogc3RhY2sKLQkgKiAtLS0tLS0tLS0tLSBib3R0b20gPSBzdGFydCArIHNpemVvZih0aHJlYWRfaW5mbykKLQkgKiB0aHJlYWRfaW5mbwotCSAqIC0tLS0tLS0tLS0tIHN0YXJ0CisJICogLS0tLS0tLS0tLS0gYm90dG9tID0gc3RhcnQKIAkgKgogCSAqIFRoZSB0YXNrcyBzdGFjayBwb2ludGVyIHBvaW50cyBhdCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlCiAJICogZnJhbWVwb2ludGVyIGlzIHN0b3JlZC4gVGhlIGRhdGEgb24gdGhlIHN0YWNrIGlzOgpAQCAtNTUwLDIwICs1NjMsMjUgQEAKIAkgKi8KIAl0b3AgPSBzdGFydCArIFRIUkVBRF9TSVpFIC0gVE9QX09GX0tFUk5FTF9TVEFDS19QQURESU5HOwogCXRvcCAtPSAyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwotCWJvdHRvbSA9IHN0YXJ0ICsgc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbyk7CisJYm90dG9tID0gc3RhcnQ7CiAKIAlzcCA9IFJFQURfT05DRShwLT50aHJlYWQuc3ApOwogCWlmIChzcCA8IGJvdHRvbSB8fCBzcCA+IHRvcCkKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCi0JZnAgPSBSRUFEX09OQ0VfTk9DSEVDSygqKHVuc2lnbmVkIGxvbmcgKilzcCk7CisJZnAgPSBSRUFEX09OQ0VfTk9DSEVDSygoKHN0cnVjdCBpbmFjdGl2ZV90YXNrX2ZyYW1lICopc3ApLT5icCk7CiAJZG8gewogCQlpZiAoZnAgPCBib3R0b20gfHwgZnAgPiB0b3ApCi0JCQlyZXR1cm4gMDsKKwkJCWdvdG8gb3V0OwogCQlpcCA9IFJFQURfT05DRV9OT0NIRUNLKCoodW5zaWduZWQgbG9uZyAqKShmcCArIHNpemVvZih1bnNpZ25lZCBsb25nKSkpOwotCQlpZiAoIWluX3NjaGVkX2Z1bmN0aW9ucyhpcCkpCi0JCQlyZXR1cm4gaXA7CisJCWlmICghaW5fc2NoZWRfZnVuY3Rpb25zKGlwKSkgeworCQkJcmV0ID0gaXA7CisJCQlnb3RvIG91dDsKKwkJfQogCQlmcCA9IFJFQURfT05DRV9OT0NIRUNLKCoodW5zaWduZWQgbG9uZyAqKWZwKTsKIAl9IHdoaWxlIChjb3VudCsrIDwgMTYgJiYgcC0+c3RhdGUgIT0gVEFTS19SVU5OSU5HKTsKLQlyZXR1cm4gMDsKKworb3V0OgorCXB1dF90YXNrX3N0YWNrKHApOworCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYwppbmRleCBkODZiZTI5Li5iZDdiZThlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKQEAgLTU1LDE3ICs1NSw2IEBACiAjaW5jbHVkZSA8YXNtL3N3aXRjaF90by5oPgogI2luY2x1ZGUgPGFzbS92bTg2Lmg+CiAKLWFzbWxpbmthZ2Ugdm9pZCByZXRfZnJvbV9mb3JrKHZvaWQpIF9fYXNtX18oInJldF9mcm9tX2ZvcmsiKTsKLWFzbWxpbmthZ2Ugdm9pZCByZXRfZnJvbV9rZXJuZWxfdGhyZWFkKHZvaWQpIF9fYXNtX18oInJldF9mcm9tX2tlcm5lbF90aHJlYWQiKTsKLQotLyoKLSAqIFJldHVybiBzYXZlZCBQQyBvZiBhIGJsb2NrZWQgdGhyZWFkLgotICovCi11bnNpZ25lZCBsb25nIHRocmVhZF9zYXZlZF9wYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLQlyZXR1cm4gKCh1bnNpZ25lZCBsb25nICopdHNrLT50aHJlYWQuc3ApWzNdOwotfQotCiB2b2lkIF9fc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgYWxsKQogewogCXVuc2lnbmVkIGxvbmcgY3IwID0gMEwsIGNyMiA9IDBMLCBjcjMgPSAwTCwgY3I0ID0gMEw7CkBAIC0xMDEsNyArOTAsNyBAQAogCWNyMCA9IHJlYWRfY3IwKCk7CiAJY3IyID0gcmVhZF9jcjIoKTsKIAljcjMgPSByZWFkX2NyMygpOwotCWNyNCA9IF9fcmVhZF9jcjRfc2FmZSgpOworCWNyNCA9IF9fcmVhZF9jcjQoKTsKIAlwcmludGsoS0VSTl9ERUZBVUxUICJDUjA6ICUwOGx4IENSMjogJTA4bHggQ1IzOiAlMDhseCBDUjQ6ICUwOGx4XG4iLAogCQkJY3IwLCBjcjIsIGNyMywgY3I0KTsKIApAQCAtMTMzLDM1ICsxMjIsMzEgQEAKIAl1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IHRhc2tfc3RydWN0ICpwLCB1bnNpZ25lZCBsb25nIHRscykKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqY2hpbGRyZWdzID0gdGFza19wdF9yZWdzKHApOworCXN0cnVjdCBmb3JrX2ZyYW1lICpmb3JrX2ZyYW1lID0gY29udGFpbmVyX29mKGNoaWxkcmVncywgc3RydWN0IGZvcmtfZnJhbWUsIHJlZ3MpOworCXN0cnVjdCBpbmFjdGl2ZV90YXNrX2ZyYW1lICpmcmFtZSA9ICZmb3JrX2ZyYW1lLT5mcmFtZTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKIAlpbnQgZXJyOwogCi0JcC0+dGhyZWFkLnNwID0gKHVuc2lnbmVkIGxvbmcpIGNoaWxkcmVnczsKKwlmcmFtZS0+YnAgPSAwOworCWZyYW1lLT5yZXRfYWRkciA9ICh1bnNpZ25lZCBsb25nKSByZXRfZnJvbV9mb3JrOworCXAtPnRocmVhZC5zcCA9ICh1bnNpZ25lZCBsb25nKSBmb3JrX2ZyYW1lOwogCXAtPnRocmVhZC5zcDAgPSAodW5zaWduZWQgbG9uZykgKGNoaWxkcmVncysxKTsKIAltZW1zZXQocC0+dGhyZWFkLnB0cmFjZV9icHMsIDAsIHNpemVvZihwLT50aHJlYWQucHRyYWNlX2JwcykpOwogCiAJaWYgKHVubGlrZWx5KHAtPmZsYWdzICYgUEZfS1RIUkVBRCkpIHsKIAkJLyoga2VybmVsIHRocmVhZCAqLwogCQltZW1zZXQoY2hpbGRyZWdzLCAwLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKLQkJcC0+dGhyZWFkLmlwID0gKHVuc2lnbmVkIGxvbmcpIHJldF9mcm9tX2tlcm5lbF90aHJlYWQ7Ci0JCXRhc2tfdXNlcl9ncyhwKSA9IF9fS0VSTkVMX1NUQUNLX0NBTkFSWTsKLQkJY2hpbGRyZWdzLT5kcyA9IF9fVVNFUl9EUzsKLQkJY2hpbGRyZWdzLT5lcyA9IF9fVVNFUl9EUzsKLQkJY2hpbGRyZWdzLT5mcyA9IF9fS0VSTkVMX1BFUkNQVTsKLQkJY2hpbGRyZWdzLT5ieCA9IHNwOwkvKiBmdW5jdGlvbiAqLwotCQljaGlsZHJlZ3MtPmJwID0gYXJnOwotCQljaGlsZHJlZ3MtPm9yaWdfYXggPSAtMTsKLQkJY2hpbGRyZWdzLT5jcyA9IF9fS0VSTkVMX0NTIHwgZ2V0X2tlcm5lbF9ycGwoKTsKLQkJY2hpbGRyZWdzLT5mbGFncyA9IFg4Nl9FRkxBR1NfSUYgfCBYODZfRUZMQUdTX0ZJWEVEOworCQlmcmFtZS0+YnggPSBzcDsJCS8qIGZ1bmN0aW9uICovCisJCWZyYW1lLT5kaSA9IGFyZzsKIAkJcC0+dGhyZWFkLmlvX2JpdG1hcF9wdHIgPSBOVUxMOwogCQlyZXR1cm4gMDsKIAl9CisJZnJhbWUtPmJ4ID0gMDsKIAkqY2hpbGRyZWdzID0gKmN1cnJlbnRfcHRfcmVncygpOwogCWNoaWxkcmVncy0+YXggPSAwOwogCWlmIChzcCkKIAkJY2hpbGRyZWdzLT5zcCA9IHNwOwogCi0JcC0+dGhyZWFkLmlwID0gKHVuc2lnbmVkIGxvbmcpIHJldF9mcm9tX2Zvcms7CiAJdGFza191c2VyX2dzKHApID0gZ2V0X3VzZXJfZ3MoY3VycmVudF9wdF9yZWdzKCkpOwogCiAJcC0+dGhyZWFkLmlvX2JpdG1hcF9wdHIgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKaW5kZXggNjMyMzZkOC4uZWU5NDRiZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCkBAIC00OSw4ICs0OSw3IEBACiAjaW5jbHVkZSA8YXNtL2RlYnVncmVnLmg+CiAjaW5jbHVkZSA8YXNtL3N3aXRjaF90by5oPgogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgotCi1hc21saW5rYWdlIGV4dGVybiB2b2lkIHJldF9mcm9tX2Zvcmsodm9pZCk7CisjaW5jbHVkZSA8YXNtL3Zkc28uaD4KIAogX192aXNpYmxlIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIHJzcF9zY3JhdGNoKTsKIApAQCAtMTQxLDEyICsxNDAsMTcgQEAKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBwdF9yZWdzICpjaGlsZHJlZ3M7CisJc3RydWN0IGZvcmtfZnJhbWUgKmZvcmtfZnJhbWU7CisJc3RydWN0IGluYWN0aXZlX3Rhc2tfZnJhbWUgKmZyYW1lOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqbWUgPSBjdXJyZW50OwogCiAJcC0+dGhyZWFkLnNwMCA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKSArIFRIUkVBRF9TSVpFOwogCWNoaWxkcmVncyA9IHRhc2tfcHRfcmVncyhwKTsKLQlwLT50aHJlYWQuc3AgPSAodW5zaWduZWQgbG9uZykgY2hpbGRyZWdzOwotCXNldF90c2tfdGhyZWFkX2ZsYWcocCwgVElGX0ZPUkspOworCWZvcmtfZnJhbWUgPSBjb250YWluZXJfb2YoY2hpbGRyZWdzLCBzdHJ1Y3QgZm9ya19mcmFtZSwgcmVncyk7CisJZnJhbWUgPSAmZm9ya19mcmFtZS0+ZnJhbWU7CisJZnJhbWUtPmJwID0gMDsKKwlmcmFtZS0+cmV0X2FkZHIgPSAodW5zaWduZWQgbG9uZykgcmV0X2Zyb21fZm9yazsKKwlwLT50aHJlYWQuc3AgPSAodW5zaWduZWQgbG9uZykgZm9ya19mcmFtZTsKIAlwLT50aHJlYWQuaW9fYml0bWFwX3B0ciA9IE5VTEw7CiAKIAlzYXZlc2VnbWVudChncywgcC0+dGhyZWFkLmdzaW5kZXgpOwpAQCAtMTYwLDE1ICsxNjQsMTEgQEAKIAlpZiAodW5saWtlbHkocC0+ZmxhZ3MgJiBQRl9LVEhSRUFEKSkgewogCQkvKiBrZXJuZWwgdGhyZWFkICovCiAJCW1lbXNldChjaGlsZHJlZ3MsIDAsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOwotCQljaGlsZHJlZ3MtPnNwID0gKHVuc2lnbmVkIGxvbmcpY2hpbGRyZWdzOwotCQljaGlsZHJlZ3MtPnNzID0gX19LRVJORUxfRFM7Ci0JCWNoaWxkcmVncy0+YnggPSBzcDsgLyogZnVuY3Rpb24gKi8KLQkJY2hpbGRyZWdzLT5icCA9IGFyZzsKLQkJY2hpbGRyZWdzLT5vcmlnX2F4ID0gLTE7Ci0JCWNoaWxkcmVncy0+Y3MgPSBfX0tFUk5FTF9DUyB8IGdldF9rZXJuZWxfcnBsKCk7Ci0JCWNoaWxkcmVncy0+ZmxhZ3MgPSBYODZfRUZMQUdTX0lGIHwgWDg2X0VGTEFHU19GSVhFRDsKKwkJZnJhbWUtPmJ4ID0gc3A7CQkvKiBmdW5jdGlvbiAqLworCQlmcmFtZS0+cjEyID0gYXJnOwogCQlyZXR1cm4gMDsKIAl9CisJZnJhbWUtPmJ4ID0gMDsKIAkqY2hpbGRyZWdzID0gKmN1cnJlbnRfcHRfcmVncygpOwogCiAJY2hpbGRyZWdzLT5heCA9IDA7CkBAIC01MTEsNyArNTExLDcgQEAKIAkJY3VycmVudC0+cGVyc29uYWxpdHkgJj0gflJFQURfSU1QTElFU19FWEVDOwogCQkvKiBpbl9jb21wYXRfc3lzY2FsbCgpIHVzZXMgdGhlIHByZXNlbmNlIG9mIHRoZSB4MzIKIAkJICAgc3lzY2FsbCBiaXQgZmxhZyB0byBkZXRlcm1pbmUgY29tcGF0IHN0YXR1cyAqLwotCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyAmPSB+VFNfQ09NUEFUOworCQljdXJyZW50LT50aHJlYWQuc3RhdHVzICY9IH5UU19DT01QQVQ7CiAJfSBlbHNlIHsKIAkJc2V0X3RocmVhZF9mbGFnKFRJRl9JQTMyKTsKIAkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1gzMik7CkBAIC01MTksMTEgKzUxOSwyNCBAQAogCQkJY3VycmVudC0+bW0tPmNvbnRleHQuaWEzMl9jb21wYXQgPSBUSUZfSUEzMjsKIAkJY3VycmVudC0+cGVyc29uYWxpdHkgfD0gZm9yY2VfcGVyc29uYWxpdHkzMjsKIAkJLyogUHJlcGFyZSB0aGUgZmlyc3QgInJldHVybiIgdG8gdXNlciBzcGFjZSAqLwotCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyB8PSBUU19DT01QQVQ7CisJCWN1cnJlbnQtPnRocmVhZC5zdGF0dXMgfD0gVFNfQ09NUEFUOwogCX0KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNldF9wZXJzb25hbGl0eV9pYTMyKTsKIAorI2lmZGVmIENPTkZJR19DSEVDS1BPSU5UX1JFU1RPUkUKK3N0YXRpYyBsb25nIHByY3RsX21hcF92ZHNvKGNvbnN0IHN0cnVjdCB2ZHNvX2ltYWdlICppbWFnZSwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCWludCByZXQ7CisKKwlyZXQgPSBtYXBfdmRzb19vbmNlKGltYWdlLCBhZGRyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIChsb25nKWltYWdlLT5zaXplOworfQorI2VuZGlmCisKIGxvbmcgZG9fYXJjaF9wcmN0bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBjb2RlLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJaW50IHJldCA9IDA7CkBAIC01NzcsNiArNTkwLDE5IEBACiAJCWJyZWFrOwogCX0KIAorI2lmZGVmIENPTkZJR19DSEVDS1BPSU5UX1JFU1RPUkUKKyMgaWZkZWYgQ09ORklHX1g4Nl9YMzJfQUJJCisJY2FzZSBBUkNIX01BUF9WRFNPX1gzMjoKKwkJcmV0dXJuIHByY3RsX21hcF92ZHNvKCZ2ZHNvX2ltYWdlX3gzMiwgYWRkcik7CisjIGVuZGlmCisjIGlmIGRlZmluZWQgQ09ORklHX1g4Nl8zMiB8fCBkZWZpbmVkIENPTkZJR19JQTMyX0VNVUxBVElPTgorCWNhc2UgQVJDSF9NQVBfVkRTT18zMjoKKwkJcmV0dXJuIHByY3RsX21hcF92ZHNvKCZ2ZHNvX2ltYWdlXzMyLCBhZGRyKTsKKyMgZW5kaWYKKwljYXNlIEFSQ0hfTUFQX1ZEU09fNjQ6CisJCXJldHVybiBwcmN0bF9tYXBfdmRzbygmdmRzb19pbWFnZV82NCwgYWRkcik7CisjZW5kaWYKKwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FSU5WQUw7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jCmluZGV4IGY3OTU3NmEuLjBlNjNjMDIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHRyYWNlLmMKQEAgLTE3Myw4ICsxNzMsOCBAQAogCQlyZXR1cm4gc3A7CiAKIAlwcmV2X2VzcCA9ICh1MzIgKikoY29udGV4dCk7Ci0JaWYgKHByZXZfZXNwKQotCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcHJldl9lc3A7CisJaWYgKCpwcmV2X2VzcCkKKwkJcmV0dXJuICh1bnNpZ25lZCBsb25nKSpwcmV2X2VzcDsKIAogCXJldHVybiAodW5zaWduZWQgbG9uZylyZWdzOwogfQpAQCAtOTM0LDcgKzkzNCw3IEBACiAJCSAqLwogCQlyZWdzLT5vcmlnX2F4ID0gdmFsdWU7CiAJCWlmIChzeXNjYWxsX2dldF9ucihjaGlsZCwgcmVncykgPj0gMCkKLQkJCXRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5zdGF0dXMgfD0gVFNfSTM4Nl9SRUdTX1BPS0VEOworCQkJY2hpbGQtPnRocmVhZC5zdGF0dXMgfD0gVFNfSTM4Nl9SRUdTX1BPS0VEOwogCQlicmVhazsKIAogCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IHVzZXIzMiwgcmVncy5lZmxhZ3MpOgpAQCAtMTI1MCw3ICsxMjUwLDcgQEAKIAogI2lmZGVmIENPTkZJR19YODZfNjQKIAotc3RhdGljIHN0cnVjdCB1c2VyX3JlZ3NldCB4ODZfNjRfcmVnc2V0c1tdIF9fcmVhZF9tb3N0bHkgPSB7CitzdGF0aWMgc3RydWN0IHVzZXJfcmVnc2V0IHg4Nl82NF9yZWdzZXRzW10gX19yb19hZnRlcl9pbml0ID0gewogCVtSRUdTRVRfR0VORVJBTF0gPSB7CiAJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1BSU1RBVFVTLAogCQkubiA9IHNpemVvZihzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCkgLyBzaXplb2YobG9uZyksCkBAIC0xMjkxLDcgKzEyOTEsNyBAQAogI2VuZGlmCS8qIENPTkZJR19YODZfNjQgKi8KIAogI2lmIGRlZmluZWQgQ09ORklHX1g4Nl8zMiB8fCBkZWZpbmVkIENPTkZJR19JQTMyX0VNVUxBVElPTgotc3RhdGljIHN0cnVjdCB1c2VyX3JlZ3NldCB4ODZfMzJfcmVnc2V0c1tdIF9fcmVhZF9tb3N0bHkgPSB7CitzdGF0aWMgc3RydWN0IHVzZXJfcmVnc2V0IHg4Nl8zMl9yZWdzZXRzW10gX19yb19hZnRlcl9pbml0ID0gewogCVtSRUdTRVRfR0VORVJBTF0gPSB7CiAJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1BSU1RBVFVTLAogCQkubiA9IHNpemVvZihzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdDMyKSAvIHNpemVvZih1MzIpLApAQCAtMTM0NCw3ICsxMzQ0LDcgQEAKICAqLwogdTY0IHhzdGF0ZV9meF9zd19ieXRlc1tVU0VSX1hTVEFURV9GWF9TV19XT1JEU107CiAKLXZvaWQgdXBkYXRlX3JlZ3NldF94c3RhdGVfaW5mbyh1bnNpZ25lZCBpbnQgc2l6ZSwgdTY0IHhzdGF0ZV9tYXNrKQordm9pZCBfX2luaXQgdXBkYXRlX3JlZ3NldF94c3RhdGVfaW5mbyh1bnNpZ25lZCBpbnQgc2l6ZSwgdTY0IHhzdGF0ZV9tYXNrKQogewogI2lmZGVmIENPTkZJR19YODZfNjQKIAl4ODZfNjRfcmVnc2V0c1tSRUdTRVRfWFNUQVRFXS5uID0gc2l6ZSAvIHNpemVvZih1NjQpOwpAQCAtMTM1OCw3ICsxMzU4LDcgQEAKIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldF92aWV3ICp0YXNrX3VzZXJfcmVnc2V0X3ZpZXcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogI2lmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgotCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfSUEzMikpCisJaWYgKCF1c2VyXzY0Yml0X21vZGUodGFza19wdF9yZWdzKHRhc2spKSkKICNlbmRpZgogI2lmIGRlZmluZWQgQ09ORklHX1g4Nl8zMiB8fCBkZWZpbmVkIENPTkZJR19JQTMyX0VNVUxBVElPTgogCQlyZXR1cm4gJnVzZXJfeDg2XzMyX3ZpZXc7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcXVpcmtzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcXVpcmtzLmMKaW5kZXggY2M0NTdmZi4uNTE0MDJhNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3F1aXJrcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9xdWlya3MuYwpAQCAtNjI2LDMgKzYyNiwzNCBAQAogCQkJYW1kX2Rpc2FibGVfc2VxX2FuZF9yZWRpcmVjdF9zY3J1Yik7CiAKICNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KSAmJiBkZWZpbmVkKENPTkZJR19YODZfTUNFKQorI2luY2x1ZGUgPGxpbnV4L2p1bXBfbGFiZWwuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nXzY0Lmg+CisKKy8qIEl2eSBCcmlkZ2UsIEhhc3dlbGwsIEJyb2Fkd2VsbCAqLworc3RhdGljIHZvaWQgcXVpcmtfaW50ZWxfYnJpY2tsYW5kX3hlb25fcmFzX2NhcChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1MzIgY2FwaWQwOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4ODQsICZjYXBpZDApOworCisJaWYgKGNhcGlkMCAmIDB4MTApCisJCXN0YXRpY19icmFuY2hfaW5jKCZtY3NhZmVfa2V5KTsKK30KKworLyogU2t5bGFrZSAqLworc3RhdGljIHZvaWQgcXVpcmtfaW50ZWxfcHVybGV5X3hlb25fcmFzX2NhcChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1MzIgY2FwaWQwOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4ODQsICZjYXBpZDApOworCisJaWYgKChjYXBpZDAgJiAweGMwKSA9PSAweGMwKQorCQlzdGF0aWNfYnJhbmNoX2luYygmbWNzYWZlX2tleSk7Cit9CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDBlYzMsIHF1aXJrX2ludGVsX2JyaWNrbGFuZF94ZW9uX3Jhc19jYXApOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyZmMwLCBxdWlya19pbnRlbF9icmlja2xhbmRfeGVvbl9yYXNfY2FwKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4NmZjMCwgcXVpcmtfaW50ZWxfYnJpY2tsYW5kX3hlb25fcmFzX2NhcCk7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwODMsIHF1aXJrX2ludGVsX3B1cmxleV94ZW9uX3Jhc19jYXApOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKaW5kZXggNjNiZjI3ZC4uZTI0NGMxOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYwpAQCAtNzA1LDcgKzcwNSw3IEBACiAJdGJvb3Rfc2h1dGRvd24oVEJfU0hVVERPV05fSEFMVCk7CiB9CiAKLXN0cnVjdCBtYWNoaW5lX29wcyBtYWNoaW5lX29wcyA9IHsKK3N0cnVjdCBtYWNoaW5lX29wcyBtYWNoaW5lX29wcyBfX3JvX2FmdGVyX2luaXQgPSB7CiAJLnBvd2VyX29mZiA9IG5hdGl2ZV9tYWNoaW5lX3Bvd2VyX29mZiwKIAkuc2h1dGRvd24gPSBuYXRpdmVfbWFjaGluZV9zaHV0ZG93biwKIAkuZW1lcmdlbmN5X3Jlc3RhcnQgPSBuYXRpdmVfbWFjaGluZV9lbWVyZ2VuY3lfcmVzdGFydCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9yZXNvdXJjZS5jIGIvYXJjaC94ODYva2VybmVsL3Jlc291cmNlLmMKaW5kZXggODBlYWIwMS4uMjQwOGMxNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Jlc291cmNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Jlc291cmNlLmMKQEAgLTI3LDggKzI3LDggQEAKIAlpbnQgaTsKIAlzdHJ1Y3QgZTgyMGVudHJ5ICplbnRyeTsKIAotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCWVudHJ5ID0gJmU4MjAubWFwW2ldOworCWZvciAoaSA9IDA7IGkgPCBlODIwLT5ucl9tYXA7IGkrKykgeworCQllbnRyeSA9ICZlODIwLT5tYXBbaV07CiAKIAkJcmVzb3VyY2VfY2xpcChhdmFpbCwgZW50cnktPmFkZHIsCiAJCQkgICAgICBlbnRyeS0+YWRkciArIGVudHJ5LT5zaXplIC0gMSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCmluZGV4IDBmYTYwZjUuLmJiZmJjYTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCkBAIC0yMTAsOSArMjEwLDkgQEAKIAogCiAjaWYgIWRlZmluZWQoQ09ORklHX1g4Nl9QQUUpIHx8IGRlZmluZWQoQ09ORklHX1g4Nl82NCkKLV9fdmlzaWJsZSB1bnNpZ25lZCBsb25nIG1tdV9jcjRfZmVhdHVyZXM7CitfX3Zpc2libGUgdW5zaWduZWQgbG9uZyBtbXVfY3I0X2ZlYXR1cmVzIF9fcm9fYWZ0ZXJfaW5pdDsKICNlbHNlCi1fX3Zpc2libGUgdW5zaWduZWQgbG9uZyBtbXVfY3I0X2ZlYXR1cmVzID0gWDg2X0NSNF9QQUU7CitfX3Zpc2libGUgdW5zaWduZWQgbG9uZyBtbXVfY3I0X2ZlYXR1cmVzIF9fcm9fYWZ0ZXJfaW5pdCA9IFg4Nl9DUjRfUEFFOwogI2VuZGlmCiAKIC8qIEJvb3QgbG9hZGVyIElEIGFuZCB2ZXJzaW9uIGFzIGludGVnZXJzLCBmb3IgdGhlIGJlbmVmaXQgb2YgcHJvY19kb2ludHZlYyAqLwpAQCAtNDU4LDggKzQ1OCw4IEBACiAJCWVhcmx5X21lbXVubWFwKGRhdGEsIHNpemVvZigqZGF0YSkpOwogCX0KIAotCXNhbml0aXplX2U4MjBfbWFwKGU4MjAubWFwLCBBUlJBWV9TSVpFKGU4MjAubWFwKSwgJmU4MjAubnJfbWFwKTsKLQltZW1jcHkoJmU4MjBfc2F2ZWQsICZlODIwLCBzaXplb2Yoc3RydWN0IGU4MjBtYXApKTsKKwlzYW5pdGl6ZV9lODIwX21hcChlODIwLT5tYXAsIEFSUkFZX1NJWkUoZTgyMC0+bWFwKSwgJmU4MjAtPm5yX21hcCk7CisJbWVtY3B5KGU4MjBfc2F2ZWQsIGU4MjAsIHNpemVvZihzdHJ1Y3QgZTgyMG1hcCkpOwogCXByaW50ayhLRVJOX0lORk8gImV4dGVuZGVkIHBoeXNpY2FsIFJBTSBtYXA6XG4iKTsKIAllODIwX3ByaW50X21hcCgicmVzZXJ2ZSBzZXR1cF9kYXRhIik7CiB9CkBAIC03NjMsNyArNzYzLDcgQEAKIAkgKi8KIAllODIwX3JlbW92ZV9yYW5nZShCSU9TX0JFR0lOLCBCSU9TX0VORCAtIEJJT1NfQkVHSU4sIEU4MjBfUkFNLCAxKTsKIAotCXNhbml0aXplX2U4MjBfbWFwKGU4MjAubWFwLCBBUlJBWV9TSVpFKGU4MjAubWFwKSwgJmU4MjAubnJfbWFwKTsKKwlzYW5pdGl6ZV9lODIwX21hcChlODIwLT5tYXAsIEFSUkFZX1NJWkUoZTgyMC0+bWFwKSwgJmU4MjAtPm5yX21hcCk7CiB9CiAKIC8qIGNhbGxlZCBiZWZvcmUgdHJpbV9iaW9zX3JhbmdlKCkgdG8gc3BhcmUgZXh0cmEgc2FuaXRpemUgKi8KQEAgLTEwMzIsNyArMTAzMiw3IEBACiAJaWYgKHBwcm9fd2l0aF9yYW1fYnVnKCkpIHsKIAkJZTgyMF91cGRhdGVfcmFuZ2UoMHg3MDAwMDAwMFVMTCwgMHg0MDAwMFVMTCwgRTgyMF9SQU0sCiAJCQkJICBFODIwX1JFU0VSVkVEKTsKLQkJc2FuaXRpemVfZTgyMF9tYXAoZTgyMC5tYXAsIEFSUkFZX1NJWkUoZTgyMC5tYXApLCAmZTgyMC5ucl9tYXApOworCQlzYW5pdGl6ZV9lODIwX21hcChlODIwLT5tYXAsIEFSUkFZX1NJWkUoZTgyMC0+bWFwKSwgJmU4MjAtPm5yX21hcCk7CiAJCXByaW50ayhLRVJOX0lORk8gImZpeGVkIHBoeXNpY2FsIFJBTSBtYXA6XG4iKTsKIAkJZTgyMF9wcmludF9tYXAoImJhZF9wcHJvIik7CiAJfQpAQCAtMTA5NiwxOSArMTA5NiwxOSBAQAogCW1lbWJsb2NrX3NldF9jdXJyZW50X2xpbWl0KElTQV9FTkRfQUREUkVTUyk7CiAJbWVtYmxvY2tfeDg2X2ZpbGwoKTsKIAotCWlmIChlZmlfZW5hYmxlZChFRklfQk9PVCkpIHsKLQkJZWZpX2Zha2VfbWVtbWFwKCk7Ci0JCWVmaV9maW5kX21pcnJvcigpOwotCX0KLQogCXJlc2VydmVfYmlvc19yZWdpb25zKCk7CiAKLQkvKgotCSAqIFRoZSBFRkkgc3BlY2lmaWNhdGlvbiBzYXlzIHRoYXQgYm9vdCBzZXJ2aWNlIGNvZGUgd29uJ3QgYmUgY2FsbGVkCi0JICogYWZ0ZXIgRXhpdEJvb3RTZXJ2aWNlcygpLiBUaGlzIGlzLCBpbiBmYWN0LCBhIGxpZS4KLQkgKi8KLQlpZiAoZWZpX2VuYWJsZWQoRUZJX01FTU1BUCkpCisJaWYgKGVmaV9lbmFibGVkKEVGSV9NRU1NQVApKSB7CisJCWVmaV9mYWtlX21lbW1hcCgpOworCQllZmlfZmluZF9taXJyb3IoKTsKKwkJZWZpX2VzcnRfaW5pdCgpOworCisJCS8qCisJCSAqIFRoZSBFRkkgc3BlY2lmaWNhdGlvbiBzYXlzIHRoYXQgYm9vdCBzZXJ2aWNlIGNvZGUgd29uJ3QgYmUKKwkJICogY2FsbGVkIGFmdGVyIEV4aXRCb290U2VydmljZXMoKS4gVGhpcyBpcywgaW4gZmFjdCwgYSBsaWUuCisJCSAqLwogCQllZmlfcmVzZXJ2ZV9ib290X3NlcnZpY2VzKCk7CisJfQogCiAJLyogcHJlYWxsb2NhdGUgNGsgZm9yIG1wdGFibGUgbXBjICovCiAJZWFybHlfcmVzZXJ2ZV9lODIwX21wY19uZXcoKTsKQEAgLTExMzcsOSArMTEzNyw3IEBACiAJICogYXVkaXRpbmcgYWxsIHRoZSBlYXJseS1ib290IENSNCBtYW5pcHVsYXRpb24gd291bGQgYmUgbmVlZGVkIHRvCiAJICogcnVsZSBpdCBvdXQuCiAJICovCi0JaWYgKGJvb3RfY3B1X2RhdGEuY3B1aWRfbGV2ZWwgPj0gMCkKLQkJLyogQSBDUFUgaGFzICVjcjQgaWYgYW5kIG9ubHkgaWYgaXQgaGFzIENQVUlELiAqLwotCQltbXVfY3I0X2ZlYXR1cmVzID0gX19yZWFkX2NyNCgpOworCW1tdV9jcjRfZmVhdHVyZXMgPSBfX3JlYWRfY3I0KCk7CiAKIAltZW1ibG9ja19zZXRfY3VycmVudF9saW1pdChnZXRfbWF4X21hcHBlZCgpKTsKIApAQCAtMTIyMSw4ICsxMjE5LDcgQEAKIAkvKgogCSAqIGdldCBib290LXRpbWUgU01QIGNvbmZpZ3VyYXRpb246CiAJICovCi0JaWYgKHNtcF9mb3VuZF9jb25maWcpCi0JCWdldF9zbXBfY29uZmlnKCk7CisJZ2V0X3NtcF9jb25maWcoKTsKIAogCXByZWZpbGxfcG9zc2libGVfbWFwKCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zZXR1cF9wZXJjcHUuYyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cF9wZXJjcHUuYwppbmRleCA3YTQwZTA2Li4yYmJkMjdmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXBfcGVyY3B1LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NldHVwX3BlcmNwdS5jCkBAIC0zMyw3ICszMyw3IEBACiBERUZJTkVfUEVSX0NQVV9SRUFEX01PU1RMWSh1bnNpZ25lZCBsb25nLCB0aGlzX2NwdV9vZmYpID0gQk9PVF9QRVJDUFVfT0ZGU0VUOwogRVhQT1JUX1BFUl9DUFVfU1lNQk9MKHRoaXNfY3B1X29mZik7CiAKLXVuc2lnbmVkIGxvbmcgX19wZXJfY3B1X29mZnNldFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0gewordW5zaWduZWQgbG9uZyBfX3Blcl9jcHVfb2Zmc2V0W05SX0NQVVNdIF9fcm9fYWZ0ZXJfaW5pdCA9IHsKIAlbMCAuLi4gTlJfQ1BVUy0xXSA9IEJPT1RfUEVSQ1BVX09GRlNFVCwKIH07CiBFWFBPUlRfU1lNQk9MKF9fcGVyX2NwdV9vZmZzZXQpOwpAQCAtMjQ2LDcgKzI0Niw3IEBACiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCQlwZXJfY3B1KGlycV9zdGFja19wdHIsIGNwdSkgPQogCQkJcGVyX2NwdShpcnFfc3RhY2tfdW5pb24uaXJxX3N0YWNrLCBjcHUpICsKLQkJCUlSUV9TVEFDS19TSVpFIC0gNjQ7CisJCQlJUlFfU1RBQ0tfU0laRTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19OVU1BCiAJCXBlcl9jcHUoeDg2X2NwdV90b19ub2RlX21hcCwgY3B1KSA9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmMKaW5kZXggMDRjYjMyMS4uNzYzYWYxZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zaWduYWwuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGFzbS9zeXNjYWxscy5oPgogCiAjaW5jbHVkZSA8YXNtL3NpZ2ZyYW1lLmg+CisjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgogCiAjZGVmaW5lIENPUFkoeCkJCQlkbyB7CQkJXAogCWdldF91c2VyX2V4KHJlZ3MtPngsICZzYy0+eCk7CQkJXApAQCAtNTQ3LDcgKzU0OCw3IEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJaWYgKGtzaWctPmthLnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykgewotCQlpZiAoY29weV9zaWdpbmZvX3RvX3VzZXIzMigmZnJhbWUtPmluZm8sICZrc2lnLT5pbmZvKSkKKwkJaWYgKF9fY29weV9zaWdpbmZvX3RvX3VzZXIzMigmZnJhbWUtPmluZm8sICZrc2lnLT5pbmZvLCB0cnVlKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KIApAQCAtNjYwLDIwICs2NjEsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaXNfaWEzMl9jb21wYXRfZnJhbWUodm9pZCkKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2lhMzJfY29tcGF0X2ZyYW1lKHN0cnVjdCBrc2lnbmFsICprc2lnKQogewogCXJldHVybiBJU19FTkFCTEVEKENPTkZJR19JQTMyX0VNVUxBVElPTikgJiYKLQkgICAgICAgdGVzdF90aHJlYWRfZmxhZyhUSUZfSUEzMik7CisJCWtzaWctPmthLnNhLnNhX2ZsYWdzICYgU0FfSUEzMl9BQkk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGlzX2lhMzJfZnJhbWUodm9pZCkKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2lhMzJfZnJhbWUoc3RydWN0IGtzaWduYWwgKmtzaWcpCiB7Ci0JcmV0dXJuIElTX0VOQUJMRUQoQ09ORklHX1g4Nl8zMikgfHwgaXNfaWEzMl9jb21wYXRfZnJhbWUoKTsKKwlyZXR1cm4gSVNfRU5BQkxFRChDT05GSUdfWDg2XzMyKSB8fCBpc19pYTMyX2NvbXBhdF9mcmFtZShrc2lnKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaXNfeDMyX2ZyYW1lKHZvaWQpCitzdGF0aWMgaW5saW5lIGludCBpc194MzJfZnJhbWUoc3RydWN0IGtzaWduYWwgKmtzaWcpCiB7Ci0JcmV0dXJuIElTX0VOQUJMRUQoQ09ORklHX1g4Nl9YMzJfQUJJKSAmJiB0ZXN0X3RocmVhZF9mbGFnKFRJRl9YMzIpOworCXJldHVybiBJU19FTkFCTEVEKENPTkZJR19YODZfWDMyX0FCSSkgJiYKKwkJa3NpZy0+a2Euc2Euc2FfZmxhZ3MgJiBTQV9YMzJfQUJJOwogfQogCiBzdGF0aWMgaW50CkBAIC02ODQsMTIgKzY4NiwxMiBAQAogCWNvbXBhdF9zaWdzZXRfdCAqY3NldCA9IChjb21wYXRfc2lnc2V0X3QgKikgc2V0OwogCiAJLyogU2V0IHVwIHRoZSBzdGFjayBmcmFtZSAqLwotCWlmIChpc19pYTMyX2ZyYW1lKCkpIHsKKwlpZiAoaXNfaWEzMl9mcmFtZShrc2lnKSkgewogCQlpZiAoa3NpZy0+a2Euc2Euc2FfZmxhZ3MgJiBTQV9TSUdJTkZPKQogCQkJcmV0dXJuIGlhMzJfc2V0dXBfcnRfZnJhbWUodXNpZywga3NpZywgY3NldCwgcmVncyk7CiAJCWVsc2UKIAkJCXJldHVybiBpYTMyX3NldHVwX2ZyYW1lKHVzaWcsIGtzaWcsIGNzZXQsIHJlZ3MpOwotCX0gZWxzZSBpZiAoaXNfeDMyX2ZyYW1lKCkpIHsKKwl9IGVsc2UgaWYgKGlzX3gzMl9mcmFtZShrc2lnKSkgewogCQlyZXR1cm4geDMyX3NldHVwX3J0X2ZyYW1lKGtzaWcsIGNzZXQsIHJlZ3MpOwogCX0gZWxzZSB7CiAJCXJldHVybiBfX3NldHVwX3J0X2ZyYW1lKGtzaWctPnNpZywga3NpZywgc2V0LCByZWdzKTsKQEAgLTc4Myw3ICs3ODUsNyBAQAogCSAqIHRoYW4gdGhlIHRyYWNlZS4KIAkgKi8KICNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KLQlpZiAoY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgJiAoVFNfQ09NUEFUfFRTX0kzODZfUkVHU19QT0tFRCkpCisJaWYgKGN1cnJlbnQtPnRocmVhZC5zdGF0dXMgJiAoVFNfQ09NUEFUfFRTX0kzODZfUkVHU19QT0tFRCkpCiAJCXJldHVybiBfX05SX2lhMzJfcmVzdGFydF9zeXNjYWxsOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1g4Nl9YMzJfQUJJCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsX2NvbXBhdC5jIGIvYXJjaC94ODYva2VybmVsL3NpZ25hbF9jb21wYXQuYwppbmRleCBiNDQ1NjRiLi40MGRmMzM3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsX2NvbXBhdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zaWduYWxfY29tcGF0LmMKQEAgLTEsNSArMSw2IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogCiAvKgogICogVGhlIGNvbXBhdF9zaWdpbmZvX3Qgc3RydWN0dXJlIGFuZCBoYW5kaW5nIGNvZGUgaXMgdmVyeSBlYXN5CkBAIC05MiwxMCArOTMsMzEgQEAKIAkvKiBhbnkgbmV3IHNpX2ZpZWxkcyBzaG91bGQgYmUgYWRkZWQgaGVyZSAqLwogfQogCi1pbnQgY29weV9zaWdpbmZvX3RvX3VzZXIzMihjb21wYXRfc2lnaW5mb190IF9fdXNlciAqdG8sIGNvbnN0IHNpZ2luZm9fdCAqZnJvbSkKK3ZvaWQgc2lnYWN0aW9uX2NvbXBhdF9hYmkoc3RydWN0IGtfc2lnYWN0aW9uICphY3QsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqb2FjdCkKK3sKKwkvKiBEb24ndCBsZWFrIGluLWtlcm5lbCBub24tdWFwaSBmbGFncyB0byB1c2VyLXNwYWNlICovCisJaWYgKG9hY3QpCisJCW9hY3QtPnNhLnNhX2ZsYWdzICY9IH4oU0FfSUEzMl9BQkkgfCBTQV9YMzJfQUJJKTsKKworCWlmICghYWN0KQorCQlyZXR1cm47CisKKwkvKiBEb24ndCBsZXQgZmxhZ3MgdG8gYmUgc2V0IGZyb20gdXNlcnNwYWNlICovCisJYWN0LT5zYS5zYV9mbGFncyAmPSB+KFNBX0lBMzJfQUJJIHwgU0FfWDMyX0FCSSk7CisKKwlpZiAodXNlcl82NGJpdF9tb2RlKGN1cnJlbnRfcHRfcmVncygpKSkKKwkJcmV0dXJuOworCisJaWYgKGluX2lhMzJfc3lzY2FsbCgpKQorCQlhY3QtPnNhLnNhX2ZsYWdzIHw9IFNBX0lBMzJfQUJJOworCWlmIChpbl94MzJfc3lzY2FsbCgpKQorCQlhY3QtPnNhLnNhX2ZsYWdzIHw9IFNBX1gzMl9BQkk7Cit9CisKK2ludCBfX2NvcHlfc2lnaW5mb190b191c2VyMzIoY29tcGF0X3NpZ2luZm9fdCBfX3VzZXIgKnRvLCBjb25zdCBzaWdpbmZvX3QgKmZyb20sCisJCWJvb2wgeDMyX0FCSSkKIHsKIAlpbnQgZXJyID0gMDsKLQlib29sIGlhMzIgPSB0ZXN0X3RocmVhZF9mbGFnKFRJRl9JQTMyKTsKIAogCXNpZ25hbF9jb21wYXRfYnVpbGRfdGVzdHMoKTsKIApAQCAtMTQ2LDcgKzE2OCw3IEBACiAJCQkJcHV0X3VzZXJfZXgoZnJvbS0+c2lfYXJjaCwgJnRvLT5zaV9hcmNoKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgX19TSV9DSExEID4+IDE2OgotCQkJCWlmIChpYTMyKSB7CisJCQkJaWYgKCF4MzJfQUJJKSB7CiAJCQkJCXB1dF91c2VyX2V4KGZyb20tPnNpX3V0aW1lLCAmdG8tPnNpX3V0aW1lKTsKIAkJCQkJcHV0X3VzZXJfZXgoZnJvbS0+c2lfc3RpbWUsICZ0by0+c2lfc3RpbWUpOwogCQkJCX0gZWxzZSB7CkBAIC0xODAsNiArMjAyLDEyIEBACiAJcmV0dXJuIGVycjsKIH0KIAorLyogZnJvbSBzeXNjYWxsJ3MgcGF0aCwgd2hlcmUgd2Uga25vdyB0aGUgQUJJICovCitpbnQgY29weV9zaWdpbmZvX3RvX3VzZXIzMihjb21wYXRfc2lnaW5mb190IF9fdXNlciAqdG8sIGNvbnN0IHNpZ2luZm9fdCAqZnJvbSkKK3sKKwlyZXR1cm4gX19jb3B5X3NpZ2luZm9fdG9fdXNlcjMyKHRvLCBmcm9tLCBpbl94MzJfc3lzY2FsbCgpKTsKK30KKwogaW50IGNvcHlfc2lnaW5mb19mcm9tX3VzZXIzMihzaWdpbmZvX3QgKnRvLCBjb21wYXRfc2lnaW5mb190IF9fdXNlciAqZnJvbSkKIHsKIAlpbnQgZXJyID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCmluZGV4IDJhNmU4NGEuLjQyYTkzNjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYwpAQCAtMTAwLDEwICsxMDAsMTEgQEAKIC8qIExvZ2ljYWwgcGFja2FnZSBtYW5hZ2VtZW50LiBXZSBtaWdodCB3YW50IHRvIGFsbG9jYXRlIHRoYXQgZHluYW1pY2FsbHkgKi8KIHN0YXRpYyBpbnQgKnBoeXNpY2FsX3RvX2xvZ2ljYWxfcGtnIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyAqcGh5c2ljYWxfcGFja2FnZV9tYXAgX19yZWFkX21vc3RseTs7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyAqbG9naWNhbF9wYWNrYWdlX21hcCAgX19yZWFkX21vc3RseTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X3BoeXNpY2FsX3BrZ19pZCBfX3JlYWRfbW9zdGx5OwogdW5zaWduZWQgaW50IF9fbWF4X2xvZ2ljYWxfcGFja2FnZXMgX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0woX19tYXhfbG9naWNhbF9wYWNrYWdlcyk7CitzdGF0aWMgdW5zaWduZWQgaW50IGxvZ2ljYWxfcGFja2FnZXMgX19yZWFkX21vc3RseTsKK3N0YXRpYyBib29sIGxvZ2ljYWxfcGFja2FnZXNfZnJvemVuIF9fcmVhZF9tb3N0bHk7CiAKIC8qIE1heGltdW0gbnVtYmVyIG9mIFNNVCB0aHJlYWRzIG9uIGFueSBvbmxpbmUgY29yZSAqLwogaW50IF9fbWF4X3NtdF90aHJlYWRzIF9fcmVhZF9tb3N0bHk7CkBAIC0yNzcsMTQgKzI3OCwxNCBAQAogCWlmICh0ZXN0X2FuZF9zZXRfYml0KHBrZywgcGh5c2ljYWxfcGFja2FnZV9tYXApKQogCQlnb3RvIGZvdW5kOwogCi0JbmV3ID0gZmluZF9maXJzdF96ZXJvX2JpdChsb2dpY2FsX3BhY2thZ2VfbWFwLCBfX21heF9sb2dpY2FsX3BhY2thZ2VzKTsKLQlpZiAobmV3ID49IF9fbWF4X2xvZ2ljYWxfcGFja2FnZXMpIHsKKwlpZiAobG9naWNhbF9wYWNrYWdlc19mcm96ZW4pIHsKIAkJcGh5c2ljYWxfdG9fbG9naWNhbF9wa2dbcGtnXSA9IC0xOwotCQlwcl93YXJuKCJBUElDKCV4KSBQYWNrYWdlICV1IGV4Y2VlZHMgbG9naWNhbCBwYWNrYWdlIG1hcFxuIiwKKwkJcHJfd2FybigiQVBJQygleCkgUGFja2FnZSAldSBleGNlZWRzIGxvZ2ljYWwgcGFja2FnZSBtYXhcbiIsCiAJCQlhcGljaWQsIHBrZyk7CiAJCXJldHVybiAtRU5PU1BDOwogCX0KLQlzZXRfYml0KG5ldywgbG9naWNhbF9wYWNrYWdlX21hcCk7CisKKwluZXcgPSBsb2dpY2FsX3BhY2thZ2VzKys7CiAJcHJfaW5mbygiQVBJQygleCkgQ29udmVydGluZyBwaHlzaWNhbCAldSB0byBsb2dpY2FsIHBhY2thZ2UgJXVcbiIsCiAJCWFwaWNpZCwgcGtnLCBuZXcpOwogCXBoeXNpY2FsX3RvX2xvZ2ljYWxfcGtnW3BrZ10gPSBuZXc7CkBAIC0zNDEsNiArMzQyLDcgQEAKIAl9CiAKIAlfX21heF9sb2dpY2FsX3BhY2thZ2VzID0gRElWX1JPVU5EX1VQKHRvdGFsX2NwdXMsIG5jcHVzKTsKKwlsb2dpY2FsX3BhY2thZ2VzID0gMDsKIAogCS8qCiAJICogUG9zc2libHkgbGFyZ2VyIHRoYW4gd2hhdCB3ZSBuZWVkIGFzIHRoZSBudW1iZXIgb2YgYXBpYyBpZHMgcGVyCkBAIC0zNTIsMTAgKzM1NCw2IEBACiAJbWVtc2V0KHBoeXNpY2FsX3RvX2xvZ2ljYWxfcGtnLCAweGZmLCBzaXplKTsKIAlzaXplID0gQklUU19UT19MT05HUyhtYXhfcGh5c2ljYWxfcGtnX2lkKSAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKIAlwaHlzaWNhbF9wYWNrYWdlX21hcCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0Jc2l6ZSA9IEJJVFNfVE9fTE9OR1MoX19tYXhfbG9naWNhbF9wYWNrYWdlcykgKiBzaXplb2YodW5zaWduZWQgbG9uZyk7Ci0JbG9naWNhbF9wYWNrYWdlX21hcCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0KLQlwcl9pbmZvKCJNYXggbG9naWNhbCBwYWNrYWdlczogJXVcbiIsIF9fbWF4X2xvZ2ljYWxfcGFja2FnZXMpOwogCiAJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CiAJCXVuc2lnbmVkIGludCBhcGljaWQgPSBhcGljLT5jcHVfcHJlc2VudF90b19hcGljaWQoY3B1KTsKQEAgLTM2OSw2ICszNjcsMTUgQEAKIAkJc2V0X2NwdV9wb3NzaWJsZShjcHUsIGZhbHNlKTsKIAkJc2V0X2NwdV9wcmVzZW50KGNwdSwgZmFsc2UpOwogCX0KKworCWlmIChsb2dpY2FsX3BhY2thZ2VzID4gX19tYXhfbG9naWNhbF9wYWNrYWdlcykgeworCQlwcl93YXJuKCJEZXRlY3RlZCBtb3JlIHBhY2thZ2VzICgldSksIHRoZW4gY29tcHV0ZWQgYnkgQklPUyBkYXRhICgldSkuXG4iLAorCQkJbG9naWNhbF9wYWNrYWdlcywgX19tYXhfbG9naWNhbF9wYWNrYWdlcyk7CisJCWxvZ2ljYWxfcGFja2FnZXNfZnJvemVuID0gdHJ1ZTsKKwkJX19tYXhfbG9naWNhbF9wYWNrYWdlcyAgPSBsb2dpY2FsX3BhY2thZ2VzOworCX0KKworCXByX2luZm8oIk1heCBsb2dpY2FsIHBhY2thZ2VzOiAldVxuIiwgX19tYXhfbG9naWNhbF9wYWNrYWdlcyk7CiB9CiAKIHZvaWQgX19pbml0IHNtcF9zdG9yZV9ib290X2NwdV9pbmZvKHZvaWQpCkBAIC00NjQsNyArNDcxLDcgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xldmVsIG51bWFfaW5zaWRlX3BhY2thZ2VfdG9wb2xvZ3lbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xldmVsIHg4Nl9udW1hX2luX3BhY2thZ2VfdG9wb2xvZ3lbXSA9IHsKICNpZmRlZiBDT05GSUdfU0NIRURfU01UCiAJeyBjcHVfc210X21hc2ssIGNwdV9zbXRfZmxhZ3MsIFNEX0lOSVRfTkFNRShTTVQpIH0sCiAjZW5kaWYKQEAgLTQ3MywyMiArNDgwLDIzIEBACiAjZW5kaWYKIAl7IE5VTEwsIH0sCiB9OworCitzdGF0aWMgc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCB4ODZfdG9wb2xvZ3lbXSA9IHsKKyNpZmRlZiBDT05GSUdfU0NIRURfU01UCisJeyBjcHVfc210X21hc2ssIGNwdV9zbXRfZmxhZ3MsIFNEX0lOSVRfTkFNRShTTVQpIH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0NIRURfTUMKKwl7IGNwdV9jb3JlZ3JvdXBfbWFzaywgY3B1X2NvcmVfZmxhZ3MsIFNEX0lOSVRfTkFNRShNQykgfSwKKyNlbmRpZgorCXsgY3B1X2NwdV9tYXNrLCBTRF9JTklUX05BTUUoRElFKSB9LAorCXsgTlVMTCwgfSwKK307CisKIC8qCi0gKiBzZXRfc2NoZWRfdG9wb2xvZ3koKSBzZXRzIHRoZSB0b3BvbG9neSBpbnRlcm5hbCB0byBhIENQVS4gIFRoZQotICogTlVNQSB0b3BvbG9naWVzIGFyZSBsYXllcmVkIG9uIHRvcCBvZiBpdCB0byBidWlsZCB0aGUgZnVsbAotICogc3lzdGVtIHRvcG9sb2d5LgotICoKLSAqIElmIE5VTUEgbm9kZXMgYXJlIG9ic2VydmVkIHRvIG9jY3VyIHdpdGhpbiBhIENQVSBwYWNrYWdlLCB0aGlzCi0gKiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkLiAgSXQgZm9yY2VzIHRoZSBzY2hlZCBkb21haW4gY29kZSB0bwotICogb25seSB1c2UgdGhlIFNNVCBsZXZlbCBmb3IgdGhlIENQVSBwb3J0aW9uIG9mIHRoZSB0b3BvbG9neS4KLSAqIFRoaXMgZXNzZW50aWFsbHkgZmFsbHMgYmFjayB0byByZWx5aW5nIG9uIE5VTUEgaW5mb3JtYXRpb24KLSAqIGZyb20gdGhlIFNSQVQgdGFibGUgdG8gZGVzY3JpYmUgdGhlIGVudGlyZSBzeXN0ZW0gdG9wb2xvZ3kKLSAqIChleGNlcHQgZm9yIGh5cGVydGhyZWFkcykuCisgKiBTZXQgaWYgYSBwYWNrYWdlL2RpZSBoYXMgbXVsdGlwbGUgTlVNQSBub2RlcyBpbnNpZGUuCisgKiBBTUQgTWFnbnktQ291cnMgYW5kIEludGVsIENsdXN0ZXItb24tRGllIGhhdmUgdGhpcy4KICAqLwotc3RhdGljIHZvaWQgcHJpbWFyaWx5X3VzZV9udW1hX2Zvcl90b3BvbG9neSh2b2lkKQotewotCXNldF9zY2hlZF90b3BvbG9neShudW1hX2luc2lkZV9wYWNrYWdlX3RvcG9sb2d5KTsKLX0KK3N0YXRpYyBib29sIHg4Nl9oYXNfbnVtYV9pbl9wYWNrYWdlOwogCiB2b2lkIHNldF9jcHVfc2libGluZ19tYXAoaW50IGNwdSkKIHsKQEAgLTU1MSw3ICs1NTksNyBAQAogCQkJCWMtPmJvb3RlZF9jb3JlcyA9IGNwdV9kYXRhKGkpLmJvb3RlZF9jb3JlczsKIAkJfQogCQlpZiAobWF0Y2hfZGllKGMsIG8pICYmICF0b3BvbG9neV9zYW1lX25vZGUoYywgbykpCi0JCQlwcmltYXJpbHlfdXNlX251bWFfZm9yX3RvcG9sb2d5KCk7CisJCQl4ODZfaGFzX251bWFfaW5fcGFja2FnZSA9IHRydWU7CiAJfQogCiAJdGhyZWFkcyA9IGNwdW1hc2tfd2VpZ2h0KHRvcG9sb2d5X3NpYmxpbmdfY3B1bWFzayhjcHUpKTsKQEAgLTY4Myw3ICs2OTEsNyBAQAogCSAqIEdpdmUgdGhlIG90aGVyIENQVSBzb21lIHRpbWUgdG8gYWNjZXB0IHRoZSBJUEkuCiAJICovCiAJdWRlbGF5KDIwMCk7Ci0JaWYgKEFQSUNfSU5URUdSQVRFRChhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXSkpIHsKKwlpZiAoQVBJQ19JTlRFR1JBVEVEKGJvb3RfY3B1X2FwaWNfdmVyc2lvbikpIHsKIAkJbWF4bHZ0ID0gbGFwaWNfZ2V0X21heGx2dCgpOwogCQlpZiAobWF4bHZ0ID4gMykJCQkvKiBEdWUgdG8gdGhlIFBlbnRpdW0gZXJyYXR1bSAzQVAuICAqLwogCQkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CkBAIC03MTAsNyArNzE4LDcgQEAKIAkvKgogCSAqIEJlIHBhcmFub2lkIGFib3V0IGNsZWFyaW5nIEFQSUMgZXJyb3JzLgogCSAqLwotCWlmIChBUElDX0lOVEVHUkFURUQoYXBpY192ZXJzaW9uW3BoeXNfYXBpY2lkXSkpIHsKKwlpZiAoQVBJQ19JTlRFR1JBVEVEKGJvb3RfY3B1X2FwaWNfdmVyc2lvbikpIHsKIAkJaWYgKG1heGx2dCA+IDMpCQkvKiBEdWUgdG8gdGhlIFBlbnRpdW0gZXJyYXR1bSAzQVAuICAqLwogCQkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CiAJCWFwaWNfcmVhZChBUElDX0VTUik7CkBAIC03NDksNyArNzU3LDcgQEAKIAkgKiBEZXRlcm1pbmUgdGhpcyBiYXNlZCBvbiB0aGUgQVBJQyB2ZXJzaW9uLgogCSAqIElmIHdlIGRvbid0IGhhdmUgYW4gaW50ZWdyYXRlZCBBUElDLCBkb24ndCBzZW5kIHRoZSBTVEFSVFVQIElQSXMuCiAJICovCi0JaWYgKEFQSUNfSU5URUdSQVRFRChhcGljX3ZlcnNpb25bcGh5c19hcGljaWRdKSkKKwlpZiAoQVBJQ19JTlRFR1JBVEVEKGJvb3RfY3B1X2FwaWNfdmVyc2lvbikpCiAJCW51bV9zdGFydHMgPSAyOwogCWVsc2UKIAkJbnVtX3N0YXJ0cyA9IDA7CkBAIC05MzUsNyArOTQzLDYgQEAKIAlwZXJfY3B1KGNwdV9jdXJyZW50X3RvcF9vZl9zdGFjaywgY3B1KSA9CiAJCSh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShpZGxlKSArIFRIUkVBRF9TSVpFOwogI2Vsc2UKLQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoaWRsZSwgVElGX0ZPUkspOwogCWluaXRpYWxfZ3MgPSBwZXJfY3B1X29mZnNldChjcHUpOwogI2VuZGlmCiB9CkBAIC05NjIsNyArOTY5LDcgQEAKIAogCWVhcmx5X2dkdF9kZXNjci5hZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpZ2V0X2NwdV9nZHRfdGFibGUoY3B1KTsKIAlpbml0aWFsX2NvZGUgPSAodW5zaWduZWQgbG9uZylzdGFydF9zZWNvbmRhcnk7Ci0Jc3RhY2tfc3RhcnQgID0gaWRsZS0+dGhyZWFkLnNwOworCWluaXRpYWxfc3RhY2sgID0gaWRsZS0+dGhyZWFkLnNwOwogCiAJLyoKIAkgKiBFbmFibGUgdGhlIGVzcGZpeCBoYWNrIGZvciB0aGlzIENQVQpAQCAtOTg3LDcgKzk5NCw3IEBACiAJCS8qCiAJCSAqIEJlIHBhcmFub2lkIGFib3V0IGNsZWFyaW5nIEFQSUMgZXJyb3JzLgogCQkqLwotCQlpZiAoQVBJQ19JTlRFR1JBVEVEKGFwaWNfdmVyc2lvbltib290X2NwdV9waHlzaWNhbF9hcGljaWRdKSkgeworCQlpZiAoQVBJQ19JTlRFR1JBVEVEKGJvb3RfY3B1X2FwaWNfdmVyc2lvbikpIHsKIAkJCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOwogCQkJYXBpY19yZWFkKEFQSUNfRVNSKTsKIAkJfQpAQCAtMTEwOCwxNyArMTExNSw4IEBACiAKIAljb21tb25fY3B1X3VwKGNwdSwgdGlkbGUpOwogCi0JLyoKLQkgKiBXZSBoYXZlIHRvIHdhbGsgdGhlIGlycSBkZXNjcmlwdG9ycyB0byBzZXR1cCB0aGUgdmVjdG9yCi0JICogc3BhY2UgZm9yIHRoZSBjcHUgd2hpY2ggY29tZXMgb25saW5lLiAgUHJldmVudCBpcnEKLQkgKiBhbGxvYy9mcmVlIGFjcm9zcyB0aGUgYnJpbmd1cC4KLQkgKi8KLQlpcnFfbG9ja19zcGFyc2UoKTsKLQogCWVyciA9IGRvX2Jvb3RfY3B1KGFwaWNpZCwgY3B1LCB0aWRsZSk7Ci0KIAlpZiAoZXJyKSB7Ci0JCWlycV91bmxvY2tfc3BhcnNlKCk7CiAJCXByX2VycigiZG9fYm9vdF9jcHUgZmFpbGVkKCVkKSB0byB3YWtldXAgQ1BVIyV1XG4iLCBlcnIsIGNwdSk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTExMzYsOCArMTEzNCw2IEBACiAJCXRvdWNoX25taV93YXRjaGRvZygpOwogCX0KIAotCWlycV91bmxvY2tfc3BhcnNlKCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI0Miw3ICsxMjM4LDcgQEAKIAkvKgogCSAqIElmIHdlIGNvdWxkbid0IGZpbmQgYSBsb2NhbCBBUElDLCB0aGVuIGdldCBvdXQgb2YgaGVyZSBub3chCiAJICovCi0JaWYgKEFQSUNfSU5URUdSQVRFRChhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXSkgJiYKKwlpZiAoQVBJQ19JTlRFR1JBVEVEKGJvb3RfY3B1X2FwaWNfdmVyc2lvbikgJiYKIAkgICAgIWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BUElDKSkgewogCQlpZiAoIWRpc2FibGVfYXBpYykgewogCQkJcHJfZXJyKCJCSU9TIGJ1ZywgbG9jYWwgQVBJQyAjJWQgbm90IGRldGVjdGVkIS4uLlxuIiwKQEAgLTEyOTcsNiArMTI5MywxNiBAQAogCQl6YWxsb2NfY3B1bWFza192YXIoJnBlcl9jcHUoY3B1X2NvcmVfbWFwLCBpKSwgR0ZQX0tFUk5FTCk7CiAJCXphbGxvY19jcHVtYXNrX3ZhcigmcGVyX2NwdShjcHVfbGxjX3NoYXJlZF9tYXAsIGkpLCBHRlBfS0VSTkVMKTsKIAl9CisKKwkvKgorCSAqIFNldCAnZGVmYXVsdCcgeDg2IHRvcG9sb2d5LCB0aGlzIG1hdGNoZXMgZGVmYXVsdF90b3BvbG9neSgpIGluIHRoYXQKKwkgKiBpdCBoYXMgTlVNQSBub2RlcyBhcyBhIHRvcG9sb2d5IGxldmVsLiBTZWUgYWxzbworCSAqIG5hdGl2ZV9zbXBfY3B1c19kb25lKCkuCisJICoKKwkgKiBNdXN0IGJlIGRvbmUgYmVmb3JlIHNldF9jcHVzX3NpYmxpbmdfbWFwKCkgaXMgcmFuLgorCSAqLworCXNldF9zY2hlZF90b3BvbG9neSh4ODZfdG9wb2xvZ3kpOworCiAJc2V0X2NwdV9zaWJsaW5nX21hcCgwKTsKIAogCXN3aXRjaCAoc21wX3Nhbml0eV9jaGVjayhtYXhfY3B1cykpIHsKQEAgLTEzMTYsMTQgKzEzMjIsMTMgQEAKIAkJYnJlYWs7CiAJfQogCi0JZGVmYXVsdF9zZXR1cF9hcGljX3JvdXRpbmcoKTsKLQogCWlmIChyZWFkX2FwaWNfaWQoKSAhPSBib290X2NwdV9waHlzaWNhbF9hcGljaWQpIHsKIAkJcGFuaWMoIkJvb3QgQVBJQyBJRCBpbiBsb2NhbCBBUElDIHVuZXhwZWN0ZWQgKCVkIHZzICVkKSIsCiAJCSAgICAgcmVhZF9hcGljX2lkKCksIGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7CiAJCS8qIE9yIGNhbiB3ZSBzd2l0Y2ggYmFjayB0byBQSUMgaGVyZT8gKi8KIAl9CiAKKwlkZWZhdWx0X3NldHVwX2FwaWNfcm91dGluZygpOwogCWNwdTBfbG9naWNhbF9hcGljaWQgPSBhcGljX2JzcF9zZXR1cChmYWxzZSk7CiAKIAlwcl9pbmZvKCJDUFUlZDogIiwgMCk7CkBAIC0xMzYzLDYgKzEzNjgsOSBAQAogewogCXByX2RlYnVnKCJCb290IGRvbmVcbiIpOwogCisJaWYgKHg4Nl9oYXNfbnVtYV9pbl9wYWNrYWdlKQorCQlzZXRfc2NoZWRfdG9wb2xvZ3koeDg2X251bWFfaW5fcGFja2FnZV90b3BvbG9neSk7CisKIAlubWlfc2VsZnRlc3QoKTsKIAlpbXByZXNzX2ZyaWVuZHMoKTsKIAlzZXR1cF9pb2FwaWNfZGVzdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3N0YWNrdHJhY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggNDczOGY1ZS4uMDY1Mzc4OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3N0YWNrdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc3RhY2t0cmFjZS5jCkBAIC04LDgwICs4LDY5IEBACiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgogCi1zdGF0aWMgaW50IHNhdmVfc3RhY2tfc3RhY2sodm9pZCAqZGF0YSwgY2hhciAqbmFtZSkKK3N0YXRpYyBpbnQgc2F2ZV9zdGFja19hZGRyZXNzKHN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSAgICAgIGJvb2wgbm9zY2hlZCkKIHsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotX19zYXZlX3N0YWNrX2FkZHJlc3Modm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBhZGRyLCBib29sIHJlbGlhYmxlLCBib29sIG5vc2NoZWQpCi17Ci0Jc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSA9IGRhdGE7Ci0jaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKLQlpZiAoIXJlbGlhYmxlKQotCQlyZXR1cm4gMDsKLSNlbmRpZgogCWlmIChub3NjaGVkICYmIGluX3NjaGVkX2Z1bmN0aW9ucyhhZGRyKSkKIAkJcmV0dXJuIDA7CisKIAlpZiAodHJhY2UtPnNraXAgPiAwKSB7CiAJCXRyYWNlLT5za2lwLS07CiAJCXJldHVybiAwOwogCX0KLQlpZiAodHJhY2UtPm5yX2VudHJpZXMgPCB0cmFjZS0+bWF4X2VudHJpZXMpIHsKLQkJdHJhY2UtPmVudHJpZXNbdHJhY2UtPm5yX2VudHJpZXMrK10gPSBhZGRyOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlyZXR1cm4gLTE7IC8qIG5vIG1vcmUgcm9vbSwgc3RvcCB3YWxraW5nIHRoZSBzdGFjayAqLworCisJaWYgKHRyYWNlLT5ucl9lbnRyaWVzID49IHRyYWNlLT5tYXhfZW50cmllcykKKwkJcmV0dXJuIC0xOworCisJdHJhY2UtPmVudHJpZXNbdHJhY2UtPm5yX2VudHJpZXMrK10gPSBhZGRyOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX3NhdmVfc3RhY2tfdHJhY2Uoc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSwKKwkJCSAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJICAgICAgIGJvb2wgbm9zY2hlZCkKK3sKKwlzdHJ1Y3QgdW53aW5kX3N0YXRlIHN0YXRlOworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCWlmIChyZWdzKQorCQlzYXZlX3N0YWNrX2FkZHJlc3ModHJhY2UsIHJlZ3MtPmlwLCBub3NjaGVkKTsKKworCWZvciAodW53aW5kX3N0YXJ0KCZzdGF0ZSwgdGFzaywgcmVncywgTlVMTCk7ICF1bndpbmRfZG9uZSgmc3RhdGUpOworCSAgICAgdW53aW5kX25leHRfZnJhbWUoJnN0YXRlKSkgeworCQlhZGRyID0gdW53aW5kX2dldF9yZXR1cm5fYWRkcmVzcygmc3RhdGUpOworCQlpZiAoIWFkZHIgfHwgc2F2ZV9zdGFja19hZGRyZXNzKHRyYWNlLCBhZGRyLCBub3NjaGVkKSkKKwkJCWJyZWFrOwogCX0KKworCWlmICh0cmFjZS0+bnJfZW50cmllcyA8IHRyYWNlLT5tYXhfZW50cmllcykKKwkJdHJhY2UtPmVudHJpZXNbdHJhY2UtPm5yX2VudHJpZXMrK10gPSBVTE9OR19NQVg7CiB9CiAKLXN0YXRpYyBpbnQgc2F2ZV9zdGFja19hZGRyZXNzKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IHJlbGlhYmxlKQotewotCXJldHVybiBfX3NhdmVfc3RhY2tfYWRkcmVzcyhkYXRhLCBhZGRyLCByZWxpYWJsZSwgZmFsc2UpOwotfQotCi1zdGF0aWMgaW50Ci1zYXZlX3N0YWNrX2FkZHJlc3Nfbm9zY2hlZCh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCByZWxpYWJsZSkKLXsKLQlyZXR1cm4gX19zYXZlX3N0YWNrX2FkZHJlc3MoZGF0YSwgYWRkciwgcmVsaWFibGUsIHRydWUpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzIHNhdmVfc3RhY2tfb3BzID0gewotCS5zdGFjawkJPSBzYXZlX3N0YWNrX3N0YWNrLAotCS5hZGRyZXNzCT0gc2F2ZV9zdGFja19hZGRyZXNzLAotCS53YWxrX3N0YWNrCT0gcHJpbnRfY29udGV4dF9zdGFjaywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgc2F2ZV9zdGFja19vcHNfbm9zY2hlZCA9IHsKLQkuc3RhY2sJCT0gc2F2ZV9zdGFja19zdGFjaywKLQkuYWRkcmVzcwk9IHNhdmVfc3RhY2tfYWRkcmVzc19ub3NjaGVkLAotCS53YWxrX3N0YWNrCT0gcHJpbnRfY29udGV4dF9zdGFjaywKLX07Ci0KIC8qCiAgKiBTYXZlIHN0YWNrLWJhY2t0cmFjZSBhZGRyZXNzZXMgaW50byBhIHN0YWNrX3RyYWNlIGJ1ZmZlci4KICAqLwogdm9pZCBzYXZlX3N0YWNrX3RyYWNlKHN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UpCiB7Ci0JZHVtcF90cmFjZShjdXJyZW50LCBOVUxMLCBOVUxMLCAwLCAmc2F2ZV9zdGFja19vcHMsIHRyYWNlKTsKLQlpZiAodHJhY2UtPm5yX2VudHJpZXMgPCB0cmFjZS0+bWF4X2VudHJpZXMpCi0JCXRyYWNlLT5lbnRyaWVzW3RyYWNlLT5ucl9lbnRyaWVzKytdID0gVUxPTkdfTUFYOworCV9fc2F2ZV9zdGFja190cmFjZSh0cmFjZSwgY3VycmVudCwgTlVMTCwgZmFsc2UpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc2F2ZV9zdGFja190cmFjZSk7CiAKIHZvaWQgc2F2ZV9zdGFja190cmFjZV9yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlKQogewotCWR1bXBfdHJhY2UoY3VycmVudCwgcmVncywgTlVMTCwgMCwgJnNhdmVfc3RhY2tfb3BzLCB0cmFjZSk7Ci0JaWYgKHRyYWNlLT5ucl9lbnRyaWVzIDwgdHJhY2UtPm1heF9lbnRyaWVzKQotCQl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IFVMT05HX01BWDsKKwlfX3NhdmVfc3RhY2tfdHJhY2UodHJhY2UsIGN1cnJlbnQsIHJlZ3MsIGZhbHNlKTsKIH0KIAogdm9pZCBzYXZlX3N0YWNrX3RyYWNlX3RzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKIHsKLQlkdW1wX3RyYWNlKHRzaywgTlVMTCwgTlVMTCwgMCwgJnNhdmVfc3RhY2tfb3BzX25vc2NoZWQsIHRyYWNlKTsKLQlpZiAodHJhY2UtPm5yX2VudHJpZXMgPCB0cmFjZS0+bWF4X2VudHJpZXMpCi0JCXRyYWNlLT5lbnRyaWVzW3RyYWNlLT5ucl9lbnRyaWVzKytdID0gVUxPTkdfTUFYOworCWlmICghdHJ5X2dldF90YXNrX3N0YWNrKHRzaykpCisJCXJldHVybjsKKworCV9fc2F2ZV9zdGFja190cmFjZSh0cmFjZSwgdHNrLCBOVUxMLCB0cnVlKTsKKworCXB1dF90YXNrX3N0YWNrKHRzayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzYXZlX3N0YWNrX3RyYWNlX3Rzayk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90Ym9vdC5jIGIvYXJjaC94ODYva2VybmVsL3Rib290LmMKaW5kZXggNjU0ZjZjNi4uODQwMjkwNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Rib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Rib290LmMKQEAgLTE4OCwxMiArMTg4LDEyIEBACiAKIAl0Ym9vdC0+bnVtX21hY19yZWdpb25zID0gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCWlmICgoZTgyMC5tYXBbaV0udHlwZSAhPSBFODIwX1JBTSkKLQkJICYmIChlODIwLm1hcFtpXS50eXBlICE9IEU4MjBfUkVTRVJWRURfS0VSTikpCisJZm9yIChpID0gMDsgaSA8IGU4MjAtPm5yX21hcDsgaSsrKSB7CisJCWlmICgoZTgyMC0+bWFwW2ldLnR5cGUgIT0gRTgyMF9SQU0pCisJCSAmJiAoZTgyMC0+bWFwW2ldLnR5cGUgIT0gRTgyMF9SRVNFUlZFRF9LRVJOKSkKIAkJCWNvbnRpbnVlOwogCi0JCWFkZF9tYWNfcmVnaW9uKGU4MjAubWFwW2ldLmFkZHIsIGU4MjAubWFwW2ldLnNpemUpOworCQlhZGRfbWFjX3JlZ2lvbihlODIwLT5tYXBbaV0uYWRkciwgZTgyMC0+bWFwW2ldLnNpemUpOwogCX0KIAogCXRib290LT5hY3BpX3NpbmZvLmtlcm5lbF9zM19yZXN1bWVfdmVjdG9yID0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKaW5kZXggYjcwY2ExMi4uYmQ0ZTNkNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKQEAgLTI5MiwxMiArMjkyLDMwIEBACiBET19FUlJPUihYODZfVFJBUF9TUywgICAgIFNJR0JVUywgICJzdGFjayBzZWdtZW50IiwJCXN0YWNrX3NlZ21lbnQpCiBET19FUlJPUihYODZfVFJBUF9BQywgICAgIFNJR0JVUywgICJhbGlnbm1lbnQgY2hlY2siLAkJYWxpZ25tZW50X2NoZWNrKQogCisjaWZkZWYgQ09ORklHX1ZNQVBfU1RBQ0sKK19fdmlzaWJsZSB2b2lkIF9fbm9yZXR1cm4gaGFuZGxlX3N0YWNrX292ZXJmbG93KGNvbnN0IGNoYXIgKm1lc3NhZ2UsCisJCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJCXVuc2lnbmVkIGxvbmcgZmF1bHRfYWRkcmVzcykKK3sKKwlwcmludGsoS0VSTl9FTUVSRyAiQlVHOiBzdGFjayBndWFyZCBwYWdlIHdhcyBoaXQgYXQgJXAgKHN0YWNrIGlzICVwLi4lcClcbiIsCisJCSAodm9pZCAqKWZhdWx0X2FkZHJlc3MsIGN1cnJlbnQtPnN0YWNrLAorCQkgKGNoYXIgKiljdXJyZW50LT5zdGFjayArIFRIUkVBRF9TSVpFIC0gMSk7CisJZGllKG1lc3NhZ2UsIHJlZ3MsIDApOworCisJLyogQmUgYWJzb2x1dGVseSBjZXJ0YWluIHdlIGRvbid0IHJldHVybi4gKi8KKwlwYW5pYyhtZXNzYWdlKTsKK30KKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogLyogUnVucyBvbiBJU1Qgc3RhY2sgKi8KIGRvdHJhcGxpbmthZ2Ugdm9pZCBkb19kb3VibGVfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKIHsKIAlzdGF0aWMgY29uc3QgY2hhciBzdHJbXSA9ICJkb3VibGUgZmF1bHQiOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworCXVuc2lnbmVkIGxvbmcgY3IyOworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfWDg2X0VTUEZJWDY0CiAJZXh0ZXJuIHVuc2lnbmVkIGNoYXIgbmF0aXZlX2lycV9yZXR1cm5faXJldFtdOwpAQCAtMzMyLDYgKzM1MCw0OSBAQAogCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOwogCXRzay0+dGhyZWFkLnRyYXBfbnIgPSBYODZfVFJBUF9ERjsKIAorI2lmZGVmIENPTkZJR19WTUFQX1NUQUNLCisJLyoKKwkgKiBJZiB3ZSBvdmVyZmxvdyB0aGUgc3RhY2sgaW50byBhIGd1YXJkIHBhZ2UsIHRoZSBDUFUgd2lsbCBmYWlsCisJICogdG8gZGVsaXZlciAjUEYgYW5kIHdpbGwgc2VuZCAjREYgaW5zdGVhZC4gIFNpbWlsYXJseSwgaWYgd2UKKwkgKiB0YWtlIGFueSBub24tSVNUIGV4Y2VwdGlvbiB3aGlsZSB0b28gY2xvc2UgdG8gdGhlIGJvdHRvbSBvZgorCSAqIHRoZSBzdGFjaywgdGhlIHByb2Nlc3NvciB3aWxsIGdldCBhIHBhZ2UgZmF1bHQgd2hpbGUKKwkgKiBkZWxpdmVyaW5nIHRoZSBleGNlcHRpb24gYW5kIHdpbGwgZ2VuZXJhdGUgYSBkb3VibGUgZmF1bHQuCisJICoKKwkgKiBBY2NvcmRpbmcgdG8gdGhlIFNETSAoZm9vdG5vdGUgaW4gNi4xNSB1bmRlciAiSW50ZXJydXB0IDE0IC0KKwkgKiBQYWdlLUZhdWx0IEV4Y2VwdGlvbiAoI1BGKToKKwkgKgorCSAqICAgUHJvY2Vzc29ycyB1cGRhdGUgQ1IyIHdoZW5ldmVyIGEgcGFnZSBmYXVsdCBpcyBkZXRlY3RlZC4gSWYgYQorCSAqICAgc2Vjb25kIHBhZ2UgZmF1bHQgb2NjdXJzIHdoaWxlIGFuIGVhcmxpZXIgcGFnZSBmYXVsdCBpcyBiZWluZworCSAqICAgZGVsaXYtIGVyZWQsIHRoZSBmYXVsdGluZyBsaW5lYXIgYWRkcmVzcyBvZiB0aGUgc2Vjb25kIGZhdWx0IHdpbGwKKwkgKiAgIG92ZXJ3cml0ZSB0aGUgY29udGVudHMgb2YgQ1IyIChyZXBsYWNpbmcgdGhlIHByZXZpb3VzCisJICogICBhZGRyZXNzKS4gVGhlc2UgdXBkYXRlcyB0byBDUjIgb2NjdXIgZXZlbiBpZiB0aGUgcGFnZSBmYXVsdAorCSAqICAgcmVzdWx0cyBpbiBhIGRvdWJsZSBmYXVsdCBvciBvY2N1cnMgZHVyaW5nIHRoZSBkZWxpdmVyeSBvZiBhCisJICogICBkb3VibGUgZmF1bHQuCisJICoKKwkgKiBUaGUgbG9naWMgYmVsb3cgaGFzIGEgc21hbGwgcG9zc2liaWxpdHkgb2YgaW5jb3JyZWN0bHkgZGlhZ25vc2luZworCSAqIHNvbWUgZXJyb3JzIGFzIHN0YWNrIG92ZXJmbG93cy4gIEZvciBleGFtcGxlLCBpZiB0aGUgSURUIG9yIEdEVAorCSAqIGdldHMgY29ycnVwdGVkIHN1Y2ggdGhhdCAjR1AgZGVsaXZlcnkgZmFpbHMgZHVlIHRvIGEgYmFkIGRlc2NyaXB0b3IKKwkgKiBjYXVzaW5nICNHUCBhbmQgd2UgaGl0IHRoaXMgY29uZGl0aW9uIHdoaWxlIENSMiBjb2luY2lkZW50YWxseQorCSAqIHBvaW50cyB0byB0aGUgc3RhY2sgZ3VhcmQgcGFnZSwgd2UnbGwgdGhpbmsgd2Ugb3ZlcmZsb3dlZCB0aGUKKwkgKiBzdGFjay4gIEdpdmVuIHRoYXQgd2UncmUgZ29pbmcgdG8gcGFuaWMgb25lIHdheSBvciBhbm90aGVyCisJICogaWYgdGhpcyBoYXBwZW5zLCB0aGlzIGlzbid0IG5lY2Vzc2FyaWx5IHdvcnRoIGZpeGluZy4KKwkgKgorCSAqIElmIG5lY2Vzc2FyeSwgd2UgY291bGQgaW1wcm92ZSB0aGUgdGVzdCBieSBvbmx5IGRpYWdub3NpbmcKKwkgKiBhIHN0YWNrIG92ZXJmbG93IGlmIHRoZSBzYXZlZCBSU1AgcG9pbnRzIHdpdGhpbiA0NyBieXRlcyBvZgorCSAqIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrOiBpZiBSU1AgPT0gdHNrX3N0YWNrICsgNDggYW5kIHdlCisJICogdGFrZSBhbiBleGNlcHRpb24sIHRoZSBzdGFjayBpcyBhbHJlYWR5IGFsaWduZWQgYW5kIHRoZXJlCisJICogd2lsbCBiZSBlbm91Z2ggcm9vbSBTUywgUlNQLCBSRkxBR1MsIENTLCBSSVAsIGFuZCBhCisJICogcG9zc2libGUgZXJyb3IgY29kZSwgc28gYSBzdGFjayBvdmVyZmxvdyB3b3VsZCAqbm90KiBkb3VibGUKKwkgKiBmYXVsdC4gIFdpdGggYW55IGxlc3Mgc3BhY2UgbGVmdCwgZXhjZXB0aW9uIGRlbGl2ZXJ5IGNvdWxkCisJICogZmFpbCwgYW5kLCBhcyBhIHByYWN0aWNhbCBtYXR0ZXIsIHdlJ3ZlIG92ZXJmbG93ZWQgdGhlCisJICogc3RhY2sgZXZlbiBpZiB0aGUgYWN0dWFsIHRyaWdnZXIgZm9yIHRoZSBkb3VibGUgZmF1bHQgd2FzCisJICogc29tZXRoaW5nIGVsc2UuCisJICovCisJY3IyID0gcmVhZF9jcjIoKTsKKwlpZiAoKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHRzaykgLSAxIC0gY3IyIDwgUEFHRV9TSVpFKQorCQloYW5kbGVfc3RhY2tfb3ZlcmZsb3coImtlcm5lbCBzdGFjayBvdmVyZmxvdyAoZG91YmxlLWZhdWx0KSIsIHJlZ3MsIGNyMik7CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19ET1VCTEVGQVVMVAogCWRmX2RlYnVnKHJlZ3MsIGVycm9yX2NvZGUpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdHNjLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdHNjLmMKaW5kZXggNzhiOWNiNS4uNDZiMmY0MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RzYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90c2MuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGFzbS94ODZfaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9nZW9kZS5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CisjaW5jbHVkZSA8YXNtL2ludGVsLWZhbWlseS5oPgogCiB1bnNpZ25lZCBpbnQgX19yZWFkX21vc3RseSBjcHVfa2h6OwkvKiBUU0MgY2xvY2tzIC8gdXNlYywgbm90IHVzZWQgaGVyZSAqLwogRVhQT1JUX1NZTUJPTChjcHVfa2h6KTsKQEAgLTY4NiwxMSArNjg3LDE2IEBACiAKIAlpZiAoY3J5c3RhbF9raHogPT0gMCkgewogCQlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsKSB7Ci0JCWNhc2UgMHg0RToJLyogU0tMICovCi0JCWNhc2UgMHg1RToJLyogU0tMICovCisJCWNhc2UgSU5URUxfRkFNNl9TS1lMQUtFX01PQklMRToKKwkJY2FzZSBJTlRFTF9GQU02X1NLWUxBS0VfREVTS1RPUDoKKwkJY2FzZSBJTlRFTF9GQU02X0tBQllMQUtFX01PQklMRToKKwkJY2FzZSBJTlRFTF9GQU02X0tBQllMQUtFX0RFU0tUT1A6CiAJCQljcnlzdGFsX2toeiA9IDI0MDAwOwkvKiAyNC4wIE1IeiAqLwogCQkJYnJlYWs7Ci0JCWNhc2UgMHg1QzoJLyogQlhUICovCisJCWNhc2UgSU5URUxfRkFNNl9TS1lMQUtFX1g6CisJCQljcnlzdGFsX2toeiA9IDI1MDAwOwkvKiAyNS4wIE1IeiAqLworCQkJYnJlYWs7CisJCWNhc2UgSU5URUxfRkFNNl9BVE9NX0dPTERNT05UOgogCQkJY3J5c3RhbF9raHogPSAxOTIwMDsJLyogMTkuMiBNSHogKi8KIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdW53aW5kX2ZyYW1lLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdW53aW5kX2ZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0NTZkNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC91bndpbmRfZnJhbWUuYwpAQCAtMCwwICsxLDkzIEBACisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgorCisjZGVmaW5lIEZSQU1FX0hFQURFUl9TSVpFIChzaXplb2YobG9uZykgKiAyKQorCit1bnNpZ25lZCBsb25nIHVud2luZF9nZXRfcmV0dXJuX2FkZHJlc3Moc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGxvbmcgKmFkZHJfcCA9IHVud2luZF9nZXRfcmV0dXJuX2FkZHJlc3NfcHRyKHN0YXRlKTsKKworCWlmICh1bndpbmRfZG9uZShzdGF0ZSkpCisJCXJldHVybiAwOworCisJYWRkciA9IGZ0cmFjZV9ncmFwaF9yZXRfYWRkcihzdGF0ZS0+dGFzaywgJnN0YXRlLT5ncmFwaF9pZHgsICphZGRyX3AsCisJCQkJICAgICBhZGRyX3ApOworCisJcmV0dXJuIF9fa2VybmVsX3RleHRfYWRkcmVzcyhhZGRyKSA/IGFkZHIgOiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwodW53aW5kX2dldF9yZXR1cm5fYWRkcmVzcyk7CisKK3N0YXRpYyBib29sIHVwZGF0ZV9zdGFja19zdGF0ZShzdHJ1Y3QgdW53aW5kX3N0YXRlICpzdGF0ZSwgdm9pZCAqYWRkciwKKwkJCSAgICAgICBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzdGFja19pbmZvICppbmZvID0gJnN0YXRlLT5zdGFja19pbmZvOworCisJLyoKKwkgKiBJZiBhZGRyIGlzbid0IG9uIHRoZSBjdXJyZW50IHN0YWNrLCBzd2l0Y2ggdG8gdGhlIG5leHQgb25lLgorCSAqCisJICogV2UgbWF5IGhhdmUgdG8gdHJhdmVyc2UgbXVsdGlwbGUgc3RhY2tzIHRvIGRlYWwgd2l0aCB0aGUgcG9zc2liaWxpdHkKKwkgKiB0aGF0ICdpbmZvLT5uZXh0X3NwJyBjb3VsZCBwb2ludCB0byBhbiBlbXB0eSBzdGFjayBhbmQgJ2FkZHInIGNvdWxkCisJICogYmUgb24gYSBzdWJzZXF1ZW50IHN0YWNrLgorCSAqLworCXdoaWxlICghb25fc3RhY2soaW5mbywgYWRkciwgbGVuKSkKKwkJaWYgKGdldF9zdGFja19pbmZvKGluZm8tPm5leHRfc3AsIHN0YXRlLT50YXNrLCBpbmZvLAorCQkJCSAgICZzdGF0ZS0+c3RhY2tfbWFzaykpCisJCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCB1bndpbmRfbmV4dF9mcmFtZShzdHJ1Y3QgdW53aW5kX3N0YXRlICpzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nICpuZXh0X2JwOworCisJaWYgKHVud2luZF9kb25lKHN0YXRlKSkKKwkJcmV0dXJuIGZhbHNlOworCisJbmV4dF9icCA9ICh1bnNpZ25lZCBsb25nICopKnN0YXRlLT5icDsKKworCS8qIG1ha2Ugc3VyZSB0aGUgbmV4dCBmcmFtZSdzIGRhdGEgaXMgYWNjZXNzaWJsZSAqLworCWlmICghdXBkYXRlX3N0YWNrX3N0YXRlKHN0YXRlLCBuZXh0X2JwLCBGUkFNRV9IRUFERVJfU0laRSkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIG1vdmUgdG8gdGhlIG5leHQgZnJhbWUgKi8KKwlzdGF0ZS0+YnAgPSBuZXh0X2JwOworCXJldHVybiB0cnVlOworfQorRVhQT1JUX1NZTUJPTF9HUEwodW53aW5kX25leHRfZnJhbWUpOworCit2b2lkIF9fdW53aW5kX3N0YXJ0KHN0cnVjdCB1bndpbmRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyAqZmlyc3RfZnJhbWUpCit7CisJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2YoKnN0YXRlKSk7CisJc3RhdGUtPnRhc2sgPSB0YXNrOworCisJLyogZG9uJ3QgZXZlbiBhdHRlbXB0IHRvIHN0YXJ0IGZyb20gdXNlciBtb2RlIHJlZ3MgKi8KKwlpZiAocmVncyAmJiB1c2VyX21vZGUocmVncykpIHsKKwkJc3RhdGUtPnN0YWNrX2luZm8udHlwZSA9IFNUQUNLX1RZUEVfVU5LTk9XTjsKKwkJcmV0dXJuOworCX0KKworCS8qIHNldCB1cCB0aGUgc3RhcnRpbmcgc3RhY2sgZnJhbWUgKi8KKwlzdGF0ZS0+YnAgPSBnZXRfZnJhbWVfcG9pbnRlcih0YXNrLCByZWdzKTsKKworCS8qIGluaXRpYWxpemUgc3RhY2sgaW5mbyBhbmQgbWFrZSBzdXJlIHRoZSBmcmFtZSBkYXRhIGlzIGFjY2Vzc2libGUgKi8KKwlnZXRfc3RhY2tfaW5mbyhzdGF0ZS0+YnAsIHN0YXRlLT50YXNrLCAmc3RhdGUtPnN0YWNrX2luZm8sCisJCSAgICAgICAmc3RhdGUtPnN0YWNrX21hc2spOworCXVwZGF0ZV9zdGFja19zdGF0ZShzdGF0ZSwgc3RhdGUtPmJwLCBGUkFNRV9IRUFERVJfU0laRSk7CisKKwkvKgorCSAqIFRoZSBjYWxsZXIgY2FuIHByb3ZpZGUgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGZyYW1lIGRpcmVjdGx5CisJICogKGZpcnN0X2ZyYW1lKSBvciBpbmRpcmVjdGx5IChyZWdzLT5zcCkgdG8gaW5kaWNhdGUgd2hpY2ggc3RhY2sgZnJhbWUKKwkgKiB0byBzdGFydCB1bndpbmRpbmcgYXQuICBTa2lwIGFoZWFkIHVudGlsIHdlIHJlYWNoIGl0LgorCSAqLworCXdoaWxlICghdW53aW5kX2RvbmUoc3RhdGUpICYmCisJICAgICAgICghb25fc3RhY2soJnN0YXRlLT5zdGFja19pbmZvLCBmaXJzdF9mcmFtZSwgc2l6ZW9mKGxvbmcpKSB8fAorCQkJc3RhdGUtPmJwIDwgZmlyc3RfZnJhbWUpKQorCQl1bndpbmRfbmV4dF9mcmFtZShzdGF0ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX3Vud2luZF9zdGFydCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdW53aW5kX2d1ZXNzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdW53aW5kX2d1ZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhODM0YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC91bndpbmRfZ3Vlc3MuYwpAQCAtMCwwICsxLDQzIEBACisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgorCitib29sIHVud2luZF9uZXh0X2ZyYW1lKHN0cnVjdCB1bndpbmRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBzdGFja19pbmZvICppbmZvID0gJnN0YXRlLT5zdGFja19pbmZvOworCisJaWYgKHVud2luZF9kb25lKHN0YXRlKSkKKwkJcmV0dXJuIGZhbHNlOworCisJZG8geworCQlmb3IgKHN0YXRlLT5zcCsrOyBzdGF0ZS0+c3AgPCBpbmZvLT5lbmQ7IHN0YXRlLT5zcCsrKQorCQkJaWYgKF9fa2VybmVsX3RleHRfYWRkcmVzcygqc3RhdGUtPnNwKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKworCQlzdGF0ZS0+c3AgPSBpbmZvLT5uZXh0X3NwOworCisJfSB3aGlsZSAoIWdldF9zdGFja19pbmZvKHN0YXRlLT5zcCwgc3RhdGUtPnRhc2ssIGluZm8sCisJCQkJICZzdGF0ZS0+c3RhY2tfbWFzaykpOworCisJcmV0dXJuIGZhbHNlOworfQorRVhQT1JUX1NZTUJPTF9HUEwodW53aW5kX25leHRfZnJhbWUpOworCit2b2lkIF9fdW53aW5kX3N0YXJ0KHN0cnVjdCB1bndpbmRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyAqZmlyc3RfZnJhbWUpCit7CisJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2YoKnN0YXRlKSk7CisKKwlzdGF0ZS0+dGFzayA9IHRhc2s7CisJc3RhdGUtPnNwICAgPSBmaXJzdF9mcmFtZTsKKworCWdldF9zdGFja19pbmZvKGZpcnN0X2ZyYW1lLCBzdGF0ZS0+dGFzaywgJnN0YXRlLT5zdGFja19pbmZvLAorCQkgICAgICAgJnN0YXRlLT5zdGFja19tYXNrKTsKKworCWlmICghX19rZXJuZWxfdGV4dF9hZGRyZXNzKCpmaXJzdF9mcmFtZSkpCisJCXVud2luZF9uZXh0X2ZyYW1lKHN0YXRlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fdW53aW5kX3N0YXJ0KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC94ODY2NF9rc3ltc182NC5jIGIvYXJjaC94ODYva2VybmVsL3g4NjY0X2tzeW1zXzY0LmMKaW5kZXggOTVlNDlmNi4uYjJjZWUzZDEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC94ODY2NF9rc3ltc182NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC94ODY2NF9rc3ltc182NC5jCkBAIC0zOCw3ICszOCw3IEBACiBFWFBPUlRfU1lNQk9MKF9jb3B5X2Zyb21fdXNlcik7CiBFWFBPUlRfU1lNQk9MKF9jb3B5X3RvX3VzZXIpOwogCi1FWFBPUlRfU1lNQk9MX0dQTChtZW1jcHlfbWNzYWZlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKG1lbWNweV9tY3NhZmVfdW5yb2xsZWQpOwogCiBFWFBPUlRfU1lNQk9MKGNvcHlfcGFnZSk7CiBFWFBPUlRfU1lNQk9MKGNsZWFyX3BhZ2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3g4Nl9pbml0LmMgYi9hcmNoL3g4Ni9rZXJuZWwveDg2X2luaXQuYwppbmRleCA3NmM1ZTUyLi4wYmQ5ZjEyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwveDg2X2luaXQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwveDg2X2luaXQuYwpAQCAtOTEsNyArOTEsNyBAQAogc3RhdGljIHZvaWQgZGVmYXVsdF9ubWlfaW5pdCh2b2lkKSB7IH07CiBzdGF0aWMgaW50IGRlZmF1bHRfaTgwNDJfZGV0ZWN0KHZvaWQpIHsgcmV0dXJuIDE7IH07CiAKLXN0cnVjdCB4ODZfcGxhdGZvcm1fb3BzIHg4Nl9wbGF0Zm9ybSA9IHsKK3N0cnVjdCB4ODZfcGxhdGZvcm1fb3BzIHg4Nl9wbGF0Zm9ybSBfX3JvX2FmdGVyX2luaXQgPSB7CiAJLmNhbGlicmF0ZV9jcHUJCQk9IG5hdGl2ZV9jYWxpYnJhdGVfY3B1LAogCS5jYWxpYnJhdGVfdHNjCQkJPSBuYXRpdmVfY2FsaWJyYXRlX3RzYywKIAkuZ2V0X3dhbGxjbG9jawkJCT0gbWFjaF9nZXRfY21vc190aW1lLApAQCAtMTA4LDcgKzEwOCw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh4ODZfcGxhdGZvcm0pOwogCiAjaWYgZGVmaW5lZChDT05GSUdfUENJX01TSSkKLXN0cnVjdCB4ODZfbXNpX29wcyB4ODZfbXNpID0geworc3RydWN0IHg4Nl9tc2lfb3BzIHg4Nl9tc2kgX19yb19hZnRlcl9pbml0ID0gewogCS5zZXR1cF9tc2lfaXJxcwkJPSBuYXRpdmVfc2V0dXBfbXNpX2lycXMsCiAJLnRlYXJkb3duX21zaV9pcnEJPSBuYXRpdmVfdGVhcmRvd25fbXNpX2lycSwKIAkudGVhcmRvd25fbXNpX2lycXMJPSBkZWZhdWx0X3RlYXJkb3duX21zaV9pcnFzLApAQCAtMTM3LDcgKzEzNyw3IEBACiB9CiAjZW5kaWYKIAotc3RydWN0IHg4Nl9pb19hcGljX29wcyB4ODZfaW9fYXBpY19vcHMgPSB7CitzdHJ1Y3QgeDg2X2lvX2FwaWNfb3BzIHg4Nl9pb19hcGljX29wcyBfX3JvX2FmdGVyX2luaXQgPSB7CiAJLnJlYWQJCQk9IG5hdGl2ZV9pb19hcGljX3JlYWQsCiAJLmRpc2FibGUJCT0gbmF0aXZlX2Rpc2FibGVfaW9fYXBpYywKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vaW9hcGljLmMgYi9hcmNoL3g4Ni9rdm0vaW9hcGljLmMKaW5kZXggNWY0MmQwMy4uYzcyMjBiYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2lvYXBpYy5jCisrKyBiL2FyY2gveDg2L2t2bS9pb2FwaWMuYwpAQCAtMTA5LDYgKzEwOSw3IEBACiB7CiAJYm9vbCBuZXdfdmFsLCBvbGRfdmFsOwogCXN0cnVjdCBrdm1faW9hcGljICppb2FwaWMgPSB2Y3B1LT5rdm0tPmFyY2gudmlvYXBpYzsKKwlzdHJ1Y3QgZGVzdF9tYXAgKmRlc3RfbWFwID0gJmlvYXBpYy0+cnRjX3N0YXR1cy5kZXN0X21hcDsKIAl1bmlvbiBrdm1faW9hcGljX3JlZGlyZWN0X2VudHJ5ICplOwogCiAJZSA9ICZpb2FwaWMtPnJlZGlydGJsW1JUQ19HU0ldOwpAQCAtMTE3LDE2ICsxMTgsMTcgQEAKIAkJcmV0dXJuOwogCiAJbmV3X3ZhbCA9IGt2bV9hcGljX3BlbmRpbmdfZW9pKHZjcHUsIGUtPmZpZWxkcy52ZWN0b3IpOwotCW9sZF92YWwgPSB0ZXN0X2JpdCh2Y3B1LT52Y3B1X2lkLCBpb2FwaWMtPnJ0Y19zdGF0dXMuZGVzdF9tYXAubWFwKTsKKwlvbGRfdmFsID0gdGVzdF9iaXQodmNwdS0+dmNwdV9pZCwgZGVzdF9tYXAtPm1hcCk7CiAKIAlpZiAobmV3X3ZhbCA9PSBvbGRfdmFsKQogCQlyZXR1cm47CiAKIAlpZiAobmV3X3ZhbCkgewotCQlfX3NldF9iaXQodmNwdS0+dmNwdV9pZCwgaW9hcGljLT5ydGNfc3RhdHVzLmRlc3RfbWFwLm1hcCk7CisJCV9fc2V0X2JpdCh2Y3B1LT52Y3B1X2lkLCBkZXN0X21hcC0+bWFwKTsKKwkJZGVzdF9tYXAtPnZlY3RvcnNbdmNwdS0+dmNwdV9pZF0gPSBlLT5maWVsZHMudmVjdG9yOwogCQlpb2FwaWMtPnJ0Y19zdGF0dXMucGVuZGluZ19lb2krKzsKIAl9IGVsc2UgewotCQlfX2NsZWFyX2JpdCh2Y3B1LT52Y3B1X2lkLCBpb2FwaWMtPnJ0Y19zdGF0dXMuZGVzdF9tYXAubWFwKTsKKwkJX19jbGVhcl9iaXQodmNwdS0+dmNwdV9pZCwgZGVzdF9tYXAtPm1hcCk7CiAJCWlvYXBpYy0+cnRjX3N0YXR1cy5wZW5kaW5nX2VvaS0tOwogCQlydGNfc3RhdHVzX3BlbmRpbmdfZW9pX2NoZWNrX3ZhbGlkKGlvYXBpYyk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3BtdV9hbWQuYyBiL2FyY2gveDg2L2t2bS9wbXVfYW1kLmMKaW5kZXggMzliOTExMi4uY2Q5NDQ0MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3BtdV9hbWQuYworKysgYi9hcmNoL3g4Ni9rdm0vcG11X2FtZC5jCkBAIC0yMyw4ICsyMyw4IEBACiBzdGF0aWMgc3RydWN0IGt2bV9ldmVudF9od190eXBlX21hcHBpbmcgYW1kX2V2ZW50X21hcHBpbmdbXSA9IHsKIAlbMF0gPSB7IDB4NzYsIDB4MDAsIFBFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFUyB9LAogCVsxXSA9IHsgMHhjMCwgMHgwMCwgUEVSRl9DT1VOVF9IV19JTlNUUlVDVElPTlMgfSwKLQlbMl0gPSB7IDB4ODAsIDB4MDAsIFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFUyB9LAotCVszXSA9IHsgMHg4MSwgMHgwMCwgUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVMgfSwKKwlbMl0gPSB7IDB4N2QsIDB4MDcsIFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFUyB9LAorCVszXSA9IHsgMHg3ZSwgMHgwNywgUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVMgfSwKIAlbNF0gPSB7IDB4YzIsIDB4MDAsIFBFUkZfQ09VTlRfSFdfQlJBTkNIX0lOU1RSVUNUSU9OUyB9LAogCVs1XSA9IHsgMHhjMywgMHgwMCwgUEVSRl9DT1VOVF9IV19CUkFOQ0hfTUlTU0VTIH0sCiAJWzZdID0geyAweGQwLCAweDAwLCBQRVJGX0NPVU5UX0hXX1NUQUxMRURfQ1lDTEVTX0ZST05URU5EIH0sCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vc3ZtLmMgYi9hcmNoL3g4Ni9rdm0vc3ZtLmMKaW5kZXggYWY1MjNkOC4uMWU2Yjg0YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3N2bS5jCisrKyBiL2FyY2gveDg2L2t2bS9zdm0uYwpAQCAtNDk2MSw3ICs0OTYxLDcgQEAKIAlhdmljX2hhbmRsZV9sZHJfdXBkYXRlKHZjcHUpOwogfQogCi1zdGF0aWMgc3RydWN0IGt2bV94ODZfb3BzIHN2bV94ODZfb3BzID0geworc3RhdGljIHN0cnVjdCBrdm1feDg2X29wcyBzdm1feDg2X29wcyBfX3JvX2FmdGVyX2luaXQgPSB7CiAJLmNwdV9oYXNfa3ZtX3N1cHBvcnQgPSBoYXNfc3ZtLAogCS5kaXNhYmxlZF9ieV9iaW9zID0gaXNfZGlzYWJsZWQsCiAJLmhhcmR3YXJlX3NldHVwID0gc3ZtX2hhcmR3YXJlX3NldHVwLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3ZteC5jIGIvYXJjaC94ODYva3ZtL3ZteC5jCmluZGV4IGE0NWQ4NTguLjEyMWZkZjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS92bXguYworKysgYi9hcmNoL3g4Ni9rdm0vdm14LmMKQEAgLTQyMiw2ICs0MjIsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgdm1jczAyX3Bvb2w7CiAJaW50IHZtY3MwMl9udW07CiAJdTY0IHZtY3MwMV90c2Nfb2Zmc2V0OworCWJvb2wgY2hhbmdlX3ZtY3MwMV92aXJ0dWFsX3gyYXBpY19tb2RlOwogCS8qIEwyIG11c3QgcnVuIG5leHQsIGFuZCBtdXN0bid0IGRlY2lkZSB0byBleGl0IHRvIEwxLiAqLwogCWJvb2wgbmVzdGVkX3J1bl9wZW5kaW5nOwogCS8qCkBAIC00MzUsNiArNDM2LDggQEAKIAlib29sIHBpX3BlbmRpbmc7CiAJdTE2IHBvc3RlZF9pbnRyX252OwogCisJdW5zaWduZWQgbG9uZyAqbXNyX2JpdG1hcDsKKwogCXN0cnVjdCBocnRpbWVyIHByZWVtcHRpb25fdGltZXI7CiAJYm9vbCBwcmVlbXB0aW9uX3RpbWVyX2V4cGlyZWQ7CiAKQEAgLTkyNCw3ICs5MjcsNiBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgKnZteF9tc3JfYml0bWFwX2xvbmdtb2RlOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgKnZteF9tc3JfYml0bWFwX2xlZ2FjeV94MmFwaWM7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyAqdm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgKnZteF9tc3JfYml0bWFwX25lc3RlZDsKIHN0YXRpYyB1bnNpZ25lZCBsb25nICp2bXhfdm1yZWFkX2JpdG1hcDsKIHN0YXRpYyB1bnNpZ25lZCBsb25nICp2bXhfdm13cml0ZV9iaXRtYXA7CiAKQEAgLTIxOTgsNiArMjIwMCwxMiBAQAogCQkJbmV3LmNvbnRyb2wpICE9IG9sZC5jb250cm9sKTsKIH0KIAorc3RhdGljIHZvaWQgZGVjYWNoZV90c2NfbXVsdGlwbGllcihzdHJ1Y3QgdmNwdV92bXggKnZteCkKK3sKKwl2bXgtPmN1cnJlbnRfdHNjX3JhdGlvID0gdm14LT52Y3B1LmFyY2gudHNjX3NjYWxpbmdfcmF0aW87CisJdm1jc193cml0ZTY0KFRTQ19NVUxUSVBMSUVSLCB2bXgtPmN1cnJlbnRfdHNjX3JhdGlvKTsKK30KKwogLyoKICAqIFN3aXRjaGVzIHRvIHNwZWNpZmllZCB2Y3B1LCB1bnRpbCBhIG1hdGNoaW5nIHZjcHVfcHV0KCksIGJ1dCBhc3N1bWVzCiAgKiB2Y3B1IG11dGV4IGlzIGFscmVhZHkgdGFrZW4uCkBAIC0yMjU2LDEwICsyMjY0LDggQEAKIAogCS8qIFNldHVwIFRTQyBtdWx0aXBsaWVyICovCiAJaWYgKGt2bV9oYXNfdHNjX2NvbnRyb2wgJiYKLQkgICAgdm14LT5jdXJyZW50X3RzY19yYXRpbyAhPSB2Y3B1LT5hcmNoLnRzY19zY2FsaW5nX3JhdGlvKSB7Ci0JCXZteC0+Y3VycmVudF90c2NfcmF0aW8gPSB2Y3B1LT5hcmNoLnRzY19zY2FsaW5nX3JhdGlvOwotCQl2bWNzX3dyaXRlNjQoVFNDX01VTFRJUExJRVIsIHZteC0+Y3VycmVudF90c2NfcmF0aW8pOwotCX0KKwkgICAgdm14LT5jdXJyZW50X3RzY19yYXRpbyAhPSB2Y3B1LT5hcmNoLnRzY19zY2FsaW5nX3JhdGlvKQorCQlkZWNhY2hlX3RzY19tdWx0aXBsaWVyKHZteCk7CiAKIAl2bXhfdmNwdV9waV9sb2FkKHZjcHUsIGNwdSk7CiAJdm14LT5ob3N0X3BrcnUgPSByZWFkX3BrcnUoKTsKQEAgLTI1MDgsNyArMjUxNCw3IEBACiAJdW5zaWduZWQgbG9uZyAqbXNyX2JpdG1hcDsKIAogCWlmIChpc19ndWVzdF9tb2RlKHZjcHUpKQotCQltc3JfYml0bWFwID0gdm14X21zcl9iaXRtYXBfbmVzdGVkOworCQltc3JfYml0bWFwID0gdG9fdm14KHZjcHUpLT5uZXN0ZWQubXNyX2JpdG1hcDsKIAllbHNlIGlmIChjcHVfaGFzX3NlY29uZGFyeV9leGVjX2N0cmxzKCkgJiYKIAkJICh2bWNzX3JlYWQzMihTRUNPTkRBUllfVk1fRVhFQ19DT05UUk9MKSAmCiAJCSAgU0VDT05EQVJZX0VYRUNfVklSVFVBTElaRV9YMkFQSUNfTU9ERSkpIHsKQEAgLTYzNjMsMTMgKzYzNjksNiBAQAogCWlmICghdm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljKQogCQlnb3RvIG91dDQ7CiAKLQlpZiAobmVzdGVkKSB7Ci0JCXZteF9tc3JfYml0bWFwX25lc3RlZCA9Ci0JCQkodW5zaWduZWQgbG9uZyAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKLQkJaWYgKCF2bXhfbXNyX2JpdG1hcF9uZXN0ZWQpCi0JCQlnb3RvIG91dDU7Ci0JfQotCiAJdm14X3ZtcmVhZF9iaXRtYXAgPSAodW5zaWduZWQgbG9uZyAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIXZteF92bXJlYWRfYml0bWFwKQogCQlnb3RvIG91dDY7CkBAIC02MzkyLDggKzYzOTEsNiBAQAogCiAJbWVtc2V0KHZteF9tc3JfYml0bWFwX2xlZ2FjeSwgMHhmZiwgUEFHRV9TSVpFKTsKIAltZW1zZXQodm14X21zcl9iaXRtYXBfbG9uZ21vZGUsIDB4ZmYsIFBBR0VfU0laRSk7Ci0JaWYgKG5lc3RlZCkKLQkJbWVtc2V0KHZteF9tc3JfYml0bWFwX25lc3RlZCwgMHhmZiwgUEFHRV9TSVpFKTsKIAogCWlmIChzZXR1cF92bWNzX2NvbmZpZygmdm1jc19jb25maWcpIDwgMCkgewogCQlyID0gLUVJTzsKQEAgLTY1MjksOSArNjUyNiw2IEBACiBvdXQ3OgogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2bXhfdm1yZWFkX2JpdG1hcCk7CiBvdXQ2OgotCWlmIChuZXN0ZWQpCi0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2bXhfbXNyX2JpdG1hcF9uZXN0ZWQpOwotb3V0NToKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljKTsKIG91dDQ6CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF9tc3JfYml0bWFwX2xvbmdtb2RlKTsKQEAgLTY1NTcsOCArNjU1MSw2IEBACiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF9pb19iaXRtYXBfYSk7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF92bXdyaXRlX2JpdG1hcCk7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF92bXJlYWRfYml0bWFwKTsKLQlpZiAobmVzdGVkKQotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdm14X21zcl9iaXRtYXBfbmVzdGVkKTsKIAogCWZyZWVfa3ZtX2FyZWEoKTsKIH0KQEAgLTY5OTUsMTYgKzY5ODcsMjEgQEAKIAkJcmV0dXJuIDE7CiAJfQogCisJaWYgKGNwdV9oYXNfdm14X21zcl9iaXRtYXAoKSkgeworCQl2bXgtPm5lc3RlZC5tc3JfYml0bWFwID0KKwkJCQkodW5zaWduZWQgbG9uZyAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCF2bXgtPm5lc3RlZC5tc3JfYml0bWFwKQorCQkJZ290byBvdXRfbXNyX2JpdG1hcDsKKwl9CisKIAl2bXgtPm5lc3RlZC5jYWNoZWRfdm1jczEyID0ga21hbGxvYyhWTUNTMTJfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2bXgtPm5lc3RlZC5jYWNoZWRfdm1jczEyKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBvdXRfY2FjaGVkX3ZtY3MxMjsKIAogCWlmIChlbmFibGVfc2hhZG93X3ZtY3MpIHsKIAkJc2hhZG93X3ZtY3MgPSBhbGxvY192bWNzKCk7Ci0JCWlmICghc2hhZG93X3ZtY3MpIHsKLQkJCWtmcmVlKHZteC0+bmVzdGVkLmNhY2hlZF92bWNzMTIpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KKwkJaWYgKCFzaGFkb3dfdm1jcykKKwkJCWdvdG8gb3V0X3NoYWRvd192bWNzOwogCQkvKiBtYXJrIHZtY3MgYXMgc2hhZG93ICovCiAJCXNoYWRvd192bWNzLT5yZXZpc2lvbl9pZCB8PSAoMXUgPDwgMzEpOwogCQkvKiBpbml0IHNoYWRvdyB2bWNzICovCkBAIC03MDI0LDYgKzcwMjEsMTUgQEAKIAlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOwogCW5lc3RlZF92bXhfc3VjY2VlZCh2Y3B1KTsKIAlyZXR1cm4gMTsKKworb3V0X3NoYWRvd192bWNzOgorCWtmcmVlKHZteC0+bmVzdGVkLmNhY2hlZF92bWNzMTIpOworCitvdXRfY2FjaGVkX3ZtY3MxMjoKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdm14LT5uZXN0ZWQubXNyX2JpdG1hcCk7CisKK291dF9tc3JfYml0bWFwOgorCXJldHVybiAtRU5PTUVNOwogfQogCiAvKgpAQCAtNzA5OCw2ICs3MTA0LDEwIEBACiAJdm14LT5uZXN0ZWQudm14b24gPSBmYWxzZTsKIAlmcmVlX3ZwaWQodm14LT5uZXN0ZWQudnBpZDAyKTsKIAluZXN0ZWRfcmVsZWFzZV92bWNzMTIodm14KTsKKwlpZiAodm14LT5uZXN0ZWQubXNyX2JpdG1hcCkgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdm14LT5uZXN0ZWQubXNyX2JpdG1hcCk7CisJCXZteC0+bmVzdGVkLm1zcl9iaXRtYXAgPSBOVUxMOworCX0KIAlpZiAoZW5hYmxlX3NoYWRvd192bWNzKQogCQlmcmVlX3ZtY3Modm14LT5uZXN0ZWQuY3VycmVudF9zaGFkb3dfdm1jcyk7CiAJa2ZyZWUodm14LT5uZXN0ZWQuY2FjaGVkX3ZtY3MxMik7CkBAIC04NDE5LDYgKzg0MjksMTIgQEAKIHsKIAl1MzIgc2VjX2V4ZWNfY29udHJvbDsKIAorCS8qIFBvc3Rwb25lIGV4ZWN1dGlvbiB1bnRpbCB2bWNzMDEgaXMgdGhlIGN1cnJlbnQgVk1DUy4gKi8KKwlpZiAoaXNfZ3Vlc3RfbW9kZSh2Y3B1KSkgeworCQl0b192bXgodmNwdSktPm5lc3RlZC5jaGFuZ2Vfdm1jczAxX3ZpcnR1YWxfeDJhcGljX21vZGUgPSB0cnVlOworCQlyZXR1cm47CisJfQorCiAJLyoKIAkgKiBUaGVyZSBpcyBub3QgcG9pbnQgdG8gZW5hYmxlIHZpcnR1YWxpemUgeDJhcGljIHdpdGhvdXQgZW5hYmxlCiAJICogYXBpY3YKQEAgLTk0NzIsOCArOTQ4OCwxMCBAQAogewogCWludCBtc3I7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgbG9uZyAqbXNyX2JpdG1hcDsKKwl1bnNpZ25lZCBsb25nICptc3JfYml0bWFwX2wxOworCXVuc2lnbmVkIGxvbmcgKm1zcl9iaXRtYXBfbDAgPSB0b192bXgodmNwdSktPm5lc3RlZC5tc3JfYml0bWFwOwogCisJLyogVGhpcyBzaG9ydGN1dCBpcyBvayBiZWNhdXNlIHdlIHN1cHBvcnQgb25seSB4MkFQSUMgTVNScyBzbyBmYXIuICovCiAJaWYgKCFuZXN0ZWRfY3B1X2hhc192aXJ0X3gyYXBpY19tb2RlKHZtY3MxMikpCiAJCXJldHVybiBmYWxzZTsKIApAQCAtOTQ4Miw2MyArOTUwMCwzNyBAQAogCQlXQVJOX09OKDEpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQotCW1zcl9iaXRtYXAgPSAodW5zaWduZWQgbG9uZyAqKWttYXAocGFnZSk7Ci0JaWYgKCFtc3JfYml0bWFwKSB7CisJbXNyX2JpdG1hcF9sMSA9ICh1bnNpZ25lZCBsb25nICopa21hcChwYWdlKTsKKwlpZiAoIW1zcl9iaXRtYXBfbDEpIHsKIAkJbmVzdGVkX3JlbGVhc2VfcGFnZV9jbGVhbihwYWdlKTsKIAkJV0FSTl9PTigxKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAorCW1lbXNldChtc3JfYml0bWFwX2wwLCAweGZmLCBQQUdFX1NJWkUpOworCiAJaWYgKG5lc3RlZF9jcHVfaGFzX3ZpcnRfeDJhcGljX21vZGUodm1jczEyKSkgewogCQlpZiAobmVzdGVkX2NwdV9oYXNfYXBpY19yZWdfdmlydCh2bWNzMTIpKQogCQkJZm9yIChtc3IgPSAweDgwMDsgbXNyIDw9IDB4OGZmOyBtc3IrKykKIAkJCQluZXN0ZWRfdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3IoCi0JCQkJCW1zcl9iaXRtYXAsCi0JCQkJCXZteF9tc3JfYml0bWFwX25lc3RlZCwKKwkJCQkJbXNyX2JpdG1hcF9sMSwgbXNyX2JpdG1hcF9sMCwKIAkJCQkJbXNyLCBNU1JfVFlQRV9SKTsKLQkJLyogVFBSIGlzIGFsbG93ZWQgKi8KLQkJbmVzdGVkX3ZteF9kaXNhYmxlX2ludGVyY2VwdF9mb3JfbXNyKG1zcl9iaXRtYXAsCi0JCQkJdm14X21zcl9iaXRtYXBfbmVzdGVkLAorCisJCW5lc3RlZF92bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcigKKwkJCQltc3JfYml0bWFwX2wxLCBtc3JfYml0bWFwX2wwLAogCQkJCUFQSUNfQkFTRV9NU1IgKyAoQVBJQ19UQVNLUFJJID4+IDQpLAogCQkJCU1TUl9UWVBFX1IgfCBNU1JfVFlQRV9XKTsKKwogCQlpZiAobmVzdGVkX2NwdV9oYXNfdmlkKHZtY3MxMikpIHsKLQkJCS8qIEVPSSBhbmQgc2VsZi1JUEkgYXJlIGFsbG93ZWQgKi8KIAkJCW5lc3RlZF92bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcigKLQkJCQltc3JfYml0bWFwLAotCQkJCXZteF9tc3JfYml0bWFwX25lc3RlZCwKKwkJCQltc3JfYml0bWFwX2wxLCBtc3JfYml0bWFwX2wwLAogCQkJCUFQSUNfQkFTRV9NU1IgKyAoQVBJQ19FT0kgPj4gNCksCiAJCQkJTVNSX1RZUEVfVyk7CiAJCQluZXN0ZWRfdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3IoCi0JCQkJbXNyX2JpdG1hcCwKLQkJCQl2bXhfbXNyX2JpdG1hcF9uZXN0ZWQsCisJCQkJbXNyX2JpdG1hcF9sMSwgbXNyX2JpdG1hcF9sMCwKIAkJCQlBUElDX0JBU0VfTVNSICsgKEFQSUNfU0VMRl9JUEkgPj4gNCksCiAJCQkJTVNSX1RZUEVfVyk7CiAJCX0KLQl9IGVsc2UgewotCQkvKgotCQkgKiBFbmFibGUgcmVhZGluZyBpbnRlcmNlcHQgb2YgYWxsIHRoZSB4MmFwaWMKLQkJICogTVNScy4gV2Ugc2hvdWxkIG5vdCByZWx5IG9uIHZtY3MxMiB0byBkbyBhbnkKLQkJICogb3B0aW1pemF0aW9ucyBoZXJlLCBpdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkCi0JCSAqIGJ5IEwxLgotCQkgKi8KLQkJZm9yIChtc3IgPSAweDgwMDsgbXNyIDw9IDB4OGZmOyBtc3IrKykKLQkJCV9fdm14X2VuYWJsZV9pbnRlcmNlcHRfZm9yX21zcigKLQkJCQl2bXhfbXNyX2JpdG1hcF9uZXN0ZWQsCi0JCQkJbXNyLAotCQkJCU1TUl9UWVBFX1IpOwotCi0JCV9fdm14X2VuYWJsZV9pbnRlcmNlcHRfZm9yX21zcigKLQkJCQl2bXhfbXNyX2JpdG1hcF9uZXN0ZWQsCi0JCQkJQVBJQ19CQVNFX01TUiArIChBUElDX1RBU0tQUkkgPj4gNCksCi0JCQkJTVNSX1RZUEVfVyk7Ci0JCV9fdm14X2VuYWJsZV9pbnRlcmNlcHRfZm9yX21zcigKLQkJCQl2bXhfbXNyX2JpdG1hcF9uZXN0ZWQsCi0JCQkJQVBJQ19CQVNFX01TUiArIChBUElDX0VPSSA+PiA0KSwKLQkJCQlNU1JfVFlQRV9XKTsKLQkJX192bXhfZW5hYmxlX2ludGVyY2VwdF9mb3JfbXNyKAotCQkJCXZteF9tc3JfYml0bWFwX25lc3RlZCwKLQkJCQlBUElDX0JBU0VfTVNSICsgKEFQSUNfU0VMRl9JUEkgPj4gNCksCi0JCQkJTVNSX1RZUEVfVyk7CiAJfQogCWt1bm1hcChwYWdlKTsKIAluZXN0ZWRfcmVsZWFzZV9wYWdlX2NsZWFuKHBhZ2UpOwpAQCAtOTk1NywxMCArOTk0OSwxMCBAQAogCX0KIAogCWlmIChjcHVfaGFzX3ZteF9tc3JfYml0bWFwKCkgJiYKLQkgICAgZXhlY19jb250cm9sICYgQ1BVX0JBU0VEX1VTRV9NU1JfQklUTUFQUykgewotCQluZXN0ZWRfdm14X21lcmdlX21zcl9iaXRtYXAodmNwdSwgdm1jczEyKTsKLQkJLyogTVNSX0JJVE1BUCB3aWxsIGJlIHNldCBieSBmb2xsb3dpbmcgdm14X3NldF9lZmVyLiAqLwotCX0gZWxzZQorCSAgICBleGVjX2NvbnRyb2wgJiBDUFVfQkFTRURfVVNFX01TUl9CSVRNQVBTICYmCisJICAgIG5lc3RlZF92bXhfbWVyZ2VfbXNyX2JpdG1hcCh2Y3B1LCB2bWNzMTIpKQorCQk7IC8qIE1TUl9CSVRNQVAgd2lsbCBiZSBzZXQgYnkgZm9sbG93aW5nIHZteF9zZXRfZWZlci4gKi8KKwllbHNlCiAJCWV4ZWNfY29udHJvbCAmPSB+Q1BVX0JBU0VEX1VTRV9NU1JfQklUTUFQUzsKIAogCS8qCkBAIC0xMDAxMSw2ICsxMDAwMyw4IEBACiAJCQl2bXgtPm5lc3RlZC52bWNzMDFfdHNjX29mZnNldCArIHZtY3MxMi0+dHNjX29mZnNldCk7CiAJZWxzZQogCQl2bWNzX3dyaXRlNjQoVFNDX09GRlNFVCwgdm14LT5uZXN0ZWQudm1jczAxX3RzY19vZmZzZXQpOworCWlmIChrdm1faGFzX3RzY19jb250cm9sKQorCQlkZWNhY2hlX3RzY19tdWx0aXBsaWVyKHZteCk7CiAKIAlpZiAoZW5hYmxlX3ZwaWQpIHsKIAkJLyoKQEAgLTEwNzY3LDYgKzEwNzYxLDE0IEBACiAJZWxzZQogCQl2bWNzX3NldF9iaXRzKFBJTl9CQVNFRF9WTV9FWEVDX0NPTlRST0wsCiAJCQkgICAgICBQSU5fQkFTRURfVk1YX1BSRUVNUFRJT05fVElNRVIpOworCWlmIChrdm1faGFzX3RzY19jb250cm9sKQorCQlkZWNhY2hlX3RzY19tdWx0aXBsaWVyKHZteCk7CisKKwlpZiAodm14LT5uZXN0ZWQuY2hhbmdlX3ZtY3MwMV92aXJ0dWFsX3gyYXBpY19tb2RlKSB7CisJCXZteC0+bmVzdGVkLmNoYW5nZV92bWNzMDFfdmlydHVhbF94MmFwaWNfbW9kZSA9IGZhbHNlOworCQl2bXhfc2V0X3ZpcnR1YWxfeDJhcGljX21vZGUodmNwdSwKKwkJCQl2Y3B1LT5hcmNoLmFwaWNfYmFzZSAmIFgyQVBJQ19FTkFCTEUpOworCX0KIAogCS8qIFRoaXMgaXMgbmVlZGVkIGZvciBzYW1lIHJlYXNvbiBhcyBpdCB3YXMgbmVlZGVkIGluIHByZXBhcmVfdm1jczAyICovCiAJdm14LT5ob3N0X3JzcCA9IDA7CkBAIC0xMTE3NSw3ICsxMTE3Nyw3IEBACiAJCQl+RkVBVFVSRV9DT05UUk9MX0xNQ0U7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qga3ZtX3g4Nl9vcHMgdm14X3g4Nl9vcHMgPSB7CitzdGF0aWMgc3RydWN0IGt2bV94ODZfb3BzIHZteF94ODZfb3BzIF9fcm9fYWZ0ZXJfaW5pdCA9IHsKIAkuY3B1X2hhc19rdm1fc3VwcG9ydCA9IGNwdV9oYXNfa3ZtX3N1cHBvcnQsCiAJLmRpc2FibGVkX2J5X2Jpb3MgPSB2bXhfZGlzYWJsZWRfYnlfYmlvcywKIAkuaGFyZHdhcmVfc2V0dXAgPSBoYXJkd2FyZV9zZXR1cCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS94ODYuYyBiL2FyY2gveDg2L2t2bS94ODYuYwppbmRleCAxOWY5ZjllLi42OTlmODcyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0veDg2LmMKKysrIGIvYXJjaC94ODYva3ZtL3g4Ni5jCkBAIC0yNzQzLDE2ICsyNzQzLDE2IEBACiAJCWlmICh0c2NfZGVsdGEgPCAwKQogCQkJbWFya190c2NfdW5zdGFibGUoIktWTSBkaXNjb3ZlcmVkIGJhY2t3YXJkcyBUU0MiKTsKIAotCQlpZiAoa3ZtX2xhcGljX2h2X3RpbWVyX2luX3VzZSh2Y3B1KSAmJgotCQkJCWt2bV94ODZfb3BzLT5zZXRfaHZfdGltZXIodmNwdSwKLQkJCQkJa3ZtX2dldF9sYXBpY190c2NkZWFkbGluZV9tc3IodmNwdSkpKQotCQkJa3ZtX2xhcGljX3N3aXRjaF90b19zd190aW1lcih2Y3B1KTsKIAkJaWYgKGNoZWNrX3RzY191bnN0YWJsZSgpKSB7CiAJCQl1NjQgb2Zmc2V0ID0ga3ZtX2NvbXB1dGVfdHNjX29mZnNldCh2Y3B1LAogCQkJCQkJdmNwdS0+YXJjaC5sYXN0X2d1ZXN0X3RzYyk7CiAJCQlrdm1feDg2X29wcy0+d3JpdGVfdHNjX29mZnNldCh2Y3B1LCBvZmZzZXQpOwogCQkJdmNwdS0+YXJjaC50c2NfY2F0Y2h1cCA9IDE7CiAJCX0KKwkJaWYgKGt2bV9sYXBpY19odl90aW1lcl9pbl91c2UodmNwdSkgJiYKKwkJCQlrdm1feDg2X29wcy0+c2V0X2h2X3RpbWVyKHZjcHUsCisJCQkJCWt2bV9nZXRfbGFwaWNfdHNjZGVhZGxpbmVfbXNyKHZjcHUpKSkKKwkJCWt2bV9sYXBpY19zd2l0Y2hfdG9fc3dfdGltZXIodmNwdSk7CiAJCS8qCiAJCSAqIE9uIGEgaG9zdCB3aXRoIHN5bmNocm9uaXplZCBUU0MsIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXBkYXRlCiAJCSAqIGt2bWNsb2NrIG9uIHZjcHUtPmNwdSBtaWdyYXRpb24KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi9tZW1jcHlfNjQuUyBiL2FyY2gveDg2L2xpYi9tZW1jcHlfNjQuUwppbmRleCAyZWMwYjBhYmIuLjQ5ZTZlYmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xpYi9tZW1jcHlfNjQuUworKysgYi9hcmNoL3g4Ni9saWIvbWVtY3B5XzY0LlMKQEAgLTE4MSwxMSArMTgxLDExIEBACiAKICNpZm5kZWYgQ09ORklHX1VNTAogLyoKLSAqIG1lbWNweV9tY3NhZmUgLSBtZW1vcnkgY29weSB3aXRoIG1hY2hpbmUgY2hlY2sgZXhjZXB0aW9uIGhhbmRsaW5nCisgKiBtZW1jcHlfbWNzYWZlX3Vucm9sbGVkIC0gbWVtb3J5IGNvcHkgd2l0aCBtYWNoaW5lIGNoZWNrIGV4Y2VwdGlvbiBoYW5kbGluZwogICogTm90ZSB0aGF0IHdlIG9ubHkgY2F0Y2ggbWFjaGluZSBjaGVja3Mgd2hlbiByZWFkaW5nIHRoZSBzb3VyY2UgYWRkcmVzc2VzLgogICogV3JpdGVzIHRvIHRhcmdldCBhcmUgcG9zdGVkIGFuZCBkb24ndCBnZW5lcmF0ZSBtYWNoaW5lIGNoZWNrcy4KICAqLwotRU5UUlkobWVtY3B5X21jc2FmZSkKK0VOVFJZKG1lbWNweV9tY3NhZmVfdW5yb2xsZWQpCiAJY21wbCAkOCwgJWVkeAogCS8qIExlc3MgdGhhbiA4IGJ5dGVzPyBHbyB0byBieXRlIGNvcHkgbG9vcCAqLwogCWpiIC5MX25vX3dob2xlX3dvcmRzCkBAIC0yNzMsNyArMjczLDcgQEAKIC5MX2RvbmVfbWVtY3B5X3RyYXA6CiAJeG9ycSAlcmF4LCAlcmF4CiAJcmV0Ci1FTkRQUk9DKG1lbWNweV9tY3NhZmUpCitFTkRQUk9DKG1lbWNweV9tY3NhZmVfdW5yb2xsZWQpCiAKIAkuc2VjdGlvbiAuZml4dXAsICJheCIKIAkvKiBSZXR1cm4gLUVGQVVMVCBmb3IgYW55IGZhaWx1cmUgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2FtZHRvcG9sb2d5LmMgYi9hcmNoL3g4Ni9tbS9hbWR0b3BvbG9neS5jCmluZGV4IGJhNDc1MjQuLmQxYzdkZTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2FtZHRvcG9sb2d5LmMKKysrIGIvYXJjaC94ODYvbW0vYW1kdG9wb2xvZ3kuYwpAQCAtNTIsMjEgKzUyLDYgQEAKIAlyZXR1cm4gLUVOT0VOVDsKIH0KIAotc3RhdGljIF9faW5pdCB2b2lkIGVhcmx5X2dldF9ib290X2NwdV9pZCh2b2lkKQotewotCS8qCi0JICogbmVlZCB0byBnZXQgdGhlIEFQSUMgSUQgb2YgdGhlIEJTUCBzbyBjYW4gdXNlIHRoYXQgdG8KLQkgKiBjcmVhdGUgYXBpY2lkX3RvX25vZGUgaW4gYW1kX3NjYW5fbm9kZXMoKQotCSAqLwotI2lmZGVmIENPTkZJR19YODZfTVBQQVJTRQotCS8qCi0JICogZ2V0IGJvb3QtdGltZSBTTVAgY29uZmlndXJhdGlvbjoKLQkgKi8KLQlpZiAoc21wX2ZvdW5kX2NvbmZpZykKLQkJZWFybHlfZ2V0X3NtcF9jb25maWcoKTsKLSNlbmRpZgotfQotCiBpbnQgX19pbml0IGFtZF9udW1hX2luaXQodm9pZCkKIHsKIAl1NjQgc3RhcnQgPSBQRk5fUEhZUygwKTsKQEAgLTE4MCw4ICsxNjUsMTEgQEAKIAljb3JlcyA9IDEgPDwgYml0czsKIAlhcGljaWRfYmFzZSA9IDA7CiAKLQkvKiBnZXQgdGhlIEFQSUMgSUQgb2YgdGhlIEJTUCBlYXJseSBmb3Igc3lzdGVtcyB3aXRoIGFwaWNpZCBsaWZ0aW5nICovCi0JZWFybHlfZ2V0X2Jvb3RfY3B1X2lkKCk7CisJLyoKKwkgKiBnZXQgYm9vdC10aW1lIFNNUCBjb25maWd1cmF0aW9uOgorCSAqLworCWVhcmx5X2dldF9zbXBfY29uZmlnKCk7CisKIAlpZiAoYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID4gMCkgewogCQlwcl9pbmZvKCJCU1AgQVBJQyBJRDogJTAyeFxuIiwgYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKTsKIAkJYXBpY2lkX2Jhc2UgPSBib290X2NwdV9waHlzaWNhbF9hcGljaWQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9leHRhYmxlLmMgYi9hcmNoL3g4Ni9tbS9leHRhYmxlLmMKaW5kZXggODMyYjk4Zi4uNzlhZTkzOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vZXh0YWJsZS5jCisrKyBiL2FyY2gveDg2L21tL2V4dGFibGUuYwpAQCAtMSw0ICsxLDQgQEAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KICNpbmNsdWRlIDxhc20va2RlYnVnLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9mYXVsdC5jIGIvYXJjaC94ODYvbW0vZmF1bHQuYwppbmRleCBkYzgwMjMwLi4xZTUyNTEyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9mYXVsdC5jCisrKyBiL2FyY2gveDg2L21tL2ZhdWx0LmMKQEAgLTUsNyArNSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkJLyogdGVzdF90aHJlYWRfZmxhZygpLCAuLi4JKi8KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4JCS8qIG9vcHNfYmVnaW4vZW5kLCAuLi4JCSovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CQkvKiBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlCSovCisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgkJLyogc2VhcmNoX2V4Y2VwdGlvbl90YWJsZQkqLwogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4JCS8qIG1heF9sb3dfcGZuCQkJKi8KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CQkvKiBOT0tQUk9CRV9TWU1CT0wsIC4uLgkJKi8KICNpbmNsdWRlIDxsaW51eC9tbWlvdHJhY2UuaD4JCS8qIGttbWlvX2hhbmRsZXIsIC4uLgkJKi8KQEAgLTc1Myw2ICs3NTMsMzggQEAKIAkJcmV0dXJuOwogCX0KIAorI2lmZGVmIENPTkZJR19WTUFQX1NUQUNLCisJLyoKKwkgKiBTdGFjayBvdmVyZmxvdz8gIER1cmluZyBib290LCB3ZSBjYW4gZmF1bHQgbmVhciB0aGUgaW5pdGlhbAorCSAqIHN0YWNrIGluIHRoZSBkaXJlY3QgbWFwLCBidXQgdGhhdCdzIG5vdCBhbiBvdmVyZmxvdyAtLSBjaGVjaworCSAqIHRoYXQgd2UncmUgaW4gdm1hbGxvYyBzcGFjZSB0byBhdm9pZCB0aGlzLgorCSAqLworCWlmIChpc192bWFsbG9jX2FkZHIoKHZvaWQgKilhZGRyZXNzKSAmJgorCSAgICAoKCh1bnNpZ25lZCBsb25nKXRzay0+c3RhY2sgLSAxIC0gYWRkcmVzcyA8IFBBR0VfU0laRSkgfHwKKwkgICAgIGFkZHJlc3MgLSAoKHVuc2lnbmVkIGxvbmcpdHNrLT5zdGFjayArIFRIUkVBRF9TSVpFKSA8IFBBR0VfU0laRSkpIHsKKwkJcmVnaXN0ZXIgdm9pZCAqX19zcCBhc20oInJzcCIpOworCQl1bnNpZ25lZCBsb25nIHN0YWNrID0gdGhpc19jcHVfcmVhZChvcmlnX2lzdC5pc3RbRE9VQkxFRkFVTFRfU1RBQ0tdKSAtIHNpemVvZih2b2lkICopOworCQkvKgorCQkgKiBXZSdyZSBsaWtlbHkgdG8gYmUgcnVubmluZyB3aXRoIHZlcnkgbGl0dGxlIHN0YWNrIHNwYWNlCisJCSAqIGxlZnQuICBJdCdzIHBsYXVzaWJsZSB0aGF0IHdlJ2QgaGl0IHRoaXMgY29uZGl0aW9uIGJ1dAorCQkgKiBkb3VibGUtZmF1bHQgZXZlbiBiZWZvcmUgd2UgZ2V0IHRoaXMgZmFyLCBpbiB3aGljaCBjYXNlCisJCSAqIHdlJ3JlIGZpbmU6IHRoZSBkb3VibGUtZmF1bHQgaGFuZGxlciB3aWxsIGRlYWwgd2l0aCBpdC4KKwkJICoKKwkJICogV2UgZG9uJ3Qgd2FudCB0byBtYWtlIGl0IGFsbCB0aGUgd2F5IGludG8gdGhlIG9vcHMgY29kZQorCQkgKiBhbmQgdGhlbiBkb3VibGUtZmF1bHQsIHRob3VnaCwgYmVjYXVzZSB3ZSdyZSBsaWtlbHkgdG8KKwkJICogYnJlYWsgdGhlIGNvbnNvbGUgZHJpdmVyIGFuZCBsb3NlIG1vc3Qgb2YgdGhlIHN0YWNrIGR1bXAuCisJCSAqLworCQlhc20gdm9sYXRpbGUgKCJtb3ZxICVbc3RhY2tdLCAlJXJzcFxuXHQiCisJCQkgICAgICAiY2FsbCBoYW5kbGVfc3RhY2tfb3ZlcmZsb3dcblx0IgorCQkJICAgICAgIjE6IGptcCAxYiIKKwkJCSAgICAgIDogIityIiAoX19zcCkKKwkJCSAgICAgIDogIkQiICgia2VybmVsIHN0YWNrIG92ZXJmbG93IChwYWdlIGZhdWx0KSIpLAorCQkJCSJTIiAocmVncyksICJkIiAoYWRkcmVzcyksCisJCQkJW3N0YWNrXSAicm0iIChzdGFjaykpOworCQl1bnJlYWNoYWJsZSgpOworCX0KKyNlbmRpZgorCiAJLyoKIAkgKiAzMi1iaXQ6CiAJICoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2luaXQuYyBiL2FyY2gveDg2L21tL2luaXQuYwppbmRleCBkMjhhMmQ3Li4yMmFmOTEyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9pbml0LmMKKysrIGIvYXJjaC94ODYvbW0vaW5pdC5jCkBAIC02OTksOCArNjk5LDEwIEBACiAJfQogfQogCi12b2lkIGZyZWVfaW5pdG1lbSh2b2lkKQordm9pZCBfX3JlZiBmcmVlX2luaXRtZW0odm9pZCkKIHsKKwllODIwX3JlYWxsb2NhdGVfdGFibGVzKCk7CisKIAlmcmVlX2luaXRfcGFnZXMoInVudXNlZCBrZXJuZWwiLAogCQkJKHVuc2lnbmVkIGxvbmcpKCZfX2luaXRfYmVnaW4pLAogCQkJKHVuc2lnbmVkIGxvbmcpKCZfX2luaXRfZW5kKSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9rYXNsci5jIGIvYXJjaC94ODYvbW0va2FzbHIuYwppbmRleCBlYzg2NTRmLi5kZGQyNjYxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9rYXNsci5jCisrKyBiL2FyY2gveDg2L21tL2thc2xyLmMKQEAgLTQwLDE3ICs0MCwyNiBAQAogICogWW91IG5lZWQgdG8gYWRkIGFuIGlmL2RlZiBlbnRyeSBpZiB5b3UgaW50cm9kdWNlIGEgbmV3IG1lbW9yeSByZWdpb24KICAqIGNvbXBhdGlibGUgd2l0aCBLQVNMUi4gWW91ciBlbnRyeSBtdXN0IGJlIGluIGxvZ2ljYWwgb3JkZXIgd2l0aCBtZW1vcnkKICAqIGxheW91dC4gRm9yIGV4YW1wbGUsIEVTUEZJWCBpcyBiZWZvcmUgRUZJIGJlY2F1c2UgaXRzIHZpcnR1YWwgYWRkcmVzcyBpcwotICogYmVmb3JlLiBZb3UgYWxzbyBuZWVkIHRvIGFkZCBhIEJVSUxEX0JVR19PTiBpbiBrZXJuZWxfcmFuZG9taXplX21lbW9yeSB0bworICogYmVmb3JlLiBZb3UgYWxzbyBuZWVkIHRvIGFkZCBhIEJVSUxEX0JVR19PTigpIGluIGtlcm5lbF9yYW5kb21pemVfbWVtb3J5KCkgdG8KICAqIGVuc3VyZSB0aGF0IHRoaXMgb3JkZXIgaXMgY29ycmVjdCBhbmQgd29uJ3QgYmUgY2hhbmdlZC4KICAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgdmFkZHJfc3RhcnQgPSBfX1BBR0VfT0ZGU0VUX0JBU0U7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyB2YWRkcl9lbmQgPSBWTUVNTUFQX1NUQVJUOworCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X0VTUEZJWDY0KQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgdmFkZHJfZW5kID0gRVNQRklYX0JBU0VfQUREUjsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0VGSSkKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHZhZGRyX2VuZCA9IEVGSV9WQV9TVEFSVDsKKyNlbHNlCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyB2YWRkcl9lbmQgPSBfX1NUQVJUX0tFUk5FTF9tYXA7CisjZW5kaWYKIAogLyogRGVmYXVsdCB2YWx1ZXMgKi8KIHVuc2lnbmVkIGxvbmcgcGFnZV9vZmZzZXRfYmFzZSA9IF9fUEFHRV9PRkZTRVRfQkFTRTsKIEVYUE9SVF9TWU1CT0wocGFnZV9vZmZzZXRfYmFzZSk7CiB1bnNpZ25lZCBsb25nIHZtYWxsb2NfYmFzZSA9IF9fVk1BTExPQ19CQVNFOwogRVhQT1JUX1NZTUJPTCh2bWFsbG9jX2Jhc2UpOwordW5zaWduZWQgbG9uZyB2bWVtbWFwX2Jhc2UgPSBfX1ZNRU1NQVBfQkFTRTsKK0VYUE9SVF9TWU1CT0wodm1lbW1hcF9iYXNlKTsKIAogLyoKICAqIE1lbW9yeSByZWdpb25zIHJhbmRvbWl6ZWQgYnkgS0FTTFIgKGV4Y2VwdCBtb2R1bGVzIHRoYXQgdXNlIGEgc2VwYXJhdGUgbG9naWMKQEAgLTYzLDYgKzcyLDcgQEAKIH0ga2FzbHJfcmVnaW9uc1tdID0gewogCXsgJnBhZ2Vfb2Zmc2V0X2Jhc2UsIDY0LyogTWF4aW11bSAqLyB9LAogCXsgJnZtYWxsb2NfYmFzZSwgVk1BTExPQ19TSVpFX1RCIH0sCisJeyAmdm1lbW1hcF9iYXNlLCAxIH0sCiB9OwogCiAvKiBHZXQgc2l6ZSBpbiBieXRlcyB1c2VkIGJ5IHRoZSBtZW1vcnkgcmVnaW9uICovCkBAIC03Nyw3ICs4Nyw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgYm9vbCBrYXNscl9tZW1vcnlfZW5hYmxlZCh2b2lkKQogewotCXJldHVybiBrYXNscl9lbmFibGVkKCkgJiYgIWNvbmZpZ19lbmFibGVkKENPTkZJR19LQVNBTik7CisJcmV0dXJuIGthc2xyX2VuYWJsZWQoKSAmJiAhSVNfRU5BQkxFRChDT05GSUdfS0FTQU4pOwogfQogCiAvKiBJbml0aWFsaXplIGJhc2UgYW5kIHBhZGRpbmcgZm9yIGVhY2ggbWVtb3J5IHJlZ2lvbiByYW5kb21pemVkIHdpdGggS0FTTFIgKi8KQEAgLTg5LDYgKzk5LDE4IEBACiAJc3RydWN0IHJuZF9zdGF0ZSByYW5kX3N0YXRlOwogCXVuc2lnbmVkIGxvbmcgcmVtYWluX2VudHJvcHk7CiAKKwkvKgorCSAqIEFsbCB0aGVzZSBCVUlMRF9CVUdfT04gY2hlY2tzIGVuc3VyZXMgdGhlIG1lbW9yeSBsYXlvdXQgaXMKKwkgKiBjb25zaXN0ZW50IHdpdGggdGhlIHZhZGRyX3N0YXJ0L3ZhZGRyX2VuZCB2YXJpYWJsZXMuCisJICovCisJQlVJTERfQlVHX09OKHZhZGRyX3N0YXJ0ID49IHZhZGRyX2VuZCk7CisJQlVJTERfQlVHX09OKGNvbmZpZ19lbmFibGVkKENPTkZJR19YODZfRVNQRklYNjQpICYmCisJCSAgICAgdmFkZHJfZW5kID49IEVGSV9WQV9TVEFSVCk7CisJQlVJTERfQlVHX09OKChjb25maWdfZW5hYmxlZChDT05GSUdfWDg2X0VTUEZJWDY0KSB8fAorCQkgICAgICBjb25maWdfZW5hYmxlZChDT05GSUdfRUZJKSkgJiYKKwkJICAgICB2YWRkcl9lbmQgPj0gX19TVEFSVF9LRVJORUxfbWFwKTsKKwlCVUlMRF9CVUdfT04odmFkZHJfZW5kID4gX19TVEFSVF9LRVJORUxfbWFwKTsKKwogCWlmICgha2FzbHJfbWVtb3J5X2VuYWJsZWQoKSkKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9udW1hLmMgYi9hcmNoL3g4Ni9tbS9udW1hLmMKaW5kZXggZmI2ODIxMC4uM2YzNWI0OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vbnVtYS5jCisrKyBiL2FyY2gveDg2L21tL251bWEuYwpAQCAtNzIyLDIyICs3MjIsMTkgQEAKIAludW1hX2luaXQoZHVtbXlfbnVtYV9pbml0KTsKIH0KIAotc3RhdGljIF9faW5pdCBpbnQgZmluZF9uZWFyX29ubGluZV9ub2RlKGludCBub2RlKQorc3RhdGljIHZvaWQgX19pbml0IGluaXRfbWVtb3J5X2xlc3Nfbm9kZShpbnQgbmlkKQogewotCWludCBuLCB2YWw7Ci0JaW50IG1pbl92YWwgPSBJTlRfTUFYOwotCWludCBiZXN0X25vZGUgPSAtMTsKKwl1bnNpZ25lZCBsb25nIHpvbmVzX3NpemVbTUFYX05SX1pPTkVTXSA9IHswfTsKKwl1bnNpZ25lZCBsb25nIHpob2xlc19zaXplW01BWF9OUl9aT05FU10gPSB7MH07CiAKLQlmb3JfZWFjaF9vbmxpbmVfbm9kZShuKSB7Ci0JCXZhbCA9IG5vZGVfZGlzdGFuY2Uobm9kZSwgbik7CisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgbm9kZSBkYXRhLiBNZW1vcnktbGVzcyBub2RlIGlzIG5vdyBvbmxpbmUuKi8KKwlhbGxvY19ub2RlX2RhdGEobmlkKTsKKwlmcmVlX2FyZWFfaW5pdF9ub2RlKG5pZCwgem9uZXNfc2l6ZSwgMCwgemhvbGVzX3NpemUpOwogCi0JCWlmICh2YWwgPCBtaW5fdmFsKSB7Ci0JCQltaW5fdmFsID0gdmFsOwotCQkJYmVzdF9ub2RlID0gbjsKLQkJfQotCX0KLQotCXJldHVybiBiZXN0X25vZGU7CisJLyoKKwkgKiBBbGwgem9uZWxpc3RzIHdpbGwgYmUgYnVpbHQgbGF0ZXIgaW4gc3RhcnRfa2VybmVsKCkgYWZ0ZXIgcGVyIGNwdQorCSAqIGFyZWFzIGFyZSBpbml0aWFsaXplZC4KKwkgKi8KIH0KIAogLyoKQEAgLTc2Niw4ICs3NjMsMTAgQEAKIAogCQlpZiAobm9kZSA9PSBOVU1BX05PX05PREUpCiAJCQljb250aW51ZTsKKwogCQlpZiAoIW5vZGVfb25saW5lKG5vZGUpKQotCQkJbm9kZSA9IGZpbmRfbmVhcl9vbmxpbmVfbm9kZShub2RlKTsKKwkJCWluaXRfbWVtb3J5X2xlc3Nfbm9kZShub2RlKTsKKwogCQludW1hX3NldF9ub2RlKGNwdSwgbm9kZSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGFnZWF0dHIuYyBiL2FyY2gveDg2L21tL3BhZ2VhdHRyLmMKaW5kZXggODQ5ZGMwOS4uZTMzNTNjOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vcGFnZWF0dHIuYworKysgYi9hcmNoL3g4Ni9tbS9wYWdlYXR0ci5jCkBAIC05MTcsMTEgKzkxNywxMSBAQAogCX0KIH0KIAotc3RhdGljIGludCBwb3B1bGF0ZV9wbWQoc3RydWN0IGNwYV9kYXRhICpjcGEsCi0JCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKLQkJCXVuc2lnbmVkIG51bV9wYWdlcywgcHVkX3QgKnB1ZCwgcGdwcm90X3QgcGdwcm90KQorc3RhdGljIGxvbmcgcG9wdWxhdGVfcG1kKHN0cnVjdCBjcGFfZGF0YSAqY3BhLAorCQkJIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLAorCQkJIHVuc2lnbmVkIG51bV9wYWdlcywgcHVkX3QgKnB1ZCwgcGdwcm90X3QgcGdwcm90KQogewotCXVuc2lnbmVkIGludCBjdXJfcGFnZXMgPSAwOworCWxvbmcgY3VyX3BhZ2VzID0gMDsKIAlwbWRfdCAqcG1kOwogCXBncHJvdF90IHBtZF9wZ3Byb3Q7CiAKQEAgLTk5MSwxMiArOTkxLDEyIEBACiAJcmV0dXJuIG51bV9wYWdlczsKIH0KIAotc3RhdGljIGludCBwb3B1bGF0ZV9wdWQoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHBnZF90ICpwZ2QsCi0JCQlwZ3Byb3RfdCBwZ3Byb3QpCitzdGF0aWMgbG9uZyBwb3B1bGF0ZV9wdWQoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHBnZF90ICpwZ2QsCisJCQkgcGdwcm90X3QgcGdwcm90KQogewogCXB1ZF90ICpwdWQ7CiAJdW5zaWduZWQgbG9uZyBlbmQ7Ci0JaW50IGN1cl9wYWdlcyA9IDA7CisJbG9uZyBjdXJfcGFnZXMgPSAwOwogCXBncHJvdF90IHB1ZF9wZ3Byb3Q7CiAKIAllbmQgPSBzdGFydCArIChjcGEtPm51bXBhZ2VzIDw8IFBBR0VfU0hJRlQpOwpAQCAtMTA1Miw3ICsxMDUyLDcgQEAKIAogCS8qIE1hcCB0cmFpbGluZyBsZWZ0b3ZlciAqLwogCWlmIChzdGFydCA8IGVuZCkgewotCQlpbnQgdG1wOworCQlsb25nIHRtcDsKIAogCQlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgc3RhcnQpOwogCQlpZiAocHVkX25vbmUoKnB1ZCkpCkBAIC0xMDc4LDcgKzEwNzgsNyBAQAogCXBncHJvdF90IHBncHJvdCA9IF9fcGdwcm90KF9LRVJOUEdfVEFCTEUpOwogCXB1ZF90ICpwdWQgPSBOVUxMOwkvKiBzaHV0IHVwIGdjYyAqLwogCXBnZF90ICpwZ2RfZW50cnk7Ci0JaW50IHJldDsKKwlsb25nIHJldDsKIAogCXBnZF9lbnRyeSA9IGNwYS0+cGdkICsgcGdkX2luZGV4KGFkZHIpOwogCkBAIC0xMzI3LDcgKzEzMjcsOCBAQAogCiBzdGF0aWMgaW50IF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBpbnQgY2hlY2thbGlhcykKIHsKLQlpbnQgcmV0LCBudW1wYWdlcyA9IGNwYS0+bnVtcGFnZXM7CisJdW5zaWduZWQgbG9uZyBudW1wYWdlcyA9IGNwYS0+bnVtcGFnZXM7CisJaW50IHJldDsKIAogCXdoaWxlIChudW1wYWdlcykgewogCQkvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGF0LmMgYi9hcmNoL3g4Ni9tbS9wYXQuYwppbmRleCBlY2IxYjY5Li4xNzBjYzRmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9wYXQuYworKysgYi9hcmNoL3g4Ni9tbS9wYXQuYwpAQCAtOTI3LDkgKzkyNywxMCBAQAogfQogCiAvKgotICogcHJvdCBpcyBwYXNzZWQgaW4gYXMgYSBwYXJhbWV0ZXIgZm9yIHRoZSBuZXcgbWFwcGluZy4gSWYgdGhlIHZtYSBoYXMgYQotICogbGluZWFyIHBmbiBtYXBwaW5nIGZvciB0aGUgZW50aXJlIHJhbmdlIHJlc2VydmUgdGhlIGVudGlyZSB2bWEgcmFuZ2Ugd2l0aAotICogc2luZ2xlIHJlc2VydmVfcGZuX3JhbmdlIGNhbGwuCisgKiBwcm90IGlzIHBhc3NlZCBpbiBhcyBhIHBhcmFtZXRlciBmb3IgdGhlIG5ldyBtYXBwaW5nLiBJZiB0aGUgdm1hIGhhcworICogYSBsaW5lYXIgcGZuIG1hcHBpbmcgZm9yIHRoZSBlbnRpcmUgcmFuZ2UsIG9yIG5vIHZtYSBpcyBwcm92aWRlZCwKKyAqIHJlc2VydmUgdGhlIGVudGlyZSBwZm4gKyBzaXplIHJhbmdlIHdpdGggc2luZ2xlIHJlc2VydmVfcGZuX3JhbmdlCisgKiBjYWxsLgogICovCiBpbnQgdHJhY2tfcGZuX3JlbWFwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwZ3Byb3RfdCAqcHJvdCwKIAkJICAgIHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKQEAgLTkzOCwxMSArOTM5LDEyIEBACiAJZW51bSBwYWdlX2NhY2hlX21vZGUgcGNtOwogCiAJLyogcmVzZXJ2ZSB0aGUgd2hvbGUgY2h1bmsgc3RhcnRpbmcgZnJvbSBwYWRkciAqLwotCWlmIChhZGRyID09IHZtYS0+dm1fc3RhcnQgJiYgc2l6ZSA9PSAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSkgeworCWlmICghdm1hIHx8IChhZGRyID09IHZtYS0+dm1fc3RhcnQKKwkJCQkmJiBzaXplID09ICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpKSkgewogCQlpbnQgcmV0OwogCiAJCXJldCA9IHJlc2VydmVfcGZuX3JhbmdlKHBhZGRyLCBzaXplLCBwcm90LCAwKTsKLQkJaWYgKCFyZXQpCisJCWlmIChyZXQgPT0gMCAmJiB2bWEpCiAJCQl2bWEtPnZtX2ZsYWdzIHw9IFZNX1BBVDsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC05OTcsNyArOTk5LDcgQEAKIAlyZXNvdXJjZV9zaXplX3QgcGFkZHI7CiAJdW5zaWduZWQgbG9uZyBwcm90OwogCi0JaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1BBVCkpCisJaWYgKHZtYSAmJiAhKHZtYS0+dm1fZmxhZ3MgJiBWTV9QQVQpKQogCQlyZXR1cm47CiAKIAkvKiBmcmVlIHRoZSBjaHVuayBzdGFydGluZyBmcm9tIHBmbiBvciB0aGUgd2hvbGUgY2h1bmsgKi8KQEAgLTEwMTEsNyArMTAxMyw4IEBACiAJCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CiAJfQogCWZyZWVfcGZuX3JhbmdlKHBhZGRyLCBzaXplKTsKLQl2bWEtPnZtX2ZsYWdzICY9IH5WTV9QQVQ7CisJaWYgKHZtYSkKKwkJdm1hLT52bV9mbGFncyAmPSB+Vk1fUEFUOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGF0X3JidHJlZS5jIGIvYXJjaC94ODYvbW0vcGF0X3JidHJlZS5jCmluZGV4IGRlMzkxYjcuLjE1OWI1MmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL3BhdF9yYnRyZWUuYworKysgYi9hcmNoL3g4Ni9tbS9wYXRfcmJ0cmVlLmMKQEAgLTI1NCw5ICsyNTQsNyBAQAogCiBzdHJ1Y3QgbWVtdHlwZSAqcmJ0X21lbXR5cGVfbG9va3VwKHU2NCBhZGRyKQogewotCXN0cnVjdCBtZW10eXBlICpkYXRhOwotCWRhdGEgPSBtZW10eXBlX3JiX2xvd2VzdF9tYXRjaCgmbWVtdHlwZV9yYnJvb3QsIGFkZHIsIGFkZHIgKyBQQUdFX1NJWkUpOwotCXJldHVybiBkYXRhOworCXJldHVybiBtZW10eXBlX3JiX2xvd2VzdF9tYXRjaCgmbWVtdHlwZV9yYnJvb3QsIGFkZHIsIGFkZHIgKyBQQUdFX1NJWkUpOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS90bGIuYyBiL2FyY2gveDg2L21tL3RsYi5jCmluZGV4IDRkYmU2NTYuLmE3NjU1ZjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL3RsYi5jCisrKyBiL2FyY2gveDg2L21tL3RsYi5jCkBAIC03NywxMCArNzcsMjUgQEAKIAl1bnNpZ25lZCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAlpZiAobGlrZWx5KHByZXYgIT0gbmV4dCkpIHsKKwkJaWYgKElTX0VOQUJMRUQoQ09ORklHX1ZNQVBfU1RBQ0spKSB7CisJCQkvKgorCQkJICogSWYgb3VyIGN1cnJlbnQgc3RhY2sgaXMgaW4gdm1hbGxvYyBzcGFjZSBhbmQgaXNuJ3QKKwkJCSAqIG1hcHBlZCBpbiB0aGUgbmV3IHBnZCwgd2UnbGwgZG91YmxlLWZhdWx0LiAgRm9yY2libHkKKwkJCSAqIG1hcCBpdC4KKwkJCSAqLworCQkJdW5zaWduZWQgaW50IHN0YWNrX3BnZF9pbmRleCA9IHBnZF9pbmRleChjdXJyZW50X3N0YWNrX3BvaW50ZXIoKSk7CisKKwkJCXBnZF90ICpwZ2QgPSBuZXh0LT5wZ2QgKyBzdGFja19wZ2RfaW5kZXg7CisKKwkJCWlmICh1bmxpa2VseShwZ2Rfbm9uZSgqcGdkKSkpCisJCQkJc2V0X3BnZChwZ2QsIGluaXRfbW0ucGdkW3N0YWNrX3BnZF9pbmRleF0pOworCQl9CisKICNpZmRlZiBDT05GSUdfU01QCiAJCXRoaXNfY3B1X3dyaXRlKGNwdV90bGJzdGF0ZS5zdGF0ZSwgVExCU1RBVEVfT0spOwogCQl0aGlzX2NwdV93cml0ZShjcHVfdGxic3RhdGUuYWN0aXZlX21tLCBuZXh0KTsKICNlbmRpZgorCiAJCWNwdW1hc2tfc2V0X2NwdShjcHUsIG1tX2NwdW1hc2sobmV4dCkpOwogCiAJCS8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9iYWNrdHJhY2UuYyBiL2FyY2gveDg2L29wcm9maWxlL2JhY2t0cmFjZS5jCmluZGV4IGNiMzFhNDQuLmEyNDg4YjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L29wcm9maWxlL2JhY2t0cmFjZS5jCisrKyBiL2FyY2gveDg2L29wcm9maWxlL2JhY2t0cmFjZS5jCkBAIC0xNiwyNyArMTYsNyBAQAogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+Ci0KLXN0YXRpYyBpbnQgYmFja3RyYWNlX3N0YWNrKHZvaWQgKmRhdGEsIGNoYXIgKm5hbWUpCi17Ci0JLyogWWVzLCB3ZSB3YW50IGFsbCBzdGFja3MgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiYWNrdHJhY2VfYWRkcmVzcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCByZWxpYWJsZSkKLXsKLQl1bnNpZ25lZCBpbnQgKmRlcHRoID0gZGF0YTsKLQotCWlmICgoKmRlcHRoKS0tKQotCQlvcHJvZmlsZV9hZGRfdHJhY2UoYWRkcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgYmFja3RyYWNlX29wcyA9IHsKLQkuc3RhY2sJCT0gYmFja3RyYWNlX3N0YWNrLAotCS5hZGRyZXNzCT0gYmFja3RyYWNlX2FkZHJlc3MsCi0JLndhbGtfc3RhY2sJPSBwcmludF9jb250ZXh0X3N0YWNrLAotfTsKKyNpbmNsdWRlIDxhc20vdW53aW5kLmg+CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiBzdGF0aWMgc3RydWN0IHN0YWNrX2ZyYW1lX2lhMzIgKgpAQCAtMTEzLDEwICs5MywyOSBAQAogCXN0cnVjdCBzdGFja19mcmFtZSAqaGVhZCA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKilmcmFtZV9wb2ludGVyKHJlZ3MpOwogCiAJaWYgKCF1c2VyX21vZGUocmVncykpIHsKLQkJdW5zaWduZWQgbG9uZyBzdGFjayA9IGtlcm5lbF9zdGFja19wb2ludGVyKHJlZ3MpOwotCQlpZiAoZGVwdGgpCi0JCQlkdW1wX3RyYWNlKE5VTEwsIHJlZ3MsICh1bnNpZ25lZCBsb25nICopc3RhY2ssIDAsCi0JCQkJICAgJmJhY2t0cmFjZV9vcHMsICZkZXB0aCk7CisJCXN0cnVjdCB1bndpbmRfc3RhdGUgc3RhdGU7CisJCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCQlpZiAoIWRlcHRoKQorCQkJcmV0dXJuOworCisJCW9wcm9maWxlX2FkZF90cmFjZShyZWdzLT5pcCk7CisKKwkJaWYgKCEtLWRlcHRoKQorCQkJcmV0dXJuOworCisJCWZvciAodW53aW5kX3N0YXJ0KCZzdGF0ZSwgY3VycmVudCwgcmVncywgTlVMTCk7CisJCSAgICAgIXVud2luZF9kb25lKCZzdGF0ZSk7IHVud2luZF9uZXh0X2ZyYW1lKCZzdGF0ZSkpIHsKKwkJCWFkZHIgPSB1bndpbmRfZ2V0X3JldHVybl9hZGRyZXNzKCZzdGF0ZSk7CisJCQlpZiAoIWFkZHIpCisJCQkJYnJlYWs7CisKKwkJCW9wcm9maWxlX2FkZF90cmFjZShhZGRyKTsKKworCQkJaWYgKCEtLWRlcHRoKQorCQkJCWJyZWFrOworCQl9CisKIAkJcmV0dXJuOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2ZpeHVwLmMgYi9hcmNoL3g4Ni9wY2kvZml4dXAuYwppbmRleCA4MzdlYTM2Li42ZDUyYjk0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvZml4dXAuYworKysgYi9hcmNoL3g4Ni9wY2kvZml4dXAuYwpAQCAtNTUzLDE1ICs1NTMsMjEgQEAKIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI3QjksIHR3aW5oZWFkX3Jlc2VydmVfa2lsbGluZ196b25lKTsKIAogLyoKLSAqIEJyb2Fkd2VsbCBFUCBIb21lIEFnZW50IEJBUnMgZXJyb25lb3VzbHkgcmV0dXJuIG5vbi16ZXJvIHZhbHVlcyB3aGVuIHJlYWQuCisgKiBEZXZpY2UgWzgwODY6MmZjMF0KKyAqIEVycmF0dW0gSFNFNDMKKyAqIENPTkZJR19URFBfTk9NSU5BTCBDU1IgSW1wbGVtZW50ZWQgYXQgSW5jb3JyZWN0IE9mZnNldAorICogaHR0cDovL3d3dy5pbnRlbC5jb20vY29udGVudC93d3cvdXMvZW4vcHJvY2Vzc29ycy94ZW9uL3hlb24tZTUtdjMtc3BlYy11cGRhdGUuaHRtbAogICoKLSAqIFNlZSBodHRwOi8vd3d3LmludGVsLmNvbS9jb250ZW50L3d3dy91cy9lbi9wcm9jZXNzb3JzL3hlb24veGVvbi1lNS12NC1zcGVjLXVwZGF0ZS5odG1sCi0gKiBlbnRyeSBCREYyLgorICogRGV2aWNlcyBbODA4Njo2ZjYwLDZmYTAsNmZjMF0KKyAqIEVycmF0dW0gQkRGMgorICogUENJIEJBUnMgaW4gdGhlIEhvbWUgQWdlbnQgV2lsbCBSZXR1cm4gTm9uLVplcm8gVmFsdWVzIER1cmluZyBFbnVtZXJhdGlvbgorICogaHR0cDovL3d3dy5pbnRlbC5jb20vY29udGVudC93d3cvdXMvZW4vcHJvY2Vzc29ycy94ZW9uL3hlb24tZTUtdjQtc3BlYy11cGRhdGUuaHRtbAogICovCi1zdGF0aWMgdm9pZCBwY2lfYmR3ZXBfYmFyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgdm9pZCBwY2lfaW52YWxpZF9iYXIoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlkZXYtPm5vbl9jb21wbGlhbnRfYmFycyA9IDE7CiB9Ci1ERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDZmNjAsIHBjaV9iZHdlcF9iYXIpOwotREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg2ZmEwLCBwY2lfYmR3ZXBfYmFyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4NmZjMCwgcGNpX2Jkd2VwX2Jhcik7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDJmYzAsIHBjaV9pbnZhbGlkX2Jhcik7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDZmNjAsIHBjaV9pbnZhbGlkX2Jhcik7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDZmYTAsIHBjaV9pbnZhbGlkX2Jhcik7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDZmYzAsIHBjaV9pbnZhbGlkX2Jhcik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvcGNiaW9zLmMgYi9hcmNoL3g4Ni9wY2kvcGNiaW9zLmMKaW5kZXggOTc3MGU1NS4uMWQ5N2NlYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL3BjYmlvcy5jCisrKyBiL2FyY2gveDg2L3BjaS9wY2Jpb3MuYwpAQCAtMTIwLDkgKzEyMCwxMiBAQAogc3RhdGljIHN0cnVjdCB7CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwogCXVuc2lnbmVkIHNob3J0IHNlZ21lbnQ7Ci19IHBjaV9pbmRpcmVjdCA9IHsgMCwgX19LRVJORUxfQ1MgfTsKK30gcGNpX2luZGlyZWN0IF9fcm9fYWZ0ZXJfaW5pdCA9IHsKKwkuYWRkcmVzcyA9IDAsCisJLnNlZ21lbnQgPSBfX0tFUk5FTF9DUywKK307CiAKLXN0YXRpYyBpbnQgcGNpX2Jpb3NfcHJlc2VudDsKK3N0YXRpYyBpbnQgcGNpX2Jpb3NfcHJlc2VudCBfX3JvX2FmdGVyX2luaXQ7CiAKIHN0YXRpYyBpbnQgX19pbml0IGNoZWNrX3BjaWJpb3Modm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS92bWQuYyBiL2FyY2gveDg2L3BjaS92bWQuYwppbmRleCBiODE0Y2E2Li43OTQ4YmUzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvdm1kLmMKKysrIGIvYXJjaC94ODYvcGNpL3ZtZC5jCkBAIC00MSw2ICs0MSw3IEBACiAgKiBAbm9kZToJbGlzdCBpdGVtIGZvciBwYXJlbnQgdHJhdmVyc2FsLgogICogQHJjdToJUkNVIGNhbGxiYWNrIGl0ZW0gZm9yIGZyZWVpbmcuCiAgKiBAaXJxOgliYWNrIHBvaW50ZXIgdG8gcGFyZW50LgorICogQGVuYWJsZWQ6CXRydWUgaWYgZHJpdmVyIGVuYWJsZWQgSVJRCiAgKiBAdmlycToJdGhlIHZpcnR1YWwgSVJRIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSByZXF1ZXN0aW5nIGRyaXZlci4KICAqCiAgKiBFdmVyeSBNU0kvTVNJLVggSVJRIHJlcXVlc3RlZCBmb3IgYSBkZXZpY2UgaW4gYSBWTUQgZG9tYWluIHdpbGwgYmUgbWFwcGVkIHRvCkBAIC01MCw2ICs1MSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZAlub2RlOwogCXN0cnVjdCByY3VfaGVhZAkJcmN1OwogCXN0cnVjdCB2bWRfaXJxX2xpc3QJKmlycTsKKwlib29sCQkJZW5hYmxlZDsKIAl1bnNpZ25lZCBpbnQJCXZpcnE7CiB9OwogCkBAIC0xMjIsNyArMTI0LDkgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZsaXN0X2xvY2ssIGZsYWdzKTsKKwlXQVJOX09OKHZtZGlycS0+ZW5hYmxlZCk7CiAJbGlzdF9hZGRfdGFpbF9yY3UoJnZtZGlycS0+bm9kZSwgJnZtZGlycS0+aXJxLT5pcnFfbGlzdCk7CisJdm1kaXJxLT5lbmFibGVkID0gdHJ1ZTsKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7CiAKIAlkYXRhLT5jaGlwLT5pcnFfdW5tYXNrKGRhdGEpOwpAQCAtMTM2LDggKzE0MCwxMCBAQAogCWRhdGEtPmNoaXAtPmlycV9tYXNrKGRhdGEpOwogCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZsaXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2RlbF9yY3UoJnZtZGlycS0+bm9kZSk7Ci0JSU5JVF9MSVNUX0hFQURfUkNVKCZ2bWRpcnEtPm5vZGUpOworCWlmICh2bWRpcnEtPmVuYWJsZWQpIHsKKwkJbGlzdF9kZWxfcmN1KCZ2bWRpcnEtPm5vZGUpOworCQl2bWRpcnEtPmVuYWJsZWQgPSBmYWxzZTsKKwl9CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3RfbG9jaywgZmxhZ3MpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9NYWtlZmlsZSBiL2FyY2gveDg2L3BsYXRmb3JtL01ha2VmaWxlCmluZGV4IDE4NDg0MmUuLjNjM2MxOWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL01ha2VmaWxlCkBAIC04LDYgKzgsNyBAQAogb2JqLXkJKz0gaW50ZWwvCiBvYmoteQkrPSBpbnRlbC1taWQvCiBvYmoteQkrPSBpbnRlbC1xdWFyay8KK29iai15CSs9IG1lbGxhbm94Lwogb2JqLXkJKz0gb2xwYy8KIG9iai15CSs9IHNjeDIwMC8KIG9iai15CSs9IHNmaS8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2F0b20vcHVuaXRfYXRvbV9kZWJ1Zy5jIGIvYXJjaC94ODYvcGxhdGZvcm0vYXRvbS9wdW5pdF9hdG9tX2RlYnVnLmMKaW5kZXggOGZmN2I5My4uZDQ5ZDNiZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vYXRvbS9wdW5pdF9hdG9tX2RlYnVnLmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vYXRvbS9wdW5pdF9hdG9tX2RlYnVnLmMKQEAgLTE1NSw3ICsxNTUsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHg4Nl9jcHVfaWQgaW50ZWxfcHVuaXRfY3B1X2lkc1tdID0gewogCUlDUFUoSU5URUxfRkFNNl9BVE9NX1NJTFZFUk1PTlQxLCBwdW5pdF9kZXZpY2VfYnl0KSwKLQlJQ1BVKElOVEVMX0ZBTTZfQVRPTV9NRVJSSUZJRUxEMSwgcHVuaXRfZGV2aWNlX3RuZyksCisJSUNQVShJTlRFTF9GQU02X0FUT01fTUVSUklGSUVMRCwgIHB1bml0X2RldmljZV90bmcpLAogCUlDUFUoSU5URUxfRkFNNl9BVE9NX0FJUk1PTlQsCSAgcHVuaXRfZGV2aWNlX2NodCksCiAJe30KIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpLWJncnQuYyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmktYmdydC5jCmluZGV4IDZhMmY1NjkuLjZhYWQ4NzAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmktYmdydC5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmktYmdydC5jCkBAIC04MiwyMSArODIsMTIgQEAKIAl9CiAJYmdydF9pbWFnZV9zaXplID0gYm1wX2hlYWRlci5zaXplOwogCi0JYmdydF9pbWFnZSA9IGttYWxsb2MoYmdydF9pbWFnZV9zaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTsKKwliZ3J0X2ltYWdlID0gbWVtcmVtYXAoYmdydF90YWItPmltYWdlX2FkZHJlc3MsIGJtcF9oZWFkZXIuc2l6ZSwgTUVNUkVNQVBfV0IpOwogCWlmICghYmdydF9pbWFnZSkgewotCQlwcl9ub3RpY2UoIklnbm9yaW5nIEJHUlQ6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGltYWdlICh3YW50ZWQgJXp1IGJ5dGVzKVxuIiwKLQkJICAgICAgIGJncnRfaW1hZ2Vfc2l6ZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpbWFnZSA9IG1lbXJlbWFwKGJncnRfdGFiLT5pbWFnZV9hZGRyZXNzLCBibXBfaGVhZGVyLnNpemUsIE1FTVJFTUFQX1dCKTsKLQlpZiAoIWltYWdlKSB7CiAJCXByX25vdGljZSgiSWdub3JpbmcgQkdSVDogZmFpbGVkIHRvIG1hcCBpbWFnZSBtZW1vcnlcbiIpOwotCQlrZnJlZShiZ3J0X2ltYWdlKTsKIAkJYmdydF9pbWFnZSA9IE5VTEw7CiAJCXJldHVybjsKIAl9CiAKLQltZW1jcHkoYmdydF9pbWFnZSwgaW1hZ2UsIGJncnRfaW1hZ2Vfc2l6ZSk7Ci0JbWVtdW5tYXAoaW1hZ2UpOworCWVmaV9tZW1fcmVzZXJ2ZShiZ3J0X3RhYi0+aW1hZ2VfYWRkcmVzcywgYmdydF9pbWFnZV9zaXplKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYwppbmRleCAxZmJiNDA4Li5iZjk5YWE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpLmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS5jCkBAIC0xNjYsMTMgKzE2NiwxNSBAQAogCQl9CiAJCWU4MjBfYWRkX3JlZ2lvbihzdGFydCwgc2l6ZSwgZTgyMF90eXBlKTsKIAl9Ci0Jc2FuaXRpemVfZTgyMF9tYXAoZTgyMC5tYXAsIEFSUkFZX1NJWkUoZTgyMC5tYXApLCAmZTgyMC5ucl9tYXApOworCXNhbml0aXplX2U4MjBfbWFwKGU4MjAtPm1hcCwgQVJSQVlfU0laRShlODIwLT5tYXApLCAmZTgyMC0+bnJfbWFwKTsKIH0KIAogaW50IF9faW5pdCBlZmlfbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2Uodm9pZCkKIHsKIAlzdHJ1Y3QgZWZpX2luZm8gKmUgPSAmYm9vdF9wYXJhbXMuZWZpX2luZm87CisJc3RydWN0IGVmaV9tZW1vcnlfbWFwX2RhdGEgZGF0YTsKIAlwaHlzX2FkZHJfdCBwbWFwOworCWludCBydjsKIAogCWlmIChlZmlfZW5hYmxlZChFRklfUEFSQVZJUlQpKQogCQlyZXR1cm4gMDsKQEAgLTE4NywxMSArMTg5LDE3IEBACiAjZWxzZQogCXBtYXAgPSAoZS0+ZWZpX21lbW1hcCB8CSgoX191NjQpZS0+ZWZpX21lbW1hcF9oaSA8PCAzMikpOwogI2VuZGlmCi0JZWZpLm1lbW1hcC5waHlzX21hcAk9IHBtYXA7Ci0JZWZpLm1lbW1hcC5ucl9tYXAJPSBlLT5lZmlfbWVtbWFwX3NpemUgLwotCQkJCSAgZS0+ZWZpX21lbWRlc2Nfc2l6ZTsKLQllZmkubWVtbWFwLmRlc2Nfc2l6ZQk9IGUtPmVmaV9tZW1kZXNjX3NpemU7Ci0JZWZpLm1lbW1hcC5kZXNjX3ZlcnNpb24JPSBlLT5lZmlfbWVtZGVzY192ZXJzaW9uOworCWRhdGEucGh5c19tYXAJCT0gcG1hcDsKKwlkYXRhLnNpemUgCQk9IGUtPmVmaV9tZW1tYXBfc2l6ZTsKKwlkYXRhLmRlc2Nfc2l6ZQkJPSBlLT5lZmlfbWVtZGVzY19zaXplOworCWRhdGEuZGVzY192ZXJzaW9uCT0gZS0+ZWZpX21lbWRlc2NfdmVyc2lvbjsKKworCXJ2ID0gZWZpX21lbW1hcF9pbml0X2Vhcmx5KCZkYXRhKTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKKworCWlmIChhZGRfZWZpX21lbW1hcCkKKwkJZG9fYWRkX2VmaV9tZW1tYXAoKTsKIAogCVdBUk4oZWZpLm1lbW1hcC5kZXNjX3ZlcnNpb24gIT0gMSwKIAkgICAgICJVbmV4cGVjdGVkIEVGSV9NRU1PUllfREVTQ1JJUFRPUiB2ZXJzaW9uICVsZCIsCkBAIC0yMTgsMTkgKzIyNiw2IEBACiAJfQogfQogCi12b2lkIF9faW5pdCBlZmlfdW5tYXBfbWVtbWFwKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCi0JY2xlYXJfYml0KEVGSV9NRU1NQVAsICZlZmkuZmxhZ3MpOwotCi0Jc2l6ZSA9IGVmaS5tZW1tYXAubnJfbWFwICogZWZpLm1lbW1hcC5kZXNjX3NpemU7Ci0JaWYgKGVmaS5tZW1tYXAubWFwKSB7Ci0JCWVhcmx5X21lbXVubWFwKGVmaS5tZW1tYXAubWFwLCBzaXplKTsKLQkJZWZpLm1lbW1hcC5tYXAgPSBOVUxMOwotCX0KLX0KLQogc3RhdGljIGludCBfX2luaXQgZWZpX3N5c3RhYl9pbml0KHZvaWQgKnBoeXMpCiB7CiAJaWYgKGVmaV9lbmFibGVkKEVGSV82NEJJVCkpIHsKQEAgLTQxNCwzMyArNDA5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgZWZpX21lbW1hcF9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBhZGRyLCBzaXplOwotCi0JaWYgKGVmaV9lbmFibGVkKEVGSV9QQVJBVklSVCkpCi0JCXJldHVybiAwOwotCi0JLyogTWFwIHRoZSBFRkkgbWVtb3J5IG1hcCAqLwotCXNpemUgPSBlZmkubWVtbWFwLm5yX21hcCAqIGVmaS5tZW1tYXAuZGVzY19zaXplOwotCWFkZHIgPSAodW5zaWduZWQgbG9uZyllZmkubWVtbWFwLnBoeXNfbWFwOwotCi0JZWZpLm1lbW1hcC5tYXAgPSBlYXJseV9tZW1yZW1hcChhZGRyLCBzaXplKTsKLQlpZiAoZWZpLm1lbW1hcC5tYXAgPT0gTlVMTCkgewotCQlwcl9lcnIoIkNvdWxkIG5vdCBtYXAgdGhlIG1lbW9yeSBtYXAhXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZWZpLm1lbW1hcC5tYXBfZW5kID0gZWZpLm1lbW1hcC5tYXAgKyBzaXplOwotCi0JaWYgKGFkZF9lZmlfbWVtbWFwKQotCQlkb19hZGRfZWZpX21lbW1hcCgpOwotCi0Jc2V0X2JpdChFRklfTUVNTUFQLCAmZWZpLmZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCiB2b2lkIF9faW5pdCBlZmlfaW5pdCh2b2lkKQogewogCWVmaV9jaGFyMTZfdCAqYzE2OwpAQCAtNDk4LDE2ICs0NjYsMTQgQEAKIAlpZiAoIWVmaV9ydW50aW1lX3N1cHBvcnRlZCgpKQogCQlwcl9pbmZvKCJObyBFRkkgcnVudGltZSBkdWUgdG8gMzIvNjQtYml0IG1pc21hdGNoIHdpdGgga2VybmVsXG4iKTsKIAllbHNlIHsKLQkJaWYgKGVmaV9ydW50aW1lX2Rpc2FibGVkKCkgfHwgZWZpX3J1bnRpbWVfaW5pdCgpKQorCQlpZiAoZWZpX3J1bnRpbWVfZGlzYWJsZWQoKSB8fCBlZmlfcnVudGltZV9pbml0KCkpIHsKKwkJCWVmaV9tZW1tYXBfdW5tYXAoKTsKIAkJCXJldHVybjsKKwkJfQogCX0KLQlpZiAoZWZpX21lbW1hcF9pbml0KCkpCi0JCXJldHVybjsKIAogCWlmIChlZmlfZW5hYmxlZChFRklfREJHKSkKIAkJZWZpX3ByaW50X21lbW1hcCgpOwotCi0JZWZpX2VzcnRfaW5pdCgpOwogfQogCiB2b2lkIF9faW5pdCBlZmlfbGF0ZV9pbml0KHZvaWQpCkBAIC02MjQsNDIgKzU5MCw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2F2ZV9ydW50aW1lX21hcCh2b2lkKQotewotI2lmZGVmIENPTkZJR19LRVhFQ19DT1JFCi0JdW5zaWduZWQgbG9uZyBkZXNjX3NpemU7Ci0JZWZpX21lbW9yeV9kZXNjX3QgKm1kOwotCXZvaWQgKnRtcCwgKnEgPSBOVUxMOwotCWludCBjb3VudCA9IDA7Ci0KLQlpZiAoZWZpX2VuYWJsZWQoRUZJX09MRF9NRU1NQVApKQotCQlyZXR1cm47Ci0KLQlkZXNjX3NpemUgPSBlZmkubWVtbWFwLmRlc2Nfc2l6ZTsKLQotCWZvcl9lYWNoX2VmaV9tZW1vcnlfZGVzYyhtZCkgewotCQlpZiAoIShtZC0+YXR0cmlidXRlICYgRUZJX01FTU9SWV9SVU5USU1FKSB8fAotCQkgICAgKG1kLT50eXBlID09IEVGSV9CT09UX1NFUlZJQ0VTX0NPREUpIHx8Ci0JCSAgICAobWQtPnR5cGUgPT0gRUZJX0JPT1RfU0VSVklDRVNfREFUQSkpCi0JCQljb250aW51ZTsKLQkJdG1wID0ga3JlYWxsb2MocSwgKGNvdW50ICsgMSkgKiBkZXNjX3NpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoIXRtcCkKLQkJCWdvdG8gb3V0OwotCQlxID0gdG1wOwotCi0JCW1lbWNweShxICsgY291bnQgKiBkZXNjX3NpemUsIG1kLCBkZXNjX3NpemUpOwotCQljb3VudCsrOwotCX0KLQotCWVmaV9ydW50aW1lX21hcF9zZXR1cChxLCBjb3VudCwgZGVzY19zaXplKTsKLQlyZXR1cm47Ci0KLW91dDoKLQlrZnJlZShxKTsKLQlwcl9lcnIoIkVycm9yIHNhdmluZyBydW50aW1lIG1hcCwgZWZpIHJ1bnRpbWUgb24ga2V4ZWMgbm9uLWZ1bmN0aW9uYWwhIVxuIik7Ci0jZW5kaWYKLX0KLQogc3RhdGljIHZvaWQgKnJlYWxsb2NfcGFnZXModm9pZCAqb2xkX21lbW1hcCwgaW50IG9sZF9zaGlmdCkKIHsKIAl2b2lkICpyZXQ7CkBAIC03NDUsNiArNjc1LDQ2IEBACiAJcmV0dXJuIGVudHJ5OwogfQogCitzdGF0aWMgYm9vbCBzaG91bGRfbWFwX3JlZ2lvbihlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpCit7CisJLyoKKwkgKiBSdW50aW1lIHJlZ2lvbnMgYWx3YXlzIHJlcXVpcmUgcnVudGltZSBtYXBwaW5ncyAob2J2aW91c2x5KS4KKwkgKi8KKwlpZiAobWQtPmF0dHJpYnV0ZSAmIEVGSV9NRU1PUllfUlVOVElNRSkKKwkJcmV0dXJuIHRydWU7CisKKwkvKgorCSAqIDMyLWJpdCBFRkkgZG9lc24ndCBzdWZmZXIgZnJvbSB0aGUgYnVnIHRoYXQgcmVxdWlyZXMgdXMgdG8KKwkgKiByZXNlcnZlIGJvb3Qgc2VydmljZXMgcmVnaW9ucywgYW5kIG1peGVkIG1vZGUgc3VwcG9ydAorCSAqIGRvZXNuJ3QgZXhpc3QgZm9yIDMyLWJpdCBrZXJuZWxzLgorCSAqLworCWlmIChJU19FTkFCTEVEKENPTkZJR19YODZfMzIpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIE1hcCBhbGwgb2YgUkFNIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyBhcmd1bWVudHMgaW4gdGhlIDE6MQorCSAqIG1hcHBpbmcgd2hlbiBtYWtpbmcgRUZJIHJ1bnRpbWUgY2FsbHMuCisJICovCisJaWYgKElTX0VOQUJMRUQoQ09ORklHX0VGSV9NSVhFRCkgJiYgIWVmaV9pc19uYXRpdmUoKSkgeworCQlpZiAobWQtPnR5cGUgPT0gRUZJX0NPTlZFTlRJT05BTF9NRU1PUlkgfHwKKwkJICAgIG1kLT50eXBlID09IEVGSV9MT0FERVJfREFUQSB8fAorCQkgICAgbWQtPnR5cGUgPT0gRUZJX0xPQURFUl9DT0RFKQorCQkJcmV0dXJuIHRydWU7CisJfQorCisJLyoKKwkgKiBNYXAgYm9vdCBzZXJ2aWNlcyByZWdpb25zIGFzIGEgd29ya2Fyb3VuZCBmb3IgYnVnZ3kKKwkgKiBmaXJtd2FyZSB0aGF0IGFjY2Vzc2VzIHRoZW0gZXZlbiB3aGVuIHRoZXkgc2hvdWxkbid0LgorCSAqCisJICogU2VlIGVmaV97cmVzZXJ2ZSxmcmVlfV9ib290X3NlcnZpY2VzKCkuCisJICovCisJaWYgKG1kLT50eXBlID09IEVGSV9CT09UX1NFUlZJQ0VTX0NPREUgfHwKKwkgICAgbWQtPnR5cGUgPT0gRUZJX0JPT1RfU0VSVklDRVNfREFUQSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIC8qCiAgKiBNYXAgdGhlIGVmaSBtZW1vcnkgcmFuZ2VzIG9mIHRoZSBydW50aW1lIHNlcnZpY2VzIGFuZCB1cGRhdGUgbmV3X21tYXAgd2l0aAogICogdmlydHVhbCBhZGRyZXNzZXMuCkBAIC03NjEsMTMgKzczMSw5IEBACiAJcCA9IE5VTEw7CiAJd2hpbGUgKChwID0gZWZpX21hcF9uZXh0X2VudHJ5KHApKSkgewogCQltZCA9IHA7Ci0JCWlmICghKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1JVTlRJTUUpKSB7Ci0jaWZkZWYgQ09ORklHX1g4Nl82NAotCQkJaWYgKG1kLT50eXBlICE9IEVGSV9CT09UX1NFUlZJQ0VTX0NPREUgJiYKLQkJCSAgICBtZC0+dHlwZSAhPSBFRklfQk9PVF9TRVJWSUNFU19EQVRBKQotI2VuZGlmCi0JCQkJY29udGludWU7Ci0JCX0KKworCQlpZiAoIXNob3VsZF9tYXBfcmVnaW9uKG1kKSkKKwkJCWNvbnRpbnVlOwogCiAJCWVmaV9tYXBfcmVnaW9uKG1kKTsKIAkJZ2V0X3N5c3RhYl92aXJ0X2FkZHIobWQpOwpAQCAtODAzLDcgKzc2OSw3IEBACiAJICogbm9uLW5hdGl2ZSBFRkkKIAkgKi8KIAlpZiAoIWVmaV9pc19uYXRpdmUoKSkgewotCQllZmlfdW5tYXBfbWVtbWFwKCk7CisJCWVmaV9tZW1tYXBfdW5tYXAoKTsKIAkJY2xlYXJfYml0KEVGSV9SVU5USU1FX1NFUlZJQ0VTLCAmZWZpLmZsYWdzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTgyMyw3ICs3ODksMTggQEAKIAkJZ2V0X3N5c3RhYl92aXJ0X2FkZHIobWQpOwogCX0KIAotCXNhdmVfcnVudGltZV9tYXAoKTsKKwkvKgorCSAqIFVucmVnaXN0ZXIgdGhlIGVhcmx5IEVGSSBtZW1tYXAgZnJvbSBlZmlfaW5pdCgpIGFuZCBpbnN0YWxsCisJICogdGhlIG5ldyBFRkkgbWVtb3J5IG1hcC4KKwkgKi8KKwllZmlfbWVtbWFwX3VubWFwKCk7CisKKwlpZiAoZWZpX21lbW1hcF9pbml0X2xhdGUoZWZpLm1lbW1hcC5waHlzX21hcCwKKwkJCQkgZWZpLm1lbW1hcC5kZXNjX3NpemUgKiBlZmkubWVtbWFwLm5yX21hcCkpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gcmVtYXAgbGF0ZSBFRkkgbWVtb3J5IG1hcFxuIik7CisJCWNsZWFyX2JpdChFRklfUlVOVElNRV9TRVJWSUNFUywgJmVmaS5mbGFncyk7CisJCXJldHVybjsKKwl9CiAKIAlCVUdfT04oIWVmaS5zeXN0YWIpOwogCkBAIC04ODQsNiArODYxLDcgQEAKIAlpbnQgY291bnQgPSAwLCBwZ19zaGlmdCA9IDA7CiAJdm9pZCAqbmV3X21lbW1hcCA9IE5VTEw7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKKwlwaHlzX2FkZHJfdCBwYTsKIAogCWVmaS5zeXN0YWIgPSBOVUxMOwogCkBAIC05MDEsMTEgKzg3OSwyNCBAQAogCQlyZXR1cm47CiAJfQogCi0Jc2F2ZV9ydW50aW1lX21hcCgpOworCXBhID0gX19wYShuZXdfbWVtbWFwKTsKKworCS8qCisJICogVW5yZWdpc3RlciB0aGUgZWFybHkgRUZJIG1lbW1hcCBmcm9tIGVmaV9pbml0KCkgYW5kIGluc3RhbGwKKwkgKiB0aGUgbmV3IEVGSSBtZW1vcnkgbWFwIHRoYXQgd2UgYXJlIGFib3V0IHRvIHBhc3MgdG8gdGhlCisJICogZmlybXdhcmUgdmlhIFNldFZpcnR1YWxBZGRyZXNzTWFwKCkuCisJICovCisJZWZpX21lbW1hcF91bm1hcCgpOworCisJaWYgKGVmaV9tZW1tYXBfaW5pdF9sYXRlKHBhLCBlZmkubWVtbWFwLmRlc2Nfc2l6ZSAqIGNvdW50KSkgeworCQlwcl9lcnIoIkZhaWxlZCB0byByZW1hcCBsYXRlIEVGSSBtZW1vcnkgbWFwXG4iKTsKKwkJY2xlYXJfYml0KEVGSV9SVU5USU1FX1NFUlZJQ0VTLCAmZWZpLmZsYWdzKTsKKwkJcmV0dXJuOworCX0KIAogCUJVR19PTighZWZpLnN5c3RhYik7CiAKLQlpZiAoZWZpX3NldHVwX3BhZ2VfdGFibGVzKF9fcGEobmV3X21lbW1hcCksIDEgPDwgcGdfc2hpZnQpKSB7CisJaWYgKGVmaV9zZXR1cF9wYWdlX3RhYmxlcyhwYSwgMSA8PCBwZ19zaGlmdCkpIHsKIAkJY2xlYXJfYml0KEVGSV9SVU5USU1FX1NFUlZJQ0VTLCAmZWZpLmZsYWdzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTkxNywxNCArOTA4LDE0IEBACiAJCQkJZWZpLm1lbW1hcC5kZXNjX3NpemUgKiBjb3VudCwKIAkJCQllZmkubWVtbWFwLmRlc2Nfc2l6ZSwKIAkJCQllZmkubWVtbWFwLmRlc2NfdmVyc2lvbiwKLQkJCQkoZWZpX21lbW9yeV9kZXNjX3QgKilfX3BhKG5ld19tZW1tYXApKTsKKwkJCQkoZWZpX21lbW9yeV9kZXNjX3QgKilwYSk7CiAJfSBlbHNlIHsKIAkJc3RhdHVzID0gZWZpX3RodW5rX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwKAogCQkJCWVmaV9waHlzLnNldF92aXJ0dWFsX2FkZHJlc3NfbWFwLAogCQkJCWVmaS5tZW1tYXAuZGVzY19zaXplICogY291bnQsCiAJCQkJZWZpLm1lbW1hcC5kZXNjX3NpemUsCiAJCQkJZWZpLm1lbW1hcC5kZXNjX3ZlcnNpb24sCi0JCQkJKGVmaV9tZW1vcnlfZGVzY190ICopX19wYShuZXdfbWVtbWFwKSk7CisJCQkJKGVmaV9tZW1vcnlfZGVzY190ICopcGEpOwogCX0KIAogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKQEAgLTk1NiwxNSArOTQ3LDYgQEAKIAllZmlfcnVudGltZV91cGRhdGVfbWFwcGluZ3MoKTsKIAllZmlfZHVtcF9wYWdldGFibGUoKTsKIAotCS8qCi0JICogV2UgbWFwcGVkIHRoZSBkZXNjcmlwdG9yIGFycmF5IGludG8gdGhlIEVGSSBwYWdldGFibGUgYWJvdmUKLQkgKiBidXQgd2UncmUgbm90IHVubWFwcGluZyBpdCBoZXJlIGJlY2F1c2UgaWYgd2UncmUgcnVubmluZyBpbgotCSAqIEVGSSBtaXhlZCBtb2RlIHdlIG5lZWQgYWxsIG9mIG1lbW9yeSB0byBiZSBhY2Nlc3NpYmxlIHdoZW4KLQkgKiB3ZSBwYXNzIHBhcmFtZXRlcnMgdG8gdGhlIEVGSSBydW50aW1lIHNlcnZpY2VzIGluIHRoZQotCSAqIHRodW5raW5nIGNvZGUuCi0JICovCi0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyluZXdfbWVtbWFwLCBwZ19zaGlmdCk7Ci0KIAkvKiBjbGVhbiBEVU1NWSBvYmplY3QgKi8KIAllZmlfZGVsZXRlX2R1bW15X3ZhcmlhYmxlKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpXzY0LmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpXzY0LmMKaW5kZXggNjc3ZTI5ZS4uNThiMGY4MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV82NC5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfNjQuYwpAQCAtODUsNyArODUsNyBAQAogCWVhcmx5X2NvZGVfbWFwcGluZ19zZXRfZXhlYygxKTsKIAogCW5fcGdkcyA9IERJVl9ST1VORF9VUCgobWF4X3BmbiA8PCBQQUdFX1NISUZUKSwgUEdESVJfU0laRSk7Ci0Jc2F2ZV9wZ2QgPSBrbWFsbG9jKG5fcGdkcyAqIHNpemVvZihwZ2RfdCksIEdGUF9LRVJORUwpOworCXNhdmVfcGdkID0ga21hbGxvY19hcnJheShuX3BnZHMsIHNpemVvZigqc2F2ZV9wZ2QpLCBHRlBfS0VSTkVMKTsKIAogCWZvciAocGdkID0gMDsgcGdkIDwgbl9wZ2RzOyBwZ2QrKykgewogCQlzYXZlX3BnZFtwZ2RdID0gKnBnZF9vZmZzZXRfayhwZ2QgKiBQR0RJUl9TSVpFKTsKQEAgLTIxNCw3ICsyMTQsNiBAQAogaW50IF9faW5pdCBlZmlfc2V0dXBfcGFnZV90YWJsZXModW5zaWduZWQgbG9uZyBwYV9tZW1tYXAsIHVuc2lnbmVkIG51bV9wYWdlcykKIHsKIAl1bnNpZ25lZCBsb25nIHBmbiwgdGV4dDsKLQllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgbnBhZ2VzOwogCXBnZF90ICpwZ2Q7CkBAIC0yNDUsMjggKzI0NCw5IEBACiAJICogdGV4dCBhbmQgYWxsb2NhdGUgYSBuZXcgc3RhY2sgYmVjYXVzZSB3ZSBjYW4ndCByZWx5IG9uIHRoZQogCSAqIHN0YWNrIHBvaW50ZXIgYmVpbmcgPCA0R0IuCiAJICovCi0JaWYgKCFJU19FTkFCTEVEKENPTkZJR19FRklfTUlYRUQpKQorCWlmICghSVNfRU5BQkxFRChDT05GSUdfRUZJX01JWEVEKSB8fCBlZmlfaXNfbmF0aXZlKCkpCiAJCXJldHVybiAwOwogCi0JLyoKLQkgKiBNYXAgYWxsIG9mIFJBTSBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgYXJndW1lbnRzIGluIHRoZSAxOjEKLQkgKiBtYXBwaW5nIHdoZW4gbWFraW5nIEVGSSBydW50aW1lIGNhbGxzLgotCSAqLwotCWZvcl9lYWNoX2VmaV9tZW1vcnlfZGVzYyhtZCkgewotCQlpZiAobWQtPnR5cGUgIT0gRUZJX0NPTlZFTlRJT05BTF9NRU1PUlkgJiYKLQkJICAgIG1kLT50eXBlICE9IEVGSV9MT0FERVJfREFUQSAmJgotCQkgICAgbWQtPnR5cGUgIT0gRUZJX0xPQURFUl9DT0RFKQotCQkJY29udGludWU7Ci0KLQkJcGZuID0gbWQtPnBoeXNfYWRkciA+PiBQQUdFX1NISUZUOwotCQlucGFnZXMgPSBtZC0+bnVtX3BhZ2VzOwotCi0JCWlmIChrZXJuZWxfbWFwX3BhZ2VzX2luX3BnZChwZ2QsIHBmbiwgbWQtPnBoeXNfYWRkciwgbnBhZ2VzLCBfUEFHRV9SVykpIHsKLQkJCXByX2VycigiRmFpbGVkIHRvIG1hcCAxOjEgbWVtb3J5XG4iKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCiAJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTHxfX0dGUF9ETUEzMik7CiAJaWYgKCFwYWdlKQogCQlwYW5pYygiVW5hYmxlIHRvIGFsbG9jYXRlIEVGSSBydW50aW1lIHN0YWNrIDwgNEdCXG4iKTsKQEAgLTM1OSw2ICszMzksNyBAQAogICovCiB2b2lkIF9faW5pdCBlZmlfbWFwX3JlZ2lvbl9maXhlZChlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpCiB7CisJX19tYXBfcmVnaW9uKG1kLCBtZC0+cGh5c19hZGRyKTsKIAlfX21hcF9yZWdpb24obWQsIG1kLT52aXJ0X2FkZHIpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvcXVpcmtzLmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvcXVpcmtzLmMKaW5kZXggODlkMTE0Ni4uMTBhY2E2MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL3F1aXJrcy5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9xdWlya3MuYwpAQCAtMTY0LDYgKzE2NCw3NSBAQAogRVhQT1JUX1NZTUJPTF9HUEwoZWZpX3F1ZXJ5X3ZhcmlhYmxlX3N0b3JlKTsKIAogLyoKKyAqIFRoZSBVRUZJIHNwZWNpZmljYXRpb24gbWFrZXMgaXQgY2xlYXIgdGhhdCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcworICogZnJlZSB0byBkbyB3aGF0ZXZlciBpdCB3YW50cyB3aXRoIGJvb3Qgc2VydmljZXMgY29kZSBhZnRlcgorICogRXhpdEJvb3RTZXJ2aWNlcygpIGhhcyBiZWVuIGNhbGxlZC4gSWdub3JpbmcgdGhpcyByZWNvbW1lbmRhdGlvbiBhCisgKiBzaWduaWZpY2FudCBidW5jaCBvZiBFRkkgaW1wbGVtZW50YXRpb25zIGNvbnRpbnVlIGNhbGxpbmcgaW50byBib290CisgKiBzZXJ2aWNlcyBjb2RlIChTZXRWaXJ0dWFsQWRkcmVzc01hcCkuIEluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIHN1Y2gKKyAqIGJ1Z2d5IGltcGxlbWVudGF0aW9ucyB3ZSByZXNlcnZlIGJvb3Qgc2VydmljZXMgcmVnaW9uIGR1cmluZyBFRkkKKyAqIGluaXQgYW5kIG1ha2Ugc3VyZSBpdCBzdGF5cyBleGVjdXRhYmxlLiBUaGVuLCBhZnRlcgorICogU2V0VmlydHVhbEFkZHJlc3NNYXAoKSwgaXQgaXMgZGlzY2FyZGVkLgorICoKKyAqIEhvd2V2ZXIsIHNvbWUgYm9vdCBzZXJ2aWNlcyByZWdpb25zIGNvbnRhaW4gZGF0YSB0aGF0IGlzIHJlcXVpcmVkCisgKiBieSBkcml2ZXJzLCBzbyB3ZSBuZWVkIHRvIHRyYWNrIHdoaWNoIG1lbW9yeSByYW5nZXMgY2FuIG5ldmVyIGJlCisgKiBmcmVlZC4gVGhpcyBpcyBkb25lIGJ5IHRhZ2dpbmcgdGhvc2UgcmVnaW9ucyB3aXRoIHRoZQorICogRUZJX01FTU9SWV9SVU5USU1FIGF0dHJpYnV0ZS4KKyAqCisgKiBBbnkgZHJpdmVyIHRoYXQgd2FudHMgdG8gbWFyayBhIHJlZ2lvbiBhcyByZXNlcnZlZCBtdXN0IHVzZQorICogZWZpX21lbV9yZXNlcnZlKCkgd2hpY2ggd2lsbCBpbnNlcnQgYSBuZXcgRUZJIG1lbW9yeSBkZXNjcmlwdG9yCisgKiBpbnRvIGVmaS5tZW1tYXAgKHNwbGl0dGluZyBleGlzdGluZyByZWdpb25zIGlmIG5lY2Vzc2FyeSkgYW5kIHRhZworICogaXQgd2l0aCBFRklfTUVNT1JZX1JVTlRJTUUuCisgKi8KK3ZvaWQgX19pbml0IGVmaV9hcmNoX21lbV9yZXNlcnZlKHBoeXNfYWRkcl90IGFkZHIsIHU2NCBzaXplKQoreworCXBoeXNfYWRkcl90IG5ld19waHlzLCBuZXdfc2l6ZTsKKwlzdHJ1Y3QgZWZpX21lbV9yYW5nZSBtcjsKKwllZmlfbWVtb3J5X2Rlc2NfdCBtZDsKKwlpbnQgbnVtX2VudHJpZXM7CisJdm9pZCAqbmV3OworCisJaWYgKGVmaV9tZW1fZGVzY19sb29rdXAoYWRkciwgJm1kKSkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBsb29rdXAgRUZJIG1lbW9yeSBkZXNjcmlwdG9yIGZvciAlcGFcbiIsICZhZGRyKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChhZGRyICsgc2l6ZSA+IG1kLnBoeXNfYWRkciArIChtZC5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpKSB7CisJCXByX2VycigiUmVnaW9uIHNwYW5zIEVGSSBtZW1vcnkgZGVzY3JpcHRvcnMsICVwYVxuIiwgJmFkZHIpOworCQlyZXR1cm47CisJfQorCisJc2l6ZSArPSBhZGRyICUgRUZJX1BBR0VfU0laRTsKKwlzaXplID0gcm91bmRfdXAoc2l6ZSwgRUZJX1BBR0VfU0laRSk7CisJYWRkciA9IHJvdW5kX2Rvd24oYWRkciwgRUZJX1BBR0VfU0laRSk7CisKKwltci5yYW5nZS5zdGFydCA9IGFkZHI7CisJbXIucmFuZ2UuZW5kID0gYWRkciArIHNpemUgLSAxOworCW1yLmF0dHJpYnV0ZSA9IG1kLmF0dHJpYnV0ZSB8IEVGSV9NRU1PUllfUlVOVElNRTsKKworCW51bV9lbnRyaWVzID0gZWZpX21lbW1hcF9zcGxpdF9jb3VudCgmbWQsICZtci5yYW5nZSk7CisJbnVtX2VudHJpZXMgKz0gZWZpLm1lbW1hcC5ucl9tYXA7CisKKwluZXdfc2l6ZSA9IGVmaS5tZW1tYXAuZGVzY19zaXplICogbnVtX2VudHJpZXM7CisKKwluZXdfcGh5cyA9IG1lbWJsb2NrX2FsbG9jKG5ld19zaXplLCAwKTsKKwlpZiAoIW5ld19waHlzKSB7CisJCXByX2VycigiQ291bGQgbm90IGFsbG9jYXRlIGJvb3Qgc2VydmljZXMgbWVtbWFwXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW5ldyA9IGVhcmx5X21lbXJlbWFwKG5ld19waHlzLCBuZXdfc2l6ZSk7CisJaWYgKCFuZXcpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gbWFwIG5ldyBib290IHNlcnZpY2VzIG1lbW1hcFxuIik7CisJCXJldHVybjsKKwl9CisKKwllZmlfbWVtbWFwX2luc2VydCgmZWZpLm1lbW1hcCwgbmV3LCAmbXIpOworCWVhcmx5X21lbXVubWFwKG5ldywgbmV3X3NpemUpOworCisJZWZpX21lbW1hcF9pbnN0YWxsKG5ld19waHlzLCBudW1fZW50cmllcyk7Cit9CisKKy8qCiAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGVmaV9yZXNlcnZlX2Jvb3Rfc2VydmljZXMoKSB0byBmaWd1cmUgb3V0IGlmIHdlCiAgKiBjYW4gZnJlZSByZWdpb25zIGluIGVmaV9mcmVlX2Jvb3Rfc2VydmljZXMoKS4KICAqCkBAIC0xODQsMTUgKzI1Myw2IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLS8qCi0gKiBUaGUgVUVGSSBzcGVjaWZpY2F0aW9uIG1ha2VzIGl0IGNsZWFyIHRoYXQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgZnJlZSB0byBkbwotICogd2hhdGV2ZXIgaXQgd2FudHMgd2l0aCBib290IHNlcnZpY2VzIGNvZGUgYWZ0ZXIgRXhpdEJvb3RTZXJ2aWNlcygpIGhhcyBiZWVuCi0gKiBjYWxsZWQuIElnbm9yaW5nIHRoaXMgcmVjb21tZW5kYXRpb24gYSBzaWduaWZpY2FudCBidW5jaCBvZiBFRkkgaW1wbGVtZW50YXRpb25zIAotICogY29udGludWUgY2FsbGluZyBpbnRvIGJvb3Qgc2VydmljZXMgY29kZSAoU2V0VmlydHVhbEFkZHJlc3NNYXApLiBJbiBvcmRlciB0byAKLSAqIHdvcmsgYXJvdW5kIHN1Y2ggYnVnZ3kgaW1wbGVtZW50YXRpb25zIHdlIHJlc2VydmUgYm9vdCBzZXJ2aWNlcyByZWdpb24gZHVyaW5nIAotICogRUZJIGluaXQgYW5kIG1ha2Ugc3VyZSBpdCBzdGF5cyBleGVjdXRhYmxlLiBUaGVuLCBhZnRlciBTZXRWaXJ0dWFsQWRkcmVzc01hcCgpLCBpdAotKiBpcyBkaXNjYXJkZWQuCi0qLwogdm9pZCBfX2luaXQgZWZpX3Jlc2VydmVfYm9vdF9zZXJ2aWNlcyh2b2lkKQogewogCWVmaV9tZW1vcnlfZGVzY190ICptZDsKQEAgLTI0OSw3ICszMDksMTAgQEAKIAogdm9pZCBfX2luaXQgZWZpX2ZyZWVfYm9vdF9zZXJ2aWNlcyh2b2lkKQogeworCXBoeXNfYWRkcl90IG5ld19waHlzLCBuZXdfc2l6ZTsKIAllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CisJaW50IG51bV9lbnRyaWVzID0gMDsKKwl2b2lkICpuZXcsICpuZXdfbWQ7CiAKIAlmb3JfZWFjaF9lZmlfbWVtb3J5X2Rlc2MobWQpIHsKIAkJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0ID0gbWQtPnBoeXNfYWRkcjsKQEAgLTI1NywxMiArMzIwLDE2IEBACiAJCXNpemVfdCBybV9zaXplOwogCiAJCWlmIChtZC0+dHlwZSAhPSBFRklfQk9PVF9TRVJWSUNFU19DT0RFICYmCi0JCSAgICBtZC0+dHlwZSAhPSBFRklfQk9PVF9TRVJWSUNFU19EQVRBKQorCQkgICAgbWQtPnR5cGUgIT0gRUZJX0JPT1RfU0VSVklDRVNfREFUQSkgeworCQkJbnVtX2VudHJpZXMrKzsKIAkJCWNvbnRpbnVlOworCQl9CiAKIAkJLyogRG8gbm90IGZyZWUsIHNvbWVvbmUgZWxzZSBvd25zIGl0OiAqLwotCQlpZiAobWQtPmF0dHJpYnV0ZSAmIEVGSV9NRU1PUllfUlVOVElNRSkKKwkJaWYgKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1JVTlRJTUUpIHsKKwkJCW51bV9lbnRyaWVzKys7CiAJCQljb250aW51ZTsKKwkJfQogCiAJCS8qCiAJCSAqIE5hc3R5IHF1aXJrOiBpZiBhbGwgc3ViLTFNQiBtZW1vcnkgaXMgdXNlZCBmb3IgYm9vdApAQCAtMjg3LDcgKzM1NCw0MSBAQAogCQlmcmVlX2Jvb3RtZW1fbGF0ZShzdGFydCwgc2l6ZSk7CiAJfQogCi0JZWZpX3VubWFwX21lbW1hcCgpOworCW5ld19zaXplID0gZWZpLm1lbW1hcC5kZXNjX3NpemUgKiBudW1fZW50cmllczsKKwluZXdfcGh5cyA9IG1lbWJsb2NrX2FsbG9jKG5ld19zaXplLCAwKTsKKwlpZiAoIW5ld19waHlzKSB7CisJCXByX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBFRkkgbWVtbWFwXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW5ldyA9IG1lbXJlbWFwKG5ld19waHlzLCBuZXdfc2l6ZSwgTUVNUkVNQVBfV0IpOworCWlmICghbmV3KSB7CisJCXByX2VycigiRmFpbGVkIHRvIG1hcCBuZXcgRUZJIG1lbW1hcFxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEJ1aWxkIGEgbmV3IEVGSSBtZW1tYXAgdGhhdCBleGNsdWRlcyBhbnkgYm9vdCBzZXJ2aWNlcworCSAqIHJlZ2lvbnMgdGhhdCBhcmUgbm90IHRhZ2dlZCBFRklfTUVNT1JZX1JVTlRJTUUsIHNpbmNlIHRob3NlCisJICogcmVnaW9ucyBoYXZlIG5vdyBiZWVuIGZyZWVkLgorCSAqLworCW5ld19tZCA9IG5ldzsKKwlmb3JfZWFjaF9lZmlfbWVtb3J5X2Rlc2MobWQpIHsKKwkJaWYgKCEobWQtPmF0dHJpYnV0ZSAmIEVGSV9NRU1PUllfUlVOVElNRSkgJiYKKwkJICAgIChtZC0+dHlwZSA9PSBFRklfQk9PVF9TRVJWSUNFU19DT0RFIHx8CisJCSAgICAgbWQtPnR5cGUgPT0gRUZJX0JPT1RfU0VSVklDRVNfREFUQSkpCisJCQljb250aW51ZTsKKworCQltZW1jcHkobmV3X21kLCBtZCwgZWZpLm1lbW1hcC5kZXNjX3NpemUpOworCQluZXdfbWQgKz0gZWZpLm1lbW1hcC5kZXNjX3NpemU7CisJfQorCisJbWVtdW5tYXAobmV3KTsKKworCWlmIChlZmlfbWVtbWFwX2luc3RhbGwobmV3X3BoeXMsIG51bV9lbnRyaWVzKSkgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBpbnN0YWxsIG5ldyBFRkkgbWVtbWFwXG4iKTsKKwkJcmV0dXJuOworCX0KIH0KIAogLyoKQEAgLTM2NSw3ICs0NjYsNyBAQAogCSAqLwogCWlmICghZWZpX3J1bnRpbWVfc3VwcG9ydGVkKCkpIHsKIAkJcHJfaW5mbygiU2V0dXAgZG9uZSwgZGlzYWJsaW5nIGR1ZSB0byAzMi82NC1iaXQgbWlzbWF0Y2hcbiIpOwotCQllZmlfdW5tYXBfbWVtbWFwKCk7CisJCWVmaV9tZW1tYXBfdW5tYXAoKTsKIAl9CiAKIAkvKiBVVjIrIEJJT1MgaGFzIGEgZml4IGZvciB0aGlzIGlzc3VlLiAgVVYxIHN0aWxsIG5lZWRzIHRoZSBxdWlyay4gKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9NYWtlZmlsZSBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9NYWtlZmlsZQppbmRleCBmYzEzNWJmLi40MjlkMDhiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvZGV2aWNlX2xpYnMvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL2RldmljZV9saWJzL01ha2VmaWxlCkBAIC0xLDUgKzEsOSBAQAogIyBGYW1pbHktTGV2ZWwgSW50ZXJmYWNlIFNoaW0gKEZMSVMpCiBvYmotJChzdWJzdCBtLHksJChDT05GSUdfUElOQ1RSTF9NRVJSSUZJRUxEKSkgKz0gcGxhdGZvcm1fbXJmbGRfcGluY3RybC5vCisjIFNESENJIERldmljZXMKK29iai0kKHN1YnN0IG0seSwkKENPTkZJR19NTUNfU0RIQ0lfUENJKSkgKz0gcGxhdGZvcm1fbXJmbGRfc2QubworIyBXaUZpCitvYmotJChzdWJzdCBtLHksJChDT05GSUdfQlJDTUZNQUNfU0RJTykpICs9IHBsYXRmb3JtX2JjbTQzeHgubwogIyBJUEMgRGV2aWNlcwogb2JqLXkgKz0gcGxhdGZvcm1faXBjLm8KIG9iai0kKHN1YnN0IG0seSwkKENPTkZJR19NRkRfSU5URUxfTVNJQykpICs9IHBsYXRmb3JtX21zaWMubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL2RldmljZV9saWJzL3BsYXRmb3JtX2JjbTQzeHguYyBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9wbGF0Zm9ybV9iY200M3h4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM5MmMxNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9wbGF0Zm9ybV9iY200M3h4LmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIHBsYXRmb3JtX2JjbTQzeHguYzogYmNtNDN4eCBwbGF0Zm9ybSBkYXRhIGluaXRpbGl6YXRpb24gZmlsZQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBBbmR5IFNoZXZjaGVua28gPGFuZHJpeS5zaGV2Y2hlbmtvQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9maXhlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NmaS5oPgorCisjaW5jbHVkZSA8YXNtL2ludGVsLW1pZC5oPgorCisjZGVmaW5lIFdMQU5fU0ZJX0dQSU9fSVJRX05BTUUJCSJXTEFOLWludGVycnVwdCIKKyNkZWZpbmUgV0xBTl9TRklfR1BJT19FTkFCTEVfTkFNRQkiV0xBTi1lbmFibGUiCisKKyNkZWZpbmUgV0xBTl9ERVZfTkFNRQkJCSIwMDAwOjAwOjAxLjMiCisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBiY200M3h4X3ZtbWNfc3VwcGx5ID0geworCS5kZXZfbmFtZQkJPSBXTEFOX0RFVl9OQU1FLAorCS5zdXBwbHkJCQk9ICJ2bW1jIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBiY200M3h4X3ZtbWNfZGF0YSA9IHsKKwkuY29uc3RyYWludHMgPSB7CisJCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAorCS5jb25zdW1lcl9zdXBwbGllcwk9ICZiY200M3h4X3ZtbWNfc3VwcGx5LAorfTsKKworc3RhdGljIHN0cnVjdCBmaXhlZF92b2x0YWdlX2NvbmZpZyBiY200M3h4X3ZtbWMgPSB7CisJLnN1cHBseV9uYW1lCQk9ICJiY200M3h4LXZtbWMtcmVndWxhdG9yIiwKKwkvKgorCSAqIEFubm91bmNlIDIuMFYgaGVyZSB0byBiZSBjb21wYXRpYmxlIHdpdGggU0RJTyBzcGVjaWZpY2F0aW9uLiBUaGUKKwkgKiByZWFsIHZvbHRhZ2UgYW5kIHNpZ25hbGluZyBhcmUgc3RpbGwgMS44Vi4KKwkgKi8KKwkubWljcm92b2x0cwkJPSAyMDAwMDAwLAkJLyogMS44ViAqLworCS5ncGlvCQkJPSAtRUlOVkFMLAorCS5zdGFydHVwX2RlbGF5CQk9IDI1MCAqIDEwMDAsCQkvKiAyNTBtcyAqLworCS5lbmFibGVfaGlnaAkJPSAxLAkJCS8qIGFjdGl2ZSBoaWdoICovCisJLmVuYWJsZWRfYXRfYm9vdAk9IDAsCQkJLyogZGlzYWJsZWQgYXQgYm9vdCAqLworCS5pbml0X2RhdGEJCT0gJmJjbTQzeHhfdm1tY19kYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmNtNDN4eF92bW1jX3JlZ3VsYXRvciA9IHsKKwkubmFtZQkJPSAicmVnLWZpeGVkLXZvbHRhZ2UiLAorCS5pZAkJPSBQTEFURk9STV9ERVZJRF9BVVRPLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmJjbTQzeHhfdm1tYywKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYmNtNDN4eF9yZWd1bGF0b3JfcmVnaXN0ZXIodm9pZCkKK3sKKwlpbnQgcmV0OworCisJYmNtNDN4eF92bW1jLmdwaW8gPSBnZXRfZ3Bpb19ieV9uYW1lKFdMQU5fU0ZJX0dQSU9fRU5BQkxFX05BTUUpOworCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYmNtNDN4eF92bW1jX3JlZ3VsYXRvcik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiB2bW1jIHJlZ3VsYXRvciByZWdpc3RlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19pbml0ICpiY200M3h4X3BsYXRmb3JtX2RhdGEodm9pZCAqaW5mbykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gYmNtNDN4eF9yZWd1bGF0b3JfcmVnaXN0ZXIoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gTlVMTDsKKworCXByX2luZm8oIlVzaW5nIGdlbmVyaWMgd2lmaSBwbGF0Zm9ybSBkYXRhXG4iKTsKKworCS8qIEZvciBub3cgaXQncyBlbXB0eSAqLworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldnNfaWQgYmNtNDN4eF9jbGtfdm1tY19kZXZfaWQgX19pbml0Y29uc3QgPSB7CisJLm5hbWUJCQk9ICJiY200M3h4X2Nsa192bW1jIiwKKwkudHlwZQkJCT0gU0ZJX0RFVl9UWVBFX1NELAorCS5nZXRfcGxhdGZvcm1fZGF0YQk9ICZiY200M3h4X3BsYXRmb3JtX2RhdGEsCit9OworCitzZmlfZGV2aWNlKGJjbTQzeHhfY2xrX3ZtbWNfZGV2X2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9wbGF0Zm9ybV9tcmZsZF9zZC5jIGIvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL2RldmljZV9saWJzL3BsYXRmb3JtX21yZmxkX3NkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjNGEwMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9wbGF0Zm9ybV9tcmZsZF9zZC5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBTREhDSSBwbGF0Zm9ybSBkYXRhIGluaXRpbGlzYXRpb24gZmlsZQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBBbmR5IFNoZXZjaGVua28gPGFuZHJpeS5zaGV2Y2hlbmtvQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgPGxpbnV4L21tYy9zZGhjaS1wY2ktZGF0YS5oPgorCisjaW5jbHVkZSA8YXNtL2ludGVsLW1pZC5oPgorCisjZGVmaW5lIElOVEVMX01SRkxEX1NECQkJMgorI2RlZmluZSBJTlRFTF9NUkZMRF9TRF9DRF9HUElPCQk3NworCitzdGF0aWMgc3RydWN0IHNkaGNpX3BjaV9kYXRhIG1yZmxkX3NkaGNpX3BjaV9kYXRhID0geworCS5yc3Rfbl9ncGlvCT0gLUVJTlZBTCwKKwkuY2RfZ3Bpbwk9IElOVEVMX01SRkxEX1NEX0NEX0dQSU8sCit9OworCitzdGF0aWMgc3RydWN0IHNkaGNpX3BjaV9kYXRhICoKK21yZmxkX3NkaGNpX3BjaV9nZXRfZGF0YShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHNsb3RubykKK3sKKwl1bnNpZ25lZCBpbnQgZnVuYyA9IFBDSV9GVU5DKHBkZXYtPmRldmZuKTsKKworCWlmIChmdW5jID09IElOVEVMX01SRkxEX1NEKQorCQlyZXR1cm4gJm1yZmxkX3NkaGNpX3BjaV9kYXRhOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1yZmxkX3NkX2luaXQodm9pZCkKK3sKKwlpZiAoaW50ZWxfbWlkX2lkZW50aWZ5X2NwdSgpICE9IElOVEVMX01JRF9DUFVfQ0hJUF9UQU5HSUVSKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNkaGNpX3BjaV9nZXRfZGF0YSA9IG1yZmxkX3NkaGNpX3BjaV9nZXRfZGF0YTsKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwobXJmbGRfc2RfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvaW50ZWwtbWlkLmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvaW50ZWwtbWlkLmMKaW5kZXggY2UxMTlkMi4uNzg1MDEyOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL2ludGVsLW1pZC5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9pbnRlbC1taWQuYwpAQCAtNzAsNiArNzAsMTEgQEAKIAogc3RhdGljIHZvaWQgaW50ZWxfbWlkX3Bvd2VyX29mZih2b2lkKQogeworCS8qIFNodXQgZG93biBTb3V0aCBDb21wbGV4IHZpYSBQV1JNVSAqLworCWludGVsX21pZF9wd3JfcG93ZXJfb2ZmKCk7CisKKwkvKiBPbmx5IGZvciBUYW5naWVyLCB0aGUgcmVzdCB3aWxsIGlnbm9yZSB0aGlzIGNvbW1hbmQgKi8KKwlpbnRlbF9zY3VfaXBjX3NpbXBsZV9jb21tYW5kKElQQ01TR19DT0xEX09GRiwgMSk7CiB9OwogCiBzdGF0aWMgdm9pZCBpbnRlbF9taWRfcmVib290KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvcHdyLmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvcHdyLmMKaW5kZXggYzkwMWEzNC4uNWQzYjQ1YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL3B3ci5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9wd3IuYwpAQCAtNDQsNyArNDQsMTkgQEAKIC8qIEJpdHMgaW4gUE1fQ01EICovCiAjZGVmaW5lIFBNX0NNRF9DTUQoeCkJCSgoeCkgPDwgMCkKICNkZWZpbmUgUE1fQ01EX0lPQwkJKDEgPDwgOCkKLSNkZWZpbmUgUE1fQ01EX0QzY29sZAkJKDEgPDwgMjEpCisjZGVmaW5lIFBNX0NNRF9DTV9OT1AJCSgwIDw8IDkpCisjZGVmaW5lIFBNX0NNRF9DTV9JTU1FRElBVEUJKDEgPDwgOSkKKyNkZWZpbmUgUE1fQ01EX0NNX0RFTEFZCQkoMiA8PCA5KQorI2RlZmluZSBQTV9DTURfQ01fVFJJR0dFUgkoMyA8PCA5KQorCisvKiBTeXN0ZW0gc3RhdGVzICovCisjZGVmaW5lIFBNX0NNRF9TWVNfU1RBVEVfUzUJKDUgPDwgMTYpCisKKy8qIFRyaWdnZXIgdmFyaWFudHMgKi8KKyNkZWZpbmUgUE1fQ01EX0NGR19UUklHR0VSX05DCSgzIDw8IDE5KQorCisvKiBNZXNzYWdlIHRvIHdhaXQgZm9yIFRSSUdHRVJfTkMgY2FzZSAqLworI2RlZmluZSBUUklHR0VSX05DX01TR18yCSgyIDw8IDIyKQogCiAvKiBMaXN0IG9mIGNvbW1hbmRzICovCiAjZGVmaW5lIENNRF9TRVRfQ0ZHCQkweDAxCkBAIC0xMzcsNyArMTQ5LDcgQEAKIAogc3RhdGljIGludCBtaWRfcHdyX3dhaXRfZm9yX2NtZChzdHJ1Y3QgbWlkX3B3ciAqcHdyLCB1OCBjbWQpCiB7Ci0Jd3JpdGVsKFBNX0NNRF9DTUQoY21kKSwgcHdyLT5yZWdzICsgUE1fQ01EKTsKKwl3cml0ZWwoUE1fQ01EX0NNRChjbWQpIHwgUE1fQ01EX0NNX0lNTUVESUFURSwgcHdyLT5yZWdzICsgUE1fQ01EKTsKIAlyZXR1cm4gbWlkX3B3cl93YWl0KHB3cik7CiB9CiAKQEAgLTI2MCw2ICsyNzIsMjAgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGludGVsX21pZF9wY2lfc2V0X3Bvd2VyX3N0YXRlKTsKIAordm9pZCBpbnRlbF9taWRfcHdyX3Bvd2VyX29mZih2b2lkKQoreworCXN0cnVjdCBtaWRfcHdyICpwd3IgPSBtaWRwd3I7CisJdTMyIGNtZCA9IFBNX0NNRF9TWVNfU1RBVEVfUzUgfAorCQkgIFBNX0NNRF9DTUQoQ01EX1NFVF9DRkcpIHwKKwkJICBQTV9DTURfQ01fVFJJR0dFUiB8CisJCSAgUE1fQ01EX0NGR19UUklHR0VSX05DIHwKKwkJICBUUklHR0VSX05DX01TR18yOworCisJLyogU2VuZCBjb21tYW5kIHRvIFNDVSAqLworCXdyaXRlbChjbWQsIHB3ci0+cmVncyArIFBNX0NNRCk7CisJbWlkX3B3cl93YWl0KHB3cik7Cit9CisKIGludCBpbnRlbF9taWRfcHdyX2dldF9sc3NfaWQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJaW50IHZuZHI7CkBAIC0zNTQsNyArMzgwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtaWRfc2V0X2luaXRpYWxfc3RhdGUoc3RydWN0IG1pZF9wd3IgKnB3cikKK3N0YXRpYyBpbnQgbWlkX3NldF9pbml0aWFsX3N0YXRlKHN0cnVjdCBtaWRfcHdyICpwd3IsIGNvbnN0IHUzMiAqc3RhdGVzKQogewogCXVuc2lnbmVkIGludCBpLCBqOwogCWludCByZXQ7CkBAIC0zNzksMTAgKzQwNSwxMCBAQAogCSAqIE5PVEU6IFRoZSBhY3R1YWwgZGV2aWNlIG1hcHBpbmcgaXMgcHJvdmlkZWQgYnkgYSBwbGF0Zm9ybSBhdCBydW4KIAkgKiB0aW1lIHVzaW5nIHZlbmRvciBjYXBhYmlsaXR5IG9mIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlLgogCSAqLwotCW1pZF9wd3Jfc2V0X3N0YXRlKHB3ciwgMCwgMHhmZmZmZmZmZik7Ci0JbWlkX3B3cl9zZXRfc3RhdGUocHdyLCAxLCAweGZmZmZmZmZmKTsKLQltaWRfcHdyX3NldF9zdGF0ZShwd3IsIDIsIDB4ZmZmZmZmZmYpOwotCW1pZF9wd3Jfc2V0X3N0YXRlKHB3ciwgMywgMHhmZmZmZmZmZik7CisJbWlkX3B3cl9zZXRfc3RhdGUocHdyLCAwLCBzdGF0ZXNbMF0pOworCW1pZF9wd3Jfc2V0X3N0YXRlKHB3ciwgMSwgc3RhdGVzWzFdKTsKKwltaWRfcHdyX3NldF9zdGF0ZShwd3IsIDIsIHN0YXRlc1syXSk7CisJbWlkX3B3cl9zZXRfc3RhdGUocHdyLCAzLCBzdGF0ZXNbM10pOwogCiAJLyogU2VuZCBjb21tYW5kIHRvIFNDVSAqLwogCXJldCA9IG1pZF9wd3Jfd2FpdF9mb3JfY21kKHB3ciwgQ01EX1NFVF9DRkcpOwpAQCAtMzk3LDEzICs0MjMsNDEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBtaWRfcHdyX2RldmljZV9pbmZvIG1pZF9pbmZvID0gewotCS5zZXRfaW5pdGlhbF9zdGF0ZSA9IG1pZF9zZXRfaW5pdGlhbF9zdGF0ZSwKK3N0YXRpYyBpbnQgcG53X3NldF9pbml0aWFsX3N0YXRlKHN0cnVjdCBtaWRfcHdyICpwd3IpCit7CisJLyogT24gUGVud2VsbCBTUkFNIG11c3Qgc3RheSBwb3dlcmVkIG9uICovCisJY29uc3QgdTMyIHN0YXRlc1tdID0geworCQkweGYwMGZmZmZmLAkJLyogUE1fU1NDKDApICovCisJCTB4ZmZmZmZmZmYsCQkvKiBQTV9TU0MoMSkgKi8KKwkJMHhmZmZmZmZmZiwJCS8qIFBNX1NTQygyKSAqLworCQkweGZmZmZmZmZmLAkJLyogUE1fU1NDKDMpICovCisJfTsKKwlyZXR1cm4gbWlkX3NldF9pbml0aWFsX3N0YXRlKHB3ciwgc3RhdGVzKTsKK30KKworc3RhdGljIGludCB0bmdfc2V0X2luaXRpYWxfc3RhdGUoc3RydWN0IG1pZF9wd3IgKnB3cikKK3sKKwljb25zdCB1MzIgc3RhdGVzW10gPSB7CisJCTB4ZmZmZmZmZmYsCQkvKiBQTV9TU0MoMCkgKi8KKwkJMHhmZmZmZmZmZiwJCS8qIFBNX1NTQygxKSAqLworCQkweGZmZmZmZmZmLAkJLyogUE1fU1NDKDIpICovCisJCTB4ZmZmZmZmZmYsCQkvKiBQTV9TU0MoMykgKi8KKwl9OworCXJldHVybiBtaWRfc2V0X2luaXRpYWxfc3RhdGUocHdyLCBzdGF0ZXMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1pZF9wd3JfZGV2aWNlX2luZm8gcG53X2luZm8gPSB7CisJLnNldF9pbml0aWFsX3N0YXRlID0gcG53X3NldF9pbml0aWFsX3N0YXRlLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBtaWRfcHdyX2RldmljZV9pbmZvIHRuZ19pbmZvID0geworCS5zZXRfaW5pdGlhbF9zdGF0ZSA9IHRuZ19zZXRfaW5pdGlhbF9zdGF0ZSwKK307CisKKy8qIFRoaXMgdGFibGUgc2hvdWxkIGJlIGluIHN5bmMgd2l0aCB0aGUgb25lIGluIGRyaXZlcnMvcGNpL3BjaS1taWQuYyAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIG1pZF9wd3JfcGNpX2lkc1tdID0gewotCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfUEVOV0VMTCksIChrZXJuZWxfdWxvbmdfdCkmbWlkX2luZm8gfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCBQQ0lfREVWSUNFX0lEX1RBTkdJRVIpLCAoa2VybmVsX3Vsb25nX3QpJm1pZF9pbmZvIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9QRU5XRUxMKSwgKGtlcm5lbF91bG9uZ190KSZwbndfaW5mbyB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfVEFOR0lFUiksIChrZXJuZWxfdWxvbmdfdCkmdG5nX2luZm8gfSwKIAl7fQogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vbWVsbGFub3gvTWFrZWZpbGUgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9tZWxsYW5veC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDNjOTMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vbWVsbGFub3gvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLSQoQ09ORklHX01MWF9QTEFURk9STSkJKz0gbWx4LXBsYXRmb3JtLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL21lbGxhbm94L21seC1wbGF0Zm9ybS5jIGIvYXJjaC94ODYvcGxhdGZvcm0vbWVsbGFub3gvbWx4LXBsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjZmNjYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL21lbGxhbm94L21seC1wbGF0Zm9ybS5jCkBAIC0wLDAgKzEsMjY2IEBACisvKgorICogYXJjaC94ODYvcGxhdGZvcm0vbWVsbGFub3gvbWx4LXBsYXRmb3JtLmMKKyAqIENvcHlyaWdodCAoYykgMjAxNiBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgVmFkaW0gUGFzdGVybmFrIDx2YWRpbXBAbWVsbGFub3guY29tPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLW11eC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvaTJjLW11eC1yZWcuaD4KKworI2RlZmluZSBNTFhfUExBVF9ERVZJQ0VfTkFNRQkJIm1seHBsYXQiCisKKy8qIExQQyBidXMgSU8gb2Zmc2V0cyAqLworI2RlZmluZSBNTFhQTEFUX0NQTERfTFBDX0kyQ19CQVNFX0FEUlIJCTB4MjAwMAorI2RlZmluZSBNTFhQTEFUX0NQTERfTFBDX1JFR19CQVNFX0FEUlIJCTB4MjUwMAorI2RlZmluZSBNTFhQTEFUX0NQTERfTFBDX0lPX1JBTkdFCQkweDEwMAorI2RlZmluZSBNTFhQTEFUX0NQTERfTFBDX0kyQ19DSDFfT0ZGCQkweGRiCisjZGVmaW5lIE1MWFBMQVRfQ1BMRF9MUENfSTJDX0NIMl9PRkYJCTB4ZGEKKyNkZWZpbmUgTUxYUExBVF9DUExEX0xQQ19QSU9fT0ZGU0VUCQkweDEwMDAwVUwKKyNkZWZpbmUgTUxYUExBVF9DUExEX0xQQ19SRUcxCSgoTUxYUExBVF9DUExEX0xQQ19SRUdfQkFTRV9BRFJSICsgXAorCQkJCSAgTUxYUExBVF9DUExEX0xQQ19JMkNfQ0gxX09GRikgfCBcCisJCQkJICBNTFhQTEFUX0NQTERfTFBDX1BJT19PRkZTRVQpCisjZGVmaW5lIE1MWFBMQVRfQ1BMRF9MUENfUkVHMgkoKE1MWFBMQVRfQ1BMRF9MUENfUkVHX0JBU0VfQURSUiArIFwKKwkJCQkgIE1MWFBMQVRfQ1BMRF9MUENfSTJDX0NIMl9PRkYpIHwgXAorCQkJCSAgTUxYUExBVF9DUExEX0xQQ19QSU9fT0ZGU0VUKQorCisvKiBTdGFydCBjaGFubmVsIG51bWJlcnMgKi8KKyNkZWZpbmUgTUxYUExBVF9DUExEX0NIMQkJCTIKKyNkZWZpbmUgTUxYUExBVF9DUExEX0NIMgkJCTEwCisKKy8qIE51bWJlciBvZiBMUEMgYXR0YWNoZWQgTVVYIHBsYXRmb3JtIGRldmljZXMgKi8KKyNkZWZpbmUgTUxYUExBVF9DUExEX0xQQ19NVVhfREVWUwkJMgorCisvKiBtbHhwbGF0X3ByaXYgLSBwbGF0Zm9ybSBwcml2YXRlIGRhdGEKKyAqIEBwZGV2X2kyYyAtIGkyYyBjb250cm9sbGVyIHBsYXRmb3JtIGRldmljZQorICogQHBkZXZfbXV4IC0gYXJyYXkgb2YgbXV4IHBsYXRmb3JtIGRldmljZXMKKyAqLworc3RydWN0IG1seHBsYXRfcHJpdiB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldl9pMmM7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldl9tdXhbTUxYUExBVF9DUExEX0xQQ19NVVhfREVWU107Cit9OworCisvKiBSZWdpb25zIGZvciBMUEMgSTJDIGNvbnRyb2xsZXIgYW5kIExQQyBiYXNlIHJlZ2lzdGVyIHNwYWNlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlc291cmNlIG1seHBsYXRfbHBjX3Jlc291cmNlc1tdID0geworCVswXSA9IERFRklORV9SRVNfTkFNRUQoTUxYUExBVF9DUExEX0xQQ19JMkNfQkFTRV9BRFJSLAorCQkJICAgICAgIE1MWFBMQVRfQ1BMRF9MUENfSU9fUkFOR0UsCisJCQkgICAgICAgIm1seHBsYXRfY3BsZF9scGNfaTJjX2N0cmwiLCBJT1JFU09VUkNFX0lPKSwKKwlbMV0gPSBERUZJTkVfUkVTX05BTUVEKE1MWFBMQVRfQ1BMRF9MUENfUkVHX0JBU0VfQURSUiwKKwkJCSAgICAgICBNTFhQTEFUX0NQTERfTFBDX0lPX1JBTkdFLAorCQkJICAgICAgICJtbHhwbGF0X2NwbGRfbHBjX3JlZ3MiLAorCQkJICAgICAgIElPUkVTT1VSQ0VfSU8pLAorfTsKKworLyogUGxhdGZvcm0gZGVmYXVsdCBjaGFubmVscyAqLworc3RhdGljIGNvbnN0IGludCBtbHhwbGF0X2RlZmF1bHRfY2hhbm5lbHNbXVs4XSA9IHsKKwl7CisJCU1MWFBMQVRfQ1BMRF9DSDEsIE1MWFBMQVRfQ1BMRF9DSDEgKyAxLCBNTFhQTEFUX0NQTERfQ0gxICsgMiwKKwkJTUxYUExBVF9DUExEX0NIMSArIDMsIE1MWFBMQVRfQ1BMRF9DSDEgKyA0LCBNTFhQTEFUX0NQTERfQ0gxICsKKwkJNSwgTUxYUExBVF9DUExEX0NIMSArIDYsIE1MWFBMQVRfQ1BMRF9DSDEgKyA3CisJfSwKKwl7CisJCU1MWFBMQVRfQ1BMRF9DSDIsIE1MWFBMQVRfQ1BMRF9DSDIgKyAxLCBNTFhQTEFUX0NQTERfQ0gyICsgMiwKKwkJTUxYUExBVF9DUExEX0NIMiArIDMsIE1MWFBMQVRfQ1BMRF9DSDIgKyA0LCBNTFhQTEFUX0NQTERfQ0gyICsKKwkJNSwgTUxYUExBVF9DUExEX0NIMiArIDYsIE1MWFBMQVRfQ1BMRF9DSDIgKyA3CisJfSwKK307CisKKy8qIFBsYXRmb3JtIGNoYW5uZWxzIGZvciBNU04yMXh4IHN5c3RlbSBmYW1pbHkgKi8KK3N0YXRpYyBjb25zdCBpbnQgbWx4cGxhdF9tc24yMXh4X2NoYW5uZWxzW10gPSB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDggfTsKKworLyogUGxhdGZvcm0gbXV4IGRhdGEgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX211eF9yZWdfcGxhdGZvcm1fZGF0YSBtbHhwbGF0X211eF9kYXRhW10gPSB7CisJeworCQkucGFyZW50ID0gMSwKKwkJLmJhc2VfbnIgPSBNTFhQTEFUX0NQTERfQ0gxLAorCQkud3JpdGVfb25seSA9IDEsCisJCS5yZWcgPSAodm9pZCBfX2lvbWVtICopTUxYUExBVF9DUExEX0xQQ19SRUcxLAorCQkucmVnX3NpemUgPSAxLAorCQkuaWRsZV9pbl91c2UgPSAxLAorCX0sCisJeworCQkucGFyZW50ID0gMSwKKwkJLmJhc2VfbnIgPSBNTFhQTEFUX0NQTERfQ0gyLAorCQkud3JpdGVfb25seSA9IDEsCisJCS5yZWcgPSAodm9pZCBfX2lvbWVtICopTUxYUExBVF9DUExEX0xQQ19SRUcyLAorCQkucmVnX3NpemUgPSAxLAorCQkuaWRsZV9pbl91c2UgPSAxLAorCX0sCisKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICptbHhwbGF0X2RldjsKKworc3RhdGljIGludCBfX2luaXQgbWx4cGxhdF9kbWlfZGVmYXVsdF9tYXRjaGVkKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkbWkpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtbHhwbGF0X211eF9kYXRhKTsgaSsrKSB7CisJCW1seHBsYXRfbXV4X2RhdGFbaV0udmFsdWVzID0gbWx4cGxhdF9kZWZhdWx0X2NoYW5uZWxzW2ldOworCQltbHhwbGF0X211eF9kYXRhW2ldLm5fdmFsdWVzID0KKwkJCQlBUlJBWV9TSVpFKG1seHBsYXRfZGVmYXVsdF9jaGFubmVsc1tpXSk7CisJfQorCisJcmV0dXJuIDE7Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBtbHhwbGF0X2RtaV9tc24yMXh4X21hdGNoZWQoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmRtaSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1seHBsYXRfbXV4X2RhdGEpOyBpKyspIHsKKwkJbWx4cGxhdF9tdXhfZGF0YVtpXS52YWx1ZXMgPSBtbHhwbGF0X21zbjIxeHhfY2hhbm5lbHM7CisJCW1seHBsYXRfbXV4X2RhdGFbaV0ubl92YWx1ZXMgPQorCQkJCUFSUkFZX1NJWkUobWx4cGxhdF9tc24yMXh4X2NoYW5uZWxzKTsKKwl9CisKKwlyZXR1cm4gMTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBtbHhwbGF0X2RtaV90YWJsZVtdIF9faW5pdGRhdGEgPSB7CisJeworCQkuY2FsbGJhY2sgPSBtbHhwbGF0X2RtaV9kZWZhdWx0X21hdGNoZWQsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJNZWxsYW5veCBUZWNobm9sb2dpZXMiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTVNOMjQiKSwKKwkJfSwKKwl9LAorCXsKKwkJLmNhbGxiYWNrID0gbWx4cGxhdF9kbWlfZGVmYXVsdF9tYXRjaGVkLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiTWVsbGFub3ggVGVjaG5vbG9naWVzIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1TTjI3IiksCisJCX0sCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IG1seHBsYXRfZG1pX2RlZmF1bHRfbWF0Y2hlZCwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIk1lbGxhbm94IFRlY2hub2xvZ2llcyIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNU0IiKSwKKwkJfSwKKwl9LAorCXsKKwkJLmNhbGxiYWNrID0gbWx4cGxhdF9kbWlfZGVmYXVsdF9tYXRjaGVkLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiTWVsbGFub3ggVGVjaG5vbG9naWVzIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1TWCIpLAorCQl9LAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBtbHhwbGF0X2RtaV9tc24yMXh4X21hdGNoZWQsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJNZWxsYW5veCBUZWNobm9sb2dpZXMiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTVNOMjEiKSwKKwkJfSwKKwl9LAorCXsgfQorfTsKKworc3RhdGljIGludCBfX2luaXQgbWx4cGxhdF9pbml0KHZvaWQpCit7CisJc3RydWN0IG1seHBsYXRfcHJpdiAqcHJpdjsKKwlpbnQgaSwgZXJyOworCisJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKG1seHBsYXRfZG1pX3RhYmxlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltbHhwbGF0X2RldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoTUxYX1BMQVRfREVWSUNFX05BTUUsIC0xLAorCQkJCQltbHhwbGF0X2xwY19yZXNvdXJjZXMsCisJCQkJCUFSUkFZX1NJWkUobWx4cGxhdF9scGNfcmVzb3VyY2VzKSk7CisKKwlpZiAoSVNfRVJSKG1seHBsYXRfZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIobWx4cGxhdF9kZXYpOworCisJcHJpdiA9IGRldm1fa3phbGxvYygmbWx4cGxhdF9kZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBtbHhwbGF0X3ByaXYpLAorCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghcHJpdikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfYWxsb2M7CisJfQorCXBsYXRmb3JtX3NldF9kcnZkYXRhKG1seHBsYXRfZGV2LCBwcml2KTsKKworCXByaXYtPnBkZXZfaTJjID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiaTJjX21seGNwbGQiLCAtMSwKKwkJCQkJCQkgTlVMTCwgMCk7CisJaWYgKElTX0VSUihwcml2LT5wZGV2X2kyYykpIHsKKwkJZXJyID0gUFRSX0VSUihwcml2LT5wZGV2X2kyYyk7CisJCWdvdG8gZmFpbF9hbGxvYzsKKwl9OworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWx4cGxhdF9tdXhfZGF0YSk7IGkrKykgeworCQlwcml2LT5wZGV2X211eFtpXSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9yZXNuZGF0YSgKKwkJCQkJCSZtbHhwbGF0X2Rldi0+ZGV2LAorCQkJCQkJImkyYy1tdXgtcmVnIiwgaSwgTlVMTCwKKwkJCQkJCTAsICZtbHhwbGF0X211eF9kYXRhW2ldLAorCQkJCQkJc2l6ZW9mKG1seHBsYXRfbXV4X2RhdGFbaV0pKTsKKwkJaWYgKElTX0VSUihwcml2LT5wZGV2X211eFtpXSkpIHsKKwkJCWVyciA9IFBUUl9FUlIocHJpdi0+cGRldl9tdXhbaV0pOworCQkJZ290byBmYWlsX3BsYXRmb3JtX211eF9yZWdpc3RlcjsKKwkJfQorCX0KKworCXJldHVybiAwOworCitmYWlsX3BsYXRmb3JtX211eF9yZWdpc3RlcjoKKwlmb3IgKGktLTsgaSA+IDAgOyBpLS0pCisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHByaXYtPnBkZXZfbXV4W2ldKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihwcml2LT5wZGV2X2kyYyk7CitmYWlsX2FsbG9jOgorCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKG1seHBsYXRfZGV2KTsKKworCXJldHVybiBlcnI7Cit9Cittb2R1bGVfaW5pdChtbHhwbGF0X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbWx4cGxhdF9leGl0KHZvaWQpCit7CisJc3RydWN0IG1seHBsYXRfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKG1seHBsYXRfZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IEFSUkFZX1NJWkUobWx4cGxhdF9tdXhfZGF0YSkgLSAxOyBpID49IDAgOyBpLS0pCisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHByaXYtPnBkZXZfbXV4W2ldKTsKKworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHByaXYtPnBkZXZfaTJjKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihtbHhwbGF0X2Rldik7Cit9Cittb2R1bGVfZXhpdChtbHhwbGF0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJWYWRpbSBQYXN0ZXJuYWsgKHZhZGltcEBtZWxsYW5veC5jb20pIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1lbGxhbm94IHBsYXRmb3JtIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0FMSUFTKCJkbWk6KjoqTWVsbGFub3gqOk1TTjI0KjoiKTsKK01PRFVMRV9BTElBUygiZG1pOio6Kk1lbGxhbm94KjpNU04yNyo6Iik7CitNT0RVTEVfQUxJQVMoImRtaToqOipNZWxsYW5veCo6TVNCKjoiKTsKK01PRFVMRV9BTElBUygiZG1pOio6Kk1lbGxhbm94KjpNU1gqOiIpOworTU9EVUxFX0FMSUFTKCJkbWk6KjoqTWVsbGFub3gqOk1TTjIxKjoiKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL3V2L2Jpb3NfdXYuYyBiL2FyY2gveDg2L3BsYXRmb3JtL3V2L2Jpb3NfdXYuYwppbmRleCAyM2YyZjNlLi5iNGQ1ZTk1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS91di9iaW9zX3V2LmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vdXYvYmlvc191di5jCkBAIC0xNDksMTEgKzE0OSw4IEBACiBzNjQKIHV2X2Jpb3NfcmVzZXJ2ZWRfcGFnZV9wYSh1NjQgYnVmLCB1NjQgKmNvb2tpZSwgdTY0ICphZGRyLCB1NjQgKmxlbikKIHsKLQlzNjQgcmV0OwotCi0JcmV0ID0gdXZfYmlvc19jYWxsX2lycXNhdmUoVVZfQklPU19HRVRfUEFSVElUSU9OX0FERFIsICh1NjQpY29va2llLAotCQkJCQkodTY0KWFkZHIsIGJ1ZiwgKHU2NClsZW4sIDApOwotCXJldHVybiByZXQ7CisJcmV0dXJuIHV2X2Jpb3NfY2FsbF9pcnFzYXZlKFVWX0JJT1NfR0VUX1BBUlRJVElPTl9BRERSLCAodTY0KWNvb2tpZSwKKwkJCQkgICAgKHU2NClhZGRyLCBidWYsICh1NjQpbGVuLCAwKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHV2X2Jpb3NfcmVzZXJ2ZWRfcGFnZV9wYSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL3V2L3RsYl91di5jIGIvYXJjaC94ODYvcGxhdGZvcm0vdXYvdGxiX3V2LmMKaW5kZXggZmRiNGQ0Mi4uOWU0Mjg0MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vdXYvdGxiX3V2LmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vdXYvdGxiX3V2LmMKQEAgLTI0LDYgKzI0LDI5IEBACiAjaW5jbHVkZSA8YXNtL2lycV92ZWN0b3JzLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CiAKK3N0YXRpYyBzdHJ1Y3QgYmF1X29wZXJhdGlvbnMgb3BzOworCitzdGF0aWMgc3RydWN0IGJhdV9vcGVyYXRpb25zIHV2MTIzX2JhdV9vcHMgPSB7CisJLmJhdV9ncGFfdG9fb2Zmc2V0ICAgICAgID0gdXZfZ3BhX3RvX29mZnNldCwKKwkucmVhZF9sX3N3X2FjayAgICAgICAgICAgPSByZWFkX21tcl9zd19hY2ssCisJLnJlYWRfZ19zd19hY2sgICAgICAgICAgID0gcmVhZF9nbW1yX3N3X2FjaywKKwkud3JpdGVfbF9zd19hY2sgICAgICAgICAgPSB3cml0ZV9tbXJfc3dfYWNrLAorCS53cml0ZV9nX3N3X2FjayAgICAgICAgICA9IHdyaXRlX2dtbXJfc3dfYWNrLAorCS53cml0ZV9wYXlsb2FkX2ZpcnN0ICAgICA9IHdyaXRlX21tcl9wYXlsb2FkX2ZpcnN0LAorCS53cml0ZV9wYXlsb2FkX2xhc3QgICAgICA9IHdyaXRlX21tcl9wYXlsb2FkX2xhc3QsCit9OworCitzdGF0aWMgc3RydWN0IGJhdV9vcGVyYXRpb25zIHV2NF9iYXVfb3BzID0geworCS5iYXVfZ3BhX3RvX29mZnNldCAgICAgICA9IHV2X2dwYV90b19zb2NfcGh5c19yYW0sCisJLnJlYWRfbF9zd19hY2sgICAgICAgICAgID0gcmVhZF9tbXJfcHJvY19zd19hY2ssCisJLnJlYWRfZ19zd19hY2sgICAgICAgICAgID0gcmVhZF9nbW1yX3Byb2Nfc3dfYWNrLAorCS53cml0ZV9sX3N3X2FjayAgICAgICAgICA9IHdyaXRlX21tcl9wcm9jX3N3X2FjaywKKwkud3JpdGVfZ19zd19hY2sgICAgICAgICAgPSB3cml0ZV9nbW1yX3Byb2Nfc3dfYWNrLAorCS53cml0ZV9wYXlsb2FkX2ZpcnN0ICAgICA9IHdyaXRlX21tcl9wcm9jX3BheWxvYWRfZmlyc3QsCisJLndyaXRlX3BheWxvYWRfbGFzdCAgICAgID0gd3JpdGVfbW1yX3Byb2NfcGF5bG9hZF9sYXN0LAorfTsKKworCiAvKiB0aW1lb3V0cyBpbiBuYW5vc2Vjb25kcyAoaW5kZXhlZCBieSBVVkhfQUdJTkdfUFJFU0NBTEVfU0VMIHVyZ2VuY3k3IDMwOjI4KSAqLwogc3RhdGljIGludCB0aW1lb3V0X2Jhc2VfbnNbXSA9IHsKIAkJMjAsCkBAIC01NSwxNiArNzgsMTYgQEAKIHN0YXRpYyBpbnQgZGlzYWJsZWRfcGVyaW9kCT0gRElTQUJMRURfUEVSSU9EOwogCiBzdGF0aWMgc3RydWN0IHR1bmFibGVzIHR1bmFibGVzW10gPSB7Ci0JeyZtYXhfY29uY3VyciwgTUFYX0JBVV9DT05DVVJSRU5UfSwgLyogbXVzdCBiZSBbMF0gKi8KLQl7JnBsdWdnZWRfZGVsYXksIFBMVUdHRURfREVMQVl9LAotCXsmcGx1Z3NiNHJlc2V0LCBQTFVHU0I0UkVTRVR9LAotCXsmdGltZW91dHNiNHJlc2V0LCBUSU1FT1VUU0I0UkVTRVR9LAotCXsmaXBpX3Jlc2V0X2xpbWl0LCBJUElfUkVTRVRfTElNSVR9LAotCXsmY29tcGxldGVfdGhyZXNob2xkLCBDT01QTEVURV9USFJFU0hPTER9LAotCXsmY29uZ2VzdGVkX3Jlc3Buc191cywgQ09OR0VTVEVEX1JFU1BPTlNFX1VTfSwKLQl7JmNvbmdlc3RlZF9yZXBzLCBDT05HRVNURURfUkVQU30sCi0JeyZkaXNhYmxlZF9wZXJpb2QsIERJU0FCTEVEX1BFUklPRH0sCi0JeyZnaXZldXBfbGltaXQsIEdJVkVVUF9MSU1JVH0KKwl7Jm1heF9jb25jdXJyLCAgICAgICAgICAgTUFYX0JBVV9DT05DVVJSRU5UfSwgLyogbXVzdCBiZSBbMF0gKi8KKwl7JnBsdWdnZWRfZGVsYXksICAgICAgICAgUExVR0dFRF9ERUxBWX0sCisJeyZwbHVnc2I0cmVzZXQsICAgICAgICAgIFBMVUdTQjRSRVNFVH0sCisJeyZ0aW1lb3V0c2I0cmVzZXQsICAgICAgIFRJTUVPVVRTQjRSRVNFVH0sCisJeyZpcGlfcmVzZXRfbGltaXQsICAgICAgIElQSV9SRVNFVF9MSU1JVH0sCisJeyZjb21wbGV0ZV90aHJlc2hvbGQsICAgIENPTVBMRVRFX1RIUkVTSE9MRH0sCisJeyZjb25nZXN0ZWRfcmVzcG5zX3VzLCAgIENPTkdFU1RFRF9SRVNQT05TRV9VU30sCisJeyZjb25nZXN0ZWRfcmVwcywgICAgICAgIENPTkdFU1RFRF9SRVBTfSwKKwl7JmRpc2FibGVkX3BlcmlvZCwgICAgICAgRElTQUJMRURfUEVSSU9EfSwKKwl7JmdpdmV1cF9saW1pdCwgICAgICAgICAgR0lWRVVQX0xJTUlUfQogfTsKIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKnR1bmFibGVzX2RpcjsKQEAgLTIxNiw3ICsyMzksNyBAQAogCW1zZyA9IG1kcC0+bXNnOwogCWlmICghbXNnLT5jYW5jZWxlZCAmJiBkb19hY2tub3dsZWRnZSkgewogCQlkdyA9IChtc2ctPnN3YWNrX3ZlYyA8PCBVVl9TV19BQ0tfTlBFTkRJTkcpIHwgbXNnLT5zd2Fja192ZWM7Ci0JCXdyaXRlX21tcl9zd19hY2soZHcpOworCQlvcHMud3JpdGVfbF9zd19hY2soZHcpOwogCX0KIAltc2ctPnJlcGxpZWRfdG8gPSAxOwogCW1zZy0+c3dhY2tfdmVjID0gMDsKQEAgLTI1Miw3ICsyNzUsNyBAQAogCQkJbXNnLT5zd2Fja192ZWMpID09IDApICYmCiAJCSAgICAobXNnMi0+c2VuZGluZ19jcHUgPT0gbXNnLT5zZW5kaW5nX2NwdSkgJiYKIAkJICAgIChtc2cyLT5tc2dfdHlwZSAhPSBNU0dfTk9PUCkpIHsKLQkJCW1tciA9IHJlYWRfbW1yX3N3X2FjaygpOworCQkJbW1yID0gb3BzLnJlYWRfbF9zd19hY2soKTsKIAkJCW1zZ19yZXMgPSBtc2cyLT5zd2Fja192ZWM7CiAJCQkvKgogCQkJICogVGhpcyBpcyBhIG1lc3NhZ2UgcmV0cnk7IGNsZWFyIHRoZSByZXNvdXJjZXMgaGVsZApAQCAtMjcwLDcgKzI5Myw3IEBACiAJCQkJc3RhdC0+ZF9jYW5jZWxlZCsrOwogCQkJCWNhbmNlbF9jb3VudCsrOwogCQkJCW1yID0gKG1zZ19yZXMgPDwgVVZfU1dfQUNLX05QRU5ESU5HKSB8IG1zZ19yZXM7Ci0JCQkJd3JpdGVfbW1yX3N3X2Fjayhtcik7CisJCQkJb3BzLndyaXRlX2xfc3dfYWNrKG1yKTsKIAkJCX0KIAkJfQogCX0KQEAgLTQwMywxMiArNDI2LDEyIEBACiAJCQkvKgogCQkJICogb25seSByZXNldCB0aGUgcmVzb3VyY2UgaWYgaXQgaXMgc3RpbGwgcGVuZGluZwogCQkJICovCi0JCQltbXIgPSByZWFkX21tcl9zd19hY2soKTsKKwkJCW1tciA9IG9wcy5yZWFkX2xfc3dfYWNrKCk7CiAJCQltc2dfcmVzID0gbXNnLT5zd2Fja192ZWM7CiAJCQltciA9IChtc2dfcmVzIDw8IFVWX1NXX0FDS19OUEVORElORykgfCBtc2dfcmVzOwogCQkJaWYgKG1tciAmIG1zZ19yZXMpIHsKIAkJCQlzdGF0LT5kX3JjYW5jZWxlZCsrOwotCQkJCXdyaXRlX21tcl9zd19hY2sobXIpOworCQkJCW9wcy53cml0ZV9sX3N3X2Fjayhtcik7CiAJCQl9CiAJCX0KIAl9CkBAIC01ODAsMTEgKzYwMyw3IEBACiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIHV2Ml8zX3JlYWRfc3RhdHVzKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgcnNoZnQsIGludCBkZXNjKQogewotCXVuc2lnbmVkIGxvbmcgZGVzY3JpcHRvcl9zdGF0dXM7Ci0KLQlkZXNjcmlwdG9yX3N0YXR1cyA9Ci0JCSgocmVhZF9sbW1yKG9mZnNldCkgPj4gcnNoZnQpICYgVVZfQUNUX1NUQVRVU19NQVNLKSA8PCAxOwotCXJldHVybiBkZXNjcmlwdG9yX3N0YXR1czsKKwlyZXR1cm4gKChyZWFkX2xtbXIob2Zmc2V0KSA+PiByc2hmdCkgJiBVVl9BQ1RfU1RBVFVTX01BU0spIDw8IDE7CiB9CiAKIC8qCkBAIC0xMjAyLDcgKzEyMjEsNyBAQAogCXN0cnVjdCBiYXVfcHFfZW50cnkgKm1zZyA9IG1kcC0+bXNnOwogCXN0cnVjdCBiYXVfcHFfZW50cnkgKm90aGVyX21zZzsKIAotCW1tcl9pbWFnZSA9IHJlYWRfbW1yX3N3X2FjaygpOworCW1tcl9pbWFnZSA9IG9wcy5yZWFkX2xfc3dfYWNrKCk7CiAJc3dhY2tfdmVjID0gbXNnLT5zd2Fja192ZWM7CiAKIAlpZiAoKHN3YWNrX3ZlYyAmIG1tcl9pbWFnZSkgPT0gMCkgewpAQCAtMTQzMSw3ICsxNDUwLDcgQEAKIAkJLyogZGVzdGluYXRpb24gc2lkZSBzdGF0aXN0aWNzICovCiAJCXNlcV9wcmludGYoZmlsZSwKIAkJCSIlbHggJWxkICVsZCAlbGQgJWxkICVsZCAlbGQgJWxkICVsZCAlbGQgJWxkICVsZFxuIiwKLQkJCSAgIHJlYWRfZ21tcl9zd19hY2sodXZfY3B1X3RvX3Bub2RlKGNwdSkpLAorCQkJICAgb3BzLnJlYWRfZ19zd19hY2sodXZfY3B1X3RvX3Bub2RlKGNwdSkpLAogCQkJICAgc3RhdC0+ZF9yZXF1ZXN0ZWUsIGN5Y2xlc18yX3VzKHN0YXQtPmRfdGltZSksCiAJCQkgICBzdGF0LT5kX2FsbHRsYiwgc3RhdC0+ZF9vbmV0bGIsIHN0YXQtPmRfbXVsdG1zZywKIAkJCSAgIHN0YXQtPmRfbm9tc2csIHN0YXQtPmRfcmV0cmllcywgc3RhdC0+ZF9jYW5jZWxlZCwKQEAgLTE0OTcsMTYgKzE1MTYsMTYgQEAKIAl9CiAKIAlpZiAoa3N0cnRvbChvcHRzdHIsIDEwLCAmaW5wdXRfYXJnKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIGlzIGludmFsaWRcbiIsIG9wdHN0cik7CisJCXByX2RlYnVnKCIlcyBpcyBpbnZhbGlkXG4iLCBvcHRzdHIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoaW5wdXRfYXJnID09IDApIHsKIAkJZWxlbWVudHMgPSBBUlJBWV9TSVpFKHN0YXRfZGVzY3JpcHRpb24pOwotCQlwcmludGsoS0VSTl9ERUJVRyAiIyBjcHU6ICAgICAgY3B1IG51bWJlclxuIik7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJTZW5kZXIgc3RhdGlzdGljczpcbiIpOworCQlwcl9kZWJ1ZygiIyBjcHU6ICAgICAgY3B1IG51bWJlclxuIik7CisJCXByX2RlYnVnKCJTZW5kZXIgc3RhdGlzdGljczpcbiIpOwogCQlmb3IgKGkgPSAwOyBpIDwgZWxlbWVudHM7IGkrKykKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgc3RhdF9kZXNjcmlwdGlvbltpXSk7CisJCQlwcl9kZWJ1ZygiJXNcbiIsIHN0YXRfZGVzY3JpcHRpb25baV0pOwogCX0gZWxzZSBpZiAoaW5wdXRfYXJnID09IC0xKSB7CiAJCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgewogCQkJc3RhdCA9ICZwZXJfY3B1KHB0Y3N0YXRzLCBjcHUpOwpAQCAtMTU1NCw3ICsxNTczLDcgQEAKIAkJCWJyZWFrOwogCX0KIAlpZiAoY250ICE9IGUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYmF1IHR1bmFibGUgZXJyb3I6IHNob3VsZCBiZSAlZCB2YWx1ZXNcbiIsIGUpOworCQlwcl9pbmZvKCJiYXUgdHVuYWJsZSBlcnJvcjogc2hvdWxkIGJlICVkIHZhbHVlc1xuIiwgZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTU3MSw3ICsxNTkwLDcgQEAKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCWlmICh2YWwgPCAxIHx8IHZhbCA+IGJjcC0+Y3B1c19pbl91dmh1YikgewotCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJcHJfZGVidWcoCiAJCQkJIkVycm9yOiBCQVUgbWF4IGNvbmN1cnJlbnQgJWQgaXMgaW52YWxpZFxuIiwKIAkJCQl2YWwpOwogCQkJCXJldHVybiAtRUlOVkFMOwpAQCAtMTYxOSwxNyArMTYzOCwxNyBAQAogCiAJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CiAJCWJjcCA9ICZwZXJfY3B1KGJhdV9jb250cm9sLCBjcHUpOwotCQliY3AtPm1heF9jb25jdXJyID0JCW1heF9jb25jdXJyOwotCQliY3AtPm1heF9jb25jdXJyX2NvbnN0ID0JbWF4X2NvbmN1cnI7Ci0JCWJjcC0+cGx1Z2dlZF9kZWxheSA9CQlwbHVnZ2VkX2RlbGF5OwotCQliY3AtPnBsdWdzYjRyZXNldCA9CQlwbHVnc2I0cmVzZXQ7Ci0JCWJjcC0+dGltZW91dHNiNHJlc2V0ID0JCXRpbWVvdXRzYjRyZXNldDsKLQkJYmNwLT5pcGlfcmVzZXRfbGltaXQgPQkJaXBpX3Jlc2V0X2xpbWl0OwotCQliY3AtPmNvbXBsZXRlX3RocmVzaG9sZCA9CWNvbXBsZXRlX3RocmVzaG9sZDsKLQkJYmNwLT5jb25nX3Jlc3BvbnNlX3VzID0JCWNvbmdlc3RlZF9yZXNwbnNfdXM7Ci0JCWJjcC0+Y29uZ19yZXBzID0JCWNvbmdlc3RlZF9yZXBzOwotCQliY3AtPmRpc2FibGVkX3BlcmlvZCA9CQlzZWNfMl9jeWNsZXMoZGlzYWJsZWRfcGVyaW9kKTsKLQkJYmNwLT5naXZldXBfbGltaXQgPQkJZ2l2ZXVwX2xpbWl0OworCQliY3AtPm1heF9jb25jdXJyICAgICAgICAgPSBtYXhfY29uY3VycjsKKwkJYmNwLT5tYXhfY29uY3Vycl9jb25zdCAgID0gbWF4X2NvbmN1cnI7CisJCWJjcC0+cGx1Z2dlZF9kZWxheSAgICAgICA9IHBsdWdnZWRfZGVsYXk7CisJCWJjcC0+cGx1Z3NiNHJlc2V0ICAgICAgICA9IHBsdWdzYjRyZXNldDsKKwkJYmNwLT50aW1lb3V0c2I0cmVzZXQgICAgID0gdGltZW91dHNiNHJlc2V0OworCQliY3AtPmlwaV9yZXNldF9saW1pdCAgICAgPSBpcGlfcmVzZXRfbGltaXQ7CisJCWJjcC0+Y29tcGxldGVfdGhyZXNob2xkICA9IGNvbXBsZXRlX3RocmVzaG9sZDsKKwkJYmNwLT5jb25nX3Jlc3BvbnNlX3VzICAgID0gY29uZ2VzdGVkX3Jlc3Buc191czsKKwkJYmNwLT5jb25nX3JlcHMgICAgICAgICAgID0gY29uZ2VzdGVkX3JlcHM7CisJCWJjcC0+ZGlzYWJsZWRfcGVyaW9kICAgICA9IHNlY18yX2N5Y2xlcyhkaXNhYmxlZF9wZXJpb2QpOworCQliY3AtPmdpdmV1cF9saW1pdCAgICAgICAgPSBnaXZldXBfbGltaXQ7CiAJfQogCXJldHVybiBjb3VudDsKIH0KQEAgLTE2NzYsMjEgKzE2OTUsMjEgQEAKIAlwcm9jX3V2X3B0YyA9IHByb2NfY3JlYXRlKFVWX1BUQ19CQVNFTkFNRSwgMDQ0NCwgTlVMTCwKIAkJCQkgICZwcm9jX3V2X3B0Y19vcGVyYXRpb25zKTsKIAlpZiAoIXByb2NfdXZfcHRjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGNyZWF0ZSAlcyBwcm9jIGVudHJ5XG4iLAorCQlwcl9lcnIoInVuYWJsZSB0byBjcmVhdGUgJXMgcHJvYyBlbnRyeVxuIiwKIAkJICAgICAgIFVWX1BUQ19CQVNFTkFNRSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXR1bmFibGVzX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihVVl9CQVVfVFVOQUJMRVNfRElSLCBOVUxMKTsKIAlpZiAoIXR1bmFibGVzX2RpcikgewotCQlwcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBjcmVhdGUgZGVidWdmcyBkaXJlY3RvcnkgJXNcbiIsCisJCXByX2VycigidW5hYmxlIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGRpcmVjdG9yeSAlc1xuIiwKIAkJICAgICAgIFVWX0JBVV9UVU5BQkxFU19ESVIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJdHVuYWJsZXNfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoVVZfQkFVX1RVTkFCTEVTX0ZJTEUsIDA2MDAsCiAJCQkJCXR1bmFibGVzX2RpciwgTlVMTCwgJnR1bmFibGVzX2ZvcHMpOwogCWlmICghdHVuYWJsZXNfZmlsZSkgewotCQlwcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBjcmVhdGUgZGVidWdmcyBmaWxlICVzXG4iLAorCQlwcl9lcnIoInVuYWJsZSB0byBjcmVhdGUgZGVidWdmcyBmaWxlICVzXG4iLAogCQkgICAgICAgVVZfQkFVX1RVTkFCTEVTX0ZJTEUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNzI1LDcgKzE3NDQsNyBAQAogCiAJZ3BhID0gdXZfZ3BhKGJhdV9kZXNjKTsKIAluID0gdXZfZ3BhX3RvX2dub2RlKGdwYSk7Ci0JbSA9IHV2X2dwYV90b19vZmZzZXQoZ3BhKTsKKwltID0gb3BzLmJhdV9ncGFfdG9fb2Zmc2V0KGdwYSk7CiAJaWYgKGlzX3V2MV9odWIoKSkKIAkJdXYxID0gMTsKIApAQCAtMTc0MCw3ICsxNzU5LDcgQEAKIAkJbWVtc2V0KGJkMiwgMCwgc2l6ZW9mKHN0cnVjdCBiYXVfZGVzYykpOwogCQlpZiAodXYxKSB7CiAJCQl1djFfaGRyID0gJmJkMi0+aGVhZGVyLnV2MV9oZHI7Ci0JCQl1djFfaGRyLT5zd2Fja19mbGFnID0JMTsKKwkJCXV2MV9oZHItPnN3YWNrX2ZsYWcgPSAxOwogCQkJLyoKIAkJCSAqIFRoZSBiYXNlX2Rlc3RfbmFzaWQgc2V0IGluIHRoZSBtZXNzYWdlIGhlYWRlcgogCQkJICogaXMgdGhlIG5hc2lkIG9mIHRoZSBmaXJzdCB1dmh1YiBpbiB0aGUgcGFydGl0aW9uLgpAQCAtMTc0OSwxMCArMTc2OCwxMCBAQAogCQkJICogaWYgbmFzaWQgc3RyaWRpbmcgaXMgYmVpbmcgdXNlZC4KIAkJCSAqLwogCQkJdXYxX2hkci0+YmFzZV9kZXN0X25hc2lkID0KLQkJCQkJCVVWX1BOT0RFX1RPX05BU0lEKGJhc2VfcG5vZGUpOwotCQkJdXYxX2hkci0+ZGVzdF9zdWJub2RlaWQgPQlVVl9MQl9TVUJOT0RFSUQ7Ci0JCQl1djFfaGRyLT5jb21tYW5kID0JCVVWX05FVF9FTkRQT0lOVF9JTlREOwotCQkJdXYxX2hkci0+aW50X2JvdGggPQkJMTsKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgVVZfUE5PREVfVE9fTkFTSUQoYmFzZV9wbm9kZSk7CisJCQl1djFfaGRyLT5kZXN0X3N1Ym5vZGVpZCAgPSBVVl9MQl9TVUJOT0RFSUQ7CisJCQl1djFfaGRyLT5jb21tYW5kICAgICAgICAgPSBVVl9ORVRfRU5EUE9JTlRfSU5URDsKKwkJCXV2MV9oZHItPmludF9ib3RoICAgICAgICA9IDE7CiAJCQkvKgogCQkJICogYWxsIG90aGVycyBuZWVkIHRvIGJlIHNldCB0byB6ZXJvOgogCQkJICogICBmYWlybmVzcyBjaGFpbmluZyBtdWx0aWxldmVsIGNvdW50IHJlcGxpZWRfdG8KQEAgLTE3NjMsMTEgKzE3ODIsMTEgQEAKIAkJCSAqIHVzZXMgbmF0aXZlIG1vZGUgZm9yIHNlbGVjdGl2ZSBicm9hZGNhc3RzLgogCQkJICovCiAJCQl1djJfM19oZHIgPSAmYmQyLT5oZWFkZXIudXYyXzNfaGRyOwotCQkJdXYyXzNfaGRyLT5zd2Fja19mbGFnID0JMTsKKwkJCXV2Ml8zX2hkci0+c3dhY2tfZmxhZyAgICAgID0gMTsKIAkJCXV2Ml8zX2hkci0+YmFzZV9kZXN0X25hc2lkID0KLQkJCQkJCVVWX1BOT0RFX1RPX05BU0lEKGJhc2VfcG5vZGUpOwotCQkJdXYyXzNfaGRyLT5kZXN0X3N1Ym5vZGVpZCA9CVVWX0xCX1NVQk5PREVJRDsKLQkJCXV2Ml8zX2hkci0+Y29tbWFuZCA9CQlVVl9ORVRfRU5EUE9JTlRfSU5URDsKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgVVZfUE5PREVfVE9fTkFTSUQoYmFzZV9wbm9kZSk7CisJCQl1djJfM19oZHItPmRlc3Rfc3Vibm9kZWlkICA9IFVWX0xCX1NVQk5PREVJRDsKKwkJCXV2Ml8zX2hkci0+Y29tbWFuZCAgICAgICAgID0gVVZfTkVUX0VORFBPSU5UX0lOVEQ7CiAJCX0KIAl9CiAJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CkBAIC0xNzkwLDEwICsxODA5LDcgQEAKIAlzaXplX3QgcGxzaXplOwogCWNoYXIgKmNwOwogCXZvaWQgKnZwOwotCXVuc2lnbmVkIGxvbmcgcG47Ci0JdW5zaWduZWQgbG9uZyBmaXJzdDsKLQl1bnNpZ25lZCBsb25nIHBuX2ZpcnN0OwotCXVuc2lnbmVkIGxvbmcgbGFzdDsKKwl1bnNpZ25lZCBsb25nIGdub2RlLCBmaXJzdCwgbGFzdCwgdGFpbDsKIAlzdHJ1Y3QgYmF1X3BxX2VudHJ5ICpwcXA7CiAJc3RydWN0IGJhdV9jb250cm9sICpiY3A7CiAKQEAgLTE4MTQsMTcgKzE4MzAsMjUgQEAKIAkJYmNwLT5iYXVfbXNnX2hlYWQJPSBwcXA7CiAJCWJjcC0+cXVldWVfbGFzdAkJPSBwcXAgKyAoREVTVF9RX1NJWkUgLSAxKTsKIAl9CisKKwlmaXJzdCA9IG9wcy5iYXVfZ3BhX3RvX29mZnNldCh1dl9ncGEocHFwKSk7CisJbGFzdCA9IG9wcy5iYXVfZ3BhX3RvX29mZnNldCh1dl9ncGEocHFwICsgKERFU1RfUV9TSVpFIC0gMSkpKTsKKwogCS8qCi0JICogbmVlZCB0aGUgZ25vZGUgb2Ygd2hlcmUgdGhlIG1lbW9yeSB3YXMgcmVhbGx5IGFsbG9jYXRlZAorCSAqIFByZSBVVjQsIHRoZSBnbm9kZSBpcyByZXF1aXJlZCB0byBsb2NhdGUgdGhlIHBheWxvYWQgcXVldWUKKwkgKiBhbmQgdGhlIHBheWxvYWQgcXVldWUgdGFpbCBtdXN0IGJlIG1haW50YWluZWQgYnkgdGhlIGtlcm5lbC4KIAkgKi8KLQlwbiA9IHV2X2dwYV90b19nbm9kZSh1dl9ncGEocHFwKSk7Ci0JZmlyc3QgPSB1dl9waHlzbm9kZWFkZHIocHFwKTsKLQlwbl9maXJzdCA9ICgodW5zaWduZWQgbG9uZylwbiA8PCBVVl9QQVlMT0FEUV9QTk9ERV9TSElGVCkgfCBmaXJzdDsKLQlsYXN0ID0gdXZfcGh5c25vZGVhZGRyKHBxcCArIChERVNUX1FfU0laRSAtIDEpKTsKLQl3cml0ZV9tbXJfcGF5bG9hZF9maXJzdChwbm9kZSwgcG5fZmlyc3QpOwotCXdyaXRlX21tcl9wYXlsb2FkX3RhaWwocG5vZGUsIGZpcnN0KTsKLQl3cml0ZV9tbXJfcGF5bG9hZF9sYXN0KHBub2RlLCBsYXN0KTsKLQl3cml0ZV9nbW1yX3N3X2Fjayhwbm9kZSwgMHhmZmZmVUwpOworCWJjcCA9ICZwZXJfY3B1KGJhdV9jb250cm9sLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCWlmIChiY3AtPnV2aHViX3ZlcnNpb24gPD0gMykgeworCQl0YWlsID0gZmlyc3Q7CisJCWdub2RlID0gdXZfZ3BhX3RvX2dub2RlKHV2X2dwYShwcXApKTsKKwkJZmlyc3QgPSAoZ25vZGUgPDwgVVZfUEFZTE9BRFFfR05PREVfU0hJRlQpIHwgdGFpbDsKKwkJd3JpdGVfbW1yX3BheWxvYWRfdGFpbChwbm9kZSwgdGFpbCk7CisJfQorCisJb3BzLndyaXRlX3BheWxvYWRfZmlyc3QocG5vZGUsIGZpcnN0KTsKKwlvcHMud3JpdGVfcGF5bG9hZF9sYXN0KHBub2RlLCBsYXN0KTsKKwlvcHMud3JpdGVfZ19zd19hY2socG5vZGUsIDB4ZmZmZlVMKTsKIAogCS8qIGluIGVmZmVjdCwgYWxsIG1zZ190eXBlJ3MgYXJlIHNldCB0byBNU0dfTk9PUCAqLwogCW1lbXNldChwcXAsIDAsIHNpemVvZihzdHJ1Y3QgYmF1X3BxX2VudHJ5KSAqIERFU1RfUV9TSVpFKTsKQEAgLTE5MTQsOCArMTkzOCw4IEBACiAJCWJjcC0+Y29tcGxldGVfdGhyZXNob2xkCQk9IGNvbXBsZXRlX3RocmVzaG9sZDsKIAkJYmNwLT5jb25nX3Jlc3BvbnNlX3VzCQk9IGNvbmdlc3RlZF9yZXNwbnNfdXM7CiAJCWJjcC0+Y29uZ19yZXBzCQkJPSBjb25nZXN0ZWRfcmVwczsKLQkJYmNwLT5kaXNhYmxlZF9wZXJpb2QgPQkJc2VjXzJfY3ljbGVzKGRpc2FibGVkX3BlcmlvZCk7Ci0JCWJjcC0+Z2l2ZXVwX2xpbWl0ID0JCWdpdmV1cF9saW1pdDsKKwkJYmNwLT5kaXNhYmxlZF9wZXJpb2QJCT0gc2VjXzJfY3ljbGVzKGRpc2FibGVkX3BlcmlvZCk7CisJCWJjcC0+Z2l2ZXVwX2xpbWl0CQk9IGdpdmV1cF9saW1pdDsKIAkJc3Bpbl9sb2NrX2luaXQoJmJjcC0+cXVldWVfbG9jayk7CiAJCXNwaW5fbG9ja19pbml0KCZiY3AtPnV2aHViX2xvY2spOwogCQlzcGluX2xvY2tfaW5pdCgmYmNwLT5kaXNhYmxlX2xvY2spOwpAQCAtMTk0NCw3ICsxOTY4LDcgQEAKIAogCQlwbm9kZSA9IHV2X2NwdV9odWJfaW5mbyhjcHUpLT5wbm9kZTsKIAkJaWYgKChwbm9kZSAtIGJhc2VfcG5vZGUpID49IFVWX0RJU1RSSUJVVElPTl9TSVpFKSB7Ci0JCQlwcmludGsoS0VSTl9FTUVSRworCQkJcHJfZW1lcmcoCiAJCQkJImNwdSAlZCBwbm9kZSAlZC0lZCBiZXlvbmQgJWQ7IEJBVSBkaXNhYmxlZFxuIiwKIAkJCQljcHUsIHBub2RlLCBiYXNlX3Bub2RlLCBVVl9ESVNUUklCVVRJT05fU0laRSk7CiAJCQlyZXR1cm4gMTsKQEAgLTE5NjksNyArMTk5Myw3IEBACiAJCXNkcC0+Y3B1X251bWJlcltzZHAtPm51bV9jcHVzXSA9IGNwdTsKIAkJc2RwLT5udW1fY3B1cysrOwogCQlpZiAoc2RwLT5udW1fY3B1cyA+IE1BWF9DUFVTX1BFUl9TT0NLRVQpIHsKLQkJCXByaW50ayhLRVJOX0VNRVJHICIlZCBjcHVzIHBlciBzb2NrZXQgaW52YWxpZFxuIiwKKwkJCXByX2VtZXJnKCIlZCBjcHVzIHBlciBzb2NrZXQgaW52YWxpZFxuIiwKIAkJCQlzZHAtPm51bV9jcHVzKTsKIAkJCXJldHVybiAxOwogCQl9CkBAIC0yMDM1LDE1ICsyMDU5LDE3IEBACiAJCQliY3AtPnV2aHViX3ZlcnNpb24gPSAyOwogCQllbHNlIGlmIChpc191djNfaHViKCkpCiAJCQliY3AtPnV2aHViX3ZlcnNpb24gPSAzOworCQllbHNlIGlmIChpc191djRfaHViKCkpCisJCQliY3AtPnV2aHViX3ZlcnNpb24gPSA0OwogCQllbHNlIHsKLQkJCXByaW50ayhLRVJOX0VNRVJHICJ1dmh1YiB2ZXJzaW9uIG5vdCAxLCAyIG9yIDNcbiIpOworCQkJcHJfZW1lcmcoInV2aHViIHZlcnNpb24gbm90IDEsIDIsIDMsIG9yIDRcbiIpOwogCQkJcmV0dXJuIDE7CiAJCX0KIAkJYmNwLT51dmh1Yl9tYXN0ZXIgPSAqaG1hc3RlcnA7CiAJCWJjcC0+dXZodWJfY3B1ID0gdXZfY3B1X2JsYWRlX3Byb2Nlc3Nvcl9pZChjcHUpOwogCiAJCWlmIChiY3AtPnV2aHViX2NwdSA+PSBNQVhfQ1BVU19QRVJfVVZIVUIpIHsKLQkJCXByaW50ayhLRVJOX0VNRVJHICIlZCBjcHVzIHBlciB1dmh1YiBpbnZhbGlkXG4iLAorCQkJcHJfZW1lcmcoIiVkIGNwdXMgcGVyIHV2aHViIGludmFsaWRcbiIsCiAJCQkJYmNwLT51dmh1Yl9jcHUpOwogCQkJcmV0dXJuIDE7CiAJCX0KQEAgLTIwOTgsNyArMjEyNCw4IEBACiAJdm9pZCAqdnA7CiAJc3RydWN0IHV2aHViX2Rlc2MgKnV2aHViX2Rlc2NzOwogCi0JdGltZW91dF91cyA9IGNhbGN1bGF0ZV9kZXN0aW5hdGlvbl90aW1lb3V0KCk7CisJaWYgKGlzX3V2M19odWIoKSB8fCBpc191djJfaHViKCkgfHwgaXNfdXYxX2h1YigpKQorCQl0aW1lb3V0X3VzID0gY2FsY3VsYXRlX2Rlc3RpbmF0aW9uX3RpbWVvdXQoKTsKIAogCXZwID0ga21hbGxvYyhudXZodWJzICogc2l6ZW9mKHN0cnVjdCB1dmh1Yl9kZXNjKSwgR0ZQX0tFUk5FTCk7CiAJdXZodWJfZGVzY3MgPSAoc3RydWN0IHV2aHViX2Rlc2MgKil2cDsKQEAgLTIxMzgsNiArMjE2NSwxNSBAQAogCWlmICghaXNfdXZfc3lzdGVtKCkpCiAJCXJldHVybiAwOwogCisJaWYgKGlzX3V2NF9odWIoKSkKKwkJb3BzID0gdXY0X2JhdV9vcHM7CisJZWxzZSBpZiAoaXNfdXYzX2h1YigpKQorCQlvcHMgPSB1djEyM19iYXVfb3BzOworCWVsc2UgaWYgKGlzX3V2Ml9odWIoKSkKKwkJb3BzID0gdXYxMjNfYmF1X29wczsKKwllbHNlIGlmIChpc191djFfaHViKCkpCisJCW9wcyA9IHV2MTIzX2JhdV9vcHM7CisKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3VyX2NwdSkgewogCQltYXNrID0gJnBlcl9jcHUodXZfZmx1c2hfdGxiX21hc2ssIGN1cl9jcHUpOwogCQl6YWxsb2NfY3B1bWFza192YXJfbm9kZShtYXNrLCBHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShjdXJfY3B1KSk7CkBAIC0yMTUzLDcgKzIxODksOSBAQAogCQkJdXZfYmFzZV9wbm9kZSA9IHV2X2JsYWRlX3RvX3Bub2RlKHV2aHViKTsKIAl9CiAKLQllbmFibGVfdGltZW91dHMoKTsKKwkvKiBzb2Z0d2FyZSB0aW1lb3V0cyBhcmUgbm90IHN1cHBvcnRlZCBvbiBVVjQgKi8KKwlpZiAoaXNfdXYzX2h1YigpIHx8IGlzX3V2Ml9odWIoKSB8fCBpc191djFfaHViKCkpCisJCWVuYWJsZV90aW1lb3V0cygpOwogCiAJaWYgKGluaXRfcGVyX2NwdShudXZodWJzLCB1dl9iYXNlX3Bub2RlKSkgewogCQlzZXRfYmF1X29mZigpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcG93ZXIvY3B1LmMgYi9hcmNoL3g4Ni9wb3dlci9jcHUuYwppbmRleCBiMTJjMjZlLi41M2NhY2UyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wb3dlci9jcHUuYworKysgYi9hcmNoL3g4Ni9wb3dlci9jcHUuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiAJY3R4dC0+Y3IwID0gcmVhZF9jcjAoKTsKIAljdHh0LT5jcjIgPSByZWFkX2NyMigpOwogCWN0eHQtPmNyMyA9IHJlYWRfY3IzKCk7Ci0JY3R4dC0+Y3I0ID0gX19yZWFkX2NyNF9zYWZlKCk7CisJY3R4dC0+Y3I0ID0gX19yZWFkX2NyNCgpOwogI2lmZGVmIENPTkZJR19YODZfNjQKIAljdHh0LT5jcjggPSByZWFkX2NyOCgpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wb3dlci9oaWJlcm5hdGVfNjQuYyBiL2FyY2gveDg2L3Bvd2VyL2hpYmVybmF0ZV82NC5jCmluZGV4IGEzZTNjY2MuLjk2MzQ1NTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Bvd2VyL2hpYmVybmF0ZV82NC5jCisrKyBiL2FyY2gveDg2L3Bvd2VyL2hpYmVybmF0ZV82NC5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIAkJCXJldHVybiByZXN1bHQ7CiAJfQogCi0JdGVtcF9sZXZlbDRfcGd0ID0gKHVuc2lnbmVkIGxvbmcpcGdkIC0gX19QQUdFX09GRlNFVDsKKwl0ZW1wX2xldmVsNF9wZ3QgPSBfX3BhKHBnZCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Jhcy9tY2VfYW1kX2luai5jIGIvYXJjaC94ODYvcmFzL21jZV9hbWRfaW5qLmMKaW5kZXggMTEwNDUxNS4uMWFjNzY0NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcmFzL21jZV9hbWRfaW5qLmMKKysrIGIvYXJjaC94ODYvcmFzL21jZV9hbWRfaW5qLmMKQEAgLTY4LDYgKzY4LDcgQEAKIE1DRV9JTkpFQ1RfU0VUKHN0YXR1cyk7CiBNQ0VfSU5KRUNUX1NFVChtaXNjKTsKIE1DRV9JTkpFQ1RfU0VUKGFkZHIpOworTUNFX0lOSkVDVF9TRVQoc3luZCk7CiAKICNkZWZpbmUgTUNFX0lOSkVDVF9HRVQocmVnKQkJCQkJCVwKIHN0YXRpYyBpbnQgaW5qXyMjcmVnIyNfZ2V0KHZvaWQgKmRhdGEsIHU2NCAqdmFsKQkJCVwKQEAgLTgxLDEwICs4MiwxMiBAQAogTUNFX0lOSkVDVF9HRVQoc3RhdHVzKTsKIE1DRV9JTkpFQ1RfR0VUKG1pc2MpOwogTUNFX0lOSkVDVF9HRVQoYWRkcik7CitNQ0VfSU5KRUNUX0dFVChzeW5kKTsKIAogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoc3RhdHVzX2ZvcHMsIGlual9zdGF0dXNfZ2V0LCBpbmpfc3RhdHVzX3NldCwgIiVsbHhcbiIpOwogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUobWlzY19mb3BzLCBpbmpfbWlzY19nZXQsIGlual9taXNjX3NldCwgIiVsbHhcbiIpOwogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoYWRkcl9mb3BzLCBpbmpfYWRkcl9nZXQsIGlual9hZGRyX3NldCwgIiVsbHhcbiIpOworREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoc3luZF9mb3BzLCBpbmpfc3luZF9nZXQsIGlual9zeW5kX3NldCwgIiVsbHhcbiIpOwogCiAvKgogICogQ2FsbGVyIG5lZWRzIHRvIGJlIG1ha2Ugc3VyZSB0aGlzIGNwdSBkb2Vzbid0IGRpc2FwcGVhcgpAQCAtMjQzLDI3ICsyNDYsMjcgQEAKIAogc3RhdGljIHZvaWQgcHJlcGFyZV9tc3JzKHZvaWQgKmluZm8pCiB7Ci0Jc3RydWN0IG1jZSBpX21jZSA9ICooc3RydWN0IG1jZSAqKWluZm87Ci0JdTggYiA9IGlfbWNlLmJhbms7CisJc3RydWN0IG1jZSBtID0gKihzdHJ1Y3QgbWNlICopaW5mbzsKKwl1OCBiID0gbS5iYW5rOwogCi0Jd3Jtc3JsKE1TUl9JQTMyX01DR19TVEFUVVMsIGlfbWNlLm1jZ3N0YXR1cyk7CisJd3Jtc3JsKE1TUl9JQTMyX01DR19TVEFUVVMsIG0ubWNnc3RhdHVzKTsKIAogCWlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfU01DQSkpIHsKLQkJaWYgKGlfbWNlLmluamVjdF9mbGFncyA9PSBERlJfSU5UX0lOSikgewotCQkJd3Jtc3JsKE1TUl9BTUQ2NF9TTUNBX01DeF9ERVNUQVQoYiksIGlfbWNlLnN0YXR1cyk7Ci0JCQl3cm1zcmwoTVNSX0FNRDY0X1NNQ0FfTUN4X0RFQUREUihiKSwgaV9tY2UuYWRkcik7CisJCWlmIChtLmluamVjdF9mbGFncyA9PSBERlJfSU5UX0lOSikgeworCQkJd3Jtc3JsKE1TUl9BTUQ2NF9TTUNBX01DeF9ERVNUQVQoYiksIG0uc3RhdHVzKTsKKwkJCXdybXNybChNU1JfQU1ENjRfU01DQV9NQ3hfREVBRERSKGIpLCBtLmFkZHIpOwogCQl9IGVsc2UgewotCQkJd3Jtc3JsKE1TUl9BTUQ2NF9TTUNBX01DeF9TVEFUVVMoYiksIGlfbWNlLnN0YXR1cyk7Ci0JCQl3cm1zcmwoTVNSX0FNRDY0X1NNQ0FfTUN4X0FERFIoYiksIGlfbWNlLmFkZHIpOworCQkJd3Jtc3JsKE1TUl9BTUQ2NF9TTUNBX01DeF9TVEFUVVMoYiksIG0uc3RhdHVzKTsKKwkJCXdybXNybChNU1JfQU1ENjRfU01DQV9NQ3hfQUREUihiKSwgbS5hZGRyKTsKIAkJfQogCi0JCXdybXNybChNU1JfQU1ENjRfU01DQV9NQ3hfTUlTQyhiKSwgaV9tY2UubWlzYyk7CisJCXdybXNybChNU1JfQU1ENjRfU01DQV9NQ3hfTUlTQyhiKSwgbS5taXNjKTsKKwkJd3Jtc3JsKE1TUl9BTUQ2NF9TTUNBX01DeF9TWU5EKGIpLCBtLnN5bmQpOwogCX0gZWxzZSB7Ci0JCXdybXNybChNU1JfSUEzMl9NQ3hfU1RBVFVTKGIpLCBpX21jZS5zdGF0dXMpOwotCQl3cm1zcmwoTVNSX0lBMzJfTUN4X0FERFIoYiksIGlfbWNlLmFkZHIpOwotCQl3cm1zcmwoTVNSX0lBMzJfTUN4X01JU0MoYiksIGlfbWNlLm1pc2MpOworCQl3cm1zcmwoTVNSX0lBMzJfTUN4X1NUQVRVUyhiKSwgbS5zdGF0dXMpOworCQl3cm1zcmwoTVNSX0lBMzJfTUN4X0FERFIoYiksIG0uYWRkcik7CisJCXdybXNybChNU1JfSUEzMl9NQ3hfTUlTQyhiKSwgbS5taXNjKTsKIAl9Ci0KIH0KIAogc3RhdGljIHZvaWQgZG9faW5qZWN0KHZvaWQpCkBAIC0yNzUsNiArMjc4LDkgQEAKIAlpZiAoaV9tY2UubWlzYykKIAkJaV9tY2Uuc3RhdHVzIHw9IE1DSV9TVEFUVVNfTUlTQ1Y7CiAKKwlpZiAoaV9tY2Uuc3luZCkKKwkJaV9tY2Uuc3RhdHVzIHw9IE1DSV9TVEFUVVNfU1lORFY7CisKIAlpZiAoaW5qX3R5cGUgPT0gU1dfSU5KKSB7CiAJCW1jZV9pbmplY3RfbG9nKCZpX21jZSk7CiAJCXJldHVybjsKQEAgLTMwMSw3ICszMDcsOSBAQAogCSAqIG9ubHkgb24gdGhlIG5vZGUgYmFzZSBjb3JlLiBSZWZlciB0byBEMThGM3g0NFtOYk1jYVRvTXN0Q3B1RW5dIGZvcgogCSAqIEZhbTEwaCBhbmQgbGF0ZXIgQktER3MuCiAJICovCi0JaWYgKHN0YXRpY19jcHVfaGFzKFg4Nl9GRUFUVVJFX0FNRF9EQ00pICYmIGIgPT0gNCkgeworCWlmIChzdGF0aWNfY3B1X2hhcyhYODZfRkVBVFVSRV9BTURfRENNKSAmJgorCSAgICBiID09IDQgJiYKKwkgICAgYm9vdF9jcHVfZGF0YS54ODYgPCAweDE3KSB7CiAJCXRvZ2dsZV9uYl9tY2FfbXN0X2NwdShhbWRfZ2V0X25iX2lkKGNwdSkpOwogCQljcHUgPSBnZXRfbmJjX2Zvcl9ub2RlKGFtZF9nZXRfbmJfaWQoY3B1KSk7CiAJfQpAQCAtMzcxLDYgKzM3OSw5IEBACiAiXHQgdXNlZCBmb3IgZXJyb3IgdGhyZXNob2xkaW5nIHB1cnBvc2VzIGFuZCBpdHMgdmFsaWRpdHkgaXMgaW5kaWNhdGVkIGJ5XG4iCiAiXHQgTUNpX1NUQVRVU1tNaXNjVl0uXG4iCiAiXG4iCisic3luZDpcdCBTZXQgTUNpX1NZTkQ6IHByb3ZpZGUgc3luZHJvbWUgaW5mbyBhYm91dCB0aGUgZXJyb3IuIE9ubHkgdmFsaWQgb25cbiIKKyJcdCBTY2FsYWJsZSBNQ0Egc3lzdGVtcywgYW5kIGl0cyB2YWxpZGl0eSBpcyBpbmRpY2F0ZWQgYnkgTUNpX1NUQVRVU1tTeW5kVl0uXG4iCisiXG4iCiAiYWRkcjpcdCBFcnJvciBhZGRyZXNzIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gTUNpX0FERFIuIExvZyBhZGRyZXNzIGluZm9ybWF0aW9uXG4iCiAiXHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci5cbiIKICJcbiIKQEAgLTQyMCw2ICs0MzEsNyBAQAogCXsgLm5hbWUgPSAic3RhdHVzIiwJLmZvcHMgPSAmc3RhdHVzX2ZvcHMsIC5wZXJtID0gU19JUlVTUiB8IFNfSVdVU1IgfSwKIAl7IC5uYW1lID0gIm1pc2MiLAkuZm9wcyA9ICZtaXNjX2ZvcHMsICAgLnBlcm0gPSBTX0lSVVNSIHwgU19JV1VTUiB9LAogCXsgLm5hbWUgPSAiYWRkciIsCS5mb3BzID0gJmFkZHJfZm9wcywgICAucGVybSA9IFNfSVJVU1IgfCBTX0lXVVNSIH0sCisJeyAubmFtZSA9ICJzeW5kIiwJLmZvcHMgPSAmc3luZF9mb3BzLCAgIC5wZXJtID0gU19JUlVTUiB8IFNfSVdVU1IgfSwKIAl7IC5uYW1lID0gImJhbmsiLAkuZm9wcyA9ICZiYW5rX2ZvcHMsICAgLnBlcm0gPSBTX0lSVVNSIHwgU19JV1VTUiB9LAogCXsgLm5hbWUgPSAiZmxhZ3MiLAkuZm9wcyA9ICZmbGFnc19mb3BzLCAgLnBlcm0gPSBTX0lSVVNSIHwgU19JV1VTUiB9LAogCXsgLm5hbWUgPSAiY3B1IiwJLmZvcHMgPSAmZXh0Y3B1X2ZvcHMsIC5wZXJtID0gU19JUlVTUiB8IFNfSVdVU1IgfSwKQEAgLTQyOCw3ICs0NDAsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X21jZV9pbmplY3Qodm9pZCkKIHsKLQlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaTsKIAl1NjQgY2FwOwogCiAJcmRtc3JsKE1TUl9JQTMyX01DR19DQVAsIGNhcCk7CkBAIC00NTIsMjYgKzQ2NCwyMiBAQAogCXJldHVybiAwOwogCiBlcnJfZGZzX2FkZDoKLQl3aGlsZSAoLS1pID49IDApCisJd2hpbGUgKGktLSA+IDApCiAJCWRlYnVnZnNfcmVtb3ZlKGRmc19mbHNbaV0uZCk7CiAKIAlkZWJ1Z2ZzX3JlbW92ZShkZnNfaW5qKTsKIAlkZnNfaW5qID0gTlVMTDsKIAotCXJldHVybiAtRU5PTUVNOworCXJldHVybiAtRU5PREVWOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9tY2VfaW5qZWN0KHZvaWQpCiB7Ci0JaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZnNfZmxzKTsgaSsrKQotCQlkZWJ1Z2ZzX3JlbW92ZShkZnNfZmxzW2ldLmQpOworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkZnNfaW5qKTsKKwlkZnNfaW5qID0gTlVMTDsKIAogCW1lbXNldCgmZGZzX2ZscywgMCwgc2l6ZW9mKGRmc19mbHMpKTsKLQotCWRlYnVnZnNfcmVtb3ZlKGRmc19pbmopOwotCWRmc19pbmogPSBOVUxMOwogfQogbW9kdWxlX2luaXQoaW5pdF9tY2VfaW5qZWN0KTsKIG1vZHVsZV9leGl0KGV4aXRfbWNlX2luamVjdCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9wdHJhY2VfMzIuYyBiL2FyY2gveDg2L3VtL3B0cmFjZV8zMi5jCmluZGV4IGViZDRkZDYuLjU3NjZlYWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3VtL3B0cmFjZV8zMi5jCisrKyBiL2FyY2gveDg2L3VtL3B0cmFjZV8zMi5jCkBAIC04NCw3ICs4NCwxMCBAQAogCWNhc2UgRUFYOgogCWNhc2UgRUlQOgogCWNhc2UgVUVTUDoKKwkJYnJlYWs7CiAJY2FzZSBPUklHX0VBWDoKKwkJLyogVXBkYXRlIHRoZSBzeXNjYWxsIG51bWJlci4gKi8KKwkJVVBUX1NZU0NBTExfTlIoJmNoaWxkLT50aHJlYWQucmVncy5yZWdzKSA9IHZhbHVlOwogCQlicmVhazsKIAljYXNlIEZTOgogCQlpZiAodmFsdWUgJiYgKHZhbHVlICYgMykgIT0gMykKQEAgLTE5MSw3ICsxOTQsNyBAQAogCiBzdGF0aWMgaW50IGdldF9mcHJlZ3Moc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgX191c2VyICpidWYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCiB7Ci0JaW50IGVyciwgbiwgY3B1ID0gKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgY2hpbGQtPnN0YWNrKS0+Y3B1OworCWludCBlcnIsIG4sIGNwdSA9IHRhc2tfY3B1KGNoaWxkKTsKIAlzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBmcHJlZ3M7CiAKIAllcnIgPSBzYXZlX2kzODdfcmVnaXN0ZXJzKHVzZXJzcGFjZV9waWRbY3B1XSwKQEAgLTIwOCw3ICsyMTEsNyBAQAogCiBzdGF0aWMgaW50IHNldF9mcHJlZ3Moc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgX191c2VyICpidWYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCiB7Ci0JaW50IG4sIGNwdSA9ICgoc3RydWN0IHRocmVhZF9pbmZvICopIGNoaWxkLT5zdGFjayktPmNwdTsKKwlpbnQgbiwgY3B1ID0gdGFza19jcHUoY2hpbGQpOwogCXN0cnVjdCB1c2VyX2kzODdfc3RydWN0IGZwcmVnczsKIAogCW4gPSBjb3B5X2Zyb21fdXNlcigmZnByZWdzLCBidWYsIHNpemVvZihmcHJlZ3MpKTsKQEAgLTIyMSw3ICsyMjQsNyBAQAogCiBzdGF0aWMgaW50IGdldF9mcHhyZWdzKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0IF9fdXNlciAqYnVmLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQogewotCWludCBlcnIsIG4sIGNwdSA9ICgoc3RydWN0IHRocmVhZF9pbmZvICopIGNoaWxkLT5zdGFjayktPmNwdTsKKwlpbnQgZXJyLCBuLCBjcHUgPSB0YXNrX2NwdShjaGlsZCk7CiAJc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgZnByZWdzOwogCiAJZXJyID0gc2F2ZV9mcHhfcmVnaXN0ZXJzKHVzZXJzcGFjZV9waWRbY3B1XSwgKHVuc2lnbmVkIGxvbmcgKikgJmZwcmVncyk7CkBAIC0yMzcsNyArMjQwLDcgQEAKIAogc3RhdGljIGludCBzZXRfZnB4cmVncyhzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCBfX3VzZXIgKmJ1Ziwgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKIHsKLQlpbnQgbiwgY3B1ID0gKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgY2hpbGQtPnN0YWNrKS0+Y3B1OworCWludCBuLCBjcHUgPSB0YXNrX2NwdShjaGlsZCk7CiAJc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgZnByZWdzOwogCiAJbiA9IGNvcHlfZnJvbV91c2VyKCZmcHJlZ3MsIGJ1Ziwgc2l6ZW9mKGZwcmVncykpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vcHRyYWNlXzY0LmMgYi9hcmNoL3g4Ni91bS9wdHJhY2VfNjQuYwppbmRleCBmYWFiNDE4Li4wYjVjMTg0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni91bS9wdHJhY2VfNjQuYworKysgYi9hcmNoL3g4Ni91bS9wdHJhY2VfNjQuYwpAQCAtNzgsNyArNzgsMTEgQEAKIAljYXNlIFJTSToKIAljYXNlIFJESToKIAljYXNlIFJCUDoKKwkJYnJlYWs7CisKIAljYXNlIE9SSUdfUkFYOgorCQkvKiBVcGRhdGUgdGhlIHN5c2NhbGwgbnVtYmVyLiAqLworCQlVUFRfU1lTQ0FMTF9OUigmY2hpbGQtPnRocmVhZC5yZWdzLnJlZ3MpID0gdmFsdWU7CiAJCWJyZWFrOwogCiAJY2FzZSBGUzoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwppbmRleCA4ZmZiMDg5Li5mMWQyMTgyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKKysrIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIERFRklORV9QRVJfQ1BVKHN0cnVjdCB2Y3B1X2luZm8sIHhlbl92Y3B1X2luZm8pOwogCiAvKiBMaW51eCA8LT4gWGVuIHZDUFUgaWQgbWFwcGluZyAqLwotREVGSU5FX1BFUl9DUFUoaW50LCB4ZW5fdmNwdV9pZCkgPSAtMTsKK0RFRklORV9QRVJfQ1BVKHVpbnQzMl90LCB4ZW5fdmNwdV9pZCk7CiBFWFBPUlRfUEVSX0NQVV9TWU1CT0woeGVuX3ZjcHVfaWQpOwogCiBlbnVtIHhlbl9kb21haW5fdHlwZSB4ZW5fZG9tYWluX3R5cGUgPSBYRU5fTkFUSVZFOwpAQCAtMTIzNyw3ICsxMjM3LDYgQEAKIAkud3JpdGVfY3IwID0geGVuX3dyaXRlX2NyMCwKIAogCS5yZWFkX2NyNCA9IG5hdGl2ZV9yZWFkX2NyNCwKLQkucmVhZF9jcjRfc2FmZSA9IG5hdGl2ZV9yZWFkX2NyNF9zYWZlLAogCS53cml0ZV9jcjQgPSB4ZW5fd3JpdGVfY3I0LAogCiAjaWZkZWYgQ09ORklHX1g4Nl82NApAQCAtMTkyNSw2ICsxOTI0LDQ1IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCB4ZW5fcGluX3ZjcHUoaW50IGNwdSkKK3sKKwlzdGF0aWMgYm9vbCBkaXNhYmxlX3Bpbm5pbmc7CisJc3RydWN0IHNjaGVkX3Bpbl9vdmVycmlkZSBwaW5fb3ZlcnJpZGU7CisJaW50IHJldDsKKworCWlmIChkaXNhYmxlX3Bpbm5pbmcpCisJCXJldHVybjsKKworCXBpbl9vdmVycmlkZS5wY3B1ID0gY3B1OworCXJldCA9IEhZUEVSVklTT1Jfc2NoZWRfb3AoU0NIRURPUF9waW5fb3ZlcnJpZGUsICZwaW5fb3ZlcnJpZGUpOworCisJLyogSWdub3JlIGVycm9ycyB3aGVuIHJlbW92aW5nIG92ZXJyaWRlLiAqLworCWlmIChjcHUgPCAwKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgLUVOT1NZUzoKKwkJcHJfd2FybigiVW5hYmxlIHRvIHBpbiBvbiBwaHlzaWNhbCBjcHUgJWQuIEluIGNhc2Ugb2YgcHJvYmxlbXMgY29uc2lkZXIgdmNwdSBwaW5uaW5nLlxuIiwKKwkJCWNwdSk7CisJCWRpc2FibGVfcGlubmluZyA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgLUVQRVJNOgorCQlXQVJOKDEsICJUcnlpbmcgdG8gcGluIHZjcHUgd2l0aG91dCBoYXZpbmcgcHJpdmlsZWdlIHRvIGRvIHNvXG4iKTsKKwkJZGlzYWJsZV9waW5uaW5nID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSAtRUlOVkFMOgorCWNhc2UgLUVCVVNZOgorCQlwcl93YXJuKCJQaHlzaWNhbCBjcHUgJWQgbm90IGF2YWlsYWJsZSBmb3IgcGlubmluZy4gQ2hlY2sgWGVuIGNwdSBjb25maWd1cmF0aW9uLlxuIiwKKwkJCWNwdSk7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTigxLCAicmMgJWQgd2hpbGUgdHJ5aW5nIHRvIHBpbiB2Y3B1XG4iLCByZXQpOworCQlkaXNhYmxlX3Bpbm5pbmcgPSB0cnVlOworCX0KK30KKwogY29uc3Qgc3RydWN0IGh5cGVydmlzb3JfeDg2IHg4Nl9oeXBlcl94ZW4gPSB7CiAJLm5hbWUJCQk9ICJYZW4iLAogCS5kZXRlY3QJCQk9IHhlbl9wbGF0Zm9ybSwKQEAgLTE5MzMsNiArMTk3MSw3IEBACiAjZW5kaWYKIAkueDJhcGljX2F2YWlsYWJsZQk9IHhlbl94MmFwaWNfcGFyYV9hdmFpbGFibGUsCiAJLnNldF9jcHVfZmVhdHVyZXMgICAgICAgPSB4ZW5fc2V0X2NwdV9mZWF0dXJlcywKKwkucGluX3ZjcHUgICAgICAgICAgICAgICA9IHhlbl9waW5fdmNwdSwKIH07CiBFWFBPUlRfU1lNQk9MKHg4Nl9oeXBlcl94ZW4pOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vc2V0dXAuYyBiL2FyY2gveDg2L3hlbi9zZXR1cC5jCmluZGV4IDE3NjQyNTIuLmY4OTYwZmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9zZXR1cC5jCisrKyBiL2FyY2gveDg2L3hlbi9zZXR1cC5jCkBAIC04NjEsNyArODYxLDcgQEAKIAllODIwX2FkZF9yZWdpb24oSVNBX1NUQVJUX0FERFJFU1MsIElTQV9FTkRfQUREUkVTUyAtIElTQV9TVEFSVF9BRERSRVNTLAogCQkJRTgyMF9SRVNFUlZFRCk7CiAKLQlzYW5pdGl6ZV9lODIwX21hcChlODIwLm1hcCwgQVJSQVlfU0laRShlODIwLm1hcCksICZlODIwLm5yX21hcCk7CisJc2FuaXRpemVfZTgyMF9tYXAoZTgyMC0+bWFwLCBBUlJBWV9TSVpFKGU4MjAtPm1hcCksICZlODIwLT5ucl9tYXApOwogCiAJLyoKIAkgKiBDaGVjayB3aGV0aGVyIHRoZSBrZXJuZWwgaXRzZWxmIGNvbmZsaWN0cyB3aXRoIHRoZSB0YXJnZXQgRTgyMCBtYXAuCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vc3BpbmxvY2suYyBiL2FyY2gveDg2L3hlbi9zcGlubG9jay5jCmluZGV4IGY0MmU3OGQuLjNkNmUwMDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9zcGlubG9jay5jCisrKyBiL2FyY2gveDg2L3hlbi9zcGlubG9jay5jCkBAIC0yMSw4ICsyMSw2IEBACiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoY2hhciAqLCBpcnFfbmFtZSk7CiBzdGF0aWMgYm9vbCB4ZW5fcHZzcGluID0gdHJ1ZTsKIAotI2lmZGVmIENPTkZJR19RVUVVRURfU1BJTkxPQ0tTCi0KICNpbmNsdWRlIDxhc20vcXNwaW5sb2NrLmg+CiAKIHN0YXRpYyB2b2lkIHhlbl9xbG9ja19raWNrKGludCBjcHUpCkBAIC03MSwyMDcgKzY5LDYgQEAKIAl4ZW5fcG9sbF9pcnEoaXJxKTsKIH0KIAotI2Vsc2UgLyogQ09ORklHX1FVRVVFRF9TUElOTE9DS1MgKi8KLQotZW51bSB4ZW5fY29udGVudGlvbl9zdGF0IHsKLQlUQUtFTl9TTE9XLAotCVRBS0VOX1NMT1dfUElDS1VQLAotCVRBS0VOX1NMT1dfU1BVUklPVVMsCi0JUkVMRUFTRURfU0xPVywKLQlSRUxFQVNFRF9TTE9XX0tJQ0tFRCwKLQlOUl9DT05URU5USU9OX1NUQVRTCi19OwotCi0KLSNpZmRlZiBDT05GSUdfWEVOX0RFQlVHX0ZTCi0jZGVmaW5lIEhJU1RPX0JVQ0tFVFMJMzAKLXN0YXRpYyBzdHJ1Y3QgeGVuX3NwaW5sb2NrX3N0YXRzCi17Ci0JdTMyIGNvbnRlbnRpb25fc3RhdHNbTlJfQ09OVEVOVElPTl9TVEFUU107Ci0JdTMyIGhpc3RvX3NwaW5fYmxvY2tlZFtISVNUT19CVUNLRVRTKzFdOwotCXU2NCB0aW1lX2Jsb2NrZWQ7Ci19IHNwaW5sb2NrX3N0YXRzOwotCi1zdGF0aWMgdTggemVyb19zdGF0czsKLQotc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3plcm8odm9pZCkKLXsKLQl1OCByZXQ7Ci0JdTggb2xkID0gUkVBRF9PTkNFKHplcm9fc3RhdHMpOwotCWlmICh1bmxpa2VseShvbGQpKSB7Ci0JCXJldCA9IGNtcHhjaGcoJnplcm9fc3RhdHMsIG9sZCwgMCk7Ci0JCS8qIFRoaXMgZW5zdXJlcyBvbmx5IG9uZSBmZWxsb3cgcmVzZXRzIHRoZSBzdGF0ICovCi0JCWlmIChyZXQgPT0gb2xkKQotCQkJbWVtc2V0KCZzcGlubG9ja19zdGF0cywgMCwgc2l6ZW9mKHNwaW5sb2NrX3N0YXRzKSk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRkX3N0YXRzKGVudW0geGVuX2NvbnRlbnRpb25fc3RhdCB2YXIsIHUzMiB2YWwpCi17Ci0JY2hlY2tfemVybygpOwotCXNwaW5sb2NrX3N0YXRzLmNvbnRlbnRpb25fc3RhdHNbdmFyXSArPSB2YWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTY0IHNwaW5fdGltZV9zdGFydCh2b2lkKQotewotCXJldHVybiB4ZW5fY2xvY2tzb3VyY2VfcmVhZCgpOwotfQotCi1zdGF0aWMgdm9pZCBfX3NwaW5fdGltZV9hY2N1bSh1NjQgZGVsdGEsIHUzMiAqYXJyYXkpCi17Ci0JdW5zaWduZWQgaW5kZXggPSBpbG9nMihkZWx0YSk7Ci0KLQljaGVja196ZXJvKCk7Ci0KLQlpZiAoaW5kZXggPCBISVNUT19CVUNLRVRTKQotCQlhcnJheVtpbmRleF0rKzsKLQllbHNlCi0JCWFycmF5W0hJU1RPX0JVQ0tFVFNdKys7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzcGluX3RpbWVfYWNjdW1fYmxvY2tlZCh1NjQgc3RhcnQpCi17Ci0JdTMyIGRlbHRhID0geGVuX2Nsb2Nrc291cmNlX3JlYWQoKSAtIHN0YXJ0OwotCi0JX19zcGluX3RpbWVfYWNjdW0oZGVsdGEsIHNwaW5sb2NrX3N0YXRzLmhpc3RvX3NwaW5fYmxvY2tlZCk7Ci0Jc3BpbmxvY2tfc3RhdHMudGltZV9ibG9ja2VkICs9IGRlbHRhOwotfQotI2Vsc2UgIC8qICFDT05GSUdfWEVOX0RFQlVHX0ZTICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRkX3N0YXRzKGVudW0geGVuX2NvbnRlbnRpb25fc3RhdCB2YXIsIHUzMiB2YWwpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTY0IHNwaW5fdGltZV9zdGFydCh2b2lkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3Bpbl90aW1lX2FjY3VtX2Jsb2NrZWQodTY0IHN0YXJ0KQotewotfQotI2VuZGlmICAvKiBDT05GSUdfWEVOX0RFQlVHX0ZTICovCi0KLXN0cnVjdCB4ZW5fbG9ja193YWl0aW5nIHsKLQlzdHJ1Y3QgYXJjaF9zcGlubG9jayAqbG9jazsKLQlfX3RpY2tldF90IHdhbnQ7Ci19OwotCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHhlbl9sb2NrX3dhaXRpbmcsIGxvY2tfd2FpdGluZyk7Ci1zdGF0aWMgY3B1bWFza190IHdhaXRpbmdfY3B1czsKLQotX192aXNpYmxlIHZvaWQgeGVuX2xvY2tfc3Bpbm5pbmcoc3RydWN0IGFyY2hfc3BpbmxvY2sgKmxvY2ssIF9fdGlja2V0X3Qgd2FudCkKLXsKLQlpbnQgaXJxID0gX190aGlzX2NwdV9yZWFkKGxvY2tfa2lja2VyX2lycSk7Ci0Jc3RydWN0IHhlbl9sb2NrX3dhaXRpbmcgKncgPSB0aGlzX2NwdV9wdHIoJmxvY2tfd2FpdGluZyk7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQl1NjQgc3RhcnQ7Ci0JX190aWNrZXRfdCBoZWFkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBJZiBraWNrZXIgaW50ZXJydXB0cyBub3QgaW5pdGlhbGl6ZWQgeWV0LCBqdXN0IHNwaW4gKi8KLQlpZiAoaXJxID09IC0xKQotCQlyZXR1cm47Ci0KLQlzdGFydCA9IHNwaW5fdGltZV9zdGFydCgpOwotCi0JLyoKLQkgKiBNYWtlIHN1cmUgYW4gaW50ZXJydXB0IGhhbmRsZXIgY2FuJ3QgdXBzZXQgdGhpbmdzIGluIGEKLQkgKiBwYXJ0aWFsbHkgc2V0dXAgc3RhdGUuCi0JICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qCi0JICogV2UgZG9uJ3QgcmVhbGx5IGNhcmUgaWYgd2UncmUgb3ZlcndyaXRpbmcgc29tZSBvdGhlcgotCSAqIChsb2NrLHdhbnQpIHBhaXIsIGFzIHRoYXQgd291bGQgbWVhbiB0aGF0IHdlJ3JlIGN1cnJlbnRseQotCSAqIGluIGFuIGludGVycnVwdCBjb250ZXh0LCBhbmQgdGhlIG91dGVyIGNvbnRleHQgaGFkCi0JICogaW50ZXJydXB0cyBlbmFibGVkLiAgVGhhdCBoYXMgYWxyZWFkeSBraWNrZWQgdGhlIFZDUFUgb3V0Ci0JICogb2YgeGVuX3BvbGxfaXJxKCksIHNvIGl0IHdpbGwganVzdCByZXR1cm4gc3B1cmlvdXNseSBhbmQKLQkgKiByZXRyeSB3aXRoIG5ld2x5IHNldHVwIChsb2NrLHdhbnQpLgotCSAqCi0JICogVGhlIG9yZGVyaW5nIHByb3RvY29sIG9uIHRoaXMgaXMgdGhhdCB0aGUgImxvY2siIHBvaW50ZXIKLQkgKiBtYXkgb25seSBiZSBzZXQgbm9uLU5VTEwgaWYgdGhlICJ3YW50IiB0aWNrZXQgaXMgY29ycmVjdC4KLQkgKiBJZiB3ZSdyZSB1cGRhdGluZyAid2FudCIsIHdlIG11c3QgZmlyc3QgY2xlYXIgImxvY2siLgotCSAqLwotCXctPmxvY2sgPSBOVUxMOwotCXNtcF93bWIoKTsKLQl3LT53YW50ID0gd2FudDsKLQlzbXBfd21iKCk7Ci0Jdy0+bG9jayA9IGxvY2s7Ci0KLQkvKiBUaGlzIHVzZXMgc2V0X2JpdCwgd2hpY2ggYXRvbWljIGFuZCB0aGVyZWZvcmUgYSBiYXJyaWVyICovCi0JY3B1bWFza19zZXRfY3B1KGNwdSwgJndhaXRpbmdfY3B1cyk7Ci0JYWRkX3N0YXRzKFRBS0VOX1NMT1csIDEpOwotCi0JLyogY2xlYXIgcGVuZGluZyAqLwotCXhlbl9jbGVhcl9pcnFfcGVuZGluZyhpcnEpOwotCi0JLyogT25seSBjaGVjayBsb2NrIG9uY2UgcGVuZGluZyBjbGVhcmVkICovCi0JYmFycmllcigpOwotCi0JLyoKLQkgKiBNYXJrIGVudHJ5IHRvIHNsb3dwYXRoIGJlZm9yZSBkb2luZyB0aGUgcGlja3VwIHRlc3QgdG8gbWFrZQotCSAqIHN1cmUgd2UgZG9uJ3QgZGVhZGxvY2sgd2l0aCBhbiB1bmxvY2tlci4KLQkgKi8KLQlfX3RpY2tldF9lbnRlcl9zbG93cGF0aChsb2NrKTsKLQotCS8qIG1ha2Ugc3VyZSBlbnRlcl9zbG93cGF0aCwgd2hpY2ggaXMgYXRvbWljIGRvZXMgbm90IGNyb3NzIHRoZSByZWFkICovCi0Jc21wX21iX19hZnRlcl9hdG9taWMoKTsKLQotCS8qCi0JICogY2hlY2sgYWdhaW4gbWFrZSBzdXJlIGl0IGRpZG4ndCBiZWNvbWUgZnJlZSB3aGlsZQotCSAqIHdlIHdlcmVuJ3QgbG9va2luZwotCSAqLwotCWhlYWQgPSBSRUFEX09OQ0UobG9jay0+dGlja2V0cy5oZWFkKTsKLQlpZiAoX190aWNrZXRzX2VxdWFsKGhlYWQsIHdhbnQpKSB7Ci0JCWFkZF9zdGF0cyhUQUtFTl9TTE9XX1BJQ0tVUCwgMSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIEFsbG93IGludGVycnVwdHMgd2hpbGUgYmxvY2tlZCAqLwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCS8qCi0JICogSWYgYW4gaW50ZXJydXB0IGhhcHBlbnMgaGVyZSwgaXQgd2lsbCBsZWF2ZSB0aGUgd2FrZXVwIGlycQotCSAqIHBlbmRpbmcsIHdoaWNoIHdpbGwgY2F1c2UgeGVuX3BvbGxfaXJxKCkgdG8gcmV0dXJuCi0JICogaW1tZWRpYXRlbHkuCi0JICovCi0KLQkvKiBCbG9jayB1bnRpbCBpcnEgYmVjb21lcyBwZW5kaW5nIChvciBwZXJoYXBzIGEgc3B1cmlvdXMgd2FrZXVwKSAqLwotCXhlbl9wb2xsX2lycShpcnEpOwotCWFkZF9zdGF0cyhUQUtFTl9TTE9XX1NQVVJJT1VTLCAheGVuX3Rlc3RfaXJxX3BlbmRpbmcoaXJxKSk7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlrc3RhdF9pbmNyX2lycV90aGlzX2NwdShpcnEpOwotb3V0OgotCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgJndhaXRpbmdfY3B1cyk7Ci0Jdy0+bG9jayA9IE5VTEw7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlzcGluX3RpbWVfYWNjdW1fYmxvY2tlZChzdGFydCk7Ci19Ci1QVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKHhlbl9sb2NrX3NwaW5uaW5nKTsKLQotc3RhdGljIHZvaWQgeGVuX3VubG9ja19raWNrKHN0cnVjdCBhcmNoX3NwaW5sb2NrICpsb2NrLCBfX3RpY2tldF90IG5leHQpCi17Ci0JaW50IGNwdTsKLQotCWFkZF9zdGF0cyhSRUxFQVNFRF9TTE9XLCAxKTsKLQotCWZvcl9lYWNoX2NwdShjcHUsICZ3YWl0aW5nX2NwdXMpIHsKLQkJY29uc3Qgc3RydWN0IHhlbl9sb2NrX3dhaXRpbmcgKncgPSAmcGVyX2NwdShsb2NrX3dhaXRpbmcsIGNwdSk7Ci0KLQkJLyogTWFrZSBzdXJlIHdlIHJlYWQgbG9jayBiZWZvcmUgd2FudCAqLwotCQlpZiAoUkVBRF9PTkNFKHctPmxvY2spID09IGxvY2sgJiYKLQkJICAgIFJFQURfT05DRSh3LT53YW50KSA9PSBuZXh0KSB7Ci0JCQlhZGRfc3RhdHMoUkVMRUFTRURfU0xPV19LSUNLRUQsIDEpOwotCQkJeGVuX3NlbmRfSVBJX29uZShjcHUsIFhFTl9TUElOX1VOTE9DS19WRUNUT1IpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0jZW5kaWYgLyogQ09ORklHX1FVRVVFRF9TUElOTE9DS1MgKi8KLQogc3RhdGljIGlycXJldHVybl90IGR1bW15X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCUJVRygpOwpAQCAtMzM0LDE2ICsxMzEsMTIgQEAKIAkJcmV0dXJuOwogCX0KIAlwcmludGsoS0VSTl9ERUJVRyAieGVuOiBQViBzcGlubG9ja3MgZW5hYmxlZFxuIik7Ci0jaWZkZWYgQ09ORklHX1FVRVVFRF9TUElOTE9DS1MKKwogCV9fcHZfaW5pdF9sb2NrX2hhc2goKTsKIAlwdl9sb2NrX29wcy5xdWV1ZWRfc3Bpbl9sb2NrX3Nsb3dwYXRoID0gX19wdl9xdWV1ZWRfc3Bpbl9sb2NrX3Nsb3dwYXRoOwogCXB2X2xvY2tfb3BzLnF1ZXVlZF9zcGluX3VubG9jayA9IFBWX0NBTExFRV9TQVZFKF9fcHZfcXVldWVkX3NwaW5fdW5sb2NrKTsKIAlwdl9sb2NrX29wcy53YWl0ID0geGVuX3Fsb2NrX3dhaXQ7CiAJcHZfbG9ja19vcHMua2ljayA9IHhlbl9xbG9ja19raWNrOwotI2Vsc2UKLQlwdl9sb2NrX29wcy5sb2NrX3NwaW5uaW5nID0gUFZfQ0FMTEVFX1NBVkUoeGVuX2xvY2tfc3Bpbm5pbmcpOwotCXB2X2xvY2tfb3BzLnVubG9ja19raWNrID0geGVuX3VubG9ja19raWNrOwotI2VuZGlmCiB9CiAKIC8qCkBAIC0zNzIsNDQgKzE2NSwzIEBACiB9CiBlYXJseV9wYXJhbSgieGVuX25vcHZzcGluIiwgeGVuX3BhcnNlX25vcHZzcGluKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1hFTl9ERUJVR19GUykgJiYgIWRlZmluZWQoQ09ORklHX1FVRVVFRF9TUElOTE9DS1MpCi0KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkX3NwaW5fZGVidWc7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHhlbl9zcGlubG9ja19kZWJ1Z2ZzKHZvaWQpCi17Ci0Jc3RydWN0IGRlbnRyeSAqZF94ZW4gPSB4ZW5faW5pdF9kZWJ1Z2ZzKCk7Ci0KLQlpZiAoZF94ZW4gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAoIXhlbl9wdnNwaW4pCi0JCXJldHVybiAwOwotCi0JZF9zcGluX2RlYnVnID0gZGVidWdmc19jcmVhdGVfZGlyKCJzcGlubG9ja3MiLCBkX3hlbik7Ci0KLQlkZWJ1Z2ZzX2NyZWF0ZV91OCgiemVyb19zdGF0cyIsIDA2NDQsIGRfc3Bpbl9kZWJ1ZywgJnplcm9fc3RhdHMpOwotCi0JZGVidWdmc19jcmVhdGVfdTMyKCJ0YWtlbl9zbG93IiwgMDQ0NCwgZF9zcGluX2RlYnVnLAotCQkJICAgJnNwaW5sb2NrX3N0YXRzLmNvbnRlbnRpb25fc3RhdHNbVEFLRU5fU0xPV10pOwotCWRlYnVnZnNfY3JlYXRlX3UzMigidGFrZW5fc2xvd19waWNrdXAiLCAwNDQ0LCBkX3NwaW5fZGVidWcsCi0JCQkgICAmc3BpbmxvY2tfc3RhdHMuY29udGVudGlvbl9zdGF0c1tUQUtFTl9TTE9XX1BJQ0tVUF0pOwotCWRlYnVnZnNfY3JlYXRlX3UzMigidGFrZW5fc2xvd19zcHVyaW91cyIsIDA0NDQsIGRfc3Bpbl9kZWJ1ZywKLQkJCSAgICZzcGlubG9ja19zdGF0cy5jb250ZW50aW9uX3N0YXRzW1RBS0VOX1NMT1dfU1BVUklPVVNdKTsKLQotCWRlYnVnZnNfY3JlYXRlX3UzMigicmVsZWFzZWRfc2xvdyIsIDA0NDQsIGRfc3Bpbl9kZWJ1ZywKLQkJCSAgICZzcGlubG9ja19zdGF0cy5jb250ZW50aW9uX3N0YXRzW1JFTEVBU0VEX1NMT1ddKTsKLQlkZWJ1Z2ZzX2NyZWF0ZV91MzIoInJlbGVhc2VkX3Nsb3dfa2lja2VkIiwgMDQ0NCwgZF9zcGluX2RlYnVnLAotCQkJICAgJnNwaW5sb2NrX3N0YXRzLmNvbnRlbnRpb25fc3RhdHNbUkVMRUFTRURfU0xPV19LSUNLRURdKTsKLQotCWRlYnVnZnNfY3JlYXRlX3U2NCgidGltZV9ibG9ja2VkIiwgMDQ0NCwgZF9zcGluX2RlYnVnLAotCQkJICAgJnNwaW5sb2NrX3N0YXRzLnRpbWVfYmxvY2tlZCk7Ci0KLQlkZWJ1Z2ZzX2NyZWF0ZV91MzJfYXJyYXkoImhpc3RvX2Jsb2NrZWQiLCAwNDQ0LCBkX3NwaW5fZGVidWcsCi0JCQkJc3BpbmxvY2tfc3RhdHMuaGlzdG9fc3Bpbl9ibG9ja2VkLCBISVNUT19CVUNLRVRTICsgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLWZzX2luaXRjYWxsKHhlbl9zcGlubG9ja19kZWJ1Z2ZzKTsKLQotI2VuZGlmCS8qIENPTkZJR19YRU5fREVCVUdfRlMgKi8KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL0tjb25maWcgYi9hcmNoL3h0ZW5zYS9LY29uZmlnCmluZGV4IDY0MzM2ZjYuLmY2MTA1ODYgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL0tjb25maWcKKysrIGIvYXJjaC94dGVuc2EvS2NvbmZpZwpAQCAtMTMsMTYgKzEzLDE5IEBACiAJc2VsZWN0IEdFTkVSSUNfSVJRX1NIT1cKIAlzZWxlY3QgR0VORVJJQ19QQ0lfSU9NQVAKIAlzZWxlY3QgR0VORVJJQ19TQ0hFRF9DTE9DSworCXNlbGVjdCBIQVZFX0RFQlVHX0tNRU1MRUFLCiAJc2VsZWN0IEhBVkVfRE1BX0FQSV9ERUJVRwogCXNlbGVjdCBIQVZFX0VYSVRfVEhSRUFECiAJc2VsZWN0IEhBVkVfRlVOQ1RJT05fVFJBQ0VSCiAJc2VsZWN0IEhBVkVfRlVURVhfQ01QWENIRyBpZiAhTU1VCiAJc2VsZWN0IEhBVkVfSFdfQlJFQUtQT0lOVCBpZiBQRVJGX0VWRU5UUwogCXNlbGVjdCBIQVZFX0lSUV9USU1FX0FDQ09VTlRJTkcKKwlzZWxlY3QgSEFWRV9NRU1CTE9DSwogCXNlbGVjdCBIQVZFX09QUk9GSUxFCiAJc2VsZWN0IEhBVkVfUEVSRl9FVkVOVFMKIAlzZWxlY3QgSVJRX0RPTUFJTgogCXNlbGVjdCBNT0RVTEVTX1VTRV9FTEZfUkVMQQorCXNlbGVjdCBOT19CT09UTUVNCiAJc2VsZWN0IFBFUkZfVVNFX1ZNQUxMT0MKIAlzZWxlY3QgVklSVF9UT19CVVMKIAloZWxwCkBAIC0yMDksNyArMjEyLDggQEAKIAogY29uZmlnIElOSVRJQUxJWkVfWFRFTlNBX01NVV9JTlNJREVfVk1MSU5VWAogCWJvb2wgIkluaXRpYWxpemUgWHRlbnNhIE1NVSBpbnNpZGUgdGhlIExpbnV4IGtlcm5lbCBjb2RlIgotCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gIVhURU5TQV9WQVJJQU5UX0ZTRiAmJiAhWFRFTlNBX1ZBUklBTlRfREMyMzJCCisJZGVmYXVsdCB5IGlmIFhURU5TQV9WQVJJQU5UX0RDMjMzQyB8fCBYVEVOU0FfVkFSSUFOVF9DVVNUT00KIAloZWxwCiAJICBFYXJsaWVyIHZlcnNpb24gaW5pdGlhbGl6ZWQgdGhlIE1NVSBpbiB0aGUgZXhjZXB0aW9uIHZlY3RvcgogCSAgYmVmb3JlIGp1bXBpbmcgdG8gX3N0YXJ0dXAgaW4gaGVhZC5TIGFuZCBoYWQgYW4gYWR2YW50YWdlIHRoYXQKQEAgLTIzNiw2ICsyNDAsNzEgQEAKIAogCSAgSWYgaW4gZG91YnQsIHNheSBZLgogCitjb25maWcgS1NFR19QQUREUgorCWhleCAiUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgS1NFRyBtYXBwaW5nIgorCWRlcGVuZHMgb24gSU5JVElBTElaRV9YVEVOU0FfTU1VX0lOU0lERV9WTUxJTlVYICYmIE1NVQorCWRlZmF1bHQgMHgwMDAwMDAwMAorCWhlbHAKKwkgIFRoaXMgaXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgd2hlcmUgS1NFRyBpcyBtYXBwZWQuIFBsZWFzZSByZWZlciB0bworCSAgdGhlIGNob3NlbiBLU0VHIGxheW91dCBoZWxwIGZvciB0aGUgcmVxdWlyZWQgYWRkcmVzcyBhbGlnbm1lbnQuCisJICBVbnBhY2tlZCBrZXJuZWwgaW1hZ2UgKGluY2x1ZGluZyB2ZWN0b3JzKSBtdXN0IGJlIGxvY2F0ZWQgY29tcGxldGVseQorCSAgd2l0aGluIEtTRUcuCisJICBQaHlzaWNhbCBtZW1vcnkgYmVsb3cgdGhpcyBhZGRyZXNzIGlzIG5vdCBhdmFpbGFibGUgdG8gbGludXguCisKKwkgIElmIHVuc3VyZSwgbGVhdmUgdGhlIGRlZmF1bHQgdmFsdWUgaGVyZS4KKworY29uZmlnIEtFUk5FTF9MT0FEX0FERFJFU1MKKwloZXggIktlcm5lbCBsb2FkIGFkZHJlc3MiCisJZGVmYXVsdCAweDYwMDAzMDAwIGlmICFNTVUKKwlkZWZhdWx0IDB4MDAwMDMwMDAgaWYgTU1VICYmIElOSVRJQUxJWkVfWFRFTlNBX01NVV9JTlNJREVfVk1MSU5VWAorCWRlZmF1bHQgMHhkMDAwMzAwMCBpZiBNTVUgJiYgIUlOSVRJQUxJWkVfWFRFTlNBX01NVV9JTlNJREVfVk1MSU5VWAorCWhlbHAKKwkgIFRoaXMgaXMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIGtlcm5lbCBpcyBsb2FkZWQuCisJICBJdCBpcyB2aXJ0dWFsIGFkZHJlc3MgZm9yIE1NVXYyIGNvbmZpZ3VyYXRpb25zIGFuZCBwaHlzaWNhbCBhZGRyZXNzCisJICBmb3IgYWxsIG90aGVyIGNvbmZpZ3VyYXRpb25zLgorCisJICBJZiB1bnN1cmUsIGxlYXZlIHRoZSBkZWZhdWx0IHZhbHVlIGhlcmUuCisKK2NvbmZpZyBWRUNUT1JTX09GRlNFVAorCWhleCAiS2VybmVsIHZlY3RvcnMgb2Zmc2V0IgorCWRlZmF1bHQgMHgwMDAwMzAwMAorCWhlbHAKKwkgIFRoaXMgaXMgdGhlIG9mZnNldCBvZiB0aGUga2VybmVsIGltYWdlIGZyb20gdGhlIHJlbG9jYXRhYmxlIHZlY3RvcnMKKwkgIGJhc2UuCisKKwkgIElmIHVuc3VyZSwgbGVhdmUgdGhlIGRlZmF1bHQgdmFsdWUgaGVyZS4KKworY2hvaWNlCisJcHJvbXB0ICJLU0VHIGxheW91dCIKKwlkZXBlbmRzIG9uIE1NVQorCWRlZmF1bHQgWFRFTlNBX0tTRUdfTU1VX1YyCisKK2NvbmZpZyBYVEVOU0FfS1NFR19NTVVfVjIKKwlib29sICJNTVV2MjogMTI4TUIgY2FjaGVkICsgMTI4TUIgdW5jYWNoZWQiCisJaGVscAorCSAgTU1VdjIgY29tcGF0aWJsZSBrZXJuZWwgbWVtb3J5IG1hcDogVExCIHdheSA1IG1hcHMgMTI4TUIgc3RhcnRpbmcKKwkgIGF0IEtTRUdfUEFERFIgdG8gMHhkMDAwMDAwMCB3aXRoIGNhY2hlIGFuZCB0byAweGQ4MDAwMDAwCisJICB3aXRob3V0IGNhY2hlLgorCSAgS1NFR19QQUREUiBtdXN0IGJlIGFsaWduZWQgdG8gMTI4TUIuCisKK2NvbmZpZyBYVEVOU0FfS1NFR18yNTZNCisJYm9vbCAiMjU2TUIgY2FjaGVkICsgMjU2TUIgdW5jYWNoZWQiCisJZGVwZW5kcyBvbiBJTklUSUFMSVpFX1hURU5TQV9NTVVfSU5TSURFX1ZNTElOVVgKKwloZWxwCisJICBUTEIgd2F5IDYgbWFwcyAyNTZNQiBzdGFydGluZyBhdCBLU0VHX1BBRERSIHRvIDB4YjAwMDAwMDAKKwkgIHdpdGggY2FjaGUgYW5kIHRvIDB4YzAwMDAwMDAgd2l0aG91dCBjYWNoZS4KKwkgIEtTRUdfUEFERFIgbXVzdCBiZSBhbGlnbmVkIHRvIDI1Nk1CLgorCitjb25maWcgWFRFTlNBX0tTRUdfNTEyTQorCWJvb2wgIjUxMk1CIGNhY2hlZCArIDUxMk1CIHVuY2FjaGVkIgorCWRlcGVuZHMgb24gSU5JVElBTElaRV9YVEVOU0FfTU1VX0lOU0lERV9WTUxJTlVYCisJaGVscAorCSAgVExCIHdheSA2IG1hcHMgNTEyTUIgc3RhcnRpbmcgYXQgS1NFR19QQUREUiB0byAweGEwMDAwMDAwCisJICB3aXRoIGNhY2hlIGFuZCB0byAweGMwMDAwMDAwIHdpdGhvdXQgY2FjaGUuCisJICBLU0VHX1BBRERSIG11c3QgYmUgYWxpZ25lZCB0byAyNTZNQi4KKworZW5kY2hvaWNlCisKIGNvbmZpZyBISUdITUVNCiAJYm9vbCAiSGlnaCBNZW1vcnkgU3VwcG9ydCIKIAlkZXBlbmRzIG9uIE1NVQpAQCAtMzMxLDcgKzQwMCw3IEBACiBjb25maWcgWFRFTlNBX1BMQVRGT1JNX1hURlBHQQogCWJvb2wgIlhURlBHQSIKIAlzZWxlY3QgRVRIT0MgaWYgRVRIRVJORVQKLQlzZWxlY3QgUExBVEZPUk1fV0FOVF9ERUZBVUxUX01FTQorCXNlbGVjdCBQTEFURk9STV9XQU5UX0RFRkFVTFRfTUVNIGlmICFNTVUKIAlzZWxlY3QgU0VSSUFMX0NPTlNPTEUKIAlzZWxlY3QgWFRFTlNBX0NBTElCUkFURV9DQ09VTlQKIAloZWxwCkBAIC0zNjksNiArNDM4LDcgQEAKIAlib29sICJGbGF0dGVuZWQgRGV2aWNlIFRyZWUgc3VwcG9ydCIKIAlzZWxlY3QgT0YKIAlzZWxlY3QgT0ZfRUFSTFlfRkxBVFRSRUUKKwlzZWxlY3QgT0ZfUkVTRVJWRURfTUVNCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBmbGF0dGVuZWQgZGV2aWNlIHRyZWUgbWFjaGluZSBkZXNjcmlwdGlvbnMuCiAKQEAgLTQzOSwxNiArNTA5LDkgQEAKIAlkZWZhdWx0IDB4MDAwMDAwMDAgaWYgTU1VCiAJZGVmYXVsdCAweDYwMDAwMDAwIGlmICFNTVUKIAloZWxwCi0JICBUaGlzIGlzIGEgZmFsbGJhY2sgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZGVmYXVsdCBtZW1vcnkgYXJlYSwgaXQgaXMKLQkgIHVzZWQgd2hlbiBubyBwaHlzaWNhbCBtZW1vcnkgc2l6ZSBpcyBwYXNzZWQgdGhyb3VnaCBEVEIgb3IgdGhyb3VnaAotCSAgYm9vdCBwYXJhbWV0ZXIgZnJvbSBib290bG9hZGVyLgotCi0JICBJbiBub01NVSBjb25maWd1cmF0aW9uIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgZGVyaXZlZCBmcm9tIGl0OgotCSAgLSBrZXJuZWwgbG9hZCBhZGRyZXNzOwotCSAgLSBrZXJuZWwgZW50cnkgcG9pbnQgYWRkcmVzczsKLQkgIC0gcmVsb2NhdGFibGUgdmVjdG9ycyBiYXNlIGFkZHJlc3M7Ci0JICAtIHVCb290IGxvYWQgYWRkcmVzczsKLQkgIC0gVEFTS19TSVpFLgorCSAgVGhpcyBpcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZWZhdWx0IG1lbW9yeSBhcmVhLgorCSAgRGVmYXVsdCBtZW1vcnkgYXJlYSBoYXMgcGxhdGZvcm0tc3BlY2lmaWMgbWVhbmluZywgaXQgbWF5IGJlIHVzZWQKKwkgIGZvciBlLmcuIGVhcmx5IGNhY2hlIGluaXRpYWxpemF0aW9uLgogCiAJICBJZiB1bnN1cmUsIGxlYXZlIHRoZSBkZWZhdWx0IHZhbHVlIGhlcmUuCiAKQEAgLTQ1NywxMSArNTIwLDkgQEAKIAlkZXBlbmRzIG9uIFBMQVRGT1JNX1dBTlRfREVGQVVMVF9NRU0KIAlkZWZhdWx0IDB4MDQwMDAwMDAKIAloZWxwCi0JICBUaGlzIGlzIGEgZmFsbGJhY2sgc2l6ZSBvZiB0aGUgZGVmYXVsdCBtZW1vcnkgYXJlYSwgaXQgaXMgdXNlZCB3aGVuCi0JICBubyBwaHlzaWNhbCBtZW1vcnkgc2l6ZSBpcyBwYXNzZWQgdGhyb3VnaCBEVEIgb3IgdGhyb3VnaCBib290Ci0JICBwYXJhbWV0ZXIgZnJvbSBib290bG9hZGVyLgotCi0JICBJdCdzIGFsc28gdXNlZCBmb3IgVEFTS19TSVpFIGNhbGN1bGF0aW9uIGluIG5vTU1VIGNvbmZpZ3VyYXRpb24uCisJICBUaGlzIGlzIHRoZSBzaXplIG9mIHRoZSBkZWZhdWx0IG1lbW9yeSBhcmVhLgorCSAgRGVmYXVsdCBtZW1vcnkgYXJlYSBoYXMgcGxhdGZvcm0tc3BlY2lmaWMgbWVhbmluZywgaXQgbWF5IGJlIHVzZWQKKwkgIGZvciBlLmcuIGVhcmx5IGNhY2hlIGluaXRpYWxpemF0aW9uLgogCiAJICBJZiB1bnN1cmUsIGxlYXZlIHRoZSBkZWZhdWx0IHZhbHVlIGhlcmUuCiAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1lbGYvYm9vdC5sZHMuUyBiL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1lbGYvYm9vdC5sZHMuUwppbmRleCBlNTRmMmM5Li5hMzA5OTMwIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtZWxmL2Jvb3QubGRzLlMKKysrIGIvYXJjaC94dGVuc2EvYm9vdC9ib290LWVsZi9ib290Lmxkcy5TCkBAIC0yMyw3ICsyMyw3IEBACiAJCSooLlJlc2V0VmVjdG9yLnRleHQpCiAJfQogCi0JLmltYWdlIEtFUk5FTE9GRlNFVDogQVQgKExPQURfTUVNT1JZX0FERFJFU1MpCisJLmltYWdlIEtFUk5FTE9GRlNFVDogQVQgKENPTkZJR19LRVJORUxfTE9BRF9BRERSRVNTKQogCXsKIAkJX2ltYWdlX3N0YXJ0ID0gLjsKIAkJKihpbWFnZSkKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1lbGYvYm9vdHN0cmFwLlMgYi9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtZWxmL2Jvb3RzdHJhcC5TCmluZGV4IGU2YmYzMTMuLmI2YWE4NTMgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1lbGYvYm9vdHN0cmFwLlMKKysrIGIvYXJjaC94dGVuc2EvYm9vdC9ib290LWVsZi9ib290c3RyYXAuUwpAQCAtMzUsNyArMzUsMTIgQEAKIAogCS5hbGlnbiA0CiBSb21Jbml0QWRkcjoKLQkud29yZAlMT0FEX01FTU9SWV9BRERSRVNTCisjaWYgZGVmaW5lZChDT05GSUdfSU5JVElBTElaRV9YVEVOU0FfTU1VX0lOU0lERV9WTUxJTlVYKSAmJiBcCisJWENIQUxfSEFWRV9QVFBfTU1VICYmIFhDSEFMX0hBVkVfU1BBTk5JTkdfV0FZCisJLndvcmQJQ09ORklHX0tFUk5FTF9MT0FEX0FERFJFU1MKKyNlbHNlCisJLndvcmQJS0VSTkVMT0ZGU0VUCisjZW5kaWYKIFJvbUJvb3RQYXJhbToKIAkud29yZCBfYm9vdHBhcmFtCiBfYm9vdHBhcmFtOgpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvYm9vdC9ib290LXVib290L01ha2VmaWxlIGIvYXJjaC94dGVuc2EvYm9vdC9ib290LXVib290L01ha2VmaWxlCmluZGV4IDQwM2ZjZjIuLjBmNGM0MTcgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC11Ym9vdC9NYWtlZmlsZQorKysgYi9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtdWJvb3QvTWFrZWZpbGUKQEAgLTQsMTUgKzQsNyBAQAogIyBmb3IgbW9yZSBkZXRhaWxzLgogIwogCi1pZmRlZiBDT05GSUdfTU1VCi1pZmRlZiBDT05GSUdfSU5JVElBTElaRV9YVEVOU0FfTU1VX0lOU0lERV9WTUxJTlVYCi1VSU1BR0VfTE9BREFERFIgPSAweDAwMDAzMDAwCi1lbHNlCi1VSU1BR0VfTE9BREFERFIgPSAweGQwMDAzMDAwCi1lbmRpZgotZWxzZQotVUlNQUdFX0xPQURBRERSID0gJChzaGVsbCBwcmludGYgIjB4JXgiICQkKCggJHtDT05GSUdfREVGQVVMVF9NRU1fU1RBUlR9ICsgMHgzMDAwICkpICkKLWVuZGlmCitVSU1BR0VfTE9BREFERFIgPSAkKENPTkZJR19LRVJORUxfTE9BRF9BRERSRVNTKQogVUlNQUdFX0NPTVBSRVNTSU9OID0gZ3ppcAogCiAkKG9iaikvLi4vdUltYWdlOiB2bWxpbnV4LmJpbi5neiBGT1JDRQpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvYm9vdC9kdHMvY3NwLmR0cyBiL2FyY2gveHRlbnNhL2Jvb3QvZHRzL2NzcC5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4MmYyNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2Jvb3QvZHRzL2NzcC5kdHMKQEAgLTAsMCArMSw1NCBAQAorL2R0cy12MS87CisKKy8geworCWNvbXBhdGlibGUgPSAiY2Rucyx4dGVuc2EteHRmcGdhIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZwaWM+OworCisJY2hvc2VuIHsKKwkJYm9vdGFyZ3MgPSAiZWFybHljb249Y2RucywweGZkMDAwMDAwLDExNTIwMCBjb25zb2xlPXR0eTAgY29uc29sZT10dHlQUzAsMTE1MjAwIHJvb3Q9L2Rldi9yYW0wIHJ3IGVhcmx5cHJpbnRrIHhpbGlueF91YXJ0cHMucnhfdHJpZ2dlcl9sZXZlbD0zMiBsb2dsZXZlbD04IG5vaHo9b2ZmIGlnbm9yZV9sb2dsZXZlbCI7CisJfTsKKworCW1lbW9yeUAwIHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwkJcmVnID0gPDB4MDAwMDAwMDAgMHg0MDAwMDAwMD47CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCWNwdUAwIHsKKwkJCWNvbXBhdGlibGUgPSAiY2Rucyx4dGVuc2EtY3B1IjsKKwkJCXJlZyA9IDwwPjsKKwkJfTsKKwl9OworCisJcGljOiBwaWMgeworCQljb21wYXRpYmxlID0gImNkbnMseHRlbnNhLXBpYyI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCWludGVycnVwdC1jb250cm9sbGVyOworCX07CisKKwljbG9ja3MgeworCQlvc2M6IG1haW4tb3NjaWxsYXRvciB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZpeGVkLWNsb2NrIjsKKwkJfTsKKwl9OworCisJc29jIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQlyYW5nZXMgPSA8MHgwMDAwMDAwMCAweGYwMDAwMDAwIDB4MTAwMDAwMDA+OworCisJCXVhcnQwOiBzZXJpYWxAMGQwMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJ4bG54LHh1YXJ0cHMiLCAiY2Rucyx1YXJ0LXIxcDgiOworCQkJY2xvY2tzID0gPCZvc2M+LCA8Jm9zYz47CisJCQljbG9jay1uYW1lcyA9ICJ1YXJ0X2NsayIsICJwY2xrIjsKKwkJCXJlZyA9IDwweDBkMDAwMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDAgMT47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9ib290L2R0cy94dGZwZ2EuZHRzaSBiL2FyY2gveHRlbnNhL2Jvb3QvZHRzL3h0ZnBnYS5kdHNpCmluZGV4IGNkNDVmOWMuLjkxNjE2YTkgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2Jvb3QvZHRzL3h0ZnBnYS5kdHNpCisrKyBiL2FyY2gveHRlbnNhL2Jvb3QvZHRzL3h0ZnBnYS5kdHNpCkBAIC0xOSw5ICsxOSw3IEBACiAJCWNwdUAwIHsKIAkJCWNvbXBhdGlibGUgPSAiY2Rucyx4dGVuc2EtY3B1IjsKIAkJCXJlZyA9IDwwPjsKLQkJCS8qIEZpbGxlZCBpbiBieSBwbGF0Zm9ybV9zZXR1cCBmcm9tIEZQR0EgcmVnaXN0ZXIKLQkJCSAqIGNsb2NrLWZyZXF1ZW5jeSA9IDwxMDAwMDAwMDA+OwotCQkJICovCisJCQljbG9ja3MgPSA8Jm9zYz47CiAJCX07CiAJfTsKIApAQCAtMzYsMTEgKzM0LDYgQEAKIAl9OwogCiAJY2xvY2tzIHsKLQkJb3NjOiBtYWluLW9zY2lsbGF0b3IgewotCQkJI2Nsb2NrLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmaXhlZC1jbG9jayI7Ci0JCX07Ci0KIAkJY2xrNTQ6IGNsazU0IHsKIAkJCSNjbG9jay1jZWxscyA9IDwwPjsKIAkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOwpAQCAtNTQsNiArNDcsMTIgQEAKIAkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKIAkJcmFuZ2VzID0gPDB4MDAwMDAwMDAgMHhmMDAwMDAwMCAweDEwMDAwMDAwPjsKIAorCQlvc2M6IG1haW4tb3NjaWxsYXRvciB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImNkbnMseHRmcGdhLWNsb2NrIjsKKwkJCXJlZyA9IDwweDBkMDIwMDA0IDB4ND47CisJCX07CisKIAkJc2VyaWFsMDogc2VyaWFsQDBkMDUwMDIwIHsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTBhIjsKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2NvbmZpZ3MvYXVkaW9fa2M3MDVfZGVmY29uZmlnIGIvYXJjaC94dGVuc2EvY29uZmlncy9hdWRpb19rYzcwNV9kZWZjb25maWcKaW5kZXggYzQ5MDRkYi4uOGQxNjkyNSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvY29uZmlncy9hdWRpb19rYzcwNV9kZWZjb25maWcKKysrIGIvYXJjaC94dGVuc2EvY29uZmlncy9hdWRpb19rYzcwNV9kZWZjb25maWcKQEAgLTMzLDcgKzMzLDcgQEAKICMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CiBDT05GSUdfWFRFTlNBX1BMQVRGT1JNX1hURlBHQT15CiBDT05GSUdfQ01ETElORV9CT09MPXkKLUNPTkZJR19DTURMSU5FPSJlYXJseWNvbj11YXJ0ODI1MCxtbWlvMzIsMHhmZDA1MDAyMCwxMTUyMDBuOCBjb25zb2xlPXR0eVMwLDExNTIwMG44IGlwPWRoY3Agcm9vdD0vZGV2L25mcyBydyBkZWJ1ZyIKK0NPTkZJR19DTURMSU5FPSJlYXJseWNvbj11YXJ0ODI1MCxtbWlvMzJuYXRpdmUsMHhmZDA1MDAyMCwxMTUyMDBuOCBjb25zb2xlPXR0eVMwLDExNTIwMG44IGlwPWRoY3Agcm9vdD0vZGV2L25mcyBydyBkZWJ1ZyBtZW1tYXA9MHgzODAwMDAwMEAwIgogQ09ORklHX1VTRV9PRj15CiBDT05GSUdfQlVJTFRJTl9EVEI9ImtjNzA1IgogIyBDT05GSUdfQ09NUEFDVElPTiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9jb25maWdzL2NhZGVuY2VfY3NwX2RlZmNvbmZpZyBiL2FyY2gveHRlbnNhL2NvbmZpZ3MvY2FkZW5jZV9jc3BfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZDMwOTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9jb25maWdzL2NhZGVuY2VfY3NwX2RlZmNvbmZpZwpAQCAtMCwwICsxLDEyMiBAQAorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfVVNFTElCPXkKK0NPTkZJR19JUlFfRE9NQUlOX0RFQlVHPXkKK0NPTkZJR19OT19IWl9JRExFPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX0lSUV9USU1FX0FDQ09VTlRJTkc9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorQ09ORklHX0NHUk9VUF9GUkVFWkVSPXkKK0NPTkZJR19DUFVTRVRTPXkKK0NPTkZJR19DR1JPVVBfREVWSUNFPXkKK0NPTkZJR19DR1JPVVBfQ1BVQUNDVD15CitDT05GSUdfQ0dST1VQX0RFQlVHPXkKK0NPTkZJR19OQU1FU1BBQ0VTPXkKK0NPTkZJR19TQ0hFRF9BVVRPR1JPVVA9eQorQ09ORklHX1JFTEFZPXkKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iJCRLRVJORUxfSU5JVFJBTUZTX1NPVVJDRSIKKyMgQ09ORklHX1JEX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEX0xaTUEgaXMgbm90IHNldAorIyBDT05GSUdfUkRfWFogaXMgbm90IHNldAorIyBDT05GSUdfUkRfTFpPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEX0xaNCBpcyBub3Qgc2V0CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfUFJPRklMSU5HPXkKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRD15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CisjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19YVEVOU0FfVkFSSUFOVF9DVVNUT009eQorQ09ORklHX1hURU5TQV9WQVJJQU5UX0NVU1RPTV9OQU1FPSJjc3AiCitDT05GSUdfWFRFTlNBX1VOQUxJR05FRF9VU0VSPXkKK0NPTkZJR19QUkVFTVBUPXkKK0NPTkZJR19ISUdITUVNPXkKKyMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CitDT05GSUdfWFRFTlNBX1BMQVRGT1JNX1hURlBHQT15CitDT05GSUdfVVNFX09GPXkKK0NPTkZJR19CVUlMVElOX0RUQj0iY3NwIgorIyBDT05GSUdfQ09NUEFDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfWFRGUEdBX0xDRD15CisjIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUPXkKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1VOSVg9eQorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKK0NPTkZJR19JUF9QTlBfUkFSUD15CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAorQ09ORklHX0RFVlRNUEZTPXkKK0NPTkZJR19ERVZUTVBGU19NT1VOVD15CisjIENPTkZJR19TVEFOREFMT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CitDT05GSUdfTVREPXkKK0NPTkZJR19NVERfQ0ZJPXkKK0NPTkZJR19NVERfSkVERUNQUk9CRT15CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CitDT05GSUdfTVREX0NGSV9BTURTVEQ9eQorQ09ORklHX01URF9DRklfU1RBQT15CitDT05GSUdfTVREX1BIWVNNQVBfT0Y9eQorQ09ORklHX01URF9VQkk9eQorQ09ORklHX0JMS19ERVZfTE9PUD15CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX1NDU0k9eQorQ09ORklHX0JMS19ERVZfU0Q9eQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MTYKK0NPTkZJR19TRVJJQUxfWElMSU5YX1BTX1VBUlQ9eQorQ09ORklHX1NFUklBTF9YSUxJTlhfUFNfVUFSVF9DT05TT0xFPXkKK0NPTkZJR19IV19SQU5ET009eQorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorQ09ORklHX1dBVENIRE9HPXkKK0NPTkZJR19XQVRDSERPR19OT1dBWU9VVD15CitDT05GSUdfU09GVF9XQVRDSERPRz15CisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19JT01NVV9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19GQU5PVElGWT15CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfVE1QRlM9eQorQ09ORklHX1RNUEZTX1BPU0lYX0FDTD15CisjIENPTkZJR19NSVNDX0ZJTEVTWVNURU1TIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WND15CitDT05GSUdfTkZTX1NXQVA9eQorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19TVU5SUENfREVCVUc9eQorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQorQ09ORklHX05MU19JU084ODU5XzE9eQorQ09ORklHX1BSSU5US19USU1FPXkKK0NPTkZJR19EWU5BTUlDX0RFQlVHPXkKK0NPTkZJR19ERUJVR19JTkZPPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfTE9DS1VQX0RFVEVDVE9SPXkKKyMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19TQ0hFRFNUQVRTPXkKK0NPTkZJR19USU1FUl9TVEFUUz15CitDT05GSUdfREVCVUdfUlRfTVVURVhFUz15CitDT05GSUdfUFJPVkVfTE9DS0lORz15CitDT05GSUdfREVCVUdfQVRPTUlDX1NMRUVQPXkKK0NPTkZJR19SQ1VfVFJBQ0U9eQorQ09ORklHX0ZVTkNUSU9OX1RSQUNFUj15CisjIENPTkZJR19TMzJDMUlfU0VMRlRFU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDSEFJTklWIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVGTEFURT15CitDT05GSUdfQ1JZUFRPX0xaTz15CisjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvY29uZmlncy9jb21tb25fZGVmY29uZmlnIGIvYXJjaC94dGVuc2EvY29uZmlncy9jb21tb25fZGVmY29uZmlnCmluZGV4IDcyMWRmMTIuLjRiY2M3NmIgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2NvbmZpZ3MvY29tbW9uX2RlZmNvbmZpZworKysgYi9hcmNoL3h0ZW5zYS9jb25maWdzL2NvbW1vbl9kZWZjb25maWcKQEAgLTEsMjA0ICsxLDE1IEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTEtcmMyCi0jIFR1ZSBNYXIgIDEgMTY6MzY6NTMgMjAwNQotIwotIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfWFRFTlNBPXkKLSMgQ09ORklHX1VJRDE2IGlzIG5vdCBzZXQKLUNPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15Ci1DT05GSUdfSEFWRV9ERUNfTE9DSz15Ci0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19DTEVBTl9DT01QSUxFPXkKLUNPTkZJR19CUk9LRU5fT05fU01QPXkKLQotIwotIyBHZW5lcmFsIHNldHVwCi0jCi1DT05GSUdfTE9DQUxWRVJTSU9OPSIiCi1DT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15Ci0jIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAogQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQotIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKLSMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci0jIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKLUNPTkZJR19LT0JKRUNUX1VFVkVOVD15Ci0jIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFBFUlQgaXMgbm90IHNldAotQ09ORklHX0tBTExTWU1TPXkKLSMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKLUNPTkZJR19GVVRFWD15Ci1DT05GSUdfRVBPTEw9eQotIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAotQ09ORklHX1NITUVNPXkKLUNPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAotQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCi1DT05GSUdfQ0NfQUxJR05fTE9PUFM9MAotQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKLSMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAotCi0jCi0jIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0Ci0jCiBDT05GSUdfTU9EVUxFUz15Ci0jIENPTkZJR19NT0RVTEVfVU5MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKIENPTkZJR19NT0RWRVJTSU9OUz15Ci0jIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAotQ09ORklHX0tNT0Q9eQotCi0jCi0jIFByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcwotIwotQ09ORklHX1hURU5TQV9BUkNIX0xJTlVYX0JFPXkKLSMgQ09ORklHX1hURU5TQV9BUkNIX0xJTlVYX0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hURU5TQV9BUkNIX0xJTlVYX1RFU1QgaXMgbm90IHNldAotIyBDT05GSUdfWFRFTlNBX0FSQ0hfUzUgaXMgbm90IHNldAotIyBDT05GSUdfWFRFTlNBX0NVU1RPTSBpcyBub3Qgc2V0Ci1DT05GSUdfTU1VPXkKLSMgQ09ORklHX1hURU5TQV9VTkFMSUdORURfVVNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAotCi0jCi0jIFBsYXRmb3JtIG9wdGlvbnMKLSMKLSMgQ09ORklHX1hURU5TQV9QTEFURk9STV9JU1MgaXMgbm90IHNldAogQ09ORklHX1hURU5TQV9QTEFURk9STV9YVDIwMDA9eQotQ09ORklHX1hURU5TQV9DQUxJQlJBVEVfQ0NPVU5UPXkKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfQ01ETElORV9CT09MPXkKLUNPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVMwLDM4NDAwIGlwPWJvb3RwIHJvb3Q9bmZzIG5mc3Jvb3Q9L29wdC9tb250YXZpc3RhL3Byby9kZXZraXQveHRlbnNhL2xpbnV4X2JlL3RhcmdldCIKLQotIwotIyBCdXMgb3B0aW9ucwotIwotQ09ORklHX1BDST15Ci0jIENPTkZJR19QQ0lfTEVHQUNZX1BST0MgaXMgbm90IHNldAotIyBDT05GSUdfUENJX05BTUVTIGlzIG5vdCBzZXQKLQotIwotIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAotCi0jCi0jIFBDLWNhcmQgYnJpZGdlcwotIwotCi0jCi0jIFBDSSBIb3RwbHVnIFN1cHBvcnQKLSMKLSMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKLQotIwotIyBFeGVjdHVhYmxlIGZpbGUgZm9ybWF0cwotIwotQ09ORklHX0tDT1JFX0VMRj15Ci1DT05GSUdfQklORk1UX0VMRj15CitDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTMCwzODQwMCBpcD1ib290cCByb290PW5mcyBuZnNyb290PS9vcHQvbW9udGF2aXN0YS9wcm8vZGV2a2l0L3h0ZW5zYS9saW51eF9iZS90YXJnZXQgbWVtbWFwPTEyOE1AMCIKIENPTkZJR19CSU5GTVRfTUlTQz15Ci0KLSMKLSMgRGV2aWNlIERyaXZlcnMKLSMKLQotIwotIyBHZW5lcmljIERyaXZlciBPcHRpb25zCi0jCi1DT05GSUdfU1RBTkRBTE9ORT15Ci1DT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci0jIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCi0jIENPTkZJR19NVEQgaXMgbm90IHNldAotCi0jCi0jIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAotIwotIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0Ci0jCi0KLSMKLSMgQmxvY2sgZGV2aWNlcwotIwotIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCi0jIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKLQotIwotIyBJTyBTY2hlZHVsZXJzCi0jCi1DT05GSUdfSU9TQ0hFRF9OT09QPXkKLUNPTkZJR19JT1NDSEVEX0FTPXkKLUNPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKLUNPTkZJR19JT1NDSEVEX0NGUT15Ci0jIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lERSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NTSSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKLSMKLSMgQ09ORklHX01EIGlzIG5vdCBzZXQKLQotIwotIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nIHN1cHBvcnQKLSMKIENPTkZJR19ORVQ9eQotCi0jCi0jIE5ldHdvcmtpbmcgb3B0aW9ucwotIwotIyBDT05GSUdfUEFDS0VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKIENPTkZJR19VTklYPXkKLSMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQogQ09ORklHX0lQX01VTFRJQ0FTVD15CiBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKQEAgLTIwOSw0NyArMjAsMTAgQEAKIENPTkZJR19JUF9QTlBfREhDUD15CiBDT05GSUdfSVBfUE5QX0JPT1RQPXkKIENPTkZJR19JUF9QTlBfUkFSUD15Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCiBDT05GSUdfTkVUX1NDSEVEPXkKLUNPTkZJR19ORVRfU0NIX0NMS19KSUZGSUVTPXkKLSMgQ09ORklHX05FVF9TQ0hfQ0xLX0dFVFRJTUVPRkRBWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfU0NIX0NMS19DUFUgaXMgbm90IHNldAogQ09ORklHX05FVF9TQ0hfQ0JRPW0KIENPTkZJR19ORVRfU0NIX0hUQj1tCi0jIENPTkZJR19ORVRfU0NIX0hGU0MgaXMgbm90IHNldAogQ09ORklHX05FVF9TQ0hfUFJJTz1tCiBDT05GSUdfTkVUX1NDSF9SRUQ9bQogQ09ORklHX05FVF9TQ0hfU0ZRPW0KQEAgLTI1NywzOTkgKzMxLDI0IEBACiBDT05GSUdfTkVUX1NDSF9UQkY9bQogQ09ORklHX05FVF9TQ0hfR1JFRD1tCiBDT05GSUdfTkVUX1NDSF9EU01BUks9bQotIyBDT05GSUdfTkVUX1NDSF9ORVRFTSBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUX1NDSF9JTkdSRVNTPW0KLUNPTkZJR19ORVRfUU9TPXkKLUNPTkZJR19ORVRfRVNUSU1BVE9SPXkKLUNPTkZJR19ORVRfQ0xTPXkKIENPTkZJR19ORVRfQ0xTX1RDSU5ERVg9bQogQ09ORklHX05FVF9DTFNfUk9VVEU0PW0KLUNPTkZJR19ORVRfQ0xTX1JPVVRFPXkKIENPTkZJR19ORVRfQ0xTX0ZXPW0KIENPTkZJR19ORVRfQ0xTX1UzMj1tCi0jIENPTkZJR19DTFNfVTMyX1BFUkYgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0NMU19JTkQgaXMgbm90IHNldAogQ09ORklHX05FVF9DTFNfUlNWUD1tCiBDT05GSUdfTkVUX0NMU19SU1ZQNj1tCi0jIENPTkZJR19ORVRfQ0xTX0FDVCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUX0NMU19QT0xJQ0U9eQotCi0jCi0jIE5ldHdvcmsgdGVzdGluZwotIwotIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15CiBDT05GSUdfRFVNTVk9eQotIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBBUkNuZXQgZGV2aWNlcwotIwotIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKLSMKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotIyBDT05GSUdfTUlJIGlzIG5vdCBzZXQKLUNPTkZJR19YVDIwMDBfU09OSUM9eQotIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAotCi0jCi0jIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAotIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BDSSBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKLSMKLSMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAotIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAotIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAotIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19USUdPTjMgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TMklPIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKLSMKLUNPTkZJR19ORVRfUkFESU89eQotCi0jCi0jIE9ic29sZXRlIFdpcmVsZXNzIGNhcmRzIHN1cHBvcnQgKHByZS04MDIuMTEpCi0jCi1DT05GSUdfU1RSSVA9bQotCi0jCi0jIFdpcmVsZXNzIDgwMi4xMWIgSVNBL1BDSSBjYXJkcyBzdXBwb3J0Ci0jCi1DT05GSUdfSEVSTUVTPW0KLSMgQ09ORklHX1BMWF9IRVJNRVMgaXMgbm90IHNldAotIyBDT05GSUdfVE1EX0hFUk1FUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0lfSEVSTUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTUVMIGlzIG5vdCBzZXQKLQotIwotIyBQcmlzbSBHVC9EdWV0dGUgODAyLjExKGEvYi9nKSBQQ0kvQ2FyZGJ1cyBzdXBwb3J0Ci0jCi0jIENPTkZJR19QUklTTTU0IGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfV0lSRUxFU1M9eQotCi0jCi0jIFdhbiBpbnRlcmZhY2VzCi0jCi0jIENPTkZJR19XQU4gaXMgbm90IHNldAotIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFAgaXMgbm90IHNldAotIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0Ci0KLSMKLSMgSVNETiBzdWJzeXN0ZW0KLSMKLSMgQ09ORklHX0lTRE4gaXMgbm90IHNldAotCi0jCi0jIFRlbGVwaG9ueSBTdXBwb3J0Ci0jCi0jIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19JTlBVVD15Ci0KLSMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcwotIwotQ09ORklHX0lOUFVUX01PVVNFREVWPXkKICMgQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYIGlzIG5vdCBzZXQKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4Ci0jIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAotCi0jCi0jIElucHV0IEkvTyBkcml2ZXJzCi0jCi0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQotQ09ORklHX1NFUklPPXkKLSMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fQ1Q4MkM3MTAgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgRGV2aWNlIERyaXZlcnMKLSMKICMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAotCi0jCi0jIENoYXJhY3RlciBkZXZpY2VzCi0jCi1DT05GSUdfVlQ9eQotQ09ORklHX1ZUX0NPTlNPTEU9eQotQ09ORklHX0hXX0NPTlNPTEU9eQotIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgZHJpdmVycwotIworIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfU0VSSUFMXzgyNTA9eQogQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKLSMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKLQotIwotIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0Ci0jCi1DT05GSUdfU0VSSUFMX0NPUkU9eQotQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQotQ09ORklHX1VOSVg5OF9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKLQotIwotIyBJUE1JCi0jCi0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCi0jIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVEMgaXMgbm90IHNldAotIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKLSMgQ09ORklHX0RSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKLQotIwotIyBEYWxsYXMncyAxLXdpcmUgYnVzCi0jCi0jIENPTkZJR19XMSBpcyBub3Qgc2V0Ci0KLSMKLSMgTWlzYyBkZXZpY2VzCi0jCi0KLSMKLSMgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0Ci0KLSMKLSMgR3JhcGhpY3Mgc3VwcG9ydAotIwotIyBDT05GSUdfRkIgaXMgbm90IHNldAotCi0jCi0jIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAotIwogIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAotQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQotIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwotIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAotCi0jCi0jIFVTQiBzdXBwb3J0Ci0jCi0jIENPTkZJR19VU0IgaXMgbm90IHNldAotQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQotQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKLQotIwotIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KLSMKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKLSMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5maW5pQmFuZCBzdXBwb3J0Ci0jCi0jIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKLQotIwotIyBGaWxlIHN5c3RlbXMKLSMKLSMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KQkQgaXMgbm90IHNldAotIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci1DT05GSUdfRE5PVElGWT15Ci0jIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VREZfRlMgaXMgbm90IHNldAotCi0jCi0jIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci0jIENPTkZJR19QUk9DX0tDT1JFIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNGUz15Ci1DT05GSUdfREVWRlNfRlM9eQotIyBDT05GSUdfREVWRlNfTU9VTlQgaXMgbm90IHNldAotIyBDT05GSUdfREVWRlNfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0Ci1DT05GSUdfUkFNRlM9eQotCi0jCi0jIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCiBDT05GSUdfTkZTX0ZTPXkKLUNPTkZJR19ORlNfVjM9eQotIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKIENPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTE9DS0Q9eQotQ09ORklHX0xPQ0tEX1Y0PXkKLSMgQ09ORklHX0VYUE9SVEZTIGlzIG5vdCBzZXQKLUNPTkZJR19TVU5SUEM9eQotIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAotIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQYXJ0aXRpb24gVHlwZXMKLSMKLSMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLQotIwotIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAotIwotIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotQ09ORklHX0RFQlVHX0tFUk5FTD15Ci0jIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0CiBDT05GSUdfTUFHSUNfU1lTUlE9eQotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAotIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VjdXJpdHkgb3B0aW9ucwotIwotIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0Ci0KLSMKLSMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCi0jCi0jIENPTkZJR19DUllQVE8gaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCi0jCi0KLSMKLSMgTGlicmFyeSByb3V0aW5lcwotIwotIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQzMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2NvbmZpZ3MvZ2VuZXJpY19rYzcwNV9kZWZjb25maWcgYi9hcmNoL3h0ZW5zYS9jb25maWdzL2dlbmVyaWNfa2M3MDVfZGVmY29uZmlnCmluZGV4IGQ5NDQ0ZjAuLjc0NGFkZWEgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2NvbmZpZ3MvZ2VuZXJpY19rYzcwNV9kZWZjb25maWcKKysrIGIvYXJjaC94dGVuc2EvY29uZmlncy9nZW5lcmljX2tjNzA1X2RlZmNvbmZpZwpAQCAtMzIsNyArMzIsNyBAQAogIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKIENPTkZJR19YVEVOU0FfUExBVEZPUk1fWFRGUEdBPXkKIENPTkZJR19DTURMSU5FX0JPT0w9eQotQ09ORklHX0NNRExJTkU9ImVhcmx5Y29uPXVhcnQ4MjUwLG1taW8zMiwweGZkMDUwMDIwLDExNTIwMG44IGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggaXA9ZGhjcCByb290PS9kZXYvbmZzIHJ3IGRlYnVnIgorQ09ORklHX0NNRExJTkU9ImVhcmx5Y29uPXVhcnQ4MjUwLG1taW8zMm5hdGl2ZSwweGZkMDUwMDIwLDExNTIwMG44IGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggaXA9ZGhjcCByb290PS9kZXYvbmZzIHJ3IGRlYnVnIG1lbW1hcD0weDM4MDAwMDAwQDAiCiBDT05GSUdfVVNFX09GPXkKIENPTkZJR19CVUlMVElOX0RUQj0ia2M3MDUiCiAjIENPTkZJR19DT01QQUNUSU9OIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2NvbmZpZ3MvaXNzX2RlZmNvbmZpZyBiL2FyY2gveHRlbnNhL2NvbmZpZ3MvaXNzX2RlZmNvbmZpZwppbmRleCA0NGM2NzY0Li40YmI1Yjc2IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9jb25maWdzL2lzc19kZWZjb25maWcKKysrIGIvYXJjaC94dGVuc2EvY29uZmlncy9pc3NfZGVmY29uZmlnCkBAIC0xLDc1OCArMSwzNCBAQAotIwotIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjM0LXJjNgotIyBUdWUgQXVnICAzIDAwOjEwOjU0IDIwMTAKLSMKLSMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAotQ09ORklHX1pPTkVfRE1BPXkKLUNPTkZJR19YVEVOU0E9eQotQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKLUNPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQotQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15Ci0jIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKLUNPTkZJR19OT19JT1BPUlRfTUFQPXkKLUNPTkZJR19IWj0xMDAKLUNPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCi1DT05GSUdfQ09OU1RSVUNUT1JTPXkKLQotIwotIyBHZW5lcmFsIHNldHVwCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19CUk9LRU5fT05fU01QPXkKLUNPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKLUNPTkZJR19MT0NBTFZFUlNJT049IiIKLUNPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15Ci1DT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15Ci1DT05GSUdfU1lTVklQQ19TWVNDVEw9eQotIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKLQotIwotIyBSQ1UgU3Vic3lzdGVtCi0jCi1DT05GSUdfVFJFRV9SQ1U9eQotIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19USU5ZX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAotQ09ORklHX1JDVV9GQU5PVVQ9MzIKLSMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAotIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLSMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVEw9eQotQ09ORklHX0FOT05fSU5PREVTPXkKIENPTkZJR19FWFBFUlQ9eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKLUNPTkZJR19LQUxMU1lNUz15Ci0jIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAotIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKLUNPTkZJR19QUklOVEs9eQotQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQotQ09ORklHX0JBU0VfRlVMTD15Ci1DT05GSUdfRlVURVg9eQotQ09ORklHX0VQT0xMPXkKLUNPTkZJR19TSUdOQUxGRD15Ci1DT05GSUdfVElNRVJGRD15Ci1DT05GSUdfRVZFTlRGRD15Ci1DT05GSUdfU0hNRU09eQotQ09ORklHX0FJTz15Ci0KLSMKLSMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKLSMKLUNPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci1DT05GSUdfU0xVQl9ERUJVRz15Ci1DT05GSUdfQ09NUEFUX0JSSz15Ci0jIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKLUNPTkZJR19TTFVCPXkKLSMgQ09ORklHX1NMT0IgaXMgbm90IHNldAotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLQotIwotIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKLSMKLSMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKLUNPTkZJR19TTEFCSU5GTz15Ci1DT05GSUdfUlRfTVVURVhFUz15Ci1DT05GSUdfQkFTRV9TTUFMTD0wCi0jIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKLUNPTkZJR19CTE9DSz15Ci1DT05GSUdfTEJEQUY9eQotQ09ORklHX0JMS19ERVZfQlNHPXkKLSMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBJTyBTY2hlZHVsZXJzCi0jCi1DT05GSUdfSU9TQ0hFRF9OT09QPXkKICMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAogIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAotIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0Ci1DT05GSUdfREVGQVVMVF9OT09QPXkKLUNPTkZJR19ERUZBVUxUX0lPU0NIRUQ9Im5vb3AiCi0jIENPTkZJR19JTkxJTkVfU1BJTl9UUllMT0NLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOTElORV9TUElOX1RSWUxPQ0tfQkggaXMgbm90IHNldAotIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLX0JIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOTElORV9TUElOX0xPQ0tfSVJRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOTElORV9TUElOX0xPQ0tfSVJRU0FWRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTklOTElORV9TUElOX1VOTE9DSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0tfQkggaXMgbm90IHNldAotQ09ORklHX0lOTElORV9TUElOX1VOTE9DS19JUlE9eQotIyBDT05GSUdfSU5MSU5FX1NQSU5fVU5MT0NLX0lSUVJFU1RPUkUgaXMgbm90IHNldAotIyBDT05GSUdfSU5MSU5FX1JFQURfVFJZTE9DSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkxJTkVfUkVBRF9MT0NLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfQkggaXMgbm90IHNldAotIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DS19JUlEgaXMgbm90IHNldAotIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DS19JUlFTQVZFIGlzIG5vdCBzZXQKLUNPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0s9eQotIyBDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLX0JIIGlzIG5vdCBzZXQKLUNPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0tfSVJRPXkKLSMgQ09ORklHX0lOTElORV9SRUFEX1VOTE9DS19JUlFSRVNUT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOTElORV9XUklURV9UUllMT0NLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOTElORV9XUklURV9MT0NLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOTElORV9XUklURV9MT0NLX0JIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOTElORV9XUklURV9MT0NLX0lSUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DS19JUlFTQVZFIGlzIG5vdCBzZXQKLUNPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLPXkKLSMgQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0tfQkggaXMgbm90IHNldAotQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0tfSVJRPXkKLSMgQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0tfSVJRUkVTVE9SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVVRFWF9TUElOX09OX09XTkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAotQ09ORklHX01NVT15Ci0jIENPTkZJR19WQVJJQU5UX0lSUV9TV0lUQ0ggaXMgbm90IHNldAotCi0jCi0jIFByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcwotIwotQ09ORklHX1hURU5TQV9WQVJJQU5UX0ZTRj15Ci0jIENPTkZJR19YVEVOU0FfVkFSSUFOVF9EQzIzMkIgaXMgbm90IHNldAotIyBDT05GSUdfWFRFTlNBX1VOQUxJR05FRF9VU0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAotQ09ORklHX1hURU5TQV9DQUxJQlJBVEVfQ0NPVU5UPXkKLUNPTkZJR19TRVJJQUxfQ09OU09MRT15Ci1DT05GSUdfWFRFTlNBX0lTU19ORVRXT1JLPXkKLQotIwotIyBCdXMgb3B0aW9ucwotIwogIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKLQotIwotIyBQbGF0Zm9ybSBvcHRpb25zCi0jCi1DT05GSUdfWFRFTlNBX1BMQVRGT1JNX0lTUz15Ci0jIENPTkZJR19YVEVOU0FfUExBVEZPUk1fWFQyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZIGlzIG5vdCBzZXQKIENPTkZJR19DTURMSU5FX0JPT0w9eQotQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5UzAsMzg0MDAgZXRoMD10dW50YXAsLHRhcDAgaXA9MTkyLjE2OC4xNjguNToxOTIuMTY4LjE2OC4xIHJvb3Q9bmZzIG5mc3Jvb3Q9MTkyLjE2OC4xNjguMTovb3B0L21vbnRhdmlzdGEvcHJvL2RldmtpdC94dGVuc2EvbGludXhfYmUvdGFyZ2V0IgotQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQotQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKLSMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAotIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0Ci1DT05GSUdfRkxBVE1FTT15Ci1DT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKLSMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKLUNPTkZJR19aT05FX0RNQV9GTEFHPTEKLUNPTkZJR19CT1VOQ0U9eQotQ09ORklHX1ZJUlRfVE9fQlVTPXkKLSMgQ09ORklHX0tTTSBpcyBub3Qgc2V0Ci1DT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKLQotIwotIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cwotIwotQ09ORklHX0tDT1JFX0VMRj15Ci1DT05GSUdfQklORk1UX0VMRj15CitDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTMCwzODQwMCBldGgwPXR1bnRhcCwsdGFwMCBpcD0xOTIuMTY4LjE2OC41OjE5Mi4xNjguMTY4LjEgcm9vdD1uZnMgbmZzcm9vdD0xOTIuMTY4LjE2OC4xOi9vcHQvbW9udGF2aXN0YS9wcm8vZGV2a2l0L3h0ZW5zYS9saW51eF9iZS90YXJnZXQgbWVtbWFwPTEyOE1AMCIKICMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1VOSVg9eQotQ09ORklHX1hGUk09eQotIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAotIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQotIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfRklCX0hBU0g9eQogQ09ORklHX0lQX1BOUD15CiBDT05GSUdfSVBfUE5QX0RIQ1A9eQogQ09ORklHX0lQX1BOUF9CT09UUD15CiBDT05GSUdfSVBfUE5QX1JBUlA9eQotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15Ci1DT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15Ci1DT05GSUdfSU5FVF9MUk89eQotQ09ORklHX0lORVRfRElBRz15Ci1DT05GSUdfSU5FVF9UQ1BfRElBRz15Ci0jIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfVENQX0NPTkdfQ1VCSUM9eQotQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgotIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JEUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19USVBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAotIyBDT05GSUdfSUVFRTgwMjE1NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotIyBDT05GSUdfRENCIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotIyBDT05GSUdfQlQgaXMgbm90IHNldAotIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAotQ09ORklHX1dJUkVMRVNTPXkKLSMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xJQjgwMjExIGlzIG5vdCBzZXQKLQotIwotIyBDRkc4MDIxMSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciBNQUM4MDIxMQotIwotIyBDT05GSUdfV0lNQVggaXMgbm90IHNldAotIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGV2aWNlIERyaXZlcnMKLSMKLQotIwotIyBHZW5lcmljIERyaXZlciBPcHRpb25zCi0jCiAjIENPTkZJR19TVEFOREFMT05FIGlzIG5vdCBzZXQKLUNPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKLSMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAotIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWPXkKLSMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAotCi0jCi0jIERSQkQgZGlzYWJsZWQgYmVjYXVzZSBQUk9DX0ZTLCBJTkVUIG9yIENPTk5FQ1RPUiBub3Qgc2VsZWN0ZWQKLSMKLSMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAotIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAotQ09ORklHX01JU0NfREVWSUNFUz15Ci0jIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAotIyBDT05GSUdfQzJQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBFRVBST00gc3VwcG9ydAotIwotIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBVkVfSURFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NTSSBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX1NDU0lfTU9EPXkKLSMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAotIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX01EIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVERFVklDRVMgaXMgbm90IHNldAotIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19JTlBVVD15Ci0jIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfU1BBUlNFS01BUCBpcyBub3Qgc2V0Ci0KLSMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcwotIwogIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIEkvTyBwb3J0cwotIwogIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAotIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAotCi0jCi0jIENoYXJhY3RlciBkZXZpY2VzCi0jCi1DT05GSUdfVlQ9eQotQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKLUNPTkZJR19WVF9DT05TT0xFPXkKLUNPTkZJR19IV19DT05TT0xFPXkKLSMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0Ci1DT05GSUdfREVWS01FTT15Ci0jIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi0jIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotIyBDT05GSUdfU0VSSUFMX1RJTUJFUkRBTEUgaXMgbm90IHNldAotQ09ORklHX1VOSVg5OF9QVFlTPXkKLSMgQ09ORklHX0RFVlBUU19NVUxUSVBMRV9JTlNUQU5DRVMgaXMgbm90IHNldAotQ09ORklHX0xFR0FDWV9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgotIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLUNPTkZJR19IV19SQU5ET009eQotIyBDT05GSUdfSFdfUkFORE9NX1RJTUVSSU9NRU0gaXMgbm90IHNldAotIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEkgaXMgbm90IHNldAotCi0jCi0jIFBQUyBzdXBwb3J0Ci0jCi0jIENPTkZJR19QUFMgaXMgbm90IHNldAotIyBDT05GSUdfVzEgaXMgbm90IHNldAotIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKLUNPTkZJR19IV01PTj15Ci0jIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgTmF0aXZlIGRyaXZlcnMKLSMKLSMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0Y3MTg4MkZHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQzg3NDI3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU0hUMTUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKIENPTkZJR19XQVRDSERPRz15CiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQ9eQotCi0jCi0jIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCi0jCiBDT05GSUdfU09GVF9XQVRDSERPRz15Ci1DT05GSUdfU1NCX1BPU1NJQkxFPXkKLQotIwotIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKLSMKLSMgQ09ORklHX1NTQiBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAotIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX01FRElBX1NVUFBPUlQgaXMgbm90IHNldAotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLSMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKLSMKICMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKLUNPTkZJR19EVU1NWV9DT05TT0xFPXkKLSMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLUNPTkZJR19ISURfU1VQUE9SVD15Ci1DT05GSUdfSElEPXkKLSMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISURfUElEIGlzIG5vdCBzZXQKLQotIwotIyBTcGVjaWFsIEhJRCBkcml2ZXJzCi0jCi1DT05GSUdfVVNCX1NVUFBPUlQ9eQotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT1RHX1dISVRFTElTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUIgaXMgbm90IHNldAotCi0jCi0jIEVuYWJsZSBIb3N0IG9yIEdhZGdldCBzdXBwb3J0IHRvIHNlZSBJbnZlbnRyYSBvcHRpb25zCi0jCi0KLSMKLSMgTk9URTogVVNCX1NUT1JBR0UgZGVwZW5kcyBvbiBTQ1NJIGJ1dCBCTEtfREVWX1NEIG1heQotIwotIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgT1RHIGFuZCByZWxhdGVkIGluZnJhc3RydWN0dXJlCi0jCi0jIENPTkZJR19NTUMgaXMgbm90IHNldAotIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAotIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAotIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVVhESVNQTEFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgVEkgVkxZTlEKLSMKLSMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAotQ09ORklHX0ZJTEVfTE9DS0lORz15Ci1DT05GSUdfRlNOT1RJRlk9eQogIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTk9USUZZIGlzIG5vdCBzZXQKLUNPTkZJR19JTk9USUZZX1VTRVI9eQotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ2FjaGVzCi0jCi0jIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKLQotIwotIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQc2V1ZG8gZmlsZXN5c3RlbXMKLSMKLUNPTkZJR19QUk9DX0ZTPXkKIENPTkZJR19QUk9DX0tDT1JFPXkKLUNPTkZJR19QUk9DX1NZU0NUTD15Ci1DT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQotQ09ORklHX1NZU0ZTPXkKIENPTkZJR19UTVBGUz15Ci0jIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19NSVNDX0ZJTEVTWVNURU1TPXkKLSMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTE9HRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NRVUFTSEZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15Ci0jIENPTkZJR19ORlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0VQSF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi0jIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci0jIENPTkZJR19OTFMgaXMgbm90IHNldAotIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQotQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKLUNPTkZJR19GUkFNRV9XQVJOPTEwMjQKLSMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0tFUk5FTD15Ci0jIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0Ci1DT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQotIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAotQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAogQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQotIyBDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQyBpcyBub3Qgc2V0Ci1DT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQ19WQUxVRT0wCi1DT05GSUdfU0NIRURfREVCVUc9eQotIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAotIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX05PVElGSUVSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19DUkVERU5USUFMUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKLUNPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SPXkKLSMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQUdFX1BPSVNPTklORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAotIyBDT05GSUdfREVGQVVMVF9TRUNVUklUWV9TRUxJTlVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFRkFVTFRfU0VDVVJJVFlfU01BQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVGQVVMVF9TRUNVUklUWV9UT01PWU8gaXMgbm90IHNldAotQ09ORklHX0RFRkFVTFRfU0VDVVJJVFlfREFDPXkKLUNPTkZJR19ERUZBVUxUX1NFQ1VSSVRZPSIiCi1DT05GSUdfQ1JZUFRPPXkKLQotIwotIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKLSMKLSMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fQUxHQVBJPXkKLUNPTkZJR19DUllQVE9fQUxHQVBJMj15Ci1DT05GSUdfQ1JZUFRPX1JORz15Ci1DT05GSUdfQ1JZUFRPX1JORzI9eQotIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKLQotIwotIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKLSMKLSMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAotCi0jCi0jIEJsb2NrIG1vZGVzCi0jCi0jIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFzaCBtb2RlcwotIwotIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1ZNQUMgaXMgbm90IHNldAotCi0jCi0jIERpZ2VzdAotIwotIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0Ci0KLSMKLSMgQ2lwaGVycwotIwotQ09ORklHX0NSWVBUT19BRVM9eQotIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29tcHJlc3Npb24KLSMKLSMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19aTElCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAotCi0jCi0jIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgotIwogQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HPXkKLUNPTkZJR19DUllQVE9fSFc9eQotIyBDT05GSUdfQklOQVJZX1BSSU5URiBpcyBub3Qgc2V0Ci0KLSMKLSMgTGlicmFyeSByb3V0aW5lcwotIwotQ09ORklHX0dFTkVSSUNfRklORF9MQVNUX0JJVD15Ci0jIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAotIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAotQ09ORklHX0hBU19JT01FTT15Ci1DT05GSUdfSEFTX0RNQT15Ci1DT05GSUdfTkxBVFRSPXkKLUNPTkZJR19MRF9OT19SRUxBWD15CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9jb25maWdzL25vbW11X2tjNzA1X2RlZmNvbmZpZyBiL2FyY2gveHRlbnNhL2NvbmZpZ3Mvbm9tbXVfa2M3MDVfZGVmY29uZmlnCmluZGV4IDMzN2Q1YmEuLjc4YzI1MjkgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2NvbmZpZ3Mvbm9tbXVfa2M3MDVfZGVmY29uZmlnCisrKyBiL2FyY2gveHRlbnNhL2NvbmZpZ3Mvbm9tbXVfa2M3MDVfZGVmY29uZmlnCkBAIC0zNyw3ICszNyw3IEBACiAjIENPTkZJR19QQ0kgaXMgbm90IHNldAogQ09ORklHX1hURU5TQV9QTEFURk9STV9YVEZQR0E9eQogQ09ORklHX0NNRExJTkVfQk9PTD15Ci1DT05GSUdfQ01ETElORT0iZWFybHljb249dWFydDgyNTAsbW1pbzMyLDB4OWQwNTAwMjAsMTE1MjAwbjggY29uc29sZT10dHlTMCwxMTUyMDBuOCBpcD1kaGNwIHJvb3Q9L2Rldi9uZnMgcncgZGVidWciCitDT05GSUdfQ01ETElORT0iZWFybHljb249dWFydDgyNTAsbW1pbzMybmF0aXZlLDB4OWQwNTAwMjAsMTE1MjAwbjggY29uc29sZT10dHlTMCwxMTUyMDBuOCBpcD1kaGNwIHJvb3Q9L2Rldi9uZnMgcncgZGVidWcgbWVtbWFwPTI1Nk1AMHg2MDAwMDAwMCIKIENPTkZJR19VU0VfT0Y9eQogQ09ORklHX0JVSUxUSU5fRFRCPSJrYzcwNV9ub21tdSIKIENPTkZJR19ERUZBVUxUX01FTV9TSVpFPTB4MTAwMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2NvbmZpZ3Mvc21wX2x4MjAwX2RlZmNvbmZpZyBiL2FyY2gveHRlbnNhL2NvbmZpZ3Mvc21wX2x4MjAwX2RlZmNvbmZpZwppbmRleCA2MWY5NDNjLi4xNGUzY2EzIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9jb25maWdzL3NtcF9seDIwMF9kZWZjb25maWcKKysrIGIvYXJjaC94dGVuc2EvY29uZmlncy9zbXBfbHgyMDBfZGVmY29uZmlnCkBAIC0zNiw3ICszNiw3IEBACiAjIENPTkZJR19QQ0kgaXMgbm90IHNldAogQ09ORklHX1hURU5TQV9QTEFURk9STV9YVEZQR0E9eQogQ09ORklHX0NNRExJTkVfQk9PTD15Ci1DT05GSUdfQ01ETElORT0iZWFybHljb249dWFydDgyNTAsbW1pbzMyLDB4ZmQwNTAwMjAsMTE1MjAwbjggY29uc29sZT10dHlTMCwxMTUyMDBuOCBpcD1kaGNwIHJvb3Q9L2Rldi9uZnMgcncgZGVidWciCitDT05GSUdfQ01ETElORT0iZWFybHljb249dWFydDgyNTAsbW1pbzMybmF0aXZlLDB4ZmQwNTAwMjAsMTE1MjAwbjggY29uc29sZT10dHlTMCwxMTUyMDBuOCBpcD1kaGNwIHJvb3Q9L2Rldi9uZnMgcncgZGVidWcgbWVtbWFwPTk2TUAwIgogQ09ORklHX1VTRV9PRj15CiBDT05GSUdfQlVJTFRJTl9EVEI9Imx4MjAwbXgiCiAjIENPTkZJR19DT01QQUNUSU9OIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2JpdG9wcy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYml0b3BzLmgKaW5kZXggM2Y0NGZhMi4uZDM0OTAxOCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYml0b3BzLmgKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYml0b3BzLmgKQEAgLTQ4LDcgKzQ4LDcgQEAKICAqIF9fZmZzOiBGaW5kIGZpcnN0IGJpdCBzZXQgaW4gd29yZC4gUmV0dXJuIDAgZm9yIGJpdCAwCiAgKi8KIAotc3RhdGljIGlubGluZSBpbnQgX19mZnModW5zaWduZWQgbG9uZyB4KQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fZmZzKHVuc2lnbmVkIGxvbmcgeCkKIHsKIAlyZXR1cm4gMzEgLSBfX2NudGx6KHggJiAteCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jYWNoZWFzbS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY2FjaGVhc20uaAppbmRleCBlMGY5ZTExLi4yMDQxYWJiIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jYWNoZWFzbS5oCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NhY2hlYXNtLmgKQEAgLTY5LDI2ICs2OSwyMyBAQAogCS5lbmRtCiAKIAotI2lmIFhDSEFMX0RDQUNIRV9MSU5FX0xPQ0tBQkxFCi0KIAkubWFjcm8JX19fdW5sb2NrX2RjYWNoZV9hbGwgYXIgYXQKIAotI2lmIFhDSEFMX0RDQUNIRV9TSVpFCisjaWYgWENIQUxfRENBQ0hFX0xJTkVfTE9DS0FCTEUgJiYgWENIQUxfRENBQ0hFX1NJWkUKIAlfX2xvb3BfY2FjaGVfYWxsIFxhciBcYXQgZGl1IFhDSEFMX0RDQUNIRV9TSVpFIFhDSEFMX0RDQUNIRV9MSU5FV0lEVEgKICNlbmRpZgogCiAJLmVuZG0KIAotI2VuZGlmCi0KLSNpZiBYQ0hBTF9JQ0FDSEVfTElORV9MT0NLQUJMRQogCiAJLm1hY3JvCV9fX3VubG9ja19pY2FjaGVfYWxsIGFyIGF0CiAKKyNpZiBYQ0hBTF9JQ0FDSEVfTElORV9MT0NLQUJMRSAmJiBYQ0hBTF9JQ0FDSEVfU0laRQogCV9fbG9vcF9jYWNoZV9hbGwgXGFyIFxhdCBpaXUgWENIQUxfSUNBQ0hFX1NJWkUgWENIQUxfSUNBQ0hFX0xJTkVXSURUSAorI2VuZGlmCiAKIAkuZW5kbQotI2VuZGlmCisKIAogCS5tYWNybwlfX19mbHVzaF9pbnZhbGlkYXRlX2RjYWNoZV9hbGwgYXIgYXQKIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZml4bWFwLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9maXhtYXAuaAppbmRleCA2MmI1MDdkLi4wZDMwNDAzIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9maXhtYXAuaAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9maXhtYXAuaApAQCAtNTksNiArNTksMTEgQEAKICAqLwogc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nIGZpeF90b192aXJ0KGNvbnN0IHVuc2lnbmVkIGludCBpZHgpCiB7CisJLyogQ2hlY2sgaWYgdGhpcyBtZW1vcnkgbGF5b3V0IGlzIGJyb2tlbiBiZWNhdXNlIGZpeG1hcCBvdmVybGFwcyBwYWdlCisJICogdGFibGUuCisJICovCisJQlVJTERfQlVHX09OKEZJWEFERFJfU1RBUlQgPAorCQkgICAgIFhDSEFMX1BBR0VfVEFCTEVfVkFERFIgKyBYQ0hBTF9QQUdFX1RBQkxFX1NJWkUpOwogCUJVSUxEX0JVR19PTihpZHggPj0gX19lbmRfb2ZfZml4ZWRfYWRkcmVzc2VzKTsKIAlyZXR1cm4gX19maXhfdG9fdmlydChpZHgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaGlnaG1lbS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaGlnaG1lbS5oCmluZGV4IDAxY2VmNmIuLjZlMDcwZGIgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2hpZ2htZW0uaAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9oaWdobWVtLmgKQEAgLTY4LDYgKzY4LDExIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqa21hcChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKKwkvKiBDaGVjayBpZiB0aGlzIG1lbW9yeSBsYXlvdXQgaXMgYnJva2VuIGJlY2F1c2UgUEtNQVAgb3ZlcmxhcHMKKwkgKiBwYWdlIHRhYmxlLgorCSAqLworCUJVSUxEX0JVR19PTihQS01BUF9CQVNFIDwKKwkJICAgICBYQ0hBTF9QQUdFX1RBQkxFX1ZBRERSICsgWENIQUxfUEFHRV9UQUJMRV9TSVpFKTsKIAlCVUdfT04oaW5faW50ZXJydXB0KCkpOwogCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpCiAJCXJldHVybiBwYWdlX2FkZHJlc3MocGFnZSk7CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9pbml0aWFsaXplX21tdS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaW5pdGlhbGl6ZV9tbXUuaAppbmRleCA3YTFlMDc1Li40MjQxMGYyIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9pbml0aWFsaXplX21tdS5oCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2luaXRpYWxpemVfbW11LmgKQEAgLTc3LDEzICs3NywxNiBAQAogCiAJLmFsaWduCTQKIDE6CW1vdmkJYTIsIDB4MTAwMDAwMDAKLQltb3ZpCWEzLCAweDE4MDAwMDAwCi0JYWRkCWEyLCBhMiwgYTAKLTk6CWJnZXUJYTIsIGEzLCA5YgkvKiBQQyBpcyBvdXQgb2YgdGhlIGV4cGVjdGVkIHJhbmdlICovCisKKyNpZiBDT05GSUdfS0VSTkVMX0xPQURfQUREUkVTUyA8IDB4NDAwMDAwMDB1bAorI2RlZmluZSBURU1QX01BUFBJTkdfVkFERFIgMHg0MDAwMDAwMAorI2Vsc2UKKyNkZWZpbmUgVEVNUF9NQVBQSU5HX1ZBRERSIDB4MDAwMDAwMDAKKyNlbmRpZgogCiAJLyogU3RlcCAxOiBpbnZhbGlkYXRlIG1hcHBpbmcgYXQgMHg0MDAwMDAwMC4uMHg1RkZGRkZGRi4gKi8KIAotCW1vdmkJYTIsIDB4NDAwMDAwMDAgfCBYQ0hBTF9TUEFOTklOR19XQVkKKwltb3ZpCWEyLCBURU1QX01BUFBJTkdfVkFERFIgfCBYQ0hBTF9TUEFOTklOR19XQVkKIAlpZHRsYglhMgogCWlpdGxiCWEyCiAJaXN5bmMKQEAgLTk1LDE0ICs5OCwxNCBAQAogCXNybGkJYTMsIGEwLCAyNwogCXNsbGkJYTMsIGEzLCAyNwogCWFkZGkJYTMsIGEzLCBDQV9CWVBBU1MKLQlhZGRpCWE3LCBhMiwgLTEKKwlhZGRpCWE3LCBhMiwgNSAtIFhDSEFMX1NQQU5OSU5HX1dBWQogCXdkdGxiCWEzLCBhNwogCXdpdGxiCWEzLCBhNwogCWlzeW5jCiAKIAlzbGxpCWE0LCBhMCwgNQogCXNybGkJYTQsIGE0LCA1Ci0JYWRkaQlhNSwgYTIsIC02CisJYWRkaQlhNSwgYTIsIC1YQ0hBTF9TUEFOTklOR19XQVkKIAlhZGQJYTQsIGE0LCBhNQogCWp4CWE0CiAKQEAgLTExNiwzNSArMTE5LDQ4IEBACiAJYWRkCWE1LCBhNSwgYTQKIAlibmUJYTUsIGEyLCAzYgogCi0JLyogU3RlcCA0OiBTZXR1cCBNTVUgd2l0aCB0aGUgb2xkIFYyIG1hcHBpbmdzLiAqLworCS8qIFN0ZXAgNDogU2V0dXAgTU1VIHdpdGggdGhlIHJlcXVlc3RlZCBzdGF0aWMgbWFwcGluZ3MuICovCisKIAltb3ZpCWE2LCAweDAxMDAwMDAwCiAJd3NyCWE2LCBJVExCQ0ZHCiAJd3NyCWE2LCBEVExCQ0ZHCiAJaXN5bmMKIAotCW1vdmkJYTUsIDB4ZDAwMDAwMDUKLQltb3ZpCWE0LCBDQV9XUklURUJBQ0sKKwltb3ZpCWE1LCBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiArIFhDSEFMX0tTRUdfVExCX1dBWQorCW1vdmkJYTQsIFhDSEFMX0tTRUdfUEFERFIgKyBDQV9XUklURUJBQ0sKIAl3ZHRsYglhNCwgYTUKIAl3aXRsYglhNCwgYTUKIAotCW1vdmkJYTUsIDB4ZDgwMDAwMDUKLQltb3ZpCWE0LCBDQV9CWVBBU1MKKwltb3ZpCWE1LCBYQ0hBTF9LU0VHX0JZUEFTU19WQUREUiArIFhDSEFMX0tTRUdfVExCX1dBWQorCW1vdmkJYTQsIFhDSEFMX0tTRUdfUEFERFIgKyBDQV9CWVBBU1MKIAl3ZHRsYglhNCwgYTUKIAl3aXRsYglhNCwgYTUKIAotCW1vdmkJYTUsIFhDSEFMX0tJT19DQUNIRURfVkFERFIgKyA2CisjaWZkZWYgQ09ORklHX1hURU5TQV9LU0VHXzUxMk0KKwltb3ZpCWE1LCBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiArIDB4MTAwMDAwMDAgKyBYQ0hBTF9LU0VHX1RMQl9XQVkKKwltb3ZpCWE0LCBYQ0hBTF9LU0VHX1BBRERSICsgMHgxMDAwMDAwMCArIENBX1dSSVRFQkFDSworCXdkdGxiCWE0LCBhNQorCXdpdGxiCWE0LCBhNQorCisJbW92aQlhNSwgWENIQUxfS1NFR19CWVBBU1NfVkFERFIgKyAweDEwMDAwMDAwICsgWENIQUxfS1NFR19UTEJfV0FZCisJbW92aQlhNCwgWENIQUxfS1NFR19QQUREUiArIDB4MTAwMDAwMDAgKyBDQV9CWVBBU1MKKwl3ZHRsYglhNCwgYTUKKwl3aXRsYglhNCwgYTUKKyNlbmRpZgorCisJbW92aQlhNSwgWENIQUxfS0lPX0NBQ0hFRF9WQUREUiArIFhDSEFMX0tJT19UTEJfV0FZCiAJbW92aQlhNCwgWENIQUxfS0lPX0RFRkFVTFRfUEFERFIgKyBDQV9XUklURUJBQ0sKIAl3ZHRsYglhNCwgYTUKIAl3aXRsYglhNCwgYTUKIAotCW1vdmkJYTUsIFhDSEFMX0tJT19CWVBBU1NfVkFERFIgKyA2CisJbW92aQlhNSwgWENIQUxfS0lPX0JZUEFTU19WQUREUiArIFhDSEFMX0tJT19UTEJfV0FZCiAJbW92aQlhNCwgWENIQUxfS0lPX0RFRkFVTFRfUEFERFIgKyBDQV9CWVBBU1MKIAl3ZHRsYglhNCwgYTUKIAl3aXRsYglhNCwgYTUKIAogCWlzeW5jCiAKLQkvKiBKdW1wIHRvIHNlbGYsIHVzaW5nIE1NVSB2MiBtYXBwaW5ncy4gKi8KKwkvKiBKdW1wIHRvIHNlbGYsIHVzaW5nIGZpbmFsIG1hcHBpbmdzLiAqLwogCW1vdmkJYTQsIDFmCiAJangJYTQKIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20va21lbV9sYXlvdXQuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2ttZW1fbGF5b3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYxZjg3MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2ttZW1fbGF5b3V0LmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIEtlcm5lbCB2aXJ0dWFsIG1lbW9yeSBsYXlvdXQgZGVmaW5pdGlvbnMuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IENhZGVuY2UgRGVzaWduIFN5c3RlbXMgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9LTUVNX0xBWU9VVF9ICisjZGVmaW5lIF9YVEVOU0FfS01FTV9MQVlPVVRfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZmRlZiBDT05GSUdfTU1VCisKKy8qCisgKiBGaXhlZCBUTEIgdHJhbnNsYXRpb25zIGluIHRoZSBwcm9jZXNzb3IuCisgKi8KKworI2RlZmluZSBYQ0hBTF9QQUdFX1RBQkxFX1ZBRERSCV9fWFRFTlNBX1VMX0NPTlNUKDB4ODAwMDAwMDApCisjZGVmaW5lIFhDSEFMX1BBR0VfVEFCTEVfU0laRQlfX1hURU5TQV9VTF9DT05TVCgweDAwNDAwMDAwKQorCisjaWYgZGVmaW5lZChDT05GSUdfWFRFTlNBX0tTRUdfTU1VX1YyKQorCisjZGVmaW5lIFhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSCV9fWFRFTlNBX1VMX0NPTlNUKDB4ZDAwMDAwMDApCisjZGVmaW5lIFhDSEFMX0tTRUdfQllQQVNTX1ZBRERSCV9fWFRFTlNBX1VMX0NPTlNUKDB4ZDgwMDAwMDApCisjZGVmaW5lIFhDSEFMX0tTRUdfU0laRQkJX19YVEVOU0FfVUxfQ09OU1QoMHgwODAwMDAwMCkKKyNkZWZpbmUgWENIQUxfS1NFR19BTElHTk1FTlQJX19YVEVOU0FfVUxfQ09OU1QoMHgwODAwMDAwMCkKKyNkZWZpbmUgWENIQUxfS1NFR19UTEJfV0FZCTUKKyNkZWZpbmUgWENIQUxfS0lPX1RMQl9XQVkJNgorCisjZWxpZiBkZWZpbmVkKENPTkZJR19YVEVOU0FfS1NFR18yNTZNKQorCisjZGVmaW5lIFhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSCV9fWFRFTlNBX1VMX0NPTlNUKDB4YjAwMDAwMDApCisjZGVmaW5lIFhDSEFMX0tTRUdfQllQQVNTX1ZBRERSCV9fWFRFTlNBX1VMX0NPTlNUKDB4YzAwMDAwMDApCisjZGVmaW5lIFhDSEFMX0tTRUdfU0laRQkJX19YVEVOU0FfVUxfQ09OU1QoMHgxMDAwMDAwMCkKKyNkZWZpbmUgWENIQUxfS1NFR19BTElHTk1FTlQJX19YVEVOU0FfVUxfQ09OU1QoMHgxMDAwMDAwMCkKKyNkZWZpbmUgWENIQUxfS1NFR19UTEJfV0FZCTYKKyNkZWZpbmUgWENIQUxfS0lPX1RMQl9XQVkJNgorCisjZWxpZiBkZWZpbmVkKENPTkZJR19YVEVOU0FfS1NFR181MTJNKQorCisjZGVmaW5lIFhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSCV9fWFRFTlNBX1VMX0NPTlNUKDB4YTAwMDAwMDApCisjZGVmaW5lIFhDSEFMX0tTRUdfQllQQVNTX1ZBRERSCV9fWFRFTlNBX1VMX0NPTlNUKDB4YzAwMDAwMDApCisjZGVmaW5lIFhDSEFMX0tTRUdfU0laRQkJX19YVEVOU0FfVUxfQ09OU1QoMHgyMDAwMDAwMCkKKyNkZWZpbmUgWENIQUxfS1NFR19BTElHTk1FTlQJX19YVEVOU0FfVUxfQ09OU1QoMHgxMDAwMDAwMCkKKyNkZWZpbmUgWENIQUxfS1NFR19UTEJfV0FZCTYKKyNkZWZpbmUgWENIQUxfS0lPX1RMQl9XQVkJNgorCisjZWxzZQorI2Vycm9yIFVuc3VwcG9ydGVkIEtTRUcgY29uZmlndXJhdGlvbgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfS1NFR19QQUREUgorI2RlZmluZSBYQ0hBTF9LU0VHX1BBRERSICAgICAgICBfX1hURU5TQV9VTF9DT05TVChDT05GSUdfS1NFR19QQUREUikKKyNlbHNlCisjZGVmaW5lIFhDSEFMX0tTRUdfUEFERFIJX19YVEVOU0FfVUxfQ09OU1QoMHgwMDAwMDAwMCkKKyNlbmRpZgorCisjaWYgWENIQUxfS1NFR19QQUREUiAmIChYQ0hBTF9LU0VHX0FMSUdOTUVOVCAtIDEpCisjZXJyb3IgWENIQUxfS1NFR19QQUREUiBpcyBub3QgcHJvcGVybHkgYWxpZ25lZCB0byBYQ0hBTF9LU0VHX0FMSUdOTUVOVAorI2VuZGlmCisKKyNlbHNlCisKKyNkZWZpbmUgWENIQUxfS1NFR19DQUNIRURfVkFERFIJX19YVEVOU0FfVUxfQ09OU1QoMHhkMDAwMDAwMCkKKyNkZWZpbmUgWENIQUxfS1NFR19CWVBBU1NfVkFERFIJX19YVEVOU0FfVUxfQ09OU1QoMHhkODAwMDAwMCkKKyNkZWZpbmUgWENIQUxfS1NFR19TSVpFCQlfX1hURU5TQV9VTF9DT05TVCgweDA4MDAwMDAwKQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wYWdlLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wYWdlLmgKaW5kZXggYWQzODUwMC4uOTc2YjFkNyAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGFnZS5oCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BhZ2UuaApAQCAtMTUsMTUgKzE1LDcgQEAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxwbGF0Zm9ybS9oYXJkd2FyZS5oPgotCi0vKgotICogRml4ZWQgVExCIHRyYW5zbGF0aW9ucyBpbiB0aGUgcHJvY2Vzc29yLgotICovCi0KLSNkZWZpbmUgWENIQUxfS1NFR19DQUNIRURfVkFERFIgX19YVEVOU0FfVUxfQ09OU1QoMHhkMDAwMDAwMCkKLSNkZWZpbmUgWENIQUxfS1NFR19CWVBBU1NfVkFERFIgX19YVEVOU0FfVUxfQ09OU1QoMHhkODAwMDAwMCkKLSNkZWZpbmUgWENIQUxfS1NFR19QQUREUiAgICAgICAgX19YVEVOU0FfVUxfQ09OU1QoMHgwMDAwMDAwMCkKLSNkZWZpbmUgWENIQUxfS1NFR19TSVpFICAgICAgICAgX19YVEVOU0FfVUxfQ09OU1QoMHgwODAwMDAwMCkKKyNpbmNsdWRlIDxhc20va21lbV9sYXlvdXQuaD4KIAogLyoKICAqIFBBR0VfU0hJRlQgZGV0ZXJtaW5lcyB0aGUgcGFnZSBzaXplCkBAIC0zNSwxMCArMjcsMTMgQEAKIAogI2lmZGVmIENPTkZJR19NTVUKICNkZWZpbmUgUEFHRV9PRkZTRVQJWENIQUxfS1NFR19DQUNIRURfVkFERFIKLSNkZWZpbmUgTUFYX01FTV9QRk4JWENIQUxfS1NFR19TSVpFCisjZGVmaW5lIFBIWVNfT0ZGU0VUCVhDSEFMX0tTRUdfUEFERFIKKyNkZWZpbmUgTUFYX0xPV19QRk4JKFBIWVNfUEZOKFhDSEFMX0tTRUdfUEFERFIpICsgXAorCQkJIFBIWVNfUEZOKFhDSEFMX0tTRUdfU0laRSkpCiAjZWxzZQotI2RlZmluZSBQQUdFX09GRlNFVAlfX1hURU5TQV9VTF9DT05TVCgwKQotI2RlZmluZSBNQVhfTUVNX1BGTgkoUExBVEZPUk1fREVGQVVMVF9NRU1fU1RBUlQgKyBQTEFURk9STV9ERUZBVUxUX01FTV9TSVpFKQorI2RlZmluZSBQQUdFX09GRlNFVAlQTEFURk9STV9ERUZBVUxUX01FTV9TVEFSVAorI2RlZmluZSBQSFlTX09GRlNFVAlQTEFURk9STV9ERUZBVUxUX01FTV9TVEFSVAorI2RlZmluZSBNQVhfTE9XX1BGTglQSFlTX1BGTigweGZmZmZmZmZmdWwpCiAjZW5kaWYKIAogI2RlZmluZSBQR1RBQkxFX1NUQVJUCTB4ODAwMDAwMDAKQEAgLTE2NywxMCArMTYyLDEyIEBACiAgKiBhZGRyZXNzZXMuCiAgKi8KIAotI2RlZmluZSBBUkNIX1BGTl9PRkZTRVQJCShQTEFURk9STV9ERUZBVUxUX01FTV9TVEFSVCA+PiBQQUdFX1NISUZUKQorI2RlZmluZSBBUkNIX1BGTl9PRkZTRVQJCShQSFlTX09GRlNFVCA+PiBQQUdFX1NISUZUKQogCi0jZGVmaW5lIF9fcGEoeCkJCQkoKHVuc2lnbmVkIGxvbmcpICh4KSAtIFBBR0VfT0ZGU0VUKQotI2RlZmluZSBfX3ZhKHgpCQkJKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKSAoeCkgKyBQQUdFX09GRlNFVCkpCisjZGVmaW5lIF9fcGEoeCkJXAorCSgodW5zaWduZWQgbG9uZykgKHgpIC0gUEFHRV9PRkZTRVQgKyBQSFlTX09GRlNFVCkKKyNkZWZpbmUgX192YSh4KQlcCisJKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKSAoeCkgLSBQSFlTX09GRlNFVCArIFBBR0VfT0ZGU0VUKSkKICNkZWZpbmUgcGZuX3ZhbGlkKHBmbikgXAogCSgocGZuKSA+PSBBUkNIX1BGTl9PRkZTRVQgJiYgKChwZm4pIC0gQVJDSF9QRk5fT0ZGU0VUKSA8IG1heF9tYXBucikKIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGd0YWJsZS5oCmluZGV4IGZiMDJmZGMuLjhhYTBlMGQgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BndGFibGUtbm9wbWQuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9rbWVtX2xheW91dC5oPgogCiAvKgogICogV2Ugb25seSB1c2UgdHdvIHJpbmcgbGV2ZWxzLCB1c2VyIGFuZCBrZXJuZWwgc3BhY2UuCkBAIC02OCw5ICs2OSw5IEBACiAgKiBWaXJ0dWFsIG1lbW9yeSBhcmVhLiBXZSBrZWVwIGEgZGlzdGFuY2UgdG8gb3RoZXIgbWVtb3J5IHJlZ2lvbnMgdG8gYmUKICAqIG9uIHRoZSBzYWZlIHNpZGUuIFdlIGFsc28gdXNlIHRoaXMgYXJlYSBmb3IgY2FjaGUgYWxpYXNpbmcuCiAgKi8KLSNkZWZpbmUgVk1BTExPQ19TVEFSVAkJMHhDMDAwMDAwMAotI2RlZmluZSBWTUFMTE9DX0VORAkJMHhDN0ZFRkZGRgotI2RlZmluZSBUTEJURU1QX0JBU0VfMQkJMHhDN0ZGMDAwMAorI2RlZmluZSBWTUFMTE9DX1NUQVJUCQkoWENIQUxfS1NFR19DQUNIRURfVkFERFIgLSAweDEwMDAwMDAwKQorI2RlZmluZSBWTUFMTE9DX0VORAkJKFZNQUxMT0NfU1RBUlQgKyAweDA3RkVGRkZGKQorI2RlZmluZSBUTEJURU1QX0JBU0VfMQkJKFZNQUxMT0NfRU5EICsgMSkKICNkZWZpbmUgVExCVEVNUF9CQVNFXzIJCShUTEJURU1QX0JBU0VfMSArIERDQUNIRV9XQVlfU0laRSkKICNpZiAyICogRENBQ0hFX1dBWV9TSVpFID4gSUNBQ0hFX1dBWV9TSVpFCiAjZGVmaW5lIFRMQlRFTVBfU0laRQkJKDIgKiBEQ0FDSEVfV0FZX1NJWkUpCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wbGF0Zm9ybS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGxhdGZvcm0uaAppbmRleCAzMmU5OGYyLi5mOGZiZWY2IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wbGF0Zm9ybS5oCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BsYXRmb3JtLmgKQEAgLTY5LDQgKzY5LDEwIEBACiAgKi8KIGV4dGVybiB2b2lkIHBsYXRmb3JtX2NhbGlicmF0ZV9jY291bnQgKHZvaWQpOwogCisvKgorICogRmx1c2ggYW5kIHJlc2V0IHRoZSBtbXUsIHNpbXVsYXRlIGEgcHJvY2Vzc29yIHJlc2V0LCBhbmQKKyAqIGp1bXAgdG8gdGhlIHJlc2V0IHZlY3Rvci4KKyAqLwordm9pZCBjcHVfcmVzZXQodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKwogI2VuZGlmCS8qIF9YVEVOU0FfUExBVEZPUk1fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCBkMmU0MGQzLi5iNDJkNjhiIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMzcsNyArMzcsNyBAQAogI2lmZGVmIENPTkZJR19NTVUKICNkZWZpbmUgVEFTS19TSVpFCV9fWFRFTlNBX1VMX0NPTlNUKDB4NDAwMDAwMDApCiAjZWxzZQotI2RlZmluZSBUQVNLX1NJWkUJKFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NUQVJUICsgUExBVEZPUk1fREVGQVVMVF9NRU1fU0laRSkKKyNkZWZpbmUgVEFTS19TSVpFCV9fWFRFTlNBX1VMX0NPTlNUKDB4ZmZmZmZmZmYpCiAjZW5kaWYKIAogI2RlZmluZSBTVEFDS19UT1AJVEFTS19TSVpFCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zeXNtZW0uaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N5c21lbS5oCmluZGV4IGMwMTVjNWMuLjU1MmNkZmQgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N5c21lbS5oCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N5c21lbS5oCkBAIC0xMSwyNyArMTEsOCBAQAogI2lmbmRlZiBfWFRFTlNBX1NZU01FTV9ICiAjZGVmaW5lIF9YVEVOU0FfU1lTTUVNX0gKIAotI2RlZmluZSBTWVNNRU1fQkFOS1NfTUFYIDMxCisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KIAotc3RydWN0IG1lbWluZm8gewotCXVuc2lnbmVkIGxvbmcgc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBlbmQ7Ci19OwotCi0vKgotICogQmFuayBhcnJheSBpcyBzb3J0ZWQgYnkgLnN0YXJ0LgotICogQmFua3MgZG9uJ3Qgb3ZlcmxhcCBhbmQgdGhlcmUncyBhdCBsZWFzdCBvbmUgcGFnZSBnYXAKLSAqIGJldHdlZW4gYWRqYWNlbnQgYmFuayBlbnRyaWVzLgotICovCi1zdHJ1Y3Qgc3lzbWVtX2luZm8gewotCWludCBucl9iYW5rczsKLQlzdHJ1Y3QgbWVtaW5mbyBiYW5rW1NZU01FTV9CQU5LU19NQVhdOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBzeXNtZW1faW5mbyBzeXNtZW07Ci0KLWludCBhZGRfc3lzbWVtX2JhbmsodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwotaW50IG1lbV9yZXNlcnZlKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGludCk7CiB2b2lkIGJvb3RtZW1faW5pdCh2b2lkKTsKIHZvaWQgem9uZXNfaW5pdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdmVjdG9ycy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdmVjdG9ycy5oCmluZGV4IDI4OGM3NzYuLjc3ZDQxY2MgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3ZlY3RvcnMuaAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS92ZWN0b3JzLmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgogI2luY2x1ZGUgPHBsYXRmb3JtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2ttZW1fbGF5b3V0Lmg+CiAKICNpZiBYQ0hBTF9IQVZFX1BUUF9NTVUKICNkZWZpbmUgWENIQUxfS0lPX0NBQ0hFRF9WQUREUgkJMHhlMDAwMDAwMApAQCAtNDcsNjEgKzQ4LDQyIEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19NTVUpCiAKLS8qIFdpbGwgQmVjb21lIFZFQ0JBU0UgKi8KLSNkZWZpbmUgVklSVFVBTF9NRU1PUllfQUREUkVTUwkJMHhEMDAwMDAwMAotCisjaWYgWENIQUxfSEFWRV9QVFBfTU1VICYmIFhDSEFMX0hBVkVfU1BBTk5JTkdfV0FZCiAvKiBJbWFnZSBWaXJ0dWFsIFN0YXJ0IEFkZHJlc3MgKi8KLSNkZWZpbmUgS0VSTkVMT0ZGU0VUCQkJMHhEMDAwMzAwMAotCi0jaWYgZGVmaW5lZChYQ0hBTF9IQVZFX1BUUF9NTVUpICYmIFhDSEFMX0hBVkVfUFRQX01NVSAmJiBYQ0hBTF9IQVZFX1NQQU5OSU5HX1dBWQotICAvKiBNTVUgdjMgIC0gWENIQUxfSEFWRV9QVFBfTU1VICA9PSAxICovCi0gICNkZWZpbmUgTE9BRF9NRU1PUllfQUREUkVTUwkJMHgwMDAwMzAwMAorI2RlZmluZSBLRVJORUxPRkZTRVQJCQkoWENIQUxfS1NFR19DQUNIRURfVkFERFIgKyBcCisJCQkJCSBDT05GSUdfS0VSTkVMX0xPQURfQUREUkVTUyAtIFwKKwkJCQkJIFhDSEFMX0tTRUdfUEFERFIpCiAjZWxzZQotICAvKiBNTVUgVjIgLSAgWENIQUxfSEFWRV9QVFBfTU1VICA9PSAwICovCi0gICNkZWZpbmUgTE9BRF9NRU1PUllfQUREUkVTUwkJMHhEMDAwMzAwMAorI2RlZmluZSBLRVJORUxPRkZTRVQJCQlDT05GSUdfS0VSTkVMX0xPQURfQUREUkVTUwogI2VuZGlmCiAKLSNkZWZpbmUgUkVTRVRfVkVDVE9SMV9WQUREUgkJKFZJUlRVQUxfTUVNT1JZX0FERFJFU1MgKyBcCi0JCQkJCSBYQ0hBTF9SRVNFVF9WRUNUT1IxX1BBRERSKQotCiAjZWxzZSAvKiAhZGVmaW5lZChDT05GSUdfTU1VKSAqLwogICAvKiBNTVUgTm90IGJlaW5nIHVzZWQgLSBWaXJ0dWFsID09IFBoeXNpY2FsICovCiAKLSAgLyogVkVDQkFTRSAqLwotICAjZGVmaW5lIFZJUlRVQUxfTUVNT1JZX0FERFJFU1MJKFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NUQVJUICsgMHgyMDAwKQorLyogTG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBrZXJuZWwgdGV4dCwgX3N0YXJ0ICovCisjZGVmaW5lIEtFUk5FTE9GRlNFVAkJCUNPTkZJR19LRVJORUxfTE9BRF9BRERSRVNTCiAKLSAgLyogTG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBrZXJuZWwgdGV4dCwgX3N0YXJ0ICovCi0gICNkZWZpbmUgS0VSTkVMT0ZGU0VUCQkJKFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NUQVJUICsgMHgzMDAwKQotCi0gIC8qIExvYWRlZCBqdXN0IGFib3ZlIHBvc3NpYmx5IGxpdmUgdmVjdG9ycyAqLwotICAjZGVmaW5lIExPQURfTUVNT1JZX0FERFJFU1MJCShQTEFURk9STV9ERUZBVUxUX01FTV9TVEFSVCArIDB4MzAwMCkKLQotI2RlZmluZSBSRVNFVF9WRUNUT1IxX1ZBRERSCQkoWENIQUxfUkVTRVRfVkVDVE9SMV9WQUREUikKIAogI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KIAotI2RlZmluZSBYQ19WQUREUihvZmZzZXQpCQkoVklSVFVBTF9NRU1PUllfQUREUkVTUyAgKyBvZmZzZXQpCi0KLS8qIFVzZWQgdG8gc2V0IFZFQ0JBU0UgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVkVDQkFTRV9SRVNFVF9WQUREUgkJVklSVFVBTF9NRU1PUllfQUREUkVTUworI2RlZmluZSBSRVNFVF9WRUNUT1IxX1ZBRERSCQkoWENIQUxfUkVTRVRfVkVDVE9SMV9WQUREUikKKyNkZWZpbmUgVkVDQkFTRV9WQUREUgkJCShLRVJORUxPRkZTRVQgLSBDT05GSUdfVkVDVE9SU19PRkZTRVQpCiAKICNpZiBkZWZpbmVkKFhDSEFMX0hBVkVfVkVDQkFTRSkgJiYgWENIQUxfSEFWRV9WRUNCQVNFCiAKLSNkZWZpbmUgVVNFUl9WRUNUT1JfVkFERFIJCVhDX1ZBRERSKFhDSEFMX1VTRVJfVkVDT0ZTKQotI2RlZmluZSBLRVJORUxfVkVDVE9SX1ZBRERSCQlYQ19WQUREUihYQ0hBTF9LRVJORUxfVkVDT0ZTKQotI2RlZmluZSBET1VCTEVFWENfVkVDVE9SX1ZBRERSCQlYQ19WQUREUihYQ0hBTF9ET1VCTEVFWENfVkVDT0ZTKQotI2RlZmluZSBXSU5ET1dfVkVDVE9SU19WQUREUgkJWENfVkFERFIoWENIQUxfV0lORE9XX09GNF9WRUNPRlMpCi0jZGVmaW5lIElOVExFVkVMMl9WRUNUT1JfVkFERFIJCVhDX1ZBRERSKFhDSEFMX0lOVExFVkVMMl9WRUNPRlMpCi0jZGVmaW5lIElOVExFVkVMM19WRUNUT1JfVkFERFIJCVhDX1ZBRERSKFhDSEFMX0lOVExFVkVMM19WRUNPRlMpCi0jZGVmaW5lIElOVExFVkVMNF9WRUNUT1JfVkFERFIJCVhDX1ZBRERSKFhDSEFMX0lOVExFVkVMNF9WRUNPRlMpCi0jZGVmaW5lIElOVExFVkVMNV9WRUNUT1JfVkFERFIJCVhDX1ZBRERSKFhDSEFMX0lOVExFVkVMNV9WRUNPRlMpCi0jZGVmaW5lIElOVExFVkVMNl9WRUNUT1JfVkFERFIJCVhDX1ZBRERSKFhDSEFMX0lOVExFVkVMNl9WRUNPRlMpCisjZGVmaW5lIFZFQ1RPUl9WQUREUihvZmZzZXQpCQkoVkVDQkFTRV9WQUREUiArIG9mZnNldCkKIAotI2RlZmluZSBERUJVR19WRUNUT1JfVkFERFIJCVhDX1ZBRERSKFhDSEFMX0RFQlVHX1ZFQ09GUykKLQotI2RlZmluZSBOTUlfVkVDVE9SX1ZBRERSCQlYQ19WQUREUihYQ0hBTF9OTUlfVkVDT0ZTKQotCi0jZGVmaW5lIElOVExFVkVMN19WRUNUT1JfVkFERFIJCVhDX1ZBRERSKFhDSEFMX0lOVExFVkVMN19WRUNPRlMpCisjZGVmaW5lIFVTRVJfVkVDVE9SX1ZBRERSCQlWRUNUT1JfVkFERFIoWENIQUxfVVNFUl9WRUNPRlMpCisjZGVmaW5lIEtFUk5FTF9WRUNUT1JfVkFERFIJCVZFQ1RPUl9WQUREUihYQ0hBTF9LRVJORUxfVkVDT0ZTKQorI2RlZmluZSBET1VCTEVFWENfVkVDVE9SX1ZBRERSCQlWRUNUT1JfVkFERFIoWENIQUxfRE9VQkxFRVhDX1ZFQ09GUykKKyNkZWZpbmUgV0lORE9XX1ZFQ1RPUlNfVkFERFIJCVZFQ1RPUl9WQUREUihYQ0hBTF9XSU5ET1dfT0Y0X1ZFQ09GUykKKyNkZWZpbmUgSU5UTEVWRUwyX1ZFQ1RPUl9WQUREUgkJVkVDVE9SX1ZBRERSKFhDSEFMX0lOVExFVkVMMl9WRUNPRlMpCisjZGVmaW5lIElOVExFVkVMM19WRUNUT1JfVkFERFIJCVZFQ1RPUl9WQUREUihYQ0hBTF9JTlRMRVZFTDNfVkVDT0ZTKQorI2RlZmluZSBJTlRMRVZFTDRfVkVDVE9SX1ZBRERSCQlWRUNUT1JfVkFERFIoWENIQUxfSU5UTEVWRUw0X1ZFQ09GUykKKyNkZWZpbmUgSU5UTEVWRUw1X1ZFQ1RPUl9WQUREUgkJVkVDVE9SX1ZBRERSKFhDSEFMX0lOVExFVkVMNV9WRUNPRlMpCisjZGVmaW5lIElOVExFVkVMNl9WRUNUT1JfVkFERFIJCVZFQ1RPUl9WQUREUihYQ0hBTF9JTlRMRVZFTDZfVkVDT0ZTKQorI2RlZmluZSBJTlRMRVZFTDdfVkVDVE9SX1ZBRERSCQlWRUNUT1JfVkFERFIoWENIQUxfSU5UTEVWRUw3X1ZFQ09GUykKKyNkZWZpbmUgREVCVUdfVkVDVE9SX1ZBRERSCQlWRUNUT1JfVkFERFIoWENIQUxfREVCVUdfVkVDT0ZTKQogCiAvKgogICogVGhlc2UgWENIQUxfKiAjZGVmaW5lcyBmcm9tIHZhcmlhbi9jb3JlLmgKQEAgLTEwOSw3ICs5MSw2IEBACiAgKiBjb25zdGFudHMgYXJlIGRlZmluZWQgYWJvdmUgYW5kIHNob3VsZCBiZSB1c2VkLgogICovCiAjdW5kZWYgIFhDSEFMX1ZFQ0JBU0VfUkVTRVRfVkFERFIKLSN1bmRlZiAgWENIQUxfUkVTRVRfVkVDVE9SMF9WQUREUgogI3VuZGVmICBYQ0hBTF9VU0VSX1ZFQ1RPUl9WQUREUgogI3VuZGVmICBYQ0hBTF9LRVJORUxfVkVDVE9SX1ZBRERSCiAjdW5kZWYgIFhDSEFMX0RPVUJMRUVYQ19WRUNUT1JfVkFERFIKQEAgLTExOSw5ICsxMDAsOCBAQAogI3VuZGVmICBYQ0hBTF9JTlRMRVZFTDRfVkVDVE9SX1ZBRERSCiAjdW5kZWYgIFhDSEFMX0lOVExFVkVMNV9WRUNUT1JfVkFERFIKICN1bmRlZiAgWENIQUxfSU5UTEVWRUw2X1ZFQ1RPUl9WQUREUgotI3VuZGVmICBYQ0hBTF9ERUJVR19WRUNUT1JfVkFERFIKLSN1bmRlZiAgWENIQUxfTk1JX1ZFQ1RPUl9WQUREUgogI3VuZGVmICBYQ0hBTF9JTlRMRVZFTDdfVkVDVE9SX1ZBRERSCisjdW5kZWYgIFhDSEFMX0RFQlVHX1ZFQ1RPUl9WQUREUgogCiAjZWxzZQogCkBAIC0xMzQsNiArMTE0LDcgQEAKICNkZWZpbmUgSU5UTEVWRUw0X1ZFQ1RPUl9WQUREUgkJWENIQUxfSU5UTEVWRUw0X1ZFQ1RPUl9WQUREUgogI2RlZmluZSBJTlRMRVZFTDVfVkVDVE9SX1ZBRERSCQlYQ0hBTF9JTlRMRVZFTDVfVkVDVE9SX1ZBRERSCiAjZGVmaW5lIElOVExFVkVMNl9WRUNUT1JfVkFERFIJCVhDSEFMX0lOVExFVkVMNl9WRUNUT1JfVkFERFIKKyNkZWZpbmUgSU5UTEVWRUw3X1ZFQ1RPUl9WQUREUgkJWENIQUxfSU5UTEVWRUw2X1ZFQ1RPUl9WQUREUgogI2RlZmluZSBERUJVR19WRUNUT1JfVkFERFIJCVhDSEFMX0RFQlVHX1ZFQ1RPUl9WQUREUgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvdWFwaS9hc20vdHlwZXMuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvdWFwaS9hc20vdHlwZXMuaAppbmRleCA4N2VjN2FlLi4yZWZjOTIxIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL3VhcGkvYXNtL3R5cGVzLmgKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS91YXBpL2FzbS90eXBlcy5oCkBAIC0xOCw3ICsxOCw4IEBACiAjIGRlZmluZSBfX1hURU5TQV9VTF9DT05TVCh4KQl4CiAjZWxzZQogIyBkZWZpbmUgX19YVEVOU0FfVUwoeCkJCSgodW5zaWduZWQgbG9uZykoeCkpCi0jIGRlZmluZSBfX1hURU5TQV9VTF9DT05TVCh4KQl4IyNVTAorIyBkZWZpbmUgX19fWFRFTlNBX1VMX0NPTlNUKHgpCXgjI1VMCisjIGRlZmluZSBfX1hURU5TQV9VTF9DT05TVCh4KQlfX19YVEVOU0FfVUxfQ09OU1QoeCkKICNlbmRpZgogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS91YXBpL2FzbS91bmlzdGQuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvdWFwaS9hc20vdW5pc3RkLmgKaW5kZXggYjk1YzMwNS4uZGU5YjE0YiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvaW5jbHVkZS91YXBpL2FzbS91bmlzdGQuaAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL3VhcGkvYXNtL3VuaXN0ZC5oCkBAIC03NTQsNyArNzU0LDIwIEBACiAjZGVmaW5lIF9fTlJfZXhlY3ZlYXQJCQkJMzQxCiBfX1NZU0NBTEwoMzQxLCBzeXNfZXhlY3ZlYXQsIDUpCiAKLSNkZWZpbmUgX19OUl9zeXNjYWxsX2NvdW50CQkJMzQyCisjZGVmaW5lIF9fTlJfdXNlcmZhdWx0ZmQJCQkzNDIKK19fU1lTQ0FMTCgzNDIsIHN5c191c2VyZmF1bHRmZCwgMSkKKyNkZWZpbmUgX19OUl9tZW1iYXJyaWVyCQkJCTM0MworX19TWVNDQUxMKDM0Mywgc3lzX21lbWJhcnJpZXIsIDIpCisjZGVmaW5lIF9fTlJfbWxvY2syCQkJCTM0NAorX19TWVNDQUxMKDM0NCwgc3lzX21sb2NrMiwgMykKKyNkZWZpbmUgX19OUl9jb3B5X2ZpbGVfcmFuZ2UJCQkzNDUKK19fU1lTQ0FMTCgzNDUsIHN5c19jb3B5X2ZpbGVfcmFuZ2UsIDYpCisjZGVmaW5lIF9fTlJfcHJlYWR2MgkJCQkzNDYKK19fU1lTQ0FMTCgzNDYsIHN5c19wcmVhZHYyLCA2KQorI2RlZmluZSBfX05SX3B3cml0ZXYyCQkJCTM0NworX19TWVNDQUxMKDM0Nywgc3lzX3B3cml0ZXYyLCA2KQorCisjZGVmaW5lIF9fTlJfc3lzY2FsbF9jb3VudAkJCTM0OAogCiAvKgogICogc3lzeHRlbnNhIHN5c2NhbGwgaGFuZGxlcgpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL2VudHJ5LlMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvZW50cnkuUwppbmRleCBmZThmN2U3Li5mYTA0ZDlkIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvZW50cnkuUwpAQCAtMTYzMiwxMCArMTYzMiwxMSBAQAogCSAqIFRoZSBtZXNzeSBjb21wdXRhdGlvbiBmb3IgJ3B0ZXZhbCcgYWJvdmUgcmVhbGx5IHNpbXBsaWZpZXMKIAkgKiBpbnRvIHRoZSBmb2xsb3dpbmc6CiAJICoKLQkgKiBwdGV2YWwgPSAoKHBtZHZhbCAtIFBBR0VfT0ZGU0VUKSAmIFBBR0VfTUFTSykgfCBQQUdFX0RJUkVDVE9SWQorCSAqIHB0ZXZhbCA9ICgocG1kdmFsIC0gUEFHRV9PRkZTRVQgKyBQSFlTX09GRlNFVCkgJiBQQUdFX01BU0spCisJICogICAgICAgICAgICAgICAgIHwgUEFHRV9ESVJFQ1RPUlkKIAkgKi8KIAotCW1vdmkJYTEsICgtUEFHRV9PRkZTRVQpICYgMHhmZmZmZmZmZgorCW1vdmkJYTEsIChQSFlTX09GRlNFVCAtIFBBR0VfT0ZGU0VUKSAmIDB4ZmZmZmZmZmYKIAlhZGQJYTAsIGEwLCBhMQkJIyBwbWR2YWwgLSBQQUdFX09GRlNFVAogCWV4dHVpCWExLCBhMCwgMCwgUEFHRV9TSElGVAkjIC4uLiAmIFBBR0VfTUFTSwogCXhvcglhMCwgYTAsIGExCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvaGVhZC5TIGIvYXJjaC94dGVuc2Eva2VybmVsL2hlYWQuUwppbmRleCBiYzRmNGJmLi4yM2NlNjJlIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9oZWFkLlMKQEAgLTExMyw3ICsxMTMsNyBAQAogCW1vdmkJYTAsIDAKIAogI2lmIFhDSEFMX0hBVkVfVkVDQkFTRQotCW1vdmkgICAgYTIsIFZFQ0JBU0VfUkVTRVRfVkFERFIKKwltb3ZpICAgIGEyLCBWRUNCQVNFX1ZBRERSCiAJd3NyCWEyLCB2ZWNiYXNlCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3NldHVwLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvc2V0dXAuYwppbmRleCAxNDMyNTFlLi44OGEwNDRhIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvc2V0dXAuYwpAQCAtNyw2ICs3LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTUgIExpbnVzIFRvcnZhbGRzCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1ICBUZW5zaWxpY2EgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE0IC0gMjAxNiAgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcyBJbmMuCiAgKgogICogQ2hyaXMgWmFua2VsCTxjaHJpc0B6YW5rZWwubmV0PgogICogSm9lIFRheWxvcgk8am9lQHRlbnNpbGljYS5jb20sIGpvZXR5bHJAeWFob28uY29tPgpAQCAtMjIsNyArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2ZkdC5oPgpAQCAtMTE0LDcgKzExNCw3IEBACiAJaWYgKG1pLT50eXBlICE9IE1FTU9SWV9UWVBFX0NPTlZFTlRJT05BTCkKIAkJcmV0dXJuIC0xOwogCi0JcmV0dXJuIGFkZF9zeXNtZW1fYmFuayhtaS0+c3RhcnQsIG1pLT5lbmQpOworCXJldHVybiBtZW1ibG9ja19hZGQobWktPnN0YXJ0LCBtaS0+ZW5kIC0gbWktPnN0YXJ0KTsKIH0KIAogX190YWd0YWJsZShCUF9UQUdfTUVNT1JZLCBwYXJzZV90YWdfbWVtKTsKQEAgLTE4OCw3ICsxODgsNiBAQAogfQogCiAjaWZkZWYgQ09ORklHX09GCi1ib29sIF9faW5pdGRhdGEgZHRfbWVtb3J5X3NjYW4gPSBmYWxzZTsKIAogI2lmICFYQ0hBTF9IQVZFX1BUUF9NTVUgfHwgWENIQUxfSEFWRV9TUEFOTklOR19XQVkKIHVuc2lnbmVkIGxvbmcgeHRlbnNhX2tpb19wYWRkciA9IFhDSEFMX0tJT19ERUZBVUxUX1BBRERSOwpAQCAtMjI4LDExICsyMjcsOCBAQAogCiB2b2lkIF9faW5pdCBlYXJseV9pbml0X2R0X2FkZF9tZW1vcnlfYXJjaCh1NjQgYmFzZSwgdTY0IHNpemUpCiB7Ci0JaWYgKCFkdF9tZW1vcnlfc2NhbikKLQkJcmV0dXJuOwotCiAJc2l6ZSAmPSBQQUdFX01BU0s7Ci0JYWRkX3N5c21lbV9iYW5rKGJhc2UsIGJhc2UgKyBzaXplKTsKKwltZW1ibG9ja19hZGQoYmFzZSwgc2l6ZSk7CiB9CiAKIHZvaWQgKiBfX2luaXQgZWFybHlfaW5pdF9kdF9hbGxvY19tZW1vcnlfYXJjaCh1NjQgc2l6ZSwgdTY0IGFsaWduKQpAQCAtMjQyLDkgKzIzOCw2IEBACiAKIHZvaWQgX19pbml0IGVhcmx5X2luaXRfZGV2dHJlZSh2b2lkICpwYXJhbXMpCiB7Ci0JaWYgKHN5c21lbS5ucl9iYW5rcyA9PSAwKQotCQlkdF9tZW1vcnlfc2NhbiA9IHRydWU7Ci0KIAllYXJseV9pbml0X2R0X3NjYW4ocGFyYW1zKTsKIAlvZl9zY2FuX2ZsYXRfZHQoeHRlbnNhX2R0X2lvX2FyZWEsIE5VTEwpOwogCkBAIC0yNTIsMTQgKzI0NSw2IEBACiAJCXN0cmxjcHkoY29tbWFuZF9saW5lLCBib290X2NvbW1hbmRfbGluZSwgQ09NTUFORF9MSU5FX1NJWkUpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCB4dGVuc2FfZGV2aWNlX3Byb2JlKHZvaWQpCi17Ci0Jb2ZfY2xrX2luaXQoTlVMTCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWRldmljZV9pbml0Y2FsbCh4dGVuc2FfZGV2aWNlX3Byb2JlKTsKLQogI2VuZGlmIC8qIENPTkZJR19PRiAqLwogCiAvKgpAQCAtMjc3LDEyICsyNjIsNiBAQAogCWVhcmx5X2luaXRfZGV2dHJlZShkdGJfc3RhcnQpOwogI2VuZGlmCiAKLQlpZiAoc3lzbWVtLm5yX2JhbmtzID09IDApIHsKLQkJYWRkX3N5c21lbV9iYW5rKFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NUQVJULAotCQkJCVBMQVRGT1JNX0RFRkFVTFRfTUVNX1NUQVJUICsKLQkJCQlQTEFURk9STV9ERUZBVUxUX01FTV9TSVpFKTsKLQl9Ci0KICNpZmRlZiBDT05GSUdfQ01ETElORV9CT09MCiAJaWYgKCFjb21tYW5kX2xpbmVbMF0pCiAJCXN0cmxjcHkoY29tbWFuZF9saW5lLCBkZWZhdWx0X2NvbW1hbmRfbGluZSwgQ09NTUFORF9MSU5FX1NJWkUpOwpAQCAtNDUyLDYgKzQzMSwxMCBAQAogZWFybHlfaW5pdGNhbGwoY2hlY2tfczMyYzFpKTsKICNlbmRpZiAvKiBDT05GSUdfUzMyQzFJX1NFTEZURVNUICovCiAKK3N0YXRpYyBpbmxpbmUgaW50IG1lbV9yZXNlcnZlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXJldHVybiBtZW1ibG9ja19yZXNlcnZlKHN0YXJ0LCBlbmQgLSBzdGFydCk7Cit9CiAKIHZvaWQgX19pbml0IHNldHVwX2FyY2goY2hhciAqKmNtZGxpbmVfcCkKIHsKQEAgLTQ2Myw1NCArNDQ2LDU0IEBACiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECiAJaWYgKGluaXRyZF9zdGFydCA8IGluaXRyZF9lbmQpIHsKIAkJaW5pdHJkX2lzX21hcHBlZCA9IG1lbV9yZXNlcnZlKF9fcGEoaW5pdHJkX3N0YXJ0KSwKLQkJCQkJICAgICAgIF9fcGEoaW5pdHJkX2VuZCksIDApID09IDA7CisJCQkJCSAgICAgICBfX3BhKGluaXRyZF9lbmQpKSA9PSAwOwogCQlpbml0cmRfYmVsb3dfc3RhcnRfb2sgPSAxOwogCX0gZWxzZSB7CiAJCWluaXRyZF9zdGFydCA9IDA7CiAJfQogI2VuZGlmCiAKLQltZW1fcmVzZXJ2ZShfX3BhKCZfc3RleHQpLF9fcGEoJl9lbmQpLCAxKTsKKwltZW1fcmVzZXJ2ZShfX3BhKCZfc3RleHQpLCBfX3BhKCZfZW5kKSk7CiAKIAltZW1fcmVzZXJ2ZShfX3BhKCZfV2luZG93VmVjdG9yc190ZXh0X3N0YXJ0KSwKLQkJICAgIF9fcGEoJl9XaW5kb3dWZWN0b3JzX3RleHRfZW5kKSwgMCk7CisJCSAgICBfX3BhKCZfV2luZG93VmVjdG9yc190ZXh0X2VuZCkpOwogCiAJbWVtX3Jlc2VydmUoX19wYSgmX0RlYnVnSW50ZXJydXB0VmVjdG9yX2xpdGVyYWxfc3RhcnQpLAotCQkgICAgX19wYSgmX0RlYnVnSW50ZXJydXB0VmVjdG9yX3RleHRfZW5kKSwgMCk7CisJCSAgICBfX3BhKCZfRGVidWdJbnRlcnJ1cHRWZWN0b3JfdGV4dF9lbmQpKTsKIAogCW1lbV9yZXNlcnZlKF9fcGEoJl9LZXJuZWxFeGNlcHRpb25WZWN0b3JfbGl0ZXJhbF9zdGFydCksCi0JCSAgICBfX3BhKCZfS2VybmVsRXhjZXB0aW9uVmVjdG9yX3RleHRfZW5kKSwgMCk7CisJCSAgICBfX3BhKCZfS2VybmVsRXhjZXB0aW9uVmVjdG9yX3RleHRfZW5kKSk7CiAKIAltZW1fcmVzZXJ2ZShfX3BhKCZfVXNlckV4Y2VwdGlvblZlY3Rvcl9saXRlcmFsX3N0YXJ0KSwKLQkJICAgIF9fcGEoJl9Vc2VyRXhjZXB0aW9uVmVjdG9yX3RleHRfZW5kKSwgMCk7CisJCSAgICBfX3BhKCZfVXNlckV4Y2VwdGlvblZlY3Rvcl90ZXh0X2VuZCkpOwogCiAJbWVtX3Jlc2VydmUoX19wYSgmX0RvdWJsZUV4Y2VwdGlvblZlY3Rvcl9saXRlcmFsX3N0YXJ0KSwKLQkJICAgIF9fcGEoJl9Eb3VibGVFeGNlcHRpb25WZWN0b3JfdGV4dF9lbmQpLCAwKTsKKwkJICAgIF9fcGEoJl9Eb3VibGVFeGNlcHRpb25WZWN0b3JfdGV4dF9lbmQpKTsKIAogI2lmIFhDSEFMX0VYQ01fTEVWRUwgPj0gMgogCW1lbV9yZXNlcnZlKF9fcGEoJl9MZXZlbDJJbnRlcnJ1cHRWZWN0b3JfdGV4dF9zdGFydCksCi0JCSAgICBfX3BhKCZfTGV2ZWwySW50ZXJydXB0VmVjdG9yX3RleHRfZW5kKSwgMCk7CisJCSAgICBfX3BhKCZfTGV2ZWwySW50ZXJydXB0VmVjdG9yX3RleHRfZW5kKSk7CiAjZW5kaWYKICNpZiBYQ0hBTF9FWENNX0xFVkVMID49IDMKIAltZW1fcmVzZXJ2ZShfX3BhKCZfTGV2ZWwzSW50ZXJydXB0VmVjdG9yX3RleHRfc3RhcnQpLAotCQkgICAgX19wYSgmX0xldmVsM0ludGVycnVwdFZlY3Rvcl90ZXh0X2VuZCksIDApOworCQkgICAgX19wYSgmX0xldmVsM0ludGVycnVwdFZlY3Rvcl90ZXh0X2VuZCkpOwogI2VuZGlmCiAjaWYgWENIQUxfRVhDTV9MRVZFTCA+PSA0CiAJbWVtX3Jlc2VydmUoX19wYSgmX0xldmVsNEludGVycnVwdFZlY3Rvcl90ZXh0X3N0YXJ0KSwKLQkJICAgIF9fcGEoJl9MZXZlbDRJbnRlcnJ1cHRWZWN0b3JfdGV4dF9lbmQpLCAwKTsKKwkJICAgIF9fcGEoJl9MZXZlbDRJbnRlcnJ1cHRWZWN0b3JfdGV4dF9lbmQpKTsKICNlbmRpZgogI2lmIFhDSEFMX0VYQ01fTEVWRUwgPj0gNQogCW1lbV9yZXNlcnZlKF9fcGEoJl9MZXZlbDVJbnRlcnJ1cHRWZWN0b3JfdGV4dF9zdGFydCksCi0JCSAgICBfX3BhKCZfTGV2ZWw1SW50ZXJydXB0VmVjdG9yX3RleHRfZW5kKSwgMCk7CisJCSAgICBfX3BhKCZfTGV2ZWw1SW50ZXJydXB0VmVjdG9yX3RleHRfZW5kKSk7CiAjZW5kaWYKICNpZiBYQ0hBTF9FWENNX0xFVkVMID49IDYKIAltZW1fcmVzZXJ2ZShfX3BhKCZfTGV2ZWw2SW50ZXJydXB0VmVjdG9yX3RleHRfc3RhcnQpLAotCQkgICAgX19wYSgmX0xldmVsNkludGVycnVwdFZlY3Rvcl90ZXh0X2VuZCksIDApOworCQkgICAgX19wYSgmX0xldmVsNkludGVycnVwdFZlY3Rvcl90ZXh0X2VuZCkpOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfU01QCiAJbWVtX3Jlc2VydmUoX19wYSgmX1NlY29uZGFyeVJlc2V0VmVjdG9yX3RleHRfc3RhcnQpLAotCQkgICAgX19wYSgmX1NlY29uZGFyeVJlc2V0VmVjdG9yX3RleHRfZW5kKSwgMCk7CisJCSAgICBfX3BhKCZfU2Vjb25kYXJ5UmVzZXRWZWN0b3JfdGV4dF9lbmQpKTsKICNlbmRpZgogCXBhcnNlX2Vhcmx5X3BhcmFtKCk7CiAJYm9vdG1lbV9pbml0KCk7CkBAIC01NTUsNiArNTM4LDEzNyBAQAogfQogc3Vic3lzX2luaXRjYWxsKHRvcG9sb2d5X2luaXQpOwogCit2b2lkIGNwdV9yZXNldCh2b2lkKQoreworI2lmIFhDSEFMX0hBVkVfUFRQX01NVQorCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJLyoKKwkgKiBXZSBoYXZlIGZ1bGwgTU1VOiBhbGwgYXV0b2xvYWQgd2F5cywgd2F5cyA3LCA4IGFuZCA5IG9mIERUTEIgbXVzdAorCSAqIGJlIGZsdXNoZWQuCisJICogV2F5IDQgaXMgbm90IGN1cnJlbnRseSB1c2VkIGJ5IGxpbnV4LgorCSAqIFdheXMgNSBhbmQgNiBzaGFsbCBub3QgYmUgdG91Y2hlZCBvbiBNTVV2MiBhcyB0aGV5IGFyZSBoYXJkd2lyZWQuCisJICogV2F5IDUgc2hhbGwgYmUgZmx1c2hlZCBhbmQgd2F5IDYgc2hhbGwgYmUgc2V0IHRvIGlkZW50aXR5IG1hcHBpbmcKKwkgKiBvbiBNTVV2My4KKwkgKi8KKwlsb2NhbF9mbHVzaF90bGJfYWxsKCk7CisJaW52YWxpZGF0ZV9wYWdlX2RpcmVjdG9yeSgpOworI2lmIFhDSEFMX0hBVkVfU1BBTk5JTkdfV0FZCisJLyogTU1VIHYzICovCisJeworCQl1bnNpZ25lZCBsb25nIHZhZGRyID0gKHVuc2lnbmVkIGxvbmcpY3B1X3Jlc2V0OworCQl1bnNpZ25lZCBsb25nIHBhZGRyID0gX19wYSh2YWRkcik7CisJCXVuc2lnbmVkIGxvbmcgdG1wYWRkciA9IHZhZGRyICsgU1pfNTEyTTsKKwkJdW5zaWduZWQgbG9uZyB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworCisJCS8qCisJCSAqIEZpbmQgYSBwbGFjZSBmb3IgdGhlIHRlbXBvcmFyeSBtYXBwaW5nLiBJdCBtdXN0IG5vdCBiZQorCQkgKiBpbiB0aGUgc2FtZSA1MTJNQiByZWdpb24gd2l0aCB2YWRkciBvciBwYWRkciwgb3RoZXJ3aXNlCisJCSAqIHRoZXJlIG1heSBiZSBtdWx0aWhpdCBleGNlcHRpb24gZWl0aGVyIG9uIGVudHJ5IHRvIHRoZQorCQkgKiB0ZW1wb3JhcnkgbWFwcGluZywgb3Igb24gZW50cnkgdG8gdGhlIGlkZW50aXR5IG1hcHBpbmcuCisJCSAqICg1MTJNQiBpcyB0aGUgYmlnZ2VzdCBwYWdlIHNpemUgc3VwcG9ydGVkIGJ5IFRMQi4pCisJCSAqLworCQl3aGlsZSAoKCh0bXBhZGRyIF4gcGFkZHIpICYgLVNaXzUxMk0pID09IDApCisJCQl0bXBhZGRyICs9IFNaXzUxMk07CisKKwkJLyogSW52YWxpZGF0ZSBtYXBwaW5nIGluIHRoZSBzZWxlY3RlZCB0ZW1wb3JhcnkgYXJlYSAqLworCQlpZiAoaXRsYl9wcm9iZSh0bXBhZGRyKSAmIDB4OCkKKwkJCWludmFsaWRhdGVfaXRsYl9lbnRyeShpdGxiX3Byb2JlKHRtcGFkZHIpKTsKKwkJaWYgKGl0bGJfcHJvYmUodG1wYWRkciArIFBBR0VfU0laRSkgJiAweDgpCisJCQlpbnZhbGlkYXRlX2l0bGJfZW50cnkoaXRsYl9wcm9iZSh0bXBhZGRyICsgUEFHRV9TSVpFKSk7CisKKwkJLyoKKwkJICogTWFwIHR3byBjb25zZWN1dGl2ZSBwYWdlcyBzdGFydGluZyBhdCB0aGUgcGh5c2ljYWwgYWRkcmVzcworCQkgKiBvZiB0aGlzIGZ1bmN0aW9uIHRvIHRoZSB0ZW1wb3JhcnkgbWFwcGluZyBhcmVhLgorCQkgKi8KKwkJd3JpdGVfaXRsYl9lbnRyeShfX3B0ZSgocGFkZHIgJiBQQUdFX01BU0spIHwKKwkJCQkgICAgICAgX1BBR0VfSFdfVkFMSUQgfAorCQkJCSAgICAgICBfUEFHRV9IV19FWEVDIHwKKwkJCQkgICAgICAgX1BBR0VfQ0FfQllQQVNTKSwKKwkJCQkgdG1wYWRkciAmIFBBR0VfTUFTSyk7CisJCXdyaXRlX2l0bGJfZW50cnkoX19wdGUoKChwYWRkciAmIFBBR0VfTUFTSykgKyBQQUdFX1NJWkUpIHwKKwkJCQkgICAgICAgX1BBR0VfSFdfVkFMSUQgfAorCQkJCSAgICAgICBfUEFHRV9IV19FWEVDIHwKKwkJCQkgICAgICAgX1BBR0VfQ0FfQllQQVNTKSwKKwkJCQkgKHRtcGFkZHIgJiBQQUdFX01BU0spICsgUEFHRV9TSVpFKTsKKworCQkvKiBSZWluaXRpYWxpemUgVExCICovCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92aQklMCwgMWZcblx0IgorCQkJCSAgICAgICJtb3ZpCSUzLCAyZlxuXHQiCisJCQkJICAgICAgImFkZAklMCwgJTAsICU0XG5cdCIKKwkJCQkgICAgICAiYWRkCSUzLCAlMywgJTVcblx0IgorCQkJCSAgICAgICJqeAklMFxuIgorCQkJCSAgICAgIC8qCisJCQkJICAgICAgICogTm8gbGl0ZXJhbCwgZGF0YSBvciBzdGFjayBhY2Nlc3MKKwkJCQkgICAgICAgKiBiZWxvdyB0aGlzIHBvaW50CisJCQkJICAgICAgICovCisJCQkJICAgICAgIjE6XG5cdCIKKwkJCQkgICAgICAvKiBJbml0aWFsaXplICp0bGJjZmcgKi8KKwkJCQkgICAgICAibW92aQklMCwgMFxuXHQiCisJCQkJICAgICAgIndzcgklMCwgaXRsYmNmZ1xuXHQiCisJCQkJICAgICAgIndzcgklMCwgZHRsYmNmZ1xuXHQiCisJCQkJICAgICAgLyogSW52YWxpZGF0ZSBUTEIgd2F5IDUgKi8KKwkJCQkgICAgICAibW92aQklMCwgNFxuXHQiCisJCQkJICAgICAgIm1vdmkJJTEsIDVcbiIKKwkJCQkgICAgICAiMTpcblx0IgorCQkJCSAgICAgICJpaXRsYgklMVxuXHQiCisJCQkJICAgICAgImlkdGxiCSUxXG5cdCIKKwkJCQkgICAgICAiYWRkCSUxLCAlMSwgJTZcblx0IgorCQkJCSAgICAgICJhZGRpCSUwLCAlMCwgLTFcblx0IgorCQkJCSAgICAgICJibmV6CSUwLCAxYlxuXHQiCisJCQkJICAgICAgLyogSW5pdGlhbGl6ZSBUTEIgd2F5IDYgKi8KKwkJCQkgICAgICAibW92aQklMCwgN1xuXHQiCisJCQkJICAgICAgImFkZGkJJTEsICU5LCAzXG5cdCIKKwkJCQkgICAgICAiYWRkaQklMiwgJTksIDZcbiIKKwkJCQkgICAgICAiMTpcblx0IgorCQkJCSAgICAgICJ3aXRsYgklMSwgJTJcblx0IgorCQkJCSAgICAgICJ3ZHRsYgklMSwgJTJcblx0IgorCQkJCSAgICAgICJhZGQJJTEsICUxLCAlN1xuXHQiCisJCQkJICAgICAgImFkZAklMiwgJTIsICU3XG5cdCIKKwkJCQkgICAgICAiYWRkaQklMCwgJTAsIC0xXG5cdCIKKwkJCQkgICAgICAiYm5legklMCwgMWJcblx0IgorCQkJCSAgICAgIC8qIEp1bXAgdG8gaWRlbnRpdHkgbWFwcGluZyAqLworCQkJCSAgICAgICJqeAklM1xuIgorCQkJCSAgICAgICIyOlxuXHQiCisJCQkJICAgICAgLyogQ29tcGxldGUgd2F5IDYgaW5pdGlhbGl6YXRpb24gKi8KKwkJCQkgICAgICAid2l0bGIJJTEsICUyXG5cdCIKKwkJCQkgICAgICAid2R0bGIJJTEsICUyXG5cdCIKKwkJCQkgICAgICAvKiBJbnZhbGlkYXRlIHRlbXBvcmFyeSBtYXBwaW5nICovCisJCQkJICAgICAgInN1YgklMCwgJTksICU3XG5cdCIKKwkJCQkgICAgICAiaWl0bGIJJTBcblx0IgorCQkJCSAgICAgICJhZGQJJTAsICUwLCAlOFxuXHQiCisJCQkJICAgICAgImlpdGxiCSUwIgorCQkJCSAgICAgIDogIj0mYSIodG1wMCksICI9JmEiKHRtcDEpLCAiPSZhIih0bXAyKSwKKwkJCQkJIj0mYSIodG1wMykKKwkJCQkgICAgICA6ICJhIih0bXBhZGRyIC0gdmFkZHIpLAorCQkJCQkiYSIocGFkZHIgLSB2YWRkciksCisJCQkJCSJhIihTWl8xMjhNKSwgImEiKFNaXzUxMk0pLAorCQkJCQkiYSIoUEFHRV9TSVpFKSwKKwkJCQkJImEiKCh0bXBhZGRyICsgU1pfNTEyTSkgJiBQQUdFX01BU0spCisJCQkJICAgICAgOiAibWVtb3J5Iik7CisJfQorI2VuZGlmCisjZW5kaWYKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmkJYTIsIDBcblx0IgorCQkJICAgICAgIndzcglhMiwgaWNvdW50bGV2ZWxcblx0IgorCQkJICAgICAgIm1vdmkJYTIsIDBcblx0IgorCQkJICAgICAgIndzcglhMiwgaWNvdW50XG5cdCIKKyNpZiBYQ0hBTF9OVU1fSUJSRUFLID4gMAorCQkJICAgICAgIndzcglhMiwgaWJyZWFrZW5hYmxlXG5cdCIKKyNlbmRpZgorI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwkJCSAgICAgICJ3c3IJYTIsIGxjb3VudFxuXHQiCisjZW5kaWYKKwkJCSAgICAgICJtb3ZpCWEyLCAweDFmXG5cdCIKKwkJCSAgICAgICJ3c3IJYTIsIHBzXG5cdCIKKwkJCSAgICAgICJpc3luY1xuXHQiCisJCQkgICAgICAiangJJTBcblx0IgorCQkJICAgICAgOgorCQkJICAgICAgOiAiYSIgKFhDSEFMX1JFU0VUX1ZFQ1RPUl9WQUREUikKKwkJCSAgICAgIDogImEyIik7CisJZm9yICg7OykKKwkJOworfQorCiB2b2lkIG1hY2hpbmVfcmVzdGFydChjaGFyICogY21kKQogewogCXBsYXRmb3JtX3Jlc3RhcnQoKTsKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC90aW1lLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdGltZS5jCmluZGV4IGI5YWQ5ZmUuLjlhNWJjZDAgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3RpbWUuYwpAQCAtMTIsNiArMTIsOCBAQAogICogQ2hyaXMgWmFua2VsIDxjaHJpc0B6YW5rZWwubmV0PgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgpAQCAtMTM0LDE2ICsxMzYsNTIgQEAKIAkJCQkJMHhmLCAweGZmZmZmZmZmKTsKIH0KIAorI2lmZGVmIENPTkZJR19YVEVOU0FfQ0FMSUJSQVRFX0NDT1VOVAorI2lmZGVmIENPTkZJR19PRgorc3RhdGljIHZvaWQgX19pbml0IGNhbGlicmF0ZV9jY291bnQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisKKwljcHUgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiY2Rucyx4dGVuc2EtY3B1Iik7CisJaWYgKGNwdSkgeworCQljbGsgPSBvZl9jbGtfZ2V0KGNwdSwgMCk7CisJCWlmICghSVNfRVJSKGNsaykpIHsKKwkJCWNjb3VudF9mcmVxID0gY2xrX2dldF9yYXRlKGNsayk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlwcl93YXJuKCIlczogQ1BVIGlucHV0IGNsb2NrIG5vdCBmb3VuZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCX0KKwl9IGVsc2UgeworCQlwcl93YXJuKCIlczogQ1BVIG5vZGUgbm90IGZvdW5kIGluIHRoZSBkZXZpY2UgdHJlZVxuIiwKKwkJCV9fZnVuY19fKTsKKwl9CisKKwlwbGF0Zm9ybV9jYWxpYnJhdGVfY2NvdW50KCk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNhbGlicmF0ZV9jY291bnQodm9pZCkKK3sKKwlwbGF0Zm9ybV9jYWxpYnJhdGVfY2NvdW50KCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCiB2b2lkIF9faW5pdCB0aW1lX2luaXQodm9pZCkKIHsKKwlvZl9jbGtfaW5pdChOVUxMKTsKICNpZmRlZiBDT05GSUdfWFRFTlNBX0NBTElCUkFURV9DQ09VTlQKIAlwcmludGsoIkNhbGlicmF0aW5nIENQVSBmcmVxdWVuY3kgIik7Ci0JcGxhdGZvcm1fY2FsaWJyYXRlX2Njb3VudCgpOworCWNhbGlicmF0ZV9jY291bnQoKTsKIAlwcmludGsoIiVkLiUwMmQgTUh6XG4iLCAoaW50KWNjb3VudF9mcmVxLzEwMDAwMDAsCiAJCQkoaW50KShjY291bnRfZnJlcS8xMDAwMCklMTAwKTsKICNlbHNlCiAJY2NvdW50X2ZyZXEgPSBDT05GSUdfWFRFTlNBX0NQVV9DTE9DSyoxMDAwMDAwVUw7CiAjZW5kaWYKKwlXQVJOKCFjY291bnRfZnJlcSwKKwkgICAgICIlczogQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpcyBub3Qgc2V0IHVwIGNvcnJlY3RseVxuIiwKKwkgICAgIF9fZnVuY19fKTsKIAljbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmY2NvdW50X2Nsb2Nrc291cmNlLCBjY291bnRfZnJlcSk7CiAJbG9jYWxfdGltZXJfc2V0dXAoMCk7CiAJc2V0dXBfaXJxKHRoaXNfY3B1X3B0cigmY2NvdW50X3RpbWVyKS0+ZXZ0LmlycSwgJnRpbWVyX2lycWFjdGlvbik7CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gveHRlbnNhL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGM0MTdjYmUuLjcyY2ZlMzUgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0zMCwxMCArMzAsNiBAQAogamlmZmllcyA9IGppZmZpZXNfNjQ7CiAjZW5kaWYKIAotI2lmbmRlZiBLRVJORUxPRkZTRVQKLSNkZWZpbmUgS0VSTkVMT0ZGU0VUIDB4ZDAwMDMwMDAKLSNlbmRpZgotCiAvKiBOb3RlOiBJbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgaXQgd291bGQgYmUgbmljZSB0byBzcGVjaWZ5IG9ubHkgdGhlCiAgICB2ZWN0b3IgbmFtZSBhbmQgc2VjdGlvbiBraW5kIGFuZCBjb25zdHJ1Y3QgInN5bSIgYW5kICJzZWN0aW9uIiB1c2luZwogICAgQ1BQIGNvbmNhdGVuYXRpb24sIGJ1dCB0aGF0IGRvZXMgbm90IHdvcmsgcmVsaWFibHkuICBDb25jYXRlbmF0aW5nIGEKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL21tL2luaXQuYyBiL2FyY2gveHRlbnNhL21tL2luaXQuYwppbmRleCA5YTlhNTkzLi44MGU0Y2ZiIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9tbS9pbml0LmMKKysrIGIvYXJjaC94dGVuc2EvbW0vaW5pdC5jCkBAIC04LDcgKzgsNyBAQAogICogZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcyBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgLSAyMDE2IENhZGVuY2UgRGVzaWduIFN5c3RlbXMgSW5jLgogICoKICAqIENocmlzIFphbmtlbAk8Y2hyaXNAemFua2VsLm5ldD4KICAqIEpvZSBUYXlsb3IJPGpvZUB0ZW5zaWxpY2EuY29tLCBqb2V0eWxyQHlhaG9vLmNvbT4KQEAgLTI1LDI4NCArMjUsNDMgQEAKICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2ZkdC5oPgogCiAjaW5jbHVkZSA8YXNtL2Jvb3RwYXJhbS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL3N5c21lbS5oPgogCi1zdHJ1Y3Qgc3lzbWVtX2luZm8gc3lzbWVtIF9faW5pdGRhdGE7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBzeXNtZW1fZHVtcCh2b2lkKQotewotCXVuc2lnbmVkIGk7Ci0KLQlwcl9kZWJ1ZygiU3lzbWVtOlxuIik7Ci0JZm9yIChpID0gMDsgaSA8IHN5c21lbS5ucl9iYW5rczsgKytpKQotCQlwcl9kZWJ1ZygiICAweCUwOGx4IC0gMHglMDhseCAoJWxkSylcbiIsCi0JCQkgc3lzbWVtLmJhbmtbaV0uc3RhcnQsIHN5c21lbS5iYW5rW2ldLmVuZCwKLQkJCSAoc3lzbWVtLmJhbmtbaV0uZW5kIC0gc3lzbWVtLmJhbmtbaV0uc3RhcnQpID4+IDEwKTsKLX0KLQotLyoKLSAqIEZpbmQgYmFuayB3aXRoIG1heGltYWwgLnN0YXJ0IHN1Y2ggdGhhdCBiYW5rLnN0YXJ0IDw9IHN0YXJ0Ci0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IG1lbWluZm8gKiBfX2luaXQgZmluZF9iYW5rKHVuc2lnbmVkIGxvbmcgc3RhcnQpCi17Ci0JdW5zaWduZWQgaTsKLQlzdHJ1Y3QgbWVtaW5mbyAqaXQgPSBOVUxMOwotCi0JZm9yIChpID0gMDsgaSA8IHN5c21lbS5ucl9iYW5rczsgKytpKQotCQlpZiAoc3lzbWVtLmJhbmtbaV0uc3RhcnQgPD0gc3RhcnQpCi0JCQlpdCA9IHN5c21lbS5iYW5rICsgaTsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JcmV0dXJuIGl0OwotfQotCi0vKgotICogTW92ZSBhbGwgbWVtb3J5IGJhbmtzIHN0YXJ0aW5nIGF0ICdmcm9tJyB0byBhIG5ldyBwbGFjZSBhdCAndG8nLAotICogYWRqdXN0IG5yX2JhbmtzIGFjY29yZGluZ2x5LgotICogQm90aCAnZnJvbScgYW5kICd0bycgbXVzdCBiZSBpbnNpZGUgdGhlIHN5c21lbS5iYW5rLgotICoKLSAqIFJldHVybnM6IDAgKHN1Y2Nlc3MpLCAtRU5PTUVNIChub3QgZW5vdWdoIHNwYWNlIGluIHRoZSBzeXNtZW0uYmFuaykuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IG1vdmVfYmFua3Moc3RydWN0IG1lbWluZm8gKnRvLCBzdHJ1Y3QgbWVtaW5mbyAqZnJvbSkKLXsKLQl1bnNpZ25lZCBuID0gc3lzbWVtLm5yX2JhbmtzIC0gKGZyb20gLSBzeXNtZW0uYmFuayk7Ci0KLQlpZiAodG8gPiBmcm9tICYmIHRvIC0gZnJvbSArIHN5c21lbS5ucl9iYW5rcyA+IFNZU01FTV9CQU5LU19NQVgpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmICh0byAhPSBmcm9tKQotCQltZW1tb3ZlKHRvLCBmcm9tLCBuICogc2l6ZW9mKHN0cnVjdCBtZW1pbmZvKSk7Ci0Jc3lzbWVtLm5yX2JhbmtzICs9IHRvIC0gZnJvbTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEFkZCBuZXcgYmFuayB0byBzeXNtZW0uIFJlc3VsdGluZyBzeXNtZW0gaXMgdGhlIHVuaW9uIG9mIGJ5dGVzIG9mIHRoZQotICogb3JpZ2luYWwgc3lzbWVtIGFuZCB0aGUgbmV3IGJhbmsuCi0gKgotICogUmV0dXJuczogMCAoc3VjY2VzcyksIDwgMCAoZXJyb3IpCi0gKi8KLWludCBfX2luaXQgYWRkX3N5c21lbV9iYW5rKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQotewotCXVuc2lnbmVkIGk7Ci0Jc3RydWN0IG1lbWluZm8gKml0ID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIHN6OwotCXVuc2lnbmVkIGxvbmcgYmFua19zeiA9IDA7Ci0KLQlpZiAoc3RhcnQgPT0gZW5kIHx8Ci0JICAgIChzdGFydCA8IGVuZCkgIT0gKFBBR0VfQUxJR04oc3RhcnQpIDwgKGVuZCAmIFBBR0VfTUFTSykpKSB7Ci0JCXByX3dhcm4oIklnbm9yaW5nIHNtYWxsIG1lbW9yeSBiYW5rIDB4JTA4bHggc2l6ZTogJWxkIGJ5dGVzXG4iLAotCQkJc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3RhcnQgPSBQQUdFX0FMSUdOKHN0YXJ0KTsKLQllbmQgJj0gUEFHRV9NQVNLOwotCXN6ID0gZW5kIC0gc3RhcnQ7Ci0KLQlpdCA9IGZpbmRfYmFuayhzdGFydCk7Ci0KLQlpZiAoaXQpCi0JCWJhbmtfc3ogPSBpdC0+ZW5kIC0gaXQtPnN0YXJ0OwotCi0JaWYgKGl0ICYmIGJhbmtfc3ogPj0gc3RhcnQgLSBpdC0+c3RhcnQpIHsKLQkJaWYgKGVuZCAtIGl0LT5zdGFydCA+IGJhbmtfc3opCi0JCQlpdC0+ZW5kID0gZW5kOwotCQllbHNlCi0JCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlpZiAoIWl0KQotCQkJaXQgPSBzeXNtZW0uYmFuazsKLQkJZWxzZQotCQkJKytpdDsKLQotCQlpZiAoaXQgLSBzeXNtZW0uYmFuayA8IHN5c21lbS5ucl9iYW5rcyAmJgotCQkgICAgaXQtPnN0YXJ0IC0gc3RhcnQgPD0gc3opIHsKLQkJCWl0LT5zdGFydCA9IHN0YXJ0OwotCQkJaWYgKGl0LT5lbmQgLSBpdC0+c3RhcnQgPCBzeikKLQkJCQlpdC0+ZW5kID0gZW5kOwotCQkJZWxzZQotCQkJCXJldHVybiAwOwotCQl9IGVsc2UgewotCQkJaWYgKG1vdmVfYmFua3MoaXQgKyAxLCBpdCkgPCAwKSB7Ci0JCQkJcHJfd2FybigiSWdub3JpbmcgbWVtb3J5IGJhbmsgMHglMDhseCBzaXplICVsZCBieXRlc1xuIiwKLQkJCQkJc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCWl0LT5zdGFydCA9IHN0YXJ0OwotCQkJaXQtPmVuZCA9IGVuZDsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCXN6ID0gaXQtPmVuZCAtIGl0LT5zdGFydDsKLQlmb3IgKGkgPSBpdCArIDEgLSBzeXNtZW0uYmFuazsgaSA8IHN5c21lbS5ucl9iYW5rczsgKytpKQotCQlpZiAoc3lzbWVtLmJhbmtbaV0uc3RhcnQgLSBpdC0+c3RhcnQgPD0gc3opIHsKLQkJCWlmIChzeiA8IHN5c21lbS5iYW5rW2ldLmVuZCAtIGl0LT5zdGFydCkKLQkJCQlpdC0+ZW5kID0gc3lzbWVtLmJhbmtbaV0uZW5kOwotCQl9IGVsc2UgewotCQkJYnJlYWs7Ci0JCX0KLQotCW1vdmVfYmFua3MoaXQgKyAxLCBzeXNtZW0uYmFuayArIGkpOwotCXJldHVybiAwOwotfQotCi0vKgotICogbWVtX3Jlc2VydmUoc3RhcnQsIGVuZCwgbXVzdF9leGlzdCkKLSAqCi0gKiBSZXNlcnZlIHNvbWUgbWVtb3J5IGZyb20gdGhlIG1lbW9yeSBwb29sLgotICogSWYgbXVzdF9leGlzdCBpcyBzZXQgYW5kIGEgcGFydCBvZiB0aGUgcmVnaW9uIGJlaW5nIHJlc2VydmVkIGRvZXMgbm90IGV4aXN0Ci0gKiBtZW1vcnkgbWFwIGlzIG5vdCBhbHRlcmVkLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiAgc3RhcnQJU3RhcnQgb2YgcmVnaW9uLAotICogIGVuZAkJRW5kIG9mIHJlZ2lvbiwKLSAqICBtdXN0X2V4aXN0CU11c3QgZXhpc3QgaW4gbWVtb3J5IHBvb2wuCi0gKgotICogUmV0dXJuczoKLSAqICAwIChzdWNjZXNzKQotICogIDwgMCAoZXJyb3IpCi0gKi8KLQotaW50IF9faW5pdCBtZW1fcmVzZXJ2ZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgaW50IG11c3RfZXhpc3QpCi17Ci0Jc3RydWN0IG1lbWluZm8gKml0OwotCXN0cnVjdCBtZW1pbmZvICpybSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBzejsKLQl1bnNpZ25lZCBsb25nIGJhbmtfc3ogPSAwOwotCi0Jc3RhcnQgPSBzdGFydCAmIFBBR0VfTUFTSzsKLQllbmQgPSBQQUdFX0FMSUdOKGVuZCk7Ci0Jc3ogPSBlbmQgLSBzdGFydDsKLQlpZiAoIXN6KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWl0ID0gZmluZF9iYW5rKHN0YXJ0KTsKLQotCWlmIChpdCkKLQkJYmFua19zeiA9IGl0LT5lbmQgLSBpdC0+c3RhcnQ7Ci0KLQlpZiAoKCFpdCB8fCBlbmQgLSBpdC0+c3RhcnQgPiBiYW5rX3N6KSAmJiBtdXN0X2V4aXN0KSB7Ci0JCXByX3dhcm4oIm1lbV9yZXNlcnZlOiBbMHglMGx4LCAweCUwbHgpIG5vdCBpbiBhbnkgcmVnaW9uIVxuIiwKLQkJCXN0YXJ0LCBlbmQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoaXQgJiYgc3RhcnQgLSBpdC0+c3RhcnQgPD0gYmFua19zeikgewotCQlpZiAoc3RhcnQgPT0gaXQtPnN0YXJ0KSB7Ci0JCQlpZiAoZW5kIC0gaXQtPnN0YXJ0IDwgYmFua19zeikgewotCQkJCWl0LT5zdGFydCA9IGVuZDsKLQkJCQlyZXR1cm4gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcm0gPSBpdDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWl0LT5lbmQgPSBzdGFydDsKLQkJCWlmIChlbmQgLSBpdC0+c3RhcnQgPCBiYW5rX3N6KQotCQkJCXJldHVybiBhZGRfc3lzbWVtX2JhbmsoZW5kLAotCQkJCQkJICAgICAgIGl0LT5zdGFydCArIGJhbmtfc3opOwotCQkJKytpdDsKLQkJfQotCX0KLQotCWlmICghaXQpCi0JCWl0ID0gc3lzbWVtLmJhbms7Ci0KLQlmb3IgKDsgaXQgPCBzeXNtZW0uYmFuayArIHN5c21lbS5ucl9iYW5rczsgKytpdCkgewotCQlpZiAoaXQtPmVuZCAtIHN0YXJ0IDw9IHN6KSB7Ci0JCQlpZiAoIXJtKQotCQkJCXJtID0gaXQ7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoaXQtPnN0YXJ0IC0gc3RhcnQgPCBzeikKLQkJCQlpdC0+c3RhcnQgPSBlbmQ7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChybSkKLQkJbW92ZV9iYW5rcyhybSwgaXQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQogLyoKICAqIEluaXRpYWxpemUgdGhlIGJvb3RtZW0gc3lzdGVtIGFuZCBnaXZlIGl0IGFsbCBsb3cgbWVtb3J5IHdlIGhhdmUgYXZhaWxhYmxlLgogICovCiAKIHZvaWQgX19pbml0IGJvb3RtZW1faW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgcGZuOwotCXVuc2lnbmVkIGxvbmcgYm9vdG1hcF9zdGFydCwgYm9vdG1hcF9zaXplOwotCWludCBpOwotCi0JLyogUmVzZXJ2ZSBhbGwgbWVtb3J5IGJlbG93IFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NUQVJULCBhcyBtZW1vcnkKKwkvKiBSZXNlcnZlIGFsbCBtZW1vcnkgYmVsb3cgUEhZU19PRkZTRVQsIGFzIG1lbW9yeQogCSAqIGFjY291bnRpbmcgZG9lc24ndCB3b3JrIGZvciBwYWdlcyBiZWxvdyB0aGF0IGFkZHJlc3MuCiAJICoKLQkgKiBJZiBQTEFURk9STV9ERUZBVUxUX01FTV9TVEFSVCBpcyB6ZXJvIHJlc2VydmUgcGFnZSBhdCBhZGRyZXNzIDA6CisJICogSWYgUEhZU19PRkZTRVQgaXMgemVybyByZXNlcnZlIHBhZ2UgYXQgYWRkcmVzcyAwOgogCSAqIHN1Y2Nlc3NmdWxsIGFsbG9jYXRpb25zIHNob3VsZCBuZXZlciByZXR1cm4gTlVMTC4KIAkgKi8KLQlpZiAoUExBVEZPUk1fREVGQVVMVF9NRU1fU1RBUlQpCi0JCW1lbV9yZXNlcnZlKDAsIFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NUQVJULCAwKTsKKwlpZiAoUEhZU19PRkZTRVQpCisJCW1lbWJsb2NrX3Jlc2VydmUoMCwgUEhZU19PRkZTRVQpOwogCWVsc2UKLQkJbWVtX3Jlc2VydmUoMCwgMSwgMCk7CisJCW1lbWJsb2NrX3Jlc2VydmUoMCwgMSk7CiAKLQlzeXNtZW1fZHVtcCgpOwotCW1heF9sb3dfcGZuID0gbWF4X3BmbiA9IDA7Ci0JbWluX2xvd19wZm4gPSB+MDsKKwllYXJseV9pbml0X2ZkdF9zY2FuX3Jlc2VydmVkX21lbSgpOwogCi0JZm9yIChpPTA7IGkgPCBzeXNtZW0ubnJfYmFua3M7IGkrKykgewotCQlwZm4gPSBQQUdFX0FMSUdOKHN5c21lbS5iYW5rW2ldLnN0YXJ0KSA+PiBQQUdFX1NISUZUOwotCQlpZiAocGZuIDwgbWluX2xvd19wZm4pCi0JCQltaW5fbG93X3BmbiA9IHBmbjsKLQkJcGZuID0gUEFHRV9BTElHTihzeXNtZW0uYmFua1tpXS5lbmQgLSAxKSA+PiBQQUdFX1NISUZUOwotCQlpZiAocGZuID4gbWF4X3BmbikKLQkJCW1heF9wZm4gPSBwZm47Ci0JfQotCi0JaWYgKG1pbl9sb3dfcGZuID4gbWF4X3BmbikKKwlpZiAoIW1lbWJsb2NrX3BoeXNfbWVtX3NpemUoKSkKIAkJcGFuaWMoIk5vIG1lbW9yeSBmb3VuZCFcbiIpOwogCi0JbWF4X2xvd19wZm4gPSBtYXhfcGZuIDwgTUFYX01FTV9QRk4gPj4gUEFHRV9TSElGVCA/Ci0JCW1heF9wZm4gOiBNQVhfTUVNX1BGTiA+PiBQQUdFX1NISUZUOworCW1pbl9sb3dfcGZuID0gUEZOX1VQKG1lbWJsb2NrX3N0YXJ0X29mX0RSQU0oKSk7CisJbWluX2xvd19wZm4gPSBtYXgobWluX2xvd19wZm4sIFBGTl9VUChQSFlTX09GRlNFVCkpOworCW1heF9wZm4gPSBQRk5fRE9XTihtZW1ibG9ja19lbmRfb2ZfRFJBTSgpKTsKKwltYXhfbG93X3BmbiA9IG1pbihtYXhfcGZuLCBNQVhfTE9XX1BGTik7CiAKLQkvKiBGaW5kIGFuIGFyZWEgdG8gdXNlIGZvciB0aGUgYm9vdG1lbSBiaXRtYXAuICovCisJbWVtYmxvY2tfc2V0X2N1cnJlbnRfbGltaXQoUEZOX1BIWVMobWF4X2xvd19wZm4pKTsKIAotCWJvb3RtYXBfc2l6ZSA9IGJvb3RtZW1fYm9vdG1hcF9wYWdlcyhtYXhfbG93X3BmbiAtIG1pbl9sb3dfcGZuKTsKLQlib290bWFwX3NpemUgPDw9IFBBR0VfU0hJRlQ7Ci0JYm9vdG1hcF9zdGFydCA9IH4wOwotCi0JZm9yIChpPTA7IGk8c3lzbWVtLm5yX2JhbmtzOyBpKyspCi0JCWlmIChzeXNtZW0uYmFua1tpXS5lbmQgLSBzeXNtZW0uYmFua1tpXS5zdGFydCA+PSBib290bWFwX3NpemUpIHsKLQkJCWJvb3RtYXBfc3RhcnQgPSBzeXNtZW0uYmFua1tpXS5zdGFydDsKLQkJCWJyZWFrOwotCQl9Ci0KLQlpZiAoYm9vdG1hcF9zdGFydCA9PSB+MFVMKQotCQlwYW5pYygiQ2Fubm90IGZpbmQgJWxkIGJ5dGVzIGZvciBib290bWFwXG4iLCBib290bWFwX3NpemUpOwotCi0JLyogUmVzZXJ2ZSB0aGUgYm9vdG1lbSBiaXRtYXAgYXJlYSAqLwotCi0JbWVtX3Jlc2VydmUoYm9vdG1hcF9zdGFydCwgYm9vdG1hcF9zdGFydCArIGJvb3RtYXBfc2l6ZSwgMSk7Ci0JYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLAotCQkJCQkgYm9vdG1hcF9zdGFydCA+PiBQQUdFX1NISUZULAotCQkJCQkgbWluX2xvd19wZm4sCi0JCQkJCSBtYXhfbG93X3Bmbik7Ci0KLQkvKiBBZGQgYWxsIHJlbWFpbmluZyBtZW1vcnkgcGllY2VzIGludG8gdGhlIGJvb3RtZW0gbWFwICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgc3lzbWVtLm5yX2JhbmtzOyBpKyspIHsKLQkJaWYgKHN5c21lbS5iYW5rW2ldLnN0YXJ0ID4+IFBBR0VfU0hJRlQgPCBtYXhfbG93X3BmbikgewotCQkJdW5zaWduZWQgbG9uZyBlbmQgPSBtaW4obWF4X2xvd19wZm4gPDwgUEFHRV9TSElGVCwKLQkJCQkJCXN5c21lbS5iYW5rW2ldLmVuZCk7Ci0JCQlmcmVlX2Jvb3RtZW0oc3lzbWVtLmJhbmtbaV0uc3RhcnQsCi0JCQkJICAgICBlbmQgLSBzeXNtZW0uYmFua1tpXS5zdGFydCk7Ci0JCX0KLQl9Ci0KKwltZW1ibG9ja19kdW1wX2FsbCgpOwogfQogCiAKQEAgLTM0NCw3ICsxMDMsNyBAQAogCQkiICAgIGZpeG1hcCAgOiAweCUwOGx4IC0gMHglMDhseCAgKCU1bHUga0IpXG4iCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTU1VCi0JCSIgICAgdm1hbGxvYyA6IDB4JTA4eCAtIDB4JTA4eCAgKCU1dSBNQilcbiIKKwkJIiAgICB2bWFsbG9jIDogMHglMDhseCAtIDB4JTA4bHggICglNWx1IE1CKVxuIgogI2VuZGlmCiAJCSIgICAgbG93bWVtICA6IDB4JTA4bHggLSAweCUwOGx4ICAoJTVsdSBNQilcbiIsCiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KQEAgLTM5NSwxNiArMTU0LDE2IEBACiAJc3dpdGNoICgqcCkgewogCWNhc2UgJ0AnOgogCQlzdGFydF9hdCA9IG1lbXBhcnNlKHAgKyAxLCAmcCk7Ci0JCWFkZF9zeXNtZW1fYmFuayhzdGFydF9hdCwgc3RhcnRfYXQgKyBtZW1fc2l6ZSk7CisJCW1lbWJsb2NrX2FkZChzdGFydF9hdCwgbWVtX3NpemUpOwogCQlicmVhazsKIAogCWNhc2UgJyQnOgogCQlzdGFydF9hdCA9IG1lbXBhcnNlKHAgKyAxLCAmcCk7Ci0JCW1lbV9yZXNlcnZlKHN0YXJ0X2F0LCBzdGFydF9hdCArIG1lbV9zaXplLCAwKTsKKwkJbWVtYmxvY2tfcmVzZXJ2ZShzdGFydF9hdCwgbWVtX3NpemUpOwogCQlicmVhazsKIAogCWNhc2UgMDoKLQkJbWVtX3Jlc2VydmUobWVtX3NpemUsIDAsIDApOworCQltZW1ibG9ja19yZXNlcnZlKG1lbV9zaXplLCAtbWVtX3NpemUpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL2luY2x1ZGUvcGxhdGZvcm0vc2ltY2FsbC5oIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9pbmNsdWRlL3BsYXRmb3JtL3NpbWNhbGwuaAppbmRleCAxMmIxNWFkLi4yN2Q3YTUyIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL2luY2x1ZGUvcGxhdGZvcm0vc2ltY2FsbC5oCisrKyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvaW5jbHVkZS9wbGF0Zm9ybS9zaW1jYWxsLmgKQEAgLTc2LDYgKzc2LDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgc2ltY19leGl0KGludCBleGl0X2NvZGUpCit7CisJcmV0dXJuIF9fc2ltYyhTWVNfZXhpdCwgZXhpdF9jb2RlLCAwLCAwKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgc2ltY19vcGVuKGNvbnN0IGNoYXIgKmZpbGUsIGludCBmbGFncywgaW50IG1vZGUpCiB7CiAJcmV0dXJuIF9fc2ltYyhTWVNfb3BlbiwgKGludCkgZmlsZSwgZmxhZ3MsIG1vZGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9zZXR1cC5jIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9zZXR1cC5jCmluZGV4IDM5MTgyMDUuLjM3OWFlZGQgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3Mvc2V0dXAuYworKysgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL3NldHVwLmMKQEAgLTMyLDYgKzMyLDggQEAKICNpbmNsdWRlIDxhc20vcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxhc20vYm9vdHBhcmFtLmg+CiAKKyNpbmNsdWRlIDxwbGF0Zm9ybS9zaW1jYWxsLmg+CisKIAogdm9pZCBfX2luaXQgcGxhdGZvcm1faW5pdChicF90YWdfdCogYm9vdHBhcmFtKQogewpAQCAtNDEsMzcgKzQzLDE5IEBACiB2b2lkIHBsYXRmb3JtX2hhbHQodm9pZCkKIHsKIAlwcl9pbmZvKCIgKiogQ2FsbGVkIHBsYXRmb3JtX2hhbHQoKSAqKlxuIik7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmkgYTIsIDFcbnNpbWNhbGxcbiIpOworCXNpbWNfZXhpdCgwKTsKIH0KIAogdm9pZCBwbGF0Zm9ybV9wb3dlcl9vZmYodm9pZCkKIHsKIAlwcl9pbmZvKCIgKiogQ2FsbGVkIHBsYXRmb3JtX3Bvd2VyX29mZigpICoqXG4iKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92aSBhMiwgMVxuc2ltY2FsbFxuIik7CisJc2ltY19leGl0KDApOwogfQogdm9pZCBwbGF0Zm9ybV9yZXN0YXJ0KHZvaWQpCiB7CiAJLyogRmx1c2ggYW5kIHJlc2V0IHRoZSBtbXUsIHNpbXVsYXRlIGEgcHJvY2Vzc29yIHJlc2V0LCBhbmQKIAkgKiBqdW1wIHRvIHRoZSByZXNldCB2ZWN0b3IuICovCi0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92aQlhMiwgMTVcblx0IgotCQkJICAgICAid3NyCWEyLCBpY291bnRsZXZlbFxuXHQiCi0JCQkgICAgICJtb3ZpCWEyLCAwXG5cdCIKLQkJCSAgICAgIndzcglhMiwgaWNvdW50XG5cdCIKLSNpZiBYQ0hBTF9OVU1fSUJSRUFLID4gMAotCQkJICAgICAid3NyCWEyLCBpYnJlYWtlbmFibGVcblx0IgotI2VuZGlmCi0jaWYgWENIQUxfSEFWRV9MT09QUwotCQkJICAgICAid3NyCWEyLCBsY291bnRcblx0IgotI2VuZGlmCi0JCQkgICAgICJtb3ZpCWEyLCAweDFmXG5cdCIKLQkJCSAgICAgIndzcglhMiwgcHNcblx0IgotCQkJICAgICAiaXN5bmNcblx0IgotCQkJICAgICAiangJJTBcblx0IgotCQkJICAgICA6Ci0JCQkgICAgIDogImEiIChYQ0hBTF9SRVNFVF9WRUNUT1JfVkFERFIpCi0JCQkgICAgIDogImEyIik7Ci0KKwljcHVfcmVzZXQoKTsKIAkvKiBjb250cm9sIG5ldmVyIGdldHMgaGVyZSAqLwogfQogCkBAIC05OCw3ICs4Miw3IEBACiBzdGF0aWMgaW50CiBpc3NfcGFuaWNfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCiB7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmkgYTIsIC0xOyBzaW1jYWxsXG4iKTsKKwlzaW1jX2V4aXQoMSk7CiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL3NpbWRpc2suYyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3Mvc2ltZGlzay5jCmluZGV4IGY1OGE0ZTYuLmVkZTA0Y2MgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3Mvc2ltZGlzay5jCisrKyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3Mvc2ltZGlzay5jCkBAIC04Niw2ICs4Niw3IEBACiAJCXVuc2lnbmVkIGxvbmcgaW87CiAKIAkJc2ltY19sc2VlayhkZXYtPmZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKKwkJUkVBRF9PTkNFKCpidWZmZXIpOwogCQlpZiAod3JpdGUpCiAJCQlpbyA9IHNpbWNfd3JpdGUoZGV2LT5mZCwgYnVmZmVyLCBuYnl0ZXMpOwogCQllbHNlCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHQyMDAwL3NldHVwLmMgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHQyMDAwL3NldHVwLmMKaW5kZXggNDkwNGM1Yy4uOWMyZjFmYiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0MjAwMC9zZXR1cC5jCisrKyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dDIwMDAvc2V0dXAuYwpAQCAtNjQsMjYgKzY0LDcgQEAKIHsKIAkvKiBGbHVzaCBhbmQgcmVzZXQgdGhlIG1tdSwgc2ltdWxhdGUgYSBwcm9jZXNzb3IgcmVzZXQsIGFuZAogCSAqIGp1bXAgdG8gdGhlIHJlc2V0IHZlY3Rvci4gKi8KLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92aQlhMiwgMTVcblx0IgotCQkJICAgICAgIndzcglhMiwgaWNvdW50bGV2ZWxcblx0IgotCQkJICAgICAgIm1vdmkJYTIsIDBcblx0IgotCQkJICAgICAgIndzcglhMiwgaWNvdW50XG5cdCIKLSNpZiBYQ0hBTF9OVU1fSUJSRUFLID4gMAotCQkJICAgICAgIndzcglhMiwgaWJyZWFrZW5hYmxlXG5cdCIKLSNlbmRpZgotI2lmIFhDSEFMX0hBVkVfTE9PUFMKLQkJCSAgICAgICJ3c3IJYTIsIGxjb3VudFxuXHQiCi0jZW5kaWYKLQkJCSAgICAgICJtb3ZpCWEyLCAweDFmXG5cdCIKLQkJCSAgICAgICJ3c3IJYTIsIHBzXG5cdCIKLQkJCSAgICAgICJpc3luY1xuXHQiCi0JCQkgICAgICAiangJJTBcblx0IgotCQkJICAgICAgOgotCQkJICAgICAgOiAiYSIgKFhDSEFMX1JFU0VUX1ZFQ1RPUl9WQUREUikKLQkJCSAgICAgIDogImEyIgotCQkJICAgICAgKTsKLQorCWNwdV9yZXNldCgpOwogCS8qIGNvbnRyb2wgbmV2ZXIgZ2V0cyBoZXJlICovCiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dGZwZ2Evc2V0dXAuYyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dGZwZ2Evc2V0dXAuYwppbmRleCBiNTA5ZDFmLi43NzliZTcyIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHRmcGdhL3NldHVwLmMKKysrIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0ZnBnYS9zZXR1cC5jCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAKICNpbmNsdWRlIDxhc20vdGltZXguaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CkBAIC01NCwyNyArNTYsNyBAQAogewogCS8qIEZsdXNoIGFuZCByZXNldCB0aGUgbW11LCBzaW11bGF0ZSBhIHByb2Nlc3NvciByZXNldCwgYW5kCiAJICoganVtcCB0byB0aGUgcmVzZXQgdmVjdG9yLiAqLwotCi0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmkJYTIsIDE1XG5cdCIKLQkJCSAgICAgICJ3c3IJYTIsIGljb3VudGxldmVsXG5cdCIKLQkJCSAgICAgICJtb3ZpCWEyLCAwXG5cdCIKLQkJCSAgICAgICJ3c3IJYTIsIGljb3VudFxuXHQiCi0jaWYgWENIQUxfTlVNX0lCUkVBSyA+IDAKLQkJCSAgICAgICJ3c3IJYTIsIGlicmVha2VuYWJsZVxuXHQiCi0jZW5kaWYKLSNpZiBYQ0hBTF9IQVZFX0xPT1BTCi0JCQkgICAgICAid3NyCWEyLCBsY291bnRcblx0IgotI2VuZGlmCi0JCQkgICAgICAibW92aQlhMiwgMHgxZlxuXHQiCi0JCQkgICAgICAid3NyCWEyLCBwc1xuXHQiCi0JCQkgICAgICAiaXN5bmNcblx0IgotCQkJICAgICAgImp4CSUwXG5cdCIKLQkJCSAgICAgIDoKLQkJCSAgICAgIDogImEiIChYQ0hBTF9SRVNFVF9WRUNUT1JfVkFERFIpCi0JCQkgICAgICA6ICJhMiIKLQkJCSAgICAgICk7Ci0KKwljcHVfcmVzZXQoKTsKIAkvKiBjb250cm9sIG5ldmVyIGdldHMgaGVyZSAqLwogfQogCkBAIC04MiwzMCArNjQsNTUgQEAKIHsKIH0KIAorLyogZWFybHkgaW5pdGlhbGl6YXRpb24gKi8KKwordm9pZCBfX2luaXQgcGxhdGZvcm1faW5pdChicF90YWdfdCAqZmlyc3QpCit7Cit9CisKKy8qIEhlYXJ0YmVhdC4gKi8KKwordm9pZCBwbGF0Zm9ybV9oZWFydGJlYXQodm9pZCkKK3sKK30KKworI2lmZGVmIENPTkZJR19YVEVOU0FfQ0FMSUJSQVRFX0NDT1VOVAorCit2b2lkIF9faW5pdCBwbGF0Zm9ybV9jYWxpYnJhdGVfY2NvdW50KHZvaWQpCit7CisJY2NvdW50X2ZyZXEgPSAqKGxvbmcgKilYVEZQR0FfQ0xLRlJRX1ZBRERSOworfQorCisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19PRgogCi1zdGF0aWMgdm9pZCBfX2luaXQgdXBkYXRlX2Nsb2NrX2ZyZXF1ZW5jeShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCitzdGF0aWMgdm9pZCBfX2luaXQgeHRmcGdhX2Nsa19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBwcm9wZXJ0eSAqbmV3ZnJlcTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBvZl9pb21hcChucCwgMCk7CisJc3RydWN0IGNsayAqY2xrOwogCXUzMiBmcmVxOwogCi0JaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAiY2xvY2stZnJlcXVlbmN5IiwgJmZyZXEpICYmIGZyZXEgIT0gMCkKLQkJcmV0dXJuOwotCi0JbmV3ZnJlcSA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdmcmVxKSArIHNpemVvZih1MzIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5ld2ZyZXEpCi0JCXJldHVybjsKLQluZXdmcmVxLT52YWx1ZSA9IG5ld2ZyZXEgKyAxOwotCW5ld2ZyZXEtPmxlbmd0aCA9IHNpemVvZihmcmVxKTsKLQluZXdmcmVxLT5uYW1lID0ga3N0cmR1cCgiY2xvY2stZnJlcXVlbmN5IiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXdmcmVxLT5uYW1lKSB7Ci0JCWtmcmVlKG5ld2ZyZXEpOworCWlmICghYmFzZSkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGFkZHJlc3NcbiIsIG5wLT5uYW1lKTsKIAkJcmV0dXJuOwogCX0KIAotCSoodTMyICopbmV3ZnJlcS0+dmFsdWUgPSBjcHVfdG9fYmUzMigqKHUzMiAqKVhURlBHQV9DTEtGUlFfVkFERFIpOwotCW9mX3VwZGF0ZV9wcm9wZXJ0eShub2RlLCBuZXdmcmVxKTsKKwlmcmVxID0gX19yYXdfcmVhZGwoYmFzZSk7CisJaW91bm1hcChiYXNlKTsKKwljbGsgPSBjbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCBucC0+bmFtZSwgTlVMTCwgMCwgZnJlcSk7CisKKwlpZiAoSVNfRVJSKGNsaykpIHsKKwkJcHJfZXJyKCIlczogY2xrIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIsIG5wLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsaykpIHsKKwkJcHJfZXJyKCIlczogY2xrIHByb3ZpZGVyIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIsIG5wLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KIH0KK0NMS19PRl9ERUNMQVJFKHh0ZnBnYV9jbGssICJjZG5zLHh0ZnBnYS1jbG9jayIsIHh0ZnBnYV9jbGtfc2V0dXApOwogCiAjZGVmaW5lIE1BQ19MRU4gNgogc3RhdGljIHZvaWQgX19pbml0IHVwZGF0ZV9sb2NhbF9tYWMoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQpAQCAtMTM3LDU2ICsxNDQsMTUgQEAKIAogc3RhdGljIGludCBfX2luaXQgbWFjaGluZV9zZXR1cCh2b2lkKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2xvY2s7CiAJc3RydWN0IGRldmljZV9ub2RlICpldGggPSBOVUxMOwogCi0JZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGNsb2NrLCAibWFpbi1vc2NpbGxhdG9yIikKLQkJdXBkYXRlX2Nsb2NrX2ZyZXF1ZW5jeShjbG9jayk7Ci0KIAlpZiAoKGV0aCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKGV0aCwgTlVMTCwgIm9wZW5jb3JlcyxldGhvYyIpKSkKIAkJdXBkYXRlX2xvY2FsX21hYyhldGgpOwogCXJldHVybiAwOwogfQogYXJjaF9pbml0Y2FsbChtYWNoaW5lX3NldHVwKTsKIAotI2VuZGlmCi0KLS8qIGVhcmx5IGluaXRpYWxpemF0aW9uICovCi0KLXZvaWQgX19pbml0IHBsYXRmb3JtX2luaXQoYnBfdGFnX3QgKmZpcnN0KQotewotfQotCi0vKiBIZWFydGJlYXQuICovCi0KLXZvaWQgcGxhdGZvcm1faGVhcnRiZWF0KHZvaWQpCi17Ci19Ci0KLSNpZmRlZiBDT05GSUdfWFRFTlNBX0NBTElCUkFURV9DQ09VTlQKLQotdm9pZCBfX2luaXQgcGxhdGZvcm1fY2FsaWJyYXRlX2Njb3VudCh2b2lkKQotewotCWxvbmcgY2xrX2ZyZXEgPSAwOwotI2lmZGVmIENPTkZJR19PRgotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1ID0KLQkJb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImNkbnMseHRlbnNhLWNwdSIpOwotCWlmIChjcHUpIHsKLQkJdTMyIGZyZXE7Ci0JCXVwZGF0ZV9jbG9ja19mcmVxdWVuY3koY3B1KTsKLQkJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihjcHUsICJjbG9jay1mcmVxdWVuY3kiLCAmZnJlcSkpCi0JCQljbGtfZnJlcSA9IGZyZXE7Ci0JfQotI2VuZGlmCi0JaWYgKCFjbGtfZnJlcSkKLQkJY2xrX2ZyZXEgPSAqKGxvbmcgKilYVEZQR0FfQ0xLRlJRX1ZBRERSOwotCi0JY2NvdW50X2ZyZXEgPSBjbGtfZnJlcTsKLX0KLQotI2VuZGlmCi0KLSNpZm5kZWYgQ09ORklHX09GCisjZWxzZQogCiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9pZi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvdmFyaWFudHMvY3NwL2luY2x1ZGUvdmFyaWFudC9jb3JlLmggYi9hcmNoL3h0ZW5zYS92YXJpYW50cy9jc3AvaW5jbHVkZS92YXJpYW50L2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Q4MWYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvdmFyaWFudHMvY3NwL2luY2x1ZGUvdmFyaWFudC9jb3JlLmgKQEAgLTAsMCArMSw1NzUgQEAKKy8qIAorICogeHRlbnNhL2NvbmZpZy9jb3JlLWlzYS5oIC0tIEhBTCBkZWZpbml0aW9ucyB0aGF0IGFyZSBkZXBlbmRlbnQgb24gWHRlbnNhCisgKgkJCQlwcm9jZXNzb3IgQ09SRSBjb25maWd1cmF0aW9uCisgKgorICogIFNlZSA8eHRlbnNhL2NvbmZpZy9jb3JlLmg+LCB3aGljaCBpbmNsdWRlcyB0aGlzIGZpbGUsIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyogWHRlbnNhIHByb2Nlc3NvciBjb3JlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisKKyAgIENvcHlyaWdodCAoYykgMTk5OS0yMDE1IFRlbnNpbGljYSBJbmMuCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICAgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAgIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgICBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICovCisKKyNpZm5kZWYgX1hURU5TQV9DT1JFX0NPTkZJR1VSQVRJT05fSAorI2RlZmluZSBfWFRFTlNBX0NPUkVfQ09ORklHVVJBVElPTl9ICisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgICAgUGFyYW1ldGVycyBVc2VmdWwgZm9yIEFueSBDb2RlLCBVU0VSIG9yIFBSSVZJTEVHRUQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogIE5vdGU6ICBNYWNyb3Mgb2YgdGhlIGZvcm0gWENIQUxfSEFWRV8qKiogaGF2ZSBhIHZhbHVlIG9mIDEgaWYgdGhlIG9wdGlvbiBpcworICogIGNvbmZpZ3VyZWQsIGFuZCBhIHZhbHVlIG9mIDAgb3RoZXJ3aXNlLiAgVGhlc2UgbWFjcm9zIGFyZSBhbHdheXMgZGVmaW5lZC4KKyAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCUlTQQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBYQ0hBTF9IQVZFX0JFCQkJMAkvKiBiaWctZW5kaWFuIGJ5dGUgb3JkZXJpbmcgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9XSU5ET1dFRAkJMQkvKiB3aW5kb3dlZCByZWdpc3RlcnMgb3B0aW9uICovCisjZGVmaW5lIFhDSEFMX05VTV9BUkVHUwkJCTMyCS8qIG51bSBvZiBwaHlzaWNhbCBhZGRyIHJlZ3MgKi8KKyNkZWZpbmUgWENIQUxfTlVNX0FSRUdTX0xPRzIJCTUJLyogbG9nMihYQ0hBTF9OVU1fQVJFR1MpICovCisjZGVmaW5lIFhDSEFMX01BWF9JTlNUUlVDVElPTl9TSVpFCTgJLyogbWF4IGluc3RyIGJ5dGVzICgzLi44KSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0RFQlVHCQkxCS8qIGRlYnVnIG9wdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0RFTlNJVFkJCTEJLyogMTYtYml0IGluc3RydWN0aW9ucyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0xPT1BTCQkxCS8qIHplcm8tb3ZlcmhlYWQgbG9vcHMgKi8KKyNkZWZpbmUgWENIQUxfTE9PUF9CVUZGRVJfU0laRQkJMAkvKiB6ZXJvLW92LiBsb29wIGluc3RyIGJ1ZmZlciBzaXplICovCisjZGVmaW5lIFhDSEFMX0hBVkVfTlNBCQkJMQkvKiBOU0EvTlNBVSBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9NSU5NQVgJCTEJLyogTUlOL01BWCBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9TRVhUCQkJMQkvKiBTRVhUIGluc3RydWN0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfREVQQklUUwkJMAkvKiBERVBCSVRTIGluc3RydWN0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQ0xBTVBTCQkxCS8qIENMQU1QUyBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX01VTDE2CQkxCS8qIE1VTDE2Uy9NVUwxNlUgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFhDSEFMX0hBVkVfTVVMMzIJCTEJLyogTVVMTCBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX01VTDMyX0hJR0gJCTEJLyogTVVMVUgvTVVMU0ggaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFhDSEFMX0hBVkVfRElWMzIJCTEJLyogUVVPUy9RVU9VL1JFTVMvUkVNVSBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9MMzJSCQkJMQkvKiBMMzJSIGluc3RydWN0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQUJTT0xVVEVfTElURVJBTFMJMAkvKiBub24tUEMtcmVsIChleHRlbmRlZCkgTDMyUiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0NPTlNUMTYJCTAJLyogQ09OU1QxNiBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0FERFgJCQkxCS8qIEFERFgjL1NVQlgjIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1dJREVfQlJBTkNIRVMJMAkvKiBCKi5XMTggb3IgQiouVzE1IGluc3RyJ3MgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9QUkVESUNURURfQlJBTkNIRVMJMAkvKiBCW0VRL0VRWi9ORS9ORVpdVCBpbnN0cidzICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQ0FMTDRBTkQxMgkJMQkvKiAob2Jzb2xldGUgb3B0aW9uKSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0FCUwkJCTEJLyogQUJTIGluc3RydWN0aW9uICovCisvKiNkZWZpbmUgWENIQUxfSEFWRV9QT1BDCQkwKi8JLyogUE9QQyBpbnN0cnVjdGlvbiAqLworLyojZGVmaW5lIFhDSEFMX0hBVkVfQ1JDCQkwKi8JLyogQ1JDIGluc3RydWN0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfUkVMRUFTRV9TWU5DCQkxCS8qIEwzMkFJL1MzMlJJIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1MzMkMxSQkJMQkvKiBTMzJDMUkgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9TUEVDVUxBVElPTgkJMAkvKiBzcGVjdWxhdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0ZVTExfUkVTRVQJCTEJLyogYWxsIHJlZ3Mvc3RhdGUgcmVzZXQgKi8KKyNkZWZpbmUgWENIQUxfTlVNX0NPTlRFWFRTCQkxCS8qICovCisjZGVmaW5lIFhDSEFMX05VTV9NSVNDX1JFR1MJCTQJLyogbnVtIG9mIHNjcmF0Y2ggcmVncyAoMC4uNCkgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9UQVBfTUFTVEVSCQkwCS8qIEpUQUcgVEFQIGNvbnRyb2wgaW5zdHIncyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1BSSUQJCQkxCS8qIHByb2Nlc3NvciBJRCByZWdpc3RlciAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0VYVEVSTl9SRUdTCQkxCS8qIFdFUi9SRVIgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFhDSEFMX0hBVkVfTVgJCQkwCS8qIE1YIGNvcmUgKFRlbnNpbGljYSBpbnRlcm5hbCkgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9NUF9JTlRFUlJVUFRTCTAJLyogaW50ZXJydXB0IGRpc3RyaWJ1dG9yIHBvcnQgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9NUF9SVU5TVEFMTAkJMAkvKiBjb3JlIFJ1blN0YWxsIGNvbnRyb2wgcG9ydCAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1BTTwkJCTAJLyogUG93ZXIgU2h1dC1PZmYgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9QU09fQ0RNCQkwCS8qIGNvcmUvZGVidWcvbWVtIHB3ciBkb21haW5zICovCisjZGVmaW5lIFhDSEFMX0hBVkVfUFNPX0ZVTExfUkVURU5USU9OCTAJLyogYWxsIHJlZ3MgcHJlc2VydmVkIG9uIFBTTyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1RIUkVBRFBUUgkJMQkvKiBUSFJFQURQVFIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9CT09MRUFOUwkJMQkvKiBib29sZWFuIHJlZ2lzdGVycyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0NQCQkJMQkvKiBDUEVOQUJMRSByZWcgKGNvcHJvY2Vzc29yKSAqLworI2RlZmluZSBYQ0hBTF9DUF9NQVhDRkcJCQk4CS8qIG1heCBhbGxvd2VkIGNwIGlkIHBsdXMgb25lICovCisjZGVmaW5lIFhDSEFMX0hBVkVfTUFDMTYJCTEJLyogTUFDMTYgcGFja2FnZSAqLworCisjZGVmaW5lIFhDSEFMX0hBVkVfRlVTSU9OCQkgMAkvKiBGdXNpb24qLworI2RlZmluZSBYQ0hBTF9IQVZFX0ZVU0lPTl9GUAkgMAkgICAgICAgIC8qIEZ1c2lvbiBGUCBvcHRpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9GVVNJT05fTE9XX1BPV0VSIDAJLyogRnVzaW9uIExvdyBQb3dlciBvcHRpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9GVVNJT05fQUVTCSAwCSAgICAgICAgLyogRnVzaW9uIEJMRS9XaWZpIEFFUy0xMjggQ0NNIG9wdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0ZVU0lPTl9DT05WRU5DCSAwICAgICAgIC8qIEZ1c2lvbiBDb252IEVuY29kZSBvcHRpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9GVVNJT05fTEZTUl9DUkMJIDAJLyogRnVzaW9uIExGU1ItQ1JDIG9wdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0ZVU0lPTl9CSVRPUFMJIDAJLyogRnVzaW9uIEJpdCBPcGVyYXRpb25zIFN1cHBvcnQgb3B0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfRlVTSU9OX0FWUwkgMAkvKiBGdXNpb24gQVZTIG9wdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0ZVU0lPTl8xNkJJVF9CQVNFQkFORAkgMAkvKiBGdXNpb24gMTYtYml0IEJhc2ViYW5kIG9wdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0hJRklQUk8JCTAJLyogSGlGaVBybyBBdWRpbyBFbmdpbmUgcGtnICovCisjZGVmaW5lIFhDSEFMX0hBVkVfSElGSTQJCTAJLyogSGlGaTQgQXVkaW8gRW5naW5lIHBrZyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0hJRkk0X1ZGUFUJCTAJLyogSGlGaTQgQXVkaW8gRW5naW5lIFZGUFUgb3B0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfSElGSTMJCTAJLyogSGlGaTMgQXVkaW8gRW5naW5lIHBrZyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0hJRkkzX1ZGUFUJCTAJLyogSGlGaTMgQXVkaW8gRW5naW5lIFZGUFUgb3B0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfSElGSTIJCTAJLyogSGlGaTIgQXVkaW8gRW5naW5lIHBrZyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0hJRkkyRVAJCTAJLyogSGlGaTJFUCAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0hJRklfTUlOSQkJMAkKKworCisjZGVmaW5lIFhDSEFMX0hBVkVfVkVDVE9SRlBVMjAwNQkwCS8qIHZlY3RvciBvciB1c2VyIGZsb2F0aW5nLXBvaW50IHBrZyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1VTRVJfRFBGUFUgICAgICAgICAwICAgICAgIC8qIHVzZXIgRFAgZmxvYXRpbmctcG9pbnQgcGtnICovCisjZGVmaW5lIFhDSEFMX0hBVkVfVVNFUl9TUEZQVSAgICAgICAgIDAgICAgICAgLyogdXNlciBEUCBmbG9hdGluZy1wb2ludCBwa2cgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9GUCAgICAgICAgICAgICAgICAgMCAgICAgIC8qIHNpbmdsZSBwcmVjIGZsb2F0aW5nIHBvaW50ICovCisjZGVmaW5lIFhDSEFMX0hBVkVfRlBfRElWICAgICAgICAgICAgIDAgIC8qIEZQIHdpdGggRElWIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0ZQX1JFQ0lQICAgICAgICAgICAwICAgICAgICAvKiBGUCB3aXRoIFJFQ0lQIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0ZQX1NRUlQgICAgICAgICAgICAwIC8qIEZQIHdpdGggU1FSVCBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9GUF9SU1FSVCAgICAgICAgICAgMCAgICAgICAgLyogRlAgd2l0aCBSU1FSVCBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9ERlAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAvKiBkb3VibGUgcHJlY2lzaW9uIEZQIHBrZyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0RGUF9ESVYgICAgICAgICAgICAwIC8qIERGUCB3aXRoIERJViBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9ERlBfUkVDSVAgICAgICAgICAgMCAgICAgICAvKiBERlAgd2l0aCBSRUNJUCBpbnN0cnVjdGlvbnMqLworI2RlZmluZSBYQ0hBTF9IQVZFX0RGUF9TUVJUICAgICAgICAgICAwICAgICAgICAvKiBERlAgd2l0aCBTUVJUIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0RGUF9SU1FSVCAgICAgICAgICAwICAgICAgIC8qIERGUCB3aXRoIFJTUVJUIGluc3RydWN0aW9ucyovCisjZGVmaW5lIFhDSEFMX0hBVkVfREZQX0FDQ0VMCQkwCS8qIGRvdWJsZSBwcmVjaXNpb24gRlAgYWNjZWxlcmF0aW9uIHBrZyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0RGUF9hY2NlbAkJWENIQUxfSEFWRV9ERlBfQUNDRUwJCQkJLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKworI2RlZmluZSBYQ0hBTF9IQVZFX0RGUFVfU0lOR0xFX09OTFkgICAgMCAgICAgICAgICAgICAgICAgCS8qIERGUFUgQ29wcm9jZXNzb3IsIHNpbmdsZSBwcmVjaXNpb24gb25seSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0RGUFVfU0lOR0xFX0RPVUJMRSAgMCAgICAgICAgICAgICAgIAkvKiBERlBVIENvcHJvY2Vzc29yLCBzaW5nbGUgYW5kIGRvdWJsZSBwcmVjaXNpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9WRUNUUkExCQkwCS8qIFZlY3RyYSBJICBwa2cgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9WRUNUUkFMWAkJMAkvKiBWZWN0cmEgTFggcGtnICovCisjZGVmaW5lIFhDSEFMX0hBVkVfUERYNAkJICAgICAgICAwCS8qIFBEWDQgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9DT05OWEQyCQkwCS8qIENvbm5YIEQyIHBrZyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0NPTk5YRDJfRFVBTExTRkxJWCAgIDAJLyogQ29ublggRDIgJiBEdWFsIExvYWRTdG9yZSBGbGl4ICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQkJFMTYJCTAJLyogQ29ublggQkJFMTYgcGtnICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQkJFMTZfUlNRUlQJCTAJLyogQkJFMTYgJiB2ZWN0b3IgcmVjaXAgc3FydCAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0JCRTE2X1ZFQ0RJVgkJMAkvKiBCQkUxNiAmIHZlY3RvciBkaXZpZGUgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9CQkUxNl9ERVNQUkVBRAkwCS8qIEJCRTE2ICYgZGVzcHJlYWQgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9CQkVORVAJCTAJLyogQ29ublggQkJFTkVQIHBrZ3MgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9CU1AzCQkJMAkvKiBDb25uWCBCU1AzIHBrZyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0JTUDNfVFJBTlNQT1NFCTAJLyogQlNQMyAmIHRyYW5zcG9zZTMyeDMyICovCisjZGVmaW5lIFhDSEFMX0hBVkVfU1NQMTYJCTAJLyogQ29ublggU1NQMTYgcGtnICovCisjZGVmaW5lIFhDSEFMX0hBVkVfU1NQMTZfVklURVJCSQkwCS8qIFNTUDE2ICYgdml0ZXJiaSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1RVUkJPMTYJCTAJLyogQ29ublggVHVyYm8xNiBwa2cgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9CQlAxNgkJMAkvKiBDb25uWCBCQlAxNiBwa2cgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9GTElYMwkJMAkvKiBiYXNpYyAzLXdheSBGTElYIG9wdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0dSSVZQRVAgICAgICAgICAgICAgIDAgICAvKiAgR1JJVlBFUCBpcyBHZW5lcmFsIFJlbGVhc2Ugb2YgSVZQRVAgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9HUklWUEVQX0hJU1RPR1JBTSAgICAwICAgLyogSGlzdG9ncmFtIG9wdGlvbiBvbiBHUklWUEVQICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJTUlTQworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBYQ0hBTF9OVU1fTE9BRFNUT1JFX1VOSVRTCTEJLyogbG9hZC9zdG9yZSB1bml0cyAqLworI2RlZmluZSBYQ0hBTF9OVU1fV1JJVEVCVUZGRVJfRU5UUklFUwk4CS8qIHNpemUgb2Ygd3JpdGUgYnVmZmVyICovCisjZGVmaW5lIFhDSEFMX0lOU1RfRkVUQ0hfV0lEVEgJCTgJLyogaW5zdHItZmV0Y2ggd2lkdGggaW4gYnl0ZXMgKi8KKyNkZWZpbmUgWENIQUxfREFUQV9XSURUSAkJMTYJLyogZGF0YSB3aWR0aCBpbiBieXRlcyAqLworI2RlZmluZSBYQ0hBTF9EQVRBX1BJUEVfREVMQVkJCTEJLyogZC1zaWRlIHBpcGVsaW5lIGRlbGF5CisJCQkJCQkgICAoMSA9IDUtc3RhZ2UsIDIgPSA3LXN0YWdlKSAqLworI2RlZmluZSBYQ0hBTF9DTE9DS19HQVRJTkdfR0xPQkFMCTAJLyogZ2xvYmFsIGNsb2NrIGdhdGluZyAqLworI2RlZmluZSBYQ0hBTF9DTE9DS19HQVRJTkdfRlVOQ1VOSVQJMAkvKiBmdW5jdC4gdW5pdCBjbG9jayBnYXRpbmcgKi8KKy8qICBJbiBUMTA1MCwgYXBwbGllcyB0byBzZWxlY3RlZCBjb3JlIGxvYWQgYW5kIHN0b3JlIGluc3RydWN0aW9ucyAoc2VlIElTQSk6ICovCisjZGVmaW5lIFhDSEFMX1VOQUxJR05FRF9MT0FEX0VYQ0VQVElPTgkxCS8qIHVuYWxpZ25lZCBsb2FkcyBjYXVzZSBleGMuICovCisjZGVmaW5lIFhDSEFMX1VOQUxJR05FRF9TVE9SRV9FWENFUFRJT04JMQkvKiB1bmFsaWduZWQgc3RvcmVzIGNhdXNlIGV4Yy4qLworI2RlZmluZSBYQ0hBTF9VTkFMSUdORURfTE9BRF9IVwkJMAkvKiB1bmFsaWduZWQgbG9hZHMgd29yayBpbiBodyAqLworI2RlZmluZSBYQ0hBTF9VTkFMSUdORURfU1RPUkVfSFcJMAkvKiB1bmFsaWduZWQgc3RvcmVzIHdvcmsgaW4gaHcqLworCisjZGVmaW5lIFhDSEFMX1NXX1ZFUlNJT04JCTExMDAwMDIJLyogc3cgdmVyc2lvbiBvZiB0aGlzIGhlYWRlciAqLworCisjZGVmaW5lIFhDSEFMX0NPUkVfSUQJCQkieHRfbG54IgkvKiBhbHBoYW51bSBjb3JlIG5hbWUKKwkJCQkJCSAgIChDb3JlSUQpIHNldCBpbiB0aGUgWHRlbnNhCisJCQkJCQkgICBQcm9jZXNzb3IgR2VuZXJhdG9yICovCisKKyNkZWZpbmUgWENIQUxfQlVJTERfVU5JUVVFX0lECQkweDAwMDU3RDU0CS8qIDIyLWJpdCBzdyBidWlsZCBJRCAqLworCisvKgorICogIFRoZXNlIGRlZmluaXRpb25zIGRlc2NyaWJlIHRoZSBoYXJkd2FyZSB0YXJnZXRlZCBieSB0aGlzIHNvZnR3YXJlLgorICovCisjZGVmaW5lIFhDSEFMX0hXX0NPTkZJR0lEMAkJMHhDMUIzRkZGRQkvKiBDb25maWdJRCBoaSAzMiBiaXRzKi8KKyNkZWZpbmUgWENIQUxfSFdfQ09ORklHSUQxCQkweDFDODU3RDU0CS8qIENvbmZpZ0lEIGxvIDMyIGJpdHMqLworI2RlZmluZSBYQ0hBTF9IV19WRVJTSU9OX05BTUUJCSJMWDYuMC4yIgkvKiBmdWxsIHZlcnNpb24gbmFtZSAqLworI2RlZmluZSBYQ0hBTF9IV19WRVJTSU9OX01BSk9SCQkyNjAwCS8qIG1ham9yIHZlciMgb2YgdGFyZ2V0ZWQgaHcgKi8KKyNkZWZpbmUgWENIQUxfSFdfVkVSU0lPTl9NSU5PUgkJMgkvKiBtaW5vciB2ZXIjIG9mIHRhcmdldGVkIGh3ICovCisjZGVmaW5lIFhDSEFMX0hXX1ZFUlNJT04JCTI2MDAwMgkvKiBtYWpvcioxMDArbWlub3IgKi8KKyNkZWZpbmUgWENIQUxfSFdfUkVMX0xYNgkJMQorI2RlZmluZSBYQ0hBTF9IV19SRUxfTFg2XzAJCTEKKyNkZWZpbmUgWENIQUxfSFdfUkVMX0xYNl8wXzIJCTEKKyNkZWZpbmUgWENIQUxfSFdfQ09ORklHSURfUkVMSUFCTEUJMQorLyogIElmIHNvZnR3YXJlIHRhcmdldHMgYSAqcmFuZ2UqIG9mIGhhcmR3YXJlIHZlcnNpb25zLCB0aGVzZSBhcmUgdGhlIGJvdW5kczogKi8KKyNkZWZpbmUgWENIQUxfSFdfTUlOX1ZFUlNJT05fTUFKT1IJMjYwMAkvKiBtYWpvciB2IG9mIGVhcmxpZXN0IHRndCBodyAqLworI2RlZmluZSBYQ0hBTF9IV19NSU5fVkVSU0lPTl9NSU5PUgkyCS8qIG1pbm9yIHYgb2YgZWFybGllc3QgdGd0IGh3ICovCisjZGVmaW5lIFhDSEFMX0hXX01JTl9WRVJTSU9OCQkyNjAwMDIJLyogZWFybGllc3QgdGFyZ2V0ZWQgaHcgKi8KKyNkZWZpbmUgWENIQUxfSFdfTUFYX1ZFUlNJT05fTUFKT1IJMjYwMAkvKiBtYWpvciB2IG9mIGxhdGVzdCB0Z3QgaHcgKi8KKyNkZWZpbmUgWENIQUxfSFdfTUFYX1ZFUlNJT05fTUlOT1IJMgkvKiBtaW5vciB2IG9mIGxhdGVzdCB0Z3QgaHcgKi8KKyNkZWZpbmUgWENIQUxfSFdfTUFYX1ZFUlNJT04JCTI2MDAwMgkvKiBsYXRlc3QgdGFyZ2V0ZWQgaHcgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQlDQUNIRQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBYQ0hBTF9JQ0FDSEVfTElORVNJWkUJCTY0CS8qIEktY2FjaGUgbGluZSBzaXplIGluIGJ5dGVzICovCisjZGVmaW5lIFhDSEFMX0RDQUNIRV9MSU5FU0laRQkJNjQJLyogRC1jYWNoZSBsaW5lIHNpemUgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgWENIQUxfSUNBQ0hFX0xJTkVXSURUSAkJNgkvKiBsb2cyKEkgbGluZSBzaXplIGluIGJ5dGVzKSAqLworI2RlZmluZSBYQ0hBTF9EQ0FDSEVfTElORVdJRFRICQk2CS8qIGxvZzIoRCBsaW5lIHNpemUgaW4gYnl0ZXMpICovCisKKyNkZWZpbmUgWENIQUxfSUNBQ0hFX1NJWkUJCTY1NTM2CS8qIEktY2FjaGUgc2l6ZSBpbiBieXRlcyBvciAwICovCisjZGVmaW5lIFhDSEFMX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBELWNhY2hlIHNpemUgaW4gYnl0ZXMgb3IgMCAqLworCisjZGVmaW5lIFhDSEFMX0RDQUNIRV9JU19XUklURUJBQ0sJMQkvKiB3cml0ZWJhY2sgZmVhdHVyZSAqLworI2RlZmluZSBYQ0hBTF9EQ0FDSEVfSVNfQ09IRVJFTlQJMAkvKiBNUCBjb2hlcmVuY2UgZmVhdHVyZSAqLworCisjZGVmaW5lIFhDSEFMX0hBVkVfUFJFRkVUQ0gJCTAJLyogUFJFRkNUTCByZWdpc3RlciAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1BSRUZFVENIX0wxCQkwCS8qIHByZWZldGNoIHRvIEwxIGRjYWNoZSAqLworI2RlZmluZSBYQ0hBTF9QUkVGRVRDSF9DQVNUT1VUX0xJTkVTCTAJLyogZGNhY2hlIHByZWYuIGNhc3RvdXQgYnVmc3ogKi8KKyNkZWZpbmUgWENIQUxfUFJFRkVUQ0hfRU5UUklFUwkJMAkvKiBjYWNoZSBwcmVmZXRjaCBlbnRyaWVzICovCisjZGVmaW5lIFhDSEFMX1BSRUZFVENIX0JMT0NLX0VOVFJJRVMJMAkvKiBwcmVmZXRjaCBibG9jayBzdHJlYW1zICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQ0FDSEVfQkxPQ0tPUFMJMAkvKiBibG9jayBwcmVmZXRjaCBmb3IgY2FjaGVzICovCisjZGVmaW5lIFhDSEFMX0hBVkVfSUNBQ0hFX1RFU1QJCTEJLyogSWNhY2hlIHRlc3QgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFhDSEFMX0hBVkVfRENBQ0hFX1RFU1QJCTEJLyogRGNhY2hlIHRlc3QgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFhDSEFMX0hBVkVfSUNBQ0hFX0RZTl9XQVlTCTAJLyogSWNhY2hlIGR5bmFtaWMgd2F5IHN1cHBvcnQgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9EQ0FDSEVfRFlOX1dBWVMJMAkvKiBEY2FjaGUgZHluYW1pYyB3YXkgc3VwcG9ydCAqLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIFBhcmFtZXRlcnMgVXNlZnVsIGZvciBQUklWSUxFR0VEIChTdXBlcnZpc29yeSBvciBOb24tVmlydHVhbGl6ZWQpIENvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgWFRFTlNBX0hBTF9OT05fUFJJVklMRUdFRF9PTkxZCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCUNBQ0hFCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFhDSEFMX0hBVkVfUElGCQkJMQkvKiBhbnkgb3V0Ym91bmQgUElGIHByZXNlbnQgKi8KKworLyogIElmIHByZXNlbnQsIGNhY2hlIHNpemUgaW4gYnl0ZXMgPT0gKHdheXMgKiAyXihsaW5ld2lkdGggKyBzZXR3aWR0aCkpLiAgKi8KKworLyogIE51bWJlciBvZiBjYWNoZSBzZXRzIGluIGxvZzIobGluZXMgcGVyIHdheSk6ICAqLworI2RlZmluZSBYQ0hBTF9JQ0FDSEVfU0VUV0lEVEgJCTgKKyNkZWZpbmUgWENIQUxfRENBQ0hFX1NFVFdJRFRICQk2CisKKy8qICBDYWNoZSBzZXQgYXNzb2NpYXRpdml0eSAobnVtYmVyIG9mIHdheXMpOiAgKi8KKyNkZWZpbmUgWENIQUxfSUNBQ0hFX1dBWVMJCTQKKyNkZWZpbmUgWENIQUxfRENBQ0hFX1dBWVMJCTQKKworLyogIENhY2hlIGZlYXR1cmVzOiAgKi8KKyNkZWZpbmUgWENIQUxfSUNBQ0hFX0xJTkVfTE9DS0FCTEUJMQorI2RlZmluZSBYQ0hBTF9EQ0FDSEVfTElORV9MT0NLQUJMRQkxCisjZGVmaW5lIFhDSEFMX0lDQUNIRV9FQ0NfUEFSSVRZCQkwCisjZGVmaW5lIFhDSEFMX0RDQUNIRV9FQ0NfUEFSSVRZCQkwCisKKy8qICBDYWNoZSBhY2Nlc3Mgc2l6ZSBpbiBieXRlcyAoYWZmZWN0cyBvcGVyYXRpb24gb2YgU0lDVyBpbnN0cnVjdGlvbik6ICAqLworI2RlZmluZSBYQ0hBTF9JQ0FDSEVfQUNDRVNTX1NJWkUJMTYKKyNkZWZpbmUgWENIQUxfRENBQ0hFX0FDQ0VTU19TSVpFCTE2CisKKyNkZWZpbmUgWENIQUxfRENBQ0hFX0JBTktTCQkxCS8qIG51bWJlciBvZiBiYW5rcyAqLworCisvKiAgTnVtYmVyIG9mIGVuY29kZWQgY2FjaGUgYXR0ciBiaXRzIChzZWUgPHh0ZW5zYS9oYWwuaD4gZm9yIGRlY29kZWQgYml0cyk6ICAqLworI2RlZmluZSBYQ0hBTF9DQV9CSVRTCQkJNAorCisvKiAgV2hldGhlciBNRU1DVEwgcmVnaXN0ZXIgaGFzIGFueXRoaW5nIHVzZWZ1bCAgKi8KKyNkZWZpbmUgWENIQUxfVVNFX01FTUNUTAkJKCgoWENIQUxfTE9PUF9CVUZGRVJfU0laRSA+IDApCXx8CVwKKwkJCQkJICAgWENIQUxfRENBQ0hFX0lTX0NPSEVSRU5UCXx8CVwKKwkJCQkJICAgWENIQUxfSEFWRV9JQ0FDSEVfRFlOX1dBWVMJfHwJXAorCQkJCQkgICBYQ0hBTF9IQVZFX0RDQUNIRV9EWU5fV0FZUykJJiYJXAorCQkJCQkgICAoWENIQUxfSFdfTUlOX1ZFUlNJT04gPj0gWFRFTlNBX0hXVkVSU0lPTl9SRV8yMDEyXzApKQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJSU5URVJOQUwgSS9EIFJBTS9ST01zIGFuZCBYTE1JCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFhDSEFMX05VTV9JTlNUUk9NCQkwCS8qIG51bWJlciBvZiBjb3JlIGluc3RyLiBST01zICovCisjZGVmaW5lIFhDSEFMX05VTV9JTlNUUkFNCQkwCS8qIG51bWJlciBvZiBjb3JlIGluc3RyLiBSQU1zICovCisjZGVmaW5lIFhDSEFMX05VTV9EQVRBUk9NCQkwCS8qIG51bWJlciBvZiBjb3JlIGRhdGEgUk9NcyAqLworI2RlZmluZSBYQ0hBTF9OVU1fREFUQVJBTQkJMAkvKiBudW1iZXIgb2YgY29yZSBkYXRhIFJBTXMgKi8KKyNkZWZpbmUgWENIQUxfTlVNX1VSQU0JCQkwCS8qIG51bWJlciBvZiBjb3JlIHVuaWZpZWQgUkFNcyovCisjZGVmaW5lIFhDSEFMX05VTV9YTE1JCQkJMAkvKiBudW1iZXIgb2YgY29yZSBYTE1JIHBvcnRzICovCisKKyNkZWZpbmUgWENIQUxfSEFWRV9JTUVNX0xPQURTVE9SRQkxCS8qIGNhbiBsb2FkL3N0b3JlIHRvIElST00vSVJBTSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlJTlRFUlJVUFRTIGFuZCBUSU1FUlMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgWENIQUxfSEFWRV9JTlRFUlJVUFRTCQkxCS8qIGludGVycnVwdCBvcHRpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9ISUdIUFJJX0lOVEVSUlVQVFMJMQkvKiBtZWQvaGlnaC1wcmkuIGludGVycnVwdHMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9OTUkJCQkxCS8qIG5vbi1tYXNrYWJsZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9DQ09VTlQJCTEJLyogQ0NPVU5UIHJlZy4gKHRpbWVyIG9wdGlvbikgKi8KKyNkZWZpbmUgWENIQUxfTlVNX1RJTUVSUwkJMwkvKiBudW1iZXIgb2YgQ0NPTVBBUkVuIHJlZ3MgKi8KKyNkZWZpbmUgWENIQUxfTlVNX0lOVEVSUlVQVFMJCTIyCS8qIG51bWJlciBvZiBpbnRlcnJ1cHRzICovCisjZGVmaW5lIFhDSEFMX05VTV9JTlRFUlJVUFRTX0xPRzIJNQkvKiBjZWlsKGxvZzIoTlVNX0lOVEVSUlVQVFMpKSAqLworI2RlZmluZSBYQ0hBTF9OVU1fRVhUSU5URVJSVVBUUwkJMTYJLyogbnVtIG9mIGV4dGVybmFsIGludGVycnVwdHMgKi8KKyNkZWZpbmUgWENIQUxfTlVNX0lOVExFVkVMUwkJNgkvKiBudW1iZXIgb2YgaW50ZXJydXB0IGxldmVscworCQkJCQkJICAgKG5vdCBpbmNsdWRpbmcgbGV2ZWwgemVybykgKi8KKyNkZWZpbmUgWENIQUxfRVhDTV9MRVZFTAkJMwkvKiBsZXZlbCBtYXNrZWQgYnkgUFMuRVhDTSAqLworCS8qIChhbHdheXMgMSBpbiBYRUExOyBsZXZlbHMgMiAuLiBFWENNX0xFVkVMIGFyZSAibWVkaXVtIHByaW9yaXR5IikgKi8KKworLyogIE1hc2tzIG9mIGludGVycnVwdHMgYXQgZWFjaCBpbnRlcnJ1cHQgbGV2ZWw6ICAqLworI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDFfTUFTSwkJMHgwMDFGMDBCRgorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDJfTUFTSwkJMHgwMDAwMTE0MAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDNfTUFTSwkJMHgwMDIwMEUwMAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDRfTUFTSwkJMHgwMDAwODAwMAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDVfTUFTSwkJMHgwMDAwMjAwMAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDZfTUFTSwkJMHgwMDAwMDAwMAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDdfTUFTSwkJMHgwMDAwNDAwMAorCisvKiAgTWFza3Mgb2YgaW50ZXJydXB0cyBhdCBlYWNoIHJhbmdlIDEuLm4gb2YgaW50ZXJydXB0IGxldmVsczogICovCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMMV9BTkRCRUxPV19NQVNLCTB4MDAxRjAwQkYKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwyX0FOREJFTE9XX01BU0sJMHgwMDFGMTFGRgorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDNfQU5EQkVMT1dfTUFTSwkweDAwM0YxRkZGCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMNF9BTkRCRUxPV19NQVNLCTB4MDAzRjlGRkYKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw1X0FOREJFTE9XX01BU0sJMHgwMDNGQkZGRgorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDZfQU5EQkVMT1dfTUFTSwkweDAwM0ZCRkZGCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMN19BTkRCRUxPV19NQVNLCTB4MDAzRkZGRkYKKworLyogIExldmVsIG9mIGVhY2ggaW50ZXJydXB0OiAgKi8KKyNkZWZpbmUgWENIQUxfSU5UMF9MRVZFTAkJMQorI2RlZmluZSBYQ0hBTF9JTlQxX0xFVkVMCQkxCisjZGVmaW5lIFhDSEFMX0lOVDJfTEVWRUwJCTEKKyNkZWZpbmUgWENIQUxfSU5UM19MRVZFTAkJMQorI2RlZmluZSBYQ0hBTF9JTlQ0X0xFVkVMCQkxCisjZGVmaW5lIFhDSEFMX0lOVDVfTEVWRUwJCTEKKyNkZWZpbmUgWENIQUxfSU5UNl9MRVZFTAkJMgorI2RlZmluZSBYQ0hBTF9JTlQ3X0xFVkVMCQkxCisjZGVmaW5lIFhDSEFMX0lOVDhfTEVWRUwJCTIKKyNkZWZpbmUgWENIQUxfSU5UOV9MRVZFTAkJMworI2RlZmluZSBYQ0hBTF9JTlQxMF9MRVZFTAkJMworI2RlZmluZSBYQ0hBTF9JTlQxMV9MRVZFTAkJMworI2RlZmluZSBYQ0hBTF9JTlQxMl9MRVZFTAkJMgorI2RlZmluZSBYQ0hBTF9JTlQxM19MRVZFTAkJNQorI2RlZmluZSBYQ0hBTF9JTlQxNF9MRVZFTAkJNworI2RlZmluZSBYQ0hBTF9JTlQxNV9MRVZFTAkJNAorI2RlZmluZSBYQ0hBTF9JTlQxNl9MRVZFTAkJMQorI2RlZmluZSBYQ0hBTF9JTlQxN19MRVZFTAkJMQorI2RlZmluZSBYQ0hBTF9JTlQxOF9MRVZFTAkJMQorI2RlZmluZSBYQ0hBTF9JTlQxOV9MRVZFTAkJMQorI2RlZmluZSBYQ0hBTF9JTlQyMF9MRVZFTAkJMQorI2RlZmluZSBYQ0hBTF9JTlQyMV9MRVZFTAkJMworI2RlZmluZSBYQ0hBTF9ERUJVR0xFVkVMCQk2CS8qIGRlYnVnIGludGVycnVwdCBsZXZlbCAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0RFQlVHX0VYVEVSTl9JTlQJMQkvKiBPQ0QgZXh0ZXJuYWwgZGIgaW50ZXJydXB0ICovCisjZGVmaW5lIFhDSEFMX05NSUxFVkVMCQkJNwkvKiBOTUkgImxldmVsIiAoZm9yIHVzZSB3aXRoCisJCQkJCQkgICBFWENTQVZFL0VQUy9FUENfbiwgUkZJIG4pICovCisKKy8qICBUeXBlIG9mIGVhY2ggaW50ZXJydXB0OiAgKi8KKyNkZWZpbmUgWENIQUxfSU5UMF9UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9MRVZFTAorI2RlZmluZSBYQ0hBTF9JTlQxX1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0xFVkVMCisjZGVmaW5lIFhDSEFMX0lOVDJfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwKKyNkZWZpbmUgWENIQUxfSU5UM19UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9MRVZFTAorI2RlZmluZSBYQ0hBTF9JTlQ0X1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0xFVkVMCisjZGVmaW5lIFhDSEFMX0lOVDVfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwKKyNkZWZpbmUgWENIQUxfSU5UNl9UWVBFIAlYVEhBTF9JTlRUWVBFX1RJTUVSCisjZGVmaW5lIFhDSEFMX0lOVDdfVFlQRSAJWFRIQUxfSU5UVFlQRV9TT0ZUV0FSRQorI2RlZmluZSBYQ0hBTF9JTlQ4X1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0xFVkVMCisjZGVmaW5lIFhDSEFMX0lOVDlfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwKKyNkZWZpbmUgWENIQUxfSU5UMTBfVFlQRSAJWFRIQUxfSU5UVFlQRV9USU1FUgorI2RlZmluZSBYQ0hBTF9JTlQxMV9UWVBFIAlYVEhBTF9JTlRUWVBFX1NPRlRXQVJFCisjZGVmaW5lIFhDSEFMX0lOVDEyX1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0VER0UKKyNkZWZpbmUgWENIQUxfSU5UMTNfVFlQRSAJWFRIQUxfSU5UVFlQRV9USU1FUgorI2RlZmluZSBYQ0hBTF9JTlQxNF9UWVBFIAlYVEhBTF9JTlRUWVBFX05NSQorI2RlZmluZSBYQ0hBTF9JTlQxNV9UWVBFIAlYVEhBTF9JTlRUWVBFX1BST0ZJTElORworI2RlZmluZSBYQ0hBTF9JTlQxNl9UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9FREdFCisjZGVmaW5lIFhDSEFMX0lOVDE3X1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0VER0UKKyNkZWZpbmUgWENIQUxfSU5UMThfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fRURHRQorI2RlZmluZSBYQ0hBTF9JTlQxOV9UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9FREdFCisjZGVmaW5lIFhDSEFMX0lOVDIwX1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0VER0UKKyNkZWZpbmUgWENIQUxfSU5UMjFfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fRURHRQorCisvKiAgTWFza3Mgb2YgaW50ZXJydXB0cyBmb3IgZWFjaCB0eXBlIG9mIGludGVycnVwdDogICovCisjZGVmaW5lIFhDSEFMX0lOVFRZUEVfTUFTS19VTkNPTkZJR1VSRUQJMHhGRkMwMDAwMAorI2RlZmluZSBYQ0hBTF9JTlRUWVBFX01BU0tfU09GVFdBUkUJMHgwMDAwMDg4MAorI2RlZmluZSBYQ0hBTF9JTlRUWVBFX01BU0tfRVhURVJOX0VER0UJMHgwMDNGMTAwMAorI2RlZmluZSBYQ0hBTF9JTlRUWVBFX01BU0tfRVhURVJOX0xFVkVMCTB4MDAwMDAzM0YKKyNkZWZpbmUgWENIQUxfSU5UVFlQRV9NQVNLX1RJTUVSCTB4MDAwMDI0NDAKKyNkZWZpbmUgWENIQUxfSU5UVFlQRV9NQVNLX05NSQkJMHgwMDAwNDAwMAorI2RlZmluZSBYQ0hBTF9JTlRUWVBFX01BU0tfV1JJVEVfRVJST1IJMHgwMDAwMDAwMAorI2RlZmluZSBYQ0hBTF9JTlRUWVBFX01BU0tfUFJPRklMSU5HCTB4MDAwMDgwMDAKKworLyogIEludGVycnVwdCBudW1iZXJzIGFzc2lnbmVkIHRvIHNwZWNpZmljIGludGVycnVwdCBzb3VyY2VzOiAgKi8KKyNkZWZpbmUgWENIQUxfVElNRVIwX0lOVEVSUlVQVAkJNgkvKiBDQ09NUEFSRTAgKi8KKyNkZWZpbmUgWENIQUxfVElNRVIxX0lOVEVSUlVQVAkJMTAJLyogQ0NPTVBBUkUxICovCisjZGVmaW5lIFhDSEFMX1RJTUVSMl9JTlRFUlJVUFQJCTEzCS8qIENDT01QQVJFMiAqLworI2RlZmluZSBYQ0hBTF9USU1FUjNfSU5URVJSVVBUCQlYVEhBTF9USU1FUl9VTkNPTkZJR1VSRUQKKyNkZWZpbmUgWENIQUxfTk1JX0lOVEVSUlVQVAkJMTQJLyogbm9uLW1hc2thYmxlIGludGVycnVwdCAqLworI2RlZmluZSBYQ0hBTF9QUk9GSUxJTkdfSU5URVJSVVBUCTE1CS8qIHByb2ZpbGluZyBpbnRlcnJ1cHQgKi8KKworLyogIEludGVycnVwdCBudW1iZXJzIGZvciBsZXZlbHMgYXQgd2hpY2ggb25seSBvbmUgaW50ZXJydXB0IGlzIGNvbmZpZ3VyZWQ6ICAqLworI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDRfTlVNCQkxNQorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDVfTlVNCQkxMworI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDdfTlVNCQkxNAorLyogIChUaGVyZSBhcmUgbWFueSBpbnRlcnJ1cHRzIGVhY2ggYXQgbGV2ZWwocykgMSwgMiwgMy4pICAqLworCisKKy8qCisgKiAgRXh0ZXJuYWwgaW50ZXJydXB0IG1hcHBpbmcuCisgKiAgVGhlc2UgbWFjcm9zIGRlc2NyaWJlIGhvdyBYdGVuc2EgcHJvY2Vzc29yIGludGVycnVwdCBudW1iZXJzCisgKiAgKGFzIG51bWJlcmVkIGludGVybmFsbHksIGVnLiBpbiBJTlRFUlJVUFQgYW5kIElOVEVOQUJMRSByZWdpc3RlcnMpCisgKiAgbWFwIHRvIGV4dGVybmFsIEJJbnRlcnJ1cHQ8bj4gcGlucywgZm9yIHRob3NlIGludGVycnVwdHMKKyAqICBjb25maWd1cmVkIGFzIGV4dGVybmFsIChsZXZlbC10cmlnZ2VyZWQsIGVkZ2UtdHJpZ2dlcmVkLCBvciBOTUkpLgorICogIFNlZSB0aGUgWHRlbnNhIHByb2Nlc3NvciBkYXRhYm9vayBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qICBDb3JlIGludGVycnVwdCBudW1iZXJzIG1hcHBlZCB0byBlYWNoIEVYVEVSTkFMIEJJbnRlcnJ1cHQgcGluIG51bWJlcjogICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDBfTlVNCQkwCS8qIChpbnRsZXZlbCAxKSAqLworI2RlZmluZSBYQ0hBTF9FWFRJTlQxX05VTQkJMQkvKiAoaW50bGV2ZWwgMSkgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UMl9OVU0JCTIJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDNfTlVNCQkzCS8qIChpbnRsZXZlbCAxKSAqLworI2RlZmluZSBYQ0hBTF9FWFRJTlQ0X05VTQkJNAkvKiAoaW50bGV2ZWwgMSkgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UNV9OVU0JCTUJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDZfTlVNCQk4CS8qIChpbnRsZXZlbCAyKSAqLworI2RlZmluZSBYQ0hBTF9FWFRJTlQ3X05VTQkJOQkvKiAoaW50bGV2ZWwgMykgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UOF9OVU0JCTEyCS8qIChpbnRsZXZlbCAyKSAqLworI2RlZmluZSBYQ0hBTF9FWFRJTlQ5X05VTQkJMTQJLyogKGludGxldmVsIDcpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDEwX05VTQkJMTYJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDExX05VTQkJMTcJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDEyX05VTQkJMTgJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDEzX05VTQkJMTkJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDE0X05VTQkJMjAJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDE1X05VTQkJMjEJLyogKGludGxldmVsIDMpICovCisvKiAgRVhURVJOQUwgQkludGVycnVwdCBwaW4gbnVtYmVycyBtYXBwZWQgdG8gZWFjaCBjb3JlIGludGVycnVwdCBudW1iZXI6ICAqLworI2RlZmluZSBYQ0hBTF9JTlQwX0VYVE5VTQkJMAkvKiAoaW50bGV2ZWwgMSkgKi8KKyNkZWZpbmUgWENIQUxfSU5UMV9FWFROVU0JCTEJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0lOVDJfRVhUTlVNCQkyCS8qIChpbnRsZXZlbCAxKSAqLworI2RlZmluZSBYQ0hBTF9JTlQzX0VYVE5VTQkJMwkvKiAoaW50bGV2ZWwgMSkgKi8KKyNkZWZpbmUgWENIQUxfSU5UNF9FWFROVU0JCTQJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0lOVDVfRVhUTlVNCQk1CS8qIChpbnRsZXZlbCAxKSAqLworI2RlZmluZSBYQ0hBTF9JTlQ4X0VYVE5VTQkJNgkvKiAoaW50bGV2ZWwgMikgKi8KKyNkZWZpbmUgWENIQUxfSU5UOV9FWFROVU0JCTcJLyogKGludGxldmVsIDMpICovCisjZGVmaW5lIFhDSEFMX0lOVDEyX0VYVE5VTQkJOAkvKiAoaW50bGV2ZWwgMikgKi8KKyNkZWZpbmUgWENIQUxfSU5UMTRfRVhUTlVNCQk5CS8qIChpbnRsZXZlbCA3KSAqLworI2RlZmluZSBYQ0hBTF9JTlQxNl9FWFROVU0JCTEwCS8qIChpbnRsZXZlbCAxKSAqLworI2RlZmluZSBYQ0hBTF9JTlQxN19FWFROVU0JCTExCS8qIChpbnRsZXZlbCAxKSAqLworI2RlZmluZSBYQ0hBTF9JTlQxOF9FWFROVU0JCTEyCS8qIChpbnRsZXZlbCAxKSAqLworI2RlZmluZSBYQ0hBTF9JTlQxOV9FWFROVU0JCTEzCS8qIChpbnRsZXZlbCAxKSAqLworI2RlZmluZSBYQ0hBTF9JTlQyMF9FWFROVU0JCTE0CS8qIChpbnRsZXZlbCAxKSAqLworI2RlZmluZSBYQ0hBTF9JTlQyMV9FWFROVU0JCTE1CS8qIChpbnRsZXZlbCAzKSAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJRVhDRVBUSU9OUyBhbmQgVkVDVE9SUworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBYQ0hBTF9YRUFfVkVSU0lPTgkJMgkvKiBYdGVuc2EgRXhjZXB0aW9uIEFyY2hpdGVjdHVyZQorCQkJCQkJICAgbnVtYmVyOiAxID09IFhFQTEgKG9sZCkKKwkJCQkJCQkgICAyID09IFhFQTIgKG5ldykKKwkJCQkJCQkgICAwID09IFhFQVggKGV4dGVybikgb3IgVFggKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9YRUExCQkJMAkvKiBFeGNlcHRpb24gQXJjaGl0ZWN0dXJlIDEgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9YRUEyCQkJMQkvKiBFeGNlcHRpb24gQXJjaGl0ZWN0dXJlIDIgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9YRUFYCQkJMAkvKiBFeHRlcm5hbCBFeGNlcHRpb24gQXJjaC4gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9FWENFUFRJT05TCQkxCS8qIGV4Y2VwdGlvbiBvcHRpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9IQUxUCQkJMAkvKiBoYWx0IGFyY2hpdGVjdHVyZSBvcHRpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9CT09UTE9BREVSCQkwCS8qIGJvb3QgbG9hZGVyIChmb3IgVFgpICovCisjZGVmaW5lIFhDSEFMX0hBVkVfTUVNX0VDQ19QQVJJVFkJMAkvKiBsb2NhbCBtZW1vcnkgRUNDL3Bhcml0eSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1ZFQ1RPUl9TRUxFQ1QJMQkvKiByZWxvY2F0YWJsZSB2ZWN0b3JzICovCisjZGVmaW5lIFhDSEFMX0hBVkVfVkVDQkFTRQkJMQkvKiByZWxvY2F0YWJsZSB2ZWN0b3JzICovCisjZGVmaW5lIFhDSEFMX1ZFQ0JBU0VfUkVTRVRfVkFERFIJMHgwMDAwMjAwMCAgLyogVkVDQkFTRSByZXNldCB2YWx1ZSAqLworI2RlZmluZSBYQ0hBTF9WRUNCQVNFX1JFU0VUX1BBRERSCTB4MDAwMDIwMDAKKyNkZWZpbmUgWENIQUxfUkVTRVRfVkVDQkFTRV9PVkVSTEFQCTAKKworI2RlZmluZSBYQ0hBTF9SRVNFVF9WRUNUT1IwX1ZBRERSCTB4RkUwMDAwMDAKKyNkZWZpbmUgWENIQUxfUkVTRVRfVkVDVE9SMF9QQUREUgkweEZFMDAwMDAwCisjZGVmaW5lIFhDSEFMX1JFU0VUX1ZFQ1RPUjFfVkFERFIJMHgwMDAwMTAwMAorI2RlZmluZSBYQ0hBTF9SRVNFVF9WRUNUT1IxX1BBRERSCTB4MDAwMDEwMDAKKyNkZWZpbmUgWENIQUxfUkVTRVRfVkVDVE9SX1ZBRERSCTB4RkUwMDAwMDAKKyNkZWZpbmUgWENIQUxfUkVTRVRfVkVDVE9SX1BBRERSCTB4RkUwMDAwMDAKKyNkZWZpbmUgWENIQUxfVVNFUl9WRUNPRlMJCTB4MDAwMDAzNDAKKyNkZWZpbmUgWENIQUxfVVNFUl9WRUNUT1JfVkFERFIJCTB4MDAwMDIzNDAKKyNkZWZpbmUgWENIQUxfVVNFUl9WRUNUT1JfUEFERFIJCTB4MDAwMDIzNDAKKyNkZWZpbmUgWENIQUxfS0VSTkVMX1ZFQ09GUwkJMHgwMDAwMDMwMAorI2RlZmluZSBYQ0hBTF9LRVJORUxfVkVDVE9SX1ZBRERSCTB4MDAwMDIzMDAKKyNkZWZpbmUgWENIQUxfS0VSTkVMX1ZFQ1RPUl9QQUREUgkweDAwMDAyMzAwCisjZGVmaW5lIFhDSEFMX0RPVUJMRUVYQ19WRUNPRlMJCTB4MDAwMDAzQzAKKyNkZWZpbmUgWENIQUxfRE9VQkxFRVhDX1ZFQ1RPUl9WQUREUgkweDAwMDAyM0MwCisjZGVmaW5lIFhDSEFMX0RPVUJMRUVYQ19WRUNUT1JfUEFERFIJMHgwMDAwMjNDMAorI2RlZmluZSBYQ0hBTF9XSU5ET1dfT0Y0X1ZFQ09GUwkJMHgwMDAwMDAwMAorI2RlZmluZSBYQ0hBTF9XSU5ET1dfVUY0X1ZFQ09GUwkJMHgwMDAwMDA0MAorI2RlZmluZSBYQ0hBTF9XSU5ET1dfT0Y4X1ZFQ09GUwkJMHgwMDAwMDA4MAorI2RlZmluZSBYQ0hBTF9XSU5ET1dfVUY4X1ZFQ09GUwkJMHgwMDAwMDBDMAorI2RlZmluZSBYQ0hBTF9XSU5ET1dfT0YxMl9WRUNPRlMJMHgwMDAwMDEwMAorI2RlZmluZSBYQ0hBTF9XSU5ET1dfVUYxMl9WRUNPRlMJMHgwMDAwMDE0MAorI2RlZmluZSBYQ0hBTF9XSU5ET1dfVkVDVE9SU19WQUREUgkweDAwMDAyMDAwCisjZGVmaW5lIFhDSEFMX1dJTkRPV19WRUNUT1JTX1BBRERSCTB4MDAwMDIwMDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwyX1ZFQ09GUwkJMHgwMDAwMDE4MAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDJfVkVDVE9SX1ZBRERSCTB4MDAwMDIxODAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwyX1ZFQ1RPUl9QQUREUgkweDAwMDAyMTgwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMM19WRUNPRlMJCTB4MDAwMDAxQzAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwzX1ZFQ1RPUl9WQUREUgkweDAwMDAyMUMwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMM19WRUNUT1JfUEFERFIJMHgwMDAwMjFDMAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDRfVkVDT0ZTCQkweDAwMDAwMjAwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMNF9WRUNUT1JfVkFERFIJMHgwMDAwMjIwMAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDRfVkVDVE9SX1BBRERSCTB4MDAwMDIyMDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw1X1ZFQ09GUwkJMHgwMDAwMDI0MAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDVfVkVDVE9SX1ZBRERSCTB4MDAwMDIyNDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw1X1ZFQ1RPUl9QQUREUgkweDAwMDAyMjQwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMNl9WRUNPRlMJCTB4MDAwMDAyODAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw2X1ZFQ1RPUl9WQUREUgkweDAwMDAyMjgwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMNl9WRUNUT1JfUEFERFIJMHgwMDAwMjI4MAorI2RlZmluZSBYQ0hBTF9ERUJVR19WRUNPRlMJCVhDSEFMX0lOVExFVkVMNl9WRUNPRlMKKyNkZWZpbmUgWENIQUxfREVCVUdfVkVDVE9SX1ZBRERSCVhDSEFMX0lOVExFVkVMNl9WRUNUT1JfVkFERFIKKyNkZWZpbmUgWENIQUxfREVCVUdfVkVDVE9SX1BBRERSCVhDSEFMX0lOVExFVkVMNl9WRUNUT1JfUEFERFIKKyNkZWZpbmUgWENIQUxfTk1JX1ZFQ09GUwkJMHgwMDAwMDJDMAorI2RlZmluZSBYQ0hBTF9OTUlfVkVDVE9SX1ZBRERSCQkweDAwMDAyMkMwCisjZGVmaW5lIFhDSEFMX05NSV9WRUNUT1JfUEFERFIJCTB4MDAwMDIyQzAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw3X1ZFQ09GUwkJWENIQUxfTk1JX1ZFQ09GUworI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDdfVkVDVE9SX1ZBRERSCVhDSEFMX05NSV9WRUNUT1JfVkFERFIKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw3X1ZFQ1RPUl9QQUREUglYQ0hBTF9OTUlfVkVDVE9SX1BBRERSCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJREVCVUcgTU9EVUxFCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAgTWlzYyAgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9ERUJVR19FUkkJCTEJLyogRVJJIHRvIGRlYnVnIG1vZHVsZSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0RFQlVHX0FQQgkJMQkvKiBBUEIgdG8gZGVidWcgbW9kdWxlICovCisjZGVmaW5lIFhDSEFMX0hBVkVfREVCVUdfSlRBRwkJMQkvKiBKVEFHIHRvIGRlYnVnIG1vZHVsZSAqLworCisvKiAgT24tQ2hpcCBEZWJ1ZyAoT0NEKSAgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9PQ0QJCQkxCS8qIE9uQ2hpcERlYnVnIG9wdGlvbiAqLworI2RlZmluZSBYQ0hBTF9OVU1fSUJSRUFLCQkyCS8qIG51bWJlciBvZiBJQlJFQUtuIHJlZ3MgKi8KKyNkZWZpbmUgWENIQUxfTlVNX0RCUkVBSwkJMgkvKiBudW1iZXIgb2YgREJSRUFLbiByZWdzICovCisjZGVmaW5lIFhDSEFMX0hBVkVfT0NEX0RJUl9BUlJBWQkwCS8qIGZhc3RlciBPQ0Qgb3B0aW9uICh0byBMWDQpICovCisjZGVmaW5lIFhDSEFMX0hBVkVfT0NEX0xTMzJERFIJCTEJLyogTDMyRERSL1MzMkREUiAoZmFzdGVyIE9DRCkgKi8KKworLyogIFRSQVggKGluIGNvcmUpICAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1RSQVgJCQkxCS8qIFRSQVggaW4gZGVidWcgbW9kdWxlICovCisjZGVmaW5lIFhDSEFMX1RSQVhfTUVNX1NJWkUJCTI2MjE0NAkvKiBUUkFYIG1lbW9yeSBzaXplIGluIGJ5dGVzICovCisjZGVmaW5lIFhDSEFMX1RSQVhfTUVNX1NIQVJFQUJMRQkxCS8qIHN0YXJ0L2VuZCByZWdzOyByZWFkeSBzaWcuICovCisjZGVmaW5lIFhDSEFMX1RSQVhfQVRCX1dJRFRICQkwCS8qIEFUQiB3aWR0aCAoYml0cyksIDA9bm8gQVRCICovCisjZGVmaW5lIFhDSEFMX1RSQVhfVElNRV9XSURUSAkJMAkvKiB0aW1lc3RhbXAgYml0d2lkdGgsIDA9bm9uZSAqLworCisvKiAgUGVyZiBjb3VudGVycyAgKi8KKyNkZWZpbmUgWENIQUxfTlVNX1BFUkZfQ09VTlRFUlMJCTgJLyogcGVyZm9ybWFuY2UgY291bnRlcnMgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQlNTVUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qICBTZWUgY29yZS1tYXRtYXAuaCBoZWFkZXIgZmlsZSBmb3IgbW9yZSBkZXRhaWxzLiAgKi8KKworI2RlZmluZSBYQ0hBTF9IQVZFX1RMQlMJCQkxCS8qIGludmVyc2Ugb2YgSEFWRV9DQUNIRUFUVFIgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9TUEFOTklOR19XQVkJCTEJLyogb25lIHdheSBtYXBzIEkrRCA0R0IgdmFkZHIgKi8KKyNkZWZpbmUgWENIQUxfU1BBTk5JTkdfV0FZCQk2CS8qIFRMQiBzcGFubmluZyB3YXkgbnVtYmVyICovCisjZGVmaW5lIFhDSEFMX0hBVkVfSURFTlRJVFlfTUFQCQkwCS8qIHZhZGRyID09IHBhZGRyIGFsd2F5cyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0NBQ0hFQVRUUgkJMAkvKiBDQUNIRUFUVFIgcmVnaXN0ZXIgcHJlc2VudCAqLworI2RlZmluZSBYQ0hBTF9IQVZFX01JTUlDX0NBQ0hFQVRUUgkwCS8qIHJlZ2lvbiBwcm90ZWN0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfWExUX0NBQ0hFQVRUUgkwCS8qIHJlZ2lvbiBwcm90LiB3L3RyYW5zbGF0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfUFRQX01NVQkJMQkvKiBmdWxsIE1NVSAod2l0aCBwYWdlIHRhYmxlCisJCQkJCQkgICBbYXV0b3JlZmlsbF0gYW5kIHByb3RlY3Rpb24pCisJCQkJCQkgICB1c2FibGUgZm9yIGFuIE1NVS1iYXNlZCBPUyAqLworLyogIElmIG5vbmUgb2YgdGhlIGFib3ZlIGxhc3QgNCBhcmUgc2V0LCBpdCdzIGEgY3VzdG9tIFRMQiBjb25maWd1cmF0aW9uLiAgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9BUkZfRU5UUklFU19MT0cyCTIJLyogbG9nMihhdXRvcmVmaWxsIHdheSBzaXplKSAqLworI2RlZmluZSBYQ0hBTF9EVExCX0FSRl9FTlRSSUVTX0xPRzIJMgkvKiBsb2cyKGF1dG9yZWZpbGwgd2F5IHNpemUpICovCisKKyNkZWZpbmUgWENIQUxfTU1VX0FTSURfQklUUwkJOAkvKiBudW1iZXIgb2YgYml0cyBpbiBBU0lEcyAqLworI2RlZmluZSBYQ0hBTF9NTVVfUklOR1MJCQk0CS8qIG51bWJlciBvZiByaW5ncyAoMS4uNCkgKi8KKyNkZWZpbmUgWENIQUxfTU1VX1JJTkdfQklUUwkJMgkvKiBudW0gb2YgYml0cyBpbiBSSU5HIGZpZWxkICovCisKKyNlbmRpZiAvKiAhWFRFTlNBX0hBTF9OT05fUFJJVklMRUdFRF9PTkxZICovCisKKworI2VuZGlmIC8qIF9YVEVOU0FfQ09SRV9DT05GSUdVUkFUSU9OX0ggKi8KKwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvdmFyaWFudHMvY3NwL2luY2x1ZGUvdmFyaWFudC90aWUtYXNtLmggYi9hcmNoL3h0ZW5zYS92YXJpYW50cy9jc3AvaW5jbHVkZS92YXJpYW50L3RpZS1hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTc3M2M0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvdmFyaWFudHMvY3NwL2luY2x1ZGUvdmFyaWFudC90aWUtYXNtLmgKQEAgLTAsMCArMSwxOTQgQEAKKy8qIAorICogdGllLWFzbS5oIC0tIGNvbXBpbGUtdGltZSBIQUwgYXNzZW1ibGVyIGRlZmluaXRpb25zIGRlcGVuZGVudCBvbiBDT1JFICYgVElFCisgKgorICogIE5PVEU6ICBUaGlzIGhlYWRlciBmaWxlIGlzIG5vdCBtZWFudCB0byBiZSBpbmNsdWRlZCBkaXJlY3RseS4KKyAqLworCisvKiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIGFzc2VtYmx5LWxhbmd1YWdlIGRlZmluaXRpb25zIChhc3NlbWJseQorICAgbWFjcm9zLCBldGMuKSBmb3IgdGhpcyBzcGVjaWZpYyBYdGVuc2EgcHJvY2Vzc29yJ3MgVElFIGV4dGVuc2lvbnMKKyAgIGFuZCBvcHRpb25zLiAgSXQgaXMgY3VzdG9taXplZCB0byB0aGlzIFh0ZW5zYSBwcm9jZXNzb3IgY29uZmlndXJhdGlvbi4KKworICAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMTUgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcyBJbmMuCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICAgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAgIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgICBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICovCisKKyNpZm5kZWYgX1hURU5TQV9DT1JFX1RJRV9BU01fSAorI2RlZmluZSBfWFRFTlNBX0NPUkVfVElFX0FTTV9ICisKKy8qICBTZWxlY3Rpb24gcGFyYW1ldGVyIHZhbHVlcyBmb3Igc2F2ZS1hcmVhIHNhdmUvcmVzdG9yZSBtYWNyb3M6ICAqLworLyogIE9wdGlvbiB2cy4gVElFOiAgKi8KKyNkZWZpbmUgWFRIQUxfU0FTX1RJRQkweDAwMDEJLyogY3VzdG9tIGV4dGVuc2lvbiBvciBjb3Byb2Nlc3NvciAqLworI2RlZmluZSBYVEhBTF9TQVNfT1BUCTB4MDAwMgkvKiBvcHRpb25hbCAoYW5kIG5vdCBhIGNvcHJvY2Vzc29yKSAqLworI2RlZmluZSBYVEhBTF9TQVNfQU5ZT1QJMHgwMDAzCS8qIGJvdGggb2YgdGhlIGFib3ZlICovCisvKiAgV2hldGhlciB1c2VkIGF1dG9tYXRpY2FsbHkgYnkgY29tcGlsZXI6ICAqLworI2RlZmluZSBYVEhBTF9TQVNfTk9DQwkweDAwMDQJLyogbm90IHVzZWQgYnkgY29tcGlsZXIgdy9vIHNwZWNpYWwgb3B0cy9jb2RlICovCisjZGVmaW5lIFhUSEFMX1NBU19DQwkweDAwMDgJLyogdXNlZCBieSBjb21waWxlciB3aXRob3V0IHNwZWNpYWwgb3B0cy9jb2RlICovCisjZGVmaW5lIFhUSEFMX1NBU19BTllDQwkweDAwMEMJLyogYm90aCBvZiB0aGUgYWJvdmUgKi8KKy8qICBBQkkgaGFuZGxpbmcgYWNyb3NzIGZ1bmN0aW9uIGNhbGxzOiAgKi8KKyNkZWZpbmUgWFRIQUxfU0FTX0NBTFIJMHgwMDEwCS8qIGNhbGxlci1zYXZlZCAqLworI2RlZmluZSBYVEhBTF9TQVNfQ0FMRQkweDAwMjAJLyogY2FsbGVlLXNhdmVkICovCisjZGVmaW5lIFhUSEFMX1NBU19HTE9CCTB4MDA0MAkvKiBnbG9iYWwgYWNyb3NzIGZ1bmN0aW9uIGNhbGxzIChpbiB0aHJlYWQpICovCisjZGVmaW5lIFhUSEFMX1NBU19BTllBQkkJMHgwMDcwCS8qIGFsbCBvZiB0aGUgYWJvdmUgdGhyZWUgKi8KKy8qICBNaXNjICAqLworI2RlZmluZSBYVEhBTF9TQVNfQUxMCTB4RkZGRgkvKiBpbmNsdWRlIGFsbCBkZWZhdWx0IE5DUCBjb250ZW50cyAqLworI2RlZmluZSBYVEhBTF9TQVMzKG9wdGllLGNjdXNlLGFiaSkJKCAoKG9wdGllKSAmIFhUSEFMX1NBU19BTllPVCkgIFwKKwkJCQkJfCAoKGNjdXNlKSAmIFhUSEFMX1NBU19BTllDQykgIFwKKwkJCQkJfCAoKGFiaSkgICAmIFhUSEFMX1NBU19BTllBQkkpICkKKworCisgICAgLyoKKyAgICAgICogIE1hY3JvIHRvIHN0b3JlIGFsbCBub24tY29wcm9jZXNzb3IgKGV4dHJhKSBjdXN0b20gVElFIGFuZCBvcHRpb25hbCBzdGF0ZQorICAgICAgKiAgKG5vdCBpbmNsdWRpbmcgemVyby1vdmVyaGVhZCBsb29wIHJlZ2lzdGVycykuCisgICAgICAqICBSZXF1aXJlZCBwYXJhbWV0ZXJzOgorICAgICAgKiAgICAgIHB0ciAgICAgICAgIFNhdmUgYXJlYSBwb2ludGVyIGFkZHJlc3MgcmVnaXN0ZXIgKGNsb2JiZXJlZCkKKyAgICAgICogICAgICAgICAgICAgICAgICAocmVnaXN0ZXIgbXVzdCBjb250YWluIGEgNCBieXRlIGFsaWduZWQgYWRkcmVzcykuCisgICAgICAqICAgICAgYXQxLi5hdDQgICAgRm91ciB0ZW1wb3JhcnkgYWRkcmVzcyByZWdpc3RlcnMgKGZpcnN0IFhDSEFMX05DUF9OVU1fQVRNUFMKKyAgICAgICogICAgICAgICAgICAgICAgICByZWdpc3RlcnMgYXJlIGNsb2JiZXJlZCwgdGhlIHJlbWFpbmluZyBhcmUgdW51c2VkKS4KKyAgICAgICogIE9wdGlvbmFsIHBhcmFtZXRlcnM6CisgICAgICAqICAgICAgY29udGludWUgICAgSWYgbWFjcm8gaW52b2tlZCBhcyBwYXJ0IG9mIGEgbGFyZ2VyIHN0b3JlIHNlcXVlbmNlLCBzZXQgdG8gMQorICAgICAgKiAgICAgICAgICAgICAgICAgIGlmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBpbiB0aGUgc2VxdWVuY2UuICBEZWZhdWx0cyB0byAwLgorICAgICAgKiAgICAgIG9mcyAgICAgICAgIE9mZnNldCBmcm9tIHN0YXJ0IG9mIGxhcmdlciBzZXF1ZW5jZSAoZnJvbSB2YWx1ZSBvZiBmaXJzdCBwdHIKKyAgICAgICogICAgICAgICAgICAgICAgICBpbiBzZXF1ZW5jZSkgYXQgd2hpY2ggdG8gc3RvcmUuICBEZWZhdWx0cyB0byBuZXh0IGF2YWlsYWJsZSBzcGFjZQorICAgICAgKiAgICAgICAgICAgICAgICAgIChvciAwIGlmIDxjb250aW51ZT4gaXMgMCkuCisgICAgICAqICAgICAgc2VsZWN0ICAgICAgU2VsZWN0IHdoYXQgY2F0ZWdvcnkoaWVzKSBvZiByZWdpc3RlcnMgdG8gc3RvcmUsIGFzIGEgYml0bWFzaworICAgICAgKiAgICAgICAgICAgICAgICAgIChzZWUgWFRIQUxfU0FTX3h4eCBjb25zdGFudHMpLiAgRGVmYXVsdHMgdG8gYWxsIHJlZ2lzdGVycy4KKyAgICAgICogICAgICBhbGxvYyAgICAgICBTZWxlY3Qgd2hhdCBjYXRlZ29yeShpZXMpIG9mIHJlZ2lzdGVycyB0byBhbGxvY2F0ZTsgaWYgYW55CisgICAgICAqICAgICAgICAgICAgICAgICAgY2F0ZWdvcnkgaXMgc2VsZWN0ZWQgaGVyZSB0aGF0IGlzIG5vdCBpbiA8c2VsZWN0Piwgc3BhY2UgZm9yCisgICAgICAqICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXJzIGlzIHNraXBwZWQgd2l0aG91dCBkb2luZyBhbnkgc3RvcmUuCisgICAgICAqLworICAgIC5tYWNybyB4Y2hhbF9uY3Bfc3RvcmUgIHB0ciBhdDEgYXQyIGF0MyBhdDQgIGNvbnRpbnVlPTAgb2ZzPS0xIHNlbGVjdD1YVEhBTF9TQVNfQUxMIGFsbG9jPTAKKwl4Y2hhbF9zYV9zdGFydAlcY29udGludWUsIFxvZnMKKwkvLyBPcHRpb25hbCBnbG9iYWwgcmVnaXN0ZXJzIHVzZWQgYnkgZGVmYXVsdCBieSB0aGUgY29tcGlsZXI6CisJLmlmZXEgKFhUSEFMX1NBU19PUFQgfCBYVEhBTF9TQVNfQ0MgfCBYVEhBTF9TQVNfR0xPQikgJiB+KFxzZWxlY3QpCisJeGNoYWxfc2FfYWxpZ24JXHB0ciwgMCwgMTAyMCwgNCwgNAorCXJ1ci5USFJFQURQVFIJXGF0MQkJLy8gdGhyZWFkcHRyIG9wdGlvbgorCXMzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzAKKwkuc2V0CS5MeGNoYWxfb2ZzXywgLkx4Y2hhbF9vZnNfICsgNAorCS5lbHNlaWYgKChYVEhBTF9TQVNfT1BUIHwgWFRIQUxfU0FTX0NDIHwgWFRIQUxfU0FTX0dMT0IpICYgfihcYWxsb2MpKSA9PSAwCisJeGNoYWxfc2FfYWxpZ24JXHB0ciwgMCwgMTAyMCwgNCwgNAorCS5zZXQJLkx4Y2hhbF9vZnNfLCAuTHhjaGFsX29mc18gKyA0CisJLmVuZGlmCisJLy8gT3B0aW9uYWwgY2FsbGVyLXNhdmVkIHJlZ2lzdGVycyB1c2VkIGJ5IGRlZmF1bHQgYnkgdGhlIGNvbXBpbGVyOgorCS5pZmVxIChYVEhBTF9TQVNfT1BUIHwgWFRIQUxfU0FTX0NDIHwgWFRIQUxfU0FTX0NBTFIpICYgfihcc2VsZWN0KQorCXhjaGFsX3NhX2FsaWduCVxwdHIsIDAsIDEwMTYsIDQsIDQKKwlyc3IuQUNDTE8JXGF0MQkJLy8gTUFDMTYgb3B0aW9uCisJczMyaQlcYXQxLCBccHRyLCAuTHhjaGFsX29mc18rMAorCXJzci5BQ0NISQlcYXQxCQkvLyBNQUMxNiBvcHRpb24KKwlzMzJpCVxhdDEsIFxwdHIsIC5MeGNoYWxfb2ZzXys0CisJLnNldAkuTHhjaGFsX29mc18sIC5MeGNoYWxfb2ZzXyArIDgKKwkuZWxzZWlmICgoWFRIQUxfU0FTX09QVCB8IFhUSEFMX1NBU19DQyB8IFhUSEFMX1NBU19DQUxSKSAmIH4oXGFsbG9jKSkgPT0gMAorCXhjaGFsX3NhX2FsaWduCVxwdHIsIDAsIDEwMTYsIDQsIDQKKwkuc2V0CS5MeGNoYWxfb2ZzXywgLkx4Y2hhbF9vZnNfICsgOAorCS5lbmRpZgorCS8vIE9wdGlvbmFsIGNhbGxlci1zYXZlZCByZWdpc3RlcnMgbm90IHVzZWQgYnkgZGVmYXVsdCBieSB0aGUgY29tcGlsZXI6CisJLmlmZXEgKFhUSEFMX1NBU19PUFQgfCBYVEhBTF9TQVNfTk9DQyB8IFhUSEFMX1NBU19DQUxSKSAmIH4oXHNlbGVjdCkKKwl4Y2hhbF9zYV9hbGlnbglccHRyLCAwLCAxMDAwLCA0LCA0CisJcnNyLkJSCVxhdDEJCS8vIGJvb2xlYW4gb3B0aW9uCisJczMyaQlcYXQxLCBccHRyLCAuTHhjaGFsX29mc18rMAorCXJzci5TQ09NUEFSRTEJXGF0MQkJLy8gY29uZGl0aW9uYWwgc3RvcmUgb3B0aW9uCisJczMyaQlcYXQxLCBccHRyLCAuTHhjaGFsX29mc18rNAorCXJzci5NMAlcYXQxCQkvLyBNQUMxNiBvcHRpb24KKwlzMzJpCVxhdDEsIFxwdHIsIC5MeGNoYWxfb2ZzXys4CisJcnNyLk0xCVxhdDEJCS8vIE1BQzE2IG9wdGlvbgorCXMzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzEyCisJcnNyLk0yCVxhdDEJCS8vIE1BQzE2IG9wdGlvbgorCXMzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzE2CisJcnNyLk0zCVxhdDEJCS8vIE1BQzE2IG9wdGlvbgorCXMzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzIwCisJLnNldAkuTHhjaGFsX29mc18sIC5MeGNoYWxfb2ZzXyArIDI0CisJLmVsc2VpZiAoKFhUSEFMX1NBU19PUFQgfCBYVEhBTF9TQVNfTk9DQyB8IFhUSEFMX1NBU19DQUxSKSAmIH4oXGFsbG9jKSkgPT0gMAorCXhjaGFsX3NhX2FsaWduCVxwdHIsIDAsIDEwMDAsIDQsIDQKKwkuc2V0CS5MeGNoYWxfb2ZzXywgLkx4Y2hhbF9vZnNfICsgMjQKKwkuZW5kaWYKKyAgICAuZW5kbQkvLyB4Y2hhbF9uY3Bfc3RvcmUKKworICAgIC8qCisgICAgICAqICBNYWNybyB0byBsb2FkIGFsbCBub24tY29wcm9jZXNzb3IgKGV4dHJhKSBjdXN0b20gVElFIGFuZCBvcHRpb25hbCBzdGF0ZQorICAgICAgKiAgKG5vdCBpbmNsdWRpbmcgemVyby1vdmVyaGVhZCBsb29wIHJlZ2lzdGVycykuCisgICAgICAqICBSZXF1aXJlZCBwYXJhbWV0ZXJzOgorICAgICAgKiAgICAgIHB0ciAgICAgICAgIFNhdmUgYXJlYSBwb2ludGVyIGFkZHJlc3MgcmVnaXN0ZXIgKGNsb2JiZXJlZCkKKyAgICAgICogICAgICAgICAgICAgICAgICAocmVnaXN0ZXIgbXVzdCBjb250YWluIGEgNCBieXRlIGFsaWduZWQgYWRkcmVzcykuCisgICAgICAqICAgICAgYXQxLi5hdDQgICAgRm91ciB0ZW1wb3JhcnkgYWRkcmVzcyByZWdpc3RlcnMgKGZpcnN0IFhDSEFMX05DUF9OVU1fQVRNUFMKKyAgICAgICogICAgICAgICAgICAgICAgICByZWdpc3RlcnMgYXJlIGNsb2JiZXJlZCwgdGhlIHJlbWFpbmluZyBhcmUgdW51c2VkKS4KKyAgICAgICogIE9wdGlvbmFsIHBhcmFtZXRlcnM6CisgICAgICAqICAgICAgY29udGludWUgICAgSWYgbWFjcm8gaW52b2tlZCBhcyBwYXJ0IG9mIGEgbGFyZ2VyIGxvYWQgc2VxdWVuY2UsIHNldCB0byAxCisgICAgICAqICAgICAgICAgICAgICAgICAgaWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGluIHRoZSBzZXF1ZW5jZS4gIERlZmF1bHRzIHRvIDAuCisgICAgICAqICAgICAgb2ZzICAgICAgICAgT2Zmc2V0IGZyb20gc3RhcnQgb2YgbGFyZ2VyIHNlcXVlbmNlIChmcm9tIHZhbHVlIG9mIGZpcnN0IHB0cgorICAgICAgKiAgICAgICAgICAgICAgICAgIGluIHNlcXVlbmNlKSBhdCB3aGljaCB0byBsb2FkLiAgRGVmYXVsdHMgdG8gbmV4dCBhdmFpbGFibGUgc3BhY2UKKyAgICAgICogICAgICAgICAgICAgICAgICAob3IgMCBpZiA8Y29udGludWU+IGlzIDApLgorICAgICAgKiAgICAgIHNlbGVjdCAgICAgIFNlbGVjdCB3aGF0IGNhdGVnb3J5KGllcykgb2YgcmVnaXN0ZXJzIHRvIGxvYWQsIGFzIGEgYml0bWFzaworICAgICAgKiAgICAgICAgICAgICAgICAgIChzZWUgWFRIQUxfU0FTX3h4eCBjb25zdGFudHMpLiAgRGVmYXVsdHMgdG8gYWxsIHJlZ2lzdGVycy4KKyAgICAgICogICAgICBhbGxvYyAgICAgICBTZWxlY3Qgd2hhdCBjYXRlZ29yeShpZXMpIG9mIHJlZ2lzdGVycyB0byBhbGxvY2F0ZTsgaWYgYW55CisgICAgICAqICAgICAgICAgICAgICAgICAgY2F0ZWdvcnkgaXMgc2VsZWN0ZWQgaGVyZSB0aGF0IGlzIG5vdCBpbiA8c2VsZWN0Piwgc3BhY2UgZm9yCisgICAgICAqICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXJzIGlzIHNraXBwZWQgd2l0aG91dCBkb2luZyBhbnkgbG9hZC4KKyAgICAgICovCisgICAgLm1hY3JvIHhjaGFsX25jcF9sb2FkICBwdHIgYXQxIGF0MiBhdDMgYXQ0ICBjb250aW51ZT0wIG9mcz0tMSBzZWxlY3Q9WFRIQUxfU0FTX0FMTCBhbGxvYz0wCisJeGNoYWxfc2Ffc3RhcnQJXGNvbnRpbnVlLCBcb2ZzCisJLy8gT3B0aW9uYWwgZ2xvYmFsIHJlZ2lzdGVycyB1c2VkIGJ5IGRlZmF1bHQgYnkgdGhlIGNvbXBpbGVyOgorCS5pZmVxIChYVEhBTF9TQVNfT1BUIHwgWFRIQUxfU0FTX0NDIHwgWFRIQUxfU0FTX0dMT0IpICYgfihcc2VsZWN0KQorCXhjaGFsX3NhX2FsaWduCVxwdHIsIDAsIDEwMjAsIDQsIDQKKwlsMzJpCVxhdDEsIFxwdHIsIC5MeGNoYWxfb2ZzXyswCisJd3VyLlRIUkVBRFBUUglcYXQxCQkvLyB0aHJlYWRwdHIgb3B0aW9uCisJLnNldAkuTHhjaGFsX29mc18sIC5MeGNoYWxfb2ZzXyArIDQKKwkuZWxzZWlmICgoWFRIQUxfU0FTX09QVCB8IFhUSEFMX1NBU19DQyB8IFhUSEFMX1NBU19HTE9CKSAmIH4oXGFsbG9jKSkgPT0gMAorCXhjaGFsX3NhX2FsaWduCVxwdHIsIDAsIDEwMjAsIDQsIDQKKwkuc2V0CS5MeGNoYWxfb2ZzXywgLkx4Y2hhbF9vZnNfICsgNAorCS5lbmRpZgorCS8vIE9wdGlvbmFsIGNhbGxlci1zYXZlZCByZWdpc3RlcnMgdXNlZCBieSBkZWZhdWx0IGJ5IHRoZSBjb21waWxlcjoKKwkuaWZlcSAoWFRIQUxfU0FTX09QVCB8IFhUSEFMX1NBU19DQyB8IFhUSEFMX1NBU19DQUxSKSAmIH4oXHNlbGVjdCkKKwl4Y2hhbF9zYV9hbGlnbglccHRyLCAwLCAxMDE2LCA0LCA0CisJbDMyaQlcYXQxLCBccHRyLCAuTHhjaGFsX29mc18rMAorCXdzci5BQ0NMTwlcYXQxCQkvLyBNQUMxNiBvcHRpb24KKwlsMzJpCVxhdDEsIFxwdHIsIC5MeGNoYWxfb2ZzXys0CisJd3NyLkFDQ0hJCVxhdDEJCS8vIE1BQzE2IG9wdGlvbgorCS5zZXQJLkx4Y2hhbF9vZnNfLCAuTHhjaGFsX29mc18gKyA4CisJLmVsc2VpZiAoKFhUSEFMX1NBU19PUFQgfCBYVEhBTF9TQVNfQ0MgfCBYVEhBTF9TQVNfQ0FMUikgJiB+KFxhbGxvYykpID09IDAKKwl4Y2hhbF9zYV9hbGlnbglccHRyLCAwLCAxMDE2LCA0LCA0CisJLnNldAkuTHhjaGFsX29mc18sIC5MeGNoYWxfb2ZzXyArIDgKKwkuZW5kaWYKKwkvLyBPcHRpb25hbCBjYWxsZXItc2F2ZWQgcmVnaXN0ZXJzIG5vdCB1c2VkIGJ5IGRlZmF1bHQgYnkgdGhlIGNvbXBpbGVyOgorCS5pZmVxIChYVEhBTF9TQVNfT1BUIHwgWFRIQUxfU0FTX05PQ0MgfCBYVEhBTF9TQVNfQ0FMUikgJiB+KFxzZWxlY3QpCisJeGNoYWxfc2FfYWxpZ24JXHB0ciwgMCwgMTAwMCwgNCwgNAorCWwzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzAKKwl3c3IuQlIJXGF0MQkJLy8gYm9vbGVhbiBvcHRpb24KKwlsMzJpCVxhdDEsIFxwdHIsIC5MeGNoYWxfb2ZzXys0CisJd3NyLlNDT01QQVJFMQlcYXQxCQkvLyBjb25kaXRpb25hbCBzdG9yZSBvcHRpb24KKwlsMzJpCVxhdDEsIFxwdHIsIC5MeGNoYWxfb2ZzXys4CisJd3NyLk0wCVxhdDEJCS8vIE1BQzE2IG9wdGlvbgorCWwzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzEyCisJd3NyLk0xCVxhdDEJCS8vIE1BQzE2IG9wdGlvbgorCWwzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzE2CisJd3NyLk0yCVxhdDEJCS8vIE1BQzE2IG9wdGlvbgorCWwzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzIwCisJd3NyLk0zCVxhdDEJCS8vIE1BQzE2IG9wdGlvbgorCS5zZXQJLkx4Y2hhbF9vZnNfLCAuTHhjaGFsX29mc18gKyAyNAorCS5lbHNlaWYgKChYVEhBTF9TQVNfT1BUIHwgWFRIQUxfU0FTX05PQ0MgfCBYVEhBTF9TQVNfQ0FMUikgJiB+KFxhbGxvYykpID09IDAKKwl4Y2hhbF9zYV9hbGlnbglccHRyLCAwLCAxMDAwLCA0LCA0CisJLnNldAkuTHhjaGFsX29mc18sIC5MeGNoYWxfb2ZzXyArIDI0CisJLmVuZGlmCisgICAgLmVuZG0JLy8geGNoYWxfbmNwX2xvYWQKKworCisjZGVmaW5lIFhDSEFMX05DUF9OVU1fQVRNUFMJMQorCisjZGVmaW5lIFhDSEFMX1NBX05VTV9BVE1QUwkxCisKKyNlbmRpZiAvKl9YVEVOU0FfQ09SRV9USUVfQVNNX0gqLworCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS92YXJpYW50cy9jc3AvaW5jbHVkZS92YXJpYW50L3RpZS5oIGIvYXJjaC94dGVuc2EvdmFyaWFudHMvY3NwL2luY2x1ZGUvdmFyaWFudC90aWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2UzOTFjZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL3ZhcmlhbnRzL2NzcC9pbmNsdWRlL3ZhcmlhbnQvdGllLmgKQEAgLTAsMCArMSwxNjEgQEAKKy8qIAorICogdGllLmggLS0gY29tcGlsZS10aW1lIEhBTCBkZWZpbml0aW9ucyBkZXBlbmRlbnQgb24gQ09SRSAmIFRJRSBjb25maWd1cmF0aW9uCisgKgorICogIE5PVEU6ICBUaGlzIGhlYWRlciBmaWxlIGlzIG5vdCBtZWFudCB0byBiZSBpbmNsdWRlZCBkaXJlY3RseS4KKyAqLworCisvKiBUaGlzIGhlYWRlciBmaWxlIGRlc2NyaWJlcyB0aGlzIHNwZWNpZmljIFh0ZW5zYSBwcm9jZXNzb3IncyBUSUUgZXh0ZW5zaW9ucworICAgdGhhdCBleHRlbmQgYmFzaWMgWHRlbnNhIGNvcmUgZnVuY3Rpb25hbGl0eS4gIEl0IGlzIGN1c3RvbWl6ZWQgdG8gdGhpcworICAgWHRlbnNhIHByb2Nlc3NvciBjb25maWd1cmF0aW9uLgorCisgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAxNSBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zIEluYy4KKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICAgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAgIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgKi8KKworI2lmbmRlZiBfWFRFTlNBX0NPUkVfVElFX0gKKyNkZWZpbmUgX1hURU5TQV9DT1JFX1RJRV9ICisKKyNkZWZpbmUgWENIQUxfQ1BfTlVNCQkJMQkvKiBudW1iZXIgb2YgY29wcm9jZXNzb3JzICovCisjZGVmaW5lIFhDSEFMX0NQX01BWAkJCTgJLyogbWF4IENQIElEICsgMSAoMCBpZiBub25lKSAqLworI2RlZmluZSBYQ0hBTF9DUF9NQVNLCQkJMHg4MAkvKiBiaXRtYXNrIG9mIGFsbCBDUHMgYnkgSUQgKi8KKyNkZWZpbmUgWENIQUxfQ1BfUE9SVF9NQVNLCQkweDgwCS8qIGJpdG1hc2sgb2Ygb25seSBwb3J0IENQcyAqLworCisvKiAgQmFzaWMgcGFyYW1ldGVycyBvZiBlYWNoIGNvcHJvY2Vzc29yOiAgKi8KKyNkZWZpbmUgWENIQUxfQ1A3X05BTUUJCQkiWFRJT1AiCisjZGVmaW5lIFhDSEFMX0NQN19JREVOVAkJCVhUSU9QCisjZGVmaW5lIFhDSEFMX0NQN19TQV9TSVpFCQkwCS8qIHNpemUgb2Ygc3RhdGUgc2F2ZSBhcmVhICovCisjZGVmaW5lIFhDSEFMX0NQN19TQV9BTElHTgkJMQkvKiBtaW4gYWxpZ25tZW50IG9mIHNhdmUgYXJlYSAqLworI2RlZmluZSBYQ0hBTF9DUF9JRF9YVElPUCAgICAgICAgICAgCTcJLyogY29wcm9jZXNzb3IgSUQgKDAuLjcpICovCisKKy8qICBGaWxsZXIgaW5mbyBmb3IgdW5hc3NpZ25lZCBjb3Byb2Nlc3NvcnMsIHRvIHNpbXBsaWZ5IGFycmF5cyBldGM6ICAqLworI2RlZmluZSBYQ0hBTF9DUDBfU0FfU0laRQkJMAorI2RlZmluZSBYQ0hBTF9DUDBfU0FfQUxJR04JCTEKKyNkZWZpbmUgWENIQUxfQ1AxX1NBX1NJWkUJCTAKKyNkZWZpbmUgWENIQUxfQ1AxX1NBX0FMSUdOCQkxCisjZGVmaW5lIFhDSEFMX0NQMl9TQV9TSVpFCQkwCisjZGVmaW5lIFhDSEFMX0NQMl9TQV9BTElHTgkJMQorI2RlZmluZSBYQ0hBTF9DUDNfU0FfU0laRQkJMAorI2RlZmluZSBYQ0hBTF9DUDNfU0FfQUxJR04JCTEKKyNkZWZpbmUgWENIQUxfQ1A0X1NBX1NJWkUJCTAKKyNkZWZpbmUgWENIQUxfQ1A0X1NBX0FMSUdOCQkxCisjZGVmaW5lIFhDSEFMX0NQNV9TQV9TSVpFCQkwCisjZGVmaW5lIFhDSEFMX0NQNV9TQV9BTElHTgkJMQorI2RlZmluZSBYQ0hBTF9DUDZfU0FfU0laRQkJMAorI2RlZmluZSBYQ0hBTF9DUDZfU0FfQUxJR04JCTEKKworLyogIFNhdmUgYXJlYSBmb3Igbm9uLWNvcHJvY2Vzc29yIG9wdGlvbmFsIGFuZCBjdXN0b20gKFRJRSkgc3RhdGU6ICAqLworI2RlZmluZSBYQ0hBTF9OQ1BfU0FfU0laRQkJMzYKKyNkZWZpbmUgWENIQUxfTkNQX1NBX0FMSUdOCQk0CisKKy8qICBUb3RhbCBzYXZlIGFyZWEgZm9yIG9wdGlvbmFsIGFuZCBjdXN0b20gc3RhdGUgKE5DUCArIENQbik6ICAqLworI2RlZmluZSBYQ0hBTF9UT1RBTF9TQV9TSVpFCQk0OAkvKiB3aXRoIDE2LWJ5dGUgYWxpZ24gcGFkZGluZyAqLworI2RlZmluZSBYQ0hBTF9UT1RBTF9TQV9BTElHTgkJNAkvKiBhY3R1YWwgbWluaW11bSBhbGlnbm1lbnQgKi8KKworLyoKKyAqIERldGFpbGVkIGNvbnRlbnRzIG9mIHNhdmUgYXJlYXMuCisgKiBOT1RFOiAgY2FsbGVyIG11c3QgZGVmaW5lIHRoZSBYQ0hBTF9TQV9SRUcgbWFjcm8gKG5vdCBkZWZpbmVkIGhlcmUpCisgKiBiZWZvcmUgZXhwYW5kaW5nIHRoZSBYQ0hBTF94eHhfU0FfTElTVCgpIG1hY3Jvcy4KKyAqCisgKiBYQ0hBTF9TQV9SRUcocyxjY3VzZWQsYWJpa2luZCxraW5kLG9wdCxuYW1lLGdhbGlnbixhbGlnbixhc2l6ZSwKKyAqCQlkYm51bSxiYXNlLHJlZ251bSxiaXRzeixnYXBzeixyZXNldCx4Li4uKQorICoKKyAqCXMgPSBwYXNzZWQgZnJvbSBYQ0hBTF8qX0xJU1QocyksIGVnLiB0byBzZWxlY3QgaG93IHRvIGV4cGFuZAorICoJY2N1c2VkID0gc2V0IGlmIHVzZWQgYnkgY29tcGlsZXIgd2l0aG91dCBzcGVjaWFsIG9wdGlvbnMgb3IgY29kZQorICoJYWJpa2luZCA9IDAgKGNhbGxlci1zYXZlZCksIDEgKGNhbGxlZS1zYXZlZCksIG9yIDIgKHRocmVhZC1nbG9iYWwpCisgKglraW5kID0gMCAoc3BlY2lhbCByZWcpLCAxIChUSUUgdXNlciByZWcpLCBvciAyIChUSUUgcmVnZmlsZSByZWcpCisgKglvcHQgPSAwIChjdXN0b20gVElFIGV4dGVuc2lvbiBvciBjb3Byb2Nlc3NvciksIG9yIDEgKG9wdGlvbmFsIHJlZykKKyAqCW5hbWUgPSBsb3dlcmNhc2UgcmVnIG5hbWUgKG5vIHF1b3RlcykKKyAqCWdhbGlnbiA9IGdyb3VwIGJ5dGUgYWxpZ25tZW50IChwb3dlciBvZiAyKSAoZ2FsaWduID49IGFsaWduKQorICoJYWxpZ24gPSByZWdpc3RlciBieXRlIGFsaWdubWVudCAocG93ZXIgb2YgMikKKyAqCWFzaXplID0gYWxsb2NhdGVkIHNpemUgaW4gYnl0ZXMgKGFzaXplKjggPT0gYml0c3ogKyBnYXBzeiArIHBhZHN6KQorICoJICAobm90IGluY2x1ZGluZyBhbnkgcGFkIGJ5dGVzIHJlcXVpcmVkIHRvIGdhbGlnbiB0aGlzIG9yIG5leHQgcmVnKQorICoJZGJudW0gPSB1bmlxdWUgdGFyZ2V0IG51bWJlciBmL2RlYnVnIChzZWUgPHh0ZW5zYS1saWJkYi1tYWNyb3MuaD4pCisgKgliYXNlID0gcmVnIHNob3J0bmFtZSB3L28gaW5kZXggKG9yIHNyPXNwZWNpYWwsIHVyPVRJRSB1c2VyIHJlZykKKyAqCXJlZ251bSA9IHJlZyBpbmRleCBpbiByZWdmaWxlLCBvciBzcGVjaWFsL1RJRS11c2VyIHJlZyBudW1iZXIKKyAqCWJpdHN6ID0gbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMgKHJlZ2ZpbGUgd2lkdGgsIG9yIHVyL3NyIG1hc2sgYml0cykKKyAqCWdhcHN6ID0gaW50ZXJ2ZW5pbmcgYml0cywgaWYgYml0c3ogYml0cyBub3Qgc3RvcmVkIGNvbnRpZ3VvdXNseQorICoJKHBhZHN6ID0gcGFkIGJpdHMgYXQgZW5kIFtUSUUgcmVnZmlsZV0gb3IgYXQgbXNiaXRzIFt1cixzcl0gb2YgYXNpemUpCisgKglyZXNldCA9IHJlZ2lzdGVyIHJlc2V0IHZhbHVlIChvciAwIGlmIHVuZGVmaW5lZCBhdCByZXNldCkKKyAqCXggPSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAoMCB1bnRpbCB0aGVuKQorICoKKyAqICBUbyBmaWx0ZXIgb3V0IGNlcnRhaW4gcmVnaXN0ZXJzLCBlLmcuIHRvIGV4cGFuZCBvbmx5IHRoZSBub24tZ2xvYmFsCisgKiAgcmVnaXN0ZXJzIHVzZWQgYnkgdGhlIGNvbXBpbGVyLCB5b3UgY2FuIGRvIHNvbWV0aGluZyBsaWtlIHRoaXM6CisgKgorICogICNkZWZpbmUgWENIQUxfU0FfUkVHKHMsY2N1c2VkLHAuLi4pCVNFTENDIyNjY3VzZWQocCkKKyAqICAjZGVmaW5lIFNFTENDMChwLi4uKQorICogICNkZWZpbmUgU0VMQ0MxKGFiaWtpbmQscC4uLikJU0VMQUsjI2FiaWtpbmQocCkKKyAqICAjZGVmaW5lIFNFTEFLMChwLi4uKQkJUkVHKHApCisgKiAgI2RlZmluZSBTRUxBSzEocC4uLikJCVJFRyhwKQorICogICNkZWZpbmUgU0VMQUsyKHAuLi4pCisgKiAgI2RlZmluZSBSRUcoa2luZCx0aWUsbmFtZSxnYWxuLGFsbixhc3osY3N6LGRibnVtLGJhc2Uscm51bSxic3oscnN0LHguLi4pIFwKKyAqCQkuLi53aGF0IHlvdSB3YW50IHRvIGV4cGFuZC4uLgorICovCisKKyNkZWZpbmUgWENIQUxfTkNQX1NBX05VTQk5CisjZGVmaW5lIFhDSEFMX05DUF9TQV9MSVNUKHMpCVwKKyBYQ0hBTF9TQV9SRUcocywxLDIsMSwxLCAgICAgIHRocmVhZHB0ciwgNCwgNCwgNCwweDAzRTcsICB1ciwyMzEsIDMyLDAsMCwwKSBcCisgWENIQUxfU0FfUkVHKHMsMSwwLDAsMSwgICAgICAgICAgYWNjbG8sIDQsIDQsIDQsMHgwMjEwLCAgc3IsMTYgLCAzMiwwLDAsMCkgXAorIFhDSEFMX1NBX1JFRyhzLDEsMCwwLDEsICAgICAgICAgIGFjY2hpLCA0LCA0LCA0LDB4MDIxMSwgIHNyLDE3ICwgIDgsMCwwLDApIFwKKyBYQ0hBTF9TQV9SRUcocywwLDAsMCwxLCAgICAgICAgICAgICBiciwgNCwgNCwgNCwweDAyMDQsICBzciw0ICAsIDE2LDAsMCwwKSBcCisgWENIQUxfU0FfUkVHKHMsMCwwLDAsMSwgICAgICBzY29tcGFyZTEsIDQsIDQsIDQsMHgwMjBDLCAgc3IsMTIgLCAzMiwwLDAsMCkgXAorIFhDSEFMX1NBX1JFRyhzLDAsMCwwLDEsICAgICAgICAgICAgIG0wLCA0LCA0LCA0LDB4MDIyMCwgIHNyLDMyICwgMzIsMCwwLDApIFwKKyBYQ0hBTF9TQV9SRUcocywwLDAsMCwxLCAgICAgICAgICAgICBtMSwgNCwgNCwgNCwweDAyMjEsICBzciwzMyAsIDMyLDAsMCwwKSBcCisgWENIQUxfU0FfUkVHKHMsMCwwLDAsMSwgICAgICAgICAgICAgbTIsIDQsIDQsIDQsMHgwMjIyLCAgc3IsMzQgLCAzMiwwLDAsMCkgXAorIFhDSEFMX1NBX1JFRyhzLDAsMCwwLDEsICAgICAgICAgICAgIG0zLCA0LCA0LCA0LDB4MDIyMywgIHNyLDM1ICwgMzIsMCwwLDApCisKKyNkZWZpbmUgWENIQUxfQ1AwX1NBX05VTQkwCisjZGVmaW5lIFhDSEFMX0NQMF9TQV9MSVNUKHMpCS8qIGVtcHR5ICovCisKKyNkZWZpbmUgWENIQUxfQ1AxX1NBX05VTQkwCisjZGVmaW5lIFhDSEFMX0NQMV9TQV9MSVNUKHMpCS8qIGVtcHR5ICovCisKKyNkZWZpbmUgWENIQUxfQ1AyX1NBX05VTQkwCisjZGVmaW5lIFhDSEFMX0NQMl9TQV9MSVNUKHMpCS8qIGVtcHR5ICovCisKKyNkZWZpbmUgWENIQUxfQ1AzX1NBX05VTQkwCisjZGVmaW5lIFhDSEFMX0NQM19TQV9MSVNUKHMpCS8qIGVtcHR5ICovCisKKyNkZWZpbmUgWENIQUxfQ1A0X1NBX05VTQkwCisjZGVmaW5lIFhDSEFMX0NQNF9TQV9MSVNUKHMpCS8qIGVtcHR5ICovCisKKyNkZWZpbmUgWENIQUxfQ1A1X1NBX05VTQkwCisjZGVmaW5lIFhDSEFMX0NQNV9TQV9MSVNUKHMpCS8qIGVtcHR5ICovCisKKyNkZWZpbmUgWENIQUxfQ1A2X1NBX05VTQkwCisjZGVmaW5lIFhDSEFMX0NQNl9TQV9MSVNUKHMpCS8qIGVtcHR5ICovCisKKyNkZWZpbmUgWENIQUxfQ1A3X1NBX05VTQkwCisjZGVmaW5lIFhDSEFMX0NQN19TQV9MSVNUKHMpCS8qIGVtcHR5ICovCisKKy8qIEJ5dGUgbGVuZ3RoIG9mIGluc3RydWN0aW9uIGZyb20gaXRzIGZpcnN0IG5pYmJsZSAob3AwIGZpZWxkKSwgcGVyIEZMSVguICAqLworI2RlZmluZSBYQ0hBTF9PUDBfRk9STUFUX0xFTkdUSFMJMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDMsMworLyogQnl0ZSBsZW5ndGggb2YgaW5zdHJ1Y3Rpb24gZnJvbSBpdHMgZmlyc3QgYnl0ZSwgcGVyIEZMSVguICAqLworI2RlZmluZSBYQ0hBTF9CWVRFMF9GT1JNQVRfTEVOR1RIUwlcCisJMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDMsMywgMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDMsMyxcCisJMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDMsMywgMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDMsMyxcCisJMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDMsMywgMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDMsMyxcCisJMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDMsMywgMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDMsMyxcCisJMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDMsMywgMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDMsMyxcCisJMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDMsMywgMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDMsMyxcCisJMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDMsMywgMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDMsMyxcCisJMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDMsMywgMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDMsMworCisjZW5kaWYgLypfWFRFTlNBX0NPUkVfVElFX0gqLworCmRpZmYgLS1naXQgYS9ibG9jay9iaW8uYyBiL2Jsb2NrL2Jpby5jCmluZGV4IGYzOTQ3NzUuLmFhNzM1NDAgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jpby5jCisrKyBiL2Jsb2NrL2Jpby5jCkBAIC02NjcsMTggKzY2NywxOSBAQAogCWJpby0+YmlfaXRlci5iaV9zZWN0b3IJPSBiaW9fc3JjLT5iaV9pdGVyLmJpX3NlY3RvcjsKIAliaW8tPmJpX2l0ZXIuYmlfc2l6ZQk9IGJpb19zcmMtPmJpX2l0ZXIuYmlfc2l6ZTsKIAotCWlmIChiaW9fb3AoYmlvKSA9PSBSRVFfT1BfRElTQ0FSRCkKLQkJZ290byBpbnRlZ3JpdHlfY2xvbmU7Ci0KLQlpZiAoYmlvX29wKGJpbykgPT0gUkVRX09QX1dSSVRFX1NBTUUpIHsKKwlzd2l0Y2ggKGJpb19vcChiaW8pKSB7CisJY2FzZSBSRVFfT1BfRElTQ0FSRDoKKwljYXNlIFJFUV9PUF9TRUNVUkVfRVJBU0U6CisJCWJyZWFrOworCWNhc2UgUkVRX09QX1dSSVRFX1NBTUU6CiAJCWJpby0+YmlfaW9fdmVjW2Jpby0+YmlfdmNudCsrXSA9IGJpb19zcmMtPmJpX2lvX3ZlY1swXTsKLQkJZ290byBpbnRlZ3JpdHlfY2xvbmU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW9fc3JjLCBpdGVyKQorCQkJYmlvLT5iaV9pb192ZWNbYmlvLT5iaV92Y250KytdID0gYnY7CisJCWJyZWFrOwogCX0KIAotCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW9fc3JjLCBpdGVyKQotCQliaW8tPmJpX2lvX3ZlY1tiaW8tPmJpX3ZjbnQrK10gPSBidjsKLQotaW50ZWdyaXR5X2Nsb25lOgogCWlmIChiaW9faW50ZWdyaXR5KGJpb19zcmMpKSB7CiAJCWludCByZXQ7CiAKQEAgLTE3ODgsNyArMTc4OSw3IEBACiAJICogRGlzY2FyZHMgbmVlZCBhIG11dGFibGUgYmlvX3ZlYyB0byBhY2NvbW1vZGF0ZSB0aGUgcGF5bG9hZAogCSAqIHJlcXVpcmVkIGJ5IHRoZSBEU00gVFJJTSBhbmQgVU5NQVAgY29tbWFuZHMuCiAJICovCi0JaWYgKGJpb19vcChiaW8pID09IFJFUV9PUF9ESVNDQVJEKQorCWlmIChiaW9fb3AoYmlvKSA9PSBSRVFfT1BfRElTQ0FSRCB8fCBiaW9fb3AoYmlvKSA9PSBSRVFfT1BfU0VDVVJFX0VSQVNFKQogCQlzcGxpdCA9IGJpb19jbG9uZV9iaW9zZXQoYmlvLCBnZnAsIGJzKTsKIAllbHNlCiAJCXNwbGl0ID0gYmlvX2Nsb25lX2Zhc3QoYmlvLCBnZnAsIGJzKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jb3JlLmMgYi9ibG9jay9ibGstY29yZS5jCmluZGV4IDk5OTQ0MmUuLjM2YzdhYzMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jb3JlLmMKKysrIGIvYmxvY2svYmxrLWNvcmUuYwpAQCAtNTE1LDcgKzUxNSw5IEBACiAKIHZvaWQgYmxrX3NldF9xdWV1ZV9keWluZyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKLQlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX0RZSU5HLCBxKTsKKwlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOworCXF1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfRFlJTkcsIHEpOworCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAogCWlmIChxLT5tcV9vcHMpCiAJCWJsa19tcV93YWtlX3dhaXRlcnMocSk7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstbWVyZ2UuYyBiL2Jsb2NrL2Jsay1tZXJnZS5jCmluZGV4IDNlZWM3NWEuLjI2NDJlNWYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1tZXJnZS5jCisrKyBiL2Jsb2NrL2Jsay1tZXJnZS5jCkBAIC05NCw5ICs5NCwzMSBAQAogCWJvb2wgZG9fc3BsaXQgPSB0cnVlOwogCXN0cnVjdCBiaW8gKm5ldyA9IE5VTEw7CiAJY29uc3QgdW5zaWduZWQgbWF4X3NlY3RvcnMgPSBnZXRfbWF4X2lvX3NpemUocSwgYmlvKTsKKwl1bnNpZ25lZCBidmVjcyA9IDA7CiAKIAliaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvLCBpdGVyKSB7CiAJCS8qCisJCSAqIFdpdGggYXJiaXRyYXJ5IGJpbyBzaXplLCB0aGUgaW5jb21pbmcgYmlvIG1heSBiZSB2ZXJ5CisJCSAqIGJpZy4gV2UgaGF2ZSB0byBzcGxpdCB0aGUgYmlvIGludG8gc21hbGwgYmlvcyBzbyB0aGF0CisJCSAqIGVhY2ggaG9sZHMgYXQgbW9zdCBCSU9fTUFYX1BBR0VTIGJ2ZWNzIGJlY2F1c2UKKwkJICogYmlvX2Nsb25lKCkgY2FuIGZhaWwgdG8gYWxsb2NhdGUgYmlnIGJ2ZWNzLgorCQkgKgorCQkgKiBJdCBzaG91bGQgaGF2ZSBiZWVuIGJldHRlciB0byBhcHBseSB0aGUgbGltaXQgcGVyCisJCSAqIHJlcXVlc3QgcXVldWUgaW4gd2hpY2ggYmlvX2Nsb25lKCkgaXMgaW52b2x2ZWQsCisJCSAqIGluc3RlYWQgb2YgZ2xvYmFsbHkuIFRoZSBiaWdnZXN0IGJsb2NrZXIgaXMgdGhlCisJCSAqIGJpb19jbG9uZSgpIGluIGJpbyBib3VuY2UuCisJCSAqCisJCSAqIElmIGJpbyBpcyBzcGxpdHRlZCBieSB0aGlzIHJlYXNvbiwgd2Ugc2hvdWxkIGhhdmUKKwkJICogYWxsb3dlZCB0byBjb250aW51ZSBiaW9zIG1lcmdpbmcsIGJ1dCBkb24ndCBkbworCQkgKiB0aGF0IG5vdyBmb3IgbWFraW5nIHRoZSBjaGFuZ2Ugc2ltcGxlLgorCQkgKgorCQkgKiBUT0RPOiBkZWFsIHdpdGggYmlvIGJvdW5jZSdzIGJpb19jbG9uZSgpIGdyYWNlZnVsbHkKKwkJICogYW5kIGNvbnZlcnQgdGhlIGdsb2JhbCBsaW1pdCBpbnRvIHBlci1xdWV1ZSBsaW1pdC4KKwkJICovCisJCWlmIChidmVjcysrID49IEJJT19NQVhfUEFHRVMpCisJCQlnb3RvIHNwbGl0OworCisJCS8qCiAJCSAqIElmIHRoZSBxdWV1ZSBkb2Vzbid0IHN1cHBvcnQgU0cgZ2FwcyBhbmQgYWRkaW5nIHRoaXMKIAkJICogb2Zmc2V0IHdvdWxkIGNyZWF0ZSBhIGdhcCwgZGlzYWxsb3cgaXQuCiAJCSAqLwpAQCAtMTcyLDEyICsxOTQsMTggQEAKIAlzdHJ1Y3QgYmlvICpzcGxpdCwgKnJlczsKIAl1bnNpZ25lZCBuc2VnczsKIAotCWlmIChiaW9fb3AoKmJpbykgPT0gUkVRX09QX0RJU0NBUkQpCisJc3dpdGNoIChiaW9fb3AoKmJpbykpIHsKKwljYXNlIFJFUV9PUF9ESVNDQVJEOgorCWNhc2UgUkVRX09QX1NFQ1VSRV9FUkFTRToKIAkJc3BsaXQgPSBibGtfYmlvX2Rpc2NhcmRfc3BsaXQocSwgKmJpbywgYnMsICZuc2Vncyk7Ci0JZWxzZSBpZiAoYmlvX29wKCpiaW8pID09IFJFUV9PUF9XUklURV9TQU1FKQorCQlicmVhazsKKwljYXNlIFJFUV9PUF9XUklURV9TQU1FOgogCQlzcGxpdCA9IGJsa19iaW9fd3JpdGVfc2FtZV9zcGxpdChxLCAqYmlvLCBicywgJm5zZWdzKTsKLQllbHNlCisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCXNwbGl0ID0gYmxrX2Jpb19zZWdtZW50X3NwbGl0KHEsICpiaW8sIHEtPmJpb19zcGxpdCwgJm5zZWdzKTsKKwkJYnJlYWs7CisJfQogCiAJLyogcGh5c2ljYWwgc2VnbWVudHMgY2FuIGJlIGZpZ3VyZWQgb3V0IGR1cmluZyBzcGxpdHRpbmcgKi8KIAlyZXMgPSBzcGxpdCA/IHNwbGl0IDogKmJpbzsKQEAgLTIxMyw3ICsyNDEsNyBAQAogCSAqIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHJldHVybmluZyAwLCBidXQgYmxrX2FkZF9yZXF1ZXN0X3BheWxvYWQoKQogCSAqIChDaHJpc3RvcGghISEhKQogCSAqLwotCWlmIChiaW9fb3AoYmlvKSA9PSBSRVFfT1BfRElTQ0FSRCkKKwlpZiAoYmlvX29wKGJpbykgPT0gUkVRX09QX0RJU0NBUkQgfHwgYmlvX29wKGJpbykgPT0gUkVRX09QX1NFQ1VSRV9FUkFTRSkKIAkJcmV0dXJuIDE7CiAKIAlpZiAoYmlvX29wKGJpbykgPT0gUkVRX09QX1dSSVRFX1NBTUUpCkBAIC0zODUsNyArNDEzLDkgQEAKIAluc2VncyA9IDA7CiAJY2x1c3RlciA9IGJsa19xdWV1ZV9jbHVzdGVyKHEpOwogCi0JaWYgKGJpb19vcChiaW8pID09IFJFUV9PUF9ESVNDQVJEKSB7CisJc3dpdGNoIChiaW9fb3AoYmlvKSkgeworCWNhc2UgUkVRX09QX0RJU0NBUkQ6CisJY2FzZSBSRVFfT1BfU0VDVVJFX0VSQVNFOgogCQkvKgogCQkgKiBUaGlzIGlzIGEgaGFjayAtIGRyaXZlcnMgc2hvdWxkIGJlIG5laXRoZXIgbW9kaWZ5aW5nIHRoZQogCQkgKiBiaW92ZWMsIG5vciByZWx5aW5nIG9uIGJpX3ZjbnQgLSBidXQgYmVjYXVzZSBvZgpAQCAtMzkzLDE5ICs0MjMsMTYgQEAKIAkJICogYSBwYXlsb2FkIHdlIG5lZWQgdG8gc2V0IHVwIGhlcmUgKHRoYW5rIHlvdSBDaHJpc3RvcGgpIGFuZAogCQkgKiBiaV92Y250IGlzIHJlYWxseSB0aGUgb25seSB3YXkgb2YgdGVsbGluZyBpZiB3ZSBuZWVkIHRvLgogCQkgKi8KLQotCQlpZiAoYmlvLT5iaV92Y250KQotCQkJZ290byBzaW5nbGVfc2VnbWVudDsKLQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoYmlvX29wKGJpbykgPT0gUkVRX09QX1dSSVRFX1NBTUUpIHsKLXNpbmdsZV9zZWdtZW50OgorCQlpZiAoIWJpby0+YmlfdmNudCkKKwkJCXJldHVybiAwOworCQkvKiBGYWxsIHRocm91Z2ggKi8KKwljYXNlIFJFUV9PUF9XUklURV9TQU1FOgogCQkqc2cgPSBzZ2xpc3Q7CiAJCWJ2ZWMgPSBiaW9faW92ZWMoYmlvKTsKIAkJc2dfc2V0X3BhZ2UoKnNnLCBidmVjLmJ2X3BhZ2UsIGJ2ZWMuYnZfbGVuLCBidmVjLmJ2X29mZnNldCk7CiAJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KIAogCWZvcl9lYWNoX2JpbyhiaW8pCmRpZmYgLS1naXQgYS9ibG9jay9ibGstbXEuYyBiL2Jsb2NrL2Jsay1tcS5jCmluZGV4IGU5MzFhMGUuLmMyMDdmYTkgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1tcS5jCisrKyBiL2Jsb2NrL2Jsay1tcS5jCkBAIC0yOTYsMTcgKzI5NiwyOSBAQAogCWlmIChyZXQpCiAJCXJldHVybiBFUlJfUFRSKHJldCk7CiAKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBoYXJkd2FyZSBjb250ZXh0IGlzIGFjdHVhbGx5IG1hcHBlZCB0byBhbnl0aGluZy4KKwkgKiBJZiBub3QgdGVsbCB0aGUgY2FsbGVyIHRoYXQgaXQgc2hvdWxkIHNraXAgdGhpcyBxdWV1ZS4KKwkgKi8KIAloY3R4ID0gcS0+cXVldWVfaHdfY3R4W2hjdHhfaWR4XTsKKwlpZiAoIWJsa19tcV9od19xdWV1ZV9tYXBwZWQoaGN0eCkpIHsKKwkJcmV0ID0gLUVYREVWOworCQlnb3RvIG91dF9xdWV1ZV9leGl0OworCX0KIAljdHggPSBfX2Jsa19tcV9nZXRfY3R4KHEsIGNwdW1hc2tfZmlyc3QoaGN0eC0+Y3B1bWFzaykpOwogCiAJYmxrX21xX3NldF9hbGxvY19kYXRhKCZhbGxvY19kYXRhLCBxLCBmbGFncywgY3R4LCBoY3R4KTsKIAlycSA9IF9fYmxrX21xX2FsbG9jX3JlcXVlc3QoJmFsbG9jX2RhdGEsIHJ3LCAwKTsKIAlpZiAoIXJxKSB7Ci0JCWJsa19xdWV1ZV9leGl0KHEpOwotCQlyZXR1cm4gRVJSX1BUUigtRVdPVUxEQkxPQ0spOworCQlyZXQgPSAtRVdPVUxEQkxPQ0s7CisJCWdvdG8gb3V0X3F1ZXVlX2V4aXQ7CiAJfQogCiAJcmV0dXJuIHJxOworCitvdXRfcXVldWVfZXhpdDoKKwlibGtfcXVldWVfZXhpdChxKTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYmxrX21xX2FsbG9jX3JlcXVlc3RfaGN0eCk7CiAKQEAgLTc5MywxMSArODA1LDEyIEBACiAJc3RydWN0IGxpc3RfaGVhZCAqZHB0cjsKIAlpbnQgcXVldWVkOwogCi0JV0FSTl9PTighY3B1bWFza190ZXN0X2NwdShyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpLCBoY3R4LT5jcHVtYXNrKSk7Ci0KIAlpZiAodW5saWtlbHkodGVzdF9iaXQoQkxLX01RX1NfU1RPUFBFRCwgJmhjdHgtPnN0YXRlKSkpCiAJCXJldHVybjsKIAorCVdBUk5fT04oIWNwdW1hc2tfdGVzdF9jcHUocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSwgaGN0eC0+Y3B1bWFzaykgJiYKKwkJY3B1X29ubGluZShoY3R4LT5uZXh0X2NwdSkpOworCiAJaGN0eC0+cnVuKys7CiAKIAkvKgpAQCAtMTAzNiwxMCArMTA0OSwxMSBAQAogRVhQT1JUX1NZTUJPTChibGtfbXFfZGVsYXlfcXVldWUpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19ibGtfbXFfaW5zZXJ0X3JlcV9saXN0KHN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4LAotCQkJCQkgICAgc3RydWN0IGJsa19tcV9jdHggKmN0eCwKIAkJCQkJICAgIHN0cnVjdCByZXF1ZXN0ICpycSwKIAkJCQkJICAgIGJvb2wgYXRfaGVhZCkKIHsKKwlzdHJ1Y3QgYmxrX21xX2N0eCAqY3R4ID0gcnEtPm1xX2N0eDsKKwogCXRyYWNlX2Jsb2NrX3JxX2luc2VydChoY3R4LT5xdWV1ZSwgcnEpOwogCiAJaWYgKGF0X2hlYWQpCkBAIC0xMDUzLDIwICsxMDY3LDE2IEBACiB7CiAJc3RydWN0IGJsa19tcV9jdHggKmN0eCA9IHJxLT5tcV9jdHg7CiAKLQlfX2Jsa19tcV9pbnNlcnRfcmVxX2xpc3QoaGN0eCwgY3R4LCBycSwgYXRfaGVhZCk7CisJX19ibGtfbXFfaW5zZXJ0X3JlcV9saXN0KGhjdHgsIHJxLCBhdF9oZWFkKTsKIAlibGtfbXFfaGN0eF9tYXJrX3BlbmRpbmcoaGN0eCwgY3R4KTsKIH0KIAogdm9pZCBibGtfbXFfaW5zZXJ0X3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxLCBib29sIGF0X2hlYWQsIGJvb2wgcnVuX3F1ZXVlLAotCQlib29sIGFzeW5jKQorCQkJICAgYm9vbCBhc3luYykKIHsKKwlzdHJ1Y3QgYmxrX21xX2N0eCAqY3R4ID0gcnEtPm1xX2N0eDsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IHJxLT5xOwogCXN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4OwotCXN0cnVjdCBibGtfbXFfY3R4ICpjdHggPSBycS0+bXFfY3R4LCAqY3VycmVudF9jdHg7Ci0KLQljdXJyZW50X2N0eCA9IGJsa19tcV9nZXRfY3R4KHEpOwotCWlmICghY3B1X29ubGluZShjdHgtPmNwdSkpCi0JCXJxLT5tcV9jdHggPSBjdHggPSBjdXJyZW50X2N0eDsKIAogCWhjdHggPSBxLT5tcV9vcHMtPm1hcF9xdWV1ZShxLCBjdHgtPmNwdSk7CiAKQEAgLTEwNzYsOCArMTA4Niw2IEBACiAKIAlpZiAocnVuX3F1ZXVlKQogCQlibGtfbXFfcnVuX2h3X3F1ZXVlKGhjdHgsIGFzeW5jKTsKLQotCWJsa19tcV9wdXRfY3R4KGN1cnJlbnRfY3R4KTsKIH0KIAogc3RhdGljIHZvaWQgYmxrX21xX2luc2VydF9yZXF1ZXN0cyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKQEAgLTEwODgsMTQgKzEwOTYsOSBAQAogCiB7CiAJc3RydWN0IGJsa19tcV9od19jdHggKmhjdHg7Ci0Jc3RydWN0IGJsa19tcV9jdHggKmN1cnJlbnRfY3R4OwogCiAJdHJhY2VfYmxvY2tfdW5wbHVnKHEsIGRlcHRoLCAhZnJvbV9zY2hlZHVsZSk7CiAKLQljdXJyZW50X2N0eCA9IGJsa19tcV9nZXRfY3R4KHEpOwotCi0JaWYgKCFjcHVfb25saW5lKGN0eC0+Y3B1KSkKLQkJY3R4ID0gY3VycmVudF9jdHg7CiAJaGN0eCA9IHEtPm1xX29wcy0+bWFwX3F1ZXVlKHEsIGN0eC0+Y3B1KTsKIAogCS8qCkBAIC0xMTA3LDE1ICsxMTEwLDE0IEBACiAJCXN0cnVjdCByZXF1ZXN0ICpycTsKIAogCQlycSA9IGxpc3RfZmlyc3RfZW50cnkobGlzdCwgc3RydWN0IHJlcXVlc3QsIHF1ZXVlbGlzdCk7CisJCUJVR19PTihycS0+bXFfY3R4ICE9IGN0eCk7CiAJCWxpc3RfZGVsX2luaXQoJnJxLT5xdWV1ZWxpc3QpOwotCQlycS0+bXFfY3R4ID0gY3R4OwotCQlfX2Jsa19tcV9pbnNlcnRfcmVxX2xpc3QoaGN0eCwgY3R4LCBycSwgZmFsc2UpOworCQlfX2Jsa19tcV9pbnNlcnRfcmVxX2xpc3QoaGN0eCwgcnEsIGZhbHNlKTsKIAl9CiAJYmxrX21xX2hjdHhfbWFya19wZW5kaW5nKGhjdHgsIGN0eCk7CiAJc3Bpbl91bmxvY2soJmN0eC0+bG9jayk7CiAKIAlibGtfbXFfcnVuX2h3X3F1ZXVlKGhjdHgsIGZyb21fc2NoZWR1bGUpOwotCWJsa19tcV9wdXRfY3R4KGN1cnJlbnRfY3R4KTsKIH0KIAogc3RhdGljIGludCBwbHVnX2N0eF9jbXAodm9pZCAqcHJpdiwgc3RydWN0IGxpc3RfaGVhZCAqYSwgc3RydWN0IGxpc3RfaGVhZCAqYikKQEAgLTE2MzAsMTYgKzE2MzIsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqICdjcHUnIGlzIGdvaW5nIGF3YXkuIHNwbGljZSBhbnkgZXhpc3RpbmcgcnFfbGlzdCBlbnRyaWVzIGZyb20gdGhpcworICogc29mdHdhcmUgcXVldWUgdG8gdGhlIGh3IHF1ZXVlIGRpc3BhdGNoIGxpc3QsIGFuZCBlbnN1cmUgdGhhdCBpdAorICogZ2V0cyBydW4uCisgKi8KIHN0YXRpYyBpbnQgYmxrX21xX2hjdHhfY3B1X29mZmxpbmUoc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgsIGludCBjcHUpCiB7Ci0Jc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBoY3R4LT5xdWV1ZTsKIAlzdHJ1Y3QgYmxrX21xX2N0eCAqY3R4OwogCUxJU1RfSEVBRCh0bXApOwogCi0JLyoKLQkgKiBNb3ZlIGN0eCBlbnRyaWVzIHRvIG5ldyBDUFUsIGlmIHRoaXMgb25lIGlzIGdvaW5nIGF3YXkuCi0JICovCi0JY3R4ID0gX19ibGtfbXFfZ2V0X2N0eChxLCBjcHUpOworCWN0eCA9IF9fYmxrX21xX2dldF9jdHgoaGN0eC0+cXVldWUsIGNwdSk7CiAKIAlzcGluX2xvY2soJmN0eC0+bG9jayk7CiAJaWYgKCFsaXN0X2VtcHR5KCZjdHgtPnJxX2xpc3QpKSB7CkBAIC0xNjUxLDI0ICsxNjU0LDExIEBACiAJaWYgKGxpc3RfZW1wdHkoJnRtcCkpCiAJCXJldHVybiBOT1RJRllfT0s7CiAKLQljdHggPSBibGtfbXFfZ2V0X2N0eChxKTsKLQlzcGluX2xvY2soJmN0eC0+bG9jayk7Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJnRtcCkpIHsKLQkJc3RydWN0IHJlcXVlc3QgKnJxOwotCi0JCXJxID0gbGlzdF9maXJzdF9lbnRyeSgmdG1wLCBzdHJ1Y3QgcmVxdWVzdCwgcXVldWVsaXN0KTsKLQkJcnEtPm1xX2N0eCA9IGN0eDsKLQkJbGlzdF9tb3ZlX3RhaWwoJnJxLT5xdWV1ZWxpc3QsICZjdHgtPnJxX2xpc3QpOwotCX0KLQotCWhjdHggPSBxLT5tcV9vcHMtPm1hcF9xdWV1ZShxLCBjdHgtPmNwdSk7Ci0JYmxrX21xX2hjdHhfbWFya19wZW5kaW5nKGhjdHgsIGN0eCk7Ci0KLQlzcGluX3VubG9jaygmY3R4LT5sb2NrKTsKKwlzcGluX2xvY2soJmhjdHgtPmxvY2spOworCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmdG1wLCAmaGN0eC0+ZGlzcGF0Y2gpOworCXNwaW5fdW5sb2NrKCZoY3R4LT5sb2NrKTsKIAogCWJsa19tcV9ydW5faHdfcXVldWUoaGN0eCwgdHJ1ZSk7Ci0JYmxrX21xX3B1dF9jdHgoY3R4KTsKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCmRpZmYgLS1naXQgYS9ibG9jay9ibGstc29mdGlycS5jIGIvYmxvY2svYmxrLXNvZnRpcnEuYwppbmRleCA1M2IxNzM3Li45NjYzMWU2IDEwMDY0NAotLS0gYS9ibG9jay9ibGstc29mdGlycS5jCisrKyBiL2Jsb2NrL2Jsay1zb2Z0aXJxLmMKQEAgLTc4LDMwICs3OCwyMSBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgYmxrX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKLQkJCSAgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgYmxrX3NvZnRpcnFfY3B1X2RlYWQodW5zaWduZWQgaW50IGNwdSkKIHsKIAkvKgogCSAqIElmIGEgQ1BVIGdvZXMgYXdheSwgc3BsaWNlIGl0cyBlbnRyaWVzIHRvIHRoZSBjdXJyZW50IENQVQogCSAqIGFuZCB0cmlnZ2VyIGEgcnVuIG9mIHRoZSBzb2Z0aXJxCiAJICovCi0JaWYgKGFjdGlvbiA9PSBDUFVfREVBRCB8fCBhY3Rpb24gPT0gQ1BVX0RFQURfRlJPWkVOKSB7Ci0JCWludCBjcHUgPSAodW5zaWduZWQgbG9uZykgaGNwdTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWxpc3Rfc3BsaWNlX2luaXQoJnBlcl9jcHUoYmxrX2NwdV9kb25lLCBjcHUpLAorCQkJIHRoaXNfY3B1X3B0cigmYmxrX2NwdV9kb25lKSk7CisJcmFpc2Vfc29mdGlycV9pcnFvZmYoQkxPQ0tfU09GVElSUSk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOwogCi0JCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCWxpc3Rfc3BsaWNlX2luaXQoJnBlcl9jcHUoYmxrX2NwdV9kb25lLCBjcHUpLAotCQkJCSB0aGlzX2NwdV9wdHIoJmJsa19jcHVfZG9uZSkpOwotCQlyYWlzZV9zb2Z0aXJxX2lycW9mZihCTE9DS19TT0ZUSVJRKTsKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCX0KLQotCXJldHVybiBOT1RJRllfT0s7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYmxrX2NwdV9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbAk9IGJsa19jcHVfbm90aWZ5LAotfTsKLQogdm9pZCBfX2Jsa19jb21wbGV0ZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpyZXEpCiB7CiAJaW50IGNjcHUsIGNwdTsKQEAgLTE4MCw3ICsxNzEsOSBAQAogCQlJTklUX0xJU1RfSEVBRCgmcGVyX2NwdShibGtfY3B1X2RvbmUsIGkpKTsKIAogCW9wZW5fc29mdGlycShCTE9DS19TT0ZUSVJRLCBibGtfZG9uZV9zb2Z0aXJxKTsKLQlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJmJsa19jcHVfbm90aWZpZXIpOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQkxPQ0tfU09GVElSUV9ERUFELAorCQkJCSAgImJsb2NrL3NvZnRpcnE6ZGVhZCIsIE5VTEwsCisJCQkJICBibGtfc29mdGlycV9jcHVfZGVhZCk7CiAJcmV0dXJuIDA7CiB9CiBzdWJzeXNfaW5pdGNhbGwoYmxrX3NvZnRpcnFfaW5pdCk7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstdGhyb3R0bGUuYyBiL2Jsb2NrL2Jsay10aHJvdHRsZS5jCmluZGV4IGYxYWJhMjYuLmEzZWE4MjYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay10aHJvdHRsZS5jCisrKyBiL2Jsb2NrL2Jsay10aHJvdHRsZS5jCkBAIC03ODAsOSArNzgwLDExIEBACiAJLyoKIAkgKiBJZiBwcmV2aW91cyBzbGljZSBleHBpcmVkLCBzdGFydCBhIG5ldyBvbmUgb3RoZXJ3aXNlIHJlbmV3L2V4dGVuZAogCSAqIGV4aXN0aW5nIHNsaWNlIHRvIG1ha2Ugc3VyZSBpdCBpcyBhdCBsZWFzdCB0aHJvdGxfc2xpY2UgaW50ZXJ2YWwKLQkgKiBsb25nIHNpbmNlIG5vdy4KKwkgKiBsb25nIHNpbmNlIG5vdy4gTmV3IHNsaWNlIGlzIHN0YXJ0ZWQgb25seSBmb3IgZW1wdHkgdGhyb3R0bGUgZ3JvdXAuCisJICogSWYgdGhlcmUgaXMgcXVldWVkIGJpbywgdGhhdCBtZWFucyB0aGVyZSBzaG91bGQgYmUgYW4gYWN0aXZlCisJICogc2xpY2UgYW5kIGl0IHNob3VsZCBiZSBleHRlbmRlZCBpbnN0ZWFkLgogCSAqLwotCWlmICh0aHJvdGxfc2xpY2VfdXNlZCh0ZywgcncpKQorCWlmICh0aHJvdGxfc2xpY2VfdXNlZCh0ZywgcncpICYmICEodGctPnNlcnZpY2VfcXVldWUubnJfcXVldWVkW3J3XSkpCiAJCXRocm90bF9zdGFydF9uZXdfc2xpY2UodGcsIHJ3KTsKIAllbHNlIHsKIAkJaWYgKHRpbWVfYmVmb3JlKHRnLT5zbGljZV9lbmRbcnddLCBqaWZmaWVzICsgdGhyb3RsX3NsaWNlKSkKZGlmZiAtLWdpdCBhL2Jsb2NrL2VsZXZhdG9yLmMgYi9ibG9jay9lbGV2YXRvci5jCmluZGV4IDcwOTZjMjIuLmY3ZDk3M2EgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2VsZXZhdG9yLmMKKysrIGIvYmxvY2svZWxldmF0b3IuYwpAQCAtMzY2LDcgKzM2Niw3IEBACiAJbGlzdF9mb3JfZWFjaF9wcmV2KGVudHJ5LCAmcS0+cXVldWVfaGVhZCkgewogCQlzdHJ1Y3QgcmVxdWVzdCAqcG9zID0gbGlzdF9lbnRyeV9ycShlbnRyeSk7CiAKLQkJaWYgKChyZXFfb3AocnEpID09IFJFUV9PUF9ESVNDQVJEKSAhPSAocmVxX29wKHBvcykgPT0gUkVRX09QX0RJU0NBUkQpKQorCQlpZiAocmVxX29wKHJxKSAhPSByZXFfb3AocG9zKSkKIAkJCWJyZWFrOwogCQlpZiAocnFfZGF0YV9kaXIocnEpICE9IHJxX2RhdGFfZGlyKHBvcykpCiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2NyeXB0by9LY29uZmlnIGIvY3J5cHRvL0tjb25maWcKaW5kZXggYTkzNzdiZS4uODRkNzE0OCAxMDA2NDQKLS0tIGEvY3J5cHRvL0tjb25maWcKKysrIGIvY3J5cHRvL0tjb25maWcKQEAgLTQzOSw3ICs0MzksNyBAQAogCiBjb25maWcgQ1JZUFRfQ1JDMzJDX1ZQTVNVTQogCXRyaXN0YXRlICJDUkMzMmMgQ1JDIGFsZ29yaXRobSAocG93ZXJwYzY0KSIKLQlkZXBlbmRzIG9uIFBQQzY0CisJZGVwZW5kcyBvbiBQUEM2NCAmJiBBTFRJVkVDCiAJc2VsZWN0IENSWVBUT19IQVNICiAJc2VsZWN0IENSQzMyCiAJaGVscApkaWZmIC0tZ2l0IGEvY3J5cHRvL2Jsa2NpcGhlci5jIGIvY3J5cHRvL2Jsa2NpcGhlci5jCmluZGV4IDM2OTk5OTUuLmE4MzI0MjYgMTAwNjQ0Ci0tLSBhL2NyeXB0by9ibGtjaXBoZXIuYworKysgYi9jcnlwdG8vYmxrY2lwaGVyLmMKQEAgLTIzMyw2ICsyMzMsOCBAQAogCQlyZXR1cm4gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCAtRUlOVkFMKTsKIAl9CiAKKwlic2l6ZSA9IG1pbih3YWxrLT53YWxrX2Jsb2Nrc2l6ZSwgbik7CisKIAl3YWxrLT5mbGFncyAmPSB+KEJMS0NJUEhFUl9XQUxLX1NMT1cgfCBCTEtDSVBIRVJfV0FMS19DT1BZIHwKIAkJCSBCTEtDSVBIRVJfV0FMS19ESUZGKTsKIAlpZiAoIXNjYXR0ZXJ3YWxrX2FsaWduZWQoJndhbGstPmluLCB3YWxrLT5hbGlnbm1hc2spIHx8CkBAIC0yNDUsNyArMjQ3LDYgQEAKIAkJfQogCX0KIAotCWJzaXplID0gbWluKHdhbGstPndhbGtfYmxvY2tzaXplLCBuKTsKIAluID0gc2NhdHRlcndhbGtfY2xhbXAoJndhbGstPmluLCBuKTsKIAluID0gc2NhdHRlcndhbGtfY2xhbXAoJndhbGstPm91dCwgbik7CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9jcnlwdGQuYyBiL2NyeXB0by9jcnlwdGQuYwppbmRleCBjZjgwMzdhLi4wYzY1NGU1IDEwMDY0NAotLS0gYS9jcnlwdG8vY3J5cHRkLmMKKysrIGIvY3J5cHRvL2NyeXB0ZC5jCkBAIC02MzEsOSArNjMxLDE0IEBACiAKIHN0YXRpYyBpbnQgY3J5cHRkX2hhc2hfaW1wb3J0KHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEsIGNvbnN0IHZvaWQgKmluKQogewotCXN0cnVjdCBjcnlwdGRfaGFzaF9yZXF1ZXN0X2N0eCAqcmN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJc3RydWN0IGNyeXB0b19haGFzaCAqdGZtID0gY3J5cHRvX2FoYXNoX3JlcXRmbShyZXEpOworCXN0cnVjdCBjcnlwdGRfaGFzaF9jdHggKmN0eCA9IGNyeXB0b19haGFzaF9jdHgodGZtKTsKKwlzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYyA9IGNyeXB0ZF9zaGFzaF9kZXNjKHJlcSk7CiAKLQlyZXR1cm4gY3J5cHRvX3NoYXNoX2ltcG9ydCgmcmN0eC0+ZGVzYywgaW4pOworCWRlc2MtPnRmbSA9IGN0eC0+Y2hpbGQ7CisJZGVzYy0+ZmxhZ3MgPSByZXEtPmJhc2UuZmxhZ3M7CisKKwlyZXR1cm4gY3J5cHRvX3NoYXNoX2ltcG9ydChkZXNjLCBpbik7CiB9CiAKIHN0YXRpYyBpbnQgY3J5cHRkX2NyZWF0ZV9oYXNoKHN0cnVjdCBjcnlwdG9fdGVtcGxhdGUgKnRtcGwsIHN0cnVjdCBydGF0dHIgKip0YiwKQEAgLTczMywxMyArNzM4LDE0IEBACiAJcmN0eCA9IGFlYWRfcmVxdWVzdF9jdHgocmVxKTsKIAljb21wbCA9IHJjdHgtPmNvbXBsZXRlOwogCisJdGZtID0gY3J5cHRvX2FlYWRfcmVxdGZtKHJlcSk7CisKIAlpZiAodW5saWtlbHkoZXJyID09IC1FSU5QUk9HUkVTUykpCiAJCWdvdG8gb3V0OwogCWFlYWRfcmVxdWVzdF9zZXRfdGZtKHJlcSwgY2hpbGQpOwogCWVyciA9IGNyeXB0KCByZXEgKTsKIAogb3V0OgotCXRmbSA9IGNyeXB0b19hZWFkX3JlcXRmbShyZXEpOwogCWN0eCA9IGNyeXB0b19hZWFkX2N0eCh0Zm0pOwogCXJlZmNudCA9IGF0b21pY19yZWFkKCZjdHgtPnJlZmNudCk7CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9lY2hhaW5pdi5jIGIvY3J5cHRvL2VjaGFpbml2LmMKaW5kZXggMWIwMWZlOS4uZTNkODg5YiAxMDA2NDQKLS0tIGEvY3J5cHRvL2VjaGFpbml2LmMKKysrIGIvY3J5cHRvL2VjaGFpbml2LmMKQEAgLTEsOCArMSw4IEBACiAvKgogICogZWNoYWluaXY6IEVuY3J5cHRlZCBDaGFpbiBJViBHZW5lcmF0b3IKICAqCi0gKiBUaGlzIGdlbmVyYXRvciBnZW5lcmF0ZXMgYW4gSVYgYmFzZWQgb24gYSBzZXF1ZW5jZSBudW1iZXIgYnkgeG9yaW5nIGl0Ci0gKiB3aXRoIGEgc2FsdCBhbmQgdGhlbiBlbmNyeXB0aW5nIGl0IHdpdGggdGhlIHNhbWUga2V5IGFzIHVzZWQgdG8gZW5jcnlwdAorICogVGhpcyBnZW5lcmF0b3IgZ2VuZXJhdGVzIGFuIElWIGJhc2VkIG9uIGEgc2VxdWVuY2UgbnVtYmVyIGJ5IG11bHRpcGx5aW5nCisgKiBpdCB3aXRoIGEgc2FsdCBhbmQgdGhlbiBlbmNyeXB0aW5nIGl0IHdpdGggdGhlIHNhbWUga2V5IGFzIHVzZWQgdG8gZW5jcnlwdAogICogdGhlIHBsYWluIHRleHQuICBUaGlzIGFsZ29yaXRobSByZXF1aXJlcyB0aGF0IHRoZSBibG9jayBzaXplIGJlIGVxdWFsCiAgKiB0byB0aGUgSVYgc2l6ZS4gIEl0IGlzIG1haW5seSB1c2VmdWwgZm9yIENCQy4KICAqCkBAIC0yNCw4MSArMjQsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIAotI2RlZmluZSBNQVhfSVZfU0laRSAxNgotCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUodTMyIFtNQVhfSVZfU0laRSAvIHNpemVvZih1MzIpXSwgZWNoYWluaXZfaXYpOwotCi0vKiBXZSBkb24ndCBjYXJlIGlmIHdlIGdldCBwcmVlbXB0ZWQgYW5kIHJlYWQvd3JpdGUgSVZzIGZyb20gdGhlIG5leHQgQ1BVLiAqLwotc3RhdGljIHZvaWQgZWNoYWluaXZfcmVhZF9pdih1OCAqZHN0LCB1bnNpZ25lZCBzaXplKQotewotCXUzMiAqYSA9ICh1MzIgKilkc3Q7Ci0JdTMyIF9fcGVyY3B1ICpiID0gZWNoYWluaXZfaXY7Ci0KLQlmb3IgKDsgc2l6ZSA+PSA0OyBzaXplIC09IDQpIHsKLQkJKmErKyA9IHRoaXNfY3B1X3JlYWQoKmIpOwotCQliKys7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBlY2hhaW5pdl93cml0ZV9pdihjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBzaXplKQotewotCWNvbnN0IHUzMiAqYSA9IChjb25zdCB1MzIgKilzcmM7Ci0JdTMyIF9fcGVyY3B1ICpiID0gZWNoYWluaXZfaXY7Ci0KLQlmb3IgKDsgc2l6ZSA+PSA0OyBzaXplIC09IDQpIHsKLQkJdGhpc19jcHVfd3JpdGUoKmIsICphKTsKLQkJYSsrOwotCQliKys7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBlY2hhaW5pdl9lbmNyeXB0X2NvbXBsZXRlMihzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEsIGludCBlcnIpCi17Ci0Jc3RydWN0IGFlYWRfcmVxdWVzdCAqc3VicmVxID0gYWVhZF9yZXF1ZXN0X2N0eChyZXEpOwotCXN0cnVjdCBjcnlwdG9fYWVhZCAqZ2VuaXY7Ci0JdW5zaWduZWQgaW50IGl2c2l6ZTsKLQotCWlmIChlcnIgPT0gLUVJTlBST0dSRVNTKQotCQlyZXR1cm47Ci0KLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQotCWdlbml2ID0gY3J5cHRvX2FlYWRfcmVxdGZtKHJlcSk7Ci0JaXZzaXplID0gY3J5cHRvX2FlYWRfaXZzaXplKGdlbml2KTsKLQotCWVjaGFpbml2X3dyaXRlX2l2KHN1YnJlcS0+aXYsIGl2c2l6ZSk7Ci0KLQlpZiAocmVxLT5pdiAhPSBzdWJyZXEtPml2KQotCQltZW1jcHkocmVxLT5pdiwgc3VicmVxLT5pdiwgaXZzaXplKTsKLQotb3V0OgotCWlmIChyZXEtPml2ICE9IHN1YnJlcS0+aXYpCi0JCWt6ZnJlZShzdWJyZXEtPml2KTsKLX0KLQotc3RhdGljIHZvaWQgZWNoYWluaXZfZW5jcnlwdF9jb21wbGV0ZShzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKmJhc2UsCi0JCQkJCSBpbnQgZXJyKQotewotCXN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSA9IGJhc2UtPmRhdGE7Ci0KLQllY2hhaW5pdl9lbmNyeXB0X2NvbXBsZXRlMihyZXEsIGVycik7Ci0JYWVhZF9yZXF1ZXN0X2NvbXBsZXRlKHJlcSwgZXJyKTsKLX0KLQogc3RhdGljIGludCBlY2hhaW5pdl9lbmNyeXB0KHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSkKIHsKIAlzdHJ1Y3QgY3J5cHRvX2FlYWQgKmdlbml2ID0gY3J5cHRvX2FlYWRfcmVxdGZtKHJlcSk7CiAJc3RydWN0IGFlYWRfZ2VuaXZfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgoZ2VuaXYpOwogCXN0cnVjdCBhZWFkX3JlcXVlc3QgKnN1YnJlcSA9IGFlYWRfcmVxdWVzdF9jdHgocmVxKTsKLQljcnlwdG9fY29tcGxldGlvbl90IGNvbXBsOwotCXZvaWQgKmRhdGE7CisJX19iZTY0IG5zZXFubzsKKwl1NjQgc2Vxbm87CiAJdTggKmluZm87CiAJdW5zaWduZWQgaW50IGl2c2l6ZSA9IGNyeXB0b19hZWFkX2l2c2l6ZShnZW5pdik7CiAJaW50IGVycjsKQEAgLTEwOCw4ICs0NCw2IEBACiAKIAlhZWFkX3JlcXVlc3Rfc2V0X3RmbShzdWJyZXEsIGN0eC0+Y2hpbGQpOwogCi0JY29tcGwgPSBlY2hhaW5pdl9lbmNyeXB0X2NvbXBsZXRlOwotCWRhdGEgPSByZXE7CiAJaW5mbyA9IHJlcS0+aXY7CiAKIAlpZiAocmVxLT5zcmMgIT0gcmVxLT5kc3QpIHsKQEAgLTEyNywyOSArNjEsMzAgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCi0JaWYgKHVubGlrZWx5KCFJU19BTElHTkVEKCh1bnNpZ25lZCBsb25nKWluZm8sCi0JCQkJIGNyeXB0b19hZWFkX2FsaWdubWFzayhnZW5pdikgKyAxKSkpIHsKLQkJaW5mbyA9IGttYWxsb2MoaXZzaXplLCByZXEtPmJhc2UuZmxhZ3MgJgotCQkJCSAgICAgICBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVAgPyBHRlBfS0VSTkVMOgotCQkJCQkJCQkgIEdGUF9BVE9NSUMpOwotCQlpZiAoIWluZm8pCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQltZW1jcHkoaW5mbywgcmVxLT5pdiwgaXZzaXplKTsKLQl9Ci0KLQlhZWFkX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKHN1YnJlcSwgcmVxLT5iYXNlLmZsYWdzLCBjb21wbCwgZGF0YSk7CisJYWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhzdWJyZXEsIHJlcS0+YmFzZS5mbGFncywKKwkJCQkgIHJlcS0+YmFzZS5jb21wbGV0ZSwgcmVxLT5iYXNlLmRhdGEpOwogCWFlYWRfcmVxdWVzdF9zZXRfY3J5cHQoc3VicmVxLCByZXEtPmRzdCwgcmVxLT5kc3QsCiAJCQkgICAgICAgcmVxLT5jcnlwdGxlbiwgaW5mbyk7CiAJYWVhZF9yZXF1ZXN0X3NldF9hZChzdWJyZXEsIHJlcS0+YXNzb2NsZW4pOwogCi0JY3J5cHRvX3hvcihpbmZvLCBjdHgtPnNhbHQsIGl2c2l6ZSk7Ci0Jc2NhdHRlcndhbGtfbWFwX2FuZF9jb3B5KGluZm8sIHJlcS0+ZHN0LCByZXEtPmFzc29jbGVuLCBpdnNpemUsIDEpOwotCWVjaGFpbml2X3JlYWRfaXYoaW5mbywgaXZzaXplKTsKKwltZW1jcHkoJm5zZXFubywgaW5mbyArIGl2c2l6ZSAtIDgsIDgpOworCXNlcW5vID0gYmU2NF90b19jcHUobnNlcW5vKTsKKwltZW1zZXQoaW5mbywgMCwgaXZzaXplKTsKIAotCWVyciA9IGNyeXB0b19hZWFkX2VuY3J5cHQoc3VicmVxKTsKLQllY2hhaW5pdl9lbmNyeXB0X2NvbXBsZXRlMihyZXEsIGVycik7Ci0JcmV0dXJuIGVycjsKKwlzY2F0dGVyd2Fsa19tYXBfYW5kX2NvcHkoaW5mbywgcmVxLT5kc3QsIHJlcS0+YXNzb2NsZW4sIGl2c2l6ZSwgMSk7CisKKwlkbyB7CisJCXU2NCBhOworCisJCW1lbWNweSgmYSwgY3R4LT5zYWx0ICsgaXZzaXplIC0gOCwgOCk7CisKKwkJYSB8PSAxOworCQlhICo9IHNlcW5vOworCisJCW1lbWNweShpbmZvICsgaXZzaXplIC0gOCwgJmEsIDgpOworCX0gd2hpbGUgKChpdnNpemUgLT0gOCkpOworCisJcmV0dXJuIGNyeXB0b19hZWFkX2VuY3J5cHQoc3VicmVxKTsKIH0KIAogc3RhdGljIGludCBlY2hhaW5pdl9kZWNyeXB0KHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSkKQEAgLTE5Niw4ICsxMzEsNyBAQAogCWFsZyA9IGNyeXB0b19zcGF3bl9hZWFkX2FsZyhzcGF3bik7CiAKIAllcnIgPSAtRUlOVkFMOwotCWlmIChpbnN0LT5hbGcuaXZzaXplICYgKHNpemVvZih1MzIpIC0gMSkgfHwKLQkgICAgaW5zdC0+YWxnLml2c2l6ZSA+IE1BWF9JVl9TSVpFKQorCWlmIChpbnN0LT5hbGcuaXZzaXplICYgKHNpemVvZih1NjQpIC0gMSkgfHwgIWluc3QtPmFsZy5pdnNpemUpCiAJCWdvdG8gZnJlZV9pbnN0OwogCiAJaW5zdC0+YWxnLmVuY3J5cHQgPSBlY2hhaW5pdl9lbmNyeXB0OwpAQCAtMjA2LDcgKzE0MCw2IEBACiAJaW5zdC0+YWxnLmluaXQgPSBhZWFkX2luaXRfZ2VuaXY7CiAJaW5zdC0+YWxnLmV4aXQgPSBhZWFkX2V4aXRfZ2VuaXY7CiAKLQlpbnN0LT5hbGcuYmFzZS5jcmFfYWxpZ25tYXNrIHw9IF9fYWxpZ25vZl9fKHUzMikgLSAxOwogCWluc3QtPmFsZy5iYXNlLmNyYV9jdHhzaXplID0gc2l6ZW9mKHN0cnVjdCBhZWFkX2dlbml2X2N0eCk7CiAJaW5zdC0+YWxnLmJhc2UuY3JhX2N0eHNpemUgKz0gaW5zdC0+YWxnLml2c2l6ZTsKIApkaWZmIC0tZ2l0IGEvY3J5cHRvL3JzYS1wa2NzMXBhZC5jIGIvY3J5cHRvL3JzYS1wa2NzMXBhZC5jCmluZGV4IDg3NzAxOWEuLjhiYWFiNDMgMTAwNjQ0Ci0tLSBhL2NyeXB0by9yc2EtcGtjczFwYWQuYworKysgYi9jcnlwdG8vcnNhLXBrY3MxcGFkLmMKQEAgLTI5OCw0MSArMjk4LDQ4IEBACiAJc3RydWN0IGNyeXB0b19ha2NpcGhlciAqdGZtID0gY3J5cHRvX2FrY2lwaGVyX3JlcXRmbShyZXEpOwogCXN0cnVjdCBwa2NzMXBhZF9jdHggKmN0eCA9IGFrY2lwaGVyX3RmbV9jdHgodGZtKTsKIAlzdHJ1Y3QgcGtjczFwYWRfcmVxdWVzdCAqcmVxX2N0eCA9IGFrY2lwaGVyX3JlcXVlc3RfY3R4KHJlcSk7CisJdW5zaWduZWQgaW50IGRzdF9sZW47CiAJdW5zaWduZWQgaW50IHBvczsKLQotCWlmIChlcnIgPT0gLUVPVkVSRkxPVykKLQkJLyogRGVjcnlwdGVkIHZhbHVlIGhhZCBubyBsZWFkaW5nIDAgYnl0ZSAqLwotCQllcnIgPSAtRUlOVkFMOworCXU4ICpvdXRfYnVmOwogCiAJaWYgKGVycikKIAkJZ290byBkb25lOwogCi0JaWYgKHJlcV9jdHgtPmNoaWxkX3JlcS5kc3RfbGVuICE9IGN0eC0+a2V5X3NpemUgLSAxKSB7Ci0JCWVyciA9IC1FSU5WQUw7CisJZXJyID0gLUVJTlZBTDsKKwlkc3RfbGVuID0gcmVxX2N0eC0+Y2hpbGRfcmVxLmRzdF9sZW47CisJaWYgKGRzdF9sZW4gPCBjdHgtPmtleV9zaXplIC0gMSkKIAkJZ290byBkb25lOworCisJb3V0X2J1ZiA9IHJlcV9jdHgtPm91dF9idWY7CisJaWYgKGRzdF9sZW4gPT0gY3R4LT5rZXlfc2l6ZSkgeworCQlpZiAob3V0X2J1ZlswXSAhPSAweDAwKQorCQkJLyogRGVjcnlwdGVkIHZhbHVlIGhhZCBubyBsZWFkaW5nIDAgYnl0ZSAqLworCQkJZ290byBkb25lOworCisJCWRzdF9sZW4tLTsKKwkJb3V0X2J1ZisrOwogCX0KIAotCWlmIChyZXFfY3R4LT5vdXRfYnVmWzBdICE9IDB4MDIpIHsKLQkJZXJyID0gLUVJTlZBTDsKKwlpZiAob3V0X2J1ZlswXSAhPSAweDAyKQogCQlnb3RvIGRvbmU7Ci0JfQotCWZvciAocG9zID0gMTsgcG9zIDwgcmVxX2N0eC0+Y2hpbGRfcmVxLmRzdF9sZW47IHBvcysrKQotCQlpZiAocmVxX2N0eC0+b3V0X2J1Zltwb3NdID09IDB4MDApCisKKwlmb3IgKHBvcyA9IDE7IHBvcyA8IGRzdF9sZW47IHBvcysrKQorCQlpZiAob3V0X2J1Zltwb3NdID09IDB4MDApCiAJCQlicmVhazsKLQlpZiAocG9zIDwgOSB8fCBwb3MgPT0gcmVxX2N0eC0+Y2hpbGRfcmVxLmRzdF9sZW4pIHsKLQkJZXJyID0gLUVJTlZBTDsKKwlpZiAocG9zIDwgOSB8fCBwb3MgPT0gZHN0X2xlbikKIAkJZ290byBkb25lOwotCX0KIAlwb3MrKzsKIAotCWlmIChyZXEtPmRzdF9sZW4gPCByZXFfY3R4LT5jaGlsZF9yZXEuZHN0X2xlbiAtIHBvcykKKwllcnIgPSAwOworCisJaWYgKHJlcS0+ZHN0X2xlbiA8IGRzdF9sZW4gLSBwb3MpCiAJCWVyciA9IC1FT1ZFUkZMT1c7Ci0JcmVxLT5kc3RfbGVuID0gcmVxX2N0eC0+Y2hpbGRfcmVxLmRzdF9sZW4gLSBwb3M7CisJcmVxLT5kc3RfbGVuID0gZHN0X2xlbiAtIHBvczsKIAogCWlmICghZXJyKQogCQlzZ19jb3B5X2Zyb21fYnVmZmVyKHJlcS0+ZHN0LAogCQkJCXNnX25lbnRzX2Zvcl9sZW4ocmVxLT5kc3QsIHJlcS0+ZHN0X2xlbiksCi0JCQkJcmVxX2N0eC0+b3V0X2J1ZiArIHBvcywgcmVxLT5kc3RfbGVuKTsKKwkJCQlvdXRfYnVmICsgcG9zLCByZXEtPmRzdF9sZW4pOwogCiBkb25lOgogCWt6ZnJlZShyZXFfY3R4LT5vdXRfYnVmKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9zaGEzX2dlbmVyaWMuYyBiL2NyeXB0by9zaGEzX2dlbmVyaWMuYwppbmRleCA2MjI2NDM5Li43ZThlZDk2IDEwMDY0NAotLS0gYS9jcnlwdG8vc2hhM19nZW5lcmljLmMKKysrIGIvY3J5cHRvL3NoYTNfZ2VuZXJpYy5jCkBAIC0yNCwxNCArMjQsMTQgQEAKICNkZWZpbmUgUk9UTDY0KHgsIHkpICgoKHgpIDw8ICh5KSkgfCAoKHgpID4+ICg2NCAtICh5KSkpKQogCiBzdGF0aWMgY29uc3QgdTY0IGtlY2Nha2Zfcm5kY1syNF0gPSB7Ci0JMHgwMDAwMDAwMDAwMDAwMDAxLCAweDAwMDAwMDAwMDAwMDgwODIsIDB4ODAwMDAwMDAwMDAwODA4YSwKLQkweDgwMDAwMDAwODAwMDgwMDAsIDB4MDAwMDAwMDAwMDAwODA4YiwgMHgwMDAwMDAwMDgwMDAwMDAxLAotCTB4ODAwMDAwMDA4MDAwODA4MSwgMHg4MDAwMDAwMDAwMDA4MDA5LCAweDAwMDAwMDAwMDAwMDAwOGEsCi0JMHgwMDAwMDAwMDAwMDAwMDg4LCAweDAwMDAwMDAwODAwMDgwMDksIDB4MDAwMDAwMDA4MDAwMDAwYSwKLQkweDAwMDAwMDAwODAwMDgwOGIsIDB4ODAwMDAwMDAwMDAwMDA4YiwgMHg4MDAwMDAwMDAwMDA4MDg5LAotCTB4ODAwMDAwMDAwMDAwODAwMywgMHg4MDAwMDAwMDAwMDA4MDAyLCAweDgwMDAwMDAwMDAwMDAwODAsCi0JMHgwMDAwMDAwMDAwMDA4MDBhLCAweDgwMDAwMDAwODAwMDAwMGEsIDB4ODAwMDAwMDA4MDAwODA4MSwKLQkweDgwMDAwMDAwMDAwMDgwODAsIDB4MDAwMDAwMDA4MDAwMDAwMSwgMHg4MDAwMDAwMDgwMDA4MDA4CisJMHgwMDAwMDAwMDAwMDAwMDAxVUxMLCAweDAwMDAwMDAwMDAwMDgwODJVTEwsIDB4ODAwMDAwMDAwMDAwODA4YVVMTCwKKwkweDgwMDAwMDAwODAwMDgwMDBVTEwsIDB4MDAwMDAwMDAwMDAwODA4YlVMTCwgMHgwMDAwMDAwMDgwMDAwMDAxVUxMLAorCTB4ODAwMDAwMDA4MDAwODA4MVVMTCwgMHg4MDAwMDAwMDAwMDA4MDA5VUxMLCAweDAwMDAwMDAwMDAwMDAwOGFVTEwsCisJMHgwMDAwMDAwMDAwMDAwMDg4VUxMLCAweDAwMDAwMDAwODAwMDgwMDlVTEwsIDB4MDAwMDAwMDA4MDAwMDAwYVVMTCwKKwkweDAwMDAwMDAwODAwMDgwOGJVTEwsIDB4ODAwMDAwMDAwMDAwMDA4YlVMTCwgMHg4MDAwMDAwMDAwMDA4MDg5VUxMLAorCTB4ODAwMDAwMDAwMDAwODAwM1VMTCwgMHg4MDAwMDAwMDAwMDA4MDAyVUxMLCAweDgwMDAwMDAwMDAwMDAwODBVTEwsCisJMHgwMDAwMDAwMDAwMDA4MDBhVUxMLCAweDgwMDAwMDAwODAwMDAwMGFVTEwsIDB4ODAwMDAwMDA4MDAwODA4MVVMTCwKKwkweDgwMDAwMDAwMDAwMDgwODBVTEwsIDB4MDAwMDAwMDA4MDAwMDAwMVVMTCwgMHg4MDAwMDAwMDgwMDA4MDA4VUxMCiB9OwogCiBzdGF0aWMgY29uc3QgaW50IGtlY2Nha2Zfcm90Y1syNF0gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL01ha2VmaWxlIGIvZHJpdmVycy9NYWtlZmlsZQppbmRleCA1M2FiYjRhLi5mMGFmZGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvTWFrZWZpbGUKQEAgLTI5LDYgKzI5LDggQEAKICMgd2FzIHVzZWQgYW5kIGRvIG5vdGhpbmcgaWYgc28KIG9iai0kKENPTkZJR19QTlApCQkrPSBwbnAvCiBvYmoteQkJCQkrPSBhbWJhLworCitvYmoteQkJCQkrPSBjbGsvCiAjIE1hbnkgZHJpdmVycyB3aWxsIHdhbnQgdG8gdXNlIERNQSBzbyB0aGlzIGhhcyB0byBiZSBtYWRlIGF2YWlsYWJsZQogIyByZWFsbHkgZWFybHkuCiBvYmotJChDT05GSUdfRE1BREVWSUNFUykJKz0gZG1hLwpAQCAtMTQyLDggKzE0NCw2IEBACiBvYmotJChDT05GSUdfVkxZTlEpCQkrPSB2bHlucS8KIG9iai0kKENPTkZJR19TVEFHSU5HKQkJKz0gc3RhZ2luZy8KIG9iai15CQkJCSs9IHBsYXRmb3JtLwotI2NvbW1vbiBjbGsgY29kZQotb2JqLXkJCQkJKz0gY2xrLwogCiBvYmotJChDT05GSUdfTUFJTEJPWCkJCSs9IG1haWxib3gvCiBvYmotJChDT05GSUdfSFdTUElOTE9DSykJKz0gaHdzcGlubG9jay8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9LY29uZmlnIGIvZHJpdmVycy9hY3BpL0tjb25maWcKaW5kZXggNDQ1Y2UyOC4uNTM1ZTc4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9hY3BpL0tjb25maWcKQEAgLTc3LDYgKzc3LDkgQEAKIAogZW5kaWYKIAorY29uZmlnIEFDUElfU1BDUl9UQUJMRQorCWJvb2wKKwogY29uZmlnIEFDUElfU0xFRVAKIAlib29sCiAJZGVwZW5kcyBvbiBTVVNQRU5EIHx8IEhJQkVSTkFUSU9OCkBAIC0yMjcsNyArMjMwLDYgQEAKIGNvbmZpZyBBQ1BJX0NQUENfTElCCiAJYm9vbAogCWRlcGVuZHMgb24gQUNQSV9QUk9DRVNTT1IKLQlkZXBlbmRzIG9uICFBQ1BJX0NQVV9GUkVRX1BTUwogCXNlbGVjdCBNQUlMQk9YCiAJc2VsZWN0IFBDQwogCWhlbHAKQEAgLTQ2Miw2ICs0NjQsOSBAQAogc291cmNlICJkcml2ZXJzL2FjcGkvYXBlaS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL2FjcGkvZHB0Zi9LY29uZmlnIgogCitjb25maWcgQUNQSV9XQVRDSERPRworCWJvb2wKKwogY29uZmlnIEFDUElfRVhUTE9HCiAJdHJpc3RhdGUgIkV4dGVuZGVkIEVycm9yIExvZyBzdXBwb3J0IgogCWRlcGVuZHMgb24gWDg2X01DRSAmJiBYODZfTE9DQUxfQVBJQwpAQCAtNTIxLDQgKzUyNiw4IEBACiAJICB1c2Vyc3BhY2UuIFRoZSBjb25maWd1cmFibGUgQUNQSSBncm91cHMgd2lsbCBiZSB2aXNpYmxlIHVuZGVyCiAJICAvY29uZmlnL2FjcGksIGFzc3VtaW5nIGNvbmZpZ2ZzIGlzIG1vdW50ZWQgdW5kZXIgL2NvbmZpZy4KIAoraWYgQVJNNjQKK3NvdXJjZSAiZHJpdmVycy9hY3BpL2FybTY0L0tjb25maWciCitlbmRpZgorCiBlbmRpZgkjIEFDUEkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9NYWtlZmlsZSBiL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQppbmRleCA1YWU5ZDg1Li45ZWQwODc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9hY3BpL01ha2VmaWxlCkBAIC01Niw2ICs1Niw3IEBACiBhY3BpLSQoQ09ORklHX0FDUElfUFJPQ0ZTX1BPV0VSKSArPSBjbV9zYnMubwogYWNwaS15CQkJCSs9IGFjcGlfbHBhdC5vCiBhY3BpLSQoQ09ORklHX0FDUElfR0VORVJJQ19HU0kpICs9IGdzaS5vCithY3BpLSQoQ09ORklHX0FDUElfV0FUQ0hET0cpCSs9IGFjcGlfd2F0Y2hkb2cubwogCiAjIFRoZXNlIGFyZSAocG90ZW50aWFsbHkpIHNlcGFyYXRlIG1vZHVsZXMKIApAQCAtODEsNiArODIsNyBAQAogb2JqLSQoQ09ORklHX0FDUElfQ1VTVE9NX01FVEhPRCkrPSBjdXN0b21fbWV0aG9kLm8KIG9iai0kKENPTkZJR19BQ1BJX0JHUlQpCQkrPSBiZ3J0Lm8KIG9iai0kKENPTkZJR19BQ1BJX0NQUENfTElCKQkrPSBjcHBjX2FjcGkubworb2JqLSQoQ09ORklHX0FDUElfU1BDUl9UQUJMRSkJKz0gc3Bjci5vCiBvYmotJChDT05GSUdfQUNQSV9ERUJVR0dFUl9VU0VSKSArPSBhY3BpX2RiZy5vCiAKICMgcHJvY2Vzc29yIGhhcyBpdHMgb3duICJwcm9jZXNzb3IuIiBtb2R1bGVfcGFyYW0gbmFtZXNwYWNlCkBAIC0xMDUsMyArMTA3LDUgQEAKIAogdmlkZW8tb2JqcwkJCSs9IGFjcGlfdmlkZW8ubyB2aWRlb19kZXRlY3Qubwogb2JqLXkJCQkJKz0gZHB0Zi8KKworb2JqLSQoQ09ORklHX0FSTTY0KQkJKz0gYXJtNjQvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaV9hcGQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpX2FwZC5jCmluZGV4IDFkYWY5YzQuLmQ1OGZiZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpX2FwZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpX2FwZC5jCkBAIC00Miw2ICs0Miw3IEBACiBzdHJ1Y3QgYXBkX2RldmljZV9kZXNjIHsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGZpeGVkX2Nsa19yYXRlOworCXN0cnVjdCBwcm9wZXJ0eV9lbnRyeSAqcHJvcGVydGllczsKIAlpbnQgKCpzZXR1cCkoc3RydWN0IGFwZF9wcml2YXRlX2RhdGEgKnBkYXRhKTsKIH07CiAKQEAgLTcxLDIyICs3MiwzNSBAQAogfQogCiAjaWZkZWYgQ09ORklHX1g4Nl9BTURfUExBVEZPUk1fREVWSUNFCi1zdGF0aWMgc3RydWN0IGFwZF9kZXZpY2VfZGVzYyBjel9pMmNfZGVzYyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXBkX2RldmljZV9kZXNjIGN6X2kyY19kZXNjID0gewogCS5zZXR1cCA9IGFjcGlfYXBkX3NldHVwLAogCS5maXhlZF9jbGtfcmF0ZSA9IDEzMzAwMDAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXBkX2RldmljZV9kZXNjIGN6X3VhcnRfZGVzYyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcHJvcGVydHlfZW50cnkgdWFydF9wcm9wZXJ0aWVzW10gPSB7CisJUFJPUEVSVFlfRU5UUllfVTMyKCJyZWctaW8td2lkdGgiLCA0KSwKKwlQUk9QRVJUWV9FTlRSWV9VMzIoInJlZy1zaGlmdCIsIDIpLAorCVBST1BFUlRZX0VOVFJZX0JPT0woInNucHMsdWFydC0xNjU1MC1jb21wYXRpYmxlIiksCisJeyB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhcGRfZGV2aWNlX2Rlc2MgY3pfdWFydF9kZXNjID0gewogCS5zZXR1cCA9IGFjcGlfYXBkX3NldHVwLAogCS5maXhlZF9jbGtfcmF0ZSA9IDQ4MDAwMDAwLAorCS5wcm9wZXJ0aWVzID0gdWFydF9wcm9wZXJ0aWVzLAogfTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSTTY0Ci1zdGF0aWMgc3RydWN0IGFwZF9kZXZpY2VfZGVzYyB4Z2VuZV9pMmNfZGVzYyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXBkX2RldmljZV9kZXNjIHhnZW5lX2kyY19kZXNjID0gewogCS5zZXR1cCA9IGFjcGlfYXBkX3NldHVwLAogCS5maXhlZF9jbGtfcmF0ZSA9IDEwMDAwMDAwMCwKIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXBkX2RldmljZV9kZXNjIHZ1bGNhbl9zcGlfZGVzYyA9IHsKKwkuc2V0dXAgPSBhY3BpX2FwZF9zZXR1cCwKKwkuZml4ZWRfY2xrX3JhdGUgPSAxMzMwMDAwMDAsCit9OwogI2VuZGlmCiAKICNlbHNlCkBAIC0xMjUsNiArMTM5LDEyIEBACiAJCQlnb3RvIGVycl9vdXQ7CiAJfQogCisJaWYgKGRldl9kZXNjLT5wcm9wZXJ0aWVzKSB7CisJCXJldCA9IGRldmljZV9hZGRfcHJvcGVydGllcygmYWRldi0+ZGV2LCBkZXZfZGVzYy0+cHJvcGVydGllcyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9vdXQ7CisJfQorCiAJYWRldi0+ZHJpdmVyX2RhdGEgPSBwZGF0YTsKIAlwZGV2ID0gYWNwaV9jcmVhdGVfcGxhdGZvcm1fZGV2aWNlKGFkZXYpOwogCWlmICghSVNfRVJSX09SX05VTEwocGRldikpCkBAIC0xNDksNiArMTY5LDcgQEAKICNlbmRpZgogI2lmZGVmIENPTkZJR19BUk02NAogCXsgIkFQTUMwRDBGIiwgQVBEX0FERFIoeGdlbmVfaTJjX2Rlc2MpIH0sCisJeyAiQlJDTTkwMEQiLCBBUERfQUREUih2dWxjYW5fc3BpX2Rlc2MpIH0sCiAjZW5kaWYKIAl7IH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaV9scHNzLmMgYi9kcml2ZXJzL2FjcGkvYWNwaV9scHNzLmMKaW5kZXggMzU3YTBiOC4uNTUyMDEwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGlfbHBzcy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpX2xwc3MuYwpAQCAtNzUsNiArNzUsNyBAQAogCWNvbnN0IGNoYXIgKmNsa19jb25faWQ7CiAJdW5zaWduZWQgaW50IHBydl9vZmZzZXQ7CiAJc2l6ZV90IHBydl9zaXplX292ZXJyaWRlOworCXN0cnVjdCBwcm9wZXJ0eV9lbnRyeSAqcHJvcGVydGllczsKIAl2b2lkICgqc2V0dXApKHN0cnVjdCBscHNzX3ByaXZhdGVfZGF0YSAqcGRhdGEpOwogfTsKIApAQCAtMTYzLDExICsxNjQsMTkgQEAKIAkucHJ2X29mZnNldCA9IDB4ODAwLAogfTsKIAorc3RhdGljIHN0cnVjdCBwcm9wZXJ0eV9lbnRyeSB1YXJ0X3Byb3BlcnRpZXNbXSA9IHsKKwlQUk9QRVJUWV9FTlRSWV9VMzIoInJlZy1pby13aWR0aCIsIDQpLAorCVBST1BFUlRZX0VOVFJZX1UzMigicmVnLXNoaWZ0IiwgMiksCisJUFJPUEVSVFlfRU5UUllfQk9PTCgic25wcyx1YXJ0LTE2NTUwLWNvbXBhdGlibGUiKSwKKwl7IH0sCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGxwc3NfZGV2aWNlX2Rlc2MgbHB0X3VhcnRfZGV2X2Rlc2MgPSB7CiAJLmZsYWdzID0gTFBTU19DTEsgfCBMUFNTX0NMS19HQVRFIHwgTFBTU19DTEtfRElWSURFUiB8IExQU1NfTFRSLAogCS5jbGtfY29uX2lkID0gImJhdWRjbGsiLAogCS5wcnZfb2Zmc2V0ID0gMHg4MDAsCiAJLnNldHVwID0gbHBzc191YXJ0X3NldHVwLAorCS5wcm9wZXJ0aWVzID0gdWFydF9wcm9wZXJ0aWVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBscHNzX2RldmljZV9kZXNjIGxwdF9zZGlvX2Rldl9kZXNjID0gewpAQCAtMTg5LDYgKzE5OCw3IEBACiAJLmNsa19jb25faWQgPSAiYmF1ZGNsayIsCiAJLnBydl9vZmZzZXQgPSAweDgwMCwKIAkuc2V0dXAgPSBscHNzX3VhcnRfc2V0dXAsCisJLnByb3BlcnRpZXMgPSB1YXJ0X3Byb3BlcnRpZXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGxwc3NfZGV2aWNlX2Rlc2MgYnN3X3VhcnRfZGV2X2Rlc2MgPSB7CkBAIC0xOTcsNiArMjA3LDcgQEAKIAkuY2xrX2Nvbl9pZCA9ICJiYXVkY2xrIiwKIAkucHJ2X29mZnNldCA9IDB4ODAwLAogCS5zZXR1cCA9IGxwc3NfdWFydF9zZXR1cCwKKwkucHJvcGVydGllcyA9IHVhcnRfcHJvcGVydGllcywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbHBzc19kZXZpY2VfZGVzYyBieXRfc3BpX2Rldl9kZXNjID0gewpAQCAtNDQwLDYgKzQ1MSwxMiBAQAogCQlnb3RvIGVycl9vdXQ7CiAJfQogCisJaWYgKGRldl9kZXNjLT5wcm9wZXJ0aWVzKSB7CisJCXJldCA9IGRldmljZV9hZGRfcHJvcGVydGllcygmYWRldi0+ZGV2LCBkZXZfZGVzYy0+cHJvcGVydGllcyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9vdXQ7CisJfQorCiAJYWRldi0+ZHJpdmVyX2RhdGEgPSBwZGF0YTsKIAlwZGV2ID0gYWNwaV9jcmVhdGVfcGxhdGZvcm1fZGV2aWNlKGFkZXYpOwogCWlmICghSVNfRVJSX09SX05VTEwocGRldikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpX3BsYXRmb3JtLmMgYi9kcml2ZXJzL2FjcGkvYWNwaV9wbGF0Zm9ybS5jCmluZGV4IDE1OWY3ZjEuLmIyMDBhZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGlfcGxhdGZvcm0uYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpAQCAtMzAsNiArMzEsMjIgQEAKIAl7IiIsIDB9LAogfTsKIAorc3RhdGljIHZvaWQgYWNwaV9wbGF0Zm9ybV9maWxsX3Jlc291cmNlKHN0cnVjdCBhY3BpX2RldmljZSAqYWRldiwKKwljb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnNyYywgc3RydWN0IHJlc291cmNlICpkZXN0KQoreworCXN0cnVjdCBkZXZpY2UgKnBhcmVudDsKKworCSpkZXN0ID0gKnNyYzsKKworCS8qCisJICogSWYgdGhlIGRldmljZSBoYXMgcGFyZW50IHdlIG5lZWQgdG8gdGFrZSBpdHMgcmVzb3VyY2VzIGludG8KKwkgKiBhY2NvdW50IGFzIHdlbGwgYmVjYXVzZSB0aGlzIGRldmljZSBtaWdodCBjb25zdW1lIHBhcnQgb2YgdGhvc2UuCisJICovCisJcGFyZW50ID0gYWNwaV9nZXRfZmlyc3RfcGh5c2ljYWxfbm9kZShhZGV2LT5wYXJlbnQpOworCWlmIChwYXJlbnQgJiYgZGV2X2lzX3BjaShwYXJlbnQpKQorCQlkZXN0LT5wYXJlbnQgPSBwY2lfZmluZF9yZXNvdXJjZSh0b19wY2lfZGV2KHBhcmVudCksIGRlc3QpOworfQorCiAvKioKICAqIGFjcGlfY3JlYXRlX3BsYXRmb3JtX2RldmljZSAtIENyZWF0ZSBwbGF0Zm9ybSBkZXZpY2UgZm9yIEFDUEkgZGV2aWNlIG5vZGUKICAqIEBhZGV2OiBBQ1BJIGRldmljZSBub2RlIHRvIGNyZWF0ZSBhIHBsYXRmb3JtIGRldmljZSBmb3IuCkBAIC03MCw3ICs4Nyw4IEBACiAJCX0KIAkJY291bnQgPSAwOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlbnRyeSwgJnJlc291cmNlX2xpc3QsIG5vZGUpCi0JCQlyZXNvdXJjZXNbY291bnQrK10gPSAqcmVudHJ5LT5yZXM7CisJCQlhY3BpX3BsYXRmb3JtX2ZpbGxfcmVzb3VyY2UoYWRldiwgcmVudHJ5LT5yZXMsCisJCQkJCQkgICAgJnJlc291cmNlc1tjb3VudCsrXSk7CiAKIAkJYWNwaV9kZXZfZnJlZV9yZXNvdXJjZV9saXN0KCZyZXNvdXJjZV9saXN0KTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYyBiL2RyaXZlcnMvYWNwaS9hY3BpX3Byb2Nlc3Nvci5jCmluZGV4IGM3YmE5NDguLjNkZTNiNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpX3Byb2Nlc3Nvci5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpX3Byb2Nlc3Nvci5jCkBAIC0xODIsNiArMTgyLDExIEBACiAKIHZvaWQgX193ZWFrIGFyY2hfdW5yZWdpc3Rlcl9jcHUoaW50IGNwdSkge30KIAoraW50IF9fd2VhayBhY3BpX21hcF9jcHUybm9kZShhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBjcHUsIGludCBwaHlzaWQpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfaG90YWRkX2luaXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgc3RhOwpAQCAtMzAwLDggKzMwNSwxMSBAQAogCSAqICBFeHRyYSBQcm9jZXNzb3Igb2JqZWN0cyBtYXkgYmUgZW51bWVyYXRlZCBvbiBNUCBzeXN0ZW1zIHdpdGgKIAkgKiAgbGVzcyB0aGFuIHRoZSBtYXggIyBvZiBDUFVzLiBUaGV5IHNob3VsZCBiZSBpZ25vcmVkIF9pZmYKIAkgKiAgdGhleSBhcmUgcGh5c2ljYWxseSBub3QgcHJlc2VudC4KKwkgKgorCSAqICBOT1RFOiBFdmVuIGlmIHRoZSBwcm9jZXNzb3IgaGFzIGEgY3B1aWQsIGl0IG1heSBub3QgYmUgcHJlc2VudAorCSAqICBiZWNhdXNlIGNwdWlkIDwtPiBhcGljaWQgbWFwcGluZyBpcyBwZXJzaXN0ZW50IG5vdy4KIAkgKi8KLQlpZiAoaW52YWxpZF9sb2dpY2FsX2NwdWlkKHByLT5pZCkpIHsKKwlpZiAoaW52YWxpZF9sb2dpY2FsX2NwdWlkKHByLT5pZCkgfHwgIWNwdV9wcmVzZW50KHByLT5pZCkpIHsKIAkJaW50IHJldCA9IGFjcGlfcHJvY2Vzc29yX2hvdGFkZF9pbml0KHByKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CkBAIC01NzMsOCArNTgxLDEwMiBAQAogCS5hdHRhY2ggPSBhY3BpX3Byb2Nlc3Nvcl9jb250YWluZXJfYXR0YWNoLAogfTsKIAorLyogVGhlIG51bWJlciBvZiB0aGUgdW5pcXVlIHByb2Nlc3NvciBJRHMgKi8KK3N0YXRpYyBpbnQgbnJfdW5pcXVlX2lkcyBfX2luaXRkYXRhOworCisvKiBUaGUgbnVtYmVyIG9mIHRoZSBkdXBsaWNhdGUgcHJvY2Vzc29yIElEcyAqLworc3RhdGljIGludCBucl9kdXBsaWNhdGVfaWRzIF9faW5pdGRhdGE7CisKKy8qIFVzZWQgdG8gc3RvcmUgdGhlIHVuaXF1ZSBwcm9jZXNzb3IgSURzICovCitzdGF0aWMgaW50IHVuaXF1ZV9wcm9jZXNzb3JfaWRzW10gX19pbml0ZGF0YSA9IHsKKwlbMCAuLi4gTlJfQ1BVUyAtIDFdID0gLTEsCit9OworCisvKiBVc2VkIHRvIHN0b3JlIHRoZSBkdXBsaWNhdGUgcHJvY2Vzc29yIElEcyAqLworc3RhdGljIGludCBkdXBsaWNhdGVfcHJvY2Vzc29yX2lkc1tdIF9faW5pdGRhdGEgPSB7CisJWzAgLi4uIE5SX0NQVVMgLSAxXSA9IC0xLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHByb2Nlc3Nvcl92YWxpZGF0ZWRfaWRzX3VwZGF0ZShpbnQgcHJvY19pZCkKK3sKKwlpbnQgaTsKKworCWlmIChucl91bmlxdWVfaWRzID09IE5SX0NQVVN8fG5yX2R1cGxpY2F0ZV9pZHMgPT0gTlJfQ1BVUykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBGaXJzdGx5LCBjb21wYXJlIHRoZSBwcm9jX2lkIHdpdGggZHVwbGljYXRlIElEcywgaWYgdGhlIHByb2NfaWQgaXMKKwkgKiBhbHJlYWR5IGluIHRoZSBJRHMsIGRvIG5vdGhpbmcuCisJICovCisJZm9yIChpID0gMDsgaSA8IG5yX2R1cGxpY2F0ZV9pZHM7IGkrKykgeworCQlpZiAoZHVwbGljYXRlX3Byb2Nlc3Nvcl9pZHNbaV0gPT0gcHJvY19pZCkKKwkJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFNlY29uZGx5LCBjb21wYXJlIHRoZSBwcm9jX2lkIHdpdGggdW5pcXVlIElEcywgaWYgdGhlIHByb2NfaWQgaXMgaW4KKwkgKiB0aGUgSURzLCBwdXQgaXQgaW4gdGhlIGR1cGxpY2F0ZSBJRHMuCisJICovCisJZm9yIChpID0gMDsgaSA8IG5yX3VuaXF1ZV9pZHM7IGkrKykgeworCQlpZiAodW5pcXVlX3Byb2Nlc3Nvcl9pZHNbaV0gPT0gcHJvY19pZCkgeworCQkJZHVwbGljYXRlX3Byb2Nlc3Nvcl9pZHNbbnJfZHVwbGljYXRlX2lkc10gPSBwcm9jX2lkOworCQkJbnJfZHVwbGljYXRlX2lkcysrOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyoKKwkgKiBMYXN0bHksIHRoZSBwcm9jX2lkIGlzIGEgdW5pcXVlIElELCBwdXQgaXQgaW4gdGhlIHVuaXF1ZSBJRHMuCisJICovCisJdW5pcXVlX3Byb2Nlc3Nvcl9pZHNbbnJfdW5pcXVlX2lkc10gPSBwcm9jX2lkOworCW5yX3VuaXF1ZV9pZHMrKzsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdCBhY3BpX3Byb2Nlc3Nvcl9pZHNfd2FsayhhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkJCQkgIHUzMiBsdmwsCisJCQkJCQkgIHZvaWQgKmNvbnRleHQsCisJCQkJCQkgIHZvaWQgKipydikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vYmplY3Qgb2JqZWN0ID0geyAwIH07CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSwgJm9iamVjdCB9OworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBOVUxMLCBOVUxMLCAmYnVmZmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCWFjcGlfaGFuZGxlX2luZm8oaGFuZGxlLCAiTm90IGdldCB0aGUgcHJvY2Vzc29yIG9iamVjdFxuIik7CisJZWxzZQorCQlwcm9jZXNzb3JfdmFsaWRhdGVkX2lkc191cGRhdGUob2JqZWN0LnByb2Nlc3Nvci5wcm9jX2lkKTsKKworCXJldHVybiBBRV9PSzsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGFjcGlfcHJvY2Vzc29yX2NoZWNrX2R1cGxpY2F0ZXModm9pZCkKK3sKKwkvKiBTZWFyY2ggYWxsIHByb2Nlc3NvciBub2RlcyBpbiBBQ1BJIG5hbWVzcGFjZSAqLworCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX1BST0NFU1NPUiwgQUNQSV9ST09UX09CSkVDVCwKKwkJCQkJCUFDUElfVUlOVDMyX01BWCwKKwkJCQkJCWFjcGlfcHJvY2Vzc29yX2lkc193YWxrLAorCQkJCQkJTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK2Jvb2wgX19pbml0IGFjcGlfcHJvY2Vzc29yX3ZhbGlkYXRlX3Byb2NfaWQoaW50IHByb2NfaWQpCit7CisJaW50IGk7CisKKwkvKgorCSAqIGNvbXBhcmUgdGhlIHByb2NfaWQgd2l0aCBkdXBsaWNhdGUgSURzLCBpZiB0aGUgcHJvY19pZCBpcyBhbHJlYWR5CisJICogaW4gdGhlIGR1cGxpY2F0ZSBJRHMsIHJldHVybiB0cnVlLCBvdGhlcndpc2UsIHJldHVybiBmYWxzZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfZHVwbGljYXRlX2lkczsgaSsrKSB7CisJCWlmIChkdXBsaWNhdGVfcHJvY2Vzc29yX2lkc1tpXSA9PSBwcm9jX2lkKQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKwogdm9pZCBfX2luaXQgYWNwaV9wcm9jZXNzb3JfaW5pdCh2b2lkKQogeworCWFjcGlfcHJvY2Vzc29yX2NoZWNrX2R1cGxpY2F0ZXMoKTsKIAlhY3BpX3NjYW5fYWRkX2hhbmRsZXJfd2l0aF9ob3RwbHVnKCZwcm9jZXNzb3JfaGFuZGxlciwgInByb2Nlc3NvciIpOwogCWFjcGlfc2Nhbl9hZGRfaGFuZGxlcigmcHJvY2Vzc29yX2NvbnRhaW5lcl9oYW5kbGVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpX3dhdGNoZG9nLmMgYi9kcml2ZXJzL2FjcGkvYWNwaV93YXRjaGRvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzY2FlYmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaV93YXRjaGRvZy5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQUNQSSB3YXRjaGRvZyB0YWJsZSBwYXJzaW5nIHN1cHBvcnQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2LCBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBNaWthIFdlc3RlcmJlcmcgPG1pa2Eud2VzdGVyYmVyZ0BsaW51eC5pbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpICJBQ1BJOiB3YXRjaGRvZzogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc3lzdGVtIHNob3VsZCBwcmVmZXIgQUNQSSBiYXNlZCB3YXRjaGRvZyBpbnN0ZWFkIG9mCisgKiB0aGUgbmF0aXZlIG9uZSAod2hpY2ggYXJlIHR5cGljYWxseSB0aGUgc2FtZSBoYXJkd2FyZSkuCisgKi8KK2Jvb2wgYWNwaV9oYXNfd2F0Y2hkb2codm9pZCkKK3sKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGRyOworCisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiBBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfdGFibGVfaGVhZGVyKEFDUElfU0lHX1dEQVQsIDAsICZoZHIpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFjcGlfaGFzX3dhdGNoZG9nKTsKKwordm9pZCBfX2luaXQgYWNwaV93YXRjaGRvZ19pbml0KHZvaWQpCit7CisJY29uc3Qgc3RydWN0IGFjcGlfd2RhdF9lbnRyeSAqZW50cmllczsKKwljb25zdCBzdHJ1Y3QgYWNwaV90YWJsZV93ZGF0ICp3ZGF0OworCXN0cnVjdCBsaXN0X2hlYWQgcmVzb3VyY2VfbGlzdDsKKwlzdHJ1Y3QgcmVzb3VyY2VfZW50cnkgKnJlbnRyeTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCByZXNvdXJjZSAqcmVzb3VyY2VzOworCXNpemVfdCBucmVzb3VyY2VzID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaW50IGk7CisKKwlzdGF0dXMgPSBhY3BpX2dldF90YWJsZShBQ1BJX1NJR19XREFULCAwLAorCQkJCShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopJndkYXQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkvKiBJdCBpcyBmaW5lIGlmIHRoZXJlIGlzIG5vIFdEQVQgKi8KKwkJcmV0dXJuOworCX0KKworCS8qIFdhdGNoZG9nIGRpc2FibGVkIGJ5IEJJT1MgKi8KKwlpZiAoISh3ZGF0LT5mbGFncyAmIEFDUElfV0RBVF9FTkFCTEVEKSkKKwkJcmV0dXJuOworCisJLyogU2tpcCBsZWdhY3kgUENJIFdEVCBkZXZpY2VzICovCisJaWYgKHdkYXQtPnBjaV9zZWdtZW50ICE9IDB4ZmYgfHwgd2RhdC0+cGNpX2J1cyAhPSAweGZmIHx8CisJICAgIHdkYXQtPnBjaV9kZXZpY2UgIT0gMHhmZiB8fCB3ZGF0LT5wY2lfZnVuY3Rpb24gIT0gMHhmZikKKwkJcmV0dXJuOworCisJSU5JVF9MSVNUX0hFQUQoJnJlc291cmNlX2xpc3QpOworCisJZW50cmllcyA9IChzdHJ1Y3QgYWNwaV93ZGF0X2VudHJ5ICopKHdkYXQgKyAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgd2RhdC0+ZW50cmllczsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZ2FzOworCQlzdHJ1Y3QgcmVzb3VyY2VfZW50cnkgKnJlbnRyeTsKKwkJc3RydWN0IHJlc291cmNlIHJlczsKKwkJYm9vbCBmb3VuZDsKKworCQlnYXMgPSAmZW50cmllc1tpXS5yZWdpc3Rlcl9yZWdpb247CisKKwkJcmVzLnN0YXJ0ID0gZ2FzLT5hZGRyZXNzOworCQlpZiAoZ2FzLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZKSB7CisJCQlyZXMuZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKwkJCXJlcy5lbmQgPSByZXMuc3RhcnQgKyBBTElHTihnYXMtPmFjY2Vzc193aWR0aCwgNCk7CisJCX0gZWxzZSBpZiAoZ2FzLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8pIHsKKwkJCXJlcy5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisJCQlyZXMuZW5kID0gcmVzLnN0YXJ0ICsgZ2FzLT5hY2Nlc3Nfd2lkdGg7CisJCX0gZWxzZSB7CisJCQlwcl93YXJuKCJVbnN1cHBvcnRlZCBhZGRyZXNzIHNwYWNlOiAldVxuIiwKKwkJCQlnYXMtPnNwYWNlX2lkKTsKKwkJCWdvdG8gZmFpbF9mcmVlX3Jlc291cmNlX2xpc3Q7CisJCX0KKworCQlmb3VuZCA9IGZhbHNlOworCQlyZXNvdXJjZV9saXN0X2Zvcl9lYWNoX2VudHJ5KHJlbnRyeSwgJnJlc291cmNlX2xpc3QpIHsKKwkJCWlmIChyZXNvdXJjZV9jb250YWlucyhyZW50cnktPnJlcywgJnJlcykpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5kKSB7CisJCQlyZW50cnkgPSByZXNvdXJjZV9saXN0X2NyZWF0ZV9lbnRyeShOVUxMLCAwKTsKKwkJCWlmICghcmVudHJ5KQorCQkJCWdvdG8gZmFpbF9mcmVlX3Jlc291cmNlX2xpc3Q7CisKKwkJCSpyZW50cnktPnJlcyA9IHJlczsKKwkJCXJlc291cmNlX2xpc3RfYWRkX3RhaWwocmVudHJ5LCAmcmVzb3VyY2VfbGlzdCk7CisJCQlucmVzb3VyY2VzKys7CisJCX0KKwl9CisKKwlyZXNvdXJjZXMgPSBrY2FsbG9jKG5yZXNvdXJjZXMsIHNpemVvZigqcmVzb3VyY2VzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXNvdXJjZXMpCisJCWdvdG8gZmFpbF9mcmVlX3Jlc291cmNlX2xpc3Q7CisKKwlpID0gMDsKKwlyZXNvdXJjZV9saXN0X2Zvcl9lYWNoX2VudHJ5KHJlbnRyeSwgJnJlc291cmNlX2xpc3QpCisJCXJlc291cmNlc1tpKytdID0gKnJlbnRyeS0+cmVzOworCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoIndkYXRfd2R0IiwgUExBVEZPUk1fREVWSURfTk9ORSwKKwkJCQkJICAgICAgIHJlc291cmNlcywgbnJlc291cmNlcyk7CisJaWYgKElTX0VSUihwZGV2KSkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIHBsYXRmb3JtIGRldmljZVxuIik7CisKKwlrZnJlZShyZXNvdXJjZXMpOworCitmYWlsX2ZyZWVfcmVzb3VyY2VfbGlzdDoKKwlyZXNvdXJjZV9saXN0X2ZyZWUoJnJlc291cmNlX2xpc3QpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9NYWtlZmlsZSBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvTWFrZWZpbGUKaW5kZXggMjI3YmI3Yi4uMzJkOTNlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL01ha2VmaWxlCkBAIC0xNzUsNiArMTc1LDcgQEAKIAl1dHJlc3JjLm8JXAogCXV0c3RhdGUubwlcCiAJdXRzdHJpbmcubwlcCisJdXRzdHJ0b3VsNjQubwlcCiAJdXR4ZmFjZS5vCVwKIAl1dHhmaW5pdC5vCVwKIAl1dHhmZXJyb3IubwlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjYXBwcy5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2FwcHMuaAppbmRleCBjYTJjMDYwLi4wYmQ2MzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjYXBwcy5oCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNhcHBzLmgKQEAgLTQ0LDcgKzQ0LDkgQEAKICNpZm5kZWYgX0FDQVBQUwogI2RlZmluZSBfQUNBUFBTCiAKLSNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEFDUElfVVNFX1NUQU5EQVJEX0hFQURFUlMKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCQkJCS8qIEFDUElfVVNFX1NUQU5EQVJEX0hFQURFUlMgKi8KIAogLyogQ29tbW9uIGluZm8gZm9yIHRvb2wgc2lnbm9ucyAqLwogCkBAIC04MSwxMyArODMsMTMgQEAKIC8qIE1hY3JvcyBmb3IgdXNhZ2UgbWVzc2FnZXMgKi8KIAogI2RlZmluZSBBQ1BJX1VTQUdFX0hFQURFUih1c2FnZSkgXAotCWFjcGlfb3NfcHJpbnRmICgiVXNhZ2U6ICVzXG5PcHRpb25zOlxuIiwgdXNhZ2UpOworCXByaW50ZiAoIlVzYWdlOiAlc1xuT3B0aW9uczpcbiIsIHVzYWdlKTsKIAogI2RlZmluZSBBQ1BJX1VTQUdFX1RFWFQoZGVzY3JpcHRpb24pIFwKLQlhY3BpX29zX3ByaW50ZiAoZGVzY3JpcHRpb24pOworCXByaW50ZiAoZGVzY3JpcHRpb24pOwogCiAjZGVmaW5lIEFDUElfT1BUSU9OKG5hbWUsIGRlc2NyaXB0aW9uKSBcCi0JYWNwaV9vc19wcmludGYgKCIgJS0yMHMlc1xuIiwgbmFtZSwgZGVzY3JpcHRpb24pOworCXByaW50ZiAoIiAgJS0yMHMlc1xuIiwgbmFtZSwgZGVzY3JpcHRpb24pOwogCiAvKiBDaGVjayBmb3IgdW5leHBlY3RlZCBleGNlcHRpb25zICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNkZWJ1Zy5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2RlYnVnLmgKaW5kZXggZjY0MDRlYS4uOTQ3MzdmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2RlYnVnLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2RlYnVnLmgKQEAgLTE1NSw3ICsxNTUsNyBAQAogCiB2b2lkIGFjcGlfZGJfZGlzYXNzZW1ibGVfYW1sKGNoYXIgKnN0YXRlbWVudHMsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKLXZvaWQgYWNwaV9kYl9iYXRjaF9leGVjdXRlKGNoYXIgKmNvdW50X2FyZyk7Cit2b2lkIGFjcGlfZGJfZXZhbHVhdGVfcHJlZGVmaW5lZF9uYW1lcyh2b2lkKTsKIAogLyoKICAqIGRibmFtZXMgLSBuYW1lc3BhY2UgY29tbWFuZHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNldmVudHMuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNldmVudHMuaAppbmRleCA3N2FmOTFjLi45MmZhNDdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZXZlbnRzLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2V2ZW50cy5oCkBAIC04Niw2ICs4Niw5IEBACiBhY3BpX3N0YXR1cyBhY3BpX2V2X2VuYWJsZV9ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKTsKIAogYWNwaV9zdGF0dXMKK2FjcGlfZXZfbWFza19ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLCB1OCBpc19tYXNrZWQpOworCithY3BpX3N0YXR1cwogYWNwaV9ldl9hZGRfZ3BlX3JlZmVyZW5jZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pOwogCiBhY3BpX3N0YXR1cwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2dsb2JhbC5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2dsb2JhbC5oCmluZGV4IGZkZWQ3NzYuLjc1MGZhODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNnbG9iYWwuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZ2xvYmFsLmgKQEAgLTMxNyw2ICszMTcsNyBAQAogQUNQSV9JTklUX0dMT0JBTCh1OCwgYWNwaV9nYmxfY3N0eWxlX2Rpc2Fzc2VtYmx5LCBUUlVFKTsKIEFDUElfSU5JVF9HTE9CQUwodTgsIGFjcGlfZ2JsX2ZvcmNlX2FtbF9kaXNhc3NlbWJseSwgRkFMU0UpOwogQUNQSV9JTklUX0dMT0JBTCh1OCwgYWNwaV9nYmxfZG1fb3B0X3ZlcmJvc2UsIFRSVUUpOworQUNQSV9JTklUX0dMT0JBTCh1OCwgYWNwaV9nYmxfZG1fZW1pdF9leHRlcm5hbF9vcGNvZGVzLCBGQUxTRSk7CiAKIEFDUElfR0xPQkFMKHU4LCBhY3BpX2dibF9kbV9vcHRfZGlzYXNtKTsKIEFDUElfR0xPQkFMKHU4LCBhY3BpX2dibF9kbV9vcHRfbGlzdGluZyk7CkBAIC0zODIsNiArMzgzLDcgQEAKIAogQUNQSV9JTklUX0dMT0JBTChBQ1BJX0ZJTEUsIGFjcGlfZ2JsX2RlYnVnX2ZpbGUsIE5VTEwpOwogQUNQSV9JTklUX0dMT0JBTChBQ1BJX0ZJTEUsIGFjcGlfZ2JsX291dHB1dF9maWxlLCBOVUxMKTsKK0FDUElfSU5JVF9HTE9CQUwodTgsIGFjcGlfZ2JsX2RlYnVnX3RpbWVvdXQsIEZBTFNFKTsKIAogLyogUHJpbnQgYnVmZmVyICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNsb2NhbC5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2xvY2FsLmgKaW5kZXggMTMzMzFkNy4uZGZmMTIwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2xvY2FsLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2xvY2FsLmgKQEAgLTQ4NCw2ICs0ODQsNyBAQAogCXU4IGZsYWdzOwkJLyogTWlzYyBpbmZvIGFib3V0IHRoaXMgR1BFICovCiAJdTggZ3BlX251bWJlcjsJCS8qIFRoaXMgR1BFICovCiAJdTggcnVudGltZV9jb3VudDsJLyogUmVmZXJlbmNlcyB0byBhIHJ1biBHUEUgKi8KKwl1OCBkaXNhYmxlX2Zvcl9kaXNwYXRjaDsJLyogTWFza2VkIGR1cmluZyBkaXNwYXRjaGluZyAqLwogfTsKIAogLyogSW5mb3JtYXRpb24gYWJvdXQgYSBHUEUgcmVnaXN0ZXIgcGFpciwgb25lIHBlciBlYWNoIHN0YXR1cy9lbmFibGUgcGFpciBpbiBhbiBhcnJheSAqLwpAQCAtNDk0LDYgKzQ5NSw3IEBACiAJdTE2IGJhc2VfZ3BlX251bWJlcjsJLyogQmFzZSBHUEUgbnVtYmVyIGZvciB0aGlzIHJlZ2lzdGVyICovCiAJdTggZW5hYmxlX2Zvcl93YWtlOwkvKiBHUEVzIHRvIGtlZXAgZW5hYmxlZCB3aGVuIHNsZWVwaW5nICovCiAJdTggZW5hYmxlX2Zvcl9ydW47CS8qIEdQRXMgdG8ga2VlcCBlbmFibGVkIHdoZW4gcnVubmluZyAqLworCXU4IG1hc2tfZm9yX3J1bjsJLyogR1BFcyB0byBrZWVwIG1hc2tlZCB3aGVuIHJ1bm5pbmcgKi8KIAl1OCBlbmFibGVfbWFzazsJCS8qIEN1cnJlbnQgbWFzayBvZiBlbmFibGVkIEdQRXMgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNuYW1lc3AuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNuYW1lc3AuaAppbmRleCBmMzNhNGJhLi5iYjdmY2ExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbmFtZXNwLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY25hbWVzcC5oCkBAIC0xMzAsNiArMTMwLDkgQEAKIGFjcGlfbnNfcGFyc2VfdGFibGUodTMyIHRhYmxlX2luZGV4LCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqc3RhcnRfbm9kZSk7CiAKIGFjcGlfc3RhdHVzCithY3BpX25zX2V4ZWN1dGVfdGFibGUodTMyIHRhYmxlX2luZGV4LCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqc3RhcnRfbm9kZSk7CisKK2FjcGlfc3RhdHVzCiBhY3BpX25zX29uZV9jb21wbGV0ZV9wYXJzZSh1MzIgcGFzc19udW1iZXIsCiAJCQkgICB1MzIgdGFibGVfaW5kZXgsCiAJCQkgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqc3RhcnRfbm9kZSk7CkBAIC0yOTYsNiArMjk5LDExIEBACiBhY3BpX25zX3BhdHRlcm5fbWF0Y2goc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm9ial9ub2RlLCBjaGFyICpzZWFyY2hfZm9yKTsKIAogYWNwaV9zdGF0dXMKK2FjcGlfbnNfZ2V0X25vZGVfdW5sb2NrZWQoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlLAorCQkJICBjb25zdCBjaGFyICpleHRlcm5hbF9wYXRobmFtZSwKKwkJCSAgdTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKm91dF9ub2RlKTsKKworYWNwaV9zdGF0dXMKIGFjcGlfbnNfZ2V0X25vZGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlLAogCQkgY29uc3QgY2hhciAqZXh0ZXJuYWxfcGF0aG5hbWUsCiAJCSB1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqb3V0X25vZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY3BhcnNlci5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY3BhcnNlci5oCmluZGV4IGZjMzA1NzcuLjkzOWQ0MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNwYXJzZXIuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjcGFyc2VyLmgKQEAgLTc4LDYgKzc4LDggQEAKICAqLwogYWNwaV9zdGF0dXMgYWNwaV9wc19leGVjdXRlX21ldGhvZChzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvKTsKIAorYWNwaV9zdGF0dXMgYWNwaV9wc19leGVjdXRlX3RhYmxlKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8pOworCiAvKgogICogcHNhcmdzIC0gUGFyc2UgQU1MIG9wY29kZSBhcmd1bWVudHMKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY3RhYmxlcy5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY3RhYmxlcy5oCmluZGV4IGNkNWExMzUuLmU4NTk1M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWN0YWJsZXMuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjdGFibGVzLmgKQEAgLTEyMyw2ICsxMjMsMTQgQEAKIAogdm9pZCBhY3BpX3RiX3VuaW5zdGFsbF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjKTsKIAorYWNwaV9zdGF0dXMKK2FjcGlfdGJfbG9hZF90YWJsZSh1MzIgdGFibGVfaW5kZXgsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZSk7CisKK2FjcGlfc3RhdHVzCithY3BpX3RiX2luc3RhbGxfYW5kX2xvYWRfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSwKKwkJCSAgICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCSAgICAgICB1OCBmbGFncywgdTggb3ZlcnJpZGUsIHUzMiAqdGFibGVfaW5kZXgpOworCiB2b2lkIGFjcGlfdGJfdGVybWluYXRlKHZvaWQpOwogCiBhY3BpX3N0YXR1cyBhY3BpX3RiX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIodTMyIHRhYmxlX2luZGV4KTsKQEAgLTE1NSwxMCArMTYzLDYgQEAKIGFjcGlfdGJfaW5zdGFsbF90YWJsZV93aXRoX292ZXJyaWRlKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKm5ld190YWJsZV9kZXNjLAogCQkJCSAgICB1OCBvdmVycmlkZSwgdTMyICp0YWJsZV9pbmRleCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2luc3RhbGxfZml4ZWRfdGFibGUoYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCi0JCQkgICAgY2hhciAqc2lnbmF0dXJlLCB1MzIgKnRhYmxlX2luZGV4KTsKLQogYWNwaV9zdGF0dXMgYWNwaV90Yl9wYXJzZV9yb290X3RhYmxlKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyByc2RwX2FkZHJlc3MpOwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY3V0aWxzLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjdXRpbHMuaAppbmRleCBhN2RiYjJiLi4wYTFiNTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjdXRpbHMuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjdXRpbHMuaApAQCAtMTE0LDEzICsxMTQsMjUgQEAKIC8qCiAgKiBDb21tb24gZXJyb3IgbWVzc2FnZSBwcmVmaXhlcwogICovCisjaWZuZGVmIEFDUElfTVNHX0VSUk9SCiAjZGVmaW5lIEFDUElfTVNHX0VSUk9SICAgICAgICAgICJBQ1BJIEVycm9yOiAiCisjZW5kaWYKKyNpZm5kZWYgQUNQSV9NU0dfRVhDRVBUSU9OCiAjZGVmaW5lIEFDUElfTVNHX0VYQ0VQVElPTiAgICAgICJBQ1BJIEV4Y2VwdGlvbjogIgorI2VuZGlmCisjaWZuZGVmIEFDUElfTVNHX1dBUk5JTkcKICNkZWZpbmUgQUNQSV9NU0dfV0FSTklORyAgICAgICAgIkFDUEkgV2FybmluZzogIgorI2VuZGlmCisjaWZuZGVmIEFDUElfTVNHX0lORk8KICNkZWZpbmUgQUNQSV9NU0dfSU5GTyAgICAgICAgICAgIkFDUEk6ICIKKyNlbmRpZgogCisjaWZuZGVmIEFDUElfTVNHX0JJT1NfRVJST1IKICNkZWZpbmUgQUNQSV9NU0dfQklPU19FUlJPUiAgICAgIkFDUEkgQklPUyBFcnJvciAoYnVnKTogIgorI2VuZGlmCisjaWZuZGVmIEFDUElfTVNHX0JJT1NfV0FSTklORwogI2RlZmluZSBBQ1BJX01TR19CSU9TX1dBUk5JTkcgICAiQUNQSSBCSU9TIFdhcm5pbmcgKGJ1Zyk6ICIKKyNlbmRpZgogCiAvKgogICogQ29tbW9uIG1lc3NhZ2Ugc3VmZml4CkBAIC0xODQsMTQgKzE5NiwxNSBAQAogCiBpbnQgYWNwaV91dF9zdHJpY21wKGNoYXIgKnN0cmluZzEsIGNoYXIgKnN0cmluZzIpOwogCi1hY3BpX3N0YXR1cwotYWNwaV91dF9zdHJ0b3VsNjQoY2hhciAqc3RyaW5nLAotCQkgIHUzMiBiYXNlLCB1MzIgbWF4X2ludGVnZXJfYnl0ZV93aWR0aCwgdTY0ICpyZXRfaW50ZWdlcik7CithY3BpX3N0YXR1cyBhY3BpX3V0X3N0cnRvdWw2NChjaGFyICpzdHJpbmcsIHUzMiBmbGFncywgdTY0ICpyZXRfaW50ZWdlcik7CiAKLS8qIFZhbHVlcyBmb3IgbWF4X2ludGVnZXJfYnl0ZV93aWR0aCBhYm92ZSAqLwotCi0jZGVmaW5lIEFDUElfTUFYMzJfQllURV9XSURUSCAgICAgICA0Ci0jZGVmaW5lIEFDUElfTUFYNjRfQllURV9XSURUSCAgICAgICA4CisvKgorICogVmFsdWVzIGZvciBGbGFncyBhYm92ZQorICogTm90ZTogTElNSVQgdmFsdWVzIGNvcnJlc3BvbmQgdG8gYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoIHZhbHVlcyAoNC84KQorICovCisjZGVmaW5lIEFDUElfU1RSVE9VTF8zMkJJVCAgICAgICAgICAweDA0CS8qIDQgYnl0ZXMgKi8KKyNkZWZpbmUgQUNQSV9TVFJUT1VMXzY0QklUICAgICAgICAgIDB4MDgJLyogOCBieXRlcyAqLworI2RlZmluZSBBQ1BJX1NUUlRPVUxfQkFTRTE2ICAgICAgICAgMHgxMAkvKiBEZWZhdWx0OiBCYXNlMTAvMTYgKi8KIAogLyoKICAqIHV0Z2xvYmFsIC0gR2xvYmFsIGRhdGEgc3RydWN0dXJlcyBhbmQgcHJvY2VkdXJlcwpAQCAtMjIxLDYgKzIzNCw4IEBACiAKIGNoYXIgYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhcih1NjQgaW50ZWdlciwgdTMyIHBvc2l0aW9uKTsKIAorYWNwaV9zdGF0dXMgYWNwaV91dF9hc2NpaV90b19oZXhfYnl0ZShjaGFyICp0d29fYXNjaWlfY2hhcnMsIHU4ICpyZXR1cm5fYnl0ZSk7CisKIHU4IGFjcGlfdXRfYXNjaWlfY2hhcl90b19oZXgoaW50IGhleF9jaGFyKTsKIAogdTggYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZShhY3BpX29iamVjdF90eXBlIHR5cGUpOwpAQCAtMzE4LDYgKzMzMywxMSBAQAogCQkgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIHU4ICpwdHIpOwogCiB2b2lkCithY3BpX3V0X3N0cl9leGl0KHUzMiBsaW5lX251bWJlciwKKwkJIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCSBjb25zdCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCwgY29uc3QgY2hhciAqc3RyaW5nKTsKKwordm9pZAogYWNwaV91dF9kZWJ1Z19kdW1wX2J1ZmZlcih1OCAqYnVmZmVyLCB1MzIgY291bnQsIHUzMiBkaXNwbGF5LCB1MzIgY29tcG9uZW50X2lkKTsKIAogdm9pZCBhY3BpX3V0X2R1bXBfYnVmZmVyKHU4ICpidWZmZXIsIHUzMiBjb3VudCwgdTMyIGRpc3BsYXksIHUzMiBvZmZzZXQpOwpAQCAtNzA3LDI1ICs3MjcsNiBAQAogY29uc3QgY2hhciAqYWNwaV9haF9tYXRjaF91dWlkKHU4ICpkYXRhKTsKIAogLyoKLSAqIHV0cHJpbnQgLSBwcmludGYvdnByaW50ZiBvdXRwdXQgZnVuY3Rpb25zCi0gKi8KLWNvbnN0IGNoYXIgKmFjcGlfdXRfc2Nhbl9udW1iZXIoY29uc3QgY2hhciAqc3RyaW5nLCB1NjQgKm51bWJlcl9wdHIpOwotCi1jb25zdCBjaGFyICphY3BpX3V0X3ByaW50X251bWJlcihjaGFyICpzdHJpbmcsIHU2NCBudW1iZXIpOwotCi1pbnQKLWFjcGlfdXRfdnNucHJpbnRmKGNoYXIgKnN0cmluZywKLQkJICBhY3BpX3NpemUgc2l6ZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpOwotCi1pbnQgYWNwaV91dF9zbnByaW50ZihjaGFyICpzdHJpbmcsIGFjcGlfc2l6ZSBzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7Ci0KLSNpZmRlZiBBQ1BJX0FQUExJQ0FUSU9OCi1pbnQgYWNwaV91dF9maWxlX3ZwcmludGYoQUNQSV9GSUxFIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKTsKLQotaW50IGFjcGlfdXRfZmlsZV9wcmludGYoQUNQSV9GSUxFIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKLSNlbmRpZgotCi0vKgogICogdXR1dWlkIC0tIFVVSUQgc3VwcG9ydCBmdW5jdGlvbnMKICAqLwogI2lmIChkZWZpbmVkIEFDUElfQVNMX0NPTVBJTEVSIHx8IGRlZmluZWQgQUNQSV9FWEVDX0FQUCB8fCBkZWZpbmVkIEFDUElfSEVMUF9BUFApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RiY29udmVydC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kYmNvbnZlcnQuYwppbmRleCA3Y2QwN2IyLi4xNDdjZTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RiY29udmVydC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZGJjb252ZXJ0LmMKQEAgLTI3Nyw5ICsyNzcsMTAgQEAKIAlkZWZhdWx0OgogCiAJCW9iamVjdC0+dHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOwotCQlzdGF0dXMgPQotCQkgICAgYWNwaV91dF9zdHJ0b3VsNjQoc3RyaW5nLCAxNiwgYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoLAotCQkJCSAgICAgICZvYmplY3QtPmludGVnZXIudmFsdWUpOworCQlzdGF0dXMgPSBhY3BpX3V0X3N0cnRvdWw2NChzdHJpbmcsCisJCQkJCSAgIChhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGggfAorCQkJCQkgICAgQUNQSV9TVFJUT1VMX0JBU0UxNiksCisJCQkJCSAgICZvYmplY3QtPmludGVnZXIudmFsdWUpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZGJleGVjLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RiZXhlYy5jCmluZGV4IDEyZGYyOTEuLmZlM2RhN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZGJleGVjLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kYmV4ZWMuYwpAQCAtMzkyLDQzICszOTIsNDkgQEAKIAkJCQkJICBhY3BpX2RiX2V4ZWN1dGlvbl93YWxrLCBOVUxMLCBOVUxMLAogCQkJCQkgIE5VTEwpOwogCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJbmFtZV9zdHJpbmcgPSBBQ1BJX0FMTE9DQVRFKHN0cmxlbihuYW1lKSArIDEpOwotCQlpZiAoIW5hbWVfc3RyaW5nKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQltZW1zZXQoJmFjcGlfZ2JsX2RiX21ldGhvZF9pbmZvLCAwLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX2RiX21ldGhvZF9pbmZvKSk7Ci0KLQkJc3RyY3B5KG5hbWVfc3RyaW5nLCBuYW1lKTsKLQkJYWNwaV91dF9zdHJ1cHIobmFtZV9zdHJpbmcpOwotCQlhY3BpX2dibF9kYl9tZXRob2RfaW5mby5uYW1lID0gbmFtZV9zdHJpbmc7Ci0JCWFjcGlfZ2JsX2RiX21ldGhvZF9pbmZvLmFyZ3MgPSBhcmdzOwotCQlhY3BpX2dibF9kYl9tZXRob2RfaW5mby50eXBlcyA9IHR5cGVzOwotCQlhY3BpX2dibF9kYl9tZXRob2RfaW5mby5mbGFncyA9IGZsYWdzOwotCi0JCXJldHVybl9vYmoucG9pbnRlciA9IE5VTEw7Ci0JCXJldHVybl9vYmoubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9CVUZGRVI7Ci0KLQkJc3RhdHVzID0gYWNwaV9kYl9leGVjdXRlX3NldHVwKCZhY3BpX2dibF9kYl9tZXRob2RfaW5mbyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9GUkVFKG5hbWVfc3RyaW5nKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qIEdldCB0aGUgTlMgbm9kZSwgZGV0ZXJtaW5lcyBleGlzdGVuY2UgYWxzbyAqLwotCi0JCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBhY3BpX2dibF9kYl9tZXRob2RfaW5mby5wYXRobmFtZSwKLQkJCQkJICZhY3BpX2dibF9kYl9tZXRob2RfaW5mby5tZXRob2QpOwotCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9kYl9leGVjdXRlX21ldGhvZCgmYWNwaV9nYmxfZGJfbWV0aG9kX2luZm8sCi0JCQkJCQkgICAmcmV0dXJuX29iaik7Ci0JCX0KLQkJQUNQSV9GUkVFKG5hbWVfc3RyaW5nKTsKIAl9CiAKKwluYW1lX3N0cmluZyA9IEFDUElfQUxMT0NBVEUoc3RybGVuKG5hbWUpICsgMSk7CisJaWYgKCFuYW1lX3N0cmluZykgeworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KCZhY3BpX2dibF9kYl9tZXRob2RfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX2RiX21ldGhvZF9pbmZvKSk7CisJc3RyY3B5KG5hbWVfc3RyaW5nLCBuYW1lKTsKKwlhY3BpX3V0X3N0cnVwcihuYW1lX3N0cmluZyk7CisKKwkvKiBTdWJjb21tYW5kIHRvIEV4ZWN1dGUgYWxsIHByZWRlZmluZWQgbmFtZXMgaW4gdGhlIG5hbWVzcGFjZSAqLworCisJaWYgKCFzdHJuY21wKG5hbWVfc3RyaW5nLCAiUFJFREVGIiwgNikpIHsKKwkJYWNwaV9kYl9ldmFsdWF0ZV9wcmVkZWZpbmVkX25hbWVzKCk7CisJCUFDUElfRlJFRShuYW1lX3N0cmluZyk7CisJCXJldHVybjsKKwl9CisKKwlhY3BpX2dibF9kYl9tZXRob2RfaW5mby5uYW1lID0gbmFtZV9zdHJpbmc7CisJYWNwaV9nYmxfZGJfbWV0aG9kX2luZm8uYXJncyA9IGFyZ3M7CisJYWNwaV9nYmxfZGJfbWV0aG9kX2luZm8udHlwZXMgPSB0eXBlczsKKwlhY3BpX2dibF9kYl9tZXRob2RfaW5mby5mbGFncyA9IGZsYWdzOworCisJcmV0dXJuX29iai5wb2ludGVyID0gTlVMTDsKKwlyZXR1cm5fb2JqLmxlbmd0aCA9IEFDUElfQUxMT0NBVEVfQlVGRkVSOworCisJc3RhdHVzID0gYWNwaV9kYl9leGVjdXRlX3NldHVwKCZhY3BpX2dibF9kYl9tZXRob2RfaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRlJFRShuYW1lX3N0cmluZyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBHZXQgdGhlIE5TIG5vZGUsIGRldGVybWluZXMgZXhpc3RlbmNlIGFsc28gKi8KKworCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBhY3BpX2dibF9kYl9tZXRob2RfaW5mby5wYXRobmFtZSwKKwkJCQkgJmFjcGlfZ2JsX2RiX21ldGhvZF9pbmZvLm1ldGhvZCk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfZGJfZXhlY3V0ZV9tZXRob2QoJmFjcGlfZ2JsX2RiX21ldGhvZF9pbmZvLAorCQkJCQkJJnJldHVybl9vYmopOworCX0KKwlBQ1BJX0ZSRUUobmFtZV9zdHJpbmcpOworCiAJLyoKIAkgKiBBbGxvdyBhbnkgaGFuZGxlcnMgaW4gc2VwYXJhdGUgdGhyZWFkcyB0byBjb21wbGV0ZS4KIAkgKiAoU3VjaCBhcyBOb3RpZnkgaGFuZGxlcnMgaW52b2tlZCBmcm9tIEFNTCBleGVjdXRlZCBhYm92ZSkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RiZmlsZWlvLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RiZmlsZWlvLmMKaW5kZXggNDgzMjg3OS4uNmYwNWI4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9kYmZpbGVpby5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZGJmaWxlaW8uYwpAQCAtNDYsMTQgKzQ2LDEyIEBACiAjaW5jbHVkZSAiYWNjb21tb24uaCIKICNpbmNsdWRlICJhY2RlYnVnLmgiCiAjaW5jbHVkZSAiYWN0YWJsZXMuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEFDUElfQVBQTElDQVRJT04KLSNpbmNsdWRlICJhY2FwcHMuaCIKLSNlbmRpZgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9DQV9ERUJVR0dFUgogQUNQSV9NT0RVTEVfTkFNRSgiZGJmaWxlaW8iKQogCisjaWZkZWYgQUNQSV9BUFBMSUNBVElPTgorI2luY2x1ZGUgImFjYXBwcy5oIgogI2lmZGVmIEFDUElfREVCVUdHRVIKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjksOCArNjcsNiBAQAogdm9pZCBhY3BpX2RiX2Nsb3NlX2RlYnVnX2ZpbGUodm9pZCkKIHsKIAotI2lmZGVmIEFDUElfQVBQTElDQVRJT04KLQogCWlmIChhY3BpX2dibF9kZWJ1Z19maWxlKSB7CiAJCWZjbG9zZShhY3BpX2dibF9kZWJ1Z19maWxlKTsKIAkJYWNwaV9nYmxfZGVidWdfZmlsZSA9IE5VTEw7CkBAIC03OCw3ICs3NCw2IEBACiAJCWFjcGlfb3NfcHJpbnRmKCJEZWJ1ZyBvdXRwdXQgZmlsZSAlcyBjbG9zZWRcbiIsCiAJCQkgICAgICAgYWNwaV9nYmxfZGJfZGVidWdfZmlsZW5hbWUpOwogCX0KLSNlbmRpZgogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTYsOCArOTEsNiBAQAogdm9pZCBhY3BpX2RiX29wZW5fZGVidWdfZmlsZShjaGFyICpuYW1lKQogewogCi0jaWZkZWYgQUNQSV9BUFBMSUNBVElPTgotCiAJYWNwaV9kYl9jbG9zZV9kZWJ1Z19maWxlKCk7CiAJYWNwaV9nYmxfZGVidWdfZmlsZSA9IGZvcGVuKG5hbWUsICJ3KyIpOwogCWlmICghYWNwaV9nYmxfZGVidWdfZmlsZSkgewpAQCAtMTA5LDggKzEwMiw2IEBACiAJc3RybmNweShhY3BpX2dibF9kYl9kZWJ1Z19maWxlbmFtZSwgbmFtZSwKIAkJc2l6ZW9mKGFjcGlfZ2JsX2RiX2RlYnVnX2ZpbGVuYW1lKSk7CiAJYWNwaV9nYmxfZGJfb3V0cHV0X3RvX2ZpbGUgPSBUUlVFOwotCi0jZW5kaWYKIH0KICNlbmRpZgogCkBAIC0xNTIsMTIgKzE0MywxMyBAQAogCQkJcmV0dXJuIChzdGF0dXMpOwogCQl9CiAKLQkJZnByaW50ZihzdGRlcnIsCi0JCQkiQWNwaSB0YWJsZSBbJTQuNHNdIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgYW5kIGxvYWRlZFxuIiwKLQkJCXRhYmxlLT5zaWduYXR1cmUpOworCQlhY3BpX29zX3ByaW50ZgorCQkgICAgKCJBY3BpIHRhYmxlIFslNC40c10gc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCBhbmQgbG9hZGVkXG4iLAorCQkgICAgIHRhYmxlLT5zaWduYXR1cmUpOwogCiAJCXRhYmxlX2xpc3RfaGVhZCA9IHRhYmxlX2xpc3RfaGVhZC0+bmV4dDsKIAl9CiAKIAlyZXR1cm4gKEFFX09LKTsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9kYmlucHV0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RiaW5wdXQuYwppbmRleCA3Y2Q1ZDJlLi4wNjgyMTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RiaW5wdXQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RiaW5wdXQuYwpAQCAtMjg2LDYgKzI4Niw4IEBACiAJezEsICIgICAgIFwiQXNjaWkgU3RyaW5nXCIiLCAiU3RyaW5nIG1ldGhvZCBhcmd1bWVudFxuIn0sCiAJezEsICIgICAgIChIZXggQnl0ZSBMaXN0KSIsICJCdWZmZXIgbWV0aG9kIGFyZ3VtZW50XG4ifSwKIAl7MSwgIiAgICAgW1BhY2thZ2UgRWxlbWVudCBMaXN0XSIsICJQYWNrYWdlIG1ldGhvZCBhcmd1bWVudFxuIn0sCisJezUsICIgIEV4ZWN1dGUgcHJlZGVmaW5lZCIsCisJICJFeGVjdXRlIGFsbCBwcmVkZWZpbmVkIChwdWJsaWMpIG1ldGhvZHNcbiJ9LAogCXsxLCAiICBHbyIsICJBbGxvdyBtZXRob2QgdG8gcnVuIHRvIGNvbXBsZXRpb25cbiJ9LAogCXsxLCAiICBJbmZvcm1hdGlvbiIsICJEaXNwbGF5IGluZm8gYWJvdXQgdGhlIGN1cnJlbnQgbWV0aG9kXG4ifSwKIAl7MSwgIiAgSW50byIsICJTdGVwIGludG8gKG5vdCBvdmVyKSBhIG1ldGhvZCBjYWxsXG4ifSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZGJtZXRob2QuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZGJtZXRob2QuYwppbmRleCBmMTdhODZmLi4zMTRiOTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RibWV0aG9kLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kYm1ldGhvZC5jCkBAIC01Miw2ICs1MiwxMSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfQ0FfREVCVUdHRVIKIEFDUElfTU9EVUxFX05BTUUoImRibWV0aG9kIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2RiX3dhbGtfZm9yX2V4ZWN1dGUoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCSB1MzIgbmVzdGluZ19sZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZGJfc2V0X21ldGhvZF9icmVha3BvaW50CkBAIC02Niw2ICs3MSw3IEBACiAgKiAgICAgICAgICAgICAgQU1MIG9mZnNldAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHZvaWQKIGFjcGlfZGJfc2V0X21ldGhvZF9icmVha3BvaW50KGNoYXIgKmxvY2F0aW9uLAogCQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKQEAgLTM2NywzICszNzMsMTI5IEBACiAJYWNwaV91dF9yZWxlYXNlX293bmVyX2lkKCZvYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkKTsKIAlyZXR1cm4gKEFFX09LKTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kYl93YWxrX2Zvcl9leGVjdXRlCisgKgorICogUEFSQU1FVEVSUzogIENhbGxiYWNrIGZyb20gd2Fsa19uYW1lc3BhY2UKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEJhdGNoIGV4ZWN1dGlvbiBtb2R1bGUuIEN1cnJlbnRseSBvbmx5IGV4ZWN1dGVzIHByZWRlZmluZWQKKyAqICAgICAgICAgICAgICBBQ1BJIG5hbWVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9kYl93YWxrX2Zvcl9leGVjdXRlKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQkgdTMyIG5lc3RpbmdfbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpCit7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUgPQorCSAgICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfaGFuZGxlOworCXN0cnVjdCBhY3BpX2RiX2V4ZWN1dGVfd2FsayAqaW5mbyA9CisJICAgIChzdHJ1Y3QgYWNwaV9kYl9leGVjdXRlX3dhbGsgKiljb250ZXh0OworCXN0cnVjdCBhY3BpX2J1ZmZlciByZXR1cm5fb2JqOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwljaGFyICpwYXRobmFtZTsKKwl1MzIgaTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbyAqb2JqX2luZm87CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgcGFyYW1fb2JqZWN0czsKKwl1bmlvbiBhY3BpX29iamVjdCBwYXJhbXNbQUNQSV9NRVRIT0RfTlVNX0FSR1NdOworCWNvbnN0IHVuaW9uIGFjcGlfcHJlZGVmaW5lZF9pbmZvICpwcmVkZWZpbmVkOworCisJcHJlZGVmaW5lZCA9IGFjcGlfdXRfbWF0Y2hfcHJlZGVmaW5lZF9tZXRob2Qobm9kZS0+bmFtZS5hc2NpaSk7CisJaWYgKCFwcmVkZWZpbmVkKSB7CisJCXJldHVybiAoQUVfT0spOworCX0KKworCWlmIChub2RlLT50eXBlID09IEFDUElfVFlQRV9MT0NBTF9TQ09QRSkgeworCQlyZXR1cm4gKEFFX09LKTsKKwl9CisKKwlwYXRobmFtZSA9IGFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lKG5vZGUpOworCWlmICghcGF0aG5hbWUpIHsKKwkJcmV0dXJuIChBRV9PSyk7CisJfQorCisJLyogR2V0IHRoZSBvYmplY3QgaW5mbyBmb3IgbnVtYmVyIG9mIG1ldGhvZCBwYXJhbWV0ZXJzICovCisKKwlzdGF0dXMgPSBhY3BpX2dldF9vYmplY3RfaW5mbyhvYmpfaGFuZGxlLCAmb2JqX2luZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJcGFyYW1fb2JqZWN0cy5wb2ludGVyID0gTlVMTDsKKwlwYXJhbV9vYmplY3RzLmNvdW50ID0gMDsKKworCWlmIChvYmpfaW5mby0+dHlwZSA9PSBBQ1BJX1RZUEVfTUVUSE9EKSB7CisKKwkJLyogU2V0dXAgZGVmYXVsdCBwYXJhbWV0ZXJzICovCisKKwkJZm9yIChpID0gMDsgaSA8IG9ial9pbmZvLT5wYXJhbV9jb3VudDsgaSsrKSB7CisJCQlwYXJhbXNbaV0udHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOworCQkJcGFyYW1zW2ldLmludGVnZXIudmFsdWUgPSAxOworCQl9CisKKwkJcGFyYW1fb2JqZWN0cy5wb2ludGVyID0gcGFyYW1zOworCQlwYXJhbV9vYmplY3RzLmNvdW50ID0gb2JqX2luZm8tPnBhcmFtX2NvdW50OworCX0KKworCUFDUElfRlJFRShvYmpfaW5mbyk7CisJcmV0dXJuX29iai5wb2ludGVyID0gTlVMTDsKKwlyZXR1cm5fb2JqLmxlbmd0aCA9IEFDUElfQUxMT0NBVEVfQlVGRkVSOworCisJLyogRG8gdGhlIGFjdHVhbCBtZXRob2QgZXhlY3V0aW9uICovCisKKwlhY3BpX2dibF9tZXRob2RfZXhlY3V0aW5nID0gVFJVRTsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KG5vZGUsIE5VTEwsICZwYXJhbV9vYmplY3RzLCAmcmV0dXJuX29iaik7CisKKwlhY3BpX29zX3ByaW50ZigiJS0zMnMgcmV0dXJuZWQgJXNcbiIsIHBhdGhuYW1lLAorCQkgICAgICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOworCWFjcGlfZ2JsX21ldGhvZF9leGVjdXRpbmcgPSBGQUxTRTsKKwlBQ1BJX0ZSRUUocGF0aG5hbWUpOworCisJLyogSWdub3JlIHN0YXR1cyBmcm9tIG1ldGhvZCBleGVjdXRpb24gKi8KKworCXN0YXR1cyA9IEFFX09LOworCisJLyogVXBkYXRlIGNvdW50LCBjaGVjayBpZiB3ZSBoYXZlIGV4ZWN1dGVkIGVub3VnaCBtZXRob2RzICovCisKKwlpbmZvLT5jb3VudCsrOworCWlmIChpbmZvLT5jb3VudCA+PSBpbmZvLT5tYXhfY291bnQpIHsKKwkJc3RhdHVzID0gQUVfQ1RSTF9URVJNSU5BVEU7CisJfQorCisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RiX2V2YWx1YXRlX3ByZWRlZmluZWRfbmFtZXMKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IE5hbWVzcGFjZSBiYXRjaCBleGVjdXRpb24uIEV4ZWN1dGUgcHJlZGVmaW5lZCBuYW1lcyBpbiB0aGUKKyAqICAgICAgICAgICAgICBuYW1lc3BhY2UsIHVwIHRvIHRoZSBtYXggY291bnQsIGlmIHNwZWNpZmllZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfZGJfZXZhbHVhdGVfcHJlZGVmaW5lZF9uYW1lcyh2b2lkKQoreworCXN0cnVjdCBhY3BpX2RiX2V4ZWN1dGVfd2FsayBpbmZvOworCisJaW5mby5jb3VudCA9IDA7CisJaW5mby5tYXhfY291bnQgPSBBQ1BJX1VJTlQzMl9NQVg7CisKKwkvKiBTZWFyY2ggYWxsIG5vZGVzIGluIG5hbWVzcGFjZSAqLworCisJKHZvaWQpYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfQU5ZLCBBQ1BJX1JPT1RfT0JKRUNULAorCQkJCSAgQUNQSV9VSU5UMzJfTUFYLCBhY3BpX2RiX3dhbGtfZm9yX2V4ZWN1dGUsCisJCQkJICBOVUxMLCAodm9pZCAqKSZpbmZvLCBOVUxMKTsKKworCWFjcGlfb3NfcHJpbnRmKCJFdmFsdWF0ZWQgJXUgcHJlZGVmaW5lZCBuYW1lcyBpbiB0aGUgbmFtZXNwYWNlXG4iLAorCQkgICAgICAgaW5mby5jb3VudCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rib2JqZWN0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rib2JqZWN0LmMKaW5kZXggMWQ1OWU4Yi4uMDhlYWFmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9kYm9iamVjdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZGJvYmplY3QuYwpAQCAtMTQyLDExICsxNDIsMTEgQEAKIAogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAotCQlhY3BpX29zX3ByaW50ZigiKCV1KSBcIiUuMjRzIiwKKwkJYWNwaV9vc19wcmludGYoIigldSkgXCIlLjYwcyIsCiAJCQkgICAgICAgb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgsCiAJCQkgICAgICAgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyKTsKIAotCQlpZiAob2JqX2Rlc2MtPnN0cmluZy5sZW5ndGggPiAyNCkgeworCQlpZiAob2JqX2Rlc2MtPnN0cmluZy5sZW5ndGggPiA2MCkgewogCQkJYWNwaV9vc19wcmludGYoIi4uLiIpOwogCQl9IGVsc2UgewogCQkJYWNwaV9vc19wcmludGYoIlwiIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzbWV0aG9kLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzbWV0aG9kLmMKaW5kZXggNDdjN2I1Mi4uMzJlOWRkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc21ldGhvZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNtZXRob2QuYwpAQCAtOTksMTEgKzk5LDE0IEBACiAJCQkgICJNZXRob2QgYXV0by1zZXJpYWxpemF0aW9uIHBhcnNlIFslNC40c10gJXBcbiIsCiAJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwgbm9kZSkpOwogCisJYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOworCiAJLyogQ3JlYXRlL0luaXQgYSByb290IG9wIGZvciB0aGUgbWV0aG9kIHBhcnNlIHRyZWUgKi8KIAogCW9wID0gYWNwaV9wc19hbGxvY19vcChBTUxfTUVUSE9EX09QLCBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCk7CiAJaWYgKCFvcCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQlnb3RvIHVubG9jazsKIAl9CiAKIAlhY3BpX3BzX3NldF9uYW1lKG9wLCBub2RlLT5uYW1lLmludGVnZXIpOwpAQCAtMTE1LDcgKzExOCw4IEBACiAJICAgIGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUobm9kZS0+b3duZXJfaWQsIE5VTEwsIE5VTEwsIE5VTEwpOwogCWlmICghd2Fsa19zdGF0ZSkgewogCQlhY3BpX3BzX2ZyZWVfb3Aob3ApOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQlnb3RvIHVubG9jazsKIAl9CiAKIAlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgb3AsIG5vZGUsCkBAIC0xMzQsNiArMTM4LDggQEAKIAlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCh3YWxrX3N0YXRlKTsKIAogCWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUob3ApOwordW5sb2NrOgorCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCkBAIC03NTcsOCArNzYzLDEwIEBACiAKIAkJCS8qIERlbGV0ZSBhbnkgZGlyZWN0IGNoaWxkcmVuIG9mIChjcmVhdGVkIGJ5KSB0aGlzIG1ldGhvZCAqLwogCisJCQkodm9pZClhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKIAkJCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9zdWJ0cmVlKHdhbGtfc3RhdGUtPgogCQkJCQkJCSBtZXRob2Rfbm9kZSk7CisJCQkodm9pZClhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CiAKIAkJCS8qCiAJCQkgKiBEZWxldGUgYW55IG9iamVjdHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYnkgdGhpcyBtZXRob2QKQEAgLTc2OSw5ICs3NzcsMTEgQEAKIAkJCSAqLwogCQkJaWYgKG1ldGhvZF9kZXNjLT5tZXRob2QuCiAJCQkgICAgaW5mb19mbGFncyAmIEFDUElfTUVUSE9EX01PRElGSUVEX05BTUVTUEFDRSkgeworCQkJCSh2b2lkKWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwogCQkJCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcihtZXRob2RfZGVzYy0+CiAJCQkJCQkJCSAgbWV0aG9kLgogCQkJCQkJCQkgIG93bmVyX2lkKTsKKwkJCQkodm9pZClhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CiAJCQkJbWV0aG9kX2Rlc2MtPm1ldGhvZC5pbmZvX2ZsYWdzICY9CiAJCQkJICAgIH5BQ1BJX01FVEhPRF9NT0RJRklFRF9OQU1FU1BBQ0U7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN1dGlscy5jCmluZGV4IGYzOTNkZTkuLjdkOGVmNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN1dGlscy5jCkBAIC01NjUsMTUgKzU2NSwxNCBAQAogCQkJCQlzdGF0dXMgPSBBRV9PSzsKIAkJCQl9IGVsc2UgaWYgKHBhcmVudF9vcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KIAkJCQkJICAgQU1MX0VYVEVSTkFMX09QKSB7Ci0KLQkJCQkJLyogVEJEOiBNYXkgb25seSBiZSB0ZW1wb3JhcnkgKi8KLQotCQkJCQlvYmpfZGVzYyA9Ci0JCQkJCSAgICBhY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0KChhY3BpX3NpemUpbmFtZV9sZW5ndGgpOwotCi0JCQkJCXN0cm5jcHkob2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLAotCQkJCQkJbmFtZV9zdHJpbmcsIG5hbWVfbGVuZ3RoKTsKLQkJCQkJc3RhdHVzID0gQUVfT0s7CisJCQkJCS8qCisJCQkJCSAqIFRoaXMgb3Bjb2RlIHNob3VsZCBuZXZlciBhcHBlYXIgaGVyZS4gSXQgaXMgdXNlZCBvbmx5CisJCQkJCSAqIGJ5IEFNTCBkaXNhc3NlbWJsZXJzIGFuZCBpcyBzdXJyb3VuZGVkIGJ5IGFuIElmKDApCisJCQkJCSAqIGJ5IHRoZSBBU0wgY29tcGlsZXIuCisJCQkJCSAqCisJCQkJCSAqIFRoZXJlZm9yZSwgaWYgd2Ugc2VlIGl0IGhlcmUsIGl0IGlzIGEgc2VyaW91cyBlcnJvci4KKwkJCQkJICovCisJCQkJCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwogCQkJCX0gZWxzZSB7CiAJCQkJCS8qCiAJCQkJCSAqIFdlIGp1c3QgcGxhaW4gZGlkbid0IGZpbmQgaXQgLS0gd2hpY2ggaXMgYQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc3dleGVjLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd2V4ZWMuYwppbmRleCA0MDJlY2M1Li40Mzg1OTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd2V4ZWMuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd2V4ZWMuYwpAQCAtMTMzLDcgKzEzMyw4IEBACiAJICogUmVzdWx0IG9mIHByZWRpY2F0ZSBldmFsdWF0aW9uIG11c3QgYmUgYW4gSW50ZWdlcgogCSAqIG9iamVjdC4gSW1wbGljaXRseSBjb252ZXJ0IHRoZSBhcmd1bWVudCBpZiBuZWNlc3NhcnkuCiAJICovCi0Jc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIob2JqX2Rlc2MsICZsb2NhbF9vYmpfZGVzYywgMTYpOworCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKG9ial9kZXNjLCAmbG9jYWxfb2JqX2Rlc2MsCisJCQkJCSAgICBBQ1BJX1NUUlRPVUxfQkFTRTE2KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBjbGVhbnVwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN3bG9hZDIuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN3bG9hZDIuYwppbmRleCA3NjJkYjNmLi4wMjhiMjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd2xvYWQyLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc3dsb2FkMi5jCkBAIC02MDUsMTYgKzYwNSwxMyBAQAogCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCQl9Ci0KLQkJCQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKIAkJCX0KIAorCQkJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CiAJCQlzdGF0dXMgPQogCQkJICAgIGFjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24KIAkJCSAgICAoYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpLCBGQUxTRSk7Ci0JCQlpZiAod2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUpIHsKLQkJCQlhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7Ci0JCQl9CisJCQlhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CiAKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BlLmMKaW5kZXggNGI0OTQ5Yy4uYmRiMTBiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldmdwZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGUuYwpAQCAtMTMwLDYgKzEzMCw2MCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X21hc2tfZ3BlCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9ldmVudF9pbmZvICAgICAgICAgIC0gR1BFIHRvIGJlIGJsb2NrZWQvdW5ibG9ja2VkCisgKiAgICAgICAgICAgICAgaXNfbWFza2VkICAgICAgICAgICAgICAgLSBXaGV0aGVyIHRoZSBHUEUgaXMgbWFza2VkIG9yIG5vdAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVW5jb25kaXRpb25hbGx5IG1hc2svdW5tYXNrIGEgR1BFIGR1cmluZyBydW50aW1lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V2X21hc2tfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbywgdTggaXNfbWFza2VkKQoreworCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpncGVfcmVnaXN0ZXJfaW5mbzsKKwl1MzIgcmVnaXN0ZXJfYml0OworCisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9tYXNrX2dwZSk7CisKKwlncGVfcmVnaXN0ZXJfaW5mbyA9IGdwZV9ldmVudF9pbmZvLT5yZWdpc3Rlcl9pbmZvOworCWlmICghZ3BlX3JlZ2lzdGVyX2luZm8pIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CisJfQorCisJcmVnaXN0ZXJfYml0ID0gYWNwaV9od19nZXRfZ3BlX3JlZ2lzdGVyX2JpdChncGVfZXZlbnRfaW5mbyk7CisKKwkvKiBQZXJmb3JtIHRoZSBhY3Rpb24gKi8KKworCWlmIChpc19tYXNrZWQpIHsKKwkJaWYgKHJlZ2lzdGVyX2JpdCAmIGdwZV9yZWdpc3Rlcl9pbmZvLT5tYXNrX2Zvcl9ydW4pIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwkJfQorCisJCSh2b2lkKWFjcGlfaHdfbG93X3NldF9ncGUoZ3BlX2V2ZW50X2luZm8sIEFDUElfR1BFX0RJU0FCTEUpOworCQlBQ1BJX1NFVF9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPm1hc2tfZm9yX3J1biwgKHU4KXJlZ2lzdGVyX2JpdCk7CisJfSBlbHNlIHsKKwkJaWYgKCEocmVnaXN0ZXJfYml0ICYgZ3BlX3JlZ2lzdGVyX2luZm8tPm1hc2tfZm9yX3J1bikpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwkJfQorCisJCUFDUElfQ0xFQVJfQklUKGdwZV9yZWdpc3Rlcl9pbmZvLT5tYXNrX2Zvcl9ydW4sCisJCQkgICAgICAgKHU4KXJlZ2lzdGVyX2JpdCk7CisJCWlmIChncGVfZXZlbnRfaW5mby0+cnVudGltZV9jb3VudAorCQkgICAgJiYgIWdwZV9ldmVudF9pbmZvLT5kaXNhYmxlX2Zvcl9kaXNwYXRjaCkgeworCQkJKHZvaWQpYWNwaV9od19sb3dfc2V0X2dwZShncGVfZXZlbnRfaW5mbywKKwkJCQkJCSAgQUNQSV9HUEVfRU5BQkxFKTsKKwkJfQorCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfYWRkX2dwZV9yZWZlcmVuY2UKICAqCiAgKiBQQVJBTUVURVJTOiAgZ3BlX2V2ZW50X2luZm8gICAgICAgICAgLSBBZGQgYSByZWZlcmVuY2UgdG8gdGhpcyBHUEUKQEAgLTY3NCw2ICs3MjgsNyBAQAogCSAqIGluIHRoZSBldmVudF9pbmZvLgogCSAqLwogCSh2b2lkKWFjcGlfaHdfbG93X3NldF9ncGUoZ3BlX2V2ZW50X2luZm8sIEFDUElfR1BFX0NPTkRJVElPTkFMX0VOQUJMRSk7CisJZ3BlX2V2ZW50X2luZm8tPmRpc2FibGVfZm9yX2Rpc3BhdGNoID0gRkFMU0U7CiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKQEAgLTczNyw2ICs3OTIsOCBAQAogCQl9CiAJfQogCisJZ3BlX2V2ZW50X2luZm8tPmRpc2FibGVfZm9yX2Rpc3BhdGNoID0gVFJVRTsKKwogCS8qCiAJICogRGlzcGF0Y2ggdGhlIEdQRSB0byBlaXRoZXIgYW4gaW5zdGFsbGVkIGhhbmRsZXIgb3IgdGhlIGNvbnRyb2wKIAkgKiBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgR1BFIChfTHh4IG9yIF9FeHgpLiBJZiBhIGhhbmRsZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGVpbml0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BlaW5pdC5jCmluZGV4IDdkYzc1NDcuLjE2Y2U0ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGVpbml0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldmdwZWluaXQuYwpAQCAtMzIzLDcgKzMyMyw5IEBACiAJc3RydWN0IGFjcGlfZ3BlX3dhbGtfaW5mbyAqd2Fsa19pbmZvID0KIAkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9ncGVfd2Fsa19pbmZvLCBjb250ZXh0KTsKIAlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXUzMiBncGVfbnVtYmVyOworCXU4IHRlbXBfZ3BlX251bWJlcjsKIAljaGFyIG5hbWVbQUNQSV9OQU1FX1NJWkUgKyAxXTsKIAl1OCB0eXBlOwogCkBAIC0zNzcsOCArMzc5LDggQEAKIAogCS8qIDQpIFRoZSBsYXN0IHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBuYW1lIGFyZSB0aGUgaGV4IEdQRSBOdW1iZXIgKi8KIAotCWdwZV9udW1iZXIgPSBzdHJ0b3VsKCZuYW1lWzJdLCBOVUxMLCAxNik7Ci0JaWYgKGdwZV9udW1iZXIgPT0gQUNQSV9VSU5UMzJfTUFYKSB7CisJc3RhdHVzID0gYWNwaV91dF9hc2NpaV90b19oZXhfYnl0ZSgmbmFtZVsyXSwgJnRlbXBfZ3BlX251bWJlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAKIAkJLyogQ29udmVyc2lvbiBmYWlsZWQ7IGludmFsaWQgbWV0aG9kLCBqdXN0IGlnbm9yZSBpdCAqLwogCkBAIC0zOTAsNiArMzkyLDcgQEAKIAogCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBHUEUgbnVtYmVyIGZvciB0aGlzIEdQRSBibG9jayAqLwogCisJZ3BlX251bWJlciA9ICh1MzIpdGVtcF9ncGVfbnVtYmVyOwogCWdwZV9ldmVudF9pbmZvID0KIAkgICAgYWNwaV9ldl9sb3dfZ2V0X2dwZV9pbmZvKGdwZV9udW1iZXIsIHdhbGtfaW5mby0+Z3BlX2Jsb2NrKTsKIAlpZiAoIWdwZV9ldmVudF9pbmZvKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2cmduaW5pLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2cmduaW5pLmMKaW5kZXggYjZlYTljMC4uMzg0M2YxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldnJnbmluaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZyZ25pbmkuYwpAQCAtNTUzLDcgKzU1Myw4IEBACiAJCQkJICoKIAkJCQkgKiBTZWUgYWNwaV9uc19leGVjX21vZHVsZV9jb2RlCiAJCQkJICovCi0JCQkJaWYgKG9ial9kZXNjLT5tZXRob2QuCisJCQkJaWYgKCFhY3BpX2dibF9wYXJzZV90YWJsZV9hc190ZXJtX2xpc3QgJiYKKwkJCQkgICAgb2JqX2Rlc2MtPm1ldGhvZC4KIAkJCQkgICAgaW5mb19mbGFncyAmIEFDUElfTUVUSE9EX01PRFVMRV9MRVZFTCkgewogCQkJCQloYW5kbGVyX29iaiA9CiAJCQkJCSAgICBvYmpfZGVzYy0+bWV0aG9kLmRpc3BhdGNoLmhhbmRsZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZncGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmdwZS5jCmluZGV4IDE3Y2ZlZjcuLmQ3YTNiMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmdwZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmdwZS5jCkBAIC0yMzUsMTEgKzIzNSwxMyBAQAogCWNhc2UgQUNQSV9HUEVfRU5BQkxFOgogCiAJCXN0YXR1cyA9IGFjcGlfaHdfbG93X3NldF9ncGUoZ3BlX2V2ZW50X2luZm8sIEFDUElfR1BFX0VOQUJMRSk7CisJCWdwZV9ldmVudF9pbmZvLT5kaXNhYmxlX2Zvcl9kaXNwYXRjaCA9IEZBTFNFOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9HUEVfRElTQUJMRToKIAogCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19zZXRfZ3BlKGdwZV9ldmVudF9pbmZvLCBBQ1BJX0dQRV9ESVNBQkxFKTsKKwkJZ3BlX2V2ZW50X2luZm8tPmRpc2FibGVfZm9yX2Rpc3BhdGNoID0gVFJVRTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMjU3LDYgKzI1OSw0NyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX21hc2tfZ3BlCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAgICAgLSBQYXJlbnQgR1BFIERldmljZS4gTlVMTCBmb3IgR1BFMC9HUEUxCisgKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgICAgICAtIEdQRSBsZXZlbCB3aXRoaW4gdGhlIEdQRSBibG9jaworICogICAgICAgICAgICAgIGlzX21hc2tlZCAgICAgICAgICAgLSBXaGV0aGVyIHRoZSBHUEUgaXMgbWFza2VkIG9yIG5vdAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVW5jb25kaXRpb25hbGx5IG1hc2svdW5tYXNrIHRoZSBhbiBpbmRpdmlkdWFsIEdQRSwgZXguLCB0bworICogICAgICAgICAgICAgIHByZXZlbnQgYSBHUEUgZmxvb2RpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfbWFza19ncGUoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwgdTMyIGdwZV9udW1iZXIsIHU4IGlzX21hc2tlZCkKK3sKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX21hc2tfZ3BlKTsKKworCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOworCisJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIEdQRSBudW1iZXIgKi8KKworCWdwZV9ldmVudF9pbmZvID0gYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8oZ3BlX2RldmljZSwgZ3BlX251bWJlcik7CisJaWYgKCFncGVfZXZlbnRfaW5mbykgeworCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOworCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX2V2X21hc2tfZ3BlKGdwZV9ldmVudF9pbmZvLCBpc19tYXNrZWQpOworCit1bmxvY2tfYW5kX2V4aXQ6CisJYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfbWFza19ncGUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbWFya19ncGVfZm9yX3dha2UKICAqCiAgKiBQQVJBTUVURVJTOiAgZ3BlX2RldmljZSAgICAgICAgICAtIFBhcmVudCBHUEUgRGV2aWNlLiBOVUxMIGZvciBHUEUwL0dQRTEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhjb25jYXQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhjb25jYXQuYwppbmRleCAyNDIzZmUwLi41NDI5YzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y29uY2F0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leGNvbmNhdC5jCkBAIC0xNTYsNyArMTU2LDcgQEAKIAogCQlzdGF0dXMgPQogCQkgICAgYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIobG9jYWxfb3BlcmFuZDEsICZ0ZW1wX29wZXJhbmQxLAotCQkJCQkgICAgICAgMTYpOworCQkJCQkgICAgICAgQUNQSV9TVFJUT1VMX0JBU0UxNik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leGNvbmZpZy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leGNvbmZpZy5jCmluZGV4IGExZDE3N2QuLjcxODQyOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhjb25maWcuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y29uZmlnLmMKQEAgLTU1LDkgKzU1LDcgQEAKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2FkZF90YWJsZSh1MzIgdGFibGVfaW5kZXgsCi0JCSAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlLAotCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipkZGJfaGFuZGxlKTsKK2FjcGlfZXhfYWRkX3RhYmxlKHUzMiB0YWJsZV9pbmRleCwgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmRkYl9oYW5kbGUpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZXhfcmVnaW9uX3JlYWQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCkBAIC03OSwxMyArNzcsOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2FkZF90YWJsZSh1MzIgdGFibGVfaW5kZXgsCi0JCSAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlLAotCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipkZGJfaGFuZGxlKQorYWNwaV9leF9hZGRfdGFibGUodTMyIHRhYmxlX2luZGV4LCB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqZGRiX2hhbmRsZSkKIHsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JYWNwaV9vd25lcl9pZCBvd25lcl9pZDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfYWRkX3RhYmxlKTsKIApAQCAtMTAwLDM5ICs5NCw4IEBACiAKIAlvYmpfZGVzYy0+Y29tbW9uLmZsYWdzIHw9IEFPUE9CSl9EQVRBX1ZBTElEOwogCW9ial9kZXNjLT5yZWZlcmVuY2UuY2xhc3MgPSBBQ1BJX1JFRkNMQVNTX1RBQkxFOwotCSpkZGJfaGFuZGxlID0gb2JqX2Rlc2M7Ci0KLQkvKiBJbnN0YWxsIHRoZSBuZXcgdGFibGUgaW50byB0aGUgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KIAlvYmpfZGVzYy0+cmVmZXJlbmNlLnZhbHVlID0gdGFibGVfaW5kZXg7Ci0KLQkvKiBBZGQgdGhlIHRhYmxlIHRvIHRoZSBuYW1lc3BhY2UgKi8KLQotCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF90YWJsZSh0YWJsZV9pbmRleCwgcGFyZW50X25vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCQkqZGRiX2hhbmRsZSA9IE5VTEw7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIEV4ZWN1dGUgYW55IG1vZHVsZS1sZXZlbCBjb2RlIHRoYXQgd2FzIGZvdW5kIGluIHRoZSB0YWJsZSAqLwotCi0JYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7Ci0JaWYgKGFjcGlfZ2JsX2dyb3VwX21vZHVsZV9sZXZlbF9jb2RlKSB7Ci0JCWFjcGlfbnNfZXhlY19tb2R1bGVfY29kZV9saXN0KCk7Ci0JfQotCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKLQotCS8qCi0JICogVXBkYXRlIEdQRXMgZm9yIGFueSBuZXcgX0x4eC9fRXh4IG1ldGhvZHMuIElnbm9yZSBlcnJvcnMuIFRoZSBob3N0IGlzCi0JICogcmVzcG9uc2libGUgZm9yIGRpc2NvdmVyaW5nIGFueSBuZXcgd2FrZSBHUEVzIGJ5IHJ1bm5pbmcgX1BSVyBtZXRob2RzCi0JICogdGhhdCBtYXkgaGF2ZSBiZWVuIGxvYWRlZCBieSB0aGlzIHRhYmxlLgotCSAqLwotCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X293bmVyX2lkKHRhYmxlX2luZGV4LCAmb3duZXJfaWQpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQlhY3BpX2V2X3VwZGF0ZV9ncGVzKG93bmVyX2lkKTsKLQl9Ci0KKwkqZGRiX2hhbmRsZSA9IG9ial9kZXNjOwogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKQEAgLTE1OSwxNiArMTIyLDE3IEBACiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnN0YXJ0X25vZGU7CiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmFtZXRlcl9ub2RlID0gTlVMTDsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZGJfaGFuZGxlOwotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGU7CiAJdTMyIHRhYmxlX2luZGV4OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShleF9sb2FkX3RhYmxlX29wKTsKIAogCS8qIEZpbmQgdGhlIEFDUEkgdGFibGUgaW4gdGhlIFJTRFQvWFNEVCAqLwogCisJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CiAJc3RhdHVzID0gYWNwaV90Yl9maW5kX3RhYmxlKG9wZXJhbmRbMF0tPnN0cmluZy5wb2ludGVyLAogCQkJCSAgICBvcGVyYW5kWzFdLT5zdHJpbmcucG9pbnRlciwKIAkJCQkgICAgb3BlcmFuZFsyXS0+c3RyaW5nLnBvaW50ZXIsICZ0YWJsZV9pbmRleCk7CisJYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlpZiAoc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CkBAIC0xOTcsOSArMTYxLDEwIEBACiAJCSAqIEZpbmQgdGhlIG5vZGUgcmVmZXJlbmNlZCBieSB0aGUgcm9vdF9wYXRoX3N0cmluZy4gVGhpcyBpcyB0aGUKIAkJICogbG9jYXRpb24gd2l0aGluIHRoZSBuYW1lc3BhY2Ugd2hlcmUgdGhlIHRhYmxlIHdpbGwgYmUgbG9hZGVkLgogCQkgKi8KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfbnNfZ2V0X25vZGUoc3RhcnRfbm9kZSwgb3BlcmFuZFszXS0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJICAgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsICZwYXJlbnRfbm9kZSk7CisJCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGVfdW5sb2NrZWQoc3RhcnRfbm9kZSwKKwkJCQkJCSAgIG9wZXJhbmRbM10tPnN0cmluZy5wb2ludGVyLAorCQkJCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCQkJICAgJnBhcmVudF9ub2RlKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQpAQCAtMjE5LDkgKzE4NCwxMCBAQAogCiAJCS8qIEZpbmQgdGhlIG5vZGUgcmVmZXJlbmNlZCBieSB0aGUgcGFyYW1ldGVyX3BhdGhfc3RyaW5nICovCiAKLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfbnNfZ2V0X25vZGUoc3RhcnRfbm9kZSwgb3BlcmFuZFs0XS0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJICAgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsICZwYXJhbWV0ZXJfbm9kZSk7CisJCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGVfdW5sb2NrZWQoc3RhcnRfbm9kZSwKKwkJCQkJCSAgIG9wZXJhbmRbNF0tPnN0cmluZy5wb2ludGVyLAorCQkJCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCQkJICAgJnBhcmFtZXRlcl9ub2RlKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQpAQCAtMjI5LDcgKzE5NSwxNSBAQAogCiAJLyogTG9hZCB0aGUgdGFibGUgaW50byB0aGUgbmFtZXNwYWNlICovCiAKLQlzdGF0dXMgPSBhY3BpX2V4X2FkZF90YWJsZSh0YWJsZV9pbmRleCwgcGFyZW50X25vZGUsICZkZGJfaGFuZGxlKTsKKwlBQ1BJX0lORk8oKCJEeW5hbWljIE9FTSBUYWJsZSBMb2FkOiIpKTsKKwlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2xvYWRfdGFibGUodGFibGVfaW5kZXgsIHBhcmVudF9ub2RlKTsKKwlhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCXN0YXR1cyA9IGFjcGlfZXhfYWRkX3RhYmxlKHRhYmxlX2luZGV4LCAmZGRiX2hhbmRsZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KQEAgLTI1MiwxOSArMjI2LDYgQEAKIAkJfQogCX0KIAotCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlX2J5X2luZGV4KHRhYmxlX2luZGV4LCAmdGFibGUpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQlBQ1BJX0lORk8oKCJEeW5hbWljIE9FTSBUYWJsZSBMb2FkOiIpKTsKLQkJYWNwaV90Yl9wcmludF90YWJsZV9oZWFkZXIoMCwgdGFibGUpOwotCX0KLQotCS8qIEludm9rZSB0YWJsZSBoYW5kbGVyIGlmIHByZXNlbnQgKi8KLQotCWlmIChhY3BpX2dibF90YWJsZV9oYW5kbGVyKSB7Ci0JCSh2b2lkKWFjcGlfZ2JsX3RhYmxlX2hhbmRsZXIoQUNQSV9UQUJMRV9FVkVOVF9MT0FELCB0YWJsZSwKLQkJCQkJICAgICBhY3BpX2dibF90YWJsZV9oYW5kbGVyX2NvbnRleHQpOwotCX0KLQogCSpyZXR1cm5fZGVzYyA9IGRkYl9oYW5kbGU7CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CkBAIC00NzUsMTMgKzQzNiwxMiBAQAogCS8qIEluc3RhbGwgdGhlIG5ldyB0YWJsZSBpbnRvIHRoZSBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgKi8KIAogCUFDUElfSU5GTygoIkR5bmFtaWMgT0VNIFRhYmxlIExvYWQ6IikpOwotCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCi0Jc3RhdHVzID0gYWNwaV90Yl9pbnN0YWxsX3N0YW5kYXJkX3RhYmxlKEFDUElfUFRSX1RPX1BIWVNBRERSKHRhYmxlKSwKLQkJCQkJCUFDUElfVEFCTEVfT1JJR0lOX0lOVEVSTkFMX1ZJUlRVQUwsCi0JCQkJCQlUUlVFLCBUUlVFLCAmdGFibGVfaW5kZXgpOwotCi0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CisJc3RhdHVzID0KKwkgICAgYWNwaV90Yl9pbnN0YWxsX2FuZF9sb2FkX3RhYmxlKHRhYmxlLCBBQ1BJX1BUUl9UT19QSFlTQUREUih0YWJsZSksCisJCQkJCSAgIEFDUElfVEFCTEVfT1JJR0lOX0lOVEVSTkFMX1ZJUlRVQUwsCisJCQkJCSAgIFRSVUUsICZ0YWJsZV9pbmRleCk7CisJYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCiAJCS8qIERlbGV0ZSBhbGxvY2F0ZWQgdGFibGUgYnVmZmVyICovCkBAIC00OTEsMjUgKzQ1MSwxMyBAQAogCX0KIAogCS8qCi0JICogTm90ZTogTm93IHRhYmxlIGlzICJJTlNUQUxMRUQiLCBpdCBtdXN0IGJlIHZhbGlkYXRlZCBiZWZvcmUKLQkgKiBsb2FkaW5nLgotCSAqLwotCXN0YXR1cyA9Ci0JICAgIGFjcGlfdGJfdmFsaWRhdGVfdGFibGUoJmFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC4KLQkJCQkgICB0YWJsZXNbdGFibGVfaW5kZXhdKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKIAkgKiBBZGQgdGhlIHRhYmxlIHRvIHRoZSBuYW1lc3BhY2UuCiAJICoKIAkgKiBOb3RlOiBMb2FkIHRoZSB0YWJsZSBvYmplY3RzIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBuYW1lc3BhY2UuCiAJICogVGhpcyBhcHBlYXJzIHRvIGdvIGFnYWluc3QgdGhlIEFDUEkgc3BlY2lmaWNhdGlvbiwgYnV0IHdlIGRvIGl0IGZvcgogCSAqIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBBQ1BJIGltcGxlbWVudGF0aW9ucy4KIAkgKi8KLQlzdGF0dXMgPQotCSAgICBhY3BpX2V4X2FkZF90YWJsZSh0YWJsZV9pbmRleCwgYWNwaV9nYmxfcm9vdF9ub2RlLCAmZGRiX2hhbmRsZSk7CisJc3RhdHVzID0gYWNwaV9leF9hZGRfdGFibGUodGFibGVfaW5kZXgsICZkZGJfaGFuZGxlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAogCQkvKiBPbiBlcnJvciwgdGFibGVfcHRyIHdhcyBkZWFsbG9jYXRlZCBhYm92ZSAqLwpAQCAtNTMyLDE0ICs0ODAsNiBAQAogCS8qIFJlbW92ZSB0aGUgcmVmZXJlbmNlIGJ5IGFkZGVkIGJ5IGFjcGlfZXhfc3RvcmUgYWJvdmUgKi8KIAogCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShkZGJfaGFuZGxlKTsKLQotCS8qIEludm9rZSB0YWJsZSBoYW5kbGVyIGlmIHByZXNlbnQgKi8KLQotCWlmIChhY3BpX2dibF90YWJsZV9oYW5kbGVyKSB7Ci0JCSh2b2lkKWFjcGlfZ2JsX3RhYmxlX2hhbmRsZXIoQUNQSV9UQUJMRV9FVkVOVF9MT0FELCB0YWJsZSwKLQkJCQkJICAgICBhY3BpX2dibF90YWJsZV9oYW5kbGVyX2NvbnRleHQpOwotCX0KLQogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCkBAIC01OTIsMTAgKzUzMiwxNyBAQAogCiAJdGFibGVfaW5kZXggPSB0YWJsZV9kZXNjLT5yZWZlcmVuY2UudmFsdWU7CiAKKwkvKgorCSAqIFJlbGVhc2UgdGhlIGludGVycHJldGVyIGxvY2sgc28gdGhhdCB0aGUgdGFibGUgbG9jayB3b24ndCBoYXZlCisJICogc3RyaWN0IG9yZGVyIHJlcXVpcmVtZW50IGFnYWluc3QgaXQuCisJICovCisJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CisKIAkvKiBFbnN1cmUgdGhlIHRhYmxlIGlzIHN0aWxsIGxvYWRlZCAqLwogCiAJaWYgKCFhY3BpX3RiX2lzX3RhYmxlX2xvYWRlZCh0YWJsZV9pbmRleCkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CisJCXN0YXR1cyA9IEFFX05PVF9FWElTVDsKKwkJZ290byBsb2NrX2FuZF9leGl0OwogCX0KIAogCS8qIEludm9rZSB0YWJsZSBoYW5kbGVyIGlmIHByZXNlbnQgKi8KQEAgLTYxMywxNiArNTYwLDI0IEBACiAKIAlzdGF0dXMgPSBhY3BpX3RiX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIodGFibGVfaW5kZXgpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJZ290byBsb2NrX2FuZF9leGl0OwogCX0KIAogCSh2b2lkKWFjcGlfdGJfcmVsZWFzZV9vd25lcl9pZCh0YWJsZV9pbmRleCk7CiAJYWNwaV90Yl9zZXRfdGFibGVfbG9hZGVkX2ZsYWcodGFibGVfaW5kZXgsIEZBTFNFKTsKIAorbG9ja19hbmRfZXhpdDoKKworCS8qIFJlLWFjcXVpcmUgdGhlIGludGVycHJldGVyIGxvY2sgKi8KKworCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKKwogCS8qCiAJICogSW52YWxpZGF0ZSB0aGUgaGFuZGxlLiBXZSBkbyB0aGlzIGJlY2F1c2UgdGhlIGhhbmRsZSBtYXkgYmUgc3RvcmVkCiAJICogaW4gYSBuYW1lZCBvYmplY3QgYW5kIG1heSBub3QgYmUgYWN0dWFsbHkgZGVsZXRlZCB1bnRpbCBtdWNoIGxhdGVyLgogCSAqLwotCWRkYl9oYW5kbGUtPmNvbW1vbi5mbGFncyAmPSB+QU9QT0JKX0RBVEFfVkFMSUQ7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJZGRiX2hhbmRsZS0+Y29tbW9uLmZsYWdzICY9IH5BT1BPQkpfREFUQV9WQUxJRDsKKwl9CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y29udnJ0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y29udnJ0LmMKaW5kZXggYjdlOWIzZC4uNTg4YWQxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leGNvbnZydC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhjb252cnQuYwpAQCAtMTI0LDkgKzEyNCw5IEBACiAJCSAqIG9mIEFDUEkgMy4wKSBpcyB0aGF0IHRoZSB0b19pbnRlZ2VyKCkgb3BlcmF0b3IgYWxsb3dzIGJvdGggZGVjaW1hbAogCQkgKiBhbmQgaGV4YWRlY2ltYWwgc3RyaW5ncyAoaGV4IHByZWZpeGVkIHdpdGggIjB4IikuCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX3V0X3N0cnRvdWw2NCgoY2hhciAqKXBvaW50ZXIsIGZsYWdzLAotCQkJCQkgICBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgsCi0JCQkJCSAgICZyZXN1bHQpOworCQlzdGF0dXMgPSBhY3BpX3V0X3N0cnRvdWw2NChBQ1BJX0NBU1RfUFRSKGNoYXIsIHBvaW50ZXIpLAorCQkJCQkgICAoYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoIHwKKwkJCQkJICAgIGZsYWdzKSwgJnJlc3VsdCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KQEAgLTYzMiw3ICs2MzIsNyBAQAogCQkJICovCiAJCQlzdGF0dXMgPQogCQkJICAgIGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKHNvdXJjZV9kZXNjLCByZXN1bHRfZGVzYywKLQkJCQkJCSAgICAgICAxNik7CisJCQkJCQkgICAgICAgQUNQSV9TVFJUT1VMX0JBU0UxNik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4bWlzYy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leG1pc2MuYwppbmRleCA0ZjdlNjY3Li4zN2M4OGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4bWlzYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhtaXNjLmMKQEAgLTMyNyw4ICszMjcsOCBAQAogCXN3aXRjaCAob3BlcmFuZDAtPmNvbW1vbi50eXBlKSB7CiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIob3BlcmFuZDEsICZsb2NhbF9vcGVyYW5kMSwgMTYpOworCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9faW50ZWdlcihvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxLAorCQkJCQkJICAgIEFDUElfU1RSVE9VTF9CQVNFMTYpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhvcGFyZzEuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhvcGFyZzEuYwppbmRleCA0ZTE3NTA2Li4wMDczMDA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4b3BhcmcxLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leG9wYXJnMS5jCkBAIC01MjEsOSArNTIxLDEwIEBACiAKIAljYXNlIEFNTF9UT19JTlRFR0VSX09QOgkvKiB0b19pbnRlZ2VyIChEYXRhLCBSZXN1bHQpICovCiAKKwkJLyogUGVyZm9ybSAiZXhwbGljaXQiIGNvbnZlcnNpb24gKi8KKwogCQlzdGF0dXMgPQotCQkgICAgYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIob3BlcmFuZFswXSwgJnJldHVybl9kZXNjLAotCQkJCQkgICAgICAgQUNQSV9BTllfQkFTRSk7CisJCSAgICBhY3BpX2V4X2NvbnZlcnRfdG9faW50ZWdlcihvcGVyYW5kWzBdLCAmcmV0dXJuX2Rlc2MsIDApOwogCQlpZiAocmV0dXJuX2Rlc2MgPT0gb3BlcmFuZFswXSkgewogCiAJCQkvKiBObyBjb252ZXJzaW9uIHBlcmZvcm1lZCwgYWRkIHJlZiB0byBoYW5kbGUgcmV0dXJuIHZhbHVlICovCkBAIC04OTAsMTQgKzg5MSwxNiBAQAogCQkJCSAqICAgIEZpZWxkLCBzbyB3ZSBuZWVkIHRvIHJlc29sdmUgdGhlIG5vZGUgdG8gYSB2YWx1ZS4KIAkJCQkgKi8KIAkJCQlzdGF0dXMgPQotCQkJCSAgICBhY3BpX25zX2dldF9ub2RlKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8tPgotCQkJCQkJICAgICBzY29wZS5ub2RlLAotCQkJCQkJICAgICBvcGVyYW5kWzBdLT5zdHJpbmcucG9pbnRlciwKLQkJCQkJCSAgICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAotCQkJCQkJICAgICBBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSCi0JCQkJCQkgICAgIChzdHJ1Y3QKLQkJCQkJCSAgICAgIGFjcGlfbmFtZXNwYWNlX25vZGUsCi0JCQkJCQkgICAgICAmcmV0dXJuX2Rlc2MpKTsKKwkJCQkgICAgYWNwaV9uc19nZXRfbm9kZV91bmxvY2tlZCh3YWxrX3N0YXRlLT4KKwkJCQkJCQkgICAgICBzY29wZV9pbmZvLT5zY29wZS4KKwkJCQkJCQkgICAgICBub2RlLAorCQkJCQkJCSAgICAgIG9wZXJhbmRbMF0tPgorCQkJCQkJCSAgICAgIHN0cmluZy5wb2ludGVyLAorCQkJCQkJCSAgICAgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwKKwkJCQkJCQkgICAgICBBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSCisJCQkJCQkJICAgICAgKHN0cnVjdAorCQkJCQkJCSAgICAgICBhY3BpX25hbWVzcGFjZV9ub2RlLAorCQkJCQkJCSAgICAgICAmcmV0dXJuX2Rlc2MpKTsKIAkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQkJZ290byBjbGVhbnVwOwogCQkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhyZXNvcC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlc29wLmMKaW5kZXggMjdiNDFmZC4uZjI5ZWJhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlc29wLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlc29wLmMKQEAgLTQxMCwxMiArNDEwLDEzIEBACiAJCWNhc2UgQVJHSV9JTlRFR0VSOgogCiAJCQkvKgotCQkJICogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgQUNQSV9UWVBFX0lOVEVHRVIsCi0JCQkgKiBCdXQgd2UgY2FuIGltcGxpY2l0bHkgY29udmVydCBmcm9tIGEgU1RSSU5HIG9yIEJVRkZFUgotCQkJICogYWthIC0gIkltcGxpY2l0IFNvdXJjZSBPcGVyYW5kIENvbnZlcnNpb24iCisJCQkgKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfSU5URUdFUiwgYnV0IHdlIGNhbgorCQkJICogaW1wbGljaXRseSBjb252ZXJ0IGZyb20gYSBTVFJJTkcgb3IgQlVGRkVSLgorCQkJICoKKwkJCSAqIEtub3duIGFzICJJbXBsaWNpdCBTb3VyY2UgT3BlcmFuZCBDb252ZXJzaW9uIgogCQkJICovCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKG9ial9kZXNjLCBzdGFja19wdHIsIDE2KTsKKwkJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKG9ial9kZXNjLCBzdGFja19wdHIsCisJCQkJCQkJICAgIEFDUElfU1RSVE9VTF9CQVNFMTYpOwogCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJaWYgKHN0YXR1cyA9PSBBRV9UWVBFKSB7CiAJCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4dHJhY2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXh0cmFjZS5jCmluZGV4IGI1MmU4NDguLmM5Y2E4MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXh0cmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXh0cmFjZS5jCkBAIC0yMDEsNyArMjAxLDYgQEAKIAkJCSAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAogCQkJICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJY2hhciAqcGF0aG5hbWUgPSBOVUxMOwogCXU4IGVuYWJsZWQgPSBGQUxTRTsKIApAQCAtMjExLDExICsyMTAsNiBAQAogCQlwYXRobmFtZSA9IGFjcGlfbnNfZ2V0X25vcm1hbGl6ZWRfcGF0aG5hbWUobWV0aG9kX25vZGUsIFRSVUUpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGV4aXQ7Ci0JfQotCiAJZW5hYmxlZCA9IGFjcGlfZXhfaW50ZXJwcmV0ZXJfdHJhY2VfZW5hYmxlZChwYXRobmFtZSk7CiAJaWYgKGVuYWJsZWQgJiYgIWFjcGlfZ2JsX3RyYWNlX21ldGhvZF9vYmplY3QpIHsKIAkJYWNwaV9nYmxfdHJhY2VfbWV0aG9kX29iamVjdCA9IG9ial9kZXNjOwpAQCAtMjMzLDkgKzIyNyw2IEBACiAJCX0KIAl9CiAKLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQotZXhpdDoKIAlpZiAoZW5hYmxlZCkgewogCQlBQ1BJX1RSQUNFX1BPSU5UKEFDUElfVFJBQ0VfQU1MX01FVEhPRCwgVFJVRSwKIAkJCQkgb2JqX2Rlc2MgPyBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCA6IE5VTEwsCkBAIC0yNjcsNyArMjU4LDYgQEAKIAkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCiAJCQkgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwogCWNoYXIgKnBhdGhuYW1lID0gTlVMTDsKIAl1OCBlbmFibGVkOwogCkBAIC0yNzcsMjYgKzI2NywxNCBAQAogCQlwYXRobmFtZSA9IGFjcGlfbnNfZ2V0X25vcm1hbGl6ZWRfcGF0aG5hbWUobWV0aG9kX25vZGUsIFRSVUUpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGV4aXRfcGF0aDsKLQl9Ci0KIAllbmFibGVkID0gYWNwaV9leF9pbnRlcnByZXRlcl90cmFjZV9lbmFibGVkKE5VTEwpOwogCi0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0KIAlpZiAoZW5hYmxlZCkgewogCQlBQ1BJX1RSQUNFX1BPSU5UKEFDUElfVFJBQ0VfQU1MX01FVEhPRCwgRkFMU0UsCiAJCQkJIG9ial9kZXNjID8gb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQgOiBOVUxMLAogCQkJCSBwYXRobmFtZSk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gZXhpdF9wYXRoOwotCX0KLQogCS8qIENoZWNrIHdoZXRoZXIgdGhlIHRyYWNlciBzaG91bGQgYmUgc3RvcHBlZCAqLwogCiAJaWYgKGFjcGlfZ2JsX3RyYWNlX21ldGhvZF9vYmplY3QgPT0gb2JqX2Rlc2MpIHsKQEAgLTMxMiw5ICsyOTAsNiBAQAogCQlhY3BpX2dibF90cmFjZV9tZXRob2Rfb2JqZWN0ID0gTlVMTDsKIAl9CiAKLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQotZXhpdF9wYXRoOgogCWlmIChwYXRobmFtZSkgewogCQlBQ1BJX0ZSRUUocGF0aG5hbWUpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXh1dGlscy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHV0aWxzLmMKaW5kZXggNDI1ZjEzMy4uYThiODU3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHV0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHV0aWxzLmMKQEAgLTk0LDYgKzk0LDEwIEBACiAJCUFDUElfRVJST1IoKEFFX0lORk8sCiAJCQkgICAgIkNvdWxkIG5vdCBhY3F1aXJlIEFNTCBJbnRlcnByZXRlciBtdXRleCIpKTsKIAl9CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sICJDb3VsZCBub3QgYWNxdWlyZSBBTUwgTmFtZXNwYWNlIG11dGV4IikpOworCX0KIAogCXJldHVybl9WT0lEOwogfQpAQCAtMTI3LDYgKzEzMSwxMCBAQAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShleF9leGl0X2ludGVycHJldGVyKTsKIAorCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiQ291bGQgbm90IHJlbGVhc2UgQU1MIE5hbWVzcGFjZSBtdXRleCIpKTsKKwl9CiAJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0lOVEVSUFJFVEVSKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdncGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdncGUuYwppbmRleCBiZGVjZDVlLi43NmIwZTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3Z3BlLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od2dwZS5jCkBAIC05OCw3ICs5OCw3IEBACiBhY3BpX2h3X2xvd19zZXRfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbywgdTMyIGFjdGlvbikKIHsKIAlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAqZ3BlX3JlZ2lzdGVyX2luZm87Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXUzMiBlbmFibGVfbWFzazsKIAl1MzIgcmVnaXN0ZXJfYml0OwogCkBAIC0xNDgsOSArMTQ4LDE0IEBACiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JLyogV3JpdGUgdGhlIHVwZGF0ZWQgZW5hYmxlIG1hc2sgKi8KKwlpZiAoIShyZWdpc3Rlcl9iaXQgJiBncGVfcmVnaXN0ZXJfaW5mby0+bWFza19mb3JfcnVuKSkgewogCi0Jc3RhdHVzID0gYWNwaV9od193cml0ZShlbmFibGVfbWFzaywgJmdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfYWRkcmVzcyk7CisJCS8qIFdyaXRlIHRoZSB1cGRhdGVkIGVuYWJsZSBtYXNrICovCisKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfd3JpdGUoZW5hYmxlX21hc2ssCisJCQkJICAmZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9hZGRyZXNzKTsKKwl9CiAJcmV0dXJuIChzdGF0dXMpOwogfQogCkBAIC0yNDIsNiArMjQ3LDEyIEBACiAJCWxvY2FsX2V2ZW50X3N0YXR1cyB8PSBBQ1BJX0VWRU5UX0ZMQUdfRU5BQkxFRDsKIAl9CiAKKwkvKiBHUEUgY3VycmVudGx5IG1hc2tlZD8gKG1hc2tlZCBmb3IgcnVudGltZT8pICovCisKKwlpZiAocmVnaXN0ZXJfYml0ICYgZ3BlX3JlZ2lzdGVyX2luZm8tPm1hc2tfZm9yX3J1bikgeworCQlsb2NhbF9ldmVudF9zdGF0dXMgfD0gQUNQSV9FVkVOVF9GTEFHX01BU0tFRDsKKwl9CisKIAkvKiBHUEUgZW5hYmxlZCBmb3Igd2FrZT8gKi8KIAogCWlmIChyZWdpc3Rlcl9iaXQgJiBncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl93YWtlKSB7CkBAIC0zOTcsNiArNDA4LDcgQEAKIAl1MzIgaTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8gKmdwZV9yZWdpc3Rlcl9pbmZvOworCXU4IGVuYWJsZV9tYXNrOwogCiAJLyogTk9URTogYXNzdW1lcyB0aGF0IGFsbCBHUEVzIGFyZSBjdXJyZW50bHkgZGlzYWJsZWQgKi8KIApAQCAtNDEwLDkgKzQyMiwxMCBAQAogCiAJCS8qIEVuYWJsZSBhbGwgInJ1bnRpbWUiIEdQRXMgaW4gdGhpcyByZWdpc3RlciAqLwogCisJCWVuYWJsZV9tYXNrID0gZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuICYKKwkJICAgIH5ncGVfcmVnaXN0ZXJfaW5mby0+bWFza19mb3JfcnVuOwogCQlzdGF0dXMgPQotCQkgICAgYWNwaV9od19ncGVfZW5hYmxlX3dyaXRlKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3J1biwKLQkJCQkJICAgICBncGVfcmVnaXN0ZXJfaW5mbyk7CisJCSAgICBhY3BpX2h3X2dwZV9lbmFibGVfd3JpdGUoZW5hYmxlX21hc2ssIGdwZV9yZWdpc3Rlcl9pbmZvKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm4gKHN0YXR1cyk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNhY2Nlc3MuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNhY2Nlc3MuYwppbmRleCA0MjZhNjMwLi43M2Y5OGQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zYWNjZXNzLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc2FjY2Vzcy5jCkBAIC0xMDgsOSArMTA4LDkgQEAKIAkJfQogCiAJCXN0YXR1cyA9Ci0JCSAgICBhY3BpX25zX2xvb2t1cChOVUxMLCAoY2hhciAqKWluaXRfdmFsLT5uYW1lLCBpbml0X3ZhbC0+dHlwZSwKLQkJCQkgICBBQ1BJX0lNT0RFX0xPQURfUEFTUzIsIEFDUElfTlNfTk9fVVBTRUFSQ0gsCi0JCQkJICAgTlVMTCwgJm5ld19ub2RlKTsKKwkJICAgIGFjcGlfbnNfbG9va3VwKE5VTEwsIEFDUElfQ0FTVF9QVFIoY2hhciwgaW5pdF92YWwtPm5hbWUpLAorCQkJCSAgIGluaXRfdmFsLT50eXBlLCBBQ1BJX0lNT0RFX0xPQURfUEFTUzIsCisJCQkJICAgQUNQSV9OU19OT19VUFNFQVJDSCwgTlVMTCwgJm5ld19ub2RlKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAogCQkJCQkiQ291bGQgbm90IGNyZWF0ZSBwcmVkZWZpbmVkIG5hbWUgJXMiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2NvbnZlcnQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNjb252ZXJ0LmMKaW5kZXggYzgwM2JkYS4uMmI4NWRlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2NvbnZlcnQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zY29udmVydC5jCkBAIC03OSw3ICs3OSw2IEBACiAJCS8qIFN0cmluZy10by1JbnRlZ2VyIGNvbnZlcnNpb24gKi8KIAogCQlzdGF0dXMgPSBhY3BpX3V0X3N0cnRvdWw2NChvcmlnaW5hbF9vYmplY3QtPnN0cmluZy5wb2ludGVyLAotCQkJCQkgICBBQ1BJX0FOWV9CQVNFLAogCQkJCQkgICBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgsICZ2YWx1ZSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcmV0dXJuIChzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2R1bXAuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNkdW1wLmMKaW5kZXggY2UxZjg2MC4uODRmMzVkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2R1bXAuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zZHVtcC5jCkBAIC0zMzgsNyArMzM4LDcgQEAKIAkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCiAJCQlhY3BpX29zX3ByaW50ZigiTGVuICUuMlggIiwgb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgpOwotCQkJYWNwaV91dF9wcmludF9zdHJpbmcob2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLCAzMik7CisJCQlhY3BpX3V0X3ByaW50X3N0cmluZyhvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIsIDgwKTsKIAkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwogCQkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNsb2FkLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zbG9hZC5jCmluZGV4IGI1ZTJiMGEuLjMzNGQzYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNsb2FkLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc2xvYWQuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgImFjbmFtZXNwLmgiCiAjaW5jbHVkZSAiYWNkaXNwYXQuaCIKICNpbmNsdWRlICJhY3RhYmxlcy5oIgorI2luY2x1ZGUgImFjaW50ZXJwLmgiCiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQogQUNQSV9NT0RVTEVfTkFNRSgibnNsb2FkIikKQEAgLTc4LDIwICs3OSw2IEBACiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2xvYWRfdGFibGUpOwogCi0JLyoKLQkgKiBQYXJzZSB0aGUgdGFibGUgYW5kIGxvYWQgdGhlIG5hbWVzcGFjZSB3aXRoIGFsbCBuYW1lZAotCSAqIG9iamVjdHMgZm91bmQgd2l0aGluLiBDb250cm9sIG1ldGhvZHMgYXJlIE5PVCBwYXJzZWQKLQkgKiBhdCB0aGlzIHRpbWUuIEluIGZhY3QsIHRoZSBjb250cm9sIG1ldGhvZHMgY2Fubm90IGJlCi0JICogcGFyc2VkIHVudGlsIHRoZSBlbnRpcmUgbmFtZXNwYWNlIGlzIGxvYWRlZCwgYmVjYXVzZQotCSAqIGlmIGEgY29udHJvbCBtZXRob2QgbWFrZXMgYSBmb3J3YXJkIHJlZmVyZW5jZSAoY2FsbCkKLQkgKiB0byBhbm90aGVyIGNvbnRyb2wgbWV0aG9kLCB3ZSBjYW4ndCBjb250aW51ZSBwYXJzaW5nCi0JICogYmVjYXVzZSB3ZSBkb24ndCBrbm93IGhvdyBtYW55IGFyZ3VtZW50cyB0byBwYXJzZSBuZXh0IQotCSAqLwotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KIAkvKiBJZiB0YWJsZSBhbHJlYWR5IGxvYWRlZCBpbnRvIG5hbWVzcGFjZSwganVzdCByZXR1cm4gKi8KIAogCWlmIChhY3BpX3RiX2lzX3RhYmxlX2xvYWRlZCh0YWJsZV9pbmRleCkpIHsKQEAgLTEwNyw2ICs5NCwxNSBAQAogCQlnb3RvIHVubG9jazsKIAl9CiAKKwkvKgorCSAqIFBhcnNlIHRoZSB0YWJsZSBhbmQgbG9hZCB0aGUgbmFtZXNwYWNlIHdpdGggYWxsIG5hbWVkCisJICogb2JqZWN0cyBmb3VuZCB3aXRoaW4uIENvbnRyb2wgbWV0aG9kcyBhcmUgTk9UIHBhcnNlZAorCSAqIGF0IHRoaXMgdGltZS4gSW4gZmFjdCwgdGhlIGNvbnRyb2wgbWV0aG9kcyBjYW5ub3QgYmUKKwkgKiBwYXJzZWQgdW50aWwgdGhlIGVudGlyZSBuYW1lc3BhY2UgaXMgbG9hZGVkLCBiZWNhdXNlCisJICogaWYgYSBjb250cm9sIG1ldGhvZCBtYWtlcyBhIGZvcndhcmQgcmVmZXJlbmNlIChjYWxsKQorCSAqIHRvIGFub3RoZXIgY29udHJvbCBtZXRob2QsIHdlIGNhbid0IGNvbnRpbnVlIHBhcnNpbmcKKwkgKiBiZWNhdXNlIHdlIGRvbid0IGtub3cgaG93IG1hbnkgYXJndW1lbnRzIHRvIHBhcnNlIG5leHQhCisJICovCiAJc3RhdHVzID0gYWNwaV9uc19wYXJzZV90YWJsZSh0YWJsZV9pbmRleCwgbm9kZSk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCWFjcGlfdGJfc2V0X3RhYmxlX2xvYWRlZF9mbGFnKHRhYmxlX2luZGV4LCBUUlVFKTsKQEAgLTEyMCw3ICsxMTYsNiBAQAogCQkgKiBleGlzdC4gVGhpcyB0YXJnZXQgb2YgU2NvcGUgbXVzdCBhbHJlYWR5IGV4aXN0IGluIHRoZQogCQkgKiBuYW1lc3BhY2UsIGFzIHBlciB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLgogCQkgKi8KLQkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAJCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcihhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuCiAJCQkJCQkgIHRhYmxlc1t0YWJsZV9pbmRleF0ub3duZXJfaWQpOwogCkBAIC0xMjksOCArMTI0LDYgQEAKIAl9CiAKIHVubG9jazoKLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CkBAIC0xNjIsNyArMTU1LDggQEAKIAkgKiBvdGhlciBBQ1BJIGltcGxlbWVudGF0aW9ucy4gT3B0aW9uYWxseSwgdGhlIGV4ZWN1dGlvbiBjYW4gYmUgZGVmZXJyZWQKIAkgKiB1bnRpbCBsYXRlciwgc2VlIGFjcGlfaW5pdGlhbGl6ZV9vYmplY3RzLgogCSAqLwotCWlmICghYWNwaV9nYmxfZ3JvdXBfbW9kdWxlX2xldmVsX2NvZGUpIHsKKwlpZiAoIWFjcGlfZ2JsX3BhcnNlX3RhYmxlX2FzX3Rlcm1fbGlzdAorCSAgICAmJiAhYWNwaV9nYmxfZ3JvdXBfbW9kdWxlX2xldmVsX2NvZGUpIHsKIAkJYWNwaV9uc19leGVjX21vZHVsZV9jb2RlX2xpc3QoKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNwYXJzZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3BhcnNlLmMKaW5kZXggZjYzMWE0Ny4uNGYxNGU5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3BhcnNlLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3BhcnNlLmMKQEAgLTQ3LDEyICs0NywxMDMgQEAKICNpbmNsdWRlICJhY3BhcnNlci5oIgogI2luY2x1ZGUgImFjZGlzcGF0LmgiCiAjaW5jbHVkZSAiYWN0YWJsZXMuaCIKKyNpbmNsdWRlICJhY2ludGVycC5oIgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKIEFDUElfTU9EVUxFX05BTUUoIm5zcGFyc2UiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKKyAqIEZVTkNUSU9OOiAgICBuc19leGVjdXRlX3RhYmxlCisgKgorICogUEFSQU1FVEVSUzogIHRhYmxlX2Rlc2MgICAgICAtIEFuIEFDUEkgdGFibGUgZGVzY3JpcHRvciBmb3IgdGFibGUgdG8gcGFyc2UKKyAqICAgICAgICAgICAgICBzdGFydF9ub2RlICAgICAgLSBXaGVyZSB0byBlbnRlciB0aGUgdGFibGUgaW50byB0aGUgbmFtZXNwYWNlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBMb2FkIEFDUEkvQU1MIHRhYmxlIGJ5IGV4ZWN1dGluZyB0aGUgZW50aXJlIHRhYmxlIGFzIGEKKyAqICAgICAgICAgICAgICB0ZXJtX2xpc3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX25zX2V4ZWN1dGVfdGFibGUodTMyIHRhYmxlX2luZGV4LCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqc3RhcnRfbm9kZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKKwlhY3BpX293bmVyX2lkIG93bmVyX2lkOworCXN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8gPSBOVUxMOworCXUzMiBhbWxfbGVuZ3RoOworCXU4ICphbWxfc3RhcnQ7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbWV0aG9kX29iaiA9IE5VTEw7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2V4ZWN1dGVfdGFibGUpOworCisJc3RhdHVzID0gYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgodGFibGVfaW5kZXgsICZ0YWJsZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIFRhYmxlIG11c3QgY29uc2lzdCBvZiBhdCBsZWFzdCBhIGNvbXBsZXRlIGhlYWRlciAqLworCisJaWYgKHRhYmxlLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0hFQURFUik7CisJfQorCisJYW1sX3N0YXJ0ID0gKHU4ICopdGFibGUgKyBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKTsKKwlhbWxfbGVuZ3RoID0gdGFibGUtPmxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpOworCisJc3RhdHVzID0gYWNwaV90Yl9nZXRfb3duZXJfaWQodGFibGVfaW5kZXgsICZvd25lcl9pZCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIENyZWF0ZSwgaW5pdGlhbGl6ZSwgYW5kIGxpbmsgYSBuZXcgdGVtcG9yYXJ5IG1ldGhvZCBvYmplY3QgKi8KKworCW1ldGhvZF9vYmogPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX01FVEhPRCk7CisJaWYgKCFtZXRob2Rfb2JqKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBldmFsdWF0aW9uIGluZm9ybWF0aW9uIGJsb2NrICovCisKKwlpbmZvID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8pKTsKKwlpZiAoIWluZm8pIHsKKwkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKKwkJCSAgIkNyZWF0ZSB0YWJsZSBjb2RlIGJsb2NrOiAlcFxuIiwgbWV0aG9kX29iaikpOworCisJbWV0aG9kX29iai0+bWV0aG9kLmFtbF9zdGFydCA9IGFtbF9zdGFydDsKKwltZXRob2Rfb2JqLT5tZXRob2QuYW1sX2xlbmd0aCA9IGFtbF9sZW5ndGg7CisJbWV0aG9kX29iai0+bWV0aG9kLm93bmVyX2lkID0gb3duZXJfaWQ7CisJbWV0aG9kX29iai0+bWV0aG9kLmluZm9fZmxhZ3MgfD0gQUNQSV9NRVRIT0RfTU9EVUxFX0xFVkVMOworCisJaW5mby0+cGFzc19udW1iZXIgPSBBQ1BJX0lNT0RFX0VYRUNVVEU7CisJaW5mby0+bm9kZSA9IHN0YXJ0X25vZGU7CisJaW5mby0+b2JqX2Rlc2MgPSBtZXRob2Rfb2JqOworCWluZm8tPm5vZGVfZmxhZ3MgPSBpbmZvLT5ub2RlLT5mbGFnczsKKwlpbmZvLT5mdWxsX3BhdGhuYW1lID0gYWNwaV9uc19nZXRfbm9ybWFsaXplZF9wYXRobmFtZShpbmZvLT5ub2RlLCBUUlVFKTsKKwlpZiAoIWluZm8tPmZ1bGxfcGF0aG5hbWUpIHsKKwkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJc3RhdHVzID0gYWNwaV9wc19leGVjdXRlX3RhYmxlKGluZm8pOworCitjbGVhbnVwOgorCWlmIChpbmZvKSB7CisJCUFDUElfRlJFRShpbmZvLT5mdWxsX3BhdGhuYW1lKTsKKwkJaW5mby0+ZnVsbF9wYXRobmFtZSA9IE5VTEw7CisJfQorCUFDUElfRlJFRShpbmZvKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UobWV0aG9kX29iaik7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogICogRlVOQ1RJT046ICAgIG5zX29uZV9jb21wbGV0ZV9wYXJzZQogICoKICAqIFBBUkFNRVRFUlM6ICBwYXNzX251bWJlciAgICAgICAgICAgICAtIDEgb3IgMgpAQCAtNjMsNiArMTU0LDcgQEAKICAqIERFU0NSSVBUSU9OOiBQZXJmb3JtIG9uZSBjb21wbGV0ZSBwYXJzZSBvZiBhbiBBQ1BJL0FNTCB0YWJsZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBhY3BpX3N0YXR1cwogYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UodTMyIHBhc3NfbnVtYmVyLAogCQkJICAgdTMyIHRhYmxlX2luZGV4LApAQCAtMTQzLDcgKzIzNSw5IEBACiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAogCQkJICAiKlBBUlNFKiBwYXNzICV1IHBhcnNlXG4iLCBwYXNzX251bWJlcikpOworCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKIAlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCh3YWxrX3N0YXRlKTsKKwlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKIAogY2xlYW51cDoKIAlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlKHBhcnNlX3Jvb3QpOwpAQCAtMTcwLDM4ICsyNjQsNDcgQEAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfcGFyc2VfdGFibGUpOwogCi0JLyoKLQkgKiBBTUwgUGFyc2UsIHBhc3MgMQotCSAqCi0JICogSW4gdGhpcyBwYXNzLCB3ZSBsb2FkIG1vc3Qgb2YgdGhlIG5hbWVzcGFjZS4gQ29udHJvbCBtZXRob2RzCi0JICogYXJlIG5vdCBwYXJzZWQgdW50aWwgbGF0ZXIuIEEgcGFyc2UgdHJlZSBpcyBub3QgY3JlYXRlZC4gSW5zdGVhZCwKLQkgKiBlYWNoIFBhcnNlciBPcCBzdWJ0cmVlIGlzIGRlbGV0ZWQgd2hlbiBpdCBpcyBmaW5pc2hlZC4gVGhpcyBzYXZlcwotCSAqIGEgZ3JlYXQgZGVhbCBvZiBtZW1vcnksIGFuZCBhbGxvd3MgYSBzbWFsbCBjYWNoZSBvZiBwYXJzZSBvYmplY3RzCi0JICogdG8gc2VydmljZSB0aGUgZW50aXJlIHBhcnNlLiBUaGUgc2Vjb25kIHBhc3Mgb2YgdGhlIHBhcnNlIHRoZW4KLQkgKiBwZXJmb3JtcyBhbm90aGVyIGNvbXBsZXRlIHBhcnNlIG9mIHRoZSBBTUwuCi0JICovCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIioqKiogU3RhcnQgcGFzcyAxXG4iKSk7CisJaWYgKGFjcGlfZ2JsX3BhcnNlX3RhYmxlX2FzX3Rlcm1fbGlzdCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLCAiKioqKiBTdGFydCBsb2FkIHBhc3NcbiIpKTsKIAotCXN0YXR1cyA9IGFjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKEFDUElfSU1PREVfTE9BRF9QQVNTMSwKLQkJCQkJICAgIHRhYmxlX2luZGV4LCBzdGFydF9ub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQorCQlzdGF0dXMgPSBhY3BpX25zX2V4ZWN1dGVfdGFibGUodGFibGVfaW5kZXgsIHN0YXJ0X25vZGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQU1MIFBhcnNlLCBwYXNzIDEKKwkJICoKKwkJICogSW4gdGhpcyBwYXNzLCB3ZSBsb2FkIG1vc3Qgb2YgdGhlIG5hbWVzcGFjZS4gQ29udHJvbCBtZXRob2RzCisJCSAqIGFyZSBub3QgcGFyc2VkIHVudGlsIGxhdGVyLiBBIHBhcnNlIHRyZWUgaXMgbm90IGNyZWF0ZWQuCisJCSAqIEluc3RlYWQsIGVhY2ggUGFyc2VyIE9wIHN1YnRyZWUgaXMgZGVsZXRlZCB3aGVuIGl0IGlzIGZpbmlzaGVkLgorCQkgKiBUaGlzIHNhdmVzIGEgZ3JlYXQgZGVhbCBvZiBtZW1vcnksIGFuZCBhbGxvd3MgYSBzbWFsbCBjYWNoZSBvZgorCQkgKiBwYXJzZSBvYmplY3RzIHRvIHNlcnZpY2UgdGhlIGVudGlyZSBwYXJzZS4gVGhlIHNlY29uZCBwYXNzIG9mCisJCSAqIHRoZSBwYXJzZSB0aGVuIHBlcmZvcm1zIGFub3RoZXIgY29tcGxldGUgcGFyc2Ugb2YgdGhlIEFNTC4KKwkJICovCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsICIqKioqIFN0YXJ0IHBhc3MgMVxuIikpOwogCi0JLyoKLQkgKiBBTUwgUGFyc2UsIHBhc3MgMgotCSAqCi0JICogSW4gdGhpcyBwYXNzLCB3ZSByZXNvbHZlIGZvcndhcmQgcmVmZXJlbmNlcyBhbmQgb3RoZXIgdGhpbmdzCi0JICogdGhhdCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1cmluZyB0aGUgZmlyc3QgcGFzcy4KLQkgKiBBbm90aGVyIGNvbXBsZXRlIHBhcnNlIG9mIHRoZSBBTUwgaXMgcGVyZm9ybWVkLCBidXQgdGhlCi0JICogb3ZlcmhlYWQgb2YgdGhpcyBpcyBjb21wZW5zYXRlZCBmb3IgYnkgdGhlIGZhY3QgdGhhdCB0aGUKLQkgKiBwYXJzZSBvYmplY3RzIGFyZSBhbGwgY2FjaGVkLgotCSAqLwotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsICIqKioqIFN0YXJ0IHBhc3MgMlxuIikpOwotCXN0YXR1cyA9IGFjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKEFDUElfSU1PREVfTE9BRF9QQVNTMiwKLQkJCQkJICAgIHRhYmxlX2luZGV4LCBzdGFydF9ub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKEFDUElfSU1PREVfTE9BRF9QQVNTMSwKKwkJCQkJCSAgICB0YWJsZV9pbmRleCwgc3RhcnRfbm9kZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKworCQkvKgorCQkgKiBBTUwgUGFyc2UsIHBhc3MgMgorCQkgKgorCQkgKiBJbiB0aGlzIHBhc3MsIHdlIHJlc29sdmUgZm9yd2FyZCByZWZlcmVuY2VzIGFuZCBvdGhlciB0aGluZ3MKKwkJICogdGhhdCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1cmluZyB0aGUgZmlyc3QgcGFzcy4KKwkJICogQW5vdGhlciBjb21wbGV0ZSBwYXJzZSBvZiB0aGUgQU1MIGlzIHBlcmZvcm1lZCwgYnV0IHRoZQorCQkgKiBvdmVyaGVhZCBvZiB0aGlzIGlzIGNvbXBlbnNhdGVkIGZvciBieSB0aGUgZmFjdCB0aGF0IHRoZQorCQkgKiBwYXJzZSBvYmplY3RzIGFyZSBhbGwgY2FjaGVkLgorCQkgKi8KKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIioqKiogU3RhcnQgcGFzcyAyXG4iKSk7CisJCXN0YXR1cyA9IGFjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKEFDUElfSU1PREVfTE9BRF9QQVNTMiwKKwkJCQkJCSAgICB0YWJsZV9pbmRleCwgc3RhcnRfbm9kZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KIAl9CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN1dGlscy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3V0aWxzLmMKaW5kZXggNzg0YTMwYi4uNjkxODE0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3V0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3V0aWxzLmMKQEAgLTY2Miw3ICs2NjIsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9ub2RlCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfbm9kZV91bmxvY2tlZAogICoKICAqIFBBUkFNRVRFUlM6ICAqcGF0aG5hbWUgICAtIE5hbWUgdG8gYmUgZm91bmQsIGluIGV4dGVybmFsIChBU0wpIGZvcm1hdC4gVGhlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIChiYWNrc2xhc2gpIGFuZCBeIChjYXJhdCkgcHJlZml4ZXMsIGFuZCB0aGUKQEAgLTY3OCwyMCArNjc4LDIxIEBACiAgKiBERVNDUklQVElPTjogTG9vayB1cCBhIG5hbWUgcmVsYXRpdmUgdG8gYSBnaXZlbiBzY29wZSBhbmQgcmV0dXJuIHRoZQogICogICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgTm9kZS4gTk9URTogU2NvcGUgY2FuIGJlIG51bGwuCiAgKgotICogTVVURVg6ICAgICAgIExvY2tzIG5hbWVzcGFjZQorICogTVVURVg6ICAgICAgIERvZXNuJ3QgbG9ja3MgbmFtZXNwYWNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfZ2V0X25vZGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlLAotCQkgY29uc3QgY2hhciAqcGF0aG5hbWUsCi0JCSB1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqcmV0dXJuX25vZGUpCithY3BpX25zX2dldF9ub2RlX3VubG9ja2VkKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwcmVmaXhfbm9kZSwKKwkJCSAgY29uc3QgY2hhciAqcGF0aG5hbWUsCisJCQkgIHUzMiBmbGFncywgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXR1cm5fbm9kZSkKIHsKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgc2NvcGVfaW5mbzsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJY2hhciAqaW50ZXJuYWxfcGF0aDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKG5zX2dldF9ub2RlLCBBQ1BJX0NBU1RfUFRSKGNoYXIsIHBhdGhuYW1lKSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIobnNfZ2V0X25vZGVfdW5sb2NrZWQsCisJCQkJQUNQSV9DQVNUX1BUUihjaGFyLCBwYXRobmFtZSkpOwogCiAJLyogU2ltcGxlc3QgY2FzZSBpcyBhIG51bGwgcGF0aG5hbWUgKi8KIApAQCAtNzE4LDEzICs3MTksNiBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQkvKiBNdXN0IGxvY2sgbmFtZXNwYWNlIGR1cmluZyBsb29rdXAgKi8KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGNsZWFudXA7Ci0JfQotCiAJLyogU2V0dXAgbG9va3VwIHNjb3BlIChzZWFyY2ggc3RhcnRpbmcgcG9pbnQpICovCiAKIAlzY29wZV9pbmZvLnNjb3BlLm5vZGUgPSBwcmVmaXhfbm9kZTsKQEAgLTc0MCw5ICs3MzQsNDkgQEAKIAkJCQkgIHBhdGhuYW1lLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCX0KIAotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCi1jbGVhbnVwOgogCUFDUElfRlJFRShpbnRlcm5hbF9wYXRoKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfbm9kZQorICoKKyAqIFBBUkFNRVRFUlM6ICAqcGF0aG5hbWUgICAtIE5hbWUgdG8gYmUgZm91bmQsIGluIGV4dGVybmFsIChBU0wpIGZvcm1hdC4gVGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIChiYWNrc2xhc2gpIGFuZCBeIChjYXJhdCkgcHJlZml4ZXMsIGFuZCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gKHBlcmlvZCkgdG8gc2VwYXJhdGUgc2VnbWVudHMgYXJlIHN1cHBvcnRlZC4KKyAqICAgICAgICAgICAgICBwcmVmaXhfbm9kZSAgLSBSb290IG9mIHN1YnRyZWUgdG8gYmUgc2VhcmNoZWQsIG9yIE5TX0FMTCBmb3IgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290IG9mIHRoZSBuYW1lIHNwYWNlLiBJZiBOYW1lIGlzIGZ1bGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgKGZpcnN0IHM4IGlzICdcJyksIHRoZSBwYXNzZWQgdmFsdWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIFNjb3BlIHdpbGwgbm90IGJlIGFjY2Vzc2VkLgorICogICAgICAgICAgICAgIGZsYWdzICAgICAgIC0gVXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIHBlcmZvcm0gdXBzZWFyY2ggb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdC4KKyAqICAgICAgICAgICAgICByZXR1cm5fbm9kZSAtIFdoZXJlIHRoZSBOb2RlIGlzIHJldHVybmVkCisgKgorICogREVTQ1JJUFRJT046IExvb2sgdXAgYSBuYW1lIHJlbGF0aXZlIHRvIGEgZ2l2ZW4gc2NvcGUgYW5kIHJldHVybiB0aGUKKyAqICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIE5vZGUuIE5PVEU6IFNjb3BlIGNhbiBiZSBudWxsLgorICoKKyAqIE1VVEVYOiAgICAgICBMb2NrcyBuYW1lc3BhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9uc19nZXRfbm9kZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcHJlZml4X25vZGUsCisJCSBjb25zdCBjaGFyICpwYXRobmFtZSwKKwkJIHUzMiBmbGFncywgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXR1cm5fbm9kZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihuc19nZXRfbm9kZSwgQUNQSV9DQVNUX1BUUihjaGFyLCBwYXRobmFtZSkpOworCisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGVfdW5sb2NrZWQocHJlZml4X25vZGUsIHBhdGhuYW1lLAorCQkJCQkgICBmbGFncywgcmV0dXJuX25vZGUpOworCisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3BzcGFyc2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNwYXJzZS5jCmluZGV4IDBhMjM4OTcuLjFjZTI2ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNwYXJzZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNwYXJzZS5jCkBAIC01MzcsOSArNTM3LDExIEBACiAKIAkJCS8qIEVpdGhlciB0aGUgbWV0aG9kIHBhcnNlIG9yIGFjdHVhbCBleGVjdXRpb24gZmFpbGVkICovCiAKKwkJCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwogCQkJQUNQSV9FUlJPUl9NRVRIT0QoIk1ldGhvZCBwYXJzZS9leGVjdXRpb24gZmFpbGVkIiwKIAkJCQkJICB3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSwgTlVMTCwKIAkJCQkJICBzdGF0dXMpOworCQkJYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOwogCiAJCQkvKiBDaGVjayBmb3IgcG9zc2libGUgbXVsdGktdGhyZWFkIHJlZW50cmFuY3kgcHJvYmxlbSAqLwogCkBAIC01NzEsNyArNTczLDkgQEAKIAkJICogY2xlYW51cCB0byBkbwogCQkgKi8KIAkJaWYgKCgod2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX01PREVfTUFTSykgPT0KLQkJICAgICBBQ1BJX1BBUlNFX0VYRUNVVEUpIHx8IChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkpIHsKKwkJICAgICBBQ1BJX1BBUlNFX0VYRUNVVEUgJiYKKwkJICAgICAhKHdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9NT0RVTEVfTEVWRUwpKSB8fAorCQkgICAgKEFDUElfRkFJTFVSRShzdGF0dXMpKSkgewogCQkJYWNwaV9kc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2Qod2Fsa19zdGF0ZS0+CiAJCQkJCQkJIG1ldGhvZF9kZXNjLAogCQkJCQkJCSB3YWxrX3N0YXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9wc3hmYWNlLmMKaW5kZXggY2YzMGNkODIuLmYzYzg3MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN4ZmFjZS5jCkBAIC0yNTIsNiArMjUyLDkwIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZXhlY3V0ZV90YWJsZQorICoKKyAqIFBBUkFNRVRFUlM6ICBpbmZvICAgICAgICAgICAgLSBNZXRob2QgaW5mbyBibG9jaywgY29udGFpbnM6CisgKiAgICAgICAgICAgICAgbm9kZSAgICAgICAgICAgIC0gTm9kZSB0byB3aGVyZSB0aGUgaXMgZW50ZXJlZCBpbnRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZQorICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAtIFBzZXVkbyBtZXRob2Qgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIEFNTAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgb2YgdGhlIGVudGlyZSB0YWJsZQorICogICAgICAgICAgICAgIHBhc3NfbnVtYmVyICAgICAtIFBhcnNlIG9yIGV4ZWN1dGUgcGFzcworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRXhlY3V0ZSBhIHRhYmxlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9wc19leGVjdXRlX3RhYmxlKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8pCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCA9IE5VTEw7CisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSA9IE5VTEw7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHBzX2V4ZWN1dGVfdGFibGUpOworCisJLyogQ3JlYXRlIGFuZCBpbml0IGEgUm9vdCBOb2RlICovCisKKwlvcCA9IGFjcGlfcHNfY3JlYXRlX3Njb3BlX29wKGluZm8tPm9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0KTsKKwlpZiAoIW9wKSB7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyB3YWxrIHN0YXRlICovCisKKwl3YWxrX3N0YXRlID0KKwkgICAgYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZShpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkLCBOVUxMLAorCQkJCSAgICAgIE5VTEwsIE5VTEwpOworCWlmICghd2Fsa19zdGF0ZSkgeworCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgb3AsIGluZm8tPm5vZGUsCisJCQkJICAgICAgIGluZm8tPm9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0LAorCQkJCSAgICAgICBpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgsIGluZm8sCisJCQkJICAgICAgIGluZm8tPnBhc3NfbnVtYmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWlmIChpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLmluZm9fZmxhZ3MgJiBBQ1BJX01FVEhPRF9NT0RVTEVfTEVWRUwpIHsKKwkJd2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgfD0gQUNQSV9QQVJTRV9NT0RVTEVfTEVWRUw7CisJfQorCisJLyogSW5mby0+Tm9kZSBpcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiB0byBsb2FkIHRoZSB0YWJsZSAgKi8KKworCWlmIChpbmZvLT5ub2RlICYmIGluZm8tPm5vZGUgIT0gYWNwaV9nYmxfcm9vdF9ub2RlKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2goaW5mby0+bm9kZSwgQUNQSV9UWVBFX01FVEhPRCwKKwkJCQkJICAgICB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwl9CisKKwkvKgorCSAqIFBhcnNlIHRoZSBBTUwsIHdhbGtfc3RhdGUgd2lsbCBiZSBkZWxldGVkIGJ5IHBhcnNlX2FtbAorCSAqLworCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKKwlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCh3YWxrX3N0YXRlKTsKKwlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKKwl3YWxrX3N0YXRlID0gTlVMTDsKKworY2xlYW51cDoKKwlpZiAod2Fsa19zdGF0ZSkgeworCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlKHdhbGtfc3RhdGUpOworCX0KKwlpZiAob3ApIHsKKwkJYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZShvcCk7CisJfQorCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX3VwZGF0ZV9wYXJhbWV0ZXJfbGlzdAogICoKICAqIFBBUkFNRVRFUlM6ICBpbmZvICAgICAgICAgICAgLSBTZWUgc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90YmRhdGEuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJkYXRhLmMKaW5kZXggMTM4OGExOS4uZDljYThjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS90YmRhdGEuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiZGF0YS5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSAiYWNjb21tb24uaCIKICNpbmNsdWRlICJhY25hbWVzcC5oIgogI2luY2x1ZGUgImFjdGFibGVzLmgiCisjaW5jbHVkZSAiYWNldmVudHMuaCIKIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVEFCTEVTCiBBQ1BJX01PRFVMRV9OQU1FKCJ0YmRhdGEiKQpAQCAtNjEzLDE3ICs2MTQsMTIgQEAKIAkgKiBsb2NrIG1heSBibG9jaywgYW5kIGFsc28gc2luY2UgdGhlIGV4ZWN1dGlvbiBvZiBhIG5hbWVzcGFjZSB3YWxrCiAJICogbXVzdCBiZSBhbGxvd2VkIHRvIHVzZSB0aGUgaW50ZXJwcmV0ZXIuCiAJICovCi0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0lOVEVSUFJFVEVSKTsKIAlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfd3JpdGVfbG9jaygmYWNwaV9nYmxfbmFtZXNwYWNlX3J3X2xvY2spOwotCi0JYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKG93bmVyX2lkKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQotCisJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKG93bmVyX2lkKTsKIAlhY3BpX3V0X3JlbGVhc2Vfd3JpdGVfbG9jaygmYWNwaV9nYmxfbmFtZXNwYWNlX3J3X2xvY2spOwotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0lOVEVSUFJFVEVSKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIApAQCAtNzcxLDMgKzc2NywxNDIgQEAKIAogCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2xvYWRfdGFibGUKKyAqCisgKiBQQVJBTUVURVJTOiAgdGFibGVfaW5kZXggICAgICAgICAgICAgLSBUYWJsZSBpbmRleAorICogICAgICAgICAgICAgIHBhcmVudF9ub2RlICAgICAgICAgICAgIC0gV2hlcmUgdGFibGUgaW5kZXggaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IExvYWQgYW4gQUNQSSB0YWJsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3RiX2xvYWRfdGFibGUodTMyIHRhYmxlX2luZGV4LCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGUpCit7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9vd25lcl9pZCBvd25lcl9pZDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfbG9hZF90YWJsZSk7CisKKwkvKgorCSAqIE5vdGU6IE5vdyB0YWJsZSBpcyAiSU5TVEFMTEVEIiwgaXQgbXVzdCBiZSB2YWxpZGF0ZWQgYmVmb3JlCisJICogdXNpbmcuCisJICovCisJc3RhdHVzID0gYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgodGFibGVfaW5kZXgsICZ0YWJsZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF90YWJsZSh0YWJsZV9pbmRleCwgcGFyZW50X25vZGUpOworCisJLyogRXhlY3V0ZSBhbnkgbW9kdWxlLWxldmVsIGNvZGUgdGhhdCB3YXMgZm91bmQgaW4gdGhlIHRhYmxlICovCisKKwlpZiAoIWFjcGlfZ2JsX3BhcnNlX3RhYmxlX2FzX3Rlcm1fbGlzdAorCSAgICAmJiBhY3BpX2dibF9ncm91cF9tb2R1bGVfbGV2ZWxfY29kZSkgeworCQlhY3BpX25zX2V4ZWNfbW9kdWxlX2NvZGVfbGlzdCgpOworCX0KKworCS8qCisJICogVXBkYXRlIEdQRXMgZm9yIGFueSBuZXcgX0x4eC9fRXh4IG1ldGhvZHMuIElnbm9yZSBlcnJvcnMuIFRoZSBob3N0IGlzCisJICogcmVzcG9uc2libGUgZm9yIGRpc2NvdmVyaW5nIGFueSBuZXcgd2FrZSBHUEVzIGJ5IHJ1bm5pbmcgX1BSVyBtZXRob2RzCisJICogdGhhdCBtYXkgaGF2ZSBiZWVuIGxvYWRlZCBieSB0aGlzIHRhYmxlLgorCSAqLworCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X293bmVyX2lkKHRhYmxlX2luZGV4LCAmb3duZXJfaWQpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlhY3BpX2V2X3VwZGF0ZV9ncGVzKG93bmVyX2lkKTsKKwl9CisKKwkvKiBJbnZva2UgdGFibGUgaGFuZGxlciBpZiBwcmVzZW50ICovCisKKwlpZiAoYWNwaV9nYmxfdGFibGVfaGFuZGxlcikgeworCQkodm9pZClhY3BpX2dibF90YWJsZV9oYW5kbGVyKEFDUElfVEFCTEVfRVZFTlRfTE9BRCwgdGFibGUsCisJCQkJCSAgICAgYWNwaV9nYmxfdGFibGVfaGFuZGxlcl9jb250ZXh0KTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9pbnN0YWxsX2FuZF9sb2FkX3RhYmxlCisgKgorICogUEFSQU1FVEVSUzogIHRhYmxlICAgICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgdGFibGUKKyAqICAgICAgICAgICAgICBhZGRyZXNzICAgICAgICAgICAgICAgICAtIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHRhYmxlCisgKiAgICAgICAgICAgICAgZmxhZ3MgICAgICAgICAgICAgICAgICAgLSBBbGxvY2F0aW9uIGZsYWdzIG9mIHRoZSB0YWJsZQorICogICAgICAgICAgICAgIHRhYmxlX2luZGV4ICAgICAgICAgICAgIC0gV2hlcmUgdGFibGUgaW5kZXggaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEluc3RhbGwgYW5kIGxvYWQgYW4gQUNQSSB0YWJsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3RiX2luc3RhbGxfYW5kX2xvYWRfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSwKKwkJCSAgICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCSAgICAgICB1OCBmbGFncywgdTggb3ZlcnJpZGUsIHUzMiAqdGFibGVfaW5kZXgpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiBpOworCWFjcGlfb3duZXJfaWQgb3duZXJfaWQ7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfbG9hZF90YWJsZSk7CisKKwkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKworCS8qIEluc3RhbGwgdGhlIHRhYmxlIGFuZCBsb2FkIGl0IGludG8gdGhlIG5hbWVzcGFjZSAqLworCisJc3RhdHVzID0gYWNwaV90Yl9pbnN0YWxsX3N0YW5kYXJkX3RhYmxlKGFkZHJlc3MsIGZsYWdzLCBUUlVFLAorCQkJCQkJb3ZlcnJpZGUsICZpKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJLyoKKwkgKiBOb3RlOiBOb3cgdGFibGUgaXMgIklOU1RBTExFRCIsIGl0IG11c3QgYmUgdmFsaWRhdGVkIGJlZm9yZQorCSAqIHVzaW5nLgorCSAqLworCXN0YXR1cyA9IGFjcGlfdGJfdmFsaWRhdGVfdGFibGUoJmFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwl9CisKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKwlzdGF0dXMgPSBhY3BpX25zX2xvYWRfdGFibGUoaSwgYWNwaV9nYmxfcm9vdF9ub2RlKTsKKworCS8qIEV4ZWN1dGUgYW55IG1vZHVsZS1sZXZlbCBjb2RlIHRoYXQgd2FzIGZvdW5kIGluIHRoZSB0YWJsZSAqLworCisJaWYgKCFhY3BpX2dibF9wYXJzZV90YWJsZV9hc190ZXJtX2xpc3QKKwkgICAgJiYgYWNwaV9nYmxfZ3JvdXBfbW9kdWxlX2xldmVsX2NvZGUpIHsKKwkJYWNwaV9uc19leGVjX21vZHVsZV9jb2RlX2xpc3QoKTsKKwl9CisKKwkvKgorCSAqIFVwZGF0ZSBHUEVzIGZvciBhbnkgbmV3IF9MeHgvX0V4eCBtZXRob2RzLiBJZ25vcmUgZXJyb3JzLiBUaGUgaG9zdCBpcworCSAqIHJlc3BvbnNpYmxlIGZvciBkaXNjb3ZlcmluZyBhbnkgbmV3IHdha2UgR1BFcyBieSBydW5uaW5nIF9QUlcgbWV0aG9kcworCSAqIHRoYXQgbWF5IGhhdmUgYmVlbiBsb2FkZWQgYnkgdGhpcyB0YWJsZS4KKwkgKi8KKwlzdGF0dXMgPSBhY3BpX3RiX2dldF9vd25lcl9pZChpLCAmb3duZXJfaWQpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlhY3BpX2V2X3VwZGF0ZV9ncGVzKG93bmVyX2lkKTsKKwl9CisKKwkvKiBJbnZva2UgdGFibGUgaGFuZGxlciBpZiBwcmVzZW50ICovCisKKwlpZiAoYWNwaV9nYmxfdGFibGVfaGFuZGxlcikgeworCQkodm9pZClhY3BpX2dibF90YWJsZV9oYW5kbGVyKEFDUElfVEFCTEVfRVZFTlRfTE9BRCwgdGFibGUsCisJCQkJCSAgICAgYWNwaV9nYmxfdGFibGVfaGFuZGxlcl9jb250ZXh0KTsKKwl9CisJKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisKK3VubG9ja19hbmRfZXhpdDoKKwkqdGFibGVfaW5kZXggPSBpOworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90YmZhZHQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJmYWR0LmMKaW5kZXggNjIwODA2OS4uMDQ2YzRkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS90YmZhZHQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiZmFkdC5jCkBAIC0zNDQsMjMgKzM0NCwyNyBAQAogCiAJLyogT2J0YWluIHRoZSBEU0RUIGFuZCBGQUNTIHRhYmxlcyB2aWEgdGhlaXIgYWRkcmVzc2VzIHdpdGhpbiB0aGUgRkFEVCAqLwogCi0JYWNwaV90Yl9pbnN0YWxsX2ZpeGVkX3RhYmxlKChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpYWNwaV9nYmxfRkFEVC5YZHNkdCwKLQkJCQkgICAgQUNQSV9TSUdfRFNEVCwgJmFjcGlfZ2JsX2RzZHRfaW5kZXgpOworCWFjcGlfdGJfaW5zdGFsbF9zdGFuZGFyZF90YWJsZSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKWFjcGlfZ2JsX0ZBRFQuCisJCQkJICAgICAgIFhkc2R0LAorCQkJCSAgICAgICBBQ1BJX1RBQkxFX09SSUdJTl9JTlRFUk5BTF9QSFlTSUNBTCwKKwkJCQkgICAgICAgRkFMU0UsIFRSVUUsICZhY3BpX2dibF9kc2R0X2luZGV4KTsKIAogCS8qIElmIEhhcmR3YXJlIFJlZHVjZWQgZmxhZyBpcyBzZXQsIHRoZXJlIGlzIG5vIEZBQ1MgKi8KIAogCWlmICghYWNwaV9nYmxfcmVkdWNlZF9oYXJkd2FyZSkgewogCQlpZiAoYWNwaV9nYmxfRkFEVC5mYWNzKSB7Ci0JCQlhY3BpX3RiX2luc3RhbGxfZml4ZWRfdGFibGUoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKLQkJCQkJCSAgICBhY3BpX2dibF9GQURULmZhY3MsCi0JCQkJCQkgICAgQUNQSV9TSUdfRkFDUywKLQkJCQkJCSAgICAmYWNwaV9nYmxfZmFjc19pbmRleCk7CisJCQlhY3BpX3RiX2luc3RhbGxfc3RhbmRhcmRfdGFibGUoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCQkJCSAgICAgICBhY3BpX2dibF9GQURULmZhY3MsCisJCQkJCQkgICAgICAgQUNQSV9UQUJMRV9PUklHSU5fSU5URVJOQUxfUEhZU0lDQUwsCisJCQkJCQkgICAgICAgRkFMU0UsIFRSVUUsCisJCQkJCQkgICAgICAgJmFjcGlfZ2JsX2ZhY3NfaW5kZXgpOwogCQl9CiAJCWlmIChhY3BpX2dibF9GQURULlhmYWNzKSB7Ci0JCQlhY3BpX3RiX2luc3RhbGxfZml4ZWRfdGFibGUoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKLQkJCQkJCSAgICBhY3BpX2dibF9GQURULlhmYWNzLAotCQkJCQkJICAgIEFDUElfU0lHX0ZBQ1MsCi0JCQkJCQkgICAgJmFjcGlfZ2JsX3hmYWNzX2luZGV4KTsKKwkJCWFjcGlfdGJfaW5zdGFsbF9zdGFuZGFyZF90YWJsZSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCQkJICAgICAgIGFjcGlfZ2JsX0ZBRFQuWGZhY3MsCisJCQkJCQkgICAgICAgQUNQSV9UQUJMRV9PUklHSU5fSU5URVJOQUxfUEhZU0lDQUwsCisJCQkJCQkgICAgICAgRkFMU0UsIFRSVUUsCisJCQkJCQkgICAgICAgJmFjcGlfZ2JsX3hmYWNzX2luZGV4KTsKIAkJfQogCX0KIH0KQEAgLTQ3NiwxNyArNDgwLDE5IEBACiAJdTMyIGk7CiAKIAkvKgotCSAqIEZvciBBQ1BJIDEuMCBGQURUcyAocmV2aXNpb24gMSBvciAyKSwgZW5zdXJlIHRoYXQgcmVzZXJ2ZWQgZmllbGRzIHdoaWNoCisJICogRm9yIEFDUEkgMS4wIEZBRFRzIChyZXZpc2lvbiAxKSwgZW5zdXJlIHRoYXQgcmVzZXJ2ZWQgZmllbGRzIHdoaWNoCiAJICogc2hvdWxkIGJlIHplcm8gYXJlIGluZGVlZCB6ZXJvLiBUaGlzIHdpbGwgd29ya2Fyb3VuZCBCSU9TcyB0aGF0CiAJICogaW5hZHZlcnRlbnRseSBwbGFjZSB2YWx1ZXMgaW4gdGhlc2UgZmllbGRzLgogCSAqCiAJICogVGhlIEFDUEkgMS4wIHJlc2VydmVkIGZpZWxkcyB0aGF0IHdpbGwgYmUgemVyb2VkIGFyZSB0aGUgYnl0ZXMgbG9jYXRlZAogCSAqIGF0IG9mZnNldCA0NSwgNTUsIDk1LCBhbmQgdGhlIHdvcmQgbG9jYXRlZCBhdCBvZmZzZXQgMTA5LCAxMTAuCiAJICoKLQkgKiBOb3RlOiBUaGUgRkFEVCByZXZpc2lvbiB2YWx1ZSBpcyB1bnJlbGlhYmxlLiBPbmx5IHRoZSBsZW5ndGggY2FuIGJlCi0JICogdHJ1c3RlZC4KKwkgKiBOb3RlOiBUaGUgRkFEVCByZXZpc2lvbiB2YWx1ZSBpcyB1bnJlbGlhYmxlIGJlY2F1c2Ugb2YgQklPUyBlcnJvcnMuCisJICogVGhlIHRhYmxlIGxlbmd0aCBpcyBpbnN0ZWFkIHVzZWQgYXMgdGhlIGZpbmFsIHdvcmQgb24gdGhlIHZlcnNpb24uCisJICoKKwkgKiBOb3RlOiBGQURUIHJldmlzaW9uIDMgaXMgdGhlIEFDUEkgMi4wIHZlcnNpb24gb2YgdGhlIEZBRFQuCiAJICovCi0JaWYgKGFjcGlfZ2JsX0ZBRFQuaGVhZGVyLmxlbmd0aCA8PSBBQ1BJX0ZBRFRfVjJfU0laRSkgeworCWlmIChhY3BpX2dibF9GQURULmhlYWRlci5sZW5ndGggPD0gQUNQSV9GQURUX1YzX1NJWkUpIHsKIAkJYWNwaV9nYmxfRkFEVC5wcmVmZXJyZWRfcHJvZmlsZSA9IDA7CiAJCWFjcGlfZ2JsX0ZBRFQucHN0YXRlX2NvbnRyb2wgPSAwOwogCQlhY3BpX2dibF9GQURULmNzdF9jb250cm9sID0gMDsKQEAgLTU1Miw3NiArNTU4LDcyIEBACiAJCSAqCiAJCSAqIEFkZHJlc3MzMiB6ZXJvLCBBZGRyZXNzNjQgW2Rvbid0IGNhcmVdICAgLSBVc2UgQWRkcmVzczY0CiAJCSAqCisJCSAqIE5vIG92ZXJyaWRlOiBpZiBhY3BpX2dibF91c2UzMl9iaXRfZmFkdF9hZGRyZXNzZXMgaXMgRkFMU0UsIGFuZDoKIAkJICogQWRkcmVzczMyIG5vbi16ZXJvLCBBZGRyZXNzNjQgemVybyAgICAgICAtIENvcHkvdXNlIEFkZHJlc3MzMgogCQkgKiBBZGRyZXNzMzIgbm9uLXplcm8gPT0gQWRkcmVzczY0IG5vbi16ZXJvIC0gVXNlIEFkZHJlc3M2NAogCQkgKiBBZGRyZXNzMzIgbm9uLXplcm8gIT0gQWRkcmVzczY0IG5vbi16ZXJvIC0gV2FybmluZywgdXNlIEFkZHJlc3M2NAogCQkgKgogCQkgKiBPdmVycmlkZTogaWYgYWNwaV9nYmxfdXNlMzJfYml0X2ZhZHRfYWRkcmVzc2VzIGlzIFRSVUUsIGFuZDoKKwkJICogQWRkcmVzczMyIG5vbi16ZXJvLCBBZGRyZXNzNjQgemVybyAgICAgICAtIENvcHkvdXNlIEFkZHJlc3MzMgorCQkgKiBBZGRyZXNzMzIgbm9uLXplcm8gPT0gQWRkcmVzczY0IG5vbi16ZXJvIC0gQ29weS91c2UgQWRkcmVzczMyCiAJCSAqIEFkZHJlc3MzMiBub24temVybyAhPSBBZGRyZXNzNjQgbm9uLXplcm8gLSBXYXJuaW5nLCBjb3B5L3VzZSBBZGRyZXNzMzIKIAkJICoKIAkJICogTm90ZTogc3BhY2VfaWQgaXMgYWx3YXlzIEkvTyBmb3IgMzItYml0IGxlZ2FjeSBhZGRyZXNzIGZpZWxkcwogCQkgKi8KIAkJaWYgKGFkZHJlc3MzMikgewotCQkJaWYgKCFhZGRyZXNzNjQtPmFkZHJlc3MpIHsKKwkJCWlmIChhZGRyZXNzNjQtPmFkZHJlc3MpIHsKKwkJCQlpZiAoYWRkcmVzczY0LT5hZGRyZXNzICE9ICh1NjQpYWRkcmVzczMyKSB7CiAKLQkJCQkvKiA2NC1iaXQgYWRkcmVzcyBpcyB6ZXJvLCB1c2UgMzItYml0IGFkZHJlc3MgKi8KKwkJCQkJLyogQWRkcmVzcyBtaXNtYXRjaCAqLwogCi0JCQkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyhhZGRyZXNzNjQsCi0JCQkJCQkJICAgICBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8sCi0JCQkJCQkJICAgICAqQUNQSV9BRERfUFRSKHU4LAotCQkJCQkJCQkJICAgJmFjcGlfZ2JsX0ZBRFQsCi0JCQkJCQkJCQkgICBmYWR0X2luZm9fdGFibGUKLQkJCQkJCQkJCSAgIFtpXS4KLQkJCQkJCQkJCSAgIGxlbmd0aCksCi0JCQkJCQkJICAgICAodTY0KWFkZHJlc3MzMiwKLQkJCQkJCQkgICAgIG5hbWUsIGZsYWdzKTsKLQkJCX0gZWxzZSBpZiAoYWRkcmVzczY0LT5hZGRyZXNzICE9ICh1NjQpYWRkcmVzczMyKSB7CisJCQkJCUFDUElfQklPU19XQVJOSU5HKChBRV9JTkZPLAorCQkJCQkJCSAgICIzMi82NFggYWRkcmVzcyBtaXNtYXRjaCBpbiBGQURULyVzOiAiCisJCQkJCQkJICAgIjB4JTguOFgvMHglOC44WCU4LjhYLCB1c2luZyAldS1iaXQgYWRkcmVzcyIsCisJCQkJCQkJICAgbmFtZSwgYWRkcmVzczMyLAorCQkJCQkJCSAgIEFDUElfRk9STUFUX1VJTlQ2NAorCQkJCQkJCSAgIChhZGRyZXNzNjQtPmFkZHJlc3MpLAorCQkJCQkJCSAgIGFjcGlfZ2JsX3VzZTMyX2JpdF9mYWR0X2FkZHJlc3NlcworCQkJCQkJCSAgID8gMzIgOiA2NCkpOworCQkJCX0KIAotCQkJCS8qIEFkZHJlc3MgbWlzbWF0Y2ggKi8KLQotCQkJCUFDUElfQklPU19XQVJOSU5HKChBRV9JTkZPLAotCQkJCQkJICAgIjMyLzY0WCBhZGRyZXNzIG1pc21hdGNoIGluIEZBRFQvJXM6ICIKLQkJCQkJCSAgICIweCU4LjhYLzB4JTguOFglOC44WCwgdXNpbmcgJXUtYml0IGFkZHJlc3MiLAotCQkJCQkJICAgbmFtZSwgYWRkcmVzczMyLAotCQkJCQkJICAgQUNQSV9GT1JNQVRfVUlOVDY0Ci0JCQkJCQkgICAoYWRkcmVzczY0LT5hZGRyZXNzKSwKLQkJCQkJCSAgIGFjcGlfZ2JsX3VzZTMyX2JpdF9mYWR0X2FkZHJlc3NlcwotCQkJCQkJICAgPyAzMiA6IDY0KSk7Ci0KLQkJCQlpZiAoYWNwaV9nYmxfdXNlMzJfYml0X2ZhZHRfYWRkcmVzc2VzKSB7Ci0KLQkJCQkJLyogMzItYml0IGFkZHJlc3Mgb3ZlcnJpZGUgKi8KLQotCQkJCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKGFkZHJlc3M2NCwKLQkJCQkJCQkJICAgICBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8sCi0JCQkJCQkJCSAgICAgKkFDUElfQUREX1BUUgotCQkJCQkJCQkgICAgICh1OCwKLQkJCQkJCQkJICAgICAgJmFjcGlfZ2JsX0ZBRFQsCi0JCQkJCQkJCSAgICAgIGZhZHRfaW5mb190YWJsZQotCQkJCQkJCQkgICAgICBbaV0uCi0JCQkJCQkJCSAgICAgIGxlbmd0aCksCi0JCQkJCQkJCSAgICAgKHU2NCkKLQkJCQkJCQkJICAgICBhZGRyZXNzMzIsCi0JCQkJCQkJCSAgICAgbmFtZSwKLQkJCQkJCQkJICAgICBmbGFncyk7CisJCQkJLyoKKwkJCQkgKiBGb3IgZWFjaCBleHRlbmRlZCBmaWVsZCwgY2hlY2sgZm9yIGxlbmd0aCBtaXNtYXRjaAorCQkJCSAqIGJldHdlZW4gdGhlIGxlZ2FjeSBsZW5ndGggZmllbGQgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisJCQkJICogNjQtYml0IFggbGVuZ3RoIGZpZWxkLgorCQkJCSAqIE5vdGU6IElmIHRoZSBsZWdhY3kgbGVuZ3RoIGZpZWxkIGlzID4gMHhGRiBiaXRzLCBpZ25vcmUKKwkJCQkgKiB0aGlzIGNoZWNrLiAoR1BFIHJlZ2lzdGVycyBjYW4gYmUgbGFyZ2VyIHRoYW4gdGhlCisJCQkJICogNjQtYml0IEdBUyBzdHJ1Y3R1cmUgY2FuIGFjY29tb2RhdGUsIDB4RkYgYml0cykuCisJCQkJICovCisJCQkJaWYgKChBQ1BJX01VTF84KGxlbmd0aCkgPD0gQUNQSV9VSU5UOF9NQVgpICYmCisJCQkJICAgIChhZGRyZXNzNjQtPmJpdF93aWR0aCAhPQorCQkJCSAgICAgQUNQSV9NVUxfOChsZW5ndGgpKSkgeworCQkJCQlBQ1BJX0JJT1NfV0FSTklORygoQUVfSU5GTywKKwkJCQkJCQkgICAiMzIvNjRYIGxlbmd0aCBtaXNtYXRjaCBpbiBGQURULyVzOiAldS8ldSIsCisJCQkJCQkJICAgbmFtZSwKKwkJCQkJCQkgICBBQ1BJX01VTF84KGxlbmd0aCksCisJCQkJCQkJICAgYWRkcmVzczY0LT4KKwkJCQkJCQkgICBiaXRfd2lkdGgpKTsKIAkJCQl9CiAJCQl9Ci0JCX0KIAotCQkvKgotCQkgKiBGb3IgZWFjaCBleHRlbmRlZCBmaWVsZCwgY2hlY2sgZm9yIGxlbmd0aCBtaXNtYXRjaCBiZXR3ZWVuIHRoZQotCQkgKiBsZWdhY3kgbGVuZ3RoIGZpZWxkIGFuZCB0aGUgY29ycmVzcG9uZGluZyA2NC1iaXQgWCBsZW5ndGggZmllbGQuCi0JCSAqIE5vdGU6IElmIHRoZSBsZWdhY3kgbGVuZ3RoIGZpZWxkIGlzID4gMHhGRiBiaXRzLCBpZ25vcmUgdGhpcwotCQkgKiBjaGVjay4gKEdQRSByZWdpc3RlcnMgY2FuIGJlIGxhcmdlciB0aGFuIHRoZSA2NC1iaXQgR0FTIHN0cnVjdHVyZQotCQkgKiBjYW4gYWNjb21vZGF0ZSwgMHhGRiBiaXRzKS4KLQkJICovCi0JCWlmIChhZGRyZXNzNjQtPmFkZHJlc3MgJiYKLQkJICAgIChBQ1BJX01VTF84KGxlbmd0aCkgPD0gQUNQSV9VSU5UOF9NQVgpICYmCi0JCSAgICAoYWRkcmVzczY0LT5iaXRfd2lkdGggIT0gQUNQSV9NVUxfOChsZW5ndGgpKSkgewotCQkJQUNQSV9CSU9TX1dBUk5JTkcoKEFFX0lORk8sCi0JCQkJCSAgICIzMi82NFggbGVuZ3RoIG1pc21hdGNoIGluIEZBRFQvJXM6ICV1LyV1IiwKLQkJCQkJICAgbmFtZSwgQUNQSV9NVUxfOChsZW5ndGgpLAotCQkJCQkgICBhZGRyZXNzNjQtPmJpdF93aWR0aCkpOworCQkJLyoKKwkJCSAqIEhhcmR3YXJlIHJlZ2lzdGVyIGFjY2VzcyBjb2RlIGFsd2F5cyB1c2VzIHRoZSA2NC1iaXQgZmllbGRzLgorCQkJICogU28gaWYgdGhlIDY0LWJpdCBmaWVsZCBpcyB6ZXJvIG9yIGlzIHRvIGJlIG92ZXJyaWRkZW4sCisJCQkgKiBpbml0aWFsaXplIGl0IHdpdGggdGhlIDMyLWJpdCBmaWVsZHMuCisJCQkgKiBOb3RlIHRoYXQgd2hlbiB0aGUgMzItYml0IGFkZHJlc3MgZmF2b3IgaXMgc3BlY2lmaWVkLCB0aGUKKwkJCSAqIDY0LWJpdCBmaWVsZHMgYXJlIGFsd2F5cyByZS1pbml0aWFsaXplZCBzbyB0aGF0CisJCQkgKiBhY2Nlc3Nfc2l6ZS9iaXRfd2lkdGgvYml0X29mZnNldCBmaWVsZHMgY2FuIGJlIGNvcnJlY3RseQorCQkJICogY29uZmlndXJlZCB0byB0aGUgdmFsdWVzIHRvIHRyaWdnZXIgYSAzMi1iaXQgY29tcGF0aWJsZQorCQkJICogYWNjZXNzIG1vZGUgaW4gdGhlIGhhcmR3YXJlIHJlZ2lzdGVyIGFjY2VzcyBjb2RlLgorCQkJICovCisJCQlpZiAoIWFkZHJlc3M2NC0+YWRkcmVzcworCQkJICAgIHx8IGFjcGlfZ2JsX3VzZTMyX2JpdF9mYWR0X2FkZHJlc3NlcykgeworCQkJCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MoYWRkcmVzczY0LAorCQkJCQkJCSAgICAgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPLAorCQkJCQkJCSAgICAgbGVuZ3RoLAorCQkJCQkJCSAgICAgKHU2NClhZGRyZXNzMzIsCisJCQkJCQkJICAgICBuYW1lLCBmbGFncyk7CisJCQl9CiAJCX0KIAogCQlpZiAoZmFkdF9pbmZvX3RhYmxlW2ldLmZsYWdzICYgQUNQSV9GQURUX1JFUVVJUkVEKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiZmluZC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS90YmZpbmQuYwppbmRleCBlMzQ4ZDYxLi5mNmI5YjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiZmluZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJmaW5kLmMKQEAgLTY4LDcgKzY4LDcgQEAKIGFjcGlfdGJfZmluZF90YWJsZShjaGFyICpzaWduYXR1cmUsCiAJCSAgIGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkLCB1MzIgKnRhYmxlX2luZGV4KQogewotCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwogCXUzMiBpOwogCkBAIC05Niw2ICs5Niw3IEBACiAKIAkvKiBTZWFyY2ggZm9yIHRoZSB0YWJsZSAqLwogCisJKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CiAJZm9yIChpID0gMDsgaSA8IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jdXJyZW50X3RhYmxlX2NvdW50OyArK2kpIHsKIAkJaWYgKG1lbWNtcCgmKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0uc2lnbmF0dXJlKSwKIAkJCSAgIGhlYWRlci5zaWduYXR1cmUsIEFDUElfTkFNRV9TSVpFKSkgewpAQCAtMTE1LDcgKzExNiw3IEBACiAJCQkgICAgYWNwaV90Yl92YWxpZGF0ZV90YWJsZSgmYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgogCQkJCQkJICAgdGFibGVzW2ldKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQkJfQogCiAJCQlpZiAoIWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0ucG9pbnRlcikgewpAQCAtMTQ0LDkgKzE0NSwxMiBAQAogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9UQUJMRVMsCiAJCQkJCSAgIkZvdW5kIHRhYmxlIFslNC40c11cbiIsCiAJCQkJCSAgaGVhZGVyLnNpZ25hdHVyZSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQl9CiAJfQorCXN0YXR1cyA9IEFFX05PVF9GT1VORDsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRk9VTkQpOwordW5sb2NrX2FuZF9leGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90Ymluc3RhbC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS90Ymluc3RhbC5jCmluZGV4IDhiMTMwNTIuLjVmZGYyNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJpbnN0YWwuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiaW5zdGFsLmMKQEAgLTE1Nyw2OCArMTU3LDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9pbnN0YWxsX2ZpeGVkX3RhYmxlCi0gKgotICogUEFSQU1FVEVSUzogIGFkZHJlc3MgICAgICAgICAgICAgICAgIC0gUGh5c2ljYWwgYWRkcmVzcyBvZiBEU0RUIG9yIEZBQ1MKLSAqICAgICAgICAgICAgICBzaWduYXR1cmUgICAgICAgICAgICAgICAtIFRhYmxlIHNpZ25hdHVyZSwgTlVMTCBpZiBubyBuZWVkIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaAotICogICAgICAgICAgICAgIHRhYmxlX2luZGV4ICAgICAgICAgICAgIC0gV2hlcmUgdGhlIHRhYmxlIGluZGV4IGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBJbnN0YWxsIGEgZml4ZWQgQUNQSSB0YWJsZSAoRFNEVC9GQUNTKSBpbnRvIHRoZSBnbG9iYWwgZGF0YQotICogICAgICAgICAgICAgIHN0cnVjdHVyZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9pbnN0YWxsX2ZpeGVkX3RhYmxlKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAotCQkJICAgIGNoYXIgKnNpZ25hdHVyZSwgdTMyICp0YWJsZV9pbmRleCkKLXsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIG5ld190YWJsZV9kZXNjOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfaW5zdGFsbF9maXhlZF90YWJsZSk7Ci0KLQlpZiAoIWFkZHJlc3MpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiTnVsbCBwaHlzaWNhbCBhZGRyZXNzIGZvciBBQ1BJIHRhYmxlIFslc10iLAotCQkJICAgIHNpZ25hdHVyZSkpOwotCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JLyogRmlsbCBhIHRhYmxlIGRlc2NyaXB0b3IgZm9yIHZhbGlkYXRpb24gKi8KLQotCXN0YXR1cyA9IGFjcGlfdGJfYWNxdWlyZV90ZW1wX3RhYmxlKCZuZXdfdGFibGVfZGVzYywgYWRkcmVzcywKLQkJCQkJICAgIEFDUElfVEFCTEVfT1JJR0lOX0lOVEVSTkFMX1BIWVNJQ0FMKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiQ291bGQgbm90IGFjcXVpcmUgdGFibGUgbGVuZ3RoIGF0ICU4LjhYJTguOFgiLAotCQkJICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBWYWxpZGF0ZSBhbmQgdmVyaWZ5IGEgdGFibGUgYmVmb3JlIGluc3RhbGxhdGlvbiAqLwotCi0Jc3RhdHVzID0gYWNwaV90Yl92ZXJpZnlfdGVtcF90YWJsZSgmbmV3X3RhYmxlX2Rlc2MsIHNpZ25hdHVyZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gcmVsZWFzZV9hbmRfZXhpdDsKLQl9Ci0KLQkvKiBBZGQgdGhlIHRhYmxlIHRvIHRoZSBnbG9iYWwgcm9vdCB0YWJsZSBsaXN0ICovCi0KLQlhY3BpX3RiX2luc3RhbGxfdGFibGVfd2l0aF9vdmVycmlkZSgmbmV3X3RhYmxlX2Rlc2MsIFRSVUUsIHRhYmxlX2luZGV4KTsKLQotcmVsZWFzZV9hbmRfZXhpdDoKLQotCS8qIFJlbGVhc2UgdGhlIHRlbXBvcmFyeSB0YWJsZSBkZXNjcmlwdG9yICovCi0KLQlhY3BpX3RiX3JlbGVhc2VfdGVtcF90YWJsZSgmbmV3X3RhYmxlX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2luc3RhbGxfc3RhbmRhcmRfdGFibGUKICAqCiAgKiBQQVJBTUVURVJTOiAgYWRkcmVzcyAgICAgICAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIHRhYmxlIChtaWdodCBiZSBhIHZpcnR1YWwKQEAgLTIzMCw4ICsxNjgsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaW5zdGFsbCBhbiBBQ1BJIHRhYmxlIHRoYXQgaXMKLSAqICAgICAgICAgICAgICBuZWl0aGVyIERTRFQgbm9yIEZBQ1MgKGEgInN0YW5kYXJkIiB0YWJsZS4pCisgKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdmVyaWZ5IGFuZCBpbnN0YWxsIGFuIEFDUEkgdGFibGUuCiAgKiAgICAgICAgICAgICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSAiTG9hZCIgb3IgIkxvYWRUYWJsZSIgb3Bjb2RlcywKICAqICAgICAgICAgICAgICBvciBieSBhY3BpX2xvYWRfdGFibGUoKSBBUEksIHRoZSAiUmVsb2FkIiBwYXJhbWV0ZXIgaXMgc2V0LgogICogICAgICAgICAgICAgIEFmdGVyIHN1Y2Vzc2Z1bGx5IHJldHVybmluZyBmcm9tIHRoaXMgZnVuY3Rpb24sIHRhYmxlIGlzCkBAIC0zNjQsNiArMzAxLDE0IEBACiAJYWNwaV90Yl9pbnN0YWxsX3RhYmxlX3dpdGhfb3ZlcnJpZGUoJm5ld190YWJsZV9kZXNjLCBvdmVycmlkZSwKIAkJCQkJICAgIHRhYmxlX2luZGV4KTsKIAorCS8qIEludm9rZSB0YWJsZSBoYW5kbGVyIGlmIHByZXNlbnQgKi8KKworCWlmIChhY3BpX2dibF90YWJsZV9oYW5kbGVyKSB7CisJCSh2b2lkKWFjcGlfZ2JsX3RhYmxlX2hhbmRsZXIoQUNQSV9UQUJMRV9FVkVOVF9JTlNUQUxMLAorCQkJCQkgICAgIG5ld190YWJsZV9kZXNjLnBvaW50ZXIsCisJCQkJCSAgICAgYWNwaV9nYmxfdGFibGVfaGFuZGxlcl9jb250ZXh0KTsKKwl9CisKIHJlbGVhc2VfYW5kX2V4aXQ6CiAKIAkvKiBSZWxlYXNlIHRoZSB0ZW1wb3JhcnkgdGFibGUgZGVzY3JpcHRvciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90YnV0aWxzLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RidXRpbHMuYwppbmRleCBlMjg1NTM5Li41MWViMDdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RidXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RidXRpbHMuYwpAQCAtMjUyLDcgKzI1Miw4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfdGJfcGFyc2Vfcm9vdF90YWJsZShhY3BpX3BoeXNpY2FsX2FkZHJlc3MgcnNkcF9hZGRyZXNzKQorYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OCithY3BpX3RiX3BhcnNlX3Jvb3RfdGFibGUoYWNwaV9waHlzaWNhbF9hZGRyZXNzIHJzZHBfYWRkcmVzcykKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwICpyc2RwOwogCXUzMiB0YWJsZV9lbnRyeV9zaXplOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90YnhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZhY2UuYwppbmRleCAzZWNlYzkzLi40YWI2YjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZhY2UuYwpAQCAtOTgsNyArOTgsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzIF9faW5pdAorYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OCiBhY3BpX2luaXRpYWxpemVfdGFibGVzKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKmluaXRpYWxfdGFibGVfYXJyYXksCiAJCSAgICAgICB1MzIgaW5pdGlhbF90YWJsZV9jb3VudCwgdTggYWxsb3dfcmVzaXplKQogewpAQCAtMTY0LDcgKzE2NCw3IEBACiAgKiAgICAgICAgICAgICAga2VybmVsLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBfX2luaXQgYWNwaV9yZWFsbG9jYXRlX3Jvb3RfdGFibGUodm9pZCkKK2FjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTiBhY3BpX3JlYWxsb2NhdGVfcm9vdF90YWJsZSh2b2lkKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90YnhmbG9hZC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS90YnhmbG9hZC5jCmluZGV4IGFjNzFhYmMuLjU1NjlmNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJ4ZmxvYWQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZsb2FkLmMKQEAgLTYzLDcgKzYzLDcgQEAKICAqIERFU0NSSVBUSU9OOiBMb2FkIHRoZSBBQ1BJIHRhYmxlcyBmcm9tIHRoZSBSU0RUL1hTRFQKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfbG9hZF90YWJsZXModm9pZCkKK2FjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTiBhY3BpX2xvYWRfdGFibGVzKHZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCkBAIC0xMDMsNyArMTAzLDggQEAKIAkJCQkiV2hpbGUgbG9hZGluZyBuYW1lc3BhY2UgZnJvbSBBQ1BJIHRhYmxlcyIpKTsKIAl9CiAKLQlpZiAoIWFjcGlfZ2JsX2dyb3VwX21vZHVsZV9sZXZlbF9jb2RlKSB7CisJaWYgKGFjcGlfZ2JsX3BhcnNlX3RhYmxlX2FzX3Rlcm1fbGlzdAorCSAgICB8fCAhYWNwaV9nYmxfZ3JvdXBfbW9kdWxlX2xldmVsX2NvZGUpIHsKIAkJLyoKIAkJICogSW5pdGlhbGl6ZSB0aGUgb2JqZWN0cyB0aGF0IHJlbWFpbiB1bmluaXRpYWxpemVkLiBUaGlzCiAJCSAqIHJ1bnMgdGhlIGV4ZWN1dGFibGUgQU1MIHRoYXQgbWF5IGJlIHBhcnQgb2YgdGhlCkBAIC0xODgsMTEgKzE4OSwxMSBAQAogCW1lbWNweSgmYWNwaV9nYmxfb3JpZ2luYWxfZHNkdF9oZWFkZXIsIGFjcGlfZ2JsX0RTRFQsCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCiAJLyogTG9hZCBhbmQgcGFyc2UgdGFibGVzICovCiAKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKIAlzdGF0dXMgPSBhY3BpX25zX2xvYWRfdGFibGUoYWNwaV9nYmxfZHNkdF9pbmRleCwgYWNwaV9nYmxfcm9vdF9ub2RlKTsKKwkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIltEU0RUXSB0YWJsZSBsb2FkIGZhaWxlZCIpKTsKIAkJdGFibGVzX2ZhaWxlZCsrOwpAQCAtMjAyLDcgKzIwMyw2IEBACiAKIAkvKiBMb2FkIGFueSBTU0RUIG9yIFBTRFQgdGFibGVzLiBOb3RlOiBMb29wIGxlYXZlcyB0YWJsZXMgbG9ja2VkICovCiAKLQkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKIAlmb3IgKGkgPSAwOyBpIDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmN1cnJlbnRfdGFibGVfY291bnQ7ICsraSkgewogCQl0YWJsZSA9ICZhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldOwogCkBAIC0yMjAsNiArMjIwLDcgQEAKIAogCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKIAkJc3RhdHVzID0gYWNwaV9uc19sb2FkX3RhYmxlKGksIGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CisJCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCiAJCQkJCSIoJTQuNHM6JTguOHMpIHdoaWxlIGxvYWRpbmcgdGFibGUiLApAQCAtMjM1LDggKzIzNiw2IEBACiAJCX0gZWxzZSB7CiAJCQl0YWJsZXNfbG9hZGVkKys7CiAJCX0KLQotCQkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKIAl9CiAKIAlpZiAoIXRhYmxlc19mYWlsZWQpIHsKQEAgLTI3Miw3ICsyNzEsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzIF9faW5pdAorYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OCiBhY3BpX2luc3RhbGxfdGFibGUoYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsIHU4IHBoeXNpY2FsKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTMyNCw0OSArMzIzLDEzIEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQkvKiBNdXN0IGFjcXVpcmUgdGhlIGludGVycHJldGVyIGxvY2sgZHVyaW5nIHRoaXMgb3BlcmF0aW9uICovCi0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfSU5URVJQUkVURVIpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KIAkvKiBJbnN0YWxsIHRoZSB0YWJsZSBhbmQgbG9hZCBpdCBpbnRvIHRoZSBuYW1lc3BhY2UgKi8KIAogCUFDUElfSU5GTygoIkhvc3QtZGlyZWN0ZWQgRHluYW1pYyBBQ1BJIFRhYmxlIExvYWQ6IikpOwotCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCi0Jc3RhdHVzID0gYWNwaV90Yl9pbnN0YWxsX3N0YW5kYXJkX3RhYmxlKEFDUElfUFRSX1RPX1BIWVNBRERSKHRhYmxlKSwKLQkJCQkJCUFDUElfVEFCTEVfT1JJR0lOX0VYVEVSTkFMX1ZJUlRVQUwsCi0JCQkJCQlUUlVFLCBGQUxTRSwgJnRhYmxlX2luZGV4KTsKLQotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQl9Ci0KLQkvKgotCSAqIE5vdGU6IE5vdyB0YWJsZSBpcyAiSU5TVEFMTEVEIiwgaXQgbXVzdCBiZSB2YWxpZGF0ZWQgYmVmb3JlCi0JICogdXNpbmcuCi0JICovCiAJc3RhdHVzID0KLQkgICAgYWNwaV90Yl92YWxpZGF0ZV90YWJsZSgmYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgotCQkJCSAgIHRhYmxlc1t0YWJsZV9pbmRleF0pOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX25zX2xvYWRfdGFibGUodGFibGVfaW5kZXgsIGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7Ci0KLQkvKiBJbnZva2UgdGFibGUgaGFuZGxlciBpZiBwcmVzZW50ICovCi0KLQlpZiAoYWNwaV9nYmxfdGFibGVfaGFuZGxlcikgewotCQkodm9pZClhY3BpX2dibF90YWJsZV9oYW5kbGVyKEFDUElfVEFCTEVfRVZFTlRfTE9BRCwgdGFibGUsCi0JCQkJCSAgICAgYWNwaV9nYmxfdGFibGVfaGFuZGxlcl9jb250ZXh0KTsKLQl9Ci0KLXVubG9ja19hbmRfZXhpdDoKLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfSU5URVJQUkVURVIpOworCSAgICBhY3BpX3RiX2luc3RhbGxfYW5kX2xvYWRfdGFibGUodGFibGUsIEFDUElfUFRSX1RPX1BIWVNBRERSKHRhYmxlKSwKKwkJCQkJICAgQUNQSV9UQUJMRV9PUklHSU5fRVhURVJOQUxfVklSVFVBTCwKKwkJCQkJICAgRkFMU0UsICZ0YWJsZV9pbmRleCk7CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKQEAgLTQxNSw5ICszNzgsOSBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CiAJfQogCi0JLyogTXVzdCBhY3F1aXJlIHRoZSBpbnRlcnByZXRlciBsb2NrIGR1cmluZyB0aGlzIG9wZXJhdGlvbiAqLworCS8qIE11c3QgYWNxdWlyZSB0aGUgdGFibGUgbG9jayBkdXJpbmcgdGhpcyBvcGVyYXRpb24gKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9JTlRFUlBSRVRFUik7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KQEAgLTQ0NCw4ICs0MDcsMTAgQEAKIAogCQkvKiBFbnN1cmUgdGhlIHRhYmxlIGlzIGFjdHVhbGx5IGxvYWRlZCAqLwogCisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwogCQlpZiAoIWFjcGlfdGJfaXNfdGFibGVfbG9hZGVkKGkpKSB7CiAJCQlzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CisJCQkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTQ3MSwxMCArNDM2LDExIEBACiAKIAkJc3RhdHVzID0gYWNwaV90Yl9yZWxlYXNlX293bmVyX2lkKGkpOwogCQlhY3BpX3RiX3NldF90YWJsZV9sb2FkZWRfZmxhZyhpLCBGQUxTRSk7CisJCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwogCQlicmVhazsKIAl9CiAKLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfSU5URVJQUkVURVIpOworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZyb290LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZyb290LmMKaW5kZXggYWRiNmNmYy4uMGFkYjFjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS90Ynhmcm9vdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJ4ZnJvb3QuYwpAQCAtMTQyLDcgKzE0Miw4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfZmluZF9yb290X3BvaW50ZXIoYWNwaV9waHlzaWNhbF9hZGRyZXNzICp0YWJsZV9hZGRyZXNzKQorYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OCithY3BpX2ZpbmRfcm9vdF9wb2ludGVyKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyAqdGFibGVfYWRkcmVzcykKIHsKIAl1OCAqdGFibGVfcHRyOwogCXU4ICptZW1fcm92ZXI7CkBAIC0yNDQsNiArMjQ1LDggQEAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKIH0KIAorQUNQSV9FWFBPUlRfU1lNQk9MX0lOSVQoYWNwaV9maW5kX3Jvb3RfcG9pbnRlcikKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGFkZHJlc3MuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRhZGRyZXNzLmMKaW5kZXggYzk4NmVjNi4uNDMzZDgyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGFkZHJlc3MuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0YWRkcmVzcy5jCkBAIC03Nyw3ICs3Nyw2IEBACiAJCQkgIHUzMiBsZW5ndGgsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpyZWdpb25fbm9kZSkKIHsKIAlzdHJ1Y3QgYWNwaV9hZGRyZXNzX3JhbmdlICpyYW5nZV9pbmZvOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfYWRkX2FkZHJlc3NfcmFuZ2UpOwogCkBAIC05NywxMiArOTYsNiBAQAogCXJhbmdlX2luZm8tPmVuZF9hZGRyZXNzID0gKGFkZHJlc3MgKyBsZW5ndGggLSAxKTsKIAlyYW5nZV9pbmZvLT5yZWdpb25fbm9kZSA9IHJlZ2lvbl9ub2RlOwogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRlJFRShyYW5nZV9pbmZvKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCiAJcmFuZ2VfaW5mby0+bmV4dCA9IGFjcGlfZ2JsX2FkZHJlc3NfcmFuZ2VfbGlzdFtzcGFjZV9pZF07CiAJYWNwaV9nYmxfYWRkcmVzc19yYW5nZV9saXN0W3NwYWNlX2lkXSA9IHJhbmdlX2luZm87CiAKQEAgLTExMiw3ICsxMDUsNiBAQAogCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcyksCiAJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChyYW5nZV9pbmZvLT5lbmRfYWRkcmVzcykpKTsKIAotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRidWZmZXIuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRidWZmZXIuYwppbmRleCBiZDMxZmFmLi5mZjI5ODEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0YnVmZmVyLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGJ1ZmZlci5jCkBAIC0yMzksOCArMjM5LDcgQEAKIAl1OCBidWZfY2hhcjsKIAogCWlmICghYnVmZmVyKSB7Ci0JCWFjcGlfdXRfZmlsZV9wcmludGYoZmlsZSwKLQkJCQkgICAgIk51bGwgQnVmZmVyIFBvaW50ZXIgaW4gRHVtcEJ1ZmZlciFcbiIpOworCQlmcHJpbnRmKGZpbGUsICJOdWxsIEJ1ZmZlciBQb2ludGVyIGluIER1bXBCdWZmZXIhXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjU0LDcgKzI1Myw3IEBACiAKIAkJLyogUHJpbnQgY3VycmVudCBvZmZzZXQgKi8KIAotCQlhY3BpX3V0X2ZpbGVfcHJpbnRmKGZpbGUsICIlNi40WDogIiwgKGJhc2Vfb2Zmc2V0ICsgaSkpOworCQlmcHJpbnRmKGZpbGUsICIlNi40WDogIiwgKGJhc2Vfb2Zmc2V0ICsgaSkpOwogCiAJCS8qIFByaW50IDE2IGhleCBjaGFycyAqLwogCkBAIC0yNjMsOCArMjYyLDcgQEAKIAogCQkJCS8qIER1bXAgZmlsbCBzcGFjZXMgKi8KIAotCQkJCWFjcGlfdXRfZmlsZV9wcmludGYoZmlsZSwgIiUqcyIsCi0JCQkJCQkgICAgKChkaXNwbGF5ICogMikgKyAxKSwgIiAiKTsKKwkJCQlmcHJpbnRmKGZpbGUsICIlKnMiLCAoKGRpc3BsYXkgKiAyKSArIDEpLCAiICIpOwogCQkJCWogKz0gZGlzcGxheTsKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTI3MywzNCArMjcxLDM0IEBACiAJCQljYXNlIERCX0JZVEVfRElTUExBWToKIAkJCWRlZmF1bHQ6CS8qIERlZmF1bHQgaXMgQllURSBkaXNwbGF5ICovCiAKLQkJCQlhY3BpX3V0X2ZpbGVfcHJpbnRmKGZpbGUsICIlMDJYICIsCi0JCQkJCQkgICAgYnVmZmVyWyhhY3BpX3NpemUpaSArIGpdKTsKKwkJCQlmcHJpbnRmKGZpbGUsICIlMDJYICIsCisJCQkJCWJ1ZmZlclsoYWNwaV9zaXplKWkgKyBqXSk7CiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgREJfV09SRF9ESVNQTEFZOgogCiAJCQkJQUNQSV9NT1ZFXzE2X1RPXzMyKCZ0ZW1wMzIsCiAJCQkJCQkgICAmYnVmZmVyWyhhY3BpX3NpemUpaSArIGpdKTsKLQkJCQlhY3BpX3V0X2ZpbGVfcHJpbnRmKGZpbGUsICIlMDRYICIsIHRlbXAzMik7CisJCQkJZnByaW50ZihmaWxlLCAiJTA0WCAiLCB0ZW1wMzIpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIERCX0RXT1JEX0RJU1BMQVk6CiAKIAkJCQlBQ1BJX01PVkVfMzJfVE9fMzIoJnRlbXAzMiwKIAkJCQkJCSAgICZidWZmZXJbKGFjcGlfc2l6ZSlpICsgal0pOwotCQkJCWFjcGlfdXRfZmlsZV9wcmludGYoZmlsZSwgIiUwOFggIiwgdGVtcDMyKTsKKwkJCQlmcHJpbnRmKGZpbGUsICIlMDhYICIsIHRlbXAzMik7CiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgREJfUVdPUkRfRElTUExBWToKIAogCQkJCUFDUElfTU9WRV8zMl9UT18zMigmdGVtcDMyLAogCQkJCQkJICAgJmJ1ZmZlclsoYWNwaV9zaXplKWkgKyBqXSk7Ci0JCQkJYWNwaV91dF9maWxlX3ByaW50ZihmaWxlLCAiJTA4WCIsIHRlbXAzMik7CisJCQkJZnByaW50ZihmaWxlLCAiJTA4WCIsIHRlbXAzMik7CiAKIAkJCQlBQ1BJX01PVkVfMzJfVE9fMzIoJnRlbXAzMiwKIAkJCQkJCSAgICZidWZmZXJbKGFjcGlfc2l6ZSlpICsgaiArCiAJCQkJCQkJICAgNF0pOwotCQkJCWFjcGlfdXRfZmlsZV9wcmludGYoZmlsZSwgIiUwOFggIiwgdGVtcDMyKTsKKwkJCQlmcHJpbnRmKGZpbGUsICIlMDhYICIsIHRlbXAzMik7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTMxMSwyNCArMzA5LDI0IEBACiAJCSAqIFByaW50IHRoZSBBU0NJSSBlcXVpdmFsZW50IGNoYXJhY3RlcnMgYnV0IHdhdGNoIG91dCBmb3IgdGhlIGJhZAogCQkgKiB1bnByaW50YWJsZSBvbmVzIChwcmludGFibGUgY2hhcnMgYXJlIDB4MjAgdGhyb3VnaCAweDdFKQogCQkgKi8KLQkJYWNwaV91dF9maWxlX3ByaW50ZihmaWxlLCAiICIpOworCQlmcHJpbnRmKGZpbGUsICIgIik7CiAJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CiAJCQlpZiAoaSArIGogPj0gY291bnQpIHsKLQkJCQlhY3BpX3V0X2ZpbGVfcHJpbnRmKGZpbGUsICJcbiIpOworCQkJCWZwcmludGYoZmlsZSwgIlxuIik7CiAJCQkJcmV0dXJuOwogCQkJfQogCiAJCQlidWZfY2hhciA9IGJ1ZmZlclsoYWNwaV9zaXplKWkgKyBqXTsKIAkJCWlmIChpc3ByaW50KGJ1Zl9jaGFyKSkgewotCQkJCWFjcGlfdXRfZmlsZV9wcmludGYoZmlsZSwgIiVjIiwgYnVmX2NoYXIpOworCQkJCWZwcmludGYoZmlsZSwgIiVjIiwgYnVmX2NoYXIpOwogCQkJfSBlbHNlIHsKLQkJCQlhY3BpX3V0X2ZpbGVfcHJpbnRmKGZpbGUsICIuIik7CisJCQkJZnByaW50ZihmaWxlLCAiLiIpOwogCQkJfQogCQl9CiAKIAkJLyogRG9uZSB3aXRoIHRoYXQgbGluZS4gKi8KIAotCQlhY3BpX3V0X2ZpbGVfcHJpbnRmKGZpbGUsICJcbiIpOworCQlmcHJpbnRmKGZpbGUsICJcbiIpOwogCQlpICs9IDE2OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGRlYnVnLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVidWcuYwppbmRleCA1NzQ0MjIyLi4wNDRkZjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVidWcuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVidWcuYwpAQCAtNTYyLDYgKzU2Miw0MyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3N0cl9leGl0CisgKgorICogUEFSQU1FVEVSUzogIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlcgorICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKKyAqICAgICAgICAgICAgICBzdHJpbmcgICAgICAgICAgICAgIC0gU3RyaW5nIHRvIGRpc3BsYXkKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBGdW5jdGlvbiBleGl0IHRyYWNlLiBQcmludHMgb25seSBpZiBUUkFDRV9GVU5DVElPTlMgYml0IGlzCisgKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsLiBQcmludHMgZXhpdCB2YWx1ZSBhbHNvLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK2FjcGlfdXRfc3RyX2V4aXQodTMyIGxpbmVfbnVtYmVyLAorCQkgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkLCBjb25zdCBjaGFyICpzdHJpbmcpCit7CisKKwkvKiBDaGVjayBpZiBlbmFibGVkIHVwLWZyb250IGZvciBwZXJmb3JtYW5jZSAqLworCisJaWYgKEFDUElfSVNfREVCVUdfRU5BQkxFRChBQ1BJX0xWX0ZVTkNUSU9OUywgY29tcG9uZW50X2lkKSkgeworCQlhY3BpX2RlYnVnX3ByaW50KEFDUElfTFZfRlVOQ1RJT05TLAorCQkJCSBsaW5lX251bWJlciwgZnVuY3Rpb25fbmFtZSwgbW9kdWxlX25hbWUsCisJCQkJIGNvbXBvbmVudF9pZCwgIiVzICVzXG4iLAorCQkJCSBhY3BpX2dibF9mdW5jdGlvbl9leGl0X3ByZWZpeCwgc3RyaW5nKTsKKwl9CisKKwlpZiAoYWNwaV9nYmxfbmVzdGluZ19sZXZlbCkgeworCQlhY3BpX2dibF9uZXN0aW5nX2xldmVsLS07CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RyYWNlX3BvaW50CiAgKgogICogUEFSQU1FVEVSUzogIHR5cGUgICAgICAgICAgICAgICAgLSBUcmFjZSBldmVudCB0eXBlCkBAIC01OTEsMjcgKzYyOCwzIEBACiAKIEFDUElfRVhQT1JUX1NZTUJPTChhY3BpX3RyYWNlX3BvaW50KQogI2VuZGlmCi0jaWZkZWYgQUNQSV9BUFBMSUNBVElPTgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9sb2dfZXJyb3IKLSAqCi0gKiBQQVJBTUVURVJTOiAgZm9ybWF0ICAgICAgICAgICAgICAtIFByaW50ZiBmb3JtYXQgZmllbGQKLSAqICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgIC0gT3B0aW9uYWwgcHJpbnRmIGFyZ3VtZW50cwotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFByaW50IGVycm9yIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUsIHVzZWQgYnkgYXBwbGljYXRpb25zLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFIGFjcGlfbG9nX2Vycm9yKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0JKHZvaWQpYWNwaV91dF9maWxlX3ZwcmludGYoQUNQSV9GSUxFX0VSUiwgZm9ybWF0LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2xvZ19lcnJvcikKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGRlY29kZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGRlY29kZS5jCmluZGV4IGVmZDc5ODguLjE1NzI4YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRkZWNvZGUuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVjb2RlLmMKQEAgLTI1Myw3ICsyNTMsNyBAQAogCQlyZXR1cm5fUFRSKCJJbnZhbGlkIG9iamVjdCIpOwogCX0KIAotCXJldHVybl9QVFIoYWNwaV91dF9nZXRfdHlwZV9uYW1lKG9ial9kZXNjLT5jb21tb24udHlwZSkpOworCXJldHVybl9TVFIoYWNwaV91dF9nZXRfdHlwZV9uYW1lKG9ial9kZXNjLT5jb21tb24udHlwZSkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGhleC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGhleC5jCmluZGV4IDQzNTRmYjguLjM2ZDJmYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRoZXguYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0aGV4LmMKQEAgLTc1LDkgKzc1LDQxIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYXNjaWlfdG9faGV4X2J5dGUKKyAqCisgKiBQQVJBTUVURVJTOiAgdHdvX2FzY2lpX2NoYXJzICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0d28gQVNDSUkgY2hhcmFjdGVycworICogICAgICAgICAgICAgIHJldHVybl9ieXRlICAgICAgICAgICAgICAgICAtIFdoZXJlIGNvbnZlcnRlZCBieXRlIGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgY29udmVydGVkIGhleCBieXRlCisgKgorICogREVTQ1JJUFRJT046IFBlcmZvcm0gYXNjaWktdG8taGV4IHRyYW5zbGF0aW9uLCBleGFjdGx5IHR3byBBU0NJSSBjaGFyYWN0ZXJzCisgKiAgICAgICAgICAgICAgdG8gYSBzaW5nbGUgY29udmVydGVkIGJ5dGUgdmFsdWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV91dF9hc2NpaV90b19oZXhfYnl0ZShjaGFyICp0d29fYXNjaWlfY2hhcnMsIHU4ICpyZXR1cm5fYnl0ZSkKK3sKKworCS8qIEJvdGggQVNDSUkgY2hhcmFjdGVycyBtdXN0IGJlIHZhbGlkIGhleCBkaWdpdHMgKi8KKworCWlmICghaXN4ZGlnaXQoKGludCl0d29fYXNjaWlfY2hhcnNbMF0pIHx8CisJICAgICFpc3hkaWdpdCgoaW50KXR3b19hc2NpaV9jaGFyc1sxXSkpIHsKKwkJcmV0dXJuIChBRV9CQURfSEVYX0NPTlNUQU5UKTsKKwl9CisKKwkqcmV0dXJuX2J5dGUgPQorCSAgICBhY3BpX3V0X2FzY2lpX2NoYXJfdG9faGV4KHR3b19hc2NpaV9jaGFyc1sxXSkgfAorCSAgICAoYWNwaV91dF9hc2NpaV9jaGFyX3RvX2hleCh0d29fYXNjaWlfY2hhcnNbMF0pIDw8IDQpOworCisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYXNjaWlfY2hhcl90b19oZXgKICAqCi0gKiBQQVJBTUVURVJTOiAgaGV4X2NoYXIgICAgICAgICAgICAgICAgLSBIZXggY2hhcmFjdGVyIGluIEFzY2lpCisgKiBQQVJBTUVURVJTOiAgaGV4X2NoYXIgICAgICAgICAgICAgICAgLSBIZXggY2hhcmFjdGVyIGluIEFzY2lpLiBNdXN0IGJlOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC05IG9yIEEtRiBvciBhLWYKICAqCiAgKiBSRVRVUk46ICAgICAgVGhlIGJpbmFyeSB2YWx1ZSBvZiB0aGUgYXNjaWkvaGV4IGNoYXJhY3RlcgogICoKQEAgLTg4LDEzICsxMjAsMTkgQEAKIHU4IGFjcGlfdXRfYXNjaWlfY2hhcl90b19oZXgoaW50IGhleF9jaGFyKQogewogCi0JaWYgKGhleF9jaGFyIDw9IDB4MzkpIHsKLQkJcmV0dXJuICgodTgpKGhleF9jaGFyIC0gMHgzMCkpOworCS8qIFZhbHVlcyAwLTkgKi8KKworCWlmIChoZXhfY2hhciA8PSAnOScpIHsKKwkJcmV0dXJuICgodTgpKGhleF9jaGFyIC0gJzAnKSk7CiAJfQogCi0JaWYgKGhleF9jaGFyIDw9IDB4NDYpIHsKKwkvKiBVcHBlciBjYXNlIEEtRiAqLworCisJaWYgKGhleF9jaGFyIDw9ICdGJykgewogCQlyZXR1cm4gKCh1OCkoaGV4X2NoYXIgLSAweDM3KSk7CiAJfQogCisJLyogTG93ZXIgY2FzZSBhLWYgKi8KKwogCXJldHVybiAoKHU4KShoZXhfY2hhciAtIDB4NTcpKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRpbml0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0aW5pdC5jCmluZGV4IGY5MWY3MjQuLjE3MTFmZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRpbml0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGluaXQuYwpAQCAtMjA2LDcgKzIwNiw3IEBACiAJYWNwaV9nYmxfbmV4dF9vd25lcl9pZF9vZmZzZXQgPSAwOwogCWFjcGlfZ2JsX2RlYnVnZ2VyX2NvbmZpZ3VyYXRpb24gPSBERUJVR0dFUl9USFJFQURJTkc7CiAJYWNwaV9nYmxfb3NpX211dGV4ID0gTlVMTDsKLQlhY3BpX2dibF9tYXhfbG9vcF9pdGVyYXRpb25zID0gMHhGRkZGOworCWFjcGlfZ2JsX21heF9sb29wX2l0ZXJhdGlvbnMgPSBBQ1BJX01BWF9MT09QX0NPVU5UOwogCiAJLyogSGFyZHdhcmUgb3JpZW50ZWQgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dG5vbmFuc2kuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRub25hbnNpLmMKaW5kZXggMzQ2NWZlMi4uMjUxNDIzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dG5vbmFuc2kuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0bm9uYW5zaS5jCkBAIC00OCw4ICs0OCw4IEBACiBBQ1BJX01PRFVMRV9OQU1FKCJ1dG5vbmFuc2kiKQogCiAvKgotICogTm9uLUFOU0kgQyBsaWJyYXJ5IGZ1bmN0aW9ucyAtIHN0cmx3ciwgc3RydXByLCBzdHJpY21wLCBhbmQgYSA2NC1iaXQKLSAqIHZlcnNpb24gb2Ygc3RydG91bC4KKyAqIE5vbi1BTlNJIEMgbGlicmFyeSBmdW5jdGlvbnMgLSBzdHJsd3IsIHN0cnVwciwgc3RyaWNtcCwgYW5kICJzYWZlIgorICogc3RyaW5nIGZ1bmN0aW9ucy4KICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yMDAsMzU2ICsyMDAsMyBAQAogCXJldHVybiAoRkFMU0UpOwogfQogI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc3RydG91bDY0Ci0gKgotICogUEFSQU1FVEVSUzogIHN0cmluZyAgICAgICAgICAgICAgICAgIC0gTnVsbCB0ZXJtaW5hdGVkIHN0cmluZwotICogICAgICAgICAgICAgIGJhc2UgICAgICAgICAgICAgICAgICAgIC0gUmFkaXggb2YgdGhlIHN0cmluZzogMTYgb3IgMTAgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUElfQU5ZX0JBU0UKLSAqICAgICAgICAgICAgICBtYXhfaW50ZWdlcl9ieXRlX3dpZHRoICAtIE1heGltdW0gYWxsb3dhYmxlIGludGVnZXIsaW4gYnl0ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IG9yIDggKDMyIG9yIDY0IGJpdHMpCi0gKiAgICAgICAgICAgICAgcmV0X2ludGVnZXIgICAgICAgICAgICAgLSBXaGVyZSB0aGUgY29udmVydGVkIGludGVnZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgQ29udmVydGVkIHZhbHVlCi0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnQgYSBzdHJpbmcgaW50byBhbiB1bnNpZ25lZCB2YWx1ZS4gUGVyZm9ybXMgZWl0aGVyIGEKLSAqICAgICAgICAgICAgICAzMi1iaXQgb3IgNjQtYml0IGNvbnZlcnNpb24sIGRlcGVuZGluZyBvbiB0aGUgaW5wdXQgaW50ZWdlcgotICogICAgICAgICAgICAgIHNpemUgKG9mdGVuIHRoZSBjdXJyZW50IG1vZGUgb2YgdGhlIGludGVycHJldGVyKS4KLSAqCi0gKiBOT1RFUzogICAgICAgTmVnYXRpdmUgbnVtYmVycyBhcmUgbm90IHN1cHBvcnRlZCwgYXMgdGhleSBhcmUgbm90IHN1cHBvcnRlZAotICogICAgICAgICAgICAgIGJ5IEFDUEkuCi0gKgotICogICAgICAgICAgICAgIGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCBzaG91bGQgYmUgc2V0IHRvIHRoZSBwcm9wZXIgd2lkdGguCi0gKiAgICAgICAgICAgICAgRm9yIHRoZSBjb3JlIEFDUElDQSBjb2RlLCB0aGlzIHdpZHRoIGRlcGVuZHMgb24gdGhlIERTRFQKLSAqICAgICAgICAgICAgICB2ZXJzaW9uLiBGb3IgaUFTTCwgdGhlIGRlZmF1bHQgYnl0ZSB3aWR0aCBpcyBhbHdheXMgOCBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgcGFyc2VyLCBidXQgZXJyb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkIGxhdGVyIHRvIGZsYWcgY2FzZXMKLSAqICAgICAgICAgICAgICB3aGVyZSBhIDY0LWJpdCBjb25zdGFudCBpcyBkZWZpbmVkIGluIGEgMzItYml0IERTRFQvU1NEVC4KLSAqCi0gKiAgICAgICAgICAgICAgRG9lcyBub3Qgc3VwcG9ydCBPY3RhbCBzdHJpbmdzLCBub3QgbmVlZGVkIGF0IHRoaXMgdGltZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9zdHJ0b3VsNjQoY2hhciAqc3RyaW5nLAotCQkgIHUzMiBiYXNlLCB1MzIgbWF4X2ludGVnZXJfYnl0ZV93aWR0aCwgdTY0ICpyZXRfaW50ZWdlcikKLXsKLQl1MzIgdGhpc19kaWdpdCA9IDA7Ci0JdTY0IHJldHVybl92YWx1ZSA9IDA7Ci0JdTY0IHF1b3RpZW50OwotCXU2NCBkaXZpZGVuZDsKLQl1OCB2YWxpZF9kaWdpdHMgPSAwOwotCXU4IHNpZ25fb2YweCA9IDA7Ci0JdTggdGVybSA9IDA7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUih1dF9zdHJ0b3VsNjQsIHN0cmluZyk7Ci0KLQlzd2l0Y2ggKGJhc2UpIHsKLQljYXNlIEFDUElfQU5ZX0JBU0U6Ci0JY2FzZSAxMDoKLQljYXNlIDE2OgotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQotCQkvKiBJbnZhbGlkIEJhc2UgKi8KLQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JaWYgKCFzdHJpbmcpIHsKLQkJZ290byBlcnJvcl9leGl0OwotCX0KLQotCS8qIFNraXAgb3ZlciBhbnkgd2hpdGUgc3BhY2UgaW4gdGhlIGJ1ZmZlciAqLwotCi0Jd2hpbGUgKCgqc3RyaW5nKSAmJiAoaXNzcGFjZSgoaW50KSpzdHJpbmcpIHx8ICpzdHJpbmcgPT0gJ1x0JykpIHsKLQkJc3RyaW5nKys7Ci0JfQotCi0JaWYgKGJhc2UgPT0gQUNQSV9BTllfQkFTRSkgewotCQkvKgotCQkgKiBCYXNlIGVxdWFsIHRvIEFDUElfQU5ZX0JBU0UgbWVhbnMgJ0VpdGhlciBkZWNpbWFsIG9yIGhleCcuCi0JCSAqIFdlIG5lZWQgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGRlY2ltYWwgb3IgaGV4YWRlY2ltYWwuCi0JCSAqLwotCQlpZiAoKCpzdHJpbmcgPT0gJzAnKSAmJiAodG9sb3dlcigoaW50KSooc3RyaW5nICsgMSkpID09ICd4JykpIHsKLQkJCXNpZ25fb2YweCA9IDE7Ci0JCQliYXNlID0gMTY7Ci0KLQkJCS8qIFNraXAgb3ZlciB0aGUgbGVhZGluZyAnMHgnICovCi0JCQlzdHJpbmcgKz0gMjsKLQkJfSBlbHNlIHsKLQkJCWJhc2UgPSAxMDsKLQkJfQotCX0KLQotCS8qIEFueSBzdHJpbmcgbGVmdD8gQ2hlY2sgdGhhdCAnMHgnIGlzIG5vdCBmb2xsb3dlZCBieSB3aGl0ZSBzcGFjZS4gKi8KLQotCWlmICghKCpzdHJpbmcpIHx8IGlzc3BhY2UoKGludCkqc3RyaW5nKSB8fCAqc3RyaW5nID09ICdcdCcpIHsKLQkJaWYgKGJhc2UgPT0gQUNQSV9BTllfQkFTRSkgewotCQkJZ290byBlcnJvcl9leGl0OwotCQl9IGVsc2UgewotCQkJZ290byBhbGxfZG9uZTsKLQkJfQotCX0KLQotCS8qCi0JICogUGVyZm9ybSBhIDMyLWJpdCBvciA2NC1iaXQgY29udmVyc2lvbiwgZGVwZW5kaW5nIHVwb24gdGhlIGlucHV0Ci0JICogYnl0ZSB3aWR0aAotCSAqLwotCWRpdmlkZW5kID0gKG1heF9pbnRlZ2VyX2J5dGVfd2lkdGggPD0gQUNQSV9NQVgzMl9CWVRFX1dJRFRIKSA/Ci0JICAgIEFDUElfVUlOVDMyX01BWCA6IEFDUElfVUlOVDY0X01BWDsKLQotCS8qIE1haW4gbG9vcDogY29udmVydCB0aGUgc3RyaW5nIHRvIGEgMzItIG9yIDY0LWJpdCBpbnRlZ2VyICovCi0KLQl3aGlsZSAoKnN0cmluZykgewotCQlpZiAoaXNkaWdpdCgoaW50KSpzdHJpbmcpKSB7Ci0KLQkJCS8qIENvbnZlcnQgQVNDSUkgMC05IHRvIERlY2ltYWwgdmFsdWUgKi8KLQotCQkJdGhpc19kaWdpdCA9ICgodTgpKnN0cmluZykgLSAnMCc7Ci0JCX0gZWxzZSBpZiAoYmFzZSA9PSAxMCkgewotCi0JCQkvKiBEaWdpdCBpcyBvdXQgb2YgcmFuZ2U7IHBvc3NpYmxlIGluIHRvX2ludGVnZXIgY2FzZSBvbmx5ICovCi0KLQkJCXRlcm0gPSAxOwotCQl9IGVsc2UgewotCQkJdGhpc19kaWdpdCA9ICh1OCl0b3VwcGVyKChpbnQpKnN0cmluZyk7Ci0JCQlpZiAoaXN4ZGlnaXQoKGludCl0aGlzX2RpZ2l0KSkgewotCi0JCQkJLyogQ29udmVydCBBU0NJSSBIZXggY2hhciB0byB2YWx1ZSAqLwotCi0JCQkJdGhpc19kaWdpdCA9IHRoaXNfZGlnaXQgLSAnQScgKyAxMDsKLQkJCX0gZWxzZSB7Ci0JCQkJdGVybSA9IDE7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGVybSkgewotCQkJaWYgKGJhc2UgPT0gQUNQSV9BTllfQkFTRSkgewotCQkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKHZhbGlkX2RpZ2l0cyA9PSAwKSAmJiAodGhpc19kaWdpdCA9PSAwKQotCQkJICAgJiYgIXNpZ25fb2YweCkgewotCi0JCQkvKiBTa2lwIHplcm9zICovCi0JCQlzdHJpbmcrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJdmFsaWRfZGlnaXRzKys7Ci0KLQkJaWYgKHNpZ25fb2YweCAmJiAoKHZhbGlkX2RpZ2l0cyA+IDE2KSB8fAotCQkJCSAgKCh2YWxpZF9kaWdpdHMgPiA4KQotCQkJCSAgICYmIChtYXhfaW50ZWdlcl9ieXRlX3dpZHRoIDw9Ci0JCQkJICAgICAgIEFDUElfTUFYMzJfQllURV9XSURUSCkpKSkgewotCQkJLyoKLQkJCSAqIFRoaXMgaXMgdG9faW50ZWdlciBvcGVyYXRpb24gY2FzZS4KLQkJCSAqIE5vIHJlc3RyaWN0aW9ucyBmb3Igc3RyaW5nLXRvLWludGVnZXIgY29udmVyc2lvbiwKLQkJCSAqIHNlZSBBQ1BJIHNwZWMuCi0JCQkgKi8KLQkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJfQotCi0JCS8qIERpdmlkZSB0aGUgZGlnaXQgaW50byB0aGUgY29ycmVjdCBwb3NpdGlvbiAqLwotCi0JCSh2b2lkKWFjcGlfdXRfc2hvcnRfZGl2aWRlKChkaXZpZGVuZCAtICh1NjQpdGhpc19kaWdpdCksIGJhc2UsCi0JCQkJCSAgICZxdW90aWVudCwgTlVMTCk7Ci0KLQkJaWYgKHJldHVybl92YWx1ZSA+IHF1b3RpZW50KSB7Ci0JCQlpZiAoYmFzZSA9PSBBQ1BJX0FOWV9CQVNFKSB7Ci0JCQkJZ290byBlcnJvcl9leGl0OwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybl92YWx1ZSAqPSBiYXNlOwotCQlyZXR1cm5fdmFsdWUgKz0gdGhpc19kaWdpdDsKLQkJc3RyaW5nKys7Ci0JfQotCi0JLyogQWxsIGRvbmUsIG5vcm1hbCBleGl0ICovCi0KLWFsbF9kb25lOgotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiQ29udmVydGVkIHZhbHVlOiAlOC44WCU4LjhYXG4iLAotCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQocmV0dXJuX3ZhbHVlKSkpOwotCi0JKnJldF9pbnRlZ2VyID0gcmV0dXJuX3ZhbHVlOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0KLWVycm9yX2V4aXQ6Ci0KLQkvKiBCYXNlIHdhcyBzZXQvdmFsaWRhdGVkIGFib3ZlICgxMCBvciAxNikgKi8KLQotCWlmIChiYXNlID09IDEwKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfREVDSU1BTF9DT05TVEFOVCk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9IRVhfQ09OU1RBTlQpOwotCX0KLX0KLQotI2lmZGVmIF9PQlNPTEVURV9GVU5DVElPTlMKLS8qIFJlbW92ZWQ6IDAxLzIwMTYgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgc3RydG91bDY0Ci0gKgotICogUEFSQU1FVEVSUzogIHN0cmluZyAgICAgICAgICAgICAgLSBOdWxsIHRlcm1pbmF0ZWQgc3RyaW5nCi0gKiAgICAgICAgICAgICAgdGVybWluYXRlciAgICAgICAgICAtIFdoZXJlIGEgcG9pbnRlciB0byB0aGUgdGVybWluYXRpbmcgYnl0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyByZXR1cm5lZAotICogICAgICAgICAgICAgIGJhc2UgICAgICAgICAgICAgICAgLSBSYWRpeCBvZiB0aGUgc3RyaW5nCi0gKgotICogUkVUVVJOOiAgICAgIENvbnZlcnRlZCB2YWx1ZQotICoKLSAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGEgc3RyaW5nIGludG8gYW4gdW5zaWduZWQgdmFsdWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgc3RydG91bDY0KGNoYXIgKnN0cmluZywgdTMyIGJhc2UsIHU2NCAqcmV0X2ludGVnZXIpCi17Ci0JdTMyIGluZGV4OwotCXUzMiBzaWduOwotCXU2NCByZXR1cm5fdmFsdWUgPSAwOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCi0JKnJldF9pbnRlZ2VyID0gMDsKLQotCXN3aXRjaCAoYmFzZSkgewotCWNhc2UgMDoKLQljYXNlIDg6Ci0JY2FzZSAxMDoKLQljYXNlIDE2OgotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJLyoKLQkJICogVGhlIHNwZWNpZmllZCBCYXNlIHBhcmFtZXRlciBpcyBub3QgaW4gdGhlIGRvbWFpbiBvZgotCQkgKiB0aGlzIGZ1bmN0aW9uOgotCQkgKi8KLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQkvKiBTa2lwIG92ZXIgYW55IHdoaXRlIHNwYWNlIGluIHRoZSBidWZmZXI6ICovCi0KLQl3aGlsZSAoaXNzcGFjZSgoaW50KSpzdHJpbmcpIHx8ICpzdHJpbmcgPT0gJ1x0JykgewotCQkrK3N0cmluZzsKLQl9Ci0KLQkvKgotCSAqIFRoZSBidWZmZXIgbWF5IGNvbnRhaW4gYW4gb3B0aW9uYWwgcGx1cyBvciBtaW51cyBzaWduLgotCSAqIElmIGl0IGRvZXMsIHRoZW4gc2tpcCBvdmVyIGl0IGJ1dCByZW1lbWJlciB3aGF0IGlzIHdhczoKLQkgKi8KLQlpZiAoKnN0cmluZyA9PSAnLScpIHsKLQkJc2lnbiA9IEFDUElfU0lHTl9ORUdBVElWRTsKLQkJKytzdHJpbmc7Ci0JfSBlbHNlIGlmICgqc3RyaW5nID09ICcrJykgewotCQkrK3N0cmluZzsKLQkJc2lnbiA9IEFDUElfU0lHTl9QT1NJVElWRTsKLQl9IGVsc2UgewotCQlzaWduID0gQUNQSV9TSUdOX1BPU0lUSVZFOwotCX0KLQotCS8qCi0JICogSWYgdGhlIGlucHV0IHBhcmFtZXRlciBCYXNlIGlzIHplcm8sIHRoZW4gd2UgbmVlZCB0bwotCSAqIGRldGVybWluZSBpZiBpdCBpcyBvY3RhbCwgZGVjaW1hbCwgb3IgaGV4YWRlY2ltYWw6Ci0JICovCi0JaWYgKGJhc2UgPT0gMCkgewotCQlpZiAoKnN0cmluZyA9PSAnMCcpIHsKLQkJCWlmICh0b2xvd2VyKChpbnQpKigrK3N0cmluZykpID09ICd4JykgewotCQkJCWJhc2UgPSAxNjsKLQkJCQkrK3N0cmluZzsKLQkJCX0gZWxzZSB7Ci0JCQkJYmFzZSA9IDg7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQliYXNlID0gMTA7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEZvciBvY3RhbCBhbmQgaGV4YWRlY2ltYWwgYmFzZXMsIHNraXAgb3ZlciB0aGUgbGVhZGluZwotCSAqIDAgb3IgMHgsIGlmIHRoZXkgYXJlIHByZXNlbnQuCi0JICovCi0JaWYgKGJhc2UgPT0gOCAmJiAqc3RyaW5nID09ICcwJykgewotCQlzdHJpbmcrKzsKLQl9Ci0KLQlpZiAoYmFzZSA9PSAxNiAmJiAqc3RyaW5nID09ICcwJyAmJiB0b2xvd2VyKChpbnQpKigrK3N0cmluZykpID09ICd4JykgewotCQlzdHJpbmcrKzsKLQl9Ci0KLQkvKiBNYWluIGxvb3A6IGNvbnZlcnQgdGhlIHN0cmluZyB0byBhbiB1bnNpZ25lZCBsb25nICovCi0KLQl3aGlsZSAoKnN0cmluZykgewotCQlpZiAoaXNkaWdpdCgoaW50KSpzdHJpbmcpKSB7Ci0JCQlpbmRleCA9ICgodTgpKnN0cmluZykgLSAnMCc7Ci0JCX0gZWxzZSB7Ci0JCQlpbmRleCA9ICh1OCl0b3VwcGVyKChpbnQpKnN0cmluZyk7Ci0JCQlpZiAoaXN1cHBlcigoaW50KWluZGV4KSkgewotCQkJCWluZGV4ID0gaW5kZXggLSAnQScgKyAxMDsKLQkJCX0gZWxzZSB7Ci0JCQkJZ290byBlcnJvcl9leGl0OwotCQkJfQotCQl9Ci0KLQkJaWYgKGluZGV4ID49IGJhc2UpIHsKLQkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJfQotCi0JCS8qIENoZWNrIHRvIHNlZSBpZiB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2U6ICovCi0KLQkJaWYgKHJldHVybl92YWx1ZSA+ICgoQUNQSV9VSU5UNjRfTUFYIC0gKHU2NClpbmRleCkgLyAodTY0KWJhc2UpKSB7Ci0JCQlnb3RvIGVycm9yX2V4aXQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm5fdmFsdWUgKj0gYmFzZTsKLQkJCXJldHVybl92YWx1ZSArPSBpbmRleDsKLQkJfQotCi0JCSsrc3RyaW5nOwotCX0KLQotCS8qIElmIGEgbWludXMgc2lnbiB3YXMgcHJlc2VudCwgdGhlbiAidGhlIGNvbnZlcnNpb24gaXMgbmVnYXRlZCI6ICovCi0KLQlpZiAoc2lnbiA9PSBBQ1BJX1NJR05fTkVHQVRJVkUpIHsKLQkJcmV0dXJuX3ZhbHVlID0gKEFDUElfVUlOVDMyX01BWCAtIHJldHVybl92YWx1ZSkgKyAxOwotCX0KLQotCSpyZXRfaW50ZWdlciA9IHJldHVybl92YWx1ZTsKLQlyZXR1cm4gKHN0YXR1cyk7Ci0KLWVycm9yX2V4aXQ6Ci0Jc3dpdGNoIChiYXNlKSB7Ci0JY2FzZSA4OgotCi0JCXN0YXR1cyA9IEFFX0JBRF9PQ1RBTF9DT05TVEFOVDsKLQkJYnJlYWs7Ci0KLQljYXNlIDEwOgotCi0JCXN0YXR1cyA9IEFFX0JBRF9ERUNJTUFMX0NPTlNUQU5UOwotCQlicmVhazsKLQotCWNhc2UgMTY6Ci0KLQkJc3RhdHVzID0gQUVfQkFEX0hFWF9DT05TVEFOVDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCS8qIEJhc2UgdmFsaWRhdGVkIGFib3ZlICovCi0KLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIChzdGF0dXMpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0b3NpLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0b3NpLmMKaW5kZXggM2Y1ZmVkNi4uZjA0ODRiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dG9zaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRvc2kuYwpAQCAtMzkwLDExICszOTAsMjIgQEAKICAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cworICogICAgICAgICAgICAgIEludGVnZXI6IFRSVUUgKDApIGlmIGlucHV0IHN0cmluZyBpcyBtYXRjaGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgKC0xKSBpZiBzdHJpbmcgaXMgbm90IG1hdGNoZWQKICAqCiAgKiBERVNDUklQVElPTjogSW1wbGVtZW50YXRpb24gb2YgdGhlIF9PU0kgcHJlZGVmaW5lZCBjb250cm9sIG1ldGhvZC4gV2hlbgogICogICAgICAgICAgICAgIGFuIGludm9jYXRpb24gb2YgX09TSSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgc3lzdGVtIEFNTCwKICAqICAgICAgICAgICAgICBjb250cm9sIGlzIHRyYW5zZmVycmVkIHRvIHRoaXMgZnVuY3Rpb24uCiAgKgorICogKEF1Z3VzdCAyMDE2KQorICogTm90ZTogIF9PU0kgaXMgbm93IGRlZmluZWQgdG8gcmV0dXJuICJPbmVzIiB0byBpbmRpY2F0ZSBhIG1hdGNoLCBmb3IKKyAqIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBBQ1BJIGltcGxlbWVudGF0aW9ucy4gT24gYSAzMi1iaXQgRFNEVCwgT25lcworICogaXMgMHhGRkZGRkZGRi4gT24gYSA2NC1iaXQgRFNEVCwgT25lcyBpcyAweEZGRkZGRkZGRkZGRkZGRkYKKyAqIChBQ1BJX1VJTlQ2NF9NQVgpLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgQUNQSV9VSU5UNjRfTUFYIGZvciBUUlVFLCBhbmQgbGF0ZXIgY29kZQorICogd2lsbCB0cnVuY2F0ZSB0aGlzIHRvIDMyIGJpdHMgaWYgbmVjZXNzYXJ5LgorICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzIGFjcGlfdXRfb3NpX2ltcGxlbWVudGF0aW9uKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCkBAIC00MDQsNyArNDE1LDcgQEAKIAlzdHJ1Y3QgYWNwaV9pbnRlcmZhY2VfaW5mbyAqaW50ZXJmYWNlX2luZm87CiAJYWNwaV9pbnRlcmZhY2VfaGFuZGxlciBpbnRlcmZhY2VfaGFuZGxlcjsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIHJldHVybl92YWx1ZTsKKwl1NjQgcmV0dXJuX3ZhbHVlOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9vc2lfaW1wbGVtZW50YXRpb24pOwogCkBAIC00NDQsNyArNDU1LDcgQEAKIAkJCWFjcGlfZ2JsX29zaV9kYXRhID0gaW50ZXJmYWNlX2luZm8tPnZhbHVlOwogCQl9CiAKLQkJcmV0dXJuX3ZhbHVlID0gQUNQSV9VSU5UMzJfTUFYOworCQlyZXR1cm5fdmFsdWUgPSBBQ1BJX1VJTlQ2NF9NQVg7CiAJfQogCiAJYWNwaV9vc19yZWxlYXNlX211dGV4KGFjcGlfZ2JsX29zaV9tdXRleCk7CkBAIC00NTYsOSArNDY3LDEwIEBACiAJICovCiAJaW50ZXJmYWNlX2hhbmRsZXIgPSBhY3BpX2dibF9pbnRlcmZhY2VfaGFuZGxlcjsKIAlpZiAoaW50ZXJmYWNlX2hhbmRsZXIpIHsKLQkJcmV0dXJuX3ZhbHVlID0KLQkJICAgIGludGVyZmFjZV9oYW5kbGVyKHN0cmluZ19kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJCQkgICAgICByZXR1cm5fdmFsdWUpOworCQlpZiAoaW50ZXJmYWNlX2hhbmRsZXIKKwkJICAgIChzdHJpbmdfZGVzYy0+c3RyaW5nLnBvaW50ZXIsICh1MzIpcmV0dXJuX3ZhbHVlKSkgeworCQkJcmV0dXJuX3ZhbHVlID0gQUNQSV9VSU5UNjRfTUFYOworCQl9CiAJfQogCiAJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5GTywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRwcmVkZWYuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRwcmVkZWYuYwppbmRleCA3NzBhMTc3Li5jZTE4MzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0cHJlZGVmLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHByZWRlZi5jCkBAIC0xNzYsOCArMTc2LDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZiAoZGVmaW5lZCBBQ1BJX0FTTF9DT01QSUxFUiB8fCBkZWZpbmVkIEFDUElfSEVMUF9BUFApCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0cHJpbnQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRwcmludC5jCmluZGV4IGRkMDg0Y2YuLjQwZWJhODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRwcmludC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRwcmludC5jCkBAIC0zMzYsNyArMzM2LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF92c25wcmludGYKKyAqIEZVTkNUSU9OOiAgICB2c25wcmludGYKICAqCiAgKiBQQVJBTUVURVJTOiAgc3RyaW5nICAgICAgICAgICAgICAtIFN0cmluZyB3aXRoIGJvdW5kYXJ5CiAgKiAgICAgICAgICAgICAgc2l6ZSAgICAgICAgICAgICAgICAtIEJvdW5kYXJ5IG9mIHRoZSBzdHJpbmcKQEAgLTM0OSw5ICszNDksNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWludAotYWNwaV91dF92c25wcmludGYoY2hhciAqc3RyaW5nLAotCQkgIGFjcGlfc2l6ZSBzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK2ludCB2c25wcmludGYoY2hhciAqc3RyaW5nLCBhY3BpX3NpemUgc2l6ZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCiB7CiAJdTggYmFzZTsKIAl1OCB0eXBlOwpAQCAtNTg2LDcgKzU4NCw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc25wcmludGYKKyAqIEZVTkNUSU9OOiAgICBzbnByaW50ZgogICoKICAqIFBBUkFNRVRFUlM6ICBzdHJpbmcgICAgICAgICAgICAgIC0gU3RyaW5nIHdpdGggYm91bmRhcnkKICAqICAgICAgICAgICAgICBzaXplICAgICAgICAgICAgICAgIC0gQm91bmRhcnkgb2YgdGhlIHN0cmluZwpAQCAtNTk4LDEzICs1OTYsMzggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1pbnQgYWNwaV91dF9zbnByaW50ZihjaGFyICpzdHJpbmcsIGFjcGlfc2l6ZSBzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK2ludCBzbnByaW50ZihjaGFyICpzdHJpbmcsIGFjcGlfc2l6ZSBzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CiAJaW50IGxlbmd0aDsKIAogCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0JbGVuZ3RoID0gYWNwaV91dF92c25wcmludGYoc3RyaW5nLCBzaXplLCBmb3JtYXQsIGFyZ3MpOworCWxlbmd0aCA9IHZzbnByaW50ZihzdHJpbmcsIHNpemUsIGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIChsZW5ndGgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBzcHJpbnRmCisgKgorICogUEFSQU1FVEVSUzogIHN0cmluZyAgICAgICAgICAgICAgLSBTdHJpbmcgd2l0aCBib3VuZGFyeQorICogICAgICAgICAgICAgIEZvcm1hdCwgLi4uICAgICAgICAgLSBTdGFuZGFyZCBwcmludGYgZm9ybWF0CisgKgorICogUkVUVVJOOiAgICAgIE51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuLgorICoKKyAqIERFU0NSSVBUSU9OOiBGb3JtYXR0ZWQgb3V0cHV0IHRvIGEgc3RyaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBzcHJpbnRmKGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCBsZW5ndGg7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCWxlbmd0aCA9IHZzbnByaW50ZihzdHJpbmcsIEFDUElfVUlOVDMyX01BWCwgZm9ybWF0LCBhcmdzKTsKIAl2YV9lbmQoYXJncyk7CiAKIAlyZXR1cm4gKGxlbmd0aCk7CkBAIC02MTMsNyArNjM2LDU5IEBACiAjaWZkZWYgQUNQSV9BUFBMSUNBVElPTgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9maWxlX3ZwcmludGYKKyAqIEZVTkNUSU9OOiAgICB2cHJpbnRmCisgKgorICogUEFSQU1FVEVSUzogIGZvcm1hdCAgICAgICAgICAgICAgLSBTdGFuZGFyZCBwcmludGYgZm9ybWF0CisgKiAgICAgICAgICAgICAgYXJncyAgICAgICAgICAgICAgICAtIEFyZ3VtZW50IGxpc3QKKyAqCisgKiBSRVRVUk46ICAgICAgTnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4uCisgKgorICogREVTQ1JJUFRJT046IEZvcm1hdHRlZCBvdXRwdXQgdG8gc3Rkb3V0IHVzaW5nIGFyZ3VtZW50IGxpc3QgcG9pbnRlci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgdnByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKwlhY3BpX2NwdV9mbGFncyBmbGFnczsKKwlpbnQgbGVuZ3RoOworCisJZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9wcmludF9sb2NrKTsKKwlsZW5ndGggPSB2c25wcmludGYoYWNwaV9nYmxfcHJpbnRfYnVmZmVyLAorCQkJICAgc2l6ZW9mKGFjcGlfZ2JsX3ByaW50X2J1ZmZlciksIGZvcm1hdCwgYXJncyk7CisKKwkodm9pZClmd3JpdGUoYWNwaV9nYmxfcHJpbnRfYnVmZmVyLCBsZW5ndGgsIDEsIEFDUElfRklMRV9PVVQpOworCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX3ByaW50X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAobGVuZ3RoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgcHJpbnRmCisgKgorICogUEFSQU1FVEVSUzogIEZvcm1hdCwgLi4uICAgICAgICAgLSBTdGFuZGFyZCBwcmludGYgZm9ybWF0CisgKgorICogUkVUVVJOOiAgICAgIE51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuLgorICoKKyAqIERFU0NSSVBUSU9OOiBGb3JtYXR0ZWQgb3V0cHV0IHRvIHN0ZG91dC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgbGVuZ3RoOworCisJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwlsZW5ndGggPSB2cHJpbnRmKGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIChsZW5ndGgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICB2ZnByaW50ZgogICoKICAqIFBBUkFNRVRFUlM6ICBmaWxlICAgICAgICAgICAgICAgIC0gRmlsZSBkZXNjcmlwdG9yCiAgKiAgICAgICAgICAgICAgZm9ybWF0ICAgICAgICAgICAgICAtIFN0YW5kYXJkIHByaW50ZiBmb3JtYXQKQEAgLTYyNSwxNiArNzAwLDE2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotaW50IGFjcGlfdXRfZmlsZV92cHJpbnRmKEFDUElfRklMRSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK2ludCB2ZnByaW50ZihGSUxFICogZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCiB7CiAJYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7CiAJaW50IGxlbmd0aDsKIAogCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfcHJpbnRfbG9jayk7Ci0JbGVuZ3RoID0gYWNwaV91dF92c25wcmludGYoYWNwaV9nYmxfcHJpbnRfYnVmZmVyLAotCQkJCSAgIHNpemVvZihhY3BpX2dibF9wcmludF9idWZmZXIpLCBmb3JtYXQsIGFyZ3MpOworCWxlbmd0aCA9IHZzbnByaW50ZihhY3BpX2dibF9wcmludF9idWZmZXIsCisJCQkgICBzaXplb2YoYWNwaV9nYmxfcHJpbnRfYnVmZmVyKSwgZm9ybWF0LCBhcmdzKTsKIAotCSh2b2lkKWFjcGlfb3Nfd3JpdGVfZmlsZShmaWxlLCBhY3BpX2dibF9wcmludF9idWZmZXIsIGxlbmd0aCwgMSk7CisJKHZvaWQpZndyaXRlKGFjcGlfZ2JsX3ByaW50X2J1ZmZlciwgbGVuZ3RoLCAxLCBmaWxlKTsKIAlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9wcmludF9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gKGxlbmd0aCk7CkBAIC02NDIsNyArNzE3LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9maWxlX3ByaW50ZgorICogRlVOQ1RJT046ICAgIGZwcmludGYKICAqCiAgKiBQQVJBTUVURVJTOiAgZmlsZSAgICAgICAgICAgICAgICAtIEZpbGUgZGVzY3JpcHRvcgogICogICAgICAgICAgICAgIEZvcm1hdCwgLi4uICAgICAgICAgLSBTdGFuZGFyZCBwcmludGYgZm9ybWF0CkBAIC02NTMsMTMgKzcyOCwxMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWludCBhY3BpX3V0X2ZpbGVfcHJpbnRmKEFDUElfRklMRSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK2ludCBmcHJpbnRmKEZJTEUgKiBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CiAJaW50IGxlbmd0aDsKIAogCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0JbGVuZ3RoID0gYWNwaV91dF9maWxlX3ZwcmludGYoZmlsZSwgZm9ybWF0LCBhcmdzKTsKKwlsZW5ndGggPSB2ZnByaW50ZihmaWxlLCBmb3JtYXQsIGFyZ3MpOwogCXZhX2VuZChhcmdzKTsKIAogCXJldHVybiAobGVuZ3RoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRzdHJ0b3VsNjQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRzdHJ0b3VsNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGYzNDFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHN0cnRvdWw2NC5jCkBAIC0wLDAgKzEsMzQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiB1dHN0cnRvdWw2NCAtIHN0cmluZyB0byA2NC1iaXQgaW50ZWdlciBzdXBwb3J0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTYsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSBzYXRpc2Z5IHRoZSBuZWVkIGZvciA2NC1iaXQgc3RyaW5nLXRvLWludGVnZXIKKyAqIGNvbnZlcnNpb25zIG9uIGJvdGggMzItYml0IGFuZCA2NC1iaXQgcGxhdGZvcm1zLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUworQUNQSV9NT0RVTEVfTkFNRSgidXRzdHJ0b3VsNjQiKQorCisvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgdTY0IGFjcGlfdXRfc3RydG91bF9iYXNlMTAoY2hhciAqc3RyaW5nLCB1MzIgZmxhZ3MpOworCitzdGF0aWMgdTY0IGFjcGlfdXRfc3RydG91bF9iYXNlMTYoY2hhciAqc3RyaW5nLCB1MzIgZmxhZ3MpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFN0cmluZyBjb252ZXJzaW9uIHJ1bGVzIGFzIHdyaXR0ZW4gaW4gdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4gVGhlIGVycm9yCisgKiBjb25kaXRpb25zIGFuZCBiZWhhdmlvciBhcmUgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBjb252ZXJzaW9uLgorICoKKyAqCisgKiBJbXBsaWNpdCBkYXRhIHR5cGUgY29udmVyc2lvbjogc3RyaW5nLXRvLWludGVnZXIKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQmFzZSBpcyBhbHdheXMgMTYuIFRoaXMgaXMgdGhlIEFDUElfU1RSVE9VTF9CQVNFMTYgY2FzZS4KKyAqCisgKiBFeGFtcGxlOgorICogICAgICBBZGQgKCJCQTk4IiwgQXJnMCwgTG9jYWwwKQorICoKKyAqIFRoZSBpbnRlZ2VyIGlzIGluaXRpYWxpemVkIHRvIHRoZSB2YWx1ZSB6ZXJvLgorICogVGhlIEFTQ0lJIHN0cmluZyBpcyBpbnRlcnByZXRlZCBhcyBhIGhleGFkZWNpbWFsIGNvbnN0YW50LgorICoKKyAqICAxKSAgQSAiMHgiIHByZWZpeCBpcyBub3QgYWxsb3dlZC4gSG93ZXZlciwgQUNQSUNBIGFsbG93cyB0aGlzIGZvcgorICogICAgICBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgQUNQSUNBLiAoTk8gRVJST1IpCisgKgorICogIDIpICBUZXJtaW5hdGVzIHdoZW4gdGhlIHNpemUgb2YgYW4gaW50ZWdlciBpcyByZWFjaGVkICgzMiBvciA2NCBiaXRzKS4KKyAqICAgICAgKE5PIEVSUk9SKQorICoKKyAqICAzKSAgVGhlIGZpcnN0IG5vbi1oZXggY2hhcmFjdGVyIHRlcm1pbmF0ZXMgdGhlIGNvbnZlcnNpb24gd2l0aG91dCBlcnJvci4KKyAqICAgICAgKE5PIEVSUk9SKQorICoKKyAqICA0KSAgQ29udmVyc2lvbiBvZiBhIG51bGwgKHplcm8tbGVuZ3RoKSBzdHJpbmcgdG8gYW4gaW50ZWdlciBpcyBub3QKKyAqICAgICAgYWxsb3dlZC4gSG93ZXZlciwgQUNQSUNBIGFsbG93cyB0aGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMKKyAqICAgICAgQUNQSUNBLiBUaGlzIGNvbnZlcnNpb24gcmV0dXJucyB0aGUgdmFsdWUgMC4gKE5PIEVSUk9SKQorICoKKyAqCisgKiBFeHBsaWNpdCBkYXRhIHR5cGUgY29udmVyc2lvbjogIHRvX2ludGVnZXIoKSB3aXRoIHN0cmluZyBvcGVyYW5kCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBCYXNlIGlzIGVpdGhlciAxMCAoZGVmYXVsdCkgb3IgMTYgKHdpdGggMHggcHJlZml4KQorICoKKyAqIEV4YW1wbGVzOgorICogICAgICB0b19pbnRlZ2VyICgiMTAwMCIpCisgKiAgICAgIHRvX2ludGVnZXIgKCIweEFCQ0QiKQorICoKKyAqICAxKSAgQ2FuIGJlIChtdXN0IGJlKSBlaXRoZXIgYSBkZWNpbWFsIG9yIGhleGFkZWNpbWFsIG51bWVyaWMgc3RyaW5nLgorICogICAgICBBIGhleCB2YWx1ZSBtdXN0IGJlIHByZWZpeGVkIGJ5ICIweCIgb3IgaXQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBkZWNpbWFsLgorICoKKyAqICAyKSAgVGhlIHZhbHVlIG11c3Qgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBvZiBhbiBpbnRlZ2VyIHZhbHVlLiBBQ1BJIHNwZWMKKyAqICAgICAgc3RhdGVzIHRoZSBiZWhhdmlvciBpcyAidW5wcmVkaWN0YWJsZSIsIHNvIEFDUElDQSBtYXRjaGVzIHRoZSBiZWhhdmlvcgorICogICAgICBvZiB0aGUgaW1wbGljaXQgY29udmVyc2lvbiBjYXNlLihOTyBFUlJPUikKKyAqCisgKiAgMykgIEJlaGF2aW9yIG9uIHRoZSBmaXJzdCBub24taGV4IGNoYXJhY3RlciBpcyBub3Qgc3BlY2lmaWVkIGJ5IHRoZSBBQ1BJCisgKiAgICAgIHNwZWMsIHNvIEFDUElDQSBtYXRjaGVzIHRoZSBiZWhhdmlvciBvZiB0aGUgaW1wbGljaXQgY29udmVyc2lvbiBjYXNlCisgKiAgICAgIGFuZCB0ZXJtaW5hdGVzLiAoTk8gRVJST1IpCisgKgorICogIDQpICBBIG51bGwgKHplcm8tbGVuZ3RoKSBzdHJpbmcgaXMgaWxsZWdhbC4KKyAqICAgICAgSG93ZXZlciwgQUNQSUNBIGFsbG93cyB0aGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgQUNQSUNBLgorICogICAgICBUaGlzIGNvbnZlcnNpb24gcmV0dXJucyB0aGUgdmFsdWUgMC4gKE5PIEVSUk9SKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc3RydG91bDY0CisgKgorICogUEFSQU1FVEVSUzogIHN0cmluZyAgICAgICAgICAgICAgICAgIC0gTnVsbCB0ZXJtaW5hdGVkIGlucHV0IHN0cmluZworICogICAgICAgICAgICAgIGZsYWdzICAgICAgICAgICAgICAgICAgIC0gQ29udmVyc2lvbiBpbmZvLCBzZWUgYmVsb3cKKyAqICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgICAgICAgICAgICAtIFdoZXJlIHRoZSBjb252ZXJ0ZWQgaW50ZWdlciBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzIGFuZCBDb252ZXJ0ZWQgdmFsdWUKKyAqCisgKiBERVNDUklQVElPTjogQ29udmVydCBhIHN0cmluZyBpbnRvIGFuIHVuc2lnbmVkIHZhbHVlLiBQZXJmb3JtcyBlaXRoZXIgYQorICogICAgICAgICAgICAgIDMyLWJpdCBvciA2NC1iaXQgY29udmVyc2lvbiwgZGVwZW5kaW5nIG9uIHRoZSBpbnB1dCBpbnRlZ2VyCisgKiAgICAgICAgICAgICAgc2l6ZSBpbiBGbGFncyAob2Z0ZW4gdGhlIGN1cnJlbnQgbW9kZSBvZiB0aGUgaW50ZXJwcmV0ZXIpLgorICoKKyAqIFZhbHVlcyBmb3IgRmxhZ3M6CisgKiAgICAgIEFDUElfU1RSVE9VTF8zMkJJVCAgICAgIC0gTWF4IGludGVnZXIgdmFsdWUgaXMgMzIgYml0cworICogICAgICBBQ1BJX1NUUlRPVUxfNjRCSVQgICAgICAtIE1heCBpbnRlZ2VyIHZhbHVlIGlzIDY0IGJpdHMKKyAqICAgICAgQUNQSV9TVFJUT1VMX0JBU0UxNiAgICAgLSBJbnB1dCBzdHJpbmcgaXMgaGV4YWRlY2ltYWwuIERlZmF1bHQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyAxMC8xNiBiYXNlZCBvbiBzdHJpbmcgcHJlZml4ICgweCkuCisgKgorICogTk9URVM6CisgKiAgIE5lZ2F0aXZlIG51bWJlcnMgYXJlIG5vdCBzdXBwb3J0ZWQsIGFzIHRoZXkgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgQUNQSS4KKyAqCisgKiAgIFN1cHBvcnRzIG9ubHkgYmFzZSAxNiBvciBiYXNlIDEwIHN0cmluZ3MvdmFsdWVzLiBEb2VzIG5vdAorICogICBzdXBwb3J0IE9jdGFsIHN0cmluZ3MsIGFzIHRoZXNlIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IEFDUEkuCisgKgorICogQ3VycmVudCB1c2VycyBvZiB0aGlzIHN1cHBvcnQ6CisgKgorICogIGludGVycHJldGVyIC0gSW1wbGljaXQgYW5kIGV4cGxpY2l0IGNvbnZlcnNpb25zLCBHUEUgbWV0aG9kIG5hbWVzCisgKiAgZGVidWdnZXIgICAgLSBDb21tYW5kIGxpbmUgaW5wdXQgc3RyaW5nIGNvbnZlcnNpb24KKyAqICBpQVNMICAgICAgICAtIE1haW4gcGFyc2VyLCBjb252ZXJzaW9uIG9mIGNvbnN0YW50cyB0byBpbnRlZ2VycworICogIGlBU0wgICAgICAgIC0gRGF0YSBUYWJsZSBDb21waWxlciBwYXJzZXIgKGNvbnN0YW50IG1hdGggZXhwcmVzc2lvbnMpCisgKiAgaUFTTCAgICAgICAgLSBQcmVwcm9jZXNzb3IgKGNvbnN0YW50IG1hdGggZXhwcmVzc2lvbnMpCisgKiAgYWNwaV9kdW1wICAgLSBJbnB1dCB0YWJsZSBhZGRyZXNzZXMKKyAqICBhY3BpX2V4ZWMgICAtIFRlc3Rpbmcgb2YgdGhlIGFjcGlfdXRfc3RydG91bDY0IGZ1bmN0aW9uCisgKgorICogTm90ZSBjb25jZXJuaW5nIGNhbGxlcnM6CisgKiAgIGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIDMyLzY0IGxpbWl0LiBJZiB1c2VkLAorICogICB0aGlzIGdsb2JhbCBzaG91bGQgYmUgc2V0IHRvIHRoZSBwcm9wZXIgd2lkdGguIEZvciB0aGUgY29yZSBBQ1BJQ0EgY29kZSwKKyAqICAgdGhpcyB3aWR0aCBkZXBlbmRzIG9uIHRoZSBEU0RUIHZlcnNpb24uIEZvciBpQVNMLCB0aGUgZGVmYXVsdCBieXRlCisgKiAgIHdpZHRoIGlzIGFsd2F5cyA4IGZvciB0aGUgcGFyc2VyLCBidXQgZXJyb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkIGxhdGVyCisgKiAgIHRvIGZsYWcgY2FzZXMgd2hlcmUgYSA2NC1iaXQgY29uc3RhbnQgaXMgZGVmaW5lZCBpbiBhIDMyLWJpdCBEU0RUL1NTRFQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV91dF9zdHJ0b3VsNjQoY2hhciAqc3RyaW5nLCB1MzIgZmxhZ3MsIHU2NCAqcmV0dXJuX3ZhbHVlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXUzMiBiYXNlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIodXRfc3RydG91bDY0LCBzdHJpbmcpOworCisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKworCWlmICghc3RyaW5nIHx8ICFyZXR1cm5fdmFsdWUpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCSpyZXR1cm5fdmFsdWUgPSAwOworCisJLyogQ2hlY2sgZm9yIHplcm8tbGVuZ3RoIHN0cmluZywgcmV0dXJucyAwICovCisKKwlpZiAoKnN0cmluZyA9PSAwKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyogU2tpcCBvdmVyIGFueSB3aGl0ZSBzcGFjZSBhdCBzdGFydCBvZiBzdHJpbmcgKi8KKworCXdoaWxlIChpc3NwYWNlKChpbnQpKnN0cmluZykpIHsKKwkJc3RyaW5nKys7CisJfQorCisJLyogRW5kIG9mIHN0cmluZz8gcmV0dXJuIDAgKi8KKworCWlmICgqc3RyaW5nID09IDApIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwkvKgorCSAqIDEpIFRoZSAiMHgiIHByZWZpeCBpbmRpY2F0ZXMgYmFzZSAxNi4gUGVyIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24sCisJICogdGhlICIweCIgcHJlZml4IGlzIG9ubHkgYWxsb3dlZCBmb3IgaW1wbGljaXQgKG5vbi1zdHJpY3QpIGNvbnZlcnNpb25zLgorCSAqIEhvd2V2ZXIsIHdlIGFsd2F5cyBhbGxvdyBpdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIEFDUElDQS4KKwkgKi8KKwlpZiAoKCpzdHJpbmcgPT0gQUNQSV9BU0NJSV9aRVJPKSAmJgorCSAgICAodG9sb3dlcigoaW50KSooc3RyaW5nICsgMSkpID09ICd4JykpIHsKKwkJc3RyaW5nICs9IDI7CS8qIEdvIHBhc3QgdGhlIDB4ICovCisJCWlmICgqc3RyaW5nID09IDApIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CS8qIFJldHVybiB2YWx1ZSAwICovCisJCX0KKworCQliYXNlID0gMTY7CisJfQorCisJLyogMikgRm9yY2UgdG8gYmFzZSAxNiAoaW1wbGljaXQgY29udmVyc2lvbiBjYXNlKSAqLworCisJZWxzZSBpZiAoZmxhZ3MgJiBBQ1BJX1NUUlRPVUxfQkFTRTE2KSB7CisJCWJhc2UgPSAxNjsKKwl9CisKKwkvKiAzKSBEZWZhdWx0IGZhbGxiYWNrIGlzIHRvIEJhc2UgMTAgKi8KKworCWVsc2UgeworCQliYXNlID0gMTA7CisJfQorCisJLyogU2tpcCBhbGwgbGVhZGluZyB6ZXJvcyAqLworCisJd2hpbGUgKCpzdHJpbmcgPT0gQUNQSV9BU0NJSV9aRVJPKSB7CisJCXN0cmluZysrOworCQlpZiAoKnN0cmluZyA9PSAwKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwkvKiBSZXR1cm4gdmFsdWUgMCAqLworCQl9CisJfQorCisJLyogUGVyZm9ybSB0aGUgYmFzZSAxNiBvciAxMCBjb252ZXJzaW9uICovCisKKwlpZiAoYmFzZSA9PSAxNikgeworCQkqcmV0dXJuX3ZhbHVlID0gYWNwaV91dF9zdHJ0b3VsX2Jhc2UxNihzdHJpbmcsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkqcmV0dXJuX3ZhbHVlID0gYWNwaV91dF9zdHJ0b3VsX2Jhc2UxMChzdHJpbmcsIGZsYWdzKTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9zdHJ0b3VsX2Jhc2UxMAorICoKKyAqIFBBUkFNRVRFUlM6ICBzdHJpbmcgICAgICAgICAgICAgICAgICAtIE51bGwgdGVybWluYXRlZCBpbnB1dCBzdHJpbmcKKyAqICAgICAgICAgICAgICBmbGFncyAgICAgICAgICAgICAgICAgICAtIENvbnZlcnNpb24gaW5mbworICoKKyAqIFJFVFVSTjogICAgICA2NC1iaXQgY29udmVydGVkIGludGVnZXIKKyAqCisgKiBERVNDUklQVElPTjogUGVyZm9ybXMgYSBiYXNlIDEwIGNvbnZlcnNpb24gb2YgdGhlIGlucHV0IHN0cmluZyB0byBhbgorICogICAgICAgICAgICAgIGludGVnZXIgdmFsdWUsIGVpdGhlciAzMiBvciA2NCBiaXRzLgorICogICAgICAgICAgICAgIE5vdGU6IFN0cmluZyBtdXN0IGJlIHZhbGlkIGFuZCBub24tbnVsbC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdTY0IGFjcGlfdXRfc3RydG91bF9iYXNlMTAoY2hhciAqc3RyaW5nLCB1MzIgZmxhZ3MpCit7CisJaW50IGFzY2lpX2RpZ2l0OworCXU2NCBuZXh0X3ZhbHVlOworCXU2NCByZXR1cm5fdmFsdWUgPSAwOworCisJLyogTWFpbiBsb29wOiBjb252ZXJ0IGVhY2ggQVNDSUkgYnl0ZSBpbiB0aGUgaW5wdXQgc3RyaW5nICovCisKKwl3aGlsZSAoKnN0cmluZykgeworCQlhc2NpaV9kaWdpdCA9ICpzdHJpbmc7CisJCWlmICghaXNkaWdpdChhc2NpaV9kaWdpdCkpIHsKKworCQkJLyogTm90IEFTQ0lJIDAtOSwgdGVybWluYXRlICovCisKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCS8qIENvbnZlcnQgYW5kIGluc2VydCAoYWRkKSB0aGUgZGVjaW1hbCBkaWdpdCAqLworCisJCW5leHRfdmFsdWUgPQorCQkgICAgKHJldHVybl92YWx1ZSAqIDEwKSArIChhc2NpaV9kaWdpdCAtIEFDUElfQVNDSUlfWkVSTyk7CisKKwkJLyogQ2hlY2sgZm9yIG92ZXJmbG93ICgzMiBvciA2NCBiaXQpIC0gcmV0dXJuIGN1cnJlbnQgY29udmVydGVkIHZhbHVlICovCisKKwkJaWYgKCgoZmxhZ3MgJiBBQ1BJX1NUUlRPVUxfMzJCSVQpICYmIChuZXh0X3ZhbHVlID4gQUNQSV9VSU5UMzJfTUFYKSkgfHwgKG5leHRfdmFsdWUgPCByZXR1cm5fdmFsdWUpKSB7CS8qIDY0LWJpdCBvdmVyZmxvdyBjYXNlICovCisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQlyZXR1cm5fdmFsdWUgPSBuZXh0X3ZhbHVlOworCQlzdHJpbmcrKzsKKwl9CisKK2V4aXQ6CisJcmV0dXJuIChyZXR1cm5fdmFsdWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3N0cnRvdWxfYmFzZTE2CisgKgorICogUEFSQU1FVEVSUzogIHN0cmluZyAgICAgICAgICAgICAgICAgIC0gTnVsbCB0ZXJtaW5hdGVkIGlucHV0IHN0cmluZworICogICAgICAgICAgICAgIGZsYWdzICAgICAgICAgICAgICAgICAgIC0gY29udmVyc2lvbiBpbmZvCisgKgorICogUkVUVVJOOiAgICAgIDY0LWJpdCBjb252ZXJ0ZWQgaW50ZWdlcgorICoKKyAqIERFU0NSSVBUSU9OOiBQZXJmb3JtcyBhIGJhc2UgMTYgY29udmVyc2lvbiBvZiB0aGUgaW5wdXQgc3RyaW5nIHRvIGFuCisgKiAgICAgICAgICAgICAgaW50ZWdlciB2YWx1ZSwgZWl0aGVyIDMyIG9yIDY0IGJpdHMuCisgKiAgICAgICAgICAgICAgTm90ZTogU3RyaW5nIG11c3QgYmUgdmFsaWQgYW5kIG5vbi1udWxsLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1NjQgYWNwaV91dF9zdHJ0b3VsX2Jhc2UxNihjaGFyICpzdHJpbmcsIHUzMiBmbGFncykKK3sKKwlpbnQgYXNjaWlfZGlnaXQ7CisJdTMyIHZhbGlkX2RpZ2l0cyA9IDE7CisJdTY0IHJldHVybl92YWx1ZSA9IDA7CisKKwkvKiBNYWluIGxvb3A6IGNvbnZlcnQgZWFjaCBBU0NJSSBieXRlIGluIHRoZSBpbnB1dCBzdHJpbmcgKi8KKworCXdoaWxlICgqc3RyaW5nKSB7CisKKwkJLyogQ2hlY2sgZm9yIG92ZXJmbG93ICgzMiBvciA2NCBiaXQpIC0gcmV0dXJuIGN1cnJlbnQgY29udmVydGVkIHZhbHVlICovCisKKwkJaWYgKCh2YWxpZF9kaWdpdHMgPiAxNikgfHwKKwkJICAgICgodmFsaWRfZGlnaXRzID4gOCkgJiYgKGZsYWdzICYgQUNQSV9TVFJUT1VMXzMyQklUKSkpIHsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCWFzY2lpX2RpZ2l0ID0gKnN0cmluZzsKKwkJaWYgKCFpc3hkaWdpdChhc2NpaV9kaWdpdCkpIHsKKworCQkJLyogTm90IEhleCBBU0NJSSBBLUYsIGEtZiwgb3IgMC05LCB0ZXJtaW5hdGUgKi8KKworCQkJZ290byBleGl0OworCQl9CisKKwkJLyogQ29udmVydCBhbmQgaW5zZXJ0IHRoZSBoZXggZGlnaXQgKi8KKworCQlyZXR1cm5fdmFsdWUgPQorCQkgICAgKHJldHVybl92YWx1ZSA8PCA0KSB8CisJCSAgICBhY3BpX3V0X2FzY2lpX2NoYXJfdG9faGV4KGFzY2lpX2RpZ2l0KTsKKworCQlzdHJpbmcrKzsKKwkJdmFsaWRfZGlnaXRzKys7CisJfQorCitleGl0OgorCXJldHVybiAocmV0dXJuX3ZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR0cmFjay5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHRyYWNrLmMKaW5kZXggMGRmMDdkZi4uZGYzMWQ3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dHRyYWNrLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHRyYWNrLmMKQEAgLTk1LDEzICs5NSwxMSBAQAogewogCXN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICpjYWNoZTsKIAotCWNhY2hlID0gYWNwaV9vc19hbGxvY2F0ZShzaXplb2Yoc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QpKTsKKwljYWNoZSA9IGFjcGlfb3NfYWxsb2NhdGVfemVyb2VkKHNpemVvZihzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCkpOwogCWlmICghY2FjaGUpIHsKIAkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwogCX0KIAotCW1lbXNldChjYWNoZSwgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX21lbW9yeV9saXN0KSk7Ci0KIAljYWNoZS0+bGlzdF9uYW1lID0gbGlzdF9uYW1lOwogCWNhY2hlLT5vYmplY3Rfc2l6ZSA9IG9iamVjdF9zaXplOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0eGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmFjZS5jCmluZGV4IGQ5ZTZhYWMuLmVjNTAzYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmFjZS5jCkBAIC02MSw3ICs2MSw3IEBACiAgKiBERVNDUklQVElPTjogU2h1dGRvd24gdGhlIEFDUElDQSBzdWJzeXN0ZW0gYW5kIHJlbGVhc2UgYWxsIHJlc291cmNlcy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfdGVybWluYXRlKHZvaWQpCithY3BpX3N0YXR1cyBBQ1BJX0lOSVRfRlVOQ1RJT04gYWNwaV90ZXJtaW5hdGUodm9pZCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmluaXQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmluaXQuYwppbmRleCA3NWI1ZjI3Li5hNWNhMGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0eGZpbml0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHhmaW5pdC5jCkBAIC02OSw3ICs2OSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0odm9pZCkKK2FjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTiBhY3BpX2luaXRpYWxpemVfc3Vic3lzdGVtKHZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCkBAIC0xNDEsNyArMTQxLDcgQEAKICAqICAgICAgICAgICAgICBQdXRzIHN5c3RlbSBpbnRvIEFDUEkgbW9kZSBpZiBpdCBpc24ndCBhbHJlYWR5LgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBfX2luaXQgYWNwaV9lbmFibGVfc3Vic3lzdGVtKHUzMiBmbGFncykKK2FjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTiBhY3BpX2VuYWJsZV9zdWJzeXN0ZW0odTMyIGZsYWdzKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCkBAIC0yMzksNyArMjM5LDcgQEAKICAqICAgICAgICAgICAgICBvYmplY3RzIGFuZCBleGVjdXRpbmcgQU1MIGNvZGUgZm9yIFJlZ2lvbnMsIGJ1ZmZlcnMsIGV0Yy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfaW5pdGlhbGl6ZV9vYmplY3RzKHUzMiBmbGFncykKK2FjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTiBhY3BpX2luaXRpYWxpemVfb2JqZWN0cyh1MzIgZmxhZ3MpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKQEAgLTI2NSw3ICsyNjUsOCBAQAogCSAqIGFsbCBvZiB0aGUgdGFibGVzIGhhdmUgYmVlbiBsb2FkZWQuIEl0IGlzIGEgbGVnYWN5IG9wdGlvbiBhbmQgaXMKIAkgKiBub3QgY29tcGF0aWJsZSB3aXRoIG90aGVyIEFDUEkgaW1wbGVtZW50YXRpb25zLiBTZWUgYWNwaV9uc19sb2FkX3RhYmxlLgogCSAqLwotCWlmIChhY3BpX2dibF9ncm91cF9tb2R1bGVfbGV2ZWxfY29kZSkgeworCWlmICghYWNwaV9nYmxfcGFyc2VfdGFibGVfYXNfdGVybV9saXN0CisJICAgICYmIGFjcGlfZ2JsX2dyb3VwX21vZHVsZV9sZXZlbF9jb2RlKSB7CiAJCWFjcGlfbnNfZXhlY19tb2R1bGVfY29kZV9saXN0KCk7CiAKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcm02NC9LY29uZmlnIGIvZHJpdmVycy9hY3BpL2FybTY0L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYxNmRhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hcm02NC9LY29uZmlnCkBAIC0wLDAgKzEsNiBAQAorIworIyBBQ1BJIENvbmZpZ3VyYXRpb24gZm9yIEFSTTY0CisjCisKK2NvbmZpZyBBQ1BJX0lPUlQKKwlib29sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXJtNjQvTWFrZWZpbGUgYi9kcml2ZXJzL2FjcGkvYXJtNjQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzMzFmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hcm02NC9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmotJChDT05GSUdfQUNQSV9JT1JUKSAJKz0gaW9ydC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXJtNjQvaW9ydC5jIGIvZHJpdmVycy9hY3BpL2FybTY0L2lvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjgxNzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FybTY0L2lvcnQuYwpAQCAtMCwwICsxLDM2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiwgU2VtaWhhbGYKKyAqCUF1dGhvcjogVG9tYXN6IE5vd2lja2kgPHRuQHNlbWloYWxmLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogVGhpcyBmaWxlIGltcGxlbWVudHMgZWFybHkgZGV0ZWN0aW9uL3BhcnNpbmcgb2YgSS9PIG1hcHBpbmcKKyAqIHJlcG9ydGVkIHRvIE9TIHRocm91Z2ggZmlybXdhcmUgdmlhIEkvTyBSZW1hcHBpbmcgVGFibGUgKElPUlQpCisgKiBJT1JUIGRvY3VtZW50IG51bWJlcjogQVJNIERFTiAwMDQ5QQorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkJIkFDUEk6IElPUlQ6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9hY3BpX2lvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworc3RydWN0IGlvcnRfaXRzX21zaV9jaGlwIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IGZ3bm9kZV9oYW5kbGUJKmZ3X25vZGU7CisJdTMyCQkJdHJhbnNsYXRpb25faWQ7Cit9OworCit0eXBlZGVmIGFjcGlfc3RhdHVzICgqaW9ydF9maW5kX25vZGVfY2FsbGJhY2spCisJKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9kZSwgdm9pZCAqY29udGV4dCk7CisKKy8qIFJvb3QgcG9pbnRlciB0byB0aGUgbWFwcGVkIElPUlQgdGFibGUgKi8KK3N0YXRpYyBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmlvcnRfdGFibGU7CisKK3N0YXRpYyBMSVNUX0hFQUQoaW9ydF9tc2lfY2hpcF9saXN0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW9ydF9tc2lfY2hpcF9sb2NrKTsKKworLyoqCisgKiBpb3J0X3JlZ2lzdGVyX2RvbWFpbl90b2tlbigpIC0gcmVnaXN0ZXIgZG9tYWluIHRva2VuIGFuZCByZWxhdGVkIElUUyBJRAorICogdG8gdGhlIGxpc3QgZnJvbSB3aGVyZSB3ZSBjYW4gZ2V0IGl0IGJhY2sgbGF0ZXIgb24uCisgKiBAdHJhbnNfaWQ6IElUUyBJRC4KKyAqIEBmd19ub2RlOiBEb21haW4gdG9rZW4uCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIGlmIG5vIG1lbW9yeSB3aGVuIGFsbG9jYXRpbmcgbGlzdCBlbGVtZW50CisgKi8KK2ludCBpb3J0X3JlZ2lzdGVyX2RvbWFpbl90b2tlbihpbnQgdHJhbnNfaWQsIHN0cnVjdCBmd25vZGVfaGFuZGxlICpmd19ub2RlKQoreworCXN0cnVjdCBpb3J0X2l0c19tc2lfY2hpcCAqaXRzX21zaV9jaGlwOworCisJaXRzX21zaV9jaGlwID0ga3phbGxvYyhzaXplb2YoKml0c19tc2lfY2hpcCksIEdGUF9LRVJORUwpOworCWlmICghaXRzX21zaV9jaGlwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWl0c19tc2lfY2hpcC0+Zndfbm9kZSA9IGZ3X25vZGU7CisJaXRzX21zaV9jaGlwLT50cmFuc2xhdGlvbl9pZCA9IHRyYW5zX2lkOworCisJc3Bpbl9sb2NrKCZpb3J0X21zaV9jaGlwX2xvY2spOworCWxpc3RfYWRkKCZpdHNfbXNpX2NoaXAtPmxpc3QsICZpb3J0X21zaV9jaGlwX2xpc3QpOworCXNwaW5fdW5sb2NrKCZpb3J0X21zaV9jaGlwX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW9ydF9kZXJlZ2lzdGVyX2RvbWFpbl90b2tlbigpIC0gRGVyZWdpc3RlciBkb21haW4gdG9rZW4gYmFzZWQgb24gSVRTIElECisgKiBAdHJhbnNfaWQ6IElUUyBJRC4KKyAqCisgKiBSZXR1cm5zOiBub25lLgorICovCit2b2lkIGlvcnRfZGVyZWdpc3Rlcl9kb21haW5fdG9rZW4oaW50IHRyYW5zX2lkKQoreworCXN0cnVjdCBpb3J0X2l0c19tc2lfY2hpcCAqaXRzX21zaV9jaGlwLCAqdDsKKworCXNwaW5fbG9jaygmaW9ydF9tc2lfY2hpcF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXRzX21zaV9jaGlwLCB0LCAmaW9ydF9tc2lfY2hpcF9saXN0LCBsaXN0KSB7CisJCWlmIChpdHNfbXNpX2NoaXAtPnRyYW5zbGF0aW9uX2lkID09IHRyYW5zX2lkKSB7CisJCQlsaXN0X2RlbCgmaXRzX21zaV9jaGlwLT5saXN0KTsKKwkJCWtmcmVlKGl0c19tc2lfY2hpcCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmaW9ydF9tc2lfY2hpcF9sb2NrKTsKK30KKworLyoqCisgKiBpb3J0X2ZpbmRfZG9tYWluX3Rva2VuKCkgLSBGaW5kIGRvbWFpbiB0b2tlbiBiYXNlZCBvbiBnaXZlbiBJVFMgSUQKKyAqIEB0cmFuc19pZDogSVRTIElELgorICoKKyAqIFJldHVybnM6IGRvbWFpbiB0b2tlbiB3aGVuIGZpbmQgb24gdGhlIGxpc3QsIE5VTEwgb3RoZXJ3aXNlCisgKi8KK3N0cnVjdCBmd25vZGVfaGFuZGxlICppb3J0X2ZpbmRfZG9tYWluX3Rva2VuKGludCB0cmFuc19pZCkKK3sKKwlzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndfbm9kZSA9IE5VTEw7CisJc3RydWN0IGlvcnRfaXRzX21zaV9jaGlwICppdHNfbXNpX2NoaXA7CisKKwlzcGluX2xvY2soJmlvcnRfbXNpX2NoaXBfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpdHNfbXNpX2NoaXAsICZpb3J0X21zaV9jaGlwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGl0c19tc2lfY2hpcC0+dHJhbnNsYXRpb25faWQgPT0gdHJhbnNfaWQpIHsKKwkJCWZ3X25vZGUgPSBpdHNfbXNpX2NoaXAtPmZ3X25vZGU7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmaW9ydF9tc2lfY2hpcF9sb2NrKTsKKworCXJldHVybiBmd19ub2RlOworfQorCitzdGF0aWMgc3RydWN0IGFjcGlfaW9ydF9ub2RlICppb3J0X3NjYW5fbm9kZShlbnVtIGFjcGlfaW9ydF9ub2RlX3R5cGUgdHlwZSwKKwkJCQkJICAgICBpb3J0X2ZpbmRfbm9kZV9jYWxsYmFjayBjYWxsYmFjaywKKwkJCQkJICAgICB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqaW9ydF9ub2RlLCAqaW9ydF9lbmQ7CisJc3RydWN0IGFjcGlfdGFibGVfaW9ydCAqaW9ydDsKKwlpbnQgaTsKKworCWlmICghaW9ydF90YWJsZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBHZXQgdGhlIGZpcnN0IElPUlQgbm9kZSAqLworCWlvcnQgPSAoc3RydWN0IGFjcGlfdGFibGVfaW9ydCAqKWlvcnRfdGFibGU7CisJaW9ydF9ub2RlID0gQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSwgaW9ydCwKKwkJCQkgaW9ydC0+bm9kZV9vZmZzZXQpOworCWlvcnRfZW5kID0gQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSwgaW9ydF90YWJsZSwKKwkJCQlpb3J0X3RhYmxlLT5sZW5ndGgpOworCisJZm9yIChpID0gMDsgaSA8IGlvcnQtPm5vZGVfY291bnQ7IGkrKykgeworCQlpZiAoV0FSTl9UQUlOVChpb3J0X25vZGUgPj0gaW9ydF9lbmQsIFRBSU5UX0ZJUk1XQVJFX1dPUktBUk9VTkQsCisJCQkgICAgICAgIklPUlQgbm9kZSBwb2ludGVyIG92ZXJmbG93cywgYmFkIHRhYmxlIVxuIikpCisJCQlyZXR1cm4gTlVMTDsKKworCQlpZiAoaW9ydF9ub2RlLT50eXBlID09IHR5cGUgJiYKKwkJICAgIEFDUElfU1VDQ0VTUyhjYWxsYmFjayhpb3J0X25vZGUsIGNvbnRleHQpKSkKKwkJCQlyZXR1cm4gaW9ydF9ub2RlOworCisJCWlvcnRfbm9kZSA9IEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9pb3J0X25vZGUsIGlvcnRfbm9kZSwKKwkJCQkJIGlvcnRfbm9kZS0+bGVuZ3RoKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIGlvcnRfbWF0Y2hfbm9kZV9jYWxsYmFjayhzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKm5vZGUsCisJCQkJCSAgICB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRleHQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJaWYgKG5vZGUtPnR5cGUgPT0gQUNQSV9JT1JUX05PREVfTkFNRURfQ09NUE9ORU5UKSB7CisJCXN0cnVjdCBhY3BpX2J1ZmZlciBidWYgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IHRvX2FjcGlfZGV2aWNlX25vZGUoZGV2LT5md25vZGUpOworCQlzdHJ1Y3QgYWNwaV9pb3J0X25hbWVkX2NvbXBvbmVudCAqbmNvbXA7CisKKwkJaWYgKCFhZGV2KSB7CisJCQlzdGF0dXMgPSBBRV9OT1RfRk9VTkQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXN0YXR1cyA9IGFjcGlfZ2V0X25hbWUoYWRldi0+aGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWYpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWRldl93YXJuKGRldiwgIkNhbid0IGdldCBkZXZpY2UgZnVsbCBwYXRoIG5hbWVcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQluY29tcCA9IChzdHJ1Y3QgYWNwaV9pb3J0X25hbWVkX2NvbXBvbmVudCAqKW5vZGUtPm5vZGVfZGF0YTsKKwkJc3RhdHVzID0gIXN0cmNtcChuY29tcC0+ZGV2aWNlX25hbWUsIGJ1Zi5wb2ludGVyKSA/CisJCQkJCQkJQUVfT0sgOiBBRV9OT1RfRk9VTkQ7CisJCWFjcGlfb3NfZnJlZShidWYucG9pbnRlcik7CisJfSBlbHNlIGlmIChub2RlLT50eXBlID09IEFDUElfSU9SVF9OT0RFX1BDSV9ST09UX0NPTVBMRVgpIHsKKwkJc3RydWN0IGFjcGlfaW9ydF9yb290X2NvbXBsZXggKnBjaV9yYzsKKwkJc3RydWN0IHBjaV9idXMgKmJ1czsKKworCQlidXMgPSB0b19wY2lfYnVzKGRldik7CisJCXBjaV9yYyA9IChzdHJ1Y3QgYWNwaV9pb3J0X3Jvb3RfY29tcGxleCAqKW5vZGUtPm5vZGVfZGF0YTsKKworCQkvKgorCQkgKiBJdCBpcyBhc3N1bWVkIHRoYXQgUENJIHNlZ21lbnQgbnVtYmVycyBtYXBzIG9uZS10by1vbmUKKwkJICogd2l0aCByb290IGNvbXBsZXhlcy4gRWFjaCBzZWdtZW50IG51bWJlciBjYW4gcmVwcmVzZW50IG9ubHkKKwkJICogb25lIHJvb3QgY29tcGxleC4KKwkJICovCisJCXN0YXR1cyA9IHBjaV9yYy0+cGNpX3NlZ21lbnRfbnVtYmVyID09IHBjaV9kb21haW5fbnIoYnVzKSA/CisJCQkJCQkJQUVfT0sgOiBBRV9OT1RfRk9VTkQ7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gQUVfTk9UX0ZPVU5EOworCX0KK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGlvcnRfaWRfbWFwKHN0cnVjdCBhY3BpX2lvcnRfaWRfbWFwcGluZyAqbWFwLCB1OCB0eXBlLCB1MzIgcmlkX2luLAorCQkgICAgICAgdTMyICpyaWRfb3V0KQoreworCS8qIFNpbmdsZSBtYXBwaW5nIGRvZXMgbm90IGNhcmUgZm9yIGlucHV0IGlkICovCisJaWYgKG1hcC0+ZmxhZ3MgJiBBQ1BJX0lPUlRfSURfU0lOR0xFX01BUFBJTkcpIHsKKwkJaWYgKHR5cGUgPT0gQUNQSV9JT1JUX05PREVfTkFNRURfQ09NUE9ORU5UIHx8CisJCSAgICB0eXBlID09IEFDUElfSU9SVF9OT0RFX1BDSV9ST09UX0NPTVBMRVgpIHsKKwkJCSpyaWRfb3V0ID0gbWFwLT5vdXRwdXRfYmFzZTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcHJfd2FybihGV19CVUcgIlttYXAgJXBdIFNJTkdMRSBNQVBQSU5HIGZsYWcgbm90IGFsbG93ZWQgZm9yIG5vZGUgdHlwZSAlZCwgc2tpcHBpbmcgSUQgbWFwXG4iLAorCQkJbWFwLCB0eXBlKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlpZiAocmlkX2luIDwgbWFwLT5pbnB1dF9iYXNlIHx8CisJICAgIChyaWRfaW4gPj0gbWFwLT5pbnB1dF9iYXNlICsgbWFwLT5pZF9jb3VudCkpCisJCXJldHVybiAtRU5YSU87CisKKwkqcmlkX291dCA9IG1hcC0+b3V0cHV0X2Jhc2UgKyAocmlkX2luIC0gbWFwLT5pbnB1dF9iYXNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqaW9ydF9ub2RlX21hcF9yaWQoc3RydWN0IGFjcGlfaW9ydF9ub2RlICpub2RlLAorCQkJCQkJdTMyIHJpZF9pbiwgdTMyICpyaWRfb3V0LAorCQkJCQkJdTggdHlwZSkKK3sKKwl1MzIgcmlkID0gcmlkX2luOworCisJLyogUGFyc2UgdGhlIElEIG1hcHBpbmcgdHJlZSB0byBmaW5kIHNwZWNpZmllZCBub2RlIHR5cGUgKi8KKwl3aGlsZSAobm9kZSkgeworCQlzdHJ1Y3QgYWNwaV9pb3J0X2lkX21hcHBpbmcgKm1hcDsKKwkJaW50IGk7CisKKwkJaWYgKG5vZGUtPnR5cGUgPT0gdHlwZSkgeworCQkJaWYgKHJpZF9vdXQpCisJCQkJKnJpZF9vdXQgPSByaWQ7CisJCQlyZXR1cm4gbm9kZTsKKwkJfQorCisJCWlmICghbm9kZS0+bWFwcGluZ19vZmZzZXQgfHwgIW5vZGUtPm1hcHBpbmdfY291bnQpCisJCQlnb3RvIGZhaWxfbWFwOworCisJCW1hcCA9IEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9pb3J0X2lkX21hcHBpbmcsIG5vZGUsCisJCQkJICAgbm9kZS0+bWFwcGluZ19vZmZzZXQpOworCisJCS8qIEZpcm13YXJlIGJ1ZyEgKi8KKwkJaWYgKCFtYXAtPm91dHB1dF9yZWZlcmVuY2UpIHsKKwkJCXByX2VycihGV19CVUcgIltub2RlICVwIHR5cGUgJWRdIElEIG1hcCBoYXMgTlVMTCBwYXJlbnQgcmVmZXJlbmNlXG4iLAorCQkJICAgICAgIG5vZGUsIG5vZGUtPnR5cGUpOworCQkJZ290byBmYWlsX21hcDsKKwkJfQorCisJCS8qIERvIHRoZSBSSUQgdHJhbnNsYXRpb24gKi8KKwkJZm9yIChpID0gMDsgaSA8IG5vZGUtPm1hcHBpbmdfY291bnQ7IGkrKywgbWFwKyspIHsKKwkJCWlmICghaW9ydF9pZF9tYXAobWFwLCBub2RlLT50eXBlLCByaWQsICZyaWQpKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gbm9kZS0+bWFwcGluZ19jb3VudCkKKwkJCWdvdG8gZmFpbF9tYXA7CisKKwkJbm9kZSA9IEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9pb3J0X25vZGUsIGlvcnRfdGFibGUsCisJCQkJICAgIG1hcC0+b3V0cHV0X3JlZmVyZW5jZSk7CisJfQorCitmYWlsX21hcDoKKwkvKiBNYXAgaW5wdXQgUklEIHRvIG91dHB1dCBSSUQgdW5jaGFuZ2VkIG9uIG1hcHBpbmcgZmFpbHVyZSovCisJaWYgKHJpZF9vdXQpCisJCSpyaWRfb3V0ID0gcmlkX2luOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKmlvcnRfZmluZF9kZXZfbm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9idXMgKnBidXM7CisKKwlpZiAoIWRldl9pc19wY2koZGV2KSkKKwkJcmV0dXJuIGlvcnRfc2Nhbl9ub2RlKEFDUElfSU9SVF9OT0RFX05BTUVEX0NPTVBPTkVOVCwKKwkJCQkgICAgICBpb3J0X21hdGNoX25vZGVfY2FsbGJhY2ssIGRldik7CisKKwkvKiBGaW5kIGEgUENJIHJvb3QgYnVzICovCisJcGJ1cyA9IHRvX3BjaV9kZXYoZGV2KS0+YnVzOworCXdoaWxlICghcGNpX2lzX3Jvb3RfYnVzKHBidXMpKQorCQlwYnVzID0gcGJ1cy0+cGFyZW50OworCisJcmV0dXJuIGlvcnRfc2Nhbl9ub2RlKEFDUElfSU9SVF9OT0RFX1BDSV9ST09UX0NPTVBMRVgsCisJCQkgICAgICBpb3J0X21hdGNoX25vZGVfY2FsbGJhY2ssICZwYnVzLT5kZXYpOworfQorCisvKioKKyAqIGlvcnRfbXNpX21hcF9yaWQoKSAtIE1hcCBhIE1TSSByZXF1ZXN0ZXIgSUQgZm9yIGEgZGV2aWNlCisgKiBAZGV2OiBUaGUgZGV2aWNlIGZvciB3aGljaCB0aGUgbWFwcGluZyBpcyB0byBiZSBkb25lLgorICogQHJlcV9pZDogVGhlIGRldmljZSByZXF1ZXN0ZXIgSUQuCisgKgorICogUmV0dXJuczogbWFwcGVkIE1TSSBSSUQgb24gc3VjY2VzcywgaW5wdXQgcmVxdWVzdGVyIElEIG90aGVyd2lzZQorICovCit1MzIgaW9ydF9tc2lfbWFwX3JpZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiByZXFfaWQpCit7CisJc3RydWN0IGFjcGlfaW9ydF9ub2RlICpub2RlOworCXUzMiBkZXZfaWQ7CisKKwlub2RlID0gaW9ydF9maW5kX2Rldl9ub2RlKGRldik7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gcmVxX2lkOworCisJaW9ydF9ub2RlX21hcF9yaWQobm9kZSwgcmVxX2lkLCAmZGV2X2lkLCBBQ1BJX0lPUlRfTk9ERV9JVFNfR1JPVVApOworCXJldHVybiBkZXZfaWQ7Cit9CisKKy8qKgorICogaW9ydF9kZXZfZmluZF9pdHNfaWQoKSAtIEZpbmQgdGhlIElUUyBpZGVudGlmaWVyIGZvciBhIGRldmljZQorICogQGRldjogVGhlIGRldmljZS4KKyAqIEBpZHg6IEluZGV4IG9mIHRoZSBJVFMgaWRlbnRpZmllciBsaXN0LgorICogQGl0c19pZDogSVRTIGlkZW50aWZpZXIuCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCBhcHByb3ByaWF0ZSBlcnJvciB2YWx1ZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBpb3J0X2Rldl9maW5kX2l0c19pZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiByZXFfaWQsCisJCQkJdW5zaWduZWQgaW50IGlkeCwgaW50ICppdHNfaWQpCit7CisJc3RydWN0IGFjcGlfaW9ydF9pdHNfZ3JvdXAgKml0czsKKwlzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKm5vZGU7CisKKwlub2RlID0gaW9ydF9maW5kX2Rldl9ub2RlKGRldik7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gLUVOWElPOworCisJbm9kZSA9IGlvcnRfbm9kZV9tYXBfcmlkKG5vZGUsIHJlcV9pZCwgTlVMTCwgQUNQSV9JT1JUX05PREVfSVRTX0dST1VQKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiAtRU5YSU87CisKKwkvKiBNb3ZlIHRvIElUUyBzcGVjaWZpYyBkYXRhICovCisJaXRzID0gKHN0cnVjdCBhY3BpX2lvcnRfaXRzX2dyb3VwICopbm9kZS0+bm9kZV9kYXRhOworCWlmIChpZHggPiBpdHMtPml0c19jb3VudCkgeworCQlkZXZfZXJyKGRldiwgInJlcXVlc3RlZCBJVFMgSUQgaW5kZXggWyVkXSBpcyBncmVhdGVyIHRoYW4gYXZhaWxhYmxlIFslZF1cbiIsCisJCQlpZHgsIGl0cy0+aXRzX2NvdW50KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkqaXRzX2lkID0gaXRzLT5pZGVudGlmaWVyc1tpZHhdOworCXJldHVybiAwOworfQorCisvKioKKyAqIGlvcnRfZ2V0X2RldmljZV9kb21haW4oKSAtIEZpbmQgTVNJIGRvbWFpbiByZWxhdGVkIHRvIGEgZGV2aWNlCisgKiBAZGV2OiBUaGUgZGV2aWNlLgorICogQHJlcV9pZDogUmVxdWVzdGVyIElEIGZvciB0aGUgZGV2aWNlLgorICoKKyAqIFJldHVybnM6IHRoZSBNU0kgZG9tYWluIGZvciB0aGlzIGRldmljZSwgTlVMTCBvdGhlcndpc2UKKyAqLworc3RydWN0IGlycV9kb21haW4gKmlvcnRfZ2V0X2RldmljZV9kb21haW4oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgcmVxX2lkKQoreworCXN0cnVjdCBmd25vZGVfaGFuZGxlICpoYW5kbGU7CisJaW50IGl0c19pZDsKKworCWlmIChpb3J0X2Rldl9maW5kX2l0c19pZChkZXYsIHJlcV9pZCwgMCwgJml0c19pZCkpCisJCXJldHVybiBOVUxMOworCisJaGFuZGxlID0gaW9ydF9maW5kX2RvbWFpbl90b2tlbihpdHNfaWQpOworCWlmICghaGFuZGxlKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBpcnFfZmluZF9tYXRjaGluZ19md25vZGUoaGFuZGxlLCBET01BSU5fQlVTX1BDSV9NU0kpOworfQorCit2b2lkIF9faW5pdCBhY3BpX2lvcnRfaW5pdCh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfU0lHX0lPUlQsIDAsICZpb3J0X3RhYmxlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgeworCQljb25zdCBjaGFyICptc2cgPSBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gZ2V0IHRhYmxlLCAlc1xuIiwgbXNnKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwppbmRleCBhYjIzNDc5Li45M2VjYWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKQEAgLTczMywxNSArNzMzLDE3IEBACiAJCQlyZXR1cm4gcmVzdWx0OwogCQlhY3BpX2JhdHRlcnlfaW5pdF9hbGFybShiYXR0ZXJ5KTsKIAl9CisKKwlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfZ2V0X3N0YXRlKGJhdHRlcnkpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisJYWNwaV9iYXR0ZXJ5X3F1aXJrcyhiYXR0ZXJ5KTsKKwogCWlmICghYmF0dGVyeS0+YmF0KSB7CiAJCXJlc3VsdCA9IHN5c2ZzX2FkZF9iYXR0ZXJ5KGJhdHRlcnkpOwogCQlpZiAocmVzdWx0KQogCQkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0JcmVzdWx0ID0gYWNwaV9iYXR0ZXJ5X2dldF9zdGF0ZShiYXR0ZXJ5KTsKLQlpZiAocmVzdWx0KQotCQlyZXR1cm4gcmVzdWx0OwotCWFjcGlfYmF0dGVyeV9xdWlya3MoYmF0dGVyeSk7CiAKIAkvKgogCSAqIFdha2V1cCB0aGUgc3lzdGVtIGlmIGJhdHRlcnkgaXMgY3JpdGljYWwgbG93CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYnVzLmMgYi9kcml2ZXJzL2FjcGkvYnVzLmMKaW5kZXggODViN2QwNy4uNTYxOTBkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2J1cy5jCisrKyBiL2RyaXZlcnMvYWNwaS9idXMuYwpAQCAtMzYsNiArMzYsNyBAQAogI2lmZGVmIENPTkZJR19YODYKICNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CiAjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9hY3BpX2lvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxhY3BpL2FwZWkuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KQEAgLTk4NSw3ICs5ODYsOCBAQAogCQlnb3RvIGVycm9yMDsKIAl9CiAKLQlpZiAoYWNwaV9nYmxfZ3JvdXBfbW9kdWxlX2xldmVsX2NvZGUpIHsKKwlpZiAoIWFjcGlfZ2JsX3BhcnNlX3RhYmxlX2FzX3Rlcm1fbGlzdCAmJgorCSAgICBhY3BpX2dibF9ncm91cF9tb2R1bGVfbGV2ZWxfY29kZSkgewogCQlzdGF0dXMgPSBhY3BpX2xvYWRfdGFibGVzKCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWApAQCAtMTA3NCw3ICsxMDc2LDggQEAKIAlzdGF0dXMgPSBhY3BpX2VjX2VjZHRfcHJvYmUoKTsKIAkvKiBJZ25vcmUgcmVzdWx0LiBOb3QgaGF2aW5nIGFuIEVDRFQgaXMgbm90IGZhdGFsLiAqLwogCi0JaWYgKCFhY3BpX2dibF9ncm91cF9tb2R1bGVfbGV2ZWxfY29kZSkgeworCWlmIChhY3BpX2dibF9wYXJzZV90YWJsZV9hc190ZXJtX2xpc3QgfHwKKwkgICAgIWFjcGlfZ2JsX2dyb3VwX21vZHVsZV9sZXZlbF9jb2RlKSB7CiAJCXN0YXR1cyA9IGFjcGlfbG9hZF90YWJsZXMoKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCkBAIC0xMTg2LDYgKzExODksNyBAQAogCX0KIAogCXBjaV9tbWNmZ19sYXRlX2luaXQoKTsKKwlhY3BpX2lvcnRfaW5pdCgpOwogCWFjcGlfc2Nhbl9pbml0KCk7CiAJYWNwaV9lY19pbml0KCk7CiAJYWNwaV9kZWJ1Z2ZzX2luaXQoKTsKQEAgLTExOTMsNiArMTE5Nyw3IEBACiAJYWNwaV93YWtldXBfZGV2aWNlX2luaXQoKTsKIAlhY3BpX2RlYnVnZ2VyX2luaXQoKTsKIAlhY3BpX3NldHVwX3NiX25vdGlmeV9oYW5kbGVyKCk7CisJYWNwaV9zZXRfcHJvY2Vzc29yX21hcHBpbmcoKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2J1dHRvbi5jIGIvZHJpdmVycy9hY3BpL2J1dHRvbi5jCmluZGV4IDMxYWJiMGIuLmUxOWY1MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9idXR0b24uYworKysgYi9kcml2ZXJzL2FjcGkvYnV0dG9uLmMKQEAgLTE5LDYgKzE5LDggQEAKICAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSAiQUNQSSA6IGJ1dHRvbjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTEwNCw2ICsxMDYsOCBAQAogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OwogCWNoYXIgcGh5c1szMl07CQkJLyogZm9yIGlucHV0IGRldmljZSAqLwogCXVuc2lnbmVkIGxvbmcgcHVzaGVkOworCWludCBsYXN0X3N0YXRlOworCWt0aW1lX3QgbGFzdF90aW1lOwogCWJvb2wgc3VzcGVuZGVkOwogfTsKIApAQCAtMTExLDYgKzExNSwxMCBAQAogc3RhdGljIHN0cnVjdCBhY3BpX2RldmljZSAqbGlkX2RldmljZTsKIHN0YXRpYyB1OCBsaWRfaW5pdF9zdGF0ZSA9IEFDUElfQlVUVE9OX0xJRF9JTklUX01FVEhPRDsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgbGlkX3JlcG9ydF9pbnRlcnZhbCBfX3JlYWRfbW9zdGx5ID0gNTAwOworbW9kdWxlX3BhcmFtKGxpZF9yZXBvcnRfaW50ZXJ2YWwsIHVsb25nLCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobGlkX3JlcG9ydF9pbnRlcnZhbCwgIkludGVydmFsIChtcykgYmV0d2VlbiBsaWQga2V5IGV2ZW50cyIpOworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlMgSW50ZXJmYWNlICgvcHJvYykKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMzQsMTAgKzE0Miw3OSBAQAogewogCXN0cnVjdCBhY3BpX2J1dHRvbiAqYnV0dG9uID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCWludCByZXQ7CisJa3RpbWVfdCBuZXh0X3JlcG9ydDsKKwlib29sIGRvX3VwZGF0ZTsKIAotCS8qIGlucHV0IGxheWVyIGNoZWNrcyBpZiBldmVudCBpcyByZWR1bmRhbnQgKi8KLQlpbnB1dF9yZXBvcnRfc3dpdGNoKGJ1dHRvbi0+aW5wdXQsIFNXX0xJRCwgIXN0YXRlKTsKLQlpbnB1dF9zeW5jKGJ1dHRvbi0+aW5wdXQpOworCS8qCisJICogSW4gbGlkX2luaXRfc3RhdGU9aWdub3JlIG1vZGUsIGlmIHVzZXIgb3BlbnMvY2xvc2VzIGxpZAorCSAqIGZyZXF1ZW50bHkgd2l0aCAib3BlbiIgbWlzc2luZywgYW5kICJsYXN0X3RpbWUiIGlzIGFsc28gdXBkYXRlZAorCSAqIGZyZXF1ZW50bHksICJjbG9zZSIgY2Fubm90IGJlIGRlbGl2ZXJlZCB0byB0aGUgdXNlcnNwYWNlLgorCSAqIFNvICJsYXN0X3RpbWUiIGlzIG9ubHkgdXBkYXRlZCBhZnRlciBhIHRpbWVvdXQgb3IgYW4gYWN0dWFsCisJICogc3dpdGNoLgorCSAqLworCWlmIChsaWRfaW5pdF9zdGF0ZSAhPSBBQ1BJX0JVVFRPTl9MSURfSU5JVF9JR05PUkUgfHwKKwkgICAgYnV0dG9uLT5sYXN0X3N0YXRlICE9ICEhc3RhdGUpCisJCWRvX3VwZGF0ZSA9IHRydWU7CisJZWxzZQorCQlkb191cGRhdGUgPSBmYWxzZTsKKworCW5leHRfcmVwb3J0ID0ga3RpbWVfYWRkKGJ1dHRvbi0+bGFzdF90aW1lLAorCQkJCW1zX3RvX2t0aW1lKGxpZF9yZXBvcnRfaW50ZXJ2YWwpKTsKKwlpZiAoYnV0dG9uLT5sYXN0X3N0YXRlID09ICEhc3RhdGUgJiYKKwkgICAga3RpbWVfYWZ0ZXIoa3RpbWVfZ2V0KCksIG5leHRfcmVwb3J0KSkgeworCQkvKiBDb21wbGFpbiB0aGUgYnVnZ3kgZmlybXdhcmUgKi8KKwkJcHJfd2Fybl9vbmNlKCJUaGUgbGlkIGRldmljZSBpcyBub3QgY29tcGxpYW50IHRvIFNXX0xJRC5cbiIpOworCisJCS8qCisJCSAqIFNlbmQgdGhlIHVucmVsaWFibGUgY29tcGxlbWVudCBzd2l0Y2ggZXZlbnQ6CisJCSAqCisJCSAqIE9uIG1vc3QgcGxhdGZvcm1zLCB0aGUgbGlkIGRldmljZSBpcyByZWxpYWJsZS4gSG93ZXZlcgorCQkgKiB0aGVyZSBhcmUgZXhjZXB0aW9uczoKKwkJICogMS4gUGxhdGZvcm1zIHJldHVybmluZyBpbml0aWFsIGxpZCBzdGF0ZSBhcyAiY2xvc2UiIGJ5CisJCSAqICAgIGRlZmF1bHQgYWZ0ZXIgYm9vdGluZy9yZXN1bWluZzoKKwkJICogICAgIGh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODkyMTEKKwkJICogICAgIGh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTA2MTUxCisJCSAqIDIuIFBsYXRmb3JtcyBuZXZlciByZXBvcnRpbmcgIm9wZW4iIGV2ZW50czoKKwkJICogICAgIGh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTA2OTQxCisJCSAqIE9uIHRoZXNlIGJ1Z2d5IHBsYXRmb3JtcywgdGhlIHVzYWdlIG1vZGVsIG9mIHRoZSBBQ1BJCisJCSAqIGxpZCBkZXZpY2UgYWN0dWFsbHkgaXM6CisJCSAqIDEuIFRoZSBpbml0aWFsIHJldHVybmluZyB2YWx1ZSBvZiBfTElEIG1heSBub3QgYmUKKwkJICogICAgcmVsaWFibGUuCisJCSAqIDIuIFRoZSBvcGVuIGV2ZW50IG1heSBub3QgYmUgcmVsaWFibGUuCisJCSAqIDMuIFRoZSBjbG9zZSBldmVudCBpcyByZWxpYWJsZS4KKwkJICoKKwkJICogQnV0IFNXX0xJRCBpcyB0eXBlZCBhcyBpbnB1dCBzd2l0Y2ggZXZlbnQsIHRoZSBpbnB1dAorCQkgKiBsYXllciBjaGVja3MgaWYgdGhlIGV2ZW50IGlzIHJlZHVuZGFudC4gSGVuY2UgaWYgdGhlCisJCSAqIHN0YXRlIGlzIG5vdCBzd2l0Y2hlZCwgdGhlIHVzZXJzcGFjZSBjYW5ub3Qgc2VlIHRoaXMKKwkJICogcGxhdGZvcm0gdHJpZ2dlcmVkIHJlbGlhYmxlIGV2ZW50LiBCeSBpbnNlcnRpbmcgYQorCQkgKiBjb21wbGVtZW50IHN3aXRjaCBldmVudCwgaXQgdGhlbiBpcyBndWFyYW50ZWVkIHRoYXQgdGhlCisJCSAqIHBsYXRmb3JtIHRyaWdnZXJlZCByZWxpYWJsZSBvbmUgY2FuIGFsd2F5cyBiZSBzZWVuIGJ5CisJCSAqIHRoZSB1c2Vyc3BhY2UuCisJCSAqLworCQlpZiAobGlkX2luaXRfc3RhdGUgPT0gQUNQSV9CVVRUT05fTElEX0lOSVRfSUdOT1JFKSB7CisJCQlkb191cGRhdGUgPSB0cnVlOworCQkJLyoKKwkJCSAqIERvIGdlbmVyYXRlIGNvbXBsZW1lbnQgc3dpdGNoIGV2ZW50IGZvciAiY2xvc2UiCisJCQkgKiBhcyAiY2xvc2UiIGlzIHJlbGlhYmxlIGFuZCB3cm9uZyAib3BlbiIgd29uJ3QKKwkJCSAqIHRyaWdnZXIgdW5leHBlY3RlZCBiZWhhdmlvcnMuCisJCQkgKiBEbyBub3QgZ2VuZXJhdGUgY29tcGxlbWVudCBzd2l0Y2ggZXZlbnQgZm9yCisJCQkgKiAib3BlbiIgYXMgIm9wZW4iIGlzIG5vdCByZWxpYWJsZSBhbmQgd3JvbmcKKwkJCSAqICJjbG9zZSIgd2lsbCB0cmlnZ2VyIHVuZXhwZWN0ZWQgYmVoYXZpb3JzLgorCQkJICovCisJCQlpZiAoIXN0YXRlKSB7CisJCQkJaW5wdXRfcmVwb3J0X3N3aXRjaChidXR0b24tPmlucHV0LAorCQkJCQkJICAgIFNXX0xJRCwgc3RhdGUpOworCQkJCWlucHV0X3N5bmMoYnV0dG9uLT5pbnB1dCk7CisJCQl9CisJCX0KKwl9CisJLyogU2VuZCB0aGUgcGxhdGZvcm0gdHJpZ2dlcmVkIHJlbGlhYmxlIGV2ZW50ICovCisJaWYgKGRvX3VwZGF0ZSkgeworCQlpbnB1dF9yZXBvcnRfc3dpdGNoKGJ1dHRvbi0+aW5wdXQsIFNXX0xJRCwgIXN0YXRlKTsKKwkJaW5wdXRfc3luYyhidXR0b24tPmlucHV0KTsKKwkJYnV0dG9uLT5sYXN0X3N0YXRlID0gISFzdGF0ZTsKKwkJYnV0dG9uLT5sYXN0X3RpbWUgPSBrdGltZV9nZXQoKTsKKwl9CiAKIAlpZiAoc3RhdGUpCiAJCXBtX3dha2V1cF9ldmVudCgmZGV2aWNlLT5kZXYsIDApOwpAQCAtNDExLDYgKzQ4OCw4IEBACiAJCXN0cmNweShuYW1lLCBBQ1BJX0JVVFRPTl9ERVZJQ0VfTkFNRV9MSUQpOwogCQlzcHJpbnRmKGNsYXNzLCAiJXMvJXMiLAogCQkJQUNQSV9CVVRUT05fQ0xBU1MsIEFDUElfQlVUVE9OX1NVQkNMQVNTX0xJRCk7CisJCWJ1dHRvbi0+bGFzdF9zdGF0ZSA9ICEhYWNwaV9saWRfZXZhbHVhdGVfc3RhdGUoZGV2aWNlKTsKKwkJYnV0dG9uLT5sYXN0X3RpbWUgPSBrdGltZV9nZXQoKTsKIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJVbnN1cHBvcnRlZCBoaWQgWyVzXVxuIiwgaGlkKTsKIAkJZXJyb3IgPSAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2NwcGNfYWNwaS5jIGIvZHJpdmVycy9hY3BpL2NwcGNfYWNwaS5jCmluZGV4IDJlOTgxNzMuLmQwZDA1MDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9jcHBjX2FjcGkuYworKysgYi9kcml2ZXJzL2FjcGkvY3BwY19hY3BpLmMKQEAgLTQwLDE1ICs0MCw0OCBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAKICNpbmNsdWRlIDxhY3BpL2NwcGNfYWNwaS5oPgotLyoKLSAqIExvY2sgdG8gcHJvdmlkZSBtdXR1YWxseSBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBQQ0MKLSAqIGNoYW5uZWwuIGUuZy4gV2hlbiB0aGUgcmVtb3RlIHVwZGF0ZXMgdGhlIHNoYXJlZCByZWdpb24KLSAqIHdpdGggbmV3IGRhdGEsIHRoZSByZWFkZXIgbmVlZHMgdG8gYmUgcHJvdGVjdGVkIGZyb20KLSAqIG90aGVyIENQVXMgYWN0aXZpdHkgb24gdGhlIHNhbWUgY2hhbm5lbC4KLSAqLwotc3RhdGljIERFRklORV9TUElOTE9DSyhwY2NfbG9jayk7CisKK3N0cnVjdCBjcHBjX3BjY19kYXRhIHsKKwlzdHJ1Y3QgbWJveF9jaGFuICpwY2NfY2hhbm5lbDsKKwl2b2lkIF9faW9tZW0gKnBjY19jb21tX2FkZHI7CisJaW50IHBjY19zdWJzcGFjZV9pZHg7CisJYm9vbCBwY2NfY2hhbm5lbF9hY3F1aXJlZDsKKwlrdGltZV90IGRlYWRsaW5lOworCXVuc2lnbmVkIGludCBwY2NfbXBhciwgcGNjX21ydHQsIHBjY19ub21pbmFsOworCisJYm9vbCBwZW5kaW5nX3BjY193cml0ZV9jbWQ7CS8qIEFueSBwZW5kaW5nL2JhdGNoZWQgUENDIHdyaXRlIGNtZHM/ICovCisJYm9vbCBwbGF0Zm9ybV9vd25zX3BjYzsJCS8qIE93bmVyc2hpcCBvZiBQQ0Mgc3Vic3BhY2UgKi8KKwl1bnNpZ25lZCBpbnQgcGNjX3dyaXRlX2NudDsJLyogUnVubmluZyBjb3VudCBvZiBQQ0Mgd3JpdGUgY29tbWFuZHMgKi8KKworCS8qCisJICogTG9jayB0byBwcm92aWRlIGNvbnRyb2xsZWQgYWNjZXNzIHRvIHRoZSBQQ0MgY2hhbm5lbC4KKwkgKgorCSAqIEZvciBwZXJmb3JtYW5jZSBjcml0aWNhbCB1c2VjYXNlcyhjdXJyZW50bHkgY3BwY19zZXRfcGVyZikKKwkgKglXZSBuZWVkIHRvIHRha2UgcmVhZF9sb2NrIGFuZCBjaGVjayBpZiBjaGFubmVsIGJlbG9uZ3MgdG8gT1NQTQorCSAqIGJlZm9yZSByZWFkaW5nIG9yIHdyaXRpbmcgdG8gUENDIHN1YnNwYWNlCisJICoJV2UgbmVlZCB0byB0YWtlIHdyaXRlX2xvY2sgYmVmb3JlIHRyYW5zZmVycmluZyB0aGUgY2hhbm5lbAorCSAqIG93bmVyc2hpcCB0byB0aGUgcGxhdGZvcm0gdmlhIGEgRG9vcmJlbGwKKwkgKglUaGlzIGFsbG93cyB1cyB0byBiYXRjaCBhIG51bWJlciBvZiBDUFBDIHJlcXVlc3RzIGlmIHRoZXkgaGFwcGVuCisJICogdG8gb3JpZ2luYXRlIGluIGFib3V0IHRoZSBzYW1lIHRpbWUKKwkgKgorCSAqIEZvciBub24tcGVyZm9ybWFuY2UgY3JpdGljYWwgdXNlY2FzZXMoaW5pdCkKKwkgKglUYWtlIHdyaXRlX2xvY2sgZm9yIGFsbCBwdXJwb3NlcyB3aGljaCBnaXZlcyBleGNsdXNpdmUgYWNjZXNzCisJICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZSBwY2NfbG9jazsKKworCS8qIFdhaXQgcXVldWUgZm9yIENQVXMgd2hvc2UgcmVxdWVzdHMgd2VyZSBiYXRjaGVkICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgcGNjX3dyaXRlX3dhaXRfcTsKK307CisKKy8qIFN0cnVjdHVyZSB0byByZXByZXNlbnQgdGhlIHNpbmdsZSBQQ0MgY2hhbm5lbCAqLworc3RhdGljIHN0cnVjdCBjcHBjX3BjY19kYXRhIHBjY19kYXRhID0geworCS5wY2Nfc3Vic3BhY2VfaWR4ID0gLTEsCisJLnBsYXRmb3JtX293bnNfcGNjID0gdHJ1ZSwKK307CiAKIC8qCiAgKiBUaGUgY3BjX2Rlc2Mgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBBQ1BJIHJlZ2lzdGVyIGRldGFpbHMKQEAgLTU5LDE4ICs5MiwyNSBAQAogICovCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwY19kZXNjICosIGNwY19kZXNjX3B0cik7CiAKLS8qIFRoaXMgbGF5ZXIgaGFuZGxlcyBhbGwgdGhlIFBDQyBzcGVjaWZpY3MgZm9yIENQUEMuICovCi1zdGF0aWMgc3RydWN0IG1ib3hfY2hhbiAqcGNjX2NoYW5uZWw7Ci1zdGF0aWMgdm9pZCBfX2lvbWVtICpwY2NfY29tbV9hZGRyOwotc3RhdGljIHU2NCBjb21tX2Jhc2VfYWRkcjsKLXN0YXRpYyBpbnQgcGNjX3N1YnNwYWNlX2lkeCA9IC0xOwotc3RhdGljIGJvb2wgcGNjX2NoYW5uZWxfYWNxdWlyZWQ7Ci1zdGF0aWMga3RpbWVfdCBkZWFkbGluZTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGNjX21wYXIsIHBjY19tcnR0OwotCiAvKiBwY2MgbWFwcGVkIGFkZHJlc3MgKyBoZWFkZXIgc2l6ZSArIG9mZnNldCB3aXRoaW4gUENDIHN1YnNwYWNlICovCi0jZGVmaW5lIEdFVF9QQ0NfVkFERFIob2ZmcykgKHBjY19jb21tX2FkZHIgKyAweDggKyAob2ZmcykpCisjZGVmaW5lIEdFVF9QQ0NfVkFERFIob2ZmcykgKHBjY19kYXRhLnBjY19jb21tX2FkZHIgKyAweDggKyAob2ZmcykpCiAKKy8qIENoZWNrIGlmIGEgQ1BDIHJlZ3NpdGVyIGlzIGluIFBDQyAqLworI2RlZmluZSBDUENfSU5fUENDKGNwYykgKChjcGMpLT50eXBlID09IEFDUElfVFlQRV9CVUZGRVIgJiYJCVwKKwkJCQkoY3BjKS0+Y3BjX2VudHJ5LnJlZy5zcGFjZV9pZCA9PQlcCisJCQkJQUNQSV9BRFJfU1BBQ0VfUExBVEZPUk1fQ09NTSkKKworLyogRXZhbHV0ZXMgdG8gVHJ1ZSBpZiByZWcgaXMgYSBOVUxMIHJlZ2lzdGVyIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgSVNfTlVMTF9SRUcocmVnKSAoKHJlZyktPnNwYWNlX2lkID09ICBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZICYmIFwKKwkJCQkocmVnKS0+YWRkcmVzcyA9PSAwICYmCQkJXAorCQkJCShyZWcpLT5iaXRfd2lkdGggPT0gMCAmJgkJXAorCQkJCShyZWcpLT5iaXRfb2Zmc2V0ID09IDAgJiYJCVwKKwkJCQkocmVnKS0+YWNjZXNzX3dpZHRoID09IDApCisKKy8qIEV2YWx1dGVzIHRvIFRydWUgaWYgYW4gb3B0aW9uYWwgY3BjIGZpZWxkIGlzIHN1cHBvcnRlZCAqLworI2RlZmluZSBDUENfU1VQUE9SVEVEKGNwYykgKChjcGMpLT50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSID8JCVwKKwkJCQkhIShjcGMpLT5jcGNfZW50cnkuaW50X3ZhbHVlIDoJCVwKKwkJCQkhSVNfTlVMTF9SRUcoJihjcGMpLT5jcGNfZW50cnkucmVnKSkKIC8qCiAgKiBBcmJpdHJhcnkgUmV0cmllcyBpbiBjYXNlIHRoZSByZW1vdGUgcHJvY2Vzc29yIGlzIHNsb3cgdG8gcmVzcG9uZAogICogdG8gUENDIGNvbW1hbmRzLiBLZWVwaW5nIGl0IGhpZ2ggZW5vdWdoIHRvIGNvdmVyIGVtdWxhdG9ycyB3aGVyZQpAQCAtNzgsMTEgKzExOCw3OSBAQAogICovCiAjZGVmaW5lIE5VTV9SRVRSSUVTIDUwMAogCi1zdGF0aWMgaW50IGNoZWNrX3BjY19jaGFuKHZvaWQpCitzdHJ1Y3QgY3BwY19hdHRyIHsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKKwlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYywgc3NpemVfdCBjb3VudCk7Cit9OworCisjZGVmaW5lIGRlZmluZV9vbmVfY3BwY19ybyhfbmFtZSkJCVwKK3N0YXRpYyBzdHJ1Y3QgY3BwY19hdHRyIF9uYW1lID0JCQlcCitfX0FUVFIoX25hbWUsIDA0NDQsIHNob3dfIyNfbmFtZSwgTlVMTCkKKworI2RlZmluZSB0b19jcGNfZGVzYyhhKSBjb250YWluZXJfb2YoYSwgc3RydWN0IGNwY19kZXNjLCBrb2JqKQorCitzdGF0aWMgc3NpemVfdCBzaG93X2ZlZWRiYWNrX2N0cnMoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlpbnQgcmV0ID0gLUVJTzsKLQlzdHJ1Y3QgYWNwaV9wY2N0X3NoYXJlZF9tZW1vcnkgX19pb21lbSAqZ2VuZXJpY19jb21tX2Jhc2UgPSBwY2NfY29tbV9hZGRyOwotCWt0aW1lX3QgbmV4dF9kZWFkbGluZSA9IGt0aW1lX2FkZChrdGltZV9nZXQoKSwgZGVhZGxpbmUpOworCXN0cnVjdCBjcGNfZGVzYyAqY3BjX3B0ciA9IHRvX2NwY19kZXNjKGtvYmopOworCXN0cnVjdCBjcHBjX3BlcmZfZmJfY3RycyBmYl9jdHJzID0gezB9OworCisJY3BwY19nZXRfcGVyZl9jdHJzKGNwY19wdHItPmNwdV9pZCwgJmZiX2N0cnMpOworCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgInJlZjolbGx1IGRlbDolbGx1XG4iLAorCQkJZmJfY3Rycy5yZWZlcmVuY2UsIGZiX2N0cnMuZGVsaXZlcmVkKTsKK30KK2RlZmluZV9vbmVfY3BwY19ybyhmZWVkYmFja19jdHJzKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19yZWZlcmVuY2VfcGVyZihzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBjcGNfZGVzYyAqY3BjX3B0ciA9IHRvX2NwY19kZXNjKGtvYmopOworCXN0cnVjdCBjcHBjX3BlcmZfZmJfY3RycyBmYl9jdHJzID0gezB9OworCisJY3BwY19nZXRfcGVyZl9jdHJzKGNwY19wdHItPmNwdV9pZCwgJmZiX2N0cnMpOworCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsbHVcbiIsCisJCQlmYl9jdHJzLnJlZmVyZW5jZV9wZXJmKTsKK30KK2RlZmluZV9vbmVfY3BwY19ybyhyZWZlcmVuY2VfcGVyZik7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfd3JhcGFyb3VuZF90aW1lKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY3BjX2Rlc2MgKmNwY19wdHIgPSB0b19jcGNfZGVzYyhrb2JqKTsKKwlzdHJ1Y3QgY3BwY19wZXJmX2ZiX2N0cnMgZmJfY3RycyA9IHswfTsKKworCWNwcGNfZ2V0X3BlcmZfY3RycyhjcGNfcHRyLT5jcHVfaWQsICZmYl9jdHJzKTsKKworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGx1XG4iLCBmYl9jdHJzLmN0cl93cmFwX3RpbWUpOworCit9CitkZWZpbmVfb25lX2NwcGNfcm8od3JhcGFyb3VuZF90aW1lKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNwcGNfYXR0cnNbXSA9IHsKKwkmZmVlZGJhY2tfY3Rycy5hdHRyLAorCSZyZWZlcmVuY2VfcGVyZi5hdHRyLAorCSZ3cmFwYXJvdW5kX3RpbWUuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBjcHBjX2t0eXBlID0geworCS5zeXNmc19vcHMgPSAma29ial9zeXNmc19vcHMsCisJLmRlZmF1bHRfYXR0cnMgPSBjcHBjX2F0dHJzLAorfTsKKworc3RhdGljIGludCBjaGVja19wY2NfY2hhbihib29sIGNoa19lcnJfYml0KQoreworCWludCByZXQgPSAtRUlPLCBzdGF0dXMgPSAwOworCXN0cnVjdCBhY3BpX3BjY3Rfc2hhcmVkX21lbW9yeSBfX2lvbWVtICpnZW5lcmljX2NvbW1fYmFzZSA9IHBjY19kYXRhLnBjY19jb21tX2FkZHI7CisJa3RpbWVfdCBuZXh0X2RlYWRsaW5lID0ga3RpbWVfYWRkKGt0aW1lX2dldCgpLCBwY2NfZGF0YS5kZWFkbGluZSk7CisKKwlpZiAoIXBjY19kYXRhLnBsYXRmb3JtX293bnNfcGNjKQorCQlyZXR1cm4gMDsKIAogCS8qIFJldHJ5IGluIGNhc2UgdGhlIHJlbW90ZSBwcm9jZXNzb3Igd2FzIHRvbyBzbG93IHRvIGNhdGNoIHVwLiAqLwogCXdoaWxlICgha3RpbWVfYWZ0ZXIoa3RpbWVfZ2V0KCksIG5leHRfZGVhZGxpbmUpKSB7CkBAIC05MSw4ICsxOTksMTEgQEAKIAkJICogcGxhdGZvcm0gYW5kIHNob3VsZCBoYXZlIHNldCB0aGUgY29tbWFuZCBjb21wbGV0aW9uIGJpdCB3aGVuCiAJCSAqIFBDQyBjYW4gYmUgdXNlZCBieSBPU1BNCiAJCSAqLwotCQlpZiAocmVhZHdfcmVsYXhlZCgmZ2VuZXJpY19jb21tX2Jhc2UtPnN0YXR1cykgJiBQQ0NfQ01EX0NPTVBMRVRFKSB7CisJCXN0YXR1cyA9IHJlYWR3X3JlbGF4ZWQoJmdlbmVyaWNfY29tbV9iYXNlLT5zdGF0dXMpOworCQlpZiAoc3RhdHVzICYgUENDX0NNRF9DT01QTEVURV9NQVNLKSB7CiAJCQlyZXQgPSAwOworCQkJaWYgKGNoa19lcnJfYml0ICYmIChzdGF0dXMgJiBQQ0NfRVJST1JfTUFTSykpCisJCQkJcmV0ID0gLUVJTzsKIAkJCWJyZWFrOwogCQl9CiAJCS8qCkBAIC0xMDIsMTQgKzIxMywyMyBAQAogCQl1ZGVsYXkoMyk7CiAJfQogCisJaWYgKGxpa2VseSghcmV0KSkKKwkJcGNjX2RhdGEucGxhdGZvcm1fb3duc19wY2MgPSBmYWxzZTsKKwllbHNlCisJCXByX2VycigiUENDIGNoZWNrIGNoYW5uZWwgZmFpbGVkLiBTdGF0dXM9JXhcbiIsIHN0YXR1cyk7CisKIAlyZXR1cm4gcmV0OwogfQogCisvKgorICogVGhpcyBmdW5jdGlvbiB0cmFuc2ZlcnMgdGhlIG93bmVyc2hpcCBvZiB0aGUgUENDIHRvIHRoZSBwbGF0Zm9ybQorICogU28gaXQgbXVzdCBiZSBjYWxsZWQgd2hpbGUgaG9sZGluZyB3cml0ZV9sb2NrKHBjY19sb2NrKQorICovCiBzdGF0aWMgaW50IHNlbmRfcGNjX2NtZCh1MTYgY21kKQogewotCWludCByZXQgPSAtRUlPOworCWludCByZXQgPSAtRUlPLCBpOwogCXN0cnVjdCBhY3BpX3BjY3Rfc2hhcmVkX21lbW9yeSAqZ2VuZXJpY19jb21tX2Jhc2UgPQotCQkoc3RydWN0IGFjcGlfcGNjdF9zaGFyZWRfbWVtb3J5ICopIHBjY19jb21tX2FkZHI7CisJCShzdHJ1Y3QgYWNwaV9wY2N0X3NoYXJlZF9tZW1vcnkgKikgcGNjX2RhdGEucGNjX2NvbW1fYWRkcjsKIAlzdGF0aWMga3RpbWVfdCBsYXN0X2NtZF9jbXBsX3RpbWUsIGxhc3RfbXBhcl9yZXNldDsKIAlzdGF0aWMgaW50IG1wYXJfY291bnQ7CiAJdW5zaWduZWQgaW50IHRpbWVfZGVsdGE7CkBAIC0xMTksMjAgKzIzOSwyOSBAQAogCSAqIHRoZSBjaGFubmVsIGJlZm9yZSB3cml0aW5nIHRvIFBDQyBzcGFjZQogCSAqLwogCWlmIChjbWQgPT0gQ01EX1JFQUQpIHsKLQkJcmV0ID0gY2hlY2tfcGNjX2NoYW4oKTsKKwkJLyoKKwkJICogSWYgdGhlcmUgYXJlIHBlbmRpbmcgY3BjX3dyaXRlcywgdGhlbiB3ZSBzdG9sZSB0aGUgY2hhbm5lbAorCQkgKiBiZWZvcmUgd3JpdGUgY29tcGxldGlvbiwgc28gZmlyc3Qgc2VuZCBhIFdSSVRFIGNvbW1hbmQgdG8KKwkJICogcGxhdGZvcm0KKwkJICovCisJCWlmIChwY2NfZGF0YS5wZW5kaW5nX3BjY193cml0ZV9jbWQpCisJCQlzZW5kX3BjY19jbWQoQ01EX1dSSVRFKTsKKworCQlyZXQgPSBjaGVja19wY2NfY2hhbihmYWxzZSk7CiAJCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KKwkJCWdvdG8gZW5kOworCX0gZWxzZSAvKiBDTURfV1JJVEUgKi8KKwkJcGNjX2RhdGEucGVuZGluZ19wY2Nfd3JpdGVfY21kID0gRkFMU0U7CiAKIAkvKgogCSAqIEhhbmRsZSB0aGUgTWluaW11bSBSZXF1ZXN0IFR1cm5hcm91bmQgVGltZShNUlRUKQogCSAqICJUaGUgbWluaW11bSBhbW91bnQgb2YgdGltZSB0aGF0IE9TUE0gbXVzdCB3YWl0IGFmdGVyIHRoZSBjb21wbGV0aW9uCiAJICogb2YgYSBjb21tYW5kIGJlZm9yZSBpc3N1aW5nIHRoZSBuZXh0IGNvbW1hbmQsIGluIG1pY3Jvc2Vjb25kcyIKIAkgKi8KLQlpZiAocGNjX21ydHQpIHsKKwlpZiAocGNjX2RhdGEucGNjX21ydHQpIHsKIAkJdGltZV9kZWx0YSA9IGt0aW1lX3VzX2RlbHRhKGt0aW1lX2dldCgpLCBsYXN0X2NtZF9jbXBsX3RpbWUpOwotCQlpZiAocGNjX21ydHQgPiB0aW1lX2RlbHRhKQotCQkJdWRlbGF5KHBjY19tcnR0IC0gdGltZV9kZWx0YSk7CisJCWlmIChwY2NfZGF0YS5wY2NfbXJ0dCA+IHRpbWVfZGVsdGEpCisJCQl1ZGVsYXkocGNjX2RhdGEucGNjX21ydHQgLSB0aW1lX2RlbHRhKTsKIAl9CiAKIAkvKgpAQCAtMTQ2LDE1ICsyNzUsMTYgQEAKIAkgKiBub3Qgc2VuZCB0aGUgcmVxdWVzdCB0byB0aGUgcGxhdGZvcm0gYWZ0ZXIgaGl0dGluZyB0aGUgTVBBUiBsaW1pdCBpbgogCSAqIGFueSA2MHMgd2luZG93CiAJICovCi0JaWYgKHBjY19tcGFyKSB7CisJaWYgKHBjY19kYXRhLnBjY19tcGFyKSB7CiAJCWlmIChtcGFyX2NvdW50ID09IDApIHsKIAkJCXRpbWVfZGVsdGEgPSBrdGltZV9tc19kZWx0YShrdGltZV9nZXQoKSwgbGFzdF9tcGFyX3Jlc2V0KTsKIAkJCWlmICh0aW1lX2RlbHRhIDwgNjAgKiBNU0VDX1BFUl9TRUMpIHsKIAkJCQlwcl9kZWJ1ZygiUENDIGNtZCBub3Qgc2VudCBkdWUgdG8gTVBBUiBsaW1pdCIpOwotCQkJCXJldHVybiAtRUlPOworCQkJCXJldCA9IC1FSU87CisJCQkJZ290byBlbmQ7CiAJCQl9CiAJCQlsYXN0X21wYXJfcmVzZXQgPSBrdGltZV9nZXQoKTsKLQkJCW1wYXJfY291bnQgPSBwY2NfbXBhcjsKKwkJCW1wYXJfY291bnQgPSBwY2NfZGF0YS5wY2NfbXBhcjsKIAkJfQogCQltcGFyX2NvdW50LS07CiAJfQpAQCAtMTY1LDMzICsyOTUsNDMgQEAKIAkvKiBGbGlwIENNRCBDT01QTEVURSBiaXQgKi8KIAl3cml0ZXdfcmVsYXhlZCgwLCAmZ2VuZXJpY19jb21tX2Jhc2UtPnN0YXR1cyk7CiAKKwlwY2NfZGF0YS5wbGF0Zm9ybV9vd25zX3BjYyA9IHRydWU7CisKIAkvKiBSaW5nIGRvb3JiZWxsICovCi0JcmV0ID0gbWJveF9zZW5kX21lc3NhZ2UocGNjX2NoYW5uZWwsICZjbWQpOworCXJldCA9IG1ib3hfc2VuZF9tZXNzYWdlKHBjY19kYXRhLnBjY19jaGFubmVsLCAmY21kKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcl9lcnIoIkVyciBzZW5kaW5nIFBDQyBtYm94IG1lc3NhZ2UuIGNtZDolZCwgcmV0OiVkXG4iLAogCQkJCWNtZCwgcmV0KTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlbmQ7CiAJfQogCi0JLyoKLQkgKiBGb3IgUkVBRHMgd2UgbmVlZCB0byBlbnN1cmUgdGhlIGNtZCBjb21wbGV0ZWQgdG8gZW5zdXJlCi0JICogdGhlIGVuc3VpbmcgcmVhZCgpcyBjYW4gcHJvY2VlZC4gRm9yIFdSSVRFcyB3ZSBkb250IGNhcmUKLQkgKiBiZWNhdXNlIHRoZSBhY3R1YWwgd3JpdGUoKXMgYXJlIGRvbmUgYmVmb3JlIGNvbWluZyBoZXJlCi0JICogYW5kIHRoZSBuZXh0IFJFQUQgb3IgV1JJVEUgd2lsbCBjaGVjayBpZiB0aGUgY2hhbm5lbAotCSAqIGlzIGJ1c3kvZnJlZSBhdCB0aGUgZW50cnkgb2YgdGhpcyBjYWxsLgotCSAqCi0JICogSWYgTWluaW11bSBSZXF1ZXN0IFR1cm5hcm91bmQgVGltZSBpcyBub24temVybywgd2UgbmVlZAotCSAqIHRvIHJlY29yZCB0aGUgY29tcGxldGlvbiB0aW1lIG9mIGJvdGggUkVBRCBhbmQgV1JJVEUKLQkgKiBjb21tYW5kIGZvciBwcm9wZXIgaGFuZGxpbmcgb2YgTVJUVCwgc28gd2UgbmVlZCB0byBjaGVjawotCSAqIGZvciBwY2NfbXJ0dCBpbiBhZGRpdGlvbiB0byBDTURfUkVBRAotCSAqLwotCWlmIChjbWQgPT0gQ01EX1JFQUQgfHwgcGNjX21ydHQpIHsKLQkJcmV0ID0gY2hlY2tfcGNjX2NoYW4oKTsKLQkJaWYgKHBjY19tcnR0KQotCQkJbGFzdF9jbWRfY21wbF90aW1lID0ga3RpbWVfZ2V0KCk7CisJLyogd2FpdCBmb3IgY29tcGxldGlvbiBhbmQgY2hlY2sgZm9yIFBDQyBlcnJybyBiaXQgKi8KKwlyZXQgPSBjaGVja19wY2NfY2hhbih0cnVlKTsKKworCWlmIChwY2NfZGF0YS5wY2NfbXJ0dCkKKwkJbGFzdF9jbWRfY21wbF90aW1lID0ga3RpbWVfZ2V0KCk7CisKKwlpZiAocGNjX2RhdGEucGNjX2NoYW5uZWwtPm1ib3gtPnR4ZG9uZV9pcnEpCisJCW1ib3hfY2hhbl90eGRvbmUocGNjX2RhdGEucGNjX2NoYW5uZWwsIHJldCk7CisJZWxzZQorCQltYm94X2NsaWVudF90eGRvbmUocGNjX2RhdGEucGNjX2NoYW5uZWwsIHJldCk7CisKK2VuZDoKKwlpZiAoY21kID09IENNRF9XUklURSkgeworCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJCQlzdHJ1Y3QgY3BjX2Rlc2MgKmRlc2MgPSBwZXJfY3B1KGNwY19kZXNjX3B0ciwgaSk7CisJCQkJaWYgKCFkZXNjKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmIChkZXNjLT53cml0ZV9jbWRfaWQgPT0gcGNjX2RhdGEucGNjX3dyaXRlX2NudCkKKwkJCQkJZGVzYy0+d3JpdGVfY21kX3N0YXR1cyA9IHJldDsKKwkJCX0KKwkJfQorCQlwY2NfZGF0YS5wY2Nfd3JpdGVfY250Kys7CisJCXdha2VfdXBfYWxsKCZwY2NfZGF0YS5wY2Nfd3JpdGVfd2FpdF9xKTsKIAl9CiAKLQltYm94X2NsaWVudF90eGRvbmUocGNjX2NoYW5uZWwsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjcyLDEzICs0MTIsMTMgQEAKICAqCiAgKglSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgZm9yIGVyci4KICAqLwotaW50IGFjcGlfZ2V0X3BzZF9tYXAoc3RydWN0IGNwdWRhdGEgKiphbGxfY3B1X2RhdGEpCitpbnQgYWNwaV9nZXRfcHNkX21hcChzdHJ1Y3QgY3BwY19jcHVkYXRhICoqYWxsX2NwdV9kYXRhKQogewogCWludCBjb3VudF90YXJnZXQ7CiAJaW50IHJldHZhbCA9IDA7CiAJdW5zaWduZWQgaW50IGksIGo7CiAJY3B1bWFza192YXJfdCBjb3ZlcmVkX2NwdXM7Ci0Jc3RydWN0IGNwdWRhdGEgKnByLCAqbWF0Y2hfcHI7CisJc3RydWN0IGNwcGNfY3B1ZGF0YSAqcHIsICptYXRjaF9wcjsKIAlzdHJ1Y3QgYWNwaV9wc2RfcGFja2FnZSAqcGRvbWFpbjsKIAlzdHJ1Y3QgYWNwaV9wc2RfcGFja2FnZSAqbWF0Y2hfcGRvbWFpbjsKIAlzdHJ1Y3QgY3BjX2Rlc2MgKmNwY19wdHIsICptYXRjaF9jcGNfcHRyOwpAQCAtMzk0LDE0ICs1MzQsMTMgQEAKIHN0YXRpYyBpbnQgcmVnaXN0ZXJfcGNjX2NoYW5uZWwoaW50IHBjY19zdWJzcGFjZV9pZHgpCiB7CiAJc3RydWN0IGFjcGlfcGNjdF9od19yZWR1Y2VkICpjcHBjX3NzOwotCXVuc2lnbmVkIGludCBsZW47CiAJdTY0IHVzZWNzX2xhdDsKIAogCWlmIChwY2Nfc3Vic3BhY2VfaWR4ID49IDApIHsKLQkJcGNjX2NoYW5uZWwgPSBwY2NfbWJveF9yZXF1ZXN0X2NoYW5uZWwoJmNwcGNfbWJveF9jbCwKKwkJcGNjX2RhdGEucGNjX2NoYW5uZWwgPSBwY2NfbWJveF9yZXF1ZXN0X2NoYW5uZWwoJmNwcGNfbWJveF9jbCwKIAkJCQlwY2Nfc3Vic3BhY2VfaWR4KTsKIAotCQlpZiAoSVNfRVJSKHBjY19jaGFubmVsKSkgeworCQlpZiAoSVNfRVJSKHBjY19kYXRhLnBjY19jaGFubmVsKSkgewogCQkJcHJfZXJyKCJGYWlsZWQgdG8gZmluZCBQQ0MgY29tbXVuaWNhdGlvbiBjaGFubmVsXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CkBAIC00MTIsNyArNTUxLDcgQEAKIAkJICogUENDIGNoYW5uZWxzKSBhbmQgc3RvcmVkIHBvaW50ZXJzIHRvIHRoZQogCQkgKiBzdWJzcGFjZSBjb21tdW5pY2F0aW9uIHJlZ2lvbiBpbiBjb25fcHJpdi4KIAkJICovCi0JCWNwcGNfc3MgPSBwY2NfY2hhbm5lbC0+Y29uX3ByaXY7CisJCWNwcGNfc3MgPSAocGNjX2RhdGEucGNjX2NoYW5uZWwpLT5jb25fcHJpdjsKIAogCQlpZiAoIWNwcGNfc3MpIHsKIAkJCXByX2VycigiTm8gUENDIHN1YnNwYWNlIGZvdW5kIGZvciBDUFBDXG4iKTsKQEAgLTQyMCwzNSArNTU5LDQyIEBACiAJCX0KIAogCQkvKgotCQkgKiBUaGlzIGlzIHRoZSBzaGFyZWQgY29tbXVuaWNhdGlvbiByZWdpb24KLQkJICogZm9yIHRoZSBPUyBhbmQgUGxhdGZvcm0gdG8gY29tbXVuaWNhdGUgb3Zlci4KLQkJICovCi0JCWNvbW1fYmFzZV9hZGRyID0gY3BwY19zcy0+YmFzZV9hZGRyZXNzOwotCQlsZW4gPSBjcHBjX3NzLT5sZW5ndGg7Ci0KLQkJLyoKIAkJICogY3BwY19zcy0+bGF0ZW5jeSBpcyBqdXN0IGEgTm9taW5hbCB2YWx1ZS4gSW4gcmVhbGl0eQogCQkgKiB0aGUgcmVtb3RlIHByb2Nlc3NvciBjb3VsZCBiZSBtdWNoIHNsb3dlciB0byByZXBseS4KIAkJICogU28gYWRkIGFuIGFyYml0cmFyeSBhbW91bnQgb2Ygd2FpdCBvbiB0b3Agb2YgTm9taW5hbC4KIAkJICovCiAJCXVzZWNzX2xhdCA9IE5VTV9SRVRSSUVTICogY3BwY19zcy0+bGF0ZW5jeTsKLQkJZGVhZGxpbmUgPSBuc190b19rdGltZSh1c2Vjc19sYXQgKiBOU0VDX1BFUl9VU0VDKTsKLQkJcGNjX21ydHQgPSBjcHBjX3NzLT5taW5fdHVybmFyb3VuZF90aW1lOwotCQlwY2NfbXBhciA9IGNwcGNfc3MtPm1heF9hY2Nlc3NfcmF0ZTsKKwkJcGNjX2RhdGEuZGVhZGxpbmUgPSBuc190b19rdGltZSh1c2Vjc19sYXQgKiBOU0VDX1BFUl9VU0VDKTsKKwkJcGNjX2RhdGEucGNjX21ydHQgPSBjcHBjX3NzLT5taW5fdHVybmFyb3VuZF90aW1lOworCQlwY2NfZGF0YS5wY2NfbXBhciA9IGNwcGNfc3MtPm1heF9hY2Nlc3NfcmF0ZTsKKwkJcGNjX2RhdGEucGNjX25vbWluYWwgPSBjcHBjX3NzLT5sYXRlbmN5OwogCi0JCXBjY19jb21tX2FkZHIgPSBhY3BpX29zX2lvcmVtYXAoY29tbV9iYXNlX2FkZHIsIGxlbik7Ci0JCWlmICghcGNjX2NvbW1fYWRkcikgeworCQlwY2NfZGF0YS5wY2NfY29tbV9hZGRyID0gYWNwaV9vc19pb3JlbWFwKGNwcGNfc3MtPmJhc2VfYWRkcmVzcywgY3BwY19zcy0+bGVuZ3RoKTsKKwkJaWYgKCFwY2NfZGF0YS5wY2NfY29tbV9hZGRyKSB7CiAJCQlwcl9lcnIoIkZhaWxlZCB0byBpb3JlbWFwIFBDQyBjb21tIHJlZ2lvbiBtZW1cbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAogCQkvKiBTZXQgZmxhZyBzbyB0aGF0IHdlIGRvbnQgY29tZSBoZXJlIGZvciBlYWNoIENQVS4gKi8KLQkJcGNjX2NoYW5uZWxfYWNxdWlyZWQgPSB0cnVlOworCQlwY2NfZGF0YS5wY2NfY2hhbm5lbF9hY3F1aXJlZCA9IHRydWU7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogY3BjX2ZmaF9zdXBwb3J0ZWQoKSAtIGNoZWNrIGlmIEZGSCByZWFkaW5nIHN1cHBvcnRlZAorICoKKyAqIENoZWNrIGlmIHRoZSBhcmNoaXRlY3R1cmUgaGFzIHN1cHBvcnQgZm9yIGZ1bmN0aW9uYWwgZml4ZWQgaGFyZHdhcmUKKyAqIHJlYWQvd3JpdGUgY2FwYWJpbGl0eS4KKyAqCisgKiBSZXR1cm46IHRydWUgZm9yIHN1cHBvcnRlZCwgZmFsc2UgZm9yIG5vdCBzdXBwb3J0ZWQKKyAqLworYm9vbCBfX3dlYWsgY3BjX2ZmaF9zdXBwb3J0ZWQodm9pZCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKIC8qCiAgKiBBbiBleGFtcGxlIENQQyB0YWJsZSBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcuCiAgKgpAQCAtNTA3LDYgKzY1Myw3IEBACiAJdW5pb24gYWNwaV9vYmplY3QgKm91dF9vYmosICpjcGNfb2JqOwogCXN0cnVjdCBjcGNfZGVzYyAqY3BjX3B0cjsKIAlzdHJ1Y3QgY3BjX3JlZyAqZ2FzX3Q7CisJc3RydWN0IGRldmljZSAqY3B1X2RldjsKIAlhY3BpX2hhbmRsZSBoYW5kbGUgPSBwci0+aGFuZGxlOwogCXVuc2lnbmVkIGludCBudW1fZW50LCBpLCBjcGNfcmV2OwogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTU0NSw2ICs2OTIsOCBAQAogCQlnb3RvIG91dF9mcmVlOwogCX0KIAorCWNwY19wdHItPm51bV9lbnRyaWVzID0gbnVtX2VudDsKKwogCS8qIFNlY29uZCBlbnRyeSBzaG91bGQgYmUgcmV2aXNpb24uICovCiAJY3BjX29iaiA9ICZvdXRfb2JqLT5wYWNrYWdlLmVsZW1lbnRzWzFdOwogCWlmIChjcGNfb2JqLT50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKQl7CkBAIC01NzksMTYgKzcyOCwyNyBAQAogCQkJICogc28gZXh0cmFjdCBpdCBvbmx5IG9uY2UuCiAJCQkgKi8KIAkJCWlmIChnYXNfdC0+c3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfUExBVEZPUk1fQ09NTSkgewotCQkJCWlmIChwY2Nfc3Vic3BhY2VfaWR4IDwgMCkKLQkJCQkJcGNjX3N1YnNwYWNlX2lkeCA9IGdhc190LT5hY2Nlc3Nfd2lkdGg7Ci0JCQkJZWxzZSBpZiAocGNjX3N1YnNwYWNlX2lkeCAhPSBnYXNfdC0+YWNjZXNzX3dpZHRoKSB7CisJCQkJaWYgKHBjY19kYXRhLnBjY19zdWJzcGFjZV9pZHggPCAwKQorCQkJCQlwY2NfZGF0YS5wY2Nfc3Vic3BhY2VfaWR4ID0gZ2FzX3QtPmFjY2Vzc193aWR0aDsKKwkJCQllbHNlIGlmIChwY2NfZGF0YS5wY2Nfc3Vic3BhY2VfaWR4ICE9IGdhc190LT5hY2Nlc3Nfd2lkdGgpIHsKIAkJCQkJcHJfZGVidWcoIk1pc21hdGNoZWQgUENDIGlkcy5cbiIpOwogCQkJCQlnb3RvIG91dF9mcmVlOwogCQkJCX0KLQkJCX0gZWxzZSBpZiAoZ2FzX3QtPnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlkpIHsKLQkJCQkvKiBTdXBwb3J0IG9ubHkgUENDIGFuZCBTWVMgTUVNIHR5cGUgcmVncyAqLwotCQkJCXByX2RlYnVnKCJVbnN1cHBvcnRlZCByZWdpc3RlciB0eXBlOiAlZFxuIiwgZ2FzX3QtPnNwYWNlX2lkKTsKLQkJCQlnb3RvIG91dF9mcmVlOworCQkJfSBlbHNlIGlmIChnYXNfdC0+c3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSkgeworCQkJCWlmIChnYXNfdC0+YWRkcmVzcykgeworCQkJCQl2b2lkIF9faW9tZW0gKmFkZHI7CisKKwkJCQkJYWRkciA9IGlvcmVtYXAoZ2FzX3QtPmFkZHJlc3MsIGdhc190LT5iaXRfd2lkdGgvOCk7CisJCQkJCWlmICghYWRkcikKKwkJCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQkJCWNwY19wdHItPmNwY19yZWdzW2ktMl0uc3lzX21lbV92YWRkciA9IGFkZHI7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoZ2FzX3QtPnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFIHx8ICFjcGNfZmZoX3N1cHBvcnRlZCgpKSB7CisJCQkJCS8qIFN1cHBvcnQgb25seSBQQ0MgLFNZUyBNRU0gYW5kIEZGSCB0eXBlIHJlZ3MgKi8KKwkJCQkJcHJfZGVidWcoIlVuc3VwcG9ydGVkIHJlZ2lzdGVyIHR5cGU6ICVkXG4iLCBnYXNfdC0+c3BhY2VfaWQpOworCQkJCQlnb3RvIG91dF9mcmVlOworCQkJCX0KIAkJCX0KIAogCQkJY3BjX3B0ci0+Y3BjX3JlZ3NbaS0yXS50eXBlID0gQUNQSV9UWVBFX0JVRkZFUjsKQEAgLTYwNywxMCArNzY3LDEzIEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAKIAkvKiBSZWdpc3RlciBQQ0MgY2hhbm5lbCBvbmNlIGZvciBhbGwgQ1BVcy4gKi8KLQlpZiAoIXBjY19jaGFubmVsX2FjcXVpcmVkKSB7Ci0JCXJldCA9IHJlZ2lzdGVyX3BjY19jaGFubmVsKHBjY19zdWJzcGFjZV9pZHgpOworCWlmICghcGNjX2RhdGEucGNjX2NoYW5uZWxfYWNxdWlyZWQpIHsKKwkJcmV0ID0gcmVnaXN0ZXJfcGNjX2NoYW5uZWwocGNjX2RhdGEucGNjX3N1YnNwYWNlX2lkeCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dF9mcmVlOworCisJCWluaXRfcndzZW0oJnBjY19kYXRhLnBjY19sb2NrKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcGNjX2RhdGEucGNjX3dyaXRlX3dhaXRfcSk7CiAJfQogCiAJLyogUGx1ZyBQU0QgZGF0YSBpbnRvIHRoaXMgQ1BVcyBDUEMgZGVzY3JpcHRvci4gKi8KQEAgLTYxOSwxMCArNzgyLDI3IEBACiAJLyogRXZlcnl0aGluZyBsb29rcyBva2F5ICovCiAJcHJfZGVidWcoIlBhcnNlZCBDUEMgc3RydWN0IGZvciBDUFU6ICVkXG4iLCBwci0+aWQpOwogCisJLyogQWRkIHBlciBsb2dpY2FsIENQVSBub2RlcyBmb3IgcmVhZGluZyBpdHMgZmVlZGJhY2sgY291bnRlcnMuICovCisJY3B1X2RldiA9IGdldF9jcHVfZGV2aWNlKHByLT5pZCk7CisJaWYgKCFjcHVfZGV2KQorCQlnb3RvIG91dF9mcmVlOworCisJcmV0ID0ga29iamVjdF9pbml0X2FuZF9hZGQoJmNwY19wdHItPmtvYmosICZjcHBjX2t0eXBlLCAmY3B1X2Rldi0+a29iaiwKKwkJCSJhY3BpX2NwcGMiKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mcmVlOworCiAJa2ZyZWUob3V0cHV0LnBvaW50ZXIpOwogCXJldHVybiAwOwogCiBvdXRfZnJlZToKKwkvKiBGcmVlIGFsbCB0aGUgbWFwcGVkIHN5cyBtZW0gYXJlYXMgZm9yIHRoaXMgQ1BVICovCisJZm9yIChpID0gMjsgaSA8IGNwY19wdHItPm51bV9lbnRyaWVzOyBpKyspIHsKKwkJdm9pZCBfX2lvbWVtICphZGRyID0gY3BjX3B0ci0+Y3BjX3JlZ3NbaS0yXS5zeXNfbWVtX3ZhZGRyOworCisJCWlmIChhZGRyKQorCQkJaW91bm1hcChhZGRyKTsKKwl9CiAJa2ZyZWUoY3BjX3B0cik7CiAKIG91dF9idWZfZnJlZToKQEAgLTY0MCwyNiArODIwLDgyIEBACiB2b2lkIGFjcGlfY3BwY19wcm9jZXNzb3JfZXhpdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewogCXN0cnVjdCBjcGNfZGVzYyAqY3BjX3B0cjsKKwl1bnNpZ25lZCBpbnQgaTsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisKIAljcGNfcHRyID0gcGVyX2NwdShjcGNfZGVzY19wdHIsIHByLT5pZCk7CisKKwkvKiBGcmVlIGFsbCB0aGUgbWFwcGVkIHN5cyBtZW0gYXJlYXMgZm9yIHRoaXMgQ1BVICovCisJZm9yIChpID0gMjsgaSA8IGNwY19wdHItPm51bV9lbnRyaWVzOyBpKyspIHsKKwkJYWRkciA9IGNwY19wdHItPmNwY19yZWdzW2ktMl0uc3lzX21lbV92YWRkcjsKKwkJaWYgKGFkZHIpCisJCQlpb3VubWFwKGFkZHIpOworCX0KKworCWtvYmplY3RfcHV0KCZjcGNfcHRyLT5rb2JqKTsKIAlrZnJlZShjcGNfcHRyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFjcGlfY3BwY19wcm9jZXNzb3JfZXhpdCk7CiAKKy8qKgorICogY3BjX3JlYWRfZmZoKCkgLSBSZWFkIEZGSCByZWdpc3RlcgorICogQGNwdW51bToJY3B1IG51bWJlciB0byByZWFkCisgKiBAcmVnOgljcHBjIHJlZ2lzdGVyIGluZm9ybWF0aW9uCisgKiBAdmFsOglwbGFjZSBob2xkZXIgZm9yIHJldHVybiB2YWx1ZQorICoKKyAqIFJlYWQgYml0X3dpZHRoIGJpdHMgZnJvbSBhIHNwZWNpZmllZCBhZGRyZXNzIGFuZCBiaXRfb2Zmc2V0CisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIGFuZCBlcnJvciBjb2RlCisgKi8KK2ludCBfX3dlYWsgY3BjX3JlYWRfZmZoKGludCBjcHVudW0sIHN0cnVjdCBjcGNfcmVnICpyZWcsIHU2NCAqdmFsKQoreworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKKy8qKgorICogY3BjX3dyaXRlX2ZmaCgpIC0gV3JpdGUgRkZIIHJlZ2lzdGVyCisgKiBAY3B1bnVtOgljcHUgbnVtYmVyIHRvIHdyaXRlCisgKiBAcmVnOgljcHBjIHJlZ2lzdGVyIGluZm9ybWF0aW9uCisgKiBAdmFsOgl2YWx1ZSB0byB3cml0ZQorICoKKyAqIFdyaXRlIHZhbHVlIG9mIGJpdF93aWR0aCBiaXRzIHRvIGEgc3BlY2lmaWVkIGFkZHJlc3MgYW5kIGJpdF9vZmZzZXQKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MgYW5kIGVycm9yIGNvZGUKKyAqLworaW50IF9fd2VhayBjcGNfd3JpdGVfZmZoKGludCBjcHVudW0sIHN0cnVjdCBjcGNfcmVnICpyZWcsIHU2NCB2YWwpCit7CisJcmV0dXJuIC1FTk9UU1VQUDsKK30KKwogLyoKICAqIFNpbmNlIGNwY19yZWFkIGFuZCBjcGNfd3JpdGUgYXJlIGNhbGxlZCB3aGlsZSBob2xkaW5nIHBjY19sb2NrLCBpdCBzaG91bGQgYmUKICAqIGFzIGZhc3QgYXMgcG9zc2libGUuIFdlIGhhdmUgYWxyZWFkeSBtYXBwZWQgdGhlIFBDQyBzdWJzcGFjZSBkdXJpbmcgaW5pdCwgc28KICAqIHdlIGNhbiBkaXJlY3RseSB3cml0ZSB0byBpdC4KICAqLwogCi1zdGF0aWMgaW50IGNwY19yZWFkKHN0cnVjdCBjcGNfcmVnICpyZWcsIHU2NCAqdmFsKQorc3RhdGljIGludCBjcGNfcmVhZChpbnQgY3B1LCBzdHJ1Y3QgY3BjX3JlZ2lzdGVyX3Jlc291cmNlICpyZWdfcmVzLCB1NjQgKnZhbCkKIHsKIAlpbnQgcmV0X3ZhbCA9IDA7CisJdm9pZCBfX2lvbWVtICp2YWRkciA9IDA7CisJc3RydWN0IGNwY19yZWcgKnJlZyA9ICZyZWdfcmVzLT5jcGNfZW50cnkucmVnOworCisJaWYgKHJlZ19yZXMtPnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwkJKnZhbCA9IHJlZ19yZXMtPmNwY19lbnRyeS5pbnRfdmFsdWU7CisJCXJldHVybiByZXRfdmFsOworCX0KIAogCSp2YWwgPSAwOwotCWlmIChyZWctPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pIHsKLQkJdm9pZCBfX2lvbWVtICp2YWRkciA9IEdFVF9QQ0NfVkFERFIocmVnLT5hZGRyZXNzKTsKKwlpZiAocmVnLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9QTEFURk9STV9DT01NKQorCQl2YWRkciA9IEdFVF9QQ0NfVkFERFIocmVnLT5hZGRyZXNzKTsKKwllbHNlIGlmIChyZWctPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlkpCisJCXZhZGRyID0gcmVnX3Jlcy0+c3lzX21lbV92YWRkcjsKKwllbHNlIGlmIChyZWctPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKQorCQlyZXR1cm4gY3BjX3JlYWRfZmZoKGNwdSwgcmVnLCB2YWwpOworCWVsc2UKKwkJcmV0dXJuIGFjcGlfb3NfcmVhZF9tZW1vcnkoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcylyZWctPmFkZHJlc3MsCisJCQkJdmFsLCByZWctPmJpdF93aWR0aCk7CiAKLQkJc3dpdGNoIChyZWctPmJpdF93aWR0aCkgeworCXN3aXRjaCAocmVnLT5iaXRfd2lkdGgpIHsKIAkJY2FzZSA4OgogCQkJKnZhbCA9IHJlYWRiX3JlbGF4ZWQodmFkZHIpOwogCQkJYnJlYWs7CkBAIC02NzQsMjMgKzkxMCwzMCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwcl9kZWJ1ZygiRXJyb3I6IENhbm5vdCByZWFkICV1IGJpdCB3aWR0aCBmcm9tIFBDQ1xuIiwKLQkJCQlyZWctPmJpdF93aWR0aCk7CisJCQkJCXJlZy0+Yml0X3dpZHRoKTsKIAkJCXJldF92YWwgPSAtRUZBVUxUOwotCQl9Ci0JfSBlbHNlCi0JCXJldF92YWwgPSBhY3BpX29zX3JlYWRfbWVtb3J5KChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpcmVnLT5hZGRyZXNzLAotCQkJCQl2YWwsIHJlZy0+Yml0X3dpZHRoKTsKKwl9CisKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIAotc3RhdGljIGludCBjcGNfd3JpdGUoc3RydWN0IGNwY19yZWcgKnJlZywgdTY0IHZhbCkKK3N0YXRpYyBpbnQgY3BjX3dyaXRlKGludCBjcHUsIHN0cnVjdCBjcGNfcmVnaXN0ZXJfcmVzb3VyY2UgKnJlZ19yZXMsIHU2NCB2YWwpCiB7CiAJaW50IHJldF92YWwgPSAwOworCXZvaWQgX19pb21lbSAqdmFkZHIgPSAwOworCXN0cnVjdCBjcGNfcmVnICpyZWcgPSAmcmVnX3Jlcy0+Y3BjX2VudHJ5LnJlZzsKIAotCWlmIChyZWctPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pIHsKLQkJdm9pZCBfX2lvbWVtICp2YWRkciA9IEdFVF9QQ0NfVkFERFIocmVnLT5hZGRyZXNzKTsKKwlpZiAocmVnLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9QTEFURk9STV9DT01NKQorCQl2YWRkciA9IEdFVF9QQ0NfVkFERFIocmVnLT5hZGRyZXNzKTsKKwllbHNlIGlmIChyZWctPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlkpCisJCXZhZGRyID0gcmVnX3Jlcy0+c3lzX21lbV92YWRkcjsKKwllbHNlIGlmIChyZWctPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKQorCQlyZXR1cm4gY3BjX3dyaXRlX2ZmaChjcHUsIHJlZywgdmFsKTsKKwllbHNlCisJCXJldHVybiBhY3BpX29zX3dyaXRlX21lbW9yeSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKXJlZy0+YWRkcmVzcywKKwkJCQl2YWwsIHJlZy0+Yml0X3dpZHRoKTsKIAotCQlzd2l0Y2ggKHJlZy0+Yml0X3dpZHRoKSB7CisJc3dpdGNoIChyZWctPmJpdF93aWR0aCkgewogCQljYXNlIDg6CiAJCQl3cml0ZWJfcmVsYXhlZCh2YWwsIHZhZGRyKTsKIAkJCWJyZWFrOwpAQCAtNzA1LDEzICs5NDgsMTEgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJfZGVidWcoIkVycm9yOiBDYW5ub3Qgd3JpdGUgJXUgYml0IHdpZHRoIHRvIFBDQ1xuIiwKLQkJCQlyZWctPmJpdF93aWR0aCk7CisJCQkJCXJlZy0+Yml0X3dpZHRoKTsKIAkJCXJldF92YWwgPSAtRUZBVUxUOwogCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UKLQkJcmV0X3ZhbCA9IGFjcGlfb3Nfd3JpdGVfbWVtb3J5KChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpcmVnLT5hZGRyZXNzLAotCQkJCXZhbCwgcmVnLT5iaXRfd2lkdGgpOworCX0KKwogCXJldHVybiByZXRfdmFsOwogfQogCkBAIC03MjcsOCArOTY4LDggQEAKIAlzdHJ1Y3QgY3BjX2Rlc2MgKmNwY19kZXNjID0gcGVyX2NwdShjcGNfZGVzY19wdHIsIGNwdW51bSk7CiAJc3RydWN0IGNwY19yZWdpc3Rlcl9yZXNvdXJjZSAqaGlnaGVzdF9yZWcsICpsb3dlc3RfcmVnLCAqcmVmX3BlcmYsCiAJCQkJCQkJCSAqbm9tX3BlcmY7Ci0JdTY0IGhpZ2gsIGxvdywgcmVmLCBub207Ci0JaW50IHJldCA9IDA7CisJdTY0IGhpZ2gsIGxvdywgbm9tOworCWludCByZXQgPSAwLCByZWdzX2luX3BjYyA9IDA7CiAKIAlpZiAoIWNwY19kZXNjKSB7CiAJCXByX2RlYnVnKCJObyBDUEMgZGVzY3JpcHRvciBmb3IgQ1BVOiVkXG4iLCBjcHVudW0pOwpAQCAtNzQwLDEzICs5ODEsMTEgQEAKIAlyZWZfcGVyZiA9ICZjcGNfZGVzYy0+Y3BjX3JlZ3NbUkVGRVJFTkNFX1BFUkZdOwogCW5vbV9wZXJmID0gJmNwY19kZXNjLT5jcGNfcmVnc1tOT01JTkFMX1BFUkZdOwogCi0Jc3Bpbl9sb2NrKCZwY2NfbG9jayk7Ci0KIAkvKiBBcmUgYW55IG9mIHRoZSByZWdzIFBDQyA/Ki8KLQlpZiAoKGhpZ2hlc3RfcmVnLT5jcGNfZW50cnkucmVnLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pIHx8Ci0JCQkobG93ZXN0X3JlZy0+Y3BjX2VudHJ5LnJlZy5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9QTEFURk9STV9DT01NKSB8fAotCQkJKHJlZl9wZXJmLT5jcGNfZW50cnkucmVnLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pIHx8Ci0JCQkobm9tX3BlcmYtPmNwY19lbnRyeS5yZWcuc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfUExBVEZPUk1fQ09NTSkpIHsKKwlpZiAoQ1BDX0lOX1BDQyhoaWdoZXN0X3JlZykgfHwgQ1BDX0lOX1BDQyhsb3dlc3RfcmVnKSB8fAorCQlDUENfSU5fUENDKHJlZl9wZXJmKSB8fCBDUENfSU5fUENDKG5vbV9wZXJmKSkgeworCQlyZWdzX2luX3BjYyA9IDE7CisJCWRvd25fd3JpdGUoJnBjY19kYXRhLnBjY19sb2NrKTsKIAkJLyogUmluZyBkb29yYmVsbCBvbmNlIHRvIHVwZGF0ZSBQQ0Mgc3Vic3BhY2UgKi8KIAkJaWYgKHNlbmRfcGNjX2NtZChDTURfUkVBRCkgPCAwKSB7CiAJCQlyZXQgPSAtRUlPOwpAQCAtNzU0LDI2ICs5OTMsMjEgQEAKIAkJfQogCX0KIAotCWNwY19yZWFkKCZoaWdoZXN0X3JlZy0+Y3BjX2VudHJ5LnJlZywgJmhpZ2gpOworCWNwY19yZWFkKGNwdW51bSwgaGlnaGVzdF9yZWcsICZoaWdoKTsKIAlwZXJmX2NhcHMtPmhpZ2hlc3RfcGVyZiA9IGhpZ2g7CiAKLQljcGNfcmVhZCgmbG93ZXN0X3JlZy0+Y3BjX2VudHJ5LnJlZywgJmxvdyk7CisJY3BjX3JlYWQoY3B1bnVtLCBsb3dlc3RfcmVnLCAmbG93KTsKIAlwZXJmX2NhcHMtPmxvd2VzdF9wZXJmID0gbG93OwogCi0JY3BjX3JlYWQoJnJlZl9wZXJmLT5jcGNfZW50cnkucmVnLCAmcmVmKTsKLQlwZXJmX2NhcHMtPnJlZmVyZW5jZV9wZXJmID0gcmVmOwotCi0JY3BjX3JlYWQoJm5vbV9wZXJmLT5jcGNfZW50cnkucmVnLCAmbm9tKTsKKwljcGNfcmVhZChjcHVudW0sIG5vbV9wZXJmLCAmbm9tKTsKIAlwZXJmX2NhcHMtPm5vbWluYWxfcGVyZiA9IG5vbTsKIAotCWlmICghcmVmKQotCQlwZXJmX2NhcHMtPnJlZmVyZW5jZV9wZXJmID0gcGVyZl9jYXBzLT5ub21pbmFsX3BlcmY7Ci0KIAlpZiAoIWhpZ2ggfHwgIWxvdyB8fCAhbm9tKQogCQlyZXQgPSAtRUZBVUxUOwogCiBvdXRfZXJyOgotCXNwaW5fdW5sb2NrKCZwY2NfbG9jayk7CisJaWYgKHJlZ3NfaW5fcGNjKQorCQl1cF93cml0ZSgmcGNjX2RhdGEucGNjX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcHBjX2dldF9wZXJmX2NhcHMpOwpAQCAtNzg4LDkgKzEwMjIsMTAgQEAKIGludCBjcHBjX2dldF9wZXJmX2N0cnMoaW50IGNwdW51bSwgc3RydWN0IGNwcGNfcGVyZl9mYl9jdHJzICpwZXJmX2ZiX2N0cnMpCiB7CiAJc3RydWN0IGNwY19kZXNjICpjcGNfZGVzYyA9IHBlcl9jcHUoY3BjX2Rlc2NfcHRyLCBjcHVudW0pOwotCXN0cnVjdCBjcGNfcmVnaXN0ZXJfcmVzb3VyY2UgKmRlbGl2ZXJlZF9yZWcsICpyZWZlcmVuY2VfcmVnOwotCXU2NCBkZWxpdmVyZWQsIHJlZmVyZW5jZTsKLQlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY3BjX3JlZ2lzdGVyX3Jlc291cmNlICpkZWxpdmVyZWRfcmVnLCAqcmVmZXJlbmNlX3JlZywKKwkJKnJlZl9wZXJmX3JlZywgKmN0cl93cmFwX3JlZzsKKwl1NjQgZGVsaXZlcmVkLCByZWZlcmVuY2UsIHJlZl9wZXJmLCBjdHJfd3JhcF90aW1lOworCWludCByZXQgPSAwLCByZWdzX2luX3BjYyA9IDA7CiAKIAlpZiAoIWNwY19kZXNjKSB7CiAJCXByX2RlYnVnKCJObyBDUEMgZGVzY3JpcHRvciBmb3IgQ1BVOiVkXG4iLCBjcHVudW0pOwpAQCAtNzk5LDEyICsxMDM0LDIxIEBACiAKIAlkZWxpdmVyZWRfcmVnID0gJmNwY19kZXNjLT5jcGNfcmVnc1tERUxJVkVSRURfQ1RSXTsKIAlyZWZlcmVuY2VfcmVnID0gJmNwY19kZXNjLT5jcGNfcmVnc1tSRUZFUkVOQ0VfQ1RSXTsKKwlyZWZfcGVyZl9yZWcgPSAmY3BjX2Rlc2MtPmNwY19yZWdzW1JFRkVSRU5DRV9QRVJGXTsKKwljdHJfd3JhcF9yZWcgPSAmY3BjX2Rlc2MtPmNwY19yZWdzW0NUUl9XUkFQX1RJTUVdOwogCi0Jc3Bpbl9sb2NrKCZwY2NfbG9jayk7CisJLyoKKwkgKiBJZiByZWZlcm5jZSBwZXJmIHJlZ2lzdGVyIGlzIG5vdCBzdXBwb3J0ZWQgdGhlbiB3ZSBzaG91bGQKKwkgKiB1c2UgdGhlIG5vbWluYWwgcGVyZiB2YWx1ZQorCSAqLworCWlmICghQ1BDX1NVUFBPUlRFRChyZWZfcGVyZl9yZWcpKQorCQlyZWZfcGVyZl9yZWcgPSAmY3BjX2Rlc2MtPmNwY19yZWdzW05PTUlOQUxfUEVSRl07CiAKIAkvKiBBcmUgYW55IG9mIHRoZSByZWdzIFBDQyA/Ki8KLQlpZiAoKGRlbGl2ZXJlZF9yZWctPmNwY19lbnRyeS5yZWcuc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfUExBVEZPUk1fQ09NTSkgfHwKLQkJCShyZWZlcmVuY2VfcmVnLT5jcGNfZW50cnkucmVnLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pKSB7CisJaWYgKENQQ19JTl9QQ0MoZGVsaXZlcmVkX3JlZykgfHwgQ1BDX0lOX1BDQyhyZWZlcmVuY2VfcmVnKSB8fAorCQlDUENfSU5fUENDKGN0cl93cmFwX3JlZykgfHwgQ1BDX0lOX1BDQyhyZWZfcGVyZl9yZWcpKSB7CisJCWRvd25fd3JpdGUoJnBjY19kYXRhLnBjY19sb2NrKTsKKwkJcmVnc19pbl9wY2MgPSAxOwogCQkvKiBSaW5nIGRvb3JiZWxsIG9uY2UgdG8gdXBkYXRlIFBDQyBzdWJzcGFjZSAqLwogCQlpZiAoc2VuZF9wY2NfY21kKENNRF9SRUFEKSA8IDApIHsKIAkJCXJldCA9IC1FSU87CkBAIC04MTIsMjUgKzEwNTYsMzEgQEAKIAkJfQogCX0KIAotCWNwY19yZWFkKCZkZWxpdmVyZWRfcmVnLT5jcGNfZW50cnkucmVnLCAmZGVsaXZlcmVkKTsKLQljcGNfcmVhZCgmcmVmZXJlbmNlX3JlZy0+Y3BjX2VudHJ5LnJlZywgJnJlZmVyZW5jZSk7CisJY3BjX3JlYWQoY3B1bnVtLCBkZWxpdmVyZWRfcmVnLCAmZGVsaXZlcmVkKTsKKwljcGNfcmVhZChjcHVudW0sIHJlZmVyZW5jZV9yZWcsICZyZWZlcmVuY2UpOworCWNwY19yZWFkKGNwdW51bSwgcmVmX3BlcmZfcmVnLCAmcmVmX3BlcmYpOwogCi0JaWYgKCFkZWxpdmVyZWQgfHwgIXJlZmVyZW5jZSkgeworCS8qCisJICogUGVyIHNwZWMsIGlmIGN0cl93cmFwX3RpbWUgb3B0aW9uYWwgcmVnaXN0ZXIgaXMgdW5zdXBwb3J0ZWQsIHRoZW4gdGhlCisJICogcGVyZm9ybWFuY2UgY291bnRlcnMgYXJlIGFzc3VtZWQgdG8gbmV2ZXIgd3JhcCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mCisJICogcGxhdGZvcm0KKwkgKi8KKwljdHJfd3JhcF90aW1lID0gKHU2NCkofigodTY0KTApKTsKKwlpZiAoQ1BDX1NVUFBPUlRFRChjdHJfd3JhcF9yZWcpKQorCQljcGNfcmVhZChjcHVudW0sIGN0cl93cmFwX3JlZywgJmN0cl93cmFwX3RpbWUpOworCisJaWYgKCFkZWxpdmVyZWQgfHwgIXJlZmVyZW5jZSB8fAkhcmVmX3BlcmYpIHsKIAkJcmV0ID0gLUVGQVVMVDsKIAkJZ290byBvdXRfZXJyOwogCX0KIAogCXBlcmZfZmJfY3Rycy0+ZGVsaXZlcmVkID0gZGVsaXZlcmVkOwogCXBlcmZfZmJfY3Rycy0+cmVmZXJlbmNlID0gcmVmZXJlbmNlOwotCi0JcGVyZl9mYl9jdHJzLT5kZWxpdmVyZWQgLT0gcGVyZl9mYl9jdHJzLT5wcmV2X2RlbGl2ZXJlZDsKLQlwZXJmX2ZiX2N0cnMtPnJlZmVyZW5jZSAtPSBwZXJmX2ZiX2N0cnMtPnByZXZfcmVmZXJlbmNlOwotCi0JcGVyZl9mYl9jdHJzLT5wcmV2X2RlbGl2ZXJlZCA9IGRlbGl2ZXJlZDsKLQlwZXJmX2ZiX2N0cnMtPnByZXZfcmVmZXJlbmNlID0gcmVmZXJlbmNlOwotCisJcGVyZl9mYl9jdHJzLT5yZWZlcmVuY2VfcGVyZiA9IHJlZl9wZXJmOworCXBlcmZfZmJfY3Rycy0+Y3RyX3dyYXBfdGltZSA9IGN0cl93cmFwX3RpbWU7CiBvdXRfZXJyOgotCXNwaW5fdW5sb2NrKCZwY2NfbG9jayk7CisJaWYgKHJlZ3NfaW5fcGNjKQorCQl1cF93cml0ZSgmcGNjX2RhdGEucGNjX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcHBjX2dldF9wZXJmX2N0cnMpOwpAQCAtODU1LDMwICsxMTA1LDE0MiBAQAogCiAJZGVzaXJlZF9yZWcgPSAmY3BjX2Rlc2MtPmNwY19yZWdzW0RFU0lSRURfUEVSRl07CiAKLQlzcGluX2xvY2soJnBjY19sb2NrKTsKLQotCS8qIElmIHRoaXMgaXMgUENDIHJlZywgY2hlY2sgaWYgY2hhbm5lbCBpcyBmcmVlIGJlZm9yZSB3cml0aW5nICovCi0JaWYgKGRlc2lyZWRfcmVnLT5jcGNfZW50cnkucmVnLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pIHsKLQkJcmV0ID0gY2hlY2tfcGNjX2NoYW4oKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gYnVzeV9jaGFubmVsOworCS8qCisJICogVGhpcyBpcyBQaGFzZS1JIHdoZXJlIHdlIHdhbnQgdG8gd3JpdGUgdG8gQ1BDIHJlZ2lzdGVycworCSAqIC0+IFdlIHdhbnQgYWxsIENQVXMgdG8gYmUgYWJsZSB0byBleGVjdXRlIHRoaXMgcGhhc2UgaW4gcGFyYWxsZWwKKwkgKgorCSAqIFNpbmNlIHJlYWRfbG9jayBjYW4gYmUgYWNxdWlyZWQgYnkgbXVsdGlwbGUgQ1BVcyBzaW11bHRhbmVvdXNseSB3ZQorCSAqIGFjaGlldmUgdGhhdCBnb2FsIGhlcmUKKwkgKi8KKwlpZiAoQ1BDX0lOX1BDQyhkZXNpcmVkX3JlZykpIHsKKwkJZG93bl9yZWFkKCZwY2NfZGF0YS5wY2NfbG9jayk7CS8qIEJFR0lOIFBoYXNlLUkgKi8KKwkJaWYgKHBjY19kYXRhLnBsYXRmb3JtX293bnNfcGNjKSB7CisJCQlyZXQgPSBjaGVja19wY2NfY2hhbihmYWxzZSk7CisJCQlpZiAocmV0KSB7CisJCQkJdXBfcmVhZCgmcGNjX2RhdGEucGNjX2xvY2spOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwkJLyoKKwkJICogVXBkYXRlIHRoZSBwZW5kaW5nX3dyaXRlIHRvIG1ha2Ugc3VyZSBhIFBDQyBDTURfUkVBRCB3aWxsIG5vdAorCQkgKiBhcnJpdmUgYW5kIHN0ZWFsIHRoZSBjaGFubmVsIGR1cmluZyB0aGUgc3dpdGNoIHRvIHdyaXRlIGxvY2sKKwkJICovCisJCXBjY19kYXRhLnBlbmRpbmdfcGNjX3dyaXRlX2NtZCA9IHRydWU7CisJCWNwY19kZXNjLT53cml0ZV9jbWRfaWQgPSBwY2NfZGF0YS5wY2Nfd3JpdGVfY250OworCQljcGNfZGVzYy0+d3JpdGVfY21kX3N0YXR1cyA9IDA7CiAJfQogCiAJLyoKIAkgKiBTa2lwIHdyaXRpbmcgTUlOL01BWCB1bnRpbCBMaW51eCBrbm93cyBob3cgdG8gY29tZSB1cCB3aXRoCiAJICogdXNlZnVsIHZhbHVlcy4KIAkgKi8KLQljcGNfd3JpdGUoJmRlc2lyZWRfcmVnLT5jcGNfZW50cnkucmVnLCBwZXJmX2N0cmxzLT5kZXNpcmVkX3BlcmYpOworCWNwY193cml0ZShjcHUsIGRlc2lyZWRfcmVnLCBwZXJmX2N0cmxzLT5kZXNpcmVkX3BlcmYpOwogCi0JLyogSXMgdGhpcyBhIFBDQyByZWcgPyovCi0JaWYgKGRlc2lyZWRfcmVnLT5jcGNfZW50cnkucmVnLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pIHsKLQkJLyogUmluZyBkb29yYmVsbCBzbyBSZW1vdGUgY2FuIGdldCBvdXIgcGVyZiByZXF1ZXN0LiAqLwotCQlpZiAoc2VuZF9wY2NfY21kKENNRF9XUklURSkgPCAwKQotCQkJcmV0ID0gLUVJTzsKKwlpZiAoQ1BDX0lOX1BDQyhkZXNpcmVkX3JlZykpCisJCXVwX3JlYWQoJnBjY19kYXRhLnBjY19sb2NrKTsJLyogRU5EIFBoYXNlLUkgKi8KKwkvKgorCSAqIFRoaXMgaXMgUGhhc2UtSUkgd2hlcmUgd2UgdHJhbnNmZXIgdGhlIG93bmVyc2hpcCBvZiBQQ0MgdG8gUGxhdGZvcm0KKwkgKgorCSAqIFNob3J0IFN1bW1hcnk6IEJhc2ljYWxseSBpZiB3ZSB0aGluayBvZiBhIGdyb3VwIG9mIGNwcGNfc2V0X3BlcmYKKwkgKiByZXF1ZXN0cyB0aGF0IGhhcHBlbmVkIGluIHNob3J0IG92ZXJsYXBwaW5nIGludGVydmFsLiBUaGUgbGFzdCBDUFUgdG8KKwkgKiBjb21lIG91dCBvZiBQaGFzZS1JIHdpbGwgZW50ZXIgUGhhc2UtSUkgYW5kIHJpbmcgdGhlIGRvb3JiZWxsLgorCSAqCisJICogV2UgaGF2ZSB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyBmb3IgUGhhc2UtSUk6CisJICogICAgIDEuIFdlIHdhbnQgdG8gZXhlY3V0ZSBQaGFzZS1JSSBvbmx5IHdoZW4gdGhlcmUgYXJlIG5vIENQVXMKKwkgKiBjdXJyZW50bHkgZXhlY3V0aW5nIGluIFBoYXNlLUkKKwkgKiAgICAgMi4gT25jZSB3ZSBzdGFydCBQaGFzZS1JSSB3ZSB3YW50IHRvIGF2b2lkIGFsbCBvdGhlciBDUFVzIGZyb20KKwkgKiBlbnRlcmluZyBQaGFzZS1JLgorCSAqICAgICAzLiBXZSB3YW50IG9ubHkgb25lIENQVSBhbW9uZyBhbGwgdGhvc2Ugd2hvIHdlbnQgdGhyb3VnaCBQaGFzZS1JCisJICogdG8gcnVuIHBoYXNlLUlJCisJICoKKwkgKiBJZiB3cml0ZV90cnlsb2NrIGZhaWxzIHRvIGdldCB0aGUgbG9jayBhbmQgZG9lc24ndCB0cmFuc2ZlciB0aGUKKwkgKiBQQ0Mgb3duZXJzaGlwIHRvIHRoZSBwbGF0Zm9ybSwgdGhlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyB3aWxsIGJlIFRSVUUKKwkgKiAgICAgMS4gVGhlcmUgaXMgYXQtbGVhc3Qgb25lIENQVSBpbiBQaGFzZS1JIHdoaWNoIHdpbGwgbGF0ZXIgZXhlY3V0ZQorCSAqIHdyaXRlX3RyeWxvY2ssIHNvIHRoZSBDUFVzIGluIFBoYXNlLUkgd2lsbCBiZSByZXNwb25zaWJsZSBmb3IKKwkgKiBleGVjdXRpbmcgdGhlIFBoYXNlLUlJLgorCSAqICAgICAyLiBTb21lIG90aGVyIENQVSBoYXMgYmVhdGVuIHRoaXMgQ1BVIHRvIHN1Y2Nlc3NmdWxseSBleGVjdXRlIHRoZQorCSAqIHdyaXRlX3RyeWxvY2sgYW5kIGhhcyBhbHJlYWR5IGFjcXVpcmVkIHRoZSB3cml0ZV9sb2NrLiBXZSBrbm93IGZvciBhCisJICogZmFjdCBpdChvdGhlciBDUFUgYWNxdWlyaW5nIHRoZSB3cml0ZV9sb2NrKSBjb3VsZG4ndCBoYXZlIGhhcHBlbmVkCisJICogYmVmb3JlIHRoaXMgQ1BVJ3MgUGhhc2UtSSBhcyB3ZSBoZWxkIHRoZSByZWFkX2xvY2suCisJICogICAgIDMuIFNvbWUgb3RoZXIgQ1BVIGV4ZWN1dGluZyBwY2MgQ01EX1JFQUQgaGFzIHN0b2xlbiB0aGUKKwkgKiBkb3duX3dyaXRlLCBpbiB3aGljaCBjYXNlLCBzZW5kX3BjY19jbWQgd2lsbCBjaGVjayBmb3IgcGVuZGluZworCSAqIENNRF9XUklURSBjb21tYW5kcyBieSBjaGVja2luZyB0aGUgcGVuZGluZ19wY2Nfd3JpdGVfY21kLgorCSAqIFNvIHRoaXMgQ1BVIGNhbiBiZSBjZXJ0YWluIHRoYXQgaXRzIHJlcXVlc3Qgd2lsbCBiZSBkZWxpdmVyZWQKKwkgKiAgICBTbyBpbiBhbGwgY2FzZXMsIHRoaXMgQ1BVIGtub3dzIHRoYXQgaXRzIHJlcXVlc3Qgd2lsbCBiZSBkZWxpdmVyZWQKKwkgKiBieSBhbm90aGVyIENQVSBhbmQgY2FuIHJldHVybgorCSAqCisJICogQWZ0ZXIgZ2V0dGluZyB0aGUgZG93bl93cml0ZSB3ZSBzdGlsbCBuZWVkIHRvIGNoZWNrIGZvcgorCSAqIHBlbmRpbmdfcGNjX3dyaXRlX2NtZCB0byB0YWtlIGNhcmUgb2YgdGhlIGZvbGxvd2luZyBzY2VuYXJpbworCSAqICAgIFRoZSB0aHJlYWQgcnVubmluZyB0aGlzIGNvZGUgY291bGQgYmUgc2NoZWR1bGVkIG91dCBiZXR3ZWVuCisJICogUGhhc2UtSSBhbmQgUGhhc2UtSUkuIEJlZm9yZSBpdCBpcyBzY2hlZHVsZWQgYmFjayBvbiwgYW5vdGhlciBDUFUKKwkgKiBjb3VsZCBoYXZlIGRlbGl2ZXJlZCB0aGUgcmVxdWVzdCB0byBQbGF0Zm9ybSBieSB0cmlnZ2VyaW5nIHRoZQorCSAqIGRvb3JiZWxsIGFuZCB0cmFuc2ZlcnJlZCB0aGUgb3duZXJzaGlwIG9mIFBDQyB0byBwbGF0Zm9ybS4gU28gdGhpcworCSAqIGF2b2lkcyB0cmlnZ2VyaW5nIGFuIHVubmVjZXNzYXJ5IGRvb3JiZWxsIGFuZCBtb3JlIGltcG9ydGFudGx5IGJlZm9yZQorCSAqIHRyaWdnZXJpbmcgdGhlIGRvb3JiZWxsIGl0IG1ha2VzIHN1cmUgdGhhdCB0aGUgUENDIGNoYW5uZWwgb3duZXJzaGlwCisJICogaXMgc3RpbGwgd2l0aCBPU1BNLgorCSAqICAgcGVuZGluZ19wY2Nfd3JpdGVfY21kIGNhbiBhbHNvIGJlIGNsZWFyZWQgYnkgYSBkaWZmZXJlbnQgQ1BVLCBpZgorCSAqIHRoZXJlIHdhcyBhIHBjYyBDTURfUkVBRCB3YWl0aW5nIG9uIGRvd25fd3JpdGUgYW5kIGl0IHN0ZWFscyB0aGUgbG9jaworCSAqIGJlZm9yZSB0aGUgcGNjIENNRF9XUklURSBpcyBjb21wbGV0ZWQuIHBjY19zZW5kX2NtZCBjaGVja3MgZm9yIHRoaXMKKwkgKiBjYXNlIGR1cmluZyBhIENNRF9SRUFEIGFuZCBpZiB0aGVyZSBhcmUgcGVuZGluZyB3cml0ZXMgaXQgZGVsaXZlcnMKKwkgKiB0aGUgd3JpdGUgY29tbWFuZCBiZWZvcmUgc2VydmljaW5nIHRoZSByZWFkIGNvbW1hbmQKKwkgKi8KKwlpZiAoQ1BDX0lOX1BDQyhkZXNpcmVkX3JlZykpIHsKKwkJaWYgKGRvd25fd3JpdGVfdHJ5bG9jaygmcGNjX2RhdGEucGNjX2xvY2spKSB7CS8qIEJFR0lOIFBoYXNlLUlJICovCisJCQkvKiBVcGRhdGUgb25seSBpZiB0aGVyZSBhcmUgcGVuZGluZyB3cml0ZSBjb21tYW5kcyAqLworCQkJaWYgKHBjY19kYXRhLnBlbmRpbmdfcGNjX3dyaXRlX2NtZCkKKwkJCQlzZW5kX3BjY19jbWQoQ01EX1dSSVRFKTsKKwkJCXVwX3dyaXRlKCZwY2NfZGF0YS5wY2NfbG9jayk7CQkvKiBFTkQgUGhhc2UtSUkgKi8KKwkJfSBlbHNlCisJCQkvKiBXYWl0IHVudGlsIHBjY193cml0ZV9jbnQgaXMgdXBkYXRlZCBieSBzZW5kX3BjY19jbWQgKi8KKwkJCXdhaXRfZXZlbnQocGNjX2RhdGEucGNjX3dyaXRlX3dhaXRfcSwKKwkJCQljcGNfZGVzYy0+d3JpdGVfY21kX2lkICE9IHBjY19kYXRhLnBjY193cml0ZV9jbnQpOworCisJCS8qIHNlbmRfcGNjX2NtZCB1cGRhdGVzIHRoZSBzdGF0dXMgaW4gY2FzZSBvZiBmYWlsdXJlICovCisJCXJldCA9IGNwY19kZXNjLT53cml0ZV9jbWRfc3RhdHVzOwogCX0KLWJ1c3lfY2hhbm5lbDoKLQlzcGluX3VubG9jaygmcGNjX2xvY2spOwotCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwcGNfc2V0X3BlcmYpOworCisvKioKKyAqIGNwcGNfZ2V0X3RyYW5zaXRpb25fbGF0ZW5jeSAtIHJldHVybnMgZnJlcXVlbmN5IHRyYW5zaXRpb24gbGF0ZW5jeSBpbiBucworICoKKyAqIEFDUEkgQ1BQQyBkb2VzIG5vdCBleHBsaWNpdGx5IHNwZWNpZml5IGhvdyBhIHBsYXRmb3JtIGNhbiBzcGVjaWZ5IHRoZQorICogdHJhbnNpdGlvbiBsYXRlbmN5IGZvciBwZXJmcm9tYW5jZSBjaGFuZ2UgcmVxdWVzdHMuIFRoZSBjbG9zZXN0IHdlIGhhdmUKKyAqIGlzIHRoZSB0aW1pbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUgUENDVCB0YWJsZXMgd2hpY2ggcHJvdmlkZXMgdGhlIGluZm8KKyAqIG9uIHRoZSBudW1iZXIgYW5kIGZyZXF1ZW5jeSBvZiBQQ0MgY29tbWFuZHMgdGhlIHBsYXRmb3JtIGNhbiBoYW5kbGUuCisgKi8KK3Vuc2lnbmVkIGludCBjcHBjX2dldF90cmFuc2l0aW9uX2xhdGVuY3koaW50IGNwdV9udW0pCit7CisJLyoKKwkgKiBFeHBlY3RlZCB0cmFuc2l0aW9uIGxhdGVuY3kgaXMgYmFzZWQgb24gdGhlIFBDQ1QgdGltaW5nIHZhbHVlcworCSAqIEJlbG93IGFyZSBkZWZpbml0aW9uIGZyb20gQUNQSSBzcGVjOgorCSAqIHBjY19ub21pbmFsLSBFeHBlY3RlZCBsYXRlbmN5IHRvIHByb2Nlc3MgYSBjb21tYW5kLCBpbiBtaWNyb3NlY29uZHMKKwkgKiBwY2NfbXBhciAgIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHBlcmlvZGljIHJlcXVlc3RzIHRoYXQgdGhlIHN1YnNwYWNlCisJICogICAgICAgICAgICAgIGNoYW5uZWwgY2FuIHN1cHBvcnQsIHJlcG9ydGVkIGluIGNvbW1hbmRzIHBlciBtaW51dGUuIDAKKwkgKiAgICAgICAgICAgICAgaW5kaWNhdGVzIG5vIGxpbWl0YXRpb24uCisJICogcGNjX21ydHQgICAtIFRoZSBtaW5pbXVtIGFtb3VudCBvZiB0aW1lIHRoYXQgT1NQTSBtdXN0IHdhaXQgYWZ0ZXIgdGhlCisJICogICAgICAgICAgICAgIGNvbXBsZXRpb24gb2YgYSBjb21tYW5kIGJlZm9yZSBpc3N1aW5nIHRoZSBuZXh0IGNvbW1hbmQsCisJICogICAgICAgICAgICAgIGluIG1pY3Jvc2Vjb25kcy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgbGF0ZW5jeV9ucyA9IDA7CisJc3RydWN0IGNwY19kZXNjICpjcGNfZGVzYzsKKwlzdHJ1Y3QgY3BjX3JlZ2lzdGVyX3Jlc291cmNlICpkZXNpcmVkX3JlZzsKKworCWNwY19kZXNjID0gcGVyX2NwdShjcGNfZGVzY19wdHIsIGNwdV9udW0pOworCWlmICghY3BjX2Rlc2MpCisJCXJldHVybiBDUFVGUkVRX0VURVJOQUw7CisKKwlkZXNpcmVkX3JlZyA9ICZjcGNfZGVzYy0+Y3BjX3JlZ3NbREVTSVJFRF9QRVJGXTsKKwlpZiAoIUNQQ19JTl9QQ0MoZGVzaXJlZF9yZWcpKQorCQlyZXR1cm4gQ1BVRlJFUV9FVEVSTkFMOworCisJaWYgKHBjY19kYXRhLnBjY19tcGFyKQorCQlsYXRlbmN5X25zID0gNjAgKiAoMTAwMCAqIDEwMDAgKiAxMDAwIC8gcGNjX2RhdGEucGNjX21wYXIpOworCisJbGF0ZW5jeV9ucyA9IG1heChsYXRlbmN5X25zLCBwY2NfZGF0YS5wY2Nfbm9taW5hbCAqIDEwMDApOworCWxhdGVuY3lfbnMgPSBtYXgobGF0ZW5jeV9ucywgcGNjX2RhdGEucGNjX21ydHQgKiAxMDAwKTsKKworCXJldHVybiBsYXRlbmN5X25zOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3BwY19nZXRfdHJhbnNpdGlvbl9sYXRlbmN5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9lYy5jIGIvZHJpdmVycy9hY3BpL2VjLmMKaW5kZXggZTdiZDU3Yy4uNjgwNTMxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2VjLmMKKysrIGIvZHJpdmVycy9hY3BpL2VjLmMKQEAgLTEwNCwxMCArMTA0LDEyIEBACiAjZGVmaW5lIEFDUElfRUNfTUFYX1FVRVJJRVMJMTYJLyogTWF4aW11bSBudW1iZXIgb2YgcGFyYWxsZWwgcXVlcmllcyAqLwogCiBlbnVtIHsKKwlFQ19GTEFHU19RVUVSWV9FTkFCTEVELAkJLyogUXVlcnkgaXMgZW5hYmxlZCAqLwogCUVDX0ZMQUdTX1FVRVJZX1BFTkRJTkcsCQkvKiBRdWVyeSBpcyBwZW5kaW5nICovCiAJRUNfRkxBR1NfUVVFUllfR1VBUkRJTkcsCS8qIEd1YXJkIGZvciBTQ0lfRVZUIGNoZWNrICovCiAJRUNfRkxBR1NfR1BFX0hBTkRMRVJfSU5TVEFMTEVELAkvKiBHUEUgaGFuZGxlciBpbnN0YWxsZWQgKi8KIAlFQ19GTEFHU19FQ19IQU5ETEVSX0lOU1RBTExFRCwJLyogT3BSZWcgaGFuZGxlciBpbnN0YWxsZWQgKi8KKwlFQ19GTEFHU19FVlRfSEFORExFUl9JTlNUQUxMRUQsIC8qIF9ReHggaGFuZGxlcnMgaW5zdGFsbGVkICovCiAJRUNfRkxBR1NfU1RBUlRFRCwJCS8qIERyaXZlciBpcyBzdGFydGVkICovCiAJRUNfRkxBR1NfU1RPUFBFRCwJCS8qIERyaXZlciBpcyBzdG9wcGVkICovCiAJRUNfRkxBR1NfQ09NTUFORF9TVE9STSwJCS8qIEdQRSBzdG9ybXMgb2NjdXJyZWQgdG8gdGhlCkBAIC0xNDUsNiArMTQ3LDEwIEBACiBtb2R1bGVfcGFyYW0oZWNfc3Rvcm1fdGhyZXNob2xkLCB1aW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZWNfc3Rvcm1fdGhyZXNob2xkLCAiTWF4aW0gZmFsc2UgR1BFIG51bWJlcnMgbm90IGNvbnNpZGVyZWQgYXMgR1BFIHN0b3JtIik7CiAKK3N0YXRpYyBib29sIGVjX2ZyZWV6ZV9ldmVudHMgX19yZWFkX21vc3RseSA9IHRydWU7Cittb2R1bGVfcGFyYW0oZWNfZnJlZXplX2V2ZW50cywgYm9vbCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVjX2ZyZWV6ZV9ldmVudHMsICJEaXNhYmxpbmcgZXZlbnQgaGFuZGxpbmcgZHVyaW5nIHN1c3BlbmQvcmVzdW1lIik7CisKIHN0cnVjdCBhY3BpX2VjX3F1ZXJ5X2hhbmRsZXIgewogCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKIAlhY3BpX2VjX3F1ZXJ5X2Z1bmMgZnVuYzsKQEAgLTE3OSw2ICsxODUsNyBAQAogCiBzdHJ1Y3QgYWNwaV9lYyAqYm9vdF9lYywgKmZpcnN0X2VjOwogRVhQT1JUX1NZTUJPTChmaXJzdF9lYyk7CitzdGF0aWMgYm9vbCBib290X2VjX2lzX2VjZHQgPSBmYWxzZTsKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZWNfcXVlcnlfd3E7CiAKIHN0YXRpYyBpbnQgRUNfRkxBR1NfQ0xFQVJfT05fUkVTVU1FOyAvKiBOZWVkcyBhY3BpX2VjX2NsZWFyKCkgb24gYm9vdC9yZXN1bWUgKi8KQEAgLTIzOSw2ICsyNDYsMzAgQEAKIAkgICAgICAgIXRlc3RfYml0KEVDX0ZMQUdTX1NUT1BQRUQsICZlYy0+ZmxhZ3MpOwogfQogCitzdGF0aWMgYm9vbCBhY3BpX2VjX2V2ZW50X2VuYWJsZWQoc3RydWN0IGFjcGlfZWMgKmVjKQoreworCS8qCisJICogVGhlcmUgaXMgYW4gT1NQTSBlYXJseSBzdGFnZSBsb2dpYy4gRHVyaW5nIHRoZSBlYXJseSBzdGFnZXMKKwkgKiAoYm9vdC9yZXN1bWUpLCBPU1BNcyBzaG91bGRuJ3QgZW5hYmxlIHRoZSBldmVudCBoYW5kbGluZywgb25seQorCSAqIHRoZSBFQyB0cmFuc2FjdGlvbnMgYXJlIGFsbG93ZWQgdG8gYmUgcGVyZm9ybWVkLgorCSAqLworCWlmICghdGVzdF9iaXQoRUNfRkxBR1NfUVVFUllfRU5BQkxFRCwgJmVjLT5mbGFncykpCisJCXJldHVybiBmYWxzZTsKKwkvKgorCSAqIEhvd2V2ZXIsIGRpc2FibGluZyB0aGUgZXZlbnQgaGFuZGxpbmcgaXMgZXhwZXJpbWVudGFsIGZvciBsYXRlCisJICogc3RhZ2UgKHN1c3BlbmQpLCBhbmQgaXMgY29udHJvbGxlZCBieSB0aGUgYm9vdCBwYXJhbWV0ZXIgb2YKKwkgKiAiZWNfZnJlZXplX2V2ZW50cyI6CisJICogMS4gdHJ1ZTogIFRoZSBFQyBldmVudCBoYW5kbGluZyBpcyBkaXNhYmxlZCBiZWZvcmUgZW50ZXJpbmcKKwkgKiAgICAgICAgICAgdGhlIG5vaXJxIHN0YWdlLgorCSAqIDIuIGZhbHNlOiBUaGUgRUMgZXZlbnQgaGFuZGxpbmcgaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCBhcworCSAqICAgICAgICAgICBzb29uIGFzIHRoZSBFQyBkcml2ZXIgaXMgc3RvcHBlZC4KKwkgKi8KKwlpZiAoZWNfZnJlZXplX2V2ZW50cykKKwkJcmV0dXJuIGFjcGlfZWNfc3RhcnRlZChlYyk7CisJZWxzZQorCQlyZXR1cm4gdGVzdF9iaXQoRUNfRkxBR1NfU1RBUlRFRCwgJmVjLT5mbGFncyk7Cit9CisKIHN0YXRpYyBib29sIGFjcGlfZWNfZmx1c2hlZChzdHJ1Y3QgYWNwaV9lYyAqZWMpCiB7CiAJcmV0dXJuIGVjLT5yZWZlcmVuY2VfY291bnQgPT0gMTsKQEAgLTQyOSw3ICs0NjAsOCBAQAogCiBzdGF0aWMgdm9pZCBhY3BpX2VjX3N1Ym1pdF9xdWVyeShzdHJ1Y3QgYWNwaV9lYyAqZWMpCiB7Ci0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEVDX0ZMQUdTX1FVRVJZX1BFTkRJTkcsICZlYy0+ZmxhZ3MpKSB7CisJaWYgKGFjcGlfZWNfZXZlbnRfZW5hYmxlZChlYykgJiYKKwkgICAgIXRlc3RfYW5kX3NldF9iaXQoRUNfRkxBR1NfUVVFUllfUEVORElORywgJmVjLT5mbGFncykpIHsKIAkJZWNfZGJnX2V2dCgiQ29tbWFuZCglcykgc3VibWl0dGVkL2Jsb2NrZWQiLAogCQkJICAgYWNwaV9lY19jbWRfc3RyaW5nKEFDUElfRUNfQ09NTUFORF9RVUVSWSkpOwogCQllYy0+bnJfcGVuZGluZ19xdWVyaWVzKys7CkBAIC00NDYsNiArNDc4LDg2IEBACiAJfQogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgX19hY3BpX2VjX2VuYWJsZV9ldmVudChzdHJ1Y3QgYWNwaV9lYyAqZWMpCit7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEVDX0ZMQUdTX1FVRVJZX0VOQUJMRUQsICZlYy0+ZmxhZ3MpKQorCQllY19sb2dfZHJ2KCJldmVudCB1bmJsb2NrZWQiKTsKKwlpZiAoIXRlc3RfYml0KEVDX0ZMQUdTX1FVRVJZX1BFTkRJTkcsICZlYy0+ZmxhZ3MpKQorCQlhZHZhbmNlX3RyYW5zYWN0aW9uKGVjKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fYWNwaV9lY19kaXNhYmxlX2V2ZW50KHN0cnVjdCBhY3BpX2VjICplYykKK3sKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEVDX0ZMQUdTX1FVRVJZX0VOQUJMRUQsICZlYy0+ZmxhZ3MpKQorCQllY19sb2dfZHJ2KCJldmVudCBibG9ja2VkIik7Cit9CisKKy8qCisgKiBQcm9jZXNzIF9RIGV2ZW50cyB0aGF0IG1pZ2h0IGhhdmUgYWNjdW11bGF0ZWQgaW4gdGhlIEVDLgorICogUnVuIHdpdGggbG9ja2VkIGVjIG11dGV4LgorICovCitzdGF0aWMgdm9pZCBhY3BpX2VjX2NsZWFyKHN0cnVjdCBhY3BpX2VjICplYykKK3sKKwlpbnQgaSwgc3RhdHVzOworCXU4IHZhbHVlID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX0VDX0NMRUFSX01BWDsgaSsrKSB7CisJCXN0YXR1cyA9IGFjcGlfZWNfcXVlcnkoZWMsICZ2YWx1ZSk7CisJCWlmIChzdGF0dXMgfHwgIXZhbHVlKQorCQkJYnJlYWs7CisJfQorCWlmICh1bmxpa2VseShpID09IEFDUElfRUNfQ0xFQVJfTUFYKSkKKwkJcHJfd2FybigiV2FybmluZzogTWF4aW11bSBvZiAlZCBzdGFsZSBFQyBldmVudHMgY2xlYXJlZFxuIiwgaSk7CisJZWxzZQorCQlwcl9pbmZvKCIlZCBzdGFsZSBFQyBldmVudHMgY2xlYXJlZFxuIiwgaSk7Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfZWNfZW5hYmxlX2V2ZW50KHN0cnVjdCBhY3BpX2VjICplYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVjLT5sb2NrLCBmbGFncyk7CisJaWYgKGFjcGlfZWNfc3RhcnRlZChlYykpCisJCV9fYWNwaV9lY19lbmFibGVfZXZlbnQoZWMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVjLT5sb2NrLCBmbGFncyk7CisKKwkvKiBEcmFpbiBhZGRpdGlvbmFsIGV2ZW50cyBpZiBoYXJkd2FyZSByZXF1aXJlcyB0aGF0ICovCisJaWYgKEVDX0ZMQUdTX0NMRUFSX09OX1JFU1VNRSkKKwkJYWNwaV9lY19jbGVhcihlYyk7Cit9CisKK3N0YXRpYyBib29sIGFjcGlfZWNfcXVlcnlfZmx1c2hlZChzdHJ1Y3QgYWNwaV9lYyAqZWMpCit7CisJYm9vbCBmbHVzaGVkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPmxvY2ssIGZsYWdzKTsKKwlmbHVzaGVkID0gIWVjLT5ucl9wZW5kaW5nX3F1ZXJpZXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZmx1c2hlZDsKK30KKworc3RhdGljIHZvaWQgX19hY3BpX2VjX2ZsdXNoX2V2ZW50KHN0cnVjdCBhY3BpX2VjICplYykKK3sKKwkvKgorCSAqIFdoZW4gZWNfZnJlZXplX2V2ZW50cyBpcyB0cnVlLCB3ZSBuZWVkIHRvIGZsdXNoIGV2ZW50cyBpbgorCSAqIHRoZSBwcm9wZXIgcG9zaXRpb24gYmVmb3JlIGVudGVyaW5nIHRoZSBub2lycSBzdGFnZS4KKwkgKi8KKwl3YWl0X2V2ZW50KGVjLT53YWl0LCBhY3BpX2VjX3F1ZXJ5X2ZsdXNoZWQoZWMpKTsKKwlpZiAoZWNfcXVlcnlfd3EpCisJCWZsdXNoX3dvcmtxdWV1ZShlY19xdWVyeV93cSk7Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfZWNfZGlzYWJsZV9ldmVudChzdHJ1Y3QgYWNwaV9lYyAqZWMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlYy0+bG9jaywgZmxhZ3MpOworCV9fYWNwaV9lY19kaXNhYmxlX2V2ZW50KGVjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlYy0+bG9jaywgZmxhZ3MpOworCV9fYWNwaV9lY19mbHVzaF9ldmVudChlYyk7Cit9CisKIHN0YXRpYyBib29sIGFjcGlfZWNfZ3VhcmRfZXZlbnQoc3RydWN0IGFjcGlfZWMgKmVjKQogewogCWJvb2wgZ3VhcmRlZCA9IHRydWU7CkBAIC04MzIsMjcgKzk0NCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGVjX2dldF9oYW5kbGUpOwogCi0vKgotICogUHJvY2VzcyBfUSBldmVudHMgdGhhdCBtaWdodCBoYXZlIGFjY3VtdWxhdGVkIGluIHRoZSBFQy4KLSAqIFJ1biB3aXRoIGxvY2tlZCBlYyBtdXRleC4KLSAqLwotc3RhdGljIHZvaWQgYWNwaV9lY19jbGVhcihzdHJ1Y3QgYWNwaV9lYyAqZWMpCi17Ci0JaW50IGksIHN0YXR1czsKLQl1OCB2YWx1ZSA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9FQ19DTEVBUl9NQVg7IGkrKykgewotCQlzdGF0dXMgPSBhY3BpX2VjX3F1ZXJ5KGVjLCAmdmFsdWUpOwotCQlpZiAoc3RhdHVzIHx8ICF2YWx1ZSkKLQkJCWJyZWFrOwotCX0KLQotCWlmICh1bmxpa2VseShpID09IEFDUElfRUNfQ0xFQVJfTUFYKSkKLQkJcHJfd2FybigiV2FybmluZzogTWF4aW11bSBvZiAlZCBzdGFsZSBFQyBldmVudHMgY2xlYXJlZFxuIiwgaSk7Ci0JZWxzZQotCQlwcl9pbmZvKCIlZCBzdGFsZSBFQyBldmVudHMgY2xlYXJlZFxuIiwgaSk7Ci19Ci0KIHN0YXRpYyB2b2lkIGFjcGlfZWNfc3RhcnQoc3RydWN0IGFjcGlfZWMgKmVjLCBib29sIHJlc3VtaW5nKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC04OTYsNyArOTg3LDggQEAKIAkJaWYgKCFzdXNwZW5kaW5nKSB7CiAJCQlhY3BpX2VjX2NvbXBsZXRlX3JlcXVlc3QoZWMpOwogCQkJZWNfZGJnX3JlZihlYywgIkRlY3JlYXNlIGRyaXZlciIpOwotCQl9CisJCX0gZWxzZSBpZiAoIWVjX2ZyZWV6ZV9ldmVudHMpCisJCQlfX2FjcGlfZWNfZGlzYWJsZV9ldmVudChlYyk7CiAJCWNsZWFyX2JpdChFQ19GTEFHU19TVEFSVEVELCAmZWMtPmZsYWdzKTsKIAkJY2xlYXJfYml0KEVDX0ZMQUdTX1NUT1BQRUQsICZlYy0+ZmxhZ3MpOwogCQllY19sb2dfZHJ2KCJFQyBzdG9wcGVkIik7CkBAIC05MTksMjAgKzEwMTEsNiBAQAogCiB2b2lkIGFjcGlfZWNfdW5ibG9ja190cmFuc2FjdGlvbnModm9pZCkKIHsKLQlzdHJ1Y3QgYWNwaV9lYyAqZWMgPSBmaXJzdF9lYzsKLQotCWlmICghZWMpCi0JCXJldHVybjsKLQotCS8qIEFsbG93IHRyYW5zYWN0aW9ucyB0byBiZSBjYXJyaWVkIG91dCBhZ2FpbiAqLwotCWFjcGlfZWNfc3RhcnQoZWMsIHRydWUpOwotCi0JaWYgKEVDX0ZMQUdTX0NMRUFSX09OX1JFU1VNRSkKLQkJYWNwaV9lY19jbGVhcihlYyk7Ci19Ci0KLXZvaWQgYWNwaV9lY191bmJsb2NrX3RyYW5zYWN0aW9uc19lYXJseSh2b2lkKQotewogCS8qCiAJICogQWxsb3cgdHJhbnNhY3Rpb25zIHRvIGhhcHBlbiBhZ2FpbiAodGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbQogCSAqIGF0b21pYyBjb250ZXh0IGR1cmluZyB3YWtldXAsIHNvIHdlIGRvbid0IG5lZWQgdG8gYWNxdWlyZSB0aGUgbXV0ZXgpLgpAQCAtMTIyOCwxMyArMTMwNiwyMSBAQAogc3RhdGljIGFjcGlfc3RhdHVzCiBlY19wYXJzZV9pb19wb3J0cyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmNvbnRleHQpOwogCi1zdGF0aWMgc3RydWN0IGFjcGlfZWMgKm1ha2VfYWNwaV9lYyh2b2lkKQorc3RhdGljIHZvaWQgYWNwaV9lY19mcmVlKHN0cnVjdCBhY3BpX2VjICplYykKK3sKKwlpZiAoZmlyc3RfZWMgPT0gZWMpCisJCWZpcnN0X2VjID0gTlVMTDsKKwlpZiAoYm9vdF9lYyA9PSBlYykKKwkJYm9vdF9lYyA9IE5VTEw7CisJa2ZyZWUoZWMpOworfQorCitzdGF0aWMgc3RydWN0IGFjcGlfZWMgKmFjcGlfZWNfYWxsb2Modm9pZCkKIHsKIAlzdHJ1Y3QgYWNwaV9lYyAqZWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9lYyksIEdGUF9LRVJORUwpOwogCiAJaWYgKCFlYykKIAkJcmV0dXJuIE5VTEw7Ci0JZWMtPmZsYWdzID0gMSA8PCBFQ19GTEFHU19RVUVSWV9QRU5ESU5HOwogCW11dGV4X2luaXQoJmVjLT5tdXRleCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZWMtPndhaXQpOwogCUlOSVRfTElTVF9IRUFEKCZlYy0+bGlzdCk7CkBAIC0xMjkwLDcgKzEzNzYsMTIgQEAKIAlyZXR1cm4gQUVfQ1RSTF9URVJNSU5BVEU7CiB9CiAKLXN0YXRpYyBpbnQgZWNfaW5zdGFsbF9oYW5kbGVycyhzdHJ1Y3QgYWNwaV9lYyAqZWMpCisvKgorICogTm90ZTogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUgb25seSB3aGVuIHRoZSBhZGRyZXNzIHNwYWNlCisgKiAgICAgICBoYW5kbGVyIGlzIG5vdCBpbnN0YWxsZWQsIHdoaWNoIG1lYW5zICJub3QgYWJsZSB0byBoYW5kbGUKKyAqICAgICAgIHRyYW5zYWN0aW9ucyIuCisgKi8KK3N0YXRpYyBpbnQgZWNfaW5zdGFsbF9oYW5kbGVycyhzdHJ1Y3QgYWNwaV9lYyAqZWMsIGJvb2wgaGFuZGxlX2V2ZW50cykKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKQEAgLTEzMTksNiArMTQxMCwxNiBAQAogCQlzZXRfYml0KEVDX0ZMQUdTX0VDX0hBTkRMRVJfSU5TVEFMTEVELCAmZWMtPmZsYWdzKTsKIAl9CiAKKwlpZiAoIWhhbmRsZV9ldmVudHMpCisJCXJldHVybiAwOworCisJaWYgKCF0ZXN0X2JpdChFQ19GTEFHU19FVlRfSEFORExFUl9JTlNUQUxMRUQsICZlYy0+ZmxhZ3MpKSB7CisJCS8qIEZpbmQgYW5kIHJlZ2lzdGVyIGFsbCBxdWVyeSBtZXRob2RzICovCisJCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX01FVEhPRCwgZWMtPmhhbmRsZSwgMSwKKwkJCQkgICAgYWNwaV9lY19yZWdpc3Rlcl9xdWVyeV9tZXRob2RzLAorCQkJCSAgICBOVUxMLCBlYywgTlVMTCk7CisJCXNldF9iaXQoRUNfRkxBR1NfRVZUX0hBTkRMRVJfSU5TVEFMTEVELCAmZWMtPmZsYWdzKTsKKwl9CiAJaWYgKCF0ZXN0X2JpdChFQ19GTEFHU19HUEVfSEFORExFUl9JTlNUQUxMRUQsICZlYy0+ZmxhZ3MpKSB7CiAJCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ncGVfcmF3X2hhbmRsZXIoTlVMTCwgZWMtPmdwZSwKIAkJCQkJICBBQ1BJX0dQRV9FREdFX1RSSUdHRVJFRCwKQEAgLTEzMjksNiArMTQzMCw5IEBACiAJCQlpZiAodGVzdF9iaXQoRUNfRkxBR1NfU1RBUlRFRCwgJmVjLT5mbGFncykgJiYKIAkJCSAgICBlYy0+cmVmZXJlbmNlX2NvdW50ID49IDEpCiAJCQkJYWNwaV9lY19lbmFibGVfZ3BlKGVjLCB0cnVlKTsKKworCQkJLyogRUMgaXMgZnVsbHkgb3BlcmF0aW9uYWwsIGFsbG93IHF1ZXJpZXMgKi8KKwkJCWFjcGlfZWNfZW5hYmxlX2V2ZW50KGVjKTsKIAkJfQogCX0KIApAQCAtMTM2MywyMyArMTQ2NywxMDQgQEAKIAkJCXByX2VycigiZmFpbGVkIHRvIHJlbW92ZSBncGUgaGFuZGxlclxuIik7CiAJCWNsZWFyX2JpdChFQ19GTEFHU19HUEVfSEFORExFUl9JTlNUQUxMRUQsICZlYy0+ZmxhZ3MpOwogCX0KKwlpZiAodGVzdF9iaXQoRUNfRkxBR1NfRVZUX0hBTkRMRVJfSU5TVEFMTEVELCAmZWMtPmZsYWdzKSkgeworCQlhY3BpX2VjX3JlbW92ZV9xdWVyeV9oYW5kbGVycyhlYywgdHJ1ZSwgMCk7CisJCWNsZWFyX2JpdChFQ19GTEFHU19FVlRfSEFORExFUl9JTlNUQUxMRUQsICZlYy0+ZmxhZ3MpOworCX0KIH0KIAotc3RhdGljIHN0cnVjdCBhY3BpX2VjICphY3BpX2VjX2FsbG9jKHZvaWQpCitzdGF0aWMgaW50IGFjcGlfZWNfc2V0dXAoc3RydWN0IGFjcGlfZWMgKmVjLCBib29sIGhhbmRsZV9ldmVudHMpCiB7Ci0Jc3RydWN0IGFjcGlfZWMgKmVjOworCWludCByZXQ7CiAKLQkvKiBDaGVjayBmb3IgYm9vdCBFQyAqLwotCWlmIChib290X2VjKSB7Ci0JCWVjID0gYm9vdF9lYzsKLQkJYm9vdF9lYyA9IE5VTEw7Ci0JCWVjX3JlbW92ZV9oYW5kbGVycyhlYyk7Ci0JCWlmIChmaXJzdF9lYyA9PSBlYykKLQkJCWZpcnN0X2VjID0gTlVMTDsKLQl9IGVsc2UgewotCQllYyA9IG1ha2VfYWNwaV9lYygpOworCXJldCA9IGVjX2luc3RhbGxfaGFuZGxlcnMoZWMsIGhhbmRsZV9ldmVudHMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBGaXJzdCBFQyBjYXBhYmxlIG9mIGhhbmRsaW5nIHRyYW5zYWN0aW9ucyAqLworCWlmICghZmlyc3RfZWMpIHsKKwkJZmlyc3RfZWMgPSBlYzsKKwkJYWNwaV9oYW5kbGVfaW5mbyhmaXJzdF9lYy0+aGFuZGxlLCAiVXNlZCBhcyBmaXJzdCBFQ1xuIik7CiAJfQotCXJldHVybiBlYzsKKworCWFjcGlfaGFuZGxlX2luZm8oZWMtPmhhbmRsZSwKKwkJCSAiR1BFPTB4JWx4LCBFQ19DTUQvRUNfU0M9MHglbHgsIEVDX0RBVEE9MHglbHhcbiIsCisJCQkgZWMtPmdwZSwgZWMtPmNvbW1hbmRfYWRkciwgZWMtPmRhdGFfYWRkcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhY3BpX2NvbmZpZ19ib290X2VjKHN0cnVjdCBhY3BpX2VjICplYywgYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJICAgICAgIGJvb2wgaGFuZGxlX2V2ZW50cywgYm9vbCBpc19lY2R0KQoreworCWludCByZXQ7CisKKwkvKgorCSAqIENoYW5naW5nIHRoZSBBQ1BJIGhhbmRsZSByZXN1bHRzIGluIGEgcmUtY29uZmlndXJhdGlvbiBvZiB0aGUKKwkgKiBib290IEVDLiBBbmQgaWYgaXQgaGFwcGVucyBhZnRlciB0aGUgbmFtZXNwYWNlIGluaXRpYWxpemF0aW9uLAorCSAqIGl0IGNhdXNlcyBfUkVHIGV2YWx1YXRpb25zLgorCSAqLworCWlmIChib290X2VjICYmIGJvb3RfZWMtPmhhbmRsZSAhPSBoYW5kbGUpCisJCWVjX3JlbW92ZV9oYW5kbGVycyhib290X2VjKTsKKworCS8qIFVuc2V0IG9sZCBib290IEVDICovCisJaWYgKGJvb3RfZWMgIT0gZWMpCisJCWFjcGlfZWNfZnJlZShib290X2VjKTsKKworCS8qCisJICogRUNEVCBkZXZpY2UgY3JlYXRpb24gaXMgc3BsaXQgaW50byBhY3BpX2VjX2VjZHRfcHJvYmUoKSBhbmQKKwkgKiBhY3BpX2VjX2VjZHRfc3RhcnQoKS4gVGhpcyBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIGNvbXBsZXRpbmcgdGhlCisJICogRUNEVCBwYXJzaW5nIGxvZ2ljIGFzIHRoZSBoYW5kbGUgdXBkYXRlIHNob3VsZCBiZSBwZXJmb3JtZWQKKwkgKiBiZXR3ZWVuIHRoZSBpbnN0YWxsYXRpb24vdW5pbnN0YWxsYXRpb24gb2YgdGhlIGhhbmRsZXJzLgorCSAqLworCWlmIChlYy0+aGFuZGxlICE9IGhhbmRsZSkKKwkJZWMtPmhhbmRsZSA9IGhhbmRsZTsKKworCXJldCA9IGFjcGlfZWNfc2V0dXAoZWMsIGhhbmRsZV9ldmVudHMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBTZXQgbmV3IGJvb3QgRUMgKi8KKwlpZiAoIWJvb3RfZWMpIHsKKwkJYm9vdF9lYyA9IGVjOworCQlib290X2VjX2lzX2VjZHQgPSBpc19lY2R0OworCX0KKworCWFjcGlfaGFuZGxlX2luZm8oYm9vdF9lYy0+aGFuZGxlLAorCQkJICJVc2VkIGFzIGJvb3QgJXMgRUMgdG8gaGFuZGxlIHRyYW5zYWN0aW9ucyVzXG4iLAorCQkJIGlzX2VjZHQgPyAiRUNEVCIgOiAiRFNEVCIsCisJCQkgaGFuZGxlX2V2ZW50cyA/ICIgYW5kIGV2ZW50cyIgOiAiIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJvb2wgYWNwaV9lY19lY2R0X2dldF9oYW5kbGUoYWNwaV9oYW5kbGUgKnBoYW5kbGUpCit7CisJc3RydWN0IGFjcGlfdGFibGVfZWNkdCAqZWNkdF9wdHI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfU0lHX0VDRFQsIDEsCisJCQkJKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKikmZWNkdF9wdHIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIGZhbHNlOworCisJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKE5VTEwsIGVjZHRfcHRyLT5pZCwgJmhhbmRsZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkqcGhhbmRsZSA9IGhhbmRsZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgYWNwaV9pc19ib290X2VjKHN0cnVjdCBhY3BpX2VjICplYykKK3sKKwlpZiAoIWJvb3RfZWMpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoZWMtPmhhbmRsZSA9PSBib290X2VjLT5oYW5kbGUgJiYKKwkgICAgZWMtPmdwZSA9PSBib290X2VjLT5ncGUgJiYKKwkgICAgZWMtPmNvbW1hbmRfYWRkciA9PSBib290X2VjLT5jb21tYW5kX2FkZHIgJiYKKwkgICAgZWMtPmRhdGFfYWRkciA9PSBib290X2VjLT5kYXRhX2FkZHIpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIGludCBhY3BpX2VjX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKQEAgLTEzOTUsMTYgKzE1ODAsMjEgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJaWYgKGVjX3BhcnNlX2RldmljZShkZXZpY2UtPmhhbmRsZSwgMCwgZWMsIE5VTEwpICE9CiAJCUFFX0NUUkxfVEVSTUlOQVRFKSB7Ci0JCQlrZnJlZShlYyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9hbGxvYzsKIAl9CiAKLQkvKiBGaW5kIGFuZCByZWdpc3RlciBhbGwgcXVlcnkgbWV0aG9kcyAqLwotCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX01FVEhPRCwgZWMtPmhhbmRsZSwgMSwKLQkJCSAgICBhY3BpX2VjX3JlZ2lzdGVyX3F1ZXJ5X21ldGhvZHMsIE5VTEwsIGVjLCBOVUxMKTsKKwlpZiAoYWNwaV9pc19ib290X2VjKGVjKSkgeworCQlib290X2VjX2lzX2VjZHQgPSBmYWxzZTsKKwkJYWNwaV9oYW5kbGVfZGVidWcoZWMtPmhhbmRsZSwgImR1cGxpY2F0ZWQuXG4iKTsKKwkJYWNwaV9lY19mcmVlKGVjKTsKKwkJZWMgPSBib290X2VjOworCQlyZXQgPSBhY3BpX2NvbmZpZ19ib290X2VjKGVjLCBlYy0+aGFuZGxlLCB0cnVlLCBmYWxzZSk7CisJfSBlbHNlCisJCXJldCA9IGFjcGlfZWNfc2V0dXAoZWMsIHRydWUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3F1ZXJ5OwogCi0JaWYgKCFmaXJzdF9lYykKLQkJZmlyc3RfZWMgPSBlYzsKIAlkZXZpY2UtPmRyaXZlcl9kYXRhID0gZWM7CiAKIAlyZXQgPSAhIXJlcXVlc3RfcmVnaW9uKGVjLT5kYXRhX2FkZHIsIDEsICJFQyBkYXRhIik7CkBAIC0xNDEyLDIwICsxNjAyLDE3IEBACiAJcmV0ID0gISFyZXF1ZXN0X3JlZ2lvbihlYy0+Y29tbWFuZF9hZGRyLCAxLCAiRUMgY21kIik7CiAJV0FSTighcmV0LCAiQ291bGQgbm90IHJlcXVlc3QgRUMgY21kIGlvIHBvcnQgMHglbHgiLCBlYy0+Y29tbWFuZF9hZGRyKTsKIAotCXByX2luZm8oIkdQRSA9IDB4JWx4LCBJL086IGNvbW1hbmQvc3RhdHVzID0gMHglbHgsIGRhdGEgPSAweCVseFxuIiwKLQkJCSAgZWMtPmdwZSwgZWMtPmNvbW1hbmRfYWRkciwgZWMtPmRhdGFfYWRkcik7Ci0KLQlyZXQgPSBlY19pbnN0YWxsX2hhbmRsZXJzKGVjKTsKLQogCS8qIFJlcHJvYmUgZGV2aWNlcyBkZXBlbmRpbmcgb24gdGhlIEVDICovCiAJYWNwaV93YWxrX2RlcF9kZXZpY2VfbGlzdChlYy0+aGFuZGxlKTsKKwlhY3BpX2hhbmRsZV9kZWJ1ZyhlYy0+aGFuZGxlLCAiZW51bWVyYXRlZC5cbiIpOworCXJldHVybiAwOwogCi0JLyogRUMgaXMgZnVsbHkgb3BlcmF0aW9uYWwsIGFsbG93IHF1ZXJpZXMgKi8KLQljbGVhcl9iaXQoRUNfRkxBR1NfUVVFUllfUEVORElORywgJmVjLT5mbGFncyk7Ci0KLQkvKiBDbGVhciBzdGFsZSBfUSBldmVudHMgaWYgaGFyZHdhcmUgbWlnaHQgcmVxdWlyZSB0aGF0ICovCi0JaWYgKEVDX0ZMQUdTX0NMRUFSX09OX1JFU1VNRSkKLQkJYWNwaV9lY19jbGVhcihlYyk7CitlcnJfcXVlcnk6CisJaWYgKGVjICE9IGJvb3RfZWMpCisJCWFjcGlfZWNfcmVtb3ZlX3F1ZXJ5X2hhbmRsZXJzKGVjLCB0cnVlLCAwKTsKK2Vycl9hbGxvYzoKKwlpZiAoZWMgIT0gYm9vdF9lYykKKwkJYWNwaV9lY19mcmVlKGVjKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDM3LDE0ICsxNjI0LDEzIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJZWMgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7Ci0JZWNfcmVtb3ZlX2hhbmRsZXJzKGVjKTsKLQlhY3BpX2VjX3JlbW92ZV9xdWVyeV9oYW5kbGVycyhlYywgdHJ1ZSwgMCk7CiAJcmVsZWFzZV9yZWdpb24oZWMtPmRhdGFfYWRkciwgMSk7CiAJcmVsZWFzZV9yZWdpb24oZWMtPmNvbW1hbmRfYWRkciwgMSk7CiAJZGV2aWNlLT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JaWYgKGVjID09IGZpcnN0X2VjKQotCQlmaXJzdF9lYyA9IE5VTEw7Ci0Ja2ZyZWUoZWMpOworCWlmIChlYyAhPSBib290X2VjKSB7CisJCWVjX3JlbW92ZV9oYW5kbGVycyhlYyk7CisJCWFjcGlfZWNfZnJlZShlYyk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0xNDg2LDkgKzE2NzIsOCBAQAogCWlmICghZWMpCiAJCXJldHVybiAtRU5PTUVNOwogCS8qCi0JICogRmluZGluZyBFQyBmcm9tIERTRFQgaWYgdGhlcmUgaXMgbm8gRUNEVCBFQyBhdmFpbGFibGUuIFdoZW4gdGhpcwotCSAqIGZ1bmN0aW9uIGlzIGludm9rZWQsIEFDUEkgdGFibGVzIGhhdmUgYmVlbiBmdWxseSBsb2FkZWQsIHdlIGNhbgotCSAqIHdhbGsgbmFtZXNwYWNlIG5vdy4KKwkgKiBBdCB0aGlzIHBvaW50LCB0aGUgbmFtZXNwYWNlIGlzIGluaXRpYWxpemVkLCBzbyBzdGFydCB0byBmaW5kCisJICogdGhlIG5hbWVzcGFjZSBvYmplY3RzLgogCSAqLwogCXN0YXR1cyA9IGFjcGlfZ2V0X2RldmljZXMoZWNfZGV2aWNlX2lkc1swXS5pZCwKIAkJCQkgIGVjX3BhcnNlX2RldmljZSwgZWMsIE5VTEwpOwpAQCAtMTQ5NiwxNiArMTY4MSw0NyBAQAogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycm9yOwogCX0KLQlyZXQgPSBlY19pbnN0YWxsX2hhbmRsZXJzKGVjKTsKLQorCS8qCisJICogV2hlbiB0aGUgRFNEVCBFQyBpcyBhdmFpbGFibGUsIGFsd2F5cyByZS1jb25maWd1cmUgYm9vdCBFQyB0bworCSAqIGhhdmUgX1JFRyBldmFsdWF0ZWQuIF9SRUcgY2FuIG9ubHkgYmUgZXZhbHVhdGVkIGFmdGVyIHRoZQorCSAqIG5hbWVzcGFjZSBpbml0aWFsaXphdGlvbi4KKwkgKiBBdCB0aGlzIHBvaW50LCB0aGUgR1BFIGlzIG5vdCBmdWxseSBpbml0aWFsaXplZCwgc28gZG8gbm90IHRvCisJICogaGFuZGxlIHRoZSBldmVudHMuCisJICovCisJcmV0ID0gYWNwaV9jb25maWdfYm9vdF9lYyhlYywgZWMtPmhhbmRsZSwgZmFsc2UsIGZhbHNlKTsKIGVycm9yOgogCWlmIChyZXQpCi0JCWtmcmVlKGVjKTsKLQllbHNlCi0JCWZpcnN0X2VjID0gYm9vdF9lYyA9IGVjOworCQlhY3BpX2VjX2ZyZWUoZWMpOwogCXJldHVybiByZXQ7CiB9CiAKKy8qCisgKiBJZiB0aGUgRFNEVCBFQyBpcyBub3QgZnVuY3Rpb25pbmcsIHdlIHN0aWxsIG5lZWQgdG8gcHJlcGFyZSBhIGZ1bGx5CisgKiBmdW5jdGlvbmluZyBFQ0RUIEVDIGZpcnN0IGluIG9yZGVyIHRvIGhhbmRsZSB0aGUgZXZlbnRzLgorICogaHR0cHM6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTUwMjEKKyAqLworaW50IF9faW5pdCBhY3BpX2VjX2VjZHRfc3RhcnQodm9pZCkKK3sKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisKKwlpZiAoIWJvb3RfZWMpCisJCXJldHVybiAtRU5PREVWOworCS8qCisJICogVGhlIERTRFQgRUMgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQgaW4KKwkgKiBhY3BpX2VjX2FkZCgpLgorCSAqLworCWlmICghYm9vdF9lY19pc19lY2R0KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICogQXQgdGhpcyBwb2ludCwgdGhlIG5hbWVzcGFjZSBhbmQgdGhlIEdQRSBpcyBpbml0aWFsaXplZCwgc28KKwkgKiBzdGFydCB0byBmaW5kIHRoZSBuYW1lc3BhY2Ugb2JqZWN0cyBhbmQgaGFuZGxlIHRoZSBldmVudHMuCisJICovCisJaWYgKCFhY3BpX2VjX2VjZHRfZ2V0X2hhbmRsZSgmaGFuZGxlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIGFjcGlfY29uZmlnX2Jvb3RfZWMoYm9vdF9lYywgaGFuZGxlLCB0cnVlLCB0cnVlKTsKK30KKwogI2lmIDAKIC8qCiAgKiBTb21lIEVDIGZpcm13YXJlIHZhcmlhdGlvbnMgcmVmdXNlcyB0byByZXNwb25kIFFSX0VDIHdoZW4gU0NJX0VWVCBpcyBub3QKQEAgLTE2MDAsNyArMTgxNiw2IEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JcHJfaW5mbygiRUMgZGVzY3JpcHRpb24gdGFibGUgaXMgZm91bmQsIGNvbmZpZ3VyaW5nIGJvb3QgRUNcbiIpOwogCWlmIChFQ19GTEFHU19DT1JSRUNUX0VDRFQpIHsKIAkJZWMtPmNvbW1hbmRfYWRkciA9IGVjZHRfcHRyLT5kYXRhLmFkZHJlc3M7CiAJCWVjLT5kYXRhX2FkZHIgPSBlY2R0X3B0ci0+Y29udHJvbC5hZGRyZXNzOwpAQCAtMTYwOSwxNiArMTgyNCw5MCBAQAogCQllYy0+ZGF0YV9hZGRyID0gZWNkdF9wdHItPmRhdGEuYWRkcmVzczsKIAl9CiAJZWMtPmdwZSA9IGVjZHRfcHRyLT5ncGU7Ci0JZWMtPmhhbmRsZSA9IEFDUElfUk9PVF9PQkpFQ1Q7Ci0JcmV0ID0gZWNfaW5zdGFsbF9oYW5kbGVycyhlYyk7CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQsIHRoZSBuYW1lc3BhY2UgaXMgbm90IGluaXRpYWxpemVkLCBzbyBkbyBub3QgZmluZAorCSAqIHRoZSBuYW1lc3BhY2Ugb2JqZWN0cywgb3IgaGFuZGxlIHRoZSBldmVudHMuCisJICovCisJcmV0ID0gYWNwaV9jb25maWdfYm9vdF9lYyhlYywgQUNQSV9ST09UX09CSkVDVCwgZmFsc2UsIHRydWUpOwogZXJyb3I6CiAJaWYgKHJldCkKLQkJa2ZyZWUoZWMpOwotCWVsc2UKLQkJZmlyc3RfZWMgPSBib290X2VjID0gZWM7CisJCWFjcGlfZWNfZnJlZShlYyk7CiAJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIHZvaWQgYWNwaV9lY19lbnRlcl9ub2lycShzdHJ1Y3QgYWNwaV9lYyAqZWMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChlYyA9PSBmaXJzdF9lYykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPmxvY2ssIGZsYWdzKTsKKwkJZWMtPnNhdmVkX2J1c3lfcG9sbGluZyA9IGVjX2J1c3lfcG9sbGluZzsKKwkJZWMtPnNhdmVkX3BvbGxpbmdfZ3VhcmQgPSBlY19wb2xsaW5nX2d1YXJkOworCQllY19idXN5X3BvbGxpbmcgPSB0cnVlOworCQllY19wb2xsaW5nX2d1YXJkID0gMDsKKwkJZWNfbG9nX2RydigiaW50ZXJydXB0IGJsb2NrZWQiKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfZWNfbGVhdmVfbm9pcnEoc3RydWN0IGFjcGlfZWMgKmVjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZWMgPT0gZmlyc3RfZWMpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmVjLT5sb2NrLCBmbGFncyk7CisJCWVjX2J1c3lfcG9sbGluZyA9IGVjLT5zYXZlZF9idXN5X3BvbGxpbmc7CisJCWVjX3BvbGxpbmdfZ3VhcmQgPSBlYy0+c2F2ZWRfcG9sbGluZ19ndWFyZDsKKwkJZWNfbG9nX2RydigiaW50ZXJydXB0IHVuYmxvY2tlZCIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlYy0+bG9jaywgZmxhZ3MpOworCX0KK30KKworc3RhdGljIGludCBhY3BpX2VjX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhY3BpX2VjICplYyA9CisJCWFjcGlfZHJpdmVyX2RhdGEodG9fYWNwaV9kZXZpY2UoZGV2KSk7CisKKwlhY3BpX2VjX2VudGVyX25vaXJxKGVjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY3BpX2VjX3Jlc3VtZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFjcGlfZWMgKmVjID0KKwkJYWNwaV9kcml2ZXJfZGF0YSh0b19hY3BpX2RldmljZShkZXYpKTsKKworCWFjcGlfZWNfbGVhdmVfbm9pcnEoZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjcGlfZWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFjcGlfZWMgKmVjID0KKwkJYWNwaV9kcml2ZXJfZGF0YSh0b19hY3BpX2RldmljZShkZXYpKTsKKworCWlmIChlY19mcmVlemVfZXZlbnRzKQorCQlhY3BpX2VjX2Rpc2FibGVfZXZlbnQoZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjcGlfZWNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWNwaV9lYyAqZWMgPQorCQlhY3BpX2RyaXZlcl9kYXRhKHRvX2FjcGlfZGV2aWNlKGRldikpOworCisJYWNwaV9lY19lbmFibGVfZXZlbnQoZWMpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBhY3BpX2VjX3BtID0geworCVNFVF9OT0lSUV9TWVNURU1fU0xFRVBfUE1fT1BTKGFjcGlfZWNfc3VzcGVuZF9ub2lycSwgYWNwaV9lY19yZXN1bWVfbm9pcnEpCisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoYWNwaV9lY19zdXNwZW5kLCBhY3BpX2VjX3Jlc3VtZSkKK307CisKIHN0YXRpYyBpbnQgcGFyYW1fc2V0X2V2ZW50X2NsZWFyaW5nKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCiB7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC0xNjY0LDYgKzE5NTMsNyBAQAogCQkuYWRkID0gYWNwaV9lY19hZGQsCiAJCS5yZW1vdmUgPSBhY3BpX2VjX3JlbW92ZSwKIAkJfSwKKwkuZHJ2LnBtID0gJmFjcGlfZWNfcG0sCiB9OwogCiBzdGF0aWMgaW5saW5lIGludCBhY3BpX2VjX3F1ZXJ5X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9pbnRlcm5hbC5oIGIvZHJpdmVycy9hY3BpL2ludGVybmFsLmgKaW5kZXggOTQwMjE4Zi4uMWI0MWEyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9hY3BpL2ludGVybmFsLmgKQEAgLTQwLDEwICs0MCw4IEBACiB2b2lkIGFjcGlfY29udGFpbmVyX2luaXQodm9pZCk7CiB2b2lkIGFjcGlfbWVtb3J5X2hvdHBsdWdfaW5pdCh2b2lkKTsKICNpZmRlZglDT05GSUdfQUNQSV9IT1RQTFVHX0lPQVBJQwotaW50IGFjcGlfaW9hcGljX2FkZChzdHJ1Y3QgYWNwaV9wY2lfcm9vdCAqcm9vdCk7CiBpbnQgYWNwaV9pb2FwaWNfcmVtb3ZlKHN0cnVjdCBhY3BpX3BjaV9yb290ICpyb290KTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBhY3BpX2lvYXBpY19hZGQoc3RydWN0IGFjcGlfcGNpX3Jvb3QgKnJvb3QpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IGFjcGlfaW9hcGljX3JlbW92ZShzdHJ1Y3QgYWNwaV9wY2lfcm9vdCAqcm9vdCkgeyByZXR1cm4gMDsgfQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0FDUElfRE9DSwpAQCAtMTE2LDcgKzExNCw2IEBACiBib29sIGFjcGlfZGV2aWNlX2lzX2JhdHRlcnkoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KTsKIGJvb2wgYWNwaV9kZXZpY2VfaXNfZmlyc3RfcGh5c2ljYWxfbm9kZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsCiAJCQkJCWNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldik7Ci1zdHJ1Y3QgZGV2aWNlICphY3BpX2dldF9maXJzdF9waHlzaWNhbF9ub2RlKHN0cnVjdCBhY3BpX2RldmljZSAqYWRldik7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UgTWF0Y2hpbmcgYW5kIE5vdGlmaWNhdGlvbgpAQCAtMTc0LDYgKzE3MSw4IEBACiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJdW5zaWduZWQgbG9uZyB0aW1lc3RhbXA7CiAJdW5zaWduZWQgbG9uZyBucl9wZW5kaW5nX3F1ZXJpZXM7CisJYm9vbCBzYXZlZF9idXN5X3BvbGxpbmc7CisJdW5zaWduZWQgaW50IHNhdmVkX3BvbGxpbmdfZ3VhcmQ7CiB9OwogCiBleHRlcm4gc3RydWN0IGFjcGlfZWMgKmZpcnN0X2VjOwpAQCAtMTg1LDkgKzE4NCw5IEBACiBpbnQgYWNwaV9lY19pbml0KHZvaWQpOwogaW50IGFjcGlfZWNfZWNkdF9wcm9iZSh2b2lkKTsKIGludCBhY3BpX2VjX2RzZHRfcHJvYmUodm9pZCk7CitpbnQgYWNwaV9lY19lY2R0X3N0YXJ0KHZvaWQpOwogdm9pZCBhY3BpX2VjX2Jsb2NrX3RyYW5zYWN0aW9ucyh2b2lkKTsKIHZvaWQgYWNwaV9lY191bmJsb2NrX3RyYW5zYWN0aW9ucyh2b2lkKTsKLXZvaWQgYWNwaV9lY191bmJsb2NrX3RyYW5zYWN0aW9uc19lYXJseSh2b2lkKTsKIGludCBhY3BpX2VjX2FkZF9xdWVyeV9oYW5kbGVyKHN0cnVjdCBhY3BpX2VjICplYywgdTggcXVlcnlfYml0LAogCQkJICAgICAgYWNwaV9oYW5kbGUgaGFuZGxlLCBhY3BpX2VjX3F1ZXJ5X2Z1bmMgZnVuYywKIAkJCSAgICAgIHZvaWQgKmRhdGEpOwpAQCAtMjI1LDQgKzIyNCwxNCBAQAogdm9pZCBhY3BpX2luaXRfcHJvcGVydGllcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpOwogdm9pZCBhY3BpX2ZyZWVfcHJvcGVydGllcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpOwogCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJV2F0Y2hkb2cKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIENPTkZJR19BQ1BJX1dBVENIRE9HCit2b2lkIGFjcGlfd2F0Y2hkb2dfaW5pdCh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV93YXRjaGRvZ19pbml0KHZvaWQpIHt9CisjZW5kaWYKKwogI2VuZGlmIC8qIF9BQ1BJX0lOVEVSTkFMX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaW9hcGljLmMgYi9kcml2ZXJzL2FjcGkvaW9hcGljLmMKaW5kZXggY2NkYzhkYi4uNmQ3Y2U2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2lvYXBpYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9pb2FwaWMuYwpAQCAtNDYsNyArNDYsNyBAQAogCXN0cnVjdCByZXNvdXJjZV93aW4gd2luOwogCiAJcmVzLT5mbGFncyA9IDA7Ci0JaWYgKGFjcGlfZGV2X2ZpbHRlcl9yZXNvdXJjZV90eXBlKGFjcGlfcmVzLCBJT1JFU09VUkNFX01FTSkgPT0gMCkKKwlpZiAoYWNwaV9kZXZfZmlsdGVyX3Jlc291cmNlX3R5cGUoYWNwaV9yZXMsIElPUkVTT1VSQ0VfTUVNKSkKIAkJcmV0dXJuIEFFX09LOwogCiAJaWYgKCFhY3BpX2Rldl9yZXNvdXJjZV9tZW1vcnkoYWNwaV9yZXMsIHJlcykpIHsKQEAgLTk3LDcgKzk3LDcgQEAKIAl1bnNpZ25lZCBsb25nIGxvbmcgZ3NpX2Jhc2U7CiAJc3RydWN0IGFjcGlfcGNpX2lvYXBpYyAqaW9hcGljOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gTlVMTDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IE5VTEwsICpwY2lfcmVzID0gTlVMTCwgKmNyc19yZXM7CiAJY2hhciAqdHlwZSA9IE5VTEw7CiAKIAlpZiAoIWFjcGlfaXNfaW9hcGljKGhhbmRsZSwgJnR5cGUpKQpAQCAtMTM3LDIzICsxMzcsMzAgQEAKIAkJcGNpX3NldF9tYXN0ZXIoZGV2KTsKIAkJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIDAsIHR5cGUpKQogCQkJZ290byBleGl0X2Rpc2FibGU7Ci0JCXJlcyA9ICZkZXYtPnJlc291cmNlWzBdOworCQlwY2lfcmVzID0gJmRldi0+cmVzb3VyY2VbMF07CiAJCWlvYXBpYy0+cGRldiA9IGRldjsKIAl9IGVsc2UgewogCQlwY2lfZGV2X3B1dChkZXYpOwogCQlkZXYgPSBOVUxMOwotCi0JCXJlcyA9ICZpb2FwaWMtPnJlczsKLQkJYWNwaV93YWxrX3Jlc291cmNlcyhoYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsIHNldHVwX3JlcywgcmVzKTsKLQkJaWYgKHJlcy0+ZmxhZ3MgPT0gMCkgewotCQkJYWNwaV9oYW5kbGVfd2FybihoYW5kbGUsICJmYWlsZWQgdG8gZ2V0IHJlc291cmNlXG4iKTsKLQkJCWdvdG8gZXhpdF9mcmVlOwotCQl9IGVsc2UgaWYgKHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCByZXMpKSB7Ci0JCQlhY3BpX2hhbmRsZV93YXJuKGhhbmRsZSwgImZhaWxlZCB0byBpbnNlcnQgcmVzb3VyY2VcbiIpOwotCQkJZ290byBleGl0X2ZyZWU7Ci0JCX0KIAl9CiAKKwljcnNfcmVzID0gJmlvYXBpYy0+cmVzOworCWFjcGlfd2Fsa19yZXNvdXJjZXMoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLCBzZXR1cF9yZXMsIGNyc19yZXMpOworCWNyc19yZXMtPm5hbWUgPSB0eXBlOworCWNyc19yZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfQlVTWTsKKwlpZiAoY3JzX3Jlcy0+ZmxhZ3MgPT0gMCkgeworCQlhY3BpX2hhbmRsZV93YXJuKGhhbmRsZSwgImZhaWxlZCB0byBnZXQgcmVzb3VyY2VcbiIpOworCQlnb3RvIGV4aXRfcmVsZWFzZTsKKwl9IGVsc2UgaWYgKGluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIGNyc19yZXMpKSB7CisJCWFjcGlfaGFuZGxlX3dhcm4oaGFuZGxlLCAiZmFpbGVkIHRvIGluc2VydCByZXNvdXJjZVxuIik7CisJCWdvdG8gZXhpdF9yZWxlYXNlOworCX0KKworCS8qIHRyeSBwY2kgcmVzb3VyY2UgZmlyc3QsIHRoZW4gIl9DUlMiIHJlc291cmNlICovCisJcmVzID0gcGNpX3JlczsKKwlpZiAoIXJlcyB8fCAhcmVzLT5mbGFncykKKwkJcmVzID0gY3JzX3JlczsKKwogCWlmIChhY3BpX3JlZ2lzdGVyX2lvYXBpYyhoYW5kbGUsIHJlcy0+c3RhcnQsICh1MzIpZ3NpX2Jhc2UpKSB7CiAJCWFjcGlfaGFuZGxlX3dhcm4oaGFuZGxlLCAiZmFpbGVkIHRvIHJlZ2lzdGVyIElPQVBJQ1xuIik7CiAJCWdvdG8gZXhpdF9yZWxlYXNlOwpAQCAtMTc0LDE0ICsxODEsMTMgQEAKIGV4aXRfcmVsZWFzZToKIAlpZiAoZGV2KQogCQlwY2lfcmVsZWFzZV9yZWdpb24oZGV2LCAwKTsKLQllbHNlCi0JCXJlbGVhc2VfcmVzb3VyY2UocmVzKTsKKwlpZiAoaW9hcGljLT5yZXMuZmxhZ3MgJiYgaW9hcGljLT5yZXMucGFyZW50KQorCQlyZWxlYXNlX3Jlc291cmNlKCZpb2FwaWMtPnJlcyk7CiBleGl0X2Rpc2FibGU6CiAJaWYgKGRldikKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CiBleGl0X3B1dDoKIAlwY2lfZGV2X3B1dChkZXYpOwotZXhpdF9mcmVlOgogCWtmcmVlKGlvYXBpYyk7CiBleGl0OgogCW11dGV4X3VubG9jaygmaW9hcGljX2xpc3RfbG9jayk7CkBAIC0xODksMTMgKzE5NSwxMyBAQAogCXJldHVybiBBRV9PSzsKIH0KIAotaW50IGFjcGlfaW9hcGljX2FkZChzdHJ1Y3QgYWNwaV9wY2lfcm9vdCAqcm9vdCkKK2ludCBhY3BpX2lvYXBpY19hZGQoYWNwaV9oYW5kbGUgcm9vdF9oYW5kbGUpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzLCByZXR2YWwgPSBBRV9PSzsKIAotCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgcm9vdC0+ZGV2aWNlLT5oYW5kbGUsCisJc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCByb290X2hhbmRsZSwKIAkJCQkgICAgIFVJTlRfTUFYLCBoYW5kbGVfaW9hcGljX2FkZCwgTlVMTCwKLQkJCQkgICAgIHJvb3QtPmRldmljZS0+aGFuZGxlLCAodm9pZCAqKikmcmV0dmFsKTsKKwkJCQkgICAgIHJvb3RfaGFuZGxlLCAodm9pZCAqKikmcmV0dmFsKTsKIAogCXJldHVybiBBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiBBQ1BJX1NVQ0NFU1MocmV0dmFsKSA/IDAgOiAtRU5PREVWOwogfQpAQCAtMjE3LDkgKzIyMyw5IEBACiAJCQlwY2lfcmVsZWFzZV9yZWdpb24oaW9hcGljLT5wZGV2LCAwKTsKIAkJCXBjaV9kaXNhYmxlX2RldmljZShpb2FwaWMtPnBkZXYpOwogCQkJcGNpX2Rldl9wdXQoaW9hcGljLT5wZGV2KTsKLQkJfSBlbHNlIGlmIChpb2FwaWMtPnJlcy5mbGFncyAmJiBpb2FwaWMtPnJlcy5wYXJlbnQpIHsKLQkJCXJlbGVhc2VfcmVzb3VyY2UoJmlvYXBpYy0+cmVzKTsKIAkJfQorCQlpZiAoaW9hcGljLT5yZXMuZmxhZ3MgJiYgaW9hcGljLT5yZXMucGFyZW50KQorCQkJcmVsZWFzZV9yZXNvdXJjZSgmaW9hcGljLT5yZXMpOwogCQlsaXN0X2RlbCgmaW9hcGljLT5saXN0KTsKIAkJa2ZyZWUoaW9hcGljKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmZpdC9jb3JlLmMgYi9kcml2ZXJzL2FjcGkvbmZpdC9jb3JlLmMKaW5kZXggODBjYzdjMC4uZTFkNWVhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25maXQvY29yZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9uZml0L2NvcmUuYwpAQCAtOTQsNTQgKzk0LDUwIEBACiAJcmV0dXJuIHRvX2FjcGlfZGV2aWNlKGFjcGlfZGVzYy0+ZGV2KTsKIH0KIAotc3RhdGljIGludCB4bGF0X3N0YXR1cyh2b2lkICpidWYsIHVuc2lnbmVkIGludCBjbWQpCitzdGF0aWMgaW50IHhsYXRfc3RhdHVzKHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGNtZCwgdTMyIHN0YXR1cykKIHsKIAlzdHJ1Y3QgbmRfY21kX2NsZWFyX2Vycm9yICpjbGVhcl9lcnI7CiAJc3RydWN0IG5kX2NtZF9hcnNfc3RhdHVzICphcnNfc3RhdHVzOwotCXN0cnVjdCBuZF9jbWRfYXJzX3N0YXJ0ICphcnNfc3RhcnQ7Ci0Jc3RydWN0IG5kX2NtZF9hcnNfY2FwICphcnNfY2FwOwogCXUxNiBmbGFnczsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBORF9DTURfQVJTX0NBUDoKLQkJYXJzX2NhcCA9IGJ1ZjsKLQkJaWYgKChhcnNfY2FwLT5zdGF0dXMgJiAweGZmZmYpID09IE5GSVRfQVJTX0NBUF9OT05FKQorCQlpZiAoKHN0YXR1cyAmIDB4ZmZmZikgPT0gTkZJVF9BUlNfQ0FQX05PTkUpCiAJCQlyZXR1cm4gLUVOT1RUWTsKIAogCQkvKiBDb21tYW5kIGZhaWxlZCAqLwotCQlpZiAoYXJzX2NhcC0+c3RhdHVzICYgMHhmZmZmKQorCQlpZiAoc3RhdHVzICYgMHhmZmZmKQogCQkJcmV0dXJuIC1FSU87CiAKIAkJLyogTm8gc3VwcG9ydGVkIHNjYW4gdHlwZXMgZm9yIHRoaXMgcmFuZ2UgKi8KIAkJZmxhZ3MgPSBORF9BUlNfUEVSU0lTVEVOVCB8IE5EX0FSU19WT0xBVElMRTsKLQkJaWYgKChhcnNfY2FwLT5zdGF0dXMgPj4gMTYgJiBmbGFncykgPT0gMCkKKwkJaWYgKChzdGF0dXMgPj4gMTYgJiBmbGFncykgPT0gMCkKIAkJCXJldHVybiAtRU5PVFRZOwogCQlicmVhazsKIAljYXNlIE5EX0NNRF9BUlNfU1RBUlQ6Ci0JCWFyc19zdGFydCA9IGJ1ZjsKIAkJLyogQVJTIGlzIGluIHByb2dyZXNzICovCi0JCWlmICgoYXJzX3N0YXJ0LT5zdGF0dXMgJiAweGZmZmYpID09IE5GSVRfQVJTX1NUQVJUX0JVU1kpCisJCWlmICgoc3RhdHVzICYgMHhmZmZmKSA9PSBORklUX0FSU19TVEFSVF9CVVNZKQogCQkJcmV0dXJuIC1FQlVTWTsKIAogCQkvKiBDb21tYW5kIGZhaWxlZCAqLwotCQlpZiAoYXJzX3N0YXJ0LT5zdGF0dXMgJiAweGZmZmYpCisJCWlmIChzdGF0dXMgJiAweGZmZmYpCiAJCQlyZXR1cm4gLUVJTzsKIAkJYnJlYWs7CiAJY2FzZSBORF9DTURfQVJTX1NUQVRVUzoKIAkJYXJzX3N0YXR1cyA9IGJ1ZjsKIAkJLyogQ29tbWFuZCBmYWlsZWQgKi8KLQkJaWYgKGFyc19zdGF0dXMtPnN0YXR1cyAmIDB4ZmZmZikKKwkJaWYgKHN0YXR1cyAmIDB4ZmZmZikKIAkJCXJldHVybiAtRUlPOwogCQkvKiBDaGVjayBleHRlbmRlZCBzdGF0dXMgKFVwcGVyIHR3byBieXRlcykgKi8KLQkJaWYgKGFyc19zdGF0dXMtPnN0YXR1cyA9PSBORklUX0FSU19TVEFUVVNfRE9ORSkKKwkJaWYgKHN0YXR1cyA9PSBORklUX0FSU19TVEFUVVNfRE9ORSkKIAkJCXJldHVybiAwOwogCiAJCS8qIEFSUyBpcyBpbiBwcm9ncmVzcyAqLwotCQlpZiAoYXJzX3N0YXR1cy0+c3RhdHVzID09IE5GSVRfQVJTX1NUQVRVU19CVVNZKQorCQlpZiAoc3RhdHVzID09IE5GSVRfQVJTX1NUQVRVU19CVVNZKQogCQkJcmV0dXJuIC1FQlVTWTsKIAogCQkvKiBObyBBUlMgcGVyZm9ybWVkIGZvciB0aGUgY3VycmVudCBib290ICovCi0JCWlmIChhcnNfc3RhdHVzLT5zdGF0dXMgPT0gTkZJVF9BUlNfU1RBVFVTX05PTkUpCisJCWlmIChzdGF0dXMgPT0gTkZJVF9BUlNfU1RBVFVTX05PTkUpCiAJCQlyZXR1cm4gLUVBR0FJTjsKIAogCQkvKgpAQCAtMTQ5LDE5ICsxNDUsMTkgQEAKIAkJICogYWdlbnQgd2FudHMgdGhlIHNjYW4gdG8gc3RvcC4gIElmIHdlIGRpZG4ndCBvdmVyZmxvdwogCQkgKiB0aGVuIGp1c3QgY29udGludWUgd2l0aCB0aGUgcmV0dXJuZWQgcmVzdWx0cy4KIAkJICovCi0JCWlmIChhcnNfc3RhdHVzLT5zdGF0dXMgPT0gTkZJVF9BUlNfU1RBVFVTX0lOVFIpIHsKKwkJaWYgKHN0YXR1cyA9PSBORklUX0FSU19TVEFUVVNfSU5UUikgewogCQkJaWYgKGFyc19zdGF0dXMtPmZsYWdzICYgTkZJVF9BUlNfRl9PVkVSRkxPVykKIAkJCQlyZXR1cm4gLUVOT1NQQzsKIAkJCXJldHVybiAwOwogCQl9CiAKIAkJLyogVW5rbm93biBzdGF0dXMgKi8KLQkJaWYgKGFyc19zdGF0dXMtPnN0YXR1cyA+PiAxNikKKwkJaWYgKHN0YXR1cyA+PiAxNikKIAkJCXJldHVybiAtRUlPOwogCQlicmVhazsKIAljYXNlIE5EX0NNRF9DTEVBUl9FUlJPUjoKIAkJY2xlYXJfZXJyID0gYnVmOwotCQlpZiAoY2xlYXJfZXJyLT5zdGF0dXMgJiAweGZmZmYpCisJCWlmIChzdGF0dXMgJiAweGZmZmYpCiAJCQlyZXR1cm4gLUVJTzsKIAkJaWYgKCFjbGVhcl9lcnItPmNsZWFyZWQpCiAJCQlyZXR1cm4gLUVJTzsKQEAgLTE3Miw2ICsxNjgsOSBAQAogCQlicmVhazsKIAl9CiAKKwkvKiBhbGwgb3RoZXIgbm9uLXplcm8gc3RhdHVzIHJlc3VsdHMgaW4gYW4gZXJyb3IgKi8KKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTg2LDEwICsxODUsMTAgQEAKIAlzdHJ1Y3QgbmRfY21kX3BrZyAqY2FsbF9wa2cgPSBOVUxMOwogCWNvbnN0IGNoYXIgKmNtZF9uYW1lLCAqZGltbV9uYW1lOwogCXVuc2lnbmVkIGxvbmcgY21kX21hc2ssIGRzbV9tYXNrOworCXUzMiBvZmZzZXQsIGZ3X3N0YXR1cyA9IDA7CiAJYWNwaV9oYW5kbGUgaGFuZGxlOwogCXVuc2lnbmVkIGludCBmdW5jOwogCWNvbnN0IHU4ICp1dWlkOwotCXUzMiBvZmZzZXQ7CiAJaW50IHJjLCBpOwogCiAJZnVuYyA9IGNtZDsKQEAgLTMxNyw2ICszMTYsMTUgQEAKIAkJCQlvdXRfb2JqLT5idWZmZXIucG9pbnRlciArIG9mZnNldCwgb3V0X3NpemUpOwogCQlvZmZzZXQgKz0gb3V0X3NpemU7CiAJfQorCisJLyoKKwkgKiBTZXQgZndfc3RhdHVzIGZvciBhbGwgdGhlIGNvbW1hbmRzIHdpdGggYSBrbm93biBmb3JtYXQgdG8gYmUKKwkgKiBsYXRlciBpbnRlcnByZXRlZCBieSB4bGF0X3N0YXR1cygpLgorCSAqLworCWlmIChpID49IDEgJiYgKChjbWQgPj0gTkRfQ01EX0FSU19DQVAgJiYgY21kIDw9IE5EX0NNRF9DTEVBUl9FUlJPUikKKwkJCXx8IChjbWQgPj0gTkRfQ01EX1NNQVJUICYmIGNtZCA8PSBORF9DTURfVkVORE9SKSkpCisJCWZ3X3N0YXR1cyA9ICoodTMyICopIG91dF9vYmotPmJ1ZmZlci5wb2ludGVyOworCiAJaWYgKG9mZnNldCArIGluX2J1Zi5idWZmZXIubGVuZ3RoIDwgYnVmX2xlbikgewogCQlpZiAoaSA+PSAxKSB7CiAJCQkvKgpAQCAtMzI1LDcgKzMzMyw3IEBACiAJCQkgKi8KIAkJCXJjID0gYnVmX2xlbiAtIG9mZnNldCAtIGluX2J1Zi5idWZmZXIubGVuZ3RoOwogCQkJaWYgKGNtZF9yYykKLQkJCQkqY21kX3JjID0geGxhdF9zdGF0dXMoYnVmLCBjbWQpOworCQkJCSpjbWRfcmMgPSB4bGF0X3N0YXR1cyhidWYsIGNtZCwgZndfc3RhdHVzKTsKIAkJfSBlbHNlIHsKIAkJCWRldl9lcnIoZGV2LCAiJXM6JXMgdW5kZXJydW4gY21kOiAlcyBidWZfbGVuOiAlZCBvdXRfbGVuOiAlZFxuIiwKIAkJCQkJX19mdW5jX18sIGRpbW1fbmFtZSwgY21kX25hbWUsIGJ1Zl9sZW4sCkBAIC0zMzUsNyArMzQzLDcgQEAKIAl9IGVsc2UgewogCQlyYyA9IDA7CiAJCWlmIChjbWRfcmMpCi0JCQkqY21kX3JjID0geGxhdF9zdGF0dXMoYnVmLCBjbWQpOworCQkJKmNtZF9yYyA9IHhsYXRfc3RhdHVzKGJ1ZiwgY21kLCBmd19zdGF0dXMpOwogCX0KIAogIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uZml0L21jZS5jIGIvZHJpdmVycy9hY3BpL25maXQvbWNlLmMKaW5kZXggNGM3NDViZi4uMTYxZjkxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25maXQvbWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL25maXQvbWNlLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShuZml0X3NwYSwgJmFjcGlfZGVzYy0+c3BhcywgbGlzdCkgewogCQkJc3RydWN0IGFjcGlfbmZpdF9zeXN0ZW1fYWRkcmVzcyAqc3BhID0gbmZpdF9zcGEtPnNwYTsKIAotCQkJaWYgKG5maXRfc3BhX3R5cGUoc3BhKSA9PSBORklUX1NQQV9QTSkKKwkJCWlmIChuZml0X3NwYV90eXBlKHNwYSkgIT0gTkZJVF9TUEFfUE0pCiAJCQkJY29udGludWU7CiAJCQkvKiBmaW5kIHRoZSBzcGEgdGhhdCBjb3ZlcnMgdGhlIG1jZSBhZGRyICovCiAJCQlpZiAoc3BhLT5hZGRyZXNzID4gbWNlLT5hZGRyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9pcnEuYyBiL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKaW5kZXggMmM0NWRkMy4uYzU3NmE2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9pcnEuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCkBAIC00MTEsNyArNDExLDE1IEBACiAJaW50IGdzaTsKIAl1OCBwaW47CiAJaW50IHRyaWdnZXJpbmcgPSBBQ1BJX0xFVkVMX1NFTlNJVElWRTsKLQlpbnQgcG9sYXJpdHkgPSBBQ1BJX0FDVElWRV9MT1c7CisJLyoKKwkgKiBPbiBBUk0gc3lzdGVtcyB3aXRoIHRoZSBHSUMgaW50ZXJydXB0IG1vZGVsLCBsZXZlbCBpbnRlcnJ1cHRzCisJICogYXJlIGFsd2F5cyBwb2xhcml0eSBoaWdoIGJ5IHNwZWNpZmljYXRpb247IFBDSSBsZWdhY3kKKwkgKiBJUlFzIGxpbmVzIGFyZSBpbnZlcnRlZCBiZWZvcmUgcmVhY2hpbmcgdGhlIGludGVycnVwdAorCSAqIGNvbnRyb2xsZXIgYW5kIG11c3QgdGhlcmVmb3JlIGJlIGNvbnNpZGVyZWQgYWN0aXZlIGhpZ2gKKwkgKiBhcyBkZWZhdWx0LgorCSAqLworCWludCBwb2xhcml0eSA9IGFjcGlfaXJxX21vZGVsID09IEFDUElfSVJRX01PREVMX0dJQyA/CisJCQkJICAgICAgQUNQSV9BQ1RJVkVfSElHSCA6IEFDUElfQUNUSVZFX0xPVzsKIAljaGFyICpsaW5rID0gTlVMTDsKIAljaGFyIGxpbmtfZGVzY1sxNl07CiAJaW50IHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9yb290LmMgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwppbmRleCBkMTQ0MTY4Li5iZjYwMWQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwpAQCAtNjE0LDcgKzYxNCwxNyBAQAogCWlmIChob3RhZGQpIHsKIAkJcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXlfYnVzKHJvb3QtPmJ1cyk7CiAJCXBjaV9hc3NpZ25fdW5hc3NpZ25lZF9yb290X2J1c19yZXNvdXJjZXMocm9vdC0+YnVzKTsKLQkJYWNwaV9pb2FwaWNfYWRkKHJvb3QpOworCQkvKgorCQkgKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGZvciB0aGUgaG90YWRkIGNhc2UuIEZvciB0aGUgYm9vdC10aW1lCisJCSAqIGNhc2UsIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBhZnRlciBQQ0kgaW5pdGlhbGl6YXRpb24gaW4KKwkJICogb3JkZXIgdG8gZGVhbCB3aXRoIElPQVBJQ3MgbWFwcGVkIGluIG9uIGEgUENJIEJBUi4KKwkJICoKKwkJICogVGhpcyBpcyBjdXJyZW50bHkgeDg2LXNwZWNpZmljLCBiZWNhdXNlIGFjcGlfaW9hcGljX2FkZCgpCisJCSAqIGlzIGFuIGVtcHR5IGZ1bmN0aW9uIHdpdGhvdXQgQ09ORklHX0FDUElfSE9UUExVR19JT0FQSUMuCisJCSAqIEFuZCBDT05GSUdfQUNQSV9IT1RQTFVHX0lPQVBJQyBkZXBlbmRzIG9uIENPTkZJR19YODZfSU9fQVBJQworCQkgKiAoc2VlIGRyaXZlcnMvYWNwaS9LY29uZmlnKS4KKwkJICovCisJCWFjcGlfaW9hcGljX2FkZChyb290LT5kZXZpY2UtPmhhbmRsZSk7CiAJfQogCiAJcGNpX2xvY2tfcmVzY2FuX3JlbW92ZSgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwppbmRleCA5MTI1ZDdkLi41Yzc4ZWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwpAQCAtMzIsMTIgKzMyLDEyIEBACiB9CiAKIHN0YXRpYyBpbnQgbWFwX2xhcGljX2lkKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqZW50cnksCi0JCSB1MzIgYWNwaV9pZCwgcGh5c19jcHVpZF90ICphcGljX2lkKQorCQkgdTMyIGFjcGlfaWQsIHBoeXNfY3B1aWRfdCAqYXBpY19pZCwgYm9vbCBpZ25vcmVfZGlzYWJsZWQpCiB7CiAJc3RydWN0IGFjcGlfbWFkdF9sb2NhbF9hcGljICpsYXBpYyA9CiAJCWNvbnRhaW5lcl9vZihlbnRyeSwgc3RydWN0IGFjcGlfbWFkdF9sb2NhbF9hcGljLCBoZWFkZXIpOwogCi0JaWYgKCEobGFwaWMtPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpKQorCWlmIChpZ25vcmVfZGlzYWJsZWQgJiYgIShsYXBpYy0+bGFwaWNfZmxhZ3MgJiBBQ1BJX01BRFRfRU5BQkxFRCkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKGxhcGljLT5wcm9jZXNzb3JfaWQgIT0gYWNwaV9pZCkKQEAgLTQ4LDEyICs0OCwxMyBAQAogfQogCiBzdGF0aWMgaW50IG1hcF94MmFwaWNfaWQoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICplbnRyeSwKLQkJaW50IGRldmljZV9kZWNsYXJhdGlvbiwgdTMyIGFjcGlfaWQsIHBoeXNfY3B1aWRfdCAqYXBpY19pZCkKKwkJaW50IGRldmljZV9kZWNsYXJhdGlvbiwgdTMyIGFjcGlfaWQsIHBoeXNfY3B1aWRfdCAqYXBpY19pZCwKKwkJYm9vbCBpZ25vcmVfZGlzYWJsZWQpCiB7CiAJc3RydWN0IGFjcGlfbWFkdF9sb2NhbF94MmFwaWMgKmFwaWMgPQogCQljb250YWluZXJfb2YoZW50cnksIHN0cnVjdCBhY3BpX21hZHRfbG9jYWxfeDJhcGljLCBoZWFkZXIpOwogCi0JaWYgKCEoYXBpYy0+bGFwaWNfZmxhZ3MgJiBBQ1BJX01BRFRfRU5BQkxFRCkpCisJaWYgKGlnbm9yZV9kaXNhYmxlZCAmJiAhKGFwaWMtPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChkZXZpY2VfZGVjbGFyYXRpb24gJiYgKGFwaWMtPnVpZCA9PSBhY3BpX2lkKSkgewpAQCAtNjUsMTIgKzY2LDEzIEBACiB9CiAKIHN0YXRpYyBpbnQgbWFwX2xzYXBpY19pZChzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmVudHJ5LAotCQlpbnQgZGV2aWNlX2RlY2xhcmF0aW9uLCB1MzIgYWNwaV9pZCwgcGh5c19jcHVpZF90ICphcGljX2lkKQorCQlpbnQgZGV2aWNlX2RlY2xhcmF0aW9uLCB1MzIgYWNwaV9pZCwgcGh5c19jcHVpZF90ICphcGljX2lkLAorCQlib29sIGlnbm9yZV9kaXNhYmxlZCkKIHsKIAlzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX3NhcGljICpsc2FwaWMgPQogCQljb250YWluZXJfb2YoZW50cnksIHN0cnVjdCBhY3BpX21hZHRfbG9jYWxfc2FwaWMsIGhlYWRlcik7CiAKLQlpZiAoIShsc2FwaWMtPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpKQorCWlmIChpZ25vcmVfZGlzYWJsZWQgJiYgIShsc2FwaWMtPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChkZXZpY2VfZGVjbGFyYXRpb24pIHsKQEAgLTg3LDEyICs4OSwxMyBAQAogICogUmV0cmlldmUgdGhlIEFSTSBDUFUgcGh5c2ljYWwgaWRlbnRpZmllciAoTVBJRFIpCiAgKi8KIHN0YXRpYyBpbnQgbWFwX2dpY2NfbXBpZHIoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICplbnRyeSwKLQkJaW50IGRldmljZV9kZWNsYXJhdGlvbiwgdTMyIGFjcGlfaWQsIHBoeXNfY3B1aWRfdCAqbXBpZHIpCisJCWludCBkZXZpY2VfZGVjbGFyYXRpb24sIHUzMiBhY3BpX2lkLCBwaHlzX2NwdWlkX3QgKm1waWRyLAorCQlib29sIGlnbm9yZV9kaXNhYmxlZCkKIHsKIAlzdHJ1Y3QgYWNwaV9tYWR0X2dlbmVyaWNfaW50ZXJydXB0ICpnaWNjID0KIAkgICAgY29udGFpbmVyX29mKGVudHJ5LCBzdHJ1Y3QgYWNwaV9tYWR0X2dlbmVyaWNfaW50ZXJydXB0LCBoZWFkZXIpOwogCi0JaWYgKCEoZ2ljYy0+ZmxhZ3MgJiBBQ1BJX01BRFRfRU5BQkxFRCkpCisJaWYgKGlnbm9yZV9kaXNhYmxlZCAmJiAhKGdpY2MtPmZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIGRldmljZV9kZWNsYXJhdGlvbiBtZWFucyBEZXZpY2Ugb2JqZWN0IGluIERTRFQsIGluIHRoZQpAQCAtMTA5LDcgKzExMiw3IEBACiB9CiAKIHN0YXRpYyBwaHlzX2NwdWlkX3QgbWFwX21hZHRfZW50cnkoc3RydWN0IGFjcGlfdGFibGVfbWFkdCAqbWFkdCwKLQkJCQkgICBpbnQgdHlwZSwgdTMyIGFjcGlfaWQpCisJCQkJICAgaW50IHR5cGUsIHUzMiBhY3BpX2lkLCBib29sIGlnbm9yZV9kaXNhYmxlZCkKIHsKIAl1bnNpZ25lZCBsb25nIG1hZHRfZW5kLCBlbnRyeTsKIAlwaHlzX2NwdWlkX3QgcGh5c19pZCA9IFBIWVNfQ1BVSURfSU5WQUxJRDsJLyogQ1BVIGhhcmR3YXJlIElEICovCkBAIC0xMjcsMTYgKzEzMCwyMCBAQAogCQlzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmhlYWRlciA9CiAJCQkoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICopZW50cnk7CiAJCWlmIChoZWFkZXItPnR5cGUgPT0gQUNQSV9NQURUX1RZUEVfTE9DQUxfQVBJQykgewotCQkJaWYgKCFtYXBfbGFwaWNfaWQoaGVhZGVyLCBhY3BpX2lkLCAmcGh5c19pZCkpCisJCQlpZiAoIW1hcF9sYXBpY19pZChoZWFkZXIsIGFjcGlfaWQsICZwaHlzX2lkLAorCQkJCQkgIGlnbm9yZV9kaXNhYmxlZCkpCiAJCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAoaGVhZGVyLT50eXBlID09IEFDUElfTUFEVF9UWVBFX0xPQ0FMX1gyQVBJQykgewotCQkJaWYgKCFtYXBfeDJhcGljX2lkKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJnBoeXNfaWQpKQorCQkJaWYgKCFtYXBfeDJhcGljX2lkKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJnBoeXNfaWQsCisJCQkJCSAgIGlnbm9yZV9kaXNhYmxlZCkpCiAJCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAoaGVhZGVyLT50eXBlID09IEFDUElfTUFEVF9UWVBFX0xPQ0FMX1NBUElDKSB7Ci0JCQlpZiAoIW1hcF9sc2FwaWNfaWQoaGVhZGVyLCB0eXBlLCBhY3BpX2lkLCAmcGh5c19pZCkpCisJCQlpZiAoIW1hcF9sc2FwaWNfaWQoaGVhZGVyLCB0eXBlLCBhY3BpX2lkLCAmcGh5c19pZCwKKwkJCQkJICAgaWdub3JlX2Rpc2FibGVkKSkKIAkJCQlicmVhazsKIAkJfSBlbHNlIGlmIChoZWFkZXItPnR5cGUgPT0gQUNQSV9NQURUX1RZUEVfR0VORVJJQ19JTlRFUlJVUFQpIHsKLQkJCWlmICghbWFwX2dpY2NfbXBpZHIoaGVhZGVyLCB0eXBlLCBhY3BpX2lkLCAmcGh5c19pZCkpCisJCQlpZiAoIW1hcF9naWNjX21waWRyKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJnBoeXNfaWQsCisJCQkJCSAgICBpZ25vcmVfZGlzYWJsZWQpKQogCQkJCWJyZWFrOwogCQl9CiAJCWVudHJ5ICs9IGhlYWRlci0+bGVuZ3RoOwpAQCAtMTU2LDE0ICsxNjMsMTUgQEAKIAlpZiAoIW1hZHQpCiAJCXJldHVybiBQSFlTX0NQVUlEX0lOVkFMSUQ7CiAKLQlydiA9IG1hcF9tYWR0X2VudHJ5KG1hZHQsIDEsIGFjcGlfaWQpOworCXJ2ID0gbWFwX21hZHRfZW50cnkobWFkdCwgMSwgYWNwaV9pZCwgdHJ1ZSk7CiAKIAllYXJseV9hY3BpX29zX3VubWFwX21lbW9yeShtYWR0LCB0Ymxfc2l6ZSk7CiAKIAlyZXR1cm4gcnY7CiB9CiAKLXN0YXRpYyBwaHlzX2NwdWlkX3QgbWFwX21hdF9lbnRyeShhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlLCB1MzIgYWNwaV9pZCkKK3N0YXRpYyBwaHlzX2NwdWlkX3QgbWFwX21hdF9lbnRyeShhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlLCB1MzIgYWNwaV9pZCwKKwkJCQkgIGJvb2wgaWdub3JlX2Rpc2FibGVkKQogewogCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CiAJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKQEAgLTE4NCwzMCArMTkyLDM4IEBACiAKIAloZWFkZXIgPSAoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICopb2JqLT5idWZmZXIucG9pbnRlcjsKIAlpZiAoaGVhZGVyLT50eXBlID09IEFDUElfTUFEVF9UWVBFX0xPQ0FMX0FQSUMpCi0JCW1hcF9sYXBpY19pZChoZWFkZXIsIGFjcGlfaWQsICZwaHlzX2lkKTsKKwkJbWFwX2xhcGljX2lkKGhlYWRlciwgYWNwaV9pZCwgJnBoeXNfaWQsIGlnbm9yZV9kaXNhYmxlZCk7CiAJZWxzZSBpZiAoaGVhZGVyLT50eXBlID09IEFDUElfTUFEVF9UWVBFX0xPQ0FMX1NBUElDKQotCQltYXBfbHNhcGljX2lkKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJnBoeXNfaWQpOworCQltYXBfbHNhcGljX2lkKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJnBoeXNfaWQsIGlnbm9yZV9kaXNhYmxlZCk7CiAJZWxzZSBpZiAoaGVhZGVyLT50eXBlID09IEFDUElfTUFEVF9UWVBFX0xPQ0FMX1gyQVBJQykKLQkJbWFwX3gyYXBpY19pZChoZWFkZXIsIHR5cGUsIGFjcGlfaWQsICZwaHlzX2lkKTsKKwkJbWFwX3gyYXBpY19pZChoZWFkZXIsIHR5cGUsIGFjcGlfaWQsICZwaHlzX2lkLCBpZ25vcmVfZGlzYWJsZWQpOwogCWVsc2UgaWYgKGhlYWRlci0+dHlwZSA9PSBBQ1BJX01BRFRfVFlQRV9HRU5FUklDX0lOVEVSUlVQVCkKLQkJbWFwX2dpY2NfbXBpZHIoaGVhZGVyLCB0eXBlLCBhY3BpX2lkLCAmcGh5c19pZCk7CisJCW1hcF9naWNjX21waWRyKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJnBoeXNfaWQsCisJCQkgICAgICAgaWdub3JlX2Rpc2FibGVkKTsKIAogZXhpdDoKIAlrZnJlZShidWZmZXIucG9pbnRlcik7CiAJcmV0dXJuIHBoeXNfaWQ7CiB9CiAKLXBoeXNfY3B1aWRfdCBhY3BpX2dldF9waHlzX2lkKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHR5cGUsIHUzMiBhY3BpX2lkKQorc3RhdGljIHBoeXNfY3B1aWRfdCBfX2FjcGlfZ2V0X3BoeXNfaWQoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgdHlwZSwKKwkJCQkgICAgICAgdTMyIGFjcGlfaWQsIGJvb2wgaWdub3JlX2Rpc2FibGVkKQogewogCXBoeXNfY3B1aWRfdCBwaHlzX2lkOwogCi0JcGh5c19pZCA9IG1hcF9tYXRfZW50cnkoaGFuZGxlLCB0eXBlLCBhY3BpX2lkKTsKKwlwaHlzX2lkID0gbWFwX21hdF9lbnRyeShoYW5kbGUsIHR5cGUsIGFjcGlfaWQsIGlnbm9yZV9kaXNhYmxlZCk7CiAJaWYgKGludmFsaWRfcGh5c19jcHVpZChwaHlzX2lkKSkKLQkJcGh5c19pZCA9IG1hcF9tYWR0X2VudHJ5KGdldF9tYWR0X3RhYmxlKCksIHR5cGUsIGFjcGlfaWQpOworCQlwaHlzX2lkID0gbWFwX21hZHRfZW50cnkoZ2V0X21hZHRfdGFibGUoKSwgdHlwZSwgYWNwaV9pZCwKKwkJCQkJICAgaWdub3JlX2Rpc2FibGVkKTsKIAogCXJldHVybiBwaHlzX2lkOwogfQogCitwaHlzX2NwdWlkX3QgYWNwaV9nZXRfcGh5c19pZChhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlLCB1MzIgYWNwaV9pZCkKK3sKKwlyZXR1cm4gX19hY3BpX2dldF9waHlzX2lkKGhhbmRsZSwgdHlwZSwgYWNwaV9pZCwgdHJ1ZSk7Cit9CisKIGludCBhY3BpX21hcF9jcHVpZChwaHlzX2NwdWlkX3QgcGh5c19pZCwgdTMyIGFjcGlfaWQpCiB7CiAjaWZkZWYgQ09ORklHX1NNUApAQCAtMjY0LDYgKzI4MCw3OSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYWNwaV9nZXRfY3B1aWQpOwogCisjaWZkZWYgQ09ORklHX0FDUElfSE9UUExVR19DUFUKK3N0YXRpYyBib29sIF9faW5pdAorbWFwX3Byb2Nlc3NvcihhY3BpX2hhbmRsZSBoYW5kbGUsIHBoeXNfY3B1aWRfdCAqcGh5c19pZCwgaW50ICpjcHVpZCkKK3sKKwlpbnQgdHlwZSwgaWQ7CisJdTMyIGFjcGlfaWQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfb2JqZWN0X3R5cGUgYWNwaV90eXBlOworCXVuc2lnbmVkIGxvbmcgbG9uZyB0bXA7CisJdW5pb24gYWNwaV9vYmplY3Qgb2JqZWN0ID0geyAwIH07CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSwgJm9iamVjdCB9OworCisJc3RhdHVzID0gYWNwaV9nZXRfdHlwZShoYW5kbGUsICZhY3BpX3R5cGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIGZhbHNlOworCisJc3dpdGNoIChhY3BpX3R5cGUpIHsKKwljYXNlIEFDUElfVFlQRV9QUk9DRVNTT1I6CisJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgTlVMTCwgTlVMTCwgJmJ1ZmZlcik7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJYWNwaV9pZCA9IG9iamVjdC5wcm9jZXNzb3IucHJvY19pZDsKKworCQkvKiB2YWxpZGF0ZSB0aGUgYWNwaV9pZCAqLworCQlpZihhY3BpX3Byb2Nlc3Nvcl92YWxpZGF0ZV9wcm9jX2lkKGFjcGlfaWQpKQorCQkJcmV0dXJuIGZhbHNlOworCQlicmVhazsKKwljYXNlIEFDUElfVFlQRV9ERVZJQ0U6CisJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfVUlEIiwgTlVMTCwgJnRtcCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJYWNwaV9pZCA9IHRtcDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXR5cGUgPSAoYWNwaV90eXBlID09IEFDUElfVFlQRV9ERVZJQ0UpID8gMSA6IDA7CisKKwkqcGh5c19pZCA9IF9fYWNwaV9nZXRfcGh5c19pZChoYW5kbGUsIHR5cGUsIGFjcGlfaWQsIGZhbHNlKTsKKwlpZCA9IGFjcGlfbWFwX2NwdWlkKCpwaHlzX2lkLCBhY3BpX2lkKTsKKworCWlmIChpZCA8IDApCisJCXJldHVybiBmYWxzZTsKKwkqY3B1aWQgPSBpZDsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdAorc2V0X3Byb2Nlc3Nvcl9ub2RlX21hcHBpbmcoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLCB2b2lkICpjb250ZXh0LAorCQkJICAgdm9pZCAqKnJ2KQoreworCXBoeXNfY3B1aWRfdCBwaHlzX2lkOworCWludCBjcHVfaWQ7CisKKwlpZiAoIW1hcF9wcm9jZXNzb3IoaGFuZGxlLCAmcGh5c19pZCwgJmNwdV9pZCkpCisJCXJldHVybiBBRV9FUlJPUjsKKworCWFjcGlfbWFwX2NwdTJub2RlKGhhbmRsZSwgY3B1X2lkLCBwaHlzX2lkKTsKKwlyZXR1cm4gQUVfT0s7Cit9CisKK3ZvaWQgX19pbml0IGFjcGlfc2V0X3Byb2Nlc3Nvcl9tYXBwaW5nKHZvaWQpCit7CisJLyogU2V0IHBlcnNpc3RlbnQgY3B1IDwtPiBub2RlIG1hcHBpbmcgZm9yIGFsbCBwcm9jZXNzb3JzLiAqLworCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX1BST0NFU1NPUiwgQUNQSV9ST09UX09CSkVDVCwKKwkJCSAgICBBQ1BJX1VJTlQzMl9NQVgsIHNldF9wcm9jZXNzb3Jfbm9kZV9tYXBwaW5nLAorCQkJICAgIE5VTEwsIE5VTEwsIE5VTEwpOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IGFjcGlfc2V0X3Byb2Nlc3Nvcl9tYXBwaW5nKHZvaWQpIHt9CisjZW5kaWYgLyogQ09ORklHX0FDUElfSE9UUExVR19DUFUgKi8KKwogI2lmZGVmIENPTkZJR19BQ1BJX0hPVFBMVUdfSU9BUElDCiBzdGF0aWMgaW50IGdldF9pb2FwaWNfaWQoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICplbnRyeSwgdTMyIGdzaV9iYXNlLAogCQkJIHU2NCAqcGh5c19hZGRyLCBpbnQgKmlvYXBpY19pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfZHJpdmVyLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2RyaXZlci5jCmluZGV4IDA1NTNhZWUuLjlkNWYwYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9kcml2ZXIuYwpAQCAtMTEwLDU1ICsxMTAsNDYgQEAKIAogc3RhdGljIGludCBfX2FjcGlfcHJvY2Vzc29yX3N0YXJ0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIAotc3RhdGljIGludCBhY3BpX2NwdV9zb2Z0X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKLQkJCQkJICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgYWNwaV9zb2Z0X2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByID0gcGVyX2NwdShwcm9jZXNzb3JzLCBjcHUpOwogCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOwotCWFjdGlvbiAmPSB+Q1BVX1RBU0tTX0ZST1pFTjsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX0RFQUQ6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBOT1RJRllfRE9ORTsKLQl9CiAKIAlpZiAoIXByIHx8IGFjcGlfYnVzX2dldF9kZXZpY2UocHItPmhhbmRsZSwgJmRldmljZSkpCi0JCXJldHVybiBOT1RJRllfRE9ORTsKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBDUFUgZ290IHBoeXNpY2FsbHkgaG90cGx1Z2dlZCBhbmQgb25saW5lZCBmb3IgdGhlIGZpcnN0IHRpbWU6CisJICogSW5pdGlhbGl6ZSBtaXNzaW5nIHRoaW5ncy4KKwkgKi8KKwlpZiAocHItPmZsYWdzLm5lZWRfaG90cGx1Z19pbml0KSB7CisJCWludCByZXQ7CiAKLQlpZiAoYWN0aW9uID09IENQVV9PTkxJTkUpIHsKLQkJLyoKLQkJICogQ1BVIGdvdCBwaHlzaWNhbGx5IGhvdHBsdWdnZWQgYW5kIG9ubGluZWQgZm9yIHRoZSBmaXJzdCB0aW1lOgotCQkgKiBJbml0aWFsaXplIG1pc3NpbmcgdGhpbmdzLgotCQkgKi8KLQkJaWYgKHByLT5mbGFncy5uZWVkX2hvdHBsdWdfaW5pdCkgewotCQkJaW50IHJldDsKLQotCQkJcHJfaW5mbygiV2lsbCBvbmxpbmUgYW5kIGluaXQgaG90cGx1Z2dlZCBDUFU6ICVkXG4iLAotCQkJCXByLT5pZCk7Ci0JCQlwci0+ZmxhZ3MubmVlZF9ob3RwbHVnX2luaXQgPSAwOwotCQkJcmV0ID0gX19hY3BpX3Byb2Nlc3Nvcl9zdGFydChkZXZpY2UpOwotCQkJV0FSTihyZXQsICJGYWlsZWQgdG8gc3RhcnQgQ1BVOiAlZFxuIiwgcHItPmlkKTsKLQkJfSBlbHNlIHsKLQkJCS8qIE5vcm1hbCBDUFUgc29mdCBvbmxpbmUgZXZlbnQuICovCi0JCQlhY3BpX3Byb2Nlc3Nvcl9wcGNfaGFzX2NoYW5nZWQocHIsIDApOwotCQkJYWNwaV9wcm9jZXNzb3JfaG90cGx1Zyhwcik7Ci0JCQlhY3BpX3Byb2Nlc3Nvcl9yZWV2YWx1YXRlX3RzdGF0ZShwciwgYWN0aW9uKTsKLQkJCWFjcGlfcHJvY2Vzc29yX3RzdGF0ZV9oYXNfY2hhbmdlZChwcik7Ci0JCX0KLQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBDUFVfREVBRCkgewotCQkvKiBJbnZhbGlkYXRlIGZsYWcudGhyb3R0bGluZyBhZnRlciB0aGUgQ1BVIGlzIG9mZmxpbmUuICovCi0JCWFjcGlfcHJvY2Vzc29yX3JlZXZhbHVhdGVfdHN0YXRlKHByLCBhY3Rpb24pOworCQlwcl9pbmZvKCJXaWxsIG9ubGluZSBhbmQgaW5pdCBob3RwbHVnZ2VkIENQVTogJWRcbiIsCisJCQlwci0+aWQpOworCQlwci0+ZmxhZ3MubmVlZF9ob3RwbHVnX2luaXQgPSAwOworCQlyZXQgPSBfX2FjcGlfcHJvY2Vzc29yX3N0YXJ0KGRldmljZSk7CisJCVdBUk4ocmV0LCAiRmFpbGVkIHRvIHN0YXJ0IENQVTogJWRcbiIsIHByLT5pZCk7CisJfSBlbHNlIHsKKwkJLyogTm9ybWFsIENQVSBzb2Z0IG9ubGluZSBldmVudC4gKi8KKwkJYWNwaV9wcm9jZXNzb3JfcHBjX2hhc19jaGFuZ2VkKHByLCAwKTsKKwkJYWNwaV9wcm9jZXNzb3JfaG90cGx1Zyhwcik7CisJCWFjcGlfcHJvY2Vzc29yX3JlZXZhbHVhdGVfdHN0YXRlKHByLCBmYWxzZSk7CisJCWFjcGlfcHJvY2Vzc29yX3RzdGF0ZV9oYXNfY2hhbmdlZChwcik7CiAJfQotCXJldHVybiBOT1RJRllfT0s7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYWNwaV9jcHVfbm90aWZpZXIgPSB7Ci0JICAgIC5ub3RpZmllcl9jYWxsID0gYWNwaV9jcHVfc29mdF9ub3RpZnksCi19Oworc3RhdGljIGludCBhY3BpX3NvZnRfY3B1X2RlYWQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByID0gcGVyX2NwdShwcm9jZXNzb3JzLCBjcHUpOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOworCisJaWYgKCFwciB8fCBhY3BpX2J1c19nZXRfZGV2aWNlKHByLT5oYW5kbGUsICZkZXZpY2UpKQorCQlyZXR1cm4gMDsKKworCWFjcGlfcHJvY2Vzc29yX3JlZXZhbHVhdGVfdHN0YXRlKHByLCB0cnVlKTsKKwlyZXR1cm4gMDsKK30KIAogI2lmZGVmIENPTkZJR19BQ1BJX0NQVV9GUkVRX1BTUwogc3RhdGljIGludCBhY3BpX3Bzc19wZXJmX2luaXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKQEAgLTI0NSw4ICsyMzYsOCBAQAogCQlyZXR1cm4gMDsKIAogCXJlc3VsdCA9IGFjcGlfY3BwY19wcm9jZXNzb3JfcHJvYmUocHIpOwotCWlmIChyZXN1bHQpCi0JCXJldHVybiAtRU5PREVWOworCWlmIChyZXN1bHQgJiYgIUlTX0VOQUJMRUQoQ09ORklHX0FDUElfQ1BVX0ZSRVFfUFNTKSkKKwkJZGV2X3dhcm4oJmRldmljZS0+ZGV2LCAiQ1BQQyBkYXRhIGludmFsaWQgb3Igbm90IHByZXNlbnRcbiIpOwogCiAJaWYgKCFjcHVpZGxlX2dldF9kcml2ZXIoKSB8fCBjcHVpZGxlX2dldF9kcml2ZXIoKSA9PSAmYWNwaV9pZGxlX2RyaXZlcikKIAkJYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdChwcik7CkBAIC0zMDMsNyArMjk0LDcgQEAKICAqIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgcG93ZXJub3ctazggZHJpdmVyLCB0aGF0IHdvcmtzIGV2ZW4gd2l0aG91dAogICogQUNQSSwgYnV0IG5lZWRzIHN5bWJvbHMgZnJvbSB0aGlzIGRyaXZlcgogICovCi0KK3N0YXRpYyBlbnVtIGNwdWhwX3N0YXRlIGhwX29ubGluZTsKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfcHJvY2Vzc29yX2RyaXZlcl9pbml0KHZvaWQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC0zMTUsMTEgKzMwNiwyMiBAQAogCWlmIChyZXN1bHQgPCAwKQogCQlyZXR1cm4gcmVzdWx0OwogCi0JcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZhY3BpX2NwdV9ub3RpZmllcik7CisJcmVzdWx0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9PTkxJTkVfRFlOLAorCQkJCQkgICAiYWNwaS9jcHUtZHJ2Om9ubGluZSIsCisJCQkJCSAgIGFjcGlfc29mdF9jcHVfb25saW5lLCBOVUxMKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnI7CisJaHBfb25saW5lID0gcmVzdWx0OworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQUNQSV9DUFVEUlZfREVBRCwgImFjcGkvY3B1LWRydjpkZWFkIiwKKwkJCQkgIE5VTEwsIGFjcGlfc29mdF9jcHVfZGVhZCk7CisKIAlhY3BpX3RoZXJtYWxfY3B1ZnJlcV9pbml0KCk7CiAJYWNwaV9wcm9jZXNzb3JfcHBjX2luaXQoKTsKIAlhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX2luaXQoKTsKIAlyZXR1cm4gMDsKK2VycjoKKwlkcml2ZXJfdW5yZWdpc3RlcigmYWNwaV9wcm9jZXNzb3JfZHJpdmVyKTsKKwlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYWNwaV9wcm9jZXNzb3JfZHJpdmVyX2V4aXQodm9pZCkKQEAgLTMyOSw3ICszMzEsOCBAQAogCiAJYWNwaV9wcm9jZXNzb3JfcHBjX2V4aXQoKTsKIAlhY3BpX3RoZXJtYWxfY3B1ZnJlcV9leGl0KCk7Ci0JdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJmFjcGlfY3B1X25vdGlmaWVyKTsKKwljcHVocF9yZW1vdmVfc3RhdGVfbm9jYWxscyhocF9vbmxpbmUpOworCWNwdWhwX3JlbW92ZV9zdGF0ZV9ub2NhbGxzKENQVUhQX0FDUElfQ1BVRFJWX0RFQUQpOwogCWRyaXZlcl91bnJlZ2lzdGVyKCZhY3BpX3Byb2Nlc3Nvcl9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCmluZGV4IGM3MmU2NDguLmQ1MWNhMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCkBAIC0zNzUsMTEgKzM3NSwxMSBAQAogICoJMy4gVFNEIGRvbWFpbgogICovCiB2b2lkIGFjcGlfcHJvY2Vzc29yX3JlZXZhbHVhdGVfdHN0YXRlKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCi0JCQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uKQorCQkJCQlib29sIGlzX2RlYWQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAKLQlpZiAoYWN0aW9uID09IENQVV9ERUFEKSB7CisJaWYgKGlzX2RlYWQpIHsKIAkJLyogV2hlbiBvbmUgQ1BVIGlzIG9mZmxpbmUsIHRoZSBULXN0YXRlIHRocm90dGxpbmcKIAkJICogd2lsbCBiZSBpbnZhbGlkYXRlZC4KIAkJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2Nhbi5jIGIvZHJpdmVycy9hY3BpL3NjYW4uYwppbmRleCBhZDlmYzg0Li4wMzVhYzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2Nhbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9zY2FuLmMKQEAgLTIwMDIsNiArMjAwMiw3IEBACiAJYWNwaV9wbnBfaW5pdCgpOwogCWFjcGlfaW50MzQweF90aGVybWFsX2luaXQoKTsKIAlhY3BpX2FtYmFfaW5pdCgpOworCWFjcGlfd2F0Y2hkb2dfaW5pdCgpOwogCiAJYWNwaV9zY2FuX2FkZF9oYW5kbGVyKCZnZW5lcmljX2RldmljZV9oYW5kbGVyKTsKIApAQCAtMjA0NCw2ICsyMDQ1LDcgQEAKIAl9CiAKIAlhY3BpX3VwZGF0ZV9hbGxfZ3BlcygpOworCWFjcGlfZWNfZWNkdF9zdGFydCgpOwogCiAJYWNwaV9zY2FuX2luaXRpYWxpemVkID0gdHJ1ZTsKIApAQCAtMjA1NCw3ICsyMDU2LDcgQEAKIAogc3RhdGljIHN0cnVjdCBhY3BpX3Byb2JlX2VudHJ5ICphcGU7CiBzdGF0aWMgaW50IGFjcGlfcHJvYmVfY291bnQ7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFjcGlfcHJvYmVfbG9jayk7CitzdGF0aWMgREVGSU5FX01VVEVYKGFjcGlfcHJvYmVfbXV0ZXgpOwogCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX21hdGNoX21hZHQoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICpoZWFkZXIsCiAJCQkJICBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKQEAgLTIwNzMsNyArMjA3NSw3IEBACiAJaWYgKGFjcGlfZGlzYWJsZWQpCiAJCXJldHVybiAwOwogCi0Jc3Bpbl9sb2NrKCZhY3BpX3Byb2JlX2xvY2spOworCW11dGV4X2xvY2soJmFjcGlfcHJvYmVfbXV0ZXgpOwogCWZvciAoYXBlID0gYXBfaGVhZDsgbnI7IGFwZSsrLCBuci0tKSB7CiAJCWlmIChBQ1BJX0NPTVBBUkVfTkFNRShBQ1BJX1NJR19NQURULCBhcGUtPmlkKSkgewogCQkJYWNwaV9wcm9iZV9jb3VudCA9IDA7CkBAIC0yMDg2LDcgKzIwODgsNyBAQAogCQkJCWNvdW50Kys7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2soJmFjcGlfcHJvYmVfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhY3BpX3Byb2JlX211dGV4KTsKIAogCXJldHVybiBjb3VudDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zbGVlcC5jIGIvZHJpdmVycy9hY3BpL3NsZWVwLmMKaW5kZXggMmIzOGMxYi4uZGViMGZmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwLmMKKysrIGIvZHJpdmVycy9hY3BpL3NsZWVwLmMKQEAgLTU3Miw3ICs1NzIsNyBAQAogCiAJCWFjcGlfZ2V0X2V2ZW50X3N0YXR1cyhBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTiwgJnB3cl9idG5fc3RhdHVzKTsKIAotCQlpZiAocHdyX2J0bl9zdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfU0VUKSB7CisJCWlmIChwd3JfYnRuX3N0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19TVEFUVVNfU0VUKSB7CiAJCQlhY3BpX2NsZWFyX2V2ZW50KEFDUElfRVZFTlRfUE9XRVJfQlVUVE9OKTsKIAkJCS8qIEZsYWcgZm9yIGxhdGVyICovCiAJCQlwd3JfYnRuX2V2ZW50X3BlbmRpbmcgPSB0cnVlOwpAQCAtNTg2LDcgKzU4Niw3IEBACiAJICovCiAJYWNwaV9kaXNhYmxlX2FsbF9ncGVzKCk7CiAJLyogQWxsb3cgRUMgdHJhbnNhY3Rpb25zIHRvIGhhcHBlbi4gKi8KLQlhY3BpX2VjX3VuYmxvY2tfdHJhbnNhY3Rpb25zX2Vhcmx5KCk7CisJYWNwaV9lY191bmJsb2NrX3RyYW5zYWN0aW9ucygpOwogCiAJc3VzcGVuZF9udnNfcmVzdG9yZSgpOwogCkBAIC03ODQsNyArNzg0LDcgQEAKIAkvKiBSZXN0b3JlIHRoZSBOVlMgbWVtb3J5IGFyZWEgKi8KIAlzdXNwZW5kX252c19yZXN0b3JlKCk7CiAJLyogQWxsb3cgRUMgdHJhbnNhY3Rpb25zIHRvIGhhcHBlbi4gKi8KLQlhY3BpX2VjX3VuYmxvY2tfdHJhbnNhY3Rpb25zX2Vhcmx5KCk7CisJYWNwaV9lY191bmJsb2NrX3RyYW5zYWN0aW9ucygpOwogfQogCiBzdGF0aWMgdm9pZCBhY3BpX3BtX3RoYXcodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zcGNyLmMgYi9kcml2ZXJzL2FjcGkvc3Bjci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDdiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvc3Bjci5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBJbnRlbCBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LCBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTYgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpICJBQ1BJOiBTUENSOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorCisvKioKKyAqIHBhcnNlX3NwY3IoKSAtIHBhcnNlIEFDUEkgU1BDUiB0YWJsZSBhbmQgYWRkIHByZWZlcnJlZCBjb25zb2xlCisgKgorICogQGVhcmx5Y29uOiBzZXQgdXAgZWFybHljb24gZm9yIHRoZSBjb25zb2xlIHNwZWNpZmllZCBieSB0aGUgdGFibGUKKyAqCisgKiBGb3IgdGhlIGFyY2hpdGVjdHVyZXMgd2l0aCBzdXBwb3J0IGZvciBBQ1BJLCBDT05GSUdfQUNQSV9TUENSX1RBQkxFIG1heSBiZQorICogZGVmaW5lZCB0byBwYXJzZSBBQ1BJIFNQQ1IgdGFibGUuICBBcyBhIHJlc3VsdCBvZiB0aGUgcGFyc2luZyBwcmVmZXJyZWQKKyAqIGNvbnNvbGUgaXMgcmVnaXN0ZXJlZCBhbmQgaWYgQGVhcmx5Y29uIGlzIHRydWUsIGVhcmx5Y29uIGlzIHNldCB1cC4KKyAqCisgKiBXaGVuIENPTkZJR19BQ1BJX1NQQ1JfVEFCTEUgaXMgZGVmaW5lZCwgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkCisgKiBmcm9tIGFyY2ggaW5pbnRpYWxpemF0aW9uIGNvZGUgYXMgc29vbiBhcyB0aGUgRFQvQUNQSSBkZWNpc2lvbiBpcyBtYWRlLgorICoKKyAqLworaW50IF9faW5pdCBwYXJzZV9zcGNyKGJvb2wgZWFybHljb24pCit7CisJc3RhdGljIGNoYXIgb3B0c1s2NF07CisJc3RydWN0IGFjcGlfdGFibGVfc3BjciAqdGFibGU7CisJYWNwaV9zaXplIHRhYmxlX3NpemU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWNoYXIgKnVhcnQ7CisJY2hhciAqaW90eXBlOworCWludCBiYXVkX3JhdGU7CisJaW50IGVycjsKKworCWlmIChhY3BpX2Rpc2FibGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlX3dpdGhfc2l6ZShBQ1BJX1NJR19TUENSLCAwLAorCQkJCQkgIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopJnRhYmxlLAorCQkJCQkgICZ0YWJsZV9zaXplKTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlpZiAodGFibGUtPmhlYWRlci5yZXZpc2lvbiA8IDIpIHsKKwkJZXJyID0gLUVOT0VOVDsKKwkJcHJfZXJyKCJ3cm9uZyB0YWJsZSB2ZXJzaW9uXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCWlvdHlwZSA9IHRhYmxlLT5zZXJpYWxfcG9ydC5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZID8KKwkJCSJtbWlvIiA6ICJpbyI7CisKKwlzd2l0Y2ggKHRhYmxlLT5pbnRlcmZhY2VfdHlwZSkgeworCWNhc2UgQUNQSV9EQkcyX0FSTV9TQlNBXzMyQklUOgorCQlpb3R5cGUgPSAibW1pbzMyIjsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBBQ1BJX0RCRzJfQVJNX1BMMDExOgorCWNhc2UgQUNQSV9EQkcyX0FSTV9TQlNBX0dFTkVSSUM6CisJY2FzZSBBQ1BJX0RCRzJfQkNNMjgzNToKKwkJdWFydCA9ICJwbDAxMSI7CisJCWJyZWFrOworCWNhc2UgQUNQSV9EQkcyXzE2NTUwX0NPTVBBVElCTEU6CisJY2FzZSBBQ1BJX0RCRzJfMTY1NTBfU1VCU0VUOgorCQl1YXJ0ID0gInVhcnQiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGRvbmU7CisJfQorCisJc3dpdGNoICh0YWJsZS0+YmF1ZF9yYXRlKSB7CisJY2FzZSAzOgorCQliYXVkX3JhdGUgPSA5NjAwOworCQlicmVhazsKKwljYXNlIDQ6CisJCWJhdWRfcmF0ZSA9IDE5MjAwOworCQlicmVhazsKKwljYXNlIDY6CisJCWJhdWRfcmF0ZSA9IDU3NjAwOworCQlicmVhazsKKwljYXNlIDc6CisJCWJhdWRfcmF0ZSA9IDExNTIwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBkb25lOworCX0KKworCXNucHJpbnRmKG9wdHMsIHNpemVvZihvcHRzKSwgIiVzLCVzLDB4JWxseCwlZCIsIHVhcnQsIGlvdHlwZSwKKwkJIHRhYmxlLT5zZXJpYWxfcG9ydC5hZGRyZXNzLCBiYXVkX3JhdGUpOworCisJcHJfaW5mbygiY29uc29sZTogJXNcbiIsIG9wdHMpOworCisJaWYgKGVhcmx5Y29uKQorCQlzZXR1cF9lYXJseWNvbihvcHRzKTsKKworCWVyciA9IGFkZF9wcmVmZXJyZWRfY29uc29sZSh1YXJ0LCAwLCBvcHRzICsgc3RybGVuKHVhcnQpICsgMSk7CisKK2RvbmU6CisJZWFybHlfYWNwaV9vc191bm1hcF9tZW1vcnkoKHZvaWQgX19pb21lbSAqKXRhYmxlLCB0YWJsZV9zaXplKTsKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3N5c2ZzLmMgYi9kcml2ZXJzL2FjcGkvc3lzZnMuYwppbmRleCAzNTgxNjVlLi43MDNjMjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc3lzZnMuYworKysgYi9kcml2ZXJzL2FjcGkvc3lzZnMuYwpAQCAtMzE0LDEwICszMTQsMTQgQEAKIHN0YXRpYyBzdHJ1Y3Qga29iamVjdCAqZHluYW1pY190YWJsZXNfa29iajsKIHN0YXRpYyBzdHJ1Y3Qga29iamVjdCAqaG90cGx1Z19rb2JqOwogCisjZGVmaW5lIEFDUElfTUFYX1RBQkxFX0lOU1RBTkNFUwk5OTkKKyNkZWZpbmUgQUNQSV9JTlNUX1NJWkUJCQk0IC8qIGluY2x1ZGluZyB0cmFpbGluZyAwICovCisKIHN0cnVjdCBhY3BpX3RhYmxlX2F0dHIgewogCXN0cnVjdCBiaW5fYXR0cmlidXRlIGF0dHI7Ci0JY2hhciBuYW1lWzhdOworCWNoYXIgbmFtZVtBQ1BJX05BTUVfU0laRV07CiAJaW50IGluc3RhbmNlOworCWNoYXIgZmlsZW5hbWVbQUNQSV9OQU1FX1NJWkUrQUNQSV9JTlNUX1NJWkVdOwogCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKIH07CiAKQEAgLTMyOSwxNCArMzMzLDkgQEAKIAkgICAgY29udGFpbmVyX29mKGJpbl9hdHRyLCBzdHJ1Y3QgYWNwaV90YWJsZV9hdHRyLCBhdHRyKTsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlX2hlYWRlciA9IE5VTEw7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwotCWNoYXIgbmFtZVtBQ1BJX05BTUVfU0laRV07CiAKLQlpZiAoc3RybmNtcCh0YWJsZV9hdHRyLT5uYW1lLCAiTlVMTCIsIDQpKQotCQltZW1jcHkobmFtZSwgdGFibGVfYXR0ci0+bmFtZSwgQUNQSV9OQU1FX1NJWkUpOwotCWVsc2UKLQkJbWVtY3B5KG5hbWUsICJcMFwwXDBcMCIsIDQpOwotCi0Jc3RhdHVzID0gYWNwaV9nZXRfdGFibGUobmFtZSwgdGFibGVfYXR0ci0+aW5zdGFuY2UsICZ0YWJsZV9oZWFkZXIpOworCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKHRhYmxlX2F0dHItPm5hbWUsIHRhYmxlX2F0dHItPmluc3RhbmNlLAorCQkJCSZ0YWJsZV9oZWFkZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTM0NCwzOCArMzQzLDQ1IEBACiAJCQkJICAgICAgIHRhYmxlX2hlYWRlciwgdGFibGVfaGVhZGVyLT5sZW5ndGgpOwogfQogCi1zdGF0aWMgdm9pZCBhY3BpX3RhYmxlX2F0dHJfaW5pdChzdHJ1Y3QgYWNwaV90YWJsZV9hdHRyICp0YWJsZV9hdHRyLAotCQkJCSBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlX2hlYWRlcikKK3N0YXRpYyBpbnQgYWNwaV90YWJsZV9hdHRyX2luaXQoc3RydWN0IGtvYmplY3QgKnRhYmxlc19vYmosCisJCQkJc3RydWN0IGFjcGlfdGFibGVfYXR0ciAqdGFibGVfYXR0ciwKKwkJCQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlX2hlYWRlcikKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciA9IE5VTEw7CiAJc3RydWN0IGFjcGlfdGFibGVfYXR0ciAqYXR0ciA9IE5VTEw7CisJY2hhciBpbnN0YW5jZV9zdHJbQUNQSV9JTlNUX1NJWkVdOwogCiAJc3lzZnNfYXR0cl9pbml0KCZ0YWJsZV9hdHRyLT5hdHRyLmF0dHIpOwotCWlmICh0YWJsZV9oZWFkZXItPnNpZ25hdHVyZVswXSAhPSAnXDAnKQotCQltZW1jcHkodGFibGVfYXR0ci0+bmFtZSwgdGFibGVfaGVhZGVyLT5zaWduYXR1cmUsCi0JCSAgICAgICBBQ1BJX05BTUVfU0laRSk7Ci0JZWxzZQotCQltZW1jcHkodGFibGVfYXR0ci0+bmFtZSwgIk5VTEwiLCA0KTsKKwlBQ1BJX01PVkVfTkFNRSh0YWJsZV9hdHRyLT5uYW1lLCB0YWJsZV9oZWFkZXItPnNpZ25hdHVyZSk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGF0dHIsICZhY3BpX3RhYmxlX2F0dHJfbGlzdCwgbm9kZSkgewotCQlpZiAoIW1lbWNtcCh0YWJsZV9hdHRyLT5uYW1lLCBhdHRyLT5uYW1lLCBBQ1BJX05BTUVfU0laRSkpCisJCWlmIChBQ1BJX0NPTVBBUkVfTkFNRSh0YWJsZV9hdHRyLT5uYW1lLCBhdHRyLT5uYW1lKSkKIAkJCWlmICh0YWJsZV9hdHRyLT5pbnN0YW5jZSA8IGF0dHItPmluc3RhbmNlKQogCQkJCXRhYmxlX2F0dHItPmluc3RhbmNlID0gYXR0ci0+aW5zdGFuY2U7CiAJfQogCXRhYmxlX2F0dHItPmluc3RhbmNlKys7CisJaWYgKHRhYmxlX2F0dHItPmluc3RhbmNlID4gQUNQSV9NQVhfVEFCTEVfSU5TVEFOQ0VTKSB7CisJCXByX3dhcm4oIiU0LjRzOiB0b28gbWFueSB0YWJsZSBpbnN0YW5jZXNcbiIsCisJCQl0YWJsZV9hdHRyLT5uYW1lKTsKKwkJcmV0dXJuIC1FUkFOR0U7CisJfQogCisJQUNQSV9NT1ZFX05BTUUodGFibGVfYXR0ci0+ZmlsZW5hbWUsIHRhYmxlX2hlYWRlci0+c2lnbmF0dXJlKTsKKwl0YWJsZV9hdHRyLT5maWxlbmFtZVtBQ1BJX05BTUVfU0laRV0gPSAnXDAnOwogCWlmICh0YWJsZV9hdHRyLT5pbnN0YW5jZSA+IDEgfHwgKHRhYmxlX2F0dHItPmluc3RhbmNlID09IDEgJiYKIAkJCQkJICFhY3BpX2dldF90YWJsZQotCQkJCQkgKHRhYmxlX2hlYWRlci0+c2lnbmF0dXJlLCAyLCAmaGVhZGVyKSkpCi0JCXNwcmludGYodGFibGVfYXR0ci0+bmFtZSArIEFDUElfTkFNRV9TSVpFLCAiJWQiLAotCQkJdGFibGVfYXR0ci0+aW5zdGFuY2UpOworCQkJCQkgKHRhYmxlX2hlYWRlci0+c2lnbmF0dXJlLCAyLCAmaGVhZGVyKSkpIHsKKwkJc25wcmludGYoaW5zdGFuY2Vfc3RyLCBzaXplb2YoaW5zdGFuY2Vfc3RyKSwgIiV1IiwKKwkJCSB0YWJsZV9hdHRyLT5pbnN0YW5jZSk7CisJCXN0cmNhdCh0YWJsZV9hdHRyLT5maWxlbmFtZSwgaW5zdGFuY2Vfc3RyKTsKKwl9CiAKIAl0YWJsZV9hdHRyLT5hdHRyLnNpemUgPSB0YWJsZV9oZWFkZXItPmxlbmd0aDsKIAl0YWJsZV9hdHRyLT5hdHRyLnJlYWQgPSBhY3BpX3RhYmxlX3Nob3c7Ci0JdGFibGVfYXR0ci0+YXR0ci5hdHRyLm5hbWUgPSB0YWJsZV9hdHRyLT5uYW1lOworCXRhYmxlX2F0dHItPmF0dHIuYXR0ci5uYW1lID0gdGFibGVfYXR0ci0+ZmlsZW5hbWU7CiAJdGFibGVfYXR0ci0+YXR0ci5hdHRyLm1vZGUgPSAwNDAwOwogCi0JcmV0dXJuOworCXJldHVybiBzeXNmc19jcmVhdGVfYmluX2ZpbGUodGFibGVzX29iaiwgJnRhYmxlX2F0dHItPmF0dHIpOwogfQogCiBhY3BpX3N0YXR1cyBhY3BpX3N5c2ZzX3RhYmxlX2hhbmRsZXIodTMyIGV2ZW50LCB2b2lkICp0YWJsZSwgdm9pZCAqY29udGV4dCkKQEAgLTM4MywyMSArMzg5LDIyIEBACiAJc3RydWN0IGFjcGlfdGFibGVfYXR0ciAqdGFibGVfYXR0cjsKIAogCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIEFDUElfVEFCTEVfRVZFTlRfTE9BRDoKKwljYXNlIEFDUElfVEFCTEVfRVZFTlRfSU5TVEFMTDoKIAkJdGFibGVfYXR0ciA9CiAJCSAgICBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9hdHRyKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdGFibGVfYXR0cikKIAkJCXJldHVybiBBRV9OT19NRU1PUlk7CiAKLQkJYWNwaV90YWJsZV9hdHRyX2luaXQodGFibGVfYXR0ciwgdGFibGUpOwotCQlpZiAoc3lzZnNfY3JlYXRlX2Jpbl9maWxlKGR5bmFtaWNfdGFibGVzX2tvYmosCi0JCQkJCSAgJnRhYmxlX2F0dHItPmF0dHIpKSB7CisJCWlmIChhY3BpX3RhYmxlX2F0dHJfaW5pdChkeW5hbWljX3RhYmxlc19rb2JqLAorCQkJCQkgdGFibGVfYXR0ciwgdGFibGUpKSB7CiAJCQlrZnJlZSh0YWJsZV9hdHRyKTsKIAkJCXJldHVybiBBRV9FUlJPUjsKLQkJfSBlbHNlCi0JCQlsaXN0X2FkZF90YWlsKCZ0YWJsZV9hdHRyLT5ub2RlLCAmYWNwaV90YWJsZV9hdHRyX2xpc3QpOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJnRhYmxlX2F0dHItPm5vZGUsICZhY3BpX3RhYmxlX2F0dHJfbGlzdCk7CiAJCWJyZWFrOworCWNhc2UgQUNQSV9UQUJMRV9FVkVOVF9MT0FEOgogCWNhc2UgQUNQSV9UQUJMRV9FVkVOVF9VTkxPQUQ6CisJY2FzZSBBQ1BJX1RBQkxFX0VWRU5UX1VOSU5TVEFMTDoKIAkJLyoKIAkJICogd2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgcmlnaHQgbm93CiAJCSAqIGJlY2F1c2UgdGhlIHRhYmxlIGlzIG5vdCBkZWxldGVkIGZyb20gdGhlCkBAIC00MzUsMTMgKzQ0MiwxMiBAQAogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCQljb250aW51ZTsKIAotCQl0YWJsZV9hdHRyID0gTlVMTDsKIAkJdGFibGVfYXR0ciA9IGt6YWxsb2Moc2l6ZW9mKCp0YWJsZV9hdHRyKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdGFibGVfYXR0cikKIAkJCXJldHVybiAtRU5PTUVNOwogCi0JCWFjcGlfdGFibGVfYXR0cl9pbml0KHRhYmxlX2F0dHIsIHRhYmxlX2hlYWRlcik7Ci0JCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSh0YWJsZXNfa29iaiwgJnRhYmxlX2F0dHItPmF0dHIpOworCQlyZXQgPSBhY3BpX3RhYmxlX2F0dHJfaW5pdCh0YWJsZXNfa29iaiwKKwkJCQkJICAgdGFibGVfYXR0ciwgdGFibGVfaGVhZGVyKTsKIAkJaWYgKHJldCkgewogCQkJa2ZyZWUodGFibGVfYXR0cik7CiAJCQlyZXR1cm4gcmV0OwpAQCAtNTk3LDE0ICs2MDMsMjcgQEAKIAlpZiAocmVzdWx0KQogCQlnb3RvIGVuZDsKIAotCWlmICghKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19IQVNfSEFORExFUikpCi0JCXNpemUgKz0gc3ByaW50ZihidWYgKyBzaXplLCAiICAgaW52YWxpZCIpOwotCWVsc2UgaWYgKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19FTkFCTEVEKQotCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiAgIGVuYWJsZWQiKTsKLQllbHNlIGlmIChzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfV0FLRV9FTkFCTEVEKQotCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiAgIHdha2VfZW5hYmxlZCIpOworCWlmIChzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfRU5BQkxFX1NFVCkKKwkJc2l6ZSArPSBzcHJpbnRmKGJ1ZiArIHNpemUsICIgIEVOIik7CiAJZWxzZQotCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiAgIGRpc2FibGVkIik7CisJCXNpemUgKz0gc3ByaW50ZihidWYgKyBzaXplLCAiICAgICIpOworCWlmIChzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfU1RBVFVTX1NFVCkKKwkJc2l6ZSArPSBzcHJpbnRmKGJ1ZiArIHNpemUsICIgU1RTIik7CisJZWxzZQorCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiAgICAiKTsKKworCWlmICghKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19IQVNfSEFORExFUikpCisJCXNpemUgKz0gc3ByaW50ZihidWYgKyBzaXplLCAiIGludmFsaWQgICAgICIpOworCWVsc2UgaWYgKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19FTkFCTEVEKQorCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiBlbmFibGVkICAgICAiKTsKKwllbHNlIGlmIChzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfV0FLRV9FTkFCTEVEKQorCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiB3YWtlX2VuYWJsZWQiKTsKKwllbHNlCisJCXNpemUgKz0gc3ByaW50ZihidWYgKyBzaXplLCAiIGRpc2FibGVkICAgICIpOworCWlmIChzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfTUFTS0VEKQorCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiBtYXNrZWQgICIpOworCWVsc2UKKwkJc2l6ZSArPSBzcHJpbnRmKGJ1ZiArIHNpemUsICIgdW5tYXNrZWQiKTsKIAogZW5kOgogCXNpemUgKz0gc3ByaW50ZihidWYgKyBzaXplLCAiXG4iKTsKQEAgLTY1NSw4ICs2NzQsMTIgQEAKIAkJCSAhKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19FTkFCTEVEKSkKIAkJCXJlc3VsdCA9IGFjcGlfZW5hYmxlX2dwZShoYW5kbGUsIGluZGV4KTsKIAkJZWxzZSBpZiAoIXN0cmNtcChidWYsICJjbGVhclxuIikgJiYKLQkJCSAoc3RhdHVzICYgQUNQSV9FVkVOVF9GTEFHX1NFVCkpCisJCQkgKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19TVEFUVVNfU0VUKSkKIAkJCXJlc3VsdCA9IGFjcGlfY2xlYXJfZ3BlKGhhbmRsZSwgaW5kZXgpOworCQllbHNlIGlmICghc3RyY21wKGJ1ZiwgIm1hc2tcbiIpKQorCQkJcmVzdWx0ID0gYWNwaV9tYXNrX2dwZShoYW5kbGUsIGluZGV4LCBUUlVFKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChidWYsICJ1bm1hc2tcbiIpKQorCQkJcmVzdWx0ID0gYWNwaV9tYXNrX2dwZShoYW5kbGUsIGluZGV4LCBGQUxTRSk7CiAJCWVsc2UgaWYgKCFrc3RydG91bChidWYsIDAsICZ0bXApKQogCQkJYWxsX2NvdW50ZXJzW2luZGV4XS5jb3VudCA9IHRtcDsKIAkJZWxzZQpAQCAtNjY0LDEzICs2ODcsMTMgQEAKIAl9IGVsc2UgaWYgKGluZGV4IDwgbnVtX2dwZXMgKyBBQ1BJX05VTV9GSVhFRF9FVkVOVFMpIHsKIAkJaW50IGV2ZW50ID0gaW5kZXggLSBudW1fZ3BlczsKIAkJaWYgKCFzdHJjbXAoYnVmLCAiZGlzYWJsZVxuIikgJiYKLQkJICAgIChzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfRU5BQkxFRCkpCisJCSAgICAoc3RhdHVzICYgQUNQSV9FVkVOVF9GTEFHX0VOQUJMRV9TRVQpKQogCQkJcmVzdWx0ID0gYWNwaV9kaXNhYmxlX2V2ZW50KGV2ZW50LCBBQ1BJX05PVF9JU1IpOwogCQllbHNlIGlmICghc3RyY21wKGJ1ZiwgImVuYWJsZVxuIikgJiYKLQkJCSAhKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19FTkFCTEVEKSkKKwkJCSAhKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19FTkFCTEVfU0VUKSkKIAkJCXJlc3VsdCA9IGFjcGlfZW5hYmxlX2V2ZW50KGV2ZW50LCBBQ1BJX05PVF9JU1IpOwogCQllbHNlIGlmICghc3RyY21wKGJ1ZiwgImNsZWFyXG4iKSAmJgotCQkJIChzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfU0VUKSkKKwkJCSAoc3RhdHVzICYgQUNQSV9FVkVOVF9GTEFHX1NUQVRVU19TRVQpKQogCQkJcmVzdWx0ID0gYWNwaV9jbGVhcl9ldmVudChldmVudCk7CiAJCWVsc2UgaWYgKCFrc3RydG91bChidWYsIDAsICZ0bXApKQogCQkJYWxsX2NvdW50ZXJzW2luZGV4XS5jb3VudCA9IHRtcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMuYwppbmRleCA5ZjBhZDZlLi5jZGQ1NmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzLmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8bGludXgvZWFybHljcGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KLSNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2lmZGVmIENPTkZJR19BQ1BJX0NVU1RPTV9EU0RUCkBAIC0yNDYsNiArMjQ1LDcgQEAKIAlzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmVudHJ5OwogCXVuc2lnbmVkIGxvbmcgdGFibGVfZW5kOwogCWludCBjb3VudCA9IDA7CisJaW50IGVycnMgPSAwOwogCWludCBpOwogCiAJaWYgKGFjcGlfZGlzYWJsZWQpCkBAIC0yNzgsMTAgKzI3OCwxMiBAQAogCQkJaWYgKGVudHJ5LT50eXBlICE9IHByb2NbaV0uaWQpCiAJCQkJY29udGludWU7CiAJCQlpZiAoIXByb2NbaV0uaGFuZGxlciB8fAotCQkJICAgICBwcm9jW2ldLmhhbmRsZXIoZW50cnksIHRhYmxlX2VuZCkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkgICAgICghZXJycyAmJiBwcm9jW2ldLmhhbmRsZXIoZW50cnksIHRhYmxlX2VuZCkpKSB7CisJCQkJZXJycysrOworCQkJCWNvbnRpbnVlOworCQkJfQogCi0JCQlwcm9jLT5jb3VudCsrOworCQkJcHJvY1tpXS5jb3VudCsrOwogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKGkgIT0gcHJvY19udW0pCkBAIC0zMDEsMTEgKzMwMywxMSBAQAogCX0KIAogCWlmIChtYXhfZW50cmllcyAmJiBjb3VudCA+IG1heF9lbnRyaWVzKSB7Ci0JCXByX3dhcm4oIlslNC40czoweCUwMnhdIGlnbm9yZWQgJWkgZW50cmllcyBvZiAlaSBmb3VuZFxuIiwKLQkJCWlkLCBwcm9jLT5pZCwgY291bnQgLSBtYXhfZW50cmllcywgY291bnQpOworCQlwcl93YXJuKCJbJTQuNHM6MHglMDJ4XSBmb3VuZCB0aGUgbWF4aW11bSAlaSBlbnRyaWVzXG4iLAorCQkJaWQsIHByb2MtPmlkLCBjb3VudCk7CiAJfQogCi0JcmV0dXJuIGNvdW50OworCXJldHVybiBlcnJzID8gLUVJTlZBTCA6IGNvdW50OwogfQogCiBpbnQgX19pbml0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FtYmEvYnVzLmMgYi9kcml2ZXJzL2FtYmEvYnVzLmMKaW5kZXggYTViNWM4Ny4uYTU2ZmEyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hbWJhL2J1cy5jCisrKyBiL2RyaXZlcnMvYW1iYS9idXMuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2l6ZXMuaD4KICNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsvY2xrLWNvbmYuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIApAQCAtMjM3LDYgKzIzOCwxMCBAQAogCWludCByZXQ7CiAKIAlkbyB7CisJCXJldCA9IG9mX2Nsa19zZXRfZGVmYXVsdHMoZGV2LT5vZl9ub2RlLCBmYWxzZSk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisKIAkJcmV0ID0gZGV2X3BtX2RvbWFpbl9hdHRhY2goZGV2LCB0cnVlKTsKIAkJaWYgKHJldCA9PSAtRVBST0JFX0RFRkVSKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FuZHJvaWQvYmluZGVyLmMgYi9kcml2ZXJzL2FuZHJvaWQvYmluZGVyLmMKaW5kZXggMTYyODhlNy4uNTYyYWY5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hbmRyb2lkL2JpbmRlci5jCisrKyBiL2RyaXZlcnMvYW5kcm9pZC9iaW5kZXIuYwpAQCAtNTksNyArNTksNiBAQAogc3RhdGljIHN0cnVjdCBiaW5kZXJfbm9kZSAqYmluZGVyX2NvbnRleHRfbWdyX25vZGU7CiBzdGF0aWMga3VpZF90IGJpbmRlcl9jb250ZXh0X21ncl91aWQgPSBJTlZBTElEX1VJRDsKIHN0YXRpYyBpbnQgYmluZGVyX2xhc3RfaWQ7Ci1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJpbmRlcl9kZWZlcnJlZF93b3JrcXVldWU7CiAKICNkZWZpbmUgQklOREVSX0RFQlVHX0VOVFJZKG5hbWUpIFwKIHN0YXRpYyBpbnQgYmluZGVyXyMjbmFtZSMjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpIFwKQEAgLTMyMjcsNyArMzIyNiw3IEBACiAJaWYgKGhsaXN0X3VuaGFzaGVkKCZwcm9jLT5kZWZlcnJlZF93b3JrX25vZGUpKSB7CiAJCWhsaXN0X2FkZF9oZWFkKCZwcm9jLT5kZWZlcnJlZF93b3JrX25vZGUsCiAJCQkJJmJpbmRlcl9kZWZlcnJlZF9saXN0KTsKLQkJcXVldWVfd29yayhiaW5kZXJfZGVmZXJyZWRfd29ya3F1ZXVlLCAmYmluZGVyX2RlZmVycmVkX3dvcmspOworCQlzY2hlZHVsZV93b3JrKCZiaW5kZXJfZGVmZXJyZWRfd29yayk7CiAJfQogCW11dGV4X3VubG9jaygmYmluZGVyX2RlZmVycmVkX2xvY2spOwogfQpAQCAtMzY3OSwxMCArMzY3OCw2IEBACiB7CiAJaW50IHJldDsKIAotCWJpbmRlcl9kZWZlcnJlZF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYmluZGVyIik7Ci0JaWYgKCFiaW5kZXJfZGVmZXJyZWRfd29ya3F1ZXVlKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCWJpbmRlcl9kZWJ1Z2ZzX2Rpcl9lbnRyeV9yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKCJiaW5kZXIiLCBOVUxMKTsKIAlpZiAoYmluZGVyX2RlYnVnZnNfZGlyX2VudHJ5X3Jvb3QpCiAJCWJpbmRlcl9kZWJ1Z2ZzX2Rpcl9lbnRyeV9wcm9jID0gZGVidWdmc19jcmVhdGVfZGlyKCJwcm9jIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmFoY2kuYyBiL2RyaXZlcnMvYXRhL2xpYmFoY2kuYwppbmRleCA3NDYxYTU4Li5kY2YyYzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhaGNpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYWhjaS5jCkBAIC0yNTI0LDcgKzI1MjQsNyBAQAogCiAJCS8qIERvIG5vdCByZWNlaXZlIGludGVycnVwdHMgc2VudCBieSBkdW1teSBwb3J0cyAqLwogCQlpZiAoIXBwKSB7Ci0JCQlkaXNhYmxlX2lycShpcnEgKyBpKTsKKwkJCWRpc2FibGVfaXJxKGlycSk7CiAJCQljb250aW51ZTsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX25pbmphMzIuYyBiL2RyaXZlcnMvYXRhL3BhdGFfbmluamEzMi5jCmluZGV4IDYzM2FhMjkuLjQ0Zjk3YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbmluamEzMi5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbmluamEzMi5jCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAlhcC0+aW9hZGRyLmFsdHN0YXR1c19hZGRyID0gYmFzZSArIDB4MUU7CiAJYXAtPmlvYWRkci5ibWRtYV9hZGRyID0gYmFzZTsKIAlhdGFfc2ZmX3N0ZF9wb3J0cygmYXAtPmlvYWRkcik7Ci0JYXAtPnBmbGFncyA9IEFUQV9QRkxBR19QSU8zMiB8IEFUQV9QRkxBR19QSU8zMkNIQU5HRTsKKwlhcC0+cGZsYWdzIHw9IEFUQV9QRkxBR19QSU8zMiB8IEFUQV9QRkxBR19QSU8zMkNIQU5HRTsKIAogCW5pbmphMzJfcHJvZ3JhbShiYXNlKTsKIAkvKiBGSVhNRTogU2hvdWxkIHdlIGRpc2FibGUgdGhlbSBhdCByZW1vdmUgPyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZW5pLmMgYi9kcml2ZXJzL2F0bS9lbmkuYwppbmRleCA2MzM5ZWZkLi5mMmFhZjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9lbmkuYworKysgYi9kcml2ZXJzL2F0bS9lbmkuYwpAQCAtMTg0NSw4ICsxODQ1LDkgQEAKIAkvKiBpbml0aWFsaXplIG1lbW9yeSBtYW5hZ2VtZW50ICovCiAJYnVmZmVyX21lbSA9IGVuaV9kZXYtPm1lbSAtIChidWYgLSBlbmlfZGV2LT5yYW0pOwogCWVuaV9kZXYtPmZyZWVfbGlzdF9zaXplID0gYnVmZmVyX21lbS9NSURfTUlOX0JVRl9TSVpFLzI7Ci0JZW5pX2Rldi0+ZnJlZV9saXN0ID0ga21hbGxvYygKLQkgICAgc2l6ZW9mKHN0cnVjdCBlbmlfZnJlZSkqKGVuaV9kZXYtPmZyZWVfbGlzdF9zaXplKzEpLEdGUF9LRVJORUwpOworCWVuaV9kZXYtPmZyZWVfbGlzdCA9IGttYWxsb2NfYXJyYXkoZW5pX2Rldi0+ZnJlZV9saXN0X3NpemUgKyAxLAorCQkJCQkgICBzaXplb2YoKmVuaV9kZXYtPmZyZWVfbGlzdCksCisJCQkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghZW5pX2Rldi0+ZnJlZV9saXN0KSB7CiAJCXByaW50ayhLRVJOX0VSUiBERVZfTEFCRUwgIihpdGYgJWQpOiBjb3VsZG4ndCBnZXQgZnJlZSBwYWdlXG4iLAogCQkgICAgZGV2LT5udW1iZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZm9yZTIwMGUuYyBiL2RyaXZlcnMvYXRtL2ZvcmUyMDBlLmMKaW5kZXggNzVkZGU5MC4uODFhYWE1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vZm9yZTIwMGUuYworKysgYi9kcml2ZXJzL2F0bS9mb3JlMjAwZS5jCkBAIC0yNDg5LDcgKzI0ODksNyBAQAogewogICAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZmlybXdhcmU7CiAgICAgc3RydWN0IGRldmljZSAqZGV2aWNlOwotICAgIHN0cnVjdCBmd19oZWFkZXIgKmZ3X2hlYWRlcjsKKyAgICBjb25zdCBzdHJ1Y3QgZndfaGVhZGVyICpmd19oZWFkZXI7CiAgICAgY29uc3QgX19sZTMyICpmd19kYXRhOwogICAgIHUzMiBmd19zaXplOwogICAgIHUzMiBfX2lvbWVtICpsb2FkX2FkZHI7CkBAIC0yNTExLDkgKzI1MTEsOSBAQAogCXJldHVybiBlcnI7CiAgICAgfQogCi0gICAgZndfZGF0YSA9IChfX2xlMzIgKikgZmlybXdhcmUtPmRhdGE7CisgICAgZndfZGF0YSA9IChjb25zdCBfX2xlMzIgKilmaXJtd2FyZS0+ZGF0YTsKICAgICBmd19zaXplID0gZmlybXdhcmUtPnNpemUgLyBzaXplb2YodTMyKTsKLSAgICBmd19oZWFkZXIgPSAoc3RydWN0IGZ3X2hlYWRlciAqKSBmaXJtd2FyZS0+ZGF0YTsKKyAgICBmd19oZWFkZXIgPSAoY29uc3Qgc3RydWN0IGZ3X2hlYWRlciAqKWZpcm13YXJlLT5kYXRhOwogICAgIGxvYWRfYWRkciA9IGZvcmUyMDBlLT52aXJ0X2Jhc2UgKyBsZTMyX3RvX2NwdShmd19oZWFkZXItPmxvYWRfb2Zmc2V0KTsKIAogICAgIERQUklOVEsoMiwgImRldmljZSAlcyBmaXJtd2FyZSBiZWluZyBsb2FkZWQgYXQgMHglcCAoJWQgd29yZHMpXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaGUuYyBiL2RyaXZlcnMvYXRtL2hlLmMKaW5kZXggMGY1Y2IzNy4uMzFiNTEzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaGUuYworKysgYi9kcml2ZXJzL2F0bS9oZS5jCkBAIC03NzksOCArNzc5LDkgQEAKIAkJICBHMF9SQlBTX0JTICsgKGdyb3VwICogMzIpKTsKIAogCS8qIGJpdG1hcCB0YWJsZSAqLwotCWhlX2Rldi0+cmJwbF90YWJsZSA9IGttYWxsb2MoQklUU19UT19MT05HUyhSQlBMX1RBQkxFX1NJWkUpCi0JCQkJICAgICAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwgR0ZQX0tFUk5FTCk7CisJaGVfZGV2LT5yYnBsX3RhYmxlID0ga21hbGxvY19hcnJheShCSVRTX1RPX0xPTkdTKFJCUExfVEFCTEVfU0laRSksCisJCQkJCSAgIHNpemVvZigqaGVfZGV2LT5yYnBsX3RhYmxlKSwKKwkJCQkJICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFoZV9kZXYtPnJicGxfdGFibGUpIHsKIAkJaHByaW50aygidW5hYmxlIHRvIGFsbG9jYXRlIHJicGwgYml0bWFwIHRhYmxlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC03ODgsOCArNzg5LDkgQEAKIAliaXRtYXBfemVybyhoZV9kZXYtPnJicGxfdGFibGUsIFJCUExfVEFCTEVfU0laRSk7CiAKIAkvKiByYnBsX3ZpcnQgNjQtYml0IHBvaW50ZXJzICovCi0JaGVfZGV2LT5yYnBsX3ZpcnQgPSBrbWFsbG9jKFJCUExfVEFCTEVfU0laRQotCQkJCSAgICAqIHNpemVvZihzdHJ1Y3QgaGVfYnVmZiAqKSwgR0ZQX0tFUk5FTCk7CisJaGVfZGV2LT5yYnBsX3ZpcnQgPSBrbWFsbG9jX2FycmF5KFJCUExfVEFCTEVfU0laRSwKKwkJCQkJICBzaXplb2YoKmhlX2Rldi0+cmJwbF92aXJ0KSwKKwkJCQkJICBHRlBfS0VSTkVMKTsKIAlpZiAoIWhlX2Rldi0+cmJwbF92aXJ0KSB7CiAJCWhwcmludGsoInVuYWJsZSB0byBhbGxvY2F0ZSByYnBsIHZpcnQgdGFibGVcbiIpOwogCQlnb3RvIG91dF9mcmVlX3JicGxfdGFibGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9pcGhhc2UuYyBiL2RyaXZlcnMvYXRtL2lwaGFzZS5jCmluZGV4IDgwOWRkMWUuLmIyNzU2NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2lwaGFzZS5jCisrKyBiL2RyaXZlcnMvYXRtL2lwaGFzZS5jCkBAIC0xODg1LDkgKzE4ODUsOSBAQAogICAgICAgICAgICAgICAgIGlmICgocmV0ID0gaWFfY2JyX3NldHVwIChpYWRldiwgdmNjKSkgPCAwKSB7ICAgICAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgfSAKLQllbHNlICAKLSAgICAgICAgICAgcHJpbnRrKCJpYWRldjogIE5vbiBVQlIsIEFCUiBhbmQgQ0JSIHRyYWZmaWMgbm90IHN1cHBvcnRlZG4iKTsgCisJfSBlbHNlIHsKKwkJcHJpbnRrKCJpYWRldjogIE5vbiBVQlIsIEFCUiBhbmQgQ0JSIHRyYWZmaWMgbm90IHN1cHBvcnRlZFxuIik7CisJfQogICAgICAgICAKICAgICAgICAgaWFkZXYtPnRlc3RUYWJsZVt2Y2MtPnZjaV0tPnZjX3N0YXR1cyB8PSBWQ19BQ1RJVkU7CiAJSUZfRVZFTlQocHJpbnRrKCJpYSBvcGVuX3R4IHJldHVybmluZyBcbiIpOykgIApAQCAtMTk3NSw3ICsxOTc1LDkgQEAKIAkJYnVmX2Rlc2NfcHRyKys7CQkgIAogCQl0eF9wa3Rfc3RhcnQgKz0gaWFkZXYtPnR4X2J1Zl9zejsgIAogCX0gIAotICAgICAgICBpYWRldi0+dHhfYnVmID0ga21hbGxvYyhpYWRldi0+bnVtX3R4X2Rlc2Mqc2l6ZW9mKHN0cnVjdCBjcGNzX3RyYWlsZXJfZGVzYyksIEdGUF9LRVJORUwpOworCWlhZGV2LT50eF9idWYgPSBrbWFsbG9jX2FycmF5KGlhZGV2LT5udW1fdHhfZGVzYywKKwkJCQkgICAgICBzaXplb2YoKmlhZGV2LT50eF9idWYpLAorCQkJCSAgICAgIEdGUF9LRVJORUwpOwogICAgICAgICBpZiAoIWlhZGV2LT50eF9idWYpIHsKICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiBERVZfTEFCRUwgIiBjb3VsZG4ndCBnZXQgbWVtXG4iKTsKIAkgICAgZ290byBlcnJfZnJlZV9kbGU7CkBAIC0xOTk1LDggKzE5OTcsOSBAQAogCQkJCQkJICAgICAgIHNpemVvZigqY3BjcyksCiAJCQkJCQkgICAgICAgRE1BX1RPX0RFVklDRSk7CiAgICAgICAgIH0KLSAgICAgICAgaWFkZXYtPmRlc2NfdGJsID0ga21hbGxvYyhpYWRldi0+bnVtX3R4X2Rlc2MgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGRlc2NfdGJsX3QpLCBHRlBfS0VSTkVMKTsKKwlpYWRldi0+ZGVzY190YmwgPSBrbWFsbG9jX2FycmF5KGlhZGV2LT5udW1fdHhfZGVzYywKKwkJCQkJc2l6ZW9mKCppYWRldi0+ZGVzY190YmwpLAorCQkJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIWlhZGV2LT5kZXNjX3RibCkgewogCQlwcmludGsoS0VSTl9FUlIgREVWX0xBQkVMICIgY291bGRuJ3QgZ2V0IG1lbVxuIik7CiAJCWdvdG8gZXJyX2ZyZWVfYWxsX3R4X2J1ZnM7CkBAIC0yMTI0LDcgKzIxMjcsOSBAQAogCW1lbXNldCgoY2FkZHJfdCkoaWFkZXYtPnNlZ19yYW0raSksICAwLCBpYWRldi0+bnVtX3ZjKjQpOwogCXZjID0gKHN0cnVjdCBtYWluX3ZjICopaWFkZXYtPk1BSU5fVkNfVEFCTEVfQUREUjsgIAogCWV2YyA9IChzdHJ1Y3QgZXh0X3ZjICopaWFkZXYtPkVYVF9WQ19UQUJMRV9BRERSOyAgCi0gICAgICAgIGlhZGV2LT50ZXN0VGFibGUgPSBrbWFsbG9jKHNpemVvZihsb25nKSppYWRldi0+bnVtX3ZjLCBHRlBfS0VSTkVMKTsgCisJaWFkZXYtPnRlc3RUYWJsZSA9IGttYWxsb2NfYXJyYXkoaWFkZXYtPm51bV92YywKKwkJCQkJIHNpemVvZigqaWFkZXYtPnRlc3RUYWJsZSksCisJCQkJCSBHRlBfS0VSTkVMKTsKICAgICAgICAgaWYgKCFpYWRldi0+dGVzdFRhYmxlKSB7CiAgICAgICAgICAgIHByaW50aygiR2V0IGZyZWVwYWdlICBmYWlsZWRcbiIpOwogCSAgIGdvdG8gZXJyX2ZyZWVfZGVzY190Ymw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9uaWNzdGFyLmMgYi9kcml2ZXJzL2F0bS9uaWNzdGFyLmMKaW5kZXggNzAwZWQxNS4uYzcyOTZiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vbmljc3Rhci5jCisrKyBiL2RyaXZlcnMvYXRtL25pY3N0YXIuYwpAQCAtMzcwLDcgKzM3MCw4IEBACiAJCXJldHVybiBlcnJvcjsKICAgICAgICAgfQogCi0JaWYgKChjYXJkID0ga21hbGxvYyhzaXplb2YobnNfZGV2KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwljYXJkID0ga21hbGxvYyhzaXplb2YoKmNhcmQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhcmQpIHsKIAkJcHJpbnRrCiAJCSAgICAoIm5pY3N0YXIlZDogY2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2Ugc3RydWN0dXJlLlxuIiwKIAkJICAgICBpKTsKQEAgLTYxMSw3ICs2MTIsNyBAQAogCWZvciAoaiA9IDA7IGogPCBjYXJkLT5yY3Rfc2l6ZTsgaisrKQogCQluc193cml0ZV9zcmFtKGNhcmQsIGogKiA0LCB1MzJkLCA0KTsKIAotCW1lbXNldChjYXJkLT52Y21hcCwgMCwgTlNfTUFYX1JDVFNJWkUgKiBzaXplb2YodmNfbWFwKSk7CisJbWVtc2V0KGNhcmQtPnZjbWFwLCAwLCBzaXplb2YoY2FyZC0+dmNtYXApKTsKIAogCWZvciAoaiA9IDA7IGogPCBOU19GUlNDRF9OVU07IGorKykKIAkJY2FyZC0+c2NkMnZjW2pdID0gTlVMTDsKQEAgLTg2Miw3ICs4NjMsNyBAQAogCWlmIChzaXplICE9IFZCUl9TQ1FTSVpFICYmIHNpemUgIT0gQ0JSX1NDUVNJWkUpCiAJCXJldHVybiBOVUxMOwogCi0Jc2NxID0ga21hbGxvYyhzaXplb2Yoc2NxX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlzY3EgPSBrbWFsbG9jKHNpemVvZigqc2NxKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzY3EpCiAJCXJldHVybiBOVUxMOwogICAgICAgICBzY3EtPm9yZyA9IGRtYV9hbGxvY19jb2hlcmVudCgmY2FyZC0+cGNpZGV2LT5kZXYsCkBAIC04NzEsOCArODcyLDkgQEAKIAkJa2ZyZWUoc2NxKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCXNjcS0+c2tiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNrX2J1ZmYgKikgKgotCQkJICAgKHNpemUgLyBOU19TQ1FFX1NJWkUpLCBHRlBfS0VSTkVMKTsKKwlzY3EtPnNrYiA9IGttYWxsb2NfYXJyYXkoc2l6ZSAvIE5TX1NDUUVfU0laRSwKKwkJCQkgc2l6ZW9mKCpzY3EtPnNrYiksCisJCQkJIEdGUF9LRVJORUwpOwogCWlmICghc2NxLT5za2IpIHsKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJmNhcmQtPnBjaWRldi0+ZGV2LAogCQkJCSAgMiAqIHNpemUsIHNjcS0+b3JnLCBzY3EtPmRtYSk7CkBAIC0yMDIxLDcgKzIwMjMsOCBAQAogCiAJCWNlbGwgPSBza2ItPmRhdGE7CiAJCWZvciAoaSA9IG5zX3JzcWVfY2VsbGNvdW50KHJzcWUpOyBpOyBpLS0pIHsKLQkJCWlmICgoc2IgPSBkZXZfYWxsb2Nfc2tiKE5TX1NNU0tCU0laRSkpID09IE5VTEwpIHsKKwkJCXNiID0gZGV2X2FsbG9jX3NrYihOU19TTVNLQlNJWkUpOworCQkJaWYgKCFzYikgewogCQkJCXByaW50awogCQkJCSAgICAoIm5pY3N0YXIlZDogQ2FuJ3QgYWxsb2NhdGUgYnVmZmVycyBmb3IgYWFsMC5cbiIsCiAJCQkJICAgICBjYXJkLT5pbmRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS96YXRtLmMgYi9kcml2ZXJzL2F0bS96YXRtLmMKaW5kZXggY2VjZmI5NC4uZDNkYzk1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vemF0bS5jCisrKyBiL2RyaXZlcnMvYXRtL3phdG0uYwpAQCAtNTk4LDEyICs1OTgsMTMgQEAKIHN0YXRpYyBpbnQgc3RhcnRfcngoc3RydWN0IGF0bV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgemF0bV9kZXYgKnphdG1fZGV2OwotCWludCBzaXplLGk7CisJaW50IGk7CiAKLURQUklOVEsoInN0YXJ0X3J4XG4iKTsKKwlEUFJJTlRLKCJzdGFydF9yeFxuIik7CiAJemF0bV9kZXYgPSBaQVRNX0RFVihkZXYpOwotCXNpemUgPSBzaXplb2Yoc3RydWN0IGF0bV92Y2MgKikqemF0bV9kZXYtPmNoYW5zOwotCXphdG1fZGV2LT5yeF9tYXAgPSAga3phbGxvYyhzaXplLEdGUF9LRVJORUwpOworCXphdG1fZGV2LT5yeF9tYXAgPSBrY2FsbG9jKHphdG1fZGV2LT5jaGFucywKKwkJCQkgICBzaXplb2YoKnphdG1fZGV2LT5yeF9tYXApLAorCQkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghemF0bV9kZXYtPnJ4X21hcCkgcmV0dXJuIC1FTk9NRU07CiAJLyogc2V0IFZQSS9WQ0kgc3BsaXQgKHVzZSBhbGwgVkNJcyBhbmQgZ2l2ZSB3aGF0J3MgbGVmdCB0byBWUElzKSAqLwogCXpwb2tlbCh6YXRtX2RldiwoMSA8PCBkZXYtPmNpX3JhbmdlLnZjaV9iaXRzKS0xLHVQRDk4NDAxX1ZSUik7CkBAIC05OTgsOCArOTk5LDkgQEAKIAogCURQUklOVEsoInN0YXJ0X3R4XG4iKTsKIAl6YXRtX2RldiA9IFpBVE1fREVWKGRldik7Ci0JemF0bV9kZXYtPnR4X21hcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdG1fdmNjICopKgotCSAgICB6YXRtX2Rldi0+Y2hhbnMsR0ZQX0tFUk5FTCk7CisJemF0bV9kZXYtPnR4X21hcCA9IGttYWxsb2NfYXJyYXkoemF0bV9kZXYtPmNoYW5zLAorCQkJCQkgc2l6ZW9mKCp6YXRtX2Rldi0+dHhfbWFwKSwKKwkJCQkJIEdGUF9LRVJORUwpOwogCWlmICghemF0bV9kZXYtPnR4X21hcCkgcmV0dXJuIC1FTk9NRU07CiAJemF0bV9kZXYtPnR4X2J3ID0gQVRNX09DM19QQ1I7CiAJemF0bV9kZXYtPmZyZWVfc2hhcGVycyA9ICgxIDw8IE5SX1NIQVBFUlMpLTE7CkBAIC0xMzk4LDcgKzE0MDAsNyBAQAogCURQUklOVEsoREVWX0xBQkVMICIoaXRmICVkKTogb3BlbiAlZC4lZFxuIix2Y2MtPmRldi0+bnVtYmVyLHZjYy0+dnBpLAogCSAgICB2Y2MtPnZjaSk7CiAJaWYgKCF0ZXN0X2JpdChBVE1fVkZfUEFSVElBTCwmdmNjLT5mbGFncykpIHsKLQkJemF0bV92Y2MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgemF0bV92Y2MpLEdGUF9LRVJORUwpOworCQl6YXRtX3ZjYyA9IGttYWxsb2Moc2l6ZW9mKCp6YXRtX3ZjYyksIEdGUF9LRVJORUwpOwogCQlpZiAoIXphdG1fdmNjKSB7CiAJCQljbGVhcl9iaXQoQVRNX1ZGX0FERFIsJnZjYy0+ZmxhZ3MpOwogCQkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvS2NvbmZpZyBiL2RyaXZlcnMvYmFzZS9LY29uZmlnCmluZGV4IDk4NTA0ZWMuLmZkZjQ0Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYmFzZS9LY29uZmlnCkBAIC0yMTIsNiArMjEyLDE2IEBACiAKIAkgIElmIHlvdSBhcmUgdW5zdXJlIGFib3V0IHRoaXMsIFNheSBOIGhlcmUuCiAKK2NvbmZpZyBERUJVR19URVNUX0RSSVZFUl9SRU1PVkUKKwlib29sICJUZXN0IGRyaXZlciByZW1vdmUgY2FsbHMgZHVyaW5nIHByb2JlIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0aGUgRHJpdmVyIGNvcmUgdG8gdGVzdCBkcml2ZXIgcmVtb3ZlIGZ1bmN0aW9ucworCSAgYnkgY2FsbGluZyBwcm9iZSwgcmVtb3ZlLCBwcm9iZS4gVGhpcyB0ZXN0cyB0aGUgcmVtb3ZlIHBhdGggd2l0aG91dAorCSAgaGF2aW5nIHRvIHVuYmluZCB0aGUgZHJpdmVyIG9yIHVubG9hZCB0aGUgZHJpdmVyIG1vZHVsZS4KKworCSAgSWYgeW91IGFyZSB1bnN1cmUgYWJvdXQgdGhpcywgc2F5IE4gaGVyZS4KKwogY29uZmlnIFNZU19IWVBFUlZJU09SCiAJYm9vbAogCWRlZmF1bHQgbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYyBiL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMKaW5kZXggMmJhNGNhYy4uOTVlM2VmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYworKysgYi9kcml2ZXJzL2Jhc2UvYXR0cmlidXRlX2NvbnRhaW5lci5jCkBAIC0yNDMsNyArMjQzLDcgQEAKICAqIEBkZXY6ICBUaGUgZ2VuZXJpYyBkZXZpY2UgdG8gcnVuIHRoZSB0cmlnZ2VyIGZvcgogICogQGZuCSAgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZm9yIGVhY2ggY2xhc3NkZXYuCiAgKgotICogVGhpcyBmdW5jaW9uIGlzIGZvciBleGVjdXRpbmcgYSB0cmlnZ2VyIHdoZW4geW91IG5lZWQgdG8ga25vdyBib3RoCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGZvciBleGVjdXRpbmcgYSB0cmlnZ2VyIHdoZW4geW91IG5lZWQgdG8ga25vdyBib3RoCiAgKiB0aGUgY29udGFpbmVyIGFuZCB0aGUgY2xhc3NkZXYuICBJZiB5b3Ugb25seSBjYXJlIGFib3V0IHRoZQogICogY29udGFpbmVyLCB0aGVuIHVzZSBhdHRyaWJ1dGVfY29udGFpbmVyX3RyaWdnZXIoKSBpbnN0ZWFkLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuYwppbmRleCAwYThiZGFkLi5jZTA1N2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKQEAgLTgzNiwxMSArODM2LDI5IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBsaXZlX2luX2dsdWVfZGlyKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKCFrb2JqIHx8ICFkZXYtPmNsYXNzIHx8CisJICAgIGtvYmotPmtzZXQgIT0gJmRldi0+Y2xhc3MtPnAtPmdsdWVfZGlycykKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBrb2JqZWN0ICpnZXRfZ2x1ZV9kaXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPmtvYmoucGFyZW50OworfQorCisvKgorICogbWFrZSBzdXJlIGNsZWFuaW5nIHVwIGRpciBhcyB0aGUgbGFzdCBzdGVwLCB3ZSBuZWVkIHRvIG1ha2UKKyAqIHN1cmUgLnJlbGVhc2UgaGFuZGxlciBvZiBrb2JqZWN0IGlzIHJ1biB3aXRoIGhvbGRpbmcgdGhlCisgKiBnbG9iYWwgbG9jaworICovCiBzdGF0aWMgdm9pZCBjbGVhbnVwX2dsdWVfZGlyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmplY3QgKmdsdWVfZGlyKQogewogCS8qIHNlZSBpZiB3ZSBsaXZlIGluIGEgImdsdWUiIGRpcmVjdG9yeSAqLwotCWlmICghZ2x1ZV9kaXIgfHwgIWRldi0+Y2xhc3MgfHwKLQkgICAgZ2x1ZV9kaXItPmtzZXQgIT0gJmRldi0+Y2xhc3MtPnAtPmdsdWVfZGlycykKKwlpZiAoIWxpdmVfaW5fZ2x1ZV9kaXIoZ2x1ZV9kaXIsIGRldikpCiAJCXJldHVybjsKIAogCW11dGV4X2xvY2soJmdkcF9tdXRleCk7CkBAIC04NDgsMTEgKzg2Niw2IEBACiAJbXV0ZXhfdW5sb2NrKCZnZHBfbXV0ZXgpOwogfQogCi1zdGF0aWMgdm9pZCBjbGVhbnVwX2RldmljZV9wYXJlbnQoc3RydWN0IGRldmljZSAqZGV2KQotewotCWNsZWFudXBfZ2x1ZV9kaXIoZGV2LCBkZXYtPmtvYmoucGFyZW50KTsKLX0KLQogc3RhdGljIGludCBkZXZpY2VfYWRkX2NsYXNzX3N5bWxpbmtzKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUgPSBkZXZfb2Zfbm9kZShkZXYpOwpAQCAtMTAyOCw2ICsxMDQxLDcgQEAKIAlzdHJ1Y3Qga29iamVjdCAqa29iajsKIAlzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICpjbGFzc19pbnRmOwogCWludCBlcnJvciA9IC1FSU5WQUw7CisJc3RydWN0IGtvYmplY3QgKmdsdWVfZGlyID0gTlVMTDsKIAogCWRldiA9IGdldF9kZXZpY2UoZGV2KTsKIAlpZiAoIWRldikKQEAgLTEwNzIsOCArMTA4NiwxMCBAQAogCS8qIGZpcnN0LCByZWdpc3RlciB3aXRoIGdlbmVyaWMgbGF5ZXIuICovCiAJLyogd2UgcmVxdWlyZSB0aGUgbmFtZSB0byBiZSBzZXQgYmVmb3JlLCBhbmQgcGFzcyBOVUxMICovCiAJZXJyb3IgPSBrb2JqZWN0X2FkZCgmZGV2LT5rb2JqLCBkZXYtPmtvYmoucGFyZW50LCBOVUxMKTsKLQlpZiAoZXJyb3IpCisJaWYgKGVycm9yKSB7CisJCWdsdWVfZGlyID0gZ2V0X2dsdWVfZGlyKGRldik7CiAJCWdvdG8gRXJyb3I7CisJfQogCiAJLyogbm90aWZ5IHBsYXRmb3JtIG9mIGRldmljZSBlbnRyeSAqLwogCWlmIChwbGF0Zm9ybV9ub3RpZnkpCkBAIC0xMTU0LDkgKzExNzAsMTAgQEAKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdWV2ZW50KTsKICBhdHRyRXJyb3I6CiAJa29iamVjdF91ZXZlbnQoJmRldi0+a29iaiwgS09CSl9SRU1PVkUpOworCWdsdWVfZGlyID0gZ2V0X2dsdWVfZGlyKGRldik7CiAJa29iamVjdF9kZWwoJmRldi0+a29iaik7CiAgRXJyb3I6Ci0JY2xlYW51cF9kZXZpY2VfcGFyZW50KGRldik7CisJY2xlYW51cF9nbHVlX2RpcihkZXYsIGdsdWVfZGlyKTsKIAlwdXRfZGV2aWNlKHBhcmVudCk7CiBuYW1lX2Vycm9yOgogCWtmcmVlKGRldi0+cCk7CkBAIC0xMjMyLDYgKzEyNDksNyBAQAogdm9pZCBkZXZpY2VfZGVsKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSBkZXYtPnBhcmVudDsKKwlzdHJ1Y3Qga29iamVjdCAqZ2x1ZV9kaXIgPSBOVUxMOwogCXN0cnVjdCBjbGFzc19pbnRlcmZhY2UgKmNsYXNzX2ludGY7CiAKIAkvKiBOb3RpZnkgY2xpZW50cyBvZiBkZXZpY2UgcmVtb3ZhbC4gIFRoaXMgY2FsbCBtdXN0IGNvbWUKQEAgLTEyNjYsNiArMTI4NCw3IEBACiAJYnVzX3JlbW92ZV9kZXZpY2UoZGV2KTsKIAlkZXZpY2VfcG1fcmVtb3ZlKGRldik7CiAJZHJpdmVyX2RlZmVycmVkX3Byb2JlX2RlbChkZXYpOworCWRldmljZV9yZW1vdmVfcHJvcGVydGllcyhkZXYpOwogCiAJLyogTm90aWZ5IHRoZSBwbGF0Zm9ybSBvZiB0aGUgcmVtb3ZhbCwgaW4gY2FzZSB0aGV5CiAJICogbmVlZCB0byBkbyBhbnl0aGluZy4uLgpAQCAtMTI3Niw4ICsxMjk1LDkgQEAKIAkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGV2LT5idXMtPnAtPmJ1c19ub3RpZmllciwKIAkJCQkJICAgICBCVVNfTk9USUZZX1JFTU9WRURfREVWSUNFLCBkZXYpOwogCWtvYmplY3RfdWV2ZW50KCZkZXYtPmtvYmosIEtPQkpfUkVNT1ZFKTsKLQljbGVhbnVwX2RldmljZV9wYXJlbnQoZGV2KTsKKwlnbHVlX2RpciA9IGdldF9nbHVlX2RpcihkZXYpOwogCWtvYmplY3RfZGVsKCZkZXYtPmtvYmopOworCWNsZWFudXBfZ2x1ZV9kaXIoZGV2LCBnbHVlX2Rpcik7CiAJcHV0X2RldmljZShwYXJlbnQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX2RlbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY3B1LmMgYi9kcml2ZXJzL2Jhc2UvY3B1LmMKaW5kZXggNjkxZWVlYS4uNGMyOGUxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NwdS5jCisrKyBiL2RyaXZlcnMvYmFzZS9jcHUuYwpAQCAtMzcxLDEyICszNzEsMTMgQEAKIAlpZiAoY3B1LT5ob3RwbHVnZ2FibGUpCiAJCWNwdS0+ZGV2Lmdyb3VwcyA9IGhvdHBsdWdhYmxlX2NwdV9hdHRyX2dyb3VwczsKIAllcnJvciA9IGRldmljZV9yZWdpc3RlcigmY3B1LT5kZXYpOwotCWlmICghZXJyb3IpCi0JCXBlcl9jcHUoY3B1X3N5c19kZXZpY2VzLCBudW0pID0gJmNwdS0+ZGV2OwotCWlmICghZXJyb3IpCi0JCXJlZ2lzdGVyX2NwdV91bmRlcl9ub2RlKG51bSwgY3B1X3RvX25vZGUobnVtKSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CiAKLQlyZXR1cm4gZXJyb3I7CisJcGVyX2NwdShjcHVfc3lzX2RldmljZXMsIG51bSkgPSAmY3B1LT5kZXY7CisJcmVnaXN0ZXJfY3B1X3VuZGVyX25vZGUobnVtLCBjcHVfdG9fbm9kZShudW0pKTsKKworCXJldHVybiAwOwogfQogCiBzdHJ1Y3QgZGV2aWNlICpnZXRfY3B1X2RldmljZSh1bnNpZ25lZCBjcHUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZGQuYyBiL2RyaXZlcnMvYmFzZS9kZC5jCmluZGV4IDE2Njg4ZjUuLmQyMmE3MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kZC5jCisrKyBiL2RyaXZlcnMvYmFzZS9kZC5jCkBAIC01MSw3ICs1MSw2IEBACiBzdGF0aWMgREVGSU5FX01VVEVYKGRlZmVycmVkX3Byb2JlX211dGV4KTsKIHN0YXRpYyBMSVNUX0hFQUQoZGVmZXJyZWRfcHJvYmVfcGVuZGluZ19saXN0KTsKIHN0YXRpYyBMSVNUX0hFQUQoZGVmZXJyZWRfcHJvYmVfYWN0aXZlX2xpc3QpOwotc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpkZWZlcnJlZF93cTsKIHN0YXRpYyBhdG9taWNfdCBkZWZlcnJlZF90cmlnZ2VyX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CiAKIC8qCkBAIC0xNzUsNyArMTc0LDcgQEAKIAkgKiBLaWNrIHRoZSByZS1wcm9iZSB0aHJlYWQuICBJdCBtYXkgYWxyZWFkeSBiZSBzY2hlZHVsZWQsIGJ1dCBpdCBpcwogCSAqIHNhZmUgdG8ga2ljayBpdCBhZ2Fpbi4KIAkgKi8KLQlxdWV1ZV93b3JrKGRlZmVycmVkX3dxLCAmZGVmZXJyZWRfcHJvYmVfd29yayk7CisJc2NoZWR1bGVfd29yaygmZGVmZXJyZWRfcHJvYmVfd29yayk7CiB9CiAKIC8qKgpAQCAtMjExLDE0ICsyMTAsMTAgQEAKICAqLwogc3RhdGljIGludCBkZWZlcnJlZF9wcm9iZV9pbml0Y2FsbCh2b2lkKQogewotCWRlZmVycmVkX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImRlZmVyd3EiKTsKLQlpZiAoV0FSTl9PTighZGVmZXJyZWRfd3EpKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCWRyaXZlcl9kZWZlcnJlZF9wcm9iZV9lbmFibGUgPSB0cnVlOwogCWRyaXZlcl9kZWZlcnJlZF9wcm9iZV90cmlnZ2VyKCk7CiAJLyogU29ydCBhcyBtYW55IGRlcGVuZGVuY2llcyBhcyBwb3NzaWJsZSBiZWZvcmUgZXhpdGluZyBpbml0Y2FsbHMgKi8KLQlmbHVzaF93b3JrcXVldWUoZGVmZXJyZWRfd3EpOworCWZsdXNoX3dvcmsoJmRlZmVycmVkX3Byb2JlX3dvcmspOwogCXJldHVybiAwOwogfQogbGF0ZV9pbml0Y2FsbChkZWZlcnJlZF9wcm9iZV9pbml0Y2FsbCk7CkBAIC0zMjksNiArMzI0LDcgQEAKIHsKIAlpbnQgcmV0ID0gLUVQUk9CRV9ERUZFUjsKIAlpbnQgbG9jYWxfdHJpZ2dlcl9jb3VudCA9IGF0b21pY19yZWFkKCZkZWZlcnJlZF90cmlnZ2VyX2NvdW50KTsKKwlib29sIHRlc3RfcmVtb3ZlID0gSVNfRU5BQkxFRChDT05GSUdfREVCVUdfVEVTVF9EUklWRVJfUkVNT1ZFKTsKIAogCWlmIChkZWZlcl9hbGxfcHJvYmVzKSB7CiAJCS8qCkBAIC0zNDYsNiArMzQyLDcgQEAKIAkJIGRydi0+YnVzLT5uYW1lLCBfX2Z1bmNfXywgZHJ2LT5uYW1lLCBkZXZfbmFtZShkZXYpKTsKIAlXQVJOX09OKCFsaXN0X2VtcHR5KCZkZXYtPmRldnJlc19oZWFkKSk7CiAKK3JlX3Byb2JlOgogCWRldi0+ZHJpdmVyID0gZHJ2OwogCiAJLyogSWYgdXNpbmcgcGluY3RybCwgYmluZCBwaW5zIG5vdyBiZWZvcmUgcHJvYmluZyAqLwpAQCAtMzgzLDYgKzM4MCwyNSBAQAogCQkJZ290byBwcm9iZV9mYWlsZWQ7CiAJfQogCisJaWYgKHRlc3RfcmVtb3ZlKSB7CisJCXRlc3RfcmVtb3ZlID0gZmFsc2U7CisKKwkJaWYgKGRldi0+YnVzICYmIGRldi0+YnVzLT5yZW1vdmUpCisJCQlkZXYtPmJ1cy0+cmVtb3ZlKGRldik7CisJCWVsc2UgaWYgKGRydi0+cmVtb3ZlKQorCQkJZHJ2LT5yZW1vdmUoZGV2KTsKKworCQlkZXZyZXNfcmVsZWFzZV9hbGwoZGV2KTsKKwkJZHJpdmVyX3N5c2ZzX3JlbW92ZShkZXYpOworCQlkZXYtPmRyaXZlciA9IE5VTEw7CisJCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCQlpZiAoZGV2LT5wbV9kb21haW4gJiYgZGV2LT5wbV9kb21haW4tPmRpc21pc3MpCisJCQlkZXYtPnBtX2RvbWFpbi0+ZGlzbWlzcyhkZXYpOworCQlwbV9ydW50aW1lX3JlaW5pdChkZXYpOworCisJCWdvdG8gcmVfcHJvYmU7CisJfQorCiAJcGluY3RybF9pbml0X2RvbmUoZGV2KTsKIAogCWlmIChkZXYtPnBtX2RvbWFpbiAmJiBkZXYtPnBtX2RvbWFpbi0+c3luYykKQEAgLTQ2MCw4ICs0NzYsNyBAQAogdm9pZCB3YWl0X2Zvcl9kZXZpY2VfcHJvYmUodm9pZCkKIHsKIAkvKiB3YWl0IGZvciB0aGUgZGVmZXJyZWQgcHJvYmUgd29ya3F1ZXVlIHRvIGZpbmlzaCAqLwotCWlmIChkcml2ZXJfZGVmZXJyZWRfcHJvYmVfZW5hYmxlKQotCQlmbHVzaF93b3JrcXVldWUoZGVmZXJyZWRfd3EpOworCWZsdXNoX3dvcmsoJmRlZmVycmVkX3Byb2JlX3dvcmspOwogCiAJLyogd2FpdCBmb3IgdGhlIGtub3duIGRldmljZXMgdG8gY29tcGxldGUgdGhlaXIgcHJvYmluZyAqLwogCXdhaXRfZXZlbnQocHJvYmVfd2FpdHF1ZXVlLCBhdG9taWNfcmVhZCgmcHJvYmVfY291bnQpID09IDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RtYS1jb2hlcmVudC5jIGIvZHJpdmVycy9iYXNlL2RtYS1jb2hlcmVudC5jCmluZGV4IGJkZjI4ZjcuLjY0MGE3ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kbWEtY29oZXJlbnQuYworKysgYi9kcml2ZXJzL2Jhc2UvZG1hLWNvaGVyZW50LmMKQEAgLTE2NSw2ICsxNjUsNyBAQAogCWludCBvcmRlciA9IGdldF9vcmRlcihzaXplKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBwYWdlbm87CisJaW50IGRtYV9tZW1vcnlfbWFwOwogCiAJaWYgKCFkZXYpCiAJCXJldHVybiAwOwpAQCAtMTg3LDExICsxODgsMTIgQEAKIAkgKi8KIAkqZG1hX2hhbmRsZSA9IG1lbS0+ZGV2aWNlX2Jhc2UgKyAocGFnZW5vIDw8IFBBR0VfU0hJRlQpOwogCSpyZXQgPSBtZW0tPnZpcnRfYmFzZSArIChwYWdlbm8gPDwgUEFHRV9TSElGVCk7Ci0JaWYgKG1lbS0+ZmxhZ3MgJiBETUFfTUVNT1JZX01BUCkKKwlkbWFfbWVtb3J5X21hcCA9IChtZW0tPmZsYWdzICYgRE1BX01FTU9SWV9NQVApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1lbS0+c3BpbmxvY2ssIGZsYWdzKTsKKwlpZiAoZG1hX21lbW9yeV9tYXApCiAJCW1lbXNldCgqcmV0LCAwLCBzaXplKTsKIAllbHNlCiAJCW1lbXNldF9pbygqcmV0LCAwLCBzaXplKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZW0tPnNwaW5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMTsKIApAQCAtMjYxLDggKzI2Myw4IEBACiAJCSAgIChtZW0tPnZpcnRfYmFzZSArIChtZW0tPnNpemUgPDwgUEFHRV9TSElGVCkpKSB7CiAJCXVuc2lnbmVkIGxvbmcgb2ZmID0gdm1hLT52bV9wZ29mZjsKIAkJaW50IHN0YXJ0ID0gKHZhZGRyIC0gbWVtLT52aXJ0X2Jhc2UpID4+IFBBR0VfU0hJRlQ7Ci0JCWludCB1c2VyX2NvdW50ID0gKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVDsKLQkJaW50IGNvdW50ID0gc2l6ZSA+PiBQQUdFX1NISUZUOworCQlpbnQgdXNlcl9jb3VudCA9IHZtYV9wYWdlcyh2bWEpOworCQlpbnQgY291bnQgPSBQQUdFX0FMSUdOKHNpemUpID4+IFBBR0VfU0hJRlQ7CiAKIAkJKnJldCA9IC1FTlhJTzsKIAkJaWYgKG9mZiA8IGNvdW50ICYmIHVzZXJfY291bnQgPD0gY291bnQgLSBvZmYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kbWEtbWFwcGluZy5jIGIvZHJpdmVycy9iYXNlL2RtYS1tYXBwaW5nLmMKaW5kZXggZDc5OTY2Mi4uOGY4YjY4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RtYS1tYXBwaW5nLmMKKysrIGIvZHJpdmVycy9iYXNlL2RtYS1tYXBwaW5nLmMKQEAgLTE5OCwxMCArMTk4LDEzIEBACiAKIAlyYyA9IGRtYV9kZWNsYXJlX2NvaGVyZW50X21lbW9yeShkZXYsIHBoeXNfYWRkciwgZGV2aWNlX2FkZHIsIHNpemUsCiAJCQkJCSBmbGFncyk7Ci0JaWYgKHJjID09IDApCisJaWYgKHJjKSB7CiAJCWRldnJlc19hZGQoZGV2LCByZXMpOwotCWVsc2UKKwkJcmMgPSAwOworCX0gZWxzZSB7CiAJCWRldnJlc19mcmVlKHJlcyk7CisJCXJjID0gLUVOT01FTTsKKwl9CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0yNDcsNyArMjUwLDcgQEAKIHsKIAlpbnQgcmV0ID0gLUVOWElPOwogI2lmIGRlZmluZWQoQ09ORklHX01NVSkgJiYgIWRlZmluZWQoQ09ORklHX0FSQ0hfTk9fQ09IRVJFTlRfRE1BX01NQVApCi0JdW5zaWduZWQgbG9uZyB1c2VyX2NvdW50ID0gKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIHVzZXJfY291bnQgPSB2bWFfcGFnZXModm1hKTsKIAl1bnNpZ25lZCBsb25nIGNvdW50ID0gUEFHRV9BTElHTihzaXplKSA+PiBQQUdFX1NISUZUOwogCXVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19wZm4odmlydF90b19wYWdlKGNwdV9hZGRyKSk7CiAJdW5zaWduZWQgbG9uZyBvZmYgPSB2bWEtPnZtX3Bnb2ZmOwpAQCAtMzM0LDcgKzMzNyw3IEBACiAJCXJldHVybjsKIAl9CiAKLQl1bm1hcF9rZXJuZWxfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpY3B1X2FkZHIsIHNpemUpOworCXVubWFwX2tlcm5lbF9yYW5nZSgodW5zaWduZWQgbG9uZyljcHVfYWRkciwgUEFHRV9BTElHTihzaXplKSk7CiAJdnVubWFwKGNwdV9hZGRyKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3BpbmN0cmwuYyBiL2RyaXZlcnMvYmFzZS9waW5jdHJsLmMKaW5kZXggMDc2Mjk3NS4uNTkxN2I0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3BpbmN0cmwuYworKysgYi9kcml2ZXJzL2Jhc2UvcGluY3RybC5jCkBAIC05MSw5ICs5MSwxMyBAQAogCWRldm1fa2ZyZWUoZGV2LCBkZXYtPnBpbnMpOwogCWRldi0+cGlucyA9IE5VTEw7CiAKLQkvKiBPbmx5IHJldHVybiBkZWZlcnJhbHMgKi8KLQlpZiAocmV0ICE9IC1FUFJPQkVfREVGRVIpCi0JCXJldCA9IDA7CisJLyogUmV0dXJuIGRlZmVycmFscyAqLworCWlmIChyZXQgPT0gLUVQUk9CRV9ERUZFUikKKwkJcmV0dXJuIHJldDsKKwkvKiBSZXR1cm4gc2VyaW91cyBlcnJvcnMgKi8KKwlpZiAocmV0ID09IC1FSU5WQUwpCisJCXJldHVybiByZXQ7CisJLyogV2UgaWdub3JlIGVycm9ycyBsaWtlIC1FTk9FTlQgbWVhbmluZyBubyBwaW5jdHJsIHN0YXRlICovCiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLW1zaS5jIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLW1zaS5jCmluZGV4IDI3OWU1MzkuLmJlNmE1OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS1tc2kuYworKysgYi9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0tbXNpLmMKQEAgLTE0MiwxMyArMTQyLDEyIEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IG52ZWM7IGkrKykgewotCQlkZXNjID0gYWxsb2NfbXNpX2VudHJ5KGRldik7CisJCWRlc2MgPSBhbGxvY19tc2lfZW50cnkoZGV2LCAxLCBOVUxMKTsKIAkJaWYgKCFkZXNjKQogCQkJYnJlYWs7CiAKIAkJZGVzYy0+cGxhdGZvcm0ubXNpX3ByaXZfZGF0YSA9IGRhdGE7CiAJCWRlc2MtPnBsYXRmb3JtLm1zaV9pbmRleCA9IGJhc2UgKyBpOwotCQlkZXNjLT5udmVjX3VzZWQgPSAxOwogCQlkZXNjLT5pcnEgPSB2aXJxID8gdmlycSArIGkgOiAwOwogCiAJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPmxpc3QsIGRldl90b19tc2lfbGlzdChkZXYpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKaW5kZXggNjQ4MmQ0Ny4uYzRhZjAwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAkJaW50IHJldDsKIAogCQlyZXQgPSBvZl9pcnFfZ2V0KGRldi0+ZGV2Lm9mX25vZGUsIG51bSk7Ci0JCWlmIChyZXQgPj0gMCB8fCByZXQgPT0gLUVQUk9CRV9ERUZFUikKKwkJaWYgKHJldCA+IDAgfHwgcmV0ID09IC1FUFJPQkVfREVGRVIpCiAJCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTA4LDkgKzEwOCwxNCBAQAogCSAqIElPUkVTT1VSQ0VfQklUUyBjb3JyZXNwb25kIDEtdG8tMSB0byB0aGUgSVJRRl9UUklHR0VSKgogCSAqIHNldHRpbmdzLgogCSAqLwotCWlmIChyICYmIHItPmZsYWdzICYgSU9SRVNPVVJDRV9CSVRTKQotCQlpcnFkX3NldF90cmlnZ2VyX3R5cGUoaXJxX2dldF9pcnFfZGF0YShyLT5zdGFydCksCi0JCQkJICAgICAgci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFMpOworCWlmIChyICYmIHItPmZsYWdzICYgSU9SRVNPVVJDRV9CSVRTKSB7CisJCXN0cnVjdCBpcnFfZGF0YSAqaXJxZDsKKworCQlpcnFkID0gaXJxX2dldF9pcnFfZGF0YShyLT5zdGFydCk7CisJCWlmICghaXJxZCkKKwkJCXJldHVybiAtRU5YSU87CisJCWlycWRfc2V0X3RyaWdnZXJfdHlwZShpcnFkLCByLT5mbGFncyAmIElPUkVTT1VSQ0VfQklUUyk7CisJfQogCiAJcmV0dXJuIHIgPyByLT5zdGFydCA6IC1FTlhJTzsKICNlbmRpZgpAQCAtMTc1LDcgKzE4MCw3IEBACiAJCWludCByZXQ7CiAKIAkJcmV0ID0gb2ZfaXJxX2dldF9ieW5hbWUoZGV2LT5kZXYub2Zfbm9kZSwgbmFtZSk7Ci0JCWlmIChyZXQgPj0gMCB8fCByZXQgPT0gLUVQUk9CRV9ERUZFUikKKwkJaWYgKHJldCA+IDAgfHwgcmV0ID09IC1FUFJPQkVfREVGRVIpCiAJCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNDM0LDYgKzQzOSw3IEBACiAJaW50IGk7CiAKIAlpZiAocGRldikgeworCQlkZXZpY2VfcmVtb3ZlX3Byb3BlcnRpZXMoJnBkZXYtPmRldik7CiAJCWRldmljZV9kZWwoJnBkZXYtPmRldik7CiAKIAkJaWYgKHBkZXYtPmlkX2F1dG8pIHsKQEAgLTQ0Niw4ICs0NTIsNiBAQAogCQkJaWYgKHItPnBhcmVudCkKIAkJCQlyZWxlYXNlX3Jlc291cmNlKHIpOwogCQl9Ci0KLQkJZGV2aWNlX3JlbW92ZV9wcm9wZXJ0aWVzKCZwZGV2LT5kZXYpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBsYXRmb3JtX2RldmljZV9kZWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL2RvbWFpbi5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2RvbWFpbi5jCmluZGV4IGExZjJhZmYuLmUwMjMwNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW4uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvZG9tYWluLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKICAqIGFuZCBjaGVja3MgdGhhdCB0aGUgUE0gZG9tYWluIHBvaW50ZXIgaXMgYSByZWFsIGdlbmVyaWMgUE0gZG9tYWluLgogICogQW55IGZhaWx1cmUgcmVzdWx0cyBpbiBOVUxMIGJlaW5nIHJldHVybmVkLgogICovCi1zdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKnBtX2dlbnBkX2xvb2t1cF9kZXYoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGRfbG9va3VwX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCA9IE5VTEwsICpncGQ7CiAKQEAgLTU4Niw3ICs1ODYsNyBAQAogfQogbGF0ZV9pbml0Y2FsbChnZW5wZF9wb3dlcm9mZl91bnVzZWQpOwogCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCisjaWYgZGVmaW5lZChDT05GSUdfUE1fU0xFRVApIHx8IGRlZmluZWQoQ09ORklHX1BNX0dFTkVSSUNfRE9NQUlOU19PRikKIAogLyoqCiAgKiBwbV9nZW5wZF9wcmVzZW50IC0gQ2hlY2sgaWYgdGhlIGdpdmVuIFBNIGRvbWFpbiBoYXMgYmVlbiBpbml0aWFsaXplZC4KQEAgLTYwNiw2ICs2MDYsMTAgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCisKIHN0YXRpYyBib29sIGdlbnBkX2Rldl9hY3RpdmVfd2FrZXVwKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQsCiAJCQkJICAgIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTYxMyw5ICs2MTcsOCBAQAogfQogCiAvKioKLSAqIHBtX2dlbnBkX3N5bmNfcG93ZXJvZmYgLSBTeW5jaHJvbm91c2x5IHBvd2VyIG9mZiBhIFBNIGRvbWFpbiBhbmQgaXRzIG1hc3RlcnMuCisgKiBnZW5wZF9zeW5jX3Bvd2Vyb2ZmIC0gU3luY2hyb25vdXNseSBwb3dlciBvZmYgYSBQTSBkb21haW4gYW5kIGl0cyBtYXN0ZXJzLgogICogQGdlbnBkOiBQTSBkb21haW4gdG8gcG93ZXIgb2ZmLCBpZiBwb3NzaWJsZS4KLSAqIEB0aW1lZDogVHJ1ZSBpZiBsYXRlbmN5IG1lYXN1cmVtZW50cyBhcmUgYWxsb3dlZC4KICAqCiAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gUE0gZG9tYWluIGNhbiBiZSBwb3dlcmVkIG9mZiAoZHVyaW5nIHN5c3RlbSBzdXNwZW5kIG9yCiAgKiBoaWJlcm5hdGlvbikgYW5kIGRvIHRoYXQgaWYgc28uICBBbHNvLCBpbiB0aGF0IGNhc2UgcHJvcGFnYXRlIHRvIGl0cyBtYXN0ZXJzLgpAQCAtNjI1LDggKzYyOCw3IEBACiAgKiBleGVjdXRlZCBzZXF1ZW50aWFsbHksIHNvIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBpdCB3aWxsIG5ldmVyIHJ1biB0d2ljZSBpbgogICogcGFyYWxsZWwpLgogICovCi1zdGF0aWMgdm9pZCBwbV9nZW5wZF9zeW5jX3Bvd2Vyb2ZmKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQsCi0JCQkJICAgYm9vbCB0aW1lZCkKK3N0YXRpYyB2b2lkIGdlbnBkX3N5bmNfcG93ZXJvZmYoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKIHsKIAlzdHJ1Y3QgZ3BkX2xpbmsgKmxpbms7CiAKQEAgLTYzOSwyOCArNjQxLDI2IEBACiAKIAkvKiBDaG9vc2UgdGhlIGRlZXBlc3Qgc3RhdGUgd2hlbiBzdXNwZW5kaW5nICovCiAJZ2VucGQtPnN0YXRlX2lkeCA9IGdlbnBkLT5zdGF0ZV9jb3VudCAtIDE7Ci0JZ2VucGRfcG93ZXJfb2ZmKGdlbnBkLCB0aW1lZCk7CisJZ2VucGRfcG93ZXJfb2ZmKGdlbnBkLCBmYWxzZSk7CiAKIAlnZW5wZC0+c3RhdHVzID0gR1BEX1NUQVRFX1BPV0VSX09GRjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobGluaywgJmdlbnBkLT5zbGF2ZV9saW5rcywgc2xhdmVfbm9kZSkgewogCQlnZW5wZF9zZF9jb3VudGVyX2RlYyhsaW5rLT5tYXN0ZXIpOwotCQlwbV9nZW5wZF9zeW5jX3Bvd2Vyb2ZmKGxpbmstPm1hc3RlciwgdGltZWQpOworCQlnZW5wZF9zeW5jX3Bvd2Vyb2ZmKGxpbmstPm1hc3Rlcik7CiAJfQogfQogCiAvKioKLSAqIHBtX2dlbnBkX3N5bmNfcG93ZXJvbiAtIFN5bmNocm9ub3VzbHkgcG93ZXIgb24gYSBQTSBkb21haW4gYW5kIGl0cyBtYXN0ZXJzLgorICogZ2VucGRfc3luY19wb3dlcm9uIC0gU3luY2hyb25vdXNseSBwb3dlciBvbiBhIFBNIGRvbWFpbiBhbmQgaXRzIG1hc3RlcnMuCiAgKiBAZ2VucGQ6IFBNIGRvbWFpbiB0byBwb3dlciBvbi4KLSAqIEB0aW1lZDogVHJ1ZSBpZiBsYXRlbmN5IG1lYXN1cmVtZW50cyBhcmUgYWxsb3dlZC4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGluICJub2lycSIgYW5kICJzeXNjb3JlIiBzdGFnZXMgb2Ygc3lzdGVtIHBvd2VyCiAgKiB0cmFuc2l0aW9ucywgc28gaXQgbmVlZCBub3QgYWNxdWlyZSBsb2NrcyAoYWxsIG9mIHRoZSAibm9pcnEiIGNhbGxiYWNrcyBhcmUKICAqIGV4ZWN1dGVkIHNlcXVlbnRpYWxseSwgc28gaXQgaXMgZ3VhcmFudGVlZCB0aGF0IGl0IHdpbGwgbmV2ZXIgcnVuIHR3aWNlIGluCiAgKiBwYXJhbGxlbCkuCiAgKi8KLXN0YXRpYyB2b2lkIHBtX2dlbnBkX3N5bmNfcG93ZXJvbihzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAotCQkJCSAgYm9vbCB0aW1lZCkKK3N0YXRpYyB2b2lkIGdlbnBkX3N5bmNfcG93ZXJvbihzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkKQogewogCXN0cnVjdCBncGRfbGluayAqbGluazsKIApAQCAtNjY4LDExICs2NjgsMTEgQEAKIAkJcmV0dXJuOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5rLCAmZ2VucGQtPnNsYXZlX2xpbmtzLCBzbGF2ZV9ub2RlKSB7Ci0JCXBtX2dlbnBkX3N5bmNfcG93ZXJvbihsaW5rLT5tYXN0ZXIsIHRpbWVkKTsKKwkJZ2VucGRfc3luY19wb3dlcm9uKGxpbmstPm1hc3Rlcik7CiAJCWdlbnBkX3NkX2NvdW50ZXJfaW5jKGxpbmstPm1hc3Rlcik7CiAJfQogCi0JZ2VucGRfcG93ZXJfb24oZ2VucGQsIHRpbWVkKTsKKwlnZW5wZF9wb3dlcl9vbihnZW5wZCwgZmFsc2UpOwogCiAJZ2VucGQtPnN0YXR1cyA9IEdQRF9TVEFURV9BQ1RJVkU7CiB9CkBAIC03ODQsNyArNzg0LDcgQEAKIAkgKiB0aGUgc2FtZSBQTSBkb21haW4sIHNvIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gdXNlIGxvY2tpbmcgaGVyZS4KIAkgKi8KIAlnZW5wZC0+c3VzcGVuZGVkX2NvdW50Kys7Ci0JcG1fZ2VucGRfc3luY19wb3dlcm9mZihnZW5wZCwgdHJ1ZSk7CisJZ2VucGRfc3luY19wb3dlcm9mZihnZW5wZCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTgxNCw3ICs4MTQsNyBAQAogCSAqIGd1YXJhbnRlZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcnVuIHR3aWNlIGluIHBhcmFsbGVsIGZvcgogCSAqIHRoZSBzYW1lIFBNIGRvbWFpbiwgc28gaXQgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgbG9ja2luZyBoZXJlLgogCSAqLwotCXBtX2dlbnBkX3N5bmNfcG93ZXJvbihnZW5wZCwgdHJ1ZSk7CisJZ2VucGRfc3luY19wb3dlcm9uKGdlbnBkKTsKIAlnZW5wZC0+c3VzcGVuZGVkX2NvdW50LS07CiAKIAlpZiAoZ2VucGQtPmRldl9vcHMuc3RvcCAmJiBnZW5wZC0+ZGV2X29wcy5zdGFydCkKQEAgLTkwMiwxMiArOTAyLDEyIEBACiAJaWYgKGdlbnBkLT5zdXNwZW5kZWRfY291bnQrKyA9PSAwKQogCQkvKgogCQkgKiBUaGUgYm9vdCBrZXJuZWwgbWlnaHQgcHV0IHRoZSBkb21haW4gaW50byBhcmJpdHJhcnkgc3RhdGUsCi0JCSAqIHNvIG1ha2UgaXQgYXBwZWFyIGFzIHBvd2VyZWQgb2ZmIHRvIHBtX2dlbnBkX3N5bmNfcG93ZXJvbigpLAorCQkgKiBzbyBtYWtlIGl0IGFwcGVhciBhcyBwb3dlcmVkIG9mZiB0byBnZW5wZF9zeW5jX3Bvd2Vyb24oKSwKIAkJICogc28gdGhhdCBpdCB0cmllcyB0byBwb3dlciBpdCBvbiBpbiBjYXNlIGl0IHdhcyByZWFsbHkgb2ZmLgogCQkgKi8KIAkJZ2VucGQtPnN0YXR1cyA9IEdQRF9TVEFURV9QT1dFUl9PRkY7CiAKLQlwbV9nZW5wZF9zeW5jX3Bvd2Vyb24oZ2VucGQsIHRydWUpOworCWdlbnBkX3N5bmNfcG93ZXJvbihnZW5wZCk7CiAKIAlpZiAoZ2VucGQtPmRldl9vcHMuc3RvcCAmJiBnZW5wZC0+ZGV2X29wcy5zdGFydCkKIAkJcmV0ID0gcG1fcnVudGltZV9mb3JjZV9yZXN1bWUoZGV2KTsKQEAgLTk2Miw5ICs5NjIsOSBAQAogCiAJaWYgKHN1c3BlbmQpIHsKIAkJZ2VucGQtPnN1c3BlbmRlZF9jb3VudCsrOwotCQlwbV9nZW5wZF9zeW5jX3Bvd2Vyb2ZmKGdlbnBkLCBmYWxzZSk7CisJCWdlbnBkX3N5bmNfcG93ZXJvZmYoZ2VucGQpOwogCX0gZWxzZSB7Ci0JCXBtX2dlbnBkX3N5bmNfcG93ZXJvbihnZW5wZCwgZmFsc2UpOworCQlnZW5wZF9zeW5jX3Bvd2Vyb24oZ2VucGQpOwogCQlnZW5wZC0+c3VzcGVuZGVkX2NvdW50LS07CiAJfQogfQpAQCAtMTA1NiwxNCArMTA1Niw4IEBACiAJZGV2X3BtX3B1dF9zdWJzeXNfZGF0YShkZXYpOwogfQogCi0vKioKLSAqIF9fcG1fZ2VucGRfYWRkX2RldmljZSAtIEFkZCBhIGRldmljZSB0byBhbiBJL08gUE0gZG9tYWluLgotICogQGdlbnBkOiBQTSBkb21haW4gdG8gYWRkIHRoZSBkZXZpY2UgdG8uCi0gKiBAZGV2OiBEZXZpY2UgdG8gYmUgYWRkZWQuCi0gKiBAdGQ6IFNldCBvZiBQTSBRb1MgdGltaW5nIHBhcmFtZXRlcnMgdG8gYXR0YWNoIHRvIHRoZSBkZXZpY2UuCi0gKi8KLWludCBfX3BtX2dlbnBkX2FkZF9kZXZpY2Uoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwgc3RydWN0IGRldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgZ3BkX3RpbWluZ19kYXRhICp0ZCkKK3N0YXRpYyBpbnQgZ2VucGRfYWRkX2RldmljZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGdwZF90aW1pbmdfZGF0YSAqdGQpCiB7CiAJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluX2RhdGEgKmdwZF9kYXRhOwogCWludCByZXQgPSAwOwpAQCAtMTEwMywxNSArMTA5NywyOCBAQAogCiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKF9fcG1fZ2VucGRfYWRkX2RldmljZSk7CiAKIC8qKgotICogcG1fZ2VucGRfcmVtb3ZlX2RldmljZSAtIFJlbW92ZSBhIGRldmljZSBmcm9tIGFuIEkvTyBQTSBkb21haW4uCi0gKiBAZ2VucGQ6IFBNIGRvbWFpbiB0byByZW1vdmUgdGhlIGRldmljZSBmcm9tLgotICogQGRldjogRGV2aWNlIHRvIGJlIHJlbW92ZWQuCisgKiBfX3BtX2dlbnBkX2FkZF9kZXZpY2UgLSBBZGQgYSBkZXZpY2UgdG8gYW4gSS9PIFBNIGRvbWFpbi4KKyAqIEBnZW5wZDogUE0gZG9tYWluIHRvIGFkZCB0aGUgZGV2aWNlIHRvLgorICogQGRldjogRGV2aWNlIHRvIGJlIGFkZGVkLgorICogQHRkOiBTZXQgb2YgUE0gUW9TIHRpbWluZyBwYXJhbWV0ZXJzIHRvIGF0dGFjaCB0byB0aGUgZGV2aWNlLgogICovCi1pbnQgcG1fZ2VucGRfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAotCQkJICAgc3RydWN0IGRldmljZSAqZGV2KQoraW50IF9fcG1fZ2VucGRfYWRkX2RldmljZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBncGRfdGltaW5nX2RhdGEgKnRkKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZncGRfbGlzdF9sb2NrKTsKKwlyZXQgPSBnZW5wZF9hZGRfZGV2aWNlKGdlbnBkLCBkZXYsIHRkKTsKKwltdXRleF91bmxvY2soJmdwZF9saXN0X2xvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fcG1fZ2VucGRfYWRkX2RldmljZSk7CisKK3N0YXRpYyBpbnQgZ2VucGRfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW5fZGF0YSAqZ3BkX2RhdGE7CiAJc3RydWN0IHBtX2RvbWFpbl9kYXRhICpwZGQ7CkBAIC0xMTE5LDEwICsxMTI2LDYgQEAKIAogCWRldl9kYmcoZGV2LCAiJXMoKVxuIiwgX19mdW5jX18pOwogCi0JaWYgKCFnZW5wZCB8fCBnZW5wZCAhPSBwbV9nZW5wZF9sb29rdXBfZGV2KGRldikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogVGhlIGFib3ZlIHZhbGlkYXRpb24gYWxzbyBtZWFucyB3ZSBoYXZlIGV4aXN0aW5nIGRvbWFpbl9kYXRhLiAqLwogCXBkZCA9IGRldi0+cG93ZXIuc3Vic3lzX2RhdGEtPmRvbWFpbl9kYXRhOwogCWdwZF9kYXRhID0gdG9fZ3BkX2RhdGEocGRkKTsKIAlkZXZfcG1fcW9zX3JlbW92ZV9ub3RpZmllcihkZXYsICZncGRfZGF0YS0+bmIpOwpAQCAtMTE1NCwxNSArMTE1NywyNCBAQAogCiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHBtX2dlbnBkX3JlbW92ZV9kZXZpY2UpOwogCiAvKioKLSAqIHBtX2dlbnBkX2FkZF9zdWJkb21haW4gLSBBZGQgYSBzdWJkb21haW4gdG8gYW4gSS9PIFBNIGRvbWFpbi4KLSAqIEBnZW5wZDogTWFzdGVyIFBNIGRvbWFpbiB0byBhZGQgdGhlIHN1YmRvbWFpbiB0by4KLSAqIEBzdWJkb21haW46IFN1YmRvbWFpbiB0byBiZSBhZGRlZC4KKyAqIHBtX2dlbnBkX3JlbW92ZV9kZXZpY2UgLSBSZW1vdmUgYSBkZXZpY2UgZnJvbSBhbiBJL08gUE0gZG9tYWluLgorICogQGdlbnBkOiBQTSBkb21haW4gdG8gcmVtb3ZlIHRoZSBkZXZpY2UgZnJvbS4KKyAqIEBkZXY6IERldmljZSB0byBiZSByZW1vdmVkLgogICovCi1pbnQgcG1fZ2VucGRfYWRkX3N1YmRvbWFpbihzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAotCQkJICAgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpzdWJkb21haW4pCitpbnQgcG1fZ2VucGRfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAorCQkJICAgc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmICghZ2VucGQgfHwgZ2VucGQgIT0gZ2VucGRfbG9va3VwX2RldihkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBnZW5wZF9yZW1vdmVfZGV2aWNlKGdlbnBkLCBkZXYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocG1fZ2VucGRfcmVtb3ZlX2RldmljZSk7CisKK3N0YXRpYyBpbnQgZ2VucGRfYWRkX3N1YmRvbWFpbihzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAorCQkJICAgICAgIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqc3ViZG9tYWluKQogewogCXN0cnVjdCBncGRfbGluayAqbGluaywgKml0cjsKIAlpbnQgcmV0ID0gMDsKQEAgLTEyMDUsNiArMTIxNywyMyBAQAogCQlrZnJlZShsaW5rKTsKIAlyZXR1cm4gcmV0OwogfQorCisvKioKKyAqIHBtX2dlbnBkX2FkZF9zdWJkb21haW4gLSBBZGQgYSBzdWJkb21haW4gdG8gYW4gSS9PIFBNIGRvbWFpbi4KKyAqIEBnZW5wZDogTWFzdGVyIFBNIGRvbWFpbiB0byBhZGQgdGhlIHN1YmRvbWFpbiB0by4KKyAqIEBzdWJkb21haW46IFN1YmRvbWFpbiB0byBiZSBhZGRlZC4KKyAqLworaW50IHBtX2dlbnBkX2FkZF9zdWJkb21haW4oc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwKKwkJCSAgIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqc3ViZG9tYWluKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZncGRfbGlzdF9sb2NrKTsKKwlyZXQgPSBnZW5wZF9hZGRfc3ViZG9tYWluKGdlbnBkLCBzdWJkb21haW4pOworCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQogRVhQT1JUX1NZTUJPTF9HUEwocG1fZ2VucGRfYWRkX3N1YmRvbWFpbik7CiAKIC8qKgpAQCAtMTI3OCwyNyArMTMwNywxNyBAQAogCWdlbnBkLT5kZXZpY2VfY291bnQgPSAwOwogCWdlbnBkLT5tYXhfb2ZmX3RpbWVfbnMgPSAtMTsKIAlnZW5wZC0+bWF4X29mZl90aW1lX2NoYW5nZWQgPSB0cnVlOworCWdlbnBkLT5wcm92aWRlciA9IE5VTEw7CisJZ2VucGQtPmhhc19wcm92aWRlciA9IGZhbHNlOwogCWdlbnBkLT5kb21haW4ub3BzLnJ1bnRpbWVfc3VzcGVuZCA9IGdlbnBkX3J1bnRpbWVfc3VzcGVuZDsKIAlnZW5wZC0+ZG9tYWluLm9wcy5ydW50aW1lX3Jlc3VtZSA9IGdlbnBkX3J1bnRpbWVfcmVzdW1lOwogCWdlbnBkLT5kb21haW4ub3BzLnByZXBhcmUgPSBwbV9nZW5wZF9wcmVwYXJlOwotCWdlbnBkLT5kb21haW4ub3BzLnN1c3BlbmQgPSBwbV9nZW5lcmljX3N1c3BlbmQ7Ci0JZ2VucGQtPmRvbWFpbi5vcHMuc3VzcGVuZF9sYXRlID0gcG1fZ2VuZXJpY19zdXNwZW5kX2xhdGU7CiAJZ2VucGQtPmRvbWFpbi5vcHMuc3VzcGVuZF9ub2lycSA9IHBtX2dlbnBkX3N1c3BlbmRfbm9pcnE7CiAJZ2VucGQtPmRvbWFpbi5vcHMucmVzdW1lX25vaXJxID0gcG1fZ2VucGRfcmVzdW1lX25vaXJxOwotCWdlbnBkLT5kb21haW4ub3BzLnJlc3VtZV9lYXJseSA9IHBtX2dlbmVyaWNfcmVzdW1lX2Vhcmx5OwotCWdlbnBkLT5kb21haW4ub3BzLnJlc3VtZSA9IHBtX2dlbmVyaWNfcmVzdW1lOwotCWdlbnBkLT5kb21haW4ub3BzLmZyZWV6ZSA9IHBtX2dlbmVyaWNfZnJlZXplOwotCWdlbnBkLT5kb21haW4ub3BzLmZyZWV6ZV9sYXRlID0gcG1fZ2VuZXJpY19mcmVlemVfbGF0ZTsKIAlnZW5wZC0+ZG9tYWluLm9wcy5mcmVlemVfbm9pcnEgPSBwbV9nZW5wZF9mcmVlemVfbm9pcnE7CiAJZ2VucGQtPmRvbWFpbi5vcHMudGhhd19ub2lycSA9IHBtX2dlbnBkX3RoYXdfbm9pcnE7Ci0JZ2VucGQtPmRvbWFpbi5vcHMudGhhd19lYXJseSA9IHBtX2dlbmVyaWNfdGhhd19lYXJseTsKLQlnZW5wZC0+ZG9tYWluLm9wcy50aGF3ID0gcG1fZ2VuZXJpY190aGF3OwotCWdlbnBkLT5kb21haW4ub3BzLnBvd2Vyb2ZmID0gcG1fZ2VuZXJpY19wb3dlcm9mZjsKLQlnZW5wZC0+ZG9tYWluLm9wcy5wb3dlcm9mZl9sYXRlID0gcG1fZ2VuZXJpY19wb3dlcm9mZl9sYXRlOwogCWdlbnBkLT5kb21haW4ub3BzLnBvd2Vyb2ZmX25vaXJxID0gcG1fZ2VucGRfc3VzcGVuZF9ub2lycTsKIAlnZW5wZC0+ZG9tYWluLm9wcy5yZXN0b3JlX25vaXJxID0gcG1fZ2VucGRfcmVzdG9yZV9ub2lycTsKLQlnZW5wZC0+ZG9tYWluLm9wcy5yZXN0b3JlX2Vhcmx5ID0gcG1fZ2VuZXJpY19yZXN0b3JlX2Vhcmx5OwotCWdlbnBkLT5kb21haW4ub3BzLnJlc3RvcmUgPSBwbV9nZW5lcmljX3Jlc3RvcmU7CiAJZ2VucGQtPmRvbWFpbi5vcHMuY29tcGxldGUgPSBwbV9nZW5wZF9jb21wbGV0ZTsKIAogCWlmIChnZW5wZC0+ZmxhZ3MgJiBHRU5QRF9GTEFHX1BNX0NMSykgewpAQCAtMTMyOCw3ICsxMzQ3LDcxIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbV9nZW5wZF9pbml0KTsKIAorc3RhdGljIGludCBnZW5wZF9yZW1vdmUoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKK3sKKwlzdHJ1Y3QgZ3BkX2xpbmsgKmwsICpsaW5rOworCisJaWYgKElTX0VSUl9PUl9OVUxMKGdlbnBkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZnZW5wZC0+bG9jayk7CisKKwlpZiAoZ2VucGQtPmhhc19wcm92aWRlcikgeworCQltdXRleF91bmxvY2soJmdlbnBkLT5sb2NrKTsKKwkJcHJfZXJyKCJQcm92aWRlciBwcmVzZW50LCB1bmFibGUgdG8gcmVtb3ZlICVzXG4iLCBnZW5wZC0+bmFtZSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKCFsaXN0X2VtcHR5KCZnZW5wZC0+bWFzdGVyX2xpbmtzKSB8fCBnZW5wZC0+ZGV2aWNlX2NvdW50KSB7CisJCW11dGV4X3VubG9jaygmZ2VucGQtPmxvY2spOworCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gcmVtb3ZlICVzXG4iLCBfX2Z1bmNfXywgZ2VucGQtPm5hbWUpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsaW5rLCBsLCAmZ2VucGQtPnNsYXZlX2xpbmtzLCBzbGF2ZV9ub2RlKSB7CisJCWxpc3RfZGVsKCZsaW5rLT5tYXN0ZXJfbm9kZSk7CisJCWxpc3RfZGVsKCZsaW5rLT5zbGF2ZV9ub2RlKTsKKwkJa2ZyZWUobGluayk7CisJfQorCisJbGlzdF9kZWwoJmdlbnBkLT5ncGRfbGlzdF9ub2RlKTsKKwltdXRleF91bmxvY2soJmdlbnBkLT5sb2NrKTsKKwljYW5jZWxfd29ya19zeW5jKCZnZW5wZC0+cG93ZXJfb2ZmX3dvcmspOworCXByX2RlYnVnKCIlczogcmVtb3ZlZCAlc1xuIiwgX19mdW5jX18sIGdlbnBkLT5uYW1lKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHBtX2dlbnBkX3JlbW92ZSAtIFJlbW92ZSBhIGdlbmVyaWMgSS9PIFBNIGRvbWFpbgorICogQGdlbnBkOiBQb2ludGVyIHRvIFBNIGRvbWFpbiB0aGF0IGlzIHRvIGJlIHJlbW92ZWQuCisgKgorICogVG8gcmVtb3ZlIHRoZSBQTSBkb21haW4sIHRoaXMgZnVuY3Rpb246CisgKiAgLSBSZW1vdmVzIHRoZSBQTSBkb21haW4gYXMgYSBzdWJkb21haW4gdG8gYW55IHBhcmVudCBkb21haW5zLAorICogICAgaWYgaXQgd2FzIGFkZGVkLgorICogIC0gUmVtb3ZlcyB0aGUgUE0gZG9tYWluIGZyb20gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBQTSBkb21haW5zLgorICoKKyAqIFRoZSBQTSBkb21haW4gd2lsbCBvbmx5IGJlIHJlbW92ZWQsIGlmIHRoZSBhc3NvY2lhdGVkIHByb3ZpZGVyIGhhcworICogYmVlbiByZW1vdmVkLCBpdCBpcyBub3QgYSBwYXJlbnQgdG8gYW55IG90aGVyIFBNIGRvbWFpbiBhbmQgaGFzIG5vCisgKiBkZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAqLworaW50IHBtX2dlbnBkX3JlbW92ZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZncGRfbGlzdF9sb2NrKTsKKwlyZXQgPSBnZW5wZF9yZW1vdmUoZ2VucGQpOworCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocG1fZ2VucGRfcmVtb3ZlKTsKKwogI2lmZGVmIENPTkZJR19QTV9HRU5FUklDX0RPTUFJTlNfT0YKKwordHlwZWRlZiBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKigqZ2VucGRfeGxhdGVfdCkoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqYXJncywKKwkJCQkJCSAgIHZvaWQgKmRhdGEpOworCiAvKgogICogRGV2aWNlIFRyZWUgYmFzZWQgUE0gZG9tYWluIHByb3ZpZGVycy4KICAqCkBAIC0xMzQwLDggKzE0MjMsOCBAQAogICogbWFwcyBhIFBNIGRvbWFpbiBzcGVjaWZpZXIgcmV0cmlldmVkIGZyb20gdGhlIGRldmljZSB0cmVlIHRvIGEgUE0gZG9tYWluLgogICoKICAqIFR3byBzaW1wbGUgbWFwcGluZyBmdW5jdGlvbnMgaGF2ZSBiZWVuIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZToKLSAqICAtIF9fb2ZfZ2VucGRfeGxhdGVfc2ltcGxlKCkgZm9yIDE6MSBkZXZpY2UgdHJlZSBub2RlIHRvIFBNIGRvbWFpbiBtYXBwaW5nLgotICogIC0gX19vZl9nZW5wZF94bGF0ZV9vbmVjZWxsKCkgZm9yIG1hcHBpbmcgb2YgbXVsdGlwbGUgUE0gZG9tYWlucyBwZXIgbm9kZSBieQorICogIC0gZ2VucGRfeGxhdGVfc2ltcGxlKCkgZm9yIDE6MSBkZXZpY2UgdHJlZSBub2RlIHRvIFBNIGRvbWFpbiBtYXBwaW5nLgorICogIC0gZ2VucGRfeGxhdGVfb25lY2VsbCgpIGZvciBtYXBwaW5nIG9mIG11bHRpcGxlIFBNIGRvbWFpbnMgcGVyIG5vZGUgYnkKICAqICAgIGluZGV4LgogICovCiAKQEAgLTEzNjYsNyArMTQ0OSw3IEBACiBzdGF0aWMgREVGSU5FX01VVEVYKG9mX2dlbnBkX211dGV4KTsKIAogLyoqCi0gKiBfX29mX2dlbnBkX3hsYXRlX3NpbXBsZSgpIC0gWGxhdGUgZnVuY3Rpb24gZm9yIGRpcmVjdCBub2RlLWRvbWFpbiBtYXBwaW5nCisgKiBnZW5wZF94bGF0ZV9zaW1wbGUoKSAtIFhsYXRlIGZ1bmN0aW9uIGZvciBkaXJlY3Qgbm9kZS1kb21haW4gbWFwcGluZwogICogQGdlbnBkc3BlYzogT0YgcGhhbmRsZSBhcmdzIHRvIG1hcCBpbnRvIGEgUE0gZG9tYWluCiAgKiBAZGF0YTogeGxhdGUgZnVuY3Rpb24gcHJpdmF0ZSBkYXRhIC0gcG9pbnRlciB0byBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4KICAqCkBAIC0xMzc0LDcgKzE0NTcsNyBAQAogICogaGF2ZSB0aGVpciBvd24gZGV2aWNlIHRyZWUgbm9kZXMuIFRoZSBwcml2YXRlIGRhdGEgb2YgeGxhdGUgZnVuY3Rpb24gbmVlZHMKICAqIHRvIGJlIGEgdmFsaWQgcG9pbnRlciB0byBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4uCiAgKi8KLXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqX19vZl9nZW5wZF94bGF0ZV9zaW1wbGUoCitzdGF0aWMgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZF94bGF0ZV9zaW1wbGUoCiAJCQkJCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmdlbnBkc3BlYywKIAkJCQkJdm9pZCAqZGF0YSkKIHsKQEAgLTEzODIsMTAgKzE0NjUsOSBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAlyZXR1cm4gZGF0YTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKF9fb2ZfZ2VucGRfeGxhdGVfc2ltcGxlKTsKIAogLyoqCi0gKiBfX29mX2dlbnBkX3hsYXRlX29uZWNlbGwoKSAtIFhsYXRlIGZ1bmN0aW9uIHVzaW5nIGEgc2luZ2xlIGluZGV4LgorICogZ2VucGRfeGxhdGVfb25lY2VsbCgpIC0gWGxhdGUgZnVuY3Rpb24gdXNpbmcgYSBzaW5nbGUgaW5kZXguCiAgKiBAZ2VucGRzcGVjOiBPRiBwaGFuZGxlIGFyZ3MgdG8gbWFwIGludG8gYSBQTSBkb21haW4KICAqIEBkYXRhOiB4bGF0ZSBmdW5jdGlvbiBwcml2YXRlIGRhdGEgLSBwb2ludGVyIHRvIHN0cnVjdCBnZW5wZF9vbmVjZWxsX2RhdGEKICAqCkBAIC0xMzk0LDcgKzE0NzYsNyBAQAogICogQSBzaW5nbGUgY2VsbCBpcyB1c2VkIGFzIGFuIGluZGV4IGludG8gYW4gYXJyYXkgb2YgUE0gZG9tYWlucyBzcGVjaWZpZWQgaW4KICAqIHRoZSBnZW5wZF9vbmVjZWxsX2RhdGEgc3RydWN0IHdoZW4gcmVnaXN0ZXJpbmcgdGhlIHByb3ZpZGVyLgogICovCi1zdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKl9fb2ZfZ2VucGRfeGxhdGVfb25lY2VsbCgKK3N0YXRpYyBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkX3hsYXRlX29uZWNlbGwoCiAJCQkJCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmdlbnBkc3BlYywKIAkJCQkJdm9pZCAqZGF0YSkKIHsKQEAgLTE0MTQsMTYgKzE0OTYsMTUgQEAKIAogCXJldHVybiBnZW5wZF9kYXRhLT5kb21haW5zW2lkeF07CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChfX29mX2dlbnBkX3hsYXRlX29uZWNlbGwpOwogCiAvKioKLSAqIF9fb2ZfZ2VucGRfYWRkX3Byb3ZpZGVyKCkgLSBSZWdpc3RlciBhIFBNIGRvbWFpbiBwcm92aWRlciBmb3IgYSBub2RlCisgKiBnZW5wZF9hZGRfcHJvdmlkZXIoKSAtIFJlZ2lzdGVyIGEgUE0gZG9tYWluIHByb3ZpZGVyIGZvciBhIG5vZGUKICAqIEBucDogRGV2aWNlIG5vZGUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIFBNIGRvbWFpbiBwcm92aWRlci4KICAqIEB4bGF0ZTogQ2FsbGJhY2sgZm9yIGRlY29kaW5nIFBNIGRvbWFpbiBmcm9tIHBoYW5kbGUgYXJndW1lbnRzLgogICogQGRhdGE6IENvbnRleHQgcG9pbnRlciBmb3IgQHhsYXRlIGNhbGxiYWNrLgogICovCi1pbnQgX19vZl9nZW5wZF9hZGRfcHJvdmlkZXIoc3RydWN0IGRldmljZV9ub2RlICpucCwgZ2VucGRfeGxhdGVfdCB4bGF0ZSwKLQkJCXZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGdlbnBkX2FkZF9wcm92aWRlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBnZW5wZF94bGF0ZV90IHhsYXRlLAorCQkJICAgICAgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgb2ZfZ2VucGRfcHJvdmlkZXIgKmNwOwogCkBAIC0xNDQyLDcgKzE1MjMsODMgQEAKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoX19vZl9nZW5wZF9hZGRfcHJvdmlkZXIpOworCisvKioKKyAqIG9mX2dlbnBkX2FkZF9wcm92aWRlcl9zaW1wbGUoKSAtIFJlZ2lzdGVyIGEgc2ltcGxlIFBNIGRvbWFpbiBwcm92aWRlcgorICogQG5wOiBEZXZpY2Ugbm9kZSBwb2ludGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgUE0gZG9tYWluIHByb3ZpZGVyLgorICogQGdlbnBkOiBQb2ludGVyIHRvIFBNIGRvbWFpbiBhc3NvY2lhdGVkIHdpdGggdGhlIFBNIGRvbWFpbiBwcm92aWRlci4KKyAqLworaW50IG9mX2dlbnBkX2FkZF9wcm92aWRlcl9zaW1wbGUoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmICghbnAgfHwgIWdlbnBkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmdwZF9saXN0X2xvY2spOworCisJaWYgKHBtX2dlbnBkX3ByZXNlbnQoZ2VucGQpKQorCQlyZXQgPSBnZW5wZF9hZGRfcHJvdmlkZXIobnAsIGdlbnBkX3hsYXRlX3NpbXBsZSwgZ2VucGQpOworCisJaWYgKCFyZXQpIHsKKwkJZ2VucGQtPnByb3ZpZGVyID0gJm5wLT5md25vZGU7CisJCWdlbnBkLT5oYXNfcHJvdmlkZXIgPSB0cnVlOworCX0KKworCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfZ2VucGRfYWRkX3Byb3ZpZGVyX3NpbXBsZSk7CisKKy8qKgorICogb2ZfZ2VucGRfYWRkX3Byb3ZpZGVyX29uZWNlbGwoKSAtIFJlZ2lzdGVyIGEgb25lY2VsbCBQTSBkb21haW4gcHJvdmlkZXIKKyAqIEBucDogRGV2aWNlIG5vZGUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIFBNIGRvbWFpbiBwcm92aWRlci4KKyAqIEBkYXRhOiBQb2ludGVyIHRvIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgUE0gZG9tYWluIHByb3ZpZGVyLgorICovCitpbnQgb2ZfZ2VucGRfYWRkX3Byb3ZpZGVyX29uZWNlbGwoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkgIHN0cnVjdCBnZW5wZF9vbmVjZWxsX2RhdGEgKmRhdGEpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlpZiAoIW5wIHx8ICFkYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmdwZF9saXN0X2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPm51bV9kb21haW5zOyBpKyspIHsKKwkJaWYgKCFkYXRhLT5kb21haW5zW2ldKQorCQkJY29udGludWU7CisJCWlmICghcG1fZ2VucGRfcHJlc2VudChkYXRhLT5kb21haW5zW2ldKSkKKwkJCWdvdG8gZXJyb3I7CisKKwkJZGF0YS0+ZG9tYWluc1tpXS0+cHJvdmlkZXIgPSAmbnAtPmZ3bm9kZTsKKwkJZGF0YS0+ZG9tYWluc1tpXS0+aGFzX3Byb3ZpZGVyID0gdHJ1ZTsKKwl9CisKKwlyZXQgPSBnZW5wZF9hZGRfcHJvdmlkZXIobnAsIGdlbnBkX3hsYXRlX29uZWNlbGwsIGRhdGEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJbXV0ZXhfdW5sb2NrKCZncGRfbGlzdF9sb2NrKTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwl3aGlsZSAoaS0tKSB7CisJCWlmICghZGF0YS0+ZG9tYWluc1tpXSkKKwkJCWNvbnRpbnVlOworCQlkYXRhLT5kb21haW5zW2ldLT5wcm92aWRlciA9IE5VTEw7CisJCWRhdGEtPmRvbWFpbnNbaV0tPmhhc19wcm92aWRlciA9IGZhbHNlOworCX0KKworCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfZ2VucGRfYWRkX3Byb3ZpZGVyX29uZWNlbGwpOwogCiAvKioKICAqIG9mX2dlbnBkX2RlbF9wcm92aWRlcigpIC0gUmVtb3ZlIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIFBNIGRvbWFpbiBwcm92aWRlcgpAQCAtMTQ1MSwxMCArMTYwOCwyMSBAQAogdm9pZCBvZl9nZW5wZF9kZWxfcHJvdmlkZXIoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAlzdHJ1Y3Qgb2ZfZ2VucGRfcHJvdmlkZXIgKmNwOworCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ3BkOwogCisJbXV0ZXhfbG9jaygmZ3BkX2xpc3RfbG9jayk7CiAJbXV0ZXhfbG9jaygmb2ZfZ2VucGRfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3AsICZvZl9nZW5wZF9wcm92aWRlcnMsIGxpbmspIHsKIAkJaWYgKGNwLT5ub2RlID09IG5wKSB7CisJCQkvKgorCQkJICogRm9yIGVhY2ggUE0gZG9tYWluIGFzc29jaWF0ZWQgd2l0aCB0aGUKKwkJCSAqIHByb3ZpZGVyLCBzZXQgdGhlICdoYXNfcHJvdmlkZXInIHRvIGZhbHNlCisJCQkgKiBzbyB0aGF0IHRoZSBQTSBkb21haW4gY2FuIGJlIHNhZmVseSByZW1vdmVkLgorCQkJICovCisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdwZCwgJmdwZF9saXN0LCBncGRfbGlzdF9ub2RlKQorCQkJCWlmIChncGQtPnByb3ZpZGVyID09ICZucC0+Zndub2RlKQorCQkJCQlncGQtPmhhc19wcm92aWRlciA9IGZhbHNlOworCiAJCQlsaXN0X2RlbCgmY3AtPmxpbmspOwogCQkJb2Zfbm9kZV9wdXQoY3AtPm5vZGUpOwogCQkJa2ZyZWUoY3ApOwpAQCAtMTQ2MiwxMSArMTYzMCwxMiBAQAogCQl9CiAJfQogCW11dGV4X3VubG9jaygmb2ZfZ2VucGRfbXV0ZXgpOworCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvZl9nZW5wZF9kZWxfcHJvdmlkZXIpOwogCiAvKioKLSAqIG9mX2dlbnBkX2dldF9mcm9tX3Byb3ZpZGVyKCkgLSBMb29rLXVwIFBNIGRvbWFpbgorICogZ2VucGRfZ2V0X2Zyb21fcHJvdmlkZXIoKSAtIExvb2stdXAgUE0gZG9tYWluCiAgKiBAZ2VucGRzcGVjOiBPRiBwaGFuZGxlIGFyZ3MgdG8gdXNlIGZvciBsb29rLXVwCiAgKgogICogTG9va3MgZm9yIGEgUE0gZG9tYWluIHByb3ZpZGVyIHVuZGVyIHRoZSBub2RlIHNwZWNpZmllZCBieSBAZ2VucGRzcGVjIGFuZCBpZgpAQCAtMTQ3Niw3ICsxNjQ1LDcgQEAKICAqIFJldHVybnMgYSB2YWxpZCBwb2ludGVyIHRvIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiBvbiBzdWNjZXNzIG9yIEVSUl9QVFIoKQogICogb24gZmFpbHVyZS4KICAqLwotc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpvZl9nZW5wZF9nZXRfZnJvbV9wcm92aWRlcigKK3N0YXRpYyBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkX2dldF9mcm9tX3Byb3ZpZGVyKAogCQkJCQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpnZW5wZHNwZWMpCiB7CiAJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCA9IEVSUl9QVFIoLUVOT0VOVCk7CkBAIC0xNDk5LDcgKzE2NjgsMTA5IEBACiAKIAlyZXR1cm4gZ2VucGQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChvZl9nZW5wZF9nZXRfZnJvbV9wcm92aWRlcik7CisKKy8qKgorICogb2ZfZ2VucGRfYWRkX2RldmljZSgpIC0gQWRkIGEgZGV2aWNlIHRvIGFuIEkvTyBQTSBkb21haW4KKyAqIEBnZW5wZHNwZWM6IE9GIHBoYW5kbGUgYXJncyB0byB1c2UgZm9yIGxvb2stdXAgUE0gZG9tYWluCisgKiBAZGV2OiBEZXZpY2UgdG8gYmUgYWRkZWQuCisgKgorICogTG9va3MtdXAgYW4gSS9PIFBNIGRvbWFpbiBiYXNlZCB1cG9uIHBoYW5kbGUgYXJncyBwcm92aWRlZCBhbmQgYWRkcworICogdGhlIGRldmljZSB0byB0aGUgUE0gZG9tYWluLiBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgb2ZfZ2VucGRfYWRkX2RldmljZShzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpnZW5wZHNwZWMsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZncGRfbGlzdF9sb2NrKTsKKworCWdlbnBkID0gZ2VucGRfZ2V0X2Zyb21fcHJvdmlkZXIoZ2VucGRzcGVjKTsKKwlpZiAoSVNfRVJSKGdlbnBkKSkgeworCQlyZXQgPSBQVFJfRVJSKGdlbnBkKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gZ2VucGRfYWRkX2RldmljZShnZW5wZCwgZGV2LCBOVUxMKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfZ2VucGRfYWRkX2RldmljZSk7CisKKy8qKgorICogb2ZfZ2VucGRfYWRkX3N1YmRvbWFpbiAtIEFkZCBhIHN1YmRvbWFpbiB0byBhbiBJL08gUE0gZG9tYWluLgorICogQHBhcmVudF9zcGVjOiBPRiBwaGFuZGxlIGFyZ3MgdG8gdXNlIGZvciBwYXJlbnQgUE0gZG9tYWluIGxvb2stdXAKKyAqIEBzdWJkb21haW5fc3BlYzogT0YgcGhhbmRsZSBhcmdzIHRvIHVzZSBmb3Igc3ViZG9tYWluIGxvb2stdXAKKyAqCisgKiBMb29rcy11cCBhIHBhcmVudCBQTSBkb21haW4gYW5kIHN1YmRvbWFpbiBiYXNlZCB1cG9uIHBoYW5kbGUgYXJncworICogcHJvdmlkZWQgYW5kIGFkZHMgdGhlIHN1YmRvbWFpbiB0byB0aGUgcGFyZW50IFBNIGRvbWFpbi4gUmV0dXJucyBhCisgKiBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBvZl9nZW5wZF9hZGRfc3ViZG9tYWluKHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKnBhcmVudF9zcGVjLAorCQkJICAgc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqc3ViZG9tYWluX3NwZWMpCit7CisJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpwYXJlbnQsICpzdWJkb21haW47CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmdwZF9saXN0X2xvY2spOworCisJcGFyZW50ID0gZ2VucGRfZ2V0X2Zyb21fcHJvdmlkZXIocGFyZW50X3NwZWMpOworCWlmIChJU19FUlIocGFyZW50KSkgeworCQlyZXQgPSBQVFJfRVJSKHBhcmVudCk7CisJCWdvdG8gb3V0OworCX0KKworCXN1YmRvbWFpbiA9IGdlbnBkX2dldF9mcm9tX3Byb3ZpZGVyKHN1YmRvbWFpbl9zcGVjKTsKKwlpZiAoSVNfRVJSKHN1YmRvbWFpbikpIHsKKwkJcmV0ID0gUFRSX0VSUihzdWJkb21haW4pOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBnZW5wZF9hZGRfc3ViZG9tYWluKHBhcmVudCwgc3ViZG9tYWluKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfZ2VucGRfYWRkX3N1YmRvbWFpbik7CisKKy8qKgorICogb2ZfZ2VucGRfcmVtb3ZlX2xhc3QgLSBSZW1vdmUgdGhlIGxhc3QgUE0gZG9tYWluIHJlZ2lzdGVyZWQgZm9yIGEgcHJvdmlkZXIKKyAqIEBwcm92aWRlcjogUG9pbnRlciB0byBkZXZpY2Ugc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBwcm92aWRlcgorICoKKyAqIEZpbmQgdGhlIGxhc3QgUE0gZG9tYWluIHRoYXQgd2FzIGFkZGVkIGJ5IGEgcGFydGljdWxhciBwcm92aWRlciBhbmQKKyAqIHJlbW92ZSB0aGlzIFBNIGRvbWFpbiBmcm9tIHRoZSBsaXN0IG9mIFBNIGRvbWFpbnMuIFRoZSBwcm92aWRlciBpcworICogaWRlbnRpZmllZCBieSB0aGUgJ3Byb3ZpZGVyJyBkZXZpY2Ugc3RydWN0dXJlIHRoYXQgaXMgcGFzc2VkLiBUaGUgUE0KKyAqIGRvbWFpbiB3aWxsIG9ubHkgYmUgcmVtb3ZlZCwgaWYgdGhlIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCBkb21haW4KKyAqIGhhcyBiZWVuIHJlbW92ZWQuCisgKgorICogUmV0dXJucyBhIHZhbGlkIHBvaW50ZXIgdG8gc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluIG9uIHN1Y2Nlc3Mgb3IKKyAqIEVSUl9QVFIoKSBvbiBmYWlsdXJlLgorICovCitzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKm9mX2dlbnBkX3JlbW92ZV9sYXN0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpncGQsICpnZW5wZCA9IEVSUl9QVFIoLUVOT0VOVCk7CisJaW50IHJldDsKKworCWlmIChJU19FUlJfT1JfTlVMTChucCkpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJbXV0ZXhfbG9jaygmZ3BkX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShncGQsICZncGRfbGlzdCwgZ3BkX2xpc3Rfbm9kZSkgeworCQlpZiAoZ3BkLT5wcm92aWRlciA9PSAmbnAtPmZ3bm9kZSkgeworCQkJcmV0ID0gZ2VucGRfcmVtb3ZlKGdwZCk7CisJCQlnZW5wZCA9IHJldCA/IEVSUl9QVFIocmV0KSA6IGdwZDsKKwkJCWJyZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gZ2VucGQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9nZW5wZF9yZW1vdmVfbGFzdCk7CiAKIC8qKgogICogZ2VucGRfZGV2X3BtX2RldGFjaCAtIERldGFjaCBhIGRldmljZSBmcm9tIGl0cyBQTSBkb21haW4uCkBAIC0xNTE1LDE0ICsxNzg2LDE0IEBACiAJdW5zaWduZWQgaW50IGk7CiAJaW50IHJldCA9IDA7CiAKLQlwZCA9IHBtX2dlbnBkX2xvb2t1cF9kZXYoZGV2KTsKLQlpZiAoIXBkKQorCXBkID0gZGV2X3RvX2dlbnBkKGRldik7CisJaWYgKElTX0VSUihwZCkpCiAJCXJldHVybjsKIAogCWRldl9kYmcoZGV2LCAicmVtb3ZpbmcgZnJvbSBQTSBkb21haW4gJXNcbiIsIHBkLT5uYW1lKTsKIAogCWZvciAoaSA9IDE7IGkgPCBHRU5QRF9SRVRSWV9NQVhfTVM7IGkgPDw9IDEpIHsKLQkJcmV0ID0gcG1fZ2VucGRfcmVtb3ZlX2RldmljZShwZCwgZGV2KTsKKwkJcmV0ID0gZ2VucGRfcmVtb3ZlX2RldmljZShwZCwgZGV2KTsKIAkJaWYgKHJldCAhPSAtRUFHQUlOKQogCQkJYnJlYWs7CiAKQEAgLTE1OTYsOSArMTg2NywxMSBAQAogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JcGQgPSBvZl9nZW5wZF9nZXRfZnJvbV9wcm92aWRlcigmcGRfYXJncyk7CisJbXV0ZXhfbG9jaygmZ3BkX2xpc3RfbG9jayk7CisJcGQgPSBnZW5wZF9nZXRfZnJvbV9wcm92aWRlcigmcGRfYXJncyk7CiAJb2Zfbm9kZV9wdXQocGRfYXJncy5ucCk7CiAJaWYgKElTX0VSUihwZCkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZncGRfbGlzdF9sb2NrKTsKIAkJZGV2X2RiZyhkZXYsICIlcygpIGZhaWxlZCB0byBmaW5kIFBNIGRvbWFpbjogJWxkXG4iLAogCQkJX19mdW5jX18sIFBUUl9FUlIocGQpKTsKIAkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CkBAIC0xNjA3LDEzICsxODgwLDE0IEBACiAJZGV2X2RiZyhkZXYsICJhZGRpbmcgdG8gUE0gZG9tYWluICVzXG4iLCBwZC0+bmFtZSk7CiAKIAlmb3IgKGkgPSAxOyBpIDwgR0VOUERfUkVUUllfTUFYX01TOyBpIDw8PSAxKSB7Ci0JCXJldCA9IHBtX2dlbnBkX2FkZF9kZXZpY2UocGQsIGRldik7CisJCXJldCA9IGdlbnBkX2FkZF9kZXZpY2UocGQsIGRldiwgTlVMTCk7CiAJCWlmIChyZXQgIT0gLUVBR0FJTikKIAkJCWJyZWFrOwogCiAJCW1kZWxheShpKTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJfQorCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CiAKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhZGQgdG8gUE0gZG9tYWluICVzOiAlZCIsCkBAIC0xNjM2LDcgKzE5MTAsNyBAQAogCiAvKioqICAgICAgICBkZWJ1Z2ZzIHN1cHBvcnQgICAgICAgICoqKi8KIAotI2lmZGVmIENPTkZJR19QTV9BRFZBTkNFRF9ERUJVRworI2lmZGVmIENPTkZJR19ERUJVR19GUwogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgpAQCAtMTc4NCw0ICsyMDU4LDQgQEAKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUocG1fZ2VucGRfZGVidWdmc19kaXIpOwogfQogX19leGl0Y2FsbChwbV9nZW5wZF9kZWJ1Z19leGl0KTsKLSNlbmRpZiAvKiBDT05GSUdfUE1fQURWQU5DRURfREVCVUcgKi8KKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAvY29yZS5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC9jb3JlLmMKaW5kZXggZGYwYzcwOS4uNGM3YzZkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC9jb3JlLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC9jb3JlLmMKQEAgLTU4NCw3ICs1ODQsNiBAQAogCXN0cnVjdCBjbGsgKmNsazsKIAl1bnNpZ25lZCBsb25nIGZyZXEsIG9sZF9mcmVxOwogCXVuc2lnbmVkIGxvbmcgdV92b2x0LCB1X3ZvbHRfbWluLCB1X3ZvbHRfbWF4OwotCXVuc2lnbmVkIGxvbmcgb3Vfdm9sdCwgb3Vfdm9sdF9taW4sIG91X3ZvbHRfbWF4OwogCWludCByZXQ7CiAKIAlpZiAodW5saWtlbHkoIXRhcmdldF9mcmVxKSkgewpAQCAtNjIwLDExICs2MTksNyBAQAogCX0KIAogCW9sZF9vcHAgPSBfZmluZF9mcmVxX2NlaWwob3BwX3RhYmxlLCAmb2xkX2ZyZXEpOwotCWlmICghSVNfRVJSKG9sZF9vcHApKSB7Ci0JCW91X3ZvbHQgPSBvbGRfb3BwLT51X3ZvbHQ7Ci0JCW91X3ZvbHRfbWluID0gb2xkX29wcC0+dV92b2x0X21pbjsKLQkJb3Vfdm9sdF9tYXggPSBvbGRfb3BwLT51X3ZvbHRfbWF4OwotCX0gZWxzZSB7CisJaWYgKElTX0VSUihvbGRfb3BwKSkgewogCQlkZXZfZXJyKGRldiwgIiVzOiBmYWlsZWQgdG8gZmluZCBjdXJyZW50IE9QUCBmb3IgZnJlcSAlbHUgKCVsZClcbiIsCiAJCQlfX2Z1bmNfXywgb2xkX2ZyZXEsIFBUUl9FUlIob2xkX29wcCkpOwogCX0KQEAgLTY4Myw3ICs2NzgsOCBAQAogcmVzdG9yZV92b2x0YWdlOgogCS8qIFRoaXMgc2hvdWxkbid0IGhhcm0gZXZlbiBpZiB0aGUgdm9sdGFnZXMgd2VyZW4ndCB1cGRhdGVkIGVhcmxpZXIgKi8KIAlpZiAoIUlTX0VSUihvbGRfb3BwKSkKLQkJX3NldF9vcHBfdm9sdGFnZShkZXYsIHJlZywgb3Vfdm9sdCwgb3Vfdm9sdF9taW4sIG91X3ZvbHRfbWF4KTsKKwkJX3NldF9vcHBfdm9sdGFnZShkZXYsIHJlZywgb2xkX29wcC0+dV92b2x0LAorCQkJCSBvbGRfb3BwLT51X3ZvbHRfbWluLCBvbGRfb3BwLT51X3ZvbHRfbWF4KTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvb3BwL29mLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvb3BwL29mLmMKaW5kZXggMWRmZDNkZC4uNTU1MjIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC9vZi5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAvb2YuYwpAQCAtNzEsOCArNzEsMTggQEAKIAl1MzIgdmVyc2lvbjsKIAlpbnQgcmV0OwogCi0JaWYgKCFvcHBfdGFibGUtPnN1cHBvcnRlZF9odykKLQkJcmV0dXJuIHRydWU7CisJaWYgKCFvcHBfdGFibGUtPnN1cHBvcnRlZF9odykgeworCQkvKgorCQkgKiBJbiB0aGUgY2FzZSB0aGF0IG5vIHN1cHBvcnRlZF9odyBoYXMgYmVlbiBzZXQgYnkgdGhlCisJCSAqIHBsYXRmb3JtIGJ1dCB0aGVyZSBpcyBhbiBvcHAtc3VwcG9ydGVkLWh3IHZhbHVlIHNldCBmb3IKKwkJICogYW4gT1BQIHRoZW4gdGhlIE9QUCBzaG91bGQgbm90IGJlIGVuYWJsZWQgYXMgdGhlcmUgaXMKKwkJICogbm8gd2F5IHRvIHNlZSBpZiB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgaXQuCisJCSAqLworCQlpZiAob2ZfZmluZF9wcm9wZXJ0eShucCwgIm9wcC1zdXBwb3J0ZWQtaHciLCBOVUxMKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJZWxzZQorCQkJcmV0dXJuIHRydWU7CisJfQogCiAJd2hpbGUgKGNvdW50LS0pIHsKIAkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgobnAsICJvcHAtc3VwcG9ydGVkLWh3IiwgY291bnQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYwppbmRleCBlMDk3ZDM1Li44MmEwODFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMKQEAgLTMwMSw3ICszMDEsNyBAQAogCWludCAoKmNhbGxiYWNrKShzdHJ1Y3QgZGV2aWNlICopOwogCWludCByZXR2YWw7CiAKLQl0cmFjZV9ycG1faWRsZShkZXYsIHJwbWZsYWdzKTsKKwl0cmFjZV9ycG1faWRsZV9yY3VpZGxlKGRldiwgcnBtZmxhZ3MpOwogCXJldHZhbCA9IHJwbV9jaGVja19zdXNwZW5kX2FsbG93ZWQoZGV2KTsKIAlpZiAocmV0dmFsIDwgMCkKIAkJOwkvKiBDb25kaXRpb25zIGFyZSB3cm9uZy4gKi8KQEAgLTMzNyw3ICszMzcsNyBAQAogCQkJZGV2LT5wb3dlci5yZXF1ZXN0X3BlbmRpbmcgPSB0cnVlOwogCQkJcXVldWVfd29yayhwbV93cSwgJmRldi0+cG93ZXIud29yayk7CiAJCX0KLQkJdHJhY2VfcnBtX3JldHVybl9pbnQoZGV2LCBfVEhJU19JUF8sIDApOworCQl0cmFjZV9ycG1fcmV0dXJuX2ludF9yY3VpZGxlKGRldiwgX1RISVNfSVBfLCAwKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zNTIsNyArMzUyLDcgQEAKIAl3YWtlX3VwX2FsbCgmZGV2LT5wb3dlci53YWl0X3F1ZXVlKTsKIAogIG91dDoKLQl0cmFjZV9ycG1fcmV0dXJuX2ludChkZXYsIF9USElTX0lQXywgcmV0dmFsKTsKKwl0cmFjZV9ycG1fcmV0dXJuX2ludF9yY3VpZGxlKGRldiwgX1RISVNfSVBfLCByZXR2YWwpOwogCXJldHVybiByZXR2YWwgPyByZXR2YWwgOiBycG1fc3VzcGVuZChkZXYsIHJwbWZsYWdzIHwgUlBNX0FVVE8pOwogfQogCkBAIC00MTksNyArNDE5LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSBOVUxMOwogCWludCByZXR2YWw7CiAKLQl0cmFjZV9ycG1fc3VzcGVuZChkZXYsIHJwbWZsYWdzKTsKKwl0cmFjZV9ycG1fc3VzcGVuZF9yY3VpZGxlKGRldiwgcnBtZmxhZ3MpOwogCiAgcmVwZWF0OgogCXJldHZhbCA9IHJwbV9jaGVja19zdXNwZW5kX2FsbG93ZWQoZGV2KTsKQEAgLTU0OSw3ICs1NDksNyBAQAogCX0KIAogIG91dDoKLQl0cmFjZV9ycG1fcmV0dXJuX2ludChkZXYsIF9USElTX0lQXywgcmV0dmFsKTsKKwl0cmFjZV9ycG1fcmV0dXJuX2ludF9yY3VpZGxlKGRldiwgX1RISVNfSVBfLCByZXR2YWwpOwogCiAJcmV0dXJuIHJldHZhbDsKIApAQCAtNjAxLDcgKzYwMSw3IEBACiAJc3RydWN0IGRldmljZSAqcGFyZW50ID0gTlVMTDsKIAlpbnQgcmV0dmFsID0gMDsKIAotCXRyYWNlX3JwbV9yZXN1bWUoZGV2LCBycG1mbGFncyk7CisJdHJhY2VfcnBtX3Jlc3VtZV9yY3VpZGxlKGRldiwgcnBtZmxhZ3MpOwogCiAgcmVwZWF0OgogCWlmIChkZXYtPnBvd2VyLnJ1bnRpbWVfZXJyb3IpCkBAIC03NjQsNyArNzY0LDcgQEAKIAkJc3Bpbl9sb2NrX2lycSgmZGV2LT5wb3dlci5sb2NrKTsKIAl9CiAKLQl0cmFjZV9ycG1fcmV0dXJuX2ludChkZXYsIF9USElTX0lQXywgcmV0dmFsKTsKKwl0cmFjZV9ycG1fcmV0dXJuX2ludF9yY3VpZGxlKGRldiwgX1RISVNfSVBfLCByZXR2YWwpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvaW50ZXJuYWwuaCBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvaW50ZXJuYWwuaAppbmRleCBhMDM4MDMzLi4yYTQ0MzVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9pbnRlcm5hbC5oCkBAIC0xMDUsOCArMTA1LDggQEAKIAogCWJvb2wgZGVmZXJfY2FjaGluZzsKIAotCXU4IHJlYWRfZmxhZ19tYXNrOwotCXU4IHdyaXRlX2ZsYWdfbWFzazsKKwl1bnNpZ25lZCBsb25nIHJlYWRfZmxhZ19tYXNrOworCXVuc2lnbmVkIGxvbmcgd3JpdGVfZmxhZ19tYXNrOwogCiAJLyogbnVtYmVyIG9mIGJpdHMgdG8gKGxlZnQpIHNoaWZ0IHRoZSByZWcgdmFsdWUgd2hlbiBmb3JtYXR0aW5nKi8KIAlpbnQgcmVnX3NoaWZ0OwpAQCAtMTczLDYgKzE3Myw3IEBACiAJaW50ICgqZHJvcCkoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgbWluLCB1bnNpZ25lZCBpbnQgbWF4KTsKIH07CiAKK2Jvb2wgcmVnbWFwX2NhY2hlZChzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcpOwogYm9vbCByZWdtYXBfd3JpdGVhYmxlKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZyk7CiBib29sIHJlZ21hcF9yZWFkYWJsZShzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcpOwogYm9vbCByZWdtYXBfdm9sYXRpbGUoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUtcmJ0cmVlLmMgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ2NhY2hlLXJidHJlZS5jCmluZGV4IGFhNTZhZjguLmIxMWFmM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUtcmJ0cmVlLmMKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdjYWNoZS1yYnRyZWUuYwpAQCAtNDA0LDYgKzQwNCw3IEBACiAJCXVuc2lnbmVkIGludCBuZXdfYmFzZV9yZWcsIG5ld190b3BfcmVnOwogCQl1bnNpZ25lZCBpbnQgbWluLCBtYXg7CiAJCXVuc2lnbmVkIGludCBtYXhfZGlzdDsKKwkJdW5zaWduZWQgaW50IGRpc3QsIGJlc3RfZGlzdCA9IFVJTlRfTUFYOwogCiAJCW1heF9kaXN0ID0gbWFwLT5yZWdfc3RyaWRlICogc2l6ZW9mKCpyYm5vZGVfdG1wKSAvCiAJCQltYXAtPmNhY2hlX3dvcmRfc2l6ZTsKQEAgLTQyMywyNCArNDI0LDQxIEBACiAJCQkJJmJhc2VfcmVnLCAmdG9wX3JlZyk7CiAKIAkJCWlmIChiYXNlX3JlZyA8PSBtYXggJiYgdG9wX3JlZyA+PSBtaW4pIHsKLQkJCQluZXdfYmFzZV9yZWcgPSBtaW4ocmVnLCBiYXNlX3JlZyk7Ci0JCQkJbmV3X3RvcF9yZWcgPSBtYXgocmVnLCB0b3BfcmVnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG1heCA8IGJhc2VfcmVnKQotCQkJCQlub2RlID0gbm9kZS0+cmJfbGVmdDsKKwkJCQlpZiAocmVnIDwgYmFzZV9yZWcpCisJCQkJCWRpc3QgPSBiYXNlX3JlZyAtIHJlZzsKKwkJCQllbHNlIGlmIChyZWcgPiB0b3BfcmVnKQorCQkJCQlkaXN0ID0gcmVnIC0gdG9wX3JlZzsKIAkJCQllbHNlCi0JCQkJCW5vZGUgPSBub2RlLT5yYl9yaWdodDsKLQotCQkJCWNvbnRpbnVlOworCQkJCQlkaXN0ID0gMDsKKwkJCQlpZiAoZGlzdCA8IGJlc3RfZGlzdCkgeworCQkJCQlyYm5vZGUgPSByYm5vZGVfdG1wOworCQkJCQliZXN0X2Rpc3QgPSBkaXN0OworCQkJCQluZXdfYmFzZV9yZWcgPSBtaW4ocmVnLCBiYXNlX3JlZyk7CisJCQkJCW5ld190b3BfcmVnID0gbWF4KHJlZywgdG9wX3JlZyk7CisJCQkJfQogCQkJfQogCi0JCQlyZXQgPSByZWdjYWNoZV9yYnRyZWVfaW5zZXJ0X3RvX2Jsb2NrKG1hcCwgcmJub2RlX3RtcCwKKwkJCS8qCisJCQkgKiBLZWVwIGxvb2tpbmcsIHdlIHdhbnQgdG8gY2hvb3NlIHRoZSBjbG9zZXN0IGJsb2NrLAorCQkJICogb3RoZXJ3aXNlIHdlIG1pZ2h0IGVuZCB1cCBjcmVhdGluZyBvdmVybGFwcGluZworCQkJICogYmxvY2tzLCB3aGljaCBicmVha3MgdGhlIHJidHJlZS4KKwkJCSAqLworCQkJaWYgKHJlZyA8IGJhc2VfcmVnKQorCQkJCW5vZGUgPSBub2RlLT5yYl9sZWZ0OworCQkJZWxzZSBpZiAocmVnID4gdG9wX3JlZykKKwkJCQlub2RlID0gbm9kZS0+cmJfcmlnaHQ7CisJCQllbHNlCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmJub2RlKSB7CisJCQlyZXQgPSByZWdjYWNoZV9yYnRyZWVfaW5zZXJ0X3RvX2Jsb2NrKG1hcCwgcmJub2RlLAogCQkJCQkJCSAgICAgIG5ld19iYXNlX3JlZywKIAkJCQkJCQkgICAgICBuZXdfdG9wX3JlZywgcmVnLAogCQkJCQkJCSAgICAgIHZhbHVlKTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKLQkJCXJidHJlZV9jdHgtPmNhY2hlZF9yYm5vZGUgPSByYm5vZGVfdG1wOworCQkJcmJ0cmVlX2N0eC0+Y2FjaGVkX3Jibm9kZSA9IHJibm9kZTsKIAkJCXJldHVybiAwOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYwppbmRleCBkZjdmZjcyOS4uNGU1ODI1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdjYWNoZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYwpAQCAtMzgsMTAgKzM4LDExIEBACiAKIAkvKiBjYWxjdWxhdGUgdGhlIHNpemUgb2YgcmVnX2RlZmF1bHRzICovCiAJZm9yIChjb3VudCA9IDAsIGkgPSAwOyBpIDwgbWFwLT5udW1fcmVnX2RlZmF1bHRzX3JhdzsgaSsrKQotCQlpZiAoIXJlZ21hcF92b2xhdGlsZShtYXAsIGkgKiBtYXAtPnJlZ19zdHJpZGUpKQorCQlpZiAocmVnbWFwX3JlYWRhYmxlKG1hcCwgaSAqIG1hcC0+cmVnX3N0cmlkZSkgJiYKKwkJICAgICFyZWdtYXBfdm9sYXRpbGUobWFwLCBpICogbWFwLT5yZWdfc3RyaWRlKSkKIAkJCWNvdW50Kys7CiAKLQkvKiBhbGwgcmVnaXN0ZXJzIGFyZSB2b2xhdGlsZSwgc28ganVzdCBieXBhc3MgKi8KKwkvKiBhbGwgcmVnaXN0ZXJzIGFyZSB1bnJlYWRhYmxlIG9yIHZvbGF0aWxlLCBzbyBqdXN0IGJ5cGFzcyAqLwogCWlmICghY291bnQpIHsKIAkJbWFwLT5jYWNoZV9ieXBhc3MgPSB0cnVlOwogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWRlYnVnZnMuYyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWRlYnVnZnMuYwppbmRleCAxZWUzZDQwLi4zNmNlMzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtZGVidWdmcy5jCkBAIC03Nyw2ICs3NywxNyBAQAogCX0KIH0KIAorc3RhdGljIGJvb2wgcmVnbWFwX3ByaW50YWJsZShzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcpCit7CisJaWYgKHJlZ21hcF9wcmVjaW91cyhtYXAsIHJlZykpCisJCXJldHVybiBmYWxzZTsKKworCWlmICghcmVnbWFwX3JlYWRhYmxlKG1hcCwgcmVnKSAmJiAhcmVnbWFwX2NhY2hlZChtYXAsIHJlZykpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCiAvKgogICogV29yayBvdXQgd2hlcmUgdGhlIHN0YXJ0IG9mZnNldCBtYXBzIGludG8gcmVnaXN0ZXIgbnVtYmVycywgYmVhcmluZwogICogaW4gbWluZCB0aGF0IHdlIHN1cHByZXNzIGhpZGRlbiByZWdpc3RlcnMuCkBAIC0xMDUsOCArMTE2LDcgQEAKIAlpZiAobGlzdF9lbXB0eSgmbWFwLT5kZWJ1Z2ZzX29mZl9jYWNoZSkpIHsKIAkJZm9yICg7IGkgPD0gbWFwLT5tYXhfcmVnaXN0ZXI7IGkgKz0gbWFwLT5yZWdfc3RyaWRlKSB7CiAJCQkvKiBTa2lwIHVucHJpbnRlZCByZWdpc3RlcnMsIGNsb3Npbmcgb2ZmIGNhY2hlIGVudHJ5ICovCi0JCQlpZiAoIXJlZ21hcF9yZWFkYWJsZShtYXAsIGkpIHx8Ci0JCQkgICAgcmVnbWFwX3ByZWNpb3VzKG1hcCwgaSkpIHsKKwkJCWlmICghcmVnbWFwX3ByaW50YWJsZShtYXAsIGkpKSB7CiAJCQkJaWYgKGMpIHsKIAkJCQkJYy0+bWF4ID0gcCAtIDE7CiAJCQkJCWMtPm1heF9yZWcgPSBpIC0gbWFwLT5yZWdfc3RyaWRlOwpAQCAtMjA0LDcgKzIxNCw3IEBACiAJc3RhcnRfcmVnID0gcmVnbWFwX2RlYnVnZnNfZ2V0X2R1bXBfc3RhcnQobWFwLCBmcm9tLCAqcHBvcywgJnApOwogCiAJZm9yIChpID0gc3RhcnRfcmVnOyBpIDw9IHRvOyBpICs9IG1hcC0+cmVnX3N0cmlkZSkgewotCQlpZiAoIXJlZ21hcF9yZWFkYWJsZShtYXAsIGkpKQorCQlpZiAoIXJlZ21hcF9yZWFkYWJsZShtYXAsIGkpICYmICFyZWdtYXBfY2FjaGVkKG1hcCwgaSkpCiAJCQljb250aW51ZTsKIAogCQlpZiAocmVnbWFwX3ByZWNpb3VzKG1hcCwgaSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC5jIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAuYwppbmRleCA1MWZhN2Q2Li5hZTYzYmIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC5jCisrKyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLmMKQEAgLTkzLDYgKzkzLDI5IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgcmVnbWFwX2NhY2hlZChzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJaWYgKG1hcC0+Y2FjaGUgPT0gUkVHQ0FDSEVfTk9ORSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKCFtYXAtPmNhY2hlX29wcykKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKG1hcC0+bWF4X3JlZ2lzdGVyICYmIHJlZyA+IG1hcC0+bWF4X3JlZ2lzdGVyKQorCQlyZXR1cm4gZmFsc2U7CisKKwltYXAtPmxvY2sobWFwLT5sb2NrX2FyZyk7CisJcmV0ID0gcmVnY2FjaGVfcmVhZChtYXAsIHJlZywgJnZhbCk7CisJbWFwLT51bmxvY2sobWFwLT5sb2NrX2FyZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKIGJvb2wgcmVnbWFwX3JlYWRhYmxlKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZykKIHsKIAlpZiAoIW1hcC0+cmVnX3JlYWQpCkBAIC03NDksNiArNzcyLDkgQEAKIAkJY2FzZSBSRUdNQVBfRU5ESUFOX0JJRzoKIAkJCW1hcC0+Zm9ybWF0LmZvcm1hdF9yZWcgPSByZWdtYXBfZm9ybWF0XzE2X2JlOwogCQkJYnJlYWs7CisJCWNhc2UgUkVHTUFQX0VORElBTl9MSVRUTEU6CisJCQltYXAtPmZvcm1hdC5mb3JtYXRfcmVnID0gcmVnbWFwX2Zvcm1hdF8xNl9sZTsKKwkJCWJyZWFrOwogCQljYXNlIFJFR01BUF9FTkRJQU5fTkFUSVZFOgogCQkJbWFwLT5mb3JtYXQuZm9ybWF0X3JlZyA9IHJlZ21hcF9mb3JtYXRfMTZfbmF0aXZlOwogCQkJYnJlYWs7CkBAIC03NjgsNiArNzk0LDkgQEAKIAkJY2FzZSBSRUdNQVBfRU5ESUFOX0JJRzoKIAkJCW1hcC0+Zm9ybWF0LmZvcm1hdF9yZWcgPSByZWdtYXBfZm9ybWF0XzMyX2JlOwogCQkJYnJlYWs7CisJCWNhc2UgUkVHTUFQX0VORElBTl9MSVRUTEU6CisJCQltYXAtPmZvcm1hdC5mb3JtYXRfcmVnID0gcmVnbWFwX2Zvcm1hdF8zMl9sZTsKKwkJCWJyZWFrOwogCQljYXNlIFJFR01BUF9FTkRJQU5fTkFUSVZFOgogCQkJbWFwLT5mb3JtYXQuZm9ybWF0X3JlZyA9IHJlZ21hcF9mb3JtYXRfMzJfbmF0aXZlOwogCQkJYnJlYWs7CkBAIC03ODIsNiArODExLDkgQEAKIAkJY2FzZSBSRUdNQVBfRU5ESUFOX0JJRzoKIAkJCW1hcC0+Zm9ybWF0LmZvcm1hdF9yZWcgPSByZWdtYXBfZm9ybWF0XzY0X2JlOwogCQkJYnJlYWs7CisJCWNhc2UgUkVHTUFQX0VORElBTl9MSVRUTEU6CisJCQltYXAtPmZvcm1hdC5mb3JtYXRfcmVnID0gcmVnbWFwX2Zvcm1hdF82NF9sZTsKKwkJCWJyZWFrOwogCQljYXNlIFJFR01BUF9FTkRJQU5fTkFUSVZFOgogCQkJbWFwLT5mb3JtYXQuZm9ybWF0X3JlZyA9IHJlZ21hcF9mb3JtYXRfNjRfbmF0aXZlOwogCQkJYnJlYWs7CkBAIC0xMjk2LDEyICsxMzI4LDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHJlZ21hcF9zZXRfd29ya19idWZfZmxhZ19tYXNrKHN0cnVjdCByZWdtYXAgKm1hcCwgaW50IG1heF9ieXRlcywKKwkJCQkJICB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJdTggKmJ1ZjsKKwlpbnQgaTsKKworCWlmICghbWFzayB8fCAhbWFwLT53b3JrX2J1ZikKKwkJcmV0dXJuOworCisJYnVmID0gbWFwLT53b3JrX2J1ZjsKKworCWZvciAoaSA9IDA7IGkgPCBtYXhfYnl0ZXM7IGkrKykKKwkJYnVmW2ldIHw9IChtYXNrID4+ICg4ICogaSkpICYgMHhmZjsKK30KKwogaW50IF9yZWdtYXBfcmF3X3dyaXRlKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywKIAkJICAgICAgY29uc3Qgdm9pZCAqdmFsLCBzaXplX3QgdmFsX2xlbikKIHsKIAlzdHJ1Y3QgcmVnbWFwX3JhbmdlX25vZGUgKnJhbmdlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTggKnU4ID0gbWFwLT53b3JrX2J1ZjsKIAl2b2lkICp3b3JrX3ZhbCA9IG1hcC0+d29ya19idWYgKyBtYXAtPmZvcm1hdC5yZWdfYnl0ZXMgKwogCQltYXAtPmZvcm1hdC5wYWRfYnl0ZXM7CiAJdm9pZCAqYnVmOwpAQCAtMTM3MCw4ICsxNDE2LDggQEAKIAl9CiAKIAltYXAtPmZvcm1hdC5mb3JtYXRfcmVnKG1hcC0+d29ya19idWYsIHJlZywgbWFwLT5yZWdfc2hpZnQpOwotCi0JdThbMF0gfD0gbWFwLT53cml0ZV9mbGFnX21hc2s7CisJcmVnbWFwX3NldF93b3JrX2J1Zl9mbGFnX21hc2sobWFwLCBtYXAtPmZvcm1hdC5yZWdfYnl0ZXMsCisJCQkJICAgICAgbWFwLT53cml0ZV9mbGFnX21hc2spOwogCiAJLyoKIAkgKiBFc3NlbnRpYWxseSBhbGwgSS9PIG1lY2hhbmlzbXMgd2lsbCBiZSBmYXN0ZXIgd2l0aCBhIHNpbmdsZQpAQCAtMTQ3NCw2ICsxNTIwLDEyIEBACiAJCXJldCA9IG1hcC0+YnVzLT53cml0ZShtYXAtPmJ1c19jb250ZXh0LCBidWYsIGxlbik7CiAKIAkJa2ZyZWUoYnVmKTsKKwl9IGVsc2UgaWYgKHJldCAhPSAwICYmICFtYXAtPmNhY2hlX2J5cGFzcyAmJiBtYXAtPmZvcm1hdC5wYXJzZV92YWwpIHsKKwkJLyogcmVnY2FjaGVfZHJvcF9yZWdpb24oKSB0YWtlcyBsb2NrIHRoYXQgd2UgYWxyZWFkeSBoYXZlLAorCQkgKiB0aHVzIGNhbGwgbWFwLT5jYWNoZV9vcHMtPmRyb3AoKSBkaXJlY3RseQorCQkgKi8KKwkJaWYgKG1hcC0+Y2FjaGVfb3BzICYmIG1hcC0+Y2FjaGVfb3BzLT5kcm9wKQorCQkJbWFwLT5jYWNoZV9vcHMtPmRyb3AobWFwLCByZWcsIHJlZyArIDEpOwogCX0KIAogCXRyYWNlX3JlZ21hcF9od193cml0ZV9kb25lKG1hcCwgcmVnLCB2YWxfbGVuIC8gbWFwLT5mb3JtYXQudmFsX2J5dGVzKTsKQEAgLTIyNDUsNyArMjI5Nyw2IEBACiAJCQkgICAgdW5zaWduZWQgaW50IHZhbF9sZW4pCiB7CiAJc3RydWN0IHJlZ21hcF9yYW5nZV9ub2RlICpyYW5nZTsKLQl1OCAqdTggPSBtYXAtPndvcmtfYnVmOwogCWludCByZXQ7CiAKIAlXQVJOX09OKCFtYXAtPmJ1cyk7CkBAIC0yMjYyLDE1ICsyMzEzLDggQEAKIAl9CiAKIAltYXAtPmZvcm1hdC5mb3JtYXRfcmVnKG1hcC0+d29ya19idWYsIHJlZywgbWFwLT5yZWdfc2hpZnQpOwotCi0JLyoKLQkgKiBTb21lIGJ1c2VzIG9yIGRldmljZXMgZmxhZyByZWFkcyBieSBzZXR0aW5nIHRoZSBoaWdoIGJpdHMgaW4gdGhlCi0JICogcmVnaXN0ZXIgYWRkcmVzczsgc2luY2UgaXQncyBhbHdheXMgdGhlIGhpZ2ggYml0cyBmb3IgYWxsCi0JICogY3VycmVudCBmb3JtYXRzIHdlIGNhbiBkbyB0aGlzIGhlcmUgcmF0aGVyIHRoYW4gaW4KLQkgKiBmb3JtYXR0aW5nLiAgVGhpcyBtYXkgYnJlYWsgaWYgd2UgZ2V0IGludGVyZXN0aW5nIGZvcm1hdHMuCi0JICovCi0JdThbMF0gfD0gbWFwLT5yZWFkX2ZsYWdfbWFzazsKLQorCXJlZ21hcF9zZXRfd29ya19idWZfZmxhZ19tYXNrKG1hcCwgbWFwLT5mb3JtYXQucmVnX2J5dGVzLAorCQkJCSAgICAgIG1hcC0+cmVhZF9mbGFnX21hc2spOwogCXRyYWNlX3JlZ21hcF9od19yZWFkX3N0YXJ0KG1hcCwgcmVnLCB2YWxfbGVuIC8gbWFwLT5mb3JtYXQudmFsX2J5dGVzKTsKIAogCXJldCA9IG1hcC0+YnVzLT5yZWFkKG1hcC0+YnVzX2NvbnRleHQsIG1hcC0+d29ya19idWYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2Uvc29jLmMgYi9kcml2ZXJzL2Jhc2Uvc29jLmMKaW5kZXggNzViOThhYS4uYjYzZjIzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3NvYy5jCisrKyBiL2RyaXZlcnMvYmFzZS9zb2MuYwpAQCAtNiw3ICs2LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTE2MCwxMSArMTU5LDMgQEAKIAlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZzb2NfYnVzX3R5cGUpOwogfQogY29yZV9pbml0Y2FsbChzb2NfYnVzX3JlZ2lzdGVyKTsKLQotc3RhdGljIHZvaWQgX19leGl0IHNvY19idXNfdW5yZWdpc3Rlcih2b2lkKQotewotCWlkYV9kZXN0cm95KCZzb2NfaWRhKTsKLQotCWJ1c191bnJlZ2lzdGVyKCZzb2NfYnVzX3R5cGUpOwotfQotbW9kdWxlX2V4aXQoc29jX2J1c191bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmNtYS9kcml2ZXJfY2hpcGNvbW1vbi5jIGIvZHJpdmVycy9iY21hL2RyaXZlcl9jaGlwY29tbW9uLmMKaW5kZXggOTIxY2UxOC4uYjRmNjUyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iY21hL2RyaXZlcl9jaGlwY29tbW9uLmMKKysrIGIvZHJpdmVycy9iY21hL2RyaXZlcl9jaGlwY29tbW9uLmMKQEAgLTM2LDEyICszNiwzMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYmNtYV9jaGlwY29fZ2V0X2FscF9jbG9jayk7CiAKK3N0YXRpYyBib29sIGJjbWFfY29yZV9jY19oYXNfcG11X3dhdGNoZG9nKHN0cnVjdCBiY21hX2Rydl9jYyAqY2MpCit7CisJc3RydWN0IGJjbWFfYnVzICpidXMgPSBjYy0+Y29yZS0+YnVzOworCisJaWYgKGNjLT5jYXBhYmlsaXRpZXMgJiBCQ01BX0NDX0NBUF9QTVUpIHsKKwkJaWYgKGJ1cy0+Y2hpcGluZm8uaWQgPT0gQkNNQV9DSElQX0lEX0JDTTUzNTczKSB7CisJCQlXQVJOKGJ1cy0+Y2hpcGluZm8ucmV2IDw9IDEsICJObyB3YXRjaGRvZyBhdmFpbGFibGVcbiIpOworCQkJLyogNTM1NzNCMCBhbmQgNTM1NzNCMSBoYXZlIGJ1Z2dlZCBQTVUgd2F0Y2hkb2cuIEl0IGNhbgorCQkJICogYmUgZW5hYmxlZCBidXQgdGltZXIgY2FuJ3QgYmUgYnVtcGVkLiBVc2UgQ0Mgb25lCisJCQkgKiBpbnN0ZWFkLgorCQkJICovCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKwogc3RhdGljIHUzMiBiY21hX2NoaXBjb193YXRjaGRvZ19nZXRfbWF4X3RpbWVyKHN0cnVjdCBiY21hX2Rydl9jYyAqY2MpCiB7CiAJc3RydWN0IGJjbWFfYnVzICpidXMgPSBjYy0+Y29yZS0+YnVzOwogCXUzMiBuYjsKIAotCWlmIChjYy0+Y2FwYWJpbGl0aWVzICYgQkNNQV9DQ19DQVBfUE1VKSB7CisJaWYgKGJjbWFfY29yZV9jY19oYXNfcG11X3dhdGNoZG9nKGNjKSkgewogCQlpZiAoYnVzLT5jaGlwaW5mby5pZCA9PSBCQ01BX0NISVBfSURfQkNNNDcwNikKIAkJCW5iID0gMzI7CiAJCWVsc2UgaWYgKGNjLT5jb3JlLT5pZC5yZXYgPCAyNikKQEAgLTk1LDkgKzExNCwxNiBAQAogCiBpbnQgYmNtYV9jaGlwY29fd2F0Y2hkb2dfcmVnaXN0ZXIoc3RydWN0IGJjbWFfZHJ2X2NjICpjYykKIHsKKwlzdHJ1Y3QgYmNtYV9idXMgKmJ1cyA9IGNjLT5jb3JlLT5idXM7CiAJc3RydWN0IGJjbTQ3eHhfd2R0IHdkdCA9IHt9OwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAKKwlpZiAoYnVzLT5jaGlwaW5mby5pZCA9PSBCQ01BX0NISVBfSURfQkNNNTM1NzMgJiYKKwkgICAgYnVzLT5jaGlwaW5mby5yZXYgPD0gMSkgeworCQlwcl9kZWJ1ZygiTm8gd2F0Y2hkb2cgb24gNTM1NzNBMCAvIDUzNTczQTFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKIAl3ZHQuZHJpdmVyX2RhdGEgPSBjYzsKIAl3ZHQudGltZXJfc2V0ID0gYmNtYV9jaGlwY29fd2F0Y2hkb2dfdGltZXJfc2V0X3dkdDsKIAl3ZHQudGltZXJfc2V0X21zID0gYmNtYV9jaGlwY29fd2F0Y2hkb2dfdGltZXJfc2V0X21zX3dkdDsKQEAgLTEwNSw3ICsxMzEsNyBAQAogCQliY21hX2NoaXBjb193YXRjaGRvZ19nZXRfbWF4X3RpbWVyKGNjKSAvIGNjLT50aWNrc19wZXJfbXM7CiAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEoTlVMTCwgImJjbTQ3eHgtd2R0IiwKLQkJCQkJICAgICBjYy0+Y29yZS0+YnVzLT5udW0sICZ3ZHQsCisJCQkJCSAgICAgYnVzLT5udW0sICZ3ZHQsCiAJCQkJCSAgICAgc2l6ZW9mKHdkdCkpOwogCWlmIChJU19FUlIocGRldikpCiAJCXJldHVybiBQVFJfRVJSKHBkZXYpOwpAQCAtMjE3LDcgKzI0Myw3IEBACiAJdTMyIG1heHQ7CiAKIAltYXh0ID0gYmNtYV9jaGlwY29fd2F0Y2hkb2dfZ2V0X21heF90aW1lcihjYyk7Ci0JaWYgKGNjLT5jYXBhYmlsaXRpZXMgJiBCQ01BX0NDX0NBUF9QTVUpIHsKKwlpZiAoYmNtYV9jb3JlX2NjX2hhc19wbXVfd2F0Y2hkb2coY2MpKSB7CiAJCWlmICh0aWNrcyA9PSAxKQogCQkJdGlja3MgPSAyOwogCQllbHNlIGlmICh0aWNrcyA+IG1heHQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbWEvbWFpbi5jIGIvZHJpdmVycy9iY21hL21haW4uYwppbmRleCAxZjYzNTQ3Li4yYzE3OThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvbWFpbi5jCisrKyBiL2RyaXZlcnMvYmNtYS9tYWluLmMKQEAgLTIwOSw2ICsyMDksOCBAQAogCQljb3JlLT5kZXYub2Zfbm9kZSA9IG5vZGU7CiAKIAljb3JlLT5pcnEgPSBiY21hX29mX2dldF9pcnEocGFyZW50LCBjb3JlLCAwKTsKKworCW9mX2RtYV9jb25maWd1cmUoJmNvcmUtPmRldiwgbm9kZSk7CiB9CiAKIHVuc2lnbmVkIGludCBiY21hX2NvcmVfaXJxKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgaW50IG51bSkKQEAgLTI0OCwxMiArMjUwLDEyIEBACiAJCWNvcmUtPmlycSA9IGJ1cy0+aG9zdF9wY2ktPmlycTsKIAkJYnJlYWs7CiAJY2FzZSBCQ01BX0hPU1RUWVBFX1NPQzoKLQkJY29yZS0+ZGV2LmRtYV9tYXNrID0gJmNvcmUtPmRldi5jb2hlcmVudF9kbWFfbWFzazsKLQkJaWYgKGJ1cy0+aG9zdF9wZGV2KSB7CisJCWlmIChJU19FTkFCTEVEKENPTkZJR19PRikgJiYgYnVzLT5ob3N0X3BkZXYpIHsKIAkJCWNvcmUtPmRtYV9kZXYgPSAmYnVzLT5ob3N0X3BkZXYtPmRldjsKIAkJCWNvcmUtPmRldi5wYXJlbnQgPSAmYnVzLT5ob3N0X3BkZXYtPmRldjsKIAkJCWJjbWFfb2ZfZmlsbF9kZXZpY2UoYnVzLT5ob3N0X3BkZXYsIGNvcmUpOwogCQl9IGVsc2UgeworCQkJY29yZS0+ZGV2LmRtYV9tYXNrID0gJmNvcmUtPmRldi5jb2hlcmVudF9kbWFfbWFzazsKIAkJCWNvcmUtPmRtYV9kZXYgPSAmY29yZS0+ZGV2OwogCQl9CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9mbG9wcHkuYyBiL2RyaXZlcnMvYmxvY2svZmxvcHB5LmMKaW5kZXggYjcxYTljNy4uZTNkOGU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9mbG9wcHkuYworKysgYi9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jCkBAIC0zNzA2LDIyICszNzA2LDIxIEBACiAJaWYgKFVGRENTLT5yYXdjbWQgPT0gMSkKIAkJVUZEQ1MtPnJhd2NtZCA9IDI7CiAKLQlpZiAobW9kZSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKSkgewotCQlVRFJTLT5sYXN0X2NoZWNrZWQgPSAwOwotCQljbGVhcl9iaXQoRkRfT1BFTl9TSE9VTERfRkFJTF9CSVQsICZVRFJTLT5mbGFncyk7Ci0JCWNoZWNrX2Rpc2tfY2hhbmdlKGJkZXYpOwotCQlpZiAodGVzdF9iaXQoRkRfRElTS19DSEFOR0VEX0JJVCwgJlVEUlMtPmZsYWdzKSkKLQkJCWdvdG8gb3V0OwotCQlpZiAodGVzdF9iaXQoRkRfT1BFTl9TSE9VTERfRkFJTF9CSVQsICZVRFJTLT5mbGFncykpCisJaWYgKCEobW9kZSAmIEZNT0RFX05ERUxBWSkpIHsKKwkJaWYgKG1vZGUgJiAoRk1PREVfUkVBRHxGTU9ERV9XUklURSkpIHsKKwkJCVVEUlMtPmxhc3RfY2hlY2tlZCA9IDA7CisJCQljbGVhcl9iaXQoRkRfT1BFTl9TSE9VTERfRkFJTF9CSVQsICZVRFJTLT5mbGFncyk7CisJCQljaGVja19kaXNrX2NoYW5nZShiZGV2KTsKKwkJCWlmICh0ZXN0X2JpdChGRF9ESVNLX0NIQU5HRURfQklULCAmVURSUy0+ZmxhZ3MpKQorCQkJCWdvdG8gb3V0OworCQkJaWYgKHRlc3RfYml0KEZEX09QRU5fU0hPVUxEX0ZBSUxfQklULCAmVURSUy0+ZmxhZ3MpKQorCQkJCWdvdG8gb3V0OworCQl9CisJCXJlcyA9IC1FUk9GUzsKKwkJaWYgKChtb2RlICYgRk1PREVfV1JJVEUpICYmCisJCSAgICAhdGVzdF9iaXQoRkRfRElTS19XUklUQUJMRV9CSVQsICZVRFJTLT5mbGFncykpCiAJCQlnb3RvIG91dDsKIAl9Ci0KLQlyZXMgPSAtRVJPRlM7Ci0KLQlpZiAoKG1vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCSF0ZXN0X2JpdChGRF9ESVNLX1dSSVRBQkxFX0JJVCwgJlVEUlMtPmZsYWdzKSkKLQkJZ290byBvdXQ7Ci0KIAltdXRleF91bmxvY2soJm9wZW5fbG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZmbG9wcHlfbXV0ZXgpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMKaW5kZXggYmU0ZmVhNi4uODhlZjZkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtmcm9udC5jCkBAIC0xODksNiArMTg5LDggQEAKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAJc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhiZGV2OwogCXN0cnVjdCBnZW5kaXNrICpnZDsKKwl1MTYgc2VjdG9yX3NpemU7CisJdW5zaWduZWQgaW50IHBoeXNpY2FsX3NlY3Rvcl9zaXplOwogCWludCB2ZGV2aWNlOwogCWJsa2lmX3ZkZXZfdCBoYW5kbGU7CiAJZW51bSBibGtpZl9zdGF0ZSBjb25uZWN0ZWQ7CkBAIC05MTAsOSArOTEyLDQ1IEBACiAJLm1hcF9xdWV1ZSA9IGJsa19tcV9tYXBfcXVldWUsCiB9OwogCitzdGF0aWMgdm9pZCBibGtpZl9zZXRfcXVldWVfbGltaXRzKHN0cnVjdCBibGtmcm9udF9pbmZvICppbmZvKQoreworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpycSA9IGluZm8tPnJxOworCXN0cnVjdCBnZW5kaXNrICpnZCA9IGluZm8tPmdkOworCXVuc2lnbmVkIGludCBzZWdtZW50cyA9IGluZm8tPm1heF9pbmRpcmVjdF9zZWdtZW50cyA/IDoKKwkJCQlCTEtJRl9NQVhfU0VHTUVOVFNfUEVSX1JFUVVFU1Q7CisKKwlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX1ZJUlQsIHJxKTsKKworCWlmIChpbmZvLT5mZWF0dXJlX2Rpc2NhcmQpIHsKKwkJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19ESVNDQVJELCBycSk7CisJCWJsa19xdWV1ZV9tYXhfZGlzY2FyZF9zZWN0b3JzKHJxLCBnZXRfY2FwYWNpdHkoZ2QpKTsKKwkJcnEtPmxpbWl0cy5kaXNjYXJkX2dyYW51bGFyaXR5ID0gaW5mby0+ZGlzY2FyZF9ncmFudWxhcml0eTsKKwkJcnEtPmxpbWl0cy5kaXNjYXJkX2FsaWdubWVudCA9IGluZm8tPmRpc2NhcmRfYWxpZ25tZW50OworCQlpZiAoaW5mby0+ZmVhdHVyZV9zZWNkaXNjYXJkKQorCQkJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19TRUNFUkFTRSwgcnEpOworCX0KKworCS8qIEhhcmQgc2VjdG9yIHNpemUgYW5kIG1heCBzZWN0b3JzIGltcGVyc29uYXRlIHRoZSBlcXVpdi4gaGFyZHdhcmUuICovCisJYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShycSwgaW5mby0+c2VjdG9yX3NpemUpOworCWJsa19xdWV1ZV9waHlzaWNhbF9ibG9ja19zaXplKHJxLCBpbmZvLT5waHlzaWNhbF9zZWN0b3Jfc2l6ZSk7CisJYmxrX3F1ZXVlX21heF9od19zZWN0b3JzKHJxLCAoc2VnbWVudHMgKiBYRU5fUEFHRV9TSVpFKSAvIDUxMik7CisKKwkvKiBFYWNoIHNlZ21lbnQgaW4gYSByZXF1ZXN0IGlzIHVwIHRvIGFuIGFsaWduZWQgcGFnZSBpbiBzaXplLiAqLworCWJsa19xdWV1ZV9zZWdtZW50X2JvdW5kYXJ5KHJxLCBQQUdFX1NJWkUgLSAxKTsKKwlibGtfcXVldWVfbWF4X3NlZ21lbnRfc2l6ZShycSwgUEFHRV9TSVpFKTsKKworCS8qIEVuc3VyZSBhIG1lcmdlZCByZXF1ZXN0IHdpbGwgZml0IGluIGEgc2luZ2xlIEkvTyByaW5nIHNsb3QuICovCisJYmxrX3F1ZXVlX21heF9zZWdtZW50cyhycSwgc2VnbWVudHMgLyBHUkFOVFNfUEVSX1BTRUcpOworCisJLyogTWFrZSBzdXJlIGJ1ZmZlciBhZGRyZXNzZXMgYXJlIHNlY3Rvci1hbGlnbmVkLiAqLworCWJsa19xdWV1ZV9kbWFfYWxpZ25tZW50KHJxLCA1MTEpOworCisJLyogTWFrZSBzdXJlIHdlIGRvbid0IHVzZSBib3VuY2UgYnVmZmVycy4gKi8KKwlibGtfcXVldWVfYm91bmNlX2xpbWl0KHJxLCBCTEtfQk9VTkNFX0FOWSk7Cit9CisKIHN0YXRpYyBpbnQgeGx2YmRfaW5pdF9ibGtfcXVldWUoc3RydWN0IGdlbmRpc2sgKmdkLCB1MTYgc2VjdG9yX3NpemUsCi0JCQkJdW5zaWduZWQgaW50IHBoeXNpY2FsX3NlY3Rvcl9zaXplLAotCQkJCXVuc2lnbmVkIGludCBzZWdtZW50cykKKwkJCQl1bnNpZ25lZCBpbnQgcGh5c2ljYWxfc2VjdG9yX3NpemUpCiB7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnJxOwogCXN0cnVjdCBibGtmcm9udF9pbmZvICppbmZvID0gZ2QtPnByaXZhdGVfZGF0YTsKQEAgLTk0NCwzNiArOTgyLDExIEBACiAJfQogCiAJcnEtPnF1ZXVlZGF0YSA9IGluZm87Ci0JcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19WSVJULCBycSk7Ci0KLQlpZiAoaW5mby0+ZmVhdHVyZV9kaXNjYXJkKSB7Ci0JCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfRElTQ0FSRCwgcnEpOwotCQlibGtfcXVldWVfbWF4X2Rpc2NhcmRfc2VjdG9ycyhycSwgZ2V0X2NhcGFjaXR5KGdkKSk7Ci0JCXJxLT5saW1pdHMuZGlzY2FyZF9ncmFudWxhcml0eSA9IGluZm8tPmRpc2NhcmRfZ3JhbnVsYXJpdHk7Ci0JCXJxLT5saW1pdHMuZGlzY2FyZF9hbGlnbm1lbnQgPSBpbmZvLT5kaXNjYXJkX2FsaWdubWVudDsKLQkJaWYgKGluZm8tPmZlYXR1cmVfc2VjZGlzY2FyZCkKLQkJCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfU0VDRVJBU0UsIHJxKTsKLQl9Ci0KLQkvKiBIYXJkIHNlY3RvciBzaXplIGFuZCBtYXggc2VjdG9ycyBpbXBlcnNvbmF0ZSB0aGUgZXF1aXYuIGhhcmR3YXJlLiAqLwotCWJsa19xdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUocnEsIHNlY3Rvcl9zaXplKTsKLQlibGtfcXVldWVfcGh5c2ljYWxfYmxvY2tfc2l6ZShycSwgcGh5c2ljYWxfc2VjdG9yX3NpemUpOwotCWJsa19xdWV1ZV9tYXhfaHdfc2VjdG9ycyhycSwgKHNlZ21lbnRzICogWEVOX1BBR0VfU0laRSkgLyA1MTIpOwotCi0JLyogRWFjaCBzZWdtZW50IGluIGEgcmVxdWVzdCBpcyB1cCB0byBhbiBhbGlnbmVkIHBhZ2UgaW4gc2l6ZS4gKi8KLQlibGtfcXVldWVfc2VnbWVudF9ib3VuZGFyeShycSwgUEFHRV9TSVpFIC0gMSk7Ci0JYmxrX3F1ZXVlX21heF9zZWdtZW50X3NpemUocnEsIFBBR0VfU0laRSk7Ci0KLQkvKiBFbnN1cmUgYSBtZXJnZWQgcmVxdWVzdCB3aWxsIGZpdCBpbiBhIHNpbmdsZSBJL08gcmluZyBzbG90LiAqLwotCWJsa19xdWV1ZV9tYXhfc2VnbWVudHMocnEsIHNlZ21lbnRzIC8gR1JBTlRTX1BFUl9QU0VHKTsKLQotCS8qIE1ha2Ugc3VyZSBidWZmZXIgYWRkcmVzc2VzIGFyZSBzZWN0b3ItYWxpZ25lZC4gKi8KLQlibGtfcXVldWVfZG1hX2FsaWdubWVudChycSwgNTExKTsKLQotCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCB1c2UgYm91bmNlIGJ1ZmZlcnMuICovCi0JYmxrX3F1ZXVlX2JvdW5jZV9saW1pdChycSwgQkxLX0JPVU5DRV9BTlkpOwotCi0JZ2QtPnF1ZXVlID0gcnE7CisJaW5mby0+cnEgPSBnZC0+cXVldWUgPSBycTsKKwlpbmZvLT5nZCA9IGdkOworCWluZm8tPnNlY3Rvcl9zaXplID0gc2VjdG9yX3NpemU7CisJaW5mby0+cGh5c2ljYWxfc2VjdG9yX3NpemUgPSBwaHlzaWNhbF9zZWN0b3Jfc2l6ZTsKKwlibGtpZl9zZXRfcXVldWVfbGltaXRzKGluZm8pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTM2LDE2ICsxMTQ5LDExIEBACiAJZ2QtPnByaXZhdGVfZGF0YSA9IGluZm87CiAJc2V0X2NhcGFjaXR5KGdkLCBjYXBhY2l0eSk7CiAKLQlpZiAoeGx2YmRfaW5pdF9ibGtfcXVldWUoZ2QsIHNlY3Rvcl9zaXplLCBwaHlzaWNhbF9zZWN0b3Jfc2l6ZSwKLQkJCQkgaW5mby0+bWF4X2luZGlyZWN0X3NlZ21lbnRzID8gOgotCQkJCSBCTEtJRl9NQVhfU0VHTUVOVFNfUEVSX1JFUVVFU1QpKSB7CisJaWYgKHhsdmJkX2luaXRfYmxrX3F1ZXVlKGdkLCBzZWN0b3Jfc2l6ZSwgcGh5c2ljYWxfc2VjdG9yX3NpemUpKSB7CiAJCWRlbF9nZW5kaXNrKGdkKTsKIAkJZ290byByZWxlYXNlOwogCX0KIAotCWluZm8tPnJxID0gZ2QtPnF1ZXVlOwotCWluZm8tPmdkID0gZ2Q7Ci0KIAl4bHZiZF9mbHVzaChpbmZvKTsKIAogCWlmICh2ZGlza19pbmZvICYgVkRJU0tfUkVBRE9OTFkpCkBAIC0xMzE1LDcgKzEzMjMsNyBAQAogCQkJcmluZm8tPnJpbmdfcmVmW2ldID0gR1JBTlRfSU5WQUxJRF9SRUY7CiAJCX0KIAl9Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylyaW5mby0+cmluZy5zcmluZywgZ2V0X29yZGVyKGluZm8tPm5yX3JpbmdfcGFnZXMgKiBQQUdFX1NJWkUpKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXJpbmZvLT5yaW5nLnNyaW5nLCBnZXRfb3JkZXIoaW5mby0+bnJfcmluZ19wYWdlcyAqIFhFTl9QQUdFX1NJWkUpKTsKIAlyaW5mby0+cmluZy5zcmluZyA9IE5VTEw7CiAKIAlpZiAocmluZm8tPmlycSkKQEAgLTIwMDcsOCArMjAxNSwxMCBAQAogCXN0cnVjdCBzcGxpdF9iaW8gKnNwbGl0X2JpbzsKIAogCWJsa2Zyb250X2dhdGhlcl9iYWNrZW5kX2ZlYXR1cmVzKGluZm8pOworCS8qIFJlc2V0IGxpbWl0cyBjaGFuZ2VkIGJ5IGJsa19tcV91cGRhdGVfbnJfaHdfcXVldWVzKCkuICovCisJYmxraWZfc2V0X3F1ZXVlX2xpbWl0cyhpbmZvKTsKIAlzZWdzID0gaW5mby0+bWF4X2luZGlyZWN0X3NlZ21lbnRzID8gOiBCTEtJRl9NQVhfU0VHTUVOVFNfUEVSX1JFUVVFU1Q7Ci0JYmxrX3F1ZXVlX21heF9zZWdtZW50cyhpbmZvLT5ycSwgc2Vncyk7CisJYmxrX3F1ZXVlX21heF9zZWdtZW50cyhpbmZvLT5ycSwgc2VncyAvIEdSQU5UU19QRVJfUFNFRyk7CiAKIAlmb3IgKHJfaW5kZXggPSAwOyByX2luZGV4IDwgaW5mby0+bnJfcmluZ3M7IHJfaW5kZXgrKykgewogCQlzdHJ1Y3QgYmxrZnJvbnRfcmluZ19pbmZvICpyaW5mbyA9ICZpbmZvLT5yaW5mb1tyX2luZGV4XTsKQEAgLTI0MzIsNyArMjQ0Miw3IEBACiAJaWYgKGVycikgewogCQl4ZW5idXNfZGV2X2ZhdGFsKGluZm8tPnhiZGV2LCBlcnIsICJ4bHZiZF9hZGQgYXQgJXMiLAogCQkJCSBpbmZvLT54YmRldi0+b3RoZXJlbmQpOwotCQlyZXR1cm47CisJCWdvdG8gZmFpbDsKIAl9CiAKIAl4ZW5idXNfc3dpdGNoX3N0YXRlKGluZm8tPnhiZGV2LCBYZW5idXNTdGF0ZUNvbm5lY3RlZCk7CkBAIC0yNDQ1LDYgKzI0NTUsMTEgQEAKIAlkZXZpY2VfYWRkX2Rpc2soJmluZm8tPnhiZGV2LT5kZXYsIGluZm8tPmdkKTsKIAogCWluZm8tPmlzX3JlYWR5ID0gMTsKKwlyZXR1cm47CisKK2ZhaWw6CisJYmxraWZfZnJlZShpbmZvLCAwKTsKKwlyZXR1cm47CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvS2NvbmZpZyBiL2RyaXZlcnMvYmx1ZXRvb3RoL0tjb25maWcKaW5kZXggY2Y1MGZkMi4uM2NjOWJmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvS2NvbmZpZworKysgYi9kcml2ZXJzL2JsdWV0b290aC9LY29uZmlnCkBAIC0xODAsNiArMTgwLDE3IEBACiAKIAkgIFNheSBZIGhlcmUgdG8gY29tcGlsZSBzdXBwb3J0IGZvciBJbnRlbCBBRzZYWCBwcm90b2NvbC4KIAorY29uZmlnIEJUX0hDSVVBUlRfTVJWTAorCWJvb2wgIk1hcnZlbGwgcHJvdG9jb2wgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJUX0hDSVVBUlQKKwlzZWxlY3QgQlRfSENJVUFSVF9INAorCWhlbHAKKwkgIE1hcnZlbGwgaXMgc2VyaWFsIHByb3RvY29sIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gQmx1ZXRvb3RoCisJICBkZXZpY2UgYW5kIGhvc3QuIFRoaXMgcHJvdG9jb2wgaXMgcmVxdWlyZWQgZm9yIG1vc3QgTWFydmVsbCBCbHVldG9vdGgKKwkgIGRldmljZXMgd2l0aCBVQVJUIGludGVyZmFjZS4KKworCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIHN1cHBvcnQgZm9yIEhDSSBNUlZMIHByb3RvY29sLgorCiBjb25maWcgQlRfSENJQkNNMjAzWAogCXRyaXN0YXRlICJIQ0kgQkNNMjAzeCBVU0IgZHJpdmVyIgogCWRlcGVuZHMgb24gVVNCCkBAIC0zMzEsNCArMzQyLDE2IEBACiAJICBTYXkgWSBoZXJlIHRvIGNvbXBpbGUgc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudCdzIFdpTGluazcgZHJpdmVyCiAJICBpbnRvIHRoZSBrZXJuZWwgb3Igc2F5IE0gdG8gY29tcGlsZSBpdCBhcyBtb2R1bGUgKGJ0d2lsaW5rKS4KIAorY29uZmlnIEJUX1FDT01TTUQKKwl0cmlzdGF0ZSAiUXVhbGNvbW0gU01EIGJhc2VkIEhDSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUUNPTV9TTUQgJiYgUUNPTV9XQ05TU19DVFJMCisJc2VsZWN0IEJUX1FDQQorCWhlbHAKKwkgIFF1YWxjb21tIFNNRCBiYXNlZCBIQ0kgZHJpdmVyLgorCSAgVGhpcyBkcml2ZXIgaXMgdXNlZCB0byBicmlkZ2UgSENJIGRhdGEgb250byB0aGUgc2hhcmVkIG1lbW9yeQorCSAgY2hhbm5lbHMgdG8gdGhlIFdDTlNTIGNvcmUuCisKKwkgIFNheSBZIGhlcmUgdG8gY29tcGlsZSBzdXBwb3J0IGZvciBIQ0kgb3ZlciBRdWFsY29tbSBTTUQgaW50byB0aGUKKwkgIGtlcm5lbCBvciBzYXkgTSB0byBjb21waWxlIGFzIGEgbW9kdWxlLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9NYWtlZmlsZSBiL2RyaXZlcnMvYmx1ZXRvb3RoL01ha2VmaWxlCmluZGV4IDljMTg5MzkuLmIxZmMyOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL01ha2VmaWxlCkBAIC0yMCw2ICsyMCw3IEBACiBvYmotJChDT05GSUdfQlRfTVJWTCkJCSs9IGJ0bXJ2bC5vCiBvYmotJChDT05GSUdfQlRfTVJWTF9TRElPKQkrPSBidG1ydmxfc2Rpby5vCiBvYmotJChDT05GSUdfQlRfV0lMSU5LKQkJKz0gYnR3aWxpbmsubworb2JqLSQoQ09ORklHX0JUX1FDT01TTUQpCSs9IGJ0cWNvbXNtZC5vCiBvYmotJChDT05GSUdfQlRfQkNNKQkJKz0gYnRiY20ubwogb2JqLSQoQ09ORklHX0JUX1JUTCkJCSs9IGJ0cnRsLm8KIG9iai0kKENPTkZJR19CVF9RQ0EpCQkrPSBidHFjYS5vCkBAIC0zNyw2ICszOCw3IEBACiBoY2lfdWFydC0kKENPTkZJR19CVF9IQ0lVQVJUX0JDTSkJKz0gaGNpX2JjbS5vCiBoY2lfdWFydC0kKENPTkZJR19CVF9IQ0lVQVJUX1FDQSkJKz0gaGNpX3FjYS5vCiBoY2lfdWFydC0kKENPTkZJR19CVF9IQ0lVQVJUX0FHNlhYKQkrPSBoY2lfYWc2eHgubworaGNpX3VhcnQtJChDT05GSUdfQlRfSENJVUFSVF9NUlZMKQkrPSBoY2lfbXJ2bC5vCiBoY2lfdWFydC1vYmpzCQkJCTo9ICQoaGNpX3VhcnQteSkKIAogY2NmbGFncy15ICs9IC1EX19DSEVDS19FTkRJQU5fXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYmNtMjAzeC5jIGIvZHJpdmVycy9ibHVldG9vdGgvYmNtMjAzeC5jCmluZGV4IDViMGVmN2IuLjVjZTZkNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JjbTIwM3guYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9iY20yMDN4LmMKQEAgLTE4NSwxMCArMTg1LDggQEAKIAlkYXRhLT5zdGF0ZSA9IEJDTTIwM1hfTE9BRF9NSU5JRFJWOwogCiAJZGF0YS0+dXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEtPnVyYikgewotCQlCVF9FUlIoIkNhbid0IGFsbG9jYXRlIFVSQiIpOworCWlmICghZGF0YS0+dXJiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlpZiAocmVxdWVzdF9maXJtd2FyZSgmZmlybXdhcmUsICJCQ00yMDMzLU1ELmhleCIsICZ1ZGV2LT5kZXYpIDwgMCkgewogCQlCVF9FUlIoIk1pbmkgZHJpdmVyIHJlcXVlc3QgZmFpbGVkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idHFjYS5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnRxY2EuYwppbmRleCA0YTYyMDgxLi4yOGFmZDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idHFjYS5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0cWNhLmMKQEAgLTU1LDggKzU1LDggQEAKIAl9CiAKIAllZGwgPSAoc3RydWN0IGVkbF9ldmVudF9oZHIgKikoc2tiLT5kYXRhKTsKLQlpZiAoIWVkbCB8fCAhZWRsLT5kYXRhKSB7Ci0JCUJUX0VSUigiJXM6IFRMViB3aXRoIG5vIGhlYWRlciBvciBubyBkYXRhIiwgaGRldi0+bmFtZSk7CisJaWYgKCFlZGwpIHsKKwkJQlRfRVJSKCIlczogVExWIHdpdGggbm8gaGVhZGVyIiwgaGRldi0+bmFtZSk7CiAJCWVyciA9IC1FSUxTRVE7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTIyNCw4ICsyMjQsOCBAQAogCX0KIAogCWVkbCA9IChzdHJ1Y3QgZWRsX2V2ZW50X2hkciAqKShza2ItPmRhdGEpOwotCWlmICghZWRsIHx8ICFlZGwtPmRhdGEpIHsKLQkJQlRfRVJSKCIlczogVExWIHdpdGggbm8gaGVhZGVyIG9yIG5vIGRhdGEiLCBoZGV2LT5uYW1lKTsKKwlpZiAoIWVkbCkgeworCQlCVF9FUlIoIiVzOiBUTFYgd2l0aCBubyBoZWFkZXIiLCBoZGV2LT5uYW1lKTsKIAkJZXJyID0gLUVJTFNFUTsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnRxY29tc21kLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idHFjb21zbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGMyYzkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnRxY29tc21kLmMKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIExpbmFybyBMdGQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFNvbnkgTW9iaWxlIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc29jL3Fjb20vc21kLmg+CisjaW5jbHVkZSA8bGludXgvc29jL3Fjb20vd2Nuc3NfY3RybC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CisKKyNpbmNsdWRlICJidHFjYS5oIgorCitzdHJ1Y3QgYnRxY29tc21kIHsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKKworCXN0cnVjdCBxY29tX3NtZF9jaGFubmVsICphY2xfY2hhbm5lbDsKKwlzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqY21kX2NoYW5uZWw7Cit9OworCitzdGF0aWMgaW50IGJ0cWNvbXNtZF9yZWN2KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLyogVXNlIEdGUF9BVE9NSUMgYXMgd2UncmUgaW4gSVJRIGNvbnRleHQgKi8KKwlza2IgPSBidF9za2JfYWxsb2MoY291bnQsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKSB7CisJCWhkZXYtPnN0YXQuZXJyX3J4Kys7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWhjaV9za2JfcGt0X3R5cGUoc2tiKSA9IHR5cGU7CisJbWVtY3B5KHNrYl9wdXQoc2tiLCBjb3VudCksIGRhdGEsIGNvdW50KTsKKworCXJldHVybiBoY2lfcmVjdl9mcmFtZShoZGV2LCBza2IpOworfQorCitzdGF0aWMgaW50IGJ0cWNvbXNtZF9hY2xfY2FsbGJhY2soc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkJICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGJ0cWNvbXNtZCAqYnRxID0gcWNvbV9zbWRfZ2V0X2RydmRhdGEoY2hhbm5lbCk7CisKKwlidHEtPmhkZXYtPnN0YXQuYnl0ZV9yeCArPSBjb3VudDsKKwlyZXR1cm4gYnRxY29tc21kX3JlY3YoYnRxLT5oZGV2LCBIQ0lfQUNMREFUQV9QS1QsIGRhdGEsIGNvdW50KTsKK30KKworc3RhdGljIGludCBidHFjb21zbWRfY21kX2NhbGxiYWNrKHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsLAorCQkJCSAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBidHFjb21zbWQgKmJ0cSA9IHFjb21fc21kX2dldF9kcnZkYXRhKGNoYW5uZWwpOworCisJcmV0dXJuIGJ0cWNvbXNtZF9yZWN2KGJ0cS0+aGRldiwgSENJX0VWRU5UX1BLVCwgZGF0YSwgY291bnQpOworfQorCitzdGF0aWMgaW50IGJ0cWNvbXNtZF9zZW5kKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBidHFjb21zbWQgKmJ0cSA9IGhjaV9nZXRfZHJ2ZGF0YShoZGV2KTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChoY2lfc2tiX3BrdF90eXBlKHNrYikpIHsKKwljYXNlIEhDSV9BQ0xEQVRBX1BLVDoKKwkJcmV0ID0gcWNvbV9zbWRfc2VuZChidHEtPmFjbF9jaGFubmVsLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJaGRldi0+c3RhdC5hY2xfdHgrKzsKKwkJaGRldi0+c3RhdC5ieXRlX3R4ICs9IHNrYi0+bGVuOworCQlicmVhazsKKwljYXNlIEhDSV9DT01NQU5EX1BLVDoKKwkJcmV0ID0gcWNvbV9zbWRfc2VuZChidHEtPmNtZF9jaGFubmVsLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJaGRldi0+c3RhdC5jbWRfdHgrKzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTFNFUTsKKwkJYnJlYWs7CisJfQorCisJa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJ0cWNvbXNtZF9vcGVuKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ0cWNvbXNtZF9jbG9zZShzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidHFjb21zbWRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYnRxY29tc21kICpidHE7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisJdm9pZCAqd2Nuc3M7CisJaW50IHJldDsKKworCWJ0cSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmJ0cSksIEdGUF9LRVJORUwpOworCWlmICghYnRxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdjbnNzID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCisJYnRxLT5hY2xfY2hhbm5lbCA9IHFjb21fd2Nuc3Nfb3Blbl9jaGFubmVsKHdjbnNzLCAiQVBQU19SSVZBX0JUX0FDTCIsCisJCQkJCQkgICBidHFjb21zbWRfYWNsX2NhbGxiYWNrKTsKKwlpZiAoSVNfRVJSKGJ0cS0+YWNsX2NoYW5uZWwpKQorCQlyZXR1cm4gUFRSX0VSUihidHEtPmFjbF9jaGFubmVsKTsKKworCWJ0cS0+Y21kX2NoYW5uZWwgPSBxY29tX3djbnNzX29wZW5fY2hhbm5lbCh3Y25zcywgIkFQUFNfUklWQV9CVF9DTUQiLAorCQkJCQkJICAgYnRxY29tc21kX2NtZF9jYWxsYmFjayk7CisJaWYgKElTX0VSUihidHEtPmNtZF9jaGFubmVsKSkKKwkJcmV0dXJuIFBUUl9FUlIoYnRxLT5jbWRfY2hhbm5lbCk7CisKKwlxY29tX3NtZF9zZXRfZHJ2ZGF0YShidHEtPmFjbF9jaGFubmVsLCBidHEpOworCXFjb21fc21kX3NldF9kcnZkYXRhKGJ0cS0+Y21kX2NoYW5uZWwsIGJ0cSk7CisKKwloZGV2ID0gaGNpX2FsbG9jX2RldigpOworCWlmICghaGRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloY2lfc2V0X2RydmRhdGEoaGRldiwgYnRxKTsKKwlidHEtPmhkZXYgPSBoZGV2OworCVNFVF9IQ0lERVZfREVWKGhkZXYsICZwZGV2LT5kZXYpOworCisJaGRldi0+YnVzID0gSENJX1NNRDsKKwloZGV2LT5vcGVuID0gYnRxY29tc21kX29wZW47CisJaGRldi0+Y2xvc2UgPSBidHFjb21zbWRfY2xvc2U7CisJaGRldi0+c2VuZCA9IGJ0cWNvbXNtZF9zZW5kOworCWhkZXYtPnNldF9iZGFkZHIgPSBxY2Ffc2V0X2JkYWRkcl9yb21lOworCisJcmV0ID0gaGNpX3JlZ2lzdGVyX2RldihoZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQloY2lfZnJlZV9kZXYoaGRldik7CisJCXJldHVybiByZXQ7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYnRxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ0cWNvbXNtZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYnRxY29tc21kICpidHEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWhjaV91bnJlZ2lzdGVyX2RldihidHEtPmhkZXYpOworCWhjaV9mcmVlX2RldihidHEtPmhkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJ0cWNvbXNtZF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSx3Y25zcy1idCIsIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYnRxY29tc21kX2RyaXZlciA9IHsKKwkucHJvYmUgPSBidHFjb21zbWRfcHJvYmUsCisJLnJlbW92ZSA9IGJ0cWNvbXNtZF9yZW1vdmUsCisJLmRyaXZlciAgPSB7CisJCS5uYW1lICA9ICJidHFjb21zbWQiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBidHFjb21zbWRfb2ZfbWF0Y2gsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYnRxY29tc21kX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkJqb3JuIEFuZGVyc3NvbiA8Ympvcm4uYW5kZXJzc29uQHNvbnltb2JpbGUuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJRdWFsY29tbSBTTUQgSENJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnRydGwuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0cnRsLmMKaW5kZXggODQyODg5My4uZmM5YjI1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnRydGwuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idHJ0bC5jCkBAIC0zMyw2ICszMyw3IEBACiAjZGVmaW5lIFJUTF9ST01fTE1QXzg3MjNCCTB4ODcyMwogI2RlZmluZSBSVExfUk9NX0xNUF84ODIxQQkweDg4MjEKICNkZWZpbmUgUlRMX1JPTV9MTVBfODc2MUEJMHg4NzYxCisjZGVmaW5lIFJUTF9ST01fTE1QXzg4MjJCCTB4ODgyMgogCiBzdGF0aWMgaW50IHJ0bF9yZWFkX3JvbV92ZXJzaW9uKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCAqdmVyc2lvbikKIHsKQEAgLTc4LDExICs3OSwxNSBAQAogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhdGNoX2xlbmd0aF9iYXNlLCAqcGF0Y2hfb2Zmc2V0X2Jhc2U7CiAJdTMyIHBhdGNoX29mZnNldCA9IDA7CiAJdTE2IHBhdGNoX2xlbmd0aCwgbnVtX3BhdGNoZXM7Ci0JY29uc3QgdTE2IHByb2plY3RfaWRfdG9fbG1wX3N1YnZlcltdID0gewotCQlSVExfUk9NX0xNUF84NzIzQSwKLQkJUlRMX1JPTV9MTVBfODcyM0IsCi0JCVJUTF9ST01fTE1QXzg4MjFBLAotCQlSVExfUk9NX0xNUF84NzYxQQorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQlfX3UxNiBsbXBfc3VidmVyOworCQlfX3U4IGlkOworCX0gcHJvamVjdF9pZF90b19sbXBfc3VidmVyW10gPSB7CisJCXsgUlRMX1JPTV9MTVBfODcyM0EsIDAgfSwKKwkJeyBSVExfUk9NX0xNUF84NzIzQiwgMSB9LAorCQl7IFJUTF9ST01fTE1QXzg4MjFBLCAyIH0sCisJCXsgUlRMX1JPTV9MTVBfODc2MUEsIDMgfSwKKwkJeyBSVExfUk9NX0xNUF84ODIyQiwgOCB9LAogCX07CiAKIAlyZXQgPSBydGxfcmVhZF9yb21fdmVyc2lvbihoZGV2LCAmcm9tX3ZlcnNpb24pOwpAQCAtMTM0LDE0ICsxMzksMjAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKHByb2plY3RfaWQgPj0gQVJSQVlfU0laRShwcm9qZWN0X2lkX3RvX2xtcF9zdWJ2ZXIpKSB7CisJLyogRmluZCBwcm9qZWN0X2lkIGluIHRhYmxlICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHJvamVjdF9pZF90b19sbXBfc3VidmVyKTsgaSsrKSB7CisJCWlmIChwcm9qZWN0X2lkID09IHByb2plY3RfaWRfdG9fbG1wX3N1YnZlcltpXS5pZCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID49IEFSUkFZX1NJWkUocHJvamVjdF9pZF90b19sbXBfc3VidmVyKSkgewogCQlCVF9FUlIoIiVzOiB1bmtub3duIHByb2plY3QgaWQgJWQiLCBoZGV2LT5uYW1lLCBwcm9qZWN0X2lkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGxtcF9zdWJ2ZXIgIT0gcHJvamVjdF9pZF90b19sbXBfc3VidmVyW3Byb2plY3RfaWRdKSB7CisJaWYgKGxtcF9zdWJ2ZXIgIT0gcHJvamVjdF9pZF90b19sbXBfc3VidmVyW2ldLmxtcF9zdWJ2ZXIpIHsKIAkJQlRfRVJSKCIlczogZmlybXdhcmUgaXMgZm9yICV4IGJ1dCB0aGlzIGlzIGEgJXgiLCBoZGV2LT5uYW1lLAotCQkgICAgICAgcHJvamVjdF9pZF90b19sbXBfc3VidmVyW3Byb2plY3RfaWRdLCBsbXBfc3VidmVyKTsKKwkJICAgICAgIHByb2plY3RfaWRfdG9fbG1wX3N1YnZlcltpXS5sbXBfc3VidmVyLCBsbXBfc3VidmVyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNTcsNiArMjY4LDI2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBydGxfbG9hZF9jb25maWcoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4ICoqYnVmZikKK3sKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCWludCByZXQ7CisKKwlCVF9JTkZPKCIlczogcnRsOiBsb2FkaW5nICVzIiwgaGRldi0+bmFtZSwgbmFtZSk7CisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIG5hbWUsICZoZGV2LT5kZXYpOworCWlmIChyZXQgPCAwKSB7CisJCUJUX0VSUigiJXM6IEZhaWxlZCB0byBsb2FkICVzIiwgaGRldi0+bmFtZSwgbmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZnctPnNpemU7CisJKmJ1ZmYgPSBrbWVtZHVwKGZ3LT5kYXRhLCByZXQsIEdGUF9LRVJORUwpOworCisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGJ0cnRsX3NldHVwX3J0bDg3MjNhKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CkBAIC0yOTYsMjUgKzMyNyw3NCBAQAogCXVuc2lnbmVkIGNoYXIgKmZ3X2RhdGEgPSBOVUxMOwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CiAJaW50IHJldDsKKwlpbnQgY2ZnX3N6OworCXU4ICpjZmdfYnVmZiA9IE5VTEw7CisJdTggKnRidWZmOworCWNoYXIgKmNmZ19uYW1lID0gTlVMTDsKKworCXN3aXRjaCAobG1wX3N1YnZlcikgeworCWNhc2UgUlRMX1JPTV9MTVBfODcyM0I6CisJCWNmZ19uYW1lID0gInJ0bF9idC9ydGw4NzIzYl9jb25maWcuYmluIjsKKwkJYnJlYWs7CisJY2FzZSBSVExfUk9NX0xNUF84ODIxQToKKwkJY2ZnX25hbWUgPSAicnRsX2J0L3J0bDg4MjFhX2NvbmZpZy5iaW4iOworCQlicmVhazsKKwljYXNlIFJUTF9ST01fTE1QXzg3NjFBOgorCQljZmdfbmFtZSA9ICJydGxfYnQvcnRsODc2MWFfY29uZmlnLmJpbiI7CisJCWJyZWFrOworCWNhc2UgUlRMX1JPTV9MTVBfODgyMkI6CisJCWNmZ19uYW1lID0gInJ0bF9idC9ydGw4ODIyYl9jb25maWcuYmluIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlRfRVJSKCIlczogcnRsOiBubyBjb25maWcgYWNjb3JkaW5nIHRvIGxtcF9zdWJ2ZXIgJTA0eCIsCisJCSAgICAgICBoZGV2LT5uYW1lLCBsbXBfc3VidmVyKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGNmZ19uYW1lKSB7CisJCWNmZ19zeiA9IHJ0bF9sb2FkX2NvbmZpZyhoZGV2LCBjZmdfbmFtZSwgJmNmZ19idWZmKTsKKwkJaWYgKGNmZ19zeiA8IDApCisJCQljZmdfc3ogPSAwOworCX0gZWxzZQorCQljZmdfc3ogPSAwOwogCiAJQlRfSU5GTygiJXM6IHJ0bDogbG9hZGluZyAlcyIsIGhkZXYtPm5hbWUsIGZ3X25hbWUpOwogCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19uYW1lLCAmaGRldi0+ZGV2KTsKIAlpZiAocmV0IDwgMCkgewogCQlCVF9FUlIoIiVzOiBGYWlsZWQgdG8gbG9hZCAlcyIsIGhkZXYtPm5hbWUsIGZ3X25hbWUpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycl9yZXFfZnc7CiAJfQogCiAJcmV0ID0gcnRsODcyM2JfcGFyc2VfZmlybXdhcmUoaGRldiwgbG1wX3N1YnZlciwgZncsICZmd19kYXRhKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKKwlpZiAoY2ZnX3N6KSB7CisJCXRidWZmID0ga3phbGxvYyhyZXQgKyBjZmdfc3osIEdGUF9LRVJORUwpOworCQlpZiAoIXRidWZmKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKworCQltZW1jcHkodGJ1ZmYsIGZ3X2RhdGEsIHJldCk7CisJCWtmcmVlKGZ3X2RhdGEpOworCisJCW1lbWNweSh0YnVmZiArIHJldCwgY2ZnX2J1ZmYsIGNmZ19zeik7CisJCXJldCArPSBjZmdfc3o7CisKKwkJZndfZGF0YSA9IHRidWZmOworCX0KKworCUJUX0lORk8oImNmZ19zeiAlZCwgdG90YWwgc2l6ZSAlZCIsIGNmZ19zeiwgcmV0KTsKKwogCXJldCA9IHJ0bF9kb3dubG9hZF9maXJtd2FyZShoZGV2LCBmd19kYXRhLCByZXQpOwotCWtmcmVlKGZ3X2RhdGEpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKIAogb3V0OgogCXJlbGVhc2VfZmlybXdhcmUoZncpOworCWtmcmVlKGZ3X2RhdGEpOworZXJyX3JlcV9mdzoKKwlpZiAoY2ZnX3N6KQorCQlrZnJlZShjZmdfYnVmZik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzc3LDYgKzQ1Nyw5IEBACiAJY2FzZSBSVExfUk9NX0xNUF84NzYxQToKIAkJcmV0dXJuIGJ0cnRsX3NldHVwX3J0bDg3MjNiKGhkZXYsIGxtcF9zdWJ2ZXIsCiAJCQkJCSAgICAicnRsX2J0L3J0bDg3NjFhX2Z3LmJpbiIpOworCWNhc2UgUlRMX1JPTV9MTVBfODgyMkI6CisJCXJldHVybiBidHJ0bF9zZXR1cF9ydGw4NzIzYihoZGV2LCBsbXBfc3VidmVyLAorCQkJCQkgICAgInJ0bF9idC9ydGw4ODIyYl9mdy5iaW4iKTsKIAlkZWZhdWx0OgogCQlCVF9JTkZPKCJydGw6IGFzc3VtaW5nIG5vIGZpcm13YXJlIHVwbG9hZCBuZWVkZWQuIik7CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dXNiLmMKaW5kZXggODExZjliOS4uNmJkNjNiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5jCkBAIC02Miw2ICs2Miw3IEBACiAjZGVmaW5lIEJUVVNCX1JFQUxURUsJCTB4MjAwMDAKICNkZWZpbmUgQlRVU0JfQkNNMjA0NQkJMHg0MDAwMAogI2RlZmluZSBCVFVTQl9JRk5VTV8yCQkweDgwMDAwCisjZGVmaW5lIEJUVVNCX0NXNjYyMgkJMHgxMDAwMDAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIGJ0dXNiX3RhYmxlW10gPSB7CiAJLyogR2VuZXJpYyBCbHVldG9vdGggVVNCIGRldmljZSAqLwpAQCAtMjQ4LDkgKzI0OSwxMSBAQAogCiAJLyogUUNBIFJPTUUgY2hpcHNldCAqLwogCXsgVVNCX0RFVklDRSgweDBjZjMsIDB4ZTAwNyksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1FDQV9ST01FIH0sCisJeyBVU0JfREVWSUNFKDB4MGNmMywgMHhlMDA5KSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfUUNBX1JPTUUgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwY2YzLCAweGUzMDApLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9RQ0FfUk9NRSB9LAogCXsgVVNCX0RFVklDRSgweDBjZjMsIDB4ZTM2MCksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1FDQV9ST01FIH0sCiAJeyBVU0JfREVWSUNFKDB4MDQ4OSwgMHhlMDkyKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfUUNBX1JPTUUgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNGNhLCAweDMwMTEpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9RQ0FfUk9NRSB9LAogCiAJLyogQnJvYWRjb20gQkNNMjAzNSAqLwogCXsgVVNCX0RFVklDRSgweDBhNWMsIDB4MjAwOSksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX0JDTTkyMDM1IH0sCkBAIC0yOTAsNyArMjkzLDggQEAKIAl7IFVTQl9ERVZJQ0UoMHgwNDAwLCAweDA4MGEpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9CUk9LRU5fSVNPQyB9LAogCiAJLyogQ09OV0lTRSBUZWNobm9sb2d5IGJhc2VkIGFkYXB0ZXJzIHdpdGggYnVnZ3kgU0NPIHN1cHBvcnQgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwZTVlLCAweDY2MjIpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9CUk9LRU5fSVNPQyB9LAorCXsgVVNCX0RFVklDRSgweDBlNWUsIDB4NjYyMiksCisJICAuZHJpdmVyX2luZm8gPSBCVFVTQl9CUk9LRU5fSVNPQyB8IEJUVVNCX0NXNjYyMn0sCiAKIAkvKiBSb3BlciBDbGFzcyAxIEJsdWV0b290aCBEb25nbGUgKFNpbGljb24gV2F2ZSBiYXNlZCkgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMzEwLCAweDAwMDEpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9TV0FWRSB9LApAQCAtMjIyMSw5ICsyMjI1LDggQEAKIAllcnIgPSB3YWl0X29uX2JpdF90aW1lb3V0KCZkYXRhLT5mbGFncywgQlRVU0JfRE9XTkxPQURJTkcsCiAJCQkJICBUQVNLX0lOVEVSUlVQVElCTEUsCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKDUwMDApKTsKLQlpZiAoZXJyID09IDEpIHsKKwlpZiAoZXJyID09IC1FSU5UUikgewogCQlCVF9FUlIoIiVzOiBGaXJtd2FyZSBsb2FkaW5nIGludGVycnVwdGVkIiwgaGRldi0+bmFtZSk7Ci0JCWVyciA9IC1FSU5UUjsKIAkJZ290byBkb25lOwogCX0KIApAQCAtMjI3NSw3ICsyMjc4LDcgQEAKIAkJCQkgIFRBU0tfSU5URVJSVVBUSUJMRSwKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOwogCi0JaWYgKGVyciA9PSAxKSB7CisJaWYgKGVyciA9PSAtRUlOVFIpIHsKIAkJQlRfRVJSKCIlczogRGV2aWNlIGJvb3QgaW50ZXJydXB0ZWQiLCBoZGV2LT5uYW1lKTsKIAkJcmV0dXJuIC1FSU5UUjsKIAl9CkBAIC0yODQ1LDYgKzI4NDgsOSBAQAogCWhkZXYtPnNlbmQgICA9IGJ0dXNiX3NlbmRfZnJhbWU7CiAJaGRldi0+bm90aWZ5ID0gYnR1c2Jfbm90aWZ5OwogCisJaWYgKGlkLT5kcml2ZXJfaW5mbyAmIEJUVVNCX0NXNjYyMikKKwkJc2V0X2JpdChIQ0lfUVVJUktfQlJPS0VOX1NUT1JFRF9MSU5LX0tFWSwgJmhkZXYtPnF1aXJrcyk7CisKIAlpZiAoaWQtPmRyaXZlcl9pbmZvICYgQlRVU0JfQkNNMjA0NSkKIAkJc2V0X2JpdChIQ0lfUVVJUktfQlJPS0VOX1NUT1JFRF9MSU5LX0tFWSwgJmhkZXYtPnF1aXJrcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0d2lsaW5rLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idHdpbGluay5jCmluZGV4IDQ4NTI4MWIuLmVmNTFjOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0d2lsaW5rLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnR3aWxpbmsuYwpAQCAtMjQ1LDYgKzI0NSw3IEBACiB7CiAJc3RydWN0IHRpX3N0ICpoc3Q7CiAJbG9uZyBsZW47CisJaW50IHBrdF90eXBlOwogCiAJaHN0ID0gaGNpX2dldF9kcnZkYXRhKGhkZXYpOwogCkBAIC0yNTgsNiArMjU5LDcgQEAKIAkgKiBGcmVlaW5nIHNrYiBtZW1vcnkgaXMgdGFrZW4gY2FyZSBpbiBzaGFyZWQgdHJhbnNwb3J0IGxheWVyLAogCSAqIHNvIGRvbid0IGZyZWUgc2tiIG1lbW9yeSBoZXJlLgogCSAqLworCXBrdF90eXBlID0gaGNpX3NrYl9wa3RfdHlwZShza2IpOwogCWxlbiA9IGhzdC0+c3Rfd3JpdGUoc2tiKTsKIAlpZiAobGVuIDwgMCkgewogCQlrZnJlZV9za2Ioc2tiKTsKQEAgLTI2OCw3ICsyNzAsNyBAQAogCiAJLyogU1QgYWNjZXB0ZWQgb3VyIHNrYi4gU28sIEdvIGFoZWFkIGFuZCBkbyByZXN0ICovCiAJaGRldi0+c3RhdC5ieXRlX3R4ICs9IGxlbjsKLQl0aV9zdF90eF9jb21wbGV0ZShoc3QsIGhjaV9za2JfcGt0X3R5cGUoc2tiKSk7CisJdGlfc3RfdHhfY29tcGxldGUoaHN0LCBwa3RfdHlwZSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9iY20uYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9iY20uYwppbmRleCAxYzk3ZWRhLi41Y2NiOTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNtLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2JjbS5jCkBAIC03OTgsNyArNzk4LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoY2lfdWFydF9wcm90byBiY21fcHJvdG8gPSB7CiAJLmlkCQk9IEhDSV9VQVJUX0JDTSwKLQkubmFtZQkJPSAiQkNNIiwKKwkubmFtZQkJPSAiQnJvYWRjb20iLAogCS5tYW51ZmFjdHVyZXIJPSAxNSwKIAkuaW5pdF9zcGVlZAk9IDExNTIwMCwKIAkub3Blcl9zcGVlZAk9IDQwMDAwMDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNzcC5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2Jjc3AuYwppbmRleCBkN2QyM2NlLi5hMmM5MjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNzcC5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9iY3NwLmMKQEAgLTkwLDcgKzkwLDggQEAKIC8qIC0tLS0gQkNTUCBDUkMgY2FsY3VsYXRpb24gLS0tLSAqLwogCiAvKiBUYWJsZSBmb3IgY2FsY3VsYXRpbmcgQ1JDIGZvciBwb2x5bm9taWFsIDB4MTAyMSwgTFNCIHByb2Nlc3NlZCBmaXJzdCwKLWluaXRpYWwgdmFsdWUgMHhmZmZmLCBiaXRzIHNoaWZ0ZWQgaW4gcmV2ZXJzZSBvcmRlci4gKi8KKyAqIGluaXRpYWwgdmFsdWUgMHhmZmZmLCBiaXRzIHNoaWZ0ZWQgaW4gcmV2ZXJzZSBvcmRlci4KKyAqLwogCiBzdGF0aWMgY29uc3QgdTE2IGNyY190YWJsZVtdID0gewogCTB4MDAwMCwgMHgxMDgxLCAweDIxMDIsIDB4MzE4MywKQEAgLTE3NCw3ICsxNzUsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmJjc3BfcHJlcGFyZV9wa3Qoc3RydWN0IGJjc3Bfc3RydWN0ICpiY3NwLCB1OCAqZGF0YSwKLQkJaW50IGxlbiwgaW50IHBrdF90eXBlKQorCQkJCQlpbnQgbGVuLCBpbnQgcGt0X3R5cGUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKm5za2I7CiAJdTggaGRyWzRdLCBjaGFuOwpAQCAtMjEzLDYgKzIxNCw3IEBACiAJCS8qIFZlbmRvciBzcGVjaWZpYyBjb21tYW5kcyAqLwogCQlpZiAoaGNpX29wY29kZV9vZ2YoX19sZTE2X3RvX2NwdShvcGNvZGUpKSA9PSAweDNmKSB7CiAJCQl1OCBkZXNjID0gKihkYXRhICsgSENJX0NPTU1BTkRfSERSX1NJWkUpOworCiAJCQlpZiAoKGRlc2MgJiAweGYwKSA9PSAweGMwKSB7CiAJCQkJZGF0YSArPSBIQ0lfQ09NTUFORF9IRFJfU0laRSArIDE7CiAJCQkJbGVuICAtPSBIQ0lfQ09NTUFORF9IRFJfU0laRSArIDE7CkBAIC0yNzEsOCArMjczLDggQEAKIAkvKiBQdXQgQ1JDICovCiAJaWYgKGJjc3AtPnVzZV9jcmMpIHsKIAkJYmNzcF90eG1zZ19jcmMgPSBiaXRyZXYxNihiY3NwX3R4bXNnX2NyYyk7Ci0JCWJjc3Bfc2xpcF9vbmVfYnl0ZShuc2tiLCAodTgpICgoYmNzcF90eG1zZ19jcmMgPj4gOCkgJiAweDAwZmYpKTsKLQkJYmNzcF9zbGlwX29uZV9ieXRlKG5za2IsICh1OCkgKGJjc3BfdHhtc2dfY3JjICYgMHgwMGZmKSk7CisJCWJjc3Bfc2xpcF9vbmVfYnl0ZShuc2tiLCAodTgpKChiY3NwX3R4bXNnX2NyYyA+PiA4KSAmIDB4MDBmZikpOworCQliY3NwX3NsaXBfb25lX2J5dGUobnNrYiwgKHU4KShiY3NwX3R4bXNnX2NyYyAmIDB4MDBmZikpOwogCX0KIAogCWJjc3Bfc2xpcF9tc2dkZWxpbShuc2tiKTsKQEAgLTI4Nyw3ICsyODksOCBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAkvKiBGaXJzdCBvZiBhbGwsIGNoZWNrIGZvciB1bnJlbGlhYmxlIG1lc3NhZ2VzIGluIHRoZSBxdWV1ZSwKLQkgICBzaW5jZSB0aGV5IGhhdmUgcHJpb3JpdHkgKi8KKwkgKiBzaW5jZSB0aGV5IGhhdmUgcHJpb3JpdHkKKwkgKi8KIAogCXNrYiA9IHNrYl9kZXF1ZXVlKCZiY3NwLT51bnJlbCk7CiAJaWYgKHNrYiAhPSBOVUxMKSB7CkBAIC00MTQsNyArNDE3LDcgQEAKIAogCS8qIHNwb3QgImNvbmYiIHBrdHMgYW5kIHJlcGx5IHdpdGggYSAiY29uZiByc3AiIHBrdCAqLwogCWlmIChiY3NwLT5yeF9za2ItPmRhdGFbMV0gPj4gNCA9PSA0ICYmIGJjc3AtPnJ4X3NrYi0+ZGF0YVsyXSA9PSAwICYmCi0JCQkhbWVtY21wKCZiY3NwLT5yeF9za2ItPmRhdGFbNF0sIGNvbmZfcGt0LCA0KSkgeworCSAgICAhbWVtY21wKCZiY3NwLT5yeF9za2ItPmRhdGFbNF0sIGNvbmZfcGt0LCA0KSkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiA9IGFsbG9jX3NrYig0LCBHRlBfQVRPTUlDKTsKIAogCQlCVF9EQkcoIkZvdW5kIGEgTEUgY29uZiBwa3QiKTsKQEAgLTQyOCw3ICs0MzEsNyBAQAogCX0KIAkvKiBTcG90ICJzeW5jIiBwa3RzLiBJZiB3ZSBmaW5kIG9uZS4uLmRpc2FzdGVyISAqLwogCWVsc2UgaWYgKGJjc3AtPnJ4X3NrYi0+ZGF0YVsxXSA+PiA0ID09IDQgJiYgYmNzcC0+cnhfc2tiLT5kYXRhWzJdID09IDAgJiYKLQkJCSFtZW1jbXAoJmJjc3AtPnJ4X3NrYi0+ZGF0YVs0XSwgc3luY19wa3QsIDQpKSB7CisJCSAhbWVtY21wKCZiY3NwLT5yeF9za2ItPmRhdGFbNF0sIHN5bmNfcGt0LCA0KSkgewogCQlCVF9FUlIoIkZvdW5kIGEgTEUgc3luYyBwa3QsIGNhcmQgaGFzIHJlc2V0Iik7CiAJfQogfQpAQCAtNDQ2LDcgKzQ0OSw3IEBACiAJCWRlZmF1bHQ6CiAJCQltZW1jcHkoc2tiX3B1dChiY3NwLT5yeF9za2IsIDEpLCAmYnl0ZSwgMSk7CiAJCQlpZiAoKGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSAmIDB4NDApICE9IDAgJiYKLQkJCQkJYmNzcC0+cnhfc3RhdGUgIT0gQkNTUF9XNF9DUkMpCisJCQkgICAgYmNzcC0+cnhfc3RhdGUgIT0gQkNTUF9XNF9DUkMpCiAJCQkJYmNzcF9jcmNfdXBkYXRlKCZiY3NwLT5tZXNzYWdlX2NyYywgYnl0ZSk7CiAJCQliY3NwLT5yeF9jb3VudC0tOwogCQl9CkBAIC00NTcsNyArNDYwLDcgQEAKIAkJY2FzZSAweGRjOgogCQkJbWVtY3B5KHNrYl9wdXQoYmNzcC0+cnhfc2tiLCAxKSwgJmMwLCAxKTsKIAkJCWlmICgoYmNzcC0+cnhfc2tiLT5kYXRhWzBdICYgMHg0MCkgIT0gMCAmJgotCQkJCQliY3NwLT5yeF9zdGF0ZSAhPSBCQ1NQX1c0X0NSQykKKwkJCSAgICBiY3NwLT5yeF9zdGF0ZSAhPSBCQ1NQX1c0X0NSQykKIAkJCQliY3NwX2NyY191cGRhdGUoJmJjc3AtPm1lc3NhZ2VfY3JjLCAweGMwKTsKIAkJCWJjc3AtPnJ4X2VzY19zdGF0ZSA9IEJDU1BfRVNDU1RBVEVfTk9FU0M7CiAJCQliY3NwLT5yeF9jb3VudC0tOwpAQCAtNDY2LDcgKzQ2OSw3IEBACiAJCWNhc2UgMHhkZDoKIAkJCW1lbWNweShza2JfcHV0KGJjc3AtPnJ4X3NrYiwgMSksICZkYiwgMSk7CiAJCQlpZiAoKGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSAmIDB4NDApICE9IDAgJiYKLQkJCQkJYmNzcC0+cnhfc3RhdGUgIT0gQkNTUF9XNF9DUkMpCisJCQkgICAgYmNzcC0+cnhfc3RhdGUgIT0gQkNTUF9XNF9DUkMpCiAJCQkJYmNzcF9jcmNfdXBkYXRlKCZiY3NwLT5tZXNzYWdlX2NyYywgMHhkYik7CiAJCQliY3NwLT5yeF9lc2Nfc3RhdGUgPSBCQ1NQX0VTQ1NUQVRFX05PRVNDOwogCQkJYmNzcC0+cnhfY291bnQtLTsKQEAgLTQ4NSwxMyArNDg4LDI4IEBACiBzdGF0aWMgdm9pZCBiY3NwX2NvbXBsZXRlX3J4X3BrdChzdHJ1Y3QgaGNpX3VhcnQgKmh1KQogewogCXN0cnVjdCBiY3NwX3N0cnVjdCAqYmNzcCA9IGh1LT5wcml2OwotCWludCBwYXNzX3VwOworCWludCBwYXNzX3VwID0gMDsKIAogCWlmIChiY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDgwKSB7CS8qIHJlbGlhYmxlIHBrdCAqLwogCQlCVF9EQkcoIlJlY2VpdmVkIHNlcW5vICV1IGZyb20gY2FyZCIsIGJjc3AtPnJ4c2VxX3R4YWNrKTsKLQkJYmNzcC0+cnhzZXFfdHhhY2srKzsKLQkJYmNzcC0+cnhzZXFfdHhhY2sgJT0gMHg4OwotCQliY3NwLT50eGFja19yZXEgICAgPSAxOworCisJCS8qIGNoZWNrIHRoZSByeCBzZXF1ZW5jZSBudW1iZXIgaXMgYXMgZXhwZWN0ZWQgKi8KKwkJaWYgKChiY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDA3KSA9PSBiY3NwLT5yeHNlcV90eGFjaykgeworCQkJYmNzcC0+cnhzZXFfdHhhY2srKzsKKwkJCWJjc3AtPnJ4c2VxX3R4YWNrICU9IDB4ODsKKwkJfSBlbHNlIHsKKwkJCS8qIGhhbmRsZSByZS10cmFuc21pdHRlZCBwYWNrZXQgb3IKKwkJCSAqIHdoZW4gcGFja2V0IHdhcyBtaXNzZWQKKwkJCSAqLworCQkJQlRfRVJSKCJPdXQtb2Ytb3JkZXIgcGFja2V0IGFycml2ZWQsIGdvdCAldSBleHBlY3RlZCAldSIsCisJCQkgICAgICAgYmNzcC0+cnhfc2tiLT5kYXRhWzBdICYgMHgwNywgYmNzcC0+cnhzZXFfdHhhY2spOworCisJCQkvKiBkbyBub3QgcHJvY2VzcyBvdXQtb2Ytb3JkZXIgcGFja2V0IHBheWxvYWQgKi8KKwkJCXBhc3NfdXAgPSAyOworCQl9CisKKwkJLyogc2VuZCBjdXJyZW50IHR4YWNrIHZhbHVlIHRvIGFsbCByZWNlaXZlZCByZWxpYWJsZSBwYWNrZXRzICovCisJCWJjc3AtPnR4YWNrX3JlcSA9IDE7CiAKIAkJLyogSWYgbmVlZGVkLCB0cmFuc21pdCBhbiBhY2sgcGt0ICovCiAJCWhjaV91YXJ0X3R4X3dha2V1cChodSk7CkBAIC01MDAsMjYgKzUxOCwzMyBAQAogCWJjc3AtPnJ4YWNrID0gKGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSA+PiAzKSAmIDB4MDc7CiAJQlRfREJHKCJSZXF1ZXN0IGZvciBwa3QgJXUgZnJvbSBjYXJkIiwgYmNzcC0+cnhhY2spOwogCisJLyogaGFuZGxlIHJlY2VpdmVkIEFDSyBpbmRpY2F0aW9ucywKKwkgKiBpbmNsdWRpbmcgdGhvc2UgZnJvbSBvdXQtb2Ytb3JkZXIgcGFja2V0cworCSAqLwogCWJjc3BfcGt0X2N1bGwoYmNzcCk7Ci0JaWYgKChiY3NwLT5yeF9za2ItPmRhdGFbMV0gJiAweDBmKSA9PSA2ICYmCi0JCQliY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDgwKSB7Ci0JCWhjaV9za2JfcGt0X3R5cGUoYmNzcC0+cnhfc2tiKSA9IEhDSV9BQ0xEQVRBX1BLVDsKLQkJcGFzc191cCA9IDE7Ci0JfSBlbHNlIGlmICgoYmNzcC0+cnhfc2tiLT5kYXRhWzFdICYgMHgwZikgPT0gNSAmJgotCQkJYmNzcC0+cnhfc2tiLT5kYXRhWzBdICYgMHg4MCkgewotCQloY2lfc2tiX3BrdF90eXBlKGJjc3AtPnJ4X3NrYikgPSBIQ0lfRVZFTlRfUEtUOwotCQlwYXNzX3VwID0gMTsKLQl9IGVsc2UgaWYgKChiY3NwLT5yeF9za2ItPmRhdGFbMV0gJiAweDBmKSA9PSA3KSB7Ci0JCWhjaV9za2JfcGt0X3R5cGUoYmNzcC0+cnhfc2tiKSA9IEhDSV9TQ09EQVRBX1BLVDsKLQkJcGFzc191cCA9IDE7Ci0JfSBlbHNlIGlmICgoYmNzcC0+cnhfc2tiLT5kYXRhWzFdICYgMHgwZikgPT0gMSAmJgotCQkJIShiY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDgwKSkgewotCQliY3NwX2hhbmRsZV9sZV9wa3QoaHUpOwotCQlwYXNzX3VwID0gMDsKLQl9IGVsc2UKLQkJcGFzc191cCA9IDA7CiAKLQlpZiAoIXBhc3NfdXApIHsKKwlpZiAocGFzc191cCAhPSAyKSB7CisJCWlmICgoYmNzcC0+cnhfc2tiLT5kYXRhWzFdICYgMHgwZikgPT0gNiAmJgorCQkgICAgKGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSAmIDB4ODApKSB7CisJCQloY2lfc2tiX3BrdF90eXBlKGJjc3AtPnJ4X3NrYikgPSBIQ0lfQUNMREFUQV9QS1Q7CisJCQlwYXNzX3VwID0gMTsKKwkJfSBlbHNlIGlmICgoYmNzcC0+cnhfc2tiLT5kYXRhWzFdICYgMHgwZikgPT0gNSAmJgorCQkJICAgKGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSAmIDB4ODApKSB7CisJCQloY2lfc2tiX3BrdF90eXBlKGJjc3AtPnJ4X3NrYikgPSBIQ0lfRVZFTlRfUEtUOworCQkJcGFzc191cCA9IDE7CisJCX0gZWxzZSBpZiAoKGJjc3AtPnJ4X3NrYi0+ZGF0YVsxXSAmIDB4MGYpID09IDcpIHsKKwkJCWhjaV9za2JfcGt0X3R5cGUoYmNzcC0+cnhfc2tiKSA9IEhDSV9TQ09EQVRBX1BLVDsKKwkJCXBhc3NfdXAgPSAxOworCQl9IGVsc2UgaWYgKChiY3NwLT5yeF9za2ItPmRhdGFbMV0gJiAweDBmKSA9PSAxICYmCisJCQkgICAhKGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSAmIDB4ODApKSB7CisJCQliY3NwX2hhbmRsZV9sZV9wa3QoaHUpOworCQkJcGFzc191cCA9IDA7CisJCX0gZWxzZSB7CisJCQlwYXNzX3VwID0gMDsKKwkJfQorCX0KKworCWlmIChwYXNzX3VwID09IDApIHsKIAkJc3RydWN0IGhjaV9ldmVudF9oZHIgaGRyOwogCQl1OCBkZXNjID0gKGJjc3AtPnJ4X3NrYi0+ZGF0YVsxXSAmIDB4MGYpOwogCkBAIC01MzcsMTggKzU2MiwyMyBAQAogCQkJCWhjaV9yZWN2X2ZyYW1lKGh1LT5oZGV2LCBiY3NwLT5yeF9za2IpOwogCQkJfSBlbHNlIHsKIAkJCQlCVF9FUlIoIlBhY2tldCBmb3IgdW5rbm93biBjaGFubmVsICgldSAlcykiLAotCQkJCQliY3NwLT5yeF9za2ItPmRhdGFbMV0gJiAweDBmLAotCQkJCQliY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDgwID8KLQkJCQkJInJlbGlhYmxlIiA6ICJ1bnJlbGlhYmxlIik7CisJCQkJICAgICAgIGJjc3AtPnJ4X3NrYi0+ZGF0YVsxXSAmIDB4MGYsCisJCQkJICAgICAgIGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSAmIDB4ODAgPworCQkJCSAgICAgICAicmVsaWFibGUiIDogInVucmVsaWFibGUiKTsKIAkJCQlrZnJlZV9za2IoYmNzcC0+cnhfc2tiKTsKIAkJCX0KIAkJfSBlbHNlCiAJCQlrZnJlZV9za2IoYmNzcC0+cnhfc2tiKTsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAocGFzc191cCA9PSAxKSB7CiAJCS8qIFB1bGwgb3V0IEJDU1AgaGRyICovCiAJCXNrYl9wdWxsKGJjc3AtPnJ4X3NrYiwgNCk7CiAKIAkJaGNpX3JlY3ZfZnJhbWUoaHUtPmhkZXYsIGJjc3AtPnJ4X3NrYik7CisJfSBlbHNlIHsKKwkJLyogaWdub3JlIHBhY2tldCBwYXlsb2FkIG9mIGFscmVhZHkgQUNLZWQgcmUtdHJhbnNtaXR0ZWQKKwkJICogcGFja2V0cyBvciB3aGVuIGEgcGFja2V0IHdhcyBtaXNzZWQgaW4gdGhlIEJDU1Agd2luZG93CisJCSAqLworCQlrZnJlZV9za2IoYmNzcC0+cnhfc2tiKTsKIAl9CiAKIAliY3NwLT5yeF9zdGF0ZSA9IEJDU1BfVzRfUEtUX0RFTElNSVRFUjsKQEAgLTU2Nyw3ICs1OTcsNyBAQAogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0cjsKIAogCUJUX0RCRygiaHUgJXAgY291bnQgJWQgcnhfc3RhdGUgJWQgcnhfY291bnQgJWxkIiwKLQkJaHUsIGNvdW50LCBiY3NwLT5yeF9zdGF0ZSwgYmNzcC0+cnhfY291bnQpOworCSAgICAgICBodSwgY291bnQsIGJjc3AtPnJ4X3N0YXRlLCBiY3NwLT5yeF9jb3VudCk7CiAKIAlwdHIgPSBkYXRhOwogCXdoaWxlIChjb3VudCkgewpAQCAtNTg2LDI0ICs2MTYsMTQgQEAKIAogCQlzd2l0Y2ggKGJjc3AtPnJ4X3N0YXRlKSB7CiAJCWNhc2UgQkNTUF9XNF9CQ1NQX0hEUjoKLQkJCWlmICgoMHhmZiAmICh1OCkgfiAoYmNzcC0+cnhfc2tiLT5kYXRhWzBdICsgYmNzcC0+cnhfc2tiLT5kYXRhWzFdICsKLQkJCQkJYmNzcC0+cnhfc2tiLT5kYXRhWzJdKSkgIT0gYmNzcC0+cnhfc2tiLT5kYXRhWzNdKSB7CisJCQlpZiAoKDB4ZmYgJiAodTgpfihiY3NwLT5yeF9za2ItPmRhdGFbMF0gKyBiY3NwLT5yeF9za2ItPmRhdGFbMV0gKworCQkJICAgIGJjc3AtPnJ4X3NrYi0+ZGF0YVsyXSkpICE9IGJjc3AtPnJ4X3NrYi0+ZGF0YVszXSkgewogCQkJCUJUX0VSUigiRXJyb3IgaW4gQkNTUCBoZHIgY2hlY2tzdW0iKTsKIAkJCQlrZnJlZV9za2IoYmNzcC0+cnhfc2tiKTsKIAkJCQliY3NwLT5yeF9zdGF0ZSA9IEJDU1BfVzRfUEtUX0RFTElNSVRFUjsKIAkJCQliY3NwLT5yeF9jb3VudCA9IDA7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlpZiAoYmNzcC0+cnhfc2tiLT5kYXRhWzBdICYgMHg4MAkvKiByZWxpYWJsZSBwa3QgKi8KLQkJCQkJCSYmIChiY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDA3KSAhPSBiY3NwLT5yeHNlcV90eGFjaykgewotCQkJCUJUX0VSUigiT3V0LW9mLW9yZGVyIHBhY2tldCBhcnJpdmVkLCBnb3QgJXUgZXhwZWN0ZWQgJXUiLAotCQkJCQliY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDA3LCBiY3NwLT5yeHNlcV90eGFjayk7Ci0KLQkJCQlrZnJlZV9za2IoYmNzcC0+cnhfc2tiKTsKLQkJCQliY3NwLT5yeF9zdGF0ZSA9IEJDU1BfVzRfUEtUX0RFTElNSVRFUjsKLQkJCQliY3NwLT5yeF9jb3VudCA9IDA7Ci0JCQkJY29udGludWU7Ci0JCQl9CiAJCQliY3NwLT5yeF9zdGF0ZSA9IEJDU1BfVzRfREFUQTsKIAkJCWJjc3AtPnJ4X2NvdW50ID0gKGJjc3AtPnJ4X3NrYi0+ZGF0YVsxXSA+PiA0KSArCiAJCQkJCShiY3NwLT5yeF9za2ItPmRhdGFbMl0gPDwgNCk7CS8qIE1heSBiZSAwICovCkBAIC02MjAsOCArNjQwLDggQEAKIAkJY2FzZSBCQ1NQX1c0X0NSQzoKIAkJCWlmIChiaXRyZXYxNihiY3NwLT5tZXNzYWdlX2NyYykgIT0gYnNjcF9nZXRfY3JjKGJjc3ApKSB7CiAJCQkJQlRfRVJSKCJDaGVja3N1bSBmYWlsZWQ6IGNvbXB1dGVkICUwNHggcmVjZWl2ZWQgJTA0eCIsCi0JCQkJCWJpdHJldjE2KGJjc3AtPm1lc3NhZ2VfY3JjKSwKLQkJCQkJYnNjcF9nZXRfY3JjKGJjc3ApKTsKKwkJCQkgICAgICAgYml0cmV2MTYoYmNzcC0+bWVzc2FnZV9jcmMpLAorCQkJCSAgICAgICBic2NwX2dldF9jcmMoYmNzcCkpOwogCiAJCQkJa2ZyZWVfc2tiKGJjc3AtPnJ4X3NrYik7CiAJCQkJYmNzcC0+cnhfc3RhdGUgPSBCQ1NQX1c0X1BLVF9ERUxJTUlURVI7CkBAIC02NzksNyArNjk5LDcgQEAKIAkvKiBBcnJhbmdlIHRvIHJldHJhbnNtaXQgYWxsIG1lc3NhZ2VzIGluIHRoZSByZWxxLiAqLwogc3RhdGljIHZvaWQgYmNzcF90aW1lZF9ldmVudCh1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgaGNpX3VhcnQgKmh1ID0gKHN0cnVjdCBoY2lfdWFydCAqKSBhcmc7CisJc3RydWN0IGhjaV91YXJ0ICpodSA9IChzdHJ1Y3QgaGNpX3VhcnQgKilhcmc7CiAJc3RydWN0IGJjc3Bfc3RydWN0ICpiY3NwID0gaHUtPnByaXY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNzE1LDcgKzczNSw3IEBACiAKIAlpbml0X3RpbWVyKCZiY3NwLT50YmNzcCk7CiAJYmNzcC0+dGJjc3AuZnVuY3Rpb24gPSBiY3NwX3RpbWVkX2V2ZW50OwotCWJjc3AtPnRiY3NwLmRhdGEgICAgID0gKHVfbG9uZykgaHU7CisJYmNzcC0+dGJjc3AuZGF0YSAgICAgPSAodV9sb25nKWh1OwogCiAJYmNzcC0+cnhfc3RhdGUgPSBCQ1NQX1c0X1BLVF9ERUxJTUlURVI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9pbnRlbC5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2ludGVsLmMKaW5kZXggZWQwYTQyMC4uOWUyNzEyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2ludGVsLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2ludGVsLmMKQEAgLTEyOCw3ICsxMjgsNyBAQAogCQkJCSAgVEFTS19JTlRFUlJVUFRJQkxFLAogCQkJCSAgbXNlY3NfdG9famlmZmllcygxMDAwKSk7CiAKLQlpZiAoZXJyID09IDEpIHsKKwlpZiAoZXJyID09IC1FSU5UUikgewogCQlidF9kZXZfZXJyKGh1LT5oZGV2LCAiRGV2aWNlIGJvb3QgaW50ZXJydXB0ZWQiKTsKIAkJcmV0dXJuIC1FSU5UUjsKIAl9CkBAIC0xNTEsNyArMTUxLDcgQEAKIAkJCQkgIFRBU0tfSU5URVJSVVBUSUJMRSwKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOwogCi0JaWYgKGVyciA9PSAxKSB7CisJaWYgKGVyciA9PSAtRUlOVFIpIHsKIAkJYnRfZGV2X2VycihodS0+aGRldiwgIkxQTSB0cmFuc2FjdGlvbiBpbnRlcnJ1cHRlZCIpOwogCQlyZXR1cm4gLUVJTlRSOwogCX0KQEAgLTgxMyw3ICs4MTMsNyBAQAogCWVyciA9IHdhaXRfb25fYml0X3RpbWVvdXQoJmludGVsLT5mbGFncywgU1RBVEVfRE9XTkxPQURJTkcsCiAJCQkJICBUQVNLX0lOVEVSUlVQVElCTEUsCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKDUwMDApKTsKLQlpZiAoZXJyID09IDEpIHsKKwlpZiAoZXJyID09IC1FSU5UUikgewogCQlidF9kZXZfZXJyKGhkZXYsICJGaXJtd2FyZSBsb2FkaW5nIGludGVycnVwdGVkIik7CiAJCWVyciA9IC1FSU5UUjsKIAkJZ290byBkb25lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfbGRpc2MuYwppbmRleCBkZGE5NzM5Li45NDk3YzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfbGRpc2MuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfbGRpc2MuYwpAQCAtNjk3LDM0ICs2OTcsMzYgQEAKIAljYXNlIEhDSVVBUlRTRVRQUk9UTzoKIAkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEhDSV9VQVJUX1BST1RPX1NFVCwgJmh1LT5mbGFncykpIHsKIAkJCWVyciA9IGhjaV91YXJ0X3NldF9wcm90byhodSwgYXJnKTsKLQkJCWlmIChlcnIpIHsKKwkJCWlmIChlcnIpCiAJCQkJY2xlYXJfYml0KEhDSV9VQVJUX1BST1RPX1NFVCwgJmh1LT5mbGFncyk7Ci0JCQkJcmV0dXJuIGVycjsKLQkJCX0KIAkJfSBlbHNlCi0JCQlyZXR1cm4gLUVCVVNZOworCQkJZXJyID0gLUVCVVNZOwogCQlicmVhazsKIAogCWNhc2UgSENJVUFSVEdFVFBST1RPOgogCQlpZiAodGVzdF9iaXQoSENJX1VBUlRfUFJPVE9fU0VULCAmaHUtPmZsYWdzKSkKLQkJCXJldHVybiBodS0+cHJvdG8tPmlkOwotCQlyZXR1cm4gLUVVTkFUQ0g7CisJCQllcnIgPSBodS0+cHJvdG8tPmlkOworCQllbHNlCisJCQllcnIgPSAtRVVOQVRDSDsKKwkJYnJlYWs7CiAKIAljYXNlIEhDSVVBUlRHRVRERVZJQ0U6CiAJCWlmICh0ZXN0X2JpdChIQ0lfVUFSVF9SRUdJU1RFUkVELCAmaHUtPmZsYWdzKSkKLQkJCXJldHVybiBodS0+aGRldi0+aWQ7Ci0JCXJldHVybiAtRVVOQVRDSDsKKwkJCWVyciA9IGh1LT5oZGV2LT5pZDsKKwkJZWxzZQorCQkJZXJyID0gLUVVTkFUQ0g7CisJCWJyZWFrOwogCiAJY2FzZSBIQ0lVQVJUU0VURkxBR1M6CiAJCWlmICh0ZXN0X2JpdChIQ0lfVUFSVF9QUk9UT19TRVQsICZodS0+ZmxhZ3MpKQotCQkJcmV0dXJuIC1FQlVTWTsKLQkJZXJyID0gaGNpX3VhcnRfc2V0X2ZsYWdzKGh1LCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKKwkJCWVyciA9IC1FQlVTWTsKKwkJZWxzZQorCQkJZXJyID0gaGNpX3VhcnRfc2V0X2ZsYWdzKGh1LCBhcmcpOwogCQlicmVhazsKIAogCWNhc2UgSENJVUFSVEdFVEZMQUdTOgotCQlyZXR1cm4gaHUtPmhkZXZfZmxhZ3M7CisJCWVyciA9IGh1LT5oZGV2X2ZsYWdzOworCQlicmVhazsKIAogCWRlZmF1bHQ6CiAJCWVyciA9IG5fdHR5X2lvY3RsX2hlbHBlcih0dHksIGZpbGUsIGNtZCwgYXJnKTsKQEAgLTgxMCw2ICs4MTIsOSBAQAogI2lmZGVmIENPTkZJR19CVF9IQ0lVQVJUX0FHNlhYCiAJYWc2eHhfaW5pdCgpOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX0JUX0hDSVVBUlRfTVJWTAorCW1ydmxfaW5pdCgpOworI2VuZGlmCiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg0NSw2ICs4NTAsOSBAQAogI2lmZGVmIENPTkZJR19CVF9IQ0lVQVJUX0FHNlhYCiAJYWc2eHhfZGVpbml0KCk7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQlRfSENJVUFSVF9NUlZMCisJbXJ2bF9kZWluaXQoKTsKKyNlbmRpZgogCiAJLyogUmVsZWFzZSB0dHkgcmVnaXN0cmF0aW9uIG9mIGxpbmUgZGlzY2lwbGluZSAqLwogCWVyciA9IHR0eV91bnJlZ2lzdGVyX2xkaXNjKE5fSENJKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9tcnZsLmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfbXJ2bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYzRiMzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfbXJ2bC5jCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICoKKyAqICBCbHVldG9vdGggSENJIFVBUlQgZHJpdmVyIGZvciBtYXJ2ZWxsIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDE2ICBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorICogIENvcHlyaWdodCAoQykgMjAxNiAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgorCisjaW5jbHVkZSAiaGNpX3VhcnQuaCIKKworI2RlZmluZSBIQ0lfRldfUkVRX1BLVCAweEE1CisjZGVmaW5lIEhDSV9DSElQX1ZFUl9QS1QgMHhBQQorCisjZGVmaW5lIE1SVkxfQUNLIDB4NUEKKyNkZWZpbmUgTVJWTF9OQUsgMHhCRgorI2RlZmluZSBNUlZMX1JBV19EQVRBIDB4MUYKKworZW51bSB7CisJU1RBVEVfQ0hJUF9WRVJfUEVORElORywKKwlTVEFURV9GV19SRVFfUEVORElORywKK307CisKK3N0cnVjdCBtcnZsX2RhdGEgeworCXN0cnVjdCBza19idWZmICpyeF9za2I7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCB0eHE7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCByYXdxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHR4X2xlbjsKKwl1OCBpZCwgcmV2OworfTsKKworc3RydWN0IGhjaV9tcnZsX3BrdCB7CisJX19sZTE2IGxoczsKKwlfX2xlMTYgcmhzOworfSBfX3BhY2tlZDsKKyNkZWZpbmUgSENJX01SVkxfUEtUX1NJWkUgNAorCitzdGF0aWMgaW50IG1ydmxfb3BlbihzdHJ1Y3QgaGNpX3VhcnQgKmh1KQoreworCXN0cnVjdCBtcnZsX2RhdGEgKm1ydmw7CisKKwlCVF9EQkcoImh1ICVwIiwgaHUpOworCisJbXJ2bCA9IGt6YWxsb2Moc2l6ZW9mKCptcnZsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtcnZsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm1ydmwtPnR4cSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbXJ2bC0+cmF3cSk7CisKKwlzZXRfYml0KFNUQVRFX0NISVBfVkVSX1BFTkRJTkcsICZtcnZsLT5mbGFncyk7CisKKwlodS0+cHJpdiA9IG1ydmw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXJ2bF9jbG9zZShzdHJ1Y3QgaGNpX3VhcnQgKmh1KQoreworCXN0cnVjdCBtcnZsX2RhdGEgKm1ydmwgPSBodS0+cHJpdjsKKworCUJUX0RCRygiaHUgJXAiLCBodSk7CisKKwlza2JfcXVldWVfcHVyZ2UoJm1ydmwtPnR4cSk7CisJc2tiX3F1ZXVlX3B1cmdlKCZtcnZsLT5yYXdxKTsKKwlrZnJlZV9za2IobXJ2bC0+cnhfc2tiKTsKKwlrZnJlZShtcnZsKTsKKworCWh1LT5wcml2ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcnZsX2ZsdXNoKHN0cnVjdCBoY2lfdWFydCAqaHUpCit7CisJc3RydWN0IG1ydmxfZGF0YSAqbXJ2bCA9IGh1LT5wcml2OworCisJQlRfREJHKCJodSAlcCIsIGh1KTsKKworCXNrYl9xdWV1ZV9wdXJnZSgmbXJ2bC0+dHhxKTsKKwlza2JfcXVldWVfcHVyZ2UoJm1ydmwtPnJhd3EpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbXJ2bF9kZXF1ZXVlKHN0cnVjdCBoY2lfdWFydCAqaHUpCit7CisJc3RydWN0IG1ydmxfZGF0YSAqbXJ2bCA9IGh1LT5wcml2OworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBza2JfZGVxdWV1ZSgmbXJ2bC0+dHhxKTsKKwlpZiAoIXNrYikgeworCQkvKiBBbnkgcmF3IGRhdGEgPyAqLworCQlza2IgPSBza2JfZGVxdWV1ZSgmbXJ2bC0+cmF3cSk7CisJfSBlbHNlIHsKKwkJLyogUHJlcGVuZCBza2Igd2l0aCBmcmFtZSB0eXBlICovCisJCW1lbWNweShza2JfcHVzaChza2IsIDEpLCAmYnRfY2Ioc2tiKS0+cGt0X3R5cGUsIDEpOworCX0KKworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbnQgbXJ2bF9lbnF1ZXVlKHN0cnVjdCBoY2lfdWFydCAqaHUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG1ydmxfZGF0YSAqbXJ2bCA9IGh1LT5wcml2OworCisJc2tiX3F1ZXVlX3RhaWwoJm1ydmwtPnR4cSwgc2tiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXJ2bF9zZW5kX2FjayhzdHJ1Y3QgaGNpX3VhcnQgKmh1LCB1bnNpZ25lZCBjaGFyIHR5cGUpCit7CisJc3RydWN0IG1ydmxfZGF0YSAqbXJ2bCA9IGh1LT5wcml2OworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKiBObyBINCBwYXlsb2FkLCBvbmx5IDEgYnl0ZSBoZWFkZXIgKi8KKwlza2IgPSBidF9za2JfYWxsb2MoMCwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpIHsKKwkJYnRfZGV2X2VycihodS0+aGRldiwgIlVuYWJsZSB0byBhbGxvYyBhY2svbmFrIHBhY2tldCIpOworCQlyZXR1cm47CisJfQorCWhjaV9za2JfcGt0X3R5cGUoc2tiKSA9IHR5cGU7CisKKwlza2JfcXVldWVfdGFpbCgmbXJ2bC0+dHhxLCBza2IpOworCWhjaV91YXJ0X3R4X3dha2V1cChodSk7Cit9CisKK3N0YXRpYyBpbnQgbXJ2bF9yZWN2X2Z3X3JlcShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX21ydmxfcGt0ICpwa3QgPSAodm9pZCAqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaGNpX3VhcnQgKmh1ID0gaGNpX2dldF9kcnZkYXRhKGhkZXYpOworCXN0cnVjdCBtcnZsX2RhdGEgKm1ydmwgPSBodS0+cHJpdjsKKwlpbnQgcmV0ID0gMDsKKworCWlmICgocGt0LT5saHMgXiBwa3QtPnJocykgIT0gMHhmZmZmKSB7CisJCWJ0X2Rldl9lcnIoaGRldiwgIkNvcnJ1cHRlZCBtcnZsIGhlYWRlciIpOworCQltcnZsX3NlbmRfYWNrKGh1LCBNUlZMX05BSyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJbXJ2bF9zZW5kX2FjayhodSwgTVJWTF9BQ0spOworCisJaWYgKCF0ZXN0X2JpdChTVEFURV9GV19SRVFfUEVORElORywgJm1ydmwtPmZsYWdzKSkgeworCQlidF9kZXZfZXJyKGhkZXYsICJSZWNlaXZlZCB1bmV4cGVjdGVkIGZpcm13YXJlIHJlcXVlc3QiKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCW1ydmwtPnR4X2xlbiA9IGxlMTZfdG9fY3B1KHBrdC0+bGhzKTsKKworCWNsZWFyX2JpdChTVEFURV9GV19SRVFfUEVORElORywgJm1ydmwtPmZsYWdzKTsKKwlzbXBfbWJfX2FmdGVyX2F0b21pYygpOworCXdha2VfdXBfYml0KCZtcnZsLT5mbGFncywgU1RBVEVfRldfUkVRX1BFTkRJTkcpOworCitkb25lOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXJ2bF9yZWN2X2NoaXBfdmVyKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfbXJ2bF9wa3QgKnBrdCA9ICh2b2lkICopc2tiLT5kYXRhOworCXN0cnVjdCBoY2lfdWFydCAqaHUgPSBoY2lfZ2V0X2RydmRhdGEoaGRldik7CisJc3RydWN0IG1ydmxfZGF0YSAqbXJ2bCA9IGh1LT5wcml2OworCXUxNiB2ZXJzaW9uID0gbGUxNl90b19jcHUocGt0LT5saHMpOworCWludCByZXQgPSAwOworCisJaWYgKChwa3QtPmxocyBeIHBrdC0+cmhzKSAhPSAweGZmZmYpIHsKKwkJYnRfZGV2X2VycihoZGV2LCAiQ29ycnVwdGVkIG1ydmwgaGVhZGVyIik7CisJCW1ydmxfc2VuZF9hY2soaHUsIE1SVkxfTkFLKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwltcnZsX3NlbmRfYWNrKGh1LCBNUlZMX0FDSyk7CisKKwlpZiAoIXRlc3RfYml0KFNUQVRFX0NISVBfVkVSX1BFTkRJTkcsICZtcnZsLT5mbGFncykpIHsKKwkJYnRfZGV2X2VycihoZGV2LCAiUmVjZWl2ZWQgdW5leHBlY3RlZCBjaGlwIHZlcnNpb24iKTsKKwkJZ290byBkb25lOworCX0KKworCW1ydmwtPmlkID0gdmVyc2lvbjsKKwltcnZsLT5yZXYgPSB2ZXJzaW9uID4+IDg7CisKKwlidF9kZXZfaW5mbyhoZGV2LCAiQ29udHJvbGxlciBpZCA9ICV4LCByZXYgPSAleCIsIG1ydmwtPmlkLCBtcnZsLT5yZXYpOworCisJY2xlYXJfYml0KFNUQVRFX0NISVBfVkVSX1BFTkRJTkcsICZtcnZsLT5mbGFncyk7CisJc21wX21iX19hZnRlcl9hdG9taWMoKTsKKwl3YWtlX3VwX2JpdCgmbXJ2bC0+ZmxhZ3MsIFNUQVRFX0NISVBfVkVSX1BFTkRJTkcpOworCitkb25lOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgSENJX1JFQ1ZfQ0hJUF9WRVIgXAorCS50eXBlID0gSENJX0NISVBfVkVSX1BLVCwgXAorCS5obGVuID0gSENJX01SVkxfUEtUX1NJWkUsIFwKKwkubG9mZiA9IDAsIFwKKwkubHNpemUgPSAwLCBcCisJLm1heGxlbiA9IEhDSV9NUlZMX1BLVF9TSVpFCisKKyNkZWZpbmUgSENJX1JFQ1ZfRldfUkVRIFwKKwkudHlwZSA9IEhDSV9GV19SRVFfUEtULCBcCisJLmhsZW4gPSBIQ0lfTVJWTF9QS1RfU0laRSwgXAorCS5sb2ZmID0gMCwgXAorCS5sc2l6ZSA9IDAsIFwKKwkubWF4bGVuID0gSENJX01SVkxfUEtUX1NJWkUKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoNF9yZWN2X3BrdCBtcnZsX3JlY3ZfcGt0c1tdID0geworCXsgSDRfUkVDVl9BQ0wsICAgICAgIC5yZWN2ID0gaGNpX3JlY3ZfZnJhbWUgICAgIH0sCisJeyBINF9SRUNWX1NDTywgICAgICAgLnJlY3YgPSBoY2lfcmVjdl9mcmFtZSAgICAgfSwKKwl7IEg0X1JFQ1ZfRVZFTlQsICAgICAucmVjdiA9IGhjaV9yZWN2X2ZyYW1lICAgICB9LAorCXsgSENJX1JFQ1ZfRldfUkVRLCAgIC5yZWN2ID0gbXJ2bF9yZWN2X2Z3X3JlcSAgIH0sCisJeyBIQ0lfUkVDVl9DSElQX1ZFUiwgLnJlY3YgPSBtcnZsX3JlY3ZfY2hpcF92ZXIgfSwKK307CisKK3N0YXRpYyBpbnQgbXJ2bF9yZWN2KHN0cnVjdCBoY2lfdWFydCAqaHUsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgbXJ2bF9kYXRhICptcnZsID0gaHUtPnByaXY7CisKKwlpZiAoIXRlc3RfYml0KEhDSV9VQVJUX1JFR0lTVEVSRUQsICZodS0+ZmxhZ3MpKQorCQlyZXR1cm4gLUVVTkFUQ0g7CisKKwltcnZsLT5yeF9za2IgPSBoNF9yZWN2X2J1ZihodS0+aGRldiwgbXJ2bC0+cnhfc2tiLCBkYXRhLCBjb3VudCwKKwkJCQkgICAgbXJ2bF9yZWN2X3BrdHMsCisJCQkJICAgIEFSUkFZX1NJWkUobXJ2bF9yZWN2X3BrdHMpKTsKKwlpZiAoSVNfRVJSKG1ydmwtPnJ4X3NrYikpIHsKKwkJaW50IGVyciA9IFBUUl9FUlIobXJ2bC0+cnhfc2tiKTsKKwkJYnRfZGV2X2VycihodS0+aGRldiwgIkZyYW1lIHJlYXNzZW1ibHkgZmFpbGVkICglZCkiLCBlcnIpOworCQltcnZsLT5yeF9za2IgPSBOVUxMOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBtcnZsX2xvYWRfZmlybXdhcmUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGhjaV91YXJ0ICpodSA9IGhjaV9nZXRfZHJ2ZGF0YShoZGV2KTsKKwlzdHJ1Y3QgbXJ2bF9kYXRhICptcnZsID0gaHUtPnByaXY7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyA9IE5VTEw7CisJY29uc3QgdTggKmZ3X3B0ciwgKmZ3X21heDsKKwlpbnQgZXJyOworCisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIG5hbWUsICZoZGV2LT5kZXYpOworCWlmIChlcnIgPCAwKSB7CisJCWJ0X2Rldl9lcnIoaGRldiwgIkZhaWxlZCB0byBsb2FkIGZpcm13YXJlIGZpbGUgJXMiLCBuYW1lKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlmd19wdHIgPSBmdy0+ZGF0YTsKKwlmd19tYXggPSBmdy0+ZGF0YSArIGZ3LT5zaXplOworCisJYnRfZGV2X2luZm8oaGRldiwgIkxvYWRpbmcgJXMiLCBuYW1lKTsKKworCXNldF9iaXQoU1RBVEVfRldfUkVRX1BFTkRJTkcsICZtcnZsLT5mbGFncyk7CisKKwl3aGlsZSAoZndfcHRyIDw9IGZ3X21heCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCS8qIENvbnRyb2xsZXIgZHJpdmVzIHRoZSBmaXJtd2FyZSBsb2FkIGJ5IHNlbmRpbmcgZmlybXdhcmUKKwkJICogcmVxdWVzdCBwYWNrZXRzIGNvbnRhaW5pbmcgdGhlIGV4cGVjdGVkIGZyYWdtZW50IHNpemUuCisJCSAqLworCQllcnIgPSB3YWl0X29uX2JpdF90aW1lb3V0KCZtcnZsLT5mbGFncywgU1RBVEVfRldfUkVRX1BFTkRJTkcsCisJCQkJCSAgVEFTS19JTlRFUlJVUFRJQkxFLAorCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpOworCQlpZiAoZXJyID09IDEpIHsKKwkJCWJ0X2Rldl9lcnIoaGRldiwgIkZpcm13YXJlIGxvYWQgaW50ZXJydXB0ZWQiKTsKKwkJCWVyciA9IC1FSU5UUjsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGVycikgeworCQkJYnRfZGV2X2VycihoZGV2LCAiRmlybXdhcmUgcmVxdWVzdCB0aW1lb3V0Iik7CisJCQllcnIgPSAtRVRJTUVET1VUOworCQkJYnJlYWs7CisJCX0KKworCQlidF9kZXZfZGJnKGhkZXYsICJGaXJtd2FyZSByZXF1ZXN0LCBleHBlY3RpbmcgJWQgYnl0ZXMiLAorCQkJICAgbXJ2bC0+dHhfbGVuKTsKKworCQlpZiAoZndfcHRyID09IGZ3X21heCkgeworCQkJLyogQ29udHJvbGxlciByZXF1ZXN0cyBhIG51bGwgc2l6ZSBvbmNlIGZpcm13YXJlIGlzCisJCQkgKiBmdWxseSBsb2FkZWQuIElmIGNvbnRyb2xsZXIgZXhwZWN0cyBtb3JlIGRhdGEsIHRoZXJlCisJCQkgKiBpcyBhbiBpc3N1ZS4KKwkJCSAqLworCQkJaWYgKCFtcnZsLT50eF9sZW4pIHsKKwkJCQlidF9kZXZfaW5mbyhoZGV2LCAiRmlybXdhcmUgbG9hZGluZyBjb21wbGV0ZSIpOworCQkJfSBlbHNlIHsKKwkJCQlidF9kZXZfZXJyKGhkZXYsICJGaXJtd2FyZSBsb2FkaW5nIGZhaWx1cmUiKTsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZndfcHRyICsgbXJ2bC0+dHhfbGVuID4gZndfbWF4KSB7CisJCQltcnZsLT50eF9sZW4gPSBmd19tYXggLSBmd19wdHI7CisJCQlidF9kZXZfZGJnKGhkZXYsICJBZGp1c3RpbmcgdHhfbGVuIHRvICVkIiwKKwkJCQkgICBtcnZsLT50eF9sZW4pOworCQl9CisKKwkJc2tiID0gYnRfc2tiX2FsbG9jKG1ydmwtPnR4X2xlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghc2tiKSB7CisJCQlidF9kZXZfZXJyKGhkZXYsICJGYWlsZWQgdG8gYWxsb2MgbWVtIGZvciBGVyBwYWNrZXQiKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCQlidF9jYihza2IpLT5wa3RfdHlwZSA9IE1SVkxfUkFXX0RBVEE7CisKKwkJbWVtY3B5KHNrYl9wdXQoc2tiLCBtcnZsLT50eF9sZW4pLCBmd19wdHIsIG1ydmwtPnR4X2xlbik7CisJCWZ3X3B0ciArPSBtcnZsLT50eF9sZW47CisKKwkJc2V0X2JpdChTVEFURV9GV19SRVFfUEVORElORywgJm1ydmwtPmZsYWdzKTsKKworCQlza2JfcXVldWVfdGFpbCgmbXJ2bC0+cmF3cSwgc2tiKTsKKwkJaGNpX3VhcnRfdHhfd2FrZXVwKGh1KTsKKwl9CisKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1ydmxfc2V0dXAoc3RydWN0IGhjaV91YXJ0ICpodSkKK3sKKwlpbnQgZXJyOworCisJaGNpX3VhcnRfc2V0X2Zsb3dfY29udHJvbChodSwgdHJ1ZSk7CisKKwllcnIgPSBtcnZsX2xvYWRfZmlybXdhcmUoaHUtPmhkZXYsICJtcnZsL2hlbHBlcl91YXJ0XzMwMDAwMDAuYmluIik7CisJaWYgKGVycikgeworCQlidF9kZXZfZXJyKGh1LT5oZGV2LCAiVW5hYmxlIHRvIGRvd25sb2FkIGZpcm13YXJlIGhlbHBlciIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloY2lfdWFydF9zZXRfYmF1ZHJhdGUoaHUsIDMwMDAwMDApOworCWhjaV91YXJ0X3NldF9mbG93X2NvbnRyb2woaHUsIGZhbHNlKTsKKworCWVyciA9IG1ydmxfbG9hZF9maXJtd2FyZShodS0+aGRldiwgIm1ydmwvdWFydDg4OTdfYnQuYmluIik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhjaV91YXJ0X3Byb3RvIG1ydmxfcHJvdG8gPSB7CisJLmlkCQk9IEhDSV9VQVJUX01SVkwsCisJLm5hbWUJCT0gIk1hcnZlbGwiLAorCS5pbml0X3NwZWVkCT0gMTE1MjAwLAorCS5vcGVuCQk9IG1ydmxfb3BlbiwKKwkuY2xvc2UJCT0gbXJ2bF9jbG9zZSwKKwkuZmx1c2gJCT0gbXJ2bF9mbHVzaCwKKwkuc2V0dXAJCT0gbXJ2bF9zZXR1cCwKKwkucmVjdgkJPSBtcnZsX3JlY3YsCisJLmVucXVldWUJPSBtcnZsX2VucXVldWUsCisJLmRlcXVldWUJPSBtcnZsX2RlcXVldWUsCit9OworCitpbnQgX19pbml0IG1ydmxfaW5pdCh2b2lkKQoreworCXJldHVybiBoY2lfdWFydF9yZWdpc3Rlcl9wcm90bygmbXJ2bF9wcm90byk7Cit9CisKK2ludCBfX2V4aXQgbXJ2bF9kZWluaXQodm9pZCkKK3sKKwlyZXR1cm4gaGNpX3VhcnRfdW5yZWdpc3Rlcl9wcm90bygmbXJ2bF9wcm90byk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfcWNhLmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfcWNhLmMKaW5kZXggNjgzYzJiNi4uNmM4NjdmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX3FjYS5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9xY2EuYwpAQCAtMzk3LDcgKzM5Nyw3IEBACiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcWNhLT50eHEpOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnFjYS0+dHhfd2FpdF9xKTsKIAlzcGluX2xvY2tfaW5pdCgmcWNhLT5oY2lfaWJzX2xvY2spOwotCXFjYS0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInFjYV93cSIpOworCXFjYS0+d29ya3F1ZXVlID0gYWxsb2Nfb3JkZXJlZF93b3JrcXVldWUoInFjYV93cSIsIDApOwogCWlmICghcWNhLT53b3JrcXVldWUpIHsKIAkJQlRfRVJSKCJRQ0EgV29ya3F1ZXVlIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseSIpOwogCQlrZnJlZShxY2EpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX3VhcnQuaCBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV91YXJ0LmgKaW5kZXggODM5YmFkMS4uMDcwMTM5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX3VhcnQuaAorKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfdWFydC5oCkBAIC0zNSw3ICszNSw3IEBACiAjZGVmaW5lIEhDSVVBUlRHRVRGTEFHUwkJX0lPUignVScsIDIwNCwgaW50KQogCiAvKiBVQVJUIHByb3RvY29scyAqLwotI2RlZmluZSBIQ0lfVUFSVF9NQVhfUFJPVE8JMTAKKyNkZWZpbmUgSENJX1VBUlRfTUFYX1BST1RPCTEyCiAKICNkZWZpbmUgSENJX1VBUlRfSDQJMAogI2RlZmluZSBIQ0lfVUFSVF9CQ1NQCTEKQEAgLTQ3LDYgKzQ3LDggQEAKICNkZWZpbmUgSENJX1VBUlRfQkNNCTcKICNkZWZpbmUgSENJX1VBUlRfUUNBCTgKICNkZWZpbmUgSENJX1VBUlRfQUc2WFgJOQorI2RlZmluZSBIQ0lfVUFSVF9OT0tJQQkxMAorI2RlZmluZSBIQ0lfVUFSVF9NUlZMCTExCiAKICNkZWZpbmUgSENJX1VBUlRfUkFXX0RFVklDRQkwCiAjZGVmaW5lIEhDSV9VQVJUX1JFU0VUX09OX0lOSVQJMQpAQCAtMTg5LDMgKzE5MSw4IEBACiBpbnQgYWc2eHhfaW5pdCh2b2lkKTsKIGludCBhZzZ4eF9kZWluaXQodm9pZCk7CiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19CVF9IQ0lVQVJUX01SVkwKK2ludCBtcnZsX2luaXQodm9pZCk7CitpbnQgbXJ2bF9kZWluaXQodm9pZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV92aGNpLmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfdmhjaS5jCmluZGV4IDNmZjIyOWIuLmM0YTc1YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV92aGNpLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX3ZoY2kuYwpAQCAtMzc3LDIxICszNzcsNyBAQAogCS5mb3BzCT0gJnZoY2lfZm9wcywKIAkubWlub3IJPSBWSENJX01JTk9SLAogfTsKLQotc3RhdGljIGludCBfX2luaXQgdmhjaV9pbml0KHZvaWQpCi17Ci0JQlRfSU5GTygiVmlydHVhbCBIQ0kgZHJpdmVyIHZlciAlcyIsIFZFUlNJT04pOwotCi0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJnZoY2lfbWlzY2Rldik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB2aGNpX2V4aXQodm9pZCkKLXsKLQltaXNjX2RlcmVnaXN0ZXIoJnZoY2lfbWlzY2Rldik7Ci19Ci0KLW1vZHVsZV9pbml0KHZoY2lfaW5pdCk7Ci1tb2R1bGVfZXhpdCh2aGNpX2V4aXQpOworbW9kdWxlX21pc2NfZGV2aWNlKHZoY2lfbWlzY2Rldik7CiAKIG1vZHVsZV9wYXJhbShhbXAsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhbXAsICJDcmVhdGUgQU1QIGNvbnRyb2xsZXIgZGV2aWNlIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2J1cy9hcm0tY2NpLmMgYi9kcml2ZXJzL2J1cy9hcm0tY2NpLmMKaW5kZXggNTc1NTkwN2YuLjg5MDA4MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYnVzL2FybS1jY2kuYworKysgYi9kcml2ZXJzL2J1cy9hcm0tY2NpLmMKQEAgLTE0NCwxNSArMTQ0LDEyIEBACiAJaW50IG51bV9jbnRyczsKIAlhdG9taWNfdCBhY3RpdmVfZXZlbnRzOwogCXN0cnVjdCBtdXRleCByZXNlcnZlX211dGV4OwotCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJc3RydWN0IGhsaXN0X25vZGUgbm9kZTsKIAljcHVtYXNrX3QgY3B1czsKIH07CiAKICNkZWZpbmUgdG9fY2NpX3BtdShjKQkoY29udGFpbmVyX29mKGMsIHN0cnVjdCBjY2lfcG11LCBwbXUpKQogCi1zdGF0aWMgREVGSU5FX01VVEVYKGNjaV9wbXVfbXV0ZXgpOwotc3RhdGljIExJU1RfSEVBRChjY2lfcG11X2xpc3QpOwotCiBlbnVtIGNjaV9tb2RlbHMgewogI2lmZGVmIENPTkZJR19BUk1fQ0NJNDAwX1BNVQogCUNDSTQwMF9SMCwKQEAgLTU1MSw3ICs1NDgsNyBAQAogCUNDSTV4eF9HTE9CQUxfRVZFTlRfRVhUX0FUVFJfRU5UUlkoY2NpX3dycSwgMHhCKSwKIAlDQ0k1eHhfR0xPQkFMX0VWRU5UX0VYVF9BVFRSX0VOVFJZKGNjaV9zbm9vcF9jZF9ocywgMHhDKSwKIAlDQ0k1eHhfR0xPQkFMX0VWRU5UX0VYVF9BVFRSX0VOVFJZKGNjaV9ycV9zdGFsbF9hZGRyX2hhemFyZCwgMHhEKSwKLQlDQ0k1eHhfR0xPQkFMX0VWRU5UX0VYVF9BVFRSX0VOVFJZKGNjaV9zbm9wcF9ycV9zdGFsbF90dF9mdWxsLCAweEUpLAorCUNDSTV4eF9HTE9CQUxfRVZFTlRfRVhUX0FUVFJfRU5UUlkoY2NpX3Nub29wX3JxX3N0YWxsX3R0X2Z1bGwsIDB4RSksCiAJQ0NJNXh4X0dMT0JBTF9FVkVOVF9FWFRfQVRUUl9FTlRSWShjY2lfc25vb3BfcnFfdHptcDFfcHJvdCwgMHhGKSwKIAlOVUxMCiB9OwpAQCAtMTUwNiwyNSArMTUwMywyMSBAQAogCXJldHVybiBwZXJmX3BtdV9yZWdpc3RlcigmY2NpX3BtdS0+cG11LCBuYW1lLCAtMSk7CiB9CiAKLXN0YXRpYyBpbnQgY2NpX3BtdV9vZmZsaW5lX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQorc3RhdGljIGludCBjY2lfcG11X29mZmxpbmVfY3B1KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQogewotCXN0cnVjdCBjY2lfcG11ICpjY2lfcG11OworCXN0cnVjdCBjY2lfcG11ICpjY2lfcG11ID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgY2NpX3BtdSwgbm9kZSk7CiAJdW5zaWduZWQgaW50IHRhcmdldDsKIAotCW11dGV4X2xvY2soJmNjaV9wbXVfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2NpX3BtdSwgJmNjaV9wbXVfbGlzdCwgZW50cnkpIHsKLQkJaWYgKCFjcHVtYXNrX3Rlc3RfYW5kX2NsZWFyX2NwdShjcHUsICZjY2lfcG11LT5jcHVzKSkKLQkJCWNvbnRpbnVlOwotCQl0YXJnZXQgPSBjcHVtYXNrX2FueV9idXQoY3B1X29ubGluZV9tYXNrLCBjcHUpOwotCQlpZiAodGFyZ2V0ID49IG5yX2NwdV9pZHMpCi0JCQljb250aW51ZTsKLQkJLyoKLQkJICogVE9ETzogbWlncmF0ZSBjb250ZXh0IG9uY2UgY29yZSByYWNlcyBvbiBldmVudC0+Y3R4IGhhdmUKLQkJICogYmVlbiBmaXhlZC4KLQkJICovCi0JCWNwdW1hc2tfc2V0X2NwdSh0YXJnZXQsICZjY2lfcG11LT5jcHVzKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjY2lfcG11X211dGV4KTsKKwlpZiAoIWNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgJmNjaV9wbXUtPmNwdXMpKQorCQlyZXR1cm4gMDsKKwl0YXJnZXQgPSBjcHVtYXNrX2FueV9idXQoY3B1X29ubGluZV9tYXNrLCBjcHUpOworCWlmICh0YXJnZXQgPj0gbnJfY3B1X2lkcykKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBUT0RPOiBtaWdyYXRlIGNvbnRleHQgb25jZSBjb3JlIHJhY2VzIG9uIGV2ZW50LT5jdHggaGF2ZQorCSAqIGJlZW4gZml4ZWQuCisJICovCisJY3B1bWFza19zZXRfY3B1KHRhcmdldCwgJmNjaV9wbXUtPmNwdXMpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzY4LDEwICsxNzYxLDggQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JbXV0ZXhfbG9jaygmY2NpX3BtdV9tdXRleCk7Ci0JbGlzdF9hZGQoJmNjaV9wbXUtPmVudHJ5LCAmY2NpX3BtdV9saXN0KTsKLQltdXRleF91bmxvY2soJmNjaV9wbXVfbXV0ZXgpOwotCisJY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlX25vY2FsbHMoQ1BVSFBfQVBfUEVSRl9BUk1fQ0NJX09OTElORSwKKwkJCQkJICZjY2lfcG11LT5ub2RlKTsKIAlwcl9pbmZvKCJBUk0gJXMgUE1VIGRyaXZlciBwcm9iZWQiLCBjY2lfcG11LT5tb2RlbC0+bmFtZSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xODA0LDkgKzE3OTUsOSBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0FQX1BFUkZfQVJNX0NDSV9PTkxJTkUsCi0JCQkJCSJBUF9QRVJGX0FSTV9DQ0lfT05MSU5FIiwgTlVMTCwKLQkJCQkJY2NpX3BtdV9vZmZsaW5lX2NwdSk7CisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfQVBfUEVSRl9BUk1fQ0NJX09OTElORSwKKwkJCQkgICAgICAiQVBfUEVSRl9BUk1fQ0NJX09OTElORSIsIE5VTEwsCisJCQkJICAgICAgY2NpX3BtdV9vZmZsaW5lX2NwdSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9idXMvYXJtLWNjbi5jIGIvZHJpdmVycy9idXMvYXJtLWNjbi5jCmluZGV4IDk3YTkxODUuLmQxMDc0ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYnVzL2FybS1jY24uYworKysgYi9kcml2ZXJzL2J1cy9hcm0tY2NuLmMKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCXN0cnVjdCBocnRpbWVyIGhydGltZXI7CiAKIAljcHVtYXNrX3QgY3B1OwotCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJc3RydWN0IGhsaXN0X25vZGUgbm9kZTsKIAogCXN0cnVjdCBwbXUgcG11OwogfTsKQEAgLTE4NywxMSArMTg3LDkgQEAKIAlzdHJ1Y3QgYXJtX2Njbl9jb21wb25lbnQgKnhwOwogCiAJc3RydWN0IGFybV9jY25fZHQgZHQ7CisJaW50IG1uX2lkOwogfTsKIAotc3RhdGljIERFRklORV9NVVRFWChhcm1fY2NuX211dGV4KTsKLXN0YXRpYyBMSVNUX0hFQUQoYXJtX2Njbl9saXN0KTsKLQogc3RhdGljIGludCBhcm1fY2NuX25vZGVfdG9feHAoaW50IG5vZGUpCiB7CiAJcmV0dXJuIG5vZGUgLyBDQ05fTlVNX1hQX1BPUlRTOwpAQCAtMjEyLDYgKzIxMCw3IEBACiAjZGVmaW5lIENDTl9DT05GSUdfVFlQRShfY29uZmlnKQkoKChfY29uZmlnKSA+PiA4KSAmIDB4ZmYpCiAjZGVmaW5lIENDTl9DT05GSUdfRVZFTlQoX2NvbmZpZykJKCgoX2NvbmZpZykgPj4gMTYpICYgMHhmZikKICNkZWZpbmUgQ0NOX0NPTkZJR19QT1JUKF9jb25maWcpCSgoKF9jb25maWcpID4+IDI0KSAmIDB4MykKKyNkZWZpbmUgQ0NOX0NPTkZJR19CVVMoX2NvbmZpZykJCSgoKF9jb25maWcpID4+IDI0KSAmIDB4MykKICNkZWZpbmUgQ0NOX0NPTkZJR19WQyhfY29uZmlnKQkJKCgoX2NvbmZpZykgPj4gMjYpICYgMHg3KQogI2RlZmluZSBDQ05fQ09ORklHX0RJUihfY29uZmlnKQkJKCgoX2NvbmZpZykgPj4gMjkpICYgMHgxKQogI2RlZmluZSBDQ05fQ09ORklHX01BU0soX2NvbmZpZykJKCgoX2NvbmZpZykgPj4gMzApICYgMHhmKQpAQCAtMjQxLDYgKzI0MCw3IEBACiBzdGF0aWMgQ0NOX0ZPUk1BVF9BVFRSKHR5cGUsICJjb25maWc6OC0xNSIpOwogc3RhdGljIENDTl9GT1JNQVRfQVRUUihldmVudCwgImNvbmZpZzoxNi0yMyIpOwogc3RhdGljIENDTl9GT1JNQVRfQVRUUihwb3J0LCAiY29uZmlnOjI0LTI1Iik7CitzdGF0aWMgQ0NOX0ZPUk1BVF9BVFRSKGJ1cywgImNvbmZpZzoyNC0yNSIpOwogc3RhdGljIENDTl9GT1JNQVRfQVRUUih2YywgImNvbmZpZzoyNi0yOCIpOwogc3RhdGljIENDTl9GT1JNQVRfQVRUUihkaXIsICJjb25maWc6MjktMjkiKTsKIHN0YXRpYyBDQ05fRk9STUFUX0FUVFIobWFzaywgImNvbmZpZzozMC0zMyIpOwpAQCAtMjUzLDYgKzI1Myw3IEBACiAJJmFybV9jY25fcG11X2Zvcm1hdF9hdHRyX3R5cGUuYXR0ci5hdHRyLAogCSZhcm1fY2NuX3BtdV9mb3JtYXRfYXR0cl9ldmVudC5hdHRyLmF0dHIsCiAJJmFybV9jY25fcG11X2Zvcm1hdF9hdHRyX3BvcnQuYXR0ci5hdHRyLAorCSZhcm1fY2NuX3BtdV9mb3JtYXRfYXR0cl9idXMuYXR0ci5hdHRyLAogCSZhcm1fY2NuX3BtdV9mb3JtYXRfYXR0cl92Yy5hdHRyLmF0dHIsCiAJJmFybV9jY25fcG11X2Zvcm1hdF9hdHRyX2Rpci5hdHRyLmF0dHIsCiAJJmFybV9jY25fcG11X2Zvcm1hdF9hdHRyX21hc2suYXR0ci5hdHRyLApAQCAtMzI4LDYgKzMyOSw3IEBACiBzdGF0aWMgc3NpemVfdCBhcm1fY2NuX3BtdV9ldmVudF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKKwlzdHJ1Y3QgYXJtX2NjbiAqY2NuID0gcG11X3RvX2FybV9jY24oZGV2X2dldF9kcnZkYXRhKGRldikpOwogCXN0cnVjdCBhcm1fY2NuX3BtdV9ldmVudCAqZXZlbnQgPSBjb250YWluZXJfb2YoYXR0ciwKIAkJCXN0cnVjdCBhcm1fY2NuX3BtdV9ldmVudCwgYXR0cik7CiAJc3NpemVfdCByZXM7CkBAIC0zNDksMTAgKzM1MSwxNyBAQAogCQlicmVhazsKIAljYXNlIENDTl9UWVBFX1hQOgogCQlyZXMgKz0gc25wcmludGYoYnVmICsgcmVzLCBQQUdFX1NJWkUgLSByZXMsCi0JCQkJIix4cD0/LHBvcnQ9Pyx2Yz0/LGRpcj0/Iik7CisJCQkJIix4cD0/LHZjPT8iKTsKIAkJaWYgKGV2ZW50LT5ldmVudCA9PSBDQ05fRVZFTlRfV0FUQ0hQT0lOVCkKIAkJCXJlcyArPSBzbnByaW50ZihidWYgKyByZXMsIFBBR0VfU0laRSAtIHJlcywKLQkJCQkJIixjbXBfbD0/LGNtcF9oPT8sbWFzaz0/Iik7CisJCQkJCSIscG9ydD0/LGRpcj0/LGNtcF9sPT8sY21wX2g9PyxtYXNrPT8iKTsKKwkJZWxzZQorCQkJcmVzICs9IHNucHJpbnRmKGJ1ZiArIHJlcywgUEFHRV9TSVpFIC0gcmVzLAorCQkJCQkiLGJ1cz0/Iik7CisKKwkJYnJlYWs7CisJY2FzZSBDQ05fVFlQRV9NTjoKKwkJcmVzICs9IHNucHJpbnRmKGJ1ZiArIHJlcywgUEFHRV9TSVpFIC0gcmVzLCAiLG5vZGU9JWQiLCBjY24tPm1uX2lkKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmVzICs9IHNucHJpbnRmKGJ1ZiArIHJlcywgUEFHRV9TSVpFIC0gcmVzLCAiLG5vZGU9PyIpOwpAQCAtMzgzLDkgKzM5Miw5IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYXJtX2Njbl9wbXVfZXZlbnQgYXJtX2Njbl9wbXVfZXZlbnRzW10gPSB7Ci0JQ0NOX0VWRU5UX01OKGVvYmFycmllciwgImRpcj0wLHZjPTAsY21wX2g9MHgxYzAwIiwgQ0NOX0lEWF9NQVNLX09QQ09ERSksCi0JQ0NOX0VWRU5UX01OKGVjYmFycmllciwgImRpcj0wLHZjPTAsY21wX2g9MHgxZTAwIiwgQ0NOX0lEWF9NQVNLX09QQ09ERSksCi0JQ0NOX0VWRU5UX01OKGR2bW9wLCAiZGlyPTAsdmM9MCxjbXBfaD0weDI4MDAiLCBDQ05fSURYX01BU0tfT1BDT0RFKSwKKwlDQ05fRVZFTlRfTU4oZW9iYXJyaWVyLCAiZGlyPTEsdmM9MCxjbXBfaD0weDFjMDAiLCBDQ05fSURYX01BU0tfT1BDT0RFKSwKKwlDQ05fRVZFTlRfTU4oZWNiYXJyaWVyLCAiZGlyPTEsdmM9MCxjbXBfaD0weDFlMDAiLCBDQ05fSURYX01BU0tfT1BDT0RFKSwKKwlDQ05fRVZFTlRfTU4oZHZtb3AsICJkaXI9MSx2Yz0wLGNtcF9oPTB4MjgwMCIsIENDTl9JRFhfTUFTS19PUENPREUpLAogCUNDTl9FVkVOVF9ITkkodHhkYXRmbGl0cywgImRpcj0xLHZjPTMiLCBDQ05fSURYX01BU0tfQU5ZKSwKIAlDQ05fRVZFTlRfSE5JKHJ4ZGF0ZmxpdHMsICJkaXI9MCx2Yz0zIiwgQ0NOX0lEWF9NQVNLX0FOWSksCiAJQ0NOX0VWRU5UX0hOSSh0eHJlcWZsaXRzLCAiZGlyPTEsdmM9MCIsIENDTl9JRFhfTUFTS19BTlkpLApAQCAtNzMzLDkgKzc0MiwxMCBAQAogCiAJaWYgKGhhc19icmFuY2hfc3RhY2soZXZlbnQpIHx8IGV2ZW50LT5hdHRyLmV4Y2x1ZGVfdXNlciB8fAogCQkJZXZlbnQtPmF0dHIuZXhjbHVkZV9rZXJuZWwgfHwgZXZlbnQtPmF0dHIuZXhjbHVkZV9odiB8fAotCQkJZXZlbnQtPmF0dHIuZXhjbHVkZV9pZGxlKSB7CisJCQlldmVudC0+YXR0ci5leGNsdWRlX2lkbGUgfHwgZXZlbnQtPmF0dHIuZXhjbHVkZV9ob3N0IHx8CisJCQlldmVudC0+YXR0ci5leGNsdWRlX2d1ZXN0KSB7CiAJCWRldl93YXJuKGNjbi0+ZGV2LCAiQ2FuJ3QgZXhjbHVkZSBleGVjdXRpb24gbGV2ZWxzIVxuIik7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGV2ZW50LT5jcHUgPCAwKSB7CkBAIC03NTksNiArNzY5LDEyIEBACiAKIAkvKiBWYWxpZGF0ZSBub2RlL3hwIHZzIHRvcG9sb2d5ICovCiAJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBDQ05fVFlQRV9NTjoKKwkJaWYgKG5vZGVfeHAgIT0gY2NuLT5tbl9pZCkgeworCQkJZGV2X3dhcm4oY2NuLT5kZXYsICJJbnZhbGlkIE1OIElEICVkIVxuIiwgbm9kZV94cCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKIAljYXNlIENDTl9UWVBFX1hQOgogCQlpZiAobm9kZV94cCA+PSBjY24tPm51bV94cHMpIHsKIAkJCWRldl93YXJuKGNjbi0+ZGV2LCAiSW52YWxpZCBYUCBJRCAlZCFcbiIsIG5vZGVfeHApOwpAQCAtODg2LDYgKzkwMiwxMCBAQAogCXN0cnVjdCBhcm1fY2NuX2NvbXBvbmVudCAqeHA7CiAJdTMyIHZhbCwgZHRfY2ZnOwogCisJLyogTm90aGluZyB0byBkbyBmb3IgY3ljbGUgY291bnRlciAqLworCWlmIChody0+aWR4ID09IENDTl9JRFhfUE1VX0NZQ0xFX0NPVU5URVIpCisJCXJldHVybjsKKwogCWlmIChDQ05fQ09ORklHX1RZUEUoZXZlbnQtPmF0dHIuY29uZmlnKSA9PSBDQ05fVFlQRV9YUCkKIAkJeHAgPSAmY2NuLT54cFtDQ05fQ09ORklHX1hQKGV2ZW50LT5hdHRyLmNvbmZpZyldOwogCWVsc2UKQEAgLTkxNywzOCArOTM3LDE3IEBACiAJCQlhcm1fY2NuX3BtdV9yZWFkX2NvdW50ZXIoY2NuLCBody0+aWR4KSk7CiAJaHctPnN0YXRlID0gMDsKIAotCS8qCi0JICogUGluIHRoZSB0aW1lciwgc28gdGhhdCB0aGUgb3ZlcmZsb3dzIGFyZSBoYW5kbGVkIGJ5IHRoZSBjaG9zZW4KLQkgKiBldmVudC0+Y3B1ICh0aGlzIGlzIHRoZSBzYW1lIG9uZSBhcyBwcmVzZW50ZWQgaW4gImNwdW1hc2siCi0JICogYXR0cmlidXRlKS4KLQkgKi8KLQlpZiAoIWNjbi0+aXJxKQotCQlocnRpbWVyX3N0YXJ0KCZjY24tPmR0LmhydGltZXIsIGFybV9jY25fcG11X3RpbWVyX3BlcmlvZCgpLAotCQkJCUhSVElNRVJfTU9ERV9SRUxfUElOTkVEKTsKLQogCS8qIFNldCB0aGUgRFQgYnVzIGlucHV0LCBlbmdhZ2luZyB0aGUgY291bnRlciAqLwogCWFybV9jY25fcG11X3hwX2R0X2NvbmZpZyhldmVudCwgMSk7CiB9CiAKIHN0YXRpYyB2b2lkIGFybV9jY25fcG11X2V2ZW50X3N0b3Aoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IGFybV9jY24gKmNjbiA9IHBtdV90b19hcm1fY2NuKGV2ZW50LT5wbXUpOwogCXN0cnVjdCBod19wZXJmX2V2ZW50ICpodyA9ICZldmVudC0+aHc7Ci0JdTY0IHRpbWVvdXQ7CiAKIAkvKiBEaXNhYmxlIGNvdW50aW5nLCBzZXR0aW5nIHRoZSBEVCBidXMgdG8gcGFzcy10aHJvdWdoIG1vZGUgKi8KIAlhcm1fY2NuX3BtdV94cF9kdF9jb25maWcoZXZlbnQsIDApOwogCi0JaWYgKCFjY24tPmlycSkKLQkJaHJ0aW1lcl9jYW5jZWwoJmNjbi0+ZHQuaHJ0aW1lcik7Ci0KLQkvKiBMZXQgdGhlIERUIGJ1cyBkcmFpbiAqLwotCXRpbWVvdXQgPSBhcm1fY2NuX3BtdV9yZWFkX2NvdW50ZXIoY2NuLCBDQ05fSURYX1BNVV9DWUNMRV9DT1VOVEVSKSArCi0JCQljY24tPm51bV94cHM7Ci0Jd2hpbGUgKGFybV9jY25fcG11X3JlYWRfY291bnRlcihjY24sIENDTl9JRFhfUE1VX0NZQ0xFX0NPVU5URVIpIDwKLQkJCXRpbWVvdXQpCi0JCWNwdV9yZWxheCgpOwotCiAJaWYgKGZsYWdzICYgUEVSRl9FRl9VUERBVEUpCiAJCWFybV9jY25fcG11X2V2ZW50X3VwZGF0ZShldmVudCk7CiAKQEAgLTk4OCw3ICs5ODcsNyBAQAogCiAJLyogQ29tcGFyaXNvbiB2YWx1ZXMgKi8KIAl3cml0ZWwoY21wX2wgJiAweGZmZmZmZmZmLCBzb3VyY2UtPmJhc2UgKyBDQ05fWFBfRFRfQ01QX1ZBTF9MKHdwKSk7Ci0Jd3JpdGVsKChjbXBfbCA+PiAzMikgJiAweGVmZmZmZmZmLAorCXdyaXRlbCgoY21wX2wgPj4gMzIpICYgMHg3ZmZmZmZmZiwKIAkJCXNvdXJjZS0+YmFzZSArIENDTl9YUF9EVF9DTVBfVkFMX0wod3ApICsgNCk7CiAJd3JpdGVsKGNtcF9oICYgMHhmZmZmZmZmZiwgc291cmNlLT5iYXNlICsgQ0NOX1hQX0RUX0NNUF9WQUxfSCh3cCkpOwogCXdyaXRlbCgoY21wX2ggPj4gMzIpICYgMHgwZmZmZmZmZiwKQEAgLTk5Niw3ICs5OTUsNyBAQAogCiAJLyogTWFzayAqLwogCXdyaXRlbChtYXNrX2wgJiAweGZmZmZmZmZmLCBzb3VyY2UtPmJhc2UgKyBDQ05fWFBfRFRfQ01QX01BU0tfTCh3cCkpOwotCXdyaXRlbCgobWFza19sID4+IDMyKSAmIDB4ZWZmZmZmZmYsCisJd3JpdGVsKChtYXNrX2wgPj4gMzIpICYgMHg3ZmZmZmZmZiwKIAkJCXNvdXJjZS0+YmFzZSArIENDTl9YUF9EVF9DTVBfTUFTS19MKHdwKSArIDQpOwogCXdyaXRlbChtYXNrX2ggJiAweGZmZmZmZmZmLCBzb3VyY2UtPmJhc2UgKyBDQ05fWFBfRFRfQ01QX01BU0tfSCh3cCkpOwogCXdyaXRlbCgobWFza19oID4+IDMyKSAmIDB4MGZmZmZmZmYsCkBAIC0xMDE0LDcgKzEwMTMsNyBAQAogCWh3LT5ldmVudF9iYXNlID0gQ0NOX1hQX0RUX0NPTkZJR19fRFRfQ0ZHX19YUF9QTVVfRVZFTlQoaHctPmNvbmZpZ19iYXNlKTsKIAogCWlkID0gKENDTl9DT05GSUdfVkMoZXZlbnQtPmF0dHIuY29uZmlnKSA8PCA0KSB8Ci0JCQkoQ0NOX0NPTkZJR19QT1JUKGV2ZW50LT5hdHRyLmNvbmZpZykgPDwgMykgfAorCQkJKENDTl9DT05GSUdfQlVTKGV2ZW50LT5hdHRyLmNvbmZpZykgPDwgMykgfAogCQkJKENDTl9DT05GSUdfRVZFTlQoZXZlbnQtPmF0dHIuY29uZmlnKSA8PCAwKTsKIAogCXZhbCA9IHJlYWRsKHNvdXJjZS0+YmFzZSArIENDTl9YUF9QTVVfRVZFTlRfU0VMKTsKQEAgLTEwOTksMTUgKzEwOTgsMzEgQEAKIAlzcGluX3VubG9jaygmY2NuLT5kdC5jb25maWdfbG9jayk7CiB9CiAKK3N0YXRpYyBpbnQgYXJtX2Njbl9wbXVfYWN0aXZlX2NvdW50ZXJzKHN0cnVjdCBhcm1fY2NuICpjY24pCit7CisJcmV0dXJuIGJpdG1hcF93ZWlnaHQoY2NuLT5kdC5wbXVfY291bnRlcnNfbWFzaywKKwkJCSAgICAgQ0NOX05VTV9QTVVfRVZFTlRfQ09VTlRFUlMgKyAxKTsKK30KKwogc3RhdGljIGludCBhcm1fY2NuX3BtdV9ldmVudF9hZGQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHcgPSAmZXZlbnQtPmh3OworCXN0cnVjdCBhcm1fY2NuICpjY24gPSBwbXVfdG9fYXJtX2NjbihldmVudC0+cG11KTsKIAogCWVyciA9IGFybV9jY25fcG11X2V2ZW50X2FsbG9jKGV2ZW50KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCisJLyoKKwkgKiBQaW4gdGhlIHRpbWVyLCBzbyB0aGF0IHRoZSBvdmVyZmxvd3MgYXJlIGhhbmRsZWQgYnkgdGhlIGNob3NlbgorCSAqIGV2ZW50LT5jcHUgKHRoaXMgaXMgdGhlIHNhbWUgb25lIGFzIHByZXNlbnRlZCBpbiAiY3B1bWFzayIKKwkgKiBhdHRyaWJ1dGUpLgorCSAqLworCWlmICghY2NuLT5pcnEgJiYgYXJtX2Njbl9wbXVfYWN0aXZlX2NvdW50ZXJzKGNjbikgPT0gMSkKKwkJaHJ0aW1lcl9zdGFydCgmY2NuLT5kdC5ocnRpbWVyLCBhcm1fY2NuX3BtdV90aW1lcl9wZXJpb2QoKSwKKwkJCSAgICAgIEhSVElNRVJfTU9ERV9SRUxfUElOTkVEKTsKKwogCWFybV9jY25fcG11X2V2ZW50X2NvbmZpZyhldmVudCk7CiAKIAlody0+c3RhdGUgPSBQRVJGX0hFU19TVE9QUEVEOwpAQCAtMTEyMCw5ICsxMTM1LDE0IEBACiAKIHN0YXRpYyB2b2lkIGFybV9jY25fcG11X2V2ZW50X2RlbChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKIHsKKwlzdHJ1Y3QgYXJtX2NjbiAqY2NuID0gcG11X3RvX2FybV9jY24oZXZlbnQtPnBtdSk7CisKIAlhcm1fY2NuX3BtdV9ldmVudF9zdG9wKGV2ZW50LCBQRVJGX0VGX1VQREFURSk7CiAKIAlhcm1fY2NuX3BtdV9ldmVudF9yZWxlYXNlKGV2ZW50KTsKKworCWlmICghY2NuLT5pcnEgJiYgYXJtX2Njbl9wbXVfYWN0aXZlX2NvdW50ZXJzKGNjbikgPT0gMCkKKwkJaHJ0aW1lcl9jYW5jZWwoJmNjbi0+ZHQuaHJ0aW1lcik7CiB9CiAKIHN0YXRpYyB2b2lkIGFybV9jY25fcG11X2V2ZW50X3JlYWQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQpAQCAtMTEzMCw2ICsxMTUwLDI0IEBACiAJYXJtX2Njbl9wbXVfZXZlbnRfdXBkYXRlKGV2ZW50KTsKIH0KIAorc3RhdGljIHZvaWQgYXJtX2Njbl9wbXVfZW5hYmxlKHN0cnVjdCBwbXUgKnBtdSkKK3sKKwlzdHJ1Y3QgYXJtX2NjbiAqY2NuID0gcG11X3RvX2FybV9jY24ocG11KTsKKworCXUzMiB2YWwgPSByZWFkbChjY24tPmR0LmJhc2UgKyBDQ05fRFRfUE1DUik7CisJdmFsIHw9IENDTl9EVF9QTUNSX19QTVVfRU47CisJd3JpdGVsKHZhbCwgY2NuLT5kdC5iYXNlICsgQ0NOX0RUX1BNQ1IpOworfQorCitzdGF0aWMgdm9pZCBhcm1fY2NuX3BtdV9kaXNhYmxlKHN0cnVjdCBwbXUgKnBtdSkKK3sKKwlzdHJ1Y3QgYXJtX2NjbiAqY2NuID0gcG11X3RvX2FybV9jY24ocG11KTsKKworCXUzMiB2YWwgPSByZWFkbChjY24tPmR0LmJhc2UgKyBDQ05fRFRfUE1DUik7CisJdmFsICY9IH5DQ05fRFRfUE1DUl9fUE1VX0VOOworCXdyaXRlbCh2YWwsIGNjbi0+ZHQuYmFzZSArIENDTl9EVF9QTUNSKTsKK30KKwogc3RhdGljIGlycXJldHVybl90IGFybV9jY25fcG11X292ZXJmbG93X2hhbmRsZXIoc3RydWN0IGFybV9jY25fZHQgKmR0KQogewogCXUzMiBwbW92c3IgPSByZWFkbChkdC0+YmFzZSArIENDTl9EVF9QTU9WU1IpOwpAQCAtMTE3MywzMCArMTIxMSwyNCBAQAogfQogCiAKLXN0YXRpYyBpbnQgYXJtX2Njbl9wbXVfb2ZmbGluZV9jcHUodW5zaWduZWQgaW50IGNwdSkKK3N0YXRpYyBpbnQgYXJtX2Njbl9wbXVfb2ZmbGluZV9jcHUodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCiB7Ci0Jc3RydWN0IGFybV9jY25fZHQgKmR0OworCXN0cnVjdCBhcm1fY2NuX2R0ICpkdCA9IGhsaXN0X2VudHJ5X3NhZmUobm9kZSwgc3RydWN0IGFybV9jY25fZHQsIG5vZGUpOworCXN0cnVjdCBhcm1fY2NuICpjY24gPSBjb250YWluZXJfb2YoZHQsIHN0cnVjdCBhcm1fY2NuLCBkdCk7CiAJdW5zaWduZWQgaW50IHRhcmdldDsKIAotCW11dGV4X2xvY2soJmFybV9jY25fbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZHQsICZhcm1fY2NuX2xpc3QsIGVudHJ5KSB7Ci0JCXN0cnVjdCBhcm1fY2NuICpjY24gPSBjb250YWluZXJfb2YoZHQsIHN0cnVjdCBhcm1fY2NuLCBkdCk7Ci0KLQkJaWYgKCFjcHVtYXNrX3Rlc3RfYW5kX2NsZWFyX2NwdShjcHUsICZkdC0+Y3B1KSkKLQkJCWNvbnRpbnVlOwotCQl0YXJnZXQgPSBjcHVtYXNrX2FueV9idXQoY3B1X29ubGluZV9tYXNrLCBjcHUpOwotCQlpZiAodGFyZ2V0ID49IG5yX2NwdV9pZHMpCi0JCQljb250aW51ZTsKLQkJcGVyZl9wbXVfbWlncmF0ZV9jb250ZXh0KCZkdC0+cG11LCBjcHUsIHRhcmdldCk7Ci0JCWNwdW1hc2tfc2V0X2NwdSh0YXJnZXQsICZkdC0+Y3B1KTsKLQkJaWYgKGNjbi0+aXJxKQotCQkJV0FSTl9PTihpcnFfc2V0X2FmZmluaXR5X2hpbnQoY2NuLT5pcnEsICZkdC0+Y3B1KSAhPSAwKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhcm1fY2NuX211dGV4KTsKKwlpZiAoIWNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgJmR0LT5jcHUpKQorCQlyZXR1cm4gMDsKKwl0YXJnZXQgPSBjcHVtYXNrX2FueV9idXQoY3B1X29ubGluZV9tYXNrLCBjcHUpOworCWlmICh0YXJnZXQgPj0gbnJfY3B1X2lkcykKKwkJcmV0dXJuIDA7CisJcGVyZl9wbXVfbWlncmF0ZV9jb250ZXh0KCZkdC0+cG11LCBjcHUsIHRhcmdldCk7CisJY3B1bWFza19zZXRfY3B1KHRhcmdldCwgJmR0LT5jcHUpOworCWlmIChjY24tPmlycSkKKwkJV0FSTl9PTihpcnFfc2V0X2FmZmluaXR5X2hpbnQoY2NuLT5pcnEsICZkdC0+Y3B1KSAhPSAwKTsKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgREVGSU5FX0lEQShhcm1fY2NuX3BtdV9pZGEpOwogCiBzdGF0aWMgaW50IGFybV9jY25fcG11X2luaXQoc3RydWN0IGFybV9jY24gKmNjbikKQEAgLTEyNTIsNiArMTI4NCw4IEBACiAJCS5zdGFydCA9IGFybV9jY25fcG11X2V2ZW50X3N0YXJ0LAogCQkuc3RvcCA9IGFybV9jY25fcG11X2V2ZW50X3N0b3AsCiAJCS5yZWFkID0gYXJtX2Njbl9wbXVfZXZlbnRfcmVhZCwKKwkJLnBtdV9lbmFibGUgPSBhcm1fY2NuX3BtdV9lbmFibGUsCisJCS5wbXVfZGlzYWJsZSA9IGFybV9jY25fcG11X2Rpc2FibGUsCiAJfTsKIAogCS8qIE5vIG92ZXJmbG93IGludGVycnVwdD8gSGF2ZSB0byB1c2UgYSB0aW1lciBpbnN0ZWFkLiAqLwpAQCAtMTI3OCw5ICsxMzEyLDggQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycm9yX3BtdV9yZWdpc3RlcjsKIAotCW11dGV4X2xvY2soJmFybV9jY25fbXV0ZXgpOwotCWxpc3RfYWRkKCZjY24tPmR0LmVudHJ5LCAmYXJtX2Njbl9saXN0KTsKLQltdXRleF91bmxvY2soJmFybV9jY25fbXV0ZXgpOworCWNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZV9ub2NhbGxzKENQVUhQX0FQX1BFUkZfQVJNX0NDTl9PTkxJTkUsCisJCQkJCSAmY2NuLT5kdC5ub2RlKTsKIAlyZXR1cm4gMDsKIAogZXJyb3JfcG11X3JlZ2lzdGVyOgpAQCAtMTI5NiwxMCArMTMyOSw4IEBACiB7CiAJaW50IGk7CiAKLQltdXRleF9sb2NrKCZhcm1fY2NuX211dGV4KTsKLQlsaXN0X2RlbCgmY2NuLT5kdC5lbnRyeSk7Ci0JbXV0ZXhfdW5sb2NrKCZhcm1fY2NuX211dGV4KTsKLQorCWNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKENQVUhQX0FQX1BFUkZfQVJNX0NDTl9PTkxJTkUsCisJCQkJCSAgICAmY2NuLT5kdC5ub2RlKTsKIAlpZiAoY2NuLT5pcnEpCiAJCWlycV9zZXRfYWZmaW5pdHlfaGludChjY24tPmlycSwgTlVMTCk7CiAJZm9yIChpID0gMDsgaSA8IGNjbi0+bnVtX3hwczsgaSsrKQpAQCAtMTM2MSw2ICsxMzkyLDggQEAKIAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgQ0NOX1RZUEVfTU46CisJCWNjbi0+bW5faWQgPSBpZDsKKwkJcmV0dXJuIDA7CiAJY2FzZSBDQ05fVFlQRV9EVDoKIAkJcmV0dXJuIDA7CiAJY2FzZSBDQ05fVFlQRV9YUDoKQEAgLTE0NzEsOCArMTUwNCw5IEBACiAJCS8qIENhbiBzZXQgJ2Rpc2FibGUnIGJpdHMsIHNvIGNhbiBhY2tub3dsZWRnZSBpbnRlcnJ1cHRzICovCiAJCXdyaXRlbChDQ05fTU5fRVJSSU5UX1NUQVRVU19fUE1VX0VWRU5UU19fRU5BQkxFLAogCQkJCWNjbi0+YmFzZSArIENDTl9NTl9FUlJJTlRfU1RBVFVTKTsKLQkJZXJyID0gZGV2bV9yZXF1ZXN0X2lycShjY24tPmRldiwgaXJxLCBhcm1fY2NuX2lycV9oYW5kbGVyLCAwLAotCQkJCWRldl9uYW1lKGNjbi0+ZGV2KSwgY2NuKTsKKwkJZXJyID0gZGV2bV9yZXF1ZXN0X2lycShjY24tPmRldiwgaXJxLCBhcm1fY2NuX2lycV9oYW5kbGVyLAorCQkJCSAgICAgICBJUlFGX05PQkFMQU5DSU5HIHwgSVJRRl9OT19USFJFQUQsCisJCQkJICAgICAgIGRldl9uYW1lKGNjbi0+ZGV2KSwgY2NuKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAKQEAgLTE1MjcsOSArMTU2MSw5IEBACiB7CiAJaW50IGksIHJldDsKIAotCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfUEVSRl9BUk1fQ0NOX09OTElORSwKLQkJCQkJIkFQX1BFUkZfQVJNX0NDTl9PTkxJTkUiLCBOVUxMLAotCQkJCQlhcm1fY2NuX3BtdV9vZmZsaW5lX2NwdSk7CisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfQVBfUEVSRl9BUk1fQ0NOX09OTElORSwKKwkJCQkgICAgICAiQVBfUEVSRl9BUk1fQ0NOX09OTElORSIsIE5VTEwsCisJCQkJICAgICAgYXJtX2Njbl9wbXVfb2ZmbGluZV9jcHUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTE1NDEsNyArMTU3NSw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhcm1fY2NuX2V4aXQodm9pZCkKIHsKLQljcHVocF9yZW1vdmVfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9QRVJGX0FSTV9DQ05fT05MSU5FKTsKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoQ1BVSFBfQVBfUEVSRl9BUk1fQ0NOX09OTElORSk7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFybV9jY25fZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9idXMvbWlwc19jZG1tLmMgYi9kcml2ZXJzL2J1cy9taXBzX2NkbW0uYwppbmRleCBjYWQ0OWJjLi4xYjE0MjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2J1cy9taXBzX2NkbW0uYworKysgYi9kcml2ZXJzL2J1cy9taXBzX2NkbW0uYwpAQCAtNTk2LDE5ICs1OTYsMjAgQEAKIEJVSUxEX1BFUkRFVl9IRUxQRVIoY3B1X3VwKSAgICAgICAgIC8qIGludCBtaXBzX2NkbW1fY3B1X3VwX2hlbHBlciguLi4pICovCiAKIC8qKgotICogbWlwc19jZG1tX2J1c19kb3duKCkgLSBUZWFyIGRvd24gdGhlIENETU0gYnVzLgotICogQGRhdGE6CVBvaW50ZXIgdG8gdW5zaWduZWQgaW50IENQVSBudW1iZXIuCisgKiBtaXBzX2NkbW1fY3B1X2Rvd25fcHJlcCgpIC0gQ2FsbGJhY2sgZm9yIENQVUhQIERPV05fUFJFUDoKKyAqCQkJICAgICAgIFRlYXIgZG93biB0aGUgQ0RNTSBidXMuCisgKiBAY3B1Ogl1bnNpZ25lZCBpbnQgQ1BVIG51bWJlci4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIG9uIHRoZSBob3RwbHVnZ2VkIENQVSBhbmQgY2FsbHMgdGhlIENETU0KICAqIGRyaXZlciBjcHVfZG93biBjYWxsYmFjayBmb3IgYWxsIGRldmljZXMgb24gdGhhdCBDUFUuCiAgKi8KLXN0YXRpYyBsb25nIG1pcHNfY2RtbV9idXNfZG93bih2b2lkICpkYXRhKQorc3RhdGljIGludCBtaXBzX2NkbW1fY3B1X2Rvd25fcHJlcCh1bnNpZ25lZCBpbnQgY3B1KQogewogCXN0cnVjdCBtaXBzX2NkbW1fYnVzICpidXM7CiAJbG9uZyByZXQ7CiAKIAkvKiBJbmZvcm0gYWxsIHRoZSBkZXZpY2VzIG9uIHRoZSBidXMgKi8KLQlyZXQgPSBidXNfZm9yX2VhY2hfZGV2KCZtaXBzX2NkbW1fYnVzdHlwZSwgTlVMTCwgZGF0YSwKKwlyZXQgPSBidXNfZm9yX2VhY2hfZGV2KCZtaXBzX2NkbW1fYnVzdHlwZSwgTlVMTCwgJmNwdSwKIAkJCSAgICAgICBtaXBzX2NkbW1fY3B1X2Rvd25faGVscGVyKTsKIAogCS8qCkBAIC02MjMsOCArNjI0LDggQEAKIH0KIAogLyoqCi0gKiBtaXBzX2NkbW1fYnVzX3VwKCkgLSBCcmluZyB1cCB0aGUgQ0RNTSBidXMuCi0gKiBAZGF0YToJUG9pbnRlciB0byB1bnNpZ25lZCBpbnQgQ1BVIG51bWJlci4KKyAqIG1pcHNfY2RtbV9jcHVfb25saW5lKCkgLSBDYWxsYmFjayBmb3IgQ1BVSFAgT05MSU5FOiBCcmluZyB1cCB0aGUgQ0RNTSBidXMuCisgKiBAY3B1Ogl1bnNpZ25lZCBpbnQgQ1BVIG51bWJlci4KICAqCiAgKiBUaGlzIHdvcmtfb25fY3B1IGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIG9uIGEgZ2l2ZW4gQ1BVIHRvIGRpc2NvdmVyCiAgKiBDRE1NIGRldmljZXMgb24gdGhhdCBDUFUsIG9yIHRvIGNhbGwgdGhlIENETU0gZHJpdmVyIGNwdV91cCBjYWxsYmFjayBmb3IgYWxsCkBAIC02MzQsNyArNjM1LDcgQEAKICAqIGluaXRpYWxpc2F0aW9uLiBXaGVuIENQVXMgYXJlIGJyb3VnaHQgb25saW5lIHRoZSBmdW5jdGlvbiBpcwogICogaW52b2tlZCBkaXJlY3RseSBvbiB0aGUgaG90cGx1Z2dlZCBDUFUuCiAgKi8KLXN0YXRpYyBsb25nIG1pcHNfY2RtbV9idXNfdXAodm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgbWlwc19jZG1tX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKIAlzdHJ1Y3QgbWlwc19jZG1tX2J1cyAqYnVzOwogCWxvbmcgcmV0OwpAQCAtNjUxLDUxICs2NTIsMTMgQEAKIAkJbWlwc19jZG1tX2J1c19kaXNjb3ZlcihidXMpOwogCWVsc2UKIAkJLyogSW5mb3JtIGFsbCB0aGUgZGV2aWNlcyBvbiB0aGUgYnVzICovCi0JCXJldCA9IGJ1c19mb3JfZWFjaF9kZXYoJm1pcHNfY2RtbV9idXN0eXBlLCBOVUxMLCBkYXRhLAorCQlyZXQgPSBidXNfZm9yX2VhY2hfZGV2KCZtaXBzX2NkbW1fYnVzdHlwZSwgTlVMTCwgJmNwdSwKIAkJCQkgICAgICAgbWlwc19jZG1tX2NwdV91cF9oZWxwZXIpOwogCiAJcmV0dXJuIHJldDsKIH0KIAogLyoqCi0gKiBtaXBzX2NkbW1fY3B1X25vdGlmeSgpIC0gVGFrZSBhY3Rpb24gd2hlbiBhIENQVSBpcyBnb2luZyBvbmxpbmUgb3Igb2ZmbGluZS4KLSAqIEBuYjoJCUNQVSBub3RpZmllciBibG9jayAuCi0gKiBAYWN0aW9uOglFdmVudCB0aGF0IGhhcyB0YWtlbiBwbGFjZSAoQ1BVXyopLgotICogQGRhdGE6CUNQVSBudW1iZXIuCi0gKgotICogVGhpcyBub3RpZmllciBpcyB1c2VkIHRvIGtlZXAgdGhlIENETU0gYnVzZXMgdXBkYXRlZCBhcyBDUFVzIGFyZSBvZmZsaW5lZCBhbmQKLSAqIG9ubGluZWQuIFdoZW4gQ1BVcyBnbyBvZmZsaW5lIG9yIGNvbWUgYmFjayBvbmxpbmUsIHNvIGRvZXMgdGhlaXIgQ0RNTSBidXMsIHNvCi0gKiBkZXZpY2VzIG11c3QgYmUgaW5mb3JtZWQuIEFsc28gd2hlbiBDUFVzIGNvbWUgb25saW5lIGZvciB0aGUgZmlyc3QgdGltZSB0aGUKLSAqIGRldmljZXMgb24gdGhlIENETU0gYnVzIG5lZWQgZGlzY292ZXJpbmcuCi0gKgotICogUmV0dXJuczoJTk9USUZZX09LIGlmIGV2ZW50IHdhcyB1c2VkLgotICoJCU5PVElGWV9ET05FIGlmIHdlIGRpZG4ndCBjYXJlLgotICovCi1zdGF0aWMgaW50IG1pcHNfY2RtbV9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCi0JCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpCi17Ci0JdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBpbnQpZGF0YTsKLQotCXN3aXRjaCAoYWN0aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pIHsKLQljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfRE9XTl9GQUlMRUQ6Ci0JCW1pcHNfY2RtbV9idXNfdXAoJmNwdSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKLQkJbWlwc19jZG1tX2J1c19kb3duKCZjcHUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0JfQotCi0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBtaXBzX2NkbW1fY3B1X25iID0gewotCS5ub3RpZmllcl9jYWxsID0gbWlwc19jZG1tX2NwdV9ub3RpZnksCi19OwotCi0vKioKICAqIG1pcHNfY2RtbV9pbml0KCkgLSBJbml0aWFsaXNlIENETU0gYnVzLgogICoKICAqIEluaXRpYWxpc2UgQ0RNTSBidXMsIGRpc2NvdmVyIENETU0gZGV2aWNlcyBmb3Igb25saW5lIENQVXMsIGFuZCBhcnJhbmdlIGZvcgpAQCAtNzAzLDcgKzY2Niw2IEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IG1pcHNfY2RtbV9pbml0KHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IGNwdTsKIAlpbnQgcmV0OwogCiAJLyogUmVnaXN0ZXIgdGhlIGJ1cyAqLwpAQCAtNzEyLDE5ICs2NzQsMTEgQEAKIAkJcmV0dXJuIHJldDsKIAogCS8qIFdlIHdhbnQgdG8gYmUgbm90aWZpZWQgYWJvdXQgbmV3IENQVXMgKi8KLQlyZXQgPSByZWdpc3Rlcl9jcHVfbm90aWZpZXIoJm1pcHNfY2RtbV9jcHVfbmIpOwotCWlmIChyZXQpIHsKKwlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZShDUFVIUF9BUF9PTkxJTkVfRFlOLCAiYnVzL2NkbW06b25saW5lIiwKKwkJCQltaXBzX2NkbW1fY3B1X29ubGluZSwgbWlwc19jZG1tX2NwdV9kb3duX3ByZXApOworCWlmIChyZXQgPCAwKQogCQlwcl93YXJuKCJjZG1tOiBGYWlsZWQgdG8gcmVnaXN0ZXIgQ1BVIG5vdGlmaWVyXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQogCi0JLyogRGlzY292ZXIgZGV2aWNlcyBvbiBDRE1NIG9mIG9ubGluZSBDUFVzICovCi0JZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCXdvcmtfb25fY3B1KGNwdSwgbWlwc19jZG1tX2J1c191cCwgJmNwdSk7Ci0KLQlyZXR1cm4gMDsKLW91dDoKLQlidXNfdW5yZWdpc3RlcigmbWlwc19jZG1tX2J1c3R5cGUpOwogCXJldHVybiByZXQ7CiB9CiBzdWJzeXNfaW5pdGNhbGwobWlwc19jZG1tX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9idXMvdmV4cHJlc3MtY29uZmlnLmMgYi9kcml2ZXJzL2J1cy92ZXhwcmVzcy1jb25maWcuYwppbmRleCBjM2NiNzZiLi45ZWZkZjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2J1cy92ZXhwcmVzcy1jb25maWcuYworKysgYi9kcml2ZXJzL2J1cy92ZXhwcmVzcy1jb25maWcuYwpAQCAtMTc4LDYgKzE3OCw3IEBACiAKIAlwYXJlbnQgPSBjbGFzc19maW5kX2RldmljZSh2ZXhwcmVzc19jb25maWdfY2xhc3MsIE5VTEwsIGJyaWRnZSwKIAkJCXZleHByZXNzX2NvbmZpZ19ub2RlX21hdGNoKTsKKwlvZl9ub2RlX3B1dChicmlkZ2UpOwogCWlmIChXQVJOX09OKCFwYXJlbnQpKQogCQlyZXR1cm4gLUVOT0RFVjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2JmaW4tb3RwLmMgYi9kcml2ZXJzL2NoYXIvYmZpbi1vdHAuYwppbmRleCA0NDY2MGYxLi4zNWQ0NmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYmZpbi1vdHAuYworKysgYi9kcml2ZXJzL2NoYXIvYmZpbi1vdHAuYwpAQCAtMjMwLDQ1ICsyMzAsNyBAQAogCS5uYW1lICAgICA9IERSSVZFUl9OQU1FLAogCS5mb3BzICAgICA9ICZiZmluX290cF9mb3BzLAogfTsKLQotLyoqCi0gKgliZmluX290cF9pbml0IC0gSW5pdGlhbGl6ZSBtb2R1bGUKLSAqCi0gKglSZWdpc3RlcnMgdGhlIGRldmljZSBhbmQgbm90aWZpZXIgaGFuZGxlci4gQWN0dWFsIGRldmljZQotICoJaW5pdGlhbGl6YXRpb24gaXMgaGFuZGxlZCBieSBiZmluX290cF9vcGVuKCkuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGJmaW5fb3RwX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0Jc3RhbXBpdCgpOwotCi0JcmV0ID0gbWlzY19yZWdpc3RlcigmYmZpbl9vdHBfbWlzY19kZXZpY2UpOwotCWlmIChyZXQpIHsKLQkJcHJfaW5pdChLRVJOX0VSUiBQRlggInVuYWJsZSB0byByZWdpc3RlciBhIG1pc2MgZGV2aWNlXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcl9pbml0KEtFUk5fSU5GTyBQRlggImluaXRpYWxpemVkXG4iKTsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqCWJmaW5fb3RwX2V4aXQgLSBEZWluaXRpYWxpemUgbW9kdWxlCi0gKgotICoJVW5yZWdpc3RlcnMgdGhlIGRldmljZSBhbmQgbm90aWZpZXIgaGFuZGxlci4gQWN0dWFsIGRldmljZQotICoJZGVpbml0aWFsaXphdGlvbiBpcyBoYW5kbGVkIGJ5IGJmaW5fb3RwX2Nsb3NlKCkuCi0gKi8KLXN0YXRpYyB2b2lkIF9fZXhpdCBiZmluX290cF9leGl0KHZvaWQpCi17Ci0Jc3RhbXBpdCgpOwotCi0JbWlzY19kZXJlZ2lzdGVyKCZiZmluX290cF9taXNjX2RldmljZSk7Ci19Ci0KLW1vZHVsZV9pbml0KGJmaW5fb3RwX2luaXQpOwotbW9kdWxlX2V4aXQoYmZpbl9vdHBfZXhpdCk7Cittb2R1bGVfbWlzY19kZXZpY2UoYmZpbl9vdHBfbWlzY19kZXZpY2UpOwogCiBNT0RVTEVfQVVUSE9SKCJNaWtlIEZyeXNpbmdlciA8dmFwaWVyQGdlbnRvby5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkJsYWNrZmluIE9UUCBNZW1vcnkgSW50ZXJmYWNlIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL0tjb25maWcKaW5kZXggNTZhZDVhNS4uOGMwNzcwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vS2NvbmZpZwpAQCAtMjQ0LDcgKzI0NCw3IEBACiAKIGNvbmZpZyBIV19SQU5ET01fTVhDX1JOR0EKIAl0cmlzdGF0ZSAiRnJlZXNjYWxlIGkuTVggUk5HQSBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciIKLQlkZXBlbmRzIG9uIEFSQ0hfSEFTX1JOR0EKKwlkZXBlbmRzIG9uIFNPQ19JTVgzMQogCWRlZmF1bHQgSFdfUkFORE9NCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMga2VybmVsLXNpZGUgc3VwcG9ydCBmb3IgdGhlIFJhbmRvbSBOdW1iZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tZW0uYyBiL2RyaXZlcnMvY2hhci9tZW0uYwppbmRleCBhMzMxNjNkLi41YmIxOTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWVtLmMKKysrIGIvZHJpdmVycy9jaGFyL21lbS5jCkBAIC0zODEsNiArMzgxLDkgQEAKIAljaGFyICprYnVmOyAvKiBrLWFkZHIgYmVjYXVzZSB2cmVhZCgpIHRha2VzIHZtbGlzdF9sb2NrIHJ3bG9jayAqLwogCWludCBlcnIgPSAwOwogCisJaWYgKCFwZm5fdmFsaWQoUEZOX0RPV04ocCkpKQorCQlyZXR1cm4gLUVJTzsKKwogCXJlYWQgPSAwOwogCWlmIChwIDwgKHVuc2lnbmVkIGxvbmcpIGhpZ2hfbWVtb3J5KSB7CiAJCWxvd19jb3VudCA9IGNvdW50OwpAQCAtNTA5LDYgKzUxMiw5IEBACiAJY2hhciAqa2J1ZjsgLyogay1hZGRyIGJlY2F1c2UgdndyaXRlKCkgdGFrZXMgdm1saXN0X2xvY2sgcndsb2NrICovCiAJaW50IGVyciA9IDA7CiAKKwlpZiAoIXBmbl92YWxpZChQRk5fRE9XTihwKSkpCisJCXJldHVybiAtRUlPOworCiAJaWYgKHAgPCAodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkpIHsKIAkJdW5zaWduZWQgbG9uZyB0b193cml0ZSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGNvdW50LAogCQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpaGlnaF9tZW1vcnkgLSBwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jIGIvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmMKaW5kZXggMjg3NDAwNC4uOTcyYzQwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmMKKysrIGIvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQlNS0JZVEUoclNsYXZlQ29udHJvbCkpOwogCiAJclNsYXZlQ29udHJvbF9TYXZlID0gclNsYXZlQ29udHJvbDsKLQlyU2xhdmVDb250cm9sLkNvbmZpZ01vZGUgPSBUUlVFOworCXJTbGF2ZUNvbnRyb2wuQ29uZmlnTW9kZSA9IHRydWU7CiAKIAlQUklOVEtfMihUUkFDRV8zNzgwSSwKIAkJIjM3ODBpOjpkc3AzNzgwaV9Xcml0ZUdlbkNmZyBlbnRyeSByU2xhdmVDb250cm9sK0NvbmZpZ01vZGUgJXhcbiIsCkBAIC0xNTUsNyArMTU1LDcgQEAKIAogCU1LQllURShyU2xhdmVDb250cm9sKSA9IEluQnl0ZURzcChEU1BfSXNhU2xhdmVDb250cm9sKTsKIAlyU2xhdmVDb250cm9sX1NhdmUgPSByU2xhdmVDb250cm9sOwotCXJTbGF2ZUNvbnRyb2wuQ29uZmlnTW9kZSA9IFRSVUU7CisJclNsYXZlQ29udHJvbC5Db25maWdNb2RlID0gdHJ1ZTsKIAlPdXRCeXRlRHNwKERTUF9Jc2FTbGF2ZUNvbnRyb2wsIE1LQllURShyU2xhdmVDb250cm9sKSk7CiAJT3V0Qnl0ZURzcChEU1BfQ29uZmlnQWRkcmVzcywgKHVuc2lnbmVkIGNoYXIpIHVJbmRleCk7CiAJdWNWYWx1ZSA9IEluQnl0ZURzcChEU1BfQ29uZmlnRGF0YSk7CkBAIC0yMzAsNyArMjMwLDcgQEAKIAkJCXJVYXJ0Q2ZnMS5CYXNlSU8gPSAzOwogCQkJYnJlYWs7CiAJCX0KLQkJclVhcnRDZmcyLkVuYWJsZSA9IFRSVUU7CisJCXJVYXJ0Q2ZnMi5FbmFibGUgPSB0cnVlOwogCX0KIAogCXJIQnJpZGdlQ2ZnMS5SZXNlcnZlZCA9IHJIQnJpZGdlQ2ZnMi5SZXNlcnZlZCA9IDA7CkBAIC0yMzgsNyArMjM4LDcgQEAKIAlySEJyaWRnZUNmZzEuSXJxUHVsc2UgPSBwU2V0dGluZ3MtPmJEc3BJcnFQdWxzZTsKIAlySEJyaWRnZUNmZzEuSXJxID0gKHVuc2lnbmVkIGNoYXIpIHBJcnFNYXBbcFNldHRpbmdzLT51c0RzcElycV07CiAJckhCcmlkZ2VDZmcxLkFjY2Vzc01vZGUgPSAxOwotCXJIQnJpZGdlQ2ZnMi5FbmFibGUgPSBUUlVFOworCXJIQnJpZGdlQ2ZnMi5FbmFibGUgPSB0cnVlOwogCiAKIAlyQnVzbWFzdGVyQ2ZnMi5SZXNlcnZlZCA9IDA7CkBAIC0yNzgsOCArMjc4LDggQEAKIAkqIHNvZnQtcmVzZXQgYWN0aXZlIGZvciAxMG1zLgogCSovCiAJclNsYXZlQ29udHJvbC5DbG9ja0NvbnRyb2wgPSAwOwotCXJTbGF2ZUNvbnRyb2wuU29mdFJlc2V0ID0gVFJVRTsKLQlyU2xhdmVDb250cm9sLkNvbmZpZ01vZGUgPSBGQUxTRTsKKwlyU2xhdmVDb250cm9sLlNvZnRSZXNldCA9IHRydWU7CisJclNsYXZlQ29udHJvbC5Db25maWdNb2RlID0gZmFsc2U7CiAJclNsYXZlQ29udHJvbC5SZXNlcnZlZCA9IDA7CiAKIAlQUklOVEtfNChUUkFDRV8zNzgwSSwKQEAgLTMwMiw3ICszMDIsNyBAQAogCWZvciAoaSA9IDA7IGkgPCAxMTsgaSsrKQogCQl1ZGVsYXkoMjAwMCk7CiAKLQlyU2xhdmVDb250cm9sLlNvZnRSZXNldCA9IEZBTFNFOworCXJTbGF2ZUNvbnRyb2wuU29mdFJlc2V0ID0gZmFsc2U7CiAJT3V0V29yZERzcChEU1BfSXNhU2xhdmVDb250cm9sLCBNS1dPUkQoclNsYXZlQ29udHJvbCkpOwogCiAJTUtXT1JEKHR2YWwpID0gSW5Xb3JkRHNwKERTUF9Jc2FTbGF2ZUNvbnRyb2wpOwpAQCAtMzI2LDEwICszMjYsMTAgQEAKIAl9CiAKIAotCXJIQnJpZGdlQ29udHJvbC5FbmFibGVEc3BJbnQgPSBGQUxTRTsKLQlySEJyaWRnZUNvbnRyb2wuTWVtQXV0b0luYyA9IFRSVUU7Ci0JckhCcmlkZ2VDb250cm9sLklvQXV0b0luYyA9IEZBTFNFOwotCXJIQnJpZGdlQ29udHJvbC5EaWFnbm9zdGljTW9kZSA9IEZBTFNFOworCXJIQnJpZGdlQ29udHJvbC5FbmFibGVEc3BJbnQgPSBmYWxzZTsKKwlySEJyaWRnZUNvbnRyb2wuTWVtQXV0b0luYyA9IHRydWU7CisJckhCcmlkZ2VDb250cm9sLklvQXV0b0luYyA9IGZhbHNlOworCXJIQnJpZGdlQ29udHJvbC5EaWFnbm9zdGljTW9kZSA9IGZhbHNlOwogCiAJUFJJTlRLXzMoVFJBQ0VfMzc4MEksCiAJCSIzNzgwaTo6ZHNwMzc4MGlfRW5hYmxlRFNQIERTUF9IQnJpZGdlQ29udHJvbCAleCBySEJyaWRnZUNvbnRyb2wgJXhcbiIsCkBAIC0zNDUsNyArMzQ1LDcgQEAKIAlDaGlwSUQgPSBSZWFkTXNhQ2ZnKERTUF9DaGlwSUQpOwogCiAJUFJJTlRLXzIoVFJBQ0VfMzc4MEksCi0JCSIzNzgwaTo6ZHNwMzc4MElfRW5hYmxlRFNQIGV4aXRpbmcgYlJDPVRSVUUsIENoaXBJRCAleFxuIiwKKwkJIjM3ODBpOjpkc3AzNzgwSV9FbmFibGVEU1AgZXhpdGluZyBiUkM9dHJ1ZSwgQ2hpcElEICV4XG4iLAogCQlDaGlwSUQpOwogCiAJcmV0dXJuIDA7CkBAIC0zNjEsOCArMzYxLDggQEAKIAlQUklOVEtfMShUUkFDRV8zNzgwSSwgIjM3ODBpOjpkc3AzNzgwaV9EaXNhYmxlRFNQIGVudHJ5XG4iKTsKIAogCXJTbGF2ZUNvbnRyb2wuQ2xvY2tDb250cm9sID0gMDsKLQlyU2xhdmVDb250cm9sLlNvZnRSZXNldCA9IFRSVUU7Ci0JclNsYXZlQ29udHJvbC5Db25maWdNb2RlID0gRkFMU0U7CisJclNsYXZlQ29udHJvbC5Tb2Z0UmVzZXQgPSB0cnVlOworCXJTbGF2ZUNvbnRyb2wuQ29uZmlnTW9kZSA9IGZhbHNlOwogCXJTbGF2ZUNvbnRyb2wuUmVzZXJ2ZWQgPSAwOwogCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOwogCU91dFdvcmREc3AoRFNQX0lzYVNsYXZlQ29udHJvbCwgTUtXT1JEKHJTbGF2ZUNvbnRyb2wpKTsKQEAgLTM5OCwxNCArMzk4LDE0IEBACiAJUFJJTlRLXzIoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfUmVzZXQgckhCcmlkZ2VDb250cm9sICV4XG4iLAogCQlNS1dPUkQockhCcmlkZ2VDb250cm9sKSk7CiAKLQlySEJyaWRnZUNvbnRyb2wuRW5hYmxlRHNwSW50ID0gRkFMU0U7CisJckhCcmlkZ2VDb250cm9sLkVuYWJsZURzcEludCA9IGZhbHNlOwogCU91dFdvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sLCBNS1dPUkQockhCcmlkZ2VDb250cm9sKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKIAogCS8qIFJlc2V0IHRoZSBjb3JlIHZpYSB0aGUgYm9vdCBkb21haW4gcmVnaXN0ZXIgKi8KLQlyQm9vdERvbWFpbi5SZXNldENvcmUgPSBUUlVFOwotCXJCb290RG9tYWluLkhhbHQgPSBUUlVFOwotCXJCb290RG9tYWluLk5NSSA9IFRSVUU7CisJckJvb3REb21haW4uUmVzZXRDb3JlID0gdHJ1ZTsKKwlyQm9vdERvbWFpbi5IYWx0ID0gdHJ1ZTsKKwlyQm9vdERvbWFpbi5OTUkgPSB0cnVlOwogCXJCb290RG9tYWluLlJlc2VydmVkID0gMDsKIAogCVBSSU5US18yKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX1Jlc2V0IHJCb290RG9tYWluICV4XG4iLApAQCAtNDM4LDI2ICs0MzgsMjYgQEAKIAogCiAJLyogVHJhbnNpdGlvbiB0aGUgY29yZSB0byBhIHJ1bm5pbmcgc3RhdGUgKi8KLQlyQm9vdERvbWFpbi5SZXNldENvcmUgPSBUUlVFOwotCXJCb290RG9tYWluLkhhbHQgPSBGQUxTRTsKLQlyQm9vdERvbWFpbi5OTUkgPSBUUlVFOworCXJCb290RG9tYWluLlJlc2V0Q29yZSA9IHRydWU7CisJckJvb3REb21haW4uSGFsdCA9IGZhbHNlOworCXJCb290RG9tYWluLk5NSSA9IHRydWU7CiAJckJvb3REb21haW4uUmVzZXJ2ZWQgPSAwOwogCVdyaXRlTXNhQ2ZnKERTUF9Nc3BCb290RG9tYWluLCBNS1dPUkQockJvb3REb21haW4pKTsKIAogCXVkZWxheSg1KTsKIAotCXJCb290RG9tYWluLlJlc2V0Q29yZSA9IEZBTFNFOworCXJCb290RG9tYWluLlJlc2V0Q29yZSA9IGZhbHNlOwogCVdyaXRlTXNhQ2ZnKERTUF9Nc3BCb290RG9tYWluLCBNS1dPUkQockJvb3REb21haW4pKTsKIAl1ZGVsYXkoNSk7CiAKLQlyQm9vdERvbWFpbi5OTUkgPSBGQUxTRTsKKwlyQm9vdERvbWFpbi5OTUkgPSBmYWxzZTsKIAlXcml0ZU1zYUNmZyhEU1BfTXNwQm9vdERvbWFpbiwgTUtXT1JEKHJCb290RG9tYWluKSk7CiAJdWRlbGF5KDUpOwogCiAJLyogRW5hYmxlIERTUCB0byBQQyBpbnRlcnJ1cHQgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKIAlNS1dPUkQockhCcmlkZ2VDb250cm9sKSA9IEluV29yZERzcChEU1BfSEJyaWRnZUNvbnRyb2wpOwotCXJIQnJpZGdlQ29udHJvbC5FbmFibGVEc3BJbnQgPSBUUlVFOworCXJIQnJpZGdlQ29udHJvbC5FbmFibGVEc3BJbnQgPSB0cnVlOwogCiAJUFJJTlRLXzIoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfUnVuIHJIQnJpZGdlQ29udHJvbCAleFxuIiwKIAkJTUtXT1JEKHJIQnJpZGdlQ29udHJvbCkpOwpAQCAtNDY2LDcgKzQ2Niw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKIAogCi0JUFJJTlRLXzEoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfUnVuIGV4aXQgYlJDPVRSVUVcbiIpOworCVBSSU5US18xKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX1J1biBleGl0IGJSQz10cnVlXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTA4LDcgKzUwOCw3IEBACiAKIAogCVBSSU5US18xKFRSQUNFXzM3ODBJLAotCQkiMzc4MEk6OmRzcDM3ODBJX1JlYWREU3RvcmUgZXhpdCBiUkM9VFJVRVxuIik7CisJCSIzNzgwSTo6ZHNwMzc4MElfUmVhZERTdG9yZSBleGl0IGJSQz10cnVlXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTUwLDcgKzU1MCw3IEBACiAKIAogCVBSSU5US18xKFRSQUNFXzM3ODBJLAotCQkiMzc4MEk6OmRzcDM3ODBJX1JlYWRBbmRDbGVhckRTdG9yZSBleGl0IGJSQz1UUlVFXG4iKTsKKwkJIjM3ODBJOjpkc3AzNzgwSV9SZWFkQW5kQ2xlYXJEU3RvcmUgZXhpdCBiUkM9dHJ1ZVxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU5Miw3ICs1OTIsNyBAQAogCiAKIAlQUklOVEtfMShUUkFDRV8zNzgwSSwKLQkJIjM3ODBJOjpkc3AzNzgwRF9Xcml0ZURTdG9yZSBleGl0IGJSQz1UUlVFXG4iKTsKKwkJIjM3ODBJOjpkc3AzNzgwRF9Xcml0ZURTdG9yZSBleGl0IGJSQz10cnVlXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjQwLDcgKzY0MCw3IEBACiAJfQogCiAJUFJJTlRLXzEoVFJBQ0VfMzc4MEksCi0JCSIzNzgwSTo6ZHNwMzc4MElfUmVhZElTdG9yZSBleGl0IGJSQz1UUlVFXG4iKTsKKwkJIjM3ODBJOjpkc3AzNzgwSV9SZWFkSVN0b3JlIGV4aXQgYlJDPXRydWVcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02ODksNyArNjg5LDcgQEAKIAl9CiAKIAlQUklOVEtfMShUUkFDRV8zNzgwSSwKLQkJIjM3ODBJOjpkc3AzNzgwSV9Xcml0ZUlTdG9yZSBleGl0IGJSQz1UUlVFXG4iKTsKKwkJIjM3ODBJOjpkc3AzNzgwSV9Xcml0ZUlTdG9yZSBleGl0IGJSQz10cnVlXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzEzLDcgKzcxMyw3IEBACiAJKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKIAlNS1dPUkQockhCcmlkZ2VDb250cm9sKSA9IEluV29yZERzcChEU1BfSEJyaWRnZUNvbnRyb2wpOwotCXJIQnJpZGdlQ29udHJvbC5FbmFibGVEc3BJbnQgPSBGQUxTRTsKKwlySEJyaWRnZUNvbnRyb2wuRW5hYmxlRHNwSW50ID0gZmFsc2U7CiAJT3V0V29yZERzcChEU1BfSEJyaWRnZUNvbnRyb2wsIE1LV09SRChySEJyaWRnZUNvbnRyb2wpKTsKIAogCSpwdXNJUENTb3VyY2UgPSBJbldvcmREc3AoRFNQX0ludGVycnVwdCk7CkBAIC03MjUsNyArNzI1LDcgQEAKIAogCU91dFdvcmREc3AoRFNQX0ludGVycnVwdCwgKHVuc2lnbmVkIHNob3J0KSB+KCpwdXNJUENTb3VyY2UpKTsKIAotCXJIQnJpZGdlQ29udHJvbC5FbmFibGVEc3BJbnQgPSBUUlVFOworCXJIQnJpZGdlQ29udHJvbC5FbmFibGVEc3BJbnQgPSB0cnVlOwogCU91dFdvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sLCBNS1dPUkQockhCcmlkZ2VDb250cm9sKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmggYi9kcml2ZXJzL2NoYXIvbXdhdmUvMzc4MGkuaAppbmRleCBmYmE2YWIxLi45Y2NiNmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXdhdmUvMzc4MGkuaAorKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvMzc4MGkuaApAQCAtMTAxLDcgKzEwMSw3IEBACiB9IERTUF9VQVJUX0NGR18xOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgY2hhciBFbmFibGU6MTsJLyogUlc6IEVuYWJsZSBJL08gYW5kIElSUTogMD1GQUxTRSwgMT1UUlVFICovCisJdW5zaWduZWQgY2hhciBFbmFibGU6MTsJLyogUlc6IEVuYWJsZSBJL08gYW5kIElSUTogMD1mYWxzZSwgMT10cnVlICovCiAJdW5zaWduZWQgY2hhciBSZXNlcnZlZDo3OwkvKiAwOiBSZXNlcnZlZCAqLwogfSBEU1BfVUFSVF9DRkdfMjsKIApAQCAtMTE0LDcgKzExNCw3IEBACiB9IERTUF9IQlJJREdFX0NGR18xOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgY2hhciBFbmFibGU6MTsJLyogUlc6IGVuYWJsZSBJL08gYW5kIElSUTogMD1GQUxTRSwgMT1UUlVFICovCisJdW5zaWduZWQgY2hhciBFbmFibGU6MTsJLyogUlc6IGVuYWJsZSBJL08gYW5kIElSUTogMD1mYWxzZSwgMT10cnVlICovCiAJdW5zaWduZWQgY2hhciBSZXNlcnZlZDo3OwkvKiAwOiBSZXNlcnZlZCAqLwogfSBEU1BfSEJSSURHRV9DRkdfMjsKIApAQCAtMTMzLDEyICsxMzMsMTIgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgY2hhciBHYXRlSU9DSFJEWToxOwkvKiBSVzogRW5hYmxlIElPQ0hSRFkgZ2F0aW5nOiAwPUZBTFNFLCAxPVRSVUUgKi8KKwl1bnNpZ25lZCBjaGFyIEdhdGVJT0NIUkRZOjE7CS8qIFJXOiBFbmFibGUgSU9DSFJEWSBnYXRpbmc6IDA9ZmFsc2UsIDE9dHJ1ZSAqLwogCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ6NzsJLyogMDogUmVzZXJ2ZWQgKi8KIH0gRFNQX0lTQV9QUk9UX0NGRzsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGNoYXIgRW5hYmxlOjE7CS8qIFJXOiBFbmFibGUgbG93IHBvd2VyIHN1c3BlbmQvcmVzdW1lIDA9RkFMU0UsIDE9VFJVRSAqLworCXVuc2lnbmVkIGNoYXIgRW5hYmxlOjE7CS8qIFJXOiBFbmFibGUgbG93IHBvd2VyIHN1c3BlbmQvcmVzdW1lIDA9ZmFsc2UsIDE9dHJ1ZSAqLwogCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ6NzsJLyogMDogUmVzZXJ2ZWQgKi8KIH0gRFNQX1BPV0VSX01HTVRfQ0ZHOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5jIGIvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuYwppbmRleCAxNjQ1NDRhLi4zYTNmZjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5jCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmMKQEAgLTI5Niw4ICsyOTYsOCBAQAogCQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0udXNJbnRDb3VudCk7CiAKIAkJCW11dGV4X2xvY2soJm13YXZlX211dGV4KTsKLQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzSGVyZSA9IEZBTFNFOwotCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNFbmFibGVkID0gVFJVRTsKKwkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzSGVyZSA9IGZhbHNlOworCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNFbmFibGVkID0gdHJ1ZTsKIAkJCW11dGV4X3VubG9jaygmbXdhdmVfbXV0ZXgpOwogCQogCQkJUFJJTlRLXzIoVFJBQ0VfTVdBVkUsCkBAIC0zMjQsNyArMzI0LDcgQEAKIAkJCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLnVzSW50Q291bnQpOwogCQogCQkJbXV0ZXhfbG9jaygmbXdhdmVfbXV0ZXgpOwotCQkJaWYgKHBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzRW5hYmxlZCA9PSBUUlVFKSB7CisJCQlpZiAocERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNFbmFibGVkID09IHRydWUpIHsKIAkJCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAogCQkJCVBSSU5US18yKFRSQUNFX01XQVZFLApAQCAtMzMyLDcgKzMzMiw3IEBACiAJCQkJCSIgaXBjICV4IGdvaW5nIHRvIHNsZWVwXG4iLAogCQkJCQlpcGNudW0pOwogCQkJCWFkZF93YWl0X3F1ZXVlKCZwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmlwY193YWl0X3F1ZXVlLCAmd2FpdCk7Ci0JCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNIZXJlID0gVFJVRTsKKwkJCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0hlcmUgPSB0cnVlOwogCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCQkJLyogY2hlY2sgd2hldGhlciBhbiBldmVudCB3YXMgc2lnbmFsbGVkIGJ5ICovCiAJCQkJLyogdGhlIGludGVycnVwdCBoYW5kbGVyIHdoaWxlIHdlIHdlcmUgZ29uZSAqLwpAQCAtMzU1LDcgKzM1NSw3IEBACiAJCQkJCQkiIGFwcGxpY2F0aW9uXG4iLAogCQkJCQkJaXBjbnVtKTsKIAkJCQl9Ci0JCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNIZXJlID0gRkFMU0U7CisJCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNIZXJlID0gZmFsc2U7CiAJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBEcnZEYXRhLT5JUENzW2lwY251bV0uaXBjX3dhaXRfcXVldWUsICZ3YWl0KTsKIAkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCQkJCVBSSU5US18yKFRSQUNFX01XQVZFLApAQCAtMzg0LDkgKzM4NCw5IEBACiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQltdXRleF9sb2NrKCZtd2F2ZV9tdXRleCk7Ci0JCQlpZiAocERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNFbmFibGVkID09IFRSVUUpIHsKLQkJCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0VuYWJsZWQgPSBGQUxTRTsKLQkJCQlpZiAocERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNIZXJlID09IFRSVUUpIHsKKwkJCWlmIChwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0VuYWJsZWQgPT0gdHJ1ZSkgeworCQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzRW5hYmxlZCA9IGZhbHNlOworCQkJCWlmIChwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0hlcmUgPT0gdHJ1ZSkgewogCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBEcnZEYXRhLT5JUENzW2lwY251bV0uaXBjX3dhaXRfcXVldWUpOwogCQkJCX0KIAkJCX0KQEAgLTU0MSw3ICs1NDEsNyBAQAogCiAJaWYgKHBEcnZEYXRhLT5kZXZpY2VfcmVnaXN0ZXJlZCkgewogCQlkZXZpY2VfdW5yZWdpc3RlcigmbXdhdmVfZGV2aWNlKTsKLQkJcERydkRhdGEtPmRldmljZV9yZWdpc3RlcmVkID0gRkFMU0U7CisJCXBEcnZEYXRhLT5kZXZpY2VfcmVnaXN0ZXJlZCA9IGZhbHNlOwogCX0KICNlbmRpZgogCkBAIC01NzYsMTYgKzU3NiwxNiBAQAogCiAJbWVtc2V0KCZtd2F2ZV9zX21kZCwgMCwgc2l6ZW9mKE1XQVZFX0RFVklDRV9EQVRBKSk7CiAKLQlwRHJ2RGF0YS0+YkJESW5pdGlhbGl6ZWQgPSBGQUxTRTsKLQlwRHJ2RGF0YS0+YlJlc291cmNlc0NsYWltZWQgPSBGQUxTRTsKLQlwRHJ2RGF0YS0+YkRTUEVuYWJsZWQgPSBGQUxTRTsKLQlwRHJ2RGF0YS0+YkRTUFJlc2V0ID0gRkFMU0U7Ci0JcERydkRhdGEtPmJNd2F2ZURldlJlZ2lzdGVyZWQgPSBGQUxTRTsKKwlwRHJ2RGF0YS0+YkJESW5pdGlhbGl6ZWQgPSBmYWxzZTsKKwlwRHJ2RGF0YS0+YlJlc291cmNlc0NsYWltZWQgPSBmYWxzZTsKKwlwRHJ2RGF0YS0+YkRTUEVuYWJsZWQgPSBmYWxzZTsKKwlwRHJ2RGF0YS0+YkRTUFJlc2V0ID0gZmFsc2U7CisJcERydkRhdGEtPmJNd2F2ZURldlJlZ2lzdGVyZWQgPSBmYWxzZTsKIAlwRHJ2RGF0YS0+c0xpbmUgPSAtMTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBEcnZEYXRhLT5JUENzKTsgaSsrKSB7Ci0JCXBEcnZEYXRhLT5JUENzW2ldLmJJc0VuYWJsZWQgPSBGQUxTRTsKLQkJcERydkRhdGEtPklQQ3NbaV0uYklzSGVyZSA9IEZBTFNFOworCQlwRHJ2RGF0YS0+SVBDc1tpXS5iSXNFbmFibGVkID0gZmFsc2U7CisJCXBEcnZEYXRhLT5JUENzW2ldLmJJc0hlcmUgPSBmYWxzZTsKIAkJcERydkRhdGEtPklQQ3NbaV0udXNJbnRDb3VudCA9IDA7CS8qIG5vIGludHMgcmVjZWl2ZWQgeWV0ICovCiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBEcnZEYXRhLT5JUENzW2ldLmlwY193YWl0X3F1ZXVlKTsKIAl9CkBAIC02MDEsNyArNjAxLDcgQEAKIAkJCQkiIEZhaWxlZCB0byBpbml0aWFsaXplIGJvYXJkIGRhdGFcbiIpOwogCQlnb3RvIGNsZWFudXBfZXJyb3I7CiAJfQotCXBEcnZEYXRhLT5iQkRJbml0aWFsaXplZCA9IFRSVUU7CisJcERydkRhdGEtPmJCREluaXRpYWxpemVkID0gdHJ1ZTsKIAogCXJldHZhbCA9IHRwMzc4MElfQ2FsY1Jlc291cmNlcygmcERydkRhdGEtPnJCRERhdGEpOwogCVBSSU5US18yKFRSQUNFX01XQVZFLApAQCAtNjI2LDcgKzYyNiw3IEBACiAJCQkJIiBGYWlsZWQgdG8gY2xhaW0gcmVzb3VyY2VzXG4iKTsKIAkJZ290byBjbGVhbnVwX2Vycm9yOwogCX0KLQlwRHJ2RGF0YS0+YlJlc291cmNlc0NsYWltZWQgPSBUUlVFOworCXBEcnZEYXRhLT5iUmVzb3VyY2VzQ2xhaW1lZCA9IHRydWU7CiAKIAlyZXR2YWwgPSB0cDM3ODBJX0VuYWJsZURTUCgmcERydkRhdGEtPnJCRERhdGEpOwogCVBSSU5US18yKFRSQUNFX01XQVZFLApAQCAtNjM5LDcgKzYzOSw3IEBACiAJCQkJIiBGYWlsZWQgdG8gZW5hYmxlIERTUFxuIik7CiAJCWdvdG8gY2xlYW51cF9lcnJvcjsKIAl9Ci0JcERydkRhdGEtPmJEU1BFbmFibGVkID0gVFJVRTsKKwlwRHJ2RGF0YS0+YkRTUEVuYWJsZWQgPSB0cnVlOwogCiAJaWYgKG1pc2NfcmVnaXN0ZXIoJm13YXZlX21pc2NfZGV2KSA8IDApIHsKIAkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCkBAIC02NDcsNyArNjQ3LDcgQEAKIAkJCQkiIEZhaWxlZCB0byByZWdpc3RlciBtaXNjIGRldmljZVxuIik7CiAJCWdvdG8gY2xlYW51cF9lcnJvcjsKIAl9Ci0JcERydkRhdGEtPmJNd2F2ZURldlJlZ2lzdGVyZWQgPSBUUlVFOworCXBEcnZEYXRhLT5iTXdhdmVEZXZSZWdpc3RlcmVkID0gdHJ1ZTsKIAogCXBEcnZEYXRhLT5zTGluZSA9IHJlZ2lzdGVyX3NlcmlhbF9wb3J0YW5kaXJxKAogCQlwRHJ2RGF0YS0+ckJERGF0YS5yRHNwU2V0dGluZ3MudXNVYXJ0QmFzZUlPLApAQCAtNjY4LDcgKzY2OCw3IEBACiAKIAlpZiAoZGV2aWNlX3JlZ2lzdGVyKCZtd2F2ZV9kZXZpY2UpKQogCQlnb3RvIGNsZWFudXBfZXJyb3I7Ci0JcERydkRhdGEtPmRldmljZV9yZWdpc3RlcmVkID0gVFJVRTsKKwlwRHJ2RGF0YS0+ZGV2aWNlX3JlZ2lzdGVyZWQgPSB0cnVlOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG13YXZlX2Rldl9hdHRycyk7IGkrKykgewogCQlpZihkZXZpY2VfY3JlYXRlX2ZpbGUoJm13YXZlX2RldmljZSwgbXdhdmVfZGV2X2F0dHJzW2ldKSkgewogCQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5oIGIvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuaAppbmRleCA3ZTBkNTMwLi4zN2UwYTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5oCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmgKQEAgLTEyNSw4ICsxMjUsOCBAQAogCiB0eXBlZGVmIHN0cnVjdCBfTVdBVkVfSVBDIHsKIAl1bnNpZ25lZCBzaG9ydCB1c0ludENvdW50OwkvKiAwPW5vbmUsIDE9Zmlyc3QsIDI9Z3JlYXRlciB0aGFuIDFzdCAqLwotCUJPT0xFQU4gYklzRW5hYmxlZDsKLQlCT09MRUFOIGJJc0hlcmU7CisJYm9vbCBiSXNFbmFibGVkOworCWJvb2wgYklzSGVyZTsKIAkvKiBlbnRyeSBzcGluIGxvY2sgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBpcGNfd2FpdF9xdWV1ZTsKIH0gTVdBVkVfSVBDOwpAQCAtMTM1LDEyICsxMzUsMTIgQEAKIAlUSElOS1BBRF9CRF9EQVRBIHJCRERhdGE7CS8qIGJvYXJkIGRyaXZlcidzIGRhdGEgYXJlYSAqLwogCXVuc2lnbmVkIGxvbmcgdWxJUENTb3VyY2VfSVNSOwkvKiBJUEMgc291cmNlIGJpdHMgZm9yIHJlY2VudGx5IHByb2Nlc3NlZCBpbnRyLCBzZXQgZHVyaW5nIElTUiBwcm9jZXNzaW5nICovCiAJdW5zaWduZWQgbG9uZyB1bElQQ1NvdXJjZV9EUEM7CS8qIElQQyBzb3VyY2UgYml0cyBmb3IgcmVjZW50bHkgcHJvY2Vzc2VkIGludHIsIHNldCBkdXJpbmcgRFBDIHByb2Nlc3NpbmcgKi8KLQlCT09MRUFOIGJCREluaXRpYWxpemVkOwotCUJPT0xFQU4gYlJlc291cmNlc0NsYWltZWQ7Ci0JQk9PTEVBTiBiRFNQRW5hYmxlZDsKLQlCT09MRUFOIGJEU1BSZXNldDsKKwlib29sIGJCREluaXRpYWxpemVkOworCWJvb2wgYlJlc291cmNlc0NsYWltZWQ7CisJYm9vbCBiRFNQRW5hYmxlZDsKKwlib29sIGJEU1BSZXNldDsKIAlNV0FWRV9JUEMgSVBDc1sxNl07Ci0JQk9PTEVBTiBiTXdhdmVEZXZSZWdpc3RlcmVkOworCWJvb2wgYk13YXZlRGV2UmVnaXN0ZXJlZDsKIAlzaG9ydCBzTGluZTsKIAlpbnQgbnJfcmVnaXN0ZXJlZF9hdHRyczsKIAlpbnQgZGV2aWNlX3JlZ2lzdGVyZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvc21hcGkuYyBiL2RyaXZlcnMvY2hhci9td2F2ZS9zbWFwaS5jCmluZGV4IDYxODdmZDEuLjhjNTQxMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9td2F2ZS9zbWFwaS5jCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS9zbWFwaS5jCkBAIC00OTMsNyArNDkzLDcgQEAKIH0KIAogCi1pbnQgc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShCT09MRUFOIGJPbikKK2ludCBzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKGJvb2wgYk9uKQogewogCWludCBiUkMgPSAtRUlPOwogCXVuc2lnbmVkIHNob3J0IHVzQVgsIHVzQlgsIHVzQ1gsIHVzRFgsIHVzREksIHVzU0k7CkBAIC01NTYsNyArNTU2LDcgQEAKIAkJCVBSSU5US19FUlJPUigic21hcGk6OnNtYXBpX2luaXQsIEVSUk9SIHVuYWJsZSB0byByZWFkIGZyb20gU01BUEkgcG9ydFxuIik7CiAJCX0gZWxzZSB7CiAJCQlQUklOVEtfMihUUkFDRV9TTUFQSSwKLQkJCQkic21hcGk6OnNtYXBpX2luaXQsIGV4aXQgVFJVRSBnX3VzU21hcGlQb3J0ICV4XG4iLAorCQkJCSJzbWFwaTo6c21hcGlfaW5pdCwgZXhpdCB0cnVlIGdfdXNTbWFwaVBvcnQgJXhcbiIsCiAJCQkJZ191c1NtYXBpUG9ydCk7CiAJCQlyZXR2YWwgPSAwOwogCQkJLy9TbWFwaVF1ZXJ5U3lzdGVtSUQoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS9zbWFwaS5oIGIvZHJpdmVycy9jaGFyL213YXZlL3NtYXBpLmgKaW5kZXggNjRiMmVjMS4uZWJjMjA2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL213YXZlL3NtYXBpLmgKKysrIGIvZHJpdmVycy9jaGFyL213YXZlL3NtYXBpLmgKQEAgLTQ5LDEwICs0OSw2IEBACiAjaWZuZGVmIF9MSU5VWF9TTUFQSV9ICiAjZGVmaW5lIF9MSU5VWF9TTUFQSV9ICiAKLSNkZWZpbmUgVFJVRSAxCi0jZGVmaW5lIEZBTFNFIDAKLSNkZWZpbmUgQk9PTEVBTiBpbnQKLQogdHlwZWRlZiBzdHJ1Y3QgewogCWludCBiRFNQUHJlc2VudDsKIAlpbnQgYkRTUEVuYWJsZWQ7CkBAIC03NCw3ICs3MCw3IEBACiBpbnQgc21hcGlfaW5pdCh2b2lkKTsKIGludCBzbWFwaV9xdWVyeV9EU1BfY2ZnKFNNQVBJX0RTUF9TRVRUSU5HUyAqIHBTZXR0aW5ncyk7CiBpbnQgc21hcGlfc2V0X0RTUF9jZmcodm9pZCk7Ci1pbnQgc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShCT09MRUFOIGJPbik7CitpbnQgc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShib29sIGJPbik7CiAKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvdHAzNzgwaS5jIGIvZHJpdmVycy9jaGFyL213YXZlL3RwMzc4MGkuYwppbmRleCAwNGU2ZDZhLi41ZTE2MThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXdhdmUvdHAzNzgwaS5jCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS90cDM3ODBpLmMKQEAgLTgwLDEzICs4MCwxMyBAQAogCVdyaXRlTXNhQ2ZnKERTUF9HcGlvTW9kZUNvbnRyb2xfMTVfOCwgTUtXT1JEKHJHcGlvTW9kZSkpOwogCiAJTUtXT1JEKHJHcGlvRHJpdmVyRW5hYmxlKSA9IDA7Ci0JckdwaW9Ecml2ZXJFbmFibGUuRW5hYmxlMTAgPSBUUlVFOwotCXJHcGlvRHJpdmVyRW5hYmxlLk1hc2sxMCA9IFRSVUU7CisJckdwaW9Ecml2ZXJFbmFibGUuRW5hYmxlMTAgPSB0cnVlOworCXJHcGlvRHJpdmVyRW5hYmxlLk1hc2sxMCA9IHRydWU7CiAJV3JpdGVNc2FDZmcoRFNQX0dwaW9Ecml2ZXJFbmFibGVfMTVfOCwgTUtXT1JEKHJHcGlvRHJpdmVyRW5hYmxlKSk7CiAKIAlNS1dPUkQockdwaW9PdXRwdXREYXRhKSA9IDA7CiAJckdwaW9PdXRwdXREYXRhLkxhdGNoMTAgPSAwOwotCXJHcGlvT3V0cHV0RGF0YS5NYXNrMTAgPSBUUlVFOworCXJHcGlvT3V0cHV0RGF0YS5NYXNrMTAgPSB0cnVlOwogCVdyaXRlTXNhQ2ZnKERTUF9HcGlvT3V0cHV0RGF0YV8xNV84LCBNS1dPUkQockdwaW9PdXRwdXREYXRhKSk7CiAKIAlQUklOVEtfMShUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6RW5hYmxlU1JBTSBleGl0XG4iKTsKQEAgLTEyNyw3ICsxMjcsNyBAQAogCQkJCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCiAJCQkJCSJ0cDM3ODBpOjpEc3BJbnRlcnJ1cHQgdXNJbnRDb3VudCAleFxuIiwKIAkJCQkJcERydkRhdGEtPklQQ3NbdXNQQ051bSAtIDFdLnVzSW50Q291bnQpOwotCQkJCWlmIChwRHJ2RGF0YS0+SVBDc1t1c1BDTnVtIC0gMV0uYklzRW5hYmxlZCA9PSBUUlVFKSB7CisJCQkJaWYgKHBEcnZEYXRhLT5JUENzW3VzUENOdW0gLSAxXS5iSXNFbmFibGVkID09IHRydWUpIHsKIAkJCQkJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwKIAkJCQkJCSJ0cDM3ODBpOjpEc3BJbnRlcnJ1cHQsIHdha2luZyB1cCB1c1BDTnVtICV4XG4iLAogCQkJCQkJdXNQQ051bSAtIDEpOwpAQCAtMTYwLDggKzE2MCw4IEBACiAKIAlQUklOVEtfMihUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6dHAzNzgwSV9Jbml0aWFsaXplQm9hcmREYXRhIGVudHJ5IHBCRERhdGEgJXBcbiIsIHBCRERhdGEpOwogCi0JcEJERGF0YS0+YkRTUEVuYWJsZWQgPSBGQUxTRTsKLQlwU2V0dGluZ3MtPmJJbnRlcnJ1cHRDbGFpbWVkID0gRkFMU0U7CisJcEJERGF0YS0+YkRTUEVuYWJsZWQgPSBmYWxzZTsKKwlwU2V0dGluZ3MtPmJJbnRlcnJ1cHRDbGFpbWVkID0gZmFsc2U7CiAKIAlyZXR2YWwgPSBzbWFwaV9pbml0KCk7CiAJaWYgKHJldHZhbCkgewpAQCAtMjY5LDcgKzI2OSw3IEBACiAKIAlpZiAocFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCkgewogCQlmcmVlX2lycShwU2V0dGluZ3MtPnVzRHNwSXJxLCBOVUxMKTsKLQkJcFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCA9IEZBTFNFOworCQlwU2V0dGluZ3MtPmJJbnRlcnJ1cHRDbGFpbWVkID0gZmFsc2U7CiAJfQogCiAJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwKQEAgLTI4Myw3ICsyODMsNyBAQAogaW50IHRwMzc4MElfRW5hYmxlRFNQKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKQogewogCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwQkREYXRhLT5yRHNwU2V0dGluZ3M7Ci0JQk9PTEVBTiBiRFNQUG93ZXJlZFVwID0gRkFMU0UsIGJJbnRlcnJ1cHRBbGxvY2F0ZWQgPSBGQUxTRTsKKwlib29sIGJEU1BQb3dlcmVkVXAgPSBmYWxzZSwgYkludGVycnVwdEFsbG9jYXRlZCA9IGZhbHNlOwogCiAJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OnRwMzc4MElfRW5hYmxlRFNQIGVudHJ5IHBCRERhdGEgJXBcbiIsIHBCRERhdGEpOwogCkBAIC0zMzYsMTQgKzMzNiwxNCBAQAogCQl9CiAJfQogCi0JcFNldHRpbmdzLT5iRHNwSXJxQWN0aXZlTG93ID0gcFNldHRpbmdzLT5iRHNwSXJxUHVsc2UgPSBUUlVFOwotCXBTZXR0aW5ncy0+YlVhcnRJcnFBY3RpdmVMb3cgPSBwU2V0dGluZ3MtPmJVYXJ0SXJxUHVsc2UgPSBUUlVFOworCXBTZXR0aW5ncy0+YkRzcElycUFjdGl2ZUxvdyA9IHBTZXR0aW5ncy0+YkRzcElycVB1bHNlID0gdHJ1ZTsKKwlwU2V0dGluZ3MtPmJVYXJ0SXJxQWN0aXZlTG93ID0gcFNldHRpbmdzLT5iVWFydElycVB1bHNlID0gdHJ1ZTsKIAogCWlmIChwQkREYXRhLT5iU2hhcmVEc3BJcnEpIHsKLQkJcFNldHRpbmdzLT5iRHNwSXJxQWN0aXZlTG93ID0gRkFMU0U7CisJCXBTZXR0aW5ncy0+YkRzcElycUFjdGl2ZUxvdyA9IGZhbHNlOwogCX0KIAlpZiAocEJERGF0YS0+YlNoYXJlVWFydElycSkgewotCQlwU2V0dGluZ3MtPmJVYXJ0SXJxQWN0aXZlTG93ID0gRkFMU0U7CisJCXBTZXR0aW5ncy0+YlVhcnRJcnFBY3RpdmVMb3cgPSBmYWxzZTsKIAl9CiAKIAlwU2V0dGluZ3MtPnVzTnVtVHJhbnNmZXJzID0gVFBfQ0ZHX051bVRyYW5zZmVyczsKQEAgLTM3MywxNiArMzczLDE2IEBACiAJCVBSSU5US18zKFRSQUNFX1RQMzc4MEksCiAJCQkidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1AsIGdvdCBpbnRlcnJ1cHQgJXggYlNoYXJlRHNwSXJxICV4XG4iLAogCQkJcFNldHRpbmdzLT51c0RzcElycSwgcEJERGF0YS0+YlNoYXJlRHNwSXJxKTsKLQkJYkludGVycnVwdEFsbG9jYXRlZCA9IFRSVUU7Ci0JCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBUUlVFOworCQliSW50ZXJydXB0QWxsb2NhdGVkID0gdHJ1ZTsKKwkJcFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCA9IHRydWU7CiAJfQogCi0Jc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShGQUxTRSk7Ci0JaWYgKHNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUoVFJVRSkpIHsKLQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogRXJyb3I6IHNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUoVFJVRSkgZmFpbGVkXG4iKTsKKwlzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKGZhbHNlKTsKKwlpZiAoc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZSh0cnVlKSkgeworCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUgInRwMzc4MGk6OnRwMzc4MElfRW5hYmxlRFNQOiBFcnJvcjogc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZSh0cnVlKSBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXRfY2xlYW51cDsKIAl9IGVsc2UgewotCQliRFNQUG93ZXJlZFVwID0gVFJVRTsKKwkJYkRTUFBvd2VyZWRVcCA9IHRydWU7CiAJfQogCiAJaWYgKGRzcDM3ODBJX0VuYWJsZURTUChwU2V0dGluZ3MsIHNfYXVzVGhpbmtwYWRJcnFUb0ZpZWxkLCBzX2F1c1RoaW5rcGFkRG1hVG9GaWVsZCkpIHsKQEAgLTM5Miw3ICszOTIsNyBAQAogCiAJRW5hYmxlU1JBTShwQkREYXRhKTsKIAotCXBCRERhdGEtPmJEU1BFbmFibGVkID0gVFJVRTsKKwlwQkREYXRhLT5iRFNQRW5hYmxlZCA9IHRydWU7CiAKIAlQUklOVEtfMShUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1AgZXhpdFxuIik7CiAKQEAgLTQwMSwxMCArNDAxLDEwIEBACiBleGl0X2NsZWFudXA6CiAJUFJJTlRLX0VSUk9SKCJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogQ2xlYW5pbmcgdXBcbiIpOwogCWlmIChiRFNQUG93ZXJlZFVwKQotCQlzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKEZBTFNFKTsKKwkJc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShmYWxzZSk7CiAJaWYgKGJJbnRlcnJ1cHRBbGxvY2F0ZWQpIHsKIAkJZnJlZV9pcnEocFNldHRpbmdzLT51c0RzcElycSwgTlVMTCk7Ci0JCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBGQUxTRTsKKwkJcFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCA9IGZhbHNlOwogCX0KIAlyZXR1cm4gLUVJTzsKIH0KQEAgLTQyMSwxMCArNDIxLDEwIEBACiAJCWRzcDM3ODBJX0Rpc2FibGVEU1AoJnBCRERhdGEtPnJEc3BTZXR0aW5ncyk7CiAJCWlmIChwU2V0dGluZ3MtPmJJbnRlcnJ1cHRDbGFpbWVkKSB7CiAJCQlmcmVlX2lycShwU2V0dGluZ3MtPnVzRHNwSXJxLCBOVUxMKTsKLQkJCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBGQUxTRTsKKwkJCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBmYWxzZTsKIAkJfQotCQlzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKEZBTFNFKTsKLQkJcEJERGF0YS0+YkRTUEVuYWJsZWQgPSBGQUxTRTsKKwkJc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShmYWxzZSk7CisJCXBCRERhdGEtPmJEU1BFbmFibGVkID0gZmFsc2U7CiAJfQogCiAJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OnRwMzc4MElfRGlzYWJsZURTUCBleGl0IHJldHZhbCAleFxuIiwgcmV0dmFsKTsKQEAgLTUxNiw3ICs1MTYsNyBAQAogCWludCByZXR2YWwgPSAwOwogCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwQkREYXRhLT5yRHNwU2V0dGluZ3M7CiAJdW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8gPSBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPOwotCUJPT0xFQU4gYlJDID0gMDsKKwlib29sIGJSQyA9IDA7CiAKIAlQUklOVEtfNihUUkFDRV9UUDM3ODBJLAogCQkidHAzNzgwaTo6dHAzNzgwSV9SZWFkV3JpdGVEc3BEU3RvcmUgZW50cnkgcEJERGF0YSAlcCwgdU9wY29kZSAleCwgcHZCdWZmZXIgJXAsIHVDb3VudCAleCwgdWxEU1BBZGRyICVseFxuIiwKQEAgLTU1Miw3ICs1NTIsNyBAQAogCWludCByZXR2YWwgPSAwOwogCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwQkREYXRhLT5yRHNwU2V0dGluZ3M7CiAJdW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8gPSBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPOwotCUJPT0xFQU4gYlJDID0gMDsKKwlib29sIGJSQyA9IDA7CiAKIAlQUklOVEtfNihUUkFDRV9UUDM3ODBJLAogCQkidHAzNzgwaTo6dHAzNzgwSV9SZWFkV3JpdGVEc3BJU3RvcmUgZW50cnkgcEJERGF0YSAlcCwgdU9wY29kZSAleCwgcHZCdWZmZXIgJXAsIHVDb3VudCAleCwgdWxEU1BBZGRyICVseFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wcGRldi5jIGIvZHJpdmVycy9jaGFyL3BwZGV2LmMKaW5kZXggZjhhNDgzYy4uZDIzMzY4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3BwZGV2LmMKKysrIGIvZHJpdmVycy9jaGFyL3BwZGV2LmMKQEAgLTI4Niw3ICsyODYsNyBAQAogCXN0cnVjdCBwYXJwb3J0ICpwb3J0OwogCXN0cnVjdCBwYXJkZXZpY2UgKnBkZXYgPSBOVUxMOwogCWNoYXIgKm5hbWU7Ci0JaW50IGZsOworCXN0cnVjdCBwYXJkZXZfY2IgcHBkZXZfY2I7CiAKIAluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsIENIUkRFViAiJXgiLCBtaW5vcik7CiAJaWYgKG5hbWUgPT0gTlVMTCkKQEAgLTI5OSw5ICsyOTksMTEgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKLQlmbCA9IChwcC0+ZmxhZ3MgJiBQUF9FWENMKSA/IFBBUlBPUlRfRkxBR19FWENMIDogMDsKLQlwZGV2ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocG9ydCwgbmFtZSwgTlVMTCwKLQkJCQkgICAgICAgTlVMTCwgcHBfaXJxLCBmbCwgcHApOworCW1lbXNldCgmcHBkZXZfY2IsIDAsIHNpemVvZihwcGRldl9jYikpOworCXBwZGV2X2NiLmlycV9mdW5jID0gcHBfaXJxOworCXBwZGV2X2NiLmZsYWdzID0gKHBwLT5mbGFncyAmIFBQX0VYQ0wpID8gUEFSUE9SVF9GTEFHX0VYQ0wgOiAwOworCXBwZGV2X2NiLnByaXZhdGUgPSBwcDsKKwlwZGV2ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZfbW9kZWwocG9ydCwgbmFtZSwgJnBwZGV2X2NiLCBtaW5vcik7CiAJcGFycG9ydF9wdXRfcG9ydChwb3J0KTsKIAogCWlmICghcGRldikgewpAQCAtNzk5LDEwICs4MDEsMjMgQEAKIAlkZXZpY2VfZGVzdHJveShwcGRldl9jbGFzcywgTUtERVYoUFBfTUFKT1IsIHBvcnQtPm51bWJlcikpOwogfQogCitzdGF0aWMgaW50IHBwX3Byb2JlKHN0cnVjdCBwYXJkZXZpY2UgKnBhcl9kZXYpCit7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IHBhcl9kZXYtPmRldi5kcml2ZXI7CisJaW50IGxlbiA9IHN0cmxlbihkcnYtPm5hbWUpOworCisJaWYgKHN0cm5jbXAocGFyX2Rldi0+bmFtZSwgZHJ2LT5uYW1lLCBsZW4pKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IHBhcnBvcnRfZHJpdmVyIHBwX2RyaXZlciA9IHsKIAkubmFtZQkJPSBDSFJERVYsCi0JLmF0dGFjaAkJPSBwcF9hdHRhY2gsCisJLnByb2JlCQk9IHBwX3Byb2JlLAorCS5tYXRjaF9wb3J0CT0gcHBfYXR0YWNoLAogCS5kZXRhY2gJCT0gcHBfZGV0YWNoLAorCS5kZXZtb2RlbAk9IHRydWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBwcGRldl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc25zYy5jIGIvZHJpdmVycy9jaGFyL3Nuc2MuYwppbmRleCA5NDAwNmY5Li4xMGU1NjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc25zYy5jCisrKyBiL2RyaXZlcnMvY2hhci9zbnNjLmMKQEAgLTM4NSwxMyArMzg1LDE4IEBACiAKIAlldmVudF9uYXNpZCA9IGlhNjRfc25fZ2V0X2NvbnNvbGVfbmFzaWQoKTsKIAorCXNuc2NfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsIFNZU0NUTF9CQVNFTkFNRSk7CisJaWYgKElTX0VSUihzbnNjX2NsYXNzKSkgeworCQlwcmludGsoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgY2xhc3NcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIFBUUl9FUlIoc25zY19jbGFzcyk7CisJfQorCiAJaWYgKGFsbG9jX2NocmRldl9yZWdpb24oJmZpcnN0X2RldiwgMCwgbnVtX2Nub2RlcywKIAkJCQlTWVNDVExfQkFTRU5BTUUpIDwgMCkgewogCQlwcmludGsoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgU04gc3lzdGVtIGNvbnRyb2xsZXIgZGV2aWNlXG4iLAogCQkgICAgICAgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0Jc25zY19jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgU1lTQ1RMX0JBU0VOQU1FKTsKIAogCWZvciAoY25vZGUgPSAwOyBjbm9kZSA8IG51bV9jbm9kZXM7IGNub2RlKyspIHsKIAkJCWdlb2lkID0gY25vZGVpZF9nZXRfZ2VvaWQoY25vZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RpbGUtc3JvbS5jIGIvZHJpdmVycy9jaGFyL3RpbGUtc3JvbS5jCmluZGV4IDY5ZjZiNGEuLjM5ODgwMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90aWxlLXNyb20uYworKysgYi9kcml2ZXJzL2NoYXIvdGlsZS1zcm9tLmMKQEAgLTMzMSwxMyArMzMxLDExIEBACiAvKioKICAqIHNyb21fc2V0dXBfbWlub3IoKSAtIEluaXRpYWxpemUgcGVyLW1pbm9yIGluZm9ybWF0aW9uLgogICogQHNyb206IFBlci1kZXZpY2UgU1JPTSBzdGF0ZS4KLSAqIEBpbmRleDogRGV2aWNlIHRvIHNldCB1cC4KKyAqIEBkZXZoZGw6IFBhcnRpdGlvbiBkZXZpY2UgaGFuZGxlLgogICovCi1zdGF0aWMgaW50IHNyb21fc2V0dXBfbWlub3Ioc3RydWN0IHNyb21fZGV2ICpzcm9tLCBpbnQgaW5kZXgpCitzdGF0aWMgaW50IHNyb21fc2V0dXBfbWlub3Ioc3RydWN0IHNyb21fZGV2ICpzcm9tLCBpbnQgZGV2aGRsKQogewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlpbnQgZGV2aGRsID0gc3JvbS0+aHZfZGV2aGRsOwotCisJc3JvbS0+aHZfZGV2aGRsID0gZGV2aGRsOwogCW11dGV4X2luaXQoJnNyb20tPmxvY2spOwogCiAJaWYgKF9zcm9tX3JlYWQoZGV2aGRsLCAmc3JvbS0+dG90YWxfc2l6ZSwKQEAgLTM1MCw5ICszNDgsNyBAQAogCQkgICAgICAgU1JPTV9QQUdFX1NJWkVfT0ZGLCBzaXplb2Yoc3JvbS0+cGFnZV9zaXplKSkgPCAwKQogCQlyZXR1cm4gLUVJTzsKIAotCWRldiA9IGRldmljZV9jcmVhdGUoc3JvbV9jbGFzcywgJnNyb21fcGFyZW50LT5kZXYsCi0JCQkgICAgTUtERVYoc3JvbV9tYWpvciwgaW5kZXgpLCBzcm9tLCAiJWQiLCBpbmRleCk7Ci0JcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhkZXYpOworCXJldHVybiAwOwogfQogCiAvKiogc3JvbV9pbml0KCkgLSBJbml0aWFsaXplIHRoZSBkcml2ZXIncyBtb2R1bGUuICovCkBAIC0zNjUsNyArMzYxLDcgQEAKIAkgKiBTdGFydCB3aXRoIGEgcGxhdXNpYmxlIG51bWJlciBvZiBwYXJ0aXRpb25zOyB0aGUga3JlYWxsb2MoKSBjYWxsCiAJICogYmVsb3cgd2lsbCB5aWVsZCBhYm91dCBsb2coc3JvbV9kZXZzKSBhZGRpdGlvbmFsIGFsbG9jYXRpb25zLgogCSAqLwotCXNyb21fZGV2aWNlcyA9IGt6YWxsb2MoNCAqIHNpemVvZihzdHJ1Y3Qgc3JvbV9kZXYpLCBHRlBfS0VSTkVMKTsKKwlzcm9tX2RldmljZXMgPSBrbWFsbG9jKDQgKiBzaXplb2Yoc3RydWN0IHNyb21fZGV2KSwgR0ZQX0tFUk5FTCk7CiAKIAkvKiBEaXNjb3ZlciB0aGUgbnVtYmVyIG9mIHNyb20gcGFydGl0aW9ucy4gKi8KIAlmb3IgKGkgPSAwOyA7IGkrKykgewpAQCAtMzczLDcgKzM2OSw3IEBACiAJCWNoYXIgYnVmWzIwXTsKIAkJc3RydWN0IHNyb21fZGV2ICpuZXdfc3JvbV9kZXZpY2VzID0KIAkJCWtyZWFsbG9jKHNyb21fZGV2aWNlcywgKGkrMSkgKiBzaXplb2Yoc3RydWN0IHNyb21fZGV2KSwKLQkJCQkgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOworCQkJCSBHRlBfS0VSTkVMKTsKIAkJaWYgKCFuZXdfc3JvbV9kZXZpY2VzKSB7CiAJCQlyZXN1bHQgPSAtRU5PTUVNOwogCQkJZ290byBmYWlsX21lbTsKQEAgLTM4Nyw3ICszODMsOSBAQAogCQkJCQkgIGksIGRldmhkbCk7CiAJCQlicmVhazsKIAkJfQotCQlzcm9tX2RldmljZXNbaV0uaHZfZGV2aGRsID0gZGV2aGRsOworCQlyZXN1bHQgPSBzcm9tX3NldHVwX21pbm9yKCZzcm9tX2RldmljZXNbaV0sIGRldmhkbCk7CisJCWlmIChyZXN1bHQgIT0gMCkKKwkJCWdvdG8gZmFpbF9tZW07CiAJfQogCXNyb21fZGV2cyA9IGk7CiAKQEAgLTQzMSw5ICs0MjksMTMgQEAKIAlzcm9tX2NsYXNzLT5kZXZfZ3JvdXBzID0gc3JvbV9kZXZfZ3JvdXBzOwogCXNyb21fY2xhc3MtPmRldm5vZGUgPSBzcm9tX2Rldm5vZGU7CiAKLQkvKiBEbyBwZXItcGFydGl0aW9uIGluaXRpYWxpemF0aW9uICovCisJLyogQ3JlYXRlIHBlci1wYXJ0aXRpb24gZGV2aWNlcyAqLwogCWZvciAoaSA9IDA7IGkgPCBzcm9tX2RldnM7IGkrKykgewotCQlyZXN1bHQgPSBzcm9tX3NldHVwX21pbm9yKHNyb21fZGV2aWNlcyArIGksIGkpOworCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJZGV2aWNlX2NyZWF0ZShzcm9tX2NsYXNzLCAmc3JvbV9wYXJlbnQtPmRldiwKKwkJCQkgICAgICBNS0RFVihzcm9tX21ham9yLCBpKSwgc3JvbV9kZXZpY2VzICsgaSwKKwkJCQkgICAgICAiJWQiLCBpKTsKKwkJcmVzdWx0ID0gUFRSX0VSUl9PUl9aRVJPKGRldik7CiAJCWlmIChyZXN1bHQgPCAwKQogCQkJZ290byBmYWlsX2NsYXNzOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vc3QzM3pwMjQvc3QzM3pwMjQuYyBiL2RyaXZlcnMvY2hhci90cG0vc3QzM3pwMjQvc3QzM3pwMjQuYwppbmRleCBjMmVlMzA0Li42ZjA2MGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3N0MzN6cDI0L3N0MzN6cDI0LmMKKysrIGIvZHJpdmVycy9jaGFyL3RwbS9zdDMzenAyNC9zdDMzenAyNC5jCkBAIC01ODksOCArNTg5LDYgQEAKIAkJY2hpcC0+ZmxhZ3MgfD0gVFBNX0NISVBfRkxBR19JUlE7CiAKIAkJZGlzYWJsZV9pcnFfbm9zeW5jKHRwbV9kZXYtPmlycSk7Ci0KLQkJdHBtX2dlbl9pbnRlcnJ1cHQoY2hpcCk7CiAJfQogCiAJcmV0dXJuIHRwbV9jaGlwX3JlZ2lzdGVyKGNoaXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0tZGV2LmMgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS1kZXYuYwppbmRleCBmNWQ0NTIxLi45MTJhZDMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS1kZXYuYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS1kZXYuYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAJCXJldHVybiAtRVBJUEU7CiAJfQogCW91dF9zaXplID0gdHBtX3RyYW5zbWl0KHByaXYtPmNoaXAsIHByaXYtPmRhdGFfYnVmZmVyLAotCQkJCXNpemVvZihwcml2LT5kYXRhX2J1ZmZlcikpOworCQkJCXNpemVvZihwcml2LT5kYXRhX2J1ZmZlciksIDApOwogCiAJdHBtX3B1dF9vcHMocHJpdi0+Y2hpcCk7CiAJaWYgKG91dF9zaXplIDwgMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0taW50ZXJmYWNlLmMgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS1pbnRlcmZhY2UuYwppbmRleCAxYWJlMmQ3Li44ZGU2MTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS1pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS1pbnRlcmZhY2UuYwpAQCAtMzMwLDEzICszMzAsMTYgQEAKIC8qCiAgKiBJbnRlcm5hbCBrZXJuZWwgaW50ZXJmYWNlIHRvIHRyYW5zbWl0IFRQTSBjb21tYW5kcwogICovCi1zc2l6ZV90IHRwbV90cmFuc21pdChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJICAgICBzaXplX3QgYnVmc2l6KQorc3NpemVfdCB0cG1fdHJhbnNtaXQoc3RydWN0IHRwbV9jaGlwICpjaGlwLCBjb25zdCB1OCAqYnVmLCBzaXplX3QgYnVmc2l6LAorCQkgICAgIHVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzc2l6ZV90IHJjOwogCXUzMiBjb3VudCwgb3JkaW5hbDsKIAl1bnNpZ25lZCBsb25nIHN0b3A7CiAKKwlpZiAoYnVmc2l6IDwgVFBNX0hFQURFUl9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChidWZzaXogPiBUUE1fQlVGU0laRSkKIAkJYnVmc2l6ID0gVFBNX0JVRlNJWkU7CiAKQEAgLTM1MCw3ICszNTMsOCBAQAogCQlyZXR1cm4gLUUyQklHOwogCX0KIAotCW11dGV4X2xvY2soJmNoaXAtPnRwbV9tdXRleCk7CisJaWYgKCEoZmxhZ3MgJiBUUE1fVFJBTlNNSVRfVU5MT0NLRUQpKQorCQltdXRleF9sb2NrKCZjaGlwLT50cG1fbXV0ZXgpOwogCiAJcmMgPSBjaGlwLT5vcHMtPnNlbmQoY2hpcCwgKHU4ICopIGJ1ZiwgY291bnQpOwogCWlmIChyYyA8IDApIHsKQEAgLTM5MywyMCArMzk3LDIxIEBACiAJCWRldl9lcnIoJmNoaXAtPmRldiwKIAkJCSJ0cG1fdHJhbnNtaXQ6IHRwbV9yZWN2OiBlcnJvciAlemRcbiIsIHJjKTsKIG91dDoKLQltdXRleF91bmxvY2soJmNoaXAtPnRwbV9tdXRleCk7CisJaWYgKCEoZmxhZ3MgJiBUUE1fVFJBTlNNSVRfVU5MT0NLRUQpKQorCQltdXRleF91bmxvY2soJmNoaXAtPnRwbV9tdXRleCk7CiAJcmV0dXJuIHJjOwogfQogCiAjZGVmaW5lIFRQTV9ESUdFU1RfU0laRSAyMAogI2RlZmluZSBUUE1fUkVUX0NPREVfSURYIDYKIAotc3NpemVfdCB0cG1fdHJhbnNtaXRfY21kKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdm9pZCAqY21kLAotCQkJIGludCBsZW4sIGNvbnN0IGNoYXIgKmRlc2MpCitzc2l6ZV90IHRwbV90cmFuc21pdF9jbWQoc3RydWN0IHRwbV9jaGlwICpjaGlwLCBjb25zdCB2b2lkICpjbWQsCisJCQkgaW50IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXNjKQogewotCXN0cnVjdCB0cG1fb3V0cHV0X2hlYWRlciAqaGVhZGVyOworCWNvbnN0IHN0cnVjdCB0cG1fb3V0cHV0X2hlYWRlciAqaGVhZGVyOwogCWludCBlcnI7CiAKLQlsZW4gPSB0cG1fdHJhbnNtaXQoY2hpcCwgKHU4ICopIGNtZCwgbGVuKTsKKwlsZW4gPSB0cG1fdHJhbnNtaXQoY2hpcCwgKGNvbnN0IHU4ICopY21kLCBsZW4sIGZsYWdzKTsKIAlpZiAobGVuIDwgIDApCiAJCXJldHVybiBsZW47CiAJZWxzZSBpZiAobGVuIDwgVFBNX0hFQURFUl9TSVpFKQpAQCAtNDUzLDI2ICs0NTgsMTMgQEAKIAkJdHBtX2NtZC5wYXJhbXMuZ2V0Y2FwX2luLnN1YmNhcF9zaXplID0gY3B1X3RvX2JlMzIoNCk7CiAJCXRwbV9jbWQucGFyYW1zLmdldGNhcF9pbi5zdWJjYXAgPSBzdWJjYXBfaWQ7CiAJfQotCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmdHBtX2NtZCwgVFBNX0lOVEVSTkFMX1JFU1VMVF9TSVpFLCBkZXNjKTsKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnRwbV9jbWQsIFRQTV9JTlRFUk5BTF9SRVNVTFRfU0laRSwgMCwKKwkJCSAgICAgIGRlc2MpOwogCWlmICghcmMpCiAJCSpjYXAgPSB0cG1fY21kLnBhcmFtcy5nZXRjYXBfb3V0LmNhcDsKIAlyZXR1cm4gcmM7CiB9Ci0KLXZvaWQgdHBtX2dlbl9pbnRlcnJ1cHQoc3RydWN0IHRwbV9jaGlwICpjaGlwKQotewotCXN0cnVjdAl0cG1fY21kX3QgdHBtX2NtZDsKLQlzc2l6ZV90IHJjOwotCi0JdHBtX2NtZC5oZWFkZXIuaW4gPSB0cG1fZ2V0Y2FwX2hlYWRlcjsKLQl0cG1fY21kLnBhcmFtcy5nZXRjYXBfaW4uY2FwID0gVFBNX0NBUF9QUk9QOwotCXRwbV9jbWQucGFyYW1zLmdldGNhcF9pbi5zdWJjYXBfc2l6ZSA9IGNwdV90b19iZTMyKDQpOwotCXRwbV9jbWQucGFyYW1zLmdldGNhcF9pbi5zdWJjYXAgPSBUUE1fQ0FQX1BST1BfVElTX1RJTUVPVVQ7Ci0KLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnRwbV9jbWQsIFRQTV9JTlRFUk5BTF9SRVNVTFRfU0laRSwKLQkJCSAgICAgICJhdHRlbXB0aW5nIHRvIGRldGVybWluZSB0aGUgdGltZW91dHMiKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHRwbV9nZW5faW50ZXJydXB0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHRwbV9nZXRjYXApOwogCiAjZGVmaW5lIFRQTV9PUkRfU1RBUlRVUCBjcHVfdG9fYmUzMigxNTMpCiAjZGVmaW5lIFRQTV9TVF9DTEVBUiBjcHVfdG9fYmUxNigxKQpAQCAtNDkwLDcgKzQ4Miw3IEBACiAJc3RhcnRfY21kLmhlYWRlci5pbiA9IHRwbV9zdGFydHVwX2hlYWRlcjsKIAogCXN0YXJ0X2NtZC5wYXJhbXMuc3RhcnR1cF9pbi5zdGFydHVwX3R5cGUgPSBzdGFydHVwX3R5cGU7Ci0JcmV0dXJuIHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnN0YXJ0X2NtZCwgVFBNX0lOVEVSTkFMX1JFU1VMVF9TSVpFLAorCXJldHVybiB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZzdGFydF9jbWQsIFRQTV9JTlRFUk5BTF9SRVNVTFRfU0laRSwgMCwKIAkJCQkiYXR0ZW1wdGluZyB0byBzdGFydCB0aGUgVFBNIik7CiB9CiAKQEAgLTUyMSw3ICs1MTMsOCBAQAogCXRwbV9jbWQucGFyYW1zLmdldGNhcF9pbi5jYXAgPSBUUE1fQ0FQX1BST1A7CiAJdHBtX2NtZC5wYXJhbXMuZ2V0Y2FwX2luLnN1YmNhcF9zaXplID0gY3B1X3RvX2JlMzIoNCk7CiAJdHBtX2NtZC5wYXJhbXMuZ2V0Y2FwX2luLnN1YmNhcCA9IFRQTV9DQVBfUFJPUF9USVNfVElNRU9VVDsKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnRwbV9jbWQsIFRQTV9JTlRFUk5BTF9SRVNVTFRfU0laRSwgTlVMTCk7CisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZ0cG1fY21kLCBUUE1fSU5URVJOQUxfUkVTVUxUX1NJWkUsIDAsCisJCQkgICAgICBOVUxMKTsKIAogCWlmIChyYyA9PSBUUE1fRVJSX0lOVkFMSURfUE9TVElOSVQpIHsKIAkJLyogVGhlIFRQTSBpcyBub3Qgc3RhcnRlZCwgd2UgYXJlIHRoZSBmaXJzdCB0byB0YWxrIHRvIGl0LgpAQCAtNTM1LDcgKzUyOCw3IEBACiAJCXRwbV9jbWQucGFyYW1zLmdldGNhcF9pbi5zdWJjYXBfc2l6ZSA9IGNwdV90b19iZTMyKDQpOwogCQl0cG1fY21kLnBhcmFtcy5nZXRjYXBfaW4uc3ViY2FwID0gVFBNX0NBUF9QUk9QX1RJU19USU1FT1VUOwogCQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnRwbV9jbWQsIFRQTV9JTlRFUk5BTF9SRVNVTFRfU0laRSwKLQkJCQkgIE5VTEwpOworCQkJCSAgICAgIDAsIE5VTEwpOwogCX0KIAlpZiAocmMpIHsKIAkJZGV2X2VycigmY2hpcC0+ZGV2LApAQCAtNTk2LDcgKzU4OSw3IEBACiAJdHBtX2NtZC5wYXJhbXMuZ2V0Y2FwX2luLnN1YmNhcF9zaXplID0gY3B1X3RvX2JlMzIoNCk7CiAJdHBtX2NtZC5wYXJhbXMuZ2V0Y2FwX2luLnN1YmNhcCA9IFRQTV9DQVBfUFJPUF9USVNfRFVSQVRJT047CiAKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnRwbV9jbWQsIFRQTV9JTlRFUk5BTF9SRVNVTFRfU0laRSwKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnRwbV9jbWQsIFRQTV9JTlRFUk5BTF9SRVNVTFRfU0laRSwgMCwKIAkJCSAgICAgICJhdHRlbXB0aW5nIHRvIGRldGVybWluZSB0aGUgZHVyYXRpb25zIik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CkBAIC02MzMsNyArNjI2LDcgQEAKICNkZWZpbmUgVFBNX09SRF9DT05USU5VRV9TRUxGVEVTVCA4MwogI2RlZmluZSBDT05USU5VRV9TRUxGVEVTVF9SRVNVTFRfU0laRSAxMAogCi1zdGF0aWMgc3RydWN0IHRwbV9pbnB1dF9oZWFkZXIgY29udGludWVfc2VsZnRlc3RfaGVhZGVyID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cG1faW5wdXRfaGVhZGVyIGNvbnRpbnVlX3NlbGZ0ZXN0X2hlYWRlciA9IHsKIAkudGFnID0gVFBNX1RBR19SUVVfQ09NTUFORCwKIAkubGVuZ3RoID0gY3B1X3RvX2JlMzIoMTApLAogCS5vcmRpbmFsID0gY3B1X3RvX2JlMzIoVFBNX09SRF9DT05USU5VRV9TRUxGVEVTVCksCkBAIC02NTIsMTQgKzY0NSwxNCBAQAogCXN0cnVjdCB0cG1fY21kX3QgY21kOwogCiAJY21kLmhlYWRlci5pbiA9IGNvbnRpbnVlX3NlbGZ0ZXN0X2hlYWRlcjsKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgQ09OVElOVUVfU0VMRlRFU1RfUkVTVUxUX1NJWkUsCisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIENPTlRJTlVFX1NFTEZURVNUX1JFU1VMVF9TSVpFLCAwLAogCQkJICAgICAgImNvbnRpbnVlIHNlbGZ0ZXN0Iik7CiAJcmV0dXJuIHJjOwogfQogCiAjZGVmaW5lIFRQTV9PUkRJTkFMX1BDUlJFQUQgY3B1X3RvX2JlMzIoMjEpCiAjZGVmaW5lIFJFQURfUENSX1JFU1VMVF9TSVpFIDMwCi1zdGF0aWMgc3RydWN0IHRwbV9pbnB1dF9oZWFkZXIgcGNycmVhZF9oZWFkZXIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRwbV9pbnB1dF9oZWFkZXIgcGNycmVhZF9oZWFkZXIgPSB7CiAJLnRhZyA9IFRQTV9UQUdfUlFVX0NPTU1BTkQsCiAJLmxlbmd0aCA9IGNwdV90b19iZTMyKDE0KSwKIAkub3JkaW5hbCA9IFRQTV9PUkRJTkFMX1BDUlJFQUQKQEAgLTY3Miw3ICs2NjUsNyBAQAogCiAJY21kLmhlYWRlci5pbiA9IHBjcnJlYWRfaGVhZGVyOwogCWNtZC5wYXJhbXMucGNycmVhZF9pbi5wY3JfaWR4ID0gY3B1X3RvX2JlMzIocGNyX2lkeCk7Ci0JcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIFJFQURfUENSX1JFU1VMVF9TSVpFLAorCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBSRUFEX1BDUl9SRVNVTFRfU0laRSwgMCwKIAkJCSAgICAgICJhdHRlbXB0aW5nIHRvIHJlYWQgYSBwY3IgdmFsdWUiKTsKIAogCWlmIChyYyA9PSAwKQpAQCAtNzQ1LDcgKzczOCw3IEBACiAgKi8KICNkZWZpbmUgVFBNX09SRF9QQ1JfRVhURU5EIGNwdV90b19iZTMyKDIwKQogI2RlZmluZSBFWFRFTkRfUENSX1JFU1VMVF9TSVpFIDM0Ci1zdGF0aWMgc3RydWN0IHRwbV9pbnB1dF9oZWFkZXIgcGNyZXh0ZW5kX2hlYWRlciA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHBtX2lucHV0X2hlYWRlciBwY3JleHRlbmRfaGVhZGVyID0gewogCS50YWcgPSBUUE1fVEFHX1JRVV9DT01NQU5ELAogCS5sZW5ndGggPSBjcHVfdG9fYmUzMigzNCksCiAJLm9yZGluYWwgPSBUUE1fT1JEX1BDUl9FWFRFTkQKQEAgLTc3MCw3ICs3NjMsNyBAQAogCWNtZC5oZWFkZXIuaW4gPSBwY3JleHRlbmRfaGVhZGVyOwogCWNtZC5wYXJhbXMucGNyZXh0ZW5kX2luLnBjcl9pZHggPSBjcHVfdG9fYmUzMihwY3JfaWR4KTsKIAltZW1jcHkoY21kLnBhcmFtcy5wY3JleHRlbmRfaW4uaGFzaCwgaGFzaCwgVFBNX0RJR0VTVF9TSVpFKTsKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgRVhURU5EX1BDUl9SRVNVTFRfU0laRSwKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgRVhURU5EX1BDUl9SRVNVTFRfU0laRSwgMCwKIAkJCSAgICAgICJhdHRlbXB0aW5nIGV4dGVuZCBhIFBDUiB2YWx1ZSIpOwogCiAJdHBtX3B1dF9vcHMoY2hpcCk7CkBAIC03OTIsNyArNzg1LDcgQEAKIAl1bnNpZ25lZCBpbnQgbG9vcHM7CiAJdW5zaWduZWQgaW50IGRlbGF5X21zZWMgPSAxMDA7CiAJdW5zaWduZWQgbG9uZyBkdXJhdGlvbjsKLQlzdHJ1Y3QgdHBtX2NtZF90IGNtZDsKKwl1OCBkdW1teVtUUE1fRElHRVNUX1NJWkVdOwogCiAJZHVyYXRpb24gPSB0cG1fY2FsY19vcmRpbmFsX2R1cmF0aW9uKGNoaXAsIFRQTV9PUkRfQ09OVElOVUVfU0VMRlRFU1QpOwogCkBAIC04MDcsOSArODAwLDggQEAKIAogCWRvIHsKIAkJLyogQXR0ZW1wdCB0byByZWFkIGEgUENSIHZhbHVlICovCi0JCWNtZC5oZWFkZXIuaW4gPSBwY3JyZWFkX2hlYWRlcjsKLQkJY21kLnBhcmFtcy5wY3JyZWFkX2luLnBjcl9pZHggPSBjcHVfdG9fYmUzMigwKTsKLQkJcmMgPSB0cG1fdHJhbnNtaXQoY2hpcCwgKHU4ICopICZjbWQsIFJFQURfUENSX1JFU1VMVF9TSVpFKTsKKwkJcmMgPSB0cG1fcGNyX3JlYWRfZGV2KGNoaXAsIDAsIGR1bW15KTsKKwogCQkvKiBTb21lIGJ1Z2d5IFRQTXMgd2lsbCBub3QgcmVzcG9uZCB0byB0cG1fdGlzX3JlYWR5KCkgZm9yCiAJCSAqIGFyb3VuZCAzMDBtcyB3aGlsZSB0aGUgc2VsZiB0ZXN0IGlzIG9uZ29pbmcsIGtlZXAgdHJ5aW5nCiAJCSAqIHVudGlsIHRoZSBzZWxmIHRlc3QgZHVyYXRpb24gZXhwaXJlcy4gKi8KQEAgLTgyNCw3ICs4MTYsNiBAQAogCQlpZiAocmMgPCBUUE1fSEVBREVSX1NJWkUpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQlyYyA9IGJlMzJfdG9fY3B1KGNtZC5oZWFkZXIub3V0LnJldHVybl9jb2RlKTsKIAkJaWYgKHJjID09IFRQTV9FUlJfRElTQUJMRUQgfHwgcmMgPT0gVFBNX0VSUl9ERUFDVElWQVRFRCkgewogCQkJZGV2X2luZm8oJmNoaXAtPmRldiwKIAkJCQkgIlRQTSBpcyBkaXNhYmxlZC9kZWFjdGl2YXRlZCAoMHglWClcbiIsIHJjKTsKQEAgLTg3OSw3ICs4NzAsNyBAQAogCWlmIChjaGlwID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsIGNtZCwgYnVmbGVuLCAiYXR0ZW1wdGluZyB0cG1fY21kIik7CisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsIGNtZCwgYnVmbGVuLCAwLCAiYXR0ZW1wdGluZyB0cG1fY21kIik7CiAKIAl0cG1fcHV0X29wcyhjaGlwKTsKIAlyZXR1cm4gcmM7CkBAIC05NDksNyArOTQwLDcgQEAKICNkZWZpbmUgVFBNX09SRF9TQVZFU1RBVEUgY3B1X3RvX2JlMzIoMTUyKQogI2RlZmluZSBTQVZFU1RBVEVfUkVTVUxUX1NJWkUgMTAKIAotc3RhdGljIHN0cnVjdCB0cG1faW5wdXRfaGVhZGVyIHNhdmVzdGF0ZV9oZWFkZXIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRwbV9pbnB1dF9oZWFkZXIgc2F2ZXN0YXRlX2hlYWRlciA9IHsKIAkudGFnID0gVFBNX1RBR19SUVVfQ09NTUFORCwKIAkubGVuZ3RoID0gY3B1X3RvX2JlMzIoMTApLAogCS5vcmRpbmFsID0gVFBNX09SRF9TQVZFU1RBVEUKQEAgLTk4MSwxNCArOTcyLDE1IEBACiAJCWNtZC5wYXJhbXMucGNyZXh0ZW5kX2luLnBjcl9pZHggPSBjcHVfdG9fYmUzMih0cG1fc3VzcGVuZF9wY3IpOwogCQltZW1jcHkoY21kLnBhcmFtcy5wY3JleHRlbmRfaW4uaGFzaCwgZHVtbXlfaGFzaCwKIAkJICAgICAgIFRQTV9ESUdFU1RfU0laRSk7Ci0JCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBFWFRFTkRfUENSX1JFU1VMVF9TSVpFLAorCQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgRVhURU5EX1BDUl9SRVNVTFRfU0laRSwgMCwKIAkJCQkgICAgICAiZXh0ZW5kaW5nIGR1bW15IHBjciBiZWZvcmUgc3VzcGVuZCIpOwogCX0KIAogCS8qIG5vdyBkbyB0aGUgYWN0dWFsIHNhdmVzdGF0ZSAqLwogCWZvciAodHJ5ID0gMDsgdHJ5IDwgVFBNX1JFVFJZOyB0cnkrKykgewogCQljbWQuaGVhZGVyLmluID0gc2F2ZXN0YXRlX2hlYWRlcjsKLQkJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIFNBVkVTVEFURV9SRVNVTFRfU0laRSwgTlVMTCk7CisJCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBTQVZFU1RBVEVfUkVTVUxUX1NJWkUsIDAsCisJCQkJICAgICAgTlVMTCk7CiAKIAkJLyoKIAkJICogSWYgdGhlIFRQTSBpbmRpY2F0ZXMgdGhhdCBpdCBpcyB0b28gYnVzeSB0byByZXNwb25kIHRvCkBAIC0xMDMyLDcgKzEwMjQsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwodHBtX3BtX3Jlc3VtZSk7CiAKICNkZWZpbmUgVFBNX0dFVFJBTkRPTV9SRVNVTFRfU0laRQkxOAotc3RhdGljIHN0cnVjdCB0cG1faW5wdXRfaGVhZGVyIHRwbV9nZXRyYW5kb21faGVhZGVyID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cG1faW5wdXRfaGVhZGVyIHRwbV9nZXRyYW5kb21faGVhZGVyID0gewogCS50YWcgPSBUUE1fVEFHX1JRVV9DT01NQU5ELAogCS5sZW5ndGggPSBjcHVfdG9fYmUzMigxNCksCiAJLm9yZGluYWwgPSBUUE1fT1JEX0dFVF9SQU5ET00KQEAgLTEwNzIsOCArMTA2NCw4IEBACiAJCXRwbV9jbWQucGFyYW1zLmdldHJhbmRvbV9pbi5udW1fYnl0ZXMgPSBjcHVfdG9fYmUzMihudW1fYnl0ZXMpOwogCiAJCWVyciA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnRwbV9jbWQsCi0JCQkJICAgVFBNX0dFVFJBTkRPTV9SRVNVTFRfU0laRSArIG51bV9ieXRlcywKLQkJCQkgICAiYXR0ZW1wdGluZyBnZXQgcmFuZG9tIik7CisJCQkJICAgICAgIFRQTV9HRVRSQU5ET01fUkVTVUxUX1NJWkUgKyBudW1fYnl0ZXMsCisJCQkJICAgICAgIDAsICJhdHRlbXB0aW5nIGdldCByYW5kb20iKTsKIAkJaWYgKGVycikKIAkJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS1zeXNmcy5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG0tc3lzZnMuYwppbmRleCBiNDZjZjcwLi5hNzZhYjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS1zeXNmcy5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLXN5c2ZzLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2RlZmluZSBSRUFEX1BVQkVLX1JFU1VMVF9TSVpFIDMxNAogI2RlZmluZSBUUE1fT1JEX1JFQURQVUJFSyBjcHVfdG9fYmUzMigxMjQpCi1zdGF0aWMgc3RydWN0IHRwbV9pbnB1dF9oZWFkZXIgdHBtX3JlYWRwdWJla19oZWFkZXIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRwbV9pbnB1dF9oZWFkZXIgdHBtX3JlYWRwdWJla19oZWFkZXIgPSB7CiAJLnRhZyA9IFRQTV9UQUdfUlFVX0NPTU1BTkQsCiAJLmxlbmd0aCA9IGNwdV90b19iZTMyKDMwKSwKIAkub3JkaW5hbCA9IFRQTV9PUkRfUkVBRFBVQkVLCkBAIC0zOSw3ICszOSw3IEBACiAJc3RydWN0IHRwbV9jaGlwICpjaGlwID0gdG9fdHBtX2NoaXAoZGV2KTsKIAogCXRwbV9jbWQuaGVhZGVyLmluID0gdHBtX3JlYWRwdWJla19oZWFkZXI7Ci0JZXJyID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmdHBtX2NtZCwgUkVBRF9QVUJFS19SRVNVTFRfU0laRSwKKwllcnIgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZ0cG1fY21kLCBSRUFEX1BVQkVLX1JFU1VMVF9TSVpFLCAwLAogCQkJICAgICAgICJhdHRlbXB0aW5nIHRvIHJlYWQgdGhlIFBVQkVLIik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oIGIvZHJpdmVycy9jaGFyL3RwbS90cG0uaAppbmRleCAzZTMyZDViLi40ZDE4M2M5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmgKQEAgLTQ3NiwzMiArNDc2LDM1IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cG1fZm9wczsKIGV4dGVybiBzdHJ1Y3QgaWRyIGRldl9udW1zX2lkcjsKIAorZW51bSB0cG1fdHJhbnNtaXRfZmxhZ3MgeworCVRQTV9UUkFOU01JVF9VTkxPQ0tFRAk9IEJJVCgwKSwKK307CisKK3NzaXplX3QgdHBtX3RyYW5zbWl0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGJ1ZnNpeiwKKwkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpOworc3NpemVfdCB0cG1fdHJhbnNtaXRfY21kKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgY29uc3Qgdm9pZCAqY21kLCBpbnQgbGVuLAorCQkJIHVuc2lnbmVkIGludCBmbGFncywgY29uc3QgY2hhciAqZGVzYyk7CiBzc2l6ZV90IHRwbV9nZXRjYXAoc3RydWN0IHRwbV9jaGlwICpjaGlwLCBfX2JlMzIgc3ViY2FwX2lkLCBjYXBfdCAqY2FwLAogCQkgICBjb25zdCBjaGFyICpkZXNjKTsKLXNzaXplX3QgdHBtX3RyYW5zbWl0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgY29uc3QgY2hhciAqYnVmLAotCQkgICAgIHNpemVfdCBidWZzaXopOwotc3NpemVfdCB0cG1fdHJhbnNtaXRfY21kKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdm9pZCAqY21kLCBpbnQgbGVuLAotCQkJIGNvbnN0IGNoYXIgKmRlc2MpOwotZXh0ZXJuIGludCB0cG1fZ2V0X3RpbWVvdXRzKHN0cnVjdCB0cG1fY2hpcCAqKTsKLWV4dGVybiB2b2lkIHRwbV9nZW5faW50ZXJydXB0KHN0cnVjdCB0cG1fY2hpcCAqKTsKK2ludCB0cG1fZ2V0X3RpbWVvdXRzKHN0cnVjdCB0cG1fY2hpcCAqKTsKIGludCB0cG0xX2F1dG9fc3RhcnR1cChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApOwotZXh0ZXJuIGludCB0cG1fZG9fc2VsZnRlc3Qoc3RydWN0IHRwbV9jaGlwICopOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdHBtX2NhbGNfb3JkaW5hbF9kdXJhdGlvbihzdHJ1Y3QgdHBtX2NoaXAgKiwgdTMyKTsKLWV4dGVybiBpbnQgdHBtX3BtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqKTsKLWV4dGVybiBpbnQgdHBtX3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICopOwotZXh0ZXJuIGludCB3YWl0X2Zvcl90cG1fc3RhdChzdHJ1Y3QgdHBtX2NoaXAgKiwgdTgsIHVuc2lnbmVkIGxvbmcsCi0JCQkgICAgIHdhaXRfcXVldWVfaGVhZF90ICosIGJvb2wpOworaW50IHRwbV9kb19zZWxmdGVzdChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApOwordW5zaWduZWQgbG9uZyB0cG1fY2FsY19vcmRpbmFsX2R1cmF0aW9uKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTMyIG9yZGluYWwpOworaW50IHRwbV9wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CitpbnQgdHBtX3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworaW50IHdhaXRfZm9yX3RwbV9zdGF0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTggbWFzaywgdW5zaWduZWQgbG9uZyB0aW1lb3V0LAorCQkgICAgICB3YWl0X3F1ZXVlX2hlYWRfdCAqcXVldWUsIGJvb2wgY2hlY2tfY2FuY2VsKTsKIAogc3RydWN0IHRwbV9jaGlwICp0cG1fY2hpcF9maW5kX2dldChpbnQgY2hpcF9udW0pOwogX19tdXN0X2NoZWNrIGludCB0cG1fdHJ5X2dldF9vcHMoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKIHZvaWQgdHBtX3B1dF9vcHMoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKIAotZXh0ZXJuIHN0cnVjdCB0cG1fY2hpcCAqdHBtX2NoaXBfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdHBtX2NsYXNzX29wcyAqb3BzKTsKLWV4dGVybiBzdHJ1Y3QgdHBtX2NoaXAgKnRwbW1fY2hpcF9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpwZGV2LAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdHBtX2NsYXNzX29wcyAqb3BzKTsKLWV4dGVybiBpbnQgdHBtX2NoaXBfcmVnaXN0ZXIoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKLWV4dGVybiB2b2lkIHRwbV9jaGlwX3VucmVnaXN0ZXIoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKK3N0cnVjdCB0cG1fY2hpcCAqdHBtX2NoaXBfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LAorCQkJCWNvbnN0IHN0cnVjdCB0cG1fY2xhc3Nfb3BzICpvcHMpOworc3RydWN0IHRwbV9jaGlwICp0cG1tX2NoaXBfYWxsb2Moc3RydWN0IGRldmljZSAqcGRldiwKKwkJCQkgY29uc3Qgc3RydWN0IHRwbV9jbGFzc19vcHMgKm9wcyk7CitpbnQgdHBtX2NoaXBfcmVnaXN0ZXIoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKK3ZvaWQgdHBtX2NoaXBfdW5yZWdpc3RlcihzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApOwogCiB2b2lkIHRwbV9zeXNmc19hZGRfZGV2aWNlKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCk7CiAKQEAgLTUyOCw4ICs1MzEsNyBAQAogCQkJdTMyICp2YWx1ZSwgY29uc3QgY2hhciAqZGVzYyk7CiAKIGludCB0cG0yX2F1dG9fc3RhcnR1cChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApOwotZXh0ZXJuIHZvaWQgdHBtMl9zaHV0ZG93bihzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHUxNiBzaHV0ZG93bl90eXBlKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHRwbTJfY2FsY19vcmRpbmFsX2R1cmF0aW9uKHN0cnVjdCB0cG1fY2hpcCAqLCB1MzIpOwotZXh0ZXJuIGludCB0cG0yX2dlbl9pbnRlcnJ1cHQoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKLWV4dGVybiBpbnQgdHBtMl9wcm9iZShzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApOwordm9pZCB0cG0yX3NodXRkb3duKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTE2IHNodXRkb3duX3R5cGUpOwordW5zaWduZWQgbG9uZyB0cG0yX2NhbGNfb3JkaW5hbF9kdXJhdGlvbihzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHUzMiBvcmRpbmFsKTsKK2ludCB0cG0yX3Byb2JlKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtMi1jbWQuYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtMi1jbWQuYwppbmRleCAwOGM3ZTIzLi43ZGY1NWQ1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG0yLWNtZC5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtMi1jbWQuYwpAQCAtMjgyLDcgKzI4Miw3IEBACiAJICAgICAgIHNpemVvZihjbWQucGFyYW1zLnBjcnJlYWRfaW4ucGNyX3NlbGVjdCkpOwogCWNtZC5wYXJhbXMucGNycmVhZF9pbi5wY3Jfc2VsZWN0W3Bjcl9pZHggPj4gM10gPSAxIDw8IChwY3JfaWR4ICYgMHg3KTsKIAotCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBzaXplb2YoY21kKSwKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgc2l6ZW9mKGNtZCksIDAsCiAJCQkgICAgICAiYXR0ZW1wdGluZyB0byByZWFkIGEgcGNyIHZhbHVlIik7CiAJaWYgKHJjID09IDApIHsKIAkJYnVmID0gY21kLnBhcmFtcy5wY3JyZWFkX291dC5kaWdlc3Q7CkBAIC0zMzAsNyArMzMwLDcgQEAKIAljbWQucGFyYW1zLnBjcmV4dGVuZF9pbi5oYXNoX2FsZyA9IGNwdV90b19iZTE2KFRQTTJfQUxHX1NIQTEpOwogCW1lbWNweShjbWQucGFyYW1zLnBjcmV4dGVuZF9pbi5kaWdlc3QsIGhhc2gsIFRQTV9ESUdFU1RfU0laRSk7CiAKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgc2l6ZW9mKGNtZCksCisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIHNpemVvZihjbWQpLCAwLAogCQkJICAgICAgImF0dGVtcHRpbmcgZXh0ZW5kIGEgUENSIHZhbHVlIik7CiAKIAlyZXR1cm4gcmM7CkBAIC0zNzYsNyArMzc2LDcgQEAKIAkJY21kLmhlYWRlci5pbiA9IHRwbTJfZ2V0cmFuZG9tX2hlYWRlcjsKIAkJY21kLnBhcmFtcy5nZXRyYW5kb21faW4uc2l6ZSA9IGNwdV90b19iZTE2KG51bV9ieXRlcyk7CiAKLQkJZXJyID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBzaXplb2YoY21kKSwKKwkJZXJyID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBzaXplb2YoY21kKSwgMCwKIAkJCQkgICAgICAgImF0dGVtcHRpbmcgZ2V0IHJhbmRvbSIpOwogCQlpZiAoZXJyKQogCQkJYnJlYWs7CkBAIC00MzQsMTIgKzQzNCwxMiBAQAogfQogCiAvKioKLSAqIHRwbTJfc2VhbF90cnVzdGVkKCkgLSBzZWFsIGEgdHJ1c3RlZCBrZXkKLSAqIEBjaGlwX251bTogQSBzcGVjaWZpYyBjaGlwIG51bWJlciBmb3IgdGhlIHJlcXVlc3Qgb3IgVFBNX0FOWV9OVU0KLSAqIEBvcHRpb25zOiBhdXRoZW50aWNhdGlvbiB2YWx1ZXMgYW5kIG90aGVyIG9wdGlvbnMKKyAqIHRwbTJfc2VhbF90cnVzdGVkKCkgLSBzZWFsIHRoZSBwYXlsb2FkIG9mIGEgdHJ1c3RlZCBrZXkKKyAqIEBjaGlwX251bTogVFBNIGNoaXAgdG8gdXNlCiAgKiBAcGF5bG9hZDogdGhlIGtleSBkYXRhIGluIGNsZWFyIGFuZCBlbmNyeXB0ZWQgZm9ybQorICogQG9wdGlvbnM6IGF1dGhlbnRpY2F0aW9uIHZhbHVlcyBhbmQgb3RoZXIgb3B0aW9ucwogICoKLSAqIFJldHVybnMgPCAwIG9uIGVycm9yIGFuZCAwIG9uIHN1Y2Nlc3MuCisgKiBSZXR1cm46IDwgMCBvbiBlcnJvciBhbmQgMCBvbiBzdWNjZXNzLgogICovCiBpbnQgdHBtMl9zZWFsX3RydXN0ZWQoc3RydWN0IHRwbV9jaGlwICpjaGlwLAogCQkgICAgICBzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcGF5bG9hZCwKQEAgLTUxMiw3ICs1MTIsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgYnVmLmRhdGEsIFBBR0VfU0laRSwgInNlYWxpbmcgZGF0YSIpOworCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCBidWYuZGF0YSwgUEFHRV9TSVpFLCAwLCAic2VhbGluZyBkYXRhIik7CiAJaWYgKHJjKQogCQlnb3RvIG91dDsKIApAQCAtNTM4LDEwICs1MzgsMTggQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgdHBtMl9sb2FkKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwKLQkJICAgICBzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcGF5bG9hZCwKLQkJICAgICBzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqb3B0aW9ucywKLQkJICAgICB1MzIgKmJsb2JfaGFuZGxlKQorLyoqCisgKiB0cG0yX2xvYWRfY21kKCkgLSBleGVjdXRlIGEgVFBNMl9Mb2FkIGNvbW1hbmQKKyAqIEBjaGlwX251bTogVFBNIGNoaXAgdG8gdXNlCisgKiBAcGF5bG9hZDogdGhlIGtleSBkYXRhIGluIGNsZWFyIGFuZCBlbmNyeXB0ZWQgZm9ybQorICogQG9wdGlvbnM6IGF1dGhlbnRpY2F0aW9uIHZhbHVlcyBhbmQgb3RoZXIgb3B0aW9ucworICoKKyAqIFJldHVybjogc2FtZSBhcyB3aXRoIHRwbV90cmFuc21pdF9jbWQKKyAqLworc3RhdGljIGludCB0cG0yX2xvYWRfY21kKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwKKwkJCSBzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcGF5bG9hZCwKKwkJCSBzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqb3B0aW9ucywKKwkJCSB1MzIgKmJsb2JfaGFuZGxlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHRwbV9idWYgYnVmOwogCXVuc2lnbmVkIGludCBwcml2YXRlX2xlbjsKQEAgLTU3Niw3ICs1ODQsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgYnVmLmRhdGEsIFBBR0VfU0laRSwgImxvYWRpbmcgYmxvYiIpOworCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCBidWYuZGF0YSwgUEFHRV9TSVpFLCBmbGFncywgImxvYWRpbmcgYmxvYiIpOwogCWlmICghcmMpCiAJCSpibG9iX2hhbmRsZSA9IGJlMzJfdG9fY3B1cCgKIAkJCShfX2JlMzIgKikgJmJ1Zi5kYXRhW1RQTV9IRUFERVJfU0laRV0pOwpAQCAtNTkwLDcgKzU5OCwxNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQgdHBtMl9mbHVzaF9jb250ZXh0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTMyIGhhbmRsZSkKKy8qKgorICogdHBtMl9mbHVzaF9jb250ZXh0X2NtZCgpIC0gZXhlY3V0ZSBhIFRQTTJfRmx1c2hDb250ZXh0IGNvbW1hbmQKKyAqIEBjaGlwX251bTogVFBNIGNoaXAgdG8gdXNlCisgKiBAcGF5bG9hZDogdGhlIGtleSBkYXRhIGluIGNsZWFyIGFuZCBlbmNyeXB0ZWQgZm9ybQorICogQG9wdGlvbnM6IGF1dGhlbnRpY2F0aW9uIHZhbHVlcyBhbmQgb3RoZXIgb3B0aW9ucworICoKKyAqIFJldHVybjogc2FtZSBhcyB3aXRoIHRwbV90cmFuc21pdF9jbWQKKyAqLworc3RhdGljIHZvaWQgdHBtMl9mbHVzaF9jb250ZXh0X2NtZChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHUzMiBoYW5kbGUsCisJCQkJICAgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCB0cG1fYnVmIGJ1ZjsKIAlpbnQgcmM7CkBAIC02MDQsNyArNjIxLDggQEAKIAogCXRwbV9idWZfYXBwZW5kX3UzMigmYnVmLCBoYW5kbGUpOwogCi0JcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsIGJ1Zi5kYXRhLCBQQUdFX1NJWkUsICJmbHVzaGluZyBjb250ZXh0Iik7CisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsIGJ1Zi5kYXRhLCBQQUdFX1NJWkUsIGZsYWdzLAorCQkJICAgICAgImZsdXNoaW5nIGNvbnRleHQiKTsKIAlpZiAocmMpCiAJCWRldl93YXJuKCZjaGlwLT5kZXYsICIweCUwOHggd2FzIG5vdCBmbHVzaGVkLCByYz0lZFxuIiwgaGFuZGxlLAogCQkJIHJjKTsKQEAgLTYxMiwxMCArNjMwLDE4IEBACiAJdHBtX2J1Zl9kZXN0cm95KCZidWYpOwogfQogCi1zdGF0aWMgaW50IHRwbTJfdW5zZWFsKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwKLQkJICAgICAgIHN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkICpwYXlsb2FkLAotCQkgICAgICAgc3RydWN0IHRydXN0ZWRfa2V5X29wdGlvbnMgKm9wdGlvbnMsCi0JCSAgICAgICB1MzIgYmxvYl9oYW5kbGUpCisvKioKKyAqIHRwbTJfdW5zZWFsX2NtZCgpIC0gZXhlY3V0ZSBhIFRQTTJfVW5sb2FkIGNvbW1hbmQKKyAqIEBjaGlwX251bTogVFBNIGNoaXAgdG8gdXNlCisgKiBAcGF5bG9hZDogdGhlIGtleSBkYXRhIGluIGNsZWFyIGFuZCBlbmNyeXB0ZWQgZm9ybQorICogQG9wdGlvbnM6IGF1dGhlbnRpY2F0aW9uIHZhbHVlcyBhbmQgb3RoZXIgb3B0aW9ucworICoKKyAqIFJldHVybjogc2FtZSBhcyB3aXRoIHRwbV90cmFuc21pdF9jbWQKKyAqLworc3RhdGljIGludCB0cG0yX3Vuc2VhbF9jbWQoc3RydWN0IHRwbV9jaGlwICpjaGlwLAorCQkJICAgc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnBheWxvYWQsCisJCQkgICBzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqb3B0aW9ucywKKwkJCSAgIHUzMiBibG9iX2hhbmRsZSwgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCB0cG1fYnVmIGJ1ZjsKIAl1MTYgZGF0YV9sZW47CkBAIC02MzUsNyArNjYxLDcgQEAKIAkJCSAgICAgb3B0aW9ucy0+YmxvYmF1dGggLyogaG1hYyAqLywKIAkJCSAgICAgVFBNX0RJR0VTVF9TSVpFKTsKIAotCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCBidWYuZGF0YSwgUEFHRV9TSVpFLCAidW5zZWFsaW5nIik7CisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsIGJ1Zi5kYXRhLCBQQUdFX1NJWkUsIGZsYWdzLCAidW5zZWFsaW5nIik7CiAJaWYgKHJjID4gMCkKIAkJcmMgPSAtRVBFUk07CiAKQEAgLTY1NCwxMiArNjgwLDEyIEBACiB9CiAKIC8qKgotICogdHBtX3Vuc2VhbF90cnVzdGVkKCkgLSB1bnNlYWwgYSB0cnVzdGVkIGtleQotICogQGNoaXBfbnVtOiBBIHNwZWNpZmljIGNoaXAgbnVtYmVyIGZvciB0aGUgcmVxdWVzdCBvciBUUE1fQU5ZX05VTQotICogQG9wdGlvbnM6IGF1dGhlbnRpY2F0aW9uIHZhbHVlcyBhbmQgb3RoZXIgb3B0aW9ucworICogdHBtX3Vuc2VhbF90cnVzdGVkKCkgLSB1bnNlYWwgdGhlIHBheWxvYWQgb2YgYSB0cnVzdGVkIGtleQorICogQGNoaXBfbnVtOiBUUE0gY2hpcCB0byB1c2UKICAqIEBwYXlsb2FkOiB0aGUga2V5IGRhdGEgaW4gY2xlYXIgYW5kIGVuY3J5cHRlZCBmb3JtCisgKiBAb3B0aW9uczogYXV0aGVudGljYXRpb24gdmFsdWVzIGFuZCBvdGhlciBvcHRpb25zCiAgKgotICogUmV0dXJucyA8IDAgb24gZXJyb3IgYW5kIDAgb24gc3VjY2Vzcy4KKyAqIFJldHVybjogPCAwIG9uIGVycm9yIGFuZCAwIG9uIHN1Y2Nlc3MuCiAgKi8KIGludCB0cG0yX3Vuc2VhbF90cnVzdGVkKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwKIAkJCXN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkICpwYXlsb2FkLApAQCAtNjY4LDE0ICs2OTQsMTcgQEAKIAl1MzIgYmxvYl9oYW5kbGU7CiAJaW50IHJjOwogCi0JcmMgPSB0cG0yX2xvYWQoY2hpcCwgcGF5bG9hZCwgb3B0aW9ucywgJmJsb2JfaGFuZGxlKTsKKwltdXRleF9sb2NrKCZjaGlwLT50cG1fbXV0ZXgpOworCXJjID0gdHBtMl9sb2FkX2NtZChjaGlwLCBwYXlsb2FkLCBvcHRpb25zLCAmYmxvYl9oYW5kbGUsCisJCQkgICBUUE1fVFJBTlNNSVRfVU5MT0NLRUQpOwogCWlmIChyYykKLQkJcmV0dXJuIHJjOworCQlnb3RvIG91dDsKIAotCXJjID0gdHBtMl91bnNlYWwoY2hpcCwgcGF5bG9hZCwgb3B0aW9ucywgYmxvYl9oYW5kbGUpOwotCi0JdHBtMl9mbHVzaF9jb250ZXh0KGNoaXAsIGJsb2JfaGFuZGxlKTsKLQorCXJjID0gdHBtMl91bnNlYWxfY21kKGNoaXAsIHBheWxvYWQsIG9wdGlvbnMsIGJsb2JfaGFuZGxlLAorCQkJICAgICBUUE1fVFJBTlNNSVRfVU5MT0NLRUQpOworCXRwbTJfZmx1c2hfY29udGV4dF9jbWQoY2hpcCwgYmxvYl9oYW5kbGUsIFRQTV9UUkFOU01JVF9VTkxPQ0tFRCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT50cG1fbXV0ZXgpOwogCXJldHVybiByYzsKIH0KIApAQCAtNzAxLDEyICs3MzAsMTMgQEAKIAljbWQucGFyYW1zLmdldF90cG1fcHRfaW4ucHJvcGVydHlfaWQgPSBjcHVfdG9fYmUzMihwcm9wZXJ0eV9pZCk7CiAJY21kLnBhcmFtcy5nZXRfdHBtX3B0X2luLnByb3BlcnR5X2NudCA9IGNwdV90b19iZTMyKDEpOwogCi0JcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIHNpemVvZihjbWQpLCBkZXNjKTsKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgc2l6ZW9mKGNtZCksIDAsIGRlc2MpOwogCWlmICghcmMpCiAJCSp2YWx1ZSA9IGJlMzJfdG9fY3B1KGNtZC5wYXJhbXMuZ2V0X3RwbV9wdF9vdXQudmFsdWUpOwogCiAJcmV0dXJuIHJjOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodHBtMl9nZXRfdHBtX3B0KTsKIAogI2RlZmluZSBUUE0yX1NUQVJUVVBfSU5fU0laRSBcCiAJKHNpemVvZihzdHJ1Y3QgdHBtX2lucHV0X2hlYWRlcikgKyBcCkBAIC03MzUsNyArNzY1LDcgQEAKIAljbWQuaGVhZGVyLmluID0gdHBtMl9zdGFydHVwX2hlYWRlcjsKIAogCWNtZC5wYXJhbXMuc3RhcnR1cF9pbi5zdGFydHVwX3R5cGUgPSBjcHVfdG9fYmUxNihzdGFydHVwX3R5cGUpOwotCXJldHVybiB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIHNpemVvZihjbWQpLAorCXJldHVybiB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIHNpemVvZihjbWQpLCAwLAogCQkJCSJhdHRlbXB0aW5nIHRvIHN0YXJ0IHRoZSBUUE0iKTsKIH0KIApAQCAtNzYzLDcgKzc5Myw3IEBACiAJY21kLmhlYWRlci5pbiA9IHRwbTJfc2h1dGRvd25faGVhZGVyOwogCWNtZC5wYXJhbXMuc3RhcnR1cF9pbi5zdGFydHVwX3R5cGUgPSBjcHVfdG9fYmUxNihzaHV0ZG93bl90eXBlKTsKIAotCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBzaXplb2YoY21kKSwgInN0b3BwaW5nIHRoZSBUUE0iKTsKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgc2l6ZW9mKGNtZCksIDAsICJzdG9wcGluZyB0aGUgVFBNIik7CiAKIAkvKiBJbiBwbGFjZXMgd2hlcmUgc2h1dGRvd24gY29tbWFuZCBpcyBzZW50IHRoZXJlJ3Mgbm8gbXVjaCB3ZSBjYW4gZG8KIAkgKiBleGNlcHQgcHJpbnQgdGhlIGVycm9yIGNvZGUgb24gYSBzeXN0ZW0gZmFpbHVyZS4KQEAgLTgyOCw3ICs4NTgsNyBAQAogCWNtZC5oZWFkZXIuaW4gPSB0cG0yX3NlbGZ0ZXN0X2hlYWRlcjsKIAljbWQucGFyYW1zLnNlbGZ0ZXN0X2luLmZ1bGxfdGVzdCA9IGZ1bGw7CiAKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgVFBNMl9TRUxGX1RFU1RfSU5fU0laRSwKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgVFBNMl9TRUxGX1RFU1RfSU5fU0laRSwgMCwKIAkJCSAgICAgICJjb250aW51ZSBzZWxmdGVzdCIpOwogCiAJLyogQXQgbGVhc3Qgc29tZSBwcm90b3R5cGUgY2hpcHMgc2VlbSB0byBnaXZlIFJDX1RFU1RJTkcgZXJyb3IKQEAgLTg4MCw3ICs5MTAsNyBAQAogCQljbWQucGFyYW1zLnBjcnJlYWRfaW4ucGNyX3NlbGVjdFsxXSA9IDB4MDA7CiAJCWNtZC5wYXJhbXMucGNycmVhZF9pbi5wY3Jfc2VsZWN0WzJdID0gMHgwMDsKIAotCQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgKHU4ICopICZjbWQsIHNpemVvZihjbWQpLCBOVUxMKTsKKwkJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIHNpemVvZihjbWQpLCAwLCBOVUxMKTsKIAkJaWYgKHJjIDwgMCkKIAkJCWJyZWFrOwogCkBAIC04OTUsMjMgKzkyNSw2IEBACiB9CiAKIC8qKgotICogdHBtMl9nZW5faW50ZXJydXB0KCkgLSBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQKLSAqIEBjaGlwOiBUUE0gY2hpcCB0byB1c2UKLSAqCi0gKiAwIGlzIHJldHVybmVkIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLiBJZiBhIG5lZ2F0aXZlIG51bWJlciBpcwotICogcmV0dXJuZWQgaXQgcmVtYXJrcyBhIFBPU0lYIGVycm9yIGNvZGUuIElmIGEgcG9zaXRpdmUgbnVtYmVyIGlzIHJldHVybmVkCi0gKiBpdCByZW1hcmtzIGEgVFBNIGVycm9yLgotICovCi1pbnQgdHBtMl9nZW5faW50ZXJydXB0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCkKLXsKLQl1MzIgZHVtbXk7Ci0KLQlyZXR1cm4gdHBtMl9nZXRfdHBtX3B0KGNoaXAsIDB4MTAwLCAmZHVtbXksCi0JCQkgICAgICAgImF0dGVtcHRpbmcgdG8gZ2VuZXJhdGUgYW4gaW50ZXJydXB0Iik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh0cG0yX2dlbl9pbnRlcnJ1cHQpOwotCi0vKioKICAqIHRwbTJfcHJvYmUoKSAtIHByb2JlIFRQTSAyLjAKICAqIEBjaGlwOiBUUE0gY2hpcCB0byB1c2UKICAqCkBAIC05MjgsMTEgKzk0MSw5IEBACiAJY21kLnBhcmFtcy5nZXRfdHBtX3B0X2luLnByb3BlcnR5X2lkID0gY3B1X3RvX2JlMzIoMHgxMDApOwogCWNtZC5wYXJhbXMuZ2V0X3RwbV9wdF9pbi5wcm9wZXJ0eV9jbnQgPSBjcHVfdG9fYmUzMigxKTsKIAotCXJjID0gdHBtX3RyYW5zbWl0KGNoaXAsIChjb25zdCBjaGFyICopICZjbWQsIHNpemVvZihjbWQpKTsKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgc2l6ZW9mKGNtZCksICAwLCBOVUxMKTsKIAlpZiAocmMgPCAgMCkKIAkJcmV0dXJuIHJjOwotCWVsc2UgaWYgKHJjIDwgVFBNX0hFQURFUl9TSVpFKQotCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmIChiZTE2X3RvX2NwdShjbWQuaGVhZGVyLm91dC50YWcpID09IFRQTTJfU1RfTk9fU0VTU0lPTlMpCiAJCWNoaXAtPmZsYWdzIHw9IFRQTV9DSElQX0ZMQUdfVFBNMjsKQEAgLTk1Nyw3ICs5NjgsNyBAQAogCQlnb3RvIG91dDsKIAogCXJjID0gdHBtMl9kb19zZWxmdGVzdChjaGlwKTsKLQlpZiAocmMgIT0gVFBNMl9SQ19JTklUSUFMSVpFKSB7CisJaWYgKHJjICE9IDAgJiYgcmMgIT0gVFBNMl9SQ19JTklUSUFMSVpFKSB7CiAJCWRldl9lcnIoJmNoaXAtPmRldiwgIlRQTSBzZWxmIHRlc3QgZmFpbGVkXG4iKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtOTc0LDcgKzk4NSw2IEBACiAJCX0KIAl9CiAKLQlyZXR1cm4gcmM7CiBvdXQ6CiAJaWYgKHJjID4gMCkKIAkJcmMgPSAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG1fY3JiLmMgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbV9jcmIuYwppbmRleCAwMThjMzgyNS4uYTdjODcwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG1fY3JiLmMKKysrIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fY3JiLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgInRwbS5oIgogCiAjZGVmaW5lIEFDUElfU0lHX1RQTTIgIlRQTTIiCkBAIC0zNCwxNCArMzMsMTQgQEAKIAlDUkJfQUNQSV9TVEFSVF9JTkRFWCA9IDEsCiB9OwogCi1lbnVtIGNyYl9jYV9yZXF1ZXN0IHsKLQlDUkJfQ0FfUkVRX0dPX0lETEUJPSBCSVQoMCksCi0JQ1JCX0NBX1JFUV9DTURfUkVBRFkJPSBCSVQoMSksCitlbnVtIGNyYl9jdHJsX3JlcSB7CisJQ1JCX0NUUkxfUkVRX0NNRF9SRUFEWQk9IEJJVCgwKSwKKwlDUkJfQ1RSTF9SRVFfR09fSURMRQk9IEJJVCgxKSwKIH07CiAKLWVudW0gY3JiX2NhX3N0YXR1cyB7Ci0JQ1JCX0NBX1NUU19FUlJPUgk9IEJJVCgwKSwKLQlDUkJfQ0FfU1RTX1RQTV9JRExFCT0gQklUKDEpLAorZW51bSBjcmJfY3RybF9zdHMgeworCUNSQl9DVFJMX1NUU19FUlJPUgk9IEJJVCgwKSwKKwlDUkJfQ1RSTF9TVFNfVFBNX0lETEUJPSBCSVQoMSksCiB9OwogCiBlbnVtIGNyYl9zdGFydCB7CkBAIC02Nyw3ICs2Niw3IEBACiB9IF9fcGFja2VkOwogCiBlbnVtIGNyYl9zdGF0dXMgewotCUNSQl9TVFNfQ09NUExFVEUJPSBCSVQoMCksCisJQ1JCX0RSVl9TVFNfQ09NUExFVEUJPSBCSVQoMCksCiB9OwogCiBlbnVtIGNyYl9mbGFncyB7CkBAIC04MSw2ICs4MCw3IEBACiAJc3RydWN0IGNyYl9jb250cm9sX2FyZWEgX19pb21lbSAqY2NhOwogCXU4IF9faW9tZW0gKmNtZDsKIAl1OCBfX2lvbWVtICpyc3A7CisJdTMyIGNtZF9zaXplOwogfTsKIAogc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGNyYl9wbSwgdHBtX3BtX3N1c3BlbmQsIHRwbV9wbV9yZXN1bWUpOwpAQCAtOTIsNyArOTIsNyBAQAogCiAJaWYgKChpb3JlYWQzMigmcHJpdi0+Y2NhLT5zdGFydCkgJiBDUkJfU1RBUlRfSU5WT0tFKSAhPQogCSAgICBDUkJfU1RBUlRfSU5WT0tFKQotCQlzdHMgfD0gQ1JCX1NUU19DT01QTEVURTsKKwkJc3RzIHw9IENSQl9EUlZfU1RTX0NPTVBMRVRFOwogCiAJcmV0dXJuIHN0czsKIH0KQEAgLTEwNiw3ICsxMDYsNyBAQAogCWlmIChjb3VudCA8IDYpCiAJCXJldHVybiAtRUlPOwogCi0JaWYgKGlvcmVhZDMyKCZwcml2LT5jY2EtPnN0cykgJiBDUkJfQ0FfU1RTX0VSUk9SKQorCWlmIChpb3JlYWQzMigmcHJpdi0+Y2NhLT5zdHMpICYgQ1JCX0NUUkxfU1RTX0VSUk9SKQogCQlyZXR1cm4gLUVJTzsKIAogCW1lbWNweV9mcm9taW8oYnVmLCBwcml2LT5yc3AsIDYpOwpAQCAtMTQyLDExICsxNDIsMTQgQEAKIAlzdHJ1Y3QgY3JiX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoJmNoaXAtPmRldik7CiAJaW50IHJjID0gMDsKIAotCWlmIChsZW4gPiBpb3JlYWQzMigmcHJpdi0+Y2NhLT5jbWRfc2l6ZSkpIHsKLQkJZGV2X2VycigmY2hpcC0+ZGV2LAotCQkJImludmFsaWQgY29tbWFuZCBjb3VudCB2YWx1ZSAleCAlenhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBsZW4sCi0JCQkoc2l6ZV90KSBpb3JlYWQzMigmcHJpdi0+Y2NhLT5jbWRfc2l6ZSkpOworCS8qIFplcm8gdGhlIGNhbmNlbCByZWdpc3RlciBzbyB0aGF0IHRoZSBuZXh0IGNvbW1hbmQgd2lsbCBub3QgZ2V0CisJICogY2FuY2VsZWQuCisJICovCisJaW93cml0ZTMyKDAsICZwcml2LT5jY2EtPmNhbmNlbCk7CisKKwlpZiAobGVuID4gcHJpdi0+Y21kX3NpemUpIHsKKwkJZGV2X2VycigmY2hpcC0+ZGV2LCAiaW52YWxpZCBjb21tYW5kIGNvdW50IHZhbHVlICV6ZCAlZFxuIiwKKwkJCWxlbiwgcHJpdi0+Y21kX3NpemUpOwogCQlyZXR1cm4gLUUyQklHOwogCX0KIApAQCAtMTU2LDcgKzE1OSw3IEBACiAJd21iKCk7CiAKIAlpZiAocHJpdi0+ZmxhZ3MgJiBDUkJfRkxfQ1JCX1NUQVJUKQotCQlpb3dyaXRlMzIoY3B1X3RvX2xlMzIoQ1JCX1NUQVJUX0lOVk9LRSksICZwcml2LT5jY2EtPnN0YXJ0KTsKKwkJaW93cml0ZTMyKENSQl9TVEFSVF9JTlZPS0UsICZwcml2LT5jY2EtPnN0YXJ0KTsKIAogCWlmIChwcml2LT5mbGFncyAmIENSQl9GTF9BQ1BJX1NUQVJUKQogCQlyYyA9IGNyYl9kb19hY3BpX3N0YXJ0KGNoaXApOwpAQCAtMTY4LDE1ICsxNzEsMTAgQEAKIHsKIAlzdHJ1Y3QgY3JiX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoJmNoaXAtPmRldik7CiAKLQlpb3dyaXRlMzIoY3B1X3RvX2xlMzIoQ1JCX0NBTkNFTF9JTlZPS0UpLCAmcHJpdi0+Y2NhLT5jYW5jZWwpOwotCi0JLyogTWFrZSBzdXJlIHRoYXQgY21kIGlzIHBvcHVsYXRlZCBiZWZvcmUgaXNzdWluZyBjYW5jZWwuICovCi0Jd21iKCk7CisJaW93cml0ZTMyKENSQl9DQU5DRUxfSU5WT0tFLCAmcHJpdi0+Y2NhLT5jYW5jZWwpOwogCiAJaWYgKChwcml2LT5mbGFncyAmIENSQl9GTF9BQ1BJX1NUQVJUKSAmJiBjcmJfZG9fYWNwaV9zdGFydChjaGlwKSkKIAkJZGV2X2VycigmY2hpcC0+ZGV2LCAiQUNQSSBTdGFydCBmYWlsZWRcbiIpOwotCi0JaW93cml0ZTMyKDAsICZwcml2LT5jY2EtPmNhbmNlbCk7CiB9CiAKIHN0YXRpYyBib29sIGNyYl9yZXFfY2FuY2VsZWQoc3RydWN0IHRwbV9jaGlwICpjaGlwLCB1OCBzdGF0dXMpCkBAIC0xOTQsOCArMTkyLDggQEAKIAkuc2VuZCA9IGNyYl9zZW5kLAogCS5jYW5jZWwgPSBjcmJfY2FuY2VsLAogCS5yZXFfY2FuY2VsZWQgPSBjcmJfcmVxX2NhbmNlbGVkLAotCS5yZXFfY29tcGxldGVfbWFzayA9IENSQl9TVFNfQ09NUExFVEUsCi0JLnJlcV9jb21wbGV0ZV92YWwgPSBDUkJfU1RTX0NPTVBMRVRFLAorCS5yZXFfY29tcGxldGVfbWFzayA9IENSQl9EUlZfU1RTX0NPTVBMRVRFLAorCS5yZXFfY29tcGxldGVfdmFsID0gQ1JCX0RSVl9TVFNfQ09NUExFVEUsCiB9OwogCiBzdGF0aWMgaW50IGNyYl9pbml0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgY3JiX3ByaXYgKnByaXYpCkBAIC0yNjUsOCArMjYzLDcgQEAKIAlhY3BpX2Rldl9mcmVlX3Jlc291cmNlX2xpc3QoJnJlc291cmNlcyk7CiAKIAlpZiAocmVzb3VyY2VfdHlwZSgmaW9fcmVzKSAhPSBJT1JFU09VUkNFX01FTSkgewotCQlkZXZfZXJyKGRldiwKLQkJCUZXX0JVRyAiVFBNMiBBQ1BJIHRhYmxlIGRvZXMgbm90IGRlZmluZSBhIG1lbW9yeSByZXNvdXJjZVxuIik7CisJCWRldl9lcnIoZGV2LCBGV19CVUcgIlRQTTIgQUNQSSB0YWJsZSBkb2VzIG5vdCBkZWZpbmUgYSBtZW1vcnkgcmVzb3VyY2VcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTMwMiw2ICsyOTksNyBAQAogCQlkZXZfZXJyKGRldiwgRldfQlVHICJvdmVybGFwcGluZyBjb21tYW5kIGFuZCByZXNwb25zZSBidWZmZXIgc2l6ZXMgYXJlIG5vdCBpZGVudGljYWwiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCXByaXYtPmNtZF9zaXplID0gY21kX3NpemU7CiAKIAlwcml2LT5yc3AgPSBwcml2LT5jbWQ7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV90aXNfY29yZS5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fdGlzX2NvcmUuYwppbmRleCBkNjZmNTFiLi5lM2JmMzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV90aXNfY29yZS5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX3Rpc19jb3JlLmMKQEAgLTQ0MCw3ICs0NDAsNiBAQAogCQkweDAwLCAweDAwLCAweDAwLCAweGYxCiAJfTsKIAlzaXplX3QgbGVuID0gc2l6ZW9mKGNtZF9nZXR0aWNrcyk7Ci0JYm9vbCBpdHBtOwogCXUxNiB2ZW5kb3I7CiAKIAlyYyA9IHRwbV90aXNfcmVhZDE2KHByaXYsIFRQTV9ESURfVklEKDApLCAmdmVuZG9yKTsKQEAgLTQ1MSw4ICs0NTAsNiBAQAogCWlmICh2ZW5kb3IgIT0gVFBNX1ZJRF9JTlRFTCkKIAkJcmV0dXJuIDA7CiAKLQlpdHBtID0gZmFsc2U7Ci0KIAlyYyA9IHRwbV90aXNfc2VuZF9kYXRhKGNoaXAsIGNtZF9nZXR0aWNrcywgbGVuKTsKIAlpZiAocmMgPT0gMCkKIAkJZ290byBvdXQ7CkBAIC00NjAsOCArNDU3LDYgQEAKIAl0cG1fdGlzX3JlYWR5KGNoaXApOwogCXJlbGVhc2VfbG9jYWxpdHkoY2hpcCwgcHJpdi0+bG9jYWxpdHksIDApOwogCi0JaXRwbSA9IHRydWU7Ci0KIAlyYyA9IHRwbV90aXNfc2VuZF9kYXRhKGNoaXAsIGNtZF9nZXR0aWNrcywgbGVuKTsKIAlpZiAocmMgPT0gMCkgewogCQlkZXZfaW5mbygmY2hpcC0+ZGV2LCAiRGV0ZWN0ZWQgYW4gaVRQTS5cbiIpOwpAQCAtNTI2LDYgKzUyMSwxOCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorc3RhdGljIGludCB0cG1fdGlzX2dlbl9pbnRlcnJ1cHQoc3RydWN0IHRwbV9jaGlwICpjaGlwKQoreworCWNvbnN0IGNoYXIgKmRlc2MgPSAiYXR0ZW1wdGluZyB0byBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQiOworCXUzMiBjYXAyOworCWNhcF90IGNhcDsKKworCWlmIChjaGlwLT5mbGFncyAmIFRQTV9DSElQX0ZMQUdfVFBNMikKKwkJcmV0dXJuIHRwbTJfZ2V0X3RwbV9wdChjaGlwLCAweDEwMCwgJmNhcDIsIGRlc2MpOworCWVsc2UKKwkJcmV0dXJuIHRwbV9nZXRjYXAoY2hpcCwgVFBNX0NBUF9QUk9QX1RJU19USU1FT1VULCAmY2FwLCBkZXNjKTsKK30KKwogLyogUmVnaXN0ZXIgdGhlIElSUSBhbmQgaXNzdWUgYSBjb21tYW5kIHRoYXQgd2lsbCBjYXVzZSBhbiBpbnRlcnJ1cHQuIElmIGFuCiAgKiBpcnEgaXMgc2VlbiB0aGVuIGxlYXZlIHRoZSBjaGlwIHNldHVwIGZvciBJUlEgb3BlcmF0aW9uLCBvdGhlcndpc2UgcmV2ZXJzZQogICogZXZlcnl0aGluZyBhbmQgbGVhdmUgaW4gcG9sbGluZyBtb2RlLiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KQEAgLTU3NSwxMCArNTgyLDkgQEAKIAkvKiBHZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgYnkgaGF2aW5nIHRoZSBjb3JlIGNhbGwgdGhyb3VnaCB0bwogCSAqIHRwbV90aXNfc2VuZAogCSAqLwotCWlmIChjaGlwLT5mbGFncyAmIFRQTV9DSElQX0ZMQUdfVFBNMikKLQkJdHBtMl9nZW5faW50ZXJydXB0KGNoaXApOwotCWVsc2UKLQkJdHBtX2dlbl9pbnRlcnJ1cHQoY2hpcCk7CisJcmMgPSB0cG1fdGlzX2dlbl9pbnRlcnJ1cHQoY2hpcCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOwogCiAJLyogdHBtX3Rpc19zZW5kIHdpbGwgZWl0aGVyIGNvbmZpcm0gdGhlIGludGVycnVwdCBpcyB3b3JraW5nIG9yIGl0CiAJICogd2lsbCBjYWxsIGRpc2FibGVfaXJxIHdoaWNoIHVuZG9lcyBhbGwgb2YgdGhlIGFib3ZlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eXByaW50ay5jIGIvZHJpdmVycy9jaGFyL3R0eXByaW50ay5jCmluZGV4IGIwOThkMmQuLjY3NTQ5Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlwcmludGsuYworKysgYi9kcml2ZXJzL2NoYXIvdHR5cHJpbnRrLmMKQEAgLTMxLDYwICszMSw1MyBAQAogICogcHJpbnRrIG1lc3NhZ2VzIChhbHNvIHN1aXRhYmxlIGZvciBsb2dnaW5nIHNlcnZpY2UpOgogICogLSBhbnkgY3IgaXMgcmVwbGFjZWQgYnkgbmwKICAqIC0gYWRkcyBhIHR0eXByaW50ayBzb3VyY2UgdGFnIGluIGZyb250IG9mIGVhY2ggbGluZQotICogLSB0b28gbG9uZyBtZXNzYWdlIGlzIGZyYWdtZXRlZCwgd2l0aCAnXCdubCBiZXR3ZWVuIGZyYWdtZW50cwotICogLSBUUEtfU1RSX1NJWkUgaXNuJ3QgcmVhbGx5IHRoZSB3cml0ZV9yb29tIGxpbWl0aW5nIGZhY3RvciwgYmNhdXNlCisgKiAtIHRvbyBsb25nIG1lc3NhZ2UgaXMgZnJhZ21lbnRlZCwgd2l0aCAnXCdubCBiZXR3ZWVuIGZyYWdtZW50cworICogLSBUUEtfU1RSX1NJWkUgaXNuJ3QgcmVhbGx5IHRoZSB3cml0ZV9yb29tIGxpbWl0aW5nIGZhY3RvciwgYmVjYXVzZQogICogICBpdCBpcyBlbXB0aWVkIG9uIHRoZSBmbHkgZHVyaW5nIHByZWZvcm1hdHRpbmcuCiAgKi8KICNkZWZpbmUgVFBLX1NUUl9TSVpFIDUwOCAvKiBzaG91bGQgYmUgYmlnZ2VyIHRoZW4gbWF4IGV4cGVjdGVkIGxpbmUgbGVuZ3RoICovCiAjZGVmaW5lIFRQS19NQVhfUk9PTSA0MDk2IC8qIHdlIGNvdWxkIGFzc3VtZSA0SyBmb3IgaW5zdGFuY2UgKi8KLXN0YXRpYyBjb25zdCBjaGFyICp0cGtfdGFnID0gIltVXSAiOyAvKiBVIGZvciBVc2VyICovCiBzdGF0aWMgaW50IHRwa19jdXJyOwogCitzdGF0aWMgY2hhciB0cGtfYnVmZmVyW1RQS19TVFJfU0laRSArIDRdOworCitzdGF0aWMgdm9pZCB0cGtfZmx1c2godm9pZCkKK3sKKwlpZiAodHBrX2N1cnIgPiAwKSB7CisJCXRwa19idWZmZXJbdHBrX2N1cnJdID0gJ1wwJzsKKwkJcHJfaW5mbygiW1VdICVzXG4iLCB0cGtfYnVmZmVyKTsKKwkJdHBrX2N1cnIgPSAwOworCX0KK30KKwogc3RhdGljIGludCB0cGtfcHJpbnRrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQogewotCXN0YXRpYyBjaGFyIHRtcFtUUEtfU1RSX1NJWkUgKyA0XTsKIAlpbnQgaSA9IHRwa19jdXJyOwogCiAJaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCS8qIGZsdXNoIHRtcFtdICovCi0JCWlmICh0cGtfY3VyciA+IDApIHsKLQkJCS8qIG5vbiBubCBvciBjciB0ZXJtaW5hdGVkIG1lc3NhZ2UgLSBhZGQgbmwgKi8KLQkJCXRtcFt0cGtfY3VyciArIDBdID0gJ1xuJzsKLQkJCXRtcFt0cGtfY3VyciArIDFdID0gJ1wwJzsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzJXMiLCB0cGtfdGFnLCB0bXApOwotCQkJdHBrX2N1cnIgPSAwOwotCQl9CisJCXRwa19mbHVzaCgpOwogCQlyZXR1cm4gaTsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQl0bXBbdHBrX2N1cnJdID0gYnVmW2ldOwotCQlpZiAodHBrX2N1cnIgPCBUUEtfU1RSX1NJWkUpIHsKLQkJCXN3aXRjaCAoYnVmW2ldKSB7Ci0JCQljYXNlICdccic6Ci0JCQkJLyogcmVwbGFjZSBjciB3aXRoIG5sICovCi0JCQkJdG1wW3Rwa19jdXJyICsgMF0gPSAnXG4nOwotCQkJCXRtcFt0cGtfY3VyciArIDFdID0gJ1wwJzsKLQkJCQlwcmludGsoS0VSTl9JTkZPICIlcyVzIiwgdHBrX3RhZywgdG1wKTsKLQkJCQl0cGtfY3VyciA9IDA7Ci0JCQkJaWYgKChpICsgMSkgPCBjb3VudCAmJiBidWZbaSArIDFdID09ICdcbicpCi0JCQkJCWkrKzsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xuJzoKLQkJCQl0bXBbdHBrX2N1cnIgKyAxXSA9ICdcMCc7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMlcyIsIHRwa190YWcsIHRtcCk7Ci0JCQkJdHBrX2N1cnIgPSAwOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQl0cGtfY3VycisrOwotCQkJfQotCQl9IGVsc2UgeworCQlpZiAodHBrX2N1cnIgPj0gVFBLX1NUUl9TSVpFKSB7CiAJCQkvKiBlbmQgb2YgdG1wIGJ1ZmZlciByZWFjaGVkOiBjdXQgdGhlIG1lc3NhZ2UgaW4gdHdvICovCi0JCQl0bXBbdHBrX2N1cnIgKyAxXSA9ICdcXCc7Ci0JCQl0bXBbdHBrX2N1cnIgKyAyXSA9ICdcbic7Ci0JCQl0bXBbdHBrX2N1cnIgKyAzXSA9ICdcMCc7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlcyVzIiwgdHBrX3RhZywgdG1wKTsKLQkJCXRwa19jdXJyID0gMDsKKwkJCXRwa19idWZmZXJbdHBrX2N1cnIrK10gPSAnXFwnOworCQkJdHBrX2ZsdXNoKCk7CisJCX0KKworCQlzd2l0Y2ggKGJ1ZltpXSkgeworCQljYXNlICdccic6CisJCQl0cGtfZmx1c2goKTsKKwkJCWlmICgoaSArIDEpIDwgY291bnQgJiYgYnVmW2kgKyAxXSA9PSAnXG4nKQorCQkJCWkrKzsKKwkJCWJyZWFrOworCQljYXNlICdcbic6CisJCQl0cGtfZmx1c2goKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdHBrX2J1ZmZlclt0cGtfY3VycisrXSA9IGJ1ZltpXTsKKwkJCWJyZWFrOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYyBiL2RyaXZlcnMvY2hhci92aXJ0aW9fY29uc29sZS5jCmluZGV4IGQyNDA2ZmUuLjVkYTQ3ZTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYwpAQCAtMTY1LDYgKzE2NSwxMiBAQAogCSAqLwogCXN0cnVjdCB2aXJ0cXVldWUgKmNfaXZxLCAqY19vdnE7CiAKKwkvKgorCSAqIEEgY29udHJvbCBwYWNrZXQgYnVmZmVyIGZvciBndWVzdC0+aG9zdCByZXF1ZXN0cywgcHJvdGVjdGVkCisJICogYnkgY19vdnFfbG9jay4KKwkgKi8KKwlzdHJ1Y3QgdmlydGlvX2NvbnNvbGVfY29udHJvbCBjcGt0OworCiAJLyogQXJyYXkgb2YgcGVyLXBvcnQgSU8gdmlydHF1ZXVlcyAqLwogCXN0cnVjdCB2aXJ0cXVldWUgKippbl92cXMsICoqb3V0X3ZxczsKIApAQCAtNTYwLDI4ICs1NjYsMjkgQEAKIAkJCQkgIHVuc2lnbmVkIGludCBldmVudCwgdW5zaWduZWQgaW50IHZhbHVlKQogewogCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1sxXTsKLQlzdHJ1Y3QgdmlydGlvX2NvbnNvbGVfY29udHJvbCBjcGt0OwogCXN0cnVjdCB2aXJ0cXVldWUgKnZxOwogCXVuc2lnbmVkIGludCBsZW47CiAKIAlpZiAoIXVzZV9tdWx0aXBvcnQocG9ydGRldikpCiAJCXJldHVybiAwOwogCi0JY3BrdC5pZCA9IGNwdV90b192aXJ0aW8zMihwb3J0ZGV2LT52ZGV2LCBwb3J0X2lkKTsKLQljcGt0LmV2ZW50ID0gY3B1X3RvX3ZpcnRpbzE2KHBvcnRkZXYtPnZkZXYsIGV2ZW50KTsKLQljcGt0LnZhbHVlID0gY3B1X3RvX3ZpcnRpbzE2KHBvcnRkZXYtPnZkZXYsIHZhbHVlKTsKLQogCXZxID0gcG9ydGRldi0+Y19vdnE7CiAKLQlzZ19pbml0X29uZShzZywgJmNwa3QsIHNpemVvZihjcGt0KSk7Ci0KIAlzcGluX2xvY2soJnBvcnRkZXYtPmNfb3ZxX2xvY2spOwotCWlmICh2aXJ0cXVldWVfYWRkX291dGJ1Zih2cSwgc2csIDEsICZjcGt0LCBHRlBfQVRPTUlDKSA9PSAwKSB7CisKKwlwb3J0ZGV2LT5jcGt0LmlkID0gY3B1X3RvX3ZpcnRpbzMyKHBvcnRkZXYtPnZkZXYsIHBvcnRfaWQpOworCXBvcnRkZXYtPmNwa3QuZXZlbnQgPSBjcHVfdG9fdmlydGlvMTYocG9ydGRldi0+dmRldiwgZXZlbnQpOworCXBvcnRkZXYtPmNwa3QudmFsdWUgPSBjcHVfdG9fdmlydGlvMTYocG9ydGRldi0+dmRldiwgdmFsdWUpOworCisJc2dfaW5pdF9vbmUoc2csICZwb3J0ZGV2LT5jcGt0LCBzaXplb2Yoc3RydWN0IHZpcnRpb19jb25zb2xlX2NvbnRyb2wpKTsKKworCWlmICh2aXJ0cXVldWVfYWRkX291dGJ1Zih2cSwgc2csIDEsICZwb3J0ZGV2LT5jcGt0LCBHRlBfQVRPTUlDKSA9PSAwKSB7CiAJCXZpcnRxdWV1ZV9raWNrKHZxKTsKIAkJd2hpbGUgKCF2aXJ0cXVldWVfZ2V0X2J1Zih2cSwgJmxlbikKIAkJCSYmICF2aXJ0cXVldWVfaXNfYnJva2VuKHZxKSkKIAkJCWNwdV9yZWxheCgpOwogCX0KKwogCXNwaW5fdW5sb2NrKCZwb3J0ZGV2LT5jX292cV9sb2NrKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci94aWxseWJ1cy94aWxseWJ1c19jb3JlLmMgYi9kcml2ZXJzL2NoYXIveGlsbHlidXMveGlsbHlidXNfY29yZS5jCmluZGV4IGRjZDE5ZjMuLmI2YzljZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci94aWxseWJ1cy94aWxseWJ1c19jb3JlLmMKKysrIGIvZHJpdmVycy9jaGFyL3hpbGx5YnVzL3hpbGx5YnVzX2NvcmUuYwpAQCAtNjU1LDEwICs2NTUsMTAgQEAKIAogCXZlcnNpb24gPSBjaGFubmVsLT53cl9idWZmZXJzWzBdLT5hZGRyOwogCi0JLyogQ2hlY2sgdmVyc2lvbiBudW1iZXIuIEFjY2VwdCBhbnl0aGluZyBiZWxvdyAweDgyIGZvciBub3cuICovCisJLyogQ2hlY2sgdmVyc2lvbiBudW1iZXIuIFJlamVjdCBhbnl0aGluZyBhYm92ZSAweDgyLiAqLwogCWlmICgqdmVyc2lvbiA+IDB4ODIpIHsKIAkJZGV2X2VycihlbmRwb2ludC0+ZGV2LAotCQkJIk5vIHN1cHBvcnQgZm9yIElEVCB2ZXJzaW9uIDB4JTAyeC4gTWF5YmUgdGhlIHhpbGx5YnVzIGRyaXZlciBuZWVkcyBhbiB1cGdhcmRlLiBBYm9ydGluZy5cbiIsCisJCQkiTm8gc3VwcG9ydCBmb3IgSURUIHZlcnNpb24gMHglMDJ4LiBNYXliZSB0aGUgeGlsbHlidXMgZHJpdmVyIG5lZWRzIGFuIHVwZ3JhZGUuIEFib3J0aW5nLlxuIiwKIAkJCSp2ZXJzaW9uKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvS2NvbmZpZyBiL2RyaXZlcnMvY2xrL0tjb25maWcKaW5kZXggZTJkOWJkNy4uNmE4YWMwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvS2NvbmZpZworKysgYi9kcml2ZXJzL2Nsay9LY29uZmlnCkBAIC0zMSwyMiArMzEsMTIgQEAKIAogc291cmNlICJkcml2ZXJzL2Nsay92ZXJzYXRpbGUvS2NvbmZpZyIKIAotY29uZmlnIENPTU1PTl9DTEtfTUFYX0dFTgotICAgICAgICBib29sCi0KIGNvbmZpZyBDT01NT05fQ0xLX01BWDc3Njg2Ci0JdHJpc3RhdGUgIkNsb2NrIGRyaXZlciBmb3IgTWF4aW0gNzc2ODYgTUZEIgotCWRlcGVuZHMgb24gTUZEX01BWDc3Njg2Ci0Jc2VsZWN0IENPTU1PTl9DTEtfTUFYX0dFTgorCXRyaXN0YXRlICJDbG9jayBkcml2ZXIgZm9yIE1heGltIDc3NjIwLzc3Njg2Lzc3ODAyIE1GRCIKKwlkZXBlbmRzIG9uIE1GRF9NQVg3NzY4NiB8fCBNRkRfTUFYNzc2MjAKIAktLS1oZWxwLS0tCi0JICBUaGlzIGRyaXZlciBzdXBwb3J0cyBNYXhpbSA3NzY4NiBjcnlzdGFsIG9zY2lsbGF0b3IgY2xvY2suIAotCi1jb25maWcgQ09NTU9OX0NMS19NQVg3NzgwMgotCXRyaXN0YXRlICJDbG9jayBkcml2ZXIgZm9yIE1heGltIDc3ODAyIFBNSUMiCi0JZGVwZW5kcyBvbiBNRkRfTUFYNzc2ODYKLQlzZWxlY3QgQ09NTU9OX0NMS19NQVhfR0VOCi0JLS0taGVscC0tLQotCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTWF4aW0gNzc4MDIgY3J5c3RhbCBvc2NpbGxhdG9yIGNsb2NrLgorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTWF4aW0gNzc2MjAvNzc2ODYvNzc4MDIgY3J5c3RhbCBvc2NpbGxhdG9yCisJICBjbG9jay4KIAogY29uZmlnIENPTU1PTl9DTEtfUks4MDgKIAl0cmlzdGF0ZSAiQ2xvY2sgZHJpdmVyIGZvciBSSzgwOC9SSzgxOCIKQEAgLTIxMCw2ICsyMDAsNyBAQAogCiBzb3VyY2UgImRyaXZlcnMvY2xrL2JjbS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL2Nsay9oaXNpbGljb24vS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9jbGsvbWVkaWF0ZWsvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9jbGsvbWVzb24vS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9jbGsvbXZlYnUvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9jbGsvcWNvbS9LY29uZmlnIgpAQCAtMjE4LDUgKzIwOSw2IEBACiBzb3VyY2UgImRyaXZlcnMvY2xrL3N1bnhpLW5nL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvY2xrL3RlZ3JhL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvY2xrL3RpL0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvY2xrL3VuaXBoaWVyL0tjb25maWciCiAKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL01ha2VmaWxlIGIvZHJpdmVycy9jbGsvTWFrZWZpbGUKaW5kZXggM2I2ZjljZi4uOTI1MDgxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jbGsvTWFrZWZpbGUKQEAgLTI2LDEwICsyNiw3IEBACiBvYmotJChDT05GSUdfQ09NTU9OX0NMS19DUzIwMDBfQ1ApCSs9IGNsay1jczIwMDAtY3Aubwogb2JqLSQoQ09ORklHX0FSQ0hfRUZNMzIpCQkrPSBjbGstZWZtMzJnZy5vCiBvYmotJChDT05GSUdfQVJDSF9ISUdIQkFOSykJCSs9IGNsay1oaWdoYmFuay5vCi1vYmotJChDT05GSUdfTUFDSF9MT09OR1NPTjMyKQkJKz0gY2xrLWxzMXgubwotb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfTUFYX0dFTikJKz0gY2xrLW1heC1nZW4ubwogb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfTUFYNzc2ODYpCSs9IGNsay1tYXg3NzY4Ni5vCi1vYmotJChDT05GSUdfQ09NTU9OX0NMS19NQVg3NzgwMikJKz0gY2xrLW1heDc3ODAyLm8KIG9iai0kKENPTkZJR19BUkNIX01CODZTN1gpCQkrPSBjbGstbWI4NnM3eC5vCiBvYmotJChDT05GSUdfQVJDSF9NT1hBUlQpCQkrPSBjbGstbW94YXJ0Lm8KIG9iai0kKENPTkZJR19BUkNIX05PTUFESUspCQkrPSBjbGstbm9tYWRpay5vCkBAIC02Myw2ICs2MCw3IEBACiBvYmotJChDT05GSUdfQVJDSF9NWEMpCQkJKz0gaW14Lwogb2JqLSQoQ09ORklHX01BQ0hfSU5HRU5JQykJCSs9IGluZ2VuaWMvCiBvYmotJChDT05GSUdfQ09NTU9OX0NMS19LRVlTVE9ORSkJKz0ga2V5c3RvbmUvCitvYmotJChDT05GSUdfTUFDSF9MT09OR1NPTjMyKQkJKz0gbG9vbmdzb24xLwogb2JqLSQoQ09ORklHX0FSQ0hfTUVESUFURUspCQkrPSBtZWRpYXRlay8KIG9iai0kKENPTkZJR19DT01NT05fQ0xLX0FNTE9HSUMpCSs9IG1lc29uLwogb2JqLSQoQ09ORklHX01BQ0hfUElDMzIpCQkrPSBtaWNyb2NoaXAvCkBAIC04Niw2ICs4NCw3IEBACiBvYmotJChDT05GSUdfQVJDSF9TVU5YSSkJCSs9IHN1bnhpLW5nLwogb2JqLSQoQ09ORklHX0FSQ0hfVEVHUkEpCQkrPSB0ZWdyYS8KIG9iai15CQkJCQkrPSB0aS8KK29iai0kKENPTkZJR19DTEtfVU5JUEhJRVIpCQkrPSB1bmlwaGllci8KIG9iai0kKENPTkZJR19BUkNIX1U4NTAwKQkJKz0gdXg1MDAvCiBvYmotJChDT05GSUdfQ09NTU9OX0NMS19WRVJTQVRJTEUpCSs9IHZlcnNhdGlsZS8KIG9iai0kKENPTkZJR19YODYpCQkJKz0geDg2LwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstZ2VuZXJhdGVkLmMgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1nZW5lcmF0ZWQuYwppbmRleCA3ZjZiZWM4Li40ZTFjZDVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1nZW5lcmF0ZWQuYworKysgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1nZW5lcmF0ZWQuYwpAQCAtMjMzLDE0ICsyMzMsMTYgQEAKIAkJCQkJPj4gQVQ5MV9QTUNfUENSX0dDS0RJVl9PRkZTRVQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0Ci1hdDkxX2Nsa19yZWdpc3Rlcl9nZW5lcmF0ZWQoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCAgc3BpbmxvY2tfdCAqbG9jaywgY29uc3QgY2hhcgotCQkJICAgICpuYW1lLCBjb25zdCBjaGFyICoqcGFyZW50X25hbWVzLCB1OCBudW1fcGFyZW50cywKLQkJCSAgICB1OCBpZCwgY29uc3Qgc3RydWN0IGNsa19yYW5nZSAqcmFuZ2UpCitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAorYXQ5MV9jbGtfcmVnaXN0ZXJfZ2VuZXJhdGVkKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgc3BpbmxvY2tfdCAqbG9jaywKKwkJCSAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqcGFyZW50X25hbWVzLAorCQkJICAgIHU4IG51bV9wYXJlbnRzLCB1OCBpZCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgY2xrX3JhbmdlICpyYW5nZSkKIHsKIAlzdHJ1Y3QgY2xrX2dlbmVyYXRlZCAqZ2NrOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwlpbnQgcmV0OwogCiAJZ2NrID0ga3phbGxvYyhzaXplb2YoKmdjayksIEdGUF9LRVJORUwpOwogCWlmICghZ2NrKQpAQCAtMjU4LDEzICsyNjAsMTUgQEAKIAlnY2stPmxvY2sgPSBsb2NrOwogCWdjay0+cmFuZ2UgPSAqcmFuZ2U7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJmdjay0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZnY2stPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmZ2NrLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZShnY2spOwotCWVsc2UKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfSBlbHNlCiAJCWNsa19nZW5lcmF0ZWRfc3RhcnR1cChnY2spOwogCi0JcmV0dXJuIGNsazsKKwlyZXR1cm4gaHc7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvZl9zYW1hNWQyX2Nsa19nZW5lcmF0ZWRfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKQEAgLTI3Miw3ICsyNzYsNyBAQAogCWludCBudW07CiAJdTMyIGlkOwogCWNvbnN0IGNoYXIgKm5hbWU7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXVuc2lnbmVkIGludCBudW1fcGFyZW50czsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbR0VORVJBVEVEX1NPVVJDRV9NQVhdOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZ2NrbnA7CkBAIC0zMDYsMTMgKzMxMCwxMyBAQAogCQlvZl9hdDkxX2dldF9jbGtfcmFuZ2UoZ2NrbnAsICJhdG1lbCxjbGstb3V0cHV0LXJhbmdlIiwKIAkJCQkgICAgICAmcmFuZ2UpOwogCi0JCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX2dlbmVyYXRlZChyZWdtYXAsICZwbWNfcGNyX2xvY2ssIG5hbWUsCisJCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfZ2VuZXJhdGVkKHJlZ21hcCwgJnBtY19wY3JfbG9jaywgbmFtZSwKIAkJCQkJCSAgcGFyZW50X25hbWVzLCBudW1fcGFyZW50cywKIAkJCQkJCSAgaWQsICZyYW5nZSk7Ci0JCWlmIChJU19FUlIoY2xrKSkKKwkJaWYgKElTX0VSUihodykpCiAJCQljb250aW51ZTsKIAotCQlvZl9jbGtfYWRkX3Byb3ZpZGVyKGdja25wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIoZ2NrbnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiAJfQogfQogQ0xLX09GX0RFQ0xBUkUob2Zfc2FtYTVkMl9jbGtfZ2VuZXJhdGVkX3NldHVwLCAiYXRtZWwsc2FtYTVkMi1jbGstZ2VuZXJhdGVkIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLWgzMm14LmMgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1oMzJteC5jCmluZGV4IDhlMjBjOGEuLmUwZGFhNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLWgzMm14LmMKKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstaDMybXguYwpAQCAtOTIsNyArOTIsNyBAQAogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwotCXN0cnVjdCBjbGsgKmNsazsKKwlpbnQgcmV0OwogCiAJcmVnbWFwID0gc3lzY29uX25vZGVfdG9fcmVnbWFwKG9mX2dldF9wYXJlbnQobnApKTsKIAlpZiAoSVNfRVJSKHJlZ21hcCkpCkBAIC0xMTMsMTMgKzExMywxMyBAQAogCWgzMm14Y2xrLT5ody5pbml0ID0gJmluaXQ7CiAJaDMybXhjbGstPnJlZ21hcCA9IHJlZ21hcDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmaDMybXhjbGstPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJmgzMm14Y2xrLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZShoMzJteGNsayk7CiAJCXJldHVybjsKIAl9CiAKLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsICZoMzJteGNsay0+aHcpOwogfQogQ0xLX09GX0RFQ0xBUkUob2Zfc2FtYTVkNF9jbGtfaDMybXhfc2V0dXAsICJhdG1lbCxzYW1hNWQ0LWNsay1oMzJteCIsCiAJICAgICAgIG9mX3NhbWE1ZDRfY2xrX2gzMm14X3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLW1haW4uYyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLW1haW4uYwppbmRleCA1OGI1YmFjYS4uYzgxM2MyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstbWFpbi5jCisrKyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLW1haW4uYwpAQCAtMTI4LDE1ICsxMjgsMTYgQEAKIAkuaXNfcHJlcGFyZWQgPSBjbGtfbWFpbl9vc2NfaXNfcHJlcGFyZWQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFfY2xrX3JlZ2lzdGVyX21haW5fb3NjKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKIAkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKIAkJCSAgIGJvb2wgYnlwYXNzKQogewogCXN0cnVjdCBjbGtfbWFpbl9vc2MgKm9zYzsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJc3RydWN0IGNsa19odyAqaHc7CisJaW50IHJldDsKIAogCWlmICghbmFtZSB8fCAhcGFyZW50X25hbWUpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMTYwLDE2ICsxNjEsMTkgQEAKIAkJCQkgICBBVDkxX1BNQ19NT1NDRU4sCiAJCQkJICAgQVQ5MV9QTUNfT1NDQllQQVNTIHwgQVQ5MV9QTUNfS0VZKTsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmb3NjLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gJm9zYy0+aHc7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZvc2MtPmh3KTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKG9zYyk7CisJCWh3ID0gRVJSX1BUUihyZXQpOworCX0KIAotCXJldHVybiBjbGs7CisJcmV0dXJuIGh3OwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgb2ZfYXQ5MXJtOTIwMF9jbGtfbWFpbl9vc2Nfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKQEAgLTE4MywxMSArMTg3LDExIEBACiAJaWYgKElTX0VSUihyZWdtYXApKQogCQlyZXR1cm47CiAKLQljbGsgPSBhdDkxX2Nsa19yZWdpc3Rlcl9tYWluX29zYyhyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lLCBieXBhc3MpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9IGF0OTFfY2xrX3JlZ2lzdGVyX21haW5fb3NjKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUsIGJ5cGFzcyk7CisJaWYgKElTX0VSUihodykpCiAJCXJldHVybjsKIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogfQogQ0xLX09GX0RFQ0xBUkUoYXQ5MXJtOTIwMF9jbGtfbWFpbl9vc2MsICJhdG1lbCxhdDkxcm05MjAwLWNsay1tYWluLW9zYyIsCiAJICAgICAgIG9mX2F0OTFybTkyMDBfY2xrX21haW5fb3NjX3NldHVwKTsKQEAgLTI3MSwxNCArMjc1LDE1IEBACiAJLnJlY2FsY19hY2N1cmFjeSA9IGNsa19tYWluX3JjX29zY19yZWNhbGNfYWNjdXJhY3ksCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFfY2xrX3JlZ2lzdGVyX21haW5fcmNfb3NjKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKIAkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgICB1MzIgZnJlcXVlbmN5LCB1MzIgYWNjdXJhY3kpCiB7CiAJc3RydWN0IGNsa19tYWluX3JjX29zYyAqb3NjOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwlpbnQgcmV0OwogCiAJaWYgKCFuYW1lIHx8ICFmcmVxdWVuY3kpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMjk4LDE2ICszMDMsMTkgQEAKIAlvc2MtPmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKIAlvc2MtPmFjY3VyYWN5ID0gYWNjdXJhY3k7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJm9zYy0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZvc2MtPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCBodyk7CisJaWYgKHJldCkgewogCQlrZnJlZShvc2MpOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFzYW05eDVfY2xrX21haW5fcmNfb3NjX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXUzMiBmcmVxdWVuY3kgPSAwOwogCXUzMiBhY2N1cmFjeSA9IDA7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwpAQCAtMzIxLDExICszMjksMTEgQEAKIAlpZiAoSVNfRVJSKHJlZ21hcCkpCiAJCXJldHVybjsKIAotCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX21haW5fcmNfb3NjKHJlZ21hcCwgbmFtZSwgZnJlcXVlbmN5LCBhY2N1cmFjeSk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfbWFpbl9yY19vc2MocmVnbWFwLCBuYW1lLCBmcmVxdWVuY3ksIGFjY3VyYWN5KTsKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcmV0dXJuOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiB9CiBDTEtfT0ZfREVDTEFSRShhdDkxc2FtOXg1X2Nsa19tYWluX3JjX29zYywgImF0bWVsLGF0OTFzYW05eDUtY2xrLW1haW4tcmMtb3NjIiwKIAkgICAgICAgb2ZfYXQ5MXNhbTl4NV9jbGtfbWFpbl9yY19vc2Nfc2V0dXApOwpAQCAtMzk1LDE0ICs0MDMsMTUgQEAKIAkucmVjYWxjX3JhdGUgPSBjbGtfcm05MjAwX21haW5fcmVjYWxjX3JhdGUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFfY2xrX3JlZ2lzdGVyX3JtOTIwMF9tYWluKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKIAkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgICBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSkKIHsKIAlzdHJ1Y3QgY2xrX3JtOTIwMF9tYWluICpjbGttYWluOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwlpbnQgcmV0OwogCiAJaWYgKCFuYW1lKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTQyMywxNiArNDMyLDE5IEBACiAJY2xrbWFpbi0+aHcuaW5pdCA9ICZpbml0OwogCWNsa21haW4tPnJlZ21hcCA9IHJlZ21hcDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmY2xrbWFpbi0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZjbGttYWluLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJmNsa21haW4tPmh3KTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKGNsa21haW4pOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFybTkyMDBfY2xrX21haW5fc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKQEAgLTQ0NCwxMSArNDU2LDExIEBACiAJaWYgKElTX0VSUihyZWdtYXApKQogCQlyZXR1cm47CiAKLQljbGsgPSBhdDkxX2Nsa19yZWdpc3Rlcl9ybTkyMDBfbWFpbihyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9ybTkyMDBfbWFpbihyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lKTsKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcmV0dXJuOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiB9CiBDTEtfT0ZfREVDTEFSRShhdDkxcm05MjAwX2Nsa19tYWluLCAiYXRtZWwsYXQ5MXJtOTIwMC1jbGstbWFpbiIsCiAJICAgICAgIG9mX2F0OTFybTkyMDBfY2xrX21haW5fc2V0dXApOwpAQCAtNTI5LDE2ICs1NDEsMTcgQEAKIAkuZ2V0X3BhcmVudCA9IGNsa19zYW05eDVfbWFpbl9nZXRfcGFyZW50LAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CiBhdDkxX2Nsa19yZWdpc3Rlcl9zYW05eDVfbWFpbihzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCiAJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgICAgY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywKIAkJCSAgICAgIGludCBudW1fcGFyZW50cykKIHsKIAlzdHJ1Y3QgY2xrX3NhbTl4NV9tYWluICpjbGttYWluOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzOworCXN0cnVjdCBjbGtfaHcgKmh3OworCWludCByZXQ7CiAKIAlpZiAoIW5hbWUpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtNTYxLDE2ICs1NzQsMTkgQEAKIAlyZWdtYXBfcmVhZChjbGttYWluLT5yZWdtYXAsIEFUOTFfQ0tHUl9NT1IsICZzdGF0dXMpOwogCWNsa21haW4tPnBhcmVudCA9IHN0YXR1cyAmIEFUOTFfUE1DX01PU0NFTiA/IDEgOiAwOwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZjbGttYWluLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gJmNsa21haW4tPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmY2xrbWFpbi0+aHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUoY2xrbWFpbik7CisJCWh3ID0gRVJSX1BUUihyZXQpOworCX0KIAotCXJldHVybiBjbGs7CisJcmV0dXJuIGh3OwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgb2ZfYXQ5MXNhbTl4NV9jbGtfbWFpbl9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbMl07CiAJdW5zaWduZWQgaW50IG51bV9wYXJlbnRzOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKQEAgLTU4NywxMiArNjAzLDEyIEBACiAKIAlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgImNsb2NrLW91dHB1dC1uYW1lcyIsICZuYW1lKTsKIAotCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX3NhbTl4NV9tYWluKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWVzLAorCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfc2FtOXg1X21haW4ocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZXMsCiAJCQkJCSAgICBudW1fcGFyZW50cyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChJU19FUlIoaHcpKQogCQlyZXR1cm47CiAKLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIH0KIENMS19PRl9ERUNMQVJFKGF0OTFzYW05eDVfY2xrX21haW4sICJhdG1lbCxhdDkxc2FtOXg1LWNsay1tYWluIiwKIAkgICAgICAgb2ZfYXQ5MXNhbTl4NV9jbGtfbWFpbl9zZXR1cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1tYXN0ZXIuYyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLW1hc3Rlci5jCmluZGV4IGQxMDIxZTEuLmU5Y2JhOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLW1hc3Rlci5jCisrKyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLW1hc3Rlci5jCkBAIC0xMjAsNyArMTIwLDcgQEAKIAkuZ2V0X3BhcmVudCA9IGNsa19tYXN0ZXJfZ2V0X3BhcmVudCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MV9jbGtfcmVnaXN0ZXJfbWFzdGVyKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKIAkJY29uc3QgY2hhciAqbmFtZSwgaW50IG51bV9wYXJlbnRzLAogCQljb25zdCBjaGFyICoqcGFyZW50X25hbWVzLApAQCAtMTI4LDggKzEyOCw5IEBACiAJCWNvbnN0IHN0cnVjdCBjbGtfbWFzdGVyX2NoYXJhY3RlcmlzdGljcyAqY2hhcmFjdGVyaXN0aWNzKQogewogCXN0cnVjdCBjbGtfbWFzdGVyICptYXN0ZXI7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCXN0cnVjdCBjbGtfaHcgKmh3OworCWludCByZXQ7CiAKIAlpZiAoIW5hbWUgfHwgIW51bV9wYXJlbnRzIHx8ICFwYXJlbnRfbmFtZXMpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMTQ5LDEyICsxNTAsMTQgQEAKIAltYXN0ZXItPmNoYXJhY3RlcmlzdGljcyA9IGNoYXJhY3RlcmlzdGljczsKIAltYXN0ZXItPnJlZ21hcCA9IHJlZ21hcDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmbWFzdGVyLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKSB7CisJaHcgPSAmbWFzdGVyLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJm1hc3Rlci0+aHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUobWFzdGVyKTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CiAJfQogCi0JcmV0dXJuIGNsazsKKwlyZXR1cm4gaHc7CiB9CiAKIApAQCAtMTk4LDcgKzIwMSw3IEBACiBvZl9hdDkxX2Nsa19tYXN0ZXJfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCSBjb25zdCBzdHJ1Y3QgY2xrX21hc3Rlcl9sYXlvdXQgKmxheW91dCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJdW5zaWduZWQgaW50IG51bV9wYXJlbnRzOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lc1tNQVNURVJfU09VUkNFX01BWF07CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwpAQCAtMjIxLDEzICsyMjQsMTMgQEAKIAlpZiAoSVNfRVJSKHJlZ21hcCkpCiAJCXJldHVybjsKIAotCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX21hc3RlcihyZWdtYXAsIG5hbWUsIG51bV9wYXJlbnRzLAorCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfbWFzdGVyKHJlZ21hcCwgbmFtZSwgbnVtX3BhcmVudHMsCiAJCQkJICAgICAgIHBhcmVudF9uYW1lcywgbGF5b3V0LAogCQkJCSAgICAgICBjaGFyYWN0ZXJpc3RpY3MpOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGh3KSkKIAkJZ290byBvdXRfZnJlZV9jaGFyYWN0ZXJpc3RpY3M7CiAKLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIAlyZXR1cm47CiAKIG91dF9mcmVlX2NoYXJhY3RlcmlzdGljczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXBlcmlwaGVyYWwuYyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXBlcmlwaGVyYWwuYwppbmRleCBmZDE2MDcyLi5kYzI5ZmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1wZXJpcGhlcmFsLmMKKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstcGVyaXBoZXJhbC5jCkBAIC0xMDQsMTMgKzEwNCwxNCBAQAogCS5pc19lbmFibGVkID0gY2xrX3BlcmlwaGVyYWxfaXNfZW5hYmxlZCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MV9jbGtfcmVnaXN0ZXJfcGVyaXBoZXJhbChzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLCB1MzIgaWQpCiB7CiAJc3RydWN0IGNsa19wZXJpcGhlcmFsICpwZXJpcGg7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCXN0cnVjdCBjbGtfaHcgKmh3OworCWludCByZXQ7CiAKIAlpZiAoIW5hbWUgfHwgIXBhcmVudF9uYW1lIHx8IGlkID4gUEVSSVBIRVJBTF9JRF9NQVgpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMTI5LDExICsxMzAsMTQgQEAKIAlwZXJpcGgtPmh3LmluaXQgPSAmaW5pdDsKIAlwZXJpcGgtPnJlZ21hcCA9IHJlZ21hcDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmcGVyaXBoLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gJnBlcmlwaC0+aHc7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZwZXJpcGgtPmh3KTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKHBlcmlwaCk7CisJCWh3ID0gRVJSX1BUUihyZXQpOworCX0KIAotCXJldHVybiBjbGs7CisJcmV0dXJuIGh3OwogfQogCiBzdGF0aWMgdm9pZCBjbGtfc2FtOXg1X3BlcmlwaGVyYWxfYXV0b2RpdihzdHJ1Y3QgY2xrX3NhbTl4NV9wZXJpcGhlcmFsICpwZXJpcGgpCkBAIC0zMjcsMTQgKzMzMSwxNSBAQAogCS5zZXRfcmF0ZSA9IGNsa19zYW05eDVfcGVyaXBoZXJhbF9zZXRfcmF0ZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MV9jbGtfcmVnaXN0ZXJfc2FtOXg1X3BlcmlwaGVyYWwoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBzcGlubG9ja190ICpsb2NrLAogCQkJCSAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKIAkJCQkgICAgdTMyIGlkLCBjb25zdCBzdHJ1Y3QgY2xrX3JhbmdlICpyYW5nZSkKIHsKIAlzdHJ1Y3QgY2xrX3NhbTl4NV9wZXJpcGhlcmFsICpwZXJpcGg7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCXN0cnVjdCBjbGtfaHcgKmh3OworCWludCByZXQ7CiAKIAlpZiAoIW5hbWUgfHwgIXBhcmVudF9uYW1lKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTM1NywxMyArMzYyLDE1IEBACiAJcGVyaXBoLT5hdXRvX2RpdiA9IHRydWU7CiAJcGVyaXBoLT5yYW5nZSA9ICpyYW5nZTsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmcGVyaXBoLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gJnBlcmlwaC0+aHc7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZwZXJpcGgtPmh3KTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKHBlcmlwaCk7Ci0JZWxzZQorCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9IGVsc2UKIAkJY2xrX3NhbTl4NV9wZXJpcGhlcmFsX2F1dG9kaXYocGVyaXBoKTsKIAotCXJldHVybiBjbGs7CisJcmV0dXJuIGh3OwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQKQEAgLTM3MSw3ICszNzgsNyBAQAogewogCWludCBudW07CiAJdTMyIGlkOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZTsKIAljb25zdCBjaGFyICpuYW1lOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGVyaXBoY2xrbnA7CkBAIC00MDAsNyArNDA3LDcgQEAKIAkJCW5hbWUgPSBwZXJpcGhjbGtucC0+bmFtZTsKIAogCQlpZiAodHlwZSA9PSBQRVJJUEhFUkFMX0FUOTFSTTkyMDApIHsKLQkJCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX3BlcmlwaGVyYWwocmVnbWFwLCBuYW1lLAorCQkJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9wZXJpcGhlcmFsKHJlZ21hcCwgbmFtZSwKIAkJCQkJCQkgICBwYXJlbnRfbmFtZSwgaWQpOwogCQl9IGVsc2UgewogCQkJc3RydWN0IGNsa19yYW5nZSByYW5nZSA9IENMS19SQU5HRSgwLCAwKTsKQEAgLTQwOSwxNyArNDE2LDE3IEBACiAJCQkJCSAgICAgICJhdG1lbCxjbGstb3V0cHV0LXJhbmdlIiwKIAkJCQkJICAgICAgJnJhbmdlKTsKIAotCQkJY2xrID0gYXQ5MV9jbGtfcmVnaXN0ZXJfc2FtOXg1X3BlcmlwaGVyYWwocmVnbWFwLAorCQkJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9zYW05eDVfcGVyaXBoZXJhbChyZWdtYXAsCiAJCQkJCQkJCSAgJnBtY19wY3JfbG9jaywKIAkJCQkJCQkJICBuYW1lLAogCQkJCQkJCQkgIHBhcmVudF9uYW1lLAogCQkJCQkJCQkgIGlkLCAmcmFuZ2UpOwogCQl9CiAKLQkJaWYgKElTX0VSUihjbGspKQorCQlpZiAoSVNfRVJSKGh3KSkKIAkJCWNvbnRpbnVlOwogCi0JCW9mX2Nsa19hZGRfcHJvdmlkZXIocGVyaXBoY2xrbnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwkJb2ZfY2xrX2FkZF9od19wcm92aWRlcihwZXJpcGhjbGtucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXBsbC5jIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstcGxsLmMKaW5kZXggZmIyZTBiNS4uNDVhZDE2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstcGxsLmMKKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstcGxsLmMKQEAgLTI5NiwxNyArMjk2LDE4IEBACiAJLnNldF9yYXRlID0gY2xrX3BsbF9zZXRfcmF0ZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MV9jbGtfcmVnaXN0ZXJfcGxsKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgICAgY29uc3QgY2hhciAqcGFyZW50X25hbWUsIHU4IGlkLAogCQkgICAgICBjb25zdCBzdHJ1Y3QgY2xrX3BsbF9sYXlvdXQgKmxheW91dCwKIAkJICAgICAgY29uc3Qgc3RydWN0IGNsa19wbGxfY2hhcmFjdGVyaXN0aWNzICpjaGFyYWN0ZXJpc3RpY3MpCiB7CiAJc3RydWN0IGNsa19wbGwgKnBsbDsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CiAJaW50IG9mZnNldCA9IFBMTF9SRUcoaWQpOwogCXVuc2lnbmVkIGludCBwbGxyOworCWludCByZXQ7CiAKIAlpZiAoaWQgPiBQTExfTUFYX0lEKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTMzMCwxMiArMzMxLDE0IEBACiAJcGxsLT5kaXYgPSBQTExfRElWKHBsbHIpOwogCXBsbC0+bXVsID0gUExMX01VTChwbGxyLCBsYXlvdXQpOwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZwbGwtPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKKwlodyA9ICZwbGwtPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmcGxsLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZShwbGwpOworCQlodyA9IEVSUl9QVFIocmV0KTsKIAl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogCkBAIC00NjUsNyArNDY4LDcgQEAKIAkJICAgICAgY29uc3Qgc3RydWN0IGNsa19wbGxfbGF5b3V0ICpsYXlvdXQpCiB7CiAJdTMyIGlkOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwpAQCAtNDg2LDEyICs0ODksMTIgQEAKIAlpZiAoIWNoYXJhY3RlcmlzdGljcykKIAkJcmV0dXJuOwogCi0JY2xrID0gYXQ5MV9jbGtfcmVnaXN0ZXJfcGxsKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUsIGlkLCBsYXlvdXQsCisJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9wbGwocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZSwgaWQsIGxheW91dCwKIAkJCQkgICAgY2hhcmFjdGVyaXN0aWNzKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCWdvdG8gb3V0X2ZyZWVfY2hhcmFjdGVyaXN0aWNzOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiAJcmV0dXJuOwogCiBvdXRfZnJlZV9jaGFyYWN0ZXJpc3RpY3M6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1wbGxkaXYuYyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXBsbGRpdi5jCmluZGV4IDJiZWQyNjQuLmI0YWZhZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXBsbGRpdi5jCisrKyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXBsbGRpdi5jCkBAIC03NSwxMyArNzUsMTQgQEAKIAkuc2V0X3JhdGUgPSBjbGtfcGxsZGl2X3NldF9yYXRlLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CiBhdDkxX2Nsa19yZWdpc3Rlcl9wbGxkaXYoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBjb25zdCBjaGFyICpuYW1lLAogCQkJIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lKQogewogCXN0cnVjdCBjbGtfcGxsZGl2ICpwbGxkaXY7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCWludCByZXQ7CiAKIAlwbGxkaXYgPSBremFsbG9jKHNpemVvZigqcGxsZGl2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwbGxkaXYpCkBAIC05NiwxOCArOTcsMjAgQEAKIAlwbGxkaXYtPmh3LmluaXQgPSAmaW5pdDsKIAlwbGxkaXYtPnJlZ21hcCA9IHJlZ21hcDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmcGxsZGl2LT5odyk7Ci0KLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSAmcGxsZGl2LT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnBsbGRpdi0+aHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUocGxsZGl2KTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfQogCi0JcmV0dXJuIGNsazsKKwlyZXR1cm4gaHc7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdAogb2ZfYXQ5MXNhbTl4NV9jbGtfcGxsZGl2X3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CkBAIC0xMjAsMTIgKzEyMywxMSBAQAogCWlmIChJU19FUlIocmVnbWFwKSkKIAkJcmV0dXJuOwogCi0JY2xrID0gYXQ5MV9jbGtfcmVnaXN0ZXJfcGxsZGl2KHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9IGF0OTFfY2xrX3JlZ2lzdGVyX3BsbGRpdihyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lKTsKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcmV0dXJuOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOwotCXJldHVybjsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogfQogQ0xLX09GX0RFQ0xBUkUoYXQ5MXNhbTl4NV9jbGtfcGxsZGl2LCAiYXRtZWwsYXQ5MXNhbTl4NS1jbGstcGxsZGl2IiwKIAkgICAgICAgb2ZfYXQ5MXNhbTl4NV9jbGtfcGxsZGl2X3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXByb2dyYW1tYWJsZS5jIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstcHJvZ3JhbW1hYmxlLmMKaW5kZXggMjVkNTkwNi4uMTkwMTIyZTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1wcm9ncmFtbWFibGUuYworKysgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1wcm9ncmFtbWFibGUuYwpAQCAtMTcwLDE1ICsxNzAsMTYgQEAKIAkuc2V0X3JhdGUgPSBjbGtfcHJvZ3JhbW1hYmxlX3NldF9yYXRlLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CiBhdDkxX2Nsa19yZWdpc3Rlcl9wcm9ncmFtbWFibGUoc3RydWN0IHJlZ21hcCAqcmVnbWFwLAogCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKipwYXJlbnRfbmFtZXMsCiAJCQkgICAgICAgdTggbnVtX3BhcmVudHMsIHU4IGlkLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjbGtfcHJvZ3JhbW1hYmxlX2xheW91dCAqbGF5b3V0KQogewogCXN0cnVjdCBjbGtfcHJvZ3JhbW1hYmxlICpwcm9nOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CisJc3RydWN0IGNsa19odyAqaHc7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OwogCiAJaWYgKGlkID4gUFJPR19JRF9NQVgpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMTk4LDExICsxOTksMTQgQEAKIAlwcm9nLT5ody5pbml0ID0gJmluaXQ7CiAJcHJvZy0+cmVnbWFwID0gcmVnbWFwOwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZwcm9nLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gJnByb2ctPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmcHJvZy0+aHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUocHJvZyk7CisJCWh3ID0gJnByb2ctPmh3OworCX0KIAotCXJldHVybiBjbGs7CisJcmV0dXJuIGh3OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19wcm9ncmFtbWFibGVfbGF5b3V0IGF0OTFybTkyMDBfcHJvZ3JhbW1hYmxlX2xheW91dCA9IHsKQEAgLTIyOSw3ICsyMzMsNyBAQAogewogCWludCBudW07CiAJdTMyIGlkOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAl1bnNpZ25lZCBpbnQgbnVtX3BhcmVudHM7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWVzW1BST0dfU09VUkNFX01BWF07CiAJY29uc3QgY2hhciAqbmFtZTsKQEAgLTI1NywxMyArMjYxLDEzIEBACiAJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgImNsb2NrLW91dHB1dC1uYW1lcyIsICZuYW1lKSkKIAkJCW5hbWUgPSBwcm9nY2xrbnAtPm5hbWU7CiAKLQkJY2xrID0gYXQ5MV9jbGtfcmVnaXN0ZXJfcHJvZ3JhbW1hYmxlKHJlZ21hcCwgbmFtZSwKKwkJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9wcm9ncmFtbWFibGUocmVnbWFwLCBuYW1lLAogCQkJCQkJICAgICBwYXJlbnRfbmFtZXMsIG51bV9wYXJlbnRzLAogCQkJCQkJICAgICBpZCwgbGF5b3V0KTsKLQkJaWYgKElTX0VSUihjbGspKQorCQlpZiAoSVNfRVJSKGh3KSkKIAkJCWNvbnRpbnVlOwogCi0JCW9mX2Nsa19hZGRfcHJvdmlkZXIocHJvZ2Nsa25wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIocHJvZ2Nsa25wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstc2xvdy5jIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstc2xvdy5jCmluZGV4IDYxMDkwYjEuLjU2MGE4YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXNsb3cuYworKysgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1zbG93LmMKQEAgLTEzLDQyICsxMywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay9hdDkxX3BtYy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAKICNpbmNsdWRlICJwbWMuaCIKLSNpbmNsdWRlICJzY2tjLmgiCi0KLSNkZWZpbmUgU0xPV19DTE9DS19GUkVRCQkzMjc2OAotI2RlZmluZSBTTE9XQ0tfU1dfQ1lDTEVTCTUKLSNkZWZpbmUgU0xPV0NLX1NXX1RJTUVfVVNFQwkoKFNMT1dDS19TV19DWUNMRVMgKiBVU0VDX1BFUl9TRUMpIC8gXAotCQkJCSBTTE9XX0NMT0NLX0ZSRVEpCi0KLSNkZWZpbmUJQVQ5MV9TQ0tDX0NSCQkJMHgwMAotI2RlZmluZQkJQVQ5MV9TQ0tDX1JDRU4JCSgxIDw8IDApCi0jZGVmaW5lCQlBVDkxX1NDS0NfT1NDMzJFTgkoMSA8PCAxKQotI2RlZmluZQkJQVQ5MV9TQ0tDX09TQzMyQllQCSgxIDw8IDIpCi0jZGVmaW5lCQlBVDkxX1NDS0NfT1NDU0VMCSgxIDw8IDMpCi0KLXN0cnVjdCBjbGtfc2xvd19vc2MgewotCXN0cnVjdCBjbGtfaHcgaHc7Ci0Jdm9pZCBfX2lvbWVtICpzY2tjcjsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0dXBfdXNlYzsKLX07Ci0KLSNkZWZpbmUgdG9fY2xrX3Nsb3dfb3NjKGh3KSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBjbGtfc2xvd19vc2MsIGh3KQotCi1zdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjIHsKLQlzdHJ1Y3QgY2xrX2h3IGh3OwotCXZvaWQgX19pb21lbSAqc2NrY3I7Ci0JdW5zaWduZWQgbG9uZyBmcmVxdWVuY3k7Ci0JdW5zaWduZWQgbG9uZyBhY2N1cmFjeTsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0dXBfdXNlYzsKLX07Ci0KLSNkZWZpbmUgdG9fY2xrX3Nsb3dfcmNfb3NjKGh3KSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBjbGtfc2xvd19yY19vc2MsIGh3KQogCiBzdHJ1Y3QgY2xrX3NhbTkyNjBfc2xvdyB7CiAJc3RydWN0IGNsa19odyBodzsKQEAgLTU3LDMyOCArMjYsNiBAQAogCiAjZGVmaW5lIHRvX2Nsa19zYW05MjYwX3Nsb3coaHcpIGNvbnRhaW5lcl9vZihodywgc3RydWN0IGNsa19zYW05MjYwX3Nsb3csIGh3KQogCi1zdHJ1Y3QgY2xrX3NhbTl4NV9zbG93IHsKLQlzdHJ1Y3QgY2xrX2h3IGh3OwotCXZvaWQgX19pb21lbSAqc2NrY3I7Ci0JdTggcGFyZW50OwotfTsKLQotI2RlZmluZSB0b19jbGtfc2FtOXg1X3Nsb3coaHcpIGNvbnRhaW5lcl9vZihodywgc3RydWN0IGNsa19zYW05eDVfc2xvdywgaHcpCi0KLXN0YXRpYyBpbnQgY2xrX3Nsb3dfb3NjX3ByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IGNsa19zbG93X29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfb3NjKGh3KTsKLQl2b2lkIF9faW9tZW0gKnNja2NyID0gb3NjLT5zY2tjcjsKLQl1MzIgdG1wID0gcmVhZGwoc2NrY3IpOwotCi0JaWYgKHRtcCAmIEFUOTFfU0NLQ19PU0MzMkJZUCkKLQkJcmV0dXJuIDA7Ci0KLQl3cml0ZWwodG1wIHwgQVQ5MV9TQ0tDX09TQzMyRU4sIHNja2NyKTsKLQotCXVzbGVlcF9yYW5nZShvc2MtPnN0YXJ0dXBfdXNlYywgb3NjLT5zdGFydHVwX3VzZWMgKyAxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjbGtfc2xvd19vc2NfdW5wcmVwYXJlKHN0cnVjdCBjbGtfaHcgKmh3KQotewotCXN0cnVjdCBjbGtfc2xvd19vc2MgKm9zYyA9IHRvX2Nsa19zbG93X29zYyhodyk7Ci0Jdm9pZCBfX2lvbWVtICpzY2tjciA9IG9zYy0+c2NrY3I7Ci0JdTMyIHRtcCA9IHJlYWRsKHNja2NyKTsKLQotCWlmICh0bXAgJiBBVDkxX1NDS0NfT1NDMzJCWVApCi0JCXJldHVybjsKLQotCXdyaXRlbCh0bXAgJiB+QVQ5MV9TQ0tDX09TQzMyRU4sIHNja2NyKTsKLX0KLQotc3RhdGljIGludCBjbGtfc2xvd19vc2NfaXNfcHJlcGFyZWQoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IGNsa19zbG93X29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfb3NjKGh3KTsKLQl2b2lkIF9faW9tZW0gKnNja2NyID0gb3NjLT5zY2tjcjsKLQl1MzIgdG1wID0gcmVhZGwoc2NrY3IpOwotCi0JaWYgKHRtcCAmIEFUOTFfU0NLQ19PU0MzMkJZUCkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gISEodG1wICYgQVQ5MV9TQ0tDX09TQzMyRU4pOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc2xvd19vc2Nfb3BzID0gewotCS5wcmVwYXJlID0gY2xrX3Nsb3dfb3NjX3ByZXBhcmUsCi0JLnVucHJlcGFyZSA9IGNsa19zbG93X29zY191bnByZXBhcmUsCi0JLmlzX3ByZXBhcmVkID0gY2xrX3Nsb3dfb3NjX2lzX3ByZXBhcmVkLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKLWF0OTFfY2xrX3JlZ2lzdGVyX3Nsb3dfb3NjKHZvaWQgX19pb21lbSAqc2NrY3IsCi0JCQkgICBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgY29uc3QgY2hhciAqcGFyZW50X25hbWUsCi0JCQkgICB1bnNpZ25lZCBsb25nIHN0YXJ0dXAsCi0JCQkgICBib29sIGJ5cGFzcykKLXsKLQlzdHJ1Y3QgY2xrX3Nsb3dfb3NjICpvc2M7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKLQlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwotCi0JaWYgKCFzY2tjciB8fCAhbmFtZSB8fCAhcGFyZW50X25hbWUpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCi0Jb3NjID0ga3phbGxvYyhzaXplb2YoKm9zYyksIEdGUF9LRVJORUwpOwotCWlmICghb3NjKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCWluaXQubmFtZSA9IG5hbWU7Ci0JaW5pdC5vcHMgPSAmc2xvd19vc2Nfb3BzOwotCWluaXQucGFyZW50X25hbWVzID0gJnBhcmVudF9uYW1lOwotCWluaXQubnVtX3BhcmVudHMgPSAxOwotCWluaXQuZmxhZ3MgPSBDTEtfSUdOT1JFX1VOVVNFRDsKLQotCW9zYy0+aHcuaW5pdCA9ICZpbml0OwotCW9zYy0+c2NrY3IgPSBzY2tjcjsKLQlvc2MtPnN0YXJ0dXBfdXNlYyA9IHN0YXJ0dXA7Ci0KLQlpZiAoYnlwYXNzKQotCQl3cml0ZWwoKHJlYWRsKHNja2NyKSAmIH5BVDkxX1NDS0NfT1NDMzJFTikgfCBBVDkxX1NDS0NfT1NDMzJCWVAsCi0JCSAgICAgICBzY2tjcik7Ci0KLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJm9zYy0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKLQkJa2ZyZWUob3NjKTsKLQotCXJldHVybiBjbGs7Ci19Ci0KLXZvaWQgX19pbml0IG9mX2F0OTFzYW05eDVfY2xrX3Nsb3dfb3NjX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJCSAgICAgdm9pZCBfX2lvbWVtICpzY2tjcikKLXsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0JY29uc3QgY2hhciAqcGFyZW50X25hbWU7Ci0JY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwotCXUzMiBzdGFydHVwOwotCWJvb2wgYnlwYXNzOwotCi0JcGFyZW50X25hbWUgPSBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKG5wLCAwKTsKLQlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgImNsb2NrLW91dHB1dC1uYW1lcyIsICZuYW1lKTsKLQlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImF0bWVsLHN0YXJ0dXAtdGltZS11c2VjIiwgJnN0YXJ0dXApOwotCWJ5cGFzcyA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImF0bWVsLG9zYy1ieXBhc3MiKTsKLQotCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX3Nsb3dfb3NjKHNja2NyLCBuYW1lLCBwYXJlbnRfbmFtZSwgc3RhcnR1cCwKLQkJCQkJIGJ5cGFzcyk7Ci0JaWYgKElTX0VSUihjbGspKQotCQlyZXR1cm47Ci0KLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNsa19zbG93X3JjX29zY19yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKLQkJCQkJCSB1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKQotewotCXN0cnVjdCBjbGtfc2xvd19yY19vc2MgKm9zYyA9IHRvX2Nsa19zbG93X3JjX29zYyhodyk7Ci0KLQlyZXR1cm4gb3NjLT5mcmVxdWVuY3k7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNsa19zbG93X3JjX29zY19yZWNhbGNfYWNjdXJhY3koc3RydWN0IGNsa19odyAqaHcsCi0JCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgcGFyZW50X2FjYykKLXsKLQlzdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjICpvc2MgPSB0b19jbGtfc2xvd19yY19vc2MoaHcpOwotCi0JcmV0dXJuIG9zYy0+YWNjdXJhY3k7Ci19Ci0KLXN0YXRpYyBpbnQgY2xrX3Nsb3dfcmNfb3NjX3ByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IGNsa19zbG93X3JjX29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfcmNfb3NjKGh3KTsKLQl2b2lkIF9faW9tZW0gKnNja2NyID0gb3NjLT5zY2tjcjsKLQotCXdyaXRlbChyZWFkbChzY2tjcikgfCBBVDkxX1NDS0NfUkNFTiwgc2NrY3IpOwotCi0JdXNsZWVwX3JhbmdlKG9zYy0+c3RhcnR1cF91c2VjLCBvc2MtPnN0YXJ0dXBfdXNlYyArIDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsa19zbG93X3JjX29zY191bnByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IGNsa19zbG93X3JjX29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfcmNfb3NjKGh3KTsKLQl2b2lkIF9faW9tZW0gKnNja2NyID0gb3NjLT5zY2tjcjsKLQotCXdyaXRlbChyZWFkbChzY2tjcikgJiB+QVQ5MV9TQ0tDX1JDRU4sIHNja2NyKTsKLX0KLQotc3RhdGljIGludCBjbGtfc2xvd19yY19vc2NfaXNfcHJlcGFyZWQoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IGNsa19zbG93X3JjX29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfcmNfb3NjKGh3KTsKLQotCXJldHVybiAhIShyZWFkbChvc2MtPnNja2NyKSAmIEFUOTFfU0NLQ19SQ0VOKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHNsb3dfcmNfb3NjX29wcyA9IHsKLQkucHJlcGFyZSA9IGNsa19zbG93X3JjX29zY19wcmVwYXJlLAotCS51bnByZXBhcmUgPSBjbGtfc2xvd19yY19vc2NfdW5wcmVwYXJlLAotCS5pc19wcmVwYXJlZCA9IGNsa19zbG93X3JjX29zY19pc19wcmVwYXJlZCwKLQkucmVjYWxjX3JhdGUgPSBjbGtfc2xvd19yY19vc2NfcmVjYWxjX3JhdGUsCi0JLnJlY2FsY19hY2N1cmFjeSA9IGNsa19zbG93X3JjX29zY19yZWNhbGNfYWNjdXJhY3ksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAotYXQ5MV9jbGtfcmVnaXN0ZXJfc2xvd19yY19vc2Modm9pZCBfX2lvbWVtICpzY2tjciwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGZyZXF1ZW5jeSwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWNjdXJhY3ksCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0dXApCi17Ci0Jc3RydWN0IGNsa19zbG93X3JjX29zYyAqb3NjOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7Ci0Jc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKLQotCWlmICghc2NrY3IgfHwgIW5hbWUpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCi0Jb3NjID0ga3phbGxvYyhzaXplb2YoKm9zYyksIEdGUF9LRVJORUwpOwotCWlmICghb3NjKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCWluaXQubmFtZSA9IG5hbWU7Ci0JaW5pdC5vcHMgPSAmc2xvd19yY19vc2Nfb3BzOwotCWluaXQucGFyZW50X25hbWVzID0gTlVMTDsKLQlpbml0Lm51bV9wYXJlbnRzID0gMDsKLQlpbml0LmZsYWdzID0gQ0xLX0lHTk9SRV9VTlVTRUQ7Ci0KLQlvc2MtPmh3LmluaXQgPSAmaW5pdDsKLQlvc2MtPnNja2NyID0gc2NrY3I7Ci0Jb3NjLT5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7Ci0Jb3NjLT5hY2N1cmFjeSA9IGFjY3VyYWN5OwotCW9zYy0+c3RhcnR1cF91c2VjID0gc3RhcnR1cDsKLQotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmb3NjLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQotCQlrZnJlZShvc2MpOwotCi0JcmV0dXJuIGNsazsKLX0KLQotdm9pZCBfX2luaXQgb2ZfYXQ5MXNhbTl4NV9jbGtfc2xvd19yY19vc2Nfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkJCXZvaWQgX19pb21lbSAqc2NrY3IpCi17Ci0Jc3RydWN0IGNsayAqY2xrOwotCXUzMiBmcmVxdWVuY3kgPSAwOwotCXUzMiBhY2N1cmFjeSA9IDA7Ci0JdTMyIHN0YXJ0dXAgPSAwOwotCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKLQotCW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwgJm5hbWUpOwotCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgJmZyZXF1ZW5jeSk7Ci0Jb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJjbG9jay1hY2N1cmFjeSIsICZhY2N1cmFjeSk7Ci0Jb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJhdG1lbCxzdGFydHVwLXRpbWUtdXNlYyIsICZzdGFydHVwKTsKLQotCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX3Nsb3dfcmNfb3NjKHNja2NyLCBuYW1lLCBmcmVxdWVuY3ksIGFjY3VyYWN5LAotCQkJCQkgICAgc3RhcnR1cCk7Ci0JaWYgKElTX0VSUihjbGspKQotCQlyZXR1cm47Ci0KLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7Ci19Ci0KLXN0YXRpYyBpbnQgY2xrX3NhbTl4NV9zbG93X3NldF9wYXJlbnQoc3RydWN0IGNsa19odyAqaHcsIHU4IGluZGV4KQotewotCXN0cnVjdCBjbGtfc2FtOXg1X3Nsb3cgKnNsb3djayA9IHRvX2Nsa19zYW05eDVfc2xvdyhodyk7Ci0Jdm9pZCBfX2lvbWVtICpzY2tjciA9IHNsb3djay0+c2NrY3I7Ci0JdTMyIHRtcDsKLQotCWlmIChpbmRleCA+IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdG1wID0gcmVhZGwoc2NrY3IpOwotCi0JaWYgKCghaW5kZXggJiYgISh0bXAgJiBBVDkxX1NDS0NfT1NDU0VMKSkgfHwKLQkgICAgKGluZGV4ICYmICh0bXAgJiBBVDkxX1NDS0NfT1NDU0VMKSkpCi0JCXJldHVybiAwOwotCi0JaWYgKGluZGV4KQotCQl0bXAgfD0gQVQ5MV9TQ0tDX09TQ1NFTDsKLQllbHNlCi0JCXRtcCAmPSB+QVQ5MV9TQ0tDX09TQ1NFTDsKLQotCXdyaXRlbCh0bXAsIHNja2NyKTsKLQotCXVzbGVlcF9yYW5nZShTTE9XQ0tfU1dfVElNRV9VU0VDLCBTTE9XQ0tfU1dfVElNRV9VU0VDICsgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHU4IGNsa19zYW05eDVfc2xvd19nZXRfcGFyZW50KHN0cnVjdCBjbGtfaHcgKmh3KQotewotCXN0cnVjdCBjbGtfc2FtOXg1X3Nsb3cgKnNsb3djayA9IHRvX2Nsa19zYW05eDVfc2xvdyhodyk7Ci0KLQlyZXR1cm4gISEocmVhZGwoc2xvd2NrLT5zY2tjcikgJiBBVDkxX1NDS0NfT1NDU0VMKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHNhbTl4NV9zbG93X29wcyA9IHsKLQkuc2V0X3BhcmVudCA9IGNsa19zYW05eDVfc2xvd19zZXRfcGFyZW50LAotCS5nZXRfcGFyZW50ID0gY2xrX3NhbTl4NV9zbG93X2dldF9wYXJlbnQsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAotYXQ5MV9jbGtfcmVnaXN0ZXJfc2FtOXg1X3Nsb3codm9pZCBfX2lvbWVtICpzY2tjciwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgICAgICBjb25zdCBjaGFyICoqcGFyZW50X25hbWVzLAotCQkJICAgICAgaW50IG51bV9wYXJlbnRzKQotewotCXN0cnVjdCBjbGtfc2FtOXg1X3Nsb3cgKnNsb3djazsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwotCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7Ci0KLQlpZiAoIXNja2NyIHx8ICFuYW1lIHx8ICFwYXJlbnRfbmFtZXMgfHwgIW51bV9wYXJlbnRzKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQotCXNsb3djayA9IGt6YWxsb2Moc2l6ZW9mKCpzbG93Y2spLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNsb3djaykKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0KLQlpbml0Lm5hbWUgPSBuYW1lOwotCWluaXQub3BzID0gJnNhbTl4NV9zbG93X29wczsKLQlpbml0LnBhcmVudF9uYW1lcyA9IHBhcmVudF9uYW1lczsKLQlpbml0Lm51bV9wYXJlbnRzID0gbnVtX3BhcmVudHM7Ci0JaW5pdC5mbGFncyA9IDA7Ci0KLQlzbG93Y2stPmh3LmluaXQgPSAmaW5pdDsKLQlzbG93Y2stPnNja2NyID0gc2NrY3I7Ci0Jc2xvd2NrLT5wYXJlbnQgPSAhIShyZWFkbChzY2tjcikgJiBBVDkxX1NDS0NfT1NDU0VMKTsKLQotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmc2xvd2NrLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQotCQlrZnJlZShzbG93Y2spOwotCi0JcmV0dXJuIGNsazsKLX0KLQotdm9pZCBfX2luaXQgb2ZfYXQ5MXNhbTl4NV9jbGtfc2xvd19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCQkgdm9pZCBfX2lvbWVtICpzY2tjcikKLXsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0JY29uc3QgY2hhciAqcGFyZW50X25hbWVzWzJdOwotCXVuc2lnbmVkIGludCBudW1fcGFyZW50czsKLQljb25zdCBjaGFyICpuYW1lID0gbnAtPm5hbWU7Ci0KLQludW1fcGFyZW50cyA9IG9mX2Nsa19nZXRfcGFyZW50X2NvdW50KG5wKTsKLQlpZiAobnVtX3BhcmVudHMgPT0gMCB8fCBudW1fcGFyZW50cyA+IDIpCi0JCXJldHVybjsKLQotCW9mX2Nsa19wYXJlbnRfZmlsbChucCwgcGFyZW50X25hbWVzLCBudW1fcGFyZW50cyk7Ci0KLQlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgImNsb2NrLW91dHB1dC1uYW1lcyIsICZuYW1lKTsKLQotCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX3NhbTl4NV9zbG93KHNja2NyLCBuYW1lLCBwYXJlbnRfbmFtZXMsCi0JCQkJCSAgICBudW1fcGFyZW50cyk7Ci0JaWYgKElTX0VSUihjbGspKQotCQlyZXR1cm47Ci0KLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7Ci19Ci0KIHN0YXRpYyB1OCBjbGtfc2FtOTI2MF9zbG93X2dldF9wYXJlbnQoc3RydWN0IGNsa19odyAqaHcpCiB7CiAJc3RydWN0IGNsa19zYW05MjYwX3Nsb3cgKnNsb3djayA9IHRvX2Nsa19zYW05MjYwX3Nsb3coaHcpOwpAQCAtMzkzLDE1ICs0MCwxNiBAQAogCS5nZXRfcGFyZW50ID0gY2xrX3NhbTkyNjBfc2xvd19nZXRfcGFyZW50LAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CiBhdDkxX2Nsa19yZWdpc3Rlcl9zYW05MjYwX3Nsb3coc3RydWN0IHJlZ21hcCAqcmVnbWFwLAogCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgICAgY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywKIAkJCSAgICAgICBpbnQgbnVtX3BhcmVudHMpCiB7CiAJc3RydWN0IGNsa19zYW05MjYwX3Nsb3cgKnNsb3djazsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKIAogCWlmICghbmFtZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CkBAIC00MjIsMTYgKzcwLDE5IEBACiAJc2xvd2NrLT5ody5pbml0ID0gJmluaXQ7CiAJc2xvd2NrLT5yZWdtYXAgPSByZWdtYXA7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJnNsb3djay0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZzbG93Y2stPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmc2xvd2NrLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZShzbG93Y2spOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFzYW05MjYwX2Nsa19zbG93X3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lc1syXTsKIAl1bnNpZ25lZCBpbnQgbnVtX3BhcmVudHM7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwpAQCAtNDQ4LDEyICs5OSwxMiBAQAogCiAJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLCAmbmFtZSk7CiAKLQljbGsgPSBhdDkxX2Nsa19yZWdpc3Rlcl9zYW05MjYwX3Nsb3cocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZXMsCisJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9zYW05MjYwX3Nsb3cocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZXMsCiAJCQkJCSAgICAgbnVtX3BhcmVudHMpOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcmV0dXJuOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiB9CiAKIENMS19PRl9ERUNMQVJFKGF0OTFzYW05MjYwX2Nsa19zbG93LCAiYXRtZWwsYXQ5MXNhbTkyNjAtY2xrLXNsb3ciLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstc21kLmMgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1zbWQuYwppbmRleCAzYzA0YjA2Li45NjVjNjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1zbWQuYworKysgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1zbWQuYwpAQCAtMTExLDEzICsxMTEsMTQgQEAKIAkuc2V0X3JhdGUgPSBhdDkxc2FtOXg1X2Nsa19zbWRfc2V0X3JhdGUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFzYW05eDVfY2xrX3JlZ2lzdGVyX3NtZChzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywgdTggbnVtX3BhcmVudHMpCiB7CiAJc3RydWN0IGF0OTFzYW05eDVfY2xrX3NtZCAqc21kOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CisJc3RydWN0IGNsa19odyAqaHc7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OwogCiAJc21kID0ga3phbGxvYyhzaXplb2YoKnNtZCksIEdGUF9LRVJORUwpOwogCWlmICghc21kKQpAQCAtMTMyLDE2ICsxMzMsMTkgQEAKIAlzbWQtPmh3LmluaXQgPSAmaW5pdDsKIAlzbWQtPnJlZ21hcCA9IHJlZ21hcDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmc21kLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gJnNtZC0+aHc7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZzbWQtPmh3KTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKHNtZCk7CisJCWh3ID0gRVJSX1BUUihyZXQpOworCX0KIAotCXJldHVybiBjbGs7CisJcmV0dXJuIGh3OwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgb2ZfYXQ5MXNhbTl4NV9jbGtfc21kX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXVuc2lnbmVkIGludCBudW1fcGFyZW50czsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbU01EX1NPVVJDRV9NQVhdOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKQEAgLTE1OSwxMiArMTYzLDEyIEBACiAJaWYgKElTX0VSUihyZWdtYXApKQogCQlyZXR1cm47CiAKLQljbGsgPSBhdDkxc2FtOXg1X2Nsa19yZWdpc3Rlcl9zbWQocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZXMsCisJaHcgPSBhdDkxc2FtOXg1X2Nsa19yZWdpc3Rlcl9zbWQocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZXMsCiAJCQkJCSAgbnVtX3BhcmVudHMpOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcmV0dXJuOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiB9CiBDTEtfT0ZfREVDTEFSRShhdDkxc2FtOXg1X2Nsa19zbWQsICJhdG1lbCxhdDkxc2FtOXg1LWNsay1zbWQiLAogCSAgICAgICBvZl9hdDkxc2FtOXg1X2Nsa19zbWRfc2V0dXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstc3lzdGVtLmMgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1zeXN0ZW0uYwppbmRleCA4ZjM1ZDgxLi44NmEzNjgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1zeXN0ZW0uYworKysgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1zeXN0ZW0uYwpAQCAtODgsMTMgKzg4LDE0IEBACiAJLmlzX3ByZXBhcmVkID0gY2xrX3N5c3RlbV9pc19wcmVwYXJlZCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MV9jbGtfcmVnaXN0ZXJfc3lzdGVtKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgY29uc3QgY2hhciAqbmFtZSwKIAkJCSBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwgdTggaWQpCiB7CiAJc3RydWN0IGNsa19zeXN0ZW0gKnN5czsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKIAogCWlmICghcGFyZW50X25hbWUgfHwgaWQgPiBTWVNURU1fTUFYX0lEKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTExMywxOCArMTE0LDIxIEBACiAJc3lzLT5ody5pbml0ID0gJmluaXQ7CiAJc3lzLT5yZWdtYXAgPSByZWdtYXA7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJnN5cy0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZzeXMtPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmc3lzLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZShzeXMpOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFybTkyMDBfY2xrX3N5c19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewogCWludCBudW07CiAJdTMyIGlkOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAljb25zdCBjaGFyICpuYW1lOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc3lzY2xrbnA7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CkBAIC0xNDcsMTEgKzE1MSwxMSBAQAogCiAJCXBhcmVudF9uYW1lID0gb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShzeXNjbGtucCwgMCk7CiAKLQkJY2xrID0gYXQ5MV9jbGtfcmVnaXN0ZXJfc3lzdGVtKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUsIGlkKTsKLQkJaWYgKElTX0VSUihjbGspKQorCQlodyA9IGF0OTFfY2xrX3JlZ2lzdGVyX3N5c3RlbShyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lLCBpZCk7CisJCWlmIChJU19FUlIoaHcpKQogCQkJY29udGludWU7CiAKLQkJb2ZfY2xrX2FkZF9wcm92aWRlcihzeXNjbGtucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCQlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKHN5c2Nsa25wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogCX0KIH0KIENMS19PRl9ERUNMQVJFKGF0OTFybTkyMDBfY2xrX3N5cywgImF0bWVsLGF0OTFybTkyMDAtY2xrLXN5c3RlbSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay11c2IuYyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXVzYi5jCmluZGV4IGQ4MGJkYjAuLjc5MTc3MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXVzYi5jCisrKyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXVzYi5jCkBAIC0xOTIsMTMgKzE5MiwxNCBAQAogCS5zZXRfcmF0ZSA9IGF0OTFzYW05eDVfY2xrX3VzYl9zZXRfcmF0ZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MXNhbTl4NV9jbGtfcmVnaXN0ZXJfdXNiKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgY29uc3QgY2hhciAqbmFtZSwKIAkJCSAgICBjb25zdCBjaGFyICoqcGFyZW50X25hbWVzLCB1OCBudW1fcGFyZW50cykKIHsKIAlzdHJ1Y3QgYXQ5MXNhbTl4NV9jbGtfdXNiICp1c2I7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCWludCByZXQ7CiAKIAl1c2IgPSBremFsbG9jKHNpemVvZigqdXNiKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF1c2IpCkBAIC0yMTQsMjAgKzIxNSwyNCBAQAogCXVzYi0+aHcuaW5pdCA9ICZpbml0OwogCXVzYi0+cmVnbWFwID0gcmVnbWFwOwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZ1c2ItPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSAmdXNiLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnVzYi0+aHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUodXNiKTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfQogCi0JcmV0dXJuIGNsazsKKwlyZXR1cm4gaHc7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MXNhbTluMTJfY2xrX3JlZ2lzdGVyX3VzYihzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lKQogewogCXN0cnVjdCBhdDkxc2FtOXg1X2Nsa191c2IgKnVzYjsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKIAogCXVzYiA9IGt6YWxsb2Moc2l6ZW9mKCp1c2IpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVzYikKQEAgLTI0MiwxMSArMjQ3LDE0IEBACiAJdXNiLT5ody5pbml0ID0gJmluaXQ7CiAJdXNiLT5yZWdtYXAgPSByZWdtYXA7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJnVzYi0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZ1c2ItPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmdXNiLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZSh1c2IpOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgYXQ5MXJtOTIwMF9jbGtfdXNiX3JlY2FsY19yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LApAQCAtMzM0LDEzICszNDIsMTQgQEAKIAkuc2V0X3JhdGUgPSBhdDkxcm05MjAwX2Nsa191c2Jfc2V0X3JhdGUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFybTkyMDBfY2xrX3JlZ2lzdGVyX3VzYihzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgY29uc3QgY2hhciAqcGFyZW50X25hbWUsIGNvbnN0IHUzMiAqZGl2aXNvcnMpCiB7CiAJc3RydWN0IGF0OTFybTkyMDBfY2xrX3VzYiAqdXNiOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CisJc3RydWN0IGNsa19odyAqaHc7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OwogCiAJdXNiID0ga3phbGxvYyhzaXplb2YoKnVzYiksIEdGUF9LRVJORUwpOwogCWlmICghdXNiKQpAQCAtMzU2LDE2ICszNjUsMTkgQEAKIAl1c2ItPnJlZ21hcCA9IHJlZ21hcDsKIAltZW1jcHkodXNiLT5kaXZpc29ycywgZGl2aXNvcnMsIHNpemVvZih1c2ItPmRpdmlzb3JzKSk7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJnVzYi0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZ1c2ItPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmdXNiLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZSh1c2IpOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFzYW05eDVfY2xrX3VzYl9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAl1bnNpZ25lZCBpbnQgbnVtX3BhcmVudHM7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWVzW1VTQl9TT1VSQ0VfTUFYXTsKIAljb25zdCBjaGFyICpuYW1lID0gbnAtPm5hbWU7CkBAIC0zODMsMTkgKzM5NSwxOSBAQAogCWlmIChJU19FUlIocmVnbWFwKSkKIAkJcmV0dXJuOwogCi0JY2xrID0gYXQ5MXNhbTl4NV9jbGtfcmVnaXN0ZXJfdXNiKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWVzLAotCQkJCQkgIG51bV9wYXJlbnRzKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSBhdDkxc2FtOXg1X2Nsa19yZWdpc3Rlcl91c2IocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZXMsCisJCQkJCSBudW1fcGFyZW50cyk7CisJaWYgKElTX0VSUihodykpCiAJCXJldHVybjsKIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogfQogQ0xLX09GX0RFQ0xBUkUoYXQ5MXNhbTl4NV9jbGtfdXNiLCAiYXRtZWwsYXQ5MXNhbTl4NS1jbGstdXNiIiwKIAkgICAgICAgb2ZfYXQ5MXNhbTl4NV9jbGtfdXNiX3NldHVwKTsKIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFzYW05bjEyX2Nsa191c2Jfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKQEAgLTQxMCwxOCArNDIyLDE4IEBACiAJaWYgKElTX0VSUihyZWdtYXApKQogCQlyZXR1cm47CiAKLQljbGsgPSBhdDkxc2FtOW4xMl9jbGtfcmVnaXN0ZXJfdXNiKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9IGF0OTFzYW05bjEyX2Nsa19yZWdpc3Rlcl91c2IocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZSk7CisJaWYgKElTX0VSUihodykpCiAJCXJldHVybjsKIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogfQogQ0xLX09GX0RFQ0xBUkUoYXQ5MXNhbTluMTJfY2xrX3VzYiwgImF0bWVsLGF0OTFzYW05bjEyLWNsay11c2IiLAogCSAgICAgICBvZl9hdDkxc2FtOW4xMl9jbGtfdXNiX3NldHVwKTsKIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFybTkyMDBfY2xrX3VzYl9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZTsKIAljb25zdCBjaGFyICpuYW1lID0gbnAtPm5hbWU7CiAJdTMyIGRpdmlzb3JzWzRdID0gezAsIDAsIDAsIDB9OwpAQCAtNDQwLDEyICs0NTIsMTEgQEAKIAlyZWdtYXAgPSBzeXNjb25fbm9kZV90b19yZWdtYXAob2ZfZ2V0X3BhcmVudChucCkpOwogCWlmIChJU19FUlIocmVnbWFwKSkKIAkJcmV0dXJuOwotCi0JY2xrID0gYXQ5MXJtOTIwMF9jbGtfcmVnaXN0ZXJfdXNiKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUsIGRpdmlzb3JzKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSBhdDkxcm05MjAwX2Nsa19yZWdpc3Rlcl91c2IocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZSwgZGl2aXNvcnMpOworCWlmIChJU19FUlIoaHcpKQogCQlyZXR1cm47CiAKLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIH0KIENMS19PRl9ERUNMQVJFKGF0OTFybTkyMDBfY2xrX3VzYiwgImF0bWVsLGF0OTFybTkyMDAtY2xrLXVzYiIsCiAJICAgICAgIG9mX2F0OTFybTkyMDBfY2xrX3VzYl9zZXR1cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay11dG1pLmMgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay11dG1pLmMKaW5kZXggNjFmY2YzOS4uYWFkYWJkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstdXRtaS5jCisrKyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXV0bWkuYwpAQCAtNzcsMTMgKzc3LDE0IEBACiAJLnJlY2FsY19yYXRlID0gY2xrX3V0bWlfcmVjYWxjX3JhdGUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFfY2xrX3JlZ2lzdGVyX3V0bWkoc3RydWN0IHJlZ21hcCAqcmVnbWFwLAogCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcGFyZW50X25hbWUpCiB7CiAJc3RydWN0IGNsa191dG1pICp1dG1pOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CisJc3RydWN0IGNsa19odyAqaHc7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OwogCiAJdXRtaSA9IGt6YWxsb2Moc2l6ZW9mKCp1dG1pKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF1dG1pKQpAQCAtOTgsMTYgKzk5LDE5IEBACiAJdXRtaS0+aHcuaW5pdCA9ICZpbml0OwogCXV0bWktPnJlZ21hcCA9IHJlZ21hcDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmdXRtaS0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZ1dG1pLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnV0bWktPmh3KTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKHV0bWkpOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFzYW05eDVfY2xrX3V0bWlfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKQEAgLTEyMCwxMSArMTI0LDExIEBACiAJaWYgKElTX0VSUihyZWdtYXApKQogCQlyZXR1cm47CiAKLQljbGsgPSBhdDkxX2Nsa19yZWdpc3Rlcl91dG1pKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9IGF0OTFfY2xrX3JlZ2lzdGVyX3V0bWkocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZSk7CisJaWYgKElTX0VSUihodykpCiAJCXJldHVybjsKIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogCXJldHVybjsKIH0KIENMS19PRl9ERUNMQVJFKGF0OTFzYW05eDVfY2xrX3V0bWksICJhdG1lbCxhdDkxc2FtOXg1LWNsay11dG1pIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvc2NrYy5jIGIvZHJpdmVycy9jbGsvYXQ5MS9zY2tjLmMKaW5kZXggMTE4NGQ3Ni4uYWI2ZWNlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9zY2tjLmMKKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9zY2tjLmMKQEAgLTEyLDExICsxMiwzODIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgInNja2MuaCIKKyNkZWZpbmUgU0xPV19DTE9DS19GUkVRCQkzMjc2OAorI2RlZmluZSBTTE9XQ0tfU1dfQ1lDTEVTCTUKKyNkZWZpbmUgU0xPV0NLX1NXX1RJTUVfVVNFQwkoKFNMT1dDS19TV19DWUNMRVMgKiBVU0VDX1BFUl9TRUMpIC8gXAorCQkJCSBTTE9XX0NMT0NLX0ZSRVEpCisKKyNkZWZpbmUJQVQ5MV9TQ0tDX0NSCQkJMHgwMAorI2RlZmluZQkJQVQ5MV9TQ0tDX1JDRU4JCSgxIDw8IDApCisjZGVmaW5lCQlBVDkxX1NDS0NfT1NDMzJFTgkoMSA8PCAxKQorI2RlZmluZQkJQVQ5MV9TQ0tDX09TQzMyQllQCSgxIDw8IDIpCisjZGVmaW5lCQlBVDkxX1NDS0NfT1NDU0VMCSgxIDw8IDMpCisKK3N0cnVjdCBjbGtfc2xvd19vc2MgeworCXN0cnVjdCBjbGtfaHcgaHc7CisJdm9pZCBfX2lvbWVtICpzY2tjcjsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0dXBfdXNlYzsKK307CisKKyNkZWZpbmUgdG9fY2xrX3Nsb3dfb3NjKGh3KSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBjbGtfc2xvd19vc2MsIGh3KQorCitzdHJ1Y3QgY2xrX3NhbWE1ZDRfc2xvd19vc2MgeworCXN0cnVjdCBjbGtfaHcgaHc7CisJdm9pZCBfX2lvbWVtICpzY2tjcjsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0dXBfdXNlYzsKKwlib29sIHByZXBhcmVkOworfTsKKworI2RlZmluZSB0b19jbGtfc2FtYTVkNF9zbG93X29zYyhodykgY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgY2xrX3NhbWE1ZDRfc2xvd19vc2MsIGh3KQorCitzdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjIHsKKwlzdHJ1Y3QgY2xrX2h3IGh3OworCXZvaWQgX19pb21lbSAqc2NrY3I7CisJdW5zaWduZWQgbG9uZyBmcmVxdWVuY3k7CisJdW5zaWduZWQgbG9uZyBhY2N1cmFjeTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0dXBfdXNlYzsKK307CisKKyNkZWZpbmUgdG9fY2xrX3Nsb3dfcmNfb3NjKGh3KSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBjbGtfc2xvd19yY19vc2MsIGh3KQorCitzdHJ1Y3QgY2xrX3NhbTl4NV9zbG93IHsKKwlzdHJ1Y3QgY2xrX2h3IGh3OworCXZvaWQgX19pb21lbSAqc2NrY3I7CisJdTggcGFyZW50OworfTsKKworI2RlZmluZSB0b19jbGtfc2FtOXg1X3Nsb3coaHcpIGNvbnRhaW5lcl9vZihodywgc3RydWN0IGNsa19zYW05eDVfc2xvdywgaHcpCisKK3N0YXRpYyBpbnQgY2xrX3Nsb3dfb3NjX3ByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGNsa19zbG93X29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfb3NjKGh3KTsKKwl2b2lkIF9faW9tZW0gKnNja2NyID0gb3NjLT5zY2tjcjsKKwl1MzIgdG1wID0gcmVhZGwoc2NrY3IpOworCisJaWYgKHRtcCAmIChBVDkxX1NDS0NfT1NDMzJCWVAgfCBBVDkxX1NDS0NfT1NDMzJFTikpCisJCXJldHVybiAwOworCisJd3JpdGVsKHRtcCB8IEFUOTFfU0NLQ19PU0MzMkVOLCBzY2tjcik7CisKKwl1c2xlZXBfcmFuZ2Uob3NjLT5zdGFydHVwX3VzZWMsIG9zYy0+c3RhcnR1cF91c2VjICsgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xrX3Nsb3dfb3NjX3VucHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2xrX3Nsb3dfb3NjICpvc2MgPSB0b19jbGtfc2xvd19vc2MoaHcpOworCXZvaWQgX19pb21lbSAqc2NrY3IgPSBvc2MtPnNja2NyOworCXUzMiB0bXAgPSByZWFkbChzY2tjcik7CisKKwlpZiAodG1wICYgQVQ5MV9TQ0tDX09TQzMyQllQKQorCQlyZXR1cm47CisKKwl3cml0ZWwodG1wICYgfkFUOTFfU0NLQ19PU0MzMkVOLCBzY2tjcik7Cit9CisKK3N0YXRpYyBpbnQgY2xrX3Nsb3dfb3NjX2lzX3ByZXBhcmVkKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCBjbGtfc2xvd19vc2MgKm9zYyA9IHRvX2Nsa19zbG93X29zYyhodyk7CisJdm9pZCBfX2lvbWVtICpzY2tjciA9IG9zYy0+c2NrY3I7CisJdTMyIHRtcCA9IHJlYWRsKHNja2NyKTsKKworCWlmICh0bXAgJiBBVDkxX1NDS0NfT1NDMzJCWVApCisJCXJldHVybiAxOworCisJcmV0dXJuICEhKHRtcCAmIEFUOTFfU0NLQ19PU0MzMkVOKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHNsb3dfb3NjX29wcyA9IHsKKwkucHJlcGFyZSA9IGNsa19zbG93X29zY19wcmVwYXJlLAorCS51bnByZXBhcmUgPSBjbGtfc2xvd19vc2NfdW5wcmVwYXJlLAorCS5pc19wcmVwYXJlZCA9IGNsa19zbG93X29zY19pc19wcmVwYXJlZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CithdDkxX2Nsa19yZWdpc3Rlcl9zbG93X29zYyh2b2lkIF9faW9tZW0gKnNja2NyLAorCQkJICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLAorCQkJICAgdW5zaWduZWQgbG9uZyBzdGFydHVwLAorCQkJICAgYm9vbCBieXBhc3MpCit7CisJc3RydWN0IGNsa19zbG93X29zYyAqb3NjOworCXN0cnVjdCBjbGtfaHcgKmh3OworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKKworCWlmICghc2NrY3IgfHwgIW5hbWUgfHwgIXBhcmVudF9uYW1lKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCW9zYyA9IGt6YWxsb2Moc2l6ZW9mKCpvc2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9zYykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpbml0Lm5hbWUgPSBuYW1lOworCWluaXQub3BzID0gJnNsb3dfb3NjX29wczsKKwlpbml0LnBhcmVudF9uYW1lcyA9ICZwYXJlbnRfbmFtZTsKKwlpbml0Lm51bV9wYXJlbnRzID0gMTsKKwlpbml0LmZsYWdzID0gQ0xLX0lHTk9SRV9VTlVTRUQ7CisKKwlvc2MtPmh3LmluaXQgPSAmaW5pdDsKKwlvc2MtPnNja2NyID0gc2NrY3I7CisJb3NjLT5zdGFydHVwX3VzZWMgPSBzdGFydHVwOworCisJaWYgKGJ5cGFzcykKKwkJd3JpdGVsKChyZWFkbChzY2tjcikgJiB+QVQ5MV9TQ0tDX09TQzMyRU4pIHwgQVQ5MV9TQ0tDX09TQzMyQllQLAorCQkgICAgICAgc2NrY3IpOworCisJaHcgPSAmb3NjLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJm9zYy0+aHcpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUob3NjKTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfQorCisJcmV0dXJuIGh3OworfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK29mX2F0OTFzYW05eDVfY2xrX3Nsb3dfb3NjX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHZvaWQgX19pb21lbSAqc2NrY3IpCit7CisJc3RydWN0IGNsa19odyAqaHc7CisJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CisJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOworCXUzMiBzdGFydHVwOworCWJvb2wgYnlwYXNzOworCisJcGFyZW50X25hbWUgPSBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKG5wLCAwKTsKKwlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgImNsb2NrLW91dHB1dC1uYW1lcyIsICZuYW1lKTsKKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImF0bWVsLHN0YXJ0dXAtdGltZS11c2VjIiwgJnN0YXJ0dXApOworCWJ5cGFzcyA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImF0bWVsLG9zYy1ieXBhc3MiKTsKKworCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfc2xvd19vc2Moc2NrY3IsIG5hbWUsIHBhcmVudF9uYW1lLCBzdGFydHVwLAorCQkJCQkgYnlwYXNzKTsKKwlpZiAoSVNfRVJSKGh3KSkKKwkJcmV0dXJuOworCisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrX3Nsb3dfcmNfb3NjX3JlY2FsY19yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAorCQkJCQkJIHVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCit7CisJc3RydWN0IGNsa19zbG93X3JjX29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfcmNfb3NjKGh3KTsKKworCXJldHVybiBvc2MtPmZyZXF1ZW5jeTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrX3Nsb3dfcmNfb3NjX3JlY2FsY19hY2N1cmFjeShzdHJ1Y3QgY2xrX2h3ICpodywKKwkJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBwYXJlbnRfYWNjKQoreworCXN0cnVjdCBjbGtfc2xvd19yY19vc2MgKm9zYyA9IHRvX2Nsa19zbG93X3JjX29zYyhodyk7CisKKwlyZXR1cm4gb3NjLT5hY2N1cmFjeTsKK30KKworc3RhdGljIGludCBjbGtfc2xvd19yY19vc2NfcHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjICpvc2MgPSB0b19jbGtfc2xvd19yY19vc2MoaHcpOworCXZvaWQgX19pb21lbSAqc2NrY3IgPSBvc2MtPnNja2NyOworCisJd3JpdGVsKHJlYWRsKHNja2NyKSB8IEFUOTFfU0NLQ19SQ0VOLCBzY2tjcik7CisKKwl1c2xlZXBfcmFuZ2Uob3NjLT5zdGFydHVwX3VzZWMsIG9zYy0+c3RhcnR1cF91c2VjICsgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xrX3Nsb3dfcmNfb3NjX3VucHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjICpvc2MgPSB0b19jbGtfc2xvd19yY19vc2MoaHcpOworCXZvaWQgX19pb21lbSAqc2NrY3IgPSBvc2MtPnNja2NyOworCisJd3JpdGVsKHJlYWRsKHNja2NyKSAmIH5BVDkxX1NDS0NfUkNFTiwgc2NrY3IpOworfQorCitzdGF0aWMgaW50IGNsa19zbG93X3JjX29zY19pc19wcmVwYXJlZChzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjICpvc2MgPSB0b19jbGtfc2xvd19yY19vc2MoaHcpOworCisJcmV0dXJuICEhKHJlYWRsKG9zYy0+c2NrY3IpICYgQVQ5MV9TQ0tDX1JDRU4pOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc2xvd19yY19vc2Nfb3BzID0geworCS5wcmVwYXJlID0gY2xrX3Nsb3dfcmNfb3NjX3ByZXBhcmUsCisJLnVucHJlcGFyZSA9IGNsa19zbG93X3JjX29zY191bnByZXBhcmUsCisJLmlzX3ByZXBhcmVkID0gY2xrX3Nsb3dfcmNfb3NjX2lzX3ByZXBhcmVkLAorCS5yZWNhbGNfcmF0ZSA9IGNsa19zbG93X3JjX29zY19yZWNhbGNfcmF0ZSwKKwkucmVjYWxjX2FjY3VyYWN5ID0gY2xrX3Nsb3dfcmNfb3NjX3JlY2FsY19hY2N1cmFjeSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CithdDkxX2Nsa19yZWdpc3Rlcl9zbG93X3JjX29zYyh2b2lkIF9faW9tZW0gKnNja2NyLAorCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZnJlcXVlbmN5LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhY2N1cmFjeSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnR1cCkKK3sKKwlzdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjICpvc2M7CisJc3RydWN0IGNsa19odyAqaHc7CisJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OworCisJaWYgKCFzY2tjciB8fCAhbmFtZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlvc2MgPSBremFsbG9jKHNpemVvZigqb3NjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvc2MpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaW5pdC5uYW1lID0gbmFtZTsKKwlpbml0Lm9wcyA9ICZzbG93X3JjX29zY19vcHM7CisJaW5pdC5wYXJlbnRfbmFtZXMgPSBOVUxMOworCWluaXQubnVtX3BhcmVudHMgPSAwOworCWluaXQuZmxhZ3MgPSBDTEtfSUdOT1JFX1VOVVNFRDsKKworCW9zYy0+aHcuaW5pdCA9ICZpbml0OworCW9zYy0+c2NrY3IgPSBzY2tjcjsKKwlvc2MtPmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKKwlvc2MtPmFjY3VyYWN5ID0gYWNjdXJhY3k7CisJb3NjLT5zdGFydHVwX3VzZWMgPSBzdGFydHVwOworCisJaHcgPSAmb3NjLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJm9zYy0+aHcpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUob3NjKTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfQorCisJcmV0dXJuIGh3OworfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK29mX2F0OTFzYW05eDVfY2xrX3Nsb3dfcmNfb3NjX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHZvaWQgX19pb21lbSAqc2NrY3IpCit7CisJc3RydWN0IGNsa19odyAqaHc7CisJdTMyIGZyZXF1ZW5jeSA9IDA7CisJdTMyIGFjY3VyYWN5ID0gMDsKKwl1MzIgc3RhcnR1cCA9IDA7CisJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOworCisJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLCAmbmFtZSk7CisJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJjbG9jay1mcmVxdWVuY3kiLCAmZnJlcXVlbmN5KTsKKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImNsb2NrLWFjY3VyYWN5IiwgJmFjY3VyYWN5KTsKKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImF0bWVsLHN0YXJ0dXAtdGltZS11c2VjIiwgJnN0YXJ0dXApOworCisJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9zbG93X3JjX29zYyhzY2tjciwgbmFtZSwgZnJlcXVlbmN5LCBhY2N1cmFjeSwKKwkJCQkJICAgIHN0YXJ0dXApOworCWlmIChJU19FUlIoaHcpKQorCQlyZXR1cm47CisKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOworfQorCitzdGF0aWMgaW50IGNsa19zYW05eDVfc2xvd19zZXRfcGFyZW50KHN0cnVjdCBjbGtfaHcgKmh3LCB1OCBpbmRleCkKK3sKKwlzdHJ1Y3QgY2xrX3NhbTl4NV9zbG93ICpzbG93Y2sgPSB0b19jbGtfc2FtOXg1X3Nsb3coaHcpOworCXZvaWQgX19pb21lbSAqc2NrY3IgPSBzbG93Y2stPnNja2NyOworCXUzMiB0bXA7CisKKwlpZiAoaW5kZXggPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRtcCA9IHJlYWRsKHNja2NyKTsKKworCWlmICgoIWluZGV4ICYmICEodG1wICYgQVQ5MV9TQ0tDX09TQ1NFTCkpIHx8CisJICAgIChpbmRleCAmJiAodG1wICYgQVQ5MV9TQ0tDX09TQ1NFTCkpKQorCQlyZXR1cm4gMDsKKworCWlmIChpbmRleCkKKwkJdG1wIHw9IEFUOTFfU0NLQ19PU0NTRUw7CisJZWxzZQorCQl0bXAgJj0gfkFUOTFfU0NLQ19PU0NTRUw7CisKKwl3cml0ZWwodG1wLCBzY2tjcik7CisKKwl1c2xlZXBfcmFuZ2UoU0xPV0NLX1NXX1RJTUVfVVNFQywgU0xPV0NLX1NXX1RJTUVfVVNFQyArIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBjbGtfc2FtOXg1X3Nsb3dfZ2V0X3BhcmVudChzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2xrX3NhbTl4NV9zbG93ICpzbG93Y2sgPSB0b19jbGtfc2FtOXg1X3Nsb3coaHcpOworCisJcmV0dXJuICEhKHJlYWRsKHNsb3djay0+c2NrY3IpICYgQVQ5MV9TQ0tDX09TQ1NFTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzYW05eDVfc2xvd19vcHMgPSB7CisJLnNldF9wYXJlbnQgPSBjbGtfc2FtOXg1X3Nsb3dfc2V0X3BhcmVudCwKKwkuZ2V0X3BhcmVudCA9IGNsa19zYW05eDVfc2xvd19nZXRfcGFyZW50LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKK2F0OTFfY2xrX3JlZ2lzdGVyX3NhbTl4NV9zbG93KHZvaWQgX19pb21lbSAqc2NrY3IsCisJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICAgY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywKKwkJCSAgICAgIGludCBudW1fcGFyZW50cykKK3sKKwlzdHJ1Y3QgY2xrX3NhbTl4NV9zbG93ICpzbG93Y2s7CisJc3RydWN0IGNsa19odyAqaHc7CisJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OworCisJaWYgKCFzY2tjciB8fCAhbmFtZSB8fCAhcGFyZW50X25hbWVzIHx8ICFudW1fcGFyZW50cykKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlzbG93Y2sgPSBremFsbG9jKHNpemVvZigqc2xvd2NrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbG93Y2spCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaW5pdC5uYW1lID0gbmFtZTsKKwlpbml0Lm9wcyA9ICZzYW05eDVfc2xvd19vcHM7CisJaW5pdC5wYXJlbnRfbmFtZXMgPSBwYXJlbnRfbmFtZXM7CisJaW5pdC5udW1fcGFyZW50cyA9IG51bV9wYXJlbnRzOworCWluaXQuZmxhZ3MgPSAwOworCisJc2xvd2NrLT5ody5pbml0ID0gJmluaXQ7CisJc2xvd2NrLT5zY2tjciA9IHNja2NyOworCXNsb3djay0+cGFyZW50ID0gISEocmVhZGwoc2NrY3IpICYgQVQ5MV9TQ0tDX09TQ1NFTCk7CisKKwlodyA9ICZzbG93Y2stPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmc2xvd2NrLT5odyk7CisJaWYgKHJldCkgeworCQlrZnJlZShzbG93Y2spOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CisKKwlyZXR1cm4gaHc7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAorb2ZfYXQ5MXNhbTl4NV9jbGtfc2xvd19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCB2b2lkIF9faW9tZW0gKnNja2NyKQoreworCXN0cnVjdCBjbGtfaHcgKmh3OworCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lc1syXTsKKwl1bnNpZ25lZCBpbnQgbnVtX3BhcmVudHM7CisJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOworCisJbnVtX3BhcmVudHMgPSBvZl9jbGtfZ2V0X3BhcmVudF9jb3VudChucCk7CisJaWYgKG51bV9wYXJlbnRzID09IDAgfHwgbnVtX3BhcmVudHMgPiAyKQorCQlyZXR1cm47CisKKwlvZl9jbGtfcGFyZW50X2ZpbGwobnAsIHBhcmVudF9uYW1lcywgbnVtX3BhcmVudHMpOworCisJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLCAmbmFtZSk7CisKKwlodyA9IGF0OTFfY2xrX3JlZ2lzdGVyX3NhbTl4NV9zbG93KHNja2NyLCBuYW1lLCBwYXJlbnRfbmFtZXMsCisJCQkJCSAgICBudW1fcGFyZW50cyk7CisJaWYgKElTX0VSUihodykpCisJCXJldHVybjsKKworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7Cit9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNja2NfY2xrX2lkc1tdIF9faW5pdGNvbnN0ID0gewogCS8qIFNsb3cgY2xvY2sgKi8KQEAgLTU1LDMgKzQyNiw5NCBAQAogfQogQ0xLX09GX0RFQ0xBUkUoYXQ5MXNhbTl4NV9jbGtfc2NrYywgImF0bWVsLGF0OTFzYW05eDUtc2NrYyIsCiAJICAgICAgIG9mX2F0OTFzYW05eDVfc2NrY19zZXR1cCk7CisKK3N0YXRpYyBpbnQgY2xrX3NhbWE1ZDRfc2xvd19vc2NfcHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2xrX3NhbWE1ZDRfc2xvd19vc2MgKm9zYyA9IHRvX2Nsa19zYW1hNWQ0X3Nsb3dfb3NjKGh3KTsKKworCWlmIChvc2MtPnByZXBhcmVkKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogQXNzdW1lIHRoYXQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBzZWxlY3RlZCAoZm9yIGV4YW1wbGUgYnkgdGhlCisJICogYm9vdGxvYWRlciksIGVub3VnaCB0aW1lIGhhcyBhcmVhZHkgcGFzc2VkLgorCSAqLworCWlmICgocmVhZGwob3NjLT5zY2tjcikgJiBBVDkxX1NDS0NfT1NDU0VMKSkgeworCQlvc2MtPnByZXBhcmVkID0gdHJ1ZTsKKwkJcmV0dXJuIDA7CisJfQorCisJdXNsZWVwX3JhbmdlKG9zYy0+c3RhcnR1cF91c2VjLCBvc2MtPnN0YXJ0dXBfdXNlYyArIDEpOworCW9zYy0+cHJlcGFyZWQgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2xrX3NhbWE1ZDRfc2xvd19vc2NfaXNfcHJlcGFyZWQoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGNsa19zYW1hNWQ0X3Nsb3dfb3NjICpvc2MgPSB0b19jbGtfc2FtYTVkNF9zbG93X29zYyhodyk7CisKKwlyZXR1cm4gb3NjLT5wcmVwYXJlZDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHNhbWE1ZDRfc2xvd19vc2Nfb3BzID0geworCS5wcmVwYXJlID0gY2xrX3NhbWE1ZDRfc2xvd19vc2NfcHJlcGFyZSwKKwkuaXNfcHJlcGFyZWQgPSBjbGtfc2FtYTVkNF9zbG93X29zY19pc19wcmVwYXJlZCwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvZl9zYW1hNWQ0X3Nja2Nfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZ2Jhc2UgPSBvZl9pb21hcChucCwgMCk7CisJc3RydWN0IGNsa19odyAqaHc7CisJc3RydWN0IGNsa19zYW1hNWQ0X3Nsb3dfb3NjICpvc2M7CisJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwljb25zdCBjaGFyICp4dGFsX25hbWU7CisJY29uc3QgY2hhciAqcGFyZW50X25hbWVzWzJdID0geyAic2xvd19yY19vc2MiLCAic2xvd19vc2MiIH07CisJYm9vbCBieXBhc3M7CisJaW50IHJldDsKKworCWlmICghcmVnYmFzZSkKKwkJcmV0dXJuOworCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZml4ZWRfcmF0ZV93aXRoX2FjY3VyYWN5KE5VTEwsIHBhcmVudF9uYW1lc1swXSwKKwkJCQkJCSAgICAgIE5VTEwsIDAsIDMyNzY4LAorCQkJCQkJICAgICAgMjUwMDAwMDAwKTsKKwlpZiAoSVNfRVJSKGh3KSkKKwkJcmV0dXJuOworCisJeHRhbF9uYW1lID0gb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShucCwgMCk7CisKKwlieXBhc3MgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJhdG1lbCxvc2MtYnlwYXNzIik7CisKKwlvc2MgPSBremFsbG9jKHNpemVvZigqb3NjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvc2MpCisJCXJldHVybjsKKworCWluaXQubmFtZSA9IHBhcmVudF9uYW1lc1sxXTsKKwlpbml0Lm9wcyA9ICZzYW1hNWQ0X3Nsb3dfb3NjX29wczsKKwlpbml0LnBhcmVudF9uYW1lcyA9ICZ4dGFsX25hbWU7CisJaW5pdC5udW1fcGFyZW50cyA9IDE7CisJaW5pdC5mbGFncyA9IENMS19JR05PUkVfVU5VU0VEOworCisJb3NjLT5ody5pbml0ID0gJmluaXQ7CisJb3NjLT5zY2tjciA9IHJlZ2Jhc2U7CisJb3NjLT5zdGFydHVwX3VzZWMgPSAxMjAwMDAwOworCisJaWYgKGJ5cGFzcykKKwkJd3JpdGVsKChyZWFkbChyZWdiYXNlKSB8IEFUOTFfU0NLQ19PU0MzMkJZUCksIHJlZ2Jhc2UpOworCisJaHcgPSAmb3NjLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJm9zYy0+aHcpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUob3NjKTsKKwkJcmV0dXJuOworCX0KKworCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfc2FtOXg1X3Nsb3cocmVnYmFzZSwgInNsb3djayIsIHBhcmVudF9uYW1lcywgMik7CisJaWYgKElTX0VSUihodykpCisJCXJldHVybjsKKworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7Cit9CitDTEtfT0ZfREVDTEFSRShzYW1hNWQ0X2Nsa19zY2tjLCAiYXRtZWwsc2FtYTVkNC1zY2tjIiwKKwkgICAgICAgb2Zfc2FtYTVkNF9zY2tjX3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvc2NrYy5oIGIvZHJpdmVycy9jbGsvYXQ5MS9zY2tjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNmZjZjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9zY2tjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogZHJpdmVycy9jbGsvYXQ5MS9zY2tjLmgKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDEzIEJvcmlzIEJSRVpJTExPTiA8Yi5icmV6aWxsb25Ab3Zlcmtpei5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9fQVQ5MV9TQ0tDX0hfCi0jZGVmaW5lIF9fQVQ5MV9TQ0tDX0hfCi0KLWV4dGVybiB2b2lkIF9faW5pdCBvZl9hdDkxc2FtOXg1X2Nsa19zbG93X29zY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCQkJICAgIHZvaWQgX19pb21lbSAqc2NrY3IpOwotZXh0ZXJuIHZvaWQgX19pbml0IG9mX2F0OTFzYW05eDVfY2xrX3Nsb3dfcmNfb3NjX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJCQkgICAgICAgdm9pZCBfX2lvbWVtICpzY2tjcik7Ci1leHRlcm4gdm9pZCBfX2luaXQgb2ZfYXQ5MXNhbTl4NV9jbGtfc2xvd19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCQkJdm9pZCBfX2lvbWVtICpzY2tjcik7Ci0KLSNlbmRpZiAvKiBfX0FUOTFfU0NLQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXhpcy9jbGstYXJ0cGVjNi5jIGIvZHJpdmVycy9jbGsvYXhpcy9jbGstYXJ0cGVjNi5jCmluZGV4IGZmYzk4OGIuLmRhMWEwNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2F4aXMvY2xrLWFydHBlYzYuYworKysgYi9kcml2ZXJzL2Nsay9heGlzL2Nsay1hcnRwZWM2LmMKQEAgLTExMyw4ICsxMTMsOCBAQAogCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsICZjbGtkYXRhLT5jbGtfZGF0YSk7CiB9CiAKLUNMS19PRl9ERUNMQVJFKGFydHBlYzZfY2xrY3RybCwgImF4aXMsYXJ0cGVjNi1jbGtjdHJsIiwKLQkgICAgICAgb2ZfYXJ0cGVjNl9jbGtjdHJsX3NldHVwKTsKK0NMS19PRl9ERUNMQVJFX0RSSVZFUihhcnRwZWM2X2Nsa2N0cmwsICJheGlzLGFydHBlYzYtY2xrY3RybCIsCisJCSAgICAgIG9mX2FydHBlYzZfY2xrY3RybF9zZXR1cCk7CiAKIHN0YXRpYyBpbnQgYXJ0cGVjNl9jbGtjdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9iY20vS2NvbmZpZyBiL2RyaXZlcnMvY2xrL2JjbS9LY29uZmlnCmluZGV4IGYyODc4NDUuLmYyMWU5YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2JjbS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2xrL2JjbS9LY29uZmlnCkBAIC0xOSw4ICsxOSwzNiBAQAogCSAgaW4gdGhlIEJDTTI4MXh4IGFuZCBCQ00yMTY2NCBmYW1pbGllcy4KIAogY29uZmlnIENPTU1PTl9DTEtfSVBST0MKLQlib29sCisJYm9vbCAiQnJvYWRjb20gaVByb2MgY2xvY2sgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfQkNNX0lQUk9DIHx8IENPTVBJTEVfVEVTVAogCWRlcGVuZHMgb24gQ09NTU9OX0NMSworCWRlZmF1bHQgQVJDSF9CQ01fSVBST0MKIAloZWxwCiAJICBFbmFibGUgY29tbW9uIGNsb2NrIGZyYW1ld29yayBzdXBwb3J0IGZvciBCcm9hZGNvbSBTb0NzCiAJICBiYXNlZCBvbiB0aGUgaVByb2MgYXJjaGl0ZWN0dXJlCisKK2lmIENPTU1PTl9DTEtfSVBST0MKKworY29uZmlnIENMS19CQ01fQ1lHTlVTCisJYm9vbCAiQnJvYWRjb20gQ3lnbnVzIGNsb2NrIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX0JDTV9DWUdOVVMgfHwgQ09NUElMRV9URVNUCisJZGVmYXVsdCBBUkNIX0JDTV9DWUdOVVMKKwloZWxwCisJICBFbmFibGUgY29tbW9uIGNsb2NrIGZyYW1ld29yayBzdXBwb3J0IGZvciB0aGUgQnJvYWRjb20gQ3lnbnVzIFNvQworCitjb25maWcgQ0xLX0JDTV9OU1AKKwlib29sICJCcm9hZGNvbSBOb3J0aHN0YXIvTm9ydGhzdGFyIFBsdXMgY2xvY2sgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfQkNNXzUzMDFYIHx8IEFSQ0hfQkNNX05TUCB8fCBDT01QSUxFX1RFU1QKKwlkZWZhdWx0IEFSQ0hfQkNNXzUzMDFYIHx8IEFSQ0hfQkNNX05TUAorCWhlbHAKKwkgIEVuYWJsZSBjb21tb24gY2xvY2sgZnJhbWV3b3JrIHN1cHBvcnQgZm9yIHRoZSBCcm9hZGNvbSBOb3J0aHN0YXIgYW5kCisJICBOb3J0aHN0YXIgUGx1cyBTb0NzCisKK2NvbmZpZyBDTEtfQkNNX05TMgorCWJvb2wgIkJyb2FkY29tIE5vcnRoc3RhciAyIGNsb2NrIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX0JDTV9JUFJPQyB8fCBDT01QSUxFX1RFU1QKKwlkZWZhdWx0IEFSQ0hfQkNNX0lQUk9DCisJaGVscAorCSAgRW5hYmxlIGNvbW1vbiBjbG9jayBmcmFtZXdvcmsgc3VwcG9ydCBmb3IgdGhlIEJyb2FkY29tIE5vcnRoc3RhciAyIFNvQworCitlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYmNtL01ha2VmaWxlIGIvZHJpdmVycy9jbGsvYmNtL01ha2VmaWxlCmluZGV4IDFkNzliZDIuLmQ5ZGM4NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2JjbS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2Nsay9iY20vTWFrZWZpbGUKQEAgLTYsNyArNiw3IEBACiBvYmotJChDT05GSUdfQ09NTU9OX0NMS19JUFJPQykJKz0gY2xrLWlwcm9jLWFybXBsbC5vIGNsay1pcHJvYy1wbGwubyBjbGstaXByb2MtYXNpdS5vCiBvYmotJChDT05GSUdfQVJDSF9CQ00yODM1KQkrPSBjbGstYmNtMjgzNS5vCiBvYmotJChDT05GSUdfQVJDSF9CQ00yODM1KQkrPSBjbGstYmNtMjgzNS1hdXgubwotb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfSVBST0MpCSs9IGNsay1uczIubwotb2JqLSQoQ09ORklHX0FSQ0hfQkNNX0NZR05VUykJKz0gY2xrLWN5Z251cy5vCi1vYmotJChDT05GSUdfQVJDSF9CQ01fTlNQKQkrPSBjbGstbnNwLm8KLW9iai0kKENPTkZJR19BUkNIX0JDTV81MzAxWCkJKz0gY2xrLW5zcC5vCitvYmotJChDT05GSUdfQVJDSF9CQ01fNTM1NzMpCSs9IGNsay1iY201MzU3My1pbHAubworb2JqLSQoQ09ORklHX0NMS19CQ01fQ1lHTlVTKQkrPSBjbGstY3lnbnVzLm8KK29iai0kKENPTkZJR19DTEtfQkNNX05TUCkJKz0gY2xrLW5zcC5vCitvYmotJChDT05GSUdfQ0xLX0JDTV9OUzIpCSs9IGNsay1uczIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYmNtL2Nsay1iY20yODM1LWF1eC5jIGIvZHJpdmVycy9jbGsvYmNtL2Nsay1iY20yODM1LWF1eC5jCmluZGV4IDNhMTc3YWQuLmJkNzUwY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2JjbS9jbGstYmNtMjgzNS1hdXguYworKysgYi9kcml2ZXJzL2Nsay9iY20vY2xrLWJjbTI4MzUtYXV4LmMKQEAgLTI1LDcgKzI1LDcgQEAKIHN0YXRpYyBpbnQgYmNtMjgzNV9hdXhfY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSAqb25lY2VsbDsKKwlzdHJ1Y3QgY2xrX2h3X29uZWNlbGxfZGF0YSAqb25lY2VsbDsKIAljb25zdCBjaGFyICpwYXJlbnQ7CiAJc3RydWN0IGNsayAqcGFyZW50X2NsazsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKQEAgLTQxLDI4ICs0MSwyNCBAQAogCWlmIChJU19FUlIocmVnKSkKIAkJcmV0dXJuIFBUUl9FUlIocmVnKTsKIAotCW9uZWNlbGwgPSBkZXZtX2ttYWxsb2MoZGV2LCBzaXplb2YoKm9uZWNlbGwpLCBHRlBfS0VSTkVMKTsKKwlvbmVjZWxsID0gZGV2bV9rbWFsbG9jKGRldiwgc2l6ZW9mKCpvbmVjZWxsKSArIHNpemVvZigqb25lY2VsbC0+aHdzKSAqCisJCQkgICAgICAgQkNNMjgzNV9BVVhfQ0xPQ0tfQ09VTlQsIEdGUF9LRVJORUwpOwogCWlmICghb25lY2VsbCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0Jb25lY2VsbC0+Y2xrX251bSA9IEJDTTI4MzVfQVVYX0NMT0NLX0NPVU5UOwotCW9uZWNlbGwtPmNsa3MgPSBkZXZtX2tjYWxsb2MoZGV2LCBCQ00yODM1X0FVWF9DTE9DS19DT1VOVCwKLQkJCQkgICAgIHNpemVvZigqb25lY2VsbC0+Y2xrcyksIEdGUF9LRVJORUwpOwotCWlmICghb25lY2VsbC0+Y2xrcykKLQkJcmV0dXJuIC1FTk9NRU07CisJb25lY2VsbC0+bnVtID0gQkNNMjgzNV9BVVhfQ0xPQ0tfQ09VTlQ7CiAKIAlnYXRlID0gcmVnICsgQkNNMjgzNV9BVVhFTkI7Ci0Jb25lY2VsbC0+Y2xrc1tCQ00yODM1X0FVWF9DTE9DS19VQVJUXSA9Ci0JCWNsa19yZWdpc3Rlcl9nYXRlKGRldiwgImF1eF91YXJ0IiwgcGFyZW50LCAwLCBnYXRlLCAwLCAwLCBOVUxMKTsKKwlvbmVjZWxsLT5od3NbQkNNMjgzNV9BVVhfQ0xPQ0tfVUFSVF0gPQorCQljbGtfaHdfcmVnaXN0ZXJfZ2F0ZShkZXYsICJhdXhfdWFydCIsIHBhcmVudCwgMCwgZ2F0ZSwgMCwgMCwgTlVMTCk7CiAKLQlvbmVjZWxsLT5jbGtzW0JDTTI4MzVfQVVYX0NMT0NLX1NQSTFdID0KLQkJY2xrX3JlZ2lzdGVyX2dhdGUoZGV2LCAiYXV4X3NwaTEiLCBwYXJlbnQsIDAsIGdhdGUsIDEsIDAsIE5VTEwpOworCW9uZWNlbGwtPmh3c1tCQ00yODM1X0FVWF9DTE9DS19TUEkxXSA9CisJCWNsa19od19yZWdpc3Rlcl9nYXRlKGRldiwgImF1eF9zcGkxIiwgcGFyZW50LCAwLCBnYXRlLCAxLCAwLCBOVUxMKTsKIAotCW9uZWNlbGwtPmNsa3NbQkNNMjgzNV9BVVhfQ0xPQ0tfU1BJMl0gPQotCQljbGtfcmVnaXN0ZXJfZ2F0ZShkZXYsICJhdXhfc3BpMiIsIHBhcmVudCwgMCwgZ2F0ZSwgMiwgMCwgTlVMTCk7CisJb25lY2VsbC0+aHdzW0JDTTI4MzVfQVVYX0NMT0NLX1NQSTJdID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2dhdGUoZGV2LCAiYXV4X3NwaTIiLCBwYXJlbnQsIDAsIGdhdGUsIDIsIDAsIE5VTEwpOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihwZGV2LT5kZXYub2Zfbm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgb25lY2VsbCk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gb2ZfY2xrX2FkZF9od19wcm92aWRlcihwZGV2LT5kZXYub2Zfbm9kZSwgb2ZfY2xrX2h3X29uZWNlbGxfZ2V0LAorCQkJCSAgICAgIG9uZWNlbGwpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBiY20yODM1X2F1eF9jbGtfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2JjbS9jbGstYmNtMjgzNS5jIGIvZHJpdmVycy9jbGsvYmNtL2Nsay1iY20yODM1LmMKaW5kZXggN2E3OTcwOC4uYjY4YmY1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYmNtL2Nsay1iY20yODM1LmMKKysrIGIvZHJpdmVycy9jbGsvYmNtL2Nsay1iY20yODM1LmMKQEAgLTM2LDYgKzM2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay9iY20yODM1Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzAyLDggKzMwMyw4IEBACiAJc3BpbmxvY2tfdCByZWdzX2xvY2s7IC8qIHNwaW5sb2NrIGZvciBhbGwgY2xvY2tzICovCiAJY29uc3QgY2hhciAqb3NjX25hbWU7CiAKLQlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSBvbmVjZWxsOwotCXN0cnVjdCBjbGsgKmNsa3NbXTsKKwkvKiBNdXN0IGJlIGxhc3QgKi8KKwlzdHJ1Y3QgY2xrX2h3X29uZWNlbGxfZGF0YSBvbmVjZWxsOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIGNwcm1hbl93cml0ZShzdHJ1Y3QgYmNtMjgzNV9jcHJtYW4gKmNwcm1hbiwgdTMyIHJlZywgdTMyIHZhbCkKQEAgLTM0NCwyNCArMzQ1LDI0IEBACiAgKi8KIHZvaWQgX19pbml0IGJjbTI4MzVfaW5pdF9jbG9ja3Modm9pZCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJaW50IHJldDsKIAotCWNsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJhcGJfcGNsayIsIE5VTEwsIDAsIDEyNjAwMDAwMCk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgImFwYl9wY2xrIiwgTlVMTCwgMCwgMTI2MDAwMDAwKTsKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcHJfZXJyKCJhcGJfcGNsayBub3QgcmVnaXN0ZXJlZFxuIik7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAidWFydDBfcGNsayIsIE5VTEwsIDAsIDMwMDAwMDApOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9IGNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJ1YXJ0MF9wY2xrIiwgTlVMTCwgMCwgMzAwMDAwMCk7CisJaWYgKElTX0VSUihodykpCiAJCXByX2VycigidWFydDBfcGNsayBub3QgcmVnaXN0ZXJlZFxuIik7Ci0JcmV0ID0gY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssIE5VTEwsICIyMDIwMTAwMC51YXJ0Iik7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgTlVMTCwgIjIwMjAxMDAwLnVhcnQiKTsKIAlpZiAocmV0KQogCQlwcl9lcnIoInVhcnQwX3BjbGsgYWxpYXMgbm90IHJlZ2lzdGVyZWRcbiIpOwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgInVhcnQxX3BjbGsiLCBOVUxMLCAwLCAxMjUwMDAwMDApOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9IGNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJ1YXJ0MV9wY2xrIiwgTlVMTCwgMCwgMTI1MDAwMDAwKTsKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcHJfZXJyKCJ1YXJ0MV9wY2xrIG5vdCByZWdpc3RlcmVkXG4iKTsKLQlyZXQgPSBjbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgTlVMTCwgIjIwMjE1MDAwLnVhcnQiKTsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCBOVUxMLCAiMjAyMTUwMDAudWFydCIpOwogCWlmIChyZXQpCiAJCXByX2VycigidWFydDFfcGNsayBhbGlhcyBub3QgcmVnaXN0ZXJlZFxuIik7CiB9CkBAIC00NDMsNiArNDQ0LDggQEAKIAkvKiBOdW1iZXIgb2YgZnJhY3Rpb25hbCBiaXRzIGluIHRoZSBkaXZpZGVyICovCiAJdTMyIGZyYWNfYml0czsKIAorCXUzMiBmbGFnczsKKwogCWJvb2wgaXNfdnB1X2Nsb2NrOwogCWJvb2wgaXNfbWFzaF9jbG9jazsKIH07CkBAIC0xMDA2LDE2ICsxMDA5LDI4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBib29sCitiY20yODM1X2Nsa19pc19wbGxjKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCWlmICghaHcpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiBzdHJuY21wKGNsa19od19nZXRfbmFtZShodyksICJwbGxjIiwgNCkgPT0gMDsKK30KKwogc3RhdGljIGludCBiY20yODM1X2Nsb2NrX2RldGVybWluZV9yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAogCQkJCQlzdHJ1Y3QgY2xrX3JhdGVfcmVxdWVzdCAqcmVxKQogewogCXN0cnVjdCBiY20yODM1X2Nsb2NrICpjbG9jayA9IGJjbTI4MzVfY2xvY2tfZnJvbV9odyhodyk7CiAJc3RydWN0IGNsa19odyAqcGFyZW50LCAqYmVzdF9wYXJlbnQgPSBOVUxMOworCWJvb2wgY3VycmVudF9wYXJlbnRfaXNfcGxsYzsKIAl1bnNpZ25lZCBsb25nIHJhdGUsIGJlc3RfcmF0ZSA9IDA7CiAJdW5zaWduZWQgbG9uZyBwcmF0ZSwgYmVzdF9wcmF0ZSA9IDA7CiAJc2l6ZV90IGk7CiAJdTMyIGRpdjsKIAorCWN1cnJlbnRfcGFyZW50X2lzX3BsbGMgPSBiY20yODM1X2Nsa19pc19wbGxjKGNsa19od19nZXRfcGFyZW50KGh3KSk7CisKIAkvKgogCSAqIFNlbGVjdCBwYXJlbnQgY2xvY2sgdGhhdCByZXN1bHRzIGluIHRoZSBjbG9zZXN0IGJ1dCBsb3dlciByYXRlCiAJICovCkBAIC0xMDIzLDYgKzEwMzgsMTcgQEAKIAkJcGFyZW50ID0gY2xrX2h3X2dldF9wYXJlbnRfYnlfaW5kZXgoaHcsIGkpOwogCQlpZiAoIXBhcmVudCkKIAkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIERvbid0IGNob29zZSBhIFBMTEMtZGVyaXZlZCBjbG9jayBhcyBvdXIgcGFyZW50CisJCSAqIHVubGVzcyBpdCBoYWQgYmVlbiBtYW51YWxseSBzZXQgdGhhdCB3YXkuICBQTExDJ3MKKwkJICogZnJlcXVlbmN5IGdldHMgYWRqdXN0ZWQgYnkgdGhlIGZpcm13YXJlIGR1ZSB0bworCQkgKiBvdmVyLXRlbXAgb3IgdW5kZXItdm9sdGFnZSBjb25kaXRpb25zLCB3aXRob3V0CisJCSAqIHByaW9yIG5vdGlmaWNhdGlvbiB0byBvdXIgY2xvY2sgY29uc3VtZXIuCisJCSAqLworCQlpZiAoYmNtMjgzNV9jbGtfaXNfcGxsYyhwYXJlbnQpICYmICFjdXJyZW50X3BhcmVudF9pc19wbGxjKQorCQkJY29udGludWU7CisKIAkJcHJhdGUgPSBjbGtfaHdfZ2V0X3JhdGUocGFyZW50KTsKIAkJZGl2ID0gYmNtMjgzNV9jbG9ja19jaG9vc2VfZGl2KGh3LCByZXEtPnJhdGUsIHByYXRlLCB0cnVlKTsKIAkJcmF0ZSA9IGJjbTI4MzVfY2xvY2tfcmF0ZV9mcm9tX2Rpdmlzb3IoY2xvY2ssIHByYXRlLCBkaXYpOwpAQCAtMTEyMSwxMSArMTE0NywxMiBAQAogCS5kZWJ1Z19pbml0ID0gYmNtMjgzNV9jbG9ja19kZWJ1Z19pbml0LAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKmJjbTI4MzVfcmVnaXN0ZXJfcGxsKHN0cnVjdCBiY20yODM1X2Nwcm1hbiAqY3BybWFuLAotCQkJCQljb25zdCBzdHJ1Y3QgYmNtMjgzNV9wbGxfZGF0YSAqZGF0YSkKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICpiY20yODM1X3JlZ2lzdGVyX3BsbChzdHJ1Y3QgYmNtMjgzNV9jcHJtYW4gKmNwcm1hbiwKKwkJCQkJICAgY29uc3Qgc3RydWN0IGJjbTI4MzVfcGxsX2RhdGEgKmRhdGEpCiB7CiAJc3RydWN0IGJjbTI4MzVfcGxsICpwbGw7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OwogCiAJbWVtc2V0KCZpbml0LCAwLCBzaXplb2YoaW5pdCkpOwogCkBAIC0xMTQ0LDE3ICsxMTcxLDIwIEBACiAJcGxsLT5kYXRhID0gZGF0YTsKIAlwbGwtPmh3LmluaXQgPSAmaW5pdDsKIAotCXJldHVybiBkZXZtX2Nsa19yZWdpc3RlcihjcHJtYW4tPmRldiwgJnBsbC0+aHcpOworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGNwcm1hbi0+ZGV2LCAmcGxsLT5odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZwbGwtPmh3OwogfQogCi1zdGF0aWMgc3RydWN0IGNsayAqCitzdGF0aWMgc3RydWN0IGNsa19odyAqCiBiY20yODM1X3JlZ2lzdGVyX3BsbF9kaXZpZGVyKHN0cnVjdCBiY20yODM1X2Nwcm1hbiAqY3BybWFuLAogCQkJICAgICBjb25zdCBzdHJ1Y3QgYmNtMjgzNV9wbGxfZGl2aWRlcl9kYXRhICpkYXRhKQogewogCXN0cnVjdCBiY20yODM1X3BsbF9kaXZpZGVyICpkaXZpZGVyOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7Ci0Jc3RydWN0IGNsayAqY2xrOwogCWNvbnN0IGNoYXIgKmRpdmlkZXJfbmFtZTsKKwlpbnQgcmV0OwogCiAJaWYgKGRhdGEtPmZpeGVkX2RpdmlkZXIgIT0gMSkgewogCQlkaXZpZGVyX25hbWUgPSBkZXZtX2thc3ByaW50ZihjcHJtYW4tPmRldiwgR0ZQX0tFUk5FTCwKQEAgLTExODgsMzIgKzEyMTgsMzMgQEAKIAlkaXZpZGVyLT5jcHJtYW4gPSBjcHJtYW47CiAJZGl2aWRlci0+ZGF0YSA9IGRhdGE7CiAKLQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcihjcHJtYW4tPmRldiwgJmRpdmlkZXItPmRpdi5odyk7Ci0JaWYgKElTX0VSUihjbGspKQotCQlyZXR1cm4gY2xrOworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGNwcm1hbi0+ZGV2LCAmZGl2aWRlci0+ZGl2Lmh3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCiAJLyoKIAkgKiBQTExIJ3MgY2hhbm5lbHMgaGF2ZSBhIGZpeGVkIGRpdmlkZSBieSAxMCBhZnRlcndhcmRzLCB3aGljaAogCSAqIGlzIHdoYXQgb3VyIGNvbnN1bWVycyBhcmUgYWN0dWFsbHkgdXNpbmcuCiAJICovCiAJaWYgKGRhdGEtPmZpeGVkX2RpdmlkZXIgIT0gMSkgewotCQlyZXR1cm4gY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihjcHJtYW4tPmRldiwgZGF0YS0+bmFtZSwKLQkJCQkJCSBkaXZpZGVyX25hbWUsCi0JCQkJCQkgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKLQkJCQkJCSAxLAotCQkJCQkJIGRhdGEtPmZpeGVkX2RpdmlkZXIpOworCQlyZXR1cm4gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihjcHJtYW4tPmRldiwgZGF0YS0+bmFtZSwKKwkJCQkJCSAgICBkaXZpZGVyX25hbWUsCisJCQkJCQkgICAgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwkJCQkJCSAgICAxLAorCQkJCQkJICAgIGRhdGEtPmZpeGVkX2RpdmlkZXIpOwogCX0KIAotCXJldHVybiBjbGs7CisJcmV0dXJuICZkaXZpZGVyLT5kaXYuaHc7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICpiY20yODM1X3JlZ2lzdGVyX2Nsb2NrKHN0cnVjdCBiY20yODM1X2Nwcm1hbiAqY3BybWFuLAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKmJjbTI4MzVfcmVnaXN0ZXJfY2xvY2soc3RydWN0IGJjbTI4MzVfY3BybWFuICpjcHJtYW4sCiAJCQkJCSAgY29uc3Qgc3RydWN0IGJjbTI4MzVfY2xvY2tfZGF0YSAqZGF0YSkKIHsKIAlzdHJ1Y3QgYmNtMjgzNV9jbG9jayAqY2xvY2s7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKIAljb25zdCBjaGFyICpwYXJlbnRzWzEgPDwgQ01fU1JDX0JJVFNdOwogCXNpemVfdCBpOworCWludCByZXQ7CiAKIAkvKgogCSAqIFJlcGxhY2Ugb3VyICJ4b3NjIiByZWZlcmVuY2VzIHdpdGggdGhlIG9zY2lsbGF0b3IncwpAQCAtMTIzMCwxMyArMTI2MSwxOSBAQAogCWluaXQucGFyZW50X25hbWVzID0gcGFyZW50czsKIAlpbml0Lm51bV9wYXJlbnRzID0gZGF0YS0+bnVtX211eF9wYXJlbnRzOwogCWluaXQubmFtZSA9IGRhdGEtPm5hbWU7Ci0JaW5pdC5mbGFncyA9IENMS19JR05PUkVfVU5VU0VEOworCWluaXQuZmxhZ3MgPSBkYXRhLT5mbGFncyB8IENMS19JR05PUkVfVU5VU0VEOwogCiAJaWYgKGRhdGEtPmlzX3ZwdV9jbG9jaykgewogCQlpbml0Lm9wcyA9ICZiY20yODM1X3ZwdV9jbG9ja19jbGtfb3BzOwogCX0gZWxzZSB7CiAJCWluaXQub3BzID0gJmJjbTI4MzVfY2xvY2tfY2xrX29wczsKIAkJaW5pdC5mbGFncyB8PSBDTEtfU0VUX1JBVEVfR0FURSB8IENMS19TRVRfUEFSRU5UX0dBVEU7CisKKwkJLyogSWYgdGhlIGNsb2NrIHdhc24ndCBhY3R1YWxseSBlbmFibGVkIGF0IGJvb3QsIGl0J3Mgbm90CisJCSAqIGNyaXRpY2FsLgorCQkgKi8KKwkJaWYgKCEoY3BybWFuX3JlYWQoY3BybWFuLCBkYXRhLT5jdGxfcmVnKSAmIENNX0VOQUJMRSkpCisJCQlpbml0LmZsYWdzICY9IH5DTEtfSVNfQ1JJVElDQUw7CiAJfQogCiAJY2xvY2sgPSBkZXZtX2t6YWxsb2MoY3BybWFuLT5kZXYsIHNpemVvZigqY2xvY2spLCBHRlBfS0VSTkVMKTsKQEAgLTEyNDcsNyArMTI4NCwxMCBAQAogCWNsb2NrLT5kYXRhID0gZGF0YTsKIAljbG9jay0+aHcuaW5pdCA9ICZpbml0OwogCi0JcmV0dXJuIGRldm1fY2xrX3JlZ2lzdGVyKGNwcm1hbi0+ZGV2LCAmY2xvY2stPmh3KTsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcihjcHJtYW4tPmRldiwgJmNsb2NrLT5odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwlyZXR1cm4gJmNsb2NrLT5odzsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGsgKmJjbTI4MzVfcmVnaXN0ZXJfZ2F0ZShzdHJ1Y3QgYmNtMjgzNV9jcHJtYW4gKmNwcm1hbiwKQEAgLTEyNTksOCArMTI5OSw4IEBACiAJCQkJIENNX0dBVEVfQklULCAwLCAmY3BybWFuLT5yZWdzX2xvY2spOwogfQogCi10eXBlZGVmIHN0cnVjdCBjbGsgKigqYmNtMjgzNV9jbGtfcmVnaXN0ZXIpKHN0cnVjdCBiY20yODM1X2Nwcm1hbiAqY3BybWFuLAotCQkJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHN0cnVjdCBjbGtfaHcgKigqYmNtMjgzNV9jbGtfcmVnaXN0ZXIpKHN0cnVjdCBiY20yODM1X2Nwcm1hbiAqY3BybWFuLAorCQkJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSk7CiBzdHJ1Y3QgYmNtMjgzNV9jbGtfZGVzYyB7CiAJYmNtMjgzNV9jbGtfcmVnaXN0ZXIgY2xrX3JlZ2lzdGVyOwogCWNvbnN0IHZvaWQgKmRhdGE7CkBAIC0xNjQ5LDYgKzE2ODksNyBAQAogCQkuZGl2X3JlZyA9IENNX1ZQVURJViwKIAkJLmludF9iaXRzID0gMTIsCiAJCS5mcmFjX2JpdHMgPSA4LAorCQkuZmxhZ3MgPSBDTEtfSVNfQ1JJVElDQUwsCiAJCS5pc192cHVfY2xvY2sgPSB0cnVlKSwKIAogCS8qIGNsb2NrcyB3aXRoIHBlciBwYXJlbnQgbXV4ICovCkBAIC0xNzA1LDEzICsxNzQ2LDE1IEBACiAJCS5kaXZfcmVnID0gQ01fR1AxRElWLAogCQkuaW50X2JpdHMgPSAxMiwKIAkJLmZyYWNfYml0cyA9IDEyLAorCQkuZmxhZ3MgPSBDTEtfSVNfQ1JJVElDQUwsCiAJCS5pc19tYXNoX2Nsb2NrID0gdHJ1ZSksCiAJW0JDTTI4MzVfQ0xPQ0tfR1AyXQk9IFJFR0lTVEVSX1BFUl9DTEsoCiAJCS5uYW1lID0gImdwMiIsCiAJCS5jdGxfcmVnID0gQ01fR1AyQ1RMLAogCQkuZGl2X3JlZyA9IENNX0dQMkRJViwKIAkJLmludF9iaXRzID0gMTIsCi0JCS5mcmFjX2JpdHMgPSAxMiksCisJCS5mcmFjX2JpdHMgPSAxMiwKKwkJLmZsYWdzID0gQ0xLX0lTX0NSSVRJQ0FMKSwKIAogCS8qIEhETUkgc3RhdGUgbWFjaGluZSAqLwogCVtCQ00yODM1X0NMT0NLX0hTTV0JPSBSRUdJU1RFUl9QRVJfQ0xLKApAQCAtMTc5MCwxOCArMTgzMywzOCBAQAogCQkuY3RsX3JlZyA9IENNX1BFUklJQ1RMKSwKIH07CiAKKy8qCisgKiBQZXJtYW5lbnRseSB0YWtlIGEgcmVmZXJlbmNlIG9uIHRoZSBwYXJlbnQgb2YgdGhlIFNEUkFNIGNsb2NrLgorICoKKyAqIFdoaWxlIHRoZSBTRFJBTSBpcyBiZWluZyBkcml2ZW4gYnkgaXRzIGRlZGljYXRlZCBQTEwgbW9zdCBvZiB0aGUKKyAqIHRpbWUsIHRoZXJlIGlzIGEgbGl0dGxlIGxvb3AgcnVubmluZyBpbiB0aGUgZmlybXdhcmUgdGhhdAorICogcGVyaW9kaWNhbGx5IHN3aXRjaGVzIHRoZSBTRFJBTSB0byB1c2luZyBvdXIgQ00gY2xvY2sgdG8gZG8gUFZUCisgKiByZWNhbGlicmF0aW9uLCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHByZXZpb3VzbHkgY29uZmlndXJlZAorICogU0RSQU0gcGFyZW50IGlzIHN0aWxsIGVuYWJsZWQgYW5kIHJ1bm5pbmcuCisgKi8KK3N0YXRpYyBpbnQgYmNtMjgzNV9tYXJrX3NkY19wYXJlbnRfY3JpdGljYWwoc3RydWN0IGNsayAqc2RjKQoreworCXN0cnVjdCBjbGsgKnBhcmVudCA9IGNsa19nZXRfcGFyZW50KHNkYyk7CisKKwlpZiAoSVNfRVJSKHBhcmVudCkpCisJCXJldHVybiBQVFJfRVJSKHBhcmVudCk7CisKKwlyZXR1cm4gY2xrX3ByZXBhcmVfZW5hYmxlKHBhcmVudCk7Cit9CisKIHN0YXRpYyBpbnQgYmNtMjgzNV9jbGtfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCXN0cnVjdCBjbGsgKipjbGtzOworCXN0cnVjdCBjbGtfaHcgKipod3M7CiAJc3RydWN0IGJjbTI4MzVfY3BybWFuICpjcHJtYW47CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJY29uc3Qgc3RydWN0IGJjbTI4MzVfY2xrX2Rlc2MgKmRlc2M7CiAJY29uc3Qgc2l6ZV90IGFzaXplID0gQVJSQVlfU0laRShjbGtfZGVzY19hcnJheSk7CiAJc2l6ZV90IGk7CisJaW50IHJldDsKIAotCWNwcm1hbiA9IGRldm1fa3phbGxvYyhkZXYsCi0JCQkgICAgICBzaXplb2YoKmNwcm1hbikgKyBhc2l6ZSAqIHNpemVvZigqY2xrcyksCisJY3BybWFuID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjcHJtYW4pICsKKwkJCSAgICAgIHNpemVvZigqY3BybWFuLT5vbmVjZWxsLmh3cykgKiBhc2l6ZSwKIAkJCSAgICAgIEdGUF9LRVJORUwpOwogCWlmICghY3BybWFuKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE4MTksMTggKzE4ODIsMjEgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNwcm1hbik7CiAKLQljcHJtYW4tPm9uZWNlbGwuY2xrX251bSA9IGFzaXplOwotCWNwcm1hbi0+b25lY2VsbC5jbGtzID0gY3BybWFuLT5jbGtzOwotCWNsa3MgPSBjcHJtYW4tPmNsa3M7CisJY3BybWFuLT5vbmVjZWxsLm51bSA9IGFzaXplOworCWh3cyA9IGNwcm1hbi0+b25lY2VsbC5od3M7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYXNpemU7IGkrKykgewogCQlkZXNjID0gJmNsa19kZXNjX2FycmF5W2ldOwogCQlpZiAoZGVzYy0+Y2xrX3JlZ2lzdGVyICYmIGRlc2MtPmRhdGEpCi0JCQljbGtzW2ldID0gZGVzYy0+Y2xrX3JlZ2lzdGVyKGNwcm1hbiwgZGVzYy0+ZGF0YSk7CisJCQlod3NbaV0gPSBkZXNjLT5jbGtfcmVnaXN0ZXIoY3BybWFuLCBkZXNjLT5kYXRhKTsKIAl9CiAKLQlyZXR1cm4gb2ZfY2xrX2FkZF9wcm92aWRlcihkZXYtPm9mX25vZGUsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsCi0JCQkJICAgJmNwcm1hbi0+b25lY2VsbCk7CisJcmV0ID0gYmNtMjgzNV9tYXJrX3NkY19wYXJlbnRfY3JpdGljYWwoaHdzW0JDTTI4MzVfQ0xPQ0tfU0RSQU1dLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gb2ZfY2xrX2FkZF9od19wcm92aWRlcihkZXYtPm9mX25vZGUsIG9mX2Nsa19od19vbmVjZWxsX2dldCwKKwkJCQkgICAgICAmY3BybWFuLT5vbmVjZWxsKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYmNtMjgzNV9jbGtfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2JjbS9jbGstYmNtNTM1NzMtaWxwLmMgYi9kcml2ZXJzL2Nsay9iY20vY2xrLWJjbTUzNTczLWlscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZWIzNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9iY20vY2xrLWJjbTUzNTczLWlscC5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFJhZmHFgiBNacWCZWNraSA8cmFmYWxAbWlsZWNraS5wbD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNkZWZpbmUgUE1VX1hUQUxfRlJFUV9SQVRJTwkJCTB4NjZjCisjZGVmaW5lICBYVEFMX0FMUF9QRVJfNElMUAkJCTB4MDAwMDFmZmYKKyNkZWZpbmUgIFhUQUxfQ1RMX0VOCQkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgUE1VX1NMT1dfQ0xLX1BFUklPRAkJCTB4NmRjCisKK3N0cnVjdCBiY201MzU3M19pbHAgeworCXN0cnVjdCBjbGtfaHcgaHc7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworfTsKKworc3RhdGljIGludCBiY201MzU3M19pbHBfZW5hYmxlKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCBiY201MzU3M19pbHAgKmlscCA9IGNvbnRhaW5lcl9vZihodywgc3RydWN0IGJjbTUzNTczX2lscCwgaHcpOworCisJcmVnbWFwX3dyaXRlKGlscC0+cmVnbWFwLCBQTVVfU0xPV19DTEtfUEVSSU9ELCAweDEwMTk5KTsKKwlyZWdtYXBfd3JpdGUoaWxwLT5yZWdtYXAsIDB4Njc0LCAweDEwMDAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiY201MzU3M19pbHBfZGlzYWJsZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgYmNtNTM1NzNfaWxwICppbHAgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBiY201MzU3M19pbHAsIGh3KTsKKworCXJlZ21hcF93cml0ZShpbHAtPnJlZ21hcCwgUE1VX1NMT1dfQ0xLX1BFUklPRCwgMCk7CisJcmVnbWFwX3dyaXRlKGlscC0+cmVnbWFwLCAweDY3NCwgMCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJjbTUzNTczX2lscF9yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKK3sKKwlzdHJ1Y3QgYmNtNTM1NzNfaWxwICppbHAgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBiY201MzU3M19pbHAsIGh3KTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBpbHAtPnJlZ21hcDsKKwl1MzIgbGFzdF92YWwsIGN1cl92YWw7CisJaW50IHN1bSA9IDAsIG51bSA9IDAsIGxvb3BfbnVtID0gMDsKKwlpbnQgYXZnOworCisJLyogRW5hYmxlIG1lYXN1cmVtZW50ICovCisJcmVnbWFwX3dyaXRlKHJlZ21hcCwgUE1VX1hUQUxfRlJFUV9SQVRJTywgWFRBTF9DVExfRU4pOworCisJLyogUmVhZCBpbml0aWFsIHZhbHVlICovCisJcmVnbWFwX3JlYWQocmVnbWFwLCBQTVVfWFRBTF9GUkVRX1JBVElPLCAmbGFzdF92YWwpOworCWxhc3RfdmFsICY9IFhUQUxfQUxQX1BFUl80SUxQOworCisJLyoKKwkgKiBBdCBtaW5pbXVtIHdlIHNob3VsZCBsb29wIGZvciBhIGJpdCB0byBsZXQgaGFyZHdhcmUgZG8gdGhlCisJICogbWVhc3VyZW1lbnQuIFRoaXMgaXNuJ3QgdmVyeSBhY2N1cmF0ZSBob3dldmVyLCBzbyBmb3IgYSBiZXR0ZXIKKwkgKiBwcmVjaXNpb24gbGV0cyB0cnkgZ2V0dGluZyAyMCBkaWZmZXJlbnQgdmFsdWVzIGZvciBhbmQgdXNlIGF2ZXJhZ2UuCisJICovCisJd2hpbGUgKG51bSA8IDIwKSB7CisJCXJlZ21hcF9yZWFkKHJlZ21hcCwgUE1VX1hUQUxfRlJFUV9SQVRJTywgJmN1cl92YWwpOworCQljdXJfdmFsICY9IFhUQUxfQUxQX1BFUl80SUxQOworCisJCWlmIChjdXJfdmFsICE9IGxhc3RfdmFsKSB7CisJCQkvKiBHb3QgZGlmZmVyZW50IHZhbHVlLCB1c2UgaXQgKi8KKwkJCXN1bSArPSBjdXJfdmFsOworCQkJbnVtKys7CisJCQlsb29wX251bSA9IDA7CisJCQlsYXN0X3ZhbCA9IGN1cl92YWw7CisJCX0gZWxzZSBpZiAoKytsb29wX251bSA+IDUwMDApIHsKKwkJCS8qIFNhbWUgdmFsdWUgb3ZlciBhbmQgb3ZlciwgZ2l2ZSB1cCAqLworCQkJc3VtICs9IGN1cl92YWw7CisJCQludW0rKzsKKwkJCWJyZWFrOworCQl9CisKKwkJY3B1X3JlbGF4KCk7CisJfQorCisJLyogRGlzYWJsZSBtZWFzdXJlbWVudCB0byBzYXZlIHBvd2VyICovCisJcmVnbWFwX3dyaXRlKHJlZ21hcCwgUE1VX1hUQUxfRlJFUV9SQVRJTywgMHgwKTsKKworCWF2ZyA9IHN1bSAvIG51bTsKKworCXJldHVybiBwYXJlbnRfcmF0ZSAqIDQgLyBhdmc7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBiY201MzU3M19pbHBfY2xrX29wcyA9IHsKKwkuZW5hYmxlID0gYmNtNTM1NzNfaWxwX2VuYWJsZSwKKwkuZGlzYWJsZSA9IGJjbTUzNTczX2lscF9kaXNhYmxlLAorCS5yZWNhbGNfcmF0ZSA9IGJjbTUzNTczX2lscF9yZWNhbGNfcmF0ZSwKK307CisKK3N0YXRpYyB2b2lkIGJjbTUzNTczX2lscF9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IGJjbTUzNTczX2lscCAqaWxwOworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQgPSB7IH07CisJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CisJaW50IGVycjsKKworCWlscCA9IGt6YWxsb2Moc2l6ZW9mKCppbHApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlscCkKKwkJcmV0dXJuOworCisJcGFyZW50X25hbWUgPSBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKG5wLCAwKTsKKwlpZiAoIXBhcmVudF9uYW1lKSB7CisJCWVyciA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX2ZyZWVfaWxwOworCX0KKworCWlscC0+cmVnbWFwID0gc3lzY29uX25vZGVfdG9fcmVnbWFwKG9mX2dldF9wYXJlbnQobnApKTsKKwlpZiAoSVNfRVJSKGlscC0+cmVnbWFwKSkgeworCQllcnIgPSBQVFJfRVJSKGlscC0+cmVnbWFwKTsKKwkJZ290byBlcnJfZnJlZV9pbHA7CisJfQorCisJaW5pdC5uYW1lID0gbnAtPm5hbWU7CisJaW5pdC5vcHMgPSAmYmNtNTM1NzNfaWxwX2Nsa19vcHM7CisJaW5pdC5wYXJlbnRfbmFtZXMgPSAmcGFyZW50X25hbWU7CisJaW5pdC5udW1fcGFyZW50cyA9IDE7CisKKwlpbHAtPmh3LmluaXQgPSAmaW5pdDsKKwllcnIgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJmlscC0+aHcpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWVfaWxwOworCisJZXJyID0gb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsICZpbHAtPmh3KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9jbGtfaHdfdW5yZWdpc3RlcjsKKworCXJldHVybjsKKworZXJyX2Nsa19od191bnJlZ2lzdGVyOgorCWNsa19od191bnJlZ2lzdGVyKCZpbHAtPmh3KTsKK2Vycl9mcmVlX2lscDoKKwlrZnJlZShpbHApOworCXByX2VycigiRmFpbGVkIHRvIGluaXQgSUxQIGNsb2NrOiAlZFxuIiwgZXJyKTsKK30KKworLyogV2UgbmVlZCBpdCB2ZXJ5IGVhcmx5IGZvciBhcmNoIGNvZGUsIGJlZm9yZSBkZXZpY2UgbW9kZWwgZ2V0cyByZWFkeSAqLworQ0xLX09GX0RFQ0xBUkUoYmNtNTM1NzNfaWxwX2NsaywgImJyY20sYmNtNTM1NzMtaWxwIiwgYmNtNTM1NzNfaWxwX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYmNtL2Nsay1rb25hLXNldHVwLmMgYi9kcml2ZXJzL2Nsay9iY20vY2xrLWtvbmEtc2V0dXAuYwppbmRleCA1MjZiMGIwLi5jMzdhN2YwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9iY20vY2xrLWtvbmEtc2V0dXAuYworKysgYi9kcml2ZXJzL2Nsay9iY20vY2xrLWtvbmEtc2V0dXAuYwpAQCAtNTg2LDggKzU4Niw4IEBACiAJfQogCiAJLyogVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHBhcmVudCwgc28gYWxsb2NhdGUgYSBzZWxlY3RvciBhcnJheSAqLwotCi0JcGFyZW50X3NlbCA9IGttYWxsb2MocGFyZW50X2NvdW50ICogc2l6ZW9mKCpwYXJlbnRfc2VsKSwgR0ZQX0tFUk5FTCk7CisJcGFyZW50X3NlbCA9IGttYWxsb2NfYXJyYXkocGFyZW50X2NvdW50LCBzaXplb2YoKnBhcmVudF9zZWwpLAorCQkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghcGFyZW50X3NlbCkgewogCQlwcl9lcnIoIiVzOiBlcnJvciBhbGxvY2F0aW5nICV1IHBhcmVudCBzZWxlY3RvcnNcbiIsIF9fZnVuY19fLAogCQkJCXBhcmVudF9jb3VudCk7CkBAIC02OTYsNzcgKzY5Niw2OSBAQAogCWJjbV9jbGstPnR5cGUgPSBiY21fY2xrX25vbmU7CiB9CiAKLXN0YXRpYyB2b2lkIGtvbmFfY2xrX3RlYXJkb3duKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB2b2lkIGtvbmFfY2xrX3RlYXJkb3duKHN0cnVjdCBjbGtfaHcgKmh3KQogewotCXN0cnVjdCBjbGtfaHcgKmh3OwogCXN0cnVjdCBrb25hX2NsayAqYmNtX2NsazsKIAotCWlmICghY2xrKQorCWlmICghaHcpCiAJCXJldHVybjsKIAotCWh3ID0gX19jbGtfZ2V0X2h3KGNsayk7Ci0JaWYgKCFodykgewotCQlwcl9lcnIoIiVzOiBjbGsgJXAgaGFzIG51bGwgaHcgcG9pbnRlclxuIiwgX19mdW5jX18sIGNsayk7Ci0JCXJldHVybjsKLQl9Ci0JY2xrX3VucmVnaXN0ZXIoY2xrKTsKKwljbGtfaHdfdW5yZWdpc3Rlcihodyk7CiAKIAliY21fY2xrID0gdG9fa29uYV9jbGsoaHcpOwogCWJjbV9jbGtfdGVhcmRvd24oYmNtX2Nsayk7CiB9CiAKLXN0cnVjdCBjbGsgKmtvbmFfY2xrX3NldHVwKHN0cnVjdCBrb25hX2NsayAqYmNtX2NsaykKK3N0YXRpYyBpbnQga29uYV9jbGtfc2V0dXAoc3RydWN0IGtvbmFfY2xrICpiY21fY2xrKQogeworCWludCByZXQ7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgKmluaXRfZGF0YSA9ICZiY21fY2xrLT5pbml0X2RhdGE7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKIAogCXN3aXRjaCAoYmNtX2Nsay0+dHlwZSkgewogCWNhc2UgYmNtX2Nsa19wZXJpOgotCQlpZiAocGVyaV9jbGtfc2V0dXAoYmNtX2Nsay0+dS5kYXRhLCBpbml0X2RhdGEpKQotCQkJcmV0dXJuIE5VTEw7CisJCXJldCA9IHBlcmlfY2xrX3NldHVwKGJjbV9jbGstPnUuZGF0YSwgaW5pdF9kYXRhKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByX2VycigiJXM6IGNsb2NrIHR5cGUgJWQgaW52YWxpZCBmb3IgJXNcbiIsIF9fZnVuY19fLAogCQkJKGludCliY21fY2xrLT50eXBlLCBpbml0X2RhdGEtPm5hbWUpOwotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogTWFrZSBzdXJlIGV2ZXJ5dGhpbmcgbWFrZXMgc2Vuc2UgYmVmb3JlIHdlIHNldCBpdCB1cCAqLwogCWlmICgha29uYV9jbGtfdmFsaWQoYmNtX2NsaykpIHsKIAkJcHJfZXJyKCIlczogY2xvY2sgZGF0YSBpbnZhbGlkIGZvciAlc1xuIiwgX19mdW5jX18sCiAJCQlpbml0X2RhdGEtPm5hbWUpOworCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dF90ZWFyZG93bjsKIAl9CiAKIAliY21fY2xrLT5ody5pbml0ID0gaW5pdF9kYXRhOwotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmYmNtX2Nsay0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkgewotCQlwcl9lcnIoIiVzOiBlcnJvciByZWdpc3RlcmluZyBjbG9jayAlcyAoJWxkKVxuIiwgX19mdW5jX18sCi0JCQlpbml0X2RhdGEtPm5hbWUsIFBUUl9FUlIoY2xrKSk7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZiY21fY2xrLT5odyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBlcnJvciByZWdpc3RlcmluZyBjbG9jayAlcyAoJWQpXG4iLCBfX2Z1bmNfXywKKwkJCWluaXRfZGF0YS0+bmFtZSwgcmV0KTsKIAkJZ290byBvdXRfdGVhcmRvd247CiAJfQotCUJVR19PTighY2xrKTsKIAotCXJldHVybiBjbGs7CisJcmV0dXJuIDA7CiBvdXRfdGVhcmRvd246CiAJYmNtX2Nsa190ZWFyZG93bihiY21fY2xrKTsKIAotCXJldHVybiBOVUxMOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGNjdV9jbGtzX3RlYXJkb3duKHN0cnVjdCBjY3VfZGF0YSAqY2N1KQogewogCXUzMiBpOwogCi0JZm9yIChpID0gMDsgaSA8IGNjdS0+Y2xrX2RhdGEuY2xrX251bTsgaSsrKQotCQlrb25hX2Nsa190ZWFyZG93bihjY3UtPmNsa19kYXRhLmNsa3NbaV0pOwotCWtmcmVlKGNjdS0+Y2xrX2RhdGEuY2xrcyk7CisJZm9yIChpID0gMDsgaSA8IGNjdS0+Y2xrX251bTsgaSsrKQorCQlrb25hX2Nsa190ZWFyZG93bigmY2N1LT5rb25hX2Nsa3NbaV0uaHcpOwogfQogCiBzdGF0aWMgdm9pZCBrb25hX2NjdV90ZWFyZG93bihzdHJ1Y3QgY2N1X2RhdGEgKmNjdSkKIHsKLQlrZnJlZShjY3UtPmNsa19kYXRhLmNsa3MpOwotCWNjdS0+Y2xrX2RhdGEuY2xrcyA9IE5VTEw7CiAJaWYgKCFjY3UtPmJhc2UpCiAJCXJldHVybjsKIApAQCAtNzkzLDYgKzc4NSwyMCBAQAogCXJldHVybiB0cnVlOwogfQogCitzdGF0aWMgc3RydWN0IGNsa19odyAqCitvZl9jbGtfa29uYV9vbmVjZWxsX2dldChzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpjbGtzcGVjLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBjY3VfZGF0YSAqY2N1ID0gZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gY2xrc3BlYy0+YXJnc1swXTsKKworCWlmIChpZHggPj0gY2N1LT5jbGtfbnVtKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgaW5kZXggJXVcbiIsIF9fZnVuY19fLCBpZHgpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gJmNjdS0+a29uYV9jbGtzW2lkeF0uaHc7Cit9CisKIC8qCiAgKiBTZXQgdXAgYSBDQ1UuICBDYWxsIHRoZSBwcm92aWRlZCBjY3VfY2xrc19zZXR1cCBjYWxsYmFjayB0bwogICogaW5pdGlhbGl6ZSB0aGUgYXJyYXkgb2YgY2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSBDQ1UuCkBAIC04MDUsMTggKzgxMSw2IEBACiAJdW5zaWduZWQgaW50IGk7CiAJaW50IHJldDsKIAotCWlmIChjY3UtPmNsa19kYXRhLmNsa19udW0pIHsKLQkJc2l6ZV90IHNpemU7Ci0KLQkJc2l6ZSA9IGNjdS0+Y2xrX2RhdGEuY2xrX251bSAqIHNpemVvZigqY2N1LT5jbGtfZGF0YS5jbGtzKTsKLQkJY2N1LT5jbGtfZGF0YS5jbGtzID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjY3UtPmNsa19kYXRhLmNsa3MpIHsKLQkJCXByX2VycigiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSAldSBjbG9ja3MgZm9yICVzXG4iLAotCQkJCV9fZnVuY19fLCBjY3UtPmNsa19kYXRhLmNsa19udW0sIG5vZGUtPm5hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCiAJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShub2RlLCAwLCAmcmVzKTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigiJXM6IG5vIHZhbGlkIENDVSByZWdpc3RlcnMgZm91bmQgZm9yICVzXG4iLCBfX2Z1bmNfXywKQEAgLTg1MSwxMyArODQ1LDEzIEBACiAJICogdGhlIGNsb2NrIGZyYW1ld29yayBjbG9jayBhcnJheSAoaW4gY2N1LT5kYXRhKS4gIFRoZW4KIAkgKiByZWdpc3RlciBhcyBhIHByb3ZpZGVyIGZvciB0aGVzZSBjbG9ja3MuCiAJICovCi0JZm9yIChpID0gMDsgaSA8IGNjdS0+Y2xrX2RhdGEuY2xrX251bTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGNjdS0+Y2xrX251bTsgaSsrKSB7CiAJCWlmICghY2N1LT5rb25hX2Nsa3NbaV0uY2N1KQogCQkJY29udGludWU7Ci0JCWNjdS0+Y2xrX2RhdGEuY2xrc1tpXSA9IGtvbmFfY2xrX3NldHVwKCZjY3UtPmtvbmFfY2xrc1tpXSk7CisJCWtvbmFfY2xrX3NldHVwKCZjY3UtPmtvbmFfY2xrc1tpXSk7CiAJfQogCi0JcmV0ID0gb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LCAmY2N1LT5jbGtfZGF0YSk7CisJcmV0ID0gb2ZfY2xrX2FkZF9od19wcm92aWRlcihub2RlLCBvZl9jbGtfa29uYV9vbmVjZWxsX2dldCwgY2N1KTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigiJXM6IGVycm9yIGFkZGluZyBjY3UgJXMgYXMgcHJvdmlkZXIgKCVkKVxuIiwgX19mdW5jX18sCiAJCQkJbm9kZS0+bmFtZSwgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2JjbS9jbGsta29uYS5jIGIvZHJpdmVycy9jbGsvYmNtL2Nsay1rb25hLmMKaW5kZXggM2ExNTM0Ny4uZWVlNjRiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYmNtL2Nsay1rb25hLmMKKysrIGIvZHJpdmVycy9jbGsvYmNtL2Nsay1rb25hLmMKQEAgLTEyNTYsMTkgKzEyNTYsMTggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCB3aGljaDsKLQlzdHJ1Y3QgY2xrICoqY2xrcyA9IGNjdS0+Y2xrX2RhdGEuY2xrczsKIAlzdHJ1Y3Qga29uYV9jbGsgKmtvbmFfY2xrcyA9IGNjdS0+a29uYV9jbGtzOwogCWJvb2wgc3VjY2VzcyA9IHRydWU7CiAKIAlmbGFncyA9IGNjdV9sb2NrKGNjdSk7CiAJX19jY3Vfd3JpdGVfZW5hYmxlKGNjdSk7CiAKLQlmb3IgKHdoaWNoID0gMDsgd2hpY2ggPCBjY3UtPmNsa19kYXRhLmNsa19udW07IHdoaWNoKyspIHsKLQkJc3RydWN0IGtvbmFfY2xrICpiY21fY2xrOworCWZvciAod2hpY2ggPSAwOyB3aGljaCA8IGNjdS0+Y2xrX251bTsgd2hpY2grKykgeworCQlzdHJ1Y3Qga29uYV9jbGsgKmJjbV9jbGsgPSAma29uYV9jbGtzW3doaWNoXTsKIAotCQlpZiAoIWNsa3Nbd2hpY2hdKQorCQlpZiAoIWJjbV9jbGstPmNjdSkKIAkJCWNvbnRpbnVlOwotCQliY21fY2xrID0gJmtvbmFfY2xrc1t3aGljaF07CisKIAkJc3VjY2VzcyAmPSBfX2tvbmFfY2xrX2luaXQoYmNtX2Nsayk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9iY20vY2xrLWtvbmEuaCBiL2RyaXZlcnMvY2xrL2JjbS9jbGsta29uYS5oCmluZGV4IDkwNjU3NmUuLmY0YjM5YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2JjbS9jbGsta29uYS5oCisrKyBiL2RyaXZlcnMvY2xrL2JjbS9jbGsta29uYS5oCkBAIC00ODEsNyArNDgxLDcgQEAKIAlib29sIHdyaXRlX2VuYWJsZWQ7CS8qIHdyaXRlIGFjY2VzcyBpcyBjdXJyZW50bHkgZW5hYmxlZCAqLwogCXN0cnVjdCBjY3VfcG9saWN5IHBvbGljeTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7Ci0Jc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgY2xrX2RhdGE7CisJc2l6ZV90IGNsa19udW07CiAJY29uc3QgY2hhciAqbmFtZTsKIAl1MzIgcmFuZ2U7CQkvKiBieXRlIHJhbmdlIG9mIGFkZHJlc3Mgc3BhY2UgKi8KIAlzdHJ1Y3Qga29uYV9jbGsga29uYV9jbGtzW107CS8qIG11c3QgYmUgbGFzdCAqLwpAQCAtNDkxLDkgKzQ5MSw3IEBACiAjZGVmaW5lIEtPTkFfQ0NVX0NPTU1PTihfcHJlZml4LCBfbmFtZSwgX2NjdW5hbWUpCQkJICAgIFwKIAkubmFtZQkJPSAjX25hbWUgIl9jY3UiLAkJCQkgICAgXAogCS5sb2NrCQk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKF9uYW1lICMjIF9jY3VfZGF0YS5sb2NrKSwgICAgXAotCS5jbGtfZGF0YQk9IHsJCQkJCQkgICAgXAotCQkuY2xrX251bSA9IF9wcmVmaXggIyMgXyAjIyBfY2N1bmFtZSAjIyBfQ0NVX0NMT0NLX0NPVU5ULCAgICBcCi0JfQorCS5jbGtfbnVtCT0gX3ByZWZpeCAjIyBfICMjIF9jY3VuYW1lICMjIF9DQ1VfQ0xPQ0tfQ09VTlQKIAogLyogRXhwb3J0ZWQgZ2xvYmFscyAqLwogCkBAIC01MDUsNyArNTAzLDYgQEAKIGV4dGVybiB1NjQgc2NhbGVkX2Rpdl9idWlsZChzdHJ1Y3QgYmNtX2Nsa19kaXYgKmRpdiwgdTMyIGRpdl92YWx1ZSwKIAkJCQl1MzIgYmlsbGlvbnRocyk7CiAKLWV4dGVybiBzdHJ1Y3QgY2xrICprb25hX2Nsa19zZXR1cChzdHJ1Y3Qga29uYV9jbGsgKmJjbV9jbGspOwogZXh0ZXJuIHZvaWQgX19pbml0IGtvbmFfZHRfY2N1X3NldHVwKHN0cnVjdCBjY3VfZGF0YSAqY2N1LAogCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7CiBleHRlcm4gYm9vbCBfX2luaXQga29uYV9jY3VfaW5pdChzdHJ1Y3QgY2N1X2RhdGEgKmNjdSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1hdnBsbC5jIGIvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItYXZwbGwuYwppbmRleCBmZDBmMjZjLi5jZmNhZTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1hdnBsbC5jCisrKyBiL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLWF2cGxsLmMKQEAgLTE4OCw3ICsxODgsNyBAQAogCS5yZWNhbGNfcmF0ZQk9IGJlcmxpbjJfYXZwbGxfdmNvX3JlY2FsY19yYXRlLAogfTsKIAotc3RydWN0IGNsayAqIF9faW5pdCBiZXJsaW4yX2F2cGxsX3Zjb19yZWdpc3Rlcih2b2lkIF9faW9tZW0gKmJhc2UsCitpbnQgX19pbml0IGJlcmxpbjJfYXZwbGxfdmNvX3JlZ2lzdGVyKHZvaWQgX19pb21lbSAqYmFzZSwKIAkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKIAkJCSAgICAgICB1OCB2Y29fZmxhZ3MsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CkBAIC0xOTcsNyArMTk3LDcgQEAKIAogCXZjbyA9IGt6YWxsb2Moc2l6ZW9mKCp2Y28pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZjbykKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCXJldHVybiAtRU5PTUVNOwogCiAJdmNvLT5iYXNlID0gYmFzZTsKIAl2Y28tPmZsYWdzID0gdmNvX2ZsYWdzOwpAQCAtMjA4LDcgKzIwOCw3IEBACiAJaW5pdC5udW1fcGFyZW50cyA9IDE7CiAJaW5pdC5mbGFncyA9IGZsYWdzOwogCi0JcmV0dXJuIGNsa19yZWdpc3RlcihOVUxMLCAmdmNvLT5odyk7CisJcmV0dXJuIGNsa19od19yZWdpc3RlcihOVUxMLCAmdmNvLT5odyk7CiB9CiAKIHN0cnVjdCBiZXJsaW4yX2F2cGxsX2NoYW5uZWwgewpAQCAtMzY0LDcgKzM2NCw3IEBACiAgKi8KIHN0YXRpYyBjb25zdCB1OCBxdWlya19pbmRleFtdIF9faW5pdGNvbnN0ID0geyAwLCA2LCA1LCA0LCAzLCAyLCAxLCA3IH07CiAKLXN0cnVjdCBjbGsgKiBfX2luaXQgYmVybGluMl9hdnBsbF9jaGFubmVsX3JlZ2lzdGVyKHZvaWQgX19pb21lbSAqYmFzZSwKK2ludCBfX2luaXQgYmVybGluMl9hdnBsbF9jaGFubmVsX3JlZ2lzdGVyKHZvaWQgX19pb21lbSAqYmFzZSwKIAkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIHU4IGluZGV4LCBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKIAkJCSAgIHU4IGNoX2ZsYWdzLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewpAQCAtMzczLDcgKzM3Myw3IEBACiAKIAljaCA9IGt6YWxsb2Moc2l6ZW9mKCpjaCksIEdGUF9LRVJORUwpOwogCWlmICghY2gpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCQlyZXR1cm4gLUVOT01FTTsKIAogCWNoLT5iYXNlID0gYmFzZTsKIAlpZiAoY2hfZmxhZ3MgJiBCRVJMSU4yX0FWUExMX1NDUkFNQkxFX1FVSVJLKQpAQCAtMzg5LDUgKzM4OSw1IEBACiAJaW5pdC5udW1fcGFyZW50cyA9IDE7CiAJaW5pdC5mbGFncyA9IGZsYWdzOwogCi0JcmV0dXJuIGNsa19yZWdpc3RlcihOVUxMLCAmY2gtPmh3KTsKKwlyZXR1cm4gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZjaC0+aHcpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItYXZwbGwuaCBiL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLWF2cGxsLmgKaW5kZXggYTM3ZjUwNi4uMTdlMzExMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItYXZwbGwuaAorKysgYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1hdnBsbC5oCkBAIC0xOSwxNyArMTksMTMgQEAKICNpZm5kZWYgX19CRVJMSU4yX0FWUExMX0gKICNkZWZpbmUgX19CRVJMSU4yX0FWUExMX0gKIAotc3RydWN0IGNsazsKLQogI2RlZmluZSBCRVJMSU4yX0FWUExMX0JJVF9RVUlSSwkJQklUKDApCiAjZGVmaW5lIEJFUkxJTjJfQVZQTExfU0NSQU1CTEVfUVVJUksJQklUKDEpCiAKLXN0cnVjdCBjbGsgKiBfX2luaXQKLWJlcmxpbjJfYXZwbGxfdmNvX3JlZ2lzdGVyKHZvaWQgX19pb21lbSAqYmFzZSwgY29uc3QgY2hhciAqbmFtZSwKK2ludCBiZXJsaW4yX2F2cGxsX3Zjb19yZWdpc3Rlcih2b2lkIF9faW9tZW0gKmJhc2UsIGNvbnN0IGNoYXIgKm5hbWUsCiAJICAgY29uc3QgY2hhciAqcGFyZW50X25hbWUsIHU4IHZjb19mbGFncywgdW5zaWduZWQgbG9uZyBmbGFncyk7CiAKLXN0cnVjdCBjbGsgKiBfX2luaXQKLWJlcmxpbjJfYXZwbGxfY2hhbm5lbF9yZWdpc3Rlcih2b2lkIF9faW9tZW0gKmJhc2UsIGNvbnN0IGNoYXIgKm5hbWUsCitpbnQgYmVybGluMl9hdnBsbF9jaGFubmVsX3JlZ2lzdGVyKHZvaWQgX19pb21lbSAqYmFzZSwgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgICAgIHU4IGluZGV4LCBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwgdTggY2hfZmxhZ3MsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItZGl2LmMgYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1kaXYuYwppbmRleCA4MWZmOTdmLi40MWFiMmQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1kaXYuYworKysgYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1kaXYuYwpAQCAtMjM0LDcgKzIzNCw3IEBACiAJLmdldF9wYXJlbnQJPSBiZXJsaW4yX2Rpdl9nZXRfcGFyZW50LAogfTsKIAotc3RydWN0IGNsayAqIF9faW5pdAorc3RydWN0IGNsa19odyAqIF9faW5pdAogYmVybGluMl9kaXZfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IGJlcmxpbjJfZGl2X21hcCAqbWFwLAogCQkgICAgIHZvaWQgX19pb21lbSAqYmFzZSwgY29uc3QgY2hhciAqbmFtZSwgdTggZGl2X2ZsYWdzLAogCQkgICAgIGNvbnN0IGNoYXIgKipwYXJlbnRfbmFtZXMsIGludCBudW1fcGFyZW50cywKQEAgLTI1OSw3ICsyNTksNyBAQAogCWlmICgoZGl2X2ZsYWdzICYgQkVSTElOMl9ESVZfSEFTX01VWCkgPT0gMCkKIAkJbXV4X29wcyA9IE5VTEw7CiAKLQlyZXR1cm4gY2xrX3JlZ2lzdGVyX2NvbXBvc2l0ZShOVUxMLCBuYW1lLCBwYXJlbnRfbmFtZXMsIG51bV9wYXJlbnRzLAorCXJldHVybiBjbGtfaHdfcmVnaXN0ZXJfY29tcG9zaXRlKE5VTEwsIG5hbWUsIHBhcmVudF9uYW1lcywgbnVtX3BhcmVudHMsCiAJCQkJICAgICAgJmRpdi0+aHcsIG11eF9vcHMsICZkaXYtPmh3LCByYXRlX29wcywKIAkJCQkgICAgICAmZGl2LT5odywgZ2F0ZV9vcHMsIGZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLWRpdi5oIGIvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItZGl2LmgKaW5kZXggMTVlMzM4NC4uZTgzNWRkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItZGl2LmgKKysrIGIvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItZGl2LmgKQEAgLTE5LDcgKzE5LDcgQEAKICNpZm5kZWYgX19CRVJMSU4yX0RJVl9ICiAjZGVmaW5lIF9fQkVSTElOMl9ESVZfSAogCi1zdHJ1Y3QgY2xrOworc3RydWN0IGNsa19odzsKIAogI2RlZmluZSBCRVJMSU4yX0RJVl9IQVNfR0FURQkJQklUKDApCiAjZGVmaW5lIEJFUkxJTjJfRElWX0hBU19NVVgJCUJJVCgxKQpAQCAtODAsNyArODAsNyBAQAogCXU4IGRpdl9mbGFnczsKIH07CiAKLXN0cnVjdCBjbGsgKiBfX2luaXQKK3N0cnVjdCBjbGtfaHcgKgogYmVybGluMl9kaXZfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IGJlcmxpbjJfZGl2X21hcCAqbWFwLAogCSAgICAgdm9pZCBfX2lvbWVtICpiYXNlLCAgY29uc3QgY2hhciAqbmFtZSwgdTggZGl2X2ZsYWdzLAogCSAgICAgY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywgaW50IG51bV9wYXJlbnRzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItcGxsLmMgYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1wbGwuYwppbmRleCAxYzIyOTRkLi40ZmZiZTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1wbGwuYworKysgYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1wbGwuYwpAQCAtODQsNyArODQsNyBAQAogCS5yZWNhbGNfcmF0ZQk9IGJlcmxpbjJfcGxsX3JlY2FsY19yYXRlLAogfTsKIAotc3RydWN0IGNsayAqIF9faW5pdAoraW50IF9faW5pdAogYmVybGluMl9wbGxfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IGJlcmxpbjJfcGxsX21hcCAqbWFwLAogCQkgICAgIHZvaWQgX19pb21lbSAqYmFzZSwgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgICBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwgdW5zaWduZWQgbG9uZyBmbGFncykKQEAgLTk0LDcgKzk0LDcgQEAKIAogCXBsbCA9IGt6YWxsb2Moc2l6ZW9mKCpwbGwpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBsbCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCXJldHVybiAtRU5PTUVNOwogCiAJLyogY29weSBwbGxfbWFwIHRvIGFsbG93IF9faW5pdGNvbnN0ICovCiAJbWVtY3B5KCZwbGwtPm1hcCwgbWFwLCBzaXplb2YoKm1hcCkpOwpAQCAtMTA2LDUgKzEwNiw1IEBACiAJaW5pdC5udW1fcGFyZW50cyA9IDE7CiAJaW5pdC5mbGFncyA9IGZsYWdzOwogCi0JcmV0dXJuIGNsa19yZWdpc3RlcihOVUxMLCAmcGxsLT5odyk7CisJcmV0dXJuIGNsa19od19yZWdpc3RlcihOVUxMLCAmcGxsLT5odyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1wbGwuaCBiL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLXBsbC5oCmluZGV4IDg4MzFjZTIuLjU4M2UwMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLXBsbC5oCisrKyBiL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLXBsbC5oCkBAIC0xOSw4ICsxOSw2IEBACiAjaWZuZGVmIF9fQkVSTElOMl9QTExfSAogI2RlZmluZSBfX0JFUkxJTjJfUExMX0gKIAotc3RydWN0IGNsazsKLQogc3RydWN0IGJlcmxpbjJfcGxsX21hcCB7CiAJY29uc3QgdTggdmNvZGl2WzE2XTsKIAl1OCBtdWx0OwpAQCAtMjksOSArMjcsOCBAQAogCXU4IGRpdnNlbF9zaGlmdDsKIH07CiAKLXN0cnVjdCBjbGsgKiBfX2luaXQKLWJlcmxpbjJfcGxsX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBiZXJsaW4yX3BsbF9tYXAgKm1hcCwKLQkJICAgICB2b2lkIF9faW9tZW0gKmJhc2UsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCSAgICAgY29uc3QgY2hhciAqcGFyZW50X25hbWUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworaW50IGJlcmxpbjJfcGxsX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBiZXJsaW4yX3BsbF9tYXAgKm1hcCwKKwkJCSB2b2lkIF9faW9tZW0gKmJhc2UsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgY29uc3QgY2hhciAqcGFyZW50X25hbWUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogCiAjZW5kaWYgLyogX19CRVJMSU4yX1BMTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9iZXJsaW4vYmcyLmMgYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmcyLmMKaW5kZXggMjNlMGUzYi4uZWRmM2I5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYmVybGluL2JnMi5jCisrKyBiL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZzIuYwpAQCAtOTIsOCArOTIsNyBAQAogICovCiAKICNkZWZpbmUJTUFYX0NMS1MgNDEKLXN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzW01BWF9DTEtTXTsKLXN0YXRpYyBzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSBjbGtfZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3X29uZWNlbGxfZGF0YSAqY2xrX2RhdGE7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvY2spOwogc3RhdGljIHZvaWQgX19pb21lbSAqZ2Jhc2U7CiAKQEAgLTUwNSw4ICs1MDQsMTcgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudF9ucCA9IG9mX2dldF9wYXJlbnQobnApOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lc1s5XTsKIAlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CisJc3RydWN0IGNsa19odyAqKmh3czsKIAl1OCBhdnBsbF9mbGFncyA9IDA7Ci0JaW50IG47CisJaW50IG4sIHJldDsKKworCWNsa19kYXRhID0ga3phbGxvYyhzaXplb2YoKmNsa19kYXRhKSArCisJCQkgICBzaXplb2YoKmNsa19kYXRhLT5od3MpICogTUFYX0NMS1MsIEdGUF9LRVJORUwpOworCWlmICghY2xrX2RhdGEpCisJCXJldHVybjsKKwljbGtfZGF0YS0+bnVtID0gTUFYX0NMS1M7CisJaHdzID0gY2xrX2RhdGEtPmh3czsKIAogCWdiYXNlID0gb2ZfaW9tYXAocGFyZW50X25wLCAwKTsKIAlpZiAoIWdiYXNlKQpAQCAtNTI2LDExOCArNTM0LDExOCBAQAogCX0KIAogCS8qIHNpbXBsZSByZWdpc3RlciBQTExzICovCi0JY2xrID0gYmVybGluMl9wbGxfcmVnaXN0ZXIoJmJnMl9wbGxfbWFwLCBnYmFzZSArIFJFR19TWVNQTExDVEwwLAorCXJldCA9IGJlcmxpbjJfcGxsX3JlZ2lzdGVyKCZiZzJfcGxsX21hcCwgZ2Jhc2UgKyBSRUdfU1lTUExMQ1RMMCwKIAkJCQkgICBjbGtfbmFtZXNbU1lTUExMXSwgY2xrX25hbWVzW1JFRkNMS10sIDApOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAocmV0KQogCQlnb3RvIGJnMl9mYWlsOwogCi0JY2xrID0gYmVybGluMl9wbGxfcmVnaXN0ZXIoJmJnMl9wbGxfbWFwLCBnYmFzZSArIFJFR19NRU1QTExDVEwwLAorCXJldCA9IGJlcmxpbjJfcGxsX3JlZ2lzdGVyKCZiZzJfcGxsX21hcCwgZ2Jhc2UgKyBSRUdfTUVNUExMQ1RMMCwKIAkJCQkgICBjbGtfbmFtZXNbTUVNUExMXSwgY2xrX25hbWVzW1JFRkNMS10sIDApOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAocmV0KQogCQlnb3RvIGJnMl9mYWlsOwogCi0JY2xrID0gYmVybGluMl9wbGxfcmVnaXN0ZXIoJmJnMl9wbGxfbWFwLCBnYmFzZSArIFJFR19DUFVQTExDVEwwLAorCXJldCA9IGJlcmxpbjJfcGxsX3JlZ2lzdGVyKCZiZzJfcGxsX21hcCwgZ2Jhc2UgKyBSRUdfQ1BVUExMQ1RMMCwKIAkJCQkgICBjbGtfbmFtZXNbQ1BVUExMXSwgY2xrX25hbWVzW1JFRkNMS10sIDApOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAocmV0KQogCQlnb3RvIGJnMl9mYWlsOwogCiAJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAibWFydmVsbCxiZXJsaW4yLWdsb2JhbC1yZWdpc3RlciIpKQogCQlhdnBsbF9mbGFncyB8PSBCRVJMSU4yX0FWUExMX1NDUkFNQkxFX1FVSVJLOwogCiAJLyogYXVkaW8vdmlkZW8gVkNPcyAqLwotCWNsayA9IGJlcmxpbjJfYXZwbGxfdmNvX3JlZ2lzdGVyKGdiYXNlICsgUkVHX0FWUExMQ1RMMCwgImF2cGxsX3Zjb0EiLAorCXJldCA9IGJlcmxpbjJfYXZwbGxfdmNvX3JlZ2lzdGVyKGdiYXNlICsgUkVHX0FWUExMQ1RMMCwgImF2cGxsX3Zjb0EiLAogCQkJIGNsa19uYW1lc1tSRUZDTEtdLCBhdnBsbF9mbGFncywgMCk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChyZXQpCiAJCWdvdG8gYmcyX2ZhaWw7CiAKIAlmb3IgKG4gPSAwOyBuIDwgODsgbisrKSB7Ci0JCWNsayA9IGJlcmxpbjJfYXZwbGxfY2hhbm5lbF9yZWdpc3RlcihnYmFzZSArIFJFR19BVlBMTENUTDAsCisJCXJldCA9IGJlcmxpbjJfYXZwbGxfY2hhbm5lbF9yZWdpc3RlcihnYmFzZSArIFJFR19BVlBMTENUTDAsCiAJCQkgICAgIGNsa19uYW1lc1tBVlBMTF9BMSArIG5dLCBuLCAiYXZwbGxfdmNvQSIsCiAJCQkgICAgIGF2cGxsX2ZsYWdzLCAwKTsKLQkJaWYgKElTX0VSUihjbGspKQorCQlpZiAocmV0KQogCQkJZ290byBiZzJfZmFpbDsKIAl9CiAKLQljbGsgPSBiZXJsaW4yX2F2cGxsX3Zjb19yZWdpc3RlcihnYmFzZSArIFJFR19BVlBMTENUTDMxLCAiYXZwbGxfdmNvQiIsCisJcmV0ID0gYmVybGluMl9hdnBsbF92Y29fcmVnaXN0ZXIoZ2Jhc2UgKyBSRUdfQVZQTExDVEwzMSwgImF2cGxsX3Zjb0IiLAogCQkJCSBjbGtfbmFtZXNbUkVGQ0xLXSwgQkVSTElOMl9BVlBMTF9CSVRfUVVJUksgfAogCQkJCSBhdnBsbF9mbGFncywgMCk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChyZXQpCiAJCWdvdG8gYmcyX2ZhaWw7CiAKIAlmb3IgKG4gPSAwOyBuIDwgODsgbisrKSB7Ci0JCWNsayA9IGJlcmxpbjJfYXZwbGxfY2hhbm5lbF9yZWdpc3RlcihnYmFzZSArIFJFR19BVlBMTENUTDMxLAorCQlyZXQgPSBiZXJsaW4yX2F2cGxsX2NoYW5uZWxfcmVnaXN0ZXIoZ2Jhc2UgKyBSRUdfQVZQTExDVEwzMSwKIAkJCSAgICAgY2xrX25hbWVzW0FWUExMX0IxICsgbl0sIG4sICJhdnBsbF92Y29CIiwKIAkJCSAgICAgQkVSTElOMl9BVlBMTF9CSVRfUVVJUksgfCBhdnBsbF9mbGFncywgMCk7Ci0JCWlmIChJU19FUlIoY2xrKSkKKwkJaWYgKHJldCkKIAkJCWdvdG8gYmcyX2ZhaWw7CiAJfQogCiAJLyogcmVmZXJlbmNlIGNsb2NrIGJ5cGFzcyBzd2l0Y2hlcyAqLwogCXBhcmVudF9uYW1lc1swXSA9IGNsa19uYW1lc1tTWVNQTExdOwogCXBhcmVudF9uYW1lc1sxXSA9IGNsa19uYW1lc1tSRUZDTEtdOwotCWNsayA9IGNsa19yZWdpc3Rlcl9tdXgoTlVMTCwgInN5c3BsbF9ieXAiLCBwYXJlbnRfbmFtZXMsIDIsCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfbXV4KE5VTEwsICJzeXNwbGxfYnlwIiwgcGFyZW50X25hbWVzLCAyLAogCQkJICAgICAgIDAsIGdiYXNlICsgUkVHX0NMS1NXSVRDSDAsIDAsIDEsIDAsICZsb2NrKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCWdvdG8gYmcyX2ZhaWw7Ci0JY2xrX25hbWVzW1NZU1BMTF0gPSBfX2Nsa19nZXRfbmFtZShjbGspOworCWNsa19uYW1lc1tTWVNQTExdID0gY2xrX2h3X2dldF9uYW1lKGh3KTsKIAogCXBhcmVudF9uYW1lc1swXSA9IGNsa19uYW1lc1tNRU1QTExdOwogCXBhcmVudF9uYW1lc1sxXSA9IGNsa19uYW1lc1tSRUZDTEtdOwotCWNsayA9IGNsa19yZWdpc3Rlcl9tdXgoTlVMTCwgIm1lbXBsbF9ieXAiLCBwYXJlbnRfbmFtZXMsIDIsCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfbXV4KE5VTEwsICJtZW1wbGxfYnlwIiwgcGFyZW50X25hbWVzLCAyLAogCQkJICAgICAgIDAsIGdiYXNlICsgUkVHX0NMS1NXSVRDSDAsIDEsIDEsIDAsICZsb2NrKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCWdvdG8gYmcyX2ZhaWw7Ci0JY2xrX25hbWVzW01FTVBMTF0gPSBfX2Nsa19nZXRfbmFtZShjbGspOworCWNsa19uYW1lc1tNRU1QTExdID0gY2xrX2h3X2dldF9uYW1lKGh3KTsKIAogCXBhcmVudF9uYW1lc1swXSA9IGNsa19uYW1lc1tDUFVQTExdOwogCXBhcmVudF9uYW1lc1sxXSA9IGNsa19uYW1lc1tSRUZDTEtdOwotCWNsayA9IGNsa19yZWdpc3Rlcl9tdXgoTlVMTCwgImNwdXBsbF9ieXAiLCBwYXJlbnRfbmFtZXMsIDIsCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfbXV4KE5VTEwsICJjcHVwbGxfYnlwIiwgcGFyZW50X25hbWVzLCAyLAogCQkJICAgICAgIDAsIGdiYXNlICsgUkVHX0NMS1NXSVRDSDAsIDIsIDEsIDAsICZsb2NrKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCWdvdG8gYmcyX2ZhaWw7Ci0JY2xrX25hbWVzW0NQVVBMTF0gPSBfX2Nsa19nZXRfbmFtZShjbGspOworCWNsa19uYW1lc1tDUFVQTExdID0gY2xrX2h3X2dldF9uYW1lKGh3KTsKIAogCS8qIGNsb2NrIG11eGVzICovCiAJcGFyZW50X25hbWVzWzBdID0gY2xrX25hbWVzW0FWUExMX0IzXTsKIAlwYXJlbnRfbmFtZXNbMV0gPSBjbGtfbmFtZXNbQVZQTExfQTNdOwotCWNsayA9IGNsa19yZWdpc3Rlcl9tdXgoTlVMTCwgY2xrX25hbWVzW0FVRElPMV9QTExdLCBwYXJlbnRfbmFtZXMsIDIsCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfbXV4KE5VTEwsIGNsa19uYW1lc1tBVURJTzFfUExMXSwgcGFyZW50X25hbWVzLCAyLAogCQkJICAgICAgIDAsIGdiYXNlICsgUkVHX0NMS1NFTEVDVDIsIDI5LCAxLCAwLCAmbG9jayk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChJU19FUlIoaHcpKQogCQlnb3RvIGJnMl9mYWlsOwogCiAJcGFyZW50X25hbWVzWzBdID0gY2xrX25hbWVzW1ZJREVPMF9QTExdOwogCXBhcmVudF9uYW1lc1sxXSA9IGNsa19uYW1lc1tWSURFT19FWFQwXTsKLQljbGsgPSBjbGtfcmVnaXN0ZXJfbXV4KE5VTEwsIGNsa19uYW1lc1tWSURFTzBfSU5dLCBwYXJlbnRfbmFtZXMsIDIsCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfbXV4KE5VTEwsIGNsa19uYW1lc1tWSURFTzBfSU5dLCBwYXJlbnRfbmFtZXMsIDIsCiAJCQkgICAgICAgMCwgZ2Jhc2UgKyBSRUdfQ0xLU0VMRUNUMywgNCwgMSwgMCwgJmxvY2spOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGh3KSkKIAkJZ290byBiZzJfZmFpbDsKIAogCXBhcmVudF9uYW1lc1swXSA9IGNsa19uYW1lc1tWSURFTzFfUExMXTsKIAlwYXJlbnRfbmFtZXNbMV0gPSBjbGtfbmFtZXNbVklERU9fRVhUMF07Ci0JY2xrID0gY2xrX3JlZ2lzdGVyX211eChOVUxMLCBjbGtfbmFtZXNbVklERU8xX0lOXSwgcGFyZW50X25hbWVzLCAyLAorCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX211eChOVUxMLCBjbGtfbmFtZXNbVklERU8xX0lOXSwgcGFyZW50X25hbWVzLCAyLAogCQkJICAgICAgIDAsIGdiYXNlICsgUkVHX0NMS1NFTEVDVDMsIDYsIDEsIDAsICZsb2NrKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCWdvdG8gYmcyX2ZhaWw7CiAKIAlwYXJlbnRfbmFtZXNbMF0gPSBjbGtfbmFtZXNbQVZQTExfQTJdOwogCXBhcmVudF9uYW1lc1sxXSA9IGNsa19uYW1lc1tBVlBMTF9CMl07Ci0JY2xrID0gY2xrX3JlZ2lzdGVyX211eChOVUxMLCBjbGtfbmFtZXNbVklERU8xX1BMTF0sIHBhcmVudF9uYW1lcywgMiwKKwlodyA9IGNsa19od19yZWdpc3Rlcl9tdXgoTlVMTCwgY2xrX25hbWVzW1ZJREVPMV9QTExdLCBwYXJlbnRfbmFtZXMsIDIsCiAJCQkgICAgICAgMCwgZ2Jhc2UgKyBSRUdfQ0xLU0VMRUNUMywgNywgMSwgMCwgJmxvY2spOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGh3KSkKIAkJZ290byBiZzJfZmFpbDsKIAogCXBhcmVudF9uYW1lc1swXSA9IGNsa19uYW1lc1tWSURFTzJfUExMXTsKIAlwYXJlbnRfbmFtZXNbMV0gPSBjbGtfbmFtZXNbVklERU9fRVhUMF07Ci0JY2xrID0gY2xrX3JlZ2lzdGVyX211eChOVUxMLCBjbGtfbmFtZXNbVklERU8yX0lOXSwgcGFyZW50X25hbWVzLCAyLAorCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX211eChOVUxMLCBjbGtfbmFtZXNbVklERU8yX0lOXSwgcGFyZW50X25hbWVzLCAyLAogCQkJICAgICAgIDAsIGdiYXNlICsgUkVHX0NMS1NFTEVDVDMsIDksIDEsIDAsICZsb2NrKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCWdvdG8gYmcyX2ZhaWw7CiAKIAlwYXJlbnRfbmFtZXNbMF0gPSBjbGtfbmFtZXNbQVZQTExfQjFdOwogCXBhcmVudF9uYW1lc1sxXSA9IGNsa19uYW1lc1tBVlBMTF9BNV07Ci0JY2xrID0gY2xrX3JlZ2lzdGVyX211eChOVUxMLCBjbGtfbmFtZXNbVklERU8yX1BMTF0sIHBhcmVudF9uYW1lcywgMiwKKwlodyA9IGNsa19od19yZWdpc3Rlcl9tdXgoTlVMTCwgY2xrX25hbWVzW1ZJREVPMl9QTExdLCBwYXJlbnRfbmFtZXMsIDIsCiAJCQkgICAgICAgMCwgZ2Jhc2UgKyBSRUdfQ0xLU0VMRUNUMywgMTAsIDEsIDAsICZsb2NrKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCWdvdG8gYmcyX2ZhaWw7CiAKIAkvKiBjbG9jayBkaXZpZGVyIGNlbGxzICovCkBAIC02NDgsNyArNjU2LDcgQEAKIAkJZm9yIChrID0gMDsgayA8IGRkLT5udW1fcGFyZW50czsgaysrKQogCQkJcGFyZW50X25hbWVzW2tdID0gY2xrX25hbWVzW2RkLT5wYXJlbnRfaWRzW2tdXTsKIAotCQljbGtzW0NMS0lEX1NZUyArIG5dID0gYmVybGluMl9kaXZfcmVnaXN0ZXIoJmRkLT5tYXAsIGdiYXNlLAorCQlod3NbQ0xLSURfU1lTICsgbl0gPSBiZXJsaW4yX2Rpdl9yZWdpc3RlcigmZGQtPm1hcCwgZ2Jhc2UsCiAJCQkJZGQtPm5hbWUsIGRkLT5kaXZfZmxhZ3MsIHBhcmVudF9uYW1lcywKIAkJCQlkZC0+bnVtX3BhcmVudHMsIGRkLT5mbGFncywgJmxvY2spOwogCX0KQEAgLTY1NywxOCArNjY1LDE4IEBACiAJZm9yIChuID0gMDsgbiA8IEFSUkFZX1NJWkUoYmcyX2dhdGVzKTsgbisrKSB7CiAJCWNvbnN0IHN0cnVjdCBiZXJsaW4yX2dhdGVfZGF0YSAqZ2QgPSAmYmcyX2dhdGVzW25dOwogCi0JCWNsa3NbQ0xLSURfR0VUSDAgKyBuXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsIGdkLT5uYW1lLAorCQlod3NbQ0xLSURfR0VUSDAgKyBuXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsIGdkLT5uYW1lLAogCQkJICAgIGdkLT5wYXJlbnRfbmFtZSwgZ2QtPmZsYWdzLCBnYmFzZSArIFJFR19DTEtFTkFCTEUsCiAJCQkgICAgZ2QtPmJpdF9pZHgsIDAsICZsb2NrKTsKIAl9CiAKIAkvKiB0d2RjbGsgaXMgZGVyaXZlZCBmcm9tIGNwdS8zICovCi0JY2xrc1tDTEtJRF9UV0RdID0KLQkJY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCAidHdkIiwgImNwdSIsIDAsIDEsIDMpOworCWh3c1tDTEtJRF9UV0RdID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCAidHdkIiwgImNwdSIsIDAsIDEsIDMpOwogCiAJLyogY2hlY2sgZm9yIGVycm9ycyBvbiBsZWFmIGNsb2NrcyAqLwogCWZvciAobiA9IDA7IG4gPCBNQVhfQ0xLUzsgbisrKSB7Ci0JCWlmICghSVNfRVJSKGNsa3Nbbl0pKQorCQlpZiAoIUlTX0VSUihod3Nbbl0pKQogCQkJY29udGludWU7CiAKIAkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIGxlYWYgY2xvY2sgJWRcbiIsCkBAIC02NzcsOSArNjg1LDcgQEAKIAl9CiAKIAkvKiByZWdpc3RlciBjbGstcHJvdmlkZXIgKi8KLQljbGtfZGF0YS5jbGtzID0gY2xrczsKLQljbGtfZGF0YS5jbGtfbnVtID0gTUFYX0NMS1M7Ci0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgJmNsa19kYXRhKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfb25lY2VsbF9nZXQsICZjbGtfZGF0YSk7CiAKIAlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZzJxLmMgYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmcycS5jCmluZGV4IGYxNDQ1NDcuLjA3MThlODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZzJxLmMKKysrIGIvZHJpdmVycy9jbGsvYmVybGluL2JnMnEuYwpAQCAtNDYsOCArNDYsNyBAQAogI2RlZmluZSBSRUdfU0RJTzFYSU5fQ0xLQ1RMCTB4MDE1YwogCiAjZGVmaW5lCU1BWF9DTEtTIDI4Ci1zdGF0aWMgc3RydWN0IGNsayAqY2xrc1tNQVhfQ0xLU107Ci1zdGF0aWMgc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgY2xrX2RhdGE7CitzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgKmNsa19kYXRhOwogc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKIHN0YXRpYyB2b2lkIF9faW9tZW0gKmdiYXNlOwogc3RhdGljIHZvaWQgX19pb21lbSAqY3B1cGxsX2Jhc2U7CkBAIC0yOTMsNyArMjkyLDE1IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnRfbnAgPSBvZl9nZXRfcGFyZW50KG5wKTsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbOV07CiAJc3RydWN0IGNsayAqY2xrOwotCWludCBuOworCXN0cnVjdCBjbGtfaHcgKipod3M7CisJaW50IG4sIHJldDsKKworCWNsa19kYXRhID0ga3phbGxvYyhzaXplb2YoKmNsa19kYXRhKSArCisJCQkgICBzaXplb2YoKmNsa19kYXRhLT5od3MpICogTUFYX0NMS1MsIEdGUF9LRVJORUwpOworCWlmICghY2xrX2RhdGEpCisJCXJldHVybjsKKwljbGtfZGF0YS0+bnVtID0gTUFYX0NMS1M7CisJaHdzID0gY2xrX2RhdGEtPmh3czsKIAogCWdiYXNlID0gb2ZfaW9tYXAocGFyZW50X25wLCAwKTsKIAlpZiAoIWdiYXNlKSB7CkBAIC0zMTcsMTQgKzMyNCwxNCBAQAogCX0KIAogCS8qIHNpbXBsZSByZWdpc3RlciBQTExzICovCi0JY2xrID0gYmVybGluMl9wbGxfcmVnaXN0ZXIoJmJnMnFfcGxsX21hcCwgZ2Jhc2UgKyBSRUdfU1lTUExMQ1RMMCwKKwlyZXQgPSBiZXJsaW4yX3BsbF9yZWdpc3RlcigmYmcycV9wbGxfbWFwLCBnYmFzZSArIFJFR19TWVNQTExDVEwwLAogCQkJCSAgIGNsa19uYW1lc1tTWVNQTExdLCBjbGtfbmFtZXNbUkVGQ0xLXSwgMCk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChyZXQpCiAJCWdvdG8gYmcycV9mYWlsOwogCi0JY2xrID0gYmVybGluMl9wbGxfcmVnaXN0ZXIoJmJnMnFfcGxsX21hcCwgY3B1cGxsX2Jhc2UsCisJcmV0ID0gYmVybGluMl9wbGxfcmVnaXN0ZXIoJmJnMnFfcGxsX21hcCwgY3B1cGxsX2Jhc2UsCiAJCQkJICAgY2xrX25hbWVzW0NQVVBMTF0sIGNsa19uYW1lc1tSRUZDTEtdLCAwKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKHJldCkKIAkJZ290byBiZzJxX2ZhaWw7CiAKIAkvKiBUT0RPOiBhZGQgQkcyUSBBVlBMTCAqLwpAQCAtMzQyLDcgKzM0OSw3IEBACiAJCWZvciAoayA9IDA7IGsgPCBkZC0+bnVtX3BhcmVudHM7IGsrKykKIAkJCXBhcmVudF9uYW1lc1trXSA9IGNsa19uYW1lc1tkZC0+cGFyZW50X2lkc1trXV07CiAKLQkJY2xrc1tDTEtJRF9TWVMgKyBuXSA9IGJlcmxpbjJfZGl2X3JlZ2lzdGVyKCZkZC0+bWFwLCBnYmFzZSwKKwkJaHdzW0NMS0lEX1NZUyArIG5dID0gYmVybGluMl9kaXZfcmVnaXN0ZXIoJmRkLT5tYXAsIGdiYXNlLAogCQkJCWRkLT5uYW1lLCBkZC0+ZGl2X2ZsYWdzLCBwYXJlbnRfbmFtZXMsCiAJCQkJZGQtPm51bV9wYXJlbnRzLCBkZC0+ZmxhZ3MsICZsb2NrKTsKIAl9CkBAIC0zNTEsMjIgKzM1OCwyMiBAQAogCWZvciAobiA9IDA7IG4gPCBBUlJBWV9TSVpFKGJnMnFfZ2F0ZXMpOyBuKyspIHsKIAkJY29uc3Qgc3RydWN0IGJlcmxpbjJfZ2F0ZV9kYXRhICpnZCA9ICZiZzJxX2dhdGVzW25dOwogCi0JCWNsa3NbQ0xLSURfR0ZYMkRBWEkgKyBuXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsIGdkLT5uYW1lLAorCQlod3NbQ0xLSURfR0ZYMkRBWEkgKyBuXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsIGdkLT5uYW1lLAogCQkJICAgIGdkLT5wYXJlbnRfbmFtZSwgZ2QtPmZsYWdzLCBnYmFzZSArIFJFR19DTEtFTkFCTEUsCiAJCQkgICAgZ2QtPmJpdF9pZHgsIDAsICZsb2NrKTsKIAl9CiAKIAkvKiBjcHVjbGsgZGl2aWRlciBpcyBmaXhlZCB0byAxICovCi0JY2xrc1tDTEtJRF9DUFVdID0KLQkJY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCAiY3B1IiwgY2xrX25hbWVzW0NQVVBMTF0sCisJaHdzW0NMS0lEX0NQVV0gPQorCQljbGtfaHdfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsICJjcHUiLCBjbGtfbmFtZXNbQ1BVUExMXSwKIAkJCQkJICAwLCAxLCAxKTsKIAkvKiB0d2RjbGsgaXMgZGVyaXZlZCBmcm9tIGNwdS8zICovCi0JY2xrc1tDTEtJRF9UV0RdID0KLQkJY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCAidHdkIiwgImNwdSIsIDAsIDEsIDMpOworCWh3c1tDTEtJRF9UV0RdID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCAidHdkIiwgImNwdSIsIDAsIDEsIDMpOwogCiAJLyogY2hlY2sgZm9yIGVycm9ycyBvbiBsZWFmIGNsb2NrcyAqLwogCWZvciAobiA9IDA7IG4gPCBNQVhfQ0xLUzsgbisrKSB7Ci0JCWlmICghSVNfRVJSKGNsa3Nbbl0pKQorCQlpZiAoIUlTX0VSUihod3Nbbl0pKQogCQkJY29udGludWU7CiAKIAkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIGxlYWYgY2xvY2sgJWRcbiIsCkBAIC0zNzUsOSArMzgyLDcgQEAKIAl9CiAKIAkvKiByZWdpc3RlciBjbGstcHJvdmlkZXIgKi8KLQljbGtfZGF0YS5jbGtzID0gY2xrczsKLQljbGtfZGF0YS5jbGtfbnVtID0gTUFYX0NMS1M7Ci0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgJmNsa19kYXRhKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfb25lY2VsbF9nZXQsICZjbGtfZGF0YSk7CiAKIAlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1hc205MjYwLmMgYi9kcml2ZXJzL2Nsay9jbGstYXNtOTI2MC5jCmluZGV4IDkwODk3YWYuLmVhODU2ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1hc205MjYwLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLWFzbTkyNjAuYwpAQCAtNjgsOCArNjgsNyBAQAogI2RlZmluZSBIV19MQ0RDTEtESVYJCTB4MDFmYwogI2RlZmluZSBIV19BRENBTkFDTEtESVYJCTB4MDIwMAogCi1zdGF0aWMgc3RydWN0IGNsayAqY2xrc1tNQVhfQ0xLU107Ci1zdGF0aWMgc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgY2xrX2RhdGE7CitzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgKmNsa19kYXRhOwogc3RhdGljIERFRklORV9TUElOTE9DSyhhc205MjYwX2Nsa19sb2NrKTsKIAogc3RydWN0IGFzbTkyNjBfZGl2X2NsayB7CkBAIC0yNjcsMTIgKzI2NiwyMCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgYXNtOTI2MF9hY2NfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwlzdHJ1Y3QgY2xrX2h3ICoqaHdzOwogCWNvbnN0IGNoYXIgKnJlZl9jbGssICpwbGxfY2xrID0gInBsbCI7CiAJdTMyIHJhdGU7CiAJaW50IG47CiAJdTMyIGFjY3VyYWN5ID0gMDsKIAorCWNsa19kYXRhID0ga3phbGxvYyhzaXplb2YoKmNsa19kYXRhKSArCisJCQkgICBzaXplb2YoKmNsa19kYXRhLT5od3MpICogTUFYX0NMS1MsIEdGUF9LRVJORUwpOworCWlmICghY2xrX2RhdGEpCisJCXJldHVybjsKKwljbGtfZGF0YS0+bnVtID0gTUFYX0NMS1M7CisJaHdzID0gY2xrX2RhdGEtPmh3czsKKwogCWJhc2UgPSBvZl9pb19yZXF1ZXN0X2FuZF9tYXAobnAsIDAsIG5wLT5uYW1lKTsKIAlpZiAoSVNfRVJSKGJhc2UpKQogCQlwYW5pYygiJXM6IHVuYWJsZSB0byBtYXAgcmVzb3VyY2UiLCBucC0+bmFtZSk7CkBAIC0yODIsMTAgKzI4OSwxMCBAQAogCiAJcmVmX2NsayA9IG9mX2Nsa19nZXRfcGFyZW50X25hbWUobnAsIDApOwogCWFjY3VyYWN5ID0gY2xrX2dldF9hY2N1cmFjeShfX2Nsa19sb29rdXAocmVmX2NsaykpOwotCWNsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9yYXRlX3dpdGhfYWNjdXJhY3koTlVMTCwgcGxsX2NsaywKKwlodyA9IGNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlX3dpdGhfYWNjdXJhY3koTlVMTCwgcGxsX2NsaywKIAkJCXJlZl9jbGssIDAsIHJhdGUsIGFjY3VyYWN5KTsKIAotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcGFuaWMoIiVzOiBjYW4ndCByZWdpc3RlciBSRUZDTEsuIENoZWNrIERUISIsIG5wLT5uYW1lKTsKIAogCWZvciAobiA9IDA7IG4gPCBBUlJBWV9TSVpFKGFzbTkyNjBfbXV4X2Nsa3MpOyBuKyspIHsKQEAgLTI5Myw3ICszMDAsNyBAQAogCiAJCW1jLT5wYXJlbnRfbmFtZXNbMF0gPSByZWZfY2xrOwogCQltYy0+cGFyZW50X25hbWVzWzFdID0gcGxsX2NsazsKLQkJY2xrID0gY2xrX3JlZ2lzdGVyX211eF90YWJsZShOVUxMLCBtYy0+bmFtZSwgbWMtPnBhcmVudF9uYW1lcywKKwkJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfbXV4X3RhYmxlKE5VTEwsIG1jLT5uYW1lLCBtYy0+cGFyZW50X25hbWVzLAogCQkJCW1jLT5udW1fcGFyZW50cywgbWMtPmZsYWdzLCBiYXNlICsgbWMtPm9mZnNldCwKIAkJCQkwLCBtYy0+bWFzaywgMCwgbWMtPnRhYmxlLCAmYXNtOTI2MF9jbGtfbG9jayk7CiAJfQpAQCAtMzAyLDcgKzMwOSw3IEBACiAJZm9yIChuID0gMDsgbiA8IEFSUkFZX1NJWkUoYXNtOTI2MF9tdXhfZ2F0ZXMpOyBuKyspIHsKIAkJY29uc3Qgc3RydWN0IGFzbTkyNjBfZ2F0ZV9kYXRhICpnZCA9ICZhc205MjYwX211eF9nYXRlc1tuXTsKIAotCQljbGsgPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCBnZC0+bmFtZSwKKwkJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCBnZC0+bmFtZSwKIAkJCWdkLT5wYXJlbnRfbmFtZSwgZ2QtPmZsYWdzIHwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKIAkJCWJhc2UgKyBnZC0+cmVnLCBnZC0+Yml0X2lkeCwgMCwgJmFzbTkyNjBfY2xrX2xvY2spOwogCX0KQEAgLTMxMSw3ICszMTgsNyBAQAogCWZvciAobiA9IDA7IG4gPCBBUlJBWV9TSVpFKGFzbTkyNjBfZGl2X2Nsa3MpOyBuKyspIHsKIAkJY29uc3Qgc3RydWN0IGFzbTkyNjBfZGl2X2NsayAqZGMgPSAmYXNtOTI2MF9kaXZfY2xrc1tuXTsKIAotCQljbGtzW2RjLT5pZHhdID0gY2xrX3JlZ2lzdGVyX2RpdmlkZXIoTlVMTCwgZGMtPm5hbWUsCisJCWh3c1tkYy0+aWR4XSA9IGNsa19od19yZWdpc3Rlcl9kaXZpZGVyKE5VTEwsIGRjLT5uYW1lLAogCQkJCWRjLT5wYXJlbnRfbmFtZSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKIAkJCQliYXNlICsgZGMtPnJlZywgMCwgOCwgQ0xLX0RJVklERVJfT05FX0JBU0VELAogCQkJCSZhc205MjYwX2Nsa19sb2NrKTsKQEAgLTMyMSwxNCArMzI4LDE0IEBACiAJZm9yIChuID0gMDsgbiA8IEFSUkFZX1NJWkUoYXNtOTI2MF9haGJfZ2F0ZXMpOyBuKyspIHsKIAkJY29uc3Qgc3RydWN0IGFzbTkyNjBfZ2F0ZV9kYXRhICpnZCA9ICZhc205MjYwX2FoYl9nYXRlc1tuXTsKIAotCQljbGtzW2dkLT5pZHhdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgZ2QtPm5hbWUsCisJCWh3c1tnZC0+aWR4XSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsIGdkLT5uYW1lLAogCQkJCWdkLT5wYXJlbnRfbmFtZSwgZ2QtPmZsYWdzLCBiYXNlICsgZ2QtPnJlZywKIAkJCQlnZC0+Yml0X2lkeCwgMCwgJmFzbTkyNjBfY2xrX2xvY2spOwogCX0KIAogCS8qIGNoZWNrIGZvciBlcnJvcnMgb24gbGVhZiBjbG9ja3MgKi8KIAlmb3IgKG4gPSAwOyBuIDwgTUFYX0NMS1M7IG4rKykgewotCQlpZiAoIUlTX0VSUihjbGtzW25dKSkKKwkJaWYgKCFJU19FUlIoaHdzW25dKSkKIAkJCWNvbnRpbnVlOwogCiAJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBsZWFmIGNsb2NrICVkXG4iLApAQCAtMzM3LDkgKzM0NCw3IEBACiAJfQogCiAJLyogcmVnaXN0ZXIgY2xrLXByb3ZpZGVyICovCi0JY2xrX2RhdGEuY2xrcyA9IGNsa3M7Ci0JY2xrX2RhdGEuY2xrX251bSA9IE1BWF9DTEtTOwotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsICZjbGtfZGF0YSk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X29uZWNlbGxfZ2V0LCBjbGtfZGF0YSk7CiAJcmV0dXJuOwogZmFpbDoKIAlpb3VubWFwKGJhc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLWF4aS1jbGtnZW4uYyBiL2RyaXZlcnMvY2xrL2Nsay1heGktY2xrZ2VuLmMKaW5kZXggMzI5NGRiMy4uNWU5MThlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLWF4aS1jbGtnZW4uYworKysgYi9kcml2ZXJzL2Nsay9jbGstYXhpLWNsa2dlbi5jCkBAIC0zOTIsOCArMzkyLDggQEAKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbMl07CiAJY29uc3QgY2hhciAqY2xrX25hbWU7CiAJc3RydWN0IHJlc291cmNlICptZW07Ci0Jc3RydWN0IGNsayAqY2xrOwogCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CiAKIAlpZiAoIXBkZXYtPmRldi5vZl9ub2RlKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTQzMywxMiArNDMzLDEyIEBACiAJYXhpX2Nsa2dlbl9tbWNtX2VuYWJsZShheGlfY2xrZ2VuLCBmYWxzZSk7CiAKIAlheGlfY2xrZ2VuLT5jbGtfaHcuaW5pdCA9ICZpbml0OwotCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZheGlfY2xrZ2VuLT5jbGtfaHcpOwotCWlmIChJU19FUlIoY2xrKSkKLQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmcGRldi0+ZGV2LCAmYXhpX2Nsa2dlbi0+Y2xrX2h3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0JcmV0dXJuIG9mX2Nsa19hZGRfcHJvdmlkZXIocGRldi0+ZGV2Lm9mX25vZGUsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwKLQkJCQkgICAgY2xrKTsKKwlyZXR1cm4gb2ZfY2xrX2FkZF9od19wcm92aWRlcihwZGV2LT5kZXYub2Zfbm9kZSwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsCisJCQkJICAgICAgJmF4aV9jbGtnZW4tPmNsa19odyk7CiB9CiAKIHN0YXRpYyBpbnQgYXhpX2Nsa2dlbl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1heG01NTE2LmMgYi9kcml2ZXJzL2Nsay9jbGstYXhtNTUxNi5jCmluZGV4IGM3YzkxYTUuLjVkN2FlMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1heG01NTE2LmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLWF4bTU1MTYuYwpAQCAtNTE2LDYgKzUxNiwxOSBAQAogCVtBWFhJQV9DTEtfTU1DXSAgICAgID0gJmNsa19tbWNfbXV4LmFjbGssCiB9OwogCitzdGF0aWMgc3RydWN0IGNsa19odyAqCitvZl9jbGtfYXhtY2xrX2dldChzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpjbGtzcGVjLCB2b2lkICp1bnVzZWQpCit7CisJdW5zaWduZWQgaW50IGlkeCA9IGNsa3NwZWMtPmFyZ3NbMF07CisKKwlpZiAoaWR4ID49IEFSUkFZX1NJWkUoYXhtY2xrX2Nsb2NrcykpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBpbmRleCAldVxuIiwgX19mdW5jX18sIGlkeCk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCXJldHVybiAmYXhtY2xrX2Nsb2Nrc1tpZHhdLT5odzsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGF4bWNsa19yZWdtYXBfY29uZmlnID0gewogCS5yZWdfYml0cwk9IDMyLAogCS5yZWdfc3RyaWRlCT0gNCwKQEAgLTUzMCwyMSArNTQzLDE0IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYXhtY2xrX21hdGNoX3RhYmxlKTsKIAotc3RydWN0IGF4bWNsa19wcml2IHsKLQlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSBvbmVjZWxsOwotCXN0cnVjdCBjbGsgKmNsa3NbXTsKLX07Ci0KIHN0YXRpYyBpbnQgYXhtY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCBpLCByZXQ7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCXNpemVfdCBudW1fY2xrczsKLQlzdHJ1Y3QgYXhtY2xrX3ByaXYgKnByaXY7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOwpAQCAtNTU3LDI5ICs1NjMsMTggQEAKIAogCW51bV9jbGtzID0gQVJSQVlfU0laRShheG1jbGtfY2xvY2tzKTsKIAlwcl9pbmZvKCJheG1jbGs6IHN1cHBvcnRpbmcgJXp1IGNsb2Nrc1xuIiwgbnVtX2Nsa3MpOwotCXByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnByaXYpICsgc2l6ZW9mKCpwcml2LT5jbGtzKSAqIG51bV9jbGtzLAotCQkJICAgIEdGUF9LRVJORUwpOwotCWlmICghcHJpdikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcml2LT5vbmVjZWxsLmNsa3MgPSBwcml2LT5jbGtzOwotCXByaXYtPm9uZWNlbGwuY2xrX251bSA9IG51bV9jbGtzOwogCiAJLyogVXBkYXRlIGVhY2ggZW50cnkgd2l0aCB0aGUgYWxsb2NhdGVkIHJlZ21hcCBhbmQgcmVnaXN0ZXIgdGhlIGNsb2NrCiAJICogd2l0aCB0aGUgY29tbW9uIGNsb2NrIGZyYW1ld29yawogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1fY2xrczsgaSsrKSB7CiAJCWF4bWNsa19jbG9ja3NbaV0tPnJlZ21hcCA9IHJlZ21hcDsKLQkJY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoZGV2LCAmYXhtY2xrX2Nsb2Nrc1tpXS0+aHcpOwotCQlpZiAoSVNfRVJSKGNsaykpCi0JCQlyZXR1cm4gUFRSX0VSUihjbGspOwotCQlwcml2LT5jbGtzW2ldID0gY2xrOworCQlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcihkZXYsICZheG1jbGtfY2xvY2tzW2ldLT5odyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IG9mX2Nsa19hZGRfcHJvdmlkZXIoZGV2LT5vZl9ub2RlLAotCQkJCSAgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgJnByaXYtPm9uZWNlbGwpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gb2ZfY2xrX2FkZF9od19wcm92aWRlcihkZXYtPm9mX25vZGUsIG9mX2Nsa19heG1jbGtfZ2V0LCBOVUxMKTsKIH0KIAogc3RhdGljIGludCBheG1jbGtfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstY2RjZTcwNi5jIGIvZHJpdmVycy9jbGsvY2xrLWNkY2U3MDYuYwppbmRleCAwMTg3N2Y2Li5mMjFkOTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstY2RjZTcwNi5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1jZGNlNzA2LmMKQEAgLTcxLDcgKzcxLDYgQEAKIAlzdHJ1Y3QgY2RjZTcwNl9kZXZfZGF0YSAqZGV2X2RhdGE7CiAJdW5zaWduZWQgaWR4OwogCXVuc2lnbmVkIHBhcmVudDsKLQlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IGNsa19odyBodzsKIAl1bnNpZ25lZCBkaXY7CiAJdW5zaWduZWQgbXVsOwpAQCAtODEsOCArODAsNiBAQAogc3RydWN0IGNkY2U3MDZfZGV2X2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwotCXN0cnVjdCBjbGtfb25lY2VsbF9kYXRhIG9uZWNlbGw7Ci0Jc3RydWN0IGNsayAqY2xrc1s2XTsKIAlzdHJ1Y3QgY2xrICpjbGtpbl9jbGtbMl07CiAJY29uc3QgY2hhciAqY2xraW5fbmFtZVsyXTsKIAlzdHJ1Y3QgY2RjZTcwNl9od19kYXRhIGNsa2luWzFdOwpAQCAtNDU1LDE4ICs0NTIsMTkgQEAKIAkJCSAgICAgICBzdHJ1Y3QgY2xrX2luaXRfZGF0YSAqaW5pdCkKIHsKIAl1bnNpZ25lZCBpOworCWludCByZXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2h3OyArK2ksICsraHcpIHsKIAkJaW5pdC0+bmFtZSA9IGNsa19uYW1lc1tpXTsKIAkJaHctPmRldl9kYXRhID0gY2RjZTsKIAkJaHctPmlkeCA9IGk7CiAJCWh3LT5ody5pbml0ID0gaW5pdDsKLQkJaHctPmNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZjZGNlLT5jbGllbnQtPmRldiwKKwkJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJmNkY2UtPmNsaWVudC0+ZGV2LAogCQkJCQkgICAgJmh3LT5odyk7Ci0JCWlmIChJU19FUlIoaHctPmNsaykpIHsKKwkJaWYgKHJldCkgewogCQkJZGV2X2VycigmY2RjZS0+Y2xpZW50LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgJXNcbiIsCiAJCQkJY2xrX25hbWVzW2ldKTsKLQkJCXJldHVybiBQVFJfRVJSKGh3LT5jbGspOworCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KIAlyZXR1cm4gMDsKQEAgLTYxMywxMyArNjExLDIzIEBACiAJCQljZGNlLT5jbGtvdXRbaV0ucGFyZW50KTsKIAl9CiAKLQlyZXQgPSBjZGNlNzA2X3JlZ2lzdGVyX2h3KGNkY2UsIGNkY2UtPmNsa291dCwKLQkJCQkgIEFSUkFZX1NJWkUoY2RjZS0+Y2xrb3V0KSwKLQkJCQkgIGNkY2U3MDZfY2xrb3V0X25hbWUsICZpbml0KTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjZGNlLT5jbGtvdXQpOyArK2kpCi0JCWNkY2UtPmNsa3NbaV0gPSBjZGNlLT5jbGtvdXRbaV0uY2xrOworCXJldHVybiBjZGNlNzA2X3JlZ2lzdGVyX2h3KGNkY2UsIGNkY2UtPmNsa291dCwKKwkJCQkgICBBUlJBWV9TSVpFKGNkY2UtPmNsa291dCksCisJCQkJICAgY2RjZTcwNl9jbGtvdXRfbmFtZSwgJmluaXQpOworfQogCi0JcmV0dXJuIHJldDsKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICoKK29mX2Nsa19jZGNlX2dldChzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpjbGtzcGVjLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBjZGNlNzA2X2Rldl9kYXRhICpjZGNlID0gZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gY2xrc3BlYy0+YXJnc1swXTsKKworCWlmIChpZHggPj0gQVJSQVlfU0laRShjZGNlLT5jbGtvdXQpKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgaW5kZXggJXVcbiIsIF9fZnVuY19fLCBpZHgpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gJmNkY2UtPmNsa291dFtpZHhdLmh3OwogfQogCiBzdGF0aWMgaW50IGNkY2U3MDZfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKQEAgLTY1NywxMiArNjY1LDggQEAKIAlyZXQgPSBjZGNlNzA2X3JlZ2lzdGVyX2Nsa291dHMoY2RjZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JY2RjZS0+b25lY2VsbC5jbGtzID0gY2RjZS0+Y2xrczsKLQljZGNlLT5vbmVjZWxsLmNsa19udW0gPSBBUlJBWV9TSVpFKGNkY2UtPmNsa3MpOwotCXJldCA9IG9mX2Nsa19hZGRfcHJvdmlkZXIoY2xpZW50LT5kZXYub2Zfbm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwKLQkJCQkgICZjZGNlLT5vbmVjZWxsKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIoY2xpZW50LT5kZXYub2Zfbm9kZSwgb2ZfY2xrX2NkY2VfZ2V0LAorCQkJCSAgICAgIGNkY2UpOwogfQogCiBzdGF0aWMgaW50IGNkY2U3MDZfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstY2RjZTkyNS5jIGIvZHJpdmVycy9jbGsvY2xrLWNkY2U5MjUuYwppbmRleCAwODliZjg4Li5iODQ1OWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstY2RjZTkyNS5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1jZGNlOTI1LmMKQEAgLTYyLDggKzYyLDYgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2NsaWVudDsKIAlzdHJ1Y3QgY2xrX2NkY2U5MjVfcGxsIHBsbFtOVU1CRVJfT0ZfUExMU107CiAJc3RydWN0IGNsa19jZGNlOTI1X291dHB1dCBjbGtbTlVNQkVSX09GX09VVFBVVFNdOwotCXN0cnVjdCBjbGsgKmR0X2Nsa1tOVU1CRVJfT0ZfT1VUUFVUU107Ci0Jc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgb25lY2VsbDsKIH07CiAKIC8qICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICovCkBAIC01NTcsNiArNTU1LDIwIEBACiAJCXJldHVybiAtRUlPOwogfQogCitzdGF0aWMgc3RydWN0IGNsa19odyAqCitvZl9jbGtfY2RjZTkyNV9nZXQoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqY2xrc3BlYywgdm9pZCAqX2RhdGEpCit7CisJc3RydWN0IGNsa19jZGNlOTI1X2NoaXAgKmRhdGEgPSBfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gY2xrc3BlYy0+YXJnc1swXTsKKworCWlmIChpZHggPj0gQVJSQVlfU0laRShkYXRhLT5jbGspKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgaW5kZXggJXVcbiIsIF9fZnVuY19fLCBpZHgpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gJmRhdGEtPmNsa1tpZHhdLmh3OworfQorCiAvKiBUaGUgQ0RDRTkyNSB1c2VzIGEgZnVua3kgd2F5IHRvIHJlYWQvd3JpdGUgcmVnaXN0ZXJzLiBCdWxrIG1vZGUgaXMKICAqIGp1c3Qgd2VpcmQsIHNvIGp1c3QgdXNlIHRoZSBzaW5nbGUgYnl0ZSBtb2RlIGV4Y2x1c2l2ZWx5LiAqLwogc3RhdGljIHN0cnVjdCByZWdtYXBfYnVzIHJlZ21hcF9jZGNlOTI1X2J1cyA9IHsKQEAgLTU3Miw3ICs1ODQsNiBAQAogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwogCWNvbnN0IGNoYXIgKnBsbF9jbGtfbmFtZVtOVU1CRVJfT0ZfUExMU10gPSB7TlVMTCx9OwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7Ci0Jc3RydWN0IGNsayAqY2xrOwogCXUzMiB2YWx1ZTsKIAlpbnQgaTsKIAlpbnQgZXJyOwpAQCAtNjIyLDEwICs2MzMsOSBAQAogCQlkYXRhLT5wbGxbaV0uY2hpcCA9IGRhdGE7CiAJCWRhdGEtPnBsbFtpXS5ody5pbml0ID0gJmluaXQ7CiAJCWRhdGEtPnBsbFtpXS5pbmRleCA9IGk7Ci0JCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRhdGEtPnBsbFtpXS5odyk7Ci0JCWlmIChJU19FUlIoY2xrKSkgeworCQllcnIgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkYXRhLT5wbGxbaV0uaHcpOworCQlpZiAoZXJyKSB7CiAJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCByZWdpc3RlciBQTEwgJWRcbiIsIGkpOwotCQkJZXJyID0gUFRSX0VSUihjbGspOwogCQkJZ290byBlcnJvcjsKIAkJfQogCQlzcHJpbnRmKGNoaWxkX25hbWUsICJQTEwlZCIsIGkrMSk7CkBAIC02MzQsNyArNjQ0LDcgQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wX291dHB1dCwKIAkJCSJjbG9jay1mcmVxdWVuY3kiLCAmdmFsdWUpKSB7Ci0JCQllcnIgPSBjbGtfc2V0X3JhdGUoY2xrLCB2YWx1ZSk7CisJCQllcnIgPSBjbGtfc2V0X3JhdGUoZGF0YS0+cGxsW2ldLmh3LmNsaywgdmFsdWUpOwogCQkJaWYgKGVycikKIAkJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKIAkJCQkJInVuYWJsZSB0byBzZXQgUExMIGZyZXF1ZW5jeSAldWRcbiIsCkBAIC02NjMsMTQgKzY3MywxMiBAQAogCWRhdGEtPmNsa1swXS5ody5pbml0ID0gJmluaXQ7CiAJZGF0YS0+Y2xrWzBdLmluZGV4ID0gMDsKIAlkYXRhLT5jbGtbMF0ucGRpdiA9IDE7Ci0JY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZGF0YS0+Y2xrWzBdLmh3KTsKKwllcnIgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkYXRhLT5jbGtbMF0uaHcpOwogCWtmcmVlKGluaXQubmFtZSk7IC8qIGNsb2NrIGZyYW1ld29yayBtYWRlIGEgY29weSBvZiB0aGUgbmFtZSAqLwotCWlmIChJU19FUlIoY2xrKSkgeworCWlmIChlcnIpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJjbG9jayByZWdpc3RyYXRpb24gWTEgZmFpbGVkXG4iKTsKLQkJZXJyID0gUFRSX0VSUihjbGspOwogCQlnb3RvIGVycm9yOwogCX0KLQlkYXRhLT5kdF9jbGtbMF0gPSBjbGs7CiAKIAkvKiBSZWdpc3RlciBvdXRwdXQgY2xvY2tzIFkyIC4uIFk1Ki8KIAlpbml0Lm9wcyA9ICZjZGNlOTI1X2Nsa19vcHM7CkBAIC02OTUsMjEgKzcwMywxNyBAQAogCQkJaW5pdC5wYXJlbnRfbmFtZXMgPSAmcGxsX2Nsa19uYW1lWzFdOwogCQkJYnJlYWs7CiAJCX0KLQkJY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZGF0YS0+Y2xrW2ldLmh3KTsKKwkJZXJyID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZGF0YS0+Y2xrW2ldLmh3KTsKIAkJa2ZyZWUoaW5pdC5uYW1lKTsgLyogY2xvY2sgZnJhbWV3b3JrIG1hZGUgYSBjb3B5IG9mIHRoZSBuYW1lICovCi0JCWlmIChJU19FUlIoY2xrKSkgeworCQlpZiAoZXJyKSB7CiAJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImNsb2NrIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOwotCQkJZXJyID0gUFRSX0VSUihjbGspOwogCQkJZ290byBlcnJvcjsKIAkJfQotCQlkYXRhLT5kdF9jbGtbaV0gPSBjbGs7CiAJfQogCiAJLyogUmVnaXN0ZXIgdGhlIG91dHB1dCBjbG9ja3MgKi8KLQlkYXRhLT5vbmVjZWxsLmNsa19udW0gPSBOVU1CRVJfT0ZfT1VUUFVUUzsKLQlkYXRhLT5vbmVjZWxsLmNsa3MgPSBkYXRhLT5kdF9jbGs7Ci0JZXJyID0gb2ZfY2xrX2FkZF9wcm92aWRlcihjbGllbnQtPmRldi5vZl9ub2RlLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LAotCQkmZGF0YS0+b25lY2VsbCk7CisJZXJyID0gb2ZfY2xrX2FkZF9od19wcm92aWRlcihjbGllbnQtPmRldi5vZl9ub2RlLCBvZl9jbGtfY2RjZTkyNV9nZXQsCisJCQkJICBkYXRhKTsKIAlpZiAoZXJyKQogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byBhZGQgT0YgY2xvY2sgcHJvdmlkZXJcbiIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstY2xwczcxMXguYyBiL2RyaXZlcnMvY2xrL2Nsay1jbHBzNzExeC5jCmluZGV4IGFkYWYxMDkuLjkxOTNmNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1jbHBzNzExeC5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1jbHBzNzExeC5jCkBAIC00MCw5ICs0MCw4IEBACiB9OwogCiBzdHJ1Y3QgY2xwczcxMXhfY2xrIHsKLQlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YQljbGtfZGF0YTsKLQlzcGlubG9ja190CQlsb2NrOwotCXN0cnVjdCBjbGsJCSpjbGtzW0NMUFM3MTFYX0NMS19NQVhdOworCXNwaW5sb2NrX3QJCQlsb2NrOworCXN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhCWNsa19kYXRhOwogfTsKIAogc3RhdGljIHN0cnVjdCBjbHBzNzExeF9jbGsgKiBfX2luaXQgX2NscHM3MTF4X2Nsa19pbml0KHZvaWQgX19pb21lbSAqYmFzZSwKQEAgLTU1LDcgKzU0LDkgQEAKIAlpZiAoIWJhc2UpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JY2xwczcxMXhfY2xrID0ga3phbGxvYyhzaXplb2YoKmNscHM3MTF4X2NsayksIEdGUF9LRVJORUwpOworCWNscHM3MTF4X2NsayA9IGt6YWxsb2Moc2l6ZW9mKCpjbHBzNzExeF9jbGspICsKKwkJCXNpemVvZigqY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3MpICogQ0xQUzcxMVhfQ0xLX01BWCwKKwkJCUdGUF9LRVJORUwpOwogCWlmICghY2xwczcxMXhfY2xrKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIApAQCAtMTA2LDQwICsxMDcsNDAgQEAKIAl0bXAgfD0gU1lTQ09OMV9UQzJNIHwgU1lTQ09OMV9UQzJTOwogCXdyaXRlbCh0bXAsIGJhc2UgKyBDTFBTNzExWF9TWVNDT04xKTsKIAotCWNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfRFVNTVldID0KLQkJY2xrX3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgImR1bW15IiwgTlVMTCwgMCwgMCk7Ci0JY2xwczcxMXhfY2xrLT5jbGtzW0NMUFM3MTFYX0NMS19DUFVdID0KLQkJY2xrX3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgImNwdSIsIE5VTEwsIDAsIGZfY3B1KTsKLQljbHBzNzExeF9jbGstPmNsa3NbQ0xQUzcxMVhfQ0xLX0JVU10gPQotCQljbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAiYnVzIiwgTlVMTCwgMCwgZl9idXMpOwotCWNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfUExMXSA9Ci0JCWNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJwbGwiLCBOVUxMLCAwLCBmX3BsbCk7Ci0JY2xwczcxMXhfY2xrLT5jbGtzW0NMUFM3MTFYX0NMS19USU1FUlJFRl0gPQotCQljbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAidGltZXJfcmVmIiwgTlVMTCwgMCwgZl90aW0pOwotCWNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfVElNRVIxXSA9Ci0JCWNsa19yZWdpc3Rlcl9kaXZpZGVyX3RhYmxlKE5VTEwsICJ0aW1lcjEiLCAidGltZXJfcmVmIiwgMCwKKwljbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfRFVNTVldID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgImR1bW15IiwgTlVMTCwgMCwgMCk7CisJY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3NbQ0xQUzcxMVhfQ0xLX0NQVV0gPQorCQljbGtfaHdfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAiY3B1IiwgTlVMTCwgMCwgZl9jcHUpOworCWNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19CVVNdID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgImJ1cyIsIE5VTEwsIDAsIGZfYnVzKTsKKwljbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfUExMXSA9CisJCWNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJwbGwiLCBOVUxMLCAwLCBmX3BsbCk7CisJY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3NbQ0xQUzcxMVhfQ0xLX1RJTUVSUkVGXSA9CisJCWNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJ0aW1lcl9yZWYiLCBOVUxMLCAwLCBmX3RpbSk7CisJY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3NbQ0xQUzcxMVhfQ0xLX1RJTUVSMV0gPQorCQljbGtfaHdfcmVnaXN0ZXJfZGl2aWRlcl90YWJsZShOVUxMLCAidGltZXIxIiwgInRpbWVyX3JlZiIsIDAsCiAJCQkJCSAgIGJhc2UgKyBDTFBTNzExWF9TWVNDT04xLCA1LCAxLCAwLAogCQkJCQkgICB0aW1lcl9kaXZfdGFibGUsICZjbHBzNzExeF9jbGstPmxvY2spOwotCWNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfVElNRVIyXSA9Ci0JCWNsa19yZWdpc3Rlcl9kaXZpZGVyX3RhYmxlKE5VTEwsICJ0aW1lcjIiLCAidGltZXJfcmVmIiwgMCwKKwljbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfVElNRVIyXSA9CisJCWNsa19od19yZWdpc3Rlcl9kaXZpZGVyX3RhYmxlKE5VTEwsICJ0aW1lcjIiLCAidGltZXJfcmVmIiwgMCwKIAkJCQkJICAgYmFzZSArIENMUFM3MTFYX1NZU0NPTjEsIDcsIDEsIDAsCiAJCQkJCSAgIHRpbWVyX2Rpdl90YWJsZSwgJmNscHM3MTF4X2Nsay0+bG9jayk7Ci0JY2xwczcxMXhfY2xrLT5jbGtzW0NMUFM3MTFYX0NMS19QV01dID0KLQkJY2xrX3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgInB3bSIsIE5VTEwsIDAsIGZfcHdtKTsKLQljbHBzNzExeF9jbGstPmNsa3NbQ0xQUzcxMVhfQ0xLX1NQSVJFRl0gPQotCQljbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAic3BpX3JlZiIsIE5VTEwsIDAsIGZfc3BpKTsKLQljbHBzNzExeF9jbGstPmNsa3NbQ0xQUzcxMVhfQ0xLX1NQSV0gPQotCQljbGtfcmVnaXN0ZXJfZGl2aWRlcl90YWJsZShOVUxMLCAic3BpIiwgInNwaV9yZWYiLCAwLAorCWNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19QV01dID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgInB3bSIsIE5VTEwsIDAsIGZfcHdtKTsKKwljbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfU1BJUkVGXSA9CisJCWNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJzcGlfcmVmIiwgTlVMTCwgMCwgZl9zcGkpOworCWNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19TUEldID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2RpdmlkZXJfdGFibGUoTlVMTCwgInNwaSIsICJzcGlfcmVmIiwgMCwKIAkJCQkJICAgYmFzZSArIENMUFM3MTFYX1NZU0NPTjEsIDE2LCAyLCAwLAogCQkJCQkgICBzcGlfZGl2X3RhYmxlLCAmY2xwczcxMXhfY2xrLT5sb2NrKTsKLQljbHBzNzExeF9jbGstPmNsa3NbQ0xQUzcxMVhfQ0xLX1VBUlRdID0KLQkJY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCAidWFydCIsICJidXMiLCAwLCAxLCAxMCk7Ci0JY2xwczcxMXhfY2xrLT5jbGtzW0NMUFM3MTFYX0NMS19USUNLXSA9Ci0JCWNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJ0aWNrIiwgTlVMTCwgMCwgNjQpOworCWNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19VQVJUXSA9CisJCWNsa19od19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgInVhcnQiLCAiYnVzIiwgMCwgMSwgMTApOworCWNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19USUNLXSA9CisJCWNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJ0aWNrIiwgTlVMTCwgMCwgNjQpOwogCWZvciAoaSA9IDA7IGkgPCBDTFBTNzExWF9DTEtfTUFYOyBpKyspCi0JCWlmIChJU19FUlIoY2xwczcxMXhfY2xrLT5jbGtzW2ldKSkKKwkJaWYgKElTX0VSUihjbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tpXSkpCiAJCQlwcl9lcnIoImNsayAlaTogcmVnaXN0ZXIgZmFpbGVkIHdpdGggJWxkXG4iLAotCQkJICAgICAgIGksIFBUUl9FUlIoY2xwczcxMXhfY2xrLT5jbGtzW2ldKSk7CisJCQkgICAgICAgaSwgUFRSX0VSUihjbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tpXSkpOwogCiAJcmV0dXJuIGNscHM3MTF4X2NsazsKIH0KQEAgLTE1MywxNyArMTU0LDE3IEBACiAJQlVHX09OKElTX0VSUihjbHBzNzExeF9jbGspKTsKIAogCS8qIENsb2Nrc291cmNlICovCi0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbHBzNzExeF9jbGstPmNsa3NbQ0xQUzcxMVhfQ0xLX1RJTUVSMV0sCisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihjbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfVElNRVIxXSwKIAkJCSAgICBOVUxMLCAiY2xwczcxMXgtdGltZXIuMCIpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xwczcxMXhfY2xrLT5jbGtzW0NMUFM3MTFYX0NMS19USU1FUjJdLAorCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3NbQ0xQUzcxMVhfQ0xLX1RJTUVSMl0sCiAJCQkgICAgTlVMTCwgImNscHM3MTF4LXRpbWVyLjEiKTsKIAogCS8qIERyaXZlcnMgKi8KLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfUFdNXSwKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19QV01dLAogCQkJICAgIE5VTEwsICJjbHBzNzExeC1wd20iKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfVUFSVF0sCisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihjbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfVUFSVF0sCiAJCQkgICAgTlVMTCwgImNscHM3MTF4LXVhcnQuMCIpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xwczcxMXhfY2xrLT5jbGtzW0NMUFM3MTFYX0NMS19VQVJUXSwKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19VQVJUXSwKIAkJCSAgICBOVUxMLCAiY2xwczcxMXgtdWFydC4xIik7CiB9CiAKQEAgLTE3OSwxMCArMTgwLDkgQEAKIAljbHBzNzExeF9jbGsgPSBfY2xwczcxMXhfY2xrX2luaXQoYmFzZSwgZnJlZik7CiAJQlVHX09OKElTX0VSUihjbHBzNzExeF9jbGspKTsKIAotCWNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuY2xrcyA9IGNscHM3MTF4X2Nsay0+Y2xrczsKLQljbHBzNzExeF9jbGstPmNsa19kYXRhLmNsa19udW0gPSBDTFBTNzExWF9DTEtfTUFYOwotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsCi0JCQkgICAgJmNscHM3MTF4X2Nsay0+Y2xrX2RhdGEpOworCWNscHM3MTF4X2Nsay0+Y2xrX2RhdGEubnVtID0gQ0xQUzcxMVhfQ0xLX01BWDsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfb25lY2VsbF9nZXQsCisJCQkgICAgICAgJmNscHM3MTF4X2Nsay0+Y2xrX2RhdGEpOwogfQogQ0xLX09GX0RFQ0xBUkUoY2xwczcxMXgsICJjaXJydXMsZXA3MjA5LWNsayIsIGNscHM3MTF4X2Nsa19pbml0X2R0KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLWNzMjAwMC1jcC5jIGIvZHJpdmVycy9jbGsvY2xrLWNzMjAwMC1jcC5jCmluZGV4IDczNzlkZTguLjAyMWYzZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1jczIwMDAtY3AuYworKysgYi9kcml2ZXJzL2Nsay9jbGstY3MyMDAwLWNwLmMKQEAgLTU5LDcgKzU5LDYgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBjbGsgKmNsa19pbjsKIAlzdHJ1Y3QgY2xrICpyZWZfY2xrOwotCXN0cnVjdCBjbGsgKmNsa19vdXQ7CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjczIwMDBfb2ZfbWF0Y2hbXSA9IHsKQEAgLTM3MSw3ICszNzAsNiBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKIAljb25zdCBjaGFyICpuYW1lID0gbnAtPm5hbWU7Ci0Jc3RydWN0IGNsayAqY2xrOwogCXN0YXRpYyBjb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbQ0xLX01BWF07CiAJaW50IGNoID0gMDsgLyogaXQgdXNlcyBjaDAgb25seSBhdCB0aGlzIHBvaW50ICovCiAJaW50IHJhdGU7CkBAIC00MDAsMTggKzM5OCwxNiBAQAogCiAJcHJpdi0+aHcuaW5pdCA9ICZpbml0OwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKGRldiwgJnByaXYtPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpCi0JCXJldHVybiBQVFJfRVJSKGNsayk7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKGRldiwgJnByaXYtPmh3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCXJldCA9IG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCAmcHJpdi0+aHcpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWNsa191bnJlZ2lzdGVyKGNsayk7CisJCWNsa19od191bnJlZ2lzdGVyKCZwcml2LT5odyk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JcHJpdi0+Y2xrX291dCA9IGNsazsKLQogCXJldHVybiAwOwogfQogCkBAIC00NTQsNyArNDUwLDcgQEAKIAogCW9mX2Nsa19kZWxfcHJvdmlkZXIobnApOwogCi0JY2xrX3VucmVnaXN0ZXIocHJpdi0+Y2xrX291dCk7CisJY2xrX2h3X3VucmVnaXN0ZXIoJnByaXYtPmh3KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLWRpdmlkZXIuYyBiL2RyaXZlcnMvY2xrL2Nsay1kaXZpZGVyLmMKaW5kZXggYTBmNTViYy4uOTYzODZmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLWRpdmlkZXIuYworKysgYi9kcml2ZXJzL2Nsay9jbGstZGl2aWRlci5jCkBAIC0zNTIsNyArMzUyLDcgQEAKIAogCS8qIGlmIHJlYWQgb25seSwganVzdCByZXR1cm4gY3VycmVudCB2YWx1ZSAqLwogCWlmIChkaXZpZGVyLT5mbGFncyAmIENMS19ESVZJREVSX1JFQURfT05MWSkgewotCQliZXN0ZGl2ID0gcmVhZGwoZGl2aWRlci0+cmVnKSA+PiBkaXZpZGVyLT5zaGlmdDsKKwkJYmVzdGRpdiA9IGNsa19yZWFkbChkaXZpZGVyLT5yZWcpID4+IGRpdmlkZXItPnNoaWZ0OwogCQliZXN0ZGl2ICY9IGRpdl9tYXNrKGRpdmlkZXItPndpZHRoKTsKIAkJYmVzdGRpdiA9IF9nZXRfZGl2KGRpdmlkZXItPnRhYmxlLCBiZXN0ZGl2LCBkaXZpZGVyLT5mbGFncywKIAkJCWRpdmlkZXItPndpZHRoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1lZm0zMmdnLmMgYi9kcml2ZXJzL2Nsay9jbGstZWZtMzJnZy5jCmluZGV4IDIyZTRjNjUuLjg4MDJhMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1lZm0zMmdnLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLWVmbTMyZ2cuYwpAQCAtMTAsMjQgKzEwLDMxIEBACiAjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svZWZtMzItY211Lmg+CiAKICNkZWZpbmUgQ01VX0hGUEVSQ0xLRU4wCQkweDQ0CisjZGVmaW5lIENNVV9NQVhfQ0xLUwkJMzcKIAotc3RhdGljIHN0cnVjdCBjbGsgKmNsa1szN107Ci1zdGF0aWMgc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgY2xrX2RhdGEgPSB7Ci0JLmNsa3MgPSBjbGssCi0JLmNsa19udW0gPSBBUlJBWV9TSVpFKGNsayksCi19Oworc3RhdGljIHN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhICpjbGtfZGF0YTsKIAogc3RhdGljIHZvaWQgX19pbml0IGVmbTMyZ2dfY211X2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAlpbnQgaTsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IGNsa19odyAqKmh3czsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsayk7ICsraSkKLQkJY2xrW2ldID0gRVJSX1BUUigtRU5PRU5UKTsKKwljbGtfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpjbGtfZGF0YSkgKworCQkJICAgc2l6ZW9mKCpjbGtfZGF0YS0+aHdzKSAqIENNVV9NQVhfQ0xLUywgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWNsa19kYXRhKQorCQlyZXR1cm47CisKKwlod3MgPSBjbGtfZGF0YS0+aHdzOworCisJZm9yIChpID0gMDsgaSA8IENNVV9NQVhfQ0xLUzsgKytpKQorCQlod3NbaV0gPSBFUlJfUFRSKC1FTk9FTlQpOwogCiAJYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKIAlpZiAoIWJhc2UpIHsKQEAgLTM1LDQ2ICs0Miw0NiBAQAogCQlyZXR1cm47CiAJfQogCi0JY2xrW2Nsa19IRlhPXSA9IGNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJIRlhPIiwgTlVMTCwKLQkJCTAsIDQ4MDAwMDAwKTsKKwlod3NbY2xrX0hGWE9dID0gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgIkhGWE8iLCBOVUxMLCAwLAorCQkJCQkJICAgNDgwMDAwMDApOwogCi0JY2xrW2Nsa19IRlBFUkNMS1VTQVJUMF0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVVNBUlQwIiwKKwlod3NbY2xrX0hGUEVSQ0xLVVNBUlQwXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5VU0FSVDAiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCAwLCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLVVNBUlQxXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5VU0FSVDEiLAorCWh3c1tjbGtfSEZQRVJDTEtVU0FSVDFdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlVTQVJUMSIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDEsIDAsIE5VTEwpOwotCWNsa1tjbGtfSEZQRVJDTEtVU0FSVDJdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlVTQVJUMiIsCisJaHdzW2Nsa19IRlBFUkNMS1VTQVJUMl0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVVNBUlQyIiwKIAkJCSJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgMiwgMCwgTlVMTCk7Ci0JY2xrW2Nsa19IRlBFUkNMS1VBUlQwXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5VQVJUMCIsCisJaHdzW2Nsa19IRlBFUkNMS1VBUlQwXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5VQVJUMCIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDMsIDAsIE5VTEwpOwotCWNsa1tjbGtfSEZQRVJDTEtVQVJUMV0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVUFSVDEiLAorCWh3c1tjbGtfSEZQRVJDTEtVQVJUMV0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVUFSVDEiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCA0LCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLVElNRVIwXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5USU1FUjAiLAorCWh3c1tjbGtfSEZQRVJDTEtUSU1FUjBdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlRJTUVSMCIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDUsIDAsIE5VTEwpOwotCWNsa1tjbGtfSEZQRVJDTEtUSU1FUjFdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlRJTUVSMSIsCisJaHdzW2Nsa19IRlBFUkNMS1RJTUVSMV0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVElNRVIxIiwKIAkJCSJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgNiwgMCwgTlVMTCk7Ci0JY2xrW2Nsa19IRlBFUkNMS1RJTUVSMl0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVElNRVIyIiwKKwlod3NbY2xrX0hGUEVSQ0xLVElNRVIyXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5USU1FUjIiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCA3LCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLVElNRVIzXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5USU1FUjMiLAorCWh3c1tjbGtfSEZQRVJDTEtUSU1FUjNdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlRJTUVSMyIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDgsIDAsIE5VTEwpOwotCWNsa1tjbGtfSEZQRVJDTEtBQ01QMF0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuQUNNUDAiLAorCWh3c1tjbGtfSEZQRVJDTEtBQ01QMF0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuQUNNUDAiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCA5LCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLQUNNUDFdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLkFDTVAxIiwKKwlod3NbY2xrX0hGUEVSQ0xLQUNNUDFdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLkFDTVAxIiwKIAkJCSJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgMTAsIDAsIE5VTEwpOwotCWNsa1tjbGtfSEZQRVJDTEtJMkMwXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5JMkMwIiwKKwlod3NbY2xrX0hGUEVSQ0xLSTJDMF0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuSTJDMCIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDExLCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLSTJDMV0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuSTJDMSIsCisJaHdzW2Nsa19IRlBFUkNMS0kyQzFdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLkkyQzEiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCAxMiwgMCwgTlVMTCk7Ci0JY2xrW2Nsa19IRlBFUkNMS0dQSU9dID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLkdQSU8iLAorCWh3c1tjbGtfSEZQRVJDTEtHUElPXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5HUElPIiwKIAkJCSJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgMTMsIDAsIE5VTEwpOwotCWNsa1tjbGtfSEZQRVJDTEtWQ01QXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5WQ01QIiwKKwlod3NbY2xrX0hGUEVSQ0xLVkNNUF0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVkNNUCIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDE0LCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLUFJTXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5QUlMiLAorCWh3c1tjbGtfSEZQRVJDTEtQUlNdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlBSUyIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDE1LCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLQURDMF0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuQURDMCIsCisJaHdzW2Nsa19IRlBFUkNMS0FEQzBdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLkFEQzAiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCAxNiwgMCwgTlVMTCk7Ci0JY2xrW2Nsa19IRlBFUkNMS0RBQzBdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLkRBQzAiLAorCWh3c1tjbGtfSEZQRVJDTEtEQUMwXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5EQUMwIiwKIAkJCSJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgMTcsIDAsIE5VTEwpOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgJmNsa19kYXRhKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfb25lY2VsbF9nZXQsICZjbGtfZGF0YSk7CiB9CiBDTEtfT0ZfREVDTEFSRShlZm0zMmdnY211LCAiZWZtMzJnZyxjbXUiLCBlZm0zMmdnX2NtdV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1maXhlZC1mYWN0b3IuYyBiL2RyaXZlcnMvY2xrL2Nsay1maXhlZC1mYWN0b3IuYwppbmRleCA0ZGIzYmUyLi5hNWQ0MDJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstZml4ZWQtZmFjdG9yLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLWZpeGVkLWZhY3Rvci5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKIC8qCiAgKiBET0M6IGJhc2ljIGZpeGVkIG11bHRpcGxpZXIgYW5kIGRpdmlkZXIgY2xvY2sgdGhhdCBjYW5ub3QgZ2F0ZQpAQCAtMTQ3LDI3ICsxNDgsMjUgQEAKIAl7IC8qIFNlbnRpbmVsICovIH0sCiB9OwogCi0vKioKLSAqIG9mX2ZpeGVkX2ZhY3Rvcl9jbGtfc2V0dXAoKSAtIFNldHVwIGZ1bmN0aW9uIGZvciBzaW1wbGUgZml4ZWQgZmFjdG9yIGNsb2NrCi0gKi8KLXZvaWQgX19pbml0IG9mX2ZpeGVkX2ZhY3Rvcl9jbGtfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQorc3RhdGljIHN0cnVjdCBjbGsgKl9vZl9maXhlZF9mYWN0b3JfY2xrX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJY29uc3QgY2hhciAqY2xrX25hbWUgPSBub2RlLT5uYW1lOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCXUzMiBkaXYsIG11bHQ7CisJaW50IHJldDsKIAogCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAiY2xvY2stZGl2IiwgJmRpdikpIHsKIAkJcHJfZXJyKCIlcyBGaXhlZCBmYWN0b3IgY2xvY2sgPCVzPiBtdXN0IGhhdmUgYSBjbG9jay1kaXYgcHJvcGVydHlcbiIsCiAJCQlfX2Z1bmNfXywgbm9kZS0+bmFtZSk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CiAJfQogCiAJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJjbG9jay1tdWx0IiwgJm11bHQpKSB7CiAJCXByX2VycigiJXMgRml4ZWQgZmFjdG9yIGNsb2NrIDwlcz4gbXVzdCBoYXZlIGEgY2xvY2stbXVsdCBwcm9wZXJ0eVxuIiwKIAkJCV9fZnVuY19fLCBub2RlLT5uYW1lKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAl9CiAKIAlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhub2RlLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwgJmNsa19uYW1lKTsKQEAgLTE3OCwxMCArMTc3LDY3IEBACiAKIAljbGsgPSBjbGtfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsIGNsa19uYW1lLCBwYXJlbnRfbmFtZSwgZmxhZ3MsCiAJCQkJCW11bHQsIGRpdik7Ci0JaWYgKCFJU19FUlIoY2xrKSkKLQkJb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJaWYgKElTX0VSUihjbGspKQorCQlyZXR1cm4gY2xrOworCisJcmV0ID0gb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJaWYgKHJldCkgeworCQljbGtfdW5yZWdpc3RlcihjbGspOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCXJldHVybiBjbGs7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChvZl9maXhlZF9mYWN0b3JfY2xrX3NldHVwKTsKKworLyoqCisgKiBvZl9maXhlZF9mYWN0b3JfY2xrX3NldHVwKCkgLSBTZXR1cCBmdW5jdGlvbiBmb3Igc2ltcGxlIGZpeGVkIGZhY3RvciBjbG9jaworICovCit2b2lkIF9faW5pdCBvZl9maXhlZF9mYWN0b3JfY2xrX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlfb2ZfZml4ZWRfZmFjdG9yX2Nsa19zZXR1cChub2RlKTsKK30KIENMS19PRl9ERUNMQVJFKGZpeGVkX2ZhY3Rvcl9jbGssICJmaXhlZC1mYWN0b3ItY2xvY2siLAogCQlvZl9maXhlZF9mYWN0b3JfY2xrX3NldHVwKTsKKworc3RhdGljIGludCBvZl9maXhlZF9mYWN0b3JfY2xrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBjbGsgKmNsayA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJY2xrX3VucmVnaXN0ZXJfZml4ZWRfZmFjdG9yKGNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvZl9maXhlZF9mYWN0b3JfY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNsayAqY2xrOworCisJLyoKKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBleGVjdXRlZCB3aGVuIG9mX2ZpeGVkX2ZhY3Rvcl9jbGtfc2V0dXAKKwkgKiBzdWNjZWVkZWQuCisJICovCisJY2xrID0gX29mX2ZpeGVkX2ZhY3Rvcl9jbGtfc2V0dXAocGRldi0+ZGV2Lm9mX25vZGUpOworCWlmIChJU19FUlIoY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfZml4ZWRfZmFjdG9yX2Nsa19pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZpeGVkLWZhY3Rvci1jbG9jayIgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9maXhlZF9mYWN0b3JfY2xrX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9mX2ZpeGVkX2ZhY3Rvcl9jbGtfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm9mX2ZpeGVkX2ZhY3Rvcl9jbGsiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9maXhlZF9mYWN0b3JfY2xrX2lkcywKKwl9LAorCS5wcm9iZSA9IG9mX2ZpeGVkX2ZhY3Rvcl9jbGtfcHJvYmUsCisJLnJlbW92ZSA9IG9mX2ZpeGVkX2ZhY3Rvcl9jbGtfcmVtb3ZlLAorfTsKK2J1aWx0aW5fcGxhdGZvcm1fZHJpdmVyKG9mX2ZpeGVkX2ZhY3Rvcl9jbGtfZHJpdmVyKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLWZpeGVkLXJhdGUuYyBiL2RyaXZlcnMvY2xrL2Nsay1maXhlZC1yYXRlLmMKaW5kZXggMmVkYjM5My4uYjVjNDZiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLWZpeGVkLXJhdGUuYworKysgYi9kcml2ZXJzL2Nsay9jbGstZml4ZWQtcmF0ZS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAvKgogICogRE9DOiBiYXNpYyBmaXhlZC1yYXRlIGNsb2NrIHRoYXQgY2Fubm90IGdhdGUKQEAgLTE1NywxOCArMTU4LDE2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChjbGtfaHdfdW5yZWdpc3Rlcl9maXhlZF9yYXRlKTsKIAogI2lmZGVmIENPTkZJR19PRgotLyoqCi0gKiBvZl9maXhlZF9jbGtfc2V0dXAoKSAtIFNldHVwIGZ1bmN0aW9uIGZvciBzaW1wbGUgZml4ZWQgcmF0ZSBjbG9jawotICovCi12b2lkIG9mX2ZpeGVkX2Nsa19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCitzdGF0aWMgc3RydWN0IGNsayAqX29mX2ZpeGVkX2Nsa19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCiB7CiAJc3RydWN0IGNsayAqY2xrOwogCWNvbnN0IGNoYXIgKmNsa19uYW1lID0gbm9kZS0+bmFtZTsKIAl1MzIgcmF0ZTsKIAl1MzIgYWNjdXJhY3kgPSAwOworCWludCByZXQ7CiAKIAlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgImNsb2NrLWZyZXF1ZW5jeSIsICZyYXRlKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAogCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJjbG9jay1hY2N1cmFjeSIsICZhY2N1cmFjeSk7CiAKQEAgLTE3Niw5ICsxNzUsNjYgQEAKIAogCWNsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9yYXRlX3dpdGhfYWNjdXJhY3koTlVMTCwgY2xrX25hbWUsIE5VTEwsCiAJCQkJCQkgICAgMCwgcmF0ZSwgYWNjdXJhY3kpOwotCWlmICghSVNfRVJSKGNsaykpCi0JCW9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCWlmIChJU19FUlIoY2xrKSkKKwkJcmV0dXJuIGNsazsKKworCXJldCA9IG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCWlmIChyZXQpIHsKKwkJY2xrX3VucmVnaXN0ZXIoY2xrKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwlyZXR1cm4gY2xrOwogfQotRVhQT1JUX1NZTUJPTF9HUEwob2ZfZml4ZWRfY2xrX3NldHVwKTsKKworLyoqCisgKiBvZl9maXhlZF9jbGtfc2V0dXAoKSAtIFNldHVwIGZ1bmN0aW9uIGZvciBzaW1wbGUgZml4ZWQgcmF0ZSBjbG9jaworICovCit2b2lkIF9faW5pdCBvZl9maXhlZF9jbGtfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCV9vZl9maXhlZF9jbGtfc2V0dXAobm9kZSk7Cit9CiBDTEtfT0ZfREVDTEFSRShmaXhlZF9jbGssICJmaXhlZC1jbG9jayIsIG9mX2ZpeGVkX2Nsa19zZXR1cCk7CisKK3N0YXRpYyBpbnQgb2ZfZml4ZWRfY2xrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBjbGsgKmNsayA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJY2xrX3VucmVnaXN0ZXJfZml4ZWRfcmF0ZShjbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2ZfZml4ZWRfY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNsayAqY2xrOworCisJLyoKKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBleGVjdXRlZCB3aGVuIG9mX2ZpeGVkX2Nsa19zZXR1cAorCSAqIHN1Y2NlZWRlZC4KKwkgKi8KKwljbGsgPSBfb2ZfZml4ZWRfY2xrX3NldHVwKHBkZXYtPmRldi5vZl9ub2RlKTsKKwlpZiAoSVNfRVJSKGNsaykpCisJCXJldHVybiBQVFJfRVJSKGNsayk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2ZpeGVkX2Nsa19pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZpeGVkLWNsb2NrIiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9mX2ZpeGVkX2Nsa19pZHMpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvZl9maXhlZF9jbGtfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm9mX2ZpeGVkX2NsayIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX2ZpeGVkX2Nsa19pZHMsCisJfSwKKwkucHJvYmUgPSBvZl9maXhlZF9jbGtfcHJvYmUsCisJLnJlbW92ZSA9IG9mX2ZpeGVkX2Nsa19yZW1vdmUsCit9OworYnVpbHRpbl9wbGF0Zm9ybV9kcml2ZXIob2ZfZml4ZWRfY2xrX2RyaXZlcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1sczF4LmMgYi9kcml2ZXJzL2Nsay9jbGstbHMxeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk3ODMxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2xrL2Nsay1sczF4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMiBaaGFuZywgS2VndWFuZyA8a2VndWFuZy56aGFuZ0BnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY2xrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0KLSNpbmNsdWRlIDxsb29uZ3NvbjEuaD4KLQotI2RlZmluZSBPU0MJCSgzMyAqIDEwMDAwMDApCi0jZGVmaW5lIERJVl9BUEIJCTIKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhfbG9jayk7Ci0KLXN0YXRpYyBpbnQgbHMxeF9wbGxfY2xrX2VuYWJsZShzdHJ1Y3QgY2xrX2h3ICpodykKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbHMxeF9wbGxfY2xrX2Rpc2FibGUoc3RydWN0IGNsa19odyAqaHcpCi17Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxzMXhfcGxsX3JlY2FsY19yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAotCQkJCQkgIHVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCi17Ci0JdTMyIHBsbCwgcmF0ZTsKLQotCXBsbCA9IF9fcmF3X3JlYWRsKExTMVhfQ0xLX1BMTF9GUkVRKTsKLQlyYXRlID0gMTIgKyAocGxsICYgMHgzZikgKyAoKChwbGwgPj4gOCkgJiAweDNmZikgPj4gMTApOwotCXJhdGUgKj0gT1NDOwotCXJhdGUgPj49IDE7Ci0KLQlyZXR1cm4gcmF0ZTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIGxzMXhfcGxsX2Nsa19vcHMgPSB7Ci0JLmVuYWJsZSA9IGxzMXhfcGxsX2Nsa19lbmFibGUsCi0JLmRpc2FibGUgPSBsczF4X3BsbF9jbGtfZGlzYWJsZSwKLQkucmVjYWxjX3JhdGUgPSBsczF4X3BsbF9yZWNhbGNfcmF0ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpfX2luaXQgY2xrX3JlZ2lzdGVyX3BsbChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLAotCQkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCBjbGtfaHcgKmh3OwotCXN0cnVjdCBjbGsgKmNsazsKLQlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwotCi0JLyogYWxsb2NhdGUgdGhlIGRpdmlkZXIgKi8KLQlodyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbGtfaHcpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWh3KSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBjbGtfaHdcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JfQotCi0JaW5pdC5uYW1lID0gbmFtZTsKLQlpbml0Lm9wcyA9ICZsczF4X3BsbF9jbGtfb3BzOwotCWluaXQuZmxhZ3MgPSBmbGFncyB8IENMS19JU19CQVNJQzsKLQlpbml0LnBhcmVudF9uYW1lcyA9IChwYXJlbnRfbmFtZSA/ICZwYXJlbnRfbmFtZSA6IE5VTEwpOwotCWluaXQubnVtX3BhcmVudHMgPSAocGFyZW50X25hbWUgPyAxIDogMCk7Ci0JaHctPmluaXQgPSAmaW5pdDsKLQotCS8qIHJlZ2lzdGVyIHRoZSBjbG9jayAqLwotCWNsayA9IGNsa19yZWdpc3RlcihkZXYsIGh3KTsKLQotCWlmIChJU19FUlIoY2xrKSkKLQkJa2ZyZWUoaHcpOwotCi0JcmV0dXJuIGNsazsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjcHVfcGFyZW50c1tdID0geyAiY3B1X2Nsa19kaXYiLCAib3NjXzMzbV9jbGsiLCB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhaGJfcGFyZW50c1tdID0geyAiYWhiX2Nsa19kaXYiLCAib3NjXzMzbV9jbGsiLCB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkY19wYXJlbnRzW10gPSB7ICJkY19jbGtfZGl2IiwgIm9zY18zM21fY2xrIiwgfTsKLQotdm9pZCBfX2luaXQgbHMxeF9jbGtfaW5pdCh2b2lkKQotewotCXN0cnVjdCBjbGsgKmNsazsKLQotCWNsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJvc2NfMzNtX2NsayIsIE5VTEwsIDAsIE9TQyk7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssICJvc2NfMzNtX2NsayIsIE5VTEwpOwotCi0JLyogY2xvY2sgZGVyaXZlZCBmcm9tIDMzIE1IeiBPU0MgY2xrICovCi0JY2xrID0gY2xrX3JlZ2lzdGVyX3BsbChOVUxMLCAicGxsX2NsayIsICJvc2NfMzNtX2NsayIsIDApOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCAicGxsX2NsayIsIE5VTEwpOwotCi0JLyogY2xvY2sgZGVyaXZlZCBmcm9tIFBMTCBjbGsgKi8KLQkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fCi0JICogICAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX3wgICAgIHwKLQkgKiBPU0MgX19fLyAgICAgICAgICAgICAgICAgICAgICAgfCBNVVggfF9fXyBDUFUgQ0xLCi0JICogICAgICAgIFxfX18gUExMIF9fXyBDUFUgRElWIF9fX3wgICAgIHwKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19ffAotCSAqLwotCWNsayA9IGNsa19yZWdpc3Rlcl9kaXZpZGVyKE5VTEwsICJjcHVfY2xrX2RpdiIsICJwbGxfY2xrIiwKLQkJCQkgICBDTEtfR0VUX1JBVEVfTk9DQUNIRSwgTFMxWF9DTEtfUExMX0RJViwKLQkJCQkgICBESVZfQ1BVX1NISUZULCBESVZfQ1BVX1dJRFRILAotCQkJCSAgIENMS19ESVZJREVSX09ORV9CQVNFRCB8Ci0JCQkJICAgQ0xLX0RJVklERVJfUk9VTkRfQ0xPU0VTVCwgJl9sb2NrKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgImNwdV9jbGtfZGl2IiwgTlVMTCk7Ci0JY2xrID0gY2xrX3JlZ2lzdGVyX211eChOVUxMLCAiY3B1X2NsayIsIGNwdV9wYXJlbnRzLAotCQkJICAgICAgIEFSUkFZX1NJWkUoY3B1X3BhcmVudHMpLAotCQkJICAgICAgIENMS19TRVRfUkFURV9OT19SRVBBUkVOVCwgTFMxWF9DTEtfUExMX0RJViwKLQkJCSAgICAgICBCWVBBU1NfQ1BVX1NISUZULCBCWVBBU1NfQ1BVX1dJRFRILCAwLCAmX2xvY2spOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCAiY3B1X2NsayIsIE5VTEwpOwotCi0JLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fXwotCSAqICAgICAgICAgX19fX19fX19fX19fX19fX19fX19fX198ICAgICB8Ci0JICogT1NDIF9fXy8gICAgICAgICAgICAgICAgICAgICAgIHwgTVVYIHxfX18gREMgIENMSwotCSAqICAgICAgICBcX19fIFBMTCBfX18gREMgIERJViBfX198ICAgICB8Ci0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wKLQkgKi8KLQljbGsgPSBjbGtfcmVnaXN0ZXJfZGl2aWRlcihOVUxMLCAiZGNfY2xrX2RpdiIsICJwbGxfY2xrIiwKLQkJCQkgICAwLCBMUzFYX0NMS19QTExfRElWLCBESVZfRENfU0hJRlQsCi0JCQkJICAgRElWX0RDX1dJRFRILCBDTEtfRElWSURFUl9PTkVfQkFTRUQsICZfbG9jayk7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssICJkY19jbGtfZGl2IiwgTlVMTCk7Ci0JY2xrID0gY2xrX3JlZ2lzdGVyX211eChOVUxMLCAiZGNfY2xrIiwgZGNfcGFyZW50cywKLQkJCSAgICAgICBBUlJBWV9TSVpFKGRjX3BhcmVudHMpLAotCQkJICAgICAgIENMS19TRVRfUkFURV9OT19SRVBBUkVOVCwgTFMxWF9DTEtfUExMX0RJViwKLQkJCSAgICAgICBCWVBBU1NfRENfU0hJRlQsIEJZUEFTU19EQ19XSURUSCwgMCwgJl9sb2NrKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgImRjX2NsayIsIE5VTEwpOwotCi0JLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fXwotCSAqICAgICAgICAgX19fX19fX19fX19fX19fX19fX19fX198ICAgICB8Ci0JICogT1NDIF9fXy8gICAgICAgICAgICAgICAgICAgICAgIHwgTVVYIHxfX18gRERSIENMSwotCSAqICAgICAgICBcX19fIFBMTCBfX18gRERSIERJViBfX198ICAgICB8Ci0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wKLQkgKi8KLQljbGsgPSBjbGtfcmVnaXN0ZXJfZGl2aWRlcihOVUxMLCAiYWhiX2Nsa19kaXYiLCAicGxsX2NsayIsCi0JCQkJICAgMCwgTFMxWF9DTEtfUExMX0RJViwgRElWX0REUl9TSElGVCwKLQkJCQkgICBESVZfRERSX1dJRFRILCBDTEtfRElWSURFUl9PTkVfQkFTRUQsCi0JCQkJICAgJl9sb2NrKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgImFoYl9jbGtfZGl2IiwgTlVMTCk7Ci0JY2xrID0gY2xrX3JlZ2lzdGVyX211eChOVUxMLCAiYWhiX2NsayIsIGFoYl9wYXJlbnRzLAotCQkJICAgICAgIEFSUkFZX1NJWkUoYWhiX3BhcmVudHMpLAotCQkJICAgICAgIENMS19TRVRfUkFURV9OT19SRVBBUkVOVCwgTFMxWF9DTEtfUExMX0RJViwKLQkJCSAgICAgICBCWVBBU1NfRERSX1NISUZULCBCWVBBU1NfRERSX1dJRFRILCAwLCAmX2xvY2spOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCAiYWhiX2NsayIsIE5VTEwpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCAic3RtbWFjZXRoIiwgTlVMTCk7Ci0KLQkvKiBjbG9jayBkZXJpdmVkIGZyb20gQUhCIGNsayAqLwotCS8qIEFQQiBjbGsgaXMgYWx3YXlzIGhhbGYgb2YgdGhlIEFIQiBjbGsgKi8KLQljbGsgPSBjbGtfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsICJhcGJfY2xrIiwgImFoYl9jbGsiLCAwLCAxLAotCQkJCQlESVZfQVBCKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgImFwYl9jbGsiLCBOVUxMKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgImxzMXhfaTJjIiwgTlVMTCk7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssICJsczF4X3B3bXRpbWVyIiwgTlVMTCk7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssICJsczF4X3NwaSIsIE5VTEwpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCAibHMxeF93ZHQiLCBOVUxMKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgInNlcmlhbDgyNTAiLCBOVUxMKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1tYXgtZ2VuLmMgYi9kcml2ZXJzL2Nsay9jbGstbWF4LWdlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWFmOWNiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2xrL2Nsay1tYXgtZ2VuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoKLSAqIGNsay1tYXgtZ2VuLmMgLSBHZW5lcmljIGNsb2NrIGRyaXZlciBmb3IgTWF4aW0gUE1JQ3MgY2xvY2tzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDE0IEdvb2dsZSwgSW5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Rvcm5pY3MKLSAqIEpvbmdod2EgTGVlIDxqb25naHdhMy5sZWVAc2Ftc3VuZy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIGNsay1tYXg3NzY4Ni5jCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgotCi0jaW5jbHVkZSAiY2xrLW1heC1nZW4uaCIKLQotc3RydWN0IG1heF9nZW5fY2xrIHsKLQlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7Ci0JdTMyIG1hc2s7Ci0JdTMyIHJlZzsKLQlzdHJ1Y3QgY2xrX2h3IGh3OwotfTsKLQotc3RhdGljIHN0cnVjdCBtYXhfZ2VuX2NsayAqdG9fbWF4X2dlbl9jbGsoc3RydWN0IGNsa19odyAqaHcpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihodywgc3RydWN0IG1heF9nZW5fY2xrLCBodyk7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4X2dlbl9jbGtfcHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKLXsKLQlzdHJ1Y3QgbWF4X2dlbl9jbGsgKm1heF9nZW4gPSB0b19tYXhfZ2VuX2Nsayhodyk7Ci0KLQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKG1heF9nZW4tPnJlZ21hcCwgbWF4X2dlbi0+cmVnLAotCQkJCSAgbWF4X2dlbi0+bWFzaywgbWF4X2dlbi0+bWFzayk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1heF9nZW5fY2xrX3VucHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKLXsKLQlzdHJ1Y3QgbWF4X2dlbl9jbGsgKm1heF9nZW4gPSB0b19tYXhfZ2VuX2Nsayhodyk7Ci0KLQlyZWdtYXBfdXBkYXRlX2JpdHMobWF4X2dlbi0+cmVnbWFwLCBtYXhfZ2VuLT5yZWcsCi0JCQkgICBtYXhfZ2VuLT5tYXNrLCB+bWF4X2dlbi0+bWFzayk7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4X2dlbl9jbGtfaXNfcHJlcGFyZWQoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IG1heF9nZW5fY2xrICptYXhfZ2VuID0gdG9fbWF4X2dlbl9jbGsoaHcpOwotCWludCByZXQ7Ci0JdTMyIHZhbDsKLQotCXJldCA9IHJlZ21hcF9yZWFkKG1heF9nZW4tPnJlZ21hcCwgbWF4X2dlbi0+cmVnLCAmdmFsKTsKLQotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiB2YWwgJiBtYXhfZ2VuLT5tYXNrOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhfZ2VuX3JlY2FsY19yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAotCQkJCQkgdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKLXsKLQlyZXR1cm4gMzI3Njg7Ci19Ci0KLXN0cnVjdCBjbGtfb3BzIG1heF9nZW5fY2xrX29wcyA9IHsKLQkucHJlcGFyZQk9IG1heF9nZW5fY2xrX3ByZXBhcmUsCi0JLnVucHJlcGFyZQk9IG1heF9nZW5fY2xrX3VucHJlcGFyZSwKLQkuaXNfcHJlcGFyZWQJPSBtYXhfZ2VuX2Nsa19pc19wcmVwYXJlZCwKLQkucmVjYWxjX3JhdGUJPSBtYXhfZ2VuX3JlY2FsY19yYXRlLAotfTsKLUVYUE9SVF9TWU1CT0xfR1BMKG1heF9nZW5fY2xrX29wcyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICptYXhfZ2VuX2Nsa19yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBtYXhfZ2VuX2NsayAqbWF4X2dlbikKLXsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0Jc3RydWN0IGNsa19odyAqaHcgPSAmbWF4X2dlbi0+aHc7Ci0JaW50IHJldDsKLQotCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKGRldiwgaHcpOwotCWlmIChJU19FUlIoY2xrKSkKLQkJcmV0dXJuIGNsazsKLQotCXJldCA9IGNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCBody0+aW5pdC0+bmFtZSwgTlVMTCk7Ci0KLQlpZiAocmV0KQotCQlyZXR1cm4gRVJSX1BUUihyZXQpOwotCi0JcmV0dXJuIGNsazsKLX0KLQotaW50IG1heF9nZW5fY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKLQkJICAgICAgdTMyIHJlZywgc3RydWN0IGNsa19pbml0X2RhdGEgKmNsa3NfaW5pdCwgaW50IG51bV9pbml0KQotewotCWludCBpLCByZXQ7Ci0Jc3RydWN0IG1heF9nZW5fY2xrICptYXhfZ2VuX2Nsa3M7Ci0Jc3RydWN0IGNsayAqKmNsb2NrczsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwZGV2LT5kZXYucGFyZW50OwotCWNvbnN0IGNoYXIgKmNsa19uYW1lOwotCXN0cnVjdCBjbGtfaW5pdF9kYXRhICppbml0OwotCi0JY2xvY2tzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBjbGsgKikgKiBudW1faW5pdCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjbG9ja3MpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWF4X2dlbl9jbGtzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBtYXhfZ2VuX2NsaykKLQkJCQkgICAgKiBudW1faW5pdCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYXhfZ2VuX2Nsa3MpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9pbml0OyBpKyspIHsKLQkJbWF4X2dlbl9jbGtzW2ldLnJlZ21hcCA9IHJlZ21hcDsKLQkJbWF4X2dlbl9jbGtzW2ldLm1hc2sgPSAxIDw8IGk7Ci0JCW1heF9nZW5fY2xrc1tpXS5yZWcgPSByZWc7Ci0KLQkJaW5pdCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaW5pdCksIEdGUF9LRVJORUwpOwotCQlpZiAoIWluaXQpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlpZiAoZGV2LT5vZl9ub2RlICYmCi0JCSAgICAhb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgoZGV2LT5vZl9ub2RlLAotCQkJCQkJICAgImNsb2NrLW91dHB1dC1uYW1lcyIsCi0JCQkJCQkgICBpLCAmY2xrX25hbWUpKQotCQkJaW5pdC0+bmFtZSA9IGNsa19uYW1lOwotCQllbHNlCi0JCQlpbml0LT5uYW1lID0gY2xrc19pbml0W2ldLm5hbWU7Ci0KLQkJaW5pdC0+b3BzID0gY2xrc19pbml0W2ldLm9wczsKLQkJaW5pdC0+ZmxhZ3MgPSBjbGtzX2luaXRbaV0uZmxhZ3M7Ci0KLQkJbWF4X2dlbl9jbGtzW2ldLmh3LmluaXQgPSBpbml0OwotCi0JCWNsb2Nrc1tpXSA9IG1heF9nZW5fY2xrX3JlZ2lzdGVyKGRldiwgJm1heF9nZW5fY2xrc1tpXSk7Ci0JCWlmIChJU19FUlIoY2xvY2tzW2ldKSkgewotCQkJcmV0ID0gUFRSX0VSUihjbG9ja3NbaV0pOwotCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgJXNcbiIsCi0JCQkJbWF4X2dlbl9jbGtzW2ldLmh3LmluaXQtPm5hbWUpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNsb2Nrcyk7Ci0KLQlpZiAoZGV2LT5vZl9ub2RlKSB7Ci0JCXN0cnVjdCBjbGtfb25lY2VsbF9kYXRhICpvZl9kYXRhOwotCi0JCW9mX2RhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKm9mX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFvZl9kYXRhKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJb2ZfZGF0YS0+Y2xrcyA9IGNsb2NrczsKLQkJb2ZfZGF0YS0+Y2xrX251bSA9IG51bV9pbml0OwotCQlyZXQgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKGRldi0+b2Zfbm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwKLQkJCQkJICBvZl9kYXRhKTsKLQotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWdpc3RlciBPRiBjbG9jayBwcm92aWRlclxuIik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChtYXhfZ2VuX2Nsa19wcm9iZSk7Ci0KLWludCBtYXhfZ2VuX2Nsa19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IG51bV9pbml0KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBkZXYtPmRldi5wYXJlbnQ7Ci0KLQlpZiAoZGV2LT5vZl9ub2RlKQotCQlvZl9jbGtfZGVsX3Byb3ZpZGVyKGRldi0+b2Zfbm9kZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG1heF9nZW5fY2xrX3JlbW92ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstbWF4LWdlbi5oIGIvZHJpdmVycy9jbGsvY2xrLW1heC1nZW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3ZTg2Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2Nsay9jbGstbWF4LWdlbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIGNsay1tYXgtZ2VuLmggLSBHZW5lcmljIGNsb2NrIGRyaXZlciBmb3IgTWF4aW0gUE1JQ3MgY2xvY2tzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDE0IEdvb2dsZSwgSW5jCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9fQ0xLX01BWF9HRU5fSF9fCi0jZGVmaW5lIF9fQ0xLX01BWF9HRU5fSF9fCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi1pbnQgbWF4X2dlbl9jbGtfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IHJlZ21hcCAqcmVnbWFwLAotCQkgICAgICB1MzIgcmVnLCBzdHJ1Y3QgY2xrX2luaXRfZGF0YSAqY2xrc19pbml0LCBpbnQgbnVtX2luaXQpOwotaW50IG1heF9nZW5fY2xrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBpbnQgbnVtX2luaXQpOwotZXh0ZXJuIHN0cnVjdCBjbGtfb3BzIG1heF9nZW5fY2xrX29wczsKLQotI2VuZGlmIC8qIF9fQ0xLX01BWF9HRU5fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstbWF4Nzc2ODYuYyBiL2RyaXZlcnMvY2xrL2Nsay1tYXg3NzY4Ni5jCmluZGV4IDliNmYyNzcuLmI2MzdmNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1tYXg3NzY4Ni5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1tYXg3NzY4Ni5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGNsay1tYXg3NzY4Ni5jIC0gQ2xvY2sgZHJpdmVyIGZvciBNYXhpbSA3NzY4NgorICogY2xrLW1heDc3Njg2LmMgLSBDbG9jayBkcml2ZXIgZm9yIE1heGltIDc3Njg2L01BWDc3ODAyCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Rvcm5pY3MKICAqIEpvbmdod2EgTGVlIDxqb25naHdhMy5sZWVAc2Ftc3VuZy5jb20+CkBAIC0yNSw0NiArMjUsMjg0IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21heDc3NjIwLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL21heDc3Njg2Lmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL21heDc3Njg2LXByaXZhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAKICNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzY4Ni5oPgotI2luY2x1ZGUgImNsay1tYXgtZ2VuLmgiCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc4MDIuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzYyMC5oPgogCi1zdGF0aWMgc3RydWN0IGNsa19pbml0X2RhdGEgbWF4Nzc2ODZfY2xrc19pbml0W01BWDc3Njg2X0NMS1NfTlVNXSA9IHsKKyNkZWZpbmUgTUFYNzc4MDJfQ0xPQ0tfTE9XX0pJVFRFUl9TSElGVCAweDMKKworZW51bSBtYXg3NzY4Nl9jaGlwX25hbWUgeworCUNISVBfTUFYNzc2ODYsCisJQ0hJUF9NQVg3NzgwMiwKKwlDSElQX01BWDc3NjIwLAorfTsKKworc3RydWN0IG1heDc3Njg2X2h3X2Nsa19pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCXUzMiBjbGtfcmVnOworCXUzMiBjbGtfZW5hYmxlX21hc2s7CisJdTMyIGZsYWdzOworfTsKKworc3RydWN0IG1heDc3Njg2X2Nsa19pbml0X2RhdGEgeworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlzdHJ1Y3QgY2xrX2h3IGh3OworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGNsa19pZGF0YTsKKwljb25zdCBzdHJ1Y3QgbWF4Nzc2ODZfaHdfY2xrX2luZm8gKmNsa19pbmZvOworfTsKKworc3RydWN0IG1heDc3Njg2X2Nsa19kcml2ZXJfZGF0YSB7CisJZW51bSBtYXg3NzY4Nl9jaGlwX25hbWUgY2hpcDsKKwlzdHJ1Y3QgbWF4Nzc2ODZfY2xrX2luaXRfZGF0YSAqbWF4X2Nsa19kYXRhOworCXNpemVfdCBudW1fY2xrczsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QKK21heDc3Njg2X2h3X2Nsa19pbmZvIG1heDc3Njg2X2h3X2Nsa3NfaW5mb1tNQVg3NzY4Nl9DTEtTX05VTV0gPSB7CiAJW01BWDc3Njg2X0NMS19BUF0gPSB7CiAJCS5uYW1lID0gIjMya2h6X2FwIiwKLQkJLm9wcyA9ICZtYXhfZ2VuX2Nsa19vcHMsCisJCS5jbGtfcmVnID0gTUFYNzc2ODZfUkVHXzMyS0haLAorCQkuY2xrX2VuYWJsZV9tYXNrID0gQklUKE1BWDc3Njg2X0NMS19BUCksCiAJfSwKIAlbTUFYNzc2ODZfQ0xLX0NQXSA9IHsKIAkJLm5hbWUgPSAiMzJraHpfY3AiLAotCQkub3BzID0gJm1heF9nZW5fY2xrX29wcywKKwkJLmNsa19yZWcgPSBNQVg3NzY4Nl9SRUdfMzJLSFosCisJCS5jbGtfZW5hYmxlX21hc2sgPSBCSVQoTUFYNzc2ODZfQ0xLX0NQKSwKIAl9LAogCVtNQVg3NzY4Nl9DTEtfUE1JQ10gPSB7CiAJCS5uYW1lID0gIjMya2h6X3BtaWMiLAotCQkub3BzID0gJm1heF9nZW5fY2xrX29wcywKKwkJLmNsa19yZWcgPSBNQVg3NzY4Nl9SRUdfMzJLSFosCisJCS5jbGtfZW5hYmxlX21hc2sgPSBCSVQoTUFYNzc2ODZfQ0xLX1BNSUMpLAogCX0sCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0CittYXg3NzY4Nl9od19jbGtfaW5mbyBtYXg3NzgwMl9od19jbGtzX2luZm9bTUFYNzc4MDJfQ0xLU19OVU1dID0geworCVtNQVg3NzgwMl9DTEtfMzJLX0FQXSA9IHsKKwkJLm5hbWUgPSAiMzJraHpfYXAiLAorCQkuY2xrX3JlZyA9IE1BWDc3ODAyX1JFR18zMktIWiwKKwkJLmNsa19lbmFibGVfbWFzayA9IEJJVChNQVg3NzgwMl9DTEtfMzJLX0FQKSwKKwl9LAorCVtNQVg3NzgwMl9DTEtfMzJLX0NQXSA9IHsKKwkJLm5hbWUgPSAiMzJraHpfY3AiLAorCQkuY2xrX3JlZyA9IE1BWDc3ODAyX1JFR18zMktIWiwKKwkJLmNsa19lbmFibGVfbWFzayA9IEJJVChNQVg3NzgwMl9DTEtfMzJLX0NQKSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdAorbWF4Nzc2ODZfaHdfY2xrX2luZm8gbWF4Nzc2MjBfaHdfY2xrc19pbmZvW01BWDc3NjIwX0NMS1NfTlVNXSA9IHsKKwlbTUFYNzc2MjBfQ0xLXzMyS19PVVQwXSA9IHsKKwkJLm5hbWUgPSAiMzJraHpfb3V0MCIsCisJCS5jbGtfcmVnID0gTUFYNzc2MjBfUkVHX0NORkcxXzMySywKKwkJLmNsa19lbmFibGVfbWFzayA9IE1BWDc3NjIwX0NORkcxXzMyS19PVVQwX0VOLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG1heDc3Njg2X2Nsa19pbml0X2RhdGEgKnRvX21heDc3Njg2X2Nsa19pbml0X2RhdGEoCisJCQkJc3RydWN0IGNsa19odyAqaHcpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihodywgc3RydWN0IG1heDc3Njg2X2Nsa19pbml0X2RhdGEsIGh3KTsKK30KKworc3RhdGljIGludCBtYXg3NzY4Nl9jbGtfcHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgbWF4Nzc2ODZfY2xrX2luaXRfZGF0YSAqbWF4Nzc2ODYgPSB0b19tYXg3NzY4Nl9jbGtfaW5pdF9kYXRhKGh3KTsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMobWF4Nzc2ODYtPnJlZ21hcCwgbWF4Nzc2ODYtPmNsa19pbmZvLT5jbGtfcmVnLAorCQkJCSAgbWF4Nzc2ODYtPmNsa19pbmZvLT5jbGtfZW5hYmxlX21hc2ssCisJCQkJICBtYXg3NzY4Ni0+Y2xrX2luZm8tPmNsa19lbmFibGVfbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIG1heDc3Njg2X2Nsa191bnByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IG1heDc3Njg2X2Nsa19pbml0X2RhdGEgKm1heDc3Njg2ID0gdG9fbWF4Nzc2ODZfY2xrX2luaXRfZGF0YShodyk7CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMobWF4Nzc2ODYtPnJlZ21hcCwgbWF4Nzc2ODYtPmNsa19pbmZvLT5jbGtfcmVnLAorCQkJICAgbWF4Nzc2ODYtPmNsa19pbmZvLT5jbGtfZW5hYmxlX21hc2ssCisJCQkgICB+bWF4Nzc2ODYtPmNsa19pbmZvLT5jbGtfZW5hYmxlX21hc2spOworfQorCitzdGF0aWMgaW50IG1heDc3Njg2X2Nsa19pc19wcmVwYXJlZChzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgbWF4Nzc2ODZfY2xrX2luaXRfZGF0YSAqbWF4Nzc2ODYgPSB0b19tYXg3NzY4Nl9jbGtfaW5pdF9kYXRhKGh3KTsKKwlpbnQgcmV0OworCXUzMiB2YWw7CisKKwlyZXQgPSByZWdtYXBfcmVhZChtYXg3NzY4Ni0+cmVnbWFwLCBtYXg3NzY4Ni0+Y2xrX2luZm8tPmNsa19yZWcsICZ2YWwpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHZhbCAmIG1heDc3Njg2LT5jbGtfaW5mby0+Y2xrX2VuYWJsZV9tYXNrOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtYXg3NzY4Nl9yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKKwkJCQkJICB1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKQoreworCXJldHVybiAzMjc2ODsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIG1heDc3Njg2X2Nsa19vcHMgPSB7CisJLnByZXBhcmUJPSBtYXg3NzY4Nl9jbGtfcHJlcGFyZSwKKwkudW5wcmVwYXJlCT0gbWF4Nzc2ODZfY2xrX3VucHJlcGFyZSwKKwkuaXNfcHJlcGFyZWQJPSBtYXg3NzY4Nl9jbGtfaXNfcHJlcGFyZWQsCisJLnJlY2FsY19yYXRlCT0gbWF4Nzc2ODZfcmVjYWxjX3JhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsa19odyAqCitvZl9jbGtfbWF4Nzc2ODZfZ2V0KHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmNsa3NwZWMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1heDc3Njg2X2Nsa19kcml2ZXJfZGF0YSAqZHJ2X2RhdGEgPSBkYXRhOworCXVuc2lnbmVkIGludCBpZHggPSBjbGtzcGVjLT5hcmdzWzBdOworCisJaWYgKGlkeCA+PSBkcnZfZGF0YS0+bnVtX2Nsa3MpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBpbmRleCAldVxuIiwgX19mdW5jX18sIGlkeCk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCXJldHVybiAmZHJ2X2RhdGEtPm1heF9jbGtfZGF0YVtpZHhdLmh3OworfQorCiBzdGF0aWMgaW50IG1heDc3Njg2X2Nsa19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBtYXg3NzY4Nl9kZXYgKmlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGRldmljZSAqcGFyZW50ID0gZGV2LT5wYXJlbnQ7CisJY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCAqaWQgPSBwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpOworCXN0cnVjdCBtYXg3NzY4Nl9jbGtfZHJpdmVyX2RhdGEgKmRydl9kYXRhOworCWNvbnN0IHN0cnVjdCBtYXg3NzY4Nl9od19jbGtfaW5mbyAqaHdfY2xrczsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJaW50IGksIHJldCwgbnVtX2Nsa3M7CiAKLQlyZXR1cm4gbWF4X2dlbl9jbGtfcHJvYmUocGRldiwgaW9kZXYtPnJlZ21hcCwgTUFYNzc2ODZfUkVHXzMyS0haLAotCQkJCSBtYXg3NzY4Nl9jbGtzX2luaXQsIE1BWDc3Njg2X0NMS1NfTlVNKTsKKwlkcnZfZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZHJ2X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRydl9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlZ21hcCA9IGRldl9nZXRfcmVnbWFwKHBhcmVudCwgTlVMTCk7CisJaWYgKCFyZWdtYXApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IHJ0YyByZWdtYXBcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkcnZfZGF0YS0+Y2hpcCA9IGlkLT5kcml2ZXJfZGF0YTsKKworCXN3aXRjaCAoZHJ2X2RhdGEtPmNoaXApIHsKKwljYXNlIENISVBfTUFYNzc2ODY6CisJCW51bV9jbGtzID0gTUFYNzc2ODZfQ0xLU19OVU07CisJCWh3X2Nsa3MgPSBtYXg3NzY4Nl9od19jbGtzX2luZm87CisJCWJyZWFrOworCisJY2FzZSBDSElQX01BWDc3ODAyOgorCQludW1fY2xrcyA9IE1BWDc3ODAyX0NMS1NfTlVNOworCQlod19jbGtzID0gbWF4Nzc4MDJfaHdfY2xrc19pbmZvOworCQlicmVhazsKKworCWNhc2UgQ0hJUF9NQVg3NzYyMDoKKwkJbnVtX2Nsa3MgPSBNQVg3NzYyMF9DTEtTX05VTTsKKwkJaHdfY2xrcyA9IG1heDc3NjIwX2h3X2Nsa3NfaW5mbzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIlVua25vd24gQ2hpcCBJRFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRydl9kYXRhLT5tYXhfY2xrX2RhdGEgPSBkZXZtX2tjYWxsb2MoZGV2LCBudW1fY2xrcywKKwkJCQkJICAgICAgc2l6ZW9mKCpkcnZfZGF0YS0+bWF4X2Nsa19kYXRhKSwKKwkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcnZfZGF0YS0+bWF4X2Nsa19kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY2xrczsgaSsrKSB7CisJCXN0cnVjdCBtYXg3NzY4Nl9jbGtfaW5pdF9kYXRhICptYXhfY2xrX2RhdGE7CisJCWNvbnN0IGNoYXIgKmNsa19uYW1lOworCisJCW1heF9jbGtfZGF0YSA9ICZkcnZfZGF0YS0+bWF4X2Nsa19kYXRhW2ldOworCisJCW1heF9jbGtfZGF0YS0+cmVnbWFwID0gcmVnbWFwOworCQltYXhfY2xrX2RhdGEtPmNsa19pbmZvID0gJmh3X2Nsa3NbaV07CisJCW1heF9jbGtfZGF0YS0+Y2xrX2lkYXRhLmZsYWdzID0gaHdfY2xrc1tpXS5mbGFnczsKKwkJbWF4X2Nsa19kYXRhLT5jbGtfaWRhdGEub3BzID0gJm1heDc3Njg2X2Nsa19vcHM7CisKKwkJaWYgKHBhcmVudC0+b2Zfbm9kZSAmJgorCQkgICAgIW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KHBhcmVudC0+b2Zfbm9kZSwKKwkJCQkJCSAgICJjbG9jay1vdXRwdXQtbmFtZXMiLAorCQkJCQkJICAgaSwgJmNsa19uYW1lKSkKKwkJCW1heF9jbGtfZGF0YS0+Y2xrX2lkYXRhLm5hbWUgPSBjbGtfbmFtZTsKKwkJZWxzZQorCQkJbWF4X2Nsa19kYXRhLT5jbGtfaWRhdGEubmFtZSA9IGh3X2Nsa3NbaV0ubmFtZTsKKworCQltYXhfY2xrX2RhdGEtPmh3LmluaXQgPSAmbWF4X2Nsa19kYXRhLT5jbGtfaWRhdGE7CisKKwkJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoZGV2LCAmbWF4X2Nsa19kYXRhLT5odyk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGNsb2NrIHJlZ2lzdGVyOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSBjbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KCZtYXhfY2xrX2RhdGEtPmh3LAorCQkJCQkgICAgIG1heF9jbGtfZGF0YS0+Y2xrX2lkYXRhLm5hbWUsIE5VTEwpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY2xrZGV2IHJlZ2lzdGVyOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlpZiAocGFyZW50LT5vZl9ub2RlKSB7CisJCXJldCA9IG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIocGFyZW50LT5vZl9ub2RlLCBvZl9jbGtfbWF4Nzc2ODZfZ2V0LAorCQkJCQkgICAgIGRydl9kYXRhKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgT0YgY2xvY2sgcHJvdmlkZXI6ICVkXG4iLAorCQkJCXJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJLyogTUFYNzc4MDI6IEVuYWJsZSBsb3ctaml0dGVyIG1vZGUgb24gdGhlIDMya2h6IGNsb2Nrcy4gKi8KKwlpZiAoZHJ2X2RhdGEtPmNoaXAgPT0gQ0hJUF9NQVg3NzgwMikgeworCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBNQVg3NzgwMl9SRUdfMzJLSFosCisJCQkJCSAxIDw8IE1BWDc3ODAyX0NMT0NLX0xPV19KSVRURVJfU0hJRlQsCisJCQkJCSAxIDw8IE1BWDc3ODAyX0NMT0NLX0xPV19KSVRURVJfU0hJRlQpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY29uZmlnIGxvdy1qaXR0ZXI6ICVkXG4iLCByZXQpOworCQkJZ290byByZW1vdmVfb2ZfY2xrX3Byb3ZpZGVyOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK3JlbW92ZV9vZl9jbGtfcHJvdmlkZXI6CisJaWYgKHBhcmVudC0+b2Zfbm9kZSkKKwkJb2ZfY2xrX2RlbF9wcm92aWRlcihwYXJlbnQtPm9mX25vZGUpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBtYXg3NzY4Nl9jbGtfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JcmV0dXJuIG1heF9nZW5fY2xrX3JlbW92ZShwZGV2LCBNQVg3NzY4Nl9DTEtTX05VTSk7CisJc3RydWN0IGRldmljZSAqcGFyZW50ID0gcGRldi0+ZGV2LnBhcmVudDsKKworCWlmIChwYXJlbnQtPm9mX25vZGUpCisJCW9mX2Nsa19kZWxfcHJvdmlkZXIocGFyZW50LT5vZl9ub2RlKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBtYXg3NzY4Nl9jbGtfaWRbXSA9IHsKLQl7ICJtYXg3NzY4Ni1jbGsiLCAwfSwKLQl7IH0sCisJeyAibWF4Nzc2ODYtY2xrIiwgLmRyaXZlcl9kYXRhID0gQ0hJUF9NQVg3NzY4NiwgfSwKKwl7ICJtYXg3NzgwMi1jbGsiLCAuZHJpdmVyX2RhdGEgPSBDSElQX01BWDc3ODAyLCB9LAorCXsgIm1heDc3NjIwLWNsb2NrIiwgLmRyaXZlcl9kYXRhID0gQ0hJUF9NQVg3NzYyMCwgfSwKKwl7fSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBtYXg3NzY4Nl9jbGtfaWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstbWF4Nzc4MDIuYyBiL2RyaXZlcnMvY2xrL2Nsay1tYXg3NzgwMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTVkZDJlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2xrL2Nsay1tYXg3NzgwMi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIGNsay1tYXg3NzgwMi5jIC0gQ2xvY2sgZHJpdmVyIGZvciBNYXhpbSA3NzgwMgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBHb29nbGUsIEluYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0b3JuaWNzCi0gKiBKb25naHdhIExlZSA8am9uZ2h3YTMubGVlQHNhbXN1bmcuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiBjbGstbWF4Nzc2ODYuYwotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL21heDc3Njg2LXByaXZhdGUuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgotCi0jaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc4MDIuaD4KLSNpbmNsdWRlICJjbGstbWF4LWdlbi5oIgotCi0jZGVmaW5lIE1BWDc3ODAyX0NMT0NLX09QTU9ERV9NQVNLCTB4MQotI2RlZmluZSBNQVg3NzgwMl9DTE9DS19MT1dfSklUVEVSX1NISUZUIDB4MwotCi1zdGF0aWMgc3RydWN0IGNsa19pbml0X2RhdGEgbWF4Nzc4MDJfY2xrc19pbml0W01BWDc3ODAyX0NMS1NfTlVNXSA9IHsKLQlbTUFYNzc4MDJfQ0xLXzMyS19BUF0gPSB7Ci0JCS5uYW1lID0gIjMya2h6X2FwIiwKLQkJLm9wcyA9ICZtYXhfZ2VuX2Nsa19vcHMsCi0JfSwKLQlbTUFYNzc4MDJfQ0xLXzMyS19DUF0gPSB7Ci0JCS5uYW1lID0gIjMya2h6X2NwIiwKLQkJLm9wcyA9ICZtYXhfZ2VuX2Nsa19vcHMsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgbWF4Nzc4MDJfY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG1heDc3Njg2X2RldiAqaW9kZXYgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Ci0JaW50IHJldDsKLQotCXJldCA9IG1heF9nZW5fY2xrX3Byb2JlKHBkZXYsIGlvZGV2LT5yZWdtYXAsIE1BWDc3ODAyX1JFR18zMktIWiwKLQkJCQltYXg3NzgwMl9jbGtzX2luaXQsIE1BWDc3ODAyX0NMS1NfTlVNKTsKLQotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZ2VuZXJpYyBwcm9iZSBmYWlsZWQgJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogRW5hYmxlIGxvdy1qaXR0ZXIgbW9kZSBvbiB0aGUgMzJraHogY2xvY2tzLiAqLwotCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhpb2Rldi0+cmVnbWFwLCBNQVg3NzgwMl9SRUdfMzJLSFosCi0JCQkJIDEgPDwgTUFYNzc4MDJfQ0xPQ0tfTE9XX0pJVFRFUl9TSElGVCwKLQkJCQkgMSA8PCBNQVg3NzgwMl9DTE9DS19MT1dfSklUVEVSX1NISUZUKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBsb3ctaml0dGVyIG1vZGVcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtYXg3NzgwMl9jbGtfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIG1heF9nZW5fY2xrX3JlbW92ZShwZGV2LCBNQVg3NzgwMl9DTEtTX05VTSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIG1heDc3ODAyX2Nsa19pZFtdID0gewotCXsgIm1heDc3ODAyLWNsayIsIDB9LAotCXsgfSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBtYXg3NzgwMl9jbGtfaWQpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtYXg3NzgwMl9jbGtfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lICA9ICJtYXg3NzgwMi1jbGsiLAotCX0sCi0JLnByb2JlID0gbWF4Nzc4MDJfY2xrX3Byb2JlLAotCS5yZW1vdmUgPSBtYXg3NzgwMl9jbGtfcmVtb3ZlLAotCS5pZF90YWJsZSA9IG1heDc3ODAyX2Nsa19pZCwKLX07Ci0KLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobWF4Nzc4MDJfY2xrX2RyaXZlcik7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTUFYSU0gNzc4MDIgQ2xvY2sgRHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJKYXZpZXIgTWFydGluZXogQ2FuaWxsYXMgPGphdmllckBvc2cuc2Ftc3VuZy5jb20iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1tYjg2czd4LmMgYi9kcml2ZXJzL2Nsay9jbGstbWI4NnM3eC5jCmluZGV4IGUwODE3NzUuLjJhODNhM2ZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstbWI4NnM3eC5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1tYjg2czd4LmMKQEAgLTMyNywxMCArMzI3LDExIEBACiAJLnNldF9yYXRlID0gY2xjX3NldF9yYXRlLAogfTsKIAotc3RydWN0IGNsayAqbWI4NnM3eF9jbGNsa19yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpjcHVfZGV2KQorc3RhdGljIHN0cnVjdCBjbGtfaHcgKm1iODZzN3hfY2xjbGtfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqY3B1X2RldikKIHsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwogCXN0cnVjdCBjbF9jbGsgKmNsYzsKKwlpbnQgcmV0OwogCiAJY2xjID0ga3phbGxvYyhzaXplb2YoKmNsYyksIEdGUF9LRVJORUwpOwogCWlmICghY2xjKQpAQCAtMzQ0LDE0ICszNDUsMTcgQEAKIAlpbml0LmZsYWdzID0gQ0xLX0dFVF9SQVRFX05PQ0FDSEU7CiAJaW5pdC5udW1fcGFyZW50cyA9IDA7CiAKLQlyZXR1cm4gZGV2bV9jbGtfcmVnaXN0ZXIoY3B1X2RldiwgJmNsYy0+aHcpOworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGNwdV9kZXYsICZjbGMtPmh3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCXJldHVybiAmY2xjLT5odzsKIH0KIAogc3RhdGljIGludCBtYjg2czd4X2NsY2xrX29mX2luaXQodm9pZCkKIHsKIAlpbnQgY3B1LCByZXQgPSAtRU5PREVWOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCiAJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnVqaXRzdSxtYjg2czcwLXNjYi0xLjAiKTsKIAlpZiAoIW5wIHx8ICFvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKG5wKSkKQEAgLTM2NSwxMiArMzY5LDEyIEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCWNsayA9IG1iODZzN3hfY2xjbGtfcmVnaXN0ZXIoY3B1X2Rldik7Ci0JCWlmIChJU19FUlIoY2xrKSkgeworCQlodyA9IG1iODZzN3hfY2xjbGtfcmVnaXN0ZXIoY3B1X2Rldik7CisJCWlmIChJU19FUlIoaHcpKSB7CiAJCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBjcHUlZCBjbG9ja1xuIiwgY3B1KTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWlmIChjbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgTlVMTCwgZGV2X25hbWUoY3B1X2RldikpKSB7CisJCWlmIChjbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCBOVUxMLCBkZXZfbmFtZShjcHVfZGV2KSkpIHsKIAkJCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIGNwdSVkIGNsb2NrIGxvb2t1cFxuIiwgY3B1KTsKIAkJCWNvbnRpbnVlOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstbW94YXJ0LmMgYi9kcml2ZXJzL2Nsay9jbGstbW94YXJ0LmMKaW5kZXggZjM3ZjcxOS4uYjg2ZGFjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLW1veGFydC5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1tb3hhcnQuYwpAQCAtMTksNyArMTksOCBAQAogc3RhdGljIHZvaWQgX19pbml0IG1veGFydF9vZl9wbGxfY2xrX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQogewogCXN0YXRpYyB2b2lkIF9faW9tZW0gKmJhc2U7Ci0Jc3RydWN0IGNsayAqY2xrLCAqcmVmX2NsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwlzdHJ1Y3QgY2xrICpyZWZfY2xrOwogCXVuc2lnbmVkIGludCBtdWw7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5vZGUtPm5hbWU7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CkBAIC00MiwxNCArNDMsMTQgQEAKIAkJcmV0dXJuOwogCX0KIAotCWNsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgbmFtZSwgcGFyZW50X25hbWUsIDAsIG11bCwgMSk7Ci0JaWYgKElTX0VSUihjbGspKSB7CisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsIG5hbWUsIHBhcmVudF9uYW1lLCAwLCBtdWwsIDEpOworCWlmIChJU19FUlIoaHcpKSB7CiAJCXByX2VycigiJXM6IGZhaWxlZCB0byByZWdpc3RlciBjbG9ja1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKIAkJcmV0dXJuOwogCX0KIAotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCBOVUxMLCBuYW1lKTsKLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCBOVUxMLCBuYW1lKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiB9CiBDTEtfT0ZfREVDTEFSRShtb3hhcnRfcGxsX2Nsb2NrLCAibW94YSxtb3hhcnQtcGxsLWNsb2NrIiwKIAkgICAgICAgbW94YXJ0X29mX3BsbF9jbGtfaW5pdCk7CkBAIC01Nyw3ICs1OCw4IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgbW94YXJ0X29mX2FwYl9jbGtfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCiB7CiAJc3RhdGljIHZvaWQgX19pb21lbSAqYmFzZTsKLQlzdHJ1Y3QgY2xrICpjbGssICpwbGxfY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OworCXN0cnVjdCBjbGsgKnBsbF9jbGs7CiAJdW5zaWduZWQgaW50IGRpdiwgdmFsOwogCXVuc2lnbmVkIGludCBkaXZfaWR4W10gPSB7IDIsIDMsIDQsIDYsIDh9OwogCWNvbnN0IGNoYXIgKm5hbWUgPSBub2RlLT5uYW1lOwpAQCAtODUsMTQgKzg3LDE0IEBACiAJCXJldHVybjsKIAl9CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsIG5hbWUsIHBhcmVudF9uYW1lLCAwLCAxLCBkaXYpOwotCWlmIChJU19FUlIoY2xrKSkgeworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCBuYW1lLCBwYXJlbnRfbmFtZSwgMCwgMSwgZGl2KTsKKwlpZiAoSVNfRVJSKGh3KSkgewogCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgY2xvY2tcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CiAJCXJldHVybjsKIAl9CiAKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgTlVMTCwgbmFtZSk7Ci0Jb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgTlVMTCwgbmFtZSk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihub2RlLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogfQogQ0xLX09GX0RFQ0xBUkUobW94YXJ0X2FwYl9jbG9jaywgIm1veGEsbW94YXJ0LWFwYi1jbG9jayIsCiAJICAgICAgIG1veGFydF9vZl9hcGJfY2xrX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLW5zcGlyZS5jIGIvZHJpdmVycy9jbGsvY2xrLW5zcGlyZS5jCmluZGV4IDY0ZjE5NmEuLmY4NjEwMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1uc3BpcmUuYworKysgYi9kcml2ZXJzL2Nsay9jbGstbnNwaXJlLmMKQEAgLTY5LDcgKzY5LDcgQEAKIHsKIAl1MzIgdmFsOwogCXZvaWQgX19pb21lbSAqaW87Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCWNvbnN0IGNoYXIgKmNsa19uYW1lID0gbm9kZS0+bmFtZTsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZTsKIAlzdHJ1Y3QgbnNwaXJlX2Nsa19pbmZvIGluZm87CkBAIC04NSwxMCArODUsMTAgQEAKIAlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhub2RlLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwgJmNsa19uYW1lKTsKIAlwYXJlbnRfbmFtZSA9IG9mX2Nsa19nZXRfcGFyZW50X25hbWUobm9kZSwgMCk7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsIGNsa19uYW1lLCBwYXJlbnRfbmFtZSwgMCwKLQkJCQkJMSwgaW5mby5iYXNlX2FoYl9yYXRpbyk7Ci0JaWYgKCFJU19FUlIoY2xrKSkKLQkJb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsIGNsa19uYW1lLCBwYXJlbnRfbmFtZSwgMCwKKwkJCQkJICAxLCBpbmZvLmJhc2VfYWhiX3JhdGlvKTsKKwlpZiAoIUlTX0VSUihodykpCisJCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG5zcGlyZV9haGJkaXZfc2V0dXBfY3goc3RydWN0IGRldmljZV9ub2RlICpub2RlKQpAQCAtMTExLDcgKzExMSw3IEBACiB7CiAJdTMyIHZhbDsKIAl2b2lkIF9faW9tZW0gKmlvOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAljb25zdCBjaGFyICpjbGtfbmFtZSA9IG5vZGUtPm5hbWU7CiAJc3RydWN0IG5zcGlyZV9jbGtfaW5mbyBpbmZvOwogCkBAIC0xMjUsOSArMTI1LDEwIEBACiAKIAlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhub2RlLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwgJmNsa19uYW1lKTsKIAotCWNsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsIGNsa19uYW1lLCBOVUxMLCAwLCBpbmZvLmJhc2VfY2xvY2spOwotCWlmICghSVNfRVJSKGNsaykpCi0JCW9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgY2xrX25hbWUsIE5VTEwsIDAsCisJCQkJCWluZm8uYmFzZV9jbG9jayk7CisJaWYgKCFJU19FUlIoaHcpKQorCQlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiAJZWxzZQogCQlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1wYWxtYXMuYyBiL2RyaXZlcnMvY2xrL2Nsay1wYWxtYXMuYwppbmRleCA4MzI4ODYzLi4zMWY1OTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstcGFsbWFzLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLXBhbG1hcy5jCkBAIC00MSw3ICs0MSw2IEBACiAKIHN0cnVjdCBwYWxtYXNfY2xvY2tfaW5mbyB7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBjbGsgKmNsazsKIAlzdHJ1Y3QgY2xrX2h3IGh3OwogCXN0cnVjdCBwYWxtYXMgKnBhbG1hczsKIAljb25zdCBzdHJ1Y3QgcGFsbWFzX2NsazMya19kZXNjICpjbGtfZGVzYzsKQEAgLTIxOCw3ICsyMTcsNyBAQAogCX0KIAogCWlmIChjaW5mby0+ZXh0X2NvbnRyb2xfcGluKSB7Ci0JCXJldCA9IGNsa19wcmVwYXJlKGNpbmZvLT5jbGspOworCQlyZXQgPSBjbGtfcHJlcGFyZShjaW5mby0+aHcuY2xrKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoY2luZm8tPmRldiwgIkNsb2NrIHByZXAgZmFpbGVkLCAlZFxuIiwgcmV0KTsKIAkJCXJldHVybiByZXQ7CkBAIC0yNDIsNyArMjQxLDYgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAljb25zdCBzdHJ1Y3QgcGFsbWFzX2Nsa3Nfb2ZfbWF0Y2hfZGF0YSAqbWF0Y2hfZGF0YTsKIAlzdHJ1Y3QgcGFsbWFzX2Nsb2NrX2luZm8gKmNpbmZvOwotCXN0cnVjdCBjbGsgKmNsazsKIAlpbnQgcmV0OwogCiAJbWF0Y2hfZGF0YSA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSgmcGRldi0+ZGV2KTsKQEAgLTI2MSwyMiArMjU5LDIwIEBACiAKIAljaW5mby0+Y2xrX2Rlc2MgPSAmbWF0Y2hfZGF0YS0+ZGVzYzsKIAljaW5mby0+aHcuaW5pdCA9ICZtYXRjaF9kYXRhLT5pbml0OwotCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjaW5mby0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkgewotCQlyZXQgPSBQVFJfRVJSKGNsayk7CisJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmNpbmZvLT5odyk7CisJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsIHRvIHJlZ2lzdGVyIGNsb2NrICVzLCAlZFxuIiwKIAkJCW1hdGNoX2RhdGEtPmRlc2MuY2xrX25hbWUsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JY2luZm8tPmNsayA9IGNsazsKIAlyZXQgPSBwYWxtYXNfY2xrc19pbml0X2NvbmZpZ3VyZShjaW5mbyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2xvY2sgY29uZmlnIGZhaWxlZCwgJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0gb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNpbmZvLT5jbGspOworCXJldCA9IG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsICZjaW5mby0+aHcpOwogCWlmIChyZXQgPCAwKQogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsIHRvIGFkZCBjbG9jayBkcml2ZXIsICVkXG4iLCByZXQpOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstcHdtLmMgYi9kcml2ZXJzL2Nsay9jbGstcHdtLmMKaW5kZXggMTYzMGExZi4uOGNiOWQxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLXB3bS5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1wd20uYwpAQCAtNjEsNyArNjEsNiBAQAogCXN0cnVjdCBwd21fZGV2aWNlICpwd207CiAJc3RydWN0IHB3bV9hcmdzIHBhcmdzOwogCWNvbnN0IGNoYXIgKmNsa19uYW1lOwotCXN0cnVjdCBjbGsgKmNsazsKIAlpbnQgcmV0OwogCiAJY2xrX3B3bSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmNsa19wd20pLCBHRlBfS0VSTkVMKTsKQEAgLTEwNywxMSArMTA2LDExIEBACiAKIAljbGtfcHdtLT5wd20gPSBwd207CiAJY2xrX3B3bS0+aHcuaW5pdCA9ICZpbml0OwotCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjbGtfcHdtLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQotCQlyZXR1cm4gUFRSX0VSUihjbGspOworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjbGtfcHdtLT5odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAotCXJldHVybiBvZl9jbGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlyZXR1cm4gb2ZfY2xrX2FkZF9od19wcm92aWRlcihub2RlLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgJmNsa19wd20tPmh3KTsKIH0KIAogc3RhdGljIGludCBjbGtfcHdtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLXFvcmlxLmMgYi9kcml2ZXJzL2Nsay9jbGstcW9yaXEuYwppbmRleCA1ODU2NmExNy4uMjBiMTA1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLXFvcmlxLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLXFvcmlxLmMKQEAgLTc2Niw3ICs3NjYsMTEgQEAKIAlpZiAoIWh3YykKIAkJcmV0dXJuIE5VTEw7CiAKLQlod2MtPnJlZyA9IGNnLT5yZWdzICsgMHgyMCAqIGlkeDsKKwlpZiAoY2ctPmluZm8uZmxhZ3MgJiBDR19WRVIzKQorCQlod2MtPnJlZyA9IGNnLT5yZWdzICsgMHg3MDAwMCArIDB4MjAgKiBpZHg7CisJZWxzZQorCQlod2MtPnJlZyA9IGNnLT5yZWdzICsgMHgyMCAqIGlkeDsKKwogCWh3Yy0+aW5mbyA9IGNnLT5pbmZvLmNtdXhfZ3JvdXBzW2NnLT5pbmZvLmNtdXhfdG9fZ3JvdXBbaWR4XV07CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLXJrODA4LmMgYi9kcml2ZXJzL2Nsay9jbGstcms4MDguYwppbmRleCA3NDM4MzAzLi42NDYxZjI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstcms4MDguYworKysgYi9kcml2ZXJzL2Nsay9jbGstcms4MDguYwpAQCAtMjIsMTEgKzIyLDggQEAKICNpbmNsdWRlIDxsaW51eC9tZmQvcms4MDguaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KIAotI2RlZmluZSBSSzgwOF9OUl9PVVRQVVQgMgotCiBzdHJ1Y3Qgcms4MDhfY2xrb3V0IHsKIAlzdHJ1Y3Qgcms4MDggKnJrODA4OwotCXN0cnVjdCBjbGtfb25lY2VsbF9kYXRhIGNsa19kYXRhOwogCXN0cnVjdCBjbGtfaHcJCWNsa291dDFfaHc7CiAJc3RydWN0IGNsa19odwkJY2xrb3V0Ml9odzsKIH07CkBAIC04NSwxNCArODIsMjggQEAKIAkucmVjYWxjX3JhdGUgPSByazgwOF9jbGtvdXRfcmVjYWxjX3JhdGUsCiB9OwogCitzdGF0aWMgc3RydWN0IGNsa19odyAqCitvZl9jbGtfcms4MDhfZ2V0KHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmNsa3NwZWMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJrODA4X2Nsa291dCAqcms4MDhfY2xrb3V0ID0gZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gY2xrc3BlYy0+YXJnc1swXTsKKworCWlmIChpZHggPj0gMikgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGluZGV4ICV1XG4iLCBfX2Z1bmNfXywgaWR4KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJcmV0dXJuIGlkeCA/ICZyazgwOF9jbGtvdXQtPmNsa291dDJfaHcgOiAmcms4MDhfY2xrb3V0LT5jbGtvdXQxX2h3OworfQorCiBzdGF0aWMgaW50IHJrODA4X2Nsa291dF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCByazgwOCAqcms4MDggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHJrODA4LT5pMmM7CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gY2xpZW50LT5kZXYub2Zfbm9kZTsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0ID0ge307Ci0Jc3RydWN0IGNsayAqKmNsa190YWJsZTsKIAlzdHJ1Y3Qgcms4MDhfY2xrb3V0ICpyazgwOF9jbGtvdXQ7CisJaW50IHJldDsKIAogCXJrODA4X2Nsa291dCA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsCiAJCQkJICAgIHNpemVvZigqcms4MDhfY2xrb3V0KSwgR0ZQX0tFUk5FTCk7CkBAIC0xMDEsMTEgKzExMiw2IEBACiAKIAlyazgwOF9jbGtvdXQtPnJrODA4ID0gcms4MDg7CiAKLQljbGtfdGFibGUgPSBkZXZtX2tjYWxsb2MoJmNsaWVudC0+ZGV2LCBSSzgwOF9OUl9PVVRQVVQsCi0JCQkJIHNpemVvZihzdHJ1Y3QgY2xrICopLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNsa190YWJsZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlpbml0LnBhcmVudF9uYW1lcyA9IE5VTEw7CiAJaW5pdC5udW1fcGFyZW50cyA9IDA7CiAJaW5pdC5uYW1lID0gInJrODA4LWNsa291dDEiOwpAQCAtMTE2LDEwICsxMjIsOSBAQAogCW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KG5vZGUsICJjbG9jay1vdXRwdXQtbmFtZXMiLAogCQkJCSAgICAgIDAsICZpbml0Lm5hbWUpOwogCi0JY2xrX3RhYmxlWzBdID0gZGV2bV9jbGtfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LAotCQkJCQkgJnJrODA4X2Nsa291dC0+Y2xrb3V0MV9odyk7Ci0JaWYgKElTX0VSUihjbGtfdGFibGVbMF0pKQotCQlyZXR1cm4gUFRSX0VSUihjbGtfdGFibGVbMF0pOworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJnJrODA4X2Nsa291dC0+Y2xrb3V0MV9odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWluaXQubmFtZSA9ICJyazgwOC1jbGtvdXQyIjsKIAlpbml0Lm9wcyA9ICZyazgwOF9jbGtvdXQyX29wczsKQEAgLTEyOSwxNiArMTM0LDExIEBACiAJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgobm9kZSwgImNsb2NrLW91dHB1dC1uYW1lcyIsCiAJCQkJICAgICAgMSwgJmluaXQubmFtZSk7CiAKLQljbGtfdGFibGVbMV0gPSBkZXZtX2Nsa19yZWdpc3RlcigmY2xpZW50LT5kZXYsCi0JCQkJCSAmcms4MDhfY2xrb3V0LT5jbGtvdXQyX2h3KTsKLQlpZiAoSVNfRVJSKGNsa190YWJsZVsxXSkpCi0JCXJldHVybiBQVFJfRVJSKGNsa190YWJsZVsxXSk7CisJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmcms4MDhfY2xrb3V0LT5jbGtvdXQyX2h3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0Jcms4MDhfY2xrb3V0LT5jbGtfZGF0YS5jbGtzID0gY2xrX3RhYmxlOwotCXJrODA4X2Nsa291dC0+Y2xrX2RhdGEuY2xrX251bSA9IFJLODA4X05SX09VVFBVVDsKLQotCXJldHVybiBvZl9jbGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsCi0JCQkJICAgJnJrODA4X2Nsa291dC0+Y2xrX2RhdGEpOworCXJldHVybiBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19yazgwOF9nZXQsIHJrODA4X2Nsa291dCk7CiB9CiAKIHN0YXRpYyBpbnQgcms4MDhfY2xrb3V0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLXNjcGkuYyBiL2RyaXZlcnMvY2xrL2Nsay1zY3BpLmMKaW5kZXggNjk2MmVlNS4uMmEzZTlkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLXNjcGkuYworKysgYi9kcml2ZXJzL2Nsay9jbGstc2NwaS5jCkBAIC0xNDYsMTMgKzE0NiwxMyBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqCitzdGF0aWMgaW50CiBzY3BpX2Nsa19vcHNfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoLAogCQkgIHN0cnVjdCBzY3BpX2NsayAqc2NsaywgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwotCXN0cnVjdCBjbGsgKmNsazsKIAl1bnNpZ25lZCBsb25nIG1pbiA9IDAsIG1heCA9IDA7CisJaW50IHJldDsKIAogCWluaXQubmFtZSA9IG5hbWU7CiAJaW5pdC5mbGFncyA9IDA7CkBAIC0xNjQsMTggKzE2NCwxOCBAQAogCWlmIChpbml0Lm9wcyA9PSAmc2NwaV9kdmZzX29wcykgewogCQlzY2xrLT5pbmZvID0gc2Nsay0+c2NwaV9vcHMtPmR2ZnNfZ2V0X2luZm8oc2Nsay0+aWQpOwogCQlpZiAoSVNfRVJSKHNjbGstPmluZm8pKQotCQkJcmV0dXJuIE5VTEw7CisJCQlyZXR1cm4gUFRSX0VSUihzY2xrLT5pbmZvKTsKIAl9IGVsc2UgaWYgKGluaXQub3BzID09ICZzY3BpX2Nsa19vcHMpIHsKIAkJaWYgKHNjbGstPnNjcGlfb3BzLT5jbGtfZ2V0X3JhbmdlKHNjbGstPmlkLCAmbWluLCAmbWF4KSB8fCAhbWF4KQotCQkJcmV0dXJuIE5VTEw7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAl9IGVsc2UgewotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoZGV2LCAmc2Nsay0+aHcpOwotCWlmICghSVNfRVJSKGNsaykgJiYgbWF4KQorCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGRldiwgJnNjbGstPmh3KTsKKwlpZiAoIXJldCAmJiBtYXgpCiAJCWNsa19od19zZXRfcmF0ZV9yYW5nZSgmc2Nsay0+aHcsIG1pbiwgbWF4KTsKLQlyZXR1cm4gY2xrOworCXJldHVybiByZXQ7CiB9CiAKIHN0cnVjdCBzY3BpX2Nsa19kYXRhIHsKQEAgLTE4Myw3ICsxODMsNyBAQAogCXVuc2lnbmVkIGludCBjbGtfbnVtOwogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKgorc3RhdGljIHN0cnVjdCBjbGtfaHcgKgogc2NwaV9vZl9jbGtfc3JjX2dldChzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpjbGtzcGVjLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBzY3BpX2NsayAqc2NsazsKQEAgLTE5Myw3ICsxOTMsNyBAQAogCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGNsa19kYXRhLT5jbGtfbnVtOyBjb3VudCsrKSB7CiAJCXNjbGsgPSBjbGtfZGF0YS0+Y2xrW2NvdW50XTsKIAkJaWYgKGlkeCA9PSBzY2xrLT5pZCkKLQkJCXJldHVybiBzY2xrLT5ody5jbGs7CisJCQlyZXR1cm4gJnNjbGstPmh3OwogCX0KIAogCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMjAyLDggKzIwMiw3IEBACiBzdGF0aWMgaW50IHNjcGlfY2xrX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCiAJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKLQlzdHJ1Y3QgY2xrICoqY2xrczsKLQlpbnQgaWR4LCBjb3VudDsKKwlpbnQgaWR4LCBjb3VudCwgZXJyOwogCXN0cnVjdCBzY3BpX2Nsa19kYXRhICpjbGtfZGF0YTsKIAogCWNvdW50ID0gb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyhucCwgImNsb2NrLW91dHB1dC1uYW1lcyIpOwpAQCAtMjIyLDEwICsyMjEsNiBAQAogCWlmICghY2xrX2RhdGEtPmNsaykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQljbGtzID0gZGV2bV9rY2FsbG9jKGRldiwgY291bnQsIHNpemVvZigqY2xrcyksIEdGUF9LRVJORUwpOwotCWlmICghY2xrcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlmb3IgKGlkeCA9IDA7IGlkeCA8IGNvdW50OyBpZHgrKykgewogCQlzdHJ1Y3Qgc2NwaV9jbGsgKnNjbGs7CiAJCWNvbnN0IGNoYXIgKm5hbWU7CkBAIC0yNDksMTUgKzI0NCwxNSBAQAogCiAJCXNjbGstPmlkID0gdmFsOwogCi0JCWNsa3NbaWR4XSA9IHNjcGlfY2xrX29wc19pbml0KGRldiwgbWF0Y2gsIHNjbGssIG5hbWUpOwotCQlpZiAoSVNfRVJSX09SX05VTEwoY2xrc1tpZHhdKSkKKwkJZXJyID0gc2NwaV9jbGtfb3BzX2luaXQoZGV2LCBtYXRjaCwgc2NsaywgbmFtZSk7CisJCWlmIChlcnIpCiAJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWdpc3RlciBjbG9jayAnJXMnXG4iLCBuYW1lKTsKIAkJZWxzZQogCQkJZGV2X2RiZyhkZXYsICJSZWdpc3RlcmVkIGNsb2NrICclcydcbiIsIG5hbWUpOwogCQljbGtfZGF0YS0+Y2xrW2lkeF0gPSBzY2xrOwogCX0KIAotCXJldHVybiBvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBzY3BpX29mX2Nsa19zcmNfZ2V0LCBjbGtfZGF0YSk7CisJcmV0dXJuIG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIHNjcGlfb2ZfY2xrX3NyY19nZXQsIGNsa19kYXRhKTsKIH0KIAogc3RhdGljIGludCBzY3BpX2Nsb2Nrc19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1zaTUxNC5jIGIvZHJpdmVycy9jbGsvY2xrLXNpNTE0LmMKaW5kZXggY2VlZjI1Yi4uMDliNjcxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLXNpNTE0LmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLXNpNTE0LmMKQEAgLTMwNSw3ICszMDUsNiBAQAogewogCXN0cnVjdCBjbGtfc2k1MTQgKmRhdGE7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKLQlzdHJ1Y3QgY2xrICpjbGs7CiAJaW50IGVycjsKIAogCWRhdGEgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKQEAgLTMzMCwxMyArMzI5LDEzIEBACiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKIAotCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRhdGEtPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKKwllcnIgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkYXRhLT5odyk7CisJaWYgKGVycikgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImNsb2NrIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihjbGspOworCQlyZXR1cm4gZXJyOwogCX0KLQllcnIgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKGNsaWVudC0+ZGV2Lm9mX25vZGUsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwKLQkJCWNsayk7CisJZXJyID0gb2ZfY2xrX2FkZF9od19wcm92aWRlcihjbGllbnQtPmRldi5vZl9ub2RlLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwKKwkJCQkgICAgICZkYXRhLT5odyk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byBhZGQgY2xrIHByb3ZpZGVyXG4iKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1zaTUzNTEuYyBiL2RyaXZlcnMvY2xrL2Nsay1zaTUzNTEuYwppbmRleCBiMWJjMTJjLi5iMDUxZGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstc2k1MzUxLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLXNpNTM1MS5jCkBAIC01NCw3ICs1NCw2IEBACiAJZW51bSBzaTUzNTFfdmFyaWFudAl2YXJpYW50OwogCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CiAJc3RydWN0IHJlZ21hcAkJKnJlZ21hcDsKLQlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSBvbmVjZWxsOwogCiAJc3RydWN0IGNsawkJKnB4dGFsOwogCWNvbnN0IGNoYXIJCSpweHRhbF9uYW1lOwpAQCAtNjYsNiArNjUsNyBAQAogCXN0cnVjdCBzaTUzNTFfaHdfZGF0YQlwbGxbMl07CiAJc3RydWN0IHNpNTM1MV9od19kYXRhCSptc3ludGg7CiAJc3RydWN0IHNpNTM1MV9od19kYXRhCSpjbGtvdXQ7CisJc2l6ZV90CQkJbnVtX2Nsa291dDsKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2k1MzUxX2lucHV0X25hbWVzW10gPSB7CkBAIC0xMzA3LDExICsxMzA3LDMxIEBACiAJb2Zfbm9kZV9wdXQoY2hpbGQpOwogCXJldHVybiAtRUlOVkFMOwogfQorCitzdGF0aWMgc3RydWN0IGNsa19odyAqCitzaTUzMzUxX29mX2Nsa19nZXQoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqY2xrc3BlYywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2k1MzUxX2RyaXZlcl9kYXRhICpkcnZkYXRhID0gZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gY2xrc3BlYy0+YXJnc1swXTsKKworCWlmIChpZHggPj0gZHJ2ZGF0YS0+bnVtX2Nsa291dCkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGluZGV4ICV1XG4iLCBfX2Z1bmNfXywgaWR4KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJcmV0dXJuICZkcnZkYXRhLT5jbGtvdXRbaWR4XS5odzsKK30KICNlbHNlCiBzdGF0aWMgaW50IHNpNTM1MV9kdF9wYXJzZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBlbnVtIHNpNTM1MV92YXJpYW50IHZhcmlhbnQpCiB7CiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICoKK3NpNTMzNTFfb2ZfY2xrX2dldChzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpjbGtzcGVjLCB2b2lkICpkYXRhKQoreworCXJldHVybiBOVUxMOworfQogI2VuZGlmIC8qIENPTkZJR19PRiAqLwogCiBzdGF0aWMgaW50IHNpNTM1MV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKQEAgLTEzMjEsNyArMTM0MSw2IEBACiAJc3RydWN0IHNpNTM1MV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlzdHJ1Y3Qgc2k1MzUxX2RyaXZlcl9kYXRhICpkcnZkYXRhOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7Ci0Jc3RydWN0IGNsayAqY2xrOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lc1s0XTsKIAl1OCBudW1fcGFyZW50cywgbnVtX2Nsb2NrczsKIAlpbnQgcmV0LCBuOwpAQCAtMTQzOCwxMCArMTQ1Nyw5IEBACiAJCWluaXQubnVtX3BhcmVudHMgPSAxOwogCX0KIAlkcnZkYXRhLT54dGFsLmluaXQgPSAmaW5pdDsKLQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkcnZkYXRhLT54dGFsKTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkcnZkYXRhLT54dGFsKTsKKwlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyICVzXG4iLCBpbml0Lm5hbWUpOwotCQlyZXQgPSBQVFJfRVJSKGNsayk7CiAJCWdvdG8gZXJyX2NsazsKIAl9CiAKQEAgLTE0NTYsMTEgKzE0NzQsMTAgQEAKIAkJCWluaXQubnVtX3BhcmVudHMgPSAxOwogCQl9CiAJCWRydmRhdGEtPmNsa2luLmluaXQgPSAmaW5pdDsKLQkJY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZHJ2ZGF0YS0+Y2xraW4pOwotCQlpZiAoSVNfRVJSKGNsaykpIHsKKwkJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZHJ2ZGF0YS0+Y2xraW4pOworCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byByZWdpc3RlciAlc1xuIiwKIAkJCQlpbml0Lm5hbWUpOwotCQkJcmV0ID0gUFRSX0VSUihjbGspOwogCQkJZ290byBlcnJfY2xrOwogCQl9CiAJfQpAQCAtMTQ4MCwxMCArMTQ5Nyw5IEBACiAJaW5pdC5mbGFncyA9IDA7CiAJaW5pdC5wYXJlbnRfbmFtZXMgPSBwYXJlbnRfbmFtZXM7CiAJaW5pdC5udW1fcGFyZW50cyA9IG51bV9wYXJlbnRzOwotCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRydmRhdGEtPnBsbFswXS5odyk7Ci0JaWYgKElTX0VSUihjbGspKSB7CisJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZHJ2ZGF0YS0+cGxsWzBdLmh3KTsKKwlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyICVzXG4iLCBpbml0Lm5hbWUpOwotCQlyZXQgPSBQVFJfRVJSKGNsayk7CiAJCWdvdG8gZXJyX2NsazsKIAl9CiAKQEAgLTE1MDUsMTAgKzE1MjEsOSBAQAogCQlpbml0LnBhcmVudF9uYW1lcyA9IHBhcmVudF9uYW1lczsKIAkJaW5pdC5udW1fcGFyZW50cyA9IG51bV9wYXJlbnRzOwogCX0KLQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkcnZkYXRhLT5wbGxbMV0uaHcpOwotCWlmIChJU19FUlIoY2xrKSkgeworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRydmRhdGEtPnBsbFsxXS5odyk7CisJaWYgKHJldCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byByZWdpc3RlciAlc1xuIiwgaW5pdC5uYW1lKTsKLQkJcmV0ID0gUFRSX0VSUihjbGspOwogCQlnb3RvIGVycl9jbGs7CiAJfQogCkBAIC0xNTI0LDEzICsxNTM5LDkgQEAKIAkJCQkgICAgICAgc2l6ZW9mKCpkcnZkYXRhLT5tc3ludGgpLCBHRlBfS0VSTkVMKTsKIAlkcnZkYXRhLT5jbGtvdXQgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBudW1fY2xvY2tzICoKIAkJCQkgICAgICAgc2l6ZW9mKCpkcnZkYXRhLT5jbGtvdXQpLCBHRlBfS0VSTkVMKTsKKwlkcnZkYXRhLT5udW1fY2xrb3V0ID0gbnVtX2Nsb2NrczsKIAotCWRydmRhdGEtPm9uZWNlbGwuY2xrX251bSA9IG51bV9jbG9ja3M7Ci0JZHJ2ZGF0YS0+b25lY2VsbC5jbGtzID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwKLQkJbnVtX2Nsb2NrcyAqIHNpemVvZigqZHJ2ZGF0YS0+b25lY2VsbC5jbGtzKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoV0FSTl9PTighZHJ2ZGF0YS0+bXN5bnRoIHx8ICFkcnZkYXRhLT5jbGtvdXQgfHwKLQkJICAgICFkcnZkYXRhLT5vbmVjZWxsLmNsa3MpKSB7CisJaWYgKFdBUk5fT04oIWRydmRhdGEtPm1zeW50aCB8fCAhZHJ2ZGF0YS0+Y2xrb3V0KSkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9jbGs7CiAJfQpAQCAtMTU0NywxMSArMTU1OCwxMSBAQAogCQkJaW5pdC5mbGFncyB8PSBDTEtfU0VUX1JBVEVfUEFSRU5UOwogCQlpbml0LnBhcmVudF9uYW1lcyA9IHBhcmVudF9uYW1lczsKIAkJaW5pdC5udW1fcGFyZW50cyA9IDI7Ci0JCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRydmRhdGEtPm1zeW50aFtuXS5odyk7Ci0JCWlmIChJU19FUlIoY2xrKSkgeworCQlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmY2xpZW50LT5kZXYsCisJCQkJCSAgICZkcnZkYXRhLT5tc3ludGhbbl0uaHcpOworCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byByZWdpc3RlciAlc1xuIiwKIAkJCQlpbml0Lm5hbWUpOwotCQkJcmV0ID0gUFRSX0VSUihjbGspOwogCQkJZ290byBlcnJfY2xrOwogCQl9CiAJfQpAQCAtMTU3NSwxOSArMTU4NiwxOSBAQAogCQkJaW5pdC5mbGFncyB8PSBDTEtfU0VUX1JBVEVfUEFSRU5UOwogCQlpbml0LnBhcmVudF9uYW1lcyA9IHBhcmVudF9uYW1lczsKIAkJaW5pdC5udW1fcGFyZW50cyA9IG51bV9wYXJlbnRzOwotCQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkcnZkYXRhLT5jbGtvdXRbbl0uaHcpOwotCQlpZiAoSVNfRVJSKGNsaykpIHsKKwkJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LAorCQkJCQkgICAmZHJ2ZGF0YS0+Y2xrb3V0W25dLmh3KTsKKwkJaWYgKHJldCkgewogCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgJXNcbiIsCiAJCQkJaW5pdC5uYW1lKTsKLQkJCXJldCA9IFBUUl9FUlIoY2xrKTsKIAkJCWdvdG8gZXJyX2NsazsKIAkJfQotCQlkcnZkYXRhLT5vbmVjZWxsLmNsa3Nbbl0gPSBjbGs7CiAKIAkJLyogc2V0IGluaXRpYWwgY2xrb3V0IHJhdGUgKi8KIAkJaWYgKHBkYXRhLT5jbGtvdXRbbl0ucmF0ZSAhPSAwKSB7CiAJCQlpbnQgcmV0OwotCQkJcmV0ID0gY2xrX3NldF9yYXRlKGNsaywgcGRhdGEtPmNsa291dFtuXS5yYXRlKTsKKwkJCXJldCA9IGNsa19zZXRfcmF0ZShkcnZkYXRhLT5jbGtvdXRbbl0uaHcuY2xrLAorCQkJCQkgICBwZGF0YS0+Y2xrb3V0W25dLnJhdGUpOwogCQkJaWYgKHJldCAhPSAwKSB7CiAJCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDYW5ub3Qgc2V0IHJhdGUgOiAlZFxuIiwKIAkJCQkJcmV0KTsKQEAgLTE1OTUsOCArMTYwNiw4IEBACiAJCX0KIAl9CiAKLQlyZXQgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKGNsaWVudC0+ZGV2Lm9mX25vZGUsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsCi0JCQkJICAmZHJ2ZGF0YS0+b25lY2VsbCk7CisJcmV0ID0gb2ZfY2xrX2FkZF9od19wcm92aWRlcihjbGllbnQtPmRldi5vZl9ub2RlLCBzaTUzMzUxX29mX2Nsa19nZXQsCisJCQkJICAgICBkcnZkYXRhKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5hYmxlIHRvIGFkZCBjbGsgcHJvdmlkZXJcbiIpOwogCQlnb3RvIGVycl9jbGs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstc2k1NzAuYyBiL2RyaXZlcnMvY2xrL2Nsay1zaTU3MC5jCmluZGV4IGQ1NjY0ODUuLjY0NmFmMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1zaTU3MC5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1zaTU3MC5jCkBAIC00MDgsNyArNDA4LDYgQEAKIHsKIAlzdHJ1Y3QgY2xrX3NpNTcwICpkYXRhOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7Ci0Jc3RydWN0IGNsayAqY2xrOwogCXUzMiBpbml0aWFsX2ZvdXQsIGZhY3RvcnlfZm91dCwgc3RhYmlsaXR5OwogCWludCBlcnI7CiAJZW51bSBjbGtfc2k1NzBfdmFyaWFudCB2YXJpYW50ID0gaWQtPmRyaXZlcl9kYXRhOwpAQCAtNDYyLDEzICs0NjEsMTMgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZGF0YS0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkgeworCWVyciA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRhdGEtPmh3KTsKKwlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiY2xvY2sgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7Ci0JCXJldHVybiBQVFJfRVJSKGNsayk7CisJCXJldHVybiBlcnI7CiAJfQotCWVyciA9IG9mX2Nsa19hZGRfcHJvdmlkZXIoY2xpZW50LT5kZXYub2Zfbm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LAotCQkJY2xrKTsKKwllcnIgPSBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKGNsaWVudC0+ZGV2Lm9mX25vZGUsIG9mX2Nsa19od19zaW1wbGVfZ2V0LAorCQkJCSAgICAgJmRhdGEtPmh3KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5hYmxlIHRvIGFkZCBjbGsgcHJvdmlkZXJcbiIpOwogCQlyZXR1cm4gZXJyOwpAQCAtNDc3LDcgKzQ3Niw3IEBACiAJLyogUmVhZCB0aGUgcmVxdWVzdGVkIGluaXRpYWwgb3V0cHV0IGZyZXF1ZW5jeSBmcm9tIGRldmljZSB0cmVlICovCiAJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihjbGllbnQtPmRldi5vZl9ub2RlLCAiY2xvY2stZnJlcXVlbmN5IiwKIAkJCQkmaW5pdGlhbF9mb3V0KSkgewotCQllcnIgPSBjbGtfc2V0X3JhdGUoY2xrLCBpbml0aWFsX2ZvdXQpOworCQllcnIgPSBjbGtfc2V0X3JhdGUoZGF0YS0+aHcuY2xrLCBpbml0aWFsX2ZvdXQpOwogCQlpZiAoZXJyKSB7CiAJCQlvZl9jbGtfZGVsX3Byb3ZpZGVyKGNsaWVudC0+ZGV2Lm9mX25vZGUpOwogCQkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay10d2w2MDQwLmMgYi9kcml2ZXJzL2Nsay9jbGstdHdsNjA0MC5jCmluZGV4IDY5N2M2NjcuLjdiMjIyYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay10d2w2MDQwLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLXR3bDYwNDAuYwpAQCAtMjYsNjAgKzI2LDczIEBACiAjaW5jbHVkZSA8bGludXgvbWZkL3R3bDYwNDAuaD4KICNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KIAotc3RydWN0IHR3bDYwNDBfY2xrIHsKK3N0cnVjdCB0d2w2MDQwX3BkbWNsayB7CiAJc3RydWN0IHR3bDYwNDAgKnR3bDYwNDA7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBjbGtfaHcgbWNwZG1fZmNsazsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyBwZG1jbGtfaHc7CiAJaW50IGVuYWJsZWQ7CiB9OwogCi1zdGF0aWMgaW50IHR3bDYwNDBfYml0Y2xrX2lzX2VuYWJsZWQoc3RydWN0IGNsa19odyAqaHcpCitzdGF0aWMgaW50IHR3bDYwNDBfcGRtY2xrX2lzX3ByZXBhcmVkKHN0cnVjdCBjbGtfaHcgKmh3KQogewotCXN0cnVjdCB0d2w2MDQwX2NsayAqdHdsNjA0MF9jbGsgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCB0d2w2MDQwX2NsaywKLQkJCQkJCSAgICAgICBtY3BkbV9mY2xrKTsKLQlyZXR1cm4gdHdsNjA0MF9jbGstPmVuYWJsZWQ7CisJc3RydWN0IHR3bDYwNDBfcGRtY2xrICpwZG1jbGsgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCB0d2w2MDQwX3BkbWNsaywKKwkJCQkJCSAgICAgcGRtY2xrX2h3KTsKKworCXJldHVybiBwZG1jbGstPmVuYWJsZWQ7CiB9CiAKLXN0YXRpYyBpbnQgdHdsNjA0MF9iaXRjbGtfcHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKK3N0YXRpYyBpbnQgdHdsNjA0MF9wZG1jbGtfcHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKIHsKLQlzdHJ1Y3QgdHdsNjA0MF9jbGsgKnR3bDYwNDBfY2xrID0gY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgdHdsNjA0MF9jbGssCi0JCQkJCQkgICAgICAgbWNwZG1fZmNsayk7CisJc3RydWN0IHR3bDYwNDBfcGRtY2xrICpwZG1jbGsgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCB0d2w2MDQwX3BkbWNsaywKKwkJCQkJCSAgICAgcGRtY2xrX2h3KTsKIAlpbnQgcmV0OwogCi0JcmV0ID0gdHdsNjA0MF9wb3dlcih0d2w2MDQwX2Nsay0+dHdsNjA0MCwgMSk7CisJcmV0ID0gdHdsNjA0MF9wb3dlcihwZG1jbGstPnR3bDYwNDAsIDEpOwogCWlmICghcmV0KQotCQl0d2w2MDQwX2Nsay0+ZW5hYmxlZCA9IDE7CisJCXBkbWNsay0+ZW5hYmxlZCA9IDE7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCB0d2w2MDQwX2JpdGNsa191bnByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCitzdGF0aWMgdm9pZCB0d2w2MDQwX3BkbWNsa191bnByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCiB7Ci0Jc3RydWN0IHR3bDYwNDBfY2xrICp0d2w2MDQwX2NsayA9IGNvbnRhaW5lcl9vZihodywgc3RydWN0IHR3bDYwNDBfY2xrLAotCQkJCQkJICAgICAgIG1jcGRtX2ZjbGspOworCXN0cnVjdCB0d2w2MDQwX3BkbWNsayAqcGRtY2xrID0gY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgdHdsNjA0MF9wZG1jbGssCisJCQkJCQkgICAgIHBkbWNsa19odyk7CiAJaW50IHJldDsKIAotCXJldCA9IHR3bDYwNDBfcG93ZXIodHdsNjA0MF9jbGstPnR3bDYwNDAsIDApOworCXJldCA9IHR3bDYwNDBfcG93ZXIocGRtY2xrLT50d2w2MDQwLCAwKTsKIAlpZiAoIXJldCkKLQkJdHdsNjA0MF9jbGstPmVuYWJsZWQgPSAwOworCQlwZG1jbGstPmVuYWJsZWQgPSAwOworCiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyB0d2w2MDQwX21jcGRtX29wcyA9IHsKLQkuaXNfZW5hYmxlZCA9IHR3bDYwNDBfYml0Y2xrX2lzX2VuYWJsZWQsCi0JLnByZXBhcmUgPSB0d2w2MDQwX2JpdGNsa19wcmVwYXJlLAotCS51bnByZXBhcmUgPSB0d2w2MDQwX2JpdGNsa191bnByZXBhcmUsCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0d2w2MDQwX3BkbWNsa19yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKKwkJCQkJCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCit7CisJc3RydWN0IHR3bDYwNDBfcGRtY2xrICpwZG1jbGsgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCB0d2w2MDQwX3BkbWNsaywKKwkJCQkJCSAgICAgcGRtY2xrX2h3KTsKKworCXJldHVybiB0d2w2MDQwX2dldF9zeXNjbGsocGRtY2xrLT50d2w2MDQwKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHR3bDYwNDBfcGRtY2xrX29wcyA9IHsKKwkuaXNfcHJlcGFyZWQgPSB0d2w2MDQwX3BkbWNsa19pc19wcmVwYXJlZCwKKwkucHJlcGFyZSA9IHR3bDYwNDBfcGRtY2xrX3ByZXBhcmUsCisJLnVucHJlcGFyZSA9IHR3bDYwNDBfcGRtY2xrX3VucHJlcGFyZSwKKwkucmVjYWxjX3JhdGUgPSB0d2w2MDQwX3BkbWNsa19yZWNhbGNfcmF0ZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrX2luaXRfZGF0YSB3bTgzMXhfY2xrb3V0X2luaXQgPSB7Ci0JLm5hbWUgPSAibWNwZG1fZmNsayIsCi0JLm9wcyA9ICZ0d2w2MDQwX21jcGRtX29wcywKK3N0YXRpYyBzdHJ1Y3QgY2xrX2luaXRfZGF0YSB0d2w2MDQwX3BkbWNsa19pbml0ID0geworCS5uYW1lID0gInBkbWNsayIsCisJLm9wcyA9ICZ0d2w2MDQwX3BkbWNsa19vcHMsCisJLmZsYWdzID0gQ0xLX0dFVF9SQVRFX05PQ0FDSEUsCiB9OwogCi1zdGF0aWMgaW50IHR3bDYwNDBfY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IHR3bDYwNDBfcGRtY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHR3bDYwNDAgKnR3bDYwNDAgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHR3bDYwNDBfY2xrICpjbGtkYXRhOworCXN0cnVjdCB0d2w2MDQwX3BkbWNsayAqY2xrZGF0YTsKKwlpbnQgcmV0OwogCiAJY2xrZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmNsa2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNsa2RhdGEpCkBAIC04OCwyNiArMTAxLDI4IEBACiAJY2xrZGF0YS0+ZGV2ID0gJnBkZXYtPmRldjsKIAljbGtkYXRhLT50d2w2MDQwID0gdHdsNjA0MDsKIAotCWNsa2RhdGEtPm1jcGRtX2ZjbGsuaW5pdCA9ICZ3bTgzMXhfY2xrb3V0X2luaXQ7Ci0JY2xrZGF0YS0+Y2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmNsa2RhdGEtPm1jcGRtX2ZjbGspOwotCWlmIChJU19FUlIoY2xrZGF0YS0+Y2xrKSkKLQkJcmV0dXJuIFBUUl9FUlIoY2xrZGF0YS0+Y2xrKTsKKwljbGtkYXRhLT5wZG1jbGtfaHcuaW5pdCA9ICZ0d2w2MDQwX3BkbWNsa19pbml0OworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjbGtkYXRhLT5wZG1jbGtfaHcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjbGtkYXRhKTsKIAotCXJldHVybiAwOworCXJldHVybiBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKHBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGUsCisJCQkJICAgICAgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsCisJCQkJICAgICAgJmNsa2RhdGEtPnBkbWNsa19odyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHR3bDYwNDBfY2xrX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHR3bDYwNDBfcGRtY2xrX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZSA9ICJ0d2w2MDQwLWNsayIsCisJCS5uYW1lID0gInR3bDYwNDAtcGRtY2xrIiwKIAl9LAotCS5wcm9iZSA9IHR3bDYwNDBfY2xrX3Byb2JlLAorCS5wcm9iZSA9IHR3bDYwNDBfcGRtY2xrX3Byb2JlLAogfTsKIAotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0d2w2MDQwX2Nsa19kcml2ZXIpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0d2w2MDQwX3BkbWNsa19kcml2ZXIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlRXTDYwNDAgY2xvY2sgZHJpdmVyIGZvciBNY1BETSBmdW5jdGlvbmFsIGNsb2NrIik7CiBNT0RVTEVfQVVUSE9SKCJQZXRlciBVamZhbHVzaSA8cGV0ZXIudWpmYWx1c2lAdGkuY29tPiIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp0d2w2MDQwLWNsayIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp0d2w2MDQwLXBkbWNsayIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLXZ0ODUwMC5jIGIvZHJpdmVycy9jbGsvY2xrLXZ0ODUwMC5jCmluZGV4IDM3MzY4YTMuLjQxNjFhNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay12dDg1MDAuYworKysgYi9kcml2ZXJzL2Nsay9jbGstdnQ4NTAwLmMKQEAgLTIzMiw3ICsyMzIsNyBAQAogc3RhdGljIF9faW5pdCB2b2lkIHZ0d21fZGV2aWNlX2Nsa19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKIAl1MzIgZW5fcmVnLCBkaXZfcmVnOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAlzdHJ1Y3QgY2xrX2RldmljZSAqZGV2X2NsazsKIAljb25zdCBjaGFyICpjbGtfbmFtZSA9IG5vZGUtPm5hbWU7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CkBAIC0zMDEsMTMgKzMwMSwxNCBAQAogCiAJZGV2X2Nsay0+aHcuaW5pdCA9ICZpbml0OwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZkZXZfY2xrLT5odyk7Ci0JaWYgKFdBUk5fT04oSVNfRVJSKGNsaykpKSB7CisJaHcgPSAmZGV2X2Nsay0+aHc7CisJcmMgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgaHcpOworCWlmIChXQVJOX09OKHJjKSkgewogCQlrZnJlZShkZXZfY2xrKTsKIAkJcmV0dXJuOwogCX0KLQlyYyA9IG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCBjbGtfbmFtZSwgTlVMTCk7CisJcmMgPSBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgY2xrX25hbWUsIE5VTEwpOwogfQogQ0xLX09GX0RFQ0xBUkUodnQ4NTAwX2RldmljZSwgInZpYSx2dDg1MDAtZGV2aWNlLWNsb2NrIiwgdnR3bV9kZXZpY2VfY2xrX2luaXQpOwogCkBAIC02ODEsNyArNjgyLDcgQEAKIHN0YXRpYyBfX2luaXQgdm9pZCB2dHdtX3BsbF9jbGtfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIGludCBwbGxfdHlwZSkKIHsKIAl1MzIgcmVnOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAlzdHJ1Y3QgY2xrX3BsbCAqcGxsX2NsazsKIAljb25zdCBjaGFyICpjbGtfbmFtZSA9IG5vZGUtPm5hbWU7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CkBAIC03MTQsMTMgKzcxNSwxNCBAQAogCiAJcGxsX2Nsay0+aHcuaW5pdCA9ICZpbml0OwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZwbGxfY2xrLT5odyk7Ci0JaWYgKFdBUk5fT04oSVNfRVJSKGNsaykpKSB7CisJaHcgPSAmcGxsX2Nsay0+aHc7CisJcmMgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnBsbF9jbGstPmh3KTsKKwlpZiAoV0FSTl9PTihyYykpIHsKIAkJa2ZyZWUocGxsX2Nsayk7CiAJCXJldHVybjsKIAl9Ci0JcmMgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgY2xrX25hbWUsIE5VTEwpOworCXJjID0gb2ZfY2xrX2FkZF9od19wcm92aWRlcihub2RlLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsIGNsa19uYW1lLCBOVUxMKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstd204MzF4LmMgYi9kcml2ZXJzL2Nsay9jbGstd204MzF4LmMKaW5kZXggODhkZWY0Yi4uZjRmZGFjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLXdtODMxeC5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay13bTgzMXguYwpAQCAtMjQsOSArMjQsNiBAQAogCXN0cnVjdCBjbGtfaHcgeHRhbF9odzsKIAlzdHJ1Y3QgY2xrX2h3IGZsbF9odzsKIAlzdHJ1Y3QgY2xrX2h3IGNsa291dF9odzsKLQlzdHJ1Y3QgY2xrICp4dGFsOwotCXN0cnVjdCBjbGsgKmZsbDsKLQlzdHJ1Y3QgY2xrICpjbGtvdXQ7CiAJYm9vbCB4dGFsX2VuYTsKIH07CiAKQEAgLTM3MCwxOSArMzY3LDE5IEBACiAJY2xrZGF0YS0+eHRhbF9lbmEgPSByZXQgJiBXTTgzMVhfWFRBTF9FTkE7CiAKIAljbGtkYXRhLT54dGFsX2h3LmluaXQgPSAmd204MzF4X3h0YWxfaW5pdDsKLQljbGtkYXRhLT54dGFsID0gZGV2bV9jbGtfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmNsa2RhdGEtPnh0YWxfaHcpOwotCWlmIChJU19FUlIoY2xrZGF0YS0+eHRhbCkpCi0JCXJldHVybiBQVFJfRVJSKGNsa2RhdGEtPnh0YWwpOworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjbGtkYXRhLT54dGFsX2h3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJY2xrZGF0YS0+ZmxsX2h3LmluaXQgPSAmd204MzF4X2ZsbF9pbml0OwotCWNsa2RhdGEtPmZsbCA9IGRldm1fY2xrX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjbGtkYXRhLT5mbGxfaHcpOwotCWlmIChJU19FUlIoY2xrZGF0YS0+ZmxsKSkKLQkJcmV0dXJuIFBUUl9FUlIoY2xrZGF0YS0+ZmxsKTsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmcGRldi0+ZGV2LCAmY2xrZGF0YS0+ZmxsX2h3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJY2xrZGF0YS0+Y2xrb3V0X2h3LmluaXQgPSAmd204MzF4X2Nsa291dF9pbml0OwotCWNsa2RhdGEtPmNsa291dCA9IGRldm1fY2xrX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjbGtkYXRhLT5jbGtvdXRfaHcpOwotCWlmIChJU19FUlIoY2xrZGF0YS0+Y2xrb3V0KSkKLQkJcmV0dXJuIFBUUl9FUlIoY2xrZGF0YS0+Y2xrb3V0KTsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmcGRldi0+ZGV2LCAmY2xrZGF0YS0+Y2xrb3V0X2h3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2xrZGF0YSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay14Z2VuZS5jIGIvZHJpdmVycy9jbGsvY2xrLXhnZW5lLmMKaW5kZXggMzQzMzEzMi4uNWRhZGRmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLXhnZW5lLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLXhnZW5lLmMKQEAgLTIxNyw2ICsyMTcsMjI2IEBACiAJeGdlbmVfcGxsY2xrX2luaXQobnAsIFBMTF9UWVBFX1BDUCk7CiB9CiAKKy8qKgorICogc3RydWN0IHhnZW5lX2Nsa19wbWQgLSBQTUQgY2xvY2sKKyAqCisgKiBAaHc6CQloYW5kbGUgYmV0d2VlbiBjb21tb24gYW5kIGhhcmR3YXJlLXNwZWNpZmljIGludGVyZmFjZXMKKyAqIEByZWc6CXJlZ2lzdGVyIGNvbnRhaW5pbmcgdGhlIGZyYWN0aW9uYWwgc2NhbGUgbXVsdGlwbGllciAoc2NhbGVyKQorICogQHNoaWZ0OglzaGlmdCB0byB0aGUgdW5pdCBiaXQgZmllbGQKKyAqIEBkZW5vbToJMS9kZW5vbWluYXRvciB1bml0CisgKiBAbG9jazoJcmVnaXN0ZXIgbG9jaworICogRmxhZ3M6CisgKiBYR0VORV9DTEtfUE1EX1NDQUxFX0lOVkVSVEVEIC0gQnkgZGVmYXVsdCB0aGUgc2NhbGVyIGlzIHRoZSB2YWx1ZSByZWFkCisgKglmcm9tIHRoZSByZWdpc3RlciBwbHVzIG9uZS4gRm9yIGV4YW1wbGUsCisgKgkJMCBmb3IgKDAgKyAxKSAvIGRlbm9tLAorICoJCTEgZm9yICgxICsgMSkgLyBkZW5vbSBhbmQgZXRjLgorICoJSWYgdGhpcyBmbGFnIGlzIHNldCwgaXQgaXMKKyAqCQkwIGZvciAoZGVub20gLSAwKSAvIGRlbm9tLAorICoJCTEgZm9yIChkZW5vbSAtIDEpIC8gZGVub20gYW5kIGV0Yy4KKyAqCisgKi8KK3N0cnVjdCB4Z2VuZV9jbGtfcG1kIHsKKwlzdHJ1Y3QgY2xrX2h3CWh3OworCXZvaWQgX19pb21lbQkqcmVnOworCXU4CQlzaGlmdDsKKwl1MzIJCW1hc2s7CisJdTY0CQlkZW5vbTsKKwl1MzIJCWZsYWdzOworCXNwaW5sb2NrX3QJKmxvY2s7Cit9OworCisjZGVmaW5lIHRvX3hnZW5lX2Nsa19wbWQoX2h3KSBjb250YWluZXJfb2YoX2h3LCBzdHJ1Y3QgeGdlbmVfY2xrX3BtZCwgaHcpCisKKyNkZWZpbmUgWEdFTkVfQ0xLX1BNRF9TQ0FMRV9JTlZFUlRFRAlCSVQoMCkKKyNkZWZpbmUgWEdFTkVfQ0xLX1BNRF9TSElGVAkJOAorI2RlZmluZSBYR0VORV9DTEtfUE1EX1dJRFRICQkzCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHhnZW5lX2Nsa19wbWRfcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKQoreworCXN0cnVjdCB4Z2VuZV9jbGtfcG1kICpmZCA9IHRvX3hnZW5lX2Nsa19wbWQoaHcpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXU2NCByZXQsIHNjYWxlOworCXUzMiB2YWw7CisKKwlpZiAoZmQtPmxvY2spCisJCXNwaW5fbG9ja19pcnFzYXZlKGZkLT5sb2NrLCBmbGFncyk7CisJZWxzZQorCQlfX2FjcXVpcmUoZmQtPmxvY2spOworCisJdmFsID0gY2xrX3JlYWRsKGZkLT5yZWcpOworCisJaWYgKGZkLT5sb2NrKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGZkLT5sb2NrLCBmbGFncyk7CisJZWxzZQorCQlfX3JlbGVhc2UoZmQtPmxvY2spOworCisJcmV0ID0gKHU2NClwYXJlbnRfcmF0ZTsKKworCXNjYWxlID0gKHZhbCAmIGZkLT5tYXNrKSA+PiBmZC0+c2hpZnQ7CisJaWYgKGZkLT5mbGFncyAmIFhHRU5FX0NMS19QTURfU0NBTEVfSU5WRVJURUQpCisJCXNjYWxlID0gZmQtPmRlbm9tIC0gc2NhbGU7CisJZWxzZQorCQlzY2FsZSsrOworCisJLyogZnJlcSA9IHBhcmVudF9yYXRlICogc2NhbGVyIC8gZGVub20gKi8KKwlkb19kaXYocmV0LCBmZC0+ZGVub20pOworCXJldCAqPSBzY2FsZTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9ICh1NjQpcGFyZW50X3JhdGU7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbG9uZyB4Z2VuZV9jbGtfcG1kX3JvdW5kX3JhdGUoc3RydWN0IGNsa19odyAqaHcsIHVuc2lnbmVkIGxvbmcgcmF0ZSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnBhcmVudF9yYXRlKQoreworCXN0cnVjdCB4Z2VuZV9jbGtfcG1kICpmZCA9IHRvX3hnZW5lX2Nsa19wbWQoaHcpOworCXU2NCByZXQsIHNjYWxlOworCisJaWYgKCFyYXRlIHx8IHJhdGUgPj0gKnBhcmVudF9yYXRlKQorCQlyZXR1cm4gKnBhcmVudF9yYXRlOworCisJLyogZnJlcSA9IHBhcmVudF9yYXRlICogc2NhbGVyIC8gZGVub20gKi8KKwlyZXQgPSByYXRlICogZmQtPmRlbm9tOworCXNjYWxlID0gRElWX1JPVU5EX1VQX1VMTChyZXQsICpwYXJlbnRfcmF0ZSk7CisKKwlyZXQgPSAodTY0KSpwYXJlbnRfcmF0ZSAqIHNjYWxlOworCWRvX2RpdihyZXQsIGZkLT5kZW5vbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHhnZW5lX2Nsa19wbWRfc2V0X3JhdGUoc3RydWN0IGNsa19odyAqaHcsIHVuc2lnbmVkIGxvbmcgcmF0ZSwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCit7CisJc3RydWN0IHhnZW5lX2Nsa19wbWQgKmZkID0gdG9feGdlbmVfY2xrX3BtZChodyk7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJdTY0IHNjYWxlLCByZXQ7CisJdTMyIHZhbDsKKworCS8qCisJICogQ29tcHV0ZSB0aGUgc2NhbGVyOgorCSAqCisJICogZnJlcSA9IHBhcmVudF9yYXRlICogc2NhbGVyIC8gZGVub20sIG9yCisJICogc2NhbGVyID0gZnJlcSAqIGRlbm9tIC8gcGFyZW50X3JhdGUKKwkgKi8KKwlyZXQgPSByYXRlICogZmQtPmRlbm9tOworCXNjYWxlID0gRElWX1JPVU5EX1VQX1VMTChyZXQsICh1NjQpcGFyZW50X3JhdGUpOworCisJLyogQ2hlY2sgaWYgaW52ZXJ0ZWQgKi8KKwlpZiAoZmQtPmZsYWdzICYgWEdFTkVfQ0xLX1BNRF9TQ0FMRV9JTlZFUlRFRCkKKwkJc2NhbGUgPSBmZC0+ZGVub20gLSBzY2FsZTsKKwllbHNlCisJCXNjYWxlLS07CisKKwlpZiAoZmQtPmxvY2spCisJCXNwaW5fbG9ja19pcnFzYXZlKGZkLT5sb2NrLCBmbGFncyk7CisJZWxzZQorCQlfX2FjcXVpcmUoZmQtPmxvY2spOworCisJdmFsID0gY2xrX3JlYWRsKGZkLT5yZWcpOworCXZhbCAmPSB+ZmQtPm1hc2s7CisJdmFsIHw9IChzY2FsZSA8PCBmZC0+c2hpZnQpOworCWNsa193cml0ZWwodmFsLCBmZC0+cmVnKTsKKworCWlmIChmZC0+bG9jaykKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShmZC0+bG9jaywgZmxhZ3MpOworCWVsc2UKKwkJX19yZWxlYXNlKGZkLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgeGdlbmVfY2xrX3BtZF9vcHMgPSB7CisJLnJlY2FsY19yYXRlID0geGdlbmVfY2xrX3BtZF9yZWNhbGNfcmF0ZSwKKwkucm91bmRfcmF0ZSA9IHhnZW5lX2Nsa19wbWRfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUgPSB4Z2VuZV9jbGtfcG1kX3NldF9yYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKgoreGdlbmVfcmVnaXN0ZXJfY2xrX3BtZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZvaWQgX19pb21lbSAqcmVnLCB1OCBzaGlmdCwKKwkJICAgICAgIHU4IHdpZHRoLCB1NjQgZGVub20sIHUzMiBjbGtfZmxhZ3MsIHNwaW5sb2NrX3QgKmxvY2spCit7CisJc3RydWN0IHhnZW5lX2Nsa19wbWQgKmZkOworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJc3RydWN0IGNsayAqY2xrOworCisJZmQgPSBremFsbG9jKHNpemVvZigqZmQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZkKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWluaXQubmFtZSA9IG5hbWU7CisJaW5pdC5vcHMgPSAmeGdlbmVfY2xrX3BtZF9vcHM7CisJaW5pdC5mbGFncyA9IGZsYWdzOworCWluaXQucGFyZW50X25hbWVzID0gcGFyZW50X25hbWUgPyAmcGFyZW50X25hbWUgOiBOVUxMOworCWluaXQubnVtX3BhcmVudHMgPSBwYXJlbnRfbmFtZSA/IDEgOiAwOworCisJZmQtPnJlZyA9IHJlZzsKKwlmZC0+c2hpZnQgPSBzaGlmdDsKKwlmZC0+bWFzayA9IChCSVQod2lkdGgpIC0gMSkgPDwgc2hpZnQ7CisJZmQtPmRlbm9tID0gZGVub207CisJZmQtPmZsYWdzID0gY2xrX2ZsYWdzOworCWZkLT5sb2NrID0gbG9jazsKKwlmZC0+aHcuaW5pdCA9ICZpbml0OworCisJY2xrID0gY2xrX3JlZ2lzdGVyKGRldiwgJmZkLT5odyk7CisJaWYgKElTX0VSUihjbGspKSB7CisJCXByX2VycigiJXM6IGNvdWxkIG5vdCByZWdpc3RlciBjbGsgJXNcbiIsIF9fZnVuY19fLCBuYW1lKTsKKwkJa2ZyZWUoZmQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gY2xrOworfQorCitzdGF0aWMgdm9pZCB4Z2VuZV9wbWRjbGtfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCWNvbnN0IGNoYXIgKmNsa19uYW1lID0gbnAtPmZ1bGxfbmFtZTsKKwl2b2lkIF9faW9tZW0gKmNzcl9yZWc7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdTY0IGRlbm9tOworCXUzMiBmbGFncyA9IDA7CisJaW50IHJjOworCisJLyogQ2hlY2sgaWYgdGhlIGVudHJ5IGlzIGRpc2FibGVkICovCisJaWYgKCFvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKG5wKSkKKwkJcmV0dXJuOworCisJLyogUGFyc2UgdGhlIERUUyByZWdpc3RlciBmb3IgcmVzb3VyY2UgKi8KKwlyYyA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOworCWlmIChyYyAhPSAwKSB7CisJCXByX2Vycigibm8gRFRTIHJlZ2lzdGVyIGZvciAlc1xuIiwgbnAtPmZ1bGxfbmFtZSk7CisJCXJldHVybjsKKwl9CisJY3NyX3JlZyA9IG9mX2lvbWFwKG5wLCAwKTsKKwlpZiAoIWNzcl9yZWcpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gbWFwIHJlc291cmNlIGZvciAlc1xuIiwgbnAtPmZ1bGxfbmFtZSk7CisJCXJldHVybjsKKwl9CisJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLCAmY2xrX25hbWUpOworCisJZGVub20gPSBCSVQoWEdFTkVfQ0xLX1BNRF9XSURUSCk7CisJZmxhZ3MgfD0gWEdFTkVfQ0xLX1BNRF9TQ0FMRV9JTlZFUlRFRDsKKworCWNsayA9IHhnZW5lX3JlZ2lzdGVyX2Nsa19wbWQoTlVMTCwgY2xrX25hbWUsCisJCQkJICAgICBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKG5wLCAwKSwgMCwKKwkJCQkgICAgIGNzcl9yZWcsIFhHRU5FX0NMS19QTURfU0hJRlQsCisJCQkJICAgICBYR0VORV9DTEtfUE1EX1dJRFRILCBkZW5vbSwKKwkJCQkgICAgIGZsYWdzLCAmY2xrX2xvY2spOworCWlmICghSVNfRVJSKGNsaykpIHsKKwkJb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgY2xrX25hbWUsIE5VTEwpOworCQlwcl9kZWJ1ZygiQWRkICVzIGNsb2NrXG4iLCBjbGtfbmFtZSk7CisJfSBlbHNlIHsKKwkJaWYgKGNzcl9yZWcpCisJCQlpb3VubWFwKGNzcl9yZWcpOworCX0KK30KKwogLyogSVAgQ2xvY2sgKi8KIHN0cnVjdCB4Z2VuZV9kZXZfcGFyYW1ldGVycyB7CiAJdm9pZCBfX2lvbWVtICpjc3JfcmVnOwkJLyogQ1NSIGZvciBJUCBjbG9jayAqLwpAQCAtNTQzLDYgKzc2Myw3IEBACiAKIENMS19PRl9ERUNMQVJFKHhnZW5lX3NvY3BsbF9jbG9jaywgImFwbSx4Z2VuZS1zb2NwbGwtY2xvY2siLCB4Z2VuZV9zb2NwbGxjbGtfaW5pdCk7CiBDTEtfT0ZfREVDTEFSRSh4Z2VuZV9wY3BwbGxfY2xvY2ssICJhcG0seGdlbmUtcGNwcGxsLWNsb2NrIiwgeGdlbmVfcGNwcGxsY2xrX2luaXQpOworQ0xLX09GX0RFQ0xBUkUoeGdlbmVfcG1kX2Nsb2NrLCAiYXBtLHhnZW5lLXBtZC1jbG9jayIsIHhnZW5lX3BtZGNsa19pbml0KTsKIENMS19PRl9ERUNMQVJFKHhnZW5lX3NvY3BsbF92Ml9jbG9jaywgImFwbSx4Z2VuZS1zb2NwbGwtdjItY2xvY2siLAogCSAgICAgICB4Z2VuZV9zb2NwbGxjbGtfaW5pdCk7CiBDTEtfT0ZfREVDTEFSRSh4Z2VuZV9wY3BwbGxfdjJfY2xvY2ssICJhcG0seGdlbmUtcGNwcGxsLXYyLWNsb2NrIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay5jIGIvZHJpdmVycy9jbGsvY2xrLmMKaW5kZXggODIwYTkzOS4uMGZiMzlmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLmMKQEAgLTE5MDgsMTAgKzE5MDgsNiBAQAogCiAJY2xrX3ByZXBhcmVfbG9jaygpOwogCi0JLyogYmFpbCBlYXJseSBpZiBub3RoaW5nIHRvIGRvICovCi0JaWYgKGRlZ3JlZXMgPT0gY2xrLT5jb3JlLT5waGFzZSkKLQkJZ290byBvdXQ7Ci0KIAl0cmFjZV9jbGtfc2V0X3BoYXNlKGNsay0+Y29yZSwgZGVncmVlcyk7CiAKIAlpZiAoY2xrLT5jb3JlLT5vcHMtPnNldF9waGFzZSkKQEAgLTE5MjIsNyArMTkxOCw2IEBACiAJaWYgKCFyZXQpCiAJCWNsay0+Y29yZS0+cGhhc2UgPSBkZWdyZWVzOwogCi1vdXQ6CiAJY2xrX3ByZXBhcmVfdW5sb2NrKCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjQ0OSw4ICsyNDQ0LDE2IEBACiAJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvcnBoYW4sIHRtcDIsICZjbGtfb3JwaGFuX2xpc3QsIGNoaWxkX25vZGUpIHsKIAkJc3RydWN0IGNsa19jb3JlICpwYXJlbnQgPSBfX2Nsa19pbml0X3BhcmVudChvcnBoYW4pOwogCi0JCWlmIChwYXJlbnQpCi0JCQljbGtfY29yZV9yZXBhcmVudChvcnBoYW4sIHBhcmVudCk7CisJCS8qCisJCSAqIHdlIGNvdWxkIGNhbGwgX19jbGtfc2V0X3BhcmVudCwgYnV0IHRoYXQgd291bGQgcmVzdWx0IGluIGEKKwkJICogcmVkdW5kYW50IGNhbGwgdG8gdGhlIC5zZXRfcmF0ZSBvcCwgaWYgaXQgZXhpc3RzCisJCSAqLworCQlpZiAocGFyZW50KSB7CisJCQlfX2Nsa19zZXRfcGFyZW50X2JlZm9yZShvcnBoYW4sIHBhcmVudCk7CisJCQlfX2Nsa19zZXRfcGFyZW50X2FmdGVyKG9ycGhhbiwgcGFyZW50LCBOVUxMKTsKKwkJCV9fY2xrX3JlY2FsY19hY2N1cmFjaWVzKG9ycGhhbik7CisJCQlfX2Nsa19yZWNhbGNfcmF0ZXMob3JwaGFuLCAwKTsKKwkJfQogCX0KIAogCS8qCkBAIC0yNDkxLDcgKzI0OTQsNyBAQAogCiAJLyogVGhpcyBpcyB0byBhbGxvdyB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNoYWluZWQgdG8gb3RoZXJzICovCiAJaWYgKElTX0VSUl9PUl9OVUxMKGh3KSkKLQkJcmV0dXJuIChzdHJ1Y3QgY2xrICopIGh3OworCQlyZXR1cm4gRVJSX0NBU1QoaHcpOwogCiAJY2xrID0ga3phbGxvYyhzaXplb2YoKmNsayksIEdGUF9LRVJORUwpOwogCWlmICghY2xrKQpAQCAtMzE2NiwxOSArMzE2OSwxNCBAQAogCQkJICAgICAgc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqY2xrc3BlYykKIHsKIAlzdHJ1Y3QgY2xrICpjbGs7Ci0Jc3RydWN0IGNsa19odyAqaHcgPSBFUlJfUFRSKC1FUFJPQkVfREVGRVIpOwogCi0JaWYgKHByb3ZpZGVyLT5nZXRfaHcpIHsKLQkJaHcgPSBwcm92aWRlci0+Z2V0X2h3KGNsa3NwZWMsIHByb3ZpZGVyLT5kYXRhKTsKLQl9IGVsc2UgaWYgKHByb3ZpZGVyLT5nZXQpIHsKLQkJY2xrID0gcHJvdmlkZXItPmdldChjbGtzcGVjLCBwcm92aWRlci0+ZGF0YSk7Ci0JCWlmICghSVNfRVJSKGNsaykpCi0JCQlodyA9IF9fY2xrX2dldF9odyhjbGspOwotCQllbHNlCi0JCQlodyA9IEVSUl9DQVNUKGNsayk7Ci0JfQorCWlmIChwcm92aWRlci0+Z2V0X2h3KQorCQlyZXR1cm4gcHJvdmlkZXItPmdldF9odyhjbGtzcGVjLCBwcm92aWRlci0+ZGF0YSk7CiAKLQlyZXR1cm4gaHc7CisJY2xrID0gcHJvdmlkZXItPmdldChjbGtzcGVjLCBwcm92aWRlci0+ZGF0YSk7CisJaWYgKElTX0VSUihjbGspKQorCQlyZXR1cm4gRVJSX0NBU1QoY2xrKTsKKwlyZXR1cm4gX19jbGtfZ2V0X2h3KGNsayk7CiB9CiAKIHN0cnVjdCBjbGsgKl9fb2ZfY2xrX2dldF9mcm9tX3Byb3ZpZGVyKHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmNsa3NwZWMsCkBAIC0zMTg2LDcgKzMxODQsNyBAQAogewogCXN0cnVjdCBvZl9jbGtfcHJvdmlkZXIgKnByb3ZpZGVyOwogCXN0cnVjdCBjbGsgKmNsayA9IEVSUl9QVFIoLUVQUk9CRV9ERUZFUik7Ci0Jc3RydWN0IGNsa19odyAqaHcgPSBFUlJfUFRSKC1FUFJPQkVfREVGRVIpOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCiAJaWYgKCFjbGtzcGVjKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTMxOTQsMTIgKzMxOTIsMTMgQEAKIAkvKiBDaGVjayBpZiB3ZSBoYXZlIHN1Y2ggYSBwcm92aWRlciBpbiBvdXIgYXJyYXkgKi8KIAltdXRleF9sb2NrKCZvZl9jbGtfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocHJvdmlkZXIsICZvZl9jbGtfcHJvdmlkZXJzLCBsaW5rKSB7Ci0JCWlmIChwcm92aWRlci0+bm9kZSA9PSBjbGtzcGVjLT5ucCkKKwkJaWYgKHByb3ZpZGVyLT5ub2RlID09IGNsa3NwZWMtPm5wKSB7CiAJCQlodyA9IF9fb2ZfY2xrX2dldF9od19mcm9tX3Byb3ZpZGVyKHByb3ZpZGVyLCBjbGtzcGVjKTsKLQkJaWYgKCFJU19FUlIoaHcpKSB7CiAJCQljbGsgPSBfX2Nsa19jcmVhdGVfY2xrKGh3LCBkZXZfaWQsIGNvbl9pZCk7CisJCX0KIAotCQkJaWYgKCFJU19FUlIoY2xrKSAmJiAhX19jbGtfZ2V0KGNsaykpIHsKKwkJaWYgKCFJU19FUlIoY2xrKSkgeworCQkJaWYgKCFfX2Nsa19nZXQoY2xrKSkgewogCQkJCV9fY2xrX2ZyZWVfY2xrKGNsayk7CiAJCQkJY2xrID0gRVJSX1BUUigtRU5PRU5UKTsKIAkJCX0KQEAgLTM0NTEsNiArMzQ1MCwxMCBAQAogCQkJCQkmY2xrX3Byb3ZpZGVyX2xpc3QsIG5vZGUpIHsKIAkJCWlmIChmb3JjZSB8fCBwYXJlbnRfcmVhZHkoY2xrX3Byb3ZpZGVyLT5ucCkpIHsKIAorCQkJCS8qIERvbid0IHBvcHVsYXRlIHBsYXRmb3JtIGRldmljZXMgKi8KKwkJCQlvZl9ub2RlX3NldF9mbGFnKGNsa19wcm92aWRlci0+bnAsCisJCQkJCQkgT0ZfUE9QVUxBVEVEKTsKKwogCQkJCWNsa19wcm92aWRlci0+Y2xrX2luaXRfY2IoY2xrX3Byb3ZpZGVyLT5ucCk7CiAJCQkJb2ZfY2xrX3NldF9kZWZhdWx0cyhjbGtfcHJvdmlkZXItPm5wLCB0cnVlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvaDgzMDAvY2xrLWRpdi5jIGIvZHJpdmVycy9jbGsvaDgzMDAvY2xrLWRpdi5jCmluZGV4IDRiZjQ0YTIuLjcxNWI4ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2g4MzAwL2Nsay1kaXYuYworKysgYi9kcml2ZXJzL2Nsay9oODMwMC9jbGstZGl2LmMKQEAgLTE0LDcgKzE0LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBoODMwMF9kaXZfY2xrX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKIAl1bnNpZ25lZCBpbnQgbnVtX3BhcmVudHM7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCWNvbnN0IGNoYXIgKmNsa19uYW1lID0gbm9kZS0+bmFtZTsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZTsKIAl2b2lkIF9faW9tZW0gKmRpdmNyID0gTlVMTDsKQEAgLTM4LDE1ICszOCwxNSBAQAogCiAJcGFyZW50X25hbWUgPSBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKG5vZGUsIDApOwogCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJyZW5lc2FzLHdpZHRoIiwgJndpZHRoKTsKLQljbGsgPSBjbGtfcmVnaXN0ZXJfZGl2aWRlcihOVUxMLCBjbGtfbmFtZSwgcGFyZW50X25hbWUsCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZGl2aWRlcihOVUxMLCBjbGtfbmFtZSwgcGFyZW50X25hbWUsCiAJCQkJICAgQ0xLX1NFVF9SQVRFX0dBVEUsIGRpdmNyLCBvZmZzZXQsIHdpZHRoLAogCQkJCSAgIENMS19ESVZJREVSX1BPV0VSX09GX1RXTywgJmNsa2xvY2spOwotCWlmICghSVNfRVJSKGNsaykpIHsKLQkJb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJaWYgKCFJU19FUlIoaHcpKSB7CisJCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIAkJcmV0dXJuOwogCX0KIAlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgJXMgZGl2IGNsb2NrICglbGQpXG4iLAotCSAgICAgICBfX2Z1bmNfXywgY2xrX25hbWUsIFBUUl9FUlIoY2xrKSk7CisJICAgICAgIF9fZnVuY19fLCBjbGtfbmFtZSwgUFRSX0VSUihodykpOwogZXJyb3I6CiAJaWYgKGRpdmNyKQogCQlpb3VubWFwKGRpdmNyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2g4MzAwL2Nsay1oOHMyNjc4LmMgYi9kcml2ZXJzL2Nsay9oODMwMC9jbGstaDhzMjY3OC5jCmluZGV4IGM5YzJmZDUuLmEyNjMxMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2g4MzAwL2Nsay1oOHMyNjc4LmMKKysrIGIvZHJpdmVycy9jbGsvaDgzMDAvY2xrLWg4czI2NzguYwpAQCAtODQsMTEgKzg0LDExIEBACiBzdGF0aWMgdm9pZCBfX2luaXQgaDhzMjY3OF9wbGxfY2xrX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKIAl1bnNpZ25lZCBpbnQgbnVtX3BhcmVudHM7Ci0Jc3RydWN0IGNsayAqY2xrOwogCWNvbnN0IGNoYXIgKmNsa19uYW1lID0gbm9kZS0+bmFtZTsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZTsKIAlzdHJ1Y3QgcGxsX2Nsb2NrICpwbGxfY2xvY2s7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OwogCiAJbnVtX3BhcmVudHMgPSBvZl9jbGtfZ2V0X3BhcmVudF9jb3VudChub2RlKTsKIAlpZiAoIW51bV9wYXJlbnRzKSB7CkBAIC0xMjEsMTQgKzEyMSwxNCBAQAogCWluaXQubnVtX3BhcmVudHMgPSAxOwogCXBsbF9jbG9jay0+aHcuaW5pdCA9ICZpbml0OwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZwbGxfY2xvY2stPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyICVzIGRpdiBjbG9jayAoJWxkKVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBjbGtfbmFtZSwgUFRSX0VSUihjbGspKTsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnBsbF9jbG9jay0+aHcpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyICVzIGRpdiBjbG9jayAoJWQpXG4iLAorCQkgICAgICAgX19mdW5jX18sIGNsa19uYW1lLCByZXQpOwogCQlnb3RvIHVubWFwX3BsbGNyOwogCX0KIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsICZwbGxfY2xvY2stPmh3KTsKIAlyZXR1cm47CiAKIHVubWFwX3BsbGNyOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvaW14L2Nsay1pbXgzNS5jIGIvZHJpdmVycy9jbGsvaW14L2Nsay1pbXgzNS5jCmluZGV4IGIwOTc4ZDMuLjIwM2NhZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2lteC9jbGstaW14MzUuYworKysgYi9kcml2ZXJzL2Nsay9pbXgvY2xrLWlteDM1LmMKQEAgLTY2LDIwICs2NiwyMiBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmlwZ19wZXJfc2VsW10gPSB7ImFoYl9wZXJfZGl2IiwgImFybV9wZXJfZGl2In07CiAKIGVudW0gbXgzNV9jbGtzIHsKLQlja2loLCBtcGxsLCBwcGxsLCBtcGxsXzA3NSwgYXJtLCBoc3AsIGhzcF9kaXYsIGhzcF9zZWwsIGFoYiwgaXBnLAotCWFybV9wZXJfZGl2LCBhaGJfcGVyX2RpdiwgaXBnX3BlciwgdWFydF9zZWwsIHVhcnRfZGl2LCBlc2RoY19zZWwsCi0JZXNkaGMxX2RpdiwgZXNkaGMyX2RpdiwgZXNkaGMzX2Rpdiwgc3BkaWZfc2VsLCBzcGRpZl9kaXZfcHJlLAotCXNwZGlmX2Rpdl9wb3N0LCBzc2lfc2VsLCBzc2kxX2Rpdl9wcmUsIHNzaTFfZGl2X3Bvc3QsIHNzaTJfZGl2X3ByZSwKLQlzc2kyX2Rpdl9wb3N0LCB1c2Jfc2VsLCB1c2JfZGl2LCBuZmNfZGl2LCBhc3JjX2dhdGUsIHBhdGFfZ2F0ZSwKLQlhdWRtdXhfZ2F0ZSwgY2FuMV9nYXRlLCBjYW4yX2dhdGUsIGNzcGkxX2dhdGUsIGNzcGkyX2dhdGUsIGVjdF9nYXRlLAotCWVkaW9fZ2F0ZSwgZW1pX2dhdGUsIGVwaXQxX2dhdGUsIGVwaXQyX2dhdGUsIGVzYWlfZ2F0ZSwgZXNkaGMxX2dhdGUsCi0JZXNkaGMyX2dhdGUsIGVzZGhjM19nYXRlLCBmZWNfZ2F0ZSwgZ3BpbzFfZ2F0ZSwgZ3BpbzJfZ2F0ZSwgZ3BpbzNfZ2F0ZSwKLQlncHRfZ2F0ZSwgaTJjMV9nYXRlLCBpMmMyX2dhdGUsIGkyYzNfZ2F0ZSwgaW9tdXhjX2dhdGUsIGlwdV9nYXRlLAotCWtwcF9nYXRlLCBtbGJfZ2F0ZSwgbXNoY19nYXRlLCBvd2lyZV9nYXRlLCBwd21fZ2F0ZSwgcm5nY19nYXRlLAotCXJ0Y19nYXRlLCBydGljX2dhdGUsIHNjY19nYXRlLCBzZG1hX2dhdGUsIHNwYmFfZ2F0ZSwgc3BkaWZfZ2F0ZSwKLQlzc2kxX2dhdGUsIHNzaTJfZ2F0ZSwgdWFydDFfZ2F0ZSwgdWFydDJfZ2F0ZSwgdWFydDNfZ2F0ZSwgdXNib3RnX2dhdGUsCi0Jd2RvZ19nYXRlLCBtYXhfZ2F0ZSwgYWRtdXhfZ2F0ZSwgY3NpX2dhdGUsIGNzaV9kaXYsIGNzaV9zZWwsIGlpbV9nYXRlLAotCWdwdTJkX2dhdGUsIGNraWwsIGNsa19tYXgKKwkvKiAgMCAqLyBja2loLCBtcGxsLCBwcGxsLCBtcGxsXzA3NSwgYXJtLCBoc3AsIGhzcF9kaXYsIGhzcF9zZWwsIGFoYiwKKwkvKiAgOSAqLyBpcGcsIGFybV9wZXJfZGl2LCBhaGJfcGVyX2RpdiwgaXBnX3BlciwgdWFydF9zZWwsIHVhcnRfZGl2LAorCS8qIDE1ICovIGVzZGhjX3NlbCwgZXNkaGMxX2RpdiwgZXNkaGMyX2RpdiwgZXNkaGMzX2Rpdiwgc3BkaWZfc2VsLAorCS8qIDIwICovIHNwZGlmX2Rpdl9wcmUsIHNwZGlmX2Rpdl9wb3N0LCBzc2lfc2VsLCBzc2kxX2Rpdl9wcmUsCisJLyogMjQgKi8gc3NpMV9kaXZfcG9zdCwgc3NpMl9kaXZfcHJlLCBzc2kyX2Rpdl9wb3N0LCB1c2Jfc2VsLCB1c2JfZGl2LAorCS8qIDI5ICovIG5mY19kaXYsIGFzcmNfZ2F0ZSwgcGF0YV9nYXRlLCBhdWRtdXhfZ2F0ZSwgY2FuMV9nYXRlLAorCS8qIDM0ICovIGNhbjJfZ2F0ZSwgY3NwaTFfZ2F0ZSwgY3NwaTJfZ2F0ZSwgZWN0X2dhdGUsIGVkaW9fZ2F0ZSwKKwkvKiAzOSAqLyBlbWlfZ2F0ZSwgZXBpdDFfZ2F0ZSwgZXBpdDJfZ2F0ZSwgZXNhaV9nYXRlLCBlc2RoYzFfZ2F0ZSwKKwkvKiA0NCAqLyBlc2RoYzJfZ2F0ZSwgZXNkaGMzX2dhdGUsIGZlY19nYXRlLCBncGlvMV9nYXRlLCBncGlvMl9nYXRlLAorCS8qIDQ5ICovIGdwaW8zX2dhdGUsIGdwdF9nYXRlLCBpMmMxX2dhdGUsIGkyYzJfZ2F0ZSwgaTJjM19nYXRlLAorCS8qIDU0ICovIGlvbXV4Y19nYXRlLCBpcHVfZ2F0ZSwga3BwX2dhdGUsIG1sYl9nYXRlLCBtc2hjX2dhdGUsCisJLyogNTkgKi8gb3dpcmVfZ2F0ZSwgcHdtX2dhdGUsIHJuZ2NfZ2F0ZSwgcnRjX2dhdGUsIHJ0aWNfZ2F0ZSwgc2NjX2dhdGUsCisJLyogNjUgKi8gc2RtYV9nYXRlLCBzcGJhX2dhdGUsIHNwZGlmX2dhdGUsIHNzaTFfZ2F0ZSwgc3NpMl9nYXRlLAorCS8qIDcwICovIHVhcnQxX2dhdGUsIHVhcnQyX2dhdGUsIHVhcnQzX2dhdGUsIHVzYm90Z19nYXRlLCB3ZG9nX2dhdGUsCisJLyogNzUgKi8gbWF4X2dhdGUsIGFkbXV4X2dhdGUsIGNzaV9nYXRlLCBjc2lfZGl2LCBjc2lfc2VsLCBpaW1fZ2F0ZSwKKwkvKiA4MSAqLyBncHUyZF9nYXRlLCBja2lsLCBjbGtfbWF4CiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayAqY2xrW2Nsa19tYXhdOwpAQCAtMTE1LDcgKzExNyw3IEBACiAJfQogCiAJY2xrW2NraWhdID0gaW14X2Nsa19maXhlZCgiY2tpaCIsIDI0MDAwMDAwKTsKLQljbGtbY2tpbF0gPSBpbXhfY2xrX2ZpeGVkKCJja2loIiwgMzI3NjgpOworCWNsa1tja2lsXSA9IGlteF9jbGtfZml4ZWQoImNraWwiLCAzMjc2OCk7CiAJY2xrW21wbGxdID0gaW14X2Nsa19wbGx2MShJTVhfUExMVjFfSU1YMzUsICJtcGxsIiwgImNraWgiLCBiYXNlICsgTVgzNV9DQ01fTVBDVEwpOwogCWNsa1twcGxsXSA9IGlteF9jbGtfcGxsdjEoSU1YX1BMTFYxX0lNWDM1LCAicHBsbCIsICJja2loIiwgYmFzZSArIE1YMzVfQ0NNX1BQQ1RMKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvaW14L2Nsay1pbXg1MS1pbXg1My5jIGIvZHJpdmVycy9jbGsvaW14L2Nsay1pbXg1MS1pbXg1My5jCmluZGV4IDI5ZDRjNDQuLjFlM2M5ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2lteC9jbGstaW14NTEtaW14NTMuYworKysgYi9kcml2ZXJzL2Nsay9pbXgvY2xrLWlteDUxLWlteDUzLmMKQEAgLTEyNiw2ICsxMjYsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIgKm14NTFfc3BkaWYxX2NvbV9zZWxbXSA9IHsgInNwZGlmMV9wb2RmIiwgInNzaTJfcm9vdF9nYXRlIiwgfTsKIHN0YXRpYyBjb25zdCBjaGFyICpzdGVwX3NlbHNbXSA9IHsgImxwX2FwbSIsIH07CiBzdGF0aWMgY29uc3QgY2hhciAqY3B1X3BvZGZfc2Vsc1tdID0geyAicGxsMV9zdyIsICJzdGVwX3NlbCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICppZWVlMTU4OF9zZWxzW10gPSB7ICJwbGwzX3N3IiwgInBsbDRfc3ciLCAiZHVtbXkiIC8qIHVzYnBoeTJfY2xrICovLCAiZHVtbXkiIC8qIGZlY19waHlfY2xrICovIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtbSU1YNV9DTEtfRU5EXTsKIHN0YXRpYyBzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSBjbGtfZGF0YTsKQEAgLTU0Myw2ICs1NDQsMjUgQEAKIAljbGtbSU1YNV9DTEtfSTJDM19HQVRFXQkJPSBpbXhfY2xrX2dhdGUyKCJpMmMzX2dhdGUiLCAicGVyX3Jvb3QiLCBNWENfQ0NNX0NDR1IxLCAyMik7CiAJY2xrW0lNWDVfQ0xLX1NBVEFfR0FURV0JCT0gaW14X2Nsa19nYXRlMigic2F0YV9nYXRlIiwgImlwZyIsIE1YQ19DQ01fQ0NHUjQsIDIpOwogCisJY2xrW0lNWDVfQ0xLX0ZJUklfU0VMXQkJPSBpbXhfY2xrX211eCgiZmlyaV9zZWwiLCBNWENfQ0NNX0NTQ01SMiwgMTIsIDIsCisJCQkJCQlzdGFuZGFyZF9wbGxfc2VsLCBBUlJBWV9TSVpFKHN0YW5kYXJkX3BsbF9zZWwpKTsKKwljbGtbSU1YNV9DTEtfRklSSV9QUkVEXQkJPSBpbXhfY2xrX2RpdmlkZXIoImZpcmlfcHJlZCIsICJmaXJpX3NlbCIsIE1YQ19DQ01fQ1NDRFIzLCA2LCAzKTsKKwljbGtbSU1YNV9DTEtfRklSSV9QT0RGXQkJPSBpbXhfY2xrX2RpdmlkZXIoImZpcmlfcG9kZiIsICJmaXJpX3ByZWQiLCBNWENfQ0NNX0NTQ0RSMywgMCwgNik7CisJY2xrW0lNWDVfQ0xLX0ZJUklfU0VSSUFMX0dBVEVdCT0gaW14X2Nsa19nYXRlMigiZmlyaV9zZXJpYWxfZ2F0ZSIsICJmaXJpX3BvZGYiLCBNWENfQ0NNX0NDR1IxLCAyOCk7CisJY2xrW0lNWDVfQ0xLX0ZJUklfSVBHX0dBVEVdCT0gaW14X2Nsa19nYXRlMigiZmlyaV9pcGdfZ2F0ZSIsICJpcGciLCBNWENfQ0NNX0NDR1IxLCAyNik7CisKKwljbGtbSU1YNV9DTEtfQ1NJMF9NQ0xLMV9TRUxdCT0gaW14X2Nsa19tdXgoImNzaTBfbWNsazFfc2VsIiwgTVhDX0NDTV9DU0NNUjIsIDIyLCAyLAorCQkJCQkJc3RhbmRhcmRfcGxsX3NlbCwgQVJSQVlfU0laRShzdGFuZGFyZF9wbGxfc2VsKSk7CisJY2xrW0lNWDVfQ0xLX0NTSTBfTUNMSzFfUFJFRF0JPSBpbXhfY2xrX2RpdmlkZXIoImNzaTBfbWNsazFfcHJlZCIsICJjc2kwX21jbGsxX3NlbCIsIE1YQ19DQ01fQ1NDRFI0LCA2LCAzKTsKKwljbGtbSU1YNV9DTEtfQ1NJMF9NQ0xLMV9QT0RGXQk9IGlteF9jbGtfZGl2aWRlcigiY3NpMF9tY2xrMV9wb2RmIiwgImNzaTBfbWNsazFfcHJlZCIsIE1YQ19DQ01fQ1NDRFI0LCAwLCA2KTsKKwljbGtbSU1YNV9DTEtfQ1NJMF9NQ0xLMV9HQVRFXQk9IGlteF9jbGtfZ2F0ZTIoImNzaTBfbWNsazFfc2VyaWFsX2dhdGUiLCAiY3NpMF9tY2xrMV9wb2RmIiwgTVhDX0NDTV9DQ0dSNiwgNCk7CisKKwljbGtbSU1YNV9DTEtfSUVFRTE1ODhfU0VMXQk9IGlteF9jbGtfbXV4KCJpZWVlMTU4OF9zZWwiLCBNWENfQ0NNX0NTQ01SMiwgMTQsIDIsCisJCQkJCQlpZWVlMTU4OF9zZWxzLCBBUlJBWV9TSVpFKGllZWUxNTg4X3NlbHMpKTsKKwljbGtbSU1YNV9DTEtfSUVFRTE1ODhfUFJFRF0JPSBpbXhfY2xrX2RpdmlkZXIoImllZWUxNTg4X3ByZWQiLCAiaWVlZTE1ODhfc2VsIiwgTVhDX0NDTV9DU0NEUjIsIDYsIDMpOworCWNsa1tJTVg1X0NMS19JRUVFMTU4OF9QT0RGXQk9IGlteF9jbGtfZGl2aWRlcigiaWVlZTE1ODhfcG9kZiIsICJpZWVlMTU4OF9wcmVkIiwgTVhDX0NDTV9DU0NEUjIsIDAsIDYpOworCWNsa1tJTVg1X0NMS19JRUVFMTU4OF9HQVRFXQk9IGlteF9jbGtfZ2F0ZTIoImllZWUxNTg4X3NlcmlhbF9nYXRlIiwgImllZWUxNTg4X3BvZGYiLCBNWENfQ0NNX0NDR1I3LCA2KTsKKwogCWNsa1tJTVg1X0NMS19DS08xX1NFTF0JCT0gaW14X2Nsa19tdXgoImNrbzFfc2VsIiwgTVhDX0NDTV9DQ09TUiwgMCwgNCwKIAkJCQkJCW14NTNfY2tvMV9zZWwsIEFSUkFZX1NJWkUobXg1M19ja28xX3NlbCkpOwogCWNsa1tJTVg1X0NMS19DS08xX1BPREZdCQk9IGlteF9jbGtfZGl2aWRlcigiY2tvMV9wb2RmIiwgImNrbzFfc2VsIiwgTVhDX0NDTV9DQ09TUiwgNCwgMyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9pbXgvY2xrLWlteDZxLmMgYi9kcml2ZXJzL2Nsay9pbXgvY2xrLWlteDZxLmMKaW5kZXggYmExYzFhZS4uY2U4ZWExMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvaW14L2Nsay1pbXg2cS5jCisrKyBiL2RyaXZlcnMvY2xrL2lteC9jbGstaW14NnEuYwpAQCAtMzE4LDExICszMTgsMTYgQEAKIAkJY2xrW0lNWDZRRExfQ0xLX0lQR19QRVJfU0VMXSA9IGlteF9jbGtfbXV4KCJpcGdfcGVyX3NlbCIsIGJhc2UgKyAweDFjLCA2LCAxLCBpcGdfcGVyX3NlbHMsIEFSUkFZX1NJWkUoaXBnX3Blcl9zZWxzKSk7CiAJCWNsa1tJTVg2UURMX0NMS19VQVJUX1NFTF0gPSBpbXhfY2xrX211eCgidWFydF9zZWwiLCBiYXNlICsgMHgyNCwgNiwgMSwgdWFydF9zZWxzLCBBUlJBWV9TSVpFKHVhcnRfc2VscykpOwogCQljbGtbSU1YNlFETF9DTEtfR1BVMkRfQ09SRV9TRUxdID0gaW14X2Nsa19tdXgoImdwdTJkX2NvcmVfc2VsIiwgYmFzZSArIDB4MTgsIDE2LCAyLCBncHUyZF9jb3JlX3NlbHNfMiwgQVJSQVlfU0laRShncHUyZF9jb3JlX3NlbHNfMikpOworCX0gZWxzZSBpZiAoY2xrX29uX2lteDZkbCgpKSB7CisJCWNsa1tJTVg2UURMX0NMS19NTEJfU0VMXSA9IGlteF9jbGtfbXV4KCJtbGJfc2VsIiwgICBiYXNlICsgMHgxOCwgMTYsIDIsIGdwdTJkX2NvcmVfc2VscywgICBBUlJBWV9TSVpFKGdwdTJkX2NvcmVfc2VscykpOwogCX0gZWxzZSB7CiAJCWNsa1tJTVg2UURMX0NMS19HUFUyRF9DT1JFX1NFTF0gPSBpbXhfY2xrX211eCgiZ3B1MmRfY29yZV9zZWwiLCAgIGJhc2UgKyAweDE4LCAxNiwgMiwgZ3B1MmRfY29yZV9zZWxzLCAgIEFSUkFZX1NJWkUoZ3B1MmRfY29yZV9zZWxzKSk7CiAJfQogCWNsa1tJTVg2UURMX0NMS19HUFUzRF9DT1JFX1NFTF0gICA9IGlteF9jbGtfbXV4KCJncHUzZF9jb3JlX3NlbCIsICAgYmFzZSArIDB4MTgsIDQsICAyLCBncHUzZF9jb3JlX3NlbHMsICAgQVJSQVlfU0laRShncHUzZF9jb3JlX3NlbHMpKTsKLQljbGtbSU1YNlFETF9DTEtfR1BVM0RfU0hBREVSX1NFTF0gPSBpbXhfY2xrX211eCgiZ3B1M2Rfc2hhZGVyX3NlbCIsIGJhc2UgKyAweDE4LCA4LCAgMiwgZ3B1M2Rfc2hhZGVyX3NlbHMsIEFSUkFZX1NJWkUoZ3B1M2Rfc2hhZGVyX3NlbHMpKTsKKwlpZiAoY2xrX29uX2lteDZkbCgpKQorCQljbGtbSU1YNlFETF9DTEtfR1BVMkRfQ09SRV9TRUxdID0gaW14X2Nsa19tdXgoImdwdTJkX2NvcmVfc2VsIiwgYmFzZSArIDB4MTgsIDgsICAyLCBncHUzZF9zaGFkZXJfc2VscywgQVJSQVlfU0laRShncHUzZF9zaGFkZXJfc2VscykpOworCWVsc2UKKwkJY2xrW0lNWDZRRExfQ0xLX0dQVTNEX1NIQURFUl9TRUxdID0gaW14X2Nsa19tdXgoImdwdTNkX3NoYWRlcl9zZWwiLCBiYXNlICsgMHgxOCwgOCwgIDIsIGdwdTNkX3NoYWRlcl9zZWxzLCBBUlJBWV9TSVpFKGdwdTNkX3NoYWRlcl9zZWxzKSk7CiAJY2xrW0lNWDZRRExfQ0xLX0lQVTFfU0VMXSAgICAgICAgID0gaW14X2Nsa19tdXgoImlwdTFfc2VsIiwgICAgICAgICBiYXNlICsgMHgzYywgOSwgIDIsIGlwdV9zZWxzLCAgICAgICAgICBBUlJBWV9TSVpFKGlwdV9zZWxzKSk7CiAJY2xrW0lNWDZRRExfQ0xLX0lQVTJfU0VMXSAgICAgICAgID0gaW14X2Nsa19tdXgoImlwdTJfc2VsIiwgICAgICAgICBiYXNlICsgMHgzYywgMTQsIDIsIGlwdV9zZWxzLCAgICAgICAgICBBUlJBWV9TSVpFKGlwdV9zZWxzKSk7CiAJY2xrW0lNWDZRRExfQ0xLX0xEQl9ESTBfU0VMXSAgICAgID0gaW14X2Nsa19tdXhfZmxhZ3MoImxkYl9kaTBfc2VsIiwgYmFzZSArIDB4MmMsIDksICAzLCBsZGJfZGlfc2VscywgICAgICBBUlJBWV9TSVpFKGxkYl9kaV9zZWxzKSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CkBAIC00MDAsOSArNDA1LDE1IEBACiAJCWNsa1tJTVg2UURMX0NMS19MREJfREkwX0RJVl8zXzVdID0gaW14X2Nsa19maXhlZF9mYWN0b3IoImxkYl9kaTBfZGl2XzNfNSIsICJsZGJfZGkwX3NlbCIsIDIsIDcpOwogCQljbGtbSU1YNlFETF9DTEtfTERCX0RJMV9ESVZfM181XSA9IGlteF9jbGtfZml4ZWRfZmFjdG9yKCJsZGJfZGkxX2Rpdl8zXzUiLCAibGRiX2RpMV9zZWwiLCAyLCA3KTsKIAl9Ci0JY2xrW0lNWDZRRExfQ0xLX0dQVTJEX0NPUkVfUE9ERl0gID0gaW14X2Nsa19kaXZpZGVyKCJncHUyZF9jb3JlX3BvZGYiLCAgImdwdTJkX2NvcmVfc2VsIiwgICAgYmFzZSArIDB4MTgsIDIzLCAzKTsKKwlpZiAoY2xrX29uX2lteDZkbCgpKQorCQljbGtbSU1YNlFETF9DTEtfTUxCX1BPREZdICA9IGlteF9jbGtfZGl2aWRlcigibWxiX3BvZGYiLCAgIm1sYl9zZWwiLCAgICBiYXNlICsgMHgxOCwgMjMsIDMpOworCWVsc2UKKwkJY2xrW0lNWDZRRExfQ0xLX0dQVTJEX0NPUkVfUE9ERl0gID0gaW14X2Nsa19kaXZpZGVyKCJncHUyZF9jb3JlX3BvZGYiLCAgImdwdTJkX2NvcmVfc2VsIiwgICAgYmFzZSArIDB4MTgsIDIzLCAzKTsKIAljbGtbSU1YNlFETF9DTEtfR1BVM0RfQ09SRV9QT0RGXSAgPSBpbXhfY2xrX2RpdmlkZXIoImdwdTNkX2NvcmVfcG9kZiIsICAiZ3B1M2RfY29yZV9zZWwiLCAgICBiYXNlICsgMHgxOCwgMjYsIDMpOwotCWNsa1tJTVg2UURMX0NMS19HUFUzRF9TSEFERVJdICAgICA9IGlteF9jbGtfZGl2aWRlcigiZ3B1M2Rfc2hhZGVyIiwgICAgICJncHUzZF9zaGFkZXJfc2VsIiwgIGJhc2UgKyAweDE4LCAyOSwgMyk7CisJaWYgKGNsa19vbl9pbXg2ZGwoKSkKKwkJY2xrW0lNWDZRRExfQ0xLX0dQVTJEX0NPUkVfUE9ERl0gID0gaW14X2Nsa19kaXZpZGVyKCJncHUyZF9jb3JlX3BvZGYiLCAgICAgImdwdTJkX2NvcmVfc2VsIiwgIGJhc2UgKyAweDE4LCAyOSwgMyk7CisJZWxzZQorCQljbGtbSU1YNlFETF9DTEtfR1BVM0RfU0hBREVSXSAgICAgPSBpbXhfY2xrX2RpdmlkZXIoImdwdTNkX3NoYWRlciIsICAgICAiZ3B1M2Rfc2hhZGVyX3NlbCIsICBiYXNlICsgMHgxOCwgMjksIDMpOwogCWNsa1tJTVg2UURMX0NMS19JUFUxX1BPREZdICAgICAgICA9IGlteF9jbGtfZGl2aWRlcigiaXB1MV9wb2RmIiwgICAgICAgICJpcHUxX3NlbCIsICAgICAgICAgIGJhc2UgKyAweDNjLCAxMSwgMyk7CiAJY2xrW0lNWDZRRExfQ0xLX0lQVTJfUE9ERl0gICAgICAgID0gaW14X2Nsa19kaXZpZGVyKCJpcHUyX3BvZGYiLCAgICAgICAgImlwdTJfc2VsIiwgICAgICAgICAgYmFzZSArIDB4M2MsIDE2LCAzKTsKIAljbGtbSU1YNlFETF9DTEtfTERCX0RJMF9QT0RGXSAgICAgPSBpbXhfY2xrX2RpdmlkZXJfZmxhZ3MoImxkYl9kaTBfcG9kZiIsICJsZGJfZGkwX2Rpdl8zXzUiLCBiYXNlICsgMHgyMCwgMTAsIDEsIDApOwpAQCAtNDczLDE0ICs0ODQsNyBAQAogCWNsa1tJTVg2UURMX0NMS19FU0FJX01FTV0gICAgID0gaW14X2Nsa19nYXRlMl9zaGFyZWQoImVzYWlfbWVtIiwgImFoYiIsICAgICAgICAgICAgIGJhc2UgKyAweDZjLCAxNiwgJnNoYXJlX2NvdW50X2VzYWkpOwogCWNsa1tJTVg2UURMX0NMS19HUFRfSVBHXSAgICAgID0gaW14X2Nsa19nYXRlMigiZ3B0X2lwZyIsICAgICAgICJpcGciLCAgICAgICAgICAgICAgIGJhc2UgKyAweDZjLCAyMCk7CiAJY2xrW0lNWDZRRExfQ0xLX0dQVF9JUEdfUEVSXSAgPSBpbXhfY2xrX2dhdGUyKCJncHRfaXBnX3BlciIsICAgImlwZ19wZXIiLCAgICAgICAgICAgYmFzZSArIDB4NmMsIDIyKTsKLQlpZiAoY2xrX29uX2lteDZkbCgpKQotCQkvKgotCQkgKiBUaGUgbXVsdGlwbGV4ZXIgYW5kIGRpdmlkZXIgb2YgaW14NnEgY2xvY2sgZ3B1M2Rfc2hhZGVyIGdldAotCQkgKiByZWRlZmluZWQvcmV1c2VkIGFzIGdwdTJkX2NvcmVfc2VsIGFuZCBncHUyZF9jb3JlX3BvZGYgb24gaW14NmRsLgotCQkgKi8KLQkJY2xrW0lNWDZRRExfQ0xLX0dQVTJEX0NPUkVdID0gaW14X2Nsa19nYXRlMigiZ3B1MmRfY29yZSIsICJncHUzZF9zaGFkZXIiLCBiYXNlICsgMHg2YywgMjQpOwotCWVsc2UKLQkJY2xrW0lNWDZRRExfQ0xLX0dQVTJEX0NPUkVdID0gaW14X2Nsa19nYXRlMigiZ3B1MmRfY29yZSIsICJncHUyZF9jb3JlX3BvZGYiLCBiYXNlICsgMHg2YywgMjQpOworCWNsa1tJTVg2UURMX0NMS19HUFUyRF9DT1JFXSA9IGlteF9jbGtfZ2F0ZTIoImdwdTJkX2NvcmUiLCAiZ3B1MmRfY29yZV9wb2RmIiwgYmFzZSArIDB4NmMsIDI0KTsKIAljbGtbSU1YNlFETF9DTEtfR1BVM0RfQ09SRV0gICA9IGlteF9jbGtfZ2F0ZTIoImdwdTNkX2NvcmUiLCAgICAiZ3B1M2RfY29yZV9wb2RmIiwgICBiYXNlICsgMHg2YywgMjYpOwogCWNsa1tJTVg2UURMX0NMS19IRE1JX0lBSEJdICAgID0gaW14X2Nsa19nYXRlMigiaGRtaV9pYWhiIiwgICAgICJhaGIiLCAgICAgICAgICAgICAgIGJhc2UgKyAweDcwLCAwKTsKIAljbGtbSU1YNlFETF9DTEtfSERNSV9JU0ZSXSAgICA9IGlteF9jbGtfZ2F0ZTIoImhkbWlfaXNmciIsICAgICAidmlkZW9fMjdtIiwgICAgICAgICBiYXNlICsgMHg3MCwgNCk7CkBAIC01MTEsNyArNTE1LDcgQEAKIAkJICogVGhlIG11bHRpcGxleGVyIGFuZCBkaXZpZGVyIG9mIHRoZSBpbXg2cSBjbG9jayBncHUyZCBnZXQKIAkJICogcmVkZWZpbmVkL3JldXNlZCBhcyBtbGJfc3lzX3NlbCBhbmQgbWxiX3N5c19jbGtfcG9kZiBvbiBpbXg2ZGwuCiAJCSAqLwotCQljbGtbSU1YNlFETF9DTEtfTUxCXSA9IGlteF9jbGtfZ2F0ZTIoIm1sYiIsICAgICAgICAgICAgImdwdTJkX2NvcmVfcG9kZiIsICAgYmFzZSArIDB4NzQsIDE4KTsKKwkJY2xrW0lNWDZRRExfQ0xLX01MQl0gPSBpbXhfY2xrX2dhdGUyKCJtbGIiLCAgICAgICAgICAgICJtbGJfcG9kZiIsICAgYmFzZSArIDB4NzQsIDE4KTsKIAllbHNlCiAJCWNsa1tJTVg2UURMX0NMS19NTEJdID0gaW14X2Nsa19nYXRlMigibWxiIiwgICAgICAgICAgICAiYXhpIiwgICAgICAgICAgICAgICBiYXNlICsgMHg3NCwgMTgpOwogCWNsa1tJTVg2UURMX0NMS19NTURDX0NIMF9BWEldID0gaW14X2Nsa19nYXRlMigibW1kY19jaDBfYXhpIiwgICJtbWRjX2NoMF9heGlfcG9kZiIsIGJhc2UgKyAweDc0LCAyMCk7CkBAIC02MjksNiArNjMzLDI0IEBACiAJaWYgKElTX0VOQUJMRUQoQ09ORklHX1BDSV9JTVg2KSkKIAkJY2xrX3NldF9wYXJlbnQoY2xrW0lNWDZRRExfQ0xLX0xWRFMxX1NFTF0sIGNsa1tJTVg2UURMX0NMS19TQVRBX1JFRl8xMDBNXSk7CiAKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIEdQVSBjbG9jayBtdXhlcywgc28gdGhhdCB0aGUgbWF4aW11bSBzcGVjaWZpZWQgY2xvY2sKKwkgKiByYXRlcyBmb3IgdGhlIHJlc3BlY3RpdmUgU29DIGFyZSBub3QgZXhjZWVkZWQuCisJICovCisJaWYgKGNsa19vbl9pbXg2ZGwoKSkgeworCQljbGtfc2V0X3BhcmVudChjbGtbSU1YNlFETF9DTEtfR1BVM0RfQ09SRV9TRUxdLAorCQkJICAgICAgIGNsa1tJTVg2UURMX0NMS19QTEwyX1BGRDFfNTk0TV0pOworCQljbGtfc2V0X3BhcmVudChjbGtbSU1YNlFETF9DTEtfR1BVMkRfQ09SRV9TRUxdLAorCQkJICAgICAgIGNsa1tJTVg2UURMX0NMS19QTEwyX1BGRDFfNTk0TV0pOworCX0gZWxzZSBpZiAoY2xrX29uX2lteDZxKCkpIHsKKwkJY2xrX3NldF9wYXJlbnQoY2xrW0lNWDZRRExfQ0xLX0dQVTNEX0NPUkVfU0VMXSwKKwkJCSAgICAgICBjbGtbSU1YNlFETF9DTEtfTU1EQ19DSDBfQVhJXSk7CisJCWNsa19zZXRfcGFyZW50KGNsa1tJTVg2UURMX0NMS19HUFUzRF9TSEFERVJfU0VMXSwKKwkJCSAgICAgICBjbGtbSU1YNlFETF9DTEtfUExMMl9QRkQxXzU5NE1dKTsKKwkJY2xrX3NldF9wYXJlbnQoY2xrW0lNWDZRRExfQ0xLX0dQVTJEX0NPUkVfU0VMXSwKKwkJCSAgICAgICBjbGtbSU1YNlFETF9DTEtfUExMM19VU0JfT1RHXSk7CisJfQorCiAJaW14X3JlZ2lzdGVyX3VhcnRfY2xvY2tzKHVhcnRfY2xrcyk7CiB9CiBDTEtfT0ZfREVDTEFSRShpbXg2cSwgImZzbCxpbXg2cS1jY20iLCBpbXg2cV9jbG9ja3NfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9pbXgvY2xrLWlteDdkLmMgYi9kcml2ZXJzL2Nsay9pbXgvY2xrLWlteDdkLmMKaW5kZXggNmVkNGY4Zi4uZTdjNzM1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvaW14L2Nsay1pbXg3ZC5jCisrKyBiL2RyaXZlcnMvY2xrL2lteC9jbGstaW14N2QuYwpAQCAtMjIsNDMgKzIyLDYzIEBACiAKICNpbmNsdWRlICJjbGsuaCIKIAorc3RhdGljIHUzMiBzaGFyZV9jb3VudF9zYWkxOworc3RhdGljIHUzMiBzaGFyZV9jb3VudF9zYWkyOworc3RhdGljIHUzMiBzaGFyZV9jb3VudF9zYWkzOworCitzdGF0aWMgc3RydWN0IGNsa19kaXZfdGFibGUgdGVzdF9kaXZfdGFibGVbXSA9IHsKKwl7IC52YWwgPSAzLCAuZGl2ID0gMSwgfSwKKwl7IC52YWwgPSAyLCAuZGl2ID0gMSwgfSwKKwl7IC52YWwgPSAxLCAuZGl2ID0gMiwgfSwKKwl7IC52YWwgPSAwLCAuZGl2ID0gNCwgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2Rpdl90YWJsZSBwb3N0X2Rpdl90YWJsZVtdID0geworCXsgLnZhbCA9IDMsIC5kaXYgPSA0LCB9LAorCXsgLnZhbCA9IDIsIC5kaXYgPSAxLCB9LAorCXsgLnZhbCA9IDEsIC5kaXYgPSAyLCB9LAorCXsgLnZhbCA9IDAsIC5kaXYgPSAxLCB9LAorCXsgfQorfTsKKwogc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NbSU1YN0RfQ0xLX0VORF07CiBzdGF0aWMgY29uc3QgY2hhciAqYXJtX2E3X3NlbFtdID0geyAib3NjIiwgInBsbF9hcm1fbWFpbl9jbGsiLAogCSJwbGxfZW5ldF81MDBtX2NsayIsICJwbGxfZHJhbV9tYWluX2NsayIsCi0JInBsbF9zeXNfbWFpbl9jbGsiLCAicGxsX3N5c19wZmQwXzM5Mm1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsCisJInBsbF9zeXNfbWFpbl9jbGsiLCAicGxsX3N5c19wZmQwXzM5Mm1fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsCiAJInBsbF91c2JfbWFpbl9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqYXJtX200X3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfbWFpbl8yNDBtX2NsayIsCiAJInBsbF9lbmV0XzI1MG1fY2xrIiwgInBsbF9zeXNfcGZkMl8yNzBtX2NsayIsCi0JInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkicGxsX3VzYl9tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICphcm1fbTBfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19tYWluXzEyMG1fY2xrIiwKIAkicGxsX2VuZXRfMTI1bV9jbGsiLCAicGxsX3N5c19wZmQyXzEzNW1fY2xrIiwKLQkicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCisJInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAogCSJwbGxfdXNiX21haW5fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmF4aV9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX3BmZDFfMzMybV9jbGsiLAogCSJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfZW5ldF8yNTBtX2NsayIsICJwbGxfc3lzX3BmZDVfY2xrIiwKLQkicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsICJwbGxfc3lzX3BmZDdfY2xrIiwgfTsKKwkicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF92aWRlb19tYWluX2NsayIsICJwbGxfc3lzX3BmZDdfY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRpc3BfYXhpX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkMV8zMzJtX2NsayIsCiAJInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF9lbmV0XzI1MG1fY2xrIiwgInBsbF9zeXNfcGZkNl9jbGsiLAotCSJwbGxfc3lzX3BmZDdfY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCB9OworCSJwbGxfc3lzX3BmZDdfY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqZW5ldF9heGlfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19wZmQyXzI3MG1fY2xrIiwKIAkicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX2VuZXRfMjUwbV9jbGsiLAotCSJwbGxfc3lzX21haW5fMjQwbV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCisJInBsbF9zeXNfbWFpbl8yNDBtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkicGxsX3N5c19wZmQ0X2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpuYW5kX3VzZGhjX2J1c19zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX3BmZDJfMjcwbV9jbGsiLAogCSJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfc3lzX21haW5fMjQwbV9jbGsiLAogCSJwbGxfc3lzX3BmZDJfMTM1bV9jbGsiLCAicGxsX3N5c19wZmQ2X2NsayIsICJwbGxfZW5ldF8yNTBtX2NsayIsCi0JInBsbF9hdWRpb19tYWluX2NsayIsIH07CisJInBsbF9hdWRpb19wb3N0X2RpdiIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICphaGJfY2hhbm5lbF9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX3BmZDJfMjcwbV9jbGsiLAogCSJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfc3lzX3BmZDBfMzkybV9jbGsiLAotCSJwbGxfZW5ldF8xMjVtX2NsayIsICJwbGxfdXNiX21haW5fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsCisJInBsbF9lbmV0XzEyNW1fY2xrIiwgInBsbF91c2JfbWFpbl9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwKIAkicGxsX3ZpZGVvX21haW5fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyYW1fcGh5bV9zZWxbXSA9IHsgInBsbF9kcmFtX21haW5fY2xrIiwKQEAgLTY5LDEzICs4OSwxMyBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJhbV9waHltX2FsdF9zZWxbXSA9IHsgIm9zYyIsICJwbGxfZHJhbV81MzNtX2NsayIsCiAJInBsbF9zeXNfbWFpbl9jbGsiLCAicGxsX2VuZXRfNTAwbV9jbGsiLAotCSJwbGxfdXNiX21haW5fY2xrIiwgInBsbF9zeXNfcGZkN19jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwKKwkicGxsX3VzYl9tYWluX2NsayIsICJwbGxfc3lzX3BmZDdfY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsCiAJInBsbF92aWRlb19tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkcmFtX2FsdF9zZWxbXSA9IHsgIm9zYyIsICJwbGxfZHJhbV81MzNtX2NsayIsCiAJInBsbF9zeXNfbWFpbl9jbGsiLCAicGxsX2VuZXRfNTAwbV9jbGsiLAogCSJwbGxfZW5ldF8yNTBtX2NsayIsICJwbGxfc3lzX3BmZDBfMzkybV9jbGsiLAotCSJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX3N5c19wZmQyXzI3MG1fY2xrIiwgfTsKKwkicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF9zeXNfcGZkMl8yNzBtX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICp1c2JfaHNpY19zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX21haW5fY2xrIiwKIAkicGxsX3VzYl9tYWluX2NsayIsICJwbGxfc3lzX3BmZDNfY2xrIiwgInBsbF9zeXNfcGZkNF9jbGsiLApAQCAtMTAxLDUzICsxMjEsNTMgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKm1pcGlfZHNpX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkNV9jbGsiLAogCSJwbGxfc3lzX3BmZDNfY2xrIiwgInBsbF9zeXNfbWFpbl9jbGsiLCAicGxsX3N5c19wZmQwXzE5Nm1fY2xrIiwKLQkicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsIH07CisJInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWlwaV9jc2lfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19wZmQ0X2NsayIsCiAJInBsbF9zeXNfcGZkM19jbGsiLCAicGxsX3N5c19tYWluX2NsayIsICJwbGxfc3lzX3BmZDBfMTk2bV9jbGsiLAotCSJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwgfTsKKwkicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICptaXBpX2RwaHlfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19tYWluXzEyMG1fY2xrIiwKIAkicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX3N5c19wZmQ1X2NsayIsICJyZWZfMW1fY2xrIiwgImV4dF9jbGtfMiIsCiAJInBsbF92aWRlb19tYWluX2NsayIsICJleHRfY2xrXzMiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqc2FpMV9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX3BmZDJfMTM1bV9jbGsiLAotCSJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKKwkicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCiAJInBsbF9zeXNfcGZkNF9jbGsiLCAicGxsX2VuZXRfMTI1bV9jbGsiLCAiZXh0X2Nsa18yIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnNhaTJfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19wZmQyXzEzNW1fY2xrIiwKLQkicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCisJInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAogCSJwbGxfc3lzX3BmZDRfY2xrIiwgInBsbF9lbmV0XzEyNW1fY2xrIiwgImV4dF9jbGtfMiIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzYWkzX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsCi0JInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkicGxsX3N5c19wZmQ0X2NsayIsICJwbGxfZW5ldF8xMjVtX2NsayIsICJleHRfY2xrXzMiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3BkaWZfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19wZmQyXzEzNW1fY2xrIiwKLQkicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCisJInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAogCSJwbGxfc3lzX3BmZDRfY2xrIiwgInBsbF9lbmV0XzEyNW1fY2xrIiwgImV4dF8zX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICplbmV0MV9yZWZfc2VsW10gPSB7ICJvc2MiLCAicGxsX2VuZXRfMTI1bV9jbGsiLAogCSJwbGxfZW5ldF81MG1fY2xrIiwgInBsbF9lbmV0XzI1bV9jbGsiLAotCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCisJInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkiZXh0X2Nsa180IiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmVuZXQxX3RpbWVfc2VsW10gPSB7ICJvc2MiLCAicGxsX2VuZXRfMTAwbV9jbGsiLAotCSJwbGxfYXVkaW9fbWFpbl9jbGsiLCAiZXh0X2Nsa18xIiwgImV4dF9jbGtfMiIsICJleHRfY2xrXzMiLAorCSJwbGxfYXVkaW9fcG9zdF9kaXYiLCAiZXh0X2Nsa18xIiwgImV4dF9jbGtfMiIsICJleHRfY2xrXzMiLAogCSJleHRfY2xrXzQiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmVuZXQyX3JlZl9zZWxbXSA9IHsgIm9zYyIsICJwbGxfZW5ldF8xMjVtX2NsayIsCiAJInBsbF9lbmV0XzUwbV9jbGsiLCAicGxsX2VuZXRfMjVtX2NsayIsCi0JInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKKwkicGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAogCSJleHRfY2xrXzQiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqZW5ldDJfdGltZV9zZWxbXSA9IHsgIm9zYyIsICJwbGxfZW5ldF8xMDBtX2NsayIsCi0JInBsbF9hdWRpb19tYWluX2NsayIsICJleHRfY2xrXzEiLCAiZXh0X2Nsa18yIiwgImV4dF9jbGtfMyIsCisJInBsbF9hdWRpb19wb3N0X2RpdiIsICJleHRfY2xrXzEiLCAiZXh0X2Nsa18yIiwgImV4dF9jbGtfMyIsCiAJImV4dF9jbGtfNCIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqZW5ldF9waHlfcmVmX3NlbFtdID0geyAib3NjIiwgInBsbF9lbmV0XzI1bV9jbGsiLAogCSJwbGxfZW5ldF81MG1fY2xrIiwgInBsbF9lbmV0XzEyNW1fY2xrIiwKLQkicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCisJInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAogCSJwbGxfc3lzX3BmZDNfY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmVpbV9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX3BmZDJfMTM1bV9jbGsiLApAQCAtMTg4LDIyICsyMDgsMjIgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmkyYzFfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19tYWluXzEyMG1fY2xrIiwKIAkicGxsX2VuZXRfNTBtX2NsayIsICJwbGxfZHJhbV81MzNtX2NsayIsCi0JInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX3VzYl9tYWluX2NsayIsCisJInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX3VzYl9tYWluX2NsayIsCiAJInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICppMmMyX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsCiAJInBsbF9lbmV0XzUwbV9jbGsiLCAicGxsX2RyYW1fNTMzbV9jbGsiLAotCSJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgInBsbF91c2JfbWFpbl9jbGsiLAorCSJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgInBsbF91c2JfbWFpbl9jbGsiLAogCSJwbGxfc3lzX3BmZDJfMTM1bV9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqaTJjM19zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX21haW5fMTIwbV9jbGsiLAogCSJwbGxfZW5ldF81MG1fY2xrIiwgInBsbF9kcmFtXzUzM21fY2xrIiwKLQkicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsICJwbGxfdXNiX21haW5fY2xrIiwKKwkicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF92aWRlb19tYWluX2NsayIsICJwbGxfdXNiX21haW5fY2xrIiwKIAkicGxsX3N5c19wZmQyXzEzNW1fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmkyYzRfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19tYWluXzEyMG1fY2xrIiwKIAkicGxsX2VuZXRfNTBtX2NsayIsICJwbGxfZHJhbV81MzNtX2NsayIsCi0JInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX3VzYl9tYWluX2NsayIsCisJInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX3VzYl9tYWluX2NsayIsCiAJInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICp1YXJ0MV9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX21haW5fMjQwbV9jbGsiLApAQCAtMjYyLDMyICsyODIsMzIgQEAKIAkicGxsX3VzYl9tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpwd20xX3NlbFtdID0geyAib3NjIiwgInBsbF9lbmV0XzEwMG1fY2xrIiwKLQkicGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9lbmV0XzQwbV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwKKwkicGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9lbmV0XzQwbV9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwKIAkiZXh0X2Nsa18xIiwgInJlZl8xbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnB3bTJfc2VsW10gPSB7ICJvc2MiLCAicGxsX2VuZXRfMTAwbV9jbGsiLAotCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2VuZXRfNDBtX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLAorCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2VuZXRfNDBtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLAogCSJleHRfY2xrXzEiLCAicmVmXzFtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqcHdtM19zZWxbXSA9IHsgIm9zYyIsICJwbGxfZW5ldF8xMDBtX2NsayIsCi0JInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsCisJInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsCiAJImV4dF9jbGtfMiIsICJyZWZfMW1fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpwd200X3NlbFtdID0geyAib3NjIiwgInBsbF9lbmV0XzEwMG1fY2xrIiwKLQkicGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9lbmV0XzQwbV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwKKwkicGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9lbmV0XzQwbV9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwKIAkiZXh0X2Nsa18yIiwgInJlZl8xbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmZsZXh0aW1lcjFfc2VsW10gPSB7ICJvc2MiLCAicGxsX2VuZXRfMTAwbV9jbGsiLAotCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2VuZXRfNDBtX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLAorCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2VuZXRfNDBtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLAogCSJleHRfY2xrXzMiLCAicmVmXzFtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqZmxleHRpbWVyMl9zZWxbXSA9IHsgIm9zYyIsICJwbGxfZW5ldF8xMDBtX2NsayIsCi0JInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsCisJInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsCiAJImV4dF9jbGtfMyIsICJyZWZfMW1fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzaW0xX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsCiAJInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZHJhbV81MzNtX2NsayIsCi0JInBsbF91c2JfbWFpbl9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF9lbmV0XzEyNW1fY2xrIiwKKwkicGxsX3VzYl9tYWluX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX2VuZXRfMTI1bV9jbGsiLAogCSJwbGxfc3lzX3BmZDdfY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnNpbTJfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19wZmQyXzEzNW1fY2xrIiwKQEAgLTI5NywxOSArMzE3LDE5IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICpncHQxX3NlbFtdID0geyAib3NjIiwgInBsbF9lbmV0XzEwMG1fY2xrIiwKIAkicGxsX3N5c19wZmQwXzM5Mm1fY2xrIiwgInBsbF9lbmV0XzQwbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKLQkicmVmXzFtX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLCAiZXh0X2Nsa18xIiwgfTsKKwkicmVmXzFtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAiZXh0X2Nsa18xIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmdwdDJfc2VsW10gPSB7ICJvc2MiLCAicGxsX2VuZXRfMTAwbV9jbGsiLAogCSJwbGxfc3lzX3BmZDBfMzkybV9jbGsiLCAicGxsX2VuZXRfNDBtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAotCSJyZWZfMW1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJleHRfY2xrXzIiLCB9OworCSJyZWZfMW1fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsICJleHRfY2xrXzIiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqZ3B0M19zZWxbXSA9IHsgIm9zYyIsICJwbGxfZW5ldF8xMDBtX2NsayIsCiAJInBsbF9zeXNfcGZkMF8zOTJtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCi0JInJlZl8xbV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwgImV4dF9jbGtfMyIsIH07CisJInJlZl8xbV9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgImV4dF9jbGtfMyIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpncHQ0X3NlbFtdID0geyAib3NjIiwgInBsbF9lbmV0XzEwMG1fY2xrIiwKIAkicGxsX3N5c19wZmQwXzM5Mm1fY2xrIiwgInBsbF9lbmV0XzQwbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKLQkicmVmXzFtX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLCAiZXh0X2Nsa180IiwgfTsKKwkicmVmXzFtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAiZXh0X2Nsa180IiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnRyYWNlX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsCiAJInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZHJhbV81MzNtX2NsayIsCkBAIC0zMjMsMTIgKzM0MywxMiBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqY3NpX21jbGtfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19wZmQyXzEzNW1fY2xrIiwKIAkicGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9kcmFtXzUzM21fY2xrIiwKLQkicGxsX2VuZXRfMTI1bV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCisJInBsbF9lbmV0XzEyNW1fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAogCSJwbGxfdXNiX21haW5fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmF1ZGlvX21jbGtfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19wZmQyXzEzNW1fY2xrIiwKIAkicGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9kcmFtXzUzM21fY2xrIiwKLQkicGxsX2VuZXRfMTI1bV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCisJInBsbF9lbmV0XzEyNW1fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAogCSJwbGxfdXNiX21haW5fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKndyY2xrX3NlbFtdID0geyAib3NjIiwgInBsbF9lbmV0XzQwbV9jbGsiLApAQCAtMzQyLDEzICszNjIsMTMgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmNsa28yX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfbWFpbl8yNDBtX2NsayIsCiAJInBsbF9zeXNfcGZkMF8zOTJtX2NsayIsICJwbGxfc3lzX3BmZDFfMTY2bV9jbGsiLCAicGxsX3N5c19wZmQ0X2NsayIsCi0JInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAiY2tpbCIsIH07CisJInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAiY2tpbCIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpsdmRzMV9zZWxbXSA9IHsgInBsbF9hcm1fbWFpbl9jbGsiLAogCSJwbGxfc3lzX21haW5fY2xrIiwgInBsbF9zeXNfcGZkMF8zOTJtX2NsayIsICJwbGxfc3lzX3BmZDFfMzMybV9jbGsiLAogCSJwbGxfc3lzX3BmZDJfMjcwbV9jbGsiLCAicGxsX3N5c19wZmQzX2NsayIsICJwbGxfc3lzX3BmZDRfY2xrIiwKIAkicGxsX3N5c19wZmQ1X2NsayIsICJwbGxfc3lzX3BmZDZfY2xrIiwgInBsbF9zeXNfcGZkN19jbGsiLAotCSJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgInBsbF9lbmV0XzUwMG1fY2xrIiwKKwkicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF92aWRlb19tYWluX2NsayIsICJwbGxfZW5ldF81MDBtX2NsayIsCiAJInBsbF9lbmV0XzI1MG1fY2xrIiwgInBsbF9lbmV0XzEyNW1fY2xrIiwgInBsbF9lbmV0XzEwMG1fY2xrIiwKIAkicGxsX2VuZXRfNTBtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF9lbmV0XzI1bV9jbGsiLAogCSJwbGxfZHJhbV9tYWluX2NsayIsIH07CkBAIC00MzAsNiArNDUwLDExIEBACiAJY2xrc1tJTVg3RF9QTExfQVVESU9fTUFJTl9DTEtdID0gaW14X2Nsa19nYXRlKCJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX2F1ZGlvX21haW5fYnlwYXNzIiwgYmFzZSArIDB4ZjAsIDEzKTsKIAljbGtzW0lNWDdEX1BMTF9WSURFT19NQUlOX0NMS10gPSBpbXhfY2xrX2dhdGUoInBsbF92aWRlb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9ieXBhc3MiLCBiYXNlICsgMHgxMzAsIDEzKTsKIAorCWNsa3NbSU1YN0RfUExMX0FVRElPX1RFU1RfRElWXSAgPSBjbGtfcmVnaXN0ZXJfZGl2aWRlcl90YWJsZShOVUxMLCAicGxsX2F1ZGlvX3Rlc3RfZGl2IiwgInBsbF9hdWRpb19tYWluX2NsayIsCisJCQkJQ0xLX1NFVF9SQVRFX1BBUkVOVCB8IENMS19TRVRfUkFURV9HQVRFLCBiYXNlICsgMHhmMCwgMTksIDIsIDAsIHRlc3RfZGl2X3RhYmxlLCAmaW14X2NjbV9sb2NrKTsKKwljbGtzW0lNWDdEX1BMTF9BVURJT19QT1NUX0RJVl0gPSBjbGtfcmVnaXN0ZXJfZGl2aWRlcl90YWJsZShOVUxMLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF9hdWRpb190ZXN0X2RpdiIsCisJCQkJQ0xLX1NFVF9SQVRFX1BBUkVOVCB8IENMS19TRVRfUkFURV9HQVRFLCBiYXNlICsgMHhmMCwgMjIsIDIsIDAsIHBvc3RfZGl2X3RhYmxlLCAmaW14X2NjbV9sb2NrKTsKKwogCWNsa3NbSU1YN0RfUExMX1NZU19QRkQwXzM5Mk1fQ0xLXSA9IGlteF9jbGtfcGZkKCJwbGxfc3lzX3BmZDBfMzkybV9jbGsiLCAicGxsX3N5c19tYWluX2NsayIsIGJhc2UgKyAweGMwLCAwKTsKIAljbGtzW0lNWDdEX1BMTF9TWVNfUEZEMV8zMzJNX0NMS10gPSBpbXhfY2xrX3BmZCgicGxsX3N5c19wZmQxXzMzMm1fY2xrIiwgInBsbF9zeXNfbWFpbl9jbGsiLCBiYXNlICsgMHhjMCwgMSk7CiAJY2xrc1tJTVg3RF9QTExfU1lTX1BGRDJfMjcwTV9DTEtdID0gaW14X2Nsa19wZmQoInBsbF9zeXNfcGZkMl8yNzBtX2NsayIsICJwbGxfc3lzX21haW5fY2xrIiwgYmFzZSArIDB4YzAsIDIpOwpAQCAtNzc5LDYgKzgwNCw3IEBACiAJY2xrc1tJTVg3RF9EUkFNX1BIWU1fQUxUX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoImRyYW1fcGh5bV9hbHRfcm9vdF9jbGsiLCAiZHJhbV9waHltX2FsdF9wb3N0X2RpdiIsIGJhc2UgKyAweDQxMzAsIDApOwogCWNsa3NbSU1YN0RfRFJBTV9BTFRfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlNCgiZHJhbV9hbHRfcm9vdF9jbGsiLCAiZHJhbV9hbHRfcG9zdF9kaXYiLCBiYXNlICsgMHg0MTMwLCAwKTsKIAljbGtzW0lNWDdEX1VTQl9IU0lDX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoInVzYl9oc2ljX3Jvb3RfY2xrIiwgInVzYl9oc2ljX3Bvc3RfZGl2IiwgYmFzZSArIDB4NDQyMCwgMCk7CisJY2xrc1tJTVg3RF9TRE1BX0NPUkVfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoInNkbWFfcm9vdF9jbGsiLCAiYWhiX3Jvb3RfY2xrIiwgYmFzZSArIDB4NDQ4MCwgMCk7CiAJY2xrc1tJTVg3RF9QQ0lFX0NUUkxfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlNCgicGNpZV9jdHJsX3Jvb3RfY2xrIiwgInBjaWVfY3RybF9wb3N0X2RpdiIsIGJhc2UgKyAweDQ2MDAsIDApOwogCWNsa3NbSU1YN0RfUENJRV9QSFlfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlNCgicGNpZV9waHlfcm9vdF9jbGsiLCAicGNpZV9waHlfcG9zdF9kaXYiLCBiYXNlICsgMHg0NjAwLCAwKTsKIAljbGtzW0lNWDdEX0VQRENfUElYRUxfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlNCgiZXBkY19waXhlbF9yb290X2NsayIsICJlcGRjX3BpeGVsX3Bvc3RfZGl2IiwgYmFzZSArIDB4NDRhMCwgMCk7CkBAIC03ODYsOSArODEyLDEyIEBACiAJY2xrc1tJTVg3RF9NSVBJX0RTSV9ST09UX0NMS10gPSBpbXhfY2xrX2dhdGU0KCJtaXBpX2RzaV9yb290X2NsayIsICJtaXBpX2RzaV9wb3N0X2RpdiIsIGJhc2UgKyAweDQ2NTAsIDApOwogCWNsa3NbSU1YN0RfTUlQSV9DU0lfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlNCgibWlwaV9jc2lfcm9vdF9jbGsiLCAibWlwaV9jc2lfcG9zdF9kaXYiLCBiYXNlICsgMHg0NjQwLCAwKTsKIAljbGtzW0lNWDdEX01JUElfRFBIWV9ST09UX0NMS10gPSBpbXhfY2xrX2dhdGU0KCJtaXBpX2RwaHlfcm9vdF9jbGsiLCAibWlwaV9kcGh5X3Bvc3RfZGl2IiwgYmFzZSArIDB4NDY2MCwgMCk7Ci0JY2xrc1tJTVg3RF9TQUkxX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoInNhaTFfcm9vdF9jbGsiLCAic2FpMV9wb3N0X2RpdiIsIGJhc2UgKyAweDQ4YzAsIDApOwotCWNsa3NbSU1YN0RfU0FJMl9ST09UX0NMS10gPSBpbXhfY2xrX2dhdGU0KCJzYWkyX3Jvb3RfY2xrIiwgInNhaTJfcG9zdF9kaXYiLCBiYXNlICsgMHg0OGQwLCAwKTsKLQljbGtzW0lNWDdEX1NBSTNfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlNCgic2FpM19yb290X2NsayIsICJzYWkzX3Bvc3RfZGl2IiwgYmFzZSArIDB4NDhlMCwgMCk7CisJY2xrc1tJTVg3RF9TQUkxX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTJfc2hhcmVkMigic2FpMV9yb290X2NsayIsICJzYWkxX3Bvc3RfZGl2IiwgYmFzZSArIDB4NDhjMCwgMCwgJnNoYXJlX2NvdW50X3NhaTEpOworCWNsa3NbSU1YN0RfU0FJMV9JUEdfQ0xLXSAgPSBpbXhfY2xrX2dhdGUyX3NoYXJlZDIoInNhaTFfaXBnX2NsayIsICAiaXBnX3Jvb3RfY2xrIiwgIGJhc2UgKyAweDQ4YzAsIDAsICZzaGFyZV9jb3VudF9zYWkxKTsKKwljbGtzW0lNWDdEX1NBSTJfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlMl9zaGFyZWQyKCJzYWkyX3Jvb3RfY2xrIiwgInNhaTJfcG9zdF9kaXYiLCBiYXNlICsgMHg0OGQwLCAwLCAmc2hhcmVfY291bnRfc2FpMik7CisJY2xrc1tJTVg3RF9TQUkyX0lQR19DTEtdICA9IGlteF9jbGtfZ2F0ZTJfc2hhcmVkMigic2FpMl9pcGdfY2xrIiwgICJpcGdfcm9vdF9jbGsiLCAgYmFzZSArIDB4NDhkMCwgMCwgJnNoYXJlX2NvdW50X3NhaTIpOworCWNsa3NbSU1YN0RfU0FJM19ST09UX0NMS10gPSBpbXhfY2xrX2dhdGUyX3NoYXJlZDIoInNhaTNfcm9vdF9jbGsiLCAic2FpM19wb3N0X2RpdiIsIGJhc2UgKyAweDQ4ZTAsIDAsICZzaGFyZV9jb3VudF9zYWkzKTsKKwljbGtzW0lNWDdEX1NBSTNfSVBHX0NMS10gID0gaW14X2Nsa19nYXRlMl9zaGFyZWQyKCJzYWkzX2lwZ19jbGsiLCAgImlwZ19yb290X2NsayIsICBiYXNlICsgMHg0OGUwLCAwLCAmc2hhcmVfY291bnRfc2FpMyk7CiAJY2xrc1tJTVg3RF9TUERJRl9ST09UX0NMS10gPSBpbXhfY2xrX2dhdGU0KCJzcGRpZl9yb290X2NsayIsICJzcGRpZl9wb3N0X2RpdiIsIGJhc2UgKyAweDQ0ZDAsIDApOwogCWNsa3NbSU1YN0RfRU5FVDFfUkVGX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoImVuZXQxX3JlZl9yb290X2NsayIsICJlbmV0MV9yZWZfcG9zdF9kaXYiLCBiYXNlICsgMHg0NGUwLCAwKTsKIAljbGtzW0lNWDdEX0VORVQxX1RJTUVfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlNCgiZW5ldDFfdGltZV9yb290X2NsayIsICJlbmV0MV90aW1lX3Bvc3RfZGl2IiwgYmFzZSArIDB4NDRmMCwgMCk7CkBAIC04NjAsOCArODg5LDYgQEAKIAkvKiB1c2Ugb2xkIGdwdCBjbGsgc2V0dGluZywgZ3B0MSByb290IGNsayBtdXN0IGJlIHR3aWNlIGFzIGdwdCBjb3VudGVyIGZyZXEgKi8KIAljbGtfc2V0X3BhcmVudChjbGtzW0lNWDdEX0dQVDFfUk9PVF9TUkNdLCBjbGtzW0lNWDdEX09TQ18yNE1fQ0xLXSk7CiAKLQljbGtfc2V0X3BhcmVudChjbGtzW0lNWDdEX0VORVRfQVhJX1JPT1RfU1JDXSwgY2xrc1tJTVg3RF9QTExfRU5FVF9NQUlOXzI1ME1fQ0xLXSk7Ci0KIAkvKiBzZXQgdWFydCBtb2R1bGUgY2xvY2sncyBwYXJlbnQgY2xvY2sgc291cmNlIHRoYXQgbXVzdCBiZSBncmVhdCB0aGVuIDgwTUh6ICovCiAJY2xrX3NldF9wYXJlbnQoY2xrc1tJTVg3RF9VQVJUMV9ST09UX1NSQ10sIGNsa3NbSU1YN0RfT1NDXzI0TV9DTEtdKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvaW14L2Nsay5oIGIvZHJpdmVycy9jbGsvaW14L2Nsay5oCmluZGV4IGE4MWMwMzguLjM3OTlmZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2lteC9jbGsuaAorKysgYi9kcml2ZXJzL2Nsay9pbXgvY2xrLmgKQEAgLTEzNCw2ICsxMzQsMTUgQEAKIAkJCXNoaWZ0LCAweDMsIDAsICZpbXhfY2NtX2xvY2ssIHNoYXJlX2NvdW50KTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgY2xrICppbXhfY2xrX2dhdGUyX3NoYXJlZDIoY29uc3QgY2hhciAqbmFtZSwKKwkJY29uc3QgY2hhciAqcGFyZW50LCB2b2lkIF9faW9tZW0gKnJlZywgdTggc2hpZnQsCisJCXVuc2lnbmVkIGludCAqc2hhcmVfY291bnQpCit7CisJcmV0dXJuIGNsa19yZWdpc3Rlcl9nYXRlMihOVUxMLCBuYW1lLCBwYXJlbnQsIENMS19TRVRfUkFURV9QQVJFTlQgfAorCQkJCSAgQ0xLX09QU19QQVJFTlRfRU5BQkxFLCByZWcsIHNoaWZ0LCAweDMsIDAsCisJCQkJICAmaW14X2NjbV9sb2NrLCBzaGFyZV9jb3VudCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNsayAqaW14X2Nsa19nYXRlMl9jZ3IoY29uc3QgY2hhciAqbmFtZSwKIAkJY29uc3QgY2hhciAqcGFyZW50LCB2b2lkIF9faW9tZW0gKnJlZywgdTggc2hpZnQsIHU4IGNncl92YWwpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9sb29uZ3NvbjEvTWFrZWZpbGUgYi9kcml2ZXJzL2Nsay9sb29uZ3NvbjEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmNmExNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL2xvb25nc29uMS9NYWtlZmlsZQpAQCAtMCwwICsxLDMgQEAKK29iai15CQkJCSs9IGNsay5vCitvYmotJChDT05GSUdfTE9PTkdTT04xX0xTMUIpCSs9IGNsay1sb29uZ3NvbjFiLm8KK29iai0kKENPTkZJR19MT09OR1NPTjFfTFMxQykJKz0gY2xrLWxvb25nc29uMWMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbG9vbmdzb24xL2Nsay1sb29uZ3NvbjFiLmMgYi9kcml2ZXJzL2Nsay9sb29uZ3NvbjEvY2xrLWxvb25nc29uMWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzZhOTdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvbG9vbmdzb24xL2Nsay1sb29uZ3NvbjFiLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiBaaGFuZywgS2VndWFuZyA8a2VndWFuZy56aGFuZ0BnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgPGxvb25nc29uMS5oPgorI2luY2x1ZGUgImNsay5oIgorCisjZGVmaW5lIE9TQwkJKDMzICogMTAwMDAwMCkKKyNkZWZpbmUgRElWX0FQQgkJMgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKF9sb2NrKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbHMxeF9wbGxfcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCisJCQkJCSAgdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKK3sKKwl1MzIgcGxsLCByYXRlOworCisJcGxsID0gX19yYXdfcmVhZGwoTFMxWF9DTEtfUExMX0ZSRVEpOworCXJhdGUgPSAxMiArIChwbGwgJiBHRU5NQVNLKDUsIDApKTsKKwlyYXRlICo9IE9TQzsKKwlyYXRlID4+PSAxOworCisJcmV0dXJuIHJhdGU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBsczF4X3BsbF9jbGtfb3BzID0geworCS5yZWNhbGNfcmF0ZSA9IGxzMXhfcGxsX3JlY2FsY19yYXRlLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNwdV9wYXJlbnRzW10gPSB7ICJjcHVfY2xrX2RpdiIsICJvc2NfY2xrIiwgfTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhaGJfcGFyZW50c1tdID0geyAiYWhiX2Nsa19kaXYiLCAib3NjX2NsayIsIH07CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZGNfcGFyZW50c1tdID0geyAiZGNfY2xrX2RpdiIsICJvc2NfY2xrIiwgfTsKKwordm9pZCBfX2luaXQgbHMxeF9jbGtfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjbGtfaHcgKmh3OworCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAib3NjX2NsayIsIE5VTEwsIDAsIE9TQyk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgIm9zY19jbGsiLCBOVUxMKTsKKworCS8qIGNsb2NrIGRlcml2ZWQgZnJvbSAzMyBNSHogT1NDIGNsayAqLworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX3BsbChOVUxMLCAicGxsX2NsayIsICJvc2NfY2xrIiwKKwkJCQkgJmxzMXhfcGxsX2Nsa19vcHMsIDApOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJwbGxfY2xrIiwgTlVMTCk7CisKKwkvKiBjbG9jayBkZXJpdmVkIGZyb20gUExMIGNsayAqLworCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX18KKwkgKiAgICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19ffCAgICAgfAorCSAqIE9TQyBfX18vICAgICAgICAgICAgICAgICAgICAgICB8IE1VWCB8X19fIENQVSBDTEsKKwkgKiAgICAgICAgXF9fXyBQTEwgX19fIENQVSBESVYgX19ffCAgICAgfAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX198CisJICovCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZGl2aWRlcihOVUxMLCAiY3B1X2Nsa19kaXYiLCAicGxsX2NsayIsCisJCQkJICAgQ0xLX0dFVF9SQVRFX05PQ0FDSEUsIExTMVhfQ0xLX1BMTF9ESVYsCisJCQkJICAgRElWX0NQVV9TSElGVCwgRElWX0NQVV9XSURUSCwKKwkJCQkgICBDTEtfRElWSURFUl9PTkVfQkFTRUQgfAorCQkJCSAgIENMS19ESVZJREVSX1JPVU5EX0NMT1NFU1QsICZfbG9jayk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImNwdV9jbGtfZGl2IiwgTlVMTCk7CisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfbXV4KE5VTEwsICJjcHVfY2xrIiwgY3B1X3BhcmVudHMsCisJCQkgICAgICAgQVJSQVlfU0laRShjcHVfcGFyZW50cyksCisJCQkgICAgICAgQ0xLX1NFVF9SQVRFX05PX1JFUEFSRU5ULCBMUzFYX0NMS19QTExfRElWLAorCQkJICAgICAgIEJZUEFTU19DUFVfU0hJRlQsIEJZUEFTU19DUFVfV0lEVEgsIDAsICZfbG9jayk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImNwdV9jbGsiLCBOVUxMKTsKKworCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX18KKwkgKiAgICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19ffCAgICAgfAorCSAqIE9TQyBfX18vICAgICAgICAgICAgICAgICAgICAgICB8IE1VWCB8X19fIERDICBDTEsKKwkgKiAgICAgICAgXF9fXyBQTEwgX19fIERDICBESVYgX19ffCAgICAgfAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX198CisJICovCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZGl2aWRlcihOVUxMLCAiZGNfY2xrX2RpdiIsICJwbGxfY2xrIiwKKwkJCQkgICAwLCBMUzFYX0NMS19QTExfRElWLCBESVZfRENfU0hJRlQsCisJCQkJICAgRElWX0RDX1dJRFRILCBDTEtfRElWSURFUl9PTkVfQkFTRUQsICZfbG9jayk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImRjX2Nsa19kaXYiLCBOVUxMKTsKKwlodyA9IGNsa19od19yZWdpc3Rlcl9tdXgoTlVMTCwgImRjX2NsayIsIGRjX3BhcmVudHMsCisJCQkgICAgICAgQVJSQVlfU0laRShkY19wYXJlbnRzKSwKKwkJCSAgICAgICBDTEtfU0VUX1JBVEVfTk9fUkVQQVJFTlQsIExTMVhfQ0xLX1BMTF9ESVYsCisJCQkgICAgICAgQllQQVNTX0RDX1NISUZULCBCWVBBU1NfRENfV0lEVEgsIDAsICZfbG9jayk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImRjX2NsayIsIE5VTEwpOworCisJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fXworCSAqICAgICAgICAgX19fX19fX19fX19fX19fX19fX19fX198ICAgICB8CisJICogT1NDIF9fXy8gICAgICAgICAgICAgICAgICAgICAgIHwgTVVYIHxfX18gRERSIENMSworCSAqICAgICAgICBcX19fIFBMTCBfX18gRERSIERJViBfX198ICAgICB8CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wKKwkgKi8KKwlodyA9IGNsa19od19yZWdpc3Rlcl9kaXZpZGVyKE5VTEwsICJhaGJfY2xrX2RpdiIsICJwbGxfY2xrIiwKKwkJCQkgICAwLCBMUzFYX0NMS19QTExfRElWLCBESVZfRERSX1NISUZULAorCQkJCSAgIERJVl9ERFJfV0lEVEgsIENMS19ESVZJREVSX09ORV9CQVNFRCwKKwkJCQkgICAmX2xvY2spOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJhaGJfY2xrX2RpdiIsIE5VTEwpOworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX211eChOVUxMLCAiYWhiX2NsayIsIGFoYl9wYXJlbnRzLAorCQkJICAgICAgIEFSUkFZX1NJWkUoYWhiX3BhcmVudHMpLAorCQkJICAgICAgIENMS19TRVRfUkFURV9OT19SRVBBUkVOVCwgTFMxWF9DTEtfUExMX0RJViwKKwkJCSAgICAgICBCWVBBU1NfRERSX1NISUZULCBCWVBBU1NfRERSX1dJRFRILCAwLCAmX2xvY2spOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJhaGJfY2xrIiwgTlVMTCk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImxzMXgtZG1hIiwgTlVMTCk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgInN0bW1hY2V0aCIsIE5VTEwpOworCisJLyogY2xvY2sgZGVyaXZlZCBmcm9tIEFIQiBjbGsgKi8KKwkvKiBBUEIgY2xrIGlzIGFsd2F5cyBoYWxmIG9mIHRoZSBBSEIgY2xrICovCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsICJhcGJfY2xrIiwgImFoYl9jbGsiLCAwLCAxLAorCQkJCQlESVZfQVBCKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAiYXBiX2NsayIsIE5VTEwpOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJsczF4LWFjOTciLCBOVUxMKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAibHMxeC1pMmMiLCBOVUxMKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAibHMxeC1uYW5kIiwgTlVMTCk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImxzMXgtcHdtdGltZXIiLCBOVUxMKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAibHMxeC1zcGkiLCBOVUxMKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAibHMxeC13ZHQiLCBOVUxMKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAic2VyaWFsODI1MCIsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbG9vbmdzb24xL2Nsay1sb29uZ3NvbjFjLmMgYi9kcml2ZXJzL2Nsay9sb29uZ3NvbjEvY2xrLWxvb25nc29uMWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDY2ZjczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvbG9vbmdzb24xL2Nsay1sb29uZ3NvbjFjLmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBZYW5nIExpbmcgPGduYXlnbmlsQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKworI2luY2x1ZGUgPGxvb25nc29uMS5oPgorI2luY2x1ZGUgImNsay5oIgorCisjZGVmaW5lIE9TQwkJKDI0ICogMTAwMDAwMCkKKyNkZWZpbmUgRElWX0FQQgkJMQorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKF9sb2NrKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbHMxeF9wbGxfcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCisJCQkJCSAgdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKK3sKKwl1MzIgcGxsLCByYXRlOworCisJcGxsID0gX19yYXdfcmVhZGwoTFMxWF9DTEtfUExMX0ZSRVEpOworCXJhdGUgPSAoKHBsbCA+PiA4KSAmIDB4ZmYpICsgKChwbGwgPj4gMTYpICYgMHhmZik7CisJcmF0ZSAqPSBPU0M7CisJcmF0ZSA+Pj0gMjsKKworCXJldHVybiByYXRlOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgbHMxeF9wbGxfY2xrX29wcyA9IHsKKwkucmVjYWxjX3JhdGUgPSBsczF4X3BsbF9yZWNhbGNfcmF0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2Rpdl90YWJsZSBhaGJfZGl2X3RhYmxlW10gPSB7CisJWzBdID0geyAudmFsID0gMCwgLmRpdiA9IDIgfSwKKwlbMV0gPSB7IC52YWwgPSAxLCAuZGl2ID0gNCB9LAorCVsyXSA9IHsgLnZhbCA9IDIsIC5kaXYgPSAzIH0sCisJWzNdID0geyAudmFsID0gMywgLmRpdiA9IDMgfSwKK307CisKK3ZvaWQgX19pbml0IGxzMXhfY2xrX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgIm9zY19jbGsiLCBOVUxMLCAwLCBPU0MpOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJvc2NfY2xrIiwgTlVMTCk7CisKKwkvKiBjbG9jayBkZXJpdmVkIGZyb20gMjQgTUh6IE9TQyBjbGsgKi8KKwlodyA9IGNsa19od19yZWdpc3Rlcl9wbGwoTlVMTCwgInBsbF9jbGsiLCAib3NjX2NsayIsCisJCQkJJmxzMXhfcGxsX2Nsa19vcHMsIDApOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJwbGxfY2xrIiwgTlVMTCk7CisKKwlodyA9IGNsa19od19yZWdpc3Rlcl9kaXZpZGVyKE5VTEwsICJjcHVfY2xrX2RpdiIsICJwbGxfY2xrIiwKKwkJCQkgICBDTEtfR0VUX1JBVEVfTk9DQUNIRSwgTFMxWF9DTEtfUExMX0RJViwKKwkJCQkgICBESVZfQ1BVX1NISUZULCBESVZfQ1BVX1dJRFRILAorCQkJCSAgIENMS19ESVZJREVSX09ORV9CQVNFRCB8CisJCQkJICAgQ0xLX0RJVklERVJfUk9VTkRfQ0xPU0VTVCwgJl9sb2NrKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAiY3B1X2Nsa19kaXYiLCBOVUxMKTsKKwlodyA9IGNsa19od19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgImNwdV9jbGsiLCAiY3B1X2Nsa19kaXYiLAorCQkJCQkwLCAxLCAxKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAiY3B1X2NsayIsIE5VTEwpOworCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZGl2aWRlcihOVUxMLCAiZGNfY2xrX2RpdiIsICJwbGxfY2xrIiwKKwkJCQkgICAwLCBMUzFYX0NMS19QTExfRElWLCBESVZfRENfU0hJRlQsCisJCQkJICAgRElWX0RDX1dJRFRILCBDTEtfRElWSURFUl9PTkVfQkFTRUQsICZfbG9jayk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImRjX2Nsa19kaXYiLCBOVUxMKTsKKwlodyA9IGNsa19od19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgImRjX2NsayIsICJkY19jbGtfZGl2IiwKKwkJCQkJMCwgMSwgMSk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImRjX2NsayIsIE5VTEwpOworCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZGl2aWRlcl90YWJsZShOVUxMLCAiYWhiX2Nsa19kaXYiLCAiY3B1X2Nsa19kaXYiLAorCQkJCTAsIExTMVhfQ0xLX1BMTF9GUkVRLCBESVZfRERSX1NISUZULAorCQkJCURJVl9ERFJfV0lEVEgsIENMS19ESVZJREVSX0FMTE9XX1pFUk8sCisJCQkJYWhiX2Rpdl90YWJsZSwgJl9sb2NrKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAiYWhiX2Nsa19kaXYiLCBOVUxMKTsKKwlodyA9IGNsa19od19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgImFoYl9jbGsiLCAiYWhiX2Nsa19kaXYiLAorCQkJCQkwLCAxLCAxKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAiYWhiX2NsayIsIE5VTEwpOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJsczF4LWRtYSIsIE5VTEwpOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJzdG1tYWNldGgiLCBOVUxMKTsKKworCS8qIGNsb2NrIGRlcml2ZWQgZnJvbSBBSEIgY2xrICovCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsICJhcGJfY2xrIiwgImFoYl9jbGsiLCAwLCAxLAorCQkJCQlESVZfQVBCKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAiYXBiX2NsayIsIE5VTEwpOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJsczF4LWFjOTciLCBOVUxMKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAibHMxeC1pMmMiLCBOVUxMKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAibHMxeC1uYW5kIiwgTlVMTCk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImxzMXgtcHdtdGltZXIiLCBOVUxMKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAibHMxeC1zcGkiLCBOVUxMKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAibHMxeC13ZHQiLCBOVUxMKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAic2VyaWFsODI1MCIsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbG9vbmdzb24xL2Nsay5jIGIvZHJpdmVycy9jbGsvbG9vbmdzb24xL2Nsay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmY2ZkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9sb29uZ3NvbjEvY2xrLmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE2IFpoYW5nLCBLZWd1YW5nIDxrZWd1YW5nLnpoYW5nQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKK3N0cnVjdCBjbGtfaHcgKl9faW5pdCBjbGtfaHdfcmVnaXN0ZXJfcGxsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBjbGtfb3BzICpvcHMsCisJCQkJCSAgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBjbGtfaHcgKmh3OworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisKKwkvKiBhbGxvY2F0ZSB0aGUgZGl2aWRlciAqLworCWh3ID0ga3phbGxvYyhzaXplb2YoKmh3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFodykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpbml0Lm5hbWUgPSBuYW1lOworCWluaXQub3BzID0gb3BzOworCWluaXQuZmxhZ3MgPSBmbGFncyB8IENMS19JU19CQVNJQzsKKwlpbml0LnBhcmVudF9uYW1lcyA9IChwYXJlbnRfbmFtZSA/ICZwYXJlbnRfbmFtZSA6IE5VTEwpOworCWluaXQubnVtX3BhcmVudHMgPSAocGFyZW50X25hbWUgPyAxIDogMCk7CisJaHctPmluaXQgPSAmaW5pdDsKKworCS8qIHJlZ2lzdGVyIHRoZSBjbG9jayAqLworCXJldCA9IGNsa19od19yZWdpc3RlcihkZXYsIGh3KTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKGh3KTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfQorCisJcmV0dXJuIGh3OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbG9vbmdzb24xL2Nsay5oIGIvZHJpdmVycy9jbGsvbG9vbmdzb24xL2Nsay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NWQ3NGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9sb29uZ3NvbjEvY2xrLmgKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE2IFpoYW5nLCBLZWd1YW5nIDxrZWd1YW5nLnpoYW5nQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19MT09OR1NPTjFfQ0xLX0gKKyNkZWZpbmUgX19MT09OR1NPTjFfQ0xLX0gKKworc3RydWN0IGNsa19odyAqY2xrX2h3X3JlZ2lzdGVyX3BsbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgY2xrX29wcyAqb3BzLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCisjZW5kaWYgLyogX19MT09OR1NPTjFfQ0xLX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL0tjb25maWcgYi9kcml2ZXJzL2Nsay9tZWRpYXRlay9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MGMzNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9tZWRpYXRlay9LY29uZmlnCkBAIC0wLDAgKzEsMjEgQEAKKyMKKyMgTWVkaWFUZWsgU29DIGRyaXZlcnMKKyMKK2NvbmZpZyBDT01NT05fQ0xLX01FRElBVEVLCisJYm9vbAorCS0tLWhlbHAtLS0KKwkgIE1lZGlhdGVrIFNvQ3MnIGNsb2NrIHN1cHBvcnQuCisKK2NvbmZpZyBDT01NT05fQ0xLX01UODEzNQorCWJvb2wgIkNsb2NrIGRyaXZlciBmb3IgTWVkaWF0ZWsgTVQ4MTM1IgorCXNlbGVjdCBDT01NT05fQ0xLX01FRElBVEVLCisJZGVmYXVsdCBBUkNIX01FRElBVEVLCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTWVkaWF0ZWsgTVQ4MTM1IGNsb2Nrcy4KKworY29uZmlnIENPTU1PTl9DTEtfTVQ4MTczCisJYm9vbCAiQ2xvY2sgZHJpdmVyIGZvciBNZWRpYXRlayBNVDgxNzMiCisJc2VsZWN0IENPTU1PTl9DTEtfTUVESUFURUsKKwlkZWZhdWx0IEFSQ0hfTUVESUFURUsKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBNZWRpYXRlayBNVDgxNzMgY2xvY2tzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbWVkaWF0ZWsvTWFrZWZpbGUgYi9kcml2ZXJzL2Nsay9tZWRpYXRlay9NYWtlZmlsZQppbmRleCA5NWZkZmFjLi4zMmU3MjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9tZWRpYXRlay9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2Nsay9tZWRpYXRlay9NYWtlZmlsZQpAQCAtMSw0ICsxLDQgQEAKLW9iai15ICs9IGNsay1tdGsubyBjbGstcGxsLm8gY2xrLWdhdGUubyBjbGstYXBtaXhlZC5vCitvYmotJChDT05GSUdfQ09NTU9OX0NMS19NRURJQVRFSykgKz0gY2xrLW10ay5vIGNsay1wbGwubyBjbGstZ2F0ZS5vIGNsay1hcG1peGVkLm8KIG9iai0kKENPTkZJR19SRVNFVF9DT05UUk9MTEVSKSArPSByZXNldC5vCi1vYmoteSArPSBjbGstbXQ4MTM1Lm8KLW9iai15ICs9IGNsay1tdDgxNzMubworb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfTVQ4MTM1KSArPSBjbGstbXQ4MTM1Lm8KK29iai0kKENPTkZJR19DT01NT05fQ0xLX01UODE3MykgKz0gY2xrLW10ODE3My5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstZ2F0ZS5jIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLWdhdGUuYwppbmRleCAyYTc2OTAxLi5kODc4N2JmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstZ2F0ZS5jCisrKyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1nYXRlLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAkuZGlzYWJsZQk9IG10a19jZ19kaXNhYmxlX2ludiwKIH07CiAKLXN0cnVjdCBjbGsgKiBfX2luaXQgbXRrX2Nsa19yZWdpc3Rlcl9nYXRlKAorc3RydWN0IGNsayAqbXRrX2Nsa19yZWdpc3Rlcl9nYXRlKAogCQljb25zdCBjaGFyICpuYW1lLAogCQljb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKIAkJc3RydWN0IHJlZ21hcCAqcmVnbWFwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE3My5jIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE3My5jCmluZGV4IDEwYzk4NjAuLjBhYzNhZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxNzMuYworKysgYi9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTczLmMKQEAgLTEwNzQsOCArMTA3NCwxMCBAQAogCX0KIAogCW10ODE3M19wbGxfY2xrX2RhdGEgPSBjbGtfZGF0YSA9IG10a19hbGxvY19jbGtfZGF0YShDTEtfQVBNSVhFRF9OUl9DTEspOwotCWlmICghY2xrX2RhdGEpCisJaWYgKCFjbGtfZGF0YSkgeworCQlpb3VubWFwKGJhc2UpOwogCQlyZXR1cm47CisJfQogCiAJbXRrX2Nsa19yZWdpc3Rlcl9wbGxzKG5vZGUsIHBsbHMsIEFSUkFZX1NJWkUocGxscyksIGNsa19kYXRhKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ay5jIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ay5jCmluZGV4IDVhZGE2NDQuLmJiMzBmNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdGsuYworKysgYi9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXRrLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlICJjbGstbXRrLmgiCiAjaW5jbHVkZSAiY2xrLWdhdGUuaCIKIAotc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKiBfX2luaXQgbXRrX2FsbG9jX2Nsa19kYXRhKHVuc2lnbmVkIGludCBjbGtfbnVtKQorc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKm10a19hbGxvY19jbGtfZGF0YSh1bnNpZ25lZCBpbnQgY2xrX251bSkKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSAqY2xrX2RhdGE7CkBAIC00OSw3ICs0OSw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgX19pbml0IG10a19jbGtfcmVnaXN0ZXJfZml4ZWRfY2xrcyhjb25zdCBzdHJ1Y3QgbXRrX2ZpeGVkX2NsayAqY2xrcywKK3ZvaWQgbXRrX2Nsa19yZWdpc3Rlcl9maXhlZF9jbGtzKGNvbnN0IHN0cnVjdCBtdGtfZml4ZWRfY2xrICpjbGtzLAogCQlpbnQgbnVtLCBzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSAqY2xrX2RhdGEpCiB7CiAJaW50IGk7CkBAIC03Miw3ICs3Miw3IEBACiAJfQogfQogCi12b2lkIF9faW5pdCBtdGtfY2xrX3JlZ2lzdGVyX2ZhY3RvcnMoY29uc3Qgc3RydWN0IG10a19maXhlZF9mYWN0b3IgKmNsa3MsCit2b2lkIG10a19jbGtfcmVnaXN0ZXJfZmFjdG9ycyhjb25zdCBzdHJ1Y3QgbXRrX2ZpeGVkX2ZhY3RvciAqY2xrcywKIAkJaW50IG51bSwgc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNsa19kYXRhKQogewogCWludCBpOwpAQCAtOTUsNyArOTUsNyBAQAogCX0KIH0KIAotaW50IF9faW5pdCBtdGtfY2xrX3JlZ2lzdGVyX2dhdGVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKK2ludCBtdGtfY2xrX3JlZ2lzdGVyX2dhdGVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKIAkJY29uc3Qgc3RydWN0IG10a19nYXRlICpjbGtzLAogCQlpbnQgbnVtLCBzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSAqY2xrX2RhdGEpCiB7CkBAIC0xMzUsNyArMTM1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGNsayAqIF9faW5pdCBtdGtfY2xrX3JlZ2lzdGVyX2NvbXBvc2l0ZShjb25zdCBzdHJ1Y3QgbXRrX2NvbXBvc2l0ZSAqbWMsCitzdHJ1Y3QgY2xrICptdGtfY2xrX3JlZ2lzdGVyX2NvbXBvc2l0ZShjb25zdCBzdHJ1Y3QgbXRrX2NvbXBvc2l0ZSAqbWMsCiAJCXZvaWQgX19pb21lbSAqYmFzZSwgc3BpbmxvY2tfdCAqbG9jaykKIHsKIAlzdHJ1Y3QgY2xrICpjbGs7CkBAIC0yMjIsNyArMjIyLDcgQEAKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogCi12b2lkIF9faW5pdCBtdGtfY2xrX3JlZ2lzdGVyX2NvbXBvc2l0ZXMoY29uc3Qgc3RydWN0IG10a19jb21wb3NpdGUgKm1jcywKK3ZvaWQgbXRrX2Nsa19yZWdpc3Rlcl9jb21wb3NpdGVzKGNvbnN0IHN0cnVjdCBtdGtfY29tcG9zaXRlICptY3MsCiAJCWludCBudW0sIHZvaWQgX19pb21lbSAqYmFzZSwgc3BpbmxvY2tfdCAqbG9jaywKIAkJc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNsa19kYXRhKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLXBsbC5jIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLXBsbC5jCmluZGV4IDk2NmNhYjEuLjBjMmRlYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1wbGwuYworKysgYi9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstcGxsLmMKQEAgLTMxMyw3ICszMTMsNyBAQAogCXJldHVybiBjbGs7CiB9CiAKLXZvaWQgX19pbml0IG10a19jbGtfcmVnaXN0ZXJfcGxscyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCit2b2lkIG10a19jbGtfcmVnaXN0ZXJfcGxscyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCiAJCWNvbnN0IHN0cnVjdCBtdGtfcGxsX2RhdGEgKnBsbHMsIGludCBudW1fcGxscywgc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNsa19kYXRhKQogewogCXZvaWQgX19pb21lbSAqYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lc29uL01ha2VmaWxlIGIvZHJpdmVycy9jbGsvbWVzb24vTWFrZWZpbGUKaW5kZXggMTk3ZTQwMS4uMzQ5NTgzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvbWVzb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jbGsvbWVzb24vTWFrZWZpbGUKQEAgLTMsNSArMyw1IEBACiAjCiAKIG9iai0kKENPTkZJR19DT01NT05fQ0xLX0FNTE9HSUMpICs9IGNsay1wbGwubyBjbGstY3B1Lm8gY2xrLW1wbGwubwotb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfTUVTT044QikgKz0gbWVzb244Yi1jbGtjLm8KLW9iai0kKENPTkZJR19DT01NT05fQ0xLX0dYQkIpCSArPSBneGJiLm8KK29iai0kKENPTkZJR19DT01NT05fQ0xLX01FU09OOEIpICs9IG1lc29uOGIubworb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfR1hCQikJICs9IGd4YmIubyBneGJiLWFvY2xrLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lc29uL2Nsa2MuaCBiL2RyaXZlcnMvY2xrL21lc29uL2Nsa2MuaAppbmRleCA1MzMyNmMzLi45YmI3MGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9tZXNvbi9jbGtjLmgKKysrIGIvZHJpdmVycy9jbGsvbWVzb24vY2xrYy5oCkBAIC05OCw3ICs5OCw3IEBACiB9OwogCiAjZGVmaW5lIE1FU09OX0dBVEUoX25hbWUsIF9yZWcsIF9iaXQpCQkJCQlcCi1zdHJ1Y3QgY2xrX2dhdGUgZ3hiYl8jI19uYW1lID0geyAJCQkJCQlcCitzdHJ1Y3QgY2xrX2dhdGUgX25hbWUgPSB7IAkJCQkJCVwKIAkucmVnID0gKHZvaWQgX19pb21lbSAqKSBfcmVnLCAJCQkJCVwKIAkuYml0X2lkeCA9IChfYml0KSwgCQkJCQkJXAogCS5sb2NrID0gJmNsa19sb2NrLAkJCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lc29uL2d4YmItYW9jbGsuYyBiL2RyaXZlcnMvY2xrL21lc29uL2d4YmItYW9jbGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDVjNWZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvbWVzb24vZ3hiYi1hb2Nsay5jCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEJheUxpYnJlLCBTQVMuCisgKiBBdXRob3I6IE5laWwgQXJtc3Ryb25nIDxuYXJtc3Ryb25nQGJheWxpYnJlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQmF5TGlicmUsIFNBUy4KKyAqIEF1dGhvcjogTmVpbCBBcm1zdHJvbmcgPG5hcm1zdHJvbmdAYmF5bGlicmUuY29tPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Jlc2V0LWNvbnRyb2xsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svZ3hiYi1hb2Nsa2MuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9yZXNldC9neGJiLWFvY2xrYy5oPgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGd4YmJfYW9jbGtfbG9jayk7CisKK3N0cnVjdCBneGJiX2FvY2xrX3Jlc2V0X2NvbnRyb2xsZXIgeworCXN0cnVjdCByZXNldF9jb250cm9sbGVyX2RldiByZXNldDsKKwl1bnNpZ25lZCBpbnQgKmRhdGE7CisJdm9pZCBfX2lvbWVtICpiYXNlOworfTsKKworc3RhdGljIGludCBneGJiX2FvY2xrX2RvX3Jlc2V0KHN0cnVjdCByZXNldF9jb250cm9sbGVyX2RldiAqcmNkZXYsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBpZCkKK3sKKwlzdHJ1Y3QgZ3hiYl9hb2Nsa19yZXNldF9jb250cm9sbGVyICpyZXNldCA9CisJCWNvbnRhaW5lcl9vZihyY2Rldiwgc3RydWN0IGd4YmJfYW9jbGtfcmVzZXRfY29udHJvbGxlciwgcmVzZXQpOworCisJd3JpdGVsKEJJVChyZXNldC0+ZGF0YVtpZF0pLCByZXNldC0+YmFzZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZXNldF9jb250cm9sX29wcyBneGJiX2FvY2xrX3Jlc2V0X29wcyA9IHsKKwkucmVzZXQgPSBneGJiX2FvY2xrX2RvX3Jlc2V0LAorfTsKKworI2RlZmluZSBHWEJCX0FPX0dBVEUoX25hbWUsIF9iaXQpCQkJCQlcCitzdGF0aWMgc3RydWN0IGNsa19nYXRlIF9uYW1lIyNfYW8gPSB7CQkJCQlcCisJLnJlZyA9ICh2b2lkIF9faW9tZW0gKikwLAkJCQkJXAorCS5iaXRfaWR4ID0gKF9iaXQpLAkJCQkJCVwKKwkubG9jayA9ICZneGJiX2FvY2xrX2xvY2ssCQkJCQlcCisJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKSB7CQkJCVwKKwkJLm5hbWUgPSAjX25hbWUgIl9hbyIsCQkJCQlcCisJCS5vcHMgPSAmY2xrX2dhdGVfb3BzLAkJCQkJXAorCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImNsazgxIiB9LAkJXAorCQkubnVtX3BhcmVudHMgPSAxLAkJCQkJXAorCQkuZmxhZ3MgPSAoQ0xLX1NFVF9SQVRFX1BBUkVOVCB8IENMS19JR05PUkVfVU5VU0VEKSwJXAorCX0sCQkJCQkJCQlcCit9CisKK0dYQkJfQU9fR0FURShyZW1vdGUsIDApOworR1hCQl9BT19HQVRFKGkyY19tYXN0ZXIsIDEpOworR1hCQl9BT19HQVRFKGkyY19zbGF2ZSwgMik7CitHWEJCX0FPX0dBVEUodWFydDEsIDMpOworR1hCQl9BT19HQVRFKHVhcnQyLCA1KTsKK0dYQkJfQU9fR0FURShpcl9ibGFzdGVyLCA2KTsKKworc3RhdGljIHVuc2lnbmVkIGludCBneGJiX2FvY2xrX3Jlc2V0W10gPSB7CisJW1JFU0VUX0FPX1JFTU9URV0gPSAxNiwKKwlbUkVTRVRfQU9fSTJDX01BU1RFUl0gPSAxOCwKKwlbUkVTRVRfQU9fSTJDX1NMQVZFXSA9IDE5LAorCVtSRVNFVF9BT19VQVJUMV0gPSAxNywKKwlbUkVTRVRfQU9fVUFSVDJdID0gMjIsCisJW1JFU0VUX0FPX0lSX0JMQVNURVJdID0gMjMsCit9OworCitzdGF0aWMgc3RydWN0IGNsa19nYXRlICpneGJiX2FvY2xrX2dhdGVbXSA9IHsKKwlbQ0xLSURfQU9fUkVNT1RFXSA9ICZyZW1vdGVfYW8sCisJW0NMS0lEX0FPX0kyQ19NQVNURVJdID0gJmkyY19tYXN0ZXJfYW8sCisJW0NMS0lEX0FPX0kyQ19TTEFWRV0gPSAmaTJjX3NsYXZlX2FvLAorCVtDTEtJRF9BT19VQVJUMV0gPSAmdWFydDFfYW8sCisJW0NMS0lEX0FPX1VBUlQyXSA9ICZ1YXJ0Ml9hbywKKwlbQ0xLSURfQU9fSVJfQkxBU1RFUl0gPSAmaXJfYmxhc3Rlcl9hbywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3X29uZWNlbGxfZGF0YSBneGJiX2FvY2xrX29uZWNlbGxfZGF0YSA9IHsKKwkuaHdzID0geworCQlbQ0xLSURfQU9fUkVNT1RFXSA9ICZyZW1vdGVfYW8uaHcsCisJCVtDTEtJRF9BT19JMkNfTUFTVEVSXSA9ICZpMmNfbWFzdGVyX2FvLmh3LAorCQlbQ0xLSURfQU9fSTJDX1NMQVZFXSA9ICZpMmNfc2xhdmVfYW8uaHcsCisJCVtDTEtJRF9BT19VQVJUMV0gPSAmdWFydDFfYW8uaHcsCisJCVtDTEtJRF9BT19VQVJUMl0gPSAmdWFydDJfYW8uaHcsCisJCVtDTEtJRF9BT19JUl9CTEFTVEVSXSA9ICZpcl9ibGFzdGVyX2FvLmh3LAorCX0sCisJLm51bSA9IEFSUkFZX1NJWkUoZ3hiYl9hb2Nsa19nYXRlKSwKK307CisKK3N0YXRpYyBpbnQgZ3hiYl9hb2Nsa2NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJaW50IHJldCwgY2xraWQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZ3hiYl9hb2Nsa19yZXNldF9jb250cm9sbGVyICpyc3RjOworCisJcnN0YyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcnN0YyksIEdGUF9LRVJORUwpOworCWlmICghcnN0YykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBHZW5lcmljIGNsb2NrcyAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJaWYgKElTX0VSUihiYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoYmFzZSk7CisKKwkvKiBSZXNldCBDb250cm9sbGVyICovCisJcnN0Yy0+YmFzZSA9IGJhc2U7CisJcnN0Yy0+ZGF0YSA9IGd4YmJfYW9jbGtfcmVzZXQ7CisJcnN0Yy0+cmVzZXQub3BzID0gJmd4YmJfYW9jbGtfcmVzZXRfb3BzOworCXJzdGMtPnJlc2V0Lm5yX3Jlc2V0cyA9IEFSUkFZX1NJWkUoZ3hiYl9hb2Nsa19yZXNldCk7CisJcnN0Yy0+cmVzZXQub2Zfbm9kZSA9IGRldi0+b2Zfbm9kZTsKKwlyZXQgPSBkZXZtX3Jlc2V0X2NvbnRyb2xsZXJfcmVnaXN0ZXIoZGV2LCAmcnN0Yy0+cmVzZXQpOworCisJLyoKKwkgKiBQb3B1bGF0ZSBiYXNlIGFkZHJlc3MgYW5kIHJlZ2lzdGVyIGFsbCBjbGtzCisJICovCisJZm9yIChjbGtpZCA9IDA7IGNsa2lkIDwgZ3hiYl9hb2Nsa19vbmVjZWxsX2RhdGEubnVtOyBjbGtpZCsrKSB7CisJCWd4YmJfYW9jbGtfZ2F0ZVtjbGtpZF0tPnJlZyA9IGJhc2U7CisKKwkJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoZGV2LAorCQkJCQlneGJiX2FvY2xrX29uZWNlbGxfZGF0YS5od3NbY2xraWRdKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIoZGV2LT5vZl9ub2RlLCBvZl9jbGtfaHdfb25lY2VsbF9nZXQsCisJCQkmZ3hiYl9hb2Nsa19vbmVjZWxsX2RhdGEpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBneGJiX2FvY2xrY19tYXRjaF90YWJsZVtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYW1sb2dpYyxneGJiLWFvY2xrYyIgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGd4YmJfYW9jbGtjX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gZ3hiYl9hb2Nsa2NfcHJvYmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImd4YmItYW9jbGtjIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gZ3hiYl9hb2Nsa2NfbWF0Y2hfdGFibGUsCisJfSwKK307CitidWlsdGluX3BsYXRmb3JtX2RyaXZlcihneGJiX2FvY2xrY19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbWVzb24vZ3hiYi5jIGIvZHJpdmVycy9jbGsvbWVzb24vZ3hiYi5jCmluZGV4IGE0YzY2ODRiLi45ZDlhZjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9tZXNvbi9neGJiLmMKKysrIGIvZHJpdmVycy9jbGsvbWVzb24vZ3hiYi5jCkBAIC01NjUsOTAgKzU2NSw5MyBAQAogfTsKIAogLyogRXZlcnl0aGluZyBFbHNlIChFRSkgZG9tYWluIGdhdGVzICovCi1zdGF0aWMgTUVTT05fR0FURShkZHIsIEhISV9HQ0xLX01QRUcwLCAwKTsKLXN0YXRpYyBNRVNPTl9HQVRFKGRvcywgSEhJX0dDTEtfTVBFRzAsIDEpOwotc3RhdGljIE1FU09OX0dBVEUoaXNhLCBISElfR0NMS19NUEVHMCwgNSk7Ci1zdGF0aWMgTUVTT05fR0FURShwbDMwMSwgSEhJX0dDTEtfTVBFRzAsIDYpOwotc3RhdGljIE1FU09OX0dBVEUocGVyaXBocywgSEhJX0dDTEtfTVBFRzAsIDcpOwotc3RhdGljIE1FU09OX0dBVEUoc3BpY2MsIEhISV9HQ0xLX01QRUcwLCA4KTsKLXN0YXRpYyBNRVNPTl9HQVRFKGkyYywgSEhJX0dDTEtfTVBFRzAsIDkpOwotc3RhdGljIE1FU09OX0dBVEUoc2FyX2FkYywgSEhJX0dDTEtfTVBFRzAsIDEwKTsKLXN0YXRpYyBNRVNPTl9HQVRFKHNtYXJ0X2NhcmQsIEhISV9HQ0xLX01QRUcwLCAxMSk7Ci1zdGF0aWMgTUVTT05fR0FURShybmcwLCBISElfR0NMS19NUEVHMCwgMTIpOwotc3RhdGljIE1FU09OX0dBVEUodWFydDAsIEhISV9HQ0xLX01QRUcwLCAxMyk7Ci1zdGF0aWMgTUVTT05fR0FURShzZGhjLCBISElfR0NMS19NUEVHMCwgMTQpOwotc3RhdGljIE1FU09OX0dBVEUoc3RyZWFtLCBISElfR0NMS19NUEVHMCwgMTUpOwotc3RhdGljIE1FU09OX0dBVEUoYXN5bmNfZmlmbywgSEhJX0dDTEtfTVBFRzAsIDE2KTsKLXN0YXRpYyBNRVNPTl9HQVRFKHNkaW8sIEhISV9HQ0xLX01QRUcwLCAxNyk7Ci1zdGF0aWMgTUVTT05fR0FURShhYnVmLCBISElfR0NMS19NUEVHMCwgMTgpOwotc3RhdGljIE1FU09OX0dBVEUoaGl1X2lmYWNlLCBISElfR0NMS19NUEVHMCwgMTkpOwotc3RhdGljIE1FU09OX0dBVEUoYXNzaXN0X21pc2MsIEhISV9HQ0xLX01QRUcwLCAyMyk7Ci1zdGF0aWMgTUVTT05fR0FURShzcGksIEhISV9HQ0xLX01QRUcwLCAzMCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2RkciwgSEhJX0dDTEtfTVBFRzAsIDApOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9kb3MsIEhISV9HQ0xLX01QRUcwLCAxKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfaXNhLCBISElfR0NMS19NUEVHMCwgNSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3BsMzAxLCBISElfR0NMS19NUEVHMCwgNik7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3BlcmlwaHMsIEhISV9HQ0xLX01QRUcwLCA3KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfc3BpY2MsIEhISV9HQ0xLX01QRUcwLCA4KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfaTJjLCBISElfR0NMS19NUEVHMCwgOSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3Nhcl9hZGMsIEhISV9HQ0xLX01QRUcwLCAxMCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3NtYXJ0X2NhcmQsIEhISV9HQ0xLX01QRUcwLCAxMSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3JuZzAsIEhISV9HQ0xLX01QRUcwLCAxMik7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3VhcnQwLCBISElfR0NMS19NUEVHMCwgMTMpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9zZGhjLCBISElfR0NMS19NUEVHMCwgMTQpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9zdHJlYW0sIEhISV9HQ0xLX01QRUcwLCAxNSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2FzeW5jX2ZpZm8sIEhISV9HQ0xLX01QRUcwLCAxNik7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3NkaW8sIEhISV9HQ0xLX01QRUcwLCAxNyk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2FidWYsIEhISV9HQ0xLX01QRUcwLCAxOCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2hpdV9pZmFjZSwgSEhJX0dDTEtfTVBFRzAsIDE5KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfYXNzaXN0X21pc2MsIEhISV9HQ0xLX01QRUcwLCAyMyk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2VtbWNfYSwgSEhJX0dDTEtfTVBFRzAsIDI0KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfZW1tY19iLCBISElfR0NMS19NUEVHMCwgMjUpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9lbW1jX2MsIEhISV9HQ0xLX01QRUcwLCAyNik7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3NwaSwgSEhJX0dDTEtfTVBFRzAsIDMwKTsKIAotc3RhdGljIE1FU09OX0dBVEUoaTJzX3NwZGlmLCBISElfR0NMS19NUEVHMSwgMik7Ci1zdGF0aWMgTUVTT05fR0FURShldGgsIEhISV9HQ0xLX01QRUcxLCAzKTsKLXN0YXRpYyBNRVNPTl9HQVRFKGRlbXV4LCBISElfR0NMS19NUEVHMSwgNCk7Ci1zdGF0aWMgTUVTT05fR0FURShhaXVfZ2x1ZSwgSEhJX0dDTEtfTVBFRzEsIDYpOwotc3RhdGljIE1FU09OX0dBVEUoaWVjOTU4LCBISElfR0NMS19NUEVHMSwgNyk7Ci1zdGF0aWMgTUVTT05fR0FURShpMnNfb3V0LCBISElfR0NMS19NUEVHMSwgOCk7Ci1zdGF0aWMgTUVTT05fR0FURShhbWNsaywgSEhJX0dDTEtfTVBFRzEsIDkpOwotc3RhdGljIE1FU09OX0dBVEUoYWlmaWZvMiwgSEhJX0dDTEtfTVBFRzEsIDEwKTsKLXN0YXRpYyBNRVNPTl9HQVRFKG1peGVyLCBISElfR0NMS19NUEVHMSwgMTEpOwotc3RhdGljIE1FU09OX0dBVEUobWl4ZXJfaWZhY2UsIEhISV9HQ0xLX01QRUcxLCAxMik7Ci1zdGF0aWMgTUVTT05fR0FURShhZGMsIEhISV9HQ0xLX01QRUcxLCAxMyk7Ci1zdGF0aWMgTUVTT05fR0FURShibGttdiwgSEhJX0dDTEtfTVBFRzEsIDE0KTsKLXN0YXRpYyBNRVNPTl9HQVRFKGFpdSwgSEhJX0dDTEtfTVBFRzEsIDE1KTsKLXN0YXRpYyBNRVNPTl9HQVRFKHVhcnQxLCBISElfR0NMS19NUEVHMSwgMTYpOwotc3RhdGljIE1FU09OX0dBVEUoZzJkLCBISElfR0NMS19NUEVHMSwgMjApOwotc3RhdGljIE1FU09OX0dBVEUodXNiMCwgSEhJX0dDTEtfTVBFRzEsIDIxKTsKLXN0YXRpYyBNRVNPTl9HQVRFKHVzYjEsIEhISV9HQ0xLX01QRUcxLCAyMik7Ci1zdGF0aWMgTUVTT05fR0FURShyZXNldCwgSEhJX0dDTEtfTVBFRzEsIDIzKTsKLXN0YXRpYyBNRVNPTl9HQVRFKG5hbmQsIEhISV9HQ0xLX01QRUcxLCAyNCk7Ci1zdGF0aWMgTUVTT05fR0FURShkb3NfcGFyc2VyLCBISElfR0NMS19NUEVHMSwgMjUpOwotc3RhdGljIE1FU09OX0dBVEUodXNiLCBISElfR0NMS19NUEVHMSwgMjYpOwotc3RhdGljIE1FU09OX0dBVEUodmRpbjEsIEhISV9HQ0xLX01QRUcxLCAyOCk7Ci1zdGF0aWMgTUVTT05fR0FURShhaGJfYXJiMCwgSEhJX0dDTEtfTVBFRzEsIDI5KTsKLXN0YXRpYyBNRVNPTl9HQVRFKGVmdXNlLCBISElfR0NMS19NUEVHMSwgMzApOwotc3RhdGljIE1FU09OX0dBVEUoYm9vdF9yb20sIEhISV9HQ0xLX01QRUcxLCAzMSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2kyc19zcGRpZiwgSEhJX0dDTEtfTVBFRzEsIDIpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9ldGgsIEhISV9HQ0xLX01QRUcxLCAzKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfZGVtdXgsIEhISV9HQ0xLX01QRUcxLCA0KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfYWl1X2dsdWUsIEhISV9HQ0xLX01QRUcxLCA2KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfaWVjOTU4LCBISElfR0NMS19NUEVHMSwgNyk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2kyc19vdXQsIEhISV9HQ0xLX01QRUcxLCA4KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfYW1jbGssIEhISV9HQ0xLX01QRUcxLCA5KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfYWlmaWZvMiwgSEhJX0dDTEtfTVBFRzEsIDEwKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfbWl4ZXIsIEhISV9HQ0xLX01QRUcxLCAxMSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX21peGVyX2lmYWNlLCBISElfR0NMS19NUEVHMSwgMTIpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9hZGMsIEhISV9HQ0xLX01QRUcxLCAxMyk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2Jsa212LCBISElfR0NMS19NUEVHMSwgMTQpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9haXUsIEhISV9HQ0xLX01QRUcxLCAxNSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3VhcnQxLCBISElfR0NMS19NUEVHMSwgMTYpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9nMmQsIEhISV9HQ0xLX01QRUcxLCAyMCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3VzYjAsIEhISV9HQ0xLX01QRUcxLCAyMSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3VzYjEsIEhISV9HQ0xLX01QRUcxLCAyMik7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3Jlc2V0LCBISElfR0NMS19NUEVHMSwgMjMpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9uYW5kLCBISElfR0NMS19NUEVHMSwgMjQpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9kb3NfcGFyc2VyLCBISElfR0NMS19NUEVHMSwgMjUpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl91c2IsIEhISV9HQ0xLX01QRUcxLCAyNik7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3ZkaW4xLCBISElfR0NMS19NUEVHMSwgMjgpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9haGJfYXJiMCwgSEhJX0dDTEtfTVBFRzEsIDI5KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfZWZ1c2UsIEhISV9HQ0xLX01QRUcxLCAzMCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2Jvb3Rfcm9tLCBISElfR0NMS19NUEVHMSwgMzEpOwogCi1zdGF0aWMgTUVTT05fR0FURShhaGJfZGF0YV9idXMsIEhISV9HQ0xLX01QRUcyLCAxKTsKLXN0YXRpYyBNRVNPTl9HQVRFKGFoYl9jdHJsX2J1cywgSEhJX0dDTEtfTVBFRzIsIDIpOwotc3RhdGljIE1FU09OX0dBVEUoaGRtaV9pbnRyX3N5bmMsIEhISV9HQ0xLX01QRUcyLCAzKTsKLXN0YXRpYyBNRVNPTl9HQVRFKGhkbWlfcGNsaywgSEhJX0dDTEtfTVBFRzIsIDQpOwotc3RhdGljIE1FU09OX0dBVEUodXNiMV9kZHJfYnJpZGdlLCBISElfR0NMS19NUEVHMiwgOCk7Ci1zdGF0aWMgTUVTT05fR0FURSh1c2IwX2Rkcl9icmlkZ2UsIEhISV9HQ0xLX01QRUcyLCA5KTsKLXN0YXRpYyBNRVNPTl9HQVRFKG1tY19wY2xrLCBISElfR0NMS19NUEVHMiwgMTEpOwotc3RhdGljIE1FU09OX0dBVEUoZHZpbiwgSEhJX0dDTEtfTVBFRzIsIDEyKTsKLXN0YXRpYyBNRVNPTl9HQVRFKHVhcnQyLCBISElfR0NMS19NUEVHMiwgMTUpOwotc3RhdGljIE1FU09OX0dBVEUoc2FuYSwgSEhJX0dDTEtfTVBFRzIsIDIyKTsKLXN0YXRpYyBNRVNPTl9HQVRFKHZwdV9pbnRyLCBISElfR0NMS19NUEVHMiwgMjUpOwotc3RhdGljIE1FU09OX0dBVEUoc2VjX2FoYl9haGIzX2JyaWRnZSwgSEhJX0dDTEtfTVBFRzIsIDI2KTsKLXN0YXRpYyBNRVNPTl9HQVRFKGNsazgxX2E1MywgSEhJX0dDTEtfTVBFRzIsIDI5KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfYWhiX2RhdGFfYnVzLCBISElfR0NMS19NUEVHMiwgMSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2FoYl9jdHJsX2J1cywgSEhJX0dDTEtfTVBFRzIsIDIpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9oZG1pX2ludHJfc3luYywgSEhJX0dDTEtfTVBFRzIsIDMpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9oZG1pX3BjbGssIEhISV9HQ0xLX01QRUcyLCA0KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfdXNiMV9kZHJfYnJpZGdlLCBISElfR0NMS19NUEVHMiwgOCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3VzYjBfZGRyX2JyaWRnZSwgSEhJX0dDTEtfTVBFRzIsIDkpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9tbWNfcGNsaywgSEhJX0dDTEtfTVBFRzIsIDExKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfZHZpbiwgSEhJX0dDTEtfTVBFRzIsIDEyKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfdWFydDIsIEhISV9HQ0xLX01QRUcyLCAxNSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3NhbmEsIEhISV9HQ0xLX01QRUcyLCAyMik7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3ZwdV9pbnRyLCBISElfR0NMS19NUEVHMiwgMjUpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9zZWNfYWhiX2FoYjNfYnJpZGdlLCBISElfR0NMS19NUEVHMiwgMjYpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9jbGs4MV9hNTMsIEhISV9HQ0xLX01QRUcyLCAyOSk7CiAKLXN0YXRpYyBNRVNPTl9HQVRFKHZjbGsyX3ZlbmNpMCwgSEhJX0dDTEtfT1RIRVIsIDEpOwotc3RhdGljIE1FU09OX0dBVEUodmNsazJfdmVuY2kxLCBISElfR0NMS19PVEhFUiwgMik7Ci1zdGF0aWMgTUVTT05fR0FURSh2Y2xrMl92ZW5jcDAsIEhISV9HQ0xLX09USEVSLCAzKTsKLXN0YXRpYyBNRVNPTl9HQVRFKHZjbGsyX3ZlbmNwMSwgSEhJX0dDTEtfT1RIRVIsIDQpOwotc3RhdGljIE1FU09OX0dBVEUoZ2Nsa192ZW5jaV9pbnQwLCBISElfR0NMS19PVEhFUiwgOCk7Ci1zdGF0aWMgTUVTT05fR0FURShnY2xrX3ZlbmNwX2ludCwgSEhJX0dDTEtfT1RIRVIsIDkpOwotc3RhdGljIE1FU09OX0dBVEUoZGFjX2NsaywgSEhJX0dDTEtfT1RIRVIsIDEwKTsKLXN0YXRpYyBNRVNPTl9HQVRFKGFvY2xrX2dhdGUsIEhISV9HQ0xLX09USEVSLCAxNCk7Ci1zdGF0aWMgTUVTT05fR0FURShpZWM5NThfZ2F0ZSwgSEhJX0dDTEtfT1RIRVIsIDE2KTsKLXN0YXRpYyBNRVNPTl9HQVRFKGVuYzQ4MHAsIEhISV9HQ0xLX09USEVSLCAyMCk7Ci1zdGF0aWMgTUVTT05fR0FURShybmcxLCBISElfR0NMS19PVEhFUiwgMjEpOwotc3RhdGljIE1FU09OX0dBVEUoZ2Nsa192ZW5jaV9pbnQxLCBISElfR0NMS19PVEhFUiwgMjIpOwotc3RhdGljIE1FU09OX0dBVEUodmNsazJfdmVuY2xtY2MsIEhISV9HQ0xLX09USEVSLCAyNCk7Ci1zdGF0aWMgTUVTT05fR0FURSh2Y2xrMl92ZW5jbCwgSEhJX0dDTEtfT1RIRVIsIDI1KTsKLXN0YXRpYyBNRVNPTl9HQVRFKHZjbGtfb3RoZXIsIEhISV9HQ0xLX09USEVSLCAyNik7Ci1zdGF0aWMgTUVTT05fR0FURShlZHAsIEhISV9HQ0xLX09USEVSLCAzMSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3ZjbGsyX3ZlbmNpMCwgSEhJX0dDTEtfT1RIRVIsIDEpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl92Y2xrMl92ZW5jaTEsIEhISV9HQ0xLX09USEVSLCAyKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfdmNsazJfdmVuY3AwLCBISElfR0NMS19PVEhFUiwgMyk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3ZjbGsyX3ZlbmNwMSwgSEhJX0dDTEtfT1RIRVIsIDQpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9nY2xrX3ZlbmNpX2ludDAsIEhISV9HQ0xLX09USEVSLCA4KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfZ2Nsa192ZW5jcF9pbnQsIEhISV9HQ0xLX09USEVSLCA5KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfZGFjX2NsaywgSEhJX0dDTEtfT1RIRVIsIDEwKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfYW9jbGtfZ2F0ZSwgSEhJX0dDTEtfT1RIRVIsIDE0KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfaWVjOTU4X2dhdGUsIEhISV9HQ0xLX09USEVSLCAxNik7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2VuYzQ4MHAsIEhISV9HQ0xLX09USEVSLCAyMCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3JuZzEsIEhISV9HQ0xLX09USEVSLCAyMSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2djbGtfdmVuY2lfaW50MSwgSEhJX0dDTEtfT1RIRVIsIDIyKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfdmNsazJfdmVuY2xtY2MsIEhISV9HQ0xLX09USEVSLCAyNCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3ZjbGsyX3ZlbmNsLCBISElfR0NMS19PVEhFUiwgMjUpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl92Y2xrX290aGVyLCBISElfR0NMS19PVEhFUiwgMjYpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9lZHAsIEhISV9HQ0xLX09USEVSLCAzMSk7CiAKIC8qIEFsd2F5cyBPbiAoQU8pIGRvbWFpbiBnYXRlcyAqLwogCi1zdGF0aWMgTUVTT05fR0FURShhb19tZWRpYV9jcHUsIEhISV9HQ0xLX0FPLCAwKTsKLXN0YXRpYyBNRVNPTl9HQVRFKGFvX2FoYl9zcmFtLCBISElfR0NMS19BTywgMSk7Ci1zdGF0aWMgTUVTT05fR0FURShhb19haGJfYnVzLCBISElfR0NMS19BTywgMik7Ci1zdGF0aWMgTUVTT05fR0FURShhb19pZmFjZSwgSEhJX0dDTEtfQU8sIDMpOwotc3RhdGljIE1FU09OX0dBVEUoYW9faTJjLCBISElfR0NMS19BTywgNCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2FvX21lZGlhX2NwdSwgSEhJX0dDTEtfQU8sIDApOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9hb19haGJfc3JhbSwgSEhJX0dDTEtfQU8sIDEpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9hb19haGJfYnVzLCBISElfR0NMS19BTywgMik7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2FvX2lmYWNlLCBISElfR0NMS19BTywgMyk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2FvX2kyYywgSEhJX0dDTEtfQU8sIDQpOwogCiAvKiBBcnJheSBvZiBhbGwgY2xvY2tzIHByb3ZpZGVkIGJ5IHRoaXMgcHJvdmlkZXIgKi8KIApAQCAtNzQ4LDYgKzc1MSw5IEBACiAJCVtDTEtJRF9BT19BSEJfQlVTXQkgICAgPSAmZ3hiYl9hb19haGJfYnVzLmh3LAogCQlbQ0xLSURfQU9fSUZBQ0VdCSAgICA9ICZneGJiX2FvX2lmYWNlLmh3LAogCQlbQ0xLSURfQU9fSTJDXQkJICAgID0gJmd4YmJfYW9faTJjLmh3LAorCQlbQ0xLSURfU0RfRU1NQ19BXQkgICAgPSAmZ3hiYl9lbW1jX2EuaHcsCisJCVtDTEtJRF9TRF9FTU1DX0JdCSAgICA9ICZneGJiX2VtbWNfYi5odywKKwkJW0NMS0lEX1NEX0VNTUNfQ10JICAgID0gJmd4YmJfZW1tY19jLmh3LAogCX0sCiAJLm51bSA9IE5SX0NMS1MsCiB9OwpAQCAtODQ3LDYgKzg1Myw5IEBACiAJJmd4YmJfYW9fYWhiX2J1cywKIAkmZ3hiYl9hb19pZmFjZSwKIAkmZ3hiYl9hb19pMmMsCisJJmd4YmJfZW1tY19hLAorCSZneGJiX2VtbWNfYiwKKwkmZ3hiYl9lbW1jX2MsCiB9OwogCiBzdGF0aWMgaW50IGd4YmJfY2xrY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtOTM3LDggKzk0Niw0IEBACiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGd4YmJfY2xrY19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZ3hiYl9kcml2ZXIpOwotfQotZGV2aWNlX2luaXRjYWxsKGd4YmJfY2xrY19pbml0KTsKK2J1aWx0aW5fcGxhdGZvcm1fZHJpdmVyKGd4YmJfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lc29uL2d4YmIuaCBiL2RyaXZlcnMvY2xrL21lc29uL2d4YmIuaAppbmRleCBhMmFkZjM0Li5hZTQ2MWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9tZXNvbi9neGJiLmgKKysrIGIvZHJpdmVycy9jbGsvbWVzb24vZ3hiYi5oCkBAIC0xNzAsMTEgKzE3MCwxMSBAQAogICovCiAjZGVmaW5lIENMS0lEX1NZU19QTEwJCSAgMAogLyogQ0xLSURfQ1BVQ0xLICovCi0jZGVmaW5lIENMS0lEX0hETUlfUExMCQkgIDIKKy8qIENMS0lEX0hETUlfUExMICovCiAjZGVmaW5lIENMS0lEX0ZJWEVEX1BMTAkJICAzCi0jZGVmaW5lIENMS0lEX0ZDTEtfRElWMgkJICA0Ci0jZGVmaW5lIENMS0lEX0ZDTEtfRElWMwkJICA1Ci0jZGVmaW5lIENMS0lEX0ZDTEtfRElWNAkJICA2CisvKiBDTEtJRF9GQ0xLX0RJVjIgKi8KKy8qIENMS0lEX0ZDTEtfRElWMyAqLworLyogQ0xLSURfRkNMS19ESVY0ICovCiAjZGVmaW5lIENMS0lEX0ZDTEtfRElWNQkJICA3CiAjZGVmaW5lIENMS0lEX0ZDTEtfRElWNwkJICA4CiAjZGVmaW5lIENMS0lEX0dQMF9QTEwJCSAgOQpAQCAtMjYyLDggKzI2MiwxMSBAQAogI2RlZmluZSBDTEtJRF9BT19BSEJfQlVTCSAgOTEKICNkZWZpbmUgQ0xLSURfQU9fSUZBQ0UJCSAgOTIKICNkZWZpbmUgQ0xLSURfQU9fSTJDCQkgIDkzCisvKiBDTEtJRF9TRF9FTU1DX0EgKi8KKy8qIENMS0lEX1NEX0VNTUNfQiAqLworLyogQ0xLSURfU0RfRU1NQ19DICovCiAKLSNkZWZpbmUgTlJfQ0xLUwkJCSAgOTQKKyNkZWZpbmUgTlJfQ0xLUwkJCSAgOTcKIAogLyogaW5jbHVkZSB0aGUgQ0xLSURzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgcGFydCBvZiB0aGUgc3RhYmxlIERUIGJpbmRpbmcgKi8KICNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9neGJiLWNsa2MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lc29uL21lc29uOGItY2xrYy5jIGIvZHJpdmVycy9jbGsvbWVzb24vbWVzb244Yi1jbGtjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTQxM2MuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jbGsvbWVzb24vbWVzb244Yi1jbGtjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotLyoKLSAqIEFtTG9naWMgUzgwNSAvIE1lc29uOGIgQ2xvY2sgQ29udHJvbGxlciBEcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUgRW5kbGVzcyBNb2JpbGUsIEluYy4KLSAqIEF1dGhvcjogQ2FybG8gQ2Fpb25lIDxjYXJsb0BlbmRsZXNzbS5jb20+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDE2IEJheUxpYnJlLCBJbmMuCi0gKiBNaWNoYWVsIFR1cnF1ZXR0ZSA8bXR1cnF1ZXR0ZUBiYXlsaWJyZS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgotI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL21lc29uOGItY2xrYy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgImNsa2MuaCIKLQotLyoKLSAqIENsb2NrIGNvbnRyb2xsZXIgcmVnaXN0ZXIgb2Zmc2V0cwotICoKLSAqIFJlZ2lzdGVyIG9mZnNldHMgZnJvbSB0aGUgSGFyZEtlcm5lbFswXSBkYXRhIHNoZWV0IGFyZSBsaXN0ZWQgaW4gY29tbWVudAotICogYmxvY2tzIGJlbG93LiBUaG9zZSBvZmZzZXRzIG11c3QgYmUgbXVsdGlwbGllZCBieSA0IGJlZm9yZSBhZGRpbmcgdGhlbSB0bwotICogdGhlIGJhc2UgYWRkcmVzcyB0byBnZXQgdGhlIHJpZ2h0IHZhbHVlCi0gKgotICogWzBdIGh0dHA6Ly9kbi5vZHJvaWQuY29tL1M4MDUvRGF0YXNoZWV0L1M4MDVfRGF0YXNoZWV0JTIwVjAuOCUyMDIwMTUwMTI2LnBkZgotICovCi0jZGVmaW5lIE1FU09OOEJfUkVHX1NZU19DUFVfQ05UTDEJMHgwMTVjIC8qIDB4NTcgb2Zmc2V0IGluIGRhdGEgc2hlZXQgKi8KLSNkZWZpbmUgTUVTT044Ql9SRUdfSEhJX01QRUcJCTB4MDE3NCAvKiAweDVkIG9mZnNldCBpbiBkYXRhIHNoZWV0ICovCi0jZGVmaW5lIE1FU09OOEJfUkVHX01BTEkJCTB4MDFiMCAvKiAweDZjIG9mZnNldCBpbiBkYXRhIHNoZWV0ICovCi0jZGVmaW5lIE1FU09OOEJfUkVHX1BMTF9GSVhFRAkJMHgwMjgwCi0jZGVmaW5lIE1FU09OOEJfUkVHX1BMTF9TWVMJCTB4MDMwMAotI2RlZmluZSBNRVNPTjhCX1JFR19QTExfVklECQkweDAzMjAKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhjbGtfbG9jayk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGxsX3JhdGVfdGFibGUgc3lzX3BsbF9yYXRlX3RhYmxlW10gPSB7Ci0JUExMX1JBVEUoMzEyMDAwMDAwLCA1MiwgMSwgMiksCi0JUExMX1JBVEUoMzM2MDAwMDAwLCA1NiwgMSwgMiksCi0JUExMX1JBVEUoMzYwMDAwMDAwLCA2MCwgMSwgMiksCi0JUExMX1JBVEUoMzg0MDAwMDAwLCA2NCwgMSwgMiksCi0JUExMX1JBVEUoNDA4MDAwMDAwLCA2OCwgMSwgMiksCi0JUExMX1JBVEUoNDMyMDAwMDAwLCA3MiwgMSwgMiksCi0JUExMX1JBVEUoNDU2MDAwMDAwLCA3NiwgMSwgMiksCi0JUExMX1JBVEUoNDgwMDAwMDAwLCA4MCwgMSwgMiksCi0JUExMX1JBVEUoNTA0MDAwMDAwLCA4NCwgMSwgMiksCi0JUExMX1JBVEUoNTI4MDAwMDAwLCA4OCwgMSwgMiksCi0JUExMX1JBVEUoNTUyMDAwMDAwLCA5MiwgMSwgMiksCi0JUExMX1JBVEUoNTc2MDAwMDAwLCA5NiwgMSwgMiksCi0JUExMX1JBVEUoNjAwMDAwMDAwLCA1MCwgMSwgMSksCi0JUExMX1JBVEUoNjI0MDAwMDAwLCA1MiwgMSwgMSksCi0JUExMX1JBVEUoNjQ4MDAwMDAwLCA1NCwgMSwgMSksCi0JUExMX1JBVEUoNjcyMDAwMDAwLCA1NiwgMSwgMSksCi0JUExMX1JBVEUoNjk2MDAwMDAwLCA1OCwgMSwgMSksCi0JUExMX1JBVEUoNzIwMDAwMDAwLCA2MCwgMSwgMSksCi0JUExMX1JBVEUoNzQ0MDAwMDAwLCA2MiwgMSwgMSksCi0JUExMX1JBVEUoNzY4MDAwMDAwLCA2NCwgMSwgMSksCi0JUExMX1JBVEUoNzkyMDAwMDAwLCA2NiwgMSwgMSksCi0JUExMX1JBVEUoODE2MDAwMDAwLCA2OCwgMSwgMSksCi0JUExMX1JBVEUoODQwMDAwMDAwLCA3MCwgMSwgMSksCi0JUExMX1JBVEUoODY0MDAwMDAwLCA3MiwgMSwgMSksCi0JUExMX1JBVEUoODg4MDAwMDAwLCA3NCwgMSwgMSksCi0JUExMX1JBVEUoOTEyMDAwMDAwLCA3NiwgMSwgMSksCi0JUExMX1JBVEUoOTM2MDAwMDAwLCA3OCwgMSwgMSksCi0JUExMX1JBVEUoOTYwMDAwMDAwLCA4MCwgMSwgMSksCi0JUExMX1JBVEUoOTg0MDAwMDAwLCA4MiwgMSwgMSksCi0JUExMX1JBVEUoMTAwODAwMDAwMCwgODQsIDEsIDEpLAotCVBMTF9SQVRFKDEwMzIwMDAwMDAsIDg2LCAxLCAxKSwKLQlQTExfUkFURSgxMDU2MDAwMDAwLCA4OCwgMSwgMSksCi0JUExMX1JBVEUoMTA4MDAwMDAwMCwgOTAsIDEsIDEpLAotCVBMTF9SQVRFKDExMDQwMDAwMDAsIDkyLCAxLCAxKSwKLQlQTExfUkFURSgxMTI4MDAwMDAwLCA5NCwgMSwgMSksCi0JUExMX1JBVEUoMTE1MjAwMDAwMCwgOTYsIDEsIDEpLAotCVBMTF9SQVRFKDExNzYwMDAwMDAsIDk4LCAxLCAxKSwKLQlQTExfUkFURSgxMjAwMDAwMDAwLCA1MCwgMSwgMCksCi0JUExMX1JBVEUoMTIyNDAwMDAwMCwgNTEsIDEsIDApLAotCVBMTF9SQVRFKDEyNDgwMDAwMDAsIDUyLCAxLCAwKSwKLQlQTExfUkFURSgxMjcyMDAwMDAwLCA1MywgMSwgMCksCi0JUExMX1JBVEUoMTI5NjAwMDAwMCwgNTQsIDEsIDApLAotCVBMTF9SQVRFKDEzMjAwMDAwMDAsIDU1LCAxLCAwKSwKLQlQTExfUkFURSgxMzQ0MDAwMDAwLCA1NiwgMSwgMCksCi0JUExMX1JBVEUoMTM2ODAwMDAwMCwgNTcsIDEsIDApLAotCVBMTF9SQVRFKDEzOTIwMDAwMDAsIDU4LCAxLCAwKSwKLQlQTExfUkFURSgxNDE2MDAwMDAwLCA1OSwgMSwgMCksCi0JUExMX1JBVEUoMTQ0MDAwMDAwMCwgNjAsIDEsIDApLAotCVBMTF9SQVRFKDE0NjQwMDAwMDAsIDYxLCAxLCAwKSwKLQlQTExfUkFURSgxNDg4MDAwMDAwLCA2MiwgMSwgMCksCi0JUExMX1JBVEUoMTUxMjAwMDAwMCwgNjMsIDEsIDApLAotCVBMTF9SQVRFKDE1MzYwMDAwMDAsIDY0LCAxLCAwKSwKLQl7IC8qIHNlbnRpbmVsICovIH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa19kaXZfdGFibGUgY3B1X2Rpdl90YWJsZVtdID0gewotCXsgLnZhbCA9IDEsIC5kaXYgPSAxIH0sCi0JeyAudmFsID0gMiwgLmRpdiA9IDIgfSwKLQl7IC52YWwgPSAzLCAuZGl2ID0gMyB9LAotCXsgLnZhbCA9IDIsIC5kaXYgPSA0IH0sCi0JeyAudmFsID0gMywgLmRpdiA9IDYgfSwKLQl7IC52YWwgPSA0LCAuZGl2ID0gOCB9LAotCXsgLnZhbCA9IDUsIC5kaXYgPSAxMCB9LAotCXsgLnZhbCA9IDYsIC5kaXYgPSAxMiB9LAotCXsgLnZhbCA9IDcsIC5kaXYgPSAxNCB9LAotCXsgLnZhbCA9IDgsIC5kaXYgPSAxNiB9LAotCXsgLyogc2VudGluZWwgKi8gfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX2ZpeGVkX3JhdGUgbWVzb244Yl94dGFsID0gewotCS5maXhlZF9yYXRlID0gMjQwMDAwMDAsCi0JLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKLQkJLm5hbWUgPSAieHRhbCIsCi0JCS5udW1fcGFyZW50cyA9IDAsCi0JCS5vcHMgPSAmY2xrX2ZpeGVkX3JhdGVfb3BzLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1lc29uX2Nsa19wbGwgbWVzb244Yl9maXhlZF9wbGwgPSB7Ci0JLm0gPSB7Ci0JCS5yZWdfb2ZmID0gTUVTT044Ql9SRUdfUExMX0ZJWEVELAotCQkuc2hpZnQgICA9IDAsCi0JCS53aWR0aCAgID0gOSwKLQl9LAotCS5uID0gewotCQkucmVnX29mZiA9IE1FU09OOEJfUkVHX1BMTF9GSVhFRCwKLQkJLnNoaWZ0ICAgPSA5LAotCQkud2lkdGggICA9IDUsCi0JfSwKLQkub2QgPSB7Ci0JCS5yZWdfb2ZmID0gTUVTT044Ql9SRUdfUExMX0ZJWEVELAotCQkuc2hpZnQgICA9IDE2LAotCQkud2lkdGggICA9IDIsCi0JfSwKLQkubG9jayA9ICZjbGtfbG9jaywKLQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpewotCQkubmFtZSA9ICJmaXhlZF9wbGwiLAotCQkub3BzID0gJm1lc29uX2Nsa19wbGxfcm9fb3BzLAotCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgInh0YWwiIH0sCi0JCS5udW1fcGFyZW50cyA9IDEsCi0JCS5mbGFncyA9IENMS19HRVRfUkFURV9OT0NBQ0hFLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1lc29uX2Nsa19wbGwgbWVzb244Yl92aWRfcGxsID0gewotCS5tID0gewotCQkucmVnX29mZiA9IE1FU09OOEJfUkVHX1BMTF9WSUQsCi0JCS5zaGlmdCAgID0gMCwKLQkJLndpZHRoICAgPSA5LAotCX0sCi0JLm4gPSB7Ci0JCS5yZWdfb2ZmID0gTUVTT044Ql9SRUdfUExMX1ZJRCwKLQkJLnNoaWZ0ICAgPSA5LAotCQkud2lkdGggICA9IDUsCi0JfSwKLQkub2QgPSB7Ci0JCS5yZWdfb2ZmID0gTUVTT044Ql9SRUdfUExMX1ZJRCwKLQkJLnNoaWZ0ICAgPSAxNiwKLQkJLndpZHRoICAgPSAyLAotCX0sCi0JLmxvY2sgPSAmY2xrX2xvY2ssCi0JLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKLQkJLm5hbWUgPSAidmlkX3BsbCIsCi0JCS5vcHMgPSAmbWVzb25fY2xrX3BsbF9yb19vcHMsCi0JCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAieHRhbCIgfSwKLQkJLm51bV9wYXJlbnRzID0gMSwKLQkJLmZsYWdzID0gQ0xLX0dFVF9SQVRFX05PQ0FDSEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWVzb25fY2xrX3BsbCBtZXNvbjhiX3N5c19wbGwgPSB7Ci0JLm0gPSB7Ci0JCS5yZWdfb2ZmID0gTUVTT044Ql9SRUdfUExMX1NZUywKLQkJLnNoaWZ0ICAgPSAwLAotCQkud2lkdGggICA9IDksCi0JfSwKLQkubiA9IHsKLQkJLnJlZ19vZmYgPSBNRVNPTjhCX1JFR19QTExfU1lTLAotCQkuc2hpZnQgICA9IDksCi0JCS53aWR0aCAgID0gNSwKLQl9LAotCS5vZCA9IHsKLQkJLnJlZ19vZmYgPSBNRVNPTjhCX1JFR19QTExfU1lTLAotCQkuc2hpZnQgICA9IDE2LAotCQkud2lkdGggICA9IDIsCi0JfSwKLQkucmF0ZV90YWJsZSA9IHN5c19wbGxfcmF0ZV90YWJsZSwKLQkucmF0ZV9jb3VudCA9IEFSUkFZX1NJWkUoc3lzX3BsbF9yYXRlX3RhYmxlKSwKLQkubG9jayA9ICZjbGtfbG9jaywKLQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpewotCQkubmFtZSA9ICJzeXNfcGxsIiwKLQkJLm9wcyA9ICZtZXNvbl9jbGtfcGxsX29wcywKLQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJ4dGFsIiB9LAotCQkubnVtX3BhcmVudHMgPSAxLAotCQkuZmxhZ3MgPSBDTEtfR0VUX1JBVEVfTk9DQUNIRSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtfZml4ZWRfZmFjdG9yIG1lc29uOGJfZmNsa19kaXYyID0gewotCS5tdWx0ID0gMSwKLQkuZGl2ID0gMiwKLQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpewotCQkubmFtZSA9ICJmY2xrX2RpdjIiLAotCQkub3BzID0gJmNsa19maXhlZF9mYWN0b3Jfb3BzLAotCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImZpeGVkX3BsbCIgfSwKLQkJLm51bV9wYXJlbnRzID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtfZml4ZWRfZmFjdG9yIG1lc29uOGJfZmNsa19kaXYzID0gewotCS5tdWx0ID0gMSwKLQkuZGl2ID0gMywKLQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpewotCQkubmFtZSA9ICJmY2xrX2RpdjMiLAotCQkub3BzID0gJmNsa19maXhlZF9mYWN0b3Jfb3BzLAotCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImZpeGVkX3BsbCIgfSwKLQkJLm51bV9wYXJlbnRzID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtfZml4ZWRfZmFjdG9yIG1lc29uOGJfZmNsa19kaXY0ID0gewotCS5tdWx0ID0gMSwKLQkuZGl2ID0gNCwKLQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpewotCQkubmFtZSA9ICJmY2xrX2RpdjQiLAotCQkub3BzID0gJmNsa19maXhlZF9mYWN0b3Jfb3BzLAotCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImZpeGVkX3BsbCIgfSwKLQkJLm51bV9wYXJlbnRzID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtfZml4ZWRfZmFjdG9yIG1lc29uOGJfZmNsa19kaXY1ID0gewotCS5tdWx0ID0gMSwKLQkuZGl2ID0gNSwKLQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpewotCQkubmFtZSA9ICJmY2xrX2RpdjUiLAotCQkub3BzID0gJmNsa19maXhlZF9mYWN0b3Jfb3BzLAotCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImZpeGVkX3BsbCIgfSwKLQkJLm51bV9wYXJlbnRzID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtfZml4ZWRfZmFjdG9yIG1lc29uOGJfZmNsa19kaXY3ID0gewotCS5tdWx0ID0gMSwKLQkuZGl2ID0gNywKLQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpewotCQkubmFtZSA9ICJmY2xrX2RpdjciLAotCQkub3BzID0gJmNsa19maXhlZF9mYWN0b3Jfb3BzLAotCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImZpeGVkX3BsbCIgfSwKLQkJLm51bV9wYXJlbnRzID0gMSwKLQl9LAotfTsKLQotLyoKLSAqIEZJWE1FIGNwdSBjbG9ja3MgYW5kIHRoZSBsZWdhY3kgY29tcG9zaXRlIGNsb2NrcyAoZS5nLiBjbGs4MSkgYXJlIGJvdGggUExMCi0gKiBwb3N0LWRpdmlkZXJzIGFuZCBzaG91bGQgYmUgbW9kZWxlZCB3aXRoIHRoZWlyIHJlc3BlY3RpdmUgUExMcyB2aWEgdGhlCi0gKiBmb3J0aGNvbWluZyBjb29yZGluYXRlZCBjbG9jayByYXRlcyBmZWF0dXJlCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbWVzb25fY2xrX2NwdSBtZXNvbjhiX2NwdV9jbGsgPSB7Ci0JLnJlZ19vZmYgPSBNRVNPTjhCX1JFR19TWVNfQ1BVX0NOVEwxLAotCS5kaXZfdGFibGUgPSBjcHVfZGl2X3RhYmxlLAotCS5jbGtfbmIubm90aWZpZXJfY2FsbCA9IG1lc29uX2Nsa19jcHVfbm90aWZpZXJfY2IsCi0JLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKLQkJLm5hbWUgPSAiY3B1X2NsayIsCi0JCS5vcHMgPSAmbWVzb25fY2xrX2NwdV9vcHMsCi0JCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAic3lzX3BsbCIgfSwKLQkJLm51bV9wYXJlbnRzID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHUzMiBtdXhfdGFibGVfY2xrODFbXQk9IHsgNiwgNSwgNyB9OwotCi1zdHJ1Y3QgY2xrX211eCBtZXNvbjhiX21wZWdfY2xrX3NlbCA9IHsKLQkucmVnID0gKHZvaWQgKilNRVNPTjhCX1JFR19ISElfTVBFRywKLQkubWFzayA9IDB4NywKLQkuc2hpZnQgPSAxMiwKLQkuZmxhZ3MgPSBDTEtfTVVYX1JFQURfT05MWSwKLQkudGFibGUgPSBtdXhfdGFibGVfY2xrODEsCi0JLmxvY2sgPSAmY2xrX2xvY2ssCi0JLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKLQkJLm5hbWUgPSAibXBlZ19jbGtfc2VsIiwKLQkJLm9wcyA9ICZjbGtfbXV4X3JvX29wcywKLQkJLyoKLQkJICogRklYTUUgYml0cyAxNDoxMiBzZWxlY3RzIGZyb20gOCBwb3NzaWJsZSBwYXJlbnRzOgotCQkgKiB4dGFsLCAxJ2IwICh3dGYpLCBmY2xrX2RpdjcsIG1wbGxfY2xrb3V0MSwgbXBsbF9jbGtvdXQyLAotCQkgKiBmY2xrX2RpdjQsIGZjbGtfZGl2MywgZmNsa19kaXY1Ci0JCSAqLwotCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImZjbGtfZGl2MyIsICJmY2xrX2RpdjQiLAotCQkJImZjbGtfZGl2NSIgfSwKLQkJLm51bV9wYXJlbnRzID0gMywKLQkJLmZsYWdzID0gKENMS19TRVRfUkFURV9OT19SRVBBUkVOVCB8IENMS19JR05PUkVfVU5VU0VEKSwKLQl9LAotfTsKLQotc3RydWN0IGNsa19kaXZpZGVyIG1lc29uOGJfbXBlZ19jbGtfZGl2ID0gewotCS5yZWcgPSAodm9pZCAqKU1FU09OOEJfUkVHX0hISV9NUEVHLAotCS5zaGlmdCA9IDAsCi0JLndpZHRoID0gNywKLQkubG9jayA9ICZjbGtfbG9jaywKLQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpewotCQkubmFtZSA9ICJtcGVnX2Nsa19kaXYiLAotCQkub3BzID0gJmNsa19kaXZpZGVyX29wcywKLQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJtcGVnX2Nsa19zZWwiIH0sCi0JCS5udW1fcGFyZW50cyA9IDEsCi0JCS5mbGFncyA9IChDTEtfU0VUX1JBVEVfUEFSRU5UIHwgQ0xLX0lHTk9SRV9VTlVTRUQpLAotCX0sCi19OwotCi1zdHJ1Y3QgY2xrX2dhdGUgbWVzb244Yl9jbGs4MSA9IHsKLQkucmVnID0gKHZvaWQgKilNRVNPTjhCX1JFR19ISElfTVBFRywKLQkuYml0X2lkeCA9IDcsCi0JLmxvY2sgPSAmY2xrX2xvY2ssCi0JLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKLQkJLm5hbWUgPSAiY2xrODEiLAotCQkub3BzID0gJmNsa19nYXRlX29wcywKLQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJtcGVnX2Nsa19kaXYiIH0sCi0JCS5udW1fcGFyZW50cyA9IDEsCi0JCS5mbGFncyA9IChDTEtfU0VUX1JBVEVfUEFSRU5UIHwgQ0xLX0lHTk9SRV9VTlVTRUQpLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgbWVzb244Yl9od19vbmVjZWxsX2RhdGEgPSB7Ci0JLmh3cyA9IHsKLQkJW0NMS0lEX1hUQUxdID0gJm1lc29uOGJfeHRhbC5odywKLQkJW0NMS0lEX1BMTF9GSVhFRF0gPSAmbWVzb244Yl9maXhlZF9wbGwuaHcsCi0JCVtDTEtJRF9QTExfVklEXSA9ICZtZXNvbjhiX3ZpZF9wbGwuaHcsCi0JCVtDTEtJRF9QTExfU1lTXSA9ICZtZXNvbjhiX3N5c19wbGwuaHcsCi0JCVtDTEtJRF9GQ0xLX0RJVjJdID0gJm1lc29uOGJfZmNsa19kaXYyLmh3LAotCQlbQ0xLSURfRkNMS19ESVYzXSA9ICZtZXNvbjhiX2ZjbGtfZGl2My5odywKLQkJW0NMS0lEX0ZDTEtfRElWNF0gPSAmbWVzb244Yl9mY2xrX2RpdjQuaHcsCi0JCVtDTEtJRF9GQ0xLX0RJVjVdID0gJm1lc29uOGJfZmNsa19kaXY1Lmh3LAotCQlbQ0xLSURfRkNMS19ESVY3XSA9ICZtZXNvbjhiX2ZjbGtfZGl2Ny5odywKLQkJW0NMS0lEX0NQVUNMS10gPSAmbWVzb244Yl9jcHVfY2xrLmh3LAotCQlbQ0xLSURfTVBFR19TRUxdID0gJm1lc29uOGJfbXBlZ19jbGtfc2VsLmh3LAotCQlbQ0xLSURfTVBFR19ESVZdID0gJm1lc29uOGJfbXBlZ19jbGtfZGl2Lmh3LAotCQlbQ0xLSURfQ0xLODFdID0gJm1lc29uOGJfY2xrODEuaHcsCi0JfSwKLQkubnVtID0gQ0xLX05SX0NMS1MsCi19OwotCi1zdGF0aWMgc3RydWN0IG1lc29uX2Nsa19wbGwgKmNvbnN0IG1lc29uOGJfY2xrX3BsbHNbXSA9IHsKLQkmbWVzb244Yl9maXhlZF9wbGwsCi0JJm1lc29uOGJfdmlkX3BsbCwKLQkmbWVzb244Yl9zeXNfcGxsLAotfTsKLQotc3RhdGljIGludCBtZXNvbjhiX2Nsa2NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQl2b2lkIF9faW9tZW0gKmNsa19iYXNlOwotCWludCByZXQsIGNsa2lkLCBpOwotCXN0cnVjdCBjbGtfaHcgKnBhcmVudF9odzsKLQlzdHJ1Y3QgY2xrICpwYXJlbnRfY2xrOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0KLQkvKiAgR2VuZXJpYyBjbG9ja3MgYW5kIFBMTHMgKi8KLQljbGtfYmFzZSA9IG9mX2lvbWFwKGRldi0+b2Zfbm9kZSwgMSk7Ci0JaWYgKCFjbGtfYmFzZSkgewotCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gbWFwIGNsayBiYXNlXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JLyogUG9wdWxhdGUgYmFzZSBhZGRyZXNzIGZvciBQTExzICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWVzb244Yl9jbGtfcGxscyk7IGkrKykKLQkJbWVzb244Yl9jbGtfcGxsc1tpXS0+YmFzZSA9IGNsa19iYXNlOwotCi0JLyogUG9wdWxhdGUgdGhlIGJhc2UgYWRkcmVzcyBmb3IgQ1BVIGNsayAqLwotCW1lc29uOGJfY3B1X2Nsay5iYXNlID0gY2xrX2Jhc2U7Ci0KLQkvKiBQb3B1bGF0ZSB0aGUgYmFzZSBhZGRyZXNzIGZvciB0aGUgTVBFRyBjbGtzICovCi0JbWVzb244Yl9tcGVnX2Nsa19zZWwucmVnID0gY2xrX2Jhc2UgKyAodTMyKW1lc29uOGJfbXBlZ19jbGtfc2VsLnJlZzsKLQltZXNvbjhiX21wZWdfY2xrX2Rpdi5yZWcgPSBjbGtfYmFzZSArICh1MzIpbWVzb244Yl9tcGVnX2Nsa19kaXYucmVnOwotCW1lc29uOGJfY2xrODEucmVnID0gY2xrX2Jhc2UgKyAodTMyKW1lc29uOGJfY2xrODEucmVnOwotCi0JLyoKLQkgKiByZWdpc3RlciBhbGwgY2xrcwotCSAqIENMS0lEX1VOVVNFRCA9IDAsIHNvIHNraXAgaXQgYW5kIHN0YXJ0IHdpdGggQ0xLSURfWFRBTCA9IDEKLQkgKi8KLQlmb3IgKGNsa2lkID0gQ0xLSURfWFRBTDsgY2xraWQgPCBDTEtfTlJfQ0xLUzsgY2xraWQrKykgewotCQkvKiBhcnJheSBtaWdodCBiZSBzcGFyc2UgKi8KLQkJaWYgKCFtZXNvbjhiX2h3X29uZWNlbGxfZGF0YS5od3NbY2xraWRdKQotCQkJY29udGludWU7Ci0KLQkJLyogRklYTUUgY29udmVydCB0byBkZXZtX2Nsa19yZWdpc3RlciAqLwotCQlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcihkZXYsIG1lc29uOGJfaHdfb25lY2VsbF9kYXRhLmh3c1tjbGtpZF0pOwotCQlpZiAocmV0KQotCQkJZ290byBpb3VubWFwOwotCX0KLQotCS8qCi0JICogUmVnaXN0ZXIgQ1BVIGNsayBub3RpZmllcgotCSAqCi0JICogRklYTUUgdGhpcyBpcyB3cm9uZyBmb3IgYSBsb3Qgb2YgcmVhc29ucy4gRmlyc3QsIHRoZSBtdXhlcyBzaG91bGQgYmUKLQkgKiBzdHJ1Y3QgY2xrX2h3IG9iamVjdHMuIFNlY29uZCwgd2Ugc2hvdWxkbid0IHByb2dyYW0gdGhlIG11eGVzIGluCi0JICogbm90aWZpZXIgaGFuZGxlcnMuIFRoZSB0cmlja3kgcHJvZ3JhbW1pbmcgc2VxdWVuY2Ugd2lsbCBiZSBoYW5kbGVkCi0JICogYnkgdGhlIGZvcnRoY29taW5nIGNvb3JkaW5hdGVkIGNsb2NrIHJhdGVzIG1lY2hhbmlzbSBvbmNlIHRoYXQKLQkgKiBmZWF0dXJlIGlzIHJlbGVhc2VkLgotCSAqCi0JICogRnVydGhlcm1vcmUsIGxvb2tpbmcgdXAgdGhlIHBhcmVudCB0aGlzIHdheSBpcyB0ZXJyaWJsZS4gQXQgc29tZQotCSAqIHBvaW50IHdlIHdpbGwgc3RvcCBhbGxvY2F0aW5nIGEgZGVmYXVsdCBzdHJ1Y3QgY2xrIHdoZW4gcmVnaXN0ZXJpbmcKLQkgKiBhIG5ldyBjbGtfaHcsIGFuZCB0aGlzIGhhY2sgd2lsbCBubyBsb25nZXIgd29yay4gUmVsZWFzaW5nIHRoZSBjY3IKLQkgKiBmZWF0dXJlIGJlZm9yZSB0aGF0IHRpbWUgc29sdmVzIHRoZSBwcm9ibGVtIDotKQotCSAqLwotCXBhcmVudF9odyA9IGNsa19od19nZXRfcGFyZW50KCZtZXNvbjhiX2NwdV9jbGsuaHcpOwotCXBhcmVudF9jbGsgPSBwYXJlbnRfaHctPmNsazsKLQlyZXQgPSBjbGtfbm90aWZpZXJfcmVnaXN0ZXIocGFyZW50X2NsaywgJm1lc29uOGJfY3B1X2Nsay5jbGtfbmIpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGNsb2NrIG5vdGlmaWVyIGZvciBjcHVfY2xrXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJZ290byBpb3VubWFwOwotCX0KLQotCXJldHVybiBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKGRldi0+b2Zfbm9kZSwgb2ZfY2xrX2h3X29uZWNlbGxfZ2V0LAotCQkJJm1lc29uOGJfaHdfb25lY2VsbF9kYXRhKTsKLQotaW91bm1hcDoKLQlpb3VubWFwKGNsa19iYXNlKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtZXNvbjhiX2Nsa2NfbWF0Y2hfdGFibGVbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImFtbG9naWMsbWVzb244Yi1jbGtjIiB9LAotCXsgfQotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWVzb244Yl9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IG1lc29uOGJfY2xrY19wcm9iZSwKLQkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSAibWVzb244Yi1jbGtjIiwKLQkJLm9mX21hdGNoX3RhYmxlID0gbWVzb244Yl9jbGtjX21hdGNoX3RhYmxlLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtZXNvbjhiX2Nsa2NfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1lc29uOGJfZHJpdmVyKTsKLX0KLWRldmljZV9pbml0Y2FsbChtZXNvbjhiX2Nsa2NfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tZXNvbi9tZXNvbjhiLmMgYi9kcml2ZXJzL2Nsay9tZXNvbi9tZXNvbjhiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YxYmU0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL21lc29uL21lc29uOGIuYwpAQCAtMCwwICsxLDY3NiBAQAorLyoKKyAqIEFtTG9naWMgUzgwNSAvIE1lc29uOGIgQ2xvY2sgQ29udHJvbGxlciBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgRW5kbGVzcyBNb2JpbGUsIEluYy4KKyAqIEF1dGhvcjogQ2FybG8gQ2Fpb25lIDxjYXJsb0BlbmRsZXNzbS5jb20+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEJheUxpYnJlLCBJbmMuCisgKiBNaWNoYWVsIFR1cnF1ZXR0ZSA8bXR1cnF1ZXR0ZUBiYXlsaWJyZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgImNsa2MuaCIKKyNpbmNsdWRlICJtZXNvbjhiLmgiCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2xrX2xvY2spOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBsbF9yYXRlX3RhYmxlIHN5c19wbGxfcmF0ZV90YWJsZVtdID0geworCVBMTF9SQVRFKDMxMjAwMDAwMCwgNTIsIDEsIDIpLAorCVBMTF9SQVRFKDMzNjAwMDAwMCwgNTYsIDEsIDIpLAorCVBMTF9SQVRFKDM2MDAwMDAwMCwgNjAsIDEsIDIpLAorCVBMTF9SQVRFKDM4NDAwMDAwMCwgNjQsIDEsIDIpLAorCVBMTF9SQVRFKDQwODAwMDAwMCwgNjgsIDEsIDIpLAorCVBMTF9SQVRFKDQzMjAwMDAwMCwgNzIsIDEsIDIpLAorCVBMTF9SQVRFKDQ1NjAwMDAwMCwgNzYsIDEsIDIpLAorCVBMTF9SQVRFKDQ4MDAwMDAwMCwgODAsIDEsIDIpLAorCVBMTF9SQVRFKDUwNDAwMDAwMCwgODQsIDEsIDIpLAorCVBMTF9SQVRFKDUyODAwMDAwMCwgODgsIDEsIDIpLAorCVBMTF9SQVRFKDU1MjAwMDAwMCwgOTIsIDEsIDIpLAorCVBMTF9SQVRFKDU3NjAwMDAwMCwgOTYsIDEsIDIpLAorCVBMTF9SQVRFKDYwMDAwMDAwMCwgNTAsIDEsIDEpLAorCVBMTF9SQVRFKDYyNDAwMDAwMCwgNTIsIDEsIDEpLAorCVBMTF9SQVRFKDY0ODAwMDAwMCwgNTQsIDEsIDEpLAorCVBMTF9SQVRFKDY3MjAwMDAwMCwgNTYsIDEsIDEpLAorCVBMTF9SQVRFKDY5NjAwMDAwMCwgNTgsIDEsIDEpLAorCVBMTF9SQVRFKDcyMDAwMDAwMCwgNjAsIDEsIDEpLAorCVBMTF9SQVRFKDc0NDAwMDAwMCwgNjIsIDEsIDEpLAorCVBMTF9SQVRFKDc2ODAwMDAwMCwgNjQsIDEsIDEpLAorCVBMTF9SQVRFKDc5MjAwMDAwMCwgNjYsIDEsIDEpLAorCVBMTF9SQVRFKDgxNjAwMDAwMCwgNjgsIDEsIDEpLAorCVBMTF9SQVRFKDg0MDAwMDAwMCwgNzAsIDEsIDEpLAorCVBMTF9SQVRFKDg2NDAwMDAwMCwgNzIsIDEsIDEpLAorCVBMTF9SQVRFKDg4ODAwMDAwMCwgNzQsIDEsIDEpLAorCVBMTF9SQVRFKDkxMjAwMDAwMCwgNzYsIDEsIDEpLAorCVBMTF9SQVRFKDkzNjAwMDAwMCwgNzgsIDEsIDEpLAorCVBMTF9SQVRFKDk2MDAwMDAwMCwgODAsIDEsIDEpLAorCVBMTF9SQVRFKDk4NDAwMDAwMCwgODIsIDEsIDEpLAorCVBMTF9SQVRFKDEwMDgwMDAwMDAsIDg0LCAxLCAxKSwKKwlQTExfUkFURSgxMDMyMDAwMDAwLCA4NiwgMSwgMSksCisJUExMX1JBVEUoMTA1NjAwMDAwMCwgODgsIDEsIDEpLAorCVBMTF9SQVRFKDEwODAwMDAwMDAsIDkwLCAxLCAxKSwKKwlQTExfUkFURSgxMTA0MDAwMDAwLCA5MiwgMSwgMSksCisJUExMX1JBVEUoMTEyODAwMDAwMCwgOTQsIDEsIDEpLAorCVBMTF9SQVRFKDExNTIwMDAwMDAsIDk2LCAxLCAxKSwKKwlQTExfUkFURSgxMTc2MDAwMDAwLCA5OCwgMSwgMSksCisJUExMX1JBVEUoMTIwMDAwMDAwMCwgNTAsIDEsIDApLAorCVBMTF9SQVRFKDEyMjQwMDAwMDAsIDUxLCAxLCAwKSwKKwlQTExfUkFURSgxMjQ4MDAwMDAwLCA1MiwgMSwgMCksCisJUExMX1JBVEUoMTI3MjAwMDAwMCwgNTMsIDEsIDApLAorCVBMTF9SQVRFKDEyOTYwMDAwMDAsIDU0LCAxLCAwKSwKKwlQTExfUkFURSgxMzIwMDAwMDAwLCA1NSwgMSwgMCksCisJUExMX1JBVEUoMTM0NDAwMDAwMCwgNTYsIDEsIDApLAorCVBMTF9SQVRFKDEzNjgwMDAwMDAsIDU3LCAxLCAwKSwKKwlQTExfUkFURSgxMzkyMDAwMDAwLCA1OCwgMSwgMCksCisJUExMX1JBVEUoMTQxNjAwMDAwMCwgNTksIDEsIDApLAorCVBMTF9SQVRFKDE0NDAwMDAwMDAsIDYwLCAxLCAwKSwKKwlQTExfUkFURSgxNDY0MDAwMDAwLCA2MSwgMSwgMCksCisJUExMX1JBVEUoMTQ4ODAwMDAwMCwgNjIsIDEsIDApLAorCVBMTF9SQVRFKDE1MTIwMDAwMDAsIDYzLCAxLCAwKSwKKwlQTExfUkFURSgxNTM2MDAwMDAwLCA2NCwgMSwgMCksCisJeyAvKiBzZW50aW5lbCAqLyB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfZGl2X3RhYmxlIGNwdV9kaXZfdGFibGVbXSA9IHsKKwl7IC52YWwgPSAxLCAuZGl2ID0gMSB9LAorCXsgLnZhbCA9IDIsIC5kaXYgPSAyIH0sCisJeyAudmFsID0gMywgLmRpdiA9IDMgfSwKKwl7IC52YWwgPSAyLCAuZGl2ID0gNCB9LAorCXsgLnZhbCA9IDMsIC5kaXYgPSA2IH0sCisJeyAudmFsID0gNCwgLmRpdiA9IDggfSwKKwl7IC52YWwgPSA1LCAuZGl2ID0gMTAgfSwKKwl7IC52YWwgPSA2LCAuZGl2ID0gMTIgfSwKKwl7IC52YWwgPSA3LCAuZGl2ID0gMTQgfSwKKwl7IC52YWwgPSA4LCAuZGl2ID0gMTYgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19maXhlZF9yYXRlIG1lc29uOGJfeHRhbCA9IHsKKwkuZml4ZWRfcmF0ZSA9IDI0MDAwMDAwLAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gInh0YWwiLAorCQkubnVtX3BhcmVudHMgPSAwLAorCQkub3BzID0gJmNsa19maXhlZF9yYXRlX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtZXNvbl9jbGtfcGxsIG1lc29uOGJfZml4ZWRfcGxsID0geworCS5tID0geworCQkucmVnX29mZiA9IEhISV9NUExMX0NOVEwsCisJCS5zaGlmdCAgID0gMCwKKwkJLndpZHRoICAgPSA5LAorCX0sCisJLm4gPSB7CisJCS5yZWdfb2ZmID0gSEhJX01QTExfQ05UTCwKKwkJLnNoaWZ0ICAgPSA5LAorCQkud2lkdGggICA9IDUsCisJfSwKKwkub2QgPSB7CisJCS5yZWdfb2ZmID0gSEhJX01QTExfQ05UTCwKKwkJLnNoaWZ0ICAgPSAxNiwKKwkJLndpZHRoICAgPSAyLAorCX0sCisJLmxvY2sgPSAmY2xrX2xvY2ssCisJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJLm5hbWUgPSAiZml4ZWRfcGxsIiwKKwkJLm9wcyA9ICZtZXNvbl9jbGtfcGxsX3JvX29wcywKKwkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJ4dGFsIiB9LAorCQkubnVtX3BhcmVudHMgPSAxLAorCQkuZmxhZ3MgPSBDTEtfR0VUX1JBVEVfTk9DQUNIRSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtZXNvbl9jbGtfcGxsIG1lc29uOGJfdmlkX3BsbCA9IHsKKwkubSA9IHsKKwkJLnJlZ19vZmYgPSBISElfVklEX1BMTF9DTlRMLAorCQkuc2hpZnQgICA9IDAsCisJCS53aWR0aCAgID0gOSwKKwl9LAorCS5uID0geworCQkucmVnX29mZiA9IEhISV9WSURfUExMX0NOVEwsCisJCS5zaGlmdCAgID0gOSwKKwkJLndpZHRoICAgPSA1LAorCX0sCisJLm9kID0geworCQkucmVnX29mZiA9IEhISV9WSURfUExMX0NOVEwsCisJCS5zaGlmdCAgID0gMTYsCisJCS53aWR0aCAgID0gMiwKKwl9LAorCS5sb2NrID0gJmNsa19sb2NrLAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gInZpZF9wbGwiLAorCQkub3BzID0gJm1lc29uX2Nsa19wbGxfcm9fb3BzLAorCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgInh0YWwiIH0sCisJCS5udW1fcGFyZW50cyA9IDEsCisJCS5mbGFncyA9IENMS19HRVRfUkFURV9OT0NBQ0hFLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG1lc29uX2Nsa19wbGwgbWVzb244Yl9zeXNfcGxsID0geworCS5tID0geworCQkucmVnX29mZiA9IEhISV9TWVNfUExMX0NOVEwsCisJCS5zaGlmdCAgID0gMCwKKwkJLndpZHRoICAgPSA5LAorCX0sCisJLm4gPSB7CisJCS5yZWdfb2ZmID0gSEhJX1NZU19QTExfQ05UTCwKKwkJLnNoaWZ0ICAgPSA5LAorCQkud2lkdGggICA9IDUsCisJfSwKKwkub2QgPSB7CisJCS5yZWdfb2ZmID0gSEhJX1NZU19QTExfQ05UTCwKKwkJLnNoaWZ0ICAgPSAxNiwKKwkJLndpZHRoICAgPSAyLAorCX0sCisJLnJhdGVfdGFibGUgPSBzeXNfcGxsX3JhdGVfdGFibGUsCisJLnJhdGVfY291bnQgPSBBUlJBWV9TSVpFKHN5c19wbGxfcmF0ZV90YWJsZSksCisJLmxvY2sgPSAmY2xrX2xvY2ssCisJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJLm5hbWUgPSAic3lzX3BsbCIsCisJCS5vcHMgPSAmbWVzb25fY2xrX3BsbF9vcHMsCisJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAieHRhbCIgfSwKKwkJLm51bV9wYXJlbnRzID0gMSwKKwkJLmZsYWdzID0gQ0xLX0dFVF9SQVRFX05PQ0FDSEUsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2ZpeGVkX2ZhY3RvciBtZXNvbjhiX2ZjbGtfZGl2MiA9IHsKKwkubXVsdCA9IDEsCisJLmRpdiA9IDIsCisJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJLm5hbWUgPSAiZmNsa19kaXYyIiwKKwkJLm9wcyA9ICZjbGtfZml4ZWRfZmFjdG9yX29wcywKKwkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJmaXhlZF9wbGwiIH0sCisJCS5udW1fcGFyZW50cyA9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2ZpeGVkX2ZhY3RvciBtZXNvbjhiX2ZjbGtfZGl2MyA9IHsKKwkubXVsdCA9IDEsCisJLmRpdiA9IDMsCisJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJLm5hbWUgPSAiZmNsa19kaXYzIiwKKwkJLm9wcyA9ICZjbGtfZml4ZWRfZmFjdG9yX29wcywKKwkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJmaXhlZF9wbGwiIH0sCisJCS5udW1fcGFyZW50cyA9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2ZpeGVkX2ZhY3RvciBtZXNvbjhiX2ZjbGtfZGl2NCA9IHsKKwkubXVsdCA9IDEsCisJLmRpdiA9IDQsCisJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJLm5hbWUgPSAiZmNsa19kaXY0IiwKKwkJLm9wcyA9ICZjbGtfZml4ZWRfZmFjdG9yX29wcywKKwkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJmaXhlZF9wbGwiIH0sCisJCS5udW1fcGFyZW50cyA9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2ZpeGVkX2ZhY3RvciBtZXNvbjhiX2ZjbGtfZGl2NSA9IHsKKwkubXVsdCA9IDEsCisJLmRpdiA9IDUsCisJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJLm5hbWUgPSAiZmNsa19kaXY1IiwKKwkJLm9wcyA9ICZjbGtfZml4ZWRfZmFjdG9yX29wcywKKwkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJmaXhlZF9wbGwiIH0sCisJCS5udW1fcGFyZW50cyA9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2ZpeGVkX2ZhY3RvciBtZXNvbjhiX2ZjbGtfZGl2NyA9IHsKKwkubXVsdCA9IDEsCisJLmRpdiA9IDcsCisJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJLm5hbWUgPSAiZmNsa19kaXY3IiwKKwkJLm9wcyA9ICZjbGtfZml4ZWRfZmFjdG9yX29wcywKKwkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJmaXhlZF9wbGwiIH0sCisJCS5udW1fcGFyZW50cyA9IDEsCisJfSwKK307CisKKy8qCisgKiBGSVhNRSBjcHUgY2xvY2tzIGFuZCB0aGUgbGVnYWN5IGNvbXBvc2l0ZSBjbG9ja3MgKGUuZy4gY2xrODEpIGFyZSBib3RoIFBMTAorICogcG9zdC1kaXZpZGVycyBhbmQgc2hvdWxkIGJlIG1vZGVsZWQgd2l0aCB0aGVpciByZXNwZWN0aXZlIFBMTHMgdmlhIHRoZQorICogZm9ydGhjb21pbmcgY29vcmRpbmF0ZWQgY2xvY2sgcmF0ZXMgZmVhdHVyZQorICovCitzdGF0aWMgc3RydWN0IG1lc29uX2Nsa19jcHUgbWVzb244Yl9jcHVfY2xrID0geworCS5yZWdfb2ZmID0gSEhJX1NZU19DUFVfQ0xLX0NOVEwxLAorCS5kaXZfdGFibGUgPSBjcHVfZGl2X3RhYmxlLAorCS5jbGtfbmIubm90aWZpZXJfY2FsbCA9IG1lc29uX2Nsa19jcHVfbm90aWZpZXJfY2IsCisJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJLm5hbWUgPSAiY3B1X2NsayIsCisJCS5vcHMgPSAmbWVzb25fY2xrX2NwdV9vcHMsCisJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAic3lzX3BsbCIgfSwKKwkJLm51bV9wYXJlbnRzID0gMSwKKwl9LAorfTsKKworc3RhdGljIHUzMiBtdXhfdGFibGVfY2xrODFbXQk9IHsgNiwgNSwgNyB9OworCitzdHJ1Y3QgY2xrX211eCBtZXNvbjhiX21wZWdfY2xrX3NlbCA9IHsKKwkucmVnID0gKHZvaWQgKilISElfTVBFR19DTEtfQ05UTCwKKwkubWFzayA9IDB4NywKKwkuc2hpZnQgPSAxMiwKKwkuZmxhZ3MgPSBDTEtfTVVYX1JFQURfT05MWSwKKwkudGFibGUgPSBtdXhfdGFibGVfY2xrODEsCisJLmxvY2sgPSAmY2xrX2xvY2ssCisJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJLm5hbWUgPSAibXBlZ19jbGtfc2VsIiwKKwkJLm9wcyA9ICZjbGtfbXV4X3JvX29wcywKKwkJLyoKKwkJICogRklYTUUgYml0cyAxNDoxMiBzZWxlY3RzIGZyb20gOCBwb3NzaWJsZSBwYXJlbnRzOgorCQkgKiB4dGFsLCAxJ2IwICh3dGYpLCBmY2xrX2RpdjcsIG1wbGxfY2xrb3V0MSwgbXBsbF9jbGtvdXQyLAorCQkgKiBmY2xrX2RpdjQsIGZjbGtfZGl2MywgZmNsa19kaXY1CisJCSAqLworCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImZjbGtfZGl2MyIsICJmY2xrX2RpdjQiLAorCQkJImZjbGtfZGl2NSIgfSwKKwkJLm51bV9wYXJlbnRzID0gMywKKwkJLmZsYWdzID0gKENMS19TRVRfUkFURV9OT19SRVBBUkVOVCB8IENMS19JR05PUkVfVU5VU0VEKSwKKwl9LAorfTsKKworc3RydWN0IGNsa19kaXZpZGVyIG1lc29uOGJfbXBlZ19jbGtfZGl2ID0geworCS5yZWcgPSAodm9pZCAqKUhISV9NUEVHX0NMS19DTlRMLAorCS5zaGlmdCA9IDAsCisJLndpZHRoID0gNywKKwkubG9jayA9ICZjbGtfbG9jaywKKwkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkubmFtZSA9ICJtcGVnX2Nsa19kaXYiLAorCQkub3BzID0gJmNsa19kaXZpZGVyX29wcywKKwkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJtcGVnX2Nsa19zZWwiIH0sCisJCS5udW1fcGFyZW50cyA9IDEsCisJCS5mbGFncyA9IChDTEtfU0VUX1JBVEVfUEFSRU5UIHwgQ0xLX0lHTk9SRV9VTlVTRUQpLAorCX0sCit9OworCitzdHJ1Y3QgY2xrX2dhdGUgbWVzb244Yl9jbGs4MSA9IHsKKwkucmVnID0gKHZvaWQgKilISElfTVBFR19DTEtfQ05UTCwKKwkuYml0X2lkeCA9IDcsCisJLmxvY2sgPSAmY2xrX2xvY2ssCisJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJLm5hbWUgPSAiY2xrODEiLAorCQkub3BzID0gJmNsa19nYXRlX29wcywKKwkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJtcGVnX2Nsa19kaXYiIH0sCisJCS5udW1fcGFyZW50cyA9IDEsCisJCS5mbGFncyA9IChDTEtfU0VUX1JBVEVfUEFSRU5UIHwgQ0xLX0lHTk9SRV9VTlVTRUQpLAorCX0sCit9OworCisvKiBFdmVyeXRoaW5nIEVsc2UgKEVFKSBkb21haW4gZ2F0ZXMgKi8KKworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9kZHIsIEhISV9HQ0xLX01QRUcwLCAwKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfZG9zLCBISElfR0NMS19NUEVHMCwgMSk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2lzYSwgSEhJX0dDTEtfTVBFRzAsIDUpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9wbDMwMSwgSEhJX0dDTEtfTVBFRzAsIDYpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9wZXJpcGhzLCBISElfR0NMS19NUEVHMCwgNyk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3NwaWNjLCBISElfR0NMS19NUEVHMCwgOCk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2kyYywgSEhJX0dDTEtfTVBFRzAsIDkpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9zYXJfYWRjLCBISElfR0NMS19NUEVHMCwgMTApOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9zbWFydF9jYXJkLCBISElfR0NMS19NUEVHMCwgMTEpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9ybmcwLCBISElfR0NMS19NUEVHMCwgMTIpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl91YXJ0MCwgSEhJX0dDTEtfTVBFRzAsIDEzKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfc2RoYywgSEhJX0dDTEtfTVBFRzAsIDE0KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfc3RyZWFtLCBISElfR0NMS19NUEVHMCwgMTUpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9hc3luY19maWZvLCBISElfR0NMS19NUEVHMCwgMTYpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9zZGlvLCBISElfR0NMS19NUEVHMCwgMTcpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9hYnVmLCBISElfR0NMS19NUEVHMCwgMTgpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9oaXVfaWZhY2UsIEhISV9HQ0xLX01QRUcwLCAxOSk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2Fzc2lzdF9taXNjLCBISElfR0NMS19NUEVHMCwgMjMpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9zcGksIEhISV9HQ0xLX01QRUcwLCAzMCk7CisKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfaTJzX3NwZGlmLCBISElfR0NMS19NUEVHMSwgMik7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2V0aCwgSEhJX0dDTEtfTVBFRzEsIDMpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9kZW11eCwgSEhJX0dDTEtfTVBFRzEsIDQpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9haXVfZ2x1ZSwgSEhJX0dDTEtfTVBFRzEsIDYpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9pZWM5NTgsIEhISV9HQ0xLX01QRUcxLCA3KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfaTJzX291dCwgSEhJX0dDTEtfTVBFRzEsIDgpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9hbWNsaywgSEhJX0dDTEtfTVBFRzEsIDkpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9haWZpZm8yLCBISElfR0NMS19NUEVHMSwgMTApOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9taXhlciwgSEhJX0dDTEtfTVBFRzEsIDExKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfbWl4ZXJfaWZhY2UsIEhISV9HQ0xLX01QRUcxLCAxMik7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2FkYywgSEhJX0dDTEtfTVBFRzEsIDEzKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfYmxrbXYsIEhISV9HQ0xLX01QRUcxLCAxNCk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2FpdSwgSEhJX0dDTEtfTVBFRzEsIDE1KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfdWFydDEsIEhISV9HQ0xLX01QRUcxLCAxNik7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2cyZCwgSEhJX0dDTEtfTVBFRzEsIDIwKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfdXNiMCwgSEhJX0dDTEtfTVBFRzEsIDIxKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfdXNiMSwgSEhJX0dDTEtfTVBFRzEsIDIyKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfcmVzZXQsIEhISV9HQ0xLX01QRUcxLCAyMyk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX25hbmQsIEhISV9HQ0xLX01QRUcxLCAyNCk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2Rvc19wYXJzZXIsIEhISV9HQ0xLX01QRUcxLCAyNSk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3VzYiwgSEhJX0dDTEtfTVBFRzEsIDI2KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfdmRpbjEsIEhISV9HQ0xLX01QRUcxLCAyOCk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2FoYl9hcmIwLCBISElfR0NMS19NUEVHMSwgMjkpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9lZnVzZSwgSEhJX0dDTEtfTVBFRzEsIDMwKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfYm9vdF9yb20sIEhISV9HQ0xLX01QRUcxLCAzMSk7CisKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfYWhiX2RhdGFfYnVzLCBISElfR0NMS19NUEVHMiwgMSk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2FoYl9jdHJsX2J1cywgSEhJX0dDTEtfTVBFRzIsIDIpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9oZG1pX2ludHJfc3luYywgSEhJX0dDTEtfTVBFRzIsIDMpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9oZG1pX3BjbGssIEhISV9HQ0xLX01QRUcyLCA0KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfdXNiMV9kZHJfYnJpZGdlLCBISElfR0NMS19NUEVHMiwgOCk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3VzYjBfZGRyX2JyaWRnZSwgSEhJX0dDTEtfTVBFRzIsIDkpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9tbWNfcGNsaywgSEhJX0dDTEtfTVBFRzIsIDExKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfZHZpbiwgSEhJX0dDTEtfTVBFRzIsIDEyKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfdWFydDIsIEhISV9HQ0xLX01QRUcyLCAxNSk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3NhbmEsIEhISV9HQ0xLX01QRUcyLCAyMik7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3ZwdV9pbnRyLCBISElfR0NMS19NUEVHMiwgMjUpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9zZWNfYWhiX2FoYjNfYnJpZGdlLCBISElfR0NMS19NUEVHMiwgMjYpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9jbGs4MV9hOSwgSEhJX0dDTEtfTVBFRzIsIDI5KTsKKworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl92Y2xrMl92ZW5jaTAsIEhISV9HQ0xLX09USEVSLCAxKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfdmNsazJfdmVuY2kxLCBISElfR0NMS19PVEhFUiwgMik7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3ZjbGsyX3ZlbmNwMCwgSEhJX0dDTEtfT1RIRVIsIDMpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl92Y2xrMl92ZW5jcDEsIEhISV9HQ0xLX09USEVSLCA0KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfZ2Nsa192ZW5jaV9pbnQsIEhISV9HQ0xLX09USEVSLCA4KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfZ2Nsa192ZW5jcF9pbnQsIEhISV9HQ0xLX09USEVSLCA5KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfZGFjX2NsaywgSEhJX0dDTEtfT1RIRVIsIDEwKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfYW9jbGtfZ2F0ZSwgSEhJX0dDTEtfT1RIRVIsIDE0KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfaWVjOTU4X2dhdGUsIEhISV9HQ0xLX09USEVSLCAxNik7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2VuYzQ4MHAsIEhISV9HQ0xLX09USEVSLCAyMCk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3JuZzEsIEhISV9HQ0xLX09USEVSLCAyMSk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2djbGtfdmVuY2xfaW50LCBISElfR0NMS19PVEhFUiwgMjIpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl92Y2xrMl92ZW5jbG1jYywgSEhJX0dDTEtfT1RIRVIsIDI0KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfdmNsazJfdmVuY2wsIEhISV9HQ0xLX09USEVSLCAyNSk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3ZjbGsyX290aGVyLCBISElfR0NMS19PVEhFUiwgMjYpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9lZHAsIEhISV9HQ0xLX09USEVSLCAzMSk7CisKKy8qIEFsd2F5cyBPbiAoQU8pIGRvbWFpbiBnYXRlcyAqLworCitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2FvX21lZGlhX2NwdSwgSEhJX0dDTEtfQU8sIDApOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9hb19haGJfc3JhbSwgSEhJX0dDTEtfQU8sIDEpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9hb19haGJfYnVzLCBISElfR0NMS19BTywgMik7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2FvX2lmYWNlLCBISElfR0NMS19BTywgMyk7CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3X29uZWNlbGxfZGF0YSBtZXNvbjhiX2h3X29uZWNlbGxfZGF0YSA9IHsKKwkuaHdzID0geworCQlbQ0xLSURfWFRBTF0gPSAmbWVzb244Yl94dGFsLmh3LAorCQlbQ0xLSURfUExMX0ZJWEVEXSA9ICZtZXNvbjhiX2ZpeGVkX3BsbC5odywKKwkJW0NMS0lEX1BMTF9WSURdID0gJm1lc29uOGJfdmlkX3BsbC5odywKKwkJW0NMS0lEX1BMTF9TWVNdID0gJm1lc29uOGJfc3lzX3BsbC5odywKKwkJW0NMS0lEX0ZDTEtfRElWMl0gPSAmbWVzb244Yl9mY2xrX2RpdjIuaHcsCisJCVtDTEtJRF9GQ0xLX0RJVjNdID0gJm1lc29uOGJfZmNsa19kaXYzLmh3LAorCQlbQ0xLSURfRkNMS19ESVY0XSA9ICZtZXNvbjhiX2ZjbGtfZGl2NC5odywKKwkJW0NMS0lEX0ZDTEtfRElWNV0gPSAmbWVzb244Yl9mY2xrX2RpdjUuaHcsCisJCVtDTEtJRF9GQ0xLX0RJVjddID0gJm1lc29uOGJfZmNsa19kaXY3Lmh3LAorCQlbQ0xLSURfQ1BVQ0xLXSA9ICZtZXNvbjhiX2NwdV9jbGsuaHcsCisJCVtDTEtJRF9NUEVHX1NFTF0gPSAmbWVzb244Yl9tcGVnX2Nsa19zZWwuaHcsCisJCVtDTEtJRF9NUEVHX0RJVl0gPSAmbWVzb244Yl9tcGVnX2Nsa19kaXYuaHcsCisJCVtDTEtJRF9DTEs4MV0gPSAmbWVzb244Yl9jbGs4MS5odywKKwkJW0NMS0lEX0REUl0JCSAgICA9ICZtZXNvbjhiX2Rkci5odywKKwkJW0NMS0lEX0RPU10JCSAgICA9ICZtZXNvbjhiX2Rvcy5odywKKwkJW0NMS0lEX0lTQV0JCSAgICA9ICZtZXNvbjhiX2lzYS5odywKKwkJW0NMS0lEX1BMMzAxXQkJICAgID0gJm1lc29uOGJfcGwzMDEuaHcsCisJCVtDTEtJRF9QRVJJUEhTXQkJICAgID0gJm1lc29uOGJfcGVyaXBocy5odywKKwkJW0NMS0lEX1NQSUNDXQkJICAgID0gJm1lc29uOGJfc3BpY2MuaHcsCisJCVtDTEtJRF9JMkNdCQkgICAgPSAmbWVzb244Yl9pMmMuaHcsCisJCVtDTEtJRF9TQVJfQURDXQkJICAgID0gJm1lc29uOGJfc2FyX2FkYy5odywKKwkJW0NMS0lEX1NNQVJUX0NBUkRdCSAgICA9ICZtZXNvbjhiX3NtYXJ0X2NhcmQuaHcsCisJCVtDTEtJRF9STkcwXQkJICAgID0gJm1lc29uOGJfcm5nMC5odywKKwkJW0NMS0lEX1VBUlQwXQkJICAgID0gJm1lc29uOGJfdWFydDAuaHcsCisJCVtDTEtJRF9TREhDXQkJICAgID0gJm1lc29uOGJfc2RoYy5odywKKwkJW0NMS0lEX1NUUkVBTV0JCSAgICA9ICZtZXNvbjhiX3N0cmVhbS5odywKKwkJW0NMS0lEX0FTWU5DX0ZJRk9dCSAgICA9ICZtZXNvbjhiX2FzeW5jX2ZpZm8uaHcsCisJCVtDTEtJRF9TRElPXQkJICAgID0gJm1lc29uOGJfc2Rpby5odywKKwkJW0NMS0lEX0FCVUZdCQkgICAgPSAmbWVzb244Yl9hYnVmLmh3LAorCQlbQ0xLSURfSElVX0lGQUNFXQkgICAgPSAmbWVzb244Yl9oaXVfaWZhY2UuaHcsCisJCVtDTEtJRF9BU1NJU1RfTUlTQ10JICAgID0gJm1lc29uOGJfYXNzaXN0X21pc2MuaHcsCisJCVtDTEtJRF9TUEldCQkgICAgPSAmbWVzb244Yl9zcGkuaHcsCisJCVtDTEtJRF9JMlNfU1BESUZdCSAgICA9ICZtZXNvbjhiX2kyc19zcGRpZi5odywKKwkJW0NMS0lEX0VUSF0JCSAgICA9ICZtZXNvbjhiX2V0aC5odywKKwkJW0NMS0lEX0RFTVVYXQkJICAgID0gJm1lc29uOGJfZGVtdXguaHcsCisJCVtDTEtJRF9BSVVfR0xVRV0JICAgID0gJm1lc29uOGJfYWl1X2dsdWUuaHcsCisJCVtDTEtJRF9JRUM5NThdCQkgICAgPSAmbWVzb244Yl9pZWM5NTguaHcsCisJCVtDTEtJRF9JMlNfT1VUXQkJICAgID0gJm1lc29uOGJfaTJzX291dC5odywKKwkJW0NMS0lEX0FNQ0xLXQkJICAgID0gJm1lc29uOGJfYW1jbGsuaHcsCisJCVtDTEtJRF9BSUZJRk8yXQkJICAgID0gJm1lc29uOGJfYWlmaWZvMi5odywKKwkJW0NMS0lEX01JWEVSXQkJICAgID0gJm1lc29uOGJfbWl4ZXIuaHcsCisJCVtDTEtJRF9NSVhFUl9JRkFDRV0JICAgID0gJm1lc29uOGJfbWl4ZXJfaWZhY2UuaHcsCisJCVtDTEtJRF9BRENdCQkgICAgPSAmbWVzb244Yl9hZGMuaHcsCisJCVtDTEtJRF9CTEtNVl0JCSAgICA9ICZtZXNvbjhiX2Jsa212Lmh3LAorCQlbQ0xLSURfQUlVXQkJICAgID0gJm1lc29uOGJfYWl1Lmh3LAorCQlbQ0xLSURfVUFSVDFdCQkgICAgPSAmbWVzb244Yl91YXJ0MS5odywKKwkJW0NMS0lEX0cyRF0JCSAgICA9ICZtZXNvbjhiX2cyZC5odywKKwkJW0NMS0lEX1VTQjBdCQkgICAgPSAmbWVzb244Yl91c2IwLmh3LAorCQlbQ0xLSURfVVNCMV0JCSAgICA9ICZtZXNvbjhiX3VzYjEuaHcsCisJCVtDTEtJRF9SRVNFVF0JCSAgICA9ICZtZXNvbjhiX3Jlc2V0Lmh3LAorCQlbQ0xLSURfTkFORF0JCSAgICA9ICZtZXNvbjhiX25hbmQuaHcsCisJCVtDTEtJRF9ET1NfUEFSU0VSXQkgICAgPSAmbWVzb244Yl9kb3NfcGFyc2VyLmh3LAorCQlbQ0xLSURfVVNCXQkJICAgID0gJm1lc29uOGJfdXNiLmh3LAorCQlbQ0xLSURfVkRJTjFdCQkgICAgPSAmbWVzb244Yl92ZGluMS5odywKKwkJW0NMS0lEX0FIQl9BUkIwXQkgICAgPSAmbWVzb244Yl9haGJfYXJiMC5odywKKwkJW0NMS0lEX0VGVVNFXQkJICAgID0gJm1lc29uOGJfZWZ1c2UuaHcsCisJCVtDTEtJRF9CT09UX1JPTV0JICAgID0gJm1lc29uOGJfYm9vdF9yb20uaHcsCisJCVtDTEtJRF9BSEJfREFUQV9CVVNdCSAgICA9ICZtZXNvbjhiX2FoYl9kYXRhX2J1cy5odywKKwkJW0NMS0lEX0FIQl9DVFJMX0JVU10JICAgID0gJm1lc29uOGJfYWhiX2N0cmxfYnVzLmh3LAorCQlbQ0xLSURfSERNSV9JTlRSX1NZTkNdCSAgICA9ICZtZXNvbjhiX2hkbWlfaW50cl9zeW5jLmh3LAorCQlbQ0xLSURfSERNSV9QQ0xLXQkgICAgPSAmbWVzb244Yl9oZG1pX3BjbGsuaHcsCisJCVtDTEtJRF9VU0IxX0REUl9CUklER0VdCSAgICA9ICZtZXNvbjhiX3VzYjFfZGRyX2JyaWRnZS5odywKKwkJW0NMS0lEX1VTQjBfRERSX0JSSURHRV0JICAgID0gJm1lc29uOGJfdXNiMF9kZHJfYnJpZGdlLmh3LAorCQlbQ0xLSURfTU1DX1BDTEtdCSAgICA9ICZtZXNvbjhiX21tY19wY2xrLmh3LAorCQlbQ0xLSURfRFZJTl0JCSAgICA9ICZtZXNvbjhiX2R2aW4uaHcsCisJCVtDTEtJRF9VQVJUMl0JCSAgICA9ICZtZXNvbjhiX3VhcnQyLmh3LAorCQlbQ0xLSURfU0FOQV0JCSAgICA9ICZtZXNvbjhiX3NhbmEuaHcsCisJCVtDTEtJRF9WUFVfSU5UUl0JICAgID0gJm1lc29uOGJfdnB1X2ludHIuaHcsCisJCVtDTEtJRF9TRUNfQUhCX0FIQjNfQlJJREdFXSA9ICZtZXNvbjhiX3NlY19haGJfYWhiM19icmlkZ2UuaHcsCisJCVtDTEtJRF9DTEs4MV9BOV0JICAgID0gJm1lc29uOGJfY2xrODFfYTkuaHcsCisJCVtDTEtJRF9WQ0xLMl9WRU5DSTBdCSAgICA9ICZtZXNvbjhiX3ZjbGsyX3ZlbmNpMC5odywKKwkJW0NMS0lEX1ZDTEsyX1ZFTkNJMV0JICAgID0gJm1lc29uOGJfdmNsazJfdmVuY2kxLmh3LAorCQlbQ0xLSURfVkNMSzJfVkVOQ1AwXQkgICAgPSAmbWVzb244Yl92Y2xrMl92ZW5jcDAuaHcsCisJCVtDTEtJRF9WQ0xLMl9WRU5DUDFdCSAgICA9ICZtZXNvbjhiX3ZjbGsyX3ZlbmNwMS5odywKKwkJW0NMS0lEX0dDTEtfVkVOQ0lfSU5UXQkgICAgPSAmbWVzb244Yl9nY2xrX3ZlbmNpX2ludC5odywKKwkJW0NMS0lEX0dDTEtfVkVOQ1BfSU5UXQkgICAgPSAmbWVzb244Yl9nY2xrX3ZlbmNwX2ludC5odywKKwkJW0NMS0lEX0RBQ19DTEtdCQkgICAgPSAmbWVzb244Yl9kYWNfY2xrLmh3LAorCQlbQ0xLSURfQU9DTEtfR0FURV0JICAgID0gJm1lc29uOGJfYW9jbGtfZ2F0ZS5odywKKwkJW0NMS0lEX0lFQzk1OF9HQVRFXQkgICAgPSAmbWVzb244Yl9pZWM5NThfZ2F0ZS5odywKKwkJW0NMS0lEX0VOQzQ4MFBdCQkgICAgPSAmbWVzb244Yl9lbmM0ODBwLmh3LAorCQlbQ0xLSURfUk5HMV0JCSAgICA9ICZtZXNvbjhiX3JuZzEuaHcsCisJCVtDTEtJRF9HQ0xLX1ZFTkNMX0lOVF0JICAgID0gJm1lc29uOGJfZ2Nsa192ZW5jbF9pbnQuaHcsCisJCVtDTEtJRF9WQ0xLMl9WRU5DTE1DQ10JICAgID0gJm1lc29uOGJfdmNsazJfdmVuY2xtY2MuaHcsCisJCVtDTEtJRF9WQ0xLMl9WRU5DTF0JICAgID0gJm1lc29uOGJfdmNsazJfdmVuY2wuaHcsCisJCVtDTEtJRF9WQ0xLMl9PVEhFUl0JICAgID0gJm1lc29uOGJfdmNsazJfb3RoZXIuaHcsCisJCVtDTEtJRF9FRFBdCQkgICAgPSAmbWVzb244Yl9lZHAuaHcsCisJCVtDTEtJRF9BT19NRURJQV9DUFVdCSAgICA9ICZtZXNvbjhiX2FvX21lZGlhX2NwdS5odywKKwkJW0NMS0lEX0FPX0FIQl9TUkFNXQkgICAgPSAmbWVzb244Yl9hb19haGJfc3JhbS5odywKKwkJW0NMS0lEX0FPX0FIQl9CVVNdCSAgICA9ICZtZXNvbjhiX2FvX2FoYl9idXMuaHcsCisJCVtDTEtJRF9BT19JRkFDRV0JICAgID0gJm1lc29uOGJfYW9faWZhY2UuaHcsCisJfSwKKwkubnVtID0gQ0xLX05SX0NMS1MsCit9OworCitzdGF0aWMgc3RydWN0IG1lc29uX2Nsa19wbGwgKmNvbnN0IG1lc29uOGJfY2xrX3BsbHNbXSA9IHsKKwkmbWVzb244Yl9maXhlZF9wbGwsCisJJm1lc29uOGJfdmlkX3BsbCwKKwkmbWVzb244Yl9zeXNfcGxsLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfZ2F0ZSAqbWVzb244Yl9jbGtfZ2F0ZXNbXSA9IHsKKwkmbWVzb244Yl9jbGs4MSwKKwkmbWVzb244Yl9kZHIsCisJJm1lc29uOGJfZG9zLAorCSZtZXNvbjhiX2lzYSwKKwkmbWVzb244Yl9wbDMwMSwKKwkmbWVzb244Yl9wZXJpcGhzLAorCSZtZXNvbjhiX3NwaWNjLAorCSZtZXNvbjhiX2kyYywKKwkmbWVzb244Yl9zYXJfYWRjLAorCSZtZXNvbjhiX3NtYXJ0X2NhcmQsCisJJm1lc29uOGJfcm5nMCwKKwkmbWVzb244Yl91YXJ0MCwKKwkmbWVzb244Yl9zZGhjLAorCSZtZXNvbjhiX3N0cmVhbSwKKwkmbWVzb244Yl9hc3luY19maWZvLAorCSZtZXNvbjhiX3NkaW8sCisJJm1lc29uOGJfYWJ1ZiwKKwkmbWVzb244Yl9oaXVfaWZhY2UsCisJJm1lc29uOGJfYXNzaXN0X21pc2MsCisJJm1lc29uOGJfc3BpLAorCSZtZXNvbjhiX2kyc19zcGRpZiwKKwkmbWVzb244Yl9ldGgsCisJJm1lc29uOGJfZGVtdXgsCisJJm1lc29uOGJfYWl1X2dsdWUsCisJJm1lc29uOGJfaWVjOTU4LAorCSZtZXNvbjhiX2kyc19vdXQsCisJJm1lc29uOGJfYW1jbGssCisJJm1lc29uOGJfYWlmaWZvMiwKKwkmbWVzb244Yl9taXhlciwKKwkmbWVzb244Yl9taXhlcl9pZmFjZSwKKwkmbWVzb244Yl9hZGMsCisJJm1lc29uOGJfYmxrbXYsCisJJm1lc29uOGJfYWl1LAorCSZtZXNvbjhiX3VhcnQxLAorCSZtZXNvbjhiX2cyZCwKKwkmbWVzb244Yl91c2IwLAorCSZtZXNvbjhiX3VzYjEsCisJJm1lc29uOGJfcmVzZXQsCisJJm1lc29uOGJfbmFuZCwKKwkmbWVzb244Yl9kb3NfcGFyc2VyLAorCSZtZXNvbjhiX3VzYiwKKwkmbWVzb244Yl92ZGluMSwKKwkmbWVzb244Yl9haGJfYXJiMCwKKwkmbWVzb244Yl9lZnVzZSwKKwkmbWVzb244Yl9ib290X3JvbSwKKwkmbWVzb244Yl9haGJfZGF0YV9idXMsCisJJm1lc29uOGJfYWhiX2N0cmxfYnVzLAorCSZtZXNvbjhiX2hkbWlfaW50cl9zeW5jLAorCSZtZXNvbjhiX2hkbWlfcGNsaywKKwkmbWVzb244Yl91c2IxX2Rkcl9icmlkZ2UsCisJJm1lc29uOGJfdXNiMF9kZHJfYnJpZGdlLAorCSZtZXNvbjhiX21tY19wY2xrLAorCSZtZXNvbjhiX2R2aW4sCisJJm1lc29uOGJfdWFydDIsCisJJm1lc29uOGJfc2FuYSwKKwkmbWVzb244Yl92cHVfaW50ciwKKwkmbWVzb244Yl9zZWNfYWhiX2FoYjNfYnJpZGdlLAorCSZtZXNvbjhiX2NsazgxX2E5LAorCSZtZXNvbjhiX3ZjbGsyX3ZlbmNpMCwKKwkmbWVzb244Yl92Y2xrMl92ZW5jaTEsCisJJm1lc29uOGJfdmNsazJfdmVuY3AwLAorCSZtZXNvbjhiX3ZjbGsyX3ZlbmNwMSwKKwkmbWVzb244Yl9nY2xrX3ZlbmNpX2ludCwKKwkmbWVzb244Yl9nY2xrX3ZlbmNwX2ludCwKKwkmbWVzb244Yl9kYWNfY2xrLAorCSZtZXNvbjhiX2FvY2xrX2dhdGUsCisJJm1lc29uOGJfaWVjOTU4X2dhdGUsCisJJm1lc29uOGJfZW5jNDgwcCwKKwkmbWVzb244Yl9ybmcxLAorCSZtZXNvbjhiX2djbGtfdmVuY2xfaW50LAorCSZtZXNvbjhiX3ZjbGsyX3ZlbmNsbWNjLAorCSZtZXNvbjhiX3ZjbGsyX3ZlbmNsLAorCSZtZXNvbjhiX3ZjbGsyX290aGVyLAorCSZtZXNvbjhiX2VkcCwKKwkmbWVzb244Yl9hb19tZWRpYV9jcHUsCisJJm1lc29uOGJfYW9fYWhiX3NyYW0sCisJJm1lc29uOGJfYW9fYWhiX2J1cywKKwkmbWVzb244Yl9hb19pZmFjZSwKK307CisKK3N0YXRpYyBpbnQgbWVzb244Yl9jbGtjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJdm9pZCBfX2lvbWVtICpjbGtfYmFzZTsKKwlpbnQgcmV0LCBjbGtpZCwgaTsKKwlzdHJ1Y3QgY2xrX2h3ICpwYXJlbnRfaHc7CisJc3RydWN0IGNsayAqcGFyZW50X2NsazsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCisJLyogIEdlbmVyaWMgY2xvY2tzIGFuZCBQTExzICovCisJY2xrX2Jhc2UgPSBvZl9pb21hcChkZXYtPm9mX25vZGUsIDEpOworCWlmICghY2xrX2Jhc2UpIHsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIG1hcCBjbGsgYmFzZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIFBvcHVsYXRlIGJhc2UgYWRkcmVzcyBmb3IgUExMcyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1lc29uOGJfY2xrX3BsbHMpOyBpKyspCisJCW1lc29uOGJfY2xrX3BsbHNbaV0tPmJhc2UgPSBjbGtfYmFzZTsKKworCS8qIFBvcHVsYXRlIHRoZSBiYXNlIGFkZHJlc3MgZm9yIENQVSBjbGsgKi8KKwltZXNvbjhiX2NwdV9jbGsuYmFzZSA9IGNsa19iYXNlOworCisJLyogUG9wdWxhdGUgdGhlIGJhc2UgYWRkcmVzcyBmb3IgdGhlIE1QRUcgY2xrcyAqLworCW1lc29uOGJfbXBlZ19jbGtfc2VsLnJlZyA9IGNsa19iYXNlICsgKHUzMiltZXNvbjhiX21wZWdfY2xrX3NlbC5yZWc7CisJbWVzb244Yl9tcGVnX2Nsa19kaXYucmVnID0gY2xrX2Jhc2UgKyAodTMyKW1lc29uOGJfbXBlZ19jbGtfZGl2LnJlZzsKKwltZXNvbjhiX2NsazgxLnJlZyA9IGNsa19iYXNlICsgKHUzMiltZXNvbjhiX2NsazgxLnJlZzsKKworCS8qIFBvcHVsYXRlIGJhc2UgYWRkcmVzcyBmb3IgZ2F0ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtZXNvbjhiX2Nsa19nYXRlcyk7IGkrKykKKwkJbWVzb244Yl9jbGtfZ2F0ZXNbaV0tPnJlZyA9IGNsa19iYXNlICsKKwkJCSh1MzIpbWVzb244Yl9jbGtfZ2F0ZXNbaV0tPnJlZzsKKworCS8qCisJICogcmVnaXN0ZXIgYWxsIGNsa3MKKwkgKiBDTEtJRF9VTlVTRUQgPSAwLCBzbyBza2lwIGl0IGFuZCBzdGFydCB3aXRoIENMS0lEX1hUQUwgPSAxCisJICovCisJZm9yIChjbGtpZCA9IENMS0lEX1hUQUw7IGNsa2lkIDwgQ0xLX05SX0NMS1M7IGNsa2lkKyspIHsKKwkJLyogYXJyYXkgbWlnaHQgYmUgc3BhcnNlICovCisJCWlmICghbWVzb244Yl9od19vbmVjZWxsX2RhdGEuaHdzW2Nsa2lkXSkKKwkJCWNvbnRpbnVlOworCisJCS8qIEZJWE1FIGNvbnZlcnQgdG8gZGV2bV9jbGtfcmVnaXN0ZXIgKi8KKwkJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoZGV2LCBtZXNvbjhiX2h3X29uZWNlbGxfZGF0YS5od3NbY2xraWRdKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gaW91bm1hcDsKKwl9CisKKwkvKgorCSAqIFJlZ2lzdGVyIENQVSBjbGsgbm90aWZpZXIKKwkgKgorCSAqIEZJWE1FIHRoaXMgaXMgd3JvbmcgZm9yIGEgbG90IG9mIHJlYXNvbnMuIEZpcnN0LCB0aGUgbXV4ZXMgc2hvdWxkIGJlCisJICogc3RydWN0IGNsa19odyBvYmplY3RzLiBTZWNvbmQsIHdlIHNob3VsZG4ndCBwcm9ncmFtIHRoZSBtdXhlcyBpbgorCSAqIG5vdGlmaWVyIGhhbmRsZXJzLiBUaGUgdHJpY2t5IHByb2dyYW1taW5nIHNlcXVlbmNlIHdpbGwgYmUgaGFuZGxlZAorCSAqIGJ5IHRoZSBmb3J0aGNvbWluZyBjb29yZGluYXRlZCBjbG9jayByYXRlcyBtZWNoYW5pc20gb25jZSB0aGF0CisJICogZmVhdHVyZSBpcyByZWxlYXNlZC4KKwkgKgorCSAqIEZ1cnRoZXJtb3JlLCBsb29raW5nIHVwIHRoZSBwYXJlbnQgdGhpcyB3YXkgaXMgdGVycmlibGUuIEF0IHNvbWUKKwkgKiBwb2ludCB3ZSB3aWxsIHN0b3AgYWxsb2NhdGluZyBhIGRlZmF1bHQgc3RydWN0IGNsayB3aGVuIHJlZ2lzdGVyaW5nCisJICogYSBuZXcgY2xrX2h3LCBhbmQgdGhpcyBoYWNrIHdpbGwgbm8gbG9uZ2VyIHdvcmsuIFJlbGVhc2luZyB0aGUgY2NyCisJICogZmVhdHVyZSBiZWZvcmUgdGhhdCB0aW1lIHNvbHZlcyB0aGUgcHJvYmxlbSA6LSkKKwkgKi8KKwlwYXJlbnRfaHcgPSBjbGtfaHdfZ2V0X3BhcmVudCgmbWVzb244Yl9jcHVfY2xrLmh3KTsKKwlwYXJlbnRfY2xrID0gcGFyZW50X2h3LT5jbGs7CisJcmV0ID0gY2xrX25vdGlmaWVyX3JlZ2lzdGVyKHBhcmVudF9jbGssICZtZXNvbjhiX2NwdV9jbGsuY2xrX25iKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byByZWdpc3RlciBjbG9jayBub3RpZmllciBmb3IgY3B1X2Nsa1xuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCWdvdG8gaW91bm1hcDsKKwl9CisKKwlyZXR1cm4gb2ZfY2xrX2FkZF9od19wcm92aWRlcihkZXYtPm9mX25vZGUsIG9mX2Nsa19od19vbmVjZWxsX2dldCwKKwkJCSZtZXNvbjhiX2h3X29uZWNlbGxfZGF0YSk7CisKK2lvdW5tYXA6CisJaW91bm1hcChjbGtfYmFzZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbWVzb244Yl9jbGtjX21hdGNoX3RhYmxlW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLG1lc29uOGItY2xrYyIgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1lc29uOGJfZHJpdmVyID0geworCS5wcm9iZQkJPSBtZXNvbjhiX2Nsa2NfcHJvYmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gIm1lc29uOGItY2xrYyIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG1lc29uOGJfY2xrY19tYXRjaF90YWJsZSwKKwl9LAorfTsKKworYnVpbHRpbl9wbGF0Zm9ybV9kcml2ZXIobWVzb244Yl9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbWVzb24vbWVzb244Yi5oIGIvZHJpdmVycy9jbGsvbWVzb24vbWVzb244Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMGU5NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9tZXNvbi9tZXNvbjhiLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgRW5kbGVzcyBNb2JpbGUsIEluYy4KKyAqIEF1dGhvcjogQ2FybG8gQ2Fpb25lIDxjYXJsb0BlbmRsZXNzbS5jb20+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEJheUxpYnJlLCBJbmMuCisgKiBNaWNoYWVsIFR1cnF1ZXR0ZSA8bXR1cnF1ZXR0ZUBiYXlsaWJyZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fTUVTT044Ql9ICisjZGVmaW5lIF9fTUVTT044Ql9ICisKKy8qCisgKiBDbG9jayBjb250cm9sbGVyIHJlZ2lzdGVyIG9mZnNldHMKKyAqCisgKiBSZWdpc3RlciBvZmZzZXRzIGZyb20gdGhlIEhhcmRLZXJuZWxbMF0gZGF0YSBzaGVldCBhcmUgbGlzdGVkIGluIGNvbW1lbnQKKyAqIGJsb2NrcyBiZWxvdy4gVGhvc2Ugb2Zmc2V0cyBtdXN0IGJlIG11bHRpcGxpZWQgYnkgNCBiZWZvcmUgYWRkaW5nIHRoZW0gdG8KKyAqIHRoZSBiYXNlIGFkZHJlc3MgdG8gZ2V0IHRoZSByaWdodCB2YWx1ZQorICoKKyAqIFswXSBodHRwOi8vZG4ub2Ryb2lkLmNvbS9TODA1L0RhdGFzaGVldC9TODA1X0RhdGFzaGVldCUyMFYwLjglMjAyMDE1MDEyNi5wZGYKKyAqLworI2RlZmluZSBISElfR0NMS19NUEVHMAkJCTB4MTQwIC8qIDB4NTAgb2Zmc2V0IGluIGRhdGEgc2hlZXQgKi8KKyNkZWZpbmUgSEhJX0dDTEtfTVBFRzEJCQkweDE0NCAvKiAweDUxIG9mZnNldCBpbiBkYXRhIHNoZWV0ICovCisjZGVmaW5lIEhISV9HQ0xLX01QRUcyCQkJMHgxNDggLyogMHg1MiBvZmZzZXQgaW4gZGF0YSBzaGVldCAqLworI2RlZmluZSBISElfR0NMS19PVEhFUgkJCTB4MTUwIC8qIDB4NTQgb2Zmc2V0IGluIGRhdGEgc2hlZXQgKi8KKyNkZWZpbmUgSEhJX0dDTEtfQU8JCQkweDE1NCAvKiAweDU1IG9mZnNldCBpbiBkYXRhIHNoZWV0ICovCisjZGVmaW5lIEhISV9TWVNfQ1BVX0NMS19DTlRMMQkJMHgxNWMgLyogMHg1NyBvZmZzZXQgaW4gZGF0YSBzaGVldCAqLworI2RlZmluZSBISElfTVBFR19DTEtfQ05UTAkJMHgxNzQgLyogMHg1ZCBvZmZzZXQgaW4gZGF0YSBzaGVldCAqLworI2RlZmluZSBISElfTVBMTF9DTlRMCQkJMHgyODAgLyogMHhhMCBvZmZzZXQgaW4gZGF0YSBzaGVldCAqLworI2RlZmluZSBISElfU1lTX1BMTF9DTlRMCQkweDMwMCAvKiAweGMwIG9mZnNldCBpbiBkYXRhIHNoZWV0ICovCisjZGVmaW5lIEhISV9WSURfUExMX0NOVEwJCTB4MzIwIC8qIDB4Yzggb2Zmc2V0IGluIGRhdGEgc2hlZXQgKi8KKworLyoKKyAqIENMS0lEIGluZGV4IHZhbHVlcworICoKKyAqIFRoZXNlIGluZGljZXMgYXJlIGVudGlyZWx5IGNvbnRyaXZlZCBhbmQgZG8gbm90IG1hcCBvbnRvIHRoZSBoYXJkd2FyZS4KKyAqIE1pZ3JhdGUgdGhlbSBvdXQgb2YgdGhpcyBoZWFkZXIgYW5kIGludG8gdGhlIERUIGhlYWRlciBmaWxlIHdoZW4gdGhleSBuZWVkCisgKiB0byBiZSBleHBvc2VkIHRvIGNsaWVudCBub2RlcyBpbiBEVDogaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9tZXNvbjhiLWNsa2MuaAorICovCisKKy8qIENMS0lEX1VOVVNFRCAqLworLyogQ0xLSURfWFRBTCAqLworLyogQ0xLSURfUExMX0ZJWEVEICovCisvKiBDTEtJRF9QTExfVklEICovCisvKiBDTEtJRF9QTExfU1lTICovCisvKiBDTEtJRF9GQ0xLX0RJVjIgKi8KKy8qIENMS0lEX0ZDTEtfRElWMyAqLworLyogQ0xLSURfRkNMS19ESVY0ICovCisvKiBDTEtJRF9GQ0xLX0RJVjUgKi8KKy8qIENMS0lEX0ZDTEtfRElWNyAqLworLyogQ0xLSURfQ0xLODEgKi8KKy8qIENMS0lEX01BTEkgKi8KKy8qIENMS0lEX0NQVUNMSyAqLworLyogQ0xLSURfWkVSTyAqLworLyogQ0xLSURfTVBFR19TRUwgKi8KKy8qIENMS0lEX01QRUdfRElWICovCisjZGVmaW5lIENMS0lEX0REUgkJMTYKKyNkZWZpbmUgQ0xLSURfRE9TCQkxNworI2RlZmluZSBDTEtJRF9JU0EJCTE4CisjZGVmaW5lIENMS0lEX1BMMzAxCQkxOQorI2RlZmluZSBDTEtJRF9QRVJJUEhTCQkyMAorI2RlZmluZSBDTEtJRF9TUElDQwkJMjEKKyNkZWZpbmUgQ0xLSURfSTJDCQkyMgorI2RlZmluZSBDTEtJRF9TQVJfQURDCQkyMworI2RlZmluZSBDTEtJRF9TTUFSVF9DQVJECTI0CisjZGVmaW5lIENMS0lEX1JORzAJCTI1CisjZGVmaW5lIENMS0lEX1VBUlQwCQkyNgorI2RlZmluZSBDTEtJRF9TREhDCQkyNworI2RlZmluZSBDTEtJRF9TVFJFQU0JCTI4CisjZGVmaW5lIENMS0lEX0FTWU5DX0ZJRk8JMjkKKyNkZWZpbmUgQ0xLSURfU0RJTwkJMzAKKyNkZWZpbmUgQ0xLSURfQUJVRgkJMzEKKyNkZWZpbmUgQ0xLSURfSElVX0lGQUNFCQkzMgorI2RlZmluZSBDTEtJRF9BU1NJU1RfTUlTQwkzMworI2RlZmluZSBDTEtJRF9TUEkJCTM0CisjZGVmaW5lIENMS0lEX0kyU19TUERJRgkJMzUKKyNkZWZpbmUgQ0xLSURfRVRICQkzNgorI2RlZmluZSBDTEtJRF9ERU1VWAkJMzcKKyNkZWZpbmUgQ0xLSURfQUlVX0dMVUUJCTM4CisjZGVmaW5lIENMS0lEX0lFQzk1OAkJMzkKKyNkZWZpbmUgQ0xLSURfSTJTX09VVAkJNDAKKyNkZWZpbmUgQ0xLSURfQU1DTEsJCTQxCisjZGVmaW5lIENMS0lEX0FJRklGTzIJCTQyCisjZGVmaW5lIENMS0lEX01JWEVSCQk0MworI2RlZmluZSBDTEtJRF9NSVhFUl9JRkFDRQk0NAorI2RlZmluZSBDTEtJRF9BREMJCTQ1CisjZGVmaW5lIENMS0lEX0JMS01WCQk0NgorI2RlZmluZSBDTEtJRF9BSVUJCTQ3CisjZGVmaW5lIENMS0lEX1VBUlQxCQk0OAorI2RlZmluZSBDTEtJRF9HMkQJCTQ5CisjZGVmaW5lIENMS0lEX1VTQjAJCTUwCisjZGVmaW5lIENMS0lEX1VTQjEJCTUxCisjZGVmaW5lIENMS0lEX1JFU0VUCQk1MgorI2RlZmluZSBDTEtJRF9OQU5ECQk1MworI2RlZmluZSBDTEtJRF9ET1NfUEFSU0VSCTU0CisjZGVmaW5lIENMS0lEX1VTQgkJNTUKKyNkZWZpbmUgQ0xLSURfVkRJTjEJCTU2CisjZGVmaW5lIENMS0lEX0FIQl9BUkIwCQk1NworI2RlZmluZSBDTEtJRF9FRlVTRQkJNTgKKyNkZWZpbmUgQ0xLSURfQk9PVF9ST00JCTU5CisjZGVmaW5lIENMS0lEX0FIQl9EQVRBX0JVUwk2MAorI2RlZmluZSBDTEtJRF9BSEJfQ1RSTF9CVVMJNjEKKyNkZWZpbmUgQ0xLSURfSERNSV9JTlRSX1NZTkMJNjIKKyNkZWZpbmUgQ0xLSURfSERNSV9QQ0xLCQk2MworI2RlZmluZSBDTEtJRF9VU0IxX0REUl9CUklER0UJNjQKKyNkZWZpbmUgQ0xLSURfVVNCMF9ERFJfQlJJREdFCTY1CisjZGVmaW5lIENMS0lEX01NQ19QQ0xLCQk2NgorI2RlZmluZSBDTEtJRF9EVklOCQk2NworI2RlZmluZSBDTEtJRF9VQVJUMgkJNjgKKyNkZWZpbmUgQ0xLSURfU0FOQQkJNjkKKyNkZWZpbmUgQ0xLSURfVlBVX0lOVFIJCTcwCisjZGVmaW5lIENMS0lEX1NFQ19BSEJfQUhCM19CUklER0UJNzEKKyNkZWZpbmUgQ0xLSURfQ0xLODFfQTkJCTcyCisjZGVmaW5lIENMS0lEX1ZDTEsyX1ZFTkNJMAk3MworI2RlZmluZSBDTEtJRF9WQ0xLMl9WRU5DSTEJNzQKKyNkZWZpbmUgQ0xLSURfVkNMSzJfVkVOQ1AwCTc1CisjZGVmaW5lIENMS0lEX1ZDTEsyX1ZFTkNQMQk3NgorI2RlZmluZSBDTEtJRF9HQ0xLX1ZFTkNJX0lOVAk3NworI2RlZmluZSBDTEtJRF9HQ0xLX1ZFTkNQX0lOVAk3OAorI2RlZmluZSBDTEtJRF9EQUNfQ0xLCQk3OQorI2RlZmluZSBDTEtJRF9BT0NMS19HQVRFCTgwCisjZGVmaW5lIENMS0lEX0lFQzk1OF9HQVRFCTgxCisjZGVmaW5lIENMS0lEX0VOQzQ4MFAJCTgyCisjZGVmaW5lIENMS0lEX1JORzEJCTgzCisjZGVmaW5lIENMS0lEX0dDTEtfVkVOQ0xfSU5UCTg0CisjZGVmaW5lIENMS0lEX1ZDTEsyX1ZFTkNMTUNDCTg1CisjZGVmaW5lIENMS0lEX1ZDTEsyX1ZFTkNMCTg2CisjZGVmaW5lIENMS0lEX1ZDTEsyX09USEVSCTg3CisjZGVmaW5lIENMS0lEX0VEUAkJODgKKyNkZWZpbmUgQ0xLSURfQU9fTUVESUFfQ1BVCTg5CisjZGVmaW5lIENMS0lEX0FPX0FIQl9TUkFNCTkwCisjZGVmaW5lIENMS0lEX0FPX0FIQl9CVVMJOTEKKyNkZWZpbmUgQ0xLSURfQU9fSUZBQ0UJCTkyCisKKyNkZWZpbmUgQ0xLX05SX0NMS1MJCTkzCisKKy8qIGluY2x1ZGUgdGhlIENMS0lEcyB0aGF0IGhhdmUgYmVlbiBtYWRlIHBhcnQgb2YgdGhlIHN0YWJsZSBEVCBiaW5kaW5nICovCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbWVzb244Yi1jbGtjLmg+CisKKyNlbmRpZiAvKiBfX01FU09OOEJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbWljcm9jaGlwL2Nsay1jb3JlLmMgYi9kcml2ZXJzL2Nsay9taWNyb2NoaXAvY2xrLWNvcmUuYwppbmRleCBjYTg1Y2VhLi5jM2IzMDE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9taWNyb2NoaXAvY2xrLWNvcmUuYworKysgYi9kcml2ZXJzL2Nsay9taWNyb2NoaXAvY2xrLWNvcmUuYwpAQCAtMTk5LDkgKzE5OSw5IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYi0+Y29yZS0+cmVnX2xvY2ssIGZsYWdzKTsKIAotCS8qIHdhaXQgYWdhaW4sIGZvciBwYmRpdnJlYWR5ICovCi0JZXJyID0gcmVhZGxfcG9sbF90aW1lb3V0X2F0b21pYyhwYi0+Y3RybF9yZWcsIHYsIHYgJiBQQl9ESVZfUkVBRFksCi0JCQkJCTEsIExPQ0tfVElNRU9VVF9VUyk7CisJLyogd2FpdCBhZ2FpbiBmb3IgRElWX1JFQURZICovCisJZXJyID0gcmVhZGxfcG9sbF90aW1lb3V0KHBiLT5jdHJsX3JlZywgdiwgdiAmIFBCX0RJVl9SRUFEWSwKKwkJCQkgMSwgTE9DS19USU1FT1VUX1VTKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9taWNyb2NoaXAvY2xrLXBpYzMybXpkYS5jIGIvZHJpdmVycy9jbGsvbWljcm9jaGlwL2Nsay1waWMzMm16ZGEuYwppbmRleCA1MWY1NDM4Li45ZjczNDc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9taWNyb2NoaXAvY2xrLXBpYzMybXpkYS5jCisrKyBiL2RyaXZlcnMvY2xrL21pY3JvY2hpcC9jbGstcGljMzJtemRhLmMKQEAgLTExOCw2ICsxMTgsNyBAQAogCS5zdGF0dXNfcmVnID0gMHgxZDAsCiAJLmVuYWJsZV9tYXNrID0gQklUKDEpLAogCS5zdGF0dXNfbWFzayA9IEJJVCg0KSwKKwkuZml4ZWRfcmF0ZSA9IDMyNzY4LAogCS5pbml0X2RhdGEgPSB7CiAJCS5uYW1lID0gInNvc2NfY2xrIiwKIAkJLnBhcmVudF9uYW1lcyA9IE5VTEwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tbXAvY2xrLW1tcDIuYyBiL2RyaXZlcnMvY2xrL21tcC9jbGstbW1wMi5jCmluZGV4IDM4M2Y2YTQuLjAzODAyMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL21tcC9jbGstbW1wMi5jCisrKyBiL2RyaXZlcnMvY2xrL21tcC9jbGstbW1wMi5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay9tbXAuaD4KIAogI2luY2x1ZGUgImNsay5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tdmVidS9LY29uZmlnIGIvZHJpdmVycy9jbGsvbXZlYnUvS2NvbmZpZwppbmRleCAzMTY1ZGE3Li5mZGRjOGFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9tdmVidS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2xrL212ZWJ1L0tjb25maWcKQEAgLTI0LDYgKzI0LDkgQEAKIAlib29sCiAJc2VsZWN0IE1WRUJVX0NMS19DT01NT04KIAorY29uZmlnIEFSTUFEQV8zN1hYX0NMSworICAgICAgIGJvb2wKKwogY29uZmlnIEFSTUFEQV9YUF9DTEsKIAlib29sCiAJc2VsZWN0IE1WRUJVX0NMS19DT01NT04KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL212ZWJ1L01ha2VmaWxlIGIvZHJpdmVycy9jbGsvbXZlYnUvTWFrZWZpbGUKaW5kZXggNzE3MmVmNi4uZDlhZTk3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvbXZlYnUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jbGsvbXZlYnUvTWFrZWZpbGUKQEAgLTYsNiArNiw5IEBACiBvYmotJChDT05GSUdfQVJNQURBXzM3NV9DTEspCSs9IGFybWFkYS0zNzUubwogb2JqLSQoQ09ORklHX0FSTUFEQV8zOFhfQ0xLKQkrPSBhcm1hZGEtMzh4Lm8KIG9iai0kKENPTkZJR19BUk1BREFfMzlYX0NMSykJKz0gYXJtYWRhLTM5eC5vCitvYmotJChDT05GSUdfQVJNQURBXzM3WFhfQ0xLKQkrPSBhcm1hZGEtMzd4eC14dGFsLm8KK29iai0kKENPTkZJR19BUk1BREFfMzdYWF9DTEspCSs9IGFybWFkYS0zN3h4LXRiZy5vCitvYmotJChDT05GSUdfQVJNQURBXzM3WFhfQ0xLKQkrPSBhcm1hZGEtMzd4eC1wZXJpcGgubwogb2JqLSQoQ09ORklHX0FSTUFEQV9YUF9DTEspCSs9IGFybWFkYS14cC5vCiBvYmotJChDT05GSUdfQVJNQURBX0FQODA2X1NZU0NPTikgKz0gYXA4MDYtc3lzdGVtLWNvbnRyb2xsZXIubwogb2JqLSQoQ09ORklHX0FSTUFEQV9DUDExMF9TWVNDT04pICs9IGNwMTEwLXN5c3RlbS1jb250cm9sbGVyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL212ZWJ1L2FybWFkYS0zN3h4LXBlcmlwaC5jIGIvZHJpdmVycy9jbGsvbXZlYnUvYXJtYWRhLTM3eHgtcGVyaXBoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5MDVmYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL212ZWJ1L2FybWFkYS0zN3h4LXBlcmlwaC5jCkBAIC0wLDAgKzEsNDQ3IEBACisvKgorICogTWFydmVsbCBBcm1hZGEgMzd4eCBTb0MgUGVyaXBoZXJhbCBjbG9ja3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTWFydmVsbAorICoKKyAqIEdyZWdvcnkgQ0xFTUVOVCA8Z3JlZ29yeS5jbGVtZW50QGZyZWUtZWxlY3Ryb25zLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9yIGxhdGVyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIgorICogd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoKKyAqIE1vc3Qgb2YgdGhlIHBlcmlwaGVyYWwgY2xvY2tzIGNhbiBiZSBtb2RlbGxlZCBsaWtlIHRoaXM6CisgKiAgICAgICAgICAgICBfX19fXyAgICBfX19fX19fICAgIF9fX19fX18KKyAqIFRCRy1BLVAgIC0tfCAgICAgfCAgfCAgICAgICB8ICB8ICAgICAgIHwgICBfX19fX18KKyAqIFRCRy1CLVAgIC0tfCBNdXggfC0tfCAvZGl2MSB8LS18IC9kaXYyIHwtLXwgR2F0ZSB8LS0+IHBlcmlwX2NsaworICogVEJHLUEtUyAgLS18ICAgICB8ICB8ICAgICAgIHwgIHwgICAgICAgfCAgfF9fX19fX3wKKyAqIFRCRy1CLVMgIC0tfF9fX19ffCAgfF9fX19fX198ICB8X19fX19fX3wKKyAqCisgKiBIb3dldmVyIHNvbWUgY2xvY2tzIG1heSB1c2Ugb25seSBvbmUgb3IgdHdvIGJsb2NrIG9yIGFuZCB1c2UgdGhlCisgKiB4dGFsIGNsb2NrIGFzIHBhcmVudC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNkZWZpbmUgVEJHX1NFTAkJMHgwCisjZGVmaW5lIERJVl9TRUwwCTB4NAorI2RlZmluZSBESVZfU0VMMQkweDgKKyNkZWZpbmUgRElWX1NFTDIJMHhDCisjZGVmaW5lIENMS19TRUwJCTB4MTAKKyNkZWZpbmUgQ0xLX0RJUwkJMHgxNAorCitzdHJ1Y3QgY2xrX3BlcmlwaF9kcml2ZXJfZGF0YSB7CisJc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgKmh3X2RhdGE7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworc3RydWN0IGNsa19kb3VibGVfZGl2IHsKKwlzdHJ1Y3QgY2xrX2h3IGh3OworCXZvaWQgX19pb21lbSAqcmVnMTsKKwl1OCBzaGlmdDE7CisJdm9pZCBfX2lvbWVtICpyZWcyOworCXU4IHNoaWZ0MjsKK307CisKKyNkZWZpbmUgdG9fY2xrX2RvdWJsZV9kaXYoX2h3KSBjb250YWluZXJfb2YoX2h3LCBzdHJ1Y3QgY2xrX2RvdWJsZV9kaXYsIGh3KQorCitzdHJ1Y3QgY2xrX3BlcmlwaF9kYXRhIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKiBjb25zdCAqcGFyZW50X25hbWVzOworCWludCBudW1fcGFyZW50czsKKwlzdHJ1Y3QgY2xrX2h3ICptdXhfaHc7CisJc3RydWN0IGNsa19odyAqcmF0ZV9odzsKKwlzdHJ1Y3QgY2xrX2h3ICpnYXRlX2h3OworCWJvb2wgaXNfZG91YmxlX2RpdjsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2Rpdl90YWJsZSBjbGtfdGFibGU2W10gPSB7CisJeyAudmFsID0gMSwgLmRpdiA9IDEsIH0sCisJeyAudmFsID0gMiwgLmRpdiA9IDIsIH0sCisJeyAudmFsID0gMywgLmRpdiA9IDMsIH0sCisJeyAudmFsID0gNCwgLmRpdiA9IDQsIH0sCisJeyAudmFsID0gNSwgLmRpdiA9IDUsIH0sCisJeyAudmFsID0gNiwgLmRpdiA9IDYsIH0sCisJeyAudmFsID0gMCwgLmRpdiA9IDAsIH0sIC8qIGxhc3QgZW50cnkgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2Rpdl90YWJsZSBjbGtfdGFibGUxW10gPSB7CisJeyAudmFsID0gMCwgLmRpdiA9IDEsIH0sCisJeyAudmFsID0gMSwgLmRpdiA9IDIsIH0sCisJeyAudmFsID0gMCwgLmRpdiA9IDAsIH0sIC8qIGxhc3QgZW50cnkgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2Rpdl90YWJsZSBjbGtfdGFibGUyW10gPSB7CisJeyAudmFsID0gMCwgLmRpdiA9IDIsIH0sCisJeyAudmFsID0gMSwgLmRpdiA9IDQsIH0sCisJeyAudmFsID0gMCwgLmRpdiA9IDAsIH0sIC8qIGxhc3QgZW50cnkgKi8KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgY2xrX2RvdWJsZV9kaXZfb3BzOworCisjZGVmaW5lIFBFUklQSF9HQVRFKF9uYW1lLCBfYml0KQkJXAorc3RydWN0IGNsa19nYXRlIGdhdGVfIyNfbmFtZSA9IHsJCVwKKwkucmVnID0gKHZvaWQgKilDTEtfRElTLAkJCVwKKwkuYml0X2lkeCA9IF9iaXQsCQkJXAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CVwKKwkJLm9wcyA9ICAmY2xrX2dhdGVfb3BzLAkJXAorCX0JCQkJCVwKK307CisKKyNkZWZpbmUgUEVSSVBIX01VWChfbmFtZSwgX3NoaWZ0KQkJXAorc3RydWN0IGNsa19tdXggbXV4XyMjX25hbWUgPSB7CQkJXAorCS5yZWcgPSAodm9pZCAqKVRCR19TRUwsCQkJXAorCS5zaGlmdCA9IF9zaGlmdCwJCQlcCisJLm1hc2sgPSAzLAkJCQlcCisJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsJXAorCQkub3BzID0gICZjbGtfbXV4X3JvX29wcywJXAorCX0JCQkJCVwKK307CisKKyNkZWZpbmUgUEVSSVBIX0RPVUJMRURJVihfbmFtZSwgX3JlZzEsIF9yZWcyLCBfc2hpZnQxLCBfc2hpZnQyKQlcCitzdHJ1Y3QgY2xrX2RvdWJsZV9kaXYgcmF0ZV8jI19uYW1lID0gewkJXAorCS5yZWcxID0gKHZvaWQgKilfcmVnMSwJCQlcCisJLnJlZzIgPSAodm9pZCAqKV9yZWcyLAkJCVwKKwkuc2hpZnQxID0gX3NoaWZ0MSwJCQlcCisJLnNoaWZ0MiA9IF9zaGlmdDIsCQkJXAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CVwKKwkJLm9wcyA9ICAmY2xrX2RvdWJsZV9kaXZfb3BzLAlcCisJfQkJCQkJXAorfTsKKworI2RlZmluZSBQRVJJUEhfRElWKF9uYW1lLCBfcmVnLCBfc2hpZnQsIF90YWJsZSkJXAorc3RydWN0IGNsa19kaXZpZGVyIHJhdGVfIyNfbmFtZSA9IHsJCVwKKwkucmVnID0gKHZvaWQgKilfcmVnLAkJCVwKKwkudGFibGUgPSBfdGFibGUsCQkJXAorCS5zaGlmdCA9IF9zaGlmdCwJCQlcCisJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsJXAorCQkub3BzID0gICZjbGtfZGl2aWRlcl9yb19vcHMsCVwKKwl9CQkJCQlcCit9OworCisjZGVmaW5lIFBFUklQSF9DTEtfRlVMTF9ERChfbmFtZSwgX2JpdCwgX3NoaWZ0LCBfcmVnMSwgX3JlZzIsIF9zaGlmdDEsIF9zaGlmdDIpXAorc3RhdGljIFBFUklQSF9HQVRFKF9uYW1lLCBfYml0KTsJCQkgICAgXAorc3RhdGljIFBFUklQSF9NVVgoX25hbWUsIF9zaGlmdCk7CQkJICAgIFwKK3N0YXRpYyBQRVJJUEhfRE9VQkxFRElWKF9uYW1lLCBfcmVnMSwgX3JlZzIsIF9zaGlmdDEsIF9zaGlmdDIpOworCisjZGVmaW5lIFBFUklQSF9DTEtfRlVMTChfbmFtZSwgX2JpdCwgX3NoaWZ0LCBfcmVnLCBfc2hpZnQxLCBfdGFibGUpCVwKK3N0YXRpYyBQRVJJUEhfR0FURShfbmFtZSwgX2JpdCk7CQkJICAgIFwKK3N0YXRpYyBQRVJJUEhfTVVYKF9uYW1lLCBfc2hpZnQpOwkJCSAgICBcCitzdGF0aWMgUEVSSVBIX0RJVihfbmFtZSwgX3JlZywgX3NoaWZ0MSwgX3RhYmxlKTsKKworI2RlZmluZSBQRVJJUEhfQ0xLX0dBVEVfRElWKF9uYW1lLCBfYml0LCAgX3JlZywgX3NoaWZ0LCBfdGFibGUpCVwKK3N0YXRpYyBQRVJJUEhfR0FURShfbmFtZSwgX2JpdCk7CQkJXAorc3RhdGljIFBFUklQSF9ESVYoX25hbWUsIF9yZWcsIF9zaGlmdCwgX3RhYmxlKTsKKworI2RlZmluZSBQRVJJUEhfQ0xLX01VWF9ESVYoX25hbWUsIF9zaGlmdCwgIF9yZWcsIF9zaGlmdF9kaXYsIF90YWJsZSkJXAorc3RhdGljIFBFUklQSF9NVVgoX25hbWUsIF9zaGlmdCk7CQkJICAgIFwKK3N0YXRpYyBQRVJJUEhfRElWKF9uYW1lLCBfcmVnLCBfc2hpZnRfZGl2LCBfdGFibGUpOworCisjZGVmaW5lIFBFUklQSF9DTEtfTVVYX0REKF9uYW1lLCBfc2hpZnQsIF9yZWcxLCBfcmVnMiwgX3NoaWZ0MSwgX3NoaWZ0MilcCitzdGF0aWMgUEVSSVBIX01VWChfbmFtZSwgX3NoaWZ0KTsJCQkgICAgXAorc3RhdGljIFBFUklQSF9ET1VCTEVESVYoX25hbWUsIF9yZWcxLCBfcmVnMiwgX3NoaWZ0MSwgX3NoaWZ0Mik7CisKKyNkZWZpbmUgUkVGX0NMS19GVUxMKF9uYW1lKQkJCQlcCisJeyAubmFtZSA9ICNfbmFtZSwJCQkJXAorCSAgLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJUQkctQS1QIiwJXAorCSAgICAgICJUQkctQi1QIiwgIlRCRy1BLVMiLCAiVEJHLUItUyJ9LAkJXAorCSAgLm51bV9wYXJlbnRzID0gNCwJCQkJXAorCSAgLm11eF9odyA9ICZtdXhfIyNfbmFtZS5odywJCQlcCisJICAuZ2F0ZV9odyA9ICZnYXRlXyMjX25hbWUuaHcsCQkJXAorCSAgLnJhdGVfaHcgPSAmcmF0ZV8jI19uYW1lLmh3LAkJCVwKKwl9CisKKyNkZWZpbmUgUkVGX0NMS19GVUxMX0REKF9uYW1lKQkJCQlcCisJeyAubmFtZSA9ICNfbmFtZSwJCQkJXAorCSAgLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJUQkctQS1QIiwJXAorCSAgICAgICJUQkctQi1QIiwgIlRCRy1BLVMiLCAiVEJHLUItUyJ9LAkJXAorCSAgLm51bV9wYXJlbnRzID0gNCwJCQkJXAorCSAgLm11eF9odyA9ICZtdXhfIyNfbmFtZS5odywJCQlcCisJICAuZ2F0ZV9odyA9ICZnYXRlXyMjX25hbWUuaHcsCQkJXAorCSAgLnJhdGVfaHcgPSAmcmF0ZV8jI19uYW1lLmh3LAkJCVwKKwkgIC5pc19kb3VibGVfZGl2ID0gdHJ1ZSwJCQlcCisJfQorCisjZGVmaW5lIFJFRl9DTEtfR0FURShfbmFtZSwgX3BhcmVudF9uYW1lKQkJCVwKKwl7IC5uYW1lID0gI19uYW1lLAkJCQkJXAorCSAgLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7IF9wYXJlbnRfbmFtZX0sCVwKKwkgIC5udW1fcGFyZW50cyA9IDEsCQkJCQlcCisJICAuZ2F0ZV9odyA9ICZnYXRlXyMjX25hbWUuaHcsCQkJCVwKKwl9CisKKyNkZWZpbmUgUkVGX0NMS19HQVRFX0RJVihfbmFtZSwgX3BhcmVudF9uYW1lKQkJCVwKKwl7IC5uYW1lID0gI19uYW1lLAkJCQkJXAorCSAgLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7IF9wYXJlbnRfbmFtZX0sCVwKKwkgIC5udW1fcGFyZW50cyA9IDEsCQkJCQlcCisJICAuZ2F0ZV9odyA9ICZnYXRlXyMjX25hbWUuaHcsCQkJCVwKKwkgIC5yYXRlX2h3ID0gJnJhdGVfIyNfbmFtZS5odywJCQkJXAorCX0KKworI2RlZmluZSBSRUZfQ0xLX01VWF9ESVYoX25hbWUpCQkJCVwKKwl7IC5uYW1lID0gI19uYW1lLAkJCQlcCisJICAucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgIlRCRy1BLVAiLAlcCisJICAgICAgIlRCRy1CLVAiLCAiVEJHLUEtUyIsICJUQkctQi1TIn0sCQlcCisJICAubnVtX3BhcmVudHMgPSA0LAkJCQlcCisJICAubXV4X2h3ID0gJm11eF8jI19uYW1lLmh3LAkJCVwKKwkgIC5yYXRlX2h3ID0gJnJhdGVfIyNfbmFtZS5odywJCQlcCisJfQorCisjZGVmaW5lIFJFRl9DTEtfTVVYX0REKF9uYW1lKQkJCQlcCisJeyAubmFtZSA9ICNfbmFtZSwJCQkJXAorCSAgLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJUQkctQS1QIiwJXAorCSAgICAgICJUQkctQi1QIiwgIlRCRy1BLVMiLCAiVEJHLUItUyJ9LAkJXAorCSAgLm51bV9wYXJlbnRzID0gNCwJCQkJXAorCSAgLm11eF9odyA9ICZtdXhfIyNfbmFtZS5odywJCQlcCisJICAucmF0ZV9odyA9ICZyYXRlXyMjX25hbWUuaHcsCQkJXAorCSAgLmlzX2RvdWJsZV9kaXYgPSB0cnVlLAkJCVwKKwl9CisKKy8qIE5CIHBlcmlwaCBjbG9ja3MgKi8KK1BFUklQSF9DTEtfRlVMTF9ERChtbWMsIDIsIDAsIERJVl9TRUwyLCBESVZfU0VMMiwgMTYsIDEzKTsKK1BFUklQSF9DTEtfRlVMTF9ERChzYXRhX2hvc3QsIDMsIDIsIERJVl9TRUwyLCBESVZfU0VMMiwgMTAsIDcpOworUEVSSVBIX0NMS19GVUxMX0REKHNlY19hdCwgNiwgNCwgRElWX1NFTDEsIERJVl9TRUwxLCAzLCAwKTsKK1BFUklQSF9DTEtfRlVMTF9ERChzZWNfZGFwLCA3LCA2LCBESVZfU0VMMSwgRElWX1NFTDEsIDksIDYpOworUEVSSVBIX0NMS19GVUxMX0REKHRzY2VtLCA4LCA4LCBESVZfU0VMMSwgRElWX1NFTDEsIDE1LCAxMik7CitQRVJJUEhfQ0xLX0ZVTEwodHNjZW1fdG14LCAxMCwgMTAsIERJVl9TRUwxLCAxOCwgY2xrX3RhYmxlNik7CitzdGF0aWMgUEVSSVBIX0dBVEUoYXZzLCAxMSk7CitQRVJJUEhfQ0xLX0ZVTExfREQocHdtLCAxMywgMTQsIERJVl9TRUwwLCBESVZfU0VMMCwgMywgMCk7CitQRVJJUEhfQ0xLX0ZVTExfREQoc3FmLCAxMiwgMTIsIERJVl9TRUwxLCBESVZfU0VMMSwgMjcsIDI0KTsKK3N0YXRpYyBQRVJJUEhfR0FURShpMmNfMiwgMTYpOworc3RhdGljIFBFUklQSF9HQVRFKGkyY18xLCAxNyk7CitQRVJJUEhfQ0xLX0dBVEVfRElWKGRkcl9waHksIDE5LCBESVZfU0VMMCwgMTgsIGNsa190YWJsZTIpOworUEVSSVBIX0NMS19GVUxMX0REKGRkcl9mY2xrLCAyMSwgMTYsIERJVl9TRUwwLCBESVZfU0VMMCwgMTUsIDEyKTsKK1BFUklQSF9DTEtfRlVMTCh0cmFjZSwgMjIsIDE4LCBESVZfU0VMMCwgMjAsIGNsa190YWJsZTYpOworUEVSSVBIX0NMS19GVUxMKGNvdW50ZXIsIDIzLCAyMCwgRElWX1NFTDAsIDIzLCBjbGtfdGFibGU2KTsKK1BFUklQSF9DTEtfRlVMTF9ERChlaXA5NywgMjQsIDI0LCBESVZfU0VMMiwgRElWX1NFTDIsIDIyLCAxOSk7CitQRVJJUEhfQ0xLX01VWF9ESVYoY3B1LCAyMiwgRElWX1NFTDAsIDI4LCBjbGtfdGFibGU2KTsKKworc3RhdGljIHN0cnVjdCBjbGtfcGVyaXBoX2RhdGEgZGF0YV9uYltdID17CisJUkVGX0NMS19GVUxMX0REKG1tYyksCisJUkVGX0NMS19GVUxMX0REKHNhdGFfaG9zdCksCisJUkVGX0NMS19GVUxMX0REKHNlY19hdCksCisJUkVGX0NMS19GVUxMX0REKHNlY19kYXApLAorCVJFRl9DTEtfRlVMTF9ERCh0c2NlbSksCisJUkVGX0NMS19GVUxMKHRzY2VtX3RteCksCisJUkVGX0NMS19HQVRFKGF2cywgInh0YWwiKSwKKwlSRUZfQ0xLX0ZVTExfREQoc3FmKSwKKwlSRUZfQ0xLX0ZVTExfREQocHdtKSwKKwlSRUZfQ0xLX0dBVEUoaTJjXzIsICJ4dGFsIiksCisJUkVGX0NMS19HQVRFKGkyY18xLCAieHRhbCIpLAorCVJFRl9DTEtfR0FURV9ESVYoZGRyX3BoeSwgIlRCRy1BLVMiKSwKKwlSRUZfQ0xLX0ZVTExfREQoZGRyX2ZjbGspLAorCVJFRl9DTEtfRlVMTCh0cmFjZSksCisJUkVGX0NMS19GVUxMKGNvdW50ZXIpLAorCVJFRl9DTEtfRlVMTF9ERChlaXA5NyksCisJUkVGX0NMS19NVVhfRElWKGNwdSksCisJeyB9LAorfTsKKworLyogU0IgcGVyaXBoIGNsb2NrcyAqLworUEVSSVBIX0NMS19NVVhfREQoZ2JlXzUwLCA2LCBESVZfU0VMMiwgRElWX1NFTDIsIDYsIDkpOworUEVSSVBIX0NMS19NVVhfREQoZ2JlX2NvcmUsIDgsIERJVl9TRUwxLCBESVZfU0VMMSwgMTgsIDIxKTsKK1BFUklQSF9DTEtfTVVYX0REKGdiZV8xMjUsIDEwLCBESVZfU0VMMSwgRElWX1NFTDEsIDYsIDkpOworc3RhdGljIFBFUklQSF9HQVRFKGdiZTFfNTAsIDApOworc3RhdGljIFBFUklQSF9HQVRFKGdiZTBfNTAsIDEpOworc3RhdGljIFBFUklQSF9HQVRFKGdiZTFfMTI1LCAyKTsKK3N0YXRpYyBQRVJJUEhfR0FURShnYmUwXzEyNSwgMyk7CitQRVJJUEhfQ0xLX0dBVEVfRElWKGdiZTFfY29yZSwgNCwgRElWX1NFTDEsIDEzLCBjbGtfdGFibGUxKTsKK1BFUklQSF9DTEtfR0FURV9ESVYoZ2JlMF9jb3JlLCA1LCBESVZfU0VMMSwgMTQsIGNsa190YWJsZTEpOworUEVSSVBIX0NMS19HQVRFX0RJVihnYmVfYm0sIDEyLCBESVZfU0VMMSwgMCwgY2xrX3RhYmxlMSk7CitQRVJJUEhfQ0xLX0ZVTExfREQoc2RpbywgMTEsIDE0LCBESVZfU0VMMCwgRElWX1NFTDAsIDMsIDYpOworUEVSSVBIX0NMS19GVUxMX0REKHVzYjMyX3VzYjJfc3lzLCAxNiwgMTYsIERJVl9TRUwwLCBESVZfU0VMMCwgOSwgMTIpOworUEVSSVBIX0NMS19GVUxMX0REKHVzYjMyX3NzX3N5cywgMTcsIDE4LCBESVZfU0VMMCwgRElWX1NFTDAsIDE1LCAxOCk7CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3BlcmlwaF9kYXRhIGRhdGFfc2JbXSA9IHsKKwlSRUZfQ0xLX01VWF9ERChnYmVfNTApLAorCVJFRl9DTEtfTVVYX0REKGdiZV9jb3JlKSwKKwlSRUZfQ0xLX01VWF9ERChnYmVfMTI1KSwKKwlSRUZfQ0xLX0dBVEUoZ2JlMV81MCwgImdiZV81MCIpLAorCVJFRl9DTEtfR0FURShnYmUwXzUwLCAiZ2JlXzUwIiksCisJUkVGX0NMS19HQVRFKGdiZTFfMTI1LCAiZ2JlXzEyNSIpLAorCVJFRl9DTEtfR0FURShnYmUwXzEyNSwgImdiZV8xMjUiKSwKKwlSRUZfQ0xLX0dBVEVfRElWKGdiZTFfY29yZSwgImdiZV9jb3JlIiksCisJUkVGX0NMS19HQVRFX0RJVihnYmUwX2NvcmUsICJnYmVfY29yZSIpLAorCVJFRl9DTEtfR0FURV9ESVYoZ2JlX2JtLCAiZ2JlX2NvcmUiKSwKKwlSRUZfQ0xLX0ZVTExfREQoc2RpbyksCisJUkVGX0NMS19GVUxMX0REKHVzYjMyX3VzYjJfc3lzKSwKKwlSRUZfQ0xLX0ZVTExfREQodXNiMzJfc3Nfc3lzKSwKKwl7IH0sCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9kaXYodm9pZCBfX2lvbWVtICpyZWcsIGludCBzaGlmdCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gKHJlYWRsKHJlZykgPj4gc2hpZnQpICYgMHg3OworCWlmICh2YWwgPiA2KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjbGtfZG91YmxlX2Rpdl9yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKKwkJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKK3sKKwlzdHJ1Y3QgY2xrX2RvdWJsZV9kaXYgKmRvdWJsZV9kaXYgPSB0b19jbGtfZG91YmxlX2Rpdihodyk7CisJdW5zaWduZWQgaW50IGRpdjsKKworCWRpdiA9IGdldF9kaXYoZG91YmxlX2Rpdi0+cmVnMSwgZG91YmxlX2Rpdi0+c2hpZnQxKTsKKwlkaXYgKj0gZ2V0X2Rpdihkb3VibGVfZGl2LT5yZWcyLCBkb3VibGVfZGl2LT5zaGlmdDIpOworCisJcmV0dXJuIERJVl9ST1VORF9VUF9VTEwoKHU2NClwYXJlbnRfcmF0ZSwgZGl2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIGNsa19kb3VibGVfZGl2X29wcyA9IHsKKwkucmVjYWxjX3JhdGUgPSBjbGtfZG91YmxlX2Rpdl9yZWNhbGNfcmF0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFybWFkYV8zNzAwX3BlcmlwaF9jbG9ja19vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCxhcm1hZGEtMzcwMC1wZXJpcGgtY2xvY2stbmIiLAorCSAgLmRhdGEgPSBkYXRhX25iLCB9LAorCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCxhcm1hZGEtMzcwMC1wZXJpcGgtY2xvY2stc2IiLAorCS5kYXRhID0gZGF0YV9zYiwgfSwKKwl7IH0KK307CitzdGF0aWMgaW50IGFybWFkYV8zNzAwX2FkZF9jb21wb3NpdGVfY2xrKGNvbnN0IHN0cnVjdCBjbGtfcGVyaXBoX2RhdGEgKmRhdGEsCisJCQkJCSB2b2lkIF9faW9tZW0gKnJlZywgc3BpbmxvY2tfdCAqbG9jaywKKwkJCQkJIHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGNsa19odyAqaHcpCit7CisJY29uc3Qgc3RydWN0IGNsa19vcHMgKm11eF9vcHMgPSBOVUxMLCAqZ2F0ZV9vcHMgPSBOVUxMLAorCQkqcmF0ZV9vcHMgPSBOVUxMOworCXN0cnVjdCBjbGtfaHcgKm11eF9odyA9IE5VTEwsICpnYXRlX2h3ID0gTlVMTCwgKnJhdGVfaHcgPSBOVUxMOworCisJaWYgKGRhdGEtPm11eF9odykgeworCQlzdHJ1Y3QgY2xrX211eCAqbXV4OworCisJCW11eF9odyA9IGRhdGEtPm11eF9odzsKKwkJbXV4ID0gdG9fY2xrX211eChtdXhfaHcpOworCQltdXgtPmxvY2sgPSBsb2NrOworCQltdXhfb3BzID0gbXV4X2h3LT5pbml0LT5vcHM7CisJCW11eC0+cmVnID0gcmVnICsgKHU2NCltdXgtPnJlZzsKKwl9CisKKwlpZiAoZGF0YS0+Z2F0ZV9odykgeworCQlzdHJ1Y3QgY2xrX2dhdGUgKmdhdGU7CisKKwkJZ2F0ZV9odyA9IGRhdGEtPmdhdGVfaHc7CisJCWdhdGUgPSB0b19jbGtfZ2F0ZShnYXRlX2h3KTsKKwkJZ2F0ZS0+bG9jayA9IGxvY2s7CisJCWdhdGVfb3BzID0gZ2F0ZV9ody0+aW5pdC0+b3BzOworCQlnYXRlLT5yZWcgPSByZWcgKyAodTY0KWdhdGUtPnJlZzsKKwl9CisKKwlpZiAoZGF0YS0+cmF0ZV9odykgeworCQlyYXRlX2h3ID0gZGF0YS0+cmF0ZV9odzsKKwkJcmF0ZV9vcHMgPSByYXRlX2h3LT5pbml0LT5vcHM7CisJCWlmIChkYXRhLT5pc19kb3VibGVfZGl2KSB7CisJCQlzdHJ1Y3QgY2xrX2RvdWJsZV9kaXYgKnJhdGU7CisKKwkJCXJhdGUgPSAgdG9fY2xrX2RvdWJsZV9kaXYocmF0ZV9odyk7CisJCQlyYXRlLT5yZWcxID0gcmVnICsgKHU2NClyYXRlLT5yZWcxOworCQkJcmF0ZS0+cmVnMiA9IHJlZyArICh1NjQpcmF0ZS0+cmVnMjsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBjbGtfZGl2aWRlciAqcmF0ZSA9IHRvX2Nsa19kaXZpZGVyKHJhdGVfaHcpOworCQkJY29uc3Qgc3RydWN0IGNsa19kaXZfdGFibGUgKmNsa3Q7CisJCQlpbnQgdGFibGVfc2l6ZSA9IDA7CisKKwkJCXJhdGUtPnJlZyA9IHJlZyArICh1NjQpcmF0ZS0+cmVnOworCQkJZm9yIChjbGt0ID0gcmF0ZS0+dGFibGU7IGNsa3QtPmRpdjsgY2xrdCsrKQorCQkJCXRhYmxlX3NpemUrKzsKKwkJCXJhdGUtPndpZHRoID0gb3JkZXJfYmFzZV8yKHRhYmxlX3NpemUpOworCQkJcmF0ZS0+bG9jayA9IGxvY2s7CisJCX0KKwl9CisKKwlodyA9IGNsa19od19yZWdpc3Rlcl9jb21wb3NpdGUoZGV2LCBkYXRhLT5uYW1lLCBkYXRhLT5wYXJlbnRfbmFtZXMsCisJCQkJICAgICAgIGRhdGEtPm51bV9wYXJlbnRzLCBtdXhfaHcsCisJCQkJICAgICAgIG11eF9vcHMsIHJhdGVfaHcsIHJhdGVfb3BzLAorCQkJCSAgICAgICBnYXRlX2h3LCBnYXRlX29wcywgQ0xLX0lHTk9SRV9VTlVTRUQpOworCisJaWYgKElTX0VSUihodykpCisJCXJldHVybiBQVFJfRVJSKGh3KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFybWFkYV8zNzAwX3BlcmlwaF9jbG9ja19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBjbGtfcGVyaXBoX2RyaXZlcl9kYXRhICpkcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJY29uc3Qgc3RydWN0IGNsa19wZXJpcGhfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWludCBudW1fcGVyaXBoID0gMCwgaSwgcmV0OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXZvaWQgX19pb21lbSAqcmVnOworCisJZGF0YSA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YShkZXYpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl3aGlsZSAoZGF0YVtudW1fcGVyaXBoXS5uYW1lKQorCQludW1fcGVyaXBoKys7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXJlZyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJaWYgKElTX0VSUihyZWcpKQorCQlyZXR1cm4gUFRSX0VSUihyZWcpOworCisJZHJpdmVyX2RhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRyaXZlcl9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcml2ZXJfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkcml2ZXJfZGF0YS0+aHdfZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZHJpdmVyX2RhdGEtPmh3X2RhdGEpICsKKwkJCSAgICBzaXplb2YoKmRyaXZlcl9kYXRhLT5od19kYXRhLT5od3MpICogbnVtX3BlcmlwaCwKKwkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWRyaXZlcl9kYXRhLT5od19kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkcml2ZXJfZGF0YS0+aHdfZGF0YS0+bnVtID0gbnVtX3BlcmlwaDsKKworCXNwaW5fbG9ja19pbml0KCZkcml2ZXJfZGF0YS0+bG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BlcmlwaDsgaSsrKSB7CisJCXN0cnVjdCBjbGtfaHcgKmh3ID0gZHJpdmVyX2RhdGEtPmh3X2RhdGEtPmh3c1tpXTsKKworCQlpZiAoYXJtYWRhXzM3MDBfYWRkX2NvbXBvc2l0ZV9jbGsoJmRhdGFbaV0sIHJlZywKKwkJCQkJCSAgJmRyaXZlcl9kYXRhLT5sb2NrLCBkZXYsIGh3KSkKKwkJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgcmVnaXN0ZXIgcGVyaXBoIGNsb2NrICVzXG4iLAorCQkJICAgICAgIGRhdGFbaV0ubmFtZSk7CisKKwl9CisKKwlyZXQgPSBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfb25lY2VsbF9nZXQsCisJCQkJICBkcml2ZXJfZGF0YS0+aHdfZGF0YSk7CisJaWYgKHJldCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BlcmlwaDsgaSsrKQorCQkJY2xrX2h3X3VucmVnaXN0ZXIoZHJpdmVyX2RhdGEtPmh3X2RhdGEtPmh3c1tpXSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZHJpdmVyX2RhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFybWFkYV8zNzAwX3BlcmlwaF9jbG9ja19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgY2xrX3BlcmlwaF9kcml2ZXJfZGF0YSAqZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhICpod19kYXRhID0gZGF0YS0+aHdfZGF0YTsKKwlpbnQgaTsKKworCW9mX2Nsa19kZWxfcHJvdmlkZXIocGRldi0+ZGV2Lm9mX25vZGUpOworCisJZm9yIChpID0gMDsgaSA8IGh3X2RhdGEtPm51bTsgaSsrKQorCQljbGtfaHdfdW5yZWdpc3Rlcihod19kYXRhLT5od3NbaV0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFybWFkYV8zNzAwX3BlcmlwaF9jbG9ja19kcml2ZXIgPSB7CisJLnByb2JlID0gYXJtYWRhXzM3MDBfcGVyaXBoX2Nsb2NrX3Byb2JlLAorCS5yZW1vdmUgPSBhcm1hZGFfMzcwMF9wZXJpcGhfY2xvY2tfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJtYXJ2ZWxsLWFybWFkYS0zNzAwLXBlcmlwaC1jbG9jayIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGFybWFkYV8zNzAwX3BlcmlwaF9jbG9ja19vZl9tYXRjaCwKKwl9LAorfTsKKworYnVpbHRpbl9wbGF0Zm9ybV9kcml2ZXIoYXJtYWRhXzM3MDBfcGVyaXBoX2Nsb2NrX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tdmVidS9hcm1hZGEtMzd4eC10YmcuYyBiL2RyaXZlcnMvY2xrL212ZWJ1L2FybWFkYS0zN3h4LXRiZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhODBkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9tdmVidS9hcm1hZGEtMzd4eC10YmcuYwpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIE1hcnZlbGwgQXJtYWRhIDM3eHggU29DIFRpbWUgQmFzZSBHZW5lcmF0b3IgY2xvY2tzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IE1hcnZlbGwKKyAqCisgKiBHcmVnb3J5IENMRU1FTlQgPGdyZWdvcnkuY2xlbWVudEBmcmVlLWVsZWN0cm9ucy5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvciBsYXRlci4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIKKyAqIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIE5VTV9UQkcJICAgIDQKKworI2RlZmluZSBUQkdfQ1RSTDAJCTB4NAorI2RlZmluZSBUQkdfQ1RSTDEJCTB4OAorI2RlZmluZSBUQkdfQ1RSTDcJCTB4MjAKKyNkZWZpbmUgVEJHX0NUUkw4CQkweDMwCisKKyNkZWZpbmUgVEJHX0RJVl9NQVNLCQkweDFGRgorCisjZGVmaW5lIFRCR19BX1JFRkRJVgkJMAorI2RlZmluZSBUQkdfQl9SRUZESVYJCTE2CisKKyNkZWZpbmUgVEJHX0FfRkJESVYJCTIKKyNkZWZpbmUgVEJHX0JfRkJESVYJCTE4CisKKyNkZWZpbmUgVEJHX0FfVkNPRElWX1NFCQkwCisjZGVmaW5lIFRCR19CX1ZDT0RJVl9TRQkJMTYKKworI2RlZmluZSBUQkdfQV9WQ09ESVZfRElGRgkxCisjZGVmaW5lIFRCR19CX1ZDT0RJVl9ESUZGCTE3CisKK3N0cnVjdCB0YmdfZGVmIHsKKwljaGFyICpuYW1lOworCXUzMiByZWZkaXZfb2Zmc2V0OworCXUzMiBmYmRpdl9vZmZzZXQ7CisJdTMyIHZjb2Rpdl9yZWc7CisJdTMyIHZjb2Rpdl9vZmZzZXQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRiZ19kZWYgdGJnW05VTV9UQkddID0geworCXsiVEJHLUEtUCIsIFRCR19BX1JFRkRJViwgVEJHX0FfRkJESVYsIFRCR19DVFJMOCwgVEJHX0FfVkNPRElWX0RJRkZ9LAorCXsiVEJHLUItUCIsIFRCR19CX1JFRkRJViwgVEJHX0JfRkJESVYsIFRCR19DVFJMOCwgVEJHX0JfVkNPRElWX0RJRkZ9LAorCXsiVEJHLUEtUyIsIFRCR19BX1JFRkRJViwgVEJHX0FfRkJESVYsIFRCR19DVFJMMSwgVEJHX0FfVkNPRElWX1NFfSwKKwl7IlRCRy1CLVMiLCBUQkdfQl9SRUZESVYsIFRCR19CX0ZCRElWLCBUQkdfQ1RSTDEsIFRCR19CX1ZDT0RJVl9TRX0sCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IHRiZ19nZXRfbXVsdCh2b2lkIF9faW9tZW0gKnJlZywgY29uc3Qgc3RydWN0IHRiZ19kZWYgKnB0YmcpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHJlYWRsKHJlZyArIFRCR19DVFJMMCk7CisKKwlyZXR1cm4gKCh2YWwgPj4gcHRiZy0+ZmJkaXZfb2Zmc2V0KSAmIFRCR19ESVZfTUFTSykgPDwgMjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB0YmdfZ2V0X2Rpdih2b2lkIF9faW9tZW0gKnJlZywgY29uc3Qgc3RydWN0IHRiZ19kZWYgKnB0YmcpCit7CisJdTMyIHZhbDsKKwl1bnNpZ25lZCBpbnQgZGl2OworCisJdmFsID0gcmVhZGwocmVnICsgVEJHX0NUUkw3KTsKKworCWRpdiA9ICh2YWwgPj4gcHRiZy0+cmVmZGl2X29mZnNldCkgJiBUQkdfRElWX01BU0s7CisJaWYgKGRpdiA9PSAwKQorCQlkaXYgPSAxOworCXZhbCA9IHJlYWRsKHJlZyArIHB0YmctPnZjb2Rpdl9yZWcpOworCisJZGl2ICo9IDEgPDwgKCh2YWwgPj4gIHB0YmctPnZjb2Rpdl9vZmZzZXQpICYgVEJHX0RJVl9NQVNLKTsKKworCXJldHVybiBkaXY7Cit9CisKKworc3RhdGljIGludCBhcm1hZGFfMzcwMF90YmdfY2xvY2tfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgKmh3X3RiZ19kYXRhOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IGNsayAqcGFyZW50OworCXZvaWQgX19pb21lbSAqcmVnOworCWludCBpLCByZXQ7CisKKwlod190YmdfZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmh3X3RiZ19kYXRhKQorCQkJCSAgICsgc2l6ZW9mKCpod190YmdfZGF0YS0+aHdzKSAqIE5VTV9UQkcsCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFod190YmdfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaHdfdGJnX2RhdGEtPm51bSA9IE5VTV9UQkc7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaHdfdGJnX2RhdGEpOworCisJcGFyZW50ID0gZGV2bV9jbGtfZ2V0KGRldiwgTlVMTCk7CisJaWYgKElTX0VSUihwYXJlbnQpKSB7CisJCWRldl9lcnIoZGV2LCAiQ291bGQgZ2V0IHRoZSBjbG9jayBwYXJlbnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGFyZW50X25hbWUgPSBfX2Nsa19nZXRfbmFtZShwYXJlbnQpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlyZWcgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIocmVnKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVnKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fVEJHOyBpKyspIHsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwkJdW5zaWduZWQgaW50IG11bHQsIGRpdjsKKworCQluYW1lID0gdGJnW2ldLm5hbWU7CisJCW11bHQgPSB0YmdfZ2V0X211bHQocmVnLCAmdGJnW2ldKTsKKwkJZGl2ID0gdGJnX2dldF9kaXYocmVnLCAmdGJnW2ldKTsKKwkJaHdfdGJnX2RhdGEtPmh3c1tpXSA9IGNsa19od19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgbmFtZSwKKwkJCQkJCXBhcmVudF9uYW1lLCAwLCBtdWx0LCBkaXYpOworCQlpZiAoSVNfRVJSKGh3X3RiZ19kYXRhLT5od3NbaV0pKQorCQkJZGV2X2VycihkZXYsICJDYW4ndCByZWdpc3RlciBUQkcgY2xvY2sgJXNcbiIsIG5hbWUpOworCX0KKworCXJldCA9IG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19vbmVjZWxsX2dldCwgaHdfdGJnX2RhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhcm1hZGFfMzcwMF90YmdfY2xvY2tfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGk7CisJc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgKmh3X3RiZ19kYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlvZl9jbGtfZGVsX3Byb3ZpZGVyKHBkZXYtPmRldi5vZl9ub2RlKTsKKwlmb3IgKGkgPSAwOyBpIDwgaHdfdGJnX2RhdGEtPm51bTsgaSsrKQorCQljbGtfaHdfdW5yZWdpc3Rlcl9maXhlZF9mYWN0b3IoaHdfdGJnX2RhdGEtPmh3c1tpXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXJtYWRhXzM3MDBfdGJnX2Nsb2NrX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGFybWFkYS0zNzAwLXRiZy1jbG9jayIsIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhcm1hZGFfMzcwMF90YmdfY2xvY2tfZHJpdmVyID0geworCS5wcm9iZSA9IGFybWFkYV8zNzAwX3RiZ19jbG9ja19wcm9iZSwKKwkucmVtb3ZlID0gYXJtYWRhXzM3MDBfdGJnX2Nsb2NrX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibWFydmVsbC1hcm1hZGEtMzcwMC10YmctY2xvY2siLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhcm1hZGFfMzcwMF90YmdfY2xvY2tfb2ZfbWF0Y2gsCisJfSwKK307CisKK2J1aWx0aW5fcGxhdGZvcm1fZHJpdmVyKGFybWFkYV8zNzAwX3RiZ19jbG9ja19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbXZlYnUvYXJtYWRhLTM3eHgteHRhbC5jIGIvZHJpdmVycy9jbGsvbXZlYnUvYXJtYWRhLTM3eHgteHRhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMmQ2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9tdmVidS9hcm1hZGEtMzd4eC14dGFsLmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIE1hcnZlbGwgQXJtYWRhIDM3eHggU29DIHh0YWwgY2xvY2tzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IE1hcnZlbGwKKyAqCisgKiBHcmVnb3J5IENMRU1FTlQgPGdyZWdvcnkuY2xlbWVudEBmcmVlLWVsZWN0cm9ucy5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2RlZmluZSBOQl9HUElPMV9MQVRDSAkweEMKKyNkZWZpbmUgWFRBTF9NT0RFCSAgICBCSVQoMzEpCisKK3N0YXRpYyBpbnQgYXJtYWRhXzM3MDBfeHRhbF9jbG9ja19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwljb25zdCBjaGFyICp4dGFsX25hbWUgPSAieHRhbCI7CisJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQ7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXN0cnVjdCBjbGtfaHcgKnh0YWxfaHc7CisJdW5zaWduZWQgaW50IHJhdGU7CisJdTMyIHJlZzsKKwlpbnQgcmV0OworCisJeHRhbF9odyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnh0YWxfaHcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXh0YWxfaHcpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgeHRhbF9odyk7CisKKwlwYXJlbnQgPSBucC0+cGFyZW50OworCWlmICghcGFyZW50KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHBhcmVudFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlZ21hcCA9IHN5c2Nvbl9ub2RlX3RvX3JlZ21hcChwYXJlbnQpOworCWlmIChJU19FUlIocmVnbWFwKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgZ2V0IHJlZ21hcFxuIik7CisJCXJldHVybiBQVFJfRVJSKHJlZ21hcCk7CisJfQorCisJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBOQl9HUElPMV9MQVRDSCwgJnJlZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgcmVhZCBmcm9tIHJlZ21hcFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHJlZyAmIFhUQUxfTU9ERSkKKwkJcmF0ZSA9IDQwMDAwMDAwOworCWVsc2UKKwkJcmF0ZSA9IDI1MDAwMDAwOworCisJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLCAwLCAmeHRhbF9uYW1lKTsKKwl4dGFsX2h3ID0gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgeHRhbF9uYW1lLCBOVUxMLCAwLCByYXRlKTsKKwlpZiAoSVNfRVJSKHh0YWxfaHcpKQorCQlyZXR1cm4gUFRSX0VSUih4dGFsX2h3KTsKKwlyZXQgPSBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgeHRhbF9odyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFybWFkYV8zNzAwX3h0YWxfY2xvY2tfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb2ZfY2xrX2RlbF9wcm92aWRlcihwZGV2LT5kZXYub2Zfbm9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXJtYWRhXzM3MDBfeHRhbF9jbG9ja19vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCxhcm1hZGEtMzcwMC14dGFsLWNsb2NrIiwgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFybWFkYV8zNzAwX3h0YWxfY2xvY2tfZHJpdmVyID0geworCS5wcm9iZSA9IGFybWFkYV8zNzAwX3h0YWxfY2xvY2tfcHJvYmUsCisJLnJlbW92ZSA9IGFybWFkYV8zNzAwX3h0YWxfY2xvY2tfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJtYXJ2ZWxsLWFybWFkYS0zNzAwLXh0YWwtY2xvY2siLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhcm1hZGFfMzcwMF94dGFsX2Nsb2NrX29mX21hdGNoLAorCX0sCit9OworCitidWlsdGluX3BsYXRmb3JtX2RyaXZlcihhcm1hZGFfMzcwMF94dGFsX2Nsb2NrX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tdmVidS9hcm1hZGEtMzl4LmMgYi9kcml2ZXJzL2Nsay9tdmVidS9hcm1hZGEtMzl4LmMKaW5kZXggZWZiOTc0ZC4uNGZkZmQzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvbXZlYnUvYXJtYWRhLTM5eC5jCisrKyBiL2RyaXZlcnMvY2xrL212ZWJ1L2FybWFkYS0zOXguYwpAQCAtMTQyLDYgKzE0Miw4IEBACiAJeyAicGV4MyIsIE5VTEwsIDcgfSwKIAl7ICJwZXgwIiwgTlVMTCwgOCB9LAogCXsgInVzYjNoMCIsIE5VTEwsIDkgfSwKKwl7ICJ1c2IzaDEiLCBOVUxMLCAxMCB9LAorCXsgInNhdGEwIiwgTlVMTCwgMTUgfSwKIAl7ICJzZGlvIiwgTlVMTCwgMTcgfSwKIAl7ICJ4b3IwIiwgTlVMTCwgMjIgfSwKIAl7ICJ4b3IxIiwgTlVMTCwgMjggfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL212ZWJ1L2NwMTEwLXN5c3RlbS1jb250cm9sbGVyLmMgYi9kcml2ZXJzL2Nsay9tdmVidS9jcDExMC1zeXN0ZW0tY29udHJvbGxlci5jCmluZGV4IDdmYTQyZDYuLmYyMzAzZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL212ZWJ1L2NwMTEwLXN5c3RlbS1jb250cm9sbGVyLmMKKysrIGIvZHJpdmVycy9jbGsvbXZlYnUvY3AxMTAtc3lzdGVtLWNvbnRyb2xsZXIuYwpAQCAtODEsMTMgKzgxLDYgQEAKICNkZWZpbmUgQ1AxMTBfR0FURV9FSVAxNTAJCTI1CiAjZGVmaW5lIENQMTEwX0dBVEVfRUlQMTk3CQkyNgogCi1zdGF0aWMgc3RydWN0IGNsayAqY3AxMTBfY2xrc1tDUDExMF9DTEtfTlVNXTsKLQotc3RhdGljIHN0cnVjdCBjbGtfb25lY2VsbF9kYXRhIGNwMTEwX2Nsa19kYXRhID0gewotCS5jbGtzID0gY3AxMTBfY2xrcywKLQkuY2xrX251bSA9IENQMTEwX0NMS19OVU0sCi19OwotCiBzdHJ1Y3QgY3AxMTBfZ2F0ZV9jbGsgewogCXN0cnVjdCBjbGtfaHcgaHc7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwpAQCAtMTQyLDYgKzEzNSw4IEBACiAJaWYgKCFnYXRlKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAorCW1lbXNldCgmaW5pdCwgMCwgc2l6ZW9mKGluaXQpKTsKKwogCWluaXQubmFtZSA9IG5hbWU7CiAJaW5pdC5vcHMgPSAmY3AxMTBfZ2F0ZV9vcHM7CiAJaW5pdC5wYXJlbnRfbmFtZXMgPSAmcGFyZW50X25hbWU7CkBAIC0xOTQsNyArMTg5LDggQEAKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwogCWNvbnN0IGNoYXIgKnBwdjJfbmFtZSwgKmFwbGxfbmFtZSwgKmNvcmVfbmFtZSwgKmVpcF9uYW1lLCAqbmFuZF9uYW1lOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSAqY3AxMTBfY2xrX2RhdGE7CisJc3RydWN0IGNsayAqY2xrLCAqKmNwMTEwX2Nsa3M7CiAJdTMyIG5hbmRfY2xrX2N0cmw7CiAJaW50IGksIHJldDsKIApAQCAtMjA3LDYgKzIwMywyMCBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwljcDExMF9jbGtzID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgY2xrICopLAorCQkJCSAgQ1AxMTBfQ0xLX05VTSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjcDExMF9jbGtzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNwMTEwX2Nsa19kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJCQkJICAgICAgc2l6ZW9mKCpjcDExMF9jbGtfZGF0YSksCisJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjcDExMF9jbGtfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljcDExMF9jbGtfZGF0YS0+Y2xrcyA9IGNwMTEwX2Nsa3M7CisJY3AxMTBfY2xrX2RhdGEtPmNsa19udW0gPSBDUDExMF9DTEtfTlVNOworCiAJLyogUmVnaXN0ZXIgdGhlIEFQTEwgd2hpY2ggaXMgdGhlIHJvb3Qgb2YgdGhlIGNsayB0cmVlICovCiAJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgobnAsICJjb3JlLWNsb2NrLW91dHB1dC1uYW1lcyIsCiAJCQkJICAgICAgQ1AxMTBfQ09SRV9BUExMLCAmYXBsbF9uYW1lKTsKQEAgLTMzNCwxMCArMzQ0LDEyIEBACiAJCWNwMTEwX2Nsa3NbQ1AxMTBfTUFYX0NPUkVfQ0xPQ0tTICsgaV0gPSBjbGs7CiAJfQogCi0JcmV0ID0gb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgY3AxMTBfb2ZfY2xrX2dldCwgJmNwMTEwX2Nsa19kYXRhKTsKKwlyZXQgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBjcDExMF9vZl9jbGtfZ2V0LCBjcDExMF9jbGtfZGF0YSk7CiAJaWYgKHJldCkKIAkJZ290byBmYWlsX2Nsa19hZGQ7CiAKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjcDExMF9jbGtzKTsKKwogCXJldHVybiAwOwogCiBmYWlsX2Nsa19hZGQ6CkBAIC0zNjQsNiArMzc2LDcgQEAKIAogc3RhdGljIGludCBjcDExMF9zeXNjb25fY2xrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBjbGsgKipjcDExMF9jbGtzID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJaW50IGk7CiAKIAlvZl9jbGtfZGVsX3Byb3ZpZGVyKHBkZXYtPmRldi5vZl9ub2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL254cC9jbGstbHBjMTh4eC1jcmVnLmMgYi9kcml2ZXJzL2Nsay9ueHAvY2xrLWxwYzE4eHgtY3JlZy5jCmluZGV4IDllMzU3NDkuLmM2ZTgwMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL254cC9jbGstbHBjMTh4eC1jcmVnLmMKKysrIGIvZHJpdmVycy9jbGsvbnhwL2Nsay1scGMxOHh4LWNyZWcuYwpAQCAtMTg0LDcgKzE4NCw4IEBACiAKIAlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LCAmY2xrX2NyZWdfZWFybHlfZGF0YSk7CiB9Ci1DTEtfT0ZfREVDTEFSRShscGMxOHh4X2NyZWdfY2xrLCAibnhwLGxwYzE4NTAtY3JlZy1jbGsiLCBscGMxOHh4X2NyZWdfY2xrX2luaXQpOworQ0xLX09GX0RFQ0xBUkVfRFJJVkVSKGxwYzE4eHhfY3JlZ19jbGssICJueHAsbHBjMTg1MC1jcmVnLWNsayIsCisJCSAgICAgIGxwYzE4eHhfY3JlZ19jbGtfaW5pdCk7CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtfY3JlZ1tDUkVHX0NMS19NQVhdOwogc3RhdGljIHN0cnVjdCBjbGtfb25lY2VsbF9kYXRhIGNsa19jcmVnX2RhdGEgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9ueHAvY2xrLWxwYzMyeHguYyBiL2RyaXZlcnMvY2xrL254cC9jbGstbHBjMzJ4eC5jCmluZGV4IDkwZDc0MGEuLjM0Yzk3MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL254cC9jbGstbHBjMzJ4eC5jCisrKyBiL2RyaXZlcnMvY2xrL254cC9jbGstbHBjMzJ4eC5jCkBAIC0xNTEzLDYgKzE1MTMsNyBAQAogCWlmIChJU19FUlIoY2xrX3JlZ21hcCkpIHsKIAkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnbWFwIHN5c3RlbSBjb250cm9sIGJsb2NrOiAlbGRcbiIsCiAJCQlQVFJfRVJSKGNsa19yZWdtYXApKTsKKwkJaW91bm1hcChiYXNlKTsKIAkJcmV0dXJuOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcWNvbS9LY29uZmlnIGIvZHJpdmVycy9jbGsvcWNvbS9LY29uZmlnCmluZGV4IDk1ZTNiM2UuLjAxNDZkM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3Fjb20vS2NvbmZpZworKysgYi9kcml2ZXJzL2Nsay9xY29tL0tjb25maWcKQEAgLTg3LDYgKzg3LDIzIEBACiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byB1c2UgYXVkaW8gZGV2aWNlcyBzdWNoIGFzIGkycywgcGNtLAogCSAgU0xJTUJ1cywgZXRjLgogCitjb25maWcgTURNX0dDQ185NjE1CisJdHJpc3RhdGUgIk1ETTk2MTUgR2xvYmFsIENsb2NrIENvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBDT01NT05fQ0xLX1FDT00KKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgZ2xvYmFsIGNsb2NrIGNvbnRyb2xsZXIgb24gbWRtOTYxNSBkZXZpY2VzLgorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gdXNlIHBlcmlwaGVyYWwgZGV2aWNlcyBzdWNoIGFzIFVBUlQsIFNQSSwKKwkgIGkyYywgVVNCLCBTRC9lTU1DLCBldGMuCisKK2NvbmZpZyBNRE1fTENDXzk2MTUKKwl0cmlzdGF0ZSAiTURNOTYxNSBMUEFTUyBDbG9jayBDb250cm9sbGVyIgorCXNlbGVjdCBNRE1fR0NDXzk2MTUKKwlkZXBlbmRzIG9uIENPTU1PTl9DTEtfUUNPTQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHRoZSBMUEFTUyBjbG9jayBjb250cm9sbGVyIG9uIG1kbTk2MTUgZGV2aWNlcy4KKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIHVzZSBhdWRpbyBkZXZpY2VzIHN1Y2ggYXMgaTJzLCBwY20sCisJICBTTElNQnVzLCBldGMuCisKIGNvbmZpZyBNU01fTU1DQ184OTYwCiAJdHJpc3RhdGUgIk1TTTg5NjAgTXVsdGltZWRpYSBDbG9jayBDb250cm9sbGVyIgogCXNlbGVjdCBNU01fR0NDXzg5NjAKQEAgLTExNyw2ICsxMzQsNyBAQAogCiBjb25maWcgTVNNX0dDQ184OTk2CiAJdHJpc3RhdGUgIk1TTTg5OTYgR2xvYmFsIENsb2NrIENvbnRyb2xsZXIiCisJc2VsZWN0IFFDT01fR0RTQwogCWRlcGVuZHMgb24gQ09NTU9OX0NMS19RQ09NCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgdGhlIGdsb2JhbCBjbG9jayBjb250cm9sbGVyIG9uIG1zbTg5OTYgZGV2aWNlcy4KQEAgLTEyNiw2ICsxNDQsNyBAQAogY29uZmlnIE1TTV9NTUNDXzg5OTYKIAl0cmlzdGF0ZSAiTVNNODk5NiBNdWx0aW1lZGlhIENsb2NrIENvbnRyb2xsZXIiCiAJc2VsZWN0IE1TTV9HQ0NfODk5NgorCXNlbGVjdCBRQ09NX0dEU0MKIAlkZXBlbmRzIG9uIENPTU1PTl9DTEtfUUNPTQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBtdWx0aW1lZGlhIGNsb2NrIGNvbnRyb2xsZXIgb24gbXNtODk5NiBkZXZpY2VzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcWNvbS9NYWtlZmlsZSBiL2RyaXZlcnMvY2xrL3Fjb20vTWFrZWZpbGUKaW5kZXggMmEyNWY0ZS4uMWZiMWY1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvcWNvbS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2Nsay9xY29tL01ha2VmaWxlCkBAIC0xMiwxNyArMTIsMjAgQEAKIGNsay1xY29tLXkgKz0gcmVzZXQubwogY2xrLXFjb20tJChDT05GSUdfUUNPTV9HRFNDKSArPSBnZHNjLm8KIAorIyBLZWVwIGFscGhhYmV0aWNhbGx5IHNvcnRlZCBieSBjb25maWcKIG9iai0kKENPTkZJR19BUFFfR0NDXzgwODQpICs9IGdjYy1hcHE4MDg0Lm8KIG9iai0kKENPTkZJR19BUFFfTU1DQ184MDg0KSArPSBtbWNjLWFwcTgwODQubwogb2JqLSQoQ09ORklHX0lQUV9HQ0NfNDAxOSkgKz0gZ2NjLWlwcTQwMTkubwogb2JqLSQoQ09ORklHX0lQUV9HQ0NfODA2WCkgKz0gZ2NjLWlwcTgwNngubwogb2JqLSQoQ09ORklHX0lQUV9MQ0NfODA2WCkgKz0gbGNjLWlwcTgwNngubworb2JqLSQoQ09ORklHX01ETV9HQ0NfOTYxNSkgKz0gZ2NjLW1kbTk2MTUubworb2JqLSQoQ09ORklHX01ETV9MQ0NfOTYxNSkgKz0gbGNjLW1kbTk2MTUubwogb2JqLSQoQ09ORklHX01TTV9HQ0NfODY2MCkgKz0gZ2NjLW1zbTg2NjAubwogb2JqLSQoQ09ORklHX01TTV9HQ0NfODkxNikgKz0gZ2NjLW1zbTg5MTYubwogb2JqLSQoQ09ORklHX01TTV9HQ0NfODk2MCkgKz0gZ2NjLW1zbTg5NjAubwotb2JqLSQoQ09ORklHX01TTV9MQ0NfODk2MCkgKz0gbGNjLW1zbTg5NjAubwogb2JqLSQoQ09ORklHX01TTV9HQ0NfODk3NCkgKz0gZ2NjLW1zbTg5NzQubwogb2JqLSQoQ09ORklHX01TTV9HQ0NfODk5NikgKz0gZ2NjLW1zbTg5OTYubworb2JqLSQoQ09ORklHX01TTV9MQ0NfODk2MCkgKz0gbGNjLW1zbTg5NjAubwogb2JqLSQoQ09ORklHX01TTV9NTUNDXzg5NjApICs9IG1tY2MtbXNtODk2MC5vCiBvYmotJChDT05GSUdfTVNNX01NQ0NfODk3NCkgKz0gbW1jYy1tc204OTc0Lm8KIG9iai0kKENPTkZJR19NU01fTU1DQ184OTk2KSArPSBtbWNjLW1zbTg5OTYubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcWNvbS9jbGstcmVnbWFwLmMgYi9kcml2ZXJzL2Nsay9xY29tL2Nsay1yZWdtYXAuYwppbmRleCBhNThiYTM5Li4xYzg1NmQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9xY29tL2Nsay1yZWdtYXAuYworKysgYi9kcml2ZXJzL2Nsay9xY29tL2Nsay1yZWdtYXAuYwpAQCAtMTAxLDE0ICsxMDEsMTMgQEAKICAqIGNsa19yZWdtYXAgc3RydWN0IHZpYSB0aGlzIGZ1bmN0aW9uIHNvIHRoYXQgdGhlIHJlZ21hcCBpcyBpbml0aWFsaXplZAogICogYW5kIHNvIHRoYXQgdGhlIGNsb2NrIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgY29tbW9uIGNsb2NrIGZyYW1ld29yay4KICAqLwotc3RydWN0IGNsayAqZGV2bV9jbGtfcmVnaXN0ZXJfcmVnbWFwKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgIHN0cnVjdCBjbGtfcmVnbWFwICpyY2xrKQoraW50IGRldm1fY2xrX3JlZ2lzdGVyX3JlZ21hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBjbGtfcmVnbWFwICpyY2xrKQogewogCWlmIChkZXYgJiYgZGV2X2dldF9yZWdtYXAoZGV2LCBOVUxMKSkKIAkJcmNsay0+cmVnbWFwID0gZGV2X2dldF9yZWdtYXAoZGV2LCBOVUxMKTsKIAllbHNlIGlmIChkZXYgJiYgZGV2LT5wYXJlbnQpCiAJCXJjbGstPnJlZ21hcCA9IGRldl9nZXRfcmVnbWFwKGRldi0+cGFyZW50LCBOVUxMKTsKIAotCXJldHVybiBkZXZtX2Nsa19yZWdpc3RlcihkZXYsICZyY2xrLT5odyk7CisJcmV0dXJuIGRldm1fY2xrX2h3X3JlZ2lzdGVyKGRldiwgJnJjbGstPmh3KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRldm1fY2xrX3JlZ2lzdGVyX3JlZ21hcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9xY29tL2Nsay1yZWdtYXAuaCBiL2RyaXZlcnMvY2xrL3Fjb20vY2xrLXJlZ21hcC5oCmluZGV4IDQ5MWE2M2QuLjkwZDk1Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3Fjb20vY2xrLXJlZ21hcC5oCisrKyBiL2RyaXZlcnMvY2xrL3Fjb20vY2xrLXJlZ21hcC5oCkBAIC0zOSw3ICszOSw2IEBACiBpbnQgY2xrX2lzX2VuYWJsZWRfcmVnbWFwKHN0cnVjdCBjbGtfaHcgKmh3KTsKIGludCBjbGtfZW5hYmxlX3JlZ21hcChzdHJ1Y3QgY2xrX2h3ICpodyk7CiB2b2lkIGNsa19kaXNhYmxlX3JlZ21hcChzdHJ1Y3QgY2xrX2h3ICpodyk7Ci1zdHJ1Y3QgY2xrICoKLWRldm1fY2xrX3JlZ2lzdGVyX3JlZ21hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBjbGtfcmVnbWFwICpyY2xrKTsKK2ludCBkZXZtX2Nsa19yZWdpc3Rlcl9yZWdtYXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgY2xrX3JlZ21hcCAqcmNsayk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcWNvbS9jb21tb24uYyBiL2RyaXZlcnMvY2xrL3Fjb20vY29tbW9uLmMKaW5kZXggZjdjMjI2YS4uZmZmY2JhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvcWNvbS9jb21tb24uYworKysgYi9kcml2ZXJzL2Nsay9xY29tL2NvbW1vbi5jCkBAIC0yNyw4ICsyNyw4IEBACiAKIHN0cnVjdCBxY29tX2NjIHsKIAlzdHJ1Y3QgcWNvbV9yZXNldF9jb250cm9sbGVyIHJlc2V0OwotCXN0cnVjdCBjbGtfb25lY2VsbF9kYXRhIGRhdGE7Ci0Jc3RydWN0IGNsayAqY2xrc1tdOworCXN0cnVjdCBjbGtfcmVnbWFwICoqcmNsa3M7CisJc2l6ZV90IG51bV9yY2xrczsKIH07CiAKIGNvbnN0CkBAIC0xMDIsOCArMTAyLDggQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNsb2Nrc19ub2RlOwogCXN0cnVjdCBjbGtfZml4ZWRfZmFjdG9yICpmYWN0b3I7CiAJc3RydWN0IGNsa19maXhlZF9yYXRlICpmaXhlZDsKLQlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdF9kYXRhID0geyB9OworCWludCByZXQ7CiAKIAljbG9ja3Nfbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvY2xvY2tzIik7CiAJaWYgKGNsb2Nrc19ub2RlKQpAQCAtMTIxLDkgKzEyMSw5IEBACiAJCWluaXRfZGF0YS5uYW1lID0gcGF0aDsKIAkJaW5pdF9kYXRhLm9wcyA9ICZjbGtfZml4ZWRfcmF0ZV9vcHM7CiAKLQkJY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoZGV2LCAmZml4ZWQtPmh3KTsKLQkJaWYgKElTX0VSUihjbGspKQotCQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwkJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoZGV2LCAmZml4ZWQtPmh3KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfQogCW9mX25vZGVfcHV0KG5vZGUpOwogCkBAIC0xNDEsOSArMTQxLDkgQEAKIAkJaW5pdF9kYXRhLmZsYWdzID0gMDsKIAkJaW5pdF9kYXRhLm9wcyA9ICZjbGtfZml4ZWRfZmFjdG9yX29wczsKIAotCQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcihkZXYsICZmYWN0b3ItPmh3KTsKLQkJaWYgKElTX0VSUihjbGspKQotCQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwkJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoZGV2LCAmZmFjdG9yLT5odyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldHVybiAwOwpAQCAtMTc0LDQyICsxNzQsNDggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHFjb21fY2NfcmVnaXN0ZXJfc2xlZXBfY2xrKTsKIAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKnFjb21fY2NfY2xrX2h3X2dldChzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpjbGtzcGVjLAorCQkJCQkgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcWNvbV9jYyAqY2MgPSBkYXRhOworCXVuc2lnbmVkIGludCBpZHggPSBjbGtzcGVjLT5hcmdzWzBdOworCisJaWYgKGlkeCA+PSBjYy0+bnVtX3JjbGtzKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgaW5kZXggJXVcbiIsIF9fZnVuY19fLCBpZHgpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gY2MtPnJjbGtzW2lkeF0gPyAmY2MtPnJjbGtzW2lkeF0tPmh3IDogRVJSX1BUUigtRU5PRU5UKTsKK30KKwogaW50IHFjb21fY2NfcmVhbGx5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCiAJCQkgY29uc3Qgc3RydWN0IHFjb21fY2NfZGVzYyAqZGVzYywgc3RydWN0IHJlZ21hcCAqcmVnbWFwKQogewogCWludCBpLCByZXQ7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0Jc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmRhdGE7Ci0Jc3RydWN0IGNsayAqKmNsa3M7CiAJc3RydWN0IHFjb21fcmVzZXRfY29udHJvbGxlciAqcmVzZXQ7CiAJc3RydWN0IHFjb21fY2MgKmNjOwogCXN0cnVjdCBnZHNjX2Rlc2MgKnNjZDsKIAlzaXplX3QgbnVtX2Nsa3MgPSBkZXNjLT5udW1fY2xrczsKIAlzdHJ1Y3QgY2xrX3JlZ21hcCAqKnJjbGtzID0gZGVzYy0+Y2xrczsKIAotCWNjID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjYykgKyBzaXplb2YoKmNsa3MpICogbnVtX2Nsa3MsCi0JCQkgIEdGUF9LRVJORUwpOworCWNjID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjYyksIEdGUF9LRVJORUwpOwogCWlmICghY2MpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JY2xrcyA9IGNjLT5jbGtzOwotCWRhdGEgPSAmY2MtPmRhdGE7Ci0JZGF0YS0+Y2xrcyA9IGNsa3M7Ci0JZGF0YS0+Y2xrX251bSA9IG51bV9jbGtzOworCWNjLT5yY2xrcyA9IHJjbGtzOworCWNjLT5udW1fcmNsa3MgPSBudW1fY2xrczsKIAogCWZvciAoaSA9IDA7IGkgPCBudW1fY2xrczsgaSsrKSB7Ci0JCWlmICghcmNsa3NbaV0pIHsKLQkJCWNsa3NbaV0gPSBFUlJfUFRSKC1FTk9FTlQpOworCQlpZiAoIXJjbGtzW2ldKQogCQkJY29udGludWU7Ci0JCX0KLQkJY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXJfcmVnbWFwKGRldiwgcmNsa3NbaV0pOwotCQlpZiAoSVNfRVJSKGNsaykpCi0JCQlyZXR1cm4gUFRSX0VSUihjbGspOwotCQljbGtzW2ldID0gY2xrOworCisJCXJldCA9IGRldm1fY2xrX3JlZ2lzdGVyX3JlZ21hcChkZXYsIHJjbGtzW2ldKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0gb2ZfY2xrX2FkZF9wcm92aWRlcihkZXYtPm9mX25vZGUsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsIGRhdGEpOworCXJldCA9IG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIoZGV2LT5vZl9ub2RlLCBxY29tX2NjX2Nsa19od19nZXQsIGNjKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9xY29tL2djYy1pcHE0MDE5LmMgYi9kcml2ZXJzL2Nsay9xY29tL2djYy1pcHE0MDE5LmMKaW5kZXggM2NkMWFmMC4uYjU5MzA2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvcWNvbS9nY2MtaXBxNDAxOS5jCisrKyBiL2RyaXZlcnMvY2xrL3Fjb20vZ2NjLWlwcTQwMTkuYwpAQCAtMTMzMiw3ICsxMzMyLDYgQEAKIAkucHJvYmUJCT0gZ2NjX2lwcTQwMTlfcHJvYmUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gInFjb20sZ2NjLWlwcTQwMTkiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm9mX21hdGNoX3RhYmxlID0gZ2NjX2lwcTQwMTlfbWF0Y2hfdGFibGUsCiAJfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9xY29tL2djYy1tZG05NjE1LmMgYi9kcml2ZXJzL2Nsay9xY29tL2djYy1tZG05NjE1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxYTE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL3Fjb20vZ2NjLW1kbTk2MTUuYwpAQCAtMCwwICsxLDE3MjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIEJheUxpYnJlLCBTQVMuCisgKiBBdXRob3IgOiBOZWlsIEFybXN0cm9uZyA8bmFybXN0cm9uZ0BiYXlsaWJyZS5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNldC1jb250cm9sbGVyLmg+CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1tZG05NjE1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvcmVzZXQvcWNvbSxnY2MtbWRtOTYxNS5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiY2xrLXJlZ21hcC5oIgorI2luY2x1ZGUgImNsay1wbGwuaCIKKyNpbmNsdWRlICJjbGstcmNnLmgiCisjaW5jbHVkZSAiY2xrLWJyYW5jaC5oIgorI2luY2x1ZGUgInJlc2V0LmgiCisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2ZpeGVkX2ZhY3RvciBjeG8gPSB7CisJLm11bHQgPSAxLAorCS5kaXYgPSAxLAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gImN4byIsCisJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAiY3hvX2JvYXJkIiB9LAorCQkubnVtX3BhcmVudHMgPSAxLAorCQkub3BzID0gJmNsa19maXhlZF9mYWN0b3Jfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19wbGwgcGxsMCA9IHsKKwkubF9yZWcgPSAweDMwYzQsCisJLm1fcmVnID0gMHgzMGM4LAorCS5uX3JlZyA9IDB4MzBjYywKKwkuY29uZmlnX3JlZyA9IDB4MzBkNCwKKwkubW9kZV9yZWcgPSAweDMwYzAsCisJLnN0YXR1c19yZWcgPSAweDMwZDgsCisJLnN0YXR1c19iaXQgPSAxNiwKKwkuY2xrci5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gInBsbDAiLAorCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImN4byIgfSwKKwkJLm51bV9wYXJlbnRzID0gMSwKKwkJLm9wcyA9ICZjbGtfcGxsX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmVnbWFwIHBsbDBfdm90ZSA9IHsKKwkuZW5hYmxlX3JlZyA9IDB4MzRjMCwKKwkuZW5hYmxlX21hc2sgPSBCSVQoMCksCisJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJLm5hbWUgPSAicGxsMF92b3RlIiwKKwkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJwbGw4IiB9LAorCQkubnVtX3BhcmVudHMgPSAxLAorCQkub3BzID0gJmNsa19wbGxfdm90ZV9vcHMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JlZ21hcCBwbGw0X3ZvdGUgPSB7CisJLmVuYWJsZV9yZWcgPSAweDM0YzAsCisJLmVuYWJsZV9tYXNrID0gQklUKDQpLAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gInBsbDRfdm90ZSIsCisJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAicGxsNCIgfSwKKwkJLm51bV9wYXJlbnRzID0gMSwKKwkJLm9wcyA9ICZjbGtfcGxsX3ZvdGVfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19wbGwgcGxsOCA9IHsKKwkubF9yZWcgPSAweDMxNDQsCisJLm1fcmVnID0gMHgzMTQ4LAorCS5uX3JlZyA9IDB4MzE0YywKKwkuY29uZmlnX3JlZyA9IDB4MzE1NCwKKwkubW9kZV9yZWcgPSAweDMxNDAsCisJLnN0YXR1c19yZWcgPSAweDMxNTgsCisJLnN0YXR1c19iaXQgPSAxNiwKKwkuY2xrci5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gInBsbDgiLAorCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImN4byIgfSwKKwkJLm51bV9wYXJlbnRzID0gMSwKKwkJLm9wcyA9ICZjbGtfcGxsX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmVnbWFwIHBsbDhfdm90ZSA9IHsKKwkuZW5hYmxlX3JlZyA9IDB4MzRjMCwKKwkuZW5hYmxlX21hc2sgPSBCSVQoOCksCisJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJLm5hbWUgPSAicGxsOF92b3RlIiwKKwkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJwbGw4IiB9LAorCQkubnVtX3BhcmVudHMgPSAxLAorCQkub3BzID0gJmNsa19wbGxfdm90ZV9vcHMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3BsbCBwbGwxNCA9IHsKKwkubF9yZWcgPSAweDMxYzQsCisJLm1fcmVnID0gMHgzMWM4LAorCS5uX3JlZyA9IDB4MzFjYywKKwkuY29uZmlnX3JlZyA9IDB4MzFkNCwKKwkubW9kZV9yZWcgPSAweDMxYzAsCisJLnN0YXR1c19yZWcgPSAweDMxZDgsCisJLnN0YXR1c19iaXQgPSAxNiwKKwkuY2xrci5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gInBsbDE0IiwKKwkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJjeG8iIH0sCisJCS5udW1fcGFyZW50cyA9IDEsCisJCS5vcHMgPSAmY2xrX3BsbF9vcHMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JlZ21hcCBwbGwxNF92b3RlID0geworCS5lbmFibGVfcmVnID0gMHgzNGMwLAorCS5lbmFibGVfbWFzayA9IEJJVCgxMSksCisJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJLm5hbWUgPSAicGxsMTRfdm90ZSIsCisJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAicGxsMTQiIH0sCisJCS5udW1fcGFyZW50cyA9IDEsCisJCS5vcHMgPSAmY2xrX3BsbF92b3RlX29wcywKKwl9LAorfTsKKworZW51bSB7CisJUF9DWE8sCisJUF9QTEw4LAorCVBfUExMMTQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBhcmVudF9tYXAgZ2NjX2N4b19wbGw4X21hcFtdID0geworCXsgUF9DWE8sIDAgfSwKKwl7IFBfUExMOCwgMyB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdjY19jeG9fcGxsOFtdID0geworCSJjeG8iLAorCSJwbGw4X3ZvdGUiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwYXJlbnRfbWFwIGdjY19jeG9fcGxsMTRfbWFwW10gPSB7CisJeyBQX0NYTywgMCB9LAorCXsgUF9QTEwxNCwgNCB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdjY19jeG9fcGxsMTRbXSA9IHsKKwkiY3hvIiwKKwkicGxsMTRfdm90ZSIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBhcmVudF9tYXAgZ2NjX2N4b19tYXBbXSA9IHsKKwl7IFBfQ1hPLCAwIH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdjY19jeG9bXSA9IHsKKwkiY3hvIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZnJlcV90YmwgY2xrX3RibF9nc2JpX3VhcnRbXSA9IHsKKwl7ICAxODQzMjAwLCBQX1BMTDgsIDIsICA2LCA2MjUgfSwKKwl7ICAzNjg2NDAwLCBQX1BMTDgsIDIsIDEyLCA2MjUgfSwKKwl7ICA3MzcyODAwLCBQX1BMTDgsIDIsIDI0LCA2MjUgfSwKKwl7IDE0NzQ1NjAwLCBQX1BMTDgsIDIsIDQ4LCA2MjUgfSwKKwl7IDE2MDAwMDAwLCBQX1BMTDgsIDQsICAxLCAgIDYgfSwKKwl7IDI0MDAwMDAwLCBQX1BMTDgsIDQsICAxLCAgIDQgfSwKKwl7IDMyMDAwMDAwLCBQX1BMTDgsIDQsICAxLCAgIDMgfSwKKwl7IDQwMDAwMDAwLCBQX1BMTDgsIDEsICA1LCAgNDggfSwKKwl7IDQ2NDAwMDAwLCBQX1BMTDgsIDEsIDI5LCAyNDAgfSwKKwl7IDQ4MDAwMDAwLCBQX1BMTDgsIDQsICAxLCAgIDIgfSwKKwl7IDUxMjAwMDAwLCBQX1BMTDgsIDEsICAyLCAgMTUgfSwKKwl7IDU2MDAwMDAwLCBQX1BMTDgsIDEsICA3LCAgNDggfSwKKwl7IDU4OTgyNDAwLCBQX1BMTDgsIDEsIDk2LCA2MjUgfSwKKwl7IDY0MDAwMDAwLCBQX1BMTDgsIDIsICAxLCAgIDMgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZyBnc2JpMV91YXJ0X3NyYyA9IHsKKwkubnNfcmVnID0gMHgyOWQ0LAorCS5tZF9yZWcgPSAweDI5ZDAsCisJLm1uID0geworCQkubW5jdHJfZW5fYml0ID0gOCwKKwkJLm1uY3RyX3Jlc2V0X2JpdCA9IDcsCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwKKwkJLm5fdmFsX3NoaWZ0ID0gMTYsCisJCS5tX3ZhbF9zaGlmdCA9IDE2LAorCQkud2lkdGggPSAxNiwKKwl9LAorCS5wID0geworCQkucHJlX2Rpdl9zaGlmdCA9IDMsCisJCS5wcmVfZGl2X3dpZHRoID0gMiwKKwl9LAorCS5zID0geworCQkuc3JjX3NlbF9zaGlmdCA9IDAsCisJCS5wYXJlbnRfbWFwID0gZ2NjX2N4b19wbGw4X21hcCwKKwl9LAorCS5mcmVxX3RibCA9IGNsa190YmxfZ3NiaV91YXJ0LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjlkNCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDExKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdzYmkxX3VhcnRfc3JjIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBnY2NfY3hvX3BsbDgsCisJCQkubnVtX3BhcmVudHMgPSAyLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUEFSRU5UX0dBVEUsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBnc2JpMV91YXJ0X2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDJmY2MsCisJLmhhbHRfYml0ID0gMTAsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyOWQ0LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoOSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJnc2JpMV91YXJ0X2NsayIsCisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsKKwkJCQkiZ3NiaTFfdWFydF9zcmMiLAorCQkJfSwKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmNnIGdzYmkyX3VhcnRfc3JjID0geworCS5uc19yZWcgPSAweDI5ZjQsCisJLm1kX3JlZyA9IDB4MjlmMCwKKwkubW4gPSB7CisJCS5tbmN0cl9lbl9iaXQgPSA4LAorCQkubW5jdHJfcmVzZXRfYml0ID0gNywKKwkJLm1uY3RyX21vZGVfc2hpZnQgPSA1LAorCQkubl92YWxfc2hpZnQgPSAxNiwKKwkJLm1fdmFsX3NoaWZ0ID0gMTYsCisJCS53aWR0aCA9IDE2LAorCX0sCisJLnAgPSB7CisJCS5wcmVfZGl2X3NoaWZ0ID0gMywKKwkJLnByZV9kaXZfd2lkdGggPSAyLAorCX0sCisJLnMgPSB7CisJCS5zcmNfc2VsX3NoaWZ0ID0gMCwKKwkJLnBhcmVudF9tYXAgPSBnY2NfY3hvX3BsbDhfbWFwLAorCX0sCisJLmZyZXFfdGJsID0gY2xrX3RibF9nc2JpX3VhcnQsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyOWY0LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMTEpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3NiaTJfdWFydF9zcmMiLAorCQkJLnBhcmVudF9uYW1lcyA9IGdjY19jeG9fcGxsOCwKKwkJCS5udW1fcGFyZW50cyA9IDIsCisJCQkub3BzID0gJmNsa19yY2dfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9QQVJFTlRfR0FURSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGdzYmkyX3VhcnRfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZjYywKKwkuaGFsdF9iaXQgPSA2LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjlmNCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3NiaTJfdWFydF9jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7CisJCQkJImdzYmkyX3VhcnRfc3JjIiwKKwkJCX0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZyBnc2JpM191YXJ0X3NyYyA9IHsKKwkubnNfcmVnID0gMHgyYTE0LAorCS5tZF9yZWcgPSAweDJhMTAsCisJLm1uID0geworCQkubW5jdHJfZW5fYml0ID0gOCwKKwkJLm1uY3RyX3Jlc2V0X2JpdCA9IDcsCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwKKwkJLm5fdmFsX3NoaWZ0ID0gMTYsCisJCS5tX3ZhbF9zaGlmdCA9IDE2LAorCQkud2lkdGggPSAxNiwKKwl9LAorCS5wID0geworCQkucHJlX2Rpdl9zaGlmdCA9IDMsCisJCS5wcmVfZGl2X3dpZHRoID0gMiwKKwl9LAorCS5zID0geworCQkuc3JjX3NlbF9zaGlmdCA9IDAsCisJCS5wYXJlbnRfbWFwID0gZ2NjX2N4b19wbGw4X21hcCwKKwl9LAorCS5mcmVxX3RibCA9IGNsa190YmxfZ3NiaV91YXJ0LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmExNCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDExKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdzYmkzX3VhcnRfc3JjIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBnY2NfY3hvX3BsbDgsCisJCQkubnVtX3BhcmVudHMgPSAyLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUEFSRU5UX0dBVEUsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBnc2JpM191YXJ0X2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDJmY2MsCisJLmhhbHRfYml0ID0gMiwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJhMTQsCisJCS5lbmFibGVfbWFzayA9IEJJVCg5KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdzYmkzX3VhcnRfY2xrIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peworCQkJCSJnc2JpM191YXJ0X3NyYyIsCisJCQl9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19yY2cgZ3NiaTRfdWFydF9zcmMgPSB7CisJLm5zX3JlZyA9IDB4MmEzNCwKKwkubWRfcmVnID0gMHgyYTMwLAorCS5tbiA9IHsKKwkJLm1uY3RyX2VuX2JpdCA9IDgsCisJCS5tbmN0cl9yZXNldF9iaXQgPSA3LAorCQkubW5jdHJfbW9kZV9zaGlmdCA9IDUsCisJCS5uX3ZhbF9zaGlmdCA9IDE2LAorCQkubV92YWxfc2hpZnQgPSAxNiwKKwkJLndpZHRoID0gMTYsCisJfSwKKwkucCA9IHsKKwkJLnByZV9kaXZfc2hpZnQgPSAzLAorCQkucHJlX2Rpdl93aWR0aCA9IDIsCisJfSwKKwkucyA9IHsKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAorCQkucGFyZW50X21hcCA9IGdjY19jeG9fcGxsOF9tYXAsCisJfSwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX2dzYmlfdWFydCwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJhMzQsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxMSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJnc2JpNF91YXJ0X3NyYyIsCisJCQkucGFyZW50X25hbWVzID0gZ2NjX2N4b19wbGw4LAorCQkJLm51bV9wYXJlbnRzID0gMiwKKwkJCS5vcHMgPSAmY2xrX3JjZ19vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1BBUkVOVF9HQVRFLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggZ3NiaTRfdWFydF9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmQwLAorCS5oYWx0X2JpdCA9IDI2LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmEzNCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3NiaTRfdWFydF9jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7CisJCQkJImdzYmk0X3VhcnRfc3JjIiwKKwkJCX0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZyBnc2JpNV91YXJ0X3NyYyA9IHsKKwkubnNfcmVnID0gMHgyYTU0LAorCS5tZF9yZWcgPSAweDJhNTAsCisJLm1uID0geworCQkubW5jdHJfZW5fYml0ID0gOCwKKwkJLm1uY3RyX3Jlc2V0X2JpdCA9IDcsCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwKKwkJLm5fdmFsX3NoaWZ0ID0gMTYsCisJCS5tX3ZhbF9zaGlmdCA9IDE2LAorCQkud2lkdGggPSAxNiwKKwl9LAorCS5wID0geworCQkucHJlX2Rpdl9zaGlmdCA9IDMsCisJCS5wcmVfZGl2X3dpZHRoID0gMiwKKwl9LAorCS5zID0geworCQkuc3JjX3NlbF9zaGlmdCA9IDAsCisJCS5wYXJlbnRfbWFwID0gZ2NjX2N4b19wbGw4X21hcCwKKwl9LAorCS5mcmVxX3RibCA9IGNsa190YmxfZ3NiaV91YXJ0LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmE1NCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDExKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdzYmk1X3VhcnRfc3JjIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBnY2NfY3hvX3BsbDgsCisJCQkubnVtX3BhcmVudHMgPSAyLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUEFSRU5UX0dBVEUsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBnc2JpNV91YXJ0X2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDJmZDAsCisJLmhhbHRfYml0ID0gMjIsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyYTU0LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoOSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJnc2JpNV91YXJ0X2NsayIsCisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsKKwkJCQkiZ3NiaTVfdWFydF9zcmMiLAorCQkJfSwKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBmcmVxX3RibCBjbGtfdGJsX2dzYmlfcXVwW10gPSB7CisJeyAgIDk2MDAwMCwgUF9DWE8sICA0LCAxLCAgNSB9LAorCXsgIDQ4MDAwMDAsIFBfQ1hPLCAgNCwgMCwgIDEgfSwKKwl7ICA5NjAwMDAwLCBQX0NYTywgIDIsIDAsICAxIH0sCisJeyAxNTA2MDAwMCwgUF9QTEw4LCAxLCAyLCA1MSB9LAorCXsgMjQwMDAwMDAsIFBfUExMOCwgNCwgMSwgIDQgfSwKKwl7IDI1NjAwMDAwLCBQX1BMTDgsIDEsIDEsIDE1IH0sCisJeyA0ODAwMDAwMCwgUF9QTEw4LCA0LCAxLCAgMiB9LAorCXsgNTEyMDAwMDAsIFBfUExMOCwgMSwgMiwgMTUgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZyBnc2JpMV9xdXBfc3JjID0geworCS5uc19yZWcgPSAweDI5Y2MsCisJLm1kX3JlZyA9IDB4MjljOCwKKwkubW4gPSB7CisJCS5tbmN0cl9lbl9iaXQgPSA4LAorCQkubW5jdHJfcmVzZXRfYml0ID0gNywKKwkJLm1uY3RyX21vZGVfc2hpZnQgPSA1LAorCQkubl92YWxfc2hpZnQgPSAxNiwKKwkJLm1fdmFsX3NoaWZ0ID0gMTYsCisJCS53aWR0aCA9IDgsCisJfSwKKwkucCA9IHsKKwkJLnByZV9kaXZfc2hpZnQgPSAzLAorCQkucHJlX2Rpdl93aWR0aCA9IDIsCisJfSwKKwkucyA9IHsKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAorCQkucGFyZW50X21hcCA9IGdjY19jeG9fcGxsOF9tYXAsCisJfSwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX2dzYmlfcXVwLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjljYywKKwkJLmVuYWJsZV9tYXNrID0gQklUKDExKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdzYmkxX3F1cF9zcmMiLAorCQkJLnBhcmVudF9uYW1lcyA9IGdjY19jeG9fcGxsOCwKKwkJCS5udW1fcGFyZW50cyA9IDIsCisJCQkub3BzID0gJmNsa19yY2dfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9QQVJFTlRfR0FURSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGdzYmkxX3F1cF9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmNjLAorCS5oYWx0X2JpdCA9IDksCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyOWNjLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoOSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJnc2JpMV9xdXBfY2xrIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAiZ3NiaTFfcXVwX3NyYyIgfSwKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmNnIGdzYmkyX3F1cF9zcmMgPSB7CisJLm5zX3JlZyA9IDB4MjllYywKKwkubWRfcmVnID0gMHgyOWU4LAorCS5tbiA9IHsKKwkJLm1uY3RyX2VuX2JpdCA9IDgsCisJCS5tbmN0cl9yZXNldF9iaXQgPSA3LAorCQkubW5jdHJfbW9kZV9zaGlmdCA9IDUsCisJCS5uX3ZhbF9zaGlmdCA9IDE2LAorCQkubV92YWxfc2hpZnQgPSAxNiwKKwkJLndpZHRoID0gOCwKKwl9LAorCS5wID0geworCQkucHJlX2Rpdl9zaGlmdCA9IDMsCisJCS5wcmVfZGl2X3dpZHRoID0gMiwKKwl9LAorCS5zID0geworCQkuc3JjX3NlbF9zaGlmdCA9IDAsCisJCS5wYXJlbnRfbWFwID0gZ2NjX2N4b19wbGw4X21hcCwKKwl9LAorCS5mcmVxX3RibCA9IGNsa190YmxfZ3NiaV9xdXAsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyOWVjLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMTEpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3NiaTJfcXVwX3NyYyIsCisJCQkucGFyZW50X25hbWVzID0gZ2NjX2N4b19wbGw4LAorCQkJLm51bV9wYXJlbnRzID0gMiwKKwkJCS5vcHMgPSAmY2xrX3JjZ19vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1BBUkVOVF9HQVRFLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggZ3NiaTJfcXVwX2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDJmY2MsCisJLmhhbHRfYml0ID0gNCwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDI5ZWMsCisJCS5lbmFibGVfbWFzayA9IEJJVCg5KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdzYmkyX3F1cF9jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJnc2JpMl9xdXBfc3JjIiB9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19yY2cgZ3NiaTNfcXVwX3NyYyA9IHsKKwkubnNfcmVnID0gMHgyYTBjLAorCS5tZF9yZWcgPSAweDJhMDgsCisJLm1uID0geworCQkubW5jdHJfZW5fYml0ID0gOCwKKwkJLm1uY3RyX3Jlc2V0X2JpdCA9IDcsCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwKKwkJLm5fdmFsX3NoaWZ0ID0gMTYsCisJCS5tX3ZhbF9zaGlmdCA9IDE2LAorCQkud2lkdGggPSA4LAorCX0sCisJLnAgPSB7CisJCS5wcmVfZGl2X3NoaWZ0ID0gMywKKwkJLnByZV9kaXZfd2lkdGggPSAyLAorCX0sCisJLnMgPSB7CisJCS5zcmNfc2VsX3NoaWZ0ID0gMCwKKwkJLnBhcmVudF9tYXAgPSBnY2NfY3hvX3BsbDhfbWFwLAorCX0sCisJLmZyZXFfdGJsID0gY2xrX3RibF9nc2JpX3F1cCwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJhMGMsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxMSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJnc2JpM19xdXBfc3JjIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBnY2NfY3hvX3BsbDgsCisJCQkubnVtX3BhcmVudHMgPSAyLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUEFSRU5UX0dBVEUsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBnc2JpM19xdXBfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZjYywKKwkuaGFsdF9iaXQgPSAwLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmEwYywKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3NiaTNfcXVwX2NsayIsCisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImdzYmkzX3F1cF9zcmMiIH0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZyBnc2JpNF9xdXBfc3JjID0geworCS5uc19yZWcgPSAweDJhMmMsCisJLm1kX3JlZyA9IDB4MmEyOCwKKwkubW4gPSB7CisJCS5tbmN0cl9lbl9iaXQgPSA4LAorCQkubW5jdHJfcmVzZXRfYml0ID0gNywKKwkJLm1uY3RyX21vZGVfc2hpZnQgPSA1LAorCQkubl92YWxfc2hpZnQgPSAxNiwKKwkJLm1fdmFsX3NoaWZ0ID0gMTYsCisJCS53aWR0aCA9IDgsCisJfSwKKwkucCA9IHsKKwkJLnByZV9kaXZfc2hpZnQgPSAzLAorCQkucHJlX2Rpdl93aWR0aCA9IDIsCisJfSwKKwkucyA9IHsKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAorCQkucGFyZW50X21hcCA9IGdjY19jeG9fcGxsOF9tYXAsCisJfSwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX2dzYmlfcXVwLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmEyYywKKwkJLmVuYWJsZV9tYXNrID0gQklUKDExKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdzYmk0X3F1cF9zcmMiLAorCQkJLnBhcmVudF9uYW1lcyA9IGdjY19jeG9fcGxsOCwKKwkJCS5udW1fcGFyZW50cyA9IDIsCisJCQkub3BzID0gJmNsa19yY2dfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9QQVJFTlRfR0FURSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGdzYmk0X3F1cF9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmQwLAorCS5oYWx0X2JpdCA9IDI0LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmEyYywKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3NiaTRfcXVwX2NsayIsCisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImdzYmk0X3F1cF9zcmMiIH0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZyBnc2JpNV9xdXBfc3JjID0geworCS5uc19yZWcgPSAweDJhNGMsCisJLm1kX3JlZyA9IDB4MmE0OCwKKwkubW4gPSB7CisJCS5tbmN0cl9lbl9iaXQgPSA4LAorCQkubW5jdHJfcmVzZXRfYml0ID0gNywKKwkJLm1uY3RyX21vZGVfc2hpZnQgPSA1LAorCQkubl92YWxfc2hpZnQgPSAxNiwKKwkJLm1fdmFsX3NoaWZ0ID0gMTYsCisJCS53aWR0aCA9IDgsCisJfSwKKwkucCA9IHsKKwkJLnByZV9kaXZfc2hpZnQgPSAzLAorCQkucHJlX2Rpdl93aWR0aCA9IDIsCisJfSwKKwkucyA9IHsKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAorCQkucGFyZW50X21hcCA9IGdjY19jeG9fcGxsOF9tYXAsCisJfSwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX2dzYmlfcXVwLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmE0YywKKwkJLmVuYWJsZV9tYXNrID0gQklUKDExKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdzYmk1X3F1cF9zcmMiLAorCQkJLnBhcmVudF9uYW1lcyA9IGdjY19jeG9fcGxsOCwKKwkJCS5udW1fcGFyZW50cyA9IDIsCisJCQkub3BzID0gJmNsa19yY2dfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9QQVJFTlRfR0FURSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGdzYmk1X3F1cF9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmQwLAorCS5oYWx0X2JpdCA9IDIwLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmE0YywKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3NiaTVfcXVwX2NsayIsCisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImdzYmk1X3F1cF9zcmMiIH0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnJlcV90YmwgY2xrX3RibF9ncFtdID0geworCXsgOTYwMDAwMCwgUF9DWE8sICAyLCAwLCAwIH0sCisJeyAxOTIwMDAwMCwgUF9DWE8sICAxLCAwLCAwIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsa19yY2cgZ3AwX3NyYyA9IHsKKwkubnNfcmVnID0gMHgyZDI0LAorCS5tZF9yZWcgPSAweDJkMDAsCisJLm1uID0geworCQkubW5jdHJfZW5fYml0ID0gOCwKKwkJLm1uY3RyX3Jlc2V0X2JpdCA9IDcsCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwKKwkJLm5fdmFsX3NoaWZ0ID0gMTYsCisJCS5tX3ZhbF9zaGlmdCA9IDE2LAorCQkud2lkdGggPSA4LAorCX0sCisJLnAgPSB7CisJCS5wcmVfZGl2X3NoaWZ0ID0gMywKKwkJLnByZV9kaXZfd2lkdGggPSAyLAorCX0sCisJLnMgPSB7CisJCS5zcmNfc2VsX3NoaWZ0ID0gMCwKKwkJLnBhcmVudF9tYXAgPSBnY2NfY3hvX21hcCwKKwl9LAorCS5mcmVxX3RibCA9IGNsa190YmxfZ3AsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyZDI0LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMTEpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3AwX3NyYyIsCisJCQkucGFyZW50X25hbWVzID0gZ2NjX2N4bywKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkub3BzID0gJmNsa19yY2dfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9QQVJFTlRfR0FURSwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggZ3AwX2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDJmZDgsCisJLmhhbHRfYml0ID0gNywKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJkMjQsCisJCS5lbmFibGVfbWFzayA9IEJJVCg5KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdwMF9jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJncDBfc3JjIiB9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19yY2cgZ3AxX3NyYyA9IHsKKwkubnNfcmVnID0gMHgyZDQ0LAorCS5tZF9yZWcgPSAweDJkNDAsCisJLm1uID0geworCQkubW5jdHJfZW5fYml0ID0gOCwKKwkJLm1uY3RyX3Jlc2V0X2JpdCA9IDcsCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwKKwkJLm5fdmFsX3NoaWZ0ID0gMTYsCisJCS5tX3ZhbF9zaGlmdCA9IDE2LAorCQkud2lkdGggPSA4LAorCX0sCisJLnAgPSB7CisJCS5wcmVfZGl2X3NoaWZ0ID0gMywKKwkJLnByZV9kaXZfd2lkdGggPSAyLAorCX0sCisJLnMgPSB7CisJCS5zcmNfc2VsX3NoaWZ0ID0gMCwKKwkJLnBhcmVudF9tYXAgPSBnY2NfY3hvX21hcCwKKwl9LAorCS5mcmVxX3RibCA9IGNsa190YmxfZ3AsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyZDQ0LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMTEpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3AxX3NyYyIsCisJCQkucGFyZW50X25hbWVzID0gZ2NjX2N4bywKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkub3BzID0gJmNsa19yY2dfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX0dBVEUsCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGdwMV9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmQ4LAorCS5oYWx0X2JpdCA9IDYsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyZDQ0LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoOSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJncDFfY2xrIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAiZ3AxX3NyYyIgfSwKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmNnIGdwMl9zcmMgPSB7CisJLm5zX3JlZyA9IDB4MmQ2NCwKKwkubWRfcmVnID0gMHgyZDYwLAorCS5tbiA9IHsKKwkJLm1uY3RyX2VuX2JpdCA9IDgsCisJCS5tbmN0cl9yZXNldF9iaXQgPSA3LAorCQkubW5jdHJfbW9kZV9zaGlmdCA9IDUsCisJCS5uX3ZhbF9zaGlmdCA9IDE2LAorCQkubV92YWxfc2hpZnQgPSAxNiwKKwkJLndpZHRoID0gOCwKKwl9LAorCS5wID0geworCQkucHJlX2Rpdl9zaGlmdCA9IDMsCisJCS5wcmVfZGl2X3dpZHRoID0gMiwKKwl9LAorCS5zID0geworCQkuc3JjX3NlbF9zaGlmdCA9IDAsCisJCS5wYXJlbnRfbWFwID0gZ2NjX2N4b19tYXAsCisJfSwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX2dwLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmQ2NCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDExKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdwMl9zcmMiLAorCQkJLnBhcmVudF9uYW1lcyA9IGdjY19jeG8sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9HQVRFLAorCQl9LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBncDJfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZkOCwKKwkuaGFsdF9iaXQgPSA1LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmQ2NCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3AyX2NsayIsCisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImdwMl9zcmMiIH0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBwbWVtX2NsayA9IHsKKwkuaHdjZ19yZWcgPSAweDI1YTAsCisJLmh3Y2dfYml0ID0gNiwKKwkuaGFsdF9yZWcgPSAweDJmYzgsCisJLmhhbHRfYml0ID0gMjAsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyNWEwLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoNCksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJwbWVtX2NsayIsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19yY2cgcHJuZ19zcmMgPSB7CisJLm5zX3JlZyA9IDB4MmU4MCwKKwkucCA9IHsKKwkJLnByZV9kaXZfc2hpZnQgPSAzLAorCQkucHJlX2Rpdl93aWR0aCA9IDQsCisJfSwKKwkucyA9IHsKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAorCQkucGFyZW50X21hcCA9IGdjY19jeG9fcGxsOF9tYXAsCisJfSwKKwkuY2xrciA9IHsKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gInBybmdfc3JjIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBnY2NfY3hvX3BsbDgsCisJCQkubnVtX3BhcmVudHMgPSAyLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIHBybmdfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZkOCwKKwkuaGFsdF9jaGVjayA9IEJSQU5DSF9IQUxUX1ZPVEVELAorCS5oYWx0X2JpdCA9IDEwLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MzA4MCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDEwKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gInBybmdfY2xrIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAicHJuZ19zcmMiIH0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmcmVxX3RibCBjbGtfdGJsX3NkY1tdID0geworCXsgICAgMTQ0MDAwLCBQX0NYTywgICAxLCAxLCAxMzMgfSwKKwl7ICAgIDQwMDAwMCwgUF9QTEw4LCAgNCwgMSwgMjQwIH0sCisJeyAgMTYwMDAwMDAsIFBfUExMOCwgIDQsIDEsICAgNiB9LAorCXsgIDE3MDcwMDAwLCBQX1BMTDgsICAxLCAyLCAgNDUgfSwKKwl7ICAyMDIxMDAwMCwgUF9QTEw4LCAgMSwgMSwgIDE5IH0sCisJeyAgMjQwMDAwMDAsIFBfUExMOCwgIDQsIDEsICAgNCB9LAorCXsgIDM4NDAwMDAwLCBQX1BMTDgsICAyLCAxLCAgIDUgfSwKKwl7ICA0ODAwMDAwMCwgUF9QTEw4LCAgNCwgMSwgICAyIH0sCisJeyAgNjQwMDAwMDAsIFBfUExMOCwgIDMsIDEsICAgMiB9LAorCXsgIDc2ODAwMDAwLCBQX1BMTDgsICAxLCAxLCAgIDUgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZyBzZGMxX3NyYyA9IHsKKwkubnNfcmVnID0gMHgyODJjLAorCS5tZF9yZWcgPSAweDI4MjgsCisJLm1uID0geworCQkubW5jdHJfZW5fYml0ID0gOCwKKwkJLm1uY3RyX3Jlc2V0X2JpdCA9IDcsCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwKKwkJLm5fdmFsX3NoaWZ0ID0gMTYsCisJCS5tX3ZhbF9zaGlmdCA9IDE2LAorCQkud2lkdGggPSA4LAorCX0sCisJLnAgPSB7CisJCS5wcmVfZGl2X3NoaWZ0ID0gMywKKwkJLnByZV9kaXZfd2lkdGggPSAyLAorCX0sCisJLnMgPSB7CisJCS5zcmNfc2VsX3NoaWZ0ID0gMCwKKwkJLnBhcmVudF9tYXAgPSBnY2NfY3hvX3BsbDhfbWFwLAorCX0sCisJLmZyZXFfdGJsID0gY2xrX3RibF9zZGMsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyODJjLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMTEpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAic2RjMV9zcmMiLAorCQkJLnBhcmVudF9uYW1lcyA9IGdjY19jeG9fcGxsOCwKKwkJCS5udW1fcGFyZW50cyA9IDIsCisJCQkub3BzID0gJmNsa19yY2dfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX0dBVEUsCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIHNkYzFfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZjOCwKKwkuaGFsdF9iaXQgPSA2LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjgyYywKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAic2RjMV9jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJzZGMxX3NyYyIgfSwKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmNnIHNkYzJfc3JjID0geworCS5uc19yZWcgPSAweDI4NGMsCisJLm1kX3JlZyA9IDB4Mjg0OCwKKwkubW4gPSB7CisJCS5tbmN0cl9lbl9iaXQgPSA4LAorCQkubW5jdHJfcmVzZXRfYml0ID0gNywKKwkJLm1uY3RyX21vZGVfc2hpZnQgPSA1LAorCQkubl92YWxfc2hpZnQgPSAxNiwKKwkJLm1fdmFsX3NoaWZ0ID0gMTYsCisJCS53aWR0aCA9IDgsCisJfSwKKwkucCA9IHsKKwkJLnByZV9kaXZfc2hpZnQgPSAzLAorCQkucHJlX2Rpdl93aWR0aCA9IDIsCisJfSwKKwkucyA9IHsKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAorCQkucGFyZW50X21hcCA9IGdjY19jeG9fcGxsOF9tYXAsCisJfSwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX3NkYywKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDI4NGMsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxMSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJzZGMyX3NyYyIsCisJCQkucGFyZW50X25hbWVzID0gZ2NjX2N4b19wbGw4LAorCQkJLm51bV9wYXJlbnRzID0gMiwKKwkJCS5vcHMgPSAmY2xrX3JjZ19vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfR0FURSwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggc2RjMl9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmM4LAorCS5oYWx0X2JpdCA9IDUsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyODRjLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoOSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJzZGMyX2NsayIsCisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgInNkYzJfc3JjIiB9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQl9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZyZXFfdGJsIGNsa190YmxfdXNiW10gPSB7CisJeyA2MDAwMDAwMCwgUF9QTEw4LCAxLCA1LCAzMiB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmNnIHVzYl9oczFfeGN2cl9zcmMgPSB7CisJLm5zX3JlZyA9IDB4MjkwYywKKwkubWRfcmVnID0gMHgyOTA4LAorCS5tbiA9IHsKKwkJLm1uY3RyX2VuX2JpdCA9IDgsCisJCS5tbmN0cl9yZXNldF9iaXQgPSA3LAorCQkubW5jdHJfbW9kZV9zaGlmdCA9IDUsCisJCS5uX3ZhbF9zaGlmdCA9IDE2LAorCQkubV92YWxfc2hpZnQgPSAxNiwKKwkJLndpZHRoID0gOCwKKwl9LAorCS5wID0geworCQkucHJlX2Rpdl9zaGlmdCA9IDMsCisJCS5wcmVfZGl2X3dpZHRoID0gMiwKKwl9LAorCS5zID0geworCQkuc3JjX3NlbF9zaGlmdCA9IDAsCisJCS5wYXJlbnRfbWFwID0gZ2NjX2N4b19wbGw4X21hcCwKKwl9LAorCS5mcmVxX3RibCA9IGNsa190YmxfdXNiLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjkwYywKKwkJLmVuYWJsZV9tYXNrID0gQklUKDExKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gInVzYl9oczFfeGN2cl9zcmMiLAorCQkJLnBhcmVudF9uYW1lcyA9IGdjY19jeG9fcGxsOCwKKwkJCS5udW1fcGFyZW50cyA9IDIsCisJCQkub3BzID0gJmNsa19yY2dfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX0dBVEUsCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIHVzYl9oczFfeGN2cl9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmM4LAorCS5oYWx0X2JpdCA9IDAsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyOTBjLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoOSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJ1c2JfaHMxX3hjdnJfY2xrIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAidXNiX2hzMV94Y3ZyX3NyYyIgfSwKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmNnIHVzYl9oc2ljX3hjdnJfZnNfc3JjID0geworCS5uc19yZWcgPSAweDI5MjgsCisJLm1kX3JlZyA9IDB4MjkyNCwKKwkubW4gPSB7CisJCS5tbmN0cl9lbl9iaXQgPSA4LAorCQkubW5jdHJfcmVzZXRfYml0ID0gNywKKwkJLm1uY3RyX21vZGVfc2hpZnQgPSA1LAorCQkubl92YWxfc2hpZnQgPSAxNiwKKwkJLm1fdmFsX3NoaWZ0ID0gMTYsCisJCS53aWR0aCA9IDgsCisJfSwKKwkucCA9IHsKKwkJLnByZV9kaXZfc2hpZnQgPSAzLAorCQkucHJlX2Rpdl93aWR0aCA9IDIsCisJfSwKKwkucyA9IHsKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAorCQkucGFyZW50X21hcCA9IGdjY19jeG9fcGxsOF9tYXAsCisJfSwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX3VzYiwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDI5MjgsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxMSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJ1c2JfaHNpY194Y3ZyX2ZzX3NyYyIsCisJCQkucGFyZW50X25hbWVzID0gZ2NjX2N4b19wbGw4LAorCQkJLm51bV9wYXJlbnRzID0gMiwKKwkJCS5vcHMgPSAmY2xrX3JjZ19vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfR0FURSwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggdXNiX2hzaWNfeGN2cl9mc19jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmM4LAorCS5oYWx0X2JpdCA9IDksCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyOTI4LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoOSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJ1c2JfaHNpY194Y3ZyX2ZzX2NsayIsCisJCQkucGFyZW50X25hbWVzID0KKwkJCQkoY29uc3QgY2hhciAqW10peyAidXNiX2hzaWNfeGN2cl9mc19zcmMiIH0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnJlcV90YmwgY2xrX3RibF91c2JfaHMxX3N5c3RlbVtdID0geworCXsgNjAwMDAwMDAsIFBfUExMOCwgMSwgNSwgMzIgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZyB1c2JfaHMxX3N5c3RlbV9zcmMgPSB7CisJLm5zX3JlZyA9IDB4MzZhNCwKKwkubWRfcmVnID0gMHgzNmEwLAorCS5tbiA9IHsKKwkJLm1uY3RyX2VuX2JpdCA9IDgsCisJCS5tbmN0cl9yZXNldF9iaXQgPSA3LAorCQkubW5jdHJfbW9kZV9zaGlmdCA9IDUsCisJCS5uX3ZhbF9zaGlmdCA9IDE2LAorCQkubV92YWxfc2hpZnQgPSAxNiwKKwkJLndpZHRoID0gOCwKKwl9LAorCS5wID0geworCQkucHJlX2Rpdl9zaGlmdCA9IDMsCisJCS5wcmVfZGl2X3dpZHRoID0gMiwKKwl9LAorCS5zID0geworCQkuc3JjX3NlbF9zaGlmdCA9IDAsCisJCS5wYXJlbnRfbWFwID0gZ2NjX2N4b19wbGw4X21hcCwKKwl9LAorCS5mcmVxX3RibCA9IGNsa190YmxfdXNiX2hzMV9zeXN0ZW0sCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgzNmE0LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMTEpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAidXNiX2hzMV9zeXN0ZW1fc3JjIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBnY2NfY3hvX3BsbDgsCisJCQkubnVtX3BhcmVudHMgPSAyLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9HQVRFLAorCQl9LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCB1c2JfaHMxX3N5c3RlbV9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmM4LAorCS5oYWx0X2JpdCA9IDQsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgzNmE0LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoOSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkucGFyZW50X25hbWVzID0KKwkJCQkoY29uc3QgY2hhciAqW10peyAidXNiX2hzMV9zeXN0ZW1fc3JjIiB9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5uYW1lID0gInVzYl9oczFfc3lzdGVtX2NsayIsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCB8IENMS19JR05PUkVfVU5VU0VELAorCQl9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZyZXFfdGJsIGNsa190YmxfdXNiX2hzaWNfc3lzdGVtW10gPSB7CisJeyA2NDAwMDAwMCwgUF9QTEw4LCAxLCAxLCA2IH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsa19yY2cgdXNiX2hzaWNfc3lzdGVtX3NyYyA9IHsKKwkubnNfcmVnID0gMHgyYjU4LAorCS5tZF9yZWcgPSAweDJiNTQsCisJLm1uID0geworCQkubW5jdHJfZW5fYml0ID0gOCwKKwkJLm1uY3RyX3Jlc2V0X2JpdCA9IDcsCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwKKwkJLm5fdmFsX3NoaWZ0ID0gMTYsCisJCS5tX3ZhbF9zaGlmdCA9IDE2LAorCQkud2lkdGggPSA4LAorCX0sCisJLnAgPSB7CisJCS5wcmVfZGl2X3NoaWZ0ID0gMywKKwkJLnByZV9kaXZfd2lkdGggPSAyLAorCX0sCisJLnMgPSB7CisJCS5zcmNfc2VsX3NoaWZ0ID0gMCwKKwkJLnBhcmVudF9tYXAgPSBnY2NfY3hvX3BsbDhfbWFwLAorCX0sCisJLmZyZXFfdGJsID0gY2xrX3RibF91c2JfaHNpY19zeXN0ZW0sCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyYjU4LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMTEpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAidXNiX2hzaWNfc3lzdGVtX3NyYyIsCisJCQkucGFyZW50X25hbWVzID0gZ2NjX2N4b19wbGw4LAorCQkJLm51bV9wYXJlbnRzID0gMiwKKwkJCS5vcHMgPSAmY2xrX3JjZ19vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfR0FURSwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggdXNiX2hzaWNfc3lzdGVtX2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDJmYzgsCisJLmhhbHRfYml0ID0gNywKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJiNTgsCisJCS5lbmFibGVfbWFzayA9IEJJVCg5KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5wYXJlbnRfbmFtZXMgPQorCQkJCShjb25zdCBjaGFyICpbXSl7ICJ1c2JfaHNpY19zeXN0ZW1fc3JjIiB9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5uYW1lID0gInVzYl9oc2ljX3N5c3RlbV9jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnJlcV90YmwgY2xrX3RibF91c2JfaHNpY19oc2ljW10gPSB7CisJeyA0ODAwMDAwMCwgUF9QTEwxNCwgMSwgMCwgMCB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmNnIHVzYl9oc2ljX2hzaWNfc3JjID0geworCS5uc19yZWcgPSAweDJiNTAsCisJLm1kX3JlZyA9IDB4MmI0YywKKwkubW4gPSB7CisJCS5tbmN0cl9lbl9iaXQgPSA4LAorCQkubW5jdHJfcmVzZXRfYml0ID0gNywKKwkJLm1uY3RyX21vZGVfc2hpZnQgPSA1LAorCQkubl92YWxfc2hpZnQgPSAxNiwKKwkJLm1fdmFsX3NoaWZ0ID0gMTYsCisJCS53aWR0aCA9IDgsCisJfSwKKwkucCA9IHsKKwkJLnByZV9kaXZfc2hpZnQgPSAzLAorCQkucHJlX2Rpdl93aWR0aCA9IDIsCisJfSwKKwkucyA9IHsKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAorCQkucGFyZW50X21hcCA9IGdjY19jeG9fcGxsMTRfbWFwLAorCX0sCisJLmZyZXFfdGJsID0gY2xrX3RibF91c2JfaHNpY19oc2ljLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmI1MCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDExKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gInVzYl9oc2ljX2hzaWNfc3JjIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBnY2NfY3hvX3BsbDE0LAorCQkJLm51bV9wYXJlbnRzID0gMiwKKwkJCS5vcHMgPSAmY2xrX3JjZ19vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfR0FURSwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggdXNiX2hzaWNfaHNpY19jbGsgPSB7CisJLmhhbHRfY2hlY2sgPSBCUkFOQ0hfSEFMVF9ERUxBWSwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJiNTAsCisJCS5lbmFibGVfbWFzayA9IEJJVCg5KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAidXNiX2hzaWNfaHNpY19zcmMiIH0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm5hbWUgPSAidXNiX2hzaWNfaHNpY19jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCB1c2JfaHNpY19oc2lvX2NhbF9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmM4LAorCS5oYWx0X2JpdCA9IDgsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyYjQ4LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMCksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImN4byIgfSwKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkubmFtZSA9ICJ1c2JfaHNpY19oc2lvX2NhbF9jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGNlMV9jb3JlX2NsayA9IHsKKwkuaHdjZ19yZWcgPSAweDI3MjQsCisJLmh3Y2dfYml0ID0gNiwKKwkuaGFsdF9yZWcgPSAweDJmZDQsCisJLmhhbHRfYml0ID0gMjcsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyNzI0LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoNCksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJjZTFfY29yZV9jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGNlMV9oX2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDJmZDQsCisJLmhhbHRfYml0ID0gMSwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDI3MjAsCisJCS5lbmFibGVfbWFzayA9IEJJVCg0KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImNlMV9oX2NsayIsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggZG1hX2JhbV9oX2NsayA9IHsKKwkuaHdjZ19yZWcgPSAweDI1YzAsCisJLmh3Y2dfYml0ID0gNiwKKwkuaGFsdF9yZWcgPSAweDJmYzgsCisJLmhhbHRfYml0ID0gMTIsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyNWMwLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoNCksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJkbWFfYmFtX2hfY2xrIiwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBnc2JpMV9oX2NsayA9IHsKKwkuaHdjZ19yZWcgPSAweDI5YzAsCisJLmh3Y2dfYml0ID0gNiwKKwkuaGFsdF9yZWcgPSAweDJmY2MsCisJLmhhbHRfYml0ID0gMTEsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyOWMwLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoNCksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJnc2JpMV9oX2NsayIsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggZ3NiaTJfaF9jbGsgPSB7CisJLmh3Y2dfcmVnID0gMHgyOWUwLAorCS5od2NnX2JpdCA9IDYsCisJLmhhbHRfcmVnID0gMHgyZmNjLAorCS5oYWx0X2JpdCA9IDcsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyOWUwLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoNCksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJnc2JpMl9oX2NsayIsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggZ3NiaTNfaF9jbGsgPSB7CisJLmh3Y2dfcmVnID0gMHgyYTAwLAorCS5od2NnX2JpdCA9IDYsCisJLmhhbHRfcmVnID0gMHgyZmNjLAorCS5oYWx0X2JpdCA9IDMsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyYTAwLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoNCksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJnc2JpM19oX2NsayIsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggZ3NiaTRfaF9jbGsgPSB7CisJLmh3Y2dfcmVnID0gMHgyYTIwLAorCS5od2NnX2JpdCA9IDYsCisJLmhhbHRfcmVnID0gMHgyZmQwLAorCS5oYWx0X2JpdCA9IDI3LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmEyMCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDQpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3NiaTRfaF9jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGdzYmk1X2hfY2xrID0geworCS5od2NnX3JlZyA9IDB4MmE0MCwKKwkuaHdjZ19iaXQgPSA2LAorCS5oYWx0X3JlZyA9IDB4MmZkMCwKKwkuaGFsdF9iaXQgPSAyMywKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJhNDAsCisJCS5lbmFibGVfbWFzayA9IEJJVCg0KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdzYmk1X2hfY2xrIiwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCB1c2JfaHMxX2hfY2xrID0geworCS5od2NnX3JlZyA9IDB4MjkwMCwKKwkuaHdjZ19iaXQgPSA2LAorCS5oYWx0X3JlZyA9IDB4MmZjOCwKKwkuaGFsdF9iaXQgPSAxLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjkwMCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDQpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAidXNiX2hzMV9oX2NsayIsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggdXNiX2hzaWNfaF9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmNjLAorCS5oYWx0X2JpdCA9IDI4LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjkyMCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDQpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAidXNiX2hzaWNfaF9jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIHNkYzFfaF9jbGsgPSB7CisJLmh3Y2dfcmVnID0gMHgyODIwLAorCS5od2NnX2JpdCA9IDYsCisJLmhhbHRfcmVnID0gMHgyZmM4LAorCS5oYWx0X2JpdCA9IDExLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjgyMCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDQpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAic2RjMV9oX2NsayIsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggc2RjMl9oX2NsayA9IHsKKwkuaHdjZ19yZWcgPSAweDI4NDAsCisJLmh3Y2dfYml0ID0gNiwKKwkuaGFsdF9yZWcgPSAweDJmYzgsCisJLmhhbHRfYml0ID0gMTAsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyODQwLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoNCksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJzZGMyX2hfY2xrIiwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBhZG0wX2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDJmZGMsCisJLmhhbHRfY2hlY2sgPSBCUkFOQ0hfSEFMVF9WT1RFRCwKKwkuaGFsdF9iaXQgPSAxNCwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDMwODAsCisJCS5lbmFibGVfbWFzayA9IEJJVCgyKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImFkbTBfY2xrIiwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBhZG0wX3BidXNfY2xrID0geworCS5od2NnX3JlZyA9IDB4MjIwOCwKKwkuaHdjZ19iaXQgPSA2LAorCS5oYWx0X3JlZyA9IDB4MmZkYywKKwkuaGFsdF9jaGVjayA9IEJSQU5DSF9IQUxUX1ZPVEVELAorCS5oYWx0X2JpdCA9IDEzLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MzA4MCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDMpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiYWRtMF9wYnVzX2NsayIsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggcG1pY19hcmIwX2hfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZkOCwKKwkuaGFsdF9jaGVjayA9IEJSQU5DSF9IQUxUX1ZPVEVELAorCS5oYWx0X2JpdCA9IDIyLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MzA4MCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDgpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAicG1pY19hcmIwX2hfY2xrIiwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBwbWljX2FyYjFfaF9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmQ4LAorCS5oYWx0X2NoZWNrID0gQlJBTkNIX0hBTFRfVk9URUQsCisJLmhhbHRfYml0ID0gMjEsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgzMDgwLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoOSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJwbWljX2FyYjFfaF9jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIHBtaWNfc3NiaTJfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZkOCwKKwkuaGFsdF9jaGVjayA9IEJSQU5DSF9IQUxUX1ZPVEVELAorCS5oYWx0X2JpdCA9IDIzLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MzA4MCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDcpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAicG1pY19zc2JpMl9jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIHJwbV9tc2dfcmFtX2hfY2xrID0geworCS5od2NnX3JlZyA9IDB4MjdlMCwKKwkuaHdjZ19iaXQgPSA2LAorCS5oYWx0X3JlZyA9IDB4MmZkOCwKKwkuaGFsdF9jaGVjayA9IEJSQU5DSF9IQUxUX1ZPVEVELAorCS5oYWx0X2JpdCA9IDEyLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MzA4MCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDYpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAicnBtX21zZ19yYW1faF9jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfaHcgKmdjY19tZG05NjE1X2h3c1tdID0geworCSZjeG8uaHcsCit9OworCitzdGF0aWMgc3RydWN0IGNsa19yZWdtYXAgKmdjY19tZG05NjE1X2Nsa3NbXSA9IHsKKwlbUExMMF0gPSAmcGxsMC5jbGtyLAorCVtQTEwwX1ZPVEVdID0gJnBsbDBfdm90ZSwKKwlbUExMNF9WT1RFXSA9ICZwbGw0X3ZvdGUsCisJW1BMTDhdID0gJnBsbDguY2xrciwKKwlbUExMOF9WT1RFXSA9ICZwbGw4X3ZvdGUsCisJW1BMTDE0XSA9ICZwbGwxNC5jbGtyLAorCVtQTEwxNF9WT1RFXSA9ICZwbGwxNF92b3RlLAorCVtHU0JJMV9VQVJUX1NSQ10gPSAmZ3NiaTFfdWFydF9zcmMuY2xrciwKKwlbR1NCSTFfVUFSVF9DTEtdID0gJmdzYmkxX3VhcnRfY2xrLmNsa3IsCisJW0dTQkkyX1VBUlRfU1JDXSA9ICZnc2JpMl91YXJ0X3NyYy5jbGtyLAorCVtHU0JJMl9VQVJUX0NMS10gPSAmZ3NiaTJfdWFydF9jbGsuY2xrciwKKwlbR1NCSTNfVUFSVF9TUkNdID0gJmdzYmkzX3VhcnRfc3JjLmNsa3IsCisJW0dTQkkzX1VBUlRfQ0xLXSA9ICZnc2JpM191YXJ0X2Nsay5jbGtyLAorCVtHU0JJNF9VQVJUX1NSQ10gPSAmZ3NiaTRfdWFydF9zcmMuY2xrciwKKwlbR1NCSTRfVUFSVF9DTEtdID0gJmdzYmk0X3VhcnRfY2xrLmNsa3IsCisJW0dTQkk1X1VBUlRfU1JDXSA9ICZnc2JpNV91YXJ0X3NyYy5jbGtyLAorCVtHU0JJNV9VQVJUX0NMS10gPSAmZ3NiaTVfdWFydF9jbGsuY2xrciwKKwlbR1NCSTFfUVVQX1NSQ10gPSAmZ3NiaTFfcXVwX3NyYy5jbGtyLAorCVtHU0JJMV9RVVBfQ0xLXSA9ICZnc2JpMV9xdXBfY2xrLmNsa3IsCisJW0dTQkkyX1FVUF9TUkNdID0gJmdzYmkyX3F1cF9zcmMuY2xrciwKKwlbR1NCSTJfUVVQX0NMS10gPSAmZ3NiaTJfcXVwX2Nsay5jbGtyLAorCVtHU0JJM19RVVBfU1JDXSA9ICZnc2JpM19xdXBfc3JjLmNsa3IsCisJW0dTQkkzX1FVUF9DTEtdID0gJmdzYmkzX3F1cF9jbGsuY2xrciwKKwlbR1NCSTRfUVVQX1NSQ10gPSAmZ3NiaTRfcXVwX3NyYy5jbGtyLAorCVtHU0JJNF9RVVBfQ0xLXSA9ICZnc2JpNF9xdXBfY2xrLmNsa3IsCisJW0dTQkk1X1FVUF9TUkNdID0gJmdzYmk1X3F1cF9zcmMuY2xrciwKKwlbR1NCSTVfUVVQX0NMS10gPSAmZ3NiaTVfcXVwX2Nsay5jbGtyLAorCVtHUDBfU1JDXSA9ICZncDBfc3JjLmNsa3IsCisJW0dQMF9DTEtdID0gJmdwMF9jbGsuY2xrciwKKwlbR1AxX1NSQ10gPSAmZ3AxX3NyYy5jbGtyLAorCVtHUDFfQ0xLXSA9ICZncDFfY2xrLmNsa3IsCisJW0dQMl9TUkNdID0gJmdwMl9zcmMuY2xrciwKKwlbR1AyX0NMS10gPSAmZ3AyX2Nsay5jbGtyLAorCVtQTUVNX0FfQ0xLXSA9ICZwbWVtX2Nsay5jbGtyLAorCVtQUk5HX1NSQ10gPSAmcHJuZ19zcmMuY2xrciwKKwlbUFJOR19DTEtdID0gJnBybmdfY2xrLmNsa3IsCisJW1NEQzFfU1JDXSA9ICZzZGMxX3NyYy5jbGtyLAorCVtTREMxX0NMS10gPSAmc2RjMV9jbGsuY2xrciwKKwlbU0RDMl9TUkNdID0gJnNkYzJfc3JjLmNsa3IsCisJW1NEQzJfQ0xLXSA9ICZzZGMyX2Nsay5jbGtyLAorCVtVU0JfSFMxX1hDVlJfU1JDXSA9ICZ1c2JfaHMxX3hjdnJfc3JjLmNsa3IsCisJW1VTQl9IUzFfWENWUl9DTEtdID0gJnVzYl9oczFfeGN2cl9jbGsuY2xrciwKKwlbVVNCX0hTMV9TWVNURU1fQ0xLX1NSQ10gPSAmdXNiX2hzMV9zeXN0ZW1fc3JjLmNsa3IsCisJW1VTQl9IUzFfU1lTVEVNX0NMS10gPSAmdXNiX2hzMV9zeXN0ZW1fY2xrLmNsa3IsCisJW1VTQl9IU0lDX1hDVlJfRlNfU1JDXSA9ICZ1c2JfaHNpY194Y3ZyX2ZzX3NyYy5jbGtyLAorCVtVU0JfSFNJQ19YQ1ZSX0ZTX0NMS10gPSAmdXNiX2hzaWNfeGN2cl9mc19jbGsuY2xrciwKKwlbVVNCX0hTSUNfU1lTVEVNX0NMS19TUkNdID0gJnVzYl9oc2ljX3N5c3RlbV9zcmMuY2xrciwKKwlbVVNCX0hTSUNfU1lTVEVNX0NMS10gPSAmdXNiX2hzaWNfc3lzdGVtX2Nsay5jbGtyLAorCVtVU0JfSFNJQ19IU0lDX0NMS19TUkNdID0gJnVzYl9oc2ljX2hzaWNfc3JjLmNsa3IsCisJW1VTQl9IU0lDX0hTSUNfQ0xLXSA9ICZ1c2JfaHNpY19oc2ljX2Nsay5jbGtyLAorCVtVU0JfSFNJQ19IU0lPX0NBTF9DTEtdID0gJnVzYl9oc2ljX2hzaW9fY2FsX2Nsay5jbGtyLAorCVtDRTFfQ09SRV9DTEtdID0gJmNlMV9jb3JlX2Nsay5jbGtyLAorCVtDRTFfSF9DTEtdID0gJmNlMV9oX2Nsay5jbGtyLAorCVtETUFfQkFNX0hfQ0xLXSA9ICZkbWFfYmFtX2hfY2xrLmNsa3IsCisJW0dTQkkxX0hfQ0xLXSA9ICZnc2JpMV9oX2Nsay5jbGtyLAorCVtHU0JJMl9IX0NMS10gPSAmZ3NiaTJfaF9jbGsuY2xrciwKKwlbR1NCSTNfSF9DTEtdID0gJmdzYmkzX2hfY2xrLmNsa3IsCisJW0dTQkk0X0hfQ0xLXSA9ICZnc2JpNF9oX2Nsay5jbGtyLAorCVtHU0JJNV9IX0NMS10gPSAmZ3NiaTVfaF9jbGsuY2xrciwKKwlbVVNCX0hTMV9IX0NMS10gPSAmdXNiX2hzMV9oX2Nsay5jbGtyLAorCVtVU0JfSFNJQ19IX0NMS10gPSAmdXNiX2hzaWNfaF9jbGsuY2xrciwKKwlbU0RDMV9IX0NMS10gPSAmc2RjMV9oX2Nsay5jbGtyLAorCVtTREMyX0hfQ0xLXSA9ICZzZGMyX2hfY2xrLmNsa3IsCisJW0FETTBfQ0xLXSA9ICZhZG0wX2Nsay5jbGtyLAorCVtBRE0wX1BCVVNfQ0xLXSA9ICZhZG0wX3BidXNfY2xrLmNsa3IsCisJW1BNSUNfQVJCMF9IX0NMS10gPSAmcG1pY19hcmIwX2hfY2xrLmNsa3IsCisJW1BNSUNfQVJCMV9IX0NMS10gPSAmcG1pY19hcmIxX2hfY2xrLmNsa3IsCisJW1BNSUNfU1NCSTJfQ0xLXSA9ICZwbWljX3NzYmkyX2Nsay5jbGtyLAorCVtSUE1fTVNHX1JBTV9IX0NMS10gPSAmcnBtX21zZ19yYW1faF9jbGsuY2xrciwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcWNvbV9yZXNldF9tYXAgZ2NjX21kbTk2MTVfcmVzZXRzW10gPSB7CisJW0RNQV9CQU1fUkVTRVRdID0geyAweDI1YzAsIDcgfSwKKwlbQ0UxX0hfUkVTRVRdID0geyAweDI3MjAsIDcgfSwKKwlbQ0UxX0NPUkVfUkVTRVRdID0geyAweDI3MjQsIDcgfSwKKwlbU0RDMV9SRVNFVF0gPSB7IDB4MjgzMCB9LAorCVtTREMyX1JFU0VUXSA9IHsgMHgyODUwIH0sCisJW0FETTBfQzJfUkVTRVRdID0geyAweDIyMGMsIDQgfSwKKwlbQURNMF9DMV9SRVNFVF0gPSB7IDB4MjIwYywgMyB9LAorCVtBRE0wX0MwX1JFU0VUXSA9IHsgMHgyMjBjLCAyIH0sCisJW0FETTBfUEJVU19SRVNFVF0gPSB7IDB4MjIwYywgMSB9LAorCVtBRE0wX1JFU0VUXSA9IHsgMHgyMjBjIH0sCisJW1VTQl9IUzFfUkVTRVRdID0geyAweDI5MTAgfSwKKwlbVVNCX0hTSUNfUkVTRVRdID0geyAweDI5MzQgfSwKKwlbR1NCSTFfUkVTRVRdID0geyAweDI5ZGMgfSwKKwlbR1NCSTJfUkVTRVRdID0geyAweDI5ZmMgfSwKKwlbR1NCSTNfUkVTRVRdID0geyAweDJhMWMgfSwKKwlbR1NCSTRfUkVTRVRdID0geyAweDJhM2MgfSwKKwlbR1NCSTVfUkVTRVRdID0geyAweDJhNWMgfSwKKwlbUERNX1JFU0VUXSA9IHsgMHgyQ0MwLCAxMiB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGdjY19tZG05NjE1X3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzCT0gMzIsCisJLnJlZ19zdHJpZGUJPSA0LAorCS52YWxfYml0cwk9IDMyLAorCS5tYXhfcmVnaXN0ZXIJPSAweDM2NjAsCisJLmZhc3RfaW8JPSB0cnVlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBxY29tX2NjX2Rlc2MgZ2NjX21kbTk2MTVfZGVzYyA9IHsKKwkuY29uZmlnID0gJmdjY19tZG05NjE1X3JlZ21hcF9jb25maWcsCisJLmNsa3MgPSBnY2NfbWRtOTYxNV9jbGtzLAorCS5udW1fY2xrcyA9IEFSUkFZX1NJWkUoZ2NjX21kbTk2MTVfY2xrcyksCisJLnJlc2V0cyA9IGdjY19tZG05NjE1X3Jlc2V0cywKKwkubnVtX3Jlc2V0cyA9IEFSUkFZX1NJWkUoZ2NjX21kbTk2MTVfcmVzZXRzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGdjY19tZG05NjE1X21hdGNoX3RhYmxlW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY29tLGdjYy1tZG05NjE1IiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGdjY19tZG05NjE1X21hdGNoX3RhYmxlKTsKKworc3RhdGljIGludCBnY2NfbWRtOTYxNV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCWludCByZXQ7CisJaW50IGk7CisKKwlyZWdtYXAgPSBxY29tX2NjX21hcChwZGV2LCAmZ2NjX21kbTk2MTVfZGVzYyk7CisJaWYgKElTX0VSUihyZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ2NjX21kbTk2MTVfaHdzKTsgaSsrKSB7CisJCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGRldiwgZ2NjX21kbTk2MTVfaHdzW2ldKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHFjb21fY2NfcmVhbGx5X3Byb2JlKHBkZXYsICZnY2NfbWRtOTYxNV9kZXNjLCByZWdtYXApOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBnY2NfbWRtOTYxNV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGdjY19tZG05NjE1X3Byb2JlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJnY2MtbWRtOTYxNSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGdjY19tZG05NjE1X21hdGNoX3RhYmxlLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBnY2NfbWRtOTYxNV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZ2NjX21kbTk2MTVfZHJpdmVyKTsKK30KK2NvcmVfaW5pdGNhbGwoZ2NjX21kbTk2MTVfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBnY2NfbWRtOTYxNV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmdjY19tZG05NjE1X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChnY2NfbWRtOTYxNV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJRQ09NIEdDQyBNRE05NjE1IERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpnY2MtbWRtOTYxNSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcWNvbS9nY2MtbXNtODk5Ni5jIGIvZHJpdmVycy9jbGsvcWNvbS9nY2MtbXNtODk5Ni5jCmluZGV4IGJiZjczMmIuLmZlMDNlNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3Fjb20vZ2NjLW1zbTg5OTYuYworKysgYi9kcml2ZXJzL2Nsay9xY29tL2djYy1tc204OTk2LmMKQEAgLTI1OTIsOSArMjU5Miw5IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggZ2NjX3BjaWVfMl9waXBlX2NsayA9IHsKLQkuaGFsdF9yZWcgPSAweDZlMTA4LAorCS5oYWx0X3JlZyA9IDB4NmUwMTgsCiAJLmNsa3IgPSB7Ci0JCS5lbmFibGVfcmVnID0gMHg2ZTEwOCwKKwkJLmVuYWJsZV9yZWcgPSAweDZlMDE4LAogCQkuZW5hYmxlX21hc2sgPSBCSVQoMCksCiAJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CiAJCQkubmFtZSA9ICJnY2NfcGNpZV8yX3BpcGVfY2xrIiwKQEAgLTMzMjksNiArMzMyOSw4IEBACiAJW0dDQ19VU0JfMjBfQkNSXSA9IHsgMHgxMjAwMCB9LAogCVtHQ0NfUVVTQjJQSFlfUFJJTV9CQ1JdID0geyAweDEyMDM4IH0sCiAJW0dDQ19RVVNCMlBIWV9TRUNfQkNSXSA9IHsgMHgxMjAzYyB9LAorCVtHQ0NfVVNCM19QSFlfQkNSXSA9IHsgMHg1MDAyMCB9LAorCVtHQ0NfVVNCM1BIWV9QSFlfQkNSXSA9IHsgMHg1MDAyNCB9LAogCVtHQ0NfVVNCX1BIWV9DRkdfQUhCMlBIWV9CQ1JdID0geyAweDZhMDAwIH0sCiAJW0dDQ19TRENDMV9CQ1JdID0geyAweDEzMDAwIH0sCiAJW0dDQ19TRENDMl9CQ1JdID0geyAweDE0MDAwIH0sCkBAIC0zNDA0LDYgKzM0MDYsOCBAQAogCVtHQ0NfUENJRV8yX0JDUl0gPSB7IDB4NmUwMDAgfSwKIAlbR0NDX1BDSUVfMl9QSFlfQkNSXSA9IHsgMHg2ZTAzOCB9LAogCVtHQ0NfUENJRV9QSFlfQkNSXSA9IHsgMHg2ZjAwMCB9LAorCVtHQ0NfUENJRV9QSFlfQ09NX0JDUl0gPSB7IDB4NmYwMTQgfSwKKwlbR0NDX1BDSUVfUEhZX0NPTV9OT0NTUl9CQ1JdID0geyAweDZmMDBjIH0sCiAJW0dDQ19EQ0RfQkNSXSA9IHsgMHg3MDAwMCB9LAogCVtHQ0NfT0JUX09EVF9CQ1JdID0geyAweDczMDAwIH0sCiAJW0dDQ19VRlNfQkNSXSA9IHsgMHg3NTAwMCB9LApAQCAtMzQ0Nyw5ICszNDUxLDggQEAKIAogc3RhdGljIGludCBnY2NfbXNtODk5Nl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBjbGsgKmNsazsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCWludCBpOworCWludCBpLCByZXQ7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCiAJcmVnbWFwID0gcWNvbV9jY19tYXAocGRldiwgJmdjY19tc204OTk2X2Rlc2MpOwpAQCAtMzQ2Myw5ICszNDY2LDkgQEAKIAlyZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCAweDUyMDA4LCBCSVQoMjEpLCBCSVQoMjEpKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdjY19tc204OTk2X2h3cyk7IGkrKykgewotCQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcihkZXYsIGdjY19tc204OTk2X2h3c1tpXSk7Ci0JCWlmIChJU19FUlIoY2xrKSkKLQkJCXJldHVybiBQVFJfRVJSKGNsayk7CisJCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGRldiwgZ2NjX21zbTg5OTZfaHdzW2ldKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0dXJuIHFjb21fY2NfcmVhbGx5X3Byb2JlKHBkZXYsICZnY2NfbXNtODk5Nl9kZXNjLCByZWdtYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcWNvbS9sY2MtbWRtOTYxNS5jIGIvZHJpdmVycy9jbGsvcWNvbS9sY2MtbWRtOTYxNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMzdlZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9xY29tL2xjYy1tZG05NjE1LmMKQEAgLTAsMCArMSw1ODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSBCYXlMaWJyZSwgU0FTLgorICogQXV0aG9yIDogTmVpbCBBcm1zdHJvbmcgPG5hcm1zdHJvbmdAYmF5bGlicmUuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGxjYy1tZG05NjE1Lmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJjbGstcmVnbWFwLmgiCisjaW5jbHVkZSAiY2xrLXBsbC5oIgorI2luY2x1ZGUgImNsay1yY2cuaCIKKyNpbmNsdWRlICJjbGstYnJhbmNoLmgiCisjaW5jbHVkZSAiY2xrLXJlZ21hcC1kaXZpZGVyLmgiCisjaW5jbHVkZSAiY2xrLXJlZ21hcC1tdXguaCIKKworc3RhdGljIHN0cnVjdCBjbGtfcGxsIHBsbDQgPSB7CisJLmxfcmVnID0gMHg0LAorCS5tX3JlZyA9IDB4OCwKKwkubl9yZWcgPSAweGMsCisJLmNvbmZpZ19yZWcgPSAweDE0LAorCS5tb2RlX3JlZyA9IDB4MCwKKwkuc3RhdHVzX3JlZyA9IDB4MTgsCisJLnN0YXR1c19iaXQgPSAxNiwKKwkuY2xrci5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gInBsbDQiLAorCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImN4byIgfSwKKwkJLm51bV9wYXJlbnRzID0gMSwKKwkJLm9wcyA9ICZjbGtfcGxsX29wcywKKwl9LAorfTsKKworZW51bSB7CisJUF9DWE8sCisJUF9QTEw0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwYXJlbnRfbWFwIGxjY19jeG9fcGxsNF9tYXBbXSA9IHsKKwl7IFBfQ1hPLCAwIH0sCisJeyBQX1BMTDQsIDIgfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsY2NfY3hvX3BsbDRbXSA9IHsKKwkiY3hvIiwKKwkicGxsNF92b3RlIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZnJlcV90YmwgY2xrX3RibF9haWZfb3NyXzQ5MltdID0geworCXsgICA1MTIwMDAsIFBfUExMNCwgNCwgMSwgMjQwIH0sCisJeyAgIDc2ODAwMCwgUF9QTEw0LCA0LCAxLCAxNjAgfSwKKwl7ICAxMDI0MDAwLCBQX1BMTDQsIDQsIDEsIDEyMCB9LAorCXsgIDE1MzYwMDAsIFBfUExMNCwgNCwgMSwgIDgwIH0sCisJeyAgMjA0ODAwMCwgUF9QTEw0LCA0LCAxLCAgNjAgfSwKKwl7ICAzMDcyMDAwLCBQX1BMTDQsIDQsIDEsICA0MCB9LAorCXsgIDQwOTYwMDAsIFBfUExMNCwgNCwgMSwgIDMwIH0sCisJeyAgNjE0NDAwMCwgUF9QTEw0LCA0LCAxLCAgMjAgfSwKKwl7ICA4MTkyMDAwLCBQX1BMTDQsIDQsIDEsICAxNSB9LAorCXsgMTIyODgwMDAsIFBfUExMNCwgNCwgMSwgIDEwIH0sCisJeyAyNDU3NjAwMCwgUF9QTEw0LCA0LCAxLCAgIDUgfSwKKwl7IDI3MDAwMDAwLCBQX0NYTywgIDEsIDAsICAgMCB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBmcmVxX3RibCBjbGtfdGJsX2FpZl9vc3JfMzkzW10gPSB7CisJeyAgIDUxMjAwMCwgUF9QTEw0LCA0LCAxLCAxOTIgfSwKKwl7ICAgNzY4MDAwLCBQX1BMTDQsIDQsIDEsIDEyOCB9LAorCXsgIDEwMjQwMDAsIFBfUExMNCwgNCwgMSwgIDk2IH0sCisJeyAgMTUzNjAwMCwgUF9QTEw0LCA0LCAxLCAgNjQgfSwKKwl7ICAyMDQ4MDAwLCBQX1BMTDQsIDQsIDEsICA0OCB9LAorCXsgIDMwNzIwMDAsIFBfUExMNCwgNCwgMSwgIDMyIH0sCisJeyAgNDA5NjAwMCwgUF9QTEw0LCA0LCAxLCAgMjQgfSwKKwl7ICA2MTQ0MDAwLCBQX1BMTDQsIDQsIDEsICAxNiB9LAorCXsgIDgxOTIwMDAsIFBfUExMNCwgNCwgMSwgIDEyIH0sCisJeyAxMjI4ODAwMCwgUF9QTEw0LCA0LCAxLCAgIDggfSwKKwl7IDI0NTc2MDAwLCBQX1BMTDQsIDQsIDEsICAgNCB9LAorCXsgMjcwMDAwMDAsIFBfQ1hPLCAgMSwgMCwgICAwIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsa19yY2cgbWkyc19vc3Jfc3JjID0geworCS5uc19yZWcgPSAweDQ4LAorCS5tZF9yZWcgPSAweDRjLAorCS5tbiA9IHsKKwkJLm1uY3RyX2VuX2JpdCA9IDgsCisJCS5tbmN0cl9yZXNldF9iaXQgPSA3LAorCQkubW5jdHJfbW9kZV9zaGlmdCA9IDUsCisJCS5uX3ZhbF9zaGlmdCA9IDI0LAorCQkubV92YWxfc2hpZnQgPSA4LAorCQkud2lkdGggPSA4LAorCX0sCisJLnAgPSB7CisJCS5wcmVfZGl2X3NoaWZ0ID0gMywKKwkJLnByZV9kaXZfd2lkdGggPSAyLAorCX0sCisJLnMgPSB7CisJCS5zcmNfc2VsX3NoaWZ0ID0gMCwKKwkJLnBhcmVudF9tYXAgPSBsY2NfY3hvX3BsbDRfbWFwLAorCX0sCisJLmZyZXFfdGJsID0gY2xrX3RibF9haWZfb3NyXzM5MywKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDQ4LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoOSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJtaTJzX29zcl9zcmMiLAorCQkJLnBhcmVudF9uYW1lcyA9IGxjY19jeG9fcGxsNCwKKwkJCS5udW1fcGFyZW50cyA9IDIsCisJCQkub3BzID0gJmNsa19yY2dfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX0dBVEUsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGNjX21pMnNfcGFyZW50c1tdID0geworCSJtaTJzX29zcl9zcmMiLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIG1pMnNfb3NyX2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDUwLAorCS5oYWx0X2JpdCA9IDEsCisJLmhhbHRfY2hlY2sgPSBCUkFOQ0hfSEFMVF9FTkFCTEUsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHg0OCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDE3KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gIm1pMnNfb3NyX2NsayIsCisJCQkucGFyZW50X25hbWVzID0gbGNjX21pMnNfcGFyZW50cywKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmVnbWFwX2RpdiBtaTJzX2Rpdl9jbGsgPSB7CisJLnJlZyA9IDB4NDgsCisJLnNoaWZ0ID0gMTAsCisJLndpZHRoID0gNCwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDQ4LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMTUpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAibWkyc19kaXZfY2xrIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBsY2NfbWkyc19wYXJlbnRzLAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5vcHMgPSAmY2xrX3JlZ21hcF9kaXZfb3BzLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggbWkyc19iaXRfZGl2X2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDUwLAorCS5oYWx0X2JpdCA9IDAsCisJLmhhbHRfY2hlY2sgPSBCUkFOQ0hfSEFMVF9FTkFCTEUsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHg0OCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDE1KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gIm1pMnNfYml0X2Rpdl9jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJtaTJzX2Rpdl9jbGsiIH0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JlZ21hcF9tdXggbWkyc19iaXRfY2xrID0geworCS5yZWcgPSAweDQ4LAorCS5zaGlmdCA9IDE0LAorCS53aWR0aCA9IDEsCisJLmNsa3IgPSB7CisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJtaTJzX2JpdF9jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7CisJCQkJIm1pMnNfYml0X2Rpdl9jbGsiLAorCQkJCSJtaTJzX2NvZGVjX2NsayIsCisJCQl9LAorCQkJLm51bV9wYXJlbnRzID0gMiwKKwkJCS5vcHMgPSAmY2xrX3JlZ21hcF9tdXhfY2xvc2VzdF9vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQl9LAorCX0sCit9OworCisjZGVmaW5lIENMS19BSUZfT1NSX0RJVihwcmVmaXgsIF9ucywgX21kLCBocikJCQlcCitzdGF0aWMgc3RydWN0IGNsa19yY2cgcHJlZml4IyNfb3NyX3NyYyA9IHsJCQlcCisJLm5zX3JlZyA9IF9ucywJCQkJCQlcCisJLm1kX3JlZyA9IF9tZCwJCQkJCQlcCisJLm1uID0gewkJCQkJCQlcCisJCS5tbmN0cl9lbl9iaXQgPSA4LAkJCQlcCisJCS5tbmN0cl9yZXNldF9iaXQgPSA3LAkJCQlcCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwJCQkJXAorCQkubl92YWxfc2hpZnQgPSAyNCwJCQkJXAorCQkubV92YWxfc2hpZnQgPSA4LAkJCQlcCisJCS53aWR0aCA9IDgsCQkJCQlcCisJfSwJCQkJCQkJXAorCS5wID0gewkJCQkJCQlcCisJCS5wcmVfZGl2X3NoaWZ0ID0gMywJCQkJXAorCQkucHJlX2Rpdl93aWR0aCA9IDIsCQkJCVwKKwl9LAkJCQkJCQlcCisJLnMgPSB7CQkJCQkJCVwKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAkJCQlcCisJCS5wYXJlbnRfbWFwID0gbGNjX2N4b19wbGw0X21hcCwJCQlcCisJfSwJCQkJCQkJXAorCS5mcmVxX3RibCA9IGNsa190YmxfYWlmX29zcl8zOTMsCQkJXAorCS5jbGtyID0gewkJCQkJCVwKKwkJLmVuYWJsZV9yZWcgPSBfbnMsCQkJCVwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAkJCQlcCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CQlcCisJCQkubmFtZSA9ICNwcmVmaXggIl9vc3Jfc3JjIiwJCVwKKwkJCS5wYXJlbnRfbmFtZXMgPSBsY2NfY3hvX3BsbDQsCQlcCisJCQkubnVtX3BhcmVudHMgPSAyLAkJCVwKKwkJCS5vcHMgPSAmY2xrX3JjZ19vcHMsCQkJXAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX0dBVEUsCQlcCisJCX0sCQkJCQkJXAorCX0sCQkJCQkJCVwKK307CQkJCQkJCQlcCisJCQkJCQkJCVwKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGNjXyMjcHJlZml4IyNfcGFyZW50c1tdID0gewkJXAorCSNwcmVmaXggIl9vc3Jfc3JjIiwJCQkJCVwKK307CQkJCQkJCQlcCisJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBwcmVmaXgjI19vc3JfY2xrID0gewkJCVwKKwkuaGFsdF9yZWcgPSBociwJCQkJCQlcCisJLmhhbHRfYml0ID0gMSwJCQkJCQlcCisJLmhhbHRfY2hlY2sgPSBCUkFOQ0hfSEFMVF9FTkFCTEUsCQkJXAorCS5jbGtyID0gewkJCQkJCVwKKwkJLmVuYWJsZV9yZWcgPSBfbnMsCQkJCVwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDIxKSwJCQkJXAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpewkJXAorCQkJLm5hbWUgPSAjcHJlZml4ICJfb3NyX2NsayIsCQlcCisJCQkucGFyZW50X25hbWVzID0gbGNjXyMjcHJlZml4IyNfcGFyZW50cywJXAorCQkJLm51bV9wYXJlbnRzID0gMSwJCQlcCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAkJCVwKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCQlcCisJCX0sCQkJCQkJXAorCX0sCQkJCQkJCVwKK307CQkJCQkJCQlcCisJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JlZ21hcF9kaXYgcHJlZml4IyNfZGl2X2NsayA9IHsJCVwKKwkucmVnID0gX25zLAkJCQkJCVwKKwkuc2hpZnQgPSAxMCwJCQkJCQlcCisJLndpZHRoID0gOCwJCQkJCQlcCisJLmNsa3IgPSB7CQkJCQkJXAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpewkJXAorCQkJLm5hbWUgPSAjcHJlZml4ICJfZGl2X2NsayIsCQlcCisJCQkucGFyZW50X25hbWVzID0gbGNjXyMjcHJlZml4IyNfcGFyZW50cywJXAorCQkJLm51bV9wYXJlbnRzID0gMSwJCQlcCisJCQkub3BzID0gJmNsa19yZWdtYXBfZGl2X29wcywJCVwKKwkJfSwJCQkJCQlcCisJfSwJCQkJCQkJXAorfTsJCQkJCQkJCVwKKwkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIHByZWZpeCMjX2JpdF9kaXZfY2xrID0gewkJXAorCS5oYWx0X3JlZyA9IGhyLAkJCQkJCVwKKwkuaGFsdF9iaXQgPSAwLAkJCQkJCVwKKwkuaGFsdF9jaGVjayA9IEJSQU5DSF9IQUxUX0VOQUJMRSwJCQlcCisJLmNsa3IgPSB7CQkJCQkJXAorCQkuZW5hYmxlX3JlZyA9IF9ucywJCQkJXAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMTkpLAkJCQlcCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CQlcCisJCQkubmFtZSA9ICNwcmVmaXggIl9iaXRfZGl2X2NsayIsCQlcCisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsJXAorCQkJCSNwcmVmaXggIl9kaXZfY2xrIgkJXAorCQkJfSwJCQkJCVwKKwkJCS5udW1fcGFyZW50cyA9IDEsCQkJXAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywJCQlcCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAkJXAorCQl9LAkJCQkJCVwKKwl9LAkJCQkJCQlcCit9OwkJCQkJCQkJXAorCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGNsa19yZWdtYXBfbXV4IHByZWZpeCMjX2JpdF9jbGsgPSB7CQlcCisJLnJlZyA9IF9ucywJCQkJCQlcCisJLnNoaWZ0ID0gMTgsCQkJCQkJXAorCS53aWR0aCA9IDEsCQkJCQkJXAorCS5jbGtyID0gewkJCQkJCVwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsJCVwKKwkJCS5uYW1lID0gI3ByZWZpeCAiX2JpdF9jbGsiLAkJXAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7CVwKKwkJCQkjcHJlZml4ICJfYml0X2Rpdl9jbGsiLAkJXAorCQkJCSNwcmVmaXggIl9jb2RlY19jbGsiLAkJXAorCQkJfSwJCQkJCVwKKwkJCS5udW1fcGFyZW50cyA9IDIsCQkJXAorCQkJLm9wcyA9ICZjbGtfcmVnbWFwX211eF9jbG9zZXN0X29wcywJXAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwJCVwKKwkJfSwJCQkJCQlcCisJfSwJCQkJCQkJXAorfQorCitDTEtfQUlGX09TUl9ESVYoY29kZWNfaTJzX21pYywgMHg2MCwgMHg2NCwgMHg2OCk7CitDTEtfQUlGX09TUl9ESVYoc3BhcmVfaTJzX21pYywgMHg3OCwgMHg3YywgMHg4MCk7CitDTEtfQUlGX09TUl9ESVYoY29kZWNfaTJzX3Nwa3IsIDB4NmMsIDB4NzAsIDB4NzQpOworQ0xLX0FJRl9PU1JfRElWKHNwYXJlX2kyc19zcGtyLCAweDg0LCAweDg4LCAweDhjKTsKKworc3RhdGljIHN0cnVjdCBmcmVxX3RibCBjbGtfdGJsX3BjbV80OTJbXSA9IHsKKwl7ICAgMjU2MDAwLCBQX1BMTDQsIDQsIDEsIDQ4MCB9LAorCXsgICA1MTIwMDAsIFBfUExMNCwgNCwgMSwgMjQwIH0sCisJeyAgIDc2ODAwMCwgUF9QTEw0LCA0LCAxLCAxNjAgfSwKKwl7ICAxMDI0MDAwLCBQX1BMTDQsIDQsIDEsIDEyMCB9LAorCXsgIDE1MzYwMDAsIFBfUExMNCwgNCwgMSwgIDgwIH0sCisJeyAgMjA0ODAwMCwgUF9QTEw0LCA0LCAxLCAgNjAgfSwKKwl7ICAzMDcyMDAwLCBQX1BMTDQsIDQsIDEsICA0MCB9LAorCXsgIDQwOTYwMDAsIFBfUExMNCwgNCwgMSwgIDMwIH0sCisJeyAgNjE0NDAwMCwgUF9QTEw0LCA0LCAxLCAgMjAgfSwKKwl7ICA4MTkyMDAwLCBQX1BMTDQsIDQsIDEsICAxNSB9LAorCXsgMTIyODgwMDAsIFBfUExMNCwgNCwgMSwgIDEwIH0sCisJeyAyNDU3NjAwMCwgUF9QTEw0LCA0LCAxLCAgIDUgfSwKKwl7IDI3MDAwMDAwLCBQX0NYTywgIDEsIDAsICAgMCB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBmcmVxX3RibCBjbGtfdGJsX3BjbV8zOTNbXSA9IHsKKwl7ICAgMjU2MDAwLCBQX1BMTDQsIDQsIDEsIDM4NCB9LAorCXsgICA1MTIwMDAsIFBfUExMNCwgNCwgMSwgMTkyIH0sCisJeyAgIDc2ODAwMCwgUF9QTEw0LCA0LCAxLCAxMjggfSwKKwl7ICAxMDI0MDAwLCBQX1BMTDQsIDQsIDEsICA5NiB9LAorCXsgIDE1MzYwMDAsIFBfUExMNCwgNCwgMSwgIDY0IH0sCisJeyAgMjA0ODAwMCwgUF9QTEw0LCA0LCAxLCAgNDggfSwKKwl7ICAzMDcyMDAwLCBQX1BMTDQsIDQsIDEsICAzMiB9LAorCXsgIDQwOTYwMDAsIFBfUExMNCwgNCwgMSwgIDI0IH0sCisJeyAgNjE0NDAwMCwgUF9QTEw0LCA0LCAxLCAgMTYgfSwKKwl7ICA4MTkyMDAwLCBQX1BMTDQsIDQsIDEsICAxMiB9LAorCXsgMTIyODgwMDAsIFBfUExMNCwgNCwgMSwgICA4IH0sCisJeyAyNDU3NjAwMCwgUF9QTEw0LCA0LCAxLCAgIDQgfSwKKwl7IDI3MDAwMDAwLCBQX0NYTywgIDEsIDAsICAgMCB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmNnIHBjbV9zcmMgPSB7CisJLm5zX3JlZyA9IDB4NTQsCisJLm1kX3JlZyA9IDB4NTgsCisJLm1uID0geworCQkubW5jdHJfZW5fYml0ID0gOCwKKwkJLm1uY3RyX3Jlc2V0X2JpdCA9IDcsCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwKKwkJLm5fdmFsX3NoaWZ0ID0gMTYsCisJCS5tX3ZhbF9zaGlmdCA9IDE2LAorCQkud2lkdGggPSAxNiwKKwl9LAorCS5wID0geworCQkucHJlX2Rpdl9zaGlmdCA9IDMsCisJCS5wcmVfZGl2X3dpZHRoID0gMiwKKwl9LAorCS5zID0geworCQkuc3JjX3NlbF9zaGlmdCA9IDAsCisJCS5wYXJlbnRfbWFwID0gbGNjX2N4b19wbGw0X21hcCwKKwl9LAorCS5mcmVxX3RibCA9IGNsa190YmxfcGNtXzM5MywKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDU0LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoOSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJwY21fc3JjIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBsY2NfY3hvX3BsbDQsCisJCQkubnVtX3BhcmVudHMgPSAyLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9HQVRFLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggcGNtX2Nsa19vdXQgPSB7CisJLmhhbHRfcmVnID0gMHg1YywKKwkuaGFsdF9iaXQgPSAwLAorCS5oYWx0X2NoZWNrID0gQlJBTkNIX0hBTFRfRU5BQkxFLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4NTQsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxMSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJwY21fY2xrX291dCIsCisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgInBjbV9zcmMiIH0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JlZ21hcF9tdXggcGNtX2NsayA9IHsKKwkucmVnID0gMHg1NCwKKwkuc2hpZnQgPSAxMCwKKwkud2lkdGggPSAxLAorCS5jbGtyID0geworCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAicGNtX2NsayIsCisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsKKwkJCQkicGNtX2Nsa19vdXQiLAorCQkJCSJwY21fY29kZWNfY2xrIiwKKwkJCX0sCisJCQkubnVtX3BhcmVudHMgPSAyLAorCQkJLm9wcyA9ICZjbGtfcmVnbWFwX211eF9jbG9zZXN0X29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZyBzbGltYnVzX3NyYyA9IHsKKwkubnNfcmVnID0gMHhjYywKKwkubWRfcmVnID0gMHhkMCwKKwkubW4gPSB7CisJCS5tbmN0cl9lbl9iaXQgPSA4LAorCQkubW5jdHJfcmVzZXRfYml0ID0gNywKKwkJLm1uY3RyX21vZGVfc2hpZnQgPSA1LAorCQkubl92YWxfc2hpZnQgPSAyNCwKKwkJLm1fdmFsX3NoaWZ0ID0gOCwKKwkJLndpZHRoID0gOCwKKwl9LAorCS5wID0geworCQkucHJlX2Rpdl9zaGlmdCA9IDMsCisJCS5wcmVfZGl2X3dpZHRoID0gMiwKKwl9LAorCS5zID0geworCQkuc3JjX3NlbF9zaGlmdCA9IDAsCisJCS5wYXJlbnRfbWFwID0gbGNjX2N4b19wbGw0X21hcCwKKwl9LAorCS5mcmVxX3RibCA9IGNsa190YmxfYWlmX29zcl8zOTMsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHhjYywKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAic2xpbWJ1c19zcmMiLAorCQkJLnBhcmVudF9uYW1lcyA9IGxjY19jeG9fcGxsNCwKKwkJCS5udW1fcGFyZW50cyA9IDIsCisJCQkub3BzID0gJmNsa19yY2dfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX0dBVEUsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGNjX3NsaW1idXNfcGFyZW50c1tdID0geworCSJzbGltYnVzX3NyYyIsCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggYXVkaW9fc2xpbWJ1c19jbGsgPSB7CisJLmhhbHRfcmVnID0gMHhkNCwKKwkuaGFsdF9iaXQgPSAwLAorCS5oYWx0X2NoZWNrID0gQlJBTkNIX0hBTFRfRU5BQkxFLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4Y2MsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxMCksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJhdWRpb19zbGltYnVzX2NsayIsCisJCQkucGFyZW50X25hbWVzID0gbGNjX3NsaW1idXNfcGFyZW50cywKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIHNwc19zbGltYnVzX2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweGQ0LAorCS5oYWx0X2JpdCA9IDEsCisJLmhhbHRfY2hlY2sgPSBCUkFOQ0hfSEFMVF9FTkFCTEUsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHhjYywKKwkJLmVuYWJsZV9tYXNrID0gQklUKDEyKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gInNwc19zbGltYnVzX2NsayIsCisJCQkucGFyZW50X25hbWVzID0gbGNjX3NsaW1idXNfcGFyZW50cywKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmVnbWFwICpsY2NfbWRtOTYxNV9jbGtzW10gPSB7CisJW1BMTDRdID0gJnBsbDQuY2xrciwKKwlbTUkyU19PU1JfU1JDXSA9ICZtaTJzX29zcl9zcmMuY2xrciwKKwlbTUkyU19PU1JfQ0xLXSA9ICZtaTJzX29zcl9jbGsuY2xrciwKKwlbTUkyU19ESVZfQ0xLXSA9ICZtaTJzX2Rpdl9jbGsuY2xrciwKKwlbTUkyU19CSVRfRElWX0NMS10gPSAmbWkyc19iaXRfZGl2X2Nsay5jbGtyLAorCVtNSTJTX0JJVF9DTEtdID0gJm1pMnNfYml0X2Nsay5jbGtyLAorCVtQQ01fU1JDXSA9ICZwY21fc3JjLmNsa3IsCisJW1BDTV9DTEtfT1VUXSA9ICZwY21fY2xrX291dC5jbGtyLAorCVtQQ01fQ0xLXSA9ICZwY21fY2xrLmNsa3IsCisJW1NMSU1CVVNfU1JDXSA9ICZzbGltYnVzX3NyYy5jbGtyLAorCVtBVURJT19TTElNQlVTX0NMS10gPSAmYXVkaW9fc2xpbWJ1c19jbGsuY2xrciwKKwlbU1BTX1NMSU1CVVNfQ0xLXSA9ICZzcHNfc2xpbWJ1c19jbGsuY2xrciwKKwlbQ09ERUNfSTJTX01JQ19PU1JfU1JDXSA9ICZjb2RlY19pMnNfbWljX29zcl9zcmMuY2xrciwKKwlbQ09ERUNfSTJTX01JQ19PU1JfQ0xLXSA9ICZjb2RlY19pMnNfbWljX29zcl9jbGsuY2xrciwKKwlbQ09ERUNfSTJTX01JQ19ESVZfQ0xLXSA9ICZjb2RlY19pMnNfbWljX2Rpdl9jbGsuY2xrciwKKwlbQ09ERUNfSTJTX01JQ19CSVRfRElWX0NMS10gPSAmY29kZWNfaTJzX21pY19iaXRfZGl2X2Nsay5jbGtyLAorCVtDT0RFQ19JMlNfTUlDX0JJVF9DTEtdID0gJmNvZGVjX2kyc19taWNfYml0X2Nsay5jbGtyLAorCVtTUEFSRV9JMlNfTUlDX09TUl9TUkNdID0gJnNwYXJlX2kyc19taWNfb3NyX3NyYy5jbGtyLAorCVtTUEFSRV9JMlNfTUlDX09TUl9DTEtdID0gJnNwYXJlX2kyc19taWNfb3NyX2Nsay5jbGtyLAorCVtTUEFSRV9JMlNfTUlDX0RJVl9DTEtdID0gJnNwYXJlX2kyc19taWNfZGl2X2Nsay5jbGtyLAorCVtTUEFSRV9JMlNfTUlDX0JJVF9ESVZfQ0xLXSA9ICZzcGFyZV9pMnNfbWljX2JpdF9kaXZfY2xrLmNsa3IsCisJW1NQQVJFX0kyU19NSUNfQklUX0NMS10gPSAmc3BhcmVfaTJzX21pY19iaXRfY2xrLmNsa3IsCisJW0NPREVDX0kyU19TUEtSX09TUl9TUkNdID0gJmNvZGVjX2kyc19zcGtyX29zcl9zcmMuY2xrciwKKwlbQ09ERUNfSTJTX1NQS1JfT1NSX0NMS10gPSAmY29kZWNfaTJzX3Nwa3Jfb3NyX2Nsay5jbGtyLAorCVtDT0RFQ19JMlNfU1BLUl9ESVZfQ0xLXSA9ICZjb2RlY19pMnNfc3Brcl9kaXZfY2xrLmNsa3IsCisJW0NPREVDX0kyU19TUEtSX0JJVF9ESVZfQ0xLXSA9ICZjb2RlY19pMnNfc3Brcl9iaXRfZGl2X2Nsay5jbGtyLAorCVtDT0RFQ19JMlNfU1BLUl9CSVRfQ0xLXSA9ICZjb2RlY19pMnNfc3Brcl9iaXRfY2xrLmNsa3IsCisJW1NQQVJFX0kyU19TUEtSX09TUl9TUkNdID0gJnNwYXJlX2kyc19zcGtyX29zcl9zcmMuY2xrciwKKwlbU1BBUkVfSTJTX1NQS1JfT1NSX0NMS10gPSAmc3BhcmVfaTJzX3Nwa3Jfb3NyX2Nsay5jbGtyLAorCVtTUEFSRV9JMlNfU1BLUl9ESVZfQ0xLXSA9ICZzcGFyZV9pMnNfc3Brcl9kaXZfY2xrLmNsa3IsCisJW1NQQVJFX0kyU19TUEtSX0JJVF9ESVZfQ0xLXSA9ICZzcGFyZV9pMnNfc3Brcl9iaXRfZGl2X2Nsay5jbGtyLAorCVtTUEFSRV9JMlNfU1BLUl9CSVRfQ0xLXSA9ICZzcGFyZV9pMnNfc3Brcl9iaXRfY2xrLmNsa3IsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgbGNjX21kbTk2MTVfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMJPSAzMiwKKwkucmVnX3N0cmlkZQk9IDQsCisJLnZhbF9iaXRzCT0gMzIsCisJLm1heF9yZWdpc3Rlcgk9IDB4ZmMsCisJLmZhc3RfaW8JPSB0cnVlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBxY29tX2NjX2Rlc2MgbGNjX21kbTk2MTVfZGVzYyA9IHsKKwkuY29uZmlnID0gJmxjY19tZG05NjE1X3JlZ21hcF9jb25maWcsCisJLmNsa3MgPSBsY2NfbWRtOTYxNV9jbGtzLAorCS5udW1fY2xrcyA9IEFSUkFZX1NJWkUobGNjX21kbTk2MTVfY2xrcyksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBsY2NfbWRtOTYxNV9tYXRjaF90YWJsZVtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxsY2MtbWRtOTYxNSIgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBsY2NfbWRtOTYxNV9tYXRjaF90YWJsZSk7CisKK3N0YXRpYyBpbnQgbGNjX21kbTk2MTVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwl1MzIgdmFsOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKworCXJlZ21hcCA9IHFjb21fY2NfbWFwKHBkZXYsICZsY2NfbWRtOTYxNV9kZXNjKTsKKwlpZiAoSVNfRVJSKHJlZ21hcCkpCisJCXJldHVybiBQVFJfRVJSKHJlZ21hcCk7CisKKwkvKiBVc2UgdGhlIGNvcnJlY3QgZnJlcXVlbmN5IHBsYW4gZGVwZW5kaW5nIG9uIHNwZWVkIG9mIFBMTDQgKi8KKwlyZWdtYXBfcmVhZChyZWdtYXAsIDB4NCwgJnZhbCk7CisJaWYgKHZhbCA9PSAweDEyKSB7CisJCXNsaW1idXNfc3JjLmZyZXFfdGJsID0gY2xrX3RibF9haWZfb3NyXzQ5MjsKKwkJbWkyc19vc3Jfc3JjLmZyZXFfdGJsID0gY2xrX3RibF9haWZfb3NyXzQ5MjsKKwkJY29kZWNfaTJzX21pY19vc3Jfc3JjLmZyZXFfdGJsID0gY2xrX3RibF9haWZfb3NyXzQ5MjsKKwkJc3BhcmVfaTJzX21pY19vc3Jfc3JjLmZyZXFfdGJsID0gY2xrX3RibF9haWZfb3NyXzQ5MjsKKwkJY29kZWNfaTJzX3Nwa3Jfb3NyX3NyYy5mcmVxX3RibCA9IGNsa190YmxfYWlmX29zcl80OTI7CisJCXNwYXJlX2kyc19zcGtyX29zcl9zcmMuZnJlcV90YmwgPSBjbGtfdGJsX2FpZl9vc3JfNDkyOworCQlwY21fc3JjLmZyZXFfdGJsID0gY2xrX3RibF9wY21fNDkyOworCX0KKwkvKiBFbmFibGUgUExMNCBzb3VyY2Ugb24gdGhlIExQQVNTIFByaW1hcnkgUExMIE11eCAqLworCXJlZ21hcF93cml0ZShyZWdtYXAsIDB4YzQsIDB4MSk7CisKKwlyZXR1cm4gcWNvbV9jY19yZWFsbHlfcHJvYmUocGRldiwgJmxjY19tZG05NjE1X2Rlc2MsIHJlZ21hcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGxjY19tZG05NjE1X2RyaXZlciA9IHsKKwkucHJvYmUJCT0gbGNjX21kbTk2MTVfcHJvYmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImxjYy1tZG05NjE1IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gbGNjX21kbTk2MTVfbWF0Y2hfdGFibGUsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGxjY19tZG05NjE1X2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiUUNPTSBMQ0MgTURNOTYxNSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06bGNjLW1kbTk2MTUiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3Fjb20vbW1jYy1tc204OTk2LmMgYi9kcml2ZXJzL2Nsay9xY29tL21tY2MtbXNtODk5Ni5jCmluZGV4IDg0N2RkOWQuLmNhOTdlMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3Fjb20vbW1jYy1tc204OTk2LmMKKysrIGIvZHJpdmVycy9jbGsvcWNvbS9tbWNjLW1zbTg5OTYuYwpAQCAtMjg4OCw2ICsyODg4LDE0IEBACiAJJmdwbGwwX2Rpdi5odywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgZ2RzYyBtbWFnaWNfYmltY19nZHNjID0geworCS5nZHNjciA9IDB4NTI5YywKKwkucGQgPSB7CisJCS5uYW1lID0gIm1tYWdpY19iaW1jIiwKKwl9LAorCS5wd3JzdHMgPSBQV1JTVFNfT0ZGX09OLAorfTsKKwogc3RhdGljIHN0cnVjdCBnZHNjIG1tYWdpY192aWRlb19nZHNjID0gewogCS5nZHNjciA9IDB4MTE5YywKIAkuZ2RzX2h3X2N0cmwgPSAweDEyMGMsCkBAIC0zMjAxLDYgKzMyMDksNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBnZHNjICptbWNjX21zbTg5OTZfZ2RzY3NbXSA9IHsKKwlbTU1BR0lDX0JJTUNfR0RTQ10gPSAmbW1hZ2ljX2JpbWNfZ2RzYywKIAlbTU1BR0lDX1ZJREVPX0dEU0NdID0gJm1tYWdpY192aWRlb19nZHNjLAogCVtNTUFHSUNfTURTU19HRFNDXSA9ICZtbWFnaWNfbWRzc19nZHNjLAogCVtNTUFHSUNfQ0FNU1NfR0RTQ10gPSAmbW1hZ2ljX2NhbXNzX2dkc2MsCkBAIC0zMzA1LDkgKzMzMTQsOCBAQAogCiBzdGF0aWMgaW50IG1tY2NfbXNtODk5Nl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBjbGsgKmNsazsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCWludCBpOworCWludCBpLCByZXQ7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCiAJcmVnbWFwID0gcWNvbV9jY19tYXAocGRldiwgJm1tY2NfbXNtODk5Nl9kZXNjKTsKQEAgLTMzMjAsOSArMzMyOCw5IEBACiAJcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgMHg1MDU0LCBCSVQoMTUpLCAwKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1tY2NfbXNtODk5Nl9od3MpOyBpKyspIHsKLQkJY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoZGV2LCBtbWNjX21zbTg5OTZfaHdzW2ldKTsKLQkJaWYgKElTX0VSUihjbGspKQotCQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwkJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoZGV2LCBtbWNjX21zbTg5OTZfaHdzW2ldKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0dXJuIHFjb21fY2NfcmVhbGx5X3Byb2JlKHBkZXYsICZtbWNjX21zbTg5OTZfZGVzYywgcmVnbWFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3JlbmVzYXMvY2xrLW1zdHAuYyBiL2RyaXZlcnMvY2xrL3JlbmVzYXMvY2xrLW1zdHAuYwppbmRleCA1MDkzYTI1Li45Mzc1Nzc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9yZW5lc2FzL2Nsay1tc3RwLmMKKysrIGIvZHJpdmVycy9jbGsvcmVuZXNhcy9jbGstbXN0cC5jCkBAIC0xNjcsNyArMTY3LDcgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAogCWdyb3VwID0ga3phbGxvYyhzaXplb2YoKmdyb3VwKSwgR0ZQX0tFUk5FTCk7Ci0JY2xrcyA9IGttYWxsb2MoTVNUUF9NQVhfQ0xPQ0tTICogc2l6ZW9mKCpjbGtzKSwgR0ZQX0tFUk5FTCk7CisJY2xrcyA9IGttYWxsb2NfYXJyYXkoTVNUUF9NQVhfQ0xPQ0tTLCBzaXplb2YoKmNsa3MpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZ3JvdXAgPT0gTlVMTCB8fCBjbGtzID09IE5VTEwpIHsKIAkJa2ZyZWUoZ3JvdXApOwogCQlrZnJlZShjbGtzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3JlbmVzYXMvY2xrLXJ6LmMgYi9kcml2ZXJzL2Nsay9yZW5lc2FzL2Nsay1yei5jCmluZGV4IGY2MzEyYzYuLjVhZGI5MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3JlbmVzYXMvY2xrLXJ6LmMKKysrIGIvZHJpdmVycy9jbGsvcmVuZXNhcy9jbGstcnouYwpAQCAtMjUsMTAgKzI1LDMxIEBACiAjZGVmaW5lIENQR19GUlFDUgkweDEwCiAjZGVmaW5lIENQR19GUlFDUjIJMHgxNAogCisjZGVmaW5lIFBQUjAJCTB4RkNGRTMyMDAKKyNkZWZpbmUgUElCQzAJCTB4RkNGRTcwMDAKKworI2RlZmluZSBNRF9DTEsoeCkJKCh4ID4+IDIpICYgMSkJLyogUDBfMiAqLworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogSW5pdGlhbGl6YXRpb24KICAqLwogCitzdGF0aWMgdTE2IF9faW5pdCByel9jcGdfcmVhZF9tb2RlX3BpbnModm9pZCkKK3sKKwl2b2lkIF9faW9tZW0gKnBwcjAsICpwaWJjMDsKKwl1MTYgbW9kZXM7CisKKwlwcHIwID0gaW9yZW1hcF9ub2NhY2hlKFBQUjAsIDIpOworCXBpYmMwID0gaW9yZW1hcF9ub2NhY2hlKFBJQkMwLCAyKTsKKwlCVUdfT04oIXBwcjAgfHwgIXBpYmMwKTsKKwlpb3dyaXRlMTYoNCwgcGliYzApOwkvKiBlbmFibGUgaW5wdXQgYnVmZmVyICovCisJbW9kZXMgPSBpb3JlYWQxNihwcHIwKTsKKwlpb3VubWFwKHBwcjApOworCWlvdW5tYXAocGliYzApOworCisJcmV0dXJuIG1vZGVzOworfQorCiBzdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAogcnpfY3BnX3JlZ2lzdGVyX2Nsb2NrKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHN0cnVjdCByel9jcGcgKmNwZywgY29uc3QgY2hhciAqbmFtZSkKIHsKQEAgLTM3LDggKzU4LDcgQEAKIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgZnJxY3JfdGFiWzRdID0geyAzLCAyLCAwLCAxIH07CiAKIAlpZiAoc3RyY21wKG5hbWUsICJwbGwiKSA9PSAwKSB7Ci0JCS8qIEZJWE1FOiBjcGdfbW9kZSBzaG91bGQgYmUgcmVhZCBmcm9tIEdQSU8uIEJ1dCBubyBHUElPIHN1cHBvcnQgeWV0ICovCi0JCXVuc2lnbmVkIGNwZ19tb2RlID0gMDsgLyogaGFyZGNvZGVkIHRvIEVYVEFMIGZvciBub3cgKi8KKwkJdW5zaWduZWQgaW50IGNwZ19tb2RlID0gTURfQ0xLKHJ6X2NwZ19yZWFkX21vZGVfcGlucygpKTsKIAkJY29uc3QgY2hhciAqcGFyZW50X25hbWUgPSBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKG5wLCBjcGdfbW9kZSk7CiAKIAkJbXVsdCA9IGNwZ19tb2RlID8gKDMyIC8gNCkgOiAzMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3JlbmVzYXMvcjhhNzc5NS1jcGctbXNzci5jIGIvZHJpdmVycy9jbGsvcmVuZXNhcy9yOGE3Nzk1LWNwZy1tc3NyLmMKaW5kZXggZDM1OWM5Mi4uZjI1NWU0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvcmVuZXNhcy9yOGE3Nzk1LWNwZy1tc3NyLmMKKysrIGIvZHJpdmVycy9jbGsvcmVuZXNhcy9yOGE3Nzk1LWNwZy1tc3NyLmMKQEAgLTY5LDYgKzY5LDcgQEAKIAlERUZfRklYRUQoIi5zMSIsICAgICAgICBDTEtfUzEsICAgICAgICAgICAgQ0xLX1BMTDFfRElWMiwgIDMsIDEpLAogCURFRl9GSVhFRCgiLnMyIiwgICAgICAgIENMS19TMiwgICAgICAgICAgICBDTEtfUExMMV9ESVYyLCAgNCwgMSksCiAJREVGX0ZJWEVEKCIuczMiLCAgICAgICAgQ0xLX1MzLCAgICAgICAgICAgIENMS19QTEwxX0RJVjIsICA2LCAxKSwKKwlERUZfRklYRUQoIi5zZHNyYyIsICAgICBDTEtfU0RTUkMsICAgICAgICAgQ0xLX1BMTDFfRElWMiwgIDIsIDEpLAogCiAJLyogQ29yZSBDbG9jayBPdXRwdXRzICovCiAJREVGX0ZJWEVEKCJ6dHIiLCAgICAgICAgUjhBNzc5NV9DTEtfWlRSLCAgIENMS19QTEwxX0RJVjIsICA2LCAxKSwKQEAgLTg3LDEwICs4OCwxMCBAQAogCURFRl9GSVhFRCgiczNkMiIsICAgICAgIFI4QTc3OTVfQ0xLX1MzRDIsICBDTEtfUzMsICAgICAgICAgMiwgMSksCiAJREVGX0ZJWEVEKCJzM2Q0IiwgICAgICAgUjhBNzc5NV9DTEtfUzNENCwgIENMS19TMywgICAgICAgICA0LCAxKSwKIAotCURFRl9HRU4zX1NEKCJzZDAiLCAgICAgIFI4QTc3OTVfQ0xLX1NEMCwgICBDTEtfUExMMV9ESVYyLCAweDAwNzQpLAotCURFRl9HRU4zX1NEKCJzZDEiLCAgICAgIFI4QTc3OTVfQ0xLX1NEMSwgICBDTEtfUExMMV9ESVYyLCAweDAwNzgpLAotCURFRl9HRU4zX1NEKCJzZDIiLCAgICAgIFI4QTc3OTVfQ0xLX1NEMiwgICBDTEtfUExMMV9ESVYyLCAweDAyNjgpLAotCURFRl9HRU4zX1NEKCJzZDMiLCAgICAgIFI4QTc3OTVfQ0xLX1NEMywgICBDTEtfUExMMV9ESVYyLCAweDAyNmMpLAorCURFRl9HRU4zX1NEKCJzZDAiLCAgICAgIFI4QTc3OTVfQ0xLX1NEMCwgICBDTEtfU0RTUkMsICAgICAweDAwNzQpLAorCURFRl9HRU4zX1NEKCJzZDEiLCAgICAgIFI4QTc3OTVfQ0xLX1NEMSwgICBDTEtfU0RTUkMsICAgICAweDAwNzgpLAorCURFRl9HRU4zX1NEKCJzZDIiLCAgICAgIFI4QTc3OTVfQ0xLX1NEMiwgICBDTEtfU0RTUkMsICAgICAweDAyNjgpLAorCURFRl9HRU4zX1NEKCJzZDMiLCAgICAgIFI4QTc3OTVfQ0xLX1NEMywgICBDTEtfU0RTUkMsICAgICAweDAyNmMpLAogCiAJREVGX0ZJWEVEKCJjbCIsICAgICAgICAgUjhBNzc5NV9DTEtfQ0wsICAgIENMS19QTEwxX0RJVjIsIDQ4LCAxKSwKIAlERUZfRklYRUQoImNwIiwgICAgICAgICBSOEE3Nzk1X0NMS19DUCwgICAgQ0xLX0VYVEFMLCAgICAgIDIsIDEpLApAQCAtMTIyLDYgKzEyMywxMCBAQAogCURFRl9NT0QoInN5cy1kbWFjMiIsCQkgMjE3LAlSOEE3Nzk1X0NMS19TM0QxKSwKIAlERUZfTU9EKCJzeXMtZG1hYzEiLAkJIDIxOCwJUjhBNzc5NV9DTEtfUzNEMSksCiAJREVGX01PRCgic3lzLWRtYWMwIiwJCSAyMTksCVI4QTc3OTVfQ0xLX1MzRDEpLAorCURFRl9NT0QoImNtdDMiLAkJCSAzMDAsCVI4QTc3OTVfQ0xLX1IpLAorCURFRl9NT0QoImNtdDIiLAkJCSAzMDEsCVI4QTc3OTVfQ0xLX1IpLAorCURFRl9NT0QoImNtdDEiLAkJCSAzMDIsCVI4QTc3OTVfQ0xLX1IpLAorCURFRl9NT0QoImNtdDAiLAkJCSAzMDMsCVI4QTc3OTVfQ0xLX1IpLAogCURFRl9NT0QoInNjaWYyIiwJCSAzMTAsCVI4QTc3OTVfQ0xLX1MzRDQpLAogCURFRl9NT0QoInNkaWYzIiwJCSAzMTEsCVI4QTc3OTVfQ0xLX1NEMyksCiAJREVGX01PRCgic2RpZjIiLAkJIDMxMiwJUjhBNzc5NV9DTEtfU0QyKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3JlbmVzYXMvcjhhNzc5Ni1jcGctbXNzci5jIGIvZHJpdmVycy9jbGsvcmVuZXNhcy9yOGE3Nzk2LWNwZy1tc3NyLmMKaW5kZXggYzg0YjU0OS4uZWIzNDdlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvcmVuZXNhcy9yOGE3Nzk2LWNwZy1tc3NyLmMKKysrIGIvZHJpdmVycy9jbGsvcmVuZXNhcy9yOGE3Nzk2LWNwZy1tc3NyLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKIAlDTEtfUzMsCiAJQ0xLX1NEU1JDLAogCUNMS19TU1BTUkMsCisJQ0xLX1JJTlQsCiAKIAkvKiBNb2R1bGUgQ2xvY2tzICovCiAJTU9EX0NMS19CQVNFCkBAIC02OSw2ICs3MCw3IEBACiAJREVGX0ZJWEVEKCIuczEiLCAgICAgICAgQ0xLX1MxLCAgICAgICAgICAgIENMS19QTEwxX0RJVjIsICAzLCAxKSwKIAlERUZfRklYRUQoIi5zMiIsICAgICAgICBDTEtfUzIsICAgICAgICAgICAgQ0xLX1BMTDFfRElWMiwgIDQsIDEpLAogCURFRl9GSVhFRCgiLnMzIiwgICAgICAgIENMS19TMywgICAgICAgICAgICBDTEtfUExMMV9ESVYyLCAgNiwgMSksCisJREVGX0ZJWEVEKCIuc2RzcmMiLCAgICAgQ0xLX1NEU1JDLCAgICAgICAgIENMS19QTEwxX0RJVjIsICAyLCAxKSwKIAogCS8qIENvcmUgQ2xvY2sgT3V0cHV0cyAqLwogCURFRl9GSVhFRCgienRyIiwgICAgICAgIFI4QTc3OTZfQ0xLX1pUUiwgICBDTEtfUExMMV9ESVYyLCAgNiwgMSksCkBAIC05MiwxMyArOTQsNDIgQEAKIAlERUZfRklYRUQoInMzZDIiLCAgICAgICBSOEE3Nzk2X0NMS19TM0QyLCAgQ0xLX1MzLCAgICAgICAgIDIsIDEpLAogCURFRl9GSVhFRCgiczNkNCIsICAgICAgIFI4QTc3OTZfQ0xLX1MzRDQsICBDTEtfUzMsICAgICAgICAgNCwgMSksCiAKKwlERUZfR0VOM19TRCgic2QwIiwgICAgICBSOEE3Nzk2X0NMS19TRDAsICAgQ0xLX1NEU1JDLCAgICAweDAwNzQpLAorCURFRl9HRU4zX1NEKCJzZDEiLCAgICAgIFI4QTc3OTZfQ0xLX1NEMSwgICBDTEtfU0RTUkMsICAgIDB4MDA3OCksCisJREVGX0dFTjNfU0QoInNkMiIsICAgICAgUjhBNzc5Nl9DTEtfU0QyLCAgIENMS19TRFNSQywgICAgMHgwMjY4KSwKKwlERUZfR0VOM19TRCgic2QzIiwgICAgICBSOEE3Nzk2X0NMS19TRDMsICAgQ0xLX1NEU1JDLCAgICAweDAyNmMpLAorCiAJREVGX0ZJWEVEKCJjbCIsICAgICAgICAgUjhBNzc5Nl9DTEtfQ0wsICAgIENMS19QTEwxX0RJVjIsIDQ4LCAxKSwKIAlERUZfRklYRUQoImNwIiwgICAgICAgICBSOEE3Nzk2X0NMS19DUCwgICAgQ0xLX0VYVEFMLCAgICAgIDIsIDEpLAorCisJREVGX0RJVjZfUk8oIm9zYyIsICAgICAgUjhBNzc5Nl9DTEtfT1NDLCAgIENMS19FWFRBTCwgQ1BHX1JDS0NSLCAgOCksCisJREVGX0RJVjZfUk8oInJfaW50IiwgICAgQ0xLX1JJTlQsICAgICAgICAgIENMS19FWFRBTCwgQ1BHX1JDS0NSLCAzMiksCisKKwlERUZfQkFTRSgiciIsICAgICAgICAgICBSOEE3Nzk2X0NMS19SLCAgICAgQ0xLX1RZUEVfR0VOM19SLCBDTEtfUklOVCksCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1zc3JfbW9kX2NsayByOGE3Nzk2X21vZF9jbGtzW10gX19pbml0Y29uc3QgPSB7CisJREVGX01PRCgiY210MyIsCQkJIDMwMCwJUjhBNzc5Nl9DTEtfUiksCisJREVGX01PRCgiY210MiIsCQkJIDMwMSwJUjhBNzc5Nl9DTEtfUiksCisJREVGX01PRCgiY210MSIsCQkJIDMwMiwJUjhBNzc5Nl9DTEtfUiksCisJREVGX01PRCgiY210MCIsCQkJIDMwMywJUjhBNzc5Nl9DTEtfUiksCiAJREVGX01PRCgic2NpZjIiLAkJIDMxMCwJUjhBNzc5Nl9DTEtfUzNENCksCisJREVGX01PRCgic2RpZjMiLAkJIDMxMSwJUjhBNzc5Nl9DTEtfU0QzKSwKKwlERUZfTU9EKCJzZGlmMiIsCQkgMzEyLAlSOEE3Nzk2X0NMS19TRDIpLAorCURFRl9NT0QoInNkaWYxIiwJCSAzMTMsCVI4QTc3OTZfQ0xLX1NEMSksCisJREVGX01PRCgic2RpZjAiLAkJIDMxNCwJUjhBNzc5Nl9DTEtfU0QwKSwKKwlERUZfTU9EKCJyd2R0MCIsCQkgNDAyLAlSOEE3Nzk2X0NMS19SKSwKIAlERUZfTU9EKCJpbnRjLWFwIiwJCSA0MDgsCVI4QTc3OTZfQ0xLX1MzRDEpLAorCURFRl9NT0QoInRoZXJtYWwiLAkJIDUyMiwJUjhBNzc5Nl9DTEtfQ1ApLAorCURFRl9NT0QoImV0aGVyYXZiIiwJCSA4MTIsCVI4QTc3OTZfQ0xLX1MwRDYpLAorCURFRl9NT0QoImdwaW83IiwJCSA5MDUsCVI4QTc3OTZfQ0xLX1MzRDQpLAorCURFRl9NT0QoImdwaW82IiwJCSA5MDYsCVI4QTc3OTZfQ0xLX1MzRDQpLAorCURFRl9NT0QoImdwaW81IiwJCSA5MDcsCVI4QTc3OTZfQ0xLX1MzRDQpLAorCURFRl9NT0QoImdwaW80IiwJCSA5MDgsCVI4QTc3OTZfQ0xLX1MzRDQpLAorCURFRl9NT0QoImdwaW8zIiwJCSA5MDksCVI4QTc3OTZfQ0xLX1MzRDQpLAorCURFRl9NT0QoImdwaW8yIiwJCSA5MTAsCVI4QTc3OTZfQ0xLX1MzRDQpLAorCURFRl9NT0QoImdwaW8xIiwJCSA5MTEsCVI4QTc3OTZfQ0xLX1MzRDQpLAorCURFRl9NT0QoImdwaW8wIiwJCSA5MTIsCVI4QTc3OTZfQ0xLX1MzRDQpLAogfTsKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByOGE3Nzk2X2NyaXRfbW9kX2Nsa3NbXSBfX2luaXRjb25zdCA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3JvY2tjaGlwL01ha2VmaWxlIGIvZHJpdmVycy9jbGsvcm9ja2NoaXAvTWFrZWZpbGUKaW5kZXggZjQ3YTJmYS4uYjVmMmM4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvcm9ja2NoaXAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jbGsvcm9ja2NoaXAvTWFrZWZpbGUKQEAgLTgsNiArOCw3IEBACiBvYmoteQkrPSBjbGstY3B1Lm8KIG9iai15CSs9IGNsay1pbnZlcnRlci5vCiBvYmoteQkrPSBjbGstbW1jLXBoYXNlLm8KK29iai15CSs9IGNsay1kZHIubwogb2JqLSQoQ09ORklHX1JFU0VUX0NPTlRST0xMRVIpCSs9IHNvZnRyc3QubwogCiBvYmoteQkrPSBjbGstcmszMDM2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay1kZHIuYyBiL2RyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay1kZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmViYTkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLWRkci5jCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFJvY2tjaGlwIEVsZWN0cm9uaWNzIENvLiBMdGQuCisgKiBBdXRob3I6IExpbiBIdWFuZyA8aGxAcm9jay1jaGlwcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9hcm0tc21jY2MuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb2Mvcm9ja2NoaXAvcm9ja2NoaXBfc2lwLmg+CisjaW5jbHVkZSAiY2xrLmgiCisKK3N0cnVjdCByb2NrY2hpcF9kZHJjbGsgeworCXN0cnVjdCBjbGtfaHcJaHc7CisJdm9pZCBfX2lvbWVtCSpyZWdfYmFzZTsKKwlpbnQJCW11eF9vZmZzZXQ7CisJaW50CQltdXhfc2hpZnQ7CisJaW50CQltdXhfd2lkdGg7CisJaW50CQlkaXZfc2hpZnQ7CisJaW50CQlkaXZfd2lkdGg7CisJaW50CQlkZHJfZmxhZzsKKwlzcGlubG9ja190CSpsb2NrOworfTsKKworI2RlZmluZSB0b19yb2NrY2hpcF9kZHJjbGtfaHcoaHcpIGNvbnRhaW5lcl9vZihodywgc3RydWN0IHJvY2tjaGlwX2RkcmNsaywgaHcpCisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfZGRyY2xrX3NpcF9zZXRfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywgdW5zaWduZWQgbG9uZyBkcmF0ZSwKKwkJCQkJdW5zaWduZWQgbG9uZyBwcmF0ZSkKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfZGRyY2xrICpkZHJjbGsgPSB0b19yb2NrY2hpcF9kZHJjbGtfaHcoaHcpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGFybV9zbWNjY19yZXMgcmVzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoZGRyY2xrLT5sb2NrLCBmbGFncyk7CisJYXJtX3NtY2NjX3NtYyhST0NLQ0hJUF9TSVBfRFJBTV9GUkVRLCBkcmF0ZSwgMCwKKwkJICAgICAgUk9DS0NISVBfU0lQX0NPTkZJR19EUkFNX1NFVF9SQVRFLAorCQkgICAgICAwLCAwLCAwLCAwLCAmcmVzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRkcmNsay0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJlcy5hMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK3JvY2tjaGlwX2RkcmNsa19zaXBfcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCisJCQkJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKK3sKKwlzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7CisKKwlhcm1fc21jY2Nfc21jKFJPQ0tDSElQX1NJUF9EUkFNX0ZSRVEsIDAsIDAsCisJCSAgICAgIFJPQ0tDSElQX1NJUF9DT05GSUdfRFJBTV9HRVRfUkFURSwKKwkJICAgICAgMCwgMCwgMCwgMCwgJnJlcyk7CisKKwlyZXR1cm4gcmVzLmEwOworfQorCitzdGF0aWMgbG9uZyByb2NrY2hpcF9kZHJjbGtfc2lwX3JvdW5kX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgcmF0ZSwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyAqcHJhdGUpCit7CisJc3RydWN0IGFybV9zbWNjY19yZXMgcmVzOworCisJYXJtX3NtY2NjX3NtYyhST0NLQ0hJUF9TSVBfRFJBTV9GUkVRLCByYXRlLCAwLAorCQkgICAgICBST0NLQ0hJUF9TSVBfQ09ORklHX0RSQU1fUk9VTkRfUkFURSwKKwkJICAgICAgMCwgMCwgMCwgMCwgJnJlcyk7CisKKwlyZXR1cm4gcmVzLmEwOworfQorCitzdGF0aWMgdTggcm9ja2NoaXBfZGRyY2xrX2dldF9wYXJlbnQoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IHJvY2tjaGlwX2RkcmNsayAqZGRyY2xrID0gdG9fcm9ja2NoaXBfZGRyY2xrX2h3KGh3KTsKKwlpbnQgbnVtX3BhcmVudHMgPSBjbGtfaHdfZ2V0X251bV9wYXJlbnRzKGh3KTsKKwl1MzIgdmFsOworCisJdmFsID0gY2xrX3JlYWRsKGRkcmNsay0+cmVnX2Jhc2UgKworCQkJZGRyY2xrLT5tdXhfb2Zmc2V0KSA+PiBkZHJjbGstPm11eF9zaGlmdDsKKwl2YWwgJj0gR0VOTUFTSyhkZHJjbGstPm11eF93aWR0aCAtIDEsIDApOworCisJaWYgKHZhbCA+PSBudW1fcGFyZW50cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgcm9ja2NoaXBfZGRyY2xrX3NpcF9vcHMgPSB7CisJLnJlY2FsY19yYXRlID0gcm9ja2NoaXBfZGRyY2xrX3NpcF9yZWNhbGNfcmF0ZSwKKwkuc2V0X3JhdGUgPSByb2NrY2hpcF9kZHJjbGtfc2lwX3NldF9yYXRlLAorCS5yb3VuZF9yYXRlID0gcm9ja2NoaXBfZGRyY2xrX3NpcF9yb3VuZF9yYXRlLAorCS5nZXRfcGFyZW50ID0gcm9ja2NoaXBfZGRyY2xrX2dldF9wYXJlbnQsCit9OworCitzdHJ1Y3QgY2xrICpyb2NrY2hpcF9jbGtfcmVnaXN0ZXJfZGRyY2xrKGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncywKKwkJCQkJIGNvbnN0IGNoYXIgKmNvbnN0ICpwYXJlbnRfbmFtZXMsCisJCQkJCSB1OCBudW1fcGFyZW50cywgaW50IG11eF9vZmZzZXQsCisJCQkJCSBpbnQgbXV4X3NoaWZ0LCBpbnQgbXV4X3dpZHRoLAorCQkJCQkgaW50IGRpdl9zaGlmdCwgaW50IGRpdl93aWR0aCwKKwkJCQkJIGludCBkZHJfZmxhZywgdm9pZCBfX2lvbWVtICpyZWdfYmFzZSwKKwkJCQkJIHNwaW5sb2NrX3QgKmxvY2spCit7CisJc3RydWN0IHJvY2tjaGlwX2RkcmNsayAqZGRyY2xrOworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJc3RydWN0IGNsayAqY2xrOworCisJZGRyY2xrID0ga3phbGxvYyhzaXplb2YoKmRkcmNsayksIEdGUF9LRVJORUwpOworCWlmICghZGRyY2xrKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWluaXQubmFtZSA9IG5hbWU7CisJaW5pdC5wYXJlbnRfbmFtZXMgPSBwYXJlbnRfbmFtZXM7CisJaW5pdC5udW1fcGFyZW50cyA9IG51bV9wYXJlbnRzOworCisJaW5pdC5mbGFncyA9IGZsYWdzOworCWluaXQuZmxhZ3MgfD0gQ0xLX1NFVF9SQVRFX05PX1JFUEFSRU5UOworCisJc3dpdGNoIChkZHJfZmxhZykgeworCWNhc2UgUk9DS0NISVBfRERSQ0xLX1NJUDoKKwkJaW5pdC5vcHMgPSAmcm9ja2NoaXBfZGRyY2xrX3NpcF9vcHM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGRkcmNsayB0eXBlICVkXG4iLCBfX2Z1bmNfXywgZGRyX2ZsYWcpOworCQlrZnJlZShkZHJjbGspOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlkZHJjbGstPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisJZGRyY2xrLT5sb2NrID0gbG9jazsKKwlkZHJjbGstPmh3LmluaXQgPSAmaW5pdDsKKwlkZHJjbGstPm11eF9vZmZzZXQgPSBtdXhfb2Zmc2V0OworCWRkcmNsay0+bXV4X3NoaWZ0ID0gbXV4X3NoaWZ0OworCWRkcmNsay0+bXV4X3dpZHRoID0gbXV4X3dpZHRoOworCWRkcmNsay0+ZGl2X3NoaWZ0ID0gZGl2X3NoaWZ0OworCWRkcmNsay0+ZGl2X3dpZHRoID0gZGl2X3dpZHRoOworCWRkcmNsay0+ZGRyX2ZsYWcgPSBkZHJfZmxhZzsKKworCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmZGRyY2xrLT5odyk7CisJaWYgKElTX0VSUihjbGspKSB7CisJCXByX2VycigiJXM6IGNvdWxkIG5vdCByZWdpc3RlciBkZHJjbGsgJXNcbiIsIF9fZnVuY19fLAluYW1lKTsKKwkJa2ZyZWUoZGRyY2xrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGNsazsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay1wbGwuYyBiL2RyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay1wbGwuYwppbmRleCBkYjgxZTQ1Li45YzEzNzNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGstcGxsLmMKKysrIGIvZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLXBsbC5jCkBAIC04MzcsNyArODM3LDcgQEAKIAkJdTggbnVtX3BhcmVudHMsIGludCBjb25fb2Zmc2V0LCBpbnQgZ3JmX2xvY2tfb2Zmc2V0LAogCQlpbnQgbG9ja19zaGlmdCwgaW50IG1vZGVfb2Zmc2V0LCBpbnQgbW9kZV9zaGlmdCwKIAkJc3RydWN0IHJvY2tjaGlwX3BsbF9yYXRlX3RhYmxlICpyYXRlX3RhYmxlLAotCQl1OCBjbGtfcGxsX2ZsYWdzKQorCQl1bnNpZ25lZCBsb25nIGZsYWdzLCB1OCBjbGtfcGxsX2ZsYWdzKQogewogCWNvbnN0IGNoYXIgKnBsbF9wYXJlbnRzWzNdOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CkBAIC04OTIsNyArODkyLDcgQEAKIAlpbml0Lm5hbWUgPSBwbGxfbmFtZTsKIAogCS8qIGtlZXAgYWxsIHBsbHMgdW50b3VjaGVkIGZvciBub3cgKi8KLQlpbml0LmZsYWdzID0gQ0xLX0lHTk9SRV9VTlVTRUQ7CisJaW5pdC5mbGFncyA9IGZsYWdzIHwgQ0xLX0lHTk9SRV9VTlVTRUQ7CiAKIAlpbml0LnBhcmVudF9uYW1lcyA9ICZwYXJlbnRfbmFtZXNbMF07CiAJaW5pdC5udW1fcGFyZW50cyA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGstcmszMzk5LmMgYi9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGstcmszMzk5LmMKaW5kZXggYzEwOWQ4MC4uODM4N2M3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLXJrMzM5OS5jCisrKyBiL2RyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay1yazMzOTkuYwpAQCAtMTAwLDggKzEwMCwxMCBAQAogCVJLMzAzNl9QTExfUkFURSggMjk3MDAwMDAwLCAxLCA5OSwgNCwgMiwgMSwgMCksCiAJUkszMDM2X1BMTF9SQVRFKCAyMTYwMDAwMDAsIDEsIDcyLCA0LCAyLCAxLCAwKSwKIAlSSzMwMzZfUExMX1JBVEUoIDE0ODUwMDAwMCwgMSwgOTksIDQsIDQsIDEsIDApLAorCVJLMzAzNl9QTExfUkFURSggMTA2NTAwMDAwLCAxLCA3MSwgNCwgNCwgMSwgMCksCiAJUkszMDM2X1BMTF9SQVRFKCAgOTYwMDAwMDAsIDEsIDY0LCA0LCA0LCAxLCAwKSwKIAlSSzMwMzZfUExMX1JBVEUoICA3NDI1MDAwMCwgMiwgOTksIDQsIDQsIDEsIDApLAorCVJLMzAzNl9QTExfUkFURSggIDY1MDAwMDAwLCAxLCA2NSwgNiwgNCwgMSwgMCksCiAJUkszMDM2X1BMTF9SQVRFKCAgNTQwMDAwMDAsIDEsIDU0LCA2LCA0LCAxLCAwKSwKIAlSSzMwMzZfUExMX1JBVEUoICAyNzAwMDAwMCwgMSwgMjcsIDYsIDQsIDEsIDApLAogCXsgLyogc2VudGluZWwgKi8gfSwKQEAgLTExOCw2ICsxMjAsMTAgQEAKIAkJCQkJCSAgICAiY2xrX2NvcmVfYl9icGxsX3NyYyIsCiAJCQkJCQkgICAgImNsa19jb3JlX2JfZHBsbF9zcmMiLAogCQkJCQkJICAgICJjbGtfY29yZV9iX2dwbGxfc3JjIiB9OworUE5BTUUobXV4X2RkcmNsa19wKQkJCQk9IHsgImNsa19kZHJjX2xwbGxfc3JjIiwKKwkJCQkJCSAgICAiY2xrX2RkcmNfYnBsbF9zcmMiLAorCQkJCQkJICAgICJjbGtfZGRyY19kcGxsX3NyYyIsCisJCQkJCQkgICAgImNsa19kZHJjX2dwbGxfc3JjIiB9OwogUE5BTUUobXV4X2FjbGtfY2NpX3ApCQkJCT0geyAiY3BsbF9hY2xrX2NjaV9zcmMiLAogCQkJCQkJICAgICJncGxsX2FjbGtfY2NpX3NyYyIsCiAJCQkJCQkgICAgIm5wbGxfYWNsa19jY2lfc3JjIiwKQEAgLTM3Myw2ICszNzksNyBAQAogCVJLMzM5OV9DUFVDTEtCX1JBVEUoMjE4NDAwMDAwMCwgMSwgMTEsIDExKSwKIAlSSzMzOTlfQ1BVQ0xLQl9SQVRFKDIwODgwMDAwMDAsIDEsIDEwLCAxMCksCiAJUkszMzk5X0NQVUNMS0JfUkFURSgyMDQwMDAwMDAwLCAxLCAxMCwgMTApLAorCVJLMzM5OV9DUFVDTEtCX1JBVEUoMjAxNjAwMDAwMCwgMSwgOSwgOSksCiAJUkszMzk5X0NQVUNMS0JfUkFURSgxOTkyMDAwMDAwLCAxLCA5LCA5KSwKIAlSSzMzOTlfQ1BVQ0xLQl9SQVRFKDE4OTYwMDAwMDAsIDEsIDksIDkpLAogCVJLMzM5OV9DUFVDTEtCX1JBVEUoMTgwMDAwMDAwMCwgMSwgOCwgOCksCkBAIC01NzgsNyArNTg1LDcgQEAKIAlDT01QT1NJVEUoMCwgImNsa19zcGRpZl9kaXYiLCBtdXhfcGxsX3NyY19jcGxsX2dwbGxfcCwgMCwKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDMyKSwgNywgMSwgTUZMQUdTLCAwLCA3LCBERkxBR1MsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oOCksIDEzLCBHRkxBR1MpLAotCUNPTVBPU0lURV9GUkFDTVVYKDAsICJjbGtfc3BkaWZfZnJhYyIsICJjbGtfc3BkaWZfZGl2IiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwlDT01QT1NJVEVfRlJBQ01VWCgwLCAiY2xrX3NwZGlmX2ZyYWMiLCAiY2xrX3NwZGlmX2RpdiIsIDAsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTig5OSksIDAsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oOCksIDE0LCBHRkxBR1MsCiAJCQkmcmszMzk5X3NwZGlmX2ZyYWNtdXgpLApAQCAtNTkyLDcgKzU5OSw3IEBACiAJQ09NUE9TSVRFKDAsICJjbGtfaTJzMF9kaXYiLCBtdXhfcGxsX3NyY19jcGxsX2dwbGxfcCwgMCwKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDI4KSwgNywgMSwgTUZMQUdTLCAwLCA3LCBERkxBR1MsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oOCksIDMsIEdGTEFHUyksCi0JQ09NUE9TSVRFX0ZSQUNNVVgoMCwgImNsa19pMnMwX2ZyYWMiLCAiY2xrX2kyczBfZGl2IiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwlDT01QT1NJVEVfRlJBQ01VWCgwLCAiY2xrX2kyczBfZnJhYyIsICJjbGtfaTJzMF9kaXYiLCAwLAogCQkJUkszMzk5X0NMS1NFTF9DT04oOTYpLCAwLAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDgpLCA0LCBHRkxBR1MsCiAJCQkmcmszMzk5X2kyczBfZnJhY211eCksCkBAIC02MDIsNyArNjA5LDcgQEAKIAlDT01QT1NJVEUoMCwgImNsa19pMnMxX2RpdiIsIG11eF9wbGxfc3JjX2NwbGxfZ3BsbF9wLCAwLAogCQkJUkszMzk5X0NMS1NFTF9DT04oMjkpLCA3LCAxLCBNRkxBR1MsIDAsIDcsIERGTEFHUywKIAkJCVJLMzM5OV9DTEtHQVRFX0NPTig4KSwgNiwgR0ZMQUdTKSwKLQlDT01QT1NJVEVfRlJBQ01VWCgwLCAiY2xrX2kyczFfZnJhYyIsICJjbGtfaTJzMV9kaXYiLCBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCUNPTVBPU0lURV9GUkFDTVVYKDAsICJjbGtfaTJzMV9mcmFjIiwgImNsa19pMnMxX2RpdiIsIDAsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTig5NyksIDAsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oOCksIDcsIEdGTEFHUywKIAkJCSZyazMzOTlfaTJzMV9mcmFjbXV4KSwKQEAgLTYxMiw3ICs2MTksNyBAQAogCUNPTVBPU0lURSgwLCAiY2xrX2kyczJfZGl2IiwgbXV4X3BsbF9zcmNfY3BsbF9ncGxsX3AsIDAsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTigzMCksIDcsIDEsIE1GTEFHUywgMCwgNywgREZMQUdTLAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDgpLCA5LCBHRkxBR1MpLAotCUNPTVBPU0lURV9GUkFDTVVYKDAsICJjbGtfaTJzMl9mcmFjIiwgImNsa19pMnMyX2RpdiIsIENMS19TRVRfUkFURV9QQVJFTlQsCisJQ09NUE9TSVRFX0ZSQUNNVVgoMCwgImNsa19pMnMyX2ZyYWMiLCAiY2xrX2kyczJfZGl2IiwgMCwKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDk4KSwgMCwKIAkJCVJLMzM5OV9DTEtHQVRFX0NPTig4KSwgMTAsIEdGTEFHUywKIAkJCSZyazMzOTlfaTJzMl9mcmFjbXV4KSwKQEAgLTYzMSw3ICs2MzgsNyBAQAogCUNPTVBPU0lURV9OT01VWCgwLCAiY2xrX3VhcnQwX2RpdiIsICJjbGtfdWFydDBfc3JjIiwgMCwKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDMzKSwgMCwgNywgREZMQUdTLAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDkpLCAwLCBHRkxBR1MpLAotCUNPTVBPU0lURV9GUkFDTVVYKDAsICJjbGtfdWFydDBfZnJhYyIsICJjbGtfdWFydDBfZGl2IiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwlDT01QT1NJVEVfRlJBQ01VWCgwLCAiY2xrX3VhcnQwX2ZyYWMiLCAiY2xrX3VhcnQwX2RpdiIsIDAsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTigxMDApLCAwLAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDkpLCAxLCBHRkxBR1MsCiAJCQkmcmszMzk5X3VhcnQwX2ZyYWNtdXgpLApAQCAtNjQxLDcgKzY0OCw3IEBACiAJQ09NUE9TSVRFX05PTVVYKDAsICJjbGtfdWFydDFfZGl2IiwgImNsa191YXJ0X3NyYyIsIDAsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTigzNCksIDAsIDcsIERGTEFHUywKIAkJCVJLMzM5OV9DTEtHQVRFX0NPTig5KSwgMiwgR0ZMQUdTKSwKLQlDT01QT1NJVEVfRlJBQ01VWCgwLCAiY2xrX3VhcnQxX2ZyYWMiLCAiY2xrX3VhcnQxX2RpdiIsIENMS19TRVRfUkFURV9QQVJFTlQsCisJQ09NUE9TSVRFX0ZSQUNNVVgoMCwgImNsa191YXJ0MV9mcmFjIiwgImNsa191YXJ0MV9kaXYiLCAwLAogCQkJUkszMzk5X0NMS1NFTF9DT04oMTAxKSwgMCwKIAkJCVJLMzM5OV9DTEtHQVRFX0NPTig5KSwgMywgR0ZMQUdTLAogCQkJJnJrMzM5OV91YXJ0MV9mcmFjbXV4KSwKQEAgLTY0OSw3ICs2NTYsNyBAQAogCUNPTVBPU0lURV9OT01VWCgwLCAiY2xrX3VhcnQyX2RpdiIsICJjbGtfdWFydF9zcmMiLCAwLAogCQkJUkszMzk5X0NMS1NFTF9DT04oMzUpLCAwLCA3LCBERkxBR1MsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oOSksIDQsIEdGTEFHUyksCi0JQ09NUE9TSVRFX0ZSQUNNVVgoMCwgImNsa191YXJ0Ml9mcmFjIiwgImNsa191YXJ0Ml9kaXYiLCBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCUNPTVBPU0lURV9GUkFDTVVYKDAsICJjbGtfdWFydDJfZnJhYyIsICJjbGtfdWFydDJfZGl2IiwgMCwKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDEwMiksIDAsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oOSksIDUsIEdGTEFHUywKIAkJCSZyazMzOTlfdWFydDJfZnJhY211eCksCkBAIC02NTcsNyArNjY0LDcgQEAKIAlDT01QT1NJVEVfTk9NVVgoMCwgImNsa191YXJ0M19kaXYiLCAiY2xrX3VhcnRfc3JjIiwgMCwKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDM2KSwgMCwgNywgREZMQUdTLAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDkpLCA2LCBHRkxBR1MpLAotCUNPTVBPU0lURV9GUkFDTVVYKDAsICJjbGtfdWFydDNfZnJhYyIsICJjbGtfdWFydDNfZGl2IiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwlDT01QT1NJVEVfRlJBQ01VWCgwLCAiY2xrX3VhcnQzX2ZyYWMiLCAiY2xrX3VhcnQzX2RpdiIsIDAsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTigxMDMpLCAwLAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDkpLCA3LCBHRkxBR1MsCiAJCQkmcmszMzk5X3VhcnQzX2ZyYWNtdXgpLApAQCAtODMzLDkgKzg0MCw5IEBACiAKIAkvKiBwZXJpaHAgKi8KIAlHQVRFKDAsICJjcGxsX2FjbGtfcGVyaWhwX3NyYyIsICJjcGxsIiwgQ0xLX0lHTk9SRV9VTlVTRUQsCi0JCQlSSzMzOTlfQ0xLR0FURV9DT04oNSksIDAsIEdGTEFHUyksCi0JR0FURSgwLCAiZ3BsbF9hY2xrX3BlcmlocF9zcmMiLCAiZ3BsbCIsIENMS19JR05PUkVfVU5VU0VELAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDUpLCAxLCBHRkxBR1MpLAorCUdBVEUoMCwgImdwbGxfYWNsa19wZXJpaHBfc3JjIiwgImdwbGwiLCBDTEtfSUdOT1JFX1VOVVNFRCwKKwkJCVJLMzM5OV9DTEtHQVRFX0NPTig1KSwgMCwgR0ZMQUdTKSwKIAlDT01QT1NJVEUoQUNMS19QRVJJSFAsICJhY2xrX3BlcmlocCIsIG11eF9hY2xrX3BlcmlocF9wLCBDTEtfSUdOT1JFX1VOVVNFRCwKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDE0KSwgNywgMSwgTUZMQUdTLCAwLCA1LCBERkxBR1MsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oNSksIDIsIEdGTEFHUyksCkBAIC04NDYsOSArODUzLDkgQEAKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDE0KSwgMTIsIDIsIERGTEFHUywKIAkJCVJLMzM5OV9DTEtHQVRFX0NPTig1KSwgNCwgR0ZMQUdTKSwKIAotCUdBVEUoQUNMS19QRVJGX1BDSUUsICJhY2xrX3BlcmZfcGNpZSIsICJhY2xrX3BlcmlocCIsIENMS19JR05PUkVfVU5VU0VELAorCUdBVEUoQUNMS19QRVJGX1BDSUUsICJhY2xrX3BlcmZfcGNpZSIsICJhY2xrX3BlcmlocCIsIDAsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oMjApLCAyLCBHRkxBR1MpLAotCUdBVEUoQUNMS19QQ0lFLCAiYWNsa19wY2llIiwgImFjbGtfcGVyaWhwIiwgQ0xLX0lHTk9SRV9VTlVTRUQsCisJR0FURShBQ0xLX1BDSUUsICJhY2xrX3BjaWUiLCAiYWNsa19wZXJpaHAiLCAwLAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDIwKSwgMTAsIEdGTEFHUyksCiAJR0FURSgwLCAiYWNsa19wZXJpaHBfbm9jIiwgImFjbGtfcGVyaWhwIiwgQ0xLX0lHTk9SRV9VTlVTRUQsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oMjApLCAxMiwgR0ZMQUdTKSwKQEAgLTkyMyw5ICs5MzAsOSBAQAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDYpLCAxNCwgR0ZMQUdTKSwKIAogCUdBVEUoMCwgImNwbGxfYWNsa19lbW1jX3NyYyIsICJjcGxsIiwgQ0xLX0lHTk9SRV9VTlVTRUQsCi0JCQlSSzMzOTlfQ0xLR0FURV9DT04oNiksIDEyLCBHRkxBR1MpLAotCUdBVEUoMCwgImdwbGxfYWNsa19lbW1jX3NyYyIsICJncGxsIiwgQ0xLX0lHTk9SRV9VTlVTRUQsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oNiksIDEzLCBHRkxBR1MpLAorCUdBVEUoMCwgImdwbGxfYWNsa19lbW1jX3NyYyIsICJncGxsIiwgQ0xLX0lHTk9SRV9VTlVTRUQsCisJCQlSSzMzOTlfQ0xLR0FURV9DT04oNiksIDEyLCBHRkxBR1MpLAogCUNPTVBPU0lURV9OT0dBVEUoQUNMS19FTU1DLCAiYWNsa19lbW1jIiwgbXV4X2FjbGtfZW1tY19wLCBDTEtfSUdOT1JFX1VOVVNFRCwKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDIxKSwgNywgMSwgTUZMQUdTLCAwLCA1LCBERkxBR1MpLAogCUdBVEUoQUNMS19FTU1DX0NPUkUsICJhY2xrX2VtbWNjb3JlIiwgImFjbGtfZW1tYyIsIENMS19JR05PUkVfVU5VU0VELApAQCAtMTA3MSw3ICsxMDc4LDcgQEAKIAkvKiB2aW8gKi8KIAlDT01QT1NJVEUoQUNMS19WSU8sICJhY2xrX3ZpbyIsIG11eF9wbGxfc3JjX2NwbGxfZ3BsbF9wcGxsX3AsIENMS19JR05PUkVfVU5VU0VELAogCQkJUkszMzk5X0NMS1NFTF9DT04oNDIpLCA2LCAyLCBNRkxBR1MsIDAsIDUsIERGTEFHUywKLQkJCVJLMzM5OV9DTEtHQVRFX0NPTigxMSksIDEwLCBHRkxBR1MpLAorCQkJUkszMzk5X0NMS0dBVEVfQ09OKDExKSwgMCwgR0ZMQUdTKSwKIAlDT01QT1NJVEVfTk9NVVgoUENMS19WSU8sICJwY2xrX3ZpbyIsICJhY2xrX3ZpbyIsIDAsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTig0MyksIDAsIDUsIERGTEFHUywKIAkJCVJLMzM5OV9DTEtHQVRFX0NPTigxMSksIDEsIEdGTEFHUyksCkBAIC0xMTYxLDcgKzExNjgsNyBAQAogCQkJUkszMzk5X0NMS1NFTF9DT04oNDkpLCA4LCAyLCBNRkxBR1MsIDAsIDgsIERGTEFHUywKIAkJCVJLMzM5OV9DTEtHQVRFX0NPTigxMCksIDEyLCBHRkxBR1MpLAogCi0JQ09NUE9TSVRFX0ZSQUNNVVhfTk9HQVRFKDAsICJkY2xrX3ZvcDBfZnJhYyIsICJkY2xrX3ZvcDBfZGl2IiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwlDT01QT1NJVEVfRlJBQ01VWF9OT0dBVEUoRENMS19WT1AwX0ZSQUMsICJkY2xrX3ZvcDBfZnJhYyIsICJkY2xrX3ZvcDBfZGl2IiwgMCwKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDEwNiksIDAsCiAJCQkmcmszMzk5X2RjbGtfdm9wMF9mcmFjbXV4KSwKIApAQCAtMTE5MSw3ICsxMTk4LDcgQEAKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDUwKSwgOCwgMiwgTUZMQUdTLCAwLCA4LCBERkxBR1MsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oMTApLCAxMywgR0ZMQUdTKSwKIAotCUNPTVBPU0lURV9GUkFDTVVYX05PR0FURSgwLCAiZGNsa192b3AxX2ZyYWMiLCAiZGNsa192b3AxX2RpdiIsIENMS19TRVRfUkFURV9QQVJFTlQsCisJQ09NUE9TSVRFX0ZSQUNNVVhfTk9HQVRFKERDTEtfVk9QMV9GUkFDLCAiZGNsa192b3AxX2ZyYWMiLCAiZGNsa192b3AxX2RpdiIsIDAsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTigxMDcpLCAwLAogCQkJJnJrMzM5OV9kY2xrX3ZvcDFfZnJhY211eCksCiAKQEAgLTEzMDUsNyArMTMxMiw3IEBACiAJLyogdGVzdG91dCAqLwogCU1VWCgwLCAiY2xrX3Rlc3RfcHJlIiwgbXV4X3BsbF9zcmNfY3BsbF9ncGxsX3AsIENMS19TRVRfUkFURV9QQVJFTlQsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTig1OCksIDcsIDEsIE1GTEFHUyksCi0JQ09NUE9TSVRFX0ZSQUMoMCwgImNsa190ZXN0X2ZyYWMiLCAiY2xrX3Rlc3RfcHJlIiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwlDT01QT1NJVEVfRlJBQygwLCAiY2xrX3Rlc3RfZnJhYyIsICJjbGtfdGVzdF9wcmUiLCAwLAogCQkJUkszMzk5X0NMS1NFTF9DT04oMTA1KSwgMCwKIAkJCVJLMzM5OV9DTEtHQVRFX0NPTigxMyksIDksIEdGTEFHUyksCiAKQEAgLTEzNzcsNiArMTM4NCwxOCBAQAogCUNPTVBPU0lURV9OT01VWCgwLCAiY2xrX3Rlc3QiLCAiY2xrX3Rlc3RfcHJlIiwgQ0xLX0lHTk9SRV9VTlVTRUQsCiAJCQlSSzMzNjhfQ0xLU0VMX0NPTig1OCksIDAsIDUsIERGTEFHUywKIAkJCVJLMzM2OF9DTEtHQVRFX0NPTigxMyksIDExLCBHRkxBR1MpLAorCisJLyogZGRyYyAqLworCUdBVEUoMCwgImNsa19kZHJjX2xwbGxfc3JjIiwgImxwbGwiLCAwLCBSSzMzOTlfQ0xLR0FURV9DT04oMyksCisJICAgICAwLCBHRkxBR1MpLAorCUdBVEUoMCwgImNsa19kZHJjX2JwbGxfc3JjIiwgImJwbGwiLCAwLCBSSzMzOTlfQ0xLR0FURV9DT04oMyksCisJICAgICAxLCBHRkxBR1MpLAorCUdBVEUoMCwgImNsa19kZHJjX2RwbGxfc3JjIiwgImRwbGwiLCAwLCBSSzMzOTlfQ0xLR0FURV9DT04oMyksCisJICAgICAyLCBHRkxBR1MpLAorCUdBVEUoMCwgImNsa19kZHJjX2dwbGxfc3JjIiwgImdwbGwiLCAwLCBSSzMzOTlfQ0xLR0FURV9DT04oMyksCisJICAgICAzLCBHRkxBR1MpLAorCUNPTVBPU0lURV9ERFJDTEsoU0NMS19ERFJDLCAic2Nsa19kZHJjIiwgbXV4X2RkcmNsa19wLCAwLAorCQkgICAgICAgUkszMzk5X0NMS1NFTF9DT04oNiksIDQsIDIsIDAsIDAsIFJPQ0tDSElQX0REUkNMS19TSVApLAogfTsKIAogc3RhdGljIHN0cnVjdCByb2NrY2hpcF9jbGtfYnJhbmNoIHJrMzM5OV9jbGtfcG11X2JyYW5jaGVzW10gX19pbml0ZGF0YSA9IHsKQEAgLTEzOTgsNyArMTQxNyw3IEBACiAJCQlSSzMzOTlfUE1VX0NMS1NFTF9DT04oMSksIDEzLCAxLCBNRkxBR1MsIDgsIDUsIERGTEFHUywKIAkJCVJLMzM5OV9QTVVfQ0xLR0FURV9DT04oMCksIDgsIEdGTEFHUyksCiAKLQlDT01QT1NJVEVfRlJBQ01VWF9OT0dBVEUoMCwgImNsa193aWZpX2ZyYWMiLCAiY2xrX3dpZmlfZGl2IiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwlDT01QT1NJVEVfRlJBQ01VWF9OT0dBVEUoMCwgImNsa193aWZpX2ZyYWMiLCAiY2xrX3dpZmlfZGl2IiwgMCwKIAkJCVJLMzM5OV9QTVVfQ0xLU0VMX0NPTig3KSwgMCwKIAkJCSZyazMzOTlfcG11Y2xrX3dpZmlfZnJhY211eCksCiAKQEAgLTE0MjYsNyArMTQ0NSw3IEBACiAJCQlSSzMzOTlfUE1VX0NMS1NFTF9DT04oNSksIDEwLCAxLCBNRkxBR1MsIDAsIDcsIERGTEFHUywKIAkJCVJLMzM5OV9QTVVfQ0xLR0FURV9DT04oMCksIDUsIEdGTEFHUyksCiAKLQlDT01QT1NJVEVfRlJBQ01VWCgwLCAiY2xrX3VhcnQ0X2ZyYWMiLCAiY2xrX3VhcnQ0X2RpdiIsIENMS19TRVRfUkFURV9QQVJFTlQsCisJQ09NUE9TSVRFX0ZSQUNNVVgoMCwgImNsa191YXJ0NF9mcmFjIiwgImNsa191YXJ0NF9kaXYiLCAwLAogCQkJUkszMzk5X1BNVV9DTEtTRUxfQ09OKDYpLCAwLAogCQkJUkszMzk5X1BNVV9DTEtHQVRFX0NPTigwKSwgNiwgR0ZMQUdTLAogCQkJJnJrMzM5OV91YXJ0NF9wbXVfZnJhY211eCksCkBAIC0xNDY4LDYgKzE0ODcsOSBAQAogCSJhY2xrX2NjaV9wcmUiLAogCSJhY2xrX2dpYyIsCiAJImFjbGtfZ2ljX25vYyIsCisJImFjbGtfaGRjcF9ub2MiLAorCSJoY2xrX2hkY3Bfbm9jIiwKKwkicGNsa19oZGNwX25vYyIsCiAJInBjbGtfcGVyaWxwMCIsCiAJInBjbGtfcGVyaWxwMCIsCiAJImhjbGtfcGVyaWxwMCIsCkBAIC0xNDg0LDkgKzE1MDYsMTQgQEAKIAkiaGNsa19wZXJpbHAxIiwKIAkiaGNsa19wZXJpbHAxX25vYyIsCiAJImFjbGtfZG1hYzBfcGVyaWxwIiwKKwkiYWNsa19lbW1jX25vYyIsCiAJImdwbGxfaGNsa19wZXJpbHAxX3NyYyIsCiAJImdwbGxfYWNsa19wZXJpbHAwX3NyYyIsCiAJImdwbGxfYWNsa19wZXJpaHBfc3JjIiwKKwkiYWNsa192aW9fbm9jIiwKKworCS8qIGRkcmMgKi8KKwkic2Nsa19kZHJjIgogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHJrMzM5OV9wbXVjcnVfY3JpdGljYWxfY2xvY2tzW10gX19pbml0Y29uc3QgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGstcm9ja2NoaXAuYyBiL2RyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay1yb2NrY2hpcC5jCmluZGV4IDRjZjgzOGQ1Li4yYzliYjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGstcm9ja2NoaXAuYworKysgYi9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGstcm9ja2NoaXAuYwpAQCAtNDksMTQgKzQ5LDE5IEBACiAJfQogCiAJcmVnID0gb2ZfaW9tYXAobm9kZSwgMCk7CisJaWYgKCFyZWcpCisJCXJldHVybjsKIAogCWNsa19kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNsa19vbmVjZWxsX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNsa19kYXRhKQorCWlmICghY2xrX2RhdGEpIHsKKwkJaW91bm1hcChyZWcpOwogCQlyZXR1cm47CisJfQogCiAJY2xrX2RhdGEtPmNsa3MgPSBremFsbG9jKHF0eSAqIHNpemVvZihzdHJ1Y3QgY2xrICopLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNsa19kYXRhLT5jbGtzKSB7CiAJCWtmcmVlKGNsa19kYXRhKTsKKwkJaW91bm1hcChyZWcpOwogCQlyZXR1cm47CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGsuYyBiL2RyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay5jCmluZGV4IDdmZmQxMzQuLmI4ODZiZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay5jCisrKyBiL2RyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay5jCkBAIC0zODUsNyArMzg1LDcgQEAKIAkJCQlsaXN0LT5jb25fb2Zmc2V0LCBncmZfbG9ja19vZmZzZXQsCiAJCQkJbGlzdC0+bG9ja19zaGlmdCwgbGlzdC0+bW9kZV9vZmZzZXQsCiAJCQkJbGlzdC0+bW9kZV9zaGlmdCwgbGlzdC0+cmF0ZV90YWJsZSwKLQkJCQlsaXN0LT5wbGxfZmxhZ3MpOworCQkJCWxpc3QtPmZsYWdzLCBsaXN0LT5wbGxfZmxhZ3MpOwogCQlpZiAoSVNfRVJSKGNsaykpIHsKIAkJCXByX2VycigiJXM6IGZhaWxlZCB0byByZWdpc3RlciBjbG9jayAlc1xuIiwgX19mdW5jX18sCiAJCQkJbGlzdC0+bmFtZSk7CkBAIC00ODQsNiArNDg0LDE1IEBACiAJCQkJbGlzdC0+Z2F0ZV9vZmZzZXQsIGxpc3QtPmdhdGVfc2hpZnQsCiAJCQkJbGlzdC0+Z2F0ZV9mbGFncywgZmxhZ3MsICZjdHgtPmxvY2spOwogCQkJYnJlYWs7CisJCWNhc2UgYnJhbmNoX2RkcmNsazoKKwkJCWNsayA9IHJvY2tjaGlwX2Nsa19yZWdpc3Rlcl9kZHJjbGsoCisJCQkJbGlzdC0+bmFtZSwgbGlzdC0+ZmxhZ3MsCisJCQkJbGlzdC0+cGFyZW50X25hbWVzLCBsaXN0LT5udW1fcGFyZW50cywKKwkJCQlsaXN0LT5tdXhkaXZfb2Zmc2V0LCBsaXN0LT5tdXhfc2hpZnQsCisJCQkJbGlzdC0+bXV4X3dpZHRoLCBsaXN0LT5kaXZfc2hpZnQsCisJCQkJbGlzdC0+ZGl2X3dpZHRoLCBsaXN0LT5kaXZfZmxhZ3MsCisJCQkJY3R4LT5yZWdfYmFzZSwgJmN0eC0+bG9jayk7CisJCQlicmVhazsKIAkJfQogCiAJCS8qIG5vbmUgb2YgdGhlIGNhc2VzIGFib3ZlIG1hdGNoZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay5oIGIvZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLmgKaW5kZXggMjE5NGZmYS4uMTY1M2VkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLmgKKysrIGIvZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLmgKQEAgLTIzOCw3ICsyMzgsNyBAQAogCQl1OCBudW1fcGFyZW50cywgaW50IGNvbl9vZmZzZXQsIGludCBncmZfbG9ja19vZmZzZXQsCiAJCWludCBsb2NrX3NoaWZ0LCBpbnQgbW9kZV9vZmZzZXQsIGludCBtb2RlX3NoaWZ0LAogCQlzdHJ1Y3Qgcm9ja2NoaXBfcGxsX3JhdGVfdGFibGUgKnJhdGVfdGFibGUsCi0JCXU4IGNsa19wbGxfZmxhZ3MpOworCQl1bnNpZ25lZCBsb25nIGZsYWdzLCB1OCBjbGtfcGxsX2ZsYWdzKTsKIAogc3RydWN0IHJvY2tjaGlwX2NwdWNsa19jbGtzZWwgewogCWludCByZWc7CkBAIC0yODEsNiArMjgxLDIwIEBACiAJCQkJY29uc3QgY2hhciAqY29uc3QgKnBhcmVudF9uYW1lcywgdTggbnVtX3BhcmVudHMsCiAJCQkJdm9pZCBfX2lvbWVtICpyZWcsIGludCBzaGlmdCk7CiAKKy8qCisgKiBERFJDTEsgZmxhZ3MsIGluY2x1ZGluZyBtZXRob2Qgb2Ygc2V0dGluZyB0aGUgcmF0ZQorICogUk9DS0NISVBfRERSQ0xLX1NJUDogdXNlIFNJUCBjYWxsIHRvIGJsMzEgdG8gY2hhbmdlIGRkcmNsayByYXRlLgorICovCisjZGVmaW5lIFJPQ0tDSElQX0REUkNMS19TSVAJCUJJVCgwKQorCitzdHJ1Y3QgY2xrICpyb2NrY2hpcF9jbGtfcmVnaXN0ZXJfZGRyY2xrKGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncywKKwkJCQkJIGNvbnN0IGNoYXIgKmNvbnN0ICpwYXJlbnRfbmFtZXMsCisJCQkJCSB1OCBudW1fcGFyZW50cywgaW50IG11eF9vZmZzZXQsCisJCQkJCSBpbnQgbXV4X3NoaWZ0LCBpbnQgbXV4X3dpZHRoLAorCQkJCQkgaW50IGRpdl9zaGlmdCwgaW50IGRpdl93aWR0aCwKKwkJCQkJIGludCBkZHJfZmxhZ3MsIHZvaWQgX19pb21lbSAqcmVnX2Jhc2UsCisJCQkJCSBzcGlubG9ja190ICpsb2NrKTsKKwogI2RlZmluZSBST0NLQ0hJUF9JTlZFUlRFUl9ISVdPUkRfTUFTSwlCSVQoMCkKIAogc3RydWN0IGNsayAqcm9ja2NoaXBfY2xrX3JlZ2lzdGVyX2ludmVydGVyKGNvbnN0IGNoYXIgKm5hbWUsCkBAIC0yOTksNiArMzEzLDcgQEAKIAlicmFuY2hfbW1jLAogCWJyYW5jaF9pbnZlcnRlciwKIAlicmFuY2hfZmFjdG9yLAorCWJyYW5jaF9kZHJjbGssCiB9OwogCiBzdHJ1Y3Qgcm9ja2NoaXBfY2xrX2JyYW5jaCB7CkBAIC00ODgsNiArNTAzLDI0IEBACiAJCS5jaGlsZAkJPSBjaCwJCQkJXAogCX0KIAorI2RlZmluZSBDT01QT1NJVEVfRERSQ0xLKF9pZCwgY25hbWUsIHBuYW1lcywgZiwgbW8sIG1zLCBtdywJXAorCQkJIGRzLCBkdywgZGYpCQkJCVwKKwl7CQkJCQkJCVwKKwkJLmlkCQk9IF9pZCwJCQkJXAorCQkuYnJhbmNoX3R5cGUJPSBicmFuY2hfZGRyY2xrLAkJXAorCQkubmFtZQkJPSBjbmFtZSwJCQlcCisJCS5wYXJlbnRfbmFtZXMJPSBwbmFtZXMsCQkJXAorCQkubnVtX3BhcmVudHMJPSBBUlJBWV9TSVpFKHBuYW1lcyksCQlcCisJCS5mbGFncwkJPSBmLAkJCQlcCisJCS5tdXhkaXZfb2Zmc2V0ICA9IG1vLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJLm11eF9zaGlmdCAgICAgID0gbXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkubXV4X3dpZHRoICAgICAgPSBtdywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCS5kaXZfc2hpZnQgICAgICA9IGRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJLmRpdl93aWR0aCAgICAgID0gZHcsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkuZGl2X2ZsYWdzCT0gZGYsCQkJCVwKKwkJLmdhdGVfb2Zmc2V0ICAgID0gLTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0KKwogI2RlZmluZSBNVVgoX2lkLCBjbmFtZSwgcG5hbWVzLCBmLCBvLCBzLCB3LCBtZikJCQlcCiAJewkJCQkJCQlcCiAJCS5pZAkJPSBfaWQsCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLWV4eW5vcy1hdWRzcy5jIGIvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZXh5bm9zLWF1ZHNzLmMKaW5kZXggYmRmOGI5Ny4uNTFkMTUyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZXh5bm9zLWF1ZHNzLmMKKysrIGIvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZXh5bm9zLWF1ZHNzLmMKQEAgLTE0LDE4ICsxNCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svZXh5bm9zLWF1ZHNzLWNsay5oPgogCi1lbnVtIGV4eW5vc19hdWRzc19jbGtfdHlwZSB7Ci0JVFlQRV9FWFlOT1M0MjEwLAotCVRZUEVfRVhZTk9TNTI1MCwKLQlUWVBFX0VYWU5PUzU0MjAsCi19OwotCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvY2spOwogc3RhdGljIHN0cnVjdCBjbGsgKipjbGtfdGFibGU7CiBzdGF0aWMgdm9pZCBfX2lvbWVtICpyZWdfYmFzZTsKQEAgLTQ0LDkgKzM5LDkgQEAKIAogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVnX3NhdmVbXVsyXSA9IHsKLQl7QVNTX0NMS19TUkMsICAwfSwKLQl7QVNTX0NMS19ESVYsICAwfSwKLQl7QVNTX0NMS19HQVRFLCAwfSwKKwl7IEFTU19DTEtfU1JDLCAgMCB9LAorCXsgQVNTX0NMS19ESVYsICAwIH0sCisJeyBBU1NfQ0xLX0dBVEUsIDAgfSwKIH07CiAKIHN0YXRpYyBpbnQgZXh5bm9zX2F1ZHNzX2Nsa19zdXNwZW5kKHZvaWQpCkBAIC03MywxNCArNjgsNDMgQEAKIH07CiAjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCiAKK3N0cnVjdCBleHlub3NfYXVkc3NfY2xrX2RydmRhdGEgeworCXVuc2lnbmVkIGludCBoYXNfYWRtYV9jbGs6MTsKKwl1bnNpZ25lZCBpbnQgaGFzX21zdF9jbGs6MTsKKwl1bnNpZ25lZCBpbnQgZW5hYmxlX2VwbGw6MTsKKwl1bnNpZ25lZCBpbnQgbnVtX2Nsa3M7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGV4eW5vc19hdWRzc19jbGtfZHJ2ZGF0YSBleHlub3M0MjEwX2RydmRhdGEgPSB7CisJLm51bV9jbGtzCT0gRVhZTk9TX0FVRFNTX01BWF9DTEtTIC0gMSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXh5bm9zX2F1ZHNzX2Nsa19kcnZkYXRhIGV4eW5vczU0MTBfZHJ2ZGF0YSA9IHsKKwkubnVtX2Nsa3MJPSBFWFlOT1NfQVVEU1NfTUFYX0NMS1MgLSAxLAorCS5oYXNfbXN0X2Nsawk9IDEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGV4eW5vc19hdWRzc19jbGtfZHJ2ZGF0YSBleHlub3M1NDIwX2RydmRhdGEgPSB7CisJLm51bV9jbGtzCT0gRVhZTk9TX0FVRFNTX01BWF9DTEtTLAorCS5oYXNfYWRtYV9jbGsJPSAxLAorCS5lbmFibGVfZXBsbAk9IDEsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBleHlub3NfYXVkc3NfY2xrX29mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczQyMTAtYXVkc3MtY2xvY2siLAotCSAgLmRhdGEgPSAodm9pZCAqKVRZUEVfRVhZTk9TNDIxMCwgfSwKLQl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTI1MC1hdWRzcy1jbG9jayIsCi0JICAuZGF0YSA9ICh2b2lkICopVFlQRV9FWFlOT1M1MjUwLCB9LAotCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1NDIwLWF1ZHNzLWNsb2NrIiwKLQkgIC5kYXRhID0gKHZvaWQgKilUWVBFX0VYWU5PUzU0MjAsIH0sCi0Je30sCisJeworCQkuY29tcGF0aWJsZQk9ICJzYW1zdW5nLGV4eW5vczQyMTAtYXVkc3MtY2xvY2siLAorCQkuZGF0YQkJPSAmZXh5bm9zNDIxMF9kcnZkYXRhLAorCX0sIHsKKwkJLmNvbXBhdGlibGUJPSAic2Ftc3VuZyxleHlub3M1MjUwLWF1ZHNzLWNsb2NrIiwKKwkJLmRhdGEJCT0gJmV4eW5vczQyMTBfZHJ2ZGF0YSwKKwl9LCB7CisJCS5jb21wYXRpYmxlCT0gInNhbXN1bmcsZXh5bm9zNTQxMC1hdWRzcy1jbG9jayIsCisJCS5kYXRhCQk9ICZleHlub3M1NDEwX2RydmRhdGEsCisJfSwgeworCQkuY29tcGF0aWJsZQk9ICJzYW1zdW5nLGV4eW5vczU0MjAtYXVkc3MtY2xvY2siLAorCQkuZGF0YQkJPSAmZXh5bm9zNTQyMF9kcnZkYXRhLAorCX0sCisJeyB9LAogfTsKIAogc3RhdGljIHZvaWQgZXh5bm9zX2F1ZHNzX2Nsa190ZWFyZG93bih2b2lkKQpAQCAtMTA2LDE5ICsxMzAsMTcgQEAKIC8qIHJlZ2lzdGVyIGV4eW5vc19hdWRzcyBjbG9ja3MgKi8KIHN0YXRpYyBpbnQgZXh5bm9zX2F1ZHNzX2Nsa19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCWludCBpLCByZXQgPSAwOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWNvbnN0IGNoYXIgKm1vdXRfYXVkc3NfcFtdID0geyJmaW5fcGxsIiwgImZvdXRfZXBsbCJ9OwogCWNvbnN0IGNoYXIgKm1vdXRfaTJzX3BbXSA9IHsibW91dF9hdWRzcyIsICJjZGNsazAiLCAic2Nsa19hdWRpbzAifTsKIAljb25zdCBjaGFyICpzY2xrX3BjbV9wID0gInNjbGtfcGNtMCI7CiAJc3RydWN0IGNsayAqcGxsX3JlZiwgKnBsbF9pbiwgKmNkY2xrLCAqc2Nsa19hdWRpbywgKnNjbGtfcGNtX2luOwotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwotCWVudW0gZXh5bm9zX2F1ZHNzX2Nsa190eXBlIHZhcmlhbnQ7CisJY29uc3Qgc3RydWN0IGV4eW5vc19hdWRzc19jbGtfZHJ2ZGF0YSAqdmFyaWFudDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaSwgcmV0ID0gMDsKIAotCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShleHlub3NfYXVkc3NfY2xrX29mX21hdGNoLCBwZGV2LT5kZXYub2Zfbm9kZSk7Ci0JaWYgKCFtYXRjaCkKKwl2YXJpYW50ID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKCZwZGV2LT5kZXYpOworCWlmICghdmFyaWFudCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JdmFyaWFudCA9IChlbnVtIGV4eW5vc19hdWRzc19jbGtfdHlwZSltYXRjaC0+ZGF0YTsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJcmVnX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKQEAgLTEyNiw3ICsxNDgsNyBAQAogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gbWFwIGF1ZHNzIHJlZ2lzdGVyc1xuIik7CiAJCXJldHVybiBQVFJfRVJSKHJlZ19iYXNlKTsKIAl9Ci0JLyogRVBMTCBkb24ndCBoYXZlIHRvIGJlIGVuYWJsZWQgZm9yIGJvYXJkcyBvdGhlciB0aGFuIEV4eW5vczU0MjAgKi8KKwogCWVwbGwgPSBFUlJfUFRSKC1FTk9ERVYpOwogCiAJY2xrX3RhYmxlID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCkBAIC0xMzYsMTAgKzE1OCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJY2xrX2RhdGEuY2xrcyA9IGNsa190YWJsZTsKLQlpZiAodmFyaWFudCA9PSBUWVBFX0VYWU5PUzU0MjApCi0JCWNsa19kYXRhLmNsa19udW0gPSBFWFlOT1NfQVVEU1NfTUFYX0NMS1M7Ci0JZWxzZQotCQljbGtfZGF0YS5jbGtfbnVtID0gRVhZTk9TX0FVRFNTX01BWF9DTEtTIC0gMTsKKwljbGtfZGF0YS5jbGtfbnVtID0gdmFyaWFudC0+bnVtX2Nsa3M7CiAKIAlwbGxfcmVmID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJwbGxfcmVmIik7CiAJcGxsX2luID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJwbGxfaW4iKTsKQEAgLTE0OCwxMyArMTY3LDEzIEBACiAJaWYgKCFJU19FUlIocGxsX2luKSkgewogCQltb3V0X2F1ZHNzX3BbMV0gPSBfX2Nsa19nZXRfbmFtZShwbGxfaW4pOwogCi0JCWlmICh2YXJpYW50ID09IFRZUEVfRVhZTk9TNTQyMCkgeworCQlpZiAodmFyaWFudC0+ZW5hYmxlX2VwbGwpIHsKIAkJCWVwbGwgPSBwbGxfaW47CiAKIAkJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShlcGxsKTsKIAkJCWlmIChyZXQpIHsKIAkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJCQkiZmFpbGVkIHRvIHByZXBhcmUgdGhlIGVwbGwgY2xvY2tcbiIpOworCQkJCQkiZmFpbGVkIHRvIHByZXBhcmUgdGhlIGVwbGwgY2xvY2tcbiIpOwogCQkJCXJldHVybiByZXQ7CiAJCQl9CiAJCX0KQEAgLTIxMCw3ICsyMjksNyBAQAogCQkJCXNjbGtfcGNtX3AsIENMS19TRVRfUkFURV9QQVJFTlQsCiAJCQkJcmVnX2Jhc2UgKyBBU1NfQ0xLX0dBVEUsIDUsIDAsICZsb2NrKTsKIAotCWlmICh2YXJpYW50ID09IFRZUEVfRVhZTk9TNTQyMCkgeworCWlmICh2YXJpYW50LT5oYXNfYWRtYV9jbGspIHsKIAkJY2xrX3RhYmxlW0VYWU5PU19BRE1BXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJhZG1hIiwKIAkJCQkiZG91dF9zcnAiLCBDTEtfU0VUX1JBVEVfUEFSRU5ULAogCQkJCXJlZ19iYXNlICsgQVNTX0NMS19HQVRFLCA5LCAwLCAmbG9jayk7CkBAIC0yMzQsOSArMjUzLDYgQEAKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIAlyZWdpc3Rlcl9zeXNjb3JlX29wcygmZXh5bm9zX2F1ZHNzX2Nsa19zeXNjb3JlX29wcyk7CiAjZW5kaWYKLQotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJzZXR1cCBjb21wbGV0ZWRcbiIpOwotCiAJcmV0dXJuIDA7CiAKIHVucmVnaXN0ZXI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1leHlub3M1MjYwLmMgYi9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1leHlub3M1MjYwLmMKaW5kZXggYTQzNjQyYy4uZmQxZDliZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZXh5bm9zNTI2MC5jCisrKyBiL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLWV4eW5vczUyNjAuYwpAQCAtMTMxLDIxICsxMzEsMjEgQEAKIAkJCUVOX0lQX0FVRCwgNCwgMCwgMCksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfY211X2luZm8gYXVkX2NtdSBfX2luaXRjb25zdCA9IHsKKwkubXV4X2Nsa3MJPSBhdWRfbXV4X2Nsa3MsCisJLm5yX211eF9jbGtzCT0gQVJSQVlfU0laRShhdWRfbXV4X2Nsa3MpLAorCS5kaXZfY2xrcwk9IGF1ZF9kaXZfY2xrcywKKwkubnJfZGl2X2Nsa3MJPSBBUlJBWV9TSVpFKGF1ZF9kaXZfY2xrcyksCisJLmdhdGVfY2xrcwk9IGF1ZF9nYXRlX2Nsa3MsCisJLm5yX2dhdGVfY2xrcwk9IEFSUkFZX1NJWkUoYXVkX2dhdGVfY2xrcyksCisJLm5yX2Nsa19pZHMJPSBBVURfTlJfQ0xLLAorCS5jbGtfcmVncwk9IGF1ZF9jbGtfcmVncywKKwkubnJfY2xrX3JlZ3MJPSBBUlJBWV9TSVpFKGF1ZF9jbGtfcmVncyksCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgZXh5bm9zNTI2MF9jbGtfYXVkX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3Qgc2Ftc3VuZ19jbXVfaW5mbyBjbXUgPSB7IE5VTEwgfTsKLQotCWNtdS5tdXhfY2xrcyA9IGF1ZF9tdXhfY2xrczsKLQljbXUubnJfbXV4X2Nsa3MgPSBBUlJBWV9TSVpFKGF1ZF9tdXhfY2xrcyk7Ci0JY211LmRpdl9jbGtzID0gYXVkX2Rpdl9jbGtzOwotCWNtdS5ucl9kaXZfY2xrcyA9IEFSUkFZX1NJWkUoYXVkX2Rpdl9jbGtzKTsKLQljbXUuZ2F0ZV9jbGtzID0gYXVkX2dhdGVfY2xrczsKLQljbXUubnJfZ2F0ZV9jbGtzID0gQVJSQVlfU0laRShhdWRfZ2F0ZV9jbGtzKTsKLQljbXUubnJfY2xrX2lkcyA9IEFVRF9OUl9DTEs7Ci0JY211LmNsa19yZWdzID0gYXVkX2Nsa19yZWdzOwotCWNtdS5ucl9jbGtfcmVncyA9IEFSUkFZX1NJWkUoYXVkX2Nsa19yZWdzKTsKLQotCXNhbXN1bmdfY211X3JlZ2lzdGVyX29uZShucCwgJmNtdSk7CisJc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmYXVkX2NtdSk7CiB9CiAKIENMS19PRl9ERUNMQVJFKGV4eW5vczUyNjBfY2xrX2F1ZCwgInNhbXN1bmcsZXh5bm9zNTI2MC1jbG9jay1hdWQiLApAQCAtMzIxLDIxICszMjEsMjEgQEAKIAkJCUVOX0lQX0RJU1AsIDI1LCAwLCAwKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19jbXVfaW5mbyBkaXNwX2NtdSBfX2luaXRjb25zdCA9IHsKKwkubXV4X2Nsa3MJPSBkaXNwX211eF9jbGtzLAorCS5ucl9tdXhfY2xrcwk9IEFSUkFZX1NJWkUoZGlzcF9tdXhfY2xrcyksCisJLmRpdl9jbGtzCT0gZGlzcF9kaXZfY2xrcywKKwkubnJfZGl2X2Nsa3MJPSBBUlJBWV9TSVpFKGRpc3BfZGl2X2Nsa3MpLAorCS5nYXRlX2Nsa3MJPSBkaXNwX2dhdGVfY2xrcywKKwkubnJfZ2F0ZV9jbGtzCT0gQVJSQVlfU0laRShkaXNwX2dhdGVfY2xrcyksCisJLm5yX2Nsa19pZHMJPSBESVNQX05SX0NMSywKKwkuY2xrX3JlZ3MJPSBkaXNwX2Nsa19yZWdzLAorCS5ucl9jbGtfcmVncwk9IEFSUkFZX1NJWkUoZGlzcF9jbGtfcmVncyksCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgZXh5bm9zNTI2MF9jbGtfZGlzcF9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IHNhbXN1bmdfY211X2luZm8gY211ID0geyBOVUxMIH07Ci0KLQljbXUubXV4X2Nsa3MgPSBkaXNwX211eF9jbGtzOwotCWNtdS5ucl9tdXhfY2xrcyA9IEFSUkFZX1NJWkUoZGlzcF9tdXhfY2xrcyk7Ci0JY211LmRpdl9jbGtzID0gZGlzcF9kaXZfY2xrczsKLQljbXUubnJfZGl2X2Nsa3MgPSBBUlJBWV9TSVpFKGRpc3BfZGl2X2Nsa3MpOwotCWNtdS5nYXRlX2Nsa3MgPSBkaXNwX2dhdGVfY2xrczsKLQljbXUubnJfZ2F0ZV9jbGtzID0gQVJSQVlfU0laRShkaXNwX2dhdGVfY2xrcyk7Ci0JY211Lm5yX2Nsa19pZHMgPSBESVNQX05SX0NMSzsKLQljbXUuY2xrX3JlZ3MgPSBkaXNwX2Nsa19yZWdzOwotCWNtdS5ucl9jbGtfcmVncyA9IEFSUkFZX1NJWkUoZGlzcF9jbGtfcmVncyk7Ci0KLQlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZjbXUpOworCXNhbXN1bmdfY211X3JlZ2lzdGVyX29uZShucCwgJmRpc3BfY211KTsKIH0KIAogQ0xLX09GX0RFQ0xBUkUoZXh5bm9zNTI2MF9jbGtfZGlzcCwgInNhbXN1bmcsZXh5bm9zNTI2MC1jbG9jay1kaXNwIiwKQEAgLTM4NSwyMSArMzg1LDIxIEBACiAJCXBsbDI1NTBfMjRtaHpfdGJsKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19jbXVfaW5mbyBlZ2xfY211IF9faW5pdGNvbnN0ID0geworCS5wbGxfY2xrcwk9IGVnbF9wbGxfY2xrcywKKwkubnJfcGxsX2Nsa3MJPSBBUlJBWV9TSVpFKGVnbF9wbGxfY2xrcyksCisJLm11eF9jbGtzCT0gZWdsX211eF9jbGtzLAorCS5ucl9tdXhfY2xrcwk9IEFSUkFZX1NJWkUoZWdsX211eF9jbGtzKSwKKwkuZGl2X2Nsa3MJPSBlZ2xfZGl2X2Nsa3MsCisJLm5yX2Rpdl9jbGtzCT0gQVJSQVlfU0laRShlZ2xfZGl2X2Nsa3MpLAorCS5ucl9jbGtfaWRzCT0gRUdMX05SX0NMSywKKwkuY2xrX3JlZ3MJPSBlZ2xfY2xrX3JlZ3MsCisJLm5yX2Nsa19yZWdzCT0gQVJSQVlfU0laRShlZ2xfY2xrX3JlZ3MpLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IGV4eW5vczUyNjBfY2xrX2VnbF9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IHNhbXN1bmdfY211X2luZm8gY211ID0geyBOVUxMIH07Ci0KLQljbXUucGxsX2Nsa3MgPSBlZ2xfcGxsX2Nsa3M7Ci0JY211Lm5yX3BsbF9jbGtzID0gIEFSUkFZX1NJWkUoZWdsX3BsbF9jbGtzKTsKLQljbXUubXV4X2Nsa3MgPSBlZ2xfbXV4X2Nsa3M7Ci0JY211Lm5yX211eF9jbGtzID0gQVJSQVlfU0laRShlZ2xfbXV4X2Nsa3MpOwotCWNtdS5kaXZfY2xrcyA9IGVnbF9kaXZfY2xrczsKLQljbXUubnJfZGl2X2Nsa3MgPSBBUlJBWV9TSVpFKGVnbF9kaXZfY2xrcyk7Ci0JY211Lm5yX2Nsa19pZHMgPSBFR0xfTlJfQ0xLOwotCWNtdS5jbGtfcmVncyA9IGVnbF9jbGtfcmVnczsKLQljbXUubnJfY2xrX3JlZ3MgPSBBUlJBWV9TSVpFKGVnbF9jbGtfcmVncyk7Ci0KLQlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZjbXUpOworCXNhbXN1bmdfY211X3JlZ2lzdGVyX29uZShucCwgJmVnbF9jbXUpOwogfQogCiBDTEtfT0ZfREVDTEFSRShleHlub3M1MjYwX2Nsa19lZ2wsICJzYW1zdW5nLGV4eW5vczUyNjAtY2xvY2stZWdsIiwKQEAgLTQ4NywxOSArNDg3LDE5IEBACiAJCQlFTl9JUF9GU1lTX1NFQ1VSRV9TTU1VX1JUSUMsIDEyLCAwLCAwKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19jbXVfaW5mbyBmc3lzX2NtdSBfX2luaXRjb25zdCA9IHsKKwkubXV4X2Nsa3MJPSBmc3lzX211eF9jbGtzLAorCS5ucl9tdXhfY2xrcwk9IEFSUkFZX1NJWkUoZnN5c19tdXhfY2xrcyksCisJLmdhdGVfY2xrcwk9IGZzeXNfZ2F0ZV9jbGtzLAorCS5ucl9nYXRlX2Nsa3MJPSBBUlJBWV9TSVpFKGZzeXNfZ2F0ZV9jbGtzKSwKKwkubnJfY2xrX2lkcwk9IEZTWVNfTlJfQ0xLLAorCS5jbGtfcmVncwk9IGZzeXNfY2xrX3JlZ3MsCisJLm5yX2Nsa19yZWdzCT0gQVJSQVlfU0laRShmc3lzX2Nsa19yZWdzKSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBleHlub3M1MjYwX2Nsa19mc3lzX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3Qgc2Ftc3VuZ19jbXVfaW5mbyBjbXUgPSB7IE5VTEwgfTsKLQotCWNtdS5tdXhfY2xrcyA9IGZzeXNfbXV4X2Nsa3M7Ci0JY211Lm5yX211eF9jbGtzID0gQVJSQVlfU0laRShmc3lzX211eF9jbGtzKTsKLQljbXUuZ2F0ZV9jbGtzID0gZnN5c19nYXRlX2Nsa3M7Ci0JY211Lm5yX2dhdGVfY2xrcyA9IEFSUkFZX1NJWkUoZnN5c19nYXRlX2Nsa3MpOwotCWNtdS5ucl9jbGtfaWRzID0gRlNZU19OUl9DTEs7Ci0JY211LmNsa19yZWdzID0gZnN5c19jbGtfcmVnczsKLQljbXUubnJfY2xrX3JlZ3MgPSBBUlJBWV9TSVpFKGZzeXNfY2xrX3JlZ3MpOwotCi0Jc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmY211KTsKKwlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZmc3lzX2NtdSk7CiB9CiAKIENMS19PRl9ERUNMQVJFKGV4eW5vczUyNjBfY2xrX2ZzeXMsICJzYW1zdW5nLGV4eW5vczUyNjAtY2xvY2stZnN5cyIsCkBAIC01NzYsMjEgKzU3NiwyMSBAQAogCQkJRU5fSVBfRzJEX1NFQ1VSRV9TTU1VX0cyRCwgMTUsIDAsIDApLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzYW1zdW5nX2NtdV9pbmZvIGcyZF9jbXUgX19pbml0Y29uc3QgPSB7CisJLm11eF9jbGtzCT0gZzJkX211eF9jbGtzLAorCS5ucl9tdXhfY2xrcwk9IEFSUkFZX1NJWkUoZzJkX211eF9jbGtzKSwKKwkuZGl2X2Nsa3MJPSBnMmRfZGl2X2Nsa3MsCisJLm5yX2Rpdl9jbGtzCT0gQVJSQVlfU0laRShnMmRfZGl2X2Nsa3MpLAorCS5nYXRlX2Nsa3MJPSBnMmRfZ2F0ZV9jbGtzLAorCS5ucl9nYXRlX2Nsa3MJPSBBUlJBWV9TSVpFKGcyZF9nYXRlX2Nsa3MpLAorCS5ucl9jbGtfaWRzCT0gRzJEX05SX0NMSywKKwkuY2xrX3JlZ3MJPSBnMmRfY2xrX3JlZ3MsCisJLm5yX2Nsa19yZWdzCT0gQVJSQVlfU0laRShnMmRfY2xrX3JlZ3MpLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IGV4eW5vczUyNjBfY2xrX2cyZF9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IHNhbXN1bmdfY211X2luZm8gY211ID0geyBOVUxMIH07Ci0KLQljbXUubXV4X2Nsa3MgPSBnMmRfbXV4X2Nsa3M7Ci0JY211Lm5yX211eF9jbGtzID0gQVJSQVlfU0laRShnMmRfbXV4X2Nsa3MpOwotCWNtdS5kaXZfY2xrcyA9IGcyZF9kaXZfY2xrczsKLQljbXUubnJfZGl2X2Nsa3MgPSBBUlJBWV9TSVpFKGcyZF9kaXZfY2xrcyk7Ci0JY211LmdhdGVfY2xrcyA9IGcyZF9nYXRlX2Nsa3M7Ci0JY211Lm5yX2dhdGVfY2xrcyA9IEFSUkFZX1NJWkUoZzJkX2dhdGVfY2xrcyk7Ci0JY211Lm5yX2Nsa19pZHMgPSBHMkRfTlJfQ0xLOwotCWNtdS5jbGtfcmVncyA9IGcyZF9jbGtfcmVnczsKLQljbXUubnJfY2xrX3JlZ3MgPSBBUlJBWV9TSVpFKGcyZF9jbGtfcmVncyk7Ci0KLQlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZjbXUpOworCXNhbXN1bmdfY211X3JlZ2lzdGVyX29uZShucCwgJmcyZF9jbXUpOwogfQogCiBDTEtfT0ZfREVDTEFSRShleHlub3M1MjYwX2Nsa19nMmQsICJzYW1zdW5nLGV4eW5vczUyNjAtY2xvY2stZzJkIiwKQEAgLTYzNywyMyArNjM3LDIzIEBACiAJCXBsbDI1NTBfMjRtaHpfdGJsKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19jbXVfaW5mbyBnM2RfY211IF9faW5pdGNvbnN0ID0geworCS5wbGxfY2xrcwk9IGczZF9wbGxfY2xrcywKKwkubnJfcGxsX2Nsa3MJPSBBUlJBWV9TSVpFKGczZF9wbGxfY2xrcyksCisJLm11eF9jbGtzCT0gZzNkX211eF9jbGtzLAorCS5ucl9tdXhfY2xrcwk9IEFSUkFZX1NJWkUoZzNkX211eF9jbGtzKSwKKwkuZGl2X2Nsa3MJPSBnM2RfZGl2X2Nsa3MsCisJLm5yX2Rpdl9jbGtzCT0gQVJSQVlfU0laRShnM2RfZGl2X2Nsa3MpLAorCS5nYXRlX2Nsa3MJPSBnM2RfZ2F0ZV9jbGtzLAorCS5ucl9nYXRlX2Nsa3MJPSBBUlJBWV9TSVpFKGczZF9nYXRlX2Nsa3MpLAorCS5ucl9jbGtfaWRzCT0gRzNEX05SX0NMSywKKwkuY2xrX3JlZ3MJPSBnM2RfY2xrX3JlZ3MsCisJLm5yX2Nsa19yZWdzCT0gQVJSQVlfU0laRShnM2RfY2xrX3JlZ3MpLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IGV4eW5vczUyNjBfY2xrX2czZF9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IHNhbXN1bmdfY211X2luZm8gY211ID0geyBOVUxMIH07Ci0KLQljbXUucGxsX2Nsa3MgPSBnM2RfcGxsX2Nsa3M7Ci0JY211Lm5yX3BsbF9jbGtzID0gIEFSUkFZX1NJWkUoZzNkX3BsbF9jbGtzKTsKLQljbXUubXV4X2Nsa3MgPSBnM2RfbXV4X2Nsa3M7Ci0JY211Lm5yX211eF9jbGtzID0gQVJSQVlfU0laRShnM2RfbXV4X2Nsa3MpOwotCWNtdS5kaXZfY2xrcyA9IGczZF9kaXZfY2xrczsKLQljbXUubnJfZGl2X2Nsa3MgPSBBUlJBWV9TSVpFKGczZF9kaXZfY2xrcyk7Ci0JY211LmdhdGVfY2xrcyA9IGczZF9nYXRlX2Nsa3M7Ci0JY211Lm5yX2dhdGVfY2xrcyA9IEFSUkFZX1NJWkUoZzNkX2dhdGVfY2xrcyk7Ci0JY211Lm5yX2Nsa19pZHMgPSBHM0RfTlJfQ0xLOwotCWNtdS5jbGtfcmVncyA9IGczZF9jbGtfcmVnczsKLQljbXUubnJfY2xrX3JlZ3MgPSBBUlJBWV9TSVpFKGczZF9jbGtfcmVncyk7Ci0KLQlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZjbXUpOworCXNhbXN1bmdfY211X3JlZ2lzdGVyX29uZShucCwgJmczZF9jbXUpOwogfQogCiBDTEtfT0ZfREVDTEFSRShleHlub3M1MjYwX2Nsa19nM2QsICJzYW1zdW5nLGV4eW5vczUyNjAtY2xvY2stZzNkIiwKQEAgLTc3MiwyMSArNzcyLDIxIEBACiAJCQlFTl9JUF9HU0NMX1NFQ1VSRV9TTU1VX01TQ0wxLCAyMCwgMCwgMCksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfY211X2luZm8gZ3NjbF9jbXUgX19pbml0Y29uc3QgPSB7CisJLm11eF9jbGtzCT0gZ3NjbF9tdXhfY2xrcywKKwkubnJfbXV4X2Nsa3MJPSBBUlJBWV9TSVpFKGdzY2xfbXV4X2Nsa3MpLAorCS5kaXZfY2xrcwk9IGdzY2xfZGl2X2Nsa3MsCisJLm5yX2Rpdl9jbGtzCT0gQVJSQVlfU0laRShnc2NsX2Rpdl9jbGtzKSwKKwkuZ2F0ZV9jbGtzCT0gZ3NjbF9nYXRlX2Nsa3MsCisJLm5yX2dhdGVfY2xrcwk9IEFSUkFZX1NJWkUoZ3NjbF9nYXRlX2Nsa3MpLAorCS5ucl9jbGtfaWRzCT0gR1NDTF9OUl9DTEssCisJLmNsa19yZWdzCT0gZ3NjbF9jbGtfcmVncywKKwkubnJfY2xrX3JlZ3MJPSBBUlJBWV9TSVpFKGdzY2xfY2xrX3JlZ3MpLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IGV4eW5vczUyNjBfY2xrX2dzY2xfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBzYW1zdW5nX2NtdV9pbmZvIGNtdSA9IHsgTlVMTCB9OwotCi0JY211Lm11eF9jbGtzID0gZ3NjbF9tdXhfY2xrczsKLQljbXUubnJfbXV4X2Nsa3MgPSBBUlJBWV9TSVpFKGdzY2xfbXV4X2Nsa3MpOwotCWNtdS5kaXZfY2xrcyA9IGdzY2xfZGl2X2Nsa3M7Ci0JY211Lm5yX2Rpdl9jbGtzID0gQVJSQVlfU0laRShnc2NsX2Rpdl9jbGtzKTsKLQljbXUuZ2F0ZV9jbGtzID0gZ3NjbF9nYXRlX2Nsa3M7Ci0JY211Lm5yX2dhdGVfY2xrcyA9IEFSUkFZX1NJWkUoZ3NjbF9nYXRlX2Nsa3MpOwotCWNtdS5ucl9jbGtfaWRzID0gR1NDTF9OUl9DTEs7Ci0JY211LmNsa19yZWdzID0gZ3NjbF9jbGtfcmVnczsKLQljbXUubnJfY2xrX3JlZ3MgPSBBUlJBWV9TSVpFKGdzY2xfY2xrX3JlZ3MpOwotCi0Jc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmY211KTsKKwlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZnc2NsX2NtdSk7CiB9CiAKIENMS19PRl9ERUNMQVJFKGV4eW5vczUyNjBfY2xrX2dzY2wsICJzYW1zdW5nLGV4eW5vczUyNjAtY2xvY2stZ3NjbCIsCkBAIC04OTEsMjEgKzg5MSwyMSBAQAogCQkJRU5fU0NMS19JU1AsIDksIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzYW1zdW5nX2NtdV9pbmZvIGlzcF9jbXUgX19pbml0Y29uc3QgPSB7CisJLm11eF9jbGtzCT0gaXNwX211eF9jbGtzLAorCS5ucl9tdXhfY2xrcwk9IEFSUkFZX1NJWkUoaXNwX211eF9jbGtzKSwKKwkuZGl2X2Nsa3MJPSBpc3BfZGl2X2Nsa3MsCisJLm5yX2Rpdl9jbGtzCT0gQVJSQVlfU0laRShpc3BfZGl2X2Nsa3MpLAorCS5nYXRlX2Nsa3MJPSBpc3BfZ2F0ZV9jbGtzLAorCS5ucl9nYXRlX2Nsa3MJPSBBUlJBWV9TSVpFKGlzcF9nYXRlX2Nsa3MpLAorCS5ucl9jbGtfaWRzCT0gSVNQX05SX0NMSywKKwkuY2xrX3JlZ3MJPSBpc3BfY2xrX3JlZ3MsCisJLm5yX2Nsa19yZWdzCT0gQVJSQVlfU0laRShpc3BfY2xrX3JlZ3MpLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IGV4eW5vczUyNjBfY2xrX2lzcF9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IHNhbXN1bmdfY211X2luZm8gY211ID0geyBOVUxMIH07Ci0KLQljbXUubXV4X2Nsa3MgPSBpc3BfbXV4X2Nsa3M7Ci0JY211Lm5yX211eF9jbGtzID0gQVJSQVlfU0laRShpc3BfbXV4X2Nsa3MpOwotCWNtdS5kaXZfY2xrcyA9IGlzcF9kaXZfY2xrczsKLQljbXUubnJfZGl2X2Nsa3MgPSBBUlJBWV9TSVpFKGlzcF9kaXZfY2xrcyk7Ci0JY211LmdhdGVfY2xrcyA9IGlzcF9nYXRlX2Nsa3M7Ci0JY211Lm5yX2dhdGVfY2xrcyA9IEFSUkFZX1NJWkUoaXNwX2dhdGVfY2xrcyk7Ci0JY211Lm5yX2Nsa19pZHMgPSBJU1BfTlJfQ0xLOwotCWNtdS5jbGtfcmVncyA9IGlzcF9jbGtfcmVnczsKLQljbXUubnJfY2xrX3JlZ3MgPSBBUlJBWV9TSVpFKGlzcF9jbGtfcmVncyk7Ci0KLQlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZjbXUpOworCXNhbXN1bmdfY211X3JlZ2lzdGVyX29uZShucCwgJmlzcF9jbXUpOwogfQogCiBDTEtfT0ZfREVDTEFSRShleHlub3M1MjYwX2Nsa19pc3AsICJzYW1zdW5nLGV4eW5vczUyNjAtY2xvY2staXNwIiwKQEAgLTk1NSwyMSArOTU1LDIxIEBACiAJCXBsbDI1NTBfMjRtaHpfdGJsKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19jbXVfaW5mbyBrZmNfY211IF9faW5pdGNvbnN0ID0geworCS5wbGxfY2xrcwk9IGtmY19wbGxfY2xrcywKKwkubnJfcGxsX2Nsa3MJPSBBUlJBWV9TSVpFKGtmY19wbGxfY2xrcyksCisJLm11eF9jbGtzCT0ga2ZjX211eF9jbGtzLAorCS5ucl9tdXhfY2xrcwk9IEFSUkFZX1NJWkUoa2ZjX211eF9jbGtzKSwKKwkuZGl2X2Nsa3MJPSBrZmNfZGl2X2Nsa3MsCisJLm5yX2Rpdl9jbGtzCT0gQVJSQVlfU0laRShrZmNfZGl2X2Nsa3MpLAorCS5ucl9jbGtfaWRzCT0gS0ZDX05SX0NMSywKKwkuY2xrX3JlZ3MJPSBrZmNfY2xrX3JlZ3MsCisJLm5yX2Nsa19yZWdzCT0gQVJSQVlfU0laRShrZmNfY2xrX3JlZ3MpLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IGV4eW5vczUyNjBfY2xrX2tmY19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IHNhbXN1bmdfY211X2luZm8gY211ID0geyBOVUxMIH07Ci0KLQljbXUucGxsX2Nsa3MgPSBrZmNfcGxsX2Nsa3M7Ci0JY211Lm5yX3BsbF9jbGtzID0gIEFSUkFZX1NJWkUoa2ZjX3BsbF9jbGtzKTsKLQljbXUubXV4X2Nsa3MgPSBrZmNfbXV4X2Nsa3M7Ci0JY211Lm5yX211eF9jbGtzID0gQVJSQVlfU0laRShrZmNfbXV4X2Nsa3MpOwotCWNtdS5kaXZfY2xrcyA9IGtmY19kaXZfY2xrczsKLQljbXUubnJfZGl2X2Nsa3MgPSBBUlJBWV9TSVpFKGtmY19kaXZfY2xrcyk7Ci0JY211Lm5yX2Nsa19pZHMgPSBLRkNfTlJfQ0xLOwotCWNtdS5jbGtfcmVncyA9IGtmY19jbGtfcmVnczsKLQljbXUubnJfY2xrX3JlZ3MgPSBBUlJBWV9TSVpFKGtmY19jbGtfcmVncyk7Ci0KLQlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZjbXUpOworCXNhbXN1bmdfY211X3JlZ2lzdGVyX29uZShucCwgJmtmY19jbXUpOwogfQogCiBDTEtfT0ZfREVDTEFSRShleHlub3M1MjYwX2Nsa19rZmMsICJzYW1zdW5nLGV4eW5vczUyNjAtY2xvY2sta2ZjIiwKQEAgLTEwMTEsMjEgKzEwMTEsMjEgQEAKIAkJCUVOX0lQX01GQ19TRUNVUkVfU01NVTJfTUZDLCA3LCAwLCAwKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19jbXVfaW5mbyBtZmNfY211IF9faW5pdGNvbnN0ID0geworCS5tdXhfY2xrcwk9IG1mY19tdXhfY2xrcywKKwkubnJfbXV4X2Nsa3MJPSBBUlJBWV9TSVpFKG1mY19tdXhfY2xrcyksCisJLmRpdl9jbGtzCT0gbWZjX2Rpdl9jbGtzLAorCS5ucl9kaXZfY2xrcwk9IEFSUkFZX1NJWkUobWZjX2Rpdl9jbGtzKSwKKwkuZ2F0ZV9jbGtzCT0gbWZjX2dhdGVfY2xrcywKKwkubnJfZ2F0ZV9jbGtzCT0gQVJSQVlfU0laRShtZmNfZ2F0ZV9jbGtzKSwKKwkubnJfY2xrX2lkcwk9IE1GQ19OUl9DTEssCisJLmNsa19yZWdzCT0gbWZjX2Nsa19yZWdzLAorCS5ucl9jbGtfcmVncwk9IEFSUkFZX1NJWkUobWZjX2Nsa19yZWdzKSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBleHlub3M1MjYwX2Nsa19tZmNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBzYW1zdW5nX2NtdV9pbmZvIGNtdSA9IHsgTlVMTCB9OwotCi0JY211Lm11eF9jbGtzID0gbWZjX211eF9jbGtzOwotCWNtdS5ucl9tdXhfY2xrcyA9IEFSUkFZX1NJWkUobWZjX211eF9jbGtzKTsKLQljbXUuZGl2X2Nsa3MgPSBtZmNfZGl2X2Nsa3M7Ci0JY211Lm5yX2Rpdl9jbGtzID0gQVJSQVlfU0laRShtZmNfZGl2X2Nsa3MpOwotCWNtdS5nYXRlX2Nsa3MgPSBtZmNfZ2F0ZV9jbGtzOwotCWNtdS5ucl9nYXRlX2Nsa3MgPSBBUlJBWV9TSVpFKG1mY19nYXRlX2Nsa3MpOwotCWNtdS5ucl9jbGtfaWRzID0gTUZDX05SX0NMSzsKLQljbXUuY2xrX3JlZ3MgPSBtZmNfY2xrX3JlZ3M7Ci0JY211Lm5yX2Nsa19yZWdzID0gQVJSQVlfU0laRShtZmNfY2xrX3JlZ3MpOwotCi0Jc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmY211KTsKKwlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZtZmNfY211KTsKIH0KIAogQ0xLX09GX0RFQ0xBUkUoZXh5bm9zNTI2MF9jbGtfbWZjLCAic2Ftc3VuZyxleHlub3M1MjYwLWNsb2NrLW1mYyIsCkBAIC0xMTU4LDIzICsxMTU4LDIzIEBACiAJCXBsbDI1NTBfMjRtaHpfdGJsKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19jbXVfaW5mbyBtaWZfY211IF9faW5pdGNvbnN0ID0geworCS5wbGxfY2xrcwk9IG1pZl9wbGxfY2xrcywKKwkubnJfcGxsX2Nsa3MJPSBBUlJBWV9TSVpFKG1pZl9wbGxfY2xrcyksCisJLm11eF9jbGtzCT0gbWlmX211eF9jbGtzLAorCS5ucl9tdXhfY2xrcwk9IEFSUkFZX1NJWkUobWlmX211eF9jbGtzKSwKKwkuZGl2X2Nsa3MJPSBtaWZfZGl2X2Nsa3MsCisJLm5yX2Rpdl9jbGtzCT0gQVJSQVlfU0laRShtaWZfZGl2X2Nsa3MpLAorCS5nYXRlX2Nsa3MJPSBtaWZfZ2F0ZV9jbGtzLAorCS5ucl9nYXRlX2Nsa3MJPSBBUlJBWV9TSVpFKG1pZl9nYXRlX2Nsa3MpLAorCS5ucl9jbGtfaWRzCT0gTUlGX05SX0NMSywKKwkuY2xrX3JlZ3MJPSBtaWZfY2xrX3JlZ3MsCisJLm5yX2Nsa19yZWdzCT0gQVJSQVlfU0laRShtaWZfY2xrX3JlZ3MpLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IGV4eW5vczUyNjBfY2xrX21pZl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IHNhbXN1bmdfY211X2luZm8gY211ID0geyBOVUxMIH07Ci0KLQljbXUucGxsX2Nsa3MgPSBtaWZfcGxsX2Nsa3M7Ci0JY211Lm5yX3BsbF9jbGtzID0gIEFSUkFZX1NJWkUobWlmX3BsbF9jbGtzKTsKLQljbXUubXV4X2Nsa3MgPSBtaWZfbXV4X2Nsa3M7Ci0JY211Lm5yX211eF9jbGtzID0gQVJSQVlfU0laRShtaWZfbXV4X2Nsa3MpOwotCWNtdS5kaXZfY2xrcyA9IG1pZl9kaXZfY2xrczsKLQljbXUubnJfZGl2X2Nsa3MgPSBBUlJBWV9TSVpFKG1pZl9kaXZfY2xrcyk7Ci0JY211LmdhdGVfY2xrcyA9IG1pZl9nYXRlX2Nsa3M7Ci0JY211Lm5yX2dhdGVfY2xrcyA9IEFSUkFZX1NJWkUobWlmX2dhdGVfY2xrcyk7Ci0JY211Lm5yX2Nsa19pZHMgPSBNSUZfTlJfQ0xLOwotCWNtdS5jbGtfcmVncyA9IG1pZl9jbGtfcmVnczsKLQljbXUubnJfY2xrX3JlZ3MgPSBBUlJBWV9TSVpFKG1pZl9jbGtfcmVncyk7Ci0KLQlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZjbXUpOworCXNhbXN1bmdfY211X3JlZ2lzdGVyX29uZShucCwgJm1pZl9jbXUpOwogfQogCiBDTEtfT0ZfREVDTEFSRShleHlub3M1MjYwX2Nsa19taWYsICJzYW1zdW5nLGV4eW5vczUyNjAtY2xvY2stbWlmIiwKQEAgLTEzNjYsMjEgKzEzNjYsMjEgQEAKIAkJRU5fSVBfUEVSSV9TRUNVUkVfVFpQQywgMjAsIDAsIDApLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzYW1zdW5nX2NtdV9pbmZvIHBlcmlfY211IF9faW5pdGNvbnN0ID0geworCS5tdXhfY2xrcwk9IHBlcmlfbXV4X2Nsa3MsCisJLm5yX211eF9jbGtzCT0gQVJSQVlfU0laRShwZXJpX211eF9jbGtzKSwKKwkuZGl2X2Nsa3MJPSBwZXJpX2Rpdl9jbGtzLAorCS5ucl9kaXZfY2xrcwk9IEFSUkFZX1NJWkUocGVyaV9kaXZfY2xrcyksCisJLmdhdGVfY2xrcwk9IHBlcmlfZ2F0ZV9jbGtzLAorCS5ucl9nYXRlX2Nsa3MJPSBBUlJBWV9TSVpFKHBlcmlfZ2F0ZV9jbGtzKSwKKwkubnJfY2xrX2lkcwk9IFBFUklfTlJfQ0xLLAorCS5jbGtfcmVncwk9IHBlcmlfY2xrX3JlZ3MsCisJLm5yX2Nsa19yZWdzCT0gQVJSQVlfU0laRShwZXJpX2Nsa19yZWdzKSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBleHlub3M1MjYwX2Nsa19wZXJpX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3Qgc2Ftc3VuZ19jbXVfaW5mbyBjbXUgPSB7IE5VTEwgfTsKLQotCWNtdS5tdXhfY2xrcyA9IHBlcmlfbXV4X2Nsa3M7Ci0JY211Lm5yX211eF9jbGtzID0gQVJSQVlfU0laRShwZXJpX211eF9jbGtzKTsKLQljbXUuZGl2X2Nsa3MgPSBwZXJpX2Rpdl9jbGtzOwotCWNtdS5ucl9kaXZfY2xrcyA9IEFSUkFZX1NJWkUocGVyaV9kaXZfY2xrcyk7Ci0JY211LmdhdGVfY2xrcyA9IHBlcmlfZ2F0ZV9jbGtzOwotCWNtdS5ucl9nYXRlX2Nsa3MgPSBBUlJBWV9TSVpFKHBlcmlfZ2F0ZV9jbGtzKTsKLQljbXUubnJfY2xrX2lkcyA9IFBFUklfTlJfQ0xLOwotCWNtdS5jbGtfcmVncyA9IHBlcmlfY2xrX3JlZ3M7Ci0JY211Lm5yX2Nsa19yZWdzID0gQVJSQVlfU0laRShwZXJpX2Nsa19yZWdzKTsKLQotCXNhbXN1bmdfY211X3JlZ2lzdGVyX29uZShucCwgJmNtdSk7CisJc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmcGVyaV9jbXUpOwogfQogCiBDTEtfT0ZfREVDTEFSRShleHlub3M1MjYwX2Nsa19wZXJpLCAic2Ftc3VuZyxleHlub3M1MjYwLWNsb2NrLXBlcmkiLApAQCAtMTgxOCwyNSArMTgxOCwyNSBAQAogCQlwbGwyNjUwXzI0bWh6X3RibCksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfY211X2luZm8gdG9wX2NtdSBfX2luaXRjb25zdCA9IHsKKwkucGxsX2Nsa3MJPSB0b3BfcGxsX2Nsa3MsCisJLm5yX3BsbF9jbGtzCT0gQVJSQVlfU0laRSh0b3BfcGxsX2Nsa3MpLAorCS5tdXhfY2xrcwk9IHRvcF9tdXhfY2xrcywKKwkubnJfbXV4X2Nsa3MJPSBBUlJBWV9TSVpFKHRvcF9tdXhfY2xrcyksCisJLmRpdl9jbGtzCT0gdG9wX2Rpdl9jbGtzLAorCS5ucl9kaXZfY2xrcwk9IEFSUkFZX1NJWkUodG9wX2Rpdl9jbGtzKSwKKwkuZ2F0ZV9jbGtzCT0gdG9wX2dhdGVfY2xrcywKKwkubnJfZ2F0ZV9jbGtzCT0gQVJSQVlfU0laRSh0b3BfZ2F0ZV9jbGtzKSwKKwkuZml4ZWRfY2xrcwk9IGZpeGVkX3JhdGVfY2xrcywKKwkubnJfZml4ZWRfY2xrcwk9IEFSUkFZX1NJWkUoZml4ZWRfcmF0ZV9jbGtzKSwKKwkubnJfY2xrX2lkcwk9IFRPUF9OUl9DTEssCisJLmNsa19yZWdzCT0gdG9wX2Nsa19yZWdzLAorCS5ucl9jbGtfcmVncwk9IEFSUkFZX1NJWkUodG9wX2Nsa19yZWdzKSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBleHlub3M1MjYwX2Nsa190b3BfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBzYW1zdW5nX2NtdV9pbmZvIGNtdSA9IHsgTlVMTCB9OwotCi0JY211LnBsbF9jbGtzID0gdG9wX3BsbF9jbGtzOwotCWNtdS5ucl9wbGxfY2xrcyA9ICBBUlJBWV9TSVpFKHRvcF9wbGxfY2xrcyk7Ci0JY211Lm11eF9jbGtzID0gdG9wX211eF9jbGtzOwotCWNtdS5ucl9tdXhfY2xrcyA9IEFSUkFZX1NJWkUodG9wX211eF9jbGtzKTsKLQljbXUuZGl2X2Nsa3MgPSB0b3BfZGl2X2Nsa3M7Ci0JY211Lm5yX2Rpdl9jbGtzID0gQVJSQVlfU0laRSh0b3BfZGl2X2Nsa3MpOwotCWNtdS5nYXRlX2Nsa3MgPSB0b3BfZ2F0ZV9jbGtzOwotCWNtdS5ucl9nYXRlX2Nsa3MgPSBBUlJBWV9TSVpFKHRvcF9nYXRlX2Nsa3MpOwotCWNtdS5maXhlZF9jbGtzID0gZml4ZWRfcmF0ZV9jbGtzOwotCWNtdS5ucl9maXhlZF9jbGtzID0gQVJSQVlfU0laRShmaXhlZF9yYXRlX2Nsa3MpOwotCWNtdS5ucl9jbGtfaWRzID0gVE9QX05SX0NMSzsKLQljbXUuY2xrX3JlZ3MgPSB0b3BfY2xrX3JlZ3M7Ci0JY211Lm5yX2Nsa19yZWdzID0gQVJSQVlfU0laRSh0b3BfY2xrX3JlZ3MpOwotCi0Jc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmY211KTsKKwlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZ0b3BfY211KTsKIH0KIAogQ0xLX09GX0RFQ0xBUkUoZXh5bm9zNTI2MF9jbGtfdG9wLCAic2Ftc3VuZyxleHlub3M1MjYwLWNsb2NrLXRvcCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1leHlub3M1NDEwLmMgYi9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1leHlub3M1NDEwLmMKaW5kZXggNTRlYzQ4Ni4uZmM0NzFhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZXh5bm9zNTQxMC5jCisrKyBiL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLWV4eW5vczU0MTAuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogCiAjaW5jbHVkZSAiY2xrLmgiCiAKQEAgLTIxLDYgKzIyLDggQEAKICNkZWZpbmUgQVBMTF9DT04wICAgICAgICAgICAgICAgMHgxMDAKICNkZWZpbmUgQ1BMTF9MT0NLICAgICAgICAgICAgICAgMHgxMDAyMAogI2RlZmluZSBDUExMX0NPTjAgICAgICAgICAgICAgICAweDEwMTIwCisjZGVmaW5lIEVQTExfTE9DSyAgICAgICAgICAgICAgIDB4MTAwNDAKKyNkZWZpbmUgRVBMTF9DT04wICAgICAgICAgICAgICAgMHgxMDEzMAogI2RlZmluZSBNUExMX0xPQ0sgICAgICAgICAgICAgICAweDQwMDAKICNkZWZpbmUgTVBMTF9DT04wICAgICAgICAgICAgICAgMHg0MTAwCiAjZGVmaW5lIEJQTExfTE9DSyAgICAgICAgICAgICAgIDB4MjAwMTAKQEAgLTU4LDcgKzYxLDcgQEAKIAogLyogbGlzdCBvZiBQTExzICovCiBlbnVtIGV4eW5vczU0MTBfcGxscyB7Ci0JYXBsbCwgY3BsbCwgbXBsbCwKKwlhcGxsLCBjcGxsLCBlcGxsLCBtcGxsLAogCWJwbGwsIGtwbGwsCiAJbnJfcGxscyAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIFBMTHMgKi8KIH07CkBAIC02Nyw2ICs3MCw3IEBACiBQTkFNRShhcGxsX3ApCQk9IHsgImZpbl9wbGwiLCAiZm91dF9hcGxsIiwgfTsKIFBOQU1FKGJwbGxfcCkJCT0geyAiZmluX3BsbCIsICJmb3V0X2JwbGwiLCB9OwogUE5BTUUoY3BsbF9wKQkJPSB7ICJmaW5fcGxsIiwgImZvdXRfY3BsbCIgfTsKK1BOQU1FKGVwbGxfcCkJCT0geyAiZmluX3BsbCIsICJmb3V0X2VwbGwiIH07CiBQTkFNRShtcGxsX3ApCQk9IHsgImZpbl9wbGwiLCAiZm91dF9tcGxsIiwgfTsKIFBOQU1FKGtwbGxfcCkJCT0geyAiZmluX3BsbCIsICJmb3V0X2twbGwiLCB9OwogCkBAIC05NSw2ICs5OSw4IEBACiAJTVVYKDAsICJzY2xrX2JwbGwiLCBicGxsX3AsIFNSQ19DRFJFWCwgMCwgMSksCiAJTVVYKDAsICJzY2xrX2JwbGxfbXV4ZWQiLCBicGxsX3VzZXJfcCwgU1JDX1RPUDIsIDI0LCAxKSwKIAorCU1VWCgwLCAic2Nsa19lcGxsIiwgZXBsbF9wLCBTUkNfVE9QMiwgMTIsIDEpLAorCiAJTVVYKDAsICJzY2xrX2NwbGwiLCBjcGxsX3AsIFNSQ19UT1AyLCA4LCAxKSwKIAogCU1VWCgwLCAic2Nsa19tcGxsX2JwbGwiLCBtcGxsX2JwbGxfcCwgU1JDX1RPUDEsIDIwLCAxKSwKQEAgLTE3Niw2ICsxODIsOCBAQAogCUdBVEUoQ0xLX01NQzAsICJzZG1tYzAiLCAiYWNsazIwMCIsIEdBVEVfQlVTX0ZTWVMwLCAxMiwgMCwgMCksCiAJR0FURShDTEtfTU1DMSwgInNkbW1jMSIsICJhY2xrMjAwIiwgR0FURV9CVVNfRlNZUzAsIDEzLCAwLCAwKSwKIAlHQVRFKENMS19NTUMyLCAic2RtbWMyIiwgImFjbGsyMDAiLCBHQVRFX0JVU19GU1lTMCwgMTQsIDAsIDApLAorCUdBVEUoQ0xLX1BETUExLCAicGRtYTEiLCAiYWNsazIwMCIsIEdBVEVfQlVTX0ZTWVMwLCAyLCAwLCAwKSwKKwlHQVRFKENMS19QRE1BMCwgInBkbWEwIiwgImFjbGsyMDAiLCBHQVRFX0JVU19GU1lTMCwgMSwgMCwgMCksCiAKIAlHQVRFKENMS19TQ0xLX1VTQlBIWTMwMSwgInNjbGtfdXNicGh5MzAxIiwgImRvdXRfdXNicGh5MzAxIiwKIAkgICAgIEdBVEVfVE9QX1NDTEtfRlNZUywgNywgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCkBAIC0yMTcsMTEgKzIyNSwyNiBAQAogCUdBVEUoQ0xLX1VTQkQzMDEsICJ1c2JkMzAxIiwgImFjbGsyMDBfZnN5cyIsIEdBVEVfSVBfRlNZUywgMjAsIDAsIDApLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzYW1zdW5nX3BsbF9jbG9jayBleHlub3M1NDEwX3BsbHNbbnJfcGxsc10gX19pbml0Y29uc3QgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfcGxsX3JhdGVfdGFibGUgZXh5bm9zNTQxMF9wbGwyNTUweF8yNG1oel90YmxbXSBfX2luaXRjb25zdCA9IHsKKwlQTExfMzZYWF9SQVRFKDQwMDAwMDAwMFUsIDIwMCwgMywgMiwgMCksCisJUExMXzM2WFhfUkFURSgzMzMwMDAwMDBVLCAxMTEsIDIsIDIsIDApLAorCVBMTF8zNlhYX1JBVEUoMzAwMDAwMDAwVSwgMTAwLCAyLCAyLCAwKSwKKwlQTExfMzZYWF9SQVRFKDI2NjAwMDAwMFUsIDI2NiwgMywgMywgMCksCisJUExMXzM2WFhfUkFURSgyMDAwMDAwMDBVLCAyMDAsIDMsIDMsIDApLAorCVBMTF8zNlhYX1JBVEUoMTkyMDAwMDAwVSwgMTkyLCAzLCAzLCAwKSwKKwlQTExfMzZYWF9SQVRFKDE2NjAwMDAwMFUsIDE2NiwgMywgMywgMCksCisJUExMXzM2WFhfUkFURSgxMzMwMDAwMDBVLCAyNjYsIDMsIDQsIDApLAorCVBMTF8zNlhYX1JBVEUoMTAwMDAwMDAwVSwgMjAwLCAzLCA0LCAwKSwKKwlQTExfMzZYWF9SQVRFKDY2MDAwMDAwVSwgIDE3NiwgMiwgNSwgMCksCit9OworCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfcGxsX2Nsb2NrIGV4eW5vczU0MTBfcGxsc1tucl9wbGxzXSBfX2luaXRkYXRhID0gewogCVthcGxsXSA9IFBMTChwbGxfMzV4eCwgQ0xLX0ZPVVRfQVBMTCwgImZvdXRfYXBsbCIsICJmaW5fcGxsIiwgQVBMTF9MT0NLLAogCQlBUExMX0NPTjAsIE5VTEwpLAogCVtjcGxsXSA9IFBMTChwbGxfMzV4eCwgQ0xLX0ZPVVRfQ1BMTCwgImZvdXRfY3BsbCIsICJmaW5fcGxsIiwgQ1BMTF9MT0NLLAogCQlDUExMX0NPTjAsIE5VTEwpLAorCVtlcGxsXSA9IFBMTChwbGxfMjY1MHgsIENMS19GT1VUX0VQTEwsICJmb3V0X2VwbGwiLCAiZmluX3BsbCIsIEVQTExfTE9DSywKKwkJRVBMTF9DT04wLCBOVUxMKSwKIAlbbXBsbF0gPSBQTEwocGxsXzM1eHgsIENMS19GT1VUX01QTEwsICJmb3V0X21wbGwiLCAiZmluX3BsbCIsIE1QTExfTE9DSywKIAkJTVBMTF9DT04wLCBOVUxMKSwKIAlbYnBsbF0gPSBQTEwocGxsXzM1eHgsIENMS19GT1VUX0JQTEwsICJmb3V0X2JwbGwiLCAiZmluX3BsbCIsIEJQTExfTE9DSywKQEAgLTIzMCwyOSArMjUzLDI3IEBACiAJCUtQTExfQ09OMCwgTlVMTCksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfY211X2luZm8gY211IF9faW5pdGNvbnN0ID0geworCS5wbGxfY2xrcwk9IGV4eW5vczU0MTBfcGxscywKKwkubnJfcGxsX2Nsa3MJPSBBUlJBWV9TSVpFKGV4eW5vczU0MTBfcGxscyksCisJLm11eF9jbGtzCT0gZXh5bm9zNTQxMF9tdXhfY2xrcywKKwkubnJfbXV4X2Nsa3MJPSBBUlJBWV9TSVpFKGV4eW5vczU0MTBfbXV4X2Nsa3MpLAorCS5kaXZfY2xrcwk9IGV4eW5vczU0MTBfZGl2X2Nsa3MsCisJLm5yX2Rpdl9jbGtzCT0gQVJSQVlfU0laRShleHlub3M1NDEwX2Rpdl9jbGtzKSwKKwkuZ2F0ZV9jbGtzCT0gZXh5bm9zNTQxMF9nYXRlX2Nsa3MsCisJLm5yX2dhdGVfY2xrcwk9IEFSUkFZX1NJWkUoZXh5bm9zNTQxMF9nYXRlX2Nsa3MpLAorCS5ucl9jbGtfaWRzCT0gQ0xLX05SX0NMS1MsCit9OworCiAvKiByZWdpc3RlciBleHlub3M1NDEwIGNsb2NrcyAqLwogc3RhdGljIHZvaWQgX19pbml0IGV4eW5vczU0MTBfY2xrX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3Qgc2Ftc3VuZ19jbGtfcHJvdmlkZXIgKmN0eDsKLQl2b2lkIF9faW9tZW0gKnJlZ19iYXNlOworCXN0cnVjdCBjbGsgKnh4dGkgPSBvZl9jbGtfZ2V0KG5wLCAwKTsKIAotCXJlZ19iYXNlID0gb2ZfaW9tYXAobnAsIDApOwotCWlmICghcmVnX2Jhc2UpCi0JCXBhbmljKCIlczogZmFpbGVkIHRvIG1hcCByZWdpc3RlcnNcbiIsIF9fZnVuY19fKTsKKwlpZiAoIUlTX0VSUih4eHRpKSAmJiBjbGtfZ2V0X3JhdGUoeHh0aSkgPT0gMjQgKiBNSFopCisJCWV4eW5vczU0MTBfcGxsc1tlcGxsXS5yYXRlX3RhYmxlID0gZXh5bm9zNTQxMF9wbGwyNTUweF8yNG1oel90Ymw7CiAKLQljdHggPSBzYW1zdW5nX2Nsa19pbml0KG5wLCByZWdfYmFzZSwgQ0xLX05SX0NMS1MpOwotCi0Jc2Ftc3VuZ19jbGtfcmVnaXN0ZXJfcGxsKGN0eCwgZXh5bm9zNTQxMF9wbGxzLAotCQkJQVJSQVlfU0laRShleHlub3M1NDEwX3BsbHMpLCByZWdfYmFzZSk7Ci0KLQlzYW1zdW5nX2Nsa19yZWdpc3Rlcl9tdXgoY3R4LCBleHlub3M1NDEwX211eF9jbGtzLAotCQkJQVJSQVlfU0laRShleHlub3M1NDEwX211eF9jbGtzKSk7Ci0Jc2Ftc3VuZ19jbGtfcmVnaXN0ZXJfZGl2KGN0eCwgZXh5bm9zNTQxMF9kaXZfY2xrcywKLQkJCUFSUkFZX1NJWkUoZXh5bm9zNTQxMF9kaXZfY2xrcykpOwotCXNhbXN1bmdfY2xrX3JlZ2lzdGVyX2dhdGUoY3R4LCBleHlub3M1NDEwX2dhdGVfY2xrcywKLQkJCUFSUkFZX1NJWkUoZXh5bm9zNTQxMF9nYXRlX2Nsa3MpKTsKLQotCXNhbXN1bmdfY2xrX29mX2FkZF9wcm92aWRlcihucCwgY3R4KTsKKwlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZjbXUpOwogCiAJcHJfZGVidWcoIkV4eW5vczU0MTA6IGNsb2NrIHNldHVwIGNvbXBsZXRlZC5cbiIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZXh5bm9zNTQyMC5jIGIvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZXh5bm9zNTQyMC5jCmluZGV4IGJiMTk2Y2EuLjhjOGI0OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLWV4eW5vczU0MjAuYworKysgYi9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1leHlub3M1NDIwLmMKQEAgLTEzMSw2ICsxMzEsOSBAQAogI2RlZmluZSBUT1BfU1BBUkUyCQkweDEwYjA4CiAjZGVmaW5lIEJQTExfTE9DSwkJMHgyMDAxMAogI2RlZmluZSBCUExMX0NPTjAJCTB4MjAxMTAKKyNkZWZpbmUgU1JDX0NEUkVYCQkweDIwMjAwCisjZGVmaW5lIERJVl9DRFJFWDAJCTB4MjA1MDAKKyNkZWZpbmUgRElWX0NEUkVYMQkJMHgyMDUwNAogI2RlZmluZSBLUExMX0xPQ0sJCTB4MjgwMDAKICNkZWZpbmUgS1BMTF9DT04wCQkweDI4MTAwCiAjZGVmaW5lIFNSQ19LRkMJCQkweDI4MjAwCkBAIC0yNDQsNiArMjQ3LDkgQEAKIAlHQVRFX1RPUF9TQ0xLX0ZTWVMsCiAJR0FURV9UT1BfU0NMS19QRVJJQywKIAlUT1BfU1BBUkUyLAorCVNSQ19DRFJFWCwKKwlESVZfQ0RSRVgwLAorCURJVl9DRFJFWDEsCiAJU1JDX0tGQywKIAlESVZfS0ZDMCwKIH07CkBAIC00NDgsNiArNDU0LDggQEAKIAkJCSAibW91dF9zY2xrX2VwbGwiLCAibW91dF9zY2xrX3JwbGwifTsKIFBOQU1FKG1vdXRfbWF1X2VwbGxfY2xrX3ApID0geyJtb3V0X3NjbGtfZXBsbCIsICJtb3V0X3NjbGtfZHBsbCIsCiAJCQkJIm1vdXRfc2Nsa19tcGxsIiwgIm1vdXRfc2Nsa19zcGxsIn07CitQTkFNRShtb3V0X21jbGtfY2RyZXhfcCkgPSB7Im1vdXRfYnBsbCIsICJtb3V0X214X21zcGxsX2Njb3JlIn07CisKIC8qIExpc3Qgb2YgcGFyZW50cyBzcGVjaWZpYyB0byBleHlub3M1ODAwICovCiBQTkFNRShtb3V0X2VwbGwyXzU4MDBfcCkJPSB7ICJtb3V0X3NjbGtfZXBsbCIsICJmZl9kb3V0X2VwbGwyIiB9OwogUE5BTUUobW91dF9ncm91cDFfNTgwMF9wKQk9IHsgIm1vdXRfc2Nsa19jcGxsIiwgIm1vdXRfc2Nsa19kcGxsIiwKQEAgLTQ2NSw2ICs0NzMsOSBAQAogUE5BTUUobW91dF9ncm91cDdfNTgwMF9wKQk9IHsgIm1vdXRfc2Nsa19jcGxsIiwgIm1vdXRfc2Nsa19kcGxsIiwKIAkJCQkJIm1vdXRfc2Nsa19tcGxsIiwgIm1vdXRfc2Nsa19zcGxsIiwKIAkJCQkJIm1vdXRfZXBsbDIiLCAibW91dF9zY2xrX2lwbGwiIH07CitQTkFNRShtb3V0X214X21zcGxsX2Njb3JlX3ApCT0geyJzY2xrX2JwbGwiLCAibW91dF9zY2xrX2RwbGwiLAorCQkJCQkibW91dF9zY2xrX21wbGwiLCAiZmZfZG91dF9zcGxsMiIsCisJCQkJCSJtb3V0X3NjbGtfc3BsbCIsICJtb3V0X3NjbGtfZXBsbCJ9OwogUE5BTUUobW91dF9tYXVfZXBsbF9jbGtfNTgwMF9wKQk9IHsgIm1vdXRfc2Nsa19lcGxsIiwgIm1vdXRfc2Nsa19kcGxsIiwKIAkJCQkJIm1vdXRfc2Nsa19tcGxsIiwKIAkJCQkJImZmX2RvdXRfc3BsbDIiIH07CkBAIC01MjMsNiArNTM0LDggQEAKIAlNVVgoMCwgIm1vdXRfYWNsazMwMF9kaXNwMSIsIG1vdXRfZ3JvdXA1XzU4MDBfcCwgU1JDX1RPUDIsIDI0LCAyKSwKIAlNVVgoMCwgIm1vdXRfYWNsazMwMF9nc2NsIiwgbW91dF9ncm91cDVfNTgwMF9wLCBTUkNfVE9QMiwgMjgsIDIpLAogCisJTVVYKENMS19NT1VUX01YX01TUExMX0NDT1JFLCAibW91dF9teF9tc3BsbF9jY29yZSIsCisJCQltb3V0X214X21zcGxsX2Njb3JlX3AsIFNSQ19UT1A3LCAxNiwgMiksCiAJTVVYKDAsICJtb3V0X21hdV9lcGxsX2NsayIsIG1vdXRfbWF1X2VwbGxfY2xrXzU4MDBfcCwgU1JDX1RPUDcsCiAJCQkyMCwgMiksCiAJTVVYKDAsICJzY2xrX2JwbGwiLCBtb3V0X2JwbGxfcCwgU1JDX1RPUDcsIDI0LCAxKSwKQEAgLTYwMSw2ICs2MTQsOCBAQAogCU1VWCgwLCAibW91dF9hY2xrMzAwX2Rpc3AxIiwgbW91dF9ncm91cDFfcCwgU1JDX1RPUDIsIDI0LCAyKSwKIAlNVVgoMCwgIm1vdXRfYWNsazMwMF9nc2NsIiwgbW91dF9ncm91cDFfcCwgU1JDX1RPUDIsIDI4LCAyKSwKIAorCU1VWChDTEtfTU9VVF9NWF9NU1BMTF9DQ09SRSwgIm1vdXRfbXhfbXNwbGxfY2NvcmUiLAorCQkJbW91dF9ncm91cDVfNTgwMF9wLCBTUkNfVE9QNywgMTYsIDIpLAogCU1VWCgwLCAibW91dF9tYXVfZXBsbF9jbGsiLCBtb3V0X21hdV9lcGxsX2Nsa19wLCBTUkNfVE9QNywgMjAsIDIpLAogCiAJTVVYKDAsICJtb3V0X2ZpbWQxIiwgbW91dF9ncm91cDNfcCwgU1JDX0RJU1AxMCwgNCwgMSksCkBAIC03NDQsNiArNzU5LDEyIEBACiAKIAlNVVgoMCwgIm1vdXRfZmltZDFfZmluYWwiLCBtb3V0X2ZpbWQxX2ZpbmFsX3AsIFRPUF9TUEFSRTIsIDgsIDEpLAogCisJLyogQ0RSRVggYmxvY2sgKi8KKwlNVVhfRihDTEtfTU9VVF9NQ0xLX0NEUkVYLCAibW91dF9tY2xrX2NkcmV4IiwgbW91dF9tY2xrX2NkcmV4X3AsCisJCQlTUkNfQ0RSRVgsIDQsIDEsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCU1VWF9GKENMS19NT1VUX0JQTEwsICJtb3V0X2JwbGwiLCBtb3V0X2JwbGxfcCwgU1JDX0NEUkVYLCAwLCAxLAorCQkJQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisKIAkvKiBNQVUgQmxvY2sgKi8KIAlNVVgoQ0xLX01PVVRfTUFVRElPMCwgIm1vdXRfbWF1ZGlvMCIsIG1vdXRfbWF1ZGlvMF9wLCBTUkNfTUFVLCAyOCwgMyksCiAKQEAgLTgzNiw2ICs4NTcsMjEgQEAKIAlESVYoQ0xLX0RPVVRfQUNMSzQwMF9ESVNQMSwgImRvdXRfYWNsazQwMF9kaXNwMSIsCiAJCQkibW91dF9hY2xrNDAwX2Rpc3AxIiwgRElWX1RPUDIsIDQsIDMpLAogCisJLyogQ0RSRVggQmxvY2sgKi8KKwlESVYoQ0xLX0RPVVRfUENMS19DRFJFWCwgImRvdXRfcGNsa19jZHJleCIsICJkb3V0X2FjbGtfY2RyZXgxIiwKKwkJCURJVl9DRFJFWDAsIDI4LCAzKSwKKwlESVZfRihDTEtfRE9VVF9TQ0xLX0NEUkVYLCAiZG91dF9zY2xrX2NkcmV4IiwgIm1vdXRfbWNsa19jZHJleCIsCisJCQlESVZfQ0RSRVgwLCAyNCwgMywgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJRElWKENMS19ET1VUX0FDTEtfQ0RSRVgxLCAiZG91dF9hY2xrX2NkcmV4MSIsICJkb3V0X2NsazJ4X3BoeTAiLAorCQkJRElWX0NEUkVYMCwgMTYsIDMpLAorCURJVihDTEtfRE9VVF9DQ0xLX0RSRVgwLCAiZG91dF9jY2xrX2RyZXgwIiwgImRvdXRfY2xrMnhfcGh5MCIsCisJCQlESVZfQ0RSRVgwLCA4LCAzKSwKKwlESVYoQ0xLX0RPVVRfQ0xLMlhfUEhZMCwgImRvdXRfY2xrMnhfcGh5MCIsICJkb3V0X3NjbGtfY2RyZXgiLAorCQkJRElWX0NEUkVYMCwgMywgNSksCisKKwlESVYoQ0xLX0RPVVRfUENMS19DT1JFX01FTSwgImRvdXRfcGNsa19jb3JlX21lbSIsICJtb3V0X21jbGtfY2RyZXgiLAorCQkJRElWX0NEUkVYMSwgOCwgMyksCisKIAkvKiBBdWRpbyBCbG9jayAqLwogCURJVigwLCAiZG91dF9tYXVkaW8wIiwgIm1vdXRfbWF1ZGlvMCIsIERJVl9NQVUsIDIwLCA0KSwKIAlESVYoMCwgImRvdXRfbWF1cGNtMCIsICJkb3V0X21hdWRpbzAiLCBESVZfTUFVLCAyNCwgOCksCkBAIC0xMzY0LDYgKzE0MDAsNyBAQAogCWlmIChfZ2V0X3JhdGUoImZpbl9wbGwiKSA9PSAyNCAqIE1IWikgewogCQlleHlub3M1eF9wbGxzW2FwbGxdLnJhdGVfdGFibGUgPSBleHlub3M1NDIwX3BsbDI1NTB4XzI0bWh6X3RibDsKIAkJZXh5bm9zNXhfcGxsc1trcGxsXS5yYXRlX3RhYmxlID0gZXh5bm9zNTQyMF9wbGwyNTUweF8yNG1oel90Ymw7CisJCWV4eW5vczV4X3BsbHNbYnBsbF0ucmF0ZV90YWJsZSA9IGV4eW5vczU0MjBfcGxsMjU1MHhfMjRtaHpfdGJsOwogCX0KIAogCXNhbXN1bmdfY2xrX3JlZ2lzdGVyX3BsbChjdHgsIGV4eW5vczV4X3BsbHMsIEFSUkFZX1NJWkUoZXh5bm9zNXhfcGxscyksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1leHlub3M1NDQwLmMgYi9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1leHlub3M1NDQwLmMKaW5kZXggYTU3ZDAxYi4uYTgwZjNlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZXh5bm9zNTQ0MC5jCisrKyBiL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLWV4eW5vczU0NDAuYwpAQCAtMTEyLDYgKzExMiwxMSBAQAogCS5wcmlvcml0eSA9IDEyOCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19wbGxfY2xvY2sgZXh5bm9zNTQ0MF9wbGxzW10gX19pbml0Y29uc3QgPSB7CisJUExMKHBsbF8yNTUweCwgQ0xLX0NQTExBLCAiY3BsbGEiLCAieHRhbCIsIDAsIDB4NGMsIE5VTEwpLAorCVBMTChwbGxfMjU1MHgsIENMS19DUExMQiwgImNwbGxiIiwgInh0YWwiLCAwLCAweDUwLCBOVUxMKSwKK307CisKIC8qIHJlZ2lzdGVyIGV4eW5vczU0NDAgY2xvY2tzICovCiBzdGF0aWMgdm9pZCBfX2luaXQgZXh5bm9zNTQ0MF9jbGtfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewpAQCAtMTI5LDggKzEzNCw4IEBACiAJc2Ftc3VuZ19jbGtfb2ZfcmVnaXN0ZXJfZml4ZWRfZXh0KGN0eCwgZXh5bm9zNTQ0MF9maXhlZF9yYXRlX2V4dF9jbGtzLAogCQlBUlJBWV9TSVpFKGV4eW5vczU0NDBfZml4ZWRfcmF0ZV9leHRfY2xrcyksIGV4dF9jbGtfbWF0Y2gpOwogCi0Jc2Ftc3VuZ19jbGtfcmVnaXN0ZXJfcGxsMjU1MHgoImNwbGxhIiwgInh0YWwiLCByZWdfYmFzZSArIDB4MWMsIDB4MTApOwotCXNhbXN1bmdfY2xrX3JlZ2lzdGVyX3BsbDI1NTB4KCJjcGxsYiIsICJ4dGFsIiwgcmVnX2Jhc2UgKyAweDIwLCAweDEwKTsKKwlzYW1zdW5nX2Nsa19yZWdpc3Rlcl9wbGwoY3R4LCBleHlub3M1NDQwX3BsbHMsCisJCQlBUlJBWV9TSVpFKGV4eW5vczU0NDBfcGxscyksIGN0eC0+cmVnX2Jhc2UpOwogCiAJc2Ftc3VuZ19jbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShjdHgsIGV4eW5vczU0NDBfZml4ZWRfcmF0ZV9jbGtzLAogCQkJQVJSQVlfU0laRShleHlub3M1NDQwX2ZpeGVkX3JhdGVfY2xrcykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstcGxsLmMgYi9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1wbGwuYwppbmRleCA0ODEzOWJkLi45NjE3ODI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1wbGwuYworKysgYi9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1wbGwuYwpAQCAtODkwLDIyICs4OTAsMTQgQEAKICNkZWZpbmUgUExMMjU1MFhfTV9TSElGVCAgICAgICg0KQogI2RlZmluZSBQTEwyNTUwWF9TX1NISUZUICAgICAgKDApCiAKLXN0cnVjdCBzYW1zdW5nX2Nsa19wbGwyNTUweCB7Ci0Jc3RydWN0IGNsa19odwkJaHc7Ci0JY29uc3Qgdm9pZCBfX2lvbWVtCSpyZWdfYmFzZTsKLQl1bnNpZ25lZCBsb25nCQlvZmZzZXQ7Ci19OwotCi0jZGVmaW5lIHRvX2Nsa19wbGwyNTUweChfaHcpIGNvbnRhaW5lcl9vZihfaHcsIHN0cnVjdCBzYW1zdW5nX2Nsa19wbGwyNTUweCwgaHcpCi0KIHN0YXRpYyB1bnNpZ25lZCBsb25nIHNhbXN1bmdfcGxsMjU1MHhfcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCiAJCQkJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKIHsKLQlzdHJ1Y3Qgc2Ftc3VuZ19jbGtfcGxsMjU1MHggKnBsbCA9IHRvX2Nsa19wbGwyNTUweChodyk7CisJc3RydWN0IHNhbXN1bmdfY2xrX3BsbCAqcGxsID0gdG9fY2xrX3BsbChodyk7CiAJdTMyIHIsIHAsIG0sIHMsIHBsbF9zdGF0OwogCXU2NCBmdmNvID0gcGFyZW50X3JhdGU7CiAKLQlwbGxfc3RhdCA9IHJlYWRsX3JlbGF4ZWQocGxsLT5yZWdfYmFzZSArIHBsbC0+b2Zmc2V0ICogMyk7CisJcGxsX3N0YXQgPSByZWFkbF9yZWxheGVkKHBsbC0+Y29uX3JlZyk7CiAJciA9IChwbGxfc3RhdCA+PiBQTEwyNTUwWF9SX1NISUZUKSAmIFBMTDI1NTBYX1JfTUFTSzsKIAlpZiAoIXIpCiAJCXJldHVybiAwOwpAQCAtOTIzLDQzICs5MTUsNiBAQAogCS5yZWNhbGNfcmF0ZSA9IHNhbXN1bmdfcGxsMjU1MHhfcmVjYWxjX3JhdGUsCiB9OwogCi1zdHJ1Y3QgY2xrICogX19pbml0IHNhbXN1bmdfY2xrX3JlZ2lzdGVyX3BsbDI1NTB4KGNvbnN0IGNoYXIgKm5hbWUsCi0JCQljb25zdCBjaGFyICpwbmFtZSwgY29uc3Qgdm9pZCBfX2lvbWVtICpyZWdfYmFzZSwKLQkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQotewotCXN0cnVjdCBzYW1zdW5nX2Nsa19wbGwyNTUweCAqcGxsOwotCXN0cnVjdCBjbGsgKmNsazsKLQlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwotCi0JcGxsID0ga3phbGxvYyhzaXplb2YoKnBsbCksIEdGUF9LRVJORUwpOwotCWlmICghcGxsKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBwbGwgY2xrICVzXG4iLCBfX2Z1bmNfXywgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWluaXQubmFtZSA9IG5hbWU7Ci0JaW5pdC5vcHMgPSAmc2Ftc3VuZ19wbGwyNTUweF9jbGtfb3BzOwotCWluaXQuZmxhZ3MgPSBDTEtfR0VUX1JBVEVfTk9DQUNIRTsKLQlpbml0LnBhcmVudF9uYW1lcyA9ICZwbmFtZTsKLQlpbml0Lm51bV9wYXJlbnRzID0gMTsKLQotCXBsbC0+aHcuaW5pdCA9ICZpbml0OwotCXBsbC0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKLQlwbGwtPm9mZnNldCA9IG9mZnNldDsKLQotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmcGxsLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKSB7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byByZWdpc3RlciBwbGwgY2xvY2sgJXNcbiIsIF9fZnVuY19fLAotCQkJCW5hbWUpOwotCQlrZnJlZShwbGwpOwotCX0KLQotCWlmIChjbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgbmFtZSwgTlVMTCkpCi0JCXByX2VycigiJXM6IGZhaWxlZCB0byByZWdpc3RlciBsb29rdXAgZm9yICVzIiwgX19mdW5jX18sIG5hbWUpOwotCi0JcmV0dXJuIGNsazsKLX0KLQogLyoKICAqIFBMTDI1NTB4eCBDbG9jayBUeXBlCiAgKi8KQEAgLTEwNjMsNiArMTAxOCwxMDIgQEAKIH07CiAKIC8qCisgKiBQTEwyNjUweCBDbG9jayBUeXBlCisgKi8KKworLyogTWF4aW11bSBsb2NrIHRpbWUgY2FuIGJlIDMwMDAgKiBQRElWIGN5Y2xlcyAqLworI2RlZmluZSBQTEwyNjUwWF9MT0NLX0ZBQ1RPUgkJMzAwMAorCisjZGVmaW5lIFBMTDI2NTBYX01fTUFTSwkJCTB4MWZmCisjZGVmaW5lIFBMTDI2NTBYX1BfTUFTSwkJCTB4M2YKKyNkZWZpbmUgUExMMjY1MFhfU19NQVNLCQkJMHg3CisjZGVmaW5lIFBMTDI2NTBYX0tfTUFTSwkJCTB4ZmZmZgorI2RlZmluZSBQTEwyNjUwWF9MT0NLX1NUQVRfTUFTSwkJMHgxCisjZGVmaW5lIFBMTDI2NTBYX01fU0hJRlQJCTE2CisjZGVmaW5lIFBMTDI2NTBYX1BfU0hJRlQJCTgKKyNkZWZpbmUgUExMMjY1MFhfU19TSElGVAkJMAorI2RlZmluZSBQTEwyNjUwWF9LX1NISUZUCQkwCisjZGVmaW5lIFBMTDI2NTBYX0xPQ0tfU1RBVF9TSElGVAkyOQorI2RlZmluZSBQTEwyNjUwWF9QTExfRU5BQkxFX1NISUZUCTMxCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNhbXN1bmdfcGxsMjY1MHhfcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCisJCQkJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19jbGtfcGxsICpwbGwgPSB0b19jbGtfcGxsKGh3KTsKKwl1NjQgZm91dCA9IHBhcmVudF9yYXRlOworCXUzMiBtZGl2LCBwZGl2LCBzZGl2LCBwbGxfY29uMCwgcGxsX2NvbjE7CisJczE2IGtkaXY7CisKKwlwbGxfY29uMCA9IHJlYWRsX3JlbGF4ZWQocGxsLT5jb25fcmVnKTsKKwltZGl2ID0gKHBsbF9jb24wID4+IFBMTDI2NTBYX01fU0hJRlQpICYgUExMMjY1MFhfTV9NQVNLOworCXBkaXYgPSAocGxsX2NvbjAgPj4gUExMMjY1MFhfUF9TSElGVCkgJiBQTEwyNjUwWF9QX01BU0s7CisJc2RpdiA9IChwbGxfY29uMCA+PiBQTEwyNjUwWF9TX1NISUZUKSAmIFBMTDI2NTBYX1NfTUFTSzsKKworCXBsbF9jb24xID0gcmVhZGxfcmVsYXhlZChwbGwtPmNvbl9yZWcgKyA0KTsKKwlrZGl2ID0gKHMxNikoKHBsbF9jb24xID4+IFBMTDI2NTBYX0tfU0hJRlQpICYgUExMMjY1MFhfS19NQVNLKTsKKworCWZvdXQgKj0gKG1kaXYgPDwgMTYpICsga2RpdjsKKwlkb19kaXYoZm91dCwgKHBkaXYgPDwgc2RpdikpOworCWZvdXQgPj49IDE2OworCisJcmV0dXJuICh1bnNpZ25lZCBsb25nKWZvdXQ7Cit9CisKK3N0YXRpYyBpbnQgc2Ftc3VuZ19wbGwyNjUweF9zZXRfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywgdW5zaWduZWQgbG9uZyBkcmF0ZSwKKwkJCQkJdW5zaWduZWQgbG9uZyBwcmF0ZSkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19jbGtfcGxsICpwbGwgPSB0b19jbGtfcGxsKGh3KTsKKwljb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19wbGxfcmF0ZV90YWJsZSAqcmF0ZTsKKwl1MzIgY29uMCwgY29uMTsKKworCS8qIEdldCByZXF1aXJlZCByYXRlIHNldHRpbmdzIGZyb20gdGFibGUgKi8KKwlyYXRlID0gc2Ftc3VuZ19nZXRfcGxsX3NldHRpbmdzKHBsbCwgZHJhdGUpOworCWlmICghcmF0ZSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHJhdGUgOiAlbHUgZm9yIHBsbCBjbGsgJXNcbiIsIF9fZnVuY19fLAorCQkJZHJhdGUsIGNsa19od19nZXRfbmFtZShodykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljb24wID0gcmVhZGxfcmVsYXhlZChwbGwtPmNvbl9yZWcpOworCWNvbjEgPSByZWFkbF9yZWxheGVkKHBsbC0+Y29uX3JlZyArIDQpOworCisJLyogU2V0IFBMTCBsb2NrIHRpbWUuICovCisJd3JpdGVsX3JlbGF4ZWQocmF0ZS0+cGRpdiAqIFBMTDI2NTBYX0xPQ0tfRkFDVE9SLCBwbGwtPmxvY2tfcmVnKTsKKworCS8qIENoYW5nZSBQTEwgUE1TIHZhbHVlcyAqLworCWNvbjAgJj0gfigoUExMMjY1MFhfTV9NQVNLIDw8IFBMTDI2NTBYX01fU0hJRlQpIHwKKwkJCShQTEwyNjUwWF9QX01BU0sgPDwgUExMMjY1MFhfUF9TSElGVCkgfAorCQkJKFBMTDI2NTBYX1NfTUFTSyA8PCBQTEwyNjUwWF9TX1NISUZUKSk7CisJY29uMCB8PSAocmF0ZS0+bWRpdiA8PCBQTEwyNjUwWF9NX1NISUZUKSB8CisJCQkocmF0ZS0+cGRpdiA8PCBQTEwyNjUwWF9QX1NISUZUKSB8CisJCQkocmF0ZS0+c2RpdiA8PCBQTEwyNjUwWF9TX1NISUZUKTsKKwljb24wIHw9ICgxIDw8IFBMTDI2NTBYX1BMTF9FTkFCTEVfU0hJRlQpOworCXdyaXRlbF9yZWxheGVkKGNvbjAsIHBsbC0+Y29uX3JlZyk7CisKKwljb24xICY9IH4oUExMMjY1MFhfS19NQVNLIDw8IFBMTDI2NTBYX0tfU0hJRlQpOworCWNvbjEgfD0gKChyYXRlLT5rZGl2ICYgUExMMjY1MFhfS19NQVNLKSA8PCBQTEwyNjUwWF9LX1NISUZUKTsKKwl3cml0ZWxfcmVsYXhlZChjb24xLCBwbGwtPmNvbl9yZWcgKyA0KTsKKworCWRvIHsKKwkJY3B1X3JlbGF4KCk7CisJCWNvbjAgPSByZWFkbF9yZWxheGVkKHBsbC0+Y29uX3JlZyk7CisJfSB3aGlsZSAoIShjb24wICYgKFBMTDI2NTBYX0xPQ0tfU1RBVF9NQVNLCisJCQk8PCBQTEwyNjUwWF9MT0NLX1NUQVRfU0hJRlQpKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHNhbXN1bmdfcGxsMjY1MHhfY2xrX29wcyA9IHsKKwkucmVjYWxjX3JhdGUgPSBzYW1zdW5nX3BsbDI2NTB4X3JlY2FsY19yYXRlLAorCS5yb3VuZF9yYXRlID0gc2Ftc3VuZ19wbGxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUgPSBzYW1zdW5nX3BsbDI2NTB4X3NldF9yYXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHNhbXN1bmdfcGxsMjY1MHhfY2xrX21pbl9vcHMgPSB7CisJLnJlY2FsY19yYXRlID0gc2Ftc3VuZ19wbGwyNjUweF9yZWNhbGNfcmF0ZSwKK307CisKKy8qCiAgKiBQTEwyNjUwWFggQ2xvY2sgVHlwZQogICovCiAKQEAgLTEyNjMsMTIgKzEzMTQsMjEgQEAKIAkJZWxzZQogCQkJaW5pdC5vcHMgPSAmc2Ftc3VuZ19zM2MyNDQwX21wbGxfY2xrX29wczsKIAkJYnJlYWs7CisJY2FzZSBwbGxfMjU1MHg6CisJCWluaXQub3BzID0gJnNhbXN1bmdfcGxsMjU1MHhfY2xrX29wczsKKwkJYnJlYWs7CiAJY2FzZSBwbGxfMjU1MHh4OgogCQlpZiAoIXBsbC0+cmF0ZV90YWJsZSkKIAkJCWluaXQub3BzID0gJnNhbXN1bmdfcGxsMjU1MHh4X2Nsa19taW5fb3BzOwogCQllbHNlCiAJCQlpbml0Lm9wcyA9ICZzYW1zdW5nX3BsbDI1NTB4eF9jbGtfb3BzOwogCQlicmVhazsKKwljYXNlIHBsbF8yNjUweDoKKwkJaWYgKCFwbGwtPnJhdGVfdGFibGUpCisJCQlpbml0Lm9wcyA9ICZzYW1zdW5nX3BsbDI2NTB4X2Nsa19taW5fb3BzOworCQllbHNlCisJCQlpbml0Lm9wcyA9ICZzYW1zdW5nX3BsbDI2NTB4X2Nsa19vcHM7CisJCWJyZWFrOwogCWNhc2UgcGxsXzI2NTB4eDoKIAkJaWYgKCFwbGwtPnJhdGVfdGFibGUpCiAJCQlpbml0Lm9wcyA9ICZzYW1zdW5nX3BsbDI2NTB4eF9jbGtfbWluX29wczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLXBsbC5oIGIvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstcGxsLmgKaW5kZXggMjEzZGU5YS4uYTFjYTAyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstcGxsLmgKKysrIGIvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstcGxsLmgKQEAgLTMxLDcgKzMxLDkgQEAKIAlwbGxfczNjMjQxMF9tcGxsLAogCXBsbF9zM2MyNDEwX3VwbGwsCiAJcGxsX3MzYzI0NDBfbXBsbCwKKwlwbGxfMjU1MHgsCiAJcGxsXzI1NTB4eCwKKwlwbGxfMjY1MHgsCiAJcGxsXzI2NTB4eCwKIAlwbGxfMTQ1MHgsCiAJcGxsXzE0NTF4LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3QvY2xrLWZsZXhnZW4uYyBiL2RyaXZlcnMvY2xrL3N0L2Nsay1mbGV4Z2VuLmMKaW5kZXggNTQ2YmQ3OS4uYTQ4NWYzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3QvY2xrLWZsZXhnZW4uYworKysgYi9kcml2ZXJzL2Nsay9zdC9jbGstZmxleGdlbi5jCkBAIC0xNSw2ICsxNSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogCitzdHJ1Y3QgY2xrZ2VuX2RhdGEgeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBtb2RlOworfTsKKwogc3RydWN0IGZsZXhnZW4gewogCXN0cnVjdCBjbGtfaHcgaHc7CiAKQEAgLTI4LDkgKzMzLDE0IEBACiAJc3RydWN0IGNsa19nYXRlIGZnYXRlOwogCS8qIEZpbmFsIGRpdmlzb3IgKi8KIAlzdHJ1Y3QgY2xrX2RpdmlkZXIgZmRpdjsKKwkvKiBBc3luY2hyb25vdXMgbW9kZSBjb250cm9sICovCisJc3RydWN0IGNsa19nYXRlIHN5bmM7CisJLyogaHcgY29udHJvbCBmbGFncyAqLworCWJvb2wgY29udHJvbF9tb2RlOwogfTsKIAogI2RlZmluZSB0b19mbGV4Z2VuKF9odykgY29udGFpbmVyX29mKF9odywgc3RydWN0IGZsZXhnZW4sIGh3KQorI2RlZmluZSB0b19jbGtfZ2F0ZShfaHcpIGNvbnRhaW5lcl9vZihfaHcsIHN0cnVjdCBjbGtfZ2F0ZSwgaHcpCiAKIHN0YXRpYyBpbnQgZmxleGdlbl9lbmFibGUoc3RydWN0IGNsa19odyAqaHcpCiB7CkBAIC0xMzksMTIgKzE0OSwyMSBAQAogCXN0cnVjdCBmbGV4Z2VuICpmbGV4Z2VuID0gdG9fZmxleGdlbihodyk7CiAJc3RydWN0IGNsa19odyAqcGRpdl9odyA9ICZmbGV4Z2VuLT5wZGl2Lmh3OwogCXN0cnVjdCBjbGtfaHcgKmZkaXZfaHcgPSAmZmxleGdlbi0+ZmRpdi5odzsKKwlzdHJ1Y3QgY2xrX2h3ICpzeW5jX2h3ID0gJmZsZXhnZW4tPnN5bmMuaHc7CisJc3RydWN0IGNsa19nYXRlICpjb25maWcgPSB0b19jbGtfZ2F0ZShzeW5jX2h3KTsKIAl1bnNpZ25lZCBsb25nIGRpdiA9IDA7CiAJaW50IHJldCA9IDA7CisJdTMyIHJlZzsKIAogCV9fY2xrX2h3X3NldF9jbGsocGRpdl9odywgaHcpOwogCV9fY2xrX2h3X3NldF9jbGsoZmRpdl9odywgaHcpOwogCisJaWYgKGZsZXhnZW4tPmNvbnRyb2xfbW9kZSkgeworCQlyZWcgPSByZWFkbChjb25maWctPnJlZyk7CisJCXJlZyAmPSB+QklUKGNvbmZpZy0+Yml0X2lkeCk7CisJCXdyaXRlbChyZWcsIGNvbmZpZy0+cmVnKTsKKwl9CisKIAlkaXYgPSBjbGtfYmVzdF9kaXYocGFyZW50X3JhdGUsIHJhdGUpOwogCiAJLyoKQEAgLTE3OCw3ICsxOTcsNyBAQAogc3RhdGljIHN0cnVjdCBjbGsgKmNsa19yZWdpc3Rlcl9mbGV4Z2VuKGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywgdTggbnVtX3BhcmVudHMsCiAJCQkJdm9pZCBfX2lvbWVtICpyZWcsIHNwaW5sb2NrX3QgKmxvY2ssIHUzMiBpZHgsCi0JCQkJdW5zaWduZWQgbG9uZyBmbGV4Z2VuX2ZsYWdzKSB7CisJCQkJdW5zaWduZWQgbG9uZyBmbGV4Z2VuX2ZsYWdzLCBib29sIG1vZGUpIHsKIAlzdHJ1Y3QgZmxleGdlbiAqZmd4YmFyOwogCXN0cnVjdCBjbGsgKmNsazsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwpAQCAtMjI3LDYgKzI0NiwxMyBAQAogCWZneGJhci0+ZmRpdi5yZWcgPSBmZGl2X3JlZzsKIAlmZ3hiYXItPmZkaXYud2lkdGggPSA2OwogCisJLyogRmluYWwgZGl2aWRlciBzeW5jIGNvbmZpZyAqLworCWZneGJhci0+c3luYy5sb2NrID0gbG9jazsKKwlmZ3hiYXItPnN5bmMucmVnID0gZmRpdl9yZWc7CisJZmd4YmFyLT5zeW5jLmJpdF9pZHggPSA3OworCisJZmd4YmFyLT5jb250cm9sX21vZGUgPSBtb2RlOworCiAJZmd4YmFyLT5ody5pbml0ID0gJmluaXQ7CiAKIAljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJmZneGJhci0+aHcpOwpAQCAtMjU5LDYgKzI4NSwyNyBAQAogCXJldHVybiBwYXJlbnRzOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa2dlbl9kYXRhIGNsa2dlbl9hdWRpbyA9IHsKKwkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtnZW5fZGF0YSBjbGtnZW5fdmlkZW8gPSB7CisJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwkubW9kZSA9IDEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBmbGV4Z2VuX29mX21hdGNoW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJzdCxmbGV4Z2VuLWF1ZGlvIiwKKwkJLmRhdGEgPSAmY2xrZ2VuX2F1ZGlvLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzdCxmbGV4Z2VuLXZpZGVvIiwKKwkJLmRhdGEgPSAmY2xrZ2VuX3ZpZGVvLAorCX0sCisJe30KK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBzdF9vZl9mbGV4Z2VuX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpwbm9kZTsKQEAgLTI2Nyw3ICszMTQsMTEgQEAKIAljb25zdCBjaGFyICoqcGFyZW50czsKIAlpbnQgbnVtX3BhcmVudHMsIGk7CiAJc3BpbmxvY2tfdCAqcmxvY2sgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCXN0cnVjdCBjbGtnZW5fZGF0YSAqZGF0YSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGV4X2ZsYWdzID0gMDsKIAlpbnQgcmV0OworCWJvb2wgY2xrX21vZGUgPSAwOwogCiAJcG5vZGUgPSBvZl9nZXRfcGFyZW50KG5wKTsKIAlpZiAoIXBub2RlKQpAQCAtMjgxLDYgKzMzMiwxMyBAQAogCWlmICghcGFyZW50cykKIAkJcmV0dXJuOwogCisJbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKGZsZXhnZW5fb2ZfbWF0Y2gsIG5wKTsKKwlpZiAobWF0Y2gpIHsKKwkJZGF0YSA9IChzdHJ1Y3QgY2xrZ2VuX2RhdGEgKiltYXRjaC0+ZGF0YTsKKwkJZmxleF9mbGFncyA9IGRhdGEtPmZsYWdzOworCQljbGtfbW9kZSA9IGRhdGEtPm1vZGU7CisJfQorCiAJY2xrX2RhdGEgPSBremFsbG9jKHNpemVvZigqY2xrX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNsa19kYXRhKQogCQlnb3RvIGVycjsKQEAgLTMwNyw3ICszNjUsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBjbGtfZGF0YS0+Y2xrX251bTsgaSsrKSB7CiAJCXN0cnVjdCBjbGsgKmNsazsKIAkJY29uc3QgY2hhciAqY2xrX25hbWU7Ci0JCXVuc2lnbmVkIGxvbmcgZmxleF9mbGFncyA9IDA7CiAKIAkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KG5wLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwKIAkJCQkJCSAgaSwgJmNsa19uYW1lKSkgewpAQCAtMzIzLDcgKzM4MCw3IEBACiAJCQljb250aW51ZTsKIAogCQljbGsgPSBjbGtfcmVnaXN0ZXJfZmxleGdlbihjbGtfbmFtZSwgcGFyZW50cywgbnVtX3BhcmVudHMsCi0JCQkJCSAgIHJlZywgcmxvY2ssIGksIGZsZXhfZmxhZ3MpOworCQkJCQkgICByZWcsIHJsb2NrLCBpLCBmbGV4X2ZsYWdzLCBjbGtfbW9kZSk7CiAKIAkJaWYgKElTX0VSUihjbGspKQogCQkJZ290byBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdC9jbGtnZW4tZnN5bi5jIGIvZHJpdmVycy9jbGsvc3QvY2xrZ2VuLWZzeW4uYwppbmRleCAwOWFmZWI4Li4xNDgxOWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9zdC9jbGtnZW4tZnN5bi5jCisrKyBiL2RyaXZlcnMvY2xrL3N0L2Nsa2dlbi1mc3luLmMKQEAgLTQyLDc5ICs0Miw2IEBACiAJdW5zaWduZWQgbG9uZyBuc2RpdjsKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RtX2ZzIGZzMjE2YzY1X3J0YmxbXSA9IHsKLQl7IC5tZGl2ID0gMHgxZiwgLnBlID0gMHgwLAkuc2RpdiA9IDB4NywJLm5zZGl2ID0gMCB9LAkvKiAzMTIuNSBLaHogKi8KLQl7IC5tZGl2ID0gMHgxNywgLnBlID0gMHgyNWVkLAkuc2RpdiA9IDB4MSwJLm5zZGl2ID0gMCB9LAkvKiAyNyAgICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxYSwgLnBlID0gMHg3YjM2LAkuc2RpdiA9IDB4MiwJLm5zZGl2ID0gMSB9LAkvKiAzNi44NyBNSHogKi8KLQl7IC5tZGl2ID0gMHgxMywgLnBlID0gMHgwLAkuc2RpdiA9IDB4MiwJLm5zZGl2ID0gMSB9LAkvKiA0OCAgICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxMSwgLnBlID0gMHgxYzcyLAkuc2RpdiA9IDB4MSwJLm5zZGl2ID0gMSB9LAkvKiAxMDggICBNSHogKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RtX2ZzIGZzNDMyYzY1X3J0YmxbXSA9IHsKLQl7IC5tZGl2ID0gMHgxZiwgLnBlID0gMHgwLAkuc2RpdiA9IDB4NywJLm5zZGl2ID0gMCB9LAkvKiA2MjUgICAgIEtoeiAqLwotCXsgLm1kaXYgPSAweDEzLCAucGUgPSAweDc3N2MsCS5zZGl2ID0gMHg0LAkubnNkaXYgPSAxIH0sCS8qIDI1LjE3NSAgTUh6ICovCi0JeyAubWRpdiA9IDB4MTksIC5wZSA9IDB4NGQzNSwJLnNkaXYgPSAweDIsCS5uc2RpdiA9IDAgfSwJLyogMjUuMjAwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxMSwgLnBlID0gMHgxYzcyLAkuc2RpdiA9IDB4NCwJLm5zZGl2ID0gMSB9LAkvKiAyNy4wMDAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDE3LCAucGUgPSAweDI4ZjUsCS5zZGl2ID0gMHgyLAkubnNkaXYgPSAwIH0sCS8qIDI3LjAyNyAgTUh6ICovCi0JeyAubWRpdiA9IDB4MTYsIC5wZSA9IDB4MzM1OSwJLnNkaXYgPSAweDIsCS5uc2RpdiA9IDAgfSwJLyogMjguMzIwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxZiwgLnBlID0gMHgyMDgzLAkuc2RpdiA9IDB4MywJLm5zZGl2ID0gMSB9LAkvKiAzMC4yNDAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDFlLCAucGUgPSAweDQzMGQsCS5zZGl2ID0gMHgzLAkubnNkaXYgPSAxIH0sCS8qIDMxLjUwMCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MTcsIC5wZSA9IDB4MCwJLnNkaXYgPSAweDMsCS5uc2RpdiA9IDEgfSwJLyogNDAuMDAwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxOSwgLnBlID0gMHgxMjFhLAkuc2RpdiA9IDB4MSwJLm5zZGl2ID0gMCB9LAkvKiA0OS41MDAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDEzLCAucGUgPSAweDY2NjcsCS5zZGl2ID0gMHgzLAkubnNkaXYgPSAxIH0sCS8qIDUwLjAwMCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MTAsIC5wZSA9IDB4MWVlNiwJLnNkaXYgPSAweDMsCS5uc2RpdiA9IDEgfSwJLyogNTcuMjg0ICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxZCwgLnBlID0gMHgzYjE0LAkuc2RpdiA9IDB4MiwJLm5zZGl2ID0gMSB9LAkvKiA2NS4wMDAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDEyLCAucGUgPSAweDdjNjUsCS5zZGl2ID0gMHgxLAkubnNkaXYgPSAwIH0sCS8qIDcxLjAwMCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MTksIC5wZSA9IDB4ZWNkLAkuc2RpdiA9IDB4MiwJLm5zZGl2ID0gMSB9LAkvKiA3NC4xNzYgIE1IeiAqLwotCXsgLm1kaXYgPSAweDE5LCAucGUgPSAweDEyMWEsCS5zZGl2ID0gMHgyLAkubnNkaXYgPSAxIH0sCS8qIDc0LjI1MCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MTksIC5wZSA9IDB4MzMzNCwJLnNkaXYgPSAweDIsCS5uc2RpdiA9IDEgfSwJLyogNzUuMDAwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxOCwgLnBlID0gMHg1MTM4LAkuc2RpdiA9IDB4MiwJLm5zZGl2ID0gMSB9LAkvKiA3OC44MDAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDFkLCAucGUgPSAweDc3ZCwJLnNkaXYgPSAweDAsCS5uc2RpdiA9IDAgfSwJLyogODUuNTAwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxYywgLnBlID0gMHgxM2Q1LAkuc2RpdiA9IDB4MCwJLm5zZGl2ID0gMCB9LAkvKiA4OC43NTAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDExLCAucGUgPSAweDFjNzIsCS5zZGl2ID0gMHgyLAkubnNkaXYgPSAxIH0sCS8qIDEwOC4wMDAgTUh6ICovCi0JeyAubWRpdiA9IDB4MTcsIC5wZSA9IDB4MjhmNSwJLnNkaXYgPSAweDAsCS5uc2RpdiA9IDAgfSwJLyogMTA4LjEwOCBNSHogKi8KLQl7IC5tZGl2ID0gMHgxMCwgLnBlID0gMHg2ZTI2LAkuc2RpdiA9IDB4MiwJLm5zZGl2ID0gMSB9LAkvKiAxMTguOTYzIE1IeiAqLwotCXsgLm1kaXYgPSAweDE1LCAucGUgPSAweDNlNjMsCS5zZGl2ID0gMHgwLAkubnNkaXYgPSAwIH0sCS8qIDExOS4wMDAgTUh6ICovCi0JeyAubWRpdiA9IDB4MWMsIC5wZSA9IDB4NDcxZCwJLnNkaXYgPSAweDEsCS5uc2RpdiA9IDEgfSwJLyogMTM1LjAwMCBNSHogKi8KLQl7IC5tZGl2ID0gMHgxOSwgLnBlID0gMHhlY2QsCS5zZGl2ID0gMHgxLAkubnNkaXYgPSAxIH0sCS8qIDE0OC4zNTIgTUh6ICovCi0JeyAubWRpdiA9IDB4MTksIC5wZSA9IDB4MTIxYSwJLnNkaXYgPSAweDEsCS5uc2RpdiA9IDEgfSwJLyogMTQ4LjUwMCBNSHogKi8KLQl7IC5tZGl2ID0gMHgxOSwgLnBlID0gMHgxMjFhLAkuc2RpdiA9IDB4MCwJLm5zZGl2ID0gMSB9LAkvKiAyOTcgICAgIE1IeiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzdG1fZnMgZnM2NjBjMzJfcnRibFtdID0gewotCXsgLm1kaXYgPSAweDE0LCAucGUgPSAweDM3NmIsCS5zZGl2ID0gMHg0LAkubnNkaXYgPSAxIH0sCS8qIDI1LjE3NSAgTUh6ICovCi0JeyAubWRpdiA9IDB4MTQsIC5wZSA9IDB4MzBjMywJLnNkaXYgPSAweDQsCS5uc2RpdiA9IDEgfSwJLyogMjUuMjAwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxMCwgLnBlID0gMHg3MWM3LAkuc2RpdiA9IDB4NCwJLm5zZGl2ID0gMSB9LAkvKiAyNy4wMDAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDAwLCAucGUgPSAweDQ3YWYsCS5zZGl2ID0gMHgzLAkubnNkaXYgPSAwIH0sCS8qIDI3LjAyNyAgTUh6ICovCi0JeyAubWRpdiA9IDB4MGUsIC5wZSA9IDB4NGUxYSwJLnNkaXYgPSAweDQsCS5uc2RpdiA9IDEgfSwJLyogMjguMzIwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgwYiwgLnBlID0gMHg1MzRkLAkuc2RpdiA9IDB4NCwJLm5zZGl2ID0gMSB9LAkvKiAzMC4yNDAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDE3LCAucGUgPSAweDZmYmYsCS5zZGl2ID0gMHgyLAkubnNkaXYgPSAwIH0sCS8qIDMxLjUwMCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MDEsIC5wZSA9IDB4MCwJLnNkaXYgPSAweDQsCS5uc2RpdiA9IDEgfSwJLyogNDAuMDAwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxNSwgLnBlID0gMHgyYWFiLAkuc2RpdiA9IDB4MywJLm5zZGl2ID0gMSB9LAkvKiA0OS41MDAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDE0LCAucGUgPSAweDY2NjYsCS5zZGl2ID0gMHgzLAkubnNkaXYgPSAxIH0sCS8qIDUwLjAwMCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MWQsIC5wZSA9IDB4Mzk1ZiwJLnNkaXYgPSAweDEsCS5uc2RpdiA9IDAgfSwJLyogNTcuMjg0ICBNSHogKi8KLQl7IC5tZGl2ID0gMHgwOCwgLnBlID0gMHg0ZWM1LAkuc2RpdiA9IDB4MywJLm5zZGl2ID0gMSB9LAkvKiA2NS4wMDAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDA1LCAucGUgPSAweDE3NzAsCS5zZGl2ID0gMHgzLAkubnNkaXYgPSAxIH0sCS8qIDcxLjAwMCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MDMsIC5wZSA9IDB4NGJhNywJLnNkaXYgPSAweDMsCS5uc2RpdiA9IDEgfSwJLyogNzQuMTc2ICBNSHogKi8KLQl7IC5tZGl2ID0gMHgwZiwgLnBlID0gMHgzNDI2LAkuc2RpdiA9IDB4MSwJLm5zZGl2ID0gMCB9LAkvKiA3NC4yNTAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDBlLCAucGUgPSAweDc3NzcsCS5zZGl2ID0gMHgxLAkubnNkaXYgPSAwIH0sCS8qIDc1LjAwMCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MDEsIC5wZSA9IDB4NDA1MywJLnNkaXYgPSAweDMsCS5uc2RpdiA9IDEgfSwJLyogNzguODAwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgwOSwgLnBlID0gMHgxNWI1LAkuc2RpdiA9IDB4MSwJLm5zZGl2ID0gMCB9LAkvKiA4NS41MDAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDFiLCAucGUgPSAweDNmMTksCS5zZGl2ID0gMHgyLAkubnNkaXYgPSAxIH0sCS8qIDg4Ljc1MCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MTAsIC5wZSA9IDB4NzFjNywJLnNkaXYgPSAweDIsCS5uc2RpdiA9IDEgfSwJLyogMTA4LjAwMCBNSHogKi8KLQl7IC5tZGl2ID0gMHgwMCwgLnBlID0gMHg0N2FmLAkuc2RpdiA9IDB4MSwJLm5zZGl2ID0gMCB9LAkvKiAxMDguMTA4IE1IeiAqLwotCXsgLm1kaXYgPSAweDBjLCAucGUgPSAweDMxMTgsCS5zZGl2ID0gMHgyLAkubnNkaXYgPSAxIH0sCS8qIDExOC45NjMgTUh6ICovCi0JeyAubWRpdiA9IDB4MGMsIC5wZSA9IDB4MmY1NCwJLnNkaXYgPSAweDIsCS5uc2RpdiA9IDEgfSwJLyogMTE5LjAwMCBNSHogKi8KLQl7IC5tZGl2ID0gMHgwNywgLnBlID0gMHhlMzksCS5zZGl2ID0gMHgyLAkubnNkaXYgPSAxIH0sCS8qIDEzNS4wMDAgTUh6ICovCi0JeyAubWRpdiA9IDB4MDMsIC5wZSA9IDB4NGJhNywJLnNkaXYgPSAweDIsCS5uc2RpdiA9IDEgfSwJLyogMTQ4LjM1MiBNSHogKi8KLQl7IC5tZGl2ID0gMHgwZiwgLnBlID0gMHgzNDI2LAkuc2RpdiA9IDB4MCwJLm5zZGl2ID0gMCB9LAkvKiAxNDguNTAwIE1IeiAqLwotCXsgLm1kaXYgPSAweDAzLCAucGUgPSAweDRiYTcsCS5zZGl2ID0gMHgxLAkubnNkaXYgPSAxIH0sCS8qIDI5Ni43MDQgTUh6ICovCi0JeyAubWRpdiA9IDB4MDMsIC5wZSA9IDB4NDcxYywJLnNkaXYgPSAweDEsCS5uc2RpdiA9IDEgfSwJLyogMjk3LjAwMCBNSHogKi8KLQl7IC5tZGl2ID0gMHgwMCwgLnBlID0gMHgyOTVmLAkuc2RpdiA9IDB4MSwJLm5zZGl2ID0gMSB9LAkvKiAzMjYuNzAwIE1IeiAqLwotCXsgLm1kaXYgPSAweDFmLCAucGUgPSAweDM2MzMsCS5zZGl2ID0gMHgwLAkubnNkaXYgPSAxIH0sCS8qIDMzMy4wMDAgTUh6ICovCi0JeyAubWRpdiA9IDB4MWMsIC5wZSA9IDB4MCwJLnNkaXYgPSAweDAsCS5uc2RpdiA9IDEgfSwJLyogMzUyLjAwMCBNaHogKi8KLX07Ci0KIHN0cnVjdCBjbGtnZW5fcXVhZGZzX2RhdGEgewogCWJvb2wgcmVzZXRfcHJlc2VudDsKIAlib29sIGJ3ZmlsdGVyX3ByZXNlbnQ7CkBAIC0xMzgsMTc0ICs2NSwxOCBAQAogCXN0cnVjdCBjbGtnZW5fZmllbGQgbnNkaXZbUVVBREZTX01BWF9DSEFOXTsKIAogCWNvbnN0IHN0cnVjdCBjbGtfb3BzICpwbGxfb3BzOwotCWNvbnN0IHN0cnVjdCBzdG1fZnMgKnJ0Ymw7Ci0JdTggcnRibF9jbnQ7CisJaW50ICAoKmdldF9wYXJhbXMpKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBzdG1fZnMgKik7CiAJaW50ICAoKmdldF9yYXRlKSh1bnNpZ25lZCBsb25nICwgY29uc3Qgc3RydWN0IHN0bV9mcyAqLAogCQkJdW5zaWduZWQgbG9uZyAqKTsKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzdF9xdWFkZnNfcGxsX2M2NV9vcHM7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc3RfcXVhZGZzX3BsbF9jMzJfb3BzOwotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHN0X3F1YWRmc19mczIxNmM2NV9vcHM7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc3RfcXVhZGZzX2ZzNDMyYzY1X29wczsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzdF9xdWFkZnNfZnM2NjBjMzJfb3BzOwogCi1zdGF0aWMgaW50IGNsa19mczIxNmM2NV9nZXRfcmF0ZSh1bnNpZ25lZCBsb25nLCBjb25zdCBzdHJ1Y3Qgc3RtX2ZzICosCi0JCXVuc2lnbmVkIGxvbmcgKik7Ci1zdGF0aWMgaW50IGNsa19mczQzMmM2NV9nZXRfcmF0ZSh1bnNpZ25lZCBsb25nLCBjb25zdCBzdHJ1Y3Qgc3RtX2ZzICosCi0JCXVuc2lnbmVkIGxvbmcgKik7CitzdGF0aWMgaW50IGNsa19mczY2MGMzMl9kaWdfZ2V0X3BhcmFtcyh1bnNpZ25lZCBsb25nIGlucHV0LAorCQl1bnNpZ25lZCBsb25nIG91dHB1dCwgc3RydWN0IHN0bV9mcyAqZnMpOwogc3RhdGljIGludCBjbGtfZnM2NjBjMzJfZGlnX2dldF9yYXRlKHVuc2lnbmVkIGxvbmcsIGNvbnN0IHN0cnVjdCBzdG1fZnMgKiwKIAkJdW5zaWduZWQgbG9uZyAqKTsKLS8qCi0gKiBWYWx1ZXMgZm9yIGFsbCBvZiB0aGUgc3RhbmRhbG9uZSBpbnN0YW5jZXMgb2YgdGhpcyBjbG9jawotICogZ2VuZXJhdG9yIGZvdW5kIGluIFNUaUg0MTUgYW5kIFNUaUg0MTYgU1lTQ0ZHIHJlZ2lzdGVyIGJhbmtzLiBOb3RlCi0gKiB0aGF0IHRoZSBpbmRpdmlkdWFsIGNoYW5uZWwgc3RhbmRieSBjb250cm9sIGJpdHMgKG5zYikgYXJlIGluIHRoZQotICogZmlyc3QgcmVnaXN0ZXIgYWxvbmcgd2l0aCB0aGUgUExMIGNvbnRyb2wgYml0cy4KLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtnZW5fcXVhZGZzX2RhdGEgc3RfZnMyMTZjNjVfNDE2ID0gewotCS8qIDQxNiBzcGVjaWZpYyAqLwotCS5ucGRhCT0gQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxNCksCi0JLm5zYgk9IHsgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDExKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTIpLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxMykgfSwKLQkubnNkaXZfcHJlc2VudCA9IHRydWUsCi0JLm5zZGl2CT0geyBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDE4KSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTkpLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAyMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDIxKSB9LAotCS5tZGl2CT0geyBDTEtHRU5fRklFTEQoMHg0LCAweDFmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDE0LCAweDFmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDI0LCAweDFmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDM0LCAweDFmLCAwKSB9LAotCS5lbgk9IHsgQ0xLR0VOX0ZJRUxEKDB4MTAsIDB4MSwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgyMCwgMHgxLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDMwLCAweDEsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4NDAsIDB4MSwgMCkgfSwKLQkubmRpdgk9IENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTUpLAotCS5id2ZpbHRlcl9wcmVzZW50ID0gdHJ1ZSwKLQkucmVmX2J3ID0gQ0xLR0VOX0ZJRUxEKDB4MCwgMHgzLCAxNiksCi0JLnBlCT0geyBDTEtHRU5fRklFTEQoMHg4LCAweGZmZmYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MTgsIDB4ZmZmZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgyOCwgMHhmZmZmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDM4LCAweGZmZmYsIDApIH0sCi0JLnNkaXYJPSB7IENMS0dFTl9GSUVMRCgweEMsIDB4NywgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgxQywgMHg3LCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDJDLCAweDcsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4M0MsIDB4NywgMCkgfSwKLQkucGxsX29wcwk9ICZzdF9xdWFkZnNfcGxsX2M2NV9vcHMsCi0JLnJ0YmwJCT0gZnMyMTZjNjVfcnRibCwKLQkucnRibF9jbnQJPSBBUlJBWV9TSVpFKGZzMjE2YzY1X3J0YmwpLAotCS5nZXRfcmF0ZQk9IGNsa19mczIxNmM2NV9nZXRfcmF0ZSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrZ2VuX3F1YWRmc19kYXRhIHN0X2ZzNDMyYzY1XzQxNiA9IHsKLQkubnBkYQk9IENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTQpLAotCS5uc2IJPSB7IENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxMSksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDEyKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTMpIH0sCi0JLm5zZGl2X3ByZXNlbnQgPSB0cnVlLAotCS5uc2Rpdgk9IHsgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxOCksCi0JCSAgIENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTkpLAotCQkgICBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDIwKSwKLQkJICAgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAyMSkgfSwKLQkubWRpdgk9IHsgQ0xLR0VOX0ZJRUxEKDB4NCwgMHgxZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgxNCwgMHgxZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgyNCwgMHgxZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgzNCwgMHgxZiwgMCkgfSwKLQkuZW4JPSB7IENMS0dFTl9GSUVMRCgweDEwLCAweDEsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MjAsIDB4MSwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgzMCwgMHgxLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDQwLCAweDEsIDApIH0sCi0JLm5kaXYJPSBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDE1KSwKLQkuYndmaWx0ZXJfcHJlc2VudCA9IHRydWUsCi0JLnJlZl9idyA9IENMS0dFTl9GSUVMRCgweDAsIDB4MywgMTYpLAotCS5wZQk9IHsgQ0xLR0VOX0ZJRUxEKDB4OCwgMHhmZmZmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDE4LCAweGZmZmYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MjgsIDB4ZmZmZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgzOCwgMHhmZmZmLCAwKSB9LAotCS5zZGl2CT0geyBDTEtHRU5fRklFTEQoMHhDLCAweDcsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MUMsIDB4NywgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgyQywgMHg3LCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDNDLCAweDcsIDApIH0sCi0JLnBsbF9vcHMJPSAmc3RfcXVhZGZzX3BsbF9jNjVfb3BzLAotCS5ydGJsCQk9IGZzNDMyYzY1X3J0YmwsCi0JLnJ0YmxfY250CT0gQVJSQVlfU0laRShmczQzMmM2NV9ydGJsKSwKLQkuZ2V0X3JhdGUJPSBjbGtfZnM0MzJjNjVfZ2V0X3JhdGUsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa2dlbl9xdWFkZnNfZGF0YSBzdF9mczY2MGMzMl9FXzQxNiA9IHsKLQkubnBkYQk9IENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTQpLAotCS5uc2IJPSB7IENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxMSksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDEyKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTMpIH0sCi0JLm5zZGl2X3ByZXNlbnQgPSB0cnVlLAotCS5uc2Rpdgk9IHsgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxOCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDE5KSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMjApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAyMSkgfSwKLQkubWRpdgk9IHsgQ0xLR0VOX0ZJRUxEKDB4NCwgMHgxZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgxNCwgMHgxZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgyNCwgMHgxZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgzNCwgMHgxZiwgMCkgfSwKLQkuZW4JPSB7IENMS0dFTl9GSUVMRCgweDEwLCAweDEsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MjAsIDB4MSwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgzMCwgMHgxLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDQwLCAweDEsIDApIH0sCi0JLm5kaXYJPSBDTEtHRU5fRklFTEQoMHgwLCAweDcsIDE1KSwKLQkucGUJPSB7IENMS0dFTl9GSUVMRCgweDgsIDB4N2ZmZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgxOCwgMHg3ZmZmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDI4LCAweDdmZmYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MzgsIDB4N2ZmZiwgMCkgfSwKLQkuc2Rpdgk9IHsgQ0xLR0VOX0ZJRUxEKDB4QywgMHhmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDFDLCAweGYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MkMsIDB4ZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgzQywgMHhmLCAwKSB9LAotCS5sb2Nrc3RhdHVzX3ByZXNlbnQgPSB0cnVlLAotCS5sb2NrX3N0YXR1cyA9IENMS0dFTl9GSUVMRCgweEFDLCAweDEsIDApLAotCS5wbGxfb3BzCT0gJnN0X3F1YWRmc19wbGxfYzMyX29wcywKLQkucnRibAkJPSBmczY2MGMzMl9ydGJsLAotCS5ydGJsX2NudAk9IEFSUkFZX1NJWkUoZnM2NjBjMzJfcnRibCksCi0JLmdldF9yYXRlCT0gY2xrX2ZzNjYwYzMyX2RpZ19nZXRfcmF0ZSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrZ2VuX3F1YWRmc19kYXRhIHN0X2ZzNjYwYzMyX0ZfNDE2ID0gewotCS5ucGRhCT0gQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxNCksCi0JLm5zYgk9IHsgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDExKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTIpLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxMykgfSwKLQkubnNkaXZfcHJlc2VudCA9IHRydWUsCi0JLm5zZGl2CT0geyBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDE4KSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTkpLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAyMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDIxKSB9LAotCS5tZGl2CT0geyBDTEtHRU5fRklFTEQoMHg0LCAweDFmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDE0LCAweDFmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDI0LCAweDFmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDM0LCAweDFmLCAwKSB9LAotCS5lbgk9IHsgQ0xLR0VOX0ZJRUxEKDB4MTAsIDB4MSwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgyMCwgMHgxLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDMwLCAweDEsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4NDAsIDB4MSwgMCkgfSwKLQkubmRpdgk9IENMS0dFTl9GSUVMRCgweDAsIDB4NywgMTUpLAotCS5wZQk9IHsgQ0xLR0VOX0ZJRUxEKDB4OCwgMHg3ZmZmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDE4LCAweDdmZmYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MjgsIDB4N2ZmZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgzOCwgMHg3ZmZmLCAwKSB9LAotCS5zZGl2CT0geyBDTEtHRU5fRklFTEQoMHhDLCAweGYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MUMsIDB4ZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgyQywgMHhmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDNDLCAweGYsIDApIH0sCi0JLmxvY2tzdGF0dXNfcHJlc2VudCA9IHRydWUsCi0JLmxvY2tfc3RhdHVzID0gQ0xLR0VOX0ZJRUxEKDB4RUMsIDB4MSwgMCksCi0JLnBsbF9vcHMJPSAmc3RfcXVhZGZzX3BsbF9jMzJfb3BzLAotCS5ydGJsCQk9IGZzNjYwYzMyX3J0YmwsCi0JLnJ0YmxfY250CT0gQVJSQVlfU0laRShmczY2MGMzMl9ydGJsKSwKLQkuZ2V0X3JhdGUJPSBjbGtfZnM2NjBjMzJfZGlnX2dldF9yYXRlLAotfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtnZW5fcXVhZGZzX2RhdGEgc3RfZnM2NjBjMzJfQyA9IHsKIAkubnJzdF9wcmVzZW50ID0gdHJ1ZSwKQEAgLTM0NSw4ICsxMTYsNyBAQAogCS5wb3dlcnVwX3BvbGFyaXR5ID0gMSwKIAkuc3RhbmRieV9wb2xhcml0eSA9IDEsCiAJLnBsbF9vcHMJPSAmc3RfcXVhZGZzX3BsbF9jMzJfb3BzLAotCS5ydGJsCQk9IGZzNjYwYzMyX3J0YmwsCi0JLnJ0YmxfY250CT0gQVJSQVlfU0laRShmczY2MGMzMl9ydGJsKSwKKwkuZ2V0X3BhcmFtcwk9IGNsa19mczY2MGMzMl9kaWdfZ2V0X3BhcmFtcywKIAkuZ2V0X3JhdGUJPSBjbGtfZnM2NjBjMzJfZGlnX2dldF9yYXRlLAogfTsKIApAQCAtMzg4LDggKzE1OCw3IEBACiAJLnBvd2VydXBfcG9sYXJpdHkgPSAxLAogCS5zdGFuZGJ5X3BvbGFyaXR5ID0gMSwKIAkucGxsX29wcwk9ICZzdF9xdWFkZnNfcGxsX2MzMl9vcHMsCi0JLnJ0YmwJCT0gZnM2NjBjMzJfcnRibCwKLQkucnRibF9jbnQJPSBBUlJBWV9TSVpFKGZzNjYwYzMyX3J0YmwpLAorCS5nZXRfcGFyYW1zCT0gY2xrX2ZzNjYwYzMyX2RpZ19nZXRfcGFyYW1zLAogCS5nZXRfcmF0ZQk9IGNsa19mczY2MGMzMl9kaWdfZ2V0X3JhdGUsfTsKIAogLyoqCkBAIC02MDUsMTIgKzM3NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzdF9xdWFkZnNfcGxsX2M2NV9vcHMgPSB7Ci0JLmVuYWJsZQkJPSBxdWFkZnNfcGxsX2VuYWJsZSwKLQkuZGlzYWJsZQk9IHF1YWRmc19wbGxfZGlzYWJsZSwKLQkuaXNfZW5hYmxlZAk9IHF1YWRmc19wbGxfaXNfZW5hYmxlZCwKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzdF9xdWFkZnNfcGxsX2MzMl9vcHMgPSB7CiAJLmVuYWJsZQkJPSBxdWFkZnNfcGxsX2VuYWJsZSwKIAkuZGlzYWJsZQk9IHF1YWRmc19wbGxfZGlzYWJsZSwKQEAgLTc5Nyw0OCArNTYwLDYgQEAKIAlyZXR1cm4gZnMtPmRhdGEtPnN0YW5kYnlfcG9sYXJpdHkgPyAhbnNiIDogISFuc2I7CiB9CiAKLSNkZWZpbmUgUDE1CQkJKHVpbnQ2NF90KSgxIDw8IDE1KQotCi1zdGF0aWMgaW50IGNsa19mczIxNmM2NV9nZXRfcmF0ZSh1bnNpZ25lZCBsb25nIGlucHV0LCBjb25zdCBzdHJ1Y3Qgc3RtX2ZzICpmcywKLQkJdW5zaWduZWQgbG9uZyAqcmF0ZSkKLXsKLQl1aW50NjRfdCByZXM7Ci0JdW5zaWduZWQgbG9uZyBuczsKLQl1bnNpZ25lZCBsb25nIG5kID0gODsgLyogbmRpdiBzdHVjayBhdCAwID0+IHZhbCA9IDggKi8KLQl1bnNpZ25lZCBsb25nIHM7Ci0JbG9uZyBtOwotCi0JbSA9IGZzLT5tZGl2IC0gMzI7Ci0JcyA9IDEgPDwgKGZzLT5zZGl2ICsgMSk7Ci0JbnMgPSAoZnMtPm5zZGl2ID8gMSA6IDMpOwotCi0JcmVzID0gKHVpbnQ2NF90KShzICogbnMgKiBQMTUgKiAodWludDY0X3QpKG0gKyAzMykpOwotCXJlcyA9IHJlcyAtIChzICogbnMgKiBmcy0+cGUpOwotCSpyYXRlID0gZGl2NjRfdTY0KFAxNSAqIG5kICogaW5wdXQgKiAzMiwgcmVzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNsa19mczQzMmM2NV9nZXRfcmF0ZSh1bnNpZ25lZCBsb25nIGlucHV0LCBjb25zdCBzdHJ1Y3Qgc3RtX2ZzICpmcywKLQkJdW5zaWduZWQgbG9uZyAqcmF0ZSkKLXsKLQl1aW50NjRfdCByZXM7Ci0JdW5zaWduZWQgbG9uZyBuZCA9IDE2OyAvKiBuZGl2IHZhbHVlOyBzdHVjayBhdCAwICgzME1oeiBpbnB1dCkgKi8KLQlsb25nIG07Ci0JdW5zaWduZWQgbG9uZyBzZDsKLQl1bnNpZ25lZCBsb25nIG5zOwotCi0JbSA9IGZzLT5tZGl2IC0gMzI7Ci0Jc2QgPSAxIDw8IChmcy0+c2RpdiArIDEpOwotCW5zID0gKGZzLT5uc2RpdiA/IDEgOiAzKTsKLQotCXJlcyA9ICh1aW50NjRfdCkoc2QgKiBucyAqIFAxNSAqICh1aW50NjRfdCkobSArIDMzKSk7Ci0JcmVzID0gcmVzIC0gKHNkICogbnMgKiBmcy0+cGUpOwotCSpyYXRlID0gZGl2NjRfdTY0KFAxNSAqIG5kICogaW5wdXQgKiAzMiwgcmVzKTsKLQotCXJldHVybiAwOwotfQotCiAjZGVmaW5lIFAyMAkJKHVpbnQ2NF90KSgxIDw8IDIwKQogCiBzdGF0aWMgaW50IGNsa19mczY2MGMzMl9kaWdfZ2V0X3JhdGUodW5zaWduZWQgbG9uZyBpbnB1dCwKQEAgLTg2NCw2ICs1ODUsMTA3IEBACiAJcmV0dXJuIDA7CiB9CiAKKworc3RhdGljIGludCBjbGtfZnM2NjBjMzJfZ2V0X3BlKGludCBtLCBpbnQgc2ksIHVuc2lnbmVkIGxvbmcgKmRldmlhdGlvbiwKKwkJc2lnbmVkIGxvbmcgaW5wdXQsIHVuc2lnbmVkIGxvbmcgb3V0cHV0LCB1aW50NjRfdCAqcCwKKwkJc3RydWN0IHN0bV9mcyAqZnMpCit7CisJdW5zaWduZWQgbG9uZyBuZXdfZnJlcSwgbmV3X2RldmlhdGlvbjsKKwlzdHJ1Y3Qgc3RtX2ZzIGZzX3RtcDsKKwl1aW50NjRfdCB2YWw7CisKKwl2YWwgPSAodWludDY0X3Qpb3V0cHV0IDw8IHNpOworCisJKnAgPSAodWludDY0X3QpaW5wdXQgKiBQMjAgLSAoMzJMTCAgKyAodWludDY0X3QpbSkgKiB2YWwgKiAoUDIwIC8gMzJMTCk7CisKKwkqcCA9IGRpdjY0X3U2NCgqcCwgdmFsKTsKKworCWlmICgqcCA+IDMyNzY3TEwpCisJCXJldHVybiAxOworCisJZnNfdG1wLm1kaXYgPSAodW5zaWduZWQgbG9uZykgbTsKKwlmc190bXAucGUgPSAodW5zaWduZWQgbG9uZykqcDsKKwlmc190bXAuc2RpdiA9IHNpOworCWZzX3RtcC5uc2RpdiA9IDE7CisKKwljbGtfZnM2NjBjMzJfZGlnX2dldF9yYXRlKGlucHV0LCAmZnNfdG1wLCAmbmV3X2ZyZXEpOworCisJbmV3X2RldmlhdGlvbiA9IGFicyhvdXRwdXQgLSBuZXdfZnJlcSk7CisKKwlpZiAobmV3X2RldmlhdGlvbiA8ICpkZXZpYXRpb24pIHsKKwkJZnMtPm1kaXYgPSBtOworCQlmcy0+cGUgPSAodW5zaWduZWQgbG9uZykqcDsKKwkJZnMtPnNkaXYgPSBzaTsKKwkJZnMtPm5zZGl2ID0gMTsKKwkJKmRldmlhdGlvbiA9IG5ld19kZXZpYXRpb247CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNsa19mczY2MGMzMl9kaWdfZ2V0X3BhcmFtcyh1bnNpZ25lZCBsb25nIGlucHV0LAorCQl1bnNpZ25lZCBsb25nIG91dHB1dCwgc3RydWN0IHN0bV9mcyAqZnMpCit7CisJaW50IHNpOwkvKiBzZGl2X3JlZyAoOCBkb3dudG8gMCkgKi8KKwlpbnQgbTsgLyogbWQgdmFsdWUgKi8KKwl1bnNpZ25lZCBsb25nIG5ld19mcmVxLCBuZXdfZGV2aWF0aW9uOworCS8qIGluaXRpYWwgY29uZGl0aW9uIHRvIHNheTogImluZmluaXRlIGRldmlhdGlvbiIgKi8KKwl1bnNpZ25lZCBsb25nIGRldmlhdGlvbiA9IH4wOworCXVpbnQ2NF90IHAsIHAxLCBwMjsJLyogcGUgdmFsdWUgKi8KKwlpbnQgcjEsIHIyOworCisJc3RydWN0IHN0bV9mcyBmc190bXA7CisKKwlmb3IgKHNpID0gMDsgKHNpIDw9IDgpICYmIGRldmlhdGlvbjsgc2krKykgeworCisJCS8qIEJvdW5kYXJ5IHRlc3QgdG8gYXZvaWQgdXNlbGVzcyBpdGVyYXRpb24gKi8KKwkJcjEgPSBjbGtfZnM2NjBjMzJfZ2V0X3BlKDAsIHNpLCAmZGV2aWF0aW9uLAorCQkJCWlucHV0LCBvdXRwdXQsICZwMSwgZnMpOworCQlyMiA9IGNsa19mczY2MGMzMl9nZXRfcGUoMzEsIHNpLCAmZGV2aWF0aW9uLAorCQkJCWlucHV0LCBvdXRwdXQsICZwMiwgZnMpOworCisJCS8qIE5vIHNvbHV0aW9uICovCisJCWlmIChyMSAmJiByMiAmJiAocDEgPiBwMikpCisJCQljb250aW51ZTsKKworCQkvKiBUcnkgdG8gZmluZCBiZXN0IGRldmlhdGlvbiAqLworCQlmb3IgKG0gPSAxOyAobSA8IDMxKSAmJiBkZXZpYXRpb247IG0rKykKKwkJCWNsa19mczY2MGMzMl9nZXRfcGUobSwgc2ksICZkZXZpYXRpb24sCisJCQkJCWlucHV0LCBvdXRwdXQsICZwLCBmcyk7CisKKwl9CisKKwlpZiAoZGV2aWF0aW9uID09IH4wKSAvKiBObyBzb2x1dGlvbiBmb3VuZCAqLworCQlyZXR1cm4gLTE7CisKKwkvKiBwZSBmaW5lIHR1bmluZyBpZiBkZXZpYXRpb24gbm90IDA6ICsvLSAyIGFyb3VuZCBjb21wdXRlZCBwZSB2YWx1ZSAqLworCWlmIChkZXZpYXRpb24pIHsKKwkJZnNfdG1wLm1kaXYgPSBmcy0+bWRpdjsKKwkJZnNfdG1wLnNkaXYgPSBmcy0+c2RpdjsKKwkJZnNfdG1wLm5zZGl2ID0gZnMtPm5zZGl2OworCisJCWlmIChmcy0+cGUgPiAyKQorCQkJcDIgPSBmcy0+cGUgLSAyOworCQllbHNlCisJCQlwMiA9IDA7CisKKwkJZm9yICg7IHAyIDwgMzI3NjhsbCAmJiAocDIgPD0gKGZzLT5wZSArIDIpKTsgcDIrKykgeworCQkJZnNfdG1wLnBlID0gKHVuc2lnbmVkIGxvbmcpcDI7CisKKwkJCWNsa19mczY2MGMzMl9kaWdfZ2V0X3JhdGUoaW5wdXQsICZmc190bXAsICZuZXdfZnJlcSk7CisKKwkJCW5ld19kZXZpYXRpb24gPSBhYnMob3V0cHV0IC0gbmV3X2ZyZXEpOworCisJCQkvKiBDaGVjayBpZiB0aGlzIGlzIGEgYmV0dGVyIHNvbHV0aW9uICovCisJCQlpZiAobmV3X2RldmlhdGlvbiA8IGRldmlhdGlvbikgeworCQkJCWZzLT5wZSA9ICh1bnNpZ25lZCBsb25nKXAyOworCQkJCWRldmlhdGlvbiA9IG5ld19kZXZpYXRpb247CisKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBxdWFkZnNfZnN5bnRfZ2V0X2h3X3ZhbHVlX2Zvcl9yZWNhbGMoc3RydWN0IHN0X2Nsa19xdWFkZnNfZnN5bnRoICpmcywKIAkJc3RydWN0IHN0bV9mcyAqcGFyYW1zKQogewpAQCAtODk5LDM4ICs3MjEsMTQgQEAKIAlzdHJ1Y3Qgc3RfY2xrX3F1YWRmc19mc3ludGggKmZzID0gdG9fcXVhZGZzX2ZzeW50aChodyk7CiAJaW50ICgqY2xrX2ZzX2dldF9yYXRlKSh1bnNpZ25lZCBsb25nICwKIAkJCQljb25zdCBzdHJ1Y3Qgc3RtX2ZzICosIHVuc2lnbmVkIGxvbmcgKik7Ci0Jc3RydWN0IHN0bV9mcyBwcmV2X3BhcmFtczsKLQl1bnNpZ25lZCBsb25nIHByZXZfcmF0ZSwgcmF0ZSA9IDA7Ci0JdW5zaWduZWQgbG9uZyBkaWZmX3JhdGUsIHByZXZfZGlmZl9yYXRlID0gfjA7Ci0JaW50IGluZGV4OworCWludCAoKmNsa19mc19nZXRfcGFyYW1zKSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3Qgc3RtX2ZzICopOworCXVuc2lnbmVkIGxvbmcgcmF0ZSA9IDA7CiAKIAljbGtfZnNfZ2V0X3JhdGUgPSBmcy0+ZGF0YS0+Z2V0X3JhdGU7CisJY2xrX2ZzX2dldF9wYXJhbXMgPSBmcy0+ZGF0YS0+Z2V0X3BhcmFtczsKIAotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGZzLT5kYXRhLT5ydGJsX2NudDsgaW5kZXgrKykgewotCQlwcmV2X3JhdGUgPSByYXRlOwotCi0JCSpwYXJhbXMgPSBmcy0+ZGF0YS0+cnRibFtpbmRleF07Ci0JCXByZXZfcGFyYW1zID0gKnBhcmFtczsKLQotCQljbGtfZnNfZ2V0X3JhdGUocHJhdGUsICZmcy0+ZGF0YS0+cnRibFtpbmRleF0sICZyYXRlKTsKLQotCQlkaWZmX3JhdGUgPSBhYnMoZHJhdGUgLSByYXRlKTsKLQotCQlpZiAoZGlmZl9yYXRlID4gcHJldl9kaWZmX3JhdGUpIHsKLQkJCXJhdGUgPSBwcmV2X3JhdGU7Ci0JCQkqcGFyYW1zID0gcHJldl9wYXJhbXM7Ci0JCQlicmVhazsKLQkJfQotCi0JCXByZXZfZGlmZl9yYXRlID0gZGlmZl9yYXRlOwotCi0JCWlmIChkcmF0ZSA9PSByYXRlKQotCQkJcmV0dXJuIHJhdGU7Ci0JfQotCi0KLQlpZiAoaW5kZXggPT0gZnMtPmRhdGEtPnJ0YmxfY250KQotCQkqcGFyYW1zID0gcHJldl9wYXJhbXM7CisJaWYgKCFjbGtfZnNfZ2V0X3BhcmFtcyhwcmF0ZSwgZHJhdGUsIHBhcmFtcykpCisJCWNsa19mc19nZXRfcmF0ZShwcmF0ZSwgcGFyYW1zLCAmcmF0ZSk7CiAKIAlyZXR1cm4gcmF0ZTsKIH0KQEAgLTEwNjMsMzQgKzg2MSw2IEBACiAJcmV0dXJuIGNsazsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcXVhZGZzX29mX21hdGNoW10gPSB7Ci0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LXF1YWRmczIxNiIsCi0JCS5kYXRhID0gJnN0X2ZzMjE2YzY1XzQxNgotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LXF1YWRmczQzMiIsCi0JCS5kYXRhID0gJnN0X2ZzNDMyYzY1XzQxNgotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LXF1YWRmczY2MC1FIiwKLQkJLmRhdGEgPSAmc3RfZnM2NjBjMzJfRV80MTYKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1xdWFkZnM2NjAtRiIsCi0JCS5kYXRhID0gJnN0X2ZzNjYwYzMyX0ZfNDE2Ci0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LHN0aWg0MDctcXVhZGZzNjYwLUMiLAotCQkuZGF0YSA9ICZzdF9mczY2MGMzMl9DCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LHN0aWg0MDctcXVhZGZzNjYwLUQiLAotCQkuZGF0YSA9ICZzdF9mczY2MGMzMl9ECi0JfSwKLQl7fQotfTsKLQogc3RhdGljIHZvaWQgX19pbml0IHN0X29mX2NyZWF0ZV9xdWFkZnNfZnN5bnRocygKIAkJc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqcGxsX25hbWUsCiAJCXN0cnVjdCBjbGtnZW5fcXVhZGZzX2RhdGEgKnF1YWRmcywgdm9pZCBfX2lvbWVtICpyZWcsCkBAIC0xMTUwLDE4ICs5MjAsMTQgQEAKIAlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LCBjbGtfZGF0YSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzdF9vZl9xdWFkZnNfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3N0YXRpYyB2b2lkIF9faW5pdCBzdF9vZl9xdWFkZnNfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJc3RydWN0IGNsa2dlbl9xdWFkZnNfZGF0YSAqZGF0YSkKIHsKLQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJY29uc3QgY2hhciAqcGxsX25hbWUsICpjbGtfcGFyZW50X25hbWU7CiAJdm9pZCBfX2lvbWVtICpyZWc7CiAJc3BpbmxvY2tfdCAqbG9jazsKIAotCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShxdWFkZnNfb2ZfbWF0Y2gsIG5wKTsKLQlpZiAoV0FSTl9PTighbWF0Y2gpKQotCQlyZXR1cm47Ci0KIAlyZWcgPSBvZl9pb21hcChucCwgMCk7CiAJaWYgKCFyZWcpCiAJCXJldHVybjsKQEAgLTExODAsOCArOTQ2LDggQEAKIAogCXNwaW5fbG9ja19pbml0KGxvY2spOwogCi0JY2xrID0gc3RfY2xrX3JlZ2lzdGVyX3F1YWRmc19wbGwocGxsX25hbWUsIGNsa19wYXJlbnRfbmFtZSwKLQkJCShzdHJ1Y3QgY2xrZ2VuX3F1YWRmc19kYXRhICopIG1hdGNoLT5kYXRhLCByZWcsIGxvY2spOworCWNsayA9IHN0X2Nsa19yZWdpc3Rlcl9xdWFkZnNfcGxsKHBsbF9uYW1lLCBjbGtfcGFyZW50X25hbWUsIGRhdGEsCisJCQlyZWcsIGxvY2spOwogCWlmIChJU19FUlIoY2xrKSkKIAkJZ290byBlcnJfZXhpdDsKIAllbHNlCkBAIC0xMTkwLDExICs5NTYsMjAgQEAKIAkJCV9fY2xrX2dldF9uYW1lKGNsa19nZXRfcGFyZW50KGNsaykpLAogCQkJKHVuc2lnbmVkIGludCljbGtfZ2V0X3JhdGUoY2xrKSk7CiAKLQlzdF9vZl9jcmVhdGVfcXVhZGZzX2ZzeW50aHMobnAsIHBsbF9uYW1lLAotCQkJCSAgICAoc3RydWN0IGNsa2dlbl9xdWFkZnNfZGF0YSAqKW1hdGNoLT5kYXRhLAotCQkJCSAgICByZWcsIGxvY2spOworCXN0X29mX2NyZWF0ZV9xdWFkZnNfZnN5bnRocyhucCwgcGxsX25hbWUsIGRhdGEsIHJlZywgbG9jayk7CiAKIGVycl9leGl0OgogCWtmcmVlKHBsbF9uYW1lKTsgLyogTm8gbG9uZ2VyIG5lZWQgbG9jYWwgY29weSBvZiB0aGUgUExMIG5hbWUgKi8KIH0KLUNMS19PRl9ERUNMQVJFKHF1YWRmcywgInN0LHF1YWRmcyIsIHN0X29mX3F1YWRmc19zZXR1cCk7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzdF9vZl9xdWFkZnM2NjBDX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3Rfb2ZfcXVhZGZzX3NldHVwKG5wLCAoc3RydWN0IGNsa2dlbl9xdWFkZnNfZGF0YSAqKSAmc3RfZnM2NjBjMzJfQyk7Cit9CitDTEtfT0ZfREVDTEFSRShxdWFkZnM2NjBDLCAic3QscXVhZGZzLXBsbCIsIHN0X29mX3F1YWRmczY2MENfc2V0dXApOworCitzdGF0aWMgdm9pZCBfX2luaXQgc3Rfb2ZfcXVhZGZzNjYwRF9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXN0X29mX3F1YWRmc19zZXR1cChucCwgKHN0cnVjdCBjbGtnZW5fcXVhZGZzX2RhdGEgKikgJnN0X2ZzNjYwYzMyX0QpOworfQorQ0xLX09GX0RFQ0xBUkUocXVhZGZzNjYwRCwgInN0LHF1YWRmcyIsIHN0X29mX3F1YWRmczY2MERfc2V0dXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3QvY2xrZ2VuLW11eC5jIGIvZHJpdmVycy9jbGsvc3QvY2xrZ2VuLW11eC5jCmluZGV4IGIxZTEwZmYuLmM1MTRkMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3N0L2Nsa2dlbi1tdXguYworKysgYi9kcml2ZXJzL2Nsay9zdC9jbGtnZW4tbXV4LmMKQEAgLTE5LDkgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KICNpbmNsdWRlICJjbGtnZW4uaCIKIAotc3RhdGljIERFRklORV9TUElOTE9DSyhjbGtnZW5hX2Rpdm11eF9sb2NrKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2xrZ2VuZl9sb2NrKTsKLQogc3RhdGljIGNvbnN0IGNoYXIgKiogX19pbml0IGNsa2dlbl9tdXhfZ2V0X3BhcmVudHMoc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCQkJCSAgICAgICBpbnQgKm51bV9wYXJlbnRzKQogewpAQCAtNDAsNDk4ICszNyw2IEBACiAJcmV0dXJuIHBhcmVudHM7CiB9CiAKLS8qKgotICogRE9DOiBDbG9jayBtdXggd2l0aCBhIHByb2dyYW1tYWJsZSBkaXZpZGVyIG9uIGVhY2ggb2YgaXRzIHRocmVlIGlucHV0cy4KLSAqICAgICAgVGhlIG11eCBoYXMgYW4gaW5wdXQgc2V0dGluZyB3aGljaCBlZmZlY3RpdmVseSBnYXRlcyBpdHMgb3V0cHV0LgotICoKLSAqIFRyYWl0cyBvZiB0aGlzIGNsb2NrOgotICogcHJlcGFyZSAtIGNsa18odW4pcHJlcGFyZSBvbmx5IGVuc3VyZXMgcGFyZW50IGlzICh1bilwcmVwYXJlZAotICogZW5hYmxlIC0gY2xrX2VuYWJsZSBhbmQgY2xrX2Rpc2FibGUgYXJlIGZ1bmN0aW9uYWwgJiBjb250cm9sIGdhdGluZwotICogcmF0ZSAtIHNldCByYXRlIGlzIHN1cHBvcnRlZAotICogcGFyZW50IC0gc2V0L2dldCBwYXJlbnQKLSAqLwotCi0jZGVmaW5lIE5VTV9JTlBVVFMgMwotCi1zdHJ1Y3QgY2xrZ2VuYV9kaXZtdXggewotCXN0cnVjdCBjbGtfaHcgaHc7Ci0JLyogU3ViY2xhc3NlZCBtdXggYW5kIGRpdmlkZXIgc3RydWN0dXJlcyAqLwotCXN0cnVjdCBjbGtfbXV4IG11eDsKLQlzdHJ1Y3QgY2xrX2RpdmlkZXIgZGl2W05VTV9JTlBVVFNdOwotCS8qIEVuYWJsZS9ydW5uaW5nIGZlZWRiYWNrIHJlZ2lzdGVyIGJpdHMgZm9yIGVhY2ggaW5wdXQgKi8KLQl2b2lkIF9faW9tZW0gKmZlZWRiYWNrX3JlZ1tOVU1fSU5QVVRTXTsKLQlpbnQgZmVlZGJhY2tfYml0X2lkeDsKLQotCXU4ICAgICAgICAgICAgICBtdXhzZWw7Ci19OwotCi0jZGVmaW5lIHRvX2Nsa2dlbmFfZGl2bXV4KF9odykgY29udGFpbmVyX29mKF9odywgc3RydWN0IGNsa2dlbmFfZGl2bXV4LCBodykKLQotc3RydWN0IGNsa2dlbmFfZGl2bXV4X2RhdGEgewotCWludCBudW1fb3V0cHV0czsKLQlpbnQgbXV4X29mZnNldDsKLQlpbnQgbXV4X29mZnNldDI7Ci0JaW50IG11eF9zdGFydF9iaXQ7Ci0JaW50IGRpdl9vZmZzZXRzW05VTV9JTlBVVFNdOwotCWludCBmYl9vZmZzZXRzW05VTV9JTlBVVFNdOwotCWludCBmYl9zdGFydF9iaXRfaWR4OwotfTsKLQotI2RlZmluZSBDS0dBWF9DTEtPUFNSQ19TV0lUQ0hfT0ZGIDB4MwotCi1zdGF0aWMgaW50IGNsa2dlbmFfZGl2bXV4X2lzX3J1bm5pbmcoc3RydWN0IGNsa2dlbmFfZGl2bXV4ICptdXgpCi17Ci0JdTMyIHJlZ3ZhbCA9IHJlYWRsKG11eC0+ZmVlZGJhY2tfcmVnW211eC0+bXV4c2VsXSk7Ci0JdTMyIHJ1bm5pbmcgPSByZWd2YWwgJiBCSVQobXV4LT5mZWVkYmFja19iaXRfaWR4KTsKLQlyZXR1cm4gISFydW5uaW5nOwotfQotCi1zdGF0aWMgaW50IGNsa2dlbmFfZGl2bXV4X2VuYWJsZShzdHJ1Y3QgY2xrX2h3ICpodykKLXsKLQlzdHJ1Y3QgY2xrZ2VuYV9kaXZtdXggKmdlbmFtdXggPSB0b19jbGtnZW5hX2Rpdm11eChodyk7Ci0Jc3RydWN0IGNsa19odyAqbXV4X2h3ID0gJmdlbmFtdXgtPm11eC5odzsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0JaW50IHJldCA9IDA7Ci0KLQlfX2Nsa19od19zZXRfY2xrKG11eF9odywgaHcpOwotCi0JcmV0ID0gY2xrX211eF9vcHMuc2V0X3BhcmVudChtdXhfaHcsIGdlbmFtdXgtPm11eHNlbCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMCk7Ci0KLQl3aGlsZSAoIWNsa2dlbmFfZGl2bXV4X2lzX3J1bm5pbmcoZ2VuYW11eCkpIHsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQkJY3B1X3JlbGF4KCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsa2dlbmFfZGl2bXV4X2Rpc2FibGUoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IGNsa2dlbmFfZGl2bXV4ICpnZW5hbXV4ID0gdG9fY2xrZ2VuYV9kaXZtdXgoaHcpOwotCXN0cnVjdCBjbGtfaHcgKm11eF9odyA9ICZnZW5hbXV4LT5tdXguaHc7Ci0KLQlfX2Nsa19od19zZXRfY2xrKG11eF9odywgaHcpOwotCi0JY2xrX211eF9vcHMuc2V0X3BhcmVudChtdXhfaHcsIENLR0FYX0NMS09QU1JDX1NXSVRDSF9PRkYpOwotfQotCi1zdGF0aWMgaW50IGNsa2dlbmFfZGl2bXV4X2lzX2VuYWJsZWQoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IGNsa2dlbmFfZGl2bXV4ICpnZW5hbXV4ID0gdG9fY2xrZ2VuYV9kaXZtdXgoaHcpOwotCXN0cnVjdCBjbGtfaHcgKm11eF9odyA9ICZnZW5hbXV4LT5tdXguaHc7Ci0KLQlfX2Nsa19od19zZXRfY2xrKG11eF9odywgaHcpOwotCi0JcmV0dXJuIChzOCljbGtfbXV4X29wcy5nZXRfcGFyZW50KG11eF9odykgPiAwOwotfQotCi1zdGF0aWMgdTggY2xrZ2VuYV9kaXZtdXhfZ2V0X3BhcmVudChzdHJ1Y3QgY2xrX2h3ICpodykKLXsKLQlzdHJ1Y3QgY2xrZ2VuYV9kaXZtdXggKmdlbmFtdXggPSB0b19jbGtnZW5hX2Rpdm11eChodyk7Ci0Jc3RydWN0IGNsa19odyAqbXV4X2h3ID0gJmdlbmFtdXgtPm11eC5odzsKLQotCV9fY2xrX2h3X3NldF9jbGsobXV4X2h3LCBodyk7Ci0KLQlnZW5hbXV4LT5tdXhzZWwgPSBjbGtfbXV4X29wcy5nZXRfcGFyZW50KG11eF9odyk7Ci0JaWYgKChzOClnZW5hbXV4LT5tdXhzZWwgPCAwKSB7Ci0JCXByX2RlYnVnKCIlczogJXM6IEludmFsaWQgcGFyZW50LCBzZXR0aW5nIHRvIGRlZmF1bHQuXG4iLAotCQkgICAgICBfX2Z1bmNfXywgY2xrX2h3X2dldF9uYW1lKGh3KSk7Ci0JCWdlbmFtdXgtPm11eHNlbCA9IDA7Ci0JfQotCi0JcmV0dXJuIGdlbmFtdXgtPm11eHNlbDsKLX0KLQotc3RhdGljIGludCBjbGtnZW5hX2Rpdm11eF9zZXRfcGFyZW50KHN0cnVjdCBjbGtfaHcgKmh3LCB1OCBpbmRleCkKLXsKLQlzdHJ1Y3QgY2xrZ2VuYV9kaXZtdXggKmdlbmFtdXggPSB0b19jbGtnZW5hX2Rpdm11eChodyk7Ci0KLQlpZiAoaW5kZXggPj0gQ0tHQVhfQ0xLT1BTUkNfU1dJVENIX09GRikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlnZW5hbXV4LT5tdXhzZWwgPSBpbmRleDsKLQotCS8qCi0JICogSWYgdGhlIG11eCBpcyBhbHJlYWR5IGVuYWJsZWQsIGNhbGwgZW5hYmxlIGRpcmVjdGx5IHRvIHNldCB0aGUKLQkgKiBuZXcgbXV4IHBvc2l0aW9uIGFuZCB3YWl0IGZvciBpdCB0byBzdGFydCBydW5uaW5nIGFnYWluLiBPdGhlcndpc2UKLQkgKiBkbyBub3RoaW5nLgotCSAqLwotCWlmIChjbGtnZW5hX2Rpdm11eF9pc19lbmFibGVkKGh3KSkKLQkJY2xrZ2VuYV9kaXZtdXhfZW5hYmxlKGh3KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjbGtnZW5hX2Rpdm11eF9yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKLQkJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKLXsKLQlzdHJ1Y3QgY2xrZ2VuYV9kaXZtdXggKmdlbmFtdXggPSB0b19jbGtnZW5hX2Rpdm11eChodyk7Ci0Jc3RydWN0IGNsa19odyAqZGl2X2h3ID0gJmdlbmFtdXgtPmRpdltnZW5hbXV4LT5tdXhzZWxdLmh3OwotCi0JX19jbGtfaHdfc2V0X2NsayhkaXZfaHcsIGh3KTsKLQotCXJldHVybiBjbGtfZGl2aWRlcl9vcHMucmVjYWxjX3JhdGUoZGl2X2h3LCBwYXJlbnRfcmF0ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgY2xrZ2VuYV9kaXZtdXhfc2V0X3JhdGUoc3RydWN0IGNsa19odyAqaHcsIHVuc2lnbmVkIGxvbmcgcmF0ZSwKLQkJCQl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKQotewotCXN0cnVjdCBjbGtnZW5hX2Rpdm11eCAqZ2VuYW11eCA9IHRvX2Nsa2dlbmFfZGl2bXV4KGh3KTsKLQlzdHJ1Y3QgY2xrX2h3ICpkaXZfaHcgPSAmZ2VuYW11eC0+ZGl2W2dlbmFtdXgtPm11eHNlbF0uaHc7Ci0KLQlfX2Nsa19od19zZXRfY2xrKGRpdl9odywgaHcpOwotCi0JcmV0dXJuIGNsa19kaXZpZGVyX29wcy5zZXRfcmF0ZShkaXZfaHcsIHJhdGUsIHBhcmVudF9yYXRlKTsKLX0KLQotc3RhdGljIGxvbmcgY2xrZ2VuYV9kaXZtdXhfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywgdW5zaWduZWQgbG9uZyByYXRlLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgKnByYXRlKQotewotCXN0cnVjdCBjbGtnZW5hX2Rpdm11eCAqZ2VuYW11eCA9IHRvX2Nsa2dlbmFfZGl2bXV4KGh3KTsKLQlzdHJ1Y3QgY2xrX2h3ICpkaXZfaHcgPSAmZ2VuYW11eC0+ZGl2W2dlbmFtdXgtPm11eHNlbF0uaHc7Ci0KLQlfX2Nsa19od19zZXRfY2xrKGRpdl9odywgaHcpOwotCi0JcmV0dXJuIGNsa19kaXZpZGVyX29wcy5yb3VuZF9yYXRlKGRpdl9odywgcmF0ZSwgcHJhdGUpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgY2xrZ2VuYV9kaXZtdXhfb3BzID0gewotCS5lbmFibGUgPSBjbGtnZW5hX2Rpdm11eF9lbmFibGUsCi0JLmRpc2FibGUgPSBjbGtnZW5hX2Rpdm11eF9kaXNhYmxlLAotCS5pc19lbmFibGVkID0gY2xrZ2VuYV9kaXZtdXhfaXNfZW5hYmxlZCwKLQkuZ2V0X3BhcmVudCA9IGNsa2dlbmFfZGl2bXV4X2dldF9wYXJlbnQsCi0JLnNldF9wYXJlbnQgPSBjbGtnZW5hX2Rpdm11eF9zZXRfcGFyZW50LAotCS5yb3VuZF9yYXRlID0gY2xrZ2VuYV9kaXZtdXhfcm91bmRfcmF0ZSwKLQkucmVjYWxjX3JhdGUgPSBjbGtnZW5hX2Rpdm11eF9yZWNhbGNfcmF0ZSwKLQkuc2V0X3JhdGUgPSBjbGtnZW5hX2Rpdm11eF9zZXRfcmF0ZSwKLX07Ci0KLS8qKgotICogY2xrX3JlZ2lzdGVyX2dlbmFtdXggLSByZWdpc3RlciBhIGdlbmFtdXggY2xvY2sgd2l0aCB0aGUgY2xvY2sgZnJhbWV3b3JrCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0IGNsa19yZWdpc3Rlcl9nZW5hbXV4KGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywgdTggbnVtX3BhcmVudHMsCi0JCQkJdm9pZCBfX2lvbWVtICpyZWcsCi0JCQkJY29uc3Qgc3RydWN0IGNsa2dlbmFfZGl2bXV4X2RhdGEgKm11eGRhdGEsCi0JCQkJdTMyIGlkeCkKLXsKLQkvKgotCSAqIEZpeGVkIGNvbnN0YW50cyBhY3Jvc3MgYWxsIENsb2NrZ2VuQSB2YXJpYW50cwotCSAqLwotCWNvbnN0IGludCBtdXhfd2lkdGggPSAyOwotCWNvbnN0IGludCBkaXZpZGVyX3dpZHRoID0gNTsKLQlzdHJ1Y3QgY2xrZ2VuYV9kaXZtdXggKmdlbmFtdXg7Ci0Jc3RydWN0IGNsayAqY2xrOwotCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7Ci0JaW50IGk7Ci0KLQlnZW5hbXV4ID0ga3phbGxvYyhzaXplb2YoKmdlbmFtdXgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWdlbmFtdXgpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0JaW5pdC5uYW1lID0gbmFtZTsKLQlpbml0Lm9wcyA9ICZjbGtnZW5hX2Rpdm11eF9vcHM7Ci0JaW5pdC5mbGFncyA9IENMS19JU19CQVNJQyB8IENMS19HRVRfUkFURV9OT0NBQ0hFOwotCWluaXQucGFyZW50X25hbWVzID0gcGFyZW50X25hbWVzOwotCWluaXQubnVtX3BhcmVudHMgPSBudW1fcGFyZW50czsKLQotCWdlbmFtdXgtPm11eC5sb2NrICA9ICZjbGtnZW5hX2Rpdm11eF9sb2NrOwotCWdlbmFtdXgtPm11eC5tYXNrID0gQklUKG11eF93aWR0aCkgLSAxOwotCWdlbmFtdXgtPm11eC5zaGlmdCA9IG11eGRhdGEtPm11eF9zdGFydF9iaXQgKyAoaWR4ICogbXV4X3dpZHRoKTsKLQlpZiAoZ2VuYW11eC0+bXV4LnNoaWZ0ID4gMzEpIHsKLQkJLyoKLQkJICogV2UgaGF2ZSBzcGlsbGVkIGludG8gdGhlIHNlY29uZCBtdXggcmVnaXN0ZXIgc28KLQkJICogYWRqdXN0IHRoZSByZWdpc3RlciBhZGRyZXNzIGFuZCB0aGUgYml0IHNoaWZ0IGFjY29yZGluZ2x5Ci0JCSAqLwotCQlnZW5hbXV4LT5tdXgucmVnID0gcmVnICsgbXV4ZGF0YS0+bXV4X29mZnNldDI7Ci0JCWdlbmFtdXgtPm11eC5zaGlmdCAtPSAzMjsKLQl9IGVsc2UgewotCQlnZW5hbXV4LT5tdXgucmVnICAgPSByZWcgKyBtdXhkYXRhLT5tdXhfb2Zmc2V0OwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fSU5QVVRTOyBpKyspIHsKLQkJLyoKLQkJICogRGl2aWRlciBjb25maWcgZm9yIGVhY2ggaW5wdXQKLQkJICovCi0JCXZvaWQgX19pb21lbSAqZGl2YmFzZSA9IHJlZyArIG11eGRhdGEtPmRpdl9vZmZzZXRzW2ldOwotCQlnZW5hbXV4LT5kaXZbaV0ud2lkdGggPSBkaXZpZGVyX3dpZHRoOwotCQlnZW5hbXV4LT5kaXZbaV0ucmVnID0gZGl2YmFzZSArIChpZHggKiBzaXplb2YodTMyKSk7Ci0KLQkJLyoKLQkJICogTXV4IGVuYWJsZWQvcnVubmluZyBmZWVkYmFjayByZWdpc3RlciBmb3IgZWFjaCBpbnB1dC4KLQkJICovCi0JCWdlbmFtdXgtPmZlZWRiYWNrX3JlZ1tpXSA9IHJlZyArIG11eGRhdGEtPmZiX29mZnNldHNbaV07Ci0JfQotCi0JZ2VuYW11eC0+ZmVlZGJhY2tfYml0X2lkeCA9IG11eGRhdGEtPmZiX3N0YXJ0X2JpdF9pZHggKyBpZHg7Ci0JZ2VuYW11eC0+aHcuaW5pdCA9ICZpbml0OwotCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZnZW5hbXV4LT5odyk7Ci0JaWYgKElTX0VSUihjbGspKSB7Ci0JCWtmcmVlKGdlbmFtdXgpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHBhcmVudCAlcyByYXRlICVsdVxuIiwKLQkJCV9fY2xrX2dldF9uYW1lKGNsayksCi0JCQlfX2Nsa19nZXRfbmFtZShjbGtfZ2V0X3BhcmVudChjbGspKSwKLQkJCWNsa19nZXRfcmF0ZShjbGspKTsKLWVycjoKLQlyZXR1cm4gY2xrOwotfQotCi1zdGF0aWMgc3RydWN0IGNsa2dlbmFfZGl2bXV4X2RhdGEgc3RfZGl2bXV4X2M2NWhzID0gewotCS5udW1fb3V0cHV0cyA9IDQsCi0JLm11eF9vZmZzZXQgPSAweDE0LAotCS5tdXhfc3RhcnRfYml0ID0gMCwKLQkuZGl2X29mZnNldHMgPSB7IDB4ODAwLCAweDkwMCwgMHhiMDAgfSwKLQkuZmJfb2Zmc2V0cyA9IHsgMHgxOCwgMHgxYywgMHgyMCB9LAotCS5mYl9zdGFydF9iaXRfaWR4ID0gMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrZ2VuYV9kaXZtdXhfZGF0YSBzdF9kaXZtdXhfYzY1bHMgPSB7Ci0JLm51bV9vdXRwdXRzID0gMTQsCi0JLm11eF9vZmZzZXQgPSAweDE0LAotCS5tdXhfb2Zmc2V0MiA9IDB4MjQsCi0JLm11eF9zdGFydF9iaXQgPSA4LAotCS5kaXZfb2Zmc2V0cyA9IHsgMHg4MTAsIDB4YTEwLCAweGIxMCB9LAotCS5mYl9vZmZzZXRzID0geyAweDE4LCAweDFjLCAweDIwIH0sCi0JLmZiX3N0YXJ0X2JpdF9pZHggPSA0LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtnZW5hX2Rpdm11eF9kYXRhIHN0X2Rpdm11eF9jMzJvZGYwID0gewotCS5udW1fb3V0cHV0cyA9IDgsCi0JLm11eF9vZmZzZXQgPSAweDFjLAotCS5tdXhfc3RhcnRfYml0ID0gMCwKLQkuZGl2X29mZnNldHMgPSB7IDB4ODAwLCAweDkwMCwgMHhhNjAgfSwKLQkuZmJfb2Zmc2V0cyA9IHsgMHgyYywgMHgyNCwgMHgyOCB9LAotCS5mYl9zdGFydF9iaXRfaWR4ID0gMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrZ2VuYV9kaXZtdXhfZGF0YSBzdF9kaXZtdXhfYzMyb2RmMSA9IHsKLQkubnVtX291dHB1dHMgPSA4LAotCS5tdXhfb2Zmc2V0ID0gMHgxYywKLQkubXV4X3N0YXJ0X2JpdCA9IDE2LAotCS5kaXZfb2Zmc2V0cyA9IHsgMHg4MjAsIDB4OTgwLCAweGE4MCB9LAotCS5mYl9vZmZzZXRzID0geyAweDJjLCAweDI0LCAweDI4IH0sCi0JLmZiX3N0YXJ0X2JpdF9pZHggPSA4LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtnZW5hX2Rpdm11eF9kYXRhIHN0X2Rpdm11eF9jMzJvZGYyID0gewotCS5udW1fb3V0cHV0cyA9IDgsCi0JLm11eF9vZmZzZXQgPSAweDIwLAotCS5tdXhfc3RhcnRfYml0ID0gMCwKLQkuZGl2X29mZnNldHMgPSB7IDB4ODQwLCAweGEyMCwgMHhiMTAgfSwKLQkuZmJfb2Zmc2V0cyA9IHsgMHgyYywgMHgyNCwgMHgyOCB9LAotCS5mYl9zdGFydF9iaXRfaWR4ID0gMTYsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa2dlbmFfZGl2bXV4X2RhdGEgc3RfZGl2bXV4X2MzMm9kZjMgPSB7Ci0JLm51bV9vdXRwdXRzID0gOCwKLQkubXV4X29mZnNldCA9IDB4MjAsCi0JLm11eF9zdGFydF9iaXQgPSAxNiwKLQkuZGl2X29mZnNldHMgPSB7IDB4ODYwLCAweGE0MCwgMHhiMzAgfSwKLQkuZmJfb2Zmc2V0cyA9IHsgMHgyYywgMHgyNCwgMHgyOCB9LAotCS5mYl9zdGFydF9iaXRfaWR4ID0gMjQsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjbGtnZW5hX2Rpdm11eF9vZl9tYXRjaFtdID0gewotCXsKLQkJLmNvbXBhdGlibGUgPSAic3QsY2xrZ2VuYS1kaXZtdXgtYzY1LWhzIiwKLQkJLmRhdGEgPSAmc3RfZGl2bXV4X2M2NWhzLAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxjbGtnZW5hLWRpdm11eC1jNjUtbHMiLAotCQkuZGF0YSA9ICZzdF9kaXZtdXhfYzY1bHMsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LGNsa2dlbmEtZGl2bXV4LWMzMi1vZGYwIiwKLQkJLmRhdGEgPSAmc3RfZGl2bXV4X2MzMm9kZjAsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LGNsa2dlbmEtZGl2bXV4LWMzMi1vZGYxIiwKLQkJLmRhdGEgPSAmc3RfZGl2bXV4X2MzMm9kZjEsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LGNsa2dlbmEtZGl2bXV4LWMzMi1vZGYyIiwKLQkJLmRhdGEgPSAmc3RfZGl2bXV4X2MzMm9kZjIsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LGNsa2dlbmEtZGl2bXV4LWMzMi1vZGYzIiwKLQkJLmRhdGEgPSAmc3RfZGl2bXV4X2MzMm9kZjMsCi0JfSwKLQl7fQotfTsKLQotc3RhdGljIHZvaWQgX19pb21lbSAqIF9faW5pdCBjbGtnZW5fZ2V0X3JlZ2lzdGVyX2Jhc2Uoc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBub2RlOwotCXZvaWQgX19pb21lbSAqcmVnOwotCi0JcG5vZGUgPSBvZl9nZXRfcGFyZW50KG5wKTsKLQlpZiAoIXBub2RlKQotCQlyZXR1cm4gTlVMTDsKLQotCXJlZyA9IG9mX2lvbWFwKHBub2RlLCAwKTsKLQotCW9mX25vZGVfcHV0KHBub2RlKTsKLQlyZXR1cm4gcmVnOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgc3Rfb2ZfY2xrZ2VuYV9kaXZtdXhfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKLQljb25zdCBzdHJ1Y3QgY2xrZ2VuYV9kaXZtdXhfZGF0YSAqZGF0YTsKLQlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSAqY2xrX2RhdGE7Ci0Jdm9pZCBfX2lvbWVtICpyZWc7Ci0JY29uc3QgY2hhciAqKnBhcmVudHM7Ci0JaW50IG51bV9wYXJlbnRzID0gMCwgaTsKLQotCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShjbGtnZW5hX2Rpdm11eF9vZl9tYXRjaCwgbnApOwotCWlmIChXQVJOX09OKCFtYXRjaCkpCi0JCXJldHVybjsKLQotCWRhdGEgPSBtYXRjaC0+ZGF0YTsKLQotCXJlZyA9IGNsa2dlbl9nZXRfcmVnaXN0ZXJfYmFzZShucCk7Ci0JaWYgKCFyZWcpCi0JCXJldHVybjsKLQotCXBhcmVudHMgPSBjbGtnZW5fbXV4X2dldF9wYXJlbnRzKG5wLCAmbnVtX3BhcmVudHMpOwotCWlmIChJU19FUlIocGFyZW50cykpCi0JCWdvdG8gZXJyX3BhcmVudHM7Ci0KLQljbGtfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpjbGtfZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghY2xrX2RhdGEpCi0JCWdvdG8gZXJyX2FsbG9jOwotCi0JY2xrX2RhdGEtPmNsa19udW0gPSBkYXRhLT5udW1fb3V0cHV0czsKLQljbGtfZGF0YS0+Y2xrcyA9IGtjYWxsb2MoY2xrX2RhdGEtPmNsa19udW0sIHNpemVvZihzdHJ1Y3QgY2xrICopLAotCQkJCSBHRlBfS0VSTkVMKTsKLQotCWlmICghY2xrX2RhdGEtPmNsa3MpCi0JCWdvdG8gZXJyX2FsbG9jX2Nsa3M7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY2xrX2RhdGEtPmNsa19udW07IGkrKykgewotCQlzdHJ1Y3QgY2xrICpjbGs7Ci0JCWNvbnN0IGNoYXIgKmNsa19uYW1lOwotCi0JCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChucCwgImNsb2NrLW91dHB1dC1uYW1lcyIsCi0JCQkJCQkgIGksICZjbGtfbmFtZSkpCi0JCQlicmVhazsKLQotCQkvKgotCQkgKiBJZiB3ZSByZWFkIGFuIGVtcHR5IGNsb2NrIG5hbWUgdGhlbiB0aGUgb3V0cHV0IGlzIHVudXNlZAotCQkgKi8KLQkJaWYgKCpjbGtfbmFtZSA9PSAnXDAnKQotCQkJY29udGludWU7Ci0KLQkJY2xrID0gY2xrX3JlZ2lzdGVyX2dlbmFtdXgoY2xrX25hbWUsIHBhcmVudHMsIG51bV9wYXJlbnRzLAotCQkJCQkgICByZWcsIGRhdGEsIGkpOwotCi0JCWlmIChJU19FUlIoY2xrKSkKLQkJCWdvdG8gZXJyOwotCi0JCWNsa19kYXRhLT5jbGtzW2ldID0gY2xrOwotCX0KLQotCWtmcmVlKHBhcmVudHMpOwotCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgY2xrX2RhdGEpOwotCXJldHVybjsKLWVycjoKLQlrZnJlZShjbGtfZGF0YS0+Y2xrcyk7Ci1lcnJfYWxsb2NfY2xrczoKLQlrZnJlZShjbGtfZGF0YSk7Ci1lcnJfYWxsb2M6Ci0Ja2ZyZWUocGFyZW50cyk7Ci1lcnJfcGFyZW50czoKLQlpb3VubWFwKHJlZyk7Ci19Ci1DTEtfT0ZfREVDTEFSRShjbGtnZW5hZGl2bXV4LCAic3QsY2xrZ2VuYS1kaXZtdXgiLCBzdF9vZl9jbGtnZW5hX2Rpdm11eF9zZXR1cCk7Ci0KLXN0cnVjdCBjbGtnZW5hX3ByZWRpdl9kYXRhIHsKLQl1MzIgb2Zmc2V0OwotCXU4IHNoaWZ0OwotCXN0cnVjdCBjbGtfZGl2X3RhYmxlICp0YWJsZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX2Rpdl90YWJsZSBwcmVkaXZfdGFibGUxNltdID0gewotCXsgLnZhbCA9IDAsIC5kaXYgPSAxIH0sCi0JeyAudmFsID0gMSwgLmRpdiA9IDE2IH0sCi0JeyAuZGl2ID0gMCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtnZW5hX3ByZWRpdl9kYXRhIHByZWRpdl9jNjVfZGF0YSA9IHsKLQkub2Zmc2V0ID0gMHg0YywKLQkuc2hpZnQgPSAzMSwKLQkudGFibGUgPSBwcmVkaXZfdGFibGUxNiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrZ2VuYV9wcmVkaXZfZGF0YSBwcmVkaXZfYzMyX2RhdGEgPSB7Ci0JLm9mZnNldCA9IDB4NTAsCi0JLnNoaWZ0ID0gMSwKLQkudGFibGUgPSBwcmVkaXZfdGFibGUxNiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNsa2dlbmFfcHJlZGl2X29mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJzdCxjbGtnZW5hLXByZWRpdi1jNjUiLCAuZGF0YSA9ICZwcmVkaXZfYzY1X2RhdGEgfSwKLQl7IC5jb21wYXRpYmxlID0gInN0LGNsa2dlbmEtcHJlZGl2LWMzMiIsIC5kYXRhID0gJnByZWRpdl9jMzJfZGF0YSB9LAotCXt9Ci19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgc3Rfb2ZfY2xrZ2VuYV9wcmVkaXZfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKLQl2b2lkIF9faW9tZW0gKnJlZzsKLQljb25zdCBjaGFyICpwYXJlbnRfbmFtZSwgKmNsa19uYW1lOwotCXN0cnVjdCBjbGsgKmNsazsKLQljb25zdCBzdHJ1Y3QgY2xrZ2VuYV9wcmVkaXZfZGF0YSAqZGF0YTsKLQotCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShjbGtnZW5hX3ByZWRpdl9vZl9tYXRjaCwgbnApOwotCWlmICghbWF0Y2gpIHsKLQkJcHJfZXJyKCIlczogTm8gbWF0Y2hpbmcgZGF0YVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JZGF0YSA9IG1hdGNoLT5kYXRhOwotCi0JcmVnID0gY2xrZ2VuX2dldF9yZWdpc3Rlcl9iYXNlKG5wKTsKLQlpZiAoIXJlZykKLQkJcmV0dXJuOwotCi0JcGFyZW50X25hbWUgPSBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKG5wLCAwKTsKLQlpZiAoIXBhcmVudF9uYW1lKQotCQlnb3RvIGVycjsKLQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChucCwgImNsb2NrLW91dHB1dC1uYW1lcyIsCi0JCQkJCSAgMCwgJmNsa19uYW1lKSkKLQkJZ290byBlcnI7Ci0KLQljbGsgPSBjbGtfcmVnaXN0ZXJfZGl2aWRlcl90YWJsZShOVUxMLCBjbGtfbmFtZSwgcGFyZW50X25hbWUsCi0JCQkJCSBDTEtfR0VUX1JBVEVfTk9DQUNIRSwKLQkJCQkJIHJlZyArIGRhdGEtPm9mZnNldCwgZGF0YS0+c2hpZnQsIDEsCi0JCQkJCSAwLCBkYXRhLT50YWJsZSwgTlVMTCk7Ci0JaWYgKElTX0VSUihjbGspKQotCQlnb3RvIGVycjsKLQotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKLQlwcl9kZWJ1ZygiJXM6IHBhcmVudCAlcyByYXRlICV1XG4iLAotCQlfX2Nsa19nZXRfbmFtZShjbGspLAotCQlfX2Nsa19nZXRfbmFtZShjbGtfZ2V0X3BhcmVudChjbGspKSwKLQkJKHVuc2lnbmVkIGludCljbGtfZ2V0X3JhdGUoY2xrKSk7Ci0KLQlyZXR1cm47Ci1lcnI6Ci0JaW91bm1hcChyZWcpOwotfQotQ0xLX09GX0RFQ0xBUkUoY2xrZ2VuYXByZWRpdiwgInN0LGNsa2dlbmEtcHJlZGl2Iiwgc3Rfb2ZfY2xrZ2VuYV9wcmVkaXZfc2V0dXApOwotCiBzdHJ1Y3QgY2xrZ2VuX211eF9kYXRhIHsKIAl1MzIgb2Zmc2V0OwogCXU4IHNoaWZ0OwpAQCAtNTQxLDQ5ICs0Niw2IEBACiAJdTggbXV4X2ZsYWdzOwogfTsKIAotc3RhdGljIHN0cnVjdCBjbGtnZW5fbXV4X2RhdGEgY2xrZ2VuX211eF9jX3ZjY19oZF80MTYgPSB7Ci0JLm9mZnNldCA9IDAsCi0JLnNoaWZ0ID0gMCwKLQkud2lkdGggPSAxLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtnZW5fbXV4X2RhdGEgY2xrZ2VuX211eF9mX3ZjY19mdmRwXzQxNiA9IHsKLQkub2Zmc2V0ID0gMCwKLQkuc2hpZnQgPSAwLAotCS53aWR0aCA9IDEsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa2dlbl9tdXhfZGF0YSBjbGtnZW5fbXV4X2ZfdmNjX2h2YV80MTYgPSB7Ci0JLm9mZnNldCA9IDAsCi0JLnNoaWZ0ID0gMCwKLQkud2lkdGggPSAxLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtnZW5fbXV4X2RhdGEgY2xrZ2VuX211eF9mX3ZjY19oZF80MTYgPSB7Ci0JLm9mZnNldCA9IDAsCi0JLnNoaWZ0ID0gMTYsCi0JLndpZHRoID0gMSwKLQkubG9jayA9ICZjbGtnZW5mX2xvY2ssCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa2dlbl9tdXhfZGF0YSBjbGtnZW5fbXV4X2NfdmNjX3NkXzQxNiA9IHsKLQkub2Zmc2V0ID0gMCwKLQkuc2hpZnQgPSAxNywKLQkud2lkdGggPSAxLAotCS5sb2NrID0gJmNsa2dlbmZfbG9jaywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrZ2VuX211eF9kYXRhIHN0aWg0MTVfYTlfbXV4X2RhdGEgPSB7Ci0JLm9mZnNldCA9IDAsCi0JLnNoaWZ0ID0gMSwKLQkud2lkdGggPSAyLAotCS5sb2NrID0gJmNsa2dlbl9hOV9sb2NrLAotfTsKLXN0YXRpYyBzdHJ1Y3QgY2xrZ2VuX211eF9kYXRhIHN0aWg0MTZfYTlfbXV4X2RhdGEgPSB7Ci0JLm9mZnNldCA9IDAsCi0JLnNoaWZ0ID0gMCwKLQkud2lkdGggPSAyLAotfTsKIHN0YXRpYyBzdHJ1Y3QgY2xrZ2VuX211eF9kYXRhIHN0aWg0MDdfYTlfbXV4X2RhdGEgPSB7CiAJLm9mZnNldCA9IDB4MWE0LAogCS5zaGlmdCA9IDAsCkBAIC01OTEsNTggKzUzLDEzIEBACiAJLmxvY2sgPSAmY2xrZ2VuX2E5X2xvY2ssCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtdXhfb2ZfbWF0Y2hbXSA9IHsKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LHN0aWg0MTYtY2xrZ2VuYy12Y2MtaGQiLAotCQkuZGF0YSA9ICZjbGtnZW5fbXV4X2NfdmNjX2hkXzQxNiwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1jbGtnZW5mLXZjYy1mdmRwIiwKLQkJLmRhdGEgPSAmY2xrZ2VuX211eF9mX3ZjY19mdmRwXzQxNiwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1jbGtnZW5mLXZjYy1odmEiLAotCQkuZGF0YSA9ICZjbGtnZW5fbXV4X2ZfdmNjX2h2YV80MTYsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LHN0aWg0MTYtY2xrZ2VuZi12Y2MtaGQiLAotCQkuZGF0YSA9ICZjbGtnZW5fbXV4X2ZfdmNjX2hkXzQxNiwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1jbGtnZW5mLXZjYy1zZCIsCi0JCS5kYXRhID0gJmNsa2dlbl9tdXhfY192Y2Nfc2RfNDE2LAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE1LWNsa2dlbi1hOS1tdXgiLAotCQkuZGF0YSA9ICZzdGloNDE1X2E5X211eF9kYXRhLAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LWNsa2dlbi1hOS1tdXgiLAotCQkuZGF0YSA9ICZzdGloNDE2X2E5X211eF9kYXRhLAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LWNsa2dlbi1hOS1tdXgiLAotCQkuZGF0YSA9ICZzdGloNDA3X2E5X211eF9kYXRhLAotCX0sCi0Je30KLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBzdF9vZl9jbGtnZW5fbXV4X3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCitzdGF0aWMgdm9pZCBfX2luaXQgc3Rfb2ZfY2xrZ2VuX211eF9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQlzdHJ1Y3QgY2xrZ2VuX211eF9kYXRhICpkYXRhKQogewotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCXN0cnVjdCBjbGsgKmNsazsKIAl2b2lkIF9faW9tZW0gKnJlZzsKIAljb25zdCBjaGFyICoqcGFyZW50czsKLQlpbnQgbnVtX3BhcmVudHM7Ci0JY29uc3Qgc3RydWN0IGNsa2dlbl9tdXhfZGF0YSAqZGF0YTsKLQotCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShtdXhfb2ZfbWF0Y2gsIG5wKTsKLQlpZiAoIW1hdGNoKSB7Ci0JCXByX2VycigiJXM6IE5vIG1hdGNoaW5nIGRhdGFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCWRhdGEgPSBtYXRjaC0+ZGF0YTsKKwlpbnQgbnVtX3BhcmVudHMgPSAwOwogCiAJcmVnID0gb2ZfaW9tYXAobnAsIDApOwogCWlmICghcmVnKSB7CkBAIC02NzksMTYxICs5NiwxMCBAQAogZXJyX3BhcmVudHM6CiAJaW91bm1hcChyZWcpOwogfQotQ0xLX09GX0RFQ0xBUkUoY2xrZ2VuX211eCwgInN0LGNsa2dlbi1tdXgiLCBzdF9vZl9jbGtnZW5fbXV4X3NldHVwKTsKIAotI2RlZmluZSBWQ0NfTUFYX0NIQU5ORUxTIDE2Ci0KLSNkZWZpbmUgVkNDX0dBVEVfT0ZGU0VUIDB4MAotI2RlZmluZSBWQ0NfTVVYX09GRlNFVCAweDQKLSNkZWZpbmUgVkNDX0RJVl9PRkZTRVQgMHg4Ci0KLXN0cnVjdCBjbGtnZW5fdmNjX2RhdGEgewotCXNwaW5sb2NrX3QgKmxvY2s7Ci0JdW5zaWduZWQgbG9uZyBjbGtfZmxhZ3M7Ci19OwotCi1zdGF0aWMgc3RydWN0IGNsa2dlbl92Y2NfZGF0YSBzdF9jbGtnZW5jX3ZjY180MTYgPSB7Ci0JLmNsa19mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa2dlbl92Y2NfZGF0YSBzdF9jbGtnZW5mX3ZjY180MTYgPSB7Ci0JLmxvY2sgPSAmY2xrZ2VuZl9sb2NrLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdmNjX29mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LWNsa2dlbmMiLCAuZGF0YSA9ICZzdF9jbGtnZW5jX3ZjY180MTYgfSwKLQl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MTYtY2xrZ2VuZiIsIC5kYXRhID0gJnN0X2Nsa2dlbmZfdmNjXzQxNiB9LAotCXt9Ci19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgc3Rfb2ZfY2xrZ2VuX3ZjY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQorc3RhdGljIHZvaWQgX19pbml0IHN0X29mX2Nsa2dlbl9hOV9tdXhfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKLQl2b2lkIF9faW9tZW0gKnJlZzsKLQljb25zdCBjaGFyICoqcGFyZW50czsKLQlpbnQgbnVtX3BhcmVudHMsIGk7Ci0Jc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNsa19kYXRhOwotCWNvbnN0IHN0cnVjdCBjbGtnZW5fdmNjX2RhdGEgKmRhdGE7Ci0KLQltYXRjaCA9IG9mX21hdGNoX25vZGUodmNjX29mX21hdGNoLCBucCk7Ci0JaWYgKFdBUk5fT04oIW1hdGNoKSkKLQkJcmV0dXJuOwotCWRhdGEgPSBtYXRjaC0+ZGF0YTsKLQotCXJlZyA9IG9mX2lvbWFwKG5wLCAwKTsKLQlpZiAoIXJlZykKLQkJcmV0dXJuOwotCi0JcGFyZW50cyA9IGNsa2dlbl9tdXhfZ2V0X3BhcmVudHMobnAsICZudW1fcGFyZW50cyk7Ci0JaWYgKElTX0VSUihwYXJlbnRzKSkKLQkJZ290byBlcnJfcGFyZW50czsKLQotCWNsa19kYXRhID0ga3phbGxvYyhzaXplb2YoKmNsa19kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjbGtfZGF0YSkKLQkJZ290byBlcnJfYWxsb2M7Ci0KLQljbGtfZGF0YS0+Y2xrX251bSA9IFZDQ19NQVhfQ0hBTk5FTFM7Ci0JY2xrX2RhdGEtPmNsa3MgPSBrY2FsbG9jKGNsa19kYXRhLT5jbGtfbnVtLCBzaXplb2Yoc3RydWN0IGNsayAqKSwKLQkJCQkgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWNsa19kYXRhLT5jbGtzKQotCQlnb3RvIGVycl9hbGxvY19jbGtzOwotCi0JZm9yIChpID0gMDsgaSA8IGNsa19kYXRhLT5jbGtfbnVtOyBpKyspIHsKLQkJc3RydWN0IGNsayAqY2xrOwotCQljb25zdCBjaGFyICpjbGtfbmFtZTsKLQkJc3RydWN0IGNsa19nYXRlICpnYXRlOwotCQlzdHJ1Y3QgY2xrX2RpdmlkZXIgKmRpdjsKLQkJc3RydWN0IGNsa19tdXggKm11eDsKLQotCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLAotCQkJCQkJICBpLCAmY2xrX25hbWUpKQotCQkJYnJlYWs7Ci0KLQkJLyoKLQkJICogSWYgd2UgcmVhZCBhbiBlbXB0eSBjbG9jayBuYW1lIHRoZW4gdGhlIG91dHB1dCBpcyB1bnVzZWQKLQkJICovCi0JCWlmICgqY2xrX25hbWUgPT0gJ1wwJykKLQkJCWNvbnRpbnVlOwotCi0JCWdhdGUgPSBremFsbG9jKHNpemVvZigqZ2F0ZSksIEdGUF9LRVJORUwpOwotCQlpZiAoIWdhdGUpCi0JCQlnb3RvIGVycjsKLQotCQlkaXYgPSBremFsbG9jKHNpemVvZigqZGl2KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghZGl2KSB7Ci0JCQlrZnJlZShnYXRlKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0KLQkJbXV4ID0ga3phbGxvYyhzaXplb2YoKm11eCksIEdGUF9LRVJORUwpOwotCQlpZiAoIW11eCkgewotCQkJa2ZyZWUoZ2F0ZSk7Ci0JCQlrZnJlZShkaXYpOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQlnYXRlLT5yZWcgPSByZWcgKyBWQ0NfR0FURV9PRkZTRVQ7Ci0JCWdhdGUtPmJpdF9pZHggPSBpOwotCQlnYXRlLT5mbGFncyA9IENMS19HQVRFX1NFVF9UT19ESVNBQkxFOwotCQlnYXRlLT5sb2NrID0gZGF0YS0+bG9jazsKLQotCQlkaXYtPnJlZyA9IHJlZyArIFZDQ19ESVZfT0ZGU0VUOwotCQlkaXYtPnNoaWZ0ID0gMiAqIGk7Ci0JCWRpdi0+d2lkdGggPSAyOwotCQlkaXYtPmZsYWdzID0gQ0xLX0RJVklERVJfUE9XRVJfT0ZfVFdPIHwKLQkJCUNMS19ESVZJREVSX1JPVU5EX0NMT1NFU1Q7Ci0KLQkJbXV4LT5yZWcgPSByZWcgKyBWQ0NfTVVYX09GRlNFVDsKLQkJbXV4LT5zaGlmdCA9IDIgKiBpOwotCQltdXgtPm1hc2sgPSAweDM7Ci0KLQkJY2xrID0gY2xrX3JlZ2lzdGVyX2NvbXBvc2l0ZShOVUxMLCBjbGtfbmFtZSwgcGFyZW50cywKLQkJCQkJICAgICBudW1fcGFyZW50cywKLQkJCQkJICAgICAmbXV4LT5odywgJmNsa19tdXhfb3BzLAotCQkJCQkgICAgICZkaXYtPmh3LCAmY2xrX2RpdmlkZXJfb3BzLAotCQkJCQkgICAgICZnYXRlLT5odywgJmNsa19nYXRlX29wcywKLQkJCQkJICAgICBkYXRhLT5jbGtfZmxhZ3MgfAotCQkJCQkgICAgIENMS19HRVRfUkFURV9OT0NBQ0hFKTsKLQkJaWYgKElTX0VSUihjbGspKSB7Ci0JCQlrZnJlZShnYXRlKTsKLQkJCWtmcmVlKGRpdik7Ci0JCQlrZnJlZShtdXgpOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQlwcl9kZWJ1ZygiJXM6IHBhcmVudCAlcyByYXRlICV1XG4iLAotCQkJX19jbGtfZ2V0X25hbWUoY2xrKSwKLQkJCV9fY2xrX2dldF9uYW1lKGNsa19nZXRfcGFyZW50KGNsaykpLAotCQkJKHVuc2lnbmVkIGludCljbGtfZ2V0X3JhdGUoY2xrKSk7Ci0KLQkJY2xrX2RhdGEtPmNsa3NbaV0gPSBjbGs7Ci0JfQotCi0Ja2ZyZWUocGFyZW50cyk7Ci0KLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LCBjbGtfZGF0YSk7Ci0JcmV0dXJuOwotCi1lcnI6Ci0JZm9yIChpID0gMDsgaSA8IGNsa19kYXRhLT5jbGtfbnVtOyBpKyspIHsKLQkJc3RydWN0IGNsa19jb21wb3NpdGUgKmNvbXBvc2l0ZTsKLQotCQlpZiAoIWNsa19kYXRhLT5jbGtzW2ldKQotCQkJY29udGludWU7Ci0KLQkJY29tcG9zaXRlID0gdG9fY2xrX2NvbXBvc2l0ZShfX2Nsa19nZXRfaHcoY2xrX2RhdGEtPmNsa3NbaV0pKTsKLQkJa2ZyZWUodG9fY2xrX2dhdGUoY29tcG9zaXRlLT5nYXRlX2h3KSk7Ci0JCWtmcmVlKHRvX2Nsa19kaXZpZGVyKGNvbXBvc2l0ZS0+cmF0ZV9odykpOwotCQlrZnJlZSh0b19jbGtfbXV4KGNvbXBvc2l0ZS0+bXV4X2h3KSk7Ci0JfQotCi0Ja2ZyZWUoY2xrX2RhdGEtPmNsa3MpOwotZXJyX2FsbG9jX2Nsa3M6Ci0Ja2ZyZWUoY2xrX2RhdGEpOwotZXJyX2FsbG9jOgotCWtmcmVlKHBhcmVudHMpOwotZXJyX3BhcmVudHM6Ci0JaW91bm1hcChyZWcpOworCXN0X29mX2Nsa2dlbl9tdXhfc2V0dXAobnAsICZzdGloNDA3X2E5X211eF9kYXRhKTsKIH0KLUNMS19PRl9ERUNMQVJFKGNsa2dlbl92Y2MsICJzdCxjbGtnZW4tdmNjIiwgc3Rfb2ZfY2xrZ2VuX3ZjY19zZXR1cCk7CitDTEtfT0ZfREVDTEFSRShjbGtnZW5fYTltdXgsICJzdCxzdGloNDA3LWNsa2dlbi1hOS1tdXgiLAorCQlzdF9vZl9jbGtnZW5fYTlfbXV4X3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N0L2Nsa2dlbi1wbGwuYyBiL2RyaXZlcnMvY2xrL3N0L2Nsa2dlbi1wbGwuYwppbmRleCAwYjU5OTBlLi4yNWJkYTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9zdC9jbGtnZW4tcGxsLmMKKysrIGIvZHJpdmVycy9jbGsvc3QvY2xrZ2VuLXBsbC5jCkBAIC0yNiwxNCArMjYsNiBAQAogREVGSU5FX1NQSU5MT0NLKGNsa2dlbl9hOV9sb2NrKTsKIAogLyoKLSAqIENvbW1vbiBQTEwgY29uZmlndXJhdGlvbiByZWdpc3RlciBiaXRzIGZvciBQTEw4MDAgYW5kIFBMTDE2MDAgQzY1Ci0gKi8KLSNkZWZpbmUgQzY1X01ESVZfUExMODAwX01BU0sJKDB4ZmYpCi0jZGVmaW5lIEM2NV9NRElWX1BMTDE2MDBfTUFTSwkoMHg3KQotI2RlZmluZSBDNjVfTkRJVl9NQVNLCQkoMHhmZikKLSNkZWZpbmUgQzY1X1BESVZfTUFTSwkJKDB4NykKLQotLyoKICAqIFBMTCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGJpdHMgZm9yIFBMTDMyMDAgQzMyCiAgKi8KICNkZWZpbmUgQzMyX05ESVZfTUFTSyAoMHhmZikKQEAgLTcwLDE0NCArNjIsMTAgQEAKIAljb25zdCBzdHJ1Y3QgY2xrX29wcyAqb3BzOwogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHN0X3BsbDE2MDBjNjVfb3BzOwotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHN0X3BsbDgwMGM2NV9vcHM7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc3RtX3BsbDMyMDBjMzJfb3BzOwogc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHN0bV9wbGwzMjAwYzMyX2E5X29wczsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzdF9wbGwxMjAwYzMyX29wczsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzdG1fcGxsNDYwMGMyOF9vcHM7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrZ2VuX3BsbF9kYXRhIHN0X3BsbDE2MDBjNjVfYXggPSB7Ci0JLnBkbl9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHgwLCAweDEsCQkJMTkpLAotCS5wZG5fY3RybAk9IENMS0dFTl9GSUVMRCgweDEwLAkweDEsCQkJMCksCi0JLmxvY2tlZF9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHgwLCAweDEsCQkJMzEpLAotCS5tZGl2CQk9IENMS0dFTl9GSUVMRCgweDAsIEM2NV9NRElWX1BMTDE2MDBfTUFTSywJMCksCi0JLm5kaXYJCT0gQ0xLR0VOX0ZJRUxEKDB4MCwgQzY1X05ESVZfTUFTSywJCTgpLAotCS5vcHMJCT0gJnN0X3BsbDE2MDBjNjVfb3BzCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa2dlbl9wbGxfZGF0YSBzdF9wbGw4MDBjNjVfYXggPSB7Ci0JLnBkbl9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHgwLAkweDEsCQkJMTkpLAotCS5wZG5fY3RybAk9IENMS0dFTl9GSUVMRCgweEMsCTB4MSwJCQkxKSwKLQkubG9ja2VkX3N0YXR1cwk9IENMS0dFTl9GSUVMRCgweDAsCTB4MSwJCQkzMSksCi0JLm1kaXYJCT0gQ0xLR0VOX0ZJRUxEKDB4MCwJQzY1X01ESVZfUExMODAwX01BU0ssCTApLAotCS5uZGl2CQk9IENMS0dFTl9GSUVMRCgweDAsCUM2NV9ORElWX01BU0ssCQk4KSwKLQkucGRpdgkJPSBDTEtHRU5fRklFTEQoMHgwLAlDNjVfUERJVl9NQVNLLAkJMTYpLAotCS5vcHMJCT0gJnN0X3BsbDgwMGM2NV9vcHMKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrZ2VuX3BsbF9kYXRhIHN0X3BsbDMyMDBjMzJfYTF4XzAgPSB7Ci0JLnBkbl9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHgwLAkweDEsCQkJMzEpLAotCS5wZG5fY3RybAk9IENMS0dFTl9GSUVMRCgweDE4LAkweDEsCQkJMCksCi0JLmxvY2tlZF9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHg0LAkweDEsCQkJMzEpLAotCS5uZGl2CQk9IENMS0dFTl9GSUVMRCgweDAsCUMzMl9ORElWX01BU0ssCQkweDApLAotCS5pZGYJCT0gQ0xLR0VOX0ZJRUxEKDB4NCwJQzMyX0lERl9NQVNLLAkJMHgwKSwKLQkubnVtX29kZnMgPSA0LAotCS5vZGYgPQl7CUNMS0dFTl9GSUVMRCgweDU0LAlDMzJfT0RGX01BU0ssCQk0KSwKLQkJCUNMS0dFTl9GSUVMRCgweDU0LAlDMzJfT0RGX01BU0ssCQkxMCksCi0JCQlDTEtHRU5fRklFTEQoMHg1NCwJQzMyX09ERl9NQVNLLAkJMTYpLAotCQkJQ0xLR0VOX0ZJRUxEKDB4NTQsCUMzMl9PREZfTUFTSywJCTIyKSB9LAotCS5vZGZfZ2F0ZSA9IHsJQ0xLR0VOX0ZJRUxEKDB4NTQsCTB4MSwJCQkwKSwKLQkJCUNMS0dFTl9GSUVMRCgweDU0LAkweDEsCQkJMSksCi0JCQlDTEtHRU5fRklFTEQoMHg1NCwJMHgxLAkJCTIpLAotCQkJQ0xLR0VOX0ZJRUxEKDB4NTQsCTB4MSwJCQkzKSB9LAotCS5vcHMJCT0gJnN0bV9wbGwzMjAwYzMyX29wcywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrZ2VuX3BsbF9kYXRhIHN0X3BsbDMyMDBjMzJfYTF4XzEgPSB7Ci0JLnBkbl9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHhDLAkweDEsCQkJMzEpLAotCS5wZG5fY3RybAk9IENMS0dFTl9GSUVMRCgweDE4LAkweDEsCQkJMSksCi0JLmxvY2tlZF9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHgxMCwJMHgxLAkJCTMxKSwKLQkubmRpdgkJPSBDTEtHRU5fRklFTEQoMHhDLAlDMzJfTkRJVl9NQVNLLAkJMHgwKSwKLQkuaWRmCQk9IENMS0dFTl9GSUVMRCgweDEwLAlDMzJfSURGX01BU0ssCQkweDApLAotCS5udW1fb2RmcyA9IDQsCi0JLm9kZiA9IHsJQ0xLR0VOX0ZJRUxEKDB4NTgsCUMzMl9PREZfTUFTSywJCTQpLAotCQkJQ0xLR0VOX0ZJRUxEKDB4NTgsCUMzMl9PREZfTUFTSywJCTEwKSwKLQkJCUNMS0dFTl9GSUVMRCgweDU4LAlDMzJfT0RGX01BU0ssCQkxNiksCi0JCQlDTEtHRU5fRklFTEQoMHg1OCwJQzMyX09ERl9NQVNLLAkJMjIpIH0sCi0JLm9kZl9nYXRlID0gewlDTEtHRU5fRklFTEQoMHg1OCwJMHgxLAkJCTApLAotCQkJQ0xLR0VOX0ZJRUxEKDB4NTgsCTB4MSwJCQkxKSwKLQkJCUNMS0dFTl9GSUVMRCgweDU4LAkweDEsCQkJMiksCi0JCQlDTEtHRU5fRklFTEQoMHg1OCwJMHgxLAkJCTMpIH0sCi0JLm9wcwkJPSAmc3RtX3BsbDMyMDBjMzJfb3BzLAotfTsKLQotLyogNDE1IHNwZWNpZmljICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa2dlbl9wbGxfZGF0YSBzdF9wbGwzMjAwYzMyX2E5XzQxNSA9IHsKLQkucGRuX3N0YXR1cwk9IENMS0dFTl9GSUVMRCgweDAsCTB4MSwJCQkwKSwKLQkucGRuX2N0cmwJPSBDTEtHRU5fRklFTEQoMHgwLAkweDEsCQkJMCksCi0JLmxvY2tlZF9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHg2QywJMHgxLAkJCTApLAotCS5uZGl2CQk9IENMS0dFTl9GSUVMRCgweDAsCUMzMl9ORElWX01BU0ssCQk5KSwKLQkuaWRmCQk9IENMS0dFTl9GSUVMRCgweDAsCUMzMl9JREZfTUFTSywJCTIyKSwKLQkubnVtX29kZnMgPSAxLAotCS5vZGYgPQkJeyBDTEtHRU5fRklFTEQoMHgwLAlDMzJfT0RGX01BU0ssCQkzKSB9LAotCS5vZGZfZ2F0ZSA9CXsgQ0xLR0VOX0ZJRUxEKDB4MCwJMHgxLAkJCTI4KSB9LAotCS5vcHMJCT0gJnN0bV9wbGwzMjAwYzMyX29wcywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrZ2VuX3BsbF9kYXRhIHN0X3BsbDMyMDBjMzJfZGRyXzQxNSA9IHsKLQkucGRuX3N0YXR1cwk9IENMS0dFTl9GSUVMRCgweDAsCTB4MSwJCQkwKSwKLQkucGRuX2N0cmwJPSBDTEtHRU5fRklFTEQoMHgwLAkweDEsCQkJMCksCi0JLmxvY2tlZF9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHgxMDAsCTB4MSwJCQkwKSwKLQkubmRpdgkJPSBDTEtHRU5fRklFTEQoMHg4LAlDMzJfTkRJVl9NQVNLLAkJMCksCi0JLmlkZgkJPSBDTEtHRU5fRklFTEQoMHgwLAlDMzJfSURGX01BU0ssCQkyNSksCi0JLm51bV9vZGZzID0gMiwKLQkub2RmCQk9IHsgQ0xLR0VOX0ZJRUxEKDB4OCwJQzMyX09ERl9NQVNLLAkJOCksCi0JCQkgICAgQ0xLR0VOX0ZJRUxEKDB4OCwJQzMyX09ERl9NQVNLLAkJMTQpIH0sCi0JLm9kZl9nYXRlCT0geyBDTEtHRU5fRklFTEQoMHg0LAkweDEsCQkJMjgpLAotCQkJICAgIENMS0dFTl9GSUVMRCgweDQsCTB4MSwJCQkyOSkgfSwKLQkub3BzCQk9ICZzdG1fcGxsMzIwMGMzMl9vcHMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa2dlbl9wbGxfZGF0YSBzdF9wbGwxMjAwYzMyX2dwdV80MTUgPSB7Ci0JLnBkbl9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHg0LAkweDEsCQkJMCksCi0JLnBkbl9jdHJsCT0gQ0xLR0VOX0ZJRUxEKDB4NCwJMHgxLAkJCTApLAotCS5sb2NrZWRfc3RhdHVzCT0gQ0xLR0VOX0ZJRUxEKDB4MTY4LAkweDEsCQkJMCksCi0JLmxkZgkJPSBDTEtHRU5fRklFTEQoMHgwLAlDMzJfTERGX01BU0ssCQkzKSwKLQkuaWRmCQk9IENMS0dFTl9GSUVMRCgweDAsCUMzMl9JREZfTUFTSywJCTApLAotCS5udW1fb2RmcyA9IDAsCi0JLm9kZgkJPSB7IENMS0dFTl9GSUVMRCgweDAsCUMzMl9PREZfTUFTSywJCTEwKSB9LAotCS5vcHMJCT0gJnN0X3BsbDEyMDBjMzJfb3BzLAotfTsKLQotLyogNDE2IHNwZWNpZmljICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa2dlbl9wbGxfZGF0YSBzdF9wbGwzMjAwYzMyX2E5XzQxNiA9IHsKLQkucGRuX3N0YXR1cwk9IENMS0dFTl9GSUVMRCgweDAsCTB4MSwJCQkwKSwKLQkucGRuX2N0cmwJPSBDTEtHRU5fRklFTEQoMHgwLAkweDEsCQkJMCksCi0JLmxvY2tlZF9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHg2QywJMHgxLAkJCTApLAotCS5uZGl2CQk9IENMS0dFTl9GSUVMRCgweDgsCUMzMl9ORElWX01BU0ssCQkwKSwKLQkuaWRmCQk9IENMS0dFTl9GSUVMRCgweDAsCUMzMl9JREZfTUFTSywJCTI1KSwKLQkubnVtX29kZnMgPSAxLAotCS5vZGYJCT0geyBDTEtHRU5fRklFTEQoMHg4LAlDMzJfT0RGX01BU0ssCQk4KSB9LAotCS5vZGZfZ2F0ZQk9IHsgQ0xLR0VOX0ZJRUxEKDB4NCwJMHgxLAkJCTI4KSB9LAotCS5vcHMJCT0gJnN0bV9wbGwzMjAwYzMyX29wcywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrZ2VuX3BsbF9kYXRhIHN0X3BsbDMyMDBjMzJfZGRyXzQxNiA9IHsKLQkucGRuX3N0YXR1cwk9IENMS0dFTl9GSUVMRCgweDAsCTB4MSwJCQkwKSwKLQkucGRuX2N0cmwJPSBDTEtHRU5fRklFTEQoMHgwLAkweDEsCQkJMCksCi0JLmxvY2tlZF9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHgxMEMsCTB4MSwJCQkwKSwKLQkubmRpdgkJPSBDTEtHRU5fRklFTEQoMHg4LAlDMzJfTkRJVl9NQVNLLAkJMCksCi0JLmlkZgkJPSBDTEtHRU5fRklFTEQoMHgwLAlDMzJfSURGX01BU0ssCQkyNSksCi0JLm51bV9vZGZzID0gMiwKLQkub2RmCQk9IHsgQ0xLR0VOX0ZJRUxEKDB4OCwJQzMyX09ERl9NQVNLLAkJOCksCi0JCQkgICAgQ0xLR0VOX0ZJRUxEKDB4OCwJQzMyX09ERl9NQVNLLAkJMTQpIH0sCi0JLm9kZl9nYXRlCT0geyBDTEtHRU5fRklFTEQoMHg0LAkweDEsCQkJMjgpLAotCQkJICAgIENMS0dFTl9GSUVMRCgweDQsCTB4MSwJCQkyOSkgfSwKLQkub3BzCQk9ICZzdG1fcGxsMzIwMGMzMl9vcHMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa2dlbl9wbGxfZGF0YSBzdF9wbGwxMjAwYzMyX2dwdV80MTYgPSB7Ci0JLnBkbl9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHg4RTQsCTB4MSwJCQkzKSwKLQkucGRuX2N0cmwJPSBDTEtHRU5fRklFTEQoMHg4RTQsCTB4MSwJCQkzKSwKLQkubG9ja2VkX3N0YXR1cwk9IENMS0dFTl9GSUVMRCgweDkwQywJMHgxLAkJCTApLAotCS5sZGYJCT0gQ0xLR0VOX0ZJRUxEKDB4MCwJQzMyX0xERl9NQVNLLAkJMyksCi0JLmlkZgkJPSBDTEtHRU5fRklFTEQoMHgwLAlDMzJfSURGX01BU0ssCQkwKSwKLQkubnVtX29kZnMgPSAwLAotCS5vZGYJCT0geyBDTEtHRU5fRklFTEQoMHgwLAlDMzJfT0RGX01BU0ssCQkxMCkgfSwKLQkub3BzCQk9ICZzdF9wbGwxMjAwYzMyX29wcywKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrZ2VuX3BsbF9kYXRhIHN0X3BsbDMyMDBjMzJfNDA3X2EwID0gewogCS8qIDQwNyBBMCAqLwogCS5wZG5fc3RhdHVzCT0gQ0xLR0VOX0ZJRUxEKDB4MmEwLAkweDEsCQkJOCksCkBAIC00MTAsNTcgKzI2OCw2IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocGxsLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlY2FsY19zdG1fcGxsODAwYzY1KHN0cnVjdCBjbGtfaHcgKmh3LAotCQl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKQotewotCXN0cnVjdCBjbGtnZW5fcGxsICpwbGwgPSB0b19jbGtnZW5fcGxsKGh3KTsKLQl1bnNpZ25lZCBsb25nIG1kaXYsIG5kaXYsIHBkaXY7Ci0JdW5zaWduZWQgbG9uZyByYXRlOwotCXVpbnQ2NF90IHJlczsKLQotCWlmICghY2xrZ2VuX3BsbF9pc19lbmFibGVkKGh3KSB8fCAhY2xrZ2VuX3BsbF9pc19sb2NrZWQoaHcpKQotCQlyZXR1cm4gMDsKLQotCXBkaXYgPSBDTEtHRU5fUkVBRChwbGwsIHBkaXYpOwotCW1kaXYgPSBDTEtHRU5fUkVBRChwbGwsIG1kaXYpOwotCW5kaXYgPSBDTEtHRU5fUkVBRChwbGwsIG5kaXYpOwotCi0JaWYgKCFtZGl2KQotCQltZGl2Kys7IC8qIG1kaXY9MCBvciAxID0+IE1ESVY9MSAqLwotCi0JcmVzID0gKHVpbnQ2NF90KTIgKiAodWludDY0X3QpcGFyZW50X3JhdGUgKiAodWludDY0X3QpbmRpdjsKLQlyYXRlID0gKHVuc2lnbmVkIGxvbmcpZGl2NjRfdTY0KHJlcywgbWRpdiAqICgxIDw8IHBkaXYpKTsKLQotCXByX2RlYnVnKCIlczolcyByYXRlICVsdVxuIiwgY2xrX2h3X2dldF9uYW1lKGh3KSwgX19mdW5jX18sIHJhdGUpOwotCi0JcmV0dXJuIHJhdGU7Ci0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVjYWxjX3N0bV9wbGwxNjAwYzY1KHN0cnVjdCBjbGtfaHcgKmh3LAotCQl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKQotewotCXN0cnVjdCBjbGtnZW5fcGxsICpwbGwgPSB0b19jbGtnZW5fcGxsKGh3KTsKLQl1bnNpZ25lZCBsb25nIG1kaXYsIG5kaXY7Ci0JdW5zaWduZWQgbG9uZyByYXRlOwotCi0JaWYgKCFjbGtnZW5fcGxsX2lzX2VuYWJsZWQoaHcpIHx8ICFjbGtnZW5fcGxsX2lzX2xvY2tlZChodykpCi0JCXJldHVybiAwOwotCi0JbWRpdiA9IENMS0dFTl9SRUFEKHBsbCwgbWRpdik7Ci0JbmRpdiA9IENMS0dFTl9SRUFEKHBsbCwgbmRpdik7Ci0KLQlpZiAoIW1kaXYpCi0JCW1kaXYgPSAxOwotCi0JLyogTm90ZTogaW5wdXQgaXMgZGl2aWRlZCBieSAxMDAwIHRvIGF2b2lkIG92ZXJmbG93ICovCi0JcmF0ZSA9ICgoMiAqIChwYXJlbnRfcmF0ZSAvIDEwMDApICogbmRpdikgLyBtZGl2KSAqIDEwMDA7Ci0KLQlwcl9kZWJ1ZygiJXM6JXMgcmF0ZSAlbHVcbiIsIGNsa19od19nZXRfbmFtZShodyksIF9fZnVuY19fLCByYXRlKTsKLQotCXJldHVybiByYXRlOwotfQotCiBzdGF0aWMgaW50IGNsa19wbGwzMjAwYzMyX2dldF9wYXJhbXModW5zaWduZWQgbG9uZyBpbnB1dCwgdW5zaWduZWQgbG9uZyBvdXRwdXQsCiAJCQkgIHN0cnVjdCBzdG1fcGxsICpwbGwpCiB7CkBAIC02MDgsMzMgKzQxNSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlY2FsY19zdG1fcGxsMTIwMGMzMihzdHJ1Y3QgY2xrX2h3ICpodywKLQkJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKLXsKLQlzdHJ1Y3QgY2xrZ2VuX3BsbCAqcGxsID0gdG9fY2xrZ2VuX3BsbChodyk7Ci0JdW5zaWduZWQgbG9uZyBvZGYsIGxkZiwgaWRmOwotCXVuc2lnbmVkIGxvbmcgcmF0ZTsKLQotCWlmICghY2xrZ2VuX3BsbF9pc19lbmFibGVkKGh3KSB8fCAhY2xrZ2VuX3BsbF9pc19sb2NrZWQoaHcpKQotCQlyZXR1cm4gMDsKLQotCW9kZiA9IENMS0dFTl9SRUFEKHBsbCwgb2RmWzBdKTsKLQlsZGYgPSBDTEtHRU5fUkVBRChwbGwsIGxkZik7Ci0JaWRmID0gQ0xLR0VOX1JFQUQocGxsLCBpZGYpOwotCi0JaWYgKCFpZGYpIC8qIGlkZj09MCBtZWFucyAxICovCi0JCWlkZiA9IDE7Ci0JaWYgKCFvZGYpIC8qIG9kZj09MCBtZWFucyAxICovCi0JCW9kZiA9IDE7Ci0KLQkvKiBOb3RlOiBpbnB1dCBpcyBkaXZpZGVkIGJ5IDEwMDAgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KLQlyYXRlID0gKCgocGFyZW50X3JhdGUgLyAxMDAwKSAqIGxkZikgLyAob2RmICogaWRmKSkgKiAxMDAwOwotCi0JcHJfZGVidWcoIiVzOiVzIHJhdGUgJWx1XG4iLCBjbGtfaHdfZ2V0X25hbWUoaHcpLCBfX2Z1bmNfXywgcmF0ZSk7Ci0KLQlyZXR1cm4gcmF0ZTsKLX0KLQogLyogUExMIG91dHB1dCBzdHJ1Y3R1cmUKICAqIEZWQ08gPj4gLzIgPj4gRlZDT0JZMiAobm8gb3V0cHV0KQogICogICAgICAgICAgICAgICAgIHw+IERpdmlkZXIgKE9ERikgPj4gUEhJCkBAIC03OTIsMjAgKzU3Miw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzdF9wbGwxNjAwYzY1X29wcyA9IHsKLQkuZW5hYmxlCQk9IGNsa2dlbl9wbGxfZW5hYmxlLAotCS5kaXNhYmxlCT0gY2xrZ2VuX3BsbF9kaXNhYmxlLAotCS5pc19lbmFibGVkCT0gY2xrZ2VuX3BsbF9pc19lbmFibGVkLAotCS5yZWNhbGNfcmF0ZQk9IHJlY2FsY19zdG1fcGxsMTYwMGM2NSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzdF9wbGw4MDBjNjVfb3BzID0gewotCS5lbmFibGUJCT0gY2xrZ2VuX3BsbF9lbmFibGUsCi0JLmRpc2FibGUJPSBjbGtnZW5fcGxsX2Rpc2FibGUsCi0JLmlzX2VuYWJsZWQJPSBjbGtnZW5fcGxsX2lzX2VuYWJsZWQsCi0JLnJlY2FsY19yYXRlCT0gcmVjYWxjX3N0bV9wbGw4MDBjNjUsCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc3RtX3BsbDMyMDBjMzJfb3BzID0gewogCS5lbmFibGUJCT0gY2xrZ2VuX3BsbF9lbmFibGUsCiAJLmRpc2FibGUJPSBjbGtnZW5fcGxsX2Rpc2FibGUsCkBAIC04MjIsMTMgKzU4OCw2IEBACiAJLnNldF9yYXRlCT0gc2V0X3JhdGVfc3RtX3BsbDMyMDBjMzIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc3RfcGxsMTIwMGMzMl9vcHMgPSB7Ci0JLmVuYWJsZQkJPSBjbGtnZW5fcGxsX2VuYWJsZSwKLQkuZGlzYWJsZQk9IGNsa2dlbl9wbGxfZGlzYWJsZSwKLQkuaXNfZW5hYmxlZAk9IGNsa2dlbl9wbGxfaXNfZW5hYmxlZCwKLQkucmVjYWxjX3JhdGUJPSByZWNhbGNfc3RtX3BsbDEyMDBjMzIsCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc3RtX3BsbDQ2MDBjMjhfb3BzID0gewogCS5lbmFibGUJCT0gY2xrZ2VuX3BsbF9lbmFibGUsCiAJLmRpc2FibGUJPSBjbGtnZW5fcGxsX2Rpc2FibGUsCkBAIC04NzcsMjIgKzYzNiw2IEBACiAJcmV0dXJuIGNsazsKIH0KIAotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQgY2xrZ2VuX2M2NV9sc2Rpdl9yZWdpc3Rlcihjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKLQkJCQkJCSAgICAgY29uc3QgY2hhciAqY2xrX25hbWUpCi17Ci0Jc3RydWN0IGNsayAqY2xrOwotCi0JY2xrID0gY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCBjbGtfbmFtZSwgcGFyZW50X25hbWUsIDAsIDEsIDIpOwotCWlmIChJU19FUlIoY2xrKSkKLQkJcmV0dXJuIGNsazsKLQotCXByX2RlYnVnKCIlczogcGFyZW50ICVzIHJhdGUgJWx1XG4iLAotCQkJX19jbGtfZ2V0X25hbWUoY2xrKSwKLQkJCV9fY2xrX2dldF9uYW1lKGNsa19nZXRfcGFyZW50KGNsaykpLAotCQkJY2xrX2dldF9yYXRlKGNsaykpOwotCXJldHVybiBjbGs7Ci19Ci0KIHN0YXRpYyB2b2lkIF9faW9tZW0gKiBfX2luaXQgY2xrZ2VuX2dldF9yZWdpc3Rlcl9iYXNlKAogCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CkBAIC05MDksODkgKzY1Miw2IEBACiAJcmV0dXJuIHJlZzsKIH0KIAotI2RlZmluZSBDTEtHRU5BeF9QTEwwX09GRlNFVCAweDAKLSNkZWZpbmUgQ0xLR0VOQXhfUExMMV9PRkZTRVQgMHg0Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBjbGtnZW5hX2M2NV9wbGxfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQljb25zdCBpbnQgbnVtX3BsbF9vdXRwdXRzID0gMzsKLQlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSAqY2xrX2RhdGE7Ci0JY29uc3QgY2hhciAqcGFyZW50X25hbWU7Ci0Jdm9pZCBfX2lvbWVtICpyZWc7Ci0JY29uc3QgY2hhciAqY2xrX25hbWU7Ci0KLQlwYXJlbnRfbmFtZSA9IG9mX2Nsa19nZXRfcGFyZW50X25hbWUobnAsIDApOwotCWlmICghcGFyZW50X25hbWUpCi0JCXJldHVybjsKLQotCXJlZyA9IGNsa2dlbl9nZXRfcmVnaXN0ZXJfYmFzZShucCk7Ci0JaWYgKCFyZWcpCi0JCXJldHVybjsKLQotCWNsa19kYXRhID0ga3phbGxvYyhzaXplb2YoKmNsa19kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjbGtfZGF0YSkKLQkJcmV0dXJuOwotCi0JY2xrX2RhdGEtPmNsa19udW0gPSBudW1fcGxsX291dHB1dHM7Ci0JY2xrX2RhdGEtPmNsa3MgPSBremFsbG9jKGNsa19kYXRhLT5jbGtfbnVtICogc2l6ZW9mKHN0cnVjdCBjbGsgKiksCi0JCQkJIEdGUF9LRVJORUwpOwotCi0JaWYgKCFjbGtfZGF0YS0+Y2xrcykKLQkJZ290byBlcnI7Ci0KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLAotCQkJCQkgIDAsICZjbGtfbmFtZSkpCi0JCWdvdG8gZXJyOwotCi0JLyoKLQkgKiBQTEwwIEhTIChoaWdoIHNwZWVkKSBvdXRwdXQKLQkgKi8KLQljbGtfZGF0YS0+Y2xrc1swXSA9IGNsa2dlbl9wbGxfcmVnaXN0ZXIocGFyZW50X25hbWUsCi0JCQkoc3RydWN0IGNsa2dlbl9wbGxfZGF0YSAqKSAmc3RfcGxsMTYwMGM2NV9heCwKLQkJCXJlZyArIENMS0dFTkF4X1BMTDBfT0ZGU0VULCAwLCBjbGtfbmFtZSwgTlVMTCk7Ci0KLQlpZiAoSVNfRVJSKGNsa19kYXRhLT5jbGtzWzBdKSkKLQkJZ290byBlcnI7Ci0KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLAotCQkJCQkgIDEsICZjbGtfbmFtZSkpCi0JCWdvdG8gZXJyOwotCi0JLyoKLQkgKiBQTEwwIExTIChsb3cgc3BlZWQpIG91dHB1dCwgd2hpY2ggaXMgYSBmaXhlZCBkaXZpZGUgYnkgMiBvZiB0aGUKLQkgKiBoaWdoIHNwZWVkIG91dHB1dC4KLQkgKi8KLQljbGtfZGF0YS0+Y2xrc1sxXSA9IGNsa2dlbl9jNjVfbHNkaXZfcmVnaXN0ZXIoX19jbGtfZ2V0X25hbWUKLQkJCQkJCSAgICAgIChjbGtfZGF0YS0+Y2xrc1swXSksCi0JCQkJCQkgICAgICBjbGtfbmFtZSk7Ci0KLQlpZiAoSVNfRVJSKGNsa19kYXRhLT5jbGtzWzFdKSkKLQkJZ290byBlcnI7Ci0KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLAotCQkJCQkgIDIsICZjbGtfbmFtZSkpCi0JCWdvdG8gZXJyOwotCi0JLyoKLQkgKiBQTEwxIG91dHB1dAotCSAqLwotCWNsa19kYXRhLT5jbGtzWzJdID0gY2xrZ2VuX3BsbF9yZWdpc3RlcihwYXJlbnRfbmFtZSwKLQkJCShzdHJ1Y3QgY2xrZ2VuX3BsbF9kYXRhICopICZzdF9wbGw4MDBjNjVfYXgsCi0JCQlyZWcgKyBDTEtHRU5BeF9QTEwxX09GRlNFVCwgMCwgY2xrX25hbWUsIE5VTEwpOwotCi0JaWYgKElTX0VSUihjbGtfZGF0YS0+Y2xrc1syXSkpCi0JCWdvdG8gZXJyOwotCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgY2xrX2RhdGEpOwotCXJldHVybjsKLQotZXJyOgotCWtmcmVlKGNsa19kYXRhLT5jbGtzKTsKLQlrZnJlZShjbGtfZGF0YSk7Ci19Ci1DTEtfT0ZfREVDTEFSRShjbGtnZW5hX2M2NV9wbGxzLAotCSAgICAgICAic3QsY2xrZ2VuYS1wbGxzLWM2NSIsIGNsa2dlbmFfYzY1X3BsbF9zZXR1cCk7Ci0KIHN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0IGNsa2dlbl9vZGZfcmVnaXN0ZXIoY29uc3QgY2hhciAqcGFyZW50X25hbWUsCiAJCQkJCSAgICAgICB2b2lkIF9faW9tZW0gKnJlZywKIAkJCQkJICAgICAgIHN0cnVjdCBjbGtnZW5fcGxsX2RhdGEgKnBsbF9kYXRhLApAQCAtMTA0Miw3MiArNzAyLDE3IEBACiAJcmV0dXJuIGNsazsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYzMyX3BsbF9vZl9tYXRjaFtdID0gewotCXsKLQkJLmNvbXBhdGlibGUgPSAic3QscGxscy1jMzItYTF4LTAiLAotCQkuZGF0YSA9ICZzdF9wbGwzMjAwYzMyX2ExeF8wLAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxwbGxzLWMzMi1hMXgtMSIsCi0JCS5kYXRhID0gJnN0X3BsbDMyMDBjMzJfYTF4XzEsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LHN0aWg0MTUtcGxscy1jMzItYTkiLAotCQkuZGF0YSA9ICZzdF9wbGwzMjAwYzMyX2E5XzQxNSwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNS1wbGxzLWMzMi1kZHIiLAotCQkuZGF0YSA9ICZzdF9wbGwzMjAwYzMyX2Rkcl80MTUsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LHN0aWg0MTYtcGxscy1jMzItYTkiLAotCQkuZGF0YSA9ICZzdF9wbGwzMjAwYzMyX2E5XzQxNiwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1wbGxzLWMzMi1kZHIiLAotCQkuZGF0YSA9ICZzdF9wbGwzMjAwYzMyX2Rkcl80MTYsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LHN0aWg0MDctcGxscy1jMzItYTAiLAotCQkuZGF0YSA9ICZzdF9wbGwzMjAwYzMyXzQwN19hMCwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3QscGxscy1jMzItY3hfMCIsCi0JCS5kYXRhID0gJnN0X3BsbDMyMDBjMzJfY3hfMCwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3QscGxscy1jMzItY3hfMSIsCi0JCS5kYXRhID0gJnN0X3BsbDMyMDBjMzJfY3hfMSwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy1wbGxzLWMzMi1hOSIsCi0JCS5kYXRhID0gJnN0X3BsbDMyMDBjMzJfNDA3X2E5LAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE4LXBsbHMtYzI4LWE5IiwKLQkJLmRhdGEgPSAmc3RfcGxsNDYwMGMyOF80MThfYTksCi0JfSwKLQl7fQotfTsKIAotc3RhdGljIHZvaWQgX19pbml0IGNsa2dlbl9jMzJfcGxsX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCitzdGF0aWMgdm9pZCBfX2luaXQgY2xrZ2VuX2MzMl9wbGxfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJc3RydWN0IGNsa2dlbl9wbGxfZGF0YSAqZGF0YSkKIHsKLQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWUsICpwbGxfbmFtZTsKIAl2b2lkIF9faW9tZW0gKnBsbF9iYXNlOwogCWludCBudW1fb2Rmcywgb2RmOwogCXN0cnVjdCBjbGtfb25lY2VsbF9kYXRhICpjbGtfZGF0YTsKLQlzdHJ1Y3QgY2xrZ2VuX3BsbF9kYXRhCSpkYXRhOwogCXVuc2lnbmVkIGxvbmcgcGxsX2ZsYWdzID0gMDsKIAotCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShjMzJfcGxsX29mX21hdGNoLCBucCk7Ci0JaWYgKCFtYXRjaCkgewotCQlwcl9lcnIoIiVzOiBObyBtYXRjaGluZyBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlkYXRhID0gKHN0cnVjdCBjbGtnZW5fcGxsX2RhdGEgKikgbWF0Y2gtPmRhdGE7CiAKIAlwYXJlbnRfbmFtZSA9IG9mX2Nsa19nZXRfcGFyZW50X25hbWUobnAsIDApOwogCWlmICghcGFyZW50X25hbWUpCkBAIC0xMTY2LDU5ICs3NzEsMzAgQEAKIAlrZnJlZShjbGtfZGF0YS0+Y2xrcyk7CiAJa2ZyZWUoY2xrX2RhdGEpOwogfQotQ0xLX09GX0RFQ0xBUkUoY2xrZ2VuX2MzMl9wbGwsICJzdCxjbGtnZW4tcGxscy1jMzIiLCBjbGtnZW5fYzMyX3BsbF9zZXR1cCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGMzMl9ncHVfcGxsX29mX21hdGNoW10gPSB7Ci0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE1LWdwdS1wbGwtYzMyIiwKLQkJLmRhdGEgPSAmc3RfcGxsMTIwMGMzMl9ncHVfNDE1LAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LWdwdS1wbGwtYzMyIiwKLQkJLmRhdGEgPSAmc3RfcGxsMTIwMGMzMl9ncHVfNDE2LAotCX0sCi0Je30KLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBjbGtnZW5ncHVfYzMyX3BsbF9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQorc3RhdGljIHZvaWQgX19pbml0IGNsa2dlbl9jMzJfcGxsMF9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwotCXN0cnVjdCBjbGsgKmNsazsKLQljb25zdCBjaGFyICpwYXJlbnRfbmFtZTsKLQl2b2lkIF9faW9tZW0gKnJlZzsKLQljb25zdCBjaGFyICpjbGtfbmFtZTsKLQlzdHJ1Y3QgY2xrZ2VuX3BsbF9kYXRhCSpkYXRhOwotCi0JbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKGMzMl9ncHVfcGxsX29mX21hdGNoLCBucCk7Ci0JaWYgKCFtYXRjaCkgewotCQlwcl9lcnIoIiVzOiBObyBtYXRjaGluZyBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlkYXRhID0gKHN0cnVjdCBjbGtnZW5fcGxsX2RhdGEgKiltYXRjaC0+ZGF0YTsKLQotCXBhcmVudF9uYW1lID0gb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShucCwgMCk7Ci0JaWYgKCFwYXJlbnRfbmFtZSkKLQkJcmV0dXJuOwotCi0JcmVnID0gY2xrZ2VuX2dldF9yZWdpc3Rlcl9iYXNlKG5wKTsKLQlpZiAoIXJlZykKLQkJcmV0dXJuOwotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KG5wLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwKLQkJCQkJICAwLCAmY2xrX25hbWUpKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIFBMTCAxMjAwTUh6IG91dHB1dAotCSAqLwotCWNsayA9IGNsa2dlbl9wbGxfcmVnaXN0ZXIocGFyZW50X25hbWUsIGRhdGEsIHJlZywKLQkJCQkgIDAsIGNsa19uYW1lLCBkYXRhLT5sb2NrKTsKLQotCWlmICghSVNfRVJSKGNsaykpCi0JCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKLQotCXJldHVybjsKKwljbGtnZW5fYzMyX3BsbF9zZXR1cChucCwKKwkJCShzdHJ1Y3QgY2xrZ2VuX3BsbF9kYXRhICopICZzdF9wbGwzMjAwYzMyX2N4XzApOwogfQotQ0xLX09GX0RFQ0xBUkUoY2xrZ2VuZ3B1X2MzMl9wbGwsCi0JICAgICAgICJzdCxjbGtnZW5ncHUtcGxsLWMzMiIsIGNsa2dlbmdwdV9jMzJfcGxsX3NldHVwKTsKK0NMS19PRl9ERUNMQVJFKGMzMl9wbGwwLCAic3QsY2xrZ2VuLXBsbDAiLCBjbGtnZW5fYzMyX3BsbDBfc2V0dXApOworCitzdGF0aWMgdm9pZCBfX2luaXQgY2xrZ2VuX2MzMl9wbGwxX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJY2xrZ2VuX2MzMl9wbGxfc2V0dXAobnAsCisJCQkoc3RydWN0IGNsa2dlbl9wbGxfZGF0YSAqKSAmc3RfcGxsMzIwMGMzMl9jeF8xKTsKK30KK0NMS19PRl9ERUNMQVJFKGMzMl9wbGwxLCAic3QsY2xrZ2VuLXBsbDEiLCBjbGtnZW5fYzMyX3BsbDFfc2V0dXApOworCitzdGF0aWMgdm9pZCBfX2luaXQgY2xrZ2VuX2MzMl9wbGxhOV9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCWNsa2dlbl9jMzJfcGxsX3NldHVwKG5wLAorCQkJKHN0cnVjdCBjbGtnZW5fcGxsX2RhdGEgKikgJnN0X3BsbDMyMDBjMzJfNDA3X2E5KTsKK30KK0NMS19PRl9ERUNMQVJFKGMzMl9wbGxhOSwgInN0LHN0aWg0MDctY2xrZ2VuLXBsbGE5IiwgY2xrZ2VuX2MzMl9wbGxhOV9zZXR1cCk7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjbGtnZW5fYzI4X3BsbGE5X3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJY2xrZ2VuX2MzMl9wbGxfc2V0dXAobnAsCisJCQkoc3RydWN0IGNsa2dlbl9wbGxfZGF0YSAqKSAmc3RfcGxsNDYwMGMyOF80MThfYTkpOworfQorQ0xLX09GX0RFQ0xBUkUoYzI4X3BsbGE5LCAic3Qsc3RpaDQxOC1jbGtnZW4tcGxsYTkiLCBjbGtnZW5fYzI4X3BsbGE5X3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL0tjb25maWcgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9LY29uZmlnCmluZGV4IDJhZmNiZDMuLjI1NGQ5NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL0tjb25maWcKKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvS2NvbmZpZwpAQCAtMSw1ICsxLDYgQEAKIGNvbmZpZyBTVU5YSV9DQ1UKIAlib29sICJDbG9jayBzdXBwb3J0IGZvciBBbGx3aW5uZXIgU29DcyIKKwlkZXBlbmRzIG9uIEFSQ0hfU1VOWEkgfHwgQ09NUElMRV9URVNUCiAJZGVmYXVsdCBBUkNIX1NVTlhJCiAKIGlmIFNVTlhJX0NDVQpAQCAtMTksNiArMjAsMTAgQEAKIGNvbmZpZyBTVU5YSV9DQ1VfTVVYCiAJYm9vbAogCitjb25maWcgU1VOWElfQ0NVX01VTFQKKwlib29sCisJc2VsZWN0IFNVTlhJX0NDVV9NVVgKKwogY29uZmlnIFNVTlhJX0NDVV9QSEFTRQogCWJvb2wKIApAQCAtNTEsNiArNTYsNDAgQEAKIAogIyBTb0MgRHJpdmVycwogCitjb25maWcgU1VONklfQTMxX0NDVQorCWJvb2wgIlN1cHBvcnQgZm9yIHRoZSBBbGx3aW5uZXIgQTMxL0EzMXMgQ0NVIgorCXNlbGVjdCBTVU5YSV9DQ1VfRElWCisJc2VsZWN0IFNVTlhJX0NDVV9OSworCXNlbGVjdCBTVU5YSV9DQ1VfTktNCisJc2VsZWN0IFNVTlhJX0NDVV9OTQorCXNlbGVjdCBTVU5YSV9DQ1VfTVAKKwlzZWxlY3QgU1VOWElfQ0NVX1BIQVNFCisJZGVmYXVsdCBNQUNIX1NVTjZJCisKK2NvbmZpZyBTVU44SV9BMjNfQ0NVCisJYm9vbCAiU3VwcG9ydCBmb3IgdGhlIEFsbHdpbm5lciBBMjMgQ0NVIgorCXNlbGVjdCBTVU5YSV9DQ1VfRElWCisJc2VsZWN0IFNVTlhJX0NDVV9NVUxUCisJc2VsZWN0IFNVTlhJX0NDVV9OSworCXNlbGVjdCBTVU5YSV9DQ1VfTktNCisJc2VsZWN0IFNVTlhJX0NDVV9OS01QCisJc2VsZWN0IFNVTlhJX0NDVV9OTQorCXNlbGVjdCBTVU5YSV9DQ1VfTVAKKwlzZWxlY3QgU1VOWElfQ0NVX1BIQVNFCisJZGVmYXVsdCBNQUNIX1NVTjhJCisKK2NvbmZpZyBTVU44SV9BMzNfQ0NVCisJYm9vbCAiU3VwcG9ydCBmb3IgdGhlIEFsbHdpbm5lciBBMzMgQ0NVIgorCXNlbGVjdCBTVU5YSV9DQ1VfRElWCisJc2VsZWN0IFNVTlhJX0NDVV9NVUxUCisJc2VsZWN0IFNVTlhJX0NDVV9OSworCXNlbGVjdCBTVU5YSV9DQ1VfTktNCisJc2VsZWN0IFNVTlhJX0NDVV9OS01QCisJc2VsZWN0IFNVTlhJX0NDVV9OTQorCXNlbGVjdCBTVU5YSV9DQ1VfTVAKKwlzZWxlY3QgU1VOWElfQ0NVX1BIQVNFCisJZGVmYXVsdCBNQUNIX1NVTjhJCisKIGNvbmZpZyBTVU44SV9IM19DQ1UKIAlib29sICJTdXBwb3J0IGZvciB0aGUgQWxsd2lubmVyIEgzIENDVSIKIAlzZWxlY3QgU1VOWElfQ0NVX0RJVgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvTWFrZWZpbGUgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9NYWtlZmlsZQppbmRleCA2MzNjZTY0Li4xMDZjYmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9NYWtlZmlsZQpAQCAtNyw2ICs3LDcgQEAKIG9iai0kKENPTkZJR19TVU5YSV9DQ1VfRlJBQykJKz0gY2N1X2ZyYWMubwogb2JqLSQoQ09ORklHX1NVTlhJX0NDVV9HQVRFKQkrPSBjY3VfZ2F0ZS5vCiBvYmotJChDT05GSUdfU1VOWElfQ0NVX01VWCkJKz0gY2N1X211eC5vCitvYmotJChDT05GSUdfU1VOWElfQ0NVX01VTFQpCSs9IGNjdV9tdWx0Lm8KIG9iai0kKENPTkZJR19TVU5YSV9DQ1VfUEhBU0UpCSs9IGNjdV9waGFzZS5vCiAKICMgTXVsdGktZmFjdG9yIGNsb2NrcwpAQCAtMTcsNCArMTgsNyBAQAogb2JqLSQoQ09ORklHX1NVTlhJX0NDVV9NUCkJKz0gY2N1X21wLm8KIAogIyBTb0Mgc3VwcG9ydAorb2JqLSQoQ09ORklHX1NVTjZJX0EzMV9DQ1UpCSs9IGNjdS1zdW42aS1hMzEubworb2JqLSQoQ09ORklHX1NVTjhJX0EyM19DQ1UpCSs9IGNjdS1zdW44aS1hMjMubworb2JqLSQoQ09ORklHX1NVTjhJX0EzM19DQ1UpCSs9IGNjdS1zdW44aS1hMzMubwogb2JqLSQoQ09ORklHX1NVTjhJX0gzX0NDVSkJKz0gY2N1LXN1bjhpLWgzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW42aS1hMzEuYyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW42aS1hMzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTU5NjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjZpLWEzMS5jCkBAIC0wLDAgKzEsMTIzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDaGVuLVl1IFRzYWkKKyAqCisgKiBDaGVuLVl1IFRzYWkgPHdlbnNAY3NpZS5vcmc+CisgKgorICogQmFzZWQgb24gY2N1LXN1bjhpLWgzLmMgYnkgTWF4aW1lIFJpcGFyZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisKKyNpbmNsdWRlICJjY3VfY29tbW9uLmgiCisjaW5jbHVkZSAiY2N1X3Jlc2V0LmgiCisKKyNpbmNsdWRlICJjY3VfZGl2LmgiCisjaW5jbHVkZSAiY2N1X2dhdGUuaCIKKyNpbmNsdWRlICJjY3VfbXAuaCIKKyNpbmNsdWRlICJjY3VfbXVsdC5oIgorI2luY2x1ZGUgImNjdV9tdXguaCIKKyNpbmNsdWRlICJjY3VfbmsuaCIKKyNpbmNsdWRlICJjY3VfbmttLmgiCisjaW5jbHVkZSAiY2N1X25rbXAuaCIKKyNpbmNsdWRlICJjY3Vfbm0uaCIKKyNpbmNsdWRlICJjY3VfcGhhc2UuaCIKKworI2luY2x1ZGUgImNjdS1zdW42aS1hMzEuaCIKKworc3RhdGljIFNVTlhJX0NDVV9OS01fV0lUSF9HQVRFX0xPQ0socGxsX2NwdV9jbGssICJwbGwtY3B1IiwKKwkJCQkgICAgICJvc2MyNE0iLCAweDAwMCwKKwkJCQkgICAgIDgsIDUsCS8qIE4gKi8KKwkJCQkgICAgIDQsIDIsCS8qIEsgKi8KKwkJCQkgICAgIDAsIDIsCS8qIE0gKi8KKwkJCQkgICAgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgICAgIEJJVCgyOCksCS8qIGxvY2sgKi8KKwkJCQkgICAgIDApOworCisvKgorICogVGhlIEF1ZGlvIFBMTCBpcyBzdXBwb3NlZCB0byBoYXZlIDQgb3V0cHV0czogMyBmaXhlZCBmYWN0b3JzIGZyb20KKyAqIHRoZSBiYXNlICgyeCwgNHggYW5kIDh4KSwgYW5kIG9uZSB2YXJpYWJsZSBkaXZpZGVyICh0aGUgb25lIHRydWUKKyAqIHBsbCBhdWRpbykuCisgKgorICogV2UgZG9uJ3QgaGF2ZSBhbnkgbmVlZCBmb3IgdGhlIHZhcmlhYmxlIGRpdmlkZXIgZm9yIG5vdywgc28gd2UganVzdAorICogaGFyZGNvZGUgaXQgdG8gbWF0Y2ggd2l0aCB0aGUgY2xvY2sgbmFtZXMKKyAqLworI2RlZmluZSBTVU42SV9BMzFfUExMX0FVRElPX1JFRwkweDAwOAorCitzdGF0aWMgU1VOWElfQ0NVX05NX1dJVEhfR0FURV9MT0NLKHBsbF9hdWRpb19iYXNlX2NsaywgInBsbC1hdWRpby1iYXNlIiwKKwkJCQkgICAib3NjMjRNIiwgMHgwMDgsCisJCQkJICAgOCwgNywJLyogTiAqLworCQkJCSAgIDAsIDUsCS8qIE0gKi8KKwkJCQkgICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAgQklUKDI4KSwJLyogbG9jayAqLworCQkJCSAgIENMS19TRVRfUkFURV9VTkdBVEUpOworCitzdGF0aWMgU1VOWElfQ0NVX05NX1dJVEhfRlJBQ19HQVRFX0xPQ0socGxsX3ZpZGVvMF9jbGssICJwbGwtdmlkZW8wIiwKKwkJCQkJIm9zYzI0TSIsIDB4MDEwLAorCQkJCQk4LCA3LAkJLyogTiAqLworCQkJCQkwLCA0LAkJLyogTSAqLworCQkJCQlCSVQoMjQpLAkvKiBmcmFjIGVuYWJsZSAqLworCQkJCQlCSVQoMjUpLAkvKiBmcmFjIHNlbGVjdCAqLworCQkJCQkyNzAwMDAwMDAsCS8qIGZyYWMgcmF0ZSAwICovCisJCQkJCTI5NzAwMDAwMCwJLyogZnJhYyByYXRlIDEgKi8KKwkJCQkJQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCQlCSVQoMjgpLAkvKiBsb2NrICovCisJCQkJCUNMS19TRVRfUkFURV9VTkdBVEUpOworCitzdGF0aWMgU1VOWElfQ0NVX05NX1dJVEhfRlJBQ19HQVRFX0xPQ0socGxsX3ZlX2NsaywgInBsbC12ZSIsCisJCQkJCSJvc2MyNE0iLCAweDAxOCwKKwkJCQkJOCwgNywJCS8qIE4gKi8KKwkJCQkJMCwgNCwJCS8qIE0gKi8KKwkJCQkJQklUKDI0KSwJLyogZnJhYyBlbmFibGUgKi8KKwkJCQkJQklUKDI1KSwJLyogZnJhYyBzZWxlY3QgKi8KKwkJCQkJMjcwMDAwMDAwLAkvKiBmcmFjIHJhdGUgMCAqLworCQkJCQkyOTcwMDAwMDAsCS8qIGZyYWMgcmF0ZSAxICovCisJCQkJCUJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkJQklUKDI4KSwJLyogbG9jayAqLworCQkJCQlDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworc3RhdGljIFNVTlhJX0NDVV9OS01fV0lUSF9HQVRFX0xPQ0socGxsX2Rkcl9jbGssICJwbGwtZGRyIiwKKwkJCQkgICAgIm9zYzI0TSIsIDB4MDIwLAorCQkJCSAgICA4LCA1LAkvKiBOICovCisJCQkJICAgIDQsIDIsCS8qIEsgKi8KKwkJCQkgICAgMCwgMiwJLyogTSAqLworCQkJCSAgICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAgIEJJVCgyOCksCS8qIGxvY2sgKi8KKwkJCQkgICAgQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTktfV0lUSF9HQVRFX0xPQ0tfUE9TVERJVihwbGxfcGVyaXBoX2NsaywgInBsbC1wZXJpcGgiLAorCQkJCQkgICAib3NjMjRNIiwgMHgwMjgsCisJCQkJCSAgIDgsIDUsCS8qIE4gKi8KKwkJCQkJICAgNCwgMiwJLyogSyAqLworCQkJCQkgICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJCSAgIEJJVCgyOCksCS8qIGxvY2sgKi8KKwkJCQkJICAgMiwJCS8qIHBvc3QtZGl2ICovCisJCQkJCSAgIENMS19TRVRfUkFURV9VTkdBVEUpOworCitzdGF0aWMgU1VOWElfQ0NVX05NX1dJVEhfRlJBQ19HQVRFX0xPQ0socGxsX3ZpZGVvMV9jbGssICJwbGwtdmlkZW8xIiwKKwkJCQkJIm9zYzI0TSIsIDB4MDMwLAorCQkJCQk4LCA3LAkJLyogTiAqLworCQkJCQkwLCA0LAkJLyogTSAqLworCQkJCQlCSVQoMjQpLAkvKiBmcmFjIGVuYWJsZSAqLworCQkJCQlCSVQoMjUpLAkvKiBmcmFjIHNlbGVjdCAqLworCQkJCQkyNzAwMDAwMDAsCS8qIGZyYWMgcmF0ZSAwICovCisJCQkJCTI5NzAwMDAwMCwJLyogZnJhYyByYXRlIDEgKi8KKwkJCQkJQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCQlCSVQoMjgpLAkvKiBsb2NrICovCisJCQkJCUNMS19TRVRfUkFURV9VTkdBVEUpOworCitzdGF0aWMgU1VOWElfQ0NVX05NX1dJVEhfRlJBQ19HQVRFX0xPQ0socGxsX2dwdV9jbGssICJwbGwtZ3B1IiwKKwkJCQkJIm9zYzI0TSIsIDB4MDM4LAorCQkJCQk4LCA3LAkJLyogTiAqLworCQkJCQkwLCA0LAkJLyogTSAqLworCQkJCQlCSVQoMjQpLAkvKiBmcmFjIGVuYWJsZSAqLworCQkJCQlCSVQoMjUpLAkvKiBmcmFjIHNlbGVjdCAqLworCQkJCQkyNzAwMDAwMDAsCS8qIGZyYWMgcmF0ZSAwICovCisJCQkJCTI5NzAwMDAwMCwJLyogZnJhYyByYXRlIDEgKi8KKwkJCQkJQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCQlCSVQoMjgpLAkvKiBsb2NrICovCisJCQkJCUNMS19TRVRfUkFURV9VTkdBVEUpOworCisvKgorICogVGhlIE1JUEkgUExMIGhhcyAyIG1vZGVzOiAiTUlQSSIgYW5kICJIRE1JIi4KKyAqCisgKiBUaGUgTUlQSSBtb2RlIGlzIGEgc3RhbmRhcmQgTktNLXN0eWxlIGNsb2NrLiBUaGUgSERNSSBtb2RlIGlzIGFuCisgKiBpbnRlZ2VyIC8gZnJhY3Rpb25hbCBjbG9jayB3aXRoIHN3aXRjaGFibGUgbXVsdGlwbGllcnMgYW5kIGRpdmlkZXJzLgorICogVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGhlcmUuIFdlIGhhcmRjb2RlIHRoZSBQTEwgdG8gTUlQSSBtb2RlLgorICovCisjZGVmaW5lIFNVTjZJX0EzMV9QTExfTUlQSV9SRUcJMHgwNDAKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwbGxfbWlwaV9wYXJlbnRzW10gPSB7ICJwbGwtdmlkZW8wIiwgInBsbC12aWRlbzEiIH07CitzdGF0aWMgU1VOWElfQ0NVX05LTV9XSVRIX01VWF9HQVRFX0xPQ0socGxsX21pcGlfY2xrLCAicGxsLW1pcGkiLAorCQkJCQlwbGxfbWlwaV9wYXJlbnRzLCAweDA0MCwKKwkJCQkJOCwgNCwJLyogTiAqLworCQkJCQk0LCAyLAkvKiBLICovCisJCQkJCTAsIDQsCS8qIE0gKi8KKwkJCQkJMjEsIDAsCS8qIG11eCAqLworCQkJCQlCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJCUJJVCgyOCksCS8qIGxvY2sgKi8KKwkJCQkJQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTk1fV0lUSF9GUkFDX0dBVEVfTE9DSyhwbGw5X2NsaywgInBsbDkiLAorCQkJCQkib3NjMjRNIiwgMHgwNDQsCisJCQkJCTgsIDcsCQkvKiBOICovCisJCQkJCTAsIDQsCQkvKiBNICovCisJCQkJCUJJVCgyNCksCS8qIGZyYWMgZW5hYmxlICovCisJCQkJCUJJVCgyNSksCS8qIGZyYWMgc2VsZWN0ICovCisJCQkJCTI3MDAwMDAwMCwJLyogZnJhYyByYXRlIDAgKi8KKwkJCQkJMjk3MDAwMDAwLAkvKiBmcmFjIHJhdGUgMSAqLworCQkJCQlCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJCUJJVCgyOCksCS8qIGxvY2sgKi8KKwkJCQkJQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTk1fV0lUSF9GUkFDX0dBVEVfTE9DSyhwbGwxMF9jbGssICJwbGwxMCIsCisJCQkJCSJvc2MyNE0iLCAweDA0OCwKKwkJCQkJOCwgNywJCS8qIE4gKi8KKwkJCQkJMCwgNCwJCS8qIE0gKi8KKwkJCQkJQklUKDI0KSwJLyogZnJhYyBlbmFibGUgKi8KKwkJCQkJQklUKDI1KSwJLyogZnJhYyBzZWxlY3QgKi8KKwkJCQkJMjcwMDAwMDAwLAkvKiBmcmFjIHJhdGUgMCAqLworCQkJCQkyOTcwMDAwMDAsCS8qIGZyYWMgcmF0ZSAxICovCisJCQkJCUJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkJQklUKDI4KSwJLyogbG9jayAqLworCQkJCQlDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjcHV4X3BhcmVudHNbXSA9IHsgIm9zYzMyayIsICJvc2MyNE0iLAorCQkJCQkgICAgICJwbGwtY3B1IiwgInBsbC1jcHUiIH07CitzdGF0aWMgU1VOWElfQ0NVX01VWChjcHVfY2xrLCAiY3B1IiwgY3B1eF9wYXJlbnRzLAorCQkgICAgIDB4MDUwLCAxNiwgMiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCB8IENMS19JU19DUklUSUNBTCk7CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2Rpdl90YWJsZSBheGlfZGl2X3RhYmxlW10gPSB7CisJeyAudmFsID0gMCwgLmRpdiA9IDEgfSwKKwl7IC52YWwgPSAxLCAuZGl2ID0gMiB9LAorCXsgLnZhbCA9IDIsIC5kaXYgPSAzIH0sCisJeyAudmFsID0gMywgLmRpdiA9IDQgfSwKKwl7IC52YWwgPSA0LCAuZGl2ID0gNCB9LAorCXsgLnZhbCA9IDUsIC5kaXYgPSA0IH0sCisJeyAudmFsID0gNiwgLmRpdiA9IDQgfSwKKwl7IC52YWwgPSA3LCAuZGl2ID0gNCB9LAorCXsgLyogU2VudGluZWwgKi8gfSwKK307CisKK3N0YXRpYyBTVU5YSV9DQ1VfRElWX1RBQkxFKGF4aV9jbGssICJheGkiLCAiY3B1IiwKKwkJCSAgIDB4MDUwLCAwLCAzLCBheGlfZGl2X3RhYmxlLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhaGIxX3BhcmVudHNbXSA9IHsgIm9zYzMyayIsICJvc2MyNE0iLAorCQkJCQkgICAgICJheGkiLCAicGxsLXBlcmlwaCIgfTsKKworc3RhdGljIHN0cnVjdCBjY3VfZGl2IGFoYjFfY2xrID0geworCS5kaXYJCT0gX1NVTlhJX0NDVV9ESVZfRkxBR1MoNCwgMiwgQ0xLX0RJVklERVJfUE9XRVJfT0ZfVFdPKSwKKworCS5tdXgJCT0geworCQkuc2hpZnQJPSAxMiwKKwkJLndpZHRoCT0gMiwKKworCQkudmFyaWFibGVfcHJlZGl2CT0geworCQkJLmluZGV4CT0gMywKKwkJCS5zaGlmdAk9IDYsCisJCQkud2lkdGgJPSAyLAorCQl9LAorCX0sCisKKwkuY29tbW9uCQk9IHsKKwkJLnJlZwkJPSAweDA1NCwKKwkJLmZlYXR1cmVzCT0gQ0NVX0ZFQVRVUkVfVkFSSUFCTEVfUFJFRElWLAorCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFMoImFoYjEiLAorCQkJCQkJICAgICAgYWhiMV9wYXJlbnRzLAorCQkJCQkJICAgICAgJmNjdV9kaXZfb3BzLAorCQkJCQkJICAgICAgMCksCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2Rpdl90YWJsZSBhcGIxX2Rpdl90YWJsZVtdID0geworCXsgLnZhbCA9IDAsIC5kaXYgPSAyIH0sCisJeyAudmFsID0gMSwgLmRpdiA9IDIgfSwKKwl7IC52YWwgPSAyLCAuZGl2ID0gNCB9LAorCXsgLnZhbCA9IDMsIC5kaXYgPSA4IH0sCisJeyAvKiBTZW50aW5lbCAqLyB9LAorfTsKKworc3RhdGljIFNVTlhJX0NDVV9ESVZfVEFCTEUoYXBiMV9jbGssICJhcGIxIiwgImFoYjEiLAorCQkJICAgMHgwNTQsIDgsIDIsIGFwYjFfZGl2X3RhYmxlLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhcGIyX3BhcmVudHNbXSA9IHsgIm9zYzMyayIsICJvc2MyNE0iLAorCQkJCQkgICAgICJwbGwtcGVyaXBoIiwgInBsbC1wZXJpcGgiIH07CitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYKGFwYjJfY2xrLCAiYXBiMiIsIGFwYjJfcGFyZW50cywgMHgwNTgsCisJCQkgICAgIDAsIDUsCS8qIE0gKi8KKwkJCSAgICAgMTYsIDIsCS8qIFAgKi8KKwkJCSAgICAgMjQsIDIsCS8qIG11eCAqLworCQkJICAgICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfbWlwaWRzaV9jbGssCSJhaGIxLW1pcGlkc2kiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfc3NfY2xrLAkiYWhiMS1zcyIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCg1KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9kbWFfY2xrLAkiYWhiMS1kbWEiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoNiksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfbW1jMF9jbGssCSJhaGIxLW1tYzAiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoOCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfbW1jMV9jbGssCSJhaGIxLW1tYzEiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoOSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfbW1jMl9jbGssCSJhaGIxLW1tYzIiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMTApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX21tYzNfY2xrLAkiYWhiMS1tbWMzIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDEyKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9uYW5kMV9jbGssCSJhaGIxLW5hbmQxIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDEzKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9uYW5kMF9jbGssCSJhaGIxLW5hbmQwIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDEzKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9zZHJhbV9jbGssCSJhaGIxLXNkcmFtIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDE0KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9lbWFjX2NsaywJImFoYjEtZW1hYyIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgxNyksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfdHNfY2xrLAkiYWhiMS10cyIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgxOCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfaHN0aW1lcl9jbGssCSJhaGIxLWhzdGltZXIiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMTkpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX3NwaTBfY2xrLAkiYWhiMS1zcGkwIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDIwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9zcGkxX2NsaywJImFoYjEtc3BpMSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgyMSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfc3BpMl9jbGssCSJhaGIxLXNwaTIiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMjIpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX3NwaTNfY2xrLAkiYWhiMS1zcGkzIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDIzKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9vdGdfY2xrLAkiYWhiMS1vdGciLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMjQpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX2VoY2kwX2NsaywJImFoYjEtZWhjaTAiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMjYpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX2VoY2kxX2NsaywJImFoYjEtZWhjaTEiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMjcpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX29oY2kwX2NsaywJImFoYjEtb2hjaTAiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMjkpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX29oY2kxX2NsaywJImFoYjEtb2hjaTEiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMzApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX29oY2kyX2NsaywJImFoYjEtb2hjaTIiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfdmVfY2xrLAkiYWhiMS12ZSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9sY2QwX2NsaywJImFoYjEtbGNkMCIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCg0KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9sY2QxX2NsaywJImFoYjEtbGNkMSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCg1KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9jc2lfY2xrLAkiYWhiMS1jc2kiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoOCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfaGRtaV9jbGssCSJhaGIxLWhkbWkiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMTEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX2JlMF9jbGssCSJhaGIxLWJlMCIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgxMiksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfYmUxX2NsaywJImFoYjEtYmUxIiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDEzKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9mZTBfY2xrLAkiYWhiMS1mZTAiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMTQpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX2ZlMV9jbGssCSJhaGIxLWZlMSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgxNSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfbXBfY2xrLAkiYWhiMS1tcCIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgxOCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfZ3B1X2NsaywJImFoYjEtZ3B1IiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDIwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9kZXUwX2NsaywJImFoYjEtZGV1MCIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgyMyksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfZGV1MV9jbGssCSJhaGIxLWRldTEiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMjQpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX2RyYzBfY2xrLAkiYWhiMS1kcmMwIiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDI1KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9kcmMxX2NsaywJImFoYjEtZHJjMSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgyNiksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYXBiMV9jb2RlY19jbGssCSJhcGIxLWNvZGVjIiwJImFwYjEiLAorCQkgICAgICAweDA2OCwgQklUKDApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhcGIxX3NwZGlmX2NsaywJImFwYjEtc3BkaWYiLAkiYXBiMSIsCisJCSAgICAgIDB4MDY4LCBCSVQoMSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFwYjFfZGlnaXRhbF9taWNfY2xrLAkiYXBiMS1kaWdpdGFsLW1pYyIsCSJhcGIxIiwKKwkJICAgICAgMHgwNjgsIEJJVCg0KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYXBiMV9waW9fY2xrLAkiYXBiMS1waW8iLAkiYXBiMSIsCisJCSAgICAgIDB4MDY4LCBCSVQoNSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFwYjFfZGF1ZGlvMF9jbGssCSJhcGIxLWRhdWRpbzAiLAkiYXBiMSIsCisJCSAgICAgIDB4MDY4LCBCSVQoMTIpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhcGIxX2RhdWRpbzFfY2xrLAkiYXBiMS1kYXVkaW8xIiwJImFwYjEiLAorCQkgICAgICAweDA2OCwgQklUKDEzKSwgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhcGIyX2kyYzBfY2xrLAkiYXBiMi1pMmMwIiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhcGIyX2kyYzFfY2xrLAkiYXBiMi1pMmMxIiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhcGIyX2kyYzJfY2xrLAkiYXBiMi1pMmMyIiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDIpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhcGIyX2kyYzNfY2xrLAkiYXBiMi1pMmMzIiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDMpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhcGIyX3VhcnQwX2NsaywJImFwYjItdWFydDAiLAkiYXBiMiIsCisJCSAgICAgIDB4MDZjLCBCSVQoMTYpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhcGIyX3VhcnQxX2NsaywJImFwYjItdWFydDEiLAkiYXBiMiIsCisJCSAgICAgIDB4MDZjLCBCSVQoMTcpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhcGIyX3VhcnQyX2NsaywJImFwYjItdWFydDIiLAkiYXBiMiIsCisJCSAgICAgIDB4MDZjLCBCSVQoMTgpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhcGIyX3VhcnQzX2NsaywJImFwYjItdWFydDMiLAkiYXBiMiIsCisJCSAgICAgIDB4MDZjLCBCSVQoMTkpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhcGIyX3VhcnQ0X2NsaywJImFwYjItdWFydDQiLAkiYXBiMiIsCisJCSAgICAgIDB4MDZjLCBCSVQoMjApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhcGIyX3VhcnQ1X2NsaywJImFwYjItdWFydDUiLAkiYXBiMiIsCisJCSAgICAgIDB4MDZjLCBCSVQoMjEpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtb2QwX2RlZmF1bHRfcGFyZW50c1tdID0geyAib3NjMjRNIiwgInBsbC1wZXJpcGgiIH07CitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUobmFuZDBfY2xrLCAibmFuZDAiLCBtb2QwX2RlZmF1bHRfcGFyZW50cywKKwkJCQkgIDB4MDgwLAorCQkJCSAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKG5hbmQxX2NsaywgIm5hbmQxIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsCisJCQkJICAweDA4NCwKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShtbWMwX2NsaywgIm1tYzAiLCBtb2QwX2RlZmF1bHRfcGFyZW50cywKKwkJCQkgIDB4MDg4LAorCQkJCSAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9QSEFTRShtbWMwX3NhbXBsZV9jbGssICJtbWMwX3NhbXBsZSIsICJtbWMwIiwKKwkJICAgICAgIDB4MDg4LCAyMCwgMywgMCk7CitzdGF0aWMgU1VOWElfQ0NVX1BIQVNFKG1tYzBfb3V0cHV0X2NsaywgIm1tYzBfb3V0cHV0IiwgIm1tYzAiLAorCQkgICAgICAgMHgwODgsIDgsIDMsIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUobW1jMV9jbGssICJtbWMxIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsCisJCQkJICAweDA4YywKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfUEhBU0UobW1jMV9zYW1wbGVfY2xrLCAibW1jMV9zYW1wbGUiLCAibW1jMSIsCisJCSAgICAgICAweDA4YywgMjAsIDMsIDApOworc3RhdGljIFNVTlhJX0NDVV9QSEFTRShtbWMxX291dHB1dF9jbGssICJtbWMxX291dHB1dCIsICJtbWMxIiwKKwkJICAgICAgIDB4MDhjLCA4LCAzLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKG1tYzJfY2xrLCAibW1jMiIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLAorCQkJCSAgMHgwOTAsCisJCQkJICAwLCA0LAkJLyogTSAqLworCQkJCSAgMTYsIDIsCS8qIFAgKi8KKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KKwkJCQkgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgIDApOworCitzdGF0aWMgU1VOWElfQ0NVX1BIQVNFKG1tYzJfc2FtcGxlX2NsaywgIm1tYzJfc2FtcGxlIiwgIm1tYzIiLAorCQkgICAgICAgMHgwOTAsIDIwLCAzLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfUEhBU0UobW1jMl9vdXRwdXRfY2xrLCAibW1jMl9vdXRwdXQiLCAibW1jMiIsCisJCSAgICAgICAweDA5MCwgOCwgMywgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShtbWMzX2NsaywgIm1tYzMiLCBtb2QwX2RlZmF1bHRfcGFyZW50cywKKwkJCQkgIDB4MDk0LAorCQkJCSAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9QSEFTRShtbWMzX3NhbXBsZV9jbGssICJtbWMzX3NhbXBsZSIsICJtbWMzIiwKKwkJICAgICAgIDB4MDk0LCAyMCwgMywgMCk7CitzdGF0aWMgU1VOWElfQ0NVX1BIQVNFKG1tYzNfb3V0cHV0X2NsaywgIm1tYzNfb3V0cHV0IiwgIm1tYzMiLAorCQkgICAgICAgMHgwOTQsIDgsIDMsIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUodHNfY2xrLCAidHMiLCBtb2QwX2RlZmF1bHRfcGFyZW50cywgMHgwOTgsCisJCQkJICAwLCA0LAkJLyogTSAqLworCQkJCSAgMTYsIDIsCS8qIFAgKi8KKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KKwkJCQkgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUoc3NfY2xrLCAic3MiLCBtb2QwX2RlZmF1bHRfcGFyZW50cywgMHgwOWMsCisJCQkJICAwLCA0LAkJLyogTSAqLworCQkJCSAgMTYsIDIsCS8qIFAgKi8KKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KKwkJCQkgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUoc3BpMF9jbGssICJzcGkwIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsIDB4MGEwLAorCQkJCSAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKHNwaTFfY2xrLCAic3BpMSIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLCAweDBhNCwKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUoc3BpMl9jbGssICJzcGkyIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsIDB4MGE4LAorCQkJCSAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKHNwaTNfY2xrLCAic3BpMyIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLCAweDBhYywKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGF1ZGlvX3BhcmVudHNbXSA9IHsgInBsbC1hdWRpby04eCIsICJwbGwtYXVkaW8tNHgiLAorCQkJCQkgICAgICAgInBsbC1hdWRpby0yeCIsICJwbGwtYXVkaW8iIH07CitzdGF0aWMgU1VOWElfQ0NVX01VWF9XSVRIX0dBVEUoZGF1ZGlvMF9jbGssICJkYXVkaW8wIiwgZGF1ZGlvX3BhcmVudHMsCisJCQkgICAgICAgMHgwYjAsIDE2LCAyLCBCSVQoMzEpLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKK3N0YXRpYyBTVU5YSV9DQ1VfTVVYX1dJVEhfR0FURShkYXVkaW8xX2NsaywgImRhdWRpbzEiLCBkYXVkaW9fcGFyZW50cywKKwkJCSAgICAgICAweDBiNCwgMTYsIDIsIEJJVCgzMSksIENMS19TRVRfUkFURV9QQVJFTlQpOworCitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9HQVRFKHNwZGlmX2NsaywgInNwZGlmIiwgInBsbC1hdWRpbyIsCisJCQkgICAgIDB4MGMwLCAwLCA0LCBCSVQoMzEpLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKKworc3RhdGljIFNVTlhJX0NDVV9HQVRFKHVzYl9waHkwX2NsaywJInVzYi1waHkwIiwJIm9zYzI0TSIsCisJCSAgICAgIDB4MGNjLCBCSVQoOCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKHVzYl9waHkxX2NsaywJInVzYi1waHkxIiwJIm9zYzI0TSIsCisJCSAgICAgIDB4MGNjLCBCSVQoOSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKHVzYl9waHkyX2NsaywJInVzYi1waHkyIiwJIm9zYzI0TSIsCisJCSAgICAgIDB4MGNjLCBCSVQoMTApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURSh1c2Jfb2hjaTBfY2xrLAkidXNiLW9oY2kwIiwJIm9zYzI0TSIsCisJCSAgICAgIDB4MGNjLCBCSVQoMTYpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURSh1c2Jfb2hjaTFfY2xrLAkidXNiLW9oY2kxIiwJIm9zYzI0TSIsCisJCSAgICAgIDB4MGNjLCBCSVQoMTcpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURSh1c2Jfb2hjaTJfY2xrLAkidXNiLW9oY2kyIiwJIm9zYzI0TSIsCisJCSAgICAgIDB4MGNjLCBCSVQoMTgpLCAwKTsKKworLyogVE9ETyBlbWFjIGNsayBub3Qgc3VwcG9ydGVkIHlldCAqLworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRyYW1fcGFyZW50c1tdID0geyAicGxsLWRkciIsICJwbGwtcGVyaXBoIiB9Oworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKG1kZnNfY2xrLCAibWRmcyIsIGRyYW1fcGFyZW50cywgMHgwZjAsCisJCQkJICAwLCA0LAkJLyogTSAqLworCQkJCSAgMTYsIDIsCS8qIFAgKi8KKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KKwkJCQkgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgIENMS19JU19DUklUSUNBTCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWChzZHJhbTBfY2xrLCAic2RyYW0wIiwgZHJhbV9wYXJlbnRzLAorCQkJICAgIDB4MGY0LCAwLCA0LCA0LCAxLCBDTEtfSVNfQ1JJVElDQUwpOworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYKHNkcmFtMV9jbGssICJzZHJhbTEiLCBkcmFtX3BhcmVudHMsCisJCQkgICAgMHgwZjQsIDgsIDQsIDEyLCAxLCBDTEtfSVNfQ1JJVElDQUwpOworCitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV92ZV9jbGssCSJkcmFtLXZlIiwJIm1kZnMiLAorCQkgICAgICAweDEwMCwgQklUKDApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShkcmFtX2NzaV9pc3BfY2xrLAkiZHJhbS1jc2ktaXNwIiwJIm1kZnMiLAorCQkgICAgICAweDEwMCwgQklUKDEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShkcmFtX3RzX2NsaywJImRyYW0tdHMiLAkibWRmcyIsCisJCSAgICAgIDB4MTAwLCBCSVQoMyksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGRyYW1fZHJjMF9jbGssCSJkcmFtLWRyYzAiLAkibWRmcyIsCisJCSAgICAgIDB4MTAwLCBCSVQoMTYpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShkcmFtX2RyYzFfY2xrLAkiZHJhbS1kcmMxIiwJIm1kZnMiLAorCQkgICAgICAweDEwMCwgQklUKDE3KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV9kZXUwX2NsaywJImRyYW0tZGV1MCIsCSJtZGZzIiwKKwkJICAgICAgMHgxMDAsIEJJVCgxOCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGRyYW1fZGV1MV9jbGssCSJkcmFtLWRldTEiLAkibWRmcyIsCisJCSAgICAgIDB4MTAwLCBCSVQoMTkpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShkcmFtX2ZlMF9jbGssCSJkcmFtLWZlMCIsCSJtZGZzIiwKKwkJICAgICAgMHgxMDAsIEJJVCgyNCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGRyYW1fZmUxX2NsaywJImRyYW0tZmUxIiwJIm1kZnMiLAorCQkgICAgICAweDEwMCwgQklUKDI1KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV9iZTBfY2xrLAkiZHJhbS1iZTAiLAkibWRmcyIsCisJCSAgICAgIDB4MTAwLCBCSVQoMjYpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShkcmFtX2JlMV9jbGssCSJkcmFtLWJlMSIsCSJtZGZzIiwKKwkJICAgICAgMHgxMDAsIEJJVCgyNyksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGRyYW1fbXBfY2xrLAkiZHJhbS1tcCIsCSJtZGZzIiwKKwkJICAgICAgMHgxMDAsIEJJVCgyOCksIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRlX3BhcmVudHNbXSA9IHsgInBsbC12aWRlbzAiLCAicGxsLXZpZGVvMSIsCisJCQkJCSAgICJwbGwtcGVyaXBoLTJ4IiwgInBsbC1ncHUiLAorCQkJCQkgICAicGxsOSIsICJwbGwxMCIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKGJlMF9jbGssICJiZTAiLCBkZV9wYXJlbnRzLAorCQkJCSAweDEwNCwgMCwgNCwgMjQsIDMsIEJJVCgzMSksIDApOworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX0dBVEUoYmUxX2NsaywgImJlMSIsIGRlX3BhcmVudHMsCisJCQkJIDB4MTA4LCAwLCA0LCAyNCwgMywgQklUKDMxKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfR0FURShmZTBfY2xrLCAiZmUwIiwgZGVfcGFyZW50cywKKwkJCQkgMHgxMGMsIDAsIDQsIDI0LCAzLCBCSVQoMzEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKGZlMV9jbGssICJmZTEiLCBkZV9wYXJlbnRzLAorCQkJCSAweDExMCwgMCwgNCwgMjQsIDMsIEJJVCgzMSksIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1wX3BhcmVudHNbXSA9IHsgInBsbC12aWRlbzAiLCAicGxsLXZpZGVvMSIsCisJCQkJCSAgICJwbGw5IiwgInBsbDEwIiB9Oworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX0dBVEUobXBfY2xrLCAibXAiLCBtcF9wYXJlbnRzLAorCQkJCSAweDExNCwgMCwgNCwgMjQsIDMsIEJJVCgzMSksIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxjZF9jaDBfcGFyZW50c1tdID0geyAicGxsLXZpZGVvMCIsICJwbGwtdmlkZW8xIiwKKwkJCQkJCSJwbGwtdmlkZW8wLTJ4IiwKKwkJCQkJCSJwbGwtdmlkZW8xLTJ4IiwgInBsbC1taXBpIiB9Oworc3RhdGljIFNVTlhJX0NDVV9NVVhfV0lUSF9HQVRFKGxjZDBfY2gwX2NsaywgImxjZDAtY2gwIiwgbGNkX2NoMF9wYXJlbnRzLAorCQkJICAgICAgIDB4MTE4LCAyNCwgMiwgQklUKDMxKSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CitzdGF0aWMgU1VOWElfQ0NVX01VWF9XSVRIX0dBVEUobGNkMV9jaDBfY2xrLCAibGNkMS1jaDAiLCBsY2RfY2gwX3BhcmVudHMsCisJCQkgICAgICAgMHgxMWMsIDI0LCAyLCBCSVQoMzEpLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsY2RfY2gxX3BhcmVudHNbXSA9IHsgInBsbC12aWRlbzAiLCAicGxsLXZpZGVvMSIsCisJCQkJCQkicGxsLXZpZGVvMC0yeCIsCisJCQkJCQkicGxsLXZpZGVvMS0yeCIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKGxjZDBfY2gxX2NsaywgImxjZDAtY2gxIiwgbGNkX2NoMV9wYXJlbnRzLAorCQkJCSAweDEyYywgMCwgNCwgMjQsIDMsIEJJVCgzMSksCisJCQkJIENMS19TRVRfUkFURV9QQVJFTlQpOworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX0dBVEUobGNkMV9jaDFfY2xrLCAibGNkMS1jaDEiLCBsY2RfY2gxX3BhcmVudHMsCisJCQkJIDB4MTJjLCAwLCA0LCAyNCwgMywgQklUKDMxKSwKKwkJCQkgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3NpX3NjbGtfcGFyZW50c1tdID0geyAicGxsLXZpZGVvMCIsICJwbGwtdmlkZW8xIiwKKwkJCQkJCSAicGxsOSIsICJwbGwxMCIsICJwbGwtbWlwaSIsCisJCQkJCQkgInBsbC12ZSIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKGNzaTBfc2Nsa19jbGssICJjc2kwLXNjbGsiLCBjc2lfc2Nsa19wYXJlbnRzLAorCQkJCSAweDEzNCwgMTYsIDQsIDI0LCAzLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjc2lfbWNsa19wYXJlbnRzW10gPSB7ICJwbGwtdmlkZW8wIiwgInBsbC12aWRlbzEiLAorCQkJCQkJICJvc2MyNE0iIH07CitzdGF0aWMgY29uc3QgdTggY3NpX21jbGtfdGFibGVbXSA9IHsgMCwgMSwgNSB9Oworc3RhdGljIHN0cnVjdCBjY3VfZGl2IGNzaTBfbWNsa19jbGsgPSB7CisJLmVuYWJsZQkJPSBCSVQoMTUpLAorCS5kaXYJCT0gX1NVTlhJX0NDVV9ESVYoMCwgNCksCisJLm11eAkJPSBfU1VOWElfQ0NVX01VWF9UQUJMRSg4LCAzLCBjc2lfbWNsa190YWJsZSksCisJLmNvbW1vbgkJPSB7CisJCS5yZWcJCT0gMHgxMzQsCisJCS5ody5pbml0CT0gQ0xLX0hXX0lOSVRfUEFSRU5UUygiY3NpMC1tY2xrIiwKKwkJCQkJCSAgICAgIGNzaV9tY2xrX3BhcmVudHMsCisJCQkJCQkgICAgICAmY2N1X2Rpdl9vcHMsCisJCQkJCQkgICAgICAwKSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjY3VfZGl2IGNzaTFfbWNsa19jbGsgPSB7CisJLmVuYWJsZQkJPSBCSVQoMTUpLAorCS5kaXYJCT0gX1NVTlhJX0NDVV9ESVYoMCwgNCksCisJLm11eAkJPSBfU1VOWElfQ0NVX01VWF9UQUJMRSg4LCAzLCBjc2lfbWNsa190YWJsZSksCisJLmNvbW1vbgkJPSB7CisJCS5yZWcJCT0gMHgxMzgsCisJCS5ody5pbml0CT0gQ0xLX0hXX0lOSVRfUEFSRU5UUygiY3NpMS1tY2xrIiwKKwkJCQkJCSAgICAgIGNzaV9tY2xrX3BhcmVudHMsCisJCQkJCQkgICAgICAmY2N1X2Rpdl9vcHMsCisJCQkJCQkgICAgICAwKSwKKwl9LAorfTsKKworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfR0FURSh2ZV9jbGssICJ2ZSIsICJwbGwtdmUiLAorCQkJICAgICAweDEzYywgMTYsIDMsIEJJVCgzMSksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoY29kZWNfY2xrLAkiY29kZWMiLAkicGxsLWF1ZGlvIiwKKwkJICAgICAgMHgxNDAsIEJJVCgzMSksIENMS19TRVRfUkFURV9QQVJFTlQpOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGF2c19jbGssCQkiYXZzIiwJCSJvc2MyNE0iLAorCQkgICAgICAweDE0NCwgQklUKDMxKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZGlnaXRhbF9taWNfY2xrLAkiZGlnaXRhbC1taWMiLAkicGxsLWF1ZGlvIiwKKwkJICAgICAgMHgxNDgsIEJJVCgzMSksIENMS19TRVRfUkFURV9QQVJFTlQpOworCitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfR0FURShoZG1pX2NsaywgImhkbWkiLCBsY2RfY2gxX3BhcmVudHMsCisJCQkJIDB4MTUwLCAwLCA0LCAyNCwgMiwgQklUKDMxKSwKKwkJCQkgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShoZG1pX2RkY19jbGssICJoZG1pLWRkYyIsICJvc2MyNE0iLCAweDE1MCwgQklUKDMxKSwgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShwc19jbGssICJwcyIsICJsY2QxLWNoMSIsIDB4MTQwLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtYnVzX3BhcmVudHNbXSA9IHsgIm9zYzI0TSIsICJwbGwtcGVyaXBoIiwKKwkJCQkJICAgICAicGxsLWRkciIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShtYnVzMF9jbGssICJtYnVzMCIsIG1idXNfcGFyZW50cywgMHgxNWMsCisJCQkJICAwLCAzLAkJLyogTSAqLworCQkJCSAgMTYsIDIsCS8qIFAgKi8KKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KKwkJCQkgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgIENMS19JU19DUklUSUNBTCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShtYnVzMV9jbGssICJtYnVzMSIsIG1idXNfcGFyZW50cywgMHgxNjAsCisJCQkJICAwLCAzLAkJLyogTSAqLworCQkJCSAgMTYsIDIsCS8qIFAgKi8KKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KKwkJCQkgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgIENMS19JU19DUklUSUNBTCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKG1pcGlfZHNpX2NsaywgIm1pcGktZHNpIiwgbGNkX2NoMV9wYXJlbnRzLAorCQkJCSAweDE2OCwgMTYsIDMsIDI0LCAyLCBCSVQoMzEpLAorCQkJCSBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKG1pcGlfZHNpX2RwaHlfY2xrLCAibWlwaS1kc2ktZHBoeSIsCisJCQkJIGxjZF9jaDFfcGFyZW50cywgMHgxNjgsIDAsIDMsIDgsIDIsCisJCQkJIEJJVCgxNSksIENMS19TRVRfUkFURV9QQVJFTlQpOworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX0dBVEUobWlwaV9jc2lfZHBoeV9jbGssICJtaXBpLWNzaS1kcGh5IiwKKwkJCQkgbGNkX2NoMV9wYXJlbnRzLCAweDE2YywgMCwgMywgOCwgMiwKKwkJCQkgQklUKDE1KSwgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKGllcF9kcmMwX2NsaywgImllcC1kcmMwIiwgZGVfcGFyZW50cywKKwkJCQkgMHgxODAsIDAsIDMsIDI0LCAyLCBCSVQoMzEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKGllcF9kcmMxX2NsaywgImllcC1kcmMxIiwgZGVfcGFyZW50cywKKwkJCQkgMHgxODQsIDAsIDMsIDI0LCAyLCBCSVQoMzEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKGllcF9kZXUwX2NsaywgImllcC1kZXUwIiwgZGVfcGFyZW50cywKKwkJCQkgMHgxODgsIDAsIDMsIDI0LCAyLCBCSVQoMzEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKGllcF9kZXUxX2NsaywgImllcC1kZXUxIiwgZGVfcGFyZW50cywKKwkJCQkgMHgxOGMsIDAsIDMsIDI0LCAyLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBncHVfcGFyZW50c1tdID0geyAicGxsLWdwdSIsICJwbGwtcGVyaXBoLTJ4IiwKKwkJCQkJICAgICJwbGwtdmlkZW8wIiwgInBsbC12aWRlbzEiLAorCQkJCQkgICAgInBsbDkiLCAicGxsMTAiIH07CitzdGF0aWMgY29uc3Qgc3RydWN0IGNjdV9tdXhfZml4ZWRfcHJlZGl2IGdwdV9wcmVkaXZzW10gPSB7CisJeyAuaW5kZXggPSAxLCAuZGl2ID0gMywgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2N1X2RpdiBncHVfY29yZV9jbGsgPSB7CisJLmVuYWJsZQkJPSBCSVQoMzEpLAorCS5kaXYJCT0gX1NVTlhJX0NDVV9ESVYoMCwgMyksCisJLm11eAkJPSB7CisJCS5zaGlmdAkJPSAyNCwKKwkJLndpZHRoCQk9IDMsCisJCS5maXhlZF9wcmVkaXZzCT0gZ3B1X3ByZWRpdnMsCisJCS5uX3ByZWRpdnMJPSBBUlJBWV9TSVpFKGdwdV9wcmVkaXZzKSwKKwl9LAorCS5jb21tb24JCT0geworCQkucmVnCQk9IDB4MWEwLAorCQkuZmVhdHVyZXMJPSBDQ1VfRkVBVFVSRV9GSVhFRF9QUkVESVYsCisJCS5ody5pbml0CT0gQ0xLX0hXX0lOSVRfUEFSRU5UUygiZ3B1LWNvcmUiLAorCQkJCQkJICAgICAgZ3B1X3BhcmVudHMsCisJCQkJCQkgICAgICAmY2N1X2Rpdl9vcHMsCisJCQkJCQkgICAgICAwKSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjY3VfZGl2IGdwdV9tZW1vcnlfY2xrID0geworCS5lbmFibGUJCT0gQklUKDMxKSwKKwkuZGl2CQk9IF9TVU5YSV9DQ1VfRElWKDAsIDMpLAorCS5tdXgJCT0geworCQkuc2hpZnQJCT0gMjQsCisJCS53aWR0aAkJPSAzLAorCQkuZml4ZWRfcHJlZGl2cwk9IGdwdV9wcmVkaXZzLAorCQkubl9wcmVkaXZzCT0gQVJSQVlfU0laRShncHVfcHJlZGl2cyksCisJfSwKKwkuY29tbW9uCQk9IHsKKwkJLnJlZwkJPSAweDFhNCwKKwkJLmZlYXR1cmVzCT0gQ0NVX0ZFQVRVUkVfRklYRURfUFJFRElWLAorCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFMoImdwdS1tZW1vcnkiLAorCQkJCQkJICAgICAgZ3B1X3BhcmVudHMsCisJCQkJCQkgICAgICAmY2N1X2Rpdl9vcHMsCisJCQkJCQkgICAgICAwKSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjY3VfZGl2IGdwdV9oeWRfY2xrID0geworCS5lbmFibGUJCT0gQklUKDMxKSwKKwkuZGl2CQk9IF9TVU5YSV9DQ1VfRElWKDAsIDMpLAorCS5tdXgJCT0geworCQkuc2hpZnQJCT0gMjQsCisJCS53aWR0aAkJPSAzLAorCQkuZml4ZWRfcHJlZGl2cwk9IGdwdV9wcmVkaXZzLAorCQkubl9wcmVkaXZzCT0gQVJSQVlfU0laRShncHVfcHJlZGl2cyksCisJfSwKKwkuY29tbW9uCQk9IHsKKwkJLnJlZwkJPSAweDFhOCwKKwkJLmZlYXR1cmVzCT0gQ0NVX0ZFQVRVUkVfRklYRURfUFJFRElWLAorCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFMoImdwdS1oeWQiLAorCQkJCQkJICAgICAgZ3B1X3BhcmVudHMsCisJCQkJCQkgICAgICAmY2N1X2Rpdl9vcHMsCisJCQkJCQkgICAgICAwKSwKKwl9LAorfTsKKworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX0dBVEUoYXRzX2NsaywgImF0cyIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLCAweDFiMCwKKwkJCQkgMCwgMywJCS8qIE0gKi8KKwkJCQkgMjQsIDIsCQkvKiBtdXggKi8KKwkJCQkgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX0dBVEUodHJhY2VfY2xrLCAidHJhY2UiLCBtb2QwX2RlZmF1bHRfcGFyZW50cywKKwkJCQkgMHgxYjAsCisJCQkJIDAsIDMsCQkvKiBNICovCisJCQkJIDI0LCAyLAkJLyogbXV4ICovCisJCQkJIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2xrX291dF9wYXJlbnRzW10gPSB7ICJvc2MyNE0iLCAib3NjMzJrIiwgIm9zYzI0TSIsCisJCQkJCQkiYXhpIiwgImFoYjEiIH07CitzdGF0aWMgY29uc3QgdTggY2xrX291dF90YWJsZVtdID0geyAwLCAxLCAyLCAxMSwgMTMgfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjY3VfbXV4X2ZpeGVkX3ByZWRpdiBjbGtfb3V0X3ByZWRpdnNbXSA9IHsKKwl7IC5pbmRleCA9IDAsIC5kaXYgPSA3NTAsIH0sCisJeyAuaW5kZXggPSAzLCAuZGl2ID0gNCwgfSwKKwl7IC5pbmRleCA9IDQsIC5kaXYgPSA0LCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjY3VfbXAgb3V0X2FfY2xrID0geworCS5lbmFibGUJCT0gQklUKDMxKSwKKwkubQkJPSBfU1VOWElfQ0NVX0RJVig4LCA1KSwKKwkucAkJPSBfU1VOWElfQ0NVX0RJVigyMCwgMiksCisJLm11eAkJPSB7CisJCS5zaGlmdAkJPSAyNCwKKwkJLndpZHRoCQk9IDQsCisJCS50YWJsZQkJPSBjbGtfb3V0X3RhYmxlLAorCQkuZml4ZWRfcHJlZGl2cwk9IGNsa19vdXRfcHJlZGl2cywKKwkJLm5fcHJlZGl2cwk9IEFSUkFZX1NJWkUoY2xrX291dF9wcmVkaXZzKSwKKwl9LAorCS5jb21tb24JCT0geworCQkucmVnCQk9IDB4MzAwLAorCQkuZmVhdHVyZXMJPSBDQ1VfRkVBVFVSRV9GSVhFRF9QUkVESVYsCisJCS5ody5pbml0CT0gQ0xLX0hXX0lOSVRfUEFSRU5UUygib3V0LWEiLAorCQkJCQkJICAgICAgY2xrX291dF9wYXJlbnRzLAorCQkJCQkJICAgICAgJmNjdV9kaXZfb3BzLAorCQkJCQkJICAgICAgMCksCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2N1X21wIG91dF9iX2NsayA9IHsKKwkuZW5hYmxlCQk9IEJJVCgzMSksCisJLm0JCT0gX1NVTlhJX0NDVV9ESVYoOCwgNSksCisJLnAJCT0gX1NVTlhJX0NDVV9ESVYoMjAsIDIpLAorCS5tdXgJCT0geworCQkuc2hpZnQJCT0gMjQsCisJCS53aWR0aAkJPSA0LAorCQkudGFibGUJCT0gY2xrX291dF90YWJsZSwKKwkJLmZpeGVkX3ByZWRpdnMJPSBjbGtfb3V0X3ByZWRpdnMsCisJCS5uX3ByZWRpdnMJPSBBUlJBWV9TSVpFKGNsa19vdXRfcHJlZGl2cyksCisJfSwKKwkuY29tbW9uCQk9IHsKKwkJLnJlZwkJPSAweDMwNCwKKwkJLmZlYXR1cmVzCT0gQ0NVX0ZFQVRVUkVfRklYRURfUFJFRElWLAorCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFMoIm91dC1iIiwKKwkJCQkJCSAgICAgIGNsa19vdXRfcGFyZW50cywKKwkJCQkJCSAgICAgICZjY3VfZGl2X29wcywKKwkJCQkJCSAgICAgIDApLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNjdV9tcCBvdXRfY19jbGsgPSB7CisJLmVuYWJsZQkJPSBCSVQoMzEpLAorCS5tCQk9IF9TVU5YSV9DQ1VfRElWKDgsIDUpLAorCS5wCQk9IF9TVU5YSV9DQ1VfRElWKDIwLCAyKSwKKwkubXV4CQk9IHsKKwkJLnNoaWZ0CQk9IDI0LAorCQkud2lkdGgJCT0gNCwKKwkJLnRhYmxlCQk9IGNsa19vdXRfdGFibGUsCisJCS5maXhlZF9wcmVkaXZzCT0gY2xrX291dF9wcmVkaXZzLAorCQkubl9wcmVkaXZzCT0gQVJSQVlfU0laRShjbGtfb3V0X3ByZWRpdnMpLAorCX0sCisJLmNvbW1vbgkJPSB7CisJCS5yZWcJCT0gMHgzMDgsCisJCS5mZWF0dXJlcwk9IENDVV9GRUFUVVJFX0ZJWEVEX1BSRURJViwKKwkJLmh3LmluaXQJPSBDTEtfSFdfSU5JVF9QQVJFTlRTKCJvdXQtYyIsCisJCQkJCQkgICAgICBjbGtfb3V0X3BhcmVudHMsCisJCQkJCQkgICAgICAmY2N1X2Rpdl9vcHMsCisJCQkJCQkgICAgICAwKSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjY3VfY29tbW9uICpzdW42aV9hMzFfY2N1X2Nsa3NbXSA9IHsKKwkmcGxsX2NwdV9jbGsuY29tbW9uLAorCSZwbGxfYXVkaW9fYmFzZV9jbGsuY29tbW9uLAorCSZwbGxfdmlkZW8wX2Nsay5jb21tb24sCisJJnBsbF92ZV9jbGsuY29tbW9uLAorCSZwbGxfZGRyX2Nsay5jb21tb24sCisJJnBsbF9wZXJpcGhfY2xrLmNvbW1vbiwKKwkmcGxsX3ZpZGVvMV9jbGsuY29tbW9uLAorCSZwbGxfZ3B1X2Nsay5jb21tb24sCisJJnBsbF9taXBpX2Nsay5jb21tb24sCisJJnBsbDlfY2xrLmNvbW1vbiwKKwkmcGxsMTBfY2xrLmNvbW1vbiwKKwkmY3B1X2Nsay5jb21tb24sCisJJmF4aV9jbGsuY29tbW9uLAorCSZhaGIxX2Nsay5jb21tb24sCisJJmFwYjFfY2xrLmNvbW1vbiwKKwkmYXBiMl9jbGsuY29tbW9uLAorCSZhaGIxX21pcGlkc2lfY2xrLmNvbW1vbiwKKwkmYWhiMV9zc19jbGsuY29tbW9uLAorCSZhaGIxX2RtYV9jbGsuY29tbW9uLAorCSZhaGIxX21tYzBfY2xrLmNvbW1vbiwKKwkmYWhiMV9tbWMxX2Nsay5jb21tb24sCisJJmFoYjFfbW1jMl9jbGsuY29tbW9uLAorCSZhaGIxX21tYzNfY2xrLmNvbW1vbiwKKwkmYWhiMV9uYW5kMV9jbGsuY29tbW9uLAorCSZhaGIxX25hbmQwX2Nsay5jb21tb24sCisJJmFoYjFfc2RyYW1fY2xrLmNvbW1vbiwKKwkmYWhiMV9lbWFjX2Nsay5jb21tb24sCisJJmFoYjFfdHNfY2xrLmNvbW1vbiwKKwkmYWhiMV9oc3RpbWVyX2Nsay5jb21tb24sCisJJmFoYjFfc3BpMF9jbGsuY29tbW9uLAorCSZhaGIxX3NwaTFfY2xrLmNvbW1vbiwKKwkmYWhiMV9zcGkyX2Nsay5jb21tb24sCisJJmFoYjFfc3BpM19jbGsuY29tbW9uLAorCSZhaGIxX290Z19jbGsuY29tbW9uLAorCSZhaGIxX2VoY2kwX2Nsay5jb21tb24sCisJJmFoYjFfZWhjaTFfY2xrLmNvbW1vbiwKKwkmYWhiMV9vaGNpMF9jbGsuY29tbW9uLAorCSZhaGIxX29oY2kxX2Nsay5jb21tb24sCisJJmFoYjFfb2hjaTJfY2xrLmNvbW1vbiwKKwkmYWhiMV92ZV9jbGsuY29tbW9uLAorCSZhaGIxX2xjZDBfY2xrLmNvbW1vbiwKKwkmYWhiMV9sY2QxX2Nsay5jb21tb24sCisJJmFoYjFfY3NpX2Nsay5jb21tb24sCisJJmFoYjFfaGRtaV9jbGsuY29tbW9uLAorCSZhaGIxX2JlMF9jbGsuY29tbW9uLAorCSZhaGIxX2JlMV9jbGsuY29tbW9uLAorCSZhaGIxX2ZlMF9jbGsuY29tbW9uLAorCSZhaGIxX2ZlMV9jbGsuY29tbW9uLAorCSZhaGIxX21wX2Nsay5jb21tb24sCisJJmFoYjFfZ3B1X2Nsay5jb21tb24sCisJJmFoYjFfZGV1MF9jbGsuY29tbW9uLAorCSZhaGIxX2RldTFfY2xrLmNvbW1vbiwKKwkmYWhiMV9kcmMwX2Nsay5jb21tb24sCisJJmFoYjFfZHJjMV9jbGsuY29tbW9uLAorCSZhcGIxX2NvZGVjX2Nsay5jb21tb24sCisJJmFwYjFfc3BkaWZfY2xrLmNvbW1vbiwKKwkmYXBiMV9kaWdpdGFsX21pY19jbGsuY29tbW9uLAorCSZhcGIxX3Bpb19jbGsuY29tbW9uLAorCSZhcGIxX2RhdWRpbzBfY2xrLmNvbW1vbiwKKwkmYXBiMV9kYXVkaW8xX2Nsay5jb21tb24sCisJJmFwYjJfaTJjMF9jbGsuY29tbW9uLAorCSZhcGIyX2kyYzFfY2xrLmNvbW1vbiwKKwkmYXBiMl9pMmMyX2Nsay5jb21tb24sCisJJmFwYjJfaTJjM19jbGsuY29tbW9uLAorCSZhcGIyX3VhcnQwX2Nsay5jb21tb24sCisJJmFwYjJfdWFydDFfY2xrLmNvbW1vbiwKKwkmYXBiMl91YXJ0Ml9jbGsuY29tbW9uLAorCSZhcGIyX3VhcnQzX2Nsay5jb21tb24sCisJJmFwYjJfdWFydDRfY2xrLmNvbW1vbiwKKwkmYXBiMl91YXJ0NV9jbGsuY29tbW9uLAorCSZuYW5kMF9jbGsuY29tbW9uLAorCSZuYW5kMV9jbGsuY29tbW9uLAorCSZtbWMwX2Nsay5jb21tb24sCisJJm1tYzBfc2FtcGxlX2Nsay5jb21tb24sCisJJm1tYzBfb3V0cHV0X2Nsay5jb21tb24sCisJJm1tYzFfY2xrLmNvbW1vbiwKKwkmbW1jMV9zYW1wbGVfY2xrLmNvbW1vbiwKKwkmbW1jMV9vdXRwdXRfY2xrLmNvbW1vbiwKKwkmbW1jMl9jbGsuY29tbW9uLAorCSZtbWMyX3NhbXBsZV9jbGsuY29tbW9uLAorCSZtbWMyX291dHB1dF9jbGsuY29tbW9uLAorCSZtbWMzX2Nsay5jb21tb24sCisJJm1tYzNfc2FtcGxlX2Nsay5jb21tb24sCisJJm1tYzNfb3V0cHV0X2Nsay5jb21tb24sCisJJnRzX2Nsay5jb21tb24sCisJJnNzX2Nsay5jb21tb24sCisJJnNwaTBfY2xrLmNvbW1vbiwKKwkmc3BpMV9jbGsuY29tbW9uLAorCSZzcGkyX2Nsay5jb21tb24sCisJJnNwaTNfY2xrLmNvbW1vbiwKKwkmZGF1ZGlvMF9jbGsuY29tbW9uLAorCSZkYXVkaW8xX2Nsay5jb21tb24sCisJJnNwZGlmX2Nsay5jb21tb24sCisJJnVzYl9waHkwX2Nsay5jb21tb24sCisJJnVzYl9waHkxX2Nsay5jb21tb24sCisJJnVzYl9waHkyX2Nsay5jb21tb24sCisJJnVzYl9vaGNpMF9jbGsuY29tbW9uLAorCSZ1c2Jfb2hjaTFfY2xrLmNvbW1vbiwKKwkmdXNiX29oY2kyX2Nsay5jb21tb24sCisJJm1kZnNfY2xrLmNvbW1vbiwKKwkmc2RyYW0wX2Nsay5jb21tb24sCisJJnNkcmFtMV9jbGsuY29tbW9uLAorCSZkcmFtX3ZlX2Nsay5jb21tb24sCisJJmRyYW1fY3NpX2lzcF9jbGsuY29tbW9uLAorCSZkcmFtX3RzX2Nsay5jb21tb24sCisJJmRyYW1fZHJjMF9jbGsuY29tbW9uLAorCSZkcmFtX2RyYzFfY2xrLmNvbW1vbiwKKwkmZHJhbV9kZXUwX2Nsay5jb21tb24sCisJJmRyYW1fZGV1MV9jbGsuY29tbW9uLAorCSZkcmFtX2ZlMF9jbGsuY29tbW9uLAorCSZkcmFtX2ZlMV9jbGsuY29tbW9uLAorCSZkcmFtX2JlMF9jbGsuY29tbW9uLAorCSZkcmFtX2JlMV9jbGsuY29tbW9uLAorCSZkcmFtX21wX2Nsay5jb21tb24sCisJJmJlMF9jbGsuY29tbW9uLAorCSZiZTFfY2xrLmNvbW1vbiwKKwkmZmUwX2Nsay5jb21tb24sCisJJmZlMV9jbGsuY29tbW9uLAorCSZtcF9jbGsuY29tbW9uLAorCSZsY2QwX2NoMF9jbGsuY29tbW9uLAorCSZsY2QxX2NoMF9jbGsuY29tbW9uLAorCSZsY2QwX2NoMV9jbGsuY29tbW9uLAorCSZsY2QxX2NoMV9jbGsuY29tbW9uLAorCSZjc2kwX3NjbGtfY2xrLmNvbW1vbiwKKwkmY3NpMF9tY2xrX2Nsay5jb21tb24sCisJJmNzaTFfbWNsa19jbGsuY29tbW9uLAorCSZ2ZV9jbGsuY29tbW9uLAorCSZjb2RlY19jbGsuY29tbW9uLAorCSZhdnNfY2xrLmNvbW1vbiwKKwkmZGlnaXRhbF9taWNfY2xrLmNvbW1vbiwKKwkmaGRtaV9jbGsuY29tbW9uLAorCSZoZG1pX2RkY19jbGsuY29tbW9uLAorCSZwc19jbGsuY29tbW9uLAorCSZtYnVzMF9jbGsuY29tbW9uLAorCSZtYnVzMV9jbGsuY29tbW9uLAorCSZtaXBpX2RzaV9jbGsuY29tbW9uLAorCSZtaXBpX2RzaV9kcGh5X2Nsay5jb21tb24sCisJJm1pcGlfY3NpX2RwaHlfY2xrLmNvbW1vbiwKKwkmaWVwX2RyYzBfY2xrLmNvbW1vbiwKKwkmaWVwX2RyYzFfY2xrLmNvbW1vbiwKKwkmaWVwX2RldTBfY2xrLmNvbW1vbiwKKwkmaWVwX2RldTFfY2xrLmNvbW1vbiwKKwkmZ3B1X2NvcmVfY2xrLmNvbW1vbiwKKwkmZ3B1X21lbW9yeV9jbGsuY29tbW9uLAorCSZncHVfaHlkX2Nsay5jb21tb24sCisJJmF0c19jbGsuY29tbW9uLAorCSZ0cmFjZV9jbGsuY29tbW9uLAorCSZvdXRfYV9jbGsuY29tbW9uLAorCSZvdXRfYl9jbGsuY29tbW9uLAorCSZvdXRfY19jbGsuY29tbW9uLAorfTsKKworLyogV2UgaGFyZGNvZGUgdGhlIGRpdmlkZXIgdG8gNCBmb3Igbm93ICovCitzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUihwbGxfYXVkaW9fY2xrLCAicGxsLWF1ZGlvIiwKKwkJCSJwbGwtYXVkaW8tYmFzZSIsIDQsIDEsIENMS19TRVRfUkFURV9QQVJFTlQpOworc3RhdGljIENMS19GSVhFRF9GQUNUT1IocGxsX2F1ZGlvXzJ4X2NsaywgInBsbC1hdWRpby0yeCIsCisJCQkicGxsLWF1ZGlvLWJhc2UiLCAyLCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SKHBsbF9hdWRpb180eF9jbGssICJwbGwtYXVkaW8tNHgiLAorCQkJInBsbC1hdWRpby1iYXNlIiwgMSwgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CitzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUihwbGxfYXVkaW9fOHhfY2xrLCAicGxsLWF1ZGlvLTh4IiwKKwkJCSJwbGwtYXVkaW8tYmFzZSIsIDEsIDIsIENMS19TRVRfUkFURV9QQVJFTlQpOworc3RhdGljIENMS19GSVhFRF9GQUNUT1IocGxsX3BlcmlwaF8yeF9jbGssICJwbGwtcGVyaXBoLTJ4IiwKKwkJCSJwbGwtcGVyaXBoIiwgMSwgMiwgMCk7CitzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUihwbGxfdmlkZW8wXzJ4X2NsaywgInBsbC12aWRlbzAtMngiLAorCQkJInBsbC12aWRlbzAiLCAxLCAyLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SKHBsbF92aWRlbzFfMnhfY2xrLCAicGxsLXZpZGVvMS0yeCIsCisJCQkicGxsLXZpZGVvMSIsIDEsIDIsIENMS19TRVRfUkFURV9QQVJFTlQpOworCitzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgc3VuNmlfYTMxX2h3X2Nsa3MgPSB7CisJLmh3cwk9IHsKKwkJW0NMS19QTExfQ1BVXQkJPSAmcGxsX2NwdV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9BVURJT19CQVNFXQk9ICZwbGxfYXVkaW9fYmFzZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9BVURJT10JCT0gJnBsbF9hdWRpb19jbGsuaHcsCisJCVtDTEtfUExMX0FVRElPXzJYXQk9ICZwbGxfYXVkaW9fMnhfY2xrLmh3LAorCQlbQ0xLX1BMTF9BVURJT180WF0JPSAmcGxsX2F1ZGlvXzR4X2Nsay5odywKKwkJW0NMS19QTExfQVVESU9fOFhdCT0gJnBsbF9hdWRpb184eF9jbGsuaHcsCisJCVtDTEtfUExMX1ZJREVPMF0JPSAmcGxsX3ZpZGVvMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9WSURFTzBfMlhdCT0gJnBsbF92aWRlbzBfMnhfY2xrLmh3LAorCQlbQ0xLX1BMTF9WRV0JCT0gJnBsbF92ZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9ERFJdCQk9ICZwbGxfZGRyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMX1BFUklQSF0JPSAmcGxsX3BlcmlwaF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9QRVJJUEhfMlhdCT0gJnBsbF9wZXJpcGhfMnhfY2xrLmh3LAorCQlbQ0xLX1BMTF9WSURFTzFdCT0gJnBsbF92aWRlbzFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfVklERU8xXzJYXQk9ICZwbGxfdmlkZW8xXzJ4X2Nsay5odywKKwkJW0NMS19QTExfR1BVXQkJPSAmcGxsX2dwdV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9NSVBJXQkJPSAmcGxsX21pcGlfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTEw5XQkJPSAmcGxsOV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTDEwXQkJPSAmcGxsMTBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19DUFVdCQk9ICZjcHVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BWEldCQk9ICZheGlfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxXQkJPSAmYWhiMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FQQjFdCQk9ICZhcGIxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVBCMl0JCT0gJmFwYjJfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX01JUElEU0ldCT0gJmFoYjFfbWlwaWRzaV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfU1NdCQk9ICZhaGIxX3NzX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9ETUFdCQk9ICZhaGIxX2RtYV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfTU1DMF0JCT0gJmFoYjFfbW1jMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfTU1DMV0JCT0gJmFoYjFfbW1jMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfTU1DMl0JCT0gJmFoYjFfbW1jMl9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfTU1DM10JCT0gJmFoYjFfbW1jM19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfTkFORDFdCT0gJmFoYjFfbmFuZDFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX05BTkQwXQk9ICZhaGIxX25hbmQwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9TRFJBTV0JPSAmYWhiMV9zZHJhbV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfRU1BQ10JCT0gJmFoYjFfZW1hY19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfVFNdCQk9ICZhaGIxX3RzX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9IU1RJTUVSXQk9ICZhaGIxX2hzdGltZXJfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX1NQSTBdCQk9ICZhaGIxX3NwaTBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX1NQSTFdCQk9ICZhaGIxX3NwaTFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX1NQSTJdCQk9ICZhaGIxX3NwaTJfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX1NQSTNdCQk9ICZhaGIxX3NwaTNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX09UR10JCT0gJmFoYjFfb3RnX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9FSENJMF0JPSAmYWhiMV9laGNpMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfRUhDSTFdCT0gJmFoYjFfZWhjaTFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX09IQ0kwXQk9ICZhaGIxX29oY2kwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9PSENJMV0JPSAmYWhiMV9vaGNpMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfT0hDSTJdCT0gJmFoYjFfb2hjaTJfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX1ZFXQkJPSAmYWhiMV92ZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfTENEMF0JCT0gJmFoYjFfbGNkMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfTENEMV0JCT0gJmFoYjFfbGNkMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfQ1NJXQkJPSAmYWhiMV9jc2lfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX0hETUldCQk9ICZhaGIxX2hkbWlfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX0JFMF0JCT0gJmFoYjFfYmUwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9CRTFdCQk9ICZhaGIxX2JlMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfRkUwXQkJPSAmYWhiMV9mZTBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX0ZFMV0JCT0gJmFoYjFfZmUxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9NUF0JCT0gJmFoYjFfbXBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX0dQVV0JCT0gJmFoYjFfZ3B1X2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9ERVUwXQkJPSAmYWhiMV9kZXUwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9ERVUxXQkJPSAmYWhiMV9kZXUxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9EUkMwXQkJPSAmYWhiMV9kcmMwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9EUkMxXQkJPSAmYWhiMV9kcmMxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVBCMV9DT0RFQ10JPSAmYXBiMV9jb2RlY19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FQQjFfU1BESUZdCT0gJmFwYjFfc3BkaWZfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BUEIxX0RJR0lUQUxfTUlDXQk9ICZhcGIxX2RpZ2l0YWxfbWljX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVBCMV9QSU9dCQk9ICZhcGIxX3Bpb19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FQQjFfREFVRElPMF0JPSAmYXBiMV9kYXVkaW8wX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVBCMV9EQVVESU8xXQk9ICZhcGIxX2RhdWRpbzFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BUEIyX0kyQzBdCQk9ICZhcGIyX2kyYzBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BUEIyX0kyQzFdCQk9ICZhcGIyX2kyYzFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BUEIyX0kyQzJdCQk9ICZhcGIyX2kyYzJfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BUEIyX0kyQzNdCQk9ICZhcGIyX2kyYzNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BUEIyX1VBUlQwXQk9ICZhcGIyX3VhcnQwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVBCMl9VQVJUMV0JPSAmYXBiMl91YXJ0MV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FQQjJfVUFSVDJdCT0gJmFwYjJfdWFydDJfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BUEIyX1VBUlQzXQk9ICZhcGIyX3VhcnQzX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVBCMl9VQVJUNF0JPSAmYXBiMl91YXJ0NF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FQQjJfVUFSVDVdCT0gJmFwYjJfdWFydDVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19OQU5EMF0JCT0gJm5hbmQwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTkFORDFdCQk9ICZuYW5kMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzBdCQk9ICZtbWMwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMF9TQU1QTEVdCT0gJm1tYzBfc2FtcGxlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMF9PVVRQVVRdCT0gJm1tYzBfb3V0cHV0X2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMV0JCT0gJm1tYzFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMxX1NBTVBMRV0JPSAmbW1jMV9zYW1wbGVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMxX09VVFBVVF0JPSAmbW1jMV9vdXRwdXRfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMyXQkJPSAmbW1jMl9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzJfU0FNUExFXQk9ICZtbWMyX3NhbXBsZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzJfT1VUUFVUXQk9ICZtbWMyX291dHB1dF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzNdCQk9ICZtbWMzX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DM19TQU1QTEVdCT0gJm1tYzNfc2FtcGxlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DM19PVVRQVVRdCT0gJm1tYzNfb3V0cHV0X2Nsay5jb21tb24uaHcsCisJCVtDTEtfVFNdCQk9ICZ0c19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1NTXQkJPSAmc3NfY2xrLmNvbW1vbi5odywKKwkJW0NMS19TUEkwXQkJPSAmc3BpMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1NQSTFdCQk9ICZzcGkxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfU1BJMl0JCT0gJnNwaTJfY2xrLmNvbW1vbi5odywKKwkJW0NMS19TUEkzXQkJPSAmc3BpM19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RBVURJTzBdCQk9ICZkYXVkaW8wX2Nsay5jb21tb24uaHcsCisJCVtDTEtfREFVRElPMV0JCT0gJmRhdWRpbzFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19TUERJRl0JCT0gJnNwZGlmX2Nsay5jb21tb24uaHcsCisJCVtDTEtfVVNCX1BIWTBdCQk9ICZ1c2JfcGh5MF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1VTQl9QSFkxXQkJPSAmdXNiX3BoeTFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19VU0JfUEhZMl0JCT0gJnVzYl9waHkyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfVVNCX09IQ0kwXQkJPSAmdXNiX29oY2kwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfVVNCX09IQ0kxXQkJPSAmdXNiX29oY2kxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfVVNCX09IQ0kyXQkJPSAmdXNiX29oY2kyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTURGU10JCT0gJm1kZnNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19TRFJBTTBdCQk9ICZzZHJhbTBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19TRFJBTTFdCQk9ICZzZHJhbTFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EUkFNX1ZFXQkJPSAmZHJhbV92ZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RSQU1fQ1NJX0lTUF0JPSAmZHJhbV9jc2lfaXNwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJBTV9UU10JCT0gJmRyYW1fdHNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EUkFNX0RSQzBdCQk9ICZkcmFtX2RyYzBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EUkFNX0RSQzFdCQk9ICZkcmFtX2RyYzFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EUkFNX0RFVTBdCQk9ICZkcmFtX2RldTBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EUkFNX0RFVTFdCQk9ICZkcmFtX2RldTFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EUkFNX0ZFMF0JCT0gJmRyYW1fZmUwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJBTV9GRTFdCQk9ICZkcmFtX2ZlMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RSQU1fQkUwXQkJPSAmZHJhbV9iZTBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EUkFNX0JFMV0JCT0gJmRyYW1fYmUxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJBTV9NUF0JCT0gJmRyYW1fbXBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CRTBdCQk9ICZiZTBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CRTFdCQk9ICZiZTFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19GRTBdCQk9ICZmZTBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19GRTFdCQk9ICZmZTFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NUF0JCT0gJm1wX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTENEMF9DSDBdCQk9ICZsY2QwX2NoMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0xDRDFfQ0gwXQkJPSAmbGNkMV9jaDBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19MQ0QwX0NIMV0JCT0gJmxjZDBfY2gxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTENEMV9DSDFdCQk9ICZsY2QxX2NoMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0NTSTBfU0NMS10JCT0gJmNzaTBfc2Nsa19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0NTSTBfTUNMS10JCT0gJmNzaTBfbWNsa19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0NTSTFfTUNMS10JCT0gJmNzaTFfbWNsa19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1ZFXQkJPSAmdmVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19DT0RFQ10JCT0gJmNvZGVjX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVZTXQkJPSAmYXZzX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRElHSVRBTF9NSUNdCT0gJmRpZ2l0YWxfbWljX2Nsay5jb21tb24uaHcsCisJCVtDTEtfSERNSV0JCT0gJmhkbWlfY2xrLmNvbW1vbi5odywKKwkJW0NMS19IRE1JX0REQ10JCT0gJmhkbWlfZGRjX2Nsay5jb21tb24uaHcsCisJCVtDTEtfUFNdCQk9ICZwc19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01CVVMwXQkJPSAmbWJ1czBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NQlVTMV0JCT0gJm1idXMxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTUlQSV9EU0ldCQk9ICZtaXBpX2RzaV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01JUElfRFNJX0RQSFldCT0gJm1pcGlfZHNpX2RwaHlfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NSVBJX0NTSV9EUEhZXQk9ICZtaXBpX2NzaV9kcGh5X2Nsay5jb21tb24uaHcsCisJCVtDTEtfSUVQX0RSQzBdCQk9ICZpZXBfZHJjMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0lFUF9EUkMxXQkJPSAmaWVwX2RyYzFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19JRVBfREVVMF0JCT0gJmllcF9kZXUwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfSUVQX0RFVTFdCQk9ICZpZXBfZGV1MV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0dQVV9DT1JFXQkJPSAmZ3B1X2NvcmVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19HUFVfTUVNT1JZXQk9ICZncHVfbWVtb3J5X2Nsay5jb21tb24uaHcsCisJCVtDTEtfR1BVX0hZRF0JCT0gJmdwdV9oeWRfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BVFNdCQk9ICZhdHNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19UUkFDRV0JCT0gJnRyYWNlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfT1VUX0FdCQk9ICZvdXRfYV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX09VVF9CXQkJPSAmb3V0X2JfY2xrLmNvbW1vbi5odywKKwkJW0NMS19PVVRfQ10JCT0gJm91dF9jX2Nsay5jb21tb24uaHcsCisJfSwKKwkubnVtCT0gQ0xLX05VTUJFUiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2N1X3Jlc2V0X21hcCBzdW42aV9hMzFfY2N1X3Jlc2V0c1tdID0geworCVtSU1RfVVNCX1BIWTBdCQk9IHsgMHgwY2MsIEJJVCgwKSB9LAorCVtSU1RfVVNCX1BIWTFdCQk9IHsgMHgwY2MsIEJJVCgxKSB9LAorCVtSU1RfVVNCX1BIWTJdCQk9IHsgMHgwY2MsIEJJVCgyKSB9LAorCisJW1JTVF9BSEIxX01JUElfRFNJXQk9IHsgMHgyYzAsIEJJVCgxKSB9LAorCVtSU1RfQUhCMV9TU10JCT0geyAweDJjMCwgQklUKDUpIH0sCisJW1JTVF9BSEIxX0RNQV0JCT0geyAweDJjMCwgQklUKDYpIH0sCisJW1JTVF9BSEIxX01NQzBdCQk9IHsgMHgyYzAsIEJJVCg4KSB9LAorCVtSU1RfQUhCMV9NTUMxXQkJPSB7IDB4MmMwLCBCSVQoOSkgfSwKKwlbUlNUX0FIQjFfTU1DMl0JCT0geyAweDJjMCwgQklUKDEwKSB9LAorCVtSU1RfQUhCMV9NTUMzXQkJPSB7IDB4MmMwLCBCSVQoMTEpIH0sCisJW1JTVF9BSEIxX05BTkQxXQk9IHsgMHgyYzAsIEJJVCgxMikgfSwKKwlbUlNUX0FIQjFfTkFORDBdCT0geyAweDJjMCwgQklUKDEzKSB9LAorCVtSU1RfQUhCMV9TRFJBTV0JPSB7IDB4MmMwLCBCSVQoMTQpIH0sCisJW1JTVF9BSEIxX0VNQUNdCQk9IHsgMHgyYzAsIEJJVCgxNykgfSwKKwlbUlNUX0FIQjFfVFNdCQk9IHsgMHgyYzAsIEJJVCgxOCkgfSwKKwlbUlNUX0FIQjFfSFNUSU1FUl0JPSB7IDB4MmMwLCBCSVQoMTkpIH0sCisJW1JTVF9BSEIxX1NQSTBdCQk9IHsgMHgyYzAsIEJJVCgyMCkgfSwKKwlbUlNUX0FIQjFfU1BJMV0JCT0geyAweDJjMCwgQklUKDIxKSB9LAorCVtSU1RfQUhCMV9TUEkyXQkJPSB7IDB4MmMwLCBCSVQoMjIpIH0sCisJW1JTVF9BSEIxX1NQSTNdCQk9IHsgMHgyYzAsIEJJVCgyMykgfSwKKwlbUlNUX0FIQjFfT1RHXQkJPSB7IDB4MmMwLCBCSVQoMjQpIH0sCisJW1JTVF9BSEIxX0VIQ0kwXQk9IHsgMHgyYzAsIEJJVCgyNikgfSwKKwlbUlNUX0FIQjFfRUhDSTFdCT0geyAweDJjMCwgQklUKDI3KSB9LAorCVtSU1RfQUhCMV9PSENJMF0JPSB7IDB4MmMwLCBCSVQoMjkpIH0sCisJW1JTVF9BSEIxX09IQ0kxXQk9IHsgMHgyYzAsIEJJVCgzMCkgfSwKKwlbUlNUX0FIQjFfT0hDSTJdCT0geyAweDJjMCwgQklUKDMxKSB9LAorCisJW1JTVF9BSEIxX1ZFXQkJPSB7IDB4MmM0LCBCSVQoMCkgfSwKKwlbUlNUX0FIQjFfTENEMF0JCT0geyAweDJjNCwgQklUKDQpIH0sCisJW1JTVF9BSEIxX0xDRDFdCQk9IHsgMHgyYzQsIEJJVCg1KSB9LAorCVtSU1RfQUhCMV9DU0ldCQk9IHsgMHgyYzQsIEJJVCg4KSB9LAorCVtSU1RfQUhCMV9IRE1JXQkJPSB7IDB4MmM0LCBCSVQoMTEpIH0sCisJW1JTVF9BSEIxX0JFMF0JCT0geyAweDJjNCwgQklUKDEyKSB9LAorCVtSU1RfQUhCMV9CRTFdCQk9IHsgMHgyYzQsIEJJVCgxMykgfSwKKwlbUlNUX0FIQjFfRkUwXQkJPSB7IDB4MmM0LCBCSVQoMTQpIH0sCisJW1JTVF9BSEIxX0ZFMV0JCT0geyAweDJjNCwgQklUKDE1KSB9LAorCVtSU1RfQUhCMV9NUF0JCT0geyAweDJjNCwgQklUKDE4KSB9LAorCVtSU1RfQUhCMV9HUFVdCQk9IHsgMHgyYzQsIEJJVCgyMCkgfSwKKwlbUlNUX0FIQjFfREVVMF0JCT0geyAweDJjNCwgQklUKDIzKSB9LAorCVtSU1RfQUhCMV9ERVUxXQkJPSB7IDB4MmM0LCBCSVQoMjQpIH0sCisJW1JTVF9BSEIxX0RSQzBdCQk9IHsgMHgyYzQsIEJJVCgyNSkgfSwKKwlbUlNUX0FIQjFfRFJDMV0JCT0geyAweDJjNCwgQklUKDI2KSB9LAorCVtSU1RfQUhCMV9MVkRTXQkJPSB7IDB4MmM4LCBCSVQoMCkgfSwKKworCVtSU1RfQVBCMV9DT0RFQ10JPSB7IDB4MmQwLCBCSVQoMCkgfSwKKwlbUlNUX0FQQjFfU1BESUZdCT0geyAweDJkMCwgQklUKDEpIH0sCisJW1JTVF9BUEIxX0RJR0lUQUxfTUlDXQk9IHsgMHgyZDAsIEJJVCg0KSB9LAorCVtSU1RfQVBCMV9EQVVESU8wXQk9IHsgMHgyZDAsIEJJVCgxMikgfSwKKwlbUlNUX0FQQjFfREFVRElPMV0JPSB7IDB4MmQwLCBCSVQoMTMpIH0sCisKKwlbUlNUX0FQQjJfSTJDMF0JCT0geyAweDJkOCwgQklUKDApIH0sCisJW1JTVF9BUEIyX0kyQzFdCQk9IHsgMHgyZDgsIEJJVCgxKSB9LAorCVtSU1RfQVBCMl9JMkMyXQkJPSB7IDB4MmQ4LCBCSVQoMikgfSwKKwlbUlNUX0FQQjJfSTJDM10JCT0geyAweDJkOCwgQklUKDMpIH0sCisJW1JTVF9BUEIyX1VBUlQwXQk9IHsgMHgyZDgsIEJJVCgxNikgfSwKKwlbUlNUX0FQQjJfVUFSVDFdCT0geyAweDJkOCwgQklUKDE3KSB9LAorCVtSU1RfQVBCMl9VQVJUMl0JPSB7IDB4MmQ4LCBCSVQoMTgpIH0sCisJW1JTVF9BUEIyX1VBUlQzXQk9IHsgMHgyZDgsIEJJVCgxOSkgfSwKKwlbUlNUX0FQQjJfVUFSVDRdCT0geyAweDJkOCwgQklUKDIwKSB9LAorCVtSU1RfQVBCMl9VQVJUNV0JPSB7IDB4MmQ4LCBCSVQoMjEpIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN1bnhpX2NjdV9kZXNjIHN1bjZpX2EzMV9jY3VfZGVzYyA9IHsKKwkuY2N1X2Nsa3MJPSBzdW42aV9hMzFfY2N1X2Nsa3MsCisJLm51bV9jY3VfY2xrcwk9IEFSUkFZX1NJWkUoc3VuNmlfYTMxX2NjdV9jbGtzKSwKKworCS5od19jbGtzCT0gJnN1bjZpX2EzMV9od19jbGtzLAorCisJLnJlc2V0cwkJPSBzdW42aV9hMzFfY2N1X3Jlc2V0cywKKwkubnVtX3Jlc2V0cwk9IEFSUkFZX1NJWkUoc3VuNmlfYTMxX2NjdV9yZXNldHMpLAorfTsKKworc3RhdGljIHN0cnVjdCBjY3VfbXV4X25iIHN1bjZpX2EzMV9jcHVfbmIgPSB7CisJLmNvbW1vbgkJPSAmY3B1X2Nsay5jb21tb24sCisJLmNtCQk9ICZjcHVfY2xrLm11eCwKKwkuZGVsYXlfdXMJPSAxLCAvKiA+IDggY2xvY2sgY3ljbGVzIGF0IDI0IE1IeiAqLworCS5ieXBhc3NfaW5kZXgJPSAxLCAvKiBpbmRleCBvZiAyNCBNSHogb3NjaWxsYXRvciAqLworfTsKKworc3RhdGljIHZvaWQgX19pbml0IHN1bjZpX2EzMV9jY3Vfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXZvaWQgX19pb21lbSAqcmVnOworCXUzMiB2YWw7CisKKwlyZWcgPSBvZl9pb19yZXF1ZXN0X2FuZF9tYXAobm9kZSwgMCwgb2Zfbm9kZV9mdWxsX25hbWUobm9kZSkpOworCWlmIChJU19FUlIocmVnKSkgeworCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgbWFwIHRoZSBjbG9jayByZWdpc3RlcnNcbiIsCisJCSAgICAgICBvZl9ub2RlX2Z1bGxfbmFtZShub2RlKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBGb3JjZSB0aGUgUExMLUF1ZGlvLTF4IGRpdmlkZXIgdG8gNCAqLworCXZhbCA9IHJlYWRsKHJlZyArIFNVTjZJX0EzMV9QTExfQVVESU9fUkVHKTsKKwl2YWwgJj0gfkdFTk1BU0soMTksIDE2KTsKKwl3cml0ZWwodmFsIHwgKDMgPDwgMTYpLCByZWcgKyBTVU42SV9BMzFfUExMX0FVRElPX1JFRyk7CisKKwkvKiBGb3JjZSBQTEwtTUlQSSB0byBNSVBJIG1vZGUgKi8KKwl2YWwgPSByZWFkbChyZWcgKyBTVU42SV9BMzFfUExMX01JUElfUkVHKTsKKwl2YWwgJj0gQklUKDE2KTsKKwl3cml0ZWwodmFsLCByZWcgKyBTVU42SV9BMzFfUExMX01JUElfUkVHKTsKKworCXN1bnhpX2NjdV9wcm9iZShub2RlLCByZWcsICZzdW42aV9hMzFfY2N1X2Rlc2MpOworCisJY2N1X211eF9ub3RpZmllcl9yZWdpc3RlcihwbGxfY3B1X2Nsay5jb21tb24uaHcuY2xrLAorCQkJCSAgJnN1bjZpX2EzMV9jcHVfbmIpOworfQorQ0xLX09GX0RFQ0xBUkUoc3VuNmlfYTMxX2NjdSwgImFsbHdpbm5lcixzdW42aS1hMzEtY2N1IiwKKwkgICAgICAgc3VuNmlfYTMxX2NjdV9zZXR1cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuNmktYTMxLmggYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuNmktYTMxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0MzQwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW42aS1hMzEuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgQ2hlbi1ZdSBUc2FpCisgKgorICogQ2hlbi1ZdSBUc2FpIDx3ZW5zQGNzaWUub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9DQ1VfU1VONklfQTMxX0hfCisjZGVmaW5lIF9DQ1VfU1VONklfQTMxX0hfCisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9zdW42aS1hMzEtY2N1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvcmVzZXQvc3VuNmktYTMxLWNjdS5oPgorCisjZGVmaW5lIENMS19QTExfQ1BVCQkwCisjZGVmaW5lIENMS19QTExfQVVESU9fQkFTRQkxCisjZGVmaW5lIENMS19QTExfQVVESU8JCTIKKyNkZWZpbmUgQ0xLX1BMTF9BVURJT18yWAkzCisjZGVmaW5lIENMS19QTExfQVVESU9fNFgJNAorI2RlZmluZSBDTEtfUExMX0FVRElPXzhYCTUKKyNkZWZpbmUgQ0xLX1BMTF9WSURFTzAJCTYKKyNkZWZpbmUgQ0xLX1BMTF9WSURFTzBfMlgJNworI2RlZmluZSBDTEtfUExMX1ZFCQk4CisjZGVmaW5lIENMS19QTExfRERSCQk5CisKKy8qIFRoZSBQTExfUEVSSVBIIGNsb2NrIGlzIGV4cG9ydGVkICovCisKKyNkZWZpbmUgQ0xLX1BMTF9QRVJJUEhfMlgJMTEKKyNkZWZpbmUgQ0xLX1BMTF9WSURFTzEJCTEyCisjZGVmaW5lIENMS19QTExfVklERU8xXzJYCTEzCisjZGVmaW5lIENMS19QTExfR1BVCQkxNAorI2RlZmluZSBDTEtfUExMX01JUEkJCTE1CisjZGVmaW5lIENMS19QTEw5CQkxNgorI2RlZmluZSBDTEtfUExMMTAJCTE3CisKKy8qIFRoZSBDUFVYIGNsb2NrIGlzIGV4cG9ydGVkICovCisKKyNkZWZpbmUgQ0xLX0FYSQkJCTE5CisjZGVmaW5lIENMS19BSEIxCQkyMAorI2RlZmluZSBDTEtfQVBCMQkJMjEKKyNkZWZpbmUgQ0xLX0FQQjIJCTIyCisKKy8qIEFsbCB0aGUgYnVzIGdhdGVzIGFyZSBleHBvcnRlZCAqLworCisvKiBUaGUgZmlyc3QgYnVuY2ggb2YgbW9kdWxlIGNsb2NrcyBhcmUgZXhwb3J0ZWQgKi8KKworLyogRU1BQyBjbG9jayBpcyBub3QgaW1wbGVtZW50ZWQgKi8KKworI2RlZmluZSBDTEtfTURGUwkJMTA3CisjZGVmaW5lIENMS19TRFJBTTAJCTEwOAorI2RlZmluZSBDTEtfU0RSQU0xCQkxMDkKKworLyogQWxsIHRoZSBEUkFNIGdhdGVzIGFyZSBleHBvcnRlZCAqLworCisvKiBTb21lIG1vcmUgbW9kdWxlIGNsb2NrcyBhcmUgZXhwb3J0ZWQgKi8KKworI2RlZmluZSBDTEtfTUJVUzAJCTE0MQorI2RlZmluZSBDTEtfTUJVUzEJCTE0MgorCisvKiBTb21lIG1vcmUgbW9kdWxlIGNsb2NrcyBhbmQgZXh0ZXJuYWwgY2xvY2sgb3V0cHV0cyBhcmUgZXhwb3J0ZWQgKi8KKworI2RlZmluZSBDTEtfTlVNQkVSCQkoQ0xLX09VVF9DICsgMSkKKworI2VuZGlmIC8qIF9DQ1VfU1VONklfQTMxX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktYTIzLWEzMy5oIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLWEyMy1hMzMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmMwZjhkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLWEyMy1hMzMuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgTWF4aW1lIFJpcGFyZAorICoKKyAqIE1heGltZSBSaXBhcmQgPG1heGltZS5yaXBhcmRAZnJlZS1lbGVjdHJvbnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9DQ1VfU1VOOElfQTIzX0EzM19IXworI2RlZmluZSBfQ0NVX1NVTjhJX0EyM19BMzNfSF8KKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3N1bjhpLWEyMy1hMzMtY2N1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvcmVzZXQvc3VuOGktYTIzLWEzMy1jY3UuaD4KKworI2RlZmluZSBDTEtfUExMX0NQVVgJCTAKKyNkZWZpbmUgQ0xLX1BMTF9BVURJT19CQVNFCTEKKyNkZWZpbmUgQ0xLX1BMTF9BVURJTwkJMgorI2RlZmluZSBDTEtfUExMX0FVRElPXzJYCTMKKyNkZWZpbmUgQ0xLX1BMTF9BVURJT180WAk0CisjZGVmaW5lIENMS19QTExfQVVESU9fOFgJNQorI2RlZmluZSBDTEtfUExMX1ZJREVPCQk2CisjZGVmaW5lIENMS19QTExfVklERU9fMlgJNworI2RlZmluZSBDTEtfUExMX1ZFCQk4CisjZGVmaW5lIENMS19QTExfRERSMAkJOQorI2RlZmluZSBDTEtfUExMX1BFUklQSAkJMTAKKyNkZWZpbmUgQ0xLX1BMTF9QRVJJUEhfMlgJMTEKKyNkZWZpbmUgQ0xLX1BMTF9HUFUJCTEyCisjZGVmaW5lIENMS19QTExfTUlQSQkJMTMKKyNkZWZpbmUgQ0xLX1BMTF9IU0lDCQkxNAorI2RlZmluZSBDTEtfUExMX0RFCQkxNQorI2RlZmluZSBDTEtfUExMX0REUjEJCTE2CisjZGVmaW5lIENMS19QTExfRERSCQkxNworCisvKiBUaGUgQ1BVWCBjbG9jayBpcyBleHBvcnRlZCAqLworCisjZGVmaW5lIENMS19BWEkJCQkxOQorI2RlZmluZSBDTEtfQUhCMQkJMjAKKyNkZWZpbmUgQ0xLX0FQQjEJCTIxCisjZGVmaW5lIENMS19BUEIyCQkyMgorCisvKiBBbGwgdGhlIGJ1cyBnYXRlcyBhcmUgZXhwb3J0ZWQgKi8KKworLyogVGhlIGZpcnN0IHBhcnQgb2YgdGhlIG1vZCBjbG9ja3MgaXMgZXhwb3J0ZWQgKi8KKworI2RlZmluZSBDTEtfRFJBTQkJNzkKKworLyogU29tZSBtb3JlIG1vZHVsZSBjbG9ja3MgYXJlIGV4cG9ydGVkICovCisKKyNkZWZpbmUgQ0xLX01CVVMJCTk1CisKKy8qIEFuZCB0aGUgbGFzdCBtb2R1bGUgY2xvY2tzIGFyZSBleHBvcnRlZCAqLworCisjZGVmaW5lIENMS19OVU1CRVIJCShDTEtfQVRTICsgMSkKKworI2VuZGlmIC8qIF9DQ1VfU1VOOElfQTIzX0EzM19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLWEyMy5jIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLWEyMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDZkOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktYTIzLmMKQEAgLTAsMCArMSw3MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTWF4aW1lIFJpcGFyZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisKKyNpbmNsdWRlICJjY3VfY29tbW9uLmgiCisjaW5jbHVkZSAiY2N1X3Jlc2V0LmgiCisKKyNpbmNsdWRlICJjY3VfZGl2LmgiCisjaW5jbHVkZSAiY2N1X2dhdGUuaCIKKyNpbmNsdWRlICJjY3VfbXAuaCIKKyNpbmNsdWRlICJjY3VfbXVsdC5oIgorI2luY2x1ZGUgImNjdV9uay5oIgorI2luY2x1ZGUgImNjdV9ua20uaCIKKyNpbmNsdWRlICJjY3VfbmttcC5oIgorI2luY2x1ZGUgImNjdV9ubS5oIgorI2luY2x1ZGUgImNjdV9waGFzZS5oIgorCisjaW5jbHVkZSAiY2N1LXN1bjhpLWEyMy1hMzMuaCIKKworCitzdGF0aWMgc3RydWN0IGNjdV9ua21wIHBsbF9jcHV4X2NsayA9IHsKKwkuZW5hYmxlID0gQklUKDMxKSwKKwkubG9jawk9IEJJVCgyOCksCisKKwkubgk9IF9TVU5YSV9DQ1VfTVVMVCg4LCA1KSwKKwkuawk9IF9TVU5YSV9DQ1VfTVVMVCg0LCAyKSwKKwkubQk9IF9TVU5YSV9DQ1VfRElWKDAsIDIpLAorCS5wCT0gX1NVTlhJX0NDVV9ESVZfTUFYKDE2LCAyLCA0KSwKKworCS5jb21tb24JPSB7CisJCS5yZWcJCT0gMHgwMDAsCisJCS5ody5pbml0CT0gQ0xLX0hXX0lOSVQoInBsbC1jcHV4IiwgIm9zYzI0TSIsCisJCQkJCSAgICAgICZjY3VfbmttcF9vcHMsCisJCQkJCSAgICAgIDApLAorCX0sCit9OworCisvKgorICogVGhlIEF1ZGlvIFBMTCBpcyBzdXBwb3NlZCB0byBoYXZlIDQgb3V0cHV0czogMyBmaXhlZCBmYWN0b3JzIGZyb20KKyAqIHRoZSBiYXNlICgyeCwgNHggYW5kIDh4KSwgYW5kIG9uZSB2YXJpYWJsZSBkaXZpZGVyICh0aGUgb25lIHRydWUKKyAqIHBsbCBhdWRpbykuCisgKgorICogV2UgZG9uJ3QgaGF2ZSBhbnkgbmVlZCBmb3IgdGhlIHZhcmlhYmxlIGRpdmlkZXIgZm9yIG5vdywgc28gd2UganVzdAorICogaGFyZGNvZGUgaXQgdG8gbWF0Y2ggd2l0aCB0aGUgY2xvY2sgbmFtZXMKKyAqLworI2RlZmluZSBTVU44SV9BMjNfUExMX0FVRElPX1JFRwkweDAwOAorCitzdGF0aWMgU1VOWElfQ0NVX05NX1dJVEhfR0FURV9MT0NLKHBsbF9hdWRpb19iYXNlX2NsaywgInBsbC1hdWRpby1iYXNlIiwKKwkJCQkgICAib3NjMjRNIiwgMHgwMDgsCisJCQkJICAgOCwgNywJCS8qIE4gKi8KKwkJCQkgICAwLCA1LAkJLyogTSAqLworCQkJCSAgIEJJVCgzMSksCQkvKiBnYXRlICovCisJCQkJICAgQklUKDI4KSwJCS8qIGxvY2sgKi8KKwkJCQkgICBDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworc3RhdGljIFNVTlhJX0NDVV9OTV9XSVRIX0ZSQUNfR0FURV9MT0NLKHBsbF92aWRlb19jbGssICJwbGwtdmlkZW8iLAorCQkJCQkib3NjMjRNIiwgMHgwMTAsCisJCQkJCTgsIDcsCQkvKiBOICovCisJCQkJCTAsIDQsCQkvKiBNICovCisJCQkJCUJJVCgyNCksCS8qIGZyYWMgZW5hYmxlICovCisJCQkJCUJJVCgyNSksCS8qIGZyYWMgc2VsZWN0ICovCisJCQkJCTI3MDAwMDAwMCwJLyogZnJhYyByYXRlIDAgKi8KKwkJCQkJMjk3MDAwMDAwLAkvKiBmcmFjIHJhdGUgMSAqLworCQkJCQlCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJCUJJVCgyOCksCS8qIGxvY2sgKi8KKwkJCQkJQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTk1fV0lUSF9GUkFDX0dBVEVfTE9DSyhwbGxfdmVfY2xrLCAicGxsLXZlIiwKKwkJCQkJIm9zYzI0TSIsIDB4MDE4LAorCQkJCQk4LCA3LAkJLyogTiAqLworCQkJCQkwLCA0LAkJLyogTSAqLworCQkJCQlCSVQoMjQpLAkvKiBmcmFjIGVuYWJsZSAqLworCQkJCQlCSVQoMjUpLAkvKiBmcmFjIHNlbGVjdCAqLworCQkJCQkyNzAwMDAwMDAsCS8qIGZyYWMgcmF0ZSAwICovCisJCQkJCTI5NzAwMDAwMCwJLyogZnJhYyByYXRlIDEgKi8KKwkJCQkJQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCQlCSVQoMjgpLAkvKiBsb2NrICovCisJCQkJCUNMS19TRVRfUkFURV9VTkdBVEUpOworCitzdGF0aWMgU1VOWElfQ0NVX05LTV9XSVRIX0dBVEVfTE9DSyhwbGxfZGRyX2NsaywgInBsbC1kZHIiLAorCQkJCSAgICAib3NjMjRNIiwgMHgwMjAsCisJCQkJICAgIDgsIDUsCQkvKiBOICovCisJCQkJICAgIDQsIDIsCQkvKiBLICovCisJCQkJICAgIDAsIDIsCQkvKiBNICovCisJCQkJICAgIEJJVCgzMSksCQkvKiBnYXRlICovCisJCQkJICAgIEJJVCgyOCksCQkvKiBsb2NrICovCisJCQkJICAgIDApOworCitzdGF0aWMgU1VOWElfQ0NVX05LX1dJVEhfR0FURV9MT0NLX1BPU1RESVYocGxsX3BlcmlwaF9jbGssICJwbGwtcGVyaXBoIiwKKwkJCQkJICAgIm9zYzI0TSIsIDB4MDI4LAorCQkJCQkgICA4LCA1LAkvKiBOICovCisJCQkJCSAgIDQsIDIsCS8qIEsgKi8KKwkJCQkJICAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCQkgICBCSVQoMjgpLAkvKiBsb2NrICovCisJCQkJCSAgIDIsCQkvKiBwb3N0LWRpdiAqLworCQkJCQkgICBDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworc3RhdGljIFNVTlhJX0NDVV9OTV9XSVRIX0ZSQUNfR0FURV9MT0NLKHBsbF9ncHVfY2xrLCAicGxsLWdwdSIsCisJCQkJCSJvc2MyNE0iLCAweDAzOCwKKwkJCQkJOCwgNywJCS8qIE4gKi8KKwkJCQkJMCwgNCwJCS8qIE0gKi8KKwkJCQkJQklUKDI0KSwJLyogZnJhYyBlbmFibGUgKi8KKwkJCQkJQklUKDI1KSwJLyogZnJhYyBzZWxlY3QgKi8KKwkJCQkJMjcwMDAwMDAwLAkvKiBmcmFjIHJhdGUgMCAqLworCQkJCQkyOTcwMDAwMDAsCS8qIGZyYWMgcmF0ZSAxICovCisJCQkJCUJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkJQklUKDI4KSwJLyogbG9jayAqLworCQkJCQlDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworLyoKKyAqIFRoZSBNSVBJIFBMTCBoYXMgMiBtb2RlczogIk1JUEkiIGFuZCAiSERNSSIuCisgKgorICogVGhlIE1JUEkgbW9kZSBpcyBhIHN0YW5kYXJkIE5LTS1zdHlsZSBjbG9jay4gVGhlIEhETUkgbW9kZSBpcyBhbgorICogaW50ZWdlciAvIGZyYWN0aW9uYWwgY2xvY2sgd2l0aCBzd2l0Y2hhYmxlIG11bHRpcGxpZXJzIGFuZCBkaXZpZGVycy4KKyAqIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBoZXJlLiBXZSBoYXJkY29kZSB0aGUgUExMIHRvIE1JUEkgbW9kZS4KKyAqLworI2RlZmluZSBTVU44SV9BMjNfUExMX01JUElfUkVHCTB4MDQwCitzdGF0aWMgU1VOWElfQ0NVX05LTV9XSVRIX0dBVEVfTE9DSyhwbGxfbWlwaV9jbGssICJwbGwtbWlwaSIsCisJCQkJICAgICJwbGwtdmlkZW8iLCAweDA0MCwKKwkJCQkgICAgOCwgNCwJCS8qIE4gKi8KKwkJCQkgICAgNCwgMiwJCS8qIEsgKi8KKwkJCQkgICAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgICAgQklUKDMxKSwJCS8qIGdhdGUgKi8KKwkJCQkgICAgQklUKDI4KSwJCS8qIGxvY2sgKi8KKwkJCQkgICAgQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTk1fV0lUSF9GUkFDX0dBVEVfTE9DSyhwbGxfaHNpY19jbGssICJwbGwtaHNpYyIsCisJCQkJCSJvc2MyNE0iLCAweDA0NCwKKwkJCQkJOCwgNywJCS8qIE4gKi8KKwkJCQkJMCwgNCwJCS8qIE0gKi8KKwkJCQkJQklUKDI0KSwJLyogZnJhYyBlbmFibGUgKi8KKwkJCQkJQklUKDI1KSwJLyogZnJhYyBzZWxlY3QgKi8KKwkJCQkJMjcwMDAwMDAwLAkvKiBmcmFjIHJhdGUgMCAqLworCQkJCQkyOTcwMDAwMDAsCS8qIGZyYWMgcmF0ZSAxICovCisJCQkJCUJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkJQklUKDI4KSwJLyogbG9jayAqLworCQkJCQlDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworc3RhdGljIFNVTlhJX0NDVV9OTV9XSVRIX0ZSQUNfR0FURV9MT0NLKHBsbF9kZV9jbGssICJwbGwtZGUiLAorCQkJCQkib3NjMjRNIiwgMHgwNDgsCisJCQkJCTgsIDcsCQkvKiBOICovCisJCQkJCTAsIDQsCQkvKiBNICovCisJCQkJCUJJVCgyNCksCS8qIGZyYWMgZW5hYmxlICovCisJCQkJCUJJVCgyNSksCS8qIGZyYWMgc2VsZWN0ICovCisJCQkJCTI3MDAwMDAwMCwJLyogZnJhYyByYXRlIDAgKi8KKwkJCQkJMjk3MDAwMDAwLAkvKiBmcmFjIHJhdGUgMSAqLworCQkJCQlCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJCUJJVCgyOCksCS8qIGxvY2sgKi8KKwkJCQkJQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3B1eF9wYXJlbnRzW10gPSB7ICJvc2MzMmsiLCAib3NjMjRNIiwKKwkJCQkJICAgICAicGxsLWNwdXgiICwgInBsbC1jcHV4IiB9Oworc3RhdGljIFNVTlhJX0NDVV9NVVgoY3B1eF9jbGssICJjcHV4IiwgY3B1eF9wYXJlbnRzLAorCQkgICAgIDB4MDUwLCAxNiwgMiwgQ0xLX0lTX0NSSVRJQ0FMKTsKKworc3RhdGljIFNVTlhJX0NDVV9NKGF4aV9jbGssICJheGkiLCAiY3B1eCIsIDB4MDUwLCAwLCAyLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhaGIxX3BhcmVudHNbXSA9IHsgIm9zYzMyayIsICJvc2MyNE0iLAorCQkJCQkgICAgICJheGkiICwgInBsbC1wZXJpcGgiIH07CitzdGF0aWMgc3RydWN0IGNjdV9kaXYgYWhiMV9jbGsgPSB7CisJLmRpdgkJPSBfU1VOWElfQ0NVX0RJVl9GTEFHUyg0LCAyLCBDTEtfRElWSURFUl9QT1dFUl9PRl9UV08pLAorCisJLm11eAkJPSB7CisJCS5zaGlmdAk9IDEyLAorCQkud2lkdGgJPSAyLAorCisJCS52YXJpYWJsZV9wcmVkaXYJPSB7CisJCQkuaW5kZXgJPSAzLAorCQkJLnNoaWZ0CT0gNiwKKwkJCS53aWR0aAk9IDIsCisJCX0sCisJfSwKKworCS5jb21tb24JCT0geworCQkucmVnCQk9IDB4MDU0LAorCQkuZmVhdHVyZXMJPSBDQ1VfRkVBVFVSRV9WQVJJQUJMRV9QUkVESVYsCisJCS5ody5pbml0CT0gQ0xLX0hXX0lOSVRfUEFSRU5UUygiYWhiMSIsCisJCQkJCQkgICAgICBhaGIxX3BhcmVudHMsCisJCQkJCQkgICAgICAmY2N1X2Rpdl9vcHMsCisJCQkJCQkgICAgICAwKSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfZGl2X3RhYmxlIGFwYjFfZGl2X3RhYmxlW10gPSB7CisJeyAudmFsID0gMCwgLmRpdiA9IDIgfSwKKwl7IC52YWwgPSAxLCAuZGl2ID0gMiB9LAorCXsgLnZhbCA9IDIsIC5kaXYgPSA0IH0sCisJeyAudmFsID0gMywgLmRpdiA9IDggfSwKKwl7IC8qIFNlbnRpbmVsICovIH0sCit9Oworc3RhdGljIFNVTlhJX0NDVV9ESVZfVEFCTEUoYXBiMV9jbGssICJhcGIxIiwgImFoYjEiLAorCQkJICAgMHgwNTQsIDgsIDIsIGFwYjFfZGl2X3RhYmxlLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhcGIyX3BhcmVudHNbXSA9IHsgIm9zYzMyayIsICJvc2MyNE0iLAorCQkJCQkgICAgICJwbGwtcGVyaXBoIiAsICJwbGwtcGVyaXBoIiB9Oworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWChhcGIyX2NsaywgImFwYjIiLCBhcGIyX3BhcmVudHMsIDB4MDU4LAorCQkJICAgICAwLCA1LAkvKiBNICovCisJCQkgICAgIDE2LCAyLAkvKiBQICovCisJCQkgICAgIDI0LCAyLAkvKiBtdXggKi8KKwkJCSAgICAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfbWlwaV9kc2lfY2xrLAkiYnVzLW1pcGktZHNpIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfZG1hX2NsaywJImJ1cy1kbWEiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoNiksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19tbWMwX2NsaywJImJ1cy1tbWMwIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDgpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfbW1jMV9jbGssCSJidXMtbW1jMSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCg5KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX21tYzJfY2xrLAkiYnVzLW1tYzIiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMTApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfbmFuZF9jbGssCSJidXMtbmFuZCIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgxMyksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19kcmFtX2NsaywJImJ1cy1kcmFtIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDE0KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2hzdGltZXJfY2xrLAkiYnVzLWhzdGltZXIiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMTkpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfc3BpMF9jbGssCSJidXMtc3BpMCIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgyMCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19zcGkxX2NsaywJImJ1cy1zcGkxIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDIxKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX290Z19jbGssCSJidXMtb3RnIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDI0KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2VoY2lfY2xrLAkiYnVzLWVoY2kiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMjYpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfb2hjaV9jbGssCSJidXMtb2hjaSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgyOSksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX3ZlX2NsaywJImJ1cy12ZSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2xjZF9jbGssCSJidXMtbGNkIiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDQpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfY3NpX2NsaywJImJ1cy1jc2kiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoOCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19kZV9iZV9jbGssCSJidXMtZGUtYmUiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMTIpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfZGVfZmVfY2xrLAkiYnVzLWRlLWZlIiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDE0KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2dwdV9jbGssCSJidXMtZ3B1IiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDIwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX21zZ2JveF9jbGssCSJidXMtbXNnYm94IiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDIxKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX3NwaW5sb2NrX2NsaywJImJ1cy1zcGlubG9jayIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgyMiksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19kcmNfY2xrLAkiYnVzLWRyYyIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgyNSksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2NvZGVjX2NsaywJImJ1cy1jb2RlYyIsCSJhcGIxIiwKKwkJICAgICAgMHgwNjgsIEJJVCgwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX3Bpb19jbGssCSJidXMtcGlvIiwJImFwYjEiLAorCQkgICAgICAweDA2OCwgQklUKDUpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfaTJzMF9jbGssCSJidXMtaTJzMCIsCSJhcGIxIiwKKwkJICAgICAgMHgwNjgsIEJJVCgxMiksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19pMnMxX2NsaywJImJ1cy1pMnMxIiwJImFwYjEiLAorCQkgICAgICAweDA2OCwgQklUKDEzKSwgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfaTJjMF9jbGssCSJidXMtaTJjMCIsCSJhcGIyIiwKKwkJICAgICAgMHgwNmMsIEJJVCgwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2kyYzFfY2xrLAkiYnVzLWkyYzEiLAkiYXBiMiIsCisJCSAgICAgIDB4MDZjLCBCSVQoMSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19pMmMyX2NsaywJImJ1cy1pMmMyIiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDIpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfdWFydDBfY2xrLAkiYnVzLXVhcnQwIiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDE2KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX3VhcnQxX2NsaywJImJ1cy11YXJ0MSIsCSJhcGIyIiwKKwkJICAgICAgMHgwNmMsIEJJVCgxNyksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c191YXJ0Ml9jbGssCSJidXMtdWFydDIiLAkiYXBiMiIsCisJCSAgICAgIDB4MDZjLCBCSVQoMTgpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfdWFydDNfY2xrLAkiYnVzLXVhcnQzIiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDE5KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX3VhcnQ0X2NsaywJImJ1cy11YXJ0NCIsCSJhcGIyIiwKKwkJICAgICAgMHgwNmMsIEJJVCgyMCksIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1vZDBfZGVmYXVsdF9wYXJlbnRzW10gPSB7ICJvc2MyNE0iLCAicGxsLXBlcmlwaCIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShuYW5kX2NsaywgIm5hbmQiLCBtb2QwX2RlZmF1bHRfcGFyZW50cywgMHgwODAsCisJCQkJICAwLCA0LAkJLyogTSAqLworCQkJCSAgMTYsIDIsCS8qIFAgKi8KKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KKwkJCQkgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUobW1jMF9jbGssICJtbWMwIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsIDB4MDg4LAorCQkJCSAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9QSEFTRShtbWMwX3NhbXBsZV9jbGssICJtbWMwX3NhbXBsZSIsICJtbWMwIiwKKwkJICAgICAgIDB4MDg4LCAyMCwgMywgMCk7CitzdGF0aWMgU1VOWElfQ0NVX1BIQVNFKG1tYzBfb3V0cHV0X2NsaywgIm1tYzBfb3V0cHV0IiwgIm1tYzAiLAorCQkgICAgICAgMHgwODgsIDgsIDMsIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUobW1jMV9jbGssICJtbWMxIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsIDB4MDhjLAorCQkJCSAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9QSEFTRShtbWMxX3NhbXBsZV9jbGssICJtbWMxX3NhbXBsZSIsICJtbWMxIiwKKwkJICAgICAgIDB4MDhjLCAyMCwgMywgMCk7CitzdGF0aWMgU1VOWElfQ0NVX1BIQVNFKG1tYzFfb3V0cHV0X2NsaywgIm1tYzFfb3V0cHV0IiwgIm1tYzEiLAorCQkgICAgICAgMHgwOGMsIDgsIDMsIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUobW1jMl9jbGssICJtbWMyIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsIDB4MDkwLAorCQkJCSAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9QSEFTRShtbWMyX3NhbXBsZV9jbGssICJtbWMyX3NhbXBsZSIsICJtbWMyIiwKKwkJICAgICAgIDB4MDkwLCAyMCwgMywgMCk7CitzdGF0aWMgU1VOWElfQ0NVX1BIQVNFKG1tYzJfb3V0cHV0X2NsaywgIm1tYzJfb3V0cHV0IiwgIm1tYzIiLAorCQkgICAgICAgMHgwOTAsIDgsIDMsIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUoc3BpMF9jbGssICJzcGkwIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsIDB4MGEwLAorCQkJCSAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKHNwaTFfY2xrLCAic3BpMSIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLCAweDBhNCwKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzX3BhcmVudHNbXSA9IHsgInBsbC1hdWRpby04eCIsICJwbGwtYXVkaW8tNHgiLAorCQkJCQkgICAgInBsbC1hdWRpby0yeCIsICJwbGwtYXVkaW8iIH07CitzdGF0aWMgU1VOWElfQ0NVX01VWF9XSVRIX0dBVEUoaTJzMF9jbGssICJpMnMwIiwgaTJzX3BhcmVudHMsCisJCQkgICAgICAgMHgwYjAsIDE2LCAyLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NVVhfV0lUSF9HQVRFKGkyczFfY2xrLCAiaTJzMSIsIGkyc19wYXJlbnRzLAorCQkJICAgICAgIDB4MGI0LCAxNiwgMiwgQklUKDMxKSwgMCk7CisKKy8qIFRPRE86IHRoZSBwYXJlbnQgZm9yIG1vc3Qgb2YgdGhlIFVTQiBjbG9ja3MgaXMgbm90IGtub3duICovCitzdGF0aWMgU1VOWElfQ0NVX0dBVEUodXNiX3BoeTBfY2xrLAkidXNiLXBoeTAiLAkib3NjMjRNIiwKKwkJICAgICAgMHgwY2MsIEJJVCg4KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUodXNiX3BoeTFfY2xrLAkidXNiLXBoeTEiLAkib3NjMjRNIiwKKwkJICAgICAgMHgwY2MsIEJJVCg5KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUodXNiX2hzaWNfY2xrLAkidXNiLWhzaWMiLAkicGxsLWhzaWMiLAorCQkgICAgICAweDBjYywgQklUKDEwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUodXNiX2hzaWNfMTJNX2NsaywJInVzYi1oc2ljLTEyTSIsCSJvc2MyNE0iLAorCQkgICAgICAweDBjYywgQklUKDExKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUodXNiX29oY2lfY2xrLAkidXNiLW9oY2kiLAkib3NjMjRNIiwKKwkJICAgICAgMHgwY2MsIEJJVCgxNiksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV92ZV9jbGssCSJkcmFtLXZlIiwJInBsbC1kZHIiLAorCQkgICAgICAweDEwMCwgQklUKDApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShkcmFtX2NzaV9jbGssCSJkcmFtLWNzaSIsCSJwbGwtZGRyIiwKKwkJICAgICAgMHgxMDAsIEJJVCgxKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV9kcmNfY2xrLAkiZHJhbS1kcmMiLAkicGxsLWRkciIsCisJCSAgICAgIDB4MTAwLCBCSVQoMTYpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShkcmFtX2RlX2ZlX2NsaywJImRyYW0tZGUtZmUiLAkicGxsLWRkciIsCisJCSAgICAgIDB4MTAwLCBCSVQoMjQpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShkcmFtX2RlX2JlX2NsaywJImRyYW0tZGUtYmUiLAkicGxsLWRkciIsCisJCSAgICAgIDB4MTAwLCBCSVQoMjYpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZV9wYXJlbnRzW10gPSB7ICJwbGwtdmlkZW8iLCAicGxsLXBlcmlwaC0yeCIsCisJCQkJCSAgICJwbGwtZ3B1IiwgInBsbC1kZSIgfTsKK3N0YXRpYyBjb25zdCB1OCBkZV90YWJsZVtdID0geyAwLCAyLCAzLCA1IH07CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfVEFCTEVfR0FURShkZV9iZV9jbGssICJkZS1iZSIsCisJCQkJICAgICAgIGRlX3BhcmVudHMsIGRlX3RhYmxlLAorCQkJCSAgICAgICAweDEwNCwgMCwgNCwgMjQsIDMsIEJJVCgzMSksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfVEFCTEVfR0FURShkZV9mZV9jbGssICJkZS1mZSIsCisJCQkJICAgICAgIGRlX3BhcmVudHMsIGRlX3RhYmxlLAorCQkJCSAgICAgICAweDEwYywgMCwgNCwgMjQsIDMsIEJJVCgzMSksIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxjZF9jaDBfcGFyZW50c1tdID0geyAicGxsLXZpZGVvIiwgInBsbC12aWRlby0yeCIsCisJCQkJCQkicGxsLW1pcGkiIH07CitzdGF0aWMgY29uc3QgdTggbGNkX2NoMF90YWJsZVtdID0geyAwLCAyLCA0IH07CitzdGF0aWMgU1VOWElfQ0NVX01VWF9UQUJMRV9XSVRIX0dBVEUobGNkX2NoMF9jbGssICJsY2QtY2gwIiwKKwkJCQkgICAgIGxjZF9jaDBfcGFyZW50cywgbGNkX2NoMF90YWJsZSwKKwkJCQkgICAgIDB4MTE4LCAyNCwgMywgQklUKDMxKSwKKwkJCQkgICAgIENMS19TRVRfUkFURV9QQVJFTlQpOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxjZF9jaDFfcGFyZW50c1tdID0geyAicGxsLXZpZGVvIiwgInBsbC12aWRlby0yeCIgfTsKK3N0YXRpYyBjb25zdCB1OCBsY2RfY2gxX3RhYmxlW10gPSB7IDAsIDIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9UQUJMRV9HQVRFKGxjZF9jaDFfY2xrLCAibGNkLWNoMSIsCisJCQkJICAgICAgIGxjZF9jaDFfcGFyZW50cywgbGNkX2NoMV90YWJsZSwKKwkJCQkgICAgICAgMHgxMmMsIDAsIDQsIDI0LCAyLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjc2lfc2Nsa19wYXJlbnRzW10gPSB7ICJwbGwtdmlkZW8iLCAicGxsLWRlIiwKKwkJCQkJCSAicGxsLW1pcGkiLCAicGxsLXZlIiB9Oworc3RhdGljIGNvbnN0IHU4IGNzaV9zY2xrX3RhYmxlW10gPSB7IDAsIDMsIDQsIDUgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9UQUJMRV9HQVRFKGNzaV9zY2xrX2NsaywgImNzaS1zY2xrIiwKKwkJCQkgICAgICAgY3NpX3NjbGtfcGFyZW50cywgY3NpX3NjbGtfdGFibGUsCisJCQkJICAgICAgIDB4MTM0LCAxNiwgNCwgMjQsIDMsIEJJVCgzMSksIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzaV9tY2xrX3BhcmVudHNbXSA9IHsgInBsbC12aWRlbyIsICJwbGwtZGUiLAorCQkJCQkJICJvc2MyNE0iIH07CitzdGF0aWMgY29uc3QgdTggY3NpX21jbGtfdGFibGVbXSA9IHsgMCwgMywgNSB9Oworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX1RBQkxFX0dBVEUoY3NpX21jbGtfY2xrLCAiY3NpLW1jbGsiLAorCQkJCSAgICAgICBjc2lfbWNsa19wYXJlbnRzLCBjc2lfbWNsa190YWJsZSwKKwkJCQkgICAgICAgMHgxMzQsIDAsIDUsIDgsIDMsIEJJVCgxNSksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9HQVRFKHZlX2NsaywgInZlIiwgInBsbC12ZSIsCisJCQkgICAgIDB4MTNjLCAxNiwgMywgQklUKDMxKSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhY19kaWdfY2xrLAkiYWMtZGlnIiwJInBsbC1hdWRpbyIsCisJCSAgICAgIDB4MTQwLCBCSVQoMzEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhdnNfY2xrLAkJImF2cyIsCQkib3NjMjRNIiwKKwkJICAgICAgMHgxNDQsIEJJVCgzMSksIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1idXNfcGFyZW50c1tdID0geyAib3NjMjRNIiwgInBsbC1wZXJpcGgtMngiLAorCQkJCQkgICAgICJwbGwtZGRyIiB9Oworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX0dBVEUobWJ1c19jbGssICJtYnVzIiwgbWJ1c19wYXJlbnRzLAorCQkJCSAweDE1YywgMCwgMywgMjQsIDIsIEJJVCgzMSksIENMS19JU19DUklUSUNBTCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZHNpX3NjbGtfcGFyZW50c1tdID0geyAicGxsLXZpZGVvIiwgInBsbC12aWRlby0yeCIgfTsKK3N0YXRpYyBjb25zdCB1OCBkc2lfc2Nsa190YWJsZVtdID0geyAwLCAyIH07CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfVEFCTEVfR0FURShkc2lfc2Nsa19jbGssICJkc2ktc2NsayIsCisJCQkJICAgICAgIGRzaV9zY2xrX3BhcmVudHMsIGRzaV9zY2xrX3RhYmxlLAorCQkJCSAgICAgICAweDE2OCwgMTYsIDQsIDI0LCAyLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkc2lfZHBoeV9wYXJlbnRzW10gPSB7ICJwbGwtdmlkZW8iLCAicGxsLXBlcmlwaCIgfTsKK3N0YXRpYyBjb25zdCB1OCBkc2lfZHBoeV90YWJsZVtdID0geyAwLCAyIH07CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfVEFCTEVfR0FURShkc2lfZHBoeV9jbGssICJkc2ktZHBoeSIsCisJCQkJICAgICAgIGRzaV9kcGh5X3BhcmVudHMsIGRzaV9kcGh5X3RhYmxlLAorCQkJCSAgICAgICAweDE2OCwgMCwgNCwgOCwgMiwgQklUKDE1KSwgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9UQUJMRV9HQVRFKGRyY19jbGssICJkcmMiLAorCQkJCSAgICAgICBkZV9wYXJlbnRzLCBkZV90YWJsZSwKKwkJCQkgICAgICAgMHgxODAsIDAsIDQsIDI0LCAzLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfR0FURShncHVfY2xrLCAiZ3B1IiwgInBsbC1ncHUiLAorCQkJICAgICAweDFhMCwgMCwgMywgQklUKDMxKSwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXRzX3BhcmVudHNbXSA9IHsgIm9zYzI0TSIsICJwbGwtcGVyaXBoIiB9Oworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX0dBVEUoYXRzX2NsaywgImF0cyIsIGF0c19wYXJlbnRzLAorCQkJCSAweDFiMCwgMCwgMywgMjQsIDIsIEJJVCgzMSksIDApOworCitzdGF0aWMgc3RydWN0IGNjdV9jb21tb24gKnN1bjhpX2EyM19jY3VfY2xrc1tdID0geworCSZwbGxfY3B1eF9jbGsuY29tbW9uLAorCSZwbGxfYXVkaW9fYmFzZV9jbGsuY29tbW9uLAorCSZwbGxfdmlkZW9fY2xrLmNvbW1vbiwKKwkmcGxsX3ZlX2Nsay5jb21tb24sCisJJnBsbF9kZHJfY2xrLmNvbW1vbiwKKwkmcGxsX3BlcmlwaF9jbGsuY29tbW9uLAorCSZwbGxfZ3B1X2Nsay5jb21tb24sCisJJnBsbF9taXBpX2Nsay5jb21tb24sCisJJnBsbF9oc2ljX2Nsay5jb21tb24sCisJJnBsbF9kZV9jbGsuY29tbW9uLAorCSZjcHV4X2Nsay5jb21tb24sCisJJmF4aV9jbGsuY29tbW9uLAorCSZhaGIxX2Nsay5jb21tb24sCisJJmFwYjFfY2xrLmNvbW1vbiwKKwkmYXBiMl9jbGsuY29tbW9uLAorCSZidXNfbWlwaV9kc2lfY2xrLmNvbW1vbiwKKwkmYnVzX2RtYV9jbGsuY29tbW9uLAorCSZidXNfbW1jMF9jbGsuY29tbW9uLAorCSZidXNfbW1jMV9jbGsuY29tbW9uLAorCSZidXNfbW1jMl9jbGsuY29tbW9uLAorCSZidXNfbmFuZF9jbGsuY29tbW9uLAorCSZidXNfZHJhbV9jbGsuY29tbW9uLAorCSZidXNfaHN0aW1lcl9jbGsuY29tbW9uLAorCSZidXNfc3BpMF9jbGsuY29tbW9uLAorCSZidXNfc3BpMV9jbGsuY29tbW9uLAorCSZidXNfb3RnX2Nsay5jb21tb24sCisJJmJ1c19laGNpX2Nsay5jb21tb24sCisJJmJ1c19vaGNpX2Nsay5jb21tb24sCisJJmJ1c192ZV9jbGsuY29tbW9uLAorCSZidXNfbGNkX2Nsay5jb21tb24sCisJJmJ1c19jc2lfY2xrLmNvbW1vbiwKKwkmYnVzX2RlX2ZlX2Nsay5jb21tb24sCisJJmJ1c19kZV9iZV9jbGsuY29tbW9uLAorCSZidXNfZ3B1X2Nsay5jb21tb24sCisJJmJ1c19tc2dib3hfY2xrLmNvbW1vbiwKKwkmYnVzX3NwaW5sb2NrX2Nsay5jb21tb24sCisJJmJ1c19kcmNfY2xrLmNvbW1vbiwKKwkmYnVzX2NvZGVjX2Nsay5jb21tb24sCisJJmJ1c19waW9fY2xrLmNvbW1vbiwKKwkmYnVzX2kyczBfY2xrLmNvbW1vbiwKKwkmYnVzX2kyczFfY2xrLmNvbW1vbiwKKwkmYnVzX2kyYzBfY2xrLmNvbW1vbiwKKwkmYnVzX2kyYzFfY2xrLmNvbW1vbiwKKwkmYnVzX2kyYzJfY2xrLmNvbW1vbiwKKwkmYnVzX3VhcnQwX2Nsay5jb21tb24sCisJJmJ1c191YXJ0MV9jbGsuY29tbW9uLAorCSZidXNfdWFydDJfY2xrLmNvbW1vbiwKKwkmYnVzX3VhcnQzX2Nsay5jb21tb24sCisJJmJ1c191YXJ0NF9jbGsuY29tbW9uLAorCSZuYW5kX2Nsay5jb21tb24sCisJJm1tYzBfY2xrLmNvbW1vbiwKKwkmbW1jMF9zYW1wbGVfY2xrLmNvbW1vbiwKKwkmbW1jMF9vdXRwdXRfY2xrLmNvbW1vbiwKKwkmbW1jMV9jbGsuY29tbW9uLAorCSZtbWMxX3NhbXBsZV9jbGsuY29tbW9uLAorCSZtbWMxX291dHB1dF9jbGsuY29tbW9uLAorCSZtbWMyX2Nsay5jb21tb24sCisJJm1tYzJfc2FtcGxlX2Nsay5jb21tb24sCisJJm1tYzJfb3V0cHV0X2Nsay5jb21tb24sCisJJnNwaTBfY2xrLmNvbW1vbiwKKwkmc3BpMV9jbGsuY29tbW9uLAorCSZpMnMwX2Nsay5jb21tb24sCisJJmkyczFfY2xrLmNvbW1vbiwKKwkmdXNiX3BoeTBfY2xrLmNvbW1vbiwKKwkmdXNiX3BoeTFfY2xrLmNvbW1vbiwKKwkmdXNiX2hzaWNfY2xrLmNvbW1vbiwKKwkmdXNiX2hzaWNfMTJNX2Nsay5jb21tb24sCisJJnVzYl9vaGNpX2Nsay5jb21tb24sCisJJmRyYW1fdmVfY2xrLmNvbW1vbiwKKwkmZHJhbV9jc2lfY2xrLmNvbW1vbiwKKwkmZHJhbV9kcmNfY2xrLmNvbW1vbiwKKwkmZHJhbV9kZV9mZV9jbGsuY29tbW9uLAorCSZkcmFtX2RlX2JlX2Nsay5jb21tb24sCisJJmRlX2JlX2Nsay5jb21tb24sCisJJmRlX2ZlX2Nsay5jb21tb24sCisJJmxjZF9jaDBfY2xrLmNvbW1vbiwKKwkmbGNkX2NoMV9jbGsuY29tbW9uLAorCSZjc2lfc2Nsa19jbGsuY29tbW9uLAorCSZjc2lfbWNsa19jbGsuY29tbW9uLAorCSZ2ZV9jbGsuY29tbW9uLAorCSZhY19kaWdfY2xrLmNvbW1vbiwKKwkmYXZzX2Nsay5jb21tb24sCisJJm1idXNfY2xrLmNvbW1vbiwKKwkmZHNpX3NjbGtfY2xrLmNvbW1vbiwKKwkmZHNpX2RwaHlfY2xrLmNvbW1vbiwKKwkmZHJjX2Nsay5jb21tb24sCisJJmdwdV9jbGsuY29tbW9uLAorCSZhdHNfY2xrLmNvbW1vbiwKK307CisKKy8qIFdlIGhhcmRjb2RlIHRoZSBkaXZpZGVyIHRvIDQgZm9yIG5vdyAqLworc3RhdGljIENMS19GSVhFRF9GQUNUT1IocGxsX2F1ZGlvX2NsaywgInBsbC1hdWRpbyIsCisJCQkicGxsLWF1ZGlvLWJhc2UiLCA0LCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SKHBsbF9hdWRpb18yeF9jbGssICJwbGwtYXVkaW8tMngiLAorCQkJInBsbC1hdWRpby1iYXNlIiwgMiwgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CitzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUihwbGxfYXVkaW9fNHhfY2xrLCAicGxsLWF1ZGlvLTR4IiwKKwkJCSJwbGwtYXVkaW8tYmFzZSIsIDEsIDEsIENMS19TRVRfUkFURV9QQVJFTlQpOworc3RhdGljIENMS19GSVhFRF9GQUNUT1IocGxsX2F1ZGlvXzh4X2NsaywgInBsbC1hdWRpby04eCIsCisJCQkicGxsLWF1ZGlvLWJhc2UiLCAxLCAyLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SKHBsbF9wZXJpcGhfMnhfY2xrLCAicGxsLXBlcmlwaC0yeCIsCisJCQkicGxsLXBlcmlwaCIsIDEsIDIsIDApOworc3RhdGljIENMS19GSVhFRF9GQUNUT1IocGxsX3ZpZGVvXzJ4X2NsaywgInBsbC12aWRlby0yeCIsCisJCQkicGxsLXZpZGVvIiwgMSwgMiwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3X29uZWNlbGxfZGF0YSBzdW44aV9hMjNfaHdfY2xrcyA9IHsKKwkuaHdzCT0geworCQlbQ0xLX1BMTF9DUFVYXQkJPSAmcGxsX2NwdXhfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfQVVESU9fQkFTRV0JPSAmcGxsX2F1ZGlvX2Jhc2VfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfQVVESU9dCQk9ICZwbGxfYXVkaW9fY2xrLmh3LAorCQlbQ0xLX1BMTF9BVURJT18yWF0JPSAmcGxsX2F1ZGlvXzJ4X2Nsay5odywKKwkJW0NMS19QTExfQVVESU9fNFhdCT0gJnBsbF9hdWRpb180eF9jbGsuaHcsCisJCVtDTEtfUExMX0FVRElPXzhYXQk9ICZwbGxfYXVkaW9fOHhfY2xrLmh3LAorCQlbQ0xLX1BMTF9WSURFT10JCT0gJnBsbF92aWRlb19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9WSURFT18yWF0JPSAmcGxsX3ZpZGVvXzJ4X2Nsay5odywKKwkJW0NMS19QTExfVkVdCQk9ICZwbGxfdmVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfRERSMF0JCT0gJnBsbF9kZHJfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfUEVSSVBIXQk9ICZwbGxfcGVyaXBoX2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMX1BFUklQSF8yWF0JPSAmcGxsX3BlcmlwaF8yeF9jbGsuaHcsCisJCVtDTEtfUExMX0dQVV0JCT0gJnBsbF9ncHVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfTUlQSV0JCT0gJnBsbF9taXBpX2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMX0hTSUNdCQk9ICZwbGxfaHNpY19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9ERV0JCT0gJnBsbF9kZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0NQVVhdCQk9ICZjcHV4X2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVhJXQkJPSAmYXhpX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV0JCT0gJmFoYjFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BUEIxXQkJPSAmYXBiMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FQQjJdCQk9ICZhcGIyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX01JUElfRFNJXQk9ICZidXNfbWlwaV9kc2lfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfRE1BXQkJPSAmYnVzX2RtYV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19NTUMwXQkJPSAmYnVzX21tYzBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfTU1DMV0JCT0gJmJ1c19tbWMxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX01NQzJdCQk9ICZidXNfbW1jMl9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19OQU5EXQkJPSAmYnVzX25hbmRfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfRFJBTV0JCT0gJmJ1c19kcmFtX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0hTVElNRVJdCT0gJmJ1c19oc3RpbWVyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX1NQSTBdCQk9ICZidXNfc3BpMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19TUEkxXQkJPSAmYnVzX3NwaTFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfT1RHXQkJPSAmYnVzX290Z19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19FSENJXQkJPSAmYnVzX2VoY2lfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfT0hDSV0JCT0gJmJ1c19vaGNpX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX1ZFXQkJPSAmYnVzX3ZlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0xDRF0JCT0gJmJ1c19sY2RfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfQ1NJXQkJPSAmYnVzX2NzaV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19ERV9CRV0JCT0gJmJ1c19kZV9iZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19ERV9GRV0JCT0gJmJ1c19kZV9mZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19HUFVdCQk9ICZidXNfZ3B1X2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX01TR0JPWF0JPSAmYnVzX21zZ2JveF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19TUElOTE9DS10JPSAmYnVzX3NwaW5sb2NrX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0RSQ10JCT0gJmJ1c19kcmNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfQ09ERUNdCQk9ICZidXNfY29kZWNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfUElPXQkJPSAmYnVzX3Bpb19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19JMlMwXQkJPSAmYnVzX2kyczBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfSTJTMV0JCT0gJmJ1c19pMnMxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0kyQzBdCQk9ICZidXNfaTJjMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19JMkMxXQkJPSAmYnVzX2kyYzFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfSTJDMl0JCT0gJmJ1c19pMmMyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX1VBUlQwXQkJPSAmYnVzX3VhcnQwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX1VBUlQxXQkJPSAmYnVzX3VhcnQxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX1VBUlQyXQkJPSAmYnVzX3VhcnQyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX1VBUlQzXQkJPSAmYnVzX3VhcnQzX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX1VBUlQ0XQkJPSAmYnVzX3VhcnQ0X2Nsay5jb21tb24uaHcsCisJCVtDTEtfTkFORF0JCT0gJm5hbmRfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMwXQkJPSAmbW1jMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzBfU0FNUExFXQk9ICZtbWMwX3NhbXBsZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzBfT1VUUFVUXQk9ICZtbWMwX291dHB1dF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzFdCQk9ICZtbWMxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMV9TQU1QTEVdCT0gJm1tYzFfc2FtcGxlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMV9PVVRQVVRdCT0gJm1tYzFfb3V0cHV0X2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMl0JCT0gJm1tYzJfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMyX1NBTVBMRV0JPSAmbW1jMl9zYW1wbGVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMyX09VVFBVVF0JPSAmbW1jMl9vdXRwdXRfY2xrLmNvbW1vbi5odywKKwkJW0NMS19TUEkwXQkJPSAmc3BpMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1NQSTFdCQk9ICZzcGkxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfSTJTMF0JCT0gJmkyczBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19JMlMxXQkJPSAmaTJzMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1VTQl9QSFkwXQkJPSAmdXNiX3BoeTBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19VU0JfUEhZMV0JCT0gJnVzYl9waHkxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfVVNCX0hTSUNdCQk9ICZ1c2JfaHNpY19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1VTQl9IU0lDXzEyTV0JPSAmdXNiX2hzaWNfMTJNX2Nsay5jb21tb24uaHcsCisJCVtDTEtfVVNCX09IQ0ldCQk9ICZ1c2Jfb2hjaV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RSQU1fVkVdCQk9ICZkcmFtX3ZlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJBTV9DU0ldCQk9ICZkcmFtX2NzaV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RSQU1fRFJDXQkJPSAmZHJhbV9kcmNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EUkFNX0RFX0ZFXQk9ICZkcmFtX2RlX2ZlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJBTV9ERV9CRV0JPSAmZHJhbV9kZV9iZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RFX0JFXQkJPSAmZGVfYmVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19ERV9GRV0JCT0gJmRlX2ZlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTENEX0NIMF0JCT0gJmxjZF9jaDBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19MQ0RfQ0gxXQkJPSAmbGNkX2NoMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0NTSV9TQ0xLXQkJPSAmY3NpX3NjbGtfY2xrLmNvbW1vbi5odywKKwkJW0NMS19DU0lfTUNMS10JCT0gJmNzaV9tY2xrX2Nsay5jb21tb24uaHcsCisJCVtDTEtfVkVdCQk9ICZ2ZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FDX0RJR10JCT0gJmFjX2RpZ19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FWU10JCT0gJmF2c19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01CVVNdCQk9ICZtYnVzX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFNJX1NDTEtdCQk9ICZkc2lfc2Nsa19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RTSV9EUEhZXQkJPSAmZHNpX2RwaHlfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EUkNdCQk9ICZkcmNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19HUFVdCQk9ICZncHVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BVFNdCQk9ICZhdHNfY2xrLmNvbW1vbi5odywKKwl9LAorCS5udW0JPSBDTEtfTlVNQkVSLAorfTsKKworc3RhdGljIHN0cnVjdCBjY3VfcmVzZXRfbWFwIHN1bjhpX2EyM19jY3VfcmVzZXRzW10gPSB7CisJW1JTVF9VU0JfUEhZMF0JCT0gIHsgMHgwY2MsIEJJVCgwKSB9LAorCVtSU1RfVVNCX1BIWTFdCQk9ICB7IDB4MGNjLCBCSVQoMSkgfSwKKwlbUlNUX1VTQl9IU0lDXQkJPSAgeyAweDBjYywgQklUKDIpIH0sCisKKwlbUlNUX01CVVNdCQk9ICB7IDB4MGZjLCBCSVQoMzEpIH0sCisKKwlbUlNUX0JVU19NSVBJX0RTSV0JPSAgeyAweDJjMCwgQklUKDEpIH0sCisJW1JTVF9CVVNfRE1BXQkJPSAgeyAweDJjMCwgQklUKDYpIH0sCisJW1JTVF9CVVNfTU1DMF0JCT0gIHsgMHgyYzAsIEJJVCg4KSB9LAorCVtSU1RfQlVTX01NQzFdCQk9ICB7IDB4MmMwLCBCSVQoOSkgfSwKKwlbUlNUX0JVU19NTUMyXQkJPSAgeyAweDJjMCwgQklUKDEwKSB9LAorCVtSU1RfQlVTX05BTkRdCQk9ICB7IDB4MmMwLCBCSVQoMTMpIH0sCisJW1JTVF9CVVNfRFJBTV0JCT0gIHsgMHgyYzAsIEJJVCgxNCkgfSwKKwlbUlNUX0JVU19IU1RJTUVSXQk9ICB7IDB4MmMwLCBCSVQoMTkpIH0sCisJW1JTVF9CVVNfU1BJMF0JCT0gIHsgMHgyYzAsIEJJVCgyMCkgfSwKKwlbUlNUX0JVU19TUEkxXQkJPSAgeyAweDJjMCwgQklUKDIxKSB9LAorCVtSU1RfQlVTX09UR10JCT0gIHsgMHgyYzAsIEJJVCgyNCkgfSwKKwlbUlNUX0JVU19FSENJXQkJPSAgeyAweDJjMCwgQklUKDI2KSB9LAorCVtSU1RfQlVTX09IQ0ldCQk9ICB7IDB4MmMwLCBCSVQoMjkpIH0sCisKKwlbUlNUX0JVU19WRV0JCT0gIHsgMHgyYzQsIEJJVCgwKSB9LAorCVtSU1RfQlVTX0xDRF0JCT0gIHsgMHgyYzQsIEJJVCg0KSB9LAorCVtSU1RfQlVTX0NTSV0JCT0gIHsgMHgyYzQsIEJJVCg4KSB9LAorCVtSU1RfQlVTX0RFX0JFXQkJPSAgeyAweDJjNCwgQklUKDEyKSB9LAorCVtSU1RfQlVTX0RFX0ZFXQkJPSAgeyAweDJjNCwgQklUKDE0KSB9LAorCVtSU1RfQlVTX0dQVV0JCT0gIHsgMHgyYzQsIEJJVCgyMCkgfSwKKwlbUlNUX0JVU19NU0dCT1hdCT0gIHsgMHgyYzQsIEJJVCgyMSkgfSwKKwlbUlNUX0JVU19TUElOTE9DS10JPSAgeyAweDJjNCwgQklUKDIyKSB9LAorCVtSU1RfQlVTX0RSQ10JCT0gIHsgMHgyYzQsIEJJVCgyNSkgfSwKKworCVtSU1RfQlVTX0xWRFNdCQk9ICB7IDB4MmM4LCBCSVQoMCkgfSwKKworCVtSU1RfQlVTX0NPREVDXQkJPSAgeyAweDJkMCwgQklUKDApIH0sCisJW1JTVF9CVVNfSTJTMF0JCT0gIHsgMHgyZDAsIEJJVCgxMikgfSwKKwlbUlNUX0JVU19JMlMxXQkJPSAgeyAweDJkMCwgQklUKDEzKSB9LAorCisJW1JTVF9CVVNfSTJDMF0JCT0gIHsgMHgyZDgsIEJJVCgwKSB9LAorCVtSU1RfQlVTX0kyQzFdCQk9ICB7IDB4MmQ4LCBCSVQoMSkgfSwKKwlbUlNUX0JVU19JMkMyXQkJPSAgeyAweDJkOCwgQklUKDIpIH0sCisJW1JTVF9CVVNfVUFSVDBdCQk9ICB7IDB4MmQ4LCBCSVQoMTYpIH0sCisJW1JTVF9CVVNfVUFSVDFdCQk9ICB7IDB4MmQ4LCBCSVQoMTcpIH0sCisJW1JTVF9CVVNfVUFSVDJdCQk9ICB7IDB4MmQ4LCBCSVQoMTgpIH0sCisJW1JTVF9CVVNfVUFSVDNdCQk9ICB7IDB4MmQ4LCBCSVQoMTkpIH0sCisJW1JTVF9CVVNfVUFSVDRdCQk9ICB7IDB4MmQ4LCBCSVQoMjApIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN1bnhpX2NjdV9kZXNjIHN1bjhpX2EyM19jY3VfZGVzYyA9IHsKKwkuY2N1X2Nsa3MJPSBzdW44aV9hMjNfY2N1X2Nsa3MsCisJLm51bV9jY3VfY2xrcwk9IEFSUkFZX1NJWkUoc3VuOGlfYTIzX2NjdV9jbGtzKSwKKworCS5od19jbGtzCT0gJnN1bjhpX2EyM19od19jbGtzLAorCisJLnJlc2V0cwkJPSBzdW44aV9hMjNfY2N1X3Jlc2V0cywKKwkubnVtX3Jlc2V0cwk9IEFSUkFZX1NJWkUoc3VuOGlfYTIzX2NjdV9yZXNldHMpLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHN1bjhpX2EyM19jY3Vfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXZvaWQgX19pb21lbSAqcmVnOworCXUzMiB2YWw7CisKKwlyZWcgPSBvZl9pb19yZXF1ZXN0X2FuZF9tYXAobm9kZSwgMCwgb2Zfbm9kZV9mdWxsX25hbWUobm9kZSkpOworCWlmIChJU19FUlIocmVnKSkgeworCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgbWFwIHRoZSBjbG9jayByZWdpc3RlcnNcbiIsCisJCSAgICAgICBvZl9ub2RlX2Z1bGxfbmFtZShub2RlKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBGb3JjZSB0aGUgUExMLUF1ZGlvLTF4IGRpdmlkZXIgdG8gNCAqLworCXZhbCA9IHJlYWRsKHJlZyArIFNVTjhJX0EyM19QTExfQVVESU9fUkVHKTsKKwl2YWwgJj0gfkdFTk1BU0soMTksIDE2KTsKKwl3cml0ZWwodmFsIHwgKDMgPDwgMTYpLCByZWcgKyBTVU44SV9BMjNfUExMX0FVRElPX1JFRyk7CisKKwkvKiBGb3JjZSBQTEwtTUlQSSB0byBNSVBJIG1vZGUgKi8KKwl2YWwgPSByZWFkbChyZWcgKyBTVU44SV9BMjNfUExMX01JUElfUkVHKTsKKwl2YWwgJj0gfkJJVCgxNik7CisJd3JpdGVsKHZhbCwgcmVnICsgU1VOOElfQTIzX1BMTF9NSVBJX1JFRyk7CisKKwlzdW54aV9jY3VfcHJvYmUobm9kZSwgcmVnLCAmc3VuOGlfYTIzX2NjdV9kZXNjKTsKK30KK0NMS19PRl9ERUNMQVJFKHN1bjhpX2EyM19jY3UsICJhbGx3aW5uZXIsc3VuOGktYTIzLWNjdSIsCisJICAgICAgIHN1bjhpX2EyM19jY3Vfc2V0dXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLWEzMy5jIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLWEzMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YjQwY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktYTMzLmMKQEAgLTAsMCArMSw3ODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTWF4aW1lIFJpcGFyZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisKKyNpbmNsdWRlICJjY3VfY29tbW9uLmgiCisjaW5jbHVkZSAiY2N1X3Jlc2V0LmgiCisKKyNpbmNsdWRlICJjY3VfZGl2LmgiCisjaW5jbHVkZSAiY2N1X2dhdGUuaCIKKyNpbmNsdWRlICJjY3VfbXAuaCIKKyNpbmNsdWRlICJjY3VfbXVsdC5oIgorI2luY2x1ZGUgImNjdV9uay5oIgorI2luY2x1ZGUgImNjdV9ua20uaCIKKyNpbmNsdWRlICJjY3VfbmttcC5oIgorI2luY2x1ZGUgImNjdV9ubS5oIgorI2luY2x1ZGUgImNjdV9waGFzZS5oIgorCisjaW5jbHVkZSAiY2N1LXN1bjhpLWEyMy1hMzMuaCIKKworc3RhdGljIHN0cnVjdCBjY3VfbmttcCBwbGxfY3B1eF9jbGsgPSB7CisJLmVuYWJsZSA9IEJJVCgzMSksCisJLmxvY2sJPSBCSVQoMjgpLAorCisJLm4JPSBfU1VOWElfQ0NVX01VTFQoOCwgNSksCisJLmsJPSBfU1VOWElfQ0NVX01VTFQoNCwgMiksCisJLm0JPSBfU1VOWElfQ0NVX0RJVigwLCAyKSwKKwkucAk9IF9TVU5YSV9DQ1VfRElWX01BWCgxNiwgMiwgNCksCisKKwkuY29tbW9uCT0geworCQkucmVnCQk9IDB4MDAwLAorCQkuaHcuaW5pdAk9IENMS19IV19JTklUKCJwbGwtY3B1eCIsICJvc2MyNE0iLAorCQkJCQkgICAgICAmY2N1X25rbXBfb3BzLAorCQkJCQkgICAgICAwKSwKKwl9LAorfTsKKworLyoKKyAqIFRoZSBBdWRpbyBQTEwgaXMgc3VwcG9zZWQgdG8gaGF2ZSA0IG91dHB1dHM6IDMgZml4ZWQgZmFjdG9ycyBmcm9tCisgKiB0aGUgYmFzZSAoMngsIDR4IGFuZCA4eCksIGFuZCBvbmUgdmFyaWFibGUgZGl2aWRlciAodGhlIG9uZSB0cnVlCisgKiBwbGwgYXVkaW8pLgorICoKKyAqIFdlIGRvbid0IGhhdmUgYW55IG5lZWQgZm9yIHRoZSB2YXJpYWJsZSBkaXZpZGVyIGZvciBub3csIHNvIHdlIGp1c3QKKyAqIGhhcmRjb2RlIGl0IHRvIG1hdGNoIHdpdGggdGhlIGNsb2NrIG5hbWVzCisgKi8KKyNkZWZpbmUgU1VOOElfQTMzX1BMTF9BVURJT19SRUcJMHgwMDgKKworc3RhdGljIFNVTlhJX0NDVV9OTV9XSVRIX0dBVEVfTE9DSyhwbGxfYXVkaW9fYmFzZV9jbGssICJwbGwtYXVkaW8tYmFzZSIsCisJCQkJICAgIm9zYzI0TSIsIDB4MDA4LAorCQkJCSAgIDgsIDcsCQkvKiBOICovCisJCQkJICAgMCwgNSwJCS8qIE0gKi8KKwkJCQkgICBCSVQoMzEpLAkJLyogZ2F0ZSAqLworCQkJCSAgIEJJVCgyOCksCQkvKiBsb2NrICovCisJCQkJICAgQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTk1fV0lUSF9GUkFDX0dBVEVfTE9DSyhwbGxfdmlkZW9fY2xrLCAicGxsLXZpZGVvIiwKKwkJCQkJIm9zYzI0TSIsIDB4MDEwLAorCQkJCQk4LCA3LAkJLyogTiAqLworCQkJCQkwLCA0LAkJLyogTSAqLworCQkJCQlCSVQoMjQpLAkvKiBmcmFjIGVuYWJsZSAqLworCQkJCQlCSVQoMjUpLAkvKiBmcmFjIHNlbGVjdCAqLworCQkJCQkyNzAwMDAwMDAsCS8qIGZyYWMgcmF0ZSAwICovCisJCQkJCTI5NzAwMDAwMCwJLyogZnJhYyByYXRlIDEgKi8KKwkJCQkJQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCQlCSVQoMjgpLAkvKiBsb2NrICovCisJCQkJCUNMS19TRVRfUkFURV9VTkdBVEUpOworCitzdGF0aWMgU1VOWElfQ0NVX05NX1dJVEhfRlJBQ19HQVRFX0xPQ0socGxsX3ZlX2NsaywgInBsbC12ZSIsCisJCQkJCSJvc2MyNE0iLCAweDAxOCwKKwkJCQkJOCwgNywJCS8qIE4gKi8KKwkJCQkJMCwgNCwJCS8qIE0gKi8KKwkJCQkJQklUKDI0KSwJLyogZnJhYyBlbmFibGUgKi8KKwkJCQkJQklUKDI1KSwJLyogZnJhYyBzZWxlY3QgKi8KKwkJCQkJMjcwMDAwMDAwLAkvKiBmcmFjIHJhdGUgMCAqLworCQkJCQkyOTcwMDAwMDAsCS8qIGZyYWMgcmF0ZSAxICovCisJCQkJCUJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkJQklUKDI4KSwJLyogbG9jayAqLworCQkJCQlDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworc3RhdGljIFNVTlhJX0NDVV9OS01fV0lUSF9HQVRFX0xPQ0socGxsX2RkcjBfY2xrLCAicGxsLWRkcjAiLAorCQkJCSAgICAib3NjMjRNIiwgMHgwMjAsCisJCQkJICAgIDgsIDUsCQkvKiBOICovCisJCQkJICAgIDQsIDIsCQkvKiBLICovCisJCQkJICAgIDAsIDIsCQkvKiBNICovCisJCQkJICAgIEJJVCgzMSksCQkvKiBnYXRlICovCisJCQkJICAgIEJJVCgyOCksCQkvKiBsb2NrICovCisJCQkJICAgIDApOworCitzdGF0aWMgU1VOWElfQ0NVX05LX1dJVEhfR0FURV9MT0NLX1BPU1RESVYocGxsX3BlcmlwaF9jbGssICJwbGwtcGVyaXBoIiwKKwkJCQkJICAgIm9zYzI0TSIsIDB4MDI4LAorCQkJCQkgICA4LCA1LAkvKiBOICovCisJCQkJCSAgIDQsIDIsCS8qIEsgKi8KKwkJCQkJICAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCQkgICBCSVQoMjgpLAkvKiBsb2NrICovCisJCQkJCSAgIDIsCQkvKiBwb3N0LWRpdiAqLworCQkJCQkgICBDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworc3RhdGljIFNVTlhJX0NDVV9OTV9XSVRIX0ZSQUNfR0FURV9MT0NLKHBsbF9ncHVfY2xrLCAicGxsLWdwdSIsCisJCQkJCSJvc2MyNE0iLCAweDAzOCwKKwkJCQkJOCwgNywJCS8qIE4gKi8KKwkJCQkJMCwgNCwJCS8qIE0gKi8KKwkJCQkJQklUKDI0KSwJLyogZnJhYyBlbmFibGUgKi8KKwkJCQkJQklUKDI1KSwJLyogZnJhYyBzZWxlY3QgKi8KKwkJCQkJMjcwMDAwMDAwLAkvKiBmcmFjIHJhdGUgMCAqLworCQkJCQkyOTcwMDAwMDAsCS8qIGZyYWMgcmF0ZSAxICovCisJCQkJCUJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkJQklUKDI4KSwJLyogbG9jayAqLworCQkJCQlDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworLyoKKyAqIFRoZSBNSVBJIFBMTCBoYXMgMiBtb2RlczogIk1JUEkiIGFuZCAiSERNSSIuCisgKgorICogVGhlIE1JUEkgbW9kZSBpcyBhIHN0YW5kYXJkIE5LTS1zdHlsZSBjbG9jay4gVGhlIEhETUkgbW9kZSBpcyBhbgorICogaW50ZWdlciAvIGZyYWN0aW9uYWwgY2xvY2sgd2l0aCBzd2l0Y2hhYmxlIG11bHRpcGxpZXJzIGFuZCBkaXZpZGVycy4KKyAqIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBoZXJlLiBXZSBoYXJkY29kZSB0aGUgUExMIHRvIE1JUEkgbW9kZS4KKyAqLworI2RlZmluZSBTVU44SV9BMzNfUExMX01JUElfUkVHCTB4MDQwCitzdGF0aWMgU1VOWElfQ0NVX05LTV9XSVRIX0dBVEVfTE9DSyhwbGxfbWlwaV9jbGssICJwbGwtbWlwaSIsCisJCQkJICAgICJwbGwtdmlkZW8iLCAweDA0MCwKKwkJCQkgICAgOCwgNCwJCS8qIE4gKi8KKwkJCQkgICAgNCwgMiwJCS8qIEsgKi8KKwkJCQkgICAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgICAgQklUKDMxKSwJCS8qIGdhdGUgKi8KKwkJCQkgICAgQklUKDI4KSwJCS8qIGxvY2sgKi8KKwkJCQkgICAgQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTk1fV0lUSF9GUkFDX0dBVEVfTE9DSyhwbGxfaHNpY19jbGssICJwbGwtaHNpYyIsCisJCQkJCSJvc2MyNE0iLCAweDA0NCwKKwkJCQkJOCwgNywJCS8qIE4gKi8KKwkJCQkJMCwgNCwJCS8qIE0gKi8KKwkJCQkJQklUKDI0KSwJLyogZnJhYyBlbmFibGUgKi8KKwkJCQkJQklUKDI1KSwJLyogZnJhYyBzZWxlY3QgKi8KKwkJCQkJMjcwMDAwMDAwLAkvKiBmcmFjIHJhdGUgMCAqLworCQkJCQkyOTcwMDAwMDAsCS8qIGZyYWMgcmF0ZSAxICovCisJCQkJCUJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkJQklUKDI4KSwJLyogbG9jayAqLworCQkJCQlDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworc3RhdGljIFNVTlhJX0NDVV9OTV9XSVRIX0ZSQUNfR0FURV9MT0NLKHBsbF9kZV9jbGssICJwbGwtZGUiLAorCQkJCQkib3NjMjRNIiwgMHgwNDgsCisJCQkJCTgsIDcsCQkvKiBOICovCisJCQkJCTAsIDQsCQkvKiBNICovCisJCQkJCUJJVCgyNCksCS8qIGZyYWMgZW5hYmxlICovCisJCQkJCUJJVCgyNSksCS8qIGZyYWMgc2VsZWN0ICovCisJCQkJCTI3MDAwMDAwMCwJLyogZnJhYyByYXRlIDAgKi8KKwkJCQkJMjk3MDAwMDAwLAkvKiBmcmFjIHJhdGUgMSAqLworCQkJCQlCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJCUJJVCgyOCksCS8qIGxvY2sgKi8KKwkJCQkJQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKKy8qIFRPRE86IEZpeCBOICovCitzdGF0aWMgU1VOWElfQ0NVX05fV0lUSF9HQVRFX0xPQ0socGxsX2RkcjFfY2xrLCAicGxsLWRkcjEiLAorCQkJCSAgIm9zYzI0TSIsIDB4MDRjLAorCQkJCSAgOCwgNiwJCQkvKiBOICovCisJCQkJICBCSVQoMzEpLAkJLyogZ2F0ZSAqLworCQkJCSAgQklUKDI4KSwJCS8qIGxvY2sgKi8KKwkJCQkgIENMS19TRVRfUkFURV9VTkdBVEUpOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNwdXhfcGFyZW50c1tdID0geyAib3NjMzJrIiwgIm9zYzI0TSIsCisJCQkJCSAgICAgInBsbC1jcHV4IiAsICJwbGwtY3B1eCIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTVVYKGNwdXhfY2xrLCAiY3B1eCIsIGNwdXhfcGFyZW50cywKKwkJICAgICAweDA1MCwgMTYsIDIsIENMS19JU19DUklUSUNBTCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTShheGlfY2xrLCAiYXhpIiwgImNwdXgiLCAweDA1MCwgMCwgMiwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWhiMV9wYXJlbnRzW10gPSB7ICJvc2MzMmsiLCAib3NjMjRNIiwKKwkJCQkJICAgICAiYXhpIiAsICJwbGwtcGVyaXBoIiB9Oworc3RhdGljIHN0cnVjdCBjY3VfZGl2IGFoYjFfY2xrID0geworCS5kaXYJCT0gX1NVTlhJX0NDVV9ESVZfRkxBR1MoNCwgMiwgQ0xLX0RJVklERVJfUE9XRVJfT0ZfVFdPKSwKKworCS5tdXgJCT0geworCQkuc2hpZnQJPSAxMiwKKwkJLndpZHRoCT0gMiwKKworCQkudmFyaWFibGVfcHJlZGl2CT0geworCQkJLmluZGV4CT0gMywKKwkJCS5zaGlmdAk9IDYsCisJCQkud2lkdGgJPSAyLAorCQl9LAorCX0sCisKKwkuY29tbW9uCQk9IHsKKwkJLnJlZwkJPSAweDA1NCwKKwkJLmZlYXR1cmVzCT0gQ0NVX0ZFQVRVUkVfVkFSSUFCTEVfUFJFRElWLAorCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFMoImFoYjEiLAorCQkJCQkJICAgICAgYWhiMV9wYXJlbnRzLAorCQkJCQkJICAgICAgJmNjdV9kaXZfb3BzLAorCQkJCQkJICAgICAgMCksCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2Rpdl90YWJsZSBhcGIxX2Rpdl90YWJsZVtdID0geworCXsgLnZhbCA9IDAsIC5kaXYgPSAyIH0sCisJeyAudmFsID0gMSwgLmRpdiA9IDIgfSwKKwl7IC52YWwgPSAyLCAuZGl2ID0gNCB9LAorCXsgLnZhbCA9IDMsIC5kaXYgPSA4IH0sCisJeyAvKiBTZW50aW5lbCAqLyB9LAorfTsKK3N0YXRpYyBTVU5YSV9DQ1VfRElWX1RBQkxFKGFwYjFfY2xrLCAiYXBiMSIsICJhaGIxIiwKKwkJCSAgIDB4MDU0LCA4LCAyLCBhcGIxX2Rpdl90YWJsZSwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXBiMl9wYXJlbnRzW10gPSB7ICJvc2MzMmsiLCAib3NjMjRNIiwKKwkJCQkJICAgICAicGxsLXBlcmlwaCIgLCAicGxsLXBlcmlwaCIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVgoYXBiMl9jbGssICJhcGIyIiwgYXBiMl9wYXJlbnRzLCAweDA1OCwKKwkJCSAgICAgMCwgNSwJLyogTSAqLworCQkJICAgICAxNiwgMiwJLyogUCAqLworCQkJICAgICAyNCwgMiwJLyogbXV4ICovCisJCQkgICAgIDApOworCitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX21pcGlfZHNpX2NsaywJImJ1cy1taXBpLWRzaSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgxKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX3NzX2NsaywJImJ1cy1zcyIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCg1KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2RtYV9jbGssCSJidXMtZG1hIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDYpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfbW1jMF9jbGssCSJidXMtbW1jMCIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCg4KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX21tYzFfY2xrLAkiYnVzLW1tYzEiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoOSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19tbWMyX2NsaywJImJ1cy1tbWMyIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDEwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX25hbmRfY2xrLAkiYnVzLW5hbmQiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMTMpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfZHJhbV9jbGssCSJidXMtZHJhbSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgxNCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19oc3RpbWVyX2NsaywJImJ1cy1oc3RpbWVyIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDE5KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX3NwaTBfY2xrLAkiYnVzLXNwaTAiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMjApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfc3BpMV9jbGssCSJidXMtc3BpMSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgyMSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19vdGdfY2xrLAkiYnVzLW90ZyIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgyNCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19laGNpX2NsaywJImJ1cy1laGNpIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDI2KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX29oY2lfY2xrLAkiYnVzLW9oY2kiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMjkpLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c192ZV9jbGssCSJidXMtdmUiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19sY2RfY2xrLAkiYnVzLWxjZCIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCg0KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2NzaV9jbGssCSJidXMtY3NpIiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDgpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfZGVfYmVfY2xrLAkiYnVzLWRlLWJlIiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDEyKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2RlX2ZlX2NsaywJImJ1cy1kZS1mZSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgxNCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19ncHVfY2xrLAkiYnVzLWdwdSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgyMCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19tc2dib3hfY2xrLAkiYnVzLW1zZ2JveCIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgyMSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19zcGlubG9ja19jbGssCSJidXMtc3BpbmxvY2siLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMjIpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfZHJjX2NsaywJImJ1cy1kcmMiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMjUpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfc2F0X2NsaywJImJ1cy1zYXQiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMjYpLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19jb2RlY19jbGssCSJidXMtY29kZWMiLAkiYXBiMSIsCisJCSAgICAgIDB4MDY4LCBCSVQoMCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19waW9fY2xrLAkiYnVzLXBpbyIsCSJhcGIxIiwKKwkJICAgICAgMHgwNjgsIEJJVCg1KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2kyczBfY2xrLAkiYnVzLWkyczAiLAkiYXBiMSIsCisJCSAgICAgIDB4MDY4LCBCSVQoMTIpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfaTJzMV9jbGssCSJidXMtaTJzMSIsCSJhcGIxIiwKKwkJICAgICAgMHgwNjgsIEJJVCgxMyksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2kyYzBfY2xrLAkiYnVzLWkyYzAiLAkiYXBiMiIsCisJCSAgICAgIDB4MDZjLCBCSVQoMCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19pMmMxX2NsaywJImJ1cy1pMmMxIiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfaTJjMl9jbGssCSJidXMtaTJjMiIsCSJhcGIyIiwKKwkJICAgICAgMHgwNmMsIEJJVCgyKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX3VhcnQwX2NsaywJImJ1cy11YXJ0MCIsCSJhcGIyIiwKKwkJICAgICAgMHgwNmMsIEJJVCgxNiksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c191YXJ0MV9jbGssCSJidXMtdWFydDEiLAkiYXBiMiIsCisJCSAgICAgIDB4MDZjLCBCSVQoMTcpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfdWFydDJfY2xrLAkiYnVzLXVhcnQyIiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDE4KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX3VhcnQzX2NsaywJImJ1cy11YXJ0MyIsCSJhcGIyIiwKKwkJICAgICAgMHgwNmMsIEJJVCgxOSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c191YXJ0NF9jbGssCSJidXMtdWFydDQiLAkiYXBiMiIsCisJCSAgICAgIDB4MDZjLCBCSVQoMjApLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtb2QwX2RlZmF1bHRfcGFyZW50c1tdID0geyAib3NjMjRNIiwgInBsbC1wZXJpcGgiIH07CitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUobmFuZF9jbGssICJuYW5kIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsIDB4MDgwLAorCQkJCSAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKG1tYzBfY2xrLCAibW1jMCIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLCAweDA4OCwKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfUEhBU0UobW1jMF9zYW1wbGVfY2xrLCAibW1jMF9zYW1wbGUiLCAibW1jMCIsCisJCSAgICAgICAweDA4OCwgMjAsIDMsIDApOworc3RhdGljIFNVTlhJX0NDVV9QSEFTRShtbWMwX291dHB1dF9jbGssICJtbWMwX291dHB1dCIsICJtbWMwIiwKKwkJICAgICAgIDB4MDg4LCA4LCAzLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKG1tYzFfY2xrLCAibW1jMSIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLCAweDA4YywKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfUEhBU0UobW1jMV9zYW1wbGVfY2xrLCAibW1jMV9zYW1wbGUiLCAibW1jMSIsCisJCSAgICAgICAweDA4YywgMjAsIDMsIDApOworc3RhdGljIFNVTlhJX0NDVV9QSEFTRShtbWMxX291dHB1dF9jbGssICJtbWMxX291dHB1dCIsICJtbWMxIiwKKwkJICAgICAgIDB4MDhjLCA4LCAzLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKG1tYzJfY2xrLCAibW1jMiIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLCAweDA5MCwKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfUEhBU0UobW1jMl9zYW1wbGVfY2xrLCAibW1jMl9zYW1wbGUiLCAibW1jMiIsCisJCSAgICAgICAweDA5MCwgMjAsIDMsIDApOworc3RhdGljIFNVTlhJX0NDVV9QSEFTRShtbWMyX291dHB1dF9jbGssICJtbWMyX291dHB1dCIsICJtbWMyIiwKKwkJICAgICAgIDB4MDkwLCA4LCAzLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKHNzX2NsaywgInNzIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsIDB4MDljLAorCQkJCSAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKHNwaTBfY2xrLCAic3BpMCIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLCAweDBhMCwKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShzcGkxX2NsaywgInNwaTEiLCBtb2QwX2RlZmF1bHRfcGFyZW50cywgMHgwYTQsCisJCQkJICAwLCA0LAkJLyogTSAqLworCQkJCSAgMTYsIDIsCS8qIFAgKi8KKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KKwkJCQkgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyc19wYXJlbnRzW10gPSB7ICJwbGwtYXVkaW8tOHgiLCAicGxsLWF1ZGlvLTR4IiwKKwkJCQkJICAgICJwbGwtYXVkaW8tMngiLCAicGxsLWF1ZGlvIiB9Oworc3RhdGljIFNVTlhJX0NDVV9NVVhfV0lUSF9HQVRFKGkyczBfY2xrLCAiaTJzMCIsIGkyc19wYXJlbnRzLAorCQkJICAgICAgIDB4MGIwLCAxNiwgMiwgQklUKDMxKSwgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTVVYX1dJVEhfR0FURShpMnMxX2NsaywgImkyczEiLCBpMnNfcGFyZW50cywKKwkJCSAgICAgICAweDBiNCwgMTYsIDIsIEJJVCgzMSksIDApOworCisvKiBUT0RPOiB0aGUgcGFyZW50IGZvciBtb3N0IG9mIHRoZSBVU0IgY2xvY2tzIGlzIG5vdCBrbm93biAqLworc3RhdGljIFNVTlhJX0NDVV9HQVRFKHVzYl9waHkwX2NsaywJInVzYi1waHkwIiwJIm9zYzI0TSIsCisJCSAgICAgIDB4MGNjLCBCSVQoOCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKHVzYl9waHkxX2NsaywJInVzYi1waHkxIiwJIm9zYzI0TSIsCisJCSAgICAgIDB4MGNjLCBCSVQoOSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKHVzYl9oc2ljX2NsaywJInVzYi1oc2ljIiwJInBsbC1oc2ljIiwKKwkJICAgICAgMHgwY2MsIEJJVCgxMCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKHVzYl9oc2ljXzEyTV9jbGssCSJ1c2ItaHNpYy0xMk0iLAkib3NjMjRNIiwKKwkJICAgICAgMHgwY2MsIEJJVCgxMSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKHVzYl9vaGNpX2NsaywJInVzYi1vaGNpIiwJIm9zYzI0TSIsCisJCSAgICAgIDB4MGNjLCBCSVQoMTYpLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NKGRyYW1fY2xrLCAiZHJhbSIsICJwbGwtZGRyIiwKKwkJICAgMHgwZjQsIDAsIDQsIENMS19JU19DUklUSUNBTCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGxsX2Rkcl9wYXJlbnRzW10gPSB7ICJwbGwtZGRyMCIsICJwbGwtZGRyMSIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTVVYKHBsbF9kZHJfY2xrLCAicGxsLWRkciIsIHBsbF9kZHJfcGFyZW50cywKKwkJICAgICAweDBmOCwgMTYsIDEsIDApOworCitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV92ZV9jbGssCSJkcmFtLXZlIiwJImRyYW0iLAorCQkgICAgICAweDEwMCwgQklUKDApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShkcmFtX2NzaV9jbGssCSJkcmFtLWNzaSIsCSJkcmFtIiwKKwkJICAgICAgMHgxMDAsIEJJVCgxKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV9kcmNfY2xrLAkiZHJhbS1kcmMiLAkiZHJhbSIsCisJCSAgICAgIDB4MTAwLCBCSVQoMTYpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShkcmFtX2RlX2ZlX2NsaywJImRyYW0tZGUtZmUiLAkiZHJhbSIsCisJCSAgICAgIDB4MTAwLCBCSVQoMjQpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShkcmFtX2RlX2JlX2NsaywJImRyYW0tZGUtYmUiLAkiZHJhbSIsCisJCSAgICAgIDB4MTAwLCBCSVQoMjYpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZV9wYXJlbnRzW10gPSB7ICJwbGwtdmlkZW8iLCAicGxsLXBlcmlwaC0yeCIsCisJCQkJCSAgICJwbGwtZ3B1IiwgInBsbC1kZSIgfTsKK3N0YXRpYyBjb25zdCB1OCBkZV90YWJsZVtdID0geyAwLCAyLCAzLCA1IH07CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfVEFCTEVfR0FURShkZV9iZV9jbGssICJkZS1iZSIsCisJCQkJICAgICAgIGRlX3BhcmVudHMsIGRlX3RhYmxlLAorCQkJCSAgICAgICAweDEwNCwgMCwgNCwgMjQsIDMsIEJJVCgzMSksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfVEFCTEVfR0FURShkZV9mZV9jbGssICJkZS1mZSIsCisJCQkJICAgICAgIGRlX3BhcmVudHMsIGRlX3RhYmxlLAorCQkJCSAgICAgICAweDEwYywgMCwgNCwgMjQsIDMsIEJJVCgzMSksIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxjZF9jaDBfcGFyZW50c1tdID0geyAicGxsLXZpZGVvIiwgInBsbC12aWRlby0yeCIsCisJCQkJCQkicGxsLW1pcGkiIH07CitzdGF0aWMgY29uc3QgdTggbGNkX2NoMF90YWJsZVtdID0geyAwLCAyLCA0IH07CitzdGF0aWMgU1VOWElfQ0NVX01VWF9UQUJMRV9XSVRIX0dBVEUobGNkX2NoMF9jbGssICJsY2QtY2gwIiwKKwkJCQkgICAgIGxjZF9jaDBfcGFyZW50cywgbGNkX2NoMF90YWJsZSwKKwkJCQkgICAgIDB4MTE4LCAyNCwgMywgQklUKDMxKSwKKwkJCQkgICAgIENMS19TRVRfUkFURV9QQVJFTlQpOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxjZF9jaDFfcGFyZW50c1tdID0geyAicGxsLXZpZGVvIiwgInBsbC12aWRlby0yeCIgfTsKK3N0YXRpYyBjb25zdCB1OCBsY2RfY2gxX3RhYmxlW10gPSB7IDAsIDIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9UQUJMRV9HQVRFKGxjZF9jaDFfY2xrLCAibGNkLWNoMSIsCisJCQkJICAgICAgIGxjZF9jaDFfcGFyZW50cywgbGNkX2NoMV90YWJsZSwKKwkJCQkgICAgICAgMHgxMmMsIDAsIDQsIDI0LCAyLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjc2lfc2Nsa19wYXJlbnRzW10gPSB7ICJwbGwtdmlkZW8iLCAicGxsLWRlIiwKKwkJCQkJCSAicGxsLW1pcGkiLCAicGxsLXZlIiB9Oworc3RhdGljIGNvbnN0IHU4IGNzaV9zY2xrX3RhYmxlW10gPSB7IDAsIDMsIDQsIDUgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9UQUJMRV9HQVRFKGNzaV9zY2xrX2NsaywgImNzaS1zY2xrIiwKKwkJCQkgICAgICAgY3NpX3NjbGtfcGFyZW50cywgY3NpX3NjbGtfdGFibGUsCisJCQkJICAgICAgIDB4MTM0LCAxNiwgNCwgMjQsIDMsIEJJVCgzMSksIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzaV9tY2xrX3BhcmVudHNbXSA9IHsgInBsbC12aWRlbyIsICJwbGwtZGUiLAorCQkJCQkJICJvc2MyNE0iIH07CitzdGF0aWMgY29uc3QgdTggY3NpX21jbGtfdGFibGVbXSA9IHsgMCwgMywgNSB9Oworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX1RBQkxFX0dBVEUoY3NpX21jbGtfY2xrLCAiY3NpLW1jbGsiLAorCQkJCSAgICAgICBjc2lfbWNsa19wYXJlbnRzLCBjc2lfbWNsa190YWJsZSwKKwkJCQkgICAgICAgMHgxMzQsIDAsIDUsIDgsIDMsIEJJVCgxNSksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9HQVRFKHZlX2NsaywgInZlIiwgInBsbC12ZSIsCisJCQkgICAgIDB4MTNjLCAxNiwgMywgQklUKDMxKSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhY19kaWdfY2xrLAkiYWMtZGlnIiwJInBsbC1hdWRpbyIsCisJCSAgICAgIDB4MTQwLCBCSVQoMzEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhY19kaWdfNHhfY2xrLAkiYWMtZGlnLTR4IiwJInBsbC1hdWRpby00eCIsCisJCSAgICAgIDB4MTQwLCBCSVQoMzApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhdnNfY2xrLAkJImF2cyIsCQkib3NjMjRNIiwKKwkJICAgICAgMHgxNDQsIEJJVCgzMSksIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1idXNfcGFyZW50c1tdID0geyAib3NjMjRNIiwgInBsbC1wZXJpcGgtMngiLAorCQkJCQkgICAgICJwbGwtZGRyMCIsICJwbGwtZGRyMSIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKG1idXNfY2xrLCAibWJ1cyIsIG1idXNfcGFyZW50cywKKwkJCQkgMHgxNWMsIDAsIDMsIDI0LCAyLCBCSVQoMzEpLCBDTEtfSVNfQ1JJVElDQUwpOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRzaV9zY2xrX3BhcmVudHNbXSA9IHsgInBsbC12aWRlbyIsICJwbGwtdmlkZW8tMngiIH07CitzdGF0aWMgY29uc3QgdTggZHNpX3NjbGtfdGFibGVbXSA9IHsgMCwgMiB9Oworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX1RBQkxFX0dBVEUoZHNpX3NjbGtfY2xrLCAiZHNpLXNjbGsiLAorCQkJCSAgICAgICBkc2lfc2Nsa19wYXJlbnRzLCBkc2lfc2Nsa190YWJsZSwKKwkJCQkgICAgICAgMHgxNjgsIDE2LCA0LCAyNCwgMiwgQklUKDMxKSwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZHNpX2RwaHlfcGFyZW50c1tdID0geyAicGxsLXZpZGVvIiwgInBsbC1wZXJpcGgiIH07CitzdGF0aWMgY29uc3QgdTggZHNpX2RwaHlfdGFibGVbXSA9IHsgMCwgMiB9Oworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX1RBQkxFX0dBVEUoZHNpX2RwaHlfY2xrLCAiZHNpLWRwaHkiLAorCQkJCSAgICAgICBkc2lfZHBoeV9wYXJlbnRzLCBkc2lfZHBoeV90YWJsZSwKKwkJCQkgICAgICAgMHgxNjgsIDAsIDQsIDgsIDIsIEJJVCgxNSksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfVEFCTEVfR0FURShkcmNfY2xrLCAiZHJjIiwKKwkJCQkgICAgICAgZGVfcGFyZW50cywgZGVfdGFibGUsCisJCQkJICAgICAgIDB4MTgwLCAwLCA0LCAyNCwgMywgQklUKDMxKSwgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX0dBVEUoZ3B1X2NsaywgImdwdSIsICJwbGwtZ3B1IiwKKwkJCSAgICAgMHgxYTAsIDAsIDMsIEJJVCgzMSksIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0c19wYXJlbnRzW10gPSB7ICJvc2MyNE0iLCAicGxsLXBlcmlwaCIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKGF0c19jbGssICJhdHMiLCBhdHNfcGFyZW50cywKKwkJCQkgMHgxYjAsIDAsIDMsIDI0LCAyLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIHN0cnVjdCBjY3VfY29tbW9uICpzdW44aV9hMzNfY2N1X2Nsa3NbXSA9IHsKKwkmcGxsX2NwdXhfY2xrLmNvbW1vbiwKKwkmcGxsX2F1ZGlvX2Jhc2VfY2xrLmNvbW1vbiwKKwkmcGxsX3ZpZGVvX2Nsay5jb21tb24sCisJJnBsbF92ZV9jbGsuY29tbW9uLAorCSZwbGxfZGRyMF9jbGsuY29tbW9uLAorCSZwbGxfcGVyaXBoX2Nsay5jb21tb24sCisJJnBsbF9ncHVfY2xrLmNvbW1vbiwKKwkmcGxsX21pcGlfY2xrLmNvbW1vbiwKKwkmcGxsX2hzaWNfY2xrLmNvbW1vbiwKKwkmcGxsX2RlX2Nsay5jb21tb24sCisJJnBsbF9kZHIxX2Nsay5jb21tb24sCisJJnBsbF9kZHJfY2xrLmNvbW1vbiwKKwkmY3B1eF9jbGsuY29tbW9uLAorCSZheGlfY2xrLmNvbW1vbiwKKwkmYWhiMV9jbGsuY29tbW9uLAorCSZhcGIxX2Nsay5jb21tb24sCisJJmFwYjJfY2xrLmNvbW1vbiwKKwkmYnVzX21pcGlfZHNpX2Nsay5jb21tb24sCisJJmJ1c19zc19jbGsuY29tbW9uLAorCSZidXNfZG1hX2Nsay5jb21tb24sCisJJmJ1c19tbWMwX2Nsay5jb21tb24sCisJJmJ1c19tbWMxX2Nsay5jb21tb24sCisJJmJ1c19tbWMyX2Nsay5jb21tb24sCisJJmJ1c19uYW5kX2Nsay5jb21tb24sCisJJmJ1c19kcmFtX2Nsay5jb21tb24sCisJJmJ1c19oc3RpbWVyX2Nsay5jb21tb24sCisJJmJ1c19zcGkwX2Nsay5jb21tb24sCisJJmJ1c19zcGkxX2Nsay5jb21tb24sCisJJmJ1c19vdGdfY2xrLmNvbW1vbiwKKwkmYnVzX2VoY2lfY2xrLmNvbW1vbiwKKwkmYnVzX29oY2lfY2xrLmNvbW1vbiwKKwkmYnVzX3ZlX2Nsay5jb21tb24sCisJJmJ1c19sY2RfY2xrLmNvbW1vbiwKKwkmYnVzX2NzaV9jbGsuY29tbW9uLAorCSZidXNfZGVfZmVfY2xrLmNvbW1vbiwKKwkmYnVzX2RlX2JlX2Nsay5jb21tb24sCisJJmJ1c19ncHVfY2xrLmNvbW1vbiwKKwkmYnVzX21zZ2JveF9jbGsuY29tbW9uLAorCSZidXNfc3BpbmxvY2tfY2xrLmNvbW1vbiwKKwkmYnVzX2RyY19jbGsuY29tbW9uLAorCSZidXNfc2F0X2Nsay5jb21tb24sCisJJmJ1c19jb2RlY19jbGsuY29tbW9uLAorCSZidXNfcGlvX2Nsay5jb21tb24sCisJJmJ1c19pMnMwX2Nsay5jb21tb24sCisJJmJ1c19pMnMxX2Nsay5jb21tb24sCisJJmJ1c19pMmMwX2Nsay5jb21tb24sCisJJmJ1c19pMmMxX2Nsay5jb21tb24sCisJJmJ1c19pMmMyX2Nsay5jb21tb24sCisJJmJ1c191YXJ0MF9jbGsuY29tbW9uLAorCSZidXNfdWFydDFfY2xrLmNvbW1vbiwKKwkmYnVzX3VhcnQyX2Nsay5jb21tb24sCisJJmJ1c191YXJ0M19jbGsuY29tbW9uLAorCSZidXNfdWFydDRfY2xrLmNvbW1vbiwKKwkmbmFuZF9jbGsuY29tbW9uLAorCSZtbWMwX2Nsay5jb21tb24sCisJJm1tYzBfc2FtcGxlX2Nsay5jb21tb24sCisJJm1tYzBfb3V0cHV0X2Nsay5jb21tb24sCisJJm1tYzFfY2xrLmNvbW1vbiwKKwkmbW1jMV9zYW1wbGVfY2xrLmNvbW1vbiwKKwkmbW1jMV9vdXRwdXRfY2xrLmNvbW1vbiwKKwkmbW1jMl9jbGsuY29tbW9uLAorCSZtbWMyX3NhbXBsZV9jbGsuY29tbW9uLAorCSZtbWMyX291dHB1dF9jbGsuY29tbW9uLAorCSZzc19jbGsuY29tbW9uLAorCSZzcGkwX2Nsay5jb21tb24sCisJJnNwaTFfY2xrLmNvbW1vbiwKKwkmaTJzMF9jbGsuY29tbW9uLAorCSZpMnMxX2Nsay5jb21tb24sCisJJnVzYl9waHkwX2Nsay5jb21tb24sCisJJnVzYl9waHkxX2Nsay5jb21tb24sCisJJnVzYl9oc2ljX2Nsay5jb21tb24sCisJJnVzYl9oc2ljXzEyTV9jbGsuY29tbW9uLAorCSZ1c2Jfb2hjaV9jbGsuY29tbW9uLAorCSZkcmFtX2Nsay5jb21tb24sCisJJmRyYW1fdmVfY2xrLmNvbW1vbiwKKwkmZHJhbV9jc2lfY2xrLmNvbW1vbiwKKwkmZHJhbV9kcmNfY2xrLmNvbW1vbiwKKwkmZHJhbV9kZV9mZV9jbGsuY29tbW9uLAorCSZkcmFtX2RlX2JlX2Nsay5jb21tb24sCisJJmRlX2JlX2Nsay5jb21tb24sCisJJmRlX2ZlX2Nsay5jb21tb24sCisJJmxjZF9jaDBfY2xrLmNvbW1vbiwKKwkmbGNkX2NoMV9jbGsuY29tbW9uLAorCSZjc2lfc2Nsa19jbGsuY29tbW9uLAorCSZjc2lfbWNsa19jbGsuY29tbW9uLAorCSZ2ZV9jbGsuY29tbW9uLAorCSZhY19kaWdfY2xrLmNvbW1vbiwKKwkmYWNfZGlnXzR4X2Nsay5jb21tb24sCisJJmF2c19jbGsuY29tbW9uLAorCSZtYnVzX2Nsay5jb21tb24sCisJJmRzaV9zY2xrX2Nsay5jb21tb24sCisJJmRzaV9kcGh5X2Nsay5jb21tb24sCisJJmRyY19jbGsuY29tbW9uLAorCSZncHVfY2xrLmNvbW1vbiwKKwkmYXRzX2Nsay5jb21tb24sCit9OworCisvKiBXZSBoYXJkY29kZSB0aGUgZGl2aWRlciB0byA0IGZvciBub3cgKi8KK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SKHBsbF9hdWRpb19jbGssICJwbGwtYXVkaW8iLAorCQkJInBsbC1hdWRpby1iYXNlIiwgNCwgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CitzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUihwbGxfYXVkaW9fMnhfY2xrLCAicGxsLWF1ZGlvLTJ4IiwKKwkJCSJwbGwtYXVkaW8tYmFzZSIsIDIsIDEsIENMS19TRVRfUkFURV9QQVJFTlQpOworc3RhdGljIENMS19GSVhFRF9GQUNUT1IocGxsX2F1ZGlvXzR4X2NsaywgInBsbC1hdWRpby00eCIsCisJCQkicGxsLWF1ZGlvLWJhc2UiLCAxLCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SKHBsbF9hdWRpb184eF9jbGssICJwbGwtYXVkaW8tOHgiLAorCQkJInBsbC1hdWRpby1iYXNlIiwgMSwgMiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CitzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUihwbGxfcGVyaXBoXzJ4X2NsaywgInBsbC1wZXJpcGgtMngiLAorCQkJInBsbC1wZXJpcGgiLCAxLCAyLCAwKTsKK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SKHBsbF92aWRlb18yeF9jbGssICJwbGwtdmlkZW8tMngiLAorCQkJInBsbC12aWRlbyIsIDEsIDIsIDApOworCitzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgc3VuOGlfYTMzX2h3X2Nsa3MgPSB7CisJLmh3cwk9IHsKKwkJW0NMS19QTExfQ1BVWF0JCT0gJnBsbF9jcHV4X2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMX0FVRElPX0JBU0VdCT0gJnBsbF9hdWRpb19iYXNlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMX0FVRElPXQkJPSAmcGxsX2F1ZGlvX2Nsay5odywKKwkJW0NMS19QTExfQVVESU9fMlhdCT0gJnBsbF9hdWRpb18yeF9jbGsuaHcsCisJCVtDTEtfUExMX0FVRElPXzRYXQk9ICZwbGxfYXVkaW9fNHhfY2xrLmh3LAorCQlbQ0xLX1BMTF9BVURJT184WF0JPSAmcGxsX2F1ZGlvXzh4X2Nsay5odywKKwkJW0NMS19QTExfVklERU9dCQk9ICZwbGxfdmlkZW9fY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfVklERU9fMlhdCT0gJnBsbF92aWRlb18yeF9jbGsuaHcsCisJCVtDTEtfUExMX1ZFXQkJPSAmcGxsX3ZlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMX0REUjBdCQk9ICZwbGxfZGRyMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9QRVJJUEhdCT0gJnBsbF9wZXJpcGhfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfUEVSSVBIXzJYXQk9ICZwbGxfcGVyaXBoXzJ4X2Nsay5odywKKwkJW0NMS19QTExfR1BVXQkJPSAmcGxsX2dwdV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9NSVBJXQkJPSAmcGxsX21pcGlfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfSFNJQ10JCT0gJnBsbF9oc2ljX2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMX0RFXQkJPSAmcGxsX2RlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMX0REUjFdCQk9ICZwbGxfZGRyMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9ERFJdCQk9ICZwbGxfZGRyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQ1BVWF0JCT0gJmNwdXhfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BWEldCQk9ICZheGlfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxXQkJPSAmYWhiMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FQQjFdCQk9ICZhcGIxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVBCMl0JCT0gJmFwYjJfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfTUlQSV9EU0ldCT0gJmJ1c19taXBpX2RzaV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19TU10JCT0gJmJ1c19zc19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19ETUFdCQk9ICZidXNfZG1hX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX01NQzBdCQk9ICZidXNfbW1jMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19NTUMxXQkJPSAmYnVzX21tYzFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfTU1DMl0JCT0gJmJ1c19tbWMyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX05BTkRdCQk9ICZidXNfbmFuZF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19EUkFNXQkJPSAmYnVzX2RyYW1fY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfSFNUSU1FUl0JPSAmYnVzX2hzdGltZXJfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfU1BJMF0JCT0gJmJ1c19zcGkwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX1NQSTFdCQk9ICZidXNfc3BpMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19PVEddCQk9ICZidXNfb3RnX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0VIQ0ldCQk9ICZidXNfZWhjaV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19PSENJXQkJPSAmYnVzX29oY2lfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfVkVdCQk9ICZidXNfdmVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfTENEXQkJPSAmYnVzX2xjZF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19DU0ldCQk9ICZidXNfY3NpX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0RFX0JFXQkJPSAmYnVzX2RlX2JlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0RFX0ZFXQkJPSAmYnVzX2RlX2ZlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0dQVV0JCT0gJmJ1c19ncHVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfTVNHQk9YXQk9ICZidXNfbXNnYm94X2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX1NQSU5MT0NLXQk9ICZidXNfc3BpbmxvY2tfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfRFJDXQkJPSAmYnVzX2RyY19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19TQVRdCQk9ICZidXNfc2F0X2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0NPREVDXQkJPSAmYnVzX2NvZGVjX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX1BJT10JCT0gJmJ1c19waW9fY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfSTJTMF0JCT0gJmJ1c19pMnMwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0kyUzFdCQk9ICZidXNfaTJzMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19JMkMwXQkJPSAmYnVzX2kyYzBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfSTJDMV0JCT0gJmJ1c19pMmMxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0kyQzJdCQk9ICZidXNfaTJjMl9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19VQVJUMF0JCT0gJmJ1c191YXJ0MF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19VQVJUMV0JCT0gJmJ1c191YXJ0MV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19VQVJUMl0JCT0gJmJ1c191YXJ0Ml9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19VQVJUM10JCT0gJmJ1c191YXJ0M19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19VQVJUNF0JCT0gJmJ1c191YXJ0NF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX05BTkRdCQk9ICZuYW5kX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMF0JCT0gJm1tYzBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMwX1NBTVBMRV0JPSAmbW1jMF9zYW1wbGVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMwX09VVFBVVF0JPSAmbW1jMF9vdXRwdXRfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMxXQkJPSAmbW1jMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzFfU0FNUExFXQk9ICZtbWMxX3NhbXBsZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzFfT1VUUFVUXQk9ICZtbWMxX291dHB1dF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzJdCQk9ICZtbWMyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMl9TQU1QTEVdCT0gJm1tYzJfc2FtcGxlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMl9PVVRQVVRdCT0gJm1tYzJfb3V0cHV0X2Nsay5jb21tb24uaHcsCisJCVtDTEtfU1NdCQk9ICZzc19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1NQSTBdCQk9ICZzcGkwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfU1BJMV0JCT0gJnNwaTFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19JMlMwXQkJPSAmaTJzMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0kyUzFdCQk9ICZpMnMxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfVVNCX1BIWTBdCQk9ICZ1c2JfcGh5MF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1VTQl9QSFkxXQkJPSAmdXNiX3BoeTFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19VU0JfSFNJQ10JCT0gJnVzYl9oc2ljX2Nsay5jb21tb24uaHcsCisJCVtDTEtfVVNCX0hTSUNfMTJNXQk9ICZ1c2JfaHNpY18xMk1fY2xrLmNvbW1vbi5odywKKwkJW0NMS19VU0JfT0hDSV0JCT0gJnVzYl9vaGNpX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJBTV0JCT0gJmRyYW1fY2xrLmNvbW1vbi5odywKKwkJW0NMS19EUkFNX1ZFXQkJPSAmZHJhbV92ZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RSQU1fQ1NJXQkJPSAmZHJhbV9jc2lfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EUkFNX0RSQ10JCT0gJmRyYW1fZHJjX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJBTV9ERV9GRV0JPSAmZHJhbV9kZV9mZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RSQU1fREVfQkVdCT0gJmRyYW1fZGVfYmVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19ERV9CRV0JCT0gJmRlX2JlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfREVfRkVdCQk9ICZkZV9mZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0xDRF9DSDBdCQk9ICZsY2RfY2gwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTENEX0NIMV0JCT0gJmxjZF9jaDFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19DU0lfU0NMS10JCT0gJmNzaV9zY2xrX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQ1NJX01DTEtdCQk9ICZjc2lfbWNsa19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1ZFXQkJPSAmdmVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BQ19ESUddCQk9ICZhY19kaWdfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BQ19ESUdfNFhdCQk9ICZhY19kaWdfNHhfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BVlNdCQk9ICZhdnNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NQlVTXQkJPSAmbWJ1c19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RTSV9TQ0xLXQkJPSAmZHNpX3NjbGtfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EU0lfRFBIWV0JCT0gJmRzaV9kcGh5X2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJDXQkJPSAmZHJjX2Nsay5jb21tb24uaHcsCisJCVtDTEtfR1BVXQkJPSAmZ3B1X2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVRTXQkJPSAmYXRzX2Nsay5jb21tb24uaHcsCisJfSwKKwkubnVtCT0gQ0xLX05VTUJFUiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2N1X3Jlc2V0X21hcCBzdW44aV9hMzNfY2N1X3Jlc2V0c1tdID0geworCVtSU1RfVVNCX1BIWTBdCQk9ICB7IDB4MGNjLCBCSVQoMCkgfSwKKwlbUlNUX1VTQl9QSFkxXQkJPSAgeyAweDBjYywgQklUKDEpIH0sCisJW1JTVF9VU0JfSFNJQ10JCT0gIHsgMHgwY2MsIEJJVCgyKSB9LAorCisJW1JTVF9NQlVTXQkJPSAgeyAweDBmYywgQklUKDMxKSB9LAorCisJW1JTVF9CVVNfTUlQSV9EU0ldCT0gIHsgMHgyYzAsIEJJVCgxKSB9LAorCVtSU1RfQlVTX1NTXQkJPSAgeyAweDJjMCwgQklUKDUpIH0sCisJW1JTVF9CVVNfRE1BXQkJPSAgeyAweDJjMCwgQklUKDYpIH0sCisJW1JTVF9CVVNfTU1DMF0JCT0gIHsgMHgyYzAsIEJJVCg4KSB9LAorCVtSU1RfQlVTX01NQzFdCQk9ICB7IDB4MmMwLCBCSVQoOSkgfSwKKwlbUlNUX0JVU19NTUMyXQkJPSAgeyAweDJjMCwgQklUKDEwKSB9LAorCVtSU1RfQlVTX05BTkRdCQk9ICB7IDB4MmMwLCBCSVQoMTMpIH0sCisJW1JTVF9CVVNfRFJBTV0JCT0gIHsgMHgyYzAsIEJJVCgxNCkgfSwKKwlbUlNUX0JVU19IU1RJTUVSXQk9ICB7IDB4MmMwLCBCSVQoMTkpIH0sCisJW1JTVF9CVVNfU1BJMF0JCT0gIHsgMHgyYzAsIEJJVCgyMCkgfSwKKwlbUlNUX0JVU19TUEkxXQkJPSAgeyAweDJjMCwgQklUKDIxKSB9LAorCVtSU1RfQlVTX09UR10JCT0gIHsgMHgyYzAsIEJJVCgyNCkgfSwKKwlbUlNUX0JVU19FSENJXQkJPSAgeyAweDJjMCwgQklUKDI2KSB9LAorCVtSU1RfQlVTX09IQ0ldCQk9ICB7IDB4MmMwLCBCSVQoMjkpIH0sCisKKwlbUlNUX0JVU19WRV0JCT0gIHsgMHgyYzQsIEJJVCgwKSB9LAorCVtSU1RfQlVTX0xDRF0JCT0gIHsgMHgyYzQsIEJJVCg0KSB9LAorCVtSU1RfQlVTX0NTSV0JCT0gIHsgMHgyYzQsIEJJVCg4KSB9LAorCVtSU1RfQlVTX0RFX0JFXQkJPSAgeyAweDJjNCwgQklUKDEyKSB9LAorCVtSU1RfQlVTX0RFX0ZFXQkJPSAgeyAweDJjNCwgQklUKDE0KSB9LAorCVtSU1RfQlVTX0dQVV0JCT0gIHsgMHgyYzQsIEJJVCgyMCkgfSwKKwlbUlNUX0JVU19NU0dCT1hdCT0gIHsgMHgyYzQsIEJJVCgyMSkgfSwKKwlbUlNUX0JVU19TUElOTE9DS10JPSAgeyAweDJjNCwgQklUKDIyKSB9LAorCVtSU1RfQlVTX0RSQ10JCT0gIHsgMHgyYzQsIEJJVCgyNSkgfSwKKwlbUlNUX0JVU19TQVRdCQk9ICB7IDB4MmM0LCBCSVQoMjYpIH0sCisKKwlbUlNUX0JVU19MVkRTXQkJPSAgeyAweDJjOCwgQklUKDApIH0sCisKKwlbUlNUX0JVU19DT0RFQ10JCT0gIHsgMHgyZDAsIEJJVCgwKSB9LAorCVtSU1RfQlVTX0kyUzBdCQk9ICB7IDB4MmQwLCBCSVQoMTIpIH0sCisJW1JTVF9CVVNfSTJTMV0JCT0gIHsgMHgyZDAsIEJJVCgxMykgfSwKKworCVtSU1RfQlVTX0kyQzBdCQk9ICB7IDB4MmQ4LCBCSVQoMCkgfSwKKwlbUlNUX0JVU19JMkMxXQkJPSAgeyAweDJkOCwgQklUKDEpIH0sCisJW1JTVF9CVVNfSTJDMl0JCT0gIHsgMHgyZDgsIEJJVCgyKSB9LAorCVtSU1RfQlVTX1VBUlQwXQkJPSAgeyAweDJkOCwgQklUKDE2KSB9LAorCVtSU1RfQlVTX1VBUlQxXQkJPSAgeyAweDJkOCwgQklUKDE3KSB9LAorCVtSU1RfQlVTX1VBUlQyXQkJPSAgeyAweDJkOCwgQklUKDE4KSB9LAorCVtSU1RfQlVTX1VBUlQzXQkJPSAgeyAweDJkOCwgQklUKDE5KSB9LAorCVtSU1RfQlVTX1VBUlQ0XQkJPSAgeyAweDJkOCwgQklUKDIwKSB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdW54aV9jY3VfZGVzYyBzdW44aV9hMzNfY2N1X2Rlc2MgPSB7CisJLmNjdV9jbGtzCT0gc3VuOGlfYTMzX2NjdV9jbGtzLAorCS5udW1fY2N1X2Nsa3MJPSBBUlJBWV9TSVpFKHN1bjhpX2EzM19jY3VfY2xrcyksCisKKwkuaHdfY2xrcwk9ICZzdW44aV9hMzNfaHdfY2xrcywKKworCS5yZXNldHMJCT0gc3VuOGlfYTMzX2NjdV9yZXNldHMsCisJLm51bV9yZXNldHMJPSBBUlJBWV9TSVpFKHN1bjhpX2EzM19jY3VfcmVzZXRzKSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzdW44aV9hMzNfY2N1X3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZzsKKwl1MzIgdmFsOworCisJcmVnID0gb2ZfaW9fcmVxdWVzdF9hbmRfbWFwKG5vZGUsIDAsIG9mX25vZGVfZnVsbF9uYW1lKG5vZGUpKTsKKwlpZiAoSVNfRVJSKHJlZykpIHsKKwkJcHJfZXJyKCIlczogQ291bGQgbm90IG1hcCB0aGUgY2xvY2sgcmVnaXN0ZXJzXG4iLAorCQkgICAgICAgb2Zfbm9kZV9mdWxsX25hbWUobm9kZSkpOworCQlyZXR1cm47CisJfQorCisJLyogRm9yY2UgdGhlIFBMTC1BdWRpby0xeCBkaXZpZGVyIHRvIDQgKi8KKwl2YWwgPSByZWFkbChyZWcgKyBTVU44SV9BMzNfUExMX0FVRElPX1JFRyk7CisJdmFsICY9IH5HRU5NQVNLKDE5LCAxNik7CisJd3JpdGVsKHZhbCB8ICgzIDw8IDE2KSwgcmVnICsgU1VOOElfQTMzX1BMTF9BVURJT19SRUcpOworCisJLyogRm9yY2UgUExMLU1JUEkgdG8gTUlQSSBtb2RlICovCisJdmFsID0gcmVhZGwocmVnICsgU1VOOElfQTMzX1BMTF9NSVBJX1JFRyk7CisJdmFsICY9IH5CSVQoMTYpOworCXdyaXRlbCh2YWwsIHJlZyArIFNVTjhJX0EzM19QTExfTUlQSV9SRUcpOworCisJc3VueGlfY2N1X3Byb2JlKG5vZGUsIHJlZywgJnN1bjhpX2EzM19jY3VfZGVzYyk7Cit9CitDTEtfT0ZfREVDTEFSRShzdW44aV9hMzNfY2N1LCAiYWxsd2lubmVyLHN1bjhpLWEzMy1jY3UiLAorCSAgICAgICBzdW44aV9hMzNfY2N1X3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS1oMy5jIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLWgzLmMKaW5kZXggOWFmMzU5NTQuLjRkNzA1OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS1oMy5jCisrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS1oMy5jCkBAIC0xODQsMTUgKzE4NCwxNSBAQAogCQkJICAgICAwKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhaGIyX3BhcmVudHNbXSA9IHsgImFoYjEiICwgInBsbC1wZXJpcGgwIiB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBjY3VfbXV4X2ZpeGVkX3ByZWRpdiBhaGIyX2ZpeGVkX3ByZWRpdnNbXSA9IHsKKwl7IC5pbmRleCA9IDEsIC5kaXYgPSAyIH0sCit9Owogc3RhdGljIHN0cnVjdCBjY3VfbXV4IGFoYjJfY2xrID0gewogCS5tdXgJCT0gewogCQkuc2hpZnQJPSAwLAogCQkud2lkdGgJPSAxLAotCi0JCS5maXhlZF9wcmVkaXYJPSB7Ci0JCQkuaW5kZXgJPSAxLAotCQkJLmRpdgk9IDIsCi0JCX0sCisJCS5maXhlZF9wcmVkaXZzCT0gYWhiMl9maXhlZF9wcmVkaXZzLAorCQkubl9wcmVkaXZzCT0gQVJSQVlfU0laRShhaGIyX2ZpeGVkX3ByZWRpdnMpLAogCX0sCiAKIAkuY29tbW9uCQk9IHsKQEAgLTc4MywxNCArNzgzLDE0IEBACiAJW1JTVF9CVVNfSTJTMV0JCT0gIHsgMHgyZDAsIEJJVCgxMykgfSwKIAlbUlNUX0JVU19JMlMyXQkJPSAgeyAweDJkMCwgQklUKDE0KSB9LAogCi0JW1JTVF9CVVNfSTJDMF0JCT0gIHsgMHgyZDQsIEJJVCgwKSB9LAotCVtSU1RfQlVTX0kyQzFdCQk9ICB7IDB4MmQ0LCBCSVQoMSkgfSwKLQlbUlNUX0JVU19JMkMyXQkJPSAgeyAweDJkNCwgQklUKDIpIH0sCi0JW1JTVF9CVVNfVUFSVDBdCQk9ICB7IDB4MmQ0LCBCSVQoMTYpIH0sCi0JW1JTVF9CVVNfVUFSVDFdCQk9ICB7IDB4MmQ0LCBCSVQoMTcpIH0sCi0JW1JTVF9CVVNfVUFSVDJdCQk9ICB7IDB4MmQ0LCBCSVQoMTgpIH0sCi0JW1JTVF9CVVNfVUFSVDNdCQk9ICB7IDB4MmQ0LCBCSVQoMTkpIH0sCi0JW1JTVF9CVVNfU0NSXQkJPSAgeyAweDJkNCwgQklUKDIwKSB9LAorCVtSU1RfQlVTX0kyQzBdCQk9ICB7IDB4MmQ4LCBCSVQoMCkgfSwKKwlbUlNUX0JVU19JMkMxXQkJPSAgeyAweDJkOCwgQklUKDEpIH0sCisJW1JTVF9CVVNfSTJDMl0JCT0gIHsgMHgyZDgsIEJJVCgyKSB9LAorCVtSU1RfQlVTX1VBUlQwXQkJPSAgeyAweDJkOCwgQklUKDE2KSB9LAorCVtSU1RfQlVTX1VBUlQxXQkJPSAgeyAweDJkOCwgQklUKDE3KSB9LAorCVtSU1RfQlVTX1VBUlQyXQkJPSAgeyAweDJkOCwgQklUKDE4KSB9LAorCVtSU1RfQlVTX1VBUlQzXQkJPSAgeyAweDJkOCwgQklUKDE5KSB9LAorCVtSU1RfQlVTX1NDUl0JCT0gIHsgMHgyZDgsIEJJVCgyMCkgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VueGlfY2N1X2Rlc2Mgc3VuOGlfaDNfY2N1X2Rlc2MgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfY29tbW9uLmMgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfY29tbW9uLmMKaW5kZXggZmMxN2I1Mi4uNTFkNGJhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9jb21tb24uYwpAQCAtMzEsNyArMzEsNyBAQAogCQlyZXR1cm47CiAKIAlXQVJOX09OKHJlYWRsX3JlbGF4ZWRfcG9sbF90aW1lb3V0KGNvbW1vbi0+YmFzZSArIGNvbW1vbi0+cmVnLCByZWcsCi0JCQkJCSAgICEocmVnICYgbG9jayksIDEwMCwgNzAwMDApKTsKKwkJCQkJICAgcmVnICYgbG9jaywgMTAwLCA3MDAwMCkpOwogfQogCiBpbnQgc3VueGlfY2N1X3Byb2JlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgdm9pZCBfX2lvbWVtICpyZWcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfZGl2LmggYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfZGl2LmgKaW5kZXggNjUzYWRlNS4uMzRjMzM4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X2Rpdi5oCisrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9kaXYuaApAQCAtMTksMTAgKzE5LDI5IEBACiAjaW5jbHVkZSAiY2N1X2NvbW1vbi5oIgogI2luY2x1ZGUgImNjdV9tdXguaCIKIAorLyoqCisgKiBzdHJ1Y3QgX2NjdV9kaXYgLSBJbnRlcm5hbCBkaXZpZGVyIGRlc2NyaXB0aW9uCisgKiBAc2hpZnQ6IEJpdCBvZmZzZXQgb2YgdGhlIGRpdmlkZXIgaW4gaXRzIHJlZ2lzdGVyCisgKiBAd2lkdGg6IFdpZHRoIG9mIHRoZSBkaXZpZGVyIGZpZWxkIGluIGl0cyByZWdpc3RlcgorICogQG1heDogTWF4aW11bSB2YWx1ZSBhbGxvd2VkIGZvciB0aGF0IGRpdmlkZXIuIFRoaXMgaXMgdGhlCisgKiAgICAgICBhcml0aG1ldGljIHZhbHVlLCBub3QgdGhlIG1heGltdW0gdmFsdWUgdG8gYmUgc2V0IGluIHRoZQorICogICAgICAgcmVnaXN0ZXIuCisgKiBAZmxhZ3M6IGNsa19kaXZpZGVyIGZsYWdzIHRvIGFwcGx5IG9uIHRoaXMgZGl2aWRlcgorICogQHRhYmxlOiBEaXZpZGVyIHRhYmxlIHBvaW50ZXIgKGlmIGFwcGxpY2FibGUpCisgKgorICogVGhhdCBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhIHNpbmdsZSBkaXZpZGVyLCBhbmQgaXMgbWVhbnQgdG8gYmUKKyAqIGVtYmVkZGVkIGluIG90aGVyIHN0cnVjdHVyZXMgcmVwcmVzZW50aW5nIHRoZSB2YXJpb3VzIGNsb2NrCisgKiBjbGFzc2VzLgorICoKKyAqIEl0IGlzIGJhc2ljYWxseSBhIHdyYXBwZXIgYXJvdW5kIHRoZSBjbGtfZGl2aWRlciBmdW5jdGlvbnMKKyAqIGFyZ3VtZW50cy4KKyAqLwogc3RydWN0IF9jY3VfZGl2IHsKIAl1OAkJCXNoaWZ0OwogCXU4CQkJd2lkdGg7CiAKKwl1MzIJCQltYXg7CisKIAl1MzIJCQlmbGFnczsKIAogCXN0cnVjdCBjbGtfZGl2X3RhYmxlCSp0YWJsZTsKQEAgLTM2LDE0ICs1NSwyNSBAQAogCQkudGFibGUJPSBfdGFibGUsCQkJCQlcCiAJfQogCi0jZGVmaW5lIF9TVU5YSV9DQ1VfRElWX0ZMQUdTKF9zaGlmdCwgX3dpZHRoLCBfZmxhZ3MpCQkJXAotCV9TVU5YSV9DQ1VfRElWX1RBQkxFX0ZMQUdTKF9zaGlmdCwgX3dpZHRoLCBOVUxMLCBfZmxhZ3MpCi0KICNkZWZpbmUgX1NVTlhJX0NDVV9ESVZfVEFCTEUoX3NoaWZ0LCBfd2lkdGgsIF90YWJsZSkJCQlcCiAJX1NVTlhJX0NDVV9ESVZfVEFCTEVfRkxBR1MoX3NoaWZ0LCBfd2lkdGgsIF90YWJsZSwgMCkKIAorI2RlZmluZSBfU1VOWElfQ0NVX0RJVl9NQVhfRkxBR1MoX3NoaWZ0LCBfd2lkdGgsIF9tYXgsIF9mbGFncykgXAorCXsJCQkJCQkJCVwKKwkJLnNoaWZ0CT0gX3NoaWZ0LAkJCQkJXAorCQkud2lkdGgJPSBfd2lkdGgsCQkJCQlcCisJCS5mbGFncwk9IF9mbGFncywJCQkJCVwKKwkJLm1heAk9IF9tYXgsCQkJCQkJXAorCX0KKworI2RlZmluZSBfU1VOWElfQ0NVX0RJVl9GTEFHUyhfc2hpZnQsIF93aWR0aCwgX2ZsYWdzKQkJCVwKKwlfU1VOWElfQ0NVX0RJVl9NQVhfRkxBR1MoX3NoaWZ0LCBfd2lkdGgsIDAsIF9mbGFncykKKworI2RlZmluZSBfU1VOWElfQ0NVX0RJVl9NQVgoX3NoaWZ0LCBfd2lkdGgsIF9tYXgpCQkJXAorCV9TVU5YSV9DQ1VfRElWX01BWF9GTEFHUyhfc2hpZnQsIF93aWR0aCwgX21heCwgMCkKKwogI2RlZmluZSBfU1VOWElfQ0NVX0RJVihfc2hpZnQsIF93aWR0aCkJCQkJCVwKLQlfU1VOWElfQ0NVX0RJVl9UQUJMRV9GTEFHUyhfc2hpZnQsIF93aWR0aCwgTlVMTCwgMCkKKwlfU1VOWElfQ0NVX0RJVl9GTEFHUyhfc2hpZnQsIF93aWR0aCwgMCkKIAogc3RydWN0IGNjdV9kaXYgewogCXUzMgkJCWVuYWJsZTsKQEAgLTc3LDEzICsxMDcsMTYgQEAKIAkJCQkgICAgICBfc2hpZnQsIF93aWR0aCwgX3RhYmxlLCAwLAlcCiAJCQkJICAgICAgX2ZsYWdzKQogCi0jZGVmaW5lIFNVTlhJX0NDVV9NX1dJVEhfTVVYX0dBVEUoX3N0cnVjdCwgX25hbWUsIF9wYXJlbnRzLCBfcmVnLAlcCi0JCQkJICBfbXNoaWZ0LCBfbXdpZHRoLCBfbXV4c2hpZnQsIF9tdXh3aWR0aCwgXAotCQkJCSAgX2dhdGUsIF9mbGFncykJCQlcCisjZGVmaW5lIFNVTlhJX0NDVV9NX1dJVEhfTVVYX1RBQkxFX0dBVEUoX3N0cnVjdCwgX25hbWUsCQkJXAorCQkJCQlfcGFyZW50cywgX3RhYmxlLAkJXAorCQkJCQlfcmVnLAkJCQlcCisJCQkJCV9tc2hpZnQsIF9td2lkdGgsCQlcCisJCQkJCV9tdXhzaGlmdCwgX211eHdpZHRoLAkJXAorCQkJCQlfZ2F0ZSwgX2ZsYWdzKQkJCVwKIAlzdHJ1Y3QgY2N1X2RpdiBfc3RydWN0ID0gewkJCQkJXAogCQkuZW5hYmxlCT0gX2dhdGUsCQkJCQlcCiAJCS5kaXYJPSBfU1VOWElfQ0NVX0RJVihfbXNoaWZ0LCBfbXdpZHRoKSwJCVwKLQkJLm11eAk9IFNVTlhJX0NMS19NVVgoX211eHNoaWZ0LCBfbXV4d2lkdGgpLAkJXAorCQkubXV4CT0gX1NVTlhJX0NDVV9NVVhfVEFCTEUoX211eHNoaWZ0LCBfbXV4d2lkdGgsIF90YWJsZSksIFwKIAkJLmNvbW1vbgk9IHsJCQkJCQlcCiAJCQkucmVnCQk9IF9yZWcsCQkJCVwKIAkJCS5ody5pbml0CT0gQ0xLX0hXX0lOSVRfUEFSRU5UUyhfbmFtZSwJXApAQCAtOTMsMTIgKzEyNiwyMyBAQAogCQl9LAkJCQkJCQlcCiAJfQogCisjZGVmaW5lIFNVTlhJX0NDVV9NX1dJVEhfTVVYX0dBVEUoX3N0cnVjdCwgX25hbWUsIF9wYXJlbnRzLCBfcmVnLAlcCisJCQkJICBfbXNoaWZ0LCBfbXdpZHRoLCBfbXV4c2hpZnQsIF9tdXh3aWR0aCwgXAorCQkJCSAgX2dhdGUsIF9mbGFncykJCQlcCisJU1VOWElfQ0NVX01fV0lUSF9NVVhfVEFCTEVfR0FURShfc3RydWN0LCBfbmFtZSwJCQlcCisJCQkJCV9wYXJlbnRzLCBOVUxMLAkJCVwKKwkJCQkJX3JlZywgX21zaGlmdCwgX213aWR0aCwJCVwKKwkJCQkJX211eHNoaWZ0LCBfbXV4d2lkdGgsCQlcCisJCQkJCV9nYXRlLCBfZmxhZ3MpCisKICNkZWZpbmUgU1VOWElfQ0NVX01fV0lUSF9NVVgoX3N0cnVjdCwgX25hbWUsIF9wYXJlbnRzLCBfcmVnLAkJXAogCQkJICAgICBfbXNoaWZ0LCBfbXdpZHRoLCBfbXV4c2hpZnQsIF9tdXh3aWR0aCwJXAogCQkJICAgICBfZmxhZ3MpCQkJCQlcCi0JU1VOWElfQ0NVX01fV0lUSF9NVVhfR0FURShfc3RydWN0LCBfbmFtZSwgX3BhcmVudHMsIF9yZWcsCVwKLQkJCQkgIF9tc2hpZnQsIF9td2lkdGgsIF9tdXhzaGlmdCwgX211eHdpZHRoLCBcCi0JCQkJICAwLCBfZmxhZ3MpCisJU1VOWElfQ0NVX01fV0lUSF9NVVhfVEFCTEVfR0FURShfc3RydWN0LCBfbmFtZSwJCQlcCisJCQkJCV9wYXJlbnRzLCBOVUxMLAkJCVwKKwkJCQkJX3JlZywgX21zaGlmdCwgX213aWR0aCwJCVwKKwkJCQkJX211eHNoaWZ0LCBfbXV4d2lkdGgsCQlcCisJCQkJCTAsIF9mbGFncykKIAogCiAjZGVmaW5lIFNVTlhJX0NDVV9NX1dJVEhfR0FURShfc3RydWN0LCBfbmFtZSwgX3BhcmVudCwgX3JlZywJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9tcC5jIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X21wLmMKaW5kZXggY2JmMzNlZi4uZWJiMWIzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X21wLmMKKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X21wLmMKQEAgLTIxLDkgKzIxLDkgQEAKIAl1bnNpZ25lZCBpbnQgYmVzdF9tID0gMCwgYmVzdF9wID0gMDsKIAl1bnNpZ25lZCBpbnQgX20sIF9wOwogCi0JZm9yIChfcCA9IDA7IF9wIDw9IG1heF9wOyBfcCsrKSB7CisJZm9yIChfcCA9IDE7IF9wIDw9IG1heF9wOyBfcCA8PD0gMSkgewogCQlmb3IgKF9tID0gMTsgX20gPD0gbWF4X207IF9tKyspIHsKLQkJCXVuc2lnbmVkIGxvbmcgdG1wX3JhdGUgPSAocGFyZW50ID4+IF9wKSAvIF9tOworCQkJdW5zaWduZWQgbG9uZyB0bXBfcmF0ZSA9IHBhcmVudCAvIF9wIC8gX207CiAKIAkJCWlmICh0bXBfcmF0ZSA+IHJhdGUpCiAJCQkJY29udGludWU7CkBAIC00NiwxMyArNDYsMTUgQEAKIAkJCQkgICAgICAgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgY2N1X21wICpjbXAgPSBkYXRhOworCXVuc2lnbmVkIGludCBtYXhfbSwgbWF4X3A7CiAJdW5zaWduZWQgaW50IG0sIHA7CiAKLQljY3VfbXBfZmluZF9iZXN0KHBhcmVudF9yYXRlLCByYXRlLAotCQkJIDEgPDwgY21wLT5tLndpZHRoLCAoMSA8PCBjbXAtPnAud2lkdGgpIC0gMSwKLQkJCSAmbSwgJnApOworCW1heF9tID0gY21wLT5tLm1heCA/OiAxIDw8IGNtcC0+bS53aWR0aDsKKwltYXhfcCA9IGNtcC0+cC5tYXggPzogMSA8PCAoKDEgPDwgY21wLT5wLndpZHRoKSAtIDEpOwogCi0JcmV0dXJuIChwYXJlbnRfcmF0ZSA+PiBwKSAvIG07CisJY2N1X21wX2ZpbmRfYmVzdChwYXJlbnRfcmF0ZSwgcmF0ZSwgbWF4X20sIG1heF9wLCAmbSwgJnApOworCisJcmV0dXJuIHBhcmVudF9yYXRlIC8gcCAvIG07CiB9CiAKIHN0YXRpYyB2b2lkIGNjdV9tcF9kaXNhYmxlKHN0cnVjdCBjbGtfaHcgKmh3KQpAQCAtMTA4LDEzICsxMTAsMTQgQEAKIHsKIAlzdHJ1Y3QgY2N1X21wICpjbXAgPSBod190b19jY3VfbXAoaHcpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1heF9tLCBtYXhfcDsKIAl1bnNpZ25lZCBpbnQgbSwgcDsKIAl1MzIgcmVnOwogCi0JY2N1X21wX2ZpbmRfYmVzdChwYXJlbnRfcmF0ZSwgcmF0ZSwKLQkJCSAxIDw8IGNtcC0+bS53aWR0aCwgKDEgPDwgY21wLT5wLndpZHRoKSAtIDEsCi0JCQkgJm0sICZwKTsKKwltYXhfbSA9IGNtcC0+bS5tYXggPzogMSA8PCBjbXAtPm0ud2lkdGg7CisJbWF4X3AgPSBjbXAtPnAubWF4ID86IDEgPDwgKCgxIDw8IGNtcC0+cC53aWR0aCkgLSAxKTsKIAorCWNjdV9tcF9maW5kX2Jlc3QocGFyZW50X3JhdGUsIHJhdGUsIG1heF9tLCBtYXhfcCwgJm0sICZwKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKGNtcC0+Y29tbW9uLmxvY2ssIGZsYWdzKTsKIApAQCAtMTIyLDcgKzEyNSw3IEBACiAJcmVnICY9IH5HRU5NQVNLKGNtcC0+bS53aWR0aCArIGNtcC0+bS5zaGlmdCAtIDEsIGNtcC0+bS5zaGlmdCk7CiAJcmVnICY9IH5HRU5NQVNLKGNtcC0+cC53aWR0aCArIGNtcC0+cC5zaGlmdCAtIDEsIGNtcC0+cC5zaGlmdCk7CiAKLQl3cml0ZWwocmVnIHwgKHAgPDwgY21wLT5wLnNoaWZ0KSB8ICgobSAtIDEpIDw8IGNtcC0+bS5zaGlmdCksCisJd3JpdGVsKHJlZyB8IChpbG9nMihwKSA8PCBjbXAtPnAuc2hpZnQpIHwgKChtIC0gMSkgPDwgY21wLT5tLnNoaWZ0KSwKIAkgICAgICAgY21wLT5jb21tb24uYmFzZSArIGNtcC0+Y29tbW9uLnJlZyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNtcC0+Y29tbW9uLmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9tcC5oIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X21wLmgKaW5kZXggM2NmMTJiZi4uZWRmOTIxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X21wLmgKKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X21wLmgKQEAgLTQ0LDcgKzQ0LDcgQEAKIAkJLmVuYWJsZQk9IF9nYXRlLAkJCQkJXAogCQkubQk9IF9TVU5YSV9DQ1VfRElWKF9tc2hpZnQsIF9td2lkdGgpLAkJXAogCQkucAk9IF9TVU5YSV9DQ1VfRElWKF9wc2hpZnQsIF9wd2lkdGgpLAkJXAotCQkubXV4CT0gU1VOWElfQ0xLX01VWChfbXV4c2hpZnQsIF9tdXh3aWR0aCksCQlcCisJCS5tdXgJPSBfU1VOWElfQ0NVX01VWChfbXV4c2hpZnQsIF9tdXh3aWR0aCksCQlcCiAJCS5jb21tb24JPSB7CQkJCQkJXAogCQkJLnJlZwkJPSBfcmVnLAkJCQlcCiAJCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFMoX25hbWUsCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9tdWx0LmMgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbXVsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMGU5NDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbXVsdC5jCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IE1heGltZSBSaXBhcmQKKyAqIE1heGltZSBSaXBhcmQgPG1heGltZS5yaXBhcmRAZnJlZS1lbGVjdHJvbnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorCisjaW5jbHVkZSAiY2N1X2dhdGUuaCIKKyNpbmNsdWRlICJjY3VfbXVsdC5oIgorCitzdGF0aWMgdm9pZCBjY3VfbXVsdF9maW5kX2Jlc3QodW5zaWduZWQgbG9uZyBwYXJlbnQsIHVuc2lnbmVkIGxvbmcgcmF0ZSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF4X24sIHVuc2lnbmVkIGludCAqbikKK3sKKwkqbiA9IHJhdGUgLyBwYXJlbnQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNjdV9tdWx0X3JvdW5kX3JhdGUoc3RydWN0IGNjdV9tdXhfaW50ZXJuYWwgKm11eCwKKwkJCQkJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSwKKwkJCQkJdW5zaWduZWQgbG9uZyByYXRlLAorCQkJCQl2b2lkICpkYXRhKQoreworCXN0cnVjdCBjY3VfbXVsdCAqY20gPSBkYXRhOworCXVuc2lnbmVkIGludCBuOworCisJY2N1X211bHRfZmluZF9iZXN0KHBhcmVudF9yYXRlLCByYXRlLCAxIDw8IGNtLT5tdWx0LndpZHRoLCAmbik7CisKKwlyZXR1cm4gcGFyZW50X3JhdGUgKiBuOworfQorCitzdGF0aWMgdm9pZCBjY3VfbXVsdF9kaXNhYmxlKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCBjY3VfbXVsdCAqY20gPSBod190b19jY3VfbXVsdChodyk7CisKKwlyZXR1cm4gY2N1X2dhdGVfaGVscGVyX2Rpc2FibGUoJmNtLT5jb21tb24sIGNtLT5lbmFibGUpOworfQorCitzdGF0aWMgaW50IGNjdV9tdWx0X2VuYWJsZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2N1X211bHQgKmNtID0gaHdfdG9fY2N1X211bHQoaHcpOworCisJcmV0dXJuIGNjdV9nYXRlX2hlbHBlcl9lbmFibGUoJmNtLT5jb21tb24sIGNtLT5lbmFibGUpOworfQorCitzdGF0aWMgaW50IGNjdV9tdWx0X2lzX2VuYWJsZWQoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGNjdV9tdWx0ICpjbSA9IGh3X3RvX2NjdV9tdWx0KGh3KTsKKworCXJldHVybiBjY3VfZ2F0ZV9oZWxwZXJfaXNfZW5hYmxlZCgmY20tPmNvbW1vbiwgY20tPmVuYWJsZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNjdV9tdWx0X3JlY2FsY19yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAorCQkJCQl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKQoreworCXN0cnVjdCBjY3VfbXVsdCAqY20gPSBod190b19jY3VfbXVsdChodyk7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJdTMyIHJlZzsKKworCXJlZyA9IHJlYWRsKGNtLT5jb21tb24uYmFzZSArIGNtLT5jb21tb24ucmVnKTsKKwl2YWwgPSByZWcgPj4gY20tPm11bHQuc2hpZnQ7CisJdmFsICY9ICgxIDw8IGNtLT5tdWx0LndpZHRoKSAtIDE7CisKKwljY3VfbXV4X2hlbHBlcl9hZGp1c3RfcGFyZW50X2Zvcl9wcmVkaXYoJmNtLT5jb21tb24sICZjbS0+bXV4LCAtMSwKKwkJCQkJCSZwYXJlbnRfcmF0ZSk7CisKKwlyZXR1cm4gcGFyZW50X3JhdGUgKiAodmFsICsgMSk7Cit9CisKK3N0YXRpYyBpbnQgY2N1X211bHRfZGV0ZXJtaW5lX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCisJCQkJc3RydWN0IGNsa19yYXRlX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgY2N1X211bHQgKmNtID0gaHdfdG9fY2N1X211bHQoaHcpOworCisJcmV0dXJuIGNjdV9tdXhfaGVscGVyX2RldGVybWluZV9yYXRlKCZjbS0+Y29tbW9uLCAmY20tPm11eCwKKwkJCQkJICAgICByZXEsIGNjdV9tdWx0X3JvdW5kX3JhdGUsIGNtKTsKK30KKworc3RhdGljIGludCBjY3VfbXVsdF9zZXRfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywgdW5zaWduZWQgbG9uZyByYXRlLAorCQkJICAgdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKK3sKKwlzdHJ1Y3QgY2N1X211bHQgKmNtID0gaHdfdG9fY2N1X211bHQoaHcpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG47CisJdTMyIHJlZzsKKworCWNjdV9tdXhfaGVscGVyX2FkanVzdF9wYXJlbnRfZm9yX3ByZWRpdigmY20tPmNvbW1vbiwgJmNtLT5tdXgsIC0xLAorCQkJCQkJJnBhcmVudF9yYXRlKTsKKworCWNjdV9tdWx0X2ZpbmRfYmVzdChwYXJlbnRfcmF0ZSwgcmF0ZSwgMSA8PCBjbS0+bXVsdC53aWR0aCwgJm4pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoY20tPmNvbW1vbi5sb2NrLCBmbGFncyk7CisKKwlyZWcgPSByZWFkbChjbS0+Y29tbW9uLmJhc2UgKyBjbS0+Y29tbW9uLnJlZyk7CisJcmVnICY9IH5HRU5NQVNLKGNtLT5tdWx0LndpZHRoICsgY20tPm11bHQuc2hpZnQgLSAxLCBjbS0+bXVsdC5zaGlmdCk7CisKKwl3cml0ZWwocmVnIHwgKChuIC0gMSkgPDwgY20tPm11bHQuc2hpZnQpLAorCSAgICAgICBjbS0+Y29tbW9uLmJhc2UgKyBjbS0+Y29tbW9uLnJlZyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNtLT5jb21tb24ubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBjY3VfbXVsdF9nZXRfcGFyZW50KHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCBjY3VfbXVsdCAqY20gPSBod190b19jY3VfbXVsdChodyk7CisKKwlyZXR1cm4gY2N1X211eF9oZWxwZXJfZ2V0X3BhcmVudCgmY20tPmNvbW1vbiwgJmNtLT5tdXgpOworfQorCitzdGF0aWMgaW50IGNjdV9tdWx0X3NldF9wYXJlbnQoc3RydWN0IGNsa19odyAqaHcsIHU4IGluZGV4KQoreworCXN0cnVjdCBjY3VfbXVsdCAqY20gPSBod190b19jY3VfbXVsdChodyk7CisKKwlyZXR1cm4gY2N1X211eF9oZWxwZXJfc2V0X3BhcmVudCgmY20tPmNvbW1vbiwgJmNtLT5tdXgsIGluZGV4KTsKK30KKworY29uc3Qgc3RydWN0IGNsa19vcHMgY2N1X211bHRfb3BzID0geworCS5kaXNhYmxlCT0gY2N1X211bHRfZGlzYWJsZSwKKwkuZW5hYmxlCQk9IGNjdV9tdWx0X2VuYWJsZSwKKwkuaXNfZW5hYmxlZAk9IGNjdV9tdWx0X2lzX2VuYWJsZWQsCisKKwkuZ2V0X3BhcmVudAk9IGNjdV9tdWx0X2dldF9wYXJlbnQsCisJLnNldF9wYXJlbnQJPSBjY3VfbXVsdF9zZXRfcGFyZW50LAorCisJLmRldGVybWluZV9yYXRlCT0gY2N1X211bHRfZGV0ZXJtaW5lX3JhdGUsCisJLnJlY2FsY19yYXRlCT0gY2N1X211bHRfcmVjYWxjX3JhdGUsCisJLnNldF9yYXRlCT0gY2N1X211bHRfc2V0X3JhdGUsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X211bHQuaCBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9tdWx0LmgKaW5kZXggNjA5ZGI2Ni4uNWQyYzhkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X211bHQuaAorKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbXVsdC5oCkBAIC0xLDYgKzEsOSBAQAogI2lmbmRlZiBfQ0NVX01VTFRfSF8KICNkZWZpbmUgX0NDVV9NVUxUX0hfCiAKKyNpbmNsdWRlICJjY3VfY29tbW9uLmgiCisjaW5jbHVkZSAiY2N1X211eC5oIgorCiBzdHJ1Y3QgX2NjdV9tdWx0IHsKIAl1OAlzaGlmdDsKIAl1OAl3aWR0aDsKQEAgLTEyLDQgKzE1LDM2IEBACiAJCS53aWR0aAk9IF93aWR0aCwJCVwKIAl9CiAKK3N0cnVjdCBjY3VfbXVsdCB7CisJdTMyCQkJZW5hYmxlOworCisJc3RydWN0IF9jY3VfbXVsdAltdWx0OworCXN0cnVjdCBjY3VfbXV4X2ludGVybmFsCW11eDsKKwlzdHJ1Y3QgY2N1X2NvbW1vbgljb21tb247Cit9OworCisjZGVmaW5lIFNVTlhJX0NDVV9OX1dJVEhfR0FURV9MT0NLKF9zdHJ1Y3QsIF9uYW1lLCBfcGFyZW50LCBfcmVnLAlcCisJCQkJICAgX21zaGlmdCwgX213aWR0aCwgX2dhdGUsIF9sb2NrLAlcCisJCQkJICAgX2ZsYWdzKQkJCQlcCisJc3RydWN0IGNjdV9tdWx0IF9zdHJ1Y3QgPSB7CQkJCQlcCisJCS5lbmFibGUJPSBfZ2F0ZSwJCQkJCVwKKwkJLm11bHQJPSBfU1VOWElfQ0NVX01VTFQoX21zaGlmdCwgX213aWR0aCksCQlcCisJCS5jb21tb24JPSB7CQkJCQkJXAorCQkJLnJlZwkJPSBfcmVnLAkJCQlcCisJCQkuaHcuaW5pdAk9IENMS19IV19JTklUKF9uYW1lLAkJXAorCQkJCQkJICAgICAgX3BhcmVudCwJCVwKKwkJCQkJCSAgICAgICZjY3VfbXVsdF9vcHMsCVwKKwkJCQkJCSAgICAgIF9mbGFncyksCQlcCisJCX0sCQkJCQkJCVwKKwl9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNjdV9tdWx0ICpod190b19jY3VfbXVsdChzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2N1X2NvbW1vbiAqY29tbW9uID0gaHdfdG9fY2N1X2NvbW1vbihodyk7CisKKwlyZXR1cm4gY29udGFpbmVyX29mKGNvbW1vbiwgc3RydWN0IGNjdV9tdWx0LCBjb21tb24pOworfQorCitleHRlcm4gY29uc3Qgc3RydWN0IGNsa19vcHMgY2N1X211bHRfb3BzOworCiAjZW5kaWYgLyogX0NDVV9NVUxUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbXV4LmMgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbXV4LmMKaW5kZXggNThmYzM2ZS4uYTQzYWQ1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X211eC5jCisrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9tdXguYwpAQCAtOCw3ICs4LDkgQEAKICAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSAiY2N1X2dhdGUuaCIKICNpbmNsdWRlICJjY3VfbXV4LmgiCkBAIC0xOCw4ICsyMCw5IEBACiAJCQkJCSAgICAgaW50IHBhcmVudF9pbmRleCwKIAkJCQkJICAgICB1bnNpZ25lZCBsb25nICpwYXJlbnRfcmF0ZSkKIHsKLQl1OCBwcmVkaXYgPSAxOworCXUxNiBwcmVkaXYgPSAxOwogCXUzMiByZWc7CisJaW50IGk7CiAKIAlpZiAoISgoY29tbW9uLT5mZWF0dXJlcyAmIENDVV9GRUFUVVJFX0ZJWEVEX1BSRURJVikgfHwKIAkgICAgICAoY29tbW9uLT5mZWF0dXJlcyAmIENDVV9GRUFUVVJFX1ZBUklBQkxFX1BSRURJVikpKQpAQCAtMzIsOCArMzUsOSBAQAogCX0KIAogCWlmIChjb21tb24tPmZlYXR1cmVzICYgQ0NVX0ZFQVRVUkVfRklYRURfUFJFRElWKQotCQlpZiAocGFyZW50X2luZGV4ID09IGNtLT5maXhlZF9wcmVkaXYuaW5kZXgpCi0JCQlwcmVkaXYgPSBjbS0+Zml4ZWRfcHJlZGl2LmRpdjsKKwkJZm9yIChpID0gMDsgaSA8IGNtLT5uX3ByZWRpdnM7IGkrKykKKwkJCWlmIChwYXJlbnRfaW5kZXggPT0gY20tPmZpeGVkX3ByZWRpdnNbaV0uaW5kZXgpCisJCQkJcHJlZGl2ID0gY20tPmZpeGVkX3ByZWRpdnNbaV0uZGl2OwogCiAJaWYgKGNvbW1vbi0+ZmVhdHVyZXMgJiBDQ1VfRkVBVFVSRV9WQVJJQUJMRV9QUkVESVYpCiAJCWlmIChwYXJlbnRfaW5kZXggPT0gY20tPnZhcmlhYmxlX3ByZWRpdi5pbmRleCkgewpAQCAtMTA3LDYgKzExMSwxNSBAQAogCXBhcmVudCA9IHJlZyA+PiBjbS0+c2hpZnQ7CiAJcGFyZW50ICY9ICgxIDw8IGNtLT53aWR0aCkgLSAxOwogCisJaWYgKGNtLT50YWJsZSkgeworCQlpbnQgbnVtX3BhcmVudHMgPSBjbGtfaHdfZ2V0X251bV9wYXJlbnRzKCZjb21tb24tPmh3KTsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IG51bV9wYXJlbnRzOyBpKyspCisJCQlpZiAoY20tPnRhYmxlW2ldID09IHBhcmVudCkKKwkJCQlyZXR1cm4gaTsKKwl9CisKIAlyZXR1cm4gcGFyZW50OwogfQogCkBAIC0xMTcsNiArMTMwLDkgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiByZWc7CiAKKwlpZiAoY20tPnRhYmxlKQorCQlpbmRleCA9IGNtLT50YWJsZVtpbmRleF07CisKIAlzcGluX2xvY2tfaXJxc2F2ZShjb21tb24tPmxvY2ssIGZsYWdzKTsKIAogCXJlZyA9IHJlYWRsKGNvbW1vbi0+YmFzZSArIGNvbW1vbi0+cmVnKTsKQEAgLTE4NSwzICsyMDEsMzcgQEAKIAkuZGV0ZXJtaW5lX3JhdGUJPSBfX2Nsa19tdXhfZGV0ZXJtaW5lX3JhdGUsCiAJLnJlY2FsY19yYXRlCT0gY2N1X211eF9yZWNhbGNfcmF0ZSwKIH07CisKKy8qCisgKiBUaGlzIGNsb2NrIG5vdGlmaWVyIGlzIGNhbGxlZCB3aGVuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIG9mIHRoZSBwYXJlbnQKKyAqIFBMTCBjbG9jayBpcyB0byBiZSBjaGFuZ2VkLiBUaGUgaWRlYSBpcyB0byBzd2l0Y2ggdGhlIHBhcmVudCB0byBhCisgKiBzdGFibGUgY2xvY2ssIHN1Y2ggYXMgdGhlIG1haW4gb3NjaWxsYXRvciwgd2hpbGUgdGhlIFBMTCBmcmVxdWVuY3kKKyAqIHN0YWJpbGl6ZXMuCisgKi8KK3N0YXRpYyBpbnQgY2N1X211eF9ub3RpZmllcl9jYihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNjdV9tdXhfbmIgKm11eCA9IHRvX2NjdV9tdXhfbmIobmIpOworCWludCByZXQgPSAwOworCisJaWYgKGV2ZW50ID09IFBSRV9SQVRFX0NIQU5HRSkgeworCQltdXgtPm9yaWdpbmFsX2luZGV4ID0gY2N1X211eF9oZWxwZXJfZ2V0X3BhcmVudChtdXgtPmNvbW1vbiwKKwkJCQkJCQkJbXV4LT5jbSk7CisJCXJldCA9IGNjdV9tdXhfaGVscGVyX3NldF9wYXJlbnQobXV4LT5jb21tb24sIG11eC0+Y20sCisJCQkJCQltdXgtPmJ5cGFzc19pbmRleCk7CisJfSBlbHNlIGlmIChldmVudCA9PSBQT1NUX1JBVEVfQ0hBTkdFKSB7CisJCXJldCA9IGNjdV9tdXhfaGVscGVyX3NldF9wYXJlbnQobXV4LT5jb21tb24sIG11eC0+Y20sCisJCQkJCQltdXgtPm9yaWdpbmFsX2luZGV4KTsKKwl9CisKKwl1ZGVsYXkobXV4LT5kZWxheV91cyk7CisKKwlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubyhyZXQpOworfQorCitpbnQgY2N1X211eF9ub3RpZmllcl9yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBjY3VfbXV4X25iICptdXhfbmIpCit7CisJbXV4X25iLT5jbGtfbmIubm90aWZpZXJfY2FsbCA9IGNjdV9tdXhfbm90aWZpZXJfY2I7CisKKwlyZXR1cm4gY2xrX25vdGlmaWVyX3JlZ2lzdGVyKGNsaywgJm11eF9uYi0+Y2xrX25iKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9tdXguaCBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9tdXguaAppbmRleCA5NDUwODI2Li40N2FiYTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbXV4LmgKKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X211eC5oCkBAIC01LDE0ICs1LDE4IEBACiAKICNpbmNsdWRlICJjY3VfY29tbW9uLmgiCiAKLXN0cnVjdCBjY3VfbXV4X2ludGVybmFsIHsKLQl1OAlzaGlmdDsKLQl1OAl3aWR0aDsKK3N0cnVjdCBjY3VfbXV4X2ZpeGVkX3ByZWRpdiB7CisJdTgJaW5kZXg7CisJdTE2CWRpdjsKK307CiAKLQlzdHJ1Y3QgewotCQl1OAlpbmRleDsKLQkJdTgJZGl2OwotCX0gZml4ZWRfcHJlZGl2Oworc3RydWN0IGNjdV9tdXhfaW50ZXJuYWwgeworCXU4CQlzaGlmdDsKKwl1OAkJd2lkdGg7CisJY29uc3QgdTgJKnRhYmxlOworCisJY29uc3Qgc3RydWN0IGNjdV9tdXhfZml4ZWRfcHJlZGl2CSpmaXhlZF9wcmVkaXZzOworCXU4CQluX3ByZWRpdnM7CiAKIAlzdHJ1Y3QgewogCQl1OAlpbmRleDsKQEAgLTIxLDEyICsyNSwxNiBAQAogCX0gdmFyaWFibGVfcHJlZGl2OwogfTsKIAotI2RlZmluZSBTVU5YSV9DTEtfTVVYKF9zaGlmdCwgX3dpZHRoKQlcCi0JewkJCQkJXAotCQkuc2hpZnQJPSBfc2hpZnQsCQlcCi0JCS53aWR0aAk9IF93aWR0aCwJCVwKKyNkZWZpbmUgX1NVTlhJX0NDVV9NVVhfVEFCTEUoX3NoaWZ0LCBfd2lkdGgsIF90YWJsZSkJXAorCXsJCQkJCQlcCisJCS5zaGlmdAk9IF9zaGlmdCwJCQlcCisJCS53aWR0aAk9IF93aWR0aCwJCQlcCisJCS50YWJsZQk9IF90YWJsZSwJCQlcCiAJfQogCisjZGVmaW5lIF9TVU5YSV9DQ1VfTVVYKF9zaGlmdCwgX3dpZHRoKSBcCisJX1NVTlhJX0NDVV9NVVhfVEFCTEUoX3NoaWZ0LCBfd2lkdGgsIE5VTEwpCisKIHN0cnVjdCBjY3VfbXV4IHsKIAl1MTYJCQlyZWc7CiAJdTMyCQkJZW5hYmxlOwpAQCAtMzUsOSArNDMsMTIgQEAKIAlzdHJ1Y3QgY2N1X2NvbW1vbgljb21tb247CiB9OwogCi0jZGVmaW5lIFNVTlhJX0NDVV9NVVgoX3N0cnVjdCwgX25hbWUsIF9wYXJlbnRzLCBfcmVnLCBfc2hpZnQsIF93aWR0aCwgX2ZsYWdzKSBcCisjZGVmaW5lIFNVTlhJX0NDVV9NVVhfVEFCTEVfV0lUSF9HQVRFKF9zdHJ1Y3QsIF9uYW1lLCBfcGFyZW50cywgX3RhYmxlLAlcCisJCQkJICAgICBfcmVnLCBfc2hpZnQsIF93aWR0aCwgX2dhdGUsCVwKKwkJCQkgICAgIF9mbGFncykJCQkJXAogCXN0cnVjdCBjY3VfbXV4IF9zdHJ1Y3QgPSB7CQkJCQlcCi0JCS5tdXgJPSBTVU5YSV9DTEtfTVVYKF9zaGlmdCwgX3dpZHRoKSwJCVwKKwkJLmVuYWJsZQk9IF9nYXRlLAkJCQkJXAorCQkubXV4CT0gX1NVTlhJX0NDVV9NVVhfVEFCTEUoX3NoaWZ0LCBfd2lkdGgsIF90YWJsZSksCVwKIAkJLmNvbW1vbgk9IHsJCQkJCQlcCiAJCQkucmVnCQk9IF9yZWcsCQkJCVwKIAkJCS5ody5pbml0CT0gQ0xLX0hXX0lOSVRfUEFSRU5UUyhfbmFtZSwJXApAQCAtNDksMTcgKzYwLDE0IEBACiAKICNkZWZpbmUgU1VOWElfQ0NVX01VWF9XSVRIX0dBVEUoX3N0cnVjdCwgX25hbWUsIF9wYXJlbnRzLCBfcmVnLAkJXAogCQkJCV9zaGlmdCwgX3dpZHRoLCBfZ2F0ZSwgX2ZsYWdzKQkJXAotCXN0cnVjdCBjY3VfbXV4IF9zdHJ1Y3QgPSB7CQkJCQlcCi0JCS5lbmFibGUJPSBfZ2F0ZSwJCQkJCVwKLQkJLm11eAk9IFNVTlhJX0NMS19NVVgoX3NoaWZ0LCBfd2lkdGgpLAkJXAotCQkuY29tbW9uCT0gewkJCQkJCVwKLQkJCS5yZWcJCT0gX3JlZywJCQkJXAotCQkJLmh3LmluaXQJPSBDTEtfSFdfSU5JVF9QQVJFTlRTKF9uYW1lLAlcCi0JCQkJCQkJICAgICAgX3BhcmVudHMsIFwKLQkJCQkJCQkgICAgICAmY2N1X211eF9vcHMsIFwKLQkJCQkJCQkgICAgICBfZmxhZ3MpLAlcCi0JCX0JCQkJCQkJXAotCX0KKwlTVU5YSV9DQ1VfTVVYX1RBQkxFX1dJVEhfR0FURShfc3RydWN0LCBfbmFtZSwgX3BhcmVudHMsIE5VTEwsCVwKKwkJCQkgICAgICBfcmVnLCBfc2hpZnQsIF93aWR0aCwgX2dhdGUsCVwKKwkJCQkgICAgICBfZmxhZ3MpCisKKyNkZWZpbmUgU1VOWElfQ0NVX01VWChfc3RydWN0LCBfbmFtZSwgX3BhcmVudHMsIF9yZWcsIF9zaGlmdCwgX3dpZHRoLAlcCisJCSAgICAgIF9mbGFncykJCQkJCQlcCisJU1VOWElfQ0NVX01VWF9UQUJMRV9XSVRIX0dBVEUoX3N0cnVjdCwgX25hbWUsIF9wYXJlbnRzLCBOVUxMLAlcCisJCQkJICAgICAgX3JlZywgX3NoaWZ0LCBfd2lkdGgsIDAsIF9mbGFncykKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgY2N1X211eCAqaHdfdG9fY2N1X211eChzdHJ1Y3QgY2xrX2h3ICpodykKIHsKQEAgLTg4LDQgKzk2LDE4IEBACiAJCQkgICAgICBzdHJ1Y3QgY2N1X211eF9pbnRlcm5hbCAqY20sCiAJCQkgICAgICB1OCBpbmRleCk7CiAKK3N0cnVjdCBjY3VfbXV4X25iIHsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sJY2xrX25iOworCXN0cnVjdCBjY3VfY29tbW9uCSpjb21tb247CisJc3RydWN0IGNjdV9tdXhfaW50ZXJuYWwJKmNtOworCisJdTMyCWRlbGF5X3VzOwkvKiBIb3cgbWFueSB1cyB0byB3YWl0IGFmdGVyIHJlcGFyZW50aW5nICovCisJdTgJYnlwYXNzX2luZGV4OwkvKiBXaGljaCBwYXJlbnQgdG8gdGVtcG9yYXJpbHkgdXNlICovCisJdTgJb3JpZ2luYWxfaW5kZXg7CS8qIFRoaXMgaXMgc2V0IGJ5IHRoZSBub3RpZmllciBjYWxsYmFjayAqLworfTsKKworI2RlZmluZSB0b19jY3VfbXV4X25iKF9uYikgY29udGFpbmVyX29mKF9uYiwgc3RydWN0IGNjdV9tdXhfbmIsIGNsa19uYikKKworaW50IGNjdV9tdXhfbm90aWZpZXJfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2N1X211eF9uYiAqbXV4X25iKTsKKwogI2VuZGlmIC8qIF9DQ1VfTVVYX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbmsuYyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9uay5jCmluZGV4IDQ0NzBmZmMuLmQ2ZmFmYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9uay5jCisrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9uay5jCkBAIC0xNCw5ICsxNCw5IEBACiAjaW5jbHVkZSAiY2N1X2dhdGUuaCIKICNpbmNsdWRlICJjY3VfbmsuaCIKIAotdm9pZCBjY3VfbmtfZmluZF9iZXN0KHVuc2lnbmVkIGxvbmcgcGFyZW50LCB1bnNpZ25lZCBsb25nIHJhdGUsCi0JCSAgICAgIHVuc2lnbmVkIGludCBtYXhfbiwgdW5zaWduZWQgaW50IG1heF9rLAotCQkgICAgICB1bnNpZ25lZCBpbnQgKm4sIHVuc2lnbmVkIGludCAqaykKK3N0YXRpYyB2b2lkIGNjdV9ua19maW5kX2Jlc3QodW5zaWduZWQgbG9uZyBwYXJlbnQsIHVuc2lnbmVkIGxvbmcgcmF0ZSwKKwkJCSAgICAgdW5zaWduZWQgaW50IG1heF9uLCB1bnNpZ25lZCBpbnQgbWF4X2ssCisJCQkgICAgIHVuc2lnbmVkIGludCAqbiwgdW5zaWduZWQgaW50ICprKQogewogCXVuc2lnbmVkIGxvbmcgYmVzdF9yYXRlID0gMDsKIAl1bnNpZ25lZCBpbnQgYmVzdF9rID0gMCwgYmVzdF9uID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9ua20uYyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9ua20uYwppbmRleCAyMDcxODIyLi4wNTlmZGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbmttLmMKKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X25rbS5jCkBAIC05MywxOSArOTMsMzAgQEAKIAlyZXR1cm4gcGFyZW50X3JhdGUgKiAobiArIDEpICogKGsgKyAxKSAvIChtICsgMSk7CiB9CiAKLXN0YXRpYyBsb25nIGNjdV9ua21fcm91bmRfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywgdW5zaWduZWQgbG9uZyByYXRlLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyAqcGFyZW50X3JhdGUpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjY3VfbmttX3JvdW5kX3JhdGUoc3RydWN0IGNjdV9tdXhfaW50ZXJuYWwgKm11eCwKKwkJCQkJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSwKKwkJCQkJdW5zaWduZWQgbG9uZyByYXRlLAorCQkJCQl2b2lkICpkYXRhKQogewotCXN0cnVjdCBjY3VfbmttICpua20gPSBod190b19jY3VfbmttKGh3KTsKKwlzdHJ1Y3QgY2N1X25rbSAqbmttID0gZGF0YTsKIAlzdHJ1Y3QgX2NjdV9ua20gX25rbTsKIAogCV9ua20ubWF4X24gPSAxIDw8IG5rbS0+bi53aWR0aDsKIAlfbmttLm1heF9rID0gMSA8PCBua20tPmsud2lkdGg7Ci0JX25rbS5tYXhfbSA9IDEgPDwgbmttLT5tLndpZHRoOworCV9ua20ubWF4X20gPSBua20tPm0ubWF4ID86IDEgPDwgbmttLT5tLndpZHRoOwogCi0JY2N1X25rbV9maW5kX2Jlc3QoKnBhcmVudF9yYXRlLCByYXRlLCAmX25rbSk7CisJY2N1X25rbV9maW5kX2Jlc3QocGFyZW50X3JhdGUsIHJhdGUsICZfbmttKTsKIAotCXJldHVybiAqcGFyZW50X3JhdGUgKiBfbmttLm4gKiBfbmttLmsgLyBfbmttLm07CisJcmV0dXJuIHBhcmVudF9yYXRlICogX25rbS5uICogX25rbS5rIC8gX25rbS5tOworfQorCitzdGF0aWMgaW50IGNjdV9ua21fZGV0ZXJtaW5lX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCisJCQkJICBzdHJ1Y3QgY2xrX3JhdGVfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBjY3VfbmttICpua20gPSBod190b19jY3VfbmttKGh3KTsKKworCXJldHVybiBjY3VfbXV4X2hlbHBlcl9kZXRlcm1pbmVfcmF0ZSgmbmttLT5jb21tb24sICZua20tPm11eCwKKwkJCQkJICAgICByZXEsIGNjdV9ua21fcm91bmRfcmF0ZSwgbmttKTsKIH0KIAogc3RhdGljIGludCBjY3VfbmttX3NldF9yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LCB1bnNpZ25lZCBsb25nIHJhdGUsCkBAIC0xMTgsNyArMTI5LDcgQEAKIAogCV9ua20ubWF4X24gPSAxIDw8IG5rbS0+bi53aWR0aDsKIAlfbmttLm1heF9rID0gMSA8PCBua20tPmsud2lkdGg7Ci0JX25rbS5tYXhfbSA9IDEgPDwgbmttLT5tLndpZHRoOworCV9ua20ubWF4X20gPSBua20tPm0ubWF4ID86IDEgPDwgbmttLT5tLndpZHRoOwogCiAJY2N1X25rbV9maW5kX2Jlc3QocGFyZW50X3JhdGUsIHJhdGUsICZfbmttKTsKIApAQCAtMTQyLDEyICsxNTMsMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHU4IGNjdV9ua21fZ2V0X3BhcmVudChzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2N1X25rbSAqbmttID0gaHdfdG9fY2N1X25rbShodyk7CisKKwlyZXR1cm4gY2N1X211eF9oZWxwZXJfZ2V0X3BhcmVudCgmbmttLT5jb21tb24sICZua20tPm11eCk7Cit9CisKK3N0YXRpYyBpbnQgY2N1X25rbV9zZXRfcGFyZW50KHN0cnVjdCBjbGtfaHcgKmh3LCB1OCBpbmRleCkKK3sKKwlzdHJ1Y3QgY2N1X25rbSAqbmttID0gaHdfdG9fY2N1X25rbShodyk7CisKKwlyZXR1cm4gY2N1X211eF9oZWxwZXJfc2V0X3BhcmVudCgmbmttLT5jb21tb24sICZua20tPm11eCwgaW5kZXgpOworfQorCiBjb25zdCBzdHJ1Y3QgY2xrX29wcyBjY3VfbmttX29wcyA9IHsKIAkuZGlzYWJsZQk9IGNjdV9ua21fZGlzYWJsZSwKIAkuZW5hYmxlCQk9IGNjdV9ua21fZW5hYmxlLAogCS5pc19lbmFibGVkCT0gY2N1X25rbV9pc19lbmFibGVkLAogCisJLmdldF9wYXJlbnQJPSBjY3VfbmttX2dldF9wYXJlbnQsCisJLnNldF9wYXJlbnQJPSBjY3VfbmttX3NldF9wYXJlbnQsCisKKwkuZGV0ZXJtaW5lX3JhdGUJPSBjY3VfbmttX2RldGVybWluZV9yYXRlLAogCS5yZWNhbGNfcmF0ZQk9IGNjdV9ua21fcmVjYWxjX3JhdGUsCi0JLnJvdW5kX3JhdGUJPSBjY3VfbmttX3JvdW5kX3JhdGUsCiAJLnNldF9yYXRlCT0gY2N1X25rbV9zZXRfcmF0ZSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbmttLmggYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbmttLmgKaW5kZXggMTkzNmFjMS4uMzU0OTNmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X25rbS5oCisrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9ua20uaApAQCAtMzIsMTAgKzMyLDMzIEBACiAJc3RydWN0IF9jY3VfbXVsdAluOwogCXN0cnVjdCBfY2N1X211bHQJazsKIAlzdHJ1Y3QgX2NjdV9kaXYJCW07CisJc3RydWN0IGNjdV9tdXhfaW50ZXJuYWwJbXV4OwogCiAJc3RydWN0IGNjdV9jb21tb24JY29tbW9uOwogfTsKIAorI2RlZmluZSBTVU5YSV9DQ1VfTktNX1dJVEhfTVVYX0dBVEVfTE9DSyhfc3RydWN0LCBfbmFtZSwgX3BhcmVudHMsIF9yZWcsIFwKKwkJCQkJIF9uc2hpZnQsIF9ud2lkdGgsCQlcCisJCQkJCSBfa3NoaWZ0LCBfa3dpZHRoLAkJXAorCQkJCQkgX21zaGlmdCwgX213aWR0aCwJCVwKKwkJCQkJIF9tdXhzaGlmdCwgX211eHdpZHRoLAkJXAorCQkJCQkgX2dhdGUsIF9sb2NrLCBfZmxhZ3MpCQlcCisJc3RydWN0IGNjdV9ua20gX3N0cnVjdCA9IHsJCQkJCVwKKwkJLmVuYWJsZQkJPSBfZ2F0ZSwJCQkJXAorCQkubG9jawkJPSBfbG9jaywJCQkJXAorCQkuawkJPSBfU1VOWElfQ0NVX01VTFQoX2tzaGlmdCwgX2t3aWR0aCksCVwKKwkJLm4JCT0gX1NVTlhJX0NDVV9NVUxUKF9uc2hpZnQsIF9ud2lkdGgpLAlcCisJCS5tCQk9IF9TVU5YSV9DQ1VfRElWKF9tc2hpZnQsIF9td2lkdGgpLAlcCisJCS5tdXgJCT0gX1NVTlhJX0NDVV9NVVgoX211eHNoaWZ0LCBfbXV4d2lkdGgpLAlcCisJCS5jb21tb24JCT0gewkJCQkJXAorCQkJLnJlZwkJPSBfcmVnLAkJCQlcCisJCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFMoX25hbWUsCVwKKwkJCQkJCSAgICAgIF9wYXJlbnRzLAkJXAorCQkJCQkJICAgICAgJmNjdV9ua21fb3BzLAlcCisJCQkJCQkgICAgICBfZmxhZ3MpLAkJXAorCQl9LAkJCQkJCQlcCisJfQorCiAjZGVmaW5lIFNVTlhJX0NDVV9OS01fV0lUSF9HQVRFX0xPQ0soX3N0cnVjdCwgX25hbWUsIF9wYXJlbnQsIF9yZWcsCVwKIAkJCQkgICAgIF9uc2hpZnQsIF9ud2lkdGgsCQkJXAogCQkJCSAgICAgX2tzaGlmdCwgX2t3aWR0aCwJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbmttcC5jIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X25rbXAuYwppbmRleCA5ZjJiOThlLi45NzY5ZGVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbmttcC5jCisrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9ua21wLmMKQEAgLTI5LDE0ICsyOSwxNCBAQAogCXVuc2lnbmVkIGxvbmcgX24sIF9rLCBfbSwgX3A7CiAKIAlmb3IgKF9rID0gMTsgX2sgPD0gbmttcC0+bWF4X2s7IF9rKyspIHsKLQkJZm9yIChfcCA9IDA7IF9wIDw9IG5rbXAtPm1heF9wOyBfcCsrKSB7CisJCWZvciAoX3AgPSAxOyBfcCA8PSBua21wLT5tYXhfcDsgX3AgPDw9IDEpIHsKIAkJCXVuc2lnbmVkIGxvbmcgdG1wX3JhdGU7CiAKLQkJCXJhdGlvbmFsX2Jlc3RfYXBwcm94aW1hdGlvbihyYXRlIC8gX2ssIHBhcmVudCA+PiBfcCwKKwkJCXJhdGlvbmFsX2Jlc3RfYXBwcm94aW1hdGlvbihyYXRlIC8gX2ssIHBhcmVudCAvIF9wLAogCQkJCQkJICAgIG5rbXAtPm1heF9uLCBua21wLT5tYXhfbSwKIAkJCQkJCSAgICAmX24sICZfbSk7CiAKLQkJCXRtcF9yYXRlID0gKHBhcmVudCAqIF9uICogX2sgPj4gX3ApIC8gX207CisJCQl0bXBfcmF0ZSA9IHBhcmVudCAqIF9uICogX2sgLyAoX20gKiBfcCk7CiAKIAkJCWlmICh0bXBfcmF0ZSA+IHJhdGUpCiAJCQkJY29udGludWU7CkBAIC0xMTAsMTMgKzExMCwxMiBAQAogCiAJX25rbXAubWF4X24gPSAxIDw8IG5rbXAtPm4ud2lkdGg7CiAJX25rbXAubWF4X2sgPSAxIDw8IG5rbXAtPmsud2lkdGg7Ci0JX25rbXAubWF4X20gPSAxIDw8IG5rbXAtPm0ud2lkdGg7Ci0JX25rbXAubWF4X3AgPSAoMSA8PCBua21wLT5wLndpZHRoKSAtIDE7CisJX25rbXAubWF4X20gPSBua21wLT5tLm1heCA/OiAxIDw8IG5rbXAtPm0ud2lkdGg7CisJX25rbXAubWF4X3AgPSBua21wLT5wLm1heCA/OiAxIDw8ICgoMSA8PCBua21wLT5wLndpZHRoKSAtIDEpOwogCi0JY2N1X25rbXBfZmluZF9iZXN0KCpwYXJlbnRfcmF0ZSwgcmF0ZSwKLQkJCSAgICZfbmttcCk7CisJY2N1X25rbXBfZmluZF9iZXN0KCpwYXJlbnRfcmF0ZSwgcmF0ZSwgJl9ua21wKTsKIAotCXJldHVybiAoKnBhcmVudF9yYXRlICogX25rbXAubiAqIF9ua21wLmsgPj4gX25rbXAucCkgLyBfbmttcC5tOworCXJldHVybiAqcGFyZW50X3JhdGUgKiBfbmttcC5uICogX25rbXAuayAvIChfbmttcC5tICogX25rbXAucCk7CiB9CiAKIHN0YXRpYyBpbnQgY2N1X25rbXBfc2V0X3JhdGUoc3RydWN0IGNsa19odyAqaHcsIHVuc2lnbmVkIGxvbmcgcmF0ZSwKQEAgLTEyOSw4ICsxMjgsOCBAQAogCiAJX25rbXAubWF4X24gPSAxIDw8IG5rbXAtPm4ud2lkdGg7CiAJX25rbXAubWF4X2sgPSAxIDw8IG5rbXAtPmsud2lkdGg7Ci0JX25rbXAubWF4X20gPSAxIDw8IG5rbXAtPm0ud2lkdGg7Ci0JX25rbXAubWF4X3AgPSAoMSA8PCBua21wLT5wLndpZHRoKSAtIDE7CisJX25rbXAubWF4X20gPSBua21wLT5tLm1heCA/OiAxIDw8IG5rbXAtPm0ud2lkdGg7CisJX25rbXAubWF4X3AgPSBua21wLT5wLm1heCA/OiAxIDw8ICgoMSA8PCBua21wLT5wLndpZHRoKSAtIDEpOwogCiAJY2N1X25rbXBfZmluZF9iZXN0KHBhcmVudF9yYXRlLCByYXRlLCAmX25rbXApOwogCkBAIC0xNDUsNyArMTQ0LDcgQEAKIAlyZWcgfD0gKF9ua21wLm4gLSAxKSA8PCBua21wLT5uLnNoaWZ0OwogCXJlZyB8PSAoX25rbXAuayAtIDEpIDw8IG5rbXAtPmsuc2hpZnQ7CiAJcmVnIHw9IChfbmttcC5tIC0gMSkgPDwgbmttcC0+bS5zaGlmdDsKLQlyZWcgfD0gX25rbXAucCA8PCBua21wLT5wLnNoaWZ0OworCXJlZyB8PSBpbG9nMihfbmttcC5wKSA8PCBua21wLT5wLnNoaWZ0OwogCiAJd3JpdGVsKHJlZywgbmttcC0+Y29tbW9uLmJhc2UgKyBua21wLT5jb21tb24ucmVnKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X25tLmMgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Vfbm0uYwppbmRleCBlMzVkZGQ4Li5iNjFiZGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Vfbm0uYworKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Vfbm0uYwpAQCAtNjEsMTEgKzYxLDEzIEBACiAJCQkgICAgICB1bnNpZ25lZCBsb25nICpwYXJlbnRfcmF0ZSkKIHsKIAlzdHJ1Y3QgY2N1X25tICpubSA9IGh3X3RvX2NjdV9ubShodyk7CisJdW5zaWduZWQgbG9uZyBtYXhfbiwgbWF4X207CiAJdW5zaWduZWQgbG9uZyBuLCBtOwogCi0JcmF0aW9uYWxfYmVzdF9hcHByb3hpbWF0aW9uKHJhdGUsICpwYXJlbnRfcmF0ZSwKLQkJCQkgICAgMSA8PCBubS0+bi53aWR0aCwgMSA8PCBubS0+bS53aWR0aCwKLQkJCQkgICAgJm4sICZtKTsKKwltYXhfbiA9IDEgPDwgbm0tPm4ud2lkdGg7CisJbWF4X20gPSBubS0+bS5tYXggPzogMSA8PCBubS0+bS53aWR0aDsKKworCXJhdGlvbmFsX2Jlc3RfYXBwcm94aW1hdGlvbihyYXRlLCAqcGFyZW50X3JhdGUsIG1heF9uLCBtYXhfbSwgJm4sICZtKTsKIAogCXJldHVybiAqcGFyZW50X3JhdGUgKiBuIC8gbTsKIH0KQEAgLTc1LDYgKzc3LDcgQEAKIHsKIAlzdHJ1Y3QgY2N1X25tICpubSA9IGh3X3RvX2NjdV9ubShodyk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIG1heF9uLCBtYXhfbTsKIAl1bnNpZ25lZCBsb25nIG4sIG07CiAJdTMyIHJlZzsKIApAQCAtODMsOSArODYsMTAgQEAKIAllbHNlCiAJCWNjdV9mcmFjX2hlbHBlcl9kaXNhYmxlKCZubS0+Y29tbW9uLCAmbm0tPmZyYWMpOwogCi0JcmF0aW9uYWxfYmVzdF9hcHByb3hpbWF0aW9uKHJhdGUsIHBhcmVudF9yYXRlLAotCQkJCSAgICAxIDw8IG5tLT5uLndpZHRoLCAxIDw8IG5tLT5tLndpZHRoLAotCQkJCSAgICAmbiwgJm0pOworCW1heF9uID0gMSA8PCBubS0+bi53aWR0aDsKKwltYXhfbSA9IG5tLT5tLm1heCA/OiAxIDw8IG5tLT5tLndpZHRoOworCisJcmF0aW9uYWxfYmVzdF9hcHByb3hpbWF0aW9uKHJhdGUsIHBhcmVudF9yYXRlLCBtYXhfbiwgbWF4X20sICZuLCAmbSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZShubS0+Y29tbW9uLmxvY2ssIGZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGkvY2xrLWExMC1wbGwyLmMgYi9kcml2ZXJzL2Nsay9zdW54aS9jbGstYTEwLXBsbDIuYwppbmRleCAwZWUxZjM2Li5kOGVhYjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9zdW54aS9jbGstYTEwLXBsbDIuYworKysgYi9kcml2ZXJzL2Nsay9zdW54aS9jbGstYTEwLXBsbDIuYwpAQCAtNzMsNyArNzMsNyBAQAogCQkJCQkgIFNVTjRJX1BMTDJfUFJFX0RJVl9XSURUSCwKIAkJCQkJICBDTEtfRElWSURFUl9PTkVfQkFTRUQgfCBDTEtfRElWSURFUl9BTExPV19aRVJPLAogCQkJCQkgICZzdW40aV9hMTBfcGxsMl9sb2NrKTsKLQlpZiAoIXByZWRpdl9jbGspIHsKKwlpZiAoSVNfRVJSKHByZWRpdl9jbGspKSB7CiAJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgdGhlIHByZWRpdiBjbG9ja1xuIik7CiAJCWdvdG8gZXJyX2ZyZWVfYXJyYXk7CiAJfQpAQCAtMTA2LDcgKzEwNiw3IEBACiAJCQkJCSAgJm11bHQtPmh3LCAmY2xrX211bHRpcGxpZXJfb3BzLAogCQkJCQkgICZnYXRlLT5odywgJmNsa19nYXRlX29wcywKIAkJCQkJICBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKLQlpZiAoIWJhc2VfY2xrKSB7CisJaWYgKElTX0VSUihiYXNlX2NsaykpIHsKIAkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciB0aGUgYmFzZSBtdWx0aXBsaWVyIGNsb2NrXG4iKTsKIAkJZ290byBlcnJfZnJlZV9tdWx0aXBsaWVyOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpL2Nsay1tb2QwLmMgYi9kcml2ZXJzL2Nsay9zdW54aS9jbGstbW9kMC5jCmluZGV4IGIzOGQ3MWMuLmU1NDI2NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3N1bnhpL2Nsay1tb2QwLmMKKysrIGIvZHJpdmVycy9jbGsvc3VueGkvY2xrLW1vZDAuYwpAQCAtOTEsNyArOTEsOCBAQAogCXN1bnhpX2ZhY3RvcnNfcmVnaXN0ZXIobm9kZSwgJnN1bjRpX2ExMF9tb2QwX2RhdGEsCiAJCQkgICAgICAgJnN1bjRpX2ExMF9tb2QwX2xvY2ssIHJlZyk7CiB9Ci1DTEtfT0ZfREVDTEFSRShzdW40aV9hMTBfbW9kMCwgImFsbHdpbm5lcixzdW40aS1hMTAtbW9kMC1jbGsiLCBzdW40aV9hMTBfbW9kMF9zZXR1cCk7CitDTEtfT0ZfREVDTEFSRV9EUklWRVIoc3VuNGlfYTEwX21vZDAsICJhbGx3aW5uZXIsc3VuNGktYTEwLW1vZDAtY2xrIiwKKwkJICAgICAgc3VuNGlfYTEwX21vZDBfc2V0dXApOwogCiBzdGF0aWMgaW50IHN1bjRpX2ExMF9tb2QwX2Nsa19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGkvY2xrLXN1bjhpLWFwYjAuYyBiL2RyaXZlcnMvY2xrL3N1bnhpL2Nsay1zdW44aS1hcGIwLmMKaW5kZXggYTU2NjZlMS4uZWExZWVkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3VueGkvY2xrLXN1bjhpLWFwYjAuYworKysgYi9kcml2ZXJzL2Nsay9zdW54aS9jbGstc3VuOGktYXBiMC5jCkBAIC04Miw4ICs4Miw4IEBACiAJb2ZfYWRkcmVzc190b19yZXNvdXJjZShub2RlLCAwLCAmcmVzKTsKIAlyZWxlYXNlX21lbV9yZWdpb24ocmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyZXMpKTsKIH0KLUNMS19PRl9ERUNMQVJFKHN1bjhpX2EyM19hcGIwLCAiYWxsd2lubmVyLHN1bjhpLWEyMy1hcGIwLWNsayIsCi0JICAgICAgIHN1bjhpX2EyM19hcGIwX3NldHVwKTsKK0NMS19PRl9ERUNMQVJFX0RSSVZFUihzdW44aV9hMjNfYXBiMCwgImFsbHdpbm5lcixzdW44aS1hMjMtYXBiMC1jbGsiLAorCQkgICAgICBzdW44aV9hMjNfYXBiMF9zZXR1cCk7CiAKIHN0YXRpYyBpbnQgc3VuOGlfYTIzX2FwYjBfY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS9jbGstc3VuOGktbWJ1cy5jIGIvZHJpdmVycy9jbGsvc3VueGkvY2xrLXN1bjhpLW1idXMuYwppbmRleCA0MTFkMzAzLi5iMjAwZWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9zdW54aS9jbGstc3VuOGktbWJ1cy5jCisrKyBiL2RyaXZlcnMvY2xrL3N1bnhpL2Nsay1zdW44aS1tYnVzLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIAkJcmV0dXJuOwogCiAJcmVnID0gb2ZfaW9fcmVxdWVzdF9hbmRfbWFwKG5vZGUsIDAsIG9mX25vZGVfZnVsbF9uYW1lKG5vZGUpKTsKLQlpZiAoIXJlZykgeworCWlmIChJU19FUlIocmVnKSkgewogCQlwcl9lcnIoIkNvdWxkIG5vdCBnZXQgcmVnaXN0ZXJzIGZvciBzdW44aS1tYnVzLWNsa1xuIik7CiAJCWdvdG8gZXJyX2ZyZWVfcGFyZW50czsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay90ZWdyYS9jbGstdGVncmExMTQuYyBiL2RyaXZlcnMvY2xrL3RlZ3JhL2Nsay10ZWdyYTExNC5jCmluZGV4IDY0ZGE3YjcuLjkzM2I1ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3RlZ3JhL2Nsay10ZWdyYTExNC5jCisrKyBiL2RyaXZlcnMvY2xrL3RlZ3JhL2Nsay10ZWdyYTExNC5jCkBAIC00MjgsNyArNDI4LDcgQEAKIAkuZGl2X25tcCA9ICZwbGxwX25tcCwKIAkuZnJlcV90YWJsZSA9IHBsbF9kX2ZyZXFfdGFibGUsCiAJLmZsYWdzID0gVEVHUkFfUExMX0hBU19DUENPTiB8IFRFR1JBX1BMTF9TRVRfTEZDT04gfAotCQkgVEVHUkFfUExMX1VTRV9MT0NLIHwgVEVHUkFfUExMX0hBU19MT0NLX0VOQUJMRSwKKwkJIFRFR1JBX1BMTF9IQVNfTE9DS19FTkFCTEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHRlZ3JhX2Nsa19wbGxfcGFyYW1zIHBsbF9kMl9wYXJhbXMgPSB7CkBAIC00NDYsNyArNDQ2LDcgQEAKIAkuZGl2X25tcCA9ICZwbGxwX25tcCwKIAkuZnJlcV90YWJsZSA9IHBsbF9kX2ZyZXFfdGFibGUsCiAJLmZsYWdzID0gVEVHUkFfUExMX0hBU19DUENPTiB8IFRFR1JBX1BMTF9TRVRfTEZDT04gfAotCQkgVEVHUkFfUExMX1VTRV9MT0NLIHwgVEVHUkFfUExMX0hBU19MT0NLX0VOQUJMRSwKKwkJIFRFR1JBX1BMTF9IQVNfTE9DS19FTkFCTEUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBkaXZfbWFwIHBsbHVfcFtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvdW5pcGhpZXIvS2NvbmZpZyBiL2RyaXZlcnMvY2xrL3VuaXBoaWVyL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxMjM3NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL3VuaXBoaWVyL0tjb25maWcKQEAgLTAsMCArMSw5IEBACitjb25maWcgQ0xLX1VOSVBISUVSCisJYm9vbCAiQ2xvY2sgZHJpdmVyIGZvciBVbmlQaGllciBTb0NzIgorCWRlcGVuZHMgb24gQVJDSF9VTklQSElFUiB8fCBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIE9GICYmIE1GRF9TWVNDT04KKwlkZWZhdWx0IEFSQ0hfVU5JUEhJRVIKKwloZWxwCisJICBTdXBwb3J0IGZvciBjbG9jayBjb250cm9sbGVycyBvbiBVbmlQaGllciBTb0NzLgorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gY29udHJvbCBjbG9ja3MgcHJvdmlkZWQgYnkgU3lzdGVtIENvbnRyb2wKKwkgIGJsb2NrLCBNZWRpYSBJL08gYmxvY2ssIFBlcmlwaGVyYWwgQmxvY2suCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay91bmlwaGllci9NYWtlZmlsZSBiL2RyaXZlcnMvY2xrL3VuaXBoaWVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyN2IzNjAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvdW5pcGhpZXIvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACitvYmoteQkrPSBjbGstdW5pcGhpZXItY29yZS5vCitvYmoteQkrPSBjbGstdW5pcGhpZXItZml4ZWQtZmFjdG9yLm8KK29iai15CSs9IGNsay11bmlwaGllci1maXhlZC1yYXRlLm8KK29iai15CSs9IGNsay11bmlwaGllci1nYXRlLm8KK29iai15CSs9IGNsay11bmlwaGllci1tdXgubworb2JqLXkJKz0gY2xrLXVuaXBoaWVyLXN5cy5vCitvYmoteQkrPSBjbGstdW5pcGhpZXItbWlvLm8KK29iai15CSs9IGNsay11bmlwaGllci1wZXJpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3VuaXBoaWVyL2Nsay11bmlwaGllci1jb3JlLmMgYi9kcml2ZXJzL2Nsay91bmlwaGllci9jbGstdW5pcGhpZXItY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZmI4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay91bmlwaGllci9jbGstdW5pcGhpZXItY29yZS5jCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFNvY2lvbmV4dCBJbmMuCisgKiAgIEF1dGhvcjogTWFzYWhpcm8gWWFtYWRhIDx5YW1hZGEubWFzYWhpcm9Ac29jaW9uZXh0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgImNsay11bmlwaGllci5oIgorCitzdGF0aWMgc3RydWN0IGNsa19odyAqdW5pcGhpZXJfY2xrX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKKwkJCQkJY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19kYXRhICpkYXRhKQoreworCXN3aXRjaCAoZGF0YS0+dHlwZSkgeworCWNhc2UgVU5JUEhJRVJfQ0xLX1RZUEVfRklYRURfRkFDVE9SOgorCQlyZXR1cm4gdW5pcGhpZXJfY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihkZXYsIGRhdGEtPm5hbWUsCisJCQkJCQkJICAmZGF0YS0+ZGF0YS5mYWN0b3IpOworCWNhc2UgVU5JUEhJRVJfQ0xLX1RZUEVfRklYRURfUkFURToKKwkJcmV0dXJuIHVuaXBoaWVyX2Nsa19yZWdpc3Rlcl9maXhlZF9yYXRlKGRldiwgZGF0YS0+bmFtZSwKKwkJCQkJCQkmZGF0YS0+ZGF0YS5yYXRlKTsKKwljYXNlIFVOSVBISUVSX0NMS19UWVBFX0dBVEU6CisJCXJldHVybiB1bmlwaGllcl9jbGtfcmVnaXN0ZXJfZ2F0ZShkZXYsIHJlZ21hcCwgZGF0YS0+bmFtZSwKKwkJCQkJCSAgJmRhdGEtPmRhdGEuZ2F0ZSk7CisJY2FzZSBVTklQSElFUl9DTEtfVFlQRV9NVVg6CisJCXJldHVybiB1bmlwaGllcl9jbGtfcmVnaXN0ZXJfbXV4KGRldiwgcmVnbWFwLCBkYXRhLT5uYW1lLAorCQkJCQkJICZkYXRhLT5kYXRhLm11eCk7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJ1bnN1cHBvcnRlZCBjbG9jayB0eXBlXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorfQorCitzdGF0aWMgaW50IHVuaXBoaWVyX2Nsa19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgKmh3X2RhdGE7CisJY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19kYXRhICpwLCAqZGF0YTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQ7CisJaW50IGNsa19udW0gPSAwOworCisJZGF0YSA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YShkZXYpOworCWlmIChXQVJOX09OKCFkYXRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KGRldi0+b2Zfbm9kZSk7IC8qIHBhcmVudCBzaG91bGQgYmUgc3lzY29uIG5vZGUgKi8KKwlyZWdtYXAgPSBzeXNjb25fbm9kZV90b19yZWdtYXAocGFyZW50KTsKKwlvZl9ub2RlX3B1dChwYXJlbnQpOworCWlmIChJU19FUlIocmVnbWFwKSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgcmVnbWFwIChlcnJvciAlbGQpXG4iLAorCQkJUFRSX0VSUihyZWdtYXApKTsKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKKwl9CisKKwlmb3IgKHAgPSBkYXRhOyBwLT5uYW1lOyBwKyspCisJCWNsa19udW0gPSBtYXgoY2xrX251bSwgcC0+aWR4ICsgMSk7CisKKwlod19kYXRhID0gZGV2bV9remFsbG9jKGRldiwKKwkJCXNpemVvZigqaHdfZGF0YSkgKyBjbGtfbnVtICogc2l6ZW9mKHN0cnVjdCBjbGtfaHcgKiksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWh3X2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJaHdfZGF0YS0+bnVtID0gY2xrX251bTsKKworCS8qIGF2b2lkIHJldHVybmluZyBOVUxMIGZvciB1bnVzZWQgaWR4ICovCisJZm9yICg7IGNsa19udW0gPj0gMDsgY2xrX251bS0tKQorCQlod19kYXRhLT5od3NbY2xrX251bV0gPSBFUlJfUFRSKC1FSU5WQUwpOworCisJZm9yIChwID0gZGF0YTsgcC0+bmFtZTsgcCsrKSB7CisJCXN0cnVjdCBjbGtfaHcgKmh3OworCisJCWRldl9kYmcoZGV2LCAicmVnaXN0ZXIgJXMgKGluZGV4PSVkKVxuIiwgcC0+bmFtZSwgcC0+aWR4KTsKKwkJaHcgPSB1bmlwaGllcl9jbGtfcmVnaXN0ZXIoZGV2LCByZWdtYXAsIHApOworCQlpZiAoSVNfRVJSKGh3KSkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgJXMgKGVycm9yICVsZClcbiIsCisJCQkJcC0+bmFtZSwgUFRSX0VSUihodykpOworCQkJcmV0dXJuIFBUUl9FUlIoaHcpOworCQl9CisKKwkJaWYgKHAtPmlkeCA+PSAwKQorCQkJaHdfZGF0YS0+aHdzW3AtPmlkeF0gPSBodzsKKwl9CisKKwlyZXR1cm4gb2ZfY2xrX2FkZF9od19wcm92aWRlcihkZXYtPm9mX25vZGUsIG9mX2Nsa19od19vbmVjZWxsX2dldCwKKwkJCQkgICAgICBod19kYXRhKTsKK30KKworc3RhdGljIGludCB1bmlwaGllcl9jbGtfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb2ZfY2xrX2RlbF9wcm92aWRlcihwZGV2LT5kZXYub2Zfbm9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdW5pcGhpZXJfY2xrX21hdGNoW10gPSB7CisJLyogU3lzdGVtIGNsb2NrICovCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItbGQ0LWNsb2NrIiwKKwkJLmRhdGEgPSB1bmlwaGllcl9sZDRfc3lzX2Nsa19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItcHJvNC1jbG9jayIsCisJCS5kYXRhID0gdW5pcGhpZXJfcHJvNF9zeXNfY2xrX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1zbGQ4LWNsb2NrIiwKKwkJLmRhdGEgPSB1bmlwaGllcl9zbGQ4X3N5c19jbGtfZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAic29jaW9uZXh0LHVuaXBoaWVyLXBybzUtY2xvY2siLAorCQkuZGF0YSA9IHVuaXBoaWVyX3BybzVfc3lzX2Nsa19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItcHhzMi1jbG9jayIsCisJCS5kYXRhID0gdW5pcGhpZXJfcHhzMl9zeXNfY2xrX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1sZDExLWNsb2NrIiwKKwkJLmRhdGEgPSB1bmlwaGllcl9sZDExX3N5c19jbGtfZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAic29jaW9uZXh0LHVuaXBoaWVyLWxkMjAtY2xvY2siLAorCQkuZGF0YSA9IHVuaXBoaWVyX2xkMjBfc3lzX2Nsa19kYXRhLAorCX0sCisJLyogTWVkaWEgSS9PIGNsb2NrICovCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItc2xkMy1taW8tY2xvY2siLAorCQkuZGF0YSA9IHVuaXBoaWVyX3NsZDNfbWlvX2Nsa19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItbGQ0LW1pby1jbG9jayIsCisJCS5kYXRhID0gdW5pcGhpZXJfc2xkM19taW9fY2xrX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1wcm80LW1pby1jbG9jayIsCisJCS5kYXRhID0gdW5pcGhpZXJfc2xkM19taW9fY2xrX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1zbGQ4LW1pby1jbG9jayIsCisJCS5kYXRhID0gdW5pcGhpZXJfc2xkM19taW9fY2xrX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1wcm81LW1pby1jbG9jayIsCisJCS5kYXRhID0gdW5pcGhpZXJfcHJvNV9taW9fY2xrX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1weHMyLW1pby1jbG9jayIsCisJCS5kYXRhID0gdW5pcGhpZXJfcHJvNV9taW9fY2xrX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1sZDExLW1pby1jbG9jayIsCisJCS5kYXRhID0gdW5pcGhpZXJfc2xkM19taW9fY2xrX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1sZDIwLW1pby1jbG9jayIsCisJCS5kYXRhID0gdW5pcGhpZXJfcHJvNV9taW9fY2xrX2RhdGEsCisJfSwKKwkvKiBQZXJpcGhlcmFsIGNsb2NrICovCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItbGQ0LXBlcmktY2xvY2siLAorCQkuZGF0YSA9IHVuaXBoaWVyX2xkNF9wZXJpX2Nsa19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItcHJvNC1wZXJpLWNsb2NrIiwKKwkJLmRhdGEgPSB1bmlwaGllcl9wcm80X3BlcmlfY2xrX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1zbGQ4LXBlcmktY2xvY2siLAorCQkuZGF0YSA9IHVuaXBoaWVyX2xkNF9wZXJpX2Nsa19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItcHJvNS1wZXJpLWNsb2NrIiwKKwkJLmRhdGEgPSB1bmlwaGllcl9wcm80X3BlcmlfY2xrX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1weHMyLXBlcmktY2xvY2siLAorCQkuZGF0YSA9IHVuaXBoaWVyX3BybzRfcGVyaV9jbGtfZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAic29jaW9uZXh0LHVuaXBoaWVyLWxkMTEtcGVyaS1jbG9jayIsCisJCS5kYXRhID0gdW5pcGhpZXJfcHJvNF9wZXJpX2Nsa19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItbGQyMC1wZXJpLWNsb2NrIiwKKwkJLmRhdGEgPSB1bmlwaGllcl9wcm80X3BlcmlfY2xrX2RhdGEsCisJfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHVuaXBoaWVyX2Nsa19kcml2ZXIgPSB7CisJLnByb2JlID0gdW5pcGhpZXJfY2xrX3Byb2JlLAorCS5yZW1vdmUgPSB1bmlwaGllcl9jbGtfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInVuaXBoaWVyLWNsayIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHVuaXBoaWVyX2Nsa19tYXRjaCwKKwl9LAorfTsKK2J1aWx0aW5fcGxhdGZvcm1fZHJpdmVyKHVuaXBoaWVyX2Nsa19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLWZpeGVkLWZhY3Rvci5jIGIvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLWZpeGVkLWZhY3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMmQ5ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay91bmlwaGllci9jbGstdW5pcGhpZXItZml4ZWQtZmFjdG9yLmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBTb2Npb25leHQgSW5jLgorICogICBBdXRob3I6IE1hc2FoaXJvIFlhbWFkYSA8eWFtYWRhLm1hc2FoaXJvQHNvY2lvbmV4dC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgImNsay11bmlwaGllci5oIgorCitzdHJ1Y3QgY2xrX2h3ICp1bmlwaGllcl9jbGtfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJCWNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZml4ZWRfZmFjdG9yX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGNsa19maXhlZF9mYWN0b3IgKmZpeDsKKwlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCWludCByZXQ7CisKKwlmaXggPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmZpeCksIEdGUF9LRVJORUwpOworCWlmICghZml4KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWluaXQubmFtZSA9IG5hbWU7CisJaW5pdC5vcHMgPSAmY2xrX2ZpeGVkX2ZhY3Rvcl9vcHM7CisJaW5pdC5mbGFncyA9IGRhdGEtPnBhcmVudF9uYW1lID8gQ0xLX1NFVF9SQVRFX1BBUkVOVCA6IDA7CisJaW5pdC5wYXJlbnRfbmFtZXMgPSBkYXRhLT5wYXJlbnRfbmFtZSA/ICZkYXRhLT5wYXJlbnRfbmFtZSA6IE5VTEw7CisJaW5pdC5udW1fcGFyZW50cyA9IGRhdGEtPnBhcmVudF9uYW1lID8gMSA6IDA7CisKKwlmaXgtPm11bHQgPSBkYXRhLT5tdWx0OworCWZpeC0+ZGl2ID0gZGF0YS0+ZGl2OworCWZpeC0+aHcuaW5pdCA9ICZpbml0OworCisJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoZGV2LCAmZml4LT5odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKworCXJldHVybiAmZml4LT5odzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3VuaXBoaWVyL2Nsay11bmlwaGllci1maXhlZC1yYXRlLmMgYi9kcml2ZXJzL2Nsay91bmlwaGllci9jbGstdW5pcGhpZXItZml4ZWQtcmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZDBkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay91bmlwaGllci9jbGstdW5pcGhpZXItZml4ZWQtcmF0ZS5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgU29jaW9uZXh0IEluYy4KKyAqICAgQXV0aG9yOiBNYXNhaGlybyBZYW1hZGEgPHlhbWFkYS5tYXNhaGlyb0Bzb2Npb25leHQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlICJjbGstdW5pcGhpZXIuaCIKKworc3RydWN0IGNsa19odyAqdW5pcGhpZXJfY2xrX3JlZ2lzdGVyX2ZpeGVkX3JhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkJY29uc3QgY2hhciAqbmFtZSwKKwkJCQljb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2ZpeGVkX3JhdGVfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgY2xrX2ZpeGVkX3JhdGUgKmZpeGVkOworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKKworCS8qIGFsbG9jYXRlIGZpeGVkLXJhdGUgY2xvY2sgKi8KKwlmaXhlZCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZml4ZWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpeGVkKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWluaXQubmFtZSA9IG5hbWU7CisJaW5pdC5vcHMgPSAmY2xrX2ZpeGVkX3JhdGVfb3BzOworCWluaXQucGFyZW50X25hbWVzID0gTlVMTDsKKwlpbml0Lm51bV9wYXJlbnRzID0gMDsKKworCWZpeGVkLT5maXhlZF9yYXRlID0gZGF0YS0+Zml4ZWRfcmF0ZTsKKwlmaXhlZC0+aHcuaW5pdCA9ICZpbml0OworCisJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoZGV2LCAmZml4ZWQtPmh3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCisJcmV0dXJuICZmaXhlZC0+aHc7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay91bmlwaGllci9jbGstdW5pcGhpZXItZ2F0ZS5jIGIvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLWdhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTE0MmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLWdhdGUuYwpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFNvY2lvbmV4dCBJbmMuCisgKiAgIEF1dGhvcjogTWFzYWhpcm8gWWFtYWRhIDx5YW1hZGEubWFzYWhpcm9Ac29jaW9uZXh0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisjaW5jbHVkZSAiY2xrLXVuaXBoaWVyLmgiCisKK3N0cnVjdCB1bmlwaGllcl9jbGtfZ2F0ZSB7CisJc3RydWN0IGNsa19odyBodzsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJdW5zaWduZWQgaW50IHJlZzsKKwl1bnNpZ25lZCBpbnQgYml0OworfTsKKworI2RlZmluZSB0b191bmlwaGllcl9jbGtfZ2F0ZShfaHcpIFwKKwkJCQljb250YWluZXJfb2YoX2h3LCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2dhdGUsIGh3KQorCitzdGF0aWMgaW50IHVuaXBoaWVyX2Nsa19nYXRlX2VuZGlzYWJsZShzdHJ1Y3QgY2xrX2h3ICpodywgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgdW5pcGhpZXJfY2xrX2dhdGUgKmdhdGUgPSB0b191bmlwaGllcl9jbGtfZ2F0ZShodyk7CisKKwlyZXR1cm4gcmVnbWFwX3dyaXRlX2JpdHMoZ2F0ZS0+cmVnbWFwLCBnYXRlLT5yZWcsIEJJVChnYXRlLT5iaXQpLAorCQkJCSBlbmFibGUgPyBCSVQoZ2F0ZS0+Yml0KSA6IDApOworfQorCitzdGF0aWMgaW50IHVuaXBoaWVyX2Nsa19nYXRlX2VuYWJsZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlyZXR1cm4gdW5pcGhpZXJfY2xrX2dhdGVfZW5kaXNhYmxlKGh3LCAxKTsKK30KKworc3RhdGljIHZvaWQgdW5pcGhpZXJfY2xrX2dhdGVfZGlzYWJsZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlpZiAodW5pcGhpZXJfY2xrX2dhdGVfZW5kaXNhYmxlKGh3LCAwKSA8IDApCisJCXByX3dhcm4oImZhaWxlZCB0byBkaXNhYmxlIGNsa1xuIik7Cit9CisKK3N0YXRpYyBpbnQgdW5pcGhpZXJfY2xrX2dhdGVfaXNfZW5hYmxlZChzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgdW5pcGhpZXJfY2xrX2dhdGUgKmdhdGUgPSB0b191bmlwaGllcl9jbGtfZ2F0ZShodyk7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmIChyZWdtYXBfcmVhZChnYXRlLT5yZWdtYXAsIGdhdGUtPnJlZywgJnZhbCkgPCAwKQorCQlwcl93YXJuKCJpc19lbmFibGVkKCkgbWF5IHJldHVybiB3cm9uZyByZXN1bHRcbiIpOworCisJcmV0dXJuICEhKHZhbCAmIEJJVChnYXRlLT5iaXQpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHVuaXBoaWVyX2Nsa19nYXRlX29wcyA9IHsKKwkuZW5hYmxlID0gdW5pcGhpZXJfY2xrX2dhdGVfZW5hYmxlLAorCS5kaXNhYmxlID0gdW5pcGhpZXJfY2xrX2dhdGVfZGlzYWJsZSwKKwkuaXNfZW5hYmxlZCA9IHVuaXBoaWVyX2Nsa19nYXRlX2lzX2VuYWJsZWQsCit9OworCitzdHJ1Y3QgY2xrX2h3ICp1bmlwaGllcl9jbGtfcmVnaXN0ZXJfZ2F0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IHJlZ21hcCAqcmVnbWFwLAorCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19nYXRlX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHVuaXBoaWVyX2Nsa19nYXRlICpnYXRlOworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKKworCWdhdGUgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmdhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdhdGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaW5pdC5uYW1lID0gbmFtZTsKKwlpbml0Lm9wcyA9ICZ1bmlwaGllcl9jbGtfZ2F0ZV9vcHM7CisJaW5pdC5mbGFncyA9IGRhdGEtPnBhcmVudF9uYW1lID8gQ0xLX1NFVF9SQVRFX1BBUkVOVCA6IDA7CisJaW5pdC5wYXJlbnRfbmFtZXMgPSBkYXRhLT5wYXJlbnRfbmFtZSA/ICZkYXRhLT5wYXJlbnRfbmFtZSA6IE5VTEw7CisJaW5pdC5udW1fcGFyZW50cyA9IGRhdGEtPnBhcmVudF9uYW1lID8gMSA6IDA7CisKKwlnYXRlLT5yZWdtYXAgPSByZWdtYXA7CisJZ2F0ZS0+cmVnID0gZGF0YS0+cmVnOworCWdhdGUtPmJpdCA9IGRhdGEtPmJpdDsKKwlnYXRlLT5ody5pbml0ID0gJmluaXQ7CisKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcihkZXYsICZnYXRlLT5odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKworCXJldHVybiAmZ2F0ZS0+aHc7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay91bmlwaGllci9jbGstdW5pcGhpZXItbWlvLmMgYi9kcml2ZXJzL2Nsay91bmlwaGllci9jbGstdW5pcGhpZXItbWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhN2VjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL3VuaXBoaWVyL2Nsay11bmlwaGllci1taW8uYwpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBTb2Npb25leHQgSW5jLgorICogICBBdXRob3I6IE1hc2FoaXJvIFlhbWFkYSA8eWFtYWRhLm1hc2FoaXJvQHNvY2lvbmV4dC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJjbGstdW5pcGhpZXIuaCIKKworI2RlZmluZSBVTklQSElFUl9NSU9fQ0xLX1NEX0ZJWEVECQkJCQlcCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigic2QtNDRtIiwgLTEsICJzZC0xMzNtIiwgMSwgMyksCQlcCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigic2QtMzNtIiwgLTEsICJzZC0yMDBtIiwgMSwgNiksCQlcCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigic2QtNTBtIiwgLTEsICJzZC0yMDBtIiwgMSwgNCksCQlcCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigic2QtNjdtIiwgLTEsICJzZC0yMDBtIiwgMSwgMyksCQlcCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigic2QtMTAwbSIsIC0xLCAic2QtMjAwbSIsIDEsIDIpLAkJXAorCVVOSVBISUVSX0NMS19GQUNUT1IoInNkLTQwbSIsIC0xLCAic2QtMjAwbSIsIDEsIDUpLAkJXAorCVVOSVBISUVSX0NMS19GQUNUT1IoInNkLTI1bSIsIC0xLCAic2QtMjAwbSIsIDEsIDgpLAkJXAorCVVOSVBISUVSX0NMS19GQUNUT1IoInNkLTIybSIsIC0xLCAic2QtMTMzbSIsIDEsIDYpCisKKyNkZWZpbmUgVU5JUEhJRVJfTUlPX0NMS19TRChfaWR4LCBjaCkJCQkJCVwKKwl7CQkJCQkJCQlcCisJCS5uYW1lID0gInNkIiAjY2ggIi1zZWwiLAkJCQlcCisJCS50eXBlID0gVU5JUEhJRVJfQ0xLX1RZUEVfTVVYLAkJCQlcCisJCS5pZHggPSAtMSwJCQkJCQlcCisJCS5kYXRhLm11eCA9IHsJCQkJCQlcCisJCQkucGFyZW50X25hbWVzID0gewkJCQlcCisJCQkJInNkLTQ0bSIsCQkJCVwKKwkJCQkic2QtMzNtIiwJCQkJXAorCQkJCSJzZC01MG0iLAkJCQlcCisJCQkJInNkLTY3bSIsCQkJCVwKKwkJCQkic2QtMTAwbSIsCQkJCVwKKwkJCQkic2QtNDBtIiwJCQkJXAorCQkJCSJzZC0yNW0iLAkJCQlcCisJCQkJInNkLTIybSIsCQkJCVwKKwkJCX0sCQkJCQkJXAorCQkJLm51bV9wYXJlbnRzID0gOCwJCQkJXAorCQkJLnJlZyA9IDB4MzAgKyAweDIwMCAqIChjaCksCQkJXAorCQkJLm1hc2tzID0gewkJCQkJXAorCQkJCTB4MDAwMzEwMDAsCQkJCVwKKwkJCQkweDAwMDMxMDAwLAkJCQlcCisJCQkJMHgwMDAzMTAwMCwJCQkJXAorCQkJCTB4MDAwMzEwMDAsCQkJCVwKKwkJCQkweDAwMDAxMzAwLAkJCQlcCisJCQkJMHgwMDAwMTMwMCwJCQkJXAorCQkJCTB4MDAwMDEzMDAsCQkJCVwKKwkJCQkweDAwMDAxMzAwLAkJCQlcCisJCQl9LAkJCQkJCVwKKwkJCS52YWxzID0gewkJCQkJXAorCQkJCTB4MDAwMDAwMDAsCQkJCVwKKwkJCQkweDAwMDEwMDAwLAkJCQlcCisJCQkJMHgwMDAyMDAwMCwJCQkJXAorCQkJCTB4MDAwMzAwMDAsCQkJCVwKKwkJCQkweDAwMDAxMDAwLAkJCQlcCisJCQkJMHgwMDAwMTEwMCwJCQkJXAorCQkJCTB4MDAwMDEyMDAsCQkJCVwKKwkJCQkweDAwMDAxMzAwLAkJCQlcCisJCQl9LAkJCQkJCVwKKwkJfSwJCQkJCQkJXAorCX0sCQkJCQkJCQlcCisJVU5JUEhJRVJfQ0xLX0dBVEUoInNkIiAjY2gsIChfaWR4KSwgInNkIiAjY2ggIi1zZWwiLCAweDIwICsgMHgyMDAgKiAoY2gpLCA4KQorCisjZGVmaW5lIFVOSVBISUVSX01JT19DTEtfVVNCMihpZHgsIGNoKQkJCQkJXAorCVVOSVBISUVSX0NMS19HQVRFKCJ1c2IyIiAjY2gsIChpZHgpLCAidXNiMiIsIDB4MjAgKyAweDIwMCAqIChjaCksIDI4KQorCisjZGVmaW5lIFVOSVBISUVSX01JT19DTEtfVVNCMl9QSFkoaWR4LCBjaCkJCQkJXAorCVVOSVBISUVSX0NMS19HQVRFKCJ1c2IyIiAjY2ggIi1waHkiLCAoaWR4KSwgInVzYjIiLCAweDIwICsgMHgyMDAgKiAoY2gpLCAyOSkKKworI2RlZmluZSBVTklQSElFUl9NSU9fQ0xLX0RNQUMoaWR4KQkJCQkJXAorCVVOSVBISUVSX0NMS19HQVRFKCJtaW9kbWFjIiwgKGlkeCksICJzdGRtYWMiLCAweDIwLCAyNSkKKworY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19kYXRhIHVuaXBoaWVyX3NsZDNfbWlvX2Nsa19kYXRhW10gPSB7CisJVU5JUEhJRVJfTUlPX0NMS19TRF9GSVhFRCwKKwlVTklQSElFUl9NSU9fQ0xLX1NEKDAsIDApLAorCVVOSVBISUVSX01JT19DTEtfU0QoMSwgMSksCisJVU5JUEhJRVJfTUlPX0NMS19TRCgyLCAyKSwKKwlVTklQSElFUl9NSU9fQ0xLX0RNQUMoNyksCisJVU5JUEhJRVJfTUlPX0NMS19VU0IyKDgsIDApLAorCVVOSVBISUVSX01JT19DTEtfVVNCMig5LCAxKSwKKwlVTklQSElFUl9NSU9fQ0xLX1VTQjIoMTAsIDIpLAorCVVOSVBISUVSX01JT19DTEtfVVNCMigxMSwgMyksCisJVU5JUEhJRVJfTUlPX0NMS19VU0IyX1BIWSgxMiwgMCksCisJVU5JUEhJRVJfTUlPX0NMS19VU0IyX1BIWSgxMywgMSksCisJVU5JUEhJRVJfTUlPX0NMS19VU0IyX1BIWSgxNCwgMiksCisJVU5JUEhJRVJfTUlPX0NMS19VU0IyX1BIWSgxNSwgMyksCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfcHJvNV9taW9fY2xrX2RhdGFbXSA9IHsKKwlVTklQSElFUl9NSU9fQ0xLX1NEX0ZJWEVELAorCVVOSVBISUVSX01JT19DTEtfU0QoMCwgMCksCisJVU5JUEhJRVJfTUlPX0NMS19TRCgxLCAxKSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay91bmlwaGllci9jbGstdW5pcGhpZXItbXV4LmMgYi9kcml2ZXJzL2Nsay91bmlwaGllci9jbGstdW5pcGhpZXItbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVhMmYyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL3VuaXBoaWVyL2Nsay11bmlwaGllci1tdXguYwpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFNvY2lvbmV4dCBJbmMuCisgKiAgIEF1dGhvcjogTWFzYWhpcm8gWWFtYWRhIDx5YW1hZGEubWFzYWhpcm9Ac29jaW9uZXh0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisjaW5jbHVkZSAiY2xrLXVuaXBoaWVyLmgiCisKK3N0cnVjdCB1bmlwaGllcl9jbGtfbXV4IHsKKwlzdHJ1Y3QgY2xrX2h3IGh3OworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwl1bnNpZ25lZCBpbnQgcmVnOworCWNvbnN0IHVuc2lnbmVkIGludCAqbWFza3M7CisJY29uc3QgdW5zaWduZWQgaW50ICp2YWxzOworfTsKKworI2RlZmluZSB0b191bmlwaGllcl9jbGtfbXV4KF9odykgY29udGFpbmVyX29mKF9odywgc3RydWN0IHVuaXBoaWVyX2Nsa19tdXgsIGh3KQorCitzdGF0aWMgaW50IHVuaXBoaWVyX2Nsa19tdXhfc2V0X3BhcmVudChzdHJ1Y3QgY2xrX2h3ICpodywgdTggaW5kZXgpCit7CisJc3RydWN0IHVuaXBoaWVyX2Nsa19tdXggKm11eCA9IHRvX3VuaXBoaWVyX2Nsa19tdXgoaHcpOworCisJcmV0dXJuIHJlZ21hcF93cml0ZV9iaXRzKG11eC0+cmVnbWFwLCBtdXgtPnJlZywgbXV4LT5tYXNrc1tpbmRleF0sCisJCQkJIG11eC0+dmFsc1tpbmRleF0pOworfQorCitzdGF0aWMgdTggdW5pcGhpZXJfY2xrX211eF9nZXRfcGFyZW50KHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCB1bmlwaGllcl9jbGtfbXV4ICptdXggPSB0b191bmlwaGllcl9jbGtfbXV4KGh3KTsKKwlpbnQgbnVtX3BhcmVudHMgPSBjbGtfaHdfZ2V0X251bV9wYXJlbnRzKGh3KTsKKwlpbnQgcmV0OworCXUzMiB2YWw7CisJdTggaTsKKworCXJldCA9IHJlZ21hcF9yZWFkKG11eC0+cmVnbWFwLCBtdXgtPnJlZywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFyZW50czsgaSsrKQorCQlpZiAoKG11eC0+bWFza3NbaV0gJiB2YWwpID09IG11eC0+dmFsc1tpXSkKKwkJCXJldHVybiBpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyB1bmlwaGllcl9jbGtfbXV4X29wcyA9IHsKKwkuZGV0ZXJtaW5lX3JhdGUgPSBfX2Nsa19tdXhfZGV0ZXJtaW5lX3JhdGUsCisJLnNldF9wYXJlbnQgPSB1bmlwaGllcl9jbGtfbXV4X3NldF9wYXJlbnQsCisJLmdldF9wYXJlbnQgPSB1bmlwaGllcl9jbGtfbXV4X2dldF9wYXJlbnQsCit9OworCitzdHJ1Y3QgY2xrX2h3ICp1bmlwaGllcl9jbGtfcmVnaXN0ZXJfbXV4KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKKwkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19tdXhfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgdW5pcGhpZXJfY2xrX211eCAqbXV4OworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKKworCW11eCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbXV4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtdXgpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaW5pdC5uYW1lID0gbmFtZTsKKwlpbml0Lm9wcyA9ICZ1bmlwaGllcl9jbGtfbXV4X29wczsKKwlpbml0LmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVDsKKwlpbml0LnBhcmVudF9uYW1lcyA9IGRhdGEtPnBhcmVudF9uYW1lczsKKwlpbml0Lm51bV9wYXJlbnRzID0gZGF0YS0+bnVtX3BhcmVudHMsCisKKwltdXgtPnJlZ21hcCA9IHJlZ21hcDsKKwltdXgtPnJlZyA9IGRhdGEtPnJlZzsKKwltdXgtPm1hc2tzID0gZGF0YS0+bWFza3M7CisJbXV4LT52YWxzID0gZGF0YS0+dmFsczsKKwltdXgtPmh3LmluaXQgPSAmaW5pdDsKKworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGRldiwgJm11eC0+aHcpOworCWlmIChyZXQpCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisKKwlyZXR1cm4gJm11eC0+aHc7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay91bmlwaGllci9jbGstdW5pcGhpZXItcGVyaS5jIGIvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLXBlcmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjFjODBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLXBlcmkuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFNvY2lvbmV4dCBJbmMuCisgKiAgIEF1dGhvcjogTWFzYWhpcm8gWWFtYWRhIDx5YW1hZGEubWFzYWhpcm9Ac29jaW9uZXh0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgImNsay11bmlwaGllci5oIgorCisjZGVmaW5lIFVOSVBISUVSX1BFUklfQ0xLX1VBUlQoaWR4LCBjaCkJCQkJCVwKKwlVTklQSElFUl9DTEtfR0FURSgidWFydCIgI2NoLCAoaWR4KSwgInVhcnQiLCAweDI0LCAxOSArIChjaCkpCisKKyNkZWZpbmUgVU5JUEhJRVJfUEVSSV9DTEtfSTJDX0NPTU1PTgkJCQkJXAorCVVOSVBISUVSX0NMS19HQVRFKCJpMmMtY29tbW9uIiwgLTEsICJpMmMiLCAweDIwLCAxKQorCisjZGVmaW5lIFVOSVBISUVSX1BFUklfQ0xLX0kyQyhpZHgsIGNoKQkJCQkJXAorCVVOSVBISUVSX0NMS19HQVRFKCJpMmMiICNjaCwgKGlkeCksICJpMmMtY29tbW9uIiwgMHgyNCwgNSArIChjaCkpCisKKyNkZWZpbmUgVU5JUEhJRVJfUEVSSV9DTEtfRkkyQyhpZHgsIGNoKQkJCQkJXAorCVVOSVBISUVSX0NMS19HQVRFKCJpMmMiICNjaCwgKGlkeCksICJpMmMiLCAweDI0LCAyNCArIChjaCkpCisKK2NvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9sZDRfcGVyaV9jbGtfZGF0YVtdID0geworCVVOSVBISUVSX1BFUklfQ0xLX1VBUlQoMCwgMCksCisJVU5JUEhJRVJfUEVSSV9DTEtfVUFSVCgxLCAxKSwKKwlVTklQSElFUl9QRVJJX0NMS19VQVJUKDIsIDIpLAorCVVOSVBISUVSX1BFUklfQ0xLX1VBUlQoMywgMyksCisJVU5JUEhJRVJfUEVSSV9DTEtfSTJDX0NPTU1PTiwKKwlVTklQSElFUl9QRVJJX0NMS19JMkMoNCwgMCksCisJVU5JUEhJRVJfUEVSSV9DTEtfSTJDKDUsIDEpLAorCVVOSVBISUVSX1BFUklfQ0xLX0kyQyg2LCAyKSwKKwlVTklQSElFUl9QRVJJX0NMS19JMkMoNywgMyksCisJVU5JUEhJRVJfUEVSSV9DTEtfSTJDKDgsIDQpLAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKKworY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19kYXRhIHVuaXBoaWVyX3BybzRfcGVyaV9jbGtfZGF0YVtdID0geworCVVOSVBISUVSX1BFUklfQ0xLX1VBUlQoMCwgMCksCisJVU5JUEhJRVJfUEVSSV9DTEtfVUFSVCgxLCAxKSwKKwlVTklQSElFUl9QRVJJX0NMS19VQVJUKDIsIDIpLAorCVVOSVBISUVSX1BFUklfQ0xLX1VBUlQoMywgMyksCisJVU5JUEhJRVJfUEVSSV9DTEtfRkkyQyg0LCAwKSwKKwlVTklQSElFUl9QRVJJX0NMS19GSTJDKDUsIDEpLAorCVVOSVBISUVSX1BFUklfQ0xLX0ZJMkMoNiwgMiksCisJVU5JUEhJRVJfUEVSSV9DTEtfRkkyQyg3LCAzKSwKKwlVTklQSElFUl9QRVJJX0NMS19GSTJDKDgsIDQpLAorCVVOSVBISUVSX1BFUklfQ0xLX0ZJMkMoOSwgNSksCisJVU5JUEhJRVJfUEVSSV9DTEtfRkkyQygxMCwgNiksCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLXN5cy5jIGIvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLXN5cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMDI5OTkxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLXN5cy5jCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFNvY2lvbmV4dCBJbmMuCisgKiAgIEF1dGhvcjogTWFzYWhpcm8gWWFtYWRhIDx5YW1hZGEubWFzYWhpcm9Ac29jaW9uZXh0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorCisjaW5jbHVkZSAiY2xrLXVuaXBoaWVyLmgiCisKKyNkZWZpbmUgVU5JUEhJRVJfU0xEM19TWVNfQ0xLX1NECQkJCQlcCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigic2QtMjAwbSIsIC0xLCAic3BsbCIsIDEsIDgpLAkJXAorCVVOSVBISUVSX0NMS19GQUNUT1IoInNkLTEzM20iLCAtMSwgInZwbGwyN2EiLCAxLCAyKQorCisjZGVmaW5lIFVOSVBISUVSX1BSTzVfU1lTX0NMS19TRAkJCQkJXAorCVVOSVBISUVSX0NMS19GQUNUT1IoInNkLTIwMG0iLCAtMSwgInNwbGwiLCAxLCAxMiksCQlcCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigic2QtMTMzbSIsIC0xLCAic3BsbCIsIDEsIDE4KQorCisjZGVmaW5lIFVOSVBISUVSX0xEMjBfU1lTX0NMS19TRAkJCQkJXAorCVVOSVBISUVSX0NMS19GQUNUT1IoInNkLTIwMG0iLCAtMSwgInNwbGwiLCAxLCAxMCksCQlcCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigic2QtMTMzbSIsIC0xLCAic3BsbCIsIDEsIDE1KQorCisjZGVmaW5lIFVOSVBISUVSX1NMRDNfU1lTX0NMS19TVERNQUMoaWR4KQkJCQlcCisJVU5JUEhJRVJfQ0xLX0dBVEUoInN0ZG1hYyIsIChpZHgpLCBOVUxMLCAweDIxMDQsIDEwKQorCisjZGVmaW5lIFVOSVBISUVSX0xEMTFfU1lTX0NMS19TVERNQUMoaWR4KQkJCQlcCisJVU5JUEhJRVJfQ0xLX0dBVEUoInN0ZG1hYyIsIChpZHgpLCBOVUxMLCAweDIxMGMsIDgpCisKKyNkZWZpbmUgVU5JUEhJRVJfUFJPNF9TWVNfQ0xLX0dJTyhpZHgpCQkJCQlcCisJVU5JUEhJRVJfQ0xLX0dBVEUoImdpbyIsIChpZHgpLCBOVUxMLCAweDIxMDQsIDYpCisKKyNkZWZpbmUgVU5JUEhJRVJfUFJPNF9TWVNfQ0xLX1VTQjMoaWR4LCBjaCkJCQkJXAorCVVOSVBISUVSX0NMS19HQVRFKCJ1c2IzIiAjY2gsIChpZHgpLCBOVUxMLCAweDIxMDQsIDE2ICsgKGNoKSkKKworY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19kYXRhIHVuaXBoaWVyX3NsZDNfc3lzX2Nsa19kYXRhW10gPSB7CisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigic3BsbCIsIC0xLCAicmVmIiwgNjUsIDEpLAkJLyogMTU5Ny40NCBNSHogKi8KKwlVTklQSElFUl9DTEtfRkFDVE9SKCJ1cGxsIiwgLTEsICJyZWYiLCA2MDAwLCA1MTIpLAkvKiAyODggTUh6ICovCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigiYTJwbGwiLCAtMSwgInJlZiIsIDI0LCAxKSwJCS8qIDU4OS44MjQgTUh6ICovCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigidnBsbDI3YSIsIC0xLCAicmVmIiwgNTYyNSwgNTEyKSwJLyogMjcwIE1IeiAqLworCVVOSVBISUVSX0NMS19GQUNUT1IoInVhcnQiLCAwLCAiYTJwbGwiLCAxLCAxNiksCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigiaTJjIiwgMSwgInNwbGwiLCAxLCAxNiksCisJVU5JUEhJRVJfU0xEM19TWVNfQ0xLX1NELAorCVVOSVBISUVSX0NMS19GQUNUT1IoInVzYjIiLCAtMSwgInVwbGwiLCAxLCAxMiksCisJVU5JUEhJRVJfU0xEM19TWVNfQ0xLX1NURE1BQyg4KSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CisKK2NvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9sZDRfc3lzX2Nsa19kYXRhW10gPSB7CisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigic3BsbCIsIC0xLCAicmVmIiwgNjUsIDEpLAkJLyogMTU5Ny40NCBNSHogKi8KKwlVTklQSElFUl9DTEtfRkFDVE9SKCJ1cGxsIiwgLTEsICJyZWYiLCA2MDAwLCA1MTIpLAkvKiAyODggTUh6ICovCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigiYTJwbGwiLCAtMSwgInJlZiIsIDI0LCAxKSwJCS8qIDU4OS44MjQgTUh6ICovCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigidnBsbDI3YSIsIC0xLCAicmVmIiwgNTYyNSwgNTEyKSwJLyogMjcwIE1IeiAqLworCVVOSVBISUVSX0NMS19GQUNUT1IoInVhcnQiLCAwLCAiYTJwbGwiLCAxLCAxNiksCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigiaTJjIiwgMSwgInNwbGwiLCAxLCAxNiksCisJVU5JUEhJRVJfU0xEM19TWVNfQ0xLX1NELAorCVVOSVBISUVSX0NMS19GQUNUT1IoInVzYjIiLCAtMSwgInVwbGwiLCAxLCAxMiksCisJVU5JUEhJRVJfU0xEM19TWVNfQ0xLX1NURE1BQyg4KSwJCS8qIEV0aGVyLCBIU0MsIE1JTyAqLworCXsgLyogc2VudGluZWwgKi8gfQorfTsKKworY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19kYXRhIHVuaXBoaWVyX3BybzRfc3lzX2Nsa19kYXRhW10gPSB7CisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigic3BsbCIsIC0xLCAicmVmIiwgNjQsIDEpLAkJLyogMTYwMCBNSHogKi8KKwlVTklQSElFUl9DTEtfRkFDVE9SKCJ1cGxsIiwgLTEsICJyZWYiLCAyODgsIDI1KSwJLyogMjg4IE1IeiAqLworCVVOSVBISUVSX0NMS19GQUNUT1IoImEycGxsIiwgLTEsICJ1cGxsIiwgMjU2LCAxMjUpLAkvKiA1ODkuODI0IE1IeiAqLworCVVOSVBISUVSX0NMS19GQUNUT1IoInZwbGwyN2EiLCAtMSwgInJlZiIsIDI3MCwgMjUpLAkvKiAyNzAgTUh6ICovCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigidWFydCIsIDAsICJhMnBsbCIsIDEsIDgpLAorCVVOSVBISUVSX0NMS19GQUNUT1IoImkyYyIsIDEsICJzcGxsIiwgMSwgMzIpLAorCVVOSVBISUVSX1NMRDNfU1lTX0NMS19TRCwKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJ1c2IyIiwgLTEsICJ1cGxsIiwgMSwgMTIpLAorCVVOSVBISUVSX1NMRDNfU1lTX0NMS19TVERNQUMoOCksCQkvKiBIU0MsIE1JTywgUkxFICovCisJVU5JUEhJRVJfUFJPNF9TWVNfQ0xLX0dJTygxMiksCQkJLyogRXRoZXIsIFNBVEEsIFVTQjMgKi8KKwlVTklQSElFUl9QUk80X1NZU19DTEtfVVNCMygxNCwgMCksCisJVU5JUEhJRVJfUFJPNF9TWVNfQ0xLX1VTQjMoMTUsIDEpLAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKKworY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19kYXRhIHVuaXBoaWVyX3NsZDhfc3lzX2Nsa19kYXRhW10gPSB7CisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigic3BsbCIsIC0xLCAicmVmIiwgNjQsIDEpLAkJLyogMTYwMCBNSHogKi8KKwlVTklQSElFUl9DTEtfRkFDVE9SKCJ1cGxsIiwgLTEsICJyZWYiLCAyODgsIDI1KSwJLyogMjg4IE1IeiAqLworCVVOSVBISUVSX0NMS19GQUNUT1IoInZwbGwyN2EiLCAtMSwgInJlZiIsIDI3MCwgMjUpLAkvKiAyNzAgTUh6ICovCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigidWFydCIsIDAsICJzcGxsIiwgMSwgMjApLAorCVVOSVBISUVSX0NMS19GQUNUT1IoImkyYyIsIDEsICJzcGxsIiwgMSwgMTYpLAorCVVOSVBISUVSX1NMRDNfU1lTX0NMS19TRCwKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJ1c2IyIiwgLTEsICJ1cGxsIiwgMSwgMTIpLAorCVVOSVBISUVSX1NMRDNfU1lTX0NMS19TVERNQUMoOCksCQkvKiBFdGhlciwgSFNDLCBNSU8gKi8KKwl7IC8qIHNlbnRpbmVsICovIH0KK307CisKK2NvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9wcm81X3N5c19jbGtfZGF0YVtdID0geworCVVOSVBISUVSX0NMS19GQUNUT1IoInNwbGwiLCAtMSwgInJlZiIsIDEyMCwgMSksCQkvKiAyNDAwIE1IeiAqLworCVVOSVBISUVSX0NMS19GQUNUT1IoImRhcGxsMSIsIC0xLCAicmVmIiwgMTI4LCAxKSwJLyogMjU2MCBNSHogKi8KKwlVTklQSElFUl9DTEtfRkFDVE9SKCJkYXBsbDIiLCAtMSwgInJlZiIsIDE0NCwgMTI1KSwJLyogMjk0OS4xMiBNSHogKi8KKwlVTklQSElFUl9DTEtfRkFDVE9SKCJ1YXJ0IiwgMCwgImRhcGxsMiIsIDEsIDQwKSwKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJpMmMiLCAxLCAic3BsbCIsIDEsIDQ4KSwKKwlVTklQSElFUl9QUk81X1NZU19DTEtfU0QsCisJVU5JUEhJRVJfU0xEM19TWVNfQ0xLX1NURE1BQyg4KSwJCQkvKiBIU0MgKi8KKwlVTklQSElFUl9QUk80X1NZU19DTEtfR0lPKDEyKSwJCQkJLyogUENJZSwgVVNCMyAqLworCVVOSVBISUVSX1BSTzRfU1lTX0NMS19VU0IzKDE0LCAwKSwKKwlVTklQSElFUl9QUk80X1NZU19DTEtfVVNCMygxNSwgMSksCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfcHhzMl9zeXNfY2xrX2RhdGFbXSA9IHsKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJzcGxsIiwgLTEsICJyZWYiLCA5NiwgMSksCQkvKiAyNDAwIE1IeiAqLworCVVOSVBISUVSX0NMS19GQUNUT1IoInVhcnQiLCAwLCAic3BsbCIsIDEsIDI3KSwKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJpMmMiLCAxLCAic3BsbCIsIDEsIDQ4KSwKKwlVTklQSElFUl9QUk81X1NZU19DTEtfU0QsCisJVU5JUEhJRVJfU0xEM19TWVNfQ0xLX1NURE1BQyg4KSwJCQkvKiBIU0MsIFJMRSAqLworCS8qIEdJTyBpcyBhbHdheXMgY2xvY2stZW5hYmxlZDogbm8gZnVuY3Rpb24gZm9yIDB4MjEwNCBiaXQ2ICovCisJVU5JUEhJRVJfUFJPNF9TWVNfQ0xLX1VTQjMoMTQsIDApLAorCVVOSVBISUVSX1BSTzRfU1lTX0NMS19VU0IzKDE1LCAxKSwKKwkvKiBUaGUgZG9jdW1lbnQgbWVudGlvbnMgMHgyMTA0IGJpdCAxOCwgYnV0IG5vdCBmdW5jdGlvbmFsICovCisJVU5JUEhJRVJfQ0xLX0dBVEUoInVzYjMwLXBoeSIsIDE2LCBOVUxMLCAweDIxMDQsIDE5KSwKKwlVTklQSElFUl9DTEtfR0FURSgidXNiMzEtcGh5IiwgMjAsIE5VTEwsIDB4MjEwNCwgMjApLAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKKworY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19kYXRhIHVuaXBoaWVyX2xkMTFfc3lzX2Nsa19kYXRhW10gPSB7CisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigic3BsbCIsIC0xLCAicmVmIiwgODAsIDEpLAkJLyogMjAwMCBNSHogKi8KKwlVTklQSElFUl9DTEtfRkFDVE9SKCJ1YXJ0IiwgMCwgInNwbGwiLCAxLCAzNCksCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigiaTJjIiwgMSwgInNwbGwiLCAxLCA0MCksCisJVU5JUEhJRVJfTEQxMV9TWVNfQ0xLX1NURE1BQyg4KSwJCQkvKiBIU0MsIE1JTyAqLworCVVOSVBISUVSX0NMS19GQUNUT1IoInVzYjIiLCAtMSwgInJlZiIsIDI0LCAyNSksCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfbGQyMF9zeXNfY2xrX2RhdGFbXSA9IHsKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJzcGxsIiwgLTEsICJyZWYiLCA4MCwgMSksCQkvKiAyMDAwIE1IeiAqLworCVVOSVBISUVSX0NMS19GQUNUT1IoInVhcnQiLCAwLCAic3BsbCIsIDEsIDM0KSwKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJpMmMiLCAxLCAic3BsbCIsIDEsIDQwKSwKKwlVTklQSElFUl9MRDIwX1NZU19DTEtfU0QsCisJVU5JUEhJRVJfTEQxMV9TWVNfQ0xLX1NURE1BQyg4KSwJCQkvKiBIU0MgKi8KKwkvKiBHSU8gaXMgYWx3YXlzIGNsb2NrLWVuYWJsZWQ6IG5vIGZ1bmN0aW9uIGZvciAweDIxMGMgYml0NSAqLworCS8qCisJICogY2xvY2sgZm9yIFVTQiBMaW5rIGlzIGVuYWJsZWQgYnkgdGhlIGxvZ2ljICJPUiIgb2YgYml0IDE0IGFuZCBiaXQgMTUuCisJICogV2UgZG8gbm90IHVzZSBiaXQgMTUgaGVyZS4KKwkgKi8KKwlVTklQSElFUl9DTEtfR0FURSgidXNiMzAiLCAxNCwgTlVMTCwgMHgyMTBjLCAxNCksCisJVU5JUEhJRVJfQ0xLX0dBVEUoInVzYjMwLXBoeTAiLCAxNiwgTlVMTCwgMHgyMTBjLCAxMiksCisJVU5JUEhJRVJfQ0xLX0dBVEUoInVzYjMwLXBoeTEiLCAxNywgTlVMTCwgMHgyMTBjLCAxMyksCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLmggYi9kcml2ZXJzL2Nsay91bmlwaGllci9jbGstdW5pcGhpZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWUxODQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgU29jaW9uZXh0IEluYy4KKyAqICAgQXV0aG9yOiBNYXNhaGlybyBZYW1hZGEgPHlhbWFkYS5tYXNhaGlyb0Bzb2Npb25leHQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQ0xLX1VOSVBISUVSX0hfXworI2RlZmluZSBfX0NMS19VTklQSElFUl9IX18KKworc3RydWN0IGNsa19odzsKK3N0cnVjdCBkZXZpY2U7CitzdHJ1Y3QgcmVnbWFwOworCisjZGVmaW5lIFVOSVBISUVSX0NMS19NVVhfTUFYX1BBUkVOVFMJOAorCitlbnVtIHVuaXBoaWVyX2Nsa190eXBlIHsKKwlVTklQSElFUl9DTEtfVFlQRV9GSVhFRF9GQUNUT1IsCisJVU5JUEhJRVJfQ0xLX1RZUEVfRklYRURfUkFURSwKKwlVTklQSElFUl9DTEtfVFlQRV9HQVRFLAorCVVOSVBISUVSX0NMS19UWVBFX01VWCwKK307CisKK3N0cnVjdCB1bmlwaGllcl9jbGtfZml4ZWRfZmFjdG9yX2RhdGEgeworCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOworCXVuc2lnbmVkIGludCBtdWx0OworCXVuc2lnbmVkIGludCBkaXY7Cit9OworCitzdHJ1Y3QgdW5pcGhpZXJfY2xrX2ZpeGVkX3JhdGVfZGF0YSB7CisJdW5zaWduZWQgbG9uZyBmaXhlZF9yYXRlOworfTsKKworc3RydWN0IHVuaXBoaWVyX2Nsa19nYXRlX2RhdGEgeworCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOworCXVuc2lnbmVkIGludCByZWc7CisJdW5zaWduZWQgaW50IGJpdDsKK307CisKK3N0cnVjdCB1bmlwaGllcl9jbGtfbXV4X2RhdGEgeworCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lc1tVTklQSElFUl9DTEtfTVVYX01BWF9QQVJFTlRTXTsKKwl1bnNpZ25lZCBpbnQgbnVtX3BhcmVudHM7CisJdW5zaWduZWQgaW50IHJlZzsKKwl1bnNpZ25lZCBpbnQgbWFza3NbVU5JUEhJRVJfQ0xLX01VWF9NQVhfUEFSRU5UU107CisJdW5zaWduZWQgaW50IHZhbHNbVU5JUEhJRVJfQ0xLX01VWF9NQVhfUEFSRU5UU107Cit9OworCitzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJZW51bSB1bmlwaGllcl9jbGtfdHlwZSB0eXBlOworCWludCBpZHg7CisJdW5pb24geworCQlzdHJ1Y3QgdW5pcGhpZXJfY2xrX2ZpeGVkX2ZhY3Rvcl9kYXRhIGZhY3RvcjsKKwkJc3RydWN0IHVuaXBoaWVyX2Nsa19maXhlZF9yYXRlX2RhdGEgcmF0ZTsKKwkJc3RydWN0IHVuaXBoaWVyX2Nsa19nYXRlX2RhdGEgZ2F0ZTsKKwkJc3RydWN0IHVuaXBoaWVyX2Nsa19tdXhfZGF0YSBtdXg7CisJfSBkYXRhOworfTsKKworI2RlZmluZSBVTklQSElFUl9DTEtfRkFDVE9SKF9uYW1lLCBfaWR4LCBfcGFyZW50LCBfbXVsdCwgX2RpdikJXAorCXsJCQkJCQkJXAorCQkubmFtZSA9IChfbmFtZSksCQkJCVwKKwkJLnR5cGUgPSBVTklQSElFUl9DTEtfVFlQRV9GSVhFRF9GQUNUT1IsCQlcCisJCS5pZHggPSAoX2lkeCksCQkJCQlcCisJCS5kYXRhLmZhY3RvciA9IHsJCQkJXAorCQkJLnBhcmVudF9uYW1lID0gKF9wYXJlbnQpLAkJXAorCQkJLm11bHQgPSAoX211bHQpLAkJCVwKKwkJCS5kaXYgPSAoX2RpdiksCQkJCVwKKwkJfSwJCQkJCQlcCisJfQorCisKKyNkZWZpbmUgVU5JUEhJRVJfQ0xLX0dBVEUoX25hbWUsIF9pZHgsIF9wYXJlbnQsIF9yZWcsIF9iaXQpCVwKKwl7CQkJCQkJCVwKKwkJLm5hbWUgPSAoX25hbWUpLAkJCQlcCisJCS50eXBlID0gVU5JUEhJRVJfQ0xLX1RZUEVfR0FURSwJCQlcCisJCS5pZHggPSAoX2lkeCksCQkJCQlcCisJCS5kYXRhLmdhdGUgPSB7CQkJCQlcCisJCQkucGFyZW50X25hbWUgPSAoX3BhcmVudCksCQlcCisJCQkucmVnID0gKF9yZWcpLAkJCQlcCisJCQkuYml0ID0gKF9iaXQpLAkJCQlcCisJCX0sCQkJCQkJXAorCX0KKworCitzdHJ1Y3QgY2xrX2h3ICp1bmlwaGllcl9jbGtfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJCWNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZml4ZWRfZmFjdG9yX2RhdGEgKmRhdGEpOworc3RydWN0IGNsa19odyAqdW5pcGhpZXJfY2xrX3JlZ2lzdGVyX2ZpeGVkX3JhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkJY29uc3QgY2hhciAqbmFtZSwKKwkJCWNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZml4ZWRfcmF0ZV9kYXRhICpkYXRhKTsKK3N0cnVjdCBjbGtfaHcgKnVuaXBoaWVyX2Nsa19yZWdpc3Rlcl9nYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCisJCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQljb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2dhdGVfZGF0YSAqZGF0YSk7CitzdHJ1Y3QgY2xrX2h3ICp1bmlwaGllcl9jbGtfcmVnaXN0ZXJfbXV4KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKKwkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19tdXhfZGF0YSAqZGF0YSk7CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfc2xkM19zeXNfY2xrX2RhdGFbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfbGQ0X3N5c19jbGtfZGF0YVtdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9wcm80X3N5c19jbGtfZGF0YVtdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9zbGQ4X3N5c19jbGtfZGF0YVtdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9wcm81X3N5c19jbGtfZGF0YVtdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9weHMyX3N5c19jbGtfZGF0YVtdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9sZDExX3N5c19jbGtfZGF0YVtdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9sZDIwX3N5c19jbGtfZGF0YVtdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9zbGQzX21pb19jbGtfZGF0YVtdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9wcm81X21pb19jbGtfZGF0YVtdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9sZDRfcGVyaV9jbGtfZGF0YVtdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9wcm80X3BlcmlfY2xrX2RhdGFbXTsKKworI2VuZGlmIC8qIF9fQ0xLX1VOSVBISUVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvdmVyc2F0aWxlL2Nsay1pY3N0LmMgYi9kcml2ZXJzL2Nsay92ZXJzYXRpbGUvY2xrLWljc3QuYwppbmRleCA1ZTliNjUyLi40ZmFhOTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay92ZXJzYXRpbGUvY2xrLWljc3QuYworKysgYi9kcml2ZXJzL2Nsay92ZXJzYXRpbGUvY2xrLWljc3QuYwpAQCAtMjcsNiArMjcsMjYgQEAKIC8qIE1hZ2ljIHVubG9ja2luZyB0b2tlbiB1c2VkIG9uIGFsbCBWZXJzYXRpbGUgYm9hcmRzICovCiAjZGVmaW5lIFZFUlNBVElMRV9MT0NLX1ZBTAkweEEwNUYKIAorI2RlZmluZSBWRVJTQVRJTEVfQVVYX09TQ19CSVRTIDB4N0ZGRkYKKyNkZWZpbmUgSU5URUdSQVRPUl9BUF9DTV9CSVRTIDB4RkYKKyNkZWZpbmUgSU5URUdSQVRPUl9BUF9TWVNfQklUUyAweEZGCisjZGVmaW5lIElOVEVHUkFUT1JfQ1BfQ01fQ09SRV9CSVRTIDB4N0ZGCisjZGVmaW5lIElOVEVHUkFUT1JfQ1BfQ01fTUVNX0JJVFMgMHg3RkYwMDAKKworI2RlZmluZSBJTlRFR1JBVE9SX0FQX1BDSV8yNV8zM19NSFogQklUKDgpCisKKy8qKgorICogZW51bSBpY3N0X2NvbnRyb2xfdHlwZSAtIHRoZSB0eXBlIG9mIElDU1QgY29udHJvbCByZWdpc3RlcgorICovCitlbnVtIGljc3RfY29udHJvbF90eXBlIHsKKwlJQ1NUX1ZFUlNBVElMRSwgLyogVGhlIHN0YW5kYXJkIHR5cGUsIGFsbCBjb250cm9sIGJpdHMgYXZhaWxhYmxlICovCisJSUNTVF9JTlRFR1JBVE9SX0FQX0NNLCAvKiBPbmx5IDggYml0cyBvZiBWRFcgYXZhaWxhYmxlICovCisJSUNTVF9JTlRFR1JBVE9SX0FQX1NZUywgLyogT25seSA4IGJpdHMgb2YgVkRXIGF2YWlsYWJsZSAqLworCUlDU1RfSU5URUdSQVRPUl9BUF9QQ0ksIC8qIE9kZCBiaXQgcGF0dGVybiBzdG9yYWdlICovCisJSUNTVF9JTlRFR1JBVE9SX0NQX0NNX0NPUkUsIC8qIE9ubHkgOCBiaXRzIG9mIFZEVyBhbmQgMyBiaXRzIG9mIE9EICovCisJSUNTVF9JTlRFR1JBVE9SX0NQX0NNX01FTSwgLyogT25seSA4IGJpdHMgb2YgVkRXIGFuZCAzIGJpdHMgb2YgT0QgKi8KK307CisKIC8qKgogICogc3RydWN0IGNsa19pY3N0IC0gSUNTVCBWQ08gY2xvY2sgd3JhcHBlcgogICogQGh3OiBjb3JyZXNwb25kaW5nIGNsb2NrIGhhcmR3YXJlIGVudHJ5CkBAIC0zNCw2ICs1NCw3IEBACiAgKiBAbG9ja3JlZzogVkNPIGxvY2sgcmVnaXN0ZXIgYWRkcmVzcwogICogQHBhcmFtczogcGFyYW1ldGVycyBmb3IgdGhpcyBJQ1NUIGluc3RhbmNlCiAgKiBAcmF0ZTogY3VycmVudCByYXRlCisgKiBAY3R5cGU6IHRoZSB0eXBlIG9mIGNvbnRyb2wgcmVnaXN0ZXIgZm9yIHRoZSBJQ1NUCiAgKi8KIHN0cnVjdCBjbGtfaWNzdCB7CiAJc3RydWN0IGNsa19odyBodzsKQEAgLTQyLDYgKzYzLDcgQEAKIAl1MzIgbG9ja3JlZ19vZmY7CiAJc3RydWN0IGljc3RfcGFyYW1zICpwYXJhbXM7CiAJdW5zaWduZWQgbG9uZyByYXRlOworCWVudW0gaWNzdF9jb250cm9sX3R5cGUgY3R5cGU7CiB9OwogCiAjZGVmaW5lIHRvX2ljc3QoX2h3KSBjb250YWluZXJfb2YoX2h3LCBzdHJ1Y3QgY2xrX2ljc3QsIGh3KQpAQCAtNTksNiArODEsNzYgQEAKIAlyZXQgPSByZWdtYXBfcmVhZChpY3N0LT5tYXAsIGljc3QtPnZjb3JlZ19vZmYsICZ2YWwpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIFRoZSBJbnRlZ3JhdG9yL0FQIGNvcmUgY2xvY2sgY2FuIG9ubHkgYWNjZXNzIHRoZSBsb3cgZWlnaHQKKwkgKiBiaXRzIG9mIHRoZSB2IFBMTCBkaXZpZGVyLiBCaXQgOCBpcyB0aWVkIGxvdyBhbmQgYWx3YXlzIHplcm8sCisJICogciBpcyBoYXJkd2lyZWQgdG8gMjIgYW5kIG91dHB1dCBkaXZpZGVyIHMgaXMgaGFyZHdpcmVkIHRvIDEKKwkgKiAoZGl2aWRlIGJ5IDIpIGFjY29yZGluZyB0byB0aGUgZG9jdW1lbnQKKwkgKiAiSW50ZWdyYXRvciBDTTkyNkVKLVMsIENNOTQ2RS1TLCBDTTk2NkUtUywgQ00xMDI2RUotUyBhbmQKKwkgKiBDTTExMzZKRi1TIFVzZXIgR3VpZGUiIEFSTSBEVUkgMDEzOEUsIHBhZ2UgMy0xMyB0aHJ1IDMtMTQuCisJICovCisJaWYgKGljc3QtPmN0eXBlID09IElDU1RfSU5URUdSQVRPUl9BUF9DTSkgeworCQl2Y28tPnYgPSB2YWwgJiBJTlRFR1JBVE9SX0FQX0NNX0JJVFM7CisJCXZjby0+ciA9IDIyOworCQl2Y28tPnMgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFRoZSBJbnRlZ3JhdG9yL0FQIHN5c3RlbSBjbG9jayBvbiB0aGUgYmFzZSBib2FyZCBjYW4gb25seQorCSAqIGFjY2VzcyB0aGUgbG93IGVpZ2h0IGJpdHMgb2YgdGhlIHYgUExMIGRpdmlkZXIuIEJpdCA4IGlzIHRpZWQgbG93CisJICogYW5kIGFsd2F5cyB6ZXJvLCByIGlzIGhhcmR3aXJlZCB0byA0NiwgYW5kIHRoZSBvdXRwdXQgZGl2aWRlciBpcworCSAqIGhhcmR3aXJlZCB0byAzIChkaXZpZGUgYnkgNCkgYWNjb3JkaW5nIHRvIHRoZSBkb2N1bWVudAorCSAqICJJbnRlZ3JhdG9yIEFQIEFTSUMgRGV2ZWxvcG1lbnQgTW90aGVyYm9hcmQiIEFSTSBEVUkgMDA5OEIsCisJICogcGFnZSAzLTE2LgorCSAqLworCWlmIChpY3N0LT5jdHlwZSA9PSBJQ1NUX0lOVEVHUkFUT1JfQVBfU1lTKSB7CisJCXZjby0+diA9IHZhbCAmIElOVEVHUkFUT1JfQVBfU1lTX0JJVFM7CisJCXZjby0+ciA9IDQ2OworCQl2Y28tPnMgPSAzOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFRoZSBJbnRlZ3JhdG9yL0FQIFBDSSBjbG9jayBpcyB1c2luZyBhbiBvZGQgcGF0dGVybiB0byBjcmVhdGUKKwkgKiB0aGUgY2hpbGQgY2xvY2ssIGJhc2ljYWxseSBhIHNpbmdsZSBiaXQgY2FsbGVkIERJVlgvWSBpcyB1c2VkCisJICogdG8gc2VsZWN0IGJldHdlZW4gdHdvIGRpZmZlcmVudCBoYXJkd2lyZWQgdmFsdWVzOiBzZXR0aW5nIHRoZQorCSAqIGJpdCB0byAwIHlpZWxkcyB2ID0gMTcsIHIgPSAyMiBhbmQgT0QgPSAxLCB3aGVyZWFzIHNldHRpbmcgdGhlCisJICogYml0IHRvIDEgeWllbGRzIHYgPSAxNCwgciA9IDE0IGFuZCBPRCA9IDEgZ2l2aW5nIHRoZSBmcmVxdWVuY2llcworCSAqIDMzIG9yIDI1IE1IeiByZXNwZWN0aXZlbHkuCisJICovCisJaWYgKGljc3QtPmN0eXBlID09IElDU1RfSU5URUdSQVRPUl9BUF9QQ0kpIHsKKwkJYm9vbCBkaXZ4eSA9ICEhKHZhbCAmIElOVEVHUkFUT1JfQVBfUENJXzI1XzMzX01IWik7CisKKwkJdmNvLT52ID0gZGl2eHkgPyAxNyA6IDE0OworCQl2Y28tPnIgPSBkaXZ4eSA/IDIyIDogMTQ7CisJCXZjby0+cyA9IDE7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogVGhlIEludGVncmF0b3IvQ1AgY29yZSBjbG9jayBjYW4gYWNjZXNzIHRoZSBsb3cgZWlnaHQgYml0cworCSAqIG9mIHRoZSB2IFBMTCBkaXZpZGVyLiBCaXQgOCBpcyB0aWVkIGxvdyBhbmQgYWx3YXlzIHplcm8sCisJICogciBpcyBoYXJkd2lyZWQgdG8gMjIgYW5kIHRoZSBvdXRwdXQgZGl2aWRlciBzIGlzIGFjY2Vzc2libGUKKwkgKiBpbiBiaXRzIDggdGhydSAxMCBhY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50CisJICogIkludGVncmF0b3IvQ005NDBULCBDTTkyMFQsIENNNzQwVCwgYW5kIENNNzIwVCBVc2VyIEd1aWRlIgorCSAqIEFSTSBEVUkgMDE1N0EsIHBhZ2UgMy0yMCB0aHJ1IDMtMjMgYW5kIDQtMTAuCisJICovCisJaWYgKGljc3QtPmN0eXBlID09IElDU1RfSU5URUdSQVRPUl9DUF9DTV9DT1JFKSB7CisJCXZjby0+diA9IHZhbCAmIDB4RkY7CisJCXZjby0+ciA9IDIyOworCQl2Y28tPnMgPSAodmFsID4+IDgpICYgNzsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGljc3QtPmN0eXBlID09IElDU1RfSU5URUdSQVRPUl9DUF9DTV9NRU0pIHsKKwkJdmNvLT52ID0gKHZhbCA+PiAxMikgJiAweEZGOworCQl2Y28tPnIgPSAyMjsKKwkJdmNvLT5zID0gKHZhbCA+PiAyMCkgJiA3OworCQlyZXR1cm4gMDsKKwl9CisKIAl2Y28tPnYgPSB2YWwgJiAweDFmZjsKIAl2Y28tPnIgPSAodmFsID4+IDkpICYgMHg3ZjsKIAl2Y28tPnMgPSAodmFsID4+IDE2KSAmIDAzOwpAQCAtNzIsMjIgKzE2NCw2MiBAQAogICovCiBzdGF0aWMgaW50IHZjb19zZXQoc3RydWN0IGNsa19pY3N0ICppY3N0LCBzdHJ1Y3QgaWNzdF92Y28gdmNvKQogeworCXUzMiBtYXNrOwogCXUzMiB2YWw7CiAJaW50IHJldDsKIAotCXJldCA9IHJlZ21hcF9yZWFkKGljc3QtPm1hcCwgaWNzdC0+dmNvcmVnX29mZiwgJnZhbCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkvKiBNYXNrIHRoZSBiaXRzIHVzZWQgYnkgdGhlIFZDTyAqLworCXN3aXRjaCAoaWNzdC0+Y3R5cGUpIHsKKwljYXNlIElDU1RfSU5URUdSQVRPUl9BUF9DTToKKwkJbWFzayA9IElOVEVHUkFUT1JfQVBfQ01fQklUUzsKKwkJdmFsID0gdmNvLnYgJiAweEZGOworCQlpZiAodmNvLnYgJiAweDEwMCkKKwkJCXByX2VycigiSUNTVCBlcnJvcjogdHJpZWQgdG8gc2V0IGJpdCA4IG9mIFZEV1xuIik7CisJCWlmICh2Y28ucyAhPSAxKQorCQkJcHJfZXJyKCJJQ1NUIGVycm9yOiB0cmllZCB0byB1c2UgVk9EICE9IDFcbiIpOworCQlpZiAodmNvLnIgIT0gMjIpCisJCQlwcl9lcnIoIklDU1QgZXJyb3I6IHRyaWVkIHRvIHVzZSBSRFcgIT0gMjJcbiIpOworCQlicmVhazsKKwljYXNlIElDU1RfSU5URUdSQVRPUl9BUF9TWVM6CisJCW1hc2sgPSBJTlRFR1JBVE9SX0FQX1NZU19CSVRTOworCQl2YWwgPSB2Y28udiAmIDB4RkY7CisJCWlmICh2Y28udiAmIDB4MTAwKQorCQkJcHJfZXJyKCJJQ1NUIGVycm9yOiB0cmllZCB0byBzZXQgYml0IDggb2YgVkRXXG4iKTsKKwkJaWYgKHZjby5zICE9IDMpCisJCQlwcl9lcnIoIklDU1QgZXJyb3I6IHRyaWVkIHRvIHVzZSBWT0QgIT0gMVxuIik7CisJCWlmICh2Y28uciAhPSA0NikKKwkJCXByX2VycigiSUNTVCBlcnJvcjogdHJpZWQgdG8gdXNlIFJEVyAhPSAyMlxuIik7CisJCWJyZWFrOworCWNhc2UgSUNTVF9JTlRFR1JBVE9SX0NQX0NNX0NPUkU6CisJCW1hc2sgPSBJTlRFR1JBVE9SX0NQX0NNX0NPUkVfQklUUzsgLyogVXNlcyAxMiBiaXRzICovCisJCXZhbCA9ICh2Y28udiAmIDB4RkYpIHwgdmNvLnMgPDwgODsKKwkJaWYgKHZjby52ICYgMHgxMDApCisJCQlwcl9lcnIoIklDU1QgZXJyb3I6IHRyaWVkIHRvIHNldCBiaXQgOCBvZiBWRFdcbiIpOworCQlpZiAodmNvLnIgIT0gMjIpCisJCQlwcl9lcnIoIklDU1QgZXJyb3I6IHRyaWVkIHRvIHVzZSBSRFcgIT0gMjJcbiIpOworCQlicmVhazsKKwljYXNlIElDU1RfSU5URUdSQVRPUl9DUF9DTV9NRU06CisJCW1hc2sgPSBJTlRFR1JBVE9SX0NQX0NNX01FTV9CSVRTOyAvKiBVc2VzIDEyIGJpdHMgKi8KKwkJdmFsID0gKCh2Y28udiAmIDB4RkYpIDw8IDEyKSB8ICh2Y28ucyA8PCAyMCk7CisJCWlmICh2Y28udiAmIDB4MTAwKQorCQkJcHJfZXJyKCJJQ1NUIGVycm9yOiB0cmllZCB0byBzZXQgYml0IDggb2YgVkRXXG4iKTsKKwkJaWYgKHZjby5yICE9IDIyKQorCQkJcHJfZXJyKCJJQ1NUIGVycm9yOiB0cmllZCB0byB1c2UgUkRXICE9IDIyXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogUmVndWxhciBhdXhpbGFyeSBvc2NpbGxhdG9yICovCisJCW1hc2sgPSBWRVJTQVRJTEVfQVVYX09TQ19CSVRTOworCQl2YWwgPSB2Y28udiB8ICh2Y28uciA8PCA5KSB8ICh2Y28ucyA8PCAxNik7CisJCWJyZWFrOworCX0KIAotCS8qIE1hc2sgdGhlIDE4IGJpdHMgdXNlZCBieSB0aGUgVkNPICovCi0JdmFsICY9IH4weDdmZmZmOwotCXZhbCB8PSB2Y28udiB8ICh2Y28uciA8PCA5KSB8ICh2Y28ucyA8PCAxNik7CisJcHJfZGVidWcoIklDU1Q6IG5ldyB2YWwgPSAweCUwOHhcbiIsIHZhbCk7CiAKIAkvKiBUaGlzIG1hZ2ljIHVubG9ja3MgdGhlIFZDTyBzbyBpdCBjYW4gYmUgY29udHJvbGxlZCAqLwogCXJldCA9IHJlZ21hcF93cml0ZShpY3N0LT5tYXAsIGljc3QtPmxvY2tyZWdfb2ZmLCBWRVJTQVRJTEVfTE9DS19WQUwpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JcmV0ID0gcmVnbWFwX3dyaXRlKGljc3QtPm1hcCwgaWNzdC0+dmNvcmVnX29mZiwgdmFsKTsKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoaWNzdC0+bWFwLCBpY3N0LT52Y29yZWdfb2ZmLCBtYXNrLCB2YWwpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJLyogVGhpcyBsb2NrcyB0aGUgVkNPIGFnYWluICovCkBAIC0xMjEsNiArMjUzLDQ2IEBACiAJc3RydWN0IGNsa19pY3N0ICppY3N0ID0gdG9faWNzdChodyk7CiAJc3RydWN0IGljc3RfdmNvIHZjbzsKIAorCWlmIChpY3N0LT5jdHlwZSA9PSBJQ1NUX0lOVEVHUkFUT1JfQVBfQ00gfHwKKwkgICAgaWNzdC0+Y3R5cGUgPT0gSUNTVF9JTlRFR1JBVE9SX0NQX0NNX0NPUkUpIHsKKwkJaWYgKHJhdGUgPD0gMTIwMDAwMDApCisJCQlyZXR1cm4gMTIwMDAwMDA7CisJCWlmIChyYXRlID49IDE2MDAwMDAwMCkKKwkJCXJldHVybiAxNjAwMDAwMDA7CisJCS8qIFNsYW0gdG8gY2xvc2VzdCBtZWdhaGVydHogKi8KKwkJcmV0dXJuIERJVl9ST1VORF9DTE9TRVNUKHJhdGUsIDEwMDAwMDApICogMTAwMDAwMDsKKwl9CisKKwlpZiAoaWNzdC0+Y3R5cGUgPT0gSUNTVF9JTlRFR1JBVE9SX0NQX0NNX01FTSkgeworCQlpZiAocmF0ZSA8PSA2MDAwMDAwKQorCQkJcmV0dXJuIDYwMDAwMDA7CisJCWlmIChyYXRlID49IDY2MDAwMDAwKQorCQkJcmV0dXJuIDY2MDAwMDAwOworCQkvKiBTbGFtIHRvIGNsb3Nlc3QgMC41IG1lZ2FoZXJ0eiAqLworCQlyZXR1cm4gRElWX1JPVU5EX0NMT1NFU1QocmF0ZSwgNTAwMDAwKSAqIDUwMDAwMDsKKwl9CisKKwlpZiAoaWNzdC0+Y3R5cGUgPT0gSUNTVF9JTlRFR1JBVE9SX0FQX1NZUykgeworCQkvKiBEaXZpZGVzIGJldHdlZW4gMyBhbmQgNTAgTUh6IGluIHN0ZXBzIG9mIDAuMjUgTUh6ICovCisJCWlmIChyYXRlIDw9IDMwMDAwMDApCisJCQlyZXR1cm4gMzAwMDAwMDsKKwkJaWYgKHJhdGUgPj0gNTAwMDAwMDApCisJCQlyZXR1cm4gNTAwMDAwMDsKKwkJLyogU2xhbSB0byBjbG9zZXN0IDAuMjUgTUh6ICovCisJCXJldHVybiBESVZfUk9VTkRfQ0xPU0VTVChyYXRlLCAyNTAwMDApICogMjUwMDAwOworCX0KKworCWlmIChpY3N0LT5jdHlwZSA9PSBJQ1NUX0lOVEVHUkFUT1JfQVBfUENJKSB7CisJCS8qCisJCSAqIElmIHdlJ3JlIGJlbG93IG9yIGxlc3MgdGhhbiBoYWxmd2F5IGZyb20gMjUgdG8gMzMgTUh6CisJCSAqIHNlbGVjdCAyNSBNSHoKKwkJICovCisJCWlmIChyYXRlIDw9IDI1MDAwMDAwIHx8IHJhdGUgPCAyOTAwMDAwMCkKKwkJCXJldHVybiAyNTAwMDAwMDsKKwkJLyogRWxzZSBqdXN0IHJldHVybiB0aGUgZGVmYXVsdCBmcmVxdWVuY3kgKi8KKwkJcmV0dXJuIDMzMDAwMDAwOworCX0KKwogCXZjbyA9IGljc3RfaHpfdG9fdmNvKGljc3QtPnBhcmFtcywgcmF0ZSk7CiAJcmV0dXJuIGljc3RfaHooaWNzdC0+cGFyYW1zLCB2Y28pOwogfQpAQCAtMTMxLDYgKzMwMywzNiBAQAogCXN0cnVjdCBjbGtfaWNzdCAqaWNzdCA9IHRvX2ljc3QoaHcpOwogCXN0cnVjdCBpY3N0X3ZjbyB2Y287CiAKKwlpZiAoaWNzdC0+Y3R5cGUgPT0gSUNTVF9JTlRFR1JBVE9SX0FQX1BDSSkgeworCQkvKiBUaGlzIGNsb2NrIGlzIGVzcGVjaWFsbHkgcHJpbWl0aXZlICovCisJCXVuc2lnbmVkIGludCB2YWw7CisJCWludCByZXQ7CisKKwkJaWYgKHJhdGUgPT0gMjUwMDAwMDApIHsKKwkJCXZhbCA9IDA7CisJCX0gZWxzZSBpZiAocmF0ZSA9PSAzMzAwMDAwMCkgeworCQkJdmFsID0gSU5URUdSQVRPUl9BUF9QQ0lfMjVfMzNfTUhaOworCQl9IGVsc2UgeworCQkJcHJfZXJyKCJJQ1NUOiBjYW5ub3Qgc2V0IFBDSSBmcmVxdWVuY3kgJWx1XG4iLAorCQkJICAgICAgIHJhdGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmV0ID0gcmVnbWFwX3dyaXRlKGljc3QtPm1hcCwgaWNzdC0+bG9ja3JlZ19vZmYsCisJCQkJICAgVkVSU0FUSUxFX0xPQ0tfVkFMKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhpY3N0LT5tYXAsIGljc3QtPnZjb3JlZ19vZmYsCisJCQkJCSBJTlRFR1JBVE9SX0FQX1BDSV8yNV8zM19NSFosCisJCQkJCSB2YWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJLyogVGhpcyBsb2NrcyB0aGUgVkNPIGFnYWluICovCisJCXJldCA9IHJlZ21hcF93cml0ZShpY3N0LT5tYXAsIGljc3QtPmxvY2tyZWdfb2ZmLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXJldHVybiAwOworCX0KKwogCWlmIChwYXJlbnRfcmF0ZSkKIAkJaWNzdC0+cGFyYW1zLT5yZWYgPSBwYXJlbnRfcmF0ZTsKIAl2Y28gPSBpY3N0X2h6X3RvX3ZjbyhpY3N0LT5wYXJhbXMsIHJhdGUpOwpAQCAtMTQ4LDcgKzM1MCw4IEBACiAJCQkJICBjb25zdCBzdHJ1Y3QgY2xrX2ljc3RfZGVzYyAqZGVzYywKIAkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJICBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKLQkJCQkgIHN0cnVjdCByZWdtYXAgKm1hcCkKKwkJCQkgIHN0cnVjdCByZWdtYXAgKm1hcCwKKwkJCQkgIGVudW0gaWNzdF9jb250cm9sX3R5cGUgY3R5cGUpCiB7CiAJc3RydWN0IGNsayAqY2xrOwogCXN0cnVjdCBjbGtfaWNzdCAqaWNzdDsKQEAgLTE3OCw2ICszODEsNyBAQAogCWljc3QtPnBhcmFtcyA9IHBjbG9uZTsKIAlpY3N0LT52Y29yZWdfb2ZmID0gZGVzYy0+dmNvX29mZnNldDsKIAlpY3N0LT5sb2NrcmVnX29mZiA9IGRlc2MtPmxvY2tfb2Zmc2V0OworCWljc3QtPmN0eXBlID0gY3R5cGU7CiAKIAljbGsgPSBjbGtfcmVnaXN0ZXIoZGV2LCAmaWNzdC0+aHcpOwogCWlmIChJU19FUlIoY2xrKSkgewpAQCAtMjA2LDcgKzQxMCw4IEBACiAJCXByX2VycigiY291bGQgbm90IGluaXRpYWxpemUgSUNTVCByZWdtYXBcbiIpOwogCQlyZXR1cm4gRVJSX0NBU1QobWFwKTsKIAl9Ci0JcmV0dXJuIGljc3RfY2xrX3NldHVwKGRldiwgZGVzYywgbmFtZSwgcGFyZW50X25hbWUsIG1hcCk7CisJcmV0dXJuIGljc3RfY2xrX3NldHVwKGRldiwgZGVzYywgbmFtZSwgcGFyZW50X25hbWUsIG1hcCwKKwkJCSAgICAgIElDU1RfVkVSU0FUSUxFKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGljc3RfY2xrX3JlZ2lzdGVyKTsKIApAQCAtMjM5LDYgKzQ0NCw1NiBAQAogCS5pZHgycwkJPSBpY3N0MzA3X2lkeDJzLAogfTsKIAorLyoqCisgKiBUaGUgY29yZSBtb2R1bGVzIG9uIHRoZSBJbnRlZ3JhdG9yL0FQIGFuZCBJbnRlZ3JhdG9yL0NQIGhhdmUKKyAqIGVzcGVjaWFsbHkgY3JpcHBsZWQgSUNTVDUyNSBjb250cm9sLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGljc3RfcGFyYW1zIGljc3Q1MjVfYXBjcF9jbV9wYXJhbXMgPSB7CisJLnZjb19tYXgJPSBJQ1NUNTI1X1ZDT19NQVhfNVYsCisJLnZjb19taW4JPSBJQ1NUNTI1X1ZDT19NSU4sCisJLyogTWluaW11bSAxMiBNSHosIFZEVyA9IDQgKi8KKwkudmRfbWluCQk9IDEyLAorCS8qCisJICogTWF4aW11bSAxNjAgTUh6LCBWRFcgPSAxNTIgZm9yIGFsbCBjb3JlIG1vZHVsZXMsIGJ1dAorCSAqIENNOTI2RUotUywgQ00xMDI2RUotUyBhbmQgQ00xMTM2SkYtUyBjYW4gYWN0dWFsbHkKKwkgKiBnbyB0byAyMDAgTUh6IChtYXggVkRXID0gMTkyKS4KKwkgKi8KKwkudmRfbWF4CQk9IDE5MiwKKwkvKiByIGlzIGhhcmRjb2RlZCB0byAyMiBhbmQgdGhpcyBpcyB0aGUgYWN0dWFsIGRpdmlzb3IsICsyICovCisJLnJkX21pbgkJPSAyNCwKKwkucmRfbWF4CQk9IDI0LAorCS5zMmRpdgkJPSBpY3N0NTI1X3MyZGl2LAorCS5pZHgycwkJPSBpY3N0NTI1X2lkeDJzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpY3N0X3BhcmFtcyBpY3N0NTI1X2FwX3N5c19wYXJhbXMgPSB7CisJLnZjb19tYXgJPSBJQ1NUNTI1X1ZDT19NQVhfNVYsCisJLnZjb19taW4JPSBJQ1NUNTI1X1ZDT19NSU4sCisJLyogTWluaW11bSAzIE1IeiwgVkRXID0gNCAqLworCS52ZF9taW4JCT0gMywKKwkvKiBNYXhpbXVtIDUwIE1IeiwgVkRXID0gMTkyICovCisJLnZkX21heAkJPSA1MCwKKwkvKiByIGlzIGhhcmRjb2RlZCB0byA0NiBhbmQgdGhpcyBpcyB0aGUgYWN0dWFsIGRpdmlzb3IsICsyICovCisJLnJkX21pbgkJPSA0OCwKKwkucmRfbWF4CQk9IDQ4LAorCS5zMmRpdgkJPSBpY3N0NTI1X3MyZGl2LAorCS5pZHgycwkJPSBpY3N0NTI1X2lkeDJzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpY3N0X3BhcmFtcyBpY3N0NTI1X2FwX3BjaV9wYXJhbXMgPSB7CisJLnZjb19tYXgJPSBJQ1NUNTI1X1ZDT19NQVhfNVYsCisJLnZjb19taW4JPSBJQ1NUNTI1X1ZDT19NSU4sCisJLyogTWluaW11bSAyNSBNSHogKi8KKwkudmRfbWluCQk9IDI1LAorCS8qIE1heGltdW0gMzMgTUh6ICovCisJLnZkX21heAkJPSAzMywKKwkvKiByIGlzIGhhcmRjb2RlZCB0byAxNCBvciAyMiBhbmQgdGhpcyBpcyB0aGUgYWN0dWFsIGRpdmlzb3JzICsyICovCisJLnJkX21pbgkJPSAxNiwKKwkucmRfbWF4CQk9IDI0LAorCS5zMmRpdgkJPSBpY3N0NTI1X3MyZGl2LAorCS5pZHgycwkJPSBpY3N0NTI1X2lkeDJzLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IG9mX3N5c2Nvbl9pY3N0X3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQ7CkBAIC0yNDcsNiArNTAyLDcgQEAKIAljb25zdCBjaGFyICpuYW1lID0gbnAtPm5hbWU7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CiAJc3RydWN0IGNsayAqcmVnY2xrOworCWVudW0gaWNzdF9jb250cm9sX3R5cGUgY3R5cGU7CiAKIAkvKiBXZSBkbyBub3QgcmVsZWFzZSB0aGlzIHJlZmVyZW5jZSwgd2UgYXJlIHVzaW5nIGl0IHBlcnBldHVhbGx5ICovCiAJcGFyZW50ID0gb2ZfZ2V0X3BhcmVudChucCk7CkBAIC0yNjksMTEgKzUyNSwyOCBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiYXJtLHN5c2Nvbi1pY3N0NTI1IikpCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiYXJtLHN5c2Nvbi1pY3N0NTI1IikpIHsKIAkJaWNzdF9kZXNjLnBhcmFtcyA9ICZpY3N0NTI1X3BhcmFtczsKLQllbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImFybSxzeXNjb24taWNzdDMwNyIpKQorCQljdHlwZSA9IElDU1RfVkVSU0FUSUxFOworCX0gZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJhcm0sc3lzY29uLWljc3QzMDciKSkgewogCQlpY3N0X2Rlc2MucGFyYW1zID0gJmljc3QzMDdfcGFyYW1zOwotCWVsc2UgeworCQljdHlwZSA9IElDU1RfVkVSU0FUSUxFOworCX0gZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJhcm0sc3lzY29uLWljc3Q1MjUtaW50ZWdyYXRvcmFwLWNtIikpIHsKKwkJaWNzdF9kZXNjLnBhcmFtcyA9ICZpY3N0NTI1X2FwY3BfY21fcGFyYW1zOworCQljdHlwZSA9IElDU1RfSU5URUdSQVRPUl9BUF9DTTsKKwl9IGVsc2UgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiYXJtLHN5c2Nvbi1pY3N0NTI1LWludGVncmF0b3JhcC1zeXMiKSkgeworCQlpY3N0X2Rlc2MucGFyYW1zID0gJmljc3Q1MjVfYXBfc3lzX3BhcmFtczsKKwkJY3R5cGUgPSBJQ1NUX0lOVEVHUkFUT1JfQVBfU1lTOworCX0gZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJhcm0sc3lzY29uLWljc3Q1MjUtaW50ZWdyYXRvcmFwLXBjaSIpKSB7CisJCWljc3RfZGVzYy5wYXJhbXMgPSAmaWNzdDUyNV9hcF9wY2lfcGFyYW1zOworCQljdHlwZSA9IElDU1RfSU5URUdSQVRPUl9BUF9QQ0k7CisJfSBlbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImFybSxzeXNjb24taWNzdDUyNS1pbnRlZ3JhdG9yY3AtY20tY29yZSIpKSB7CisJCWljc3RfZGVzYy5wYXJhbXMgPSAmaWNzdDUyNV9hcGNwX2NtX3BhcmFtczsKKwkJY3R5cGUgPSBJQ1NUX0lOVEVHUkFUT1JfQ1BfQ01fQ09SRTsKKwl9IGVsc2UgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiYXJtLHN5c2Nvbi1pY3N0NTI1LWludGVncmF0b3JjcC1jbS1tZW0iKSkgeworCQlpY3N0X2Rlc2MucGFyYW1zID0gJmljc3Q1MjVfYXBjcF9jbV9wYXJhbXM7CisJCWN0eXBlID0gSUNTVF9JTlRFR1JBVE9SX0NQX0NNX01FTTsKKwl9IGVsc2UgewogCQlwcl9lcnIoInVua25vd24gSUNTVCBjbG9jayAlc1xuIiwgbmFtZSk7CiAJCXJldHVybjsKIAl9CkBAIC0yODEsNyArNTU0LDcgQEAKIAkvKiBQYXJlbnQgY2xvY2sgbmFtZSBpcyBub3QgdGhlIHNhbWUgYXMgbm9kZSBwYXJlbnQgKi8KIAlwYXJlbnRfbmFtZSA9IG9mX2Nsa19nZXRfcGFyZW50X25hbWUobnAsIDApOwogCi0JcmVnY2xrID0gaWNzdF9jbGtfc2V0dXAoTlVMTCwgJmljc3RfZGVzYywgbmFtZSwgcGFyZW50X25hbWUsIG1hcCk7CisJcmVnY2xrID0gaWNzdF9jbGtfc2V0dXAoTlVMTCwgJmljc3RfZGVzYywgbmFtZSwgcGFyZW50X25hbWUsIG1hcCwgY3R5cGUpOwogCWlmIChJU19FUlIocmVnY2xrKSkgewogCQlwcl9lcnIoImVycm9yIHNldHRpbmcgdXAgc3lzY29uIElDU1QgY2xvY2sgJXNcbiIsIG5hbWUpOwogCQlyZXR1cm47CkBAIC0yOTQsNSArNTY3LDE0IEBACiAJICAgICAgICJhcm0sc3lzY29uLWljc3Q1MjUiLCBvZl9zeXNjb25faWNzdF9zZXR1cCk7CiBDTEtfT0ZfREVDTEFSRShhcm1fc3lzY29uX2ljc3QzMDdfY2xrLAogCSAgICAgICAiYXJtLHN5c2Nvbi1pY3N0MzA3Iiwgb2Zfc3lzY29uX2ljc3Rfc2V0dXApOwotCitDTEtfT0ZfREVDTEFSRShhcm1fc3lzY29uX2ludGVncmF0b3JhcF9jbV9jbGssCisJICAgICAgICJhcm0sc3lzY29uLWljc3Q1MjUtaW50ZWdyYXRvcmFwLWNtIiwgb2Zfc3lzY29uX2ljc3Rfc2V0dXApOworQ0xLX09GX0RFQ0xBUkUoYXJtX3N5c2Nvbl9pbnRlZ3JhdG9yYXBfc3lzX2NsaywKKwkgICAgICAgImFybSxzeXNjb24taWNzdDUyNS1pbnRlZ3JhdG9yYXAtc3lzIiwgb2Zfc3lzY29uX2ljc3Rfc2V0dXApOworQ0xLX09GX0RFQ0xBUkUoYXJtX3N5c2Nvbl9pbnRlZ3JhdG9yYXBfcGNpX2NsaywKKwkgICAgICAgImFybSxzeXNjb24taWNzdDUyNS1pbnRlZ3JhdG9yYXAtcGNpIiwgb2Zfc3lzY29uX2ljc3Rfc2V0dXApOworQ0xLX09GX0RFQ0xBUkUoYXJtX3N5c2Nvbl9pbnRlZ3JhdG9yY3BfY21fY29yZV9jbGssCisJICAgICAgICJhcm0sc3lzY29uLWljc3Q1MjUtaW50ZWdyYXRvcmNwLWNtLWNvcmUiLCBvZl9zeXNjb25faWNzdF9zZXR1cCk7CitDTEtfT0ZfREVDTEFSRShhcm1fc3lzY29uX2ludGVncmF0b3JjcF9jbV9tZW1fY2xrLAorCSAgICAgICAiYXJtLHN5c2Nvbi1pY3N0NTI1LWludGVncmF0b3JjcC1jbS1tZW0iLCBvZl9zeXNjb25faWNzdF9zZXR1cCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3p0ZS9NYWtlZmlsZSBiL2RyaXZlcnMvY2xrL3p0ZS9NYWtlZmlsZQppbmRleCA3NDAwNWFhLi44MzM3NGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay96dGUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jbGsvenRlL01ha2VmaWxlCkBAIC0xLDIgKzEsMyBAQAogb2JqLXkgOj0gY2xrLm8KIG9iai0kKENPTkZJR19TT0NfWlgyOTY3MDIpICs9IGNsay16eDI5NjcwMi5vCitvYmotJChDT05GSUdfQVJDSF9aWCkgKz0gY2xrLXp4Mjk2NzE4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3p0ZS9jbGstengyOTY3MTguYyBiL2RyaXZlcnMvY2xrL3p0ZS9jbGstengyOTY3MTguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDdkNjI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvenRlL2Nsay16eDI5NjcxOC5jCkBAIC0wLDAgKzEsOTI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IC0gMjAxNiBaVEUgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svengyOTY3MTgtY2xvY2suaD4KKyNpbmNsdWRlICJjbGsuaCIKKworLyogVE9QIENSTSAqLworI2RlZmluZSBUT1BfQ0xLX01VWDAJMHgwNAorI2RlZmluZSBUT1BfQ0xLX01VWDEJMHgwOAorI2RlZmluZSBUT1BfQ0xLX01VWDIJMHgwYworI2RlZmluZSBUT1BfQ0xLX01VWDMJMHgxMAorI2RlZmluZSBUT1BfQ0xLX01VWDQJMHgxNAorI2RlZmluZSBUT1BfQ0xLX01VWDUJMHgxOAorI2RlZmluZSBUT1BfQ0xLX01VWDYJMHgxYworI2RlZmluZSBUT1BfQ0xLX01VWDcJMHgyMAorI2RlZmluZSBUT1BfQ0xLX01VWDkJMHgyOAorCisKKyNkZWZpbmUgVE9QX0NMS19HQVRFMAkweDM0CisjZGVmaW5lIFRPUF9DTEtfR0FURTEJMHgzOAorI2RlZmluZSBUT1BfQ0xLX0dBVEUyCTB4M2MKKyNkZWZpbmUgVE9QX0NMS19HQVRFMwkweDQwCisjZGVmaW5lIFRPUF9DTEtfR0FURTQJMHg0NAorI2RlZmluZSBUT1BfQ0xLX0dBVEU1CTB4NDgKKyNkZWZpbmUgVE9QX0NMS19HQVRFNgkweDRjCisKKyNkZWZpbmUgVE9QX0NMS19ESVYwCTB4NTgKKworI2RlZmluZSBQTExfQ1BVX1JFRwkweDgwCisjZGVmaW5lIFBMTF9WR0FfUkVHCTB4YjAKKyNkZWZpbmUgUExMX0REUl9SRUcJMHhhMAorCisvKiBMU1AwIENSTSAqLworI2RlZmluZSBMU1AwX1RJTUVSM19DTEsJMHg0CisjZGVmaW5lIExTUDBfVElNRVI0X0NMSwkweDgKKyNkZWZpbmUgTFNQMF9USU1FUjVfQ0xLCTB4YworI2RlZmluZSBMU1AwX1VBUlQzX0NMSwkweDEwCisjZGVmaW5lIExTUDBfVUFSVDFfQ0xLCTB4MTQKKyNkZWZpbmUgTFNQMF9VQVJUMl9DTEsJMHgxOAorI2RlZmluZSBMU1AwX1NQSUZDMF9DTEsJMHgxYworI2RlZmluZSBMU1AwX0kyQzRfQ0xLCTB4MjAKKyNkZWZpbmUgTFNQMF9JMkM1X0NMSwkweDI0CisjZGVmaW5lIExTUDBfU1NQMF9DTEsJMHgyOAorI2RlZmluZSBMU1AwX1NTUDFfQ0xLCTB4MmMKKyNkZWZpbmUgTFNQMF9VU0lNMF9DTEsJMHgzMAorI2RlZmluZSBMU1AwX0dQSU9fQ0xLCTB4MzQKKyNkZWZpbmUgTFNQMF9JMkMzX0NMSwkweDM4CisKKy8qIExTUDEgQ1JNICovCisjZGVmaW5lIExTUDFfVUFSVDRfQ0xLCTB4MDgKKyNkZWZpbmUgTFNQMV9VQVJUNV9DTEsJMHgwYworI2RlZmluZSBMU1AxX1BXTV9DTEsJMHgxMAorI2RlZmluZSBMU1AxX0kyQzJfQ0xLCTB4MTQKKyNkZWZpbmUgTFNQMV9TU1AyX0NMSwkweDFjCisjZGVmaW5lIExTUDFfU1NQM19DTEsJMHgyMAorI2RlZmluZSBMU1AxX1NTUDRfQ0xLCTB4MjQKKyNkZWZpbmUgTFNQMV9VU0lNMV9DTEsJMHgyOAorCisvKiBhdWRpbyBsc3AgKi8KKyNkZWZpbmUgQVVESU9fSTJTMF9ESVZfQ0ZHMQkweDEwCisjZGVmaW5lIEFVRElPX0kyUzBfRElWX0NGRzIJMHgxNAorI2RlZmluZSBBVURJT19JMlMwX0NMSwkJMHgxOAorI2RlZmluZSBBVURJT19JMlMxX0RJVl9DRkcxCTB4MjAKKyNkZWZpbmUgQVVESU9fSTJTMV9ESVZfQ0ZHMgkweDI0CisjZGVmaW5lIEFVRElPX0kyUzFfQ0xLCQkweDI4CisjZGVmaW5lIEFVRElPX0kyUzJfRElWX0NGRzEJMHgzMAorI2RlZmluZSBBVURJT19JMlMyX0RJVl9DRkcyCTB4MzQKKyNkZWZpbmUgQVVESU9fSTJTMl9DTEsJCTB4MzgKKyNkZWZpbmUgQVVESU9fSTJTM19ESVZfQ0ZHMQkweDQwCisjZGVmaW5lIEFVRElPX0kyUzNfRElWX0NGRzIJMHg0NAorI2RlZmluZSBBVURJT19JMlMzX0NMSwkJMHg0OAorI2RlZmluZSBBVURJT19JMkMwX0NMSwkJMHg1MAorI2RlZmluZSBBVURJT19TUERJRjBfRElWX0NGRzEJMHg2MAorI2RlZmluZSBBVURJT19TUERJRjBfRElWX0NGRzIJMHg2NAorI2RlZmluZSBBVURJT19TUERJRjBfQ0xLCTB4NjgKKyNkZWZpbmUgQVVESU9fU1BESUYxX0RJVl9DRkcxCTB4NzAKKyNkZWZpbmUgQVVESU9fU1BESUYxX0RJVl9DRkcyCTB4NzQKKyNkZWZpbmUgQVVESU9fU1BESUYxX0NMSwkweDc4CisjZGVmaW5lIEFVRElPX1RJTUVSX0NMSwkJMHg4MAorI2RlZmluZSBBVURJT19URE1fQ0xLCQkweDkwCisjZGVmaW5lIEFVRElPX1RTX0NMSwkJMHhhMAorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNsa19sb2NrKTsKKworc3RhdGljIHN0cnVjdCB6eF9wbGxfY29uZmlnIHBsbF9jcHVfdGFibGVbXSA9IHsKKwlQTExfUkFURSgxMzEyMDAwMDAwLCAweDAwMTAzNjIxLCAweDA0YWFhYWFhKSwKKwlQTExfUkFURSgxNDA3MDAwMDAwLCAweDAwMTAzYTIxLCAweDA0YWFhYWFhKSwKKwlQTExfUkFURSgxNTAzMDAwMDAwLCAweDAwMTAzZTIxLCAweDA0YWFhYWFhKSwKKwlQTExfUkFURSgxNjAwMDAwMDAwLCAweDAwMTA0MjIxLCAweDA0YWFhYWFhKSwKK307CisKK1BOQU1FKG9zYykgPSB7CisJIm9zYzI0bSIsCisJIm9zYzMyayIsCit9OworCitQTkFNRShkYmdfd2Nsa19wKSA9IHsKKwkiY2xrMzM0bSIsCisJImNsazQ2Nm0iLAorCSJjbGszOTZtIiwKKwkiY2xrMjUwbSIsCit9OworCitQTkFNRShhNzJfY29yZWNsa19wKSA9IHsKKwkib3NjMjRtIiwKKwkicGxsX21tMF8xMTg4bSIsCisJInBsbF9tbTFfMTI5Nm0iLAorCSJjbGsxMDAwbSIsCisJImNsazY0OG0iLAorCSJjbGsxNjAwbSIsCisJInBsbF9hdWRpb18xODAwbSIsCisJInBsbF92Z2FfMTgwMG0iLAorfTsKKworUE5BTUUoY3B1X3BlcmljbGtfcCkgPSB7CisJIm9zYzI0bSIsCisJImNsazUwMG0iLAorCSJjbGs1OTRtIiwKKwkiY2xrNDY2bSIsCisJImNsazI5NG0iLAorCSJjbGszMzRtIiwKKwkiY2xrMjUwbSIsCisJImNsazEyNW0iLAorfTsKKworUE5BTUUoYTUzX2NvcmVjbGtfcCkgPSB7CisJIm9zYzI0bSIsCisJImNsazEwMDBtIiwKKwkicGxsX21tMF8xMTg4bSIsCisJImNsazY0OG0iLAorCSJjbGs1MDBtIiwKKwkiY2xrODAwbSIsCisJImNsazE2MDBtIiwKKwkicGxsX2F1ZGlvXzE4MDBtIiwKK307CisKK1BOQU1FKHNlY193Y2xrX3ApID0geworCSJvc2MyNG0iLAorCSJjbGszOTZtIiwKKwkiY2xrMzM0bSIsCisJImNsazI5N20iLAorCSJjbGsyNTBtIiwKKwkiY2xrMTk4bSIsCisJImNsazE0OG01IiwKKwkiY2xrOTltIiwKK307CisKK1BOQU1FKHNkX25hbmRfd2Nsa19wKSA9IHsKKwkib3NjMjRtIiwKKwkiY2xrNDltNSIsCisJImNsazk5bSIsCisJImNsazE5OG0iLAorCSJjbGsxNjdtIiwKKwkiY2xrMTQ4bTUiLAorCSJjbGsxMjVtIiwKKwkiY2xrMjE2bSIsCit9OworCitQTkFNRShlbW1jX3djbGtfcCkgPSB7CisJIm9zYzI0bSIsCisJImNsazE5OG0iLAorCSJjbGs5OW0iLAorCSJjbGszOTZtIiwKKwkiY2xrMzM0bSIsCisJImNsazI5N20iLAorCSJjbGsyNTBtIiwKKwkiY2xrMTQ4bTUiLAorfTsKKworUE5BTUUoY2xrMzJfcCkgPSB7CisJIm9zYzMyayIsCisJImNsazMyazc2OCIsCit9OworCitQTkFNRSh1c2JfcmVmMjRtX3ApID0geworCSJvc2MzMmsiLAorCSJjbGszMms3NjgiLAorfTsKKworUE5BTUUoc3lzX25vY19hbGNrX3ApID0geworCSJvc2MyNG0iLAorCSJjbGsyNTBtIiwKKwkiY2xrMTk4bSIsCisJImNsazE0OG01IiwKKwkiY2xrMTA4bSIsCisJImNsazU0bSIsCisJImNsazIxNm0iLAorCSJjbGsyNDBtIiwKK307CisKK1BOQU1FKHZkZV9hY2xrX3ApID0geworCSJjbGszMzRtIiwKKwkiY2xrNTk0bSIsCisJImNsazUwMG0iLAorCSJjbGs0MzJtIiwKKwkiY2xrNDgwbSIsCisJImNsazI5N20iLAorCSJjbGtfdmdhIiwgIC8qNjAwTUh6Ki8KKwkiY2xrMjk0bSIsCit9OworCitQTkFNRSh2Y2VfYWNsa19wKSA9IHsKKwkiY2xrMzM0bSIsCisJImNsazU5NG0iLAorCSJjbGs1MDBtIiwKKwkiY2xrNDMybSIsCisJImNsazM5Nm0iLAorCSJjbGsyOTdtIiwKKwkiY2xrX3ZnYSIsICAvKjYwME1IeiovCisJImNsazI5NG0iLAorfTsKKworUE5BTUUoaGRlX2FjbGtfcCkgPSB7CisJImNsazMzNG0iLAorCSJjbGs1OTRtIiwKKwkiY2xrNTAwbSIsCisJImNsazQzMm0iLAorCSJjbGszOTZtIiwKKwkiY2xrMjk3bSIsCisJImNsa192Z2EiLCAgLyo2MDBNSHoqLworCSJjbGsyOTRtIiwKK307CisKK1BOQU1FKGdwdV9hY2xrX3ApID0geworCSJjbGszMzRtIiwKKwkiY2xrNjQ4bSIsCisJImNsazU5NG0iLAorCSJjbGs1MDBtIiwKKwkiY2xrMzk2bSIsCisJImNsazI5N20iLAorCSJjbGtfdmdhIiwgIC8qNjAwTUh6Ki8KKwkiY2xrMjk0bSIsCit9OworCitQTkFNRShzYXBwdV9hY2xrX3ApID0geworCSJjbGszOTZtIiwKKwkiY2xrNTAwbSIsCisJImNsazI1MG0iLAorCSJjbGsxNDhtNSIsCit9OworCitQTkFNRShzYXBwdV93Y2xrX3ApID0geworCSJjbGsxOThtIiwKKwkiY2xrMzk2bSIsCisJImNsazMzNG0iLAorCSJjbGsyOTdtIiwKKwkiY2xrMjUwbSIsCisJImNsazE0OG01IiwKKwkiY2xrMTI1bSIsCisJImNsazk5bSIsCit9OworCitQTkFNRSh2b3VfYWNsa19wKSA9IHsKKwkiY2xrMzM0bSIsCisJImNsazU5NG0iLAorCSJjbGs1MDBtIiwKKwkiY2xrNDMybSIsCisJImNsazM5Nm0iLAorCSJjbGsyOTdtIiwKKwkiY2xrX3ZnYSIsICAvKjYwME1IeiovCisJImNsazI5NG0iLAorfTsKKworUE5BTUUodm91X21haW5fd2Nsa19wKSA9IHsKKwkiY2xrMTA4bSIsCisJImNsazU5NG0iLAorCSJjbGsyOTdtIiwKKwkiY2xrMTQ4bTUiLAorCSJjbGs3NG0yNSIsCisJImNsazU0bSIsCisJImNsazI3bSIsCisJImNsa192Z2EiLAorfTsKKworUE5BTUUodm91X2F1eF93Y2xrX3ApID0geworCSJjbGsxMDhtIiwKKwkiY2xrMTQ4bTUiLAorCSJjbGs3NG0yNSIsCisJImNsazU0bSIsCisJImNsazI3bSIsCisJImNsa192Z2EiLAorCSJjbGs1NG1fbW0wIiwKKwkiY2xrIgorfTsKKworUE5BTUUodm91X3BwdV93Y2xrX3ApID0geworCSJjbGszMzRtIiwKKwkiY2xrNDMybSIsCisJImNsazM5Nm0iLAorCSJjbGsyOTdtIiwKKwkiY2xrMjUwbSIsCisJImNsazEyNW0iLAorCSJjbGsxOThtIiwKKwkiY2xrOTltIiwKK307CisKK1BOQU1FKHZnYV9pMmNfd2Nsa19wKSA9IHsKKwkib3NjMjRtIiwKKwkiY2xrOTltIiwKK307CisKK1BOQU1FKHZpdV9tMF9hY2xrX3ApID0geworCSJjbGszMzRtIiwKKwkiY2xrNDMybSIsCisJImNsazM5Nm0iLAorCSJjbGsyOTdtIiwKKwkiY2xrMjUwbSIsCisJImNsazEyNW0iLAorCSJjbGsxOThtIiwKKwkib3NjMjRtIiwKK307CisKK1BOQU1FKHZpdV9tMV9hY2xrX3ApID0geworCSJjbGsxOThtIiwKKwkiY2xrMjUwbSIsCisJImNsazI5N20iLAorCSJjbGsxMjVtIiwKKwkiY2xrMzk2bSIsCisJImNsazMzNG0iLAorCSJjbGsxNDhtNSIsCisJIm9zYzI0bSIsCit9OworCitQTkFNRSh2aXVfY2xrX3ApID0geworCSJjbGsxOThtIiwKKwkiY2xrMzM0bSIsCisJImNsazI5N20iLAorCSJjbGsyNTBtIiwKKwkiY2xrMzk2bSIsCisJImNsazEyNW0iLAorCSJjbGs5OW0iLAorCSJjbGsxNDhtNSIsCit9OworCitQTkFNRSh2aXVfanBlZ19jbGtfcCkgPSB7CisJImNsazMzNG0iLAorCSJjbGs0ODBtIiwKKwkiY2xrNDMybSIsCisJImNsazM5Nm0iLAorCSJjbGsyOTdtIiwKKwkiY2xrMjUwbSIsCisJImNsazEyNW0iLAorCSJjbGsxOThtIiwKK307CisKK1BOQU1FKHRzX3N5c19jbGtfcCkgPSB7CisJImNsazE5Mm0iLAorCSJjbGsxNjdtIiwKKwkiY2xrMTI1bSIsCisJImNsazk5bSIsCit9OworCitQTkFNRSh3ZHRfYXJlc19wKSA9IHsKKwkib3NjMjRtIiwKKwkiY2xrMzJrIgorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfenhfcGxsIHp4Mjk2NzE4X3BsbF9jbGtbXSA9IHsKKwlaWDI5NjcxOF9QTEwoInBsbF9jcHUiLAkib3NjMjRtIiwJUExMX0NQVV9SRUcsCXBsbF9jcHVfdGFibGUpLAorfTsKKworc3RhdGljIHN0cnVjdCB6eF9jbGtfZml4ZWRfZmFjdG9yIHRvcF9mZmFjdG9yX2Nsa1tdID0geworCUZGQUNUT1IoMCwgImNsazRtIiwJCSJvc2MyNG0iLCAxLCA2LCAgMCksCisJRkZBQ1RPUigwLCAiY2xrMm0iLAkJIm9zYzI0bSIsIDEsIDEyLCAwKSwKKwkvKiBwbGwgY3B1ICovCisJRkZBQ1RPUigwLCAiY2xrMTYwMG0iLAkJInBsbF9jcHUiLCAxLCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5UKSwKKwlGRkFDVE9SKDAsICJjbGs4MDBtIiwJCSJwbGxfY3B1IiwgMSwgMiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCksCisJLyogcGxsIG1hYyAqLworCUZGQUNUT1IoMCwgImNsazI1bSIsCQkicGxsX21hYyIsIDEsIDQwLCAwKSwKKwlGRkFDVE9SKDAsICJjbGsxMjVtIiwJCSJwbGxfbWFjIiwgMSwgOCwgMCksCisJRkZBQ1RPUigwLCAiY2xrMjUwbSIsCQkicGxsX21hYyIsIDEsIDQsIDApLAorCUZGQUNUT1IoMCwgImNsazUwbSIsCQkicGxsX21hYyIsIDEsIDIwLCAwKSwKKwlGRkFDVE9SKDAsICJjbGs1MDBtIiwJCSJwbGxfbWFjIiwgMSwgMiwgMCksCisJRkZBQ1RPUigwLCAiY2xrMTAwMG0iLAkJInBsbF9tYWMiLCAxLCAxLCAwKSwKKwlGRkFDVE9SKDAsICJjbGszMzRtIiwJCSJwbGxfbWFjIiwgMSwgMywgMCksCisJRkZBQ1RPUigwLCAiY2xrMTY3bSIsCQkicGxsX21hYyIsIDEsIDYsIDApLAorCS8qIHBsbCBtbSAqLworCUZGQUNUT1IoMCwgImNsazU0bV9tbTAiLAkicGxsX21tMCIsIDEsIDIyLCAwKSwKKwlGRkFDVE9SKDAsICJjbGs3NG0yNSIsCQkicGxsX21tMCIsIDEsIDE2LCAwKSwKKwlGRkFDVE9SKDAsICJjbGsxNDhtNSIsCQkicGxsX21tMCIsIDEsIDgsIDApLAorCUZGQUNUT1IoMCwgImNsazI5N20iLAkJInBsbF9tbTAiLCAxLCA0LCAwKSwKKwlGRkFDVE9SKDAsICJjbGs1OTRtIiwJCSJwbGxfbW0wIiwgMSwgMiwgMCksCisJRkZBQ1RPUigwLCAicGxsX21tMF8xMTg4bSIsCSJwbGxfbW0wIiwgMSwgMSwgMCksCisJRkZBQ1RPUigwLCAiY2xrMzk2bSIsCQkicGxsX21tMCIsIDEsIDMsIDApLAorCUZGQUNUT1IoMCwgImNsazE5OG0iLAkJInBsbF9tbTAiLCAxLCA2LCAwKSwKKwlGRkFDVE9SKDAsICJjbGs5OW0iLAkJInBsbF9tbTAiLCAxLCAxMiwgMCksCisJRkZBQ1RPUigwLCAiY2xrNDltNSIsCQkicGxsX21tMCIsIDEsIDI0LCAwKSwKKwkvKiBwbGwgbW0gKi8KKwlGRkFDVE9SKDAsICJjbGszMjRtIiwJCSJwbGxfbW0xIiwgMSwgNCwgMCksCisJRkZBQ1RPUigwLCAiY2xrNjQ4bSIsCQkicGxsX21tMSIsIDEsIDIsIDApLAorCUZGQUNUT1IoMCwgInBsbF9tbTFfMTI5Nm0iLAkicGxsX21tMSIsIDEsIDEsIDApLAorCUZGQUNUT1IoMCwgImNsazIxNm0iLAkJInBsbF9tbTEiLCAxLCA2LCAwKSwKKwlGRkFDVE9SKDAsICJjbGs0MzJtIiwJCSJwbGxfbW0xIiwgMSwgMywgMCksCisJRkZBQ1RPUigwLCAiY2xrMTA4bSIsCQkicGxsX21tMSIsIDEsIDEyLCAwKSwKKwlGRkFDVE9SKDAsICJjbGs3Mm0iLAkJInBsbF9tbTEiLCAxLCAxOCwgMCksCisJRkZBQ1RPUigwLCAiY2xrMjdtIiwJCSJwbGxfbW0xIiwgMSwgNDgsIDApLAorCUZGQUNUT1IoMCwgImNsazU0bSIsCQkicGxsX21tMSIsIDEsIDI0LCAwKSwKKwkvKiB2Z2EgKi8KKwlGRkFDVE9SKDAsICJwbGxfdmdhXzE4MDBtIiwJInBsbF92Z2EiLCAxLCAxLCAwKSwKKwlGRkFDVE9SKDAsICJjbGtfdmdhIiwJCSJwbGxfdmdhIiwgMSwgMiwgMCksCisJLyogcGxsIGRkciAqLworCUZGQUNUT1IoMCwgImNsazQ2Nm0iLAkJInBsbF9kZHIiLCAxLCAyLCAwKSwKKworCS8qIHBsbCBhdWRpbyAqLworCUZGQUNUT1IoMCwgInBsbF9hdWRpb18xODAwbSIsCSJwbGxfYXVkaW8iLCAxLCAxLCAwKSwKKwlGRkFDVE9SKDAsICJjbGszMms3NjgiLAkJInBsbF9hdWRpbyIsIDEsIDI3MDAwLCAwKSwKKwlGRkFDVE9SKDAsICJjbGsxNm0zODQiLAkJInBsbF9hdWRpbyIsIDEsIDU0LCAwKSwKKwlGRkFDVE9SKDAsICJjbGsyOTRtIiwJCSJwbGxfYXVkaW8iLCAxLCAzLCAwKSwKKworCS8qIHBsbCBoc2ljKi8KKwlGRkFDVE9SKDAsICJjbGsyNDBtIiwJCSJwbGxfaHNpYyIsIDEsIDQsIDApLAorCUZGQUNUT1IoMCwgImNsazQ4MG0iLAkJInBsbF9oc2ljIiwgMSwgMiwgMCksCisJRkZBQ1RPUigwLCAiY2xrMTkybSIsCQkicGxsX2hzaWMiLCAxLCA1LCAwKSwKKwlGRkFDVE9SKDAsICJjbGtfcGxsXzI0bSIsCSJwbGxfaHNpYyIsIDEsIDQwLCAwKSwKKwlGRkFDVE9SKDAsICJlbW1jX211eF9kaXYyIiwJImVtbWNfbXV4IiwgMSwgMiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCksCit9OworCitzdGF0aWMgc3RydWN0IGNsa19kaXZfdGFibGUgbm9jX2Rpdl90YWJsZVtdID0geworCXsgLnZhbCA9IDEsIC5kaXYgPSAyLCB9LAorCXsgLnZhbCA9IDMsIC5kaXYgPSA0LCB9LAorfTsKK3N0YXRpYyBzdHJ1Y3QgenhfY2xrX2RpdiB0b3BfZGl2X2Nsa1tdID0geworCURJVl9UKDAsICJzeXNfbm9jX2hjbGsiLCAic3lzX25vY19hY2xrIiwgVE9QX0NMS19ESVYwLCAwLCAyLCAwLCBub2NfZGl2X3RhYmxlKSwKKwlESVZfVCgwLCAic3lzX25vY19wY2xrIiwgInN5c19ub2NfYWNsayIsIFRPUF9DTEtfRElWMCwgNCwgMiwgMCwgbm9jX2Rpdl90YWJsZSksCit9OworCitzdGF0aWMgc3RydWN0IHp4X2Nsa19tdXggdG9wX211eF9jbGtbXSA9IHsKKwlNVVgoMCwgImRiZ19tdXgiLAkgZGJnX3djbGtfcCwJICBUT1BfQ0xLX01VWDAsIDEyLCAyKSwKKwlNVVgoMCwgImE3Ml9tdXgiLAkgYTcyX2NvcmVjbGtfcCwJICBUT1BfQ0xLX01VWDAsIDgsIDMpLAorCU1VWCgwLCAiY3B1X3BlcmlfbXV4IiwJIGNwdV9wZXJpY2xrX3AsCSAgVE9QX0NMS19NVVgwLCA0LCAzKSwKKwlNVVhfRigwLCAiYTUzX211eCIsCSBhNTNfY29yZWNsa19wLAkgIFRPUF9DTEtfTVVYMCwgMCwgMywgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJTVVYKDAsICJzeXNfbm9jX2FjbGsiLAkgc3lzX25vY19hbGNrX3AsICBUT1BfQ0xLX01VWDEsIDAsIDMpLAorCU1VWCgwLCAic2VjX211eCIsCSBzZWNfd2Nsa19wLAkgIFRPUF9DTEtfTVVYMiwgMTYsIDMpLAorCU1VWCgwLCAic2QxX211eCIsCSBzZF9uYW5kX3djbGtfcCwgIFRPUF9DTEtfTVVYMiwgMTIsIDMpLAorCU1VWCgwLCAic2QwX211eCIsCSBzZF9uYW5kX3djbGtfcCwgIFRPUF9DTEtfTVVYMiwgOCwgMyksCisJTVVYKDAsICJlbW1jX211eCIsCSBlbW1jX3djbGtfcCwJICBUT1BfQ0xLX01VWDIsIDQsIDMpLAorCU1VWCgwLCAibmFuZF9tdXgiLAkgc2RfbmFuZF93Y2xrX3AsICBUT1BfQ0xLX01VWDIsIDAsIDMpLAorCU1VWCgwLCAidXNiX3JlZjI0bV9tdXgiLCB1c2JfcmVmMjRtX3AsCSAgVE9QX0NMS19NVVg5LCAxNiwgMSksCisJTVVYKDAsICJjbGszMmsiLAkgY2xrMzJfcCwJICBUT1BfQ0xLX01VWDksIDEyLCAxKSwKKwlNVVhfRigwLCAid2R0X211eCIsCSB3ZHRfYXJlc19wLAkgIFRPUF9DTEtfTVVYOSwgOCwgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJTVVYKDAsICJ0aW1lcl9tdXgiLAkgb3NjLAkJICBUT1BfQ0xLX01VWDksIDQsIDEpLAorCU1VWCgwLCAidmRlX211eCIsCSB2ZGVfYWNsa19wLAkgIFRPUF9DTEtfTVVYNCwgIDAsIDMpLAorCU1VWCgwLCAidmNlX211eCIsCSB2Y2VfYWNsa19wLAkgIFRPUF9DTEtfTVVYNCwgIDQsIDMpLAorCU1VWCgwLCAiaGRlX211eCIsCSBoZGVfYWNsa19wLAkgIFRPUF9DTEtfTVVYNCwgIDgsIDMpLAorCU1VWCgwLCAiZ3B1X211eCIsCSBncHVfYWNsa19wLAkgIFRPUF9DTEtfTVVYNSwgIDAsIDMpLAorCU1VWCgwLCAic2FwcHVfYV9tdXgiLAkgc2FwcHVfYWNsa19wLAkgIFRPUF9DTEtfTVVYNSwgIDQsIDIpLAorCU1VWCgwLCAic2FwcHVfd19tdXgiLAkgc2FwcHVfd2Nsa19wLAkgIFRPUF9DTEtfTVVYNSwgIDgsIDMpLAorCU1VWCgwLCAidm91X2FfbXV4IiwJIHZvdV9hY2xrX3AsCSAgVE9QX0NMS19NVVg3LCAgMCwgMyksCisJTVVYKDAsICJ2b3VfbWFpbl93X211eCIsIHZvdV9tYWluX3djbGtfcCwgVE9QX0NMS19NVVg3LCAgNCwgMyksCisJTVVYKDAsICJ2b3VfYXV4X3dfbXV4IiwJIHZvdV9hdXhfd2Nsa19wLCAgVE9QX0NMS19NVVg3LCAgOCwgMyksCisJTVVYKDAsICJ2b3VfcHB1X3dfbXV4IiwJIHZvdV9wcHVfd2Nsa19wLCAgVE9QX0NMS19NVVg3LCAxMiwgMyksCisJTVVYKDAsICJ2Z2FfaTJjX211eCIsCSB2Z2FfaTJjX3djbGtfcCwgIFRPUF9DTEtfTVVYNywgMTYsIDEpLAorCU1VWCgwLCAidml1X20wX2FfbXV4IiwJIHZpdV9tMF9hY2xrX3AsCSAgVE9QX0NMS19NVVg2LCAgMCwgMyksCisJTVVYKDAsICJ2aXVfbTFfYV9tdXgiLAkgdml1X20xX2FjbGtfcCwJICBUT1BfQ0xLX01VWDYsICA0LCAzKSwKKwlNVVgoMCwgInZpdV93X211eCIsCSB2aXVfY2xrX3AsCSAgVE9QX0NMS19NVVg2LCAgOCwgMyksCisJTVVYKDAsICJ2aXVfanBlZ193X211eCIsIHZpdV9qcGVnX2Nsa19wLCAgVE9QX0NMS19NVVg2LCAxMiwgMyksCisJTVVYKDAsICJ0c19zeXNfbXV4IiwJIHRzX3N5c19jbGtfcCwgICAgVE9QX0NMS19NVVg2LCAxNiwgMiksCit9OworCitzdGF0aWMgc3RydWN0IHp4X2Nsa19nYXRlIHRvcF9nYXRlX2Nsa1tdID0geworCUdBVEUoQ1BVX0RCR19HQVRFLCAgICAiZGJnX3djbGsiLCAgICAgICAgImRiZ19tdXgiLCAgICAgICAgVE9QX0NMS19HQVRFMCwgNCwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShBNzJfR0FURSwgICAgICAgICJhNzJfY29yZWNsayIsICAgICAiYTcyX211eCIsICAgICAgICBUT1BfQ0xLX0dBVEUwLCAzLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKENQVV9QRVJJX0dBVEUsICAgImNwdV9wZXJpIiwgICAgICAgICJjcHVfcGVyaV9tdXgiLCAgIFRPUF9DTEtfR0FURTAsIDEsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoQTUzX0dBVEUsICAgICAgICAiYTUzX2NvcmVjbGsiLCAgICAgImE1M19tdXgiLCAgICAgICAgVE9QX0NMS19HQVRFMCwgMCwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShTRDFfV0NMSywgICAgICAgICJzZDFfd2NsayIsICAgICAgICAic2QxX211eCIsICAgICAgICBUT1BfQ0xLX0dBVEUxLCAxMywgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShTRDBfV0NMSywgICAgICAgICJzZDBfd2NsayIsICAgICAgICAic2QwX211eCIsICAgICAgICBUT1BfQ0xLX0dBVEUxLCA5LCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKEVNTUNfV0NMSywgICAgICAgImVtbWNfd2NsayIsICAgICAgICJlbW1jX211eF9kaXYyIiwgIFRPUF9DTEtfR0FURTAsIDUsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoRU1NQ19OQU5EX0FYSSwgICAiZW1tY19uYW5kX2FjbGsiLCAgInN5c19ub2NfYWNsayIsICAgVE9QX0NMS19HQVRFMSwgNCwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShOQU5EX1dDTEssICAgICAgICJuYW5kX3djbGsiLCAgICAgICAibmFuZF9tdXgiLCAgICAgICBUT1BfQ0xLX0dBVEUwLCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKEVNTUNfTkFORF9BSEIsICAgImVtbWNfbmFuZF9oY2xrIiwgICJzeXNfbm9jX2hjbGsiLCAgIFRPUF9DTEtfR0FURTEsIDAsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoMCwgICAgICAgICAgICAgICAibHNwMV9wY2xrIiwgICAgICAgInN5c19ub2NfcGNsayIsICAgVE9QX0NMS19HQVRFMiwgMzEsIDAsICAgICAgICAgICAgICAgICAgMCksCisJR0FURShMU1AxXzE0OE01LCAgICAgICJsc3AxXzE0OG01IiwgICAgICAiY2xrMTQ4bTUiLCAgICAgICBUT1BfQ0xLX0dBVEUyLCAzMCwgMCwgICAgICAgICAgICAgICAgICAwKSwKKwlHQVRFKExTUDFfOTlNLCAgICAgICAgImxzcDFfOTltIiwgICAgICAgICJjbGs5OW0iLCAgICAgICAgIFRPUF9DTEtfR0FURTIsIDI5LCAwLCAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoTFNQMV8yNE0sICAgICAgICAibHNwMV8yNG0iLCAgICAgICAgIm9zYzI0bSIsICAgICAgICAgVE9QX0NMS19HQVRFMiwgMjgsIDAsICAgICAgICAgICAgICAgICAgMCksCisJR0FURShMU1AwXzc0TTI1LCAgICAgICJsc3AwXzc0bTI1IiwgICAgICAiY2xrNzRtMjUiLCAgICAgICBUT1BfQ0xLX0dBVEUyLCAyNSwgMCwgICAgICAgICAgICAgICAgICAwKSwKKwlHQVRFKDAsICAgICAgICAgICAgICAgImxzcDBfcGNsayIsICAgICAgICJzeXNfbm9jX3BjbGsiLCAgIFRPUF9DTEtfR0FURTIsIDI0LCAwLCAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoTFNQMF8zMkssICAgICAgICAibHNwMF8zMmsiLCAgICAgICAgIm9zYzMyayIsICAgICAgICAgVE9QX0NMS19HQVRFMiwgMjMsIDAsICAgICAgICAgICAgICAgICAgMCksCisJR0FURShMU1AwXzE0OE01LCAgICAgICJsc3AwXzE0OG01IiwgICAgICAiY2xrMTQ4bTUiLCAgICAgICBUT1BfQ0xLX0dBVEUyLCAyMiwgMCwgICAgICAgICAgICAgICAgICAwKSwKKwlHQVRFKExTUDBfOTlNLCAgICAgICAgImxzcDBfOTltIiwgICAgICAgICJjbGs5OW0iLCAgICAgICAgIFRPUF9DTEtfR0FURTIsIDIxLCAwLCAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoTFNQMF8yNE0sICAgICAgICAibHNwMF8yNG0iLCAgICAgICAgIm9zYzI0bSIsICAgICAgICAgVE9QX0NMS19HQVRFMiwgMjAsIDAsICAgICAgICAgICAgICAgICAgMCksCisJR0FURShBVURJT185OU0sICAgICAgICJhdWRpb185OW0iLCAgICAgICAiY2xrOTltIiwgICAgICAgICBUT1BfQ0xLX0dBVEU1LCAyNywgMCwgICAgICAgICAgICAgICAgICAwKSwKKwlHQVRFKEFVRElPXzI0TSwgICAgICAgImF1ZGlvXzI0bSIsICAgICAgICJvc2MyNG0iLCAgICAgICAgIFRPUF9DTEtfR0FURTUsIDI4LCAwLCAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoQVVESU9fMTZNMzg0LCAgICAiYXVkaW9fMTZtMzg0IiwgICAgImNsazE2bTM4NCIsICAgICAgVE9QX0NMS19HQVRFNSwgMjksIDAsICAgICAgICAgICAgICAgICAgMCksCisJR0FURShBVURJT18zMkssICAgICAgICJhdWRpb18zMmsiLCAgICAgICAiY2xrMzJrIiwgICAgICAgICBUT1BfQ0xLX0dBVEU1LCAzMCwgMCwgICAgICAgICAgICAgICAgICAwKSwKKwlHQVRFKFdEVF9XQ0xLLCAgICAgICAgIndkdF93Y2xrIiwgICAgICAgICJ3ZHRfbXV4IiwgICAgICAgIFRPUF9DTEtfR0FURTYsIDksIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoVElNRVJfV0NMSywgICAgICAidGltZXJfd2NsayIsICAgICAgInRpbWVyX211eCIsICAgICAgVE9QX0NMS19HQVRFNiwgNSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShWREVfQUNMSywgICAgICAgICJ2ZGVfYWNsayIsICAgICAgICAidmRlX211eCIsICAgICAgICBUT1BfQ0xLX0dBVEUzLCAwLCAgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShWQ0VfQUNMSywgICAgICAgICJ2Y2VfYWNsayIsICAgICAgICAidmNlX211eCIsICAgICAgICBUT1BfQ0xLX0dBVEUzLCA0LCAgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShIREVfQUNMSywgICAgICAgICJoZGVfYWNsayIsICAgICAgICAiaGRlX211eCIsICAgICAgICBUT1BfQ0xLX0dBVEUzLCA4LCAgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShHUFVfQUNMSywgICAgICAgICJncHVfYWNsayIsICAgICAgICAiZ3B1X211eCIsICAgICAgICBUT1BfQ0xLX0dBVEUzLCAxNiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShTQVBQVV9BQ0xLLCAgICAgICJzYXBwdV9hY2xrIiwgICAgICAic2FwcHVfYV9tdXgiLCAgICBUT1BfQ0xLX0dBVEUzLCAyMCwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShTQVBQVV9XQ0xLLCAgICAgICJzYXBwdV93Y2xrIiwgICAgICAic2FwcHVfd19tdXgiLCAgICBUT1BfQ0xLX0dBVEUzLCAyMiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShWT1VfQUNMSywgICAgICAgICJ2b3VfYWNsayIsICAgICAgICAidm91X2FfbXV4IiwgICAgICBUT1BfQ0xLX0dBVEU0LCAxNiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShWT1VfTUFJTl9XQ0xLLCAgICJ2b3VfbWFpbl93Y2xrIiwgICAidm91X21haW5fd19tdXgiLCBUT1BfQ0xLX0dBVEU0LCAxOCwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShWT1VfQVVYX1dDTEssICAgICJ2b3VfYXV4X3djbGsiLCAgICAidm91X2F1eF93X211eCIsICBUT1BfQ0xLX0dBVEU0LCAxOSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShWT1VfUFBVX1dDTEssICAgICJ2b3VfcHB1X3djbGsiLCAgICAidm91X3BwdV93X211eCIsICBUT1BfQ0xLX0dBVEU0LCAyMCwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShNSVBJX0NGR19DTEssICAgICJtaXBpX2NmZ19jbGsiLCAgICAib3NjMjRtIiwgICAgICAgICBUT1BfQ0xLX0dBVEU0LCAyMSwgMCwgICAgICAgICAgICAgICAgICAgMCksCisJR0FURShWR0FfSTJDX1dDTEssICAgICJ2Z2FfaTJjX3djbGsiLCAgICAidmdhX2kyY19tdXgiLCAgICBUT1BfQ0xLX0dBVEU0LCAyMywgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShNSVBJX1JFRl9DTEssICAgICJtaXBpX3JlZl9jbGsiLCAgICAiY2xrMjdtIiwgICAgICAgICBUT1BfQ0xLX0dBVEU0LCAyNCwgMCwgICAgICAgICAgICAgICAgICAgMCksCisJR0FURShIRE1JX09TQ19DRUMsICAgICJoZG1pX29zY19jZWMiLCAgICAiY2xrMm0iLCAgICAgICAgICBUT1BfQ0xLX0dBVEU0LCAyMiwgMCwgICAgICAgICAgICAgICAgICAgMCksCisJR0FURShIRE1JX09TQ19DTEssICAgICJoZG1pX29zY19jbGsiLCAgICAiY2xrMjQwbSIsICAgICAgICBUT1BfQ0xLX0dBVEU0LCAyNSwgMCwgICAgICAgICAgICAgICAgICAgMCksCisJR0FURShIRE1JX1hDTEssICAgICAgICJoZG1pX3hjbGsiLCAgICAgICAib3NjMjRtIiwgICAgICAgICBUT1BfQ0xLX0dBVEU0LCAyNiwgMCwgICAgICAgICAgICAgICAgICAgMCksCisJR0FURShWSVVfTTBfQUNMSywgICAgICJ2aXVfbTBfYWNsayIsICAgICAidml1X20wX2FfbXV4IiwgICBUT1BfQ0xLX0dBVEU0LCAwLCAgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShWSVVfTTFfQUNMSywgICAgICJ2aXVfbTFfYWNsayIsICAgICAidml1X20xX2FfbXV4IiwgICBUT1BfQ0xLX0dBVEU0LCAxLCAgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShWSVVfV0NMSywgICAgICAgICJ2aXVfd2NsayIsICAgICAgICAidml1X3dfbXV4IiwgICAgICBUT1BfQ0xLX0dBVEU0LCAyLCAgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShWSVVfSlBFR19XQ0xLLCAgICJ2aXVfanBlZ193Y2xrIiwgICAidml1X2pwZWdfd19tdXgiLCBUT1BfQ0xLX0dBVEU0LCAzLCAgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShWSVVfQ0ZHX0NMSywgICAgICJ2aXVfY2ZnX2NsayIsICAgICAib3NjMjRtIiwgICAgICAgICBUT1BfQ0xLX0dBVEU0LCA2LCAgMCwgICAgICAgICAgICAgICAgICAgMCksCisJR0FURShUU19TWVNfV0NMSywgICAgICJ0c19zeXNfd2NsayIsICAgICAidHNfc3lzX211eCIsICAgICBUT1BfQ0xLX0dBVEU1LCAyLCAgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShUU19TWVNfMTA4TSwgICAgICJ0c19zeXNfMTA4bSIsICAgICAiY2xrMTA4bSIsICAgICAgICBUT1BfQ0xLX0dBVEU1LCAzLCAgMCwgICAgICAgICAgICAgICAgICAgMCksCisJR0FURShVU0IyMF9IQ0xLLCAgICAgICJ1c2IyMF9oY2xrIiwgICAgICAic3lzX25vY19oY2xrIiwgICBUT1BfQ0xLX0dBVEUyLCAxMiwgMCwgICAgICAgICAgICAgICAgICAgMCksCisJR0FURShVU0IyMF9QSFlfQ0xLLCAgICJ1c2IyMF9waHlfY2xrIiwgICAidXNiX3JlZjI0bV9tdXgiLCBUT1BfQ0xLX0dBVEUyLCAxMywgMCwgICAgICAgICAgICAgICAgICAgMCksCisJR0FURShVU0IyMV9IQ0xLLCAgICAgICJ1c2IyMV9oY2xrIiwgICAgICAic3lzX25vY19oY2xrIiwgICBUT1BfQ0xLX0dBVEUyLCAxNCwgMCwgICAgICAgICAgICAgICAgICAgMCksCisJR0FURShVU0IyMV9QSFlfQ0xLLCAgICJ1c2IyMV9waHlfY2xrIiwgICAidXNiX3JlZjI0bV9tdXgiLCBUT1BfQ0xLX0dBVEUyLCAxNSwgMCwgICAgICAgICAgICAgICAgICAgMCksCisJR0FURShHTUFDX1JNSUlDTEssICAgICJnbWFjX3JtaWlfY2xrIiwgICAiY2xrNTBtIiwgICAgICAgICBUT1BfQ0xLX0dBVEUyLCAzLCAwLCAgICAgICAgICAgICAgICAgICAgMCksCisJR0FURShHTUFDX1BDTEssICAgICAgICJnbWFjX3BjbGsiLCAgICAgICAiY2xrMTk4bSIsICAgICAgICBUT1BfQ0xLX0dBVEUyLCAxLCAwLCAgICAgICAgICAgICAgICAgICAgMCksCisJR0FURShHTUFDX0FDTEssICAgICAgICJnbWFjX2FjbGsiLCAgICAgICAiY2xrNDltNSIsICAgICAgICBUT1BfQ0xLX0dBVEUyLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgMCksCisJR0FURShHTUFDX1JGQ0xLLCAgICAgICJnbWFjX3JlZmNsayIsICAgICAiY2xrMjVtIiwgICAgICAgICBUT1BfQ0xLX0dBVEUyLCA0LCAwLCAgICAgICAgICAgICAgICAgICAgMCksCisJR0FURShTRDFfQUhCLCAgICAgICAgICJzZDFfaGNsayIsICAgICAgICAic3lzX25vY19oY2xrIiwgICBUT1BfQ0xLX0dBVEUxLCAxMiwgIDAsICAgICAgICAgICAgICAgICAgMCksCisJR0FURShTRDBfQUhCLCAgICAgICAgICJzZDBfaGNsayIsICAgICAgICAic3lzX25vY19oY2xrIiwgICBUT1BfQ0xLX0dBVEUxLCA4LCAgMCwgICAgICAgICAgICAgICAgICAgMCksCisJR0FURShURU1QU0VOU09SX0dBVEUsICJ0ZW1wc2Vuc29yX2dhdGUiLCAiY2xrNG0iLCAgICAgICAgICBUT1BfQ0xLX0dBVEU1LCAzMSwgIDAsICAgICAgICAgICAgICAgICAgMCksCit9OworCitzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgdG9wX2h3X29uZWNlbGxfZGF0YSA9IHsKKwkubnVtID0gVE9QX05SX0NMS1MsCisJLmh3cyA9IHsKKwkJW1RPUF9OUl9DTEtTIC0gMV0gPSBOVUxMLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0b3BfY2xvY2tzX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZ19iYXNlOworCWludCBpLCByZXQ7CisKKwlyZWdfYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlpZiAoIXJlZ19iYXNlKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBtYXAgY2xrIGJhc2VcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh6eDI5NjcxOF9wbGxfY2xrKTsgaSsrKSB7CisJCXp4Mjk2NzE4X3BsbF9jbGtbaV0ucmVnX2Jhc2UgKz0gKHVpbnRwdHJfdClyZWdfYmFzZTsKKwkJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZ6eDI5NjcxOF9wbGxfY2xrW2ldLmh3KTsKKwkJaWYgKHJldCkgeworCQkJcHJfd2FybigidG9wIGNsayAlcyBpbml0IGVycm9yIVxuIiwKKwkJCQl6eDI5NjcxOF9wbGxfY2xrW2ldLmh3LmluaXQtPm5hbWUpOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodG9wX2ZmYWN0b3JfY2xrKTsgaSsrKSB7CisJCWlmICh0b3BfZmZhY3Rvcl9jbGtbaV0uaWQpCisJCQl0b3BfaHdfb25lY2VsbF9kYXRhLmh3c1t0b3BfZmZhY3Rvcl9jbGtbaV0uaWRdID0KKwkJCQkJJnRvcF9mZmFjdG9yX2Nsa1tpXS5mYWN0b3IuaHc7CisKKwkJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZ0b3BfZmZhY3Rvcl9jbGtbaV0uZmFjdG9yLmh3KTsKKwkJaWYgKHJldCkgeworCQkJcHJfd2FybigidG9wIGNsayAlcyBpbml0IGVycm9yIVxuIiwKKwkJCQl0b3BfZmZhY3Rvcl9jbGtbaV0uZmFjdG9yLmh3LmluaXQtPm5hbWUpOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodG9wX211eF9jbGspOyBpKyspIHsKKwkJaWYgKHRvcF9tdXhfY2xrW2ldLmlkKQorCQkJdG9wX2h3X29uZWNlbGxfZGF0YS5od3NbdG9wX211eF9jbGtbaV0uaWRdID0KKwkJCQkJJnRvcF9tdXhfY2xrW2ldLm11eC5odzsKKworCQl0b3BfbXV4X2Nsa1tpXS5tdXgucmVnICs9ICh1aW50cHRyX3QpcmVnX2Jhc2U7CisJCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmdG9wX211eF9jbGtbaV0ubXV4Lmh3KTsKKwkJaWYgKHJldCkgeworCQkJcHJfd2FybigidG9wIGNsayAlcyBpbml0IGVycm9yIVxuIiwKKwkJCQl0b3BfbXV4X2Nsa1tpXS5tdXguaHcuaW5pdC0+bmFtZSk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0b3BfZ2F0ZV9jbGspOyBpKyspIHsKKwkJaWYgKHRvcF9nYXRlX2Nsa1tpXS5pZCkKKwkJCXRvcF9od19vbmVjZWxsX2RhdGEuaHdzW3RvcF9nYXRlX2Nsa1tpXS5pZF0gPQorCQkJCQkmdG9wX2dhdGVfY2xrW2ldLmdhdGUuaHc7CisKKwkJdG9wX2dhdGVfY2xrW2ldLmdhdGUucmVnICs9ICh1aW50cHRyX3QpcmVnX2Jhc2U7CisJCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmdG9wX2dhdGVfY2xrW2ldLmdhdGUuaHcpOworCQlpZiAocmV0KSB7CisJCQlwcl93YXJuKCJ0b3AgY2xrICVzIGluaXQgZXJyb3IhXG4iLAorCQkJCXRvcF9nYXRlX2Nsa1tpXS5nYXRlLmh3LmluaXQtPm5hbWUpOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodG9wX2Rpdl9jbGspOyBpKyspIHsKKwkJaWYgKHRvcF9kaXZfY2xrW2ldLmlkKQorCQkJdG9wX2h3X29uZWNlbGxfZGF0YS5od3NbdG9wX2Rpdl9jbGtbaV0uaWRdID0KKwkJCQkJJnRvcF9kaXZfY2xrW2ldLmRpdi5odzsKKworCQl0b3BfZGl2X2Nsa1tpXS5kaXYucmVnICs9ICh1aW50cHRyX3QpcmVnX2Jhc2U7CisJCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmdG9wX2Rpdl9jbGtbaV0uZGl2Lmh3KTsKKwkJaWYgKHJldCkgeworCQkJcHJfd2FybigidG9wIGNsayAlcyBpbml0IGVycm9yIVxuIiwKKwkJCQl0b3BfZGl2X2Nsa1tpXS5kaXYuaHcuaW5pdC0+bmFtZSk7CisJCX0KKwl9CisKKwlpZiAob2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X29uZWNlbGxfZ2V0LCAmdG9wX2h3X29uZWNlbGxfZGF0YSkpCisJCXBhbmljKCJjb3VsZCBub3QgcmVnaXN0ZXIgY2xrIHByb3ZpZGVyXG4iKTsKKwlwcl9pbmZvKCJ0b3AgY2xrIGluaXQgb3ZlciwgbnI6JWRcbiIsIFRPUF9OUl9DTEtTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNsa19kaXZfdGFibGUgY29tbW9uX2V2ZW5fZGl2X3RhYmxlW10gPSB7CisJeyAudmFsID0gMCwgLmRpdiA9IDEsIH0sCisJeyAudmFsID0gMSwgLmRpdiA9IDIsIH0sCisJeyAudmFsID0gMywgLmRpdiA9IDQsIH0sCisJeyAudmFsID0gNSwgLmRpdiA9IDYsIH0sCisJeyAudmFsID0gNywgLmRpdiA9IDgsIH0sCisJeyAudmFsID0gOSwgLmRpdiA9IDEwLCB9LAorCXsgLnZhbCA9IDExLCAuZGl2ID0gMTIsIH0sCisJeyAudmFsID0gMTMsIC5kaXYgPSAxNCwgfSwKKwl7IC52YWwgPSAxNSwgLmRpdiA9IDE2LCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfZGl2X3RhYmxlIGNvbW1vbl9kaXZfdGFibGVbXSA9IHsKKwl7IC52YWwgPSAwLCAuZGl2ID0gMSwgfSwKKwl7IC52YWwgPSAxLCAuZGl2ID0gMiwgfSwKKwl7IC52YWwgPSAyLCAuZGl2ID0gMywgfSwKKwl7IC52YWwgPSAzLCAuZGl2ID0gNCwgfSwKKwl7IC52YWwgPSA0LCAuZGl2ID0gNSwgfSwKKwl7IC52YWwgPSA1LCAuZGl2ID0gNiwgfSwKKwl7IC52YWwgPSA2LCAuZGl2ID0gNywgfSwKKwl7IC52YWwgPSA3LCAuZGl2ID0gOCwgfSwKKwl7IC52YWwgPSA4LCAuZGl2ID0gOSwgfSwKKwl7IC52YWwgPSA5LCAuZGl2ID0gMTAsIH0sCisJeyAudmFsID0gMTAsIC5kaXYgPSAxMSwgfSwKKwl7IC52YWwgPSAxMSwgLmRpdiA9IDEyLCB9LAorCXsgLnZhbCA9IDEyLCAuZGl2ID0gMTMsIH0sCisJeyAudmFsID0gMTMsIC5kaXYgPSAxNCwgfSwKKwl7IC52YWwgPSAxNCwgLmRpdiA9IDE1LCB9LAorCXsgLnZhbCA9IDE1LCAuZGl2ID0gMTYsIH0sCit9OworCitQTkFNRShsc3AwX3djbGtfY29tbW9uX3ApID0geworCSJsc3AwXzI0bSIsCisJImxzcDBfOTltIiwKK307CisKK1BOQU1FKGxzcDBfd2Nsa190aW1lcjNfcCkgPSB7CisJInRpbWVyM19kaXYiLAorCSJsc3AwXzMyayIKK307CisKK1BOQU1FKGxzcDBfd2Nsa190aW1lcjRfcCkgPSB7CisJInRpbWVyNF9kaXYiLAorCSJsc3AwXzMyayIKK307CisKK1BOQU1FKGxzcDBfd2Nsa190aW1lcjVfcCkgPSB7CisJInRpbWVyNV9kaXYiLAorCSJsc3AwXzMyayIKK307CisKK1BOQU1FKGxzcDBfd2Nsa19zcGlmYzBfcCkgPSB7CisJImxzcDBfMTQ4bTUiLAorCSJsc3AwXzI0bSIsCisJImxzcDBfOTltIiwKKwkibHNwMF83NG0yNSIKK307CisKK1BOQU1FKGxzcDBfd2Nsa19zc3BfcCkgPSB7CisJImxzcDBfMTQ4bTUiLAorCSJsc3AwXzk5bSIsCisJImxzcDBfMjRtIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgenhfY2xrX211eCBsc3AwX211eF9jbGtbXSA9IHsKKwlNVVgoMCwgInRpbWVyM193Y2xrX211eCIsIGxzcDBfd2Nsa190aW1lcjNfcCwgTFNQMF9USU1FUjNfQ0xLLCA0LCAxKSwKKwlNVVgoMCwgInRpbWVyNF93Y2xrX211eCIsIGxzcDBfd2Nsa190aW1lcjRfcCwgTFNQMF9USU1FUjRfQ0xLLCA0LCAxKSwKKwlNVVgoMCwgInRpbWVyNV93Y2xrX211eCIsIGxzcDBfd2Nsa190aW1lcjVfcCwgTFNQMF9USU1FUjVfQ0xLLCA0LCAxKSwKKwlNVVgoMCwgInVhcnQzX3djbGtfbXV4IiwgIGxzcDBfd2Nsa19jb21tb25fcCwgTFNQMF9VQVJUM19DTEssICA0LCAxKSwKKwlNVVgoMCwgInVhcnQxX3djbGtfbXV4IiwgIGxzcDBfd2Nsa19jb21tb25fcCwgTFNQMF9VQVJUMV9DTEssICA0LCAxKSwKKwlNVVgoMCwgInVhcnQyX3djbGtfbXV4IiwgIGxzcDBfd2Nsa19jb21tb25fcCwgTFNQMF9VQVJUMl9DTEssICA0LCAxKSwKKwlNVVgoMCwgInNwaWZjMF93Y2xrX211eCIsIGxzcDBfd2Nsa19zcGlmYzBfcCwgTFNQMF9TUElGQzBfQ0xLLCA0LCAyKSwKKwlNVVgoMCwgImkyYzRfd2Nsa19tdXgiLCAgIGxzcDBfd2Nsa19jb21tb25fcCwgTFNQMF9JMkM0X0NMSywgICA0LCAxKSwKKwlNVVgoMCwgImkyYzVfd2Nsa19tdXgiLCAgIGxzcDBfd2Nsa19jb21tb25fcCwgTFNQMF9JMkM1X0NMSywgICA0LCAxKSwKKwlNVVgoMCwgInNzcDBfd2Nsa19tdXgiLCAgIGxzcDBfd2Nsa19zc3BfcCwgICAgTFNQMF9TU1AwX0NMSywgICA0LCAxKSwKKwlNVVgoMCwgInNzcDFfd2Nsa19tdXgiLCAgIGxzcDBfd2Nsa19zc3BfcCwgICAgTFNQMF9TU1AxX0NMSywgICA0LCAxKSwKKwlNVVgoMCwgImkyYzNfd2Nsa19tdXgiLCAgIGxzcDBfd2Nsa19jb21tb25fcCwgTFNQMF9JMkMzX0NMSywgICA0LCAxKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgenhfY2xrX2dhdGUgbHNwMF9nYXRlX2Nsa1tdID0geworCUdBVEUoTFNQMF9USU1FUjNfV0NMSywgInRpbWVyM193Y2xrIiwgInRpbWVyM193Y2xrX211eCIsIExTUDBfVElNRVIzX0NMSywgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShMU1AwX1RJTUVSNF9XQ0xLLCAidGltZXI0X3djbGsiLCAidGltZXI0X3djbGtfbXV4IiwgTFNQMF9USU1FUjRfQ0xLLCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKExTUDBfVElNRVI1X1dDTEssICJ0aW1lcjVfd2NsayIsICJ0aW1lcjVfd2Nsa19tdXgiLCBMU1AwX1RJTUVSNV9DTEssIDEsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoTFNQMF9VQVJUM19XQ0xLLCAgInVhcnQzX3djbGsiLCAgInVhcnQzX3djbGtfbXV4IiwgIExTUDBfVUFSVDNfQ0xLLCAgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShMU1AwX1VBUlQxX1dDTEssICAidWFydDFfd2NsayIsICAidWFydDFfd2Nsa19tdXgiLCAgTFNQMF9VQVJUMV9DTEssICAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKExTUDBfVUFSVDJfV0NMSywgICJ1YXJ0Ml93Y2xrIiwgICJ1YXJ0Ml93Y2xrX211eCIsICBMU1AwX1VBUlQyX0NMSywgIDEsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoTFNQMF9TUElGQzBfV0NMSywgInNwaWZjMF93Y2xrIiwgInNwaWZjMF93Y2xrX211eCIsIExTUDBfU1BJRkMwX0NMSywgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShMU1AwX0kyQzRfV0NMSywgICAiaTJjNF93Y2xrIiwgICAiaTJjNF93Y2xrX211eCIsICAgTFNQMF9JMkM0X0NMSywgICAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKExTUDBfSTJDNV9XQ0xLLCAgICJpMmM1X3djbGsiLCAgICJpMmM1X3djbGtfbXV4IiwgICBMU1AwX0kyQzVfQ0xLLCAgIDEsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoTFNQMF9TU1AwX1dDTEssICAgInNzcDBfd2NsayIsICAgInNzcDBfZGl2IiwgICAgICAgIExTUDBfU1NQMF9DTEssICAgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShMU1AwX1NTUDFfV0NMSywgICAic3NwMV93Y2xrIiwgICAic3NwMV9kaXYiLCAgICAgICAgTFNQMF9TU1AxX0NMSywgICAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKExTUDBfSTJDM19XQ0xLLCAgICJpMmMzX3djbGsiLCAgICJpMmMzX3djbGtfbXV4IiwgICBMU1AwX0kyQzNfQ0xLLCAgIDEsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorfTsKKworc3RhdGljIHN0cnVjdCB6eF9jbGtfZGl2IGxzcDBfZGl2X2Nsa1tdID0geworCURJVl9UKDAsICJ0aW1lcjNfZGl2IiwgImxzcDBfMjRtIiwgTFNQMF9USU1FUjNfQ0xLLCAgMTIsIDQsIDAsIGNvbW1vbl9ldmVuX2Rpdl90YWJsZSksCisJRElWX1QoMCwgInRpbWVyNF9kaXYiLCAibHNwMF8yNG0iLCBMU1AwX1RJTUVSNF9DTEssICAxMiwgNCwgMCwgY29tbW9uX2V2ZW5fZGl2X3RhYmxlKSwKKwlESVZfVCgwLCAidGltZXI1X2RpdiIsICJsc3AwXzI0bSIsIExTUDBfVElNRVI1X0NMSywgIDEyLCA0LCAwLCBjb21tb25fZXZlbl9kaXZfdGFibGUpLAorCURJVl9UKDAsICJzc3AwX2RpdiIsICJzc3AwX3djbGtfbXV4IiwgTFNQMF9TU1AwX0NMSywgMTIsIDQsIDAsIGNvbW1vbl9ldmVuX2Rpdl90YWJsZSksCisJRElWX1QoMCwgInNzcDFfZGl2IiwgInNzcDFfd2Nsa19tdXgiLCBMU1AwX1NTUDFfQ0xLLCAxMiwgNCwgMCwgY29tbW9uX2V2ZW5fZGl2X3RhYmxlKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3X29uZWNlbGxfZGF0YSBsc3AwX2h3X29uZWNlbGxfZGF0YSA9IHsKKwkubnVtID0gTFNQMF9OUl9DTEtTLAorCS5od3MgPSB7CisJCVtMU1AwX05SX0NMS1MgLSAxXSA9IE5VTEwsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGxzcDBfY2xvY2tzX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZ19iYXNlOworCWludCBpLCByZXQ7CisKKwlyZWdfYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlpZiAoIXJlZ19iYXNlKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBtYXAgY2xrIGJhc2VcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsc3AwX211eF9jbGspOyBpKyspIHsKKwkJaWYgKGxzcDBfbXV4X2Nsa1tpXS5pZCkKKwkJCWxzcDBfaHdfb25lY2VsbF9kYXRhLmh3c1tsc3AwX211eF9jbGtbaV0uaWRdID0KKwkJCQkJJmxzcDBfbXV4X2Nsa1tpXS5tdXguaHc7CisKKwkJbHNwMF9tdXhfY2xrW2ldLm11eC5yZWcgKz0gKHVpbnRwdHJfdClyZWdfYmFzZTsKKwkJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZsc3AwX211eF9jbGtbaV0ubXV4Lmh3KTsKKwkJaWYgKHJldCkgeworCQkJcHJfd2FybigibHNwMCBjbGsgJXMgaW5pdCBlcnJvciFcbiIsCisJCQkJbHNwMF9tdXhfY2xrW2ldLm11eC5ody5pbml0LT5uYW1lKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxzcDBfZ2F0ZV9jbGspOyBpKyspIHsKKwkJaWYgKGxzcDBfZ2F0ZV9jbGtbaV0uaWQpCisJCQlsc3AwX2h3X29uZWNlbGxfZGF0YS5od3NbbHNwMF9nYXRlX2Nsa1tpXS5pZF0gPQorCQkJCQkmbHNwMF9nYXRlX2Nsa1tpXS5nYXRlLmh3OworCisJCWxzcDBfZ2F0ZV9jbGtbaV0uZ2F0ZS5yZWcgKz0gKHVpbnRwdHJfdClyZWdfYmFzZTsKKwkJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZsc3AwX2dhdGVfY2xrW2ldLmdhdGUuaHcpOworCQlpZiAocmV0KSB7CisJCQlwcl93YXJuKCJsc3AwIGNsayAlcyBpbml0IGVycm9yIVxuIiwKKwkJCQlsc3AwX2dhdGVfY2xrW2ldLmdhdGUuaHcuaW5pdC0+bmFtZSk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsc3AwX2Rpdl9jbGspOyBpKyspIHsKKwkJaWYgKGxzcDBfZGl2X2Nsa1tpXS5pZCkKKwkJCWxzcDBfaHdfb25lY2VsbF9kYXRhLmh3c1tsc3AwX2Rpdl9jbGtbaV0uaWRdID0KKwkJCQkJJmxzcDBfZGl2X2Nsa1tpXS5kaXYuaHc7CisKKwkJbHNwMF9kaXZfY2xrW2ldLmRpdi5yZWcgKz0gKHVpbnRwdHJfdClyZWdfYmFzZTsKKwkJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZsc3AwX2Rpdl9jbGtbaV0uZGl2Lmh3KTsKKwkJaWYgKHJldCkgeworCQkJcHJfd2FybigibHNwMCBjbGsgJXMgaW5pdCBlcnJvciFcbiIsCisJCQkJbHNwMF9kaXZfY2xrW2ldLmRpdi5ody5pbml0LT5uYW1lKTsKKwkJfQorCX0KKworCWlmIChvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfb25lY2VsbF9nZXQsICZsc3AwX2h3X29uZWNlbGxfZGF0YSkpCisJCXBhbmljKCJjb3VsZCBub3QgcmVnaXN0ZXIgY2xrIHByb3ZpZGVyXG4iKTsKKwlwcl9pbmZvKCJsc3AwLWNsayBpbml0IG92ZXI6JWRcbiIsIExTUDBfTlJfQ0xLUyk7CisKKwlyZXR1cm4gMDsKK30KKworUE5BTUUobHNwMV93Y2xrX2NvbW1vbl9wKSA9IHsKKwkibHNwMV8yNG0iLAorCSJsc3AxXzk5bSIsCit9OworCitQTkFNRShsc3AxX3djbGtfc3NwX3ApID0geworCSJsc3AxXzE0OG01IiwKKwkibHNwMV85OW0iLAorCSJsc3AxXzI0bSIsCit9OworCitzdGF0aWMgc3RydWN0IHp4X2Nsa19tdXggbHNwMV9tdXhfY2xrW10gPSB7CisJTVVYKDAsICJ1YXJ0NF93Y2xrX211eCIsIGxzcDFfd2Nsa19jb21tb25fcCwgTFNQMV9VQVJUNF9DTEssIDQsIDEpLAorCU1VWCgwLCAidWFydDVfd2Nsa19tdXgiLCBsc3AxX3djbGtfY29tbW9uX3AsIExTUDFfVUFSVDVfQ0xLLCA0LCAxKSwKKwlNVVgoMCwgInB3bV93Y2xrX211eCIsICAgbHNwMV93Y2xrX2NvbW1vbl9wLCBMU1AxX1BXTV9DTEssICAgNCwgMSksCisJTVVYKDAsICJpMmMyX3djbGtfbXV4IiwgIGxzcDFfd2Nsa19jb21tb25fcCwgTFNQMV9JMkMyX0NMSywgIDQsIDEpLAorCU1VWCgwLCAic3NwMl93Y2xrX211eCIsICBsc3AxX3djbGtfc3NwX3AsICAgIExTUDFfU1NQMl9DTEssICA0LCAyKSwKKwlNVVgoMCwgInNzcDNfd2Nsa19tdXgiLCAgbHNwMV93Y2xrX3NzcF9wLCAgICBMU1AxX1NTUDNfQ0xLLCAgNCwgMiksCisJTVVYKDAsICJzc3A0X3djbGtfbXV4IiwgIGxzcDFfd2Nsa19zc3BfcCwgICAgTFNQMV9TU1A0X0NMSywgIDQsIDIpLAorCU1VWCgwLCAidXNpbTFfd2Nsa19tdXgiLCBsc3AxX3djbGtfY29tbW9uX3AsIExTUDFfVVNJTTFfQ0xLLCA0LCAxKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgenhfY2xrX2RpdiBsc3AxX2Rpdl9jbGtbXSA9IHsKKwlESVZfVCgwLCAicHdtX2RpdiIsICAicHdtX3djbGtfbXV4IiwgIExTUDFfUFdNX0NMSywgIDEyLCA0LCBDTEtfU0VUX1JBVEVfUEFSRU5ULCBjb21tb25fZGl2X3RhYmxlKSwKKwlESVZfVCgwLCAic3NwMl9kaXYiLCAic3NwMl93Y2xrX211eCIsIExTUDFfU1NQMl9DTEssIDEyLCA0LCBDTEtfU0VUX1JBVEVfUEFSRU5ULCBjb21tb25fZXZlbl9kaXZfdGFibGUpLAorCURJVl9UKDAsICJzc3AzX2RpdiIsICJzc3AzX3djbGtfbXV4IiwgTFNQMV9TU1AzX0NMSywgMTIsIDQsIENMS19TRVRfUkFURV9QQVJFTlQsIGNvbW1vbl9ldmVuX2Rpdl90YWJsZSksCisJRElWX1QoMCwgInNzcDRfZGl2IiwgInNzcDRfd2Nsa19tdXgiLCBMU1AxX1NTUDRfQ0xLLCAxMiwgNCwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgY29tbW9uX2V2ZW5fZGl2X3RhYmxlKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgenhfY2xrX2dhdGUgbHNwMV9nYXRlX2Nsa1tdID0geworCUdBVEUoTFNQMV9VQVJUNF9XQ0xLLCAibHNwMV91YXJ0NF93Y2xrIiwgInVhcnQ0X3djbGtfbXV4IiwgTFNQMV9VQVJUNF9DTEssIDEsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoTFNQMV9VQVJUNV9XQ0xLLCAibHNwMV91YXJ0NV93Y2xrIiwgInVhcnQ1X3djbGtfbXV4IiwgTFNQMV9VQVJUNV9DTEssIDEsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoTFNQMV9QV01fV0NMSywgICAibHNwMV9wd21fd2NsayIsICAgInB3bV9kaXYiLCAgICAgICAgTFNQMV9QV01fQ0xLLCAgIDEsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoTFNQMV9QV01fUENMSywgICAibHNwMV9wd21fcGNsayIsICAgImxzcDFfcGNsayIsICAgICAgTFNQMV9QV01fQ0xLLCAgIDAsIDAsCQkgICAwKSwKKwlHQVRFKExTUDFfSTJDMl9XQ0xLLCAgImxzcDFfaTJjMl93Y2xrIiwgICJpMmMyX3djbGtfbXV4IiwgIExTUDFfSTJDMl9DTEssICAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKExTUDFfU1NQMl9XQ0xLLCAgImxzcDFfc3NwMl93Y2xrIiwgICJzc3AyX2RpdiIsICAgICAgIExTUDFfU1NQMl9DTEssICAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKExTUDFfU1NQM19XQ0xLLCAgImxzcDFfc3NwM193Y2xrIiwgICJzc3AzX2RpdiIsICAgICAgIExTUDFfU1NQM19DTEssICAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKExTUDFfU1NQNF9XQ0xLLCAgImxzcDFfc3NwNF93Y2xrIiwgICJzc3A0X2RpdiIsICAgICAgIExTUDFfU1NQNF9DTEssICAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKExTUDFfVVNJTTFfV0NMSywgImxzcDFfdXNpbTFfd2NsayIsICJ1c2ltMV93Y2xrX211eCIsIExTUDFfVVNJTTFfQ0xLLCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3X29uZWNlbGxfZGF0YSBsc3AxX2h3X29uZWNlbGxfZGF0YSA9IHsKKwkubnVtID0gTFNQMV9OUl9DTEtTLAorCS5od3MgPSB7CisJCVtMU1AxX05SX0NMS1MgLSAxXSA9IE5VTEwsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGxzcDFfY2xvY2tzX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZ19iYXNlOworCWludCBpLCByZXQ7CisKKwlyZWdfYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlpZiAoIXJlZ19iYXNlKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBtYXAgY2xrIGJhc2VcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsc3AxX211eF9jbGspOyBpKyspIHsKKwkJaWYgKGxzcDFfbXV4X2Nsa1tpXS5pZCkKKwkJCWxzcDFfaHdfb25lY2VsbF9kYXRhLmh3c1tsc3AxX211eF9jbGtbaV0uaWRdID0KKwkJCQkJJmxzcDBfbXV4X2Nsa1tpXS5tdXguaHc7CisKKwkJbHNwMV9tdXhfY2xrW2ldLm11eC5yZWcgKz0gKHVpbnRwdHJfdClyZWdfYmFzZTsKKwkJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZsc3AxX211eF9jbGtbaV0ubXV4Lmh3KTsKKwkJaWYgKHJldCkgeworCQkJcHJfd2FybigibHNwMSBjbGsgJXMgaW5pdCBlcnJvciFcbiIsCisJCQkJbHNwMV9tdXhfY2xrW2ldLm11eC5ody5pbml0LT5uYW1lKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxzcDFfZ2F0ZV9jbGspOyBpKyspIHsKKwkJaWYgKGxzcDFfZ2F0ZV9jbGtbaV0uaWQpCisJCQlsc3AxX2h3X29uZWNlbGxfZGF0YS5od3NbbHNwMV9nYXRlX2Nsa1tpXS5pZF0gPQorCQkJCQkmbHNwMV9nYXRlX2Nsa1tpXS5nYXRlLmh3OworCisJCWxzcDFfZ2F0ZV9jbGtbaV0uZ2F0ZS5yZWcgKz0gKHVpbnRwdHJfdClyZWdfYmFzZTsKKwkJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZsc3AxX2dhdGVfY2xrW2ldLmdhdGUuaHcpOworCQlpZiAocmV0KSB7CisJCQlwcl93YXJuKCJsc3AxIGNsayAlcyBpbml0IGVycm9yIVxuIiwKKwkJCQlsc3AxX2dhdGVfY2xrW2ldLmdhdGUuaHcuaW5pdC0+bmFtZSk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsc3AxX2Rpdl9jbGspOyBpKyspIHsKKwkJaWYgKGxzcDFfZGl2X2Nsa1tpXS5pZCkKKwkJCWxzcDFfaHdfb25lY2VsbF9kYXRhLmh3c1tsc3AxX2Rpdl9jbGtbaV0uaWRdID0KKwkJCQkJJmxzcDFfZGl2X2Nsa1tpXS5kaXYuaHc7CisKKwkJbHNwMV9kaXZfY2xrW2ldLmRpdi5yZWcgKz0gKHVpbnRwdHJfdClyZWdfYmFzZTsKKwkJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZsc3AxX2Rpdl9jbGtbaV0uZGl2Lmh3KTsKKwkJaWYgKHJldCkgeworCQkJcHJfd2FybigibHNwMSBjbGsgJXMgaW5pdCBlcnJvciFcbiIsCisJCQkJbHNwMV9kaXZfY2xrW2ldLmRpdi5ody5pbml0LT5uYW1lKTsKKwkJfQorCX0KKworCWlmIChvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfb25lY2VsbF9nZXQsICZsc3AxX2h3X29uZWNlbGxfZGF0YSkpCisJCXBhbmljKCJjb3VsZCBub3QgcmVnaXN0ZXIgY2xrIHByb3ZpZGVyXG4iKTsKKwlwcl9pbmZvKCJsc3AxLWNsayBpbml0IG92ZXIsIG5yOiVkXG4iLCBMU1AxX05SX0NMS1MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHp4X2Nsa2NfbWF0Y2hfdGFibGVbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInp0ZSx6eDI5NjcxOC10b3Bjcm0iLCAuZGF0YSA9ICZ0b3BfY2xvY2tzX2luaXQgfSwKKwl7IC5jb21wYXRpYmxlID0gInp0ZSx6eDI5NjcxOC1sc3AwY3JtIiwgLmRhdGEgPSAmbHNwMF9jbG9ja3NfaW5pdCB9LAorCXsgLmNvbXBhdGlibGUgPSAienRlLHp4Mjk2NzE4LWxzcDFjcm0iLCAuZGF0YSA9ICZsc3AxX2Nsb2Nrc19pbml0IH0sCisJeyB9Cit9OworCitzdGF0aWMgaW50IHp4X2Nsa2NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgKCppbml0X2ZuKShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisKKwlpbml0X2ZuID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKCZwZGV2LT5kZXYpOworCWlmICghaW5pdF9mbikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFcnJvcjogTm8gZGV2aWNlIG1hdGNoIGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIGluaXRfZm4obnApOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB6eF9jbGtfZHJpdmVyID0geworCS5wcm9iZQkJPSB6eF9jbGtjX3Byb2JlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ6eDI5NjcxOC1jbGtjIiwKKwkJLm9mX21hdGNoX3RhYmxlID0genhfY2xrY19tYXRjaF90YWJsZSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgenhfY2xrX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ6eF9jbGtfZHJpdmVyKTsKK30KK2NvcmVfaW5pdGNhbGwoenhfY2xrX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvenRlL2Nsay5jIGIvZHJpdmVycy9jbGsvenRlL2Nsay5jCmluZGV4IDdjNzNjNTMuLmM0YzEyNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3p0ZS9jbGsuYworKysgYi9kcml2ZXJzL2Nsay96dGUvY2xrLmMKQEAgLTIxLDggKzIxLDggQEAKICNkZWZpbmUgdG9fY2xrX3p4X2F1ZGlvKF9odykgY29udGFpbmVyX29mKF9odywgc3RydWN0IGNsa196eF9hdWRpbywgaHcpCiAKICNkZWZpbmUgQ0ZHMF9DRkcxX09GRlNFVCA0Ci0jZGVmaW5lIExPQ0tfRkxBRyBCSVQoMzApCi0jZGVmaW5lIFBPV0VSX0RPV04gQklUKDMxKQorI2RlZmluZSBMT0NLX0ZMQUcgMzAKKyNkZWZpbmUgUE9XRVJfRE9XTiAzMQogCiBzdGF0aWMgaW50IHJhdGVfdG9faWR4KHN0cnVjdCBjbGtfenhfcGxsICp6eF9wbGwsIHVuc2lnbmVkIGxvbmcgcmF0ZSkKIHsKQEAgLTUwLDggKzUwLDggQEAKIAlod19jZmcxID0gcmVhZGxfcmVsYXhlZCh6eF9wbGwtPnJlZ19iYXNlICsgQ0ZHMF9DRkcxX09GRlNFVCk7CiAKIAkvKiBGb3IgbWF0Y2hpbmcgdGhlIHZhbHVlIGluIGxvb2t1cCB0YWJsZSAqLwotCWh3X2NmZzAgJj0gfkxPQ0tfRkxBRzsKLQlod19jZmcwIHw9IFBPV0VSX0RPV047CisJaHdfY2ZnMCAmPSB+QklUKHp4X3BsbC0+bG9ja19iaXQpOworCWh3X2NmZzAgfD0gQklUKHp4X3BsbC0+cGRfYml0KTsKIAogCWZvciAoaSA9IDA7IGkgPCB6eF9wbGwtPmNvdW50OyBpKyspIHsKIAkJaWYgKGh3X2NmZzAgPT0gY29uZmlnW2ldLmNmZzAgJiYgaHdfY2ZnMSA9PSBjb25maWdbaV0uY2ZnMSkKQEAgLTEwOCwxMCArMTA4LDEwIEBACiAJdTMyIHJlZzsKIAogCXJlZyA9IHJlYWRsX3JlbGF4ZWQoenhfcGxsLT5yZWdfYmFzZSk7Ci0Jd3JpdGVsX3JlbGF4ZWQocmVnICYgflBPV0VSX0RPV04sIHp4X3BsbC0+cmVnX2Jhc2UpOworCXdyaXRlbF9yZWxheGVkKHJlZyAmIH5CSVQoenhfcGxsLT5wZF9iaXQpLCB6eF9wbGwtPnJlZ19iYXNlKTsKIAogCXJldHVybiByZWFkbF9yZWxheGVkX3BvbGxfdGltZW91dCh6eF9wbGwtPnJlZ19iYXNlLCByZWcsCi0JCQkJCSAgcmVnICYgTE9DS19GTEFHLCAwLCAxMDApOworCQkJCQkgIHJlZyAmIEJJVCh6eF9wbGwtPmxvY2tfYml0KSwgMCwgMTAwKTsKIH0KIAogc3RhdGljIHZvaWQgenhfcGxsX2Rpc2FibGUoc3RydWN0IGNsa19odyAqaHcpCkBAIC0xMjAsNyArMTIwLDcgQEAKIAl1MzIgcmVnOwogCiAJcmVnID0gcmVhZGxfcmVsYXhlZCh6eF9wbGwtPnJlZ19iYXNlKTsKLQl3cml0ZWxfcmVsYXhlZChyZWcgfCBQT1dFUl9ET1dOLCB6eF9wbGwtPnJlZ19iYXNlKTsKKwl3cml0ZWxfcmVsYXhlZChyZWcgfCBCSVQoenhfcGxsLT5wZF9iaXQpLCB6eF9wbGwtPnJlZ19iYXNlKTsKIH0KIAogc3RhdGljIGludCB6eF9wbGxfaXNfZW5hYmxlZChzdHJ1Y3QgY2xrX2h3ICpodykKQEAgLTEzMCwxMCArMTMwLDEwIEBACiAKIAlyZWcgPSByZWFkbF9yZWxheGVkKHp4X3BsbC0+cmVnX2Jhc2UpOwogCi0JcmV0dXJuICEocmVnICYgUE9XRVJfRE9XTik7CisJcmV0dXJuICEocmVnICYgQklUKHp4X3BsbC0+cGRfYml0KSk7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyB6eF9wbGxfb3BzID0geworY29uc3Qgc3RydWN0IGNsa19vcHMgenhfcGxsX29wcyA9IHsKIAkucmVjYWxjX3JhdGUgPSB6eF9wbGxfcmVjYWxjX3JhdGUsCiAJLnJvdW5kX3JhdGUgPSB6eF9wbGxfcm91bmRfcmF0ZSwKIAkuc2V0X3JhdGUgPSB6eF9wbGxfc2V0X3JhdGUsCkBAIC0xNDEsNiArMTQxLDcgQEAKIAkuZGlzYWJsZSA9IHp4X3BsbF9kaXNhYmxlLAogCS5pc19lbmFibGVkID0genhfcGxsX2lzX2VuYWJsZWQsCiB9OworRVhQT1JUX1NZTUJPTCh6eF9wbGxfb3BzKTsKIAogc3RydWN0IGNsayAqY2xrX3JlZ2lzdGVyX3p4X3BsbChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKIAkJCQl1bnNpZ25lZCBsb25nIGZsYWdzLCB2b2lkIF9faW9tZW0gKnJlZ19iYXNlLApAQCAtMTY0LDYgKzE2NSw4IEBACiAJenhfcGxsLT5yZWdfYmFzZSA9IHJlZ19iYXNlOwogCXp4X3BsbC0+bG9va3VwX3RhYmxlID0gbG9va3VwX3RhYmxlOwogCXp4X3BsbC0+Y291bnQgPSBjb3VudDsKKwl6eF9wbGwtPmxvY2tfYml0ID0gTE9DS19GTEFHOworCXp4X3BsbC0+cGRfYml0ID0gUE9XRVJfRE9XTjsKIAl6eF9wbGwtPmxvY2sgPSBsb2NrOwogCXp4X3BsbC0+aHcuaW5pdCA9ICZpbml0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay96dGUvY2xrLmggYi9kcml2ZXJzL2Nsay96dGUvY2xrLmgKaW5kZXggNjVhZTA4Yi4uMGRmMzQ3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvenRlL2Nsay5oCisrKyBiL2RyaXZlcnMvY2xrL3p0ZS9jbGsuaApAQCAtMTIsNiArMTIsMjYgQEAKICNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCisjZGVmaW5lIFBOQU1FKHgpIHN0YXRpYyBjb25zdCBjaGFyICp4W10KKworI2RlZmluZSBDTEtfSFdfSU5JVChfbmFtZSwgX3BhcmVudCwgX29wcywgX2ZsYWdzKQkJCVwKKwkmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKSB7CQkJCQlcCisJCS5mbGFncwkJPSBfZmxhZ3MsCQkJCVwKKwkJLm5hbWUJCT0gX25hbWUsCQkJCVwKKwkJLnBhcmVudF9uYW1lcwk9IChjb25zdCBjaGFyICpbXSkgeyBfcGFyZW50IH0sCQlcCisJCS5udW1fcGFyZW50cwk9IDEsCQkJCQlcCisJCS5vcHMJCT0gX29wcywJCQkJCVwKKwl9CisKKyNkZWZpbmUgQ0xLX0hXX0lOSVRfUEFSRU5UUyhfbmFtZSwgX3BhcmVudHMsIF9vcHMsIF9mbGFncykJCVwKKwkmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKSB7CQkJCQlcCisJCS5mbGFncwkJPSBfZmxhZ3MsCQkJCVwKKwkJLm5hbWUJCT0gX25hbWUsCQkJCVwKKwkJLnBhcmVudF9uYW1lcwk9IF9wYXJlbnRzLAkJCQlcCisJCS5udW1fcGFyZW50cwk9IEFSUkFZX1NJWkUoX3BhcmVudHMpLAkJCVwKKwkJLm9wcwkJPSBfb3BzLAkJCQkJXAorCX0KKwogc3RydWN0IHp4X3BsbF9jb25maWcgewogCXVuc2lnbmVkIGxvbmcgcmF0ZTsKIAl1MzIgY2ZnMDsKQEAgLTI0LDggKzQ0LDExNSBAQAogCWNvbnN0IHN0cnVjdCB6eF9wbGxfY29uZmlnICpsb29rdXBfdGFibGU7IC8qIG9yZGVyIGJ5IHJhdGUgYXNjICovCiAJaW50IGNvdW50OwogCXNwaW5sb2NrX3QgKmxvY2s7CisJdTggcGRfYml0OwkJLyogcG93ZXIgZG93biBiaXQgKi8KKwl1OCBsb2NrX2JpdDsJCS8qIHBsbCBsb2NrIGZsYWcgYml0ICovCiB9OwogCisjZGVmaW5lIFBMTF9SQVRFKF9yYXRlLCBfY2ZnMCwgX2NmZzEpCVwKK3sJCQkJCVwKKwkucmF0ZSA9IF9yYXRlLAkJCVwKKwkuY2ZnMCA9IF9jZmcwLAkJCVwKKwkuY2ZnMSA9IF9jZmcxLAkJCVwKK30KKworI2RlZmluZSBaWF9QTEwoX25hbWUsIF9wYXJlbnQsIF9yZWcsIF90YWJsZSwgX3BkLCBfbG9jaykJCVwKK3sJCQkJCQkJCQlcCisJLnJlZ19iYXNlCT0gKHZvaWQgX19pb21lbSAqKSBfcmVnLAkJCVwKKwkubG9va3VwX3RhYmxlCT0gX3RhYmxlLAkJCQkJXAorCS5jb3VudAkJPSBBUlJBWV9TSVpFKF90YWJsZSksCQkJCVwKKwkucGRfYml0CQk9IF9wZCwJCQkJCQlcCisJLmxvY2tfYml0CT0gX2xvY2ssCQkJCQlcCisJLmh3LmluaXQJID0gQ0xLX0hXX0lOSVQoX25hbWUsIF9wYXJlbnQsICZ6eF9wbGxfb3BzLAlcCisJCQkJQ0xLX0dFVF9SQVRFX05PQ0FDSEUpLAkJCVwKK30KKworI2RlZmluZSBaWDI5NjcxOF9QTEwoX25hbWUsIF9wYXJlbnQsIF9yZWcsIF90YWJsZSkJCQlcCitaWF9QTEwoX25hbWUsIF9wYXJlbnQsIF9yZWcsIF90YWJsZSwgMCwgMzApCisKK3N0cnVjdCB6eF9jbGtfZ2F0ZSB7CisJc3RydWN0IGNsa19nYXRlIGdhdGU7CisJdTE2CQlpZDsKK307CisKKyNkZWZpbmUgR0FURShfaWQsIF9uYW1lLCBfcGFyZW50LCBfcmVnLCBfYml0LCBfZmxhZywgX2dmbGFncykJCVwKK3sJCQkJCQkJCQlcCisJLmdhdGUgPSB7CQkJCQkJCVwKKwkJLnJlZyA9ICh2b2lkIF9faW9tZW0gKikgX3JlZywJCQkJXAorCQkuYml0X2lkeCA9IChfYml0KSwJCQkJCVwKKwkJLmZsYWdzID0gX2dmbGFncywJCQkJCVwKKwkJLmxvY2sgPSAmY2xrX2xvY2ssCQkJCQlcCisJCS5ody5pbml0ID0gQ0xLX0hXX0lOSVQoX25hbWUsCQkJCVwKKwkJCQkJX3BhcmVudCwJCQlcCisJCQkJCSZjbGtfZ2F0ZV9vcHMsCQkJXAorCQkJCQlfZmxhZyB8IENMS19JR05PUkVfVU5VU0VEKSwJXAorCX0sCQkJCQkJCQlcCisJLmlkCT0gX2lkLAkJCQkJCQlcCit9CisKK3N0cnVjdCB6eF9jbGtfZml4ZWRfZmFjdG9yIHsKKwlzdHJ1Y3QgY2xrX2ZpeGVkX2ZhY3RvciBmYWN0b3I7CisJdTE2CWlkOworfTsKKworI2RlZmluZSBGRkFDVE9SKF9pZCwgX25hbWUsIF9wYXJlbnQsIF9tdWx0LCBfZGl2LCBfZmxhZykJCVwKK3sJCQkJCQkJCQlcCisJLmZhY3RvciA9IHsJCQkJCQkJXAorCQkuZGl2CQk9IF9kaXYsCQkJCQlcCisJCS5tdWx0CQk9IF9tdWx0LAkJCQlcCisJCS5ody5pbml0CT0gQ0xLX0hXX0lOSVQoX25hbWUsCQkJXAorCQkJCQkgICAgICBfcGFyZW50LAkJCVwKKwkJCQkJICAgICAgJmNsa19maXhlZF9mYWN0b3Jfb3BzLAlcCisJCQkJCSAgICAgIF9mbGFnKSwJCQlcCisJfSwJCQkJCQkJCVwKKwkuaWQgPSBfaWQsCQkJCQkJCVwKK30KKworc3RydWN0IHp4X2Nsa19tdXggeworCXN0cnVjdCBjbGtfbXV4IG11eDsKKwl1MTYJaWQ7Cit9OworCisjZGVmaW5lIE1VWF9GKF9pZCwgX25hbWUsIF9wYXJlbnQsIF9yZWcsIF9zaGlmdCwgX3dpZHRoLCBfZmxhZywgX21mbGFnKQlcCit7CQkJCQkJCQkJXAorCS5tdXggPSB7CQkJCQkJCVwKKwkJLnJlZwkJPSAodm9pZCBfX2lvbWVtICopIF9yZWcsCQlcCisJCS5tYXNrCQk9IEJJVChfd2lkdGgpIC0gMSwJCQlcCisJCS5zaGlmdAkJPSBfc2hpZnQsCQkJCVwKKwkJLmZsYWdzCQk9IF9tZmxhZywJCQkJXAorCQkubG9jawkJPSAmY2xrX2xvY2ssCQkJCVwKKwkJLmh3LmluaXQJPSBDTEtfSFdfSU5JVF9QQVJFTlRTKF9uYW1lLAkJXAorCQkJCQkJICAgICAgX3BhcmVudCwJCVwKKwkJCQkJCSAgICAgICZjbGtfbXV4X29wcywJXAorCQkJCQkJICAgICAgX2ZsYWcpLAkJXAorCX0sCQkJCQkJCQlcCisJLmlkID0gX2lkLAkJCQkJCQlcCit9CisKKyNkZWZpbmUgTVVYKF9pZCwgX25hbWUsIF9wYXJlbnQsIF9yZWcsIF9zaGlmdCwgX3dpZHRoKQkJCVwKK01VWF9GKF9pZCwgX25hbWUsIF9wYXJlbnQsIF9yZWcsIF9zaGlmdCwgX3dpZHRoLCAwLCAwKQorCitzdHJ1Y3QgenhfY2xrX2RpdiB7CisJc3RydWN0IGNsa19kaXZpZGVyIGRpdjsKKwl1MTYJaWQ7Cit9OworCisjZGVmaW5lIERJVl9UKF9pZCwgX25hbWUsIF9wYXJlbnQsIF9yZWcsIF9zaGlmdCwgX3dpZHRoLCBfZmxhZywgX3RhYmxlKQlcCit7CQkJCQkJCQkJXAorCS5kaXYgPSB7CQkJCQkJCVwKKwkJLnJlZwkJPSAodm9pZCBfX2lvbWVtICopIF9yZWcsCQlcCisJCS5zaGlmdAkJPSBfc2hpZnQsCQkJCVwKKwkJLndpZHRoCQk9IF93aWR0aCwJCQkJXAorCQkuZmxhZ3MJCT0gMCwJCQkJCVwKKwkJLnRhYmxlCQk9IF90YWJsZSwJCQkJXAorCQkubG9jawkJPSAmY2xrX2xvY2ssCQkJCVwKKwkJLmh3LmluaXQJPSBDTEtfSFdfSU5JVChfbmFtZSwJCQlcCisJCQkJCSAgICAgIF9wYXJlbnQsCQkJXAorCQkJCQkgICAgICAmY2xrX2RpdmlkZXJfb3BzLAkJXAorCQkJCQkgICAgICBfZmxhZyksCQkJXAorCX0sCQkJCQkJCQlcCisJLmlkID0gX2lkLAkJCQkJCQlcCit9CisKIHN0cnVjdCBjbGsgKmNsa19yZWdpc3Rlcl96eF9wbGwoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcGFyZW50X25hbWUsCiAJdW5zaWduZWQgbG9uZyBmbGFncywgdm9pZCBfX2lvbWVtICpyZWdfYmFzZSwKIAljb25zdCBzdHJ1Y3QgenhfcGxsX2NvbmZpZyAqbG9va3VwX3RhYmxlLCBpbnQgY291bnQsIHNwaW5sb2NrX3QgKmxvY2spOwpAQCAtMzgsNCArMTY1LDYgQEAKIHN0cnVjdCBjbGsgKmNsa19yZWdpc3Rlcl96eF9hdWRpbyhjb25zdCBjaGFyICpuYW1lLAogCQkJCSAgY29uc3QgY2hhciAqIGNvbnN0IHBhcmVudF9uYW1lLAogCQkJCSAgdW5zaWduZWQgbG9uZyBmbGFncywgdm9pZCBfX2lvbWVtICpyZWdfYmFzZSk7CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgY2xrX29wcyB6eF9wbGxfb3BzOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL0tjb25maWcgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL0tjb25maWcKaW5kZXggNTY3Nzg4Ni4uOGE3NTNmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZwpAQCAtMzA1LDYgKzMwNSwxNiBAQAogCSAgVGhpcyBtdXN0IGJlIGRpc2FibGVkIGZvciBoYXJkd2FyZSB2YWxpZGF0aW9uIHB1cnBvc2VzIHRvIGRldGVjdCBhbnkKIAkgIGhhcmR3YXJlIGFub21hbGllcyBvZiBtaXNzaW5nIGV2ZW50cy4KIAorY29uZmlnIEZTTF9FUlJBVFVNX0EwMDg1ODUKKwlib29sICJXb3JrYXJvdW5kIGZvciBGcmVlc2NhbGUvTlhQIEVycmF0dW0gQS0wMDg1ODUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBBUk1fQVJDSF9USU1FUiAmJiBBUk02NAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgYSB3b3JrYXJvdW5kIGZvciBGcmVlc2NhbGUvTlhQIEVycmF0dW0KKwkgIEEtMDA4NTg1ICgiQVJNIGdlbmVyaWMgdGltZXIgbWF5IGNvbnRhaW4gYW4gZXJyb25lb3VzCisJICB2YWx1ZSIpLiAgVGhlIHdvcmthcm91bmQgd2lsbCBvbmx5IGJlIGFjdGl2ZSBpZiB0aGUKKwkgIGZzbCxlcnJhdHVtLWEwMDg1ODUgcHJvcGVydHkgaXMgZm91bmQgaW4gdGhlIHRpbWVyIG5vZGUuCisKIGNvbmZpZyBBUk1fR0xPQkFMX1RJTUVSCiAJYm9vbCAiU3VwcG9ydCBmb3IgdGhlIEFSTSBnbG9iYWwgdGltZXIiIGlmIENPTVBJTEVfVEVTVAogCXNlbGVjdCBDTEtTUkNfT0YgaWYgT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvYXJtX2FyY2hfdGltZXIuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvYXJtX2FyY2hfdGltZXIuYwppbmRleCA1NzcwMDU0Li43M2M0ODdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2FybV9hcmNoX3RpbWVyLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9hcm1fYXJjaF90aW1lci5jCkBAIC05NCw2ICs5NCw0MyBAQAogICogQXJjaGl0ZWN0ZWQgc3lzdGVtIHRpbWVyIHN1cHBvcnQuCiAgKi8KIAorI2lmZGVmIENPTkZJR19GU0xfRVJSQVRVTV9BMDA4NTg1CitERUZJTkVfU1RBVElDX0tFWV9GQUxTRShhcmNoX3RpbWVyX3JlYWRfb29sX2VuYWJsZWQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXJjaF90aW1lcl9yZWFkX29vbF9lbmFibGVkKTsKKworc3RhdGljIGludCBmc2xfYTAwODU4NV9lbmFibGUgPSAtMTsKKworc3RhdGljIGludCBfX2luaXQgZWFybHlfZnNsX2EwMDg1ODVfY2ZnKGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCWJvb2wgdmFsOworCisJcmV0ID0gc3RydG9ib29sKGJ1ZiwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZzbF9hMDA4NTg1X2VuYWJsZSA9IHZhbDsKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJjbG9ja3NvdXJjZS5hcm1fYXJjaF90aW1lci5mc2wtYTAwODU4NSIsIGVhcmx5X2ZzbF9hMDA4NTg1X2NmZyk7CisKK3UzMiBfX2ZzbF9hMDA4NTg1X3JlYWRfY250cF90dmFsX2VsMCh2b2lkKQoreworCXJldHVybiBfX2ZzbF9hMDA4NTg1X3JlYWRfcmVnKGNudHBfdHZhbF9lbDApOworfQorCit1MzIgX19mc2xfYTAwODU4NV9yZWFkX2NudHZfdHZhbF9lbDAodm9pZCkKK3sKKwlyZXR1cm4gX19mc2xfYTAwODU4NV9yZWFkX3JlZyhjbnR2X3R2YWxfZWwwKTsKK30KKwordTY0IF9fZnNsX2EwMDg1ODVfcmVhZF9jbnR2Y3RfZWwwKHZvaWQpCit7CisJcmV0dXJuIF9fZnNsX2EwMDg1ODVfcmVhZF9yZWcoY250dmN0X2VsMCk7Cit9CitFWFBPUlRfU1lNQk9MKF9fZnNsX2EwMDg1ODVfcmVhZF9jbnR2Y3RfZWwwKTsKKyNlbmRpZiAvKiBDT05GSUdfRlNMX0VSUkFUVU1fQTAwODU4NSAqLworCiBzdGF0aWMgX19hbHdheXNfaW5saW5lCiB2b2lkIGFyY2hfdGltZXJfcmVnX3dyaXRlKGludCBhY2Nlc3MsIGVudW0gYXJjaF90aW1lcl9yZWcgcmVnLCB1MzIgdmFsLAogCQkJICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjbGspCkBAIC0yNDMsNiArMjgwLDQwIEBACiAJYXJjaF90aW1lcl9yZWdfd3JpdGUoYWNjZXNzLCBBUkNIX1RJTUVSX1JFR19DVFJMLCBjdHJsLCBjbGspOwogfQogCisjaWZkZWYgQ09ORklHX0ZTTF9FUlJBVFVNX0EwMDg1ODUKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBmc2xfYTAwODU4NV9zZXRfbmV4dF9ldmVudChjb25zdCBpbnQgYWNjZXNzLAorCQl1bnNpZ25lZCBsb25nIGV2dCwgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcgY3RybDsKKwl1NjQgY3ZhbCA9IGV2dCArIGFyY2hfY291bnRlcl9nZXRfY250dmN0KCk7CisKKwljdHJsID0gYXJjaF90aW1lcl9yZWdfcmVhZChhY2Nlc3MsIEFSQ0hfVElNRVJfUkVHX0NUUkwsIGNsayk7CisJY3RybCB8PSBBUkNIX1RJTUVSX0NUUkxfRU5BQkxFOworCWN0cmwgJj0gfkFSQ0hfVElNRVJfQ1RSTF9JVF9NQVNLOworCisJaWYgKGFjY2VzcyA9PSBBUkNIX1RJTUVSX1BIWVNfQUNDRVNTKQorCQl3cml0ZV9zeXNyZWcoY3ZhbCwgY250cF9jdmFsX2VsMCk7CisJZWxzZSBpZiAoYWNjZXNzID09IEFSQ0hfVElNRVJfVklSVF9BQ0NFU1MpCisJCXdyaXRlX3N5c3JlZyhjdmFsLCBjbnR2X2N2YWxfZWwwKTsKKworCWFyY2hfdGltZXJfcmVnX3dyaXRlKGFjY2VzcywgQVJDSF9USU1FUl9SRUdfQ1RSTCwgY3RybCwgY2xrKTsKK30KKworc3RhdGljIGludCBmc2xfYTAwODU4NV9zZXRfbmV4dF9ldmVudF92aXJ0KHVuc2lnbmVkIGxvbmcgZXZ0LAorCQkJCQkgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjbGspCit7CisJZnNsX2EwMDg1ODVfc2V0X25leHRfZXZlbnQoQVJDSF9USU1FUl9WSVJUX0FDQ0VTUywgZXZ0LCBjbGspOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZzbF9hMDA4NTg1X3NldF9uZXh0X2V2ZW50X3BoeXModW5zaWduZWQgbG9uZyBldnQsCisJCQkJCSAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNsaykKK3sKKwlmc2xfYTAwODU4NV9zZXRfbmV4dF9ldmVudChBUkNIX1RJTUVSX1BIWVNfQUNDRVNTLCBldnQsIGNsayk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX0ZTTF9FUlJBVFVNX0EwMDg1ODUgKi8KKwogc3RhdGljIGludCBhcmNoX3RpbWVyX3NldF9uZXh0X2V2ZW50X3ZpcnQodW5zaWduZWQgbG9uZyBldnQsCiAJCQkJCSAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2xrKQogewpAQCAtMjcxLDYgKzM0MiwxOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBmc2xfYTAwODU4NV9zZXRfc25lKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNsaykKK3sKKyNpZmRlZiBDT05GSUdfRlNMX0VSUkFUVU1fQTAwODU4NQorCWlmICghc3RhdGljX2JyYW5jaF91bmxpa2VseSgmYXJjaF90aW1lcl9yZWFkX29vbF9lbmFibGVkKSkKKwkJcmV0dXJuOworCisJaWYgKGFyY2hfdGltZXJfdXNlc19wcGkgPT0gVklSVF9QUEkpCisJCWNsay0+c2V0X25leHRfZXZlbnQgPSBmc2xfYTAwODU4NV9zZXRfbmV4dF9ldmVudF92aXJ0OworCWVsc2UKKwkJY2xrLT5zZXRfbmV4dF9ldmVudCA9IGZzbF9hMDA4NTg1X3NldF9uZXh0X2V2ZW50X3BoeXM7CisjZW5kaWYKK30KKwogc3RhdGljIHZvaWQgX19hcmNoX3RpbWVyX3NldHVwKHVuc2lnbmVkIHR5cGUsCiAJCQkgICAgICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2xrKQogewpAQCAtMjk5LDYgKzM4Myw4IEBACiAJCWRlZmF1bHQ6CiAJCQlCVUcoKTsKIAkJfQorCisJCWZzbF9hMDA4NTg1X3NldF9zbmUoY2xrKTsKIAl9IGVsc2UgewogCQljbGstPmZlYXR1cmVzIHw9IENMT0NLX0VWVF9GRUFUX0RZTklSUTsKIAkJY2xrLT5uYW1lID0gImFyY2hfbWVtX3RpbWVyIjsKQEAgLTUxNSwxNSArNjAxLDE5IEBACiAJCQlhcmNoX3RpbWVyX3JlYWRfY291bnRlciA9IGFyY2hfY291bnRlcl9nZXRfY250dmN0OwogCQllbHNlCiAJCQlhcmNoX3RpbWVyX3JlYWRfY291bnRlciA9IGFyY2hfY291bnRlcl9nZXRfY250cGN0OworCisJCWNsb2Nrc291cmNlX2NvdW50ZXIuYXJjaGRhdGEudmRzb19kaXJlY3QgPSB0cnVlOworCisjaWZkZWYgQ09ORklHX0ZTTF9FUlJBVFVNX0EwMDg1ODUKKwkJLyoKKwkJICogRG9uJ3QgdXNlIHRoZSB2ZHNvIGZhc3RwYXRoIGlmIGVycmF0YSByZXF1aXJlIHVzaW5nCisJCSAqIHRoZSBvdXQtb2YtbGluZSBjb3VudGVyIGFjY2Vzc29yLgorCQkgKi8KKwkJaWYgKHN0YXRpY19icmFuY2hfdW5saWtlbHkoJmFyY2hfdGltZXJfcmVhZF9vb2xfZW5hYmxlZCkpCisJCQljbG9ja3NvdXJjZV9jb3VudGVyLmFyY2hkYXRhLnZkc29fZGlyZWN0ID0gZmFsc2U7CisjZW5kaWYKIAl9IGVsc2UgewogCQlhcmNoX3RpbWVyX3JlYWRfY291bnRlciA9IGFyY2hfY291bnRlcl9nZXRfY250dmN0X21lbTsKLQotCQkvKiBJZiB0aGUgY2xvY2tzb3VyY2UgbmFtZSBpcyAiYXJjaF9zeXNfY291bnRlciIgdGhlCi0JCSAqIFZEU08gd2lsbCBhdHRlbXB0IHRvIHJlYWQgdGhlIENQMTUtYmFzZWQgY291bnRlci4KLQkJICogRW5zdXJlIHRoaXMgZG9lcyBub3QgaGFwcGVuIHdoZW4gQ1AxNS1iYXNlZAotCQkgKiBjb3VudGVyIGlzIG5vdCBhdmFpbGFibGUuCi0JCSAqLwotCQljbG9ja3NvdXJjZV9jb3VudGVyLm5hbWUgPSAiYXJjaF9tZW1fY291bnRlciI7CiAJfQogCiAJc3RhcnRfY291bnQgPSBhcmNoX3RpbWVyX3JlYWRfY291bnRlcigpOwpAQCAtODAwLDYgKzg5MCwxNSBAQAogCiAJYXJjaF90aW1lcl9jM3N0b3AgPSAhb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYWx3YXlzLW9uIik7CiAKKyNpZmRlZiBDT05GSUdfRlNMX0VSUkFUVU1fQTAwODU4NQorCWlmIChmc2xfYTAwODU4NV9lbmFibGUgPCAwKQorCQlmc2xfYTAwODU4NV9lbmFibGUgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJmc2wsZXJyYXR1bS1hMDA4NTg1Iik7CisJaWYgKGZzbF9hMDA4NTg1X2VuYWJsZSkgeworCQlzdGF0aWNfYnJhbmNoX2VuYWJsZSgmYXJjaF90aW1lcl9yZWFkX29vbF9lbmFibGVkKTsKKwkJcHJfaW5mbygiRW5hYmxpbmcgd29ya2Fyb3VuZCBmb3IgRlNMIGVycmF0dW0gQS0wMDg1ODVcbiIpOworCX0KKyNlbmRpZgorCiAJLyoKIAkgKiBJZiB3ZSBjYW5ub3QgcmVseSBvbiBmaXJtd2FyZSBpbml0aWFsaXppbmcgdGhlIHRpbWVyIHJlZ2lzdGVycyB0aGVuCiAJICogd2Ugc2hvdWxkIHVzZSB0aGUgcGh5c2ljYWwgdGltZXJzIGluc3RlYWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2JjbV9rb25hX3RpbWVyLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2JjbV9rb25hX3RpbWVyLmMKaW5kZXggN2UzZmQzNy4uOTJmNmU0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9iY21fa29uYV90aW1lci5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvYmNtX2tvbmFfdGltZXIuYwpAQCAtNjYsMTAgKzY2LDEwIEBACiAKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIGtvbmFfdGltZXJfZ2V0X2NvdW50ZXIodm9pZCBfX2lvbWVtICp0aW1lcl9iYXNlLCB1aW50MzJfdCAqbXN3LCB1aW50MzJfdCAqbHN3KQogewotCWludCBsb29wX2xpbWl0ID0gNDsKKwlpbnQgbG9vcF9saW1pdCA9IDM7CiAKIAkvKgogCSAqIFJlYWQgNjQtYml0IGZyZWUgcnVubmluZyBjb3VudGVyCkBAIC04MywxOCArODMsMTkgQEAKIAkgKiAgICAgIGlmIG5ldyBoaS13b3JkIGlzIGVxdWFsIHRvIHByZXZpb3VzbHkgcmVhZCBoaS13b3JkIHRoZW4gc3RvcC4KIAkgKi8KIAotCXdoaWxlICgtLWxvb3BfbGltaXQpIHsKKwlkbyB7CiAJCSptc3cgPSByZWFkbCh0aW1lcl9iYXNlICsgS09OQV9HUFRJTUVSX1NUQ0hJX09GRlNFVCk7CiAJCSpsc3cgPSByZWFkbCh0aW1lcl9iYXNlICsgS09OQV9HUFRJTUVSX1NUQ0xPX09GRlNFVCk7CiAJCWlmICgqbXN3ID09IHJlYWRsKHRpbWVyX2Jhc2UgKyBLT05BX0dQVElNRVJfU1RDSElfT0ZGU0VUKSkKIAkJCWJyZWFrOwotCX0KKwl9IHdoaWxlICgtLWxvb3BfbGltaXQpOwogCWlmICghbG9vcF9saW1pdCkgewogCQlwcl9lcnIoImJjbV9rb25hX3RpbWVyOiBnZXR0aW5nIGNvdW50ZXIgZmFpbGVkLlxuIik7CiAJCXByX2VycigiIFRpbWVyIHdpbGwgYmUgaW1wYWN0ZWRcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9CiAKLQlyZXR1cm47CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQga29uYV90aW1lcl9zZXRfbmV4dF9ldmVudCh1bnNpZ25lZCBsb25nIGNsYywKQEAgLTExMiw4ICsxMTMsMTEgQEAKIAogCXVpbnQzMl90IGxzdywgbXN3OwogCXVpbnQzMl90IHJlZzsKKwlpbnQgcmV0OwogCi0Ja29uYV90aW1lcl9nZXRfY291bnRlcih0aW1lcnMudG1yX3JlZ3MsICZtc3csICZsc3cpOworCXJldCA9IGtvbmFfdGltZXJfZ2V0X2NvdW50ZXIodGltZXJzLnRtcl9yZWdzLCAmbXN3LCAmbHN3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJLyogTG9hZCB0aGUgIm5leHQiIGV2ZW50IHRpY2sgdmFsdWUgKi8KIAl3cml0ZWwobHN3ICsgY2xjLCB0aW1lcnMudG1yX3JlZ3MgKyBLT05BX0dQVElNRVJfU1RDTTBfT0ZGU0VUKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvbWlwcy1naWMtdGltZXIuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvbWlwcy1naWMtdGltZXIuYwppbmRleCBkOTFlODcyLi43YTk2MGNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL21pcHMtZ2ljLXRpbWVyLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9taXBzLWdpYy10aW1lci5jCkBAIC0xMDksMTIgKzEwOSwxNSBAQAogewogCWludCByZXQ7CiAKLQlpZiAoIWNwdV9oYXNfY291bnRlciB8fCAhZ2ljX2ZyZXF1ZW5jeSkKKwlpZiAoIWdpY19mcmVxdWVuY3kpCiAJCXJldHVybiAtRU5YSU87CiAKIAlyZXQgPSBzZXR1cF9wZXJjcHVfaXJxKGdpY190aW1lcl9pcnEsICZnaWNfY29tcGFyZV9pcnFhY3Rpb24pOwotCWlmIChyZXQgPCAwKQorCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiR0lDIHRpbWVyIElSUSAlZCBzZXR1cCBmYWlsZWQ6ICVkXG4iLAorCQkgICAgICAgZ2ljX3RpbWVyX2lycSwgcmV0KTsKIAkJcmV0dXJuIHJldDsKKwl9CiAKIAljcHVocF9zZXR1cF9zdGF0ZShDUFVIUF9BUF9NSVBTX0dJQ19USU1FUl9TVEFSVElORywKIAkJCSAgIkFQX01JUFNfR0lDX1RJTUVSX1NUQVJUSU5HIiwgZ2ljX3N0YXJ0aW5nX2NwdSwKQEAgLTE2NCw3ICsxNjcsNyBAQAogCWdpY19zdGFydF9jb3VudCgpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZ2ljX2Nsb2Nrc291cmNlX29mX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQorc3RhdGljIGludCBfX2luaXQgZ2ljX2Nsb2Nrc291cmNlX29mX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQogewogCXN0cnVjdCBjbGsgKmNsazsKIAlpbnQgcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9tb3hhcnRfdGltZXIuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvbW94YXJ0X3RpbWVyLmMKaW5kZXggODQxNDU0NC4uMmE4ZjQ3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9tb3hhcnRfdGltZXIuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL21veGFydF90aW1lci5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2RlZmluZSBUSU1FUjFfQkFTRQkJMHgwMAogI2RlZmluZSBUSU1FUjJfQkFTRQkJMHgxMApAQCAtMzYsNzUgKzM3LDEwOSBAQAogI2RlZmluZSBUSU1FUl9JTlRSX01BU0sJCTB4MzgKIAogLyoKLSAqIFRJTUVSX0NSIGZsYWdzOgorICogTW94YXJ0IFRJTUVSX0NSIGZsYWdzOgogICoKLSAqIFRJTUVSRUdfQ1JfKl9DTE9DSwkwOiBQQ0xLLCAxOiBFWFQxQ0xLCi0gKiBUSU1FUkVHX0NSXypfSU5UCW92ZXJmbG93IGludGVycnVwdCBlbmFibGUgYml0CisgKiBNT1hBUlRfQ1JfKl9DTE9DSwkwOiBQQ0xLLCAxOiBFWFQxQ0xLCisgKiBNT1hBUlRfQ1JfKl9JTlQJb3ZlcmZsb3cgaW50ZXJydXB0IGVuYWJsZSBiaXQKICAqLwotI2RlZmluZSBUSU1FUkVHX0NSXzFfRU5BQkxFCUJJVCgwKQotI2RlZmluZSBUSU1FUkVHX0NSXzFfQ0xPQ0sJQklUKDEpCi0jZGVmaW5lIFRJTUVSRUdfQ1JfMV9JTlQJQklUKDIpCi0jZGVmaW5lIFRJTUVSRUdfQ1JfMl9FTkFCTEUJQklUKDMpCi0jZGVmaW5lIFRJTUVSRUdfQ1JfMl9DTE9DSwlCSVQoNCkKLSNkZWZpbmUgVElNRVJFR19DUl8yX0lOVAlCSVQoNSkKLSNkZWZpbmUgVElNRVJFR19DUl8zX0VOQUJMRQlCSVQoNikKLSNkZWZpbmUgVElNRVJFR19DUl8zX0NMT0NLCUJJVCg3KQotI2RlZmluZSBUSU1FUkVHX0NSXzNfSU5UCUJJVCg4KQotI2RlZmluZSBUSU1FUkVHX0NSX0NPVU5UX1VQCUJJVCg5KQorI2RlZmluZSBNT1hBUlRfQ1JfMV9FTkFCTEUJQklUKDApCisjZGVmaW5lIE1PWEFSVF9DUl8xX0NMT0NLCUJJVCgxKQorI2RlZmluZSBNT1hBUlRfQ1JfMV9JTlQJQklUKDIpCisjZGVmaW5lIE1PWEFSVF9DUl8yX0VOQUJMRQlCSVQoMykKKyNkZWZpbmUgTU9YQVJUX0NSXzJfQ0xPQ0sJQklUKDQpCisjZGVmaW5lIE1PWEFSVF9DUl8yX0lOVAlCSVQoNSkKKyNkZWZpbmUgTU9YQVJUX0NSXzNfRU5BQkxFCUJJVCg2KQorI2RlZmluZSBNT1hBUlRfQ1JfM19DTE9DSwlCSVQoNykKKyNkZWZpbmUgTU9YQVJUX0NSXzNfSU5UCUJJVCg4KQorI2RlZmluZSBNT1hBUlRfQ1JfQ09VTlRfVVAJQklUKDkpCiAKLSNkZWZpbmUgVElNRVIxX0VOQUJMRQkJKFRJTUVSRUdfQ1JfMl9FTkFCTEUgfCBUSU1FUkVHX0NSXzFfRU5BQkxFKQotI2RlZmluZSBUSU1FUjFfRElTQUJMRQkJKFRJTUVSRUdfQ1JfMl9FTkFCTEUpCisjZGVmaW5lIE1PWEFSVF9USU1FUjFfRU5BQkxFCShNT1hBUlRfQ1JfMl9FTkFCTEUgfCBNT1hBUlRfQ1JfMV9FTkFCTEUpCisjZGVmaW5lIE1PWEFSVF9USU1FUjFfRElTQUJMRQkoTU9YQVJUX0NSXzJfRU5BQkxFKQogCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpiYXNlOwotc3RhdGljIHVuc2lnbmVkIGludCBjbG9ja19jb3VudF9wZXJfdGljazsKKy8qCisgKiBUaGUgQVNwZWVkIHZhcmlhbnQgb2YgdGhlIElQIGJsb2NrIGhhcyBhIGRpZmZlcmVudCBsYXlvdXQKKyAqIGZvciB0aGUgY29udHJvbCByZWdpc3RlcgorICovCisjZGVmaW5lIEFTUEVFRF9DUl8xX0VOQUJMRQlCSVQoMCkKKyNkZWZpbmUgQVNQRUVEX0NSXzFfQ0xPQ0sJQklUKDEpCisjZGVmaW5lIEFTUEVFRF9DUl8xX0lOVAkJQklUKDIpCisjZGVmaW5lIEFTUEVFRF9DUl8yX0VOQUJMRQlCSVQoNCkKKyNkZWZpbmUgQVNQRUVEX0NSXzJfQ0xPQ0sJQklUKDUpCisjZGVmaW5lIEFTUEVFRF9DUl8yX0lOVAkJQklUKDYpCisjZGVmaW5lIEFTUEVFRF9DUl8zX0VOQUJMRQlCSVQoOCkKKyNkZWZpbmUgQVNQRUVEX0NSXzNfQ0xPQ0sJQklUKDkpCisjZGVmaW5lIEFTUEVFRF9DUl8zX0lOVAkJQklUKDEwKQorCisjZGVmaW5lIEFTUEVFRF9USU1FUjFfRU5BQkxFICAgKEFTUEVFRF9DUl8yX0VOQUJMRSB8IEFTUEVFRF9DUl8xX0VOQUJMRSkKKyNkZWZpbmUgQVNQRUVEX1RJTUVSMV9ESVNBQkxFICAoQVNQRUVEX0NSXzJfRU5BQkxFKQorCitzdHJ1Y3QgbW94YXJ0X3RpbWVyIHsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdW5zaWduZWQgaW50IHQxX2Rpc2FibGVfdmFsOworCXVuc2lnbmVkIGludCB0MV9lbmFibGVfdmFsOworCXVuc2lnbmVkIGludCBjb3VudF9wZXJfdGljazsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIGNsa2V2dDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1veGFydF90aW1lciAqdG9fbW94YXJ0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGV2dCwgc3RydWN0IG1veGFydF90aW1lciwgY2xrZXZ0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1veGFydF9kaXNhYmxlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlzdHJ1Y3QgbW94YXJ0X3RpbWVyICp0aW1lciA9IHRvX21veGFydChldnQpOworCisJd3JpdGVsKHRpbWVyLT50MV9kaXNhYmxlX3ZhbCwgdGltZXItPmJhc2UgKyBUSU1FUl9DUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtb3hhcnRfZW5hYmxlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlzdHJ1Y3QgbW94YXJ0X3RpbWVyICp0aW1lciA9IHRvX21veGFydChldnQpOworCisJd3JpdGVsKHRpbWVyLT50MV9lbmFibGVfdmFsLCB0aW1lci0+YmFzZSArIFRJTUVSX0NSKTsKK30KIAogc3RhdGljIGludCBtb3hhcnRfc2h1dGRvd24oc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQogewotCXdyaXRlbChUSU1FUjFfRElTQUJMRSwgYmFzZSArIFRJTUVSX0NSKTsKKwltb3hhcnRfZGlzYWJsZShldnQpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG1veGFydF9zZXRfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCiB7Ci0Jd3JpdGVsKFRJTUVSMV9ESVNBQkxFLCBiYXNlICsgVElNRVJfQ1IpOwotCXdyaXRlbCh+MCwgYmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX0xPQUQpOworCW1veGFydF9kaXNhYmxlKGV2dCk7CisJd3JpdGVsKH4wLCB0b19tb3hhcnQoZXZ0KS0+YmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX0xPQUQpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG1veGFydF9zZXRfcGVyaW9kaWMoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQogewotCXdyaXRlbChjbG9ja19jb3VudF9wZXJfdGljaywgYmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX0xPQUQpOwotCXdyaXRlbChUSU1FUjFfRU5BQkxFLCBiYXNlICsgVElNRVJfQ1IpOworCXN0cnVjdCBtb3hhcnRfdGltZXIgKnRpbWVyID0gdG9fbW94YXJ0KGV2dCk7CisKKwltb3hhcnRfZGlzYWJsZShldnQpOworCXdyaXRlbCh0aW1lci0+Y291bnRfcGVyX3RpY2ssIHRpbWVyLT5iYXNlICsgVElNRVIxX0JBU0UgKyBSRUdfTE9BRCk7CisJd3JpdGVsKDAsIHRpbWVyLT5iYXNlICsgVElNRVIxX0JBU0UgKyBSRUdfTUFUQ0gxKTsKKwltb3hhcnRfZW5hYmxlKGV2dCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbW94YXJ0X2Nsa2V2dF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgY3ljbGVzLAotCQkJCSAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICp1bnVzZWQpCisJCQkJICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKIHsKKwlzdHJ1Y3QgbW94YXJ0X3RpbWVyICp0aW1lciA9IHRvX21veGFydChldnQpOwogCXUzMiB1OwogCi0Jd3JpdGVsKFRJTUVSMV9ESVNBQkxFLCBiYXNlICsgVElNRVJfQ1IpOworCW1veGFydF9kaXNhYmxlKGV2dCk7CiAKLQl1ID0gcmVhZGwoYmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX0NPVU5UKSAtIGN5Y2xlczsKLQl3cml0ZWwodSwgYmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX01BVENIMSk7CisJdSA9IHJlYWRsKHRpbWVyLT5iYXNlICsgVElNRVIxX0JBU0UgKyBSRUdfQ09VTlQpIC0gY3ljbGVzOworCXdyaXRlbCh1LCB0aW1lci0+YmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX01BVENIMSk7CiAKLQl3cml0ZWwoVElNRVIxX0VOQUJMRSwgYmFzZSArIFRJTUVSX0NSKTsKKwltb3hhcnRfZW5hYmxlKGV2dCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgbW94YXJ0X2Nsb2NrZXZlbnQgPSB7Ci0JLm5hbWUJCQk9ICJtb3hhcnRfdGltZXIiLAotCS5yYXRpbmcJCQk9IDIwMCwKLQkuZmVhdHVyZXMJCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfAotCQkJCSAgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCwKLQkuc2V0X3N0YXRlX3NodXRkb3duCT0gbW94YXJ0X3NodXRkb3duLAotCS5zZXRfc3RhdGVfcGVyaW9kaWMJPSBtb3hhcnRfc2V0X3BlcmlvZGljLAotCS5zZXRfc3RhdGVfb25lc2hvdAk9IG1veGFydF9zZXRfb25lc2hvdCwKLQkudGlja19yZXN1bWUJCT0gbW94YXJ0X3NldF9vbmVzaG90LAotCS5zZXRfbmV4dF9ldmVudAkJPSBtb3hhcnRfY2xrZXZ0X25leHRfZXZlbnQsCi19OwotCiBzdGF0aWMgaXJxcmV0dXJuX3QgbW94YXJ0X3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ID0gZGV2X2lkOwpAQCAtMTEyLDIxICsxNDcsMTkgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG1veGFydF90aW1lcl9pcnEgPSB7Ci0JLm5hbWUJCT0gIm1veGFydC10aW1lciIsCi0JLmZsYWdzCQk9IElSUUZfVElNRVIsCi0JLmhhbmRsZXIJPSBtb3hhcnRfdGltZXJfaW50ZXJydXB0LAotCS5kZXZfaWQJCT0gJm1veGFydF9jbG9ja2V2ZW50LAotfTsKLQogc3RhdGljIGludCBfX2luaXQgbW94YXJ0X3RpbWVyX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQogewogCWludCByZXQsIGlycTsKIAl1bnNpZ25lZCBsb25nIHBjbGs7CiAJc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBtb3hhcnRfdGltZXIgKnRpbWVyOwogCi0JYmFzZSA9IG9mX2lvbWFwKG5vZGUsIDApOwotCWlmICghYmFzZSkgeworCXRpbWVyID0ga3phbGxvYyhzaXplb2YoKnRpbWVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0aW1lcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0aW1lci0+YmFzZSA9IG9mX2lvbWFwKG5vZGUsIDApOworCWlmICghdGltZXItPmJhc2UpIHsKIAkJcHJfZXJyKCIlczogb2ZfaW9tYXAgZmFpbGVkXG4iLCBub2RlLT5mdWxsX25hbWUpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTEzNywxMiArMTcwLDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0ID0gc2V0dXBfaXJxKGlycSwgJm1veGFydF90aW1lcl9pcnEpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogc2V0dXBfaXJxIGZhaWxlZFxuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAljbGsgPSBvZl9jbGtfZ2V0KG5vZGUsIDApOwogCWlmIChJU19FUlIoY2xrKSkgIHsKIAkJcHJfZXJyKCIlczogb2ZfY2xrX2dldCBmYWlsZWRcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CkBAIC0xNTEsNyArMTc4LDMyIEBACiAKIAlwY2xrID0gY2xrX2dldF9yYXRlKGNsayk7CiAKLQlyZXQgPSBjbG9ja3NvdXJjZV9tbWlvX2luaXQoYmFzZSArIFRJTUVSMl9CQVNFICsgUkVHX0NPVU5ULAorCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShub2RlLCAibW94YSxtb3hhcnQtdGltZXIiKSkgeworCQl0aW1lci0+dDFfZW5hYmxlX3ZhbCA9IE1PWEFSVF9USU1FUjFfRU5BQkxFOworCQl0aW1lci0+dDFfZGlzYWJsZV92YWwgPSBNT1hBUlRfVElNRVIxX0RJU0FCTEU7CisJfSBlbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShub2RlLCAiYXNwZWVkLGFzdDI0MDAtdGltZXIiKSkgeworCQl0aW1lci0+dDFfZW5hYmxlX3ZhbCA9IEFTUEVFRF9USU1FUjFfRU5BQkxFOworCQl0aW1lci0+dDFfZGlzYWJsZV92YWwgPSBBU1BFRURfVElNRVIxX0RJU0FCTEU7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogdW5rbm93biBwbGF0Zm9ybVxuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdGltZXItPmNvdW50X3Blcl90aWNrID0gRElWX1JPVU5EX0NMT1NFU1QocGNsaywgSFopOworCisJdGltZXItPmNsa2V2dC5uYW1lID0gbm9kZS0+bmFtZTsKKwl0aW1lci0+Y2xrZXZ0LnJhdGluZyA9IDIwMDsKKwl0aW1lci0+Y2xrZXZ0LmZlYXR1cmVzID0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfAorCQkJCQlDTE9DS19FVlRfRkVBVF9PTkVTSE9UOworCXRpbWVyLT5jbGtldnQuc2V0X3N0YXRlX3NodXRkb3duID0gbW94YXJ0X3NodXRkb3duOworCXRpbWVyLT5jbGtldnQuc2V0X3N0YXRlX3BlcmlvZGljID0gbW94YXJ0X3NldF9wZXJpb2RpYzsKKwl0aW1lci0+Y2xrZXZ0LnNldF9zdGF0ZV9vbmVzaG90ID0gbW94YXJ0X3NldF9vbmVzaG90OworCXRpbWVyLT5jbGtldnQudGlja19yZXN1bWUgPSBtb3hhcnRfc2V0X29uZXNob3Q7CisJdGltZXItPmNsa2V2dC5zZXRfbmV4dF9ldmVudCA9IG1veGFydF9jbGtldnRfbmV4dF9ldmVudDsKKwl0aW1lci0+Y2xrZXZ0LmNwdW1hc2sgPSBjcHVtYXNrX29mKDApOworCXRpbWVyLT5jbGtldnQuaXJxID0gaXJxOworCisJcmV0ID0gY2xvY2tzb3VyY2VfbW1pb19pbml0KHRpbWVyLT5iYXNlICsgVElNRVIyX0JBU0UgKyBSRUdfQ09VTlQsCiAJCQkJICAgICJtb3hhcnRfdGltZXIiLCBwY2xrLCAyMDAsIDMyLAogCQkJCSAgICBjbG9ja3NvdXJjZV9tbWlvX3JlYWRsX2Rvd24pOwogCWlmIChyZXQpIHsKQEAgLTE1OSwxMyArMjExLDI2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JY2xvY2tfY291bnRfcGVyX3RpY2sgPSBESVZfUk9VTkRfQ0xPU0VTVChwY2xrLCBIWik7CisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBtb3hhcnRfdGltZXJfaW50ZXJydXB0LCBJUlFGX1RJTUVSLAorCQkJICBub2RlLT5uYW1lLCAmdGltZXItPmNsa2V2dCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBzZXR1cF9pcnEgZmFpbGVkXG4iLCBub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gcmV0OworCX0KIAotCXdyaXRlbCh+MCwgYmFzZSArIFRJTUVSMl9CQVNFICsgUkVHX0xPQUQpOwotCXdyaXRlbChUSU1FUkVHX0NSXzJfRU5BQkxFLCBiYXNlICsgVElNRVJfQ1IpOworCS8qIENsZWFyIG1hdGNoIHJlZ2lzdGVycyAqLworCXdyaXRlbCgwLCB0aW1lci0+YmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX01BVENIMSk7CisJd3JpdGVsKDAsIHRpbWVyLT5iYXNlICsgVElNRVIxX0JBU0UgKyBSRUdfTUFUQ0gyKTsKKwl3cml0ZWwoMCwgdGltZXItPmJhc2UgKyBUSU1FUjJfQkFTRSArIFJFR19NQVRDSDEpOworCXdyaXRlbCgwLCB0aW1lci0+YmFzZSArIFRJTUVSMl9CQVNFICsgUkVHX01BVENIMik7CiAKLQltb3hhcnRfY2xvY2tldmVudC5jcHVtYXNrID0gY3B1bWFza19vZigwKTsKLQltb3hhcnRfY2xvY2tldmVudC5pcnEgPSBpcnE7CisJLyoKKwkgKiBTdGFydCB0aW1lciAyIHJvbGxpbmcgYXMgb3VyIG1haW4gd2FsbCBjbG9jayBzb3VyY2UsIGtlZXAgdGltZXIgMQorCSAqIGRpc2FibGVkCisJICovCisJd3JpdGVsKDAsIHRpbWVyLT5iYXNlICsgVElNRVJfQ1IpOworCXdyaXRlbCh+MCwgdGltZXItPmJhc2UgKyBUSU1FUjJfQkFTRSArIFJFR19MT0FEKTsKKwl3cml0ZWwodGltZXItPnQxX2Rpc2FibGVfdmFsLCB0aW1lci0+YmFzZSArIFRJTUVSX0NSKTsKIAogCS8qCiAJICogZG9jdW1lbnRhdGlvbiBpcyBub3QgcHVibGljbHkgYXZhaWxhYmxlOgpAQCAtMTczLDkgKzIzOCw5IEBACiAJICogbWF4X2RlbHRhIDB4ZmZmZmZmZmUgc2hvdWxkIGJlIG9rIGJlY2F1c2UgY291bnQKIAkgKiByZWdpc3RlciBzaXplIGlzIHUzMgogCSAqLwotCWNsb2NrZXZlbnRzX2NvbmZpZ19hbmRfcmVnaXN0ZXIoJm1veGFydF9jbG9ja2V2ZW50LCBwY2xrLAotCQkJCQkweDQsIDB4ZmZmZmZmZmUpOworCWNsb2NrZXZlbnRzX2NvbmZpZ19hbmRfcmVnaXN0ZXIoJnRpbWVyLT5jbGtldnQsIHBjbGssIDB4NCwgMHhmZmZmZmZmZSk7CiAKIAlyZXR1cm4gMDsKIH0KIENMT0NLU09VUkNFX09GX0RFQ0xBUkUobW94YXJ0LCAibW94YSxtb3hhcnQtdGltZXIiLCBtb3hhcnRfdGltZXJfaW5pdCk7CitDTE9DS1NPVVJDRV9PRl9ERUNMQVJFKGFzcGVlZCwgImFzcGVlZCxhc3QyNDAwLXRpbWVyIiwgbW94YXJ0X3RpbWVyX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9weGFfdGltZXIuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvcHhhX3RpbWVyLmMKaW5kZXggOTM3ZTEwYi4uM2UxY2I1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9weGFfdGltZXIuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3B4YV90aW1lci5jCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWRfY2xvY2suaD4KIAorI2luY2x1ZGUgPGNsb2Nrc291cmNlL3B4YS5oPgorCiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAKICNkZWZpbmUgT1NNUjAJCTB4MDAJLyogT1MgVGltZXIgMCBNYXRjaCBSZWdpc3RlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9zdW40aV90aW1lci5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9zdW40aV90aW1lci5jCmluZGV4IDk3NjY5ZWUuLmM4MzQ1MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc3VuNGlfdGltZXIuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3N1bjRpX3RpbWVyLmMKQEAgLTEyMywxMiArMTIzLDE2IEBACiAJLnNldF9uZXh0X2V2ZW50ID0gc3VuNGlfY2xrZXZ0X25leHRfZXZlbnQsCiB9OwogCitzdGF0aWMgdm9pZCBzdW40aV90aW1lcl9jbGVhcl9pbnRlcnJ1cHQodm9pZCkKK3sKKwl3cml0ZWwoVElNRVJfSVJRX0VOKDApLCB0aW1lcl9iYXNlICsgVElNRVJfSVJRX1NUX1JFRyk7Cit9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzdW40aV90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9IChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopZGV2X2lkOwogCi0Jd3JpdGVsKDB4MSwgdGltZXJfYmFzZSArIFRJTUVSX0lSUV9TVF9SRUcpOworCXN1bjRpX3RpbWVyX2NsZWFyX2ludGVycnVwdCgpOwogCWV2dC0+ZXZlbnRfaGFuZGxlcihldnQpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMjA4LDYgKzIxMiw5IEBACiAJLyogTWFrZSBzdXJlIHRpbWVyIGlzIHN0b3BwZWQgYmVmb3JlIHBsYXlpbmcgd2l0aCBpbnRlcnJ1cHRzICovCiAJc3VuNGlfY2xrZXZ0X3RpbWVfc3RvcCgwKTsKIAorCS8qIGNsZWFyIHRpbWVyMCBpbnRlcnJ1cHQgKi8KKwlzdW40aV90aW1lcl9jbGVhcl9pbnRlcnJ1cHQoKTsKKwogCXN1bjRpX2Nsb2NrZXZlbnQuY3B1bWFzayA9IGNwdV9wb3NzaWJsZV9tYXNrOwogCXN1bjRpX2Nsb2NrZXZlbnQuaXJxID0gaXJxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWUtYXJtYWRhLTM3MC14cC5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lLWFybWFkYS0zNzAteHAuYwppbmRleCA3MTliNDc4Li4zYzM5ZTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWUtYXJtYWRhLTM3MC14cC5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1hcm1hZGEtMzcwLXhwLmMKQEAgLTMzOCw3ICszMzgsNiBAQAogCXN0cnVjdCBjbGsgKmNsayA9IG9mX2Nsa19nZXRfYnlfbmFtZShucCwgImZpeGVkIik7CiAJaW50IHJldDsKIAotCWNsayA9IG9mX2Nsa19nZXQobnAsIDApOwogCWlmIChJU19FUlIoY2xrKSkgewogCQlwcl9lcnIoIkZhaWxlZCB0byBnZXQgY2xvY2siKTsKIAkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1waXN0YWNoaW8uYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1waXN0YWNoaW8uYwppbmRleCBhN2Q5YTA4Li5hOGU2YzdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWUtcGlzdGFjaGlvLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lLXBpc3RhY2hpby5jCkBAIC0yMDIsMTAgKzIwMiwxMCBAQAogCXJhdGUgPSBjbGtfZ2V0X3JhdGUoZmFzdF9jbGspOwogCiAJLyogRGlzYWJsZSBpcnEncyBmb3IgY2xvY2tzb3VyY2UgdXNhZ2UgKi8KLQlncHRfd3JpdGVsKCZwY3NfZ3B0LmJhc2UsIDAsIFRJTUVSX0lSUV9NQVNLLCAwKTsKLQlncHRfd3JpdGVsKCZwY3NfZ3B0LmJhc2UsIDAsIFRJTUVSX0lSUV9NQVNLLCAxKTsKLQlncHRfd3JpdGVsKCZwY3NfZ3B0LmJhc2UsIDAsIFRJTUVSX0lSUV9NQVNLLCAyKTsKLQlncHRfd3JpdGVsKCZwY3NfZ3B0LmJhc2UsIDAsIFRJTUVSX0lSUV9NQVNLLCAzKTsKKwlncHRfd3JpdGVsKHBjc19ncHQuYmFzZSwgMCwgVElNRVJfSVJRX01BU0ssIDApOworCWdwdF93cml0ZWwocGNzX2dwdC5iYXNlLCAwLCBUSU1FUl9JUlFfTUFTSywgMSk7CisJZ3B0X3dyaXRlbChwY3NfZ3B0LmJhc2UsIDAsIFRJTUVSX0lSUV9NQVNLLCAyKTsKKwlncHRfd3JpdGVsKHBjc19ncHQuYmFzZSwgMCwgVElNRVJfSVJRX01BU0ssIDMpOwogCiAJLyogRW5hYmxlIHRpbWVyIGJsb2NrICovCiAJd3JpdGVsKFRJTUVSX01FX0dMT0JBTCwgcGNzX2dwdC5iYXNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItYXRtZWwtcGl0LmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLWF0bWVsLXBpdC5jCmluZGV4IDFmZmFjMGMuLjY1NTU4MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItYXRtZWwtcGl0LmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lci1hdG1lbC1waXQuYwpAQCAtMTQ5LDI0ICsxNDksMTMgQEAKIHsKIAlzdHJ1Y3QgcGl0X2RhdGEgKmRhdGEgPSBkZXZfaWQ7CiAKLQkvKgotCSAqIGlycXMgc2hvdWxkIGJlIGRpc2FibGVkIGhlcmUsIGJ1dCBhcyB0aGUgaXJxIGlzIHNoYXJlZCB0aGV5IGFyZSBvbmx5Ci0JICogZ3VhcmFudGVlZCB0byBiZSBvZmYgaWYgdGhlIHRpbWVyIGlycSBpcyByZWdpc3RlcmVkIGZpcnN0LgotCSAqLwotCVdBUk5fT05fT05DRSghaXJxc19kaXNhYmxlZCgpKTsKLQogCS8qIFRoZSBQSVQgaW50ZXJydXB0IG1heSBiZSBkaXNhYmxlZCwgYW5kIGlzIHNoYXJlZCAqLwogCWlmIChjbG9ja2V2ZW50X3N0YXRlX3BlcmlvZGljKCZkYXRhLT5jbGtldnQpICYmCiAJICAgIChwaXRfcmVhZChkYXRhLT5iYXNlLCBBVDkxX1BJVF9TUikgJiBBVDkxX1BJVF9QSVRTKSkgewotCQl1bnNpZ25lZCBucl90aWNrczsKLQogCQkvKiBHZXQgbnVtYmVyIG9mIHRpY2tzIHBlcmZvcm1lZCBiZWZvcmUgaXJxLCBhbmQgYWNrIGl0ICovCi0JCW5yX3RpY2tzID0gUElUX1BJQ05UKHBpdF9yZWFkKGRhdGEtPmJhc2UsIEFUOTFfUElUX1BJVlIpKTsKLQkJZG8gewotCQkJZGF0YS0+Y250ICs9IGRhdGEtPmN5Y2xlOwotCQkJZGF0YS0+Y2xrZXZ0LmV2ZW50X2hhbmRsZXIoJmRhdGEtPmNsa2V2dCk7Ci0JCQlucl90aWNrcy0tOwotCQl9IHdoaWxlIChucl90aWNrcyk7CisJCWRhdGEtPmNudCArPSBkYXRhLT5jeWNsZSAqIFBJVF9QSUNOVChwaXRfcmVhZChkYXRhLT5iYXNlLAorCQkJCQkJCSAgICAgIEFUOTFfUElUX1BJVlIpKTsKKwkJZGF0YS0+Y2xrZXZ0LmV2ZW50X2hhbmRsZXIoJmRhdGEtPmNsa2V2dCk7CiAKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KQEAgLTE3NywxMSArMTY2LDQxIEBACiAvKgogICogU2V0IHVwIGJvdGggY2xvY2tzb3VyY2UgYW5kIGNsb2NrZXZlbnQgc3VwcG9ydC4KICAqLwotc3RhdGljIGludCBfX2luaXQgYXQ5MXNhbTkyNnhfcGl0X2NvbW1vbl9pbml0KHN0cnVjdCBwaXRfZGF0YSAqZGF0YSkKK3N0YXRpYyBpbnQgX19pbml0IGF0OTFzYW05MjZ4X3BpdF9kdF9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKLQl1bnNpZ25lZCBsb25nCXBpdF9yYXRlOwotCXVuc2lnbmVkCWJpdHM7Ci0JaW50CQlyZXQ7CisJdW5zaWduZWQgbG9uZyAgIHBpdF9yYXRlOworCXVuc2lnbmVkICAgICAgICBiaXRzOworCWludCAgICAgICAgICAgICByZXQ7CisJc3RydWN0IHBpdF9kYXRhICpkYXRhOworCisJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGEtPmJhc2UgPSBvZl9pb21hcChub2RlLCAwKTsKKwlpZiAoIWRhdGEtPmJhc2UpIHsKKwkJcHJfZXJyKCJDb3VsZCBub3QgbWFwIFBJVCBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlkYXRhLT5tY2sgPSBvZl9jbGtfZ2V0KG5vZGUsIDApOworCWlmIChJU19FUlIoZGF0YS0+bWNrKSkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBnZXQgbWNrIGNsa1xuIik7CisJCXJldHVybiBQVFJfRVJSKGRhdGEtPm1jayk7CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRhdGEtPm1jayk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBlbmFibGUgbWNrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBHZXQgdGhlIGludGVycnVwdHMgcHJvcGVydHkgKi8KKwlkYXRhLT5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChub2RlLCAwKTsKKwlpZiAoIWRhdGEtPmlycSkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBnZXQgSVJRIGZyb20gRFRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAkvKgogCSAqIFVzZSBvdXIgYWN0dWFsIE1DSyB0byBmaWd1cmUgb3V0IGhvdyBtYW55IE1DSy8xNiB0aWNrcyBwZXIKQEAgLTIzNiwzOSArMjU1LDUgQEAKIAogCXJldHVybiAwOwogfQotCi1zdGF0aWMgaW50IF9faW5pdCBhdDkxc2FtOTI2eF9waXRfZHRfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCi17Ci0Jc3RydWN0IHBpdF9kYXRhICpkYXRhOwotCi0JZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkYXRhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRhdGEtPmJhc2UgPSBvZl9pb21hcChub2RlLCAwKTsKLQlpZiAoIWRhdGEtPmJhc2UpIHsKLQkJcHJfZXJyKCJDb3VsZCBub3QgbWFwIFBJVCBhZGRyZXNzXG4iKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQlkYXRhLT5tY2sgPSBvZl9jbGtfZ2V0KG5vZGUsIDApOwotCWlmIChJU19FUlIoZGF0YS0+bWNrKSkKLQkJLyogRmFsbGJhY2sgb24gY2xrZGV2IGZvciAhQ0NGLWJhc2VkIGJvYXJkcyAqLwotCQlkYXRhLT5tY2sgPSBjbGtfZ2V0KE5VTEwsICJtY2siKTsKLQotCWlmIChJU19FUlIoZGF0YS0+bWNrKSkgewotCQlwcl9lcnIoIlVuYWJsZSB0byBnZXQgbWNrIGNsa1xuIik7Ci0JCXJldHVybiBQVFJfRVJSKGRhdGEtPm1jayk7Ci0JfQotCi0JLyogR2V0IHRoZSBpbnRlcnJ1cHRzIHByb3BlcnR5ICovCi0JZGF0YS0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobm9kZSwgMCk7Ci0JaWYgKCFkYXRhLT5pcnEpIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gZ2V0IElSUSBmcm9tIERUXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIGF0OTFzYW05MjZ4X3BpdF9jb21tb25faW5pdChkYXRhKTsKLX0KIENMT0NLU09VUkNFX09GX0RFQ0xBUkUoYXQ5MXNhbTkyNnhfcGl0LCAiYXRtZWwsYXQ5MXNhbTkyNjAtcGl0IiwKIAkJICAgICAgIGF0OTFzYW05MjZ4X3BpdF9kdF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItb3huYXMtcnBzLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLW94bmFzLXJwcy5jCmluZGV4IGJkODg3ZTIuLmQ2MzBiZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItb3huYXMtcnBzLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lci1veG5hcy1ycHMuYwpAQCAtMjk1LDMgKzI5NSw1IEBACiAKIENMT0NLU09VUkNFX09GX0RFQ0xBUkUob3g4MTBzZV9ycHMsCiAJCSAgICAgICAib3hzZW1pLG94ODEwc2UtcnBzLXRpbWVyIiwgb3huYXNfcnBzX3RpbWVyX2luaXQpOworQ0xPQ0tTT1VSQ0VfT0ZfREVDTEFSRShveDgyMF9ycHMsCisJCSAgICAgICAib3hzZW1pLG94ODIwc2UtcnBzLXRpbWVyIiwgb3huYXNfcnBzX3RpbWVyX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lci10aS0zMmsuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItdGktMzJrLmMKaW5kZXggOTJiN2UzOS4uY2Y1YjE0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lci10aS0zMmsuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLXRpLTMyay5jCkBAIC02NSw3ICs2NSw3IEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZihjcywgc3RydWN0IHRpXzMyaywgY3MpOwogfQogCi1zdGF0aWMgY3ljbGVfdCB0aV8zMmtfcmVhZF9jeWNsZXMoc3RydWN0IGNsb2Nrc291cmNlICpjcykKK3N0YXRpYyBjeWNsZV90IG5vdHJhY2UgdGlfMzJrX3JlYWRfY3ljbGVzKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCiB7CiAJc3RydWN0IHRpXzMyayAqdGkgPSB0b190aV8zMmsoY3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCmluZGV4IDc0OTE5YWEuLmQ4YjE2NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCkBAIC0xOTQsNyArMTk0LDcgQEAKIAkgIElmIGluIGRvdWJ0LCBzYXkgTi4KIAogY29uZmlnIENQVV9GUkVRX0dPVl9TQ0hFRFVUSUwKLQl0cmlzdGF0ZSAiJ3NjaGVkdXRpbCcgY3B1ZnJlcSBwb2xpY3kgZ292ZXJub3IiCisJYm9vbCAiJ3NjaGVkdXRpbCcgY3B1ZnJlcSBwb2xpY3kgZ292ZXJub3IiCiAJZGVwZW5kcyBvbiBDUFVfRlJFUSAmJiBTTVAKIAlzZWxlY3QgQ1BVX0ZSRVFfR09WX0FUVFJfU0VUCiAJc2VsZWN0IElSUV9XT1JLCkBAIC0yMDgsOSArMjA4LDYgQEAKIAkgIGZyZXF1ZW5jeSB0aXBwaW5nIHBvaW50IGlzIGF0IHV0aWxpemF0aW9uL2NhcGFjaXR5IGVxdWFsIHRvIDgwJSBpbgogCSAgYm90aCBjYXNlcy4KIAotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgY3B1ZnJlcV9zY2hlZHV0aWwuCi0KIAkgIElmIGluIGRvdWJ0LCBzYXkgTi4KIAogY29tbWVudCAiQ1BVIGZyZXF1ZW5jeSBzY2FsaW5nIGRyaXZlcnMiCkBAIC0yMjUsNyArMjIyLDcgQEAKIAloZWxwCiAJICBUaGlzIGFkZHMgYSBnZW5lcmljIERUIGJhc2VkIGNwdWZyZXEgZHJpdmVyIGZvciBmcmVxdWVuY3kgbWFuYWdlbWVudC4KIAkgIEl0IHN1cHBvcnRzIGJvdGggdW5pcHJvY2Vzc29yIChVUCkgYW5kIHN5bW1ldHJpYyBtdWx0aXByb2Nlc3NvciAoU01QKQotCSAgc3lzdGVtcyB3aGljaCBzaGFyZSBjbG9jayBhbmQgdm9sdGFnZSBhY3Jvc3MgYWxsIENQVXMuCisJICBzeXN0ZW1zLgogCiAJICBJZiBpbiBkb3VidCwgc2F5IE4uCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHBjX2NwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHBjX2NwdWZyZXEuYwppbmRleCA4ODgyYjhlLi4xYjJmMjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3BwY19jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwcGNfY3B1ZnJlcS5jCkBAIC0xOSwxMCArMTksMTkgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKICNpbmNsdWRlIDxhY3BpL2NwcGNfYWNwaS5oPgogCisvKiBNaW5pbXVtIHN0cnVjdCBsZW5ndGggbmVlZGVkIGZvciB0aGUgRE1JIHByb2Nlc3NvciBlbnRyeSB3ZSB3YW50ICovCisjZGVmaW5lIERNSV9FTlRSWV9QUk9DRVNTT1JfTUlOX0xFTkdUSAk0OAorCisvKiBPZmZlc3QgaW4gdGhlIERNSSBwcm9jZXNzb3Igc3RydWN0dXJlIGZvciB0aGUgbWF4IGZyZXF1ZW5jeSAqLworI2RlZmluZSBETUlfUFJPQ0VTU09SX01BWF9TUEVFRCAgMHgxNAorCiAvKgogICogVGhlc2Ugc3RydWN0cyBjb250YWluIGluZm9ybWF0aW9uIHBhcnNlZCBmcm9tIHBlciBDUFUKICAqIEFDUEkgX0NQQyBzdHJ1Y3R1cmVzLgpAQCAtMzAsMTkgKzM5LDUyIEBACiAgKiBwZXJmb3JtYW5jZSBjYXBhYmlsaXRpZXMsIGRlc2lyZWQgcGVyZm9ybWFuY2UgbGV2ZWwKICAqIHJlcXVlc3RlZCBldGMuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY3B1ZGF0YSAqKmFsbF9jcHVfZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgY3BwY19jcHVkYXRhICoqYWxsX2NwdV9kYXRhOworCisvKiBDYXB0dXJlIHRoZSBtYXggS0h6IGZyb20gRE1JICovCitzdGF0aWMgdTY0IGNwcGNfZG1pX21heF9raHo7CisKKy8qIENhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgdG8gcmV0cmlldmUgdGhlIG1heCBmcmVxdWVuY3kgZnJvbSBETUkgKi8KK3N0YXRpYyB2b2lkIGNwcGNfZmluZF9kbWlfbWh6KGNvbnN0IHN0cnVjdCBkbWlfaGVhZGVyICpkbSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCB1OCAqZG1pX2RhdGEgPSAoY29uc3QgdTggKilkbTsKKwl1MTYgKm1oeiA9ICh1MTYgKilwcml2YXRlOworCisJaWYgKGRtLT50eXBlID09IERNSV9FTlRSWV9QUk9DRVNTT1IgJiYKKwkgICAgZG0tPmxlbmd0aCA+PSBETUlfRU5UUllfUFJPQ0VTU09SX01JTl9MRU5HVEgpIHsKKwkJdTE2IHZhbCA9ICh1MTYpZ2V0X3VuYWxpZ25lZCgoY29uc3QgdTE2ICopCisJCQkJKGRtaV9kYXRhICsgRE1JX1BST0NFU1NPUl9NQVhfU1BFRUQpKTsKKwkJKm1oeiA9IHZhbCA+ICptaHogPyB2YWwgOiAqbWh6OworCX0KK30KKworLyogTG9vayB1cCB0aGUgbWF4IGZyZXF1ZW5jeSBpbiBETUkgKi8KK3N0YXRpYyB1NjQgY3BwY19nZXRfZG1pX21heF9raHoodm9pZCkKK3sKKwl1MTYgbWh6ID0gMDsKKworCWRtaV93YWxrKGNwcGNfZmluZF9kbWlfbWh6LCAmbWh6KTsKKworCS8qCisJICogUmVhbCBzdHVwaWQgZmFsbGJhY2sgdmFsdWUsIGp1c3QgaW4gY2FzZSB0aGVyZSBpcyBubworCSAqIGFjdHVhbCB2YWx1ZSBzZXQuCisJICovCisJbWh6ID0gbWh6ID8gbWh6IDogMTsKKworCXJldHVybiAoMTAwMCAqIG1oeik7Cit9CiAKIHN0YXRpYyBpbnQgY3BwY19jcHVmcmVxX3NldF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCiAJCXVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKIAkJdW5zaWduZWQgaW50IHJlbGF0aW9uKQogewotCXN0cnVjdCBjcHVkYXRhICpjcHU7CisJc3RydWN0IGNwcGNfY3B1ZGF0YSAqY3B1OwogCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOwogCWludCByZXQgPSAwOwogCiAJY3B1ID0gYWxsX2NwdV9kYXRhW3BvbGljeS0+Y3B1XTsKIAotCWNwdS0+cGVyZl9jdHJscy5kZXNpcmVkX3BlcmYgPSB0YXJnZXRfZnJlcTsKKwljcHUtPnBlcmZfY3RybHMuZGVzaXJlZF9wZXJmID0gKHU2NCl0YXJnZXRfZnJlcSAqIHBvbGljeS0+bWF4IC8gY3BwY19kbWlfbWF4X2toejsKIAlmcmVxcy5vbGQgPSBwb2xpY3ktPmN1cjsKIAlmcmVxcy5uZXcgPSB0YXJnZXRfZnJlcTsKIApAQCAtNjYsNyArMTA4LDcgQEAKIHN0YXRpYyB2b2lkIGNwcGNfY3B1ZnJlcV9zdG9wX2NwdShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKIAlpbnQgY3B1X251bSA9IHBvbGljeS0+Y3B1OwotCXN0cnVjdCBjcHVkYXRhICpjcHUgPSBhbGxfY3B1X2RhdGFbY3B1X251bV07CisJc3RydWN0IGNwcGNfY3B1ZGF0YSAqY3B1ID0gYWxsX2NwdV9kYXRhW2NwdV9udW1dOwogCWludCByZXQ7CiAKIAljcHUtPnBlcmZfY3RybHMuZGVzaXJlZF9wZXJmID0gY3B1LT5wZXJmX2NhcHMubG93ZXN0X3BlcmY7CkBAIC03OSw3ICsxMjEsNyBAQAogCiBzdGF0aWMgaW50IGNwcGNfY3B1ZnJlcV9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKLQlzdHJ1Y3QgY3B1ZGF0YSAqY3B1OworCXN0cnVjdCBjcHBjX2NwdWRhdGEgKmNwdTsKIAl1bnNpZ25lZCBpbnQgY3B1X251bSA9IHBvbGljeS0+Y3B1OwogCWludCByZXQgPSAwOwogCkBAIC05NCwxMCArMTM2LDEzIEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JcG9saWN5LT5taW4gPSBjcHUtPnBlcmZfY2Fwcy5sb3dlc3RfcGVyZjsKLQlwb2xpY3ktPm1heCA9IGNwdS0+cGVyZl9jYXBzLmhpZ2hlc3RfcGVyZjsKKwljcHBjX2RtaV9tYXhfa2h6ID0gY3BwY19nZXRfZG1pX21heF9raHooKTsKKworCXBvbGljeS0+bWluID0gY3B1LT5wZXJmX2NhcHMubG93ZXN0X3BlcmYgKiBjcHBjX2RtaV9tYXhfa2h6IC8gY3B1LT5wZXJmX2NhcHMuaGlnaGVzdF9wZXJmOworCXBvbGljeS0+bWF4ID0gY3BwY19kbWlfbWF4X2toejsKIAlwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXEgPSBwb2xpY3ktPm1pbjsKIAlwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEgPSBwb2xpY3ktPm1heDsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gY3BwY19nZXRfdHJhbnNpdGlvbl9sYXRlbmN5KGNwdV9udW0pOwogCXBvbGljeS0+c2hhcmVkX3R5cGUgPSBjcHUtPnNoYXJlZF90eXBlOwogCiAJaWYgKHBvbGljeS0+c2hhcmVkX3R5cGUgPT0gQ1BVRlJFUV9TSEFSRURfVFlQRV9BTlkpCkBAIC0xMTIsNyArMTU3LDggQEAKIAljcHUtPmN1cl9wb2xpY3kgPSBwb2xpY3k7CiAKIAkvKiBTZXQgcG9saWN5LT5jdXIgdG8gbWF4IG5vdy4gVGhlIGdvdmVybm9ycyB3aWxsIGFkanVzdCBsYXRlci4gKi8KLQlwb2xpY3ktPmN1ciA9IGNwdS0+cGVyZl9jdHJscy5kZXNpcmVkX3BlcmYgPSBjcHUtPnBlcmZfY2Fwcy5oaWdoZXN0X3BlcmY7CisJcG9saWN5LT5jdXIgPSBjcHBjX2RtaV9tYXhfa2h6OworCWNwdS0+cGVyZl9jdHJscy5kZXNpcmVkX3BlcmYgPSBjcHUtPnBlcmZfY2Fwcy5oaWdoZXN0X3BlcmY7CiAKIAlyZXQgPSBjcHBjX3NldF9wZXJmKGNwdV9udW0sICZjcHUtPnBlcmZfY3RybHMpOwogCWlmIChyZXQpCkBAIC0xMzQsNyArMTgwLDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGNwcGNfY3B1ZnJlcV9pbml0KHZvaWQpCiB7CiAJaW50IGksIHJldCA9IDA7Ci0Jc3RydWN0IGNwdWRhdGEgKmNwdTsKKwlzdHJ1Y3QgY3BwY19jcHVkYXRhICpjcHU7CiAKIAlpZiAoYWNwaV9kaXNhYmxlZCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xNDQsNyArMTkwLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQlhbGxfY3B1X2RhdGFbaV0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3B1ZGF0YSksIEdGUF9LRVJORUwpOworCQlhbGxfY3B1X2RhdGFbaV0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3BwY19jcHVkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghYWxsX2NwdV9kYXRhW2ldKQogCQkJZ290byBvdXQ7CiAKQEAgLTE3NSw3ICsyMjEsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY3BwY19jcHVmcmVxX2V4aXQodm9pZCkKIHsKLQlzdHJ1Y3QgY3B1ZGF0YSAqY3B1OworCXN0cnVjdCBjcHBjX2NwdWRhdGEgKmNwdTsKIAlpbnQgaTsKIAogCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmNwcGNfY3B1ZnJlcV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEtZHQtcGxhdGRldi5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEtZHQtcGxhdGRldi5jCmluZGV4IDBiYjQ0ZDUuLjcxMjY3NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLWR0LXBsYXRkZXYuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS1kdC1wbGF0ZGV2LmMKQEAgLTExLDYgKzExLDggQEAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCisjaW5jbHVkZSAiY3B1ZnJlcS1kdC5oIgorCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtYWNoaW5lc1tdIF9faW5pdGNvbnN0ID0gewogCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMCIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNWktYTEwcyIsIH0sCkBAIC00MCw2ICs0Miw3IEBACiAJeyAuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczUyNTAiLCB9LAogI2lmbmRlZiBDT05GSUdfQkxfU1dJVENIRVIKIAl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTQyMCIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczU0MzMiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1ODAwIiwgfSwKICNlbmRpZgogCkBAIC01MSw2ICs1NCw3IEBACiAJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHI4YTc3NzkiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxyOGE3NzkwIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscjhhNzc5MSIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHI4YTc3OTIiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxyOGE3NzkzIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscjhhNzc5NCIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHNoNzNhMCIsIH0sCkBAIC02OCwxMiArNzIsMTYgQEAKIAogCXsgLmNvbXBhdGlibGUgPSAic2lnbWEsdGFuZ280IiB9LAogCisJeyAuY29tcGF0aWJsZSA9ICJ0aSxhbTMzeHgiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksZHJhNyIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJ0aSxvbWFwMiIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJ0aSxvbWFwMyIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJ0aSxvbWFwNCIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJ0aSxvbWFwNSIsIH0sCiAKIAl7IC5jb21wYXRpYmxlID0gInhsbngsenlucS03MDAwIiwgfSwKKworCXsgfQogfTsKIAogc3RhdGljIGludCBfX2luaXQgY3B1ZnJlcV9kdF9wbGF0ZGV2X2luaXQodm9pZCkKQEAgLTg5LDcgKzk3LDggQEAKIAlpZiAoIW1hdGNoKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldHVybiBQVFJfRVJSX09SX1pFUk8ocGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiY3B1ZnJlcS1kdCIsIC0xLAotCQkJCQkJCSAgICAgICBOVUxMLCAwKSk7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZGF0YShOVUxMLCAiY3B1ZnJlcS1kdCIsCisJCQkgICAgICAgLTEsIG1hdGNoLT5kYXRhLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9kdF9wbGF0Zm9ybV9kYXRhKSkpOwogfQogZGV2aWNlX2luaXRjYWxsKGNwdWZyZXFfZHRfcGxhdGRldl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLWR0LmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS1kdC5jCmluZGV4IDM5NTdkZTguLjVjMDdhZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLWR0LmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEtZHQuYwpAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90aGVybWFsLmg+CiAKKyNpbmNsdWRlICJjcHVmcmVxLWR0LmgiCisKIHN0cnVjdCBwcml2YXRlX2RhdGEgewogCXN0cnVjdCBkZXZpY2UgKmNwdV9kZXY7CiAJc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXY7CkBAIC0zNTMsNiArMzU1LDcgQEAKIAogc3RhdGljIGludCBkdF9jcHVmcmVxX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJc3RydWN0IGNwdWZyZXFfZHRfcGxhdGZvcm1fZGF0YSAqZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CiAJaW50IHJldDsKIAogCS8qCkBAIC0zNjYsNyArMzY5LDggQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JZHRfY3B1ZnJlcV9kcml2ZXIuZHJpdmVyX2RhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCWlmIChkYXRhICYmIGRhdGEtPmhhdmVfZ292ZXJub3JfcGVyX3BvbGljeSkKKwkJZHRfY3B1ZnJlcV9kcml2ZXIuZmxhZ3MgfD0gQ1BVRlJFUV9IQVZFX0dPVkVSTk9SX1BFUl9QT0xJQ1k7CiAKIAlyZXQgPSBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmZHRfY3B1ZnJlcV9kcml2ZXIpOwogCWlmIChyZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS1kdC5oIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEtZHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGQ3NzRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEtZHQuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IExpbmFybworICogVmlyZXNoIEt1bWFyIDx2aXJlc2gua3VtYXJAbGluYXJvLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19DUFVGUkVRX0RUX0hfXworI2RlZmluZSBfX0NQVUZSRVFfRFRfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgY3B1ZnJlcV9kdF9wbGF0Zm9ybV9kYXRhIHsKKwlib29sIGhhdmVfZ292ZXJub3JfcGVyX3BvbGljeTsKK307CisKKyNlbmRpZiAvKiBfX0NQVUZSRVFfRFRfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwppbmRleCAzZGQ0ODg0Li42ZTZjMWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKQEAgLTkxNiw1OCArOTE2LDE4IEBACiAJLnJlbGVhc2UJPSBjcHVmcmVxX3N5c2ZzX3JlbGVhc2UsCiB9OwogCi1zdGF0aWMgaW50IGFkZF9jcHVfZGV2X3N5bWxpbmsoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGludCBjcHUpCitzdGF0aWMgaW50IGFkZF9jcHVfZGV2X3N5bWxpbmsoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkgICAgICAgc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBkZXZpY2UgKmNwdV9kZXY7Ci0KLQlwcl9kZWJ1ZygiJXM6IEFkZGluZyBzeW1saW5rIGZvciBDUFU6ICV1XG4iLCBfX2Z1bmNfXywgY3B1KTsKLQotCWlmICghcG9saWN5KQotCQlyZXR1cm4gMDsKLQotCWNwdV9kZXYgPSBnZXRfY3B1X2RldmljZShjcHUpOwotCWlmIChXQVJOX09OKCFjcHVfZGV2KSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gc3lzZnNfY3JlYXRlX2xpbmsoJmNwdV9kZXYtPmtvYmosICZwb2xpY3ktPmtvYmosICJjcHVmcmVxIik7CisJZGV2X2RiZyhkZXYsICIlczogQWRkaW5nIHN5bWxpbmtcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwgJnBvbGljeS0+a29iaiwgImNwdWZyZXEiKTsKIH0KIAotc3RhdGljIHZvaWQgcmVtb3ZlX2NwdV9kZXZfc3ltbGluayhzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgaW50IGNwdSkKK3N0YXRpYyB2b2lkIHJlbW92ZV9jcHVfZGV2X3N5bWxpbmsoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkJICAgc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBkZXZpY2UgKmNwdV9kZXY7Ci0KLQlwcl9kZWJ1ZygiJXM6IFJlbW92aW5nIHN5bWxpbmsgZm9yIENQVTogJXVcbiIsIF9fZnVuY19fLCBjcHUpOwotCi0JY3B1X2RldiA9IGdldF9jcHVfZGV2aWNlKGNwdSk7Ci0JaWYgKFdBUk5fT04oIWNwdV9kZXYpKQotCQlyZXR1cm47Ci0KLQlzeXNmc19yZW1vdmVfbGluaygmY3B1X2Rldi0+a29iaiwgImNwdWZyZXEiKTsKLX0KLQotLyogQWRkL3JlbW92ZSBzeW1saW5rcyBmb3IgYWxsIHJlbGF0ZWQgQ1BVcyAqLwotc3RhdGljIGludCBjcHVmcmVxX2FkZF9kZXZfc3ltbGluayhzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKLXsKLQl1bnNpZ25lZCBpbnQgajsKLQlpbnQgcmV0ID0gMDsKLQotCS8qIFNvbWUgcmVsYXRlZCBDUFVzIG1pZ2h0IG5vdCBiZSBwcmVzZW50IChwaHlzaWNhbGx5IGhvdHBsdWdnZWQpICovCi0JZm9yX2VhY2hfY3B1KGosIHBvbGljeS0+cmVhbF9jcHVzKSB7Ci0JCXJldCA9IGFkZF9jcHVfZGV2X3N5bWxpbmsocG9saWN5LCBqKTsKLQkJaWYgKHJldCkKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGNwdWZyZXFfcmVtb3ZlX2Rldl9zeW1saW5rKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQotewotCXVuc2lnbmVkIGludCBqOwotCi0JLyogU29tZSByZWxhdGVkIENQVXMgbWlnaHQgbm90IGJlIHByZXNlbnQgKHBoeXNpY2FsbHkgaG90cGx1Z2dlZCkgKi8KLQlmb3JfZWFjaF9jcHUoaiwgcG9saWN5LT5yZWFsX2NwdXMpCi0JCXJlbW92ZV9jcHVfZGV2X3N5bWxpbmsocG9saWN5LCBqKTsKKwlkZXZfZGJnKGRldiwgIiVzOiBSZW1vdmluZyBzeW1saW5rXG4iLCBfX2Z1bmNfXyk7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImNwdWZyZXEiKTsKIH0KIAogc3RhdGljIGludCBjcHVmcmVxX2FkZF9kZXZfaW50ZXJmYWNlKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQpAQCAtOTk5LDcgKzk1OSw3IEBACiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldHVybiBjcHVmcmVxX2FkZF9kZXZfc3ltbGluayhwb2xpY3kpOworCXJldHVybiAwOwogfQogCiBfX3dlYWsgc3RydWN0IGNwdWZyZXFfZ292ZXJub3IgKmNwdWZyZXFfZGVmYXVsdF9nb3Zlcm5vcih2b2lkKQpAQCAtMTA3MywxMyArMTAzMyw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKmNwdWZyZXFfcG9saWN5X2FsbG9jKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gZ2V0X2NwdV9kZXZpY2UoY3B1KTsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeTsKIAlpbnQgcmV0OwogCi0JaWYgKFdBUk5fT04oIWRldikpCi0JCXJldHVybiBOVUxMOwotCiAJcG9saWN5ID0ga3phbGxvYyhzaXplb2YoKnBvbGljeSksIEdGUF9LRVJORUwpOwogCWlmICghcG9saWN5KQogCQlyZXR1cm4gTlVMTDsKQEAgLTExMzMsNyArMTA4OSw2IEBACiAKIAlkb3duX3dyaXRlKCZwb2xpY3ktPnJ3c2VtKTsKIAljcHVmcmVxX3N0YXRzX2ZyZWVfdGFibGUocG9saWN5KTsKLQljcHVmcmVxX3JlbW92ZV9kZXZfc3ltbGluayhwb2xpY3kpOwogCWtvYmogPSAmcG9saWN5LT5rb2JqOwogCWNtcCA9ICZwb2xpY3ktPmtvYmpfdW5yZWdpc3RlcjsKIAl1cF93cml0ZSgmcG9saWN5LT5yd3NlbSk7CkBAIC0xMjE1LDggKzExNzAsOCBAQAogCWlmIChuZXdfcG9saWN5KSB7CiAJCS8qIHJlbGF0ZWRfY3B1cyBzaG91bGQgYXQgbGVhc3QgaW5jbHVkZSBwb2xpY3ktPmNwdXMuICovCiAJCWNwdW1hc2tfY29weShwb2xpY3ktPnJlbGF0ZWRfY3B1cywgcG9saWN5LT5jcHVzKTsKLQkJLyogUmVtZW1iZXIgQ1BVcyBwcmVzZW50IGF0IHRoZSBwb2xpY3kgY3JlYXRpb24gdGltZS4gKi8KLQkJY3B1bWFza19hbmQocG9saWN5LT5yZWFsX2NwdXMsIHBvbGljeS0+Y3B1cywgY3B1X3ByZXNlbnRfbWFzayk7CisJCS8qIENsZWFyIG1hc2sgb2YgcmVnaXN0ZXJlZCBDUFVzICovCisJCWNwdW1hc2tfY2xlYXIocG9saWN5LT5yZWFsX2NwdXMpOwogCX0KIAogCS8qCkBAIC0xMzMxLDYgKzEyODYsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgY3B1ZnJlcV9vZmZsaW5lKHVuc2lnbmVkIGludCBjcHUpOworCiAvKioKICAqIGNwdWZyZXFfYWRkX2RldiAtIHRoZSBjcHVmcmVxIGludGVyZmFjZSBmb3IgYSBDUFUgZGV2aWNlLgogICogQGRldjogQ1BVIGRldmljZS4KQEAgLTEzNDAsMjUgKzEyOTcsMzEgQEAKIHsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeTsKIAl1bnNpZ25lZCBjcHUgPSBkZXYtPmlkOworCWludCByZXQ7CiAKIAlkZXZfZGJnKGRldiwgIiVzOiBhZGRpbmcgQ1BVJXVcbiIsIF9fZnVuY19fLCBjcHUpOwogCi0JaWYgKGNwdV9vbmxpbmUoY3B1KSkKLQkJcmV0dXJuIGNwdWZyZXFfb25saW5lKGNwdSk7CisJaWYgKGNwdV9vbmxpbmUoY3B1KSkgeworCQlyZXQgPSBjcHVmcmVxX29ubGluZShjcHUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CiAKLQkvKgotCSAqIEEgaG90cGx1ZyBub3RpZmllciB3aWxsIGZvbGxvdyBhbmQgd2Ugd2lsbCBoYW5kbGUgaXQgYXMgQ1BVIG9ubGluZQotCSAqIHRoZW4uICBGb3Igbm93LCBqdXN0IGNyZWF0ZSB0aGUgc3lzZnMgbGluaywgdW5sZXNzIHRoZXJlIGlzIG5vIHBvbGljeQotCSAqIG9yIHRoZSBsaW5rIGlzIGFscmVhZHkgcHJlc2VudC4KLQkgKi8KKwkvKiBDcmVhdGUgc3lzZnMgbGluayBvbiBDUFUgcmVnaXN0cmF0aW9uICovCiAJcG9saWN5ID0gcGVyX2NwdShjcHVmcmVxX2NwdV9kYXRhLCBjcHUpOwogCWlmICghcG9saWN5IHx8IGNwdW1hc2tfdGVzdF9hbmRfc2V0X2NwdShjcHUsIHBvbGljeS0+cmVhbF9jcHVzKSkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gYWRkX2NwdV9kZXZfc3ltbGluayhwb2xpY3ksIGNwdSk7CisJcmV0ID0gYWRkX2NwdV9kZXZfc3ltbGluayhwb2xpY3ksIGRldik7CisJaWYgKHJldCkgeworCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIHBvbGljeS0+cmVhbF9jcHVzKTsKKwkJY3B1ZnJlcV9vZmZsaW5lKGNwdSk7CisJfQorCisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgY3B1ZnJlcV9vZmZsaW5lKHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgaW50IGNwdWZyZXFfb2ZmbGluZSh1bnNpZ25lZCBpbnQgY3B1KQogewogCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5OwogCWludCByZXQ7CkBAIC0xMzY4LDcgKzEzMzEsNyBAQAogCXBvbGljeSA9IGNwdWZyZXFfY3B1X2dldF9yYXcoY3B1KTsKIAlpZiAoIXBvbGljeSkgewogCQlwcl9kZWJ1ZygiJXM6IE5vIGNwdV9kYXRhIGZvdW5kXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJfQogCiAJZG93bl93cml0ZSgmcG9saWN5LT5yd3NlbSk7CkBAIC0xNDE3LDYgKzEzODAsNyBAQAogCiB1bmxvY2s6CiAJdXBfd3JpdGUoJnBvbGljeS0+cndzZW0pOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTE0MzYsNyArMTQwMCw3IEBACiAJCWNwdWZyZXFfb2ZmbGluZShjcHUpOwogCiAJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBwb2xpY3ktPnJlYWxfY3B1cyk7Ci0JcmVtb3ZlX2NwdV9kZXZfc3ltbGluayhwb2xpY3ksIGNwdSk7CisJcmVtb3ZlX2NwdV9kZXZfc3ltbGluayhwb2xpY3ksIGRldik7CiAKIAlpZiAoY3B1bWFza19lbXB0eShwb2xpY3ktPnJlYWxfY3B1cykpCiAJCWNwdWZyZXFfcG9saWN5X2ZyZWUocG9saWN5LCB0cnVlKTsKQEAgLTIzMzIsMjggKzIyOTYsNiBAQAogfQogRVhQT1JUX1NZTUJPTChjcHVmcmVxX3VwZGF0ZV9wb2xpY3kpOwogCi1zdGF0aWMgaW50IGNwdWZyZXFfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAotCQkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKLXsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKLQotCXN3aXRjaCAoYWN0aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pIHsKLQljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfRE9XTl9GQUlMRUQ6Ci0JCWNwdWZyZXFfb25saW5lKGNwdSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCQljcHVmcmVxX29mZmxpbmUoY3B1KTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgX19yZWZkYXRhIGNwdWZyZXFfY3B1X25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gY3B1ZnJlcV9jcHVfY2FsbGJhY2ssCi19OwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgIEJPT1NUCQkJCQkJICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjQ1NSw2ICsyMzk3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgUkVHSVNURVIgLyBVTlJFR0lTVEVSIENQVUZSRVEgRFJJVkVSICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgZW51bSBjcHVocF9zdGF0ZSBocF9vbmxpbmU7CiAKIC8qKgogICogY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIgLSByZWdpc3RlciBhIENQVSBGcmVxdWVuY3kgZHJpdmVyCkBAIC0yNTE3LDcgKzI0NjAsMTQgQEAKIAkJZ290byBlcnJfaWZfdW5yZWc7CiAJfQogCi0JcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZjcHVmcmVxX2NwdV9ub3RpZmllcik7CisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9PTkxJTkVfRFlOLCAiY3B1ZnJlcTpvbmxpbmUiLAorCQkJCQljcHVmcmVxX29ubGluZSwKKwkJCQkJY3B1ZnJlcV9vZmZsaW5lKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfaWZfdW5yZWc7CisJaHBfb25saW5lID0gcmV0OworCXJldCA9IDA7CisKIAlwcl9kZWJ1ZygiZHJpdmVyICVzIHVwIGFuZCBydW5uaW5nXG4iLCBkcml2ZXJfZGF0YS0+bmFtZSk7CiAJZ290byBvdXQ7CiAKQEAgLTI1NTYsNyArMjUwNiw3IEBACiAJZ2V0X29ubGluZV9jcHVzKCk7CiAJc3Vic3lzX2ludGVyZmFjZV91bnJlZ2lzdGVyKCZjcHVmcmVxX2ludGVyZmFjZSk7CiAJcmVtb3ZlX2Jvb3N0X3N5c2ZzX2ZpbGUoKTsKLQl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmY3B1ZnJlcV9jcHVfbm90aWZpZXIpOworCWNwdWhwX3JlbW92ZV9zdGF0ZV9ub2NhbGxzKGhwX29ubGluZSk7CiAKIAl3cml0ZV9sb2NrX2lycXNhdmUoJmNwdWZyZXFfZHJpdmVyX2xvY2ssIGZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfZ292ZXJub3IuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2dvdmVybm9yLmMKaW5kZXggZTQxNTM0OS4uNjQyZGQwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfZ292ZXJub3IuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9nb3Zlcm5vci5jCkBAIC0yNjAsNyArMjYwLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgZGJzX3VwZGF0ZV91dGlsX2hhbmRsZXIoc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGEsIHU2NCB0aW1lLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIHV0aWwsIHVuc2lnbmVkIGxvbmcgbWF4KQorCQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGNwdV9kYnNfaW5mbyAqY2RicyA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgY3B1X2Ric19pbmZvLCB1cGRhdGVfdXRpbCk7CiAJc3RydWN0IHBvbGljeV9kYnNfaW5mbyAqcG9saWN5X2RicyA9IGNkYnMtPnBvbGljeV9kYnM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvaW50ZWxfcHN0YXRlLmMgYi9kcml2ZXJzL2NwdWZyZXEvaW50ZWxfcHN0YXRlLmMKaW5kZXggYmU5ZWFkZS4uODA2ZjIwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2ludGVsX3BzdGF0ZS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9pbnRlbF9wc3RhdGUuYwpAQCAtMTgxLDYgKzE4MSw4IEBACiAgKiBAY3B1OgkJQ1BVIG51bWJlciBmb3IgdGhpcyBpbnN0YW5jZSBkYXRhCiAgKiBAdXBkYXRlX3V0aWw6CUNQVUZyZXEgdXRpbGl0eSBjYWxsYmFjayBpbmZvcm1hdGlvbgogICogQHVwZGF0ZV91dGlsX3NldDoJQ1BVRnJlcSB1dGlsaXR5IGNhbGxiYWNrIGlzIHNldAorICogQGlvd2FpdF9ib29zdDoJaW93YWl0LXJlbGF0ZWQgYm9vc3QgZnJhY3Rpb24KKyAqIEBsYXN0X3VwZGF0ZToJVGltZSBvZiB0aGUgbGFzdCB1cGRhdGUuCiAgKiBAcHN0YXRlOgkJU3RvcmVzIFAgc3RhdGUgbGltaXRzIGZvciB0aGlzIENQVQogICogQHZpZDoJCVN0b3JlcyBWSUQgbGltaXRzIGZvciB0aGlzIENQVQogICogQHBpZDoJCVN0b3JlcyBQSUQgcGFyYW1ldGVycyBmb3IgdGhpcyBDUFUKQEAgLTIwNiw2ICsyMDgsNyBAQAogCXN0cnVjdCB2aWRfZGF0YSB2aWQ7CiAJc3RydWN0IF9waWQgcGlkOwogCisJdTY0CWxhc3RfdXBkYXRlOwogCXU2NAlsYXN0X3NhbXBsZV90aW1lOwogCXU2NAlwcmV2X2FwZXJmOwogCXU2NAlwcmV2X21wZXJmOwpAQCAtMjE2LDYgKzIxOSw3IEBACiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlIGFjcGlfcGVyZl9kYXRhOwogCWJvb2wgdmFsaWRfcHNzX3RhYmxlOwogI2VuZGlmCisJdW5zaWduZWQgaW50IGlvd2FpdF9ib29zdDsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY3B1ZGF0YSAqKmFsbF9jcHVfZGF0YTsKQEAgLTIyOSw2ICsyMzMsNyBAQAogICogQHBfZ2Fpbl9wY3Q6CQlQSUQgcHJvcG9ydGlvbmFsIGdhaW4KICAqIEBpX2dhaW5fcGN0OgkJUElEIGludGVncmFsIGdhaW4KICAqIEBkX2dhaW5fcGN0OgkJUElEIGRlcml2YXRpdmUgZ2FpbgorICogQGJvb3N0X2lvd2FpdDoJV2hldGhlciBvciBub3QgdG8gdXNlIGlvd2FpdCBib29zdGluZy4KICAqCiAgKiBTdG9yZXMgcGVyIENQVSBtb2RlbCBzdGF0aWMgUElEIGNvbmZpZ3VyYXRpb24gZGF0YS4KICAqLwpAQCAtMjQwLDYgKzI0NSw3IEBACiAJaW50IHBfZ2Fpbl9wY3Q7CiAJaW50IGRfZ2Fpbl9wY3Q7CiAJaW50IGlfZ2Fpbl9wY3Q7CisJYm9vbCBib29zdF9pb3dhaXQ7CiB9OwogCiAvKioKQEAgLTEwMjksNyArMTAzNSw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY3B1X2RlZmF1bHRzIHNpbHZlcm1vbnRfcGFyYW1zID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVfZGVmYXVsdHMgc2lsdmVybW9udF9wYXJhbXMgPSB7CiAJLnBpZF9wb2xpY3kgPSB7CiAJCS5zYW1wbGVfcmF0ZV9tcyA9IDEwLAogCQkuZGVhZGJhbmQgPSAwLApAQCAtMTAzNyw2ICsxMDQzLDcgQEAKIAkJLnBfZ2Fpbl9wY3QgPSAxNCwKIAkJLmRfZ2Fpbl9wY3QgPSAwLAogCQkuaV9nYWluX3BjdCA9IDQsCisJCS5ib29zdF9pb3dhaXQgPSB0cnVlLAogCX0sCiAJLmZ1bmNzID0gewogCQkuZ2V0X21heCA9IGF0b21fZ2V0X21heF9wc3RhdGUsCkBAIC0xMDUwLDcgKzEwNTcsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGNwdV9kZWZhdWx0cyBhaXJtb250X3BhcmFtcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X2RlZmF1bHRzIGFpcm1vbnRfcGFyYW1zID0gewogCS5waWRfcG9saWN5ID0gewogCQkuc2FtcGxlX3JhdGVfbXMgPSAxMCwKIAkJLmRlYWRiYW5kID0gMCwKQEAgLTEwNTgsNiArMTA2NSw3IEBACiAJCS5wX2dhaW5fcGN0ID0gMTQsCiAJCS5kX2dhaW5fcGN0ID0gMCwKIAkJLmlfZ2Fpbl9wY3QgPSA0LAorCQkuYm9vc3RfaW93YWl0ID0gdHJ1ZSwKIAl9LAogCS5mdW5jcyA9IHsKIAkJLmdldF9tYXggPSBhdG9tX2dldF9tYXhfcHN0YXRlLApAQCAtMTA3MSw3ICsxMDc5LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBjcHVfZGVmYXVsdHMga25sX3BhcmFtcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X2RlZmF1bHRzIGtubF9wYXJhbXMgPSB7CiAJLnBpZF9wb2xpY3kgPSB7CiAJCS5zYW1wbGVfcmF0ZV9tcyA9IDEwLAogCQkuZGVhZGJhbmQgPSAwLApAQCAtMTA5MSw3ICsxMDk5LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBjcHVfZGVmYXVsdHMgYnh0X3BhcmFtcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X2RlZmF1bHRzIGJ4dF9wYXJhbXMgPSB7CiAJLnBpZF9wb2xpY3kgPSB7CiAJCS5zYW1wbGVfcmF0ZV9tcyA9IDEwLAogCQkuZGVhZGJhbmQgPSAwLApAQCAtMTA5OSw2ICsxMTA3LDcgQEAKIAkJLnBfZ2Fpbl9wY3QgPSAxNCwKIAkJLmRfZ2Fpbl9wY3QgPSAwLAogCQkuaV9nYWluX3BjdCA9IDQsCisJCS5ib29zdF9pb3dhaXQgPSB0cnVlLAogCX0sCiAJLmZ1bmNzID0gewogCQkuZ2V0X21heCA9IGNvcmVfZ2V0X21heF9wc3RhdGUsCkBAIC0xMjIyLDM2ICsxMjMxLDE4IEBACiBzdGF0aWMgaW5saW5lIGludDMyX3QgZ2V0X3RhcmdldF9wc3RhdGVfdXNlX2NwdV9sb2FkKHN0cnVjdCBjcHVkYXRhICpjcHUpCiB7CiAJc3RydWN0IHNhbXBsZSAqc2FtcGxlID0gJmNwdS0+c2FtcGxlOwotCXU2NCBjdW1tdWxhdGl2ZV9pb3dhaXQsIGRlbHRhX2lvd2FpdF91czsKLQl1NjQgZGVsdGFfaW93YWl0X21wZXJmOwotCXU2NCBtcGVyZiwgbm93OwotCWludDMyX3QgY3B1X2xvYWQ7CisJaW50MzJfdCBidXN5X2ZyYWMsIGJvb3N0OwogCi0JY3VtbXVsYXRpdmVfaW93YWl0ID0gZ2V0X2NwdV9pb3dhaXRfdGltZV91cyhjcHUtPmNwdSwgJm5vdyk7CisJYnVzeV9mcmFjID0gZGl2X2ZwKHNhbXBsZS0+bXBlcmYsIHNhbXBsZS0+dHNjKTsKIAotCS8qCi0JICogQ29udmVydCBpb3dhaXQgdGltZSBpbnRvIG51bWJlciBvZiBJTyBjeWNsZXMgc3BlbnQgYXQgbWF4X2ZyZXEuCi0JICogSU8gaXMgY29uc2lkZXJlZCBhcyBidXN5IG9ubHkgZm9yIHRoZSBjcHVfbG9hZCBhbGdvcml0aG0uIEZvcgotCSAqIHBlcmZvcm1hbmNlIHRoaXMgaXMgbm90IG5lZWRlZCBzaW5jZSB3ZSBhbHdheXMgdHJ5IHRvIHJlYWNoIHRoZQotCSAqIG1heGltdW0gUC1TdGF0ZSwgc28gd2UgYXJlIGFscmVhZHkgYm9vc3RpbmcgdGhlIElPcy4KLQkgKi8KLQlkZWx0YV9pb3dhaXRfdXMgPSBjdW1tdWxhdGl2ZV9pb3dhaXQgLSBjcHUtPnByZXZfY3VtbXVsYXRpdmVfaW93YWl0OwotCWRlbHRhX2lvd2FpdF9tcGVyZiA9IGRpdjY0X3U2NChkZWx0YV9pb3dhaXRfdXMgKiBjcHUtPnBzdGF0ZS5zY2FsaW5nICoKLQkJY3B1LT5wc3RhdGUubWF4X3BzdGF0ZSwgTVNFQ19QRVJfU0VDKTsKKwlib29zdCA9IGNwdS0+aW93YWl0X2Jvb3N0OworCWNwdS0+aW93YWl0X2Jvb3N0ID4+PSAxOwogCi0JbXBlcmYgPSBjcHUtPnNhbXBsZS5tcGVyZiArIGRlbHRhX2lvd2FpdF9tcGVyZjsKLQljcHUtPnByZXZfY3VtbXVsYXRpdmVfaW93YWl0ID0gY3VtbXVsYXRpdmVfaW93YWl0OworCWlmIChidXN5X2ZyYWMgPCBib29zdCkKKwkJYnVzeV9mcmFjID0gYm9vc3Q7CiAKLQkvKgotCSAqIFRoZSBsb2FkIGNhbiBiZSBlc3RpbWF0ZWQgYXMgdGhlIHJhdGlvIG9mIHRoZSBtcGVyZiBjb3VudGVyCi0JICogcnVubmluZyBhdCBhIGNvbnN0YW50IGZyZXF1ZW5jeSBkdXJpbmcgYWN0aXZlIHBlcmlvZHMKLQkgKiAoQzApIGFuZCB0aGUgdGltZSBzdGFtcCBjb3VudGVyIHJ1bm5pbmcgYXQgdGhlIHNhbWUgZnJlcXVlbmN5Ci0JICogYWxzbyBkdXJpbmcgQy1zdGF0ZXMuCi0JICovCi0JY3B1X2xvYWQgPSBkaXY2NF91NjQoaW50X3RvZnAoMTAwKSAqIG1wZXJmLCBzYW1wbGUtPnRzYyk7Ci0JY3B1LT5zYW1wbGUuYnVzeV9zY2FsZWQgPSBjcHVfbG9hZDsKLQotCXJldHVybiBnZXRfYXZnX3BzdGF0ZShjcHUpIC0gcGlkX2NhbGMoJmNwdS0+cGlkLCBjcHVfbG9hZCk7CisJc2FtcGxlLT5idXN5X3NjYWxlZCA9IGJ1c3lfZnJhYyAqIDEwMDsKKwlyZXR1cm4gZ2V0X2F2Z19wc3RhdGUoY3B1KSAtIHBpZF9jYWxjKCZjcHUtPnBpZCwgc2FtcGxlLT5idXN5X3NjYWxlZCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50MzJfdCBnZXRfdGFyZ2V0X3BzdGF0ZV91c2VfcGVyZm9ybWFuY2Uoc3RydWN0IGNwdWRhdGEgKmNwdSkKQEAgLTEzMjUsMTUgKzEzMTYsMjkgQEAKIAkJc2FtcGxlLT5tcGVyZiwKIAkJc2FtcGxlLT5hcGVyZiwKIAkJc2FtcGxlLT50c2MsCi0JCWdldF9hdmdfZnJlcXVlbmN5KGNwdSkpOworCQlnZXRfYXZnX2ZyZXF1ZW5jeShjcHUpLAorCQlmcF90b2ludChjcHUtPmlvd2FpdF9ib29zdCAqIDEwMCkpOwogfQogCiBzdGF0aWMgdm9pZCBpbnRlbF9wc3RhdGVfdXBkYXRlX3V0aWwoc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGEsIHU2NCB0aW1lLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyB1dGlsLCB1bnNpZ25lZCBsb25nIG1heCkKKwkJCQkgICAgIHVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgY3B1ZGF0YSAqY3B1ID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBjcHVkYXRhLCB1cGRhdGVfdXRpbCk7Ci0JdTY0IGRlbHRhX25zID0gdGltZSAtIGNwdS0+c2FtcGxlLnRpbWU7CisJdTY0IGRlbHRhX25zOwogCisJaWYgKHBpZF9wYXJhbXMuYm9vc3RfaW93YWl0KSB7CisJCWlmIChmbGFncyAmIFNDSEVEX0NQVUZSRVFfSU9XQUlUKSB7CisJCQljcHUtPmlvd2FpdF9ib29zdCA9IGludF90b2ZwKDEpOworCQl9IGVsc2UgaWYgKGNwdS0+aW93YWl0X2Jvb3N0KSB7CisJCQkvKiBDbGVhciBpb3dhaXRfYm9vc3QgaWYgdGhlIENQVSBtYXkgaGF2ZSBiZWVuIGlkbGUuICovCisJCQlkZWx0YV9ucyA9IHRpbWUgLSBjcHUtPmxhc3RfdXBkYXRlOworCQkJaWYgKGRlbHRhX25zID4gVElDS19OU0VDKQorCQkJCWNwdS0+aW93YWl0X2Jvb3N0ID0gMDsKKwkJfQorCQljcHUtPmxhc3RfdXBkYXRlID0gdGltZTsKKwl9CisKKwlkZWx0YV9ucyA9IHRpbWUgLSBjcHUtPnNhbXBsZS50aW1lOwogCWlmICgoczY0KWRlbHRhX25zID49IHBpZF9wYXJhbXMuc2FtcGxlX3JhdGVfbnMpIHsKIAkJYm9vbCBzYW1wbGVfdGFrZW4gPSBpbnRlbF9wc3RhdGVfc2FtcGxlKGNwdSwgdGltZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9raXJrd29vZC1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEva2lya3dvb2QtY3B1ZnJlcS5jCmluZGV4IGJlNDJmMTAuLjFiOWJjZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9raXJrd29vZC1jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2tpcmt3b29kLWNwdWZyZXEuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAKIAlwcml2LmNwdV9jbGsgPSBvZl9jbGtfZ2V0X2J5X25hbWUobnAsICJjcHVfY2xrIik7CiAJaWYgKElTX0VSUihwcml2LmNwdV9jbGspKSB7Ci0JCWRldl9lcnIocHJpdi5kZXYsICJVbmFibGUgdG8gZ2V0IGNwdWNsayIpOworCQlkZXZfZXJyKHByaXYuZGV2LCAiVW5hYmxlIHRvIGdldCBjcHVjbGtcbiIpOwogCQlyZXR1cm4gUFRSX0VSUihwcml2LmNwdV9jbGspOwogCX0KIApAQCAtMTMyLDcgKzEzMiw3IEBACiAKIAlwcml2LmRkcl9jbGsgPSBvZl9jbGtfZ2V0X2J5X25hbWUobnAsICJkZHJjbGsiKTsKIAlpZiAoSVNfRVJSKHByaXYuZGRyX2NsaykpIHsKLQkJZGV2X2Vycihwcml2LmRldiwgIlVuYWJsZSB0byBnZXQgZGRyY2xrIik7CisJCWRldl9lcnIocHJpdi5kZXYsICJVbmFibGUgdG8gZ2V0IGRkcmNsa1xuIik7CiAJCWVyciA9IFBUUl9FUlIocHJpdi5kZHJfY2xrKTsKIAkJZ290byBvdXRfY3B1OwogCX0KQEAgLTE0Miw3ICsxNDIsNyBAQAogCiAJcHJpdi5wb3dlcnNhdmVfY2xrID0gb2ZfY2xrX2dldF9ieV9uYW1lKG5wLCAicG93ZXJzYXZlIik7CiAJaWYgKElTX0VSUihwcml2LnBvd2Vyc2F2ZV9jbGspKSB7Ci0JCWRldl9lcnIocHJpdi5kZXYsICJVbmFibGUgdG8gZ2V0IHBvd2Vyc2F2ZSIpOworCQlkZXZfZXJyKHByaXYuZGV2LCAiVW5hYmxlIHRvIGdldCBwb3dlcnNhdmVcbiIpOwogCQllcnIgPSBQVFJfRVJSKHByaXYucG93ZXJzYXZlX2Nsayk7CiAJCWdvdG8gb3V0X2RkcjsKIAl9CkBAIC0xNTUsNyArMTU1LDcgQEAKIAlpZiAoIWVycikKIAkJcmV0dXJuIDA7CiAKLQlkZXZfZXJyKHByaXYuZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNwdWZyZXEgZHJpdmVyIik7CisJZGV2X2Vycihwcml2LmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBjcHVmcmVxIGRyaXZlclxuIik7CiAKIAljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi5wb3dlcnNhdmVfY2xrKTsKIG91dF9kZHI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvc2ExMTEwLWNwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9zYTExMTAtY3B1ZnJlcS5jCmluZGV4IGI1YmVmYzIuLjJiYWM5YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9zYTExMTAtY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9zYTExMTAtY3B1ZnJlcS5jCkBAIC0xNTksNyArMTU5LDcgQEAKIAkgKiBoYWxmIHNwZWVkIG9yIHVzZSBkZWxheWVkIHJlYWQgbGF0Y2hpbmcgKGVycmF0YSAxMykuCiAJICovCiAJaWYgKChuc190b19jeWNsZXMoc2RyYW0tPnRjaywgc2Rfa2h6KSA+IDEpIHx8Ci0JICAgIChDUFVfUkVWSVNJT04gPCBDUFVfU0ExMTEwX0IyICYmIHNkX2toeiA8IDYyMDAwKSkKKwkgICAgKHJlYWRfY3B1aWRfcmV2aXNpb24oKSA8IEFSTV9DUFVfUkVWX1NBMTExMF9CMiAmJiBzZF9raHogPCA2MjAwMCkpCiAJCXNkX2toeiAvPSAyOwogCiAJc2QtPm1kY25mZyA9IE1EQ05GRyAmIDB4MDA3ZjAwN2Y7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvc2NwaS1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvc2NwaS1jcHVmcmVxLmMKaW5kZXggZThhN2JmNS4uZWE3YTRlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL3NjcGktY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9zY3BpLWNwdWZyZXEuYwpAQCAtMTA1LDcgKzEwNSw2IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzY3BpX2NwdWZyZXFfcGxhdGRydiA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJzY3BpLWNwdWZyZXEiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogCS5wcm9iZQkJPSBzY3BpX2NwdWZyZXFfcHJvYmUsCiAJLnJlbW92ZQkJPSBzY3BpX2NwdWZyZXFfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL3N0aS1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvc3RpLWNwdWZyZXEuYwppbmRleCAwNDA0MjAzLi5iMzY2ZTZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvc3RpLWNwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvc3RpLWNwdWZyZXEuYwpAQCAtMTYzLDcgKzE2Myw3IEBACiAKIAlyZWdfZmllbGRzID0gc3RpX2NwdWZyZXFfbWF0Y2goKTsKIAlpZiAoIXJlZ19maWVsZHMpIHsKLQkJZGV2X2VycihkZXYsICJUaGlzIFNvQyBkb2Vzbid0IHN1cHBvcnQgdm9sdGFnZSBzY2FsaW5nIik7CisJCWRldl9lcnIoZGV2LCAiVGhpcyBTb0MgZG9lc24ndCBzdXBwb3J0IHZvbHRhZ2Ugc2NhbGluZ1xuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVpZGxlL2NvdXBsZWQuYyBiL2RyaXZlcnMvY3B1aWRsZS9jb3VwbGVkLmMKaW5kZXggZDU2NTdkNS4uNzFlNTg2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2NvdXBsZWQuYworKysgYi9kcml2ZXJzL2NwdWlkbGUvY291cGxlZC5jCkBAIC03NDksNjUgKzc0OSw1MiBAQAogCXB1dF9jcHUoKTsKIH0KIAotLyoqCi0gKiBjcHVpZGxlX2NvdXBsZWRfY3B1X25vdGlmeSAtIG5vdGlmaWVyIGNhbGxlZCBkdXJpbmcgaG90cGx1ZyB0cmFuc2l0aW9ucwotICogQG5iOiBub3RpZmllciBibG9jawotICogQGFjdGlvbjogaG90cGx1ZyB0cmFuc2l0aW9uCi0gKiBAaGNwdTogdGFyZ2V0IGNwdSBudW1iZXIKLSAqCi0gKiBDYWxsZWQgd2hlbiBhIGNwdSBpcyBicm91Z2h0IG9uIG9yIG9mZmxpbmUgdXNpbmcgaG90cGx1Zy4gIFVwZGF0ZXMgdGhlCi0gKiBjb3VwbGVkIGNwdSBzZXQgYXBwcm9wcmlhdGVseQotICovCi1zdGF0aWMgaW50IGNwdWlkbGVfY291cGxlZF9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCi0JCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQorc3RhdGljIGludCBjb3VwbGVkX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKLQlpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKIAlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldjsKIAotCXN3aXRjaCAoYWN0aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pIHsKLQljYXNlIENQVV9VUF9QUkVQQVJFOgotCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKLQljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfREVBRDoKLQljYXNlIENQVV9VUF9DQU5DRUxFRDoKLQljYXNlIENQVV9ET1dOX0ZBSUxFRDoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIE5PVElGWV9PSzsKLQl9Ci0KIAltdXRleF9sb2NrKCZjcHVpZGxlX2xvY2spOwogCiAJZGV2ID0gcGVyX2NwdShjcHVpZGxlX2RldmljZXMsIGNwdSk7Ci0JaWYgKCFkZXYgfHwgIWRldi0+Y291cGxlZCkKLQkJZ290byBvdXQ7Ci0KLQlzd2l0Y2ggKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRToKLQljYXNlIENQVV9ET1dOX1BSRVBBUkU6Ci0JCWNwdWlkbGVfY291cGxlZF9wcmV2ZW50X2lkbGUoZGV2LT5jb3VwbGVkKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX0RFQUQ6CisJaWYgKGRldiAmJiBkZXYtPmNvdXBsZWQpIHsKIAkJY3B1aWRsZV9jb3VwbGVkX3VwZGF0ZV9vbmxpbmVfY3B1cyhkZXYtPmNvdXBsZWQpOwotCQkvKiBGYWxsIHRocm91Z2ggKi8KLQljYXNlIENQVV9VUF9DQU5DRUxFRDoKLQljYXNlIENQVV9ET1dOX0ZBSUxFRDoKIAkJY3B1aWRsZV9jb3VwbGVkX2FsbG93X2lkbGUoZGV2LT5jb3VwbGVkKTsKLQkJYnJlYWs7CiAJfQogCi1vdXQ6CiAJbXV0ZXhfdW5sb2NrKCZjcHVpZGxlX2xvY2spOwotCXJldHVybiBOT1RJRllfT0s7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgY3B1aWRsZV9jb3VwbGVkX2NwdV9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IGNwdWlkbGVfY291cGxlZF9jcHVfbm90aWZ5LAotfTsKK3N0YXRpYyBpbnQgY291cGxlZF9jcHVfdXBfcHJlcGFyZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2OworCisJbXV0ZXhfbG9jaygmY3B1aWRsZV9sb2NrKTsKKworCWRldiA9IHBlcl9jcHUoY3B1aWRsZV9kZXZpY2VzLCBjcHUpOworCWlmIChkZXYgJiYgZGV2LT5jb3VwbGVkKQorCQljcHVpZGxlX2NvdXBsZWRfcHJldmVudF9pZGxlKGRldi0+Y291cGxlZCk7CisKKwltdXRleF91bmxvY2soJmNwdWlkbGVfbG9jayk7CisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBpbnQgX19pbml0IGNwdWlkbGVfY291cGxlZF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHJlZ2lzdGVyX2NwdV9ub3RpZmllcigmY3B1aWRsZV9jb3VwbGVkX2NwdV9ub3RpZmllcik7CisJaW50IHJldDsKKworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQ1BVSURMRV9DT1VQTEVEX1BSRVBBUkUsCisJCQkJCSJjcHVpZGxlL2NvdXBsZWQ6cHJlcGFyZSIsCisJCQkJCWNvdXBsZWRfY3B1X3VwX3ByZXBhcmUsCisJCQkJCWNvdXBsZWRfY3B1X29ubGluZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0FQX09OTElORV9EWU4sCisJCQkJCSJjcHVpZGxlL2NvdXBsZWQ6b25saW5lIiwKKwkJCQkJY291cGxlZF9jcHVfb25saW5lLAorCQkJCQljb3VwbGVkX2NwdV91cF9wcmVwYXJlKTsKKwlpZiAocmV0IDwgMCkKKwkJY3B1aHBfcmVtb3ZlX3N0YXRlX25vY2FsbHMoQ1BVSFBfQ1BVSURMRV9DT1VQTEVEX1BSRVBBUkUpOworCXJldHVybiByZXQ7CiB9CiBjb3JlX2luaXRjYWxsKGNwdWlkbGVfY291cGxlZF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLWFybS5jIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtYXJtLmMKaW5kZXggNGJhM2QzZi4uZjQ0MGQzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtYXJtLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtYXJtLmMKQEAgLTEyMSw2ICsxMjEsNyBAQAogCQlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghZGV2KSB7CiAJCQlwcl9lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBjcHVpZGxlIGRldmljZVxuIik7CisJCQlyZXQgPSAtRU5PTUVNOwogCQkJZ290byBvdXRfZmFpbDsKIAkJfQogCQlkZXYtPmNwdSA9IGNwdTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBvd2VybnYuYyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBvd2VybnYuYwppbmRleCBmN2NhODkxLi43ZmU0NDJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1wb3dlcm52LmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtcG93ZXJudi5jCkBAIC0xMTksMzkgKzExOSwyOSBAQAogCQkuZW50ZXIgPSBzbm9vemVfbG9vcCB9LAogfTsKIAotc3RhdGljIGludCBwb3dlcm52X2NwdWlkbGVfYWRkX2NwdV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm4sCi0JCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgcG93ZXJudl9jcHVpZGxlX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKLQlpbnQgaG90Y3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKLQlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiA9Ci0JCQkJcGVyX2NwdShjcHVpZGxlX2RldmljZXMsIGhvdGNwdSk7CisJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYgPSBwZXJfY3B1KGNwdWlkbGVfZGV2aWNlcywgY3B1KTsKIAogCWlmIChkZXYgJiYgY3B1aWRsZV9nZXRfZHJpdmVyKCkpIHsKLQkJc3dpdGNoIChhY3Rpb24pIHsKLQkJY2FzZSBDUFVfT05MSU5FOgotCQljYXNlIENQVV9PTkxJTkVfRlJPWkVOOgotCQkJY3B1aWRsZV9wYXVzZV9hbmRfbG9jaygpOwotCQkJY3B1aWRsZV9lbmFibGVfZGV2aWNlKGRldik7Ci0JCQljcHVpZGxlX3Jlc3VtZV9hbmRfdW5sb2NrKCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENQVV9ERUFEOgotCQljYXNlIENQVV9ERUFEX0ZST1pFTjoKLQkJCWNwdWlkbGVfcGF1c2VfYW5kX2xvY2soKTsKLQkJCWNwdWlkbGVfZGlzYWJsZV9kZXZpY2UoZGV2KTsKLQkJCWNwdWlkbGVfcmVzdW1lX2FuZF91bmxvY2soKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0JCX0KKwkJY3B1aWRsZV9wYXVzZV9hbmRfbG9jaygpOworCQljcHVpZGxlX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwkJY3B1aWRsZV9yZXN1bWVfYW5kX3VubG9jaygpOwogCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNldHVwX2hvdHBsdWdfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBwb3dlcm52X2NwdWlkbGVfYWRkX2NwdV9ub3RpZmllciwKLX07CitzdGF0aWMgaW50IHBvd2VybnZfY3B1aWRsZV9jcHVfZGVhZCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2ID0gcGVyX2NwdShjcHVpZGxlX2RldmljZXMsIGNwdSk7CisKKwlpZiAoZGV2ICYmIGNwdWlkbGVfZ2V0X2RyaXZlcigpKSB7CisJCWNwdWlkbGVfcGF1c2VfYW5kX2xvY2soKTsKKwkJY3B1aWRsZV9kaXNhYmxlX2RldmljZShkZXYpOworCQljcHVpZGxlX3Jlc3VtZV9hbmRfdW5sb2NrKCk7CisJfQorCXJldHVybiAwOworfQogCiAvKgogICogcG93ZXJudl9jcHVpZGxlX2RyaXZlcl9pbml0KCkKQEAgLTM1NSw3ICszNDUsMTQgQEAKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnNldHVwX2hvdHBsdWdfbm90aWZpZXIpOworCXJldHZhbCA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfT05MSU5FX0RZTiwKKwkJCQkJICAgImNwdWlkbGUvcG93ZXJudjpvbmxpbmUiLAorCQkJCQkgICBwb3dlcm52X2NwdWlkbGVfY3B1X29ubGluZSwgTlVMTCk7CisJV0FSTl9PTihyZXR2YWwgPCAwKTsKKwlyZXR2YWwgPSBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0NQVUlETEVfREVBRCwKKwkJCQkJICAgImNwdWlkbGUvcG93ZXJudjpkZWFkIiwgTlVMTCwKKwkJCQkJICAgcG93ZXJudl9jcHVpZGxlX2NwdV9kZWFkKTsKKwlXQVJOX09OKHJldHZhbCA8IDApOwogCXByaW50ayhLRVJOX0RFQlVHICJwb3dlcm52X2lkbGVfZHJpdmVyIHJlZ2lzdGVyZWRcbiIpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtcHNlcmllcy5jIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtcHNlcmllcy5jCmluZGV4IDA3MTM1ZTAuLjE2NmNjZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBzZXJpZXMuYworKysgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1wc2VyaWVzLmMKQEAgLTE3MSwzOSArMTcxLDI5IEBACiAJCS5lbnRlciA9ICZzaGFyZWRfY2VkZV9sb29wIH0sCiB9OwogCi1zdGF0aWMgaW50IHBzZXJpZXNfY3B1aWRsZV9hZGRfY3B1X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbiwKLQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQorc3RhdGljIGludCBwc2VyaWVzX2NwdWlkbGVfY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1KQogewotCWludCBob3RjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OwotCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2ID0KLQkJCQlwZXJfY3B1KGNwdWlkbGVfZGV2aWNlcywgaG90Y3B1KTsKKwlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiA9IHBlcl9jcHUoY3B1aWRsZV9kZXZpY2VzLCBjcHUpOwogCiAJaWYgKGRldiAmJiBjcHVpZGxlX2dldF9kcml2ZXIoKSkgewotCQlzd2l0Y2ggKGFjdGlvbikgewotCQljYXNlIENQVV9PTkxJTkU6Ci0JCWNhc2UgQ1BVX09OTElORV9GUk9aRU46Ci0JCQljcHVpZGxlX3BhdXNlX2FuZF9sb2NrKCk7Ci0JCQljcHVpZGxlX2VuYWJsZV9kZXZpY2UoZGV2KTsKLQkJCWNwdWlkbGVfcmVzdW1lX2FuZF91bmxvY2soKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ1BVX0RFQUQ6Ci0JCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgotCQkJY3B1aWRsZV9wYXVzZV9hbmRfbG9jaygpOwotCQkJY3B1aWRsZV9kaXNhYmxlX2RldmljZShkZXYpOwotCQkJY3B1aWRsZV9yZXN1bWVfYW5kX3VubG9jaygpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiBOT1RJRllfRE9ORTsKLQkJfQorCQljcHVpZGxlX3BhdXNlX2FuZF9sb2NrKCk7CisJCWNwdWlkbGVfZW5hYmxlX2RldmljZShkZXYpOworCQljcHVpZGxlX3Jlc3VtZV9hbmRfdW5sb2NrKCk7CiAJfQotCXJldHVybiBOT1RJRllfT0s7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgc2V0dXBfaG90cGx1Z19ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IHBzZXJpZXNfY3B1aWRsZV9hZGRfY3B1X25vdGlmaWVyLAotfTsKK3N0YXRpYyBpbnQgcHNlcmllc19jcHVpZGxlX2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYgPSBwZXJfY3B1KGNwdWlkbGVfZGV2aWNlcywgY3B1KTsKKworCWlmIChkZXYgJiYgY3B1aWRsZV9nZXRfZHJpdmVyKCkpIHsKKwkJY3B1aWRsZV9wYXVzZV9hbmRfbG9jaygpOworCQljcHVpZGxlX2Rpc2FibGVfZGV2aWNlKGRldik7CisJCWNwdWlkbGVfcmVzdW1lX2FuZF91bmxvY2soKTsKKwl9CisJcmV0dXJuIDA7Cit9CiAKIC8qCiAgKiBwc2VyaWVzX2NwdWlkbGVfZHJpdmVyX2luaXQoKQpAQCAtMjczLDcgKzI2MywxNCBAQAogCQlyZXR1cm4gcmV0dmFsOwogCX0KIAotCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmc2V0dXBfaG90cGx1Z19ub3RpZmllcik7CisJcmV0dmFsID0gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9PTkxJTkVfRFlOLAorCQkJCQkgICAiY3B1aWRsZS9wc2VyaWVzOm9ubGluZSIsCisJCQkJCSAgIHBzZXJpZXNfY3B1aWRsZV9jcHVfb25saW5lLCBOVUxMKTsKKwlXQVJOX09OKHJldHZhbCA8IDApOworCXJldHZhbCA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQ1BVSURMRV9ERUFELAorCQkJCQkgICAiY3B1aWRsZS9wc2VyaWVzOkRFQUQiLCBOVUxMLAorCQkJCQkgICBwc2VyaWVzX2NwdWlkbGVfY3B1X2RlYWQpOworCVdBUk5fT04ocmV0dmFsIDwgMCk7CiAJcHJpbnRrKEtFUk5fREVCVUcgInBzZXJpZXNfaWRsZV9kcml2ZXIgcmVnaXN0ZXJlZFxuIik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9LY29uZmlnIGIvZHJpdmVycy9jcnlwdG8vS2NvbmZpZwppbmRleCAxYWY5NGUyLi45YjAzNWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9LY29uZmlnCisrKyBiL2RyaXZlcnMvY3J5cHRvL0tjb25maWcKQEAgLTU1MCw0ICs1NTAsNiBAQAogCSAgVGhpcyBkcml2ZXIgaW50ZXJmYWNlcyB3aXRoIHRoZSBoYXJkd2FyZSBjcnlwdG8gYWNjZWxlcmF0b3IuCiAJICBTdXBwb3J0aW5nIGNiYy9lY2IgY2hhaW5tb2RlLCBhbmQgYWVzL2Rlcy9kZXMzX2VkZSBjaXBoZXIgbW9kZS4KIAorc291cmNlICJkcml2ZXJzL2NyeXB0by9jaGVsc2lvL0tjb25maWciCisKIGVuZGlmICMgQ1JZUFRPX0hXCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9NYWtlZmlsZSBiL2RyaXZlcnMvY3J5cHRvL01ha2VmaWxlCmluZGV4IDNjNjQzMmRkLi5hZDcyNTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NyeXB0by9NYWtlZmlsZQpAQCAtMzEsMyArMzEsNCBAQAogb2JqLSQoQ09ORklHX0NSWVBUT19ERVZfVk1YKSArPSB2bXgvCiBvYmotJChDT05GSUdfQ1JZUFRPX0RFVl9TVU40SV9TUykgKz0gc3VueGktc3MvCiBvYmotJChDT05GSUdfQ1JZUFRPX0RFVl9ST0NLQ0hJUCkgKz0gcm9ja2NoaXAvCitvYmotJChDT05GSUdfQ1JZUFRPX0RFVl9DSEVMU0lPKSArPSBjaGVsc2lvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtYWxnLmMgYi9kcml2ZXJzL2NyeXB0by9jYWFtL2NhYW1hbGcuYwppbmRleCBlYTgxODlmLi5iMzA0NDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9jYWFtL2NhYW1hbGcuYworKysgYi9kcml2ZXJzL2NyeXB0by9jYWFtL2NhYW1hbGcuYwpAQCAtNDQxLDYgKzQ0MSw5IEBACiAJCQkgICAgICAgT1BfQUxHX0FBSV9DVFJfTU9EMTI4KTsKIAljb25zdCBib29sIGlzX3JmYzM2ODYgPSBhbGctPmNhYW0ucmZjMzY4NjsKIAorCWlmICghY3R4LT5hdXRoc2l6ZSkKKwkJcmV0dXJuIDA7CisKIAkvKiBOVUxMIGVuY3J5cHRpb24gLyBkZWNyeXB0aW9uICovCiAJaWYgKCFjdHgtPmVuY2tleWxlbikKIAkJcmV0dXJuIGFlYWRfbnVsbF9zZXRfc2hfZGVzYyhhZWFkKTsKQEAgLTU1Myw3ICs1NTYsMTAgQEAKIAogCS8qIFJlYWQgYW5kIHdyaXRlIGFzc29jbGVuIGJ5dGVzICovCiAJYXBwZW5kX21hdGhfYWRkKGRlc2MsIFZBUlNFUUlOTEVOLCBaRVJPLCBSRUczLCBDQUFNX0NNRF9TWik7Ci0JYXBwZW5kX21hdGhfYWRkKGRlc2MsIFZBUlNFUU9VVExFTiwgWkVSTywgUkVHMywgQ0FBTV9DTURfU1opOworCWlmIChhbGctPmNhYW0uZ2VuaXYpCisJCWFwcGVuZF9tYXRoX2FkZF9pbW1fdTMyKGRlc2MsIFZBUlNFUU9VVExFTiwgUkVHMywgSU1NLCBpdnNpemUpOworCWVsc2UKKwkJYXBwZW5kX21hdGhfYWRkKGRlc2MsIFZBUlNFUU9VVExFTiwgWkVSTywgUkVHMywgQ0FBTV9DTURfU1opOwogCiAJLyogU2tpcCBhc3NvYyBkYXRhICovCiAJYXBwZW5kX3NlcV9maWZvX3N0b3JlKGRlc2MsIDAsIEZJRk9TVF9UWVBFX1NLSVAgfCBGSUZPTERTVF9WTEYpOwpAQCAtNTYyLDYgKzU2OCwxNCBAQAogCWFwcGVuZF9zZXFfZmlmb19sb2FkKGRlc2MsIDAsIEZJRk9MRF9DTEFTU19DTEFTUzIgfCBGSUZPTERfVFlQRV9NU0cgfAogCQkJICAgICBLRVlfVkxGKTsKIAorCWlmIChhbGctPmNhYW0uZ2VuaXYpIHsKKwkJYXBwZW5kX3NlcV9sb2FkKGRlc2MsIGl2c2l6ZSwgTERTVF9DTEFTU18xX0NDQiB8CisJCQkJTERTVF9TUkNEU1RfQllURV9DT05URVhUIHwKKwkJCQkoY3R4MV9pdl9vZmYgPDwgTERTVF9PRkZTRVRfU0hJRlQpKTsKKwkJYXBwZW5kX21vdmUoZGVzYywgTU9WRV9TUkNfQ0xBU1MxQ1RYIHwgTU9WRV9ERVNUX0NMQVNTMklORklGTyB8CisJCQkgICAgKGN0eDFfaXZfb2ZmIDw8IE1PVkVfT0ZGU0VUX1NISUZUKSB8IGl2c2l6ZSk7CisJfQorCiAJLyogTG9hZCBDb3VudGVyIGludG8gQ09OVEVYVDEgcmVnICovCiAJaWYgKGlzX3JmYzM2ODYpCiAJCWFwcGVuZF9sb2FkX2ltbV91MzIoZGVzYywgYmUzMl90b19jcHUoMSksIExEU1RfSU1NIHwKQEAgLTYxNCw3ICs2MjgsNyBAQAogCQlrZXlzX2ZpdF9pbmxpbmUgPSB0cnVlOwogCiAJLyogYWVhZF9naXZlbmNyeXB0IHNoYXJlZCBkZXNjcmlwdG9yICovCi0JZGVzYyA9IGN0eC0+c2hfZGVzY19naXZlbmM7CisJZGVzYyA9IGN0eC0+c2hfZGVzY19lbmM7CiAKIAkvKiBOb3RlOiBDb250ZXh0IHJlZ2lzdGVycyBhcmUgc2F2ZWQuICovCiAJaW5pdF9zaF9kZXNjX2tleV9hZWFkKGRlc2MsIGN0eCwga2V5c19maXRfaW5saW5lLCBpc19yZmMzNjg2KTsKQEAgLTY0NSwxMyArNjU5LDEzIEBACiAJYXBwZW5kX29wZXJhdGlvbihkZXNjLCBjdHgtPmNsYXNzMl9hbGdfdHlwZSB8CiAJCQkgT1BfQUxHX0FTX0lOSVRGSU5BTCB8IE9QX0FMR19FTkNSWVBUKTsKIAotCS8qIGl2c2l6ZSArIGNyeXB0bGVuID0gc2Vxb3V0bGVuIC0gYXV0aHNpemUgKi8KLQlhcHBlbmRfbWF0aF9zdWJfaW1tX3UzMihkZXNjLCBSRUczLCBTRVFPVVRMRU4sIElNTSwgY3R4LT5hdXRoc2l6ZSk7Ci0KIAkvKiBSZWFkIGFuZCB3cml0ZSBhc3NvY2xlbiBieXRlcyAqLwogCWFwcGVuZF9tYXRoX2FkZChkZXNjLCBWQVJTRVFJTkxFTiwgWkVSTywgUkVHMywgQ0FBTV9DTURfU1opOwogCWFwcGVuZF9tYXRoX2FkZChkZXNjLCBWQVJTRVFPVVRMRU4sIFpFUk8sIFJFRzMsIENBQU1fQ01EX1NaKTsKIAorCS8qIGl2c2l6ZSArIGNyeXB0bGVuID0gc2Vxb3V0bGVuIC0gYXV0aHNpemUgKi8KKwlhcHBlbmRfbWF0aF9zdWJfaW1tX3UzMihkZXNjLCBSRUczLCBTRVFPVVRMRU4sIElNTSwgY3R4LT5hdXRoc2l6ZSk7CisKIAkvKiBTa2lwIGFzc29jIGRhdGEgKi8KIAlhcHBlbmRfc2VxX2ZpZm9fc3RvcmUoZGVzYywgMCwgRklGT1NUX1RZUEVfU0tJUCB8IEZJRk9MRFNUX1ZMRik7CiAKQEAgLTY5Nyw3ICs3MTEsNyBAQAogCWN0eC0+c2hfZGVzY19lbmNfZG1hID0gZG1hX21hcF9zaW5nbGUoanJkZXYsIGRlc2MsCiAJCQkJCSAgICAgIGRlc2NfYnl0ZXMoZGVzYyksCiAJCQkJCSAgICAgIERNQV9UT19ERVZJQ0UpOwotCWlmIChkbWFfbWFwcGluZ19lcnJvcihqcmRldiwgY3R4LT5zaF9kZXNjX2dpdmVuY19kbWEpKSB7CisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGpyZGV2LCBjdHgtPnNoX2Rlc2NfZW5jX2RtYSkpIHsKIAkJZGV2X2VycihqcmRldiwgInVuYWJsZSB0byBtYXAgc2hhcmVkIGRlc2NyaXB0b3JcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yMTQ3LDcgKzIxNjEsNyBAQAogCiAJaW5pdF9hZWFkX2pvYihyZXEsIGVkZXNjLCBhbGxfY29udGlnLCBlbmNyeXB0KTsKIAotCWlmIChpdnNpemUgJiYgKGlzX3JmYzM2ODYgfHwgIShhbGctPmNhYW0uZ2VuaXYgJiYgZW5jcnlwdCkpKQorCWlmIChpdnNpemUgJiYgKChpc19yZmMzNjg2ICYmIGVuY3J5cHQpIHx8ICFhbGctPmNhYW0uZ2VuaXYpKQogCQlhcHBlbmRfbG9hZF9hc19pbW0oZGVzYywgcmVxLT5pdiwgaXZzaXplLAogCQkJCSAgIExEU1RfQ0xBU1NfMV9DQ0IgfAogCQkJCSAgIExEU1RfU1JDRFNUX0JZVEVfQ09OVEVYVCB8CkBAIC0yNTM0LDIwICsyNTQ4LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGFlYWRfZ2l2ZGVjcnlwdChzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEpCi17Ci0Jc3RydWN0IGNyeXB0b19hZWFkICphZWFkID0gY3J5cHRvX2FlYWRfcmVxdGZtKHJlcSk7Ci0JdW5zaWduZWQgaW50IGl2c2l6ZSA9IGNyeXB0b19hZWFkX2l2c2l6ZShhZWFkKTsKLQotCWlmIChyZXEtPmNyeXB0bGVuIDwgaXZzaXplKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJlcS0+Y3J5cHRsZW4gLT0gaXZzaXplOwotCXJlcS0+YXNzb2NsZW4gKz0gaXZzaXplOwotCi0JcmV0dXJuIGFlYWRfZGVjcnlwdChyZXEpOwotfQotCiAvKgogICogYWxsb2NhdGUgYW5kIG1hcCB0aGUgYWJsa2NpcGhlciBleHRlbmRlZCBkZXNjcmlwdG9yIGZvciBhYmxrY2lwaGVyCiAgKi8KQEAgLTMyMDcsNyArMzIwNyw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IEFFU19CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gTUQ1X0RJR0VTVF9TSVpFLAogCQl9LApAQCAtMzI1Myw3ICszMjUzLDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gQUVTX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEExX0RJR0VTVF9TSVpFLAogCQl9LApAQCAtMzI5OSw3ICszMjk5LDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gQUVTX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEEyMjRfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC0zMzQ1LDcgKzMzNDUsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBBRVNfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTI1Nl9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTMzOTEsNyArMzM5MSw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IEFFU19CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMzg0X0RJR0VTVF9TSVpFLAogCQl9LApAQCAtMzQzNyw3ICszNDM3LDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gQUVTX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEE1MTJfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC0zNDgzLDcgKzM0ODMsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBERVMzX0VERV9CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gTUQ1X0RJR0VTVF9TSVpFLAogCQl9LApAQCAtMzUzMSw3ICszNTMxLDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gREVTM19FREVfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTFfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC0zNTc5LDcgKzM1NzksNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBERVMzX0VERV9CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMjI0X0RJR0VTVF9TSVpFLAogCQl9LApAQCAtMzYyNyw3ICszNjI3LDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gREVTM19FREVfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTI1Nl9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTM2NzUsNyArMzY3NSw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IERFUzNfRURFX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEEzODRfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC0zNzIzLDcgKzM3MjMsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBERVMzX0VERV9CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBNTEyX0RJR0VTVF9TSVpFLAogCQl9LApAQCAtMzc2OSw3ICszNzY5LDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gREVTX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBNRDVfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC0zODE1LDcgKzM4MTUsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBERVNfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTFfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC0zODYxLDcgKzM4NjEsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBERVNfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTIyNF9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTM5MDcsNyArMzkwNyw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IERFU19CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMjU2X0RJR0VTVF9TSVpFLAogCQl9LApAQCAtMzk1Myw3ICszOTUzLDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gREVTX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEEzODRfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC0zOTk5LDcgKzM5OTksNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBERVNfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTUxMl9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTQwNDgsNyArNDA0OCw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IENUUl9SRkMzNjg2X0lWX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBNRDVfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC00MDk5LDcgKzQwOTksNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBDVFJfUkZDMzY4Nl9JVl9TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMV9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTQxNTAsNyArNDE1MCw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IENUUl9SRkMzNjg2X0lWX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEEyMjRfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC00MjAxLDcgKzQyMDEsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBDVFJfUkZDMzY4Nl9JVl9TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMjU2X0RJR0VTVF9TSVpFLAogCQl9LApAQCAtNDI1Miw3ICs0MjUyLDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gQ1RSX1JGQzM2ODZfSVZfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTM4NF9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTQzMDMsNyArNDMwMyw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IENUUl9SRkMzNjg2X0lWX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEE1MTJfRElHRVNUX1NJWkUsCiAJCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9jYWFtL2NhYW1oYXNoLmMgYi9kcml2ZXJzL2NyeXB0by9jYWFtL2NhYW1oYXNoLmMKaW5kZXggZjFlY2M4ZC4uMzYzNjViMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtaGFzaC5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL2NhYW0vY2FhbWhhc2guYwpAQCAtMTg5OCw2ICsxODk4LDcgQEAKIAkJCSB0ZW1wbGF0ZS0+bmFtZSk7CiAJCXNucHJpbnRmKGFsZy0+Y3JhX2RyaXZlcl9uYW1lLCBDUllQVE9fTUFYX0FMR19OQU1FLCAiJXMiLAogCQkJIHRlbXBsYXRlLT5kcml2ZXJfbmFtZSk7CisJCXRfYWxnLT5haGFzaF9hbGcuc2V0a2V5ID0gTlVMTDsKIAl9CiAJYWxnLT5jcmFfbW9kdWxlID0gVEhJU19NT0RVTEU7CiAJYWxnLT5jcmFfaW5pdCA9IGNhYW1faGFzaF9jcmFfaW5pdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vS2NvbmZpZyBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2U2N2ZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9LY29uZmlnCkBAIC0wLDAgKzEsMTkgQEAKK2NvbmZpZyBDUllQVE9fREVWX0NIRUxTSU8KKwl0cmlzdGF0ZSAiQ2hlbHNpbyBDcnlwdG8gQ28tcHJvY2Vzc29yIERyaXZlciIKKwlkZXBlbmRzIG9uIENIRUxTSU9fVDQKKwlzZWxlY3QgQ1JZUFRPX1NIQTEKKwlzZWxlY3QgQ1JZUFRPX1NIQTI1NgorCXNlbGVjdCBDUllQVE9fU0hBNTEyCisJLS0taGVscC0tLQorCSAgVGhlIENoZWxzaW8gQ3J5cHRvIENvLXByb2Nlc3NvciBkcml2ZXIgZm9yIFQ2IGFkYXB0ZXJzLgorCisJICBGb3IgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBDaGVsc2lvIGFuZCBvdXIgcHJvZHVjdHMsIHZpc2l0CisJICBvdXIgd2Vic2l0ZSBhdCA8aHR0cDovL3d3dy5jaGVsc2lvLmNvbT4uCisKKwkgIEZvciBjdXN0b21lciBzdXBwb3J0LCBwbGVhc2UgdmlzaXQgb3VyIGN1c3RvbWVyIHN1cHBvcnQgcGFnZSBhdAorCSAgPGh0dHA6Ly93d3cuY2hlbHNpby5jb20vc3VwcG9ydC5odG1sPi4KKworCSAgUGxlYXNlIHNlbmQgZmVlZGJhY2sgdG8gPGxpbnV4LWJ1Z3NAY2hlbHNpby5jb20+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBjaGNyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9NYWtlZmlsZSBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViZGYwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACitjY2ZsYWdzLXkgOj0gLUlkcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0CisKK29iai0kKENPTkZJR19DUllQVE9fREVWX0NIRUxTSU8pICs9IGNoY3IubworY2hjci1vYmpzIDo9ICBjaGNyX2NvcmUubyBjaGNyX2FsZ28ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9jaGNyX2FsZ28uYyBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9hbGdvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkZGI5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9hbGdvLmMKQEAgLTAsMCArMSwxNTI1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDYgQ3J5cHRvIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogV3JpdHRlbiBhbmQgTWFpbnRhaW5lZCBieToKKyAqCU1hbm9qIE1hbHZpeWEgKG1hbm9qbWFsdml5YUBjaGVsc2lvLmNvbSkKKyAqCUF0dWwgR3VwdGEgKGF0dWwuZ3VwdGFAY2hlbHNpby5jb20pCisgKglKaXRlbmRyYSBMdWxsYSAoamx1bGxhQGNoZWxzaW8uY29tKQorICoJWWVzaGFzd2kgTSBSIEdvd2RhICh5ZXNoYXN3aUBjaGVsc2lvLmNvbSkKKyAqCUhhcnNoIEphaW4gKGhhcnNoQGNoZWxzaW8uY29tKQorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgImNoY3I6IiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0b2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKworI2luY2x1ZGUgPGNyeXB0by9hZXMuaD4KKyNpbmNsdWRlIDxjcnlwdG8vYWxnYXBpLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2hhc2guaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2hhc2guaD4KKworI2luY2x1ZGUgInQ0ZndfYXBpLmgiCisjaW5jbHVkZSAidDRfbXNnLmgiCisjaW5jbHVkZSAiY2hjcl9jb3JlLmgiCisjaW5jbHVkZSAiY2hjcl9hbGdvLmgiCisjaW5jbHVkZSAiY2hjcl9jcnlwdG8uaCIKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYWJsa19jdHggKkFCTEtfQ1RYKHN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCkKK3sKKwlyZXR1cm4gY3R4LT5jcnlwdG9fY3R4LT5hYmxrY3R4OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBobWFjX2N0eCAqSE1BQ19DVFgoc3RydWN0IGNoY3JfY29udGV4dCAqY3R4KQoreworCXJldHVybiBjdHgtPmNyeXB0b19jdHgtPmhtYWNjdHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVsZF9jdHggKlVMRF9DVFgoc3RydWN0IGNoY3JfY29udGV4dCAqY3R4KQoreworCXJldHVybiBjdHgtPmRldi0+dV9jdHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX29mbGRfaW1tKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChza2ItPmxlbiA8PSBDUllQVE9fTUFYX0lNTV9UWF9QS1RfTEVOKTsKK30KKworLyoKKyAqCXNnbF9sZW4gLSBjYWxjdWxhdGVzIHRoZSBzaXplIG9mIGFuIFNHTCBvZiB0aGUgZ2l2ZW4gY2FwYWNpdHkKKyAqCUBuOiB0aGUgbnVtYmVyIG9mIFNHTCBlbnRyaWVzCisgKglDYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgZmxpdHMgbmVlZGVkIGZvciBhIHNjYXR0ZXIvZ2F0aGVyIGxpc3QgdGhhdAorICoJY2FuIGhvbGQgdGhlIGdpdmVuIG51bWJlciBvZiBlbnRyaWVzLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzZ2xfbGVuKHVuc2lnbmVkIGludCBuKQoreworCW4tLTsKKwlyZXR1cm4gKDMgKiBuKSAvIDIgKyAobiAmIDEpICsgMjsKK30KKworLyoKKyAqCWNoY3JfaGFuZGxlX3Jlc3AgLSBVbm1hcCB0aGUgRE1BIGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0CisgKglAcmVxOiBjcnlwdG8gcmVxdWVzdAorICovCitpbnQgY2hjcl9oYW5kbGVfcmVzcChzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKnJlcSwgdW5zaWduZWQgY2hhciAqaW5wdXQsCisJCSAgICAgaW50IGVycm9yX3N0YXR1cykKK3sKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gcmVxLT50Zm07CisJc3RydWN0IGNoY3JfY29udGV4dCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwlzdHJ1Y3QgdWxkX2N0eCAqdV9jdHggPSBVTERfQ1RYKGN0eCk7CisJc3RydWN0IGNoY3JfcmVxX2N0eCBjdHhfcmVxOworCXN0cnVjdCBjcGxfZnc2X3BsZCAqZnc2X3BsZDsKKwl1bnNpZ25lZCBpbnQgZGlnZXN0c2l6ZSwgdXBkYXRlZF9kaWdlc3RzaXplOworCisJc3dpdGNoICh0Zm0tPl9fY3J0X2FsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19UWVBFX01BU0spIHsKKwljYXNlIENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVI6CisJCWN0eF9yZXEucmVxLmFibGtfcmVxID0gKHN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKilyZXE7CisJCWN0eF9yZXEuY3R4LmFibGtfY3R4ID0KKwkJCWFibGtjaXBoZXJfcmVxdWVzdF9jdHgoY3R4X3JlcS5yZXEuYWJsa19yZXEpOworCQlpZiAoIWVycm9yX3N0YXR1cykgeworCQkJZnc2X3BsZCA9IChzdHJ1Y3QgY3BsX2Z3Nl9wbGQgKilpbnB1dDsKKwkJCW1lbWNweShjdHhfcmVxLnJlcS5hYmxrX3JlcS0+aW5mbywgJmZ3Nl9wbGQtPmRhdGFbMl0sCisJCQkgICAgICAgQUVTX0JMT0NLX1NJWkUpOworCQl9CisJCWRtYV91bm1hcF9zZygmdV9jdHgtPmxsZGkucGRldi0+ZGV2LCBjdHhfcmVxLnJlcS5hYmxrX3JlcS0+ZHN0LAorCQkJICAgICBBQkxLX0NUWChjdHgpLT5kc3RfbmVudHMsIERNQV9GUk9NX0RFVklDRSk7CisJCWlmIChjdHhfcmVxLmN0eC5hYmxrX2N0eC0+c2tiKSB7CisJCQlrZnJlZV9za2IoY3R4X3JlcS5jdHguYWJsa19jdHgtPnNrYik7CisJCQljdHhfcmVxLmN0eC5hYmxrX2N0eC0+c2tiID0gTlVMTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0FIQVNIOgorCQljdHhfcmVxLnJlcS5haGFzaF9yZXEgPSAoc3RydWN0IGFoYXNoX3JlcXVlc3QgKilyZXE7CisJCWN0eF9yZXEuY3R4LmFoYXNoX2N0eCA9CisJCQlhaGFzaF9yZXF1ZXN0X2N0eChjdHhfcmVxLnJlcS5haGFzaF9yZXEpOworCQlkaWdlc3RzaXplID0KKwkJCWNyeXB0b19haGFzaF9kaWdlc3RzaXplKGNyeXB0b19haGFzaF9yZXF0Zm0oCisJCQkJCQkJY3R4X3JlcS5yZXEuYWhhc2hfcmVxKSk7CisJCXVwZGF0ZWRfZGlnZXN0c2l6ZSA9IGRpZ2VzdHNpemU7CisJCWlmIChkaWdlc3RzaXplID09IFNIQTIyNF9ESUdFU1RfU0laRSkKKwkJCXVwZGF0ZWRfZGlnZXN0c2l6ZSA9IFNIQTI1Nl9ESUdFU1RfU0laRTsKKwkJZWxzZSBpZiAoZGlnZXN0c2l6ZSA9PSBTSEEzODRfRElHRVNUX1NJWkUpCisJCQl1cGRhdGVkX2RpZ2VzdHNpemUgPSBTSEE1MTJfRElHRVNUX1NJWkU7CisJCWlmIChjdHhfcmVxLmN0eC5haGFzaF9jdHgtPnNrYikKKwkJCWN0eF9yZXEuY3R4LmFoYXNoX2N0eC0+c2tiID0gTlVMTDsKKwkJaWYgKGN0eF9yZXEuY3R4LmFoYXNoX2N0eC0+cmVzdWx0ID09IDEpIHsKKwkJCWN0eF9yZXEuY3R4LmFoYXNoX2N0eC0+cmVzdWx0ID0gMDsKKwkJCW1lbWNweShjdHhfcmVxLnJlcS5haGFzaF9yZXEtPnJlc3VsdCwgaW5wdXQgKworCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgY3BsX2Z3Nl9wbGQpLAorCQkJICAgICAgIGRpZ2VzdHNpemUpOworCQl9IGVsc2UgeworCQkJbWVtY3B5KGN0eF9yZXEuY3R4LmFoYXNoX2N0eC0+cGFydGlhbF9oYXNoLCBpbnB1dCArCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjcGxfZnc2X3BsZCksCisJCQkgICAgICAgdXBkYXRlZF9kaWdlc3RzaXplKTsKKwkJfQorCQlrZnJlZShjdHhfcmVxLmN0eC5haGFzaF9jdHgtPmR1bW15X3BheWxvYWRfcHRyKTsKKwkJY3R4X3JlcS5jdHguYWhhc2hfY3R4LT5kdW1teV9wYXlsb2FkX3B0ciA9IE5VTEw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCWNhbGNfdHhfZmxpdHNfb2ZsZCAtIGNhbGN1bGF0ZSAjIG9mIGZsaXRzIGZvciBhbiBvZmZsb2FkIHBhY2tldAorICoJQHNrYjogdGhlIHBhY2tldAorICoJUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZsaXRzIG5lZWRlZCBmb3IgdGhlIGdpdmVuIG9mZmxvYWQgcGFja2V0LgorICoJVGhlc2UgcGFja2V0cyBhcmUgYWxyZWFkeSBmdWxseSBjb25zdHJ1Y3RlZCBhbmQgbm8gYWRkaXRpb25hbCBoZWFkZXJzCisgKgl3aWxsIGJlIGFkZGVkLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjYWxjX3R4X2ZsaXRzX29mbGQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBpbnQgZmxpdHMsIGNudDsKKworCWlmIChpc19vZmxkX2ltbShza2IpKQorCQlyZXR1cm4gRElWX1JPVU5EX1VQKHNrYi0+bGVuLCA4KTsKKworCWZsaXRzID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSAvIDg7ICAgLyogaGVhZGVycyAqLworCWNudCA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJaWYgKHNrYl90YWlsX3BvaW50ZXIoc2tiKSAhPSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpKQorCQljbnQrKzsKKwlyZXR1cm4gZmxpdHMgKyBzZ2xfbGVuKGNudCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2hhc2hfZGVzYyAqY2hjcl9hbGxvY19zaGFzaCh1bnNpZ25lZCBpbnQgZHMpCit7CisJc3RydWN0IGNyeXB0b19zaGFzaCAqYmFzZV9oYXNoID0gTlVMTDsKKwlzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYzsKKworCXN3aXRjaCAoZHMpIHsKKwljYXNlIFNIQTFfRElHRVNUX1NJWkU6CisJCWJhc2VfaGFzaCA9IGNyeXB0b19hbGxvY19zaGFzaCgic2hhMS1nZW5lcmljIiwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgU0hBMjI0X0RJR0VTVF9TSVpFOgorCQliYXNlX2hhc2ggPSBjcnlwdG9fYWxsb2Nfc2hhc2goInNoYTIyNC1nZW5lcmljIiwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgU0hBMjU2X0RJR0VTVF9TSVpFOgorCQliYXNlX2hhc2ggPSBjcnlwdG9fYWxsb2Nfc2hhc2goInNoYTI1Ni1nZW5lcmljIiwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgU0hBMzg0X0RJR0VTVF9TSVpFOgorCQliYXNlX2hhc2ggPSBjcnlwdG9fYWxsb2Nfc2hhc2goInNoYTM4NC1nZW5lcmljIiwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgU0hBNTEyX0RJR0VTVF9TSVpFOgorCQliYXNlX2hhc2ggPSBjcnlwdG9fYWxsb2Nfc2hhc2goInNoYTUxMi1nZW5lcmljIiwgMCwgMCk7CisJCWJyZWFrOworCX0KKwlpZiAoSVNfRVJSKGJhc2VfaGFzaCkpIHsKKwkJcHJfZXJyKCJDYW4gbm90IGFsbG9jYXRlIHNoYS1nZW5lcmljIGFsZ28uXG4iKTsKKwkJcmV0dXJuICh2b2lkICopYmFzZV9oYXNoOworCX0KKworCWRlc2MgPSBrbWFsbG9jKHNpemVvZigqZGVzYykgKyBjcnlwdG9fc2hhc2hfZGVzY3NpemUoYmFzZV9oYXNoKSwKKwkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghZGVzYykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJZGVzYy0+dGZtID0gYmFzZV9oYXNoOworCWRlc2MtPmZsYWdzID0gY3J5cHRvX3NoYXNoX2dldF9mbGFncyhiYXNlX2hhc2gpOworCXJldHVybiBkZXNjOworfQorCitzdGF0aWMgaW50IGNoY3JfY29tcHV0ZV9wYXJ0aWFsX2hhc2goc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsCisJCQkJICAgICBjaGFyICppb3BhZCwgY2hhciAqcmVzdWx0X2hhc2gsCisJCQkJICAgICBpbnQgZGlnZXN0X3NpemUpCit7CisJc3RydWN0IHNoYTFfc3RhdGUgc2hhMV9zdDsKKwlzdHJ1Y3Qgc2hhMjU2X3N0YXRlIHNoYTI1Nl9zdDsKKwlzdHJ1Y3Qgc2hhNTEyX3N0YXRlIHNoYTUxMl9zdDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoZGlnZXN0X3NpemUgPT0gU0hBMV9ESUdFU1RfU0laRSkgeworCQllcnJvciA9IGNyeXB0b19zaGFzaF9pbml0KGRlc2MpID86CisJCQljcnlwdG9fc2hhc2hfdXBkYXRlKGRlc2MsIGlvcGFkLCBTSEExX0JMT0NLX1NJWkUpID86CisJCQljcnlwdG9fc2hhc2hfZXhwb3J0KGRlc2MsICh2b2lkICopJnNoYTFfc3QpOworCQltZW1jcHkocmVzdWx0X2hhc2gsIHNoYTFfc3Quc3RhdGUsIFNIQTFfRElHRVNUX1NJWkUpOworCX0gZWxzZSBpZiAoZGlnZXN0X3NpemUgPT0gU0hBMjI0X0RJR0VTVF9TSVpFKSB7CisJCWVycm9yID0gY3J5cHRvX3NoYXNoX2luaXQoZGVzYykgPzoKKwkJCWNyeXB0b19zaGFzaF91cGRhdGUoZGVzYywgaW9wYWQsIFNIQTI1Nl9CTE9DS19TSVpFKSA/OgorCQkJY3J5cHRvX3NoYXNoX2V4cG9ydChkZXNjLCAodm9pZCAqKSZzaGEyNTZfc3QpOworCQltZW1jcHkocmVzdWx0X2hhc2gsIHNoYTI1Nl9zdC5zdGF0ZSwgU0hBMjU2X0RJR0VTVF9TSVpFKTsKKworCX0gZWxzZSBpZiAoZGlnZXN0X3NpemUgPT0gU0hBMjU2X0RJR0VTVF9TSVpFKSB7CisJCWVycm9yID0gY3J5cHRvX3NoYXNoX2luaXQoZGVzYykgPzoKKwkJCWNyeXB0b19zaGFzaF91cGRhdGUoZGVzYywgaW9wYWQsIFNIQTI1Nl9CTE9DS19TSVpFKSA/OgorCQkJY3J5cHRvX3NoYXNoX2V4cG9ydChkZXNjLCAodm9pZCAqKSZzaGEyNTZfc3QpOworCQltZW1jcHkocmVzdWx0X2hhc2gsIHNoYTI1Nl9zdC5zdGF0ZSwgU0hBMjU2X0RJR0VTVF9TSVpFKTsKKworCX0gZWxzZSBpZiAoZGlnZXN0X3NpemUgPT0gU0hBMzg0X0RJR0VTVF9TSVpFKSB7CisJCWVycm9yID0gY3J5cHRvX3NoYXNoX2luaXQoZGVzYykgPzoKKwkJCWNyeXB0b19zaGFzaF91cGRhdGUoZGVzYywgaW9wYWQsIFNIQTUxMl9CTE9DS19TSVpFKSA/OgorCQkJY3J5cHRvX3NoYXNoX2V4cG9ydChkZXNjLCAodm9pZCAqKSZzaGE1MTJfc3QpOworCQltZW1jcHkocmVzdWx0X2hhc2gsIHNoYTUxMl9zdC5zdGF0ZSwgU0hBNTEyX0RJR0VTVF9TSVpFKTsKKworCX0gZWxzZSBpZiAoZGlnZXN0X3NpemUgPT0gU0hBNTEyX0RJR0VTVF9TSVpFKSB7CisJCWVycm9yID0gY3J5cHRvX3NoYXNoX2luaXQoZGVzYykgPzoKKwkJCWNyeXB0b19zaGFzaF91cGRhdGUoZGVzYywgaW9wYWQsIFNIQTUxMl9CTE9DS19TSVpFKSA/OgorCQkJY3J5cHRvX3NoYXNoX2V4cG9ydChkZXNjLCAodm9pZCAqKSZzaGE1MTJfc3QpOworCQltZW1jcHkocmVzdWx0X2hhc2gsIHNoYTUxMl9zdC5zdGF0ZSwgU0hBNTEyX0RJR0VTVF9TSVpFKTsKKwl9IGVsc2UgeworCQllcnJvciA9IC1FSU5WQUw7CisJCXByX2VycigiVW5rbm93biBkaWdlc3Qgc2l6ZSAlZFxuIiwgZGlnZXN0X3NpemUpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIGNoY3JfY2hhbmdlX29yZGVyKGNoYXIgKmJ1ZiwgaW50IGRzKQoreworCWludCBpOworCisJaWYgKGRzID09IFNIQTUxMl9ESUdFU1RfU0laRSkgeworCQlmb3IgKGkgPSAwOyBpIDwgKGRzIC8gc2l6ZW9mKHU2NCkpOyBpKyspCisJCQkqKChfX2JlNjQgKilidWYgKyBpKSA9CisJCQkJY3B1X3RvX2JlNjQoKigodTY0ICopYnVmICsgaSkpOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCAoZHMgLyBzaXplb2YodTMyKSk7IGkrKykKKwkJCSooKF9fYmUzMiAqKWJ1ZiArIGkpID0KKwkJCQljcHVfdG9fYmUzMigqKCh1MzIgKilidWYgKyBpKSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBpc19obWFjKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3RydWN0IGNyeXB0b19hbGcgKmFsZyA9IHRmbS0+X19jcnRfYWxnOworCXN0cnVjdCBjaGNyX2FsZ190ZW1wbGF0ZSAqY2hjcl9jcnlwdG9fYWxnID0KKwkJY29udGFpbmVyX29mKF9fY3J5cHRvX2FoYXNoX2FsZyhhbGcpLCBzdHJ1Y3QgY2hjcl9hbGdfdGVtcGxhdGUsCisJCQkgICAgIGFsZy5oYXNoKTsKKwlpZiAoKGNoY3JfY3J5cHRvX2FsZy0+dHlwZSAmIENSWVBUT19BTEdfU1VCX1RZUEVfTUFTSykgPT0KKwkgICAgQ1JZUFRPX0FMR19TVUJfVFlQRV9IQVNIX0hNQUMpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjaF9uZW50cyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKnRvdGFsX3NpemUpCit7CisJdW5zaWduZWQgaW50IG5lbnRzOworCisJZm9yIChuZW50cyA9IDAsICp0b3RhbF9zaXplID0gMDsgc2c7IHNnID0gc2dfbmV4dChzZykpIHsKKwkJbmVudHMrKzsKKwkJKnRvdGFsX3NpemUgKz0gc2ctPmxlbmd0aDsKKwl9CisJcmV0dXJuIG5lbnRzOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9waHlzX2NwbChzdHJ1Y3QgY3BsX3J4X3BoeXNfZHNnbCAqcGh5c19jcGwsCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJICAgc3RydWN0IHBoeXNfc2dlX3Bhcm0gKnNnX3BhcmFtKQoreworCXN0cnVjdCBwaHlzX3NnZV9wYWlycyAqdG87CisJdW5zaWduZWQgaW50IG91dF9idWZfc2l6ZSA9IHNnX3BhcmFtLT5vYnNpemU7CisJdW5zaWduZWQgaW50IG5lbnRzID0gc2dfcGFyYW0tPm5lbnRzLCBpLCBqLCB0b3RfbGVuID0gMDsKKworCXBoeXNfY3BsLT5vcF90b190aWQgPSBodG9ubChDUExfUlhfUEhZU19EU0dMX09QQ09ERV9WKENQTF9SWF9QSFlTX0RTR0wpCisJCQkJICAgIHwgQ1BMX1JYX1BIWVNfRFNHTF9JU1JETUFfVigwKSk7CisJcGh5c19jcGwtPnBjaXJseG9yZGVyX3RvX25vb2ZzZ2VudHIgPQorCQlodG9ubChDUExfUlhfUEhZU19EU0dMX1BDSVJMWE9SREVSX1YoMCkgfAorCQkgICAgICBDUExfUlhfUEhZU19EU0dMX1BDSU5PU05PT1BfVigwKSB8CisJCSAgICAgIENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRFTkJfVigwKSB8CisJCSAgICAgIENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRfVigwKSB8CisJCSAgICAgIENQTF9SWF9QSFlTX0RTR0xfRENBSURfVigwKSB8CisJCSAgICAgIENQTF9SWF9QSFlTX0RTR0xfTk9PRlNHRU5UUl9WKG5lbnRzKSk7CisJcGh5c19jcGwtPnJzc19oZHJfaW50Lm9wY29kZSA9IENQTF9SWF9QSFlTX0FERFI7CisJcGh5c19jcGwtPnJzc19oZHJfaW50LnFpZCA9IGh0b25zKHNnX3BhcmFtLT5xaWQpOworCXBoeXNfY3BsLT5yc3NfaGRyX2ludC5oYXNoX3ZhbCA9IDA7CisJdG8gPSAoc3RydWN0IHBoeXNfc2dlX3BhaXJzICopKCh1bnNpZ25lZCBjaGFyICopcGh5c19jcGwgKworCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNwbF9yeF9waHlzX2RzZ2wpKTsKKworCWZvciAoaSA9IDA7IG5lbnRzOyB0bysrKSB7CisJCWZvciAoaiA9IGk7IChuZW50cyAmJiAoaiA8ICg4ICsgaSkpKTsgaisrLCBuZW50cy0tKSB7CisJCQl0by0+bGVuW2pdID0gaHRvbnMoc2ctPmxlbmd0aCk7CisJCQl0by0+YWRkcltqXSA9IGNwdV90b19iZTY0KHNnX2RtYV9hZGRyZXNzKHNnKSk7CisJCQlpZiAob3V0X2J1Zl9zaXplKSB7CisJCQkJaWYgKHRvdF9sZW4gKyBzZ19kbWFfbGVuKHNnKSA+PSBvdXRfYnVmX3NpemUpIHsKKwkJCQkJdG8tPmxlbltqXSA9IGh0b25zKG91dF9idWZfc2l6ZSAtCisJCQkJCQkJICAgdG90X2xlbik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJdG90X2xlbiArPSBzZ19kbWFfbGVuKHNnKTsKKwkJCX0KKwkJCXNnID0gc2dfbmV4dChzZyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQKK2ludCBtYXBfd3JpdGVzZ19waHlzX2NwbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBjcGxfcnhfcGh5c19kc2dsICpwaHlzX2NwbCwKKwkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBzdHJ1Y3QgcGh5c19zZ2VfcGFybSAqc2dfcGFyYW0pCit7CisJaWYgKCFzZyB8fCAhc2dfcGFyYW0tPm5lbnRzKQorCQlyZXR1cm4gMDsKKworCXNnX3BhcmFtLT5uZW50cyA9IGRtYV9tYXBfc2coZGV2LCBzZywgc2dfcGFyYW0tPm5lbnRzLCBETUFfRlJPTV9ERVZJQ0UpOworCWlmIChzZ19wYXJhbS0+bmVudHMgPT0gMCkgeworCQlwcl9lcnIoIkNIQ1IgOiBETUEgbWFwcGluZyBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd3JpdGVfcGh5c19jcGwocGh5c19jcGwsIHNnLCBzZ19wYXJhbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9jcnlwdG9hbGdfc3VidHlwZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSB0Zm0tPl9fY3J0X2FsZzsKKwlzdHJ1Y3QgY2hjcl9hbGdfdGVtcGxhdGUgKmNoY3JfY3J5cHRvX2FsZyA9CisJCWNvbnRhaW5lcl9vZihhbGcsIHN0cnVjdCBjaGNyX2FsZ190ZW1wbGF0ZSwgYWxnLmNyeXB0byk7CisKKwlyZXR1cm4gY2hjcl9jcnlwdG9fYWxnLT50eXBlICYgQ1JZUFRPX0FMR19TVUJfVFlQRV9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3dyaXRlX3NnX2RhdGFfcGFnZV9kZXNjKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCAqZnJhZ3MsCisJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IHBhZ2UgKnNwYWdlOworCXVuc2lnbmVkIGludCBwYWdlX2xlbjsKKworCXNrYi0+bGVuICs9IGNvdW50OworCXNrYi0+ZGF0YV9sZW4gKz0gY291bnQ7CisJc2tiLT50cnVlc2l6ZSArPSBjb3VudDsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCWlmIChzZyAmJiAoIShzZy0+bGVuZ3RoKSkpCisJCQlicmVhazsKKwkJc3BhZ2UgPSBzZ19wYWdlKHNnKTsKKwkJZ2V0X3BhZ2Uoc3BhZ2UpOworCQlwYWdlX2xlbiA9IG1pbihzZy0+bGVuZ3RoLCBjb3VudCk7CisJCXNrYl9maWxsX3BhZ2VfZGVzYyhza2IsICpmcmFncywgc3BhZ2UsIHNnLT5vZmZzZXQsIHBhZ2VfbGVuKTsKKwkJKCpmcmFncykrKzsKKwkJY291bnQgLT0gcGFnZV9sZW47CisJCXNnID0gc2dfbmV4dChzZyk7CisJfQorfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX2NvcHlfcnJrZXkoc3RydWN0IGFibGtfY3R4ICphYmxrY3R4LAorCQkJICAgICAgIHN0cnVjdCBfa2V5X2N0eCAqa2V5X2N0eCkKK3sKKwlpZiAoYWJsa2N0eC0+Y2lwaF9tb2RlID09IENIQ1JfU0NNRF9DSVBIRVJfTU9ERV9BRVNfQ0JDKSB7CisJCWdldF9hZXNfZGVjcnlwdF9rZXkoa2V5X2N0eC0+a2V5LCBhYmxrY3R4LT5rZXksCisJCQkJICAgIGFibGtjdHgtPmVuY2tleV9sZW4gPDwgMyk7CisJCW1lbXNldChrZXlfY3R4LT5rZXkgKyBhYmxrY3R4LT5lbmNrZXlfbGVuLCAwLAorCQkgICAgICAgQ0hDUl9BRVNfTUFYX0tFWV9MRU4gLSBhYmxrY3R4LT5lbmNrZXlfbGVuKTsKKwl9IGVsc2UgeworCQltZW1jcHkoa2V5X2N0eC0+a2V5LAorCQkgICAgICAgYWJsa2N0eC0+a2V5ICsgKGFibGtjdHgtPmVuY2tleV9sZW4gPj4gMSksCisJCSAgICAgICBhYmxrY3R4LT5lbmNrZXlfbGVuID4+IDEpOworCQlnZXRfYWVzX2RlY3J5cHRfa2V5KGtleV9jdHgtPmtleSArIChhYmxrY3R4LT5lbmNrZXlfbGVuID4+IDEpLAorCQkJCSAgICBhYmxrY3R4LT5rZXksIGFibGtjdHgtPmVuY2tleV9sZW4gPDwgMik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3JlYXRlX3dyZXEoc3RydWN0IGNoY3JfY29udGV4dCAqY3R4LAorCQkJICAgICAgIHN0cnVjdCBmd19jcnlwdG9fbG9va2FzaWRlX3dyICp3cmVxLAorCQkJICAgICAgIHZvaWQgKnJlcSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBpbnQga2N0eF9sZW4sIGludCBoYXNoX3N6LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBwaHlzX2RzZ2wpCit7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4ID0gVUxEX0NUWChjdHgpOworCXN0cnVjdCB1bHBfdHhwa3QgKnVscHR4ID0gKHN0cnVjdCB1bHBfdHhwa3QgKikod3JlcSArIDEpOworCXN0cnVjdCB1bHB0eF9pZGF0YSAqc2NfaW1tID0gKHN0cnVjdCB1bHB0eF9pZGF0YSAqKSh1bHB0eCArIDEpOworCWludCBpdl9sb2MgPSBJVl9EU0dMOworCWludCBxaWQgPSB1X2N0eC0+bGxkaS5yeHFfaWRzW2N0eC0+dHhfY2hhbm5lbF9pZF07CisJdW5zaWduZWQgaW50IGltbWRhdGFsZW4gPSAwLCBucl9mcmFncyA9IDA7CisKKwlpZiAoaXNfb2ZsZF9pbW0oc2tiKSkgeworCQlpbW1kYXRhbGVuID0gc2tiLT5kYXRhX2xlbjsKKwkJaXZfbG9jID0gSVZfSU1NRURJQVRFOworCX0gZWxzZSB7CisJCW5yX2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwl9CisKKwl3cmVxLT5vcF90b19jY3R4X3NpemUgPSBGSUxMX1dSX09QX0NDVFhfU0laRShpbW1kYXRhbGVuLAorCQkJCQkJICAgICAoa2N0eF9sZW4gPj4gNCkpOworCXdyZXEtPnBsZF9zaXplX2hhc2hfc2l6ZSA9CisJCWh0b25sKEZXX0NSWVBUT19MT09LQVNJREVfV1JfUExEX1NJWkVfVihzZ2xfbGVuZ3Roc1tucl9mcmFnc10pIHwKKwkJICAgICAgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9IQVNIX1NJWkVfVihoYXNoX3N6KSk7CisJd3JlcS0+bGVuMTZfcGtkID0gaHRvbmwoRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9MRU4xNl9WKERJVl9ST1VORF9VUCgKKwkJCQkgICAgKGNhbGNfdHhfZmxpdHNfb2ZsZChza2IpICogOCksIDE2KSkpOworCXdyZXEtPmNvb2tpZSA9IGNwdV90b19iZTY0KCh1aW50cHRyX3QpcmVxKTsKKwl3cmVxLT5yeF9jaGlkX3RvX3J4X3FfaWQgPQorCQlGSUxMX1dSX1JYX1FfSUQoY3R4LT5kZXYtPnR4X2NoYW5uZWxfaWQsIHFpZCwKKwkJCQkoaGFzaF9zeikgPyBJVl9OT1AgOiBpdl9sb2MpOworCisJdWxwdHgtPmNtZF9kZXN0ID0gRklMTF9VTFBUWF9DTURfREVTVChjdHgtPmRldi0+dHhfY2hhbm5lbF9pZCk7CisJdWxwdHgtPmxlbiA9IGh0b25sKChESVZfUk9VTkRfVVAoKGNhbGNfdHhfZmxpdHNfb2ZsZChza2IpICogOCksCisJCQkJCSAxNikgLSAoKHNpemVvZigqd3JlcSkpID4+IDQpKSk7CisKKwlzY19pbW0tPmNtZF9tb3JlID0gRklMTF9DTURfTU9SRShpbW1kYXRhbGVuKTsKKwlzY19pbW0tPmxlbiA9IGNwdV90b19iZTMyKHNpemVvZihzdHJ1Y3QgY3BsX3R4X3NlY19wZHUpICsga2N0eF9sZW4gKworCQkJCSAgKChoYXNoX3N6KSA/IERVTU1ZX0JZVEVTIDoKKwkJCQkgIChzaXplb2Yoc3RydWN0IGNwbF9yeF9waHlzX2RzZ2wpICsKKwkJCQkgICBwaHlzX2RzZ2wpKSArIGltbWRhdGFsZW4pOworfQorCisvKioKKyAqCWNyZWF0ZV9jaXBoZXJfd3IgLSBmb3JtIHRoZSBXUiBmb3IgY2lwaGVyIG9wZXJhdGlvbnMKKyAqCUByZXE6IGNpcGhlciByZXEuCisgKglAY3R4OiBjcnlwdG8gZHJpdmVyIGNvbnRleHQgb2YgdGhlIHJlcXVlc3QuCisgKglAcWlkOiBpbmdyZXNzIHFpZCB3aGVyZSByZXNwb25zZSBvZiB0aGlzIFdSIHNob3VsZCBiZSByZWNlaXZlZC4KKyAqCUBvcF90eXBlOgllbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24KKyAqLworc3RhdGljIHN0cnVjdCBza19idWZmCisqY3JlYXRlX2NpcGhlcl93cihzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKnJlcV9iYXNlLAorCQkgIHN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgc2hvcnQgcWlkLAorCQkgIHVuc2lnbmVkIHNob3J0IG9wX3R5cGUpCit7CisJc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKilyZXFfYmFzZTsKKwlzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKnRmbSA9IGNyeXB0b19hYmxrY2lwaGVyX3JlcXRmbShyZXEpOworCXN0cnVjdCB1bGRfY3R4ICp1X2N0eCA9IFVMRF9DVFgoY3R4KTsKKwlzdHJ1Y3QgYWJsa19jdHggKmFibGtjdHggPSBBQkxLX0NUWChjdHgpOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBfa2V5X2N0eCAqa2V5X2N0eDsKKwlzdHJ1Y3QgZndfY3J5cHRvX2xvb2thc2lkZV93ciAqd3JlcTsKKwlzdHJ1Y3QgY3BsX3R4X3NlY19wZHUgKnNlY19jcGw7CisJc3RydWN0IGNwbF9yeF9waHlzX2RzZ2wgKnBoeXNfY3BsOworCXN0cnVjdCBjaGNyX2Jsa2NpcGhlcl9yZXFfY3R4ICpyZXFfY3R4ID0gYWJsa2NpcGhlcl9yZXF1ZXN0X2N0eChyZXEpOworCXN0cnVjdCBwaHlzX3NnZV9wYXJtIHNnX3BhcmFtOworCXVuc2lnbmVkIGludCBmcmFncyA9IDAsIHRyYW5zaGRyX2xlbiwgcGh5c19kc2dsLCBkc3RfYnVmc2l6ZSA9IDA7CisJdW5zaWduZWQgaW50IGl2c2l6ZSA9IGNyeXB0b19hYmxrY2lwaGVyX2l2c2l6ZSh0Zm0pLCBrY3R4X2xlbjsKKworCWlmICghcmVxLT5pbmZvKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlhYmxrY3R4LT5kc3RfbmVudHMgPSBjaF9uZW50cyhyZXEtPmRzdCwgJmRzdF9idWZzaXplKTsKKwlhYmxrY3R4LT5lbmMgPSBvcF90eXBlOworCisJaWYgKChhYmxrY3R4LT5lbmNrZXlfbGVuID09IDApIHx8IChpdnNpemUgPiBBRVNfQkxPQ0tfU0laRSkgfHwKKwkgICAgKHJlcS0+bmJ5dGVzIDw9IDApIHx8IChyZXEtPm5ieXRlcyAlIEFFU19CTE9DS19TSVpFKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlwaHlzX2RzZ2wgPSBnZXRfc3BhY2VfZm9yX3BoeXNfZHNnbChhYmxrY3R4LT5kc3RfbmVudHMpOworCisJa2N0eF9sZW4gPSBzaXplb2YoKmtleV9jdHgpICsKKwkJKERJVl9ST1VORF9VUChhYmxrY3R4LT5lbmNrZXlfbGVuLCAxNikgKiAxNik7CisJdHJhbnNoZHJfbGVuID0gQ0lQSEVSX1RSQU5TSERSX1NJWkUoa2N0eF9sZW4sIHBoeXNfZHNnbCk7CisJc2tiID0gYWxsb2Nfc2tiKCh0cmFuc2hkcl9sZW4gKyBzaXplb2Yoc3RydWN0IHNnZV9vcGFxdWVfaGRyKSksCisJCQlHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJc2tiX3Jlc2VydmUoc2tiLCBzaXplb2Yoc3RydWN0IHNnZV9vcGFxdWVfaGRyKSk7CisJd3JlcSA9IChzdHJ1Y3QgZndfY3J5cHRvX2xvb2thc2lkZV93ciAqKV9fc2tiX3B1dChza2IsIHRyYW5zaGRyX2xlbik7CisKKwlzZWNfY3BsID0gKHN0cnVjdCBjcGxfdHhfc2VjX3BkdSAqKSgodTggKil3cmVxICsgU0VDX0NQTF9PRkZTRVQpOworCXNlY19jcGwtPm9wX2l2aW5zcnRvZnN0ID0KKwkJRklMTF9TRUNfQ1BMX09QX0lWSU5TUihjdHgtPmRldi0+dHhfY2hhbm5lbF9pZCwgMiwgMSwgMSk7CisKKwlzZWNfY3BsLT5wbGRsZW4gPSBodG9ubChpdnNpemUgKyByZXEtPm5ieXRlcyk7CisJc2VjX2NwbC0+YWFkc3RhcnRfY2lwaGVyc3RvcF9oaSA9IEZJTExfU0VDX0NQTF9DSVBIRVJTVE9QX0hJKDAsIDAsCisJCQkJCQkJCWl2c2l6ZSArIDEsIDApOworCisJc2VjX2NwbC0+Y2lwaGVyc3RvcF9sb19hdXRoaW5zZXJ0ID0gIEZJTExfU0VDX0NQTF9BVVRISU5TRVJUKDAsIDAsCisJCQkJCQkJCSAgICAgMCwgMCk7CisJc2VjX2NwbC0+c2Vxbm9fbnVtaXZzID0gRklMTF9TRUNfQ1BMX1NDTUQwX1NFUU5PKG9wX3R5cGUsIDAsCisJCQkJCQkJIGFibGtjdHgtPmNpcGhfbW9kZSwKKwkJCQkJCQkgMCwgMCwgaXZzaXplID4+IDEsIDEpOworCXNlY19jcGwtPml2Z2VuX2hkcmxlbiA9IEZJTExfU0VDX0NQTF9JVkdFTl9IRFJMRU4oMCwgMCwgMCwKKwkJCQkJCQkgIDAsIDEsIHBoeXNfZHNnbCk7CisKKwlrZXlfY3R4ID0gKHN0cnVjdCBfa2V5X2N0eCAqKSgodTggKilzZWNfY3BsICsgc2l6ZW9mKCpzZWNfY3BsKSk7CisJa2V5X2N0eC0+Y3R4X2hkciA9IGFibGtjdHgtPmtleV9jdHhfaGRyOworCWlmIChvcF90eXBlID09IENIQ1JfREVDUllQVF9PUCkgeworCQlpZiAoZ2VuZXJhdGVfY29weV9ycmtleShhYmxrY3R4LCBrZXlfY3R4KSkKKwkJCWdvdG8gbWFwX2ZhaWwxOworCX0gZWxzZSB7CisJCWlmIChhYmxrY3R4LT5jaXBoX21vZGUgPT0gQ0hDUl9TQ01EX0NJUEhFUl9NT0RFX0FFU19DQkMpIHsKKwkJCW1lbWNweShrZXlfY3R4LT5rZXksIGFibGtjdHgtPmtleSwgYWJsa2N0eC0+ZW5ja2V5X2xlbik7CisJCX0gZWxzZSB7CisJCQltZW1jcHkoa2V5X2N0eC0+a2V5LCBhYmxrY3R4LT5rZXkgKworCQkJICAgICAgIChhYmxrY3R4LT5lbmNrZXlfbGVuID4+IDEpLAorCQkJICAgICAgIGFibGtjdHgtPmVuY2tleV9sZW4gPj4gMSk7CisJCQltZW1jcHkoa2V5X2N0eC0+a2V5ICsKKwkJCSAgICAgICAoYWJsa2N0eC0+ZW5ja2V5X2xlbiA+PiAxKSwKKwkJCSAgICAgICBhYmxrY3R4LT5rZXksCisJCQkgICAgICAgYWJsa2N0eC0+ZW5ja2V5X2xlbiA+PiAxKTsKKwkJfQorCX0KKwlwaHlzX2NwbCA9IChzdHJ1Y3QgY3BsX3J4X3BoeXNfZHNnbCAqKSgodTggKilrZXlfY3R4ICsga2N0eF9sZW4pOworCisJbWVtY3B5KGFibGtjdHgtPml2LCByZXEtPmluZm8sIGl2c2l6ZSk7CisJc2dfaW5pdF90YWJsZSgmYWJsa2N0eC0+aXZfc2csIDEpOworCXNnX3NldF9idWYoJmFibGtjdHgtPml2X3NnLCBhYmxrY3R4LT5pdiwgaXZzaXplKTsKKwlzZ19wYXJhbS5uZW50cyA9IGFibGtjdHgtPmRzdF9uZW50czsKKwlzZ19wYXJhbS5vYnNpemUgPSBkc3RfYnVmc2l6ZTsKKwlzZ19wYXJhbS5xaWQgPSBxaWQ7CisJc2dfcGFyYW0uYWxpZ24gPSAxOworCWlmIChtYXBfd3JpdGVzZ19waHlzX2NwbCgmdV9jdHgtPmxsZGkucGRldi0+ZGV2LCBwaHlzX2NwbCwgcmVxLT5kc3QsCisJCQkJICZzZ19wYXJhbSkpCisJCWdvdG8gbWFwX2ZhaWwxOworCisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgdHJhbnNoZHJfbGVuKTsKKwl3cml0ZV9zZ19kYXRhX3BhZ2VfZGVzYyhza2IsICZmcmFncywgJmFibGtjdHgtPml2X3NnLCBpdnNpemUpOworCXdyaXRlX3NnX2RhdGFfcGFnZV9kZXNjKHNrYiwgJmZyYWdzLCByZXEtPnNyYywgcmVxLT5uYnl0ZXMpOworCWNyZWF0ZV93cmVxKGN0eCwgd3JlcSwgcmVxLCBza2IsIGtjdHhfbGVuLCAwLCBwaHlzX2RzZ2wpOworCXJlcV9jdHgtPnNrYiA9IHNrYjsKKwlza2JfZ2V0KHNrYik7CisJcmV0dXJuIHNrYjsKK21hcF9mYWlsMToKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKK30KKworc3RhdGljIGludCBjaGNyX2Flc19jYmNfc2V0a2V5KHN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqdGZtLCBjb25zdCB1OCAqa2V5LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisJc3RydWN0IGNoY3JfY29udGV4dCAqY3R4ID0gY3J5cHRvX2FibGtjaXBoZXJfY3R4KHRmbSk7CisJc3RydWN0IGFibGtfY3R4ICphYmxrY3R4ID0gQUJMS19DVFgoY3R4KTsKKwlzdHJ1Y3QgYWJsa2NpcGhlcl9hbGcgKmFsZyA9IGNyeXB0b19hYmxrY2lwaGVyX2FsZyh0Zm0pOworCXVuc2lnbmVkIGludCBja19zaXplLCBjb250ZXh0X3NpemU7CisJdTE2IGFsaWdubWVudCA9IDA7CisKKwlpZiAoKGtleWxlbiA8IGFsZy0+bWluX2tleXNpemUpIHx8IChrZXlsZW4gPiBhbGctPm1heF9rZXlzaXplKSkKKwkJZ290byBiYWRrZXlfZXJyOworCisJbWVtY3B5KGFibGtjdHgtPmtleSwga2V5LCBrZXlsZW4pOworCWFibGtjdHgtPmVuY2tleV9sZW4gPSBrZXlsZW47CisJaWYgKGtleWxlbiA9PSBBRVNfS0VZU0laRV8xMjgpIHsKKwkJY2tfc2l6ZSA9IENIQ1JfS0VZQ1RYX0NJUEhFUl9LRVlfU0laRV8xMjg7CisJfSBlbHNlIGlmIChrZXlsZW4gPT0gQUVTX0tFWVNJWkVfMTkyKSB7CisJCWFsaWdubWVudCA9IDg7CisJCWNrX3NpemUgPSBDSENSX0tFWUNUWF9DSVBIRVJfS0VZX1NJWkVfMTkyOworCX0gZWxzZSBpZiAoa2V5bGVuID09IEFFU19LRVlTSVpFXzI1NikgeworCQlja19zaXplID0gQ0hDUl9LRVlDVFhfQ0lQSEVSX0tFWV9TSVpFXzI1NjsKKwl9IGVsc2UgeworCQlnb3RvIGJhZGtleV9lcnI7CisJfQorCisJY29udGV4dF9zaXplID0gKEtFWV9DT05URVhUX0hEUl9TQUxUX0FORF9QQUQgKworCQkJa2V5bGVuICsgYWxpZ25tZW50KSA+PiA0OworCisJYWJsa2N0eC0+a2V5X2N0eF9oZHIgPSBGSUxMX0tFWV9DVFhfSERSKGNrX3NpemUsIENIQ1JfS0VZQ1RYX05PX0tFWSwKKwkJCQkJCTAsIDAsIGNvbnRleHRfc2l6ZSk7CisJYWJsa2N0eC0+Y2lwaF9tb2RlID0gQ0hDUl9TQ01EX0NJUEhFUl9NT0RFX0FFU19DQkM7CisJcmV0dXJuIDA7CitiYWRrZXlfZXJyOgorCWNyeXB0b19hYmxrY2lwaGVyX3NldF9mbGFncyh0Zm0sIENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOKTsKKwlhYmxrY3R4LT5lbmNrZXlfbGVuID0gMDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBjeGdiNF9pc19jcnlwdG9fcV9mdWxsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpZHgpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNnZV9vZmxkX3R4cSAqcTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IG5ldGRldjJhZGFwKGRldik7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJcSA9ICZhZGFwLT5zZ2Uub2ZsZHR4cVtpZHhdOworCXNwaW5fbG9jaygmcS0+c2VuZHEubG9jayk7CisJaWYgKHEtPmZ1bGwpCisJCXJldCA9IC0xOworCXNwaW5fdW5sb2NrKCZxLT5zZW5kcS5sb2NrKTsKKwlsb2NhbF9iaF9lbmFibGUoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNoY3JfYWVzX2VuY3J5cHQoc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqdGZtID0gY3J5cHRvX2FibGtjaXBoZXJfcmVxdGZtKHJlcSk7CisJc3RydWN0IGNoY3JfY29udGV4dCAqY3R4ID0gY3J5cHRvX2FibGtjaXBoZXJfY3R4KHRmbSk7CisJc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpyZXFfYmFzZSA9ICZyZXEtPmJhc2U7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4ID0gVUxEX0NUWChjdHgpOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlpZiAodW5saWtlbHkoY3hnYjRfaXNfY3J5cHRvX3FfZnVsbCh1X2N0eC0+bGxkaS5wb3J0c1swXSwKKwkJCQkJICAgIGN0eC0+dHhfY2hhbm5lbF9pZCkpKSB7CisJCWlmICghKHJlcS0+YmFzZS5mbGFncyAmIENSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HKSkKKwkJCXJldHVybiAtRUJVU1k7CisJfQorCisJc2tiID0gY3JlYXRlX2NpcGhlcl93cihyZXFfYmFzZSwgY3R4LAorCQkJICAgICAgIHVfY3R4LT5sbGRpLnJ4cV9pZHNbY3R4LT50eF9jaGFubmVsX2lkXSwKKwkJCSAgICAgICBDSENSX0VOQ1JZUFRfT1ApOworCWlmIChJU19FUlIoc2tiKSkgeworCQlwcl9lcnIoImNoY3IgOiAlcyA6IEZhaWxlZCB0byBmb3JtIFdSLiBObyBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuICBQVFJfRVJSKHNrYik7CisJfQorCXNrYi0+ZGV2ID0gdV9jdHgtPmxsZGkucG9ydHNbMF07CisJc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9EQVRBLCBjdHgtPnR4X2NoYW5uZWxfaWQpOworCWNoY3Jfc2VuZF93cihza2IpOworCXJldHVybiAtRUlOUFJPR1JFU1M7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9hZXNfZGVjcnlwdChzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICp0Zm0gPSBjcnlwdG9fYWJsa2NpcGhlcl9yZXF0Zm0ocmVxKTsKKwlzdHJ1Y3QgY2hjcl9jb250ZXh0ICpjdHggPSBjcnlwdG9fYWJsa2NpcGhlcl9jdHgodGZtKTsKKwlzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKnJlcV9iYXNlID0gJnJlcS0+YmFzZTsKKwlzdHJ1Y3QgdWxkX2N0eCAqdV9jdHggPSBVTERfQ1RYKGN0eCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmICh1bmxpa2VseShjeGdiNF9pc19jcnlwdG9fcV9mdWxsKHVfY3R4LT5sbGRpLnBvcnRzWzBdLAorCQkJCQkgICAgY3R4LT50eF9jaGFubmVsX2lkKSkpIHsKKwkJaWYgKCEocmVxLT5iYXNlLmZsYWdzICYgQ1JZUFRPX1RGTV9SRVFfTUFZX0JBQ0tMT0cpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlza2IgPSBjcmVhdGVfY2lwaGVyX3dyKHJlcV9iYXNlLCBjdHgsIHVfY3R4LT5sbGRpLnJ4cV9pZHNbMF0sCisJCQkgICAgICAgQ0hDUl9ERUNSWVBUX09QKTsKKwlpZiAoSVNfRVJSKHNrYikpIHsKKwkJcHJfZXJyKCJjaGNyIDogJXMgOiBGYWlsZWQgdG8gZm9ybSBXUi4gTm8gbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBQVFJfRVJSKHNrYik7CisJfQorCXNrYi0+ZGV2ID0gdV9jdHgtPmxsZGkucG9ydHNbMF07CisJc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9EQVRBLCBjdHgtPnR4X2NoYW5uZWxfaWQpOworCWNoY3Jfc2VuZF93cihza2IpOworCXJldHVybiAtRUlOUFJPR1JFU1M7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9kZXZpY2VfaW5pdChzdHJ1Y3QgY2hjcl9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4OworCXVuc2lnbmVkIGludCBpZDsKKwlpbnQgZXJyID0gMCwgcnhxX3BlcmNoYW4sIHJ4cV9pZHg7CisKKwlpZCA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpZiAoIWN0eC0+ZGV2KSB7CisJCWVyciA9IGFzc2lnbl9jaGNyX2RldmljZSgmY3R4LT5kZXYpOworCQlpZiAoZXJyKSB7CisJCQlwcl9lcnIoImNoY3IgZGV2aWNlIGFzc2lnbm1lbnQgZmFpbHNcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJdV9jdHggPSBVTERfQ1RYKGN0eCk7CisJCXJ4cV9wZXJjaGFuID0gdV9jdHgtPmxsZGkubnJ4cSAvIHVfY3R4LT5sbGRpLm5jaGFuOworCQljdHgtPmRldi0+dHhfY2hhbm5lbF9pZCA9IDA7CisJCXJ4cV9pZHggPSBjdHgtPmRldi0+dHhfY2hhbm5lbF9pZCAqIHJ4cV9wZXJjaGFuOworCQlyeHFfaWR4ICs9IGlkICUgcnhxX3BlcmNoYW47CisJCXNwaW5fbG9jaygmY3R4LT5kZXYtPmxvY2tfY2hjcl9kZXYpOworCQljdHgtPnR4X2NoYW5uZWxfaWQgPSByeHFfaWR4OworCQlzcGluX3VubG9jaygmY3R4LT5kZXYtPmxvY2tfY2hjcl9kZXYpOworCX0KK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNoY3JfY3JhX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwl0Zm0tPmNydF9hYmxrY2lwaGVyLnJlcXNpemUgPSAgc2l6ZW9mKHN0cnVjdCBjaGNyX2Jsa2NpcGhlcl9yZXFfY3R4KTsKKwlyZXR1cm4gY2hjcl9kZXZpY2VfaW5pdChjcnlwdG9fdGZtX2N0eCh0Zm0pKTsKK30KKworc3RhdGljIGludCBnZXRfYWxnX2NvbmZpZyhzdHJ1Y3QgYWxnb19wYXJhbSAqcGFyYW1zLAorCQkJICB1bnNpZ25lZCBpbnQgYXV0aF9zaXplKQoreworCXN3aXRjaCAoYXV0aF9zaXplKSB7CisJY2FzZSBTSEExX0RJR0VTVF9TSVpFOgorCQlwYXJhbXMtPm1rX3NpemUgPSBDSENSX0tFWUNUWF9NQUNfS0VZX1NJWkVfMTYwOworCQlwYXJhbXMtPmF1dGhfbW9kZSA9IENIQ1JfU0NNRF9BVVRIX01PREVfU0hBMTsKKwkJcGFyYW1zLT5yZXN1bHRfc2l6ZSA9IFNIQTFfRElHRVNUX1NJWkU7CisJCWJyZWFrOworCWNhc2UgU0hBMjI0X0RJR0VTVF9TSVpFOgorCQlwYXJhbXMtPm1rX3NpemUgPSBDSENSX0tFWUNUWF9NQUNfS0VZX1NJWkVfMjU2OworCQlwYXJhbXMtPmF1dGhfbW9kZSA9IENIQ1JfU0NNRF9BVVRIX01PREVfU0hBMjI0OworCQlwYXJhbXMtPnJlc3VsdF9zaXplID0gU0hBMjU2X0RJR0VTVF9TSVpFOworCQlicmVhazsKKwljYXNlIFNIQTI1Nl9ESUdFU1RfU0laRToKKwkJcGFyYW1zLT5ta19zaXplID0gQ0hDUl9LRVlDVFhfTUFDX0tFWV9TSVpFXzI1NjsKKwkJcGFyYW1zLT5hdXRoX21vZGUgPSBDSENSX1NDTURfQVVUSF9NT0RFX1NIQTI1NjsKKwkJcGFyYW1zLT5yZXN1bHRfc2l6ZSA9IFNIQTI1Nl9ESUdFU1RfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBTSEEzODRfRElHRVNUX1NJWkU6CisJCXBhcmFtcy0+bWtfc2l6ZSA9IENIQ1JfS0VZQ1RYX01BQ19LRVlfU0laRV81MTI7CisJCXBhcmFtcy0+YXV0aF9tb2RlID0gQ0hDUl9TQ01EX0FVVEhfTU9ERV9TSEE1MTJfMzg0OworCQlwYXJhbXMtPnJlc3VsdF9zaXplID0gU0hBNTEyX0RJR0VTVF9TSVpFOworCQlicmVhazsKKwljYXNlIFNIQTUxMl9ESUdFU1RfU0laRToKKwkJcGFyYW1zLT5ta19zaXplID0gQ0hDUl9LRVlDVFhfTUFDX0tFWV9TSVpFXzUxMjsKKwkJcGFyYW1zLT5hdXRoX21vZGUgPSBDSENSX1NDTURfQVVUSF9NT0RFX1NIQTUxMl81MTI7CisJCXBhcmFtcy0+cmVzdWx0X3NpemUgPSBTSEE1MTJfRElHRVNUX1NJWkU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiY2hjciA6IEVSUk9SLCB1bnN1cHBvcnRlZCBkaWdlc3Qgc2l6ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3dyaXRlX2J1ZmZlcl9kYXRhX3BhZ2VfZGVzYyhzdHJ1Y3QgY2hjcl9haGFzaF9yZXFfY3R4ICpyZXFfY3R4LAorCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCAqZnJhZ3MsIGNoYXIgKmJmciwKKwkJCSAgICB1OCBiZnJfbGVuKQoreworCXZvaWQgKnBhZ2VfcHRyID0gTlVMTDsKKworCXNrYi0+bGVuICs9IGJmcl9sZW47CisJc2tiLT5kYXRhX2xlbiArPSBiZnJfbGVuOworCXNrYi0+dHJ1ZXNpemUgKz0gYmZyX2xlbjsKKwlwYWdlX3B0ciA9IGttYWxsb2MoQ0hDUl9IQVNIX01BWF9CTE9DS19TSVpFXzEyOCwgR0ZQX0FUT01JQyB8IEdGUF9ETUEpOworCWlmICghcGFnZV9wdHIpCisJCXJldHVybiAtRU5PTUVNOworCWdldF9wYWdlKHZpcnRfdG9fcGFnZShwYWdlX3B0cikpOworCXJlcV9jdHgtPmR1bW15X3BheWxvYWRfcHRyID0gcGFnZV9wdHI7CisJbWVtY3B5KHBhZ2VfcHRyLCBiZnIsIGJmcl9sZW4pOworCXNrYl9maWxsX3BhZ2VfZGVzYyhza2IsICpmcmFncywgdmlydF90b19wYWdlKHBhZ2VfcHRyKSwKKwkJCSAgIG9mZnNldF9pbl9wYWdlKHBhZ2VfcHRyKSwgYmZyX2xlbik7CisJKCpmcmFncykrKzsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgljcmVhdGVfZmluYWxfaGFzaF93ciAtIENyZWF0ZSBoYXNoIHdvcmsgcmVxdWVzdAorICoJQHJlcSAtIENpcGhlciByZXEgYmFzZQorICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNyZWF0ZV9maW5hbF9oYXNoX3dyKHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEsCisJCQkJCSAgICBzdHJ1Y3QgaGFzaF93cl9wYXJhbSAqcGFyYW0pCit7CisJc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqcmVxX2N0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJc3RydWN0IGNyeXB0b19haGFzaCAqdGZtID0gY3J5cHRvX2FoYXNoX3JlcXRmbShyZXEpOworCXN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCA9IGNyeXB0b190Zm1fY3R4KGNyeXB0b19haGFzaF90Zm0odGZtKSk7CisJc3RydWN0IGhtYWNfY3R4ICpobWFjY3R4ID0gSE1BQ19DVFgoY3R4KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlzdHJ1Y3QgX2tleV9jdHggKmtleV9jdHg7CisJc3RydWN0IGZ3X2NyeXB0b19sb29rYXNpZGVfd3IgKndyZXE7CisJc3RydWN0IGNwbF90eF9zZWNfcGR1ICpzZWNfY3BsOworCXVuc2lnbmVkIGludCBmcmFncyA9IDAsIHRyYW5zaGRyX2xlbiwgaW9wYWRfYWxpZ25tZW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgZGlnZXN0c2l6ZSA9IGNyeXB0b19haGFzaF9kaWdlc3RzaXplKHRmbSk7CisJdW5zaWduZWQgaW50IGtjdHhfbGVuID0gc2l6ZW9mKCprZXlfY3R4KTsKKwl1OCBoYXNoX3NpemVfaW5fcmVzcG9uc2UgPSAwOworCisJaW9wYWRfYWxpZ25tZW50ID0gS0VZQ1RYX0FMSUdOX1BBRChkaWdlc3RzaXplKTsKKwlrY3R4X2xlbiArPSBwYXJhbS0+YWxnX3BybS5yZXN1bHRfc2l6ZSArIGlvcGFkX2FsaWdubWVudDsKKwlpZiAocGFyYW0tPm9wYWRfbmVlZGVkKQorCQlrY3R4X2xlbiArPSBwYXJhbS0+YWxnX3BybS5yZXN1bHRfc2l6ZSArIGlvcGFkX2FsaWdubWVudDsKKworCWlmIChyZXFfY3R4LT5yZXN1bHQpCisJCWhhc2hfc2l6ZV9pbl9yZXNwb25zZSA9IGRpZ2VzdHNpemU7CisJZWxzZQorCQloYXNoX3NpemVfaW5fcmVzcG9uc2UgPSBwYXJhbS0+YWxnX3BybS5yZXN1bHRfc2l6ZTsKKwl0cmFuc2hkcl9sZW4gPSBIQVNIX1RSQU5TSERSX1NJWkUoa2N0eF9sZW4pOworCXNrYiA9IGFsbG9jX3NrYigodHJhbnNoZHJfbGVuICsgc2l6ZW9mKHN0cnVjdCBzZ2Vfb3BhcXVlX2hkcikpLAorCQkJR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpCisJCXJldHVybiBza2I7CisKKwlza2JfcmVzZXJ2ZShza2IsIHNpemVvZihzdHJ1Y3Qgc2dlX29wYXF1ZV9oZHIpKTsKKwl3cmVxID0gKHN0cnVjdCBmd19jcnlwdG9fbG9va2FzaWRlX3dyICopX19za2JfcHV0KHNrYiwgdHJhbnNoZHJfbGVuKTsKKwltZW1zZXQod3JlcSwgMCwgdHJhbnNoZHJfbGVuKTsKKworCXNlY19jcGwgPSAoc3RydWN0IGNwbF90eF9zZWNfcGR1ICopKCh1OCAqKXdyZXEgKyBTRUNfQ1BMX09GRlNFVCk7CisJc2VjX2NwbC0+b3BfaXZpbnNydG9mc3QgPQorCQlGSUxMX1NFQ19DUExfT1BfSVZJTlNSKGN0eC0+ZGV2LT50eF9jaGFubmVsX2lkLCAyLCAwLCAwKTsKKwlzZWNfY3BsLT5wbGRsZW4gPSBodG9ubChwYXJhbS0+YmZyX2xlbiArIHBhcmFtLT5zZ19sZW4pOworCisJc2VjX2NwbC0+YWFkc3RhcnRfY2lwaGVyc3RvcF9oaSA9CisJCUZJTExfU0VDX0NQTF9DSVBIRVJTVE9QX0hJKDAsIDAsIDAsIDApOworCXNlY19jcGwtPmNpcGhlcnN0b3BfbG9fYXV0aGluc2VydCA9CisJCUZJTExfU0VDX0NQTF9BVVRISU5TRVJUKDAsIDEsIDAsIDApOworCXNlY19jcGwtPnNlcW5vX251bWl2cyA9CisJCUZJTExfU0VDX0NQTF9TQ01EMF9TRVFOTygwLCAwLCAwLCBwYXJhbS0+YWxnX3BybS5hdXRoX21vZGUsCisJCQkJCSBwYXJhbS0+b3BhZF9uZWVkZWQsIDAsIDApOworCisJc2VjX2NwbC0+aXZnZW5faGRybGVuID0KKwkJRklMTF9TRUNfQ1BMX0lWR0VOX0hEUkxFTihwYXJhbS0+bGFzdCwgcGFyYW0tPm1vcmUsIDAsIDEsIDAsIDApOworCisJa2V5X2N0eCA9IChzdHJ1Y3QgX2tleV9jdHggKikoKHU4ICopc2VjX2NwbCArIHNpemVvZigqc2VjX2NwbCkpOworCW1lbWNweShrZXlfY3R4LT5rZXksIHJlcV9jdHgtPnBhcnRpYWxfaGFzaCwgcGFyYW0tPmFsZ19wcm0ucmVzdWx0X3NpemUpOworCisJaWYgKHBhcmFtLT5vcGFkX25lZWRlZCkKKwkJbWVtY3B5KGtleV9jdHgtPmtleSArICgocGFyYW0tPmFsZ19wcm0ucmVzdWx0X3NpemUgPD0gMzIpID8gMzIgOgorCQkJCSAgICAgICBDSENSX0hBU0hfTUFYX0RJR0VTVF9TSVpFKSwKKwkJICAgICAgIGhtYWNjdHgtPm9wYWQsIHBhcmFtLT5hbGdfcHJtLnJlc3VsdF9zaXplKTsKKworCWtleV9jdHgtPmN0eF9oZHIgPSBGSUxMX0tFWV9DVFhfSERSKENIQ1JfS0VZQ1RYX05PX0tFWSwKKwkJCQkJICAgIHBhcmFtLT5hbGdfcHJtLm1rX3NpemUsIDAsCisJCQkJCSAgICBwYXJhbS0+b3BhZF9uZWVkZWQsCisJCQkJCSAgICAoa2N0eF9sZW4gPj4gNCkpOworCXNlY19jcGwtPnNjbWQxID0gY3B1X3RvX2JlNjQoKHU2NClwYXJhbS0+c2NtZDEpOworCisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgdHJhbnNoZHJfbGVuKTsKKwlpZiAocGFyYW0tPmJmcl9sZW4gIT0gMCkKKwkJd3JpdGVfYnVmZmVyX2RhdGFfcGFnZV9kZXNjKHJlcV9jdHgsIHNrYiwgJmZyYWdzLCByZXFfY3R4LT5iZnIsCisJCQkJCSAgICBwYXJhbS0+YmZyX2xlbik7CisJaWYgKHBhcmFtLT5zZ19sZW4gIT0gMCkKKwkJd3JpdGVfc2dfZGF0YV9wYWdlX2Rlc2Moc2tiLCAmZnJhZ3MsIHJlcS0+c3JjLCBwYXJhbS0+c2dfbGVuKTsKKworCWNyZWF0ZV93cmVxKGN0eCwgd3JlcSwgcmVxLCBza2IsIGtjdHhfbGVuLCBoYXNoX3NpemVfaW5fcmVzcG9uc2UsCisJCSAgICAwKTsKKwlyZXFfY3R4LT5za2IgPSBza2I7CisJc2tiX2dldChza2IpOworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9haGFzaF91cGRhdGUoc3RydWN0IGFoYXNoX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgY2hjcl9haGFzaF9yZXFfY3R4ICpyZXFfY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgocmVxKTsKKwlzdHJ1Y3QgY3J5cHRvX2FoYXNoICpydGZtID0gY3J5cHRvX2FoYXNoX3JlcXRmbShyZXEpOworCXN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCA9IGNyeXB0b190Zm1fY3R4KGNyeXB0b19haGFzaF90Zm0ocnRmbSkpOworCXN0cnVjdCB1bGRfY3R4ICp1X2N0eCA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCByZW1haW5kZXIgPSAwLCBiczsKKwl1bnNpZ25lZCBpbnQgbmJ5dGVzID0gcmVxLT5uYnl0ZXM7CisJc3RydWN0IGhhc2hfd3JfcGFyYW0gcGFyYW1zOworCisJYnMgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoY3J5cHRvX2FoYXNoX3RmbShydGZtKSk7CisKKwl1X2N0eCA9IFVMRF9DVFgoY3R4KTsKKwlpZiAodW5saWtlbHkoY3hnYjRfaXNfY3J5cHRvX3FfZnVsbCh1X2N0eC0+bGxkaS5wb3J0c1swXSwKKwkJCQkJICAgIGN0eC0+dHhfY2hhbm5lbF9pZCkpKSB7CisJCWlmICghKHJlcS0+YmFzZS5mbGFncyAmIENSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HKSkKKwkJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKG5ieXRlcyArIHJlcV9jdHgtPmJmcl9sZW4gPj0gYnMpIHsKKwkJcmVtYWluZGVyID0gKG5ieXRlcyArIHJlcV9jdHgtPmJmcl9sZW4pICUgYnM7CisJCW5ieXRlcyA9IG5ieXRlcyArIHJlcV9jdHgtPmJmcl9sZW4gLSByZW1haW5kZXI7CisJfSBlbHNlIHsKKwkJc2dfcGNvcHlfdG9fYnVmZmVyKHJlcS0+c3JjLCBzZ19uZW50cyhyZXEtPnNyYyksIHJlcV9jdHgtPmJmciArCisJCQkJICAgcmVxX2N0eC0+YmZyX2xlbiwgbmJ5dGVzLCAwKTsKKwkJcmVxX2N0eC0+YmZyX2xlbiArPSBuYnl0ZXM7CisJCXJldHVybiAwOworCX0KKworCXBhcmFtcy5vcGFkX25lZWRlZCA9IDA7CisJcGFyYW1zLm1vcmUgPSAxOworCXBhcmFtcy5sYXN0ID0gMDsKKwlwYXJhbXMuc2dfbGVuID0gbmJ5dGVzIC0gcmVxX2N0eC0+YmZyX2xlbjsKKwlwYXJhbXMuYmZyX2xlbiA9IHJlcV9jdHgtPmJmcl9sZW47CisJcGFyYW1zLnNjbWQxID0gMDsKKwlnZXRfYWxnX2NvbmZpZygmcGFyYW1zLmFsZ19wcm0sIGNyeXB0b19haGFzaF9kaWdlc3RzaXplKHJ0Zm0pKTsKKwlyZXFfY3R4LT5yZXN1bHQgPSAwOworCXJlcV9jdHgtPmRhdGFfbGVuICs9IHBhcmFtcy5zZ19sZW4gKyBwYXJhbXMuYmZyX2xlbjsKKwlza2IgPSBjcmVhdGVfZmluYWxfaGFzaF93cihyZXEsICZwYXJhbXMpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcV9jdHgtPmJmcl9sZW4gPSByZW1haW5kZXI7CisJaWYgKHJlbWFpbmRlcikKKwkJc2dfcGNvcHlfdG9fYnVmZmVyKHJlcS0+c3JjLCBzZ19uZW50cyhyZXEtPnNyYyksCisJCQkJICAgcmVxX2N0eC0+YmZyLCByZW1haW5kZXIsIHJlcS0+bmJ5dGVzIC0KKwkJCQkgICByZW1haW5kZXIpOworCXNrYi0+ZGV2ID0gdV9jdHgtPmxsZGkucG9ydHNbMF07CisJc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9EQVRBLCBjdHgtPnR4X2NoYW5uZWxfaWQpOworCWNoY3Jfc2VuZF93cihza2IpOworCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlX2xhc3RfaGFzaF9ibG9jayhjaGFyICpiZnJfcHRyLCB1bnNpZ25lZCBpbnQgYnMsIHU2NCBzY21kMSkKK3sKKwltZW1zZXQoYmZyX3B0ciwgMCwgYnMpOworCSpiZnJfcHRyID0gMHg4MDsKKwlpZiAoYnMgPT0gNjQpCisJCSooX19iZTY0ICopKGJmcl9wdHIgKyA1NikgPSBjcHVfdG9fYmU2NChzY21kMSAgPDwgMyk7CisJZWxzZQorCQkqKF9fYmU2NCAqKShiZnJfcHRyICsgMTIwKSA9ICBjcHVfdG9fYmU2NChzY21kMSAgPDwgMyk7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9haGFzaF9maW5hbChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBjaGNyX2FoYXNoX3JlcV9jdHggKnJlcV9jdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChyZXEpOworCXN0cnVjdCBjcnlwdG9fYWhhc2ggKnJ0Zm0gPSBjcnlwdG9fYWhhc2hfcmVxdGZtKHJlcSk7CisJc3RydWN0IGNoY3JfY29udGV4dCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgoY3J5cHRvX2FoYXNoX3RmbShydGZtKSk7CisJc3RydWN0IGhhc2hfd3JfcGFyYW0gcGFyYW1zOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4ID0gTlVMTDsKKwl1OCBicyA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZShjcnlwdG9fYWhhc2hfdGZtKHJ0Zm0pKTsKKworCXVfY3R4ID0gVUxEX0NUWChjdHgpOworCWlmIChpc19obWFjKGNyeXB0b19haGFzaF90Zm0ocnRmbSkpKQorCQlwYXJhbXMub3BhZF9uZWVkZWQgPSAxOworCWVsc2UKKwkJcGFyYW1zLm9wYWRfbmVlZGVkID0gMDsKKwlwYXJhbXMuc2dfbGVuID0gMDsKKwlnZXRfYWxnX2NvbmZpZygmcGFyYW1zLmFsZ19wcm0sIGNyeXB0b19haGFzaF9kaWdlc3RzaXplKHJ0Zm0pKTsKKwlyZXFfY3R4LT5yZXN1bHQgPSAxOworCXBhcmFtcy5iZnJfbGVuID0gcmVxX2N0eC0+YmZyX2xlbjsKKwlyZXFfY3R4LT5kYXRhX2xlbiArPSBwYXJhbXMuYmZyX2xlbiArIHBhcmFtcy5zZ19sZW47CisJaWYgKHJlcV9jdHgtPmJmciAmJiAocmVxX2N0eC0+YmZyX2xlbiA9PSAwKSkgeworCQljcmVhdGVfbGFzdF9oYXNoX2Jsb2NrKHJlcV9jdHgtPmJmciwgYnMsIHJlcV9jdHgtPmRhdGFfbGVuKTsKKwkJcGFyYW1zLmxhc3QgPSAwOworCQlwYXJhbXMubW9yZSA9IDE7CisJCXBhcmFtcy5zY21kMSA9IDA7CisJCXBhcmFtcy5iZnJfbGVuID0gYnM7CisKKwl9IGVsc2UgeworCQlwYXJhbXMuc2NtZDEgPSByZXFfY3R4LT5kYXRhX2xlbjsKKwkJcGFyYW1zLmxhc3QgPSAxOworCQlwYXJhbXMubW9yZSA9IDA7CisJfQorCXNrYiA9IGNyZWF0ZV9maW5hbF9oYXNoX3dyKHJlcSwgJnBhcmFtcyk7CisJc2tiLT5kZXYgPSB1X2N0eC0+bGxkaS5wb3J0c1swXTsKKwlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0RBVEEsIGN0eC0+dHhfY2hhbm5lbF9pZCk7CisJY2hjcl9zZW5kX3dyKHNrYik7CisJcmV0dXJuIC1FSU5QUk9HUkVTUzsKK30KKworc3RhdGljIGludCBjaGNyX2FoYXNoX2ZpbnVwKHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqcmVxX2N0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJc3RydWN0IGNyeXB0b19haGFzaCAqcnRmbSA9IGNyeXB0b19haGFzaF9yZXF0Zm0ocmVxKTsKKwlzdHJ1Y3QgY2hjcl9jb250ZXh0ICpjdHggPSBjcnlwdG9fdGZtX2N0eChjcnlwdG9fYWhhc2hfdGZtKHJ0Zm0pKTsKKwlzdHJ1Y3QgdWxkX2N0eCAqdV9jdHggPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGhhc2hfd3JfcGFyYW0gcGFyYW1zOworCXU4ICBiczsKKworCWJzID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKGNyeXB0b19haGFzaF90Zm0ocnRmbSkpOworCXVfY3R4ID0gVUxEX0NUWChjdHgpOworCisJaWYgKHVubGlrZWx5KGN4Z2I0X2lzX2NyeXB0b19xX2Z1bGwodV9jdHgtPmxsZGkucG9ydHNbMF0sCisJCQkJCSAgICBjdHgtPnR4X2NoYW5uZWxfaWQpKSkgeworCQlpZiAoIShyZXEtPmJhc2UuZmxhZ3MgJiBDUllQVE9fVEZNX1JFUV9NQVlfQkFDS0xPRykpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChpc19obWFjKGNyeXB0b19haGFzaF90Zm0ocnRmbSkpKQorCQlwYXJhbXMub3BhZF9uZWVkZWQgPSAxOworCWVsc2UKKwkJcGFyYW1zLm9wYWRfbmVlZGVkID0gMDsKKworCXBhcmFtcy5zZ19sZW4gPSByZXEtPm5ieXRlczsKKwlwYXJhbXMuYmZyX2xlbiA9IHJlcV9jdHgtPmJmcl9sZW47CisJZ2V0X2FsZ19jb25maWcoJnBhcmFtcy5hbGdfcHJtLCBjcnlwdG9fYWhhc2hfZGlnZXN0c2l6ZShydGZtKSk7CisJcmVxX2N0eC0+ZGF0YV9sZW4gKz0gcGFyYW1zLmJmcl9sZW4gKyBwYXJhbXMuc2dfbGVuOworCXJlcV9jdHgtPnJlc3VsdCA9IDE7CisJaWYgKHJlcV9jdHgtPmJmciAmJiAocmVxX2N0eC0+YmZyX2xlbiArIHJlcS0+bmJ5dGVzKSA9PSAwKSB7CisJCWNyZWF0ZV9sYXN0X2hhc2hfYmxvY2socmVxX2N0eC0+YmZyLCBicywgcmVxX2N0eC0+ZGF0YV9sZW4pOworCQlwYXJhbXMubGFzdCA9IDA7CisJCXBhcmFtcy5tb3JlID0gMTsKKwkJcGFyYW1zLnNjbWQxID0gMDsKKwkJcGFyYW1zLmJmcl9sZW4gPSBiczsKKwl9IGVsc2UgeworCQlwYXJhbXMuc2NtZDEgPSByZXFfY3R4LT5kYXRhX2xlbjsKKwkJcGFyYW1zLmxhc3QgPSAxOworCQlwYXJhbXMubW9yZSA9IDA7CisJfQorCisJc2tiID0gY3JlYXRlX2ZpbmFsX2hhc2hfd3IocmVxLCAmcGFyYW1zKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisJc2tiLT5kZXYgPSB1X2N0eC0+bGxkaS5wb3J0c1swXTsKKwlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0RBVEEsIGN0eC0+dHhfY2hhbm5lbF9pZCk7CisJY2hjcl9zZW5kX3dyKHNrYik7CisKKwlyZXR1cm4gLUVJTlBST0dSRVNTOworfQorCitzdGF0aWMgaW50IGNoY3JfYWhhc2hfZGlnZXN0KHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqcmVxX2N0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJc3RydWN0IGNyeXB0b19haGFzaCAqcnRmbSA9IGNyeXB0b19haGFzaF9yZXF0Zm0ocmVxKTsKKwlzdHJ1Y3QgY2hjcl9jb250ZXh0ICpjdHggPSBjcnlwdG9fdGZtX2N0eChjcnlwdG9fYWhhc2hfdGZtKHJ0Zm0pKTsKKwlzdHJ1Y3QgdWxkX2N0eCAqdV9jdHggPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGhhc2hfd3JfcGFyYW0gcGFyYW1zOworCXU4ICBiczsKKworCXJ0Zm0tPmluaXQocmVxKTsKKwlicyA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZShjcnlwdG9fYWhhc2hfdGZtKHJ0Zm0pKTsKKworCXVfY3R4ID0gVUxEX0NUWChjdHgpOworCWlmICh1bmxpa2VseShjeGdiNF9pc19jcnlwdG9fcV9mdWxsKHVfY3R4LT5sbGRpLnBvcnRzWzBdLAorCQkJCQkgICAgY3R4LT50eF9jaGFubmVsX2lkKSkpIHsKKwkJaWYgKCEocmVxLT5iYXNlLmZsYWdzICYgQ1JZUFRPX1RGTV9SRVFfTUFZX0JBQ0tMT0cpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoaXNfaG1hYyhjcnlwdG9fYWhhc2hfdGZtKHJ0Zm0pKSkKKwkJcGFyYW1zLm9wYWRfbmVlZGVkID0gMTsKKwllbHNlCisJCXBhcmFtcy5vcGFkX25lZWRlZCA9IDA7CisKKwlwYXJhbXMubGFzdCA9IDA7CisJcGFyYW1zLm1vcmUgPSAwOworCXBhcmFtcy5zZ19sZW4gPSByZXEtPm5ieXRlczsKKwlwYXJhbXMuYmZyX2xlbiA9IDA7CisJcGFyYW1zLnNjbWQxID0gMDsKKwlnZXRfYWxnX2NvbmZpZygmcGFyYW1zLmFsZ19wcm0sIGNyeXB0b19haGFzaF9kaWdlc3RzaXplKHJ0Zm0pKTsKKwlyZXFfY3R4LT5yZXN1bHQgPSAxOworCXJlcV9jdHgtPmRhdGFfbGVuICs9IHBhcmFtcy5iZnJfbGVuICsgcGFyYW1zLnNnX2xlbjsKKworCWlmIChyZXFfY3R4LT5iZnIgJiYgcmVxLT5uYnl0ZXMgPT0gMCkgeworCQljcmVhdGVfbGFzdF9oYXNoX2Jsb2NrKHJlcV9jdHgtPmJmciwgYnMsIDApOworCQlwYXJhbXMubW9yZSA9IDE7CisJCXBhcmFtcy5iZnJfbGVuID0gYnM7CisJfQorCisJc2tiID0gY3JlYXRlX2ZpbmFsX2hhc2hfd3IocmVxLCAmcGFyYW1zKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2ItPmRldiA9IHVfY3R4LT5sbGRpLnBvcnRzWzBdOworCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfREFUQSwgY3R4LT50eF9jaGFubmVsX2lkKTsKKwljaGNyX3NlbmRfd3Ioc2tiKTsKKwlyZXR1cm4gLUVJTlBST0dSRVNTOworfQorCitzdGF0aWMgaW50IGNoY3JfYWhhc2hfZXhwb3J0KHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICphcmVxLCB2b2lkICpvdXQpCit7CisJc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqcmVxX2N0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KGFyZXEpOworCXN0cnVjdCBjaGNyX2FoYXNoX3JlcV9jdHggKnN0YXRlID0gb3V0OworCisJc3RhdGUtPmJmcl9sZW4gPSByZXFfY3R4LT5iZnJfbGVuOworCXN0YXRlLT5kYXRhX2xlbiA9IHJlcV9jdHgtPmRhdGFfbGVuOworCW1lbWNweShzdGF0ZS0+YmZyLCByZXFfY3R4LT5iZnIsIENIQ1JfSEFTSF9NQVhfQkxPQ0tfU0laRV8xMjgpOworCW1lbWNweShzdGF0ZS0+cGFydGlhbF9oYXNoLCByZXFfY3R4LT5wYXJ0aWFsX2hhc2gsCisJICAgICAgIENIQ1JfSEFTSF9NQVhfRElHRVNUX1NJWkUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoY3JfYWhhc2hfaW1wb3J0KHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICphcmVxLCBjb25zdCB2b2lkICppbikKK3sKKwlzdHJ1Y3QgY2hjcl9haGFzaF9yZXFfY3R4ICpyZXFfY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgoYXJlcSk7CisJc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqc3RhdGUgPSAoc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqKWluOworCisJcmVxX2N0eC0+YmZyX2xlbiA9IHN0YXRlLT5iZnJfbGVuOworCXJlcV9jdHgtPmRhdGFfbGVuID0gc3RhdGUtPmRhdGFfbGVuOworCXJlcV9jdHgtPmR1bW15X3BheWxvYWRfcHRyID0gTlVMTDsKKwltZW1jcHkocmVxX2N0eC0+YmZyLCBzdGF0ZS0+YmZyLCBDSENSX0hBU0hfTUFYX0JMT0NLX1NJWkVfMTI4KTsKKwltZW1jcHkocmVxX2N0eC0+cGFydGlhbF9oYXNoLCBzdGF0ZS0+cGFydGlhbF9oYXNoLAorCSAgICAgICBDSENSX0hBU0hfTUFYX0RJR0VTVF9TSVpFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGNyX2FoYXNoX3NldGtleShzdHJ1Y3QgY3J5cHRvX2FoYXNoICp0Zm0sIGNvbnN0IHU4ICprZXksCisJCQkgICAgIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisJc3RydWN0IGNoY3JfY29udGV4dCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgoY3J5cHRvX2FoYXNoX3RmbSh0Zm0pKTsKKwlzdHJ1Y3QgaG1hY19jdHggKmhtYWNjdHggPSBITUFDX0NUWChjdHgpOworCXVuc2lnbmVkIGludCBkaWdlc3RzaXplID0gY3J5cHRvX2FoYXNoX2RpZ2VzdHNpemUodGZtKTsKKwl1bnNpZ25lZCBpbnQgYnMgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoY3J5cHRvX2FoYXNoX3RmbSh0Zm0pKTsKKwl1bnNpZ25lZCBpbnQgaSwgZXJyID0gMCwgdXBkYXRlZF9kaWdlc3RzaXplOworCisJLyoKKwkgKiB1c2UgdGhlIGtleSB0byBjYWxjdWxhdGUgdGhlIGlwYWQgYW5kIG9wYWQuIGlwYWQgd2lsbCBzZW50IHdpdGggdGhlCisJICogZmlyc3QgcmVxdWVzdCdzIGRhdGEuIG9wYWQgd2lsbCBiZSBzZW50IHdpdGggdGhlIGZpbmFsIGhhc2ggcmVzdWx0CisJICogaXBhZCBpbiBobWFjY3R4LT5pcGFkIGFuZCBvcGFkIGluIGhtYWNjdHgtPm9wYWQgbG9jYXRpb24KKwkgKi8KKwlpZiAoIWhtYWNjdHgtPmRlc2MpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrZXlsZW4gPiBicykgeworCQllcnIgPSBjcnlwdG9fc2hhc2hfZGlnZXN0KGhtYWNjdHgtPmRlc2MsIGtleSwga2V5bGVuLAorCQkJCQkgIGhtYWNjdHgtPmlwYWQpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWtleWxlbiA9IGRpZ2VzdHNpemU7CisJfSBlbHNlIHsKKwkJbWVtY3B5KGhtYWNjdHgtPmlwYWQsIGtleSwga2V5bGVuKTsKKwl9CisJbWVtc2V0KGhtYWNjdHgtPmlwYWQgKyBrZXlsZW4sIDAsIGJzIC0ga2V5bGVuKTsKKwltZW1jcHkoaG1hY2N0eC0+b3BhZCwgaG1hY2N0eC0+aXBhZCwgYnMpOworCisJZm9yIChpID0gMDsgaSA8IGJzIC8gc2l6ZW9mKGludCk7IGkrKykgeworCQkqKCh1bnNpZ25lZCBpbnQgKikoJmhtYWNjdHgtPmlwYWQpICsgaSkgXj0gSVBBRF9EQVRBOworCQkqKCh1bnNpZ25lZCBpbnQgKikoJmhtYWNjdHgtPm9wYWQpICsgaSkgXj0gT1BBRF9EQVRBOworCX0KKworCXVwZGF0ZWRfZGlnZXN0c2l6ZSA9IGRpZ2VzdHNpemU7CisJaWYgKGRpZ2VzdHNpemUgPT0gU0hBMjI0X0RJR0VTVF9TSVpFKQorCQl1cGRhdGVkX2RpZ2VzdHNpemUgPSBTSEEyNTZfRElHRVNUX1NJWkU7CisJZWxzZSBpZiAoZGlnZXN0c2l6ZSA9PSBTSEEzODRfRElHRVNUX1NJWkUpCisJCXVwZGF0ZWRfZGlnZXN0c2l6ZSA9IFNIQTUxMl9ESUdFU1RfU0laRTsKKwllcnIgPSBjaGNyX2NvbXB1dGVfcGFydGlhbF9oYXNoKGhtYWNjdHgtPmRlc2MsIGhtYWNjdHgtPmlwYWQsCisJCQkJCWhtYWNjdHgtPmlwYWQsIGRpZ2VzdHNpemUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWNoY3JfY2hhbmdlX29yZGVyKGhtYWNjdHgtPmlwYWQsIHVwZGF0ZWRfZGlnZXN0c2l6ZSk7CisKKwllcnIgPSBjaGNyX2NvbXB1dGVfcGFydGlhbF9oYXNoKGhtYWNjdHgtPmRlc2MsIGhtYWNjdHgtPm9wYWQsCisJCQkJCWhtYWNjdHgtPm9wYWQsIGRpZ2VzdHNpemUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWNoY3JfY2hhbmdlX29yZGVyKGhtYWNjdHgtPm9wYWQsIHVwZGF0ZWRfZGlnZXN0c2l6ZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjaGNyX2Flc194dHNfc2V0a2V5KHN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqdGZtLCBjb25zdCB1OCAqa2V5LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBrZXlfbGVuKQoreworCXN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCA9IGNyeXB0b19hYmxrY2lwaGVyX2N0eCh0Zm0pOworCXN0cnVjdCBhYmxrX2N0eCAqYWJsa2N0eCA9IEFCTEtfQ1RYKGN0eCk7CisJaW50IHN0YXR1cyA9IDA7CisJdW5zaWduZWQgc2hvcnQgY29udGV4dF9zaXplID0gMDsKKworCWlmICgoa2V5X2xlbiA9PSAoQUVTX0tFWVNJWkVfMTI4IDw8IDEpKSB8fAorCSAgICAoa2V5X2xlbiA9PSAoQUVTX0tFWVNJWkVfMjU2IDw8IDEpKSkgeworCQltZW1jcHkoYWJsa2N0eC0+a2V5LCBrZXksIGtleV9sZW4pOworCQlhYmxrY3R4LT5lbmNrZXlfbGVuID0ga2V5X2xlbjsKKwkJY29udGV4dF9zaXplID0gKEtFWV9DT05URVhUX0hEUl9TQUxUX0FORF9QQUQgKyBrZXlfbGVuKSA+PiA0OworCQlhYmxrY3R4LT5rZXlfY3R4X2hkciA9CisJCQlGSUxMX0tFWV9DVFhfSERSKChrZXlfbGVuID09IEFFU19LRVlTSVpFXzI1NikgPworCQkJCQkgQ0hDUl9LRVlDVFhfQ0lQSEVSX0tFWV9TSVpFXzEyOCA6CisJCQkJCSBDSENSX0tFWUNUWF9DSVBIRVJfS0VZX1NJWkVfMjU2LAorCQkJCQkgQ0hDUl9LRVlDVFhfTk9fS0VZLCAxLAorCQkJCQkgMCwgY29udGV4dF9zaXplKTsKKwkJYWJsa2N0eC0+Y2lwaF9tb2RlID0gQ0hDUl9TQ01EX0NJUEhFUl9NT0RFX0FFU19YVFM7CisJfSBlbHNlIHsKKwkJY3J5cHRvX3RmbV9zZXRfZmxhZ3MoKHN0cnVjdCBjcnlwdG9fdGZtICopdGZtLAorCQkJCSAgICAgQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU4pOworCQlhYmxrY3R4LT5lbmNrZXlfbGVuID0gMDsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBjaGNyX3NoYV9pbml0KHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICphcmVxKQoreworCXN0cnVjdCBjaGNyX2FoYXNoX3JlcV9jdHggKnJlcV9jdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChhcmVxKTsKKwlzdHJ1Y3QgY3J5cHRvX2FoYXNoICp0Zm0gPSBjcnlwdG9fYWhhc2hfcmVxdGZtKGFyZXEpOworCWludCBkaWdlc3RzaXplID0gIGNyeXB0b19haGFzaF9kaWdlc3RzaXplKHRmbSk7CisKKwlyZXFfY3R4LT5kYXRhX2xlbiA9IDA7CisJcmVxX2N0eC0+ZHVtbXlfcGF5bG9hZF9wdHIgPSBOVUxMOworCXJlcV9jdHgtPmJmcl9sZW4gPSAwOworCXJlcV9jdHgtPnNrYiA9IE5VTEw7CisJcmVxX2N0eC0+cmVzdWx0ID0gMDsKKwljb3B5X2hhc2hfaW5pdF92YWx1ZXMocmVxX2N0eC0+cGFydGlhbF9oYXNoLCBkaWdlc3RzaXplKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGNyX3NoYV9jcmFfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCWNyeXB0b19haGFzaF9zZXRfcmVxc2l6ZShfX2NyeXB0b19haGFzaF9jYXN0KHRmbSksCisJCQkJIHNpemVvZihzdHJ1Y3QgY2hjcl9haGFzaF9yZXFfY3R4KSk7CisJcmV0dXJuIGNoY3JfZGV2aWNlX2luaXQoY3J5cHRvX3RmbV9jdHgodGZtKSk7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9obWFjX2luaXQoc3RydWN0IGFoYXNoX3JlcXVlc3QgKmFyZXEpCit7CisJc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqcmVxX2N0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KGFyZXEpOworCXN0cnVjdCBjcnlwdG9fYWhhc2ggKnJ0Zm0gPSBjcnlwdG9fYWhhc2hfcmVxdGZtKGFyZXEpOworCXN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCA9IGNyeXB0b190Zm1fY3R4KGNyeXB0b19haGFzaF90Zm0ocnRmbSkpOworCXN0cnVjdCBobWFjX2N0eCAqaG1hY2N0eCA9IEhNQUNfQ1RYKGN0eCk7CisJdW5zaWduZWQgaW50IGRpZ2VzdHNpemUgPSBjcnlwdG9fYWhhc2hfZGlnZXN0c2l6ZShydGZtKTsKKwl1bnNpZ25lZCBpbnQgYnMgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoY3J5cHRvX2FoYXNoX3RmbShydGZtKSk7CisKKwljaGNyX3NoYV9pbml0KGFyZXEpOworCXJlcV9jdHgtPmRhdGFfbGVuID0gYnM7CisJaWYgKGlzX2htYWMoY3J5cHRvX2FoYXNoX3RmbShydGZtKSkpIHsKKwkJaWYgKGRpZ2VzdHNpemUgPT0gU0hBMjI0X0RJR0VTVF9TSVpFKQorCQkJbWVtY3B5KHJlcV9jdHgtPnBhcnRpYWxfaGFzaCwgaG1hY2N0eC0+aXBhZCwKKwkJCSAgICAgICBTSEEyNTZfRElHRVNUX1NJWkUpOworCQllbHNlIGlmIChkaWdlc3RzaXplID09IFNIQTM4NF9ESUdFU1RfU0laRSkKKwkJCW1lbWNweShyZXFfY3R4LT5wYXJ0aWFsX2hhc2gsIGhtYWNjdHgtPmlwYWQsCisJCQkgICAgICAgU0hBNTEyX0RJR0VTVF9TSVpFKTsKKwkJZWxzZQorCQkJbWVtY3B5KHJlcV9jdHgtPnBhcnRpYWxfaGFzaCwgaG1hY2N0eC0+aXBhZCwKKwkJCSAgICAgICBkaWdlc3RzaXplKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9obWFjX2NyYV9pbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3RydWN0IGNoY3JfY29udGV4dCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwlzdHJ1Y3QgaG1hY19jdHggKmhtYWNjdHggPSBITUFDX0NUWChjdHgpOworCXVuc2lnbmVkIGludCBkaWdlc3RzaXplID0KKwkJY3J5cHRvX2FoYXNoX2RpZ2VzdHNpemUoX19jcnlwdG9fYWhhc2hfY2FzdCh0Zm0pKTsKKworCWNyeXB0b19haGFzaF9zZXRfcmVxc2l6ZShfX2NyeXB0b19haGFzaF9jYXN0KHRmbSksCisJCQkJIHNpemVvZihzdHJ1Y3QgY2hjcl9haGFzaF9yZXFfY3R4KSk7CisJaG1hY2N0eC0+ZGVzYyA9IGNoY3JfYWxsb2Nfc2hhc2goZGlnZXN0c2l6ZSk7CisJaWYgKElTX0VSUihobWFjY3R4LT5kZXNjKSkKKwkJcmV0dXJuIFBUUl9FUlIoaG1hY2N0eC0+ZGVzYyk7CisJcmV0dXJuIGNoY3JfZGV2aWNlX2luaXQoY3J5cHRvX3RmbV9jdHgodGZtKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoY3JfZnJlZV9zaGFzaChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYykKK3sKKwljcnlwdG9fZnJlZV9zaGFzaChkZXNjLT50Zm0pOworCWtmcmVlKGRlc2MpOworfQorCitzdGF0aWMgdm9pZCBjaGNyX2htYWNfY3JhX2V4aXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzdHJ1Y3QgY2hjcl9jb250ZXh0ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCXN0cnVjdCBobWFjX2N0eCAqaG1hY2N0eCA9IEhNQUNfQ1RYKGN0eCk7CisKKwlpZiAoaG1hY2N0eC0+ZGVzYykgeworCQljaGNyX2ZyZWVfc2hhc2goaG1hY2N0eC0+ZGVzYyk7CisJCWhtYWNjdHgtPmRlc2MgPSBOVUxMOworCX0KK30KKworc3RhdGljIHN0cnVjdCBjaGNyX2FsZ190ZW1wbGF0ZSBkcml2ZXJfYWxnc1tdID0geworCS8qIEFFUy1DQkMgKi8KKwl7CisJCS50eXBlID0gQ1JZUFRPX0FMR19UWVBFX0FCTEtDSVBIRVIsCisJCS5pc19yZWdpc3RlcmVkID0gMCwKKwkJLmFsZy5jcnlwdG8gPSB7CisJCQkuY3JhX25hbWUJCT0gImNiYyhhZXMpIiwKKwkJCS5jcmFfZHJpdmVyX25hbWUJPSAiY2JjKGFlcy1jaGNyKSIsCisJCQkuY3JhX3ByaW9yaXR5CQk9IENIQ1JfQ1JBX1BSSU9SSVRZLAorCQkJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQlDUllQVE9fQUxHX0FTWU5DLAorCQkJLmNyYV9ibG9ja3NpemUJCT0gQUVTX0JMT0NLX1NJWkUsCisJCQkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBjaGNyX2NvbnRleHQpCisJCQkJKyBzaXplb2Yoc3RydWN0IGFibGtfY3R4KSwKKwkJCS5jcmFfYWxpZ25tYXNrCQk9IDAsCisJCQkuY3JhX3R5cGUJCT0gJmNyeXB0b19hYmxrY2lwaGVyX3R5cGUsCisJCQkuY3JhX21vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkJCS5jcmFfaW5pdAkJPSBjaGNyX2NyYV9pbml0LAorCQkJLmNyYV9leGl0CQk9IE5VTEwsCisJCQkuY3JhX3UuYWJsa2NpcGhlcgk9IHsKKwkJCQkubWluX2tleXNpemUJPSBBRVNfTUlOX0tFWV9TSVpFLAorCQkJCS5tYXhfa2V5c2l6ZQk9IEFFU19NQVhfS0VZX1NJWkUsCisJCQkJLml2c2l6ZQkJPSBBRVNfQkxPQ0tfU0laRSwKKwkJCQkuc2V0a2V5CQkJPSBjaGNyX2Flc19jYmNfc2V0a2V5LAorCQkJCS5lbmNyeXB0CQk9IGNoY3JfYWVzX2VuY3J5cHQsCisJCQkJLmRlY3J5cHQJCT0gY2hjcl9hZXNfZGVjcnlwdCwKKwkJCX0KKwkJfQorCX0sCisJeworCQkudHlwZSA9IENSWVBUT19BTEdfVFlQRV9BQkxLQ0lQSEVSLAorCQkuaXNfcmVnaXN0ZXJlZCA9IDAsCisJCS5hbGcuY3J5cHRvID0gICB7CisJCQkuY3JhX25hbWUJCT0gInh0cyhhZXMpIiwKKwkJCS5jcmFfZHJpdmVyX25hbWUJPSAieHRzKGFlcy1jaGNyKSIsCisJCQkuY3JhX3ByaW9yaXR5CQk9IENIQ1JfQ1JBX1BSSU9SSVRZLAorCQkJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQlDUllQVE9fQUxHX0FTWU5DLAorCQkJLmNyYV9ibG9ja3NpemUJCT0gQUVTX0JMT0NLX1NJWkUsCisJCQkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBjaGNyX2NvbnRleHQpICsKKwkJCQlzaXplb2Yoc3RydWN0IGFibGtfY3R4KSwKKwkJCS5jcmFfYWxpZ25tYXNrCQk9IDAsCisJCQkuY3JhX3R5cGUJCT0gJmNyeXB0b19hYmxrY2lwaGVyX3R5cGUsCisJCQkuY3JhX21vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkJCS5jcmFfaW5pdAkJPSBjaGNyX2NyYV9pbml0LAorCQkJLmNyYV9leGl0CQk9IE5VTEwsCisJCQkuY3JhX3UgPSB7CisJCQkJLmFibGtjaXBoZXIgPSB7CisJCQkJCS5taW5fa2V5c2l6ZQk9IDIgKiBBRVNfTUlOX0tFWV9TSVpFLAorCQkJCQkubWF4X2tleXNpemUJPSAyICogQUVTX01BWF9LRVlfU0laRSwKKwkJCQkJLml2c2l6ZQkJPSBBRVNfQkxPQ0tfU0laRSwKKwkJCQkJLnNldGtleQkJPSBjaGNyX2Flc194dHNfc2V0a2V5LAorCQkJCQkuZW5jcnlwdAk9IGNoY3JfYWVzX2VuY3J5cHQsCisJCQkJCS5kZWNyeXB0CT0gY2hjcl9hZXNfZGVjcnlwdCwKKwkJCQl9CisJCQl9CisJCX0KKwl9LAorCS8qIFNIQSAqLworCXsKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfQUhBU0gsCisJCS5pc19yZWdpc3RlcmVkID0gMCwKKwkJLmFsZy5oYXNoID0geworCQkJLmhhbGcuZGlnZXN0c2l6ZSA9IFNIQTFfRElHRVNUX1NJWkUsCisJCQkuaGFsZy5iYXNlID0geworCQkJCS5jcmFfbmFtZSA9ICJzaGExIiwKKwkJCQkuY3JhX2RyaXZlcl9uYW1lID0gInNoYTEtY2hjciIsCisJCQkJLmNyYV9ibG9ja3NpemUgPSBTSEExX0JMT0NLX1NJWkUsCisJCQl9CisJCX0KKwl9LAorCXsKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfQUhBU0gsCisJCS5pc19yZWdpc3RlcmVkID0gMCwKKwkJLmFsZy5oYXNoID0geworCQkJLmhhbGcuZGlnZXN0c2l6ZSA9IFNIQTI1Nl9ESUdFU1RfU0laRSwKKwkJCS5oYWxnLmJhc2UgPSB7CisJCQkJLmNyYV9uYW1lID0gInNoYTI1NiIsCisJCQkJLmNyYV9kcml2ZXJfbmFtZSA9ICJzaGEyNTYtY2hjciIsCisJCQkJLmNyYV9ibG9ja3NpemUgPSBTSEEyNTZfQkxPQ0tfU0laRSwKKwkJCX0KKwkJfQorCX0sCisJeworCQkudHlwZSA9IENSWVBUT19BTEdfVFlQRV9BSEFTSCwKKwkJLmlzX3JlZ2lzdGVyZWQgPSAwLAorCQkuYWxnLmhhc2ggPSB7CisJCQkuaGFsZy5kaWdlc3RzaXplID0gU0hBMjI0X0RJR0VTVF9TSVpFLAorCQkJLmhhbGcuYmFzZSA9IHsKKwkJCQkuY3JhX25hbWUgPSAic2hhMjI0IiwKKwkJCQkuY3JhX2RyaXZlcl9uYW1lID0gInNoYTIyNC1jaGNyIiwKKwkJCQkuY3JhX2Jsb2Nrc2l6ZSA9IFNIQTIyNF9CTE9DS19TSVpFLAorCQkJfQorCQl9CisJfSwKKwl7CisJCS50eXBlID0gQ1JZUFRPX0FMR19UWVBFX0FIQVNILAorCQkuaXNfcmVnaXN0ZXJlZCA9IDAsCisJCS5hbGcuaGFzaCA9IHsKKwkJCS5oYWxnLmRpZ2VzdHNpemUgPSBTSEEzODRfRElHRVNUX1NJWkUsCisJCQkuaGFsZy5iYXNlID0geworCQkJCS5jcmFfbmFtZSA9ICJzaGEzODQiLAorCQkJCS5jcmFfZHJpdmVyX25hbWUgPSAic2hhMzg0LWNoY3IiLAorCQkJCS5jcmFfYmxvY2tzaXplID0gU0hBMzg0X0JMT0NLX1NJWkUsCisJCQl9CisJCX0KKwl9LAorCXsKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfQUhBU0gsCisJCS5pc19yZWdpc3RlcmVkID0gMCwKKwkJLmFsZy5oYXNoID0geworCQkJLmhhbGcuZGlnZXN0c2l6ZSA9IFNIQTUxMl9ESUdFU1RfU0laRSwKKwkJCS5oYWxnLmJhc2UgPSB7CisJCQkJLmNyYV9uYW1lID0gInNoYTUxMiIsCisJCQkJLmNyYV9kcml2ZXJfbmFtZSA9ICJzaGE1MTItY2hjciIsCisJCQkJLmNyYV9ibG9ja3NpemUgPSBTSEE1MTJfQkxPQ0tfU0laRSwKKwkJCX0KKwkJfQorCX0sCisJLyogSE1BQyAqLworCXsKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfSE1BQywKKwkJLmlzX3JlZ2lzdGVyZWQgPSAwLAorCQkuYWxnLmhhc2ggPSB7CisJCQkuaGFsZy5kaWdlc3RzaXplID0gU0hBMV9ESUdFU1RfU0laRSwKKwkJCS5oYWxnLmJhc2UgPSB7CisJCQkJLmNyYV9uYW1lID0gImhtYWMoc2hhMSkiLAorCQkJCS5jcmFfZHJpdmVyX25hbWUgPSAiaG1hYyhzaGExLWNoY3IpIiwKKwkJCQkuY3JhX2Jsb2Nrc2l6ZSA9IFNIQTFfQkxPQ0tfU0laRSwKKwkJCX0KKwkJfQorCX0sCisJeworCQkudHlwZSA9IENSWVBUT19BTEdfVFlQRV9ITUFDLAorCQkuaXNfcmVnaXN0ZXJlZCA9IDAsCisJCS5hbGcuaGFzaCA9IHsKKwkJCS5oYWxnLmRpZ2VzdHNpemUgPSBTSEEyMjRfRElHRVNUX1NJWkUsCisJCQkuaGFsZy5iYXNlID0geworCQkJCS5jcmFfbmFtZSA9ICJobWFjKHNoYTIyNCkiLAorCQkJCS5jcmFfZHJpdmVyX25hbWUgPSAiaG1hYyhzaGEyMjQtY2hjcikiLAorCQkJCS5jcmFfYmxvY2tzaXplID0gU0hBMjI0X0JMT0NLX1NJWkUsCisJCQl9CisJCX0KKwl9LAorCXsKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfSE1BQywKKwkJLmlzX3JlZ2lzdGVyZWQgPSAwLAorCQkuYWxnLmhhc2ggPSB7CisJCQkuaGFsZy5kaWdlc3RzaXplID0gU0hBMjU2X0RJR0VTVF9TSVpFLAorCQkJLmhhbGcuYmFzZSA9IHsKKwkJCQkuY3JhX25hbWUgPSAiaG1hYyhzaGEyNTYpIiwKKwkJCQkuY3JhX2RyaXZlcl9uYW1lID0gImhtYWMoc2hhMjU2LWNoY3IpIiwKKwkJCQkuY3JhX2Jsb2Nrc2l6ZSA9IFNIQTI1Nl9CTE9DS19TSVpFLAorCQkJfQorCQl9CisJfSwKKwl7CisJCS50eXBlID0gQ1JZUFRPX0FMR19UWVBFX0hNQUMsCisJCS5pc19yZWdpc3RlcmVkID0gMCwKKwkJLmFsZy5oYXNoID0geworCQkJLmhhbGcuZGlnZXN0c2l6ZSA9IFNIQTM4NF9ESUdFU1RfU0laRSwKKwkJCS5oYWxnLmJhc2UgPSB7CisJCQkJLmNyYV9uYW1lID0gImhtYWMoc2hhMzg0KSIsCisJCQkJLmNyYV9kcml2ZXJfbmFtZSA9ICJobWFjKHNoYTM4NC1jaGNyKSIsCisJCQkJLmNyYV9ibG9ja3NpemUgPSBTSEEzODRfQkxPQ0tfU0laRSwKKwkJCX0KKwkJfQorCX0sCisJeworCQkudHlwZSA9IENSWVBUT19BTEdfVFlQRV9ITUFDLAorCQkuaXNfcmVnaXN0ZXJlZCA9IDAsCisJCS5hbGcuaGFzaCA9IHsKKwkJCS5oYWxnLmRpZ2VzdHNpemUgPSBTSEE1MTJfRElHRVNUX1NJWkUsCisJCQkuaGFsZy5iYXNlID0geworCQkJCS5jcmFfbmFtZSA9ICJobWFjKHNoYTUxMikiLAorCQkJCS5jcmFfZHJpdmVyX25hbWUgPSAiaG1hYyhzaGE1MTItY2hjcikiLAorCQkJCS5jcmFfYmxvY2tzaXplID0gU0hBNTEyX0JMT0NLX1NJWkUsCisJCQl9CisJCX0KKwl9LAorfTsKKworLyoKKyAqCWNoY3JfdW5yZWdpc3Rlcl9hbGcgLSBEZXJlZ2lzdGVyIGNyeXB0byBhbGdvcml0aG1zIHdpdGgKKyAqCWtlcm5lbCBmcmFtZXdvcmsuCisgKi8KK3N0YXRpYyBpbnQgY2hjcl91bnJlZ2lzdGVyX2FsZyh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHJpdmVyX2FsZ3MpOyBpKyspIHsKKwkJc3dpdGNoIChkcml2ZXJfYWxnc1tpXS50eXBlICYgQ1JZUFRPX0FMR19UWVBFX01BU0spIHsKKwkJY2FzZSBDUllQVE9fQUxHX1RZUEVfQUJMS0NJUEhFUjoKKwkJCWlmIChkcml2ZXJfYWxnc1tpXS5pc19yZWdpc3RlcmVkKQorCQkJCWNyeXB0b191bnJlZ2lzdGVyX2FsZygKKwkJCQkJCSZkcml2ZXJfYWxnc1tpXS5hbGcuY3J5cHRvKTsKKwkJCWJyZWFrOworCQljYXNlIENSWVBUT19BTEdfVFlQRV9BSEFTSDoKKwkJCWlmIChkcml2ZXJfYWxnc1tpXS5pc19yZWdpc3RlcmVkKQorCQkJCWNyeXB0b191bnJlZ2lzdGVyX2FoYXNoKAorCQkJCQkJJmRyaXZlcl9hbGdzW2ldLmFsZy5oYXNoKTsKKwkJCWJyZWFrOworCQl9CisJCWRyaXZlcl9hbGdzW2ldLmlzX3JlZ2lzdGVyZWQgPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBTWl9BSEFTSF9DVFggc2l6ZW9mKHN0cnVjdCBjaGNyX2NvbnRleHQpCisjZGVmaW5lIFNaX0FIQVNIX0hfQ1RYIChzaXplb2Yoc3RydWN0IGNoY3JfY29udGV4dCkgKyBzaXplb2Yoc3RydWN0IGhtYWNfY3R4KSkKKyNkZWZpbmUgU1pfQUhBU0hfUkVRX0NUWCBzaXplb2Yoc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCkKKyNkZWZpbmUgQUhBU0hfQ1JBX0ZMQUdTIChDUllQVE9fQUxHX1RZUEVfQUhBU0ggfCBDUllQVE9fQUxHX0FTWU5DKQorCisvKgorICoJY2hjcl9yZWdpc3Rlcl9hbGcgLSBSZWdpc3RlciBjcnlwdG8gYWxnb3JpdGhtcyB3aXRoIGtlcm5lbCBmcmFtZXdvcmsuCisgKi8KK3N0YXRpYyBpbnQgY2hjcl9yZWdpc3Rlcl9hbGcodm9pZCkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FsZyBhaTsKKwlzdHJ1Y3QgYWhhc2hfYWxnICphX2hhc2g7CisJaW50IGVyciA9IDAsIGk7CisJY2hhciAqbmFtZSA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkcml2ZXJfYWxncyk7IGkrKykgeworCQlpZiAoZHJpdmVyX2FsZ3NbaV0uaXNfcmVnaXN0ZXJlZCkKKwkJCWNvbnRpbnVlOworCQlzd2l0Y2ggKGRyaXZlcl9hbGdzW2ldLnR5cGUgJiBDUllQVE9fQUxHX1RZUEVfTUFTSykgeworCQljYXNlIENSWVBUT19BTEdfVFlQRV9BQkxLQ0lQSEVSOgorCQkJZXJyID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmZHJpdmVyX2FsZ3NbaV0uYWxnLmNyeXB0byk7CisJCQluYW1lID0gZHJpdmVyX2FsZ3NbaV0uYWxnLmNyeXB0by5jcmFfZHJpdmVyX25hbWU7CisJCQlicmVhazsKKwkJY2FzZSBDUllQVE9fQUxHX1RZUEVfQUhBU0g6CisJCQlhX2hhc2ggPSAmZHJpdmVyX2FsZ3NbaV0uYWxnLmhhc2g7CisJCQlhX2hhc2gtPnVwZGF0ZSA9IGNoY3JfYWhhc2hfdXBkYXRlOworCQkJYV9oYXNoLT5maW5hbCA9IGNoY3JfYWhhc2hfZmluYWw7CisJCQlhX2hhc2gtPmZpbnVwID0gY2hjcl9haGFzaF9maW51cDsKKwkJCWFfaGFzaC0+ZGlnZXN0ID0gY2hjcl9haGFzaF9kaWdlc3Q7CisJCQlhX2hhc2gtPmV4cG9ydCA9IGNoY3JfYWhhc2hfZXhwb3J0OworCQkJYV9oYXNoLT5pbXBvcnQgPSBjaGNyX2FoYXNoX2ltcG9ydDsKKwkJCWFfaGFzaC0+aGFsZy5zdGF0ZXNpemUgPSBTWl9BSEFTSF9SRVFfQ1RYOworCQkJYV9oYXNoLT5oYWxnLmJhc2UuY3JhX3ByaW9yaXR5ID0gQ0hDUl9DUkFfUFJJT1JJVFk7CisJCQlhX2hhc2gtPmhhbGcuYmFzZS5jcmFfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJCQlhX2hhc2gtPmhhbGcuYmFzZS5jcmFfZmxhZ3MgPSBBSEFTSF9DUkFfRkxBR1M7CisJCQlhX2hhc2gtPmhhbGcuYmFzZS5jcmFfYWxpZ25tYXNrID0gMDsKKwkJCWFfaGFzaC0+aGFsZy5iYXNlLmNyYV9leGl0ID0gTlVMTDsKKwkJCWFfaGFzaC0+aGFsZy5iYXNlLmNyYV90eXBlID0gJmNyeXB0b19haGFzaF90eXBlOworCisJCQlpZiAoZHJpdmVyX2FsZ3NbaV0udHlwZSA9PSBDUllQVE9fQUxHX1RZUEVfSE1BQykgeworCQkJCWFfaGFzaC0+aGFsZy5iYXNlLmNyYV9pbml0ID0gY2hjcl9obWFjX2NyYV9pbml0OworCQkJCWFfaGFzaC0+aGFsZy5iYXNlLmNyYV9leGl0ID0gY2hjcl9obWFjX2NyYV9leGl0OworCQkJCWFfaGFzaC0+aW5pdCA9IGNoY3JfaG1hY19pbml0OworCQkJCWFfaGFzaC0+c2V0a2V5ID0gY2hjcl9haGFzaF9zZXRrZXk7CisJCQkJYV9oYXNoLT5oYWxnLmJhc2UuY3JhX2N0eHNpemUgPSBTWl9BSEFTSF9IX0NUWDsKKwkJCX0gZWxzZSB7CisJCQkJYV9oYXNoLT5pbml0ID0gY2hjcl9zaGFfaW5pdDsKKwkJCQlhX2hhc2gtPmhhbGcuYmFzZS5jcmFfY3R4c2l6ZSA9IFNaX0FIQVNIX0NUWDsKKwkJCQlhX2hhc2gtPmhhbGcuYmFzZS5jcmFfaW5pdCA9IGNoY3Jfc2hhX2NyYV9pbml0OworCQkJfQorCQkJZXJyID0gY3J5cHRvX3JlZ2lzdGVyX2FoYXNoKCZkcml2ZXJfYWxnc1tpXS5hbGcuaGFzaCk7CisJCQlhaSA9IGRyaXZlcl9hbGdzW2ldLmFsZy5oYXNoLmhhbGcuYmFzZTsKKwkJCW5hbWUgPSBhaS5jcmFfZHJpdmVyX25hbWU7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZXJyKSB7CisJCQlwcl9lcnIoImNoY3IgOiAlcyA6IEFsZ29yaXRobSByZWdpc3RyYXRpb24gZmFpbGVkXG4iLAorCQkJICAgICAgIG5hbWUpOworCQkJZ290byByZWdpc3Rlcl9lcnI7CisJCX0gZWxzZSB7CisJCQlkcml2ZXJfYWxnc1tpXS5pc19yZWdpc3RlcmVkID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKKworcmVnaXN0ZXJfZXJyOgorCWNoY3JfdW5yZWdpc3Rlcl9hbGcoKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJc3RhcnRfY3J5cHRvIC0gUmVnaXN0ZXIgdGhlIGNyeXB0byBhbGdvcml0aG1zLgorICoJVGhpcyBzaG91bGQgY2FsbGVkIG9uY2Ugd2hlbiB0aGUgZmlyc3QgZGV2aWNlIGNvbWVzdXAuIEFmdGVyIHRoaXMKKyAqCWtlcm5lbCB3aWxsIHN0YXJ0IGNhbGxpbmcgZHJpdmVyIEFQSXMgZm9yIGNyeXB0byBvcGVyYXRpb25zLgorICovCitpbnQgc3RhcnRfY3J5cHRvKHZvaWQpCit7CisJcmV0dXJuIGNoY3JfcmVnaXN0ZXJfYWxnKCk7Cit9CisKKy8qCisgKglzdG9wX2NyeXB0byAtIERlcmVnaXN0ZXIgYWxsIHRoZSBjcnlwdG8gYWxnb3JpdGhtcyB3aXRoIGtlcm5lbC4KKyAqCVRoaXMgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIHdoZW4gdGhlIGxhc3QgZGV2aWNlIGdvZXMgZG93bi4gQWZ0ZXIgdGhpcworICoJa2VybmVsIHdpbGwgbm90IGNhbGwgdGhlIGRyaXZlciBBUEkgZm9yIGNyeXB0byBvcGVyYXRpb25zLgorICovCitpbnQgc3RvcF9jcnlwdG8odm9pZCkKK3sKKwljaGNyX3VucmVnaXN0ZXJfYWxnKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9jaGVsc2lvL2NoY3JfYWxnby5oIGIvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9jaGNyX2FsZ28uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzY0ZmJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9jaGNyX2FsZ28uaApAQCAtMCwwICsxLDQ3MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ2IENyeXB0byBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9fQ0hDUl9BTEdPX0hfXworI2RlZmluZSBfX0NIQ1JfQUxHT19IX18KKworLyogQ3J5cHRvIGtleSBjb250ZXh0ICovCisjZGVmaW5lIEtFWV9DT05URVhUX0NUWF9MRU5fUyAgICAgICAgICAgMjQKKyNkZWZpbmUgS0VZX0NPTlRFWFRfQ1RYX0xFTl9NICAgICAgICAgICAweGZmCisjZGVmaW5lIEtFWV9DT05URVhUX0NUWF9MRU5fVih4KSAgICAgICAgKCh4KSA8PCBLRVlfQ09OVEVYVF9DVFhfTEVOX1MpCisjZGVmaW5lIEtFWV9DT05URVhUX0NUWF9MRU5fRyh4KSBcCisJKCgoeCkgPj4gS0VZX0NPTlRFWFRfQ1RYX0xFTl9TKSAmIEtFWV9DT05URVhUX0NUWF9MRU5fTSkKKworI2RlZmluZSBLRVlfQ09OVEVYVF9EVUFMX0NLX1MgICAgICAxMgorI2RlZmluZSBLRVlfQ09OVEVYVF9EVUFMX0NLX00gICAgICAweDEKKyNkZWZpbmUgS0VZX0NPTlRFWFRfRFVBTF9DS19WKHgpICAgKCh4KSA8PCBLRVlfQ09OVEVYVF9EVUFMX0NLX1MpCisjZGVmaW5lIEtFWV9DT05URVhUX0RVQUxfQ0tfRyh4KSAgIFwKKygoKHgpID4+IEtFWV9DT05URVhUX0RVQUxfQ0tfUykgJiBLRVlfQ09OVEVYVF9EVUFMX0NLX00pCisjZGVmaW5lIEtFWV9DT05URVhUX0RVQUxfQ0tfRiAgICAgIEtFWV9DT05URVhUX0RVQUxfQ0tfVigxVSkKKworI2RlZmluZSBLRVlfQ09OVEVYVF9TQUxUX1BSRVNFTlRfUyAgICAgIDEwCisjZGVmaW5lIEtFWV9DT05URVhUX1NBTFRfUFJFU0VOVF9NICAgICAgMHgxCisjZGVmaW5lIEtFWV9DT05URVhUX1NBTFRfUFJFU0VOVF9WKHgpICAgKCh4KSA8PCBLRVlfQ09OVEVYVF9TQUxUX1BSRVNFTlRfUykKKyNkZWZpbmUgS0VZX0NPTlRFWFRfU0FMVF9QUkVTRU5UX0coeCkgICBcCisJKCgoeCkgPj4gS0VZX0NPTlRFWFRfU0FMVF9QUkVTRU5UX1MpICYgXAorCSBLRVlfQ09OVEVYVF9TQUxUX1BSRVNFTlRfTSkKKyNkZWZpbmUgS0VZX0NPTlRFWFRfU0FMVF9QUkVTRU5UX0YgICAgICBLRVlfQ09OVEVYVF9TQUxUX1BSRVNFTlRfVigxVSkKKworI2RlZmluZSBLRVlfQ09OVEVYVF9WQUxJRF9TICAgICAwCisjZGVmaW5lIEtFWV9DT05URVhUX1ZBTElEX00gICAgIDB4MQorI2RlZmluZSBLRVlfQ09OVEVYVF9WQUxJRF9WKHgpICAoKHgpIDw8IEtFWV9DT05URVhUX1ZBTElEX1MpCisjZGVmaW5lIEtFWV9DT05URVhUX1ZBTElEX0coeCkgIFwKKwkoKCh4KSA+PiBLRVlfQ09OVEVYVF9WQUxJRF9TKSAmIFwKKwkgS0VZX0NPTlRFWFRfVkFMSURfTSkKKyNkZWZpbmUgS0VZX0NPTlRFWFRfVkFMSURfRiAgICAgS0VZX0NPTlRFWFRfVkFMSURfVigxVSkKKworI2RlZmluZSBLRVlfQ09OVEVYVF9DS19TSVpFX1MgICAgICAgICAgIDYKKyNkZWZpbmUgS0VZX0NPTlRFWFRfQ0tfU0laRV9NICAgICAgICAgICAweGYKKyNkZWZpbmUgS0VZX0NPTlRFWFRfQ0tfU0laRV9WKHgpICAgICAgICAoKHgpIDw8IEtFWV9DT05URVhUX0NLX1NJWkVfUykKKyNkZWZpbmUgS0VZX0NPTlRFWFRfQ0tfU0laRV9HKHgpICAgICAgICBcCisJKCgoeCkgPj4gS0VZX0NPTlRFWFRfQ0tfU0laRV9TKSAmIEtFWV9DT05URVhUX0NLX1NJWkVfTSkKKworI2RlZmluZSBLRVlfQ09OVEVYVF9NS19TSVpFX1MgICAgICAgICAgIDIKKyNkZWZpbmUgS0VZX0NPTlRFWFRfTUtfU0laRV9NICAgICAgICAgICAweGYKKyNkZWZpbmUgS0VZX0NPTlRFWFRfTUtfU0laRV9WKHgpICAgICAgICAoKHgpIDw8IEtFWV9DT05URVhUX01LX1NJWkVfUykKKyNkZWZpbmUgS0VZX0NPTlRFWFRfTUtfU0laRV9HKHgpICAgICAgICBcCisJKCgoeCkgPj4gS0VZX0NPTlRFWFRfTUtfU0laRV9TKSAmIEtFWV9DT05URVhUX01LX1NJWkVfTSkKKworI2RlZmluZSBLRVlfQ09OVEVYVF9PUEFEX1BSRVNFTlRfUyAgICAgIDExCisjZGVmaW5lIEtFWV9DT05URVhUX09QQURfUFJFU0VOVF9NICAgICAgMHgxCisjZGVmaW5lIEtFWV9DT05URVhUX09QQURfUFJFU0VOVF9WKHgpICAgKCh4KSA8PCBLRVlfQ09OVEVYVF9PUEFEX1BSRVNFTlRfUykKKyNkZWZpbmUgS0VZX0NPTlRFWFRfT1BBRF9QUkVTRU5UX0coeCkgICBcCisJKCgoeCkgPj4gS0VZX0NPTlRFWFRfT1BBRF9QUkVTRU5UX1MpICYgXAorCSBLRVlfQ09OVEVYVF9PUEFEX1BSRVNFTlRfTSkKKyNkZWZpbmUgS0VZX0NPTlRFWFRfT1BBRF9QUkVTRU5UX0YgICAgICBLRVlfQ09OVEVYVF9PUEFEX1BSRVNFTlRfVigxVSkKKworI2RlZmluZSBDSENSX0hBU0hfTUFYX0RJR0VTVF9TSVpFIDY0CisjZGVmaW5lIENIQ1JfTUFYX1NIQV9ESUdFU1RfU0laRSA2NAorCisjZGVmaW5lIElQU0VDX1RSVU5DQVRFRF9JQ1ZfU0laRSAxMgorI2RlZmluZSBUTFNfVFJVTkNBVEVEX0hNQUNfU0laRSAxMAorI2RlZmluZSBDQkNNQUNfRElHRVNUX1NJWkUgMTYKKyNkZWZpbmUgTUFYX0hBU0hfTkFNRSAyMAorCisjZGVmaW5lIFNIQTFfSU5JVF9TVEFURV81WDRCICAgIDUKKyNkZWZpbmUgU0hBMjU2X0lOSVRfU1RBVEVfOFg0QiAgOAorI2RlZmluZSBTSEE1MTJfSU5JVF9TVEFURV84WDhCICA4CisjZGVmaW5lIFNIQTFfSU5JVF9TVEFURSAgICAgICAgIFNIQTFfSU5JVF9TVEFURV81WDRCCisjZGVmaW5lIFNIQTIyNF9JTklUX1NUQVRFICAgICAgIFNIQTI1Nl9JTklUX1NUQVRFXzhYNEIKKyNkZWZpbmUgU0hBMjU2X0lOSVRfU1RBVEUgICAgICAgU0hBMjU2X0lOSVRfU1RBVEVfOFg0QgorI2RlZmluZSBTSEEzODRfSU5JVF9TVEFURSAgICAgICBTSEE1MTJfSU5JVF9TVEFURV84WDhCCisjZGVmaW5lIFNIQTUxMl9JTklUX1NUQVRFICAgICAgIFNIQTUxMl9JTklUX1NUQVRFXzhYOEIKKworI2RlZmluZSBEVU1NWV9CWVRFUyAxNgorCisjZGVmaW5lIElQQURfREFUQSAweDM2MzYzNjM2CisjZGVmaW5lIE9QQURfREFUQSAweDVjNWM1YzVjCisKKyNkZWZpbmUgVFJBTlNIRFJfU0laRShhbGlnbmVka2N0eF9sZW4pXAorCShzaXplb2Yoc3RydWN0IHVscHR4X2lkYXRhKSArXAorCSBzaXplb2Yoc3RydWN0IHVscF90eHBrdCkgK1wKKwkgc2l6ZW9mKHN0cnVjdCBmd19jcnlwdG9fbG9va2FzaWRlX3dyKSArXAorCSBzaXplb2Yoc3RydWN0IGNwbF90eF9zZWNfcGR1KSArXAorCSAoYWxpZ25lZGtjdHhfbGVuKSkKKyNkZWZpbmUgQ0lQSEVSX1RSQU5TSERSX1NJWkUoYWxpZ25lZGtjdHhfbGVuLCBzZ2VfcGFpcnMpIFwKKwkoVFJBTlNIRFJfU0laRShhbGlnbmVka2N0eF9sZW4pICsgc2dlX3BhaXJzICtcCisJIHNpemVvZihzdHJ1Y3QgY3BsX3J4X3BoeXNfZHNnbCkpCisjZGVmaW5lIEhBU0hfVFJBTlNIRFJfU0laRShhbGlnbmVka2N0eF9sZW4pXAorCShUUkFOU0hEUl9TSVpFKGFsaWduZWRrY3R4X2xlbikgKyBEVU1NWV9CWVRFUykKKworI2RlZmluZSBTRUNfQ1BMX09GRlNFVCAoc2l6ZW9mKHN0cnVjdCBmd19jcnlwdG9fbG9va2FzaWRlX3dyKSArIFwKKwkJCXNpemVvZihzdHJ1Y3QgdWxwX3R4cGt0KSArIFwKKwkJCXNpemVvZihzdHJ1Y3QgdWxwdHhfaWRhdGEpKQorCisjZGVmaW5lIEZJTExfU0VDX0NQTF9PUF9JVklOU1IoaWQsIGxlbiwgaGxkciwgb2ZzdCkgICAgICBcCisJaHRvbmwoIFwKKwkgICAgICAgQ1BMX1RYX1NFQ19QRFVfT1BDT0RFX1YoQ1BMX1RYX1NFQ19QRFUpIHwgXAorCSAgICAgICBDUExfVFhfU0VDX1BEVV9SWENISURfVigoaWQpKSB8IFwKKwkgICAgICAgQ1BMX1RYX1NFQ19QRFVfQUNLRk9MTE9XU19WKDApIHwgXAorCSAgICAgICBDUExfVFhfU0VDX1BEVV9VTFBUWExQQktfVigxKSB8IFwKKwkgICAgICAgQ1BMX1RYX1NFQ19QRFVfQ1BMTEVOX1YoKGxlbikpIHwgXAorCSAgICAgICBDUExfVFhfU0VDX1BEVV9QTEFDRUhPTERFUl9WKChobGRyKSkgfCBcCisJICAgICAgIENQTF9UWF9TRUNfUERVX0lWSU5TUlRPRlNUX1YoKG9mc3QpKSkKKworI2RlZmluZSAgRklMTF9TRUNfQ1BMX0NJUEhFUlNUT1BfSEkoYV9zdGFydCwgYV9zdG9wLCBjX3N0YXJ0LCBjX3N0b3BfaGkpIFwKKwlodG9ubCggXAorCSAgICAgICBDUExfVFhfU0VDX1BEVV9BQURTVEFSVF9WKChhX3N0YXJ0KSkgfCBcCisJICAgICAgIENQTF9UWF9TRUNfUERVX0FBRFNUT1BfVigoYV9zdG9wKSkgfCBcCisJICAgICAgIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUQVJUX1YoKGNfc3RhcnQpKSB8IFwKKwkgICAgICAgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RPUF9ISV9WKChjX3N0b3BfaGkpKSkKKworI2RlZmluZSAgRklMTF9TRUNfQ1BMX0FVVEhJTlNFUlQoY19zdG9wX2xvLCBhX3N0YXJ0LCBhX3N0b3AsIGFfaW5zdCkgXAorCWh0b25sKCBcCisJICAgICAgIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUT1BfTE9fVigoY19zdG9wX2xvKSkgfCBcCisJCUNQTF9UWF9TRUNfUERVX0FVVEhTVEFSVF9WKChhX3N0YXJ0KSkgfCBcCisJCUNQTF9UWF9TRUNfUERVX0FVVEhTVE9QX1YoKGFfc3RvcCkpIHwgXAorCQlDUExfVFhfU0VDX1BEVV9BVVRISU5TRVJUX1YoKGFfaW5zdCkpKQorCisjZGVmaW5lICBGSUxMX1NFQ19DUExfU0NNRDBfU0VRTk8oY3RybCwgc2VxLCBjbW9kZSwgYW1vZGUsIG9wYWQsIHNpemUsIG5pdnMpICBcCisJCWh0b25sKCBcCisJCVNDTURfU0VRX05PX0NUUkxfVigwKSB8IFwKKwkJU0NNRF9TVEFUVVNfUFJFU0VOVF9WKDApIHwgXAorCQlTQ01EX1BST1RPX1ZFUlNJT05fVihDSENSX1NDTURfUFJPVE9fVkVSU0lPTl9HRU5FUklDKSB8IFwKKwkJU0NNRF9FTkNfREVDX0NUUkxfVigoY3RybCkpIHwgXAorCQlTQ01EX0NJUEhfQVVUSF9TRVFfQ1RSTF9WKChzZXEpKSB8IFwKKwkJU0NNRF9DSVBIX01PREVfVigoY21vZGUpKSB8IFwKKwkJU0NNRF9BVVRIX01PREVfVigoYW1vZGUpKSB8IFwKKwkJU0NNRF9ITUFDX0NUUkxfVigob3BhZCkpIHwgXAorCQlTQ01EX0lWX1NJWkVfVigoc2l6ZSkpIHwgXAorCQlTQ01EX05VTV9JVlNfVigobml2cykpKQorCisjZGVmaW5lIEZJTExfU0VDX0NQTF9JVkdFTl9IRFJMRU4obGFzdCwgbW9yZSwgY3R4X2luLCBtYWMsIGl2ZHJvcCwgbGVuKSBodG9ubCggXAorCQlTQ01EX0VOQl9EQkdJRF9WKDApIHwgXAorCQlTQ01EX0lWX0dFTl9DVFJMX1YoMCkgfCBcCisJCVNDTURfTEFTVF9GUkFHX1YoKGxhc3QpKSB8IFwKKwkJU0NNRF9NT1JFX0ZSQUdTX1YoKG1vcmUpKSB8IFwKKwkJU0NNRF9UTFNfQ09NUFBEVV9WKDApIHwgXAorCQlTQ01EX0tFWV9DVFhfSU5MSU5FX1YoKGN0eF9pbikpIHwgXAorCQlTQ01EX1RMU19GUkFHX0VOQUJMRV9WKDApIHwgXAorCQlTQ01EX01BQ19PTkxZX1YoKG1hYykpIHwgIFwKKwkJU0NNRF9BQURJVkRST1BfVigoaXZkcm9wKSkgfCBcCisJCVNDTURfSERSX0xFTl9WKChsZW4pKSkKKworI2RlZmluZSAgRklMTF9LRVlfQ1RYX0hEUihja19zaXplLCBta19zaXplLCBkX2NrLCBvcGFkLCBjdHhfbGVuKSBcCisJCWh0b25sKEtFWV9DT05URVhUX1ZBTElEX1YoMSkgfCBcCisJCSAgICAgIEtFWV9DT05URVhUX0NLX1NJWkVfVigoY2tfc2l6ZSkpIHwgXAorCQkgICAgICBLRVlfQ09OVEVYVF9NS19TSVpFX1YobWtfc2l6ZSkgfCBcCisJCSAgICAgIEtFWV9DT05URVhUX0RVQUxfQ0tfVigoZF9jaykpIHwgXAorCQkgICAgICBLRVlfQ09OVEVYVF9PUEFEX1BSRVNFTlRfVigob3BhZCkpIHwgXAorCQkgICAgICBLRVlfQ09OVEVYVF9TQUxUX1BSRVNFTlRfVigxKSB8IFwKKwkJICAgICAgS0VZX0NPTlRFWFRfQ1RYX0xFTl9WKChjdHhfbGVuKSkpCisKKyNkZWZpbmUgRklMTF9XUl9PUF9DQ1RYX1NJWkUobGVuLCBjdHhfbGVuKSBcCisJCWh0b25sKCBcCisJCQlGV19DUllQVE9fTE9PS0FTSURFX1dSX09QQ09ERV9WKCBcCisJCQlGV19DUllQVE9fTE9PS0FTSURFX1dSKSB8IFwKKwkJCUZXX0NSWVBUT19MT09LQVNJREVfV1JfQ09NUExfVigwKSB8IFwKKwkJCUZXX0NSWVBUT19MT09LQVNJREVfV1JfSU1NX0xFTl9WKChsZW4pKSB8IFwKKwkJCUZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9MT0NfVigxKSB8IFwKKwkJCUZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9TSVpFX1YoKGN0eF9sZW4pKSkKKworI2RlZmluZSBGSUxMX1dSX1JYX1FfSUQoY2lkLCBxaWQsIHdyX2l2KSBcCisJCWh0b25sKCBcCisJCQlGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX0NISURfVigoY2lkKSkgfCBcCisJCQlGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX1FfSURfVigocWlkKSkgfCBcCisJCQlGV19DUllQVE9fTE9PS0FTSURFX1dSX0xDQl9WKDApIHwgXAorCQkJRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9JVl9WKCh3cl9pdikpKQorCisjZGVmaW5lIEZJTExfVUxQVFhfQ01EX0RFU1QoY2lkKSBcCisJaHRvbmwoVUxQVFhfQ01EX1YoVUxQX1RYX1BLVCkgfCBcCisJICAgICAgVUxQX1RYUEtUX0RFU1RfVigwKSB8IFwKKwkgICAgICBVTFBfVFhQS1RfREFUQU1PRElGWV9WKDApIHwgXAorCSAgICAgIFVMUF9UWFBLVF9DSEFOTkVMSURfVigoY2lkKSkgfCBcCisJICAgICAgVUxQX1RYUEtUX1JPX1YoMSkgfCBcCisJICAgICAgVUxQX1RYUEtUX0ZJRF9WKDApKQorCisjZGVmaW5lIEtFWUNUWF9BTElHTl9QQUQoYnMpICh7dW5zaWduZWQgaW50IF9icyA9IChicyk7XAorCQkJICAgICAgX2JzID09IFNIQTFfRElHRVNUX1NJWkUgPyAxMiA6IDA7IH0pCisKKyNkZWZpbmUgRklMTF9QTERfU0laRV9IQVNIX1NJWkUocGF5bG9hZF9zZ2xfbGVuLCBzZ2xfbGVuZ3RocywgdG90YWxfZnJhZ3MpIFwKKwlodG9ubChGV19DUllQVE9fTE9PS0FTSURFX1dSX1BMRF9TSVpFX1YocGF5bG9hZF9zZ2xfbGVuID8gXAorCQkJCQkJc2dsX2xlbmd0aHNbdG90YWxfZnJhZ3NdIDogMCkgfFwKKwkgICAgICBGV19DUllQVE9fTE9PS0FTSURFX1dSX0hBU0hfU0laRV9WKDApKQorCisjZGVmaW5lIEZJTExfTEVOX1BLRChjYWxjX3R4X2ZsaXRzX29mbGQsIHNrYikgXAorCWh0b25sKEZXX0NSWVBUT19MT09LQVNJREVfV1JfTEVOMTZfVihESVZfUk9VTkRfVVAoKFwKKwkJCQkJICAgY2FsY190eF9mbGl0c19vZmxkKHNrYikgKiA4KSwgMTYpKSkKKworI2RlZmluZSBGSUxMX0NNRF9NT1JFKGltbWRhdGFsZW4pIGh0b25sKFVMUFRYX0NNRF9WKFVMUF9UWF9TQ19JTU0pIHxcCisJCQkJCVVMUF9UWF9TQ19NT1JFX1YoKGltbWRhdGFsZW4pID8gMCA6IDEpKQorCisjZGVmaW5lIE1BWF9OSyA4CisjZGVmaW5lIENSWVBUT19NQVhfSU1NX1RYX1BLVF9MRU4gMjU2CisKK3N0cnVjdCBhbGdvX3BhcmFtIHsKKwl1bnNpZ25lZCBpbnQgYXV0aF9tb2RlOworCXVuc2lnbmVkIGludCBta19zaXplOworCXVuc2lnbmVkIGludCByZXN1bHRfc2l6ZTsKK307CisKK3N0cnVjdCBoYXNoX3dyX3BhcmFtIHsKKwl1bnNpZ25lZCBpbnQgb3BhZF9uZWVkZWQ7CisJdW5zaWduZWQgaW50IG1vcmU7CisJdW5zaWduZWQgaW50IGxhc3Q7CisJc3RydWN0IGFsZ29fcGFyYW0gYWxnX3BybTsKKwl1bnNpZ25lZCBpbnQgc2dfbGVuOworCXVuc2lnbmVkIGludCBiZnJfbGVuOworCXU2NCBzY21kMTsKK307CisKK2VudW0geworCUFFU19LRVlMRU5HVEhfMTI4QklUID0gMTI4LAorCUFFU19LRVlMRU5HVEhfMTkyQklUID0gMTkyLAorCUFFU19LRVlMRU5HVEhfMjU2QklUID0gMjU2Cit9OworCitlbnVtIHsKKwlLRVlMRU5HVEhfM0JZVEVTID0gMywKKwlLRVlMRU5HVEhfNEJZVEVTID0gNCwKKwlLRVlMRU5HVEhfNkJZVEVTID0gNiwKKwlLRVlMRU5HVEhfOEJZVEVTID0gOAorfTsKKworZW51bSB7CisJTlVNQkVSX09GX1JPVU5EU18xMCA9IDEwLAorCU5VTUJFUl9PRl9ST1VORFNfMTIgPSAxMiwKKwlOVU1CRVJfT0ZfUk9VTkRTXzE0ID0gMTQsCit9OworCisvKgorICogQ0NNIGRlZmluZXMgdmFsdWVzIG9mIDQsIDYsIDgsIDEwLCAxMiwgMTQsIGFuZCAxNiBvY3RldHMsCisgKiB3aGVyZSB0aGV5IGluZGljYXRlIHRoZSBzaXplIG9mIHRoZSBpbnRlZ3JpdHkgY2hlY2sgdmFsdWUgKElDVikKKyAqLworZW51bSB7CisJQUVTX0NDTV9JQ1ZfNCAgID0gNCwKKwlBRVNfQ0NNX0lDVl82ICAgPSA2LAorCUFFU19DQ01fSUNWXzggICA9IDgsCisJQUVTX0NDTV9JQ1ZfMTAgID0gMTAsCisJQUVTX0NDTV9JQ1ZfMTIgID0gMTIsCisJQUVTX0NDTV9JQ1ZfMTQgID0gMTQsCisJQUVTX0NDTV9JQ1ZfMTYgPSAxNgorfTsKKworc3RydWN0IGhhc2hfb3BfcGFyYW1zIHsKKwl1bnNpZ25lZCBjaGFyIG1rX3NpemU7CisJdW5zaWduZWQgY2hhciBwYWRfYWxpZ247CisJdW5zaWduZWQgY2hhciBhdXRoX21vZGU7CisJY2hhciBoYXNoX25hbWVbTUFYX0hBU0hfTkFNRV07CisJdW5zaWduZWQgc2hvcnQgYmxvY2tfc2l6ZTsKKwl1bnNpZ25lZCBzaG9ydCB3b3JkX3NpemU7CisJdW5zaWduZWQgc2hvcnQgaXBhZF9zaXplOworfTsKKworc3RydWN0IHBoeXNfc2dlX3BhaXJzIHsKKwlfX2JlMTYgbGVuWzhdOworCV9fYmU2NCBhZGRyWzhdOworfTsKKworc3RydWN0IHBoeXNfc2dlX3Bhcm0geworCXVuc2lnbmVkIGludCBuZW50czsKKwl1bnNpZ25lZCBpbnQgb2JzaXplOworCXVuc2lnbmVkIHNob3J0IHFpZDsKKwl1bnNpZ25lZCBjaGFyIGFsaWduOworfTsKKworc3RydWN0IGNyeXB0b19yZXN1bHQgeworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247CisJaW50IGVycjsKK307CisKK3N0YXRpYyBjb25zdCB1MzIgc2hhMV9pbml0W1NIQTFfRElHRVNUX1NJWkUgLyA0XSA9IHsKKwkJU0hBMV9IMCwgU0hBMV9IMSwgU0hBMV9IMiwgU0hBMV9IMywgU0hBMV9INCwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgc2hhMjI0X2luaXRbU0hBMjU2X0RJR0VTVF9TSVpFIC8gNF0gPSB7CisJCVNIQTIyNF9IMCwgU0hBMjI0X0gxLCBTSEEyMjRfSDIsIFNIQTIyNF9IMywKKwkJU0hBMjI0X0g0LCBTSEEyMjRfSDUsIFNIQTIyNF9INiwgU0hBMjI0X0g3LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBzaGEyNTZfaW5pdFtTSEEyNTZfRElHRVNUX1NJWkUgLyA0XSA9IHsKKwkJU0hBMjU2X0gwLCBTSEEyNTZfSDEsIFNIQTI1Nl9IMiwgU0hBMjU2X0gzLAorCQlTSEEyNTZfSDQsIFNIQTI1Nl9INSwgU0hBMjU2X0g2LCBTSEEyNTZfSDcsCit9OworCitzdGF0aWMgY29uc3QgdTY0IHNoYTM4NF9pbml0W1NIQTUxMl9ESUdFU1RfU0laRSAvIDhdID0geworCQlTSEEzODRfSDAsIFNIQTM4NF9IMSwgU0hBMzg0X0gyLCBTSEEzODRfSDMsCisJCVNIQTM4NF9INCwgU0hBMzg0X0g1LCBTSEEzODRfSDYsIFNIQTM4NF9INywKK307CisKK3N0YXRpYyBjb25zdCB1NjQgc2hhNTEyX2luaXRbU0hBNTEyX0RJR0VTVF9TSVpFIC8gOF0gPSB7CisJCVNIQTUxMl9IMCwgU0hBNTEyX0gxLCBTSEE1MTJfSDIsIFNIQTUxMl9IMywKKwkJU0hBNTEyX0g0LCBTSEE1MTJfSDUsIFNIQTUxMl9INiwgU0hBNTEyX0g3LAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGNvcHlfaGFzaF9pbml0X3ZhbHVlcyhjaGFyICprZXksIGludCBkaWdlc3RzaXplKQoreworCXU4IGk7CisJX19iZTMyICpka2V5ID0gKF9fYmUzMiAqKWtleTsKKwl1NjQgKmxka2V5ID0gKHU2NCAqKWtleTsKKwlfX2JlNjQgKnNoYTM4NCA9IChfX2JlNjQgKilzaGEzODRfaW5pdDsKKwlfX2JlNjQgKnNoYTUxMiA9IChfX2JlNjQgKilzaGE1MTJfaW5pdDsKKworCXN3aXRjaCAoZGlnZXN0c2l6ZSkgeworCWNhc2UgU0hBMV9ESUdFU1RfU0laRToKKwkJZm9yIChpID0gMDsgaSA8IFNIQTFfSU5JVF9TVEFURTsgaSsrKQorCQkJZGtleVtpXSA9IGNwdV90b19iZTMyKHNoYTFfaW5pdFtpXSk7CisJCWJyZWFrOworCWNhc2UgU0hBMjI0X0RJR0VTVF9TSVpFOgorCQlmb3IgKGkgPSAwOyBpIDwgU0hBMjI0X0lOSVRfU1RBVEU7IGkrKykKKwkJCWRrZXlbaV0gPSBjcHVfdG9fYmUzMihzaGEyMjRfaW5pdFtpXSk7CisJCWJyZWFrOworCWNhc2UgU0hBMjU2X0RJR0VTVF9TSVpFOgorCQlmb3IgKGkgPSAwOyBpIDwgU0hBMjU2X0lOSVRfU1RBVEU7IGkrKykKKwkJCWRrZXlbaV0gPSBjcHVfdG9fYmUzMihzaGEyNTZfaW5pdFtpXSk7CisJCWJyZWFrOworCWNhc2UgU0hBMzg0X0RJR0VTVF9TSVpFOgorCQlmb3IgKGkgPSAwOyBpIDwgU0hBMzg0X0lOSVRfU1RBVEU7IGkrKykKKwkJCWxka2V5W2ldID0gYmU2NF90b19jcHUoc2hhMzg0W2ldKTsKKwkJYnJlYWs7CisJY2FzZSBTSEE1MTJfRElHRVNUX1NJWkU6CisJCWZvciAoaSA9IDA7IGkgPCBTSEE1MTJfSU5JVF9TVEFURTsgaSsrKQorCQkJbGRrZXlbaV0gPSBiZTY0X3RvX2NwdShzaGE1MTJbaV0pOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCB1OCBzZ2xfbGVuZ3Roc1syMF0gPSB7CisJMCwgMSwgMiwgMywgNCwgNCwgNSwgNiwgNywgNywgOCwgOSwgMTAsIDEwLCAxMSwgMTIsIDEzLCAxMywgMTQsIDE1Cit9OworCisvKiBOdW1iZXIgb2YgbGVuIGZpZWxkcyg4KSAqIHNpemUgb2Ygb25lIGFkZHIgZmllbGQgKi8KKyNkZWZpbmUgUEhZU0RTR0xfTUFYX0xFTl9TSVpFIDE2CisKK3N0YXRpYyBpbmxpbmUgdTE2IGdldF9zcGFjZV9mb3JfcGh5c19kc2dsKHVuc2lnbmVkIGludCBzZ2xfZW50cikKK3sKKwkvKiBsZW4gZmllbGQgc2l6ZSArIGFkZHIgZmllbGQgc2l6ZSAqLworCXJldHVybiAoKHNnbF9lbnRyID4+IDMpICsgKChzZ2xfZW50ciAlIDgpID8KKwkJCQkgICAxIDogMCkpICogUEhZU0RTR0xfTUFYX0xFTl9TSVpFICsKKwkJKHNnbF9lbnRyIDw8IDMpICsgKChzZ2xfZW50ciAlIDIgPyAxIDogMCkgPDwgMyk7Cit9CisKKy8qIFRoZSBBRVMgcy10cmFuc2Zvcm0gbWF0cml4IChzLWJveCkuICovCitzdGF0aWMgY29uc3QgdTggYWVzX3Nib3hbMjU2XSA9IHsKKwk5OSwgIDEyNCwgMTE5LCAxMjMsIDI0MiwgMTA3LCAxMTEsIDE5NywgNDgsICAxLCAgIDEwMywgNDMsICAyNTQsIDIxNSwKKwkxNzEsIDExOCwgMjAyLCAxMzAsIDIwMSwgMTI1LCAyNTAsIDg5LCAgNzEsICAyNDAsIDE3MywgMjEyLCAxNjIsIDE3NSwKKwkxNTYsIDE2NCwgMTE0LCAxOTIsIDE4MywgMjUzLCAxNDcsIDM4LCAgNTQsICA2MywgIDI0NywgMjA0LCA1MiwgIDE2NSwKKwkyMjksIDI0MSwgMTEzLCAyMTYsIDQ5LCAgMjEsIDQsICAgMTk5LCAzNSwgIDE5NSwgMjQsICAxNTAsIDUsIDE1NCwgNywKKwkxOCwgIDEyOCwgMjI2LCAyMzUsIDM5LCAgMTc4LCAxMTcsIDksICAgMTMxLCA0NCwgIDI2LCAgMjcsICAxMTAsIDkwLAorCTE2MCwgODIsICA1OSwgIDIxNCwgMTc5LCA0MSwgIDIyNywgNDcsICAxMzIsIDgzLCAgMjA5LCAwLCAgIDIzNywgMzIsCisJMjUyLCAxNzcsIDkxLCAgMTA2LCAyMDMsIDE5MCwgNTcsICA3NCwgIDc2LCAgODgsICAyMDcsIDIwOCwgMjM5LCAxNzAsCisJMjUxLCA2NywgIDc3LCAgNTEsICAxMzMsIDY5LCAgMjQ5LCAyLCAgIDEyNywgODAsICA2MCwgIDE1OSwgMTY4LCA4MSwKKwkxNjMsIDY0LCAgMTQzLCAxNDYsIDE1NywgNTYsICAyNDUsIDE4OCwgMTgyLCAyMTgsIDMzLCAgMTYsICAyNTUsIDI0MywKKwkyMTAsIDIwNSwgMTIsICAxOSwgIDIzNiwgOTUsICAxNTEsIDY4LCAgMjMsICAxOTYsIDE2NywgMTI2LCA2MSwgIDEwMCwKKwk5MywgIDI1LCAgMTE1LCA5NiwgIDEyOSwgNzksICAyMjAsIDM0LCAgNDIsICAxNDQsIDEzNiwgNzAsICAyMzgsIDE4NCwKKwkyMCwgIDIyMiwgOTQsICAxMSwgIDIxOSwgMjI0LCA1MCwgIDU4LCAgMTAsICA3MywgIDYsICAgMzYsICA5MiwgIDE5NCwKKwkyMTEsIDE3MiwgOTgsICAxNDUsIDE0OSwgMjI4LCAxMjEsIDIzMSwgMjAwLCA1NSwgIDEwOSwgMTQxLCAyMTMsIDc4LAorCTE2OSwgMTA4LCA4NiwgIDI0NCwgMjM0LCAxMDEsIDEyMiwgMTc0LCA4LCAxODYsIDEyMCwgMzcsICA0NiwgIDI4LCAxNjYsCisJMTgwLCAxOTgsIDIzMiwgMjIxLCAxMTYsIDMxLCAgNzUsICAxODksIDEzOSwgMTM4LCAxMTIsIDYyLCAgMTgxLCAxMDIsCisJNzIsICAzLCAgIDI0NiwgMTQsICA5NywgIDUzLCAgODcsICAxODUsIDEzNCwgMTkzLCAyOSwgIDE1OCwgMjI1LCAyNDgsCisJMTUyLCAxNywgIDEwNSwgMjE3LCAxNDIsIDE0OCwgMTU1LCAzMCwgIDEzNSwgMjMzLCAyMDYsIDg1LCAgNDAsICAyMjMsCisJMTQwLCAxNjEsIDEzNywgMTMsICAxOTEsIDIzMCwgNjYsICAxMDQsIDY1LCAgMTUzLCA0NSwgIDE1LCAgMTc2LCA4NCwKKwkxODcsIDIyCit9OworCitzdGF0aWMgdTMyIGFlc19rc19zdWJ3b3JkKGNvbnN0IHUzMiB3KQoreworCXU4IGJ5dGVzWzRdOworCisJKih1MzIgKikoJmJ5dGVzWzBdKSA9IHc7CisJYnl0ZXNbMF0gPSBhZXNfc2JveFtieXRlc1swXV07CisJYnl0ZXNbMV0gPSBhZXNfc2JveFtieXRlc1sxXV07CisJYnl0ZXNbMl0gPSBhZXNfc2JveFtieXRlc1syXV07CisJYnl0ZXNbM10gPSBhZXNfc2JveFtieXRlc1szXV07CisJcmV0dXJuICoodTMyICopKCZieXRlc1swXSk7Cit9CisKK3N0YXRpYyB1MzIgcm91bmRfY29uc3RhbnRbMTFdID0geworCTB4MDEwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDQwMDAwMDAsIDB4MDgwMDAwMDAsCisJMHgxMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg4MDAwMDAwMCwKKwkweDFCMDAwMDAwLCAweDM2MDAwMDAwLCAweDZDMDAwMDAwCit9OworCisvKiBkZWNfa2V5IC0gT1VUUFVUIC0gUmV2ZXJzZSByb3VuZCBrZXkKKyAqIGtleSAtIElOUFVUIC0ga2V5CisgKiBrZXlsZW5ndGggLSBJTlBVVCAtIGxlbmd0aCBvZiB0aGUga2V5IGluIG51bWJlciBvZiBiaXRzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfYWVzX2RlY3J5cHRfa2V5KHVuc2lnbmVkIGNoYXIgKmRlY19rZXksCisJCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGtleWxlbmd0aCkKK3sKKwl1MzIgdGVtcDsKKwl1MzIgd19yaW5nW01BWF9OS107CisJaW50IGksIGosIGsgPSAwOworCXU4ICBuciwgbms7CisKKwlzd2l0Y2ggKGtleWxlbmd0aCkgeworCWNhc2UgQUVTX0tFWUxFTkdUSF8xMjhCSVQ6CisJCW5rID0gS0VZTEVOR1RIXzRCWVRFUzsKKwkJbnIgPSBOVU1CRVJfT0ZfUk9VTkRTXzEwOworCQlicmVhazsKKworCWNhc2UgQUVTX0tFWUxFTkdUSF8xOTJCSVQ6CisJCW5rID0gS0VZTEVOR1RIXzZCWVRFUzsKKwkJbnIgPSBOVU1CRVJfT0ZfUk9VTkRTXzEyOworCQlicmVhazsKKwljYXNlIEFFU19LRVlMRU5HVEhfMjU2QklUOgorCQluayA9IEtFWUxFTkdUSF84QllURVM7CisJCW5yID0gTlVNQkVSX09GX1JPVU5EU18xNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbms7IGkrKyApCisJCXdfcmluZ1tpXSA9IGJlMzJfdG9fY3B1KCoodTMyICopJmtleVs0ICogaV0pOworCisJaSA9IDA7CisJdGVtcCA9IHdfcmluZ1tuayAtIDFdOworCXdoaWxlKGkgKyBuayA8IChuciArIDEpICogNCkgeworCQlpZighKGkgJSBuaykpIHsKKwkJCS8qIFJvdFdvcmQodGVtcCkgKi8KKwkJCXRlbXAgPSAodGVtcCA8PCA4KSB8ICh0ZW1wID4+IDI0KTsKKwkJCXRlbXAgPSBhZXNfa3Nfc3Vid29yZCh0ZW1wKTsKKwkJCXRlbXAgXj0gcm91bmRfY29uc3RhbnRbaSAvIG5rXTsKKwkJfQorCQllbHNlIGlmIChuayA9PSA4ICYmIChpICUgNCA9PSAwKSkKKwkJCXRlbXAgPSBhZXNfa3Nfc3Vid29yZCh0ZW1wKTsKKwkJd19yaW5nW2kgJSBua10gXj0gdGVtcDsKKwkJdGVtcCA9IHdfcmluZ1tpICUgbmtdOworCQlpKys7CisJfQorCWZvciAoayA9IDAsIGogPSBpICUgbms7IGsgPCBuazsgaysrKSB7CisJCSooKHUzMiAqKWRlY19rZXkgKyBrKSA9IGh0b25sKHdfcmluZ1tqXSk7CisJCWotLTsKKwkJaWYoaiA8IDApCisJCQlqICs9IG5rOworCX0KK30KKworI2VuZGlmIC8qIF9fQ0hDUl9BTEdPX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9jaGNyX2NvcmUuYyBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1ZjliYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9jb3JlLmMKQEAgLTAsMCArMSwyMzggQEAKKy8qKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDQvVDUvVDYgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogV3JpdHRlbiBhbmQgTWFpbnRhaW5lZCBieToKKyAqIE1hbm9qIE1hbHZpeWEgKG1hbm9qbWFsdml5YUBjaGVsc2lvLmNvbSkKKyAqIEF0dWwgR3VwdGEgKGF0dWwuZ3VwdGFAY2hlbHNpby5jb20pCisgKiBKaXRlbmRyYSBMdWxsYSAoamx1bGxhQGNoZWxzaW8uY29tKQorICogWWVzaGFzd2kgTSBSIEdvd2RhICh5ZXNoYXN3aUBjaGVsc2lvLmNvbSkKKyAqIEhhcnNoIEphaW4gKGhhcnNoQGNoZWxzaW8uY29tKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPGNyeXB0by9hZXMuaD4KKyNpbmNsdWRlIDxjcnlwdG8vaGFzaC5oPgorCisjaW5jbHVkZSAidDRfbXNnLmgiCisjaW5jbHVkZSAiY2hjcl9jb3JlLmgiCisjaW5jbHVkZSAiY3hnYjRfdWxkLmgiCisKK3N0YXRpYyBMSVNUX0hFQUQodWxkX2N0eF9saXN0KTsKK3N0YXRpYyBERUZJTkVfTVVURVgoZGV2X211dGV4KTsKK3N0YXRpYyBhdG9taWNfdCBkZXZfY291bnQ7CisKK3R5cGVkZWYgaW50ICgqY2hjcl9oYW5kbGVyX2Z1bmMpKHN0cnVjdCBjaGNyX2RldiAqZGV2LCB1bnNpZ25lZCBjaGFyICppbnB1dCk7CitzdGF0aWMgaW50IGNwbF9mdzZfcGxkX2hhbmRsZXIoc3RydWN0IGNoY3JfZGV2ICpkZXYsIHVuc2lnbmVkIGNoYXIgKmlucHV0KTsKK3N0YXRpYyB2b2lkICpjaGNyX3VsZF9hZGQoY29uc3Qgc3RydWN0IGN4Z2I0X2xsZF9pbmZvICpsbGQpOworc3RhdGljIGludCBjaGNyX3VsZF9zdGF0ZV9jaGFuZ2Uodm9pZCAqaGFuZGxlLCBlbnVtIGN4Z2I0X3N0YXRlIHN0YXRlKTsKKworc3RhdGljIGNoY3JfaGFuZGxlcl9mdW5jIHdvcmtfaGFuZGxlcnNbTlVNX0NQTF9DTURTXSA9IHsKKwlbQ1BMX0ZXNl9QTERdID0gY3BsX2Z3Nl9wbGRfaGFuZGxlciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3hnYjRfdWxkX2luZm8gY2hjcl91bGRfaW5mbyA9IHsKKwkubmFtZSA9IERSVl9NT0RVTEVfTkFNRSwKKwkubnJ4cSA9IE1BWF9VTERfUVNFVFMsCisJLnJ4cV9zaXplID0gMTAyNCwKKwkuYWRkID0gY2hjcl91bGRfYWRkLAorCS5zdGF0ZV9jaGFuZ2UgPSBjaGNyX3VsZF9zdGF0ZV9jaGFuZ2UsCisJLnJ4X2hhbmRsZXIgPSBjaGNyX3VsZF9yeF9oYW5kbGVyLAorfTsKKworaW50IGFzc2lnbl9jaGNyX2RldmljZShzdHJ1Y3QgY2hjcl9kZXYgKipkZXYpCit7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4OworCisJLyoKKwkgKiBXaGljaCBkZXZpY2UgdG8gdXNlIGlmIG11bHRpcGxlIGRldmljZXMgYXJlIGF2YWlsYWJsZSBUT0RPCisJICogTWF5IGJlIHNlbGVjdCB0aGUgZGV2aWNlIGJhc2VkIG9uIHJvdW5kIHJvYmluLiBPbmUgc2Vzc2lvbgorCSAqIG11c3QgZ28gdG8gdGhlIHNhbWUgZGV2aWNlIHRvIG1haW50YWluIHRoZSBvcmRlcmluZy4KKwkgKi8KKwltdXRleF9sb2NrKCZkZXZfbXV0ZXgpOyAvKiBUT0RPID8gKi8KKwl1X2N0eCA9IGxpc3RfZmlyc3RfZW50cnkoJnVsZF9jdHhfbGlzdCwgc3RydWN0IHVsZF9jdHgsIGVudHJ5KTsKKwlpZiAoIXVfY3R4KSB7CisJCW11dGV4X3VubG9jaygmZGV2X211dGV4KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkqZGV2ID0gdV9jdHgtPmRldjsKKwltdXRleF91bmxvY2soJmRldl9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9kZXZfYWRkKHN0cnVjdCB1bGRfY3R4ICp1X2N0eCkKK3sKKwlzdHJ1Y3QgY2hjcl9kZXYgKmRldjsKKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTlhJTzsKKworCXNwaW5fbG9ja19pbml0KCZkZXYtPmxvY2tfY2hjcl9kZXYpOworCXVfY3R4LT5kZXYgPSBkZXY7CisJZGV2LT51X2N0eCA9IHVfY3R4OworCWF0b21pY19pbmMoJmRldl9jb3VudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9kZXZfcmVtb3ZlKHN0cnVjdCB1bGRfY3R4ICp1X2N0eCkKK3sKKwlrZnJlZSh1X2N0eC0+ZGV2KTsKKwl1X2N0eC0+ZGV2ID0gTlVMTDsKKwlhdG9taWNfZGVjKCZkZXZfY291bnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwbF9mdzZfcGxkX2hhbmRsZXIoc3RydWN0IGNoY3JfZGV2ICpkZXYsCisJCQkgICAgICAgdW5zaWduZWQgY2hhciAqaW5wdXQpCit7CisJc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpyZXE7CisJc3RydWN0IGNwbF9mdzZfcGxkICpmdzZfcGxkOworCXUzMiBhY2tfZXJyX3N0YXR1cyA9IDA7CisJaW50IGVycm9yX3N0YXR1cyA9IDA7CisKKwlmdzZfcGxkID0gKHN0cnVjdCBjcGxfZnc2X3BsZCAqKWlucHV0OworCXJlcSA9IChzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKikodWludHB0cl90KWJlNjRfdG9fY3B1KAorCQkJCQkJICAgIGZ3Nl9wbGQtPmRhdGFbMV0pOworCisJYWNrX2Vycl9zdGF0dXMgPQorCQludG9obCgqKF9fYmUzMiAqKSgodW5zaWduZWQgY2hhciAqKSZmdzZfcGxkLT5kYXRhWzBdICsgNCkpOworCWlmIChhY2tfZXJyX3N0YXR1cykgeworCQlpZiAoQ0hLX01BQ19FUlJfQklUKGFja19lcnJfc3RhdHVzKSB8fAorCQkgICAgQ0hLX1BBRF9FUlJfQklUKGFja19lcnJfc3RhdHVzKSkKKwkJCWVycm9yX3N0YXR1cyA9IC1FSU5WQUw7CisJfQorCS8qIGNhbGwgY29tcGxldGlvbiBjYWxsYmFjayB3aXRoIGZhaWx1cmUgc3RhdHVzICovCisJaWYgKHJlcSkgeworCQlpZiAoIWNoY3JfaGFuZGxlX3Jlc3AocmVxLCBpbnB1dCwgZXJyb3Jfc3RhdHVzKSkKKwkJCXJlcS0+Y29tcGxldGUocmVxLCBlcnJvcl9zdGF0dXMpOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlwcl9lcnIoIkluY29ycmVjdCByZXF1ZXN0IGFkZHJlc3MgZnJvbSB0aGUgZmlybXdhcmVcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBjaGNyX3NlbmRfd3Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gY3hnYjRfb2ZsZF9zZW5kKHNrYi0+ZGV2LCBza2IpOworfQorCitzdGF0aWMgdm9pZCAqY2hjcl91bGRfYWRkKGNvbnN0IHN0cnVjdCBjeGdiNF9sbGRfaW5mbyAqbGxkKQoreworCXN0cnVjdCB1bGRfY3R4ICp1X2N0eDsKKworCS8qIENyZWF0ZSB0aGUgZGV2aWNlIGFuZCBhZGQgaXQgaW4gdGhlIGRldmljZSBsaXN0ICovCisJdV9jdHggPSBremFsbG9jKHNpemVvZigqdV9jdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVfY3R4KSB7CisJCXVfY3R4ID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJZ290byBvdXQ7CisJfQorCXVfY3R4LT5sbGRpID0gKmxsZDsKKwltdXRleF9sb2NrKCZkZXZfbXV0ZXgpOworCWxpc3RfYWRkX3RhaWwoJnVfY3R4LT5lbnRyeSwgJnVsZF9jdHhfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZkZXZfbXV0ZXgpOworb3V0OgorCXJldHVybiB1X2N0eDsKK30KKworaW50IGNoY3JfdWxkX3J4X2hhbmRsZXIodm9pZCAqaGFuZGxlLCBjb25zdCBfX2JlNjQgKnJzcCwKKwkJCWNvbnN0IHN0cnVjdCBwa3RfZ2wgKnBnbCkKK3sKKwlzdHJ1Y3QgdWxkX2N0eCAqdV9jdHggPSAoc3RydWN0IHVsZF9jdHggKiloYW5kbGU7CisJc3RydWN0IGNoY3JfZGV2ICpkZXYgPSB1X2N0eC0+ZGV2OworCWNvbnN0IHN0cnVjdCBjcGxfYWN0X2VzdGFibGlzaCAqcnBsID0gKHN0cnVjdCBjcGxfYWN0X2VzdGFibGlzaAorCQkJCQkgICAgICAgKilyc3A7CisKKwlpZiAocnBsLT5vdC5vcGNvZGUgIT0gQ1BMX0ZXNl9QTEQpIHsKKwkJcHJfZXJyKCJVbnN1cHBvcnRlZCBvcGNvZGVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXBnbCkKKwkJd29ya19oYW5kbGVyc1tycGwtPm90Lm9wY29kZV0oZGV2LCAodW5zaWduZWQgY2hhciAqKSZyc3BbMV0pOworCWVsc2UKKwkJd29ya19oYW5kbGVyc1tycGwtPm90Lm9wY29kZV0oZGV2LCBwZ2wtPnZhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGNyX3VsZF9zdGF0ZV9jaGFuZ2Uodm9pZCAqaGFuZGxlLCBlbnVtIGN4Z2I0X3N0YXRlIHN0YXRlKQoreworCXN0cnVjdCB1bGRfY3R4ICp1X2N0eCA9IGhhbmRsZTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIENYR0I0X1NUQVRFX1VQOgorCQlpZiAoIXVfY3R4LT5kZXYpIHsKKwkJCXJldCA9IGNoY3JfZGV2X2FkZCh1X2N0eCk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpZiAoYXRvbWljX3JlYWQoJmRldl9jb3VudCkgPT0gMSkKKwkJCXJldCA9IHN0YXJ0X2NyeXB0bygpOworCQlicmVhazsKKworCWNhc2UgQ1hHQjRfU1RBVEVfREVUQUNIOgorCQlpZiAodV9jdHgtPmRldikgeworCQkJbXV0ZXhfbG9jaygmZGV2X211dGV4KTsKKwkJCWNoY3JfZGV2X3JlbW92ZSh1X2N0eCk7CisJCQltdXRleF91bmxvY2soJmRldl9tdXRleCk7CisJCX0KKwkJaWYgKCFhdG9taWNfcmVhZCgmZGV2X2NvdW50KSkKKwkJCXN0b3BfY3J5cHRvKCk7CisJCWJyZWFrOworCisJY2FzZSBDWEdCNF9TVEFURV9TVEFSVF9SRUNPVkVSWToKKwljYXNlIENYR0I0X1NUQVRFX0RPV046CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNoY3JfY3J5cHRvX2luaXQodm9pZCkKK3sKKwlpZiAoY3hnYjRfcmVnaXN0ZXJfdWxkKENYR0I0X1VMRF9DUllQVE8sICZjaGNyX3VsZF9pbmZvKSkgeworCQlwcl9lcnIoIlVMRCByZWdpc3RlciBmYWlsOiBObyBjaGNyIGNyeXB0byBzdXBwb3J0IGluIGN4Z2I0Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNoY3JfY3J5cHRvX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgdWxkX2N0eCAqdV9jdHgsICp0bXA7CisKKwlpZiAoYXRvbWljX3JlYWQoJmRldl9jb3VudCkpCisJCXN0b3BfY3J5cHRvKCk7CisKKwkvKiBSZW1vdmUgYWxsIGRldmljZXMgZnJvbSBsaXN0ICovCisJbXV0ZXhfbG9jaygmZGV2X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodV9jdHgsIHRtcCwgJnVsZF9jdHhfbGlzdCwgZW50cnkpIHsKKwkJaWYgKHVfY3R4LT5kZXYpCisJCQljaGNyX2Rldl9yZW1vdmUodV9jdHgpOworCQlrZnJlZSh1X2N0eCk7CisJfQorCW11dGV4X3VubG9jaygmZGV2X211dGV4KTsKKwljeGdiNF91bnJlZ2lzdGVyX3VsZChDWEdCNF9VTERfQ1JZUFRPKTsKK30KKworbW9kdWxlX2luaXQoY2hjcl9jcnlwdG9faW5pdCk7Cittb2R1bGVfZXhpdChjaGNyX2NyeXB0b19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJDcnlwdG8gQ28tcHJvY2Vzc29yIGZvciBDaGVsc2lvIFRlcm1pbmF0b3IgY2FyZHMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJDaGVsc2lvIENvbW11bmljYXRpb25zIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9jaGVsc2lvL2NoY3JfY29yZS5oIGIvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9jaGNyX2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTVjNjcxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9jaGNyX2NvcmUuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDYgQ3J5cHRvIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19DSENSX0NPUkVfSF9fCisjZGVmaW5lIF9fQ0hDUl9DT1JFX0hfXworCisjaW5jbHVkZSA8Y3J5cHRvL2FsZ2FwaS5oPgorI2luY2x1ZGUgInQ0X2h3LmgiCisjaW5jbHVkZSAiY3hnYjQuaCIKKyNpbmNsdWRlICJjeGdiNF91bGQuaCIKKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUgImNoY3IiCisjZGVmaW5lIERSVl9WRVJTSU9OICIxLjAuMC4wIgorCisjZGVmaW5lIE1BWF9QRU5ESU5HX1JFUV9UT19IVyAyMAorI2RlZmluZSBDSENSX1RFU1RfUkVTUE9OU0VfVElNRU9VVCAxMDAwCisKKyNkZWZpbmUgUEFEX0VSUk9SX0JJVAkJMQorI2RlZmluZSBDSEtfUEFEX0VSUl9CSVQoeCkJKCgoeCkgPj4gUEFEX0VSUk9SX0JJVCkgJiAxKQorCisjZGVmaW5lIE1BQ19FUlJPUl9CSVQJCTAKKyNkZWZpbmUgQ0hLX01BQ19FUlJfQklUKHgpCSgoKHgpID4+IE1BQ19FUlJPUl9CSVQpICYgMSkKKworc3RydWN0IHVsZF9jdHg7CisKK3N0cnVjdCBjaGNyX2RldiB7CisJLyogUmVxdWVzdCBzdWJtaXRlZCB0byBoL3cgYW5kIHdhaXRpbmcgZm9yIHJlc3BvbnNlLiAqLworCXNwaW5sb2NrX3QgbG9ja19jaGNyX2RldjsKKwlzdHJ1Y3QgY3J5cHRvX3F1ZXVlIHBlbmRpbmdfcXVldWU7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4OworCXVuc2lnbmVkIGNoYXIgdHhfY2hhbm5lbF9pZDsKK307CisKK3N0cnVjdCB1bGRfY3R4IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCXN0cnVjdCBjeGdiNF9sbGRfaW5mbyBsbGRpOworCXN0cnVjdCBjaGNyX2RldiAqZGV2OworfTsKKworaW50IGFzc2lnbl9jaGNyX2RldmljZShzdHJ1Y3QgY2hjcl9kZXYgKipkZXYpOworaW50IGNoY3Jfc2VuZF93cihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBzdGFydF9jcnlwdG8odm9pZCk7CitpbnQgc3RvcF9jcnlwdG8odm9pZCk7CitpbnQgY2hjcl91bGRfcnhfaGFuZGxlcih2b2lkICpoYW5kbGUsIGNvbnN0IF9fYmU2NCAqcnNwLAorCQkJY29uc3Qgc3RydWN0IHBrdF9nbCAqcGdsKTsKK2ludCBjaGNyX2hhbmRsZV9yZXNwKHN0cnVjdCBjcnlwdG9fYXN5bmNfcmVxdWVzdCAqcmVxLCB1bnNpZ25lZCBjaGFyICppbnB1dCwKKwkJICAgICBpbnQgZXJyKTsKKyNlbmRpZiAvKiBfX0NIQ1JfQ09SRV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9jcnlwdG8uaCBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9jcnlwdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2Q3NTYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9jaGNyX2NyeXB0by5oCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDYgQ3J5cHRvIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19DSENSX0NSWVBUT19IX18KKyNkZWZpbmUgX19DSENSX0NSWVBUT19IX18KKworLyogRGVmaW5lIGZvbGxvd2luZyBpZiBoL3cgaXMgbm90IGRyb3BwaW5nIHRoZSBBQUQgYW5kIElWIGRhdGEgYmVmb3JlCisgKiBnaXZpbmcgdGhlIHByb2Nlc3NlZCBkYXRhCisgKi8KKworI2RlZmluZSBDSENSX0NSQV9QUklPUklUWSAzMDAKKworI2RlZmluZSBDSENSX0FFU19NQVhfS0VZX0xFTiAgKDIgKiAoQUVTX01BWF9LRVlfU0laRSkpIC8qIGNvbnNpZGVyIHh0cyAqLworI2RlZmluZSBDSENSX01BWF9DUllQVE9fSVZfTEVOIDE2IC8qIEFFUyBJViBsZW4gKi8KKworI2RlZmluZSBDSENSX01BWF9BVVRIRU5DX0FFU19LRVlfTEVOIDMyIC8qIG1heCBhZXMga2V5IGxlbmd0aCovCisjZGVmaW5lIENIQ1JfTUFYX0FVVEhFTkNfU0hBX0tFWV9MRU4gMTI4IC8qIG1heCBzaGEga2V5IGxlbmd0aCovCisKKyNkZWZpbmUgQ0hDUl9HSVZFTkNSWVBUX09QIDIKKy8qIENQTC9TQ01EIHBhcmFtZXRlcnMgKi8KKworI2RlZmluZSBDSENSX0VOQ1JZUFRfT1AgMAorI2RlZmluZSBDSENSX0RFQ1JZUFRfT1AgMQorCisjZGVmaW5lIENIQ1JfU0NNRF9TRVFfTk9fQ1RSTF8zMkJJVCAgICAgMQorI2RlZmluZSBDSENSX1NDTURfU0VRX05PX0NUUkxfNDhCSVQgICAgIDIKKyNkZWZpbmUgQ0hDUl9TQ01EX1NFUV9OT19DVFJMXzY0QklUICAgICAzCisKKyNkZWZpbmUgQ0hDUl9TQ01EX1BST1RPX1ZFUlNJT05fR0VORVJJQyA0CisKKyNkZWZpbmUgQ0hDUl9TQ01EX0FVVEhfQ1RSTF9BVVRIX0NJUEhFUiAwCisjZGVmaW5lIENIQ1JfU0NNRF9BVVRIX0NUUkxfQ0lQSEVSX0FVVEggMQorCisjZGVmaW5lIENIQ1JfU0NNRF9DSVBIRVJfTU9ERV9OT1AgICAgICAgICAgIDAKKyNkZWZpbmUgQ0hDUl9TQ01EX0NJUEhFUl9NT0RFX0FFU19DQkMgICAgICAgMQorI2RlZmluZSBDSENSX1NDTURfQ0lQSEVSX01PREVfR0VORVJJQ19BRVMgICA0CisjZGVmaW5lIENIQ1JfU0NNRF9DSVBIRVJfTU9ERV9BRVNfWFRTICAgICAgIDYKKworI2RlZmluZSBDSENSX1NDTURfQVVUSF9NT0RFX05PUCAgICAgICAgICAgICAwCisjZGVmaW5lIENIQ1JfU0NNRF9BVVRIX01PREVfU0hBMSAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0hDUl9TQ01EX0FVVEhfTU9ERV9TSEEyMjQgICAgICAgICAgMgorI2RlZmluZSBDSENSX1NDTURfQVVUSF9NT0RFX1NIQTI1NiAgICAgICAgICAzCisjZGVmaW5lIENIQ1JfU0NNRF9BVVRIX01PREVfU0hBNTEyXzIyNCAgICAgIDUKKyNkZWZpbmUgQ0hDUl9TQ01EX0FVVEhfTU9ERV9TSEE1MTJfMjU2ICAgICAgNgorI2RlZmluZSBDSENSX1NDTURfQVVUSF9NT0RFX1NIQTUxMl8zODQgICAgICA3CisjZGVmaW5lIENIQ1JfU0NNRF9BVVRIX01PREVfU0hBNTEyXzUxMiAgICAgIDgKKworI2RlZmluZSBDSENSX1NDTURfSE1BQ19DVFJMX05PUCAgICAgICAgICAgICAwCisjZGVmaW5lIENIQ1JfU0NNRF9ITUFDX0NUUkxfTk9fVFJVTkMgICAgICAgIDEKKworI2RlZmluZSBDSENSX1NDTURfSVZHRU5fQ1RSTF9IVyAgICAgICAgICAgICAwCisjZGVmaW5lIENIQ1JfU0NNRF9JVkdFTl9DVFJMX1NXICAgICAgICAgICAgIDEKKy8qIFRoaXMgYXJlIG5vdCByZWFsbHkgbWFjIGtleSBzaXplLiBUaGV5IGFyZSBpbnRlcm1lZGlhdGUgdmFsdWVzCisgKiBvZiBzaGEgZW5naW5lIGFuZCBpdHMgc2l6ZQorICovCisjZGVmaW5lIENIQ1JfS0VZQ1RYX01BQ19LRVlfU0laRV8xMjggICAgICAgIDAKKyNkZWZpbmUgQ0hDUl9LRVlDVFhfTUFDX0tFWV9TSVpFXzE2MCAgICAgICAgMQorI2RlZmluZSBDSENSX0tFWUNUWF9NQUNfS0VZX1NJWkVfMTkyICAgICAgICAyCisjZGVmaW5lIENIQ1JfS0VZQ1RYX01BQ19LRVlfU0laRV8yNTYgICAgICAgIDMKKyNkZWZpbmUgQ0hDUl9LRVlDVFhfTUFDX0tFWV9TSVpFXzUxMiAgICAgICAgNAorI2RlZmluZSBDSENSX0tFWUNUWF9DSVBIRVJfS0VZX1NJWkVfMTI4ICAgICAwCisjZGVmaW5lIENIQ1JfS0VZQ1RYX0NJUEhFUl9LRVlfU0laRV8xOTIgICAgIDEKKyNkZWZpbmUgQ0hDUl9LRVlDVFhfQ0lQSEVSX0tFWV9TSVpFXzI1NiAgICAgMgorI2RlZmluZSBDSENSX0tFWUNUWF9OT19LRVkgICAgICAgICAgICAgICAgICAxNQorCisjZGVmaW5lIENIQ1JfQ1BMX0ZXNF9QTERfSVZfT0ZGU0VUICAgICAgICAgICg1ICogNjQpIC8qIGJ5dGVzLiBmbHQgIzUgYW5kICM2ICovCisjZGVmaW5lIENIQ1JfQ1BMX0ZXNF9QTERfSEFTSF9SRVNVTFRfT0ZGU0VUICg3ICogNjQpIC8qIGJ5dGVzLiBmbHQgIzcgKi8KKyNkZWZpbmUgQ0hDUl9DUExfRlc0X1BMRF9EQVRBX1NJWkUgICAgICAgICAgKDQgKiA2NCkgLyogYnl0ZXMuIGZsdCAjNCB0byAjNyAqLworCisjZGVmaW5lIEtFWV9DT05URVhUX0hEUl9TQUxUX0FORF9QQUQJICAgIDE2CisjZGVmaW5lIGZsaXRzX3RvX2J5dGVzKHgpICAoeCAqIDgpCisKKyNkZWZpbmUgSVZfTk9QICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJVl9JTU1FRElBVEUgICAgICAgICAgICAxCisjZGVmaW5lIElWX0RTR0wJCQkyCisKKyNkZWZpbmUgQ1JZUFRPX0FMR19TVUJfVFlQRV9NQVNLICAgICAgICAgICAgMHgwZjAwMDAwMAorI2RlZmluZSBDUllQVE9fQUxHX1NVQl9UWVBFX0hBU0hfSE1BQyAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIENSWVBUT19BTEdfVFlQRV9ITUFDIChDUllQVE9fQUxHX1RZUEVfQUhBU0ggfFwKKwkJCSAgICAgIENSWVBUT19BTEdfU1VCX1RZUEVfSEFTSF9ITUFDKQorCisjZGVmaW5lIE1BWF9TQUxUICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTUFYX1NDUkFUQ0hfUEFEX1NJWkUgICAgMzIKKworI2RlZmluZSBDSENSX0hBU0hfTUFYX0JMT0NLX1NJWkVfNjQgIDY0CisjZGVmaW5lIENIQ1JfSEFTSF9NQVhfQkxPQ0tfU0laRV8xMjggMTI4CisKKy8qIEFsaWduZWQgdG8gMTI4IGJpdCBib3VuZGFyeSAqLworc3RydWN0IF9rZXlfY3R4IHsKKwlfX2JlMzIgY3R4X2hkcjsKKwl1OCBzYWx0W01BWF9TQUxUXTsKKwlfX2JlNjQgcmVzZXJ2ZXJkOworCXVuc2lnbmVkIGNoYXIga2V5WzBdOworfTsKKworc3RydWN0IGFibGtfY3R4IHsKKwl1OCBlbmM7CisJdW5zaWduZWQgaW50IHByb2Nlc3NlZF9sZW47CisJX19iZTMyIGtleV9jdHhfaGRyOworCXVuc2lnbmVkIGludCBlbmNrZXlfbGVuOworCXVuc2lnbmVkIGludCBkc3RfbmVudHM7CisJc3RydWN0IHNjYXR0ZXJsaXN0IGl2X3NnOworCXU4IGtleVtDSENSX0FFU19NQVhfS0VZX0xFTl07CisJdTggaXZbQ0hDUl9NQVhfQ1JZUFRPX0lWX0xFTl07CisJdW5zaWduZWQgY2hhciBjaXBoX21vZGU7Cit9OworCitzdHJ1Y3QgaG1hY19jdHggeworCXN0cnVjdCBzaGFzaF9kZXNjICpkZXNjOworCXU4IGlwYWRbQ0hDUl9IQVNIX01BWF9CTE9DS19TSVpFXzEyOF07CisJdTggb3BhZFtDSENSX0hBU0hfTUFYX0JMT0NLX1NJWkVfMTI4XTsKK307CisKK3N0cnVjdCBfX2NyeXB0b19jdHggeworCXN0cnVjdCBobWFjX2N0eCBobWFjY3R4WzBdOworCXN0cnVjdCBhYmxrX2N0eCBhYmxrY3R4WzBdOworfTsKKworc3RydWN0IGNoY3JfY29udGV4dCB7CisJc3RydWN0IGNoY3JfZGV2ICpkZXY7CisJdW5zaWduZWQgY2hhciB0eF9jaGFubmVsX2lkOworCXN0cnVjdCBfX2NyeXB0b19jdHggY3J5cHRvX2N0eFswXTsKK307CisKK3N0cnVjdCBjaGNyX2FoYXNoX3JlcV9jdHggeworCXUzMiByZXN1bHQ7CisJY2hhciBiZnJbQ0hDUl9IQVNIX01BWF9CTE9DS19TSVpFXzEyOF07CisJdTggYmZyX2xlbjsKKwkvKiBETUEgdGhlIHBhcnRpYWwgaGFzaCBpbiBpdCAqLworCXU4IHBhcnRpYWxfaGFzaFtDSENSX0hBU0hfTUFYX0RJR0VTVF9TSVpFXTsKKwl1NjQgZGF0YV9sZW47ICAvKiBEYXRhIGxlbiB0aWxsIHRpbWUgKi8KKwl2b2lkICpkdW1teV9wYXlsb2FkX3B0cjsKKwkvKiBTS0Igd2hpY2ggaXMgYmVpbmcgc2VudCB0byB0aGUgaGFyZHdhcmUgZm9yIHByb2Nlc3NpbmcgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworfTsKKworc3RydWN0IGNoY3JfYmxrY2lwaGVyX3JlcV9jdHggeworCXN0cnVjdCBza19idWZmICpza2I7Cit9OworCitzdHJ1Y3QgY2hjcl9hbGdfdGVtcGxhdGUgeworCXUzMiB0eXBlOworCXUzMiBpc19yZWdpc3RlcmVkOworCXVuaW9uIHsKKwkJc3RydWN0IGNyeXB0b19hbGcgY3J5cHRvOworCQlzdHJ1Y3QgYWhhc2hfYWxnIGhhc2g7CisJfSBhbGc7Cit9OworCitzdHJ1Y3QgY2hjcl9yZXFfY3R4IHsKKwl1bmlvbiB7CisJCXN0cnVjdCBhaGFzaF9yZXF1ZXN0ICphaGFzaF9yZXE7CisJCXN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKmFibGtfcmVxOworCX0gcmVxOworCXVuaW9uIHsKKwkJc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqYWhhc2hfY3R4OworCQlzdHJ1Y3QgY2hjcl9ibGtjaXBoZXJfcmVxX2N0eCAqYWJsa19jdHg7CisJfSBjdHg7Cit9OworCitzdHJ1Y3Qgc2dlX29wYXF1ZV9oZHIgeworCXZvaWQgKmRldjsKKwlkbWFfYWRkcl90IGFkZHJbTUFYX1NLQl9GUkFHUyArIDFdOworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc2tfYnVmZiAqKCpjcmVhdGVfd3JfdCkoc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpyZXEsCisJCQkJICAgICAgIHN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCwKKwkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgcWlkLAorCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBvcF90eXBlKTsKKworI2VuZGlmIC8qIF9fQ0hDUl9DUllQVE9fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9xYXRfYWxncy5jIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vcWF0X2FsZ3MuYwppbmRleCA3NjkxNDhkLi4yMGYzNWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9xYXRfYWxncy5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL3FhdF9hbGdzLmMKQEAgLTEyNjAsOCArMTI2MCw4IEBACiAJCQkuc2V0a2V5ID0gcWF0X2FsZ19hYmxrY2lwaGVyX3h0c19zZXRrZXksCiAJCQkuZGVjcnlwdCA9IHFhdF9hbGdfYWJsa2NpcGhlcl9kZWNyeXB0LAogCQkJLmVuY3J5cHQgPSBxYXRfYWxnX2FibGtjaXBoZXJfZW5jcnlwdCwKLQkJCS5taW5fa2V5c2l6ZSA9IEFFU19NSU5fS0VZX1NJWkUsCi0JCQkubWF4X2tleXNpemUgPSBBRVNfTUFYX0tFWV9TSVpFLAorCQkJLm1pbl9rZXlzaXplID0gMiAqIEFFU19NSU5fS0VZX1NJWkUsCisJCQkubWF4X2tleXNpemUgPSAyICogQUVTX01BWF9LRVlfU0laRSwKIAkJCS5pdnNpemUgPSBBRVNfQkxPQ0tfU0laRSwKIAkJfSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vdm14L2Flc194dHMuYyBiL2RyaXZlcnMvY3J5cHRvL3ZteC9hZXNfeHRzLmMKaW5kZXggY2ZiMjU0MS4uMjQzNTNlYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3ZteC9hZXNfeHRzLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vdm14L2Flc194dHMuYwpAQCAtMTI5LDggKzEyOSw4IEBACiAKIAkJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CiAKLQkJaXYgPSAodTggKil3YWxrLml2OwogCQlyZXQgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsICZ3YWxrKTsKKwkJaXYgPSB3YWxrLml2OwogCQltZW1zZXQodHdlYWssIDAsIEFFU19CTE9DS19TSVpFKTsKIAkJYWVzX3A4X2VuY3J5cHQoaXYsIHR3ZWFrLCAmY3R4LT50d2Vha19rZXkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RheC9kYXguYyBiL2RyaXZlcnMvZGF4L2RheC5jCmluZGV4IDgwM2YzOTUuLjI5ZjYwMGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RheC9kYXguYworKysgYi9kcml2ZXJzL2RheC9kYXguYwpAQCAtNDU5LDcgKzQ1OSw3IEBACiAJfQogCiAJcGdvZmYgPSBsaW5lYXJfcGFnZV9pbmRleCh2bWEsIHBtZF9hZGRyKTsKLQlwaHlzID0gcGdvZmZfdG9fcGh5cyhkYXhfZGV2LCBwZ29mZiwgUEFHRV9TSVpFKTsKKwlwaHlzID0gcGdvZmZfdG9fcGh5cyhkYXhfZGV2LCBwZ29mZiwgUE1EX1NJWkUpOwogCWlmIChwaHlzID09IC0xKSB7CiAJCWRldl9kYmcoZGV2LCAiJXM6IHBoeXNfdG9fcGdvZmYoJSNseCkgZmFpbGVkXG4iLCBfX2Z1bmNfXywKIAkJCQlwZ29mZik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RheC9wbWVtLmMgYi9kcml2ZXJzL2RheC9wbWVtLmMKaW5kZXggZGZiMTY4NS4uMWYwMWU5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kYXgvcG1lbS5jCisrKyBiL2RyaXZlcnMvZGF4L3BtZW0uYwpAQCAtMTE2LDYgKzExNiw5IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKKwkvKiBhZGp1c3QgdGhlIGRheF9yZWdpb24gcmVzb3VyY2UgdG8gdGhlIHN0YXJ0IG9mIGRhdGEgKi8KKwlyZXMuc3RhcnQgKz0gbGU2NF90b19jcHUocGZuX3NiLT5kYXRhb2ZmKTsKKwogCW5kX3JlZ2lvbiA9IHRvX25kX3JlZ2lvbihkZXYtPnBhcmVudCk7CiAJZGF4X3JlZ2lvbiA9IGFsbG9jX2RheF9yZWdpb24oZGV2LCBuZF9yZWdpb24tPmlkLCAmcmVzLAogCQkJbGUzMl90b19jcHUocGZuX3NiLT5hbGlnbiksIGFkZHIsIFBGTl9ERVZ8UEZOX01BUCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvS2NvbmZpZyBiL2RyaXZlcnMvZGV2ZnJlcS9LY29uZmlnCmluZGV4IGE1YmU1NmUuLjQxMjU0ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZGV2ZnJlcS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9LY29uZmlnCkBAIC03Niw3ICs3Niw3IEBACiAKIGNvbmZpZyBBUk1fRVhZTk9TX0JVU19ERVZGUkVRCiAJdHJpc3RhdGUgIkFSTSBFWFlOT1MgR2VuZXJpYyBNZW1vcnkgQnVzIERFVkZSRVEgRHJpdmVyIgotCWRlcGVuZHMgb24gQVJDSF9FWFlOT1MKKwlkZXBlbmRzIG9uIEFSQ0hfRVhZTk9TIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBERVZGUkVRX0dPVl9TSU1QTEVfT05ERU1BTkQKIAlzZWxlY3QgREVWRlJFUV9HT1ZfUEFTU0lWRQogCXNlbGVjdCBERVZGUkVRX0VWRU5UX0VYWU5PU19QUE1VCkBAIC05MSwxNCArOTEsMjYgQEAKIAkgIFRoaXMgZG9lcyBub3QgeWV0IG9wZXJhdGUgd2l0aCBvcHRpbWFsIHZvbHRhZ2VzLgogCiBjb25maWcgQVJNX1RFR1JBX0RFVkZSRVEKLSAgICAgICB0cmlzdGF0ZSAiVGVncmEgREVWRlJFUSBEcml2ZXIiCi0gICAgICAgZGVwZW5kcyBvbiBBUkNIX1RFR1JBXzEyNF9TT0MKLSAgICAgICBzZWxlY3QgREVWRlJFUV9HT1ZfU0lNUExFX09OREVNQU5ECi0gICAgICAgc2VsZWN0IFBNX09QUAotICAgICAgIGhlbHAKLSAgICAgICAgIFRoaXMgYWRkcyB0aGUgREVWRlJFUSBkcml2ZXIgZm9yIHRoZSBUZWdyYSBmYW1pbHkgb2YgU29Dcy4KLSAgICAgICAgIEl0IHJlYWRzIEFDVE1PTiBjb3VudGVycyBvZiBtZW1vcnkgY29udHJvbGxlcnMgYW5kIGFkanVzdHMgdGhlCi0gICAgICAgICBvcGVyYXRpbmcgZnJlcXVlbmNpZXMgYW5kIHZvbHRhZ2VzIHdpdGggT1BQIHN1cHBvcnQuCisJdHJpc3RhdGUgIlRlZ3JhIERFVkZSRVEgRHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9URUdSQV8xMjRfU09DCisJc2VsZWN0IERFVkZSRVFfR09WX1NJTVBMRV9PTkRFTUFORAorCXNlbGVjdCBQTV9PUFAKKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIERFVkZSRVEgZHJpdmVyIGZvciB0aGUgVGVncmEgZmFtaWx5IG9mIFNvQ3MuCisJICBJdCByZWFkcyBBQ1RNT04gY291bnRlcnMgb2YgbWVtb3J5IGNvbnRyb2xsZXJzIGFuZCBhZGp1c3RzIHRoZQorCSAgb3BlcmF0aW5nIGZyZXF1ZW5jaWVzIGFuZCB2b2x0YWdlcyB3aXRoIE9QUCBzdXBwb3J0LgorCitjb25maWcgQVJNX1JLMzM5OV9ETUNfREVWRlJFUQorCXRyaXN0YXRlICJBUk0gUkszMzk5IERNQyBERVZGUkVRIERyaXZlciIKKwlkZXBlbmRzIG9uIEFSQ0hfUk9DS0NISVAKKwlzZWxlY3QgREVWRlJFUV9FVkVOVF9ST0NLQ0hJUF9ERkkKKwlzZWxlY3QgREVWRlJFUV9HT1ZfU0lNUExFX09OREVNQU5ECisJc2VsZWN0IFBNX0RFVkZSRVFfRVZFTlQKKwlzZWxlY3QgUE1fT1BQCisJaGVscAorICAgICAgICAgIFRoaXMgYWRkcyB0aGUgREVWRlJFUSBkcml2ZXIgZm9yIHRoZSBSSzMzOTkgRE1DKER5bmFtaWMgTWVtb3J5IENvbnRyb2xsZXIpLgorICAgICAgICAgIEl0IHNldHMgdGhlIGZyZXF1ZW5jeSBmb3IgdGhlIG1lbW9yeSBjb250cm9sbGVyIGFuZCByZWFkcyB0aGUgdXNhZ2UgY291bnRzCisgICAgICAgICAgZnJvbSBoYXJkd2FyZS4KIAogc291cmNlICJkcml2ZXJzL2RldmZyZXEvZXZlbnQvS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kZXZmcmVxL01ha2VmaWxlIGIvZHJpdmVycy9kZXZmcmVxL01ha2VmaWxlCmluZGV4IDA5ZjExZDkuLmZiZmY0MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZGV2ZnJlcS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2RldmZyZXEvTWFrZWZpbGUKQEAgLTgsNiArOCw3IEBACiAKICMgREVWRlJFUSBEcml2ZXJzCiBvYmotJChDT05GSUdfQVJNX0VYWU5PU19CVVNfREVWRlJFUSkJKz0gZXh5bm9zLWJ1cy5vCitvYmotJChDT05GSUdfQVJNX1JLMzM5OV9ETUNfREVWRlJFUSkJKz0gcmszMzk5X2RtYy5vCiBvYmotJChDT05GSUdfQVJNX1RFR1JBX0RFVkZSRVEpCQkrPSB0ZWdyYS1kZXZmcmVxLm8KIAogIyBERVZGUkVRIEV2ZW50IERyaXZlcnMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9LY29uZmlnIGIvZHJpdmVycy9kZXZmcmVxL2V2ZW50L0tjb25maWcKaW5kZXggZWI2Zjc0YS4uMGZkYWU4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kZXZmcmVxL2V2ZW50L0tjb25maWcKKysrIGIvZHJpdmVycy9kZXZmcmVxL2V2ZW50L0tjb25maWcKQEAgLTE1LDcgKzE1LDcgQEAKIAogY29uZmlnIERFVkZSRVFfRVZFTlRfRVhZTk9TX05PQ1AKIAl0cmlzdGF0ZSAiRVhZTk9TIE5vQyAoTmV0d29yayBPbiBDaGlwKSBQcm9iZSBERVZGUkVRIGV2ZW50IERyaXZlciIKLQlkZXBlbmRzIG9uIEFSQ0hfRVhZTk9TCisJZGVwZW5kcyBvbiBBUkNIX0VYWU5PUyB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgUE1fT1BQCiAJaGVscAogCSAgVGhpcyBhZGQgdGhlIGRldmZyZXEtZXZlbnQgZHJpdmVyIGZvciBFeHlub3MgU29DLiBJdCBwcm92aWRlcyBOb0MKQEAgLTIzLDExICsyMywxOCBAQAogCiBjb25maWcgREVWRlJFUV9FVkVOVF9FWFlOT1NfUFBNVQogCXRyaXN0YXRlICJFWFlOT1MgUFBNVSAoUGxhdGZvcm0gUGVyZm9ybWFuY2UgTW9uaXRvcmluZyBVbml0KSBERVZGUkVRIGV2ZW50IERyaXZlciIKLQlkZXBlbmRzIG9uIEFSQ0hfRVhZTk9TCisJZGVwZW5kcyBvbiBBUkNIX0VYWU5PUyB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgUE1fT1BQCiAJaGVscAogCSAgVGhpcyBhZGQgdGhlIGRldmZyZXEtZXZlbnQgZHJpdmVyIGZvciBFeHlub3MgU29DLiBJdCBwcm92aWRlcyBQUE1VCiAJICAoUGxhdGZvcm0gUGVyZm9ybWFuY2UgTW9uaXRvcmluZyBVbml0KSBjb3VudGVycyB0byBlc3RpbWF0ZSB0aGUKIAkgIHV0aWxpemF0aW9uIG9mIGVhY2ggbW9kdWxlLgogCitjb25maWcgREVWRlJFUV9FVkVOVF9ST0NLQ0hJUF9ERkkKKwl0cmlzdGF0ZSAiUk9DS0NISVAgREZJIERFVkZSRVEgZXZlbnQgRHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9ST0NLQ0hJUAorCWhlbHAKKwkgIFRoaXMgYWRkIHRoZSBkZXZmcmVxLWV2ZW50IGRyaXZlciBmb3IgUm9ja2NoaXAgU29DLiBJdCBwcm92aWRlcyBERkkKKwkgIChERFIgTW9uaXRvciBNb2R1bGUpIGRyaXZlciB0byBjb3VudCBkZHIgbG9hZC4KKwogZW5kaWYgIyBQTV9ERVZGUkVRX0VWRU5UCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvZXZlbnQvTWFrZWZpbGUgYi9kcml2ZXJzL2RldmZyZXEvZXZlbnQvTWFrZWZpbGUKaW5kZXggM2Q2YWZkMy4uZGRhNzA5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kZXZmcmVxL2V2ZW50L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9NYWtlZmlsZQpAQCAtMiwzICsyLDQgQEAKIAogb2JqLSQoQ09ORklHX0RFVkZSRVFfRVZFTlRfRVhZTk9TX05PQ1ApICs9IGV4eW5vcy1ub2NwLm8KIG9iai0kKENPTkZJR19ERVZGUkVRX0VWRU5UX0VYWU5PU19QUE1VKSArPSBleHlub3MtcHBtdS5vCitvYmotJChDT05GSUdfREVWRlJFUV9FVkVOVF9ST0NLQ0hJUF9ERkkpICs9IHJvY2tjaGlwLWRmaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvZXZlbnQvZXh5bm9zLXBwbXUuYyBiL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9leHlub3MtcHBtdS5jCmluZGV4IDg0NWJmMjUuLmY1NWNmMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9leHlub3MtcHBtdS5jCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9leHlub3MtcHBtdS5jCkBAIC00MDYsOCArNDA2LDYgQEAKIAkJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobm9kZSwgImV2ZW50LW5hbWUiLCAmZGVzY1tqXS5uYW1lKTsKIAogCQlqKys7Ci0KLQkJb2Zfbm9kZV9wdXQobm9kZSk7CiAJfQogCWluZm8tPmRlc2MgPSBkZXNjOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvZXZlbnQvcm9ja2NoaXAtZGZpLmMgYi9kcml2ZXJzL2RldmZyZXEvZXZlbnQvcm9ja2NoaXAtZGZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmY2M1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9yb2NrY2hpcC1kZmkuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgRnV6aG91IFJvY2tjaGlwIEVsZWN0cm9uaWNzIENvLiwgTHRkCisgKiBBdXRob3I6IExpbiBIdWFuZyA8aGxAcm9jay1jaGlwcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmcmVxLWV2ZW50Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKworI2RlZmluZSBSSzMzOTlfRE1DX05VTV9DSAkyCisKKy8qIEREUk1PTl9DVFJMICovCisjZGVmaW5lIEREUk1PTl9DVFJMCTB4MDQKKyNkZWZpbmUgQ0xSX0REUk1PTl9DVFJMCSgweDFmMDAwMCA8PCAwKQorI2RlZmluZSBMUEREUjRfRU4JKDB4MTAwMDEgPDwgNCkKKyNkZWZpbmUgSEFSRFdBUkVfRU4JKDB4MTAwMDEgPDwgMykKKyNkZWZpbmUgTFBERFIzX0VOCSgweDEwMDAxIDw8IDIpCisjZGVmaW5lIFNPRlRXQVJFX0VOCSgweDEwMDAxIDw8IDEpCisjZGVmaW5lIFNPRlRXQVJFX0RJUwkoMHgxMDAwMCA8PCAxKQorI2RlZmluZSBUSU1FX0NOVF9FTgkoMHgxMDAwMSA8PCAwKQorCisjZGVmaW5lIEREUk1PTl9DSDBfQ09VTlRfTlVNCQkweDI4CisjZGVmaW5lIEREUk1PTl9DSDBfREZJX0FDQ0VTU19OVU0JMHgyYworI2RlZmluZSBERFJNT05fQ0gxX0NPVU5UX05VTQkJMHgzYworI2RlZmluZSBERFJNT05fQ0gxX0RGSV9BQ0NFU1NfTlVNCTB4NDAKKworLyogcG11IGdyZiAqLworI2RlZmluZSBQTVVHUkZfT1NfUkVHMgkweDMwOAorI2RlZmluZSBERFJUWVBFX1NISUZUCTEzCisjZGVmaW5lIEREUlRZUEVfTUFTSwk3CisKK2VudW0geworCUREUjMgPSAzLAorCUxQRERSMyA9IDYsCisJTFBERFI0ID0gNywKKwlVTlVTRUQgPSAweEZGCit9OworCitzdHJ1Y3QgZG1jX3VzYWdlIHsKKwl1MzIgYWNjZXNzOworCXUzMiB0b3RhbDsKK307CisKKy8qCisgKiBUaGUgZGZpIGNvbnRyb2xsZXIgY2FuIG1vbml0b3IgRERSIGxvYWQuIEl0IGhhcyBhbiB1cHBlciBhbmQgbG93ZXIgdGhyZXNob2xkCisgKiBmb3IgdGhlIG9wZXJhdGluZyBwb2ludHMuIFdoZW5ldmVyIHRoZSB1c2FnZSBsZWF2ZXMgdGhlc2UgYm91bmRzIGFuIGV2ZW50IGlzCisgKiBnZW5lcmF0ZWQgdG8gaW5kaWNhdGUgdGhlIEREUiBmcmVxdWVuY3kgc2hvdWxkIGJlIGNoYW5nZWQuCisgKi8KK3N0cnVjdCByb2NrY2hpcF9kZmkgeworCXN0cnVjdCBkZXZmcmVxX2V2ZW50X2RldiAqZWRldjsKKwlzdHJ1Y3QgZGV2ZnJlcV9ldmVudF9kZXNjICpkZXNjOworCXN0cnVjdCBkbWNfdXNhZ2UgY2hfdXNhZ2VbUkszMzk5X0RNQ19OVU1fQ0hdOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwX3BtdTsKKwlzdHJ1Y3QgY2xrICpjbGs7Cit9OworCitzdGF0aWMgdm9pZCByb2NrY2hpcF9kZmlfc3RhcnRfaGFyZHdhcmVfY291bnRlcihzdHJ1Y3QgZGV2ZnJlcV9ldmVudF9kZXYgKmVkZXYpCit7CisJc3RydWN0IHJvY2tjaGlwX2RmaSAqaW5mbyA9IGRldmZyZXFfZXZlbnRfZ2V0X2RydmRhdGEoZWRldik7CisJdm9pZCBfX2lvbWVtICpkZmlfcmVncyA9IGluZm8tPnJlZ3M7CisJdTMyIHZhbDsKKwl1MzIgZGRyX3R5cGU7CisKKwkvKiBnZXQgZGRyIHR5cGUgKi8KKwlyZWdtYXBfcmVhZChpbmZvLT5yZWdtYXBfcG11LCBQTVVHUkZfT1NfUkVHMiwgJnZhbCk7CisJZGRyX3R5cGUgPSAodmFsID4+IEREUlRZUEVfU0hJRlQpICYgRERSVFlQRV9NQVNLOworCisJLyogY2xlYXIgRERSTU9OX0NUUkwgc2V0dGluZyAqLworCXdyaXRlbF9yZWxheGVkKENMUl9ERFJNT05fQ1RSTCwgZGZpX3JlZ3MgKyBERFJNT05fQ1RSTCk7CisKKwkvKiBzZXQgZGRyIHR5cGUgdG8gZGZpICovCisJaWYgKGRkcl90eXBlID09IExQRERSMykKKwkJd3JpdGVsX3JlbGF4ZWQoTFBERFIzX0VOLCBkZmlfcmVncyArIEREUk1PTl9DVFJMKTsKKwllbHNlIGlmIChkZHJfdHlwZSA9PSBMUEREUjQpCisJCXdyaXRlbF9yZWxheGVkKExQRERSNF9FTiwgZGZpX3JlZ3MgKyBERFJNT05fQ1RSTCk7CisKKwkvKiBlbmFibGUgY291bnQsIHVzZSBzb2Z0d2FyZSBtb2RlICovCisJd3JpdGVsX3JlbGF4ZWQoU09GVFdBUkVfRU4sIGRmaV9yZWdzICsgRERSTU9OX0NUUkwpOworfQorCitzdGF0aWMgdm9pZCByb2NrY2hpcF9kZmlfc3RvcF9oYXJkd2FyZV9jb3VudGVyKHN0cnVjdCBkZXZmcmVxX2V2ZW50X2RldiAqZWRldikKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfZGZpICppbmZvID0gZGV2ZnJlcV9ldmVudF9nZXRfZHJ2ZGF0YShlZGV2KTsKKwl2b2lkIF9faW9tZW0gKmRmaV9yZWdzID0gaW5mby0+cmVnczsKKworCXdyaXRlbF9yZWxheGVkKFNPRlRXQVJFX0RJUywgZGZpX3JlZ3MgKyBERFJNT05fQ1RSTCk7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfZGZpX2dldF9idXNpZXJfY2goc3RydWN0IGRldmZyZXFfZXZlbnRfZGV2ICplZGV2KQoreworCXN0cnVjdCByb2NrY2hpcF9kZmkgKmluZm8gPSBkZXZmcmVxX2V2ZW50X2dldF9kcnZkYXRhKGVkZXYpOworCXUzMiB0bXAsIG1heCA9IDA7CisJdTMyIGksIGJ1c2llcl9jaCA9IDA7CisJdm9pZCBfX2lvbWVtICpkZmlfcmVncyA9IGluZm8tPnJlZ3M7CisKKwlyb2NrY2hpcF9kZmlfc3RvcF9oYXJkd2FyZV9jb3VudGVyKGVkZXYpOworCisJLyogRmluZCBvdXQgd2hpY2ggY2hhbm5lbCBpcyBidXNpZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUkszMzk5X0RNQ19OVU1fQ0g7IGkrKykgeworCQlpbmZvLT5jaF91c2FnZVtpXS5hY2Nlc3MgPSByZWFkbF9yZWxheGVkKGRmaV9yZWdzICsKKwkJCQlERFJNT05fQ0gwX0RGSV9BQ0NFU1NfTlVNICsgaSAqIDIwKSAqIDQ7CisJCWluZm8tPmNoX3VzYWdlW2ldLnRvdGFsID0gcmVhZGxfcmVsYXhlZChkZmlfcmVncyArCisJCQkJRERSTU9OX0NIMF9DT1VOVF9OVU0gKyBpICogMjApOworCQl0bXAgPSBpbmZvLT5jaF91c2FnZVtpXS5hY2Nlc3M7CisJCWlmICh0bXAgPiBtYXgpIHsKKwkJCWJ1c2llcl9jaCA9IGk7CisJCQltYXggPSB0bXA7CisJCX0KKwl9CisJcm9ja2NoaXBfZGZpX3N0YXJ0X2hhcmR3YXJlX2NvdW50ZXIoZWRldik7CisKKwlyZXR1cm4gYnVzaWVyX2NoOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX2RmaV9kaXNhYmxlKHN0cnVjdCBkZXZmcmVxX2V2ZW50X2RldiAqZWRldikKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfZGZpICppbmZvID0gZGV2ZnJlcV9ldmVudF9nZXRfZHJ2ZGF0YShlZGV2KTsKKworCXJvY2tjaGlwX2RmaV9zdG9wX2hhcmR3YXJlX2NvdW50ZXIoZWRldik7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGluZm8tPmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9kZmlfZW5hYmxlKHN0cnVjdCBkZXZmcmVxX2V2ZW50X2RldiAqZWRldikKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfZGZpICppbmZvID0gZGV2ZnJlcV9ldmVudF9nZXRfZHJ2ZGF0YShlZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGluZm8tPmNsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZlZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGRmaSBjbGs6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJvY2tjaGlwX2RmaV9zdGFydF9oYXJkd2FyZV9jb3VudGVyKGVkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX2RmaV9zZXRfZXZlbnQoc3RydWN0IGRldmZyZXFfZXZlbnRfZGV2ICplZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX2RmaV9nZXRfZXZlbnQoc3RydWN0IGRldmZyZXFfZXZlbnRfZGV2ICplZGV2LAorCQkJCSAgc3RydWN0IGRldmZyZXFfZXZlbnRfZGF0YSAqZWRhdGEpCit7CisJc3RydWN0IHJvY2tjaGlwX2RmaSAqaW5mbyA9IGRldmZyZXFfZXZlbnRfZ2V0X2RydmRhdGEoZWRldik7CisJaW50IGJ1c2llcl9jaDsKKworCWJ1c2llcl9jaCA9IHJvY2tjaGlwX2RmaV9nZXRfYnVzaWVyX2NoKGVkZXYpOworCisJZWRhdGEtPmxvYWRfY291bnQgPSBpbmZvLT5jaF91c2FnZVtidXNpZXJfY2hdLmFjY2VzczsKKwllZGF0YS0+dG90YWxfY291bnQgPSBpbmZvLT5jaF91c2FnZVtidXNpZXJfY2hdLnRvdGFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2ZnJlcV9ldmVudF9vcHMgcm9ja2NoaXBfZGZpX29wcyA9IHsKKwkuZGlzYWJsZSA9IHJvY2tjaGlwX2RmaV9kaXNhYmxlLAorCS5lbmFibGUgPSByb2NrY2hpcF9kZmlfZW5hYmxlLAorCS5nZXRfZXZlbnQgPSByb2NrY2hpcF9kZmlfZ2V0X2V2ZW50LAorCS5zZXRfZXZlbnQgPSByb2NrY2hpcF9kZmlfc2V0X2V2ZW50LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcm9ja2NoaXBfZGZpX2lkX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktZGZpIiB9LAorCXsgfSwKK307CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfZGZpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3Qgcm9ja2NoaXBfZGZpICpkYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBkZXZmcmVxX2V2ZW50X2Rlc2MgKmRlc2M7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlLCAqbm9kZTsKKworCWRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IHJvY2tjaGlwX2RmaSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWRhdGEtPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGRhdGEtPnJlZ3MpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5yZWdzKTsKKworCWRhdGEtPmNsayA9IGRldm1fY2xrX2dldChkZXYsICJwY2xrX2Rkcl9tb24iKTsKKwlpZiAoSVNfRVJSKGRhdGEtPmNsaykpIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgZ2V0IHRoZSBjbGsgZG1jX2Nsa1xuIik7CisJCXJldHVybiBQVFJfRVJSKGRhdGEtPmNsayk7CisJfTsKKworCS8qIHRyeSB0byBmaW5kIHRoZSBvcHRpb25hbCByZWZlcmVuY2UgdG8gdGhlIHBtdSBzeXNjb24gKi8KKwlub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgInJvY2tjaGlwLHBtdSIsIDApOworCWlmIChub2RlKSB7CisJCWRhdGEtPnJlZ21hcF9wbXUgPSBzeXNjb25fbm9kZV90b19yZWdtYXAobm9kZSk7CisJCWlmIChJU19FUlIoZGF0YS0+cmVnbWFwX3BtdSkpCisJCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5yZWdtYXBfcG11KTsKKwl9CisJZGF0YS0+ZGV2ID0gZGV2OworCisJZGVzYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGVzYyksIEdGUF9LRVJORUwpOworCWlmICghZGVzYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXNjLT5vcHMgPSAmcm9ja2NoaXBfZGZpX29wczsKKwlkZXNjLT5kcml2ZXJfZGF0YSA9IGRhdGE7CisJZGVzYy0+bmFtZSA9IG5wLT5uYW1lOworCWRhdGEtPmRlc2MgPSBkZXNjOworCisJZGF0YS0+ZWRldiA9IGRldm1fZGV2ZnJlcV9ldmVudF9hZGRfZWRldigmcGRldi0+ZGV2LCBkZXNjKTsKKwlpZiAoSVNfRVJSKGRhdGEtPmVkZXYpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJmYWlsZWQgdG8gYWRkIGRldmZyZXEtZXZlbnQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YS0+ZWRldik7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcm9ja2NoaXBfZGZpX2RyaXZlciA9IHsKKwkucHJvYmUJPSByb2NrY2hpcF9kZmlfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAicm9ja2NoaXAtZGZpIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gcm9ja2NoaXBfZGZpX2lkX21hdGNoLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyb2NrY2hpcF9kZmlfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FVVEhPUigiTGluIEh1YW5nIDxobEByb2NrLWNoaXBzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUm9ja2NoaXAgREZJIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kZXZmcmVxL3JrMzM5OV9kbWMuYyBiL2RyaXZlcnMvZGV2ZnJlcS9yazMzOTlfZG1jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0YjczZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9yazMzOTlfZG1jLmMKQEAgLTAsMCArMSw0NzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEZ1emhvdSBSb2NrY2hpcCBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcjogTGluIEh1YW5nIDxobEByb2NrLWNoaXBzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2FybS1zbWNjYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZyZXEtZXZlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX29wcC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorCisjaW5jbHVkZSA8c29jL3JvY2tjaGlwL3JvY2tjaGlwX3NpcC5oPgorCitzdHJ1Y3QgZHJhbV90aW1pbmcgeworCXVuc2lnbmVkIGludCBkZHIzX3NwZWVkX2JpbjsKKwl1bnNpZ25lZCBpbnQgcGRfaWRsZTsKKwl1bnNpZ25lZCBpbnQgc3JfaWRsZTsKKwl1bnNpZ25lZCBpbnQgc3JfbWNfZ2F0ZV9pZGxlOworCXVuc2lnbmVkIGludCBzcnBkX2xpdGVfaWRsZTsKKwl1bnNpZ25lZCBpbnQgc3RhbmRieV9pZGxlOworCXVuc2lnbmVkIGludCBhdXRvX3BkX2Rpc19mcmVxOworCXVuc2lnbmVkIGludCBkcmFtX2RsbF9kaXNfZnJlcTsKKwl1bnNpZ25lZCBpbnQgcGh5X2RsbF9kaXNfZnJlcTsKKwl1bnNpZ25lZCBpbnQgZGRyM19vZHRfZGlzX2ZyZXE7CisJdW5zaWduZWQgaW50IGRkcjNfZHJ2OworCXVuc2lnbmVkIGludCBkZHIzX29kdDsKKwl1bnNpZ25lZCBpbnQgcGh5X2RkcjNfY2FfZHJ2OworCXVuc2lnbmVkIGludCBwaHlfZGRyM19kcV9kcnY7CisJdW5zaWduZWQgaW50IHBoeV9kZHIzX29kdDsKKwl1bnNpZ25lZCBpbnQgbHBkZHIzX29kdF9kaXNfZnJlcTsKKwl1bnNpZ25lZCBpbnQgbHBkZHIzX2RydjsKKwl1bnNpZ25lZCBpbnQgbHBkZHIzX29kdDsKKwl1bnNpZ25lZCBpbnQgcGh5X2xwZGRyM19jYV9kcnY7CisJdW5zaWduZWQgaW50IHBoeV9scGRkcjNfZHFfZHJ2OworCXVuc2lnbmVkIGludCBwaHlfbHBkZHIzX29kdDsKKwl1bnNpZ25lZCBpbnQgbHBkZHI0X29kdF9kaXNfZnJlcTsKKwl1bnNpZ25lZCBpbnQgbHBkZHI0X2RydjsKKwl1bnNpZ25lZCBpbnQgbHBkZHI0X2RxX29kdDsKKwl1bnNpZ25lZCBpbnQgbHBkZHI0X2NhX29kdDsKKwl1bnNpZ25lZCBpbnQgcGh5X2xwZGRyNF9jYV9kcnY7CisJdW5zaWduZWQgaW50IHBoeV9scGRkcjRfY2tfY3NfZHJ2OworCXVuc2lnbmVkIGludCBwaHlfbHBkZHI0X2RxX2RydjsKKwl1bnNpZ25lZCBpbnQgcGh5X2xwZGRyNF9vZHQ7Cit9OworCitzdHJ1Y3QgcmszMzk5X2RtY2ZyZXEgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZGV2ZnJlcSAqZGV2ZnJlcTsKKwlzdHJ1Y3QgZGV2ZnJlcV9zaW1wbGVfb25kZW1hbmRfZGF0YSBvbmRlbWFuZF9kYXRhOworCXN0cnVjdCBjbGsgKmRtY19jbGs7CisJc3RydWN0IGRldmZyZXFfZXZlbnRfZGV2ICplZGV2OworCXN0cnVjdCBtdXRleCBsb2NrOworCXN0cnVjdCBkcmFtX3RpbWluZyB0aW1pbmc7CisKKwkvKgorCSAqIEREUiBDb252ZXJzZXIgb2YgRnJlcXVlbmN5IChEQ0YpIGlzIHVzZWQgdG8gaW1wbGVtZW50IEREUiBmcmVxdWVuY3kKKwkgKiBjb252ZXJzaW9uIHdpdGhvdXQgdGhlIHBhcnRpY2lwYXRpb24gb2YgQ1BVLCB3ZSB3aWxsIGltcGxlbWVudCBhbmQKKwkgKiBjb250cm9sIGl0IGluIGFybSB0cnVzdCBmaXJtd2FyZS4KKwkgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0X2RjZl9xdWV1ZTsKKwlpbnQgaXJxOworCWludCB3YWl0X2RjZl9mbGFnOworCXN0cnVjdCByZWd1bGF0b3IgKnZkZF9jZW50ZXI7CisJdW5zaWduZWQgbG9uZyByYXRlLCB0YXJnZXRfcmF0ZTsKKwl1bnNpZ25lZCBsb25nIHZvbHQsIHRhcmdldF92b2x0OworCXN0cnVjdCBkZXZfcG1fb3BwICpjdXJyX29wcDsKK307CisKK3N0YXRpYyBpbnQgcmszMzk5X2RtY2ZyZXFfdGFyZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyAqZnJlcSwKKwkJCQkgdTMyIGZsYWdzKQoreworCXN0cnVjdCByazMzOTlfZG1jZnJlcSAqZG1jZnJlcSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBkZXZfcG1fb3BwICpvcHA7CisJdW5zaWduZWQgbG9uZyBvbGRfY2xrX3JhdGUgPSBkbWNmcmVxLT5yYXRlOworCXVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQsIHRhcmdldF9yYXRlOworCWludCBlcnI7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJb3BwID0gZGV2ZnJlcV9yZWNvbW1lbmRlZF9vcHAoZGV2LCBmcmVxLCBmbGFncyk7CisJaWYgKElTX0VSUihvcHApKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm4gUFRSX0VSUihvcHApOworCX0KKworCXRhcmdldF9yYXRlID0gZGV2X3BtX29wcF9nZXRfZnJlcShvcHApOworCXRhcmdldF92b2x0ID0gZGV2X3BtX29wcF9nZXRfdm9sdGFnZShvcHApOworCisJZG1jZnJlcS0+cmF0ZSA9IGRldl9wbV9vcHBfZ2V0X2ZyZXEoZG1jZnJlcS0+Y3Vycl9vcHApOworCWRtY2ZyZXEtPnZvbHQgPSBkZXZfcG1fb3BwX2dldF92b2x0YWdlKGRtY2ZyZXEtPmN1cnJfb3BwKTsKKworCXJjdV9yZWFkX3VubG9jaygpOworCisJaWYgKGRtY2ZyZXEtPnJhdGUgPT0gdGFyZ2V0X3JhdGUpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmZG1jZnJlcS0+bG9jayk7CisKKwkvKgorCSAqIElmIGZyZXF1ZW5jeSBzY2FsaW5nIGZyb20gbG93IHRvIGhpZ2gsIGFkanVzdCB2b2x0YWdlIGZpcnN0LgorCSAqIElmIGZyZXF1ZW5jeSBzY2FsaW5nIGZyb20gaGlnaCB0byBsb3csIGFkanVzdCBmcmVxdWVuY3kgZmlyc3QuCisJICovCisJaWYgKG9sZF9jbGtfcmF0ZSA8IHRhcmdldF9yYXRlKSB7CisJCWVyciA9IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZShkbWNmcmVxLT52ZGRfY2VudGVyLCB0YXJnZXRfdm9sdCwKKwkJCQkJICAgIHRhcmdldF92b2x0KTsKKwkJaWYgKGVycikgeworCQkJZGV2X2VycihkZXYsICJDYW5ub3QgdG8gc2V0IHZvbHRhZ2UgJWx1IHVWXG4iLAorCQkJCXRhcmdldF92b2x0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWRtY2ZyZXEtPndhaXRfZGNmX2ZsYWcgPSAxOworCisJZXJyID0gY2xrX3NldF9yYXRlKGRtY2ZyZXEtPmRtY19jbGssIHRhcmdldF9yYXRlKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IHRvIHNldCBmcmVxdWVuY3kgJWx1ICglZClcbiIsCisJCQl0YXJnZXRfcmF0ZSwgZXJyKTsKKwkJcmVndWxhdG9yX3NldF92b2x0YWdlKGRtY2ZyZXEtPnZkZF9jZW50ZXIsIGRtY2ZyZXEtPnZvbHQsCisJCQkJICAgICAgZG1jZnJlcS0+dm9sdCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogV2FpdCB1bnRpbCBiY2YgaXJxIGhhcHBlbiwgaXQgbWVhbnMgZnJlcSBzY2FsaW5nIGZpbmlzaCBpbgorCSAqIGFybSB0cnVzdCBmaXJtd2FyZSwgdXNlIDEwMG1zIGFzIHRpbWVvdXQgdGltZS4KKwkgKi8KKwlpZiAoIXdhaXRfZXZlbnRfdGltZW91dChkbWNmcmVxLT53YWl0X2RjZl9xdWV1ZSwKKwkJCQkhZG1jZnJlcS0+d2FpdF9kY2ZfZmxhZywgSFogLyAxMCkpCisJCWRldl93YXJuKGRldiwgIlRpbWVvdXQgd2FpdGluZyBmb3IgZGNmIGludGVycnVwdFxuIik7CisKKwkvKgorCSAqIENoZWNrIHRoZSBkcGxsIHJhdGUsCisJICogVGhlcmUgb25seSB0d28gcmVzdWx0IHdlIHdpbGwgZ2V0LAorCSAqIDEuIERkciBmcmVxdWVuY3kgc2NhbGluZyBmYWlsLCB3ZSBzdGlsbCBnZXQgdGhlIG9sZCByYXRlLgorCSAqIDIuIERkciBmcmVxdWVuY3kgc2NhbGluZyBzdWNlc3NmdWwsIHdlIGdldCB0aGUgcmF0ZSB3ZSBzZXQuCisJICovCisJZG1jZnJlcS0+cmF0ZSA9IGNsa19nZXRfcmF0ZShkbWNmcmVxLT5kbWNfY2xrKTsKKworCS8qIElmIGdldCB0aGUgaW5jb3JyZWN0IHJhdGUsIHNldCB2b2x0YWdlIHRvIG9sZCB2YWx1ZS4gKi8KKwlpZiAoZG1jZnJlcS0+cmF0ZSAhPSB0YXJnZXRfcmF0ZSkgeworCQlkZXZfZXJyKGRldiwgIkdldCB3cm9uZyBkZHIgZnJlcXVlbmN5LCBSZXF1ZXN0IGZyZXF1ZW5jeSAlbHUsXAorCQkJQ3VycmVudCBmcmVxdWVuY3kgJWx1XG4iLCB0YXJnZXRfcmF0ZSwgZG1jZnJlcS0+cmF0ZSk7CisJCXJlZ3VsYXRvcl9zZXRfdm9sdGFnZShkbWNmcmVxLT52ZGRfY2VudGVyLCBkbWNmcmVxLT52b2x0LAorCQkJCSAgICAgIGRtY2ZyZXEtPnZvbHQpOworCQlnb3RvIG91dDsKKwl9IGVsc2UgaWYgKG9sZF9jbGtfcmF0ZSA+IHRhcmdldF9yYXRlKQorCQllcnIgPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UoZG1jZnJlcS0+dmRkX2NlbnRlciwgdGFyZ2V0X3ZvbHQsCisJCQkJCSAgICB0YXJnZXRfdm9sdCk7CisJaWYgKGVycikKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgdG8gc2V0IHZvbCAlbHUgdVZcbiIsIHRhcmdldF92b2x0KTsKKworCWRtY2ZyZXEtPmN1cnJfb3BwID0gb3BwOworb3V0OgorCW11dGV4X3VubG9jaygmZG1jZnJlcS0+bG9jayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByazMzOTlfZG1jZnJlcV9nZXRfZGV2X3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2ZnJlcV9kZXZfc3RhdHVzICpzdGF0KQoreworCXN0cnVjdCByazMzOTlfZG1jZnJlcSAqZG1jZnJlcSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBkZXZmcmVxX2V2ZW50X2RhdGEgZWRhdGE7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBkZXZmcmVxX2V2ZW50X2dldF9ldmVudChkbWNmcmVxLT5lZGV2LCAmZWRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJc3RhdC0+Y3VycmVudF9mcmVxdWVuY3kgPSBkbWNmcmVxLT5yYXRlOworCXN0YXQtPmJ1c3lfdGltZSA9IGVkYXRhLmxvYWRfY291bnQ7CisJc3RhdC0+dG90YWxfdGltZSA9IGVkYXRhLnRvdGFsX2NvdW50OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByazMzOTlfZG1jZnJlcV9nZXRfY3VyX2ZyZXEoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nICpmcmVxKQoreworCXN0cnVjdCByazMzOTlfZG1jZnJlcSAqZG1jZnJlcSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJKmZyZXEgPSBkbWNmcmVxLT5yYXRlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2ZnJlcV9kZXZfcHJvZmlsZSByazMzOTlfZGV2ZnJlcV9kbWNfcHJvZmlsZSA9IHsKKwkucG9sbGluZ19tcwk9IDIwMCwKKwkudGFyZ2V0CQk9IHJrMzM5OV9kbWNmcmVxX3RhcmdldCwKKwkuZ2V0X2Rldl9zdGF0dXMJPSByazMzOTlfZG1jZnJlcV9nZXRfZGV2X3N0YXR1cywKKwkuZ2V0X2N1cl9mcmVxCT0gcmszMzk5X2RtY2ZyZXFfZ2V0X2N1cl9mcmVxLAorfTsKKworc3RhdGljIF9fbWF5YmVfdW51c2VkIGludCByazMzOTlfZG1jZnJlcV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmszMzk5X2RtY2ZyZXEgKmRtY2ZyZXEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGRldmZyZXFfZXZlbnRfZGlzYWJsZV9lZGV2KGRtY2ZyZXEtPmVkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGRpc2FibGUgdGhlIGRldmZyZXEtZXZlbnQgZGV2aWNlc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZGV2ZnJlcV9zdXNwZW5kX2RldmljZShkbWNmcmVxLT5kZXZmcmVxKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBzdXNwZW5kIHRoZSBkZXZmcmVxIGRldmljZXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19tYXliZV91bnVzZWQgaW50IHJrMzM5OV9kbWNmcmVxX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJrMzM5OV9kbWNmcmVxICpkbWNmcmVxID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBkZXZmcmVxX2V2ZW50X2VuYWJsZV9lZGV2KGRtY2ZyZXEtPmVkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSB0aGUgZGV2ZnJlcS1ldmVudCBkZXZpY2VzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBkZXZmcmVxX3Jlc3VtZV9kZXZpY2UoZG1jZnJlcS0+ZGV2ZnJlcSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVzdW1lIHRoZSBkZXZmcmVxIGRldmljZXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMocmszMzk5X2RtY2ZyZXFfcG0sIHJrMzM5OV9kbWNmcmVxX3N1c3BlbmQsCisJCQkgcmszMzk5X2RtY2ZyZXFfcmVzdW1lKTsKKworc3RhdGljIGlycXJldHVybl90IHJrMzM5OV9kbWNfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcmszMzk5X2RtY2ZyZXEgKmRtY2ZyZXEgPSBkZXZfaWQ7CisJc3RydWN0IGFybV9zbWNjY19yZXMgcmVzOworCisJZG1jZnJlcS0+d2FpdF9kY2ZfZmxhZyA9IDA7CisJd2FrZV91cCgmZG1jZnJlcS0+d2FpdF9kY2ZfcXVldWUpOworCisJLyogQ2xlYXIgdGhlIERDRiBpbnRlcnJ1cHQgKi8KKwlhcm1fc21jY2Nfc21jKFJPQ0tDSElQX1NJUF9EUkFNX0ZSRVEsIDAsIDAsCisJCSAgICAgIFJPQ0tDSElQX1NJUF9DT05GSUdfRFJBTV9DTFJfSVJRLAorCQkgICAgICAwLCAwLCAwLCAwLCAmcmVzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBvZl9nZXRfZGRyX3RpbWluZ3Moc3RydWN0IGRyYW1fdGltaW5nICp0aW1pbmcsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCWludCByZXQgPSAwOworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxkZHIzX3NwZWVkX2JpbiIsCisJCQkJICAgJnRpbWluZy0+ZGRyM19zcGVlZF9iaW4pOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLHBkX2lkbGUiLAorCQkJCSAgICAmdGltaW5nLT5wZF9pZGxlKTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxzcl9pZGxlIiwKKwkJCQkgICAgJnRpbWluZy0+c3JfaWRsZSk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsc3JfbWNfZ2F0ZV9pZGxlIiwKKwkJCQkgICAgJnRpbWluZy0+c3JfbWNfZ2F0ZV9pZGxlKTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxzcnBkX2xpdGVfaWRsZSIsCisJCQkJICAgICZ0aW1pbmctPnNycGRfbGl0ZV9pZGxlKTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxzdGFuZGJ5X2lkbGUiLAorCQkJCSAgICAmdGltaW5nLT5zdGFuZGJ5X2lkbGUpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLGF1dG9fcGRfZGlzX2ZyZXEiLAorCQkJCSAgICAmdGltaW5nLT5hdXRvX3BkX2Rpc19mcmVxKTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxkcmFtX2RsbF9kaXNfZnJlcSIsCisJCQkJICAgICZ0aW1pbmctPmRyYW1fZGxsX2Rpc19mcmVxKTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxwaHlfZGxsX2Rpc19mcmVxIiwKKwkJCQkgICAgJnRpbWluZy0+cGh5X2RsbF9kaXNfZnJlcSk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsZGRyM19vZHRfZGlzX2ZyZXEiLAorCQkJCSAgICAmdGltaW5nLT5kZHIzX29kdF9kaXNfZnJlcSk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsZGRyM19kcnYiLAorCQkJCSAgICAmdGltaW5nLT5kZHIzX2Rydik7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsZGRyM19vZHQiLAorCQkJCSAgICAmdGltaW5nLT5kZHIzX29kdCk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAscGh5X2RkcjNfY2FfZHJ2IiwKKwkJCQkgICAgJnRpbWluZy0+cGh5X2RkcjNfY2FfZHJ2KTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxwaHlfZGRyM19kcV9kcnYiLAorCQkJCSAgICAmdGltaW5nLT5waHlfZGRyM19kcV9kcnYpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLHBoeV9kZHIzX29kdCIsCisJCQkJICAgICZ0aW1pbmctPnBoeV9kZHIzX29kdCk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsbHBkZHIzX29kdF9kaXNfZnJlcSIsCisJCQkJICAgICZ0aW1pbmctPmxwZGRyM19vZHRfZGlzX2ZyZXEpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLGxwZGRyM19kcnYiLAorCQkJCSAgICAmdGltaW5nLT5scGRkcjNfZHJ2KTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxscGRkcjNfb2R0IiwKKwkJCQkgICAgJnRpbWluZy0+bHBkZHIzX29kdCk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAscGh5X2xwZGRyM19jYV9kcnYiLAorCQkJCSAgICAmdGltaW5nLT5waHlfbHBkZHIzX2NhX2Rydik7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAscGh5X2xwZGRyM19kcV9kcnYiLAorCQkJCSAgICAmdGltaW5nLT5waHlfbHBkZHIzX2RxX2Rydik7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAscGh5X2xwZGRyM19vZHQiLAorCQkJCSAgICAmdGltaW5nLT5waHlfbHBkZHIzX29kdCk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsbHBkZHI0X29kdF9kaXNfZnJlcSIsCisJCQkJICAgICZ0aW1pbmctPmxwZGRyNF9vZHRfZGlzX2ZyZXEpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLGxwZGRyNF9kcnYiLAorCQkJCSAgICAmdGltaW5nLT5scGRkcjRfZHJ2KTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxscGRkcjRfZHFfb2R0IiwKKwkJCQkgICAgJnRpbWluZy0+bHBkZHI0X2RxX29kdCk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsbHBkZHI0X2NhX29kdCIsCisJCQkJICAgICZ0aW1pbmctPmxwZGRyNF9jYV9vZHQpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLHBoeV9scGRkcjRfY2FfZHJ2IiwKKwkJCQkgICAgJnRpbWluZy0+cGh5X2xwZGRyNF9jYV9kcnYpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLHBoeV9scGRkcjRfY2tfY3NfZHJ2IiwKKwkJCQkgICAgJnRpbWluZy0+cGh5X2xwZGRyNF9ja19jc19kcnYpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLHBoeV9scGRkcjRfZHFfZHJ2IiwKKwkJCQkgICAgJnRpbWluZy0+cGh5X2xwZGRyNF9kcV9kcnYpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLHBoeV9scGRkcjRfb2R0IiwKKwkJCQkgICAgJnRpbWluZy0+cGh5X2xwZGRyNF9vZHQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByazMzOTlfZG1jZnJlcV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgcmszMzk5X2RtY2ZyZXEgKmRhdGE7CisJaW50IHJldCwgaXJxLCBpbmRleCwgc2l6ZTsKKwl1aW50MzJfdCAqdGltaW5nOworCXN0cnVjdCBkZXZfcG1fb3BwICpvcHA7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBnZXQgdGhlIGRtYyBpbnRlcnJ1cHQgcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgcmszMzk5X2RtY2ZyZXEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJbXV0ZXhfaW5pdCgmZGF0YS0+bG9jayk7CisKKwlkYXRhLT52ZGRfY2VudGVyID0gZGV2bV9yZWd1bGF0b3JfZ2V0KGRldiwgImNlbnRlciIpOworCWlmIChJU19FUlIoZGF0YS0+dmRkX2NlbnRlcikpIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgZ2V0IHRoZSByZWd1bGF0b3IgXCJjZW50ZXJcIlxuIik7CisJCXJldHVybiBQVFJfRVJSKGRhdGEtPnZkZF9jZW50ZXIpOworCX0KKworCWRhdGEtPmRtY19jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAiZG1jX2NsayIpOworCWlmIChJU19FUlIoZGF0YS0+ZG1jX2NsaykpIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgZ2V0IHRoZSBjbGsgZG1jX2Nsa1xuIik7CisJCXJldHVybiBQVFJfRVJSKGRhdGEtPmRtY19jbGspOworCX07CisKKwlkYXRhLT5pcnEgPSBpcnE7CisJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIGlycSwgcmszMzk5X2RtY19pcnEsIDAsCisJCQkgICAgICAgZGV2X25hbWUoZGV2KSwgZGF0YSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXF1ZXN0IGRtYyBpcnE6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRhdGEtPndhaXRfZGNmX3F1ZXVlKTsKKwlkYXRhLT53YWl0X2RjZl9mbGFnID0gMDsKKworCWRhdGEtPmVkZXYgPSBkZXZmcmVxX2V2ZW50X2dldF9lZGV2X2J5X3BoYW5kbGUoZGV2LCAwKTsKKwlpZiAoSVNfRVJSKGRhdGEtPmVkZXYpKQorCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKworCXJldCA9IGRldmZyZXFfZXZlbnRfZW5hYmxlX2VkZXYoZGF0YS0+ZWRldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIGRldmZyZXEtZXZlbnQgZGV2aWNlc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiBHZXQgZHJhbSB0aW1pbmcgYW5kIHBhc3MgaXQgdG8gYXJtIHRydXN0IGZpcm13YXJlLAorCSAqIHRoZSBkcmFtIGRydmllciBpbiBhcm0gdHJ1c3QgZmlybXdhcmUgd2lsbCBnZXQgdGhlc2UKKwkgKiB0aW1pbmcgYW5kIHRvIGRvIGRyYW0gaW5pdGlhbC4KKwkgKi8KKwlpZiAoIW9mX2dldF9kZHJfdGltaW5ncygmZGF0YS0+dGltaW5nLCBucCkpIHsKKwkJdGltaW5nID0gJmRhdGEtPnRpbWluZy5kZHIzX3NwZWVkX2JpbjsKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZHJhbV90aW1pbmcpIC8gNDsKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgaW5kZXgrKykgeworCQkJYXJtX3NtY2NjX3NtYyhST0NLQ0hJUF9TSVBfRFJBTV9GUkVRLCAqdGltaW5nKyssIGluZGV4LAorCQkJCSAgICAgIFJPQ0tDSElQX1NJUF9DT05GSUdfRFJBTV9TRVRfUEFSQU0sCisJCQkJICAgICAgMCwgMCwgMCwgMCwgJnJlcyk7CisJCQlpZiAocmVzLmEwKSB7CisJCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IGRyYW0gcGFyYW06ICVsZFxuIiwKKwkJCQkJcmVzLmEwKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKworCWFybV9zbWNjY19zbWMoUk9DS0NISVBfU0lQX0RSQU1fRlJFUSwgMCwgMCwKKwkJICAgICAgUk9DS0NISVBfU0lQX0NPTkZJR19EUkFNX0lOSVQsCisJCSAgICAgIDAsIDAsIDAsIDAsICZyZXMpOworCisJLyoKKwkgKiBXZSBhZGQgYSBkZXZmcmVxIGRyaXZlciB0byBvdXIgcGFyZW50IHNpbmNlIGl0IGhhcyBhIGRldmljZSB0cmVlIG5vZGUKKwkgKiB3aXRoIG9wZXJhdGluZyBwb2ludHMuCisJICovCisJaWYgKGRldl9wbV9vcHBfb2ZfYWRkX3RhYmxlKGRldikpIHsKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIG9wZXJhdGluZy1wb2ludHMgaW4gZGV2aWNlIHRyZWUuXG4iKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidXB0aHJlc2hvbGQiLAorCQkJICAgICAmZGF0YS0+b25kZW1hbmRfZGF0YS51cHRocmVzaG9sZCk7CisJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJkb3duZGlmZmVyZW50aWFsIiwKKwkJCSAgICAgJmRhdGEtPm9uZGVtYW5kX2RhdGEuZG93bmRpZmZlcmVudGlhbCk7CisKKwlkYXRhLT5yYXRlID0gY2xrX2dldF9yYXRlKGRhdGEtPmRtY19jbGspOworCisJcmN1X3JlYWRfbG9jaygpOworCW9wcCA9IGRldmZyZXFfcmVjb21tZW5kZWRfb3BwKGRldiwgJmRhdGEtPnJhdGUsIDApOworCWlmIChJU19FUlIob3BwKSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIFBUUl9FUlIob3BwKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJZGF0YS0+Y3Vycl9vcHAgPSBvcHA7CisKKwlyazMzOTlfZGV2ZnJlcV9kbWNfcHJvZmlsZS5pbml0aWFsX2ZyZXEgPSBkYXRhLT5yYXRlOworCisJZGF0YS0+ZGV2ZnJlcSA9IGRldmZyZXFfYWRkX2RldmljZShkZXYsCisJCQkJCSAgICZyazMzOTlfZGV2ZnJlcV9kbWNfcHJvZmlsZSwKKwkJCQkJICAgInNpbXBsZV9vbmRlbWFuZCIsCisJCQkJCSAgICZkYXRhLT5vbmRlbWFuZF9kYXRhKTsKKwlpZiAoSVNfRVJSKGRhdGEtPmRldmZyZXEpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5kZXZmcmVxKTsKKwlkZXZtX2RldmZyZXFfcmVnaXN0ZXJfb3BwX25vdGlmaWVyKGRldiwgZGF0YS0+ZGV2ZnJlcSk7CisKKwlkYXRhLT5kZXYgPSBkZXY7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcmszMzk5ZG1jX2RldmZyZXFfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzM5OS1kbWMiIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcmszMzk5X2RtY2ZyZXFfZHJpdmVyID0geworCS5wcm9iZQk9IHJrMzM5OV9kbWNmcmVxX3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInJrMzM5OS1kbWMtZnJlcSIsCisJCS5wbQk9ICZyazMzOTlfZG1jZnJlcV9wbSwKKwkJLm9mX21hdGNoX3RhYmxlID0gcmszMzk5ZG1jX2RldmZyZXFfb2ZfbWF0Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJrMzM5OV9kbWNmcmVxX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIkxpbiBIdWFuZyA8aGxAcm9jay1jaGlwcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJLMzM5OSBkbWNmcmVxIGRyaXZlciB3aXRoIGRldmZyZXEgZnJhbWV3b3JrIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS1idWYvS2NvbmZpZyBiL2RyaXZlcnMvZG1hLWJ1Zi9LY29uZmlnCmluZGV4IDI1YmNmYTAuLjI1ODU4MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hLWJ1Zi9LY29uZmlnCisrKyBiL2RyaXZlcnMvZG1hLWJ1Zi9LY29uZmlnCkBAIC0xNyw0ICsxNywxNyBAQAogCSAgRmlsZXMgZmRzLCB0byB0aGUgRFJNIGRyaXZlciBmb3IgZXhhbXBsZS4gTW9yZSBkZXRhaWxzIGF0CiAJICBEb2N1bWVudGF0aW9uL3N5bmNfZmlsZS50eHQuCiAKK2NvbmZpZyBTV19TWU5DCisJYm9vbCAiU3luYyBGaWxlIFZhbGlkYXRpb24gRnJhbWV3b3JrIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gU1lOQ19GSUxFCisJZGVwZW5kcyBvbiBERUJVR19GUworCS0tLWhlbHAtLS0KKwkgIEEgc3luYyBvYmplY3QgZHJpdmVyIHRoYXQgdXNlcyBhIDMyYml0IGNvdW50ZXIgdG8gY29vcmRpbmF0ZQorCSAgc3luY2hyb25pemF0aW9uLiAgVXNlZnVsIHdoZW4gdGhlcmUgaXMgbm8gaGFyZHdhcmUgcHJpbWl0aXZlIGJhY2tpbmcKKwkgIHRoZSBzeW5jaHJvbml6YXRpb24uCisKKwkgIFdBUk5JTkc6IGltcHJvcGVyIHVzZSBvZiB0aGlzIGNhbiByZXN1bHQgaW4gZGVhZGxvY2tpbmcga2VybmVsCisJICBkcml2ZXJzIGZyb20gdXNlcnNwYWNlLiBJbnRlbmRlZCBmb3IgdGVzdCBhbmQgZGVidWcgb25seS4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEtYnVmL01ha2VmaWxlIGIvZHJpdmVycy9kbWEtYnVmL01ha2VmaWxlCmluZGV4IGYzNTNkYjIuLjIxMGExMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hLWJ1Zi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2RtYS1idWYvTWFrZWZpbGUKQEAgLTEsMiArMSwzIEBACiBvYmoteSA6PSBkbWEtYnVmLm8gZmVuY2UubyByZXNlcnZhdGlvbi5vIHNlcW5vLWZlbmNlLm8gZmVuY2UtYXJyYXkubwogb2JqLSQoQ09ORklHX1NZTkNfRklMRSkJCSs9IHN5bmNfZmlsZS5vCitvYmotJChDT05GSUdfU1dfU1lOQykJCSs9IHN3X3N5bmMubyBzeW5jX2RlYnVnLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hLWJ1Zi9zd19zeW5jLmMgYi9kcml2ZXJzL2RtYS1idWYvc3dfc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZThlNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS1idWYvc3dfc3luYy5jCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogU3luYyBGaWxlIHZhbGlkYXRpb24gZnJhbWV3b3JrCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5bmNfZmlsZS5oPgorCisjaW5jbHVkZSAic3luY19kZWJ1Zy5oIgorCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKKyNpbmNsdWRlICJzeW5jX3RyYWNlLmgiCisKKy8qCisgKiBTVyBTWU5DIHZhbGlkYXRpb24gZnJhbWV3b3JrCisgKgorICogQSBzeW5jIG9iamVjdCBkcml2ZXIgdGhhdCB1c2VzIGEgMzJiaXQgY291bnRlciB0byBjb29yZGluYXRlCisgKiBzeW5jaHJvbml6YXRpb24uICBVc2VmdWwgd2hlbiB0aGVyZSBpcyBubyBoYXJkd2FyZSBwcmltaXRpdmUgYmFja2luZworICogdGhlIHN5bmNocm9uaXphdGlvbi4KKyAqCisgKiBUbyBzdGFydCB0aGUgZnJhbWV3b3JrIGp1c3Qgb3BlbjoKKyAqCisgKiA8ZGVidWdmcz4vc3luYy9zd19zeW5jCisgKgorICogVGhhdCB3aWxsIGNyZWF0ZSBhIHN5bmMgdGltZWxpbmUsIGFsbCBmZW5jZXMgY3JlYXRlZCB1bmRlciB0aGlzIHRpbWVsaW5lCisgKiBmaWxlIGRlc2NyaXB0b3Igd2lsbCBiZWxvbmcgdG8gdGhlIHRoaXMgdGltZWxpbmUuCisgKgorICogVGhlICdzd19zeW5jJyBmaWxlIGNhbiBiZSBvcGVuZWQgbWFueSB0aW1lcyBhcyB0byBjcmVhdGUgZGlmZmVyZW50CisgKiB0aW1lbGluZXMuCisgKgorICogRmVuY2VzIGNhbiBiZSBjcmVhdGVkIHdpdGggU1dfU1lOQ19JT0NfQ1JFQVRFX0ZFTkNFIGlvY3RsIHdpdGggc3RydWN0CisgKiBzd19zeW5jX2lvY3RsX2NyZWF0ZV9mZW5jZSBhcyBwYXJhbWV0ZXIuCisgKgorICogVG8gaW5jcmVtZW50IHRoZSB0aW1lbGluZSBjb3VudGVyLCBTV19TWU5DX0lPQ19JTkMgaW9jdGwgc2hvdWxkIGJlIHVzZWQKKyAqIHdpdGggdGhlIGluY3JlbWVudCBhcyB1MzIuIFRoaXMgd2lsbCB1cGRhdGUgdGhlIGxhc3Qgc2lnbmFsZWQgdmFsdWUKKyAqIGZyb20gdGhlIHRpbWVsaW5lIGFuZCBzaWduYWwgYW55IGZlbmNlIHRoYXQgaGFzIGEgc2Vxbm8gc21hbGxlciBvciBlcXVhbAorICogdG8gaXQuCisgKgorICogc3RydWN0IHN3X3N5bmNfaW9jdGxfY3JlYXRlX2ZlbmNlCisgKiBAdmFsdWU6CXRoZSBzZXFubyB0byBpbml0aWFsaXNlIHRoZSBmZW5jZSB3aXRoCisgKiBAbmFtZToJdGhlIG5hbWUgb2YgdGhlIG5ldyBzeW5jIHBvaW50CisgKiBAZmVuY2U6CXJldHVybiB0aGUgZmQgb2YgdGhlIG5ldyBzeW5jX2ZpbGUgd2l0aCB0aGUgY3JlYXRlZCBmZW5jZQorICovCitzdHJ1Y3Qgc3dfc3luY19jcmVhdGVfZmVuY2VfZGF0YSB7CisJX191MzIJdmFsdWU7CisJY2hhcgluYW1lWzMyXTsKKwlfX3MzMglmZW5jZTsgLyogZmQgb2YgbmV3IGZlbmNlICovCit9OworCisjZGVmaW5lIFNXX1NZTkNfSU9DX01BR0lDCSdXJworCisjZGVmaW5lIFNXX1NZTkNfSU9DX0NSRUFURV9GRU5DRQlfSU9XUihTV19TWU5DX0lPQ19NQUdJQywgMCxcCisJCXN0cnVjdCBzd19zeW5jX2NyZWF0ZV9mZW5jZV9kYXRhKQorCisjZGVmaW5lIFNXX1NZTkNfSU9DX0lOQwkJCV9JT1coU1dfU1lOQ19JT0NfTUFHSUMsIDEsIF9fdTMyKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZlbmNlX29wcyB0aW1lbGluZV9mZW5jZV9vcHM7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN5bmNfcHQgKmZlbmNlX3RvX3N5bmNfcHQoc3RydWN0IGZlbmNlICpmZW5jZSkKK3sKKwlpZiAoZmVuY2UtPm9wcyAhPSAmdGltZWxpbmVfZmVuY2Vfb3BzKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gY29udGFpbmVyX29mKGZlbmNlLCBzdHJ1Y3Qgc3luY19wdCwgYmFzZSk7Cit9CisKKy8qKgorICogc3luY190aW1lbGluZV9jcmVhdGUoKSAtIGNyZWF0ZXMgYSBzeW5jIG9iamVjdAorICogQG5hbWU6CXN5bmNfdGltZWxpbmUgbmFtZQorICoKKyAqIENyZWF0ZXMgYSBuZXcgc3luY190aW1lbGluZS4gUmV0dXJucyB0aGUgc3luY190aW1lbGluZSBvYmplY3Qgb3IgTlVMTCBpbgorICogY2FzZSBvZiBlcnJvci4KKyAqLworc3RydWN0IHN5bmNfdGltZWxpbmUgKnN5bmNfdGltZWxpbmVfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iajsKKworCW9iaiA9IGt6YWxsb2Moc2l6ZW9mKCpvYmopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIE5VTEw7CisKKwlrcmVmX2luaXQoJm9iai0+a3JlZik7CisJb2JqLT5jb250ZXh0ID0gZmVuY2VfY29udGV4dF9hbGxvYygxKTsKKwlzdHJsY3B5KG9iai0+bmFtZSwgbmFtZSwgc2l6ZW9mKG9iai0+bmFtZSkpOworCisJSU5JVF9MSVNUX0hFQUQoJm9iai0+Y2hpbGRfbGlzdF9oZWFkKTsKKwlJTklUX0xJU1RfSEVBRCgmb2JqLT5hY3RpdmVfbGlzdF9oZWFkKTsKKwlzcGluX2xvY2tfaW5pdCgmb2JqLT5jaGlsZF9saXN0X2xvY2spOworCisJc3luY190aW1lbGluZV9kZWJ1Z19hZGQob2JqKTsKKworCXJldHVybiBvYmo7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNfdGltZWxpbmVfZnJlZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqID0KKwkJY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBzeW5jX3RpbWVsaW5lLCBrcmVmKTsKKworCXN5bmNfdGltZWxpbmVfZGVidWdfcmVtb3ZlKG9iaik7CisKKwlrZnJlZShvYmopOworfQorCitzdGF0aWMgdm9pZCBzeW5jX3RpbWVsaW5lX2dldChzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqKQoreworCWtyZWZfZ2V0KCZvYmotPmtyZWYpOworfQorCitzdGF0aWMgdm9pZCBzeW5jX3RpbWVsaW5lX3B1dChzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqKQoreworCWtyZWZfcHV0KCZvYmotPmtyZWYsIHN5bmNfdGltZWxpbmVfZnJlZSk7Cit9CisKKy8qKgorICogc3luY190aW1lbGluZV9zaWduYWwoKSAtIHNpZ25hbCBhIHN0YXR1cyBjaGFuZ2Ugb24gYSBzeW5jX3RpbWVsaW5lCisgKiBAb2JqOglzeW5jX3RpbWVsaW5lIHRvIHNpZ25hbAorICogQGluYzoJbnVtIHRvIGluY3JlbWVudCBvbiB0aW1lbGluZS0+dmFsdWUKKyAqCisgKiBBIHN5bmMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGNhbGwgdGhpcyBhbnkgdGltZSBvbmUgb2YgaXQncyBmZW5jZXMKKyAqIGhhcyBzaWduYWxlZCBvciBoYXMgYW4gZXJyb3IgY29uZGl0aW9uLgorICovCitzdGF0aWMgdm9pZCBzeW5jX3RpbWVsaW5lX3NpZ25hbChzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqLCB1bnNpZ25lZCBpbnQgaW5jKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHN5bmNfcHQgKnB0LCAqbmV4dDsKKworCXRyYWNlX3N5bmNfdGltZWxpbmUob2JqKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvYmotPmNoaWxkX2xpc3RfbG9jaywgZmxhZ3MpOworCisJb2JqLT52YWx1ZSArPSBpbmM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHQsIG5leHQsICZvYmotPmFjdGl2ZV9saXN0X2hlYWQsCisJCQkJIGFjdGl2ZV9saXN0KSB7CisJCWlmIChmZW5jZV9pc19zaWduYWxlZF9sb2NrZWQoJnB0LT5iYXNlKSkKKwkJCWxpc3RfZGVsX2luaXQoJnB0LT5hY3RpdmVfbGlzdCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqLT5jaGlsZF9saXN0X2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBzeW5jX3B0X2NyZWF0ZSgpIC0gY3JlYXRlcyBhIHN5bmMgcHQKKyAqIEBwYXJlbnQ6CWZlbmNlJ3MgcGFyZW50IHN5bmNfdGltZWxpbmUKKyAqIEBzaXplOglzaXplIHRvIGFsbG9jYXRlIGZvciB0aGlzIHB0CisgKiBAaW5jOgl2YWx1ZSBvZiB0aGUgZmVuY2UKKyAqCisgKiBDcmVhdGVzIGEgbmV3IHN5bmNfcHQgYXMgYSBjaGlsZCBvZiBAcGFyZW50LiAgQHNpemUgYnl0ZXMgd2lsbCBiZQorICogYWxsb2NhdGVkIGFsbG93aW5nIGZvciBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBkYXRhIHRvIGJlIGtlcHQgYWZ0ZXIKKyAqIHRoZSBnZW5lcmljIHN5bmNfdGltZWxpbmUgc3RydWN0LiBSZXR1cm5zIHRoZSBzeW5jX3B0IG9iamVjdCBvcgorICogTlVMTCBpbiBjYXNlIG9mIGVycm9yLgorICovCitzdGF0aWMgc3RydWN0IHN5bmNfcHQgKnN5bmNfcHRfY3JlYXRlKHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmosIGludCBzaXplLAorCQkJICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc3luY19wdCAqcHQ7CisKKwlpZiAoc2l6ZSA8IHNpemVvZigqcHQpKQorCQlyZXR1cm4gTlVMTDsKKworCXB0ID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0KQorCQlyZXR1cm4gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvYmotPmNoaWxkX2xpc3RfbG9jaywgZmxhZ3MpOworCXN5bmNfdGltZWxpbmVfZ2V0KG9iaik7CisJZmVuY2VfaW5pdCgmcHQtPmJhc2UsICZ0aW1lbGluZV9mZW5jZV9vcHMsICZvYmotPmNoaWxkX2xpc3RfbG9jaywKKwkJICAgb2JqLT5jb250ZXh0LCB2YWx1ZSk7CisJbGlzdF9hZGRfdGFpbCgmcHQtPmNoaWxkX2xpc3QsICZvYmotPmNoaWxkX2xpc3RfaGVhZCk7CisJSU5JVF9MSVNUX0hFQUQoJnB0LT5hY3RpdmVfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqLT5jaGlsZF9saXN0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcHQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp0aW1lbGluZV9mZW5jZV9nZXRfZHJpdmVyX25hbWUoc3RydWN0IGZlbmNlICpmZW5jZSkKK3sKKwlyZXR1cm4gInN3X3N5bmMiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdGltZWxpbmVfZmVuY2VfZ2V0X3RpbWVsaW5lX25hbWUoc3RydWN0IGZlbmNlICpmZW5jZSkKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKKworCXJldHVybiBwYXJlbnQtPm5hbWU7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVsaW5lX2ZlbmNlX3JlbGVhc2Uoc3RydWN0IGZlbmNlICpmZW5jZSkKK3sKKwlzdHJ1Y3Qgc3luY19wdCAqcHQgPSBmZW5jZV90b19zeW5jX3B0KGZlbmNlKTsKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoZmVuY2UtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmcHQtPmNoaWxkX2xpc3QpOworCWlmICghbGlzdF9lbXB0eSgmcHQtPmFjdGl2ZV9saXN0KSkKKwkJbGlzdF9kZWwoJnB0LT5hY3RpdmVfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShmZW5jZS0+bG9jaywgZmxhZ3MpOworCisJc3luY190aW1lbGluZV9wdXQocGFyZW50KTsKKwlmZW5jZV9mcmVlKGZlbmNlKTsKK30KKworc3RhdGljIGJvb2wgdGltZWxpbmVfZmVuY2Vfc2lnbmFsZWQoc3RydWN0IGZlbmNlICpmZW5jZSkKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKKworCXJldHVybiAoZmVuY2UtPnNlcW5vID4gcGFyZW50LT52YWx1ZSkgPyBmYWxzZSA6IHRydWU7Cit9CisKK3N0YXRpYyBib29sIHRpbWVsaW5lX2ZlbmNlX2VuYWJsZV9zaWduYWxpbmcoc3RydWN0IGZlbmNlICpmZW5jZSkKK3sKKwlzdHJ1Y3Qgc3luY19wdCAqcHQgPSBmZW5jZV90b19zeW5jX3B0KGZlbmNlKTsKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKKworCWlmICh0aW1lbGluZV9mZW5jZV9zaWduYWxlZChmZW5jZSkpCisJCXJldHVybiBmYWxzZTsKKworCWxpc3RfYWRkX3RhaWwoJnB0LT5hY3RpdmVfbGlzdCwgJnBhcmVudC0+YWN0aXZlX2xpc3RfaGVhZCk7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVsaW5lX2ZlbmNlX3ZhbHVlX3N0cihzdHJ1Y3QgZmVuY2UgKmZlbmNlLAorCQkJCSAgICBjaGFyICpzdHIsIGludCBzaXplKQoreworCXNucHJpbnRmKHN0ciwgc2l6ZSwgIiVkIiwgZmVuY2UtPnNlcW5vKTsKK30KKworc3RhdGljIHZvaWQgdGltZWxpbmVfZmVuY2VfdGltZWxpbmVfdmFsdWVfc3RyKHN0cnVjdCBmZW5jZSAqZmVuY2UsCisJCQkJCSAgICAgY2hhciAqc3RyLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKKworCXNucHJpbnRmKHN0ciwgc2l6ZSwgIiVkIiwgcGFyZW50LT52YWx1ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmVuY2Vfb3BzIHRpbWVsaW5lX2ZlbmNlX29wcyA9IHsKKwkuZ2V0X2RyaXZlcl9uYW1lID0gdGltZWxpbmVfZmVuY2VfZ2V0X2RyaXZlcl9uYW1lLAorCS5nZXRfdGltZWxpbmVfbmFtZSA9IHRpbWVsaW5lX2ZlbmNlX2dldF90aW1lbGluZV9uYW1lLAorCS5lbmFibGVfc2lnbmFsaW5nID0gdGltZWxpbmVfZmVuY2VfZW5hYmxlX3NpZ25hbGluZywKKwkuc2lnbmFsZWQgPSB0aW1lbGluZV9mZW5jZV9zaWduYWxlZCwKKwkud2FpdCA9IGZlbmNlX2RlZmF1bHRfd2FpdCwKKwkucmVsZWFzZSA9IHRpbWVsaW5lX2ZlbmNlX3JlbGVhc2UsCisJLmZlbmNlX3ZhbHVlX3N0ciA9IHRpbWVsaW5lX2ZlbmNlX3ZhbHVlX3N0ciwKKwkudGltZWxpbmVfdmFsdWVfc3RyID0gdGltZWxpbmVfZmVuY2VfdGltZWxpbmVfdmFsdWVfc3RyLAorfTsKKworLyoKKyAqICpXQVJOSU5HKgorICoKKyAqIGltcHJvcGVyIHVzZSBvZiB0aGlzIGNhbiByZXN1bHQgaW4gZGVhZGxvY2tpbmcga2VybmVsIGRyaXZlcnMgZnJvbSB1c2Vyc3BhY2UuCisgKi8KKworLyogb3BlbmluZyBzd19zeW5jIGNyZWF0ZSBhIG5ldyBzeW5jIG9iaiAqLworc3RhdGljIGludCBzd19zeW5jX2RlYnVnZnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqOworCWNoYXIgdGFza19jb21tW1RBU0tfQ09NTV9MRU5dOworCisJZ2V0X3Rhc2tfY29tbSh0YXNrX2NvbW0sIGN1cnJlbnQpOworCisJb2JqID0gc3luY190aW1lbGluZV9jcmVhdGUodGFza19jb21tKTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBvYmo7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzd19zeW5jX2RlYnVnZnNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJc21wX3dtYigpOworCisJc3luY190aW1lbGluZV9wdXQob2JqKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgc3dfc3luY19pb2N0bF9jcmVhdGVfZmVuY2Uoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGZkID0gZ2V0X3VudXNlZF9mZF9mbGFncyhPX0NMT0VYRUMpOworCWludCBlcnI7CisJc3RydWN0IHN5bmNfcHQgKnB0OworCXN0cnVjdCBzeW5jX2ZpbGUgKnN5bmNfZmlsZTsKKwlzdHJ1Y3Qgc3dfc3luY19jcmVhdGVfZmVuY2VfZGF0YSBkYXRhOworCisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihkYXRhKSkpIHsKKwkJZXJyID0gLUVGQVVMVDsKKwkJZ290byBlcnI7CisJfQorCisJcHQgPSBzeW5jX3B0X2NyZWF0ZShvYmosIHNpemVvZigqcHQpLCBkYXRhLnZhbHVlKTsKKwlpZiAoIXB0KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCXN5bmNfZmlsZSA9IHN5bmNfZmlsZV9jcmVhdGUoJnB0LT5iYXNlKTsKKwlpZiAoIXN5bmNfZmlsZSkgeworCQlmZW5jZV9wdXQoJnB0LT5iYXNlKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJZGF0YS5mZW5jZSA9IGZkOworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKSkgeworCQlmcHV0KHN5bmNfZmlsZS0+ZmlsZSk7CisJCWVyciA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyOworCX0KKworCWZkX2luc3RhbGwoZmQsIHN5bmNfZmlsZS0+ZmlsZSk7CisKKwlyZXR1cm4gMDsKKworZXJyOgorCXB1dF91bnVzZWRfZmQoZmQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBsb25nIHN3X3N5bmNfaW9jdGxfaW5jKHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmosIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXUzMiB2YWx1ZTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsdWUsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHZhbHVlKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3luY190aW1lbGluZV9zaWduYWwob2JqLCB2YWx1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgc3dfc3luY19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTV19TWU5DX0lPQ19DUkVBVEVfRkVOQ0U6CisJCXJldHVybiBzd19zeW5jX2lvY3RsX2NyZWF0ZV9mZW5jZShvYmosIGFyZyk7CisKKwljYXNlIFNXX1NZTkNfSU9DX0lOQzoKKwkJcmV0dXJuIHN3X3N5bmNfaW9jdGxfaW5jKG9iaiwgYXJnKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KK30KKworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzd19zeW5jX2RlYnVnZnNfZm9wcyA9IHsKKwkub3BlbiAgICAgICAgICAgPSBzd19zeW5jX2RlYnVnZnNfb3BlbiwKKwkucmVsZWFzZSAgICAgICAgPSBzd19zeW5jX2RlYnVnZnNfcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBzd19zeW5jX2lvY3RsLAorCS5jb21wYXRfaW9jdGwJPSBzd19zeW5jX2lvY3RsLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hLWJ1Zi9zeW5jX2RlYnVnLmMgYi9kcml2ZXJzL2RtYS1idWYvc3luY19kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYjk1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS1idWYvc3luY19kZWJ1Zy5jCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogU3luYyBGaWxlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGFuZCBkZWJ1ZyBpbmZvcm1hdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgInN5bmNfZGVidWcuaCIKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRiZ2ZzOworCitzdGF0aWMgTElTVF9IRUFEKHN5bmNfdGltZWxpbmVfbGlzdF9oZWFkKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3luY190aW1lbGluZV9saXN0X2xvY2spOworc3RhdGljIExJU1RfSEVBRChzeW5jX2ZpbGVfbGlzdF9oZWFkKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3luY19maWxlX2xpc3RfbG9jayk7CisKK3ZvaWQgc3luY190aW1lbGluZV9kZWJ1Z19hZGQoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN5bmNfdGltZWxpbmVfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmb2JqLT5zeW5jX3RpbWVsaW5lX2xpc3QsICZzeW5jX3RpbWVsaW5lX2xpc3RfaGVhZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luY190aW1lbGluZV9saXN0X2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBzeW5jX3RpbWVsaW5lX2RlYnVnX3JlbW92ZShzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3luY190aW1lbGluZV9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmb2JqLT5zeW5jX3RpbWVsaW5lX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bmNfdGltZWxpbmVfbGlzdF9sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgc3luY19maWxlX2RlYnVnX2FkZChzdHJ1Y3Qgc3luY19maWxlICpzeW5jX2ZpbGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzeW5jX2ZpbGVfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmc3luY19maWxlLT5zeW5jX2ZpbGVfbGlzdCwgJnN5bmNfZmlsZV9saXN0X2hlYWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bmNfZmlsZV9saXN0X2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBzeW5jX2ZpbGVfZGVidWdfcmVtb3ZlKHN0cnVjdCBzeW5jX2ZpbGUgKnN5bmNfZmlsZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN5bmNfZmlsZV9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmc3luY19maWxlLT5zeW5jX2ZpbGVfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luY19maWxlX2xpc3RfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc3luY19zdGF0dXNfc3RyKGludCBzdGF0dXMpCit7CisJaWYgKHN0YXR1cyA9PSAwKQorCQlyZXR1cm4gInNpZ25hbGVkIjsKKworCWlmIChzdGF0dXMgPiAwKQorCQlyZXR1cm4gImFjdGl2ZSI7CisKKwlyZXR1cm4gImVycm9yIjsKK30KKworc3RhdGljIHZvaWQgc3luY19wcmludF9mZW5jZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCBmZW5jZSAqZmVuY2UsIGJvb2wgc2hvdykKK3sKKwlpbnQgc3RhdHVzID0gMTsKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKKworCWlmIChmZW5jZV9pc19zaWduYWxlZF9sb2NrZWQoZmVuY2UpKQorCQlzdGF0dXMgPSBmZW5jZS0+c3RhdHVzOworCisJc2VxX3ByaW50ZihzLCAiICAlcyVzZmVuY2UgJXMiLAorCQkgICBzaG93ID8gcGFyZW50LT5uYW1lIDogIiIsCisJCSAgIHNob3cgPyAiXyIgOiAiIiwKKwkJICAgc3luY19zdGF0dXNfc3RyKHN0YXR1cykpOworCisJaWYgKHN0YXR1cyA8PSAwKSB7CisJCXN0cnVjdCB0aW1lc3BlYzY0IHRzNjQgPQorCQkJa3RpbWVfdG9fdGltZXNwZWM2NChmZW5jZS0+dGltZXN0YW1wKTsKKworCQlzZXFfcHJpbnRmKHMsICJAJWxsZC4lMDlsZCIsIChzNjQpdHM2NC50dl9zZWMsIHRzNjQudHZfbnNlYyk7CisJfQorCisJaWYgKGZlbmNlLT5vcHMtPnRpbWVsaW5lX3ZhbHVlX3N0ciAmJgorCQlmZW5jZS0+b3BzLT5mZW5jZV92YWx1ZV9zdHIpIHsKKwkJY2hhciB2YWx1ZVs2NF07CisJCWJvb2wgc3VjY2VzczsKKworCQlmZW5jZS0+b3BzLT5mZW5jZV92YWx1ZV9zdHIoZmVuY2UsIHZhbHVlLCBzaXplb2YodmFsdWUpKTsKKwkJc3VjY2VzcyA9IHN0cmxlbih2YWx1ZSk7CisKKwkJaWYgKHN1Y2Nlc3MpIHsKKwkJCXNlcV9wcmludGYocywgIjogJXMiLCB2YWx1ZSk7CisKKwkJCWZlbmNlLT5vcHMtPnRpbWVsaW5lX3ZhbHVlX3N0cihmZW5jZSwgdmFsdWUsCisJCQkJCQkgICAgICAgc2l6ZW9mKHZhbHVlKSk7CisKKwkJCWlmIChzdHJsZW4odmFsdWUpKQorCQkJCXNlcV9wcmludGYocywgIiAvICVzIiwgdmFsdWUpOworCQl9CisJfQorCisJc2VxX3B1dHMocywgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNfcHJpbnRfb2JqKHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNlcV9wcmludGYocywgIiVzOiAlZFxuIiwgb2JqLT5uYW1lLCBvYmotPnZhbHVlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvYmotPmNoaWxkX2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2gocG9zLCAmb2JqLT5jaGlsZF9saXN0X2hlYWQpIHsKKwkJc3RydWN0IHN5bmNfcHQgKnB0ID0KKwkJCWNvbnRhaW5lcl9vZihwb3MsIHN0cnVjdCBzeW5jX3B0LCBjaGlsZF9saXN0KTsKKwkJc3luY19wcmludF9mZW5jZShzLCAmcHQtPmJhc2UsIGZhbHNlKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqLT5jaGlsZF9saXN0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc3luY19wcmludF9zeW5jX2ZpbGUoc3RydWN0IHNlcV9maWxlICpzLAorCQkJCSAgc3RydWN0IHN5bmNfZmlsZSAqc3luY19maWxlKQoreworCWludCBpOworCisJc2VxX3ByaW50ZihzLCAiWyVwXSAlczogJXNcbiIsIHN5bmNfZmlsZSwgc3luY19maWxlLT5uYW1lLAorCQkgICBzeW5jX3N0YXR1c19zdHIoYXRvbWljX3JlYWQoJnN5bmNfZmlsZS0+c3RhdHVzKSkpOworCisJZm9yIChpID0gMDsgaSA8IHN5bmNfZmlsZS0+bnVtX2ZlbmNlczsgKytpKQorCQlzeW5jX3ByaW50X2ZlbmNlKHMsIHN5bmNfZmlsZS0+Y2JzW2ldLmZlbmNlLCB0cnVlKTsKK30KKworc3RhdGljIGludCBzeW5jX2RlYnVnZnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnVudXNlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKworCXNlcV9wdXRzKHMsICJvYmpzOlxuLS0tLS0tLS0tLS0tLS1cbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN5bmNfdGltZWxpbmVfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaChwb3MsICZzeW5jX3RpbWVsaW5lX2xpc3RfaGVhZCkgeworCQlzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqID0KKwkJCWNvbnRhaW5lcl9vZihwb3MsIHN0cnVjdCBzeW5jX3RpbWVsaW5lLAorCQkJCSAgICAgc3luY190aW1lbGluZV9saXN0KTsKKworCQlzeW5jX3ByaW50X29iaihzLCBvYmopOworCQlzZXFfcHV0cyhzLCAiXG4iKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luY190aW1lbGluZV9saXN0X2xvY2ssIGZsYWdzKTsKKworCXNlcV9wdXRzKHMsICJmZW5jZXM6XG4tLS0tLS0tLS0tLS0tLVxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3luY19maWxlX2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2gocG9zLCAmc3luY19maWxlX2xpc3RfaGVhZCkgeworCQlzdHJ1Y3Qgc3luY19maWxlICpzeW5jX2ZpbGUgPQorCQkJY29udGFpbmVyX29mKHBvcywgc3RydWN0IHN5bmNfZmlsZSwgc3luY19maWxlX2xpc3QpOworCisJCXN5bmNfcHJpbnRfc3luY19maWxlKHMsIHN5bmNfZmlsZSk7CisJCXNlcV9wdXRzKHMsICJcbiIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW5jX2ZpbGVfbGlzdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3luY19pbmZvX2RlYnVnZnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc3luY19kZWJ1Z2ZzX3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzeW5jX2luZm9fZGVidWdmc19mb3BzID0geworCS5vcGVuICAgICAgICAgICA9IHN5bmNfaW5mb19kZWJ1Z2ZzX29wZW4sCisJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlICAgICAgICA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgc3luY19kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwlkYmdmcyA9IGRlYnVnZnNfY3JlYXRlX2Rpcigic3luYyIsIE5VTEwpOworCisJLyoKKwkgKiBUaGUgZGVidWdmcyBmaWxlcyB3b24ndCBldmVyIGdldCByZW1vdmVkIGFuZCB0aHVzLCB0aGVyZSBpcworCSAqIG5vIG5lZWQgdG8gcHJvdGVjdCBpdCBhZ2FpbnN0IHJlbW92YWwgcmFjZXMuIFRoZSB1c2Ugb2YKKwkgKiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlX3Vuc2FmZSgpIGlzIGFjdHVhbGx5IHNhZmUgaGVyZS4KKwkgKi8KKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlX3Vuc2FmZSgiaW5mbyIsIDA0NDQsIGRiZ2ZzLCBOVUxMLAorCQkJCSAgICZzeW5jX2luZm9fZGVidWdmc19mb3BzKTsKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlX3Vuc2FmZSgic3dfc3luYyIsIDA2NDQsIGRiZ2ZzLCBOVUxMLAorCQkJCSAgICZzd19zeW5jX2RlYnVnZnNfZm9wcyk7CisKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwoc3luY19kZWJ1Z2ZzX2luaXQpOworCisjZGVmaW5lIERVTVBfQ0hVTksgMjU2CitzdGF0aWMgY2hhciBzeW5jX2R1bXBfYnVmWzY0ICogMTAyNF07Cit2b2lkIHN5bmNfZHVtcCh2b2lkKQoreworCXN0cnVjdCBzZXFfZmlsZSBzID0geworCQkuYnVmID0gc3luY19kdW1wX2J1ZiwKKwkJLnNpemUgPSBzaXplb2Yoc3luY19kdW1wX2J1ZikgLSAxLAorCX07CisJaW50IGk7CisKKwlzeW5jX2RlYnVnZnNfc2hvdygmcywgTlVMTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcy5jb3VudDsgaSArPSBEVU1QX0NIVU5LKSB7CisJCWlmICgocy5jb3VudCAtIGkpID4gRFVNUF9DSFVOSykgeworCQkJY2hhciBjID0gcy5idWZbaSArIERVTVBfQ0hVTktdOworCisJCQlzLmJ1ZltpICsgRFVNUF9DSFVOS10gPSAwOworCQkJcHJfY29udCgiJXMiLCBzLmJ1ZiArIGkpOworCQkJcy5idWZbaSArIERVTVBfQ0hVTktdID0gYzsKKwkJfSBlbHNlIHsKKwkJCXMuYnVmW3MuY291bnRdID0gMDsKKwkJCXByX2NvbnQoIiVzIiwgcy5idWYgKyBpKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hLWJ1Zi9zeW5jX2RlYnVnLmggYi9kcml2ZXJzL2RtYS1idWYvc3luY19kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNjlhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS1idWYvc3luY19kZWJ1Zy5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBTeW5jIEZpbGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgYW5kIGRlYnVnIGluZm9tYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfU1lOQ19ICisjZGVmaW5lIF9MSU5VWF9TWU5DX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZlbmNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zeW5jX2ZpbGUuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3N5bmNfZmlsZS5oPgorCisvKioKKyAqIHN0cnVjdCBzeW5jX3RpbWVsaW5lIC0gc3luYyBvYmplY3QKKyAqIEBrcmVmOgkJcmVmZXJlbmNlIGNvdW50IG9uIGZlbmNlLgorICogQG5hbWU6CQluYW1lIG9mIHRoZSBzeW5jX3RpbWVsaW5lLiBVc2VmdWwgZm9yIGRlYnVnZ2luZworICogQGNoaWxkX2xpc3RfaGVhZDoJbGlzdCBvZiBjaGlsZHJlbiBzeW5jX3B0cyBmb3IgdGhpcyBzeW5jX3RpbWVsaW5lCisgKiBAY2hpbGRfbGlzdF9sb2NrOglsb2NrIHByb3RlY3RpbmcgQGNoaWxkX2xpc3RfaGVhZCBhbmQgZmVuY2Uuc3RhdHVzCisgKiBAYWN0aXZlX2xpc3RfaGVhZDoJbGlzdCBvZiBhY3RpdmUgKHVuc2lnbmFsZWQvZXJyb3JlZCkgc3luY19wdHMKKyAqIEBzeW5jX3RpbWVsaW5lX2xpc3Q6CW1lbWJlcnNoaXAgaW4gZ2xvYmFsIHN5bmNfdGltZWxpbmVfbGlzdAorICovCitzdHJ1Y3Qgc3luY190aW1lbGluZSB7CisJc3RydWN0IGtyZWYJCWtyZWY7CisJY2hhcgkJCW5hbWVbMzJdOworCisJLyogcHJvdGVjdGVkIGJ5IGNoaWxkX2xpc3RfbG9jayAqLworCXU2NAkJCWNvbnRleHQ7CisJaW50CQkJdmFsdWU7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCWNoaWxkX2xpc3RfaGVhZDsKKwlzcGlubG9ja190CQljaGlsZF9saXN0X2xvY2s7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCWFjdGl2ZV9saXN0X2hlYWQ7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCXN5bmNfdGltZWxpbmVfbGlzdDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN5bmNfdGltZWxpbmUgKmZlbmNlX3BhcmVudChzdHJ1Y3QgZmVuY2UgKmZlbmNlKQoreworCXJldHVybiBjb250YWluZXJfb2YoZmVuY2UtPmxvY2ssIHN0cnVjdCBzeW5jX3RpbWVsaW5lLAorCQkJICAgIGNoaWxkX2xpc3RfbG9jayk7Cit9CisKKy8qKgorICogc3RydWN0IHN5bmNfcHQgLSBzeW5jX3B0IG9iamVjdAorICogQGJhc2U6IGJhc2UgZmVuY2Ugb2JqZWN0CisgKiBAY2hpbGRfbGlzdDogc3luYyB0aW1lbGluZSBjaGlsZCdzIGxpc3QKKyAqIEBhY3RpdmVfbGlzdDogc3luYyB0aW1lbGluZSBhY3RpdmUgY2hpbGQncyBsaXN0CisgKi8KK3N0cnVjdCBzeW5jX3B0IHsKKwlzdHJ1Y3QgZmVuY2UgYmFzZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNoaWxkX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBhY3RpdmVfbGlzdDsKK307CisKKyNpZmRlZiBDT05GSUdfU1dfU1lOQworCitleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzd19zeW5jX2RlYnVnZnNfZm9wczsKKwordm9pZCBzeW5jX3RpbWVsaW5lX2RlYnVnX2FkZChzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqKTsKK3ZvaWQgc3luY190aW1lbGluZV9kZWJ1Z19yZW1vdmUoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaik7Cit2b2lkIHN5bmNfZmlsZV9kZWJ1Z19hZGQoc3RydWN0IHN5bmNfZmlsZSAqZmVuY2UpOwordm9pZCBzeW5jX2ZpbGVfZGVidWdfcmVtb3ZlKHN0cnVjdCBzeW5jX2ZpbGUgKmZlbmNlKTsKK3ZvaWQgc3luY19kdW1wKHZvaWQpOworCisjZWxzZQorIyBkZWZpbmUgc3luY190aW1lbGluZV9kZWJ1Z19hZGQob2JqKQorIyBkZWZpbmUgc3luY190aW1lbGluZV9kZWJ1Z19yZW1vdmUob2JqKQorIyBkZWZpbmUgc3luY19maWxlX2RlYnVnX2FkZChmZW5jZSkKKyMgZGVmaW5lIHN5bmNfZmlsZV9kZWJ1Z19yZW1vdmUoZmVuY2UpCisjIGRlZmluZSBzeW5jX2R1bXAoKQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTElOVVhfU1lOQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS1idWYvc3luY190cmFjZS5oIGIvZHJpdmVycy9kbWEtYnVmL3N5bmNfdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTNkNTlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kbWEtYnVmL3N5bmNfdHJhY2UuaApAQCAtMCwwICsxLDMyIEBACisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfUEFUSCAuLi8uLi9kcml2ZXJzL2RtYS1idWYKKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIHN5bmNfdHJhY2UKKworI2lmICFkZWZpbmVkKF9UUkFDRV9TWU5DX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9UUkFDRV9TWU5DX0gKKworI2luY2x1ZGUgInN5bmNfZGVidWcuaCIKKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKK1RSQUNFX0VWRU5UKHN5bmNfdGltZWxpbmUsCisJVFBfUFJPVE8oc3RydWN0IHN5bmNfdGltZWxpbmUgKnRpbWVsaW5lKSwKKworCVRQX0FSR1ModGltZWxpbmUpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJCV9fc3RyaW5nKG5hbWUsIHRpbWVsaW5lLT5uYW1lKQorCQkJX19maWVsZCh1MzIsIHZhbHVlKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJCV9fYXNzaWduX3N0cihuYW1lLCB0aW1lbGluZS0+bmFtZSk7CisJCQlfX2VudHJ5LT52YWx1ZSA9IHRpbWVsaW5lLT52YWx1ZTsKKwkpLAorCisJVFBfcHJpbnRrKCJuYW1lPSVzIHZhbHVlPSVkIiwgX19nZXRfc3RyKG5hbWUpLCBfX2VudHJ5LT52YWx1ZSkKKyk7CisKKyNlbmRpZiAvKiBpZiAhZGVmaW5lZChfVFJBQ0VfU1lOQ19IKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKSAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2F0X3hkbWFjLmMgYi9kcml2ZXJzL2RtYS9hdF94ZG1hYy5jCmluZGV4IGU0MzRmZmUuLjgzMmNiZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2F0X3hkbWFjLmMKKysrIGIvZHJpdmVycy9kbWEvYXRfeGRtYWMuYwpAQCAtMjA2Nyw3ICsyMDY3LDcgQEAKIGVycl9jbGtfZGlzYWJsZToKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoYXR4ZG1hYy0+Y2xrKTsKIGVycl9mcmVlX2lycToKLQlmcmVlX2lycShhdHhkbWFjLT5pcnEsIGF0eGRtYWMtPmRtYS5kZXYpOworCWZyZWVfaXJxKGF0eGRtYWMtPmlycSwgYXR4ZG1hYyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjA4MSw3ICsyMDgxLDcgQEAKIAlkbWFfYXN5bmNfZGV2aWNlX3VucmVnaXN0ZXIoJmF0eGRtYWMtPmRtYSk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGF0eGRtYWMtPmNsayk7CiAKLQlmcmVlX2lycShhdHhkbWFjLT5pcnEsIGF0eGRtYWMtPmRtYS5kZXYpOworCWZyZWVfaXJxKGF0eGRtYWMtPmlycSwgYXR4ZG1hYyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYXR4ZG1hYy0+ZG1hLmNoYW5jbnQ7IGkrKykgewogCQlzdHJ1Y3QgYXRfeGRtYWNfY2hhbiAqYXRjaGFuID0gJmF0eGRtYWMtPmNoYW5baV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9kdy9jb3JlLmMgYi9kcml2ZXJzL2RtYS9kdy9jb3JlLmMKaW5kZXggZWRmMDUzZi4uZGExOGIxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZHcvY29yZS5jCisrKyBiL2RyaXZlcnMvZG1hL2R3L2NvcmUuYwpAQCAtNDYsOSArNDYsOSBAQAogCQl1OCBfZG1zaXplID0gX2lzX3NsYXZlID8gX3Njb25maWctPmRzdF9tYXhidXJzdCA6CVwKIAkJCURXX0RNQV9NU0laRV8xNjsJCQlcCiAJCXU4IF9kbXMgPSAoX2R3Yy0+ZGlyZWN0aW9uID09IERNQV9NRU1fVE9fREVWKSA/CQlcCi0JCQlfZHdjLT5wX21hc3RlciA6IF9kd2MtPm1fbWFzdGVyOwkJXAorCQkJX2R3Yy0+ZHdzLnBfbWFzdGVyIDogX2R3Yy0+ZHdzLm1fbWFzdGVyOwlcCiAJCXU4IF9zbXMgPSAoX2R3Yy0+ZGlyZWN0aW9uID09IERNQV9ERVZfVE9fTUVNKSA/CQlcCi0JCQlfZHdjLT5wX21hc3RlciA6IF9kd2MtPm1fbWFzdGVyOwkJXAorCQkJX2R3Yy0+ZHdzLnBfbWFzdGVyIDogX2R3Yy0+ZHdzLm1fbWFzdGVyOwlcCiAJCQkJCQkJCVwKIAkJKERXQ19DVExMX0RTVF9NU0laRShfZG1zaXplKQkJCVwKIAkJIHwgRFdDX0NUTExfU1JDX01TSVpFKF9zbXNpemUpCQkJXApAQCAtMTQzLDEyICsxNDMsMTYgQEAKIAlzdHJ1Y3QgZHdfZG1hICpkdyA9IHRvX2R3X2RtYShkd2MtPmNoYW4uZGV2aWNlKTsKIAl1MzIgY2ZnaGkgPSBEV0NfQ0ZHSF9GSUZPX01PREU7CiAJdTMyIGNmZ2xvID0gRFdDX0NGR0xfQ0hfUFJJT1IoZHdjLT5wcmlvcml0eSk7CisJYm9vbCBoc19wb2xhcml0eSA9IGR3Yy0+ZHdzLmhzX3BvbGFyaXR5OwogCiAJaWYgKHRlc3RfYml0KERXX0RNQV9JU19JTklUSUFMSVpFRCwgJmR3Yy0+ZmxhZ3MpKQogCQlyZXR1cm47CiAKLQljZmdoaSB8PSBEV0NfQ0ZHSF9EU1RfUEVSKGR3Yy0+ZHN0X2lkKTsKLQljZmdoaSB8PSBEV0NfQ0ZHSF9TUkNfUEVSKGR3Yy0+c3JjX2lkKTsKKwljZmdoaSB8PSBEV0NfQ0ZHSF9EU1RfUEVSKGR3Yy0+ZHdzLmRzdF9pZCk7CisJY2ZnaGkgfD0gRFdDX0NGR0hfU1JDX1BFUihkd2MtPmR3cy5zcmNfaWQpOworCisJLyogU2V0IHBvbGFyaXR5IG9mIGhhbmRzaGFrZSBpbnRlcmZhY2UgKi8KKwljZmdsbyB8PSBoc19wb2xhcml0eSA/IERXQ19DRkdMX0hTX0RTVF9QT0wgfCBEV0NfQ0ZHTF9IU19TUkNfUE9MIDogMDsKIAogCWNoYW5uZWxfd3JpdGVsKGR3YywgQ0ZHX0xPLCBjZmdsbyk7CiAJY2hhbm5lbF93cml0ZWwoZHdjLCBDRkdfSEksIGNmZ2hpKTsKQEAgLTIwOSw3ICsyMTMsNyBAQAogc3RhdGljIHZvaWQgZHdjX2Rvc3RhcnQoc3RydWN0IGR3X2RtYV9jaGFuICpkd2MsIHN0cnVjdCBkd19kZXNjICpmaXJzdCkKIHsKIAlzdHJ1Y3QgZHdfZG1hCSpkdyA9IHRvX2R3X2RtYShkd2MtPmNoYW4uZGV2aWNlKTsKLQl1OAkJbG1zID0gRFdDX0xMUF9MTVMoZHdjLT5tX21hc3Rlcik7CisJdTgJCWxtcyA9IERXQ19MTFBfTE1TKGR3Yy0+ZHdzLm1fbWFzdGVyKTsKIAl1bnNpZ25lZCBsb25nCXdhc19zb2Z0X2xscDsKIAogCS8qIEFTU0VSVDogIGNoYW5uZWwgaXMgaWRsZSAqLwpAQCAtNjYyLDcgKzY2Niw3IEBACiAJc3RydWN0IGR3X2Rlc2MJCSpwcmV2OwogCXNpemVfdAkJCXhmZXJfY291bnQ7CiAJc2l6ZV90CQkJb2Zmc2V0OwotCXU4CQkJbV9tYXN0ZXIgPSBkd2MtPm1fbWFzdGVyOworCXU4CQkJbV9tYXN0ZXIgPSBkd2MtPmR3cy5tX21hc3RlcjsKIAl1bnNpZ25lZCBpbnQJCXNyY193aWR0aDsKIAl1bnNpZ25lZCBpbnQJCWRzdF93aWR0aDsKIAl1bnNpZ25lZCBpbnQJCWRhdGFfd2lkdGggPSBkdy0+cGRhdGEtPmRhdGFfd2lkdGhbbV9tYXN0ZXJdOwpAQCAtNzQwLDcgKzc0NCw3IEBACiAJc3RydWN0IGR3X2Rlc2MJCSpwcmV2OwogCXN0cnVjdCBkd19kZXNjCQkqZmlyc3Q7CiAJdTMyCQkJY3RsbG87Ci0JdTgJCQltX21hc3RlciA9IGR3Yy0+bV9tYXN0ZXI7CisJdTgJCQltX21hc3RlciA9IGR3Yy0+ZHdzLm1fbWFzdGVyOwogCXU4CQkJbG1zID0gRFdDX0xMUF9MTVMobV9tYXN0ZXIpOwogCWRtYV9hZGRyX3QJCXJlZzsKIAl1bnNpZ25lZCBpbnQJCXJlZ193aWR0aDsKQEAgLTg5NSwxMiArODk5LDcgQEAKIAkJcmV0dXJuIGZhbHNlOwogCiAJLyogV2UgaGF2ZSB0byBjb3B5IGRhdGEgc2luY2UgZHdzIGNhbiBiZSB0ZW1wb3Jhcnkgc3RvcmFnZSAqLwotCi0JZHdjLT5zcmNfaWQgPSBkd3MtPnNyY19pZDsKLQlkd2MtPmRzdF9pZCA9IGR3cy0+ZHN0X2lkOwotCi0JZHdjLT5tX21hc3RlciA9IGR3cy0+bV9tYXN0ZXI7Ci0JZHdjLT5wX21hc3RlciA9IGR3cy0+cF9tYXN0ZXI7CisJbWVtY3B5KCZkd2MtPmR3cywgZHdzLCBzaXplb2Yoc3RydWN0IGR3X2RtYV9zbGF2ZSkpOwogCiAJcmV0dXJuIHRydWU7CiB9CkBAIC0xMTY3LDExICsxMTY2LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZHdjLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBDbGVhciBjdXN0b20gY2hhbm5lbCBjb25maWd1cmF0aW9uICovCi0JZHdjLT5zcmNfaWQgPSAwOwotCWR3Yy0+ZHN0X2lkID0gMDsKLQotCWR3Yy0+bV9tYXN0ZXIgPSAwOwotCWR3Yy0+cF9tYXN0ZXIgPSAwOworCW1lbXNldCgmZHdjLT5kd3MsIDAsIHNpemVvZihzdHJ1Y3QgZHdfZG1hX3NsYXZlKSk7CiAKIAljbGVhcl9iaXQoRFdfRE1BX0lTX0lOSVRJQUxJWkVELCAmZHdjLT5mbGFncyk7CiAKQEAgLTEyNjQsNyArMTI1OSw3IEBACiAJc3RydWN0IGR3X2N5Y2xpY19kZXNjCQkqcmV0dmFsID0gTlVMTDsKIAlzdHJ1Y3QgZHdfZGVzYwkJCSpkZXNjOwogCXN0cnVjdCBkd19kZXNjCQkJKmxhc3QgPSBOVUxMOwotCXU4CQkJCWxtcyA9IERXQ19MTFBfTE1TKGR3Yy0+bV9tYXN0ZXIpOworCXU4CQkJCWxtcyA9IERXQ19MTFBfTE1TKGR3Yy0+ZHdzLm1fbWFzdGVyKTsKIAl1bnNpZ25lZCBsb25nCQkJd2FzX2N5Y2xpYzsKIAl1bnNpZ25lZCBpbnQJCQlyZWdfd2lkdGg7CiAJdW5zaWduZWQgaW50CQkJcGVyaW9kczsKQEAgLTE1NzYsMTEgKzE1NzEsNyBAQAogCQkJCShkd2NfcGFyYW1zID4+IERXQ19QQVJBTVNfTUJMS19FTiAmIDB4MSkgPT0gMDsKIAkJfSBlbHNlIHsKIAkJCWR3Yy0+YmxvY2tfc2l6ZSA9IHBkYXRhLT5ibG9ja19zaXplOwotCi0JCQkvKiBDaGVjayBpZiBjaGFubmVsIHN1cHBvcnRzIG11bHRpIGJsb2NrIHRyYW5zZmVyICovCi0JCQljaGFubmVsX3dyaXRlbChkd2MsIExMUCwgRFdDX0xMUF9MT0MoMHhmZmZmZmZmZikpOwotCQkJZHdjLT5ub2xscCA9IERXQ19MTFBfTE9DKGNoYW5uZWxfcmVhZGwoZHdjLCBMTFApKSA9PSAwOwotCQkJY2hhbm5lbF93cml0ZWwoZHdjLCBMTFAsIDApOworCQkJZHdjLT5ub2xscCA9IHBkYXRhLT5pc19ub2xscDsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZHcvcmVncy5oIGIvZHJpdmVycy9kbWEvZHcvcmVncy5oCmluZGV4IDRiN2JkNzguLmY2NWRkMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2R3L3JlZ3MuaAorKysgYi9kcml2ZXJzL2RtYS9kdy9yZWdzLmgKQEAgLTI0NSwxMCArMjQ1LDcgQEAKIAlib29sCQkJbm9sbHA7CiAKIAkvKiBjdXN0b20gc2xhdmUgY29uZmlndXJhdGlvbiAqLwotCXU4CQkJc3JjX2lkOwotCXU4CQkJZHN0X2lkOwotCXU4CQkJbV9tYXN0ZXI7Ci0JdTgJCQlwX21hc3RlcjsKKwlzdHJ1Y3QgZHdfZG1hX3NsYXZlCWR3czsKIAogCS8qIGNvbmZpZ3VyYXRpb24gcGFzc2VkIHZpYSAuZGV2aWNlX2NvbmZpZyAqLwogCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGRtYV9zY29uZmlnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZnNsX3JhaWQuYyBiL2RyaXZlcnMvZG1hL2ZzbF9yYWlkLmMKaW5kZXggYWFkMTY3ZS4uZGUyYTJhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZnNsX3JhaWQuYworKysgYi9kcml2ZXJzL2RtYS9mc2xfcmFpZC5jCkBAIC04MzYsNiArODM2LDcgQEAKIAkJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJlZyIsICZvZmYpOwogCQlpZiAocmMpIHsKIAkJCWRldl9lcnIoZGV2LCAiUmVnIHByb3BlcnR5IG5vdCBmb3VuZCBpbiBKUSBub2RlXG4iKTsKKwkJCW9mX25vZGVfcHV0KG5wKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJCS8qIEZpbmQgb3V0IHRoZSBKb2IgUmluZ3MgcHJlc2VudCB1bmRlciBlYWNoIEpRICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9oc3UvaHN1LmMgYi9kcml2ZXJzL2RtYS9oc3UvaHN1LmMKaW5kZXggYzVmMjFlZi4uMjlkMDRjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaHN1L2hzdS5jCisrKyBiL2RyaXZlcnMvZG1hL2hzdS9oc3UuYwpAQCAtMjAwLDEwICsyMDAsOSBAQAogICogICAgICBpcyBub3QgYSBub3JtYWwgdGltZW91dCBpbnRlcnJ1cHQsIGllLiBoc3VfZG1hX2dldF9zdGF0dXMoKSByZXR1cm5lZCAwLgogICoKICAqICAgICAgUmV0dXJuOgotICogICAgICBJUlFfTk9ORSBmb3IgaW52YWxpZCBjaGFubmVsIG51bWJlciwgSVJRX0hBTkRMRUQgb3RoZXJ3aXNlLgorICogICAgICAwIGZvciBpbnZhbGlkIGNoYW5uZWwgbnVtYmVyLCAxIG90aGVyd2lzZS4KICAqLwotaXJxcmV0dXJuX3QgaHN1X2RtYV9kb19pcnEoc3RydWN0IGhzdV9kbWFfY2hpcCAqY2hpcCwgdW5zaWduZWQgc2hvcnQgbnIsCi0JCQkgICB1MzIgc3RhdHVzKQoraW50IGhzdV9kbWFfZG9faXJxKHN0cnVjdCBoc3VfZG1hX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHNob3J0IG5yLCB1MzIgc3RhdHVzKQogewogCXN0cnVjdCBoc3VfZG1hX2NoYW4gKmhzdWM7CiAJc3RydWN0IGhzdV9kbWFfZGVzYyAqZGVzYzsKQEAgLTIxMSw3ICsyMTAsNyBAQAogCiAJLyogU2FuaXR5IGNoZWNrICovCiAJaWYgKG5yID49IGNoaXAtPmhzdS0+bnJfY2hhbm5lbHMpCi0JCXJldHVybiBJUlFfTk9ORTsKKwkJcmV0dXJuIDA7CiAKIAloc3VjID0gJmNoaXAtPmhzdS0+Y2hhbltucl07CiAKQEAgLTIzMCw3ICsyMjksNyBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoc3VjLT52Y2hhbi5sb2NrLCBmbGFncyk7CiAKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJcmV0dXJuIDE7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChoc3VfZG1hX2RvX2lycSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2hzdS9wY2kuYyBiL2RyaXZlcnMvZG1hL2hzdS9wY2kuYwppbmRleCA5OTE2MDU4Li5iNTE2MzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9oc3UvcGNpLmMKKysrIGIvZHJpdmVycy9kbWEvaHN1L3BjaS5jCkBAIC0yOSw3ICsyOSw3IEBACiAJdTMyIGRtYWlzcjsKIAl1MzIgc3RhdHVzOwogCXVuc2lnbmVkIHNob3J0IGk7Ci0JaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisJaW50IHJldCA9IDA7CiAJaW50IGVycjsKIAogCWRtYWlzciA9IHJlYWRsKGNoaXAtPnJlZ3MgKyBIU1VfUENJX0RNQUlTUik7CkBAIC0zNywxNCArMzcsMTQgQEAKIAkJaWYgKGRtYWlzciAmIDB4MSkgewogCQkJZXJyID0gaHN1X2RtYV9nZXRfc3RhdHVzKGNoaXAsIGksICZzdGF0dXMpOwogCQkJaWYgKGVyciA+IDApCi0JCQkJcmV0IHw9IElSUV9IQU5ETEVEOworCQkJCXJldCB8PSAxOwogCQkJZWxzZSBpZiAoZXJyID09IDApCiAJCQkJcmV0IHw9IGhzdV9kbWFfZG9faXJxKGNoaXAsIGksIHN0YXR1cyk7CiAJCX0KIAkJZG1haXNyID4+PSAxOwogCX0KIAotCXJldHVybiByZXQ7CisJcmV0dXJuIElSUV9SRVRWQUwocmV0KTsKIH0KIAogc3RhdGljIGludCBoc3VfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pbWctbWRjLWRtYS5jIGIvZHJpdmVycy9kbWEvaW1nLW1kYy1kbWEuYwppbmRleCBhNGM1M2JlLi42MjRmMWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9pbWctbWRjLWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL2ltZy1tZGMtZG1hLmMKQEAgLTg2MSw3ICs4NjEsNiBAQAogewogCXN0cnVjdCBtZGNfZG1hICptZG1hOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCXVuc2lnbmVkIGludCBpOwogCXUzMiB2YWw7CiAJaW50IHJldDsKQEAgLTg3MSw4ICs4NzAsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtZG1hKTsKIAotCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKG1kY19kbWFfb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOwotCW1kbWEtPnNvYyA9IG1hdGNoLT5kYXRhOworCW1kbWEtPnNvYyA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSgmcGRldi0+ZGV2KTsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJbWRtYS0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW14LXNkbWEuYyBiL2RyaXZlcnMvZG1hL2lteC1zZG1hLmMKaW5kZXggMDNlYzc2Zi4uM2NiNDczOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW14LXNkbWEuYworKysgYi9kcml2ZXJzL2RtYS9pbXgtc2RtYS5jCkBAIC02NDgsMTUgKzY0OCwxMSBAQAogCXdyaXRlbF9yZWxheGVkKHZhbCwgc2RtYS0+cmVncyArIGNobmVuYmwpOwogfQogCi1zdGF0aWMgdm9pZCBzZG1hX2hhbmRsZV9jaGFubmVsX2xvb3Aoc3RydWN0IHNkbWFfY2hhbm5lbCAqc2RtYWMpCi17Ci0JaWYgKHNkbWFjLT5kZXNjLmNhbGxiYWNrKQotCQlzZG1hYy0+ZGVzYy5jYWxsYmFjayhzZG1hYy0+ZGVzYy5jYWxsYmFja19wYXJhbSk7Ci19Ci0KIHN0YXRpYyB2b2lkIHNkbWFfdXBkYXRlX2NoYW5uZWxfbG9vcChzdHJ1Y3Qgc2RtYV9jaGFubmVsICpzZG1hYykKIHsKIAlzdHJ1Y3Qgc2RtYV9idWZmZXJfZGVzY3JpcHRvciAqYmQ7CisJaW50IGVycm9yID0gMDsKKwllbnVtIGRtYV9zdGF0dXMJb2xkX3N0YXR1cyA9IHNkbWFjLT5zdGF0dXM7CiAKIAkvKgogCSAqIGxvb3AgbW9kZS4gSXRlcmF0ZSBvdmVyIGRlc2NyaXB0b3JzLCByZS1zZXR1cCB0aGVtIGFuZApAQCAtNjY4LDE3ICs2NjQsNDIgQEAKIAkJaWYgKGJkLT5tb2RlLnN0YXR1cyAmIEJEX0RPTkUpCiAJCQlicmVhazsKIAotCQlpZiAoYmQtPm1vZGUuc3RhdHVzICYgQkRfUlJPUikKKwkJaWYgKGJkLT5tb2RlLnN0YXR1cyAmIEJEX1JST1IpIHsKKwkJCWJkLT5tb2RlLnN0YXR1cyAmPSB+QkRfUlJPUjsKIAkJCXNkbWFjLT5zdGF0dXMgPSBETUFfRVJST1I7CisJCQllcnJvciA9IC1FSU87CisJCX0KIAorCSAgICAgICAvKgorCQkqIFdlIHVzZSBiZC0+bW9kZS5jb3VudCB0byBjYWxjdWxhdGUgdGhlIHJlc2lkdWUsIHNpbmNlIGNvbnRhaW5zCisJCSogdGhlIG51bWJlciBvZiBieXRlcyBwcmVzZW50IGluIHRoZSBjdXJyZW50IGJ1ZmZlciBkZXNjcmlwdG9yLgorCQkqLworCisJCXNkbWFjLT5jaG5fcmVhbF9jb3VudCA9IGJkLT5tb2RlLmNvdW50OwogCQliZC0+bW9kZS5zdGF0dXMgfD0gQkRfRE9ORTsKKwkJYmQtPm1vZGUuY291bnQgPSBzZG1hYy0+cGVyaW9kX2xlbjsKKworCQkvKgorCQkgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIGZyb20gdGhlIGludGVycnVwdCBjb250ZXh0IGluIG9yZGVyCisJCSAqIHRvIHJlZHVjZSBsYXRlbmN5IGFuZCB0byBhdm9pZCB0aGUgcmlzayBvZiBhbHRlcmluZyB0aGUKKwkJICogU0RNQSB0cmFuc2FjdGlvbiBzdGF0dXMgYnkgdGhlIHRpbWUgdGhlIGNsaWVudCB0YXNrbGV0IGlzCisJCSAqIGV4ZWN1dGVkLgorCQkgKi8KKworCQlpZiAoc2RtYWMtPmRlc2MuY2FsbGJhY2spCisJCQlzZG1hYy0+ZGVzYy5jYWxsYmFjayhzZG1hYy0+ZGVzYy5jYWxsYmFja19wYXJhbSk7CisKIAkJc2RtYWMtPmJ1Zl90YWlsKys7CiAJCXNkbWFjLT5idWZfdGFpbCAlPSBzZG1hYy0+bnVtX2JkOworCisJCWlmIChlcnJvcikKKwkJCXNkbWFjLT5zdGF0dXMgPSBvbGRfc3RhdHVzOwogCX0KIH0KIAotc3RhdGljIHZvaWQgbXhjX3NkbWFfaGFuZGxlX2NoYW5uZWxfbm9ybWFsKHN0cnVjdCBzZG1hX2NoYW5uZWwgKnNkbWFjKQorc3RhdGljIHZvaWQgbXhjX3NkbWFfaGFuZGxlX2NoYW5uZWxfbm9ybWFsKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKKwlzdHJ1Y3Qgc2RtYV9jaGFubmVsICpzZG1hYyA9IChzdHJ1Y3Qgc2RtYV9jaGFubmVsICopIGRhdGE7CiAJc3RydWN0IHNkbWFfYnVmZmVyX2Rlc2NyaXB0b3IgKmJkOwogCWludCBpLCBlcnJvciA9IDA7CiAKQEAgLTcwNSwxNiArNzI2LDYgQEAKIAkJc2RtYWMtPmRlc2MuY2FsbGJhY2soc2RtYWMtPmRlc2MuY2FsbGJhY2tfcGFyYW0pOwogfQogCi1zdGF0aWMgdm9pZCBzZG1hX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBzZG1hX2NoYW5uZWwgKnNkbWFjID0gKHN0cnVjdCBzZG1hX2NoYW5uZWwgKikgZGF0YTsKLQotCWlmIChzZG1hYy0+ZmxhZ3MgJiBJTVhfRE1BX1NHX0xPT1ApCi0JCXNkbWFfaGFuZGxlX2NoYW5uZWxfbG9vcChzZG1hYyk7Ci0JZWxzZQotCQlteGNfc2RtYV9oYW5kbGVfY2hhbm5lbF9ub3JtYWwoc2RtYWMpOwotfQotCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc2RtYV9pbnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IHNkbWFfZW5naW5lICpzZG1hID0gZGV2X2lkOwpAQCAtNzMxLDggKzc0Miw4IEBACiAKIAkJaWYgKHNkbWFjLT5mbGFncyAmIElNWF9ETUFfU0dfTE9PUCkKIAkJCXNkbWFfdXBkYXRlX2NoYW5uZWxfbG9vcChzZG1hYyk7Ci0KLQkJdGFza2xldF9zY2hlZHVsZSgmc2RtYWMtPnRhc2tsZXQpOworCQllbHNlCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZzZG1hYy0+dGFza2xldCk7CiAKIAkJX19jbGVhcl9iaXQoY2hhbm5lbCwgJnN0YXQpOwogCX0KQEAgLTEzNTMsNyArMTM2NCw4IEBACiAJdTMyIHJlc2lkdWU7CiAKIAlpZiAoc2RtYWMtPmZsYWdzICYgSU1YX0RNQV9TR19MT09QKQotCQlyZXNpZHVlID0gKHNkbWFjLT5udW1fYmQgLSBzZG1hYy0+YnVmX3RhaWwpICogc2RtYWMtPnBlcmlvZF9sZW47CisJCXJlc2lkdWUgPSAoc2RtYWMtPm51bV9iZCAtIHNkbWFjLT5idWZfdGFpbCkgKgorCQkJICAgc2RtYWMtPnBlcmlvZF9sZW4gLSBzZG1hYy0+Y2huX3JlYWxfY291bnQ7CiAJZWxzZQogCQlyZXNpZHVlID0gc2RtYWMtPmNobl9jb3VudCAtIHNkbWFjLT5jaG5fcmVhbF9jb3VudDsKIApAQCAtMTczMiw3ICsxNzQ0LDcgQEAKIAkJZG1hX2Nvb2tpZV9pbml0KCZzZG1hYy0+Y2hhbik7CiAJCXNkbWFjLT5jaGFubmVsID0gaTsKIAotCQl0YXNrbGV0X2luaXQoJnNkbWFjLT50YXNrbGV0LCBzZG1hX3Rhc2tsZXQsCisJCXRhc2tsZXRfaW5pdCgmc2RtYWMtPnRhc2tsZXQsIG14Y19zZG1hX2hhbmRsZV9jaGFubmVsX25vcm1hbCwKIAkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHNkbWFjKTsKIAkJLyoKIAkJICogQWRkIHRoZSBjaGFubmVsIHRvIHRoZSBETUFDIGxpc3QuIERvIG5vdCBhZGQgY2hhbm5lbCAwIHRob3VnaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvcHhhX2RtYS5jIGIvZHJpdmVycy9kbWEvcHhhX2RtYS5jCmluZGV4IGRjNzg1MGEuLjNmNTZmOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3B4YV9kbWEuYworKysgYi9kcml2ZXJzL2RtYS9weGFfZG1hLmMKQEAgLTYzOCw3ICs2MzgsNyBAQAogCQl2ZF9sYXN0X2lzc3VlZCA9IGxpc3RfZW50cnkodmMtPmRlc2NfaXNzdWVkLnByZXYsCiAJCQkJCSAgICBzdHJ1Y3QgdmlydF9kbWFfZGVzYywgbm9kZSk7CiAJCXB4YWRfZGVzY19jaGFpbih2ZF9sYXN0X2lzc3VlZCwgdmQpOwotCQlpZiAoaXNfY2hhbl9ydW5uaW5nKGNoYW4pIHx8IGlzX2Rlc2NfY29tcGxldGVkKHZkX2xhc3RfaXNzdWVkKSkKKwkJaWYgKGlzX2NoYW5fcnVubmluZyhjaGFuKSB8fCBpc19kZXNjX2NvbXBsZXRlZCh2ZCkpCiAJCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKQEAgLTY3MSw2ICs2NzEsNyBAQAogCXN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZCwgKnRtcDsKIAl1bnNpZ25lZCBpbnQgZGNzcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgdmRfY29tcGxldGVkOwogCWRtYV9jb29raWVfdCBsYXN0X3N0YXJ0ZWQgPSAwOwogCiAJQlVHX09OKCFjaGFuKTsKQEAgLTY4MSwxNSArNjgyLDE3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+dmMubG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2ZCwgdG1wLCAmY2hhbi0+dmMuZGVzY19pc3N1ZWQsIG5vZGUpIHsKKwkJdmRfY29tcGxldGVkID0gaXNfZGVzY19jb21wbGV0ZWQodmQpOwogCQlkZXZfZGJnKCZjaGFuLT52Yy5jaGFuLmRldi0+ZGV2aWNlLAotCQkJIiVzKCk6IGNoZWNraW5nIHR4ZCAlcFsleF06IGNvbXBsZXRlZD0lZFxuIiwKLQkJCV9fZnVuY19fLCB2ZCwgdmQtPnR4LmNvb2tpZSwgaXNfZGVzY19jb21wbGV0ZWQodmQpKTsKKwkJCSIlcygpOiBjaGVja2luZyB0eGQgJXBbJXhdOiBjb21wbGV0ZWQ9JWQgZGNzcj0weCV4XG4iLAorCQkJX19mdW5jX18sIHZkLCB2ZC0+dHguY29va2llLCB2ZF9jb21wbGV0ZWQsCisJCQlkY3NyKTsKIAkJbGFzdF9zdGFydGVkID0gdmQtPnR4LmNvb2tpZTsKIAkJaWYgKHRvX3B4YWRfc3dfZGVzYyh2ZCktPmN5Y2xpYykgewogCQkJdmNoYW5fY3ljbGljX2NhbGxiYWNrKHZkKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChpc19kZXNjX2NvbXBsZXRlZCh2ZCkpIHsKKwkJaWYgKHZkX2NvbXBsZXRlZCkgewogCQkJbGlzdF9kZWwoJnZkLT5ub2RlKTsKIAkJCXZjaGFuX2Nvb2tpZV9jb21wbGV0ZSh2ZCk7CiAJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zaC91c2ItZG1hYy5jIGIvZHJpdmVycy9kbWEvc2gvdXNiLWRtYWMuYwppbmRleCA3NDlmMWJkLi4wNmVjZGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zaC91c2ItZG1hYy5jCisrKyBiL2RyaXZlcnMvZG1hL3NoL3VzYi1kbWFjLmMKQEAgLTYwMCwyNyArNjAwLDMwIEBACiB7CiAJc3RydWN0IHVzYl9kbWFjX2NoYW4gKmNoYW4gPSBkZXY7CiAJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7Ci0JdTMyIG1hc2sgPSBVU0JfRE1BQ0hDUl9URTsKLQl1MzIgY2hlY2tfYml0cyA9IFVTQl9ETUFDSENSX1RFIHwgVVNCX0RNQUNIQ1JfU1A7CisJdTMyIG1hc2sgPSAwOwogCXUzMiBjaGNyOworCWJvb2wgeGZlcl9lbmQgPSBmYWxzZTsKIAogCXNwaW5fbG9jaygmY2hhbi0+dmMubG9jayk7CiAKIAljaGNyID0gdXNiX2RtYWNfY2hhbl9yZWFkKGNoYW4sIFVTQl9ETUFDSENSKTsKLQlpZiAoY2hjciAmIGNoZWNrX2JpdHMpCi0JCW1hc2sgfD0gVVNCX0RNQUNIQ1JfREUgfCBjaGVja19iaXRzOworCWlmIChjaGNyICYgKFVTQl9ETUFDSENSX1RFIHwgVVNCX0RNQUNIQ1JfU1ApKSB7CisJCW1hc2sgfD0gVVNCX0RNQUNIQ1JfREUgfCBVU0JfRE1BQ0hDUl9URSB8IFVTQl9ETUFDSENSX1NQOworCQlpZiAoY2hjciAmIFVTQl9ETUFDSENSX0RFKQorCQkJeGZlcl9lbmQgPSB0cnVlOworCQlyZXQgfD0gSVJRX0hBTkRMRUQ7CisJfQogCWlmIChjaGNyICYgVVNCX0RNQUNIQ1JfTlVMTCkgewogCQkvKiBBbiBpbnRlcnJ1cHRpb24gb2YgVEUgd2lsbCBoYXBwZW4gYWZ0ZXIgd2Ugc2V0IEZURSAqLwogCQltYXNrIHw9IFVTQl9ETUFDSENSX05VTEw7CiAJCWNoY3IgfD0gVVNCX0RNQUNIQ1JfRlRFOwogCQlyZXQgfD0gSVJRX0hBTkRMRUQ7CiAJfQotCXVzYl9kbWFjX2NoYW5fd3JpdGUoY2hhbiwgVVNCX0RNQUNIQ1IsIGNoY3IgJiB+bWFzayk7CisJaWYgKG1hc2spCisJCXVzYl9kbWFjX2NoYW5fd3JpdGUoY2hhbiwgVVNCX0RNQUNIQ1IsIGNoY3IgJiB+bWFzayk7CiAKLQlpZiAoY2hjciAmIGNoZWNrX2JpdHMpIHsKKwlpZiAoeGZlcl9lbmQpCiAJCXVzYl9kbWFjX2lzcl90cmFuc2Zlcl9lbmQoY2hhbik7Ci0JCXJldCB8PSBJUlFfSEFORExFRDsKLQl9CiAKIAlzcGluX3VubG9jaygmY2hhbi0+dmMubG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9LY29uZmlnIGIvZHJpdmVycy9lZGFjL0tjb25maWcKaW5kZXggZDBjMWRhYi4uODJkODVjY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvZWRhYy9LY29uZmlnCkBAIC0yNTEsNiArMjUxLDE0IEBACiAJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gdGhlIEludGVsCiAJICBTYW5keSBCcmlkZ2UsIEl2eSBCcmlkZ2UgYW5kIEhhc3dlbGwgSW50ZWdyYXRlZCBNZW1vcnkgQ29udHJvbGxlcnMuCiAKK2NvbmZpZyBFREFDX1NLWAorCXRyaXN0YXRlICJJbnRlbCBTa3lsYWtlIHNlcnZlciBJbnRlZ3JhdGVkIE1DIgorCWRlcGVuZHMgb24gRURBQ19NTV9FREFDICYmIFBDSSAmJiBYODZfNjQgJiYgWDg2X01DRV9JTlRFTAorCWRlcGVuZHMgb24gUENJX01NQ09ORklHCisJaGVscAorCSAgU3VwcG9ydCBmb3IgZXJyb3IgZGV0ZWN0aW9uIGFuZCBjb3JyZWN0aW9uIHRoZSBJbnRlbAorCSAgU2t5bGFrZSBzZXJ2ZXIgSW50ZWdyYXRlZCBNZW1vcnkgQ29udHJvbGxlcnMuCisKIGNvbmZpZyBFREFDX01QQzg1WFgKIAl0cmlzdGF0ZSAiRnJlZXNjYWxlIE1QQzgzeHggLyBNUEM4NXh4IgogCWRlcGVuZHMgb24gRURBQ19NTV9FREFDICYmIEZTTF9TT0MKQEAgLTI1OCw2ICsyNjYsMTMgQEAKIAkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiB0aGUgRnJlZXNjYWxlCiAJICBNUEM4MzQ5LCBNUEM4NTYwLCBNUEM4NTQwLCBNUEM4NTQ4LCBUNDI0MAogCitjb25maWcgRURBQ19MQVlFUlNDQVBFCisJdHJpc3RhdGUgIkZyZWVzY2FsZSBMYXllcnNjYXBlIEREUiIKKwlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBBUkNIX0xBWUVSU0NBUEUKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gRnJlZXNjYWxlIG1lbW9yeQorCSAgY29udHJvbGxlcnMgb24gTGF5ZXJzY2FwZSBTb0NzLgorCiBjb25maWcgRURBQ19NVjY0WDYwCiAJdHJpc3RhdGUgIk1hcnZlbGwgTVY2NHg2MCIKIAlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBNVjY0WDYwCkBAIC0zOTgsNiArNDEzLDQxIEBACiAJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlCiAJICBBbHRlcmEgRXRoZXJuZXQgRklGTyBNZW1vcnkgZm9yIEFsdGVyYSBTb0NzLgogCitjb25maWcgRURBQ19BTFRFUkFfTkFORAorCWJvb2wgIkFsdGVyYSBOQU5EIEZJRk8gRUNDIgorCWRlcGVuZHMgb24gRURBQ19BTFRFUkE9eSAmJiBNVERfTkFORF9ERU5BTEkKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlCisJICBBbHRlcmEgTkFORCBGSUZPIE1lbW9yeSBmb3IgQWx0ZXJhIFNvQ3MuCisKK2NvbmZpZyBFREFDX0FMVEVSQV9ETUEKKwlib29sICJBbHRlcmEgRE1BIEZJRk8gRUNDIgorCWRlcGVuZHMgb24gRURBQ19BTFRFUkE9eSAmJiBQTDMzMF9ETUE9eQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiB0aGUKKwkgIEFsdGVyYSBETUEgRklGTyBNZW1vcnkgZm9yIEFsdGVyYSBTb0NzLgorCitjb25maWcgRURBQ19BTFRFUkFfVVNCCisJYm9vbCAiQWx0ZXJhIFVTQiBGSUZPIEVDQyIKKwlkZXBlbmRzIG9uIEVEQUNfQUxURVJBPXkgJiYgVVNCX0RXQzIKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlCisJICBBbHRlcmEgVVNCIEZJRk8gTWVtb3J5IGZvciBBbHRlcmEgU29Dcy4KKworY29uZmlnIEVEQUNfQUxURVJBX1FTUEkKKwlib29sICJBbHRlcmEgUVNQSSBGSUZPIEVDQyIKKwlkZXBlbmRzIG9uIEVEQUNfQUxURVJBPXkgJiYgU1BJX0NBREVOQ0VfUVVBRFNQSQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiB0aGUKKwkgIEFsdGVyYSBRU1BJIEZJRk8gTWVtb3J5IGZvciBBbHRlcmEgU29Dcy4KKworY29uZmlnIEVEQUNfQUxURVJBX1NETU1DCisJYm9vbCAiQWx0ZXJhIFNETU1DIEZJRk8gRUNDIgorCWRlcGVuZHMgb24gRURBQ19BTFRFUkE9eSAmJiBNTUNfRFcKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlCisJICBBbHRlcmEgU0RNTUMgRklGTyBNZW1vcnkgZm9yIEFsdGVyYSBTb0NzLgorCiBjb25maWcgRURBQ19TWU5PUFNZUwogCXRyaXN0YXRlICJTeW5vcHN5cyBERFIgTWVtb3J5IENvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBFREFDX01NX0VEQUMgJiYgQVJDSF9aWU5RCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvTWFrZWZpbGUgYi9kcml2ZXJzL2VkYWMvTWFrZWZpbGUKaW5kZXggZjllNGEzZS4uODhlNDcyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZWRhYy9NYWtlZmlsZQpAQCAtMzEsNiArMzEsNyBAQAogb2JqLSQoQ09ORklHX0VEQUNfSTczMDApCQkrPSBpNzMwMF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0k3Q09SRSkJCSs9IGk3Y29yZV9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX1NCUklER0UpCQkrPSBzYl9lZGFjLm8KK29iai0kKENPTkZJR19FREFDX1NLWCkJCQkrPSBza3hfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19FN1hYWCkJCSs9IGU3eHh4X2VkYWMubwogb2JqLSQoQ09ORklHX0VEQUNfRTc1MlgpCQkrPSBlNzUyeF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0k4MjQ0M0JYR1gpCQkrPSBpODI0NDNieGd4X2VkYWMubwpAQCAtNTAsNyArNTEsMTMgQEAKIG9iai0kKENPTkZJR19FREFDX0FNRDY0KQkJKz0gYW1kNjRfZWRhY19tb2QubwogCiBvYmotJChDT05GSUdfRURBQ19QQVNFTUkpCQkrPSBwYXNlbWlfZWRhYy5vCi1vYmotJChDT05GSUdfRURBQ19NUEM4NVhYKQkJKz0gbXBjODV4eF9lZGFjLm8KKworbXBjODV4eF9lZGFjX21vZC15CQkJOj0gZnNsX2Rkcl9lZGFjLm8gbXBjODV4eF9lZGFjLm8KK29iai0kKENPTkZJR19FREFDX01QQzg1WFgpCQkrPSBtcGM4NXh4X2VkYWNfbW9kLm8KKworbGF5ZXJzY2FwZV9lZGFjX21vZC15CQkJOj0gZnNsX2Rkcl9lZGFjLm8gbGF5ZXJzY2FwZV9lZGFjLm8KK29iai0kKENPTkZJR19FREFDX0xBWUVSU0NBUEUpCQkrPSBsYXllcnNjYXBlX2VkYWNfbW9kLm8KKwogb2JqLSQoQ09ORklHX0VEQUNfTVY2NFg2MCkJCSs9IG12NjR4NjBfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19DRUxMKQkJCSs9IGNlbGxfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19QUEM0WFgpCQkrPSBwcGM0eHhfZWRhYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYWx0ZXJhX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9hbHRlcmFfZWRhYy5jCmluZGV4IDIzOThkMDcuLjU4ZDNlMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9hbHRlcmFfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9hbHRlcmFfZWRhYy5jCkBAIC0yMDMsNyArMjAzLDcgQEAKIAlpZiAoIW1jaS0+ZGVidWdmcykKIAkJcmV0dXJuOwogCi0JZWRhY19kZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJpbmplY3RfY3RybCIsIFNfSVdVU1IsIG1jaS0+ZGVidWdmcywgbWNpLAorCWVkYWNfZGVidWdmc19jcmVhdGVfZmlsZSgiYWx0cl90cmlnZ2VyIiwgU19JV1VTUiwgbWNpLT5kZWJ1Z2ZzLCBtY2ksCiAJCQkJICZhbHRyX3Nkcl9tY19kZWJ1Z19pbmplY3RfZm9wcyk7CiB9CiAKQEAgLTY4MCw3ICs2ODAsNyBAQAogCWlmICghZHJ2ZGF0YS0+ZGVidWdmc19kaXIpCiAJCXJldHVybjsKIAotCWlmICghZWRhY19kZWJ1Z2ZzX2NyZWF0ZV9maWxlKHByaXYtPmRiZ2ZzX25hbWUsIFNfSVdVU1IsCisJaWYgKCFlZGFjX2RlYnVnZnNfY3JlYXRlX2ZpbGUoImFsdHJfdHJpZ2dlciIsIFNfSVdVU1IsCiAJCQkJICAgICAgZHJ2ZGF0YS0+ZGVidWdmc19kaXIsIGVkYWNfZGNpLAogCQkJCSAgICAgIHByaXYtPmluamVjdF9mb3BzKSkKIAkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRydmRhdGEtPmRlYnVnZnNfZGlyKTsKQEAgLTExMDgsNyArMTEwOCw2IEBACiAJLnNldHVwID0gYWx0cl9jaGVja19lY2NfZGVwcywKIAkuY2VfY2xlYXJfbWFzayA9IChBTFRSX09DUl9FQ0NfRU4gfCBBTFRSX09DUl9FQ0NfU0VSUiksCiAJLnVlX2NsZWFyX21hc2sgPSAoQUxUUl9PQ1JfRUNDX0VOIHwgQUxUUl9PQ1JfRUNDX0RFUlIpLAotCS5kYmdmc19uYW1lID0gImFsdHJfb2NyYW1fdHJpZ2dlciIsCiAJLmFsbG9jX21lbSA9IG9jcmFtX2FsbG9jX21lbSwKIAkuZnJlZV9tZW0gPSBvY3JhbV9mcmVlX21lbSwKIAkuZWNjX2VuYWJsZV9tYXNrID0gQUxUUl9PQ1JfRUNDX0VOLApAQCAtMTEyNSw3ICsxMTI0LDYgQEAKIAkuY2VfY2xlYXJfbWFzayA9IEFMVFJfQTEwX0VDQ19TRVJSUEVOQSwKIAkudWVfY2xlYXJfbWFzayA9IEFMVFJfQTEwX0VDQ19ERVJSUEVOQSwKIAkuaXJxX3N0YXR1c19tYXNrID0gQTEwX1NZU01HUl9FQ0NfSU5UU1RBVF9PQ1JBTSwKLQkuZGJnZnNfbmFtZSA9ICJhbHRyX29jcmFtX3RyaWdnZXIiLAogCS5lY2NfZW5hYmxlX21hc2sgPSBBTFRSX0ExMF9PQ1JBTV9FQ0NfRU5fQ1RMLAogCS5lY2NfZW5fb2ZzdCA9IEFMVFJfQTEwX0VDQ19DVFJMX09GU1QsCiAJLmNlX3NldF9tYXNrID0gQUxUUl9BMTBfRUNDX1RTRVJSQSwKQEAgLTEyMjgsNyArMTIyNiw2IEBACiAJLnNldHVwID0gYWx0cl9sMl9jaGVja19kZXBzLAogCS5jZV9jbGVhcl9tYXNrID0gMCwKIAkudWVfY2xlYXJfbWFzayA9IDAsCi0JLmRiZ2ZzX25hbWUgPSAiYWx0cl9sMl90cmlnZ2VyIiwKIAkuYWxsb2NfbWVtID0gbDJfYWxsb2NfbWVtLAogCS5mcmVlX21lbSA9IGwyX2ZyZWVfbWVtLAogCS5lY2NfZW5hYmxlX21hc2sgPSBBTFRSX0wyX0VDQ19FTiwKQEAgLTEyNDQsNyArMTI0MSw2IEBACiAJLmNlX2NsZWFyX21hc2sgPSBBTFRSX0ExMF9MMl9FQ0NfU0VSUl9DTFIsCiAJLnVlX2NsZWFyX21hc2sgPSBBTFRSX0ExMF9MMl9FQ0NfTUVSUl9DTFIsCiAJLmlycV9zdGF0dXNfbWFzayA9IEExMF9TWVNNR1JfRUNDX0lOVFNUQVRfTDIsCi0JLmRiZ2ZzX25hbWUgPSAiYWx0cl9sMl90cmlnZ2VyIiwKIAkuYWxsb2NfbWVtID0gbDJfYWxsb2NfbWVtLAogCS5mcmVlX21lbSA9IGwyX2ZyZWVfbWVtLAogCS5lY2NfZW5hYmxlX21hc2sgPSBBTFRSX0ExMF9MMl9FQ0NfRU5fQ1RMLApAQCAtMTI2Niw3ICsxMjYyLDYgQEAKIAkuc2V0dXAgPSBhbHRyX2NoZWNrX2VjY19kZXBzLAogCS5jZV9jbGVhcl9tYXNrID0gQUxUUl9BMTBfRUNDX1NFUlJQRU5BLAogCS51ZV9jbGVhcl9tYXNrID0gQUxUUl9BMTBfRUNDX0RFUlJQRU5BLAotCS5kYmdmc19uYW1lID0gImFsdHJfdHJpZ2dlciIsCiAJLmVjY19lbmFibGVfbWFzayA9IEFMVFJfQTEwX0NPTU1PTl9FQ0NfRU5fQ1RMLAogCS5lY2NfZW5fb2ZzdCA9IEFMVFJfQTEwX0VDQ19DVFJMX09GU1QsCiAJLmNlX3NldF9tYXNrID0gQUxUUl9BMTBfRUNDX1RTRVJSQSwKQEAgLTEyODUsNiArMTI4MCwyOTIgQEAKIAogI2VuZGlmCS8qIENPTkZJR19FREFDX0FMVEVSQV9FVEhFUk5FVCAqLwogCisvKioqKioqKioqKioqKioqKioqKioqKiBOQU5EIERldmljZSBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIENPTkZJR19FREFDX0FMVEVSQV9OQU5ECisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWRhY19kZXZpY2VfcHJ2X2RhdGEgYTEwX25hbmRlY2NfZGF0YSA9IHsKKwkuc2V0dXAgPSBhbHRyX2NoZWNrX2VjY19kZXBzLAorCS5jZV9jbGVhcl9tYXNrID0gQUxUUl9BMTBfRUNDX1NFUlJQRU5BLAorCS51ZV9jbGVhcl9tYXNrID0gQUxUUl9BMTBfRUNDX0RFUlJQRU5BLAorCS5lY2NfZW5hYmxlX21hc2sgPSBBTFRSX0ExMF9DT01NT05fRUNDX0VOX0NUTCwKKwkuZWNjX2VuX29mc3QgPSBBTFRSX0ExMF9FQ0NfQ1RSTF9PRlNULAorCS5jZV9zZXRfbWFzayA9IEFMVFJfQTEwX0VDQ19UU0VSUkEsCisJLnVlX3NldF9tYXNrID0gQUxUUl9BMTBfRUNDX1RERVJSQSwKKwkuc2V0X2Vycl9vZnN0ID0gQUxUUl9BMTBfRUNDX0lOVFRFU1RfT0ZTVCwKKwkuZWNjX2lycV9oYW5kbGVyID0gYWx0cl9lZGFjX2ExMF9lY2NfaXJxLAorCS5pbmplY3RfZm9wcyA9ICZhbHRyX2VkYWNfYTEwX2RldmljZV9pbmplY3RfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNvY2ZwZ2FfaW5pdF9uYW5kX2VjYyh2b2lkKQoreworCXJldHVybiBhbHRyX2luaXRfYTEwX2VjY19kZXZpY2VfdHlwZSgiYWx0cixzb2NmcGdhLW5hbmQtZWNjIik7Cit9CisKK2Vhcmx5X2luaXRjYWxsKHNvY2ZwZ2FfaW5pdF9uYW5kX2VjYyk7CisKKyNlbmRpZgkvKiBDT05GSUdfRURBQ19BTFRFUkFfTkFORCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiBETUEgRGV2aWNlIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX0VEQUNfQUxURVJBX0RNQQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGVkYWNfZGV2aWNlX3Bydl9kYXRhIGExMF9kbWFlY2NfZGF0YSA9IHsKKwkuc2V0dXAgPSBhbHRyX2NoZWNrX2VjY19kZXBzLAorCS5jZV9jbGVhcl9tYXNrID0gQUxUUl9BMTBfRUNDX1NFUlJQRU5BLAorCS51ZV9jbGVhcl9tYXNrID0gQUxUUl9BMTBfRUNDX0RFUlJQRU5BLAorCS5lY2NfZW5hYmxlX21hc2sgPSBBTFRSX0ExMF9DT01NT05fRUNDX0VOX0NUTCwKKwkuZWNjX2VuX29mc3QgPSBBTFRSX0ExMF9FQ0NfQ1RSTF9PRlNULAorCS5jZV9zZXRfbWFzayA9IEFMVFJfQTEwX0VDQ19UU0VSUkEsCisJLnVlX3NldF9tYXNrID0gQUxUUl9BMTBfRUNDX1RERVJSQSwKKwkuc2V0X2Vycl9vZnN0ID0gQUxUUl9BMTBfRUNDX0lOVFRFU1RfT0ZTVCwKKwkuZWNjX2lycV9oYW5kbGVyID0gYWx0cl9lZGFjX2ExMF9lY2NfaXJxLAorCS5pbmplY3RfZm9wcyA9ICZhbHRyX2VkYWNfYTEwX2RldmljZV9pbmplY3RfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNvY2ZwZ2FfaW5pdF9kbWFfZWNjKHZvaWQpCit7CisJcmV0dXJuIGFsdHJfaW5pdF9hMTBfZWNjX2RldmljZV90eXBlKCJhbHRyLHNvY2ZwZ2EtZG1hLWVjYyIpOworfQorCitlYXJseV9pbml0Y2FsbChzb2NmcGdhX2luaXRfZG1hX2VjYyk7CisKKyNlbmRpZgkvKiBDT05GSUdfRURBQ19BTFRFUkFfRE1BICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFVTQiBEZXZpY2UgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBDT05GSUdfRURBQ19BTFRFUkFfVVNCCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWRhY19kZXZpY2VfcHJ2X2RhdGEgYTEwX3VzYmVjY19kYXRhID0geworCS5zZXR1cCA9IGFsdHJfY2hlY2tfZWNjX2RlcHMsCisJLmNlX2NsZWFyX21hc2sgPSBBTFRSX0ExMF9FQ0NfU0VSUlBFTkEsCisJLnVlX2NsZWFyX21hc2sgPSBBTFRSX0ExMF9FQ0NfREVSUlBFTkEsCisJLmVjY19lbmFibGVfbWFzayA9IEFMVFJfQTEwX0NPTU1PTl9FQ0NfRU5fQ1RMLAorCS5lY2NfZW5fb2ZzdCA9IEFMVFJfQTEwX0VDQ19DVFJMX09GU1QsCisJLmNlX3NldF9tYXNrID0gQUxUUl9BMTBfRUNDX1RTRVJSQSwKKwkudWVfc2V0X21hc2sgPSBBTFRSX0ExMF9FQ0NfVERFUlJBLAorCS5zZXRfZXJyX29mc3QgPSBBTFRSX0ExMF9FQ0NfSU5UVEVTVF9PRlNULAorCS5lY2NfaXJxX2hhbmRsZXIgPSBhbHRyX2VkYWNfYTEwX2VjY19pcnEsCisJLmluamVjdF9mb3BzID0gJmFsdHJfZWRhY19hMTBfZGV2aWNlX2luamVjdF9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc29jZnBnYV9pbml0X3VzYl9lY2Modm9pZCkKK3sKKwlyZXR1cm4gYWx0cl9pbml0X2ExMF9lY2NfZGV2aWNlX3R5cGUoImFsdHIsc29jZnBnYS11c2ItZWNjIik7Cit9CisKK2Vhcmx5X2luaXRjYWxsKHNvY2ZwZ2FfaW5pdF91c2JfZWNjKTsKKworI2VuZGlmCS8qIENPTkZJR19FREFDX0FMVEVSQV9VU0IgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiogUVNQSSBEZXZpY2UgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBDT05GSUdfRURBQ19BTFRFUkFfUVNQSQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGVkYWNfZGV2aWNlX3Bydl9kYXRhIGExMF9xc3BpZWNjX2RhdGEgPSB7CisJLnNldHVwID0gYWx0cl9jaGVja19lY2NfZGVwcywKKwkuY2VfY2xlYXJfbWFzayA9IEFMVFJfQTEwX0VDQ19TRVJSUEVOQSwKKwkudWVfY2xlYXJfbWFzayA9IEFMVFJfQTEwX0VDQ19ERVJSUEVOQSwKKwkuZWNjX2VuYWJsZV9tYXNrID0gQUxUUl9BMTBfQ09NTU9OX0VDQ19FTl9DVEwsCisJLmVjY19lbl9vZnN0ID0gQUxUUl9BMTBfRUNDX0NUUkxfT0ZTVCwKKwkuY2Vfc2V0X21hc2sgPSBBTFRSX0ExMF9FQ0NfVFNFUlJBLAorCS51ZV9zZXRfbWFzayA9IEFMVFJfQTEwX0VDQ19UREVSUkEsCisJLnNldF9lcnJfb2ZzdCA9IEFMVFJfQTEwX0VDQ19JTlRURVNUX09GU1QsCisJLmVjY19pcnFfaGFuZGxlciA9IGFsdHJfZWRhY19hMTBfZWNjX2lycSwKKwkuaW5qZWN0X2ZvcHMgPSAmYWx0cl9lZGFjX2ExMF9kZXZpY2VfaW5qZWN0X2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzb2NmcGdhX2luaXRfcXNwaV9lY2Modm9pZCkKK3sKKwlyZXR1cm4gYWx0cl9pbml0X2ExMF9lY2NfZGV2aWNlX3R5cGUoImFsdHIsc29jZnBnYS1xc3BpLWVjYyIpOworfQorCitlYXJseV9pbml0Y2FsbChzb2NmcGdhX2luaXRfcXNwaV9lY2MpOworCisjZW5kaWYJLyogQ09ORklHX0VEQUNfQUxURVJBX1FTUEkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiBTRE1NQyBEZXZpY2UgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBDT05GSUdfRURBQ19BTFRFUkFfU0RNTUMKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlZGFjX2RldmljZV9wcnZfZGF0YSBhMTBfc2RtbWNlY2NiX2RhdGE7CitzdGF0aWMgaW50IGFsdHJfcG9ydGJfc2V0dXAoc3RydWN0IGFsdHJfZWRhY19kZXZpY2VfZGV2ICpkZXZpY2UpCit7CisJc3RydWN0IGVkYWNfZGV2aWNlX2N0bF9pbmZvICpkY2k7CisJc3RydWN0IGFsdHJfZWRhY19kZXZpY2VfZGV2ICphbHRkZXY7CisJY2hhciAqZWNjX25hbWUgPSAic2RtbWNiLWVjYyI7CisJaW50IGVkYWNfaWR4LCByYzsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCWNvbnN0IHN0cnVjdCBlZGFjX2RldmljZV9wcnZfZGF0YSAqcHJ2ID0gJmExMF9zZG1tY2VjY2JfZGF0YTsKKworCXJjID0gYWx0cl9jaGVja19lY2NfZGVwcyhkZXZpY2UpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiYWx0cixzb2NmcGdhLXNkbW1jLWVjYyIpOworCWlmICghbnApIHsKKwkJZWRhY19wcmludGsoS0VSTl9XQVJOSU5HLCBFREFDX0RFVklDRSwgIlNETU1DIG5vZGUgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogQ3JlYXRlIHRoZSBQb3J0QiBFREFDIGRldmljZSAqLworCWVkYWNfaWR4ID0gZWRhY19kZXZpY2VfYWxsb2NfaW5kZXgoKTsKKwlkY2kgPSBlZGFjX2RldmljZV9hbGxvY19jdGxfaW5mbyhzaXplb2YoKmFsdGRldiksIGVjY19uYW1lLCAxLAorCQkJCQkgZWNjX25hbWUsIDEsIDAsIE5VTEwsIDAsIGVkYWNfaWR4KTsKKwlpZiAoIWRjaSkgeworCQllZGFjX3ByaW50ayhLRVJOX0VSUiwgRURBQ19ERVZJQ0UsCisJCQkgICAgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgUG9ydEIgRURBQyBkZXZpY2VcbiIsCisJCQkgICAgZWNjX25hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBQb3J0QiBFREFDIGRldmljZSBzdHJ1Y3R1cmUgZnJvbSBQb3J0QSBzdHJ1Y3R1cmUgKi8KKwlhbHRkZXYgPSBkY2ktPnB2dF9pbmZvOworCSphbHRkZXYgPSAqZGV2aWNlOworCisJaWYgKCFkZXZyZXNfb3Blbl9ncm91cCgmYWx0ZGV2LT5kZGV2LCBhbHRyX3BvcnRiX3NldHVwLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBVcGRhdGUgUG9ydEIgc3BlY2lmaWMgdmFsdWVzICovCisJYWx0ZGV2LT5lZGFjX2Rldl9uYW1lID0gZWNjX25hbWU7CisJYWx0ZGV2LT5lZGFjX2lkeCA9IGVkYWNfaWR4OworCWFsdGRldi0+ZWRhY19kZXYgPSBkY2k7CisJYWx0ZGV2LT5kYXRhID0gcHJ2OworCWRjaS0+ZGV2ID0gJmFsdGRldi0+ZGRldjsKKwlkY2ktPmN0bF9uYW1lID0gIkFsdGVyYSBFQ0MgTWFuYWdlciI7CisJZGNpLT5tb2RfbmFtZSA9IGVjY19uYW1lOworCWRjaS0+ZGV2X25hbWUgPSBlY2NfbmFtZTsKKworCS8qIFVwZGF0ZSB0aGUgSVJRcyBmb3IgUG9ydEIgKi8KKwlhbHRkZXYtPnNiX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAyKTsKKwlpZiAoIWFsdGRldi0+c2JfaXJxKSB7CisJCWVkYWNfcHJpbnRrKEtFUk5fRVJSLCBFREFDX0RFVklDRSwgIkVycm9yIFBvcnRCIFNCSVJRIGFsbG9jXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl9yZWxlYXNlX2dyb3VwXzE7CisJfQorCXJjID0gZGV2bV9yZXF1ZXN0X2lycSgmYWx0ZGV2LT5kZGV2LCBhbHRkZXYtPnNiX2lycSwKKwkJCSAgICAgIHBydi0+ZWNjX2lycV9oYW5kbGVyLAorCQkJICAgICAgSVJRRl9PTkVTSE9UIHwgSVJRRl9UUklHR0VSX0hJR0gsCisJCQkgICAgICBlY2NfbmFtZSwgYWx0ZGV2KTsKKwlpZiAocmMpIHsKKwkJZWRhY19wcmludGsoS0VSTl9FUlIsIEVEQUNfREVWSUNFLCAiUG9ydEIgU0JFUlIgSVJRIGVycm9yXG4iKTsKKwkJZ290byBlcnJfcmVsZWFzZV9ncm91cF8xOworCX0KKworCWFsdGRldi0+ZGJfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDMpOworCWlmICghYWx0ZGV2LT5kYl9pcnEpIHsKKwkJZWRhY19wcmludGsoS0VSTl9FUlIsIEVEQUNfREVWSUNFLCAiRXJyb3IgUG9ydEIgREJJUlEgYWxsb2NcbiIpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3JlbGVhc2VfZ3JvdXBfMTsKKwl9CisJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKCZhbHRkZXYtPmRkZXYsIGFsdGRldi0+ZGJfaXJxLAorCQkJICAgICAgcHJ2LT5lY2NfaXJxX2hhbmRsZXIsCisJCQkgICAgICBJUlFGX09ORVNIT1QgfCBJUlFGX1RSSUdHRVJfSElHSCwKKwkJCSAgICAgIGVjY19uYW1lLCBhbHRkZXYpOworCWlmIChyYykgeworCQllZGFjX3ByaW50ayhLRVJOX0VSUiwgRURBQ19ERVZJQ0UsICJQb3J0QiBEQkVSUiBJUlEgZXJyb3JcbiIpOworCQlnb3RvIGVycl9yZWxlYXNlX2dyb3VwXzE7CisJfQorCisJcmMgPSBlZGFjX2RldmljZV9hZGRfZGV2aWNlKGRjaSk7CisJaWYgKHJjKSB7CisJCWVkYWNfcHJpbnRrKEtFUk5fRVJSLCBFREFDX0RFVklDRSwKKwkJCSAgICAiZWRhY19kZXZpY2VfYWRkX2RldmljZSBwb3J0QiBmYWlsZWRcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlbGVhc2VfZ3JvdXBfMTsKKwl9CisJYWx0cl9jcmVhdGVfZWRhY2Rldl9kYmdmcyhkY2ksIHBydik7CisKKwlsaXN0X2FkZCgmYWx0ZGV2LT5uZXh0LCAmYWx0ZGV2LT5lZGFjLT5hMTBfZWNjX2RldmljZXMpOworCisJZGV2cmVzX3JlbW92ZV9ncm91cCgmYWx0ZGV2LT5kZGV2LCBhbHRyX3BvcnRiX3NldHVwKTsKKworCXJldHVybiAwOworCitlcnJfcmVsZWFzZV9ncm91cF8xOgorCWVkYWNfZGV2aWNlX2ZyZWVfY3RsX2luZm8oZGNpKTsKKwlkZXZyZXNfcmVsZWFzZV9ncm91cCgmYWx0ZGV2LT5kZGV2LCBhbHRyX3BvcnRiX3NldHVwKTsKKwllZGFjX3ByaW50ayhLRVJOX0VSUiwgRURBQ19ERVZJQ0UsCisJCSAgICAiJXM6RXJyb3Igc2V0dGluZyB1cCBFREFDIGRldmljZTogJWRcbiIsIGVjY19uYW1lLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYWx0cl9lZGFjX2ExMF9lY2NfaXJxX3BvcnRiKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgYWx0cl9lZGFjX2RldmljZV9kZXYgKmFkID0gZGV2X2lkOworCXZvaWQgX19pb21lbSAgKmJhc2UgPSBhZC0+YmFzZTsKKwljb25zdCBzdHJ1Y3QgZWRhY19kZXZpY2VfcHJ2X2RhdGEgKnByaXYgPSBhZC0+ZGF0YTsKKworCWlmIChpcnEgPT0gYWQtPnNiX2lycSkgeworCQl3cml0ZWwocHJpdi0+Y2VfY2xlYXJfbWFzaywKKwkJICAgICAgIGJhc2UgKyBBTFRSX0ExMF9FQ0NfSU5UU1RBVF9PRlNUKTsKKwkJZWRhY19kZXZpY2VfaGFuZGxlX2NlKGFkLT5lZGFjX2RldiwgMCwgMCwgYWQtPmVkYWNfZGV2X25hbWUpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlIGlmIChpcnEgPT0gYWQtPmRiX2lycSkgeworCQl3cml0ZWwocHJpdi0+dWVfY2xlYXJfbWFzaywKKwkJICAgICAgIGJhc2UgKyBBTFRSX0ExMF9FQ0NfSU5UU1RBVF9PRlNUKTsKKwkJZWRhY19kZXZpY2VfaGFuZGxlX3VlKGFkLT5lZGFjX2RldiwgMCwgMCwgYWQtPmVkYWNfZGV2X25hbWUpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJV0FSTl9PTkNFKDEsICJVbmhhbmRsZWQgSVJRJWQgb24gUG9ydCBCLiIsIGlycSk7CisKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWRhY19kZXZpY2VfcHJ2X2RhdGEgYTEwX3NkbW1jZWNjYV9kYXRhID0geworCS5zZXR1cCA9IGFsdHJfcG9ydGJfc2V0dXAsCisJLmNlX2NsZWFyX21hc2sgPSBBTFRSX0ExMF9FQ0NfU0VSUlBFTkEsCisJLnVlX2NsZWFyX21hc2sgPSBBTFRSX0ExMF9FQ0NfREVSUlBFTkEsCisJLmVjY19lbmFibGVfbWFzayA9IEFMVFJfQTEwX0NPTU1PTl9FQ0NfRU5fQ1RMLAorCS5lY2NfZW5fb2ZzdCA9IEFMVFJfQTEwX0VDQ19DVFJMX09GU1QsCisJLmNlX3NldF9tYXNrID0gQUxUUl9BMTBfRUNDX1NFUlJQRU5BLAorCS51ZV9zZXRfbWFzayA9IEFMVFJfQTEwX0VDQ19ERVJSUEVOQSwKKwkuc2V0X2Vycl9vZnN0ID0gQUxUUl9BMTBfRUNDX0lOVFRFU1RfT0ZTVCwKKwkuZWNjX2lycV9oYW5kbGVyID0gYWx0cl9lZGFjX2ExMF9lY2NfaXJxLAorCS5pbmplY3RfZm9wcyA9ICZhbHRyX2VkYWNfYTEwX2RldmljZV9pbmplY3RfZm9wcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWRhY19kZXZpY2VfcHJ2X2RhdGEgYTEwX3NkbW1jZWNjYl9kYXRhID0geworCS5zZXR1cCA9IGFsdHJfcG9ydGJfc2V0dXAsCisJLmNlX2NsZWFyX21hc2sgPSBBTFRSX0ExMF9FQ0NfU0VSUlBFTkIsCisJLnVlX2NsZWFyX21hc2sgPSBBTFRSX0ExMF9FQ0NfREVSUlBFTkIsCisJLmVjY19lbmFibGVfbWFzayA9IEFMVFJfQTEwX0NPTU1PTl9FQ0NfRU5fQ1RMLAorCS5lY2NfZW5fb2ZzdCA9IEFMVFJfQTEwX0VDQ19DVFJMX09GU1QsCisJLmNlX3NldF9tYXNrID0gQUxUUl9BMTBfRUNDX1RTRVJSQiwKKwkudWVfc2V0X21hc2sgPSBBTFRSX0ExMF9FQ0NfVERFUlJCLAorCS5zZXRfZXJyX29mc3QgPSBBTFRSX0ExMF9FQ0NfSU5UVEVTVF9PRlNULAorCS5lY2NfaXJxX2hhbmRsZXIgPSBhbHRyX2VkYWNfYTEwX2VjY19pcnFfcG9ydGIsCisJLmluamVjdF9mb3BzID0gJmFsdHJfZWRhY19hMTBfZGV2aWNlX2luamVjdF9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc29jZnBnYV9pbml0X3NkbW1jX2VjYyh2b2lkKQoreworCWludCByYyA9IC1FTk9ERVY7CisJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsCisJCQkJCQkiYWx0cixzb2NmcGdhLXNkbW1jLWVjYyIpOworCWlmICghY2hpbGQpIHsKKwkJZWRhY19wcmludGsoS0VSTl9XQVJOSU5HLCBFREFDX0RFVklDRSwgIlNETU1DIG5vZGUgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCFvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKGNoaWxkKSkKKwkJZ290byBleGl0OworCisJaWYgKHZhbGlkYXRlX3BhcmVudF9hdmFpbGFibGUoY2hpbGQpKQorCQlnb3RvIGV4aXQ7CisKKwlyYyA9IGFsdHJfaW5pdF9hMTBfZWNjX2Jsb2NrKGNoaWxkLCBBTFRSX0ExMF9TRE1NQ19JUlFfTUFTSywKKwkJCQkgICAgIGExMF9zZG1tY2VjY2FfZGF0YS5lY2NfZW5hYmxlX21hc2ssIDEpOworZXhpdDoKKwlvZl9ub2RlX3B1dChjaGlsZCk7CisJcmV0dXJuIHJjOworfQorCitlYXJseV9pbml0Y2FsbChzb2NmcGdhX2luaXRfc2RtbWNfZWNjKTsKKworI2VuZGlmCS8qIENPTkZJR19FREFDX0FMVEVSQV9TRE1NQyAqLworCiAvKioqKioqKioqKioqKioqKioqKioqIEFycmlhMTAgRURBQyBEZXZpY2UgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhbHRyX2VkYWNfYTEwX2RldmljZV9vZl9tYXRjaFtdID0gewogI2lmZGVmIENPTkZJR19FREFDX0FMVEVSQV9MMkMKQEAgLTEyOTgsNiArMTU3OSwyMSBAQAogCXsgLmNvbXBhdGlibGUgPSAiYWx0cixzb2NmcGdhLWV0aC1tYWMtZWNjIiwKIAkgIC5kYXRhID0gJmExMF9lbmV0ZWNjX2RhdGEgfSwKICNlbmRpZgorI2lmZGVmIENPTkZJR19FREFDX0FMVEVSQV9OQU5ECisJeyAuY29tcGF0aWJsZSA9ICJhbHRyLHNvY2ZwZ2EtbmFuZC1lY2MiLCAuZGF0YSA9ICZhMTBfbmFuZGVjY19kYXRhIH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRURBQ19BTFRFUkFfRE1BCisJeyAuY29tcGF0aWJsZSA9ICJhbHRyLHNvY2ZwZ2EtZG1hLWVjYyIsIC5kYXRhID0gJmExMF9kbWFlY2NfZGF0YSB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0VEQUNfQUxURVJBX1VTQgorCXsgLmNvbXBhdGlibGUgPSAiYWx0cixzb2NmcGdhLXVzYi1lY2MiLCAuZGF0YSA9ICZhMTBfdXNiZWNjX2RhdGEgfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FREFDX0FMVEVSQV9RU1BJCisJeyAuY29tcGF0aWJsZSA9ICJhbHRyLHNvY2ZwZ2EtcXNwaS1lY2MiLCAuZGF0YSA9ICZhMTBfcXNwaWVjY19kYXRhIH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRURBQ19BTFRFUkFfU0RNTUMKKwl7IC5jb21wYXRpYmxlID0gImFsdHIsc29jZnBnYS1zZG1tYy1lY2MiLCAuZGF0YSA9ICZhMTBfc2RtbWNlY2NhX2RhdGEgfSwKKyNlbmRpZgogCXt9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFsdHJfZWRhY19hMTBfZGV2aWNlX29mX21hdGNoKTsKQEAgLTE0NTEsMTEgKzE3NDcsMTEgQEAKIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIGVycl9yZWxlYXNlX2dyb3VwMTsKIAl9Ci0JcmMgPSBkZXZtX3JlcXVlc3RfaXJxKGVkYWMtPmRldiwgYWx0ZGV2LT5zYl9pcnEsCi0JCQkgICAgICBwcnYtPmVjY19pcnFfaGFuZGxlciwKLQkJCSAgICAgIElSUUZfU0hBUkVELCBlY2NfbmFtZSwgYWx0ZGV2KTsKKwlyYyA9IGRldm1fcmVxdWVzdF9pcnEoZWRhYy0+ZGV2LCBhbHRkZXYtPnNiX2lycSwgcHJ2LT5lY2NfaXJxX2hhbmRsZXIsCisJCQkgICAgICBJUlFGX09ORVNIT1QgfCBJUlFGX1RSSUdHRVJfSElHSCwKKwkJCSAgICAgIGVjY19uYW1lLCBhbHRkZXYpOwogCWlmIChyYykgewotCQllZGFjX3ByaW50ayhLRVJOX0VSUiwgRURBQ19ERVZJQ0UsICJObyBEQkVSUiBJUlEgcmVzb3VyY2VcbiIpOworCQllZGFjX3ByaW50ayhLRVJOX0VSUiwgRURBQ19ERVZJQ0UsICJObyBTQkVSUiBJUlEgcmVzb3VyY2VcbiIpOwogCQlnb3RvIGVycl9yZWxlYXNlX2dyb3VwMTsKIAl9CiAKQEAgLTE0NjUsOSArMTc2MSw5IEBACiAJCXJjID0gLUVOT0RFVjsKIAkJZ290byBlcnJfcmVsZWFzZV9ncm91cDE7CiAJfQotCXJjID0gZGV2bV9yZXF1ZXN0X2lycShlZGFjLT5kZXYsIGFsdGRldi0+ZGJfaXJxLAotCQkJICAgICAgcHJ2LT5lY2NfaXJxX2hhbmRsZXIsCi0JCQkgICAgICBJUlFGX1NIQVJFRCwgZWNjX25hbWUsIGFsdGRldik7CisJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKGVkYWMtPmRldiwgYWx0ZGV2LT5kYl9pcnEsIHBydi0+ZWNjX2lycV9oYW5kbGVyLAorCQkJICAgICAgSVJRRl9PTkVTSE9UIHwgSVJRRl9UUklHR0VSX0hJR0gsCisJCQkgICAgICBlY2NfbmFtZSwgYWx0ZGV2KTsKIAlpZiAocmMpIHsKIAkJZWRhY19wcmludGsoS0VSTl9FUlIsIEVEQUNfREVWSUNFLCAiTm8gREJFUlIgSVJRIHJlc291cmNlXG4iKTsKIAkJZ290byBlcnJfcmVsZWFzZV9ncm91cDE7CkBAIC0xNTI2LDcgKzE4MjIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgYTEwX2VjY21ncl9pY19vcHMgPSB7CitzdGF0aWMgc3RydWN0IGlycV9kb21haW5fb3BzIGExMF9lY2NtZ3JfaWNfb3BzID0gewogCS5tYXAgPSBhMTBfZWNjbWdyX2lycWRvbWFpbl9tYXAsCiAJLnhsYXRlID0gaXJxX2RvbWFpbl94bGF0ZV90d29jZWxsLAogfTsKQEAgLTE1ODQsMTUgKzE4ODAsMTkgQEAKIAlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKHBkZXYtPmRldi5vZl9ub2RlLCBjaGlsZCkgewogCQlpZiAoIW9mX2RldmljZV9pc19hdmFpbGFibGUoY2hpbGQpKQogCQkJY29udGludWU7Ci0JCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjaGlsZCwgImFsdHIsc29jZnBnYS1hMTAtbDItZWNjIikpCisKKwkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNoaWxkLCAiYWx0cixzb2NmcGdhLWExMC1sMi1lY2MiKSB8fCAKKwkJICAgIG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNoaWxkLCAiYWx0cixzb2NmcGdhLWExMC1vY3JhbS1lY2MiKSB8fAorCQkgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoY2hpbGQsICJhbHRyLHNvY2ZwZ2EtZXRoLW1hYy1lY2MiKSB8fAorCQkgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoY2hpbGQsICJhbHRyLHNvY2ZwZ2EtbmFuZC1lY2MiKSB8fAorCQkgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoY2hpbGQsICJhbHRyLHNvY2ZwZ2EtZG1hLWVjYyIpIHx8CisJCSAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjaGlsZCwgImFsdHIsc29jZnBnYS11c2ItZWNjIikgfHwKKwkJICAgIG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNoaWxkLCAiYWx0cixzb2NmcGdhLXFzcGktZWNjIikgfHwKKwkJICAgIG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNoaWxkLCAiYWx0cixzb2NmcGdhLXNkbW1jLWVjYyIpKQorCiAJCQlhbHRyX2VkYWNfYTEwX2RldmljZV9hZGQoZWRhYywgY2hpbGQpOwotCQllbHNlIGlmICgob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoY2hpbGQsCi0JCQkJCSJhbHRyLHNvY2ZwZ2EtYTEwLW9jcmFtLWVjYyIpKSB8fAotCQkJIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjaGlsZCwKLQkJCQkJImFsdHIsc29jZnBnYS1ldGgtbWFjLWVjYyIpKSkKLQkJCWFsdHJfZWRhY19hMTBfZGV2aWNlX2FkZChlZGFjLCBjaGlsZCk7Ci0JCWVsc2UgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNoaWxkLAotCQkJCQkJICJhbHRyLHNkcmFtLWVkYWMtYTEwIikpCisKKwkJZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoY2hpbGQsICJhbHRyLHNkcmFtLWVkYWMtYTEwIikpCiAJCQlvZl9wbGF0Zm9ybV9wb3B1bGF0ZShwZGV2LT5kZXYub2Zfbm9kZSwKIAkJCQkJICAgICBhbHRyX3NkcmFtX2N0cmxfb2ZfbWF0Y2gsCiAJCQkJCSAgICAgTlVMTCwgJnBkZXYtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYWx0ZXJhX2VkYWMuaCBiL2RyaXZlcnMvZWRhYy9hbHRlcmFfZWRhYy5oCmluZGV4IDY4N2Q4ZTcuLmNiYzk2MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9hbHRlcmFfZWRhYy5oCisrKyBiL2RyaXZlcnMvZWRhYy9hbHRlcmFfZWRhYy5oCkBAIC0yNTAsNiArMjUwLDggQEAKICNkZWZpbmUgQUxUUl9BMTBfRUNDX0lOVFRFU1RfT0ZTVCAgICAgICAweDI0CiAjZGVmaW5lIEFMVFJfQTEwX0VDQ19UU0VSUkEgICAgICAgICAgICAgQklUKDApCiAjZGVmaW5lIEFMVFJfQTEwX0VDQ19UREVSUkEgICAgICAgICAgICAgQklUKDgpCisjZGVmaW5lIEFMVFJfQTEwX0VDQ19UU0VSUkIgICAgICAgICAgICAgQklUKDE2KQorI2RlZmluZSBBTFRSX0ExMF9FQ0NfVERFUlJCICAgICAgICAgICAgIEJJVCgyNCkKIAogLyogRUNDIE1hbmFnZXIgRGVmaW5lcyAqLwogI2RlZmluZSBBMTBfU1lTTUdSX0VDQ19JTlRNQVNLX1NFVF9PRlNUICAgMHg5NApAQCAtMjg4LDYgKzI5MCw5IEBACiAvKiBBcnJpYSAxMCBFdGhlcm5ldCBFQ0MgTWFuYWdlbWVudCBHcm91cCBEZWZpbmVzICovCiAjZGVmaW5lIEFMVFJfQTEwX0NPTU1PTl9FQ0NfRU5fQ1RMICAgICAgQklUKDApCiAKKy8qIEFycmlhIDEwIFNETU1DIEVDQyBNYW5hZ2VtZW50IEdyb3VwIERlZmluZXMgKi8KKyNkZWZpbmUgQUxUUl9BMTBfU0RNTUNfSVJRX01BU0sgICAgICAgICAoQklUKDE2KSB8IEJJVCgxNSkpCisKIC8qIEExMCBFQ0MgQ29udHJvbGxlciBtZW1vcnkgaW5pdGlhbGl6YXRpb24gdGltZW91dCAqLwogI2RlZmluZSBBTFRSX0ExMF9FQ0NfSU5JVF9XQVRDSERPR18xMFVTICAgICAgMTAwMDAKIApAQCAtMjk4LDcgKzMwMyw2IEBACiAJaW50IGNlX2NsZWFyX21hc2s7CiAJaW50IHVlX2NsZWFyX21hc2s7CiAJaW50IGlycV9zdGF0dXNfbWFzazsKLQljaGFyIGRiZ2ZzX25hbWVbMjBdOwogCXZvaWQgKiAoKmFsbG9jX21lbSkoc2l6ZV90IHNpemUsIHZvaWQgKipvdGhlcik7CiAJdm9pZCAoKmZyZWVfbWVtKSh2b2lkICpwLCBzaXplX3Qgc2l6ZSwgdm9pZCAqb3RoZXIpOwogCWludCBlY2NfZW5hYmxlX21hc2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuYwppbmRleCA4YzBlYzIxLi5lZTE4MWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmMKQEAgLTE0MjUsMTEgKzE0MjUsMTcgQEAKIAogCQlpZiAoaW50bHZfYWRkciAmIDB4MikgewogCQkJdTggc2hpZnQgPSBpbnRsdl9hZGRyICYgMHgxID8gOSA6IDY7Ci0JCQl1MzIgdGVtcCA9IGh3ZWlnaHRfbG9uZygodTMyKSAoKHN5c19hZGRyID4+IDE2KSAmIDB4MUYpKSAlIDI7CisJCQl1MzIgdGVtcCA9IGh3ZWlnaHRfbG9uZygodTMyKSAoKHN5c19hZGRyID4+IDE2KSAmIDB4MUYpKSAmIDE7CiAKIAkJCXJldHVybiAoKHN5c19hZGRyID4+IHNoaWZ0KSAmIDEpIF4gdGVtcDsKIAkJfQogCisJCWlmIChpbnRsdl9hZGRyICYgMHg0KSB7CisJCQl1OCBzaGlmdCA9IGludGx2X2FkZHIgJiAweDEgPyA5IDogODsKKworCQkJcmV0dXJuIChzeXNfYWRkciA+PiBzaGlmdCkgJiAxOworCQl9CisKIAkJcmV0dXJuIChzeXNfYWRkciA+PiAoMTIgKyBod2VpZ2h0OChpbnRsdl9lbikpKSAmIDE7CiAJfQogCkBAIC0xNzI2LDggKzE3MzIsMTEgQEAKIAlpZiAoIShudW1fZGN0c19pbnRsdiAlIDIgPT0gMCkgfHwgKG51bV9kY3RzX2ludGx2ID4gNCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JY2hhbm5lbCA9IGYxNV9tMzBoX2RldGVybWluZV9jaGFubmVsKHB2dCwgc3lzX2FkZHIsIGludGx2X2VuLAotCQkJCQkgICAgIG51bV9kY3RzX2ludGx2LCBkY3Rfc2VsKTsKKwlpZiAocHZ0LT5tb2RlbCA+PSAweDYwKQorCQljaGFubmVsID0gZjF4X2RldGVybWluZV9jaGFubmVsKHB2dCwgc3lzX2FkZHIsIGZhbHNlLCBpbnRsdl9lbik7CisJZWxzZQorCQljaGFubmVsID0gZjE1X20zMGhfZGV0ZXJtaW5lX2NoYW5uZWwocHZ0LCBzeXNfYWRkciwgaW50bHZfZW4sCisJCQkJCQkgICAgIG51bV9kY3RzX2ludGx2LCBkY3Rfc2VsKTsKIAogCS8qIFZlcmlmeSB3ZSBzdGF5IHdpdGhpbiB0aGUgTUFYIG51bWJlciBvZiBjaGFubmVscyBhbGxvd2VkICovCiAJaWYgKGNoYW5uZWwgPiAzKQpAQCAtMjk2MSw2ICsyOTcwLDE1IEBACiAJfQogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHg4Nl9jcHVfaWQgYW1kNjRfY3B1aWRzW10gPSB7CisJeyBYODZfVkVORE9SX0FNRCwgMHhGLAlYODZfTU9ERUxfQU5ZLAlYODZfRkVBVFVSRV9BTlksIDAgfSwKKwl7IFg4Nl9WRU5ET1JfQU1ELCAweDEwLCBYODZfTU9ERUxfQU5ZLAlYODZfRkVBVFVSRV9BTlksIDAgfSwKKwl7IFg4Nl9WRU5ET1JfQU1ELCAweDE1LCBYODZfTU9ERUxfQU5ZLAlYODZfRkVBVFVSRV9BTlksIDAgfSwKKwl7IFg4Nl9WRU5ET1JfQU1ELCAweDE2LCBYODZfTU9ERUxfQU5ZLAlYODZfRkVBVFVSRV9BTlksIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHg4NmNwdSwgYW1kNjRfY3B1aWRzKTsKKwogc3RhdGljIGludCBfX2luaXQgYW1kNjRfZWRhY19pbml0KHZvaWQpCiB7CiAJaW50IGVyciA9IC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZnNsX2Rkcl9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvZnNsX2Rkcl9lZGFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc3NGY1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZWRhYy9mc2xfZGRyX2VkYWMuYwpAQCAtMCwwICsxLDYzMyBAQAorLyoKKyAqIEZyZWVzY2FsZSBNZW1vcnkgQ29udHJvbGxlciBrZXJuZWwgbW9kdWxlCisgKgorICogU3VwcG9ydCBQb3dlci1iYXNlZCBTb0NzIGluY2x1ZGluZyBNUEM4NXh4LCBNUEM4Nnh4LCBNUEM4M3h4IGFuZAorICogQVJNLWJhc2VkIExheWVyc2NhcGUgU29DcyBpbmNsdWRpbmcgTFMyeHh4LiBPcmlnaW5hbGx5IHNwbGl0CisgKiBvdXQgZnJvbSBtcGM4NXh4X2VkYWMgRURBQyBkcml2ZXIuCisgKgorICogUGFydHMgQ29weXJpZ2h0ZWQgKGMpIDIwMTMgYnkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBBdXRob3I6IERhdmUgSmlhbmcgPGRqaWFuZ0BtdmlzdGEuY29tPgorICoKKyAqIDIwMDYtMjAwNyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvZWRhYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorCisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSAiZWRhY19tb2R1bGUuaCIKKyNpbmNsdWRlICJlZGFjX2NvcmUuaCIKKyNpbmNsdWRlICJmc2xfZGRyX2VkYWMuaCIKKworI2RlZmluZSBFREFDX01PRF9TVFIJImZzbF9kZHJfZWRhYyIKKworc3RhdGljIGludCBlZGFjX21jX2lkeDsKKworc3RhdGljIHUzMiBvcmlnX2Rkcl9lcnJfZGlzYWJsZTsKK3N0YXRpYyB1MzIgb3JpZ19kZHJfZXJyX3NiZTsKK3N0YXRpYyBib29sIGxpdHRsZV9lbmRpYW47CisKK3N0YXRpYyBpbmxpbmUgdTMyIGRkcl9pbjMyKHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlyZXR1cm4gbGl0dGxlX2VuZGlhbiA/IGlvcmVhZDMyKGFkZHIpIDogaW9yZWFkMzJiZShhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRkcl9vdXQzMih2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiB2YWx1ZSkKK3sKKwlpZiAobGl0dGxlX2VuZGlhbikKKwkJaW93cml0ZTMyKHZhbHVlLCBhZGRyKTsKKwllbHNlCisJCWlvd3JpdGUzMmJlKHZhbHVlLCBhZGRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBNQyBTWVNGUyBwYXJ0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSB0b19tY2koaykgY29udGFpbmVyX29mKGssIHN0cnVjdCBtZW1fY3RsX2luZm8sIGRldikKKworc3RhdGljIHNzaXplX3QgZnNsX21jX2luamVjdF9kYXRhX2hpX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptYXR0ciwKKwkJCQkJICBjaGFyICpkYXRhKQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHRvX21jaShkZXYpOworCXN0cnVjdCBmc2xfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKwlyZXR1cm4gc3ByaW50ZihkYXRhLCAiMHglMDh4IiwKKwkJICAgICAgIGRkcl9pbjMyKHBkYXRhLT5tY192YmFzZSArIEZTTF9NQ19EQVRBX0VSUl9JTkpFQ1RfSEkpKTsKK30KKworc3RhdGljIHNzaXplX3QgZnNsX21jX2luamVjdF9kYXRhX2xvX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptYXR0ciwKKwkJCQkJICAgICAgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSB0b19tY2koZGV2KTsKKwlzdHJ1Y3QgZnNsX21jX3BkYXRhICpwZGF0YSA9IG1jaS0+cHZ0X2luZm87CisJcmV0dXJuIHNwcmludGYoZGF0YSwgIjB4JTA4eCIsCisJCSAgICAgICBkZHJfaW4zMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfREFUQV9FUlJfSU5KRUNUX0xPKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZzbF9tY19pbmplY3RfY3RybF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKm1hdHRyLAorCQkJCQkgICBjaGFyICpkYXRhKQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHRvX21jaShkZXYpOworCXN0cnVjdCBmc2xfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKwlyZXR1cm4gc3ByaW50ZihkYXRhLCAiMHglMDh4IiwKKwkJICAgICAgIGRkcl9pbjMyKHBkYXRhLT5tY192YmFzZSArIEZTTF9NQ19FQ0NfRVJSX0lOSkVDVCkpOworfQorCitzdGF0aWMgc3NpemVfdCBmc2xfbWNfaW5qZWN0X2RhdGFfaGlfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gdG9fbWNpKGRldik7CisJc3RydWN0IGZzbF9tY19wZGF0YSAqcGRhdGEgPSBtY2ktPnB2dF9pbmZvOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByYzsKKworCWlmIChpc2RpZ2l0KCpkYXRhKSkgeworCQlyYyA9IGtzdHJ0b3VsKGRhdGEsIDAsICZ2YWwpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJZGRyX291dDMyKHBkYXRhLT5tY192YmFzZSArIEZTTF9NQ19EQVRBX0VSUl9JTkpFQ1RfSEksIHZhbCk7CisJCXJldHVybiBjb3VudDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZzbF9tY19pbmplY3RfZGF0YV9sb19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptYXR0ciwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSB0b19tY2koZGV2KTsKKwlzdHJ1Y3QgZnNsX21jX3BkYXRhICpwZGF0YSA9IG1jaS0+cHZ0X2luZm87CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJjOworCisJaWYgKGlzZGlnaXQoKmRhdGEpKSB7CisJCXJjID0ga3N0cnRvdWwoZGF0YSwgMCwgJnZhbCk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlkZHJfb3V0MzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0RBVEFfRVJSX0lOSkVDVF9MTywgdmFsKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgZnNsX21jX2luamVjdF9jdHJsX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKm1hdHRyLAorCQkJCQkgICAgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHRvX21jaShkZXYpOworCXN0cnVjdCBmc2xfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgcmM7CisKKwlpZiAoaXNkaWdpdCgqZGF0YSkpIHsKKwkJcmMgPSBrc3RydG91bChkYXRhLCAwLCAmdmFsKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCWRkcl9vdXQzMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfRUNDX0VSUl9JTkpFQ1QsIHZhbCk7CisJCXJldHVybiBjb3VudDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0RFVklDRV9BVFRSKGluamVjdF9kYXRhX2hpLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkgICAgZnNsX21jX2luamVjdF9kYXRhX2hpX3Nob3csIGZzbF9tY19pbmplY3RfZGF0YV9oaV9zdG9yZSk7CitERVZJQ0VfQVRUUihpbmplY3RfZGF0YV9sbywgU19JUlVHTyB8IFNfSVdVU1IsCisJICAgIGZzbF9tY19pbmplY3RfZGF0YV9sb19zaG93LCBmc2xfbWNfaW5qZWN0X2RhdGFfbG9fc3RvcmUpOworREVWSUNFX0FUVFIoaW5qZWN0X2N0cmwsIFNfSVJVR08gfCBTX0lXVVNSLAorCSAgICBmc2xfbWNfaW5qZWN0X2N0cmxfc2hvdywgZnNsX21jX2luamVjdF9jdHJsX3N0b3JlKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmZzbF9kZHJfZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2luamVjdF9kYXRhX2hpLmF0dHIsCisJJmRldl9hdHRyX2luamVjdF9kYXRhX2xvLmF0dHIsCisJJmRldl9hdHRyX2luamVjdF9jdHJsLmF0dHIsCisJTlVMTAorfTsKKworQVRUUklCVVRFX0dST1VQUyhmc2xfZGRyX2Rldik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1DIEVyciBkZXZpY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGFrZW4gZnJvbSB0YWJsZSA4LTU1IGluIHRoZSBNUEM4NjQxIFVzZXIncyBNYW51YWwgYW5kL29yIDktNjEgaW4gdGhlCisgKiBNUEM4NTcyIFVzZXIncyBNYW51YWwuICBFYWNoIGxpbmUgcmVwcmVzZW50cyBhIHN5bmRyb21lIGJpdCBjb2x1bW4gYXMgYQorICogNjQtYml0IHZhbHVlLCBidXQgc3BsaXQgaW50byBhbiB1cHBlciBhbmQgbG93ZXIgMzItYml0IGNodW5rLiAgVGhlIGxhYmVscworICogYmVsb3cgY29ycmVzcG9uZCB0byBGcmVlc2NhbGUncyBtYW51YWxzLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGVjY190YWJsZVsxNl0gPSB7CisJLyogTVNCICAgICAgICAgICBMU0IgKi8KKwkvKiBbMDozMV0gICAgWzMyOjYzXSAqLworCTB4ZjAwZmUxMWUsIDB4YzMzYzBmZjcsCS8qIFN5bmRyb21lIGJpdCA3ICovCisJMHgwMGZmMDBmZiwgMHgwMGZmZjBmZiwKKwkweDBmMGYwZjBmLCAweDBmMGZmZjAwLAorCTB4MTExMTMzMzMsIDB4Nzc3NzAwMGYsCisJMHgyMjIyNDQ0NCwgMHg4ODg4MjIyZiwKKwkweDQ0NDQ4ODg4LCAweGZmZmY0NDQxLAorCTB4ODg4OGZmZmYsIDB4MTExMTg4ODIsCisJMHhmZmZmMTExMSwgMHgyMjIyMTExNCwJLyogU3luZHJvbWUgYml0IDAgKi8KK307CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIGNvcnJlY3QgRUNDIHZhbHVlIGZvciBhIDY0LWJpdCB2YWx1ZSBzcGVjaWZpZWQgYnkgaGlnaDpsb3cKKyAqLworc3RhdGljIHU4IGNhbGN1bGF0ZV9lY2ModTMyIGhpZ2gsIHUzMiBsb3cpCit7CisJdTMyIG1hc2tfbG93OworCXUzMiBtYXNrX2hpZ2g7CisJaW50IGJpdF9jbnQ7CisJdTggZWNjID0gMDsKKwlpbnQgaTsKKwlpbnQgajsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJbWFza19oaWdoID0gZWNjX3RhYmxlW2kgKiAyXTsKKwkJbWFza19sb3cgPSBlY2NfdGFibGVbaSAqIDIgKyAxXTsKKwkJYml0X2NudCA9IDA7CisKKwkJZm9yIChqID0gMDsgaiA8IDMyOyBqKyspIHsKKwkJCWlmICgobWFza19oaWdoID4+IGopICYgMSkKKwkJCQliaXRfY250IF49IChoaWdoID4+IGopICYgMTsKKwkJCWlmICgobWFza19sb3cgPj4gaikgJiAxKQorCQkJCWJpdF9jbnQgXj0gKGxvdyA+PiBqKSAmIDE7CisJCX0KKworCQllY2MgfD0gYml0X2NudCA8PCBpOworCX0KKworCXJldHVybiBlY2M7Cit9CisKKy8qCisgKiBDcmVhdGUgdGhlIHN5bmRyb21lIGNvZGUgd2hpY2ggaXMgZ2VuZXJhdGVkIGlmIHRoZSBkYXRhIGxpbmUgc3BlY2lmaWVkIGJ5CisgKiAnYml0JyBmYWlsZWQuICBFZyBnZW5lcmF0ZSBhbiA4LWJpdCBjb2RlcyBzZWVuIGluIFRhYmxlIDgtNTUgaW4gdGhlIE1QQzg2NDEKKyAqIFVzZXIncyBNYW51YWwgYW5kIDktNjEgaW4gdGhlIE1QQzg1NzIgVXNlcidzIE1hbnVhbC4KKyAqLworc3RhdGljIHU4IHN5bmRyb21lX2Zyb21fYml0KHVuc2lnbmVkIGludCBiaXQpIHsKKwlpbnQgaTsKKwl1OCBzeW5kcm9tZSA9IDA7CisKKwkvKgorCSAqIEN5Y2xlIHRocm91Z2ggdGhlIHVwcGVyIG9yIGxvd2VyIDMyLWJpdCBwb3J0aW9uIG9mIGVhY2ggdmFsdWUgaW4KKwkgKiBlY2NfdGFibGUgZGVwZW5kaW5nIG9uIGlmICdiaXQnIGlzIGluIHRoZSB1cHBlciBvciBsb3dlciBoYWxmIG9mCisJICogNjQtYml0IGRhdGEuCisJICovCisJZm9yIChpID0gYml0IDwgMzI7IGkgPCAxNjsgaSArPSAyKQorCQlzeW5kcm9tZSB8PSAoKGVjY190YWJsZVtpXSA+PiAoYml0ICUgMzIpKSAmIDEpIDw8IChpIC8gMik7CisKKwlyZXR1cm4gc3luZHJvbWU7Cit9CisKKy8qCisgKiBEZWNvZGUgZGF0YSBhbmQgZWNjIHN5bmRyb21lIHRvIGRldGVybWluZSB3aGF0IHdlbnQgd3JvbmcKKyAqIE5vdGU6IFRoaXMgY2FuIG9ubHkgZGVjb2RlIHNpbmdsZS1iaXQgZXJyb3JzCisgKi8KK3N0YXRpYyB2b2lkIHNiZV9lY2NfZGVjb2RlKHUzMiBjYXBfaGlnaCwgdTMyIGNhcF9sb3csIHUzMiBjYXBfZWNjLAorCQkgICAgICAgaW50ICpiYWRfZGF0YV9iaXQsIGludCAqYmFkX2VjY19iaXQpCit7CisJaW50IGk7CisJdTggc3luZHJvbWU7CisKKwkqYmFkX2RhdGFfYml0ID0gLTE7CisJKmJhZF9lY2NfYml0ID0gLTE7CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgRUNDIG9mIHRoZSBjYXB0dXJlZCBkYXRhIGFuZCBYT1IgaXQgd2l0aCB0aGUgY2FwdHVyZWQKKwkgKiBFQ0MgdG8gZmluZCBhbiBFQ0Mgc3luZHJvbWUgdmFsdWUgd2UgY2FuIHNlYXJjaCBmb3IKKwkgKi8KKwlzeW5kcm9tZSA9IGNhbGN1bGF0ZV9lY2MoY2FwX2hpZ2gsIGNhcF9sb3cpIF4gY2FwX2VjYzsKKworCS8qIENoZWNrIGlmIGEgZGF0YSBsaW5lIGlzIHN0dWNrLi4uICovCisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKwkJaWYgKHN5bmRyb21lID09IHN5bmRyb21lX2Zyb21fYml0KGkpKSB7CisJCQkqYmFkX2RhdGFfYml0ID0gaTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIElmIGRhdGEgaXMgY29ycmVjdCwgY2hlY2sgRUNDIGJpdHMgZm9yIGVycm9ycy4uLiAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKChzeW5kcm9tZSA+PiBpKSAmIDB4MSkgeworCQkJKmJhZF9lY2NfYml0ID0gaTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworI2RlZmluZSBtYWtlNjQoaGlnaCwgbG93KSAoKCh1NjQpKGhpZ2gpIDw8IDMyKSB8IChsb3cpKQorCitzdGF0aWMgdm9pZCBmc2xfbWNfY2hlY2soc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBmc2xfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKwlzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3c7CisJdTMyIGJ1c193aWR0aDsKKwl1MzIgZXJyX2RldGVjdDsKKwl1MzIgc3luZHJvbWU7CisJdTY0IGVycl9hZGRyOworCXUzMiBwZm47CisJaW50IHJvd19pbmRleDsKKwl1MzIgY2FwX2hpZ2g7CisJdTMyIGNhcF9sb3c7CisJaW50IGJhZF9kYXRhX2JpdDsKKwlpbnQgYmFkX2VjY19iaXQ7CisKKwllcnJfZGV0ZWN0ID0gZGRyX2luMzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0VSUl9ERVRFQ1QpOworCWlmICghZXJyX2RldGVjdCkKKwkJcmV0dXJuOworCisJZnNsX21jX3ByaW50ayhtY2ksIEtFUk5fRVJSLCAiRXJyIERldGVjdCBSZWdpc3RlcjogJSM4Ljh4XG4iLAorCQkgICAgICBlcnJfZGV0ZWN0KTsKKworCS8qIG5vIG1vcmUgcHJvY2Vzc2luZyBpZiBub3QgRUNDIGJpdCBlcnJvcnMgKi8KKwlpZiAoIShlcnJfZGV0ZWN0ICYgKEREUl9FREVfU0JFIHwgRERSX0VERV9NQkUpKSkgeworCQlkZHJfb3V0MzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0VSUl9ERVRFQ1QsIGVycl9kZXRlY3QpOworCQlyZXR1cm47CisJfQorCisJc3luZHJvbWUgPSBkZHJfaW4zMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfQ0FQVFVSRV9FQ0MpOworCisJLyogTWFzayBvZmYgYXBwcm9wcmlhdGUgYml0cyBvZiBzeW5kcm9tZSBiYXNlZCBvbiBidXMgd2lkdGggKi8KKwlidXNfd2lkdGggPSAoZGRyX2luMzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0REUl9TRFJBTV9DRkcpICYKKwkJICAgICBEU0NfREJXX01BU0spID8gMzIgOiA2NDsKKwlpZiAoYnVzX3dpZHRoID09IDY0KQorCQlzeW5kcm9tZSAmPSAweGZmOworCWVsc2UKKwkJc3luZHJvbWUgJj0gMHhmZmZmOworCisJZXJyX2FkZHIgPSBtYWtlNjQoCisJCWRkcl9pbjMyKHBkYXRhLT5tY192YmFzZSArIEZTTF9NQ19DQVBUVVJFX0VYVF9BRERSRVNTKSwKKwkJZGRyX2luMzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0NBUFRVUkVfQUREUkVTUykpOworCXBmbiA9IGVycl9hZGRyID4+IFBBR0VfU0hJRlQ7CisKKwlmb3IgKHJvd19pbmRleCA9IDA7IHJvd19pbmRleCA8IG1jaS0+bnJfY3Nyb3dzOyByb3dfaW5kZXgrKykgeworCQljc3JvdyA9IG1jaS0+Y3Nyb3dzW3Jvd19pbmRleF07CisJCWlmICgocGZuID49IGNzcm93LT5maXJzdF9wYWdlKSAmJiAocGZuIDw9IGNzcm93LT5sYXN0X3BhZ2UpKQorCQkJYnJlYWs7CisJfQorCisJY2FwX2hpZ2ggPSBkZHJfaW4zMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfQ0FQVFVSRV9EQVRBX0hJKTsKKwljYXBfbG93ID0gZGRyX2luMzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0NBUFRVUkVfREFUQV9MTyk7CisKKwkvKgorCSAqIEFuYWx5emUgc2luZ2xlLWJpdCBlcnJvcnMgb24gNjQtYml0IHdpZGUgYnVzZXMKKwkgKiBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgMzItYml0IHdpZGUgYnVzZXMKKwkgKi8KKwlpZiAoKGVycl9kZXRlY3QgJiBERFJfRURFX1NCRSkgJiYgKGJ1c193aWR0aCA9PSA2NCkpIHsKKwkJc2JlX2VjY19kZWNvZGUoY2FwX2hpZ2gsIGNhcF9sb3csIHN5bmRyb21lLAorCQkJCSZiYWRfZGF0YV9iaXQsICZiYWRfZWNjX2JpdCk7CisKKwkJaWYgKGJhZF9kYXRhX2JpdCAhPSAtMSkKKwkJCWZzbF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwKKwkJCQkiRmF1bHR5IERhdGEgYml0OiAlZFxuIiwgYmFkX2RhdGFfYml0KTsKKwkJaWYgKGJhZF9lY2NfYml0ICE9IC0xKQorCQkJZnNsX21jX3ByaW50ayhtY2ksIEtFUk5fRVJSLAorCQkJCSJGYXVsdHkgRUNDIGJpdDogJWRcbiIsIGJhZF9lY2NfYml0KTsKKworCQlmc2xfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsCisJCQkiRXhwZWN0ZWQgRGF0YSAvIEVDQzpcdCUjOC44eF8lMDh4IC8gJSMyLjJ4XG4iLAorCQkJY2FwX2hpZ2ggXiAoMSA8PCAoYmFkX2RhdGFfYml0IC0gMzIpKSwKKwkJCWNhcF9sb3cgXiAoMSA8PCBiYWRfZGF0YV9iaXQpLAorCQkJc3luZHJvbWUgXiAoMSA8PCBiYWRfZWNjX2JpdCkpOworCX0KKworCWZzbF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwKKwkJCSJDYXB0dXJlZCBEYXRhIC8gRUNDOlx0JSM4Ljh4XyUwOHggLyAlIzIuMnhcbiIsCisJCQljYXBfaGlnaCwgY2FwX2xvdywgc3luZHJvbWUpOworCWZzbF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwgIkVyciBhZGRyOiAlIzguOGxseFxuIiwgZXJyX2FkZHIpOworCWZzbF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwgIlBGTjogJSM4Ljh4XG4iLCBwZm4pOworCisJLyogd2UgYXJlIG91dCBvZiByYW5nZSAqLworCWlmIChyb3dfaW5kZXggPT0gbWNpLT5ucl9jc3Jvd3MpCisJCWZzbF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwgIlBGTiBvdXQgb2YgcmFuZ2UhXG4iKTsKKworCWlmIChlcnJfZGV0ZWN0ICYgRERSX0VERV9TQkUpCisJCWVkYWNfbWNfaGFuZGxlX2Vycm9yKEhXX0VWRU5UX0VSUl9DT1JSRUNURUQsIG1jaSwgMSwKKwkJCQkgICAgIHBmbiwgZXJyX2FkZHIgJiB+UEFHRV9NQVNLLCBzeW5kcm9tZSwKKwkJCQkgICAgIHJvd19pbmRleCwgMCwgLTEsCisJCQkJICAgICBtY2ktPmN0bF9uYW1lLCAiIik7CisKKwlpZiAoZXJyX2RldGVjdCAmIEREUl9FREVfTUJFKQorCQllZGFjX21jX2hhbmRsZV9lcnJvcihIV19FVkVOVF9FUlJfVU5DT1JSRUNURUQsIG1jaSwgMSwKKwkJCQkgICAgIHBmbiwgZXJyX2FkZHIgJiB+UEFHRV9NQVNLLCBzeW5kcm9tZSwKKwkJCQkgICAgIHJvd19pbmRleCwgMCwgLTEsCisJCQkJICAgICBtY2ktPmN0bF9uYW1lLCAiIik7CisKKwlkZHJfb3V0MzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0VSUl9ERVRFQ1QsIGVycl9kZXRlY3QpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZnNsX21jX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gZGV2X2lkOworCXN0cnVjdCBmc2xfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKwl1MzIgZXJyX2RldGVjdDsKKworCWVycl9kZXRlY3QgPSBkZHJfaW4zMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfRVJSX0RFVEVDVCk7CisJaWYgKCFlcnJfZGV0ZWN0KQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlmc2xfbWNfY2hlY2sobWNpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgZnNsX2Rkcl9pbml0X2Nzcm93cyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGZzbF9tY19wZGF0YSAqcGRhdGEgPSBtY2ktPnB2dF9pbmZvOworCXN0cnVjdCBjc3Jvd19pbmZvICpjc3JvdzsKKwlzdHJ1Y3QgZGltbV9pbmZvICpkaW1tOworCXUzMiBzZHJhbV9jdGw7CisJdTMyIHNkdHlwZTsKKwllbnVtIG1lbV90eXBlIG10eXBlOworCXUzMiBjc19ibmRzOworCWludCBpbmRleDsKKworCXNkcmFtX2N0bCA9IGRkcl9pbjMyKHBkYXRhLT5tY192YmFzZSArIEZTTF9NQ19ERFJfU0RSQU1fQ0ZHKTsKKworCXNkdHlwZSA9IHNkcmFtX2N0bCAmIERTQ19TRFRZUEVfTUFTSzsKKwlpZiAoc2RyYW1fY3RsICYgRFNDX1JEX0VOKSB7CisJCXN3aXRjaCAoc2R0eXBlKSB7CisJCWNhc2UgMHgwMjAwMDAwMDoKKwkJCW10eXBlID0gTUVNX1JERFI7CisJCQlicmVhazsKKwkJY2FzZSAweDAzMDAwMDAwOgorCQkJbXR5cGUgPSBNRU1fUkREUjI7CisJCQlicmVhazsKKwkJY2FzZSAweDA3MDAwMDAwOgorCQkJbXR5cGUgPSBNRU1fUkREUjM7CisJCQlicmVhazsKKwkJY2FzZSAweDA1MDAwMDAwOgorCQkJbXR5cGUgPSBNRU1fUkREUjQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW10eXBlID0gTUVNX1VOS05PV047CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoc2R0eXBlKSB7CisJCWNhc2UgMHgwMjAwMDAwMDoKKwkJCW10eXBlID0gTUVNX0REUjsKKwkJCWJyZWFrOworCQljYXNlIDB4MDMwMDAwMDA6CisJCQltdHlwZSA9IE1FTV9ERFIyOworCQkJYnJlYWs7CisJCWNhc2UgMHgwNzAwMDAwMDoKKwkJCW10eXBlID0gTUVNX0REUjM7CisJCQlicmVhazsKKwkJY2FzZSAweDA1MDAwMDAwOgorCQkJbXR5cGUgPSBNRU1fRERSNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbXR5cGUgPSBNRU1fVU5LTk9XTjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbWNpLT5ucl9jc3Jvd3M7IGluZGV4KyspIHsKKwkJdTMyIHN0YXJ0OworCQl1MzIgZW5kOworCisJCWNzcm93ID0gbWNpLT5jc3Jvd3NbaW5kZXhdOworCQlkaW1tID0gY3Nyb3ctPmNoYW5uZWxzWzBdLT5kaW1tOworCisJCWNzX2JuZHMgPSBkZHJfaW4zMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfQ1NfQk5EU18wICsKKwkJCQkgICAoaW5kZXggKiBGU0xfTUNfQ1NfQk5EU19PRlMpKTsKKworCQlzdGFydCA9IChjc19ibmRzICYgMHhmZmZmMDAwMCkgPj4gMTY7CisJCWVuZCAgID0gKGNzX2JuZHMgJiAweDAwMDBmZmZmKTsKKworCQlpZiAoc3RhcnQgPT0gZW5kKQorCQkJY29udGludWU7CS8qIG5vdCBwb3B1bGF0ZWQgKi8KKworCQlzdGFydCA8PD0gKDI0IC0gUEFHRV9TSElGVCk7CisJCWVuZCAgIDw8PSAoMjQgLSBQQUdFX1NISUZUKTsKKwkJZW5kICAgIHw9ICgxIDw8ICgyNCAtIFBBR0VfU0hJRlQpKSAtIDE7CisKKwkJY3Nyb3ctPmZpcnN0X3BhZ2UgPSBzdGFydDsKKwkJY3Nyb3ctPmxhc3RfcGFnZSA9IGVuZDsKKworCQlkaW1tLT5ucl9wYWdlcyA9IGVuZCArIDEgLSBzdGFydDsKKwkJZGltbS0+Z3JhaW4gPSA4OworCQlkaW1tLT5tdHlwZSA9IG10eXBlOworCQlkaW1tLT5kdHlwZSA9IERFVl9VTktOT1dOOworCQlpZiAoc2RyYW1fY3RsICYgRFNDX1gzMl9FTikKKwkJCWRpbW0tPmR0eXBlID0gREVWX1gzMjsKKwkJZGltbS0+ZWRhY19tb2RlID0gRURBQ19TRUNERUQ7CisJfQorfQorCitpbnQgZnNsX21jX2Vycl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCkKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CisJc3RydWN0IGVkYWNfbWNfbGF5ZXIgbGF5ZXJzWzJdOworCXN0cnVjdCBmc2xfbWNfcGRhdGEgKnBkYXRhOworCXN0cnVjdCByZXNvdXJjZSByOworCXUzMiBzZHJhbV9jdGw7CisJaW50IHJlczsKKworCWlmICghZGV2cmVzX29wZW5fZ3JvdXAoJm9wLT5kZXYsIGZzbF9tY19lcnJfcHJvYmUsIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxheWVyc1swXS50eXBlID0gRURBQ19NQ19MQVlFUl9DSElQX1NFTEVDVDsKKwlsYXllcnNbMF0uc2l6ZSA9IDQ7CisJbGF5ZXJzWzBdLmlzX3ZpcnRfY3Nyb3cgPSB0cnVlOworCWxheWVyc1sxXS50eXBlID0gRURBQ19NQ19MQVlFUl9DSEFOTkVMOworCWxheWVyc1sxXS5zaXplID0gMTsKKwlsYXllcnNbMV0uaXNfdmlydF9jc3JvdyA9IGZhbHNlOworCW1jaSA9IGVkYWNfbWNfYWxsb2MoZWRhY19tY19pZHgsIEFSUkFZX1NJWkUobGF5ZXJzKSwgbGF5ZXJzLAorCQkJICAgIHNpemVvZigqcGRhdGEpKTsKKwlpZiAoIW1jaSkgeworCQlkZXZyZXNfcmVsZWFzZV9ncm91cCgmb3AtPmRldiwgZnNsX21jX2Vycl9wcm9iZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKwlwZGF0YS0+bmFtZSA9ICJmc2xfbWNfZXJyIjsKKwltY2ktPnBkZXYgPSAmb3AtPmRldjsKKwlwZGF0YS0+ZWRhY19pZHggPSBlZGFjX21jX2lkeCsrOworCWRldl9zZXRfZHJ2ZGF0YShtY2ktPnBkZXYsIG1jaSk7CisJbWNpLT5jdGxfbmFtZSA9IHBkYXRhLT5uYW1lOworCW1jaS0+ZGV2X25hbWUgPSBwZGF0YS0+bmFtZTsKKworCS8qCisJICogR2V0IHRoZSBlbmRpYW5uZXNzIG9mIEREUiBjb250cm9sbGVyIHJlZ2lzdGVycy4KKwkgKiBEZWZhdWx0IGlzIGJpZyBlbmRpYW4uCisJICovCisJbGl0dGxlX2VuZGlhbiA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChvcC0+ZGV2Lm9mX25vZGUsICJsaXR0bGUtZW5kaWFuIik7CisKKwlyZXMgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG9wLT5kZXYub2Zfbm9kZSwgMCwgJnIpOworCWlmIChyZXMpIHsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIGdldCByZXNvdXJjZSBmb3IgTUMgZXJyIHJlZ3NcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKworCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJm9wLT5kZXYsIHIuc3RhcnQsIHJlc291cmNlX3NpemUoJnIpLAorCQkJCSAgICAgcGRhdGEtPm5hbWUpKSB7CisJCXByX2VycigiJXM6IEVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVtIHJlZ2lvblxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmVzID0gLUVCVVNZOworCQlnb3RvIGVycjsKKwl9CisKKwlwZGF0YS0+bWNfdmJhc2UgPSBkZXZtX2lvcmVtYXAoJm9wLT5kZXYsIHIuc3RhcnQsIHJlc291cmNlX3NpemUoJnIpKTsKKwlpZiAoIXBkYXRhLT5tY192YmFzZSkgeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gc2V0dXAgTUMgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKKwkJcmVzID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJc2RyYW1fY3RsID0gZGRyX2luMzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0REUl9TRFJBTV9DRkcpOworCWlmICghKHNkcmFtX2N0bCAmIERTQ19FQ0NfRU4pKSB7CisJCS8qIG5vIEVDQyAqLworCQlwcl93YXJuKCIlczogTm8gRUNDIERJTU1zIGRpc2NvdmVyZWRcbiIsIF9fZnVuY19fKTsKKwkJcmVzID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJZWRhY19kYmcoMywgImluaXQgbWNpXG4iKTsKKwltY2ktPm10eXBlX2NhcCA9IE1FTV9GTEFHX0REUiB8IE1FTV9GTEFHX1JERFIgfAorCQkJIE1FTV9GTEFHX0REUjIgfCBNRU1fRkxBR19SRERSMiB8CisJCQkgTUVNX0ZMQUdfRERSMyB8IE1FTV9GTEFHX1JERFIzIHwKKwkJCSBNRU1fRkxBR19ERFI0IHwgTUVNX0ZMQUdfUkREUjQ7CisJbWNpLT5lZGFjX2N0bF9jYXAgPSBFREFDX0ZMQUdfTk9ORSB8IEVEQUNfRkxBR19TRUNERUQ7CisJbWNpLT5lZGFjX2NhcCA9IEVEQUNfRkxBR19TRUNERUQ7CisJbWNpLT5tb2RfbmFtZSA9IEVEQUNfTU9EX1NUUjsKKworCWlmIChlZGFjX29wX3N0YXRlID09IEVEQUNfT1BTVEFURV9QT0xMKQorCQltY2ktPmVkYWNfY2hlY2sgPSBmc2xfbWNfY2hlY2s7CisKKwltY2ktPmN0bF9wYWdlX3RvX3BoeXMgPSBOVUxMOworCisJbWNpLT5zY3J1Yl9tb2RlID0gU0NSVUJfU1dfU1JDOworCisJZnNsX2Rkcl9pbml0X2Nzcm93cyhtY2kpOworCisJLyogc3RvcmUgdGhlIG9yaWdpbmFsIGVycm9yIGRpc2FibGUgYml0cyAqLworCW9yaWdfZGRyX2Vycl9kaXNhYmxlID0gZGRyX2luMzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0VSUl9ESVNBQkxFKTsKKwlkZHJfb3V0MzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0VSUl9ESVNBQkxFLCAwKTsKKworCS8qIGNsZWFyIGFsbCBlcnJvciBiaXRzICovCisJZGRyX291dDMyKHBkYXRhLT5tY192YmFzZSArIEZTTF9NQ19FUlJfREVURUNULCB+MCk7CisKKwlyZXMgPSBlZGFjX21jX2FkZF9tY193aXRoX2dyb3VwcyhtY2ksIGZzbF9kZHJfZGV2X2dyb3Vwcyk7CisJaWYgKHJlcykgeworCQllZGFjX2RiZygzLCAiZmFpbGVkIGVkYWNfbWNfYWRkX21jKClcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoZWRhY19vcF9zdGF0ZSA9PSBFREFDX09QU1RBVEVfSU5UKSB7CisJCWRkcl9vdXQzMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfRVJSX0lOVF9FTiwKKwkJCSAgRERSX0VJRV9NQkVFIHwgRERSX0VJRV9TQkVFKTsKKworCQkvKiBzdG9yZSB0aGUgb3JpZ2luYWwgZXJyb3IgbWFuYWdlbWVudCB0aHJlc2hvbGQgKi8KKwkJb3JpZ19kZHJfZXJyX3NiZSA9IGRkcl9pbjMyKHBkYXRhLT5tY192YmFzZSArCisJCQkJCSAgICBGU0xfTUNfRVJSX1NCRSkgJiAweGZmMDAwMDsKKworCQkvKiBzZXQgdGhyZXNob2xkIHRvIDEgZXJyb3IgcGVyIGludGVycnVwdCAqLworCQlkZHJfb3V0MzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0VSUl9TQkUsIDB4MTAwMDApOworCisJCS8qIHJlZ2lzdGVyIGludGVycnVwdHMgKi8KKwkJcGRhdGEtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEob3AsIDApOworCQlyZXMgPSBkZXZtX3JlcXVlc3RfaXJxKCZvcC0+ZGV2LCBwZGF0YS0+aXJxLAorCQkJCSAgICAgICBmc2xfbWNfaXNyLAorCQkJCSAgICAgICBJUlFGX1NIQVJFRCwKKwkJCQkgICAgICAgIltFREFDXSBNQyBlcnIiLCBtY2kpOworCQlpZiAocmVzIDwgMCkgeworCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlcXVlc3QgaXJxICVkIGZvciBGU0wgRERSIERSQU0gRVJSXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBwZGF0YS0+aXJxKTsKKwkJCXJlcyA9IC1FTk9ERVY7CisJCQlnb3RvIGVycjI7CisJCX0KKworCQlwcl9pbmZvKEVEQUNfTU9EX1NUUiAiIGFjcXVpcmVkIGlycSAlZCBmb3IgTUNcbiIsCisJCSAgICAgICBwZGF0YS0+aXJxKTsKKwl9CisKKwlkZXZyZXNfcmVtb3ZlX2dyb3VwKCZvcC0+ZGV2LCBmc2xfbWNfZXJyX3Byb2JlKTsKKwllZGFjX2RiZygzLCAic3VjY2Vzc1xuIik7CisJcHJfaW5mbyhFREFDX01PRF9TVFIgIiBNQyBlcnIgcmVnaXN0ZXJlZFxuIik7CisKKwlyZXR1cm4gMDsKKworZXJyMjoKKwllZGFjX21jX2RlbF9tYygmb3AtPmRldik7CitlcnI6CisJZGV2cmVzX3JlbGVhc2VfZ3JvdXAoJm9wLT5kZXYsIGZzbF9tY19lcnJfcHJvYmUpOworCWVkYWNfbWNfZnJlZShtY2kpOworCXJldHVybiByZXM7Cit9CisKK2ludCBmc2xfbWNfZXJyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCkKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCXN0cnVjdCBmc2xfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKworCWVkYWNfZGJnKDAsICJcbiIpOworCisJaWYgKGVkYWNfb3Bfc3RhdGUgPT0gRURBQ19PUFNUQVRFX0lOVCkgeworCQlkZHJfb3V0MzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0VSUl9JTlRfRU4sIDApOworCX0KKworCWRkcl9vdXQzMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfRVJSX0RJU0FCTEUsCisJCSAgb3JpZ19kZHJfZXJyX2Rpc2FibGUpOworCWRkcl9vdXQzMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfRVJSX1NCRSwgb3JpZ19kZHJfZXJyX3NiZSk7CisKKwllZGFjX21jX2RlbF9tYygmb3AtPmRldik7CisJZWRhY19tY19mcmVlKG1jaSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZnNsX2Rkcl9lZGFjLmggYi9kcml2ZXJzL2VkYWMvZnNsX2Rkcl9lZGFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNjZWUyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZWRhYy9mc2xfZGRyX2VkYWMuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogRnJlZXNjYWxlIE1lbW9yeSBDb250cm9sbGVyIGtlcm5lbCBtb2R1bGUKKyAqCisgKiBTdXBwb3J0ICBQb3dlci1iYXNlZCBTb0NzIGluY2x1ZGluZyBNUEM4NXh4LCBNUEM4Nnh4LCBNUEM4M3h4IGFuZAorICogQVJNLWJhc2VkIExheWVyc2NhcGUgU29DcyBpbmNsdWRpbmcgTFMyeHh4LiBPcmlnaW5hbGx5IHNwbGl0CisgKiBvdXQgZnJvbSBtcGM4NXh4X2VkYWMgRURBQyBkcml2ZXIuCisgKgorICogQXV0aG9yOiBEYXZlIEppYW5nIDxkamlhbmdAbXZpc3RhLmNvbT4KKyAqCisgKiAyMDA2LTIwMDcgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKgorICovCisjaWZuZGVmIF9GU0xfRERSX0VEQUNfSF8KKyNkZWZpbmUgX0ZTTF9ERFJfRURBQ19IXworCisjZGVmaW5lIGZzbF9tY19wcmludGsobWNpLCBsZXZlbCwgZm10LCBhcmcuLi4pIFwKKwllZGFjX21jX2NoaXBzZXRfcHJpbnRrKG1jaSwgbGV2ZWwsICJGU0xfRERSIiwgZm10LCAjI2FyZykKKworLyoKKyAqIERSQU0gZXJyb3IgZGVmaW5lcworICovCisKKy8qIEREUl9TRFJBTV9DRkcgKi8KKyNkZWZpbmUgRlNMX01DX0REUl9TRFJBTV9DRkcJMHgwMTEwCisjZGVmaW5lIEZTTF9NQ19DU19CTkRTXzAJCTB4MDAwMAorI2RlZmluZSBGU0xfTUNfQ1NfQk5EU19PRlMJCTB4MDAwOAorCisjZGVmaW5lIEZTTF9NQ19EQVRBX0VSUl9JTkpFQ1RfSEkJMHgwZTAwCisjZGVmaW5lIEZTTF9NQ19EQVRBX0VSUl9JTkpFQ1RfTE8JMHgwZTA0CisjZGVmaW5lIEZTTF9NQ19FQ0NfRVJSX0lOSkVDVAkweDBlMDgKKyNkZWZpbmUgRlNMX01DX0NBUFRVUkVfREFUQV9ISQkweDBlMjAKKyNkZWZpbmUgRlNMX01DX0NBUFRVUkVfREFUQV9MTwkweDBlMjQKKyNkZWZpbmUgRlNMX01DX0NBUFRVUkVfRUNDCQkweDBlMjgKKyNkZWZpbmUgRlNMX01DX0VSUl9ERVRFQ1QJCTB4MGU0MAorI2RlZmluZSBGU0xfTUNfRVJSX0RJU0FCTEUJCTB4MGU0NAorI2RlZmluZSBGU0xfTUNfRVJSX0lOVF9FTgkJMHgwZTQ4CisjZGVmaW5lIEZTTF9NQ19DQVBUVVJFX0FUUklCVVRFUwkweDBlNGMKKyNkZWZpbmUgRlNMX01DX0NBUFRVUkVfQUREUkVTUwkweDBlNTAKKyNkZWZpbmUgRlNMX01DX0NBUFRVUkVfRVhUX0FERFJFU1MJMHgwZTU0CisjZGVmaW5lIEZTTF9NQ19FUlJfU0JFCQkweDBlNTgKKworI2RlZmluZSBEU0NfTUVNX0VOCTB4ODAwMDAwMDAKKyNkZWZpbmUgRFNDX0VDQ19FTgkweDIwMDAwMDAwCisjZGVmaW5lIERTQ19SRF9FTgkweDEwMDAwMDAwCisjZGVmaW5lIERTQ19EQldfTUFTSwkweDAwMTgwMDAwCisjZGVmaW5lIERTQ19EQldfMzIJMHgwMDA4MDAwMAorI2RlZmluZSBEU0NfREJXXzY0CTB4MDAwMDAwMDAKKworI2RlZmluZSBEU0NfU0RUWVBFX01BU0sJCTB4MDcwMDAwMDAKKyNkZWZpbmUgRFNDX1gzMl9FTgkweDAwMDAwMDIwCisKKy8qIEVycl9JbnRfRW4gKi8KKyNkZWZpbmUgRERSX0VJRV9NU0VFCTB4MQkvKiBtZW1vcnkgc2VsZWN0ICovCisjZGVmaW5lIEREUl9FSUVfU0JFRQkweDQJLyogc2luZ2xlLWJpdCBFQ0MgZXJyb3IgKi8KKyNkZWZpbmUgRERSX0VJRV9NQkVFCTB4OAkvKiBtdWx0aS1iaXQgRUNDIGVycm9yICovCisKKy8qIEVycl9EZXRlY3QgKi8KKyNkZWZpbmUgRERSX0VERV9NU0UJCTB4MQkvKiBtZW1vcnkgc2VsZWN0ICovCisjZGVmaW5lIEREUl9FREVfU0JFCQkweDQJLyogc2luZ2xlLWJpdCBFQ0MgZXJyb3IgKi8KKyNkZWZpbmUgRERSX0VERV9NQkUJCTB4OAkvKiBtdWx0aS1iaXQgRUNDIGVycm9yICovCisjZGVmaW5lIEREUl9FREVfTU1FCQkweDgwMDAwMDAwCS8qIG11bHRpcGxlIG1lbW9yeSBlcnJvcnMgKi8KKworLyogRXJyX0Rpc2FibGUgKi8KKyNkZWZpbmUgRERSX0VESV9NU0VECTB4MQkvKiBtZW1vcnkgc2VsZWN0IGRpc2FibGUgKi8KKyNkZWZpbmUJRERSX0VESV9TQkVECTB4NAkvKiBzaW5nbGUtYml0IEVDQyBlcnJvciBkaXNhYmxlICovCisjZGVmaW5lCUREUl9FRElfTUJFRAkweDgJLyogbXVsdGktYml0IEVDQyBlcnJvciBkaXNhYmxlICovCisKK3N0cnVjdCBmc2xfbWNfcGRhdGEgeworCWNoYXIgKm5hbWU7CisJaW50IGVkYWNfaWR4OworCXZvaWQgX19pb21lbSAqbWNfdmJhc2U7CisJaW50IGlycTsKK307CitpbnQgZnNsX21jX2Vycl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCk7CitpbnQgZnNsX21jX2Vycl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3ApOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvbGF5ZXJzY2FwZV9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvbGF5ZXJzY2FwZV9lZGFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1OWQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZWRhYy9sYXllcnNjYXBlX2VkYWMuYwpAQCAtMCwwICsxLDczIEBACisvKgorICogRnJlZXNjYWxlIE1lbW9yeSBDb250cm9sbGVyIGtlcm5lbCBtb2R1bGUKKyAqCisgKiBBdXRob3I6IFlvcmsgU3VuIDx5b3JrLnN1bkBueHAuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDE2IE5YUCBTZW1pY29uZHVjdG9yCisgKgorICogRGVyaXZlZCBmcm9tIG1wYzg1eHhfZWRhYy5jCisgKiBBdXRob3I6IERhdmUgSmlhbmcgPGRqaWFuZ0BtdmlzdGEuY29tPgorICoKKyAqIDIwMDYtMjAwNyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlICJlZGFjX2NvcmUuaCIKKyNpbmNsdWRlICJmc2xfZGRyX2VkYWMuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZnNsX2Rkcl9tY19lcnJfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlciIsIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZnNsX2Rkcl9tY19lcnJfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBmc2xfZGRyX21jX2Vycl9kcml2ZXIgPSB7CisJLnByb2JlID0gZnNsX21jX2Vycl9wcm9iZSwKKwkucmVtb3ZlID0gZnNsX21jX2Vycl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiZnNsX2Rkcl9tY19lcnIiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBmc2xfZGRyX21jX2Vycl9vZl9tYXRjaCwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZnNsX2Rkcl9tY19pbml0KHZvaWQpCit7CisJaW50IHJlczsKKworCS8qIG1ha2Ugc3VyZSBlcnJvciByZXBvcnRpbmcgbWV0aG9kIGlzIHNhbmUgKi8KKwlzd2l0Y2ggKGVkYWNfb3Bfc3RhdGUpIHsKKwljYXNlIEVEQUNfT1BTVEFURV9QT0xMOgorCWNhc2UgRURBQ19PUFNUQVRFX0lOVDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZWRhY19vcF9zdGF0ZSA9IEVEQUNfT1BTVEFURV9JTlQ7CisJCWJyZWFrOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZnNsX2Rkcl9tY19lcnJfZHJpdmVyKTsKKwlpZiAocmVzKSB7CisJCXByX2VycigiTUMgZmFpbHMgdG8gcmVnaXN0ZXJcbiIpOworCQlyZXR1cm4gcmVzOworCX0KKworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChmc2xfZGRyX21jX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZnNsX2Rkcl9tY19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmZzbF9kZHJfbWNfZXJyX2RyaXZlcik7Cit9CisKK21vZHVsZV9leGl0KGZzbF9kZHJfbWNfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk5YUCBTZW1pY29uZHVjdG9yIik7Cittb2R1bGVfcGFyYW0oZWRhY19vcF9zdGF0ZSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZWRhY19vcF9zdGF0ZSwKKwkJICJFREFDIEVycm9yIFJlcG9ydGluZyBzdGF0ZTogMD1Qb2xsLCAyPUludGVycnVwdCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL21jZV9hbWQuYyBiL2RyaXZlcnMvZWRhYy9tY2VfYW1kLmMKaW5kZXggOWI2ODAwYS4uZGFhYWMyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL21jZV9hbWQuYworKysgYi9kcml2ZXJzL2VkYWMvbWNlX2FtZC5jCkBAIC0xNDgsMTIgKzE0OCwxMiBAQAogfTsKIAogLyogU2NhbGFibGUgTUNBIGVycm9yIHN0cmluZ3MgKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZjE3aF9sc19tY2VfZGVzY1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzbWNhX2xzX21jZV9kZXNjW10gPSB7CiAJIkxvYWQgcXVldWUgcGFyaXR5IiwKIAkiU3RvcmUgcXVldWUgcGFyaXR5IiwKIAkiTWlzcyBhZGRyZXNzIGJ1ZmZlciBwYXlsb2FkIHBhcml0eSIsCiAJIkwxIFRMQiBwYXJpdHkiLAotCSIiLAkJCQkJCS8qIHJlc2VydmVkICovCisJIlJlc2VydmVkIiwKIAkiREMgdGFnIGVycm9yIHR5cGUgNiIsCiAJIkRDIHRhZyBlcnJvciB0eXBlIDEiLAogCSJJbnRlcm5hbCBlcnJvciB0eXBlIDEiLApAQCAtMTcyLDcgKzE3Miw3IEBACiAJIkwyIGZpbGwgZGF0YSBlcnJvciIsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGYxN2hfaWZfbWNlX2Rlc2NbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc21jYV9pZl9tY2VfZGVzY1tdID0gewogCSJtaWNyb3RhZyBwcm9iZSBwb3J0IHBhcml0eSBlcnJvciIsCiAJIklDIG1pY3JvdGFnIG9yIGZ1bGwgdGFnIG11bHRpLWhpdCBlcnJvciIsCiAJIklDIGZ1bGwgdGFnIHBhcml0eSIsCkBAIC0xODUsMTkgKzE4NSwyMiBAQAogCSJCUFEgc25vb3AgcGFyaXR5IG9uIFRocmVhZCAxIiwKIAkiTDEgQlRCIG11bHRpLW1hdGNoIGVycm9yIiwKIAkiTDIgQlRCIG11bHRpLW1hdGNoIGVycm9yIiwKKwkiTDIgQ2FjaGUgUmVzcG9uc2UgUG9pc29uIGVycm9yIiwKKwkiU3lzdGVtIFJlYWQgRGF0YSBlcnJvciIsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGYxN2hfbDJfbWNlX2Rlc2NbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc21jYV9sMl9tY2VfZGVzY1tdID0gewogCSJMMk0gdGFnIG11bHRpLXdheS1oaXQgZXJyb3IiLAogCSJMMk0gdGFnIEVDQyBlcnJvciIsCiAJIkwyTSBkYXRhIEVDQyBlcnJvciIsCiAJIkhXIGFzc2VydCIsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGYxN2hfZGVfbWNlX2Rlc2NbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc21jYV9kZV9tY2VfZGVzY1tdID0gewogCSJ1b3AgY2FjaGUgdGFnIHBhcml0eSBlcnJvciIsCiAJInVvcCBjYWNoZSBkYXRhIHBhcml0eSBlcnJvciIsCiAJIkluc24gYnVmZmVyIHBhcml0eSBlcnJvciIsCisJInVvcCBxdWV1ZSBwYXJpdHkgZXJyb3IiLAogCSJJbnNuIGRpc3BhdGNoIHF1ZXVlIHBhcml0eSBlcnJvciIsCiAJIkZldGNoIGFkZHJlc3MgRklGTyBwYXJpdHkiLAogCSJQYXRjaCBSQU0gZGF0YSBwYXJpdHkiLApAQCAtMjA1LDcgKzIwOCw3IEBACiAJInVvcCBidWZmZXIgcGFyaXR5IgogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmMTdoX2V4X21jZV9kZXNjW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNtY2FfZXhfbWNlX2Rlc2NbXSA9IHsKIAkiV2F0Y2hkb2cgdGltZW91dCBlcnJvciIsCiAJIlBoeSByZWdpc3RlciBmaWxlIHBhcml0eSIsCiAJIkZsYWcgcmVnaXN0ZXIgZmlsZSBwYXJpdHkiLApAQCAtMjE0LDE4ICsyMTcsMjIgQEAKIAkiRVggcGF5bG9hZCBwYXJpdHkiLAogCSJDaGVja3BvaW50IHF1ZXVlIHBhcml0eSIsCiAJIlJldGlyZSBkaXNwYXRjaCBxdWV1ZSBwYXJpdHkiLAorCSJSZXRpcmUgc3RhdHVzIHF1ZXVlIHBhcml0eSBlcnJvciIsCisJIlNjaGVkdWxpbmcgcXVldWUgcGFyaXR5IGVycm9yIiwKKwkiQnJhbmNoIGJ1ZmZlciBxdWV1ZSBwYXJpdHkgZXJyb3IiLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmMTdoX2ZwX21jZV9kZXNjW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNtY2FfZnBfbWNlX2Rlc2NbXSA9IHsKIAkiUGh5c2ljYWwgcmVnaXN0ZXIgZmlsZSBwYXJpdHkiLAogCSJGcmVlbGlzdCBwYXJpdHkgZXJyb3IiLAogCSJTY2hlZHVsZSBxdWV1ZSBwYXJpdHkiLAogCSJOU1EgcGFyaXR5IGVycm9yIiwKIAkiUmV0aXJlIHF1ZXVlIHBhcml0eSIsCiAJIlN0YXR1cyByZWdpc3RlciBmaWxlIHBhcml0eSIsCisJIkhhcmR3YXJlIGFzc2VydGlvbiIsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGYxN2hfbDNfbWNlX2Rlc2NbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc21jYV9sM19tY2VfZGVzY1tdID0gewogCSJTaGFkb3cgdGFnIG1hY3JvIEVDQyBlcnJvciIsCiAJIlNoYWRvdyB0YWcgbWFjcm8gbXVsdGktd2F5LWhpdCBlcnJvciIsCiAJIkwzTSB0YWcgRUNDIGVycm9yIiwKQEAgLTIzNiw3ICsyNDMsNyBAQAogCSJMMyBIVyBhc3NlcnQiLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmMTdoX2NzX21jZV9kZXNjW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNtY2FfY3NfbWNlX2Rlc2NbXSA9IHsKIAkiSWxsZWdhbCByZXF1ZXN0IGZyb20gdHJhbnNwb3J0IGxheWVyIiwKIAkiQWRkcmVzcyB2aW9sYXRpb24iLAogCSJTZWN1cml0eSB2aW9sYXRpb24iLApAQCAtMjQ4LDE0ICsyNTUsMTQgQEAKIAkiRUNDIGVycm9yIG9uIHByb2JlIGZpbHRlciBhY2Nlc3MiLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmMTdoX3BpZV9tY2VfZGVzY1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzbWNhX3BpZV9tY2VfZGVzY1tdID0gewogCSJIVyBhc3NlcnQiLAogCSJJbnRlcm5hbCBQSUUgcmVnaXN0ZXIgc2VjdXJpdHkgdmlvbGF0aW9uIiwKIAkiRXJyb3Igb24gR01JIGxpbmsiLAogCSJQb2lzb24gZGF0YSB3cml0dGVuIHRvIGludGVybmFsIFBJRSByZWdpc3RlciIsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGYxN2hfdW1jX21jZV9kZXNjW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNtY2FfdW1jX21jZV9kZXNjW10gPSB7CiAJIkRSQU0gRUNDIGVycm9yIiwKIAkiRGF0YSBwb2lzb24gZXJyb3Igb24gRFJBTSIsCiAJIlNEUCBwYXJpdHkgZXJyb3IiLApAQCAtMjY0LDE4ICsyNzEsMzkgQEAKIAkiV3JpdGUgZGF0YSBDUkMgZXJyb3IiLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmMTdoX3BiX21jZV9kZXNjW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNtY2FfcGJfbWNlX2Rlc2NbXSA9IHsKIAkiUGFyYW1ldGVyIEJsb2NrIFJBTSBFQ0MgZXJyb3IiLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmMTdoX3BzcF9tY2VfZGVzY1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzbWNhX3BzcF9tY2VfZGVzY1tdID0gewogCSJQU1AgUkFNIEVDQyBvciBwYXJpdHkgZXJyb3IiLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmMTdoX3NtdV9tY2VfZGVzY1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzbWNhX3NtdV9tY2VfZGVzY1tdID0gewogCSJTTVUgUkFNIEVDQyBvciBwYXJpdHkgZXJyb3IiLAogfTsKIAorc3RydWN0IHNtY2FfbWNlX2Rlc2MgeworCWNvbnN0IGNoYXIgKiBjb25zdCAqZGVzY3M7CisJdW5zaWduZWQgaW50IG51bV9kZXNjczsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc21jYV9tY2VfZGVzYyBzbWNhX21jZV9kZXNjc1tdID0geworCVtTTUNBX0xTXQk9IHsgc21jYV9sc19tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX2xzX21jZV9kZXNjKQl9LAorCVtTTUNBX0lGXQk9IHsgc21jYV9pZl9tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX2lmX21jZV9kZXNjKQl9LAorCVtTTUNBX0wyX0NBQ0hFXQk9IHsgc21jYV9sMl9tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX2wyX21jZV9kZXNjKQl9LAorCVtTTUNBX0RFXQk9IHsgc21jYV9kZV9tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX2RlX21jZV9kZXNjKQl9LAorCVtTTUNBX0VYXQk9IHsgc21jYV9leF9tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX2V4X21jZV9kZXNjKQl9LAorCVtTTUNBX0ZQXQk9IHsgc21jYV9mcF9tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX2ZwX21jZV9kZXNjKQl9LAorCVtTTUNBX0wzX0NBQ0hFXQk9IHsgc21jYV9sM19tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX2wzX21jZV9kZXNjKQl9LAorCVtTTUNBX0NTXQk9IHsgc21jYV9jc19tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX2NzX21jZV9kZXNjKQl9LAorCVtTTUNBX1BJRV0JPSB7IHNtY2FfcGllX21jZV9kZXNjLAlBUlJBWV9TSVpFKHNtY2FfcGllX21jZV9kZXNjKQl9LAorCVtTTUNBX1VNQ10JPSB7IHNtY2FfdW1jX21jZV9kZXNjLAlBUlJBWV9TSVpFKHNtY2FfdW1jX21jZV9kZXNjKQl9LAorCVtTTUNBX1BCXQk9IHsgc21jYV9wYl9tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX3BiX21jZV9kZXNjKQl9LAorCVtTTUNBX1BTUF0JPSB7IHNtY2FfcHNwX21jZV9kZXNjLAlBUlJBWV9TSVpFKHNtY2FfcHNwX21jZV9kZXNjKQl9LAorCVtTTUNBX1NNVV0JPSB7IHNtY2Ffc211X21jZV9kZXNjLAlBUlJBWV9TSVpFKHNtY2Ffc211X21jZV9kZXNjKQl9LAorfTsKKwogc3RhdGljIGJvb2wgZjEyaF9tYzBfbWNlKHUxNiBlYywgdTggeGVjKQogewogCWJvb2wgcmV0ID0gZmFsc2U7CkBAIC04MjAsMTc1ICs4NDgsMzUgQEAKIAlwcl9lbWVyZyhIV19FUlIgIkNvcnJ1cHRlZCBNQzYgTUNFIGluZm8/XG4iKTsKIH0KIAotc3RhdGljIHZvaWQgZGVjb2RlX2YxN2hfY29yZV9lcnJvcnMoY29uc3QgY2hhciAqaXBfbmFtZSwgdTggeGVjLAotCQkJCSAgIHVuc2lnbmVkIGludCBtY2FfdHlwZSkKLXsKLQljb25zdCBjaGFyICogY29uc3QgKmVycm9yX2Rlc2NfYXJyYXk7Ci0Jc2l6ZV90IGxlbjsKLQotCXByX2VtZXJnKEhXX0VSUiAiJXMgRXJyb3I6ICIsIGlwX25hbWUpOwotCi0Jc3dpdGNoIChtY2FfdHlwZSkgewotCWNhc2UgU01DQV9MUzoKLQkJZXJyb3JfZGVzY19hcnJheSA9IGYxN2hfbHNfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9sc19tY2VfZGVzYykgLSAxOwotCi0JCWlmICh4ZWMgPT0gMHg0KSB7Ci0JCQlwcl9jb250KCJVbnJlY29nbml6ZWQgTFMgTUNBIGVycm9yIGNvZGUuXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU01DQV9JRjoKLQkJZXJyb3JfZGVzY19hcnJheSA9IGYxN2hfaWZfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9pZl9tY2VfZGVzYykgLSAxOwotCQlicmVhazsKLQotCWNhc2UgU01DQV9MMl9DQUNIRToKLQkJZXJyb3JfZGVzY19hcnJheSA9IGYxN2hfbDJfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9sMl9tY2VfZGVzYykgLSAxOwotCQlicmVhazsKLQotCWNhc2UgU01DQV9ERToKLQkJZXJyb3JfZGVzY19hcnJheSA9IGYxN2hfZGVfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9kZV9tY2VfZGVzYykgLSAxOwotCQlicmVhazsKLQotCWNhc2UgU01DQV9FWDoKLQkJZXJyb3JfZGVzY19hcnJheSA9IGYxN2hfZXhfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9leF9tY2VfZGVzYykgLSAxOwotCQlicmVhazsKLQotCWNhc2UgU01DQV9GUDoKLQkJZXJyb3JfZGVzY19hcnJheSA9IGYxN2hfZnBfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9mcF9tY2VfZGVzYykgLSAxOwotCQlicmVhazsKLQotCWNhc2UgU01DQV9MM19DQUNIRToKLQkJZXJyb3JfZGVzY19hcnJheSA9IGYxN2hfbDNfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9sM19tY2VfZGVzYykgLSAxOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByX2NvbnQoIkNvcnJ1cHRlZCBNQ0EgY29yZSBlcnJvciBpbmZvLlxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoeGVjID4gbGVuKSB7Ci0JCXByX2NvbnQoIlVucmVjb2duaXplZCAlcyBNQ0EgYmFuayBlcnJvciBjb2RlLlxuIiwKLQkJCSBhbWRfY29yZV9tY2FibG9ja19uYW1lc1ttY2FfdHlwZV0pOwotCQlyZXR1cm47Ci0JfQotCi0JcHJfY29udCgiJXMuXG4iLCBlcnJvcl9kZXNjX2FycmF5W3hlY10pOwotfQotCi1zdGF0aWMgdm9pZCBkZWNvZGVfZGZfZXJyb3JzKHU4IHhlYywgdW5zaWduZWQgaW50IG1jYV90eXBlKQotewotCWNvbnN0IGNoYXIgKiBjb25zdCAqZXJyb3JfZGVzY19hcnJheTsKLQlzaXplX3QgbGVuOwotCi0JcHJfZW1lcmcoSFdfRVJSICJEYXRhIEZhYnJpYyBFcnJvcjogIik7Ci0KLQlzd2l0Y2ggKG1jYV90eXBlKSB7Ci0JY2FzZSAgU01DQV9DUzoKLQkJZXJyb3JfZGVzY19hcnJheSA9IGYxN2hfY3NfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9jc19tY2VfZGVzYykgLSAxOwotCQlicmVhazsKLQotCWNhc2UgU01DQV9QSUU6Ci0JCWVycm9yX2Rlc2NfYXJyYXkgPSBmMTdoX3BpZV9tY2VfZGVzYzsKLQkJbGVuID0gQVJSQVlfU0laRShmMTdoX3BpZV9tY2VfZGVzYykgLSAxOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByX2NvbnQoIkNvcnJ1cHRlZCBNQ0EgRGF0YSBGYWJyaWMgaW5mby5cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHhlYyA+IGxlbikgewotCQlwcl9jb250KCJVbnJlY29nbml6ZWQgJXMgTUNBIGJhbmsgZXJyb3IgY29kZS5cbiIsCi0JCQkgYW1kX2RmX21jYWJsb2NrX25hbWVzW21jYV90eXBlXSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcl9jb250KCIlcy5cbiIsIGVycm9yX2Rlc2NfYXJyYXlbeGVjXSk7Ci19Ci0KIC8qIERlY29kZSBlcnJvcnMgYWNjb3JkaW5nIHRvIFNjYWxhYmxlIE1DQSBzcGVjaWZpY2F0aW9uICovCiBzdGF0aWMgdm9pZCBkZWNvZGVfc21jYV9lcnJvcnMoc3RydWN0IG1jZSAqbSkKIHsKLQl1MzIgYWRkciA9IE1TUl9BTUQ2NF9TTUNBX01DeF9JUElEKG0tPmJhbmspOwotCXVuc2lnbmVkIGludCBod2lkLCBtY2FfdHlwZSwgaTsKLQl1OCB4ZWMgPSBYRUMobS0+c3RhdHVzLCB4ZWNfbWFzayk7Ci0JY29uc3QgY2hhciAqIGNvbnN0ICplcnJvcl9kZXNjX2FycmF5OworCXN0cnVjdCBzbWNhX2h3aWRfbWNhdHlwZSAqdHlwZTsKKwl1bnNpZ25lZCBpbnQgYmFua190eXBlOwogCWNvbnN0IGNoYXIgKmlwX25hbWU7Ci0JdTMyIGxvdywgaGlnaDsKLQlzaXplX3QgbGVuOworCXU4IHhlYyA9IFhFQyhtLT5zdGF0dXMsIHhlY19tYXNrKTsKIAotCWlmIChyZG1zcl9zYWZlKGFkZHIsICZsb3csICZoaWdoKSkgewotCQlwcl9lbWVyZygiSW52YWxpZCBJUCBibG9jayBzcGVjaWZpZWQsIGVycm9yIGluZm9ybWF0aW9uIGlzIHVucmVsaWFibGUuXG4iKTsKKwlpZiAobS0+YmFuayA+PSBBUlJBWV9TSVpFKHNtY2FfYmFua3MpKQogCQlyZXR1cm47Ci0JfQogCi0JaHdpZCA9IGhpZ2ggJiBNQ0lfSVBJRF9IV0lEOwotCW1jYV90eXBlID0gKGhpZ2ggJiBNQ0lfSVBJRF9NQ0FUWVBFKSA+PiAxNjsKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPj0gMHgxNyAmJiBtLT5iYW5rID09IDQpCisJCXByX2VtZXJnKEhXX0VSUiAiQmFuayA0IGlzIHJlc2VydmVkIG9uIEZhbTE3aC5cbiIpOwogCi0JcHJfZW1lcmcoSFdfRVJSICJNQyVkIElQSUQgdmFsdWU6IDB4JTA4eCUwOHhcbiIsIG0tPmJhbmssIGhpZ2gsIGxvdyk7Ci0KLQkvKgotCSAqIEJhc2VkIG9uIGh3aWQgYW5kIG1jYV90eXBlIHZhbHVlcywgZGVjb2RlIGVycm9ycyBmcm9tIHJlc3BlY3RpdmUgSVBzLgotCSAqIE5vdGU6IG1jYV90eXBlIHZhbHVlcyBtYWtlIHNlbnNlIG9ubHkgaW4gdGhlIGNvbnRleHQgb2YgYW4gaHdpZC4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbWRfaHdpZHMpOyBpKyspCi0JCWlmIChhbWRfaHdpZHNbaV0uaHdpZCA9PSBod2lkKQotCQkJYnJlYWs7Ci0KLQlzd2l0Y2ggKGkpIHsKLQljYXNlIFNNQ0FfRjE3SF9DT1JFOgotCQlpcF9uYW1lID0gKG1jYV90eXBlID09IFNNQ0FfTDNfQ0FDSEUpID8KLQkJCSAgIkwzIENhY2hlIiA6ICJGMTdoIENvcmUiOwotCQlyZXR1cm4gZGVjb2RlX2YxN2hfY29yZV9lcnJvcnMoaXBfbmFtZSwgeGVjLCBtY2FfdHlwZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTUNBX0RGOgotCQlyZXR1cm4gZGVjb2RlX2RmX2Vycm9ycyh4ZWMsIG1jYV90eXBlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNNQ0FfVU1DOgotCQllcnJvcl9kZXNjX2FycmF5ID0gZjE3aF91bWNfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF91bWNfbWNlX2Rlc2MpIC0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNNQ0FfUEI6Ci0JCWVycm9yX2Rlc2NfYXJyYXkgPSBmMTdoX3BiX21jZV9kZXNjOwotCQlsZW4gPSBBUlJBWV9TSVpFKGYxN2hfcGJfbWNlX2Rlc2MpIC0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNNQ0FfUFNQOgotCQllcnJvcl9kZXNjX2FycmF5ID0gZjE3aF9wc3BfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9wc3BfbWNlX2Rlc2MpIC0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNNQ0FfU01VOgotCQllcnJvcl9kZXNjX2FycmF5ID0gZjE3aF9zbXVfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9zbXVfbWNlX2Rlc2MpIC0gMTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcl9lbWVyZyhIV19FUlIgIkhXSUQ6JWQgZG9lcyBub3QgbWF0Y2ggYW55IGV4aXN0aW5nIElQcy5cbiIsIGh3aWQpOworCXR5cGUgPSBzbWNhX2JhbmtzW20tPmJhbmtdLnR5cGU7CisJaWYgKCF0eXBlKQogCQlyZXR1cm47CisKKwliYW5rX3R5cGUgPSB0eXBlLT5iYW5rX3R5cGU7CisJaXBfbmFtZSA9IHNtY2FfYmFua19uYW1lc1tiYW5rX3R5cGVdLmxvbmdfbmFtZTsKKworCXByX2VtZXJnKEhXX0VSUiAiJXMgRXh0ZW5kZWQgRXJyb3IgQ29kZTogJWRcbiIsIGlwX25hbWUsIHhlYyk7CisKKwkvKiBPbmx5IHByaW50IHRoZSBkZWNvZGUgb2YgdmFsaWQgZXJyb3IgY29kZXMgKi8KKwlpZiAoeGVjIDwgc21jYV9tY2VfZGVzY3NbYmFua190eXBlXS5udW1fZGVzY3MgJiYKKwkJCSh0eXBlLT54ZWNfYml0bWFwICYgQklUX1VMTCh4ZWMpKSkgeworCQlwcl9lbWVyZyhIV19FUlIgIiVzIEVycm9yOiAiLCBpcF9uYW1lKTsKKwkJcHJfY29udCgiJXMuXG4iLCBzbWNhX21jZV9kZXNjc1tiYW5rX3R5cGVdLmRlc2NzW3hlY10pOwogCX0KLQotCWlwX25hbWUgPSBhbWRfaHdpZHNbaV0ubmFtZTsKLQlwcl9lbWVyZyhIV19FUlIgIiVzIEVycm9yOiAiLCBpcF9uYW1lKTsKLQotCWlmICh4ZWMgPiBsZW4pIHsKLQkJcHJfY29udCgiVW5yZWNvZ25pemVkICVzIE1DQSBiYW5rIGVycm9yIGNvZGUuXG4iLCBpcF9uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQotCXByX2NvbnQoIiVzLlxuIiwgZXJyb3JfZGVzY19hcnJheVt4ZWNdKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGFtZF9kZWNvZGVfZXJyX2NvZGUodTE2IGVjKQpAQCAtMTA3OCw2ICs5NjYsOCBAQAogCQl1MzIgbG93LCBoaWdoOwogCQl1MzIgYWRkciA9IE1TUl9BTUQ2NF9TTUNBX01DeF9DT05GSUcobS0+YmFuayk7CiAKKwkJcHJfY29udCgifCVzIiwgKChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX1NZTkRWKSA/ICJTeW5kViIgOiAiLSIpKTsKKwogCQlpZiAoIXJkbXNyX3NhZmUoYWRkciwgJmxvdywgJmhpZ2gpICYmCiAJCSAgICAobG93ICYgTUNJX0NPTkZJR19NQ0FYKSkKIAkJCXByX2NvbnQoInwlcyIsICgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19UQ0MpID8gIlRDQyIgOiAiLSIpKTsKQEAgLTEwOTEsMTIgKzk4MSwyMCBAQAogCXByX2NvbnQoIl06IDB4JTAxNmxseFxuIiwgbS0+c3RhdHVzKTsKIAogCWlmIChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX0FERFJWKQotCQlwcl9lbWVyZyhIV19FUlIgIk1DJWQgRXJyb3IgQWRkcmVzczogMHglMDE2bGx4XG4iLCBtLT5iYW5rLCBtLT5hZGRyKTsKKwkJcHJfZW1lcmcoSFdfRVJSICJFcnJvciBBZGRyOiAweCUwMTZsbHgiLCBtLT5hZGRyKTsKIAogCWlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfU01DQSkpIHsKKwkJaWYgKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfU1lORFYpCisJCQlwcl9jb250KCIsIFN5bmRyb21lOiAweCUwMTZsbHgiLCBtLT5zeW5kKTsKKworCQlwcl9jb250KCIsIElQSUQ6IDB4JTAxNmxseCIsIG0tPmlwaWQpOworCisJCXByX2NvbnQoIlxuIik7CisKIAkJZGVjb2RlX3NtY2FfZXJyb3JzKG0pOwogCQlnb3RvIGVycl9jb2RlOwotCX0KKwl9IGVsc2UKKwkJcHJfY29udCgiXG4iKTsKIAogCWlmICghZmFtX29wcykKIAkJZ290byBlcnJfY29kZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYwppbmRleCBjYTYzZDBkLi5mZjA1Njc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5jCkBAIC0yNywxNSArMjcsMTIgQEAKICNpbmNsdWRlICJlZGFjX21vZHVsZS5oIgogI2luY2x1ZGUgImVkYWNfY29yZS5oIgogI2luY2x1ZGUgIm1wYzg1eHhfZWRhYy5oIgorI2luY2x1ZGUgImZzbF9kZHJfZWRhYy5oIgogCiBzdGF0aWMgaW50IGVkYWNfZGV2X2lkeDsKICNpZmRlZiBDT05GSUdfUENJCiBzdGF0aWMgaW50IGVkYWNfcGNpX2lkeDsKICNlbmRpZgotc3RhdGljIGludCBlZGFjX21jX2lkeDsKLQotc3RhdGljIHUzMiBvcmlnX2Rkcl9lcnJfZGlzYWJsZTsKLXN0YXRpYyB1MzIgb3JpZ19kZHJfZXJyX3NiZTsKIAogLyoKICAqIFBDSSBFcnIgZGVmaW5lcwpAQCAtNDYsMTAzICs0Myw2IEBACiAjZW5kaWYKIAogc3RhdGljIHUzMiBvcmlnX2wyX2Vycl9kaXNhYmxlOwotI2lmZGVmIENPTkZJR19GU0xfU09DX0JPT0tFCi1zdGF0aWMgdTMyIG9yaWdfaGlkMVsyXTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqIE1DIFNZU0ZTIHBhcnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIHRvX21jaShrKSBjb250YWluZXJfb2Yoaywgc3RydWN0IG1lbV9jdGxfaW5mbywgZGV2KQotCi1zdGF0aWMgc3NpemVfdCBtcGM4NXh4X21jX2luamVjdF9kYXRhX2hpX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsCi0JCQkJCSAgICAgIGNoYXIgKmRhdGEpCi17Ci0Jc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gdG9fbWNpKGRldik7Ci0Jc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKLQlyZXR1cm4gc3ByaW50ZihkYXRhLCAiMHglMDh4IiwKLQkJICAgICAgIGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsKLQkJCSAgICAgICBNUEM4NVhYX01DX0RBVEFfRVJSX0lOSkVDVF9ISSkpOwotfQotCi1zdGF0aWMgc3NpemVfdCBtcGM4NXh4X21jX2luamVjdF9kYXRhX2xvX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsCi0JCQkJCSAgICAgIGNoYXIgKmRhdGEpCi17Ci0Jc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gdG9fbWNpKGRldik7Ci0Jc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKLQlyZXR1cm4gc3ByaW50ZihkYXRhLCAiMHglMDh4IiwKLQkJICAgICAgIGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsKLQkJCSAgICAgICBNUEM4NVhYX01DX0RBVEFfRVJSX0lOSkVDVF9MTykpOwotfQotCi1zdGF0aWMgc3NpemVfdCBtcGM4NXh4X21jX2luamVjdF9jdHJsX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsCi0JCQkJCSAgIGNoYXIgKmRhdGEpCi17Ci0Jc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gdG9fbWNpKGRldik7Ci0Jc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKLQlyZXR1cm4gc3ByaW50ZihkYXRhLCAiMHglMDh4IiwKLQkJICAgICAgIGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19FQ0NfRVJSX0lOSkVDVCkpOwotfQotCi1zdGF0aWMgc3NpemVfdCBtcGM4NXh4X21jX2luamVjdF9kYXRhX2hpX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptYXR0ciwKLQkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSB0b19tY2koZGV2KTsKLQlzdHJ1Y3QgbXBjODV4eF9tY19wZGF0YSAqcGRhdGEgPSBtY2ktPnB2dF9pbmZvOwotCWlmIChpc2RpZ2l0KCpkYXRhKSkgewotCQlvdXRfYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0RBVEFfRVJSX0lOSkVDVF9ISSwKLQkJCSBzaW1wbGVfc3RydG91bChkYXRhLCBOVUxMLCAwKSk7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IG1wYzg1eHhfbWNfaW5qZWN0X2RhdGFfbG9fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKm1hdHRyLAotCQkJCQkgICAgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHRvX21jaShkZXYpOwotCXN0cnVjdCBtcGM4NXh4X21jX3BkYXRhICpwZGF0YSA9IG1jaS0+cHZ0X2luZm87Ci0JaWYgKGlzZGlnaXQoKmRhdGEpKSB7Ci0JCW91dF9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfREFUQV9FUlJfSU5KRUNUX0xPLAotCQkJIHNpbXBsZV9zdHJ0b3VsKGRhdGEsIE5VTEwsIDApKTsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgbXBjODV4eF9tY19pbmplY3RfY3RybF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsCi0JCQkJCSAgICAgICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gdG9fbWNpKGRldik7Ci0Jc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKLQlpZiAoaXNkaWdpdCgqZGF0YSkpIHsKLQkJb3V0X2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19FQ0NfRVJSX0lOSkVDVCwKLQkJCSBzaW1wbGVfc3RydG91bChkYXRhLCBOVUxMLCAwKSk7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLURFVklDRV9BVFRSKGluamVjdF9kYXRhX2hpLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkgICAgbXBjODV4eF9tY19pbmplY3RfZGF0YV9oaV9zaG93LCBtcGM4NXh4X21jX2luamVjdF9kYXRhX2hpX3N0b3JlKTsKLURFVklDRV9BVFRSKGluamVjdF9kYXRhX2xvLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkgICAgbXBjODV4eF9tY19pbmplY3RfZGF0YV9sb19zaG93LCBtcGM4NXh4X21jX2luamVjdF9kYXRhX2xvX3N0b3JlKTsKLURFVklDRV9BVFRSKGluamVjdF9jdHJsLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkgICAgbXBjODV4eF9tY19pbmplY3RfY3RybF9zaG93LCBtcGM4NXh4X21jX2luamVjdF9jdHJsX3N0b3JlKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm1wYzg1eHhfZGV2X2F0dHJzW10gPSB7Ci0JJmRldl9hdHRyX2luamVjdF9kYXRhX2hpLmF0dHIsCi0JJmRldl9hdHRyX2luamVjdF9kYXRhX2xvLmF0dHIsCi0JJmRldl9hdHRyX2luamVjdF9jdHJsLmF0dHIsCi0JTlVMTAotfTsKLQotQVRUUklCVVRFX0dST1VQUyhtcGM4NXh4X2Rldik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDSSBFcnIgZGV2aWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBDT05GSUdfUENJCkBAIC0xNjAsMTggKzYwLDE4IEBACiAJCXJldHVybjsKIAl9CiAKLQlwcmludGsoS0VSTl9FUlIgIlBDSSBlcnJvcihzKSBkZXRlY3RlZFxuIik7Ci0JcHJpbnRrKEtFUk5fRVJSICJQQ0kvWCBFUlJfRFIgcmVnaXN0ZXI6ICUjMDh4XG4iLCBlcnJfZGV0ZWN0KTsKKwlwcl9lcnIoIlBDSSBlcnJvcihzKSBkZXRlY3RlZFxuIik7CisJcHJfZXJyKCJQQ0kvWCBFUlJfRFIgcmVnaXN0ZXI6ICUjMDh4XG4iLCBlcnJfZGV0ZWN0KTsKIAotCXByaW50ayhLRVJOX0VSUiAiUENJL1ggRVJSX0FUVFJJQiByZWdpc3RlcjogJSMwOHhcbiIsCisJcHJfZXJyKCJQQ0kvWCBFUlJfQVRUUklCIHJlZ2lzdGVyOiAlIzA4eFxuIiwKIAkgICAgICAgaW5fYmUzMihwZGF0YS0+cGNpX3ZiYXNlICsgTVBDODVYWF9QQ0lfRVJSX0FUVFJJQikpOwotCXByaW50ayhLRVJOX0VSUiAiUENJL1ggRVJSX0FERFIgcmVnaXN0ZXI6ICUjMDh4XG4iLAorCXByX2VycigiUENJL1ggRVJSX0FERFIgcmVnaXN0ZXI6ICUjMDh4XG4iLAogCSAgICAgICBpbl9iZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNUEM4NVhYX1BDSV9FUlJfQUREUikpOwotCXByaW50ayhLRVJOX0VSUiAiUENJL1ggRVJSX0VYVF9BRERSIHJlZ2lzdGVyOiAlIzA4eFxuIiwKKwlwcl9lcnIoIlBDSS9YIEVSUl9FWFRfQUREUiByZWdpc3RlcjogJSMwOHhcbiIsCiAJICAgICAgIGluX2JlMzIocGRhdGEtPnBjaV92YmFzZSArIE1QQzg1WFhfUENJX0VSUl9FWFRfQUREUikpOwotCXByaW50ayhLRVJOX0VSUiAiUENJL1ggRVJSX0RMIHJlZ2lzdGVyOiAlIzA4eFxuIiwKKwlwcl9lcnIoIlBDSS9YIEVSUl9ETCByZWdpc3RlcjogJSMwOHhcbiIsCiAJICAgICAgIGluX2JlMzIocGRhdGEtPnBjaV92YmFzZSArIE1QQzg1WFhfUENJX0VSUl9ETCkpOwotCXByaW50ayhLRVJOX0VSUiAiUENJL1ggRVJSX0RIIHJlZ2lzdGVyOiAlIzA4eFxuIiwKKwlwcl9lcnIoIlBDSS9YIEVSUl9ESCByZWdpc3RlcjogJSMwOHhcbiIsCiAJICAgICAgIGluX2JlMzIocGRhdGEtPnBjaV92YmFzZSArIE1QQzg1WFhfUENJX0VSUl9ESCkpOwogCiAJLyogY2xlYXIgZXJyb3IgYml0cyAqLwpAQCAtMTg3LDE0ICs4NywxNCBAQAogc3RhdGljIHZvaWQgbXBjODV4eF9wY2llX2NoZWNrKHN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqcGNpKQogewogCXN0cnVjdCBtcGM4NXh4X3BjaV9wZGF0YSAqcGRhdGEgPSBwY2ktPnB2dF9pbmZvOwotCXUzMiBlcnJfZGV0ZWN0OworCXUzMiBlcnJfZGV0ZWN0LCBlcnJfY2FwX3N0YXQ7CiAKIAllcnJfZGV0ZWN0ID0gaW5fYmUzMihwZGF0YS0+cGNpX3ZiYXNlICsgTVBDODVYWF9QQ0lfRVJSX0RSKTsKKwllcnJfY2FwX3N0YXQgPSBpbl9iZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNUEM4NVhYX1BDSV9HQVNfVElNUik7CiAKIAlwcl9lcnIoIlBDSWUgZXJyb3IocykgZGV0ZWN0ZWRcbiIpOwogCXByX2VycigiUENJZSBFUlJfRFIgcmVnaXN0ZXI6IDB4JTA4eFxuIiwgZXJyX2RldGVjdCk7Ci0JcHJfZXJyKCJQQ0llIEVSUl9DQVBfU1RBVCByZWdpc3RlcjogMHglMDh4XG4iLAotCQkJaW5fYmUzMihwZGF0YS0+cGNpX3ZiYXNlICsgTVBDODVYWF9QQ0lfR0FTX1RJTVIpKTsKKwlwcl9lcnIoIlBDSWUgRVJSX0NBUF9TVEFUIHJlZ2lzdGVyOiAweCUwOHhcbiIsIGVycl9jYXBfc3RhdCk7CiAJcHJfZXJyKCJQQ0llIEVSUl9DQVBfUjAgcmVnaXN0ZXI6IDB4JTA4eFxuIiwKIAkJCWluX2JlMzIocGRhdGEtPnBjaV92YmFzZSArIE1QQzg1WFhfUENJRV9FUlJfQ0FQX1IwKSk7CiAJcHJfZXJyKCJQQ0llIEVSUl9DQVBfUjEgcmVnaXN0ZXI6IDB4JTA4eFxuIiwKQEAgLTIwNiw2ICsxMDYsOSBAQAogCiAJLyogY2xlYXIgZXJyb3IgYml0cyAqLwogCW91dF9iZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNUEM4NVhYX1BDSV9FUlJfRFIsIGVycl9kZXRlY3QpOworCisJLyogcmVzZXQgZXJyb3IgY2FwdHVyZSAqLworCW91dF9iZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNUEM4NVhYX1BDSV9HQVNfVElNUiwgZXJyX2NhcF9zdGF0IHwgMHgxKTsKIH0KIAogc3RhdGljIGludCBtcGM4NXh4X3BjaWVfZmluZF9jYXBhYmlsaXR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCkBAIC0yNjcsNyArMTcwLDYgQEAKIAogCXBkYXRhID0gcGNpLT5wdnRfaW5mbzsKIAlwZGF0YS0+bmFtZSA9ICJtcGM4NXh4X3BjaV9lcnIiOwotCXBkYXRhLT5pcnEgPSBOT19JUlE7CiAKIAlwbGF0X2RhdGEgPSBvcC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaWYgKCFwbGF0X2RhdGEpIHsKQEAgLTI5Nyw4ICsxOTksNyBAQAogCiAJcmVzID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShvZl9ub2RlLCAwLCAmcik7CiAJaWYgKHJlcykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IHJlc291cmNlIGZvciAiCi0JCSAgICAgICAiUENJIGVyciByZWdzXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBnZXQgcmVzb3VyY2UgZm9yIFBDSSBlcnIgcmVnc1xuIiwgX19mdW5jX18pOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTMwNywxNSArMjA4LDE0IEBACiAKIAlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZvcC0+ZGV2LCByLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyKSwKIAkJCQkJcGRhdGEtPm5hbWUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVtIHJlZ2lvblxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlczogRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZW0gcmVnaW9uXG4iLCBfX2Z1bmNfXyk7CiAJCXJlcyA9IC1FQlVTWTsKIAkJZ290byBlcnI7CiAJfQogCiAJcGRhdGEtPnBjaV92YmFzZSA9IGRldm1faW9yZW1hcCgmb3AtPmRldiwgci5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcikpOwogCWlmICghcGRhdGEtPnBjaV92YmFzZSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gc2V0dXAgUENJIGVyciByZWdzXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBzZXR1cCBQQ0kgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKIAkJcmVzID0gLUVOT01FTTsKIAkJZ290byBlcnI7CiAJfQpAQCAtMzQ0LDYgKzI0NCw5IEBACiAJLyogY2xlYXIgZXJyb3IgYml0cyAqLwogCW91dF9iZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNUEM4NVhYX1BDSV9FUlJfRFIsIH4wKTsKIAorCS8qIHJlc2V0IGVycm9yIGNhcHR1cmUgKi8KKwlvdXRfYmUzMihwZGF0YS0+cGNpX3ZiYXNlICsgTVBDODVYWF9QQ0lfR0FTX1RJTVIsIDB4MSk7CisKIAlpZiAoZWRhY19wY2lfYWRkX2RldmljZShwY2ksIHBkYXRhLT5lZGFjX2lkeCkgPiAwKSB7CiAJCWVkYWNfZGJnKDMsICJmYWlsZWQgZWRhY19wY2lfYWRkX2RldmljZSgpXG4iKTsKIAkJZ290byBlcnI7CkBAIC0zNTYsMTUgKzI1OSwxNCBAQAogCQkJCSAgICAgICBJUlFGX1NIQVJFRCwKIAkJCQkgICAgICAgIltFREFDXSBQQ0kgZXJyIiwgcGNpKTsKIAkJaWYgKHJlcyA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICIlczogVW5hYmxlIHRvIHJlcXVlc3QgaXJxICVkIGZvciAiCi0JCQkgICAgICAgIk1QQzg1eHggUENJIGVyclxuIiwgX19mdW5jX18sIHBkYXRhLT5pcnEpOworCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlcXVlc3QgaXJxICVkIGZvciBNUEM4NXh4IFBDSSBlcnJcbiIsCisJCQkJX19mdW5jX18sIHBkYXRhLT5pcnEpOwogCQkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhwZGF0YS0+aXJxKTsKIAkJCXJlcyA9IC1FTk9ERVY7CiAJCQlnb3RvIGVycjI7CiAJCX0KIAotCQlwcmludGsoS0VSTl9JTkZPIEVEQUNfTU9EX1NUUiAiIGFjcXVpcmVkIGlycSAlZCBmb3IgUENJIEVyclxuIiwKKwkJcHJfaW5mbyhFREFDX01PRF9TVFIgIiBhY3F1aXJlZCBpcnEgJWQgZm9yIFBDSSBFcnJcbiIsCiAJCSAgICAgICBwZGF0YS0+aXJxKTsKIAl9CiAKQEAgLTM4Niw3ICsyODgsNyBAQAogCiAJZGV2cmVzX3JlbW92ZV9ncm91cCgmb3AtPmRldiwgbXBjODV4eF9wY2lfZXJyX3Byb2JlKTsKIAllZGFjX2RiZygzLCAic3VjY2Vzc1xuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyBFREFDX01PRF9TVFIgIiBQQ0kgZXJyIHJlZ2lzdGVyZWRcbiIpOworCXByX2luZm8oRURBQ19NT0RfU1RSICIgUENJIGVyciByZWdpc3RlcmVkXG4iKTsKIAogCXJldHVybiAwOwogCkBAIC01MjksMTcgKzQzMSwxNyBAQAogCWlmICghKGVycl9kZXRlY3QgJiBMMl9FREVfTUFTSykpCiAJCXJldHVybjsKIAotCXByaW50ayhLRVJOX0VSUiAiRUNDIEVycm9yIGluIENQVSBMMiBjYWNoZVxuIik7Ci0JcHJpbnRrKEtFUk5fRVJSICJMMiBFcnJvciBEZXRlY3QgUmVnaXN0ZXI6IDB4JTA4eFxuIiwgZXJyX2RldGVjdCk7Ci0JcHJpbnRrKEtFUk5fRVJSICJMMiBFcnJvciBDYXB0dXJlIERhdGEgSGlnaCBSZWdpc3RlcjogMHglMDh4XG4iLAorCXByX2VycigiRUNDIEVycm9yIGluIENQVSBMMiBjYWNoZVxuIik7CisJcHJfZXJyKCJMMiBFcnJvciBEZXRlY3QgUmVnaXN0ZXI6IDB4JTA4eFxuIiwgZXJyX2RldGVjdCk7CisJcHJfZXJyKCJMMiBFcnJvciBDYXB0dXJlIERhdGEgSGlnaCBSZWdpc3RlcjogMHglMDh4XG4iLAogCSAgICAgICBpbl9iZTMyKHBkYXRhLT5sMl92YmFzZSArIE1QQzg1WFhfTDJfQ0FQVERBVEFISSkpOwotCXByaW50ayhLRVJOX0VSUiAiTDIgRXJyb3IgQ2FwdHVyZSBEYXRhIExvIFJlZ2lzdGVyOiAweCUwOHhcbiIsCisJcHJfZXJyKCJMMiBFcnJvciBDYXB0dXJlIERhdGEgTG8gUmVnaXN0ZXI6IDB4JTA4eFxuIiwKIAkgICAgICAgaW5fYmUzMihwZGF0YS0+bDJfdmJhc2UgKyBNUEM4NVhYX0wyX0NBUFREQVRBTE8pKTsKLQlwcmludGsoS0VSTl9FUlIgIkwyIEVycm9yIFN5bmRyb21lIFJlZ2lzdGVyOiAweCUwOHhcbiIsCisJcHJfZXJyKCJMMiBFcnJvciBTeW5kcm9tZSBSZWdpc3RlcjogMHglMDh4XG4iLAogCSAgICAgICBpbl9iZTMyKHBkYXRhLT5sMl92YmFzZSArIE1QQzg1WFhfTDJfQ0FQVEVDQykpOwotCXByaW50ayhLRVJOX0VSUiAiTDIgRXJyb3IgQXR0cmlidXRlcyBDYXB0dXJlIFJlZ2lzdGVyOiAweCUwOHhcbiIsCisJcHJfZXJyKCJMMiBFcnJvciBBdHRyaWJ1dGVzIENhcHR1cmUgUmVnaXN0ZXI6IDB4JTA4eFxuIiwKIAkgICAgICAgaW5fYmUzMihwZGF0YS0+bDJfdmJhc2UgKyBNUEM4NVhYX0wyX0VSUkFUVFIpKTsKLQlwcmludGsoS0VSTl9FUlIgIkwyIEVycm9yIEFkZHJlc3MgQ2FwdHVyZSBSZWdpc3RlcjogMHglMDh4XG4iLAorCXByX2VycigiTDIgRXJyb3IgQWRkcmVzcyBDYXB0dXJlIFJlZ2lzdGVyOiAweCUwOHhcbiIsCiAJICAgICAgIGluX2JlMzIocGRhdGEtPmwyX3ZiYXNlICsgTVBDODVYWF9MMl9FUlJBRERSKSk7CiAKIAkvKiBjbGVhciBlcnJvciBkZXRlY3QgcmVnaXN0ZXIgKi8KQEAgLTU4OCw3ICs0OTAsNiBAQAogCiAJcGRhdGEgPSBlZGFjX2Rldi0+cHZ0X2luZm87CiAJcGRhdGEtPm5hbWUgPSAibXBjODV4eF9sMl9lcnIiOwotCXBkYXRhLT5pcnEgPSBOT19JUlE7CiAJZWRhY19kZXYtPmRldiA9ICZvcC0+ZGV2OwogCWRldl9zZXRfZHJ2ZGF0YShlZGFjX2Rldi0+ZGV2LCBlZGFjX2Rldik7CiAJZWRhY19kZXYtPmN0bF9uYW1lID0gcGRhdGEtPm5hbWU7CkBAIC01OTYsOCArNDk3LDcgQEAKIAogCXJlcyA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uob3AtPmRldi5vZl9ub2RlLCAwLCAmcik7CiAJaWYgKHJlcykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IHJlc291cmNlIGZvciAiCi0JCSAgICAgICAiTDIgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIGdldCByZXNvdXJjZSBmb3IgTDIgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKIAkJZ290byBlcnI7CiAJfQogCkBAIC02MDYsMTUgKzUwNiwxNCBAQAogCiAJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmb3AtPmRldiwgci5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmciksCiAJCQkJICAgICBwZGF0YS0+bmFtZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZW0gcmVnaW9uXG4iLAotCQkgICAgICAgX19mdW5jX18pOworCQlwcl9lcnIoIiVzOiBFcnJvciB3aGlsZSByZXF1ZXN0aW5nIG1lbSByZWdpb25cbiIsIF9fZnVuY19fKTsKIAkJcmVzID0gLUVCVVNZOwogCQlnb3RvIGVycjsKIAl9CiAKIAlwZGF0YS0+bDJfdmJhc2UgPSBkZXZtX2lvcmVtYXAoJm9wLT5kZXYsIHIuc3RhcnQsIHJlc291cmNlX3NpemUoJnIpKTsKIAlpZiAoIXBkYXRhLT5sMl92YmFzZSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gc2V0dXAgTDIgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHNldHVwIEwyIGVyciByZWdzXG4iLCBfX2Z1bmNfXyk7CiAJCXJlcyA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOwogCX0KQEAgLTY0NiwxNiArNTQ1LDE0IEBACiAJCQkJICAgICAgIG1wYzg1eHhfbDJfaXNyLCBJUlFGX1NIQVJFRCwKIAkJCQkgICAgICAgIltFREFDXSBMMiBlcnIiLCBlZGFjX2Rldik7CiAJCWlmIChyZXMgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiJXM6IFVuYWJsZSB0byByZXF1ZXN0IGlycSAlZCBmb3IgIgotCQkJICAgICAgICJNUEM4NXh4IEwyIGVyclxuIiwgX19mdW5jX18sIHBkYXRhLT5pcnEpOworCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlcXVlc3QgaXJxICVkIGZvciBNUEM4NXh4IEwyIGVyclxuIiwKKwkJCQlfX2Z1bmNfXywgcGRhdGEtPmlycSk7CiAJCQlpcnFfZGlzcG9zZV9tYXBwaW5nKHBkYXRhLT5pcnEpOwogCQkJcmVzID0gLUVOT0RFVjsKIAkJCWdvdG8gZXJyMjsKIAkJfQogCi0JCXByaW50ayhLRVJOX0lORk8gRURBQ19NT0RfU1RSICIgYWNxdWlyZWQgaXJxICVkIGZvciBMMiBFcnJcbiIsCi0JCSAgICAgICBwZGF0YS0+aXJxKTsKKwkJcHJfaW5mbyhFREFDX01PRF9TVFIgIiBhY3F1aXJlZCBpcnEgJWQgZm9yIEwyIEVyclxuIiwgcGRhdGEtPmlycSk7CiAKIAkJZWRhY19kZXYtPm9wX3N0YXRlID0gT1BfUlVOTklOR19JTlRFUlJVUFQ7CiAKQEAgLTY2NSw3ICs1NjIsNyBAQAogCWRldnJlc19yZW1vdmVfZ3JvdXAoJm9wLT5kZXYsIG1wYzg1eHhfbDJfZXJyX3Byb2JlKTsKIAogCWVkYWNfZGJnKDMsICJzdWNjZXNzXG4iKTsKLQlwcmludGsoS0VSTl9JTkZPIEVEQUNfTU9EX1NUUiAiIEwyIGVyciByZWdpc3RlcmVkXG4iKTsKKwlwcl9pbmZvKEVEQUNfTU9EX1NUUiAiIEwyIGVyciByZWdpc3RlcmVkXG4iKTsKIAogCXJldHVybiAwOwogCkBAIC03MjksNDY2ICs2MjYsNiBAQAogCX0sCiB9OwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNQyBFcnIgZGV2aWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFRha2VuIGZyb20gdGFibGUgOC01NSBpbiB0aGUgTVBDODY0MSBVc2VyJ3MgTWFudWFsIGFuZC9vciA5LTYxIGluIHRoZQotICogTVBDODU3MiBVc2VyJ3MgTWFudWFsLiAgRWFjaCBsaW5lIHJlcHJlc2VudHMgYSBzeW5kcm9tZSBiaXQgY29sdW1uIGFzIGEKLSAqIDY0LWJpdCB2YWx1ZSwgYnV0IHNwbGl0IGludG8gYW4gdXBwZXIgYW5kIGxvd2VyIDMyLWJpdCBjaHVuay4gIFRoZSBsYWJlbHMKLSAqIGJlbG93IGNvcnJlc3BvbmQgdG8gRnJlZXNjYWxlJ3MgbWFudWFscy4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBlY2NfdGFibGVbMTZdID0gewotCS8qIE1TQiAgICAgICAgICAgTFNCICovCi0JLyogWzA6MzFdICAgIFszMjo2M10gKi8KLQkweGYwMGZlMTFlLCAweGMzM2MwZmY3LAkvKiBTeW5kcm9tZSBiaXQgNyAqLwotCTB4MDBmZjAwZmYsIDB4MDBmZmYwZmYsCi0JMHgwZjBmMGYwZiwgMHgwZjBmZmYwMCwKLQkweDExMTEzMzMzLCAweDc3NzcwMDBmLAotCTB4MjIyMjQ0NDQsIDB4ODg4ODIyMmYsCi0JMHg0NDQ0ODg4OCwgMHhmZmZmNDQ0MSwKLQkweDg4ODhmZmZmLCAweDExMTE4ODgyLAotCTB4ZmZmZjExMTEsIDB4MjIyMjExMTQsCS8qIFN5bmRyb21lIGJpdCAwICovCi19OwotCi0vKgotICogQ2FsY3VsYXRlIHRoZSBjb3JyZWN0IEVDQyB2YWx1ZSBmb3IgYSA2NC1iaXQgdmFsdWUgc3BlY2lmaWVkIGJ5IGhpZ2g6bG93Ci0gKi8KLXN0YXRpYyB1OCBjYWxjdWxhdGVfZWNjKHUzMiBoaWdoLCB1MzIgbG93KQotewotCXUzMiBtYXNrX2xvdzsKLQl1MzIgbWFza19oaWdoOwotCWludCBiaXRfY250OwotCXU4IGVjYyA9IDA7Ci0JaW50IGk7Ci0JaW50IGo7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCW1hc2tfaGlnaCA9IGVjY190YWJsZVtpICogMl07Ci0JCW1hc2tfbG93ID0gZWNjX3RhYmxlW2kgKiAyICsgMV07Ci0JCWJpdF9jbnQgPSAwOwotCi0JCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7Ci0JCQlpZiAoKG1hc2tfaGlnaCA+PiBqKSAmIDEpCi0JCQkJYml0X2NudCBePSAoaGlnaCA+PiBqKSAmIDE7Ci0JCQlpZiAoKG1hc2tfbG93ID4+IGopICYgMSkKLQkJCQliaXRfY250IF49IChsb3cgPj4gaikgJiAxOwotCQl9Ci0KLQkJZWNjIHw9IGJpdF9jbnQgPDwgaTsKLQl9Ci0KLQlyZXR1cm4gZWNjOwotfQotCi0vKgotICogQ3JlYXRlIHRoZSBzeW5kcm9tZSBjb2RlIHdoaWNoIGlzIGdlbmVyYXRlZCBpZiB0aGUgZGF0YSBsaW5lIHNwZWNpZmllZCBieQotICogJ2JpdCcgZmFpbGVkLiAgRWcgZ2VuZXJhdGUgYW4gOC1iaXQgY29kZXMgc2VlbiBpbiBUYWJsZSA4LTU1IGluIHRoZSBNUEM4NjQxCi0gKiBVc2VyJ3MgTWFudWFsIGFuZCA5LTYxIGluIHRoZSBNUEM4NTcyIFVzZXIncyBNYW51YWwuCi0gKi8KLXN0YXRpYyB1OCBzeW5kcm9tZV9mcm9tX2JpdCh1bnNpZ25lZCBpbnQgYml0KSB7Ci0JaW50IGk7Ci0JdTggc3luZHJvbWUgPSAwOwotCi0JLyoKLQkgKiBDeWNsZSB0aHJvdWdoIHRoZSB1cHBlciBvciBsb3dlciAzMi1iaXQgcG9ydGlvbiBvZiBlYWNoIHZhbHVlIGluCi0JICogZWNjX3RhYmxlIGRlcGVuZGluZyBvbiBpZiAnYml0JyBpcyBpbiB0aGUgdXBwZXIgb3IgbG93ZXIgaGFsZiBvZgotCSAqIDY0LWJpdCBkYXRhLgotCSAqLwotCWZvciAoaSA9IGJpdCA8IDMyOyBpIDwgMTY7IGkgKz0gMikKLQkJc3luZHJvbWUgfD0gKChlY2NfdGFibGVbaV0gPj4gKGJpdCAlIDMyKSkgJiAxKSA8PCAoaSAvIDIpOwotCi0JcmV0dXJuIHN5bmRyb21lOwotfQotCi0vKgotICogRGVjb2RlIGRhdGEgYW5kIGVjYyBzeW5kcm9tZSB0byBkZXRlcm1pbmUgd2hhdCB3ZW50IHdyb25nCi0gKiBOb3RlOiBUaGlzIGNhbiBvbmx5IGRlY29kZSBzaW5nbGUtYml0IGVycm9ycwotICovCi1zdGF0aWMgdm9pZCBzYmVfZWNjX2RlY29kZSh1MzIgY2FwX2hpZ2gsIHUzMiBjYXBfbG93LCB1MzIgY2FwX2VjYywKLQkJICAgICAgIGludCAqYmFkX2RhdGFfYml0LCBpbnQgKmJhZF9lY2NfYml0KQotewotCWludCBpOwotCXU4IHN5bmRyb21lOwotCi0JKmJhZF9kYXRhX2JpdCA9IC0xOwotCSpiYWRfZWNjX2JpdCA9IC0xOwotCi0JLyoKLQkgKiBDYWxjdWxhdGUgdGhlIEVDQyBvZiB0aGUgY2FwdHVyZWQgZGF0YSBhbmQgWE9SIGl0IHdpdGggdGhlIGNhcHR1cmVkCi0JICogRUNDIHRvIGZpbmQgYW4gRUNDIHN5bmRyb21lIHZhbHVlIHdlIGNhbiBzZWFyY2ggZm9yCi0JICovCi0Jc3luZHJvbWUgPSBjYWxjdWxhdGVfZWNjKGNhcF9oaWdoLCBjYXBfbG93KSBeIGNhcF9lY2M7Ci0KLQkvKiBDaGVjayBpZiBhIGRhdGEgbGluZSBpcyBzdHVjay4uLiAqLwotCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0JCWlmIChzeW5kcm9tZSA9PSBzeW5kcm9tZV9mcm9tX2JpdChpKSkgewotCQkJKmJhZF9kYXRhX2JpdCA9IGk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKiBJZiBkYXRhIGlzIGNvcnJlY3QsIGNoZWNrIEVDQyBiaXRzIGZvciBlcnJvcnMuLi4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWlmICgoc3luZHJvbWUgPj4gaSkgJiAweDEpIHsKLQkJCSpiYWRfZWNjX2JpdCA9IGk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci19Ci0KLSNkZWZpbmUgbWFrZTY0KGhpZ2gsIGxvdykgKCgodTY0KShoaWdoKSA8PCAzMikgfCAobG93KSkKLQotc3RhdGljIHZvaWQgbXBjODV4eF9tY19jaGVjayhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCi17Ci0Jc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKLQlzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3c7Ci0JdTMyIGJ1c193aWR0aDsKLQl1MzIgZXJyX2RldGVjdDsKLQl1MzIgc3luZHJvbWU7Ci0JdTY0IGVycl9hZGRyOwotCXUzMiBwZm47Ci0JaW50IHJvd19pbmRleDsKLQl1MzIgY2FwX2hpZ2g7Ci0JdTMyIGNhcF9sb3c7Ci0JaW50IGJhZF9kYXRhX2JpdDsKLQlpbnQgYmFkX2VjY19iaXQ7Ci0KLQllcnJfZGV0ZWN0ID0gaW5fYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0VSUl9ERVRFQ1QpOwotCWlmICghZXJyX2RldGVjdCkKLQkJcmV0dXJuOwotCi0JbXBjODV4eF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwgIkVyciBEZXRlY3QgUmVnaXN0ZXI6ICUjOC44eFxuIiwKLQkJCSAgZXJyX2RldGVjdCk7Ci0KLQkvKiBubyBtb3JlIHByb2Nlc3NpbmcgaWYgbm90IEVDQyBiaXQgZXJyb3JzICovCi0JaWYgKCEoZXJyX2RldGVjdCAmIChERFJfRURFX1NCRSB8IEREUl9FREVfTUJFKSkpIHsKLQkJb3V0X2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19FUlJfREVURUNULCBlcnJfZGV0ZWN0KTsKLQkJcmV0dXJuOwotCX0KLQotCXN5bmRyb21lID0gaW5fYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0NBUFRVUkVfRUNDKTsKLQotCS8qIE1hc2sgb2ZmIGFwcHJvcHJpYXRlIGJpdHMgb2Ygc3luZHJvbWUgYmFzZWQgb24gYnVzIHdpZHRoICovCi0JYnVzX3dpZHRoID0gKGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19ERFJfU0RSQU1fQ0ZHKSAmCi0JCQlEU0NfREJXX01BU0spID8gMzIgOiA2NDsKLQlpZiAoYnVzX3dpZHRoID09IDY0KQotCQlzeW5kcm9tZSAmPSAweGZmOwotCWVsc2UKLQkJc3luZHJvbWUgJj0gMHhmZmZmOwotCi0JZXJyX2FkZHIgPSBtYWtlNjQoCi0JCWluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19DQVBUVVJFX0VYVF9BRERSRVNTKSwKLQkJaW5fYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0NBUFRVUkVfQUREUkVTUykpOwotCXBmbiA9IGVycl9hZGRyID4+IFBBR0VfU0hJRlQ7Ci0KLQlmb3IgKHJvd19pbmRleCA9IDA7IHJvd19pbmRleCA8IG1jaS0+bnJfY3Nyb3dzOyByb3dfaW5kZXgrKykgewotCQljc3JvdyA9IG1jaS0+Y3Nyb3dzW3Jvd19pbmRleF07Ci0JCWlmICgocGZuID49IGNzcm93LT5maXJzdF9wYWdlKSAmJiAocGZuIDw9IGNzcm93LT5sYXN0X3BhZ2UpKQotCQkJYnJlYWs7Ci0JfQotCi0JY2FwX2hpZ2ggPSBpbl9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfQ0FQVFVSRV9EQVRBX0hJKTsKLQljYXBfbG93ID0gaW5fYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0NBUFRVUkVfREFUQV9MTyk7Ci0KLQkvKgotCSAqIEFuYWx5emUgc2luZ2xlLWJpdCBlcnJvcnMgb24gNjQtYml0IHdpZGUgYnVzZXMKLQkgKiBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgMzItYml0IHdpZGUgYnVzZXMKLQkgKi8KLQlpZiAoKGVycl9kZXRlY3QgJiBERFJfRURFX1NCRSkgJiYgKGJ1c193aWR0aCA9PSA2NCkpIHsKLQkJc2JlX2VjY19kZWNvZGUoY2FwX2hpZ2gsIGNhcF9sb3csIHN5bmRyb21lLAotCQkJCSZiYWRfZGF0YV9iaXQsICZiYWRfZWNjX2JpdCk7Ci0KLQkJaWYgKGJhZF9kYXRhX2JpdCAhPSAtMSkKLQkJCW1wYzg1eHhfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsCi0JCQkJIkZhdWx0eSBEYXRhIGJpdDogJWRcbiIsIGJhZF9kYXRhX2JpdCk7Ci0JCWlmIChiYWRfZWNjX2JpdCAhPSAtMSkKLQkJCW1wYzg1eHhfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsCi0JCQkJIkZhdWx0eSBFQ0MgYml0OiAlZFxuIiwgYmFkX2VjY19iaXQpOwotCi0JCW1wYzg1eHhfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsCi0JCQkiRXhwZWN0ZWQgRGF0YSAvIEVDQzpcdCUjOC44eF8lMDh4IC8gJSMyLjJ4XG4iLAotCQkJY2FwX2hpZ2ggXiAoMSA8PCAoYmFkX2RhdGFfYml0IC0gMzIpKSwKLQkJCWNhcF9sb3cgXiAoMSA8PCBiYWRfZGF0YV9iaXQpLAotCQkJc3luZHJvbWUgXiAoMSA8PCBiYWRfZWNjX2JpdCkpOwotCX0KLQotCW1wYzg1eHhfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsCi0JCQkiQ2FwdHVyZWQgRGF0YSAvIEVDQzpcdCUjOC44eF8lMDh4IC8gJSMyLjJ4XG4iLAotCQkJY2FwX2hpZ2gsIGNhcF9sb3csIHN5bmRyb21lKTsKLQltcGM4NXh4X21jX3ByaW50ayhtY2ksIEtFUk5fRVJSLCAiRXJyIGFkZHI6ICUjOC44bGx4XG4iLCBlcnJfYWRkcik7Ci0JbXBjODV4eF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwgIlBGTjogJSM4Ljh4XG4iLCBwZm4pOwotCi0JLyogd2UgYXJlIG91dCBvZiByYW5nZSAqLwotCWlmIChyb3dfaW5kZXggPT0gbWNpLT5ucl9jc3Jvd3MpCi0JCW1wYzg1eHhfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsICJQRk4gb3V0IG9mIHJhbmdlIVxuIik7Ci0KLQlpZiAoZXJyX2RldGVjdCAmIEREUl9FREVfU0JFKQotCQllZGFjX21jX2hhbmRsZV9lcnJvcihIV19FVkVOVF9FUlJfQ09SUkVDVEVELCBtY2ksIDEsCi0JCQkJICAgICBwZm4sIGVycl9hZGRyICYgflBBR0VfTUFTSywgc3luZHJvbWUsCi0JCQkJICAgICByb3dfaW5kZXgsIDAsIC0xLAotCQkJCSAgICAgbWNpLT5jdGxfbmFtZSwgIiIpOwotCi0JaWYgKGVycl9kZXRlY3QgJiBERFJfRURFX01CRSkKLQkJZWRhY19tY19oYW5kbGVfZXJyb3IoSFdfRVZFTlRfRVJSX1VOQ09SUkVDVEVELCBtY2ksIDEsCi0JCQkJICAgICBwZm4sIGVycl9hZGRyICYgflBBR0VfTUFTSywgc3luZHJvbWUsCi0JCQkJICAgICByb3dfaW5kZXgsIDAsIC0xLAotCQkJCSAgICAgbWNpLT5jdGxfbmFtZSwgIiIpOwotCi0Jb3V0X2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19FUlJfREVURUNULCBlcnJfZGV0ZWN0KTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IG1wYzg1eHhfbWNfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSBkZXZfaWQ7Ci0Jc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKLQl1MzIgZXJyX2RldGVjdDsKLQotCWVycl9kZXRlY3QgPSBpbl9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfRVJSX0RFVEVDVCk7Ci0JaWYgKCFlcnJfZGV0ZWN0KQotCQlyZXR1cm4gSVJRX05PTkU7Ci0KLQltcGM4NXh4X21jX2NoZWNrKG1jaSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wYzg1eHhfaW5pdF9jc3Jvd3Moc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQotewotCXN0cnVjdCBtcGM4NXh4X21jX3BkYXRhICpwZGF0YSA9IG1jaS0+cHZ0X2luZm87Ci0Jc3RydWN0IGNzcm93X2luZm8gKmNzcm93OwotCXN0cnVjdCBkaW1tX2luZm8gKmRpbW07Ci0JdTMyIHNkcmFtX2N0bDsKLQl1MzIgc2R0eXBlOwotCWVudW0gbWVtX3R5cGUgbXR5cGU7Ci0JdTMyIGNzX2JuZHM7Ci0JaW50IGluZGV4OwotCi0Jc2RyYW1fY3RsID0gaW5fYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0REUl9TRFJBTV9DRkcpOwotCi0Jc2R0eXBlID0gc2RyYW1fY3RsICYgRFNDX1NEVFlQRV9NQVNLOwotCWlmIChzZHJhbV9jdGwgJiBEU0NfUkRfRU4pIHsKLQkJc3dpdGNoIChzZHR5cGUpIHsKLQkJY2FzZSBEU0NfU0RUWVBFX0REUjoKLQkJCW10eXBlID0gTUVNX1JERFI7Ci0JCQlicmVhazsKLQkJY2FzZSBEU0NfU0RUWVBFX0REUjI6Ci0JCQltdHlwZSA9IE1FTV9SRERSMjsKLQkJCWJyZWFrOwotCQljYXNlIERTQ19TRFRZUEVfRERSMzoKLQkJCW10eXBlID0gTUVNX1JERFIzOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQltdHlwZSA9IE1FTV9VTktOT1dOOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlzd2l0Y2ggKHNkdHlwZSkgewotCQljYXNlIERTQ19TRFRZUEVfRERSOgotCQkJbXR5cGUgPSBNRU1fRERSOwotCQkJYnJlYWs7Ci0JCWNhc2UgRFNDX1NEVFlQRV9ERFIyOgotCQkJbXR5cGUgPSBNRU1fRERSMjsKLQkJCWJyZWFrOwotCQljYXNlIERTQ19TRFRZUEVfRERSMzoKLQkJCW10eXBlID0gTUVNX0REUjM7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCW10eXBlID0gTUVNX1VOS05PV047Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1jaS0+bnJfY3Nyb3dzOyBpbmRleCsrKSB7Ci0JCXUzMiBzdGFydDsKLQkJdTMyIGVuZDsKLQotCQljc3JvdyA9IG1jaS0+Y3Nyb3dzW2luZGV4XTsKLQkJZGltbSA9IGNzcm93LT5jaGFubmVsc1swXS0+ZGltbTsKLQotCQljc19ibmRzID0gaW5fYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0NTX0JORFNfMCArCi0JCQkJICAoaW5kZXggKiBNUEM4NVhYX01DX0NTX0JORFNfT0ZTKSk7Ci0KLQkJc3RhcnQgPSAoY3NfYm5kcyAmIDB4ZmZmZjAwMDApID4+IDE2OwotCQllbmQgICA9IChjc19ibmRzICYgMHgwMDAwZmZmZik7Ci0KLQkJaWYgKHN0YXJ0ID09IGVuZCkKLQkJCWNvbnRpbnVlOwkvKiBub3QgcG9wdWxhdGVkICovCi0KLQkJc3RhcnQgPDw9ICgyNCAtIFBBR0VfU0hJRlQpOwotCQllbmQgICA8PD0gKDI0IC0gUEFHRV9TSElGVCk7Ci0JCWVuZCAgICB8PSAoMSA8PCAoMjQgLSBQQUdFX1NISUZUKSkgLSAxOwotCi0JCWNzcm93LT5maXJzdF9wYWdlID0gc3RhcnQ7Ci0JCWNzcm93LT5sYXN0X3BhZ2UgPSBlbmQ7Ci0KLQkJZGltbS0+bnJfcGFnZXMgPSBlbmQgKyAxIC0gc3RhcnQ7Ci0JCWRpbW0tPmdyYWluID0gODsKLQkJZGltbS0+bXR5cGUgPSBtdHlwZTsKLQkJZGltbS0+ZHR5cGUgPSBERVZfVU5LTk9XTjsKLQkJaWYgKHNkcmFtX2N0bCAmIERTQ19YMzJfRU4pCi0JCQlkaW1tLT5kdHlwZSA9IERFVl9YMzI7Ci0JCWRpbW0tPmVkYWNfbW9kZSA9IEVEQUNfU0VDREVEOwotCX0KLX0KLQotc3RhdGljIGludCBtcGM4NXh4X21jX2Vycl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCkKLXsKLQlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7Ci0Jc3RydWN0IGVkYWNfbWNfbGF5ZXIgbGF5ZXJzWzJdOwotCXN0cnVjdCBtcGM4NXh4X21jX3BkYXRhICpwZGF0YTsKLQlzdHJ1Y3QgcmVzb3VyY2UgcjsKLQl1MzIgc2RyYW1fY3RsOwotCWludCByZXM7Ci0KLQlpZiAoIWRldnJlc19vcGVuX2dyb3VwKCZvcC0+ZGV2LCBtcGM4NXh4X21jX2Vycl9wcm9iZSwgR0ZQX0tFUk5FTCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbGF5ZXJzWzBdLnR5cGUgPSBFREFDX01DX0xBWUVSX0NISVBfU0VMRUNUOwotCWxheWVyc1swXS5zaXplID0gNDsKLQlsYXllcnNbMF0uaXNfdmlydF9jc3JvdyA9IHRydWU7Ci0JbGF5ZXJzWzFdLnR5cGUgPSBFREFDX01DX0xBWUVSX0NIQU5ORUw7Ci0JbGF5ZXJzWzFdLnNpemUgPSAxOwotCWxheWVyc1sxXS5pc192aXJ0X2Nzcm93ID0gZmFsc2U7Ci0JbWNpID0gZWRhY19tY19hbGxvYyhlZGFjX21jX2lkeCwgQVJSQVlfU0laRShsYXllcnMpLCBsYXllcnMsCi0JCQkgICAgc2l6ZW9mKCpwZGF0YSkpOwotCWlmICghbWNpKSB7Ci0JCWRldnJlc19yZWxlYXNlX2dyb3VwKCZvcC0+ZGV2LCBtcGM4NXh4X21jX2Vycl9wcm9iZSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXBkYXRhID0gbWNpLT5wdnRfaW5mbzsKLQlwZGF0YS0+bmFtZSA9ICJtcGM4NXh4X21jX2VyciI7Ci0JcGRhdGEtPmlycSA9IE5PX0lSUTsKLQltY2ktPnBkZXYgPSAmb3AtPmRldjsKLQlwZGF0YS0+ZWRhY19pZHggPSBlZGFjX21jX2lkeCsrOwotCWRldl9zZXRfZHJ2ZGF0YShtY2ktPnBkZXYsIG1jaSk7Ci0JbWNpLT5jdGxfbmFtZSA9IHBkYXRhLT5uYW1lOwotCW1jaS0+ZGV2X25hbWUgPSBwZGF0YS0+bmFtZTsKLQotCXJlcyA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uob3AtPmRldi5vZl9ub2RlLCAwLCAmcik7Ci0JaWYgKHJlcykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IHJlc291cmNlIGZvciBNQyBlcnIgcmVnc1xuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmb3AtPmRldiwgci5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmciksCi0JCQkJICAgICBwZGF0YS0+bmFtZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZW0gcmVnaW9uXG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCQlyZXMgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXBkYXRhLT5tY192YmFzZSA9IGRldm1faW9yZW1hcCgmb3AtPmRldiwgci5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcikpOwotCWlmICghcGRhdGEtPm1jX3ZiYXNlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBzZXR1cCBNQyBlcnIgcmVnc1xuIiwgX19mdW5jX18pOwotCQlyZXMgPSAtRU5PTUVNOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlzZHJhbV9jdGwgPSBpbl9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfRERSX1NEUkFNX0NGRyk7Ci0JaWYgKCEoc2RyYW1fY3RsICYgRFNDX0VDQ19FTikpIHsKLQkJLyogbm8gRUNDICovCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyBFQ0MgRElNTXMgZGlzY292ZXJlZFxuIiwgX19mdW5jX18pOwotCQlyZXMgPSAtRU5PREVWOwotCQlnb3RvIGVycjsKLQl9Ci0KLQllZGFjX2RiZygzLCAiaW5pdCBtY2lcbiIpOwotCW1jaS0+bXR5cGVfY2FwID0gTUVNX0ZMQUdfUkREUiB8IE1FTV9GTEFHX1JERFIyIHwKLQkgICAgTUVNX0ZMQUdfRERSIHwgTUVNX0ZMQUdfRERSMjsKLQltY2ktPmVkYWNfY3RsX2NhcCA9IEVEQUNfRkxBR19OT05FIHwgRURBQ19GTEFHX1NFQ0RFRDsKLQltY2ktPmVkYWNfY2FwID0gRURBQ19GTEFHX1NFQ0RFRDsKLQltY2ktPm1vZF9uYW1lID0gRURBQ19NT0RfU1RSOwotCW1jaS0+bW9kX3ZlciA9IE1QQzg1WFhfUkVWSVNJT047Ci0KLQlpZiAoZWRhY19vcF9zdGF0ZSA9PSBFREFDX09QU1RBVEVfUE9MTCkKLQkJbWNpLT5lZGFjX2NoZWNrID0gbXBjODV4eF9tY19jaGVjazsKLQotCW1jaS0+Y3RsX3BhZ2VfdG9fcGh5cyA9IE5VTEw7Ci0KLQltY2ktPnNjcnViX21vZGUgPSBTQ1JVQl9TV19TUkM7Ci0KLQltcGM4NXh4X2luaXRfY3Nyb3dzKG1jaSk7Ci0KLQkvKiBzdG9yZSB0aGUgb3JpZ2luYWwgZXJyb3IgZGlzYWJsZSBiaXRzICovCi0Jb3JpZ19kZHJfZXJyX2Rpc2FibGUgPQotCSAgICBpbl9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfRVJSX0RJU0FCTEUpOwotCW91dF9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfRVJSX0RJU0FCTEUsIDApOwotCi0JLyogY2xlYXIgYWxsIGVycm9yIGJpdHMgKi8KLQlvdXRfYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0VSUl9ERVRFQ1QsIH4wKTsKLQotCWlmIChlZGFjX21jX2FkZF9tY193aXRoX2dyb3VwcyhtY2ksIG1wYzg1eHhfZGV2X2dyb3VwcykpIHsKLQkJZWRhY19kYmcoMywgImZhaWxlZCBlZGFjX21jX2FkZF9tYygpXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKGVkYWNfb3Bfc3RhdGUgPT0gRURBQ19PUFNUQVRFX0lOVCkgewotCQlvdXRfYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0VSUl9JTlRfRU4sCi0JCQkgRERSX0VJRV9NQkVFIHwgRERSX0VJRV9TQkVFKTsKLQotCQkvKiBzdG9yZSB0aGUgb3JpZ2luYWwgZXJyb3IgbWFuYWdlbWVudCB0aHJlc2hvbGQgKi8KLQkJb3JpZ19kZHJfZXJyX3NiZSA9IGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsKLQkJCQkJICAgTVBDODVYWF9NQ19FUlJfU0JFKSAmIDB4ZmYwMDAwOwotCi0JCS8qIHNldCB0aHJlc2hvbGQgdG8gMSBlcnJvciBwZXIgaW50ZXJydXB0ICovCi0JCW91dF9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfRVJSX1NCRSwgMHgxMDAwMCk7Ci0KLQkJLyogcmVnaXN0ZXIgaW50ZXJydXB0cyAqLwotCQlwZGF0YS0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob3AtPmRldi5vZl9ub2RlLCAwKTsKLQkJcmVzID0gZGV2bV9yZXF1ZXN0X2lycSgmb3AtPmRldiwgcGRhdGEtPmlycSwKLQkJCQkgICAgICAgbXBjODV4eF9tY19pc3IsCi0JCQkJICAgICAgIElSUUZfU0hBUkVELAotCQkJCSAgICAgICAiW0VEQUNdIE1DIGVyciIsIG1jaSk7Ci0JCWlmIChyZXMgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gcmVxdWVzdCBpcnEgJWQgZm9yICIKLQkJCSAgICAgICAiTVBDODV4eCBEUkFNIEVSUlxuIiwgX19mdW5jX18sIHBkYXRhLT5pcnEpOwotCQkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhwZGF0YS0+aXJxKTsKLQkJCXJlcyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGVycjI7Ci0JCX0KLQotCQlwcmludGsoS0VSTl9JTkZPIEVEQUNfTU9EX1NUUiAiIGFjcXVpcmVkIGlycSAlZCBmb3IgTUNcbiIsCi0JCSAgICAgICBwZGF0YS0+aXJxKTsKLQl9Ci0KLQlkZXZyZXNfcmVtb3ZlX2dyb3VwKCZvcC0+ZGV2LCBtcGM4NXh4X21jX2Vycl9wcm9iZSk7Ci0JZWRhY19kYmcoMywgInN1Y2Nlc3NcbiIpOwotCXByaW50ayhLRVJOX0lORk8gRURBQ19NT0RfU1RSICIgTUMgZXJyIHJlZ2lzdGVyZWRcbiIpOwotCi0JcmV0dXJuIDA7Ci0KLWVycjI6Ci0JZWRhY19tY19kZWxfbWMoJm9wLT5kZXYpOwotZXJyOgotCWRldnJlc19yZWxlYXNlX2dyb3VwKCZvcC0+ZGV2LCBtcGM4NXh4X21jX2Vycl9wcm9iZSk7Ci0JZWRhY19tY19mcmVlKG1jaSk7Ci0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludCBtcGM4NXh4X21jX2Vycl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3ApCi17Ci0Jc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKLQlzdHJ1Y3QgbXBjODV4eF9tY19wZGF0YSAqcGRhdGEgPSBtY2ktPnB2dF9pbmZvOwotCi0JZWRhY19kYmcoMCwgIlxuIik7Ci0KLQlpZiAoZWRhY19vcF9zdGF0ZSA9PSBFREFDX09QU1RBVEVfSU5UKSB7Ci0JCW91dF9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfRVJSX0lOVF9FTiwgMCk7Ci0JCWlycV9kaXNwb3NlX21hcHBpbmcocGRhdGEtPmlycSk7Ci0JfQotCi0Jb3V0X2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19FUlJfRElTQUJMRSwKLQkJIG9yaWdfZGRyX2Vycl9kaXNhYmxlKTsKLQlvdXRfYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0VSUl9TQkUsIG9yaWdfZGRyX2Vycl9zYmUpOwotCi0JZWRhY19tY19kZWxfbWMoJm9wLT5kZXYpOwotCWVkYWNfbWNfZnJlZShtY2kpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtcGM4NXh4X21jX2Vycl9vZl9tYXRjaFtdID0gewogLyogZGVwcmVjYXRlIHRoZSBmc2wsODUuLiBmb3JtcyBpbiB0aGUgZnV0dXJlLCAyLjYuMzA/ICovCiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU0MC1tZW1vcnktY29udHJvbGxlciIsIH0sCkBAIC0xMjE3LDIyICs2NTQsMTQgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1wYzg1eHhfbWNfZXJyX29mX21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXBjODV4eF9tY19lcnJfZHJpdmVyID0gewotCS5wcm9iZSA9IG1wYzg1eHhfbWNfZXJyX3Byb2JlLAotCS5yZW1vdmUgPSBtcGM4NXh4X21jX2Vycl9yZW1vdmUsCisJLnByb2JlID0gZnNsX21jX2Vycl9wcm9iZSwKKwkucmVtb3ZlID0gZnNsX21jX2Vycl9yZW1vdmUsCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAibXBjODV4eF9tY19lcnIiLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBtcGM4NXh4X21jX2Vycl9vZl9tYXRjaCwKIAl9LAogfTsKIAotI2lmZGVmIENPTkZJR19GU0xfU09DX0JPT0tFCi1zdGF0aWMgdm9pZCBfX2luaXQgbXBjODV4eF9tY19jbGVhcl9yZnhlKHZvaWQgKmRhdGEpCi17Ci0Jb3JpZ19oaWQxW3NtcF9wcm9jZXNzb3JfaWQoKV0gPSBtZnNwcihTUFJOX0hJRDEpOwotCW10c3ByKFNQUk5fSElEMSwgKG9yaWdfaGlkMVtzbXBfcHJvY2Vzc29yX2lkKCldICYgfkhJRDFfUkZYRSkpOwotfQotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICogY29uc3QgZHJpdmVyc1tdID0gewogCSZtcGM4NXh4X21jX2Vycl9kcml2ZXIsCiAJJm1wYzg1eHhfbDJfZXJyX2RyaXZlciwKQEAgLTEyNDYsOCArNjc1LDcgQEAKIAlpbnQgcmVzID0gMDsKIAl1MzIgX19tYXliZV91bnVzZWQgcHZyID0gMDsKIAotCXByaW50ayhLRVJOX0lORk8gIkZyZWVzY2FsZShSKSBNUEM4NXh4IEVEQUMgZHJpdmVyLCAiCi0JICAgICAgICIoQykgMjAwNiBNb250YXZpc3RhIFNvZnR3YXJlXG4iKTsKKwlwcl9pbmZvKCJGcmVlc2NhbGUoUikgTVBDODV4eCBFREFDIGRyaXZlciwgKEMpIDIwMDYgTW9udGF2aXN0YSBTb2Z0d2FyZVxuIik7CiAKIAkvKiBtYWtlIHN1cmUgZXJyb3IgcmVwb3J0aW5nIG1ldGhvZCBpcyBzYW5lICovCiAJc3dpdGNoIChlZGFjX29wX3N0YXRlKSB7CkBAIC0xMjYxLDQ0ICs2ODksMTUgQEAKIAogCXJlcyA9IHBsYXRmb3JtX3JlZ2lzdGVyX2RyaXZlcnMoZHJpdmVycywgQVJSQVlfU0laRShkcml2ZXJzKSk7CiAJaWYgKHJlcykKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBFREFDX01PRF9TVFIgImRyaXZlcnMgZmFpbCB0byByZWdpc3RlclxuIik7Ci0KLSNpZmRlZiBDT05GSUdfRlNMX1NPQ19CT09LRQotCXB2ciA9IG1mc3ByKFNQUk5fUFZSKTsKLQotCWlmICgoUFZSX1ZFUihwdnIpID09IFBWUl9WRVJfRTUwMFYxKSB8fAotCSAgICAoUFZSX1ZFUihwdnIpID09IFBWUl9WRVJfRTUwMFYyKSkgewotCQkvKgotCQkgKiBuZWVkIHRvIGNsZWFyIEhJRDFbUkZYRV0gdG8gZGlzYWJsZSBtYWNoaW5lIGNoZWNrIGludAotCQkgKiBzbyB3ZSBjYW4gY2F0Y2ggaXQKLQkJICovCi0JCWlmIChlZGFjX29wX3N0YXRlID09IEVEQUNfT1BTVEFURV9JTlQpCi0JCQlvbl9lYWNoX2NwdShtcGM4NXh4X21jX2NsZWFyX3JmeGUsIE5VTEwsIDApOwotCX0KLSNlbmRpZgorCQlwcl93YXJuKEVEQUNfTU9EX1NUUiAiZHJpdmVycyBmYWlsIHRvIHJlZ2lzdGVyXG4iKTsKIAogCXJldHVybiAwOwogfQogCiBtb2R1bGVfaW5pdChtcGM4NXh4X21jX2luaXQpOwogCi0jaWZkZWYgQ09ORklHX0ZTTF9TT0NfQk9PS0UKLXN0YXRpYyB2b2lkIF9fZXhpdCBtcGM4NXh4X21jX3Jlc3RvcmVfaGlkMSh2b2lkICpkYXRhKQotewotCW10c3ByKFNQUk5fSElEMSwgb3JpZ19oaWQxW3NtcF9wcm9jZXNzb3JfaWQoKV0pOwotfQotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIF9fZXhpdCBtcGM4NXh4X21jX2V4aXQodm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfRlNMX1NPQ19CT09LRQotCXUzMiBwdnIgPSBtZnNwcihTUFJOX1BWUik7Ci0KLQlpZiAoKFBWUl9WRVIocHZyKSA9PSBQVlJfVkVSX0U1MDBWMSkgfHwKLQkgICAgKFBWUl9WRVIocHZyKSA9PSBQVlJfVkVSX0U1MDBWMikpIHsKLQkJb25fZWFjaF9jcHUobXBjODV4eF9tY19yZXN0b3JlX2hpZDEsIE5VTEwsIDApOwotCX0KLSNlbmRpZgogCXBsYXRmb3JtX3VucmVnaXN0ZXJfZHJpdmVycyhkcml2ZXJzLCBBUlJBWV9TSVpFKGRyaXZlcnMpKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5oIGIvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5oCmluZGV4IDkzNTJlODguLjNmNmZiMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuaAorKysgYi9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmgKQEAgLTE3LDY1ICsxNyw2IEBACiAjZGVmaW5lIG1wYzg1eHhfcHJpbnRrKGxldmVsLCBmbXQsIGFyZy4uLikgXAogCWVkYWNfcHJpbnRrKGxldmVsLCAiTVBDODV4eCIsIGZtdCwgIyNhcmcpCiAKLSNkZWZpbmUgbXBjODV4eF9tY19wcmludGsobWNpLCBsZXZlbCwgZm10LCBhcmcuLi4pIFwKLQllZGFjX21jX2NoaXBzZXRfcHJpbnRrKG1jaSwgbGV2ZWwsICJNUEM4NXh4IiwgZm10LCAjI2FyZykKLQotLyoKLSAqIERSQU0gZXJyb3IgZGVmaW5lcwotICovCi0KLS8qIEREUl9TRFJBTV9DRkcgKi8KLSNkZWZpbmUgTVBDODVYWF9NQ19ERFJfU0RSQU1fQ0ZHCTB4MDExMAotI2RlZmluZSBNUEM4NVhYX01DX0NTX0JORFNfMAkJMHgwMDAwCi0jZGVmaW5lIE1QQzg1WFhfTUNfQ1NfQk5EU18xCQkweDAwMDgKLSNkZWZpbmUgTVBDODVYWF9NQ19DU19CTkRTXzIJCTB4MDAxMAotI2RlZmluZSBNUEM4NVhYX01DX0NTX0JORFNfMwkJMHgwMDE4Ci0jZGVmaW5lIE1QQzg1WFhfTUNfQ1NfQk5EU19PRlMJCTB4MDAwOAotCi0jZGVmaW5lIE1QQzg1WFhfTUNfREFUQV9FUlJfSU5KRUNUX0hJCTB4MGUwMAotI2RlZmluZSBNUEM4NVhYX01DX0RBVEFfRVJSX0lOSkVDVF9MTwkweDBlMDQKLSNkZWZpbmUgTVBDODVYWF9NQ19FQ0NfRVJSX0lOSkVDVAkweDBlMDgKLSNkZWZpbmUgTVBDODVYWF9NQ19DQVBUVVJFX0RBVEFfSEkJMHgwZTIwCi0jZGVmaW5lIE1QQzg1WFhfTUNfQ0FQVFVSRV9EQVRBX0xPCTB4MGUyNAotI2RlZmluZSBNUEM4NVhYX01DX0NBUFRVUkVfRUNDCQkweDBlMjgKLSNkZWZpbmUgTVBDODVYWF9NQ19FUlJfREVURUNUCQkweDBlNDAKLSNkZWZpbmUgTVBDODVYWF9NQ19FUlJfRElTQUJMRQkJMHgwZTQ0Ci0jZGVmaW5lIE1QQzg1WFhfTUNfRVJSX0lOVF9FTgkJMHgwZTQ4Ci0jZGVmaW5lIE1QQzg1WFhfTUNfQ0FQVFVSRV9BVFJJQlVURVMJMHgwZTRjCi0jZGVmaW5lIE1QQzg1WFhfTUNfQ0FQVFVSRV9BRERSRVNTCTB4MGU1MAotI2RlZmluZSBNUEM4NVhYX01DX0NBUFRVUkVfRVhUX0FERFJFU1MJMHgwZTU0Ci0jZGVmaW5lIE1QQzg1WFhfTUNfRVJSX1NCRQkJMHgwZTU4Ci0KLSNkZWZpbmUgRFNDX01FTV9FTgkweDgwMDAwMDAwCi0jZGVmaW5lIERTQ19FQ0NfRU4JMHgyMDAwMDAwMAotI2RlZmluZSBEU0NfUkRfRU4JMHgxMDAwMDAwMAotI2RlZmluZSBEU0NfREJXX01BU0sJMHgwMDE4MDAwMAotI2RlZmluZSBEU0NfREJXXzMyCTB4MDAwODAwMDAKLSNkZWZpbmUgRFNDX0RCV182NAkweDAwMDAwMDAwCi0KLSNkZWZpbmUgRFNDX1NEVFlQRV9NQVNLCQkweDA3MDAwMDAwCi0KLSNkZWZpbmUgRFNDX1NEVFlQRV9ERFIJCTB4MDIwMDAwMDAKLSNkZWZpbmUgRFNDX1NEVFlQRV9ERFIyCQkweDAzMDAwMDAwCi0jZGVmaW5lIERTQ19TRFRZUEVfRERSMwkJMHgwNzAwMDAwMAotI2RlZmluZSBEU0NfWDMyX0VOCTB4MDAwMDAwMjAKLQotLyogRXJyX0ludF9FbiAqLwotI2RlZmluZSBERFJfRUlFX01TRUUJMHgxCS8qIG1lbW9yeSBzZWxlY3QgKi8KLSNkZWZpbmUgRERSX0VJRV9TQkVFCTB4NAkvKiBzaW5nbGUtYml0IEVDQyBlcnJvciAqLwotI2RlZmluZSBERFJfRUlFX01CRUUJMHg4CS8qIG11bHRpLWJpdCBFQ0MgZXJyb3IgKi8KLQotLyogRXJyX0RldGVjdCAqLwotI2RlZmluZSBERFJfRURFX01TRQkJMHgxCS8qIG1lbW9yeSBzZWxlY3QgKi8KLSNkZWZpbmUgRERSX0VERV9TQkUJCTB4NAkvKiBzaW5nbGUtYml0IEVDQyBlcnJvciAqLwotI2RlZmluZSBERFJfRURFX01CRQkJMHg4CS8qIG11bHRpLWJpdCBFQ0MgZXJyb3IgKi8KLSNkZWZpbmUgRERSX0VERV9NTUUJCTB4ODAwMDAwMDAJLyogbXVsdGlwbGUgbWVtb3J5IGVycm9ycyAqLwotCi0vKiBFcnJfRGlzYWJsZSAqLwotI2RlZmluZSBERFJfRURJX01TRUQJMHgxCS8qIG1lbW9yeSBzZWxlY3QgZGlzYWJsZSAqLwotI2RlZmluZQlERFJfRURJX1NCRUQJMHg0CS8qIHNpbmdsZS1iaXQgRUNDIGVycm9yIGRpc2FibGUgKi8KLSNkZWZpbmUJRERSX0VESV9NQkVECTB4OAkvKiBtdWx0aS1iaXQgRUNDIGVycm9yIGRpc2FibGUgKi8KLQogLyoKICAqIEwyIEVyciBkZWZpbmVzCiAgKi8KQEAgLTE0OSwxMyArOTAsNiBAQAogI2RlZmluZSBNUEM4NVhYX1BDSUVfRVJSX0NBUF9SMgkJMHgwMDMwCiAjZGVmaW5lIE1QQzg1WFhfUENJRV9FUlJfQ0FQX1IzCQkweDAwMzQKIAotc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgewotCWNoYXIgKm5hbWU7Ci0JaW50IGVkYWNfaWR4OwotCXZvaWQgX19pb21lbSAqbWNfdmJhc2U7Ci0JaW50IGlycTsKLX07Ci0KIHN0cnVjdCBtcGM4NXh4X2wyX3BkYXRhIHsKIAljaGFyICpuYW1lOwogCWludCBlZGFjX2lkeDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9tdjY0eDYwX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9tdjY0eDYwX2VkYWMuYwppbmRleCA2YzU0MTI3Li5jYjliODU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvbXY2NHg2MF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL212NjR4NjBfZWRhYy5jCkBAIC0xMTgsNyArMTE4LDYgQEAKIAogCXBkYXRhLT5wY2lfaG9zZSA9IHBkZXYtPmlkOwogCXBkYXRhLT5uYW1lID0gIm1wYzg1eHhfcGNpX2VyciI7Ci0JcGRhdGEtPmlycSA9IE5PX0lSUTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwY2kpOwogCXBjaS0+ZGV2ID0gJnBkZXYtPmRldjsKIAlwY2ktPmRldl9uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7CkBAIC0yOTEsNyArMjkwLDYgQEAKIAogCXBkYXRhID0gZWRhY19kZXYtPnB2dF9pbmZvOwogCXBkYXRhLT5uYW1lID0gIm12NjR4NjBfc3JhbV9lcnIiOwotCXBkYXRhLT5pcnEgPSBOT19JUlE7CiAJZWRhY19kZXYtPmRldiA9ICZwZGV2LT5kZXY7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZWRhY19kZXYpOwogCWVkYWNfZGV2LT5kZXZfbmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwpAQCAtNDU5LDcgKzQ1Nyw2IEBACiAKIAlwZGF0YSA9IGVkYWNfZGV2LT5wdnRfaW5mbzsKIAlwZGF0YS0+bmFtZSA9ICJtdjY0eDYwX2NwdV9lcnIiOwotCXBkYXRhLT5pcnEgPSBOT19JUlE7CiAJZWRhY19kZXYtPmRldiA9ICZwZGV2LT5kZXY7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZWRhY19kZXYpOwogCWVkYWNfZGV2LT5kZXZfbmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwpAQCAtNzI3LDcgKzcyNCw2IEBACiAJbWNpLT5wZGV2ID0gJnBkZXYtPmRldjsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtY2kpOwogCXBkYXRhLT5uYW1lID0gIm12NjR4NjBfbWNfZXJyIjsKLQlwZGF0YS0+aXJxID0gTk9fSVJROwogCW1jaS0+ZGV2X25hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKIAlwZGF0YS0+ZWRhY19pZHggPSBlZGFjX21jX2lkeCsrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvcHBjNHh4X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9wcGM0eHhfZWRhYy5jCmluZGV4IGQzYTY0YmEuLjY5MWNlMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9wcGM0eHhfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9wcGM0eHhfZWRhYy5jCkBAIC0xMDI5LDggKzEwMjksNiBAQAogCXBkYXRhCQkJPSBtY2ktPnB2dF9pbmZvOwogCiAJcGRhdGEtPmRjcl9ob3N0CQk9ICpkY3JfaG9zdDsKLQlwZGF0YS0+aXJxcy5zZWMJCT0gTk9fSVJROwotCXBkYXRhLT5pcnFzLmRlZAkJPSBOT19JUlE7CiAKIAkvKiBJbml0aWFsaXplIGNvbnRyb2xsZXIgY2FwYWJpbGl0aWVzIGFuZCBjb25maWd1cmF0aW9uICovCiAKQEAgLTExMTEsNyArMTEwOSw3IEBACiAJZGVkX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCBJTlRNQVBfRUNDREVEX0lOREVYKTsKIAlzZWNfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIElOVE1BUF9FQ0NTRUNfSU5ERVgpOwogCi0JaWYgKGRlZF9pcnEgPT0gTk9fSVJRIHx8IHNlY19pcnEgPT0gTk9fSVJRKSB7CisJaWYgKCFkZWRfaXJxIHx8ICFzZWNfaXJxKSB7CiAJCXBwYzR4eF9lZGFjX21jX3ByaW50ayhLRVJOX0VSUiwgbWNpLAogCQkJCSAgICAgICJVbmFibGUgdG8gbWFwIGludGVycnVwdHMuXG4iKTsKIAkJc3RhdHVzID0gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9zYl9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvc2JfZWRhYy5jCmluZGV4IDRmYjJlYjcuLjU0Nzc1MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9zYl9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL3NiX2VkYWMuYwpAQCAtNTUyLDkgKzU1Miw5IEBACiAvKiBLbmlnaHQncyBMYW5kaW5nIFN1cHBvcnQgKi8KIC8qCiAgKiBLTkwncyBtZW1vcnkgY2hhbm5lbHMgYXJlIHN3aXp6bGVkIGJldHdlZW4gbWVtb3J5IGNvbnRyb2xsZXJzLgotICogTUMwIGlzIG1hcHBlZCB0byBDSDMsNSw2IGFuZCBNQzEgaXMgbWFwcGVkIHRvIENIMCwxLDIKKyAqIE1DMCBpcyBtYXBwZWQgdG8gQ0gzLDQsNSBhbmQgTUMxIGlzIG1hcHBlZCB0byBDSDAsMSwyCiAgKi8KLSNkZWZpbmUga25sX2NoYW5uZWxfcmVtYXAoY2hhbm5lbCkgKChjaGFubmVsICsgMykgJSA2KQorI2RlZmluZSBrbmxfY2hhbm5lbF9yZW1hcChtYywgY2hhbikgKChtYykgPyAoY2hhbikgOiAoY2hhbikgKyAzKQogCiAvKiBNZW1vcnkgY29udHJvbGxlciwgVEFEIHRhYmxlcywgZXJyb3IgaW5qZWN0aW9uIC0gMi04LTAsIDItOS0wICgyIG9mIHRoZXNlKSAqLwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0tOTF9JTUNfTUMgICAgICAgMHg3ODQwCkBAIC0xMjg2LDcgKzEyODYsNyBAQAogCW1jID0gR0VUX0JJVEZJRUxEKHJlZywgZW50cnkqMywgKGVudHJ5KjMpKzIpOwogCWNoYW4gPSBHRVRfQklURklFTEQocmVnLCAoZW50cnkqMikgKyAxOCwgKGVudHJ5KjIpICsgMTggKyAxKTsKIAotCXJldHVybiBrbmxfY2hhbm5lbF9yZW1hcChtYyozICsgY2hhbik7CisJcmV0dXJuIGtubF9jaGFubmVsX3JlbWFwKG1jLCBjaGFuKTsKIH0KIAogLyoKQEAgLTI0NzQsNyArMjQ3NCw3IEBACiAKIAkvKiBDaGVjayBpZiBldmVyeXRoaW5nIHdlcmUgcmVnaXN0ZXJlZCAqLwogCWlmICghcHZ0LT5wY2lfc2FkMCB8fCAhcHZ0LT5wY2lfc2FkMSB8fCAhcHZ0LT5wY2lfaGEwIHx8Ci0JICAgICFwdnQtPiBwY2lfdGFkIHx8ICFwdnQtPnBjaV9yYXMgIHx8ICFwdnQtPnBjaV90YSkKKwkgICAgIXB2dC0+cGNpX3JhcyB8fCAhcHZ0LT5wY2lfdGEpCiAJCWdvdG8gZW5vZGV2OwogCiAJaWYgKHNhd19jaGFuX21hc2sgIT0gMHgwZikKQEAgLTI1NjMsOCArMjU2Myw3IEBACiAKIAkvKiBDaGVjayBpZiBldmVyeXRoaW5nIHdlcmUgcmVnaXN0ZXJlZCAqLwogCWlmICghcHZ0LT5wY2lfc2FkMCB8fCAhcHZ0LT5wY2lfaGEwIHx8ICFwdnQtPnBjaV9icjAgfHwKLQkgICAgIXB2dC0+cGNpX2JyMSB8fCAhcHZ0LT5wY2lfdGFkIHx8ICFwdnQtPnBjaV9yYXMgIHx8Ci0JICAgICFwdnQtPnBjaV90YSkKKwkgICAgIXB2dC0+cGNpX2JyMSB8fCAhcHZ0LT5wY2lfcmFzIHx8ICFwdnQtPnBjaV90YSkKIAkJZ290byBlbm9kZXY7CiAKIAlpZiAoc2F3X2NoYW5fbWFzayAhPSAweDBmICYmIC8qIC1FTiAqLwpAQCAtMjk5Nyw4ICsyOTk2LDE1IEBACiAJCX0gZWxzZSB7CiAJCQljaGFyIEEgPSAqKCJBIik7CiAKLQkJCWNoYW5uZWwgPSBrbmxfY2hhbm5lbF9yZW1hcChjaGFubmVsKTsKKwkJCS8qCisJCQkgKiBSZXBvcnRlZCBjaGFubmVsIGlzIGluIHJhbmdlIDAtMiwgc28gd2UgY2FuJ3QgbWFwIGl0CisJCQkgKiBiYWNrIHRvIG1jLiBUbyBmaWd1cmUgb3V0IG1jIHdlIGNoZWNrIG1hY2hpbmUgY2hlY2sKKwkJCSAqIGJhbmsgcmVnaXN0ZXIgdGhhdCByZXBvcnRlZCB0aGlzIGVycm9yLgorCQkJICogYmFuazE1IG1lYW5zIG1jMCBhbmQgYmFuazE2IG1lYW5zIG1jMS4KKwkJCSAqLworCQkJY2hhbm5lbCA9IGtubF9jaGFubmVsX3JlbWFwKG0tPmJhbmsgPT0gMTYsIGNoYW5uZWwpOwogCQkJY2hhbm5lbF9tYXNrID0gMSA8PCBjaGFubmVsOworCiAJCQlzbnByaW50Zihtc2csIHNpemVvZihtc2cpLAogCQkJCSIlcyVzIGVycl9jb2RlOiUwNHg6JTA0eCBjaGFubmVsOiVkIChESU1NXyVjKSIsCiAJCQkJb3ZlcmZsb3cgPyAiIE9WRVJGTE9XIiA6ICIiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL3NreF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvc2t4X2VkYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmY0ODc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9lZGFjL3NreF9lZGFjLmMKQEAgLTAsMCArMSwxMTIxIEBACisvKgorICogRURBQyBkcml2ZXIgZm9yIEludGVsKFIpIFhlb24oUikgU2t5bGFrZSBwcm9jZXNzb3JzCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lZGFjLmg+CisjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CisjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2NwdV9kZXZpY2VfaWQuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL21jZS5oPgorCisjaW5jbHVkZSAiZWRhY19jb3JlLmgiCisKKyNkZWZpbmUgU0tYX1JFVklTSU9OICAgICIgVmVyOiAxLjAgIgorCisvKgorICogRGVidWcgbWFjcm9zCisgKi8KKyNkZWZpbmUgc2t4X3ByaW50ayhsZXZlbCwgZm10LCBhcmcuLi4pCQkJXAorCWVkYWNfcHJpbnRrKGxldmVsLCAic2t4IiwgZm10LCAjI2FyZykKKworI2RlZmluZSBza3hfbWNfcHJpbnRrKG1jaSwgbGV2ZWwsIGZtdCwgYXJnLi4uKQkJXAorCWVkYWNfbWNfY2hpcHNldF9wcmludGsobWNpLCBsZXZlbCwgInNreCIsIGZtdCwgIyNhcmcpCisKKy8qCisgKiBHZXQgYSBiaXQgZmllbGQgYXQgcmVnaXN0ZXIgdmFsdWUgPHY+LCBmcm9tIGJpdCA8bG8+IHRvIGJpdCA8aGk+CisgKi8KKyNkZWZpbmUgR0VUX0JJVEZJRUxEKHYsIGxvLCBoaSkgXAorCSgoKHYpICYgR0VOTUFTS19VTEwoKGhpKSwgKGxvKSkpID4+IChsbykpCisKK3N0YXRpYyBMSVNUX0hFQUQoc2t4X2VkYWNfbGlzdCk7CisKK3N0YXRpYyB1NjQgc2t4X3RvbG0sIHNreF90b2htOworCisjZGVmaW5lIE5VTV9JTUMJCQkyCS8qIG1lbW9yeSBjb250cm9sbGVycyBwZXIgc29ja2V0ICovCisjZGVmaW5lIE5VTV9DSEFOTkVMUwkJMwkvKiBjaGFubmVscyBwZXIgbWVtb3J5IGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgTlVNX0RJTU1TCQkyCS8qIE1heCBESU1NUyBwZXIgY2hhbm5lbCAqLworCisjZGVmaW5lCU1BU0syNgkweDNGRkZGRkYJCS8qIE1hc2sgZm9yIDJeMjYgKi8KKyNkZWZpbmUgTUFTSzI5CTB4MUZGRkZGRkYJCS8qIE1hc2sgZm9yIDJeMjkgKi8KKworLyoKKyAqIEVhY2ggY3B1IHNvY2tldCBjb250YWlucyBzb21lIHBjaSBkZXZpY2VzIHRoYXQgcHJvdmlkZSBnbG9iYWwKKyAqIGluZm9ybWF0aW9uLCBhbmQgYWxzbyBzb21lIHRoYXQgYXJlIGxvY2FsIHRvIGVhY2ggb2YgdGhlIHR3bworICogbWVtb3J5IGNvbnRyb2xsZXJzIG9uIHRoZSBkaWUuCisgKi8KK3N0cnVjdCBza3hfZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJdTgJCQlidXNbNF07CisJc3RydWN0IHBjaV9kZXYJKnNhZF9hbGw7CisJc3RydWN0IHBjaV9kZXYJKnV0aWxfYWxsOworCXUzMgltY3JvdXRlOworCXN0cnVjdCBza3hfaW1jIHsKKwkJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOworCQl1OAltYzsJLyogc3lzdGVtIHdpZGUgbWMjICovCisJCXU4CWxtYzsJLyogc29ja2V0IHJlbGF0aXZlIG1jIyAqLworCQl1OAlzcmNfaWQsIG5vZGVfaWQ7CisJCXN0cnVjdCBza3hfY2hhbm5lbCB7CisJCQlzdHJ1Y3QgcGNpX2RldiAqY2RldjsKKwkJCXN0cnVjdCBza3hfZGltbSB7CisJCQkJdTgJY2xvc2VfcGc7CisJCQkJdTgJYmFua194b3JfZW5hYmxlOworCQkJCXU4CWZpbmVfZ3JhaW5fYmFuazsKKwkJCQl1OAlyb3diaXRzOworCQkJCXU4CWNvbGJpdHM7CisJCQl9IGRpbW1zW05VTV9ESU1NU107CisJCX0gY2hhbltOVU1fQ0hBTk5FTFNdOworCX0gaW1jW05VTV9JTUNdOworfTsKK3N0YXRpYyBpbnQgc2t4X251bV9zb2NrZXRzOworCitzdHJ1Y3Qgc2t4X3B2dCB7CisJc3RydWN0IHNreF9pbWMJKmltYzsKK307CisKK3N0cnVjdCBkZWNvZGVkX2FkZHIgeworCXN0cnVjdCBza3hfZGV2ICpkZXY7CisJdTY0CWFkZHI7CisJaW50CXNvY2tldDsKKwlpbnQJaW1jOworCWludAljaGFubmVsOworCXU2NAljaGFuX2FkZHI7CisJaW50CXNrdHdheXM7CisJaW50CWNoYW53YXlzOworCWludAlkaW1tOworCWludAlyYW5rOworCWludAljaGFubmVsX3Jhbms7CisJdTY0CXJhbmtfYWRkcmVzczsKKwlpbnQJcm93OworCWludAljb2x1bW47CisJaW50CWJhbmtfYWRkcmVzczsKKwlpbnQJYmFua19ncm91cDsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2t4X2RldiAqZ2V0X3NreF9kZXYodTggYnVzLCB1OCBpZHgpCit7CisJc3RydWN0IHNreF9kZXYgKmQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZza3hfZWRhY19saXN0LCBsaXN0KSB7CisJCWlmIChkLT5idXNbaWR4XSA9PSBidXMpCisJCQlyZXR1cm4gZDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworZW51bSBtdW5pdHR5cGUgeworCUNIQU4wLCBDSEFOMSwgQ0hBTjIsIFNBRF9BTEwsIFVUSUxfQUxMLCBTQUQKK307CisKK3N0cnVjdCBtdW5pdCB7CisJdTE2CWRpZDsKKwl1MTYJZGV2Zm5bTlVNX0lNQ107CisJdTgJYnVzaWR4OworCXU4CXBlcl9zb2NrZXQ7CisJZW51bSBtdW5pdHR5cGUgbXR5cGU7Cit9OworCisvKgorICogTGlzdCBvZiBQQ0kgZGV2aWNlIGlkcyB0aGF0IHdlIG5lZWQgdG9nZXRoZXIgd2l0aCBzb21lIGRldmljZQorICogbnVtYmVyIGFuZCBmdW5jdGlvbiBudW1iZXJzIHRvIHRlbGwgd2hpY2ggbWVtb3J5IGNvbnRyb2xsZXIgdGhlCisgKiBkZXZpY2UgYmVsb25ncyB0by4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBtdW5pdCBza3hfYWxsX211bml0c1tdID0geworCXsgMHgyMDU0LCB7IH0sIDEsIDEsIFNBRF9BTEwgfSwKKwl7IDB4MjA1NSwgeyB9LCAxLCAxLCBVVElMX0FMTCB9LAorCXsgMHgyMDQwLCB7IFBDSV9ERVZGTigxMCwgMCksIFBDSV9ERVZGTigxMiwgMCkgfSwgMiwgMiwgQ0hBTjAgfSwKKwl7IDB4MjA0NCwgeyBQQ0lfREVWRk4oMTAsIDQpLCBQQ0lfREVWRk4oMTIsIDQpIH0sIDIsIDIsIENIQU4xIH0sCisJeyAweDIwNDgsIHsgUENJX0RFVkZOKDExLCAwKSwgUENJX0RFVkZOKDEzLCAwKSB9LCAyLCAyLCBDSEFOMiB9LAorCXsgMHgyMDhlLCB7IH0sIDEsIDAsIFNBRCB9LAorCXsgfQorfTsKKworLyoKKyAqIFdlIHVzZSB0aGUgcGVyLXNvY2tldCBkZXZpY2UgMHgyMDE2IHRvIGNvdW50IGhvdyBtYW55IHNvY2tldHMgYXJlIHByZXNlbnQsCisgKiBhbmQgdG8gZGV0ZW1pbmUgd2hpY2ggUENJIGJ1c2VzIGFyZSBhc3NvY2lhdGVkIHdpdGggZWFjaCBzb2NrZXQuIEFsbG9jYXRlCisgKiBhbmQgYnVpbGQgdGhlIGZ1bGwgbGlzdCBvZiBhbGwgdGhlIHNreF9kZXYgc3RydWN0dXJlcyB0aGF0IHdlIG5lZWQgaGVyZS4KKyAqLworc3RhdGljIGludCBnZXRfYWxsX2J1c19tYXBwaW5ncyh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2LCAqcHJldjsKKwlzdHJ1Y3Qgc2t4X2RldiAqZDsKKwl1MzIgcmVnOworCWludCBuZGV2ID0gMDsKKworCXByZXYgPSBOVUxMOworCWZvciAoOzspIHsKKwkJcGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjAxNiwgcHJldik7CisJCWlmICghcGRldikKKwkJCWJyZWFrOworCQluZGV2Kys7CisJCWQgPSBremFsbG9jKHNpemVvZigqZCksIEdGUF9LRVJORUwpOworCQlpZiAoIWQpIHsKKwkJCXBjaV9kZXZfcHV0KHBkZXYpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4Q0MsICZyZWcpOworCQlkLT5idXNbMF0gPSAgR0VUX0JJVEZJRUxEKHJlZywgMCwgNyk7CisJCWQtPmJ1c1sxXSA9ICBHRVRfQklURklFTEQocmVnLCA4LCAxNSk7CisJCWQtPmJ1c1syXSA9ICBHRVRfQklURklFTEQocmVnLCAxNiwgMjMpOworCQlkLT5idXNbM10gPSAgR0VUX0JJVEZJRUxEKHJlZywgMjQsIDMxKTsKKwkJZWRhY19kYmcoMiwgImJ1c3NlczogJXgsICV4LCAleCwgJXhcbiIsCisJCQkgZC0+YnVzWzBdLCBkLT5idXNbMV0sIGQtPmJ1c1syXSwgZC0+YnVzWzNdKTsKKwkJbGlzdF9hZGRfdGFpbCgmZC0+bGlzdCwgJnNreF9lZGFjX2xpc3QpOworCQlza3hfbnVtX3NvY2tldHMrKzsKKwkJcHJldiA9IHBkZXY7CisJfQorCisJcmV0dXJuIG5kZXY7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2FsbF9tdW5pdHMoY29uc3Qgc3RydWN0IG11bml0ICptKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2LCAqcHJldjsKKwlzdHJ1Y3Qgc2t4X2RldiAqZDsKKwl1MzIgcmVnOworCWludCBpID0gMCwgbmRldiA9IDA7CisKKwlwcmV2ID0gTlVMTDsKKwlmb3IgKDs7KSB7CisJCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLCBtLT5kaWQsIHByZXYpOworCQlpZiAoIXBkZXYpCisJCQlicmVhazsKKwkJbmRldisrOworCQlpZiAobS0+cGVyX3NvY2tldCA9PSBOVU1fSU1DKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0lNQzsgaSsrKQorCQkJCWlmIChtLT5kZXZmbltpXSA9PSBwZGV2LT5kZXZmbikKKwkJCQkJYnJlYWs7CisJCQlpZiAoaSA9PSBOVU1fSU1DKQorCQkJCWdvdG8gZmFpbDsKKwkJfQorCQlkID0gZ2V0X3NreF9kZXYocGRldi0+YnVzLT5udW1iZXIsIG0tPmJ1c2lkeCk7CisJCWlmICghZCkKKwkJCWdvdG8gZmFpbDsKKworCQkvKiBCZSBzdXJlIHRoYXQgdGhlIGRldmljZSBpcyBlbmFibGVkICovCisJCWlmICh1bmxpa2VseShwY2lfZW5hYmxlX2RldmljZShwZGV2KSA8IDApKSB7CisJCQlza3hfcHJpbnRrKEtFUk5fRVJSLAorCQkJCSJDb3VsZG4ndCBlbmFibGUgJTA0eDolMDR4XG4iLCBQQ0lfVkVORE9SX0lEX0lOVEVMLCBtLT5kaWQpOworCQkJZ290byBmYWlsOworCQl9CisKKwkJc3dpdGNoIChtLT5tdHlwZSkgeworCQljYXNlIENIQU4wOiBjYXNlIENIQU4xOiBjYXNlIENIQU4yOgorCQkJcGNpX2Rldl9nZXQocGRldik7CisJCQlkLT5pbWNbaV0uY2hhblttLT5tdHlwZV0uY2RldiA9IHBkZXY7CisJCQlicmVhazsKKwkJY2FzZSBTQURfQUxMOgorCQkJcGNpX2Rldl9nZXQocGRldik7CisJCQlkLT5zYWRfYWxsID0gcGRldjsKKwkJCWJyZWFrOworCQljYXNlIFVUSUxfQUxMOgorCQkJcGNpX2Rldl9nZXQocGRldik7CisJCQlkLT51dGlsX2FsbCA9IHBkZXY7CisJCQlicmVhazsKKwkJY2FzZSBTQUQ6CisJCQkvKgorCQkJICogb25lIG9mIHRoZXNlIGRldmljZXMgcGVyIGNvcmUsIGluY2x1ZGluZyBjb3JlcworCQkJICogdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIFNLVS4gSWdub3JlIGFueSB0aGF0CisJCQkgKiByZWFkIGEgcm91dGUgdGFibGUgb2YgemVybywgbWFrZSBzdXJlIGFsbCB0aGUKKwkJCSAqIG5vbi16ZXJvIHZhbHVlcyBtYXRjaC4KKwkJCSAqLworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4QjQsICZyZWcpOworCQkJaWYgKHJlZyAhPSAwKSB7CisJCQkJaWYgKGQtPm1jcm91dGUgPT0gMCkKKwkJCQkJZC0+bWNyb3V0ZSA9IHJlZzsKKwkJCQllbHNlIGlmIChkLT5tY3JvdXRlICE9IHJlZykgeworCQkJCQlza3hfcHJpbnRrKEtFUk5fRVJSLAorCQkJCQkJIm1jcm91dGUgbWlzbWF0Y2hcbiIpOworCQkJCQlnb3RvIGZhaWw7CisJCQkJfQorCQkJfQorCQkJbmRldi0tOworCQkJYnJlYWs7CisJCX0KKworCQlwcmV2ID0gcGRldjsKKwl9CisKKwlyZXR1cm4gbmRldjsKK2ZhaWw6CisJcGNpX2Rldl9wdXQocGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK2NvbnN0IHN0cnVjdCB4ODZfY3B1X2lkIHNreF9jcHVpZHNbXSA9IHsKKwl7IFg4Nl9WRU5ET1JfSU5URUwsIDYsIDB4NTUsIDAsIDAgfSwJLyogU2t5bGFrZSAqLworCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoeDg2Y3B1LCBza3hfY3B1aWRzKTsKKworc3RhdGljIHU4IGdldF9zcmNfaWQoc3RydWN0IHNreF9kZXYgKmQpCit7CisJdTMyIHJlZzsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkLT51dGlsX2FsbCwgMHhGMCwgJnJlZyk7CisKKwlyZXR1cm4gR0VUX0JJVEZJRUxEKHJlZywgMTIsIDE0KTsKK30KKworc3RhdGljIHU4IHNreF9nZXRfbm9kZV9pZChzdHJ1Y3Qgc2t4X2RldiAqZCkKK3sKKwl1MzIgcmVnOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGQtPnV0aWxfYWxsLCAweEY0LCAmcmVnKTsKKworCXJldHVybiBHRVRfQklURklFTEQocmVnLCAwLCAyKTsKK30KKworc3RhdGljIGludCBnZXRfZGltbV9hdHRyKHUzMiByZWcsIGludCBsb2JpdCwgaW50IGhpYml0LCBpbnQgYWRkLCBpbnQgbWludmFsLAorCQkJIGludCBtYXh2YWwsIGNoYXIgKm5hbWUpCit7CisJdTMyIHZhbCA9IEdFVF9CSVRGSUVMRChyZWcsIGxvYml0LCBoaWJpdCk7CisKKwlpZiAodmFsIDwgbWludmFsIHx8IHZhbCA+IG1heHZhbCkgeworCQllZGFjX2RiZygyLCAiYmFkICVzID0gJWQgKHJhdz0leClcbiIsIG5hbWUsIHZhbCwgcmVnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiB2YWwgKyBhZGQ7Cit9CisKKyNkZWZpbmUgSVNfRElNTV9QUkVTRU5UKG10cikJCUdFVF9CSVRGSUVMRCgobXRyKSwgMTUsIDE1KQorCisjZGVmaW5lIG51bXJhbmsocmVnKSBnZXRfZGltbV9hdHRyKChyZWcpLCAxMiwgMTMsIDAsIDEsIDIsICJyYW5rcyIpCisjZGVmaW5lIG51bXJvdyhyZWcpIGdldF9kaW1tX2F0dHIoKHJlZyksIDIsIDQsIDEyLCAxLCA2LCAicm93cyIpCisjZGVmaW5lIG51bWNvbChyZWcpIGdldF9kaW1tX2F0dHIoKHJlZyksIDAsIDEsIDEwLCAwLCAyLCAiY29scyIpCisKK3N0YXRpYyBpbnQgZ2V0X3dpZHRoKHUzMiBtdHIpCit7CisJc3dpdGNoIChHRVRfQklURklFTEQobXRyLCA4LCA5KSkgeworCWNhc2UgMDoKKwkJcmV0dXJuIERFVl9YNDsKKwljYXNlIDE6CisJCXJldHVybiBERVZfWDg7CisJY2FzZSAyOgorCQlyZXR1cm4gREVWX1gxNjsKKwl9CisJcmV0dXJuIERFVl9VTktOT1dOOworfQorCitzdGF0aWMgaW50IHNreF9nZXRfaGlfbG8odm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl1MzIgcmVnOworCisJcGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjAzNCwgTlVMTCk7CisJaWYgKCFwZGV2KSB7CisJCWVkYWNfZGJnKDAsICJDYW4ndCBnZXQgdG9sbS90b2htXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4RDAsICZyZWcpOworCXNreF90b2xtID0gcmVnOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweEQ0LCAmcmVnKTsKKwlza3hfdG9obSA9IHJlZzsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHhEOCwgJnJlZyk7CisJc2t4X3RvaG0gfD0gKHU2NClyZWcgPDwgMzI7CisKKwlwY2lfZGV2X3B1dChwZGV2KTsKKwllZGFjX2RiZygyLCAidG9sbT0lbGx4IHRvaG09JWxseFxuIiwgc2t4X3RvbG0sIHNreF90b2htKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9kaW1tX2luZm8odTMyIG10ciwgdTMyIGFtYXAsIHN0cnVjdCBkaW1tX2luZm8gKmRpbW0sCisJCQkgc3RydWN0IHNreF9pbWMgKmltYywgaW50IGNoYW4sIGludCBkaW1tbm8pCit7CisJaW50ICBiYW5rcyA9IDE2LCByYW5rcywgcm93cywgY29scywgbnBhZ2VzOworCXU2NCBzaXplOworCisJaWYgKCFJU19ESU1NX1BSRVNFTlQobXRyKSkKKwkJcmV0dXJuIDA7CisJcmFua3MgPSBudW1yYW5rKG10cik7CisJcm93cyA9IG51bXJvdyhtdHIpOworCWNvbHMgPSBudW1jb2wobXRyKTsKKworCS8qCisJICogQ29tcHV0ZSBzaXplIGluIDgtYnl0ZSAoMl4zKSB3b3JkcywgdGhlbiBzaGlmdCB0byBNaUIgKDJeMjApCisJICovCisJc2l6ZSA9ICgoMXVsbCA8PCAocm93cyArIGNvbHMgKyByYW5rcykpICogYmFua3MpID4+ICgyMCAtIDMpOworCW5wYWdlcyA9IE1pQl9UT19QQUdFUyhzaXplKTsKKworCWVkYWNfZGJnKDAsICJtYyMlZDogY2hhbm5lbCAlZCwgZGltbSAlZCwgJWxsZCBNYiAoJWQgcGFnZXMpIGJhbms6ICVkLCByYW5rOiAlZCwgcm93OiAlI3gsIGNvbDogJSN4XG4iLAorCQkgaW1jLT5tYywgY2hhbiwgZGltbW5vLCBzaXplLCBucGFnZXMsCisJCSBiYW5rcywgcmFua3MsIHJvd3MsIGNvbHMpOworCisJaW1jLT5jaGFuW2NoYW5dLmRpbW1zW2RpbW1ub10uY2xvc2VfcGcgPSBHRVRfQklURklFTEQobXRyLCAwLCAwKTsKKwlpbWMtPmNoYW5bY2hhbl0uZGltbXNbZGltbW5vXS5iYW5rX3hvcl9lbmFibGUgPSBHRVRfQklURklFTEQobXRyLCA5LCA5KTsKKwlpbWMtPmNoYW5bY2hhbl0uZGltbXNbZGltbW5vXS5maW5lX2dyYWluX2JhbmsgPSBHRVRfQklURklFTEQoYW1hcCwgMCwgMCk7CisJaW1jLT5jaGFuW2NoYW5dLmRpbW1zW2RpbW1ub10ucm93Yml0cyA9IHJvd3M7CisJaW1jLT5jaGFuW2NoYW5dLmRpbW1zW2RpbW1ub10uY29sYml0cyA9IGNvbHM7CisKKwlkaW1tLT5ucl9wYWdlcyA9IG5wYWdlczsKKwlkaW1tLT5ncmFpbiA9IDMyOworCWRpbW0tPmR0eXBlID0gZ2V0X3dpZHRoKG10cik7CisJZGltbS0+bXR5cGUgPSBNRU1fRERSNDsKKwlkaW1tLT5lZGFjX21vZGUgPSBFREFDX1NFQ0RFRDsgLyogbGlrZWx5IGJldHRlciB0aGFuIHRoaXMgKi8KKwlzbnByaW50ZihkaW1tLT5sYWJlbCwgc2l6ZW9mKGRpbW0tPmxhYmVsKSwgIkNQVV9TcmNJRCMldV9NQyMldV9DaGFuIyV1X0RJTU0jJXUiLAorCQkgaW1jLT5zcmNfaWQsIGltYy0+bG1jLCBjaGFuLCBkaW1tbm8pOworCisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgU0tYX0dFVF9NVE1UUihkZXYsIHJlZykgXAorCXBjaV9yZWFkX2NvbmZpZ19kd29yZCgoZGV2KSwgMHg4N2MsICZyZWcpCisKK3N0YXRpYyBib29sIHNreF9jaGVja19lY2Moc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTMyIG10bXRyOworCisJU0tYX0dFVF9NVE1UUihwZGV2LCBtdG10cik7CisKKwlyZXR1cm4gISFHRVRfQklURklFTEQobXRtdHIsIDIsIDIpOworfQorCitzdGF0aWMgaW50IHNreF9nZXRfZGltbV9jb25maWcoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBza3hfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCXN0cnVjdCBza3hfaW1jICppbWMgPSBwdnQtPmltYzsKKwlzdHJ1Y3QgZGltbV9pbmZvICpkaW1tOworCWludCBpLCBqOworCXUzMiBtdHIsIGFtYXA7CisJaW50IG5kaW1tczsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ0hBTk5FTFM7IGkrKykgeworCQluZGltbXMgPSAwOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW1jLT5jaGFuW2ldLmNkZXYsIDB4OEMsICZhbWFwKTsKKwkJZm9yIChqID0gMDsgaiA8IE5VTV9ESU1NUzsgaisrKSB7CisJCQlkaW1tID0gRURBQ19ESU1NX1BUUihtY2ktPmxheWVycywgbWNpLT5kaW1tcywKKwkJCQkJICAgICBtY2ktPm5fbGF5ZXJzLCBpLCBqLCAwKTsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChpbWMtPmNoYW5baV0uY2RldiwKKwkJCQkJMHg4MCArIDQqaiwgJm10cik7CisJCQluZGltbXMgKz0gZ2V0X2RpbW1faW5mbyhtdHIsIGFtYXAsIGRpbW0sIGltYywgaSwgaik7CisJCX0KKwkJaWYgKG5kaW1tcyAmJiAhc2t4X2NoZWNrX2VjYyhpbWMtPmNoYW5bMF0uY2RldikpIHsKKwkJCXNreF9wcmludGsoS0VSTl9FUlIsICJFQ0MgaXMgZGlzYWJsZWQgb24gaW1jICVkXG4iLCBpbWMtPm1jKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNreF91bnJlZ2lzdGVyX21jaShzdHJ1Y3Qgc2t4X2ltYyAqaW1jKQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IGltYy0+bWNpOworCisJaWYgKCFtY2kpCisJCXJldHVybjsKKworCWVkYWNfZGJnKDAsICJNQyVkOiBtY2kgPSAlcFxuIiwgaW1jLT5tYywgbWNpKTsKKworCS8qIFJlbW92ZSBNQyBzeXNmcyBub2RlcyAqLworCWVkYWNfbWNfZGVsX21jKG1jaS0+cGRldik7CisKKwllZGFjX2RiZygxLCAiJXM6IGZyZWUgbWNpIHN0cnVjdFxuIiwgbWNpLT5jdGxfbmFtZSk7CisJa2ZyZWUobWNpLT5jdGxfbmFtZSk7CisJZWRhY19tY19mcmVlKG1jaSk7Cit9CisKK3N0YXRpYyBpbnQgc2t4X3JlZ2lzdGVyX21jaShzdHJ1Y3Qgc2t4X2ltYyAqaW1jKQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKwlzdHJ1Y3QgZWRhY19tY19sYXllciBsYXllcnNbMl07CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBpbWMtPmNoYW5bMF0uY2RldjsKKwlzdHJ1Y3Qgc2t4X3B2dCAqcHZ0OworCWludCByYzsKKworCS8qIGFsbG9jYXRlIGEgbmV3IE1DIGNvbnRyb2wgc3RydWN0dXJlICovCisJbGF5ZXJzWzBdLnR5cGUgPSBFREFDX01DX0xBWUVSX0NIQU5ORUw7CisJbGF5ZXJzWzBdLnNpemUgPSBOVU1fQ0hBTk5FTFM7CisJbGF5ZXJzWzBdLmlzX3ZpcnRfY3Nyb3cgPSBmYWxzZTsKKwlsYXllcnNbMV0udHlwZSA9IEVEQUNfTUNfTEFZRVJfU0xPVDsKKwlsYXllcnNbMV0uc2l6ZSA9IE5VTV9ESU1NUzsKKwlsYXllcnNbMV0uaXNfdmlydF9jc3JvdyA9IHRydWU7CisJbWNpID0gZWRhY19tY19hbGxvYyhpbWMtPm1jLCBBUlJBWV9TSVpFKGxheWVycyksIGxheWVycywKKwkJCSAgICBzaXplb2Yoc3RydWN0IHNreF9wdnQpKTsKKworCWlmICh1bmxpa2VseSghbWNpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllZGFjX2RiZygwLCAiTUMjJWQ6IG1jaSA9ICVwXG4iLCBpbWMtPm1jLCBtY2kpOworCisJLyogQXNzb2NpYXRlIHNreF9kZXYgYW5kIG1jaSBmb3IgZnV0dXJlIHVzYWdlICovCisJaW1jLT5tY2kgPSBtY2k7CisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwlwdnQtPmltYyA9IGltYzsKKworCW1jaS0+Y3RsX25hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIlNreWxha2UgU29ja2V0IyVkIElNQyMlZCIsCisJCQkJICBpbWMtPm5vZGVfaWQsIGltYy0+bG1jKTsKKwltY2ktPm10eXBlX2NhcCA9IE1FTV9GTEFHX0REUjQ7CisJbWNpLT5lZGFjX2N0bF9jYXAgPSBFREFDX0ZMQUdfTk9ORTsKKwltY2ktPmVkYWNfY2FwID0gRURBQ19GTEFHX05PTkU7CisJbWNpLT5tb2RfbmFtZSA9ICJza3hfZWRhYy5jIjsKKwltY2ktPmRldl9uYW1lID0gcGNpX25hbWUoaW1jLT5jaGFuWzBdLmNkZXYpOworCW1jaS0+bW9kX3ZlciA9IFNLWF9SRVZJU0lPTjsKKwltY2ktPmN0bF9wYWdlX3RvX3BoeXMgPSBOVUxMOworCisJcmMgPSBza3hfZ2V0X2RpbW1fY29uZmlnKG1jaSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBmYWlsOworCisJLyogcmVjb3JkIHB0ciB0byB0aGUgZ2VuZXJpYyBkZXZpY2UgKi8KKwltY2ktPnBkZXYgPSAmcGRldi0+ZGV2OworCisJLyogYWRkIHRoaXMgbmV3IE1DIGNvbnRyb2wgc3RydWN0dXJlIHRvIEVEQUMncyBsaXN0IG9mIE1DcyAqLworCWlmICh1bmxpa2VseShlZGFjX21jX2FkZF9tYyhtY2kpKSkgeworCQllZGFjX2RiZygwLCAiTUM6IGZhaWxlZCBlZGFjX21jX2FkZF9tYygpXG4iKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJa2ZyZWUobWNpLT5jdGxfbmFtZSk7CisJZWRhY19tY19mcmVlKG1jaSk7CisJaW1jLT5tY2kgPSBOVUxMOworCXJldHVybiByYzsKK30KKworI2RlZmluZQlTS1hfTUFYX1NBRCAyNAorCisjZGVmaW5lIFNLWF9HRVRfU0FEKGQsIGksIHJlZykJXAorCXBjaV9yZWFkX2NvbmZpZ19kd29yZCgoZCktPnNhZF9hbGwsIDB4NjAgKyA4ICogKGkpLCAmcmVnKQorI2RlZmluZSBTS1hfR0VUX0lMVihkLCBpLCByZWcpCVwKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoKGQpLT5zYWRfYWxsLCAweDY0ICsgOCAqIChpKSwgJnJlZykKKworI2RlZmluZQlTS1hfU0FEX01PRDNNT0RFKHNhZCkJR0VUX0JJVEZJRUxEKChzYWQpLCAzMCwgMzEpCisjZGVmaW5lCVNLWF9TQURfTU9EMyhzYWQpCUdFVF9CSVRGSUVMRCgoc2FkKSwgMjcsIDI3KQorI2RlZmluZSBTS1hfU0FEX0xJTUlUKHNhZCkJKCgodTY0KUdFVF9CSVRGSUVMRCgoc2FkKSwgNywgMjYpIDw8IDI2KSB8IE1BU0syNikKKyNkZWZpbmUJU0tYX1NBRF9NT0QzQVNNT0QyKHNhZCkJR0VUX0JJVEZJRUxEKChzYWQpLCA1LCA2KQorI2RlZmluZQlTS1hfU0FEX0FUVFIoc2FkKQlHRVRfQklURklFTEQoKHNhZCksIDMsIDQpCisjZGVmaW5lCVNLWF9TQURfSU5URVJMRUFWRShzYWQpCUdFVF9CSVRGSUVMRCgoc2FkKSwgMSwgMikKKyNkZWZpbmUgU0tYX1NBRF9FTkFCTEUoc2FkKQlHRVRfQklURklFTEQoKHNhZCksIDAsIDApCisKKyNkZWZpbmUgU0tYX0lMVl9SRU1PVEUodGd0KQkoKCh0Z3QpICYgOCkgPT0gMCkKKyNkZWZpbmUgU0tYX0lMVl9UQVJHRVQodGd0KQkoKHRndCkgJiA3KQorCitzdGF0aWMgYm9vbCBza3hfc2FkX2RlY29kZShzdHJ1Y3QgZGVjb2RlZF9hZGRyICpyZXMpCit7CisJc3RydWN0IHNreF9kZXYgKmQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZza3hfZWRhY19saXN0LCB0eXBlb2YoKmQpLCBsaXN0KTsKKwl1NjQgYWRkciA9IHJlcy0+YWRkcjsKKwlpbnQgaSwgaWR4LCB0Z3QsIGxjaGFuLCBzaGlmdDsKKwl1MzIgc2FkLCBpbHY7CisJdTY0IGxpbWl0LCBwcmV2X2xpbWl0OworCWludCByZW1vdGUgPSAwOworCisJLyogU2ltcGxlIHNhbml0eSBjaGVjayBmb3IgSS9PIHNwYWNlIG9yIG91dCBvZiByYW5nZSAqLworCWlmIChhZGRyID49IHNreF90b2htIHx8IChhZGRyID49IHNreF90b2xtICYmIGFkZHIgPCBCSVRfVUxMKDMyKSkpIHsKKwkJZWRhY19kYmcoMCwgIkFkZHJlc3MgJWxseCBvdXQgb2YgcmFuZ2VcbiIsIGFkZHIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCityZXN0YXJ0OgorCXByZXZfbGltaXQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBTS1hfTUFYX1NBRDsgaSsrKSB7CisJCVNLWF9HRVRfU0FEKGQsIGksIHNhZCk7CisJCWxpbWl0ID0gU0tYX1NBRF9MSU1JVChzYWQpOworCQlpZiAoU0tYX1NBRF9FTkFCTEUoc2FkKSkgeworCQkJaWYgKGFkZHIgPj0gcHJldl9saW1pdCAmJiBhZGRyIDw9IGxpbWl0KQorCQkJCWdvdG8gc2FkX2ZvdW5kOworCQl9CisJCXByZXZfbGltaXQgPSBsaW1pdCArIDE7CisJfQorCWVkYWNfZGJnKDAsICJObyBTQUQgZW50cnkgZm9yICVsbHhcbiIsIGFkZHIpOworCXJldHVybiBmYWxzZTsKKworc2FkX2ZvdW5kOgorCVNLWF9HRVRfSUxWKGQsIGksIGlsdik7CisKKwlzd2l0Y2ggKFNLWF9TQURfSU5URVJMRUFWRShzYWQpKSB7CisJY2FzZSAwOgorCQlpZHggPSBHRVRfQklURklFTEQoYWRkciwgNiwgOCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaWR4ID0gR0VUX0JJVEZJRUxEKGFkZHIsIDgsIDEwKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpZHggPSBHRVRfQklURklFTEQoYWRkciwgMTIsIDE0KTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlpZHggPSBHRVRfQklURklFTEQoYWRkciwgMzAsIDMyKTsKKwkJYnJlYWs7CisJfQorCisJdGd0ID0gR0VUX0JJVEZJRUxEKGlsdiwgNCAqIGlkeCwgNCAqIGlkeCArIDMpOworCisJLyogSWYgcG9pbnQgdG8gYW5vdGhlciBub2RlLCBmaW5kIGl0IGFuZCBzdGFydCBvdmVyICovCisJaWYgKFNLWF9JTFZfUkVNT1RFKHRndCkpIHsKKwkJaWYgKHJlbW90ZSkgeworCQkJZWRhY19kYmcoMCwgIkRvdWJsZSByZW1vdGUhXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZW1vdGUgPSAxOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZza3hfZWRhY19saXN0LCBsaXN0KSB7CisJCQlpZiAoZC0+aW1jWzBdLnNyY19pZCA9PSBTS1hfSUxWX1RBUkdFVCh0Z3QpKQorCQkJCWdvdG8gcmVzdGFydDsKKwkJfQorCQllZGFjX2RiZygwLCAiQ2FuJ3QgZmluZCBub2RlICVkXG4iLCBTS1hfSUxWX1RBUkdFVCh0Z3QpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChTS1hfU0FEX01PRDMoc2FkKSA9PSAwKQorCQlsY2hhbiA9IFNLWF9JTFZfVEFSR0VUKHRndCk7CisJZWxzZSB7CisJCXN3aXRjaCAoU0tYX1NBRF9NT0QzTU9ERShzYWQpKSB7CisJCWNhc2UgMDoKKwkJCXNoaWZ0ID0gNjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzaGlmdCA9IDg7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJc2hpZnQgPSAxMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZWRhY19kYmcoMCwgImlsbGVnYWwgbW9kM21vZGVcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXN3aXRjaCAoU0tYX1NBRF9NT0QzQVNNT0QyKHNhZCkpIHsKKwkJY2FzZSAwOgorCQkJbGNoYW4gPSAoYWRkciA+PiBzaGlmdCkgJSAzOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWxjaGFuID0gKGFkZHIgPj4gc2hpZnQpICUgMjsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlsY2hhbiA9IChhZGRyID4+IHNoaWZ0KSAlIDI7CisJCQlsY2hhbiA9IChsY2hhbiA8PCAxKSB8IH5sY2hhbjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlsY2hhbiA9ICgoYWRkciA+PiBzaGlmdCkgJSAyKSA8PCAxOworCQkJYnJlYWs7CisJCX0KKwkJbGNoYW4gPSAobGNoYW4gPDwgMSkgfCAoU0tYX0lMVl9UQVJHRVQodGd0KSAmIDEpOworCX0KKworCXJlcy0+ZGV2ID0gZDsKKwlyZXMtPnNvY2tldCA9IGQtPmltY1swXS5zcmNfaWQ7CisJcmVzLT5pbWMgPSBHRVRfQklURklFTEQoZC0+bWNyb3V0ZSwgbGNoYW4gKiAzLCBsY2hhbiAqIDMgKyAyKTsKKwlyZXMtPmNoYW5uZWwgPSBHRVRfQklURklFTEQoZC0+bWNyb3V0ZSwgbGNoYW4gKiAyICsgMTgsIGxjaGFuICogMiArIDE5KTsKKworCWVkYWNfZGJnKDIsICIlbGx4OiBzb2NrZXQ9JWQgaW1jPSVkIGNoYW5uZWw9JWRcbiIsCisJCSByZXMtPmFkZHIsIHJlcy0+c29ja2V0LCByZXMtPmltYywgcmVzLT5jaGFubmVsKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworI2RlZmluZQlTS1hfTUFYX1RBRCA4CisKKyNkZWZpbmUgU0tYX0dFVF9UQURCQVNFKGQsIG1jLCBpLCByZWcpCQkJXAorCXBjaV9yZWFkX2NvbmZpZ19kd29yZCgoZCktPmltY1ttY10uY2hhblswXS5jZGV2LCAweDg1MCArIDQgKiAoaSksICZyZWcpCisjZGVmaW5lIFNLWF9HRVRfVEFEV0FZTkVTUyhkLCBtYywgaSwgcmVnKQkJXAorCXBjaV9yZWFkX2NvbmZpZ19kd29yZCgoZCktPmltY1ttY10uY2hhblswXS5jZGV2LCAweDg4MCArIDQgKiAoaSksICZyZWcpCisjZGVmaW5lIFNLWF9HRVRfVEFEQ0hOSUxWT0ZGU0VUKGQsIG1jLCBjaCwgaSwgcmVnKQlcCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKChkKS0+aW1jW21jXS5jaGFuW2NoXS5jZGV2LCAweDkwICsgNCAqIChpKSwgJnJlZykKKworI2RlZmluZQlTS1hfVEFEX0JBU0UoYikJCSgodTY0KUdFVF9CSVRGSUVMRCgoYiksIDEyLCAzMSkgPDwgMjYpCisjZGVmaW5lIFNLWF9UQURfU0tUX0dSQU4oYikJR0VUX0JJVEZJRUxEKChiKSwgNCwgNSkKKyNkZWZpbmUgU0tYX1RBRF9DSE5fR1JBTihiKQlHRVRfQklURklFTEQoKGIpLCA2LCA3KQorI2RlZmluZQlTS1hfVEFEX0xJTUlUKGIpCSgoKHU2NClHRVRfQklURklFTEQoKGIpLCAxMiwgMzEpIDw8IDI2KSB8IE1BU0syNikKKyNkZWZpbmUJU0tYX1RBRF9PRkZTRVQoYikJKCh1NjQpR0VUX0JJVEZJRUxEKChiKSwgNCwgMjMpIDw8IDI2KQorI2RlZmluZQlTS1hfVEFEX1NLVFdBWVMoYikJKDEgPDwgR0VUX0JJVEZJRUxEKChiKSwgMTAsIDExKSkKKyNkZWZpbmUJU0tYX1RBRF9DSE5XQVlTKGIpCShHRVRfQklURklFTEQoKGIpLCA4LCA5KSArIDEpCisKKy8qIHdoaWNoIGJpdCB1c2VkIGZvciBib3RoIHNvY2tldCBhbmQgY2hhbm5lbCBpbnRlcmxlYXZlICovCitzdGF0aWMgaW50IHNreF9ncmFudWxhcml0eVtdID0geyA2LCA4LCAxMiwgMzAgfTsKKworc3RhdGljIHU2NCBza3hfZG9faW50ZXJsZWF2ZSh1NjQgYWRkciwgaW50IHNoaWZ0LCBpbnQgd2F5cywgdTY0IGxvd2JpdHMpCit7CisJYWRkciA+Pj0gc2hpZnQ7CisJYWRkciAvPSB3YXlzOworCWFkZHIgPDw9IHNoaWZ0OworCisJcmV0dXJuIGFkZHIgfCAobG93Yml0cyAmICgoMXVsbCA8PCBzaGlmdCkgLSAxKSk7Cit9CisKK3N0YXRpYyBib29sIHNreF90YWRfZGVjb2RlKHN0cnVjdCBkZWNvZGVkX2FkZHIgKnJlcykKK3sKKwlpbnQgaTsKKwl1MzIgYmFzZSwgd2F5bmVzcywgY2huaWx2b2Zmc2V0OworCWludCBza3RfaW50ZXJsZWF2ZV9iaXQsIGNobl9pbnRlcmxlYXZlX2JpdDsKKwl1NjQgY2hhbm5lbF9hZGRyOworCisJZm9yIChpID0gMDsgaSA8IFNLWF9NQVhfVEFEOyBpKyspIHsKKwkJU0tYX0dFVF9UQURCQVNFKHJlcy0+ZGV2LCByZXMtPmltYywgaSwgYmFzZSk7CisJCVNLWF9HRVRfVEFEV0FZTkVTUyhyZXMtPmRldiwgcmVzLT5pbWMsIGksIHdheW5lc3MpOworCQlpZiAoU0tYX1RBRF9CQVNFKGJhc2UpIDw9IHJlcy0+YWRkciAmJiByZXMtPmFkZHIgPD0gU0tYX1RBRF9MSU1JVCh3YXluZXNzKSkKKwkJCWdvdG8gdGFkX2ZvdW5kOworCX0KKwllZGFjX2RiZygwLCAiTm8gVEFEIGVudHJ5IGZvciAlbGx4XG4iLCByZXMtPmFkZHIpOworCXJldHVybiBmYWxzZTsKKwordGFkX2ZvdW5kOgorCXJlcy0+c2t0d2F5cyA9IFNLWF9UQURfU0tUV0FZUyh3YXluZXNzKTsKKwlyZXMtPmNoYW53YXlzID0gU0tYX1RBRF9DSE5XQVlTKHdheW5lc3MpOworCXNrdF9pbnRlcmxlYXZlX2JpdCA9IHNreF9ncmFudWxhcml0eVtTS1hfVEFEX1NLVF9HUkFOKGJhc2UpXTsKKwljaG5faW50ZXJsZWF2ZV9iaXQgPSBza3hfZ3JhbnVsYXJpdHlbU0tYX1RBRF9DSE5fR1JBTihiYXNlKV07CisKKwlTS1hfR0VUX1RBRENITklMVk9GRlNFVChyZXMtPmRldiwgcmVzLT5pbWMsIHJlcy0+Y2hhbm5lbCwgaSwgY2huaWx2b2Zmc2V0KTsKKwljaGFubmVsX2FkZHIgPSByZXMtPmFkZHIgLSBTS1hfVEFEX09GRlNFVChjaG5pbHZvZmZzZXQpOworCisJaWYgKHJlcy0+Y2hhbndheXMgPT0gMyAmJiBza3RfaW50ZXJsZWF2ZV9iaXQgPiBjaG5faW50ZXJsZWF2ZV9iaXQpIHsKKwkJLyogTXVzdCBoYW5kbGUgY2hhbm5lbCBmaXJzdCwgdGhlbiBzb2NrZXQgKi8KKwkJY2hhbm5lbF9hZGRyID0gc2t4X2RvX2ludGVybGVhdmUoY2hhbm5lbF9hZGRyLCBjaG5faW50ZXJsZWF2ZV9iaXQsCisJCQkJCQkgcmVzLT5jaGFud2F5cywgY2hhbm5lbF9hZGRyKTsKKwkJY2hhbm5lbF9hZGRyID0gc2t4X2RvX2ludGVybGVhdmUoY2hhbm5lbF9hZGRyLCBza3RfaW50ZXJsZWF2ZV9iaXQsCisJCQkJCQkgcmVzLT5za3R3YXlzLCBjaGFubmVsX2FkZHIpOworCX0gZWxzZSB7CisJCS8qIEhhbmRsZSBzb2NrZXQgdGhlbiBjaGFubmVsLiBQcmVzZXJ2ZSBsb3cgYml0cyBmcm9tIG9yaWdpbmFsIGFkZHJlc3MgKi8KKwkJY2hhbm5lbF9hZGRyID0gc2t4X2RvX2ludGVybGVhdmUoY2hhbm5lbF9hZGRyLCBza3RfaW50ZXJsZWF2ZV9iaXQsCisJCQkJCQkgcmVzLT5za3R3YXlzLCByZXMtPmFkZHIpOworCQljaGFubmVsX2FkZHIgPSBza3hfZG9faW50ZXJsZWF2ZShjaGFubmVsX2FkZHIsIGNobl9pbnRlcmxlYXZlX2JpdCwKKwkJCQkJCSByZXMtPmNoYW53YXlzLCByZXMtPmFkZHIpOworCX0KKworCXJlcy0+Y2hhbl9hZGRyID0gY2hhbm5lbF9hZGRyOworCisJZWRhY19kYmcoMiwgIiVsbHg6IGNoYW5fYWRkcj0lbGx4IHNrdHdheXM9JWQgY2hhbndheXM9JWRcbiIsCisJCSByZXMtPmFkZHIsIHJlcy0+Y2hhbl9hZGRyLCByZXMtPnNrdHdheXMsIHJlcy0+Y2hhbndheXMpOworCXJldHVybiB0cnVlOworfQorCisjZGVmaW5lIFNLWF9NQVhfUklSIDQKKworI2RlZmluZSBTS1hfR0VUX1JJUldBWU5FU1MoZCwgbWMsIGNoLCBpLCByZWcpCQlcCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKChkKS0+aW1jW21jXS5jaGFuW2NoXS5jZGV2LAlcCisJCQkgICAgICAweDEwOCArIDQgKiAoaSksICZyZWcpCisjZGVmaW5lIFNLWF9HRVRfUklSSUxWKGQsIG1jLCBjaCwgaWR4LCBpLCByZWcpCQlcCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKChkKS0+aW1jW21jXS5jaGFuW2NoXS5jZGV2LAlcCisJCQkgICAgICAweDEyMCArIDE2ICogaWR4ICsgNCAqIChpKSwgJnJlZykKKworI2RlZmluZQlTS1hfUklSX1ZBTElEKGIpIEdFVF9CSVRGSUVMRCgoYiksIDMxLCAzMSkKKyNkZWZpbmUJU0tYX1JJUl9MSU1JVChiKSAoKCh1NjQpR0VUX0JJVEZJRUxEKChiKSwgMSwgMTEpIDw8IDI5KSB8IE1BU0syOSkKKyNkZWZpbmUJU0tYX1JJUl9XQVlTKGIpICgxIDw8IEdFVF9CSVRGSUVMRCgoYiksIDI4LCAyOSkpCisjZGVmaW5lCVNLWF9SSVJfQ0hBTl9SQU5LKGIpIEdFVF9CSVRGSUVMRCgoYiksIDE2LCAxOSkKKyNkZWZpbmUJU0tYX1JJUl9PRkZTRVQoYikgKCh1NjQpKEdFVF9CSVRGSUVMRCgoYiksIDIsIDE1KSA8PCAyNikpCisKK3N0YXRpYyBib29sIHNreF9yaXJfZGVjb2RlKHN0cnVjdCBkZWNvZGVkX2FkZHIgKnJlcykKK3sKKwlpbnQgaSwgaWR4LCBjaGFuX3Jhbms7CisJaW50IHNoaWZ0OworCXUzMiByaXJ3YXksIHJpcmx2OworCXU2NCByYW5rX2FkZHIsIHByZXZfbGltaXQgPSAwLCBsaW1pdDsKKworCWlmIChyZXMtPmRldi0+aW1jW3Jlcy0+aW1jXS5jaGFuW3Jlcy0+Y2hhbm5lbF0uZGltbXNbMF0uY2xvc2VfcGcpCisJCXNoaWZ0ID0gNjsKKwllbHNlCisJCXNoaWZ0ID0gMTM7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0tYX01BWF9SSVI7IGkrKykgeworCQlTS1hfR0VUX1JJUldBWU5FU1MocmVzLT5kZXYsIHJlcy0+aW1jLCByZXMtPmNoYW5uZWwsIGksIHJpcndheSk7CisJCWxpbWl0ID0gU0tYX1JJUl9MSU1JVChyaXJ3YXkpOworCQlpZiAoU0tYX1JJUl9WQUxJRChyaXJ3YXkpKSB7CisJCQlpZiAocHJldl9saW1pdCA8PSByZXMtPmNoYW5fYWRkciAmJgorCQkJICAgIHJlcy0+Y2hhbl9hZGRyIDw9IGxpbWl0KQorCQkJCWdvdG8gcmlyX2ZvdW5kOworCQl9CisJCXByZXZfbGltaXQgPSBsaW1pdDsKKwl9CisJZWRhY19kYmcoMCwgIk5vIFJJUiBlbnRyeSBmb3IgJWxseFxuIiwgcmVzLT5hZGRyKTsKKwlyZXR1cm4gZmFsc2U7CisKK3Jpcl9mb3VuZDoKKwlyYW5rX2FkZHIgPSByZXMtPmNoYW5fYWRkciA+PiBzaGlmdDsKKwlyYW5rX2FkZHIgLz0gU0tYX1JJUl9XQVlTKHJpcndheSk7CisJcmFua19hZGRyIDw8PSBzaGlmdDsKKwlyYW5rX2FkZHIgfD0gcmVzLT5jaGFuX2FkZHIgJiBHRU5NQVNLX1VMTChzaGlmdCAtIDEsIDApOworCisJcmVzLT5yYW5rX2FkZHJlc3MgPSByYW5rX2FkZHI7CisJaWR4ID0gKHJlcy0+Y2hhbl9hZGRyID4+IHNoaWZ0KSAlIFNLWF9SSVJfV0FZUyhyaXJ3YXkpOworCisJU0tYX0dFVF9SSVJJTFYocmVzLT5kZXYsIHJlcy0+aW1jLCByZXMtPmNoYW5uZWwsIGlkeCwgaSwgcmlybHYpOworCXJlcy0+cmFua19hZGRyZXNzID0gcmFua19hZGRyIC0gU0tYX1JJUl9PRkZTRVQocmlybHYpOworCWNoYW5fcmFuayA9IFNLWF9SSVJfQ0hBTl9SQU5LKHJpcmx2KTsKKwlyZXMtPmNoYW5uZWxfcmFuayA9IGNoYW5fcmFuazsKKwlyZXMtPmRpbW0gPSBjaGFuX3JhbmsgLyA0OworCXJlcy0+cmFuayA9IGNoYW5fcmFuayAlIDQ7CisKKwllZGFjX2RiZygyLCAiJWxseDogZGltbT0lZCByYW5rPSVkIGNoYW5fcmFuaz0lZCByYW5rX2FkZHI9JWxseFxuIiwKKwkJIHJlcy0+YWRkciwgcmVzLT5kaW1tLCByZXMtPnJhbmssCisJCSByZXMtPmNoYW5uZWxfcmFuaywgcmVzLT5yYW5rX2FkZHJlc3MpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdTggc2t4X2Nsb3NlX3Jvd1tdID0geworCTE1LCAxNiwgMTcsIDE4LCAyMCwgMjEsIDIyLCAyOCwgMTAsIDExLCAxMiwgMTMsIDI5LCAzMCwgMzEsIDMyLCAzMworfTsKK3N0YXRpYyB1OCBza3hfY2xvc2VfY29sdW1uW10gPSB7CisJMywgNCwgNSwgMTQsIDE5LCAyMywgMjQsIDI1LCAyNiwgMjcKK307CitzdGF0aWMgdTggc2t4X29wZW5fcm93W10gPSB7CisJMTQsIDE1LCAxNiwgMjAsIDI4LCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjksIDMwLCAzMSwgMzIsIDMzCit9Oworc3RhdGljIHU4IHNreF9vcGVuX2NvbHVtbltdID0geworCTMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIKK307CitzdGF0aWMgdTggc2t4X29wZW5fZmluZV9jb2x1bW5bXSA9IHsKKwkzLCA0LCA1LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMworfTsKKworc3RhdGljIGludCBza3hfYml0cyh1NjQgYWRkciwgaW50IG5iaXRzLCB1OCAqYml0cykKK3sKKwlpbnQgaSwgcmVzID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBuYml0czsgaSsrKQorCQlyZXMgfD0gKChhZGRyID4+IGJpdHNbaV0pICYgMSkgPDwgaTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHNreF9iYW5rX2JpdHModTY0IGFkZHIsIGludCBiMCwgaW50IGIxLCBpbnQgZG9feG9yLCBpbnQgeDAsIGludCB4MSkKK3sKKwlpbnQgcmV0ID0gR0VUX0JJVEZJRUxEKGFkZHIsIGIwLCBiMCkgfCAoR0VUX0JJVEZJRUxEKGFkZHIsIGIxLCBiMSkgPDwgMSk7CisKKwlpZiAoZG9feG9yKQorCQlyZXQgXj0gR0VUX0JJVEZJRUxEKGFkZHIsIHgwLCB4MCkgfCAoR0VUX0JJVEZJRUxEKGFkZHIsIHgxLCB4MSkgPDwgMSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgYm9vbCBza3hfbWFkX2RlY29kZShzdHJ1Y3QgZGVjb2RlZF9hZGRyICpyKQoreworCXN0cnVjdCBza3hfZGltbSAqZGltbSA9ICZyLT5kZXYtPmltY1tyLT5pbWNdLmNoYW5bci0+Y2hhbm5lbF0uZGltbXNbci0+ZGltbV07CisJaW50IGJnMCA9IGRpbW0tPmZpbmVfZ3JhaW5fYmFuayA/IDYgOiAxMzsKKworCWlmIChkaW1tLT5jbG9zZV9wZykgeworCQlyLT5yb3cgPSBza3hfYml0cyhyLT5yYW5rX2FkZHJlc3MsIGRpbW0tPnJvd2JpdHMsIHNreF9jbG9zZV9yb3cpOworCQlyLT5jb2x1bW4gPSBza3hfYml0cyhyLT5yYW5rX2FkZHJlc3MsIGRpbW0tPmNvbGJpdHMsIHNreF9jbG9zZV9jb2x1bW4pOworCQlyLT5jb2x1bW4gfD0gMHg0MDA7IC8qIEMxMCBpcyBhdXRvcHJlY2hhcmdlLCBhbHdheXMgc2V0ICovCisJCXItPmJhbmtfYWRkcmVzcyA9IHNreF9iYW5rX2JpdHMoci0+cmFua19hZGRyZXNzLCA4LCA5LCBkaW1tLT5iYW5rX3hvcl9lbmFibGUsIDIyLCAyOCk7CisJCXItPmJhbmtfZ3JvdXAgPSBza3hfYmFua19iaXRzKHItPnJhbmtfYWRkcmVzcywgNiwgNywgZGltbS0+YmFua194b3JfZW5hYmxlLCAyMCwgMjEpOworCX0gZWxzZSB7CisJCXItPnJvdyA9IHNreF9iaXRzKHItPnJhbmtfYWRkcmVzcywgZGltbS0+cm93Yml0cywgc2t4X29wZW5fcm93KTsKKwkJaWYgKGRpbW0tPmZpbmVfZ3JhaW5fYmFuaykKKwkJCXItPmNvbHVtbiA9IHNreF9iaXRzKHItPnJhbmtfYWRkcmVzcywgZGltbS0+Y29sYml0cywgc2t4X29wZW5fZmluZV9jb2x1bW4pOworCQllbHNlCisJCQlyLT5jb2x1bW4gPSBza3hfYml0cyhyLT5yYW5rX2FkZHJlc3MsIGRpbW0tPmNvbGJpdHMsIHNreF9vcGVuX2NvbHVtbik7CisJCXItPmJhbmtfYWRkcmVzcyA9IHNreF9iYW5rX2JpdHMoci0+cmFua19hZGRyZXNzLCAxOCwgMTksIGRpbW0tPmJhbmtfeG9yX2VuYWJsZSwgMjIsIDIzKTsKKwkJci0+YmFua19ncm91cCA9IHNreF9iYW5rX2JpdHMoci0+cmFua19hZGRyZXNzLCBiZzAsIDE3LCBkaW1tLT5iYW5rX3hvcl9lbmFibGUsIDIwLCAyMSk7CisJfQorCXItPnJvdyAmPSAoMXUgPDwgZGltbS0+cm93Yml0cykgLSAxOworCisJZWRhY19kYmcoMiwgIiVsbHg6IHJvdz0leCBjb2w9JXggYmFua19hZGRyPSVkIGJhbmtfZ3JvdXA9JWRcbiIsCisJCSByLT5hZGRyLCByLT5yb3csIHItPmNvbHVtbiwgci0+YmFua19hZGRyZXNzLAorCQkgci0+YmFua19ncm91cCk7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHNreF9kZWNvZGUoc3RydWN0IGRlY29kZWRfYWRkciAqcmVzKQoreworCisJcmV0dXJuIHNreF9zYWRfZGVjb2RlKHJlcykgJiYgc2t4X3RhZF9kZWNvZGUocmVzKSAmJgorCQlza3hfcmlyX2RlY29kZShyZXMpICYmIHNreF9tYWRfZGVjb2RlKHJlcyk7Cit9CisKKyNpZmRlZiBDT05GSUdfRURBQ19ERUJVRworLyoKKyAqIERlYnVnIGZlYXR1cmUuIE1ha2UgL3N5cy9rZXJuZWwvZGVidWcvc2t4X2VkYWNfdGVzdC9hZGRyLgorICogV3JpdGUgYW4gYWRkcmVzcyB0byB0aGlzIGZpbGUgdG8gZXhlcmNpc2UgdGhlIGFkZHJlc3MgZGVjb2RlCisgKiBsb2dpYyBpbiB0aGlzIGRyaXZlci4KKyAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKnNreF90ZXN0Oworc3RhdGljIHU2NCBza3hfZmFrZV9hZGRyOworCitzdGF0aWMgaW50IGRlYnVnZnNfdTY0X3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCXN0cnVjdCBkZWNvZGVkX2FkZHIgcmVzOworCisJcmVzLmFkZHIgPSB2YWw7CisJc2t4X2RlY29kZSgmcmVzKTsKKworCXJldHVybiAwOworfQorCitERUZJTkVfU0lNUExFX0FUVFJJQlVURShmb3BzX3U2NF93bywgTlVMTCwgZGVidWdmc191NjRfc2V0LCAiJWxsdVxuIik7CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpteWRlYnVnZnNfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIHVtb2RlX3QgbW9kZSwKKwkJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqcGFyZW50LCB1NjQgKnZhbHVlKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgdmFsdWUsICZmb3BzX3U2NF93byk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX3NreF9kZWJ1Zyh2b2lkKQoreworCXNreF90ZXN0ID0gZGVidWdmc19jcmVhdGVfZGlyKCJza3hfZWRhY190ZXN0IiwgTlVMTCk7CisJbXlkZWJ1Z2ZzX2NyZWF0ZSgiYWRkciIsIFNfSVdVU1IsIHNreF90ZXN0LCAmc2t4X2Zha2VfYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIHRlYXJkb3duX3NreF9kZWJ1Zyh2b2lkKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShza3hfdGVzdCk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgc2V0dXBfc2t4X2RlYnVnKHZvaWQpCit7Cit9CisKK3N0YXRpYyB2b2lkIHRlYXJkb3duX3NreF9kZWJ1Zyh2b2lkKQoreworfQorI2VuZGlmIC8qQ09ORklHX0VEQUNfREVCVUcqLworCitzdGF0aWMgdm9pZCBza3hfbWNlX291dHB1dF9lcnJvcihzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJIGNvbnN0IHN0cnVjdCBtY2UgKm0sCisJCQkJIHN0cnVjdCBkZWNvZGVkX2FkZHIgKnJlcykKK3sKKwllbnVtIGh3X2V2ZW50X21jX2Vycl90eXBlIHRwX2V2ZW50OworCWNoYXIgKnR5cGUsICpvcHR5cGUsIG1zZ1syNTZdOworCWJvb2wgcmlwdiA9IEdFVF9CSVRGSUVMRChtLT5tY2dzdGF0dXMsIDAsIDApOworCWJvb2wgb3ZlcmZsb3cgPSBHRVRfQklURklFTEQobS0+c3RhdHVzLCA2MiwgNjIpOworCWJvb2wgdW5jb3JyZWN0ZWRfZXJyb3IgPSBHRVRfQklURklFTEQobS0+c3RhdHVzLCA2MSwgNjEpOworCWJvb2wgcmVjb3ZlcmFibGU7CisJdTMyIGNvcmVfZXJyX2NudCA9IEdFVF9CSVRGSUVMRChtLT5zdGF0dXMsIDM4LCA1Mik7CisJdTMyIG1zY29kID0gR0VUX0JJVEZJRUxEKG0tPnN0YXR1cywgMTYsIDMxKTsKKwl1MzIgZXJyY29kZSA9IEdFVF9CSVRGSUVMRChtLT5zdGF0dXMsIDAsIDE1KTsKKwl1MzIgb3B0eXBlbnVtID0gR0VUX0JJVEZJRUxEKG0tPnN0YXR1cywgNCwgNik7CisKKwlyZWNvdmVyYWJsZSA9IEdFVF9CSVRGSUVMRChtLT5zdGF0dXMsIDU2LCA1Nik7CisKKwlpZiAodW5jb3JyZWN0ZWRfZXJyb3IpIHsKKwkJaWYgKHJpcHYpIHsKKwkJCXR5cGUgPSAiRkFUQUwiOworCQkJdHBfZXZlbnQgPSBIV19FVkVOVF9FUlJfRkFUQUw7CisJCX0gZWxzZSB7CisJCQl0eXBlID0gIk5PTl9GQVRBTCI7CisJCQl0cF9ldmVudCA9IEhXX0VWRU5UX0VSUl9VTkNPUlJFQ1RFRDsKKwkJfQorCX0gZWxzZSB7CisJCXR5cGUgPSAiQ09SUkVDVEVEIjsKKwkJdHBfZXZlbnQgPSBIV19FVkVOVF9FUlJfQ09SUkVDVEVEOworCX0KKworCS8qCisJICogQWNjb3JkaW5nIHdpdGggVGFibGUgMTUtOSBvZiB0aGUgSW50ZWwgQXJjaGl0ZWN0dXJlIHNwZWMgdm9sIDNBLAorCSAqIG1lbW9yeSBlcnJvcnMgc2hvdWxkIGZpdCBpbiB0aGlzIG1hc2s6CisJICoJMDAwZiAwMDAwIDFtbW0gY2NjYyAoYmluYXJ5KQorCSAqIHdoZXJlOgorCSAqCWYgPSBDb3JyZWN0aW9uIFJlcG9ydCBGaWx0ZXJpbmcgQml0LiBJZiAxLCBzdWJzZXF1ZW50IGVycm9ycworCSAqCSAgICB3b24ndCBiZSBzaG93bgorCSAqCW1tbSA9IGVycm9yIHR5cGUKKwkgKgljY2NjID0gY2hhbm5lbAorCSAqIElmIHRoZSBtYXNrIGRvZXNuJ3QgbWF0Y2gsIHJlcG9ydCBhbiBlcnJvciB0byB0aGUgcGFyc2luZyBsb2dpYworCSAqLworCWlmICghKChlcnJjb2RlICYgMHhlZjgwKSA9PSAweDgwKSkgeworCQlvcHR5cGUgPSAiQ2FuJ3QgcGFyc2U6IGl0IGlzIG5vdCBhIG1lbSI7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChvcHR5cGVudW0pIHsKKwkJY2FzZSAwOgorCQkJb3B0eXBlID0gImdlbmVyaWMgdW5kZWYgcmVxdWVzdCBlcnJvciI7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJb3B0eXBlID0gIm1lbW9yeSByZWFkIGVycm9yIjsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlvcHR5cGUgPSAibWVtb3J5IHdyaXRlIGVycm9yIjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlvcHR5cGUgPSAiYWRkci9jbWQgZXJyb3IiOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCW9wdHlwZSA9ICJtZW1vcnkgc2NydWJiaW5nIGVycm9yIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJb3B0eXBlID0gInJlc2VydmVkIjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc25wcmludGYobXNnLCBzaXplb2YobXNnKSwKKwkJICIlcyVzIGVycl9jb2RlOiUwNHg6JTA0eCBzb2NrZXQ6JWQgaW1jOiVkIHJhbms6JWQgYmc6JWQgYmE6JWQgcm93OiV4IGNvbDoleCIsCisJCSBvdmVyZmxvdyA/ICIgT1ZFUkZMT1ciIDogIiIsCisJCSAodW5jb3JyZWN0ZWRfZXJyb3IgJiYgcmVjb3ZlcmFibGUpID8gIiByZWNvdmVyYWJsZSIgOiAiIiwKKwkJIG1zY29kLCBlcnJjb2RlLAorCQkgcmVzLT5zb2NrZXQsIHJlcy0+aW1jLCByZXMtPnJhbmssCisJCSByZXMtPmJhbmtfZ3JvdXAsIHJlcy0+YmFua19hZGRyZXNzLCByZXMtPnJvdywgcmVzLT5jb2x1bW4pOworCisJZWRhY19kYmcoMCwgIiVzXG4iLCBtc2cpOworCisJLyogQ2FsbCB0aGUgaGVscGVyIHRvIG91dHB1dCBtZXNzYWdlICovCisJZWRhY19tY19oYW5kbGVfZXJyb3IodHBfZXZlbnQsIG1jaSwgY29yZV9lcnJfY250LAorCQkJICAgICBtLT5hZGRyID4+IFBBR0VfU0hJRlQsIG0tPmFkZHIgJiB+UEFHRV9NQVNLLCAwLAorCQkJICAgICByZXMtPmNoYW5uZWwsIHJlcy0+ZGltbSwgLTEsCisJCQkgICAgIG9wdHlwZSwgbXNnKTsKK30KKworc3RhdGljIGludCBza3hfbWNlX2NoZWNrX2Vycm9yKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkJICAgICAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1jZSAqbWNlID0gKHN0cnVjdCBtY2UgKilkYXRhOworCXN0cnVjdCBkZWNvZGVkX2FkZHIgcmVzOworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKwljaGFyICp0eXBlOworCisJaWYgKGdldF9lZGFjX3JlcG9ydF9zdGF0dXMoKSA9PSBFREFDX1JFUE9SVElOR19ESVNBQkxFRCkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJLyogaWdub3JlIHVubGVzcyB0aGlzIGlzIG1lbW9yeSByZWxhdGVkIHdpdGggYW4gYWRkcmVzcyAqLworCWlmICgobWNlLT5zdGF0dXMgJiAweGVmZmYpID4+IDcgIT0gMSB8fCAhKG1jZS0+c3RhdHVzICYgTUNJX1NUQVRVU19BRERSVikpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCXJlcy5hZGRyID0gbWNlLT5hZGRyOworCWlmICghc2t4X2RlY29kZSgmcmVzKSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCW1jaSA9IHJlcy5kZXYtPmltY1tyZXMuaW1jXS5tY2k7CisKKwlpZiAobWNlLT5tY2dzdGF0dXMgJiBNQ0dfU1RBVFVTX01DSVApCisJCXR5cGUgPSAiRXhjZXB0aW9uIjsKKwllbHNlCisJCXR5cGUgPSAiRXZlbnQiOworCisJc2t4X21jX3ByaW50ayhtY2ksIEtFUk5fREVCVUcsICJIQU5ETElORyBNQ0UgTUVNT1JZIEVSUk9SXG4iKTsKKworCXNreF9tY19wcmludGsobWNpLCBLRVJOX0RFQlVHLCAiQ1BVICVkOiBNYWNoaW5lIENoZWNrICVzOiAlTHggIgorCQkJICAiQmFuayAlZDogJTAxNkx4XG4iLCBtY2UtPmV4dGNwdSwgdHlwZSwKKwkJCSAgbWNlLT5tY2dzdGF0dXMsIG1jZS0+YmFuaywgbWNlLT5zdGF0dXMpOworCXNreF9tY19wcmludGsobWNpLCBLRVJOX0RFQlVHLCAiVFNDICVsbHggIiwgbWNlLT50c2MpOworCXNreF9tY19wcmludGsobWNpLCBLRVJOX0RFQlVHLCAiQUREUiAlbGx4ICIsIG1jZS0+YWRkcik7CisJc2t4X21jX3ByaW50ayhtY2ksIEtFUk5fREVCVUcsICJNSVNDICVsbHggIiwgbWNlLT5taXNjKTsKKworCXNreF9tY19wcmludGsobWNpLCBLRVJOX0RFQlVHLCAiUFJPQ0VTU09SICV1OiV4IFRJTUUgJWxsdSBTT0NLRVQgIgorCQkJICAiJXUgQVBJQyAleFxuIiwgbWNlLT5jcHV2ZW5kb3IsIG1jZS0+Y3B1aWQsCisJCQkgIG1jZS0+dGltZSwgbWNlLT5zb2NrZXRpZCwgbWNlLT5hcGljaWQpOworCisJc2t4X21jZV9vdXRwdXRfZXJyb3IobWNpLCBtY2UsICZyZXMpOworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNreF9tY2VfZGVjID0geworCS5ub3RpZmllcl9jYWxsID0gc2t4X21jZV9jaGVja19lcnJvciwKK307CisKK3N0YXRpYyB2b2lkIHNreF9yZW1vdmUodm9pZCkKK3sKKwlpbnQgaSwgajsKKwlzdHJ1Y3Qgc2t4X2RldiAqZCwgKnRtcDsKKworCWVkYWNfZGJnKDAsICJcbiIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGQsIHRtcCwgJnNreF9lZGFjX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmQtPmxpc3QpOworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0lNQzsgaSsrKSB7CisJCQlza3hfdW5yZWdpc3Rlcl9tY2koJmQtPmltY1tpXSk7CisJCQlmb3IgKGogPSAwOyBqIDwgTlVNX0NIQU5ORUxTOyBqKyspCisJCQkJcGNpX2Rldl9wdXQoZC0+aW1jW2ldLmNoYW5bal0uY2Rldik7CisJCX0KKwkJcGNpX2Rldl9wdXQoZC0+dXRpbF9hbGwpOworCQlwY2lfZGV2X3B1dChkLT5zYWRfYWxsKTsKKworCQlrZnJlZShkKTsKKwl9Cit9CisKKy8qCisgKiBza3hfaW5pdDoKKyAqCW1ha2Ugc3VyZSB3ZSBhcmUgcnVubmluZyBvbiB0aGUgY29ycmVjdCBjcHUgbW9kZWwKKyAqCXNlYXJjaCBmb3IgYWxsIHRoZSBkZXZpY2VzIHdlIG5lZWQKKyAqCWNoZWNrIHdoaWNoIERJTU1zIGFyZSBwcmVzZW50LgorICovCitpbnQgX19pbml0IHNreF9pbml0KHZvaWQpCit7CisJY29uc3Qgc3RydWN0IHg4Nl9jcHVfaWQgKmlkOworCWNvbnN0IHN0cnVjdCBtdW5pdCAqbTsKKwlpbnQgcmMgPSAwLCBpOworCXU4IG1jID0gMCwgc3JjX2lkLCBub2RlX2lkOworCXN0cnVjdCBza3hfZGV2ICpkOworCisJZWRhY19kYmcoMiwgIlxuIik7CisKKwlpZCA9IHg4Nl9tYXRjaF9jcHUoc2t4X2NwdWlkcyk7CisJaWYgKCFpZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyYyA9IHNreF9nZXRfaGlfbG8oKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gZ2V0X2FsbF9idXNfbWFwcGluZ3MoKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGZhaWw7CisJaWYgKHJjID09IDApIHsKKwkJZWRhY19kYmcoMiwgIk5vIG1lbW9yeSBjb250cm9sbGVycyBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZvciAobSA9IHNreF9hbGxfbXVuaXRzOyBtLT5kaWQ7IG0rKykgeworCQlyYyA9IGdldF9hbGxfbXVuaXRzKG0pOworCQlpZiAocmMgPCAwKQorCQkJZ290byBmYWlsOworCQlpZiAocmMgIT0gbS0+cGVyX3NvY2tldCAqIHNreF9udW1fc29ja2V0cykgeworCQkJZWRhY19kYmcoMiwgIkV4cGVjdGVkICVkLCBnb3QgJWQgb2YgJXhcbiIsCisJCQkJIG0tPnBlcl9zb2NrZXQgKiBza3hfbnVtX3NvY2tldHMsIHJjLCBtLT5kaWQpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmc2t4X2VkYWNfbGlzdCwgbGlzdCkgeworCQlzcmNfaWQgPSBnZXRfc3JjX2lkKGQpOworCQlub2RlX2lkID0gc2t4X2dldF9ub2RlX2lkKGQpOworCQllZGFjX2RiZygyLCAic3JjX2lkPSVkIG5vZGVfaWQ9JWRcbiIsIHNyY19pZCwgbm9kZV9pZCk7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fSU1DOyBpKyspIHsKKwkJCWQtPmltY1tpXS5tYyA9IG1jKys7CisJCQlkLT5pbWNbaV0ubG1jID0gaTsKKwkJCWQtPmltY1tpXS5zcmNfaWQgPSBzcmNfaWQ7CisJCQlkLT5pbWNbaV0ubm9kZV9pZCA9IG5vZGVfaWQ7CisJCQlyYyA9IHNreF9yZWdpc3Rlcl9tY2koJmQtPmltY1tpXSk7CisJCQlpZiAocmMgPCAwKQorCQkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCS8qIEVuc3VyZSB0aGF0IHRoZSBPUFNUQVRFIGlzIHNldCBjb3JyZWN0bHkgZm9yIFBPTEwgb3IgTk1JICovCisJb3BzdGF0ZV9pbml0KCk7CisKKwlzZXR1cF9za3hfZGVidWcoKTsKKworCW1jZV9yZWdpc3Rlcl9kZWNvZGVfY2hhaW4oJnNreF9tY2VfZGVjKTsKKworCXJldHVybiAwOworZmFpbDoKKwlza3hfcmVtb3ZlKCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2t4X2V4aXQodm9pZCkKK3sKKwllZGFjX2RiZygyLCAiXG4iKTsKKwltY2VfdW5yZWdpc3Rlcl9kZWNvZGVfY2hhaW4oJnNreF9tY2VfZGVjKTsKKwlza3hfcmVtb3ZlKCk7CisJdGVhcmRvd25fc2t4X2RlYnVnKCk7Cit9CisKK21vZHVsZV9pbml0KHNreF9pbml0KTsKK21vZHVsZV9leGl0KHNreF9leGl0KTsKKworbW9kdWxlX3BhcmFtKGVkYWNfb3Bfc3RhdGUsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVkYWNfb3Bfc3RhdGUsICJFREFDIEVycm9yIFJlcG9ydGluZyBzdGF0ZTogMD1Qb2xsLDE9Tk1JIik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIlRvbnkgTHVjayIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQyBEcml2ZXIgZm9yIEludGVsIFNreWxha2Ugc2VydmVyIHByb2Nlc3NvcnMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy93cS5jIGIvZHJpdmVycy9lZGFjL3dxLmMKaW5kZXggMWI4YzA3ZS4uMmE5YTExYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL3dxLmMKKysrIGIvZHJpdmVycy9lZGFjL3dxLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAogaW50IGVkYWNfd29ya3F1ZXVlX3NldHVwKHZvaWQpCiB7Ci0Jd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiZWRhYy1wb2xsZXIiKTsKKwl3cSA9IGFsbG9jX29yZGVyZWRfd29ya3F1ZXVlKCJlZGFjLXBvbGxlciIsIFdRX01FTV9SRUNMQUlNKTsKIAlpZiAoIXdxKQogCQlyZXR1cm4gLUVOT0RFVjsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9LY29uZmlnIGIvZHJpdmVycy9leHRjb24vS2NvbmZpZwppbmRleCAzZDg5ZTYwLi4wNDc4OGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvZXh0Y29uL0tjb25maWcKQEAgLTk2LDYgKzk2LDEyIEBACiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBVU0IgcGVyaXBoZXJhbCBhbmQgVVNCIGhvc3QKIAkgIGRldGVjdGlvbiBieSBwYWxtYXMgdXNiLgogCitjb25maWcgRVhUQ09OX1FDT01fU1BNSV9NSVNDCisJdHJpc3RhdGUgIlF1YWxjb21tIFVTQiBleHRjb24gc3VwcG9ydCIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBTUE1JIFBNSUMgYmFzZWQgVVNCIGNhYmxlIGRldGVjdGlvbgorCSAgc3VwcG9ydCBvbiBRdWFsY29tbSBQTUlDcyBzdWNoIGFzIFBNODk0MS4KKwogY29uZmlnIEVYVENPTl9SVDg5NzNBCiAJdHJpc3RhdGUgIlJpY2h0ZWsgUlQ4OTczQSBFWFRDT04gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEkyQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vTWFrZWZpbGUgYi9kcml2ZXJzL2V4dGNvbi9NYWtlZmlsZQppbmRleCA5NzJjODEzLi4zMWEwYTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2V4dGNvbi9NYWtlZmlsZQpAQCAtMTQsNiArMTQsNyBAQAogb2JqLSQoQ09ORklHX0VYVENPTl9NQVg3Nzg0MykJKz0gZXh0Y29uLW1heDc3ODQzLm8KIG9iai0kKENPTkZJR19FWFRDT05fTUFYODk5NykJKz0gZXh0Y29uLW1heDg5OTcubwogb2JqLSQoQ09ORklHX0VYVENPTl9QQUxNQVMpCSs9IGV4dGNvbi1wYWxtYXMubworb2JqLSQoQ09ORklHX0VYVENPTl9RQ09NX1NQTUlfTUlTQykgKz0gZXh0Y29uLXFjb20tc3BtaS1taXNjLm8KIG9iai0kKENPTkZJR19FWFRDT05fUlQ4OTczQSkJKz0gZXh0Y29uLXJ0ODk3M2Eubwogb2JqLSQoQ09ORklHX0VYVENPTl9TTTU1MDIpCSs9IGV4dGNvbi1zbTU1MDIubwogb2JqLSQoQ09ORklHX0VYVENPTl9VU0JfR1BJTykJKz0gZXh0Y29uLXVzYi1ncGlvLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1hZGMtamFjay5jIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLWFkYy1qYWNrLmMKaW5kZXggNDRlNDhhYS4uYmM1Mzg3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9leHRjb24vZXh0Y29uLWFkYy1qYWNrLmMKKysrIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLWFkYy1qYWNrLmMKQEAgLTMsNiArMyw5IEBACiAgKgogICogQW5hbG9nIEphY2sgZXh0Y29uIGRyaXZlciB3aXRoIEFEQy1iYXNlZCBkZXRlY3Rpb24gY2FwYWJpbGl0eS4KICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgU2Ftc3VuZyBFbGVjdHJvbmljcworICogQ2hhbndvbyBDaG9pIDxjdzAwLmNob2lAc2Ftc3VuZy5jb20+CisgKgogICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MKICAqIE15dW5nSm9vIEhhbSA8bXl1bmdqb28uaGFtQHNhbXN1bmcuY29tPgogICoKQEAgLTU4LDcgKzYxLDcgQEAKIAlzdHJ1Y3QgYWRjX2phY2tfZGF0YSAqZGF0YSA9IGNvbnRhaW5lcl9vZih0b19kZWxheWVkX3dvcmsod29yayksCiAJCQlzdHJ1Y3QgYWRjX2phY2tfZGF0YSwKIAkJCWhhbmRsZXIpOwotCXUzMiBzdGF0ZSA9IDA7CisJc3RydWN0IGFkY19qYWNrX2NvbmQgKmRlZjsKIAlpbnQgcmV0LCBhZGNfdmFsOwogCWludCBpOwogCkBAIC03MCwxNyArNzMsMTggQEAKIAogCS8qIEdldCBzdGF0ZSBmcm9tIGFkYyB2YWx1ZSB3aXRoIGFkY19jb25kaXRpb25zICovCiAJZm9yIChpID0gMDsgaSA8IGRhdGEtPm51bV9jb25kaXRpb25zOyBpKyspIHsKLQkJc3RydWN0IGFkY19qYWNrX2NvbmQgKmRlZiA9ICZkYXRhLT5hZGNfY29uZGl0aW9uc1tpXTsKLQkJaWYgKCFkZWYtPnN0YXRlKQotCQkJYnJlYWs7CisJCWRlZiA9ICZkYXRhLT5hZGNfY29uZGl0aW9uc1tpXTsKIAkJaWYgKGRlZi0+bWluX2FkYyA8PSBhZGNfdmFsICYmIGRlZi0+bWF4X2FkYyA+PSBhZGNfdmFsKSB7Ci0JCQlzdGF0ZSA9IGRlZi0+c3RhdGU7Ci0JCQlicmVhazsKKwkJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhkYXRhLT5lZGV2LCBkZWYtPmlkLCB0cnVlKTsKKwkJCXJldHVybjsKIAkJfQogCX0KLQkvKiBpZiBubyBkZWYgaGFzIG1ldCwgaXQgbWVhbnMgc3RhdGUgPSAwIChubyBjYWJsZXMgYXR0YWNoZWQpICovCiAKLQlleHRjb25fc2V0X3N0YXRlKGRhdGEtPmVkZXYsIHN0YXRlKTsKKwkvKiBTZXQgdGhlIGRldGFjaGVkIHN0YXRlIGlmIGFkYyB2YWx1ZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHJhbmdlICovCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPm51bV9jb25kaXRpb25zOyBpKyspIHsKKwkJZGVmID0gJmRhdGEtPmFkY19jb25kaXRpb25zW2ldOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZGF0YS0+ZWRldiwgZGVmLT5pZCwgZmFsc2UpOworCX0KIH0KIAogc3RhdGljIGlycXJldHVybl90IGFkY19qYWNrX2lycV90aHJlYWQoaW50IGlycSwgdm9pZCAqX2RhdGEpCkBAIC0xMTQsMTYgKzExOCwxNCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlpZiAoIXBkYXRhLT5hZGNfY29uZGl0aW9ucyB8fAotCQkJIXBkYXRhLT5hZGNfY29uZGl0aW9uc1swXS5zdGF0ZSkgeworCWlmICghcGRhdGEtPmFkY19jb25kaXRpb25zKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImVycm9yOiBhZGNfY29uZGl0aW9ucyBub3QgZGVmaW5lZC5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJZGF0YS0+YWRjX2NvbmRpdGlvbnMgPSBwZGF0YS0+YWRjX2NvbmRpdGlvbnM7CiAKIAkvKiBDaGVjayB0aGUgbGVuZ3RoIG9mIGFycmF5IGFuZCBzZXQgbnVtX2NvbmRpdGlvbnMgKi8KLQlmb3IgKGkgPSAwOyBkYXRhLT5hZGNfY29uZGl0aW9uc1tpXS5zdGF0ZTsgaSsrKQotCQk7CisJZm9yIChpID0gMDsgZGF0YS0+YWRjX2NvbmRpdGlvbnNbaV0uaWQgIT0gRVhUQ09OX05PTkU7IGkrKyk7CiAJZGF0YS0+bnVtX2NvbmRpdGlvbnMgPSBpOwogCiAJZGF0YS0+Y2hhbiA9IGlpb19jaGFubmVsX2dldCgmcGRldi0+ZGV2LCBwZGF0YS0+Y29uc3VtZXJfY2hhbm5lbCk7CkBAIC0xNTgsNiArMTYwLDcgQEAKIAlpZiAoZGF0YS0+d2FrZXVwX3NvdXJjZSkKIAkJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDEpOwogCisJYWRjX2phY2tfaGFuZGxlcigmZGF0YS0+aGFuZGxlci53b3JrKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vZXh0Y29uLWFyaXpvbmEuYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1hcml6b25hLmMKaW5kZXggMWQ4ZTBhNS4uNTZlNmM0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9leHRjb24vZXh0Y29uLWFyaXpvbmEuYworKysgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tYXJpem9uYS5jCkBAIC0xODMsNyArMTgzLDcgQEAKIAkJaWYgKGNsYW1wKQogCQkJdmFsID0gQVJJWk9OQV9STVZfU0hSVF9IUDFMOwogCQlicmVhazsKLQl9OworCX0KIAogCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGFyaXpvbmEtPmRhcG0pOwogCkBAIC02MTQsNyArNjE0LDcgQEAKIAl9CiAKIAkvKiBJZiB0aGUgY2FibGUgd2FzIHJlbW92ZWQgd2hpbGUgbWVhc3VyaW5nIGlnbm9yZSB0aGUgcmVzdWx0ICovCi0JcmV0ID0gZXh0Y29uX2dldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX01FQ0hBTklDQUwpOworCXJldCA9IGV4dGNvbl9nZXRfc3RhdGUoaW5mby0+ZWRldiwgRVhUQ09OX01FQ0hBTklDQUwpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoYXJpem9uYS0+ZGV2LCAiRmFpbGVkIHRvIGNoZWNrIGNhYmxlIHN0YXRlOiAlZFxuIiwKIAkJCXJldCk7CkBAIC02NDksNyArNjQ5LDcgQEAKIAllbHNlCiAJCXJlcG9ydCA9IEVYVENPTl9KQUNLX0hFQURQSE9ORTsKIAotCXJldCA9IGV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIHJlcG9ydCwgdHJ1ZSk7CisJcmV0ID0gZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIHJlcG9ydCwgdHJ1ZSk7CiAJaWYgKHJldCAhPSAwKQogCQlkZXZfZXJyKGFyaXpvbmEtPmRldiwgIkZhaWxlZCB0byByZXBvcnQgSFAvbGluZTogJWRcbiIsCiAJCQlyZXQpOwpAQCAtNzMyLDcgKzczMiw3IEBACiAJCQkgICBBUklaT05BX0FDQ0RFVF9NT0RFX01BU0ssIEFSSVpPTkFfQUNDREVUX01PREVfTUlDKTsKIAogCS8qIEp1c3QgcmVwb3J0IGhlYWRwaG9uZSAqLwotCXJldCA9IGV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9KQUNLX0hFQURQSE9ORSwgdHJ1ZSk7CisJcmV0ID0gZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9KQUNLX0hFQURQSE9ORSwgdHJ1ZSk7CiAJaWYgKHJldCAhPSAwKQogCQlkZXZfZXJyKGFyaXpvbmEtPmRldiwgIkZhaWxlZCB0byByZXBvcnQgaGVhZHBob25lOiAlZFxuIiwgcmV0KTsKIApAQCAtNzg5LDcgKzc4OSw3IEBACiAJCQkgICBBUklaT05BX0FDQ0RFVF9NT0RFX01BU0ssIEFSSVpPTkFfQUNDREVUX01PREVfTUlDKTsKIAogCS8qIEp1c3QgcmVwb3J0IGhlYWRwaG9uZSAqLwotCXJldCA9IGV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9KQUNLX0hFQURQSE9ORSwgdHJ1ZSk7CisJcmV0ID0gZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9KQUNLX0hFQURQSE9ORSwgdHJ1ZSk7CiAJaWYgKHJldCAhPSAwKQogCQlkZXZfZXJyKGFyaXpvbmEtPmRldiwgIkZhaWxlZCB0byByZXBvcnQgaGVhZHBob25lOiAlZFxuIiwgcmV0KTsKIApAQCAtODI5LDcgKzgyOSw3IEBACiAJbXV0ZXhfbG9jaygmaW5mby0+bG9jayk7CiAKIAkvKiBJZiB0aGUgY2FibGUgd2FzIHJlbW92ZWQgd2hpbGUgbWVhc3VyaW5nIGlnbm9yZSB0aGUgcmVzdWx0ICovCi0JcmV0ID0gZXh0Y29uX2dldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX01FQ0hBTklDQUwpOworCXJldCA9IGV4dGNvbl9nZXRfc3RhdGUoaW5mby0+ZWRldiwgRVhUQ09OX01FQ0hBTklDQUwpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoYXJpem9uYS0+ZGV2LCAiRmFpbGVkIHRvIGNoZWNrIGNhYmxlIHN0YXRlOiAlZFxuIiwKIAkJCQlyZXQpOwpAQCAtOTE0LDcgKzkxNCw3IEBACiAKIAkJYXJpem9uYV9pZGVudGlmeV9oZWFkcGhvbmUoaW5mbyk7CiAKLQkJcmV0ID0gZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwKKwkJcmV0ID0gZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsCiAJCQkJCSAgICAgIEVYVENPTl9KQUNLX01JQ1JPUEhPTkUsIHRydWUpOwogCQlpZiAocmV0ICE9IDApCiAJCQlkZXZfZXJyKGFyaXpvbmEtPmRldiwgIkhlYWRzZXQgcmVwb3J0IGZhaWxlZDogJWRcbiIsCkBAIC0xMTA4LDcgKzExMDgsNyBAQAogCiAJaWYgKGluZm8tPmxhc3RfamFja2RldCA9PSBwcmVzZW50KSB7CiAJCWRldl9kYmcoYXJpem9uYS0+ZGV2LCAiRGV0ZWN0ZWQgamFja1xuIik7Ci0JCXJldCA9IGV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsCisJCXJldCA9IGV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LAogCQkJCQkgICAgICBFWFRDT05fTUVDSEFOSUNBTCwgdHJ1ZSk7CiAKIAkJaWYgKHJldCAhPSAwKQpAQCAtMTE0OSwxMCArMTE0OSwxMyBAQAogCQkJCQkgaW5mby0+bWljZF9yYW5nZXNbaV0ua2V5LCAwKTsKIAkJaW5wdXRfc3luYyhpbmZvLT5pbnB1dCk7CiAKLQkJcmV0ID0gZXh0Y29uX3VwZGF0ZV9zdGF0ZShpbmZvLT5lZGV2LCAweGZmZmZmZmZmLCAwKTsKLQkJaWYgKHJldCAhPSAwKQotCQkJZGV2X2Vycihhcml6b25hLT5kZXYsICJSZW1vdmFsIHJlcG9ydCBmYWlsZWQ6ICVkXG4iLAotCQkJCXJldCk7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFyaXpvbmFfY2FibGUpIC0gMTsgaSsrKSB7CisJCQlyZXQgPSBleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwKKwkJCQkJYXJpem9uYV9jYWJsZVtpXSwgZmFsc2UpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCWRldl9lcnIoYXJpem9uYS0+ZGV2LAorCQkJCQkiUmVtb3ZhbCByZXBvcnQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJfQogCiAJCXJlZ21hcF91cGRhdGVfYml0cyhhcml6b25hLT5yZWdtYXAsCiAJCQkJICAgQVJJWk9OQV9KQUNLX0RFVEVDVF9ERUJPVU5DRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1heHAyODguYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1heHAyODguYwppbmRleCBmZDU1YzJmLi40MmY0MWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tYXhwMjg4LmMKKysrIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLWF4cDI4OC5jCkBAIC0xODksMTkgKzE4OSwxOSBAQAogCiAJc3dpdGNoIChjaHJnX3R5cGUpIHsKIAljYXNlIERFVF9TVEFUX1NEUDoKLQkJZGV2X2RiZyhpbmZvLT5kZXYsICJzZHAgY2FibGUgaXMgY29ubmVjZXRkXG4iKTsKKwkJZGV2X2RiZyhpbmZvLT5kZXYsICJzZHAgY2FibGUgaXMgY29ubmVjdGVkXG4iKTsKIAkJbm90aWZ5X290ZyA9IHRydWU7CiAJCW5vdGlmeV9jaGFyZ2VyID0gdHJ1ZTsKIAkJY2FibGUgPSBFWFRDT05fQ0hHX1VTQl9TRFA7CiAJCWJyZWFrOwogCWNhc2UgREVUX1NUQVRfQ0RQOgotCQlkZXZfZGJnKGluZm8tPmRldiwgImNkcCBjYWJsZSBpcyBjb25uZWNldGRcbiIpOworCQlkZXZfZGJnKGluZm8tPmRldiwgImNkcCBjYWJsZSBpcyBjb25uZWN0ZWRcbiIpOwogCQlub3RpZnlfb3RnID0gdHJ1ZTsKIAkJbm90aWZ5X2NoYXJnZXIgPSB0cnVlOwogCQljYWJsZSA9IEVYVENPTl9DSEdfVVNCX0NEUDsKIAkJYnJlYWs7CiAJY2FzZSBERVRfU1RBVF9EQ1A6Ci0JCWRldl9kYmcoaW5mby0+ZGV2LCAiZGNwIGNhYmxlIGlzIGNvbm5lY2V0ZFxuIik7CisJCWRldl9kYmcoaW5mby0+ZGV2LCAiZGNwIGNhYmxlIGlzIGNvbm5lY3RlZFxuIik7CiAJCW5vdGlmeV9jaGFyZ2VyID0gdHJ1ZTsKIAkJY2FibGUgPSBFWFRDT05fQ0hHX1VTQl9EQ1A7CiAJCWJyZWFrOwpAQCAtMjI2LDcgKzIyNiw3IEBACiAJfQogCiAJaWYgKG5vdGlmeV9jaGFyZ2VyKQotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBjYWJsZSwgdmJ1c19hdHRhY2gpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgY2FibGUsIHZidXNfYXR0YWNoKTsKIAogCS8qIENsZWFyIHRoZSBmbGFncyBvbiBkaXNjb25uZWN0IGV2ZW50ICovCiAJaWYgKCF2YnVzX2F0dGFjaCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1ncGlvLmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tZ3Bpby5jCmluZGV4IGQwMjM3ODkuLmViZWQyMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1ncGlvLmMKKysrIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLWdwaW8uYwpAQCAtNDksNyArNDksOCBAQAogCXN0YXRlID0gZ3Bpb2RfZ2V0X3ZhbHVlX2NhbnNsZWVwKGRhdGEtPmlkX2dwaW9kKTsKIAlpZiAoZGF0YS0+cGRhdGEtPmdwaW9fYWN0aXZlX2xvdykKIAkJc3RhdGUgPSAhc3RhdGU7Ci0JZXh0Y29uX3NldF9zdGF0ZShkYXRhLT5lZGV2LCBzdGF0ZSk7CisKKwlleHRjb25fc2V0X3N0YXRlX3N5bmMoZGF0YS0+ZWRldiwgZGF0YS0+cGRhdGEtPmV4dGNvbl9pZCwgc3RhdGUpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgZ3Bpb19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4MTQ1NzcuYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXgxNDU3Ny5jCmluZGV4IDg1MmE3MTEuLjEyZTI2YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXgxNDU3Ny5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXgxNDU3Ny5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAxMywyMDE0IFNhbXN1bmcgRWxlY3Ryb25pY3MKICAqIENoYW53b28gQ2hvaSA8Y3cwMC5jaG9pQHNhbXN1bmcuY29tPgotICogS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+CisgKiBLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0zNTcsNyArMzU3LDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9KSUcsIGF0dGFjaGVkKTsKKwlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0pJRywgYXR0YWNoZWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NTQsMjQgKzQ1NCwyNCBAQAogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX1VTQiwgYXR0YWNoZWQpOwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLCBhdHRhY2hlZCk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVgxNDU3N19DSEFSR0VSX1RZUEVfREVESUNBVEVEX0NIRzoKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAorCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX0RPV05TVFJFQU1fUE9SVDoKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfQ0RQLAorCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfQ0RQLAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX1NQRUNJQUxfNTAwTUE6Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NMT1csCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TTE9XLAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX1NQRUNJQUxfMUE6Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0ZBU1QsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9GQVNULAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX05PTkU6CkBAIC03OTEsNiArNzkxLDYgQEAKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobWF4MTQ1NzdfbXVpY19kcml2ZXIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIk1heGltIDE0NTc3Lzc3ODM2IEV4dGNvbiBkcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIkNoYW53b28gQ2hvaSA8Y3cwMC5jaG9pQHNhbXN1bmcuY29tPiwgS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJDaGFud29vIENob2kgPGN3MDAuY2hvaUBzYW1zdW5nLmNvbT4sIEtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BTElBUygicGxhdGZvcm06ZXh0Y29uLW1heDE0NTc3Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4MzM1NS5jIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLW1heDMzNTUuYwppbmRleCBjMjRhYmVjLi41MzNlMTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4MzM1NS5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXgzMzU1LmMKQEAgLTM5LDE2ICszOSwxNiBAQAogCQkgKiBBcyB3ZSBkb24ndCBoYXZlIGV2ZW50IGZvciBVU0IgcGVyaXBoZXJhbCBjYWJsZSBhdHRhY2hlZCwKIAkJICogd2Ugc2ltdWxhdGUgVVNCIHBlcmlwaGVyYWwgYXR0YWNoIGhlcmUuCiAJCSAqLwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhkYXRhLT5lZGV2LCBFWFRDT05fVVNCX0hPU1QsIGZhbHNlKTsKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oZGF0YS0+ZWRldiwgRVhUQ09OX1VTQiwgdHJ1ZSk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhkYXRhLT5lZGV2LCBFWFRDT05fVVNCX0hPU1QsIGZhbHNlKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGRhdGEtPmVkZXYsIEVYVENPTl9VU0IsIHRydWUpOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIElEID0gMCBtZWFucyBVU0IgSE9TVCBjYWJsZSBhdHRhY2hlZC4KIAkJICogQXMgd2UgZG9uJ3QgaGF2ZSBldmVudCBmb3IgVVNCIHBlcmlwaGVyYWwgY2FibGUgZGV0YWNoZWQsCiAJCSAqIHdlIHNpbXVsYXRlIFVTQiBwZXJpcGhlcmFsIGRldGFjaCBoZXJlLgogCQkgKi8KLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oZGF0YS0+ZWRldiwgRVhUQ09OX1VTQiwgZmFsc2UpOwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhkYXRhLT5lZGV2LCBFWFRDT05fVVNCX0hPU1QsIHRydWUpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZGF0YS0+ZWRldiwgRVhUQ09OX1VTQiwgZmFsc2UpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZGF0YS0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCB0cnVlKTsKIAl9CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4Nzc2OTMuYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXg3NzY5My5jCmluZGV4IGYxN2NiNzYuLjY4ZGJjYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXg3NzY5My5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXg3NzY5My5jCkBAIC01MDUsOCArNTA1LDggQEAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9ET0NLLCBhdHRhY2hlZCk7Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9ESVNQX01ITCwgYXR0YWNoZWQpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0RPQ0ssIGF0dGFjaGVkKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9ESVNQX01ITCwgYXR0YWNoZWQpOwogCQlnb3RvIG91dDsKIAljYXNlIE1BWDc3NjkzX01VSUNfQURDX0FVRElPX01PREVfUkVNT1RFOgkvKiBEb2NrLURlc2sgKi8KIAkJZG9ja19pZCA9IEVYVENPTl9ET0NLOwpAQCAtNTE0LDggKzUxNCw4IEBACiAJY2FzZSBNQVg3NzY5M19NVUlDX0FEQ19BVl9DQUJMRV9OT0xPQUQ6CQkvKiBEb2NrLUF1ZGlvICovCiAJCWRvY2tfaWQgPSBFWFRDT05fRE9DSzsKIAkJaWYgKCFhdHRhY2hlZCkgewotCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX1VTQiwgZmFsc2UpOwotCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0RQLAorCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsIGZhbHNlKTsKKwkJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCiAJCQkJCQlmYWxzZSk7CiAJCX0KIAkJYnJlYWs7CkBAIC01MzAsNyArNTMwLDcgQEAKIAkJCQkJYXR0YWNoZWQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIGRvY2tfaWQsIGF0dGFjaGVkKTsKKwlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgZG9ja19pZCwgYXR0YWNoZWQpOwogCiBvdXQ6CiAJcmV0dXJuIDA7CkBAIC01OTYsNyArNTk2LDcgQEAKIAkJCQkJCWF0dGFjaGVkKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCX0hPU1QsIGF0dGFjaGVkKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0JfSE9TVCwgYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDc3NjkzX01VSUNfR05EX0FWX0NBQkxFX0xPQUQ6CiAJCS8qIEF1ZGlvIFZpZGVvIENhYmxlIHdpdGggbG9hZCwgUEFUSDpBVURJTyAqLwpAQCAtNjA0LDE0ICs2MDQsMTQgQEAKIAkJCQkJCWF0dGFjaGVkKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLCBhdHRhY2hlZCk7Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsIGF0dGFjaGVkKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKIAkJCQkJYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDc3NjkzX01VSUNfR05EX01ITDoKIAljYXNlIE1BWDc3NjkzX01VSUNfR05EX01ITF9WQjoKIAkJLyogTUhMIG9yIE1ITCB3aXRoIFVTQi9UQSBjYWJsZSAqLwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fRElTUF9NSEwsIGF0dGFjaGVkKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9ESVNQX01ITCwgYXR0YWNoZWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGluZm8tPmRldiwgImZhaWxlZCB0byBkZXRlY3QgJXMgY2FibGUgb2YgZ25kIHR5cGVcbiIsCkBAIC02NTMsNyArNjUzLDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9KSUcsIGF0dGFjaGVkKTsKKwlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0pJRywgYXR0YWNoZWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04MDcsMTAgKzgwNywxMCBAQAogCQkJICogLSBTdXBwb3J0IGNoYXJnaW5nIHRocm91Z2ggbWljcm8tdXNiIHBvcnQgd2l0aG91dAogCQkJICogICBkYXRhIGNvbm5lY3Rpb24KIAkJCSAqLwotCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAorCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0RDUCwKIAkJCQkJCWF0dGFjaGVkKTsKIAkJCWlmICghY2FibGVfYXR0YWNoZWQpCi0JCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwKKwkJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwKIAkJCQkJRVhUQ09OX0RJU1BfTUhMLCBjYWJsZV9hdHRhY2hlZCk7CiAJCQlicmVhazsKIAkJfQpAQCAtODM0LDEzICs4MzQsMTMgQEAKIAkJCSAqIC0gU3VwcG9ydCBjaGFyZ2luZyB0aHJvdWdoIG1pY3JvLXVzYiBwb3J0IHdpdGhvdXQKIAkJCSAqICAgZGF0YSBjb25uZWN0aW9uLgogCQkJICovCi0JCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLAorCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsCiAJCQkJCQlhdHRhY2hlZCk7Ci0JCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCisJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0RQLAogCQkJCQkJYXR0YWNoZWQpOwogCiAJCQlpZiAoIWNhYmxlX2F0dGFjaGVkKQotCQkJCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9ET0NLLAorCQkJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fRE9DSywKIAkJCQkJCQljYWJsZV9hdHRhY2hlZCk7CiAJCQlicmVhazsKIAkJY2FzZSBNQVg3NzY5M19NVUlDX0FEQ19SRVNFUlZFRF9BQ0NfMzoJCS8qIERvY2stU21hcnQgKi8KQEAgLTg2OSw5ICs4NjksOSBAQAogCQkJaWYgKHJldCA8IDApCiAJCQkJcmV0dXJuIHJldDsKIAotCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0RPQ0ssCisJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0RPQ0ssCiAJCQkJCQlhdHRhY2hlZCk7Ci0JCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fRElTUF9NSEwsCisJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0RJU1BfTUhMLAogCQkJCQkJYXR0YWNoZWQpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTkwNSwyOCArOTA1LDI4IEBACiAJCQlpZiAocmV0IDwgMCkKIAkJCQlyZXR1cm4gcmV0OwogCi0JCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLAorCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsCiAJCQkJCQlhdHRhY2hlZCk7Ci0JCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCisJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0RQLAogCQkJCQkJYXR0YWNoZWQpOwogCQkJYnJlYWs7CiAJCWNhc2UgTUFYNzc2OTNfQ0hBUkdFUl9UWVBFX0RFRElDQVRFRF9DSEc6CiAJCQkvKiBPbmx5IFRBIGNhYmxlICovCi0JCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9EQ1AsCisJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAogCQkJCQkJYXR0YWNoZWQpOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBNQVg3NzY5M19DSEFSR0VSX1RZUEVfRE9XTlNUUkVBTV9QT1JUOgotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9DRFAsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9DRFAsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg3NzY5M19DSEFSR0VSX1RZUEVfQVBQTEVfNTAwTUE6Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NMT1csCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TTE9XLAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc2OTNfQ0hBUkdFUl9UWVBFX0FQUExFXzFBXzJBOgotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9GQVNULAorCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRkFTVCwKIAkJCQkJYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDc3NjkzX0NIQVJHRVJfVFlQRV9ERUFEX0JBVFRFUlk6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4Nzc4NDMuYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXg3Nzg0My5jCmluZGV4IGIxODhiZDYuLjVkMTFmZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXg3Nzg0My5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXg3Nzg0My5jCkBAIC0zNDYsNyArMzQ2LDcgQEAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9VU0JfSE9TVCwgYXR0YWNoZWQpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCBhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc4NDNfTVVJQ19HTkRfTUhMX1ZCOgogCWNhc2UgTUFYNzc4NDNfTVVJQ19HTkRfTUhMOgpAQCAtMzU2LDcgKzM1Niw3IEBACiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fRElTUF9NSEwsIGF0dGFjaGVkKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9ESVNQX01ITCwgYXR0YWNoZWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGluZm8tPmRldiwgImZhaWxlZCB0byBkZXRlY3QgJXMgYWNjZXNzb3J5KGduZDoweCV4KVxuIiwKQEAgLTM5Miw3ICszOTIsNyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0pJRywgYXR0YWNoZWQpOworCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fSklHLCBhdHRhY2hlZCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ4Niw4ICs0ODYsOCBAQAogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX1VTQiwgYXR0YWNoZWQpOwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLCBhdHRhY2hlZCk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg3Nzg0M19NVUlDX0NIR19ET1dOU1RSRUFNOgpAQCAtNDk3LDcgKzQ5Nyw3IEBACiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9DRFAsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9DRFAsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg3Nzg0M19NVUlDX0NIR19ERURJQ0FURUQ6CkBAIC01MDcsNyArNTA3LDcgQEAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0RDUCwKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0RDUCwKIAkJCQkJYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDc3ODQzX01VSUNfQ0hHX1NQRUNJQUxfNTAwTUE6CkBAIC01MTcsNyArNTE3LDcgQEAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NMT1csCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TTE9XLAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc4NDNfTVVJQ19DSEdfU1BFQ0lBTF8xQToKQEAgLTUyNyw3ICs1MjcsNyBAQAogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRkFTVCwKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0ZBU1QsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg3Nzg0M19NVUlDX0NIR19HTkQ6CkBAIC01MzYsMTAgKzUzNiwxMCBAQAogCiAJCS8qIENoYXJnZXIgY2FibGUgb24gTUhMIGFjY2Vzc29yeSBpcyBhdHRhY2ggb3IgZGV0YWNoICovCiAJCWlmIChnbmRfdHlwZSA9PSBNQVg3Nzg0M19NVUlDX0dORF9NSExfVkIpCi0JCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9EQ1AsCisJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAogCQkJCQkJdHJ1ZSk7CiAJCWVsc2UgaWYgKGduZF90eXBlID09IE1BWDc3ODQzX01VSUNfR05EX01ITCkKLQkJCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0RDUCwKKwkJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9EQ1AsCiAJCQkJCQlmYWxzZSk7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc4NDNfTVVJQ19DSEdfTk9ORToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXg4OTk3LmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4ODk5Ny5jCmluZGV4IDlhODkzMjAuLjRhMDYxMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXg4OTk3LmMKKysrIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLW1heDg5OTcuYwpAQCAtMzMxLDExICszMzEsMTEgQEAKIAogCXN3aXRjaCAodXNiX3R5cGUpIHsKIAljYXNlIE1BWDg5OTdfVVNCX0hPU1Q6Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9VU0JfSE9TVCwgYXR0YWNoZWQpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCBhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYODk5N19VU0JfREVWSUNFOgotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLCBhdHRhY2hlZCk7Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsIGF0dGFjaGVkKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKIAkJCQkJYXR0YWNoZWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMzYxLDcgKzM2MSw3IEBACiAJc3dpdGNoIChjYWJsZV90eXBlKSB7CiAJY2FzZSBNQVg4OTk3X01VSUNfQURDX0FWX0NBQkxFX05PTE9BRDoKIAljYXNlIE1BWDg5OTdfTVVJQ19BRENfRkFDVE9SWV9NT0RFX1VBUlRfT046Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9ET0NLLCBhdHRhY2hlZCk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fRE9DSywgYXR0YWNoZWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGluZm8tPmRldiwgImZhaWxlZCB0byBkZXRlY3QgJXMgZG9jayBkZXZpY2VcbiIsCkBAIC0zODQsNyArMzg0LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fSklHLCBhdHRhY2hlZCk7CisJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9KSUcsIGF0dGFjaGVkKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDA2LDcgKzQwNiw3IEBACiAJCQlyZXR1cm4gcmV0OwogCQlicmVhazsKIAljYXNlIE1BWDg5OTdfTVVJQ19BRENfTUhMOgotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fRElTUF9NSEwsIGF0dGFjaGVkKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9ESVNQX01ITCwgYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDg5OTdfTVVJQ19BRENfRkFDVE9SWV9NT0RFX1VTQl9PRkY6CiAJY2FzZSBNQVg4OTk3X01VSUNfQURDX0ZBQ1RPUllfTU9ERV9VU0JfT046CkBAIC00ODksMTkgKzQ4OSwxOSBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgTUFYODk5N19DSEFSR0VSX1RZUEVfRE9XTlNUUkVBTV9QT1JUOgotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9DRFAsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9DRFAsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg4OTk3X0NIQVJHRVJfVFlQRV9ERURJQ0FURURfQ0hHOgotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9EQ1AsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9EQ1AsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg4OTk3X0NIQVJHRVJfVFlQRV81MDBNQToKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0xPVywKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NMT1csCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg4OTk3X0NIQVJHRVJfVFlQRV8xQToKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRkFTVCwKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0ZBU1QsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1wYWxtYXMuYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1wYWxtYXMuYwppbmRleCBjYWZmNDZjLi42MzRiYTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tcGFsbWFzLmMKKysrIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLXBhbG1hcy5jCkBAIC02MSw3ICs2MSw3IEBACiAJaWYgKHZidXNfbGluZV9zdGF0ZSAmIFBBTE1BU19JTlQzX0xJTkVfU1RBVEVfVkJVUykgewogCQlpZiAocGFsbWFzX3VzYi0+bGlua3N0YXQgIT0gUEFMTUFTX1VTQl9TVEFURV9WQlVTKSB7CiAJCQlwYWxtYXNfdXNiLT5saW5rc3RhdCA9IFBBTE1BU19VU0JfU1RBVEVfVkJVUzsKLQkJCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGVkZXYsIEVYVENPTl9VU0IsIHRydWUpOworCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGVkZXYsIEVYVENPTl9VU0IsIHRydWUpOwogCQkJZGV2X2luZm8ocGFsbWFzX3VzYi0+ZGV2LCAiVVNCIGNhYmxlIGlzIGF0dGFjaGVkXG4iKTsKIAkJfSBlbHNlIHsKIAkJCWRldl9kYmcocGFsbWFzX3VzYi0+ZGV2LApAQCAtNzAsNyArNzAsNyBAQAogCX0gZWxzZSBpZiAoISh2YnVzX2xpbmVfc3RhdGUgJiBQQUxNQVNfSU5UM19MSU5FX1NUQVRFX1ZCVVMpKSB7CiAJCWlmIChwYWxtYXNfdXNiLT5saW5rc3RhdCA9PSBQQUxNQVNfVVNCX1NUQVRFX1ZCVVMpIHsKIAkJCXBhbG1hc191c2ItPmxpbmtzdGF0ID0gUEFMTUFTX1VTQl9TVEFURV9ESVNDT05ORUNUOwotCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oZWRldiwgRVhUQ09OX1VTQiwgZmFsc2UpOworCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGVkZXYsIEVYVENPTl9VU0IsIGZhbHNlKTsKIAkJCWRldl9pbmZvKHBhbG1hc191c2ItPmRldiwgIlVTQiBjYWJsZSBpcyBkZXRhY2hlZFxuIik7CiAJCX0gZWxzZSB7CiAJCQlkZXZfZGJnKHBhbG1hc191c2ItPmRldiwKQEAgLTk4LDcgKzk4LDcgQEAKIAkJCVBBTE1BU19VU0JfSURfSU5UX0xBVENIX0NMUiwKIAkJCVBBTE1BU19VU0JfSURfSU5UX0VOX0hJX0NMUl9JRF9HTkQpOwogCQlwYWxtYXNfdXNiLT5saW5rc3RhdCA9IFBBTE1BU19VU0JfU1RBVEVfSUQ7Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGVkZXYsIEVYVENPTl9VU0JfSE9TVCwgdHJ1ZSk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhlZGV2LCBFWFRDT05fVVNCX0hPU1QsIHRydWUpOwogCQlkZXZfaW5mbyhwYWxtYXNfdXNiLT5kZXYsICJVU0ItSE9TVCBjYWJsZSBpcyBhdHRhY2hlZFxuIik7CiAJfSBlbHNlIGlmICgoc2V0ICYgUEFMTUFTX1VTQl9JRF9JTlRfU1JDX0lEX0ZMT0FUKSAmJgogCQkJCShpZF9zcmMgJiBQQUxNQVNfVVNCX0lEX0lOVF9TUkNfSURfRkxPQVQpKSB7CkBAIC0xMDYsMTcgKzEwNiwxNyBAQAogCQkJUEFMTUFTX1VTQl9JRF9JTlRfTEFUQ0hfQ0xSLAogCQkJUEFMTUFTX1VTQl9JRF9JTlRfRU5fSElfQ0xSX0lEX0ZMT0FUKTsKIAkJcGFsbWFzX3VzYi0+bGlua3N0YXQgPSBQQUxNQVNfVVNCX1NUQVRFX0RJU0NPTk5FQ1Q7Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGVkZXYsIEVYVENPTl9VU0JfSE9TVCwgZmFsc2UpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZWRldiwgRVhUQ09OX1VTQl9IT1NULCBmYWxzZSk7CiAJCWRldl9pbmZvKHBhbG1hc191c2ItPmRldiwgIlVTQi1IT1NUIGNhYmxlIGlzIGRldGFjaGVkXG4iKTsKIAl9IGVsc2UgaWYgKChwYWxtYXNfdXNiLT5saW5rc3RhdCA9PSBQQUxNQVNfVVNCX1NUQVRFX0lEKSAmJgogCQkJCSghKHNldCAmIFBBTE1BU19VU0JfSURfSU5UX1NSQ19JRF9HTkQpKSkgewogCQlwYWxtYXNfdXNiLT5saW5rc3RhdCA9IFBBTE1BU19VU0JfU1RBVEVfRElTQ09OTkVDVDsKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oZWRldiwgRVhUQ09OX1VTQl9IT1NULCBmYWxzZSk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhlZGV2LCBFWFRDT05fVVNCX0hPU1QsIGZhbHNlKTsKIAkJZGV2X2luZm8ocGFsbWFzX3VzYi0+ZGV2LCAiVVNCLUhPU1QgY2FibGUgaXMgZGV0YWNoZWRcbiIpOwogCX0gZWxzZSBpZiAoKHBhbG1hc191c2ItPmxpbmtzdGF0ID09IFBBTE1BU19VU0JfU1RBVEVfRElTQ09OTkVDVCkgJiYKIAkJCQkoaWRfc3JjICYgUEFMTUFTX1VTQl9JRF9JTlRfU1JDX0lEX0dORCkpIHsKIAkJcGFsbWFzX3VzYi0+bGlua3N0YXQgPSBQQUxNQVNfVVNCX1NUQVRFX0lEOwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhlZGV2LCBFWFRDT05fVVNCX0hPU1QsIHRydWUpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZWRldiwgRVhUQ09OX1VTQl9IT1NULCB0cnVlKTsKIAkJZGV2X2luZm8ocGFsbWFzX3VzYi0+ZGV2LCAiIFVTQi1IT1NUIGNhYmxlIGlzIGF0dGFjaGVkXG4iKTsKIAl9CiAKQEAgLTEzNywxMCArMTM3LDEwIEBACiAJaWQgPSBncGlvZF9nZXRfdmFsdWVfY2Fuc2xlZXAocGFsbWFzX3VzYi0+aWRfZ3Bpb2QpOwogCiAJaWYgKGlkKSB7Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGVkZXYsIEVYVENPTl9VU0JfSE9TVCwgZmFsc2UpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZWRldiwgRVhUQ09OX1VTQl9IT1NULCBmYWxzZSk7CiAJCWRldl9pbmZvKHBhbG1hc191c2ItPmRldiwgIlVTQi1IT1NUIGNhYmxlIGlzIGRldGFjaGVkXG4iKTsKIAl9IGVsc2UgewotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhlZGV2LCBFWFRDT05fVVNCX0hPU1QsIHRydWUpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZWRldiwgRVhUQ09OX1VTQl9IT1NULCB0cnVlKTsKIAkJZGV2X2luZm8ocGFsbWFzX3VzYi0+ZGV2LCAiVVNCLUhPU1QgY2FibGUgaXMgYXR0YWNoZWRcbiIpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1xY29tLXNwbWktbWlzYy5jIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLXFjb20tc3BtaS1taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5NTdhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1xY29tLXNwbWktbWlzYy5jCkBAIC0wLDAgKzEsMTcwIEBACisvKioKKyAqIGV4dGNvbi1xY29tLXNwbWktbWlzYy5jIC0gUXVhbGNvbW0gVVNCIGV4dGNvbiBkcml2ZXIgdG8gc3VwcG9ydCBVU0IgSUQKKyAqCQkJCWRldGVjdGlvbiBiYXNlZCBvbiBleHRjb24tdXNiLWdwaW8uYy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTGluYXJvLCBMdGQuCisgKiBTdGVwaGVuIEJveWQgPHN0ZXBoZW4uYm95ZEBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXh0Y29uLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2RlZmluZSBVU0JfSURfREVCT1VOQ0VfTVMJNQkvKiBtcyAqLworCitzdHJ1Y3QgcWNvbV91c2JfZXh0Y29uX2luZm8geworCXN0cnVjdCBleHRjb25fZGV2ICplZGV2OworCWludCBpcnE7CisJc3RydWN0IGRlbGF5ZWRfd29yayB3cV9kZXRjYWJsZTsKKwl1bnNpZ25lZCBsb25nIGRlYm91bmNlX2ppZmZpZXM7Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFjb21fdXNiX2V4dGNvbl9jYWJsZVtdID0geworCUVYVENPTl9VU0JfSE9TVCwKKwlFWFRDT05fTk9ORSwKK307CisKK3N0YXRpYyB2b2lkIHFjb21fdXNiX2V4dGNvbl9kZXRlY3RfY2FibGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWJvb2wgaWQ7CisJaW50IHJldDsKKwlzdHJ1Y3QgcWNvbV91c2JfZXh0Y29uX2luZm8gKmluZm8gPSBjb250YWluZXJfb2YodG9fZGVsYXllZF93b3JrKHdvcmspLAorCQkJCQkJICAgIHN0cnVjdCBxY29tX3VzYl9leHRjb25faW5mbywKKwkJCQkJCSAgICB3cV9kZXRjYWJsZSk7CisKKwkvKiBjaGVjayBJRCBhbmQgdXBkYXRlIGNhYmxlIHN0YXRlICovCisJcmV0ID0gaXJxX2dldF9pcnFjaGlwX3N0YXRlKGluZm8tPmlycSwgSVJRQ0hJUF9TVEFURV9MSU5FX0xFVkVMLCAmaWQpOworCWlmIChyZXQpCisJCXJldHVybjsKKworCWV4dGNvbl9zZXRfc3RhdGUoaW5mby0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCAhaWQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcWNvbV91c2JfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBxY29tX3VzYl9leHRjb25faW5mbyAqaW5mbyA9IGRldl9pZDsKKworCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLCAmaW5mby0+d3FfZGV0Y2FibGUsCisJCQkgICBpbmZvLT5kZWJvdW5jZV9qaWZmaWVzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBxY29tX3VzYl9leHRjb25fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBxY29tX3VzYl9leHRjb25faW5mbyAqaW5mbzsKKwlpbnQgcmV0OworCisJaW5mbyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbmZvLT5lZGV2ID0gZGV2bV9leHRjb25fZGV2X2FsbG9jYXRlKGRldiwgcWNvbV91c2JfZXh0Y29uX2NhYmxlKTsKKwlpZiAoSVNfRVJSKGluZm8tPmVkZXYpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGV4dGNvbiBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXQgPSBkZXZtX2V4dGNvbl9kZXZfcmVnaXN0ZXIoZGV2LCBpbmZvLT5lZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWdpc3RlciBleHRjb24gZGV2aWNlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbmZvLT5kZWJvdW5jZV9qaWZmaWVzID0gbXNlY3NfdG9famlmZmllcyhVU0JfSURfREVCT1VOQ0VfTVMpOworCUlOSVRfREVMQVlFRF9XT1JLKCZpbmZvLT53cV9kZXRjYWJsZSwgcWNvbV91c2JfZXh0Y29uX2RldGVjdF9jYWJsZSk7CisKKwlpbmZvLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAidXNiX2lkIik7CisJaWYgKGluZm8tPmlycSA8IDApCisJCXJldHVybiBpbmZvLT5pcnE7CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKGRldiwgaW5mby0+aXJxLCBOVUxMLAorCQkJCQlxY29tX3VzYl9pcnFfaGFuZGxlciwKKwkJCQkJSVJRRl9UUklHR0VSX1JJU0lORyB8CisJCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9PTkVTSE9ULAorCQkJCQlwZGV2LT5uYW1lLCBpbmZvKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXF1ZXN0IGhhbmRsZXIgZm9yIElEIElSUVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CisJZGV2aWNlX2luaXRfd2FrZXVwKGRldiwgMSk7CisKKwkvKiBQZXJmb3JtIGluaXRpYWwgZGV0ZWN0aW9uICovCisJcWNvbV91c2JfZXh0Y29uX2RldGVjdF9jYWJsZSgmaW5mby0+d3FfZGV0Y2FibGUud29yayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxY29tX3VzYl9leHRjb25fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHFjb21fdXNiX2V4dGNvbl9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmluZm8tPndxX2RldGNhYmxlKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IHFjb21fdXNiX2V4dGNvbl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcWNvbV91c2JfZXh0Y29uX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQlyZXQgPSBlbmFibGVfaXJxX3dha2UoaW5mby0+aXJxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcWNvbV91c2JfZXh0Y29uX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHFjb21fdXNiX2V4dGNvbl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKKwkJcmV0ID0gZGlzYWJsZV9pcnFfd2FrZShpbmZvLT5pcnEpOworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMocWNvbV91c2JfZXh0Y29uX3BtX29wcywKKwkJCSBxY29tX3VzYl9leHRjb25fc3VzcGVuZCwgcWNvbV91c2JfZXh0Y29uX3Jlc3VtZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHFjb21fdXNiX2V4dGNvbl9kdF9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxwbTg5NDEtbWlzYyIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcWNvbV91c2JfZXh0Y29uX2R0X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcWNvbV91c2JfZXh0Y29uX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcWNvbV91c2JfZXh0Y29uX3Byb2JlLAorCS5yZW1vdmUJCT0gcWNvbV91c2JfZXh0Y29uX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiZXh0Y29uLXBtODk0MS1taXNjIiwKKwkJLnBtCT0gJnFjb21fdXNiX2V4dGNvbl9wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IHFjb21fdXNiX2V4dGNvbl9kdF9tYXRjaCwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocWNvbV91c2JfZXh0Y29uX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiUUNPTSBVU0IgSUQgZXh0Y29uIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiU3RlcGhlbiBCb3lkIDxzdGVwaGVuLmJveWRAbGluYXJvLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1ydDg5NzNhLmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tcnQ4OTczYS5jCmluZGV4IDk3ZTA3NGQuLjE3NGMzODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1ydDg5NzNhLmMKKysrIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLXJ0ODk3M2EuYwpAQCAtMzk4LDkgKzM5OCw5IEBACiAJCXJldHVybiByZXQ7CiAKIAkvKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIGV4dGVybmFsIGFjY2Vzc29yeSAqLwotCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIGlkLCBhdHRhY2hlZCk7CisJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIGlkLCBhdHRhY2hlZCk7CiAJaWYgKGlkID09IEVYVENPTl9VU0IpCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKIAkJCQkJYXR0YWNoZWQpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tc201NTAyLmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tc201NTAyLmMKaW5kZXggZGY3NjlhMS4uYjIyMzI1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9leHRjb24vZXh0Y29uLXNtNTUwMi5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1zbTU1MDIuYwpAQCAtNDExLDkgKzQxMSw5IEBACiAJCXJldHVybiByZXQ7CiAKIAkvKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIGV4dGVybmFsIGFjY2Vzc29yeSAqLwotCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIGlkLCBhdHRhY2hlZCk7CisJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIGlkLCBhdHRhY2hlZCk7CiAJaWYgKGlkID09IEVYVENPTl9VU0IpCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKIAkJCQkJYXR0YWNoZWQpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tdXNiLWdwaW8uYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi11c2ItZ3Bpby5jCmluZGV4IDI1MTI2NjAuLmEyN2QzNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi11c2ItZ3Bpby5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi11c2ItZ3Bpby5jCkBAIC02MywxNiArNjMsMTYgQEAKIAkJICogQXMgd2UgZG9uJ3QgaGF2ZSBldmVudCBmb3IgVVNCIHBlcmlwaGVyYWwgY2FibGUgYXR0YWNoZWQsCiAJCSAqIHdlIHNpbXVsYXRlIFVTQiBwZXJpcGhlcmFsIGF0dGFjaCBoZXJlLgogCQkgKi8KLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCBmYWxzZSk7Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsIHRydWUpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCBmYWxzZSk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLCB0cnVlKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBJRCA9IDAgbWVhbnMgVVNCIEhPU1QgY2FibGUgYXR0YWNoZWQuCiAJCSAqIEFzIHdlIGRvbid0IGhhdmUgZXZlbnQgZm9yIFVTQiBwZXJpcGhlcmFsIGNhYmxlIGRldGFjaGVkLAogCQkgKiB3ZSBzaW11bGF0ZSBVU0IgcGVyaXBoZXJhbCBkZXRhY2ggaGVyZS4KIAkJICovCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsIGZhbHNlKTsKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCB0cnVlKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsIGZhbHNlKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0JfSE9TVCwgdHJ1ZSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24uYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi5jCmluZGV4IDg2ODJlZmMuLjc4Mjk4NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi5jCkBAIC0zOCw0MyArMzgsMTU5IEBACiAjZGVmaW5lIFNVUFBPUlRFRF9DQUJMRV9NQVgJMzIKICNkZWZpbmUgQ0FCTEVfTkFNRV9NQVgJCTMwCiAKLXN0YXRpYyBjb25zdCBjaGFyICpleHRjb25fbmFtZVtdID0gIHsKLQlbRVhUQ09OX05PTkVdCQkJPSAiTk9ORSIsCitzdHJ1Y3QgX19leHRjb25faW5mbyB7CisJdW5zaWduZWQgaW50IHR5cGU7CisJdW5zaWduZWQgaW50IGlkOworCWNvbnN0IGNoYXIgKm5hbWU7CisKK30gZXh0Y29uX2luZm9bXSA9IHsKKwlbRVhUQ09OX05PTkVdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX01JU0MsCisJCS5pZCA9IEVYVENPTl9OT05FLAorCQkubmFtZSA9ICJOT05FIiwKKwl9LAogCiAJLyogVVNCIGV4dGVybmFsIGNvbm5lY3RvciAqLwotCVtFWFRDT05fVVNCXQkJCT0gIlVTQiIsCi0JW0VYVENPTl9VU0JfSE9TVF0JCT0gIlVTQi1IT1NUIiwKKwlbRVhUQ09OX1VTQl0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfVVNCLAorCQkuaWQgPSBFWFRDT05fVVNCLAorCQkubmFtZSA9ICJVU0IiLAorCX0sCisJW0VYVENPTl9VU0JfSE9TVF0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfVVNCLAorCQkuaWQgPSBFWFRDT05fVVNCX0hPU1QsCisJCS5uYW1lID0gIlVTQl9IT1NUIiwKKwl9LAogCiAJLyogQ2hhcmdpbmcgZXh0ZXJuYWwgY29ubmVjdG9yICovCi0JW0VYVENPTl9DSEdfVVNCX1NEUF0JCT0gIlNEUCIsCi0JW0VYVENPTl9DSEdfVVNCX0RDUF0JCT0gIkRDUCIsCi0JW0VYVENPTl9DSEdfVVNCX0NEUF0JCT0gIkNEUCIsCi0JW0VYVENPTl9DSEdfVVNCX0FDQV0JCT0gIkFDQSIsCi0JW0VYVENPTl9DSEdfVVNCX0ZBU1RdCQk9ICJGQVNULUNIQVJHRVIiLAotCVtFWFRDT05fQ0hHX1VTQl9TTE9XXQkJPSAiU0xPVy1DSEFSR0VSIiwKKwlbRVhUQ09OX0NIR19VU0JfU0RQXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9DSEcgfCBFWFRDT05fVFlQRV9VU0IsCisJCS5pZCA9IEVYVENPTl9DSEdfVVNCX1NEUCwKKwkJLm5hbWUgPSAiU0RQIiwKKwl9LAorCVtFWFRDT05fQ0hHX1VTQl9EQ1BdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0NIRyB8IEVYVENPTl9UWVBFX1VTQiwKKwkJLmlkID0gRVhUQ09OX0NIR19VU0JfRENQLAorCQkubmFtZSA9ICJEQ1AiLAorCX0sCisJW0VYVENPTl9DSEdfVVNCX0NEUF0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfQ0hHIHwgRVhUQ09OX1RZUEVfVVNCLAorCQkuaWQgPSBFWFRDT05fQ0hHX1VTQl9DRFAsCisJCS5uYW1lID0gIkNEUCIsCisJfSwKKwlbRVhUQ09OX0NIR19VU0JfQUNBXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9DSEcgfCBFWFRDT05fVFlQRV9VU0IsCisJCS5pZCA9IEVYVENPTl9DSEdfVVNCX0FDQSwKKwkJLm5hbWUgPSAiQUNBIiwKKwl9LAorCVtFWFRDT05fQ0hHX1VTQl9GQVNUXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9DSEcgfCBFWFRDT05fVFlQRV9VU0IsCisJCS5pZCA9IEVYVENPTl9DSEdfVVNCX0ZBU1QsCisJCS5uYW1lID0gIkZBU1QtQ0hBUkdFUiIsCisJfSwKKwlbRVhUQ09OX0NIR19VU0JfU0xPV10gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfQ0hHIHwgRVhUQ09OX1RZUEVfVVNCLAorCQkuaWQgPSBFWFRDT05fQ0hHX1VTQl9TTE9XLAorCQkubmFtZSA9ICJTTE9XLUNIQVJHRVIiLAorCX0sCisJW0VYVENPTl9DSEdfV1BUXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9DSEcsCisJCS5pZCA9IEVYVENPTl9DSEdfV1BULAorCQkubmFtZSA9ICJXUFQiLAorCX0sCiAKIAkvKiBKYWNrIGV4dGVybmFsIGNvbm5lY3RvciAqLwotCVtFWFRDT05fSkFDS19NSUNST1BIT05FXQk9ICJNSUNST1BIT05FIiwKLQlbRVhUQ09OX0pBQ0tfSEVBRFBIT05FXQkJPSAiSEVBRFBIT05FIiwKLQlbRVhUQ09OX0pBQ0tfTElORV9JTl0JCT0gIkxJTkUtSU4iLAotCVtFWFRDT05fSkFDS19MSU5FX09VVF0JCT0gIkxJTkUtT1VUIiwKLQlbRVhUQ09OX0pBQ0tfVklERU9fSU5dCQk9ICJWSURFTy1JTiIsCi0JW0VYVENPTl9KQUNLX1ZJREVPX09VVF0JCT0gIlZJREVPLU9VVCIsCi0JW0VYVENPTl9KQUNLX1NQRElGX0lOXQkJPSAiU1BESUYtSU4iLAotCVtFWFRDT05fSkFDS19TUERJRl9PVVRdCQk9ICJTUERJRi1PVVQiLAorCVtFWFRDT05fSkFDS19NSUNST1BIT05FXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9KQUNLLAorCQkuaWQgPSBFWFRDT05fSkFDS19NSUNST1BIT05FLAorCQkubmFtZSA9ICJNSUNST1BIT05FIiwKKwl9LAorCVtFWFRDT05fSkFDS19IRUFEUEhPTkVdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0pBQ0ssCisJCS5pZCA9IEVYVENPTl9KQUNLX0hFQURQSE9ORSwKKwkJLm5hbWUgPSAiSEVBRFBIT05FIiwKKwl9LAorCVtFWFRDT05fSkFDS19MSU5FX0lOXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9KQUNLLAorCQkuaWQgPSBFWFRDT05fSkFDS19MSU5FX0lOLAorCQkubmFtZSA9ICJMSU5FLUlOIiwKKwl9LAorCVtFWFRDT05fSkFDS19MSU5FX09VVF0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfSkFDSywKKwkJLmlkID0gRVhUQ09OX0pBQ0tfTElORV9PVVQsCisJCS5uYW1lID0gIkxJTkUtT1VUIiwKKwl9LAorCVtFWFRDT05fSkFDS19WSURFT19JTl0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfSkFDSywKKwkJLmlkID0gRVhUQ09OX0pBQ0tfVklERU9fSU4sCisJCS5uYW1lID0gIlZJREVPLUlOIiwKKwl9LAorCVtFWFRDT05fSkFDS19WSURFT19PVVRdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0pBQ0ssCisJCS5pZCA9IEVYVENPTl9KQUNLX1ZJREVPX09VVCwKKwkJLm5hbWUgPSAiVklERU8tT1VUIiwKKwl9LAorCVtFWFRDT05fSkFDS19TUERJRl9JTl0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfSkFDSywKKwkJLmlkID0gRVhUQ09OX0pBQ0tfU1BESUZfSU4sCisJCS5uYW1lID0gIlNQRElGLUlOIiwKKwl9LAorCVtFWFRDT05fSkFDS19TUERJRl9PVVRdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0pBQ0ssCisJCS5pZCA9IEVYVENPTl9KQUNLX1NQRElGX09VVCwKKwkJLm5hbWUgPSAiU1BESUYtT1VUIiwKKwl9LAogCiAJLyogRGlzcGxheSBleHRlcm5hbCBjb25uZWN0b3IgKi8KLQlbRVhUQ09OX0RJU1BfSERNSV0JCT0gIkhETUkiLAotCVtFWFRDT05fRElTUF9NSExdCQk9ICJNSEwiLAotCVtFWFRDT05fRElTUF9EVkldCQk9ICJEVkkiLAotCVtFWFRDT05fRElTUF9WR0FdCQk9ICJWR0EiLAorCVtFWFRDT05fRElTUF9IRE1JXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9ESVNQLAorCQkuaWQgPSBFWFRDT05fRElTUF9IRE1JLAorCQkubmFtZSA9ICJIRE1JIiwKKwl9LAorCVtFWFRDT05fRElTUF9NSExdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0RJU1AsCisJCS5pZCA9IEVYVENPTl9ESVNQX01ITCwKKwkJLm5hbWUgPSAiTUhMIiwKKwl9LAorCVtFWFRDT05fRElTUF9EVkldID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0RJU1AsCisJCS5pZCA9IEVYVENPTl9ESVNQX0RWSSwKKwkJLm5hbWUgPSAiRFZJIiwKKwl9LAorCVtFWFRDT05fRElTUF9WR0FdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0RJU1AsCisJCS5pZCA9IEVYVENPTl9ESVNQX1ZHQSwKKwkJLm5hbWUgPSAiVkdBIiwKKwl9LAorCVtFWFRDT05fRElTUF9EUF0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfRElTUCB8IEVYVENPTl9UWVBFX1VTQiwKKwkJLmlkID0gRVhUQ09OX0RJU1BfRFAsCisJCS5uYW1lID0gIkRQIiwKKwl9LAorCVtFWFRDT05fRElTUF9ITURdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0RJU1AgfCBFWFRDT05fVFlQRV9VU0IsCisJCS5pZCA9IEVYVENPTl9ESVNQX0hNRCwKKwkJLm5hbWUgPSAiSE1EIiwKKwl9LAogCiAJLyogTWlzY2VsbGFuZW91cyBleHRlcm5hbCBjb25uZWN0b3IgKi8KLQlbRVhUQ09OX0RPQ0tdCQkJPSAiRE9DSyIsCi0JW0VYVENPTl9KSUddCQkJPSAiSklHIiwKLQlbRVhUQ09OX01FQ0hBTklDQUxdCQk9ICJNRUNIQU5JQ0FMIiwKKwlbRVhUQ09OX0RPQ0tdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX01JU0MsCisJCS5pZCA9IEVYVENPTl9ET0NLLAorCQkubmFtZSA9ICJET0NLIiwKKwl9LAorCVtFWFRDT05fSklHXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9NSVNDLAorCQkuaWQgPSBFWFRDT05fSklHLAorCQkubmFtZSA9ICJKSUciLAorCX0sCisJW0VYVENPTl9NRUNIQU5JQ0FMXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9NSVNDLAorCQkuaWQgPSBFWFRDT05fTUVDSEFOSUNBTCwKKwkJLm5hbWUgPSAiTUVDSEFOSUNBTCIsCisJfSwKIAotCU5VTEwsCisJeyAvKiBzZW50aW5lbCAqLyB9CiB9OwogCiAvKioKQEAgLTk1LDYgKzIxMSwxNiBAQAogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGF0dHJfc3RhdGU7CiAKIAlzdHJ1Y3QgYXR0cmlidXRlICphdHRyc1szXTsgLyogdG8gYmUgZmVkIHRvIGF0dHJfZy5hdHRycyAqLworCisJdW5pb24gZXh0Y29uX3Byb3BlcnR5X3ZhbHVlIHVzYl9wcm9wdmFsW0VYVENPTl9QUk9QX1VTQl9DTlRdOworCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSBjaGdfcHJvcHZhbFtFWFRDT05fUFJPUF9DSEdfQ05UXTsKKwl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUgamFja19wcm9wdmFsW0VYVENPTl9QUk9QX0pBQ0tfQ05UXTsKKwl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUgZGlzcF9wcm9wdmFsW0VYVENPTl9QUk9QX0RJU1BfQ05UXTsKKworCXVuc2lnbmVkIGxvbmcgdXNiX2JpdHNbQklUU19UT19MT05HUyhFWFRDT05fUFJPUF9VU0JfQ05UKV07CisJdW5zaWduZWQgbG9uZyBjaGdfYml0c1tCSVRTX1RPX0xPTkdTKEVYVENPTl9QUk9QX0NIR19DTlQpXTsKKwl1bnNpZ25lZCBsb25nIGphY2tfYml0c1tCSVRTX1RPX0xPTkdTKEVYVENPTl9QUk9QX0pBQ0tfQ05UKV07CisJdW5zaWduZWQgbG9uZyBkaXNwX2JpdHNbQklUU19UT19MT05HUyhFWFRDT05fUFJPUF9ESVNQX0NOVCldOwogfTsKIAogc3RhdGljIHN0cnVjdCBjbGFzcyAqZXh0Y29uX2NsYXNzOwpAQCAtMTQ3LDE0ICsyNzMsOTMgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGJvb2wgaXNfZXh0Y29uX2NoYW5nZWQodTMyIHByZXYsIHUzMiBuZXcsIGludCBpZHgsIGJvb2wgKmF0dGFjaGVkKQorc3RhdGljIGludCBnZXRfZXh0Y29uX3R5cGUodW5zaWduZWQgaW50IHByb3ApCiB7Ci0JaWYgKCgocHJldiA+PiBpZHgpICYgMHgxKSAhPSAoKG5ldyA+PiBpZHgpICYgMHgxKSkgewotCQkqYXR0YWNoZWQgPSAoKG5ldyA+PiBpZHgpICYgMHgxKSA/IHRydWUgOiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7CisJc3dpdGNoIChwcm9wKSB7CisJY2FzZSBFWFRDT05fUFJPUF9VU0JfTUlOIC4uLiBFWFRDT05fUFJPUF9VU0JfTUFYOgorCQlyZXR1cm4gRVhUQ09OX1RZUEVfVVNCOworCWNhc2UgRVhUQ09OX1BST1BfQ0hHX01JTiAuLi4gRVhUQ09OX1BST1BfQ0hHX01BWDoKKwkJcmV0dXJuIEVYVENPTl9UWVBFX0NIRzsKKwljYXNlIEVYVENPTl9QUk9QX0pBQ0tfTUlOIC4uLiBFWFRDT05fUFJPUF9KQUNLX01BWDoKKwkJcmV0dXJuIEVYVENPTl9UWVBFX0pBQ0s7CisJY2FzZSBFWFRDT05fUFJPUF9ESVNQX01JTiAuLi4gRVhUQ09OX1BST1BfRElTUF9NQVg6CisJCXJldHVybiBFWFRDT05fVFlQRV9ESVNQOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGJvb2wgaXNfZXh0Y29uX2F0dGFjaGVkKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJcmV0dXJuICEhKGVkZXYtPnN0YXRlICYgQklUKGluZGV4KSk7Cit9CisKK3N0YXRpYyBib29sIGlzX2V4dGNvbl9jaGFuZ2VkKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCBpbnQgaW5kZXgsCisJCQkJYm9vbCBuZXdfc3RhdGUpCit7CisJaW50IHN0YXRlID0gISEoZWRldi0+c3RhdGUgJiBCSVQoaW5kZXgpKTsKKwlyZXR1cm4gKHN0YXRlICE9IG5ld19zdGF0ZSk7Cit9CisKK3N0YXRpYyBib29sIGlzX2V4dGNvbl9wcm9wZXJ0eV9zdXBwb3J0ZWQodW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBpbnQgcHJvcCkKK3sKKwlpbnQgdHlwZTsKKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZCBvciBub3QuICovCisJdHlwZSA9IGdldF9leHRjb25fdHlwZShwcm9wKTsKKwlpZiAodHlwZSA8IDApCisJCXJldHVybiBmYWxzZTsKKworCS8qIENoZWNrIHdoZXRoZXIgYSBzcGVjaWZpYyBleHRjb24gaWQgc3VwcG9ydHMgdGhlIHByb3BlcnR5IG9yIG5vdC4gKi8KKwlyZXR1cm4gISEoZXh0Y29uX2luZm9baWRdLnR5cGUgJiB0eXBlKTsKK30KKworc3RhdGljIGludCBpc19leHRjb25fcHJvcGVydHlfY2FwYWJpbGl0eShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwKKwkJCQl1bnNpZ25lZCBpbnQgaWQsIGludCBpbmRleCx1bnNpZ25lZCBpbnQgcHJvcCkKK3sKKwlzdHJ1Y3QgZXh0Y29uX2NhYmxlICpjYWJsZTsKKwlpbnQgdHlwZSwgcmV0OworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkIG9yIG5vdC4gKi8KKwl0eXBlID0gZ2V0X2V4dGNvbl90eXBlKHByb3ApOworCWlmICh0eXBlIDwgMCkKKwkJcmV0dXJuIHR5cGU7CisKKwljYWJsZSA9ICZlZGV2LT5jYWJsZXNbaW5kZXhdOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBFWFRDT05fVFlQRV9VU0I6CisJCXJldCA9IHRlc3RfYml0KHByb3AgLSBFWFRDT05fUFJPUF9VU0JfTUlOLCBjYWJsZS0+dXNiX2JpdHMpOworCQlicmVhazsKKwljYXNlIEVYVENPTl9UWVBFX0NIRzoKKwkJcmV0ID0gdGVzdF9iaXQocHJvcCAtIEVYVENPTl9QUk9QX0NIR19NSU4sIGNhYmxlLT5jaGdfYml0cyk7CisJCWJyZWFrOworCWNhc2UgRVhUQ09OX1RZUEVfSkFDSzoKKwkJcmV0ID0gdGVzdF9iaXQocHJvcCAtIEVYVENPTl9QUk9QX0pBQ0tfTUlOLCBjYWJsZS0+amFja19iaXRzKTsKKwkJYnJlYWs7CisJY2FzZSBFWFRDT05fVFlQRV9ESVNQOgorCQlyZXQgPSB0ZXN0X2JpdChwcm9wIC0gRVhUQ09OX1BST1BfRElTUF9NSU4sIGNhYmxlLT5kaXNwX2JpdHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOwogCX0KIAotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpbml0X3Byb3BlcnR5KHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsIGludCBpbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQgdHlwZSA9IGV4dGNvbl9pbmZvW2lkXS50eXBlOworCXN0cnVjdCBleHRjb25fY2FibGUgKmNhYmxlID0gJmVkZXYtPmNhYmxlc1tpbmRleF07CisKKwlpZiAoRVhUQ09OX1RZUEVfVVNCICYgdHlwZSkKKwkJbWVtc2V0KGNhYmxlLT51c2JfcHJvcHZhbCwgMCwgc2l6ZW9mKGNhYmxlLT51c2JfcHJvcHZhbCkpOworCWlmIChFWFRDT05fVFlQRV9DSEcgJiB0eXBlKQorCQltZW1zZXQoY2FibGUtPmNoZ19wcm9wdmFsLCAwLCBzaXplb2YoY2FibGUtPmNoZ19wcm9wdmFsKSk7CisJaWYgKEVYVENPTl9UWVBFX0pBQ0sgJiB0eXBlKQorCQltZW1zZXQoY2FibGUtPmphY2tfcHJvcHZhbCwgMCwgc2l6ZW9mKGNhYmxlLT5qYWNrX3Byb3B2YWwpKTsKKwlpZiAoRVhUQ09OX1RZUEVfRElTUCAmIHR5cGUpCisJCW1lbXNldChjYWJsZS0+ZGlzcF9wcm9wdmFsLCAwLCBzaXplb2YoY2FibGUtPmRpc3BfcHJvcHZhbCkpOwogfQogCiBzdGF0aWMgc3NpemVfdCBzdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCkBAIC0xNjgsMzIgKzM3MywxMyBAQAogCiAJZm9yIChpID0gMDsgaSA8IGVkZXYtPm1heF9zdXBwb3J0ZWQ7IGkrKykgewogCQljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAiJXM9JWRcbiIsCi0JCQkJZXh0Y29uX25hbWVbZWRldi0+c3VwcG9ydGVkX2NhYmxlW2ldXSwKKwkJCQlleHRjb25faW5mb1tlZGV2LT5zdXBwb3J0ZWRfY2FibGVbaV1dLm5hbWUsCiAJCQkJICEhKGVkZXYtPnN0YXRlICYgKDEgPDwgaSkpKTsKIAl9CiAKIAlyZXR1cm4gY291bnQ7CiB9Ci0KLXN0YXRpYyBzc2l6ZV90IHN0YXRlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQl1MzIgc3RhdGU7Ci0Jc3NpemVfdCByZXQgPSAwOwotCXN0cnVjdCBleHRjb25fZGV2ICplZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlyZXQgPSBzc2NhbmYoYnVmLCAiMHgleCIsICZzdGF0ZSk7Ci0JaWYgKHJldCA9PSAwKQotCQlyZXQgPSAtRUlOVkFMOwotCWVsc2UKLQkJcmV0ID0gZXh0Y29uX3NldF9zdGF0ZShlZGV2LCBzdGF0ZSk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUl9SVyhzdGF0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8oc3RhdGUpOwogCiBzdGF0aWMgc3NpemVfdCBuYW1lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJY2hhciAqYnVmKQpAQCAtMjEyLDcgKzM5OCw3IEBACiAJaW50IGkgPSBjYWJsZS0+Y2FibGVfaW5kZXg7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwKLQkJCWV4dGNvbl9uYW1lW2NhYmxlLT5lZGV2LT5zdXBwb3J0ZWRfY2FibGVbaV1dKTsKKwkJCWV4dGNvbl9pbmZvW2NhYmxlLT5lZGV2LT5zdXBwb3J0ZWRfY2FibGVbaV1dLm5hbWUpOwogfQogCiBzdGF0aWMgc3NpemVfdCBjYWJsZV9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTIyNCwyNiArNDEwLDE3IEBACiAJaW50IGkgPSBjYWJsZS0+Y2FibGVfaW5kZXg7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKLQkJICAgICAgIGV4dGNvbl9nZXRfY2FibGVfc3RhdGVfKGNhYmxlLT5lZGV2LAotCQkJCQkgICAgICAgY2FibGUtPmVkZXYtPnN1cHBvcnRlZF9jYWJsZVtpXSkpOworCQlleHRjb25fZ2V0X3N0YXRlKGNhYmxlLT5lZGV2LCBjYWJsZS0+ZWRldi0+c3VwcG9ydGVkX2NhYmxlW2ldKSk7CiB9CiAKIC8qKgotICogZXh0Y29uX3VwZGF0ZV9zdGF0ZSgpIC0gVXBkYXRlIHRoZSBjYWJsZSBhdHRhY2ggc3RhdGVzIG9mIHRoZSBleHRjb24gZGV2aWNlCi0gKgkJCSAgIG9ubHkgZm9yIHRoZSBtYXNrZWQgYml0cy4KLSAqIEBlZGV2Ogl0aGUgZXh0Y29uIGRldmljZQotICogQG1hc2s6CXRoZSBiaXQgbWFzayB0byBkZXNpZ25hdGUgdXBkYXRlZCBiaXRzLgotICogQHN0YXRlOgluZXcgY2FibGUgYXR0YWNoIHN0YXR1cyBmb3IgQGVkZXYKKyAqIGV4dGNvbl9zeW5jKCkJLSBTeW5jaHJvbml6ZSB0aGUgc3RhdGVzIGZvciBib3RoIHRoZSBhdHRhY2hlZC9kZXRhY2hlZAorICogQGVkZXY6CQl0aGUgZXh0Y29uIGRldmljZSB0aGF0IGhhcyB0aGUgY2FibGUuCiAgKgotICogQ2hhbmdpbmcgdGhlIHN0YXRlIHNlbmRzIHVldmVudCB3aXRoIGVudmlyb25tZW50IHZhcmlhYmxlIGNvbnRhaW5pbmcKLSAqIHRoZSBuYW1lIG9mIGV4dGNvbiBkZXZpY2UgKGVudnBbMF0pIGFuZCB0aGUgc3RhdGUgb3V0cHV0IChlbnZwWzFdKS4KLSAqIFRpemVuIHVzZXMgdGhpcyBmb3JtYXQgZm9yIGV4dGNvbiBkZXZpY2UgdG8gZ2V0IGV2ZW50cyBmcm9tIHBvcnRzLgotICogQW5kcm9pZCB1c2VzIHRoaXMgZm9ybWF0IGFzIHdlbGwuCi0gKgotICogTm90ZSB0aGF0IHRoZSBub3RpZmllciBwcm92aWRlcyB3aGljaCBiaXRzIGFyZSBjaGFuZ2VkIGluIHRoZSBzdGF0ZQotICogdmFyaWFibGUgd2l0aCB0aGUgdmFsIHBhcmFtZXRlciAoc2Vjb25kKSB0byB0aGUgY2FsbGJhY2suCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmQgYSBub3RpZmljYXRpb24gdG8gc3luY2hyb25pemUgdGhlIGFsbCBzdGF0ZXMgb2YgYQorICogc3BlY2lmaWMgZXh0ZXJuYWwgY29ubmVjdG9yCiAgKi8KLWludCBleHRjb25fdXBkYXRlX3N0YXRlKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1MzIgbWFzaywgdTMyIHN0YXRlKQoraW50IGV4dGNvbl9zeW5jKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQpCiB7CiAJY2hhciBuYW1lX2J1ZlsxMjBdOwogCWNoYXIgc3RhdGVfYnVmWzEyMF07CkBAIC0yNTIsMTAwICs0MjksOCBAQAogCWludCBlbnZfb2Zmc2V0ID0gMDsKIAlpbnQgbGVuZ3RoOwogCWludCBpbmRleDsKKwlpbnQgc3RhdGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlib29sIGF0dGFjaGVkOwotCi0JaWYgKCFlZGV2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZlZGV2LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoZWRldi0+c3RhdGUgIT0gKChlZGV2LT5zdGF0ZSAmIH5tYXNrKSB8IChzdGF0ZSAmIG1hc2spKSkgewotCQl1MzIgb2xkX3N0YXRlOwotCi0JCWlmIChjaGVja19tdXR1YWxseV9leGNsdXNpdmUoZWRldiwgKGVkZXYtPnN0YXRlICYgfm1hc2spIHwKLQkJCQkJCSAgIChzdGF0ZSAmIG1hc2spKSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRldi0+bG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuIC1FUEVSTTsKLQkJfQotCi0JCW9sZF9zdGF0ZSA9IGVkZXYtPnN0YXRlOwotCQllZGV2LT5zdGF0ZSAmPSB+bWFzazsKLQkJZWRldi0+c3RhdGUgfD0gc3RhdGUgJiBtYXNrOwotCi0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGVkZXYtPm1heF9zdXBwb3J0ZWQ7IGluZGV4KyspIHsKLQkJCWlmIChpc19leHRjb25fY2hhbmdlZChvbGRfc3RhdGUsIGVkZXYtPnN0YXRlLCBpbmRleCwKLQkJCQkJICAgICAgJmF0dGFjaGVkKSkKLQkJCQlyYXdfbm90aWZpZXJfY2FsbF9jaGFpbigmZWRldi0+bmhbaW5kZXhdLAotCQkJCQkJCWF0dGFjaGVkLCBlZGV2KTsKLQkJfQotCi0JCS8qIFRoaXMgY291bGQgYmUgaW4gaW50ZXJydXB0IGhhbmRsZXIgKi8KLQkJcHJvcF9idWYgPSAoY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfQVRPTUlDKTsKLQkJaWYgKHByb3BfYnVmKSB7Ci0JCQlsZW5ndGggPSBuYW1lX3Nob3coJmVkZXYtPmRldiwgTlVMTCwgcHJvcF9idWYpOwotCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQlpZiAocHJvcF9idWZbbGVuZ3RoIC0gMV0gPT0gJ1xuJykKLQkJCQkJcHJvcF9idWZbbGVuZ3RoIC0gMV0gPSAwOwotCQkJCXNucHJpbnRmKG5hbWVfYnVmLCBzaXplb2YobmFtZV9idWYpLAotCQkJCQkiTkFNRT0lcyIsIHByb3BfYnVmKTsKLQkJCQllbnZwW2Vudl9vZmZzZXQrK10gPSBuYW1lX2J1ZjsKLQkJCX0KLQkJCWxlbmd0aCA9IHN0YXRlX3Nob3coJmVkZXYtPmRldiwgTlVMTCwgcHJvcF9idWYpOwotCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQlpZiAocHJvcF9idWZbbGVuZ3RoIC0gMV0gPT0gJ1xuJykKLQkJCQkJcHJvcF9idWZbbGVuZ3RoIC0gMV0gPSAwOwotCQkJCXNucHJpbnRmKHN0YXRlX2J1Ziwgc2l6ZW9mKHN0YXRlX2J1ZiksCi0JCQkJCSJTVEFURT0lcyIsIHByb3BfYnVmKTsKLQkJCQllbnZwW2Vudl9vZmZzZXQrK10gPSBzdGF0ZV9idWY7Ci0JCQl9Ci0JCQllbnZwW2Vudl9vZmZzZXRdID0gTlVMTDsKLQkJCS8qIFVubG9jayBlYXJseSBiZWZvcmUgdWV2ZW50ICovCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGV2LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWtvYmplY3RfdWV2ZW50X2VudigmZWRldi0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFLCBlbnZwKTsKLQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwcm9wX2J1Zik7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBVbmxvY2sgZWFybHkgYmVmb3JlIHVldmVudCAqLwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRldi0+bG9jaywgZmxhZ3MpOwotCi0JCQlkZXZfZXJyKCZlZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5IGluIGV4dGNvbl9zZXRfc3RhdGVcbiIpOwotCQkJa29iamVjdF91ZXZlbnQoJmVkZXYtPmRldi5rb2JqLCBLT0JKX0NIQU5HRSk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBObyBjaGFuZ2VzICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGV4dGNvbl91cGRhdGVfc3RhdGUpOwotCi0vKioKLSAqIGV4dGNvbl9zZXRfc3RhdGUoKSAtIFNldCB0aGUgY2FibGUgYXR0YWNoIHN0YXRlcyBvZiB0aGUgZXh0Y29uIGRldmljZS4KLSAqIEBlZGV2Ogl0aGUgZXh0Y29uIGRldmljZQotICogQHN0YXRlOgluZXcgY2FibGUgYXR0YWNoIHN0YXR1cyBmb3IgQGVkZXYKLSAqCi0gKiBOb3RlIHRoYXQgbm90aWZpZXIgcHJvdmlkZXMgd2hpY2ggYml0cyBhcmUgY2hhbmdlZCBpbiB0aGUgc3RhdGUKLSAqIHZhcmlhYmxlIHdpdGggdGhlIHZhbCBwYXJhbWV0ZXIgKHNlY29uZCkgdG8gdGhlIGNhbGxiYWNrLgotICovCi1pbnQgZXh0Y29uX3NldF9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdTMyIHN0YXRlKQotewotCWlmICghZWRldikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gZXh0Y29uX3VwZGF0ZV9zdGF0ZShlZGV2LCAweGZmZmZmZmZmLCBzdGF0ZSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChleHRjb25fc2V0X3N0YXRlKTsKLQotLyoqCi0gKiBleHRjb25fZ2V0X2NhYmxlX3N0YXRlXygpIC0gR2V0IHRoZSBzdGF0dXMgb2YgYSBzcGVjaWZpYyBjYWJsZS4KLSAqIEBlZGV2Ogl0aGUgZXh0Y29uIGRldmljZSB0aGF0IGhhcyB0aGUgY2FibGUuCi0gKiBAaWQ6CQl0aGUgdW5pcXVlIGlkIG9mIGVhY2ggZXh0ZXJuYWwgY29ubmVjdG9yIGluIGV4dGNvbiBlbnVtZXJhdGlvbi4KLSAqLwotaW50IGV4dGNvbl9nZXRfY2FibGVfc3RhdGVfKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCBjb25zdCB1bnNpZ25lZCBpbnQgaWQpCi17Ci0JaW50IGluZGV4OwogCiAJaWYgKCFlZGV2KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM1NCwyNiArNDM5LDkyIEBACiAJaWYgKGluZGV4IDwgMCkKIAkJcmV0dXJuIGluZGV4OwogCi0JaWYgKGVkZXYtPm1heF9zdXBwb3J0ZWQgJiYgZWRldi0+bWF4X3N1cHBvcnRlZCA8PSBpbmRleCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKIAotCXJldHVybiAhIShlZGV2LT5zdGF0ZSAmICgxIDw8IGluZGV4KSk7CisJc3RhdGUgPSAhIShlZGV2LT5zdGF0ZSAmIEJJVChpbmRleCkpOworCXJhd19ub3RpZmllcl9jYWxsX2NoYWluKCZlZGV2LT5uaFtpbmRleF0sIHN0YXRlLCBlZGV2KTsKKworCS8qIFRoaXMgY291bGQgYmUgaW4gaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlwcm9wX2J1ZiA9IChjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOworCWlmICghcHJvcF9idWYpIHsKKwkJLyogVW5sb2NrIGVhcmx5IGJlZm9yZSB1ZXZlbnQgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRldi0+bG9jaywgZmxhZ3MpOworCisJCWRldl9lcnIoJmVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnkgaW4gZXh0Y29uX3NldF9zdGF0ZVxuIik7CisJCWtvYmplY3RfdWV2ZW50KCZlZGV2LT5kZXYua29iaiwgS09CSl9DSEFOR0UpOworCisJCXJldHVybiAwOworCX0KKworCWxlbmd0aCA9IG5hbWVfc2hvdygmZWRldi0+ZGV2LCBOVUxMLCBwcm9wX2J1Zik7CisJaWYgKGxlbmd0aCA+IDApIHsKKwkJaWYgKHByb3BfYnVmW2xlbmd0aCAtIDFdID09ICdcbicpCisJCQlwcm9wX2J1ZltsZW5ndGggLSAxXSA9IDA7CisJCXNucHJpbnRmKG5hbWVfYnVmLCBzaXplb2YobmFtZV9idWYpLCAiTkFNRT0lcyIsIHByb3BfYnVmKTsKKwkJZW52cFtlbnZfb2Zmc2V0KytdID0gbmFtZV9idWY7CisJfQorCisJbGVuZ3RoID0gc3RhdGVfc2hvdygmZWRldi0+ZGV2LCBOVUxMLCBwcm9wX2J1Zik7CisJaWYgKGxlbmd0aCA+IDApIHsKKwkJaWYgKHByb3BfYnVmW2xlbmd0aCAtIDFdID09ICdcbicpCisJCQlwcm9wX2J1ZltsZW5ndGggLSAxXSA9IDA7CisJCXNucHJpbnRmKHN0YXRlX2J1Ziwgc2l6ZW9mKHN0YXRlX2J1ZiksICJTVEFURT0lcyIsIHByb3BfYnVmKTsKKwkJZW52cFtlbnZfb2Zmc2V0KytdID0gc3RhdGVfYnVmOworCX0KKwllbnZwW2Vudl9vZmZzZXRdID0gTlVMTDsKKworCS8qIFVubG9jayBlYXJseSBiZWZvcmUgdWV2ZW50ICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRldi0+bG9jaywgZmxhZ3MpOworCWtvYmplY3RfdWV2ZW50X2VudigmZWRldi0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFLCBlbnZwKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcHJvcF9idWYpOworCisJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChleHRjb25fZ2V0X2NhYmxlX3N0YXRlXyk7CitFWFBPUlRfU1lNQk9MX0dQTChleHRjb25fc3luYyk7CiAKIC8qKgotICogZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oKSAtIFNldCB0aGUgc3RhdHVzIG9mIGEgc3BlY2lmaWMgY2FibGUuCisgKiBleHRjb25fZ2V0X3N0YXRlKCkgLSBHZXQgdGhlIHN0YXRlIG9mIGEgZXh0ZXJuYWwgY29ubmVjdG9yLgorICogQGVkZXY6CXRoZSBleHRjb24gZGV2aWNlIHRoYXQgaGFzIHRoZSBjYWJsZS4KKyAqIEBpZDoJCXRoZSB1bmlxdWUgaWQgb2YgZWFjaCBleHRlcm5hbCBjb25uZWN0b3IgaW4gZXh0Y29uIGVudW1lcmF0aW9uLgorICovCitpbnQgZXh0Y29uX2dldF9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgY29uc3QgdW5zaWduZWQgaW50IGlkKQoreworCWludCBpbmRleCwgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghZWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpbmRleCA9IGZpbmRfY2FibGVfaW5kZXhfYnlfaWQoZWRldiwgaWQpOworCWlmIChpbmRleCA8IDApCisJCXJldHVybiBpbmRleDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlZGV2LT5sb2NrLCBmbGFncyk7CisJc3RhdGUgPSBpc19leHRjb25fYXR0YWNoZWQoZWRldiwgaW5kZXgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBzdGF0ZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGV4dGNvbl9nZXRfc3RhdGUpOworCisvKioKKyAqIGV4dGNvbl9zZXRfc3RhdGUoKSAtIFNldCB0aGUgc3RhdGUgb2YgYSBleHRlcm5hbCBjb25uZWN0b3IuCisgKgkJCXdpdGhvdXQgYSBub3RpZmljYXRpb24uCiAgKiBAZWRldjoJCXRoZSBleHRjb24gZGV2aWNlIHRoYXQgaGFzIHRoZSBjYWJsZS4KICAqIEBpZDoJCQl0aGUgdW5pcXVlIGlkIG9mIGVhY2ggZXh0ZXJuYWwgY29ubmVjdG9yCiAgKgkJCWluIGV4dGNvbiBlbnVtZXJhdGlvbi4KICAqIEBzdGF0ZToJCXRoZSBuZXcgY2FibGUgc3RhdHVzLiBUaGUgZGVmYXVsdCBzZW1hbnRpY3MgaXMKICAqCQkJdHJ1ZTogYXR0YWNoZWQgLyBmYWxzZTogZGV0YWNoZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBvbmx5IHNldCB0aGUgc3RhdGUgb2YgYSBleHRlcm5hbCBjb25uZWN0b3Igd2l0aG91dAorICogYSBub3RpZmljYXRpb24uIFRvIHN5bmNocm9uaXplIHRoZSBkYXRhIG9mIGEgZXh0ZXJuYWwgY29ubmVjdG9yLAorICogdXNlIGV4dGNvbl9zZXRfc3RhdGVfc3luYygpIGFuZCBleHRjb25fc3luYygpLgogICovCi1pbnQgZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCwKK2ludCBleHRjb25fc2V0X3N0YXRlKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsCiAJCQkJYm9vbCBjYWJsZV9zdGF0ZSkKIHsKLQl1MzIgc3RhdGU7Ci0JaW50IGluZGV4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGluZGV4LCByZXQgPSAwOwogCiAJaWYgKCFlZGV2KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM4MiwxMyArNTMzLDMzOCBAQAogCWlmIChpbmRleCA8IDApCiAJCXJldHVybiBpbmRleDsKIAotCWlmIChlZGV2LT5tYXhfc3VwcG9ydGVkICYmIGVkZXYtPm1heF9zdXBwb3J0ZWQgPD0gaW5kZXgpCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIGV4dGVybmFsIGNvbm5lY3RvcidzIHN0YXRlIGlzIGNoYW5nZWQuICovCisJaWYgKCFpc19leHRjb25fY2hhbmdlZChlZGV2LCBpbmRleCwgY2FibGVfc3RhdGUpKQorCQlnb3RvIG91dDsKKworCWlmIChjaGVja19tdXR1YWxseV9leGNsdXNpdmUoZWRldiwKKwkJKGVkZXYtPnN0YXRlICYgfkJJVChpbmRleCkpIHwgKGNhYmxlX3N0YXRlICYgQklUKGluZGV4KSkpKSB7CisJCXJldCA9IC1FUEVSTTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSB2YWx1ZSBvZiBleHRjb24gcHJvcGVydHkgYmVmb3JlIHNldHRpbmcKKwkgKiB0aGUgZGV0YWNoZWQgc3RhdGUgZm9yIGFuIGV4dGVybmFsIGNvbm5lY3Rvci4KKwkgKi8KKwlpZiAoIWNhYmxlX3N0YXRlKQorCQlpbml0X3Byb3BlcnR5KGVkZXYsIGlkLCBpbmRleCk7CisKKwkvKiBVcGRhdGUgdGhlIHN0YXRlIGZvciBhIGV4dGVybmFsIGNvbm5lY3Rvci4gKi8KKwlpZiAoY2FibGVfc3RhdGUpCisJCWVkZXYtPnN0YXRlIHw9IEJJVChpbmRleCk7CisJZWxzZQorCQllZGV2LT5zdGF0ZSAmPSB+KEJJVChpbmRleCkpOworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChleHRjb25fc2V0X3N0YXRlKTsKKworLyoqCisgKiBleHRjb25fc2V0X3N0YXRlX3N5bmMoKSAtIFNldCB0aGUgc3RhdGUgb2YgYSBleHRlcm5hbCBjb25uZWN0b3IKKyAqCQkJd2l0aCBhIG5vdGlmaWNhdGlvbi4KKyAqIEBlZGV2OgkJdGhlIGV4dGNvbiBkZXZpY2UgdGhhdCBoYXMgdGhlIGNhYmxlLgorICogQGlkOgkJCXRoZSB1bmlxdWUgaWQgb2YgZWFjaCBleHRlcm5hbCBjb25uZWN0b3IKKyAqCQkJaW4gZXh0Y29uIGVudW1lcmF0aW9uLgorICogQHN0YXRlOgkJdGhlIG5ldyBjYWJsZSBzdGF0dXMuIFRoZSBkZWZhdWx0IHNlbWFudGljcyBpcworICoJCQl0cnVlOiBhdHRhY2hlZCAvIGZhbHNlOiBkZXRhY2hlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldCB0aGUgc3RhdGUgb2YgZXh0ZXJuYWwgY29ubmVjdG9yIGFuZCBzeW5jaHJvbml6ZSB0aGUgZGF0YQorICogYnkgdXNuaW5nIGEgbm90aWZpY2F0aW9uLgorICovCitpbnQgZXh0Y29uX3NldF9zdGF0ZV9zeW5jKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsCisJCQkJYm9vbCBjYWJsZV9zdGF0ZSkKK3sKKwlpbnQgcmV0LCBpbmRleDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaW5kZXggPSBmaW5kX2NhYmxlX2luZGV4X2J5X2lkKGVkZXYsIGlkKTsKKwlpZiAoaW5kZXggPCAwKQorCQlyZXR1cm4gaW5kZXg7CisKKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBleHRlcm5hbCBjb25uZWN0b3IncyBzdGF0ZSBpcyBjaGFuZ2VkLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZlZGV2LT5sb2NrLCBmbGFncyk7CisJcmV0ID0gaXNfZXh0Y29uX2NoYW5nZWQoZWRldiwgaW5kZXgsIGNhYmxlX3N0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGV2LT5sb2NrLCBmbGFncyk7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCisJcmV0ID0gZXh0Y29uX3NldF9zdGF0ZShlZGV2LCBpZCwgY2FibGVfc3RhdGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGV4dGNvbl9zeW5jKGVkZXYsIGlkKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGV4dGNvbl9zZXRfc3RhdGVfc3luYyk7CisKKy8qKgorICogZXh0Y29uX2dldF9wcm9wZXJ0eSgpIC0gR2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiBhIHNwZWNpZmljIGNhYmxlLgorICogQGVkZXY6CQl0aGUgZXh0Y29uIGRldmljZSB0aGF0IGhhcyB0aGUgY2FibGUuCisgKiBAaWQ6CQkJdGhlIHVuaXF1ZSBpZCBvZiBlYWNoIGV4dGVybmFsIGNvbm5lY3RvcgorICoJCQlpbiBleHRjb24gZW51bWVyYXRpb24uCisgKiBAcHJvcDoJCXRoZSBwcm9wZXJ0eSBpZCBhbW9uZyBlbnVtIGV4dGNvbl9wcm9wZXJ0eS4KKyAqIEBwcm9wX3ZhbDoJCXRoZSBwb2ludGVyIHdoaWNoIHN0b3JlIHRoZSB2YWx1ZSBvZiBwcm9wZXJ0eS4KKyAqCisgKiBXaGVuIGdldHRpbmcgdGhlIHByb3BlcnR5IHZhbHVlIG9mIGV4dGVybmFsIGNvbm5lY3RvciwgdGhlIGV4dGVybmFsIGNvbm5lY3RvcgorICogc2hvdWxkIGJlIGF0dGFjaGVkLiBJZiBkZXRhY2hlZCBzdGF0ZSwgZnVuY3Rpb24ganVzdCByZXR1cm4gMCB3aXRob3V0CisgKiBwcm9wZXJ0eSB2YWx1ZS4gQWxzbywgdGhlIGVhY2ggcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mCisgKiBzdXBwb3J0ZWQgcHJvcGVydGllcyBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgZXh0ZXJuYWwgY29ubmVjdG9ycy4KKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2VzcyBvciBlcnJvciBudW1iZXIgaWYgZmFpbAorICovCitpbnQgZXh0Y29uX2dldF9wcm9wZXJ0eShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCXVuc2lnbmVkIGludCBwcm9wLAorCQkJCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSAqcHJvcF92YWwpCit7CisJc3RydWN0IGV4dGNvbl9jYWJsZSAqY2FibGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaW5kZXgsIHJldCA9IDA7CisKKwkqcHJvcF92YWwgPSAodW5pb24gZXh0Y29uX3Byb3BlcnR5X3ZhbHVlKSgwKTsKKworCWlmICghZWRldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzdGF0ZSA9IGNhYmxlX3N0YXRlID8gKDEgPDwgaW5kZXgpIDogMDsKLQlyZXR1cm4gZXh0Y29uX3VwZGF0ZV9zdGF0ZShlZGV2LCAxIDw8IGluZGV4LCBzdGF0ZSk7CisJLyogQ2hlY2sgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkIG9yIG5vdCAqLworCWlmICghaXNfZXh0Y29uX3Byb3BlcnR5X3N1cHBvcnRlZChpZCwgcHJvcCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRmluZCB0aGUgY2FibGUgaW5kZXggb2YgZXh0ZXJuYWwgY29ubmVjdG9yIGJ5IHVzaW5nIGlkICovCisJaW5kZXggPSBmaW5kX2NhYmxlX2luZGV4X2J5X2lkKGVkZXYsIGlkKTsKKwlpZiAoaW5kZXggPCAwKQorCQlyZXR1cm4gaW5kZXg7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWRldi0+bG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgYXZhaWxhYmxlIG9yIG5vdC4gKi8KKwlpZiAoIWlzX2V4dGNvbl9wcm9wZXJ0eV9jYXBhYmlsaXR5KGVkZXYsIGlkLCBpbmRleCwgcHJvcCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRldi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCS8qCisJICogQ2hlY2sgd2hldGhlciB0aGUgZXh0ZXJuYWwgY29ubmVjdG9yIGlzIGF0dGFjaGVkLgorCSAqIElmIGV4dGVybmFsIGNvbm5lY3RvciBpcyBkZXRhY2hlZCwgdGhlIHVzZXIgY2FuIG5vdAorCSAqIGdldCB0aGUgcHJvcGVydHkgdmFsdWUuCisJICovCisJaWYgKCFpc19leHRjb25fYXR0YWNoZWQoZWRldiwgaW5kZXgpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FibGUgPSAmZWRldi0+Y2FibGVzW2luZGV4XTsKKworCS8qIEdldCB0aGUgcHJvcGVydHkgdmFsdWUgYWNjb3JkaW5nIHRvIGV4dGNvbiB0eXBlICovCisJc3dpdGNoIChwcm9wKSB7CisJY2FzZSBFWFRDT05fUFJPUF9VU0JfTUlOIC4uLiBFWFRDT05fUFJPUF9VU0JfTUFYOgorCQkqcHJvcF92YWwgPSBjYWJsZS0+dXNiX3Byb3B2YWxbcHJvcCAtIEVYVENPTl9QUk9QX1VTQl9NSU5dOworCQlicmVhazsKKwljYXNlIEVYVENPTl9QUk9QX0NIR19NSU4gLi4uIEVYVENPTl9QUk9QX0NIR19NQVg6CisJCSpwcm9wX3ZhbCA9IGNhYmxlLT5jaGdfcHJvcHZhbFtwcm9wIC0gRVhUQ09OX1BST1BfQ0hHX01JTl07CisJCWJyZWFrOworCWNhc2UgRVhUQ09OX1BST1BfSkFDS19NSU4gLi4uIEVYVENPTl9QUk9QX0pBQ0tfTUFYOgorCQkqcHJvcF92YWwgPSBjYWJsZS0+amFja19wcm9wdmFsW3Byb3AgLSBFWFRDT05fUFJPUF9KQUNLX01JTl07CisJCWJyZWFrOworCWNhc2UgRVhUQ09OX1BST1BfRElTUF9NSU4gLi4uIEVYVENPTl9QUk9QX0RJU1BfTUFYOgorCQkqcHJvcF92YWwgPSBjYWJsZS0+ZGlzcF9wcm9wdmFsW3Byb3AgLSBFWFRDT05fUFJPUF9ESVNQX01JTl07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChleHRjb25fc2V0X2NhYmxlX3N0YXRlXyk7CitFWFBPUlRfU1lNQk9MX0dQTChleHRjb25fZ2V0X3Byb3BlcnR5KTsKKworLyoqCisgKiBleHRjb25fc2V0X3Byb3BlcnR5KCkgLSBTZXQgdGhlIHByb3BlcnR5IHZhbHVlIG9mIGEgc3BlY2lmaWMgY2FibGUuCisgKiBAZWRldjoJCXRoZSBleHRjb24gZGV2aWNlIHRoYXQgaGFzIHRoZSBjYWJsZS4KKyAqIEBpZDoJCQl0aGUgdW5pcXVlIGlkIG9mIGVhY2ggZXh0ZXJuYWwgY29ubmVjdG9yCisgKgkJCWluIGV4dGNvbiBlbnVtZXJhdGlvbi4KKyAqIEBwcm9wOgkJdGhlIHByb3BlcnR5IGlkIGFtb25nIGVudW0gZXh0Y29uX3Byb3BlcnR5LgorICogQHByb3BfdmFsOgkJdGhlIHBvaW50ZXIgaW5jbHVkaW5nIHRoZSBuZXcgdmFsdWUgb2YgcHJvcGVydHkuCisgKgorICogVGhlIGVhY2ggcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBwcm9wZXJ0aWVzCisgKiBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgZXh0ZXJuYWwgY29ubmVjdG9ycy4KKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2VzcyBvciBlcnJvciBudW1iZXIgaWYgZmFpbAorICovCitpbnQgZXh0Y29uX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCXVuc2lnbmVkIGludCBwcm9wLAorCQkJCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSBwcm9wX3ZhbCkKK3sKKwlzdHJ1Y3QgZXh0Y29uX2NhYmxlICpjYWJsZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpbmRleCwgcmV0ID0gMDsKKworCWlmICghZWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQgb3Igbm90ICovCisJaWYgKCFpc19leHRjb25fcHJvcGVydHlfc3VwcG9ydGVkKGlkLCBwcm9wKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBGaW5kIHRoZSBjYWJsZSBpbmRleCBvZiBleHRlcm5hbCBjb25uZWN0b3IgYnkgdXNpbmcgaWQgKi8KKwlpbmRleCA9IGZpbmRfY2FibGVfaW5kZXhfYnlfaWQoZWRldiwgaWQpOworCWlmIChpbmRleCA8IDApCisJCXJldHVybiBpbmRleDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlZGV2LT5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBhdmFpbGFibGUgb3Igbm90LiAqLworCWlmICghaXNfZXh0Y29uX3Byb3BlcnR5X2NhcGFiaWxpdHkoZWRldiwgaWQsIGluZGV4LCBwcm9wKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGV2LT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJY2FibGUgPSAmZWRldi0+Y2FibGVzW2luZGV4XTsKKworCS8qIFNldCB0aGUgcHJvcGVydHkgdmFsdWUgYWNjb3JkaW5nIHRvIGV4dGNvbiB0eXBlICovCisJc3dpdGNoIChwcm9wKSB7CisJY2FzZSBFWFRDT05fUFJPUF9VU0JfTUlOIC4uLiBFWFRDT05fUFJPUF9VU0JfTUFYOgorCQljYWJsZS0+dXNiX3Byb3B2YWxbcHJvcCAtIEVYVENPTl9QUk9QX1VTQl9NSU5dID0gcHJvcF92YWw7CisJCWJyZWFrOworCWNhc2UgRVhUQ09OX1BST1BfQ0hHX01JTiAuLi4gRVhUQ09OX1BST1BfQ0hHX01BWDoKKwkJY2FibGUtPmNoZ19wcm9wdmFsW3Byb3AgLSBFWFRDT05fUFJPUF9DSEdfTUlOXSA9IHByb3BfdmFsOworCQlicmVhazsKKwljYXNlIEVYVENPTl9QUk9QX0pBQ0tfTUlOIC4uLiBFWFRDT05fUFJPUF9KQUNLX01BWDoKKwkJY2FibGUtPmphY2tfcHJvcHZhbFtwcm9wIC0gRVhUQ09OX1BST1BfSkFDS19NSU5dID0gcHJvcF92YWw7CisJCWJyZWFrOworCWNhc2UgRVhUQ09OX1BST1BfRElTUF9NSU4gLi4uIEVYVENPTl9QUk9QX0RJU1BfTUFYOgorCQljYWJsZS0+ZGlzcF9wcm9wdmFsW3Byb3AgLSBFWFRDT05fUFJPUF9ESVNQX01JTl0gPSBwcm9wX3ZhbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRldi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGV4dGNvbl9zZXRfcHJvcGVydHkpOworCisvKioKKyAqIGV4dGNvbl9zZXRfcHJvcGVydHlfc3luYygpIC0gU2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiBhIHNwZWNpZmljIGNhYmxlCisJCQl3aXRoIGEgbm90aWZpY2F0aW9uLgorICogQHByb3BfdmFsOgkJdGhlIHBvaW50ZXIgaW5jbHVkaW5nIHRoZSBuZXcgdmFsdWUgb2YgcHJvcGVydHkuCisgKgorICogV2hlbiBzZXR0aW5nIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiBleHRlcm5hbCBjb25uZWN0b3IsIHRoZSBleHRlcm5hbCBjb25uZWN0b3IKKyAqIHNob3VsZCBiZSBhdHRhY2hlZC4gVGhlIGVhY2ggcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mCisgKiBzdXBwb3J0ZWQgcHJvcGVydGllcyBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgZXh0ZXJuYWwgY29ubmVjdG9ycy4KKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2VzcyBvciBlcnJvciBudW1iZXIgaWYgZmFpbAorICovCitpbnQgZXh0Y29uX3NldF9wcm9wZXJ0eV9zeW5jKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsCisJCQkJdW5zaWduZWQgaW50IHByb3AsCisJCQkJdW5pb24gZXh0Y29uX3Byb3BlcnR5X3ZhbHVlIHByb3BfdmFsKQoreworCWludCByZXQ7CisKKwlyZXQgPSBleHRjb25fc2V0X3Byb3BlcnR5KGVkZXYsIGlkLCBwcm9wLCBwcm9wX3ZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gZXh0Y29uX3N5bmMoZWRldiwgaWQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZXh0Y29uX3NldF9wcm9wZXJ0eV9zeW5jKTsKKworLyoqCisgKiBleHRjb25fZ2V0X3Byb3BlcnR5X2NhcGFiaWxpdHkoKSAtIEdldCB0aGUgY2FwYWJpbGl0eSBvZiBwcm9wZXJ0eQorICoJCQlvZiBhbiBleHRlcm5hbCBjb25uZWN0b3IuCisgKiBAZWRldjoJCXRoZSBleHRjb24gZGV2aWNlIHRoYXQgaGFzIHRoZSBjYWJsZS4KKyAqIEBpZDoJCQl0aGUgdW5pcXVlIGlkIG9mIGVhY2ggZXh0ZXJuYWwgY29ubmVjdG9yCisgKgkJCWluIGV4dGNvbiBlbnVtZXJhdGlvbi4KKyAqIEBwcm9wOgkJdGhlIHByb3BlcnR5IGlkIGFtb25nIGVudW0gZXh0Y29uX3Byb3BlcnR5LgorICoKKyAqIFJldHVybnMgMSBpZiB0aGUgcHJvcGVydHkgaXMgYXZhaWxhYmxlIG9yIDAgaWYgbm90IGF2YWlsYWJsZS4KKyAqLworaW50IGV4dGNvbl9nZXRfcHJvcGVydHlfY2FwYWJpbGl0eShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCQl1bnNpZ25lZCBpbnQgcHJvcCkKK3sKKwlpbnQgaW5kZXg7CisKKwlpZiAoIWVkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkIG9yIG5vdCAqLworCWlmICghaXNfZXh0Y29uX3Byb3BlcnR5X3N1cHBvcnRlZChpZCwgcHJvcCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRmluZCB0aGUgY2FibGUgaW5kZXggb2YgZXh0ZXJuYWwgY29ubmVjdG9yIGJ5IHVzaW5nIGlkICovCisJaW5kZXggPSBmaW5kX2NhYmxlX2luZGV4X2J5X2lkKGVkZXYsIGlkKTsKKwlpZiAoaW5kZXggPCAwKQorCQlyZXR1cm4gaW5kZXg7CisKKwlyZXR1cm4gaXNfZXh0Y29uX3Byb3BlcnR5X2NhcGFiaWxpdHkoZWRldiwgaWQsIGluZGV4LCBwcm9wKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGV4dGNvbl9nZXRfcHJvcGVydHlfY2FwYWJpbGl0eSk7CisKKy8qKgorICogZXh0Y29uX3NldF9wcm9wZXJ0eV9jYXBhYmlsaXR5KCkgLSBTZXQgdGhlIGNhcGFiaWxpdHkgb2YgYSBwcm9wZXJ0eQorICoJCQlvZiBhbiBleHRlcm5hbCBjb25uZWN0b3IuCisgKiBAZWRldjoJCXRoZSBleHRjb24gZGV2aWNlIHRoYXQgaGFzIHRoZSBjYWJsZS4KKyAqIEBpZDoJCQl0aGUgdW5pcXVlIGlkIG9mIGVhY2ggZXh0ZXJuYWwgY29ubmVjdG9yCisgKgkJCWluIGV4dGNvbiBlbnVtZXJhdGlvbi4KKyAqIEBwcm9wOgkJdGhlIHByb3BlcnR5IGlkIGFtb25nIGVudW0gZXh0Y29uX3Byb3BlcnR5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0IHRoZSBjYXBhYmlsaXR5IG9mIGEgcHJvcGVydHkgZm9yIGFuIGV4dGVybmFsIGNvbm5lY3RvcgorICogdG8gbWFyayB0aGUgYml0IGluIGNhcGFiaWxpdHkgYml0bWFwIHdoaWNoIG1lYW4gdGhlIGF2YWlsYWJsZSBzdGF0ZSBvZgorICogYSBwcm9wZXJ0eS4KKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2VzcyBvciBlcnJvciBudW1iZXIgaWYgZmFpbAorICovCitpbnQgZXh0Y29uX3NldF9wcm9wZXJ0eV9jYXBhYmlsaXR5KHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsCisJCQkJCXVuc2lnbmVkIGludCBwcm9wKQoreworCXN0cnVjdCBleHRjb25fY2FibGUgKmNhYmxlOworCWludCBpbmRleCwgdHlwZSwgcmV0ID0gMDsKKworCWlmICghZWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQgb3Igbm90LiAqLworCWlmICghaXNfZXh0Y29uX3Byb3BlcnR5X3N1cHBvcnRlZChpZCwgcHJvcCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRmluZCB0aGUgY2FibGUgaW5kZXggb2YgZXh0ZXJuYWwgY29ubmVjdG9yIGJ5IHVzaW5nIGlkLiAqLworCWluZGV4ID0gZmluZF9jYWJsZV9pbmRleF9ieV9pZChlZGV2LCBpZCk7CisJaWYgKGluZGV4IDwgMCkKKwkJcmV0dXJuIGluZGV4OworCisJdHlwZSA9IGdldF9leHRjb25fdHlwZShwcm9wKTsKKwlpZiAodHlwZSA8IDApCisJCXJldHVybiB0eXBlOworCisJY2FibGUgPSAmZWRldi0+Y2FibGVzW2luZGV4XTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRVhUQ09OX1RZUEVfVVNCOgorCQlfX3NldF9iaXQocHJvcCAtIEVYVENPTl9QUk9QX1VTQl9NSU4sIGNhYmxlLT51c2JfYml0cyk7CisJCWJyZWFrOworCWNhc2UgRVhUQ09OX1RZUEVfQ0hHOgorCQlfX3NldF9iaXQocHJvcCAtIEVYVENPTl9QUk9QX0NIR19NSU4sIGNhYmxlLT5jaGdfYml0cyk7CisJCWJyZWFrOworCWNhc2UgRVhUQ09OX1RZUEVfSkFDSzoKKwkJX19zZXRfYml0KHByb3AgLSBFWFRDT05fUFJPUF9KQUNLX01JTiwgY2FibGUtPmphY2tfYml0cyk7CisJCWJyZWFrOworCWNhc2UgRVhUQ09OX1RZUEVfRElTUDoKKwkJX19zZXRfYml0KHByb3AgLSBFWFRDT05fUFJPUF9ESVNQX01JTiwgY2FibGUtPmRpc3BfYml0cyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGV4dGNvbl9zZXRfcHJvcGVydHlfY2FwYWJpbGl0eSk7CiAKIC8qKgogICogZXh0Y29uX2dldF9leHRjb25fZGV2KCkgLSBHZXQgdGhlIGV4dGNvbiBkZXZpY2UgaW5zdGFuY2UgZnJvbSB0aGUgbmFtZQpAQCAtNDI4LDcgKzkwNCw3IEBACiAJCQkgICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0LCBpZHg7CisJaW50IHJldCwgaWR4ID0gLUVJTlZBTDsKIAogCWlmICghbmIpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODQ2LDEzICsxMzIyLDEzIEBACiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCiAJaWYgKCFkZXYtPm9mX25vZGUpIHsKLQkJZGV2X2VycihkZXYsICJkZXZpY2UgZG9lcyBub3QgaGF2ZSBhIGRldmljZSBub2RlIGVudHJ5XG4iKTsKKwkJZGV2X2RiZyhkZXYsICJkZXZpY2UgZG9lcyBub3QgaGF2ZSBhIGRldmljZSBub2RlIGVudHJ5XG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQogCiAJbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUoZGV2LT5vZl9ub2RlLCAiZXh0Y29uIiwgaW5kZXgpOwogCWlmICghbm9kZSkgewotCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgcGhhbmRsZSBpbiAlcyBub2RlXG4iLAorCQlkZXZfZGJnKGRldiwgImZhaWxlZCB0byBnZXQgcGhhbmRsZSBpbiAlcyBub2RlXG4iLAogCQkJZGV2LT5vZl9ub2RlLT5mdWxsX25hbWUpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9zY3BpLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9zY3BpLmMKaW5kZXggNDM4ODkzNy4uY2UyYmMyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9hcm1fc2NwaS5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3NjcGkuYwpAQCAtNzA5LDkgKzcwOSwxMCBAQAogCQlzdHJ1Y3QgbWJveF9jbGllbnQgKmNsID0gJnBjaGFuLT5jbDsKIAkJc3RydWN0IGRldmljZV9ub2RlICpzaG1lbSA9IG9mX3BhcnNlX3BoYW5kbGUobnAsICJzaG1lbSIsIGlkeCk7CiAKLQkJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc2htZW0sIDAsICZyZXMpKSB7CisJCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc2htZW0sIDAsICZyZXMpOworCQlvZl9ub2RlX3B1dChzaG1lbSk7CisJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBTQ1BJIHBheWxvYWQgbWVtIHJlc291cmNlXG4iKTsKLQkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycjsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jIGIvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuYwppbmRleCA4MjllZWM4Li4yZmUxYTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMjM4LDMzICsyMzksMTQgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLS8qKgotICogZGNkYmFzX3NtaV9yZXF1ZXN0OiBnZW5lcmF0ZSBTTUkgcmVxdWVzdAotICoKLSAqIENhbGxlZCB3aXRoIHNtaV9kYXRhX2xvY2suCi0gKi8KLWludCBkY2RiYXNfc21pX3JlcXVlc3Qoc3RydWN0IHNtaV9jbWQgKnNtaV9jbWQpCitzdGF0aWMgaW50IHJhaXNlX3NtaSh2b2lkICpwYXIpCiB7Ci0JY3B1bWFza192YXJfdCBvbGRfbWFzazsKLQlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc21pX2NtZCAqc21pX2NtZCA9IHBhcjsKIAotCWlmIChzbWlfY21kLT5tYWdpYyAhPSBTTUlfQ01EX01BR0lDKSB7Ci0JCWRldl9pbmZvKCZkY2RiYXNfcGRldi0+ZGV2LCAiJXM6IGludmFsaWQgbWFnaWMgdmFsdWVcbiIsCi0JCQkgX19mdW5jX18pOwotCQlyZXR1cm4gLUVCQURSOwotCX0KLQotCS8qIFNNSSByZXF1aXJlcyBDUFUgMCAqLwotCWlmICghYWxsb2NfY3B1bWFza192YXIoJm9sZF9tYXNrLCBHRlBfS0VSTkVMKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljcHVtYXNrX2NvcHkob2xkX21hc2ssICZjdXJyZW50LT5jcHVzX2FsbG93ZWQpOwotCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIGNwdW1hc2tfb2YoMCkpOwogCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gMCkgewogCQlkZXZfZGJnKCZkY2RiYXNfcGRldi0+ZGV2LCAiJXM6IGZhaWxlZCB0byBnZXQgQ1BVIDBcbiIsCiAJCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXQ7CisJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJLyogZ2VuZXJhdGUgU01JICovCkBAIC0yODAsOSArMjYyLDI4IEBACiAJCTogIm1lbW9yeSIKIAkpOwogCi1vdXQ6Ci0Jc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgb2xkX21hc2spOwotCWZyZWVfY3B1bWFza192YXIob2xkX21hc2spOworCXJldHVybiAwOworfQorLyoqCisgKiBkY2RiYXNfc21pX3JlcXVlc3Q6IGdlbmVyYXRlIFNNSSByZXF1ZXN0CisgKgorICogQ2FsbGVkIHdpdGggc21pX2RhdGFfbG9jay4KKyAqLworaW50IGRjZGJhc19zbWlfcmVxdWVzdChzdHJ1Y3Qgc21pX2NtZCAqc21pX2NtZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKHNtaV9jbWQtPm1hZ2ljICE9IFNNSV9DTURfTUFHSUMpIHsKKwkJZGV2X2luZm8oJmRjZGJhc19wZGV2LT5kZXYsICIlczogaW52YWxpZCBtYWdpYyB2YWx1ZVxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUJBRFI7CisJfQorCisJLyogU01JIHJlcXVpcmVzIENQVSAwICovCisJZ2V0X29ubGluZV9jcHVzKCk7CisJcmV0ID0gc21wX2NhbGxfb25fY3B1KDAsIHJhaXNlX3NtaSwgc21pX2NtZCwgdHJ1ZSk7CisJcHV0X29ubGluZV9jcHVzKCk7CisKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RtaS1pZC5jIGIvZHJpdmVycy9maXJtd2FyZS9kbWktaWQuYwppbmRleCA5NGE1OGEwLi40NGMwMTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2RtaS1pZC5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZG1pLWlkLmMKQEAgLTIyOSwxNCArMjI5LDE0IEBACiAKIAlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoZG1pX2Rldik7CiAJaWYgKHJldCkKLQkJZ290byBmYWlsX2ZyZWVfZG1pX2RldjsKKwkJZ290byBmYWlsX3B1dF9kbWlfZGV2OwogCiAJcmV0dXJuIDA7CiAKLWZhaWxfZnJlZV9kbWlfZGV2OgotCWtmcmVlKGRtaV9kZXYpOwotZmFpbF9jbGFzc191bnJlZ2lzdGVyOgorZmFpbF9wdXRfZG1pX2RldjoKKwlwdXRfZGV2aWNlKGRtaV9kZXYpOwogCitmYWlsX2NsYXNzX3VucmVnaXN0ZXI6CiAJY2xhc3NfdW5yZWdpc3RlcigmZG1pX2NsYXNzKTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvS2NvbmZpZwppbmRleCA2Mzk0MTUyLi5jOTgxYmUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL0tjb25maWcKQEAgLTExMiw2ICsxMTIsMjMgQEAKIAogCSAgTW9zdCB1c2VycyBzaG91bGQgc2F5IE4uCiAKK2NvbmZpZyBFRklfVEVTVAorCXRyaXN0YXRlICJFRkkgUnVudGltZSBTZXJ2aWNlIFRlc3RzIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBFRkkKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIGRyaXZlciB1c2VzIHRoZSBlZmkuPHNlcnZpY2U+IGZ1bmN0aW9uIHBvaW50ZXJzIGRpcmVjdGx5IGluc3RlYWQKKwkgIG9mIGdvaW5nIHRocm91Z2ggdGhlIGVmaXZhciBBUEksIGJlY2F1c2UgaXQgaXMgbm90IHRyeWluZyB0byB0ZXN0IHRoZQorCSAga2VybmVsIHN1YnN5c3RlbSwganVzdCBmb3IgdGVzdGluZyB0aGUgVUVGSSBydW50aW1lIHNlcnZpY2UKKwkgIGludGVyZmFjZXMgd2hpY2ggYXJlIHByb3ZpZGVkIGJ5IHRoZSBmaXJtd2FyZS4gVGhpcyBkcml2ZXIgaXMgdXNlZAorCSAgYnkgdGhlIEZpcm13YXJlIFRlc3QgU3VpdGUgKEZXVFMpIGZvciB0ZXN0aW5nIHRoZSBVRUZJIHJ1bnRpbWUKKwkgIGludGVyZmFjZXMgcmVhZGluZXNzIG9mIHRoZSBmaXJtd2FyZS4KKwkgIERldGFpbHMgZm9yIEZXVFMgYXJlIGF2YWlsYWJsZSBmcm9tOgorCSAgPGh0dHBzOi8vd2lraS51YnVudHUuY29tL0Zpcm13YXJlVGVzdFN1aXRlPgorCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUgcnVudGltZSBzZXJ2aWNlcyBzdXBwb3J0IHZpYSAvZGV2L2VmaV90ZXN0LgorCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogZW5kbWVudQogCiBjb25maWcgVUVGSV9DUEVSCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL01ha2VmaWxlCmluZGV4IGEyMTk2NDAuLmM4YTQzOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL01ha2VmaWxlCkBAIC0xMCw3ICsxMCw3IEBACiBLQVNBTl9TQU5JVElaRV9ydW50aW1lLXdyYXBwZXJzLm8JOj0gbgogCiBvYmotJChDT05GSUdfRUZJKQkJCSs9IGVmaS5vIHZhcnMubyByZWJvb3QubyBtZW1hdHRyLm8KLW9iai0kKENPTkZJR19FRkkpCQkJKz0gY2Fwc3VsZS5vCitvYmotJChDT05GSUdfRUZJKQkJCSs9IGNhcHN1bGUubyBtZW1tYXAubwogb2JqLSQoQ09ORklHX0VGSV9WQVJTKQkJCSs9IGVmaXZhcnMubwogb2JqLSQoQ09ORklHX0VGSV9FU1JUKQkJCSs9IGVzcnQubwogb2JqLSQoQ09ORklHX0VGSV9WQVJTX1BTVE9SRSkJCSs9IGVmaS1wc3RvcmUubwpAQCAtMjAsNiArMjAsNyBAQAogb2JqLSQoQ09ORklHX0VGSV9TVFVCKQkJCSs9IGxpYnN0dWIvCiBvYmotJChDT05GSUdfRUZJX0ZBS0VfTUVNTUFQKQkJKz0gZmFrZV9tZW0ubwogb2JqLSQoQ09ORklHX0VGSV9CT09UTE9BREVSX0NPTlRST0wpCSs9IGVmaWJjLm8KK29iai0kKENPTkZJR19FRklfVEVTVCkJCQkrPSB0ZXN0LwogCiBhcm0tb2JqLSQoQ09ORklHX0VGSSkJCQk6PSBhcm0taW5pdC5vIGFybS1ydW50aW1lLm8KIG9iai0kKENPTkZJR19BUk0pCQkJKz0gJChhcm0tb2JqLXkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9hcm0taW5pdC5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvYXJtLWluaXQuYwppbmRleCBjNDlkNTBlLi44ZWZlMTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9hcm0taW5pdC5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2FybS1pbml0LmMKQEAgLTI2LDkgKzI2LDkgQEAKIAogdTY0IGVmaV9zeXN0ZW1fdGFibGU7CiAKLXN0YXRpYyBpbnQgX19pbml0IGlzX25vcm1hbF9yYW0oZWZpX21lbW9yeV9kZXNjX3QgKm1kKQorc3RhdGljIGludCBfX2luaXQgaXNfbWVtb3J5KGVmaV9tZW1vcnlfZGVzY190ICptZCkKIHsKLQlpZiAobWQtPmF0dHJpYnV0ZSAmIEVGSV9NRU1PUllfV0IpCisJaWYgKG1kLT5hdHRyaWJ1dGUgJiAoRUZJX01FTU9SWV9XQnxFRklfTUVNT1JZX1dUfEVGSV9NRU1PUllfV0MpKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1Miw5ICsxNTIsOSBAQAogfQogCiAvKgotICogUmV0dXJuIHRydWUgZm9yIFJBTSByZWdpb25zIHdlIHdhbnQgdG8gcGVybWFuZW50bHkgcmVzZXJ2ZS4KKyAqIFJldHVybiB0cnVlIGZvciByZWdpb25zIHRoYXQgY2FuIGJlIHVzZWQgYXMgU3lzdGVtIFJBTS4KICAqLwotc3RhdGljIF9faW5pdCBpbnQgaXNfcmVzZXJ2ZV9yZWdpb24oZWZpX21lbW9yeV9kZXNjX3QgKm1kKQorc3RhdGljIF9faW5pdCBpbnQgaXNfdXNhYmxlX21lbW9yeShlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpCiB7CiAJc3dpdGNoIChtZC0+dHlwZSkgewogCWNhc2UgRUZJX0xPQURFUl9DT0RFOgpAQCAtMTYzLDE4ICsxNjMsMjIgQEAKIAljYXNlIEVGSV9CT09UX1NFUlZJQ0VTX0RBVEE6CiAJY2FzZSBFRklfQ09OVkVOVElPTkFMX01FTU9SWToKIAljYXNlIEVGSV9QRVJTSVNURU5UX01FTU9SWToKLQkJcmV0dXJuIDA7CisJCS8qCisJCSAqIEFjY29yZGluZyB0byB0aGUgc3BlYywgdGhlc2UgcmVnaW9ucyBhcmUgbm8gbG9uZ2VyIHJlc2VydmVkCisJCSAqIGFmdGVyIGNhbGxpbmcgRXhpdEJvb3RTZXJ2aWNlcygpLiBIb3dldmVyLCB3ZSBjYW4gb25seSB1c2UKKwkJICogdGhlbSBhcyBTeXN0ZW0gUkFNIGlmIHRoZXkgY2FuIGJlIG1hcHBlZCB3cml0ZWJhY2sgY2FjaGVhYmxlLgorCQkgKi8KKwkJcmV0dXJuIChtZC0+YXR0cmlidXRlICYgRUZJX01FTU9SWV9XQik7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQotCXJldHVybiBpc19ub3JtYWxfcmFtKG1kKTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXRpYyBfX2luaXQgdm9pZCByZXNlcnZlX3JlZ2lvbnModm9pZCkKIHsKIAllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CiAJdTY0IHBhZGRyLCBucGFnZXMsIHNpemU7Ci0JaW50IHJlc3Y7CiAKIAlpZiAoZWZpX2VuYWJsZWQoRUZJX0RCRykpCiAJCXByX2luZm8oIlByb2Nlc3NpbmcgRUZJIG1lbW9yeSBtYXA6XG4iKTsKQEAgLTE5MSwzMiArMTk1LDI5IEBACiAJCXBhZGRyID0gbWQtPnBoeXNfYWRkcjsKIAkJbnBhZ2VzID0gbWQtPm51bV9wYWdlczsKIAotCQlyZXN2ID0gaXNfcmVzZXJ2ZV9yZWdpb24obWQpOwogCQlpZiAoZWZpX2VuYWJsZWQoRUZJX0RCRykpIHsKIAkJCWNoYXIgYnVmWzY0XTsKIAotCQkJcHJfaW5mbygiICAweCUwMTJsbHgtMHglMDEybGx4ICVzJXNcbiIsCisJCQlwcl9pbmZvKCIgIDB4JTAxMmxseC0weCUwMTJsbHggJXNcbiIsCiAJCQkJcGFkZHIsIHBhZGRyICsgKG5wYWdlcyA8PCBFRklfUEFHRV9TSElGVCkgLSAxLAotCQkJCWVmaV9tZF90eXBlYXR0cl9mb3JtYXQoYnVmLCBzaXplb2YoYnVmKSwgbWQpLAotCQkJCXJlc3YgPyAiKiIgOiAiIik7CisJCQkJZWZpX21kX3R5cGVhdHRyX2Zvcm1hdChidWYsIHNpemVvZihidWYpLCBtZCkpOwogCQl9CiAKIAkJbWVtcmFuZ2VfZWZpX3RvX25hdGl2ZSgmcGFkZHIsICZucGFnZXMpOwogCQlzaXplID0gbnBhZ2VzIDw8IFBBR0VfU0hJRlQ7CiAKLQkJaWYgKGlzX25vcm1hbF9yYW0obWQpKQorCQlpZiAoaXNfbWVtb3J5KG1kKSkgewogCQkJZWFybHlfaW5pdF9kdF9hZGRfbWVtb3J5X2FyY2gocGFkZHIsIHNpemUpOwogCi0JCWlmIChyZXN2KQotCQkJbWVtYmxvY2tfbWFya19ub21hcChwYWRkciwgc2l6ZSk7Ci0KKwkJCWlmICghaXNfdXNhYmxlX21lbW9yeShtZCkpCisJCQkJbWVtYmxvY2tfbWFya19ub21hcChwYWRkciwgc2l6ZSk7CisJCX0KIAl9Ci0KLQlzZXRfYml0KEVGSV9NRU1NQVAsICZlZmkuZmxhZ3MpOwogfQogCiB2b2lkIF9faW5pdCBlZmlfaW5pdCh2b2lkKQogeworCXN0cnVjdCBlZmlfbWVtb3J5X21hcF9kYXRhIGRhdGE7CiAJc3RydWN0IGVmaV9mZHRfcGFyYW1zIHBhcmFtczsKIAogCS8qIEdyYWIgVUVGSSBpbmZvcm1hdGlvbiBwbGFjZWQgaW4gRkRUIGJ5IHN0dWIgKi8KQEAgLTIyNSw5ICsyMjYsMTIgQEAKIAogCWVmaV9zeXN0ZW1fdGFibGUgPSBwYXJhbXMuc3lzdGVtX3RhYmxlOwogCi0JZWZpLm1lbW1hcC5waHlzX21hcCA9IHBhcmFtcy5tbWFwOwotCWVmaS5tZW1tYXAubWFwID0gZWFybHlfbWVtcmVtYXBfcm8ocGFyYW1zLm1tYXAsIHBhcmFtcy5tbWFwX3NpemUpOwotCWlmIChlZmkubWVtbWFwLm1hcCA9PSBOVUxMKSB7CisJZGF0YS5kZXNjX3ZlcnNpb24gPSBwYXJhbXMuZGVzY192ZXI7CisJZGF0YS5kZXNjX3NpemUgPSBwYXJhbXMuZGVzY19zaXplOworCWRhdGEuc2l6ZSA9IHBhcmFtcy5tbWFwX3NpemU7CisJZGF0YS5waHlzX21hcCA9IHBhcmFtcy5tbWFwOworCisJaWYgKGVmaV9tZW1tYXBfaW5pdF9lYXJseSgmZGF0YSkgPCAwKSB7CiAJCS8qCiAJCSogSWYgd2UgYXJlIGJvb3RpbmcgdmlhIFVFRkksIHRoZSBVRUZJIG1lbW9yeSBtYXAgaXMgdGhlIG9ubHkKIAkJKiBkZXNjcmlwdGlvbiBvZiBtZW1vcnkgd2UgaGF2ZSwgc28gdGhlcmUgaXMgbGl0dGxlIHBvaW50IGluCkBAIC0yMzUsOSArMjM5LDYgQEAKIAkJKi8KIAkJcGFuaWMoIlVuYWJsZSB0byBtYXAgRUZJIG1lbW9yeSBtYXAuXG4iKTsKIAl9Ci0JZWZpLm1lbW1hcC5tYXBfZW5kID0gZWZpLm1lbW1hcC5tYXAgKyBwYXJhbXMubW1hcF9zaXplOwotCWVmaS5tZW1tYXAuZGVzY19zaXplID0gcGFyYW1zLmRlc2Nfc2l6ZTsKLQllZmkubWVtbWFwLmRlc2NfdmVyc2lvbiA9IHBhcmFtcy5kZXNjX3ZlcjsKIAogCVdBUk4oZWZpLm1lbW1hcC5kZXNjX3ZlcnNpb24gIT0gMSwKIAkgICAgICJVbmV4cGVjdGVkIEVGSV9NRU1PUllfREVTQ1JJUFRPUiB2ZXJzaW9uICVsZCIsCkBAIC0yNDgsNyArMjQ5LDggQEAKIAogCXJlc2VydmVfcmVnaW9ucygpOwogCWVmaV9tZW1hdHRyX2luaXQoKTsKLQllYXJseV9tZW11bm1hcChlZmkubWVtbWFwLm1hcCwgcGFyYW1zLm1tYXBfc2l6ZSk7CisJZWZpX2VzcnRfaW5pdCgpOworCWVmaV9tZW1tYXBfdW5tYXAoKTsKIAogCW1lbWJsb2NrX3Jlc2VydmUocGFyYW1zLm1tYXAgJiBQQUdFX01BU0ssCiAJCQkgUEFHRV9BTElHTihwYXJhbXMubW1hcF9zaXplICsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2FybS1ydW50aW1lLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9hcm0tcnVudGltZS5jCmluZGV4IGMzOTRiODEuLjdjNzVhOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2FybS1ydW50aW1lLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvYXJtLXJ1bnRpbWUuYwpAQCAtMzksNiArMzksMjYgQEAKIAkubW1saXN0CQkJPSBMSVNUX0hFQURfSU5JVChlZmlfbW0ubW1saXN0KSwKIH07CiAKKyNpZmRlZiBDT05GSUdfQVJNNjRfUFREVU1QCisjaW5jbHVkZSA8YXNtL3B0ZHVtcC5oPgorCitzdGF0aWMgc3RydWN0IHB0ZHVtcF9pbmZvIGVmaV9wdGR1bXBfaW5mbyA9IHsKKwkubW0JCT0gJmVmaV9tbSwKKwkubWFya2Vycwk9IChzdHJ1Y3QgYWRkcl9tYXJrZXJbXSl7CisJCXsgMCwJCSJVRUZJIHJ1bnRpbWUgc3RhcnQiIH0sCisJCXsgVEFTS19TSVpFXzY0LAkiVUVGSSBydW50aW1lIGVuZCIgfQorCX0sCisJLmJhc2VfYWRkcgk9IDAsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwdGR1bXBfaW5pdCh2b2lkKQoreworCXJldHVybiBwdGR1bXBfcmVnaXN0ZXIoJmVmaV9wdGR1bXBfaW5mbywgImVmaV9wYWdlX3RhYmxlcyIpOworfQorZGV2aWNlX2luaXRjYWxsKHB0ZHVtcF9pbml0KTsKKworI2VuZGlmCisKIHN0YXRpYyBib29sIF9faW5pdCBlZmlfdmlydG1hcF9pbml0KHZvaWQpCiB7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm1kOwpAQCAtMTE0LDE0ICsxMzQsMTIgQEAKIAogCXByX2luZm8oIlJlbWFwcGluZyBhbmQgZW5hYmxpbmcgRUZJIHNlcnZpY2VzLlxuIik7CiAKLQltYXBzaXplID0gZWZpLm1lbW1hcC5tYXBfZW5kIC0gZWZpLm1lbW1hcC5tYXA7CisJbWFwc2l6ZSA9IGVmaS5tZW1tYXAuZGVzY19zaXplICogZWZpLm1lbW1hcC5ucl9tYXA7CiAKLQllZmkubWVtbWFwLm1hcCA9IG1lbXJlbWFwKGVmaS5tZW1tYXAucGh5c19tYXAsIG1hcHNpemUsIE1FTVJFTUFQX1dCKTsKLQlpZiAoIWVmaS5tZW1tYXAubWFwKSB7CisJaWYgKGVmaV9tZW1tYXBfaW5pdF9sYXRlKGVmaS5tZW1tYXAucGh5c19tYXAsIG1hcHNpemUpKSB7CiAJCXByX2VycigiRmFpbGVkIHRvIHJlbWFwIEVGSSBtZW1vcnkgbWFwXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCWVmaS5tZW1tYXAubWFwX2VuZCA9IGVmaS5tZW1tYXAubWFwICsgbWFwc2l6ZTsKIAogCWlmICghZWZpX3ZpcnRtYXBfaW5pdCgpKSB7CiAJCXByX2VycigiVUVGSSB2aXJ0dWFsIG1hcHBpbmcgbWlzc2luZyBvciBpbnZhbGlkIC0tIHJ1bnRpbWUgc2VydmljZXMgd2lsbCBub3QgYmUgYXZhaWxhYmxlXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaS1wc3RvcmUuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaS1wc3RvcmUuYwppbmRleCAzMGEyNGQwLi4xYzMzZDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZmktcHN0b3JlLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpLXBzdG9yZS5jCkBAIC0xMjUsMTYgKzEyNSwxOSBAQAogICogQGVudHJ5OiBkZWxldGluZyBlbnRyeQogICogQHR1cm5fb2ZmX3NjYW5uaW5nOiBDaGVjayBpZiBhIHNjYW5uaW5nIGZsYWcgc2hvdWxkIGJlIHR1cm5lZCBvZmYKICAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fZWZpX3BzdG9yZV9zY2FuX3N5c2ZzX2V4aXQoc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnksCitzdGF0aWMgaW5saW5lIGludCBfX2VmaV9wc3RvcmVfc2Nhbl9zeXNmc19leGl0KHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5LAogCQkJCQkJYm9vbCB0dXJuX29mZl9zY2FubmluZykKIHsKIAlpZiAoZW50cnktPmRlbGV0aW5nKSB7CiAJCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7CiAJCWVmaXZhcl9lbnRyeV9pdGVyX2VuZCgpOwogCQllZml2YXJfdW5yZWdpc3RlcihlbnRyeSk7Ci0JCWVmaXZhcl9lbnRyeV9pdGVyX2JlZ2luKCk7CisJCWlmIChlZml2YXJfZW50cnlfaXRlcl9iZWdpbigpKQorCQkJcmV0dXJuIC1FSU5UUjsKIAl9IGVsc2UgaWYgKHR1cm5fb2ZmX3NjYW5uaW5nKQogCQllbnRyeS0+c2Nhbm5pbmcgPSBmYWxzZTsKKworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTE0NCwxMyArMTQ3LDE4IEBACiAgKiBAaGVhZDogbGlzdCBoZWFkCiAgKiBAc3RvcDogYSBmbGFnIGNoZWNraW5nIGlmIHNjYW5uaW5nIHdpbGwgc3RvcAogICovCi1zdGF0aWMgdm9pZCBlZmlfcHN0b3JlX3NjYW5fc3lzZnNfZXhpdChzdHJ1Y3QgZWZpdmFyX2VudHJ5ICpwb3MsCitzdGF0aWMgaW50IGVmaV9wc3RvcmVfc2Nhbl9zeXNmc19leGl0KHN0cnVjdCBlZml2YXJfZW50cnkgKnBvcywKIAkJCQkgICAgICAgc3RydWN0IGVmaXZhcl9lbnRyeSAqbmV4dCwKIAkJCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgYm9vbCBzdG9wKQogewotCV9fZWZpX3BzdG9yZV9zY2FuX3N5c2ZzX2V4aXQocG9zLCB0cnVlKTsKKwlpbnQgcmV0ID0gX19lZmlfcHN0b3JlX3NjYW5fc3lzZnNfZXhpdChwb3MsIHRydWUpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCWlmIChzdG9wKQotCQlfX2VmaV9wc3RvcmVfc2Nhbl9zeXNmc19leGl0KG5leHQsICZuZXh0LT5saXN0ICE9IGhlYWQpOworCQlyZXQgPSBfX2VmaV9wc3RvcmVfc2Nhbl9zeXNmc19leGl0KG5leHQsICZuZXh0LT5saXN0ICE9IGhlYWQpOworCXJldHVybiByZXQ7CiB9CiAKIC8qKgpAQCAtMTcyLDEzICsxODAsMTcgQEAKIAlzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSwgKm47CiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZlZml2YXJfc3lzZnNfbGlzdDsKIAlpbnQgc2l6ZSA9IDA7CisJaW50IHJldDsKIAogCWlmICghKnBvcykgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG4sIGhlYWQsIGxpc3QpIHsKIAkJCWVmaV9wc3RvcmVfc2Nhbl9zeXNmc19lbnRlcihlbnRyeSwgbiwgaGVhZCk7CiAKIAkJCXNpemUgPSBlZmlfcHN0b3JlX3JlYWRfZnVuYyhlbnRyeSwgZGF0YSk7Ci0JCQllZmlfcHN0b3JlX3NjYW5fc3lzZnNfZXhpdChlbnRyeSwgbiwgaGVhZCwgc2l6ZSA8IDApOworCQkJcmV0ID0gZWZpX3BzdG9yZV9zY2FuX3N5c2ZzX2V4aXQoZW50cnksIG4sIGhlYWQsCisJCQkJCQkJIHNpemUgPCAwKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKIAkJCWlmIChzaXplKQogCQkJCWJyZWFrOwogCQl9CkBAIC0xOTAsNyArMjAyLDkgQEAKIAkJZWZpX3BzdG9yZV9zY2FuX3N5c2ZzX2VudGVyKCgqcG9zKSwgbiwgaGVhZCk7CiAKIAkJc2l6ZSA9IGVmaV9wc3RvcmVfcmVhZF9mdW5jKCgqcG9zKSwgZGF0YSk7Ci0JCWVmaV9wc3RvcmVfc2Nhbl9zeXNmc19leGl0KCgqcG9zKSwgbiwgaGVhZCwgc2l6ZSA8IDApOworCQlyZXQgPSBlZmlfcHN0b3JlX3NjYW5fc3lzZnNfZXhpdCgoKnBvcyksIG4sIGhlYWQsIHNpemUgPCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJCWlmIChzaXplKQogCQkJYnJlYWs7CiAJfQpAQCAtMjMyLDcgKzI0NiwxMCBAQAogCWlmICghKmRhdGEuYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWVmaXZhcl9lbnRyeV9pdGVyX2JlZ2luKCk7CisJaWYgKGVmaXZhcl9lbnRyeV9pdGVyX2JlZ2luKCkpIHsKKwkJa2ZyZWUoKmRhdGEuYnVmKTsKKwkJcmV0dXJuIC1FSU5UUjsKKwl9CiAJc2l6ZSA9IGVmaV9wc3RvcmVfc3lzZnNfZW50cnlfaXRlcigmZGF0YSwKIAkJCQkJICAgKHN0cnVjdCBlZml2YXJfZW50cnkgKiopJnBzaS0+ZGF0YSk7CiAJZWZpdmFyX2VudHJ5X2l0ZXJfZW5kKCk7CkBAIC0zNDcsNyArMzY0LDggQEAKIAllZGF0YS50aW1lID0gdGltZTsKIAllZGF0YS5uYW1lID0gZWZpX25hbWU7CiAKLQllZml2YXJfZW50cnlfaXRlcl9iZWdpbigpOworCWlmIChlZml2YXJfZW50cnlfaXRlcl9iZWdpbigpKQorCQlyZXR1cm4gLUVJTlRSOwogCWZvdW5kID0gX19lZml2YXJfZW50cnlfaXRlcihlZmlfcHN0b3JlX2VyYXNlX2Z1bmMsICZlZml2YXJfc3lzZnNfbGlzdCwgJmVkYXRhLCAmZW50cnkpOwogCiAJaWYgKGZvdW5kICYmICFlbnRyeS0+c2Nhbm5pbmcpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaS5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpLmMKaW5kZXggNWEyNjMxYS4uMWFjMTk5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3VjczJfc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KIAogI2luY2x1ZGUgPGFzbS9lYXJseV9pb3JlbWFwLmg+CiAKQEAgLTM0Nyw1NiArMzQ4LDMxIEBACiAKIC8qCiAgKiBGaW5kIHRoZSBlZmkgbWVtb3J5IGRlc2NyaXB0b3IgZm9yIGEgZ2l2ZW4gcGh5c2ljYWwgYWRkcmVzcy4gIEdpdmVuIGEKLSAqIHBoeXNpY2FsbCBhZGRyZXNzLCBkZXRlcm1pbmUgaWYgaXQgZXhpc3RzIHdpdGhpbiBhbiBFRkkgTWVtb3J5IE1hcCBlbnRyeSwKKyAqIHBoeXNpY2FsIGFkZHJlc3MsIGRldGVybWluZSBpZiBpdCBleGlzdHMgd2l0aGluIGFuIEVGSSBNZW1vcnkgTWFwIGVudHJ5LAogICogYW5kIGlmIHNvLCBwb3B1bGF0ZSB0aGUgc3VwcGxpZWQgbWVtb3J5IGRlc2NyaXB0b3Igd2l0aCB0aGUgYXBwcm9wcmlhdGUKICAqIGRhdGEuCiAgKi8KIGludCBfX2luaXQgZWZpX21lbV9kZXNjX2xvb2t1cCh1NjQgcGh5c19hZGRyLCBlZmlfbWVtb3J5X2Rlc2NfdCAqb3V0X21kKQogewotCXN0cnVjdCBlZmlfbWVtb3J5X21hcCAqbWFwID0gJmVmaS5tZW1tYXA7Ci0JcGh5c19hZGRyX3QgcCwgZTsKKwllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CiAKIAlpZiAoIWVmaV9lbmFibGVkKEVGSV9NRU1NQVApKSB7CiAJCXByX2Vycl9vbmNlKCJFRklfTUVNTUFQIGlzIG5vdCBlbmFibGVkLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmICghbWFwKSB7Ci0JCXByX2Vycl9vbmNlKCJlZmkubWVtbWFwIGlzIG5vdCBzZXQuXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCWlmICghb3V0X21kKSB7CiAJCXByX2Vycl9vbmNlKCJvdXRfbWQgaXMgbnVsbC5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQotCWlmIChXQVJOX09OX09OQ0UoIW1hcC0+cGh5c19tYXApKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoV0FSTl9PTl9PTkNFKG1hcC0+bnJfbWFwID09IDApIHx8IFdBUk5fT05fT05DRShtYXAtPmRlc2Nfc2l6ZSA9PSAwKSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAKLQllID0gbWFwLT5waHlzX21hcCArIG1hcC0+bnJfbWFwICogbWFwLT5kZXNjX3NpemU7Ci0JZm9yIChwID0gbWFwLT5waHlzX21hcDsgcCA8IGU7IHAgKz0gbWFwLT5kZXNjX3NpemUpIHsKLQkJZWZpX21lbW9yeV9kZXNjX3QgKm1kOworCWZvcl9lYWNoX2VmaV9tZW1vcnlfZGVzYyhtZCkgewogCQl1NjQgc2l6ZTsKIAkJdTY0IGVuZDsKIAotCQkvKgotCQkgKiBJZiBhIGRyaXZlciBjYWxscyB0aGlzIGFmdGVyIGVmaV9mcmVlX2Jvb3Rfc2VydmljZXMsCi0JCSAqIC0+bWFwIHdpbGwgYmUgTlVMTCwgYW5kIHRoZSB0YXJnZXQgbWF5IGFsc28gbm90IGJlIG1hcHBlZC4KLQkJICogU28ganVzdCBhbHdheXMgZ2V0IG91ciBvd24gdmlydHVhbCBtYXAgb24gdGhlIENQVS4KLQkJICoKLQkJICovCi0JCW1kID0gZWFybHlfbWVtcmVtYXAocCwgc2l6ZW9mICgqbWQpKTsKLQkJaWYgKCFtZCkgewotCQkJcHJfZXJyX29uY2UoImVhcmx5X21lbXJlbWFwKCVwYSwgJXp1KSBmYWlsZWQuXG4iLAotCQkJCSAgICAmcCwgc2l6ZW9mICgqbWQpKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KIAkJaWYgKCEobWQtPmF0dHJpYnV0ZSAmIEVGSV9NRU1PUllfUlVOVElNRSkgJiYKIAkJICAgIG1kLT50eXBlICE9IEVGSV9CT09UX1NFUlZJQ0VTX0RBVEEgJiYKIAkJICAgIG1kLT50eXBlICE9IEVGSV9SVU5USU1FX1NFUlZJQ0VTX0RBVEEpIHsKLQkJCWVhcmx5X21lbXVubWFwKG1kLCBzaXplb2YgKCptZCkpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtNDA0LDExICszODAsOCBAQAogCQllbmQgPSBtZC0+cGh5c19hZGRyICsgc2l6ZTsKIAkJaWYgKHBoeXNfYWRkciA+PSBtZC0+cGh5c19hZGRyICYmIHBoeXNfYWRkciA8IGVuZCkgewogCQkJbWVtY3B5KG91dF9tZCwgbWQsIHNpemVvZigqb3V0X21kKSk7Ci0JCQllYXJseV9tZW11bm1hcChtZCwgc2l6ZW9mICgqbWQpKTsKIAkJCXJldHVybiAwOwogCQl9Ci0KLQkJZWFybHlfbWVtdW5tYXAobWQsIHNpemVvZiAoKm1kKSk7CiAJfQogCXByX2Vycl9vbmNlKCJyZXF1ZXN0ZWQgbWFwIG5vdCBmb3VuZC5cbiIpOwogCXJldHVybiAtRU5PRU5UOwpAQCAtNDI0LDYgKzM5NywzNSBAQAogCXJldHVybiBlbmQ7CiB9CiAKK3ZvaWQgX19pbml0IF9fd2VhayBlZmlfYXJjaF9tZW1fcmVzZXJ2ZShwaHlzX2FkZHJfdCBhZGRyLCB1NjQgc2l6ZSkge30KKworLyoqCisgKiBlZmlfbWVtX3Jlc2VydmUgLSBSZXNlcnZlIGFuIEVGSSBtZW1vcnkgcmVnaW9uCisgKiBAYWRkcjogUGh5c2ljYWwgYWRkcmVzcyB0byByZXNlcnZlCisgKiBAc2l6ZTogU2l6ZSBvZiByZXNlcnZhdGlvbgorICoKKyAqIE1hcmsgYSByZWdpb24gYXMgcmVzZXJ2ZWQgZnJvbSBnZW5lcmFsIGtlcm5lbCBhbGxvY2F0aW9uIGFuZAorICogcHJldmVudCBpdCBiZWluZyByZWxlYXNlZCBieSBlZmlfZnJlZV9ib290X3NlcnZpY2VzKCkuCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGRyaXZlcnMgb25jZSB0aGV5J3ZlIHBhcnNlZCBFRkkKKyAqIGNvbmZpZ3VyYXRpb24gdGFibGVzIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdGhlaXIgZGF0YSBsaXZlcywgZS5nLgorICogZWZpX2VzcnRfaW5pdCgpLgorICovCit2b2lkIF9faW5pdCBlZmlfbWVtX3Jlc2VydmUocGh5c19hZGRyX3QgYWRkciwgdTY0IHNpemUpCit7CisJaWYgKCFtZW1ibG9ja19pc19yZWdpb25fcmVzZXJ2ZWQoYWRkciwgc2l6ZSkpCisJCW1lbWJsb2NrX3Jlc2VydmUoYWRkciwgc2l6ZSk7CisKKwkvKgorCSAqIFNvbWUgYXJjaGl0ZWN0dXJlcyAoeDg2KSByZXNlcnZlIGFsbCBib290IHNlcnZpY2VzIHJhbmdlcworCSAqIHVudGlsIGVmaV9mcmVlX2Jvb3Rfc2VydmljZXMoKSBiZWNhdXNlIG9mIGJ1Z2d5IGZpcm13YXJlCisJICogaW1wbGVtZW50YXRpb25zLiBUaGlzIG1lYW5zIHRoZSBhYm92ZSBtZW1ibG9ja19yZXNlcnZlKCkgaXMKKwkgKiBzdXBlcmZsdW91cyBvbiB4ODYgYW5kIGluc3RlYWQgd2hhdCBpdCBuZWVkcyB0byBkbyBpcworCSAqIGVuc3VyZSB0aGUgQHN0YXJ0LCBAc2l6ZSBpcyBub3QgZnJlZWQuCisJICovCisJZWZpX2FyY2hfbWVtX3Jlc2VydmUoYWRkciwgc2l6ZSk7Cit9CisKIHN0YXRpYyBfX2luaXRkYXRhIGVmaV9jb25maWdfdGFibGVfdHlwZV90IGNvbW1vbl90YWJsZXNbXSA9IHsKIAl7QUNQSV8yMF9UQUJMRV9HVUlELCAiQUNQSSAyLjAiLCAmZWZpLmFjcGkyMH0sCiAJe0FDUElfVEFCTEVfR1VJRCwgIkFDUEkiLCAmZWZpLmFjcGl9LApAQCAtNjU3LDkgKzY1OSwxMiBAQAogCQl9CiAKIAkJaWYgKHN1Ym5vZGUpIHsKLQkJCW5vZGUgPSBvZl9nZXRfZmxhdF9kdF9zdWJub2RlX2J5X25hbWUobm9kZSwgc3Vibm9kZSk7Ci0JCQlpZiAobm9kZSA8IDApCisJCQlpbnQgZXJyID0gb2ZfZ2V0X2ZsYXRfZHRfc3Vibm9kZV9ieV9uYW1lKG5vZGUsIHN1Ym5vZGUpOworCisJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gMDsKKworCQkJbm9kZSA9IGVycjsKIAkJfQogCiAJCXJldHVybiBfX2ZpbmRfdWVmaV9wYXJhbXMobm9kZSwgaW5mbywgZHRfcGFyYW1zW2ldLnBhcmFtcyk7CkBAIC04MDgsNiArODEzLDkgQEAKIAljYXNlIEVGSV9OT1RfRk9VTkQ6CiAJCWVyciA9IC1FTk9FTlQ7CiAJCWJyZWFrOworCWNhc2UgRUZJX0FCT1JURUQ6CisJCWVyciA9IC1FSU5UUjsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyID0gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZml2YXJzLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZml2YXJzLmMKaW5kZXggMTE2YjI0NC4uM2U2MjZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpdmFycy5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaXZhcnMuYwpAQCAtNTEwLDcgKzUxMCw4IEBACiAJCXZlbmRvciA9IGRlbF92YXItPlZlbmRvckd1aWQ7CiAJfQogCi0JZWZpdmFyX2VudHJ5X2l0ZXJfYmVnaW4oKTsKKwlpZiAoZWZpdmFyX2VudHJ5X2l0ZXJfYmVnaW4oKSkKKwkJcmV0dXJuIC1FSU5UUjsKIAllbnRyeSA9IGVmaXZhcl9lbnRyeV9maW5kKG5hbWUsIHZlbmRvciwgJmVmaXZhcl9zeXNmc19saXN0LCB0cnVlKTsKIAlpZiAoIWVudHJ5KQogCQllcnIgPSAtRUlOVkFMOwpAQCAtNTc1LDcgKzU3NiwxMCBAQAogCQlyZXR1cm4gcmV0OwogCiAJa29iamVjdF91ZXZlbnQoJm5ld192YXItPmtvYmosIEtPQkpfQUREKTsKLQllZml2YXJfZW50cnlfYWRkKG5ld192YXIsICZlZml2YXJfc3lzZnNfbGlzdCk7CisJaWYgKGVmaXZhcl9lbnRyeV9hZGQobmV3X3ZhciwgJmVmaXZhcl9zeXNmc19saXN0KSkgeworCQllZml2YXJfdW5yZWdpc3RlcihuZXdfdmFyKTsKKwkJcmV0dXJuIC1FSU5UUjsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY5MCw3ICs2OTQsMTAgQEAKIAogc3RhdGljIGludCBlZml2YXJfc3lzZnNfZGVzdHJveShzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSwgdm9pZCAqZGF0YSkKIHsKLQllZml2YXJfZW50cnlfcmVtb3ZlKGVudHJ5KTsKKwlpbnQgZXJyID0gZWZpdmFyX2VudHJ5X3JlbW92ZShlbnRyeSk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCWVmaXZhcl91bnJlZ2lzdGVyKGVudHJ5KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTY5OCw3ICs3MDUsMTQgQEAKIHN0YXRpYyB2b2lkIGVmaXZhcnNfc3lzZnNfZXhpdCh2b2lkKQogewogCS8qIFJlbW92ZSBhbGwgZW50cmllcyBhbmQgZGVzdHJveSAqLwotCV9fZWZpdmFyX2VudHJ5X2l0ZXIoZWZpdmFyX3N5c2ZzX2Rlc3Ryb3ksICZlZml2YXJfc3lzZnNfbGlzdCwgTlVMTCwgTlVMTCk7CisJaW50IGVycjsKKworCWVyciA9IF9fZWZpdmFyX2VudHJ5X2l0ZXIoZWZpdmFyX3N5c2ZzX2Rlc3Ryb3ksICZlZml2YXJfc3lzZnNfbGlzdCwKKwkJCQkgIE5VTEwsIE5VTEwpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJlZml2YXJzOiBGYWlsZWQgdG8gZGVzdHJveSBzeXNmcyBlbnRyaWVzXG4iKTsKKwkJcmV0dXJuOworCX0KIAogCWlmIChlZml2YXJzX25ld192YXIpCiAJCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmZWZpdmFyc19rc2V0LT5rb2JqLCBlZml2YXJzX25ld192YXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvZXNydC5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvZXNydC5jCmluZGV4IDc1ZmViM2YuLjE0OTE0MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VzcnQuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lc3J0LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgpAQCAtMjM1LDcgKzIzNiw3IEBACiB9OwogCiAvKgotICogcmVtYXAgdGhlIHRhYmxlLCBjb3B5IGl0IHRvIGttYWxsb2NlZCBwYWdlcywgYW5kIHVubWFwIGl0LgorICogcmVtYXAgdGhlIHRhYmxlLCB2YWxpZGF0ZSBpdCwgbWFyayBpdCByZXNlcnZlZCBhbmQgdW5tYXAgaXQuCiAgKi8KIHZvaWQgX19pbml0IGVmaV9lc3J0X2luaXQodm9pZCkKIHsKQEAgLTMzNSw3ICszMzYsNyBAQAogCiAJZW5kID0gZXNydF9kYXRhICsgc2l6ZTsKIAlwcl9pbmZvKCJSZXNlcnZpbmcgRVNSVCBzcGFjZSBmcm9tICVwYSB0byAlcGEuXG4iLCAmZXNydF9kYXRhLCAmZW5kKTsKLQltZW1ibG9ja19yZXNlcnZlKGVzcnRfZGF0YSwgZXNydF9kYXRhX3NpemUpOworCWVmaV9tZW1fcmVzZXJ2ZShlc3J0X2RhdGEsIGVzcnRfZGF0YV9zaXplKTsKIAogCXByX2RlYnVnKCJlc3J0LWluaXQ6IGxvYWRlZC5cbiIpOwogZXJyX21lbXVubWFwOgpAQCAtMzgyLDI4ICszODMsMTggQEAKIHN0YXRpYyBpbnQgX19pbml0IGVzcnRfc3lzZnNfaW5pdCh2b2lkKQogewogCWludCBlcnJvcjsKLQlzdHJ1Y3QgZWZpX3N5c3RlbV9yZXNvdXJjZV90YWJsZSBfX2lvbWVtICppb2VzcnQ7CiAKIAlwcl9kZWJ1ZygiZXNydC1zeXNmczogbG9hZGluZy5cbiIpOwogCWlmICghZXNydF9kYXRhIHx8ICFlc3J0X2RhdGFfc2l6ZSkKIAkJcmV0dXJuIC1FTk9TWVM7CiAKLQlpb2VzcnQgPSBpb3JlbWFwKGVzcnRfZGF0YSwgZXNydF9kYXRhX3NpemUpOwotCWlmICghaW9lc3J0KSB7Ci0JCXByX2VycigiaW9yZW1hcCglcGEsICV6dSkgZmFpbGVkLlxuIiwgJmVzcnRfZGF0YSwKKwllc3J0ID0gbWVtcmVtYXAoZXNydF9kYXRhLCBlc3J0X2RhdGFfc2l6ZSwgTUVNUkVNQVBfV0IpOworCWlmICghZXNydCkgeworCQlwcl9lcnIoIm1lbXJlbWFwKCVwYSwgJXp1KSBmYWlsZWQuXG4iLCAmZXNydF9kYXRhLAogCQkgICAgICAgZXNydF9kYXRhX3NpemUpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQllc3J0ID0ga21hbGxvYyhlc3J0X2RhdGFfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlc3J0KSB7Ci0JCXByX2Vycigia21hbGxvYyBmYWlsZWQuICh3YW50ZWQgJXp1IGJ5dGVzKVxuIiwgZXNydF9kYXRhX3NpemUpOwotCQlpb3VubWFwKGlvZXNydCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW1lbWNweV9mcm9taW8oZXNydCwgaW9lc3J0LCBlc3J0X2RhdGFfc2l6ZSk7Ci0KIAllc3J0X2tvYmogPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKCJlc3J0IiwgZWZpX2tvYmopOwogCWlmICghZXNydF9rb2JqKSB7CiAJCXByX2VycigiRmlybXdhcmUgdGFibGUgcmVnaXN0cmF0aW9uIGZhaWxlZC5cbiIpOwpAQCAtNDI5LDggKzQyMCw2IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIGVycl9jbGVhbnVwX2xpc3Q7CiAKLQltZW1ibG9ja19yZW1vdmUoZXNydF9kYXRhLCBlc3J0X2RhdGFfc2l6ZSk7Ci0KIAlwcl9kZWJ1ZygiZXNydC1zeXNmczogbG9hZGVkLlxuIik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2Zha2VfbWVtLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9mYWtlX21lbS5jCmluZGV4IDQ4NDMwYWIuLjUyMGE0MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2Zha2VfbWVtLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvZmFrZV9tZW0uYwpAQCAtMzUsMTcgKzM1LDEzIEBACiAKICNkZWZpbmUgRUZJX01BWF9GQUtFTUVNIENPTkZJR19FRklfTUFYX0ZBS0VfTUVNCiAKLXN0cnVjdCBmYWtlX21lbSB7Ci0Jc3RydWN0IHJhbmdlIHJhbmdlOwotCXU2NCBhdHRyaWJ1dGU7Ci19Owotc3RhdGljIHN0cnVjdCBmYWtlX21lbSBmYWtlX21lbXNbRUZJX01BWF9GQUtFTUVNXTsKK3N0YXRpYyBzdHJ1Y3QgZWZpX21lbV9yYW5nZSBmYWtlX21lbXNbRUZJX01BWF9GQUtFTUVNXTsKIHN0YXRpYyBpbnQgbnJfZmFrZV9tZW07CiAKIHN0YXRpYyBpbnQgX19pbml0IGNtcF9mYWtlX21lbShjb25zdCB2b2lkICp4MSwgY29uc3Qgdm9pZCAqeDIpCiB7Ci0JY29uc3Qgc3RydWN0IGZha2VfbWVtICptMSA9IHgxOwotCWNvbnN0IHN0cnVjdCBmYWtlX21lbSAqbTIgPSB4MjsKKwljb25zdCBzdHJ1Y3QgZWZpX21lbV9yYW5nZSAqbTEgPSB4MTsKKwljb25zdCBzdHJ1Y3QgZWZpX21lbV9yYW5nZSAqbTIgPSB4MjsKIAogCWlmIChtMS0+cmFuZ2Uuc3RhcnQgPCBtMi0+cmFuZ2Uuc3RhcnQpCiAJCXJldHVybiAtMTsKQEAgLTU2LDQwICs1MiwyMSBAQAogCiB2b2lkIF9faW5pdCBlZmlfZmFrZV9tZW1tYXAodm9pZCkKIHsKLQl1NjQgc3RhcnQsIGVuZCwgbV9zdGFydCwgbV9lbmQsIG1fYXR0cjsKIAlpbnQgbmV3X25yX21hcCA9IGVmaS5tZW1tYXAubnJfbWFwOwogCWVmaV9tZW1vcnlfZGVzY190ICptZDsKIAlwaHlzX2FkZHJfdCBuZXdfbWVtbWFwX3BoeTsKIAl2b2lkICpuZXdfbWVtbWFwOwotCXZvaWQgKm9sZCwgKm5ldzsKIAlpbnQgaTsKIAotCWlmICghbnJfZmFrZV9tZW0gfHwgIWVmaV9lbmFibGVkKEVGSV9NRU1NQVApKQorCWlmICghbnJfZmFrZV9tZW0pCiAJCXJldHVybjsKIAogCS8qIGNvdW50IHVwIHRoZSBudW1iZXIgb2YgRUZJIG1lbW9yeSBkZXNjcmlwdG9yICovCi0JZm9yX2VhY2hfZWZpX21lbW9yeV9kZXNjKG1kKSB7Ci0JCXN0YXJ0ID0gbWQtPnBoeXNfYWRkcjsKLQkJZW5kID0gc3RhcnQgKyAobWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCkgLSAxOworCWZvciAoaSA9IDA7IGkgPCBucl9mYWtlX21lbTsgaSsrKSB7CisJCWZvcl9lYWNoX2VmaV9tZW1vcnlfZGVzYyhtZCkgeworCQkJc3RydWN0IHJhbmdlICpyID0gJmZha2VfbWVtc1tpXS5yYW5nZTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgbnJfZmFrZV9tZW07IGkrKykgewotCQkJLyogbW9kaWZ5aW5nIHJhbmdlICovCi0JCQltX3N0YXJ0ID0gZmFrZV9tZW1zW2ldLnJhbmdlLnN0YXJ0OwotCQkJbV9lbmQgPSBmYWtlX21lbXNbaV0ucmFuZ2UuZW5kOwotCi0JCQlpZiAobV9zdGFydCA8PSBzdGFydCkgewotCQkJCS8qIHNwbGl0IGludG8gMiBwYXJ0cyAqLwotCQkJCWlmIChzdGFydCA8IG1fZW5kICYmIG1fZW5kIDwgZW5kKQotCQkJCQluZXdfbnJfbWFwKys7Ci0JCQl9Ci0JCQlpZiAoc3RhcnQgPCBtX3N0YXJ0ICYmIG1fc3RhcnQgPCBlbmQpIHsKLQkJCQkvKiBzcGxpdCBpbnRvIDMgcGFydHMgKi8KLQkJCQlpZiAobV9lbmQgPCBlbmQpCi0JCQkJCW5ld19ucl9tYXAgKz0gMjsKLQkJCQkvKiBzcGxpdCBpbnRvIDIgcGFydHMgKi8KLQkJCQlpZiAoZW5kIDw9IG1fZW5kKQotCQkJCQluZXdfbnJfbWFwKys7Ci0JCQl9CisJCQluZXdfbnJfbWFwICs9IGVmaV9tZW1tYXBfc3BsaXRfY291bnQobWQsIHIpOwogCQl9CiAJfQogCkBAIC0xMDcsODUgKzg0LDEzIEBACiAJCXJldHVybjsKIAl9CiAKLQlmb3IgKG9sZCA9IGVmaS5tZW1tYXAubWFwLCBuZXcgPSBuZXdfbWVtbWFwOwotCSAgICAgb2xkIDwgZWZpLm1lbW1hcC5tYXBfZW5kOwotCSAgICAgb2xkICs9IGVmaS5tZW1tYXAuZGVzY19zaXplLCBuZXcgKz0gZWZpLm1lbW1hcC5kZXNjX3NpemUpIHsKLQotCQkvKiBjb3B5IG9yaWdpbmFsIEVGSSBtZW1vcnkgZGVzY3JpcHRvciAqLwotCQltZW1jcHkobmV3LCBvbGQsIGVmaS5tZW1tYXAuZGVzY19zaXplKTsKLQkJbWQgPSBuZXc7Ci0JCXN0YXJ0ID0gbWQtPnBoeXNfYWRkcjsKLQkJZW5kID0gbWQtPnBoeXNfYWRkciArIChtZC0+bnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKSAtIDE7Ci0KLQkJZm9yIChpID0gMDsgaSA8IG5yX2Zha2VfbWVtOyBpKyspIHsKLQkJCS8qIG1vZGlmeWluZyByYW5nZSAqLwotCQkJbV9zdGFydCA9IGZha2VfbWVtc1tpXS5yYW5nZS5zdGFydDsKLQkJCW1fZW5kID0gZmFrZV9tZW1zW2ldLnJhbmdlLmVuZDsKLQkJCW1fYXR0ciA9IGZha2VfbWVtc1tpXS5hdHRyaWJ1dGU7Ci0KLQkJCWlmIChtX3N0YXJ0IDw9IHN0YXJ0ICYmIGVuZCA8PSBtX2VuZCkKLQkJCQltZC0+YXR0cmlidXRlIHw9IG1fYXR0cjsKLQotCQkJaWYgKG1fc3RhcnQgPD0gc3RhcnQgJiYKLQkJCSAgICAoc3RhcnQgPCBtX2VuZCAmJiBtX2VuZCA8IGVuZCkpIHsKLQkJCQkvKiBmaXJzdCBwYXJ0ICovCi0JCQkJbWQtPmF0dHJpYnV0ZSB8PSBtX2F0dHI7Ci0JCQkJbWQtPm51bV9wYWdlcyA9IChtX2VuZCAtIG1kLT5waHlzX2FkZHIgKyAxKSA+PgotCQkJCQlFRklfUEFHRV9TSElGVDsKLQkJCQkvKiBsYXR0ZXIgcGFydCAqLwotCQkJCW5ldyArPSBlZmkubWVtbWFwLmRlc2Nfc2l6ZTsKLQkJCQltZW1jcHkobmV3LCBvbGQsIGVmaS5tZW1tYXAuZGVzY19zaXplKTsKLQkJCQltZCA9IG5ldzsKLQkJCQltZC0+cGh5c19hZGRyID0gbV9lbmQgKyAxOwotCQkJCW1kLT5udW1fcGFnZXMgPSAoZW5kIC0gbWQtPnBoeXNfYWRkciArIDEpID4+Ci0JCQkJCUVGSV9QQUdFX1NISUZUOwotCQkJfQotCi0JCQlpZiAoKHN0YXJ0IDwgbV9zdGFydCAmJiBtX3N0YXJ0IDwgZW5kKSAmJiBtX2VuZCA8IGVuZCkgewotCQkJCS8qIGZpcnN0IHBhcnQgKi8KLQkJCQltZC0+bnVtX3BhZ2VzID0gKG1fc3RhcnQgLSBtZC0+cGh5c19hZGRyKSA+PgotCQkJCQlFRklfUEFHRV9TSElGVDsKLQkJCQkvKiBtaWRkbGUgcGFydCAqLwotCQkJCW5ldyArPSBlZmkubWVtbWFwLmRlc2Nfc2l6ZTsKLQkJCQltZW1jcHkobmV3LCBvbGQsIGVmaS5tZW1tYXAuZGVzY19zaXplKTsKLQkJCQltZCA9IG5ldzsKLQkJCQltZC0+YXR0cmlidXRlIHw9IG1fYXR0cjsKLQkJCQltZC0+cGh5c19hZGRyID0gbV9zdGFydDsKLQkJCQltZC0+bnVtX3BhZ2VzID0gKG1fZW5kIC0gbV9zdGFydCArIDEpID4+Ci0JCQkJCUVGSV9QQUdFX1NISUZUOwotCQkJCS8qIGxhc3QgcGFydCAqLwotCQkJCW5ldyArPSBlZmkubWVtbWFwLmRlc2Nfc2l6ZTsKLQkJCQltZW1jcHkobmV3LCBvbGQsIGVmaS5tZW1tYXAuZGVzY19zaXplKTsKLQkJCQltZCA9IG5ldzsKLQkJCQltZC0+cGh5c19hZGRyID0gbV9lbmQgKyAxOwotCQkJCW1kLT5udW1fcGFnZXMgPSAoZW5kIC0gbV9lbmQpID4+Ci0JCQkJCUVGSV9QQUdFX1NISUZUOwotCQkJfQotCi0JCQlpZiAoKHN0YXJ0IDwgbV9zdGFydCAmJiBtX3N0YXJ0IDwgZW5kKSAmJgotCQkJICAgIChlbmQgPD0gbV9lbmQpKSB7Ci0JCQkJLyogZmlyc3QgcGFydCAqLwotCQkJCW1kLT5udW1fcGFnZXMgPSAobV9zdGFydCAtIG1kLT5waHlzX2FkZHIpID4+Ci0JCQkJCUVGSV9QQUdFX1NISUZUOwotCQkJCS8qIGxhdHRlciBwYXJ0ICovCi0JCQkJbmV3ICs9IGVmaS5tZW1tYXAuZGVzY19zaXplOwotCQkJCW1lbWNweShuZXcsIG9sZCwgZWZpLm1lbW1hcC5kZXNjX3NpemUpOwotCQkJCW1kID0gbmV3OwotCQkJCW1kLT5waHlzX2FkZHIgPSBtX3N0YXJ0OwotCQkJCW1kLT5udW1fcGFnZXMgPSAoZW5kIC0gbWQtPnBoeXNfYWRkciArIDEpID4+Ci0JCQkJCUVGSV9QQUdFX1NISUZUOwotCQkJCW1kLT5hdHRyaWJ1dGUgfD0gbV9hdHRyOwotCQkJfQotCQl9Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBucl9mYWtlX21lbTsgaSsrKQorCQllZmlfbWVtbWFwX2luc2VydCgmZWZpLm1lbW1hcCwgbmV3X21lbW1hcCwgJmZha2VfbWVtc1tpXSk7CiAKIAkvKiBzd2FwIGludG8gbmV3IEVGSSBtZW1tYXAgKi8KLQllZmlfdW5tYXBfbWVtbWFwKCk7Ci0JZWZpLm1lbW1hcC5tYXAgPSBuZXdfbWVtbWFwOwotCWVmaS5tZW1tYXAucGh5c19tYXAgPSBuZXdfbWVtbWFwX3BoeTsKLQllZmkubWVtbWFwLm5yX21hcCA9IG5ld19ucl9tYXA7Ci0JZWZpLm1lbW1hcC5tYXBfZW5kID0gZWZpLm1lbW1hcC5tYXAgKyBlZmkubWVtbWFwLm5yX21hcCAqIGVmaS5tZW1tYXAuZGVzY19zaXplOwotCXNldF9iaXQoRUZJX01FTU1BUCwgJmVmaS5mbGFncyk7CisJZWFybHlfbWVtdW5tYXAobmV3X21lbW1hcCwgZWZpLm1lbW1hcC5kZXNjX3NpemUgKiBuZXdfbnJfbWFwKTsKKworCWVmaV9tZW1tYXBfaW5zdGFsbChuZXdfbWVtbWFwX3BoeSwgbmV3X25yX21hcCk7CiAKIAkvKiBwcmludCBuZXcgRUZJIG1lbW1hcCAqLwogCWVmaV9wcmludF9tZW1tYXAoKTsKQEAgLTIyMyw3ICsxMjgsNyBAQAogCQkJcCsrOwogCX0KIAotCXNvcnQoZmFrZV9tZW1zLCBucl9mYWtlX21lbSwgc2l6ZW9mKHN0cnVjdCBmYWtlX21lbSksCisJc29ydChmYWtlX21lbXMsIG5yX2Zha2VfbWVtLCBzaXplb2Yoc3RydWN0IGVmaV9tZW1fcmFuZ2UpLAogCSAgICAgY21wX2Zha2VfbWVtLCBOVUxMKTsKIAogCWZvciAoaSA9IDA7IGkgPCBucl9mYWtlX21lbTsgaSsrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvbGlic3R1Yi9lZmktc3R1Yi1oZWxwZXIuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2xpYnN0dWIvZWZpLXN0dWItaGVscGVyLmMKaW5kZXggM2JkMTI3ZjkuLmFkZWQxMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2xpYnN0dWIvZWZpLXN0dWItaGVscGVyLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvbGlic3R1Yi9lZmktc3R1Yi1oZWxwZXIuYwpAQCAtNDEsNiArNDEsOCBAQAogI2RlZmluZSBFRklfQUxMT0NfQUxJR04JCUVGSV9QQUdFX1NJWkUKICNlbmRpZgogCisjZGVmaW5lIEVGSV9NTUFQX05SX1NMQUNLX1NMT1RTCTgKKwogc3RydWN0IGZpbGVfaW5mbyB7CiAJZWZpX2ZpbGVfaGFuZGxlX3QgKmhhbmRsZTsKIAl1NjQgc2l6ZTsKQEAgLTYzLDQ5ICs2NSw2MiBAQAogCX0KIH0KIAorc3RhdGljIGlubGluZSBib29sIG1tYXBfaGFzX2hlYWRyb29tKHVuc2lnbmVkIGxvbmcgYnVmZl9zaXplLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBtYXBfc2l6ZSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZGVzY19zaXplKQoreworCXVuc2lnbmVkIGxvbmcgc2xhY2sgPSBidWZmX3NpemUgLSBtYXBfc2l6ZTsKKworCXJldHVybiBzbGFjayAvIGRlc2Nfc2l6ZSA+PSBFRklfTU1BUF9OUl9TTEFDS19TTE9UUzsKK30KKwogZWZpX3N0YXR1c190IGVmaV9nZXRfbWVtb3J5X21hcChlZmlfc3lzdGVtX3RhYmxlX3QgKnN5c190YWJsZV9hcmcsCi0JCQkJZWZpX21lbW9yeV9kZXNjX3QgKiptYXAsCi0JCQkJdW5zaWduZWQgbG9uZyAqbWFwX3NpemUsCi0JCQkJdW5zaWduZWQgbG9uZyAqZGVzY19zaXplLAotCQkJCXUzMiAqZGVzY192ZXIsCi0JCQkJdW5zaWduZWQgbG9uZyAqa2V5X3B0cikKKwkJCQlzdHJ1Y3QgZWZpX2Jvb3RfbWVtbWFwICptYXApCiB7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm0gPSBOVUxMOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBrZXk7CiAJdTMyIGRlc2NfdmVyc2lvbjsKIAotCSptYXBfc2l6ZSA9IHNpemVvZigqbSkgKiAzMjsKKwkqbWFwLT5kZXNjX3NpemUgPQlzaXplb2YoKm0pOworCSptYXAtPm1hcF9zaXplID0JKm1hcC0+ZGVzY19zaXplICogMzI7CisJKm1hcC0+YnVmZl9zaXplID0JKm1hcC0+bWFwX3NpemU7CiBhZ2FpbjoKLQkvKgotCSAqIEFkZCBhbiBhZGRpdGlvbmFsIGVmaV9tZW1vcnlfZGVzY190IGJlY2F1c2Ugd2UncmUgZG9pbmcgYW4KLQkgKiBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSBpbiBhIG5ldyBkZXNjcmlwdG9yIHJlZ2lvbi4KLQkgKi8KLQkqbWFwX3NpemUgKz0gc2l6ZW9mKCptKTsKIAlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShhbGxvY2F0ZV9wb29sLCBFRklfTE9BREVSX0RBVEEsCi0JCQkJKm1hcF9zaXplLCAodm9pZCAqKikmbSk7CisJCQkJKm1hcC0+bWFwX3NpemUsICh2b2lkICoqKSZtKTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQlnb3RvIGZhaWw7CiAKLQkqZGVzY19zaXplID0gMDsKKwkqbWFwLT5kZXNjX3NpemUgPSAwOwogCWtleSA9IDA7Ci0Jc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoZ2V0X21lbW9yeV9tYXAsIG1hcF9zaXplLCBtLAotCQkJCSZrZXksIGRlc2Nfc2l6ZSwgJmRlc2NfdmVyc2lvbik7Ci0JaWYgKHN0YXR1cyA9PSBFRklfQlVGRkVSX1RPT19TTUFMTCkgeworCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGdldF9tZW1vcnlfbWFwLCBtYXAtPm1hcF9zaXplLCBtLAorCQkJCSZrZXksIG1hcC0+ZGVzY19zaXplLCAmZGVzY192ZXJzaW9uKTsKKwlpZiAoc3RhdHVzID09IEVGSV9CVUZGRVJfVE9PX1NNQUxMIHx8CisJICAgICFtbWFwX2hhc19oZWFkcm9vbSgqbWFwLT5idWZmX3NpemUsICptYXAtPm1hcF9zaXplLAorCQkJICAgICAgICptYXAtPmRlc2Nfc2l6ZSkpIHsKIAkJZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCBtKTsKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZXJlIGlzIHNvbWUgZW50cmllcyBvZiBoZWFkcm9vbSBzbyB0aGF0IHRoZQorCQkgKiBidWZmZXIgY2FuIGJlIHJldXNlZCBmb3IgYSBuZXcgbWFwIGFmdGVyIGFsbG9jYXRpb25zIGFyZQorCQkgKiBubyBsb25nZXIgcGVybWl0dGVkLiAgSXRzIHVubGlrZWx5IHRoYXQgdGhlIG1hcCB3aWxsIGdyb3cgdG8KKwkJICogZXhjZWVkIHRoaXMgaGVhZHJvb20gb25jZSB3ZSBhcmUgcmVhZHkgdG8gdHJpZ2dlcgorCQkgKiBFeGl0Qm9vdFNlcnZpY2VzKCkKKwkJICovCisJCSptYXAtPm1hcF9zaXplICs9ICptYXAtPmRlc2Nfc2l6ZSAqIEVGSV9NTUFQX05SX1NMQUNLX1NMT1RTOworCQkqbWFwLT5idWZmX3NpemUgPSAqbWFwLT5tYXBfc2l6ZTsKIAkJZ290byBhZ2FpbjsKIAl9CiAKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQllZmlfY2FsbF9lYXJseShmcmVlX3Bvb2wsIG0pOwogCi0JaWYgKGtleV9wdHIgJiYgc3RhdHVzID09IEVGSV9TVUNDRVNTKQotCQkqa2V5X3B0ciA9IGtleTsKLQlpZiAoZGVzY192ZXIgJiYgc3RhdHVzID09IEVGSV9TVUNDRVNTKQotCQkqZGVzY192ZXIgPSBkZXNjX3ZlcnNpb247CisJaWYgKG1hcC0+a2V5X3B0ciAmJiBzdGF0dXMgPT0gRUZJX1NVQ0NFU1MpCisJCSptYXAtPmtleV9wdHIgPSBrZXk7CisJaWYgKG1hcC0+ZGVzY192ZXIgJiYgc3RhdHVzID09IEVGSV9TVUNDRVNTKQorCQkqbWFwLT5kZXNjX3ZlciA9IGRlc2NfdmVyc2lvbjsKIAogZmFpbDoKLQkqbWFwID0gbTsKKwkqbWFwLT5tYXAgPSBtOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTExMywxMyArMTI4LDIwIEBACiB1bnNpZ25lZCBsb25nIGdldF9kcmFtX2Jhc2UoZWZpX3N5c3RlbV90YWJsZV90ICpzeXNfdGFibGVfYXJnKQogewogCWVmaV9zdGF0dXNfdCBzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZyBtYXBfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG1hcF9zaXplLCBidWZmX3NpemU7CiAJdW5zaWduZWQgbG9uZyBtZW1iYXNlICA9IEVGSV9FUlJPUjsKIAlzdHJ1Y3QgZWZpX21lbW9yeV9tYXAgbWFwOwogCWVmaV9tZW1vcnlfZGVzY190ICptZDsKKwlzdHJ1Y3QgZWZpX2Jvb3RfbWVtbWFwIGJvb3RfbWFwOwogCi0Jc3RhdHVzID0gZWZpX2dldF9tZW1vcnlfbWFwKHN5c190YWJsZV9hcmcsIChlZmlfbWVtb3J5X2Rlc2NfdCAqKikmbWFwLm1hcCwKLQkJCQkgICAgJm1hcF9zaXplLCAmbWFwLmRlc2Nfc2l6ZSwgTlVMTCwgTlVMTCk7CisJYm9vdF9tYXAubWFwID0JCShlZmlfbWVtb3J5X2Rlc2NfdCAqKikmbWFwLm1hcDsKKwlib290X21hcC5tYXBfc2l6ZSA9CSZtYXBfc2l6ZTsKKwlib290X21hcC5kZXNjX3NpemUgPQkmbWFwLmRlc2Nfc2l6ZTsKKwlib290X21hcC5kZXNjX3ZlciA9CU5VTEw7CisJYm9vdF9tYXAua2V5X3B0ciA9CU5VTEw7CisJYm9vdF9tYXAuYnVmZl9zaXplID0JJmJ1ZmZfc2l6ZTsKKworCXN0YXR1cyA9IGVmaV9nZXRfbWVtb3J5X21hcChzeXNfdGFibGVfYXJnLCAmYm9vdF9tYXApOwogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCiAJCXJldHVybiBtZW1iYXNlOwogCkBAIC0xNDQsMTUgKzE2NiwyMiBAQAogCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbiwKIAkJCSAgICB1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBsb25nIG1heCkKIHsKLQl1bnNpZ25lZCBsb25nIG1hcF9zaXplLCBkZXNjX3NpemU7CisJdW5zaWduZWQgbG9uZyBtYXBfc2l6ZSwgZGVzY19zaXplLCBidWZmX3NpemU7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm1hcDsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7CiAJdTY0IG1heF9hZGRyID0gMDsKIAlpbnQgaTsKKwlzdHJ1Y3QgZWZpX2Jvb3RfbWVtbWFwIGJvb3RfbWFwOwogCi0Jc3RhdHVzID0gZWZpX2dldF9tZW1vcnlfbWFwKHN5c190YWJsZV9hcmcsICZtYXAsICZtYXBfc2l6ZSwgJmRlc2Nfc2l6ZSwKLQkJCQkgICAgTlVMTCwgTlVMTCk7CisJYm9vdF9tYXAubWFwID0JCSZtYXA7CisJYm9vdF9tYXAubWFwX3NpemUgPQkmbWFwX3NpemU7CisJYm9vdF9tYXAuZGVzY19zaXplID0JJmRlc2Nfc2l6ZTsKKwlib290X21hcC5kZXNjX3ZlciA9CU5VTEw7CisJYm9vdF9tYXAua2V5X3B0ciA9CU5VTEw7CisJYm9vdF9tYXAuYnVmZl9zaXplID0JJmJ1ZmZfc2l6ZTsKKworCXN0YXR1cyA9IGVmaV9nZXRfbWVtb3J5X21hcChzeXNfdGFibGVfYXJnLCAmYm9vdF9tYXApOwogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCiAJCWdvdG8gZmFpbDsKIApAQCAtMjMwLDE0ICsyNTksMjEgQEAKIAkJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbiwKIAkJCSAgIHVuc2lnbmVkIGxvbmcgKmFkZHIpCiB7Ci0JdW5zaWduZWQgbG9uZyBtYXBfc2l6ZSwgZGVzY19zaXplOworCXVuc2lnbmVkIGxvbmcgbWFwX3NpemUsIGRlc2Nfc2l6ZSwgYnVmZl9zaXplOwogCWVmaV9tZW1vcnlfZGVzY190ICptYXA7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwogCWludCBpOworCXN0cnVjdCBlZmlfYm9vdF9tZW1tYXAgYm9vdF9tYXA7CiAKLQlzdGF0dXMgPSBlZmlfZ2V0X21lbW9yeV9tYXAoc3lzX3RhYmxlX2FyZywgJm1hcCwgJm1hcF9zaXplLCAmZGVzY19zaXplLAotCQkJCSAgICBOVUxMLCBOVUxMKTsKKwlib290X21hcC5tYXAgPQkJJm1hcDsKKwlib290X21hcC5tYXBfc2l6ZSA9CSZtYXBfc2l6ZTsKKwlib290X21hcC5kZXNjX3NpemUgPQkmZGVzY19zaXplOworCWJvb3RfbWFwLmRlc2NfdmVyID0JTlVMTDsKKwlib290X21hcC5rZXlfcHRyID0JTlVMTDsKKwlib290X21hcC5idWZmX3NpemUgPQkmYnVmZl9zaXplOworCisJc3RhdHVzID0gZWZpX2dldF9tZW1vcnlfbWFwKHN5c190YWJsZV9hcmcsICZib290X21hcCk7CiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKIAkJZ290byBmYWlsOwogCkBAIC03MDQsMyArNzQwLDc2IEBACiAJKmNtZF9saW5lX2xlbiA9IG9wdGlvbnNfYnl0ZXM7CiAJcmV0dXJuIChjaGFyICopY21kbGluZV9hZGRyOwogfQorCisvKgorICogSGFuZGxlIGNhbGxpbmcgRXhpdEJvb3RTZXJ2aWNlcyBhY2NvcmRpbmcgdG8gdGhlIHJlcXVpcmVtZW50cyBzZXQgb3V0IGJ5IHRoZQorICogc3BlYy4gIE9idGFpbnMgdGhlIGN1cnJlbnQgbWVtb3J5IG1hcCwgYW5kIHJldHVybnMgdGhhdCBpbmZvIGFmdGVyIGNhbGxpbmcKKyAqIEV4aXRCb290U2VydmljZXMuICBUaGUgY2xpZW50IG11c3Qgc3BlY2lmeSBhIGZ1bmN0aW9uIHRvIHBlcmZvcm0gYW55CisgKiBwcm9jZXNzaW5nIG9mIHRoZSBtZW1vcnkgbWFwIGRhdGEgcHJpb3IgdG8gRXhpdEJvb3RTZXJ2aWNlcy4gIEEgY2xpZW50CisgKiBzcGVjaWZpYyBzdHJ1Y3R1cmUgbWF5IGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gdmlhIHByaXYuICBUaGUgY2xpZW50CisgKiBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgorICovCitlZmlfc3RhdHVzX3QgZWZpX2V4aXRfYm9vdF9zZXJ2aWNlcyhlZmlfc3lzdGVtX3RhYmxlX3QgKnN5c190YWJsZV9hcmcsCisJCQkJICAgIHZvaWQgKmhhbmRsZSwKKwkJCQkgICAgc3RydWN0IGVmaV9ib290X21lbW1hcCAqbWFwLAorCQkJCSAgICB2b2lkICpwcml2LAorCQkJCSAgICBlZmlfZXhpdF9ib290X21hcF9wcm9jZXNzaW5nIHByaXZfZnVuYykKK3sKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCisJc3RhdHVzID0gZWZpX2dldF9tZW1vcnlfbWFwKHN5c190YWJsZV9hcmcsIG1hcCk7CisKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlnb3RvIGZhaWw7CisKKwlzdGF0dXMgPSBwcml2X2Z1bmMoc3lzX3RhYmxlX2FyZywgbWFwLCBwcml2KTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlnb3RvIGZyZWVfbWFwOworCisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoZXhpdF9ib290X3NlcnZpY2VzLCBoYW5kbGUsICptYXAtPmtleV9wdHIpOworCisJaWYgKHN0YXR1cyA9PSBFRklfSU5WQUxJRF9QQVJBTUVURVIpIHsKKwkJLyoKKwkJICogVGhlIG1lbW9yeSBtYXAgY2hhbmdlZCBiZXR3ZWVuIGVmaV9nZXRfbWVtb3J5X21hcCgpIGFuZAorCQkgKiBleGl0X2Jvb3Rfc2VydmljZXMoKS4gIFBlciB0aGUgVUVGSSBTcGVjIHYyLjYsIFNlY3Rpb24gNi40OgorCQkgKiBFRklfQk9PVF9TRVJWSUNFUy5FeGl0Qm9vdFNlcnZpY2VzIHdlIG5lZWQgdG8gZ2V0IHRoZQorCQkgKiB1cGRhdGVkIG1hcCwgYW5kIHRyeSBhZ2Fpbi4gIFRoZSBzcGVjIGltcGxpZXMgb25lIHJldHJ5CisJCSAqIHNob3VsZCBiZSBzdWZmaWNlbnQsIHdoaWNoIGlzIGNvbmZpcm1lZCBhZ2FpbnN0IHRoZSBFREsyCisJCSAqIGltcGxlbWVudGF0aW9uLiAgUGVyIHRoZSBzcGVjLCB3ZSBjYW4gb25seSBpbnZva2UKKwkJICogZ2V0X21lbW9yeV9tYXAoKSBhbmQgZXhpdF9ib290X3NlcnZpY2VzKCkgLSB3ZSBjYW5ub3QgYWxsb2MKKwkJICogc28gZWZpX2dldF9tZW1vcnlfbWFwKCkgY2Fubm90IGJlIHVzZWQsIGFuZCB3ZSBtdXN0IHJldXNlCisJCSAqIHRoZSBidWZmZXIuICBGb3IgYWxsIHByYWN0aWNhbCBwdXJwb3NlcywgdGhlIGhlYWRyb29tIGluIHRoZQorCQkgKiBidWZmZXIgc2hvdWxkIGFjY291bnQgZm9yIGFueSBjaGFuZ2VzIGluIHRoZSBtYXAgc28gdGhlIGNhbGwKKwkJICogdG8gZ2V0X21lbW9yeV9tYXAoKSBpcyBleHBlY3RlZCB0byBzdWNjZWVkIGhlcmUuCisJCSAqLworCQkqbWFwLT5tYXBfc2l6ZSA9ICptYXAtPmJ1ZmZfc2l6ZTsKKwkJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoZ2V0X21lbW9yeV9tYXAsCisJCQkJCW1hcC0+bWFwX3NpemUsCisJCQkJCSptYXAtPm1hcCwKKwkJCQkJbWFwLT5rZXlfcHRyLAorCQkJCQltYXAtPmRlc2Nfc2l6ZSwKKwkJCQkJbWFwLT5kZXNjX3Zlcik7CisKKwkJLyogZXhpdF9ib290X3NlcnZpY2VzKCkgd2FzIGNhbGxlZCwgdGh1cyBjYW5ub3QgZnJlZSAqLworCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQkJZ290byBmYWlsOworCisJCXN0YXR1cyA9IHByaXZfZnVuYyhzeXNfdGFibGVfYXJnLCBtYXAsIHByaXYpOworCQkvKiBleGl0X2Jvb3Rfc2VydmljZXMoKSB3YXMgY2FsbGVkLCB0aHVzIGNhbm5vdCBmcmVlICovCisJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCQlnb3RvIGZhaWw7CisKKwkJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoZXhpdF9ib290X3NlcnZpY2VzLCBoYW5kbGUsICptYXAtPmtleV9wdHIpOworCX0KKworCS8qIGV4aXRfYm9vdF9zZXJ2aWNlcygpIHdhcyBjYWxsZWQsIHRodXMgY2Fubm90IGZyZWUgKi8KKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlnb3RvIGZhaWw7CisKKwlyZXR1cm4gRUZJX1NVQ0NFU1M7CisKK2ZyZWVfbWFwOgorCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgKm1hcC0+bWFwKTsKK2ZhaWw6CisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2xpYnN0dWIvZmR0LmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9saWJzdHViL2ZkdC5jCmluZGV4IGU1OGFiZmEuLmE2YTkzMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2xpYnN0dWIvZmR0LmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvbGlic3R1Yi9mZHQuYwpAQCAtMTUyLDYgKzE1MiwyNyBAQAogI2RlZmluZSBFRklfRkRUX0FMSUdOIEVGSV9QQUdFX1NJWkUKICNlbmRpZgogCitzdHJ1Y3QgZXhpdF9ib290X3N0cnVjdCB7CisJZWZpX21lbW9yeV9kZXNjX3QgKnJ1bnRpbWVfbWFwOworCWludCAqcnVudGltZV9lbnRyeV9jb3VudDsKK307CisKK3N0YXRpYyBlZmlfc3RhdHVzX3QgZXhpdF9ib290X2Z1bmMoZWZpX3N5c3RlbV90YWJsZV90ICpzeXNfdGFibGVfYXJnLAorCQkJCSAgIHN0cnVjdCBlZmlfYm9vdF9tZW1tYXAgKm1hcCwKKwkJCQkgICB2b2lkICpwcml2KQoreworCXN0cnVjdCBleGl0X2Jvb3Rfc3RydWN0ICpwID0gcHJpdjsKKwkvKgorCSAqIFVwZGF0ZSB0aGUgbWVtb3J5IG1hcCB3aXRoIHZpcnR1YWwgYWRkcmVzc2VzLiBUaGUgZnVuY3Rpb24gd2lsbCBhbHNvCisJICogcG9wdWxhdGUgQHJ1bnRpbWVfbWFwIHdpdGggY29waWVzIG9mIGp1c3QgdGhlIEVGSV9NRU1PUllfUlVOVElNRQorCSAqIGVudHJpZXMgc28gdGhhdCB3ZSBjYW4gcGFzcyBpdCBzdHJhaWdodCB0byBTZXRWaXJ0dWFsQWRkcmVzc01hcCgpCisJICovCisJZWZpX2dldF92aXJ0bWFwKCptYXAtPm1hcCwgKm1hcC0+bWFwX3NpemUsICptYXAtPmRlc2Nfc2l6ZSwKKwkJCXAtPnJ1bnRpbWVfbWFwLCBwLT5ydW50aW1lX2VudHJ5X2NvdW50KTsKKworCXJldHVybiBFRklfU1VDQ0VTUzsKK30KKwogLyoKICAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgYSBuZXcgRkRULCB0aGVuIGFkZCBFRkksIGNvbW1hbmRsaW5lLCBhbmQKICAqIGluaXRyZCByZWxhdGVkIGZpZWxkcyB0byB0aGUgRkRULiAgVGhpcyByb3V0aW5lIGluY3JlYXNlcyB0aGUKQEAgLTE3NSwxMyArMTk2LDIyIEBACiAJCQkJCSAgICB1bnNpZ25lZCBsb25nIGZkdF9hZGRyLAogCQkJCQkgICAgdW5zaWduZWQgbG9uZyBmZHRfc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIG1hcF9zaXplLCBkZXNjX3NpemU7CisJdW5zaWduZWQgbG9uZyBtYXBfc2l6ZSwgZGVzY19zaXplLCBidWZmX3NpemU7CiAJdTMyIGRlc2NfdmVyOwogCXVuc2lnbmVkIGxvbmcgbW1hcF9rZXk7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm1lbW9yeV9tYXAsICpydW50aW1lX21hcDsKIAl1bnNpZ25lZCBsb25nIG5ld19mZHRfc2l6ZTsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCWludCBydW50aW1lX2VudHJ5X2NvdW50ID0gMDsKKwlzdHJ1Y3QgZWZpX2Jvb3RfbWVtbWFwIG1hcDsKKwlzdHJ1Y3QgZXhpdF9ib290X3N0cnVjdCBwcml2OworCisJbWFwLm1hcCA9CSZydW50aW1lX21hcDsKKwltYXAubWFwX3NpemUgPQkmbWFwX3NpemU7CisJbWFwLmRlc2Nfc2l6ZSA9CSZkZXNjX3NpemU7CisJbWFwLmRlc2NfdmVyID0JJmRlc2NfdmVyOworCW1hcC5rZXlfcHRyID0JJm1tYXBfa2V5OworCW1hcC5idWZmX3NpemUgPQkmYnVmZl9zaXplOwogCiAJLyoKIAkgKiBHZXQgYSBjb3B5IG9mIHRoZSBjdXJyZW50IG1lbW9yeSBtYXAgdGhhdCB3ZSB3aWxsIHVzZSB0byBwcmVwYXJlCkBAIC0xODksOCArMjE5LDcgQEAKIAkgKiBzdWJzZXF1ZW50IGFsbG9jYXRpb25zIGFkZGluZyBlbnRyaWVzLCBzaW5jZSB0aGV5IGNvdWxkIG5vdCBhZmZlY3QKIAkgKiB0aGUgbnVtYmVyIG9mIEVGSV9NRU1PUllfUlVOVElNRSByZWdpb25zLgogCSAqLwotCXN0YXR1cyA9IGVmaV9nZXRfbWVtb3J5X21hcChzeXNfdGFibGUsICZydW50aW1lX21hcCwgJm1hcF9zaXplLAotCQkJCSAgICAmZGVzY19zaXplLCAmZGVzY192ZXIsICZtbWFwX2tleSk7CisJc3RhdHVzID0gZWZpX2dldF9tZW1vcnlfbWFwKHN5c190YWJsZSwgJm1hcCk7CiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgewogCQlwcl9lZmlfZXJyKHN5c190YWJsZSwgIlVuYWJsZSB0byByZXRyaWV2ZSBVRUZJIG1lbW9yeSBtYXAuXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKQEAgLTE5OSw2ICsyMjgsNyBAQAogCXByX2VmaShzeXNfdGFibGUsCiAJICAgICAgICJFeGl0aW5nIGJvb3Qgc2VydmljZXMgYW5kIGluc3RhbGxpbmcgdmlydHVhbCBhZGRyZXNzIG1hcC4uLlxuIik7CiAKKwltYXAubWFwID0gJm1lbW9yeV9tYXA7CiAJLyoKIAkgKiBFc3RpbWF0ZSBzaXplIG9mIG5ldyBGRFQsIGFuZCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGl0LiBXZQogCSAqIHdpbGwgYWxsb2NhdGUgYSBiaWdnZXIgYnVmZmVyIGlmIHRoaXMgZW5kcyB1cCBiZWluZyB0b28KQEAgLTIxOCw4ICsyNDgsNyBAQAogCQkgKiB3ZSBjYW4gZ2V0IHRoZSBtZW1vcnkgbWFwIGtleSAgbmVlZGVkIGZvcgogCQkgKiBleGl0X2Jvb3Rfc2VydmljZXMoKS4KIAkJICovCi0JCXN0YXR1cyA9IGVmaV9nZXRfbWVtb3J5X21hcChzeXNfdGFibGUsICZtZW1vcnlfbWFwLCAmbWFwX3NpemUsCi0JCQkJCSAgICAmZGVzY19zaXplLCAmZGVzY192ZXIsICZtbWFwX2tleSk7CisJCXN0YXR1cyA9IGVmaV9nZXRfbWVtb3J5X21hcChzeXNfdGFibGUsICZtYXApOwogCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQkJZ290byBmYWlsX2ZyZWVfbmV3X2ZkdDsKIApAQCAtMjUwLDE2ICsyNzksMTEgQEAKIAkJfQogCX0KIAotCS8qCi0JICogVXBkYXRlIHRoZSBtZW1vcnkgbWFwIHdpdGggdmlydHVhbCBhZGRyZXNzZXMuIFRoZSBmdW5jdGlvbiB3aWxsIGFsc28KLQkgKiBwb3B1bGF0ZSBAcnVudGltZV9tYXAgd2l0aCBjb3BpZXMgb2YganVzdCB0aGUgRUZJX01FTU9SWV9SVU5USU1FCi0JICogZW50cmllcyBzbyB0aGF0IHdlIGNhbiBwYXNzIGl0IHN0cmFpZ2h0IGludG8gU2V0VmlydHVhbEFkZHJlc3NNYXAoKQotCSAqLwotCWVmaV9nZXRfdmlydG1hcChtZW1vcnlfbWFwLCBtYXBfc2l6ZSwgZGVzY19zaXplLCBydW50aW1lX21hcCwKLQkJCSZydW50aW1lX2VudHJ5X2NvdW50KTsKLQotCS8qIE5vdyB3ZSBhcmUgcmVhZHkgdG8gZXhpdF9ib290X3NlcnZpY2VzLiovCi0Jc3RhdHVzID0gc3lzX3RhYmxlLT5ib290dGltZS0+ZXhpdF9ib290X3NlcnZpY2VzKGhhbmRsZSwgbW1hcF9rZXkpOworCXN5c190YWJsZS0+Ym9vdHRpbWUtPmZyZWVfcG9vbChtZW1vcnlfbWFwKTsKKwlwcml2LnJ1bnRpbWVfbWFwID0gcnVudGltZV9tYXA7CisJcHJpdi5ydW50aW1lX2VudHJ5X2NvdW50ID0gJnJ1bnRpbWVfZW50cnlfY291bnQ7CisJc3RhdHVzID0gZWZpX2V4aXRfYm9vdF9zZXJ2aWNlcyhzeXNfdGFibGUsIGhhbmRsZSwgJm1hcCwgJnByaXYsCisJCQkJCWV4aXRfYm9vdF9mdW5jKTsKIAogCWlmIChzdGF0dXMgPT0gRUZJX1NVQ0NFU1MpIHsKIAkJZWZpX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwX3QgKnN2YW07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9saWJzdHViL3JhbmRvbS5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvbGlic3R1Yi9yYW5kb20uYwppbmRleCA1M2Y2ZDNmLi4wYzlmNThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9saWJzdHViL3JhbmRvbS5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2xpYnN0dWIvcmFuZG9tLmMKQEAgLTczLDEyICs3MywyMCBAQAogCQkJICAgICAgdW5zaWduZWQgbG9uZyByYW5kb21fc2VlZCkKIHsKIAl1bnNpZ25lZCBsb25nIG1hcF9zaXplLCBkZXNjX3NpemUsIHRvdGFsX3Nsb3RzID0gMCwgdGFyZ2V0X3Nsb3Q7CisJdW5zaWduZWQgbG9uZyBidWZmX3NpemU7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAllZmlfbWVtb3J5X2Rlc2NfdCAqbWVtb3J5X21hcDsKIAlpbnQgbWFwX29mZnNldDsKKwlzdHJ1Y3QgZWZpX2Jvb3RfbWVtbWFwIG1hcDsKIAotCXN0YXR1cyA9IGVmaV9nZXRfbWVtb3J5X21hcChzeXNfdGFibGVfYXJnLCAmbWVtb3J5X21hcCwgJm1hcF9zaXplLAotCQkJCSAgICAmZGVzY19zaXplLCBOVUxMLCBOVUxMKTsKKwltYXAubWFwID0JJm1lbW9yeV9tYXA7CisJbWFwLm1hcF9zaXplID0JJm1hcF9zaXplOworCW1hcC5kZXNjX3NpemUgPQkmZGVzY19zaXplOworCW1hcC5kZXNjX3ZlciA9CU5VTEw7CisJbWFwLmtleV9wdHIgPQlOVUxMOworCW1hcC5idWZmX3NpemUgPQkmYnVmZl9zaXplOworCisJc3RhdHVzID0gZWZpX2dldF9tZW1vcnlfbWFwKHN5c190YWJsZV9hcmcsICZtYXApOwogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCiAJCXJldHVybiBzdGF0dXM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL21lbW1hcC5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvbWVtbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzZGRlYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL21lbW1hcC5jCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogQ29tbW9uIEVGSSBtZW1vcnkgbWFwIGZ1bmN0aW9ucy4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpICJlZmk6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vZWFybHlfaW9yZW1hcC5oPgorCisvKioKKyAqIF9fZWZpX21lbW1hcF9pbml0IC0gQ29tbW9uIGNvZGUgZm9yIG1hcHBpbmcgdGhlIEVGSSBtZW1vcnkgbWFwCisgKiBAZGF0YTogRUZJIG1lbW9yeSBtYXAgZGF0YQorICogQGxhdGU6IFVzZSBlYXJseSBvciBsYXRlIG1hcHBpbmcgZnVuY3Rpb24/CisgKgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIGZpZ3VyaW5nIG91dCB3aGljaCBmdW5jdGlvbiB0byB1c2UgdG8KKyAqIG1hcCB0aGUgRUZJIG1lbW9yeSBtYXAgaW4gZWZpLm1lbW1hcCBiYXNlZCBvbiBob3cgZmFyIGludG8gdGhlIGJvb3QKKyAqIHdlIGFyZS4KKyAqCisgKiBEdXJpbmcgYm9vdHVwIEBsYXRlIHNob3VsZCBiZSAlZmFsc2Ugc2luY2Ugd2Ugb25seSBoYXZlIGFjY2VzcyB0bworICogdGhlIGVhcmx5X21lbXJlbWFwKigpIGZ1bmN0aW9ucyBhcyB0aGUgdm1hbGxvYyBzcGFjZSBpc24ndCBzZXR1cC4KKyAqIE9uY2UgdGhlIGtlcm5lbCBpcyBmdWxseSBib290ZWQgd2UgY2FuIGZhbGxiYWNrIHRvIHRoZSBtb3JlIHJvYnVzdAorICogbWVtcmVtYXAqKCkgQVBJLgorICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBfX2luaXQKK19fZWZpX21lbW1hcF9pbml0KHN0cnVjdCBlZmlfbWVtb3J5X21hcF9kYXRhICpkYXRhLCBib29sIGxhdGUpCit7CisJc3RydWN0IGVmaV9tZW1vcnlfbWFwIG1hcDsKKwlwaHlzX2FkZHJfdCBwaHlzX21hcDsKKworCWlmIChlZmlfZW5hYmxlZChFRklfUEFSQVZJUlQpKQorCQlyZXR1cm4gMDsKKworCXBoeXNfbWFwID0gZGF0YS0+cGh5c19tYXA7CisKKwlpZiAobGF0ZSkKKwkJbWFwLm1hcCA9IG1lbXJlbWFwKHBoeXNfbWFwLCBkYXRhLT5zaXplLCBNRU1SRU1BUF9XQik7CisJZWxzZQorCQltYXAubWFwID0gZWFybHlfbWVtcmVtYXAocGh5c19tYXAsIGRhdGEtPnNpemUpOworCisJaWYgKCFtYXAubWFwKSB7CisJCXByX2VycigiQ291bGQgbm90IG1hcCB0aGUgbWVtb3J5IG1hcCFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltYXAucGh5c19tYXAgPSBkYXRhLT5waHlzX21hcDsKKwltYXAubnJfbWFwID0gZGF0YS0+c2l6ZSAvIGRhdGEtPmRlc2Nfc2l6ZTsKKwltYXAubWFwX2VuZCA9IG1hcC5tYXAgKyBkYXRhLT5zaXplOworCisJbWFwLmRlc2NfdmVyc2lvbiA9IGRhdGEtPmRlc2NfdmVyc2lvbjsKKwltYXAuZGVzY19zaXplID0gZGF0YS0+ZGVzY19zaXplOworCW1hcC5sYXRlID0gbGF0ZTsKKworCXNldF9iaXQoRUZJX01FTU1BUCwgJmVmaS5mbGFncyk7CisKKwllZmkubWVtbWFwID0gbWFwOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZWZpX21lbW1hcF9pbml0X2Vhcmx5IC0gTWFwIHRoZSBFRkkgbWVtb3J5IG1hcCBkYXRhIHN0cnVjdHVyZQorICogQGRhdGE6IEVGSSBtZW1vcnkgbWFwIGRhdGEKKyAqCisgKiBVc2UgZWFybHlfbWVtcmVtYXAoKSB0byBtYXAgdGhlIHBhc3NlZCBpbiBFRkkgbWVtb3J5IG1hcCBhbmQgYXNzaWduCisgKiBpdCB0byBlZmkubWVtbWFwLgorICovCitpbnQgX19pbml0IGVmaV9tZW1tYXBfaW5pdF9lYXJseShzdHJ1Y3QgZWZpX21lbW9yeV9tYXBfZGF0YSAqZGF0YSkKK3sKKwkvKiBDYW5ub3QgZ28gYmFja3dhcmRzICovCisJV0FSTl9PTihlZmkubWVtbWFwLmxhdGUpOworCisJcmV0dXJuIF9fZWZpX21lbW1hcF9pbml0KGRhdGEsIGZhbHNlKTsKK30KKwordm9pZCBfX2luaXQgZWZpX21lbW1hcF91bm1hcCh2b2lkKQoreworCWlmICghZWZpLm1lbW1hcC5sYXRlKSB7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCQlzaXplID0gZWZpLm1lbW1hcC5kZXNjX3NpemUgKiBlZmkubWVtbWFwLm5yX21hcDsKKwkJZWFybHlfbWVtdW5tYXAoZWZpLm1lbW1hcC5tYXAsIHNpemUpOworCX0gZWxzZSB7CisJCW1lbXVubWFwKGVmaS5tZW1tYXAubWFwKTsKKwl9CisKKwllZmkubWVtbWFwLm1hcCA9IE5VTEw7CisJY2xlYXJfYml0KEVGSV9NRU1NQVAsICZlZmkuZmxhZ3MpOworfQorCisvKioKKyAqIGVmaV9tZW1tYXBfaW5pdF9sYXRlIC0gTWFwIGVmaS5tZW1tYXAgd2l0aCBtZW1yZW1hcCgpCisgKiBAcGh5c19hZGRyOiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBuZXcgRUZJIG1lbW9yeSBtYXAKKyAqIEBzaXplOiBTaXplIGluIGJ5dGVzIG9mIHRoZSBuZXcgRUZJIG1lbW9yeSBtYXAKKyAqCisgKiBTZXR1cCBhIG1hcHBpbmcgb2YgdGhlIEVGSSBtZW1vcnkgbWFwIHVzaW5nIGlvcmVtYXBfY2FjaGUoKS4gVGhpcworICogZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UgdGhlIHZtYWxsb2Mgc3BhY2UgaGFzIGJlZW4KKyAqIHNldHVwIGFuZCBpcyB0aGVyZWZvcmUgbm90IHN1aXRhYmxlIGZvciBjYWxsaW5nIGR1cmluZyBlYXJseSBFRkkKKyAqIGluaXRpYWxpc2UsIGUuZy4gaW4gZWZpX2luaXQoKS4gQWRkaXRpb25hbGx5LCBpdCBleHBlY3RzCisgKiBlZmlfbWVtbWFwX2luaXRfZWFybHkoKSB0byBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQuCisgKgorICogVGhlIHJlYXNvbiB0aGVyZSBhcmUgdHdvIEVGSSBtZW1tYXAgaW5pdGlhbGlzYXRpb24KKyAqIChlZmlfbWVtbWFwX2luaXRfZWFybHkoKSBhbmQgdGhpcyBsYXRlIHZlcnNpb24pIGlzIGJlY2F1c2UgdGhlCisgKiBlYXJseSBFRkkgbWVtbWFwIHNob3VsZCBiZSBleHBsaWNpdGx5IHVubWFwcGVkIG9uY2UgRUZJCisgKiBpbml0aWFsaXNhdGlvbiBpcyBjb21wbGV0ZSBhcyB0aGUgZml4bWFwIHNwYWNlIHVzZWQgdG8gbWFwIHRoZSBFRkkKKyAqIG1lbW1hcCAodmlhIGVhcmx5X21lbXJlbWFwKCkpIGlzIGEgc2NhcmNlIHJlc291cmNlLgorICoKKyAqIFRoaXMgbGF0ZSBtYXBwaW5nIGlzIGludGVuZGVkIHRvIHBlcnNpc3QgZm9yIHRoZSBkdXJhdGlvbiBvZgorICogcnVudGltZSBzbyB0aGF0IHRoaW5ncyBsaWtlIGVmaV9tZW1fZGVzY19sb29rdXAoKSBhbmQKKyAqIGVmaV9tZW1fYXR0cmlidXRlcygpIGFsd2F5cyB3b3JrLgorICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IF9faW5pdCBlZmlfbWVtbWFwX2luaXRfbGF0ZShwaHlzX2FkZHJfdCBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IGVmaV9tZW1vcnlfbWFwX2RhdGEgZGF0YSA9IHsKKwkJLnBoeXNfbWFwID0gYWRkciwKKwkJLnNpemUgPSBzaXplLAorCX07CisKKwkvKiBEaWQgd2UgZm9yZ2V0IHRvIHVubWFwIHRoZSBlYXJseSBFRkkgbWVtbWFwPyAqLworCVdBUk5fT04oZWZpLm1lbW1hcC5tYXApOworCisJLyogV2VyZSB3ZSBhbHJlYWR5IGNhbGxlZD8gKi8KKwlXQVJOX09OKGVmaS5tZW1tYXAubGF0ZSk7CisKKwkvKgorCSAqIEl0IG1ha2VzIG5vIHNlbnNlIHRvIGFsbG93IGNhbGxlcnMgdG8gcmVnaXN0ZXIgZGlmZmVyZW50CisJICogdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIGZpZWxkcy4gQ29weSB0aGVtIG91dCBvZiB0aGUKKwkgKiBleGlzdGluZyBlYXJseSBFRkkgbWVtbWFwLgorCSAqLworCWRhdGEuZGVzY192ZXJzaW9uID0gZWZpLm1lbW1hcC5kZXNjX3ZlcnNpb247CisJZGF0YS5kZXNjX3NpemUgPSBlZmkubWVtbWFwLmRlc2Nfc2l6ZTsKKworCXJldHVybiBfX2VmaV9tZW1tYXBfaW5pdCgmZGF0YSwgdHJ1ZSk7Cit9CisKKy8qKgorICogZWZpX21lbW1hcF9pbnN0YWxsIC0gSW5zdGFsbCBhIG5ldyBFRkkgbWVtb3J5IG1hcCBpbiBlZmkubWVtbWFwCisgKiBAYWRkcjogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IG1hcAorICogQG5yX21hcDogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG1lbW9yeSBtYXAKKyAqCisgKiBVbmxpa2UgZWZpX21lbW1hcF9pbml0XyooKSwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhbGxvdyB0aGUgY2FsbGVyCisgKiB0byBzd2l0Y2ggZnJvbSBlYXJseSB0byBsYXRlIG1hcHBpbmdzLiBJdCBzaW1wbHkgdXNlcyB0aGUgZXhpc3RpbmcKKyAqIG1hcHBpbmcgZnVuY3Rpb24gYW5kIGluc3RhbGxzIHRoZSBuZXcgbWVtbWFwLgorICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IF9faW5pdCBlZmlfbWVtbWFwX2luc3RhbGwocGh5c19hZGRyX3QgYWRkciwgdW5zaWduZWQgaW50IG5yX21hcCkKK3sKKwlzdHJ1Y3QgZWZpX21lbW9yeV9tYXBfZGF0YSBkYXRhOworCisJZWZpX21lbW1hcF91bm1hcCgpOworCisJZGF0YS5waHlzX21hcCA9IGFkZHI7CisJZGF0YS5zaXplID0gZWZpLm1lbW1hcC5kZXNjX3NpemUgKiBucl9tYXA7CisJZGF0YS5kZXNjX3ZlcnNpb24gPSBlZmkubWVtbWFwLmRlc2NfdmVyc2lvbjsKKwlkYXRhLmRlc2Nfc2l6ZSA9IGVmaS5tZW1tYXAuZGVzY19zaXplOworCisJcmV0dXJuIF9fZWZpX21lbW1hcF9pbml0KCZkYXRhLCBlZmkubWVtbWFwLmxhdGUpOworfQorCisvKioKKyAqIGVmaV9tZW1tYXBfc3BsaXRfY291bnQgLSBDb3VudCBudW1iZXIgb2YgYWRkaXRpb25hbCBFRkkgbWVtbWFwIGVudHJpZXMKKyAqIEBtZDogRUZJIG1lbW9yeSBkZXNjcmlwdG9yIHRvIHNwbGl0CisgKiBAcmFuZ2U6IEFkZHJlc3MgcmFuZ2UgKHN0YXJ0LCBlbmQpIHRvIHNwbGl0IGFyb3VuZAorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIEVGSSBtZW1tYXAgZW50cmllcyByZXF1aXJlZCB0bworICogYWNjb21vZGF0ZSBAcmFuZ2UuCisgKi8KK2ludCBfX2luaXQgZWZpX21lbW1hcF9zcGxpdF9jb3VudChlZmlfbWVtb3J5X2Rlc2NfdCAqbWQsIHN0cnVjdCByYW5nZSAqcmFuZ2UpCit7CisJdTY0IG1fc3RhcnQsIG1fZW5kOworCXU2NCBzdGFydCwgZW5kOworCWludCBjb3VudCA9IDA7CisKKwlzdGFydCA9IG1kLT5waHlzX2FkZHI7CisJZW5kID0gc3RhcnQgKyAobWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCkgLSAxOworCisJLyogbW9kaWZ5aW5nIHJhbmdlICovCisJbV9zdGFydCA9IHJhbmdlLT5zdGFydDsKKwltX2VuZCA9IHJhbmdlLT5lbmQ7CisKKwlpZiAobV9zdGFydCA8PSBzdGFydCkgeworCQkvKiBzcGxpdCBpbnRvIDIgcGFydHMgKi8KKwkJaWYgKHN0YXJ0IDwgbV9lbmQgJiYgbV9lbmQgPCBlbmQpCisJCQljb3VudCsrOworCX0KKworCWlmIChzdGFydCA8IG1fc3RhcnQgJiYgbV9zdGFydCA8IGVuZCkgeworCQkvKiBzcGxpdCBpbnRvIDMgcGFydHMgKi8KKwkJaWYgKG1fZW5kIDwgZW5kKQorCQkJY291bnQgKz0gMjsKKwkJLyogc3BsaXQgaW50byAyIHBhcnRzICovCisJCWlmIChlbmQgPD0gbV9lbmQpCisJCQljb3VudCsrOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiBlZmlfbWVtbWFwX2luc2VydCAtIEluc2VydCBhIG1lbW9yeSByZWdpb24gaW4gYW4gRUZJIG1lbW1hcAorICogQG9sZF9tZW1tYXA6IFRoZSBleGlzdGluZyBFRkkgbWVtb3J5IG1hcCBzdHJ1Y3R1cmUKKyAqIEBidWY6IEFkZHJlc3Mgb2YgYnVmZmVyIHRvIHN0b3JlIG5ldyBtYXAKKyAqIEBtZW06IE1lbW9yeSBtYXAgZW50cnkgdG8gaW5zZXJ0CisgKgorICogSXQgaXMgc3VnZ2VzdGVkIHRoYXQgeW91IGNhbGwgZWZpX21lbW1hcF9zcGxpdF9jb3VudCgpIGZpcnN0CisgKiB0byBzZWUgaG93IGxhcmdlIEBidWYgbmVlZHMgdG8gYmUuCisgKi8KK3ZvaWQgX19pbml0IGVmaV9tZW1tYXBfaW5zZXJ0KHN0cnVjdCBlZmlfbWVtb3J5X21hcCAqb2xkX21lbW1hcCwgdm9pZCAqYnVmLAorCQkJICAgICAgc3RydWN0IGVmaV9tZW1fcmFuZ2UgKm1lbSkKK3sKKwl1NjQgbV9zdGFydCwgbV9lbmQsIG1fYXR0cjsKKwllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CisJdTY0IHN0YXJ0LCBlbmQ7CisJdm9pZCAqb2xkLCAqbmV3OworCisJLyogbW9kaWZ5aW5nIHJhbmdlICovCisJbV9zdGFydCA9IG1lbS0+cmFuZ2Uuc3RhcnQ7CisJbV9lbmQgPSBtZW0tPnJhbmdlLmVuZDsKKwltX2F0dHIgPSBtZW0tPmF0dHJpYnV0ZTsKKworCS8qCisJICogVGhlIEVGSSBtZW1vcnkgbWFwIGRlYWxzIHdpdGggcmVnaW9ucyBpbiBFRklfUEFHRV9TSVpFCisJICogdW5pdHMuIEVuc3VyZSB0aGF0IHRoZSByZWdpb24gZGVzY3JpYmVkIGJ5ICdtZW0nIGlzIGFsaWduZWQKKwkgKiBjb3JyZWN0bHkuCisJICovCisJaWYgKCFJU19BTElHTkVEKG1fc3RhcnQsIEVGSV9QQUdFX1NJWkUpIHx8CisJICAgICFJU19BTElHTkVEKG1fZW5kICsgMSwgRUZJX1BBR0VfU0laRSkpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAob2xkID0gb2xkX21lbW1hcC0+bWFwLCBuZXcgPSBidWY7CisJICAgICBvbGQgPCBvbGRfbWVtbWFwLT5tYXBfZW5kOworCSAgICAgb2xkICs9IG9sZF9tZW1tYXAtPmRlc2Nfc2l6ZSwgbmV3ICs9IG9sZF9tZW1tYXAtPmRlc2Nfc2l6ZSkgeworCisJCS8qIGNvcHkgb3JpZ2luYWwgRUZJIG1lbW9yeSBkZXNjcmlwdG9yICovCisJCW1lbWNweShuZXcsIG9sZCwgb2xkX21lbW1hcC0+ZGVzY19zaXplKTsKKwkJbWQgPSBuZXc7CisJCXN0YXJ0ID0gbWQtPnBoeXNfYWRkcjsKKwkJZW5kID0gbWQtPnBoeXNfYWRkciArIChtZC0+bnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKSAtIDE7CisKKwkJaWYgKG1fc3RhcnQgPD0gc3RhcnQgJiYgZW5kIDw9IG1fZW5kKQorCQkJbWQtPmF0dHJpYnV0ZSB8PSBtX2F0dHI7CisKKwkJaWYgKG1fc3RhcnQgPD0gc3RhcnQgJiYKKwkJICAgIChzdGFydCA8IG1fZW5kICYmIG1fZW5kIDwgZW5kKSkgeworCQkJLyogZmlyc3QgcGFydCAqLworCQkJbWQtPmF0dHJpYnV0ZSB8PSBtX2F0dHI7CisJCQltZC0+bnVtX3BhZ2VzID0gKG1fZW5kIC0gbWQtPnBoeXNfYWRkciArIDEpID4+CisJCQkJRUZJX1BBR0VfU0hJRlQ7CisJCQkvKiBsYXR0ZXIgcGFydCAqLworCQkJbmV3ICs9IG9sZF9tZW1tYXAtPmRlc2Nfc2l6ZTsKKwkJCW1lbWNweShuZXcsIG9sZCwgb2xkX21lbW1hcC0+ZGVzY19zaXplKTsKKwkJCW1kID0gbmV3OworCQkJbWQtPnBoeXNfYWRkciA9IG1fZW5kICsgMTsKKwkJCW1kLT5udW1fcGFnZXMgPSAoZW5kIC0gbWQtPnBoeXNfYWRkciArIDEpID4+CisJCQkJRUZJX1BBR0VfU0hJRlQ7CisJCX0KKworCQlpZiAoKHN0YXJ0IDwgbV9zdGFydCAmJiBtX3N0YXJ0IDwgZW5kKSAmJiBtX2VuZCA8IGVuZCkgeworCQkJLyogZmlyc3QgcGFydCAqLworCQkJbWQtPm51bV9wYWdlcyA9IChtX3N0YXJ0IC0gbWQtPnBoeXNfYWRkcikgPj4KKwkJCQlFRklfUEFHRV9TSElGVDsKKwkJCS8qIG1pZGRsZSBwYXJ0ICovCisJCQluZXcgKz0gb2xkX21lbW1hcC0+ZGVzY19zaXplOworCQkJbWVtY3B5KG5ldywgb2xkLCBvbGRfbWVtbWFwLT5kZXNjX3NpemUpOworCQkJbWQgPSBuZXc7CisJCQltZC0+YXR0cmlidXRlIHw9IG1fYXR0cjsKKwkJCW1kLT5waHlzX2FkZHIgPSBtX3N0YXJ0OworCQkJbWQtPm51bV9wYWdlcyA9IChtX2VuZCAtIG1fc3RhcnQgKyAxKSA+PgorCQkJCUVGSV9QQUdFX1NISUZUOworCQkJLyogbGFzdCBwYXJ0ICovCisJCQluZXcgKz0gb2xkX21lbW1hcC0+ZGVzY19zaXplOworCQkJbWVtY3B5KG5ldywgb2xkLCBvbGRfbWVtbWFwLT5kZXNjX3NpemUpOworCQkJbWQgPSBuZXc7CisJCQltZC0+cGh5c19hZGRyID0gbV9lbmQgKyAxOworCQkJbWQtPm51bV9wYWdlcyA9IChlbmQgLSBtX2VuZCkgPj4KKwkJCQlFRklfUEFHRV9TSElGVDsKKwkJfQorCisJCWlmICgoc3RhcnQgPCBtX3N0YXJ0ICYmIG1fc3RhcnQgPCBlbmQpICYmCisJCSAgICAoZW5kIDw9IG1fZW5kKSkgeworCQkJLyogZmlyc3QgcGFydCAqLworCQkJbWQtPm51bV9wYWdlcyA9IChtX3N0YXJ0IC0gbWQtPnBoeXNfYWRkcikgPj4KKwkJCQlFRklfUEFHRV9TSElGVDsKKwkJCS8qIGxhdHRlciBwYXJ0ICovCisJCQluZXcgKz0gb2xkX21lbW1hcC0+ZGVzY19zaXplOworCQkJbWVtY3B5KG5ldywgb2xkLCBvbGRfbWVtbWFwLT5kZXNjX3NpemUpOworCQkJbWQgPSBuZXc7CisJCQltZC0+cGh5c19hZGRyID0gbV9zdGFydDsKKwkJCW1kLT5udW1fcGFnZXMgPSAoZW5kIC0gbWQtPnBoeXNfYWRkciArIDEpID4+CisJCQkJRUZJX1BBR0VfU0hJRlQ7CisJCQltZC0+YXR0cmlidXRlIHw9IG1fYXR0cjsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL3J1bnRpbWUtbWFwLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9ydW50aW1lLW1hcC5jCmluZGV4IDVjNTUyMjcuLjhlNjRiNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL3J1bnRpbWUtbWFwLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvcnVudGltZS1tYXAuYwpAQCAtMTQsMTAgKzE0LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogCi1zdGF0aWMgdm9pZCAqZWZpX3J1bnRpbWVfbWFwOwotc3RhdGljIGludCBucl9lZmlfcnVudGltZV9tYXA7Ci1zdGF0aWMgdTMyIGVmaV9tZW1kZXNjX3NpemU7Ci0KIHN0cnVjdCBlZmlfcnVudGltZV9tYXBfZW50cnkgewogCWVmaV9tZW1vcnlfZGVzY190IG1kOwogCXN0cnVjdCBrb2JqZWN0IGtvYmo7ICAgLyoga29iamVjdCBmb3IgZWFjaCBlbnRyeSAqLwpAQCAtMTA2LDcgKzEwMiw4IEBACiBzdGF0aWMgc3RydWN0IGtzZXQgKm1hcF9rc2V0OwogCiBzdGF0aWMgc3RydWN0IGVmaV9ydW50aW1lX21hcF9lbnRyeSAqCi1hZGRfc3lzZnNfcnVudGltZV9tYXBfZW50cnkoc3RydWN0IGtvYmplY3QgKmtvYmosIGludCBucikKK2FkZF9zeXNmc19ydW50aW1lX21hcF9lbnRyeShzdHJ1Y3Qga29iamVjdCAqa29iaiwgaW50IG5yLAorCQkJICAgIGVmaV9tZW1vcnlfZGVzY190ICptZCkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBlZmlfcnVudGltZV9tYXBfZW50cnkgKmVudHJ5OwpAQCAtMTI0LDggKzEyMSw3IEBACiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIAotCW1lbWNweSgmZW50cnktPm1kLCBlZmlfcnVudGltZV9tYXAgKyBuciAqIGVmaV9tZW1kZXNjX3NpemUsCi0JICAgICAgIHNpemVvZihlZmlfbWVtb3J5X2Rlc2NfdCkpOworCW1lbWNweSgmZW50cnktPm1kLCBtZCwgc2l6ZW9mKGVmaV9tZW1vcnlfZGVzY190KSk7CiAKIAlrb2JqZWN0X2luaXQoJmVudHJ5LT5rb2JqLCAmbWFwX2t0eXBlKTsKIAllbnRyeS0+a29iai5rc2V0ID0gbWFwX2tzZXQ7CkBAIC0xNDIsMTIgKzEzOCwxMiBAQAogCiBpbnQgZWZpX2dldF9ydW50aW1lX21hcF9zaXplKHZvaWQpCiB7Ci0JcmV0dXJuIG5yX2VmaV9ydW50aW1lX21hcCAqIGVmaV9tZW1kZXNjX3NpemU7CisJcmV0dXJuIGVmaS5tZW1tYXAubnJfbWFwICogZWZpLm1lbW1hcC5kZXNjX3NpemU7CiB9CiAKIGludCBlZmlfZ2V0X3J1bnRpbWVfbWFwX2Rlc2Nfc2l6ZSh2b2lkKQogewotCXJldHVybiBlZmlfbWVtZGVzY19zaXplOworCXJldHVybiBlZmkubWVtbWFwLmRlc2Nfc2l6ZTsKIH0KIAogaW50IGVmaV9ydW50aW1lX21hcF9jb3B5KHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1ZnN6KQpAQCAtMTU3LDM4ICsxNTMsMzMgQEAKIAlpZiAoc3ogPiBidWZzeikKIAkJc3ogPSBidWZzejsKIAotCW1lbWNweShidWYsIGVmaV9ydW50aW1lX21hcCwgc3opOworCW1lbWNweShidWYsIGVmaS5tZW1tYXAubWFwLCBzeik7CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgZWZpX3J1bnRpbWVfbWFwX3NldHVwKHZvaWQgKm1hcCwgaW50IG5yX2VudHJpZXMsIHUzMiBkZXNjX3NpemUpCi17Ci0JZWZpX3J1bnRpbWVfbWFwID0gbWFwOwotCW5yX2VmaV9ydW50aW1lX21hcCA9IG5yX2VudHJpZXM7Ci0JZWZpX21lbWRlc2Nfc2l6ZSA9IGRlc2Nfc2l6ZTsKLX0KLQogaW50IF9faW5pdCBlZmlfcnVudGltZV9tYXBfaW5pdChzdHJ1Y3Qga29iamVjdCAqZWZpX2tvYmopCiB7CiAJaW50IGksIGosIHJldCA9IDA7CiAJc3RydWN0IGVmaV9ydW50aW1lX21hcF9lbnRyeSAqZW50cnk7CisJZWZpX21lbW9yeV9kZXNjX3QgKm1kOwogCi0JaWYgKCFlZmlfcnVudGltZV9tYXApCisJaWYgKCFlZmlfZW5hYmxlZChFRklfTUVNTUFQKSkKIAkJcmV0dXJuIDA7CiAKLQltYXBfZW50cmllcyA9IGt6YWxsb2MobnJfZWZpX3J1bnRpbWVfbWFwICogc2l6ZW9mKGVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJbWFwX2VudHJpZXMgPSBremFsbG9jKGVmaS5tZW1tYXAubnJfbWFwICogc2l6ZW9mKGVudHJ5KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtYXBfZW50cmllcykgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnJfZWZpX3J1bnRpbWVfbWFwOyBpKyspIHsKLQkJZW50cnkgPSBhZGRfc3lzZnNfcnVudGltZV9tYXBfZW50cnkoZWZpX2tvYmosIGkpOworCWkgPSAwOworCWZvcl9lYWNoX2VmaV9tZW1vcnlfZGVzYyhtZCkgeworCQllbnRyeSA9IGFkZF9zeXNmc19ydW50aW1lX21hcF9lbnRyeShlZmlfa29iaiwgaSwgbWQpOwogCQlpZiAoSVNfRVJSKGVudHJ5KSkgewogCQkJcmV0ID0gUFRSX0VSUihlbnRyeSk7CiAJCQlnb3RvIG91dF9hZGRfZW50cnk7CiAJCX0KLQkJKihtYXBfZW50cmllcyArIGkpID0gZW50cnk7CisJCSoobWFwX2VudHJpZXMgKyBpKyspID0gZW50cnk7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9ydW50aW1lLXdyYXBwZXJzLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9ydW50aW1lLXdyYXBwZXJzLmMKaW5kZXggNDE5NTg3Ny4uYWU1NDg3MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL3J1bnRpbWUtd3JhcHBlcnMuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9ydW50aW1lLXdyYXBwZXJzLmMKQEAgLTE0LDExICsxNCwxMyBAQAogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2Mi4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpCSJlZmk6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KICNpbmNsdWRlIDxhc20vZWZpLmg+CiAKQEAgLTgxLDIwICs4MywyMSBAQAogICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICoKICAqIER1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBFRkkgcHN0b3JlIG1heSB3cml0ZSB0byB0aGUgdmFyaWFibGUgc3RvcmUgaW4KLSAqIGludGVycnVwdCBjb250ZXh0LCB3ZSBuZWVkIHRvIHVzZSBhIHNwaW5sb2NrIGZvciBhdCBsZWFzdCB0aGUgZ3JvdXBzIHRoYXQKKyAqIGludGVycnVwdCBjb250ZXh0LCB3ZSBuZWVkIHRvIHVzZSBhIGxvY2sgZm9yIGF0IGxlYXN0IHRoZSBncm91cHMgdGhhdAogICogY29udGFpbiBTZXRWYXJpYWJsZSgpIGFuZCBRdWVyeVZhcmlhYmxlSW5mbygpLiBUaGF0IGxlYXZlcyBsaXR0bGUgZWxzZSwgYXMKICAqIG5vbmUgb2YgdGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IGV2ZXIgY2FsbGVkIGF0IHJ1bnRpbWUuCi0gKiBTbyBsZXQncyBqdXN0IHVzZSBhIHNpbmdsZSBzcGlubG9jayB0byBzZXJpYWxpemUgYWxsIFJ1bnRpbWUgU2VydmljZXMgY2FsbHMuCisgKiBTbyBsZXQncyBqdXN0IHVzZSBhIHNpbmdsZSBsb2NrIHRvIHNlcmlhbGl6ZSBhbGwgUnVudGltZSBTZXJ2aWNlcyBjYWxscy4KICAqLwotc3RhdGljIERFRklORV9TUElOTE9DSyhlZmlfcnVudGltZV9sb2NrKTsKK3N0YXRpYyBERUZJTkVfU0VNQVBIT1JFKGVmaV9ydW50aW1lX2xvY2spOwogCiBzdGF0aWMgZWZpX3N0YXR1c190IHZpcnRfZWZpX2dldF90aW1lKGVmaV90aW1lX3QgKnRtLCBlZmlfdGltZV9jYXBfdCAqdGMpCiB7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAotCXNwaW5fbG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpX3J1bnRpbWVfbG9jaykpCisJCXJldHVybiBFRklfQUJPUlRFRDsKIAlzdGF0dXMgPSBlZmlfY2FsbF92aXJ0KGdldF90aW1lLCB0bSwgdGMpOwotCXNwaW5fdW5sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwl1cCgmZWZpX3J1bnRpbWVfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTAyLDkgKzEwNSwxMCBAQAogewogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAKLQlzcGluX2xvY2soJmVmaV9ydW50aW1lX2xvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaV9ydW50aW1lX2xvY2spKQorCQlyZXR1cm4gRUZJX0FCT1JURUQ7CiAJc3RhdHVzID0gZWZpX2NhbGxfdmlydChzZXRfdGltZSwgdG0pOwotCXNwaW5fdW5sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwl1cCgmZWZpX3J1bnRpbWVfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTE0LDkgKzExOCwxMCBAQAogewogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAKLQlzcGluX2xvY2soJmVmaV9ydW50aW1lX2xvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaV9ydW50aW1lX2xvY2spKQorCQlyZXR1cm4gRUZJX0FCT1JURUQ7CiAJc3RhdHVzID0gZWZpX2NhbGxfdmlydChnZXRfd2FrZXVwX3RpbWUsIGVuYWJsZWQsIHBlbmRpbmcsIHRtKTsKLQlzcGluX3VubG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJdXAoJmVmaV9ydW50aW1lX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTEyNCw5ICsxMjksMTAgQEAKIHsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZmlfcnVudGltZV9sb2NrKSkKKwkJcmV0dXJuIEVGSV9BQk9SVEVEOwogCXN0YXR1cyA9IGVmaV9jYWxsX3ZpcnQoc2V0X3dha2V1cF90aW1lLCBlbmFibGVkLCB0bSk7Ci0Jc3Bpbl91bmxvY2soJmVmaV9ydW50aW1lX2xvY2spOworCXVwKCZlZmlfcnVudGltZV9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xMzgsMTAgKzE0NCwxMSBAQAogewogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAKLQlzcGluX2xvY2soJmVmaV9ydW50aW1lX2xvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaV9ydW50aW1lX2xvY2spKQorCQlyZXR1cm4gRUZJX0FCT1JURUQ7CiAJc3RhdHVzID0gZWZpX2NhbGxfdmlydChnZXRfdmFyaWFibGUsIG5hbWUsIHZlbmRvciwgYXR0ciwgZGF0YV9zaXplLAogCQkJICAgICAgIGRhdGEpOwotCXNwaW5fdW5sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwl1cCgmZWZpX3J1bnRpbWVfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTUxLDkgKzE1OCwxMCBAQAogewogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAKLQlzcGluX2xvY2soJmVmaV9ydW50aW1lX2xvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaV9ydW50aW1lX2xvY2spKQorCQlyZXR1cm4gRUZJX0FCT1JURUQ7CiAJc3RhdHVzID0gZWZpX2NhbGxfdmlydChnZXRfbmV4dF92YXJpYWJsZSwgbmFtZV9zaXplLCBuYW1lLCB2ZW5kb3IpOwotCXNwaW5fdW5sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwl1cCgmZWZpX3J1bnRpbWVfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTY1LDEwICsxNzMsMTEgQEAKIHsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZmlfcnVudGltZV9sb2NrKSkKKwkJcmV0dXJuIEVGSV9BQk9SVEVEOwogCXN0YXR1cyA9IGVmaV9jYWxsX3ZpcnQoc2V0X3ZhcmlhYmxlLCBuYW1lLCB2ZW5kb3IsIGF0dHIsIGRhdGFfc2l6ZSwKIAkJCSAgICAgICBkYXRhKTsKLQlzcGluX3VubG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJdXAoJmVmaV9ydW50aW1lX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE3OSwxMiArMTg4LDEyIEBACiB7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAotCWlmICghc3Bpbl90cnlsb2NrKCZlZmlfcnVudGltZV9sb2NrKSkKKwlpZiAoZG93bl90cnlsb2NrKCZlZmlfcnVudGltZV9sb2NrKSkKIAkJcmV0dXJuIEVGSV9OT1RfUkVBRFk7CiAKIAlzdGF0dXMgPSBlZmlfY2FsbF92aXJ0KHNldF92YXJpYWJsZSwgbmFtZSwgdmVuZG9yLCBhdHRyLCBkYXRhX3NpemUsCiAJCQkgICAgICAgZGF0YSk7Ci0Jc3Bpbl91bmxvY2soJmVmaV9ydW50aW1lX2xvY2spOworCXVwKCZlZmlfcnVudGltZV9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xOTksMTAgKzIwOCwxMSBAQAogCWlmIChlZmkucnVudGltZV92ZXJzaW9uIDwgRUZJXzJfMDBfU1lTVEVNX1RBQkxFX1JFVklTSU9OKQogCQlyZXR1cm4gRUZJX1VOU1VQUE9SVEVEOwogCi0Jc3Bpbl9sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZmlfcnVudGltZV9sb2NrKSkKKwkJcmV0dXJuIEVGSV9BQk9SVEVEOwogCXN0YXR1cyA9IGVmaV9jYWxsX3ZpcnQocXVlcnlfdmFyaWFibGVfaW5mbywgYXR0ciwgc3RvcmFnZV9zcGFjZSwKIAkJCSAgICAgICByZW1haW5pbmdfc3BhY2UsIG1heF92YXJpYWJsZV9zaXplKTsKLQlzcGluX3VubG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJdXAoJmVmaV9ydW50aW1lX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTIxNywxMiArMjI3LDEyIEBACiAJaWYgKGVmaS5ydW50aW1lX3ZlcnNpb24gPCBFRklfMl8wMF9TWVNURU1fVEFCTEVfUkVWSVNJT04pCiAJCXJldHVybiBFRklfVU5TVVBQT1JURUQ7CiAKLQlpZiAoIXNwaW5fdHJ5bG9jaygmZWZpX3J1bnRpbWVfbG9jaykpCisJaWYgKGRvd25fdHJ5bG9jaygmZWZpX3J1bnRpbWVfbG9jaykpCiAJCXJldHVybiBFRklfTk9UX1JFQURZOwogCiAJc3RhdHVzID0gZWZpX2NhbGxfdmlydChxdWVyeV92YXJpYWJsZV9pbmZvLCBhdHRyLCBzdG9yYWdlX3NwYWNlLAogCQkJICAgICAgIHJlbWFpbmluZ19zcGFjZSwgbWF4X3ZhcmlhYmxlX3NpemUpOwotCXNwaW5fdW5sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwl1cCgmZWZpX3J1bnRpbWVfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjMwLDkgKzI0MCwxMCBAQAogewogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAKLQlzcGluX2xvY2soJmVmaV9ydW50aW1lX2xvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaV9ydW50aW1lX2xvY2spKQorCQlyZXR1cm4gRUZJX0FCT1JURUQ7CiAJc3RhdHVzID0gZWZpX2NhbGxfdmlydChnZXRfbmV4dF9oaWdoX21vbm9fY291bnQsIGNvdW50KTsKLQlzcGluX3VubG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJdXAoJmVmaV9ydW50aW1lX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTI0MSw5ICsyNTIsMTMgQEAKIAkJCQkgIHVuc2lnbmVkIGxvbmcgZGF0YV9zaXplLAogCQkJCSAgZWZpX2NoYXIxNl90ICpkYXRhKQogewotCXNwaW5fbG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpX3J1bnRpbWVfbG9jaykpIHsKKwkJcHJfd2FybigiZmFpbGVkIHRvIGludm9rZSB0aGUgcmVzZXRfc3lzdGVtKCkgcnVudGltZSBzZXJ2aWNlOlxuIgorCQkJImNvdWxkIG5vdCBnZXQgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgZmlybXdhcmVcbiIpOworCQlyZXR1cm47CisJfQogCV9fZWZpX2NhbGxfdmlydChyZXNldF9zeXN0ZW0sIHJlc2V0X3R5cGUsIHN0YXR1cywgZGF0YV9zaXplLCBkYXRhKTsKLQlzcGluX3VubG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJdXAoJmVmaV9ydW50aW1lX2xvY2spOwogfQogCiBzdGF0aWMgZWZpX3N0YXR1c190IHZpcnRfZWZpX3VwZGF0ZV9jYXBzdWxlKGVmaV9jYXBzdWxlX2hlYWRlcl90ICoqY2Fwc3VsZXMsCkBAIC0yNTUsOSArMjcwLDEwIEBACiAJaWYgKGVmaS5ydW50aW1lX3ZlcnNpb24gPCBFRklfMl8wMF9TWVNURU1fVEFCTEVfUkVWSVNJT04pCiAJCXJldHVybiBFRklfVU5TVVBQT1JURUQ7CiAKLQlzcGluX2xvY2soJmVmaV9ydW50aW1lX2xvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaV9ydW50aW1lX2xvY2spKQorCQlyZXR1cm4gRUZJX0FCT1JURUQ7CiAJc3RhdHVzID0gZWZpX2NhbGxfdmlydCh1cGRhdGVfY2Fwc3VsZSwgY2Fwc3VsZXMsIGNvdW50LCBzZ19saXN0KTsKLQlzcGluX3VubG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJdXAoJmVmaV9ydW50aW1lX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTI3MSwxMCArMjg3LDExIEBACiAJaWYgKGVmaS5ydW50aW1lX3ZlcnNpb24gPCBFRklfMl8wMF9TWVNURU1fVEFCTEVfUkVWSVNJT04pCiAJCXJldHVybiBFRklfVU5TVVBQT1JURUQ7CiAKLQlzcGluX2xvY2soJmVmaV9ydW50aW1lX2xvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaV9ydW50aW1lX2xvY2spKQorCQlyZXR1cm4gRUZJX0FCT1JURUQ7CiAJc3RhdHVzID0gZWZpX2NhbGxfdmlydChxdWVyeV9jYXBzdWxlX2NhcHMsIGNhcHN1bGVzLCBjb3VudCwgbWF4X3NpemUsCiAJCQkgICAgICAgcmVzZXRfdHlwZSk7Ci0Jc3Bpbl91bmxvY2soJmVmaV9ydW50aW1lX2xvY2spOworCXVwKCZlZmlfcnVudGltZV9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS90ZXN0L01ha2VmaWxlIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvdGVzdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Q0NTc3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvdGVzdC9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmotJChDT05GSUdfRUZJX1RFU1QpCQkJKz0gZWZpX3Rlc3QubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvdGVzdC9lZmlfdGVzdC5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvdGVzdC9lZmlfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MWJiNTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS90ZXN0L2VmaV90ZXN0LmMKQEAgLTAsMCArMSw3NDkgQEAKKy8qCisgKiBFRkkgVGVzdCBEcml2ZXIgZm9yIFJ1bnRpbWUgU2VydmljZXMKKyAqCisgKiBDb3B5cmlnaHQoQykgMjAxMi0yMDE2IENhbm9uaWNhbCBMdGQuCisgKgorICogVGhpcyBkcml2ZXIgZXhwb3J0cyBFRkkgcnVudGltZSBzZXJ2aWNlcyBpbnRlcmZhY2VzIGludG8gdXNlcnNwYWNlLCB3aGljaAorICogYWxsb3cgdG8gdXNlIGFuZCB0ZXN0IFVFRkkgcnVudGltZSBzZXJ2aWNlcyBwcm92aWRlZCBieSBmaXJtd2FyZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiZWZpX3Rlc3QuaCIKKworTU9EVUxFX0FVVEhPUigiSXZhbiBIdSA8aXZhbi5odUBjYW5vbmljYWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFRkkgVGVzdCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIENvdW50IHRoZSBieXRlcyBpbiAnc3RyJywgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBOVUxMLgorICoKKyAqIE5vdGUgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgKmJ5dGVzKiwgbm90IHRoZSBudW1iZXIgb2YKKyAqIHVjczIgY2hhcmFjdGVycy4KKyAqLworc3RhdGljIGlubGluZSBzaXplX3QgdXNlcl91Y3MyX3N0cnNpemUoZWZpX2NoYXIxNl90ICBfX3VzZXIgKnN0cikKK3sKKwllZmlfY2hhcjE2X3QgKnMgPSBzdHIsIGM7CisJc2l6ZV90IGxlbjsKKworCWlmICghc3RyKQorCQlyZXR1cm4gMDsKKworCS8qIEluY2x1ZGUgdGVybWluYXRpbmcgTlVMTCAqLworCWxlbiA9IHNpemVvZihlZmlfY2hhcjE2X3QpOworCisJaWYgKGdldF91c2VyKGMsIHMrKykpIHsKKwkJLyogQ2FuJ3QgcmVhZCB1c2Vyc3BhY2UgbWVtb3J5IGZvciBzaXplICovCisJCXJldHVybiAwOworCX0KKworCXdoaWxlIChjICE9IDApIHsKKwkJaWYgKGdldF91c2VyKGMsIHMrKykpIHsKKwkJCS8qIENhbid0IHJlYWQgdXNlcnNwYWNlIG1lbW9yeSBmb3Igc2l6ZSAqLworCQkJcmV0dXJuIDA7CisJCX0KKwkJbGVuICs9IHNpemVvZihlZmlfY2hhcjE2X3QpOworCX0KKwlyZXR1cm4gbGVuOworfQorCisvKgorICogQWxsb2NhdGUgYSBidWZmZXIgYW5kIGNvcHkgYSB1Y3MyIHN0cmluZyBmcm9tIHVzZXIgc3BhY2UgaW50byBpdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2NvcHlfdWNzMl9mcm9tX3VzZXJfbGVuKGVmaV9jaGFyMTZfdCAqKmRzdCwgZWZpX2NoYXIxNl90IF9fdXNlciAqc3JjLAorCQkJc2l6ZV90IGxlbikKK3sKKwllZmlfY2hhcjE2X3QgKmJ1ZjsKKworCWlmICghc3JjKSB7CisJCSpkc3QgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgc3JjLCAxKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJKmRzdCA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkqZHN0ID0gYnVmOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCpkc3QsIHNyYywgbGVuKSkgeworCQlrZnJlZShidWYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvdW50IHRoZSBieXRlcyBpbiAnc3RyJywgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBOVUxMLgorICoKKyAqIEp1c3QgYSB3cmFwIGZvciB1c2VyX3VjczJfc3Ryc2l6ZQorICovCitzdGF0aWMgaW5saW5lIGludAorZ2V0X3VjczJfc3Ryc2l6ZV9mcm9tX3VzZXIoZWZpX2NoYXIxNl90IF9fdXNlciAqc3JjLCBzaXplX3QgKmxlbikKK3sKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgc3JjLCAxKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkqbGVuID0gdXNlcl91Y3MyX3N0cnNpemUoc3JjKTsKKwlpZiAoKmxlbiA9PSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSByZXF1aXJlZCBidWZmZXIgYWxsb2NhdGlvbiBzaXplIGFuZCBjb3B5IGEgdWNzMiBzdHJpbmcKKyAqIGZyb20gdXNlciBzcGFjZSBpbnRvIGl0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZGlmZmVycyBmcm9tIGNvcHlfdWNzMl9mcm9tX3VzZXJfbGVuKCkgYmVjYXVzZSBpdAorICogY2FsY3VsYXRlcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHRvIGFsbG9jYXRlIGJ5IHRha2luZyB0aGUgbGVuZ3RoIG9mCisgKiB0aGUgc3RyaW5nICdzcmMnLgorICoKKyAqIElmIGEgbm9uLXplcm8gdmFsdWUgaXMgcmV0dXJuZWQsIHRoZSBjYWxsZXIgTVVTVCBOT1QgYWNjZXNzICdkc3QnLgorICoKKyAqIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBmcmVlICdkc3QnLgorICovCitzdGF0aWMgaW5saW5lIGludAorY29weV91Y3MyX2Zyb21fdXNlcihlZmlfY2hhcjE2X3QgKipkc3QsIGVmaV9jaGFyMTZfdCBfX3VzZXIgKnNyYykKK3sKKwlzaXplX3QgbGVuOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHNyYywgMSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbGVuID0gdXNlcl91Y3MyX3N0cnNpemUoc3JjKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiBjb3B5X3VjczJfZnJvbV91c2VyX2xlbihkc3QsIHNyYywgbGVuKTsKK30KKworLyoKKyAqIENvcHkgYSB1Y3MyIHN0cmluZyB0byBhIHVzZXIgYnVmZmVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSBzaW1wbGUgd3JhcHBlciBhcm91bmQgY29weV90b191c2VyKCkgdGhhdCBkb2VzCisgKiBub3RoaW5nIGlmICdzcmMnIGlzIE5VTEwsIHdoaWNoIGlzIHVzZWZ1bCBmb3IgcmVkdWNpbmcgdGhlIGFtb3VudCBvZgorICogTlVMTCBjaGVja2luZyB0aGUgY2FsbGVyIGhhcyB0byBkby4KKyAqCisgKiAnbGVuJyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBjb3B5LgorICovCitzdGF0aWMgaW5saW5lIGludAorY29weV91Y3MyX3RvX3VzZXJfbGVuKGVmaV9jaGFyMTZfdCBfX3VzZXIgKmRzdCwgZWZpX2NoYXIxNl90ICpzcmMsIHNpemVfdCBsZW4pCit7CisJaWYgKCFzcmMpCisJCXJldHVybiAwOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkc3QsIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBjb3B5X3RvX3VzZXIoZHN0LCBzcmMsIGxlbik7Cit9CisKK3N0YXRpYyBsb25nIGVmaV9ydW50aW1lX2dldF92YXJpYWJsZSh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZWZpX2dldHZhcmlhYmxlIF9fdXNlciAqZ2V0dmFyaWFibGVfdXNlcjsKKwlzdHJ1Y3QgZWZpX2dldHZhcmlhYmxlIGdldHZhcmlhYmxlOworCXVuc2lnbmVkIGxvbmcgZGF0YXNpemUsIHByZXZfZGF0YXNpemUsICpkejsKKwllZmlfZ3VpZF90IHZlbmRvcl9ndWlkLCAqdmQgPSBOVUxMOworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJZWZpX2NoYXIxNl90ICpuYW1lID0gTlVMTDsKKwl1MzIgYXR0ciwgKmF0OworCXZvaWQgKmRhdGEgPSBOVUxMOworCWludCBydiA9IDA7CisKKwlnZXR2YXJpYWJsZV91c2VyID0gKHN0cnVjdCBlZmlfZ2V0dmFyaWFibGUgX191c2VyICopYXJnOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZnZXR2YXJpYWJsZSwgZ2V0dmFyaWFibGVfdXNlciwKKwkJCSAgIHNpemVvZihnZXR2YXJpYWJsZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoZ2V0dmFyaWFibGUuZGF0YV9zaXplICYmCisJICAgIGdldF91c2VyKGRhdGFzaXplLCBnZXR2YXJpYWJsZS5kYXRhX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoZ2V0dmFyaWFibGUudmVuZG9yX2d1aWQpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2ZW5kb3JfZ3VpZCwgZ2V0dmFyaWFibGUudmVuZG9yX2d1aWQsCisJCQkJCXNpemVvZih2ZW5kb3JfZ3VpZCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXZkID0gJnZlbmRvcl9ndWlkOworCX0KKworCWlmIChnZXR2YXJpYWJsZS52YXJpYWJsZV9uYW1lKSB7CisJCXJ2ID0gY29weV91Y3MyX2Zyb21fdXNlcigmbmFtZSwgZ2V0dmFyaWFibGUudmFyaWFibGVfbmFtZSk7CisJCWlmIChydikKKwkJCXJldHVybiBydjsKKwl9CisKKwlhdCA9IGdldHZhcmlhYmxlLmF0dHJpYnV0ZXMgPyAmYXR0ciA6IE5VTEw7CisJZHogPSBnZXR2YXJpYWJsZS5kYXRhX3NpemUgPyAmZGF0YXNpemUgOiBOVUxMOworCisJaWYgKGdldHZhcmlhYmxlLmRhdGFfc2l6ZSAmJiBnZXR2YXJpYWJsZS5kYXRhKSB7CisJCWRhdGEgPSBrbWFsbG9jKGRhdGFzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkYXRhKSB7CisJCQlrZnJlZShuYW1lKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJcHJldl9kYXRhc2l6ZSA9IGRhdGFzaXplOworCXN0YXR1cyA9IGVmaS5nZXRfdmFyaWFibGUobmFtZSwgdmQsIGF0LCBkeiwgZGF0YSk7CisJa2ZyZWUobmFtZSk7CisKKwlpZiAocHV0X3VzZXIoc3RhdHVzLCBnZXR2YXJpYWJsZS5zdGF0dXMpKSB7CisJCXJ2ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgeworCQlpZiAoc3RhdHVzID09IEVGSV9CVUZGRVJfVE9PX1NNQUxMKSB7CisJCQlpZiAoZHogJiYgcHV0X3VzZXIoZGF0YXNpemUsIGdldHZhcmlhYmxlLmRhdGFfc2l6ZSkpIHsKKwkJCQlydiA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJcnYgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocHJldl9kYXRhc2l6ZSA8IGRhdGFzaXplKSB7CisJCXJ2ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGRhdGEpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihnZXR2YXJpYWJsZS5kYXRhLCBkYXRhLCBkYXRhc2l6ZSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKGF0ICYmIHB1dF91c2VyKGF0dHIsIGdldHZhcmlhYmxlLmF0dHJpYnV0ZXMpKSB7CisJCXJ2ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGR6ICYmIHB1dF91c2VyKGRhdGFzaXplLCBnZXR2YXJpYWJsZS5kYXRhX3NpemUpKQorCQlydiA9IC1FRkFVTFQ7CisKK291dDoKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gcnY7CisKK30KKworc3RhdGljIGxvbmcgZWZpX3J1bnRpbWVfc2V0X3ZhcmlhYmxlKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBlZmlfc2V0dmFyaWFibGUgX191c2VyICpzZXR2YXJpYWJsZV91c2VyOworCXN0cnVjdCBlZmlfc2V0dmFyaWFibGUgc2V0dmFyaWFibGU7CisJZWZpX2d1aWRfdCB2ZW5kb3JfZ3VpZDsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCWVmaV9jaGFyMTZfdCAqbmFtZSA9IE5VTEw7CisJdm9pZCAqZGF0YTsKKwlpbnQgcnYgPSAwOworCisJc2V0dmFyaWFibGVfdXNlciA9IChzdHJ1Y3QgZWZpX3NldHZhcmlhYmxlIF9fdXNlciAqKWFyZzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc2V0dmFyaWFibGUsIHNldHZhcmlhYmxlX3VzZXIsIHNpemVvZihzZXR2YXJpYWJsZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnZlbmRvcl9ndWlkLCBzZXR2YXJpYWJsZS52ZW5kb3JfZ3VpZCwKKwkJCQlzaXplb2YodmVuZG9yX2d1aWQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoc2V0dmFyaWFibGUudmFyaWFibGVfbmFtZSkgeworCQlydiA9IGNvcHlfdWNzMl9mcm9tX3VzZXIoJm5hbWUsIHNldHZhcmlhYmxlLnZhcmlhYmxlX25hbWUpOworCQlpZiAocnYpCisJCQlyZXR1cm4gcnY7CisJfQorCisJZGF0YSA9IGttYWxsb2Moc2V0dmFyaWFibGUuZGF0YV9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpIHsKKwkJa2ZyZWUobmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoZGF0YSwgc2V0dmFyaWFibGUuZGF0YSwgc2V0dmFyaWFibGUuZGF0YV9zaXplKSkgeworCQlydiA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCXN0YXR1cyA9IGVmaS5zZXRfdmFyaWFibGUobmFtZSwgJnZlbmRvcl9ndWlkLAorCQkJCXNldHZhcmlhYmxlLmF0dHJpYnV0ZXMsCisJCQkJc2V0dmFyaWFibGUuZGF0YV9zaXplLCBkYXRhKTsKKworCWlmIChwdXRfdXNlcihzdGF0dXMsIHNldHZhcmlhYmxlLnN0YXR1cykpIHsKKwkJcnYgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwlydiA9IHN0YXR1cyA9PSBFRklfU1VDQ0VTUyA/IDAgOiAtRUlOVkFMOworCitvdXQ6CisJa2ZyZWUoZGF0YSk7CisJa2ZyZWUobmFtZSk7CisKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBsb25nIGVmaV9ydW50aW1lX2dldF90aW1lKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBlZmlfZ2V0dGltZSBfX3VzZXIgKmdldHRpbWVfdXNlcjsKKwlzdHJ1Y3QgZWZpX2dldHRpbWUgIGdldHRpbWU7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwllZmlfdGltZV9jYXBfdCBjYXA7CisJZWZpX3RpbWVfdCBlZmlfdGltZTsKKworCWdldHRpbWVfdXNlciA9IChzdHJ1Y3QgZWZpX2dldHRpbWUgX191c2VyICopYXJnOworCWlmIChjb3B5X2Zyb21fdXNlcigmZ2V0dGltZSwgZ2V0dGltZV91c2VyLCBzaXplb2YoZ2V0dGltZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN0YXR1cyA9IGVmaS5nZXRfdGltZShnZXR0aW1lLnRpbWUgPyAmZWZpX3RpbWUgOiBOVUxMLAorCQkJICAgICAgZ2V0dGltZS5jYXBhYmlsaXRpZXMgPyAmY2FwIDogTlVMTCk7CisKKwlpZiAocHV0X3VzZXIoc3RhdHVzLCBnZXR0aW1lLnN0YXR1cykpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZ2V0dGltZS5jYXBhYmlsaXRpZXMpIHsKKwkJZWZpX3RpbWVfY2FwX3QgX191c2VyICpjYXBfbG9jYWw7CisKKwkJY2FwX2xvY2FsID0gKGVmaV90aW1lX2NhcF90ICopZ2V0dGltZS5jYXBhYmlsaXRpZXM7CisJCWlmIChwdXRfdXNlcihjYXAucmVzb2x1dGlvbiwgJihjYXBfbG9jYWwtPnJlc29sdXRpb24pKSB8fAorCQkJcHV0X3VzZXIoY2FwLmFjY3VyYWN5LCAmKGNhcF9sb2NhbC0+YWNjdXJhY3kpKSB8fAorCQkJcHV0X3VzZXIoY2FwLnNldHNfdG9femVybywgJihjYXBfbG9jYWwtPnNldHNfdG9femVybykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWlmIChnZXR0aW1lLnRpbWUpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihnZXR0aW1lLnRpbWUsICZlZmlfdGltZSwgc2l6ZW9mKGVmaV90aW1lX3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBlZmlfcnVudGltZV9zZXRfdGltZSh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZWZpX3NldHRpbWUgX191c2VyICpzZXR0aW1lX3VzZXI7CisJc3RydWN0IGVmaV9zZXR0aW1lIHNldHRpbWU7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwllZmlfdGltZV90IGVmaV90aW1lOworCisJc2V0dGltZV91c2VyID0gKHN0cnVjdCBlZmlfc2V0dGltZSBfX3VzZXIgKilhcmc7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZzZXR0aW1lLCBzZXR0aW1lX3VzZXIsIHNpemVvZihzZXR0aW1lKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmZWZpX3RpbWUsIHNldHRpbWUudGltZSwKKwkJCQkJc2l6ZW9mKGVmaV90aW1lX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc3RhdHVzID0gZWZpLnNldF90aW1lKCZlZmlfdGltZSk7CisKKwlpZiAocHV0X3VzZXIoc3RhdHVzLCBzZXR0aW1lLnN0YXR1cykpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHN0YXR1cyA9PSBFRklfU1VDQ0VTUyA/IDAgOiAtRUlOVkFMOworfQorCitzdGF0aWMgbG9uZyBlZmlfcnVudGltZV9nZXRfd2FrZXRpbWUodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVmaV9nZXR3YWtldXB0aW1lIF9fdXNlciAqZ2V0d2FrZXVwdGltZV91c2VyOworCXN0cnVjdCBlZmlfZ2V0d2FrZXVwdGltZSBnZXR3YWtldXB0aW1lOworCWVmaV9ib29sX3QgZW5hYmxlZCwgcGVuZGluZzsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCWVmaV90aW1lX3QgZWZpX3RpbWU7CisKKwlnZXR3YWtldXB0aW1lX3VzZXIgPSAoc3RydWN0IGVmaV9nZXR3YWtldXB0aW1lIF9fdXNlciAqKWFyZzsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmdldHdha2V1cHRpbWUsIGdldHdha2V1cHRpbWVfdXNlciwKKwkJCQlzaXplb2YoZ2V0d2FrZXVwdGltZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN0YXR1cyA9IGVmaS5nZXRfd2FrZXVwX3RpbWUoCisJCWdldHdha2V1cHRpbWUuZW5hYmxlZCA/IChlZmlfYm9vbF90ICopJmVuYWJsZWQgOiBOVUxMLAorCQlnZXR3YWtldXB0aW1lLnBlbmRpbmcgPyAoZWZpX2Jvb2xfdCAqKSZwZW5kaW5nIDogTlVMTCwKKwkJZ2V0d2FrZXVwdGltZS50aW1lID8gJmVmaV90aW1lIDogTlVMTCk7CisKKwlpZiAocHV0X3VzZXIoc3RhdHVzLCBnZXR3YWtldXB0aW1lLnN0YXR1cykpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZ2V0d2FrZXVwdGltZS5lbmFibGVkICYmIHB1dF91c2VyKGVuYWJsZWQsCisJCQkJCQlnZXR3YWtldXB0aW1lLmVuYWJsZWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChnZXR3YWtldXB0aW1lLnRpbWUpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihnZXR3YWtldXB0aW1lLnRpbWUsICZlZmlfdGltZSwKKwkJCQlzaXplb2YoZWZpX3RpbWVfdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGVmaV9ydW50aW1lX3NldF93YWtldGltZSh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZWZpX3NldHdha2V1cHRpbWUgX191c2VyICpzZXR3YWtldXB0aW1lX3VzZXI7CisJc3RydWN0IGVmaV9zZXR3YWtldXB0aW1lIHNldHdha2V1cHRpbWU7CisJZWZpX2Jvb2xfdCBlbmFibGVkOworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJZWZpX3RpbWVfdCBlZmlfdGltZTsKKworCXNldHdha2V1cHRpbWVfdXNlciA9IChzdHJ1Y3QgZWZpX3NldHdha2V1cHRpbWUgX191c2VyICopYXJnOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzZXR3YWtldXB0aW1lLCBzZXR3YWtldXB0aW1lX3VzZXIsCisJCQkJc2l6ZW9mKHNldHdha2V1cHRpbWUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllbmFibGVkID0gc2V0d2FrZXVwdGltZS5lbmFibGVkOworCWlmIChzZXR3YWtldXB0aW1lLnRpbWUpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZlZmlfdGltZSwgc2V0d2FrZXVwdGltZS50aW1lLAorCQkJCQlzaXplb2YoZWZpX3RpbWVfdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJc3RhdHVzID0gZWZpLnNldF93YWtldXBfdGltZShlbmFibGVkLCAmZWZpX3RpbWUpOworCX0gZWxzZQorCQlzdGF0dXMgPSBlZmkuc2V0X3dha2V1cF90aW1lKGVuYWJsZWQsIE5VTEwpOworCisJaWYgKHB1dF91c2VyKHN0YXR1cywgc2V0d2FrZXVwdGltZS5zdGF0dXMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBzdGF0dXMgPT0gRUZJX1NVQ0NFU1MgPyAwIDogLUVJTlZBTDsKK30KKworc3RhdGljIGxvbmcgZWZpX3J1bnRpbWVfZ2V0X25leHR2YXJpYWJsZW5hbWUodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVmaV9nZXRuZXh0dmFyaWFibGVuYW1lIF9fdXNlciAqZ2V0bmV4dHZhcmlhYmxlbmFtZV91c2VyOworCXN0cnVjdCBlZmlfZ2V0bmV4dHZhcmlhYmxlbmFtZSBnZXRuZXh0dmFyaWFibGVuYW1lOworCXVuc2lnbmVkIGxvbmcgbmFtZV9zaXplLCBwcmV2X25hbWVfc2l6ZSA9IDAsICpucyA9IE5VTEw7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwllZmlfZ3VpZF90ICp2ZCA9IE5VTEw7CisJZWZpX2d1aWRfdCB2ZW5kb3JfZ3VpZDsKKwllZmlfY2hhcjE2X3QgKm5hbWUgPSBOVUxMOworCWludCBydjsKKworCWdldG5leHR2YXJpYWJsZW5hbWVfdXNlciA9IChzdHJ1Y3QgZWZpX2dldG5leHR2YXJpYWJsZW5hbWUgX191c2VyICopYXJnOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZnZXRuZXh0dmFyaWFibGVuYW1lLCBnZXRuZXh0dmFyaWFibGVuYW1lX3VzZXIsCisJCQkgICBzaXplb2YoZ2V0bmV4dHZhcmlhYmxlbmFtZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChnZXRuZXh0dmFyaWFibGVuYW1lLnZhcmlhYmxlX25hbWVfc2l6ZSkgeworCQlpZiAoZ2V0X3VzZXIobmFtZV9zaXplLCBnZXRuZXh0dmFyaWFibGVuYW1lLnZhcmlhYmxlX25hbWVfc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbnMgPSAmbmFtZV9zaXplOworCQlwcmV2X25hbWVfc2l6ZSA9IG5hbWVfc2l6ZTsKKwl9CisKKwlpZiAoZ2V0bmV4dHZhcmlhYmxlbmFtZS52ZW5kb3JfZ3VpZCkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJnZlbmRvcl9ndWlkLAorCQkJCWdldG5leHR2YXJpYWJsZW5hbWUudmVuZG9yX2d1aWQsCisJCQkJc2l6ZW9mKHZlbmRvcl9ndWlkKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdmQgPSAmdmVuZG9yX2d1aWQ7CisJfQorCisJaWYgKGdldG5leHR2YXJpYWJsZW5hbWUudmFyaWFibGVfbmFtZSkgeworCQlzaXplX3QgbmFtZV9zdHJpbmdfc2l6ZSA9IDA7CisKKwkJcnYgPSBnZXRfdWNzMl9zdHJzaXplX2Zyb21fdXNlcigKKwkJCQlnZXRuZXh0dmFyaWFibGVuYW1lLnZhcmlhYmxlX25hbWUsCisJCQkJJm5hbWVfc3RyaW5nX3NpemUpOworCQlpZiAocnYpCisJCQlyZXR1cm4gcnY7CisJCS8qCisJCSAqIFRoZSBuYW1lX3NpemUgbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGUgcmVhbCBidWZmZXIgc2l6ZSB3aGVyZQorCQkgKiB2YXJpYWJsZSBuYW1lIGxvY2F0ZWQgaW4gc29tZSB1c2UgY2FzZXMuIFRoZSBtb3N0IHR5cGljYWwKKwkJICogY2FzZSBpcyBwYXNzaW5nIGEgMCB0byBnZXQgdGhlIHJlcXVpcmVkIGJ1ZmZlciBzaXplIGZvciB0aGUKKwkJICogMXN0IHRpbWUgY2FsbC4gU28gd2UgbmVlZCB0byBjb3B5IHRoZSBjb250ZW50IGZyb20gdXNlcgorCQkgKiBzcGFjZSBmb3IgYXQgbGVhc3QgdGhlIHN0cmluZyBzaXplIG9mIHZhcmlhYmxlIG5hbWUsIG9yIGVsc2UKKwkJICogdGhlIG5hbWUgcGFzc2VkIHRvIFVFRkkgbWF5IG5vdCBiZSB0ZXJtaW5hdGVkIGFzIHdlIGV4cGVjdGVkLgorCQkgKi8KKwkJcnYgPSBjb3B5X3VjczJfZnJvbV91c2VyX2xlbigmbmFtZSwKKwkJCQlnZXRuZXh0dmFyaWFibGVuYW1lLnZhcmlhYmxlX25hbWUsCisJCQkJcHJldl9uYW1lX3NpemUgPiBuYW1lX3N0cmluZ19zaXplID8KKwkJCQlwcmV2X25hbWVfc2l6ZSA6IG5hbWVfc3RyaW5nX3NpemUpOworCQlpZiAocnYpCisJCQlyZXR1cm4gcnY7CisJfQorCisJc3RhdHVzID0gZWZpLmdldF9uZXh0X3ZhcmlhYmxlKG5zLCBuYW1lLCB2ZCk7CisKKwlpZiAocHV0X3VzZXIoc3RhdHVzLCBnZXRuZXh0dmFyaWFibGVuYW1lLnN0YXR1cykpIHsKKwkJcnYgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJCWlmIChzdGF0dXMgPT0gRUZJX0JVRkZFUl9UT09fU01BTEwpIHsKKwkJCWlmIChucyAmJiBwdXRfdXNlcigqbnMsCisJCQkJZ2V0bmV4dHZhcmlhYmxlbmFtZS52YXJpYWJsZV9uYW1lX3NpemUpKSB7CisJCQkJcnYgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCXJ2ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKG5hbWUpIHsKKwkJaWYgKGNvcHlfdWNzMl90b191c2VyX2xlbihnZXRuZXh0dmFyaWFibGVuYW1lLnZhcmlhYmxlX25hbWUsCisJCQkJCQluYW1lLCBwcmV2X25hbWVfc2l6ZSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKG5zKSB7CisJCWlmIChwdXRfdXNlcigqbnMsIGdldG5leHR2YXJpYWJsZW5hbWUudmFyaWFibGVfbmFtZV9zaXplKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAodmQpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihnZXRuZXh0dmFyaWFibGVuYW1lLnZlbmRvcl9ndWlkLCB2ZCwKKwkJCQkJCQlzaXplb2YoZWZpX2d1aWRfdCkpKQorCQkJcnYgPSAtRUZBVUxUOworCX0KKworb3V0OgorCWtmcmVlKG5hbWUpOworCXJldHVybiBydjsKK30KKworc3RhdGljIGxvbmcgZWZpX3J1bnRpbWVfZ2V0X25leHRoaWdobW9ub2NvdW50KHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBlZmlfZ2V0bmV4dGhpZ2htb25vdG9uaWNjb3VudCBfX3VzZXIgKmdldG5leHRoaWdobW9ub2NvdW50X3VzZXI7CisJc3RydWN0IGVmaV9nZXRuZXh0aGlnaG1vbm90b25pY2NvdW50IGdldG5leHRoaWdobW9ub2NvdW50OworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJdTMyIGNvdW50OworCisJZ2V0bmV4dGhpZ2htb25vY291bnRfdXNlciA9IChzdHJ1Y3QKKwkJCWVmaV9nZXRuZXh0aGlnaG1vbm90b25pY2NvdW50IF9fdXNlciAqKWFyZzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZ2V0bmV4dGhpZ2htb25vY291bnQsCisJCQkgICBnZXRuZXh0aGlnaG1vbm9jb3VudF91c2VyLAorCQkJICAgc2l6ZW9mKGdldG5leHRoaWdobW9ub2NvdW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3RhdHVzID0gZWZpLmdldF9uZXh0X2hpZ2hfbW9ub19jb3VudCgKKwkJZ2V0bmV4dGhpZ2htb25vY291bnQuaGlnaF9jb3VudCA/ICZjb3VudCA6IE5VTEwpOworCisJaWYgKHB1dF91c2VyKHN0YXR1cywgZ2V0bmV4dGhpZ2htb25vY291bnQuc3RhdHVzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChnZXRuZXh0aGlnaG1vbm9jb3VudC5oaWdoX2NvdW50ICYmCisJICAgIHB1dF91c2VyKGNvdW50LCBnZXRuZXh0aGlnaG1vbm9jb3VudC5oaWdoX2NvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgZWZpX3J1bnRpbWVfcXVlcnlfdmFyaWFibGVpbmZvKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBlZmlfcXVlcnl2YXJpYWJsZWluZm8gX191c2VyICpxdWVyeXZhcmlhYmxlaW5mb191c2VyOworCXN0cnVjdCBlZmlfcXVlcnl2YXJpYWJsZWluZm8gcXVlcnl2YXJpYWJsZWluZm87CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwl1NjQgbWF4X3N0b3JhZ2UsIHJlbWFpbmluZywgbWF4X3NpemU7CisKKwlxdWVyeXZhcmlhYmxlaW5mb191c2VyID0gKHN0cnVjdCBlZmlfcXVlcnl2YXJpYWJsZWluZm8gX191c2VyICopYXJnOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZxdWVyeXZhcmlhYmxlaW5mbywgcXVlcnl2YXJpYWJsZWluZm9fdXNlciwKKwkJCSAgIHNpemVvZihxdWVyeXZhcmlhYmxlaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN0YXR1cyA9IGVmaS5xdWVyeV92YXJpYWJsZV9pbmZvKHF1ZXJ5dmFyaWFibGVpbmZvLmF0dHJpYnV0ZXMsCisJCQkJCSAmbWF4X3N0b3JhZ2UsICZyZW1haW5pbmcsICZtYXhfc2l6ZSk7CisKKwlpZiAocHV0X3VzZXIoc3RhdHVzLCBxdWVyeXZhcmlhYmxlaW5mby5zdGF0dXMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHB1dF91c2VyKG1heF9zdG9yYWdlLAorCQkgICAgIHF1ZXJ5dmFyaWFibGVpbmZvLm1heGltdW1fdmFyaWFibGVfc3RvcmFnZV9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAocHV0X3VzZXIocmVtYWluaW5nLAorCQkgICAgIHF1ZXJ5dmFyaWFibGVpbmZvLnJlbWFpbmluZ192YXJpYWJsZV9zdG9yYWdlX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChwdXRfdXNlcihtYXhfc2l6ZSwgcXVlcnl2YXJpYWJsZWluZm8ubWF4aW11bV92YXJpYWJsZV9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgZWZpX3J1bnRpbWVfcXVlcnlfY2Fwc3VsZWNhcHModW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVmaV9xdWVyeWNhcHN1bGVjYXBhYmlsaXRpZXMgX191c2VyICpxY2Fwc191c2VyOworCXN0cnVjdCBlZmlfcXVlcnljYXBzdWxlY2FwYWJpbGl0aWVzIHFjYXBzOworCWVmaV9jYXBzdWxlX2hlYWRlcl90ICpjYXBzdWxlczsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXU2NCBtYXhfc2l6ZTsKKwlpbnQgaSwgcmVzZXRfdHlwZTsKKwlpbnQgcnYgPSAwOworCisJcWNhcHNfdXNlciA9IChzdHJ1Y3QgZWZpX3F1ZXJ5Y2Fwc3VsZWNhcGFiaWxpdGllcyBfX3VzZXIgKilhcmc7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnFjYXBzLCBxY2Fwc191c2VyLCBzaXplb2YocWNhcHMpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljYXBzdWxlcyA9IGtjYWxsb2MocWNhcHMuY2Fwc3VsZV9jb3VudCArIDEsCisJCQkgICBzaXplb2YoZWZpX2NhcHN1bGVfaGVhZGVyX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhcHN1bGVzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBxY2Fwcy5jYXBzdWxlX2NvdW50OyBpKyspIHsKKwkJZWZpX2NhcHN1bGVfaGVhZGVyX3QgKmM7CisJCS8qCisJCSAqIFdlIGNhbm5vdCBkZXJlZmVyZW5jZSBxY2Fwcy5jYXBzdWxlX2hlYWRlcl9hcnJheSBkaXJlY3RseSB0bworCQkgKiBvYnRhaW4gdGhlIGFkZHJlc3Mgb2YgdGhlIGNhcHN1bGUgYXMgaXQgcmVzaWRlcyBpbiB0aGUKKwkJICogdXNlciBzcGFjZQorCQkgKi8KKwkJaWYgKGdldF91c2VyKGMsIHFjYXBzLmNhcHN1bGVfaGVhZGVyX2FycmF5ICsgaSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2Fwc3VsZXNbaV0sIGMsCisJCQkJc2l6ZW9mKGVmaV9jYXBzdWxlX2hlYWRlcl90KSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcWNhcHMuY2Fwc3VsZV9oZWFkZXJfYXJyYXkgPSAmY2Fwc3VsZXM7CisKKwlzdGF0dXMgPSBlZmkucXVlcnlfY2Fwc3VsZV9jYXBzKChlZmlfY2Fwc3VsZV9oZWFkZXJfdCAqKikKKwkJCQkJcWNhcHMuY2Fwc3VsZV9oZWFkZXJfYXJyYXksCisJCQkJCXFjYXBzLmNhcHN1bGVfY291bnQsCisJCQkJCSZtYXhfc2l6ZSwgJnJlc2V0X3R5cGUpOworCisJaWYgKHB1dF91c2VyKHN0YXR1cywgcWNhcHMuc3RhdHVzKSkgeworCQlydiA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKwkJcnYgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocHV0X3VzZXIobWF4X3NpemUsIHFjYXBzLm1heGltdW1fY2Fwc3VsZV9zaXplKSkgeworCQlydiA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChwdXRfdXNlcihyZXNldF90eXBlLCBxY2Fwcy5yZXNldF90eXBlKSkKKwkJcnYgPSAtRUZBVUxUOworCitvdXQ6CisJa2ZyZWUoY2Fwc3VsZXMpOworCXJldHVybiBydjsKK30KKworc3RhdGljIGxvbmcgZWZpX3Rlc3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEVGSV9SVU5USU1FX0dFVF9WQVJJQUJMRToKKwkJcmV0dXJuIGVmaV9ydW50aW1lX2dldF92YXJpYWJsZShhcmcpOworCisJY2FzZSBFRklfUlVOVElNRV9TRVRfVkFSSUFCTEU6CisJCXJldHVybiBlZmlfcnVudGltZV9zZXRfdmFyaWFibGUoYXJnKTsKKworCWNhc2UgRUZJX1JVTlRJTUVfR0VUX1RJTUU6CisJCXJldHVybiBlZmlfcnVudGltZV9nZXRfdGltZShhcmcpOworCisJY2FzZSBFRklfUlVOVElNRV9TRVRfVElNRToKKwkJcmV0dXJuIGVmaV9ydW50aW1lX3NldF90aW1lKGFyZyk7CisKKwljYXNlIEVGSV9SVU5USU1FX0dFVF9XQUtFVElNRToKKwkJcmV0dXJuIGVmaV9ydW50aW1lX2dldF93YWtldGltZShhcmcpOworCisJY2FzZSBFRklfUlVOVElNRV9TRVRfV0FLRVRJTUU6CisJCXJldHVybiBlZmlfcnVudGltZV9zZXRfd2FrZXRpbWUoYXJnKTsKKworCWNhc2UgRUZJX1JVTlRJTUVfR0VUX05FWFRWQVJJQUJMRU5BTUU6CisJCXJldHVybiBlZmlfcnVudGltZV9nZXRfbmV4dHZhcmlhYmxlbmFtZShhcmcpOworCisJY2FzZSBFRklfUlVOVElNRV9HRVRfTkVYVEhJR0hNT05PVE9OSUNDT1VOVDoKKwkJcmV0dXJuIGVmaV9ydW50aW1lX2dldF9uZXh0aGlnaG1vbm9jb3VudChhcmcpOworCisJY2FzZSBFRklfUlVOVElNRV9RVUVSWV9WQVJJQUJMRUlORk86CisJCXJldHVybiBlZmlfcnVudGltZV9xdWVyeV92YXJpYWJsZWluZm8oYXJnKTsKKworCWNhc2UgRUZJX1JVTlRJTUVfUVVFUllfQ0FQU1VMRUNBUEFCSUxJVElFUzoKKwkJcmV0dXJuIGVmaV9ydW50aW1lX3F1ZXJ5X2NhcHN1bGVjYXBzKGFyZyk7CisJfQorCisJcmV0dXJuIC1FTk9UVFk7Cit9CisKK3N0YXRpYyBpbnQgZWZpX3Rlc3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKgorCSAqIG5vdGhpbmcgc3BlY2lhbCB0byBkbyBoZXJlCisJICogV2UgZG8gYWNjZXB0IG11bHRpcGxlIG9wZW4gZmlsZXMgYXQgdGhlIHNhbWUgdGltZSBhcyB3ZQorCSAqIHN5bmNocm9uaXplIG9uIHRoZSBwZXIgY2FsbCBvcGVyYXRpb24uCisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWZpX3Rlc3RfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglUaGUgdmFyaW91cyBmaWxlIG9wZXJhdGlvbnMgd2Ugc3VwcG9ydC4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZWZpX3Rlc3RfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnVubG9ja2VkX2lvY3RsCT0gZWZpX3Rlc3RfaW9jdGwsCisJLm9wZW4JCT0gZWZpX3Rlc3Rfb3BlbiwKKwkucmVsZWFzZQk9IGVmaV90ZXN0X2Nsb3NlLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGVmaV90ZXN0X2RldiA9IHsKKwlNSVNDX0RZTkFNSUNfTUlOT1IsCisJImVmaV90ZXN0IiwKKwkmZWZpX3Rlc3RfZm9wcworfTsKKworc3RhdGljIGludCBfX2luaXQgZWZpX3Rlc3RfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZlZmlfdGVzdF9kZXYpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJlZmlfdGVzdDogY2FuJ3QgbWlzY19yZWdpc3RlciBvbiBtaW5vcj0lZFxuIiwKKwkJCU1JU0NfRFlOQU1JQ19NSU5PUik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlZmlfdGVzdF9leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZlZmlfdGVzdF9kZXYpOworfQorCittb2R1bGVfaW5pdChlZmlfdGVzdF9pbml0KTsKK21vZHVsZV9leGl0KGVmaV90ZXN0X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvdGVzdC9lZmlfdGVzdC5oIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvdGVzdC9lZmlfdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzM2E2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS90ZXN0L2VmaV90ZXN0LmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBFRkkgVGVzdCBkcml2ZXIgSGVhZGVyCisgKgorICogQ29weXJpZ2h0KEMpIDIwMTItMjAxNiBDYW5vbmljYWwgTHRkLgorICoKKyAqLworCisjaWZuZGVmIF9EUklWRVJTX0ZJUk1XQVJFX0VGSV9URVNUX0hfCisjZGVmaW5lIF9EUklWRVJTX0ZJUk1XQVJFX0VGSV9URVNUX0hfCisKKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKworc3RydWN0IGVmaV9nZXR2YXJpYWJsZSB7CisJZWZpX2NoYXIxNl90CSp2YXJpYWJsZV9uYW1lOworCWVmaV9ndWlkX3QJKnZlbmRvcl9ndWlkOworCXUzMgkJKmF0dHJpYnV0ZXM7CisJdW5zaWduZWQgbG9uZwkqZGF0YV9zaXplOworCXZvaWQJCSpkYXRhOworCWVmaV9zdGF0dXNfdAkqc3RhdHVzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGVmaV9zZXR2YXJpYWJsZSB7CisJZWZpX2NoYXIxNl90CSp2YXJpYWJsZV9uYW1lOworCWVmaV9ndWlkX3QJKnZlbmRvcl9ndWlkOworCXUzMgkJYXR0cmlidXRlczsKKwl1bnNpZ25lZCBsb25nCWRhdGFfc2l6ZTsKKwl2b2lkCQkqZGF0YTsKKwllZmlfc3RhdHVzX3QJKnN0YXR1czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBlZmlfZ2V0bmV4dHZhcmlhYmxlbmFtZSB7CisJdW5zaWduZWQgbG9uZwkqdmFyaWFibGVfbmFtZV9zaXplOworCWVmaV9jaGFyMTZfdAkqdmFyaWFibGVfbmFtZTsKKwllZmlfZ3VpZF90CSp2ZW5kb3JfZ3VpZDsKKwllZmlfc3RhdHVzX3QJKnN0YXR1czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBlZmlfcXVlcnl2YXJpYWJsZWluZm8geworCXUzMgkJYXR0cmlidXRlczsKKwl1NjQJCSptYXhpbXVtX3ZhcmlhYmxlX3N0b3JhZ2Vfc2l6ZTsKKwl1NjQJCSpyZW1haW5pbmdfdmFyaWFibGVfc3RvcmFnZV9zaXplOworCXU2NAkJKm1heGltdW1fdmFyaWFibGVfc2l6ZTsKKwllZmlfc3RhdHVzX3QJKnN0YXR1czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBlZmlfZ2V0dGltZSB7CisJZWZpX3RpbWVfdAkqdGltZTsKKwllZmlfdGltZV9jYXBfdAkqY2FwYWJpbGl0aWVzOworCWVmaV9zdGF0dXNfdAkqc3RhdHVzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGVmaV9zZXR0aW1lIHsKKwllZmlfdGltZV90CSp0aW1lOworCWVmaV9zdGF0dXNfdAkqc3RhdHVzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGVmaV9nZXR3YWtldXB0aW1lIHsKKwllZmlfYm9vbF90CSplbmFibGVkOworCWVmaV9ib29sX3QJKnBlbmRpbmc7CisJZWZpX3RpbWVfdAkqdGltZTsKKwllZmlfc3RhdHVzX3QJKnN0YXR1czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBlZmlfc2V0d2FrZXVwdGltZSB7CisJZWZpX2Jvb2xfdAllbmFibGVkOworCWVmaV90aW1lX3QJKnRpbWU7CisJZWZpX3N0YXR1c190CSpzdGF0dXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZWZpX2dldG5leHRoaWdobW9ub3RvbmljY291bnQgeworCXUzMgkJKmhpZ2hfY291bnQ7CisJZWZpX3N0YXR1c190CSpzdGF0dXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZWZpX3F1ZXJ5Y2Fwc3VsZWNhcGFiaWxpdGllcyB7CisJZWZpX2NhcHN1bGVfaGVhZGVyX3QJKipjYXBzdWxlX2hlYWRlcl9hcnJheTsKKwl1bnNpZ25lZCBsb25nCQljYXBzdWxlX2NvdW50OworCXU2NAkJCSptYXhpbXVtX2NhcHN1bGVfc2l6ZTsKKwlpbnQJCQkqcmVzZXRfdHlwZTsKKwllZmlfc3RhdHVzX3QJCSpzdGF0dXM7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEVGSV9SVU5USU1FX0dFVF9WQVJJQUJMRSBcCisJX0lPV1IoJ3AnLCAweDAxLCBzdHJ1Y3QgZWZpX2dldHZhcmlhYmxlKQorI2RlZmluZSBFRklfUlVOVElNRV9TRVRfVkFSSUFCTEUgXAorCV9JT1coJ3AnLCAweDAyLCBzdHJ1Y3QgZWZpX3NldHZhcmlhYmxlKQorCisjZGVmaW5lIEVGSV9SVU5USU1FX0dFVF9USU1FIFwKKwlfSU9SKCdwJywgMHgwMywgc3RydWN0IGVmaV9nZXR0aW1lKQorI2RlZmluZSBFRklfUlVOVElNRV9TRVRfVElNRSBcCisJX0lPVygncCcsIDB4MDQsIHN0cnVjdCBlZmlfc2V0dGltZSkKKworI2RlZmluZSBFRklfUlVOVElNRV9HRVRfV0FLRVRJTUUgXAorCV9JT1IoJ3AnLCAweDA1LCBzdHJ1Y3QgZWZpX2dldHdha2V1cHRpbWUpCisjZGVmaW5lIEVGSV9SVU5USU1FX1NFVF9XQUtFVElNRSBcCisJX0lPVygncCcsIDB4MDYsIHN0cnVjdCBlZmlfc2V0d2FrZXVwdGltZSkKKworI2RlZmluZSBFRklfUlVOVElNRV9HRVRfTkVYVFZBUklBQkxFTkFNRSBcCisJX0lPV1IoJ3AnLCAweDA3LCBzdHJ1Y3QgZWZpX2dldG5leHR2YXJpYWJsZW5hbWUpCisKKyNkZWZpbmUgRUZJX1JVTlRJTUVfUVVFUllfVkFSSUFCTEVJTkZPIFwKKwlfSU9SKCdwJywgMHgwOCwgc3RydWN0IGVmaV9xdWVyeXZhcmlhYmxlaW5mbykKKworI2RlZmluZSBFRklfUlVOVElNRV9HRVRfTkVYVEhJR0hNT05PVE9OSUNDT1VOVCBcCisJX0lPUigncCcsIDB4MDksIHN0cnVjdCBlZmlfZ2V0bmV4dGhpZ2htb25vdG9uaWNjb3VudCkKKworI2RlZmluZSBFRklfUlVOVElNRV9RVUVSWV9DQVBTVUxFQ0FQQUJJTElUSUVTIFwKKwlfSU9SKCdwJywgMHgwQSwgc3RydWN0IGVmaV9xdWVyeWNhcHN1bGVjYXBhYmlsaXRpZXMpCisKKyNlbmRpZiAvKiBfRFJJVkVSU19GSVJNV0FSRV9FRklfVEVTVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvdmFycy5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvdmFycy5jCmluZGV4IGQzYjc1MTMuLjkzMzZmZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL3ZhcnMuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS92YXJzLmMKQEAgLTM3LDYgKzM3LDE0IEBACiAvKiBQcml2YXRlIHBvaW50ZXIgdG8gcmVnaXN0ZXJlZCBlZml2YXJzICovCiBzdGF0aWMgc3RydWN0IGVmaXZhcnMgKl9fZWZpdmFyczsKIAorLyoKKyAqIGVmaXZhcnNfbG9jayBwcm90ZWN0cyB0aHJlZSB0aGluZ3M6CisgKiAxKSBlZml2YXJmc19saXN0IGFuZCBlZml2YXJzX3N5c2ZzX2xpc3QKKyAqIDIpIC0+b3BzIGNhbGxzCisgKiAzKSAodW4pcmVnaXN0cmF0aW9uIG9mIF9fZWZpdmFycworICovCitzdGF0aWMgREVGSU5FX1NFTUFQSE9SRShlZml2YXJzX2xvY2spOworCiBzdGF0aWMgYm9vbCBlZml2YXJfd3FfZW5hYmxlZCA9IHRydWU7CiBERUNMQVJFX1dPUksoZWZpdmFyX3dvcmssIE5VTEwpOwogRVhQT1JUX1NZTUJPTF9HUEwoZWZpdmFyX3dvcmspOwpAQCAtNDM0LDcgKzQ0MiwxMCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlzcGluX2xvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaXZhcnNfbG9jaykpIHsKKwkJZXJyID0gLUVJTlRSOworCQlnb3RvIGZyZWU7CisJfQogCiAJLyoKIAkgKiBQZXIgRUZJIHNwZWMsIHRoZSBtYXhpbXVtIHN0b3JhZ2UgYWxsb2NhdGVkIGZvciBib3RoCkBAIC00NTAsNyArNDYxLDcgQEAKIAkJc3dpdGNoIChzdGF0dXMpIHsKIAkJY2FzZSBFRklfU1VDQ0VTUzoKIAkJCWlmIChkdXBsaWNhdGVzKQotCQkJCXNwaW5fdW5sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwkJCQl1cCgmZWZpdmFyc19sb2NrKTsKIAogCQkJdmFyaWFibGVfbmFtZV9zaXplID0gdmFyX25hbWVfc3RybnNpemUodmFyaWFibGVfbmFtZSwKIAkJCQkJCQkgICAgICAgdmFyaWFibGVfbmFtZV9zaXplKTsKQEAgLTQ3Niw4ICs0ODcsMTIgQEAKIAkJCQkJc3RhdHVzID0gRUZJX05PVF9GT1VORDsKIAkJCX0KIAotCQkJaWYgKGR1cGxpY2F0ZXMpCi0JCQkJc3Bpbl9sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwkJCWlmIChkdXBsaWNhdGVzKSB7CisJCQkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpdmFyc19sb2NrKSkgeworCQkJCQllcnIgPSAtRUlOVFI7CisJCQkJCWdvdG8gZnJlZTsKKwkJCQl9CisJCQl9CiAKIAkJCWJyZWFrOwogCQljYXNlIEVGSV9OT1RfRk9VTkQ6CkBAIC00OTEsOCArNTA2LDggQEAKIAogCX0gd2hpbGUgKHN0YXR1cyAhPSBFRklfTk9UX0ZPVU5EKTsKIAotCXNwaW5fdW5sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKLQorCXVwKCZlZml2YXJzX2xvY2spOworZnJlZToKIAlrZnJlZSh2YXJpYWJsZV9uYW1lKTsKIAogCXJldHVybiBlcnI7CkBAIC01MDMsMjQgKzUxOCwzNCBAQAogICogZWZpdmFyX2VudHJ5X2FkZCAtIGFkZCBlbnRyeSB0byB2YXJpYWJsZSBsaXN0CiAgKiBAZW50cnk6IGVudHJ5IHRvIGFkZCB0byBsaXN0CiAgKiBAaGVhZDogbGlzdCBoZWFkCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIGEga2VybmVsIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAqLwotdm9pZCBlZml2YXJfZW50cnlfYWRkKHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoraW50IGVmaXZhcl9lbnRyeV9hZGQoc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnksIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7Ci0Jc3Bpbl9sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZml2YXJzX2xvY2spKQorCQlyZXR1cm4gLUVJTlRSOwogCWxpc3RfYWRkKCZlbnRyeS0+bGlzdCwgaGVhZCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCXVwKCZlZml2YXJzX2xvY2spOworCisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChlZml2YXJfZW50cnlfYWRkKTsKIAogLyoqCiAgKiBlZml2YXJfZW50cnlfcmVtb3ZlIC0gcmVtb3ZlIGVudHJ5IGZyb20gdmFyaWFibGUgbGlzdAogICogQGVudHJ5OiBlbnRyeSB0byByZW1vdmUgZnJvbSBsaXN0CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIGEga2VybmVsIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAqLwotdm9pZCBlZml2YXJfZW50cnlfcmVtb3ZlKHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5KQoraW50IGVmaXZhcl9lbnRyeV9yZW1vdmUoc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnkpCiB7Ci0Jc3Bpbl9sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZml2YXJzX2xvY2spKQorCQlyZXR1cm4gLUVJTlRSOwogCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCXVwKCZlZml2YXJzX2xvY2spOworCisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChlZml2YXJfZW50cnlfcmVtb3ZlKTsKIApAQCAtNTM3LDEwICs1NjIsOCBAQAogICovCiBzdGF0aWMgdm9pZCBlZml2YXJfZW50cnlfbGlzdF9kZWxfdW5sb2NrKHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5KQogewotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJl9fZWZpdmFycy0+bG9jayk7Ci0KIAlsaXN0X2RlbCgmZW50cnktPmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwl1cCgmZWZpdmFyc19sb2NrKTsKIH0KIAogLyoqCkBAIC01NjMsOCArNTg2LDYgQEAKIAljb25zdCBzdHJ1Y3QgZWZpdmFyX29wZXJhdGlvbnMgKm9wcyA9IF9fZWZpdmFycy0+b3BzOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAKLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZfX2VmaXZhcnMtPmxvY2spOwotCiAJc3RhdHVzID0gb3BzLT5zZXRfdmFyaWFibGUoZW50cnktPnZhci5WYXJpYWJsZU5hbWUsCiAJCQkJICAgJmVudHJ5LT52YXIuVmVuZG9yR3VpZCwKIAkJCQkgICAwLCAwLCBOVUxMKTsKQEAgLTU4MSwyMCArNjAyLDIyIEBACiAgKiB2YXJpYWJsZSBsaXN0LiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSBAZW50cnkKICAqIG9uY2Ugd2UgcmV0dXJuLgogICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciBhIGNvbnZlcnRlZCBFRkkgc3RhdHVzIGNvZGUgaWYKLSAqIHNldF92YXJpYWJsZSgpIGZhaWxzLgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5UUiBpZiB3ZSBjYW4ndCBncmFiIHRoZSBzZW1hcGhvcmUsCisgKiBjb252ZXJ0ZWQgRUZJIHN0YXR1cyBjb2RlIGlmIHNldF92YXJpYWJsZSgpIGZhaWxzLgogICovCiBpbnQgZWZpdmFyX2VudHJ5X2RlbGV0ZShzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSkKIHsKIAljb25zdCBzdHJ1Y3QgZWZpdmFyX29wZXJhdGlvbnMgKm9wcyA9IF9fZWZpdmFycy0+b3BzOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaXZhcnNfbG9jaykpCisJCXJldHVybiAtRUlOVFI7CisKIAlzdGF0dXMgPSBvcHMtPnNldF92YXJpYWJsZShlbnRyeS0+dmFyLlZhcmlhYmxlTmFtZSwKIAkJCQkgICAmZW50cnktPnZhci5WZW5kb3JHdWlkLAogCQkJCSAgIDAsIDAsIE5VTEwpOwogCWlmICghKHN0YXR1cyA9PSBFRklfU1VDQ0VTUyB8fCBzdGF0dXMgPT0gRUZJX05PVF9GT1VORCkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCQl1cCgmZWZpdmFyc19sb2NrKTsKIAkJcmV0dXJuIGVmaV9zdGF0dXNfdG9fZXJyKHN0YXR1cyk7CiAJfQogCkBAIC02MjAsOSArNjQzLDkgQEAKICAqIElmIEBoZWFkIGlzIG5vdCBOVUxMIGEgbG9va3VwIGlzIHBlcmZvcm1lZCB0byBkZXRlcm1pbmUgd2hldGhlcgogICogdGhlIGVudHJ5IGlzIGFscmVhZHkgb24gdGhlIGxpc3QuCiAgKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FRVhJU1QgaWYgYSBsb29rdXAgaXMgcGVyZm9ybWVkIGFuZCB0aGUgZW50cnkKLSAqIGFscmVhZHkgZXhpc3RzIG9uIHRoZSBsaXN0LCBvciBhIGNvbnZlcnRlZCBFRkkgc3RhdHVzIGNvZGUgaWYKLSAqIHNldF92YXJpYWJsZSgpIGZhaWxzLgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5UUiBpZiB3ZSBjYW4ndCBncmFiIHRoZSBzZW1hcGhvcmUsCisgKiAtRUVYSVNUIGlmIGEgbG9va3VwIGlzIHBlcmZvcm1lZCBhbmQgdGhlIGVudHJ5IGFscmVhZHkgZXhpc3RzIG9uCisgKiB0aGUgbGlzdCwgb3IgYSBjb252ZXJ0ZWQgRUZJIHN0YXR1cyBjb2RlIGlmIHNldF92YXJpYWJsZSgpIGZhaWxzLgogICovCiBpbnQgZWZpdmFyX2VudHJ5X3NldChzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSwgdTMyIGF0dHJpYnV0ZXMsCiAJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB2b2lkICpkYXRhLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQpAQCAtNjMyLDEwICs2NTUsMTAgQEAKIAllZmlfY2hhcjE2X3QgKm5hbWUgPSBlbnRyeS0+dmFyLlZhcmlhYmxlTmFtZTsKIAllZmlfZ3VpZF90IHZlbmRvciA9IGVudHJ5LT52YXIuVmVuZG9yR3VpZDsKIAotCXNwaW5fbG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7Ci0KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZml2YXJzX2xvY2spKQorCQlyZXR1cm4gLUVJTlRSOwogCWlmIChoZWFkICYmIGVmaXZhcl9lbnRyeV9maW5kKG5hbWUsIHZlbmRvciwgaGVhZCwgZmFsc2UpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwkJdXAoJmVmaXZhcnNfbG9jayk7CiAJCXJldHVybiAtRUVYSVNUOwogCX0KIApAQCAtNjQ0LDcgKzY2Nyw3IEBACiAJCXN0YXR1cyA9IG9wcy0+c2V0X3ZhcmlhYmxlKG5hbWUsICZ2ZW5kb3IsCiAJCQkJCSAgIGF0dHJpYnV0ZXMsIHNpemUsIGRhdGEpOwogCi0Jc3Bpbl91bmxvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCXVwKCZlZml2YXJzX2xvY2spOwogCiAJcmV0dXJuIGVmaV9zdGF0dXNfdG9fZXJyKHN0YXR1cyk7CiAKQEAgLTY1OCwzMCArNjgxLDI5IEBACiAgKiBmcm9tIGNyYXNoL3BhbmljIGhhbmRsZXJzLgogICoKICAqIENydWNpYWxseSwgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBibG9jayBpZiBpdCBjYW5ub3QgYWNxdWlyZQotICogX19lZml2YXJzLT5sb2NrLiBJbnN0ZWFkLCBpdCByZXR1cm5zIC1FQlVTWS4KKyAqIGVmaXZhcnNfbG9jay4gSW5zdGVhZCwgaXQgcmV0dXJucyAtRUJVU1kuCiAgKi8KIHN0YXRpYyBpbnQKIGVmaXZhcl9lbnRyeV9zZXRfbm9uYmxvY2tpbmcoZWZpX2NoYXIxNl90ICpuYW1lLCBlZmlfZ3VpZF90IHZlbmRvciwKIAkJCSAgICAgdTMyIGF0dHJpYnV0ZXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdm9pZCAqZGF0YSkKIHsKIAljb25zdCBzdHJ1Y3QgZWZpdmFyX29wZXJhdGlvbnMgKm9wcyA9IF9fZWZpdmFycy0+b3BzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAotCWlmICghc3Bpbl90cnlsb2NrX2lycXNhdmUoJl9fZWZpdmFycy0+bG9jaywgZmxhZ3MpKQorCWlmIChkb3duX3RyeWxvY2soJmVmaXZhcnNfbG9jaykpCiAJCXJldHVybiAtRUJVU1k7CiAKIAlzdGF0dXMgPSBjaGVja192YXJfc2l6ZV9ub25ibG9ja2luZyhhdHRyaWJ1dGVzLAogCQkJCQkgICAgc2l6ZSArIHVjczJfc3Ryc2l6ZShuYW1lLCAxMDI0KSk7CiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZfX2VmaXZhcnMtPmxvY2ssIGZsYWdzKTsKKwkJdXAoJmVmaXZhcnNfbG9jayk7CiAJCXJldHVybiAtRU5PU1BDOwogCX0KIAogCXN0YXR1cyA9IG9wcy0+c2V0X3ZhcmlhYmxlX25vbmJsb2NraW5nKG5hbWUsICZ2ZW5kb3IsIGF0dHJpYnV0ZXMsCiAJCQkJCSAgICAgICBzaXplLCBkYXRhKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJl9fZWZpdmFycy0+bG9jaywgZmxhZ3MpOworCXVwKCZlZml2YXJzX2xvY2spOwogCXJldHVybiBlZmlfc3RhdHVzX3RvX2VycihzdGF0dXMpOwogfQogCkBAIC03MDYsNyArNzI4LDYgQEAKIAkJCSAgYm9vbCBibG9jaywgdW5zaWduZWQgbG9uZyBzaXplLCB2b2lkICpkYXRhKQogewogCWNvbnN0IHN0cnVjdCBlZml2YXJfb3BlcmF0aW9ucyAqb3BzID0gX19lZml2YXJzLT5vcHM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCiAJaWYgKCFvcHMtPnF1ZXJ5X3ZhcmlhYmxlX3N0b3JlKQpAQCAtNzI3LDIxICs3NDgsMjIgQEAKIAkJCQkJCSAgICBzaXplLCBkYXRhKTsKIAogCWlmICghYmxvY2spIHsKLQkJaWYgKCFzcGluX3RyeWxvY2tfaXJxc2F2ZSgmX19lZml2YXJzLT5sb2NrLCBmbGFncykpCisJCWlmIChkb3duX3RyeWxvY2soJmVmaXZhcnNfbG9jaykpCiAJCQlyZXR1cm4gLUVCVVNZOwogCX0gZWxzZSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZfX2VmaXZhcnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpdmFyc19sb2NrKSkKKwkJCXJldHVybiAtRUlOVFI7CiAJfQogCiAJc3RhdHVzID0gY2hlY2tfdmFyX3NpemUoYXR0cmlidXRlcywgc2l6ZSArIHVjczJfc3Ryc2l6ZShuYW1lLCAxMDI0KSk7CiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZfX2VmaXZhcnMtPmxvY2ssIGZsYWdzKTsKKwkJdXAoJmVmaXZhcnNfbG9jayk7CiAJCXJldHVybiAtRU5PU1BDOwogCX0KIAogCXN0YXR1cyA9IG9wcy0+c2V0X3ZhcmlhYmxlKG5hbWUsICZ2ZW5kb3IsIGF0dHJpYnV0ZXMsIHNpemUsIGRhdGEpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmX19lZml2YXJzLT5sb2NrLCBmbGFncyk7CisJdXAoJmVmaXZhcnNfbG9jayk7CiAKIAlyZXR1cm4gZWZpX3N0YXR1c190b19lcnIoc3RhdHVzKTsKIH0KQEAgLTc3MSw4ICs3OTMsNiBAQAogCWludCBzdHJzaXplMSwgc3Ryc2l6ZTI7CiAJYm9vbCBmb3VuZCA9IGZhbHNlOwogCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmX19lZml2YXJzLT5sb2NrKTsKLQogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgbiwgaGVhZCwgbGlzdCkgewogCQlzdHJzaXplMSA9IHVjczJfc3Ryc2l6ZShuYW1lLCAxMDI0KTsKIAkJc3Ryc2l6ZTIgPSB1Y3MyX3N0cnNpemUoZW50cnktPnZhci5WYXJpYWJsZU5hbWUsIDEwMjQpOwpAQCAtODE0LDEwICs4MzQsMTEgQEAKIAogCSpzaXplID0gMDsKIAotCXNwaW5fbG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpdmFyc19sb2NrKSkKKwkJcmV0dXJuIC1FSU5UUjsKIAlzdGF0dXMgPSBvcHMtPmdldF92YXJpYWJsZShlbnRyeS0+dmFyLlZhcmlhYmxlTmFtZSwKIAkJCQkgICAmZW50cnktPnZhci5WZW5kb3JHdWlkLCBOVUxMLCBzaXplLCBOVUxMKTsKLQlzcGluX3VubG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJdXAoJmVmaXZhcnNfbG9jayk7CiAKIAlpZiAoc3RhdHVzICE9IEVGSV9CVUZGRVJfVE9PX1NNQUxMKQogCQlyZXR1cm4gZWZpX3N0YXR1c190b19lcnIoc3RhdHVzKTsKQEAgLTg0Myw4ICs4NjQsNiBAQAogCWNvbnN0IHN0cnVjdCBlZml2YXJfb3BlcmF0aW9ucyAqb3BzID0gX19lZml2YXJzLT5vcHM7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJl9fZWZpdmFycy0+bG9jayk7Ci0KIAlzdGF0dXMgPSBvcHMtPmdldF92YXJpYWJsZShlbnRyeS0+dmFyLlZhcmlhYmxlTmFtZSwKIAkJCQkgICAmZW50cnktPnZhci5WZW5kb3JHdWlkLAogCQkJCSAgIGF0dHJpYnV0ZXMsIHNpemUsIGRhdGEpOwpAQCAtODY2LDExICs4ODUsMTIgQEAKIAljb25zdCBzdHJ1Y3QgZWZpdmFyX29wZXJhdGlvbnMgKm9wcyA9IF9fZWZpdmFycy0+b3BzOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaXZhcnNfbG9jaykpCisJCXJldHVybiAtRUlOVFI7CiAJc3RhdHVzID0gb3BzLT5nZXRfdmFyaWFibGUoZW50cnktPnZhci5WYXJpYWJsZU5hbWUsCiAJCQkJICAgJmVudHJ5LT52YXIuVmVuZG9yR3VpZCwKIAkJCQkgICBhdHRyaWJ1dGVzLCBzaXplLCBkYXRhKTsKLQlzcGluX3VubG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJdXAoJmVmaXZhcnNfbG9jayk7CiAKIAlyZXR1cm4gZWZpX3N0YXR1c190b19lcnIoc3RhdHVzKTsKIH0KQEAgLTkxNyw3ICs5MzcsOCBAQAogCSAqIHNldF92YXJpYWJsZSBjYWxsLCBhbmQgcmVtb3ZhbCBvZiB0aGUgdmFyaWFibGUgZnJvbSB0aGUgZWZpdmFycwogCSAqIGxpc3QgKGluIHRoZSBjYXNlIG9mIGFuIGF1dGhlbnRpY2F0ZWQgZGVsZXRlKS4KIAkgKi8KLQlzcGluX2xvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaXZhcnNfbG9jaykpCisJCXJldHVybiAtRUlOVFI7CiAKIAkvKgogCSAqIEVuc3VyZSB0aGF0IHRoZSBhdmFpbGFibGUgc3BhY2UgaGFzbid0IHNocnVuayBiZWxvdyB0aGUgc2FmZSBsZXZlbApAQCAtOTU3LDcgKzk3OCw3IEBACiAJaWYgKHN0YXR1cyA9PSBFRklfTk9UX0ZPVU5EKQogCQllZml2YXJfZW50cnlfbGlzdF9kZWxfdW5sb2NrKGVudHJ5KTsKIAllbHNlCi0JCXNwaW5fdW5sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwkJdXAoJmVmaXZhcnNfbG9jayk7CiAKIAlpZiAoc3RhdHVzICYmIHN0YXR1cyAhPSBFRklfQlVGRkVSX1RPT19TTUFMTCkKIAkJcmV0dXJuIGVmaV9zdGF0dXNfdG9fZXJyKHN0YXR1cyk7CkBAIC05NjUsNyArOTg2LDcgQEAKIAlyZXR1cm4gMDsKIAogb3V0OgotCXNwaW5fdW5sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwl1cCgmZWZpdmFyc19sb2NrKTsKIAlyZXR1cm4gZXJyOwogCiB9CkBAIC05NzgsOSArOTk5LDkgQEAKICAqIGVmaXZhcl9lbnRyeV9pdGVyX2VuZCgpIGlzIGNhbGxlZC4gVGhpcyBmdW5jdGlvbiBpcyB1c3VhbGx5IHVzZWQgaW4KICAqIGNvbmp1bmN0aW9uIHdpdGggX19lZml2YXJfZW50cnlfaXRlcigpIG9yIGVmaXZhcl9lbnRyeV9pdGVyKCkuCiAgKi8KLXZvaWQgZWZpdmFyX2VudHJ5X2l0ZXJfYmVnaW4odm9pZCkKK2ludCBlZml2YXJfZW50cnlfaXRlcl9iZWdpbih2b2lkKQogewotCXNwaW5fbG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJcmV0dXJuIGRvd25faW50ZXJydXB0aWJsZSgmZWZpdmFyc19sb2NrKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGVmaXZhcl9lbnRyeV9pdGVyX2JlZ2luKTsKIApAQCAtOTkxLDcgKzEwMTIsNyBAQAogICovCiB2b2lkIGVmaXZhcl9lbnRyeV9pdGVyX2VuZCh2b2lkKQogewotCXNwaW5fdW5sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwl1cCgmZWZpdmFyc19sb2NrKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGVmaXZhcl9lbnRyeV9pdGVyX2VuZCk7CiAKQEAgLTEwNjcsNyArMTA4OCw5IEBACiB7CiAJaW50IGVyciA9IDA7CiAKLQllZml2YXJfZW50cnlfaXRlcl9iZWdpbigpOworCWVyciA9IGVmaXZhcl9lbnRyeV9pdGVyX2JlZ2luKCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAllcnIgPSBfX2VmaXZhcl9lbnRyeV9pdGVyKGZ1bmMsIGhlYWQsIGRhdGEsIE5VTEwpOwogCWVmaXZhcl9lbnRyeV9pdGVyX2VuZCgpOwogCkBAIC0xMTEyLDEyICsxMTM1LDE4IEBACiAJCSAgICAgY29uc3Qgc3RydWN0IGVmaXZhcl9vcGVyYXRpb25zICpvcHMsCiAJCSAgICAgc3RydWN0IGtvYmplY3QgKmtvYmplY3QpCiB7Ci0Jc3Bpbl9sb2NrX2luaXQoJmVmaXZhcnMtPmxvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaXZhcnNfbG9jaykpCisJCXJldHVybiAtRUlOVFI7CisKIAllZml2YXJzLT5vcHMgPSBvcHM7CiAJZWZpdmFycy0+a29iamVjdCA9IGtvYmplY3Q7CiAKIAlfX2VmaXZhcnMgPSBlZml2YXJzOwogCisJcHJfaW5mbygiUmVnaXN0ZXJlZCBlZml2YXJzIG9wZXJhdGlvbnNcbiIpOworCisJdXAoJmVmaXZhcnNfbG9jayk7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGVmaXZhcnNfcmVnaXN0ZXIpOwpAQCAtMTEzMyw2ICsxMTYyLDkgQEAKIHsKIAlpbnQgcnY7CiAKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZml2YXJzX2xvY2spKQorCQlyZXR1cm4gLUVJTlRSOworCiAJaWYgKCFfX2VmaXZhcnMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJlZml2YXJzIG5vdCByZWdpc3RlcmVkXG4iKTsKIAkJcnYgPSAtRUlOVkFMOwpAQCAtMTE0NCwxMCArMTE3NiwxMiBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlwcl9pbmZvKCJVbnJlZ2lzdGVyZWQgZWZpdmFycyBvcGVyYXRpb25zXG4iKTsKIAlfX2VmaXZhcnMgPSBOVUxMOwogCiAJcnYgPSAwOwogb3V0OgorCXVwKCZlZml2YXJzX2xvY2spOwogCXJldHVybiBydjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGVmaXZhcnNfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9nc21pLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9nc21pLmMKaW5kZXggZjFhYjA1ZS4uYzQ2Mzg3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvZ3NtaS5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL2dzbWkuYwpAQCAtOTEwLDggKzkxMCw3IEBACiAJZ3NtaV9idWZfZnJlZShnc21pX2Rldi5wYXJhbV9idWYpOwogCWdzbWlfYnVmX2ZyZWUoZ3NtaV9kZXYuZGF0YV9idWYpOwogCWdzbWlfYnVmX2ZyZWUoZ3NtaV9kZXYubmFtZV9idWYpOwotCWlmIChnc21pX2Rldi5kbWFfcG9vbCkKLQkJZG1hX3Bvb2xfZGVzdHJveShnc21pX2Rldi5kbWFfcG9vbCk7CisJZG1hX3Bvb2xfZGVzdHJveShnc21pX2Rldi5kbWFfcG9vbCk7CiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZ3NtaV9kZXYucGRldik7CiAJcHJfaW5mbygiZ3NtaTogZmFpbGVkIHRvIGxvYWQ6ICVkXG4iLCByZXQpOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZwZ2EvS2NvbmZpZyBiL2RyaXZlcnMvZnBnYS9LY29uZmlnCmluZGV4IGQ2MTQxMDIuLmNkODQ5MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZnBnYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZnBnYS9LY29uZmlnCkBAIC0yMSw2ICsyMSw3IEBACiAKIGNvbmZpZyBGUEdBX01HUl9aWU5RX0ZQR0EKIAl0cmlzdGF0ZSAiWGlsaW54IFp5bnEgRlBHQSIKKwlkZXBlbmRzIG9uIEFSQ0hfWllOUSB8fCBDT01QSUxFX1RFU1QKIAlkZXBlbmRzIG9uIEhBU19ETUEKIAloZWxwCiAJICBGUEdBIG1hbmFnZXIgZHJpdmVyIHN1cHBvcnQgZm9yIFhpbGlueCBaeW5xIEZQR0FzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL0tjb25maWcgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwppbmRleCA5OGRkNDdhLi4yNmVlMDBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwpAQCAtMTAsMjcgKzEwLDYgQEAKIAkgIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zLiAgTmV3IHVzZXMgb2YgdGhpcyBhcmUKIAkgIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkLgogCi1jb25maWcgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKLQlib29sCi0JaGVscAotCSAgU2VsZWN0IHRoaXMgY29uZmlnIG9wdGlvbiBmcm9tIHRoZSBhcmNoaXRlY3R1cmUgS2NvbmZpZywgaWYKLQkgIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSBncGlvbGliIG9uIHRoZSBhcmNoaXRlY3R1cmUsIGJ1dCBsZXQgdGhlCi0JICB1c2VyIGRlY2lkZSB3aGV0aGVyIHRvIGFjdHVhbGx5IGJ1aWxkIGl0IG9yIG5vdC4KLQkgIFNlbGVjdCB0aGlzIGluc3RlYWQgb2YgQVJDSF9SRVFVSVJFX0dQSU9MSUIsIGlmIHlvdXIgYXJjaGl0ZWN0dXJlIGRvZXMKLQkgIG5vdCBkZXBlbmQgb24gR1BJT3MgYmVpbmcgYXZhaWxhYmxlLCBidXQgcmF0aGVyIGxldCB0aGUgdXNlcgotCSAgZGVjaWRlIHdoZXRoZXIgaGUgbmVlZHMgaXQgb3Igbm90LgotCi1jb25maWcgQVJDSF9SRVFVSVJFX0dQSU9MSUIKLQlib29sCi0Jc2VsZWN0IEdQSU9MSUIKLQloZWxwCi0JICBQbGF0Zm9ybXMgc2VsZWN0IGdwaW9saWIgaWYgdGhleSB1c2UgdGhpcyBpbmZyYXN0cnVjdHVyZQotCSAgZm9yIGFsbCB0aGVpciBHUElPcywgdXN1YWxseSBzdGFydGluZyB3aXRoIG9uZXMgaW50ZWdyYXRlZAotCSAgaW50byBTT0MgcHJvY2Vzc29ycy4KLQkgIFNlbGVjdGluZyB0aGlzIGZyb20gdGhlIGFyY2hpdGVjdHVyZSBjb2RlIHdpbGwgY2F1c2UgdGhlIGdwaW9saWIKLQkgIGNvZGUgdG8gYWx3YXlzIGdldCBidWlsdCBpbi4KLQotCiBtZW51Y29uZmlnIEdQSU9MSUIKIAlib29sICJHUElPIFN1cHBvcnQiCiAJc2VsZWN0IEFOT05fSU5PREVTCkBAIC01MCw2ICsyOSw3IEBACiBjb25maWcgT0ZfR1BJTwogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIE9GCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAogY29uZmlnIEdQSU9fQUNQSQogCWRlZl9ib29sIHkKQEAgLTg2LDYgKzY2LDcgQEAKIAkgIGV4cG9ydGVkIHRvIHVzZXJzcGFjZTsgdGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gZGVidWdnaW5nLgogCiBjb25maWcgR1BJT19HRU5FUklDCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0gIyBPbmx5IGZvciBJT01FTSBkcml2ZXJzCiAJdHJpc3RhdGUKIAogIyBwdXQgZHJpdmVycyBpbiB0aGUgcmlnaHQgc2VjdGlvbiwgaW4gYWxwaGFiZXRpY2FsIG9yZGVyCkBAIC05NSw2ICs3Niw3IEBACiAJdHJpc3RhdGUKIAogbWVudSAiTWVtb3J5IG1hcHBlZCBHUElPIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAogY29uZmlnIEdQSU9fNzRYWF9NTUlPCiAJdHJpc3RhdGUgIkdQSU8gZHJpdmVyIGZvciA3NHh4LUlDcyB3aXRoIE1NSU8gYWNjZXNzIgpAQCAtMTI3LDYgKzEwOSwxMyBAQAogCSAgZHJpdmVyIGZvciBHUElPIGZ1bmN0aW9uYWxpdHkgb24gUHJvbW9udG9yeSBJT0h1YgogCSAgUmVxdWlyZSBBQ1BJIEFTTCBjb2RlIHRvIGVudW1lcmF0ZSBhcyBhIHBsYXRmb3JtIGRldmljZS4KIAorY29uZmlnIEdQSU9fQVNQRUVECisJdHJpc3RhdGUgIkFzcGVlZCBHUElPIHN1cHBvcnQiCisJZGVwZW5kcyBvbiAoQVJDSF9BU1BFRUQgfHwgQ09NUElMRV9URVNUKSAmJiBPRl9HUElPCisJc2VsZWN0IEdQSU9MSUJfSVJRQ0hJUAorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCBBc3BlZWQgQVNUMjQwMCBhbmQgQVNUMjUwMCBHUElPIGNvbnRyb2xsZXJzLgorCiBjb25maWcgR1BJT19BVEg3OQogCXRyaXN0YXRlICJBdGhlcm9zIEFSNzFYWC9BUjcyNFgvQVI5MTNYIEdQSU8gc3VwcG9ydCIKIAlkZWZhdWx0IHkgaWYgQVRINzkKQEAgLTEzNyw2ICsxMjYsMTIgQEAKIAkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgR1BJTyBkcml2ZXIgZm9yCiAJICBBdGhlcm9zIEFSNzFYWC9BUjcyNFgvQVI5MTNYIFNvQyBkZXZpY2VzLgogCitjb25maWcgR1BJT19BWFAyMDkKKwl0cmlzdGF0ZSAiWC1Qb3dlcnMgQVhQMjA5IFBNSUMgR1BJTyBTdXBwb3J0IgorCWRlcGVuZHMgb24gTUZEX0FYUDIwWAorCWhlbHAKKwkgIFNheSB5ZXMgdG8gZW5hYmxlIEdQSU8gc3VwcG9ydCBmb3IgdGhlIEFYUDIwOSBQTUlDCisKIGNvbmZpZyBHUElPX0JDTV9LT05BCiAJYm9vbCAiQnJvYWRjb20gS29uYSBHUElPIgogCWRlcGVuZHMgb24gT0ZfR1BJTyAmJiAoQVJDSF9CQ01fTU9CSUxFIHx8IENPTVBJTEVfVEVTVCkKQEAgLTE4OCw3ICsxODMsNyBAQAogY29uZmlnIEdQSU9fRVRSQVhGUwogCWJvb2wgIkF4aXMgRVRSQVggRlMgR2VuZXJhbCBJL08iCiAJZGVwZW5kcyBvbiBDUklTIHx8IENPTVBJTEVfVEVTVAotCWRlcGVuZHMgb24gT0YKKwlkZXBlbmRzIG9uIE9GX0dQSU8KIAlzZWxlY3QgR1BJT19HRU5FUklDCiAJc2VsZWN0IEdQSU9MSUJfSVJRQ0hJUAogCWhlbHAKQEAgLTIxNCw3ICsyMDksNyBAQAogCiBjb25maWcgR1BJT19HUkdQSU8KIAl0cmlzdGF0ZSAiQWVyb2ZsZXggR2Fpc2xlciBHUkdQSU8gc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE9GCisJZGVwZW5kcyBvbiBPRl9HUElPCiAJc2VsZWN0IEdQSU9fR0VORVJJQwogCXNlbGVjdCBJUlFfRE9NQUlOCiAJaGVscApAQCAtMjM2LDcgKzIzMSw4IEBACiAKIGNvbmZpZyBHUElPX0lPUAogCXRyaXN0YXRlICJJbnRlbCBJT1AgR1BJTyIKLQlkZXBlbmRzIG9uIEFSTSAmJiAoQVJDSF9JT1AzMlggfHwgQVJDSF9JT1AzM1gpCisJZGVwZW5kcyBvbiBBUkNIX0lPUDMyWCB8fCBBUkNIX0lPUDMzWCB8fCBDT01QSUxFX1RFU1QKKwlzZWxlY3QgR1BJT19HRU5FUklDCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIHRvIHN1cHBvcnQgdGhlIEdQSU8gZnVuY3Rpb25hbGl0eSBvZiBhIG51bWJlciBvZiBJbnRlbAogCSAgSU9QMzJYIG9yIElPUDMzWC4KQEAgLTI4Niw2ICsyODIsMTggQEAKIAkgIChFQlUpIGZvdW5kIG9uIExhbnRpcSBTb0NzLiBUaGUgZ3Bpb3MgYXJlIG91dHB1dCBvbmx5IGFzIHRoZXkgYXJlCiAJICBjcmVhdGVkIGJ5IGF0dGFjaGluZyBhIDE2Yml0IGxhdGNoIHRvIHRoZSBidXMuCiAKK2NvbmZpZyBHUElPX01PQ0tVUAorCXRyaXN0YXRlICJHUElPIFRlc3RpbmcgRHJpdmVyIgorCWRlcGVuZHMgb24gR1BJT0xJQgorCXNlbGVjdCBHUElPX1NZU0ZTCisJaGVscAorCSAgVGhpcyBlbmFibGVzIEdQSU8gVGVzdGluZyBkcml2ZXIsIHdoaWNoIHByb3ZpZGVzIGEgd2F5IHRvIHRlc3QgR1BJTworCSAgc3Vic3lzdGVtIHRocm91Z2ggc3lzZnMob3IgY2hhciBkZXZpY2UpIGFuZCBkZWJ1Z2ZzLiBHUElPX1NZU0ZTCisJICBtdXN0IGJlIHNlbGVjdGVkIGZvciB0aGlzIHRlc3QuCisJICBVc2VyIGNvdWxkIHVzZSBpdCB0aHJvdWdoIHRoZSBzY3JpcHQgaW4KKwkgIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2dwaW8vZ3Bpby1tb2NrdXAuc2guIFJlZmVyZW5jZSB0aGUgdXNhZ2UgaW4KKwkgIGl0LgorCiBjb25maWcgR1BJT19NT1hBUlQKIAlib29sICJNT1hBUlQgR1BJTyBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJDSF9NT1hBUlQgfHwgQ09NUElMRV9URVNUCkBAIC0zMTIsNyArMzIwLDcgQEAKIGNvbmZpZyBHUElPX01WRUJVCiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gUExBVF9PUklPTgotCWRlcGVuZHMgb24gT0YKKwlkZXBlbmRzIG9uIE9GX0dQSU8KIAlzZWxlY3QgR0VORVJJQ19JUlFfQ0hJUAogCiBjb25maWcgR1BJT19NWEMKQEAgLTQwNSw3ICs0MTMsNyBAQAogCWJvb2wgIk5WSURJQSBUZWdyYSBHUElPIHN1cHBvcnQiCiAJZGVmYXVsdCBBUkNIX1RFR1JBCiAJZGVwZW5kcyBvbiBBUkNIX1RFR1JBIHx8IENPTVBJTEVfVEVTVAotCWRlcGVuZHMgb24gT0YKKwlkZXBlbmRzIG9uIE9GX0dQSU8KIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gc3VwcG9ydCBHUElPIHBpbnMgb24gTlZJRElBIFRlZ3JhIFNvQ3MuCiAKQEAgLTU3Myw2ICs1ODEsMTkgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAogCSAgYmUgY2FsbGVkIGY3MTg4eC1ncGlvLgogCitjb25maWcgR1BJT19HUElPX01NCisJdHJpc3RhdGUgIkRpYW1vbmQgU3lzdGVtcyBHUElPLU1NIEdQSU8gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElTQV9CVVNfQVBJCisJaGVscAorCSAgRW5hYmxlcyBHUElPIHN1cHBvcnQgZm9yIHRoZSBEaWFtb25kIFN5c3RlbXMgR1BJTy1NTSBhbmQgR1BJTy1NTS0xMi4KKworCSAgVGhlIERpYW1vbmQgU3lzdGVtcyBHUElPLU1NIGRldmljZSBmZWF0dXJlcyA0OCBsaW5lcyBvZiBkaWdpdGFsIEkvTworCSAgdmlhIHRoZSBlbXVsYXRpb24gb2YgZHVhbCA4MkM1NUEgUFBJIGNoaXBzLiBUaGlzIGRyaXZlciBwcm92aWRlcyBHUElPCisJICBzdXBwb3J0IGZvciB0aGVzZSA0OCBjaGFubmVscyBvZiBkaWdpdGFsIEkvTy4KKworCSAgVGhlIGJhc2UgcG9ydCBhZGRyZXNzZXMgZm9yIHRoZSBkZXZpY2VzIG1heSBiZSBjb25maWd1cmVkIHZpYSB0aGUgYmFzZQorCSAgYXJyYXkgbW9kdWxlIHBhcmFtZXRlci4KKwogY29uZmlnIEdQSU9fSVQ4NwogCXRyaXN0YXRlICJJVDg3eHggR1BJTyBzdXBwb3J0IgogCWhlbHAKQEAgLTc3OSw2ICs4MDAsMTMgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAogCSAgYmUgY2FsbGVkIGdwaW8tdHBpYzI4MTAuCiAKK2NvbmZpZyBHUElPX1RTNDkwMAorCXRyaXN0YXRlICJUZWNobm9sb2dpYyBTeXN0ZW1zIEZQR0EgSTJDIEdQSU8iCisJc2VsZWN0IFJFR01BUF9JMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gZW5hYmxlZCB0aGUgR1BJTyBkcml2ZXIgZm9yIFRlY2hub2xvZ2ljJ3MgRlBHQSBjb3JlLgorCSAgU2VyaWVzIHN1cHBvcnRlZCBpbmNsdWRlIFRTLTQxMDAsIFRTLTQ5MDAsIFRTLTc5NzAgYW5kIFRTLTc5OTAuCisKIGVuZG1lbnUKIAogbWVudSAiTUZEIEdQSU8gZXhwYW5kZXJzIgpAQCAtODQ4LDYgKzg3NiwxNCBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBncGlvLWRsbjIuCiAKK2NvbmZpZyBIVENfRUdQSU8KKwlib29sICJIVEMgRUdQSU8gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEdQSU9MSUIgJiYgQVJNCisJaGVscAorCSAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgQ1BMRCBlZ3BpbyBjaGlwIHByZXNlbnQgb24KKwkgICAgc2V2ZXJhbCBIVEMgcGhvbmVzLiAgSXQgcHJvdmlkZXMgYmFzaWMgc3VwcG9ydCBmb3IgaW5wdXQKKwkgICAgcGlucywgb3V0cHV0IHBpbnMsIGFuZCBpcnFzLgorCiBjb25maWcgR1BJT19KQU5aX1RUTAogCXRyaXN0YXRlICJKYW56IFZNT0QtVFRMIERpZ2l0YWwgSU8gTW9kdWxlIgogCWRlcGVuZHMgb24gTUZEX0pBTlpfQ01PRElPCkBAIC04NzQsNiArOTEwLDE2IEBACiAJICBMUDM5NDMgY2FuIGJlIHVzZWQgYXMgYSBHUElPIGV4cGFuZGVyIHdoaWNoIHByb3ZpZGVzIHVwIHRvIDE2IEdQSU9zLgogCSAgT3BlbiBkcmFpbiBvdXRwdXRzIGFyZSByZXF1aXJlZCBmb3IgdGhpcyB1c2FnZS4KIAorY29uZmlnIEdQSU9fTFA4NzNYCisJdHJpc3RhdGUgIlRJIExQODczWCBHUE8iCisJZGVwZW5kcyBvbiBNRkRfVElfTFA4NzNYCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEdQTyBvbiBUSSBMcDg3M3ggUE1JQ3MuIDIgR1BPcyBhcmUgcHJlc2VudAorCSAgb24gTFA4NzNYIFBNSUNzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQorICAgICAgICAgIGNhbGxlZCBncGlvLWxwODczeC4KKwogY29uZmlnIEdQSU9fTUFYNzc2MjAKIAl0cmlzdGF0ZSAiR1BJTyBzdXBwb3J0IGZvciBQTUlDIE1BWDc3NjIwIGFuZCBNQVgyMDAyNCIKIAlkZXBlbmRzIG9uIE1GRF9NQVg3NzYyMApAQCAtOTg0LDYgKzEwMzAsMTkgQEAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUGhpbGlwcyBVQ0IxNDAwIEdQSU8gcGlucy4KIAkgIFRoZSBVQ0IxNDAwIGlzIGFuIEFDOTcgYXVkaW8gY29kZWMuCiAKK2NvbmZpZyBHUElPX1dISVNLRVlfQ09WRQorCXRyaXN0YXRlICJHUElPIHN1cHBvcnQgZm9yIFdoaXNrZXkgQ292ZSBQTUlDIgorCWRlcGVuZHMgb24gSU5URUxfU09DX1BNSUMKKwlzZWxlY3QgR1BJT0xJQl9JUlFDSElQCisJaGVscAorCSAgU3VwcG9ydCBmb3IgR1BJTyBwaW5zIG9uIFdoaXNrZXkgQ292ZSBQTUlDLgorCisJICBTYXkgWWVzIGlmIHlvdSBoYXZlIGEgSW50ZWwgU29DIGJhc2VkIHRhYmxldCB3aXRoIFdoaXNrZXkgQ292ZSBQTUlDCisJICBpbnNpZGUuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgZ3Bpby13Y292ZS4KKwogY29uZmlnIEdQSU9fV004MzFYCiAJdHJpc3RhdGUgIldNODMxeCBHUElPcyIKIAlkZXBlbmRzIG9uIE1GRF9XTTgzMVgKQEAgLTEwOTksNyArMTE1OCw3IEBACiAKIGNvbmZpZyBHUElPXzc0WDE2NAogCXRyaXN0YXRlICI3NHgxNjQgc2VyaWFsLWluL3BhcmFsbGVsLW91dCA4LWJpdHMgc2hpZnQgcmVnaXN0ZXIiCi0JZGVwZW5kcyBvbiBPRgorCWRlcGVuZHMgb24gT0ZfR1BJTwogCWhlbHAKIAkgIERyaXZlciBmb3IgNzR4MTY0IGNvbXBhdGlibGUgc2VyaWFsLWluL3BhcmFsbGVsLW91dCA4LW91dHB1dHMKIAkgIHNoaWZ0IHJlZ2lzdGVycy4gVGhpcyBkcml2ZXIgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhY2Nlc3MKQEAgLTExMzAsNiArMTE4OSw3IEBACiAKIGNvbmZpZyBHUElPX01DUDIzUzA4CiAJdHJpc3RhdGUgIk1pY3JvY2hpcCBNQ1AyM3h4eCBJL08gZXhwYW5kZXIiCisJZGVwZW5kcyBvbiBPRl9HUElPCiAJc2VsZWN0IEdQSU9MSUJfSVJRQ0hJUAogCWhlbHAKIAkgIFNQSS9JMkMgZHJpdmVyIGZvciBNaWNyb2NoaXAgTUNQMjNTMDgvTUNQMjNTMTcvTUNQMjMwMDgvTUNQMjMwMTcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9NYWtlZmlsZSBiL2RyaXZlcnMvZ3Bpby9NYWtlZmlsZQppbmRleCAyYTAzNWVkLi5hYjI4YTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncGlvL01ha2VmaWxlCkBAIC0yOCw2ICsyOCw4IEBACiBvYmotJChDT05GSUdfR1BJT19BTURQVCkJKz0gZ3Bpby1hbWRwdC5vCiBvYmotJChDT05GSUdfR1BJT19BUklaT05BKQkrPSBncGlvLWFyaXpvbmEubwogb2JqLSQoQ09ORklHX0dQSU9fQVRINzkpCSs9IGdwaW8tYXRoNzkubworb2JqLSQoQ09ORklHX0dQSU9fQVNQRUVEKQkrPSBncGlvLWFzcGVlZC5vCitvYmotJChDT05GSUdfR1BJT19BWFAyMDkpCSs9IGdwaW8tYXhwMjA5Lm8KIG9iai0kKENPTkZJR19HUElPX0JDTV9LT05BKQkrPSBncGlvLWJjbS1rb25hLm8KIG9iai0kKENPTkZJR19HUElPX0JSQ01TVEIpCSs9IGdwaW8tYnJjbXN0Yi5vCiBvYmotJChDT05GSUdfR1BJT19CVDhYWCkJKz0gZ3Bpby1idDh4eC5vCkBAIC00NCw3ICs0Niw5IEBACiBvYmotJChDT05GSUdfR1BJT19FVFJBWEZTKQkrPSBncGlvLWV0cmF4ZnMubwogb2JqLSQoQ09ORklHX0dQSU9fRjcxODhYKQkrPSBncGlvLWY3MTg4eC5vCiBvYmotJChDT05GSUdfR1BJT19HRV9GUEdBKQkrPSBncGlvLWdlLm8KK29iai0kKENPTkZJR19HUElPX0dQSU9fTU0pCSs9IGdwaW8tZ3Bpby1tbS5vCiBvYmotJChDT05GSUdfR1BJT19HUkdQSU8pCSs9IGdwaW8tZ3JncGlvLm8KK29iai0kKENPTkZJR19IVENfRUdQSU8pCQkrPSBncGlvLWh0Yy1lZ3Bpby5vCiBvYmotJChDT05GSUdfR1BJT19JQ0gpCQkrPSBncGlvLWljaC5vCiBvYmotJChDT05GSUdfR1BJT19JT1ApCQkrPSBncGlvLWlvcC5vCiBvYmotJChDT05GSUdfR1BJT19JVDg3KQkJKz0gZ3Bpby1pdDg3Lm8KQEAgLTU2LDYgKzYwLDcgQEAKIG9iai0kKENPTkZJR19HUElPX0xQMzk0MykJKz0gZ3Bpby1scDM5NDMubwogb2JqLSQoQ09ORklHX0dQSU9fTFBDMThYWCkJKz0gZ3Bpby1scGMxOHh4Lm8KIG9iai0kKENPTkZJR19BUkNIX0xQQzMyWFgpCSs9IGdwaW8tbHBjMzJ4eC5vCitvYmotJChDT05GSUdfR1BJT19MUDg3M1gpCSs9IGdwaW8tbHA4NzN4Lm8KIG9iai0kKENPTkZJR19HUElPX0xZTlhQT0lOVCkJKz0gZ3Bpby1seW54cG9pbnQubwogb2JqLSQoQ09ORklHX0dQSU9fTUFYNzMwWCkJKz0gZ3Bpby1tYXg3MzB4Lm8KIG9iai0kKENPTkZJR19HUElPX01BWDczMDApCSs9IGdwaW8tbWF4NzMwMC5vCkBAIC03MCw2ICs3NSw3IEBACiBvYmotJChDT05GSUdfR1BJT19NQ1AyM1MwOCkJKz0gZ3Bpby1tY3AyM3MwOC5vCiBvYmotJChDT05GSUdfR1BJT19NTF9JT0gpCSs9IGdwaW8tbWwtaW9oLm8KIG9iai0kKENPTkZJR19HUElPX01NX0xBTlRJUSkJKz0gZ3Bpby1tbS1sYW50aXEubworb2JqLSQoQ09ORklHX0dQSU9fTU9DS1VQKSAgICAgICs9IGdwaW8tbW9ja3VwLm8KIG9iai0kKENPTkZJR19HUElPX01PWEFSVCkJKz0gZ3Bpby1tb3hhcnQubwogb2JqLSQoQ09ORklHX0dQSU9fTVBDNTIwMCkJKz0gZ3Bpby1tcGM1MjAwLm8KIG9iai0kKENPTkZJR19HUElPX01QQzhYWFgpCSs9IGdwaW8tbXBjOHh4eC5vCkBAIC0xMTAsNiArMTE2LDcgQEAKIG9iai0kKENPTkZJR19HUElPX1RQUzY1OTEwKQkrPSBncGlvLXRwczY1OTEwLm8KIG9iai0kKENPTkZJR19HUElPX1RQUzY1OTEyKQkrPSBncGlvLXRwczY1OTEyLm8KIG9iai0kKENPTkZJR19HUElPX1RTNDgwMCkJKz0gZ3Bpby10czQ4MDAubworb2JqLSQoQ09ORklHX0dQSU9fVFM0OTAwKQkrPSBncGlvLXRzNDkwMC5vCiBvYmotJChDT05GSUdfR1BJT19UUzU1MDApCSs9IGdwaW8tdHM1NTAwLm8KIG9iai0kKENPTkZJR19HUElPX1RXTDQwMzApCSs9IGdwaW8tdHdsNDAzMC5vCiBvYmotJChDT05GSUdfR1BJT19UV0w2MDQwKQkrPSBncGlvLXR3bDYwNDAubwpAQCAtMTIwLDYgKzEyNyw3IEBACiBvYmotJChDT05GSUdfR1BJT19WSVBFUkJPQVJEKQkrPSBncGlvLXZpcGVyYm9hcmQubwogb2JqLSQoQ09ORklHX0dQSU9fVlI0MVhYKQkrPSBncGlvLXZyNDF4eC5vCiBvYmotJChDT05GSUdfR1BJT19WWDg1NSkJKz0gZ3Bpby12eDg1NS5vCitvYmotJChDT05GSUdfR1BJT19XSElTS0VZX0NPVkUpCSs9IGdwaW8td2NvdmUubwogb2JqLSQoQ09ORklHX0dQSU9fV004MzFYKQkrPSBncGlvLXdtODMxeC5vCiBvYmotJChDT05GSUdfR1BJT19XTTgzNTApCSs9IGdwaW8td204MzUwLm8KIG9iai0kKENPTkZJR19HUElPX1dNODk5NCkJKz0gZ3Bpby13bTg5OTQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tYWx0ZXJhLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1hbHRlcmEuYwppbmRleCAzZjg3YTAzLi41YmRkYmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1hbHRlcmEuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1hbHRlcmEuYwpAQCAtMTcsNiArMTcsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tYXJpem9uYS5jIGIvZHJpdmVycy9ncGlvL2dwaW8tYXJpem9uYS5jCmluZGV4IDk5MTM3MDQuLjQ4MjQ2MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLWFyaXpvbmEuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1hcml6b25hLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAkJCSAgIEFSSVpPTkFfR1BOX0xWTCwgdmFsdWUpOwogfQogCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKIAkubGFiZWwJCQk9ICJhcml6b25hIiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5kaXJlY3Rpb25faW5wdXQJPSBhcml6b25hX2dwaW9fZGlyZWN0aW9uX2luLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tYXNwZWVkLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1hc3BlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2E1OTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tYXNwZWVkLmMKQEAgLTAsMCArMSw0NTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBJQk0gQ29ycC4KKyAqCisgKiBKb2VsIFN0YW5sZXkgPGpvZWxAam1zLmlkLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL2NvbnN1bWVyLmg+CisKK3N0cnVjdCBhc3BlZWRfZ3BpbyB7CisJc3RydWN0IGdwaW9fY2hpcCBjaGlwOworCXNwaW5sb2NrX3QgbG9jazsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJaW50IGlycTsKK307CisKK3N0cnVjdCBhc3BlZWRfZ3Bpb19iYW5rIHsKKwl1aW50MTZfdAl2YWxfcmVnczsKKwl1aW50MTZfdAlpcnFfcmVnczsKKwljb25zdCBjaGFyCW5hbWVzWzRdOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhc3BlZWRfZ3Bpb19iYW5rIGFzcGVlZF9ncGlvX2JhbmtzW10gPSB7CisJeworCQkudmFsX3JlZ3MgPSAweDAwMDAsCisJCS5pcnFfcmVncyA9IDB4MDAwOCwKKwkJLm5hbWVzID0geyAnQScsICdCJywgJ0MnLCAnRCcgfSwKKwl9LAorCXsKKwkJLnZhbF9yZWdzID0gMHgwMDIwLAorCQkuaXJxX3JlZ3MgPSAweDAwMjgsCisJCS5uYW1lcyA9IHsgJ0UnLCAnRicsICdHJywgJ0gnIH0sCisJfSwKKwl7CisJCS52YWxfcmVncyA9IDB4MDA3MCwKKwkJLmlycV9yZWdzID0gMHgwMDk4LAorCQkubmFtZXMgPSB7ICdJJywgJ0onLCAnSycsICdMJyB9LAorCX0sCisJeworCQkudmFsX3JlZ3MgPSAweDAwNzgsCisJCS5pcnFfcmVncyA9IDB4MDBlOCwKKwkJLm5hbWVzID0geyAnTScsICdOJywgJ08nLCAnUCcgfSwKKwl9LAorCXsKKwkJLnZhbF9yZWdzID0gMHgwMDgwLAorCQkuaXJxX3JlZ3MgPSAweDAxMTgsCisJCS5uYW1lcyA9IHsgJ1EnLCAnUicsICdTJywgJ1QnIH0sCisJfSwKKwl7CisJCS52YWxfcmVncyA9IDB4MDA4OCwKKwkJLmlycV9yZWdzID0gMHgwMTQ4LAorCQkubmFtZXMgPSB7ICdVJywgJ1YnLCAnVycsICdYJyB9LAorCX0sCisJLyoKKwkgKiBBIGJhbmsgZXhpc3RzIGZvciB7ICdZJywgJ1onLCAiQUEiLCAiQUIiIH0sIGJ1dCBpcyBub3QgaW1wbGVtZW50ZWQuCisJICogT25seSBoYWxmIG9mIEdQSU9zIFkgc3VwcG9ydCBpbnRlcnJ1cHQgY29uZmlndXJhdGlvbiwgYW5kIG5vbmUgb2YgWiwKKwkgKiBBQSBvciBBQiBkbyBhcyB0aGV5IGFyZSBvdXRwdXQgb25seS4KKwkgKi8KK307CisKKyNkZWZpbmUgR1BJT19CQU5LKHgpCSgoeCkgPj4gNSkKKyNkZWZpbmUgR1BJT19PRkZTRVQoeCkJKCh4KSAmIDB4MWYpCisjZGVmaW5lIEdQSU9fQklUKHgpCUJJVChHUElPX09GRlNFVCh4KSkKKworI2RlZmluZSBHUElPX0RBVEEJMHgwMAorI2RlZmluZSBHUElPX0RJUgkweDA0CisKKyNkZWZpbmUgR1BJT19JUlFfRU5BQkxFCTB4MDAKKyNkZWZpbmUgR1BJT19JUlFfVFlQRTAJMHgwNAorI2RlZmluZSBHUElPX0lSUV9UWVBFMQkweDA4CisjZGVmaW5lIEdQSU9fSVJRX1RZUEUyCTB4MGMKKyNkZWZpbmUgR1BJT19JUlFfU1RBVFVTCTB4MTAKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhc3BlZWRfZ3Bpb19iYW5rICp0b19iYW5rKHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJdW5zaWduZWQgaW50IGJhbmsgPSBHUElPX0JBTksob2Zmc2V0KTsKKworCVdBUk5fT04oYmFuayA+IEFSUkFZX1NJWkUoYXNwZWVkX2dwaW9fYmFua3MpKTsKKwlyZXR1cm4gJmFzcGVlZF9ncGlvX2JhbmtzW2JhbmtdOworfQorCitzdGF0aWMgdm9pZCBfX2lvbWVtICpiYW5rX3ZhbF9yZWcoc3RydWN0IGFzcGVlZF9ncGlvICpncGlvLAorCQljb25zdCBzdHJ1Y3QgYXNwZWVkX2dwaW9fYmFuayAqYmFuaywKKwkJdW5zaWduZWQgaW50IHJlZykKK3sKKwlyZXR1cm4gZ3Bpby0+YmFzZSArIGJhbmstPnZhbF9yZWdzICsgcmVnOworfQorCitzdGF0aWMgdm9pZCBfX2lvbWVtICpiYW5rX2lycV9yZWcoc3RydWN0IGFzcGVlZF9ncGlvICpncGlvLAorCQljb25zdCBzdHJ1Y3QgYXNwZWVkX2dwaW9fYmFuayAqYmFuaywKKwkJdW5zaWduZWQgaW50IHJlZykKK3sKKwlyZXR1cm4gZ3Bpby0+YmFzZSArIGJhbmstPmlycV9yZWdzICsgcmVnOworfQorCitzdGF0aWMgaW50IGFzcGVlZF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgYXNwZWVkX2dwaW8gKmdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CisJY29uc3Qgc3RydWN0IGFzcGVlZF9ncGlvX2JhbmsgKmJhbmsgPSB0b19iYW5rKG9mZnNldCk7CisKKwlyZXR1cm4gISEoaW9yZWFkMzIoYmFua192YWxfcmVnKGdwaW8sIGJhbmssIEdQSU9fREFUQSkpCisJCQkmIEdQSU9fQklUKG9mZnNldCkpOworfQorCitzdGF0aWMgdm9pZCBfX2FzcGVlZF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCSAgICAgIGludCB2YWwpCit7CisJc3RydWN0IGFzcGVlZF9ncGlvICpncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOworCWNvbnN0IHN0cnVjdCBhc3BlZWRfZ3Bpb19iYW5rICpiYW5rID0gdG9fYmFuayhvZmZzZXQpOworCXZvaWQgX19pb21lbSAqYWRkcjsKKwl1MzIgcmVnOworCisJYWRkciA9IGJhbmtfdmFsX3JlZyhncGlvLCBiYW5rLCBHUElPX0RBVEEpOworCXJlZyA9IGlvcmVhZDMyKGFkZHIpOworCisJaWYgKHZhbCkKKwkJcmVnIHw9IEdQSU9fQklUKG9mZnNldCk7CisJZWxzZQorCQlyZWcgJj0gfkdQSU9fQklUKG9mZnNldCk7CisKKwlpb3dyaXRlMzIocmVnLCBhZGRyKTsKK30KKworc3RhdGljIHZvaWQgYXNwZWVkX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJICAgIGludCB2YWwpCit7CisJc3RydWN0IGFzcGVlZF9ncGlvICpncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpby0+bG9jaywgZmxhZ3MpOworCisJX19hc3BlZWRfZ3Bpb19zZXQoZ2MsIG9mZnNldCwgdmFsKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBhc3BlZWRfZ3Bpb19kaXJfaW4oc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IGFzcGVlZF9ncGlvICpncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOworCWNvbnN0IHN0cnVjdCBhc3BlZWRfZ3Bpb19iYW5rICpiYW5rID0gdG9fYmFuayhvZmZzZXQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHJlZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvLT5sb2NrLCBmbGFncyk7CisKKwlyZWcgPSBpb3JlYWQzMihiYW5rX3ZhbF9yZWcoZ3BpbywgYmFuaywgR1BJT19ESVIpKTsKKwlpb3dyaXRlMzIocmVnICYgfkdQSU9fQklUKG9mZnNldCksIGJhbmtfdmFsX3JlZyhncGlvLCBiYW5rLCBHUElPX0RJUikpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpby0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXNwZWVkX2dwaW9fZGlyX291dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgdmFsKQoreworCXN0cnVjdCBhc3BlZWRfZ3BpbyAqZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX2dwaW9fYmFuayAqYmFuayA9IHRvX2Jhbmsob2Zmc2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiByZWc7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpby0+bG9jaywgZmxhZ3MpOworCisJcmVnID0gaW9yZWFkMzIoYmFua192YWxfcmVnKGdwaW8sIGJhbmssIEdQSU9fRElSKSk7CisJaW93cml0ZTMyKHJlZyB8IEdQSU9fQklUKG9mZnNldCksIGJhbmtfdmFsX3JlZyhncGlvLCBiYW5rLCBHUElPX0RJUikpOworCisJX19hc3BlZWRfZ3Bpb19zZXQoZ2MsIG9mZnNldCwgdmFsKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW8tPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzcGVlZF9ncGlvX2dldF9kaXJlY3Rpb24oc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IGFzcGVlZF9ncGlvICpncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOworCWNvbnN0IHN0cnVjdCBhc3BlZWRfZ3Bpb19iYW5rICpiYW5rID0gdG9fYmFuayhvZmZzZXQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvLT5sb2NrLCBmbGFncyk7CisKKwl2YWwgPSBpb3JlYWQzMihiYW5rX3ZhbF9yZWcoZ3BpbywgYmFuaywgR1BJT19ESVIpKSAmIEdQSU9fQklUKG9mZnNldCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gIXZhbDsKKworfQorCitzdGF0aWMgaW5saW5lIGludCBpcnFkX3RvX2FzcGVlZF9ncGlvX2RhdGEoc3RydWN0IGlycV9kYXRhICpkLAorCQlzdHJ1Y3QgYXNwZWVkX2dwaW8gKipncGlvLAorCQljb25zdCBzdHJ1Y3QgYXNwZWVkX2dwaW9fYmFuayAqKmJhbmssCisJCXUzMiAqYml0KQoreworCWludCBvZmZzZXQ7CisKKwlvZmZzZXQgPSBpcnFkX3RvX2h3aXJxKGQpOworCisJKmdwaW8gPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwkqYmFuayA9IHRvX2Jhbmsob2Zmc2V0KTsKKwkqYml0ID0gR1BJT19CSVQob2Zmc2V0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhc3BlZWRfZ3Bpb19pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX2dwaW9fYmFuayAqYmFuazsKKwlzdHJ1Y3QgYXNwZWVkX2dwaW8gKmdwaW87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkIF9faW9tZW0gKnN0YXR1c19hZGRyOworCXUzMiBiaXQ7CisJaW50IHJjOworCisJcmMgPSBpcnFkX3RvX2FzcGVlZF9ncGlvX2RhdGEoZCwgJmdwaW8sICZiYW5rLCAmYml0KTsKKwlpZiAocmMpCisJCXJldHVybjsKKworCXN0YXR1c19hZGRyID0gYmFua19pcnFfcmVnKGdwaW8sIGJhbmssIEdQSU9fSVJRX1NUQVRVUyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpby0+bG9jaywgZmxhZ3MpOworCWlvd3JpdGUzMihiaXQsIHN0YXR1c19hZGRyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFzcGVlZF9ncGlvX2lycV9zZXRfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQsIGJvb2wgc2V0KQoreworCWNvbnN0IHN0cnVjdCBhc3BlZWRfZ3Bpb19iYW5rICpiYW5rOworCXN0cnVjdCBhc3BlZWRfZ3BpbyAqZ3BpbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiByZWcsIGJpdDsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisJaW50IHJjOworCisJcmMgPSBpcnFkX3RvX2FzcGVlZF9ncGlvX2RhdGEoZCwgJmdwaW8sICZiYW5rLCAmYml0KTsKKwlpZiAocmMpCisJCXJldHVybjsKKworCWFkZHIgPSBiYW5rX2lycV9yZWcoZ3BpbywgYmFuaywgR1BJT19JUlFfRU5BQkxFKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvLT5sb2NrLCBmbGFncyk7CisKKwlyZWcgPSBpb3JlYWQzMihhZGRyKTsKKwlpZiAoc2V0KQorCQlyZWcgfD0gYml0OworCWVsc2UKKwkJcmVnICY9IGJpdDsKKwlpb3dyaXRlMzIocmVnLCBhZGRyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYXNwZWVkX2dwaW9faXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCWFzcGVlZF9ncGlvX2lycV9zZXRfbWFzayhkLCBmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFzcGVlZF9ncGlvX2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCWFzcGVlZF9ncGlvX2lycV9zZXRfbWFzayhkLCB0cnVlKTsKK30KKworc3RhdGljIGludCBhc3BlZWRfZ3Bpb19zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCB0eXBlKQoreworCXUzMiB0eXBlMCA9IDA7CisJdTMyIHR5cGUxID0gMDsKKwl1MzIgdHlwZTIgPSAwOworCXUzMiBiaXQsIHJlZzsKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX2dwaW9fYmFuayAqYmFuazsKKwlpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlcjsKKwlzdHJ1Y3QgYXNwZWVkX2dwaW8gKmdwaW87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisJaW50IHJjOworCisJcmMgPSBpcnFkX3RvX2FzcGVlZF9ncGlvX2RhdGEoZCwgJmdwaW8sICZiYW5rLCAmYml0KTsKKwlpZiAocmMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoICh0eXBlICYgSVJRX1RZUEVfU0VOU0VfTUFTSykgeworCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgorCQl0eXBlMiB8PSBiaXQ7CisJY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKKwkJdHlwZTAgfD0gYml0OworCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgorCQloYW5kbGVyID0gaGFuZGxlX2VkZ2VfaXJxOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0xFVkVMX0hJR0g6CisJCXR5cGUwIHw9IGJpdDsKKwljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKKwkJdHlwZTEgfD0gYml0OworCQloYW5kbGVyID0gaGFuZGxlX2xldmVsX2lycTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW8tPmxvY2ssIGZsYWdzKTsKKworCWFkZHIgPSBiYW5rX2lycV9yZWcoZ3BpbywgYmFuaywgR1BJT19JUlFfVFlQRTApOworCXJlZyA9IGlvcmVhZDMyKGFkZHIpOworCXJlZyA9IChyZWcgJiB+Yml0KSB8IHR5cGUwOworCWlvd3JpdGUzMihyZWcsIGFkZHIpOworCisJYWRkciA9IGJhbmtfaXJxX3JlZyhncGlvLCBiYW5rLCBHUElPX0lSUV9UWVBFMSk7CisJcmVnID0gaW9yZWFkMzIoYWRkcik7CisJcmVnID0gKHJlZyAmIH5iaXQpIHwgdHlwZTE7CisJaW93cml0ZTMyKHJlZywgYWRkcik7CisKKwlhZGRyID0gYmFua19pcnFfcmVnKGdwaW8sIGJhbmssIEdQSU9fSVJRX1RZUEUyKTsKKwlyZWcgPSBpb3JlYWQzMihhZGRyKTsKKwlyZWcgPSAocmVnICYgfmJpdCkgfCB0eXBlMjsKKwlpb3dyaXRlMzIocmVnLCBhZGRyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW8tPmxvY2ssIGZsYWdzKTsKKworCWlycV9zZXRfaGFuZGxlcl9sb2NrZWQoZCwgaGFuZGxlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXNwZWVkX2dwaW9faXJxX2hhbmRsZXIoc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmdjID0gaXJxX2Rlc2NfZ2V0X2hhbmRsZXJfZGF0YShkZXNjKTsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmljID0gaXJxX2Rlc2NfZ2V0X2NoaXAoZGVzYyk7CisJc3RydWN0IGFzcGVlZF9ncGlvICpkYXRhID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOworCXVuc2lnbmVkIGludCBpLCBwLCBnaXJxOworCXVuc2lnbmVkIGxvbmcgcmVnOworCisJY2hhaW5lZF9pcnFfZW50ZXIoaWMsIGRlc2MpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXNwZWVkX2dwaW9fYmFua3MpOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGFzcGVlZF9ncGlvX2JhbmsgKmJhbmsgPSAmYXNwZWVkX2dwaW9fYmFua3NbaV07CisKKwkJcmVnID0gaW9yZWFkMzIoYmFua19pcnFfcmVnKGRhdGEsIGJhbmssIEdQSU9fSVJRX1NUQVRVUykpOworCisJCWZvcl9lYWNoX3NldF9iaXQocCwgJnJlZywgMzIpIHsKKwkJCWdpcnEgPSBpcnFfZmluZF9tYXBwaW5nKGdjLT5pcnFkb21haW4sIGkgKiAzMiArIHApOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGdpcnEpOworCQl9CisKKwl9CisKKwljaGFpbmVkX2lycV9leGl0KGljLCBkZXNjKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBhc3BlZWRfZ3Bpb19pcnFjaGlwID0geworCS5uYW1lCQk9ICJhc3BlZWQtZ3BpbyIsCisJLmlycV9hY2sJPSBhc3BlZWRfZ3Bpb19pcnFfYWNrLAorCS5pcnFfbWFzawk9IGFzcGVlZF9ncGlvX2lycV9tYXNrLAorCS5pcnFfdW5tYXNrCT0gYXNwZWVkX2dwaW9faXJxX3VubWFzaywKKwkuaXJxX3NldF90eXBlCT0gYXNwZWVkX2dwaW9fc2V0X3R5cGUsCit9OworCitzdGF0aWMgaW50IGFzcGVlZF9ncGlvX3NldHVwX2lycXMoc3RydWN0IGFzcGVlZF9ncGlvICpncGlvLAorCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByYzsKKworCXJjID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlncGlvLT5pcnEgPSByYzsKKworCXJjID0gZ3Bpb2NoaXBfaXJxY2hpcF9hZGQoJmdwaW8tPmNoaXAsICZhc3BlZWRfZ3Bpb19pcnFjaGlwLAorCQkJMCwgaGFuZGxlX2JhZF9pcnEsIElSUV9UWVBFX05PTkUpOworCWlmIChyYykgeworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQ291bGQgbm90IGFkZCBpcnFjaGlwXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWdwaW9jaGlwX3NldF9jaGFpbmVkX2lycWNoaXAoJmdwaW8tPmNoaXAsICZhc3BlZWRfZ3Bpb19pcnFjaGlwLAorCQkJCSAgICAgZ3Bpby0+aXJxLCBhc3BlZWRfZ3Bpb19pcnFfaGFuZGxlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3BlZWRfZ3Bpb19yZXF1ZXN0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcmV0dXJuIHBpbmN0cmxfcmVxdWVzdF9ncGlvKGNoaXAtPmJhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBhc3BlZWRfZ3Bpb19mcmVlKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcGluY3RybF9mcmVlX2dwaW8oY2hpcC0+YmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFzcGVlZF9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFzcGVlZF9ncGlvICpncGlvOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByYzsKKworCWdwaW8gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpncGlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFncGlvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJZ3Bpby0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoZ3Bpby0+YmFzZSkpCisJCXJldHVybiBQVFJfRVJSKGdwaW8tPmJhc2UpOworCisJc3Bpbl9sb2NrX2luaXQoJmdwaW8tPmxvY2spOworCisJZ3Bpby0+Y2hpcC5uZ3BpbyA9IEFSUkFZX1NJWkUoYXNwZWVkX2dwaW9fYmFua3MpICogMzI7CisKKwlncGlvLT5jaGlwLnBhcmVudCA9ICZwZGV2LT5kZXY7CisJZ3Bpby0+Y2hpcC5kaXJlY3Rpb25faW5wdXQgPSBhc3BlZWRfZ3Bpb19kaXJfaW47CisJZ3Bpby0+Y2hpcC5kaXJlY3Rpb25fb3V0cHV0ID0gYXNwZWVkX2dwaW9fZGlyX291dDsKKwlncGlvLT5jaGlwLmdldF9kaXJlY3Rpb24gPSBhc3BlZWRfZ3Bpb19nZXRfZGlyZWN0aW9uOworCWdwaW8tPmNoaXAucmVxdWVzdCA9IGFzcGVlZF9ncGlvX3JlcXVlc3Q7CisJZ3Bpby0+Y2hpcC5mcmVlID0gYXNwZWVkX2dwaW9fZnJlZTsKKwlncGlvLT5jaGlwLmdldCA9IGFzcGVlZF9ncGlvX2dldDsKKwlncGlvLT5jaGlwLnNldCA9IGFzcGVlZF9ncGlvX3NldDsKKwlncGlvLT5jaGlwLmxhYmVsID0gZGV2X25hbWUoJnBkZXYtPmRldik7CisJZ3Bpby0+Y2hpcC5iYXNlID0gLTE7CisKKwlyYyA9IGRldm1fZ3Bpb2NoaXBfYWRkX2RhdGEoJnBkZXYtPmRldiwgJmdwaW8tPmNoaXAsIGdwaW8pOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiBhc3BlZWRfZ3Bpb19zZXR1cF9pcnFzKGdwaW8sIHBkZXYpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhc3BlZWRfZ3Bpb19vZl90YWJsZVtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYXNwZWVkLGFzdDI0MDAtZ3BpbyIgfSwKKwl7IC5jb21wYXRpYmxlID0gImFzcGVlZCxhc3QyNTAwLWdwaW8iIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhc3BlZWRfZ3Bpb19vZl90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFzcGVlZF9ncGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhc3BlZWRfZ3Bpb19vZl90YWJsZSwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcl9wcm9iZShhc3BlZWRfZ3Bpb19kcml2ZXIsIGFzcGVlZF9ncGlvX3Byb2JlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBc3BlZWQgR1BJTyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWF0aDc5LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1hdGg3OS5jCmluZGV4IGM0ZjRjZGQuLjk0NTdlMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLWF0aDc5LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tYXRoNzkuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvZ3Bpby1hdGg3OS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCiAjZGVmaW5lIEFSNzFYWF9HUElPX1JFR19PRQkJMHgwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tYXhwMjA5LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1heHAyMDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWMyYTUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tYXhwMjA5LmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBBWFAyMHggR1BJTyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTWF4aW1lIFJpcGFyZCA8bWF4aW1lLnJpcGFyZEBmcmVlLWVsZWN0cm9ucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2F4cDIweC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIEFYUDIwWF9HUElPX0ZVTkNUSU9OUwkJMHg3CisjZGVmaW5lIEFYUDIwWF9HUElPX0ZVTkNUSU9OX09VVF9MT1cJMAorI2RlZmluZSBBWFAyMFhfR1BJT19GVU5DVElPTl9PVVRfSElHSAkxCisjZGVmaW5lIEFYUDIwWF9HUElPX0ZVTkNUSU9OX0lOUFVUCTIKKworc3RydWN0IGF4cDIweF9ncGlvIHsKKwlzdHJ1Y3QgZ3Bpb19jaGlwCWNoaXA7CisJc3RydWN0IHJlZ21hcAkJKnJlZ21hcDsKK307CisKK3N0YXRpYyBpbnQgYXhwMjB4X2dwaW9fZ2V0X3JlZyh1bnNpZ25lZCBvZmZzZXQpCit7CisJc3dpdGNoIChvZmZzZXQpIHsKKwljYXNlIDA6CisJCXJldHVybiBBWFAyMFhfR1BJTzBfQ1RSTDsKKwljYXNlIDE6CisJCXJldHVybiBBWFAyMFhfR1BJTzFfQ1RSTDsKKwljYXNlIDI6CisJCXJldHVybiBBWFAyMFhfR1BJTzJfQ1RSTDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBheHAyMHhfZ3Bpb19pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGF4cDIweF9ncGlvICpncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJaW50IHJlZzsKKworCXJlZyA9IGF4cDIweF9ncGlvX2dldF9yZWcob2Zmc2V0KTsKKwlpZiAocmVnIDwgMCkKKwkJcmV0dXJuIHJlZzsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoZ3Bpby0+cmVnbWFwLCByZWcsCisJCQkJICBBWFAyMFhfR1BJT19GVU5DVElPTlMsCisJCQkJICBBWFAyMFhfR1BJT19GVU5DVElPTl9JTlBVVCk7Cit9CisKK3N0YXRpYyBpbnQgYXhwMjB4X2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgYXhwMjB4X2dwaW8gKmdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZWcsIHJldDsKKworCXJlZyA9IGF4cDIweF9ncGlvX2dldF9yZWcob2Zmc2V0KTsKKwlpZiAocmVnIDwgMCkKKwkJcmV0dXJuIHJlZzsKKworCXJldCA9IHJlZ21hcF9yZWFkKGdwaW8tPnJlZ21hcCwgcmVnLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuICEhKHZhbCAmIEJJVChvZmZzZXQgKyA0KSk7Cit9CisKK3N0YXRpYyBpbnQgYXhwMjB4X2dwaW9fZ2V0X2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGF4cDIweF9ncGlvICpncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgcmVnLCByZXQ7CisKKwlyZWcgPSBheHAyMHhfZ3Bpb19nZXRfcmVnKG9mZnNldCk7CisJaWYgKHJlZyA8IDApCisJCXJldHVybiByZWc7CisKKwlyZXQgPSByZWdtYXBfcmVhZChncGlvLT5yZWdtYXAsIHJlZywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogVGhpcyBzaG91bGRuJ3QgcmVhbGx5IGhhcHBlbiBpZiB0aGUgcGluIGlzIGluIHVzZSBhbHJlYWR5LAorCSAqIG9yIGlmIGl0J3Mgbm90IGluIHVzZSB5ZXQsIGl0IGRvZXNuJ3QgbWF0dGVyIHNpbmNlIHdlJ3JlCisJICogZ29pbmcgdG8gY2hhbmdlIHRoZSB2YWx1ZSBzb29uIGFueXdheS4gRGVmYXVsdCB0byBvdXRwdXQuCisJICovCisJaWYgKCh2YWwgJiBBWFAyMFhfR1BJT19GVU5DVElPTlMpID4gMikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFRoZSBHUElPIGRpcmVjdGlvbnMgYXJlIHRoZSB0aHJlZSBsb3dlc3QgdmFsdWVzLgorCSAqIDIgaXMgaW5wdXQsIDAgYW5kIDEgYXJlIG91dHB1dAorCSAqLworCXJldHVybiB2YWwgJiAyOworfQorCitzdGF0aWMgaW50IGF4cDIweF9ncGlvX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsCisJCQkgICAgICBpbnQgdmFsdWUpCit7CisJc3RydWN0IGF4cDIweF9ncGlvICpncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJaW50IHJlZzsKKworCXJlZyA9IGF4cDIweF9ncGlvX2dldF9yZWcob2Zmc2V0KTsKKwlpZiAocmVnIDwgMCkKKwkJcmV0dXJuIHJlZzsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoZ3Bpby0+cmVnbWFwLCByZWcsCisJCQkJICBBWFAyMFhfR1BJT19GVU5DVElPTlMsCisJCQkJICB2YWx1ZSA/IEFYUDIwWF9HUElPX0ZVTkNUSU9OX09VVF9ISUdICisJCQkJICA6IEFYUDIwWF9HUElPX0ZVTkNUSU9OX09VVF9MT1cpOworfQorCitzdGF0aWMgdm9pZCBheHAyMHhfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LAorCQkJICAgIGludCB2YWx1ZSkKK3sKKwlheHAyMHhfZ3Bpb19vdXRwdXQoY2hpcCwgb2Zmc2V0LCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgYXhwMjB4X2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYXhwMjB4X2RldiAqYXhwMjB4ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBheHAyMHhfZ3BpbyAqZ3BpbzsKKwlpbnQgcmV0OworCisJaWYgKCFvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKHBkZXYtPmRldi5vZl9ub2RlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWF4cDIweCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJQYXJlbnQgZHJ2ZGF0YSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZ3BpbyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmdwaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdwaW8pCisJCXJldHVybiAtRU5PTUVNOworCisJZ3Bpby0+Y2hpcC5iYXNlCQkJPSAtMTsKKwlncGlvLT5jaGlwLmNhbl9zbGVlcAkJPSB0cnVlOworCWdwaW8tPmNoaXAucGFyZW50CQk9ICZwZGV2LT5kZXY7CisJZ3Bpby0+Y2hpcC5sYWJlbAkJPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKKwlncGlvLT5jaGlwLm93bmVyCQk9IFRISVNfTU9EVUxFOworCWdwaW8tPmNoaXAuZ2V0CQkJPSBheHAyMHhfZ3Bpb19nZXQ7CisJZ3Bpby0+Y2hpcC5nZXRfZGlyZWN0aW9uCT0gYXhwMjB4X2dwaW9fZ2V0X2RpcmVjdGlvbjsKKwlncGlvLT5jaGlwLnNldAkJCT0gYXhwMjB4X2dwaW9fc2V0OworCWdwaW8tPmNoaXAuZGlyZWN0aW9uX2lucHV0CT0gYXhwMjB4X2dwaW9faW5wdXQ7CisJZ3Bpby0+Y2hpcC5kaXJlY3Rpb25fb3V0cHV0CT0gYXhwMjB4X2dwaW9fb3V0cHV0OworCWdwaW8tPmNoaXAubmdwaW8JCT0gMzsKKworCWdwaW8tPnJlZ21hcCA9IGF4cDIweC0+cmVnbWFwOworCisJcmV0ID0gZGV2bV9ncGlvY2hpcF9hZGRfZGF0YSgmcGRldi0+ZGV2LCAmZ3Bpby0+Y2hpcCwgZ3Bpbyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgR1BJTyBjaGlwXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQVhQMjA5IEdQSU8gZHJpdmVyIGxvYWRlZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXhwMjB4X2dwaW9fbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIngtcG93ZXJzLGF4cDIwOS1ncGlvIiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGF4cDIweF9ncGlvX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXhwMjB4X2dwaW9fZHJpdmVyID0geworCS5wcm9iZQkJPSBheHAyMHhfZ3Bpb19wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZQkJPSAiYXhwMjB4LWdwaW8iLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBheHAyMHhfZ3Bpb19tYXRjaCwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihheHAyMHhfZ3Bpb19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJNYXhpbWUgUmlwYXJkIDxtYXhpbWUucmlwYXJkQGZyZWUtZWxlY3Ryb25zLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQVhQMjB4IFBNSUMgR1BJTyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWJjbS1rb25hLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1iY20ta29uYS5jCmluZGV4IDk1M2U0YjguLjNkMWNmMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLWJjbS1rb25hLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tYmNtLWtvbmEuYwpAQCAtMzA4LDcgKzMwOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbCA9ICJiY20ta29uYS1ncGlvIiwKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkucmVxdWVzdCA9IGJjbV9rb25hX2dwaW9fcmVxdWVzdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWRhOTA1Mi5jIGIvZHJpdmVycy9ncGlvL2dwaW8tZGE5MDUyLmMKaW5kZXggZTI5NTUzYi4uZGQ4OTc3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tZGE5MDUyLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tZGE5MDUyLmMKQEAgLTE4NCw3ICsxODQsNyBAQAogCXJldHVybiBpcnE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHJlZmVyZW5jZV9ncCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHJlZmVyZW5jZV9ncCA9IHsKIAkubGFiZWwgPSAiZGE5MDUyLWdwaW8iLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5nZXQgPSBkYTkwNTJfZ3Bpb19nZXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1kYTkwNTUuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWRhOTA1NS5jCmluZGV4IDJjMmMxOGQuLjgyMDUzYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLWRhOTA1NS5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWRhOTA1NS5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAkJCQkgIERBOTA1NV9JUlFfR1BJMCArIG9mZnNldCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHJlZmVyZW5jZV9ncCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHJlZmVyZW5jZV9ncCA9IHsKIAkubGFiZWwgPSAiZGE5MDU1LWdwaW8iLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5nZXQgPSBkYTkwNTVfZ3Bpb19nZXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1mNzE4OHguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWY3MTg4eC5jCmluZGV4IDYwMGJlODQuLmU4YWNjZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLWY3MTg4eC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWY3MTg4eC5jCkBAIC0yMTQsOCArMjE0LDcgQEAKIHN0YXRpYyBpbnQgZjcxODh4X2dwaW9fZ2V0X2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCiB7CiAJaW50IGVycjsKLQlzdHJ1Y3QgZjcxODh4X2dwaW9fYmFuayAqYmFuayA9Ci0JCWNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgZjcxODh4X2dwaW9fYmFuaywgY2hpcCk7CisJc3RydWN0IGY3MTg4eF9ncGlvX2JhbmsgKmJhbmsgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAlzdHJ1Y3QgZjcxODh4X3NpbyAqc2lvID0gYmFuay0+ZGF0YS0+c2lvOwogCXU4IGRpcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tZ3Bpby1tbS5jIGIvZHJpdmVycy9ncGlvL2dwaW8tZ3Bpby1tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlN2RlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1ncGlvLW1tLmMKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisgKiBHUElPIGRyaXZlciBmb3IgdGhlIERpYW1vbmQgU3lzdGVtcyBHUElPLU1NCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgV2lsbGlhbSBCcmVhdGhpdHQgR3JheQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgRGlhbW9uZCBTeXN0ZW1zIGRldmljZXM6IEdQSU8tTU0gYW5kCisgKiBHUElPLU1NLTEyLgorICovCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaXNhLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjZGVmaW5lIEdQSU9NTV9FWFRFTlQgOAorI2RlZmluZSBNQVhfTlVNX0dQSU9NTSBtYXhfbnVtX2lzYV9kZXYoR1BJT01NX0VYVEVOVCkKKworc3RhdGljIHVuc2lnbmVkIGludCBiYXNlW01BWF9OVU1fR1BJT01NXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX2dwaW9tbTsKK21vZHVsZV9wYXJhbV9hcnJheShiYXNlLCB1aW50LCAmbnVtX2dwaW9tbSwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJhc2UsICJEaWFtb25kIFN5c3RlbXMgR1BJTy1NTSBiYXNlIGFkZHJlc3NlcyIpOworCisvKioKKyAqIHN0cnVjdCBncGlvbW1fZ3BpbyAtIEdQSU8gZGV2aWNlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBjaGlwOglpbnN0YW5jZSBvZiB0aGUgZ3Bpb19jaGlwCisgKiBAaW9fc3RhdGU6CWJpdCBJL08gc3RhdGUgKHdoZXRoZXIgYml0IGlzIHNldCB0byBpbnB1dCBvciBvdXRwdXQpCisgKiBAb3V0X3N0YXRlOglvdXRwdXQgYml0cyBzdGF0ZQorICogQGNvbnRyb2w6CUNvbnRyb2wgcmVnaXN0ZXJzIHN0YXRlCisgKiBAbG9jazoJc3luY2hyb25pemF0aW9uIGxvY2sgdG8gcHJldmVudCBJL08gcmFjZSBjb25kaXRpb25zCisgKiBAYmFzZToJYmFzZSBwb3J0IGFkZHJlc3Mgb2YgdGhlIEdQSU8gZGV2aWNlCisgKi8KK3N0cnVjdCBncGlvbW1fZ3BpbyB7CisJc3RydWN0IGdwaW9fY2hpcCBjaGlwOworCXVuc2lnbmVkIGNoYXIgaW9fc3RhdGVbNl07CisJdW5zaWduZWQgY2hhciBvdXRfc3RhdGVbNl07CisJdW5zaWduZWQgY2hhciBjb250cm9sWzJdOworCXNwaW5sb2NrX3QgbG9jazsKKwl1bnNpZ25lZCBpbnQgYmFzZTsKK307CisKK3N0YXRpYyBpbnQgZ3Bpb21tX2dwaW9fZ2V0X2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCXVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IGdwaW9tbV9ncGlvICpjb25zdCBncGlvbW1ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJY29uc3QgdW5zaWduZWQgaW50IHBvcnQgPSBvZmZzZXQgLyA4OworCWNvbnN0IHVuc2lnbmVkIGludCBtYXNrID0gQklUKG9mZnNldCAlIDgpOworCisJcmV0dXJuICEhKGdwaW9tbWdwaW8tPmlvX3N0YXRlW3BvcnRdICYgbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb21tX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgZ3Bpb21tX2dwaW8gKmNvbnN0IGdwaW9tbWdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwljb25zdCB1bnNpZ25lZCBpbnQgaW9fcG9ydCA9IG9mZnNldCAvIDg7CisJY29uc3QgdW5zaWduZWQgaW50IGNvbnRyb2xfcG9ydCA9IGlvX3BvcnQgLyAzOworCWNvbnN0IHVuc2lnbmVkIGludCBjb250cm9sX2FkZHIgPSBncGlvbW1ncGlvLT5iYXNlICsgMyArIGNvbnRyb2xfcG9ydCo0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNvbnRyb2w7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb21tZ3Bpby0+bG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgaWYgY29uZmlndXJpbmcgUG9ydCBDICovCisJaWYgKGlvX3BvcnQgPT0gMiB8fCBpb19wb3J0ID09IDUpIHsKKwkJLyogUG9ydCBDIGNhbiBiZSBjb25maWd1cmVkIGJ5IG5pYmJsZSAqLworCQlpZiAob2Zmc2V0ICUgOCA+IDMpIHsKKwkJCWdwaW9tbWdwaW8tPmlvX3N0YXRlW2lvX3BvcnRdIHw9IDB4RjA7CisJCQlncGlvbW1ncGlvLT5jb250cm9sW2NvbnRyb2xfcG9ydF0gfD0gQklUKDMpOworCQl9IGVsc2UgeworCQkJZ3Bpb21tZ3Bpby0+aW9fc3RhdGVbaW9fcG9ydF0gfD0gMHgwRjsKKwkJCWdwaW9tbWdwaW8tPmNvbnRyb2xbY29udHJvbF9wb3J0XSB8PSBCSVQoMCk7CisJCX0KKwl9IGVsc2UgeworCQlncGlvbW1ncGlvLT5pb19zdGF0ZVtpb19wb3J0XSB8PSAweEZGOworCQlpZiAoaW9fcG9ydCA9PSAwIHx8IGlvX3BvcnQgPT0gMykKKwkJCWdwaW9tbWdwaW8tPmNvbnRyb2xbY29udHJvbF9wb3J0XSB8PSBCSVQoNCk7CisJCWVsc2UKKwkJCWdwaW9tbWdwaW8tPmNvbnRyb2xbY29udHJvbF9wb3J0XSB8PSBCSVQoMSk7CisJfQorCisJY29udHJvbCA9IEJJVCg3KSB8IGdwaW9tbWdwaW8tPmNvbnRyb2xbY29udHJvbF9wb3J0XTsKKwlvdXRiKGNvbnRyb2wsIGNvbnRyb2xfYWRkcik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvbW1ncGlvLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncGlvbW1fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJdW5zaWduZWQgaW50IG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBncGlvbW1fZ3BpbyAqY29uc3QgZ3Bpb21tZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCWNvbnN0IHVuc2lnbmVkIGludCBpb19wb3J0ID0gb2Zmc2V0IC8gODsKKwljb25zdCB1bnNpZ25lZCBpbnQgY29udHJvbF9wb3J0ID0gaW9fcG9ydCAvIDM7CisJY29uc3QgdW5zaWduZWQgaW50IG1hc2sgPSBCSVQob2Zmc2V0ICUgOCk7CisJY29uc3QgdW5zaWduZWQgaW50IGNvbnRyb2xfYWRkciA9IGdwaW9tbWdwaW8tPmJhc2UgKyAzICsgY29udHJvbF9wb3J0KjQ7CisJY29uc3QgdW5zaWduZWQgaW50IG91dF9wb3J0ID0gKGlvX3BvcnQgPiAyKSA/IGlvX3BvcnQgKyAxIDogaW9fcG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBjb250cm9sOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9tbWdwaW8tPmxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIGlmIGNvbmZpZ3VyaW5nIFBvcnQgQyAqLworCWlmIChpb19wb3J0ID09IDIgfHwgaW9fcG9ydCA9PSA1KSB7CisJCS8qIFBvcnQgQyBjYW4gYmUgY29uZmlndXJlZCBieSBuaWJibGUgKi8KKwkJaWYgKG9mZnNldCAlIDggPiAzKSB7CisJCQlncGlvbW1ncGlvLT5pb19zdGF0ZVtpb19wb3J0XSAmPSAweDBGOworCQkJZ3Bpb21tZ3Bpby0+Y29udHJvbFtjb250cm9sX3BvcnRdICY9IH5CSVQoMyk7CisJCX0gZWxzZSB7CisJCQlncGlvbW1ncGlvLT5pb19zdGF0ZVtpb19wb3J0XSAmPSAweEYwOworCQkJZ3Bpb21tZ3Bpby0+Y29udHJvbFtjb250cm9sX3BvcnRdICY9IH5CSVQoMCk7CisJCX0KKwl9IGVsc2UgeworCQlncGlvbW1ncGlvLT5pb19zdGF0ZVtpb19wb3J0XSAmPSAweDAwOworCQlpZiAoaW9fcG9ydCA9PSAwIHx8IGlvX3BvcnQgPT0gMykKKwkJCWdwaW9tbWdwaW8tPmNvbnRyb2xbY29udHJvbF9wb3J0XSAmPSB+QklUKDQpOworCQllbHNlCisJCQlncGlvbW1ncGlvLT5jb250cm9sW2NvbnRyb2xfcG9ydF0gJj0gfkJJVCgxKTsKKwl9CisKKwlpZiAodmFsdWUpCisJCWdwaW9tbWdwaW8tPm91dF9zdGF0ZVtpb19wb3J0XSB8PSBtYXNrOworCWVsc2UKKwkJZ3Bpb21tZ3Bpby0+b3V0X3N0YXRlW2lvX3BvcnRdICY9IH5tYXNrOworCisJY29udHJvbCA9IEJJVCg3KSB8IGdwaW9tbWdwaW8tPmNvbnRyb2xbY29udHJvbF9wb3J0XTsKKwlvdXRiKGNvbnRyb2wsIGNvbnRyb2xfYWRkcik7CisKKwlvdXRiKGdwaW9tbWdwaW8tPm91dF9zdGF0ZVtpb19wb3J0XSwgZ3Bpb21tZ3Bpby0+YmFzZSArIG91dF9wb3J0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9tbWdwaW8tPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdwaW9tbV9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBncGlvbW1fZ3BpbyAqY29uc3QgZ3Bpb21tZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCWNvbnN0IHVuc2lnbmVkIGludCBwb3J0ID0gb2Zmc2V0IC8gODsKKwljb25zdCB1bnNpZ25lZCBpbnQgbWFzayA9IEJJVChvZmZzZXQgJSA4KTsKKwljb25zdCB1bnNpZ25lZCBpbnQgaW5fcG9ydCA9IChwb3J0ID4gMikgPyBwb3J0ICsgMSA6IHBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgcG9ydF9zdGF0ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvbW1ncGlvLT5sb2NrLCBmbGFncyk7CisKKwkvKiBlbnN1cmUgdGhhdCBHUElPIGlzIHNldCBmb3IgaW5wdXQgKi8KKwlpZiAoIShncGlvbW1ncGlvLT5pb19zdGF0ZVtwb3J0XSAmIG1hc2spKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9tbWdwaW8tPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcG9ydF9zdGF0ZSA9IGluYihncGlvbW1ncGlvLT5iYXNlICsgaW5fcG9ydCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvbW1ncGlvLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gISEocG9ydF9zdGF0ZSAmIG1hc2spOworfQorCitzdGF0aWMgdm9pZCBncGlvbW1fZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCwKKwlpbnQgdmFsdWUpCit7CisJc3RydWN0IGdwaW9tbV9ncGlvICpjb25zdCBncGlvbW1ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJY29uc3QgdW5zaWduZWQgaW50IHBvcnQgPSBvZmZzZXQgLyA4OworCWNvbnN0IHVuc2lnbmVkIGludCBtYXNrID0gQklUKG9mZnNldCAlIDgpOworCWNvbnN0IHVuc2lnbmVkIGludCBvdXRfcG9ydCA9IChwb3J0ID4gMikgPyBwb3J0ICsgMSA6IHBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvbW1ncGlvLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodmFsdWUpCisJCWdwaW9tbWdwaW8tPm91dF9zdGF0ZVtwb3J0XSB8PSBtYXNrOworCWVsc2UKKwkJZ3Bpb21tZ3Bpby0+b3V0X3N0YXRlW3BvcnRdICY9IH5tYXNrOworCisJb3V0YihncGlvbW1ncGlvLT5vdXRfc3RhdGVbcG9ydF0sIGdwaW9tbWdwaW8tPmJhc2UgKyBvdXRfcG9ydCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvbW1ncGlvLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb21tX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlkKQoreworCXN0cnVjdCBncGlvbW1fZ3BpbyAqZ3Bpb21tZ3BpbzsKKwljb25zdCBjaGFyICpjb25zdCBuYW1lID0gZGV2X25hbWUoZGV2KTsKKwlpbnQgZXJyOworCisJZ3Bpb21tZ3BpbyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZ3Bpb21tZ3BpbyksIEdGUF9LRVJORUwpOworCWlmICghZ3Bpb21tZ3BpbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIWRldm1fcmVxdWVzdF9yZWdpb24oZGV2LCBiYXNlW2lkXSwgR1BJT01NX0VYVEVOVCwgbmFtZSkpIHsKKwkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gbG9jayBwb3J0IGFkZHJlc3NlcyAoMHglWC0weCVYKVxuIiwKKwkJCWJhc2VbaWRdLCBiYXNlW2lkXSArIEdQSU9NTV9FWFRFTlQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWdwaW9tbWdwaW8tPmNoaXAubGFiZWwgPSBuYW1lOworCWdwaW9tbWdwaW8tPmNoaXAucGFyZW50ID0gZGV2OworCWdwaW9tbWdwaW8tPmNoaXAub3duZXIgPSBUSElTX01PRFVMRTsKKwlncGlvbW1ncGlvLT5jaGlwLmJhc2UgPSAtMTsKKwlncGlvbW1ncGlvLT5jaGlwLm5ncGlvID0gNDg7CisJZ3Bpb21tZ3Bpby0+Y2hpcC5nZXRfZGlyZWN0aW9uID0gZ3Bpb21tX2dwaW9fZ2V0X2RpcmVjdGlvbjsKKwlncGlvbW1ncGlvLT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IGdwaW9tbV9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKKwlncGlvbW1ncGlvLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSBncGlvbW1fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OworCWdwaW9tbWdwaW8tPmNoaXAuZ2V0ID0gZ3Bpb21tX2dwaW9fZ2V0OworCWdwaW9tbWdwaW8tPmNoaXAuc2V0ID0gZ3Bpb21tX2dwaW9fc2V0OworCWdwaW9tbWdwaW8tPmJhc2UgPSBiYXNlW2lkXTsKKworCXNwaW5fbG9ja19pbml0KCZncGlvbW1ncGlvLT5sb2NrKTsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGdwaW9tbWdwaW8pOworCisJZXJyID0gZ3Bpb2NoaXBfYWRkX2RhdGEoJmdwaW9tbWdwaW8tPmNoaXAsIGdwaW9tbWdwaW8pOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJHUElPIHJlZ2lzdGVyaW5nIGZhaWxlZCAoJWQpXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIGluaXRpYWxpemUgYWxsIEdQSU8gYXMgb3V0cHV0ICovCisJb3V0YigweDgwLCBiYXNlW2lkXSArIDMpOworCW91dGIoMHgwMCwgYmFzZVtpZF0pOworCW91dGIoMHgwMCwgYmFzZVtpZF0gKyAxKTsKKwlvdXRiKDB4MDAsIGJhc2VbaWRdICsgMik7CisJb3V0YigweDgwLCBiYXNlW2lkXSArIDcpOworCW91dGIoMHgwMCwgYmFzZVtpZF0gKyA0KTsKKwlvdXRiKDB4MDAsIGJhc2VbaWRdICsgNSk7CisJb3V0YigweDAwLCBiYXNlW2lkXSArIDYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb21tX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpZCkKK3sKKwlzdHJ1Y3QgZ3Bpb21tX2dwaW8gKmNvbnN0IGdwaW9tbWdwaW8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWdwaW9jaGlwX3JlbW92ZSgmZ3Bpb21tZ3Bpby0+Y2hpcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpc2FfZHJpdmVyIGdwaW9tbV9kcml2ZXIgPSB7CisJLnByb2JlID0gZ3Bpb21tX3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImdwaW8tbW0iCisJfSwKKwkucmVtb3ZlID0gZ3Bpb21tX3JlbW92ZQorfTsKKworbW9kdWxlX2lzYV9kcml2ZXIoZ3Bpb21tX2RyaXZlciwgbnVtX2dwaW9tbSk7CisKK01PRFVMRV9BVVRIT1IoIldpbGxpYW0gQnJlYXRoaXR0IEdyYXkgPHZpbGhlbG0uZ3JheUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRpYW1vbmQgU3lzdGVtcyBHUElPLU1NIEdQSU8gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1odGMtZWdwaW8uYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWh0Yy1lZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNGRmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1odGMtZWdwaW8uYwpAQCAtMCwwICsxLDQ0MCBAQAorLyoKKyAqIFN1cHBvcnQgZm9yIHRoZSBHUElPL0lSUSBleHBhbmRlciBjaGlwcyBwcmVzZW50IG9uIHNldmVyYWwgSFRDIHBob25lcy4KKyAqIFRoZXNlIGFyZSBpbXBsZW1lbnRlZCBpbiBDUExEIGNoaXBzIHByZXNlbnQgb24gdGhlIGJvYXJkLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBLZXZpbiBPJ0Nvbm5vciA8a2V2aW5Aa29jb25ub3IubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDA3IFBoaWxpcHAgWmFiZWwgPHBoaWxpcHAuemFiZWxAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIGxpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvZ3Bpby1odGMtZWdwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKK3N0cnVjdCBlZ3Bpb19jaGlwIHsKKwlpbnQgICAgICAgICAgICAgIHJlZ19zdGFydDsKKwlpbnQgICAgICAgICAgICAgIGNhY2hlZF92YWx1ZXM7CisJdW5zaWduZWQgbG9uZyAgICBpc19vdXQ7CisJc3RydWN0IGRldmljZSAgICAqZGV2OworCXN0cnVjdCBncGlvX2NoaXAgY2hpcDsKK307CisKK3N0cnVjdCBlZ3Bpb19pbmZvIHsKKwlzcGlubG9ja190ICAgICAgICBsb2NrOworCisJLyogaW9tZW0gaW5mbyAqLworCXZvaWQgX19pb21lbSAgICAgICpiYXNlX2FkZHI7CisJaW50ICAgICAgICAgICAgICAgYnVzX3NoaWZ0OwkvKiBieXRlIHNoaWZ0ICovCisJaW50ICAgICAgICAgICAgICAgcmVnX3NoaWZ0OwkvKiBiaXQgc2hpZnQgKi8KKwlpbnQgICAgICAgICAgICAgICByZWdfbWFzazsKKworCS8qIGlycSBpbmZvICovCisJaW50ICAgICAgICAgICAgICAgYWNrX3JlZ2lzdGVyOworCWludCAgICAgICAgICAgICAgIGFja193cml0ZTsKKwl1MTYgICAgICAgICAgICAgICBpcnFzX2VuYWJsZWQ7CisJdWludCAgICAgICAgICAgICAgaXJxX3N0YXJ0OworCWludCAgICAgICAgICAgICAgIG5pcnFzOworCXVpbnQgICAgICAgICAgICAgIGNoYWluZWRfaXJxOworCisJLyogZWdwaW8gaW5mbyAqLworCXN0cnVjdCBlZ3Bpb19jaGlwICpjaGlwOworCWludCAgICAgICAgICAgICAgIG5jaGlwczsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlZ3Bpb193cml0ZXcodTE2IHZhbHVlLCBzdHJ1Y3QgZWdwaW9faW5mbyAqZWksIGludCByZWcpCit7CisJd3JpdGV3KHZhbHVlLCBlaS0+YmFzZV9hZGRyICsgKHJlZyA8PCBlaS0+YnVzX3NoaWZ0KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGVncGlvX3JlYWR3KHN0cnVjdCBlZ3Bpb19pbmZvICplaSwgaW50IHJlZykKK3sKKwlyZXR1cm4gcmVhZHcoZWktPmJhc2VfYWRkciArIChyZWcgPDwgZWktPmJ1c19zaGlmdCkpOworfQorCisvKgorICogSVJRcworICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY2tfaXJxcyhzdHJ1Y3QgZWdwaW9faW5mbyAqZWkpCit7CisJZWdwaW9fd3JpdGV3KGVpLT5hY2tfd3JpdGUsIGVpLCBlaS0+YWNrX3JlZ2lzdGVyKTsKKwlwcl9kZWJ1ZygiRUdQSU8gYWNrIC0gd3JpdGUgJXggdG8gYmFzZSsleFxuIiwKKwkJCWVpLT5hY2tfd3JpdGUsIGVpLT5hY2tfcmVnaXN0ZXIgPDwgZWktPmJ1c19zaGlmdCk7Cit9CisKK3N0YXRpYyB2b2lkIGVncGlvX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7Cit9CisKKy8qIFRoZXJlIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHdheSB0byBwcm9hY3RpdmVseSBtYXNrIGludGVycnVwdHMKKyAqIG9uIHRoZSBlZ3BpbyBjaGlwIGl0c2VsZi4gIFNvLCB3ZSBzaW1wbHkgaWdub3JlIGludGVycnVwdHMgdGhhdAorICogYXJlbid0IGRlc2lyZWQuICovCitzdGF0aWMgdm9pZCBlZ3Bpb19tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgZWdwaW9faW5mbyAqZWkgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwllaS0+aXJxc19lbmFibGVkICY9IH4oMSA8PCAoZGF0YS0+aXJxIC0gZWktPmlycV9zdGFydCkpOworCXByX2RlYnVnKCJFR1BJTyBtYXNrICVkICUwNHhcbiIsIGRhdGEtPmlycSwgZWktPmlycXNfZW5hYmxlZCk7Cit9CisKK3N0YXRpYyB2b2lkIGVncGlvX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGVncGlvX2luZm8gKmVpID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJZWktPmlycXNfZW5hYmxlZCB8PSAxIDw8IChkYXRhLT5pcnEgLSBlaS0+aXJxX3N0YXJ0KTsKKwlwcl9kZWJ1ZygiRUdQSU8gdW5tYXNrICVkICUwNHhcbiIsIGRhdGEtPmlycSwgZWktPmlycXNfZW5hYmxlZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZWdwaW9fbXV4ZWRfY2hpcCA9IHsKKwkubmFtZQkJPSAiaHRjLWVncGlvIiwKKwkuaXJxX2Fjawk9IGVncGlvX2FjaywKKwkuaXJxX21hc2sJPSBlZ3Bpb19tYXNrLAorCS5pcnFfdW5tYXNrCT0gZWdwaW9fdW5tYXNrLAorfTsKKworc3RhdGljIHZvaWQgZWdwaW9faGFuZGxlcihzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGVncGlvX2luZm8gKmVpID0gaXJxX2Rlc2NfZ2V0X2hhbmRsZXJfZGF0YShkZXNjKTsKKwlpbnQgaXJxcGluOworCisJLyogUmVhZCBjdXJyZW50IHBpbnMuICovCisJdW5zaWduZWQgbG9uZyByZWFkdmFsID0gZWdwaW9fcmVhZHcoZWksIGVpLT5hY2tfcmVnaXN0ZXIpOworCXByX2RlYnVnKCJJUlEgcmVnOiAleFxuIiwgKHVuc2lnbmVkIGludClyZWFkdmFsKTsKKwkvKiBBY2svdW5tYXNrIGludGVycnVwdHMuICovCisJYWNrX2lycXMoZWkpOworCS8qIFByb2Nlc3MgYWxsIHNldCBwaW5zLiAqLworCXJlYWR2YWwgJj0gZWktPmlycXNfZW5hYmxlZDsKKwlmb3JfZWFjaF9zZXRfYml0KGlycXBpbiwgJnJlYWR2YWwsIGVpLT5uaXJxcykgeworCQkvKiBSdW4gaXJxIGhhbmRsZXIgKi8KKwkJcHJfZGVidWcoImdvdCBJUlEgJWRcbiIsIGlycXBpbik7CisJCWdlbmVyaWNfaGFuZGxlX2lycShlaS0+aXJxX3N0YXJ0ICsgaXJxcGluKTsKKwl9Cit9CisKK2ludCBodGNfZWdwaW9fZ2V0X3dha2V1cF9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBlZ3Bpb19pbmZvICplaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJLyogUmVhZCBjdXJyZW50IHBpbnMuICovCisJdTE2IHJlYWR2YWwgPSBlZ3Bpb19yZWFkdyhlaSwgZWktPmFja19yZWdpc3Rlcik7CisJLyogQWNrL3VubWFzayBpbnRlcnJ1cHRzLiAqLworCWFja19pcnFzKGVpKTsKKwkvKiBSZXR1cm4gZmlyc3Qgc2V0IHBpbi4gKi8KKwlyZWFkdmFsICY9IGVpLT5pcnFzX2VuYWJsZWQ7CisJcmV0dXJuIGVpLT5pcnFfc3RhcnQgKyBmZnMocmVhZHZhbCkgLSAxOworfQorRVhQT1JUX1NZTUJPTChodGNfZWdwaW9fZ2V0X3dha2V1cF9pcnEpOworCitzdGF0aWMgaW5saW5lIGludCBlZ3Bpb19wb3Moc3RydWN0IGVncGlvX2luZm8gKmVpLCBpbnQgYml0KQoreworCXJldHVybiBiaXQgPj4gZWktPnJlZ19zaGlmdDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZWdwaW9fYml0KHN0cnVjdCBlZ3Bpb19pbmZvICplaSwgaW50IGJpdCkKK3sKKwlyZXR1cm4gMSA8PCAoYml0ICYgKCgxIDw8IGVpLT5yZWdfc2hpZnQpLTEpKTsKK30KKworLyoKKyAqIElucHV0IHBpbnMKKyAqLworCitzdGF0aWMgaW50IGVncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGVncGlvX2NoaXAgKmVncGlvOworCXN0cnVjdCBlZ3Bpb19pbmZvICplaTsKKwl1bnNpZ25lZCAgICAgICAgICAgYml0OworCWludCAgICAgICAgICAgICAgICByZWc7CisJaW50ICAgICAgICAgICAgICAgIHZhbHVlOworCisJcHJfZGVidWcoImVncGlvX2dldF92YWx1ZSglZClcbiIsIGNoaXAtPmJhc2UgKyBvZmZzZXQpOworCisJZWdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwllaSAgICA9IGRldl9nZXRfZHJ2ZGF0YShlZ3Bpby0+ZGV2KTsKKwliaXQgICA9IGVncGlvX2JpdChlaSwgb2Zmc2V0KTsKKwlyZWcgICA9IGVncGlvLT5yZWdfc3RhcnQgKyBlZ3Bpb19wb3MoZWksIG9mZnNldCk7CisKKwl2YWx1ZSA9IGVncGlvX3JlYWR3KGVpLCByZWcpOworCXByX2RlYnVnKCJyZWFkdyglcCArICV4KSA9ICV4XG4iLAorCQkJZWktPmJhc2VfYWRkciwgcmVnIDw8IGVpLT5idXNfc2hpZnQsIHZhbHVlKTsKKwlyZXR1cm4gISEodmFsdWUgJiBiaXQpOworfQorCitzdGF0aWMgaW50IGVncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGVncGlvX2NoaXAgKmVncGlvOworCisJZWdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwlyZXR1cm4gdGVzdF9iaXQob2Zmc2V0LCAmZWdwaW8tPmlzX291dCkgPyAtRUlOVkFMIDogMDsKK30KKworCisvKgorICogT3V0cHV0IHBpbnMKKyAqLworCitzdGF0aWMgdm9pZCBlZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyAgICAgZmxhZzsKKwlzdHJ1Y3QgZWdwaW9fY2hpcCAqZWdwaW87CisJc3RydWN0IGVncGlvX2luZm8gKmVpOworCXVuc2lnbmVkICAgICAgICAgIGJpdDsKKwlpbnQgICAgICAgICAgICAgICBwb3M7CisJaW50ICAgICAgICAgICAgICAgcmVnOworCWludCAgICAgICAgICAgICAgIHNoaWZ0OworCisJcHJfZGVidWcoImVncGlvX3NldCglcywgJWQoJWQpLCAlZClcbiIsCisJCQljaGlwLT5sYWJlbCwgb2Zmc2V0LCBvZmZzZXQrY2hpcC0+YmFzZSwgdmFsdWUpOworCisJZWdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwllaSAgICA9IGRldl9nZXRfZHJ2ZGF0YShlZ3Bpby0+ZGV2KTsKKwliaXQgICA9IGVncGlvX2JpdChlaSwgb2Zmc2V0KTsKKwlwb3MgICA9IGVncGlvX3BvcyhlaSwgb2Zmc2V0KTsKKwlyZWcgICA9IGVncGlvLT5yZWdfc3RhcnQgKyBwb3M7CisJc2hpZnQgPSBwb3MgPDwgZWktPnJlZ19zaGlmdDsKKworCXByX2RlYnVnKCJlZ3BpbyAlczogcmVnICVkID0gMHglMDR4XG4iLCB2YWx1ZSA/ICJzZXQiIDogImNsZWFyIiwKKwkJCXJlZywgKGVncGlvLT5jYWNoZWRfdmFsdWVzID4+IHNoaWZ0KSAmIGVpLT5yZWdfbWFzayk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWktPmxvY2ssIGZsYWcpOworCWlmICh2YWx1ZSkKKwkJZWdwaW8tPmNhY2hlZF92YWx1ZXMgfD0gKDEgPDwgb2Zmc2V0KTsKKwllbHNlCisJCWVncGlvLT5jYWNoZWRfdmFsdWVzICY9IH4oMSA8PCBvZmZzZXQpOworCWVncGlvX3dyaXRldygoZWdwaW8tPmNhY2hlZF92YWx1ZXMgPj4gc2hpZnQpICYgZWktPnJlZ19tYXNrLCBlaSwgcmVnKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaS0+bG9jaywgZmxhZyk7Cit9CisKK3N0YXRpYyBpbnQgZWdwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZWdwaW9fY2hpcCAqZWdwaW87CisKKwllZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCWlmICh0ZXN0X2JpdChvZmZzZXQsICZlZ3Bpby0+aXNfb3V0KSkgeworCQllZ3Bpb19zZXQoY2hpcCwgb2Zmc2V0LCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIHZvaWQgZWdwaW9fd3JpdGVfY2FjaGUoc3RydWN0IGVncGlvX2luZm8gKmVpKQoreworCWludCAgICAgICAgICAgICAgIGk7CisJc3RydWN0IGVncGlvX2NoaXAgKmVncGlvOworCWludCAgICAgICAgICAgICAgIHNoaWZ0OworCisJZm9yIChpID0gMDsgaSA8IGVpLT5uY2hpcHM7IGkrKykgeworCQllZ3BpbyA9ICYoZWktPmNoaXBbaV0pOworCQlpZiAoIWVncGlvLT5pc19vdXQpCisJCQljb250aW51ZTsKKworCQlmb3IgKHNoaWZ0ID0gMDsgc2hpZnQgPCBlZ3Bpby0+Y2hpcC5uZ3BpbzsKKwkJCQlzaGlmdCArPSAoMTw8ZWktPnJlZ19zaGlmdCkpIHsKKworCQkJaW50IHJlZyA9IGVncGlvLT5yZWdfc3RhcnQgKyBlZ3Bpb19wb3MoZWksIHNoaWZ0KTsKKworCQkJaWYgKCEoKGVncGlvLT5pc19vdXQgPj4gc2hpZnQpICYgZWktPnJlZ19tYXNrKSkKKwkJCQljb250aW51ZTsKKworCQkJcHJfZGVidWcoIkVHUElPOiBzZXR0aW5nICV4IHRvICV4LCB3YXMgJXhcbiIsIHJlZywKKwkJCQkoZWdwaW8tPmNhY2hlZF92YWx1ZXMgPj4gc2hpZnQpICYgZWktPnJlZ19tYXNrLAorCQkJCWVncGlvX3JlYWR3KGVpLCByZWcpKTsKKworCQkJZWdwaW9fd3JpdGV3KChlZ3Bpby0+Y2FjaGVkX3ZhbHVlcyA+PiBzaGlmdCkKKwkJCQkJJiBlaS0+cmVnX21hc2ssIGVpLCByZWcpOworCQl9CisJfQorfQorCisKKy8qCisgKiBTZXR1cAorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGVncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGh0Y19lZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IHJlc291cmNlICAgKnJlczsKKwlzdHJ1Y3QgZWdwaW9faW5mbyAqZWk7CisJc3RydWN0IGdwaW9fY2hpcCAgKmNoaXA7CisJdW5zaWduZWQgaW50ICAgICAgaXJxLCBpcnFfZW5kOworCWludCAgICAgICAgICAgICAgIGk7CisJaW50ICAgICAgICAgICAgICAgcmV0OworCisJLyogSW5pdGlhbGl6ZSBlaSBkYXRhIHN0cnVjdHVyZS4gKi8KKwllaSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmVpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmZWktPmxvY2spOworCisJLyogRmluZCBjaGFpbmVkIGlycSAqLworCXJldCA9IC1FSU5WQUw7CisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKKwlpZiAocmVzKQorCQllaS0+Y2hhaW5lZF9pcnEgPSByZXMtPnN0YXJ0OworCisJLyogTWFwIGVncGlvIGNoaXAgaW50byB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJZ290byBmYWlsOworCWVpLT5iYXNlX2FkZHIgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZSgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LAorCQkJCQkgICAgIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFlaS0+YmFzZV9hZGRyKQorCQlnb3RvIGZhaWw7CisJcHJfZGVidWcoIkVHUElPIHBoeXM9JTA4eCB2aXJ0PSVwXG4iLCAodTMyKXJlcy0+c3RhcnQsIGVpLT5iYXNlX2FkZHIpOworCisJaWYgKChwZGF0YS0+YnVzX3dpZHRoICE9IDE2KSAmJiAocGRhdGEtPmJ1c193aWR0aCAhPSAzMikpCisJCWdvdG8gZmFpbDsKKwllaS0+YnVzX3NoaWZ0ID0gZmxzKHBkYXRhLT5idXNfd2lkdGggLSAxKSAtIDM7CisJcHJfZGVidWcoImJ1c19zaGlmdCA9ICVkXG4iLCBlaS0+YnVzX3NoaWZ0KTsKKworCWlmICgocGRhdGEtPnJlZ193aWR0aCAhPSA4KSAmJiAocGRhdGEtPnJlZ193aWR0aCAhPSAxNikpCisJCWdvdG8gZmFpbDsKKwllaS0+cmVnX3NoaWZ0ID0gZmxzKHBkYXRhLT5yZWdfd2lkdGggLSAxKTsKKwlwcl9kZWJ1ZygicmVnX3NoaWZ0ID0gJWRcbiIsIGVpLT5yZWdfc2hpZnQpOworCisJZWktPnJlZ19tYXNrID0gKDEgPDwgcGRhdGEtPnJlZ193aWR0aCkgLSAxOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZWkpOworCisJZWktPm5jaGlwcyA9IHBkYXRhLT5udW1fY2hpcHM7CisJZWktPmNoaXAgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKKwkJCQlzaXplb2Yoc3RydWN0IGVncGlvX2NoaXApICogZWktPm5jaGlwcywKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWVpLT5jaGlwKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisJZm9yIChpID0gMDsgaSA8IGVpLT5uY2hpcHM7IGkrKykgeworCQllaS0+Y2hpcFtpXS5yZWdfc3RhcnQgPSBwZGF0YS0+Y2hpcFtpXS5yZWdfc3RhcnQ7CisJCWVpLT5jaGlwW2ldLmNhY2hlZF92YWx1ZXMgPSBwZGF0YS0+Y2hpcFtpXS5pbml0aWFsX3ZhbHVlczsKKwkJZWktPmNoaXBbaV0uaXNfb3V0ID0gcGRhdGEtPmNoaXBbaV0uZGlyZWN0aW9uOworCQllaS0+Y2hpcFtpXS5kZXYgPSAmKHBkZXYtPmRldik7CisJCWNoaXAgPSAmKGVpLT5jaGlwW2ldLmNoaXApOworCQljaGlwLT5sYWJlbCAgICAgICAgICAgPSAiaHRjLWVncGlvIjsKKwkJY2hpcC0+cGFyZW50ICAgICAgICAgID0gJnBkZXYtPmRldjsKKwkJY2hpcC0+b3duZXIgICAgICAgICAgID0gVEhJU19NT0RVTEU7CisJCWNoaXAtPmdldCAgICAgICAgICAgICA9IGVncGlvX2dldDsKKwkJY2hpcC0+c2V0ICAgICAgICAgICAgID0gZWdwaW9fc2V0OworCQljaGlwLT5kaXJlY3Rpb25faW5wdXQgPSBlZ3Bpb19kaXJlY3Rpb25faW5wdXQ7CisJCWNoaXAtPmRpcmVjdGlvbl9vdXRwdXQgPSBlZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OworCQljaGlwLT5iYXNlICAgICAgICAgICAgPSBwZGF0YS0+Y2hpcFtpXS5ncGlvX2Jhc2U7CisJCWNoaXAtPm5ncGlvICAgICAgICAgICA9IHBkYXRhLT5jaGlwW2ldLm51bV9ncGlvczsKKworCQlncGlvY2hpcF9hZGRfZGF0YShjaGlwLCAmZWktPmNoaXBbaV0pOworCX0KKworCS8qIFNldCBpbml0aWFsIHBpbiB2YWx1ZXMgKi8KKwllZ3Bpb193cml0ZV9jYWNoZShlaSk7CisKKwllaS0+aXJxX3N0YXJ0ID0gcGRhdGEtPmlycV9iYXNlOworCWVpLT5uaXJxcyA9IHBkYXRhLT5udW1faXJxczsKKwllaS0+YWNrX3JlZ2lzdGVyID0gcGRhdGEtPmFja19yZWdpc3RlcjsKKworCWlmIChlaS0+Y2hhaW5lZF9pcnEpIHsKKwkJLyogU2V0dXAgaXJxIGhhbmRsZXJzICovCisJCWVpLT5hY2tfd3JpdGUgPSAweEZGRkY7CisJCWlmIChwZGF0YS0+aW52ZXJ0X2Fja3MpCisJCQllaS0+YWNrX3dyaXRlID0gMDsKKwkJaXJxX2VuZCA9IGVpLT5pcnFfc3RhcnQgKyBlaS0+bmlycXM7CisJCWZvciAoaXJxID0gZWktPmlycV9zdGFydDsgaXJxIDwgaXJxX2VuZDsgaXJxKyspIHsKKwkJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZlZ3Bpb19tdXhlZF9jaGlwLAorCQkJCQkJIGhhbmRsZV9zaW1wbGVfaXJxKTsKKwkJCWlycV9zZXRfY2hpcF9kYXRhKGlycSwgZWkpOworCQkJaXJxX2NsZWFyX3N0YXR1c19mbGFncyhpcnEsIElSUV9OT1JFUVVFU1QgfCBJUlFfTk9QUk9CRSk7CisJCX0KKwkJaXJxX3NldF9pcnFfdHlwZShlaS0+Y2hhaW5lZF9pcnEsIElSUV9UWVBFX0VER0VfUklTSU5HKTsKKwkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXJfYW5kX2RhdGEoZWktPmNoYWluZWRfaXJxLAorCQkJCQkJIGVncGlvX2hhbmRsZXIsIGVpKTsKKwkJYWNrX2lycXMoZWkpOworCisJCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlwcmludGsoS0VSTl9FUlIgIkVHUElPIGZhaWxlZCB0byBzZXR1cFxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2V4aXQgZWdwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGVncGlvX2luZm8gKmVpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgaW50ICAgICAgaXJxLCBpcnFfZW5kOworCisJaWYgKGVpLT5jaGFpbmVkX2lycSkgeworCQlpcnFfZW5kID0gZWktPmlycV9zdGFydCArIGVpLT5uaXJxczsKKwkJZm9yIChpcnEgPSBlaS0+aXJxX3N0YXJ0OyBpcnEgPCBpcnFfZW5kOyBpcnErKykgeworCQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgTlVMTCwgTlVMTCk7CisJCQlpcnFfc2V0X3N0YXR1c19mbGFncyhpcnEsIElSUV9OT1JFUVVFU1QgfCBJUlFfTk9QUk9CRSk7CisJCX0KKwkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoZWktPmNoYWluZWRfaXJxLCBOVUxMKTsKKwkJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDApOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGVncGlvX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBlZ3Bpb19pbmZvICplaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGVpLT5jaGFpbmVkX2lycSAmJiBkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkKKwkJZW5hYmxlX2lycV93YWtlKGVpLT5jaGFpbmVkX2lycSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWdwaW9fcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGVncGlvX2luZm8gKmVpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoZWktPmNoYWluZWRfaXJxICYmIGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQorCQlkaXNhYmxlX2lycV93YWtlKGVpLT5jaGFpbmVkX2lycSk7CisKKwkvKiBVcGRhdGUgcmVnaXN0ZXJzIGZyb20gdGhlIGNhY2hlLCBpbiBjYXNlCisJICAgdGhlIENQTEQgd2FzIHBvd2VyZWQgb2ZmIGR1cmluZyBzdXNwZW5kICovCisJZWdwaW9fd3JpdGVfY2FjaGUoZWkpOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgZWdwaW9fc3VzcGVuZCBOVUxMCisjZGVmaW5lIGVncGlvX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBlZ3Bpb19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiaHRjLWVncGlvIiwKKwl9LAorCS5yZW1vdmUgICAgICAgPSBfX2V4aXRfcChlZ3Bpb19yZW1vdmUpLAorCS5zdXNwZW5kICAgICAgPSBlZ3Bpb19zdXNwZW5kLAorCS5yZXN1bWUgICAgICAgPSBlZ3Bpb19yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlZ3Bpb19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZWdwaW9fZHJpdmVyLCBlZ3Bpb19wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlZ3Bpb19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmVncGlvX2RyaXZlcik7Cit9CisKKy8qIHN0YXJ0IGVhcmx5IGZvciBkZXBlbmRlbmNpZXMgKi8KK3N1YnN5c19pbml0Y2FsbChlZ3Bpb19pbml0KTsKK21vZHVsZV9leGl0KGVncGlvX2V4aXQpCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIktldmluIE8nQ29ubm9yIDxrZXZpbkBrb2Nvbm5vci5uZXQ+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1pb3AuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWlvcC5jCmluZGV4IDg2MGM1MzUuLjk4YzdmZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLWlvcC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWlvcC5jCkBAIC0xMCwxMTEgKzEwLDQwIEBACiAgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8vZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2RlZmluZSBJT1AzWFhfTl9HUElPUwk4Ci0KLSNkZWZpbmUgR1BJT19JTgkJCTAKLSNkZWZpbmUgR1BJT19PVVQJCTEKLSNkZWZpbmUgR1BJT19MT1cJCTAKLSNkZWZpbmUgR1BJT19ISUdICQkxCi0KLS8qIE1lbW9yeSBiYXNlIG9mZnNldCAqLwotc3RhdGljIHZvaWQgX19pb21lbSAqYmFzZTsKLQotI2RlZmluZSBJT1AzWFhfR1BJT19SRUcocmVnKQkoYmFzZSArIChyZWcpKQotI2RlZmluZSBJT1AzWFhfR1BPRQkJSU9QM1hYX0dQSU9fUkVHKDB4MDAwMCkKLSNkZWZpbmUgSU9QM1hYX0dQSUQJCUlPUDNYWF9HUElPX1JFRygweDAwMDQpCi0jZGVmaW5lIElPUDNYWF9HUE9ECQlJT1AzWFhfR1BJT19SRUcoMHgwMDA4KQotCi1zdGF0aWMgdm9pZCBncGlvX2xpbmVfY29uZmlnKGludCBsaW5lLCBpbnQgZGlyZWN0aW9uKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHZhbDsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl2YWwgPSByZWFkbChJT1AzWFhfR1BPRSk7Ci0JaWYgKGRpcmVjdGlvbiA9PSBHUElPX0lOKSB7Ci0JCXZhbCB8PSBCSVQobGluZSk7Ci0JfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gR1BJT19PVVQpIHsKLQkJdmFsICY9IH5CSVQobGluZSk7Ci0JfQotCXdyaXRlbCh2YWwsIElPUDNYWF9HUE9FKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgZ3Bpb19saW5lX2dldChpbnQgbGluZSkKLXsKLQlyZXR1cm4gISEocmVhZGwoSU9QM1hYX0dQSUQpICYgQklUKGxpbmUpKTsKLX0KLQotc3RhdGljIHZvaWQgZ3Bpb19saW5lX3NldChpbnQgbGluZSwgaW50IHZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHZhbDsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl2YWwgPSByZWFkbChJT1AzWFhfR1BPRCk7Ci0JaWYgKHZhbHVlID09IEdQSU9fTE9XKSB7Ci0JCXZhbCAmPSB+QklUKGxpbmUpOwotCX0gZWxzZSBpZiAodmFsdWUgPT0gR1BJT19ISUdIKSB7Ci0JCXZhbCB8PSBCSVQobGluZSk7Ci0JfQotCXdyaXRlbCh2YWwsIElPUDNYWF9HUE9EKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgaW9wM3h4X2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8pCi17Ci0JZ3Bpb19saW5lX2NvbmZpZyhncGlvLCBHUElPX0lOKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpb3AzeHhfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8sIGludCBsZXZlbCkKLXsKLQlncGlvX2xpbmVfc2V0KGdwaW8sIGxldmVsKTsKLQlncGlvX2xpbmVfY29uZmlnKGdwaW8sIEdQSU9fT1VUKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpb3AzeHhfZ3Bpb19nZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gZ3Bpb19saW5lX2dldChncGlvKTsKLX0KLQotc3RhdGljIHZvaWQgaW9wM3h4X2dwaW9fc2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKLXsKLQlncGlvX2xpbmVfc2V0KGdwaW8sIHZhbHVlKTsKLX0KLQotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgaW9wM3h4X2NoaXAgPSB7Ci0JLmxhYmVsCQkJPSAiaW9wM3h4IiwKLQkuZGlyZWN0aW9uX2lucHV0CT0gaW9wM3h4X2dwaW9fZGlyZWN0aW9uX2lucHV0LAotCS5nZXQJCQk9IGlvcDN4eF9ncGlvX2dldF92YWx1ZSwKLQkuZGlyZWN0aW9uX291dHB1dAk9IGlvcDN4eF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCi0JLnNldAkJCT0gaW9wM3h4X2dwaW9fc2V0X3ZhbHVlLAotCS5iYXNlCQkJPSAwLAotCS5uZ3BpbwkJCT0gSU9QM1hYX05fR1BJT1MsCi19OworI2RlZmluZSBJT1AzWFhfR1BPRQkweDAwMDAKKyNkZWZpbmUgSU9QM1hYX0dQSUQJMHgwMDA0CisjZGVmaW5lIElPUDNYWF9HUE9ECTB4MDAwOAogCiBzdGF0aWMgaW50IGlvcDN4eF9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IGdwaW9fY2hpcCAqZ2M7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCWludCBlcnI7CisKKwlnYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmdjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnYykKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKIAlpZiAoSVNfRVJSKGJhc2UpKQogCQlyZXR1cm4gUFRSX0VSUihiYXNlKTsKIAotCXJldHVybiBkZXZtX2dwaW9jaGlwX2FkZF9kYXRhKCZwZGV2LT5kZXYsICZpb3AzeHhfY2hpcCwgTlVMTCk7CisJZXJyID0gYmdwaW9faW5pdChnYywgJnBkZXYtPmRldiwgMSwgYmFzZSArIElPUDNYWF9HUElELAorCQkJIGJhc2UgKyBJT1AzWFhfR1BPRCwgTlVMTCwgTlVMTCwgYmFzZSArIElPUDNYWF9HUE9FLCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZ2MtPmJhc2UgPSAwOworCWdjLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJcmV0dXJuIGRldm1fZ3Bpb2NoaXBfYWRkX2RhdGEoJnBkZXYtPmRldiwgZ2MsIE5VTEwpOwogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpb3AzeHhfZ3Bpb19kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1pdDg3LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1pdDg3LmMKaW5kZXggNjNhOTYyZC4uNDVkMjllNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8taXQ4Ny5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWl0ODcuYwpAQCAtMjczLDcgKzI3Myw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCBpdDg3X3RlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCBpdDg3X3RlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSBLQlVJTERfTU9ETkFNRSwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5yZXF1ZXN0CQk9IGl0ODdfZ3Bpb19yZXF1ZXN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbG9vbmdzb24xLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1sb29uZ3NvbjEuYwppbmRleCAxMGMwOWJkLi43MmI2NDAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1sb29uZ3NvbjEuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1sb29uZ3NvbjEuYwpAQCAtOCw2ICs4LDcgQEAKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIApAQCAtNTUsMTEgKzU2LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghcmVzKSB7Ci0JCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBJL08gbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJZ3Bpb19yZWdfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CiAJaWYgKElTX0VSUihncGlvX3JlZ19iYXNlKSkKIAkJcmV0dXJuIFBUUl9FUlIoZ3Bpb19yZWdfYmFzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1scDg3M3guYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWxwODczeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOGM3MDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1scDg3M3guYwpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCUtlZXJ0aHkgPGota2VlcnRoeUB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgImFzIGlzIiBXSVRIT1VUIEFOWSBXQVJSQU5UWSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzc2VkIG9yIGltcGxpZWQ7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQmFzZWQgb24gdGhlIFRQUzY1MjE4IGRyaXZlcgorICovCisKKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvbHA4NzN4Lmg+CisKKyNkZWZpbmUgQklUU19QRVJfR1BPCQkweDQKKyNkZWZpbmUgTFA4NzNYX0dQT19DVFJMX09ECTB4MgorCitzdHJ1Y3QgbHA4NzN4X2dwaW8geworCXN0cnVjdCBncGlvX2NoaXAgY2hpcDsKKwlzdHJ1Y3QgbHA4NzN4ICpscDg3MzsKK307CisKK3N0YXRpYyBpbnQgbHA4NzN4X2dwaW9fZ2V0X2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwkvKiBUaGlzIGRldmljZSBpcyBvdXRwdXQgb25seSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxwODczeF9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCS8qIFRoaXMgZGV2aWNlIGlzIG91dHB1dCBvbmx5ICovCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgbHA4NzN4X2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGxwODczeF9ncGlvICpncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisKKwkvKiBTZXQgdGhlIGluaXRpYWwgdmFsdWUgKi8KKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGdwaW8tPmxwODczLT5yZWdtYXAsIExQODczWF9SRUdfR1BPX0NUUkwsCisJCQkJICBCSVQob2Zmc2V0ICogQklUU19QRVJfR1BPKSwKKwkJCQkgIHZhbHVlID8gQklUKG9mZnNldCAqIEJJVFNfUEVSX0dQTykgOiAwKTsKK30KKworc3RhdGljIGludCBscDg3M3hfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgbHA4NzN4X2dwaW8gKmdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwlpbnQgcmV0LCB2YWw7CisKKwlyZXQgPSByZWdtYXBfcmVhZChncGlvLT5scDg3My0+cmVnbWFwLCBMUDg3M1hfUkVHX0dQT19DVFJMLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiB2YWwgJiBCSVQob2Zmc2V0ICogQklUU19QRVJfR1BPKTsKK30KKworc3RhdGljIHZvaWQgbHA4NzN4X2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCQkgICAgaW50IHZhbHVlKQoreworCXN0cnVjdCBscDg3M3hfZ3BpbyAqZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCisJcmVnbWFwX3VwZGF0ZV9iaXRzKGdwaW8tPmxwODczLT5yZWdtYXAsIExQODczWF9SRUdfR1BPX0NUUkwsCisJCQkgICBCSVQob2Zmc2V0ICogQklUU19QRVJfR1BPKSwKKwkJCSAgIHZhbHVlID8gQklUKG9mZnNldCAqIEJJVFNfUEVSX0dQTykgOiAwKTsKK30KKworc3RhdGljIGludCBscDg3M3hfZ3Bpb19yZXF1ZXN0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBscDg3M3hfZ3BpbyAqZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChvZmZzZXQpIHsKKwljYXNlIDA6CisJCS8qIE5vIE1VWCBTZXQgdXAgTmVlZGVkIGZvciBHUE8gKi8KKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKiBTZXR1cCB0aGUgQ0xLSU5fUElOX1NFTCBNVVggdG8gR1BPMiAqLworCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoZ3Bpby0+bHA4NzMtPnJlZ21hcCwgTFA4NzNYX1JFR19DT05GSUcsCisJCQkJCSBMUDg3M1hfQ09ORklHX0NMS0lOX1BJTl9TRUwsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBscDg3M3hfZ3Bpb19zZXRfc2luZ2xlX2VuZGVkKHN0cnVjdCBncGlvX2NoaXAgKmdjLAorCQkJCQl1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJCQllbnVtIHNpbmdsZV9lbmRlZF9tb2RlIG1vZGUpCit7CisJc3RydWN0IGxwODczeF9ncGlvICpncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBMSU5FX01PREVfT1BFTl9EUkFJTjoKKwkJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhncGlvLT5scDg3My0+cmVnbWFwLAorCQkJCQkgIExQODczWF9SRUdfR1BPX0NUUkwsCisJCQkJCSAgQklUKG9mZnNldCAqIEJJVFNfUEVSX0dQTyArCisJCQkJCSAgTFA4NzNYX0dQT19DVFJMX09EKSwKKwkJCQkJICBCSVQob2Zmc2V0ICogQklUU19QRVJfR1BPICsKKwkJCQkJICBMUDg3M1hfR1BPX0NUUkxfT0QpKTsKKwljYXNlIExJTkVfTU9ERV9QVVNIX1BVTEw6CisJCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoZ3Bpby0+bHA4NzMtPnJlZ21hcCwKKwkJCQkJICBMUDg3M1hfUkVHX0dQT19DVFJMLAorCQkJCQkgIEJJVChvZmZzZXQgKiBCSVRTX1BFUl9HUE8gKworCQkJCQkgIExQODczWF9HUE9fQ1RSTF9PRCksIDApOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0geworCS5sYWJlbAkJCT0gImxwODczeC1ncGlvIiwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5yZXF1ZXN0CQk9IGxwODczeF9ncGlvX3JlcXVlc3QsCisJLmdldF9kaXJlY3Rpb24JCT0gbHA4NzN4X2dwaW9fZ2V0X2RpcmVjdGlvbiwKKwkuZGlyZWN0aW9uX2lucHV0CT0gbHA4NzN4X2dwaW9fZGlyZWN0aW9uX2lucHV0LAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gbHA4NzN4X2dwaW9fZGlyZWN0aW9uX291dHB1dCwKKwkuZ2V0CQkJPSBscDg3M3hfZ3Bpb19nZXQsCisJLnNldAkJCT0gbHA4NzN4X2dwaW9fc2V0LAorCS5zZXRfc2luZ2xlX2VuZGVkCT0gbHA4NzN4X2dwaW9fc2V0X3NpbmdsZV9lbmRlZCwKKwkuYmFzZQkJCT0gLTEsCisJLm5ncGlvCQkJPSAyLAorCS5jYW5fc2xlZXAJCT0gdHJ1ZSwKK307CisKK3N0YXRpYyBpbnQgbHA4NzN4X2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbHA4NzN4X2dwaW8gKmdwaW87CisJaW50IHJldDsKKworCWdwaW8gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpncGlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFncGlvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGdwaW8pOworCisJZ3Bpby0+bHA4NzMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJZ3Bpby0+Y2hpcCA9IHRlbXBsYXRlX2NoaXA7CisJZ3Bpby0+Y2hpcC5wYXJlbnQgPSBncGlvLT5scDg3My0+ZGV2OworCisJcmV0ID0gZGV2bV9ncGlvY2hpcF9hZGRfZGF0YSgmcGRldi0+ZGV2LCAmZ3Bpby0+Y2hpcCwgZ3Bpbyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGQgbm90IHJlZ2lzdGVyIGdwaW9jaGlwLCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgbHA4NzN4X2dwaW9faWRfdGFibGVbXSA9IHsKKwl7ICJscDg3M3gtZ3BpbyIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgbHA4NzN4X2dwaW9faWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBscDg3M3hfZ3Bpb19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibHA4NzN4LWdwaW8iLAorCX0sCisJLnByb2JlID0gbHA4NzN4X2dwaW9fcHJvYmUsCisJLmlkX3RhYmxlID0gbHA4NzN4X2dwaW9faWRfdGFibGUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihscDg3M3hfZ3Bpb19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJLZWVydGh5IDxqLWtlZXJ0aHlAdGkuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMUDg3M1ggR1BJTyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWxwYzE4eHguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWxwYzE4eHguYwppbmRleCA5ODgzMmM5Li5mMTJlMDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1scGMxOHh4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbHBjMTh4eC5jCkBAIC03OCw3ICs3OCw3IEBACiAJcmV0dXJuIGxwYzE4eHhfZ3Bpb19kaXJlY3Rpb24oY2hpcCwgb2Zmc2V0LCB0cnVlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgbHBjMTh4eF9jaGlwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgbHBjMTh4eF9jaGlwID0gewogCS5sYWJlbAkJCT0gImxwYzE4eHgvNDN4eC1ncGlvIiwKIAkucmVxdWVzdAkJPSBncGlvY2hpcF9nZW5lcmljX3JlcXVlc3QsCiAJLmZyZWUJCQk9IGdwaW9jaGlwX2dlbmVyaWNfZnJlZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWxwYzMyeHguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWxwYzMyeHguYwppbmRleCBmYzVmMTk3Li45MmIzYWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1scGMzMnh4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbHBjMzJ4eC5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvZ3Bpby1scGMzMnh4Lmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9wbGF0Zm9ybS5oPgpAQCAtNjgsNiArNjcsMjAgQEAKICNkZWZpbmUgR1BJM19QSU5fSU5fU0VMKHgsIHkpCQkJKCgoeCkgPj4gKHkpKSAmIDEpCiAjZGVmaW5lIEdQTzNfUElOX0lOX1NFTCh4LCB5KQkJCSgoKHgpID4+ICh5KSkgJiAxKQogCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMF9NQVgJOAorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfTUFYCTI0CisjZGVmaW5lIExQQzMyWFhfR1BJT19QMl9NQVgJMTMKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AzX01BWAk2CisjZGVmaW5lIExQQzMyWFhfR1BJX1AzX01BWAkyOQorI2RlZmluZSBMUEMzMlhYX0dQT19QM19NQVgJMjQKKworI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfR1JQCTAKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX0dSUAkoTFBDMzJYWF9HUElPX1AwX0dSUCArIExQQzMyWFhfR1BJT19QMF9NQVgpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMl9HUlAJKExQQzMyWFhfR1BJT19QMV9HUlAgKyBMUEMzMlhYX0dQSU9fUDFfTUFYKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDNfR1JQCShMUEMzMlhYX0dQSU9fUDJfR1JQICsgTFBDMzJYWF9HUElPX1AyX01BWCkKKyNkZWZpbmUgTFBDMzJYWF9HUElfUDNfR1JQCShMUEMzMlhYX0dQSU9fUDNfR1JQICsgTFBDMzJYWF9HUElPX1AzX01BWCkKKyNkZWZpbmUgTFBDMzJYWF9HUE9fUDNfR1JQCShMUEMzMlhYX0dQSV9QM19HUlAgKyBMUEMzMlhYX0dQSV9QM19NQVgpCisKIHN0cnVjdCBncGlvX3JlZ3MgewogCXZvaWQgX19pb21lbSAqaW5wX3N0YXRlOwogCXZvaWQgX19pb21lbSAqb3V0cF9zdGF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLW1heDczMHguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1heDczMHguYwppbmRleCAwODgwNzM2Li45NDZkMDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1tYXg3MzB4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbWF4NzMweC5jCkBAIC0xOTIsNiArMTkyLDEwIEBACiAJdHMtPmNoaXAucGFyZW50ID0gZGV2OwogCXRzLT5jaGlwLm93bmVyID0gVEhJU19NT0RVTEU7CiAKKwlyZXQgPSBncGlvY2hpcF9hZGRfZGF0YSgmdHMtPmNoaXAsIHRzKTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXRfZGVzdHJveTsKKwogCS8qCiAJICogaW5pdGlhbGl6ZSBwdWxsdXBzIGFjY29yZGluZyB0byBwbGF0Zm9ybSBkYXRhIGFuZCBjYWNoZSB0aGUKIAkgKiByZWdpc3RlciB2YWx1ZXMgZm9yIGxhdGVyIHVzZS4KQEAgLTIxMywxMCArMjE3LDYgQEAKIAkJfQogCX0KIAotCXJldCA9IGdwaW9jaGlwX2FkZF9kYXRhKCZ0cy0+Y2hpcCwgdHMpOwotCWlmIChyZXQpCi0JCWdvdG8gZXhpdF9kZXN0cm95OwotCiAJcmV0dXJuIHJldDsKIAogZXhpdF9kZXN0cm95OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbWNwMjNzMDguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1jcDIzczA4LmMKaW5kZXggYWMyMmVmYy4uOTlkMzdiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tbWNwMjNzMDguYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tY3AyM3MwOC5jCkBAIC01NjQsNyArNTY0LDcgQEAKIAltY3AtPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IG1jcDIzczA4X2RpcmVjdGlvbl9vdXRwdXQ7CiAJbWNwLT5jaGlwLnNldCA9IG1jcDIzczA4X3NldDsKIAltY3AtPmNoaXAuZGJnX3Nob3cgPSBtY3AyM3MwOF9kYmdfc2hvdzsKLSNpZmRlZiBDT05GSUdfT0YKKyNpZmRlZiBDT05GSUdfT0ZfR1BJTwogCW1jcC0+Y2hpcC5vZl9ncGlvX25fY2VsbHMgPSAyOwogCW1jcC0+Y2hpcC5vZl9ub2RlID0gZGV2LT5vZl9ub2RlOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1tbWlvLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tbWlvLmMKaW5kZXggNmVjMTQ0Yi4uZDdkMDNhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tbW1pby5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1taW8uYwpAQCAtNTczLDYgKzU3Myw3IEBACiAKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJncGlvX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJicmNtLGJjbTYzNDUtZ3BpbyIgfSwKIAl7IC5jb21wYXRpYmxlID0gIndkLG1ibC1ncGlvIiB9LAogCXsgfQogfTsKQEAgLTU5Myw2ICs1OTQsOSBAQAogCiAJcGRhdGEtPmJhc2UgPSAtMTsKIAorCWlmIChvZl9kZXZpY2VfaXNfYmlnX2VuZGlhbihwZGV2LT5kZXYub2Zfbm9kZSkpCisJCSpmbGFncyB8PSBCR1BJT0ZfQklHX0VORElBTl9CWVRFX09SREVSOworCiAJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwgIm5vLW91dHB1dCIpKQogCQkqZmxhZ3MgfD0gQkdQSU9GX05PX09VVFBVVDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbW9ja3VwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tb2NrdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWY4NWIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbW9ja3VwLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBHUElPIFRlc3RpbmcgRGV2aWNlIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCAgS2FtbGFrYW50IFBhdGVsIDxrYW1sYWthbnQucGF0ZWxAYnJvYWRjb20uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgIEJhbXZvciBKaWFuIFpoYW5nIDxiYW12b3IuemhhbmdqaWFuQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjZGVmaW5lIEdQSU9fTkFNRQkiZ3Bpby1tb2NrdXAiCisjZGVmaW5lCU1BWF9HQwkJMTAKKworZW51bSBkaXJlY3Rpb24geworCU9VVCwKKwlJTgorfTsKKworLyoKKyAqIHN0cnVjdCBncGlvX3Bpbl9zdGF0dXMgLSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIEdQSU8gc3RhdHVzCisgKiBAZGlyOiAgICAgICBDb25maWd1cmVzIGRpcmVjdGlvbiBvZiBncGlvIGFzICJpbiIgb3IgIm91dCIsIDA9aW4sIDE9b3V0CisgKiBAdmFsdWU6ICAgICBDb25maWd1cmVzIHN0YXR1cyBvZiB0aGUgZ3BpbyBhcyAwKGxvdykgb3IgMShoaWdoKQorICovCitzdHJ1Y3QgZ3Bpb19waW5fc3RhdHVzIHsKKwllbnVtIGRpcmVjdGlvbiBkaXI7CisJYm9vbCB2YWx1ZTsKK307CisKK3N0cnVjdCBtb2NrdXBfZ3Bpb19jb250cm9sbGVyIHsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGdjOworCXN0cnVjdCBncGlvX3Bpbl9zdGF0dXMgKnN0YXRzOworfTsKKworc3RhdGljIGludCBncGlvX21vY2t1cF9yYW5nZXNbTUFYX0dDIDw8IDFdOworc3RhdGljIGludCBncGlvX21vY2t1cF9wYXJhbXNfbnI7Cittb2R1bGVfcGFyYW1fYXJyYXkoZ3Bpb19tb2NrdXBfcmFuZ2VzLCBpbnQsICZncGlvX21vY2t1cF9wYXJhbXNfbnIsIDA0MDApOworCitjb25zdCBjaGFyIHBpbnNfbmFtZV9zdGFydCA9ICdBJzsKKworc3RhdGljIGludCBtb2NrdXBfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IG1vY2t1cF9ncGlvX2NvbnRyb2xsZXIgKmNudHIgPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CisKKwlyZXR1cm4gY250ci0+c3RhdHNbb2Zmc2V0XS52YWx1ZTsKK30KKworc3RhdGljIHZvaWQgbW9ja3VwX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJICAgIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbW9ja3VwX2dwaW9fY29udHJvbGxlciAqY250ciA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKKworCWNudHItPnN0YXRzW29mZnNldF0udmFsdWUgPSAhIXZhbHVlOworfQorCitzdGF0aWMgaW50IG1vY2t1cF9ncGlvX2Rpcm91dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCSAgICAgIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbW9ja3VwX2dwaW9fY29udHJvbGxlciAqY250ciA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKKworCW1vY2t1cF9ncGlvX3NldChnYywgb2Zmc2V0LCB2YWx1ZSk7CisJY250ci0+c3RhdHNbb2Zmc2V0XS5kaXIgPSBPVVQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW9ja3VwX2dwaW9fZGlyaW4oc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IG1vY2t1cF9ncGlvX2NvbnRyb2xsZXIgKmNudHIgPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CisKKwljbnRyLT5zdGF0c1tvZmZzZXRdLmRpciA9IElOOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vY2t1cF9ncGlvX2dldF9kaXJlY3Rpb24oc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IG1vY2t1cF9ncGlvX2NvbnRyb2xsZXIgKmNudHIgPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CisKKwlyZXR1cm4gY250ci0+c3RhdHNbb2Zmc2V0XS5kaXI7Cit9CisKK3N0YXRpYyBpbnQgbW9ja3VwX2dwaW9fYWRkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBtb2NrdXBfZ3Bpb19jb250cm9sbGVyICpjbnRyLAorCQkJICAgY29uc3QgY2hhciAqbmFtZSwgaW50IGJhc2UsIGludCBuZ3BpbykKK3sKKwlpbnQgcmV0OworCisJY250ci0+Z2MuYmFzZSA9IGJhc2U7CisJY250ci0+Z2MubmdwaW8gPSBuZ3BpbzsKKwljbnRyLT5nYy5sYWJlbCA9IG5hbWU7CisJY250ci0+Z2Mub3duZXIgPSBUSElTX01PRFVMRTsKKwljbnRyLT5nYy5wYXJlbnQgPSBkZXY7CisJY250ci0+Z2MuZ2V0ID0gbW9ja3VwX2dwaW9fZ2V0OworCWNudHItPmdjLnNldCA9IG1vY2t1cF9ncGlvX3NldDsKKwljbnRyLT5nYy5kaXJlY3Rpb25fb3V0cHV0ID0gbW9ja3VwX2dwaW9fZGlyb3V0OworCWNudHItPmdjLmRpcmVjdGlvbl9pbnB1dCA9IG1vY2t1cF9ncGlvX2RpcmluOworCWNudHItPmdjLmdldF9kaXJlY3Rpb24gPSBtb2NrdXBfZ3Bpb19nZXRfZGlyZWN0aW9uOworCWNudHItPnN0YXRzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjbnRyLT5zdGF0cykgKiBjbnRyLT5nYy5uZ3BpbywKKwkJCQkgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWNudHItPnN0YXRzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKwlyZXQgPSBkZXZtX2dwaW9jaGlwX2FkZF9kYXRhKGRldiwgJmNudHItPmdjLCBjbnRyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWRldl9pbmZvKGRldiwgImdwaW88JWQuLiVkPiBhZGQgc3VjY2Vzc2Z1bCEiLCBiYXNlLCBiYXNlICsgbmdwaW8pOworCXJldHVybiAwOworZXJyOgorCWRldl9lcnIoZGV2LCAiZ3BpbzwlZC4uJWQ+IGFkZCBmYWlsZWQhIiwgYmFzZSwgYmFzZSArIG5ncGlvKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1vY2t1cF9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgbW9ja3VwX2dwaW9fY29udHJvbGxlciAqY250cjsKKwlpbnQgcmV0OworCWludCBpOworCWludCBiYXNlOworCWludCBuZ3BpbzsKKwljaGFyIGNoaXBfbmFtZVtzaXplb2YoR1BJT19OQU1FKSArIDNdOworCisJaWYgKGdwaW9fbW9ja3VwX3BhcmFtc19uciA8IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJY250ciA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqY250cikgKiAoZ3Bpb19tb2NrdXBfcGFyYW1zX25yID4+IDEpLAorCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghY250cikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjbnRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBncGlvX21vY2t1cF9wYXJhbXNfbnIgPj4gMTsgaSsrKSB7CisJCWJhc2UgPSBncGlvX21vY2t1cF9yYW5nZXNbaSAqIDJdOworCQlpZiAoYmFzZSA9PSAtMSkKKwkJCW5ncGlvID0gZ3Bpb19tb2NrdXBfcmFuZ2VzW2kgKiAyICsgMV07CisJCWVsc2UKKwkJCW5ncGlvID0gZ3Bpb19tb2NrdXBfcmFuZ2VzW2kgKiAyICsgMV0gLSBiYXNlOworCisJCWlmIChuZ3BpbyA+PSAwKSB7CisJCQlzcHJpbnRmKGNoaXBfbmFtZSwgIiVzLSVjIiwgR1BJT19OQU1FLAorCQkJCXBpbnNfbmFtZV9zdGFydCArIGkpOworCQkJcmV0ID0gbW9ja3VwX2dwaW9fYWRkKGRldiwgJmNudHJbaV0sCisJCQkJCSAgICAgIGNoaXBfbmFtZSwgYmFzZSwgbmdwaW8pOworCQl9IGVsc2UgeworCQkJcmV0ID0gLTE7CisJCX0KKwkJaWYgKHJldCkgeworCQkJaWYgKGJhc2UgPCAwKQorCQkJCWRldl9lcnIoZGV2LCAiZ3BpbzwlZC4uJWQ+IGFkZCBmYWlsZWRcbiIsCisJCQkJCWJhc2UsIG5ncGlvKTsKKwkJCWVsc2UKKwkJCQlkZXZfZXJyKGRldiwgImdwaW88JWQuLiVkPiBhZGQgZmFpbGVkXG4iLAorCQkJCQliYXNlLCBiYXNlICsgbmdwaW8pOworCisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1vY2t1cF9ncGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9IEdQSU9fTkFNRSwKKwkJICAgfSwKKwkucHJvYmUgPSBtb2NrdXBfZ3Bpb19wcm9iZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2Oworc3RhdGljIGludCBfX2luaXQgbW9ja19kZXZpY2VfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKEdQSU9fTkFNRSwgLTEpOworCWlmICghcGRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1vY2t1cF9ncGlvX2RyaXZlcik7CisJaWYgKGVycikgeworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1vY2tfZGV2aWNlX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbW9ja3VwX2dwaW9fZHJpdmVyKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKK30KKworbW9kdWxlX2luaXQobW9ja19kZXZpY2VfaW5pdCk7Cittb2R1bGVfZXhpdChtb2NrX2RldmljZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiS2FtbGFrYW50IFBhdGVsIDxrYW1sYWthbnQucGF0ZWxAYnJvYWRjb20uY29tPiIpOworTU9EVUxFX0FVVEhPUigiQmFtdm9yIEppYW4gWmhhbmcgPGJhbXZvci56aGFuZ2ppYW5AbGluYXJvLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR1BJTyBUZXN0aW5nIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbXNpYy5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbXNpYy5jCmluZGV4IGQ3NTY0OTcuLjFiN2NlN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLW1zaWMuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tc2ljLmMKQEAgLTIwLDcgKzIwLDYgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTMyOCw5ICszMjcsNCBAQAogewogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBsYXRmb3JtX21zaWNfZ3Bpb19kcml2ZXIpOwogfQotCiBzdWJzeXNfaW5pdGNhbGwocGxhdGZvcm1fbXNpY19ncGlvX2luaXQpOwotCi1NT0RVTEVfQVVUSE9SKCJNYXRoaWFzIE55bWFuIDxtYXRoaWFzLm55bWFuQGxpbnV4LmludGVsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgTWVkZmllbGQgTVNJQyBHUElPIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbXhjLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1teGMuYwppbmRleCAxYjM0MmEzLi5jMWExZTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1teGMuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1teGMuYwpAQCAtMiw3ICsyLDggQEAKICAqIE1YQyBHUElPIHN1cHBvcnQuIChjKSAyMDA4IERhbmllbCBNYWNrIDxkYW5pZWxAY2FpYXEuZGU+CiAgKiBDb3B5cmlnaHQgMjAwOCBKdWVyZ2VuIEJlaXNlcnQsIGtlcm5lbEBwZW5ndXRyb25peC5kZQogICoKLSAqIEJhc2VkIG9uIGNvZGUgZnJvbSBGcmVlc2NhbGUsCisgKiBCYXNlZCBvbiBjb2RlIGZyb20gRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsCisgKiBBdXRob3JzOiBEYW5pZWwgTWFjaywgSnVlcmdlbiBCZWlzZXJ0LgogICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0zMyw3ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAKIGVudW0gbXhjX2dwaW9faHd0eXBlIHsKQEAgLTQ1OCw2ICs0NTgsMTEgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9iZ2lvOwogCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImdwaW8tcmFuZ2VzIikpIHsKKwkJcG9ydC0+Z2MucmVxdWVzdCA9IGdwaW9jaGlwX2dlbmVyaWNfcmVxdWVzdDsKKwkJcG9ydC0+Z2MuZnJlZSA9IGdwaW9jaGlwX2dlbmVyaWNfZnJlZTsKKwl9CisKIAlwb3J0LT5nYy50b19pcnEgPSBteGNfZ3Bpb190b19pcnE7CiAJcG9ydC0+Z2MuYmFzZSA9IChwZGV2LT5pZCA8IDApID8gb2ZfYWxpYXNfZ2V0X2lkKG5wLCAiZ3BpbyIpICogMzIgOgogCQkJCQkgICAgIHBkZXYtPmlkICogMzI7CkBAIC01MTAsMTAgKzUxNSw0IEBACiB7CiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXhjX2dwaW9fZHJpdmVyKTsKIH0KLXBvc3Rjb3JlX2luaXRjYWxsKGdwaW9fbXhjX2luaXQpOwotCi1NT0RVTEVfQVVUSE9SKCJGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgIgotCSAgICAgICJEYW5pZWwgTWFjayA8ZGFuaWVsbmNhaWFxLmRlPiwgIgotCSAgICAgICJKdWVyZ2VuIEJlaXNlcnQgPGtlcm5lbEBwZW5ndXRyb25peC5kZT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRnJlZXNjYWxlIE1YQyBHUElPIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CitzdWJzeXNfaW5pdGNhbGwoZ3Bpb19teGNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1wYWxtYXMuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBhbG1hcy5jCmluZGV4IDgzOTQ3NDQuLjNkODE4MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBhbG1hcy5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBhbG1hcy5jCkBAIC0xNTIsNyArMTUyLDYgQEAKIAl7IC5jb21wYXRpYmxlID0gInRpLHRwczgwMDM2LWdwaW8iLCAuZGF0YSA9ICZ0cHM4MDAzNl9kZXZfZGF0YSx9LAogCXsgfSwKIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9wYWxtYXNfZ3Bpb19tYXRjaCk7CiAKIHN0YXRpYyBpbnQgcGFsbWFzX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBjYTk1M3guYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBjYTk1M3guYwppbmRleCAwMmYyYTU2Li41ZDA1OTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1wY2E5NTN4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tcGNhOTUzeC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogCiAjZGVmaW5lIFBDQTk1M1hfSU5QVVQJCTAKICNkZWZpbmUgUENBOTUzWF9PVVRQVVQJCTEKQEAgLTk0LDYgKzk1LDI0IEBACiAKICNkZWZpbmUgTkJBTksoY2hpcCkgRElWX1JPVU5EX1VQKGNoaXAtPmdwaW9fY2hpcC5uZ3BpbywgQkFOS19TWikKIAorc3RydWN0IHBjYTk1M3hfcmVnX2NvbmZpZyB7CisJaW50IGRpcmVjdGlvbjsKKwlpbnQgb3V0cHV0OworCWludCBpbnB1dDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNhOTUzeF9yZWdfY29uZmlnIHBjYTk1M3hfcmVncyA9IHsKKwkuZGlyZWN0aW9uID0gUENBOTUzWF9ESVJFQ1RJT04sCisJLm91dHB1dCA9IFBDQTk1M1hfT1VUUFVULAorCS5pbnB1dCA9IFBDQTk1M1hfSU5QVVQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjYTk1M3hfcmVnX2NvbmZpZyBwY2E5NTd4X3JlZ3MgPSB7CisJLmRpcmVjdGlvbiA9IFBDQTk1N1hfQ0ZHLAorCS5vdXRwdXQgPSBQQ0E5NTdYX09VVCwKKwkuaW5wdXQgPSBQQ0E5NTdYX0lOLAorfTsKKwogc3RydWN0IHBjYTk1M3hfY2hpcCB7CiAJdW5zaWduZWQgZ3Bpb19zdGFydDsKIAl1OCByZWdfb3V0cHV0W01BWF9CQU5LXTsKQEAgLTExMSw4ICsxMzAsMTMgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBncGlvX2NoaXAgZ3Bpb19jaGlwOwogCWNvbnN0IGNoYXIgKmNvbnN0ICpuYW1lczsKLQlpbnQJY2hpcF90eXBlOwogCXVuc2lnbmVkIGxvbmcgZHJpdmVyX2RhdGE7CisJc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yOworCisJY29uc3Qgc3RydWN0IHBjYTk1M3hfcmVnX2NvbmZpZyAqcmVnczsKKworCWludCAoKndyaXRlX3JlZ3MpKHN0cnVjdCBwY2E5NTN4X2NoaXAgKiwgaW50LCB1OCAqKTsKKwlpbnQgKCpyZWFkX3JlZ3MpKHN0cnVjdCBwY2E5NTN4X2NoaXAgKiwgaW50LCB1OCAqKTsKIH07CiAKIHN0YXRpYyBpbnQgcGNhOTUzeF9yZWFkX3NpbmdsZShzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1MzIgKnZhbCwKQEAgLTE1MiwzOCArMTc2LDQ0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcGNhOTUzeF93cml0ZV9yZWdzXzgoc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCwgaW50IHJlZywgdTggKnZhbCkKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsIHJlZywgKnZhbCk7Cit9CisKK3N0YXRpYyBpbnQgcGNhOTUzeF93cml0ZV9yZWdzXzE2KHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAsIGludCByZWcsIHU4ICp2YWwpCit7CisJX19sZTE2IHdvcmQgPSBjcHVfdG9fbGUxNihnZXRfdW5hbGlnbmVkKCh1MTYgKil2YWwpKTsKKworCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNoaXAtPmNsaWVudCwKKwkJCQkJIHJlZyA8PCAxLCAoX19mb3JjZSB1MTYpd29yZCk7Cit9CisKK3N0YXRpYyBpbnQgcGNhOTU3eF93cml0ZV9yZWdzXzE2KHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAsIGludCByZWcsIHU4ICp2YWwpCit7CisJaW50IHJldDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2hpcC0+Y2xpZW50LCByZWcgPDwgMSwgdmFsWzBdKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwgKHJlZyA8PCAxKSArIDEsIHZhbFsxXSk7Cit9CisKK3N0YXRpYyBpbnQgcGNhOTUzeF93cml0ZV9yZWdzXzI0KHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAsIGludCByZWcsIHU4ICp2YWwpCit7CisJaW50IGJhbmtfc2hpZnQgPSBmbHMoKGNoaXAtPmdwaW9fY2hpcC5uZ3BpbyAtIDEpIC8gQkFOS19TWik7CisKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKGNoaXAtPmNsaWVudCwKKwkJCQkJICAgICAgKHJlZyA8PCBiYW5rX3NoaWZ0KSB8IFJFR19BRERSX0FJLAorCQkJCQkgICAgICBOQkFOSyhjaGlwKSwgdmFsKTsKK30KKwogc3RhdGljIGludCBwY2E5NTN4X3dyaXRlX3JlZ3Moc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCwgaW50IHJlZywgdTggKnZhbCkKIHsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChjaGlwLT5ncGlvX2NoaXAubmdwaW8gPD0gOCkKLQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsIHJlZywgKnZhbCk7Ci0JZWxzZSBpZiAoY2hpcC0+Z3Bpb19jaGlwLm5ncGlvID49IDI0KSB7Ci0JCWludCBiYW5rX3NoaWZ0ID0gZmxzKChjaGlwLT5ncGlvX2NoaXAubmdwaW8gLSAxKSAvIEJBTktfU1opOwotCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEoY2hpcC0+Y2xpZW50LAotCQkJCQkocmVnIDw8IGJhbmtfc2hpZnQpIHwgUkVHX0FERFJfQUksCi0JCQkJCU5CQU5LKGNoaXApLCB2YWwpOwotCX0gZWxzZSB7Ci0JCXN3aXRjaCAoY2hpcC0+Y2hpcF90eXBlKSB7Ci0JCWNhc2UgUENBOTUzWF9UWVBFOiB7Ci0JCQlfX2xlMTYgd29yZCA9IGNwdV90b19sZTE2KGdldF91bmFsaWduZWQoKHUxNiAqKXZhbCkpOwotCi0JCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNoaXAtPmNsaWVudCwgcmVnIDw8IDEsCi0JCQkJCQkJKF9fZm9yY2UgdTE2KXdvcmQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBQQ0E5NTdYX1RZUEU6Ci0JCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwgcmVnIDw8IDEsCi0JCQkJCQkJdmFsWzBdKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWJyZWFrOwotCQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsCi0JCQkJCQkJKHJlZyA8PCAxKSArIDEsCi0JCQkJCQkJdmFsWzFdKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCisJcmV0ID0gY2hpcC0+d3JpdGVfcmVncyhjaGlwLCByZWcsIHZhbCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJmYWlsZWQgd3JpdGluZyByZWdpc3RlclxuIik7CiAJCXJldHVybiByZXQ7CkBAIC0xOTIsMjQgKzIyMiw0MSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHBjYTk1M3hfcmVhZF9yZWdzXzgoc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCwgaW50IHJlZywgdTggKnZhbCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwgcmVnKTsKKwkqdmFsID0gcmV0OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwY2E5NTN4X3JlYWRfcmVnc18xNihzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1OCAqdmFsKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2hpcC0+Y2xpZW50LCByZWcgPDwgMSk7CisJdmFsWzBdID0gKHUxNilyZXQgJiAweEZGOworCXZhbFsxXSA9ICh1MTYpcmV0ID4+IDg7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBjYTk1M3hfcmVhZF9yZWdzXzI0KHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAsIGludCByZWcsIHU4ICp2YWwpCit7CisJaW50IGJhbmtfc2hpZnQgPSBmbHMoKGNoaXAtPmdwaW9fY2hpcC5uZ3BpbyAtIDEpIC8gQkFOS19TWik7CisKKwlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoY2hpcC0+Y2xpZW50LAorCQkJCQkgICAgIChyZWcgPDwgYmFua19zaGlmdCkgfCBSRUdfQUREUl9BSSwKKwkJCQkJICAgICBOQkFOSyhjaGlwKSwgdmFsKTsKK30KKwogc3RhdGljIGludCBwY2E5NTN4X3JlYWRfcmVncyhzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1OCAqdmFsKQogewogCWludCByZXQ7CiAKLQlpZiAoY2hpcC0+Z3Bpb19jaGlwLm5ncGlvIDw9IDgpIHsKLQkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwgcmVnKTsKLQkJKnZhbCA9IHJldDsKLQl9IGVsc2UgaWYgKGNoaXAtPmdwaW9fY2hpcC5uZ3BpbyA+PSAyNCkgewotCQlpbnQgYmFua19zaGlmdCA9IGZscygoY2hpcC0+Z3Bpb19jaGlwLm5ncGlvIC0gMSkgLyBCQU5LX1NaKTsKLQotCQlyZXQgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShjaGlwLT5jbGllbnQsCi0JCQkJCShyZWcgPDwgYmFua19zaGlmdCkgfCBSRUdfQUREUl9BSSwKLQkJCQkJTkJBTksoY2hpcCksIHZhbCk7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNoaXAtPmNsaWVudCwgcmVnIDw8IDEpOwotCQl2YWxbMF0gPSAodTE2KXJldCAmIDB4RkY7Ci0JCXZhbFsxXSA9ICh1MTYpcmV0ID4+IDg7Ci0JfQorCXJldCA9IGNoaXAtPnJlYWRfcmVncyhjaGlwLCByZWcsIHZhbCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJmYWlsZWQgcmVhZGluZyByZWdpc3RlclxuIik7CiAJCXJldHVybiByZXQ7CkBAIC0yMjIsMjAgKzI2OSwxMiBAQAogewogCXN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAgPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CiAJdTggcmVnX3ZhbDsKLQlpbnQgcmV0LCBvZmZzZXQgPSAwOworCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5pMmNfbG9jayk7CiAJcmVnX3ZhbCA9IGNoaXAtPnJlZ19kaXJlY3Rpb25bb2ZmIC8gQkFOS19TWl0gfCAoMXUgPDwgKG9mZiAlIEJBTktfU1opKTsKIAotCXN3aXRjaCAoY2hpcC0+Y2hpcF90eXBlKSB7Ci0JY2FzZSBQQ0E5NTNYX1RZUEU6Ci0JCW9mZnNldCA9IFBDQTk1M1hfRElSRUNUSU9OOwotCQlicmVhazsKLQljYXNlIFBDQTk1N1hfVFlQRToKLQkJb2Zmc2V0ID0gUENBOTU3WF9DRkc7Ci0JCWJyZWFrOwotCX0KLQlyZXQgPSBwY2E5NTN4X3dyaXRlX3NpbmdsZShjaGlwLCBvZmZzZXQsIHJlZ192YWwsIG9mZik7CisJcmV0ID0gcGNhOTUzeF93cml0ZV9zaW5nbGUoY2hpcCwgY2hpcC0+cmVncy0+ZGlyZWN0aW9uLCByZWdfdmFsLCBvZmYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXhpdDsKIApAQCAtMjUwLDcgKzI4OSw3IEBACiB7CiAJc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKIAl1OCByZWdfdmFsOwotCWludCByZXQsIG9mZnNldCA9IDA7CisJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmNoaXAtPmkyY19sb2NrKTsKIAkvKiBzZXQgb3V0cHV0IGxldmVsICovCkBAIC0yNjEsMTUgKzMwMCw3IEBACiAJCXJlZ192YWwgPSBjaGlwLT5yZWdfb3V0cHV0W29mZiAvIEJBTktfU1pdCiAJCQkmIH4oMXUgPDwgKG9mZiAlIEJBTktfU1opKTsKIAotCXN3aXRjaCAoY2hpcC0+Y2hpcF90eXBlKSB7Ci0JY2FzZSBQQ0E5NTNYX1RZUEU6Ci0JCW9mZnNldCA9IFBDQTk1M1hfT1VUUFVUOwotCQlicmVhazsKLQljYXNlIFBDQTk1N1hfVFlQRToKLQkJb2Zmc2V0ID0gUENBOTU3WF9PVVQ7Ci0JCWJyZWFrOwotCX0KLQlyZXQgPSBwY2E5NTN4X3dyaXRlX3NpbmdsZShjaGlwLCBvZmZzZXQsIHJlZ192YWwsIG9mZik7CisJcmV0ID0gcGNhOTUzeF93cml0ZV9zaW5nbGUoY2hpcCwgY2hpcC0+cmVncy0+b3V0cHV0LCByZWdfdmFsLCBvZmYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXhpdDsKIApAQCAtMjc3LDE1ICszMDgsNyBAQAogCiAJLyogdGhlbiBkaXJlY3Rpb24gKi8KIAlyZWdfdmFsID0gY2hpcC0+cmVnX2RpcmVjdGlvbltvZmYgLyBCQU5LX1NaXSAmIH4oMXUgPDwgKG9mZiAlIEJBTktfU1opKTsKLQlzd2l0Y2ggKGNoaXAtPmNoaXBfdHlwZSkgewotCWNhc2UgUENBOTUzWF9UWVBFOgotCQlvZmZzZXQgPSBQQ0E5NTNYX0RJUkVDVElPTjsKLQkJYnJlYWs7Ci0JY2FzZSBQQ0E5NTdYX1RZUEU6Ci0JCW9mZnNldCA9IFBDQTk1N1hfQ0ZHOwotCQlicmVhazsKLQl9Ci0JcmV0ID0gcGNhOTUzeF93cml0ZV9zaW5nbGUoY2hpcCwgb2Zmc2V0LCByZWdfdmFsLCBvZmYpOworCXJldCA9IHBjYTk1M3hfd3JpdGVfc2luZ2xlKGNoaXAsIGNoaXAtPnJlZ3MtPmRpcmVjdGlvbiwgcmVnX3ZhbCwgb2ZmKTsKIAlpZiAocmV0KQogCQlnb3RvIGV4aXQ7CiAKQEAgLTI5OSwxOCArMzIyLDEwIEBACiB7CiAJc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKIAl1MzIgcmVnX3ZhbDsKLQlpbnQgcmV0LCBvZmZzZXQgPSAwOworCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5pMmNfbG9jayk7Ci0Jc3dpdGNoIChjaGlwLT5jaGlwX3R5cGUpIHsKLQljYXNlIFBDQTk1M1hfVFlQRToKLQkJb2Zmc2V0ID0gUENBOTUzWF9JTlBVVDsKLQkJYnJlYWs7Ci0JY2FzZSBQQ0E5NTdYX1RZUEU6Ci0JCW9mZnNldCA9IFBDQTk1N1hfSU47Ci0JCWJyZWFrOwotCX0KLQlyZXQgPSBwY2E5NTN4X3JlYWRfc2luZ2xlKGNoaXAsIG9mZnNldCwgJnJlZ192YWwsIG9mZik7CisJcmV0ID0gcGNhOTUzeF9yZWFkX3NpbmdsZShjaGlwLCBjaGlwLT5yZWdzLT5pbnB1dCwgJnJlZ192YWwsIG9mZik7CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5pMmNfbG9jayk7CiAJaWYgKHJldCA8IDApIHsKIAkJLyogTk9URTogIGRpYWdub3N0aWMgYWxyZWFkeSBlbWl0dGVkOyB0aGF0J3MgYWxsIHdlIHNob3VsZApAQCAtMzI3LDcgKzM0Miw3IEBACiB7CiAJc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKIAl1OCByZWdfdmFsOwotCWludCByZXQsIG9mZnNldCA9IDA7CisJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmNoaXAtPmkyY19sb2NrKTsKIAlpZiAodmFsKQpAQCAtMzM3LDE1ICszNTIsNyBAQAogCQlyZWdfdmFsID0gY2hpcC0+cmVnX291dHB1dFtvZmYgLyBCQU5LX1NaXQogCQkJJiB+KDF1IDw8IChvZmYgJSBCQU5LX1NaKSk7CiAKLQlzd2l0Y2ggKGNoaXAtPmNoaXBfdHlwZSkgewotCWNhc2UgUENBOTUzWF9UWVBFOgotCQlvZmZzZXQgPSBQQ0E5NTNYX09VVFBVVDsKLQkJYnJlYWs7Ci0JY2FzZSBQQ0E5NTdYX1RZUEU6Ci0JCW9mZnNldCA9IFBDQTk1N1hfT1VUOwotCQlicmVhazsKLQl9Ci0JcmV0ID0gcGNhOTUzeF93cml0ZV9zaW5nbGUoY2hpcCwgb2Zmc2V0LCByZWdfdmFsLCBvZmYpOworCXJldCA9IHBjYTk1M3hfd3JpdGVfc2luZ2xlKGNoaXAsIGNoaXAtPnJlZ3MtPm91dHB1dCwgcmVnX3ZhbCwgb2ZmKTsKIAlpZiAocmV0KQogCQlnb3RvIGV4aXQ7CiAKQEAgLTM1NSwzNSArMzYyLDMxIEBACiB9CiAKIHN0YXRpYyB2b2lkIHBjYTk1M3hfZ3Bpb19zZXRfbXVsdGlwbGUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCi0JCXVuc2lnbmVkIGxvbmcgKm1hc2ssIHVuc2lnbmVkIGxvbmcgKmJpdHMpCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyAqbWFzaywgdW5zaWduZWQgbG9uZyAqYml0cykKIHsKIAlzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOworCXVuc2lnbmVkIGludCBiYW5rX21hc2ssIGJhbmtfdmFsOworCWludCBiYW5rX3NoaWZ0LCBiYW5rOwogCXU4IHJlZ192YWxbTUFYX0JBTktdOwotCWludCByZXQsIG9mZnNldCA9IDA7Ci0JaW50IGJhbmtfc2hpZnQgPSBmbHMoKGNoaXAtPmdwaW9fY2hpcC5uZ3BpbyAtIDEpIC8gQkFOS19TWik7Ci0JaW50IGJhbms7CisJaW50IHJldDsKIAotCXN3aXRjaCAoY2hpcC0+Y2hpcF90eXBlKSB7Ci0JY2FzZSBQQ0E5NTNYX1RZUEU6Ci0JCW9mZnNldCA9IFBDQTk1M1hfT1VUUFVUOwotCQlicmVhazsKLQljYXNlIFBDQTk1N1hfVFlQRToKLQkJb2Zmc2V0ID0gUENBOTU3WF9PVVQ7Ci0JCWJyZWFrOwotCX0KKwliYW5rX3NoaWZ0ID0gZmxzKChjaGlwLT5ncGlvX2NoaXAubmdwaW8gLSAxKSAvIEJBTktfU1opOwogCiAJbWVtY3B5KHJlZ192YWwsIGNoaXAtPnJlZ19vdXRwdXQsIE5CQU5LKGNoaXApKTsKIAltdXRleF9sb2NrKCZjaGlwLT5pMmNfbG9jayk7Ci0JZm9yKGJhbms9MDsgYmFuazxOQkFOSyhjaGlwKTsgYmFuaysrKSB7Ci0JCXVuc2lnbmVkIGJhbmttYXNrID0gbWFza1tiYW5rIC8gc2l6ZW9mKCptYXNrKV0gPj4KLQkJCQkgICAgKChiYW5rICUgc2l6ZW9mKCptYXNrKSkgKiA4KTsKLQkJaWYoYmFua21hc2spIHsKLQkJCXVuc2lnbmVkIGJhbmt2YWwgID0gYml0c1tiYW5rIC8gc2l6ZW9mKCpiaXRzKV0gPj4KLQkJCQkJICAgICgoYmFuayAlIHNpemVvZigqYml0cykpICogOCk7Ci0JCQlyZWdfdmFsW2JhbmtdID0gKHJlZ192YWxbYmFua10gJiB+YmFua21hc2spIHwgYmFua3ZhbDsKKwlmb3IgKGJhbmsgPSAwOyBiYW5rIDwgTkJBTksoY2hpcCk7IGJhbmsrKykgeworCQliYW5rX21hc2sgPSBtYXNrW2JhbmsgLyBzaXplb2YoKm1hc2spXSA+PgorCQkJICAgKChiYW5rICUgc2l6ZW9mKCptYXNrKSkgKiA4KTsKKwkJaWYgKGJhbmtfbWFzaykgeworCQkJYmFua192YWwgPSBiaXRzW2JhbmsgLyBzaXplb2YoKmJpdHMpXSA+PgorCQkJCSAgKChiYW5rICUgc2l6ZW9mKCpiaXRzKSkgKiA4KTsKKwkJCXJlZ192YWxbYmFua10gPSAocmVnX3ZhbFtiYW5rXSAmIH5iYW5rX21hc2spIHwgYmFua192YWw7CiAJCX0KIAl9Ci0JcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKGNoaXAtPmNsaWVudCwgb2Zmc2V0IDw8IGJhbmtfc2hpZnQsIE5CQU5LKGNoaXApLCByZWdfdmFsKTsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShjaGlwLT5jbGllbnQsCisJCQkJCSAgICAgY2hpcC0+cmVncy0+b3V0cHV0IDw8IGJhbmtfc2hpZnQsCisJCQkJCSAgICAgTkJBTksoY2hpcCksIHJlZ192YWwpOwogCWlmIChyZXQpCiAJCWdvdG8gZXhpdDsKIApAQCAtNTE1LDcgKzUxOCw3IEBACiAJYm9vbCBwZW5kaW5nX3NlZW4gPSBmYWxzZTsKIAlib29sIHRyaWdnZXJfc2VlbiA9IGZhbHNlOwogCXU4IHRyaWdnZXJbTUFYX0JBTktdOwotCWludCByZXQsIGksIG9mZnNldCA9IDA7CisJaW50IHJldCwgaTsKIAogCWlmIChjaGlwLT5kcml2ZXJfZGF0YSAmIFBDQV9QQ0FMKSB7CiAJCS8qIFJlYWQgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHN0YXR1cyBmcm9tIHRoZSBkZXZpY2UgKi8KQEAgLTU0MCwxNSArNTQzLDcgQEAKIAkJcmV0dXJuIHBlbmRpbmdfc2VlbjsKIAl9CiAKLQlzd2l0Y2ggKGNoaXAtPmNoaXBfdHlwZSkgewotCWNhc2UgUENBOTUzWF9UWVBFOgotCQlvZmZzZXQgPSBQQ0E5NTNYX0lOUFVUOwotCQlicmVhazsKLQljYXNlIFBDQTk1N1hfVFlQRToKLQkJb2Zmc2V0ID0gUENBOTU3WF9JTjsKLQkJYnJlYWs7Ci0JfQotCXJldCA9IHBjYTk1M3hfcmVhZF9yZWdzKGNoaXAsIG9mZnNldCwgY3VyX3N0YXQpOworCXJldCA9IHBjYTk1M3hfcmVhZF9yZWdzKGNoaXAsIGNoaXAtPnJlZ3MtPmlucHV0LCBjdXJfc3RhdCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIGZhbHNlOwogCkBAIC02MDgsMjAgKzYwMywxMyBAQAogCQkJICAgICBpbnQgaXJxX2Jhc2UpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKLQlpbnQgcmV0LCBpLCBvZmZzZXQgPSAwOworCWludCByZXQsIGk7CiAKIAlpZiAoY2xpZW50LT5pcnEgJiYgaXJxX2Jhc2UgIT0gLTEKIAkJCSYmIChjaGlwLT5kcml2ZXJfZGF0YSAmIFBDQV9JTlQpKSB7CiAKLQkJc3dpdGNoIChjaGlwLT5jaGlwX3R5cGUpIHsKLQkJY2FzZSBQQ0E5NTNYX1RZUEU6Ci0JCQlvZmZzZXQgPSBQQ0E5NTNYX0lOUFVUOwotCQkJYnJlYWs7Ci0JCWNhc2UgUENBOTU3WF9UWVBFOgotCQkJb2Zmc2V0ID0gUENBOTU3WF9JTjsKLQkJCWJyZWFrOwotCQl9Ci0JCXJldCA9IHBjYTk1M3hfcmVhZF9yZWdzKGNoaXAsIG9mZnNldCwgY2hpcC0+aXJxX3N0YXQpOworCQlyZXQgPSBwY2E5NTN4X3JlYWRfcmVncyhjaGlwLAorCQkJCQljaGlwLT5yZWdzLT5pbnB1dCwgY2hpcC0+aXJxX3N0YXQpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIApAQCAtNjg0LDEyICs2NzIsMTQgQEAKIAlpbnQgcmV0OwogCXU4IHZhbFtNQVhfQkFOS107CiAKLQlyZXQgPSBwY2E5NTN4X3JlYWRfcmVncyhjaGlwLCBQQ0E5NTNYX09VVFBVVCwgY2hpcC0+cmVnX291dHB1dCk7CisJY2hpcC0+cmVncyA9ICZwY2E5NTN4X3JlZ3M7CisKKwlyZXQgPSBwY2E5NTN4X3JlYWRfcmVncyhjaGlwLCBjaGlwLT5yZWdzLT5vdXRwdXQsIGNoaXAtPnJlZ19vdXRwdXQpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gcGNhOTUzeF9yZWFkX3JlZ3MoY2hpcCwgUENBOTUzWF9ESVJFQ1RJT04sCi0JCQkgICAgICAgY2hpcC0+cmVnX2RpcmVjdGlvbik7CisJcmV0ID0gcGNhOTUzeF9yZWFkX3JlZ3MoY2hpcCwgY2hpcC0+cmVncy0+ZGlyZWN0aW9uLAorCQkJCWNoaXAtPnJlZ19kaXJlY3Rpb24pOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC03MDksMTAgKzY5OSwxMyBAQAogCWludCByZXQ7CiAJdTggdmFsW01BWF9CQU5LXTsKIAotCXJldCA9IHBjYTk1M3hfcmVhZF9yZWdzKGNoaXAsIFBDQTk1N1hfT1VULCBjaGlwLT5yZWdfb3V0cHV0KTsKKwljaGlwLT5yZWdzID0gJnBjYTk1N3hfcmVnczsKKworCXJldCA9IHBjYTk1M3hfcmVhZF9yZWdzKGNoaXAsIGNoaXAtPnJlZ3MtPm91dHB1dCwgY2hpcC0+cmVnX291dHB1dCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7Ci0JcmV0ID0gcGNhOTUzeF9yZWFkX3JlZ3MoY2hpcCwgUENBOTU3WF9DRkcsIGNoaXAtPnJlZ19kaXJlY3Rpb24pOworCXJldCA9IHBjYTk1M3hfcmVhZF9yZWdzKGNoaXAsIGNoaXAtPnJlZ3MtPmRpcmVjdGlvbiwKKwkJCQljaGlwLT5yZWdfZGlyZWN0aW9uKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIApAQCAtNzQ2LDYgKzczOSw3IEBACiAJaW50IGlycV9iYXNlID0gMDsKIAlpbnQgcmV0OwogCXUzMiBpbnZlcnQgPSAwOworCXN0cnVjdCByZWd1bGF0b3IgKnJlZzsKIAogCWNoaXAgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LAogCQkJc2l6ZW9mKHN0cnVjdCBwY2E5NTN4X2NoaXApLCBHRlBfS0VSTkVMKTsKQEAgLTc2NSw2ICs3NTksMjAgQEAKIAogCWNoaXAtPmNsaWVudCA9IGNsaWVudDsKIAorCXJlZyA9IGRldm1fcmVndWxhdG9yX2dldCgmY2xpZW50LT5kZXYsICJ2Y2MiKTsKKwlpZiAoSVNfRVJSKHJlZykpIHsKKwkJcmV0ID0gUFRSX0VSUihyZWcpOworCQlpZiAocmV0ICE9IC1FUFJPQkVfREVGRVIpCisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInJlZyBnZXQgZXJyOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShyZWcpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJyZWcgZW4gZXJyOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJY2hpcC0+cmVndWxhdG9yID0gcmVnOworCiAJaWYgKGlkKSB7CiAJCWNoaXAtPmRyaXZlcl9kYXRhID0gaWQtPmRyaXZlcl9kYXRhOwogCX0gZWxzZSB7CkBAIC03NzYsMTUgKzc4NCwxNSBAQAogCQkJY2hpcC0+ZHJpdmVyX2RhdGEgPSAoaW50KSh1aW50cHRyX3QpbWF0Y2gtPmRhdGE7CiAJCX0gZWxzZSB7CiAJCQlpZCA9IGFjcGlfbWF0Y2hfZGV2aWNlKHBjYTk1M3hfYWNwaV9pZHMsICZjbGllbnQtPmRldik7Ci0JCQlpZiAoIWlkKQotCQkJCXJldHVybiAtRU5PREVWOworCQkJaWYgKCFpZCkgeworCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJZ290byBlcnJfZXhpdDsKKwkJCX0KIAogCQkJY2hpcC0+ZHJpdmVyX2RhdGEgPSBpZC0+ZHJpdmVyX2RhdGE7CiAJCX0KIAl9CiAKLQljaGlwLT5jaGlwX3R5cGUgPSBQQ0FfQ0hJUF9UWVBFKGNoaXAtPmRyaXZlcl9kYXRhKTsKLQogCW11dGV4X2luaXQoJmNoaXAtPmkyY19sb2NrKTsKIAogCS8qIGluaXRpYWxpemUgY2FjaGVkIHJlZ2lzdGVycyBmcm9tIHRoZWlyIG9yaWdpbmFsIHZhbHVlcy4KQEAgLTc5MiwyMCArODAwLDM0IEBACiAJICovCiAJcGNhOTUzeF9zZXR1cF9ncGlvKGNoaXAsIGNoaXAtPmRyaXZlcl9kYXRhICYgUENBX0dQSU9fTUFTSyk7CiAKLQlpZiAoY2hpcC0+Y2hpcF90eXBlID09IFBDQTk1M1hfVFlQRSkKKwlpZiAoY2hpcC0+Z3Bpb19jaGlwLm5ncGlvIDw9IDgpIHsKKwkJY2hpcC0+d3JpdGVfcmVncyA9IHBjYTk1M3hfd3JpdGVfcmVnc184OworCQljaGlwLT5yZWFkX3JlZ3MgPSBwY2E5NTN4X3JlYWRfcmVnc184OworCX0gZWxzZSBpZiAoY2hpcC0+Z3Bpb19jaGlwLm5ncGlvID49IDI0KSB7CisJCWNoaXAtPndyaXRlX3JlZ3MgPSBwY2E5NTN4X3dyaXRlX3JlZ3NfMjQ7CisJCWNoaXAtPnJlYWRfcmVncyA9IHBjYTk1M3hfcmVhZF9yZWdzXzI0OworCX0gZWxzZSB7CisJCWlmIChQQ0FfQ0hJUF9UWVBFKGNoaXAtPmRyaXZlcl9kYXRhKSA9PSBQQ0E5NTNYX1RZUEUpCisJCQljaGlwLT53cml0ZV9yZWdzID0gcGNhOTUzeF93cml0ZV9yZWdzXzE2OworCQllbHNlCisJCQljaGlwLT53cml0ZV9yZWdzID0gcGNhOTU3eF93cml0ZV9yZWdzXzE2OworCQljaGlwLT5yZWFkX3JlZ3MgPSBwY2E5NTN4X3JlYWRfcmVnc18xNjsKKwl9CisKKwlpZiAoUENBX0NISVBfVFlQRShjaGlwLT5kcml2ZXJfZGF0YSkgPT0gUENBOTUzWF9UWVBFKQogCQlyZXQgPSBkZXZpY2VfcGNhOTUzeF9pbml0KGNoaXAsIGludmVydCk7CiAJZWxzZQogCQlyZXQgPSBkZXZpY2VfcGNhOTU3eF9pbml0KGNoaXAsIGludmVydCk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJfZXhpdDsKIAogCXJldCA9IGRldm1fZ3Bpb2NoaXBfYWRkX2RhdGEoJmNsaWVudC0+ZGV2LCAmY2hpcC0+Z3Bpb19jaGlwLCBjaGlwKTsKIAlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycl9leGl0OwogCiAJcmV0ID0gcGNhOTUzeF9pcnFfc2V0dXAoY2hpcCwgaXJxX2Jhc2UpOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyX2V4aXQ7CiAKIAlpZiAocGRhdGEgJiYgcGRhdGEtPnNldHVwKSB7CiAJCXJldCA9IHBkYXRhLT5zZXR1cChjbGllbnQsIGNoaXAtPmdwaW9fY2hpcC5iYXNlLApAQCAtODE2LDYgKzgzOCwxMCBAQAogCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY2hpcCk7CiAJcmV0dXJuIDA7CisKK2Vycl9leGl0OgorCXJlZ3VsYXRvcl9kaXNhYmxlKGNoaXAtPnJlZ3VsYXRvcik7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBwY2E5NTN4X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQpAQCAtODI3LDE0ICs4NTMsMTYgQEAKIAlpZiAocGRhdGEgJiYgcGRhdGEtPnRlYXJkb3duKSB7CiAJCXJldCA9IHBkYXRhLT50ZWFyZG93bihjbGllbnQsIGNoaXAtPmdwaW9fY2hpcC5iYXNlLAogCQkJCWNoaXAtPmdwaW9fY2hpcC5uZ3BpbywgcGRhdGEtPmNvbnRleHQpOwotCQlpZiAocmV0IDwgMCkgeworCQlpZiAocmV0IDwgMCkKIAkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXMgZmFpbGVkLCAlZFxuIiwKIAkJCQkJInRlYXJkb3duIiwgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KKwl9IGVsc2UgeworCQlyZXQgPSAwOwogCX0KIAotCXJldHVybiAwOworCXJlZ3VsYXRvcl9kaXNhYmxlKGNoaXAtPnJlZ3VsYXRvcik7CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKiBjb252ZW5pZW5jZSB0byBzdG9wIG92ZXJsb25nIG1hdGNoLXRhYmxlIGxpbmVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1waXNvc3IuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBpc29zci5jCmluZGV4IGNiMTRiOGQuLmY1NTQ1MDQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1waXNvc3IuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1waXNvc3IuYwpAQCAtOTAsNyArOTAsNyBAQAogCXJldHVybiAoZ3Bpby0+YnVmZmVyW29mZnNldCAvIDhdID4+IChvZmZzZXQgJSA4KSkgJiAweDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gInBpc29zci1ncGlvIiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5nZXRfZGlyZWN0aW9uCQk9IHBpc29zcl9ncGlvX2dldF9kaXJlY3Rpb24sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1yY2FyLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1yY2FyLmMKaW5kZXggYjk2ZTBiNC4uMmJlNDhmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tcmNhci5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXJjYXIuYwpAQCAtMzQ4LDYgKzM0OCwxMCBAQAogCQkvKiBHZW4zIEdQSU8gaXMgaWRlbnRpY2FsIHRvIEdlbjIuICovCiAJCS5kYXRhID0gJmdwaW9fcmNhcl9pbmZvX2dlbjIsCiAJfSwgeworCQkuY29tcGF0aWJsZSA9ICJyZW5lc2FzLGdwaW8tcjhhNzc5NiIsCisJCS8qIEdlbjMgR1BJTyBpcyBpZGVudGljYWwgdG8gR2VuMi4gKi8KKwkJLmRhdGEgPSAmZ3Bpb19yY2FyX2luZm9fZ2VuMiwKKwl9LCB7CiAJCS5jb21wYXRpYmxlID0gInJlbmVzYXMsZ3Bpby1yY2FyIiwKIAkJLmRhdGEgPSAmZ3Bpb19yY2FyX2luZm9fZ2VuMSwKIAl9LCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1zYTExMDAuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXNhMTEwMC5jCmluZGV4IDBjOTllOGYuLjhkOGVlMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXNhMTEwMC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXNhMTEwMC5jCkBAIC0xNTUsNyArMTU1LDcgQEAKIHsKIAlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmc2ExMTAwX2dwaW9faXJxX2NoaXAsCiAJCQkJIGhhbmRsZV9lZGdlX2lycSk7Ci0JaXJxX3NldF9ub3Byb2JlKGlycSk7CisJaXJxX3NldF9wcm9iZShpcnEpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1zY2guYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXNjaC5jCmluZGV4IGViNDNhZTQuLjU0NTAwNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXNjaC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXNjaC5jCkBAIC0xMzgsNyArMTM4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgc2NoX2dwaW9fY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHNjaF9ncGlvX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAic2NoX2dwaW8iLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLmRpcmVjdGlvbl9pbnB1dAk9IHNjaF9ncGlvX2RpcmVjdGlvbl9pbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXNwZWFyLXNwaWNzLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1zcGVhci1zcGljcy5jCmluZGV4IDdmZmQxNjQuLjIyMjY3NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXNwZWFyLXNwaWNzLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tc3BlYXItc3BpY3MuYwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC0xODMsNyArMTgzLDYgQEAKIAl7IC5jb21wYXRpYmxlID0gInN0LHNwZWFyLXNwaWNzLWdwaW8iIH0sCiAJe30KIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzcGljc19ncGlvX29mX21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3BpY3NfZ3Bpb19kcml2ZXIgPSB7CiAJLnByb2JlID0gc3BpY3NfZ3Bpb19wcm9iZSwKQEAgLTE5OCw3ICsxOTcsMyBAQAogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNwaWNzX2dwaW9fZHJpdmVyKTsKIH0KIHN1YnN5c19pbml0Y2FsbChzcGljc19ncGlvX2luaXQpOwotCi1NT0RVTEVfQVVUSE9SKCJTaGlyYXogSGFzaGltIDxzaGlyYXoubGludXgua2VybmVsQGdtYWlsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU1RNaWNyb2VsZWN0cm9uaWNzIFNQRUFyIFNQSSBDaGlwIFNlbGVjdCBBYnN0cmFjdGlvbiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tc3RtcGUuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXN0bXBlLmMKaW5kZXggZjY3NTEzMi4uZTdkNDIyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tc3RtcGUuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1zdG1wZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc3RtcGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCiAvKgogICogVGhlc2UgcmVnaXN0ZXJzIGFyZSBtb2RpZmllZCB1bmRlciB0aGUgaXJxIGJ1cyBsb2NrIGFuZCBjYWNoZWQgdG8gYXZvaWQKQEAgLTIwLDYgKzIxLDggQEAKICAqLwogZW51bSB7IFJFR19SRSwgUkVHX0ZFLCBSRUdfSUUgfTsKIAorZW51bSB7IExTQiwgQ1NCLCBNU0IgfTsKKwogI2RlZmluZSBDQUNIRV9OUl9SRUdTCTMKIC8qIE5vIHZhcmlhbnQgaGFzIG1vcmUgdGhhbiAyNCBHUElPcyAqLwogI2RlZmluZSBDQUNIRV9OUl9CQU5LUwkoMjQgLyA4KQpAQCAtMzksOCArNDIsOCBAQAogewogCXN0cnVjdCBzdG1wZV9ncGlvICpzdG1wZV9ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CiAJc3RydWN0IHN0bXBlICpzdG1wZSA9IHN0bXBlX2dwaW8tPnN0bXBlOwotCXU4IHJlZyA9IHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9HUE1SX0xTQl0gLSAob2Zmc2V0IC8gOCk7Ci0JdTggbWFzayA9IDEgPDwgKG9mZnNldCAlIDgpOworCXU4IHJlZyA9IHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9HUE1SX0xTQiArIChvZmZzZXQgLyA4KV07CisJdTggbWFzayA9IEJJVChvZmZzZXQgJSA4KTsKIAlpbnQgcmV0OwogCiAJcmV0ID0gc3RtcGVfcmVnX3JlYWQoc3RtcGUsIHJlZyk7CkBAIC01NSw4ICs1OCw4IEBACiAJc3RydWN0IHN0bXBlX2dwaW8gKnN0bXBlX2dwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAlzdHJ1Y3Qgc3RtcGUgKnN0bXBlID0gc3RtcGVfZ3Bpby0+c3RtcGU7CiAJaW50IHdoaWNoID0gdmFsID8gU1RNUEVfSURYX0dQU1JfTFNCIDogU1RNUEVfSURYX0dQQ1JfTFNCOwotCXU4IHJlZyA9IHN0bXBlLT5yZWdzW3doaWNoXSAtIChvZmZzZXQgLyA4KTsKLQl1OCBtYXNrID0gMSA8PCAob2Zmc2V0ICUgOCk7CisJdTggcmVnID0gc3RtcGUtPnJlZ3Nbd2hpY2ggKyAob2Zmc2V0IC8gOCldOworCXU4IG1hc2sgPSBCSVQob2Zmc2V0ICUgOCk7CiAKIAkvKgogCSAqIFNvbWUgdmFyaWFudHMgaGF2ZSBzaW5nbGUgcmVnaXN0ZXIgZm9yIGdwaW8gc2V0L2NsZWFyIGZ1bmN0aW9uYWxpdHkuCkBAIC03NCw3ICs3Nyw3IEBACiAJc3RydWN0IHN0bXBlX2dwaW8gKnN0bXBlX2dwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAlzdHJ1Y3Qgc3RtcGUgKnN0bXBlID0gc3RtcGVfZ3Bpby0+c3RtcGU7CiAJdTggcmVnID0gc3RtcGUtPnJlZ3NbU1RNUEVfSURYX0dQRFJfTFNCXSAtIChvZmZzZXQgLyA4KTsKLQl1OCBtYXNrID0gMSA8PCAob2Zmc2V0ICUgOCk7CisJdTggbWFzayA9IEJJVChvZmZzZXQgJSA4KTsKIAlpbnQgcmV0OwogCiAJcmV0ID0gc3RtcGVfcmVnX3JlYWQoc3RtcGUsIHJlZyk7CkBAIC04OSw4ICs5Miw4IEBACiB7CiAJc3RydWN0IHN0bXBlX2dwaW8gKnN0bXBlX2dwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAlzdHJ1Y3Qgc3RtcGUgKnN0bXBlID0gc3RtcGVfZ3Bpby0+c3RtcGU7Ci0JdTggcmVnID0gc3RtcGUtPnJlZ3NbU1RNUEVfSURYX0dQRFJfTFNCXSAtIChvZmZzZXQgLyA4KTsKLQl1OCBtYXNrID0gMSA8PCAob2Zmc2V0ICUgOCk7CisJdTggcmVnID0gc3RtcGUtPnJlZ3NbU1RNUEVfSURYX0dQRFJfTFNCICsgKG9mZnNldCAvIDgpXTsKKwl1OCBtYXNrID0gQklUKG9mZnNldCAlIDgpOwogCiAJc3RtcGVfZ3Bpb19zZXQoY2hpcCwgb2Zmc2V0LCB2YWwpOwogCkBAIC0xMDIsOCArMTA1LDggQEAKIHsKIAlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXN0cnVjdCBzdG1wZSAqc3RtcGUgPSBzdG1wZV9ncGlvLT5zdG1wZTsKLQl1OCByZWcgPSBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BEUl9MU0JdIC0gKG9mZnNldCAvIDgpOwotCXU4IG1hc2sgPSAxIDw8IChvZmZzZXQgJSA4KTsKKwl1OCByZWcgPSBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BEUl9MU0IgKyAob2Zmc2V0IC8gOCldOworCXU4IG1hc2sgPSBCSVQob2Zmc2V0ICUgOCk7CiAKIAlyZXR1cm4gc3RtcGVfc2V0X2JpdHMoc3RtcGUsIHJlZywgbWFzaywgMCk7CiB9CkBAIC0xMTMsMTMgKzExNiwxMyBAQAogCXN0cnVjdCBzdG1wZV9ncGlvICpzdG1wZV9ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CiAJc3RydWN0IHN0bXBlICpzdG1wZSA9IHN0bXBlX2dwaW8tPnN0bXBlOwogCi0JaWYgKHN0bXBlX2dwaW8tPm5vcmVxdWVzdF9tYXNrICYgKDEgPDwgb2Zmc2V0KSkKKwlpZiAoc3RtcGVfZ3Bpby0+bm9yZXF1ZXN0X21hc2sgJiBCSVQob2Zmc2V0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gc3RtcGVfc2V0X2FsdGZ1bmMoc3RtcGUsIDEgPDwgb2Zmc2V0LCBTVE1QRV9CTE9DS19HUElPKTsKKwlyZXR1cm4gc3RtcGVfc2V0X2FsdGZ1bmMoc3RtcGUsIEJJVChvZmZzZXQpLCBTVE1QRV9CTE9DS19HUElPKTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAic3RtcGUiLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLmdldF9kaXJlY3Rpb24JCT0gc3RtcGVfZ3Bpb19nZXRfZGlyZWN0aW9uLApAQCAtMTM3LDEzICsxNDAsMTQgQEAKIAlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKIAlpbnQgb2Zmc2V0ID0gZC0+aHdpcnE7CiAJaW50IHJlZ29mZnNldCA9IG9mZnNldCAvIDg7Ci0JaW50IG1hc2sgPSAxIDw8IChvZmZzZXQgJSA4KTsKKwlpbnQgbWFzayA9IEJJVChvZmZzZXQgJSA4KTsKIAogCWlmICh0eXBlICYgSVJRX1RZUEVfTEVWRUxfTE9XIHx8IHR5cGUgJiBJUlFfVFlQRV9MRVZFTF9ISUdIKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIFNUTVBFODAxIGRvZXNuJ3QgaGF2ZSBSRSBhbmQgRkUgcmVnaXN0ZXJzICovCi0JaWYgKHN0bXBlX2dwaW8tPnN0bXBlLT5wYXJ0bnVtID09IFNUTVBFODAxKQorCS8qIFNUTVBFODAxIGFuZCBTVE1QRSAxNjAwIGRvbid0IGhhdmUgUkUgYW5kIEZFIHJlZ2lzdGVycyAqLworCWlmIChzdG1wZV9ncGlvLT5zdG1wZS0+cGFydG51bSA9PSBTVE1QRTgwMSB8fAorCSAgICBzdG1wZV9ncGlvLT5zdG1wZS0+cGFydG51bSA9PSBTVE1QRTE2MDApCiAJCXJldHVybiAwOwogCiAJaWYgKHR5cGUgJiBJUlFfVFlQRV9FREdFX1JJU0lORykKQEAgLTE3MywxNyArMTc3LDI0IEBACiAJc3RydWN0IHN0bXBlX2dwaW8gKnN0bXBlX2dwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CiAJc3RydWN0IHN0bXBlICpzdG1wZSA9IHN0bXBlX2dwaW8tPnN0bXBlOwogCWludCBudW1fYmFua3MgPSBESVZfUk9VTkRfVVAoc3RtcGUtPm51bV9ncGlvcywgOCk7Ci0Jc3RhdGljIGNvbnN0IHU4IHJlZ21hcFtdID0gewotCQlbUkVHX1JFXQk9IFNUTVBFX0lEWF9HUFJFUl9MU0IsCi0JCVtSRUdfRkVdCT0gU1RNUEVfSURYX0dQRkVSX0xTQiwKLQkJW1JFR19JRV0JPSBTVE1QRV9JRFhfSUVHUElPUl9MU0IsCisJc3RhdGljIGNvbnN0IHU4IHJlZ21hcFtDQUNIRV9OUl9SRUdTXVtDQUNIRV9OUl9CQU5LU10gPSB7CisJCVtSRUdfUkVdW0xTQl0gPSBTVE1QRV9JRFhfR1BSRVJfTFNCLAorCQlbUkVHX1JFXVtDU0JdID0gU1RNUEVfSURYX0dQUkVSX0NTQiwKKwkJW1JFR19SRV1bTVNCXSA9IFNUTVBFX0lEWF9HUFJFUl9NU0IsCisJCVtSRUdfRkVdW0xTQl0gPSBTVE1QRV9JRFhfR1BGRVJfTFNCLAorCQlbUkVHX0ZFXVtDU0JdID0gU1RNUEVfSURYX0dQRkVSX0NTQiwKKwkJW1JFR19GRV1bTVNCXSA9IFNUTVBFX0lEWF9HUEZFUl9NU0IsCisJCVtSRUdfSUVdW0xTQl0gPSBTVE1QRV9JRFhfSUVHUElPUl9MU0IsCisJCVtSRUdfSUVdW0NTQl0gPSBTVE1QRV9JRFhfSUVHUElPUl9DU0IsCisJCVtSRUdfSUVdW01TQl0gPSBTVE1QRV9JRFhfSUVHUElPUl9NU0IsCiAJfTsKIAlpbnQgaSwgajsKIAogCWZvciAoaSA9IDA7IGkgPCBDQUNIRV9OUl9SRUdTOyBpKyspIHsKLQkJLyogU1RNUEU4MDEgZG9lc24ndCBoYXZlIFJFIGFuZCBGRSByZWdpc3RlcnMgKi8KLQkJaWYgKChzdG1wZS0+cGFydG51bSA9PSBTVE1QRTgwMSkgJiYKLQkJCQkoaSAhPSBSRUdfSUUpKQorCQkvKiBTVE1QRTgwMSBhbmQgU1RNUEUxNjAwIGRvbid0IGhhdmUgUkUgYW5kIEZFIHJlZ2lzdGVycyAqLworCQlpZiAoKHN0bXBlLT5wYXJ0bnVtID09IFNUTVBFODAxIHx8CisJCSAgICAgc3RtcGUtPnBhcnRudW0gPT0gU1RNUEUxNjAwKSAmJgorCQkgICAgIChpICE9IFJFR19JRSkpCiAJCQljb250aW51ZTsKIAogCQlmb3IgKGogPSAwOyBqIDwgbnVtX2JhbmtzOyBqKyspIHsKQEAgLTE5NCw3ICsyMDUsNyBAQAogCQkJCWNvbnRpbnVlOwogCiAJCQlzdG1wZV9ncGlvLT5vbGRyZWdzW2ldW2pdID0gbmV3OwotCQkJc3RtcGVfcmVnX3dyaXRlKHN0bXBlLCBzdG1wZS0+cmVnc1tyZWdtYXBbaV1dIC0gaiwgbmV3KTsKKwkJCXN0bXBlX3JlZ193cml0ZShzdG1wZSwgc3RtcGUtPnJlZ3NbcmVnbWFwW2ldW2pdXSwgbmV3KTsKIAkJfQogCX0KIApAQCAtMjA3LDcgKzIxOCw3IEBACiAJc3RydWN0IHN0bXBlX2dwaW8gKnN0bXBlX2dwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CiAJaW50IG9mZnNldCA9IGQtPmh3aXJxOwogCWludCByZWdvZmZzZXQgPSBvZmZzZXQgLyA4OwotCWludCBtYXNrID0gMSA8PCAob2Zmc2V0ICUgOCk7CisJaW50IG1hc2sgPSBCSVQob2Zmc2V0ICUgOCk7CiAKIAlzdG1wZV9ncGlvLT5yZWdzW1JFR19JRV1bcmVnb2Zmc2V0XSAmPSB+bWFzazsKIH0KQEAgLTIxNiwxMSArMjI3LDIxIEBACiB7CiAJc3RydWN0IGdwaW9fY2hpcCAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKIAlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKKwlzdHJ1Y3Qgc3RtcGUgKnN0bXBlID0gc3RtcGVfZ3Bpby0+c3RtcGU7CiAJaW50IG9mZnNldCA9IGQtPmh3aXJxOwogCWludCByZWdvZmZzZXQgPSBvZmZzZXQgLyA4OwotCWludCBtYXNrID0gMSA8PCAob2Zmc2V0ICUgOCk7CisJaW50IG1hc2sgPSBCSVQob2Zmc2V0ICUgOCk7CiAKIAlzdG1wZV9ncGlvLT5yZWdzW1JFR19JRV1bcmVnb2Zmc2V0XSB8PSBtYXNrOworCisJLyoKKwkgKiBTVE1QRTE2MDAgd29ya2Fyb3VuZDogdG8gYmUgYWJsZSB0byBnZXQgSVJRIGZyb20gcGlucywKKwkgKiBhIHJlYWQgbXVzdCBiZSBkb25lIG9uIEdQTVIgcmVnaXN0ZXIsIG9yIGEgd3JpdGUgaW4KKwkgKiBHUFNSIG9yIEdQQ1IgcmVnaXN0ZXJzCisJICovCisJaWYgKHN0bXBlLT5wYXJ0bnVtID09IFNUTVBFMTYwMCkKKwkJc3RtcGVfcmVnX3JlYWQoc3RtcGUsCisJCQkgICAgICAgc3RtcGUtPnJlZ3NbU1RNUEVfSURYX0dQTVJfTFNCICsgcmVnb2Zmc2V0XSk7CiB9CiAKIHN0YXRpYyB2b2lkIHN0bXBlX2RiZ19zaG93X29uZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCkBAIC0yMzAsMTAgKzI1MSwxMCBAQAogCXN0cnVjdCBzdG1wZV9ncGlvICpzdG1wZV9ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOwogCXN0cnVjdCBzdG1wZSAqc3RtcGUgPSBzdG1wZV9ncGlvLT5zdG1wZTsKIAljb25zdCBjaGFyICpsYWJlbCA9IGdwaW9jaGlwX2lzX3JlcXVlc3RlZChnYywgb2Zmc2V0KTsKLQlpbnQgbnVtX2JhbmtzID0gRElWX1JPVU5EX1VQKHN0bXBlLT5udW1fZ3Bpb3MsIDgpOwogCWJvb2wgdmFsID0gISFzdG1wZV9ncGlvX2dldChnYywgb2Zmc2V0KTsKLQl1OCBkaXJfcmVnID0gc3RtcGUtPnJlZ3NbU1RNUEVfSURYX0dQRFJfTFNCXSAtIChvZmZzZXQgLyA4KTsKLQl1OCBtYXNrID0gMSA8PCAob2Zmc2V0ICUgOCk7CisJdTggYmFuayA9IG9mZnNldCAvIDg7CisJdTggZGlyX3JlZyA9IHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9HUERSX0xTQiArIGJhbmtdOworCXU4IG1hc2sgPSBCSVQob2Zmc2V0ICUgOCk7CiAJaW50IHJldDsKIAl1OCBkaXI7CiAKQEAgLTI0NywzOSArMjY4LDcyIEBACiAJCQkgICBncGlvLCBsYWJlbCA/OiAiKG5vbmUpIiwKIAkJCSAgIHZhbCA/ICJoaSIgOiAibG8iKTsKIAl9IGVsc2UgewotCQl1OCBlZGdlX2RldF9yZWcgPSBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BFRFJfTVNCXSArIG51bV9iYW5rcyAtIDEgLSAob2Zmc2V0IC8gOCk7Ci0JCXU4IHJpc2VfcmVnID0gc3RtcGUtPnJlZ3NbU1RNUEVfSURYX0dQUkVSX0xTQl0gLSAob2Zmc2V0IC8gOCk7Ci0JCXU4IGZhbGxfcmVnID0gc3RtcGUtPnJlZ3NbU1RNUEVfSURYX0dQRkVSX0xTQl0gLSAob2Zmc2V0IC8gOCk7Ci0JCXU4IGlycWVuX3JlZyA9IHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9JRUdQSU9SX0xTQl0gLSAob2Zmc2V0IC8gOCk7Ci0JCWJvb2wgZWRnZV9kZXQ7Ci0JCWJvb2wgcmlzZTsKLQkJYm9vbCBmYWxsOworCQl1OCBlZGdlX2RldF9yZWc7CisJCXU4IHJpc2VfcmVnOworCQl1OCBmYWxsX3JlZzsKKwkJdTggaXJxZW5fcmVnOworCisJCWNoYXIgKmVkZ2VfZGV0X3ZhbHVlc1tdID0geyJlZGdlLWluYWN0aXZlIiwKKwkJCQkJICAgImVkZ2UtYXNzZXJ0ZWQiLAorCQkJCQkgICAibm90LXN1cHBvcnRlZCJ9OworCQljaGFyICpyaXNlX3ZhbHVlc1tdID0geyJuby1yaXNpbmctZWRnZS1kZXRlY3Rpb24iLAorCQkJCSAgICAgICAicmlzaW5nLWVkZ2UtZGV0ZWN0aW9uIiwKKwkJCQkgICAgICAgIm5vdC1zdXBwb3J0ZWQifTsKKwkJY2hhciAqZmFsbF92YWx1ZXNbXSA9IHsibm8tZmFsbGluZy1lZGdlLWRldGVjdGlvbiIsCisJCQkJICAgICAgICJmYWxsaW5nLWVkZ2UtZGV0ZWN0aW9uIiwKKwkJCQkgICAgICAgIm5vdC1zdXBwb3J0ZWQifTsKKwkJI2RlZmluZSBOT1RfU1VQUE9SVEVEX0lEWCAyCisJCXU4IGVkZ2VfZGV0ID0gTk9UX1NVUFBPUlRFRF9JRFg7CisJCXU4IHJpc2UgPSBOT1RfU1VQUE9SVEVEX0lEWDsKKwkJdTggZmFsbCA9IE5PVF9TVVBQT1JURURfSURYOwogCQlib29sIGlycWVuOwogCi0JCXJldCA9IHN0bXBlX3JlZ19yZWFkKHN0bXBlLCBlZGdlX2RldF9yZWcpOwotCQlpZiAocmV0IDwgMCkKKwkJc3dpdGNoIChzdG1wZS0+cGFydG51bSkgeworCQljYXNlIFNUTVBFNjEwOgorCQljYXNlIFNUTVBFODExOgorCQljYXNlIFNUTVBFMTYwMToKKwkJY2FzZSBTVE1QRTI0MDE6CisJCWNhc2UgU1RNUEUyNDAzOgorCQkJZWRnZV9kZXRfcmVnID0gc3RtcGUtPnJlZ3NbU1RNUEVfSURYX0dQRURSX0xTQiArIGJhbmtdOworCQkJcmV0ID0gc3RtcGVfcmVnX3JlYWQoc3RtcGUsIGVkZ2VfZGV0X3JlZyk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm47CisJCQllZGdlX2RldCA9ICEhKHJldCAmIG1hc2spOworCisJCWNhc2UgU1RNUEUxODAxOgorCQkJcmlzZV9yZWcgPSBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BSRVJfTFNCICsgYmFua107CisJCQlmYWxsX3JlZyA9IHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9HUEZFUl9MU0IgKyBiYW5rXTsKKworCQkJcmV0ID0gc3RtcGVfcmVnX3JlYWQoc3RtcGUsIHJpc2VfcmVnKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybjsKKwkJCXJpc2UgPSAhIShyZXQgJiBtYXNrKTsKKwkJCXJldCA9IHN0bXBlX3JlZ19yZWFkKHN0bXBlLCBmYWxsX3JlZyk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm47CisJCQlmYWxsID0gISEocmV0ICYgbWFzayk7CisKKwkJY2FzZSBTVE1QRTgwMToKKwkJY2FzZSBTVE1QRTE2MDA6CisJCQlpcnFlbl9yZWcgPSBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfSUVHUElPUl9MU0IgKyBiYW5rXTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CiAJCQlyZXR1cm47Ci0JCWVkZ2VfZGV0ID0gISEocmV0ICYgbWFzayk7Ci0JCXJldCA9IHN0bXBlX3JlZ19yZWFkKHN0bXBlLCByaXNlX3JlZyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuOwotCQlyaXNlID0gISEocmV0ICYgbWFzayk7Ci0JCXJldCA9IHN0bXBlX3JlZ19yZWFkKHN0bXBlLCBmYWxsX3JlZyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuOwotCQlmYWxsID0gISEocmV0ICYgbWFzayk7CisJCX0KKwogCQlyZXQgPSBzdG1wZV9yZWdfcmVhZChzdG1wZSwgaXJxZW5fcmVnKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm47CiAJCWlycWVuID0gISEocmV0ICYgbWFzayk7CiAKLQkJc2VxX3ByaW50ZihzLCAiIGdwaW8tJS0zZCAoJS0yMC4yMHMpIGluICAlcyAlcyAlcyVzJXMiLAorCQlzZXFfcHJpbnRmKHMsICIgZ3Bpby0lLTNkICglLTIwLjIwcykgaW4gICVzICUxM3MgJTEzcyAlMjVzICUyNXMiLAogCQkJICAgZ3BpbywgbGFiZWwgPzogIihub25lKSIsCiAJCQkgICB2YWwgPyAiaGkiIDogImxvIiwKLQkJCSAgIGVkZ2VfZGV0ID8gImVkZ2UtYXNzZXJ0ZWQiIDogImVkZ2UtaW5hY3RpdmUiLAotCQkJICAgaXJxZW4gPyAiSVJRLWVuYWJsZWQiIDogIiIsCi0JCQkgICByaXNlID8gIiByaXNpbmctZWRnZS1kZXRlY3Rpb24iIDogIiIsCi0JCQkgICBmYWxsID8gIiBmYWxsaW5nLWVkZ2UtZGV0ZWN0aW9uIiA6ICIiKTsKKwkJCSAgIGVkZ2VfZGV0X3ZhbHVlc1tlZGdlX2RldF0sCisJCQkgICBpcnFlbiA/ICJJUlEtZW5hYmxlZCIgOiAiSVJRLWRpc2FibGVkIiwKKwkJCSAgIHJpc2VfdmFsdWVzW3Jpc2VdLAorCQkJICAgZmFsbF92YWx1ZXNbZmFsbF0pOwogCX0KIH0KIApAQCAtMzA3LDE4ICszNjEsMzIgQEAKIHsKIAlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGRldjsKIAlzdHJ1Y3Qgc3RtcGUgKnN0bXBlID0gc3RtcGVfZ3Bpby0+c3RtcGU7Ci0JdTggc3RhdG1zYnJlZyA9IHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9JU0dQSU9SX01TQl07CisJdTggc3RhdG1zYnJlZzsKIAlpbnQgbnVtX2JhbmtzID0gRElWX1JPVU5EX1VQKHN0bXBlLT5udW1fZ3Bpb3MsIDgpOwogCXU4IHN0YXR1c1tudW1fYmFua3NdOwogCWludCByZXQ7CiAJaW50IGk7CiAKKwkvKgorCSAqIHRoZSBzdG1wZV9ibG9ja19yZWFkKCkgY2FsbCBiZWxvdywgaW1wb3NlcyB0byBzZXQgc3RhdG1zYnJlZworCSAqIHdpdGggdGhlIHJlZ2lzdGVyIGxvY2F0ZWQgYXQgdGhlIGxvd2VzdCBhZGRyZXNzLiBBcyBTVE1QRTE2MDAKKwkgKiB2YXJpYW50IGlzIHRoZSBvbmx5IG9uZSB3aGljaCByZXNwZWN0IHJlZ2lzdGVycyBhZGRyZXNzJ3Mgb3JkZXIKKwkgKiAoTFNCIHJlZ3MgbG9jYXRlZCBhdCBsb3dlc3QgYWRkcmVzcyB0aGFuIE1TQiBvbmVzKSB3aGVyZWFzIGFsbAorCSAqIHRoZSBvdGhlcnMgaGF2ZSBhIHJlZ2lzdGVycyBsYXlvdXQgd2l0aCBNU0IgbG9jYXRlZCBiZWZvcmUgdGhlCisJICogTFNCIHJlZ3MuCisJICovCisJaWYgKHN0bXBlLT5wYXJ0bnVtID09IFNUTVBFMTYwMCkKKwkJc3RhdG1zYnJlZyA9IHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9JU0dQSU9SX0xTQl07CisJZWxzZQorCQlzdGF0bXNicmVnID0gc3RtcGUtPnJlZ3NbU1RNUEVfSURYX0lTR1BJT1JfTVNCXTsKKwogCXJldCA9IHN0bXBlX2Jsb2NrX3JlYWQoc3RtcGUsIHN0YXRtc2JyZWcsIG51bV9iYW5rcywgc3RhdHVzKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIElSUV9OT05FOwogCiAJZm9yIChpID0gMDsgaSA8IG51bV9iYW5rczsgaSsrKSB7Ci0JCWludCBiYW5rID0gbnVtX2JhbmtzIC0gaSAtIDE7CisJCWludCBiYW5rID0gKHN0bXBlX2dwaW8tPnN0bXBlLT5wYXJ0bnVtID09IFNUTVBFMTYwMCkgPyBpIDoKKwkJCSAgIG51bV9iYW5rcyAtIGkgLSAxOwogCQl1bnNpZ25lZCBpbnQgZW5hYmxlZCA9IHN0bXBlX2dwaW8tPnJlZ3NbUkVHX0lFXVtiYW5rXTsKIAkJdW5zaWduZWQgaW50IHN0YXQgPSBzdGF0dXNbaV07CiAKQEAgLTMzMywxNSArNDAxLDIxIEBACiAJCQkJCQkJIGxpbmUpOwogCiAJCQloYW5kbGVfbmVzdGVkX2lycShjaGlsZF9pcnEpOwotCQkJc3RhdCAmPSB+KDEgPDwgYml0KTsKKwkJCXN0YXQgJj0gfkJJVChiaXQpOwogCQl9CiAKLQkJc3RtcGVfcmVnX3dyaXRlKHN0bXBlLCBzdGF0bXNicmVnICsgaSwgc3RhdHVzW2ldKTsKLQotCQkvKiBFZGdlIGRldGVjdCByZWdpc3RlciBpcyBub3QgcHJlc2VudCBvbiA4MDEgKi8KLQkJaWYgKHN0bXBlLT5wYXJ0bnVtICE9IFNUTVBFODAxKQotCQkJc3RtcGVfcmVnX3dyaXRlKHN0bXBlLCBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BFRFJfTVNCXQotCQkJCQkrIGksIHN0YXR1c1tpXSk7CisJCS8qCisJCSAqIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgd3JpdGUgaGFzIG5vIGVmZmVjdCBvbgorCQkgKiA4MDEvMTgwMS8xNjAwLCBiaXRzIGFyZSBjbGVhcmVkIHdoZW4gcmVhZC4KKwkJICogRWRnZSBkZXRlY3QgcmVnaXN0ZXIgaXMgbm90IHByZXNlbnQgb24gODAxLzE2MDAvMTgwMQorCQkgKi8KKwkJaWYgKHN0bXBlLT5wYXJ0bnVtICE9IFNUTVBFODAxIHx8IHN0bXBlLT5wYXJ0bnVtICE9IFNUTVBFMTYwMCB8fAorCQkgICAgc3RtcGUtPnBhcnRudW0gIT0gU1RNUEUxODAxKSB7CisJCQlzdG1wZV9yZWdfd3JpdGUoc3RtcGUsIHN0YXRtc2JyZWcgKyBpLCBzdGF0dXNbaV0pOworCQkJc3RtcGVfcmVnX3dyaXRlKHN0bXBlLAorCQkJCQlzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BFRFJfTFNCICsgaV0sCisJCQkJCXN0YXR1c1tpXSk7CisJCX0KIAl9CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0zNzYsNiArNDUwLDggQEAKIAogCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAic3Qsbm9yZXF1ZXN0LW1hc2siLAogCQkJJnN0bXBlX2dwaW8tPm5vcmVxdWVzdF9tYXNrKTsKKwlpZiAoc3RtcGVfZ3Bpby0+bm9yZXF1ZXN0X21hc2spCisJCXN0bXBlX2dwaW8tPmNoaXAuaXJxX25lZWRfdmFsaWRfbWFzayA9IHRydWU7CiAKIAlpZiAoaXJxIDwgMCkKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwKQEAgLTQwMCw2ICs0NzYsMTQgQEAKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgaXJxOiAlZFxuIiwgcmV0KTsKIAkJCWdvdG8gb3V0X2Rpc2FibGU7CiAJCX0KKwkJaWYgKHN0bXBlX2dwaW8tPm5vcmVxdWVzdF9tYXNrKSB7CisJCQlpbnQgaTsKKworCQkJLyogRm9yYmlkIHVudXNlZCBsaW5lcyB0byBiZSBtYXBwZWQgYXMgSVJRcyAqLworCQkJZm9yIChpID0gMDsgaSA8IHNpemVvZih1MzIpOyBpKyspCisJCQkJaWYgKHN0bXBlX2dwaW8tPm5vcmVxdWVzdF9tYXNrICYgQklUKGkpKQorCQkJCQljbGVhcl9iaXQoaSwgc3RtcGVfZ3Bpby0+Y2hpcC5pcnFfdmFsaWRfbWFzayk7CisJCX0KIAkJcmV0ID0gIGdwaW9jaGlwX2lycWNoaXBfYWRkKCZzdG1wZV9ncGlvLT5jaGlwLAogCQkJCQkgICAgJnN0bXBlX2dwaW9faXJxX2NoaXAsCiAJCQkJCSAgICAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tc3gxNTB4LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1zeDE1MHguYwppbmRleCBhMTc3ZWJkLi5hZjk1ZGU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1zeDE1MHguYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1zeDE1MHguYwpAQCAtMjM2LDcgKzIzNiw2IEBACiAJeyJzeDE1MDJxIiwgM30sCiAJe30KIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgc3gxNTB4X2lkKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3gxNTB4X29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJzZW10ZWNoLHN4MTUwOHEiIH0sCkBAIC0yNDUsNyArMjQ0LDYgQEAKIAl7IC5jb21wYXRpYmxlID0gInNlbXRlY2gsc3gxNTAycSIgfSwKIAl7fSwKIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzeDE1MHhfb2ZfbWF0Y2gpOwogCiBzdGF0aWMgczMyIHN4MTUweF9pMmNfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWwpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby10YzM1ODl4LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby10YzM1ODl4LmMKaW5kZXggOGIzNjU5My4uNWE1YTZjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tdGMzNTg5eC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRjMzU4OXguYwpAQCAtMzQsNyArMzQsNyBAQAogCXU4IG9sZHJlZ3NbQ0FDSEVfTlJfUkVHU11bQ0FDSEVfTlJfQkFOS1NdOwogfTsKIAotc3RhdGljIGludCB0YzM1ODl4X2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3N0YXRpYyBpbnQgdGMzNTg5eF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQogewogCXN0cnVjdCB0YzM1ODl4X2dwaW8gKnRjMzU4OXhfZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXN0cnVjdCB0YzM1ODl4ICp0YzM1ODl4ID0gdGMzNTg5eF9ncGlvLT50YzM1ODl4OwpAQCAtNDksMjQgKzQ5LDI0IEBACiAJcmV0dXJuICEhKHJldCAmIG1hc2spOwogfQogCi1zdGF0aWMgdm9pZCB0YzM1ODl4X2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbCkKK3N0YXRpYyB2b2lkIHRjMzU4OXhfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCwgaW50IHZhbCkKIHsKIAlzdHJ1Y3QgdGMzNTg5eF9ncGlvICp0YzM1ODl4X2dwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAlzdHJ1Y3QgdGMzNTg5eCAqdGMzNTg5eCA9IHRjMzU4OXhfZ3Bpby0+dGMzNTg5eDsKIAl1OCByZWcgPSBUQzM1ODl4X0dQSU9EQVRBMCArIChvZmZzZXQgLyA4KSAqIDI7Ci0JdW5zaWduZWQgcG9zID0gb2Zmc2V0ICUgODsKKwl1bnNpZ25lZCBpbnQgcG9zID0gb2Zmc2V0ICUgODsKIAl1OCBkYXRhW10gPSB7dmFsID8gQklUKHBvcykgOiAwLCBCSVQocG9zKX07CiAKIAl0YzM1ODl4X2Jsb2NrX3dyaXRlKHRjMzU4OXgsIHJlZywgQVJSQVlfU0laRShkYXRhKSwgZGF0YSk7CiB9CiAKIHN0YXRpYyBpbnQgdGMzNTg5eF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQkJCQkJIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbCkKKwkJCQkJIHVuc2lnbmVkIGludCBvZmZzZXQsIGludCB2YWwpCiB7CiAJc3RydWN0IHRjMzU4OXhfZ3BpbyAqdGMzNTg5eF9ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CiAJc3RydWN0IHRjMzU4OXggKnRjMzU4OXggPSB0YzM1ODl4X2dwaW8tPnRjMzU4OXg7CiAJdTggcmVnID0gVEMzNTg5eF9HUElPRElSMCArIG9mZnNldCAvIDg7Ci0JdW5zaWduZWQgcG9zID0gb2Zmc2V0ICUgODsKKwl1bnNpZ25lZCBpbnQgcG9zID0gb2Zmc2V0ICUgODsKIAogCXRjMzU4OXhfZ3Bpb19zZXQoY2hpcCwgb2Zmc2V0LCB2YWwpOwogCkBAIC03NCwxOSArNzQsMzUgQEAKIH0KIAogc3RhdGljIGludCB0YzM1ODl4X2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQkJCXVuc2lnbmVkIG9mZnNldCkKKwkJCQkJdW5zaWduZWQgaW50IG9mZnNldCkKIHsKIAlzdHJ1Y3QgdGMzNTg5eF9ncGlvICp0YzM1ODl4X2dwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAlzdHJ1Y3QgdGMzNTg5eCAqdGMzNTg5eCA9IHRjMzU4OXhfZ3Bpby0+dGMzNTg5eDsKIAl1OCByZWcgPSBUQzM1ODl4X0dQSU9ESVIwICsgb2Zmc2V0IC8gODsKLQl1bnNpZ25lZCBwb3MgPSBvZmZzZXQgJSA4OworCXVuc2lnbmVkIGludCBwb3MgPSBvZmZzZXQgJSA4OwogCiAJcmV0dXJuIHRjMzU4OXhfc2V0X2JpdHModGMzNTg5eCwgcmVnLCBCSVQocG9zKSwgMCk7CiB9CiAKLXN0YXRpYyBpbnQgdGMzNTg5eF9ncGlvX3NpbmdsZV9lbmRlZChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCQkJCSAgICAgdW5zaWduZWQgb2Zmc2V0LAotCQkJCSAgICAgZW51bSBzaW5nbGVfZW5kZWRfbW9kZSBtb2RlKQorc3RhdGljIGludCB0YzM1ODl4X2dwaW9fZ2V0X2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IHRjMzU4OXhfZ3BpbyAqdGMzNTg5eF9ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJc3RydWN0IHRjMzU4OXggKnRjMzU4OXggPSB0YzM1ODl4X2dwaW8tPnRjMzU4OXg7CisJdTggcmVnID0gVEMzNTg5eF9HUElPRElSMCArIG9mZnNldCAvIDg7CisJdW5zaWduZWQgaW50IHBvcyA9IG9mZnNldCAlIDg7CisJaW50IHJldDsKKworCXJldCA9IHRjMzU4OXhfcmVnX3JlYWQodGMzNTg5eCwgcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAhIShyZXQgJiBCSVQocG9zKSk7Cit9CisKK3N0YXRpYyBpbnQgdGMzNTg5eF9ncGlvX3NldF9zaW5nbGVfZW5kZWQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkJIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCQkJCSBlbnVtIHNpbmdsZV9lbmRlZF9tb2RlIG1vZGUpCiB7CiAJc3RydWN0IHRjMzU4OXhfZ3BpbyAqdGMzNTg5eF9ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CiAJc3RydWN0IHRjMzU4OXggKnRjMzU4OXggPSB0YzM1ODl4X2dwaW8tPnRjMzU4OXg7CkBAIC05Nyw3ICsxMTMsNyBAQAogCSAqLwogCXU4IG9kbXJlZyA9IFRDMzU4OXhfR1BJT09ETTAgKyAob2Zmc2V0IC8gOCkgKiAyOwogCXU4IG9kZXJlZyA9IFRDMzU4OXhfR1BJT09ERTAgKyAob2Zmc2V0IC8gOCkgKiAyOwotCXVuc2lnbmVkIHBvcyA9IG9mZnNldCAlIDg7CisJdW5zaWduZWQgaW50IHBvcyA9IG9mZnNldCAlIDg7CiAJaW50IHJldDsKIAogCXN3aXRjaChtb2RlKSB7CkBAIC0xMjQsMTQgKzE0MCwxNSBAQAogCXJldHVybiAtRU5PVFNVUFA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gInRjMzU4OXgiLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JLmRpcmVjdGlvbl9pbnB1dAk9IHRjMzU4OXhfZ3Bpb19kaXJlY3Rpb25faW5wdXQsCiAJLmdldAkJCT0gdGMzNTg5eF9ncGlvX2dldCwKLQkuZGlyZWN0aW9uX291dHB1dAk9IHRjMzU4OXhfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0LAogCS5zZXQJCQk9IHRjMzU4OXhfZ3Bpb19zZXQsCi0JLnNldF9zaW5nbGVfZW5kZWQJPSB0YzM1ODl4X2dwaW9fc2luZ2xlX2VuZGVkLAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gdGMzNTg5eF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCisJLmRpcmVjdGlvbl9pbnB1dAk9IHRjMzU4OXhfZ3Bpb19kaXJlY3Rpb25faW5wdXQsCisJLmdldF9kaXJlY3Rpb24JCT0gdGMzNTg5eF9ncGlvX2dldF9kaXJlY3Rpb24sCisJLnNldF9zaW5nbGVfZW5kZWQJPSB0YzM1ODl4X2dwaW9fc2V0X3NpbmdsZV9lbmRlZCwKIAkuY2FuX3NsZWVwCQk9IHRydWUsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby10cGljMjgxMC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tdHBpYzI4MTAuYwppbmRleCBjYWNlNzljLi5jOGIzNGQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby10cGljMjgxMC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRwaWMyODEwLmMKQEAgLTg3LDcgKzg3LDcgQEAKIAl0cGljMjgxMF9zZXRfbWFza19iaXRzKGNoaXAsICptYXNrLCAqYml0cyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gInRwaWMyODEwIiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5nZXRfZGlyZWN0aW9uCQk9IHRwaWMyODEwX2dldF9kaXJlY3Rpb24sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby10cHM2NTA4Ni5jIGIvZHJpdmVycy9ncGlvL2dwaW8tdHBzNjUwODYuYwppbmRleCA4ZTI1ZjAxLi5iMjNjNGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby10cHM2NTA4Ni5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRwczY1MDg2LmMKQEAgLTcyLDcgKzcyLDcgQEAKIAkJCSAgIEJJVCg0ICsgb2Zmc2V0KSwgdmFsdWUgPyBCSVQoNCArIG9mZnNldCkgOiAwKTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAidHBzNjUwODYtZ3BpbyIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuZ2V0X2RpcmVjdGlvbgkJPSB0cHM2NTA4Nl9ncGlvX2dldF9kaXJlY3Rpb24sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby10cHM2NTIxOC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tdHBzNjUyMTguYwppbmRleCAxYzA5YTE5Li5kNzc5MzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby10cHM2NTIxOC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRwczY1MjE4LmMKQEAgLTE3Miw3ICsxNzIsNyBAQAogCXJldHVybiAtRU5PVFNVUFA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gImdwaW8tdHBzNjUyMTgiLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLnJlcXVlc3QJCT0gdHBzNjUyMThfZ3Bpb19yZXF1ZXN0LApAQCAtMjA0LDcgKzIwNCw4IEBACiAJdHBzNjUyMThfZ3Bpby0+Z3Bpb19jaGlwLm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKICNlbmRpZgogCi0JcmV0ID0gZ3Bpb2NoaXBfYWRkX2RhdGEoJnRwczY1MjE4X2dwaW8tPmdwaW9fY2hpcCwgdHBzNjUyMThfZ3Bpbyk7CisJcmV0ID0gZGV2bV9ncGlvY2hpcF9hZGRfZGF0YSgmcGRldi0+ZGV2LCAmdHBzNjUyMThfZ3Bpby0+Z3Bpb19jaGlwLAorCQkJCSAgICAgdHBzNjUyMThfZ3Bpbyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGdwaW9jaGlwLCAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKQEAgLTIxNSwxNSArMjE2LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHRwczY1MjE4X2dwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHRwczY1MjE4X2dwaW8gKnRwczY1MjE4X2dwaW8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWdwaW9jaGlwX3JlbW92ZSgmdHBzNjUyMThfZ3Bpby0+Z3Bpb19jaGlwKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0cHM2NTIxOF9kdF9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAidGksdHBzNjUyMTgtZ3BpbyIgfSwKIAl7ICB9CkBAIC0yNDIsNyArMjM0LDYgQEAKIAkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHRwczY1MjE4X2R0X21hdGNoKQogCX0sCiAJLnByb2JlID0gdHBzNjUyMThfZ3Bpb19wcm9iZSwKLQkucmVtb3ZlID0gdHBzNjUyMThfZ3Bpb19yZW1vdmUsCiAJLmlkX3RhYmxlID0gdHBzNjUyMThfZ3Bpb19pZF90YWJsZSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRwczY1OTEyLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby10cHM2NTkxMi5jCmluZGV4IGFjZmQzMGEuLmFiYzA3OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRwczY1OTEyLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tdHBzNjU5MTIuYwpAQCAtOTAsNyArOTAsNyBAQAogCQkJICAgR1BJT19TRVRfTUFTSywgdmFsdWUgPyBHUElPX1NFVF9NQVNLIDogMCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gInRwczY1OTEyLWdwaW8iLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLmdldF9kaXJlY3Rpb24JCT0gdHBzNjU5MTJfZ3Bpb19nZXRfZGlyZWN0aW9uLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tdHM0ODAwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby10czQ4MDAuYwppbmRleCAwYzE0NGE3Li45OTI1NjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby10czQ4MDAuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby10czQ4MDAuYwpAQCAtOSw2ICs5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby10czQ5MDAuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRzNDkwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZDIxNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby10czQ5MDAuYwpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIERpZ2l0YWwgSS9PIGRyaXZlciBmb3IgVGVjaG5vbG9naWMgU3lzdGVtcyBJMkMgRlBHQSBDb3JlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRlY2hub2xvZ2ljIFN5c3RlbXMKKyAqIENvcHlyaWdodCAoQykgMjAxNiBTYXZvaXItRmFpcmUgTGludXgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCAiYXMgaXMiIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzZWQgb3IgaW1wbGllZDsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2RlZmluZSBERUZBVUxUX1BJTl9OVU1CRVIJMzIKKy8qCisgKiBSZWdpc3RlciBiaXRzIHVzZWQgYnkgdGhlIEdQSU8gZGV2aWNlCisgKiBTb21lIGJvYXJkcywgc3VjaCBhcyBUUy03OTcwIGRvIG5vdCBoYXZlIGEgc2VwYXJhdGUgaW5wdXQgYml0CisgKi8KKyNkZWZpbmUgVFM0OTAwX0dQSU9fT0UJCTB4MDEKKyNkZWZpbmUgVFM0OTAwX0dQSU9fT1VUCQkweDAyCisjZGVmaW5lIFRTNDkwMF9HUElPX0lOCQkweDA0CisjZGVmaW5lIFRTNzk3MF9HUElPX0lOCQkweDAyCisKK3N0cnVjdCB0czQ5MDBfZ3Bpb19wcml2IHsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IGdwaW9fY2hpcCBncGlvX2NoaXA7CisJdW5zaWduZWQgaW50IGlucHV0X2JpdDsKK307CisKK3N0YXRpYyBpbnQgdHM0OTAwX2dwaW9fZ2V0X2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgdHM0OTAwX2dwaW9fcHJpdiAqcHJpdiA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCXVuc2lnbmVkIGludCByZWc7CisKKwlyZWdtYXBfcmVhZChwcml2LT5yZWdtYXAsIG9mZnNldCwgJnJlZyk7CisKKwlyZXR1cm4gIShyZWcgJiBUUzQ5MDBfR1BJT19PRSk7Cit9CisKK3N0YXRpYyBpbnQgdHM0OTAwX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IHRzNDkwMF9ncGlvX3ByaXYgKnByaXYgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCS8qCisJICogVGhpcyB3aWxsIGNsZWFyIHRoZSBvdXRwdXQgZW5hYmxlIGJpdCwgdGhlIG90aGVyIGJpdHMgYXJlCisJICogZG9udGNhcmUgd2hlbiB0aGlzIGlzIGNsZWFyZWQKKwkgKi8KKwlyZXR1cm4gcmVnbWFwX3dyaXRlKHByaXYtPnJlZ21hcCwgb2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGludCB0czQ5MDBfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJCXVuc2lnbmVkIGludCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgdHM0OTAwX2dwaW9fcHJpdiAqcHJpdiA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCWludCByZXQ7CisKKwlpZiAodmFsdWUpCisJCXJldCA9IHJlZ21hcF93cml0ZShwcml2LT5yZWdtYXAsIG9mZnNldCwgVFM0OTAwX0dQSU9fT0UgfAorCQkJCQkJCSBUUzQ5MDBfR1BJT19PVVQpOworCWVsc2UKKwkJcmV0ID0gcmVnbWFwX3dyaXRlKHByaXYtPnJlZ21hcCwgb2Zmc2V0LCBUUzQ5MDBfR1BJT19PRSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRzNDkwMF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCB0czQ5MDBfZ3Bpb19wcml2ICpwcml2ID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJdW5zaWduZWQgaW50IHJlZzsKKworCXJlZ21hcF9yZWFkKHByaXYtPnJlZ21hcCwgb2Zmc2V0LCAmcmVnKTsKKworCXJldHVybiAhIShyZWcgJiBwcml2LT5pbnB1dF9iaXQpOworfQorCitzdGF0aWMgdm9pZCB0czQ5MDBfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCSAgICBpbnQgdmFsdWUpCit7CisJc3RydWN0IHRzNDkwMF9ncGlvX3ByaXYgKnByaXYgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCWlmICh2YWx1ZSkKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHByaXYtPnJlZ21hcCwgb2Zmc2V0LCBUUzQ5MDBfR1BJT19PVVQsCisJCQkJICAgVFM0OTAwX0dQSU9fT1VUKTsKKwllbHNlCisJCXJlZ21hcF91cGRhdGVfYml0cyhwcml2LT5yZWdtYXAsIG9mZnNldCwgVFM0OTAwX0dQSU9fT1VULCAwKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHRzNDkwMF9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDE2LAorCS52YWxfYml0cyA9IDgsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0geworCS5sYWJlbAkJCT0gInRzNDkwMC1ncGlvIiwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5nZXRfZGlyZWN0aW9uCQk9IHRzNDkwMF9ncGlvX2dldF9kaXJlY3Rpb24sCisJLmRpcmVjdGlvbl9pbnB1dAk9IHRzNDkwMF9ncGlvX2RpcmVjdGlvbl9pbnB1dCwKKwkuZGlyZWN0aW9uX291dHB1dAk9IHRzNDkwMF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCisJLmdldAkJCT0gdHM0OTAwX2dwaW9fZ2V0LAorCS5zZXQJCQk9IHRzNDkwMF9ncGlvX3NldCwKKwkuYmFzZQkJCT0gLTEsCisJLmNhbl9zbGVlcAkJPSB0cnVlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdHM0OTAwX2dwaW9fb2ZfbWF0Y2hfdGFibGVbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gInRlY2hub2xvZ2ljLHRzNDkwMC1ncGlvIiwKKwkJLmRhdGEgPSAodm9pZCAqKVRTNDkwMF9HUElPX0lOLAorCX0sIHsKKwkJLmNvbXBhdGlibGUgPSAidGVjaG5vbG9naWMsdHM3OTcwLWdwaW8iLAorCQkuZGF0YSA9ICh2b2lkICopVFM3OTcwX0dQSU9fSU4sCisJfSwKKwl7IC8qIHNlbnRpbmVsICovIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdHM0OTAwX2dwaW9fb2ZfbWF0Y2hfdGFibGUpOworCitzdGF0aWMgaW50IHRzNDkwMF9ncGlvX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CisJc3RydWN0IHRzNDkwMF9ncGlvX3ByaXYgKnByaXY7CisJdTMyIG5ncGlvOworCWludCByZXQ7CisKKwltYXRjaCA9IG9mX21hdGNoX2RldmljZSh0czQ5MDBfZ3Bpb19vZl9tYXRjaF90YWJsZSwgJmNsaWVudC0+ZGV2KTsKKwlpZiAoIW1hdGNoKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihjbGllbnQtPmRldi5vZl9ub2RlLCAibmdwaW9zIiwgJm5ncGlvKSkKKwkJbmdwaW8gPSBERUZBVUxUX1BJTl9OVU1CRVI7CisKKwlwcml2ID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaXYtPmdwaW9fY2hpcCA9IHRlbXBsYXRlX2NoaXA7CisJcHJpdi0+Z3Bpb19jaGlwLmxhYmVsID0gInRzNDkwMC1ncGlvIjsKKwlwcml2LT5ncGlvX2NoaXAubmdwaW8gPSBuZ3BpbzsKKwlwcml2LT5ncGlvX2NoaXAucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCXByaXYtPmlucHV0X2JpdCA9ICh1aW50cHRyX3QpbWF0Y2gtPmRhdGE7CisKKwlwcml2LT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZ0czQ5MDBfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihwcml2LT5yZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIocHJpdi0+cmVnbWFwKTsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVnaXN0ZXIgbWFwOiAlZFxuIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZGV2bV9ncGlvY2hpcF9hZGRfZGF0YSgmY2xpZW50LT5kZXYsICZwcml2LT5ncGlvX2NoaXAsIHByaXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiVW5hYmxlIHRvIHJlZ2lzdGVyIGdwaW9jaGlwXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBwcml2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdHM0OTAwX2dwaW9faWRfdGFibGVbXSA9IHsKKwl7ICJ0czQ5MDAtZ3BpbyIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRzNDkwMF9ncGlvX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHRzNDkwMF9ncGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ0czQ5MDAtZ3BpbyIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHRzNDkwMF9ncGlvX29mX21hdGNoX3RhYmxlLAorCX0sCisJLnByb2JlID0gdHM0OTAwX2dwaW9fcHJvYmUsCisJLmlkX3RhYmxlID0gdHM0OTAwX2dwaW9faWRfdGFibGUsCit9OworbW9kdWxlX2kyY19kcml2ZXIodHM0OTAwX2dwaW9fZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiVGVjaG5vbG9naWMgU3lzdGVtcyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHUElPIGludGVyZmFjZSBmb3IgVGVjaG5vbG9naWMgU3lzdGVtcyBJMkMtRlBHQSBjb3JlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby10d2w0MDMwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby10d2w0MDMwLmMKaW5kZXggNGI4MDdiMC4uZGZjZmJiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tdHdsNDAzMC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXR3bDQwMzAuYwpAQCAtMzgxLDcgKzM4MSw3IEBACiAJCTogLUVJTlZBTDsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAidHdsNDAzMCIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkucmVxdWVzdAkJPSB0d2xfcmVxdWVzdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXZmNjEwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby12ZjYxMC5jCmluZGV4IDYyODRiZGIuLjNlZGIwOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXZmNjEwLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tdmY2MTAuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiB2ZjYxMCBHUElPIHN1cHBvcnQgdGhyb3VnaCBQT1JUIGFuZCBHUElPIG1vZHVsZQorICogRnJlZXNjYWxlIHZmNjEwIEdQSU8gc3VwcG9ydCB0aHJvdWdoIFBPUlQgYW5kIEdQSU8KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQgVG9yYWRleCBBRy4KICAqCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgpAQCAtMjg5LDcgKzI4OCwzIEBACiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdmY2MTBfZ3Bpb19kcml2ZXIpOwogfQogZGV2aWNlX2luaXRjYWxsKGdwaW9fdmY2MTBfaW5pdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIlN0ZWZhbiBBZ25lciA8c3RlZmFuQGFnbmVyLmNoPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJGcmVlc2NhbGUgVkY2MTAgR1BJTyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8td2NvdmUuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXdjb3ZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkZGJhNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXdjb3ZlLmMKQEAgLTAsMCArMSw0NzAgQEAKKy8qCisgKiBJbnRlbCBXaGlza2V5IENvdmUgUE1JQyBHUElPIERyaXZlcgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIHdyaXR0ZW4gYmFzZWQgb24gZ3Bpby1jcnlzdGFsY292ZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvaW50ZWxfc29jX3BtaWMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisvKgorICogV2hpc2tleSBDb3ZlIFBNSUMgaGFzIDEzIHBoeXNpY2FsIEdQSU8gcGlucyBkaXZpZGVkIGludG8gMyBiYW5rczoKKyAqIEJhbmsgMDogUGluIDAgLSA2CisgKiBCYW5rIDE6IFBpbiA3IC0gMTAKKyAqIEJhbmsgMjogUGluIDExIC0xMgorICogRWFjaCBwaW4gaGFzIG9uZSBvdXRwdXQgY29udHJvbCByZWdpc3RlciBhbmQgb25lIGlucHV0IGNvbnRyb2wgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgQkFOSzBfTlJfUElOUwkJNworI2RlZmluZSBCQU5LMV9OUl9QSU5TCQk0CisjZGVmaW5lIEJBTksyX05SX1BJTlMJCTIKKyNkZWZpbmUgV0NPVkVfR1BJT19OVU0JCShCQU5LMF9OUl9QSU5TICsgQkFOSzFfTlJfUElOUyArIEJBTksyX05SX1BJTlMpCisjZGVmaW5lIFdDT1ZFX1ZHUElPX05VTQkJOTQKKy8qIEdQSU8gb3V0cHV0IGNvbnRyb2wgcmVnaXN0ZXJzIChvbmUgcGVyIHBpbik6IDB4NGU0NCAtIDB4NGU1MCAqLworI2RlZmluZSBHUElPX09VVF9DVFJMX0JBU0UJMHg0ZTQ0CisvKiBHUElPIGlucHV0IGNvbnRyb2wgcmVnaXN0ZXJzIChvbmUgcGVyIHBpbik6IDB4NGU1MSAtIDB4NGU1ZCAqLworI2RlZmluZSBHUElPX0lOX0NUUkxfQkFTRQkweDRlNTEKKworLyoKKyAqIEdQSU8gaW50ZXJydXB0cyBhcmUgb3JnYW5pemVkIGluIHR3byBncm91cHM6CisgKiBHcm91cCAwOiBCYW5rIDAgcGlucyAoUGluIDAgLSA2KQorICogR3JvdXAgMTogQmFuayAxIGFuZCBCYW5rIDIgcGlucyAoUGluIDcgLSAxMikKKyAqIEVhY2ggZ3JvdXAgaGFzIHR3byByZWdpc3RlcnMgKG9uZSBiaXQgcGVyIHBpbik6IHN0YXR1cyBhbmQgbWFzay4KKyAqLworI2RlZmluZSBHUk9VUDBfTlJfSVJRUwkJNworI2RlZmluZSBHUk9VUDFfTlJfSVJRUwkJNgorI2RlZmluZSBJUlFfTUFTS19CQVNFCQkweDRlMTkKKyNkZWZpbmUgSVJRX1NUQVRVU19CQVNFCQkweDRlMGIKKyNkZWZpbmUgVVBEQVRFX0lSUV9UWVBFCQlCSVQoMCkKKyNkZWZpbmUgVVBEQVRFX0lSUV9NQVNLCQlCSVQoMSkKKworI2RlZmluZSBDVExJX0lOVENOVF9ESVMJCSgwIDw8IDEpCisjZGVmaW5lIENUTElfSU5UQ05UX05FCQkoMSA8PCAxKQorI2RlZmluZSBDVExJX0lOVENOVF9QRQkJKDIgPDwgMSkKKyNkZWZpbmUgQ1RMSV9JTlRDTlRfQkUJCSgzIDw8IDEpCisKKyNkZWZpbmUgQ1RMT19ESVJfSU4JCSgwIDw8IDUpCisjZGVmaW5lIENUTE9fRElSX09VVAkJKDEgPDwgNSkKKworI2RlZmluZSBDVExPX0RSVl9NQVNLCQkoMSA8PCA0KQorI2RlZmluZSBDVExPX0RSVl9PRAkJKDAgPDwgNCkKKyNkZWZpbmUgQ1RMT19EUlZfQ01PUwkJKDEgPDwgNCkKKworI2RlZmluZSBDVExPX0RSVl9SRU4JCSgxIDw8IDMpCisKKyNkZWZpbmUgQ1RMT19SVkFMXzJLRE9XTgkoMCA8PCAxKQorI2RlZmluZSBDVExPX1JWQUxfMktVUAkJKDEgPDwgMSkKKyNkZWZpbmUgQ1RMT19SVkFMXzUwS0RPV04JKDIgPDwgMSkKKyNkZWZpbmUgQ1RMT19SVkFMXzUwS1VQCQkoMyA8PCAxKQorCisjZGVmaW5lIENUTE9fSU5QVVRfU0VUCShDVExPX0RSVl9DTU9TIHwgQ1RMT19EUlZfUkVOIHwgQ1RMT19SVkFMXzJLVVApCisjZGVmaW5lIENUTE9fT1VUUFVUX1NFVAkoQ1RMT19ESVJfT1VUIHwgQ1RMT19JTlBVVF9TRVQpCisKK2VudW0gY3RybF9yZWdpc3RlciB7CisJQ1RSTF9JTiwKKwlDVFJMX09VVCwKK307CisKKy8qCisgKiBzdHJ1Y3Qgd2NvdmVfZ3BpbyAtIFdoaXNrZXkgQ292ZSBHUElPIGNvbnRyb2xsZXIKKyAqIEBidXNsb2NrOiBmb3IgYnVzIGxvY2svc3luYyBhbmQgdW5sb2NrLgorICogQGNoaXA6IHRoZSBhYnN0cmFjdCBncGlvX2NoaXAgc3RydWN0dXJlLgorICogQGRldjogdGhlIGdwaW8gZGV2aWNlCisgKiBAcmVnbWFwOiB0aGUgcmVnbWFwIGZyb20gdGhlIHBhcmVudCBkZXZpY2UuCisgKiBAcmVnbWFwX2lycV9jaGlwOiB0aGUgcmVnbWFwIG9mIHRoZSBncGlvIGlycSBjaGlwLgorICogQHVwZGF0ZTogcGVuZGluZyBJUlEgc2V0dGluZyB1cGRhdGUsIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGNoaXAgdXBvbiB1bmxvY2suCisgKiBAaW50Y250OiB0aGUgSW50ZXJydXB0IERldGVjdCB2YWx1ZSB0byBiZSB3cml0dGVuLgorICogQHNldF9pcnFfbWFzazogdHJ1ZSBpZiB0aGUgSVJRIG1hc2sgbmVlZHMgdG8gYmUgc2V0LCBmYWxzZSB0byBjbGVhci4KKyAqLworc3RydWN0IHdjb3ZlX2dwaW8geworCXN0cnVjdCBtdXRleCBidXNsb2NrOworCXN0cnVjdCBncGlvX2NoaXAgY2hpcDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXN0cnVjdCByZWdtYXBfaXJxX2NoaXBfZGF0YSAqcmVnbWFwX2lycV9jaGlwOworCWludCB1cGRhdGU7CisJaW50IGludGNudDsKKwlib29sIHNldF9pcnFfbWFzazsKK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHRvX3JlZyhpbnQgZ3BpbywgZW51bSBjdHJsX3JlZ2lzdGVyIHJlZ190eXBlKQoreworCXVuc2lnbmVkIGludCByZWc7CisJaW50IGJhbms7CisKKwlpZiAoZ3BpbyA8IEJBTkswX05SX1BJTlMpCisJCWJhbmsgPSAwOworCWVsc2UgaWYgKGdwaW8gPCBCQU5LMF9OUl9QSU5TICsgQkFOSzFfTlJfUElOUykKKwkJYmFuayA9IDE7CisJZWxzZQorCQliYW5rID0gMjsKKworCWlmIChyZWdfdHlwZSA9PSBDVFJMX0lOKQorCQlyZWcgPSBHUElPX0lOX0NUUkxfQkFTRSArIGJhbms7CisJZWxzZQorCQlyZWcgPSBHUElPX09VVF9DVFJMX0JBU0UgKyBiYW5rOworCisJcmV0dXJuIHJlZzsKK30KKworc3RhdGljIHZvaWQgd2NvdmVfdXBkYXRlX2lycV9tYXNrKHN0cnVjdCB3Y292ZV9ncGlvICp3ZywgaW50IGdwaW8pCit7CisJdW5zaWduZWQgaW50IHJlZywgbWFzazsKKworCWlmIChncGlvIDwgR1JPVVAwX05SX0lSUVMpIHsKKwkJcmVnID0gSVJRX01BU0tfQkFTRTsKKwkJbWFzayA9IEJJVChncGlvICUgR1JPVVAwX05SX0lSUVMpOworCX0gZWxzZSB7CisJCXJlZyA9IElSUV9NQVNLX0JBU0UgKyAxOworCQltYXNrID0gQklUKChncGlvIC0gR1JPVVAwX05SX0lSUVMpICUgR1JPVVAxX05SX0lSUVMpOworCX0KKworCWlmICh3Zy0+c2V0X2lycV9tYXNrKQorCQlyZWdtYXBfdXBkYXRlX2JpdHMod2ctPnJlZ21hcCwgcmVnLCBtYXNrLCBtYXNrKTsKKwllbHNlCisJCXJlZ21hcF91cGRhdGVfYml0cyh3Zy0+cmVnbWFwLCByZWcsIG1hc2ssIDApOworfQorCitzdGF0aWMgdm9pZCB3Y292ZV91cGRhdGVfaXJxX2N0cmwoc3RydWN0IHdjb3ZlX2dwaW8gKndnLCBpbnQgZ3BpbykKK3sKKwl1bnNpZ25lZCBpbnQgcmVnID0gdG9fcmVnKGdwaW8sIENUUkxfSU4pOworCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHdnLT5yZWdtYXAsIHJlZywgQ1RMSV9JTlRDTlRfQkUsIHdnLT5pbnRjbnQpOworfQorCitzdGF0aWMgaW50IHdjb3ZlX2dwaW9fZGlyX2luKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBncGlvKQoreworCXN0cnVjdCB3Y292ZV9ncGlvICp3ZyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCisJcmV0dXJuIHJlZ21hcF93cml0ZSh3Zy0+cmVnbWFwLCB0b19yZWcoZ3BpbywgQ1RSTF9PVVQpLAorCQkJICAgIENUTE9fSU5QVVRfU0VUKTsKK30KKworc3RhdGljIGludCB3Y292ZV9ncGlvX2Rpcl9vdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGdwaW8sCisJCQkJICAgIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgd2NvdmVfZ3BpbyAqd2cgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCXJldHVybiByZWdtYXBfd3JpdGUod2ctPnJlZ21hcCwgdG9fcmVnKGdwaW8sIENUUkxfT1VUKSwKKwkJCSAgICBDVExPX09VVFBVVF9TRVQgfCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgd2NvdmVfZ3Bpb19nZXRfZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBncGlvKQoreworCXN0cnVjdCB3Y292ZV9ncGlvICp3ZyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF9yZWFkKHdnLT5yZWdtYXAsIHRvX3JlZyhncGlvLCBDVFJMX09VVCksICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gISh2YWwgJiBDVExPX0RJUl9PVVQpOworfQorCitzdGF0aWMgaW50IHdjb3ZlX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBncGlvKQoreworCXN0cnVjdCB3Y292ZV9ncGlvICp3ZyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF9yZWFkKHdnLT5yZWdtYXAsIHRvX3JlZyhncGlvLCBDVFJMX0lOKSwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiB2YWwgJiAweDE7Cit9CisKK3N0YXRpYyB2b2lkIHdjb3ZlX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHdjb3ZlX2dwaW8gKndnID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisKKwlpZiAodmFsdWUpCisJCXJlZ21hcF91cGRhdGVfYml0cyh3Zy0+cmVnbWFwLCB0b19yZWcoZ3BpbywgQ1RSTF9PVVQpLCAxLCAxKTsKKwllbHNlCisJCXJlZ21hcF91cGRhdGVfYml0cyh3Zy0+cmVnbWFwLCB0b19yZWcoZ3BpbywgQ1RSTF9PVVQpLCAxLCAwKTsKK30KKworc3RhdGljIGludCB3Y292ZV9ncGlvX3NldF9zaW5nbGVfZW5kZWQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkJdW5zaWduZWQgaW50IGdwaW8sCisJCQkJCWVudW0gc2luZ2xlX2VuZGVkX21vZGUgbW9kZSkKK3sKKwlzdHJ1Y3Qgd2NvdmVfZ3BpbyAqd2cgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgTElORV9NT0RFX09QRU5fRFJBSU46CisJCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMod2ctPnJlZ21hcCwgdG9fcmVnKGdwaW8sIENUUkxfT1VUKSwKKwkJCQkJCUNUTE9fRFJWX01BU0ssIENUTE9fRFJWX09EKTsKKwljYXNlIExJTkVfTU9ERV9QVVNIX1BVTEw6CisJCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMod2ctPnJlZ21hcCwgdG9fcmVnKGdwaW8sIENUUkxfT1VUKSwKKwkJCQkJCUNUTE9fRFJWX01BU0ssIENUTE9fRFJWX0NNT1MpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbnQgd2NvdmVfaXJxX3R5cGUoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJc3RydWN0IHdjb3ZlX2dwaW8gKndnID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElSUV9UWVBFX05PTkU6CisJCXdnLT5pbnRjbnQgPSBDVExJX0lOVENOVF9ESVM7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgorCQl3Zy0+aW50Y250ID0gQ1RMSV9JTlRDTlRfQkU7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6CisJCXdnLT5pbnRjbnQgPSBDVExJX0lOVENOVF9QRTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6CisJCXdnLT5pbnRjbnQgPSBDVExJX0lOVENOVF9ORTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd2ctPnVwZGF0ZSB8PSBVUERBVEVfSVJRX1RZUEU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd2NvdmVfYnVzX2xvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlzdHJ1Y3Qgd2NvdmVfZ3BpbyAqd2cgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCW11dGV4X2xvY2soJndnLT5idXNsb2NrKTsKK30KKworc3RhdGljIHZvaWQgd2NvdmVfYnVzX3N5bmNfdW5sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJc3RydWN0IHdjb3ZlX2dwaW8gKndnID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJaW50IGdwaW8gPSBkYXRhLT5od2lycTsKKworCWlmICh3Zy0+dXBkYXRlICYgVVBEQVRFX0lSUV9UWVBFKQorCQl3Y292ZV91cGRhdGVfaXJxX2N0cmwod2csIGdwaW8pOworCWlmICh3Zy0+dXBkYXRlICYgVVBEQVRFX0lSUV9NQVNLKQorCQl3Y292ZV91cGRhdGVfaXJxX21hc2sod2csIGdwaW8pOworCXdnLT51cGRhdGUgPSAwOworCisJbXV0ZXhfdW5sb2NrKCZ3Zy0+YnVzbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHdjb3ZlX2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlzdHJ1Y3Qgd2NvdmVfZ3BpbyAqd2cgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCXdnLT5zZXRfaXJxX21hc2sgPSBmYWxzZTsKKwl3Zy0+dXBkYXRlIHw9IFVQREFURV9JUlFfTUFTSzsKK30KKworc3RhdGljIHZvaWQgd2NvdmVfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlzdHJ1Y3Qgd2NvdmVfZ3BpbyAqd2cgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCXdnLT5zZXRfaXJxX21hc2sgPSB0cnVlOworCXdnLT51cGRhdGUgfD0gVVBEQVRFX0lSUV9NQVNLOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHdjb3ZlX2lycWNoaXAgPSB7CisJLm5hbWUJCQk9ICJXaGlza2V5IENvdmUiLAorCS5pcnFfbWFzawkJPSB3Y292ZV9pcnFfbWFzaywKKwkuaXJxX3VubWFzawkJPSB3Y292ZV9pcnFfdW5tYXNrLAorCS5pcnFfc2V0X3R5cGUJCT0gd2NvdmVfaXJxX3R5cGUsCisJLmlycV9idXNfbG9jawkJPSB3Y292ZV9idXNfbG9jaywKKwkuaXJxX2J1c19zeW5jX3VubG9jawk9IHdjb3ZlX2J1c19zeW5jX3VubG9jaywKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3Y292ZV9ncGlvX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdjb3ZlX2dwaW8gKndnID0gKHN0cnVjdCB3Y292ZV9ncGlvICopZGF0YTsKKwl1bnNpZ25lZCBpbnQgcGVuZGluZywgdmlycSwgZ3BpbywgbWFzaywgb2Zmc2V0OworCXU4IHBbMl07CisKKwlpZiAocmVnbWFwX2J1bGtfcmVhZCh3Zy0+cmVnbWFwLCBJUlFfU1RBVFVTX0JBU0UsIHAsIDIpKSB7CisJCWRldl9lcnIod2ctPmRldiwgIkZhaWxlZCB0byByZWFkIGlycSBzdGF0dXMgcmVnaXN0ZXJcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJcGVuZGluZyA9IHBbMF0gfCAocFsxXSA8PCA4KTsKKwlpZiAoIXBlbmRpbmcpCisJCXJldHVybiBJUlFfTk9ORTsKKworCS8qIEl0ZXJhdGUgdW50aWwgbm8gaW50ZXJydXB0IGlzIHBlbmRpbmcgKi8KKwl3aGlsZSAocGVuZGluZykgeworCQkvKiBPbmUgaXRlcmF0aW9uIGlzIGZvciBhbGwgcGVuZGluZyBiaXRzICovCisJCWZvcl9lYWNoX3NldF9iaXQoZ3BpbywgKGNvbnN0IHVuc2lnbmVkIGxvbmcgKikmcGVuZGluZywKKwkJCQkJCSBHUk9VUDBfTlJfSVJRUykgeworCQkJb2Zmc2V0ID0gKGdwaW8gPiBHUk9VUDBfTlJfSVJRUykgPyAxIDogMDsKKwkJCW1hc2sgPSAob2Zmc2V0ID09IDEpID8gQklUKGdwaW8gLSBHUk9VUDBfTlJfSVJRUykgOgorCQkJCQkJCQlCSVQoZ3Bpbyk7CisJCQl2aXJxID0gaXJxX2ZpbmRfbWFwcGluZyh3Zy0+Y2hpcC5pcnFkb21haW4sIGdwaW8pOworCQkJaGFuZGxlX25lc3RlZF9pcnEodmlycSk7CisJCQlyZWdtYXBfdXBkYXRlX2JpdHMod2ctPnJlZ21hcCwgSVJRX1NUQVRVU19CQVNFICsgb2Zmc2V0LAorCQkJCQkJCQltYXNrLCBtYXNrKTsKKwkJfQorCisJCS8qIE5leHQgaXRlcmF0aW9uICovCisJCWlmIChyZWdtYXBfYnVsa19yZWFkKHdnLT5yZWdtYXAsIElSUV9TVEFUVVNfQkFTRSwgcCwgMikpIHsKKwkJCWRldl9lcnIod2ctPmRldiwgIkZhaWxlZCB0byByZWFkIGlycSBzdGF0dXNcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlwZW5kaW5nID0gcFswXSB8IChwWzFdIDw8IDgpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgd2NvdmVfZ3Bpb19kYmdfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCisJCQkJICAgICAgc3RydWN0IGdwaW9fY2hpcCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgY3RsbywgY3RsaSwgaXJxX21hc2ssIGlycV9zdGF0dXM7CisJc3RydWN0IHdjb3ZlX2dwaW8gKndnID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJaW50IGdwaW8sIG9mZnNldCwgZ3JvdXAsIHJldCA9IDA7CisKKwlmb3IgKGdwaW8gPSAwOyBncGlvIDwgV0NPVkVfR1BJT19OVU07IGdwaW8rKykgeworCQlncm91cCA9IGdwaW8gPCBHUk9VUDBfTlJfSVJRUyA/IDAgOiAxOworCQlyZXQgKz0gcmVnbWFwX3JlYWQod2ctPnJlZ21hcCwgdG9fcmVnKGdwaW8sIENUUkxfT1VUKSwgJmN0bG8pOworCQlyZXQgKz0gcmVnbWFwX3JlYWQod2ctPnJlZ21hcCwgdG9fcmVnKGdwaW8sIENUUkxfSU4pLCAmY3RsaSk7CisJCXJldCArPSByZWdtYXBfcmVhZCh3Zy0+cmVnbWFwLCBJUlFfTUFTS19CQVNFICsgZ3JvdXAsCisJCQkJCQkJJmlycV9tYXNrKTsKKwkJcmV0ICs9IHJlZ21hcF9yZWFkKHdnLT5yZWdtYXAsIElSUV9TVEFUVVNfQkFTRSArIGdyb3VwLAorCQkJCQkJCSZpcnFfc3RhdHVzKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gcmVhZCByZWdpc3RlcnM6IGN0cmwgb3V0L2luIG9yIGlycSBzdGF0dXMvbWFza1xuIik7CisJCQlicmVhazsKKwkJfQorCisJCW9mZnNldCA9IGdwaW8gJSA4OworCQlzZXFfcHJpbnRmKHMsICIgZ3Bpby0lLTJkICVzICVzICVzICVzIGN0bG89JTJ4LCVzICVzXG4iLAorCQkJICAgZ3BpbywgY3RsbyAmIENUTE9fRElSX09VVCA/ICJvdXQiIDogImluICIsCisJCQkgICBjdGxpICYgMHgxID8gImhpIiA6ICJsbyIsCisJCQkgICBjdGxpICYgQ1RMSV9JTlRDTlRfTkUgPyAiZmFsbCIgOiAiICAgICIsCisJCQkgICBjdGxpICYgQ1RMSV9JTlRDTlRfUEUgPyAicmlzZSIgOiAiICAgICIsCisJCQkgICBjdGxvLAorCQkJICAgaXJxX21hc2sgJiBCSVQob2Zmc2V0KSA/ICJtYXNrICAiIDogInVubWFzayIsCisJCQkgICBpcnFfc3RhdHVzICYgQklUKG9mZnNldCkgPyAicGVuZGluZyIgOiAiICAgICAgICIpOworCX0KK30KKworc3RhdGljIGludCB3Y292ZV9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGludGVsX3NvY19wbWljICpwbWljOworCXN0cnVjdCB3Y292ZV9ncGlvICp3ZzsKKwlpbnQgdmlycSwgcmV0LCBpcnE7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJLyoKKwkgKiBUaGlzIGdwaW8gcGxhdGZvcm0gZGV2aWNlIGlzIGNyZWF0ZWQgYnkgYSBtZmQgZGV2aWNlIChzZWUKKwkgKiBkcml2ZXJzL21mZC9pbnRlbF9zb2NfcG1pY19ieHR3Yy5jIGZvciBkZXRhaWxzKS4gSW5mb3JtYXRpb24KKwkgKiBzaGFyZWQgYnkgYWxsIHN1Yi1kZXZpY2VzIGNyZWF0ZWQgYnkgdGhlIG1mZCBkZXZpY2UsIHRoZSByZWdtYXAKKwkgKiBwb2ludGVyIGZvciBpbnN0YW5jZSwgaXMgc3RvcmVkIGFzIGRyaXZlciBkYXRhIG9mIHRoZSBtZmQgZGV2aWNlCisJICogZHJpdmVyLgorCSAqLworCXBtaWMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJaWYgKCFwbWljKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApCisJCXJldHVybiBpcnE7CisKKwlkZXYgPSAmcGRldi0+ZGV2OworCisJd2cgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKndnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF3ZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3Zy0+cmVnbWFwX2lycV9jaGlwID0gcG1pYy0+aXJxX2NoaXBfZGF0YV9sZXZlbDI7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB3Zyk7CisKKwltdXRleF9pbml0KCZ3Zy0+YnVzbG9jayk7CisJd2ctPmNoaXAubGFiZWwgPSBLQlVJTERfTU9ETkFNRTsKKwl3Zy0+Y2hpcC5kaXJlY3Rpb25faW5wdXQgPSB3Y292ZV9ncGlvX2Rpcl9pbjsKKwl3Zy0+Y2hpcC5kaXJlY3Rpb25fb3V0cHV0ID0gd2NvdmVfZ3Bpb19kaXJfb3V0OworCXdnLT5jaGlwLmdldF9kaXJlY3Rpb24gPSB3Y292ZV9ncGlvX2dldF9kaXJlY3Rpb247CisJd2ctPmNoaXAuZ2V0ID0gd2NvdmVfZ3Bpb19nZXQ7CisJd2ctPmNoaXAuc2V0ID0gd2NvdmVfZ3Bpb19zZXQ7CisJd2ctPmNoaXAuc2V0X3NpbmdsZV9lbmRlZCA9IHdjb3ZlX2dwaW9fc2V0X3NpbmdsZV9lbmRlZCwKKwl3Zy0+Y2hpcC5iYXNlID0gLTE7CisJd2ctPmNoaXAubmdwaW8gPSBXQ09WRV9WR1BJT19OVU07CisJd2ctPmNoaXAuY2FuX3NsZWVwID0gdHJ1ZTsKKwl3Zy0+Y2hpcC5wYXJlbnQgPSBwZGV2LT5kZXYucGFyZW50OworCXdnLT5jaGlwLmRiZ19zaG93ID0gd2NvdmVfZ3Bpb19kYmdfc2hvdzsKKwl3Zy0+ZGV2ID0gZGV2OworCXdnLT5yZWdtYXAgPSBwbWljLT5yZWdtYXA7CisKKwlyZXQgPSBkZXZtX2dwaW9jaGlwX2FkZF9kYXRhKGRldiwgJndnLT5jaGlwLCB3Zyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBhZGQgZ3Bpb2NoaXA6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGdwaW9jaGlwX2lycWNoaXBfYWRkKCZ3Zy0+Y2hpcCwgJndjb3ZlX2lycWNoaXAsIDAsCisJCQkgICAgIGhhbmRsZV9zaW1wbGVfaXJxLCBJUlFfVFlQRV9OT05FKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGFkZCBpcnFjaGlwOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl2aXJxID0gcmVnbWFwX2lycV9nZXRfdmlycSh3Zy0+cmVnbWFwX2lycV9jaGlwLCBpcnEpOworCWlmICh2aXJxIDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgdmlycSBieSBpcnEgJWRcbiIsIGlycSk7CisJCXJldHVybiB2aXJxOworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoZGV2LCB2aXJxLCBOVUxMLAorCQl3Y292ZV9ncGlvX2lycV9oYW5kbGVyLCBJUlFGX09ORVNIT1QsIHBkZXYtPm5hbWUsIHdnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgaXJxICVkXG4iLCB2aXJxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdoaXNrZXkgQ292ZSBQTUlDIGl0c2VsZiBpcyBhIGFuYWxvZyBkZXZpY2UoYnV0IHdpdGggZGlnaXRhbCBjb250cm9sCisgKiBpbnRlcmZhY2UpIHByb3ZpZGluZyBwb3dlciBtYW5hZ2VtZW50IHN1cHBvcnQgZm9yIG90aGVyIGRldmljZXMgaW4KKyAqIHRoZSBhY2NvbXBhbmllZCBTb0MsIHNvIHdlIGhhdmUgbm8gLnBtIGZvciBXaGlza2V5IENvdmUgR1BJTyBkcml2ZXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdjb3ZlX2dwaW9fZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImJ4dF93Y292ZV9ncGlvIiwKKwl9LAorCS5wcm9iZSA9IHdjb3ZlX2dwaW9fcHJvYmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHdjb3ZlX2dwaW9fZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiQWpheSBUaG9tYXMgPGFqYXkudGhvbWFzLmRhdmlkLnJhamFtYW5pY2thbUBpbnRlbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJCaW4gR2FvIDxiaW4uZ2FvQGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgV2hpc2tleSBDb3ZlIEdQSU8gRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmJ4dF93Y292ZV9ncGlvIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby13bTgzMXguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXdtODMxeC5jCmluZGV4IDIxZjk3YmMuLjUzMzcwN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXdtODMxeC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXdtODMxeC5jCkBAIC0yNDcsNyArMjQ3LDcgQEAKICNkZWZpbmUgd204MzF4X2dwaW9fZGJnX3Nob3cgTlVMTAogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gIndtODMxeCIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuZGlyZWN0aW9uX2lucHV0CT0gd204MzF4X2dwaW9fZGlyZWN0aW9uX2luLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8td204MzUwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby13bTgzNTAuYwppbmRleCBlOTc2NTcwLi5lNDY3NTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby13bTgzNTAuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby13bTgzNTAuYwpAQCAtOTMsNyArOTMsNyBAQAogCXJldHVybiB3bTgzNTAtPmlycV9iYXNlICsgV004MzUwX0lSUV9HUElPKG9mZnNldCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gIndtODM1MCIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuZGlyZWN0aW9uX2lucHV0CT0gd204MzUwX2dwaW9fZGlyZWN0aW9uX2luLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8td204OTk0LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby13bTg5OTQuYwppbmRleCAyNDU3YWFjLi42ODQxMGZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby13bTg5OTQuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby13bTg5OTQuYwpAQCAtMjQ5LDcgKzI0OSw3IEBACiAjZGVmaW5lIHdtODk5NF9ncGlvX2RiZ19zaG93IE5VTEwKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKIAkubGFiZWwJCQk9ICJ3bTg5OTQiLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLnJlcXVlc3QJCT0gd204OTk0X2dwaW9fcmVxdWVzdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXp5bnEuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXp5bnEuYwppbmRleCBlNzI3OTRlLi42YjRkMTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby16eW5xLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tenlucS5jCkBAIC05Niw2ICs5Niw5IEBACiAvKiBHUElPIHVwcGVyIDE2IGJpdCBtYXNrICovCiAjZGVmaW5lIFpZTlFfR1BJT19VUFBFUl9NQVNLIDB4RkZGRjAwMDAKIAorLyogRm9yIEdQSU8gcXVpcmtzICovCisjZGVmaW5lIFpZTlFfR1BJT19RVUlSS19GT08JQklUKDApCisKIC8qKgogICogc3RydWN0IHp5bnFfZ3BpbyAtIGdwaW8gZGV2aWNlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAqIEBjaGlwOglpbnN0YW5jZSBvZiB0aGUgZ3Bpb19jaGlwCkBAIC0xMjIsNiArMTI1LDcgQEAKICovCiBzdHJ1Y3QgenlucV9wbGF0Zm9ybV9kYXRhIHsKIAljb25zdCBjaGFyICpsYWJlbDsKKwl1MzIgcXVpcmtzOwogCXUxNiBuZ3BpbzsKIAlpbnQgbWF4X2Jhbms7CiAJaW50IGJhbmtfbWluW1pZTlFNUF9HUElPX01BWF9CQU5LXTsKQEAgLTIzOCwxMyArMjQyLDE5IEBACiBzdGF0aWMgaW50IHp5bnFfZ3Bpb19kaXJfaW4oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IHBpbikKIHsKIAl1MzIgcmVnOworCWJvb2wgaXNfenlucV9ncGlvOwogCXVuc2lnbmVkIGludCBiYW5rX251bSwgYmFua19waW5fbnVtOwogCXN0cnVjdCB6eW5xX2dwaW8gKmdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAorCWlzX3p5bnFfZ3BpbyA9IGdwaW8tPnBfZGF0YS0+cXVpcmtzICYgWllOUV9HUElPX1FVSVJLX0ZPTzsKIAl6eW5xX2dwaW9fZ2V0X2JhbmtfcGluKHBpbiwgJmJhbmtfbnVtLCAmYmFua19waW5fbnVtLCBncGlvKTsKIAotCS8qIGJhbmsgMCBwaW5zIDcgYW5kIDggYXJlIHNwZWNpYWwgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGlucHV0cyAqLwotCWlmIChiYW5rX251bSA9PSAwICYmIChiYW5rX3Bpbl9udW0gPT0gNyB8fCBiYW5rX3Bpbl9udW0gPT0gOCkpCisJLyoKKwkgKiBPbiB6eW5xIGJhbmsgMCBwaW5zIDcgYW5kIDggYXJlIHNwZWNpYWwgYW5kIGNhbm5vdCBiZSB1c2VkCisJICogYXMgaW5wdXRzLgorCSAqLworCWlmIChpc196eW5xX2dwaW8gJiYgYmFua19udW0gPT0gMCAmJgorCQkoYmFua19waW5fbnVtID09IDcgfHwgYmFua19waW5fbnVtID09IDgpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIGNsZWFyIHRoZSBiaXQgaW4gZGlyZWN0aW9uIG1vZGUgcmVnIHRvIHNldCB0aGUgcGluIGFzIGlucHV0ICovCkBAIC02MjcsNiArNjM3LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB6eW5xX3BsYXRmb3JtX2RhdGEgenlucV9ncGlvX2RlZiA9IHsKIAkubGFiZWwgPSAienlucV9ncGlvIiwKKwkucXVpcmtzID0gWllOUV9HUElPX1FVSVJLX0ZPTywKIAkubmdwaW8gPSBaWU5RX0dQSU9fTlJfR1BJT1MsCiAJLm1heF9iYW5rID0gWllOUV9HUElPX01BWF9CQU5LLAogCS5iYW5rX21pblswXSA9IFpZTlFfR1BJT19CQU5LMF9QSU5fTUlOKCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi1hY3BpLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi1hY3BpLmMKaW5kZXggYWY1MTQ2MS4uNThlY2UyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW9saWItYWNwaS5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLWFjcGkuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL21hY2hpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0zOTUsNyArMzk2LDcgQEAKIAlpbnQgbjsKIH07CiAKLXN0YXRpYyBpbnQgYWNwaV9maW5kX2dwaW8oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmFyZXMsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGFjcGlfcG9wdWxhdGVfZ3Bpb19sb29rdXAoc3RydWN0IGFjcGlfcmVzb3VyY2UgKmFyZXMsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGFjcGlfZ3Bpb19sb29rdXAgKmxvb2t1cCA9IGRhdGE7CiAKQEAgLTQ0MCw3ICs0NDEsOCBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJnJlc19saXN0KTsKIAotCXJldCA9IGFjcGlfZGV2X2dldF9yZXNvdXJjZXMobG9va3VwLT5hZGV2LCAmcmVzX2xpc3QsIGFjcGlfZmluZF9ncGlvLAorCXJldCA9IGFjcGlfZGV2X2dldF9yZXNvdXJjZXMobG9va3VwLT5hZGV2LCAmcmVzX2xpc3QsCisJCQkJICAgICBhY3BpX3BvcHVsYXRlX2dwaW9fbG9va3VwLAogCQkJCSAgICAgbG9va3VwKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKQEAgLTUxMyw3ICs1MTUsNyBAQAogICogTm90ZTogaWYgdGhlIEdQSU8gcmVzb3VyY2UgaGFzIG11bHRpcGxlIGVudHJpZXMgaW4gdGhlIHBpbiBsaXN0LCB0aGlzCiAgKiBmdW5jdGlvbiBvbmx5IHJldHVybnMgdGhlIGZpcnN0LgogICovCi1zdHJ1Y3QgZ3Bpb19kZXNjICphY3BpX2dldF9ncGlvZF9ieV9pbmRleChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsCitzdGF0aWMgc3RydWN0IGdwaW9fZGVzYyAqYWNwaV9nZXRfZ3Bpb2RfYnlfaW5kZXgoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2LAogCQkJCQkgIGNvbnN0IGNoYXIgKnByb3BuYW1lLCBpbnQgaW5kZXgsCiAJCQkJCSAgc3RydWN0IGFjcGlfZ3Bpb19pbmZvICppbmZvKQogewpAQCAtNTQ2LDYgKzU0OCw1NSBAQAogCXJldHVybiByZXQgPyBFUlJfUFRSKHJldCkgOiBsb29rdXAuZGVzYzsKIH0KIAorc3RydWN0IGdwaW9fZGVzYyAqYWNwaV9maW5kX2dwaW8oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBjb25zdCBjaGFyICpjb25faWQsCisJCQkJIHVuc2lnbmVkIGludCBpZHgsCisJCQkJIGVudW0gZ3Bpb2RfZmxhZ3MgZmxhZ3MsCisJCQkJIGVudW0gZ3Bpb19sb29rdXBfZmxhZ3MgKmxvb2t1cGZsYWdzKQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IEFDUElfQ09NUEFOSU9OKGRldik7CisJc3RydWN0IGFjcGlfZ3Bpb19pbmZvIGluZm87CisJc3RydWN0IGdwaW9fZGVzYyAqZGVzYzsKKwljaGFyIHByb3BuYW1lWzMyXTsKKwlpbnQgaTsKKworCS8qIFRyeSBmaXJzdCBmcm9tIF9EU0QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShncGlvX3N1ZmZpeGVzKTsgaSsrKSB7CisJCWlmIChjb25faWQgJiYgc3RyY21wKGNvbl9pZCwgImdwaW9zIikpIHsKKwkJCXNucHJpbnRmKHByb3BuYW1lLCBzaXplb2YocHJvcG5hbWUpLCAiJXMtJXMiLAorCQkJCSBjb25faWQsIGdwaW9fc3VmZml4ZXNbaV0pOworCQl9IGVsc2UgeworCQkJc25wcmludGYocHJvcG5hbWUsIHNpemVvZihwcm9wbmFtZSksICIlcyIsCisJCQkJIGdwaW9fc3VmZml4ZXNbaV0pOworCQl9CisKKwkJZGVzYyA9IGFjcGlfZ2V0X2dwaW9kX2J5X2luZGV4KGFkZXYsIHByb3BuYW1lLCBpZHgsICZpbmZvKTsKKwkJaWYgKCFJU19FUlIoZGVzYykgfHwgKFBUUl9FUlIoZGVzYykgPT0gLUVQUk9CRV9ERUZFUikpCisJCQlicmVhazsKKwl9CisKKwkvKiBUaGVuIGZyb20gcGxhaW4gX0NSUyBHUElPcyAqLworCWlmIChJU19FUlIoZGVzYykpIHsKKwkJaWYgKCFhY3BpX2Nhbl9mYWxsYmFja190b19jcnMoYWRldiwgY29uX2lkKSkKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCisJCWRlc2MgPSBhY3BpX2dldF9ncGlvZF9ieV9pbmRleChhZGV2LCBOVUxMLCBpZHgsICZpbmZvKTsKKwkJaWYgKElTX0VSUihkZXNjKSkKKwkJCXJldHVybiBkZXNjOworCisJCWlmICgoZmxhZ3MgPT0gR1BJT0RfT1VUX0xPVyB8fCBmbGFncyA9PSBHUElPRF9PVVRfSElHSCkgJiYKKwkJICAgIGluZm8uZ3Bpb2ludCkgeworCQkJZGV2X2RiZyhkZXYsICJyZWZ1c2luZyBHcGlvSW50KCkgZW50cnkgd2hlbiBkb2luZyBHUElPRF9PVVRfKiBsb29rdXBcbiIpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisJCX0KKwl9CisKKwlpZiAoaW5mby5wb2xhcml0eSA9PSBHUElPX0FDVElWRV9MT1cpCisJCSpsb29rdXBmbGFncyB8PSBHUElPX0FDVElWRV9MT1c7CisKKwlyZXR1cm4gZGVzYzsKK30KKwogLyoqCiAgKiBhY3BpX25vZGVfZ2V0X2dwaW9kKCkgLSBnZXQgYSBHUElPIGRlc2NyaXB0b3IgZnJvbSBBQ1BJIHJlc291cmNlcwogICogQGZ3bm9kZTogcG9pbnRlciB0byBhbiBBQ1BJIGZpcm13YXJlIG5vZGUgdG8gZ2V0IHRoZSBHUElPIGluZm9ybWF0aW9uIGZyb20KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvbGliLW9mLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi1vZi5jCmluZGV4IDc1ZTdiMzkuLmVjYWQzZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvbGliLW9mLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW9saWItb2YuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pby1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgpAQCAtMTE0LDYgKzExMyw0NSBAQAogfQogRVhQT1JUX1NZTUJPTChvZl9nZXRfbmFtZWRfZ3Bpb19mbGFncyk7CiAKK3N0cnVjdCBncGlvX2Rlc2MgKm9mX2ZpbmRfZ3BpbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmNvbl9pZCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgaWR4LAorCQkJICAgICAgIGVudW0gZ3Bpb19sb29rdXBfZmxhZ3MgKmZsYWdzKQoreworCWNoYXIgcHJvcF9uYW1lWzMyXTsgLyogMzIgaXMgbWF4IHNpemUgb2YgcHJvcGVydHkgbmFtZSAqLworCWVudW0gb2ZfZ3Bpb19mbGFncyBvZl9mbGFnczsKKwlzdHJ1Y3QgZ3Bpb19kZXNjICpkZXNjOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ3Bpb19zdWZmaXhlcyk7IGkrKykgeworCQlpZiAoY29uX2lkKQorCQkJc25wcmludGYocHJvcF9uYW1lLCBzaXplb2YocHJvcF9uYW1lKSwgIiVzLSVzIiwgY29uX2lkLAorCQkJCSBncGlvX3N1ZmZpeGVzW2ldKTsKKwkJZWxzZQorCQkJc25wcmludGYocHJvcF9uYW1lLCBzaXplb2YocHJvcF9uYW1lKSwgIiVzIiwKKwkJCQkgZ3Bpb19zdWZmaXhlc1tpXSk7CisKKwkJZGVzYyA9IG9mX2dldF9uYW1lZF9ncGlvZF9mbGFncyhkZXYtPm9mX25vZGUsIHByb3BfbmFtZSwgaWR4LAorCQkJCQkJJm9mX2ZsYWdzKTsKKwkJaWYgKCFJU19FUlIoZGVzYykgfHwgKFBUUl9FUlIoZGVzYykgIT0gLUVOT0VOVCkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoSVNfRVJSKGRlc2MpKQorCQlyZXR1cm4gZGVzYzsKKworCWlmIChvZl9mbGFncyAmIE9GX0dQSU9fQUNUSVZFX0xPVykKKwkJKmZsYWdzIHw9IEdQSU9fQUNUSVZFX0xPVzsKKworCWlmIChvZl9mbGFncyAmIE9GX0dQSU9fU0lOR0xFX0VOREVEKSB7CisJCWlmIChvZl9mbGFncyAmIE9GX0dQSU9fQUNUSVZFX0xPVykKKwkJCSpmbGFncyB8PSBHUElPX09QRU5fRFJBSU47CisJCWVsc2UKKwkJCSpmbGFncyB8PSBHUElPX09QRU5fU09VUkNFOworCX0KKworCXJldHVybiBkZXNjOworfQorCiAvKioKICAqIG9mX3BhcnNlX293bl9ncGlvKCkgLSBHZXQgYSBHUElPIGhvZyBkZXNjcmlwdG9yLCBuYW1lcyBhbmQgZmxhZ3MgZm9yIEdQSU8gQVBJCiAgKiBAbnA6CQlkZXZpY2Ugbm9kZSB0byBnZXQgR1BJTyBmcm9tCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi1zeXNmcy5jIGIvZHJpdmVycy9ncGlvL2dwaW9saWItc3lzZnMuYwppbmRleCA5MzJlNTEwLi40YjQ0ZGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi1zeXNmcy5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLXN5c2ZzLmMKQEAgLTY3MCwxMCArNjcwLDEwIEBACiBFWFBPUlRfU1lNQk9MX0dQTChncGlvZF9leHBvcnRfbGluayk7CiAKIC8qKgotICogZ3Bpb2RfdW5leHBvcnQgLSByZXZlcnNlIGVmZmVjdCBvZiBncGlvX2V4cG9ydCgpCisgKiBncGlvZF91bmV4cG9ydCAtIHJldmVyc2UgZWZmZWN0IG9mIGdwaW9kX2V4cG9ydCgpCiAgKiBAZ3BpbzogZ3BpbyB0byBtYWtlIHVuYXZhaWxhYmxlCiAgKgotICogVGhpcyBpcyBpbXBsaWNpdCBvbiBncGlvX2ZyZWUoKS4KKyAqIFRoaXMgaXMgaW1wbGljaXQgb24gZ3Bpb2RfZnJlZSgpLgogICovCiB2b2lkIGdwaW9kX3VuZXhwb3J0KHN0cnVjdCBncGlvX2Rlc2MgKmRlc2MpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jIGIvZHJpdmVycy9ncGlvL2dwaW9saWIuYwppbmRleCA1M2ZmMjVhLi5mMGZjM2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmMKQEAgLTcxLDYgKzcxLDggQEAKIAogc3RhdGljIHZvaWQgZ3Bpb2NoaXBfZnJlZV9ob2dzKHN0cnVjdCBncGlvX2NoaXAgKmNoaXApOwogc3RhdGljIHZvaWQgZ3Bpb2NoaXBfaXJxY2hpcF9yZW1vdmUoc3RydWN0IGdwaW9fY2hpcCAqZ3Bpb2NoaXApOworc3RhdGljIGludCBncGlvY2hpcF9pcnFjaGlwX2luaXRfdmFsaWRfbWFzayhzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvY2hpcCk7CitzdGF0aWMgdm9pZCBncGlvY2hpcF9pcnFjaGlwX2ZyZWVfdmFsaWRfbWFzayhzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvY2hpcCk7CiAKIHN0YXRpYyBib29sIGdwaW9saWJfaW5pdGlhbGl6ZWQ7CiAKQEAgLTExNjcsNiArMTE2OSwxMCBAQAogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyX3JlbW92ZV9mcm9tX2xpc3Q7CiAKKwlzdGF0dXMgPSBncGlvY2hpcF9pcnFjaGlwX2luaXRfdmFsaWRfbWFzayhjaGlwKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGVycl9yZW1vdmVfZnJvbV9saXN0OworCiAJc3RhdHVzID0gb2ZfZ3Bpb2NoaXBfYWRkKGNoaXApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyX3JlbW92ZV9jaGlwOwpAQCAtMTE5Miw2ICsxMTk4LDcgQEAKIAlhY3BpX2dwaW9jaGlwX3JlbW92ZShjaGlwKTsKIAlncGlvY2hpcF9mcmVlX2hvZ3MoY2hpcCk7CiAJb2ZfZ3Bpb2NoaXBfcmVtb3ZlKGNoaXApOworCWdwaW9jaGlwX2lycWNoaXBfZnJlZV92YWxpZF9tYXNrKGNoaXApOwogZXJyX3JlbW92ZV9mcm9tX2xpc3Q6CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOwogCWxpc3RfZGVsKCZnZGV2LT5saXN0KTsKQEAgLTEzNjMsMTkgKzEzNzAsMTUgQEAKIAkJCQkJICAgICB2b2lkICpkYXRhKSkKIHsKIAlzdHJ1Y3QgZ3Bpb19kZXZpY2UgKmdkZXY7Ci0Jc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZ2RldiwgJmdwaW9fZGV2aWNlcywgbGlzdCkKLQkJaWYgKGdkZXYtPmNoaXAgJiYgbWF0Y2goZ2Rldi0+Y2hpcCwgZGF0YSkpCisJCWlmIChnZGV2LT5jaGlwICYmIG1hdGNoKGdkZXYtPmNoaXAsIGRhdGEpKSB7CisJCQljaGlwID0gZ2Rldi0+Y2hpcDsKIAkJCWJyZWFrOwotCi0JLyogTm8gbWF0Y2g/ICovCi0JaWYgKCZnZGV2LT5saXN0ID09ICZncGlvX2RldmljZXMpCi0JCWNoaXAgPSBOVUxMOwotCWVsc2UKLQkJY2hpcCA9IGdkZXYtPmNoaXA7CisJCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOwogCkBAIC0xNDAxLDYgKzE0MDQsNDAgQEAKICAqIFRoZSBmb2xsb3dpbmcgaXMgaXJxY2hpcCBoZWxwZXIgY29kZSBmb3IgZ3Bpb2NoaXBzLgogICovCiAKK3N0YXRpYyBpbnQgZ3Bpb2NoaXBfaXJxY2hpcF9pbml0X3ZhbGlkX21hc2soc3RydWN0IGdwaW9fY2hpcCAqZ3Bpb2NoaXApCit7CisJaW50IGk7CisKKwlpZiAoIWdwaW9jaGlwLT5pcnFfbmVlZF92YWxpZF9tYXNrKQorCQlyZXR1cm4gMDsKKworCWdwaW9jaGlwLT5pcnFfdmFsaWRfbWFzayA9IGtjYWxsb2MoQklUU19UT19MT05HUyhncGlvY2hpcC0+bmdwaW8pLAorCQkJCQkgICBzaXplb2YobG9uZyksIEdGUF9LRVJORUwpOworCWlmICghZ3Bpb2NoaXAtPmlycV92YWxpZF9tYXNrKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEFzc3VtZSBieSBkZWZhdWx0IGFsbCBHUElPcyBhcmUgdmFsaWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZ3Bpb2NoaXAtPm5ncGlvOyBpKyspCisJCXNldF9iaXQoaSwgZ3Bpb2NoaXAtPmlycV92YWxpZF9tYXNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBncGlvY2hpcF9pcnFjaGlwX2ZyZWVfdmFsaWRfbWFzayhzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvY2hpcCkKK3sKKwlrZnJlZShncGlvY2hpcC0+aXJxX3ZhbGlkX21hc2spOworCWdwaW9jaGlwLT5pcnFfdmFsaWRfbWFzayA9IE5VTEw7Cit9CisKK3N0YXRpYyBib29sIGdwaW9jaGlwX2lycWNoaXBfaXJxX3ZhbGlkKGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgKmdwaW9jaGlwLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCS8qIE5vIG1hc2sgbWVhbnMgYWxsIHZhbGlkICovCisJaWYgKGxpa2VseSghZ3Bpb2NoaXAtPmlycV92YWxpZF9tYXNrKSkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIHRlc3RfYml0KG9mZnNldCwgZ3Bpb2NoaXAtPmlycV92YWxpZF9tYXNrKTsKK30KKwogLyoqCiAgKiBncGlvY2hpcF9zZXRfY2hhaW5lZF9pcnFjaGlwKCkgLSBzZXRzIGEgY2hhaW5lZCBpcnFjaGlwIHRvIGEgZ3Bpb2NoaXAKICAqIEBncGlvY2hpcDogdGhlIGdwaW9jaGlwIHRvIHNldCB0aGUgaXJxY2hpcCBjaGFpbiB0bwpAQCAtMTQ0Miw5ICsxNDc5LDEyIEBACiAJfQogCiAJLyogU2V0IHRoZSBwYXJlbnQgSVJRIGZvciBhbGwgYWZmZWN0ZWQgSVJRcyAqLwotCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZ3Bpb2NoaXAtPm5ncGlvOyBvZmZzZXQrKykKKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGdwaW9jaGlwLT5uZ3Bpbzsgb2Zmc2V0KyspIHsKKwkJaWYgKCFncGlvY2hpcF9pcnFjaGlwX2lycV92YWxpZChncGlvY2hpcCwgb2Zmc2V0KSkKKwkJCWNvbnRpbnVlOwogCQlpcnFfc2V0X3BhcmVudChpcnFfZmluZF9tYXBwaW5nKGdwaW9jaGlwLT5pcnFkb21haW4sIG9mZnNldCksCiAJCQkgICAgICAgcGFyZW50X2lycSk7CisJfQogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ3Bpb2NoaXBfc2V0X2NoYWluZWRfaXJxY2hpcCk7CiAKQEAgLTE1NTEsOSArMTU5MSwxMiBAQAogCiAJLyogUmVtb3ZlIGFsbCBJUlEgbWFwcGluZ3MgYW5kIGRlbGV0ZSB0aGUgZG9tYWluICovCiAJaWYgKGdwaW9jaGlwLT5pcnFkb21haW4pIHsKLQkJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBncGlvY2hpcC0+bmdwaW87IG9mZnNldCsrKQorCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGdwaW9jaGlwLT5uZ3Bpbzsgb2Zmc2V0KyspIHsKKwkJCWlmICghZ3Bpb2NoaXBfaXJxY2hpcF9pcnFfdmFsaWQoZ3Bpb2NoaXAsIG9mZnNldCkpCisJCQkJY29udGludWU7CiAJCQlpcnFfZGlzcG9zZV9tYXBwaW5nKAogCQkJCWlycV9maW5kX21hcHBpbmcoZ3Bpb2NoaXAtPmlycWRvbWFpbiwgb2Zmc2V0KSk7CisJCX0KIAkJaXJxX2RvbWFpbl9yZW1vdmUoZ3Bpb2NoaXAtPmlycWRvbWFpbik7CiAJfQogCkBAIC0xNTYyLDYgKzE2MDUsOCBAQAogCQlncGlvY2hpcC0+aXJxY2hpcC0+aXJxX3JlbGVhc2VfcmVzb3VyY2VzID0gTlVMTDsKIAkJZ3Bpb2NoaXAtPmlycWNoaXAgPSBOVUxMOwogCX0KKworCWdwaW9jaGlwX2lycWNoaXBfZnJlZV92YWxpZF9tYXNrKGdwaW9jaGlwKTsKIH0KIAogLyoqCkBAIC0xNTk3LDYgKzE2NDIsNyBAQAogCQkJICBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgKmxvY2tfa2V5KQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZTsKKwlib29sIGlycV9iYXNlX3NldCA9IGZhbHNlOwogCXVuc2lnbmVkIGludCBvZmZzZXQ7CiAJdW5zaWduZWQgaXJxX2Jhc2UgPSAwOwogCkBAIC0xNjE3LDYgKzE2NjMsMjAgQEAKIAlpZiAoZ3Bpb2NoaXAtPm9mX25vZGUpCiAJCW9mX25vZGUgPSBncGlvY2hpcC0+b2Zfbm9kZTsKICNlbmRpZgorCS8qCisJICogU3BlY2lmeWluZyBhIGRlZmF1bHQgdHJpZ2dlciBpcyBhIHRlcnJpYmxlIGlkZWEgaWYgRFQgb3IgQUNQSSBpcworCSAqIHVzZWQgdG8gY29uZmlndXJlIHRoZSBpbnRlcnJ1cHRzLCBhcyB5b3UgbWF5IGVuZC11cCB3aXRoCisJICogY29uZmxpY3RpbmcgdHJpZ2dlcnMuIFRlbGwgdGhlIHVzZXIsIGFuZCByZXNldCB0byBOT05FLgorCSAqLworCWlmIChXQVJOKG9mX25vZGUgJiYgdHlwZSAhPSBJUlFfVFlQRV9OT05FLAorCQkgIiVzOiBJZ25vcmluZyAlZCBkZWZhdWx0IHRyaWdnZXJcbiIsIG9mX25vZGUtPmZ1bGxfbmFtZSwgdHlwZSkpCisJCXR5cGUgPSBJUlFfVFlQRV9OT05FOworCWlmIChoYXNfYWNwaV9jb21wYW5pb24oZ3Bpb2NoaXAtPnBhcmVudCkgJiYgdHlwZSAhPSBJUlFfVFlQRV9OT05FKSB7CisJCWFjcGlfaGFuZGxlX3dhcm4oQUNQSV9IQU5ETEUoZ3Bpb2NoaXAtPnBhcmVudCksCisJCQkJICJJZ25vcmluZyAlZCBkZWZhdWx0IHRyaWdnZXJcbiIsIHR5cGUpOworCQl0eXBlID0gSVJRX1RZUEVfTk9ORTsKKwl9CisKIAlncGlvY2hpcC0+aXJxY2hpcCA9IGlycWNoaXA7CiAJZ3Bpb2NoaXAtPmlycV9oYW5kbGVyID0gaGFuZGxlcjsKIAlncGlvY2hpcC0+aXJxX2RlZmF1bHRfdHlwZSA9IHR5cGU7CkBAIC0xNjQ2LDEzICsxNzA2LDE3IEBACiAJICogbmVjZXNzYXJ5IHRvIGFsbG9jYXRlIGRlc2NyaXB0b3JzIGZvciBhbGwgSVJRcy4KIAkgKi8KIAlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGdwaW9jaGlwLT5uZ3Bpbzsgb2Zmc2V0KyspIHsKKwkJaWYgKCFncGlvY2hpcF9pcnFjaGlwX2lycV92YWxpZChncGlvY2hpcCwgb2Zmc2V0KSkKKwkJCWNvbnRpbnVlOwogCQlpcnFfYmFzZSA9IGlycV9jcmVhdGVfbWFwcGluZyhncGlvY2hpcC0+aXJxZG9tYWluLCBvZmZzZXQpOwotCQlpZiAob2Zmc2V0ID09IDApCisJCWlmICghaXJxX2Jhc2Vfc2V0KSB7CiAJCQkvKgogCQkJICogU3RvcmUgdGhlIGJhc2UgaW50byB0aGUgZ3Bpb2NoaXAgdG8gYmUgdXNlZCB3aGVuCiAJCQkgKiB1bm1hcHBpbmcgdGhlIGlycXMuCiAJCQkgKi8KIAkJCWdwaW9jaGlwLT5pcnFfYmFzZSA9IGlycV9iYXNlOworCQkJaXJxX2Jhc2Vfc2V0ID0gdHJ1ZTsKKwkJfQogCX0KIAogCWFjcGlfZ3Bpb2NoaXBfcmVxdWVzdF9pbnRlcnJ1cHRzKGdwaW9jaGlwKTsKQEAgLTE2NjQsNiArMTcyOCwxMiBAQAogI2Vsc2UgLyogQ09ORklHX0dQSU9MSUJfSVJRQ0hJUCAqLwogCiBzdGF0aWMgdm9pZCBncGlvY2hpcF9pcnFjaGlwX3JlbW92ZShzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvY2hpcCkge30KK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9jaGlwX2lycWNoaXBfaW5pdF92YWxpZF9tYXNrKHN0cnVjdCBncGlvX2NoaXAgKmdwaW9jaGlwKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIGdwaW9jaGlwX2lycWNoaXBfZnJlZV92YWxpZF9tYXNrKHN0cnVjdCBncGlvX2NoaXAgKmdwaW9jaGlwKQoreyB9CiAKICNlbmRpZiAvKiBDT05GSUdfR1BJT0xJQl9JUlFDSElQICovCiAKQEAgLTI4MTMsOTQgKzI4ODMsNiBAQAogCW11dGV4X3VubG9jaygmZ3Bpb19sb29rdXBfbG9jayk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19kZXNjICpvZl9maW5kX2dwaW8oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpjb25faWQsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IGlkeCwKLQkJCQkgICAgICBlbnVtIGdwaW9fbG9va3VwX2ZsYWdzICpmbGFncykKLXsKLQljaGFyIHByb3BfbmFtZVszMl07IC8qIDMyIGlzIG1heCBzaXplIG9mIHByb3BlcnR5IG5hbWUgKi8KLQllbnVtIG9mX2dwaW9fZmxhZ3Mgb2ZfZmxhZ3M7Ci0Jc3RydWN0IGdwaW9fZGVzYyAqZGVzYzsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdwaW9fc3VmZml4ZXMpOyBpKyspIHsKLQkJaWYgKGNvbl9pZCkKLQkJCXNucHJpbnRmKHByb3BfbmFtZSwgc2l6ZW9mKHByb3BfbmFtZSksICIlcy0lcyIsIGNvbl9pZCwKLQkJCQkgZ3Bpb19zdWZmaXhlc1tpXSk7Ci0JCWVsc2UKLQkJCXNucHJpbnRmKHByb3BfbmFtZSwgc2l6ZW9mKHByb3BfbmFtZSksICIlcyIsCi0JCQkJIGdwaW9fc3VmZml4ZXNbaV0pOwotCi0JCWRlc2MgPSBvZl9nZXRfbmFtZWRfZ3Bpb2RfZmxhZ3MoZGV2LT5vZl9ub2RlLCBwcm9wX25hbWUsIGlkeCwKLQkJCQkJCSZvZl9mbGFncyk7Ci0JCWlmICghSVNfRVJSKGRlc2MpIHx8IChQVFJfRVJSKGRlc2MpICE9IC1FTk9FTlQpKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKElTX0VSUihkZXNjKSkKLQkJcmV0dXJuIGRlc2M7Ci0KLQlpZiAob2ZfZmxhZ3MgJiBPRl9HUElPX0FDVElWRV9MT1cpCi0JCSpmbGFncyB8PSBHUElPX0FDVElWRV9MT1c7Ci0KLQlpZiAob2ZfZmxhZ3MgJiBPRl9HUElPX1NJTkdMRV9FTkRFRCkgewotCQlpZiAob2ZfZmxhZ3MgJiBPRl9HUElPX0FDVElWRV9MT1cpCi0JCQkqZmxhZ3MgfD0gR1BJT19PUEVOX0RSQUlOOwotCQllbHNlCi0JCQkqZmxhZ3MgfD0gR1BJT19PUEVOX1NPVVJDRTsKLQl9Ci0KLQlyZXR1cm4gZGVzYzsKLX0KLQotc3RhdGljIHN0cnVjdCBncGlvX2Rlc2MgKmFjcGlfZmluZF9ncGlvKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJY29uc3QgY2hhciAqY29uX2lkLAotCQkJCQl1bnNpZ25lZCBpbnQgaWR4LAotCQkJCQllbnVtIGdwaW9kX2ZsYWdzIGZsYWdzLAotCQkJCQllbnVtIGdwaW9fbG9va3VwX2ZsYWdzICpsb29rdXBmbGFncykKLXsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYgPSBBQ1BJX0NPTVBBTklPTihkZXYpOwotCXN0cnVjdCBhY3BpX2dwaW9faW5mbyBpbmZvOwotCXN0cnVjdCBncGlvX2Rlc2MgKmRlc2M7Ci0JY2hhciBwcm9wbmFtZVszMl07Ci0JaW50IGk7Ci0KLQkvKiBUcnkgZmlyc3QgZnJvbSBfRFNEICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ3Bpb19zdWZmaXhlcyk7IGkrKykgewotCQlpZiAoY29uX2lkICYmIHN0cmNtcChjb25faWQsICJncGlvcyIpKSB7Ci0JCQlzbnByaW50Zihwcm9wbmFtZSwgc2l6ZW9mKHByb3BuYW1lKSwgIiVzLSVzIiwKLQkJCQkgY29uX2lkLCBncGlvX3N1ZmZpeGVzW2ldKTsKLQkJfSBlbHNlIHsKLQkJCXNucHJpbnRmKHByb3BuYW1lLCBzaXplb2YocHJvcG5hbWUpLCAiJXMiLAotCQkJCSBncGlvX3N1ZmZpeGVzW2ldKTsKLQkJfQotCi0JCWRlc2MgPSBhY3BpX2dldF9ncGlvZF9ieV9pbmRleChhZGV2LCBwcm9wbmFtZSwgaWR4LCAmaW5mbyk7Ci0JCWlmICghSVNfRVJSKGRlc2MpIHx8IChQVFJfRVJSKGRlc2MpID09IC1FUFJPQkVfREVGRVIpKQotCQkJYnJlYWs7Ci0JfQotCi0JLyogVGhlbiBmcm9tIHBsYWluIF9DUlMgR1BJT3MgKi8KLQlpZiAoSVNfRVJSKGRlc2MpKSB7Ci0JCWlmICghYWNwaV9jYW5fZmFsbGJhY2tfdG9fY3JzKGFkZXYsIGNvbl9pZCkpCi0JCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKLQotCQlkZXNjID0gYWNwaV9nZXRfZ3Bpb2RfYnlfaW5kZXgoYWRldiwgTlVMTCwgaWR4LCAmaW5mbyk7Ci0JCWlmIChJU19FUlIoZGVzYykpCi0JCQlyZXR1cm4gZGVzYzsKLQotCQlpZiAoKGZsYWdzID09IEdQSU9EX09VVF9MT1cgfHwgZmxhZ3MgPT0gR1BJT0RfT1VUX0hJR0gpICYmCi0JCSAgICBpbmZvLmdwaW9pbnQpIHsKLQkJCWRldl9kYmcoZGV2LCAicmVmdXNpbmcgR3Bpb0ludCgpIGVudHJ5IHdoZW4gZG9pbmcgR1BJT0RfT1VUXyogbG9va3VwXG4iKTsKLQkJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwotCQl9Ci0JfQotCi0JaWYgKGluZm8ucG9sYXJpdHkgPT0gR1BJT19BQ1RJVkVfTE9XKQotCQkqbG9va3VwZmxhZ3MgfD0gR1BJT19BQ1RJVkVfTE9XOwotCi0JcmV0dXJuIGRlc2M7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgZ3Bpb2RfbG9va3VwX3RhYmxlICpncGlvZF9maW5kX2xvb2t1cF90YWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJY29uc3QgY2hhciAqZGV2X2lkID0gZGV2ID8gZGV2X25hbWUoZGV2KSA6IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5oIGIvZHJpdmVycy9ncGlvL2dwaW9saWIuaAppbmRleCAyZDllYTVlLi4zNDZmYmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5oCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogZW51bSBvZl9ncGlvX2ZsYWdzOwogZW51bSBncGlvZF9mbGFnczsKK2VudW0gZ3Bpb19sb29rdXBfZmxhZ3M7CiBzdHJ1Y3QgYWNwaV9kZXZpY2U7CiAKIC8qKgpAQCAtODYsNiArODcsMzIgQEAKIC8qIGdwaW8gc3VmZml4ZXMgdXNlZCBmb3IgQUNQSSBhbmQgZGV2aWNlIHRyZWUgbG9va3VwICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdwaW9fc3VmZml4ZXNbXSA9IHsgImdwaW9zIiwgImdwaW8iIH07CiAKKyNpZmRlZiBDT05GSUdfT0ZfR1BJTworc3RydWN0IGdwaW9fZGVzYyAqb2ZfZmluZF9ncGlvKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBjb25zdCBjaGFyICpjb25faWQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGlkeCwKKwkJCSAgICAgICBlbnVtIGdwaW9fbG9va3VwX2ZsYWdzICpmbGFncyk7CitzdHJ1Y3QgZ3Bpb19kZXNjICpvZl9nZXRfbmFtZWRfZ3Bpb2RfZmxhZ3Moc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJICAgY29uc3QgY2hhciAqbGlzdF9uYW1lLCBpbnQgaW5kZXgsIGVudW0gb2ZfZ3Bpb19mbGFncyAqZmxhZ3MpOworaW50IG9mX2dwaW9jaGlwX2FkZChzdHJ1Y3QgZ3Bpb19jaGlwICpnYyk7Cit2b2lkIG9mX2dwaW9jaGlwX3JlbW92ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYyk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZ3Bpb19kZXNjICpvZl9maW5kX2dwaW8oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKmNvbl9pZCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgaWR4LAorCQkJCQkgICAgIGVudW0gZ3Bpb19sb29rdXBfZmxhZ3MgKmZsYWdzKQoreworCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZ3Bpb19kZXNjICpvZl9nZXRfbmFtZWRfZ3Bpb2RfZmxhZ3Moc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJICAgY29uc3QgY2hhciAqbGlzdF9uYW1lLCBpbnQgaW5kZXgsIGVudW0gb2ZfZ3Bpb19mbGFncyAqZmxhZ3MpCit7CisJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7Cit9CitzdGF0aWMgaW5saW5lIGludCBvZl9ncGlvY2hpcF9hZGQoc3RydWN0IGdwaW9fY2hpcCAqZ2MpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBvZl9ncGlvY2hpcF9yZW1vdmUoc3RydWN0IGdwaW9fY2hpcCAqZ2MpIHsgfQorI2VuZGlmIC8qIENPTkZJR19PRl9HUElPICovCisKICNpZmRlZiBDT05GSUdfQUNQSQogdm9pZCBhY3BpX2dwaW9jaGlwX2FkZChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwKTsKIHZvaWQgYWNwaV9ncGlvY2hpcF9yZW1vdmUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCk7CkBAIC05Myw5ICsxMjAsMTEgQEAKIHZvaWQgYWNwaV9ncGlvY2hpcF9yZXF1ZXN0X2ludGVycnVwdHMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCk7CiB2b2lkIGFjcGlfZ3Bpb2NoaXBfZnJlZV9pbnRlcnJ1cHRzKHN0cnVjdCBncGlvX2NoaXAgKmNoaXApOwogCi1zdHJ1Y3QgZ3Bpb19kZXNjICphY3BpX2dldF9ncGlvZF9ieV9pbmRleChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsCi0JCQkJCSAgY29uc3QgY2hhciAqcHJvcG5hbWUsIGludCBpbmRleCwKLQkJCQkJICBzdHJ1Y3QgYWNwaV9ncGlvX2luZm8gKmluZm8pOworc3RydWN0IGdwaW9fZGVzYyAqYWNwaV9maW5kX2dwaW8oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBjb25zdCBjaGFyICpjb25faWQsCisJCQkJIHVuc2lnbmVkIGludCBpZHgsCisJCQkJIGVudW0gZ3Bpb2RfZmxhZ3MgZmxhZ3MsCisJCQkJIGVudW0gZ3Bpb19sb29rdXBfZmxhZ3MgKmxvb2t1cGZsYWdzKTsKIHN0cnVjdCBncGlvX2Rlc2MgKmFjcGlfbm9kZV9nZXRfZ3Bpb2Qoc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSwKIAkJCQkgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwgaW50IGluZGV4LAogCQkJCSAgICAgIHN0cnVjdCBhY3BpX2dwaW9faW5mbyAqaW5mbyk7CkBAIC0xMTQsMTAgKzE0MywxMSBAQAogYWNwaV9ncGlvY2hpcF9mcmVlX2ludGVycnVwdHMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCkgeyB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGdwaW9fZGVzYyAqCi1hY3BpX2dldF9ncGlvZF9ieV9pbmRleChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsIGNvbnN0IGNoYXIgKnByb3BuYW1lLAotCQkJaW50IGluZGV4LCBzdHJ1Y3QgYWNwaV9ncGlvX2luZm8gKmluZm8pCithY3BpX2ZpbmRfZ3BpbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmNvbl9pZCwKKwkgICAgICAgdW5zaWduZWQgaW50IGlkeCwgZW51bSBncGlvZF9mbGFncyBmbGFncywKKwkgICAgICAgZW51bSBncGlvX2xvb2t1cF9mbGFncyAqbG9va3VwZmxhZ3MpCiB7Ci0JcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7CisJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CiB9CiBzdGF0aWMgaW5saW5lIHN0cnVjdCBncGlvX2Rlc2MgKgogYWNwaV9ub2RlX2dldF9ncGlvZChzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlLCBjb25zdCBjaGFyICpwcm9wbmFtZSwKQEAgLTEzNyw5ICsxNjcsNiBAQAogfQogI2VuZGlmCiAKLXN0cnVjdCBncGlvX2Rlc2MgKm9mX2dldF9uYW1lZF9ncGlvZF9mbGFncyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkgICBjb25zdCBjaGFyICpsaXN0X25hbWUsIGludCBpbmRleCwgZW51bSBvZl9ncGlvX2ZsYWdzICpmbGFncyk7Ci0KIHN0cnVjdCBncGlvX2Rlc2MgKmdwaW9jaGlwX2dldF9kZXNjKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHUxNiBod251bSk7CiB2b2lkIGdwaW9kX3NldF9hcnJheV92YWx1ZV9jb21wbGV4KGJvb2wgcmF3LCBib29sIGNhbl9zbGVlcCwKIAkJCQkgICB1bnNpZ25lZCBpbnQgYXJyYXlfc2l6ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdS5oIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1LmgKaW5kZXggOGViYzVmMS4uNzAwYzU2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1LmgKQEAgLTQyNiw2ICs0MjYsOCBAQAogCiAJLyogY3VzdG9tIExSVSBtYW5hZ2VtZW50ICovCiAJc3RydWN0IGFtZGdwdV9tbWFuX2xydQkJCWxvZzJfc2l6ZVtBTURHUFVfVFRNX0xSVV9TSVpFXTsKKwkvKiBndWFyZCBmb3IgbG9nMl9zaXplIGFycmF5LCBkb24ndCBhZGQgYW55dGhpbmcgaW4gYmV0d2VlbiAqLworCXN0cnVjdCBhbWRncHVfbW1hbl9scnUJCQlndWFyZDsKIH07CiAKIGludCBhbWRncHVfY29weV9idWZmZXIoc3RydWN0IGFtZGdwdV9yaW5nICpyaW5nLApAQCAtNjQ2LDkgKzY0OCw5IEBACiB2b2lkIGFtZGdwdV9nYXJ0X3RhYmxlX3ZyYW1fdW5waW4oc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpOwogaW50IGFtZGdwdV9nYXJ0X2luaXQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpOwogdm9pZCBhbWRncHVfZ2FydF9maW5pKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KTsKLXZvaWQgYW1kZ3B1X2dhcnRfdW5iaW5kKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCB1bnNpZ25lZCBvZmZzZXQsCit2b2lkIGFtZGdwdV9nYXJ0X3VuYmluZChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwgdWludDY0X3Qgb2Zmc2V0LAogCQkJaW50IHBhZ2VzKTsKLWludCBhbWRncHVfZ2FydF9iaW5kKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCB1bnNpZ25lZCBvZmZzZXQsCitpbnQgYW1kZ3B1X2dhcnRfYmluZChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwgdWludDY0X3Qgb2Zmc2V0LAogCQkgICAgIGludCBwYWdlcywgc3RydWN0IHBhZ2UgKipwYWdlbGlzdCwKIAkJICAgICBkbWFfYWRkcl90ICpkbWFfYWRkciwgdWludDMyX3QgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYXRvbWJpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hdG9tYmlvcy5jCmluZGV4IDk4MzE3NTMuLmZlODcyYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hdG9tYmlvcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hdG9tYmlvcy5jCkBAIC0zMjEsNiArMzIxLDE5IEBACiAJCQkgICAgKGxlMTZfdG9fY3B1KHBhdGgtPnVzQ29ubk9iamVjdElkKSAmCiAJCQkgICAgIE9CSkVDVF9UWVBFX01BU0spID4+IE9CSkVDVF9UWVBFX1NISUZUOwogCisJCQkvKiBTa2lwIFRWL0NWIHN1cHBvcnQgKi8KKwkJCWlmICgobGUxNl90b19jcHUocGF0aC0+dXNEZXZpY2VUYWcpID09CisJCQkgICAgIEFUT01fREVWSUNFX1RWMV9TVVBQT1JUKSB8fAorCQkJICAgIChsZTE2X3RvX2NwdShwYXRoLT51c0RldmljZVRhZykgPT0KKwkJCSAgICAgQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCisJCQkJY29udGludWU7CisKKwkJCWlmIChjb25fb2JqX2lkID49IEFSUkFZX1NJWkUob2JqZWN0X2Nvbm5lY3Rvcl9jb252ZXJ0KSkgeworCQkJCURSTV9FUlJPUigiaW52YWxpZCBjb25fb2JqX2lkICVkIGZvciBkZXZpY2UgdGFnIDB4JTA0eFxuIiwKKwkJCQkJICBjb25fb2JqX2lkLCBsZTE2X3RvX2NwdShwYXRoLT51c0RldmljZVRhZykpOworCQkJCWNvbnRpbnVlOworCQkJfQorCiAJCQljb25uZWN0b3JfdHlwZSA9CiAJCQkJb2JqZWN0X2Nvbm5lY3Rvcl9jb252ZXJ0W2Nvbl9vYmpfaWRdOwogCQkJY29ubmVjdG9yX29iamVjdF9pZCA9IGNvbl9vYmpfaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYXRweF9oYW5kbGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYXRweF9oYW5kbGVyLmMKaW5kZXggNDlkZTkyNi4uMTBiNWRkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2F0cHhfaGFuZGxlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hdHB4X2hhbmRsZXIuYwpAQCAtMjAwLDE2ICsyMDAsNyBAQAogCWF0cHgtPmlzX2h5YnJpZCA9IGZhbHNlOwogCWlmICh2YWxpZF9iaXRzICYgQVRQWF9NU19IWUJSSURfR0ZYX1NVUFBPUlRFRCkgewogCQlwcmludGsoIkFUUFggSHlicmlkIEdyYXBoaWNzXG4iKTsKLSNpZiAxCi0JCS8qIFRoaXMgaXMgYSB0ZW1wb3JhcnkgaGFjayB1bnRpbCB0aGUgRDMgY29sZCBzdXBwb3J0Ci0JCSAqIG1ha2VzIGl0IHVwc3RyZWFtLiAgVGhlIEFUUFggcG93ZXJfY29udHJvbCBtZXRob2Qgc2VlbXMKLQkJICogdG8gc3RpbGwgd29yayBvbiBldmVuIGlmIHRoZSBzeXN0ZW0gc2hvdWxkIGJlIHVzaW5nCi0JCSAqIHRoZSBuZXcgc3RhbmRhcmRpemVkIGh5YnJpZCBEMyBjb2xkIEFDUEkgaW50ZXJmYWNlLgotCQkgKi8KLQkJYXRweC0+ZnVuY3Rpb25zLnBvd2VyX2NudGwgPSB0cnVlOwotI2Vsc2UKIAkJYXRweC0+ZnVuY3Rpb25zLnBvd2VyX2NudGwgPSBmYWxzZTsKLSNlbmRpZgogCQlhdHB4LT5pc19oeWJyaWQgPSB0cnVlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2RldmljZS5jIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2RldmljZS5jCmluZGV4IGRmN2FiMjQ1Li4zOWMwMWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZGV2aWNlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2RldmljZS5jCkBAIC0xNzA4LDExICsxNzA4LDExIEBACiAKIAlEUk1fSU5GTygiYW1kZ3B1OiBmaW5pc2hpbmcgZGV2aWNlLlxuIik7CiAJYWRldi0+c2h1dGRvd24gPSB0cnVlOworCWRybV9jcnRjX2ZvcmNlX2Rpc2FibGVfYWxsKGFkZXYtPmRkZXYpOwogCS8qIGV2aWN0IHZyYW0gbWVtb3J5ICovCiAJYW1kZ3B1X2JvX2V2aWN0X3ZyYW0oYWRldik7CiAJYW1kZ3B1X2liX3Bvb2xfZmluaShhZGV2KTsKIAlhbWRncHVfZmVuY2VfZHJpdmVyX2ZpbmkoYWRldik7Ci0JZHJtX2NydGNfZm9yY2VfZGlzYWJsZV9hbGwoYWRldi0+ZGRldik7CiAJYW1kZ3B1X2ZiZGV2X2ZpbmkoYWRldik7CiAJciA9IGFtZGdwdV9maW5pKGFkZXYpOwogCWtmcmVlKGFkZXYtPmlwX2Jsb2NrX3N0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZ2FydC5jIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2dhcnQuYwppbmRleCA5MjFiY2UyLi4wZmVlYTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZ2FydC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9nYXJ0LmMKQEAgLTIyMSw3ICsyMjEsNyBAQAogICogVW5iaW5kcyB0aGUgcmVxdWVzdGVkIHBhZ2VzIGZyb20gdGhlIGdhcnQgcGFnZSB0YWJsZSBhbmQKICAqIHJlcGxhY2VzIHRoZW0gd2l0aCB0aGUgZHVtbXkgcGFnZSAoYWxsIGFzaWNzKS4KICAqLwotdm9pZCBhbWRncHVfZ2FydF91bmJpbmQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsIHVuc2lnbmVkIG9mZnNldCwKK3ZvaWQgYW1kZ3B1X2dhcnRfdW5iaW5kKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCB1aW50NjRfdCBvZmZzZXQsCiAJCQlpbnQgcGFnZXMpCiB7CiAJdW5zaWduZWQgdDsKQEAgLTI2OCw3ICsyNjgsNyBAQAogICogKGFsbCBhc2ljcykuCiAgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIC1FSU5WQUwgZm9yIGZhaWx1cmUuCiAgKi8KLWludCBhbWRncHVfZ2FydF9iaW5kKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCB1bnNpZ25lZCBvZmZzZXQsCitpbnQgYW1kZ3B1X2dhcnRfYmluZChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwgdWludDY0X3Qgb2Zmc2V0LAogCQkgICAgIGludCBwYWdlcywgc3RydWN0IHBhZ2UgKipwYWdlbGlzdCwgZG1hX2FkZHJfdCAqZG1hX2FkZHIsCiAJCSAgICAgdWludDMyX3QgZmxhZ3MpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfaWIuYyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9pYi5jCmluZGV4IGEzMWQ3ZWYuLmVjMTI4MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9pYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9pYi5jCkBAIC0yODAsNyArMjgwLDcgQEAKIGludCBhbWRncHVfaWJfcmluZ190ZXN0cyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKIHsKIAl1bnNpZ25lZCBpOwotCWludCByOworCWludCByLCByZXQgPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IEFNREdQVV9NQVhfUklOR1M7ICsraSkgewogCQlzdHJ1Y3QgYW1kZ3B1X3JpbmcgKnJpbmcgPSBhZGV2LT5yaW5nc1tpXTsKQEAgLTMwMSwxMCArMzAxLDExIEBACiAJCQl9IGVsc2UgewogCQkJCS8qIHN0aWxsIG5vdCBnb29kLCBidXQgd2UgY2FuIGxpdmUgd2l0aCBpdCAqLwogCQkJCURSTV9FUlJPUigiYW1kZ3B1OiBmYWlsZWQgdGVzdGluZyBJQiBvbiByaW5nICVkICglZCkuXG4iLCBpLCByKTsKKwkJCQlyZXQgPSByOwogCQkJfQogCQl9CiAJfQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmMKaW5kZXggOWI2MWM4Yi4uNzE2ZjJhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uYwpAQCAtMjUxLDggKzI1MSw4IEBACiAKIAlhZGV2ID0gYW1kZ3B1X2dldF9hZGV2KGJvLT5iZGV2KTsKIAlyaW5nID0gYWRldi0+bW1hbi5idWZmZXJfZnVuY3NfcmluZzsKLQlvbGRfc3RhcnQgPSBvbGRfbWVtLT5zdGFydCA8PCBQQUdFX1NISUZUOwotCW5ld19zdGFydCA9IG5ld19tZW0tPnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CisJb2xkX3N0YXJ0ID0gKHU2NClvbGRfbWVtLT5zdGFydCA8PCBQQUdFX1NISUZUOworCW5ld19zdGFydCA9ICh1NjQpbmV3X21lbS0+c3RhcnQgPDwgUEFHRV9TSElGVDsKIAogCXN3aXRjaCAob2xkX21lbS0+bWVtX3R5cGUpIHsKIAljYXNlIFRUTV9QTF9WUkFNOgpAQCAtOTUwLDYgKzk1MCw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqcmVzID0gbHJ1LT5scnVbdGJvLT5tZW0ubWVtX3R5cGVdOwogCiAJbHJ1LT5scnVbdGJvLT5tZW0ubWVtX3R5cGVdID0gJnRiby0+bHJ1OworCXdoaWxlICgoKytscnUpLT5scnVbdGJvLT5tZW0ubWVtX3R5cGVdID09IHJlcykKKwkJbHJ1LT5scnVbdGJvLT5tZW0ubWVtX3R5cGVdID0gJnRiby0+bHJ1OwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTk2MCw2ICs5NjIsOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnJlcyA9IGxydS0+c3dhcF9scnU7CiAKIAlscnUtPnN3YXBfbHJ1ID0gJnRiby0+c3dhcDsKKwl3aGlsZSAoKCsrbHJ1KS0+c3dhcF9scnUgPT0gcmVzKQorCQlscnUtPnN3YXBfbHJ1ID0gJnRiby0+c3dhcDsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xMDExLDYgKzEwMTUsMTAgQEAKIAkJbHJ1LT5zd2FwX2xydSA9ICZhZGV2LT5tbWFuLmJkZXYuZ2xvYi0+c3dhcF9scnU7CiAJfQogCisJZm9yIChqID0gMDsgaiA8IFRUTV9OVU1fTUVNX1RZUEVTOyArK2opCisJCWFkZXYtPm1tYW4uZ3VhcmQubHJ1W2pdID0gTlVMTDsKKwlhZGV2LT5tbWFuLmd1YXJkLnN3YXBfbHJ1ID0gTlVMTDsKKwogCWFkZXYtPm1tYW4uaW5pdGlhbGl6ZWQgPSB0cnVlOwogCXIgPSB0dG1fYm9faW5pdF9tbSgmYWRldi0+bW1hbi5iZGV2LCBUVE1fUExfVlJBTSwKIAkJCQlhZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSA+PiBQQUdFX1NISUZUKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV91dmQuYyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV91dmQuYwppbmRleCBiMTFmNGU4Li40YWE5OTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdXZkLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3V2ZC5jCkBAIC0xMTg3LDcgKzExODcsOCBAQAogCQlyID0gMDsKIAl9CiAKLWVycm9yOgogCWZlbmNlX3B1dChmZW5jZSk7CisKK2Vycm9yOgogCXJldHVybiByOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdm0uYwppbmRleCA4ZTY0MmZjLi44MDEyMGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdm0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdm0uYwpAQCAtMTUzNSw3ICsxNTM1LDcgQEAKIAlyID0gYW1kX3NjaGVkX2VudGl0eV9pbml0KCZyaW5nLT5zY2hlZCwgJnZtLT5lbnRpdHksCiAJCQkJICBycSwgYW1kZ3B1X3NjaGVkX2pvYnMpOwogCWlmIChyKQotCQlyZXR1cm4gcjsKKwkJZ290byBlcnI7CiAKIAl2bS0+cGFnZV9kaXJlY3RvcnlfZmVuY2UgPSBOVUxMOwogCkBAIC0xNTY1LDYgKzE1NjUsOSBAQAogZXJyb3JfZnJlZV9zY2hlZF9lbnRpdHk6CiAJYW1kX3NjaGVkX2VudGl0eV9maW5pKCZyaW5nLT5zY2hlZCwgJnZtLT5lbnRpdHkpOwogCitlcnI6CisJZHJtX2ZyZWVfbGFyZ2Uodm0tPnBhZ2VfdGFibGVzKTsKKwogCXJldHVybiByOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9jaWtfc2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvY2lrX3NkbWEuYwppbmRleCBlZTY0NjY5Li43N2ZkZDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9jaWtfc2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2Npa19zZG1hLmMKQEAgLTUyLDYgKzUyLDcgQEAKIHN0YXRpYyB2b2lkIGNpa19zZG1hX3NldF9pcnFfZnVuY3Moc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpOwogc3RhdGljIHZvaWQgY2lrX3NkbWFfc2V0X2J1ZmZlcl9mdW5jcyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldik7CiBzdGF0aWMgdm9pZCBjaWtfc2RtYV9zZXRfdm1fcHRlX2Z1bmNzKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KTsKK3N0YXRpYyBpbnQgY2lrX3NkbWFfc29mdF9yZXNldCh2b2lkICpoYW5kbGUpOwogCiBNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9ib25haXJlX3NkbWEuYmluIik7CiBNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9ib25haXJlX3NkbWExLmJpbiIpOwpAQCAtMTAzNyw2ICsxMDM4LDggQEAKIHsKIAlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9IChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqKWhhbmRsZTsKIAorCWNpa19zZG1hX3NvZnRfcmVzZXQoaGFuZGxlKTsKKwogCXJldHVybiBjaWtfc2RtYV9od19pbml0KGFkZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9nZnhfdjdfMC5jIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvZ2Z4X3Y3XzAuYwppbmRleCBkODY5ZDA1Li40MjU0MTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9nZnhfdjdfMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2dmeF92N18wLmMKQEAgLTI3NTUsOCArMjc1NSw3IEBACiAJdTY0IHdiX2dwdV9hZGRyOwogCXUzMiAqYnVmOwogCXN0cnVjdCBib25haXJlX21xZCAqbXFkOwotCi0JZ2Z4X3Y3XzBfY3BfY29tcHV0ZV9lbmFibGUoYWRldiwgdHJ1ZSk7CisJc3RydWN0IGFtZGdwdV9yaW5nICpyaW5nOwogCiAJLyogZml4IHVwIGNoaWNrZW4gYml0cyAqLwogCXRtcCA9IFJSRUczMihtbUNQX0NQRl9ERUJVRyk7CkBAIC0yNzkxLDcgKzI3OTAsNyBAQAogCiAJLyogaW5pdCB0aGUgcXVldWVzLiAgSnVzdCB0d28gZm9yIG5vdy4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgYWRldi0+Z2Z4Lm51bV9jb21wdXRlX3JpbmdzOyBpKyspIHsKLQkJc3RydWN0IGFtZGdwdV9yaW5nICpyaW5nID0gJmFkZXYtPmdmeC5jb21wdXRlX3JpbmdbaV07CisJCXJpbmcgPSAmYWRldi0+Z2Z4LmNvbXB1dGVfcmluZ1tpXTsKIAogCQlpZiAocmluZy0+bXFkX29iaiA9PSBOVUxMKSB7CiAJCQlyID0gYW1kZ3B1X2JvX2NyZWF0ZShhZGV2LApAQCAtMjk3MCw2ICsyOTY5LDEzIEBACiAJCWFtZGdwdV9ib191bnJlc2VydmUocmluZy0+bXFkX29iaik7CiAKIAkJcmluZy0+cmVhZHkgPSB0cnVlOworCX0KKworCWdmeF92N18wX2NwX2NvbXB1dGVfZW5hYmxlKGFkZXYsIHRydWUpOworCisJZm9yIChpID0gMDsgaSA8IGFkZXYtPmdmeC5udW1fY29tcHV0ZV9yaW5nczsgaSsrKSB7CisJCXJpbmcgPSAmYWRldi0+Z2Z4LmNvbXB1dGVfcmluZ1tpXTsKKwogCQlyID0gYW1kZ3B1X3JpbmdfdGVzdF9yaW5nKHJpbmcpOwogCQlpZiAocikKIAkJCXJpbmctPnJlYWR5ID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9zZG1hX3YyXzQuYyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L3NkbWFfdjJfNC5jCmluZGV4IDEzNTFjN2UuLmE2NDcxNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L3NkbWFfdjJfNC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L3NkbWFfdjJfNC5jCkBAIC03MTQsNyArNzE0LDcgQEAKIAkJRFJNX0VSUk9SKCJhbWRncHU6IElCIHRlc3QgdGltZWQgb3V0XG4iKTsKIAkJciA9IC1FVElNRURPVVQ7CiAJCWdvdG8gZXJyMTsKLQl9IGVsc2UgaWYgKHIpIHsKKwl9IGVsc2UgaWYgKHIgPCAwKSB7CiAJCURSTV9FUlJPUigiYW1kZ3B1OiBmZW5jZSB3YWl0IGZhaWxlZCAoJWxkKS5cbiIsIHIpOwogCQlnb3RvIGVycjE7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRrZmQva2ZkX2Rvb3JiZWxsLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGtmZC9rZmRfZG9vcmJlbGwuYwppbmRleCBlNjIxZWJhLi5hN2QzY2IzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGtmZC9rZmRfZG9vcmJlbGwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGtmZC9rZmRfZG9vcmJlbGwuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJCQkJCQkJc2l6ZW9mKHUzMikpICsgaW54OwogCiAJcHJfZGVidWcoImtmZDogZ2V0IGtlcm5lbCBxdWV1ZSBkb29yYmVsbFxuIgotCQkJICIgICAgIGRvb3JiZWxsIG9mZnNldCAgID09IDB4JTA4ZFxuIgorCQkJICIgICAgIGRvb3JiZWxsIG9mZnNldCAgID09IDB4JTA4WFxuIgogCQkJICIgICAgIGtlcm5lbCBhZGRyZXNzICAgID09IDB4JTA4bFhcbiIsCiAJCSpkb29yYmVsbF9vZmYsICh1aW50cHRyX3QpKGtmZC0+ZG9vcmJlbGxfa2VybmVsX3B0ciArIGlueCkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL3NjaGVkdWxlci9ncHVfc2NoZWR1bGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3NjaGVkdWxlci9ncHVfc2NoZWR1bGVyLmMKaW5kZXggZWYzMTJiYi4uOTYzYTI0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9zY2hlZHVsZXIvZ3B1X3NjaGVkdWxlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvc2NoZWR1bGVyL2dwdV9zY2hlZHVsZXIuYwpAQCAtNDA1LDcgKzQwNSw3IEBACiAJc3Bpbl9sb2NrKCZzY2hlZC0+am9iX2xpc3RfbG9jayk7CiAJc19qb2IgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJnNjaGVkLT5yaW5nX21pcnJvcl9saXN0LAogCQkJCQkgc3RydWN0IGFtZF9zY2hlZF9qb2IsIG5vZGUpOwotCWlmIChzX2pvYikKKwlpZiAoc19qb2IgJiYgc2NoZWQtPnRpbWVvdXQgIT0gTUFYX1NDSEVEVUxFX1RJTUVPVVQpCiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmc19qb2ItPndvcmtfdGRyLCBzY2hlZC0+dGltZW91dCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc19qb2IsIHRtcCwgJnNjaGVkLT5yaW5nX21pcnJvcl9saXN0LCBub2RlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxjZGMvYXRtZWxfaGxjZGNfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL2F0bWVsLWhsY2RjL2F0bWVsX2hsY2RjX2NydGMuYwppbmRleCBhOTc4MzgxLi45YjE3YTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxjZGMvYXRtZWxfaGxjZGNfY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hdG1lbC1obGNkYy9hdG1lbF9obGNkY19jcnRjLmMKQEAgLTM4Nyw3ICszODcsNyBAQAogCWF0bWVsX2hsY2RjX2NydGNfZmluaXNoX3BhZ2VfZmxpcChkcm1fY3J0Y190b19hdG1lbF9obGNkY19jcnRjKGMpKTsKIH0KIAotdm9pZCBhdG1lbF9obGNkY19jcnRjX3Jlc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3N0YXRpYyB2b2lkIGF0bWVsX2hsY2RjX2NydGNfcmVzZXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQogewogCXN0cnVjdCBhdG1lbF9obGNkY19jcnRjX3N0YXRlICpzdGF0ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2F0bWVsLWhsY2RjL2F0bWVsX2hsY2RjX3BsYW5lLmMgYi9kcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxjZGMvYXRtZWxfaGxjZGNfcGxhbmUuYwppbmRleCAwMTZjMTkxLi41MmM1MjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxjZGMvYXRtZWxfaGxjZGNfcGxhbmUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxjZGMvYXRtZWxfaGxjZGNfcGxhbmUuYwpAQCAtMzIwLDE5ICszMjAsMTkgQEAKIAkJCXUzMiAqY29lZmZfdGFiID0gaGVvX3Vwc2NhbGluZ195Y29lZjsKIAkJCXUzMiBtYXhfbWVtc2l6ZTsKIAotCQkJaWYgKHN0YXRlLT5jcnRjX3cgPCBzdGF0ZS0+c3JjX3cpCisJCQlpZiAoc3RhdGUtPmNydGNfaCA8IHN0YXRlLT5zcmNfaCkKIAkJCQljb2VmZl90YWIgPSBoZW9fZG93bnNjYWxpbmdfeWNvZWY7CiAJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShoZW9fdXBzY2FsaW5nX3ljb2VmKTsgaSsrKQogCQkJCWF0bWVsX2hsY2RjX2xheWVyX3VwZGF0ZV9jZmcoJnBsYW5lLT5sYXllciwKIAkJCQkJCQkgICAgIDMzICsgaSwKIAkJCQkJCQkgICAgIDB4ZmZmZmZmZmYsCiAJCQkJCQkJICAgICBjb2VmZl90YWJbaV0pOwotCQkJZmFjdG9yID0gKCg4ICogMjU2ICogc3RhdGUtPnNyY193KSAtICgyNTYgKiA0KSkgLwotCQkJCSBzdGF0ZS0+Y3J0Y193OworCQkJZmFjdG9yID0gKCg4ICogMjU2ICogc3RhdGUtPnNyY19oKSAtICgyNTYgKiA0KSkgLworCQkJCSBzdGF0ZS0+Y3J0Y19oOwogCQkJZmFjdG9yKys7Ci0JCQltYXhfbWVtc2l6ZSA9ICgoZmFjdG9yICogc3RhdGUtPmNydGNfdykgKyAoMjU2ICogNCkpIC8KKwkJCW1heF9tZW1zaXplID0gKChmYWN0b3IgKiBzdGF0ZS0+Y3J0Y19oKSArICgyNTYgKiA0KSkgLwogCQkJCSAgICAgIDIwNDg7Ci0JCQlpZiAobWF4X21lbXNpemUgPiBzdGF0ZS0+c3JjX3cpCisJCQlpZiAobWF4X21lbXNpemUgPiBzdGF0ZS0+c3JjX2gpCiAJCQkJZmFjdG9yLS07CiAJCQlmYWN0b3JfcmVnIHw9IChmYWN0b3IgPDwgMTYpIHwgMHg4MDAwMDAwMDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljLmMKaW5kZXggZmEzOTMwNy4uMmEzZGVkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pYy5jCkBAIC00NzUsNyArNDc1LDcgQEAKIAkJCQkJdmFsLAogCQkJCQktMSwKIAkJCQkJJnJlcGxhY2VkKTsKLQkJc3RhdGUtPmNvbG9yX21nbXRfY2hhbmdlZCA9IHJlcGxhY2VkOworCQlzdGF0ZS0+Y29sb3JfbWdtdF9jaGFuZ2VkIHw9IHJlcGxhY2VkOwogCQlyZXR1cm4gcmV0OwogCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gY29uZmlnLT5jdG1fcHJvcGVydHkpIHsKIAkJcmV0ID0gZHJtX2F0b21pY19yZXBsYWNlX3Byb3BlcnR5X2Jsb2JfZnJvbV9pZChjcnRjLApAQCAtNDgzLDcgKzQ4Myw3IEBACiAJCQkJCXZhbCwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBkcm1fY29sb3JfY3RtKSwKIAkJCQkJJnJlcGxhY2VkKTsKLQkJc3RhdGUtPmNvbG9yX21nbXRfY2hhbmdlZCA9IHJlcGxhY2VkOworCQlzdGF0ZS0+Y29sb3JfbWdtdF9jaGFuZ2VkIHw9IHJlcGxhY2VkOwogCQlyZXR1cm4gcmV0OwogCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gY29uZmlnLT5nYW1tYV9sdXRfcHJvcGVydHkpIHsKIAkJcmV0ID0gZHJtX2F0b21pY19yZXBsYWNlX3Byb3BlcnR5X2Jsb2JfZnJvbV9pZChjcnRjLApAQCAtNDkxLDcgKzQ5MSw3IEBACiAJCQkJCXZhbCwKIAkJCQkJLTEsCiAJCQkJCSZyZXBsYWNlZCk7Ci0JCXN0YXRlLT5jb2xvcl9tZ210X2NoYW5nZWQgPSByZXBsYWNlZDsKKwkJc3RhdGUtPmNvbG9yX21nbXRfY2hhbmdlZCB8PSByZXBsYWNlZDsKIAkJcmV0dXJuIHJldDsKIAl9IGVsc2UgaWYgKGNydGMtPmZ1bmNzLT5hdG9taWNfc2V0X3Byb3BlcnR5KQogCQlyZXR1cm4gY3J0Yy0+ZnVuY3MtPmF0b21pY19zZXRfcHJvcGVydHkoY3J0Yywgc3RhdGUsIHByb3BlcnR5LCB2YWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYwppbmRleCBiMWRiYjYwLi5kZGViZTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYwpAQCAtNTQwNCw2ICs1NDA0LDkgQEAKIAlzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICplID0gTlVMTDsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAorCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAocGFnZV9mbGlwLT5mbGFncyAmIH5EUk1fTU9ERV9QQUdFX0ZMSVBfRkxBR1MgfHwKIAkgICAgcGFnZV9mbGlwLT5yZXNlcnZlZCAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCmluZGV4IGNlNTRlOTguLjBhMDZmOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAKIAkvKiBTb21ldGltZXMgdXNlciBzcGFjZSB3YW50cyBldmVyeXRoaW5nIGRpc2FibGVkLCBzbyBkb24ndCBzdGVhbCB0aGUKIAkgKiBkaXNwbGF5IGlmIHRoZXJlJ3MgYSBtYXN0ZXIuICovCi0JaWYgKGxvY2tsZXNzX2RlcmVmZXJlbmNlKGRldi0+bWFzdGVyKSkKKwlpZiAoUkVBRF9PTkNFKGRldi0+bWFzdGVyKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJZHJtX2Zvcl9lYWNoX2NydGMoY3J0YywgZGV2KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2lvYzMyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2lvYzMyLmMKaW5kZXggNTc2NzZmOC4uYTYyODk3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9pb2MzMi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faW9jMzIuYwpAQCAtMTAxNSw2ICsxMDE1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmIGRlZmluZWQoQ09ORklHX1g4NikgfHwgZGVmaW5lZChDT05GSUdfSUE2NCkKIHR5cGVkZWYgc3RydWN0IGRybV9tb2RlX2ZiX2NtZDIzMiB7CiAJdTMyIGZiX2lkOwogCXUzMiB3aWR0aDsKQEAgLTEwNzEsNiArMTA3Miw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgogCiBzdGF0aWMgZHJtX2lvY3RsX2NvbXBhdF90ICpkcm1fY29tcGF0X2lvY3Rsc1tdID0gewogCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1ZFUlNJT04zMildID0gY29tcGF0X2RybV92ZXJzaW9uLApAQCAtMTEwNCw3ICsxMTA2LDkgQEAKIAlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9VUERBVEVfRFJBVzMyKV0gPSBjb21wYXRfZHJtX3VwZGF0ZV9kcmF3LAogI2VuZGlmCiAJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfV0FJVF9WQkxBTkszMildID0gY29tcGF0X2RybV93YWl0X3ZibGFuaywKKyNpZiBkZWZpbmVkKENPTkZJR19YODYpIHx8IGRlZmluZWQoQ09ORklHX0lBNjQpCiAJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfTU9ERV9BRERGQjIzMildID0gY29tcGF0X2RybV9tb2RlX2FkZGZiMiwKKyNlbmRpZgogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2dwdS5jIGIvZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9ncHUuYwppbmRleCA4N2VmMzQxLi5iMzgyY2Y1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2dwdS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0bmF2aXZfZ3B1LmMKQEAgLTEzMzMsOCArMTMzMyw2IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQltdXRleF9sb2NrKCZncHUtPmxvY2spOwotCiAJLyoKIAkgKiBUT0RPCiAJICoKQEAgLTEzNDgsMTYgKzEzNDYsMTggQEAKIAlpZiAodW5saWtlbHkoZXZlbnQgPT0gfjBVKSkgewogCQlEUk1fRVJST1IoIm5vIGZyZWUgZXZlbnRcbiIpOwogCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0X3VubG9jazsKKwkJZ290byBvdXRfcG1fcHV0OwogCX0KIAogCWZlbmNlID0gZXRuYXZpdl9ncHVfZmVuY2VfYWxsb2MoZ3B1KTsKIAlpZiAoIWZlbmNlKSB7CiAJCWV2ZW50X2ZyZWUoZ3B1LCBldmVudCk7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3VubG9jazsKKwkJZ290byBvdXRfcG1fcHV0OwogCX0KIAorCW11dGV4X2xvY2soJmdwdS0+bG9jayk7CisKIAlncHUtPmV2ZW50W2V2ZW50XS5mZW5jZSA9IGZlbmNlOwogCXN1Ym1pdC0+ZmVuY2UgPSBmZW5jZS0+c2Vxbm87CiAJZ3B1LT5hY3RpdmVfZmVuY2UgPSBzdWJtaXQtPmZlbmNlOwpAQCAtMTM5NSw5ICsxMzk1LDkgQEAKIAloYW5nY2hlY2tfdGltZXJfcmVzZXQoZ3B1KTsKIAlyZXQgPSAwOwogCi1vdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmZ3B1LT5sb2NrKTsKIAorb3V0X3BtX3B1dDoKIAlldG5hdml2X2dwdV9wbV9wdXQoZ3B1KTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9mYi5jCmluZGV4IGUwMTY2NDAuLjQwY2U4NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9mYi5jCkBAIC01NSwxMSArNTUsMTEgQEAKIAlmbGFncyA9IGV4eW5vc19nZW0tPmZsYWdzOwogCiAJLyoKLQkgKiB3aXRob3V0IGlvbW11IHN1cHBvcnQsIG5vdCBzdXBwb3J0IHBoeXNpY2FsbHkgbm9uLWNvbnRpbnVvdXMgbWVtb3J5Ci0JICogZm9yIGZyYW1lYnVmZmVyLgorCSAqIFBoeXNpY2FsbHkgbm9uLWNvbnRpZ3VvdXMgbWVtb3J5IHR5cGUgZm9yIGZyYW1lYnVmZmVyIGlzIG5vdAorCSAqIHN1cHBvcnRlZCB3aXRob3V0IElPTU1VLgogCSAqLwogCWlmIChJU19OT05DT05USUdfQlVGRkVSKGZsYWdzKSkgewotCQlEUk1fRVJST1IoImNhbm5vdCB1c2UgdGhpcyBnZW0gbWVtb3J5IHR5cGUgZm9yIGZiLlxuIik7CisJCURSTV9FUlJPUigiTm9uLWNvbnRpZ3VvdXMgR0VNIG1lbW9yeSBpcyBub3Qgc3VwcG9ydGVkLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZpbWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9maW1jLmMKaW5kZXggMDUyNWM1Ni4uMTQ3ZWYwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZpbWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmltYy5jCkBAIC0xNzUzLDMyICsxNzUzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QTV9TTEVFUAotc3RhdGljIGludCBmaW1jX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBmaW1jX2NvbnRleHQgKmN0eCA9IGdldF9maW1jX2NvbnRleHQoZGV2KTsKLQotCURSTV9ERUJVR19LTVMoImlkWyVkXVxuIiwgY3R4LT5pZCk7Ci0KLQlpZiAocG1fcnVudGltZV9zdXNwZW5kZWQoZGV2KSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gZmltY19jbGtfY3RybChjdHgsIGZhbHNlKTsKLX0KLQotc3RhdGljIGludCBmaW1jX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGZpbWNfY29udGV4dCAqY3R4ID0gZ2V0X2ZpbWNfY29udGV4dChkZXYpOwotCi0JRFJNX0RFQlVHX0tNUygiaWRbJWRdXG4iLCBjdHgtPmlkKTsKLQotCWlmICghcG1fcnVudGltZV9zdXNwZW5kZWQoZGV2KSkKLQkJcmV0dXJuIGZpbWNfY2xrX2N0cmwoY3R4LCB0cnVlKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KIHN0YXRpYyBpbnQgZmltY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBmaW1jX2NvbnRleHQgKmN0eCA9IGdldF9maW1jX2NvbnRleHQoZGV2KTsKQEAgLTE3OTksNyArMTc3Myw4IEBACiAjZW5kaWYKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGZpbWNfcG1fb3BzID0gewotCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGZpbWNfc3VzcGVuZCwgZmltY19yZXN1bWUpCisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMocG1fcnVudGltZV9mb3JjZV9zdXNwZW5kLAorCQkJCXBtX3J1bnRpbWVfZm9yY2VfcmVzdW1lKQogCVNFVF9SVU5USU1FX1BNX09QUyhmaW1jX3J1bnRpbWVfc3VzcGVuZCwgZmltY19ydW50aW1lX3Jlc3VtZSwgTlVMTCkKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9nMmQuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9nMmQuYwppbmRleCA0YmYwMGY1Li42ZWNhOGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZzJkLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2cyZC5jCkBAIC0xNDc1LDggKzE0NzUsOCBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCi1zdGF0aWMgaW50IGcyZF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgZzJkX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGcyZF9kYXRhICpnMmQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIApAQCAtMTQ5MCwyNSArMTQ5MCw2IEBACiAKIAlmbHVzaF93b3JrKCZnMmQtPnJ1bnF1ZXVlX3dvcmspOwogCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZzJkX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGcyZF9kYXRhICpnMmQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCWcyZC0+c3VzcGVuZGVkID0gZmFsc2U7Ci0JZzJkX2V4ZWNfcnVucXVldWUoZzJkKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgZzJkX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGcyZF9kYXRhICpnMmQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQogCWNsa19kaXNhYmxlX3VucHJlcGFyZShnMmQtPmdhdGVfY2xrKTsKIAogCXJldHVybiAwOwpAQCAtMTUyMywxMiArMTUwNCwxNiBAQAogCWlmIChyZXQgPCAwKQogCQlkZXZfd2FybihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIGNsb2NrLlxuIik7CiAKKwlnMmQtPnN1c3BlbmRlZCA9IGZhbHNlOworCWcyZF9leGVjX3J1bnF1ZXVlKGcyZCk7CisKIAlyZXR1cm4gcmV0OwogfQogI2VuZGlmCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBnMmRfcG1fb3BzID0gewotCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGcyZF9zdXNwZW5kLCBnMmRfcmVzdW1lKQorCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHBtX3J1bnRpbWVfZm9yY2Vfc3VzcGVuZCwKKwkJCQlwbV9ydW50aW1lX2ZvcmNlX3Jlc3VtZSkKIAlTRVRfUlVOVElNRV9QTV9PUFMoZzJkX3J1bnRpbWVfc3VzcGVuZCwgZzJkX3J1bnRpbWVfcmVzdW1lLCBOVUxMKQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2dzYy5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2dzYy5jCmluZGV4IDVkMjBkYTguLjUyYTlkMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9nc2MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZ3NjLmMKQEAgLTE3NjAsMzQgKzE3NjAsNyBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCi1zdGF0aWMgaW50IGdzY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZ3NjX2NvbnRleHQgKmN0eCA9IGdldF9nc2NfY29udGV4dChkZXYpOwotCi0JRFJNX0RFQlVHX0tNUygiaWRbJWRdXG4iLCBjdHgtPmlkKTsKLQotCWlmIChwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBnc2NfY2xrX2N0cmwoY3R4LCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZ3NjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGdzY19jb250ZXh0ICpjdHggPSBnZXRfZ3NjX2NvbnRleHQoZGV2KTsKLQotCURSTV9ERUJVR19LTVMoImlkWyVkXVxuIiwgY3R4LT5pZCk7Ci0KLQlpZiAoIXBtX3J1bnRpbWVfc3VzcGVuZGVkKGRldikpCi0JCXJldHVybiBnc2NfY2xrX2N0cmwoY3R4LCB0cnVlKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgZ3NjX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIGdzY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBnc2NfY29udGV4dCAqY3R4ID0gZ2V0X2dzY19jb250ZXh0KGRldik7CiAKQEAgLTE3OTYsNyArMTc2OSw3IEBACiAJcmV0dXJuICBnc2NfY2xrX2N0cmwoY3R4LCBmYWxzZSk7CiB9CiAKLXN0YXRpYyBpbnQgZ3NjX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgZ3NjX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZ3NjX2NvbnRleHQgKmN0eCA9IGdldF9nc2NfY29udGV4dChkZXYpOwogCkBAIC0xODA0LDEwICsxNzc3LDEwIEBACiAKIAlyZXR1cm4gIGdzY19jbGtfY3RybChjdHgsIHRydWUpOwogfQotI2VuZGlmCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBnc2NfcG1fb3BzID0gewotCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGdzY19zdXNwZW5kLCBnc2NfcmVzdW1lKQorCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHBtX3J1bnRpbWVfZm9yY2Vfc3VzcGVuZCwKKwkJCQlwbV9ydW50aW1lX2ZvcmNlX3Jlc3VtZSkKIAlTRVRfUlVOVElNRV9QTV9PUFMoZ3NjX3J1bnRpbWVfc3VzcGVuZCwgZ3NjX3J1bnRpbWVfcmVzdW1lLCBOVUxMKQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX3JvdGF0b3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9yb3RhdG9yLmMKaW5kZXggNDA0MzY3YS4uNjU5MWU0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX3JvdGF0b3IuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fcm90YXRvci5jCkBAIC03OTQsMjkgKzc5NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQotI2lmZGVmIENPTkZJR19QTV9TTEVFUAotc3RhdGljIGludCByb3RhdG9yX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCByb3RfY29udGV4dCAqcm90ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlpZiAocG1fcnVudGltZV9zdXNwZW5kZWQoZGV2KSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gcm90YXRvcl9jbGtfY3J0bChyb3QsIGZhbHNlKTsKLX0KLQotc3RhdGljIGludCByb3RhdG9yX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHJvdF9jb250ZXh0ICpyb3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCWlmICghcG1fcnVudGltZV9zdXNwZW5kZWQoZGV2KSkKLQkJcmV0dXJuIHJvdGF0b3JfY2xrX2NydGwocm90LCB0cnVlKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KIHN0YXRpYyBpbnQgcm90YXRvcl9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCByb3RfY29udGV4dCAqcm90ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CkBAIC04MzMsNyArODEwLDggQEAKICNlbmRpZgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgcm90YXRvcl9wbV9vcHMgPSB7Ci0JU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMocm90YXRvcl9zdXNwZW5kLCByb3RhdG9yX3Jlc3VtZSkKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhwbV9ydW50aW1lX2ZvcmNlX3N1c3BlbmQsCisJCQkJcG1fcnVudGltZV9mb3JjZV9yZXN1bWUpCiAJU0VUX1JVTlRJTUVfUE1fT1BTKHJvdGF0b3JfcnVudGltZV9zdXNwZW5kLCByb3RhdG9yX3J1bnRpbWVfcmVzdW1lLAogCQkJCQkJCQkJTlVMTCkKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYwppbmRleCA5NWRkZDU2Li41ZGUzNmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKQEAgLTEyODEsNiArMTI4MSwxMSBAQAogCiAJaW50ZWxfcnVudGltZV9wbV9lbmFibGUoZGV2X3ByaXYpOwogCisJLyogRXZlcnl0aGluZyBpcyBpbiBwbGFjZSwgd2UgY2FuIG5vdyByZWxheCEgKi8KKwlEUk1fSU5GTygiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgZm9yICVzIG9uIG1pbm9yICVkXG4iLAorCQkgZHJpdmVyLm5hbWUsIGRyaXZlci5tYWpvciwgZHJpdmVyLm1pbm9yLCBkcml2ZXIucGF0Y2hsZXZlbCwKKwkJIGRyaXZlci5kYXRlLCBwY2lfbmFtZShwZGV2KSwgZGV2X3ByaXYtPmRybS5wcmltYXJ5LT5pbmRleCk7CisKIAlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCmluZGV4IDIxZjkzOTAuLmY2OGM3ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaApAQCAtODgyLDExICs4ODIsMTIgQEAKIAogCXN0cnVjdCBpOTE1X2N0eF9oYW5nX3N0YXRzIGhhbmdfc3RhdHM7CiAKLQkvKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBjb250ZXh0LCB1c2VkIGJ5IHRoZSBodyBmb3IgdHJhY2tpbmcgKi8KIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogI2RlZmluZSBDT05URVhUX05PX1pFUk9NQVAJCUJJVCgwKQogI2RlZmluZSBDT05URVhUX05PX0VSUk9SX0NBUFRVUkUJQklUKDEpCi0JdW5zaWduZWQgaHdfaWQ7CisKKwkvKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBjb250ZXh0LCB1c2VkIGJ5IHRoZSBodyBmb3IgdHJhY2tpbmcgKi8KKwl1bnNpZ25lZCBpbnQgaHdfaWQ7CiAJdTMyIHVzZXJfaGFuZGxlOwogCiAJdTMyIGdndHRfYWxpZ25tZW50OwpAQCAtMTg1NCw2ICsxODU1LDcgQEAKIAllbnVtIG1vZGVzZXRfcmVzdG9yZSBtb2Rlc2V0X3Jlc3RvcmU7CiAJc3RydWN0IG11dGV4IG1vZGVzZXRfcmVzdG9yZV9sb2NrOwogCXN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICptb2Rlc2V0X3Jlc3RvcmVfc3RhdGU7CisJc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4IHJlc2V0X2N0eDsKIAogCXN0cnVjdCBsaXN0X2hlYWQgdm1fbGlzdDsgLyogR2xvYmFsIGxpc3Qgb2YgYWxsIGFkZHJlc3Mgc3BhY2VzICovCiAJc3RydWN0IGk5MTVfZ2d0dCBnZ3R0OyAvKiBWTSByZXByZXNlbnRpbmcgdGhlIGdsb2JhbCBhZGRyZXNzIHNwYWNlICovCkBAIC0xOTYyLDYgKzE5NjQsMTMgQEAKIAlzdHJ1Y3QgaTkxNV9zdXNwZW5kX3NhdmVkX3JlZ2lzdGVycyByZWdmaWxlOwogCXN0cnVjdCB2bHZfczBpeF9zdGF0ZSB2bHZfczBpeF9zdGF0ZTsKIAorCWVudW0geworCQlJOTE1X1NLTF9TQUdWX1VOS05PV04gPSAwLAorCQlJOTE1X1NLTF9TQUdWX0RJU0FCTEVELAorCQlJOTE1X1NLTF9TQUdWX0VOQUJMRUQsCisJCUk5MTVfU0tMX1NBR1ZfTk9UX0NPTlRST0xMRUQKKwl9IHNrbF9zYWd2X3N0YXR1czsKKwogCXN0cnVjdCB7CiAJCS8qCiAJCSAqIFJhdyB3YXRlcm1hcmsgbGF0ZW5jeSB2YWx1ZXM6CkBAIC0zNTkwLDYgKzM1OTksNyBAQAogLyogYmVsb25ncyBpbiBpOTE1X2dlbV9ndHQuaCAqLwogc3RhdGljIGlubGluZSB2b2lkIGk5MTVfZ2VtX2NoaXBzZXRfZmx1c2goc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogeworCXdtYigpOwogCWlmIChJTlRFTF9HRU4oZGV2X3ByaXYpIDwgNikKIAkJaW50ZWxfZ3R0X2NoaXBzZXRfZmx1c2goKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCmluZGV4IDExNjgxNTAuLmE3N2NlOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwpAQCAtODc5LDkgKzg3OSwxMiBAQAogCXJldCA9IGk5MTVfZ2VtX3NobWVtX3ByZWFkKGRldiwgb2JqLCBhcmdzLCBmaWxlKTsKIAogCS8qIHByZWFkIGZvciBub24gc2htZW0gYmFja2VkIG9iamVjdHMgKi8KLQlpZiAocmV0ID09IC1FRkFVTFQgfHwgcmV0ID09IC1FTk9ERVYpCisJaWYgKHJldCA9PSAtRUZBVUxUIHx8IHJldCA9PSAtRU5PREVWKSB7CisJCWludGVsX3J1bnRpbWVfcG1fZ2V0KHRvX2k5MTUoZGV2KSk7CiAJCXJldCA9IGk5MTVfZ2VtX2d0dF9wcmVhZChkZXYsIG9iaiwgYXJncy0+c2l6ZSwKIAkJCQkJYXJncy0+b2Zmc2V0LCBhcmdzLT5kYXRhX3B0cik7CisJCWludGVsX3J1bnRpbWVfcG1fcHV0KHRvX2k5MTUoZGV2KSk7CisJfQogCiBvdXQ6CiAJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CkBAIC0xMzA2LDcgKzEzMDksNyBAQAogCQkgKiB0ZXh0dXJlcykuIEZhbGxiYWNrIHRvIHRoZSBzaG1lbSBwYXRoIGluIHRoYXQgY2FzZS4gKi8KIAl9CiAKLQlpZiAocmV0ID09IC1FRkFVTFQpIHsKKwlpZiAocmV0ID09IC1FRkFVTFQgfHwgcmV0ID09IC1FTk9TUEMpIHsKIAkJaWYgKG9iai0+cGh5c19oYW5kbGUpCiAJCQlyZXQgPSBpOTE1X2dlbV9waHlzX3B3cml0ZShvYmosIGFyZ3MsIGZpbGUpOwogCQllbHNlIGlmIChpOTE1X2dlbV9vYmplY3RfaGFzX3N0cnVjdF9wYWdlKG9iaikpCkBAIC0zMTY5LDYgKzMxNzIsOCBAQAogCX0KIAogCWludGVsX3JpbmdfaW5pdF9zZXFubyhlbmdpbmUsIGVuZ2luZS0+bGFzdF9zdWJtaXR0ZWRfc2Vxbm8pOworCisJZW5naW5lLT5pOTE1LT5ndC5hY3RpdmVfZW5naW5lcyAmPSB+aW50ZWxfZW5naW5lX2ZsYWcoZW5naW5lKTsKIH0KIAogdm9pZCBpOTE1X2dlbV9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtMzE4Niw2ICszMTkxLDcgQEAKIAogCWZvcl9lYWNoX2VuZ2luZShlbmdpbmUsIGRldl9wcml2KQogCQlpOTE1X2dlbV9yZXNldF9lbmdpbmVfY2xlYW51cChlbmdpbmUpOworCW1vZF9kZWxheWVkX3dvcmsoZGV2X3ByaXYtPndxLCAmZGV2X3ByaXYtPmd0LmlkbGVfd29yaywgMCk7CiAKIAlpOTE1X2dlbV9jb250ZXh0X3Jlc2V0KGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYwppbmRleCAxOTc4NjMzLi5iMzVlNWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXhlY2J1ZmZlci5jCkBAIC05NDMsOCArOTQzLDYgQEAKIHsKIAljb25zdCB1bnNpZ25lZCBvdGhlcl9yaW5ncyA9IH5pbnRlbF9lbmdpbmVfZmxhZyhyZXEtPmVuZ2luZSk7CiAJc3RydWN0IGk5MTVfdm1hICp2bWE7Ci0JdWludDMyX3QgZmx1c2hfZG9tYWlucyA9IDA7Ci0JYm9vbCBmbHVzaF9jaGlwc2V0ID0gZmFsc2U7CiAJaW50IHJldDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkodm1hLCB2bWFzLCBleGVjX2xpc3QpIHsKQEAgLTk1NywxNiArOTU1LDExIEBACiAJCX0KIAogCQlpZiAob2JqLT5iYXNlLndyaXRlX2RvbWFpbiAmIEk5MTVfR0VNX0RPTUFJTl9DUFUpCi0JCQlmbHVzaF9jaGlwc2V0IHw9IGk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KG9iaiwgZmFsc2UpOwotCi0JCWZsdXNoX2RvbWFpbnMgfD0gb2JqLT5iYXNlLndyaXRlX2RvbWFpbjsKKwkJCWk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KG9iaiwgZmFsc2UpOwogCX0KIAotCWlmIChmbHVzaF9jaGlwc2V0KQotCQlpOTE1X2dlbV9jaGlwc2V0X2ZsdXNoKHJlcS0+ZW5naW5lLT5pOTE1KTsKLQotCWlmIChmbHVzaF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX0dUVCkKLQkJd21iKCk7CisJLyogVW5jb25kaXRpb25hbGx5IGZsdXNoIGFueSBjaGlwc2V0IGNhY2hlcyAoZm9yIHN0cmVhbWluZyB3cml0ZXMpLiAqLworCWk5MTVfZ2VtX2NoaXBzZXRfZmx1c2gocmVxLT5lbmdpbmUtPmk5MTUpOwogCiAJLyogVW5jb25kaXRpb25hbGx5IGludmFsaWRhdGUgZ3B1IGNhY2hlcyBhbmQgZW5zdXJlIHRoYXQgd2UgZG8gZmx1c2gKIAkgKiBhbnkgcmVzaWR1YWwgd3JpdGVzIGZyb20gdGhlIHByZXZpb3VzIGJhdGNoLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYwppbmRleCAxMGYxZTMyLi5mMzhjZWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYwpAQCAtMTIyLDggKzEyMiwxMSBAQAogCWhhc19mdWxsXzQ4Yml0X3BwZ3R0ID0KIAkgICAgICAgCUlTX0JST0FEV0VMTChkZXZfcHJpdikgfHwgSU5URUxfR0VOKGRldl9wcml2KSA+PSA5OwogCi0JaWYgKGludGVsX3ZncHVfYWN0aXZlKGRldl9wcml2KSkKLQkJaGFzX2Z1bGxfcHBndHQgPSBmYWxzZTsgLyogZW11bGF0aW9uIGlzIHRvbyBoYXJkICovCisJaWYgKGludGVsX3ZncHVfYWN0aXZlKGRldl9wcml2KSkgeworCQkvKiBlbXVsYXRpb24gaXMgdG9vIGhhcmQgKi8KKwkJaGFzX2Z1bGxfcHBndHQgPSBmYWxzZTsKKwkJaGFzX2Z1bGxfNDhiaXRfcHBndHQgPSBmYWxzZTsKKwl9CiAKIAlpZiAoIWhhc19hbGlhc2luZ19wcGd0dCkKIAkJcmV0dXJuIDA7CkBAIC0xNTgsNyArMTYxLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKElOVEVMX0dFTihkZXZfcHJpdikgPj0gOCAmJiBpOTE1LmVuYWJsZV9leGVjbGlzdHMpCisJaWYgKElOVEVMX0dFTihkZXZfcHJpdikgPj0gOCAmJiBpOTE1LmVuYWJsZV9leGVjbGlzdHMgJiYgaGFzX2Z1bGxfcHBndHQpCiAJCXJldHVybiBoYXNfZnVsbF80OGJpdF9wcGd0dCA/IDMgOiAyOwogCWVsc2UKIAkJcmV0dXJuIGhhc19hbGlhc2luZ19wcGd0dCA/IDEgOiAwOwpAQCAtMjg3Myw2ICsyODc2LDcgQEAKIAkJc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0ID0gZGV2X3ByaXYtPm1tLmFsaWFzaW5nX3BwZ3R0OwogCiAJCXBwZ3R0LT5iYXNlLmNsZWFudXAoJnBwZ3R0LT5iYXNlKTsKKwkJa2ZyZWUocHBndHQpOwogCX0KIAogCWk5MTVfZ2VtX2NsZWFudXBfc3RvbGVuKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaAppbmRleCBjZTE0ZmUwLi5iZjJjYWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKQEAgLTE1MzYsNiArMTUzNiw3IEBACiAjZGVmaW5lIEJBTEFOQ0VfTEVHX01BU0socG9ydCkJCSg3PDwoOCszKihwb3J0KSkpCiAvKiBCYWxhbmNlIGxlZyBkaXNhYmxlIGJpdHMgKi8KICNkZWZpbmUgQkFMQU5DRV9MRUdfRElTQUJMRV9TSElGVAkyMworI2RlZmluZSBCQUxBTkNFX0xFR19ESVNBQkxFKHBvcnQpCSgxIDw8ICgyMyArIChwb3J0KSkpCiAKIC8qCiAgKiBGZW5jZSByZWdpc3RlcnMKQEAgLTcxNDQsNiArNzE0NSwxNSBAQAogCiAjZGVmaW5lIEdFTjZfUENPREVfTUFJTEJPWAkJCV9NTUlPKDB4MTM4MTI0KQogI2RlZmluZSAgIEdFTjZfUENPREVfUkVBRFkJCQkoMTw8MzEpCisjZGVmaW5lICAgR0VONl9QQ09ERV9FUlJPUl9NQVNLCQkJMHhGRgorI2RlZmluZSAgICAgR0VONl9QQ09ERV9TVUNDRVNTCQkJMHgwCisjZGVmaW5lICAgICBHRU42X1BDT0RFX0lMTEVHQUxfQ01ECQkweDEKKyNkZWZpbmUgICAgIEdFTjZfUENPREVfTUlOX0ZSRVFfVEFCTEVfR1RfUkFUSU9fT1VUX09GX1JBTkdFIDB4MgorI2RlZmluZSAgICAgR0VONl9QQ09ERV9USU1FT1VUCQkJMHgzCisjZGVmaW5lICAgICBHRU42X1BDT0RFX1VOSU1QTEVNRU5URURfQ01ECTB4RkYKKyNkZWZpbmUgICAgIEdFTjdfUENPREVfVElNRU9VVAkJCTB4MgorI2RlZmluZSAgICAgR0VON19QQ09ERV9JTExFR0FMX0RBVEEJCTB4MworI2RlZmluZSAgICAgR0VON19QQ09ERV9NSU5fRlJFUV9UQUJMRV9HVF9SQVRJT19PVVRfT0ZfUkFOR0UgMHgxMAogI2RlZmluZQkgIEdFTjZfUENPREVfV1JJVEVfUkM2VklEUwkJMHg0CiAjZGVmaW5lCSAgR0VONl9QQ09ERV9SRUFEX1JDNlZJRFMJCTB4NQogI2RlZmluZSAgICAgR0VONl9FTkNPREVfUkM2X1ZJRChtdikJCSgoKG12KSAtIDI0NSkgLyA1KQpAQCAtNzE2NSw2ICs3MTc1LDEwIEBACiAjZGVmaW5lICAgSFNXX1BDT0RFX0RFX1dSSVRFX0ZSRVFfUkVRCQkweDE3CiAjZGVmaW5lICAgRElTUExBWV9JUFNfQ09OVFJPTAkJCTB4MTkKICNkZWZpbmUJICBIU1dfUENPREVfRFlOQU1JQ19EVVRZX0NZQ0xFX0NPTlRST0wJMHgxQQorI2RlZmluZSAgIEdFTjlfUENPREVfU0FHVl9DT05UUk9MCQkweDIxCisjZGVmaW5lICAgICBHRU45X1NBR1ZfRElTQUJMRQkJCTB4MAorI2RlZmluZSAgICAgR0VOOV9TQUdWX0lTX0RJU0FCTEVECQkweDEKKyNkZWZpbmUgICAgIEdFTjlfU0FHVl9FTkFCTEUJCQkweDMKICNkZWZpbmUgR0VONl9QQ09ERV9EQVRBCQkJCV9NTUlPKDB4MTM4MTI4KQogI2RlZmluZSAgIEdFTjZfUENPREVfRlJFUV9JQV9SQVRJT19TSElGVAk4CiAjZGVmaW5lICAgR0VONl9QQ09ERV9GUkVRX1JJTkdfUkFUSU9fU0hJRlQJMTYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdmdwdS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV92Z3B1LmMKaW5kZXggZjZhY2I1YS4uYjgxY2ZiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV92Z3B1LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV92Z3B1LmMKQEAgLTY1LDkgKzY1LDYgQEAKIAogCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHZndF9pZikgIT0gVkdUX1BWSU5GT19TSVpFKTsKIAotCWlmICghSVNfSEFTV0VMTChkZXZfcHJpdikpCi0JCXJldHVybjsKLQogCW1hZ2ljID0gX19yYXdfaTkxNV9yZWFkNjQoZGV2X3ByaXYsIHZndGlmX3JlZyhtYWdpYykpOwogCWlmIChtYWdpYyAhPSBWR1RfTUFHSUMpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2F1ZGlvLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9hdWRpby5jCmluZGV4IDY3MDBhN2IuLmQzMmY1ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2F1ZGlvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYXVkaW8uYwpAQCAtNjAwLDYgKzYwMCw4IEBACiAJaWYgKCFJU19TS1lMQUtFKGRldl9wcml2KSAmJiAhSVNfS0FCWUxBS0UoZGV2X3ByaXYpKQogCQlyZXR1cm47CiAKKwlpOTE1X2F1ZGlvX2NvbXBvbmVudF9nZXRfcG93ZXIoZGV2KTsKKwogCS8qCiAJICogRW5hYmxlL2Rpc2FibGUgZ2VuZXJhdGluZyB0aGUgY29kZWMgd2FrZSBzaWduYWwsIG92ZXJyaWRpbmcgdGhlCiAJICogaW50ZXJuYWwgbG9naWMgdG8gZ2VuZXJhdGUgdGhlIGNvZGVjIHdha2UgdG8gY29udHJvbGxlci4KQEAgLTYxNSw2ICs2MTcsOCBAQAogCQlJOTE1X1dSSVRFKEhTV19BVURfQ0hJQ0tFTkJJVCwgdG1wKTsKIAkJdXNsZWVwX3JhbmdlKDEwMDAsIDE1MDApOwogCX0KKworCWk5MTVfYXVkaW9fY29tcG9uZW50X3B1dF9wb3dlcihkZXYpOwogfQogCiAvKiBHZXQgQ0RDTEsgaW4ga0h6ICAqLwpAQCAtNjQ4LDYgKzY1Miw3IEBACiAJICAgICFJU19IQVNXRUxMKGRldl9wcml2KSkKIAkJcmV0dXJuIDA7CiAKKwlpOTE1X2F1ZGlvX2NvbXBvbmVudF9nZXRfcG93ZXIoZGV2KTsKIAltdXRleF9sb2NrKCZkZXZfcHJpdi0+YXZfbXV0ZXgpOwogCS8qIDEuIGdldCB0aGUgcGlwZSAqLwogCWludGVsX2VuY29kZXIgPSBkZXZfcHJpdi0+ZGlnX3BvcnRfbWFwW3BvcnRdOwpAQCAtNjk4LDYgKzcwMyw3IEBACiAKICB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+YXZfbXV0ZXgpOworCWk5MTVfYXVkaW9fY29tcG9uZW50X3B1dF9wb3dlcihkZXYpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Nzci5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3NyLmMKaW5kZXggM2VkYjk1OC4uYzNiMzNhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3NyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3NyLmMKQEAgLTQxLDE1ICs0MSwxNSBAQAogICogYmUgbW92ZWQgdG8gRldfRkFJTEVELgogICovCiAKLSNkZWZpbmUgSTkxNV9DU1JfS0JMICJpOTE1L2tibF9kbWNfdmVyMS5iaW4iCisjZGVmaW5lIEk5MTVfQ1NSX0tCTCAiaTkxNS9rYmxfZG1jX3ZlcjFfMDEuYmluIgogTU9EVUxFX0ZJUk1XQVJFKEk5MTVfQ1NSX0tCTCk7CiAjZGVmaW5lIEtCTF9DU1JfVkVSU0lPTl9SRVFVSVJFRAlDU1JfVkVSU0lPTigxLCAxKQogCi0jZGVmaW5lIEk5MTVfQ1NSX1NLTCAiaTkxNS9za2xfZG1jX3ZlcjEuYmluIgorI2RlZmluZSBJOTE1X0NTUl9TS0wgImk5MTUvc2tsX2RtY192ZXIxXzI2LmJpbiIKIE1PRFVMRV9GSVJNV0FSRShJOTE1X0NTUl9TS0wpOwotI2RlZmluZSBTS0xfQ1NSX1ZFUlNJT05fUkVRVUlSRUQJQ1NSX1ZFUlNJT04oMSwgMjMpCisjZGVmaW5lIFNLTF9DU1JfVkVSU0lPTl9SRVFVSVJFRAlDU1JfVkVSU0lPTigxLCAyNikKIAotI2RlZmluZSBJOTE1X0NTUl9CWFQgImk5MTUvYnh0X2RtY192ZXIxLmJpbiIKKyNkZWZpbmUgSTkxNV9DU1JfQlhUICJpOTE1L2J4dF9kbWNfdmVyMV8wNy5iaW4iCiBNT0RVTEVfRklSTVdBUkUoSTkxNV9DU1JfQlhUKTsKICNkZWZpbmUgQlhUX0NTUl9WRVJTSU9OX1JFUVVJUkVECUNTUl9WRVJTSU9OKDEsIDcpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RkaS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGRpLmMKaW5kZXggZGQxZDZmZS4uMWE3ZWZhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGRpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGRpLmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBkZGlfYnVmX3RyYW5zIHNrbF91X2RkaV90cmFuc2xhdGlvbnNfZHBbXSA9IHsKIAl7IDB4MDAwMDIwMUIsIDB4MDAwMDAwQTIsIDB4MCB9LAogCXsgMHgwMDAwNTAxMiwgMHgwMDAwMDA4OCwgMHgwIH0sCi0JeyAweDgwMDA3MDExLCAweDAwMDAwMENELCAweDAgfSwKKwl7IDB4ODAwMDcwMTEsIDB4MDAwMDAwQ0QsIDB4MSB9LAogCXsgMHg4MDAwOTAxMCwgMHgwMDAwMDBDMCwgMHgxIH0sCiAJeyAweDAwMDAyMDFCLCAweDAwMDAwMDlELCAweDAgfSwKIAl7IDB4ODAwMDUwMTIsIDB4MDAwMDAwQzAsIDB4MSB9LApAQCAtMTU4LDcgKzE1OCw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGRkaV9idWZfdHJhbnMgc2tsX3lfZGRpX3RyYW5zbGF0aW9uc19kcFtdID0gewogCXsgMHgwMDAwMDAxOCwgMHgwMDAwMDBBMiwgMHgwIH0sCiAJeyAweDAwMDA1MDEyLCAweDAwMDAwMDg4LCAweDAgfSwKLQl7IDB4ODAwMDcwMTEsIDB4MDAwMDAwQ0QsIDB4MCB9LAorCXsgMHg4MDAwNzAxMSwgMHgwMDAwMDBDRCwgMHgzIH0sCiAJeyAweDgwMDA5MDEwLCAweDAwMDAwMEMwLCAweDMgfSwKIAl7IDB4MDAwMDAwMTgsIDB4MDAwMDAwOUQsIDB4MCB9LAogCXsgMHg4MDAwNTAxMiwgMHgwMDAwMDBDMCwgMHgzIH0sCkBAIC0zODgsNiArMzg4LDQwIEBACiAJfQogfQogCitzdGF0aWMgaW50IGludGVsX2RkaV9oZG1pX2xldmVsKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgZW51bSBwb3J0IHBvcnQpCit7CisJaW50IG5faGRtaV9lbnRyaWVzOworCWludCBoZG1pX2xldmVsOworCWludCBoZG1pX2RlZmF1bHRfZW50cnk7CisKKwloZG1pX2xldmVsID0gZGV2X3ByaXYtPnZidC5kZGlfcG9ydF9pbmZvW3BvcnRdLmhkbWlfbGV2ZWxfc2hpZnQ7CisKKwlpZiAoSVNfQlJPWFRPTihkZXZfcHJpdikpCisJCXJldHVybiBoZG1pX2xldmVsOworCisJaWYgKElTX1NLWUxBS0UoZGV2X3ByaXYpIHx8IElTX0tBQllMQUtFKGRldl9wcml2KSkgeworCQlza2xfZ2V0X2J1Zl90cmFuc19oZG1pKGRldl9wcml2LCAmbl9oZG1pX2VudHJpZXMpOworCQloZG1pX2RlZmF1bHRfZW50cnkgPSA4OworCX0gZWxzZSBpZiAoSVNfQlJPQURXRUxMKGRldl9wcml2KSkgeworCQluX2hkbWlfZW50cmllcyA9IEFSUkFZX1NJWkUoYmR3X2RkaV90cmFuc2xhdGlvbnNfaGRtaSk7CisJCWhkbWlfZGVmYXVsdF9lbnRyeSA9IDc7CisJfSBlbHNlIGlmIChJU19IQVNXRUxMKGRldl9wcml2KSkgeworCQluX2hkbWlfZW50cmllcyA9IEFSUkFZX1NJWkUoaHN3X2RkaV90cmFuc2xhdGlvbnNfaGRtaSk7CisJCWhkbWlfZGVmYXVsdF9lbnRyeSA9IDY7CisJfSBlbHNlIHsKKwkJV0FSTigxLCAiZGRpIHRyYW5zbGF0aW9uIHRhYmxlIG1pc3NpbmdcbiIpOworCQluX2hkbWlfZW50cmllcyA9IEFSUkFZX1NJWkUoYmR3X2RkaV90cmFuc2xhdGlvbnNfaGRtaSk7CisJCWhkbWlfZGVmYXVsdF9lbnRyeSA9IDc7CisJfQorCisJLyogQ2hvb3NlIGEgZ29vZCBkZWZhdWx0IGlmIFZCVCBpcyBiYWRseSBwb3B1bGF0ZWQgKi8KKwlpZiAoaGRtaV9sZXZlbCA9PSBIRE1JX0xFVkVMX1NISUZUX1VOS05PV04gfHwKKwkgICAgaGRtaV9sZXZlbCA+PSBuX2hkbWlfZW50cmllcykKKwkJaGRtaV9sZXZlbCA9IGhkbWlfZGVmYXVsdF9lbnRyeTsKKworCXJldHVybiBoZG1pX2xldmVsOworfQorCiAvKgogICogU3RhcnRpbmcgd2l0aCBIYXN3ZWxsLCBEREkgcG9ydCBidWZmZXJzIG11c3QgYmUgcHJvZ3JhbW1lZCB3aXRoIGNvcnJlY3QKICAqIHZhbHVlcyBpbiBhZHZhbmNlLiBUaGUgYnVmZmVyIHZhbHVlcyBhcmUgZGlmZmVyZW50IGZvciBGREkgYW5kIERQIG1vZGVzLApAQCAtMzk5LDcgKzQzMyw3IEBACiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShlbmNvZGVyLT5iYXNlLmRldik7CiAJdTMyIGlib29zdF9iaXQgPSAwOwotCWludCBpLCBuX2hkbWlfZW50cmllcywgbl9kcF9lbnRyaWVzLCBuX2VkcF9lbnRyaWVzLCBoZG1pX2RlZmF1bHRfZW50cnksCisJaW50IGksIG5faGRtaV9lbnRyaWVzLCBuX2RwX2VudHJpZXMsIG5fZWRwX2VudHJpZXMsCiAJICAgIHNpemU7CiAJaW50IGhkbWlfbGV2ZWw7CiAJZW51bSBwb3J0IHBvcnQ7CkBAIC00MTAsNyArNDQ0LDcgQEAKIAljb25zdCBzdHJ1Y3QgZGRpX2J1Zl90cmFucyAqZGRpX3RyYW5zbGF0aW9uczsKIAogCXBvcnQgPSBpbnRlbF9kZGlfZ2V0X2VuY29kZXJfcG9ydChlbmNvZGVyKTsKLQloZG1pX2xldmVsID0gZGV2X3ByaXYtPnZidC5kZGlfcG9ydF9pbmZvW3BvcnRdLmhkbWlfbGV2ZWxfc2hpZnQ7CisJaGRtaV9sZXZlbCA9IGludGVsX2RkaV9oZG1pX2xldmVsKGRldl9wcml2LCBwb3J0KTsKIAogCWlmIChJU19CUk9YVE9OKGRldl9wcml2KSkgewogCQlpZiAoZW5jb2Rlci0+dHlwZSAhPSBJTlRFTF9PVVRQVVRfSERNSSkKQEAgLTQzMCw3ICs0NjQsNiBAQAogCQkJCXNrbF9nZXRfYnVmX3RyYW5zX2VkcChkZXZfcHJpdiwgJm5fZWRwX2VudHJpZXMpOwogCQlkZGlfdHJhbnNsYXRpb25zX2hkbWkgPQogCQkJCXNrbF9nZXRfYnVmX3RyYW5zX2hkbWkoZGV2X3ByaXYsICZuX2hkbWlfZW50cmllcyk7Ci0JCWhkbWlfZGVmYXVsdF9lbnRyeSA9IDg7CiAJCS8qIElmIHdlJ3JlIGJvb3N0aW5nIHRoZSBjdXJyZW50LCBzZXQgYml0IDMxIG9mIHRyYW5zMSAqLwogCQlpZiAoZGV2X3ByaXYtPnZidC5kZGlfcG9ydF9pbmZvW3BvcnRdLmhkbWlfYm9vc3RfbGV2ZWwgfHwKIAkJICAgIGRldl9wcml2LT52YnQuZGRpX3BvcnRfaW5mb1twb3J0XS5kcF9ib29zdF9sZXZlbCkKQEAgLTQ1Niw3ICs0ODksNiBAQAogCiAJCW5fZHBfZW50cmllcyA9IEFSUkFZX1NJWkUoYmR3X2RkaV90cmFuc2xhdGlvbnNfZHApOwogCQluX2hkbWlfZW50cmllcyA9IEFSUkFZX1NJWkUoYmR3X2RkaV90cmFuc2xhdGlvbnNfaGRtaSk7Ci0JCWhkbWlfZGVmYXVsdF9lbnRyeSA9IDc7CiAJfSBlbHNlIGlmIChJU19IQVNXRUxMKGRldl9wcml2KSkgewogCQlkZGlfdHJhbnNsYXRpb25zX2ZkaSA9IGhzd19kZGlfdHJhbnNsYXRpb25zX2ZkaTsKIAkJZGRpX3RyYW5zbGF0aW9uc19kcCA9IGhzd19kZGlfdHJhbnNsYXRpb25zX2RwOwpAQCAtNDY0LDcgKzQ5Niw2IEBACiAJCWRkaV90cmFuc2xhdGlvbnNfaGRtaSA9IGhzd19kZGlfdHJhbnNsYXRpb25zX2hkbWk7CiAJCW5fZHBfZW50cmllcyA9IG5fZWRwX2VudHJpZXMgPSBBUlJBWV9TSVpFKGhzd19kZGlfdHJhbnNsYXRpb25zX2RwKTsKIAkJbl9oZG1pX2VudHJpZXMgPSBBUlJBWV9TSVpFKGhzd19kZGlfdHJhbnNsYXRpb25zX2hkbWkpOwotCQloZG1pX2RlZmF1bHRfZW50cnkgPSA2OwogCX0gZWxzZSB7CiAJCVdBUk4oMSwgImRkaSB0cmFuc2xhdGlvbiB0YWJsZSBtaXNzaW5nXG4iKTsKIAkJZGRpX3RyYW5zbGF0aW9uc19lZHAgPSBiZHdfZGRpX3RyYW5zbGF0aW9uc19kcDsKQEAgLTQ3NCw3ICs1MDUsNiBAQAogCQluX2VkcF9lbnRyaWVzID0gQVJSQVlfU0laRShiZHdfZGRpX3RyYW5zbGF0aW9uc19lZHApOwogCQluX2RwX2VudHJpZXMgPSBBUlJBWV9TSVpFKGJkd19kZGlfdHJhbnNsYXRpb25zX2RwKTsKIAkJbl9oZG1pX2VudHJpZXMgPSBBUlJBWV9TSVpFKGJkd19kZGlfdHJhbnNsYXRpb25zX2hkbWkpOwotCQloZG1pX2RlZmF1bHRfZW50cnkgPSA3OwogCX0KIAogCXN3aXRjaCAoZW5jb2Rlci0+dHlwZSkgewpAQCAtNTA1LDExICs1MzUsNiBAQAogCWlmIChlbmNvZGVyLT50eXBlICE9IElOVEVMX09VVFBVVF9IRE1JKQogCQlyZXR1cm47CiAKLQkvKiBDaG9vc2UgYSBnb29kIGRlZmF1bHQgaWYgVkJUIGlzIGJhZGx5IHBvcHVsYXRlZCAqLwotCWlmIChoZG1pX2xldmVsID09IEhETUlfTEVWRUxfU0hJRlRfVU5LTk9XTiB8fAotCSAgICBoZG1pX2xldmVsID49IG5faGRtaV9lbnRyaWVzKQotCQloZG1pX2xldmVsID0gaGRtaV9kZWZhdWx0X2VudHJ5OwotCiAJLyogRW50cnkgOSBpcyBmb3IgSERNSTogKi8KIAlJOTE1X1dSSVRFKERESV9CVUZfVFJBTlNfTE8ocG9ydCwgaSksCiAJCSAgIGRkaV90cmFuc2xhdGlvbnNfaGRtaVtoZG1pX2xldmVsXS50cmFuczEgfCBpYm9vc3RfYml0KTsKQEAgLTEzNzksMTQgKzE0MDQsMzAgQEAKIAkJCSAgIFRSQU5TX0NMS19TRUxfRElTQUJMRUQpOwogfQogCi1zdGF0aWMgdm9pZCBza2xfZGRpX3NldF9pYm9vc3Qoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAotCQkJICAgICAgIHUzMiBsZXZlbCwgZW51bSBwb3J0IHBvcnQsIGludCB0eXBlKQorc3RhdGljIHZvaWQgX3NrbF9kZGlfc2V0X2lib29zdChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJZW51bSBwb3J0IHBvcnQsIHVpbnQ4X3QgaWJvb3N0KQogeworCXUzMiB0bXA7CisKKwl0bXAgPSBJOTE1X1JFQUQoRElTUElPX0NSX1RYX0JNVV9DUjApOworCXRtcCAmPSB+KEJBTEFOQ0VfTEVHX01BU0socG9ydCkgfCBCQUxBTkNFX0xFR19ESVNBQkxFKHBvcnQpKTsKKwlpZiAoaWJvb3N0KQorCQl0bXAgfD0gaWJvb3N0IDw8IEJBTEFOQ0VfTEVHX1NISUZUKHBvcnQpOworCWVsc2UKKwkJdG1wIHw9IEJBTEFOQ0VfTEVHX0RJU0FCTEUocG9ydCk7CisJSTkxNV9XUklURShESVNQSU9fQ1JfVFhfQk1VX0NSMCwgdG1wKTsKK30KKworc3RhdGljIHZvaWQgc2tsX2RkaV9zZXRfaWJvb3N0KHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyLCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqaW50ZWxfZGlnX3BvcnQgPSBlbmNfdG9fZGlnX3BvcnQoJmVuY29kZXItPmJhc2UpOworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoaW50ZWxfZGlnX3BvcnQtPmJhc2UuYmFzZS5kZXYpOworCWVudW0gcG9ydCBwb3J0ID0gaW50ZWxfZGlnX3BvcnQtPnBvcnQ7CisJaW50IHR5cGUgPSBlbmNvZGVyLT50eXBlOwogCWNvbnN0IHN0cnVjdCBkZGlfYnVmX3RyYW5zICpkZGlfdHJhbnNsYXRpb25zOwogCXVpbnQ4X3QgaWJvb3N0OwogCXVpbnQ4X3QgZHBfaWJvb3N0LCBoZG1pX2lib29zdDsKIAlpbnQgbl9lbnRyaWVzOwotCXUzMiByZWc7CiAKIAkvKiBWQlQgbWF5IG92ZXJyaWRlIHN0YW5kYXJkIGJvb3N0IHZhbHVlcyAqLwogCWRwX2lib29zdCA9IGRldl9wcml2LT52YnQuZGRpX3BvcnRfaW5mb1twb3J0XS5kcF9ib29zdF9sZXZlbDsKQEAgLTE0MjgsMTYgKzE0NjksMTAgQEAKIAkJcmV0dXJuOwogCX0KIAotCXJlZyA9IEk5MTVfUkVBRChESVNQSU9fQ1JfVFhfQk1VX0NSMCk7Ci0JcmVnICY9IH5CQUxBTkNFX0xFR19NQVNLKHBvcnQpOwotCXJlZyAmPSB+KDEgPDwgKEJBTEFOQ0VfTEVHX0RJU0FCTEVfU0hJRlQgKyBwb3J0KSk7CisJX3NrbF9kZGlfc2V0X2lib29zdChkZXZfcHJpdiwgcG9ydCwgaWJvb3N0KTsKIAotCWlmIChpYm9vc3QpCi0JCXJlZyB8PSBpYm9vc3QgPDwgQkFMQU5DRV9MRUdfU0hJRlQocG9ydCk7Ci0JZWxzZQotCQlyZWcgfD0gMSA8PCAoQkFMQU5DRV9MRUdfRElTQUJMRV9TSElGVCArIHBvcnQpOwotCi0JSTkxNV9XUklURShESVNQSU9fQ1JfVFhfQk1VX0NSMCwgcmVnKTsKKwlpZiAocG9ydCA9PSBQT1JUX0EgJiYgaW50ZWxfZGlnX3BvcnQtPm1heF9sYW5lcyA9PSA0KQorCQlfc2tsX2RkaV9zZXRfaWJvb3N0KGRldl9wcml2LCBQT1JUX0UsIGlib29zdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJ4dF9kZGlfdnN3aW5nX3NlcXVlbmNlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKQEAgLTE1NjgsNyArMTYwMyw3IEBACiAJbGV2ZWwgPSB0cmFuc2xhdGVfc2lnbmFsX2xldmVsKHNpZ25hbF9sZXZlbHMpOwogCiAJaWYgKElTX1NLWUxBS0UoZGV2X3ByaXYpIHx8IElTX0tBQllMQUtFKGRldl9wcml2KSkKLQkJc2tsX2RkaV9zZXRfaWJvb3N0KGRldl9wcml2LCBsZXZlbCwgcG9ydCwgZW5jb2Rlci0+dHlwZSk7CisJCXNrbF9kZGlfc2V0X2lib29zdChlbmNvZGVyLCBsZXZlbCk7CiAJZWxzZSBpZiAoSVNfQlJPWFRPTihkZXZfcHJpdikpCiAJCWJ4dF9kZGlfdnN3aW5nX3NlcXVlbmNlKGRldl9wcml2LCBsZXZlbCwgcG9ydCwgZW5jb2Rlci0+dHlwZSk7CiAKQEAgLTE2MzcsNiArMTY3MiwxMCBAQAogCQkJaW50ZWxfZHBfc3RvcF9saW5rX3RyYWluKGludGVsX2RwKTsKIAl9IGVsc2UgaWYgKHR5cGUgPT0gSU5URUxfT1VUUFVUX0hETUkpIHsKIAkJc3RydWN0IGludGVsX2hkbWkgKmludGVsX2hkbWkgPSBlbmNfdG9faW50ZWxfaGRtaShlbmNvZGVyKTsKKwkJaW50IGxldmVsID0gaW50ZWxfZGRpX2hkbWlfbGV2ZWwoZGV2X3ByaXYsIHBvcnQpOworCisJCWlmIChJU19TS1lMQUtFKGRldl9wcml2KSB8fCBJU19LQUJZTEFLRShkZXZfcHJpdikpCisJCQlza2xfZGRpX3NldF9pYm9vc3QoaW50ZWxfZW5jb2RlciwgbGV2ZWwpOwogCiAJCWludGVsX2hkbWktPnNldF9pbmZvZnJhbWVzKGVuY29kZXIsCiAJCQkJCSAgIGNydGMtPmNvbmZpZy0+aGFzX2hkbWlfc2luaywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwppbmRleCBkY2Y5M2IzLi4xNzU1OTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCkBAIC0zMDkzLDQwICszMDkzLDExMCBAQAogCiAJZm9yX2VhY2hfY3J0YyhkZXYsIGNydGMpIHsKIAkJc3RydWN0IGludGVsX3BsYW5lICpwbGFuZSA9IHRvX2ludGVsX3BsYW5lKGNydGMtPnByaW1hcnkpOwotCQlzdHJ1Y3QgaW50ZWxfcGxhbmVfc3RhdGUgKnBsYW5lX3N0YXRlOwotCi0JCWRybV9tb2Rlc2V0X2xvY2tfY3J0YyhjcnRjLCAmcGxhbmUtPmJhc2UpOwotCQlwbGFuZV9zdGF0ZSA9IHRvX2ludGVsX3BsYW5lX3N0YXRlKHBsYW5lLT5iYXNlLnN0YXRlKTsKKwkJc3RydWN0IGludGVsX3BsYW5lX3N0YXRlICpwbGFuZV9zdGF0ZSA9CisJCQl0b19pbnRlbF9wbGFuZV9zdGF0ZShwbGFuZS0+YmFzZS5zdGF0ZSk7CiAKIAkJaWYgKHBsYW5lX3N0YXRlLT52aXNpYmxlKQogCQkJcGxhbmUtPnVwZGF0ZV9wbGFuZSgmcGxhbmUtPmJhc2UsCiAJCQkJCSAgICB0b19pbnRlbF9jcnRjX3N0YXRlKGNydGMtPnN0YXRlKSwKIAkJCQkJICAgIHBsYW5lX3N0YXRlKTsKLQotCQlkcm1fbW9kZXNldF91bmxvY2tfY3J0YyhjcnRjKTsKIAl9CiB9CiAKK3N0YXRpYyBpbnQKK19faW50ZWxfZGlzcGxheV9yZXN1bWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGU7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCWludCBpLCByZXQ7CisKKwlpbnRlbF9tb2Rlc2V0X3NldHVwX2h3X3N0YXRlKGRldik7CisJaTkxNV9yZWRpc2FibGVfdmdhKGRldik7CisKKwlpZiAoIXN0YXRlKQorCQlyZXR1cm4gMDsKKworCWZvcl9lYWNoX2NydGNfaW5fc3RhdGUoc3RhdGUsIGNydGMsIGNydGNfc3RhdGUsIGkpIHsKKwkJLyoKKwkJICogRm9yY2UgcmVjYWxjdWxhdGlvbiBldmVuIGlmIHdlIHJlc3RvcmUKKwkJICogY3VycmVudCBzdGF0ZS4gV2l0aCBmYXN0IG1vZGVzZXQgdGhpcyBtYXkgbm90IHJlc3VsdAorCQkgKiBpbiBhIG1vZGVzZXQgd2hlbiB0aGUgc3RhdGUgaXMgY29tcGF0aWJsZS4KKwkJICovCisJCWNydGNfc3RhdGUtPm1vZGVfY2hhbmdlZCA9IHRydWU7CisJfQorCisJLyogaWdub3JlIGFueSByZXNldCB2YWx1ZXMvQklPUyBsZWZ0b3ZlcnMgaW4gdGhlIFdNIHJlZ2lzdGVycyAqLworCXRvX2ludGVsX2F0b21pY19zdGF0ZShzdGF0ZSktPnNraXBfaW50ZXJtZWRpYXRlX3dtID0gdHJ1ZTsKKworCXJldCA9IGRybV9hdG9taWNfY29tbWl0KHN0YXRlKTsKKworCVdBUk5fT04ocmV0ID09IC1FREVBRExLKTsKKwlyZXR1cm4gcmV0OworfQorCiB2b2lkIGludGVsX3ByZXBhcmVfcmVzZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAmZGV2X3ByaXYtPmRybTsKKwlzdHJ1Y3QgZHJtX21vZGVzZXRfYWNxdWlyZV9jdHggKmN0eCA9ICZkZXZfcHJpdi0+cmVzZXRfY3R4OworCXN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZTsKKwlpbnQgcmV0OworCiAJLyogbm8gcmVzZXQgc3VwcG9ydCBmb3IgZ2VuMiAqLwogCWlmIChJU19HRU4yKGRldl9wcml2KSkKIAkJcmV0dXJuOwogCi0JLyogcmVzZXQgZG9lc24ndCB0b3VjaCB0aGUgZGlzcGxheSAqLworCS8qCisJICogTmVlZCBtb2RlX2NvbmZpZy5tdXRleCBzbyB0aGF0IHdlIGRvbid0CisJICogdHJhbXBsZSBvbmdvaW5nIC0+ZGV0ZWN0KCkgYW5kIHdoYXRub3QuCisJICovCisJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJZHJtX21vZGVzZXRfYWNxdWlyZV9pbml0KGN0eCwgMCk7CisJd2hpbGUgKDEpIHsKKwkJcmV0ID0gZHJtX21vZGVzZXRfbG9ja19hbGxfY3R4KGRldiwgY3R4KTsKKwkJaWYgKHJldCAhPSAtRURFQURMSykKKwkJCWJyZWFrOworCisJCWRybV9tb2Rlc2V0X2JhY2tvZmYoY3R4KTsKKwl9CisKKwkvKiByZXNldCBkb2Vzbid0IHRvdWNoIHRoZSBkaXNwbGF5LCBidXQgZmxpcHMgbWlnaHQgZ2V0IG51a2VkIGFueXdheSwgKi8KIAlpZiAoSU5URUxfR0VOKGRldl9wcml2KSA+PSA1IHx8IElTX0c0WChkZXZfcHJpdikpCiAJCXJldHVybjsKIAotCWRybV9tb2Rlc2V0X2xvY2tfYWxsKCZkZXZfcHJpdi0+ZHJtKTsKIAkvKgogCSAqIERpc2FibGluZyB0aGUgY3J0Y3MgZ3JhY2VmdWxseSBzZWVtcyBuaWNlci4gQWxzbyB0aGUKIAkgKiBnMzMgZG9jcyBzYXkgd2Ugc2hvdWxkIGF0IGxlYXN0IGRpc2FibGUgYWxsIHRoZSBwbGFuZXMuCiAJICovCi0JaW50ZWxfZGlzcGxheV9zdXNwZW5kKCZkZXZfcHJpdi0+ZHJtKTsKKwlzdGF0ZSA9IGRybV9hdG9taWNfaGVscGVyX2R1cGxpY2F0ZV9zdGF0ZShkZXYsIGN0eCk7CisJaWYgKElTX0VSUihzdGF0ZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihzdGF0ZSk7CisJCXN0YXRlID0gTlVMTDsKKwkJRFJNX0VSUk9SKCJEdXBsaWNhdGluZyBzdGF0ZSBmYWlsZWQgd2l0aCAlaVxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gZHJtX2F0b21pY19oZWxwZXJfZGlzYWJsZV9hbGwoZGV2LCBjdHgpOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJTdXNwZW5kaW5nIGNydGMncyBmYWlsZWQgd2l0aCAlaVxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJZGV2X3ByaXYtPm1vZGVzZXRfcmVzdG9yZV9zdGF0ZSA9IHN0YXRlOworCXN0YXRlLT5hY3F1aXJlX2N0eCA9IGN0eDsKKwlyZXR1cm47CisKK2VycjoKKwlkcm1fYXRvbWljX3N0YXRlX2ZyZWUoc3RhdGUpOwogfQogCiB2b2lkIGludGVsX2ZpbmlzaF9yZXNldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9ICZkZXZfcHJpdi0+ZHJtOworCXN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCAqY3R4ID0gJmRldl9wcml2LT5yZXNldF9jdHg7CisJc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlID0gZGV2X3ByaXYtPm1vZGVzZXRfcmVzdG9yZV9zdGF0ZTsKKwlpbnQgcmV0OworCiAJLyoKIAkgKiBGbGlwcyBpbiB0aGUgcmluZ3Mgd2lsbCBiZSBudWtlZCBieSB0aGUgcmVzZXQsCiAJICogc28gY29tcGxldGUgYWxsIHBlbmRpbmcgZmxpcHMgc28gdGhhdCB1c2VyIHNwYWNlCkBAIC0zMTM4LDYgKzMyMDgsOCBAQAogCWlmIChJU19HRU4yKGRldl9wcml2KSkKIAkJcmV0dXJuOwogCisJZGV2X3ByaXYtPm1vZGVzZXRfcmVzdG9yZV9zdGF0ZSA9IE5VTEw7CisKIAkvKiByZXNldCBkb2Vzbid0IHRvdWNoIHRoZSBkaXNwbGF5ICovCiAJaWYgKElOVEVMX0dFTihkZXZfcHJpdikgPj0gNSB8fCBJU19HNFgoZGV2X3ByaXYpKSB7CiAJCS8qCkBAIC0zMTQ5LDI5ICszMjIxLDMyIEBACiAJCSAqIEZJWE1FOiBBdG9taWMgd2lsbCBtYWtlIHRoaXMgb2Jzb2xldGUgc2luY2Ugd2Ugd29uJ3Qgc2NoZWR1bGUKIAkJICogQ1MtYmFzZWQgZmxpcHMgKHdoaWNoIG1pZ2h0IGdldCBsb3N0IGluIGdwdSByZXNldHMpIGFueSBtb3JlLgogCQkgKi8KLQkJaW50ZWxfdXBkYXRlX3ByaW1hcnlfcGxhbmVzKCZkZXZfcHJpdi0+ZHJtKTsKLQkJcmV0dXJuOworCQlpbnRlbF91cGRhdGVfcHJpbWFyeV9wbGFuZXMoZGV2KTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgZGlzcGxheSBoYXMgYmVlbiByZXNldCBhcyB3ZWxsLAorCQkgKiBzbyBuZWVkIGEgZnVsbCByZS1pbml0aWFsaXphdGlvbi4KKwkJICovCisJCWludGVsX3J1bnRpbWVfcG1fZGlzYWJsZV9pbnRlcnJ1cHRzKGRldl9wcml2KTsKKwkJaW50ZWxfcnVudGltZV9wbV9lbmFibGVfaW50ZXJydXB0cyhkZXZfcHJpdik7CisKKwkJaW50ZWxfbW9kZXNldF9pbml0X2h3KGRldik7CisKKwkJc3Bpbl9sb2NrX2lycSgmZGV2X3ByaXYtPmlycV9sb2NrKTsKKwkJaWYgKGRldl9wcml2LT5kaXNwbGF5LmhwZF9pcnFfc2V0dXApCisJCQlkZXZfcHJpdi0+ZGlzcGxheS5ocGRfaXJxX3NldHVwKGRldl9wcml2KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZXZfcHJpdi0+aXJxX2xvY2spOworCisJCXJldCA9IF9faW50ZWxfZGlzcGxheV9yZXN1bWUoZGV2LCBzdGF0ZSk7CisJCWlmIChyZXQpCisJCQlEUk1fRVJST1IoIlJlc3RvcmluZyBvbGQgc3RhdGUgZmFpbGVkIHdpdGggJWlcbiIsIHJldCk7CisKKwkJaW50ZWxfaHBkX2luaXQoZGV2X3ByaXYpOwogCX0KIAotCS8qCi0JICogVGhlIGRpc3BsYXkgaGFzIGJlZW4gcmVzZXQgYXMgd2VsbCwKLQkgKiBzbyBuZWVkIGEgZnVsbCByZS1pbml0aWFsaXphdGlvbi4KLQkgKi8KLQlpbnRlbF9ydW50aW1lX3BtX2Rpc2FibGVfaW50ZXJydXB0cyhkZXZfcHJpdik7Ci0JaW50ZWxfcnVudGltZV9wbV9lbmFibGVfaW50ZXJydXB0cyhkZXZfcHJpdik7Ci0KLQlpbnRlbF9tb2Rlc2V0X2luaXRfaHcoJmRldl9wcml2LT5kcm0pOwotCi0Jc3Bpbl9sb2NrX2lycSgmZGV2X3ByaXYtPmlycV9sb2NrKTsKLQlpZiAoZGV2X3ByaXYtPmRpc3BsYXkuaHBkX2lycV9zZXR1cCkKLQkJZGV2X3ByaXYtPmRpc3BsYXkuaHBkX2lycV9zZXR1cChkZXZfcHJpdik7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZkZXZfcHJpdi0+aXJxX2xvY2spOwotCi0JaW50ZWxfZGlzcGxheV9yZXN1bWUoJmRldl9wcml2LT5kcm0pOwotCi0JaW50ZWxfaHBkX2luaXQoZGV2X3ByaXYpOwotCi0JZHJtX21vZGVzZXRfdW5sb2NrX2FsbCgmZGV2X3ByaXYtPmRybSk7CisJZHJtX21vZGVzZXRfZHJvcF9sb2NrcyhjdHgpOworCWRybV9tb2Rlc2V0X2FjcXVpcmVfZmluaShjdHgpOworCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CiB9CiAKIHN0YXRpYyBib29sIGludGVsX2NydGNfaGFzX3BlbmRpbmdfZmxpcChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCkBAIC0xMzY4NCw2ICsxMzc1OSwxMyBAQAogCQkgICAgIGludGVsX3N0YXRlLT5jZGNsa19wbGxfdmNvICE9IGRldl9wcml2LT5jZGNsa19wbGwudmNvKSkKIAkJCWRldl9wcml2LT5kaXNwbGF5Lm1vZGVzZXRfY29tbWl0X2NkY2xrKHN0YXRlKTsKIAorCQkvKgorCQkgKiBTS0wgd29ya2Fyb3VuZDogYnNwZWMgcmVjb21tZW5kcyB3ZSBkaXNhYmxlIHRoZSBTQUdWIHdoZW4gd2UKKwkJICogaGF2ZSBtb3JlIHRoZW4gb25lIHBpcGUgZW5hYmxlZAorCQkgKi8KKwkJaWYgKElTX1NLWUxBS0UoZGV2X3ByaXYpICYmICFza2xfY2FuX2VuYWJsZV9zYWd2KHN0YXRlKSkKKwkJCXNrbF9kaXNhYmxlX3NhZ3YoZGV2X3ByaXYpOworCiAJCWludGVsX21vZGVzZXRfdmVyaWZ5X2Rpc2FibGVkKGRldik7CiAJfQogCkBAIC0xMzc1Nyw2ICsxMzgzOSwxMCBAQAogCQlpbnRlbF9tb2Rlc2V0X3ZlcmlmeV9jcnRjKGNydGMsIG9sZF9jcnRjX3N0YXRlLCBjcnRjLT5zdGF0ZSk7CiAJfQogCisJaWYgKElTX1NLWUxBS0UoZGV2X3ByaXYpICYmIGludGVsX3N0YXRlLT5tb2Rlc2V0ICYmCisJICAgIHNrbF9jYW5fZW5hYmxlX3NhZ3Yoc3RhdGUpKQorCQlza2xfZW5hYmxlX3NhZ3YoZGV2X3ByaXYpOworCiAJZHJtX2F0b21pY19oZWxwZXJfY29tbWl0X2h3X2RvbmUoc3RhdGUpOwogCiAJaWYgKGludGVsX3N0YXRlLT5tb2Rlc2V0KQpAQCAtMTYxNTYsOSArMTYyNDIsMTAgQEAKIAlzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUgPSBkZXZfcHJpdi0+bW9kZXNldF9yZXN0b3JlX3N0YXRlOwogCXN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCBjdHg7CiAJaW50IHJldDsKLQlib29sIHNldHVwID0gZmFsc2U7CiAKIAlkZXZfcHJpdi0+bW9kZXNldF9yZXN0b3JlX3N0YXRlID0gTlVMTDsKKwlpZiAoc3RhdGUpCisJCXN0YXRlLT5hY3F1aXJlX2N0eCA9ICZjdHg7CiAKIAkvKgogCSAqIFRoaXMgaXMgYSBjbHVkZ2UgYmVjYXVzZSB3aXRoIHJlYWwgYXRvbWljIG1vZGVzZXQgbW9kZV9jb25maWcubXV0ZXgKQEAgLTE2MTY5LDQzICsxNjI1NiwxNyBAQAogCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOwogCWRybV9tb2Rlc2V0X2FjcXVpcmVfaW5pdCgmY3R4LCAwKTsKIAotcmV0cnk6Ci0JcmV0ID0gZHJtX21vZGVzZXRfbG9ja19hbGxfY3R4KGRldiwgJmN0eCk7CisJd2hpbGUgKDEpIHsKKwkJcmV0ID0gZHJtX21vZGVzZXRfbG9ja19hbGxfY3R4KGRldiwgJmN0eCk7CisJCWlmIChyZXQgIT0gLUVERUFETEspCisJCQlicmVhazsKIAotCWlmIChyZXQgPT0gMCAmJiAhc2V0dXApIHsKLQkJc2V0dXAgPSB0cnVlOwotCi0JCWludGVsX21vZGVzZXRfc2V0dXBfaHdfc3RhdGUoZGV2KTsKLQkJaTkxNV9yZWRpc2FibGVfdmdhKGRldik7Ci0JfQotCi0JaWYgKHJldCA9PSAwICYmIHN0YXRlKSB7Ci0JCXN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZTsKLQkJc3RydWN0IGRybV9jcnRjICpjcnRjOwotCQlpbnQgaTsKLQotCQlzdGF0ZS0+YWNxdWlyZV9jdHggPSAmY3R4OwotCi0JCS8qIGlnbm9yZSBhbnkgcmVzZXQgdmFsdWVzL0JJT1MgbGVmdG92ZXJzIGluIHRoZSBXTSByZWdpc3RlcnMgKi8KLQkJdG9faW50ZWxfYXRvbWljX3N0YXRlKHN0YXRlKS0+c2tpcF9pbnRlcm1lZGlhdGVfd20gPSB0cnVlOwotCi0JCWZvcl9lYWNoX2NydGNfaW5fc3RhdGUoc3RhdGUsIGNydGMsIGNydGNfc3RhdGUsIGkpIHsKLQkJCS8qCi0JCQkgKiBGb3JjZSByZWNhbGN1bGF0aW9uIGV2ZW4gaWYgd2UgcmVzdG9yZQotCQkJICogY3VycmVudCBzdGF0ZS4gV2l0aCBmYXN0IG1vZGVzZXQgdGhpcyBtYXkgbm90IHJlc3VsdAotCQkJICogaW4gYSBtb2Rlc2V0IHdoZW4gdGhlIHN0YXRlIGlzIGNvbXBhdGlibGUuCi0JCQkgKi8KLQkJCWNydGNfc3RhdGUtPm1vZGVfY2hhbmdlZCA9IHRydWU7Ci0JCX0KLQotCQlyZXQgPSBkcm1fYXRvbWljX2NvbW1pdChzdGF0ZSk7Ci0JfQotCi0JaWYgKHJldCA9PSAtRURFQURMSykgewogCQlkcm1fbW9kZXNldF9iYWNrb2ZmKCZjdHgpOwotCQlnb3RvIHJldHJ5OwogCX0KIAorCWlmICghcmV0KQorCQlyZXQgPSBfX2ludGVsX2Rpc3BsYXlfcmVzdW1lKGRldiwgc3RhdGUpOworCiAJZHJtX21vZGVzZXRfZHJvcF9sb2NrcygmY3R4KTsKIAlkcm1fbW9kZXNldF9hY3F1aXJlX2ZpbmkoJmN0eCk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKaW5kZXggY2M5MzdhMS4uZmYzOTliOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKQEAgLTE3MTYsNiArMTcxNiw5IEBACiB2b2lkIHNrbF93bV9nZXRfaHdfc3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiB2b2lkIHNrbF9kZGJfZ2V0X2h3X3N0YXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKIAkJCSAgc3RydWN0IHNrbF9kZGJfYWxsb2NhdGlvbiAqZGRiIC8qIG91dCAqLyk7Citib29sIHNrbF9jYW5fZW5hYmxlX3NhZ3Yoc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKTsKK2ludCBza2xfZW5hYmxlX3NhZ3Yoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKK2ludCBza2xfZGlzYWJsZV9zYWd2KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CiB1aW50MzJfdCBpbGtfcGlwZV9waXhlbF9yYXRlKGNvbnN0IHN0cnVjdCBpbnRlbF9jcnRjX3N0YXRlICpwaXBlX2NvbmZpZyk7CiBib29sIGlsa19kaXNhYmxlX2xwX3dtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogaW50IHNhbml0aXplX3JjNl9vcHRpb24oc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBpbnQgZW5hYmxlX3JjNik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kdm8uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2R2by5jCmluZGV4IDQ3YmRmOWQuLmI5ZTVhNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2R2by5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2R2by5jCkBAIC01NTQsNyArNTU0LDYgQEAKIAkJcmV0dXJuOwogCX0KIAotCWRybV9lbmNvZGVyX2NsZWFudXAoJmludGVsX2VuY29kZXItPmJhc2UpOwogCWtmcmVlKGludGVsX2R2byk7CiAJa2ZyZWUoaW50ZWxfY29ubmVjdG9yKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2ZiYy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmJjLmMKaW5kZXggNmE3YWQzZS4uMzgzNmExYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmJjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmJjLmMKQEAgLTEyMzAsMTIgKzEyMzAsMjkgQEAKIAlpZiAoaTkxNS5lbmFibGVfZmJjID49IDApCiAJCXJldHVybiAhIWk5MTUuZW5hYmxlX2ZiYzsKIAorCWlmICghSEFTX0ZCQyhkZXZfcHJpdikpCisJCXJldHVybiAwOworCiAJaWYgKElTX0JST0FEV0VMTChkZXZfcHJpdikpCiAJCXJldHVybiAxOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBib29sIG5lZWRfZmJjX3Z0ZF93YShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisjaWZkZWYgQ09ORklHX0lOVEVMX0lPTU1VCisJLyogV2FGYmNUdXJuT2ZmRmJjV2hlbkh5cGVyVmlzb3JJc1VzZWQ6c2tsLGJ4dCAqLworCWlmIChpbnRlbF9pb21tdV9nZnhfbWFwcGVkICYmCisJICAgIChJU19TS1lMQUtFKGRldl9wcml2KSB8fCBJU19CUk9YVE9OKGRldl9wcml2KSkpIHsKKwkJRFJNX0lORk8oIkRpc2FibGluZyBmcmFtZWJ1ZmZlciBjb21wcmVzc2lvbiAoRkJDKSB0byBwcmV2ZW50IHNjcmVlbiBmbGlja2VyIHdpdGggVlQtZCBlbmFibGVkXG4iKTsKKwkJcmV0dXJuIHRydWU7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIC8qKgogICogaW50ZWxfZmJjX2luaXQgLSBJbml0aWFsaXplIEZCQwogICogQGRldl9wcml2OiB0aGUgaTkxNSBkZXZpY2UKQEAgLTEyNTMsNiArMTI3MCw5IEBACiAJZmJjLT5hY3RpdmUgPSBmYWxzZTsKIAlmYmMtPndvcmsuc2NoZWR1bGVkID0gZmFsc2U7CiAKKwlpZiAobmVlZF9mYmNfdnRkX3dhKGRldl9wcml2KSkKKwkJbWt3cml0ZV9kZXZpY2VfaW5mbyhkZXZfcHJpdiktPmhhc19mYmMgPSBmYWxzZTsKKwogCWk5MTUuZW5hYmxlX2ZiYyA9IGludGVsX3Nhbml0aXplX2ZiY19vcHRpb24oZGV2X3ByaXYpOwogCURSTV9ERUJVR19LTVMoIlNhbml0aXplZCBlbmFibGVfZmJjIHZhbHVlOiAlZFxuIiwgaTkxNS5lbmFibGVfZmJjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ByZWdpb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX29wcmVnaW9uLmMKaW5kZXggYWRjYTI2Mi4uN2FjYmJiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ByZWdpb24uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vcHJlZ2lvbi5jCkBAIC0xMDQ3LDYgKzEwNDcsMjMgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IGludGVsX3VzZV9vcHJlZ2lvbl9wYW5lbF90eXBlX2NhbGxiYWNrKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKK3sKKwlEUk1fSU5GTygiVXNpbmcgcGFuZWwgdHlwZSBmcm9tIE9wUmVnaW9uIG9uICVzXG4iLCBpZC0+aWRlbnQpOworCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgaW50ZWxfdXNlX29wcmVnaW9uX3BhbmVsX3R5cGVbXSA9IHsKKwl7CisJCS5jYWxsYmFjayA9IGludGVsX3VzZV9vcHJlZ2lvbl9wYW5lbF90eXBlX2NhbGxiYWNrLAorCQkuaWRlbnQgPSAiQ29ucmFjIEdtYkggSVg0NUdNMiIsCisJCS5tYXRjaGVzID0ge0RNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkNvbnJhYyBHbWJIIiksCisJCQkgICAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJJWDQ1R00yIiksCisJCX0sCisJfSwKKwl7IH0KK307CisKIGludAogaW50ZWxfb3ByZWdpb25fZ2V0X3BhbmVsX3R5cGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogewpAQCAtMTA3Myw2ICsxMDkwLDE2IEBACiAJfQogCiAJLyoKKwkgKiBTbyBmYXIgd2Uga25vdyB0aGF0IHNvbWUgbWFjaGluZWQgbXVzdCB1c2UgaXQsIG90aGVycyBtdXN0IG5vdCB1c2UgaXQuCisJICogVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSB3YXkgdG8gZGV0ZXJtaW5lIHdoaWNoIHdheSB0byBnbywgZXhjZXB0CisJICogdmlhIGEgcXVpcmsgbGlzdCA6KAorCSAqLworCWlmICghZG1pX2NoZWNrX3N5c3RlbShpbnRlbF91c2Vfb3ByZWdpb25fcGFuZWxfdHlwZSkpIHsKKwkJRFJNX0RFQlVHX0tNUygiSWdub3JpbmcgT3BSZWdpb24gcGFuZWwgdHlwZSAoJWQpXG4iLCByZXQgLSAxKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyoKIAkgKiBGSVhNRSBPbiBEZWxsIFhQUyAxMyA5MzUwIHRoZSBPcFJlZ2lvbiBwYW5lbCB0eXBlICgwKSBnaXZlcyB1cwogCSAqIGxvdyB2c3dpbmcgZm9yIGVEUCwgd2hlcmVhcyB0aGUgVkJUIHBhbmVsIHR5cGUgKDIpIGdpdmVzIHVzIG5vcm1hbAogCSAqIHZzd2luZyBpbnN0ZWFkLiBMb3cgdnN3aW5nIHJlc3VsdHMgaW4gc29tZSBkaXNwbGF5IGZsaWNrZXJzLCBzbwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3BtLmMKaW5kZXggOTdiYTZjOC4uMmQyNDgxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wbS5jCkBAIC0yODUyLDYgKzI4NTIsNyBAQAogCiAjZGVmaW5lIFNLTF9EREJfU0laRQkJODk2CS8qIGluIGJsb2NrcyAqLwogI2RlZmluZSBCWFRfRERCX1NJWkUJCTUxMgorI2RlZmluZSBTS0xfU0FHVl9CTE9DS19USU1FCTMwIC8qIMK1cyAqLwogCiAvKgogICogUmV0dXJuIHRoZSBpbmRleCBvZiBhIHBsYW5lIGluIHRoZSBTS0wgRERCIGFuZCB3bSByZXN1bHQgYXJyYXlzLiAgUHJpbWFyeQpAQCAtMjg3NSw2ICsyODc2LDE1MyBAQAogCX0KIH0KIAorLyoKKyAqIFNBR1YgZHluYW1pY2FsbHkgYWRqdXN0cyB0aGUgc3lzdGVtIGFnZW50IHZvbHRhZ2UgYW5kIGNsb2NrIGZyZXF1ZW5jaWVzCisgKiBkZXBlbmRpbmcgb24gcG93ZXIgYW5kIHBlcmZvcm1hbmNlIHJlcXVpcmVtZW50cy4gVGhlIGRpc3BsYXkgZW5naW5lIGFjY2VzcworICogdG8gc3lzdGVtIG1lbW9yeSBpcyBibG9ja2VkIGR1cmluZyB0aGUgYWRqdXN0bWVudCB0aW1lLiBCZWNhdXNlIG9mIHRoZQorICogYmxvY2tpbmcgdGltZSwgaGF2aW5nIHRoaXMgZW5hYmxlZCBjYW4gY2F1c2UgZnVsbCBzeXN0ZW0gaGFuZ3MgYW5kL29yIHBpcGUKKyAqIHVuZGVycnVucyBpZiB3ZSBkb24ndCBtZWV0IGFsbCBvZiB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50czoKKyAqCisgKiAgLSA8PSAxIHBpcGUgZW5hYmxlZAorICogIC0gQWxsIHBsYW5lcyBjYW4gZW5hYmxlIHdhdGVybWFya3MgZm9yIGxhdGVuY2llcyA+PSBTQUdWIGVuZ2luZSBibG9jayB0aW1lCisgKiAgLSBXZSdyZSBub3QgdXNpbmcgYW4gaW50ZXJsYWNlZCBkaXNwbGF5IGNvbmZpZ3VyYXRpb24KKyAqLworaW50Citza2xfZW5hYmxlX3NhZ3Yoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCWludCByZXQ7CisKKwlpZiAoZGV2X3ByaXYtPnNrbF9zYWd2X3N0YXR1cyA9PSBJOTE1X1NLTF9TQUdWX05PVF9DT05UUk9MTEVEIHx8CisJICAgIGRldl9wcml2LT5za2xfc2Fndl9zdGF0dXMgPT0gSTkxNV9TS0xfU0FHVl9FTkFCTEVEKQorCQlyZXR1cm4gMDsKKworCURSTV9ERUJVR19LTVMoIkVuYWJsaW5nIHRoZSBTQUdWXG4iKTsKKwltdXRleF9sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOworCisJcmV0ID0gc2FuZHlicmlkZ2VfcGNvZGVfd3JpdGUoZGV2X3ByaXYsIEdFTjlfUENPREVfU0FHVl9DT05UUk9MLAorCQkJCSAgICAgIEdFTjlfU0FHVl9FTkFCTEUpOworCisJLyogV2UgZG9uJ3QgbmVlZCB0byB3YWl0IGZvciB0aGUgU0FHViB3aGVuIGVuYWJsaW5nICovCisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOworCisJLyoKKwkgKiBTb21lIHNrbCBzeXN0ZW1zLCBwcmUtcmVsZWFzZSBtYWNoaW5lcyBpbiBwYXJ0aWN1bGFyLAorCSAqIGRvbid0IGFjdHVhbGx5IGhhdmUgYW4gU0FHVi4KKwkgKi8KKwlpZiAocmV0ID09IC1FTlhJTykgeworCQlEUk1fREVCVUdfRFJJVkVSKCJObyBTQUdWIGZvdW5kIG9uIHN5c3RlbSwgaWdub3JpbmdcbiIpOworCQlkZXZfcHJpdi0+c2tsX3NhZ3Zfc3RhdHVzID0gSTkxNV9TS0xfU0FHVl9OT1RfQ09OVFJPTExFRDsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChyZXQgPCAwKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGVuYWJsZSB0aGUgU0FHVlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZGV2X3ByaXYtPnNrbF9zYWd2X3N0YXR1cyA9IEk5MTVfU0tMX1NBR1ZfRU5BQkxFRDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2tsX2RvX3NhZ3ZfZGlzYWJsZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJaW50IHJldDsKKwl1aW50MzJfdCB0ZW1wID0gR0VOOV9TQUdWX0RJU0FCTEU7CisKKwlyZXQgPSBzYW5keWJyaWRnZV9wY29kZV9yZWFkKGRldl9wcml2LCBHRU45X1BDT0RFX1NBR1ZfQ09OVFJPTCwKKwkJCQkgICAgICZ0ZW1wKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWVsc2UKKwkJcmV0dXJuIHRlbXAgJiBHRU45X1NBR1ZfSVNfRElTQUJMRUQ7Cit9CisKK2ludAorc2tsX2Rpc2FibGVfc2FndihzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJaW50IHJldCwgcmVzdWx0OworCisJaWYgKGRldl9wcml2LT5za2xfc2Fndl9zdGF0dXMgPT0gSTkxNV9TS0xfU0FHVl9OT1RfQ09OVFJPTExFRCB8fAorCSAgICBkZXZfcHJpdi0+c2tsX3NhZ3Zfc3RhdHVzID09IEk5MTVfU0tMX1NBR1ZfRElTQUJMRUQpCisJCXJldHVybiAwOworCisJRFJNX0RFQlVHX0tNUygiRGlzYWJsaW5nIHRoZSBTQUdWXG4iKTsKKwltdXRleF9sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOworCisJLyogYnNwZWMgc2F5cyB0byBrZWVwIHJldHJ5aW5nIGZvciBhdCBsZWFzdCAxIG1zICovCisJcmV0ID0gd2FpdF9mb3IocmVzdWx0ID0gc2tsX2RvX3NhZ3ZfZGlzYWJsZShkZXZfcHJpdiksIDEpOworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKKworCWlmIChyZXQgPT0gLUVUSU1FRE9VVCkgeworCQlEUk1fRVJST1IoIlJlcXVlc3QgdG8gZGlzYWJsZSBTQUdWIHRpbWVkIG91dFxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCS8qCisJICogU29tZSBza2wgc3lzdGVtcywgcHJlLXJlbGVhc2UgbWFjaGluZXMgaW4gcGFydGljdWxhciwKKwkgKiBkb24ndCBhY3R1YWxseSBoYXZlIGFuIFNBR1YuCisJICovCisJaWYgKHJlc3VsdCA9PSAtRU5YSU8pIHsKKwkJRFJNX0RFQlVHX0RSSVZFUigiTm8gU0FHViBmb3VuZCBvbiBzeXN0ZW0sIGlnbm9yaW5nXG4iKTsKKwkJZGV2X3ByaXYtPnNrbF9zYWd2X3N0YXR1cyA9IEk5MTVfU0tMX1NBR1ZfTk9UX0NPTlRST0xMRUQ7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAocmVzdWx0IDwgMCkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBkaXNhYmxlIHRoZSBTQUdWXG4iKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlkZXZfcHJpdi0+c2tsX3NhZ3Zfc3RhdHVzID0gSTkxNV9TS0xfU0FHVl9ESVNBQkxFRDsKKwlyZXR1cm4gMDsKK30KKworYm9vbCBza2xfY2FuX2VuYWJsZV9zYWd2KHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gc3RhdGUtPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7CisJc3RydWN0IGludGVsX2F0b21pY19zdGF0ZSAqaW50ZWxfc3RhdGUgPSB0b19pbnRlbF9hdG9taWNfc3RhdGUoc3RhdGUpOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwllbnVtIHBpcGUgcGlwZTsKKwlpbnQgbGV2ZWwsIHBsYW5lOworCisJLyoKKwkgKiBTS0wgd29ya2Fyb3VuZDogYnNwZWMgcmVjb21tZW5kcyB3ZSBkaXNhYmxlIHRoZSBTQUdWIHdoZW4gd2UgaGF2ZQorCSAqIG1vcmUgdGhlbiBvbmUgcGlwZSBlbmFibGVkCisJICoKKwkgKiBJZiB0aGVyZSBhcmUgbm8gYWN0aXZlIENSVENzLCBubyBhZGRpdGlvbmFsIGNoZWNrcyBuZWVkIGJlIHBlcmZvcm1lZAorCSAqLworCWlmIChod2VpZ2h0MzIoaW50ZWxfc3RhdGUtPmFjdGl2ZV9jcnRjcykgPT0gMCkKKwkJcmV0dXJuIHRydWU7CisJZWxzZSBpZiAoaHdlaWdodDMyKGludGVsX3N0YXRlLT5hY3RpdmVfY3J0Y3MpID4gMSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogU2luY2Ugd2UncmUgbm93IGd1YXJhbnRlZWQgdG8gb25seSBoYXZlIG9uZSBhY3RpdmUgQ1JUQy4uLiAqLworCXBpcGUgPSBmZnMoaW50ZWxfc3RhdGUtPmFjdGl2ZV9jcnRjcykgLSAxOworCWNydGMgPSBkZXZfcHJpdi0+cGlwZV90b19jcnRjX21hcHBpbmdbcGlwZV07CisKKwlpZiAoY3J0Yy0+c3RhdGUtPm1vZGUuZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkKKwkJcmV0dXJuIGZhbHNlOworCisJZm9yX2VhY2hfcGxhbmUoZGV2X3ByaXYsIHBpcGUsIHBsYW5lKSB7CisJCS8qIFNraXAgdGhpcyBwbGFuZSBpZiBpdCdzIG5vdCBlbmFibGVkICovCisJCWlmIChpbnRlbF9zdGF0ZS0+d21fcmVzdWx0cy5wbGFuZVtwaXBlXVtwbGFuZV1bMF0gPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIEZpbmQgdGhlIGhpZ2hlc3QgZW5hYmxlZCB3bSBsZXZlbCBmb3IgdGhpcyBwbGFuZSAqLworCQlmb3IgKGxldmVsID0gaWxrX3dtX21heF9sZXZlbChkZXYpOworCQkgICAgIGludGVsX3N0YXRlLT53bV9yZXN1bHRzLnBsYW5lW3BpcGVdW3BsYW5lXVtsZXZlbF0gPT0gMDsgLS1sZXZlbCkKKwkJICAgICB7IH0KKworCQkvKgorCQkgKiBJZiBhbnkgb2YgdGhlIHBsYW5lcyBvbiB0aGlzIHBpcGUgZG9uJ3QgZW5hYmxlIHdtIGxldmVscworCQkgKiB0aGF0IGluY3VyIG1lbW9yeSBsYXRlbmNpZXMgaGlnaGVyIHRoZW4gMzDCtXMgd2UgY2FuJ3QgZW5hYmxlCisJCSAqIHRoZSBTQUdWCisJCSAqLworCQlpZiAoZGV2X3ByaXYtPndtLnNrbF9sYXRlbmN5W2xldmVsXSA8IFNLTF9TQUdWX0JMT0NLX1RJTUUpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyB2b2lkCiBza2xfZGRiX2dldF9waXBlX2FsbG9jYXRpb25fbGltaXRzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJICAgY29uc3Qgc3RydWN0IGludGVsX2NydGNfc3RhdGUgKmNzdGF0ZSwKQEAgLTMxMDcsOCArMzI1NSw2IEBACiAJCXRvdGFsX2RhdGFfcmF0ZSArPSBpbnRlbF9jc3RhdGUtPndtLnNrbC5wbGFuZV95X2RhdGFfcmF0ZVtpZF07CiAJfQogCi0JV0FSTl9PTihjc3RhdGUtPnBsYW5lX21hc2sgJiYgdG90YWxfZGF0YV9yYXRlID09IDApOwotCiAJcmV0dXJuIHRvdGFsX2RhdGFfcmF0ZTsKIH0KIApAQCAtMzM0NCw2ICszNDkwLDggQEAKIAkJcGxhbmVfYnl0ZXNfcGVyX2xpbmUgKj0gNDsKIAkJcGxhbmVfYmxvY2tzX3Blcl9saW5lID0gRElWX1JPVU5EX1VQKHBsYW5lX2J5dGVzX3Blcl9saW5lLCA1MTIpOwogCQlwbGFuZV9ibG9ja3NfcGVyX2xpbmUgLz0gNDsKKwl9IGVsc2UgaWYgKHRpbGluZyA9PSBEUk1fRk9STUFUX01PRF9OT05FKSB7CisJCXBsYW5lX2Jsb2Nrc19wZXJfbGluZSA9IERJVl9ST1VORF9VUChwbGFuZV9ieXRlc19wZXJfbGluZSwgNTEyKSArIDE7CiAJfSBlbHNlIHsKIAkJcGxhbmVfYmxvY2tzX3Blcl9saW5lID0gRElWX1JPVU5EX1VQKHBsYW5lX2J5dGVzX3Blcl9saW5lLCA1MTIpOwogCX0KQEAgLTM5MTAsOSArNDA1OCwyNCBAQAogCSAqIHByZXRlbmQgdGhhdCBhbGwgcGlwZXMgc3dpdGNoZWQgYWN0aXZlIHN0YXR1cyBzbyB0aGF0IHdlJ2xsCiAJICogZW5zdXJlIGEgZnVsbCBEREIgcmVjb21wdXRlLgogCSAqLwotCWlmIChkZXZfcHJpdi0+d20uZGlzdHJ1c3RfYmlvc193bSkKKwlpZiAoZGV2X3ByaXYtPndtLmRpc3RydXN0X2Jpb3Nfd20pIHsKKwkJcmV0ID0gZHJtX21vZGVzZXRfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0aW9uX211dGV4LAorCQkJCSAgICAgICBzdGF0ZS0+YWNxdWlyZV9jdHgpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwogCQlpbnRlbF9zdGF0ZS0+YWN0aXZlX3BpcGVfY2hhbmdlcyA9IH4wOwogCisJCS8qCisJCSAqIFdlIHVzdWFsbHkgb25seSBpbml0aWFsaXplIGludGVsX3N0YXRlLT5hY3RpdmVfY3J0Y3MgaWYgd2UKKwkJICogd2UncmUgZG9pbmcgYSBtb2Rlc2V0OyBtYWtlIHN1cmUgdGhpcyBmaWVsZCBpcyBhbHdheXMKKwkJICogaW5pdGlhbGl6ZWQgZHVyaW5nIHRoZSBzYW5pdGl6YXRpb24gcHJvY2VzcyB0aGF0IGhhcHBlbnMKKwkJICogb24gdGhlIGZpcnN0IGNvbW1pdCB0b28uCisJCSAqLworCQlpZiAoIWludGVsX3N0YXRlLT5tb2Rlc2V0KQorCQkJaW50ZWxfc3RhdGUtPmFjdGl2ZV9jcnRjcyA9IGRldl9wcml2LT5hY3RpdmVfY3J0Y3M7CisJfQorCiAJLyoKIAkgKiBJZiB0aGUgbW9kZXNldCBjaGFuZ2VzIHdoaWNoIENSVEMncyBhcmUgYWN0aXZlLCB3ZSBuZWVkIHRvCiAJICogcmVjb21wdXRlIHRoZSBEREIgYWxsb2NhdGlvbiBmb3IgKmFsbCogYWN0aXZlIHBpcGVzLCBldmVuCkBAIC0zOTQxLDExICs0MTA0LDMzIEBACiAJCXJldCA9IHNrbF9hbGxvY2F0ZV9waXBlX2RkYihjc3RhdGUsIGRkYik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGRybV9hdG9taWNfYWRkX2FmZmVjdGVkX3BsYW5lcyhzdGF0ZSwgJmludGVsX2NydGMtPmJhc2UpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQKK3NrbF9jb3B5X3dtX2Zvcl9waXBlKHN0cnVjdCBza2xfd21fdmFsdWVzICpkc3QsCisJCSAgICAgc3RydWN0IHNrbF93bV92YWx1ZXMgKnNyYywKKwkJICAgICBlbnVtIHBpcGUgcGlwZSkKK3sKKwlkc3QtPndtX2xpbmV0aW1lW3BpcGVdID0gc3JjLT53bV9saW5ldGltZVtwaXBlXTsKKwltZW1jcHkoZHN0LT5wbGFuZVtwaXBlXSwgc3JjLT5wbGFuZVtwaXBlXSwKKwkgICAgICAgc2l6ZW9mKGRzdC0+cGxhbmVbcGlwZV0pKTsKKwltZW1jcHkoZHN0LT5wbGFuZV90cmFuc1twaXBlXSwgc3JjLT5wbGFuZV90cmFuc1twaXBlXSwKKwkgICAgICAgc2l6ZW9mKGRzdC0+cGxhbmVfdHJhbnNbcGlwZV0pKTsKKworCWRzdC0+ZGRiLnBpcGVbcGlwZV0gPSBzcmMtPmRkYi5waXBlW3BpcGVdOworCW1lbWNweShkc3QtPmRkYi55X3BsYW5lW3BpcGVdLCBzcmMtPmRkYi55X3BsYW5lW3BpcGVdLAorCSAgICAgICBzaXplb2YoZHN0LT5kZGIueV9wbGFuZVtwaXBlXSkpOworCW1lbWNweShkc3QtPmRkYi5wbGFuZVtwaXBlXSwgc3JjLT5kZGIucGxhbmVbcGlwZV0sCisJICAgICAgIHNpemVvZihkc3QtPmRkYi5wbGFuZVtwaXBlXSkpOworfQorCiBzdGF0aWMgaW50CiBza2xfY29tcHV0ZV93bShzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpCiB7CkBAIC00MDE4LDggKzQyMDMsMTAgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoZGV2KTsKIAlzdHJ1Y3Qgc2tsX3dtX3ZhbHVlcyAqcmVzdWx0cyA9ICZkZXZfcHJpdi0+d20uc2tsX3Jlc3VsdHM7CisJc3RydWN0IHNrbF93bV92YWx1ZXMgKmh3X3ZhbHMgPSAmZGV2X3ByaXYtPndtLnNrbF9odzsKIAlzdHJ1Y3QgaW50ZWxfY3J0Y19zdGF0ZSAqY3N0YXRlID0gdG9faW50ZWxfY3J0Y19zdGF0ZShjcnRjLT5zdGF0ZSk7CiAJc3RydWN0IHNrbF9waXBlX3dtICpwaXBlX3dtID0gJmNzdGF0ZS0+d20uc2tsLm9wdGltYWw7CisJaW50IHBpcGU7CiAKIAlpZiAoKHJlc3VsdHMtPmRpcnR5X3BpcGVzICYgZHJtX2NydGNfbWFzayhjcnRjKSkgPT0gMCkKIAkJcmV0dXJuOwpAQCAtNDAzMSw4ICs0MjE4LDEyIEBACiAJc2tsX3dyaXRlX3dtX3ZhbHVlcyhkZXZfcHJpdiwgcmVzdWx0cyk7CiAJc2tsX2ZsdXNoX3dtX3ZhbHVlcyhkZXZfcHJpdiwgcmVzdWx0cyk7CiAKLQkvKiBzdG9yZSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gKi8KLQlkZXZfcHJpdi0+d20uc2tsX2h3ID0gKnJlc3VsdHM7CisJLyoKKwkgKiBTdG9yZSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gKGJ1dCBvbmx5IGZvciB0aGUgcGlwZXMgdGhhdCBoYXZlCisJICogY2hhbmdlZDsgdGhlIG90aGVyIHZhbHVlcyB3ZXJlbid0IHJlY29tcHV0ZWQpLgorCSAqLworCWZvcl9lYWNoX3BpcGVfbWFza2VkKGRldl9wcml2LCBwaXBlLCByZXN1bHRzLT5kaXJ0eV9waXBlcykKKwkJc2tsX2NvcHlfd21fZm9yX3BpcGUoaHdfdmFscywgcmVzdWx0cywgcGlwZSk7CiAKIAltdXRleF91bmxvY2soJmRldl9wcml2LT53bS53bV9tdXRleCk7CiB9CkBAIC02NTc0LDkgKzY3NjUsNyBAQAogCiB2b2lkIGludGVsX2NsZWFudXBfZ3RfcG93ZXJzYXZlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIHsKLQlpZiAoSVNfQ0hFUlJZVklFVyhkZXZfcHJpdikpCi0JCXJldHVybjsKLQllbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldl9wcml2KSkKKwlpZiAoSVNfVkFMTEVZVklFVyhkZXZfcHJpdikpCiAJCXZhbGxleXZpZXdfY2xlYW51cF9ndF9wb3dlcnNhdmUoZGV2X3ByaXYpOwogCiAJaWYgKCFpOTE1LmVuYWJsZV9yYzYpCkBAIC03NjU4LDggKzc4NDcsNTQgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGdlbjZfY2hlY2tfbWFpbGJveF9zdGF0dXMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXVpbnQzMl90IGZsYWdzID0KKwkJSTkxNV9SRUFEX0ZXKEdFTjZfUENPREVfTUFJTEJPWCkgJiBHRU42X1BDT0RFX0VSUk9SX01BU0s7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBHRU42X1BDT0RFX1NVQ0NFU1M6CisJCXJldHVybiAwOworCWNhc2UgR0VONl9QQ09ERV9VTklNUExFTUVOVEVEX0NNRDoKKwljYXNlIEdFTjZfUENPREVfSUxMRUdBTF9DTUQ6CisJCXJldHVybiAtRU5YSU87CisJY2FzZSBHRU42X1BDT0RFX01JTl9GUkVRX1RBQkxFX0dUX1JBVElPX09VVF9PRl9SQU5HRToKKwljYXNlIEdFTjdfUENPREVfTUlOX0ZSRVFfVEFCTEVfR1RfUkFUSU9fT1VUX09GX1JBTkdFOgorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKwljYXNlIEdFTjZfUENPREVfVElNRU9VVDoKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJZGVmYXVsdDoKKwkJTUlTU0lOR19DQVNFKGZsYWdzKQorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdlbjdfY2hlY2tfbWFpbGJveF9zdGF0dXMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXVpbnQzMl90IGZsYWdzID0KKwkJSTkxNV9SRUFEX0ZXKEdFTjZfUENPREVfTUFJTEJPWCkgJiBHRU42X1BDT0RFX0VSUk9SX01BU0s7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBHRU42X1BDT0RFX1NVQ0NFU1M6CisJCXJldHVybiAwOworCWNhc2UgR0VONl9QQ09ERV9JTExFR0FMX0NNRDoKKwkJcmV0dXJuIC1FTlhJTzsKKwljYXNlIEdFTjdfUENPREVfVElNRU9VVDoKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJY2FzZSBHRU43X1BDT0RFX0lMTEVHQUxfREFUQToKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBHRU43X1BDT0RFX01JTl9GUkVRX1RBQkxFX0dUX1JBVElPX09VVF9PRl9SQU5HRToKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJZGVmYXVsdDoKKwkJTUlTU0lOR19DQVNFKGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCiBpbnQgc2FuZHlicmlkZ2VfcGNvZGVfcmVhZChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiBtYm94LCB1MzIgKnZhbCkKIHsKKwlpbnQgc3RhdHVzOworCiAJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spKTsKIAogCS8qIEdFTjZfUENPREVfKiBhcmUgb3V0c2lkZSBvZiB0aGUgZm9yY2V3YWtlIGRvbWFpbiwgd2UgY2FuCkBAIC03Njg2LDEyICs3OTIxLDI1IEBACiAJKnZhbCA9IEk5MTVfUkVBRF9GVyhHRU42X1BDT0RFX0RBVEEpOwogCUk5MTVfV1JJVEVfRlcoR0VONl9QQ09ERV9EQVRBLCAwKTsKIAorCWlmIChJTlRFTF9HRU4oZGV2X3ByaXYpID4gNikKKwkJc3RhdHVzID0gZ2VuN19jaGVja19tYWlsYm94X3N0YXR1cyhkZXZfcHJpdik7CisJZWxzZQorCQlzdGF0dXMgPSBnZW42X2NoZWNrX21haWxib3hfc3RhdHVzKGRldl9wcml2KTsKKworCWlmIChzdGF0dXMpIHsKKwkJRFJNX0RFQlVHX0RSSVZFUigid2FybmluZzogcGNvZGUgKHJlYWQpIG1haWxib3ggYWNjZXNzIGZhaWxlZDogJWRcbiIsCisJCQkJIHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKIGludCBzYW5keWJyaWRnZV9wY29kZV93cml0ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkgICAgICAgdTMyIG1ib3gsIHUzMiB2YWwpCisJCQkgICAgdTMyIG1ib3gsIHUzMiB2YWwpCiB7CisJaW50IHN0YXR1czsKKwogCVdBUk5fT04oIW11dGV4X2lzX2xvY2tlZCgmZGV2X3ByaXYtPnJwcy5od19sb2NrKSk7CiAKIAkvKiBHRU42X1BDT0RFXyogYXJlIG91dHNpZGUgb2YgdGhlIGZvcmNld2FrZSBkb21haW4sIHdlIGNhbgpAQCAtNzcxNiw2ICs3OTY0LDE3IEBACiAKIAlJOTE1X1dSSVRFX0ZXKEdFTjZfUENPREVfREFUQSwgMCk7CiAKKwlpZiAoSU5URUxfR0VOKGRldl9wcml2KSA+IDYpCisJCXN0YXR1cyA9IGdlbjdfY2hlY2tfbWFpbGJveF9zdGF0dXMoZGV2X3ByaXYpOworCWVsc2UKKwkJc3RhdHVzID0gZ2VuNl9jaGVja19tYWlsYm94X3N0YXR1cyhkZXZfcHJpdik7CisKKwlpZiAoc3RhdHVzKSB7CisJCURSTV9ERUJVR19EUklWRVIoIndhcm5pbmc6IHBjb2RlICh3cml0ZSkgbWFpbGJveCBhY2Nlc3MgZmFpbGVkOiAlZFxuIiwKKwkJCQkgc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcHNyLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wc3IuYwppbmRleCAyYjBkMWJhLi5jZjE3MWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wc3IuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wc3IuYwpAQCAtMjU1LDE0ICsyNTUsMTQgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7CiAKIAl1aW50MzJfdCBtYXhfc2xlZXBfdGltZSA9IDB4MWY7Ci0JLyogTGF0ZWx5IGl0IHdhcyBpZGVudGlmaWVkIHRoYXQgZGVwZW5kaW5nIG9uIHBhbmVsIGlkbGUgZnJhbWUgY291bnQKLQkgKiBjYWxjdWxhdGVkIGF0IEhXIGNhbiBiZSBvZmYgYnkgMS4gU28gbGV0J3MgdXNlIHdoYXQgY2FtZQotCSAqIGZyb20gVkJUICsgMS4KLQkgKiBUaGVyZSBhcmUgYWxzbyBvdGhlciBjYXNlcyB3aGVyZSBwYW5lbCBkZW1hbmRzIGF0IGxlYXN0IDQKLQkgKiBidXQgVkJUIGlzIG5vdCBiZWluZyBzZXQuIFRvIGNvdmVyIHRoZXNlIDIgY2FzZXMgbGV0cyB1c2UKLQkgKiBhdCBsZWFzdCA1IHdoZW4gVkJUIGlzbid0IHNldCB0byBiZSBvbiB0aGUgc2FmZXN0IHNpZGUuCisJLyoKKwkgKiBMZXQncyByZXNwZWN0IFZCVCBpbiBjYXNlIFZCVCBhc2tzIGEgaGlnaGVyIGlkbGVfZnJhbWUgdmFsdWUuCisJICogTGV0J3MgdXNlIDYgYXMgdGhlIG1pbmltdW0gdG8gY292ZXIgYWxsIGtub3duIGNhc2VzIGluY2x1ZGluZworCSAqIHRoZSBvZmYtYnktb25lIGlzc3VlIHRoYXQgSFcgaGFzIGluIHNvbWUgY2FzZXMuIEFsc28gdGhlcmUgYXJlCisJICogY2FzZXMgd2hlcmUgc2luayBzaG91bGQgYmUgYWJsZSB0byB0cmFpbgorCSAqIHdpdGggdGhlIDUgb3IgNiBpZGxlIHBhdHRlcm5zLgogCSAqLwotCXVpbnQzMl90IGlkbGVfZnJhbWVzID0gZGV2X3ByaXYtPnZidC5wc3IuaWRsZV9mcmFtZXMgKyAxOworCXVpbnQzMl90IGlkbGVfZnJhbWVzID0gbWF4KDYsIGRldl9wcml2LT52YnQucHNyLmlkbGVfZnJhbWVzKTsKIAl1aW50MzJfdCB2YWwgPSBFRFBfUFNSX0VOQUJMRTsKIAogCXZhbCB8PSBtYXhfc2xlZXBfdGltZSA8PCBFRFBfUFNSX01BWF9TTEVFUF9USU1FX1NISUZUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jCmluZGV4IGNjYTc3OTIuLjFkMzE2MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMKQEAgLTExNzgsOCArMTE3OCw4IEBACiAJCUk5MTVfV1JJVEUoR0VOOF9MM1NRQ1JFRzEsIEwzX0dFTkVSQUxfUFJJT19DUkVESVRTKDYyKSB8CiAJCQkJCSAgIEwzX0hJR0hfUFJJT19DUkVESVRTKDIpKTsKIAotCS8qIFdhSW5zZXJ0RHVtbXlQdXNoQ29uc3RQczpieHQgKi8KLQlpZiAoSVNfQlhUX1JFVklEKGRldl9wcml2LCAwLCBCWFRfUkVWSURfQjApKQorCS8qIFdhVG9FbmFibGVId0ZpeEZvclB1c2hDb25zdEhXQnVnOmJ4dCAqLworCWlmIChJU19CWFRfUkVWSUQoZGV2X3ByaXYsIEJYVF9SRVZJRF9DMCwgUkVWSURfRk9SRVZFUikpCiAJCVdBX1NFVF9CSVRfTUFTS0VEKENPTU1PTl9TTElDRV9DSElDS0VOMiwKIAkJCQkgIEdFTjhfU0JFX0RJU0FCTEVfUkVQTEFZX0JVRl9PUFRJTUlaQVRJT04pOwogCkBAIC0xMjIyLDggKzEyMjIsOCBAQAogCQlJOTE1X1dSSVRFKEdFTjhfTDNTUUNSRUc0LCBJOTE1X1JFQUQoR0VOOF9MM1NRQ1JFRzQpIHwKIAkJCSAgIEdFTjhfTFFTQ19ST19QRVJGX0RJUyk7CiAKLQkvKiBXYUluc2VydER1bW15UHVzaENvbnN0UHM6a2JsICovCi0JaWYgKElTX0tCTF9SRVZJRChkZXZfcHJpdiwgMCwgS0JMX1JFVklEX0IwKSkKKwkvKiBXYVRvRW5hYmxlSHdGaXhGb3JQdXNoQ29uc3RIV0J1ZzprYmwgKi8KKwlpZiAoSVNfS0JMX1JFVklEKGRldl9wcml2LCBLQkxfUkVWSURfQzAsIFJFVklEX0ZPUkVWRVIpKQogCQlXQV9TRVRfQklUX01BU0tFRChDT01NT05fU0xJQ0VfQ0hJQ0tFTjIsCiAJCQkJICBHRU44X1NCRV9ESVNBQkxFX1JFUExBWV9CVUZfT1BUSU1JWkFUSU9OKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2lteC9pbXgtZHJtLWNvcmUuYyBiL2RyaXZlcnMvZ3B1L2RybS9pbXgvaW14LWRybS1jb3JlLmMKaW5kZXggOWY3ZGFmYy4uN2JmOTBlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2lteC9pbXgtZHJtLWNvcmUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaW14L2lteC1kcm0tY29yZS5jCkBAIC0xNzEsMTAgKzE3MSwzNCBAQAogCWRybV9mYmRldl9jbWFfaG90cGx1Z19ldmVudChpbXhkcm0tPmZiaGVscGVyKTsKIH0KIAorc3RhdGljIGludCBpbXhfZHJtX2F0b21pY19jaGVjayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZHJtX2F0b21pY19oZWxwZXJfY2hlY2tfbW9kZXNldChkZXYsIHN0YXRlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZHJtX2F0b21pY19oZWxwZXJfY2hlY2tfcGxhbmVzKGRldiwgc3RhdGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIENoZWNrIG1vZGVzZXQgYWdhaW4gaW4gY2FzZSBjcnRjX3N0YXRlLT5tb2RlX2NoYW5nZWQgaXMKKwkgKiB1cGRhdGVkIGluIHBsYW5lJ3MgLT5hdG9taWNfY2hlY2sgY2FsbGJhY2suCisJICovCisJcmV0ID0gZHJtX2F0b21pY19oZWxwZXJfY2hlY2tfbW9kZXNldChkZXYsIHN0YXRlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fbW9kZV9jb25maWdfZnVuY3MgaW14X2RybV9tb2RlX2NvbmZpZ19mdW5jcyA9IHsKIAkuZmJfY3JlYXRlID0gZHJtX2ZiX2NtYV9jcmVhdGUsCiAJLm91dHB1dF9wb2xsX2NoYW5nZWQgPSBpbXhfZHJtX291dHB1dF9wb2xsX2NoYW5nZWQsCi0JLmF0b21pY19jaGVjayA9IGRybV9hdG9taWNfaGVscGVyX2NoZWNrLAorCS5hdG9taWNfY2hlY2sgPSBpbXhfZHJtX2F0b21pY19jaGVjaywKIAkuYXRvbWljX2NvbW1pdCA9IGRybV9hdG9taWNfaGVscGVyX2NvbW1pdCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pbXgvaXB1djMtY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL2lteC9pcHV2My1jcnRjLmMKaW5kZXggMDhlMTg4Yi4uNDYyMDU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2lteC9pcHV2My1jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2lteC9pcHV2My1jcnRjLmMKQEAgLTc2LDYgKzc2LDggQEAKIAkJY3J0Yy0+c3RhdGUtPmV2ZW50ID0gTlVMTDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxKCZjcnRjLT5kZXYtPmV2ZW50X2xvY2spOworCisJZHJtX2NydGNfdmJsYW5rX29mZihjcnRjKTsKIH0KIAogc3RhdGljIHZvaWQgaW14X2RybV9jcnRjX3Jlc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKQEAgLTE3NSw2ICsxNzcsOCBAQAogc3RhdGljIHZvaWQgaXB1X2NydGNfYXRvbWljX2JlZ2luKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKIAkJCQkgIHN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqb2xkX2NydGNfc3RhdGUpCiB7CisJZHJtX2NydGNfdmJsYW5rX29uKGNydGMpOworCiAJc3Bpbl9sb2NrX2lycSgmY3J0Yy0+ZGV2LT5ldmVudF9sb2NrKTsKIAlpZiAoY3J0Yy0+c3RhdGUtPmV2ZW50KSB7CiAJCVdBUk5fT04oZHJtX2NydGNfdmJsYW5rX2dldChjcnRjKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaW14L2lwdXYzLXBsYW5lLmMgYi9kcml2ZXJzL2dwdS9kcm0vaW14L2lwdXYzLXBsYW5lLmMKaW5kZXggNGFkNjdkMC4uMjk0MjNlNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pbXgvaXB1djMtcGxhbmUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaW14L2lwdXYzLXBsYW5lLmMKQEAgLTMxOSwxMyArMzE5LDE0IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyoKLQkgKiBzaW5jZSB3ZSBjYW5ub3QgdG91Y2ggYWN0aXZlIElETUFDIGNoYW5uZWxzLCB3ZSBkbyBub3Qgc3VwcG9ydAotCSAqIHJlc2l6aW5nIHRoZSBlbmFibGVkIHBsYW5lIG9yIGNoYW5naW5nIGl0cyBmb3JtYXQKKwkgKiBXZSBzdXBwb3J0IHJlc2l6aW5nIGFjdGl2ZSBwbGFuZSBvciBjaGFuZ2luZyBpdHMgZm9ybWF0IGJ5CisJICogZm9yY2luZyBDUlRDIG1vZGUgY2hhbmdlIGFuZCBkaXNhYmxpbmctZW5hYmxpbmcgcGxhbmUgaW4gcGxhbmUncworCSAqIC0+YXRvbWljX3VwZGF0ZSBjYWxsYmFjay4KIAkgKi8KIAlpZiAob2xkX2ZiICYmIChzdGF0ZS0+c3JjX3cgIT0gb2xkX3N0YXRlLT5zcmNfdyB8fAogCQkJICAgICAgc3RhdGUtPnNyY19oICE9IG9sZF9zdGF0ZS0+c3JjX2ggfHwKIAkJCSAgICAgIGZiLT5waXhlbF9mb3JtYXQgIT0gb2xkX2ZiLT5waXhlbF9mb3JtYXQpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJY3J0Y19zdGF0ZS0+bW9kZV9jaGFuZ2VkID0gdHJ1ZTsKIAogCWViYSA9IGRybV9wbGFuZV9zdGF0ZV90b19lYmEoc3RhdGUpOwogCkBAIC0zMzYsNyArMzM3LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAob2xkX2ZiICYmIGZiLT5waXRjaGVzWzBdICE9IG9sZF9mYi0+cGl0Y2hlc1swXSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWNydGNfc3RhdGUtPm1vZGVfY2hhbmdlZCA9IHRydWU7CiAKIAlzd2l0Y2ggKGZiLT5waXhlbF9mb3JtYXQpIHsKIAljYXNlIERSTV9GT1JNQVRfWVVWNDIwOgpAQCAtMzcyLDcgKzM3Myw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQlpZiAob2xkX2ZiICYmIG9sZF9mYi0+cGl0Y2hlc1sxXSAhPSBmYi0+cGl0Y2hlc1sxXSkKLQkJCXJldHVybiAtRUlOVkFMOworCQkJY3J0Y19zdGF0ZS0+bW9kZV9jaGFuZ2VkID0gdHJ1ZTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTM5Miw4ICszOTMsMTQgQEAKIAllbnVtIGlwdV9jb2xvcl9zcGFjZSBpY3M7CiAKIAlpZiAob2xkX3N0YXRlLT5mYikgewotCQlpcHVfcGxhbmVfYXRvbWljX3NldF9iYXNlKGlwdV9wbGFuZSwgb2xkX3N0YXRlKTsKLQkJcmV0dXJuOworCQlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGUgPSBzdGF0ZS0+Y3J0Yy0+c3RhdGU7CisKKwkJaWYgKCFjcnRjX3N0YXRlLT5tb2RlX2NoYW5nZWQpIHsKKwkJCWlwdV9wbGFuZV9hdG9taWNfc2V0X2Jhc2UoaXB1X3BsYW5lLCBvbGRfc3RhdGUpOworCQkJcmV0dXJuOworCQl9CisKKwkJaXB1X2Rpc2FibGVfcGxhbmUocGxhbmUpOwogCX0KIAogCXN3aXRjaCAoaXB1X3BsYW5lLT5kcF9mbG93KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9LY29uZmlnCmluZGV4IDIzYWM4MDQuLjI5NGRlNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9LY29uZmlnCkBAIC0yLDYgKzIsOSBAQAogCXRyaXN0YXRlICJEUk0gU3VwcG9ydCBmb3IgTWVkaWF0ZWsgU29DcyIKIAlkZXBlbmRzIG9uIERSTQogCWRlcGVuZHMgb24gQVJDSF9NRURJQVRFSyB8fCAoQVJNICYmIENPTVBJTEVfVEVTVCkKKwlkZXBlbmRzIG9uIENPTU1PTl9DTEsKKwlkZXBlbmRzIG9uIEhBVkVfQVJNX1NNQ0NDCisJZGVwZW5kcyBvbiBPRgogCXNlbGVjdCBEUk1fR0VNX0NNQV9IRUxQRVIKIAlzZWxlY3QgRFJNX0tNU19IRUxQRVIKIAlzZWxlY3QgRFJNX01JUElfRFNJCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCmluZGV4IGI0YmM3ZjEuLmQwZGE1MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCkBAIC0xNTcsNiArMTU3LDEyIEBACiAJc3RydWN0IHNocmlua2VyIHNocmlua2VyOwogCiAJc3RydWN0IG1zbV92YmxhbmtfY3RybCB2YmxhbmtfY3RybDsKKworCS8qIHRhc2sgaG9sZGluZyBzdHJ1Y3RfbXV0ZXguLiBjdXJyZW50bHkgb25seSB1c2VkIGluIHN1Ym1pdCBwYXRoCisJICogdG8gZGV0ZWN0IGFuZCByZWplY3QgZmF1bHRzIGZyb20gY29weV9mcm9tX3VzZXIoKSBmb3Igc3VibWl0CisJICogaW9jdGwuCisJICovCisJc3RydWN0IHRhc2tfc3RydWN0ICpzdHJ1Y3RfbXV0ZXhfdGFzazsKIH07CiAKIHN0cnVjdCBtc21fZm9ybWF0IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ2VtLmMKaW5kZXggNmNkNGFmNC4uODVmMzA0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ2VtLmMKQEAgLTE5NiwxMSArMTk2LDIwIEBACiB7CiAJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmogPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CisJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IHBhZ2UgKipwYWdlczsKIAl1bnNpZ25lZCBsb25nIHBmbjsKIAlwZ29mZl90IHBnb2ZmOwogCWludCByZXQ7CiAKKwkvKiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB1c2Vyc3BhY2UgdHJpZXMgdG8gcGFzcyBhIG1tYXAnZAorCSAqIGJ1dCB1bmZhdWx0ZWQgZ2VtIGJvIHZhZGRyIGludG8gc3VibWl0IGlvY3RsLCB0cmlnZ2VyaW5nCisJICogYSBwYWdlIGZhdWx0IHdoaWxlIHN0cnVjdF9tdXRleCBpcyBhbHJlYWR5IGhlbGQuICBUaGlzIGlzCisJICogbm90IGEgdmFsaWQgdXNlLWNhc2Ugc28ganVzdCBiYWlsLgorCSAqLworCWlmIChwcml2LT5zdHJ1Y3RfbXV0ZXhfdGFzayA9PSBjdXJyZW50KQorCQlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOworCiAJLyogTWFrZSBzdXJlIHdlIGRvbid0IHBhcmFsbGVsIHVwZGF0ZSBvbiBhIGZhdWx0LCBub3IgbW92ZSBvciByZW1vdmUKIAkgKiBzb21ldGhpbmcgZnJvbSBiZW5lYXRoIG91ciBmZWV0CiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW1fc3VibWl0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW1fc3VibWl0LmMKaW5kZXggOTc2NmY5YS4uODgwZDZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ2VtX3N1Ym1pdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dlbV9zdWJtaXQuYwpAQCAtNjQsNiArNjQsMTQgQEAKIAlrZnJlZShzdWJtaXQpOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCitjb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkKKwkJcmV0dXJuIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pOworCXJldHVybiAtRUZBVUxUOworfQorCiBzdGF0aWMgaW50IHN1Ym1pdF9sb29rdXBfb2JqZWN0cyhzdHJ1Y3QgbXNtX2dlbV9zdWJtaXQgKnN1Ym1pdCwKIAkJc3RydWN0IGRybV9tc21fZ2VtX3N1Ym1pdCAqYXJncywgc3RydWN0IGRybV9maWxlICpmaWxlKQogewpAQCAtNzEsNiArNzksNyBAQAogCWludCByZXQgPSAwOwogCiAJc3Bpbl9sb2NrKCZmaWxlLT50YWJsZV9sb2NrKTsKKwlwYWdlZmF1bHRfZGlzYWJsZSgpOwogCiAJZm9yIChpID0gMDsgaSA8IGFyZ3MtPm5yX2JvczsgaSsrKSB7CiAJCXN0cnVjdCBkcm1fbXNtX2dlbV9zdWJtaXRfYm8gc3VibWl0X2JvOwpAQCAtODQsMTAgKzkzLDE1IEBACiAJCSAqLwogCQlzdWJtaXQtPmJvc1tpXS5mbGFncyA9IDA7CiAKLQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJnN1Ym1pdF9ibywgdXNlcnB0ciwgc2l6ZW9mKHN1Ym1pdF9ibykpOwotCQlpZiAocmV0KSB7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBvdXRfdW5sb2NrOworCQlyZXQgPSBjb3B5X2Zyb21fdXNlcl9pbmF0b21pYygmc3VibWl0X2JvLCB1c2VycHRyLCBzaXplb2Yoc3VibWl0X2JvKSk7CisJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQlwYWdlZmF1bHRfZW5hYmxlKCk7CisJCQlzcGluX3VubG9jaygmZmlsZS0+dGFibGVfbG9jayk7CisJCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmc3VibWl0X2JvLCB1c2VycHRyLCBzaXplb2Yoc3VibWl0X2JvKSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0OworCQkJc3Bpbl9sb2NrKCZmaWxlLT50YWJsZV9sb2NrKTsKKwkJCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CiAJCX0KIAogCQlpZiAoc3VibWl0X2JvLmZsYWdzICYgfk1TTV9TVUJNSVRfQk9fRkxBR1MpIHsKQEAgLTEyNyw5ICsxNDEsMTIgQEAKIAl9CiAKIG91dF91bmxvY2s6Ci0Jc3VibWl0LT5ucl9ib3MgPSBpOworCXBhZ2VmYXVsdF9lbmFibGUoKTsKIAlzcGluX3VubG9jaygmZmlsZS0+dGFibGVfbG9jayk7CiAKK291dDoKKwlzdWJtaXQtPm5yX2JvcyA9IGk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zNzcsNiArMzk0LDggQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJcHJpdi0+c3RydWN0X211dGV4X3Rhc2sgPSBjdXJyZW50OworCiAJc3VibWl0ID0gc3VibWl0X2NyZWF0ZShkZXYsIGdwdSwgYXJncy0+bnJfYm9zLCBhcmdzLT5ucl9jbWRzKTsKIAlpZiAoIXN1Ym1pdCkgewogCQlyZXQgPSAtRU5PTUVNOwpAQCAtNDY4LDYgKzQ4Nyw3IEBACiAJaWYgKHJldCkKIAkJbXNtX2dlbV9zdWJtaXRfZnJlZShzdWJtaXQpOwogb3V0X3VubG9jazoKKwlwcml2LT5zdHJ1Y3RfbXV0ZXhfdGFzayA9IE5VTEw7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2luY2x1ZGUvbnZrbS9jb3JlL2RldmljZS5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvaW5jbHVkZS9udmttL2NvcmUvZGV2aWNlLmgKaW5kZXggN2VhOGFhNy4uNmJjNzEyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvaW5jbHVkZS9udmttL2NvcmUvZGV2aWNlLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvaW5jbHVkZS9udmttL2NvcmUvZGV2aWNlLmgKQEAgLTE3NSw2ICsxNzUsNyBAQAogCXZvaWQgKCpmaW5pKShzdHJ1Y3QgbnZrbV9kZXZpY2UgKiwgYm9vbCBzdXNwZW5kKTsKIAlyZXNvdXJjZV9zaXplX3QgKCpyZXNvdXJjZV9hZGRyKShzdHJ1Y3QgbnZrbV9kZXZpY2UgKiwgdW5zaWduZWQgYmFyKTsKIAlyZXNvdXJjZV9zaXplX3QgKCpyZXNvdXJjZV9zaXplKShzdHJ1Y3QgbnZrbV9kZXZpY2UgKiwgdW5zaWduZWQgYmFyKTsKKwlib29sIGNwdV9jb2hlcmVudDsKIH07CiAKIHN0cnVjdCBudmttX2RldmljZV9xdWlyayB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2FjcGkuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYWNwaS5jCmluZGV4IGYyYWQxN2EuLmRjNTdiNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYWNwaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYWNwaS5jCkBAIC0yMjUsNiArMjI1LDE3IEBACiAJaWYgKCFwYXJlbnRfcGRldikKIAkJcmV0dXJuIGZhbHNlOwogCisJaWYgKCFwYXJlbnRfcGRldi0+YnJpZGdlX2QzKSB7CisJCS8qCisJCSAqIFBhcmVudCBQQ0kgYnJpZGdlIGlzIGN1cnJlbnRseSBub3QgcG93ZXIgbWFuYWdlZC4KKwkJICogU2luY2UgdXNlcnNwYWNlIGNhbiBjaGFuZ2UgdGhlc2UgYWZ0ZXJ3YXJkcyB0byBiZSBvbgorCQkgKiB0aGUgc2FmZSBzaWRlIHdlIHN0aWNrIHdpdGggX0RTTSBhbmQgcHJldmVudCB1c2FnZSBvZgorCQkgKiBfUFIzIGZyb20gdGhlIGJyaWRnZS4KKwkJICovCisJCXBjaV9kM2NvbGRfZGlzYWJsZShwZGV2KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwogCXBhcmVudF9hZGV2ID0gQUNQSV9DT01QQU5JT04oJnBhcmVudF9wZGV2LT5kZXYpOwogCWlmICghcGFyZW50X2FkZXYpCiAJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYm8uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYm8uYwppbmRleCA2MTkwMDM1Li44NjQzMjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iby5jCkBAIC0yMDksNyArMjA5LDggQEAKIAludmJvLT50aWxlX2ZsYWdzID0gdGlsZV9mbGFnczsKIAludmJvLT5iby5iZGV2ID0gJmRybS0+dHRtLmJkZXY7CiAKLQludmJvLT5mb3JjZV9jb2hlcmVudCA9IGZsYWdzICYgVFRNX1BMX0ZMQUdfVU5DQUNIRUQ7CisJaWYgKCFudnh4X2RldmljZSgmZHJtLT5kZXZpY2UpLT5mdW5jLT5jcHVfY29oZXJlbnQpCisJCW52Ym8tPmZvcmNlX2NvaGVyZW50ID0gZmxhZ3MgJiBUVE1fUExfRkxBR19VTkNBQ0hFRDsKIAogCW52Ym8tPnBhZ2Vfc2hpZnQgPSAxMjsKIAlpZiAoZHJtLT5jbGllbnQudm0pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2RldmljZS9wY2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2RldmljZS9wY2kuYwppbmRleCBiMWI2OTMyLi42MmFkMDMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kZXZpY2UvcGNpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9lbmdpbmUvZGV2aWNlL3BjaS5jCkBAIC0xNjE0LDYgKzE2MTQsNyBAQAogCS5maW5pID0gbnZrbV9kZXZpY2VfcGNpX2ZpbmksCiAJLnJlc291cmNlX2FkZHIgPSBudmttX2RldmljZV9wY2lfcmVzb3VyY2VfYWRkciwKIAkucmVzb3VyY2Vfc2l6ZSA9IG52a21fZGV2aWNlX3BjaV9yZXNvdXJjZV9zaXplLAorCS5jcHVfY29oZXJlbnQgPSAhSVNfRU5BQkxFRChDT05GSUdfQVJNKSwKIH07CiAKIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9lbmdpbmUvZGV2aWNlL3RlZ3JhLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kZXZpY2UvdGVncmEuYwppbmRleCA5Mzk2ODJmLi45YjYzOGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kZXZpY2UvdGVncmEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kZXZpY2UvdGVncmEuYwpAQCAtMjQ1LDYgKzI0NSw3IEBACiAJLmZpbmkgPSBudmttX2RldmljZV90ZWdyYV9maW5pLAogCS5yZXNvdXJjZV9hZGRyID0gbnZrbV9kZXZpY2VfdGVncmFfcmVzb3VyY2VfYWRkciwKIAkucmVzb3VyY2Vfc2l6ZSA9IG52a21fZGV2aWNlX3RlZ3JhX3Jlc291cmNlX3NpemUsCisJLmNwdV9jb2hlcmVudCA9IGZhbHNlLAogfTsKIAogaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9maWZvL2RtYW52MDQuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2ZpZm8vZG1hbnYwNC5jCmluZGV4IGVkZWMzMGYuLjBhN2I2ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2ZpZm8vZG1hbnYwNC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2ZpZm8vZG1hbnYwNC5jCkBAIC0zNyw3ICszNywxMCBAQAogewogCXN0cnVjdCBudjA0X2ZpZm9fY2hhbiAqY2hhbiA9IG52MDRfZmlmb19jaGFuKGJhc2UpOwogCXN0cnVjdCBudmttX2luc3RtZW0gKmltZW0gPSBjaGFuLT5maWZvLT5iYXNlLmVuZ2luZS5zdWJkZXYuZGV2aWNlLT5pbWVtOworCisJbXV0ZXhfbG9jaygmY2hhbi0+Zmlmby0+YmFzZS5lbmdpbmUuc3ViZGV2Lm11dGV4KTsKIAludmttX3JhbWh0X3JlbW92ZShpbWVtLT5yYW1odCwgY29va2llKTsKKwltdXRleF91bmxvY2soJmNoYW4tPmZpZm8tPmJhc2UuZW5naW5lLnN1YmRldi5tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9xeGwvcXhsX2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vcXhsL3F4bF9mYi5jCmluZGV4IGRmMjY1NzAuLjI4YzE0MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9xeGwvcXhsX2ZiLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfZmIuYwpAQCAtNzMsMTAgKzczLDEyIEBACiAJfQogfQogCisjaWZkZWYgQ09ORklHX0RSTV9GQkRFVl9FTVVMQVRJT04KIHN0YXRpYyBzdHJ1Y3QgZmJfZGVmZXJyZWRfaW8gcXhsX2RlZmlvID0gewogCS5kZWxheQkJPSBRWExfRElSVFlfREVMQVksCiAJLmRlZmVycmVkX2lvCT0gZHJtX2ZiX2hlbHBlcl9kZWZlcnJlZF9pbywKIH07CisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBmYl9vcHMgcXhsZmJfb3BzID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLApAQCAtMzEzLDggKzMxNSwxMCBAQAogCQlnb3RvIG91dF9kZXN0cm95X2ZiaTsKIAl9CiAKKyNpZmRlZiBDT05GSUdfRFJNX0ZCREVWX0VNVUxBVElPTgogCWluZm8tPmZiZGVmaW8gPSAmcXhsX2RlZmlvOwogCWZiX2RlZmVycmVkX2lvX2luaXQoaW5mbyk7CisjZW5kaWYKIAogCXFkZXYtPmZiZGV2X2luZm8gPSBpbmZvOwogCXFkZXYtPmZiZGV2X3FmYiA9ICZxZmJkZXYtPnFmYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKaW5kZXggYTk3YWJjOC4uMWRjZjM5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKQEAgLTYyNyw3ICs2MjcsOSBAQAogCQkJaWYgKHJhZGVvbl9jcnRjLT5zcy5yZWZkaXYpIHsKIAkJCQlyYWRlb25fY3J0Yy0+cGxsX2ZsYWdzIHw9IFJBREVPTl9QTExfVVNFX1JFRl9ESVY7CiAJCQkJcmFkZW9uX2NydGMtPnBsbF9yZWZlcmVuY2VfZGl2ID0gcmFkZW9uX2NydGMtPnNzLnJlZmRpdjsKLQkJCQlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUlY3NzApCisJCQkJaWYgKEFTSUNfSVNfQVZJVk8ocmRldikgJiYKKwkJCQkgICAgcmRldi0+ZmFtaWx5ICE9IENISVBfUlM3ODAgJiYKKwkJCQkgICAgcmRldi0+ZmFtaWx5ICE9IENISVBfUlM4ODApCiAJCQkJCXJhZGVvbl9jcnRjLT5wbGxfZmxhZ3MgfD0gUkFERU9OX1BMTF9VU0VfRlJBQ19GQl9ESVY7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0cHhfaGFuZGxlci5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRweF9oYW5kbGVyLmMKaW5kZXggNmRlMzQyOC4uZGRlZjBkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRweF9oYW5kbGVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRweF9oYW5kbGVyLmMKQEAgLTE5OCwxNiArMTk4LDcgQEAKIAlhdHB4LT5pc19oeWJyaWQgPSBmYWxzZTsKIAlpZiAodmFsaWRfYml0cyAmIEFUUFhfTVNfSFlCUklEX0dGWF9TVVBQT1JURUQpIHsKIAkJcHJpbnRrKCJBVFBYIEh5YnJpZCBHcmFwaGljc1xuIik7Ci0jaWYgMQotCQkvKiBUaGlzIGlzIGEgdGVtcG9yYXJ5IGhhY2sgdW50aWwgdGhlIEQzIGNvbGQgc3VwcG9ydAotCQkgKiBtYWtlcyBpdCB1cHN0cmVhbS4gIFRoZSBBVFBYIHBvd2VyX2NvbnRyb2wgbWV0aG9kIHNlZW1zCi0JCSAqIHRvIHN0aWxsIHdvcmsgb24gZXZlbiBpZiB0aGUgc3lzdGVtIHNob3VsZCBiZSB1c2luZwotCQkgKiB0aGUgbmV3IHN0YW5kYXJkaXplZCBoeWJyaWQgRDMgY29sZCBBQ1BJIGludGVyZmFjZS4KLQkJICovCi0JCWF0cHgtPmZ1bmN0aW9ucy5wb3dlcl9jbnRsID0gdHJ1ZTsKLSNlbHNlCiAJCWF0cHgtPmZ1bmN0aW9ucy5wb3dlcl9jbnRsID0gZmFsc2U7Ci0jZW5kaWYKIAkJYXRweC0+aXNfaHlicmlkID0gdHJ1ZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3R0bS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMKaW5kZXggMGMwMGUxOS4uYzJlMGExYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMKQEAgLTI2Myw4ICsyNjMsOCBAQAogCiAJcmRldiA9IHJhZGVvbl9nZXRfcmRldihiby0+YmRldik7CiAJcmlkeCA9IHJhZGVvbl9jb3B5X3JpbmdfaW5kZXgocmRldik7Ci0Jb2xkX3N0YXJ0ID0gb2xkX21lbS0+c3RhcnQgPDwgUEFHRV9TSElGVDsKLQluZXdfc3RhcnQgPSBuZXdfbWVtLT5zdGFydCA8PCBQQUdFX1NISUZUOworCW9sZF9zdGFydCA9ICh1NjQpb2xkX21lbS0+c3RhcnQgPDwgUEFHRV9TSElGVDsKKwluZXdfc3RhcnQgPSAodTY0KW5ld19tZW0tPnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CiAKIAlzd2l0Y2ggKG9sZF9tZW0tPm1lbV90eXBlKSB7CiAJY2FzZSBUVE1fUExfVlJBTToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2lfZHBtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3NpX2RwbS5jCmluZGV4IGU2YWJjMDkuLjFmNzhlYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2lfZHBtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9zaV9kcG0uYwpAQCAtMzAxNSw2ICszMDE1LDEyIEBACiAJaWYgKHJkZXYtPnBkZXYtPmRldmljZSA9PSAweDY4MTEgJiYKIAkgICAgcmRldi0+cGRldi0+cmV2aXNpb24gPT0gMHg4MSkKIAkJbWF4X21jbGsgPSAxMjAwMDA7CisJLyogbGltaXQgc2Nsay9tY2xrIG9uIEpldCBwYXJ0cyBmb3Igc3RhYmlsaXR5ICovCisJaWYgKHJkZXYtPnBkZXYtPmRldmljZSA9PSAweDY2NjUgJiYKKwkgICAgcmRldi0+cGRldi0+cmV2aXNpb24gPT0gMHhjMykgeworCQltYXhfc2NsayA9IDc1MDAwOworCQltYXhfbWNsayA9IDgwMDAwOworCX0KIAogCWlmIChycHMtPnZjZV9hY3RpdmUpIHsKIAkJcnBzLT5ldmNsayA9IHJkZXYtPnBtLmRwbS52Y2Vfc3RhdGVzW3JkZXYtPnBtLmRwbS52Y2VfbGV2ZWxdLmV2Y2xrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RzaS5jIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RzaS5jCmluZGV4IDNkMjI4YWQuLjNkZWExMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9kc2kuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZHNpLmMKQEAgLTg0MCw2ICs4NDAsMjEgQEAKIAkuZGVzdHJveSA9IHRlZ3JhX291dHB1dF9lbmNvZGVyX2Rlc3Ryb3ksCiB9OwogCitzdGF0aWMgdm9pZCB0ZWdyYV9kc2lfdW5wcmVwYXJlKHN0cnVjdCB0ZWdyYV9kc2kgKmRzaSkKK3sKKwlpbnQgZXJyOworCisJaWYgKGRzaS0+c2xhdmUpCisJCXRlZ3JhX2RzaV91bnByZXBhcmUoZHNpLT5zbGF2ZSk7CisKKwllcnIgPSB0ZWdyYV9taXBpX2Rpc2FibGUoZHNpLT5taXBpKTsKKwlpZiAoZXJyIDwgMCkKKwkJZGV2X2Vycihkc2ktPmRldiwgImZhaWxlZCB0byBkaXNhYmxlIE1JUEkgY2FsaWJyYXRpb246ICVkXG4iLAorCQkJZXJyKTsKKworCXBtX3J1bnRpbWVfcHV0KGRzaS0+ZGV2KTsKK30KKwogc3RhdGljIHZvaWQgdGVncmFfZHNpX2VuY29kZXJfZGlzYWJsZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7CiAJc3RydWN0IHRlZ3JhX291dHB1dCAqb3V0cHV0ID0gZW5jb2Rlcl90b19vdXRwdXQoZW5jb2Rlcik7CkBAIC04NzYsNyArODkxLDI2IEBACiAKIAl0ZWdyYV9kc2lfZGlzYWJsZShkc2kpOwogCi0JcG1fcnVudGltZV9wdXQoZHNpLT5kZXYpOworCXRlZ3JhX2RzaV91bnByZXBhcmUoZHNpKTsKK30KKworc3RhdGljIHZvaWQgdGVncmFfZHNpX3ByZXBhcmUoc3RydWN0IHRlZ3JhX2RzaSAqZHNpKQoreworCWludCBlcnI7CisKKwlwbV9ydW50aW1lX2dldF9zeW5jKGRzaS0+ZGV2KTsKKworCWVyciA9IHRlZ3JhX21pcGlfZW5hYmxlKGRzaS0+bWlwaSk7CisJaWYgKGVyciA8IDApCisJCWRldl9lcnIoZHNpLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIE1JUEkgY2FsaWJyYXRpb246ICVkXG4iLAorCQkJZXJyKTsKKworCWVyciA9IHRlZ3JhX2RzaV9wYWRfY2FsaWJyYXRlKGRzaSk7CisJaWYgKGVyciA8IDApCisJCWRldl9lcnIoZHNpLT5kZXYsICJNSVBJIGNhbGlicmF0aW9uIGZhaWxlZDogJWRcbiIsIGVycik7CisKKwlpZiAoZHNpLT5zbGF2ZSkKKwkJdGVncmFfZHNpX3ByZXBhcmUoZHNpLT5zbGF2ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHRlZ3JhX2RzaV9lbmNvZGVyX2VuYWJsZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCkBAIC04ODcsMTMgKzkyMSw4IEBACiAJc3RydWN0IHRlZ3JhX2RzaSAqZHNpID0gdG9fZHNpKG91dHB1dCk7CiAJc3RydWN0IHRlZ3JhX2RzaV9zdGF0ZSAqc3RhdGU7CiAJdTMyIHZhbHVlOwotCWludCBlcnI7CiAKLQlwbV9ydW50aW1lX2dldF9zeW5jKGRzaS0+ZGV2KTsKLQotCWVyciA9IHRlZ3JhX2RzaV9wYWRfY2FsaWJyYXRlKGRzaSk7Ci0JaWYgKGVyciA8IDApCi0JCWRldl9lcnIoZHNpLT5kZXYsICJNSVBJIGNhbGlicmF0aW9uIGZhaWxlZDogJWRcbiIsIGVycik7CisJdGVncmFfZHNpX3ByZXBhcmUoZHNpKTsKIAogCXN0YXRlID0gdGVncmFfZHNpX2dldF9zdGF0ZShkc2kpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL3VkbC91ZGxfZmIuYwppbmRleCBkNWRmNTU1Li42MTFiNmI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS91ZGwvdWRsX2ZiLmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogCQlyZXR1cm4gMDsKIAljbWQgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAotCWZvciAoaSA9IHk7IGkgPCBoZWlnaHQgOyBpKyspIHsKKwlmb3IgKGkgPSB5OyBpIDwgeSArIGhlaWdodCA7IGkrKykgewogCQljb25zdCBpbnQgbGluZV9vZmZzZXQgPSBmYi0+YmFzZS5waXRjaGVzWzBdICogaTsKIAkJY29uc3QgaW50IGJ5dGVfb2Zmc2V0ID0gbGluZV9vZmZzZXQgKyAoeCAqIGJwcCk7CiAJCWNvbnN0IGludCBkZXZfYnl0ZV9vZmZzZXQgPSAoZmItPmJhc2Uud2lkdGggKiBicHAgKiBpKSArICh4ICogYnBwKTsKQEAgLTIwMyw2ICsyMDMsNyBAQAogCiAJdWZiZGV2LT5mYl9jb3VudCsrOwogCisjaWZkZWYgQ09ORklHX0RSTV9GQkRFVl9FTVVMQVRJT04KIAlpZiAoZmJfZGVmaW8gJiYgKGluZm8tPmZiZGVmaW8gPT0gTlVMTCkpIHsKIAkJLyogZW5hYmxlIGRlZmlvIGF0IGxhc3QgbW9tZW50IGlmIG5vdCBkaXNhYmxlZCBieSBjbGllbnQgKi8KIApAQCAtMjE4LDYgKzIxOSw3IEBACiAJCWluZm8tPmZiZGVmaW8gPSBmYmRlZmlvOwogCQlmYl9kZWZlcnJlZF9pb19pbml0KGluZm8pOwogCX0KKyNlbmRpZgogCiAJcHJfbm90aWNlKCJvcGVuIC9kZXYvZmIlZCB1c2VyPSVkIGZiX2luZm89JXAgY291bnQ9JWRcbiIsCiAJCSAgaW5mby0+bm9kZSwgdXNlciwgaW5mbywgdWZiZGV2LT5mYl9jb3VudCk7CkBAIC0yMzUsMTIgKzIzNywxNCBAQAogCiAJdWZiZGV2LT5mYl9jb3VudC0tOwogCisjaWZkZWYgQ09ORklHX0RSTV9GQkRFVl9FTVVMQVRJT04KIAlpZiAoKHVmYmRldi0+ZmJfY291bnQgPT0gMCkgJiYgKGluZm8tPmZiZGVmaW8pKSB7CiAJCWZiX2RlZmVycmVkX2lvX2NsZWFudXAoaW5mbyk7CiAJCWtmcmVlKGluZm8tPmZiZGVmaW8pOwogCQlpbmZvLT5mYmRlZmlvID0gTlVMTDsKIAkJaW5mby0+ZmJvcHMtPmZiX21tYXAgPSB1ZGxfZmJfbW1hcDsKIAl9CisjZW5kaWYKIAogCXByX3dhcm4oInJlbGVhc2VkIC9kZXYvZmIlZCB1c2VyPSVkIGNvdW50PSVkXG4iLAogCQlpbmZvLT5ub2RlLCB1c2VyLCB1ZmJkZXYtPmZiX2NvdW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2JvLmMgYi9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9iby5jCmluZGV4IDU5YWRjZjguLjNmNjcwNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2JvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfYm8uYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJcmV0dXJuICZ2YzQtPmJvX2NhY2hlLnNpemVfbGlzdFtwYWdlX2luZGV4XTsKIH0KIAotdm9pZCB2YzRfYm9fY2FjaGVfcHVyZ2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHZjNF9ib19jYWNoZV9wdXJnZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCB2YzRfZGV2ICp2YzQgPSB0b192YzRfZGV2KGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfZHJ2LmMKaW5kZXggOGI0MmQzMS4uOWVjZWY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfZHJ2LmMKQEAgLTU3LDIxICs1NywyMSBAQAogCXN3aXRjaCAoYXJncy0+cGFyYW0pIHsKIAljYXNlIERSTV9WQzRfUEFSQU1fVjNEX0lERU5UMDoKIAkJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmdmM0LT52M2QtPnBkZXYtPmRldik7Ci0JCWlmIChyZXQpCisJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAkJYXJncy0+dmFsdWUgPSBWM0RfUkVBRChWM0RfSURFTlQwKTsKIAkJcG1fcnVudGltZV9wdXQoJnZjNC0+djNkLT5wZGV2LT5kZXYpOwogCQlicmVhazsKIAljYXNlIERSTV9WQzRfUEFSQU1fVjNEX0lERU5UMToKIAkJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmdmM0LT52M2QtPnBkZXYtPmRldik7Ci0JCWlmIChyZXQpCisJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAkJYXJncy0+dmFsdWUgPSBWM0RfUkVBRChWM0RfSURFTlQxKTsKIAkJcG1fcnVudGltZV9wdXQoJnZjNC0+djNkLT5wZGV2LT5kZXYpOwogCQlicmVhazsKIAljYXNlIERSTV9WQzRfUEFSQU1fVjNEX0lERU5UMjoKIAkJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmdmM0LT52M2QtPnBkZXYtPmRldik7Ci0JCWlmIChyZXQpCisJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAkJYXJncy0+dmFsdWUgPSBWM0RfUkVBRChWM0RfSURFTlQyKTsKIAkJcG1fcnVudGltZV9wdXQoJnZjNC0+djNkLT5wZGV2LT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9kcnYuaAppbmRleCA0ODllM2RlLi40MjhlMjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9kcnYuaApAQCAtMzIxLDYgKzMyMSwxNSBAQAogCQkJCXN0cnVjdCB2YzRfZXhlY19pbmZvLCBoZWFkKTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgdmM0X2V4ZWNfaW5mbyAqCit2YzRfbGFzdF9yZW5kZXJfam9iKHN0cnVjdCB2YzRfZGV2ICp2YzQpCit7CisJaWYgKGxpc3RfZW1wdHkoJnZjNC0+cmVuZGVyX2pvYl9saXN0KSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGxpc3RfbGFzdF9lbnRyeSgmdmM0LT5yZW5kZXJfam9iX2xpc3QsCisJCQkgICAgICAgc3RydWN0IHZjNF9leGVjX2luZm8sIGhlYWQpOworfQorCiAvKioKICAqIHN0cnVjdCB2YzRfdGV4dHVyZV9zYW1wbGVfaW5mbyAtIHNhdmVzIHRoZSBvZmZzZXRzIGludG8gdGhlIFVCTyBmb3IgdGV4dHVyZQogICogc2V0dXAgcGFyYW1ldGVycy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfZ2VtLmMKaW5kZXggNjE1NWU4YS4uYjI2MmM1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfZ2VtLmMKQEAgLTUzNCw4ICs1MzQsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlleGVjLT5ibyA9IGtjYWxsb2MoZXhlYy0+Ym9fY291bnQsIHNpemVvZihzdHJ1Y3QgZHJtX2dlbV9jbWFfb2JqZWN0ICopLAotCQkJICAgR0ZQX0tFUk5FTCk7CisJZXhlYy0+Ym8gPSBkcm1fY2FsbG9jX2xhcmdlKGV4ZWMtPmJvX2NvdW50LAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGRybV9nZW1fY21hX29iamVjdCAqKSk7CiAJaWYgKCFleGVjLT5ibykgewogCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSB2YWxpZGF0ZWQgQk8gcG9pbnRlcnNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTU3Miw4ICs1NzIsOCBAQAogCXNwaW5fdW5sb2NrKCZmaWxlX3ByaXYtPnRhYmxlX2xvY2spOwogCiBmYWlsOgotCWtmcmVlKGhhbmRsZXMpOwotCXJldHVybiAwOworCWRybV9mcmVlX2xhcmdlKGhhbmRsZXMpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTYwOCw3ICs2MDgsNyBAQAogCSAqIHJlYWQgdGhlIGNvbnRlbnRzIGJhY2sgZm9yIHZhbGlkYXRpb24sIGFuZCBJIHRoaW5rIHRoZQogCSAqIGJvLT52YWRkciBpcyB1bmNhY2hlZCBhY2Nlc3MuCiAJICovCi0JdGVtcCA9IGttYWxsb2ModGVtcF9zaXplLCBHRlBfS0VSTkVMKTsKKwl0ZW1wID0gZHJtX21hbGxvY19hYih0ZW1wX3NpemUsIDEpOwogCWlmICghdGVtcCkgewogCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBzdG9yYWdlIGZvciBjb3B5aW5nICIKIAkJCSAgImluIGJpbi9yZW5kZXIgQ0xzLlxuIik7CkBAIC02NzUsNyArNjc1LDcgQEAKIAlyZXQgPSB2YzRfdmFsaWRhdGVfc2hhZGVyX3JlY3MoZGV2LCBleGVjKTsKIAogZmFpbDoKLQlrZnJlZSh0ZW1wKTsKKwlkcm1fZnJlZV9sYXJnZSh0ZW1wKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC02ODgsNyArNjg4LDcgQEAKIAlpZiAoZXhlYy0+Ym8pIHsKIAkJZm9yIChpID0gMDsgaSA8IGV4ZWMtPmJvX2NvdW50OyBpKyspCiAJCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZCgmZXhlYy0+Ym9baV0tPmJhc2UpOwotCQlrZnJlZShleGVjLT5ibyk7CisJCWRybV9mcmVlX2xhcmdlKGV4ZWMtPmJvKTsKIAl9CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmV4ZWMtPnVucmVmX2xpc3QpKSB7CkBAIC05NDIsOCArOTQyLDggQEAKIAkJdmM0LT5vdmVyZmxvd19tZW0gPSBOVUxMOwogCX0KIAotCXZjNF9ib19jYWNoZV9kZXN0cm95KGRldik7Ci0KIAlpZiAodmM0LT5oYW5nX3N0YXRlKQogCQl2YzRfZnJlZV9oYW5nX3N0YXRlKGRldiwgdmM0LT5oYW5nX3N0YXRlKTsKKworCXZjNF9ib19jYWNoZV9kZXN0cm95KGRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2lycS5jCmluZGV4IGIwMTA0YTM0Li4wOTRiYzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9pcnEuYwpAQCAtODMsOCArODMsMTAgQEAKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmM0LT5qb2JfbG9jaywgaXJxZmxhZ3MpOwogCQljdXJyZW50X2V4ZWMgPSB2YzRfZmlyc3RfYmluX2pvYih2YzQpOworCQlpZiAoIWN1cnJlbnRfZXhlYykKKwkJCWN1cnJlbnRfZXhlYyA9IHZjNF9sYXN0X3JlbmRlcl9qb2IodmM0KTsKIAkJaWYgKGN1cnJlbnRfZXhlYykgewotCQkJdmM0LT5vdmVyZmxvd19tZW0tPnNlcW5vID0gdmM0LT5maW5pc2hlZF9zZXFubyArIDE7CisJCQl2YzQtPm92ZXJmbG93X21lbS0+c2Vxbm8gPSBjdXJyZW50X2V4ZWMtPnNlcW5vOwogCQkJbGlzdF9hZGRfdGFpbCgmdmM0LT5vdmVyZmxvd19tZW0tPnVucmVmX2hlYWQsCiAJCQkJICAgICAgJmN1cnJlbnRfZXhlYy0+dW5yZWZfbGlzdCk7CiAJCQl2YzQtPm92ZXJmbG93X21lbSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF92YWxpZGF0ZV9zaGFkZXJzLmMgYi9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF92YWxpZGF0ZV9zaGFkZXJzLmMKaW5kZXggNDY1MjdlOS4uMjU0M2NmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfdmFsaWRhdGVfc2hhZGVycy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X3ZhbGlkYXRlX3NoYWRlcnMuYwpAQCAtMzA5LDggKzMwOSwxNCBAQAogCSAqIG9mIHVuaWZvcm1zIG9uIGVhY2ggc2lkZS4gIEhvd2V2ZXIsIHRoaXMgc2NoZW1lIGlzIGVhc3kgdG8KIAkgKiB2YWxpZGF0ZSBzbyBpdCdzIGFsbCB3ZSBhbGxvdyBmb3Igbm93LgogCSAqLwotCi0JaWYgKFFQVV9HRVRfRklFTEQoaW5zdCwgUVBVX1NJRykgIT0gUVBVX1NJR19OT05FKSB7CisJc3dpdGNoIChRUFVfR0VUX0ZJRUxEKGluc3QsIFFQVV9TSUcpKSB7CisJY2FzZSBRUFVfU0lHX05PTkU6CisJY2FzZSBRUFVfU0lHX1NDT1JFQk9BUkRfVU5MT0NLOgorCWNhc2UgUVBVX1NJR19DT0xPUl9MT0FEOgorCWNhc2UgUVBVX1NJR19MT0FEX1RNVTA6CisJY2FzZSBRUFVfU0lHX0xPQURfVE1VMToKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJRFJNX0VSUk9SKCJ1bmlmb3JtcyBhZGRyZXNzIGNoYW5nZSBtdXN0IGJlICIKIAkJCSAgIm5vcm1hbCBtYXRoXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvaG9zdDF4L21pcGkuYyBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9taXBpLmMKaW5kZXggNTJhNmZkMi4uZTAwODA5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvaG9zdDF4L21pcGkuYworKysgYi9kcml2ZXJzL2dwdS9ob3N0MXgvbWlwaS5jCkBAIC0yNDIsMjAgKzI0Miw2IEBACiAJZGV2LT5wYWRzID0gYXJncy5hcmdzWzBdOwogCWRldi0+ZGV2aWNlID0gZGV2aWNlOwogCi0JbXV0ZXhfbG9jaygmZGV2LT5taXBpLT5sb2NrKTsKLQotCWlmIChkZXYtPm1pcGktPnVzYWdlX2NvdW50KysgPT0gMCkgewotCQllcnIgPSB0ZWdyYV9taXBpX3Bvd2VyX3VwKGRldi0+bWlwaSk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlkZXZfZXJyKGRldi0+bWlwaS0+ZGV2LAotCQkJCSJmYWlsZWQgdG8gcG93ZXIgdXAgTUlQSSBicmlja3M6ICVkXG4iLAotCQkJCWVycik7Ci0JCQlyZXR1cm4gRVJSX1BUUihlcnIpOwotCQl9Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZkZXYtPm1pcGktPmxvY2spOwotCiAJcmV0dXJuIGRldjsKIAogcHV0OgpAQCAtMjcwLDMwICsyNTYsNDMgQEAKIAogdm9pZCB0ZWdyYV9taXBpX2ZyZWUoc3RydWN0IHRlZ3JhX21pcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50IGVycjsKLQotCW11dGV4X2xvY2soJmRldmljZS0+bWlwaS0+bG9jayk7Ci0KLQlpZiAoLS1kZXZpY2UtPm1pcGktPnVzYWdlX2NvdW50ID09IDApIHsKLQkJZXJyID0gdGVncmFfbWlwaV9wb3dlcl9kb3duKGRldmljZS0+bWlwaSk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQkvKgotCQkJICogTm90IG11Y2ggdGhhdCBjYW4gYmUgZG9uZSBoZXJlLCBzbyBhbiBlcnJvciBtZXNzYWdlCi0JCQkgKiB3aWxsIGhhdmUgdG8gZG8uCi0JCQkgKi8KLQkJCWRldl9lcnIoZGV2aWNlLT5taXBpLT5kZXYsCi0JCQkJImZhaWxlZCB0byBwb3dlciBkb3duIE1JUEkgYnJpY2tzOiAlZFxuIiwKLQkJCQllcnIpOwotCQl9Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPm1pcGktPmxvY2spOwotCiAJcGxhdGZvcm1fZGV2aWNlX3B1dChkZXZpY2UtPnBkZXYpOwogCWtmcmVlKGRldmljZSk7CiB9CiBFWFBPUlRfU1lNQk9MKHRlZ3JhX21pcGlfZnJlZSk7CiAKK2ludCB0ZWdyYV9taXBpX2VuYWJsZShzdHJ1Y3QgdGVncmFfbWlwaV9kZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyID0gMDsKKworCW11dGV4X2xvY2soJmRldi0+bWlwaS0+bG9jayk7CisKKwlpZiAoZGV2LT5taXBpLT51c2FnZV9jb3VudCsrID09IDApCisJCWVyciA9IHRlZ3JhX21pcGlfcG93ZXJfdXAoZGV2LT5taXBpKTsKKworCW11dGV4X3VubG9jaygmZGV2LT5taXBpLT5sb2NrKTsKKworCXJldHVybiBlcnI7CisKK30KK0VYUE9SVF9TWU1CT0wodGVncmFfbWlwaV9lbmFibGUpOworCitpbnQgdGVncmFfbWlwaV9kaXNhYmxlKHN0cnVjdCB0ZWdyYV9taXBpX2RldmljZSAqZGV2KQoreworCWludCBlcnIgPSAwOworCisJbXV0ZXhfbG9jaygmZGV2LT5taXBpLT5sb2NrKTsKKworCWlmICgtLWRldi0+bWlwaS0+dXNhZ2VfY291bnQgPT0gMCkKKwkJZXJyID0gdGVncmFfbWlwaV9wb3dlcl9kb3duKGRldi0+bWlwaSk7CisKKwltdXRleF91bmxvY2soJmRldi0+bWlwaS0+bG9jayk7CisKKwlyZXR1cm4gZXJyOworCit9CitFWFBPUlRfU1lNQk9MKHRlZ3JhX21pcGlfZGlzYWJsZSk7CisKIHN0YXRpYyBpbnQgdGVncmFfbWlwaV93YWl0KHN0cnVjdCB0ZWdyYV9taXBpICptaXBpKQogewogCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDI1MCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91aGlkLmMgYi9kcml2ZXJzL2hpZC91aGlkLmMKaW5kZXggOTllYzNmZi4uN2Y4ZmYzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdWhpZC5jCisrKyBiL2RyaXZlcnMvaGlkL3VoaWQuYwpAQCAtNzc5LDE5ICs3NzksOCBAQAogCS5taW5vcgkJPSBVSElEX01JTk9SLAogCS5uYW1lCQk9IFVISURfTkFNRSwKIH07Cittb2R1bGVfbWlzY19kZXZpY2UodWhpZF9taXNjKTsKIAotc3RhdGljIGludCBfX2luaXQgdWhpZF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJnVoaWRfbWlzYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB1aGlkX2V4aXQodm9pZCkKLXsKLQltaXNjX2RlcmVnaXN0ZXIoJnVoaWRfbWlzYyk7Ci19Ci0KLW1vZHVsZV9pbml0KHVoaWRfaW5pdCk7Ci1tb2R1bGVfZXhpdCh1aGlkX2V4aXQpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiRGF2aWQgSGVycm1hbm4gPGRoLmhlcnJtYW5uQGdtYWlsLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVXNlci1zcGFjZSBJL08gZHJpdmVyIHN1cHBvcnQgZm9yIEhJRCBzdWJzeXN0ZW0iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvY2hhbm5lbC5jIGIvZHJpdmVycy9odi9jaGFubmVsLmMKaW5kZXggNTZkZDI2MS4uMTZmOTFjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9jaGFubmVsLmMKKysrIGIvZHJpdmVycy9odi9jaGFubmVsLmMKQEAgLTQzLDcgKzQzLDEyIEBACiB7CiAJc3RydWN0IGh2X21vbml0b3JfcGFnZSAqbW9uaXRvcnBhZ2U7CiAKLQlpZiAoY2hhbm5lbC0+b2ZmZXJtc2cubW9uaXRvcl9hbGxvY2F0ZWQpIHsKKwkvKgorCSAqIEZvciBjaGFubmVscyBtYXJrZWQgYXMgaW4gImxvdyBsYXRlbmN5IiBtb2RlCisJICogYnlwYXNzIHRoZSBtb25pdG9yIHBhZ2UgbWVjaGFuaXNtLgorCSAqLworCWlmICgoY2hhbm5lbC0+b2ZmZXJtc2cubW9uaXRvcl9hbGxvY2F0ZWQpICYmCisJICAgICghY2hhbm5lbC0+bG93X2xhdGVuY3kpKSB7CiAJCS8qIEVhY2ggdTMyIHJlcHJlc2VudHMgMzIgY2hhbm5lbHMgKi8KIAkJc3luY19zZXRfYml0KGNoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkICYgMzEsCiAJCQkodW5zaWduZWQgbG9uZyAqKSB2bWJ1c19jb25uZWN0aW9uLnNlbmRfaW50X3BhZ2UgKwpAQCAtNzAsMTIgKzc1LDE0IEBACiB7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWxfb3Blbl9jaGFubmVsICpvcGVuX21zZzsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICpvcGVuX2luZm8gPSBOVUxMOwotCXZvaWQgKmluLCAqb3V0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCwgZXJyID0gMDsKLQl1bnNpZ25lZCBsb25nIHQ7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKKwlpZiAoc2VuZF9yaW5nYnVmZmVyX3NpemUgJSBQQUdFX1NJWkUgfHwKKwkgICAgcmVjdl9yaW5nYnVmZmVyX3NpemUgJSBQQUdFX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5ld2NoYW5uZWwtPmxvY2ssIGZsYWdzKTsKIAlpZiAobmV3Y2hhbm5lbC0+c3RhdGUgPT0gQ0hBTk5FTF9PUEVOX1NUQVRFKSB7CiAJCW5ld2NoYW5uZWwtPnN0YXRlID0gQ0hBTk5FTF9PUEVOSU5HX1NUQVRFOwpAQCAtOTUsMzYgKzEwMiwzMyBAQAogCQkJCXJlY3ZfcmluZ2J1ZmZlcl9zaXplKSk7CiAKIAlpZiAoIXBhZ2UpCi0JCW91dCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMfF9fR0ZQX1pFUk8sCi0JCQkJCSAgICAgICBnZXRfb3JkZXIoc2VuZF9yaW5nYnVmZmVyX3NpemUgKwotCQkJCQkgICAgICAgcmVjdl9yaW5nYnVmZmVyX3NpemUpKTsKLQllbHNlCi0JCW91dCA9ICh2b2lkICopcGFnZV9hZGRyZXNzKHBhZ2UpOworCQlwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9aRVJPLAorCQkJCSAgIGdldF9vcmRlcihzZW5kX3JpbmdidWZmZXJfc2l6ZSArCisJCQkJCSAgICAgcmVjdl9yaW5nYnVmZmVyX3NpemUpKTsKIAotCWlmICghb3V0KSB7CisJaWYgKCFwYWdlKSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3IwOworCQlnb3RvIGVycm9yX3NldF9jaG5zdGF0ZTsKIAl9CiAKLQlpbiA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKW91dCArIHNlbmRfcmluZ2J1ZmZlcl9zaXplKTsKLQotCW5ld2NoYW5uZWwtPnJpbmdidWZmZXJfcGFnZXMgPSBvdXQ7CisJbmV3Y2hhbm5lbC0+cmluZ2J1ZmZlcl9wYWdlcyA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKIAluZXdjaGFubmVsLT5yaW5nYnVmZmVyX3BhZ2Vjb3VudCA9IChzZW5kX3JpbmdidWZmZXJfc2l6ZSArCiAJCQkJCSAgIHJlY3ZfcmluZ2J1ZmZlcl9zaXplKSA+PiBQQUdFX1NISUZUOwogCi0JcmV0ID0gaHZfcmluZ2J1ZmZlcl9pbml0KAotCQkmbmV3Y2hhbm5lbC0+b3V0Ym91bmQsIG91dCwgc2VuZF9yaW5nYnVmZmVyX3NpemUpOworCXJldCA9IGh2X3JpbmdidWZmZXJfaW5pdCgmbmV3Y2hhbm5lbC0+b3V0Ym91bmQsIHBhZ2UsCisJCQkJIHNlbmRfcmluZ2J1ZmZlcl9zaXplID4+IFBBR0VfU0hJRlQpOwogCiAJaWYgKHJldCAhPSAwKSB7CiAJCWVyciA9IHJldDsKLQkJZ290byBlcnJvcjA7CisJCWdvdG8gZXJyb3JfZnJlZV9wYWdlczsKIAl9CiAKLQlyZXQgPSBodl9yaW5nYnVmZmVyX2luaXQoCi0JCSZuZXdjaGFubmVsLT5pbmJvdW5kLCBpbiwgcmVjdl9yaW5nYnVmZmVyX3NpemUpOworCXJldCA9IGh2X3JpbmdidWZmZXJfaW5pdCgmbmV3Y2hhbm5lbC0+aW5ib3VuZCwKKwkJCQkgJnBhZ2Vbc2VuZF9yaW5nYnVmZmVyX3NpemUgPj4gUEFHRV9TSElGVF0sCisJCQkJIHJlY3ZfcmluZ2J1ZmZlcl9zaXplID4+IFBBR0VfU0hJRlQpOwogCWlmIChyZXQgIT0gMCkgewogCQllcnIgPSByZXQ7Ci0JCWdvdG8gZXJyb3IwOworCQlnb3RvIGVycm9yX2ZyZWVfcGFnZXM7CiAJfQogCiAKQEAgLTEzMiwxNCArMTM2LDE0IEBACiAJbmV3Y2hhbm5lbC0+cmluZ2J1ZmZlcl9ncGFkbGhhbmRsZSA9IDA7CiAKIAlyZXQgPSB2bWJ1c19lc3RhYmxpc2hfZ3BhZGwobmV3Y2hhbm5lbCwKLQkJCQkJIG5ld2NoYW5uZWwtPm91dGJvdW5kLnJpbmdfYnVmZmVyLAotCQkJCQkgc2VuZF9yaW5nYnVmZmVyX3NpemUgKwotCQkJCQkgcmVjdl9yaW5nYnVmZmVyX3NpemUsCi0JCQkJCSAmbmV3Y2hhbm5lbC0+cmluZ2J1ZmZlcl9ncGFkbGhhbmRsZSk7CisJCQkJICAgIHBhZ2VfYWRkcmVzcyhwYWdlKSwKKwkJCQkgICAgc2VuZF9yaW5nYnVmZmVyX3NpemUgKworCQkJCSAgICByZWN2X3JpbmdidWZmZXJfc2l6ZSwKKwkJCQkgICAgJm5ld2NoYW5uZWwtPnJpbmdidWZmZXJfZ3BhZGxoYW5kbGUpOwogCiAJaWYgKHJldCAhPSAwKSB7CiAJCWVyciA9IHJldDsKLQkJZ290byBlcnJvcjA7CisJCWdvdG8gZXJyb3JfZnJlZV9wYWdlczsKIAl9CiAKIAkvKiBDcmVhdGUgYW5kIGluaXQgdGhlIGNoYW5uZWwgb3BlbiBtZXNzYWdlICovCkBAIC0xNDgsNyArMTUyLDcgQEAKIAkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghb3Blbl9pbmZvKSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfZ3BhZGw7CisJCWdvdG8gZXJyb3JfZnJlZV9ncGFkbDsKIAl9CiAKIAlpbml0X2NvbXBsZXRpb24oJm9wZW5faW5mby0+d2FpdGV2ZW50KTsKQEAgLTE2NCw3ICsxNjgsNyBAQAogCiAJaWYgKHVzZXJkYXRhbGVuID4gTUFYX1VTRVJfREVGSU5FRF9CWVRFUykgewogCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGVycm9yX2dwYWRsOworCQlnb3RvIGVycm9yX2ZyZWVfZ3BhZGw7CiAJfQogCiAJaWYgKHVzZXJkYXRhbGVuKQpAQCAtMTgwLDE0ICsxODQsMTAgQEAKIAogCWlmIChyZXQgIT0gMCkgewogCQllcnIgPSByZXQ7Ci0JCWdvdG8gZXJyb3IxOworCQlnb3RvIGVycm9yX2NsZWFuX21zZ2xpc3Q7CiAJfQogCi0JdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmb3Blbl9pbmZvLT53YWl0ZXZlbnQsIDUqSFopOwotCWlmICh0ID09IDApIHsKLQkJZXJyID0gLUVUSU1FRE9VVDsKLQkJZ290byBlcnJvcjE7Ci0JfQorCXdhaXRfZm9yX2NvbXBsZXRpb24oJm9wZW5faW5mby0+d2FpdGV2ZW50KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ2bWJ1c19jb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwogCWxpc3RfZGVsKCZvcGVuX2luZm8tPm1zZ2xpc3RlbnRyeSk7CkBAIC0xOTUsMjUgKzE5NSwyNyBAQAogCiAJaWYgKG9wZW5faW5mby0+cmVzcG9uc2Uub3Blbl9yZXN1bHQuc3RhdHVzKSB7CiAJCWVyciA9IC1FQUdBSU47Ci0JCWdvdG8gZXJyb3JfZ3BhZGw7CisJCWdvdG8gZXJyb3JfZnJlZV9ncGFkbDsKIAl9CiAKIAluZXdjaGFubmVsLT5zdGF0ZSA9IENIQU5ORUxfT1BFTkVEX1NUQVRFOwogCWtmcmVlKG9wZW5faW5mbyk7CiAJcmV0dXJuIDA7CiAKLWVycm9yMToKK2Vycm9yX2NsZWFuX21zZ2xpc3Q6CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnZtYnVzX2Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7CiAJbGlzdF9kZWwoJm9wZW5faW5mby0+bXNnbGlzdGVudHJ5KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2bWJ1c19jb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwogCi1lcnJvcl9ncGFkbDoKK2Vycm9yX2ZyZWVfZ3BhZGw6CiAJdm1idXNfdGVhcmRvd25fZ3BhZGwobmV3Y2hhbm5lbCwgbmV3Y2hhbm5lbC0+cmluZ2J1ZmZlcl9ncGFkbGhhbmRsZSk7Ci0KLWVycm9yMDoKLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKW91dCwKLQkJZ2V0X29yZGVyKHNlbmRfcmluZ2J1ZmZlcl9zaXplICsgcmVjdl9yaW5nYnVmZmVyX3NpemUpKTsKIAlrZnJlZShvcGVuX2luZm8pOworZXJyb3JfZnJlZV9wYWdlczoKKwlodl9yaW5nYnVmZmVyX2NsZWFudXAoJm5ld2NoYW5uZWwtPm91dGJvdW5kKTsKKwlodl9yaW5nYnVmZmVyX2NsZWFudXAoJm5ld2NoYW5uZWwtPmluYm91bmQpOworCV9fZnJlZV9wYWdlcyhwYWdlLAorCQkgICAgIGdldF9vcmRlcihzZW5kX3JpbmdidWZmZXJfc2l6ZSArIHJlY3ZfcmluZ2J1ZmZlcl9zaXplKSk7CitlcnJvcl9zZXRfY2huc3RhdGU6CiAJbmV3Y2hhbm5lbC0+c3RhdGUgPSBDSEFOTkVMX09QRU5fU1RBVEU7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTIzOCw4ICsyNDAsNyBAQAogICogY3JlYXRlX2dwYWRsX2hlYWRlciAtIENyZWF0ZXMgYSBncGFkbCBmb3IgdGhlIHNwZWNpZmllZCBidWZmZXIKICAqLwogc3RhdGljIGludCBjcmVhdGVfZ3BhZGxfaGVhZGVyKHZvaWQgKmtidWZmZXIsIHUzMiBzaXplLAotCQkJCQkgc3RydWN0IHZtYnVzX2NoYW5uZWxfbXNnaW5mbyAqKm1zZ2luZm8sCi0JCQkJCSB1MzIgKm1lc3NhZ2Vjb3VudCkKKwkJCSAgICAgICBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICoqbXNnaW5mbykKIHsKIAlpbnQgaTsKIAlpbnQgcGFnZWNvdW50OwpAQCAtMjgzLDcgKzI4NCw2IEBACiAJCQlncGFkbF9oZWFkZXItPnJhbmdlWzBdLnBmbl9hcnJheVtpXSA9IHNsb3dfdmlydF90b19waHlzKAogCQkJCWtidWZmZXIgKyBQQUdFX1NJWkUgKiBpKSA+PiBQQUdFX1NISUZUOwogCQkqbXNnaW5mbyA9IG1zZ2hlYWRlcjsKLQkJKm1lc3NhZ2Vjb3VudCA9IDE7CiAKIAkJcGZuc3VtID0gcGZuY291bnQ7CiAJCXBmbmxlZnQgPSBwYWdlY291bnQgLSBwZm5jb3VudDsKQEAgLTMyMyw3ICszMjMsNiBAQAogCQkJfQogCiAJCQltc2dib2R5LT5tc2dzaXplID0gbXNnc2l6ZTsKLQkJCSgqbWVzc2FnZWNvdW50KSsrOwogCQkJZ3BhZGxfYm9keSA9CiAJCQkJKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2JvZHkgKiltc2dib2R5LT5tc2c7CiAKQEAgLTM1Miw2ICszNTEsOCBAQAogCQltc2doZWFkZXIgPSBremFsbG9jKG1zZ3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAobXNnaGVhZGVyID09IE5VTEwpCiAJCQlnb3RvIG5vbWVtOworCisJCUlOSVRfTElTVF9IRUFEKCZtc2doZWFkZXItPnN1Ym1zZ2xpc3QpOwogCQltc2doZWFkZXItPm1zZ3NpemUgPSBtc2dzaXplOwogCiAJCWdwYWRsX2hlYWRlciA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9oZWFkZXIgKikKQEAgLTM2Niw3ICszNjcsNiBAQAogCQkJCWtidWZmZXIgKyBQQUdFX1NJWkUgKiBpKSA+PiBQQUdFX1NISUZUOwogCiAJCSptc2dpbmZvID0gbXNnaGVhZGVyOwotCQkqbWVzc2FnZWNvdW50ID0gMTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTM5MCw4ICszOTAsNyBAQAogCXN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2hlYWRlciAqZ3BhZGxtc2c7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfYm9keSAqZ3BhZGxfYm9keTsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICptc2dpbmZvID0gTlVMTDsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICpzdWJtc2dpbmZvOwotCXUzMiBtc2djb3VudDsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICpzdWJtc2dpbmZvLCAqdG1wOwogCXN0cnVjdCBsaXN0X2hlYWQgKmN1cnI7CiAJdTMyIG5leHRfZ3BhZGxfaGFuZGxlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC00MDAsNyArMzk5LDcgQEAKIAluZXh0X2dwYWRsX2hhbmRsZSA9CiAJCShhdG9taWNfaW5jX3JldHVybigmdm1idXNfY29ubmVjdGlvbi5uZXh0X2dwYWRsX2hhbmRsZSkgLSAxKTsKIAotCXJldCA9IGNyZWF0ZV9ncGFkbF9oZWFkZXIoa2J1ZmZlciwgc2l6ZSwgJm1zZ2luZm8sICZtc2djb3VudCk7CisJcmV0ID0gY3JlYXRlX2dwYWRsX2hlYWRlcihrYnVmZmVyLCBzaXplLCAmbXNnaW5mbyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNDIzLDI0ICs0MjIsMjEgQEAKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gY2xlYW51cDsKIAotCWlmIChtc2djb3VudCA+IDEpIHsKLQkJbGlzdF9mb3JfZWFjaChjdXJyLCAmbXNnaW5mby0+c3VibXNnbGlzdCkgeworCWxpc3RfZm9yX2VhY2goY3VyciwgJm1zZ2luZm8tPnN1Ym1zZ2xpc3QpIHsKKwkJc3VibXNnaW5mbyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICopY3VycjsKKwkJZ3BhZGxfYm9keSA9CisJCQkoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfYm9keSAqKXN1Ym1zZ2luZm8tPm1zZzsKIAotCQkJc3VibXNnaW5mbyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICopY3VycjsKLQkJCWdwYWRsX2JvZHkgPQotCQkJICAgICAoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfYm9keSAqKXN1Ym1zZ2luZm8tPm1zZzsKKwkJZ3BhZGxfYm9keS0+aGVhZGVyLm1zZ3R5cGUgPQorCQkJQ0hBTk5FTE1TR19HUEFETF9CT0RZOworCQlncGFkbF9ib2R5LT5ncGFkbCA9IG5leHRfZ3BhZGxfaGFuZGxlOwogCi0JCQlncGFkbF9ib2R5LT5oZWFkZXIubXNndHlwZSA9Ci0JCQkJQ0hBTk5FTE1TR19HUEFETF9CT0RZOwotCQkJZ3BhZGxfYm9keS0+Z3BhZGwgPSBuZXh0X2dwYWRsX2hhbmRsZTsKKwkJcmV0ID0gdm1idXNfcG9zdF9tc2coZ3BhZGxfYm9keSwKKwkJCQkgICAgIHN1Ym1zZ2luZm8tPm1zZ3NpemUgLQorCQkJCSAgICAgc2l6ZW9mKCpzdWJtc2dpbmZvKSk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWdvdG8gY2xlYW51cDsKIAotCQkJcmV0ID0gdm1idXNfcG9zdF9tc2coZ3BhZGxfYm9keSwKLQkJCQkJICAgICAgIHN1Ym1zZ2luZm8tPm1zZ3NpemUgLQotCQkJCQkgICAgICAgc2l6ZW9mKCpzdWJtc2dpbmZvKSk7Ci0JCQlpZiAocmV0ICE9IDApCi0JCQkJZ290byBjbGVhbnVwOwotCi0JCX0KIAl9CiAJd2FpdF9mb3JfY29tcGxldGlvbigmbXNnaW5mby0+d2FpdGV2ZW50KTsKIApAQCAtNDUxLDYgKzQ0NywxMCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZ2bWJ1c19jb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwogCWxpc3RfZGVsKCZtc2dpbmZvLT5tc2dsaXN0ZW50cnkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZtYnVzX2Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHN1Ym1zZ2luZm8sIHRtcCwgJm1zZ2luZm8tPnN1Ym1zZ2xpc3QsCisJCQkJIG1zZ2xpc3RlbnRyeSkgeworCQlrZnJlZShzdWJtc2dpbmZvKTsKKwl9CiAKIAlrZnJlZShtc2dpbmZvKTsKIAlyZXR1cm4gcmV0OwpAQCAtNTEyLDcgKzUxMiw2IEBACiBzdGF0aWMgaW50IHZtYnVzX2Nsb3NlX2ludGVybmFsKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKQogewogCXN0cnVjdCB2bWJ1c19jaGFubmVsX2Nsb3NlX2NoYW5uZWwgKm1zZzsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgKnRhc2tsZXQ7CiAJaW50IHJldDsKIAogCS8qCkBAIC01MjQsOCArNTIzLDcgQEAKIAkgKiBUbyByZXNvbHZlIHRoZSByYWNlLCB3ZSBjYW4gc2VyaWFsaXplIHRoZW0gYnkgZGlzYWJsaW5nIHRoZQogCSAqIHRhc2tsZXQgd2hlbiB0aGUgbGF0dGVyIGlzIHJ1bm5pbmcgaGVyZS4KIAkgKi8KLQl0YXNrbGV0ID0gaHZfY29udGV4dC5ldmVudF9kcGNbY2hhbm5lbC0+dGFyZ2V0X2NwdV07Ci0JdGFza2xldF9kaXNhYmxlKHRhc2tsZXQpOworCWh2X2V2ZW50X3Rhc2tsZXRfZGlzYWJsZShjaGFubmVsKTsKIAogCS8qCiAJICogSW4gY2FzZSBhIGRldmljZSBkcml2ZXIncyBwcm9iZSgpIGZhaWxzIChlLmcuLApAQCAtNTkxLDcgKzU4OSw3IEBACiAJCWdldF9vcmRlcihjaGFubmVsLT5yaW5nYnVmZmVyX3BhZ2Vjb3VudCAqIFBBR0VfU0laRSkpOwogCiBvdXQ6Ci0JdGFza2xldF9lbmFibGUodGFza2xldCk7CisJaHZfZXZlbnRfdGFza2xldF9lbmFibGUoY2hhbm5lbCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjU5LDcgKzY1Nyw3IEBACiAJYnVmZmVybGlzdFsyXS5pb3ZfbGVuID0gKHBhY2tldGxlbl9hbGlnbmVkIC0gcGFja2V0bGVuKTsKIAogCXJldCA9IGh2X3JpbmdidWZmZXJfd3JpdGUoJmNoYW5uZWwtPm91dGJvdW5kLCBidWZmZXJsaXN0LCBudW1fdmVjcywKLQkJCQkgICZzaWduYWwsIGxvY2spOworCQkJCSAgJnNpZ25hbCwgbG9jaywgY2hhbm5lbC0+c2lnbmFsX3BvbGljeSk7CiAKIAkvKgogCSAqIFNpZ25hbGxpbmcgdGhlIGhvc3QgaXMgY29uZGl0aW9uYWwgb24gbWFueSBmYWN0b3JzOgpAQCAtNjgwLDExICs2NzgsNiBAQAogCSAqIG1lY2hhbmlzbSB3aGljaCBjYW4gaHVydCB0aGUgcGVyZm9ybWFuY2Ugb3RoZXJ3aXNlLgogCSAqLwogCi0JaWYgKGNoYW5uZWwtPnNpZ25hbF9wb2xpY3kpCi0JCXNpZ25hbCA9IHRydWU7Ci0JZWxzZQotCQlraWNrX3EgPSB0cnVlOwotCiAJaWYgKCgocmV0ID09IDApICYmIGtpY2tfcSAmJiBzaWduYWwpIHx8CiAJICAgIChyZXQgJiYgIWlzX2h2c29ja19jaGFubmVsKGNoYW5uZWwpKSkKIAkJdm1idXNfc2V0ZXZlbnQoY2hhbm5lbCk7CkBAIC03NzcsNyArNzcwLDcgQEAKIAlidWZmZXJsaXN0WzJdLmlvdl9sZW4gPSAocGFja2V0bGVuX2FsaWduZWQgLSBwYWNrZXRsZW4pOwogCiAJcmV0ID0gaHZfcmluZ2J1ZmZlcl93cml0ZSgmY2hhbm5lbC0+b3V0Ym91bmQsIGJ1ZmZlcmxpc3QsIDMsCi0JCQkJICAmc2lnbmFsLCBsb2NrKTsKKwkJCQkgICZzaWduYWwsIGxvY2ssIGNoYW5uZWwtPnNpZ25hbF9wb2xpY3kpOwogCiAJLyoKIAkgKiBTaWduYWxsaW5nIHRoZSBob3N0IGlzIGNvbmRpdGlvbmFsIG9uIG1hbnkgZmFjdG9yczoKQEAgLTc5NSwxMSArNzg4LDYgQEAKIAkgKiBlbm91Z2ggY29uZGl0aW9uIHRoYXQgaXQgc2hvdWxkIG5vdCBtYXR0ZXIuCiAJICovCiAKLQlpZiAoY2hhbm5lbC0+c2lnbmFsX3BvbGljeSkKLQkJc2lnbmFsID0gdHJ1ZTsKLQllbHNlCi0JCWtpY2tfcSA9IHRydWU7Ci0KIAlpZiAoKChyZXQgPT0gMCkgJiYga2lja19xICYmIHNpZ25hbCkgfHwgKHJldCkpCiAJCXZtYnVzX3NldGV2ZW50KGNoYW5uZWwpOwogCkBAIC04NjEsNyArODQ5LDcgQEAKIAlidWZmZXJsaXN0WzJdLmlvdl9sZW4gPSAocGFja2V0bGVuX2FsaWduZWQgLSBwYWNrZXRsZW4pOwogCiAJcmV0ID0gaHZfcmluZ2J1ZmZlcl93cml0ZSgmY2hhbm5lbC0+b3V0Ym91bmQsIGJ1ZmZlcmxpc3QsIDMsCi0JCQkJICAmc2lnbmFsLCBsb2NrKTsKKwkJCQkgICZzaWduYWwsIGxvY2ssIGNoYW5uZWwtPnNpZ25hbF9wb2xpY3kpOwogCiAJaWYgKHJldCA9PSAwICYmIHNpZ25hbCkKIAkJdm1idXNfc2V0ZXZlbnQoY2hhbm5lbCk7CkBAIC05MjYsNyArOTE0LDcgQEAKIAlidWZmZXJsaXN0WzJdLmlvdl9sZW4gPSAocGFja2V0bGVuX2FsaWduZWQgLSBwYWNrZXRsZW4pOwogCiAJcmV0ID0gaHZfcmluZ2J1ZmZlcl93cml0ZSgmY2hhbm5lbC0+b3V0Ym91bmQsIGJ1ZmZlcmxpc3QsIDMsCi0JCQkJICAmc2lnbmFsLCBsb2NrKTsKKwkJCQkgICZzaWduYWwsIGxvY2ssIGNoYW5uZWwtPnNpZ25hbF9wb2xpY3kpOwogCiAJaWYgKHJldCA9PSAwICYmIHNpZ25hbCkKIAkJdm1idXNfc2V0ZXZlbnQoY2hhbm5lbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L2NoYW5uZWxfbWdtdC5jIGIvZHJpdmVycy9odi9jaGFubmVsX21nbXQuYwppbmRleCBiNmMxMjExLi45NmE4NWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L2NoYW5uZWxfbWdtdC5jCisrKyBiL2RyaXZlcnMvaHYvY2hhbm5lbF9tZ210LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC0xMzgsMTAgKzEzOSwzMiBAQAogCX0sCiB9OwogCi1zdGF0aWMgdTE2IGh2X2dldF9kZXZfdHlwZShjb25zdCB1dWlkX2xlICpndWlkKQorc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdXVpZF9sZSBndWlkOworfSB2bWJ1c191bnN1cHBvcnRlZF9kZXZzW10gPSB7CisJeyBIVl9BVk1BMV9HVUlEIH0sCisJeyBIVl9BVk1BMl9HVUlEIH0sCisJeyBIVl9SRFZfR1VJRAl9LAorfTsKKworc3RhdGljIGJvb2wgaXNfdW5zdXBwb3J0ZWRfdm1idXNfZGV2cyhjb25zdCB1dWlkX2xlICpndWlkKQogeworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodm1idXNfdW5zdXBwb3J0ZWRfZGV2cyk7IGkrKykKKwkJaWYgKCF1dWlkX2xlX2NtcCgqZ3VpZCwgdm1idXNfdW5zdXBwb3J0ZWRfZGV2c1tpXS5ndWlkKSkKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHUxNiBodl9nZXRfZGV2X3R5cGUoY29uc3Qgc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJY29uc3QgdXVpZF9sZSAqZ3VpZCA9ICZjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5pZl90eXBlOwogCXUxNiBpOwogCisJaWYgKGlzX2h2c29ja19jaGFubmVsKGNoYW5uZWwpIHx8IGlzX3Vuc3VwcG9ydGVkX3ZtYnVzX2RldnMoZ3VpZCkpCisJCXJldHVybiBIVl9VTktPV047CisKIAlmb3IgKGkgPSBIVl9JREU7IGkgPCBIVl9VTktPV047IGkrKykgewogCQlpZiAoIXV1aWRfbGVfY21wKCpndWlkLCB2bWJ1c19kZXZzW2ldLmd1aWQpKQogCQkJcmV0dXJuIGk7CkBAIC0yNTEsMTQgKzI3NCwxMiBAQAogICovCiBzdGF0aWMgc3RydWN0IHZtYnVzX2NoYW5uZWwgKmFsbG9jX2NoYW5uZWwodm9pZCkKIHsKLQlzdGF0aWMgYXRvbWljX3QgY2hhbl9udW0gPSBBVE9NSUNfSU5JVCgwKTsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbDsKIAogCWNoYW5uZWwgPSBremFsbG9jKHNpemVvZigqY2hhbm5lbCksIEdGUF9BVE9NSUMpOwogCWlmICghY2hhbm5lbCkKIAkJcmV0dXJuIE5VTEw7CiAKLQljaGFubmVsLT5pZCA9IGF0b21pY19pbmNfcmV0dXJuKCZjaGFuX251bSk7CiAJY2hhbm5lbC0+YWNxdWlyZV9yaW5nX2xvY2sgPSB0cnVlOwogCXNwaW5fbG9ja19pbml0KCZjaGFubmVsLT5pbmJvdW5kX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZjaGFubmVsLT5sb2NrKTsKQEAgLTMwMywxNiArMzI0LDMyIEBACiAJdm1idXNfcG9zdF9tc2coJm1zZywgc2l6ZW9mKHN0cnVjdCB2bWJ1c19jaGFubmVsX3JlbGlkX3JlbGVhc2VkKSk7CiB9CiAKK3ZvaWQgaHZfZXZlbnRfdGFza2xldF9kaXNhYmxlKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdGFza2xldDsKKwl0YXNrbGV0ID0gaHZfY29udGV4dC5ldmVudF9kcGNbY2hhbm5lbC0+dGFyZ2V0X2NwdV07CisJdGFza2xldF9kaXNhYmxlKHRhc2tsZXQpOworfQorCit2b2lkIGh2X2V2ZW50X3Rhc2tsZXRfZW5hYmxlKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdGFza2xldDsKKwl0YXNrbGV0ID0gaHZfY29udGV4dC5ldmVudF9kcGNbY2hhbm5lbC0+dGFyZ2V0X2NwdV07CisJdGFza2xldF9lbmFibGUodGFza2xldCk7CisKKwkvKiBJbiBjYXNlIHRoZXJlIGlzIGFueSBwZW5kaW5nIGV2ZW50ICovCisJdGFza2xldF9zY2hlZHVsZSh0YXNrbGV0KTsKK30KKwogdm9pZCBodl9wcm9jZXNzX2NoYW5uZWxfcmVtb3ZhbChzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHJlbGlkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWwgKnByaW1hcnlfY2hhbm5lbDsKIAotCXZtYnVzX3JlbGVhc2VfcmVsaWQocmVsaWQpOwotCiAJQlVHX09OKCFjaGFubmVsLT5yZXNjaW5kKTsKIAlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmdm1idXNfY29ubmVjdGlvbi5jaGFubmVsX211dGV4KSk7CiAKKwlodl9ldmVudF90YXNrbGV0X2Rpc2FibGUoY2hhbm5lbCk7CiAJaWYgKGNoYW5uZWwtPnRhcmdldF9jcHUgIT0gZ2V0X2NwdSgpKSB7CiAJCXB1dF9jcHUoKTsKIAkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNoYW5uZWwtPnRhcmdldF9jcHUsCkBAIC0zMjEsNiArMzU4LDcgQEAKIAkJcGVyY3B1X2NoYW5uZWxfZGVxKGNoYW5uZWwpOwogCQlwdXRfY3B1KCk7CiAJfQorCWh2X2V2ZW50X3Rhc2tsZXRfZW5hYmxlKGNoYW5uZWwpOwogCiAJaWYgKGNoYW5uZWwtPnByaW1hcnlfY2hhbm5lbCA9PSBOVUxMKSB7CiAJCWxpc3RfZGVsKCZjaGFubmVsLT5saXN0ZW50cnkpOwpAQCAtMzM4LDggKzM3NiwxMSBAQAogCSAqIFdlIG5lZWQgdG8gZnJlZSB0aGUgYml0IGZvciBpbml0X3ZwX2luZGV4KCkgdG8gd29yayBpbiB0aGUgY2FzZQogCSAqIG9mIHN1Yi1jaGFubmVsLCB3aGVuIHdlIHJlbG9hZCBkcml2ZXJzIGxpa2UgaHZfbmV0dnNjLgogCSAqLwotCWNwdW1hc2tfY2xlYXJfY3B1KGNoYW5uZWwtPnRhcmdldF9jcHUsCi0JCQkgICZwcmltYXJ5X2NoYW5uZWwtPmFsbG9jZWRfY3B1c19pbl9ub2RlKTsKKwlpZiAoY2hhbm5lbC0+YWZmaW5pdHlfcG9saWN5ID09IEhWX0xPQ0FMSVpFRCkKKwkJY3B1bWFza19jbGVhcl9jcHUoY2hhbm5lbC0+dGFyZ2V0X2NwdSwKKwkJCQkgICZwcmltYXJ5X2NoYW5uZWwtPmFsbG9jZWRfY3B1c19pbl9ub2RlKTsKKworCXZtYnVzX3JlbGVhc2VfcmVsaWQocmVsaWQpOwogCiAJZnJlZV9jaGFubmVsKGNoYW5uZWwpOwogfQpAQCAtNDA1LDEwICs0NDYsMTMgQEAKIAkJCWdvdG8gZXJyX2ZyZWVfY2hhbjsKIAl9CiAKLQlkZXZfdHlwZSA9IGh2X2dldF9kZXZfdHlwZSgmbmV3Y2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuaWZfdHlwZSk7CisJZGV2X3R5cGUgPSBodl9nZXRfZGV2X3R5cGUobmV3Y2hhbm5lbCk7CisJaWYgKGRldl90eXBlID09IEhWX05JQykKKwkJc2V0X2NoYW5uZWxfc2lnbmFsX3N0YXRlKG5ld2NoYW5uZWwsIEhWX1NJR05BTF9QT0xJQ1lfRVhQTElDSVQpOwogCiAJaW5pdF92cF9pbmRleChuZXdjaGFubmVsLCBkZXZfdHlwZSk7CiAKKwlodl9ldmVudF90YXNrbGV0X2Rpc2FibGUobmV3Y2hhbm5lbCk7CiAJaWYgKG5ld2NoYW5uZWwtPnRhcmdldF9jcHUgIT0gZ2V0X2NwdSgpKSB7CiAJCXB1dF9jcHUoKTsKIAkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKG5ld2NoYW5uZWwtPnRhcmdldF9jcHUsCkBAIC00MTgsNiArNDYyLDcgQEAKIAkJcGVyY3B1X2NoYW5uZWxfZW5xKG5ld2NoYW5uZWwpOwogCQlwdXRfY3B1KCk7CiAJfQorCWh2X2V2ZW50X3Rhc2tsZXRfZW5hYmxlKG5ld2NoYW5uZWwpOwogCiAJLyoKIAkgKiBUaGlzIHN0YXRlIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBzdWNjZXNzZnVsIG9wZW4KQEAgLTQ2MywxMiArNTA4LDExIEBACiAJcmV0dXJuOwogCiBlcnJfZGVxX2NoYW46Ci0Jdm1idXNfcmVsZWFzZV9yZWxpZChuZXdjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZCk7Ci0KIAltdXRleF9sb2NrKCZ2bWJ1c19jb25uZWN0aW9uLmNoYW5uZWxfbXV0ZXgpOwogCWxpc3RfZGVsKCZuZXdjaGFubmVsLT5saXN0ZW50cnkpOwogCW11dGV4X3VubG9jaygmdm1idXNfY29ubmVjdGlvbi5jaGFubmVsX211dGV4KTsKIAorCWh2X2V2ZW50X3Rhc2tsZXRfZGlzYWJsZShuZXdjaGFubmVsKTsKIAlpZiAobmV3Y2hhbm5lbC0+dGFyZ2V0X2NwdSAhPSBnZXRfY3B1KCkpIHsKIAkJcHV0X2NwdSgpOwogCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUobmV3Y2hhbm5lbC0+dGFyZ2V0X2NwdSwKQEAgLTQ3Nyw2ICs1MjEsOSBAQAogCQlwZXJjcHVfY2hhbm5lbF9kZXEobmV3Y2hhbm5lbCk7CiAJCXB1dF9jcHUoKTsKIAl9CisJaHZfZXZlbnRfdGFza2xldF9lbmFibGUobmV3Y2hhbm5lbCk7CisKKwl2bWJ1c19yZWxlYXNlX3JlbGlkKG5ld2NoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkKTsKIAogZXJyX2ZyZWVfY2hhbjoKIAlmcmVlX2NoYW5uZWwobmV3Y2hhbm5lbCk7CkBAIC01MjIsMTcgKzU2OSwxNyBAQAogCX0KIAogCS8qCi0JICogV2UgZGlzdHJpYnV0ZSBwcmltYXJ5IGNoYW5uZWxzIGV2ZW5seSBhY3Jvc3MgYWxsIHRoZSBhdmFpbGFibGUKLQkgKiBOVU1BIG5vZGVzIGFuZCB3aXRoaW4gdGhlIGFzc2lnbmVkIE5VTUEgbm9kZSB3ZSB3aWxsIGFzc2lnbiB0aGUKLQkgKiBmaXJzdCBhdmFpbGFibGUgQ1BVIHRvIHRoZSBwcmltYXJ5IGNoYW5uZWwuCi0JICogVGhlIHN1Yi1jaGFubmVscyB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBDUFVzIGF2YWlsYWJsZSBpbiB0aGUKLQkgKiBOVU1BIG5vZGUgZXZlbmx5LgorCSAqIEJhc2VkIG9uIHRoZSBjaGFubmVsIGFmZmluaXR5IHBvbGljeSwgd2Ugd2lsbCBhc3NpZ24gdGhlIE5VTUEKKwkgKiBub2Rlcy4KIAkgKi8KLQlpZiAoIXByaW1hcnkpIHsKKworCWlmICgoY2hhbm5lbC0+YWZmaW5pdHlfcG9saWN5ID09IEhWX0JBTEFOQ0VEKSB8fCAoIXByaW1hcnkpKSB7CiAJCXdoaWxlICh0cnVlKSB7CiAJCQluZXh0X25vZGUgPSBuZXh0X251bWFfbm9kZV9pZCsrOwotCQkJaWYgKG5leHRfbm9kZSA9PSBucl9ub2RlX2lkcykKKwkJCWlmIChuZXh0X25vZGUgPT0gbnJfbm9kZV9pZHMpIHsKIAkJCQluZXh0X25vZGUgPSBuZXh0X251bWFfbm9kZV9pZCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CiAJCQlpZiAoY3B1bWFza19lbXB0eShjcHVtYXNrX29mX25vZGUobmV4dF9ub2RlKSkpCiAJCQkJY29udGludWU7CiAJCQlicmVhazsKQEAgLTU1NiwxNSArNjAzLDE3IEBACiAKIAljdXJfY3B1ID0gLTE7CiAKLQkvKgotCSAqIE5vcm1hbGx5IEh5cGVyLVYgaG9zdCBkb2Vzbid0IGNyZWF0ZSBtb3JlIHN1YmNoYW5uZWxzIHRoYW4gdGhlcmUKLQkgKiBhcmUgVkNQVXMgb24gdGhlIG5vZGUgYnV0IGl0IGlzIHBvc3NpYmxlIHdoZW4gbm90IGFsbCBwcmVzZW50IFZDUFVzCi0JICogb24gdGhlIG5vZGUgYXJlIGluaXRpYWxpemVkIGJ5IGd1ZXN0LiBDbGVhciB0aGUgYWxsb2NlZF9jcHVzX2luX25vZGUKLQkgKiB0byBzdGFydCBvdmVyLgotCSAqLwotCWlmIChjcHVtYXNrX2VxdWFsKCZwcmltYXJ5LT5hbGxvY2VkX2NwdXNfaW5fbm9kZSwKLQkJCSAgY3B1bWFza19vZl9ub2RlKHByaW1hcnktPm51bWFfbm9kZSkpKQotCQljcHVtYXNrX2NsZWFyKCZwcmltYXJ5LT5hbGxvY2VkX2NwdXNfaW5fbm9kZSk7CisJaWYgKHByaW1hcnktPmFmZmluaXR5X3BvbGljeSA9PSBIVl9MT0NBTElaRUQpIHsKKwkJLyoKKwkJICogTm9ybWFsbHkgSHlwZXItViBob3N0IGRvZXNuJ3QgY3JlYXRlIG1vcmUgc3ViY2hhbm5lbHMKKwkJICogdGhhbiB0aGVyZSBhcmUgVkNQVXMgb24gdGhlIG5vZGUgYnV0IGl0IGlzIHBvc3NpYmxlIHdoZW4gbm90CisJCSAqIGFsbCBwcmVzZW50IFZDUFVzIG9uIHRoZSBub2RlIGFyZSBpbml0aWFsaXplZCBieSBndWVzdC4KKwkJICogQ2xlYXIgdGhlIGFsbG9jZWRfY3B1c19pbl9ub2RlIHRvIHN0YXJ0IG92ZXIuCisJCSAqLworCQlpZiAoY3B1bWFza19lcXVhbCgmcHJpbWFyeS0+YWxsb2NlZF9jcHVzX2luX25vZGUsCisJCQkJICBjcHVtYXNrX29mX25vZGUocHJpbWFyeS0+bnVtYV9ub2RlKSkpCisJCQljcHVtYXNrX2NsZWFyKCZwcmltYXJ5LT5hbGxvY2VkX2NwdXNfaW5fbm9kZSk7CisJfQogCiAJd2hpbGUgKHRydWUpIHsKIAkJY3VyX2NwdSA9IGNwdW1hc2tfbmV4dChjdXJfY3B1LCAmYXZhaWxhYmxlX21hc2spOwpAQCAtNTc1LDE3ICs2MjQsMjQgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJLyoKLQkJICogTk9URTogaW4gdGhlIGNhc2Ugb2Ygc3ViLWNoYW5uZWwsIHdlIGNsZWFyIHRoZSBzdWItY2hhbm5lbAotCQkgKiByZWxhdGVkIGJpdChzKSBpbiBwcmltYXJ5LT5hbGxvY2VkX2NwdXNfaW5fbm9kZSBpbgotCQkgKiBodl9wcm9jZXNzX2NoYW5uZWxfcmVtb3ZhbCgpLCBzbyB3aGVuIHdlIHJlbG9hZCBkcml2ZXJzCi0JCSAqIGxpa2UgaHZfbmV0dnNjIGluIFNNUCBndWVzdCwgaGVyZSB3ZSdyZSBhYmxlIHRvIHJlLWFsbG9jYXRlCi0JCSAqIGJpdCBmcm9tIHByaW1hcnktPmFsbG9jZWRfY3B1c19pbl9ub2RlLgotCQkgKi8KLQkJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGN1cl9jcHUsCi0JCQkJJnByaW1hcnktPmFsbG9jZWRfY3B1c19pbl9ub2RlKSkgewotCQkJY3B1bWFza19zZXRfY3B1KGN1cl9jcHUsCi0JCQkJCSZwcmltYXJ5LT5hbGxvY2VkX2NwdXNfaW5fbm9kZSk7CisJCWlmIChwcmltYXJ5LT5hZmZpbml0eV9wb2xpY3kgPT0gSFZfTE9DQUxJWkVEKSB7CisJCQkvKgorCQkJICogTk9URTogaW4gdGhlIGNhc2Ugb2Ygc3ViLWNoYW5uZWwsIHdlIGNsZWFyIHRoZQorCQkJICogc3ViLWNoYW5uZWwgcmVsYXRlZCBiaXQocykgaW4KKwkJCSAqIHByaW1hcnktPmFsbG9jZWRfY3B1c19pbl9ub2RlIGluCisJCQkgKiBodl9wcm9jZXNzX2NoYW5uZWxfcmVtb3ZhbCgpLCBzbyB3aGVuIHdlCisJCQkgKiByZWxvYWQgZHJpdmVycyBsaWtlIGh2X25ldHZzYyBpbiBTTVAgZ3Vlc3QsIGhlcmUKKwkJCSAqIHdlJ3JlIGFibGUgdG8gcmUtYWxsb2NhdGUKKwkJCSAqIGJpdCBmcm9tIHByaW1hcnktPmFsbG9jZWRfY3B1c19pbl9ub2RlLgorCQkJICovCisJCQlpZiAoIWNwdW1hc2tfdGVzdF9jcHUoY3VyX2NwdSwKKwkJCQkJICAgICAgJnByaW1hcnktPmFsbG9jZWRfY3B1c19pbl9ub2RlKSkgeworCQkJCWNwdW1hc2tfc2V0X2NwdShjdXJfY3B1LAorCQkJCQkJJnByaW1hcnktPmFsbG9jZWRfY3B1c19pbl9ub2RlKTsKKwkJCQljcHVtYXNrX3NldF9jcHUoY3VyX2NwdSwgYWxsb2NlZF9tYXNrKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKIAkJCWNwdW1hc2tfc2V0X2NwdShjdXJfY3B1LCBhbGxvY2VkX21hc2spOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvY29ubmVjdGlvbi5jIGIvZHJpdmVycy9odi9jb25uZWN0aW9uLmMKaW5kZXggZmNmOGEwMi4uNzhlNjM2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9jb25uZWN0aW9uLmMKKysrIGIvZHJpdmVycy9odi9jb25uZWN0aW9uLmMKQEAgLTQzOSw3ICs0MzksNyBAQAogCXVuaW9uIGh2X2Nvbm5lY3Rpb25faWQgY29ubl9pZDsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgcmV0cmllcyA9IDA7Ci0JdTMyIG1zZWMgPSAxOworCXUzMiB1c2VjID0gMTsKIAogCWNvbm5faWQuYXN1MzIgPSAwOwogCWNvbm5faWQudS5pZCA9IFZNQlVTX01FU1NBR0VfQ09OTkVDVElPTl9JRDsKQEAgLTQ3Miw5ICs0NzIsOSBAQAogCQl9CiAKIAkJcmV0cmllcysrOwotCQltc2xlZXAobXNlYyk7Ci0JCWlmIChtc2VjIDwgMjA0OCkKLQkJCW1zZWMgKj0gMjsKKwkJdWRlbGF5KHVzZWMpOworCQlpZiAodXNlYyA8IDIwNDgpCisJCQl1c2VjICo9IDI7CiAJfQogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L2h2LmMgYi9kcml2ZXJzL2h2L2h2LmMKaW5kZXggYTFjMDg2Yi4uNjBkYmQ2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9odi5jCisrKyBiL2RyaXZlcnMvaHYvaHYuYwpAQCAtMjc4LDcgKzI3OCw3IEBACiAgKgogICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBub3JtYWxseSBkdXJpbmcgZHJpdmVyIHVubG9hZGluZyBvciBleGl0aW5nLgogICovCi12b2lkIGh2X2NsZWFudXAodm9pZCkKK3ZvaWQgaHZfY2xlYW51cChib29sIGNyYXNoKQogewogCXVuaW9uIGh2X3g2NF9tc3JfaHlwZXJjYWxsX2NvbnRlbnRzIGh5cGVyY2FsbF9tc3I7CiAKQEAgLTI4OCw3ICsyODgsOCBAQAogCWlmIChodl9jb250ZXh0Lmh5cGVyY2FsbF9wYWdlKSB7CiAJCWh5cGVyY2FsbF9tc3IuYXNfdWludDY0ID0gMDsKIAkJd3Jtc3JsKEhWX1g2NF9NU1JfSFlQRVJDQUxMLCBoeXBlcmNhbGxfbXNyLmFzX3VpbnQ2NCk7Ci0JCXZmcmVlKGh2X2NvbnRleHQuaHlwZXJjYWxsX3BhZ2UpOworCQlpZiAoIWNyYXNoKQorCQkJdmZyZWUoaHZfY29udGV4dC5oeXBlcmNhbGxfcGFnZSk7CiAJCWh2X2NvbnRleHQuaHlwZXJjYWxsX3BhZ2UgPSBOVUxMOwogCX0KIApAQCAtMzA4LDcgKzMwOSw4IEBACiAKIAkJaHlwZXJjYWxsX21zci5hc191aW50NjQgPSAwOwogCQl3cm1zcmwoSFZfWDY0X01TUl9SRUZFUkVOQ0VfVFNDLCBoeXBlcmNhbGxfbXNyLmFzX3VpbnQ2NCk7Ci0JCXZmcmVlKGh2X2NvbnRleHQudHNjX3BhZ2UpOworCQlpZiAoIWNyYXNoKQorCQkJdmZyZWUoaHZfY29udGV4dC50c2NfcGFnZSk7CiAJCWh2X2NvbnRleHQudHNjX3BhZ2UgPSBOVUxMOwogCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9odl9iYWxsb29uLmMgYi9kcml2ZXJzL2h2L2h2X2JhbGxvb24uYwppbmRleCBkZjM1ZmI3Li5mZGY4ZGE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L2h2X2JhbGxvb24uYworKysgYi9kcml2ZXJzL2h2L2h2X2JhbGxvb24uYwpAQCAtNDMwLDE2ICs0MzAsMjcgQEAKICAqIGN1cnJlbnRseSBob3QgYWRkZWQuIFdlIGhvdCBhZGQgaW4gbXVsdGlwbGVzIG9mIDEyOE0KICAqIGNodW5rczsgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBtYXkgbm90IGJlIGFibGUgdG8gYnJpbmcKICAqIG9ubGluZSBhbGwgdGhlIHBhZ2VzIGluIHRoZSByZWdpb24uIFRoZSByYW5nZQotICogY292ZXJlZF9lbmRfcGZuIGRlZmluZXMgdGhlIHBhZ2VzIHRoYXQgY2FuCisgKiBjb3ZlcmVkX3N0YXJ0X3Bmbjpjb3ZlcmVkX2VuZF9wZm4gZGVmaW5lcyB0aGUgcGFnZXMgdGhhdCBjYW4KICAqIGJlIGJyb3VnaCBvbmxpbmUuCiAgKi8KIAogc3RydWN0IGh2X2hvdGFkZF9zdGF0ZSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuOworCXVuc2lnbmVkIGxvbmcgY292ZXJlZF9zdGFydF9wZm47CiAJdW5zaWduZWQgbG9uZyBjb3ZlcmVkX2VuZF9wZm47CiAJdW5zaWduZWQgbG9uZyBoYV9lbmRfcGZuOwogCXVuc2lnbmVkIGxvbmcgZW5kX3BmbjsKKwkvKgorCSAqIEEgbGlzdCBvZiBnYXBzLgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQgZ2FwX2xpc3Q7Cit9OworCitzdHJ1Y3QgaHZfaG90YWRkX2dhcCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuOworCXVuc2lnbmVkIGxvbmcgZW5kX3BmbjsKIH07CiAKIHN0cnVjdCBiYWxsb29uX3N0YXRlIHsKQEAgLTUzNiw3ICs1NDcsMTEgQEAKIAkgKi8KIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRocmVhZDsKIAotCXN0cnVjdCBtdXRleCBoYV9yZWdpb25fbXV0ZXg7CisJLyoKKwkgKiBQcm90ZWN0cyBoYV9yZWdpb25fbGlzdCwgbnVtX3BhZ2VzX29ubGluZWQgY291bnRlciBhbmQgaW5kaXZpZHVhbAorCSAqIHJlZ2lvbnMgZnJvbSBoYV9yZWdpb25fbGlzdC4KKwkgKi8KKwlzcGlubG9ja190IGhhX2xvY2s7CiAKIAkvKgogCSAqIEEgbGlzdCBvZiBob3QtYWRkIHJlZ2lvbnMuCkBAIC01NjAsMTggKzU3NSwxNCBAQAogCQkJICAgICAgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgbWVtb3J5X25vdGlmeSAqbWVtID0gKHN0cnVjdCBtZW1vcnlfbm90aWZ5ICopdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3dpdGNoICh2YWwpIHsKLQljYXNlIE1FTV9HT0lOR19PTkxJTkU6Ci0JCW11dGV4X2xvY2soJmRtX2RldmljZS5oYV9yZWdpb25fbXV0ZXgpOwotCQlicmVhazsKLQogCWNhc2UgTUVNX09OTElORToKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtX2RldmljZS5oYV9sb2NrLCBmbGFncyk7CiAJCWRtX2RldmljZS5udW1fcGFnZXNfb25saW5lZCArPSBtZW0tPm5yX3BhZ2VzOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOwogCWNhc2UgTUVNX0NBTkNFTF9PTkxJTkU6Ci0JCWlmICh2YWwgPT0gTUVNX09OTElORSB8fAotCQkgICAgbXV0ZXhfaXNfbG9ja2VkKCZkbV9kZXZpY2UuaGFfcmVnaW9uX211dGV4KSkKLQkJCW11dGV4X3VubG9jaygmZG1fZGV2aWNlLmhhX3JlZ2lvbl9tdXRleCk7CiAJCWlmIChkbV9kZXZpY2UuaGFfd2FpdGluZykgewogCQkJZG1fZGV2aWNlLmhhX3dhaXRpbmcgPSBmYWxzZTsKIAkJCWNvbXBsZXRlKCZkbV9kZXZpY2Uub2xfd2FpdGV2ZW50KTsKQEAgLTU3OSwxMCArNTkwLDExIEBACiAJCWJyZWFrOwogCiAJY2FzZSBNRU1fT0ZGTElORToKLQkJbXV0ZXhfbG9jaygmZG1fZGV2aWNlLmhhX3JlZ2lvbl9tdXRleCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOwogCQlkbV9kZXZpY2UubnVtX3BhZ2VzX29ubGluZWQgLT0gbWVtLT5ucl9wYWdlczsKLQkJbXV0ZXhfdW5sb2NrKCZkbV9kZXZpY2UuaGFfcmVnaW9uX211dGV4KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1fZGV2aWNlLmhhX2xvY2ssIGZsYWdzKTsKIAkJYnJlYWs7CisJY2FzZSBNRU1fR09JTkdfT05MSU5FOgogCWNhc2UgTUVNX0dPSU5HX09GRkxJTkU6CiAJY2FzZSBNRU1fQ0FOQ0VMX09GRkxJTkU6CiAJCWJyZWFrOwpAQCAtNTk1LDE4ICs2MDcsNDYgQEAKIAkucHJpb3JpdHkgPSAwCiB9OwogCisvKiBDaGVjayBpZiB0aGUgcGFydGljdWxhciBwYWdlIGlzIGJhY2tlZCBhbmQgY2FuIGJlIG9ubGluZWQgYW5kIG9ubGluZSBpdC4gKi8KK3N0YXRpYyB2b2lkIGh2X3BhZ2Vfb25saW5lX29uZShzdHJ1Y3QgaHZfaG90YWRkX3N0YXRlICpoYXMsIHN0cnVjdCBwYWdlICpwZykKK3sKKwl1bnNpZ25lZCBsb25nIGN1cl9zdGFydF9wZ3A7CisJdW5zaWduZWQgbG9uZyBjdXJfZW5kX3BncDsKKwlzdHJ1Y3QgaHZfaG90YWRkX2dhcCAqZ2FwOwogCi1zdGF0aWMgdm9pZCBodl9icmluZ19wZ3Nfb25saW5lKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIHNpemUpCisJY3VyX3N0YXJ0X3BncCA9ICh1bnNpZ25lZCBsb25nKXBmbl90b19wYWdlKGhhcy0+Y292ZXJlZF9zdGFydF9wZm4pOworCWN1cl9lbmRfcGdwID0gKHVuc2lnbmVkIGxvbmcpcGZuX3RvX3BhZ2UoaGFzLT5jb3ZlcmVkX2VuZF9wZm4pOworCisJLyogVGhlIHBhZ2UgaXMgbm90IGJhY2tlZC4gKi8KKwlpZiAoKCh1bnNpZ25lZCBsb25nKXBnIDwgY3VyX3N0YXJ0X3BncCkgfHwKKwkgICAgKCh1bnNpZ25lZCBsb25nKXBnID49IGN1cl9lbmRfcGdwKSkKKwkJcmV0dXJuOworCisJLyogQ2hlY2sgZm9yIGdhcHMuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShnYXAsICZoYXMtPmdhcF9saXN0LCBsaXN0KSB7CisJCWN1cl9zdGFydF9wZ3AgPSAodW5zaWduZWQgbG9uZykKKwkJCXBmbl90b19wYWdlKGdhcC0+c3RhcnRfcGZuKTsKKwkJY3VyX2VuZF9wZ3AgPSAodW5zaWduZWQgbG9uZykKKwkJCXBmbl90b19wYWdlKGdhcC0+ZW5kX3Bmbik7CisJCWlmICgoKHVuc2lnbmVkIGxvbmcpcGcgPj0gY3VyX3N0YXJ0X3BncCkgJiYKKwkJICAgICgodW5zaWduZWQgbG9uZylwZyA8IGN1cl9lbmRfcGdwKSkgeworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogVGhpcyBmcmFtZSBpcyBjdXJyZW50bHkgYmFja2VkOyBvbmxpbmUgdGhlIHBhZ2UuICovCisJX19vbmxpbmVfcGFnZV9zZXRfbGltaXRzKHBnKTsKKwlfX29ubGluZV9wYWdlX2luY3JlbWVudF9jb3VudGVycyhwZyk7CisJX19vbmxpbmVfcGFnZV9mcmVlKHBnKTsKK30KKworc3RhdGljIHZvaWQgaHZfYnJpbmdfcGdzX29ubGluZShzdHJ1Y3QgaHZfaG90YWRkX3N0YXRlICpoYXMsCisJCQkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJc3RydWN0IHBhZ2UgKnBnOwotCQlwZyA9IHBmbl90b19wYWdlKHN0YXJ0X3BmbiArIGkpOwotCQlfX29ubGluZV9wYWdlX3NldF9saW1pdHMocGcpOwotCQlfX29ubGluZV9wYWdlX2luY3JlbWVudF9jb3VudGVycyhwZyk7Ci0JCV9fb25saW5lX3BhZ2VfZnJlZShwZyk7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCWh2X3BhZ2Vfb25saW5lX29uZShoYXMsIHBmbl90b19wYWdlKHN0YXJ0X3BmbiArIGkpKTsKIH0KIAogc3RhdGljIHZvaWQgaHZfbWVtX2hvdF9hZGQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplLApAQCAtNjE4LDkgKzY1OCwxMiBAQAogCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuOwogCXVuc2lnbmVkIGxvbmcgcHJvY2Vzc2VkX3BmbjsKIAl1bnNpZ25lZCBsb25nIHRvdGFsX3BmbiA9IHBmbl9jb3VudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZm9yIChpID0gMDsgaSA8IChzaXplL0hBX0NIVU5LKTsgaSsrKSB7CiAJCXN0YXJ0X3BmbiA9IHN0YXJ0ICsgKGkgKiBIQV9DSFVOSyk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtX2RldmljZS5oYV9sb2NrLCBmbGFncyk7CiAJCWhhcy0+aGFfZW5kX3BmbiArPSAgSEFfQ0hVTks7CiAKIAkJaWYgKHRvdGFsX3BmbiA+IEhBX0NIVU5LKSB7CkBAIC02MzIsMTEgKzY3NSwxMSBAQAogCQl9CiAKIAkJaGFzLT5jb3ZlcmVkX2VuZF9wZm4gKz0gIHByb2Nlc3NlZF9wZm47CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtX2RldmljZS5oYV9sb2NrLCBmbGFncyk7CiAKIAkJaW5pdF9jb21wbGV0aW9uKCZkbV9kZXZpY2Uub2xfd2FpdGV2ZW50KTsKLQkJZG1fZGV2aWNlLmhhX3dhaXRpbmcgPSB0cnVlOworCQlkbV9kZXZpY2UuaGFfd2FpdGluZyA9ICFtZW1ocF9hdXRvX29ubGluZTsKIAotCQltdXRleF91bmxvY2soJmRtX2RldmljZS5oYV9yZWdpb25fbXV0ZXgpOwogCQluaWQgPSBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZChQRk5fUEhZUyhzdGFydF9wZm4pKTsKIAkJcmV0ID0gYWRkX21lbW9yeShuaWQsIFBGTl9QSFlTKChzdGFydF9wZm4pKSwKIAkJCQkoSEFfQ0hVTksgPDwgUEFHRV9TSElGVCkpOwpAQCAtNjUzLDIwICs2OTYsMjMgQEAKIAkJCQkgKi8KIAkJCQlkb19ob3RfYWRkID0gZmFsc2U7CiAJCQl9CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZG1fZGV2aWNlLmhhX2xvY2ssIGZsYWdzKTsKIAkJCWhhcy0+aGFfZW5kX3BmbiAtPSBIQV9DSFVOSzsKIAkJCWhhcy0+Y292ZXJlZF9lbmRfcGZuIC09ICBwcm9jZXNzZWRfcGZuOwotCQkJbXV0ZXhfbG9jaygmZG1fZGV2aWNlLmhhX3JlZ2lvbl9tdXRleCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOwogCQkJYnJlYWs7CiAJCX0KIAogCQkvKgotCQkgKiBXYWl0IGZvciB0aGUgbWVtb3J5IGJsb2NrIHRvIGJlIG9ubGluZWQuCi0JCSAqIFNpbmNlIHRoZSBob3QgYWRkIGhhcyBzdWNjZWVkZWQsIGl0IGlzIG9rIHRvCi0JCSAqIHByb2NlZWQgZXZlbiBpZiB0aGUgcGFnZXMgaW4gdGhlIGhvdCBhZGRlZCByZWdpb24KLQkJICogaGF2ZSBub3QgYmVlbiAib25saW5lZCIgd2l0aGluIHRoZSBhbGxvd2VkIHRpbWUuCisJCSAqIFdhaXQgZm9yIHRoZSBtZW1vcnkgYmxvY2sgdG8gYmUgb25saW5lZCB3aGVuIG1lbW9yeSBvbmxpbmluZworCQkgKiBpcyBkb25lIG91dHNpZGUgb2Yga2VybmVsIChtZW1ocF9hdXRvX29ubGluZSkuIFNpbmNlIHRoZSBob3QKKwkJICogYWRkIGhhcyBzdWNjZWVkZWQsIGl0IGlzIG9rIHRvIHByb2NlZWQgZXZlbiBpZiB0aGUgcGFnZXMgaW4KKwkJICogdGhlIGhvdCBhZGRlZCByZWdpb24gaGF2ZSBub3QgYmVlbiAib25saW5lZCIgd2l0aGluIHRoZQorCQkgKiBhbGxvd2VkIHRpbWUuCiAJCSAqLwotCQl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmRtX2RldmljZS5vbF93YWl0ZXZlbnQsIDUqSFopOwotCQltdXRleF9sb2NrKCZkbV9kZXZpY2UuaGFfcmVnaW9uX211dGV4KTsKKwkJaWYgKGRtX2RldmljZS5oYV93YWl0aW5nKQorCQkJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkbV9kZXZpY2Uub2xfd2FpdGV2ZW50LAorCQkJCQkJICAgIDUqSFopOwogCQlwb3N0X3N0YXR1cygmZG1fZGV2aWNlKTsKIAl9CiAKQEAgLTY3NSw0NyArNzIxLDY0IEBACiAKIHN0YXRpYyB2b2lkIGh2X29ubGluZV9wYWdlKHN0cnVjdCBwYWdlICpwZykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpjdXI7CiAJc3RydWN0IGh2X2hvdGFkZF9zdGF0ZSAqaGFzOwogCXVuc2lnbmVkIGxvbmcgY3VyX3N0YXJ0X3BncDsKIAl1bnNpZ25lZCBsb25nIGN1cl9lbmRfcGdwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlsaXN0X2Zvcl9lYWNoKGN1ciwgJmRtX2RldmljZS5oYV9yZWdpb25fbGlzdCkgewotCQloYXMgPSBsaXN0X2VudHJ5KGN1ciwgc3RydWN0IGh2X2hvdGFkZF9zdGF0ZSwgbGlzdCk7Ci0JCWN1cl9zdGFydF9wZ3AgPSAodW5zaWduZWQgbG9uZylwZm5fdG9fcGFnZShoYXMtPnN0YXJ0X3Bmbik7Ci0JCWN1cl9lbmRfcGdwID0gKHVuc2lnbmVkIGxvbmcpcGZuX3RvX3BhZ2UoaGFzLT5jb3ZlcmVkX2VuZF9wZm4pOworCXNwaW5fbG9ja19pcnFzYXZlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaGFzLCAmZG1fZGV2aWNlLmhhX3JlZ2lvbl9saXN0LCBsaXN0KSB7CisJCWN1cl9zdGFydF9wZ3AgPSAodW5zaWduZWQgbG9uZykKKwkJCXBmbl90b19wYWdlKGhhcy0+c3RhcnRfcGZuKTsKKwkJY3VyX2VuZF9wZ3AgPSAodW5zaWduZWQgbG9uZylwZm5fdG9fcGFnZShoYXMtPmVuZF9wZm4pOwogCi0JCWlmICgoKHVuc2lnbmVkIGxvbmcpcGcgPj0gY3VyX3N0YXJ0X3BncCkgJiYKLQkJCSgodW5zaWduZWQgbG9uZylwZyA8IGN1cl9lbmRfcGdwKSkgewotCQkJLyoKLQkJCSAqIFRoaXMgZnJhbWUgaXMgY3VycmVudGx5IGJhY2tlZDsgb25saW5lIHRoZQotCQkJICogcGFnZS4KLQkJCSAqLwotCQkJX19vbmxpbmVfcGFnZV9zZXRfbGltaXRzKHBnKTsKLQkJCV9fb25saW5lX3BhZ2VfaW5jcmVtZW50X2NvdW50ZXJzKHBnKTsKLQkJCV9fb25saW5lX3BhZ2VfZnJlZShwZyk7Ci0JCX0KKwkJLyogVGhlIHBhZ2UgYmVsb25ncyB0byBhIGRpZmZlcmVudCBIQVMuICovCisJCWlmICgoKHVuc2lnbmVkIGxvbmcpcGcgPCBjdXJfc3RhcnRfcGdwKSB8fAorCQkgICAgKCh1bnNpZ25lZCBsb25nKXBnID49IGN1cl9lbmRfcGdwKSkKKwkJCWNvbnRpbnVlOworCisJCWh2X3BhZ2Vfb25saW5lX29uZShoYXMsIHBnKTsKKwkJYnJlYWs7CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtX2RldmljZS5oYV9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBib29sIHBmbl9jb3ZlcmVkKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIHBmbl9jbnQpCitzdGF0aWMgaW50IHBmbl9jb3ZlcmVkKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIHBmbl9jbnQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqY3VyOwogCXN0cnVjdCBodl9ob3RhZGRfc3RhdGUgKmhhczsKKwlzdHJ1Y3QgaHZfaG90YWRkX2dhcCAqZ2FwOwogCXVuc2lnbmVkIGxvbmcgcmVzaWR1YWwsIG5ld19pbmM7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChsaXN0X2VtcHR5KCZkbV9kZXZpY2UuaGFfcmVnaW9uX2xpc3QpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlsaXN0X2Zvcl9lYWNoKGN1ciwgJmRtX2RldmljZS5oYV9yZWdpb25fbGlzdCkgewotCQloYXMgPSBsaXN0X2VudHJ5KGN1ciwgc3RydWN0IGh2X2hvdGFkZF9zdGF0ZSwgbGlzdCk7Ci0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1fZGV2aWNlLmhhX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhhcywgJmRtX2RldmljZS5oYV9yZWdpb25fbGlzdCwgbGlzdCkgewogCQkvKgogCQkgKiBJZiB0aGUgcGZuIHJhbmdlIHdlIGFyZSBkZWFsaW5nIHdpdGggaXMgbm90IGluIHRoZSBjdXJyZW50CiAJCSAqICJob3QgYWRkIGJsb2NrIiwgbW92ZSBvbi4KIAkJICovCiAJCWlmIChzdGFydF9wZm4gPCBoYXMtPnN0YXJ0X3BmbiB8fCBzdGFydF9wZm4gPj0gaGFzLT5lbmRfcGZuKQogCQkJY29udGludWU7CisKKwkJLyoKKwkJICogSWYgdGhlIGN1cnJlbnQgc3RhcnQgcGZuIGlzIG5vdCB3aGVyZSB0aGUgY292ZXJlZF9lbmQKKwkJICogaXMsIGNyZWF0ZSBhIGdhcCBhbmQgdXBkYXRlIGNvdmVyZWRfZW5kX3Bmbi4KKwkJICovCisJCWlmIChoYXMtPmNvdmVyZWRfZW5kX3BmbiAhPSBzdGFydF9wZm4pIHsKKwkJCWdhcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBodl9ob3RhZGRfZ2FwKSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoIWdhcCkgeworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCUlOSVRfTElTVF9IRUFEKCZnYXAtPmxpc3QpOworCQkJZ2FwLT5zdGFydF9wZm4gPSBoYXMtPmNvdmVyZWRfZW5kX3BmbjsKKwkJCWdhcC0+ZW5kX3BmbiA9IHN0YXJ0X3BmbjsKKwkJCWxpc3RfYWRkX3RhaWwoJmdhcC0+bGlzdCwgJmhhcy0+Z2FwX2xpc3QpOworCisJCQloYXMtPmNvdmVyZWRfZW5kX3BmbiA9IHN0YXJ0X3BmbjsKKwkJfQorCiAJCS8qCiAJCSAqIElmIHRoZSBjdXJyZW50IGhvdCBhZGQtcmVxdWVzdCBleHRlbmRzIGJleW9uZAogCQkgKiBvdXIgY3VycmVudCBsaW1pdDsgZXh0ZW5kIGl0LgpAQCAtNzMyLDE5ICs3OTUsMTIgQEAKIAkJCWhhcy0+ZW5kX3BmbiArPSBuZXdfaW5jOwogCQl9CiAKLQkJLyoKLQkJICogSWYgdGhlIGN1cnJlbnQgc3RhcnQgcGZuIGlzIG5vdCB3aGVyZSB0aGUgY292ZXJlZF9lbmQKLQkJICogaXMsIHVwZGF0ZSBpdC4KLQkJICovCi0KLQkJaWYgKGhhcy0+Y292ZXJlZF9lbmRfcGZuICE9IHN0YXJ0X3BmbikKLQkJCWhhcy0+Y292ZXJlZF9lbmRfcGZuID0gc3RhcnRfcGZuOwotCi0JCXJldHVybiB0cnVlOwotCisJCXJldCA9IDE7CisJCWJyZWFrOwogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIGZhbHNlOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGhhbmRsZV9wZ19yYW5nZSh1bnNpZ25lZCBsb25nIHBnX3N0YXJ0LApAQCAtNzUzLDE3ICs4MDksMTMgQEAKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiA9IHBnX3N0YXJ0OwogCXVuc2lnbmVkIGxvbmcgcGZuX2NudCA9IHBnX2NvdW50OwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpjdXI7CiAJc3RydWN0IGh2X2hvdGFkZF9zdGF0ZSAqaGFzOwogCXVuc2lnbmVkIGxvbmcgcGdzX29sID0gMDsKIAl1bnNpZ25lZCBsb25nIG9sZF9jb3ZlcmVkX3N0YXRlOworCXVuc2lnbmVkIGxvbmcgcmVzID0gMCwgZmxhZ3M7CiAKLQlpZiAobGlzdF9lbXB0eSgmZG1fZGV2aWNlLmhhX3JlZ2lvbl9saXN0KSkKLQkJcmV0dXJuIDA7Ci0KLQlsaXN0X2Zvcl9lYWNoKGN1ciwgJmRtX2RldmljZS5oYV9yZWdpb25fbGlzdCkgewotCQloYXMgPSBsaXN0X2VudHJ5KGN1ciwgc3RydWN0IGh2X2hvdGFkZF9zdGF0ZSwgbGlzdCk7Ci0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1fZGV2aWNlLmhhX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhhcywgJmRtX2RldmljZS5oYV9yZWdpb25fbGlzdCwgbGlzdCkgewogCQkvKgogCQkgKiBJZiB0aGUgcGZuIHJhbmdlIHdlIGFyZSBkZWFsaW5nIHdpdGggaXMgbm90IGluIHRoZSBjdXJyZW50CiAJCSAqICJob3QgYWRkIGJsb2NrIiwgbW92ZSBvbi4KQEAgLTc4Myw2ICs4MzUsOCBAQAogCQkJaWYgKHBnc19vbCA+IHBmbl9jbnQpCiAJCQkJcGdzX29sID0gcGZuX2NudDsKIAorCQkJaGFzLT5jb3ZlcmVkX2VuZF9wZm4gKz0gIHBnc19vbDsKKwkJCXBmbl9jbnQgLT0gcGdzX29sOwogCQkJLyoKIAkJCSAqIENoZWNrIGlmIHRoZSBjb3JyZXNwb25kaW5nIG1lbW9yeSBibG9jayBpcyBhbHJlYWR5CiAJCQkgKiBvbmxpbmUgYnkgY2hlY2tpbmcgaXRzIGxhc3QgcHJldmlvdXNseSBiYWNrZWQgcGFnZS4KQEAgLTc5MSwxMCArODQ1LDggQEAKIAkJCSAqLwogCQkJaWYgKHN0YXJ0X3BmbiA+IGhhcy0+c3RhcnRfcGZuICYmCiAJCQkgICAgIVBhZ2VSZXNlcnZlZChwZm5fdG9fcGFnZShzdGFydF9wZm4gLSAxKSkpCi0JCQkJaHZfYnJpbmdfcGdzX29ubGluZShzdGFydF9wZm4sIHBnc19vbCk7CisJCQkJaHZfYnJpbmdfcGdzX29ubGluZShoYXMsIHN0YXJ0X3BmbiwgcGdzX29sKTsKIAotCQkJaGFzLT5jb3ZlcmVkX2VuZF9wZm4gKz0gIHBnc19vbDsKLQkJCXBmbl9jbnQgLT0gcGdzX29sOwogCQl9CiAKIAkJaWYgKChoYXMtPmhhX2VuZF9wZm4gPCBoYXMtPmVuZF9wZm4pICYmIChwZm5fY250ID4gMCkpIHsKQEAgLTgxMywxNyArODY1LDIwIEBACiAJCQl9IGVsc2UgewogCQkJCXBmbl9jbnQgPSBzaXplOwogCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1fZGV2aWNlLmhhX2xvY2ssIGZsYWdzKTsKIAkJCWh2X21lbV9ob3RfYWRkKGhhcy0+aGFfZW5kX3Bmbiwgc2l6ZSwgcGZuX2NudCwgaGFzKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOwogCQl9CiAJCS8qCiAJCSAqIElmIHdlIG1hbmFnZWQgdG8gb25saW5lIGFueSBwYWdlcyB0aGF0IHdlcmUgZ2l2ZW4gdG8gdXMsCiAJCSAqIHdlIGRlY2xhcmUgc3VjY2Vzcy4KIAkJICovCi0JCXJldHVybiBoYXMtPmNvdmVyZWRfZW5kX3BmbiAtIG9sZF9jb3ZlcmVkX3N0YXRlOwotCisJCXJlcyA9IGhhcy0+Y292ZXJlZF9lbmRfcGZuIC0gb2xkX2NvdmVyZWRfc3RhdGU7CisJCWJyZWFrOwogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJvY2Vzc19ob3RfYWRkKHVuc2lnbmVkIGxvbmcgcGdfc3RhcnQsCkBAIC04MzIsMTMgKzg4NywyMCBAQAogCQkJCQl1bnNpZ25lZCBsb25nIHJnX3NpemUpCiB7CiAJc3RydWN0IGh2X2hvdGFkZF9zdGF0ZSAqaGFfcmVnaW9uID0gTlVMTDsKKwlpbnQgY292ZXJlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKHBmbl9jbnQgPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoIWRtX2RldmljZS5ob3N0X3NwZWNpZmllZF9oYV9yZWdpb24pCi0JCWlmIChwZm5fY292ZXJlZChwZ19zdGFydCwgcGZuX2NudCkpCisJaWYgKCFkbV9kZXZpY2UuaG9zdF9zcGVjaWZpZWRfaGFfcmVnaW9uKSB7CisJCWNvdmVyZWQgPSBwZm5fY292ZXJlZChwZ19zdGFydCwgcGZuX2NudCk7CisJCWlmIChjb3ZlcmVkIDwgMCkKKwkJCXJldHVybiAwOworCisJCWlmIChjb3ZlcmVkKQogCQkJZ290byBkb19wZ19yYW5nZTsKKwl9CiAKIAkvKgogCSAqIElmIHRoZSBob3N0IGhhcyBzcGVjaWZpZWQgYSBob3QtYWRkIHJhbmdlOyBkZWFsIHdpdGggaXQgZmlyc3QuCkBAIC04NTAsMTIgKzkxMiwxNyBAQAogCQkJcmV0dXJuIDA7CiAKIAkJSU5JVF9MSVNUX0hFQUQoJmhhX3JlZ2lvbi0+bGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZoYV9yZWdpb24tPmdhcF9saXN0KTsKIAotCQlsaXN0X2FkZF90YWlsKCZoYV9yZWdpb24tPmxpc3QsICZkbV9kZXZpY2UuaGFfcmVnaW9uX2xpc3QpOwogCQloYV9yZWdpb24tPnN0YXJ0X3BmbiA9IHJnX3N0YXJ0OwogCQloYV9yZWdpb24tPmhhX2VuZF9wZm4gPSByZ19zdGFydDsKKwkJaGFfcmVnaW9uLT5jb3ZlcmVkX3N0YXJ0X3BmbiA9IHBnX3N0YXJ0OwogCQloYV9yZWdpb24tPmNvdmVyZWRfZW5kX3BmbiA9IHBnX3N0YXJ0OwogCQloYV9yZWdpb24tPmVuZF9wZm4gPSByZ19zdGFydCArIHJnX3NpemU7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtX2RldmljZS5oYV9sb2NrLCBmbGFncyk7CisJCWxpc3RfYWRkX3RhaWwoJmhhX3JlZ2lvbi0+bGlzdCwgJmRtX2RldmljZS5oYV9yZWdpb25fbGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtX2RldmljZS5oYV9sb2NrLCBmbGFncyk7CiAJfQogCiBkb19wZ19yYW5nZToKQEAgLTg4Miw3ICs5NDksNiBAQAogCXJlc3AuaGRyLnNpemUgPSBzaXplb2Yoc3RydWN0IGRtX2hvdF9hZGRfcmVzcG9uc2UpOwogCiAjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHCi0JbXV0ZXhfbG9jaygmZG1fZGV2aWNlLmhhX3JlZ2lvbl9tdXRleCk7CiAJcGdfc3RhcnQgPSBkbS0+aGFfd3JrLmhhX3BhZ2VfcmFuZ2UuZmluZm8uc3RhcnRfcGFnZTsKIAlwZm5fY250ID0gZG0tPmhhX3dyay5oYV9wYWdlX3JhbmdlLmZpbmZvLnBhZ2VfY250OwogCkBAIC05MTYsNyArOTgyLDYgQEAKIAkJCQkJCXJnX3N0YXJ0LCByZ19zeik7CiAKIAlkbS0+bnVtX3BhZ2VzX2FkZGVkICs9IHJlc3AucGFnZV9jb3VudDsKLQltdXRleF91bmxvY2soJmRtX2RldmljZS5oYV9yZWdpb25fbXV0ZXgpOwogI2VuZGlmCiAJLyoKIAkgKiBUaGUgcmVzdWx0IGZpZWxkIG9mIHRoZSByZXNwb25zZSBzdHJ1Y3R1cmUgaGFzIHRoZQpAQCAtMTAxMCw3ICsxMDc1LDYgQEAKIHN0YXRpYyB2b2lkIHBvc3Rfc3RhdHVzKHN0cnVjdCBodl9keW5tZW1fZGV2aWNlICpkbSkKIHsKIAlzdHJ1Y3QgZG1fc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3Qgc3lzaW5mbyB2YWw7CiAJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9wb3N0ID0gbGFzdF9wb3N0X3RpbWU7CiAKQEAgLTEwMjIsNyArMTA4Niw2IEBACiAJaWYgKCF0aW1lX2FmdGVyKG5vdywgKGxhc3RfcG9zdF90aW1lICsgSFopKSkKIAkJcmV0dXJuOwogCi0Jc2lfbWVtaW5mbygmdmFsKTsKIAltZW1zZXQoJnN0YXR1cywgMCwgc2l6ZW9mKHN0cnVjdCBkbV9zdGF0dXMpKTsKIAlzdGF0dXMuaGRyLnR5cGUgPSBETV9TVEFUVVNfUkVQT1JUOwogCXN0YXR1cy5oZHIuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZG1fc3RhdHVzKTsKQEAgLTEwMzgsNyArMTEwMSw3IEBACiAJICogbnVtX3BhZ2VzX29ubGluZWQpIGFzIGNvbW1pdHRlZCB0byB0aGUgaG9zdCwgb3RoZXJ3aXNlIGl0IGNhbiB0cnkKIAkgKiBhc2tpbmcgdXMgdG8gYmFsbG9vbiB0aGVtIG91dC4KIAkgKi8KLQlzdGF0dXMubnVtX2F2YWlsID0gdmFsLmZyZWVyYW07CisJc3RhdHVzLm51bV9hdmFpbCA9IHNpX21lbV9hdmFpbGFibGUoKTsKIAlzdGF0dXMubnVtX2NvbW1pdHRlZCA9IHZtX21lbW9yeV9jb21taXR0ZWQoKSArCiAJCWRtLT5udW1fcGFnZXNfYmFsbG9vbmVkICsKIAkJKGRtLT5udW1fcGFnZXNfYWRkZWQgPiBkbS0+bnVtX3BhZ2VzX29ubGluZWQgPwpAQCAtMTE0NCw3ICsxMjA3LDcgQEAKIAlpbnQgcmV0OwogCWJvb2wgZG9uZSA9IGZhbHNlOwogCWludCBpOwotCXN0cnVjdCBzeXNpbmZvIHZhbDsKKwlsb25nIGF2YWlsX3BhZ2VzOwogCXVuc2lnbmVkIGxvbmcgZmxvb3I7CiAKIAkvKiBUaGUgaG9zdCBiYWxsb29ucyBwYWdlcyBpbiAyTSBncmFudWxhcml0eS4gKi8KQEAgLTExNTYsMTIgKzEyMTksMTIgQEAKIAkgKi8KIAlhbGxvY191bml0ID0gNTEyOwogCi0Jc2lfbWVtaW5mbygmdmFsKTsKKwlhdmFpbF9wYWdlcyA9IHNpX21lbV9hdmFpbGFibGUoKTsKIAlmbG9vciA9IGNvbXB1dGVfYmFsbG9vbl9mbG9vcigpOwogCiAJLyogUmVmdXNlIHRvIGJhbGxvb24gYmVsb3cgdGhlIGZsb29yLCBrZWVwIHRoZSAyTSBncmFudWxhcml0eS4gKi8KLQlpZiAodmFsLmZyZWVyYW0gPCBudW1fcGFnZXMgfHwgdmFsLmZyZWVyYW0gLSBudW1fcGFnZXMgPCBmbG9vcikgewotCQludW1fcGFnZXMgPSB2YWwuZnJlZXJhbSA+IGZsb29yID8gKHZhbC5mcmVlcmFtIC0gZmxvb3IpIDogMDsKKwlpZiAoYXZhaWxfcGFnZXMgPCBudW1fcGFnZXMgfHwgYXZhaWxfcGFnZXMgLSBudW1fcGFnZXMgPCBmbG9vcikgeworCQludW1fcGFnZXMgPSBhdmFpbF9wYWdlcyA+IGZsb29yID8gKGF2YWlsX3BhZ2VzIC0gZmxvb3IpIDogMDsKIAkJbnVtX3BhZ2VzIC09IG51bV9wYWdlcyAlIFBBR0VTX0lOXzJNOwogCX0KIApAQCAtMTE3Miw3ICsxMjM1LDYgQEAKIAkJYmxfcmVzcC0+aGRyLnNpemUgPSBzaXplb2Yoc3RydWN0IGRtX2JhbGxvb25fcmVzcG9uc2UpOwogCQlibF9yZXNwLT5tb3JlX3BhZ2VzID0gMTsKIAotCiAJCW51bV9wYWdlcyAtPSBudW1fYmFsbG9vbmVkOwogCQludW1fYmFsbG9vbmVkID0gYWxsb2NfYmFsbG9vbl9wYWdlcygmZG1fZGV2aWNlLCBudW1fcGFnZXMsCiAJCQkJCQkgICAgYmxfcmVzcCwgYWxsb2NfdW5pdCk7CkBAIC0xNDYxLDcgKzE1MjMsNyBAQAogCWluaXRfY29tcGxldGlvbigmZG1fZGV2aWNlLmhvc3RfZXZlbnQpOwogCWluaXRfY29tcGxldGlvbigmZG1fZGV2aWNlLmNvbmZpZ19ldmVudCk7CiAJSU5JVF9MSVNUX0hFQUQoJmRtX2RldmljZS5oYV9yZWdpb25fbGlzdCk7Ci0JbXV0ZXhfaW5pdCgmZG1fZGV2aWNlLmhhX3JlZ2lvbl9tdXRleCk7CisJc3Bpbl9sb2NrX2luaXQoJmRtX2RldmljZS5oYV9sb2NrKTsKIAlJTklUX1dPUksoJmRtX2RldmljZS5iYWxsb29uX3dyay53cmssIGJhbGxvb25fdXApOwogCUlOSVRfV09SSygmZG1fZGV2aWNlLmhhX3dyay53cmssIGhvdF9hZGRfcmVxKTsKIAlkbV9kZXZpY2UuaG9zdF9zcGVjaWZpZWRfaGFfcmVnaW9uID0gZmFsc2U7CkBAIC0xNTgwLDggKzE2NDIsOSBAQAogc3RhdGljIGludCBiYWxsb29uX3JlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGh2X2R5bm1lbV9kZXZpY2UgKmRtID0gaHZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpjdXIsICp0bXA7Ci0Jc3RydWN0IGh2X2hvdGFkZF9zdGF0ZSAqaGFzOworCXN0cnVjdCBodl9ob3RhZGRfc3RhdGUgKmhhcywgKnRtcDsKKwlzdHJ1Y3QgaHZfaG90YWRkX2dhcCAqZ2FwLCAqdG1wX2dhcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGRtLT5udW1fcGFnZXNfYmFsbG9vbmVkICE9IDApCiAJCXByX3dhcm4oIkJhbGxvb25lZCBwYWdlczogJWRcbiIsIGRtLT5udW1fcGFnZXNfYmFsbG9vbmVkKTsKQEAgLTE1OTYsMTEgKzE2NTksMTYgQEAKIAlyZXN0b3JlX29ubGluZV9wYWdlX2NhbGxiYWNrKCZodl9vbmxpbmVfcGFnZSk7CiAJdW5yZWdpc3Rlcl9tZW1vcnlfbm90aWZpZXIoJmh2X21lbW9yeV9uYik7CiAjZW5kaWYKLQlsaXN0X2Zvcl9lYWNoX3NhZmUoY3VyLCB0bXAsICZkbS0+aGFfcmVnaW9uX2xpc3QpIHsKLQkJaGFzID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBodl9ob3RhZGRfc3RhdGUsIGxpc3QpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShoYXMsIHRtcCwgJmRtLT5oYV9yZWdpb25fbGlzdCwgbGlzdCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZ2FwLCB0bXBfZ2FwLCAmaGFzLT5nYXBfbGlzdCwgbGlzdCkgeworCQkJbGlzdF9kZWwoJmdhcC0+bGlzdCk7CisJCQlrZnJlZShnYXApOworCQl9CiAJCWxpc3RfZGVsKCZoYXMtPmxpc3QpOwogCQlrZnJlZShoYXMpOwogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L2h2X2Zjb3B5LmMgYi9kcml2ZXJzL2h2L2h2X2Zjb3B5LmMKaW5kZXggMjNjNzA3OS4uOGIyYmE5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9odl9mY29weS5jCisrKyBiL2RyaXZlcnMvaHYvaHZfZmNvcHkuYwpAQCAtODMsNiArODMsMTIgQEAKIAlodl9wb2xsX2NoYW5uZWwoZmNvcHlfdHJhbnNhY3Rpb24ucmVjdl9jaGFubmVsLCBmY29weV9wb2xsX3dyYXBwZXIpOwogfQogCitzdGF0aWMgdm9pZCBmY29weV9yZWdpc3Rlcl9kb25lKHZvaWQpCit7CisJcHJfZGVidWcoIkZDUDogdXNlcnNwYWNlIGRhZW1vbiByZWdpc3RlcmVkXG4iKTsKKwlodl9wb2xsX2NoYW5uZWwoZmNvcHlfdHJhbnNhY3Rpb24ucmVjdl9jaGFubmVsLCBmY29weV9wb2xsX3dyYXBwZXIpOworfQorCiBzdGF0aWMgaW50IGZjb3B5X2hhbmRsZV9oYW5kc2hha2UodTMyIHZlcnNpb24pCiB7CiAJdTMyIG91cl92ZXIgPSBGQ09QWV9DVVJSRU5UX1ZFUlNJT047CkBAIC05NCw3ICsxMDAsOCBAQAogCQlicmVhazsKIAljYXNlIEZDT1BZX1ZFUlNJT05fMToKIAkJLyogRGFlbW9uIGV4cGVjdHMgdXMgdG8gcmVwbHkgd2l0aCBvdXIgb3duIHZlcnNpb24gKi8KLQkJaWYgKGh2dXRpbF90cmFuc3BvcnRfc2VuZChodnQsICZvdXJfdmVyLCBzaXplb2Yob3VyX3ZlcikpKQorCQlpZiAoaHZ1dGlsX3RyYW5zcG9ydF9zZW5kKGh2dCwgJm91cl92ZXIsIHNpemVvZihvdXJfdmVyKSwKKwkJICAgIGZjb3B5X3JlZ2lzdGVyX2RvbmUpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWRtX3JlZ192YWx1ZSA9IHZlcnNpb247CiAJCWJyZWFrOwpAQCAtMTA3LDggKzExNCw3IEBACiAJCSAqLwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcHJfZGVidWcoIkZDUDogdXNlcnNwYWNlIGRhZW1vbiB2ZXIuICVkIHJlZ2lzdGVyZWRcbiIsIHZlcnNpb24pOwotCWh2X3BvbGxfY2hhbm5lbChmY29weV90cmFuc2FjdGlvbi5yZWN2X2NoYW5uZWwsIGZjb3B5X3BvbGxfd3JhcHBlcik7CisJcHJfZGVidWcoIkZDUDogdXNlcnNwYWNlIGRhZW1vbiB2ZXIuICVkIGNvbm5lY3RlZFxuIiwgdmVyc2lvbik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2MSw3ICsxNjcsNyBAQAogCX0KIAogCWZjb3B5X3RyYW5zYWN0aW9uLnN0YXRlID0gSFZVVElMX1VTRVJTUEFDRV9SRVE7Ci0JcmMgPSBodnV0aWxfdHJhbnNwb3J0X3NlbmQoaHZ0LCBvdXRfc3JjLCBvdXRfbGVuKTsKKwlyYyA9IGh2dXRpbF90cmFuc3BvcnRfc2VuZChodnQsIG91dF9zcmMsIG91dF9sZW4sIE5VTEwpOwogCWlmIChyYykgewogCQlwcl9kZWJ1ZygiRkNQOiBmYWlsZWQgdG8gY29tbXVuaWNhdGUgdG8gdGhlIGRhZW1vbjogJWRcbiIsIHJjKTsKIAkJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZmNvcHlfdGltZW91dF93b3JrKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9odl9rdnAuYyBiL2RyaXZlcnMvaHYvaHZfa3ZwLmMKaW5kZXggY2IxYTkxNi4uNWUxZmRjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9odl9rdnAuYworKysgYi9kcml2ZXJzL2h2L2h2X2t2cC5jCkBAIC0xMDIsNiArMTAyLDE3IEBACiAJaHZfa3ZwX29uY2hhbm5lbGNhbGxiYWNrKGNoYW5uZWwpOwogfQogCitzdGF0aWMgdm9pZCBrdnBfcmVnaXN0ZXJfZG9uZSh2b2lkKQoreworCS8qCisJICogSWYgd2UncmUgc3RpbGwgbmVnb3RpYXRpbmcgd2l0aCB0aGUgaG9zdCBjYW5jZWwgdGhlIHRpbWVvdXQKKwkgKiB3b3JrIHRvIG5vdCBwb2xsIHRoZSBjaGFubmVsIHR3aWNlLgorCSAqLworCXByX2RlYnVnKCJLVlA6IHVzZXJzcGFjZSBkYWVtb24gcmVnaXN0ZXJlZFxuIik7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZrdnBfaG9zdF9oYW5kc2hha2Vfd29yayk7CisJaHZfcG9sbF9jaGFubmVsKGt2cF90cmFuc2FjdGlvbi5yZWN2X2NoYW5uZWwsIGt2cF9wb2xsX3dyYXBwZXIpOworfQorCiBzdGF0aWMgdm9pZAoga3ZwX3JlZ2lzdGVyKGludCByZWdfdmFsdWUpCiB7CkBAIC0xMTYsNyArMTI3LDggQEAKIAkJa3ZwX21zZy0+a3ZwX2hkci5vcGVyYXRpb24gPSByZWdfdmFsdWU7CiAJCXN0cmNweSh2ZXJzaW9uLCBIVl9EUlZfVkVSU0lPTik7CiAKLQkJaHZ1dGlsX3RyYW5zcG9ydF9zZW5kKGh2dCwga3ZwX21zZywgc2l6ZW9mKCprdnBfbXNnKSk7CisJCWh2dXRpbF90cmFuc3BvcnRfc2VuZChodnQsIGt2cF9tc2csIHNpemVvZigqa3ZwX21zZyksCisJCQkJICAgICAga3ZwX3JlZ2lzdGVyX2RvbmUpOwogCQlrZnJlZShrdnBfbXNnKTsKIAl9CiB9CkBAIC0xNTgsMTcgKzE3MCwxMCBAQAogCS8qCiAJICogV2UgaGF2ZSBhIGNvbXBhdGlibGUgZGFlbW9uOyBjb21wbGV0ZSB0aGUgaGFuZHNoYWtlLgogCSAqLwotCXByX2RlYnVnKCJLVlA6IHVzZXJzcGFjZSBkYWVtb24gdmVyLiAlZCByZWdpc3RlcmVkXG4iLAotCQkgS1ZQX09QX1JFR0lTVEVSKTsKKwlwcl9kZWJ1ZygiS1ZQOiB1c2Vyc3BhY2UgZGFlbW9uIHZlci4gJWQgY29ubmVjdGVkXG4iLAorCQkgbXNnLT5rdnBfaGRyLm9wZXJhdGlvbik7CiAJa3ZwX3JlZ2lzdGVyKGRtX3JlZ192YWx1ZSk7CiAKLQkvKgotCSAqIElmIHdlJ3JlIHN0aWxsIG5lZ290aWF0aW5nIHdpdGggdGhlIGhvc3QgY2FuY2VsIHRoZSB0aW1lb3V0Ci0JICogd29yayB0byBub3QgcG9sbCB0aGUgY2hhbm5lbCB0d2ljZS4KLQkgKi8KLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmt2cF9ob3N0X2hhbmRzaGFrZV93b3JrKTsKLQlodl9wb2xsX2NoYW5uZWwoa3ZwX3RyYW5zYWN0aW9uLnJlY3ZfY2hhbm5lbCwga3ZwX3BvbGxfd3JhcHBlcik7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDU1LDcgKzQ2MCw3IEBACiAJfQogCiAJa3ZwX3RyYW5zYWN0aW9uLnN0YXRlID0gSFZVVElMX1VTRVJTUEFDRV9SRVE7Ci0JcmMgPSBodnV0aWxfdHJhbnNwb3J0X3NlbmQoaHZ0LCBtZXNzYWdlLCBzaXplb2YoKm1lc3NhZ2UpKTsKKwlyYyA9IGh2dXRpbF90cmFuc3BvcnRfc2VuZChodnQsIG1lc3NhZ2UsIHNpemVvZigqbWVzc2FnZSksIE5VTEwpOwogCWlmIChyYykgewogCQlwcl9kZWJ1ZygiS1ZQOiBmYWlsZWQgdG8gY29tbXVuaWNhdGUgdG8gdGhlIGRhZW1vbjogJWRcbiIsIHJjKTsKIAkJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygma3ZwX3RpbWVvdXRfd29yaykpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvaHZfc25hcHNob3QuYyBiL2RyaXZlcnMvaHYvaHZfc25hcHNob3QuYwppbmRleCAzZmJhMTRlLi5hNjcwNzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L2h2X3NuYXBzaG90LmMKKysrIGIvZHJpdmVycy9odi9odl9zbmFwc2hvdC5jCkBAIC02NywxMSArNjcsMTEgQEAKIHN0YXRpYyBfX3U4ICpyZWN2X2J1ZmZlcjsKIHN0YXRpYyBzdHJ1Y3QgaHZ1dGlsX3RyYW5zcG9ydCAqaHZ0OwogCi1zdGF0aWMgdm9pZCB2c3Nfc2VuZF9vcChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmR1bW15KTsKIHN0YXRpYyB2b2lkIHZzc190aW1lb3V0X2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICpkdW1teSk7CitzdGF0aWMgdm9pZCB2c3NfaGFuZGxlX3JlcXVlc3Qoc3RydWN0IHdvcmtfc3RydWN0ICpkdW1teSk7CiAKIHN0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyh2c3NfdGltZW91dF93b3JrLCB2c3NfdGltZW91dF9mdW5jKTsKLXN0YXRpYyBERUNMQVJFX1dPUksodnNzX3NlbmRfb3Bfd29yaywgdnNzX3NlbmRfb3ApOworc3RhdGljIERFQ0xBUkVfV09SSyh2c3NfaGFuZGxlX3JlcXVlc3Rfd29yaywgdnNzX2hhbmRsZV9yZXF1ZXN0KTsKIAogc3RhdGljIHZvaWQgdnNzX3BvbGxfd3JhcHBlcih2b2lkICpjaGFubmVsKQogewpAQCAtOTUsNiArOTUsMTIgQEAKIAlodl9wb2xsX2NoYW5uZWwodnNzX3RyYW5zYWN0aW9uLnJlY3ZfY2hhbm5lbCwgdnNzX3BvbGxfd3JhcHBlcik7CiB9CiAKK3N0YXRpYyB2b2lkIHZzc19yZWdpc3Rlcl9kb25lKHZvaWQpCit7CisJaHZfcG9sbF9jaGFubmVsKHZzc190cmFuc2FjdGlvbi5yZWN2X2NoYW5uZWwsIHZzc19wb2xsX3dyYXBwZXIpOworCXByX2RlYnVnKCJWU1M6IHVzZXJzcGFjZSBkYWVtb24gcmVnaXN0ZXJlZFxuIik7Cit9CisKIHN0YXRpYyBpbnQgdnNzX2hhbmRsZV9oYW5kc2hha2Uoc3RydWN0IGh2X3Zzc19tc2cgKnZzc19tc2cpCiB7CiAJdTMyIG91cl92ZXIgPSBWU1NfT1BfUkVHSVNURVIxOwpAQCAtMTA1LDE2ICsxMTEsMTYgQEAKIAkJZG1fcmVnX3ZhbHVlID0gVlNTX09QX1JFR0lTVEVSOwogCQlicmVhazsKIAljYXNlIFZTU19PUF9SRUdJU1RFUjE6Ci0JCS8qIERhZW1vbiBleHBlY3RzIHVzIHRvIHJlcGx5IHdpdGggb3VyIG93biB2ZXJzaW9uKi8KLQkJaWYgKGh2dXRpbF90cmFuc3BvcnRfc2VuZChodnQsICZvdXJfdmVyLCBzaXplb2Yob3VyX3ZlcikpKQorCQkvKiBEYWVtb24gZXhwZWN0cyB1cyB0byByZXBseSB3aXRoIG91ciBvd24gdmVyc2lvbiAqLworCQlpZiAoaHZ1dGlsX3RyYW5zcG9ydF9zZW5kKGh2dCwgJm91cl92ZXIsIHNpemVvZihvdXJfdmVyKSwKKwkJCQkJICB2c3NfcmVnaXN0ZXJfZG9uZSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJZG1fcmVnX3ZhbHVlID0gVlNTX09QX1JFR0lTVEVSMTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWh2X3BvbGxfY2hhbm5lbCh2c3NfdHJhbnNhY3Rpb24ucmVjdl9jaGFubmVsLCB2c3NfcG9sbF93cmFwcGVyKTsKLQlwcl9kZWJ1ZygiVlNTOiB1c2Vyc3BhY2UgZGFlbW9uIHZlci4gJWQgcmVnaXN0ZXJlZFxuIiwgZG1fcmVnX3ZhbHVlKTsKKwlwcl9kZWJ1ZygiVlNTOiB1c2Vyc3BhY2UgZGFlbW9uIHZlci4gJWQgY29ubmVjdGVkXG4iLCBkbV9yZWdfdmFsdWUpOwogCXJldHVybiAwOwogfQogCkBAIC0xMzYsNiArMTQyLDExIEBACiAJCXJldHVybiB2c3NfaGFuZGxlX2hhbmRzaGFrZSh2c3NfbXNnKTsKIAl9IGVsc2UgaWYgKHZzc190cmFuc2FjdGlvbi5zdGF0ZSA9PSBIVlVUSUxfVVNFUlNQQUNFX1JFUSkgewogCQl2c3NfdHJhbnNhY3Rpb24uc3RhdGUgPSBIVlVUSUxfVVNFUlNQQUNFX1JFQ1Y7CisKKwkJaWYgKHZzc19tc2ctPnZzc19oZHIub3BlcmF0aW9uID09IFZTU19PUF9IT1RfQkFDS1VQKQorCQkJdnNzX3RyYW5zYWN0aW9uLm1zZy0+dnNzX2NmLmZsYWdzID0KKwkJCQlWU1NfSEJVX05PX0FVVE9fUkVDT1ZFUlk7CisKIAkJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdnNzX3RpbWVvdXRfd29yaykpIHsKIAkJCXZzc19yZXNwb25kX3RvX2hvc3QodnNzX21zZy0+ZXJyb3IpOwogCQkJLyogVHJhbnNhY3Rpb24gaXMgZmluaXNoZWQsIHJlc2V0IHRoZSBzdGF0ZS4gKi8KQEAgLTE1MCw4ICsxNjEsNyBAQAogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyB2b2lkIHZzc19zZW5kX29wKHN0cnVjdCB3b3JrX3N0cnVjdCAqZHVtbXkpCitzdGF0aWMgdm9pZCB2c3Nfc2VuZF9vcCh2b2lkKQogewogCWludCBvcCA9IHZzc190cmFuc2FjdGlvbi5tc2ctPnZzc19oZHIub3BlcmF0aW9uOwogCWludCByYzsKQEAgLTE2OCw3ICsxNzgsMTAgQEAKIAl2c3NfbXNnLT52c3NfaGRyLm9wZXJhdGlvbiA9IG9wOwogCiAJdnNzX3RyYW5zYWN0aW9uLnN0YXRlID0gSFZVVElMX1VTRVJTUEFDRV9SRVE7Ci0JcmMgPSBodnV0aWxfdHJhbnNwb3J0X3NlbmQoaHZ0LCB2c3NfbXNnLCBzaXplb2YoKnZzc19tc2cpKTsKKworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdnNzX3RpbWVvdXRfd29yaywgVlNTX1VTRVJTUEFDRV9USU1FT1VUKTsKKworCXJjID0gaHZ1dGlsX3RyYW5zcG9ydF9zZW5kKGh2dCwgdnNzX21zZywgc2l6ZW9mKCp2c3NfbXNnKSwgTlVMTCk7CiAJaWYgKHJjKSB7CiAJCXByX3dhcm4oIlZTUzogZmFpbGVkIHRvIGNvbW11bmljYXRlIHRvIHRoZSBkYWVtb246ICVkXG4iLCByYyk7CiAJCWlmIChjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnZzc190aW1lb3V0X3dvcmspKSB7CkBAIC0xODIsNiArMTk1LDM4IEBACiAJcmV0dXJuOwogfQogCitzdGF0aWMgdm9pZCB2c3NfaGFuZGxlX3JlcXVlc3Qoc3RydWN0IHdvcmtfc3RydWN0ICpkdW1teSkKK3sKKwlzd2l0Y2ggKHZzc190cmFuc2FjdGlvbi5tc2ctPnZzc19oZHIub3BlcmF0aW9uKSB7CisJLyoKKwkgKiBJbml0aWF0ZSBhICJmcmVlemUvdGhhdyIgb3BlcmF0aW9uIGluIHRoZSBndWVzdC4KKwkgKiBXZSByZXNwb25kIHRvIHRoZSBob3N0IG9uY2UgdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4KKwkgKgorCSAqIFdlIHNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIHVzZXIgc3BhY2UgZGFlbW9uIGFuZCB0aGUgb3BlcmF0aW9uIGlzCisJICogcGVyZm9ybWVkIGluIHRoZSBkYWVtb24uCisJICovCisJY2FzZSBWU1NfT1BfVEhBVzoKKwljYXNlIFZTU19PUF9GUkVFWkU6CisJY2FzZSBWU1NfT1BfSE9UX0JBQ0tVUDoKKwkJaWYgKHZzc190cmFuc2FjdGlvbi5zdGF0ZSA8IEhWVVRJTF9SRUFEWSkgeworCQkJLyogVXNlcnNwYWNlIGlzIG5vdCByZWdpc3RlcmVkIHlldCAqLworCQkJdnNzX3Jlc3BvbmRfdG9faG9zdChIVl9FX0ZBSUwpOworCQkJcmV0dXJuOworCQl9CisJCXZzc190cmFuc2FjdGlvbi5zdGF0ZSA9IEhWVVRJTF9IT1NUTVNHX1JFQ0VJVkVEOworCQl2c3Nfc2VuZF9vcCgpOworCQlyZXR1cm47CisJY2FzZSBWU1NfT1BfR0VUX0RNX0lORk86CisJCXZzc190cmFuc2FjdGlvbi5tc2ctPmRtX2luZm8uZmxhZ3MgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwl2c3NfcmVzcG9uZF90b19ob3N0KDApOworCWh2X3BvbGxfY2hhbm5lbCh2c3NfdHJhbnNhY3Rpb24ucmVjdl9jaGFubmVsLCB2c3NfcG9sbF93cmFwcGVyKTsKK30KKwogLyoKICAqIFNlbmQgYSByZXNwb25zZSBiYWNrIHRvIHRoZSBob3N0LgogICovCkBAIC0yNjYsNDggKzMxMSw4IEBACiAJCQl2c3NfdHJhbnNhY3Rpb24ucmVjdl9yZXFfaWQgPSByZXF1ZXN0aWQ7CiAJCQl2c3NfdHJhbnNhY3Rpb24ubXNnID0gKHN0cnVjdCBodl92c3NfbXNnICopdnNzX21zZzsKIAotCQkJc3dpdGNoICh2c3NfbXNnLT52c3NfaGRyLm9wZXJhdGlvbikgewotCQkJCS8qCi0JCQkJICogSW5pdGlhdGUgYSAiZnJlZXplL3RoYXciCi0JCQkJICogb3BlcmF0aW9uIGluIHRoZSBndWVzdC4KLQkJCQkgKiBXZSByZXNwb25kIHRvIHRoZSBob3N0IG9uY2UKLQkJCQkgKiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLgotCQkJCSAqCi0JCQkJICogV2Ugc2VuZCB0aGUgbWVzc2FnZSB0byB0aGUKLQkJCQkgKiB1c2VyIHNwYWNlIGRhZW1vbiBhbmQgdGhlCi0JCQkJICogb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBpbgotCQkJCSAqIHRoZSBkYWVtb24uCi0JCQkJICovCi0JCQljYXNlIFZTU19PUF9GUkVFWkU6Ci0JCQljYXNlIFZTU19PUF9USEFXOgotCQkJCWlmICh2c3NfdHJhbnNhY3Rpb24uc3RhdGUgPCBIVlVUSUxfUkVBRFkpIHsKLQkJCQkJLyogVXNlcnNwYWNlIGlzIG5vdCByZWdpc3RlcmVkIHlldCAqLwotCQkJCQl2c3NfcmVzcG9uZF90b19ob3N0KEhWX0VfRkFJTCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdnNzX3RyYW5zYWN0aW9uLnN0YXRlID0gSFZVVElMX0hPU1RNU0dfUkVDRUlWRUQ7Ci0JCQkJc2NoZWR1bGVfd29yaygmdnNzX3NlbmRfb3Bfd29yayk7Ci0JCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ2c3NfdGltZW91dF93b3JrLAotCQkJCQkJICAgICAgVlNTX1VTRVJTUEFDRV9USU1FT1VUKTsKLQkJCQlyZXR1cm47Ci0KLQkJCWNhc2UgVlNTX09QX0hPVF9CQUNLVVA6Ci0JCQkJdnNzX21zZy0+dnNzX2NmLmZsYWdzID0KLQkJCQkJIFZTU19IQlVfTk9fQVVUT19SRUNPVkVSWTsKLQkJCQl2c3NfcmVzcG9uZF90b19ob3N0KDApOwotCQkJCXJldHVybjsKLQotCQkJY2FzZSBWU1NfT1BfR0VUX0RNX0lORk86Ci0JCQkJdnNzX21zZy0+ZG1faW5mby5mbGFncyA9IDA7Ci0JCQkJdnNzX3Jlc3BvbmRfdG9faG9zdCgwKTsKLQkJCQlyZXR1cm47Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJdnNzX3Jlc3BvbmRfdG9faG9zdCgwKTsKLQkJCQlyZXR1cm47Ci0KLQkJCX0KLQorCQkJc2NoZWR1bGVfd29yaygmdnNzX2hhbmRsZV9yZXF1ZXN0X3dvcmspOworCQkJcmV0dXJuOwogCQl9CiAKIAkJaWNtc2doZHJwLT5pY2ZsYWdzID0gSUNNU0dIRFJGTEFHX1RSQU5TQUNUSU9OCkBAIC0zNTgsNiArMzYzLDYgQEAKIHsKIAl2c3NfdHJhbnNhY3Rpb24uc3RhdGUgPSBIVlVUSUxfREVWSUNFX0RZSU5HOwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdnNzX3RpbWVvdXRfd29yayk7Ci0JY2FuY2VsX3dvcmtfc3luYygmdnNzX3NlbmRfb3Bfd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmdnNzX2hhbmRsZV9yZXF1ZXN0X3dvcmspOwogCWh2dXRpbF90cmFuc3BvcnRfZGVzdHJveShodnQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9odl91dGlsLmMgYi9kcml2ZXJzL2h2L2h2X3V0aWwuYwppbmRleCBkNWFjYWEyLi40YWEzY2I2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L2h2X3V0aWwuYworKysgYi9kcml2ZXJzL2h2L2h2X3V0aWwuYwpAQCAtMzQsMjIgKzM0LDI1IEBACiAjZGVmaW5lIFNEX01JTk9SCTAKICNkZWZpbmUgU0RfVkVSU0lPTgkoU0RfTUFKT1IgPDwgMTYgfCBTRF9NSU5PUikKIAotI2RlZmluZSBTRF9XUzIwMDhfTUFKT1IJCTEKLSNkZWZpbmUgU0RfV1MyMDA4X1ZFUlNJT04JKFNEX1dTMjAwOF9NQUpPUiA8PCAxNiB8IFNEX01JTk9SKQorI2RlZmluZSBTRF9NQUpPUl8xCTEKKyNkZWZpbmUgU0RfVkVSU0lPTl8xCShTRF9NQUpPUl8xIDw8IDE2IHwgU0RfTUlOT1IpCiAKLSNkZWZpbmUgVFNfTUFKT1IJMworI2RlZmluZSBUU19NQUpPUgk0CiAjZGVmaW5lIFRTX01JTk9SCTAKICNkZWZpbmUgVFNfVkVSU0lPTgkoVFNfTUFKT1IgPDwgMTYgfCBUU19NSU5PUikKIAotI2RlZmluZSBUU19XUzIwMDhfTUFKT1IJCTEKLSNkZWZpbmUgVFNfV1MyMDA4X1ZFUlNJT04JKFRTX1dTMjAwOF9NQUpPUiA8PCAxNiB8IFRTX01JTk9SKQorI2RlZmluZSBUU19NQUpPUl8xCTEKKyNkZWZpbmUgVFNfVkVSU0lPTl8xCShUU19NQUpPUl8xIDw8IDE2IHwgVFNfTUlOT1IpCisKKyNkZWZpbmUgVFNfTUFKT1JfMwkzCisjZGVmaW5lIFRTX1ZFUlNJT05fMwkoVFNfTUFKT1JfMyA8PCAxNiB8IFRTX01JTk9SKQogCiAjZGVmaW5lIEhCX01BSk9SCTMKLSNkZWZpbmUgSEJfTUlOT1IgMAorI2RlZmluZSBIQl9NSU5PUgkwCiAjZGVmaW5lIEhCX1ZFUlNJT04JKEhCX01BSk9SIDw8IDE2IHwgSEJfTUlOT1IpCiAKLSNkZWZpbmUgSEJfV1MyMDA4X01BSk9SCTEKLSNkZWZpbmUgSEJfV1MyMDA4X1ZFUlNJT04JKEhCX1dTMjAwOF9NQUpPUiA8PCAxNiB8IEhCX01JTk9SKQorI2RlZmluZSBIQl9NQUpPUl8xCTEKKyNkZWZpbmUgSEJfVkVSU0lPTl8xCShIQl9NQUpPUl8xIDw8IDE2IHwgSEJfTUlOT1IpCiAKIHN0YXRpYyBpbnQgc2Rfc3J2X3ZlcnNpb247CiBzdGF0aWMgaW50IHRzX3Nydl92ZXJzaW9uOwpAQCAtNjEsOSArNjQsMTQgQEAKIAkudXRpbF9jYiA9IHNodXRkb3duX29uY2hhbm5lbGNhbGxiYWNrLAogfTsKIAorc3RhdGljIGludCBodl90aW1lc3luY19pbml0KHN0cnVjdCBodl91dGlsX3NlcnZpY2UgKnNydik7CitzdGF0aWMgdm9pZCBodl90aW1lc3luY19kZWluaXQodm9pZCk7CisKIHN0YXRpYyB2b2lkIHRpbWVzeW5jX29uY2hhbm5lbGNhbGxiYWNrKHZvaWQgKmNvbnRleHQpOwogc3RhdGljIHN0cnVjdCBodl91dGlsX3NlcnZpY2UgdXRpbF90aW1lc3luY2ggPSB7CiAJLnV0aWxfY2IgPSB0aW1lc3luY19vbmNoYW5uZWxjYWxsYmFjaywKKwkudXRpbF9pbml0ID0gaHZfdGltZXN5bmNfaW5pdCwKKwkudXRpbF9kZWluaXQgPSBodl90aW1lc3luY19kZWluaXQsCiB9OwogCiBzdGF0aWMgdm9pZCBoZWFydGJlYXRfb25jaGFubmVsY2FsbGJhY2sodm9pZCAqY29udGV4dCk7CkBAIC0xNjEsMzUgKzE2OSw0MyBAQAogfQogCiAvKgotICogU2V0IGd1ZXN0IHRpbWUgdG8gaG9zdCBVVEMgdGltZS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGRvX2Fkal9ndWVzdHRpbWUodTY0IGhvc3R0aW1lKQotewotCXM2NCBob3N0X3RuczsKLQlzdHJ1Y3QgdGltZXNwZWMgaG9zdF90czsKLQotCWhvc3RfdG5zID0gKGhvc3R0aW1lIC0gV0xUSU1FREVMVEEpICogMTAwOwotCWhvc3RfdHMgPSBuc190b190aW1lc3BlYyhob3N0X3Rucyk7Ci0KLQlkb19zZXR0aW1lb2ZkYXkoJmhvc3RfdHMpOwotfQotCi0vKgogICogU2V0IHRoZSBob3N0IHRpbWUgaW4gYSBwcm9jZXNzIGNvbnRleHQuCiAgKi8KIAogc3RydWN0IGFkal90aW1lX3dvcmsgewogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXU2NAlob3N0X3RpbWU7CisJdTY0CXJlZl90aW1lOworCXU4CWZsYWdzOwogfTsKIAogc3RhdGljIHZvaWQgaHZfc2V0X2hvc3RfdGltZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGFkal90aW1lX3dvcmsJKndyazsKKwlzNjQgaG9zdF90bnM7CisJdTY0IG5ld3RpbWU7CisJc3RydWN0IHRpbWVzcGVjIGhvc3RfdHM7CiAKIAl3cmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFkal90aW1lX3dvcmssIHdvcmspOwotCWRvX2Fkal9ndWVzdHRpbWUod3JrLT5ob3N0X3RpbWUpOwotCWtmcmVlKHdyayk7CisKKwluZXd0aW1lID0gd3JrLT5ob3N0X3RpbWU7CisJaWYgKHRzX3Nydl92ZXJzaW9uID4gVFNfVkVSU0lPTl8zKSB7CisJCS8qCisJCSAqIFNvbWUgbGF0ZW5jeSBoYXMgYmVlbiBpbnRyb2R1Y2VkIHNpbmNlIEh5cGVyLVYgZ2VuZXJhdGVkCisJCSAqIGl0cyB0aW1lIHNhbXBsZS4gVGFrZSB0aGF0IGxhdGVuY3kgaW50byBhY2NvdW50IGJlZm9yZQorCQkgKiB1c2luZyBUU0MgcmVmZXJlbmNlIHRpbWUgc2FtcGxlIGZyb20gSHlwZXItVi4KKwkJICoKKwkJICogVGhpcyBzYW1wbGUgaXMgZ2l2ZW4gYnkgVGltZVN5bmMgdjQgYW5kIGFib3ZlIGhvc3RzLgorCQkgKi8KKwkJdTY0IGN1cnJlbnRfdGljazsKKworCQlyZG1zcmwoSFZfWDY0X01TUl9USU1FX1JFRl9DT1VOVCwgY3VycmVudF90aWNrKTsKKwkJbmV3dGltZSArPSAoY3VycmVudF90aWNrIC0gd3JrLT5yZWZfdGltZSk7CisJfQorCWhvc3RfdG5zID0gKG5ld3RpbWUgLSBXTFRJTUVERUxUQSkgKiAxMDA7CisJaG9zdF90cyA9IG5zX3RvX3RpbWVzcGVjKGhvc3RfdG5zKTsKKworCWRvX3NldHRpbWVvZmRheSgmaG9zdF90cyk7CiB9CiAKIC8qCkBAIC0xOTgsMzMgKzIxNCwzMSBAQAogICogSUNUSU1FU1lOQ0ZMQUdfU1lOQyBmbGFnIGJpdCBpbmRpY2F0ZXMgcmVib290LCByZXN0b3JlIGV2ZW50cyBvZiB0aGUgVk0uCiAgKiBBZnRlciByZWJvb3QgdGhlIGZsYWcgSUNUSU1FU1lOQ0ZMQUdfU1lOQyBpcyBpbmNsdWRlZCBpbiB0aGUgZmlyc3QgdGltZQogICogbWVzc2FnZSBhZnRlciB0aGUgdGltZXN5bmMgY2hhbm5lbCBpcyBvcGVuZWQuIFNpbmNlIHRoZSBodl91dGlscyBtb2R1bGUgaXMKLSAqIGxvYWRlZCBhZnRlciBodl92bWJ1cywgdGhlIGZpcnN0IG1lc3NhZ2UgaXMgdXN1YWxseSBtaXNzZWQuIFRoZSBvdGhlcgotICogdGhpbmcgaXMsIHN5c3RpbWUgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gZW11bGF0ZWQgaGFyZHdhcmUgY2xvY2sgd2hpY2ggbWF5Ci0gKiBub3QgYmUgVVRDIHRpbWUgb3IgaW4gdGhlIHNhbWUgdGltZSB6b25lLiBTbywgdG8gb3ZlcnJpZGUgdGhlc2UgZWZmZWN0cywgd2UKLSAqIHVzZSB0aGUgZmlyc3QgNTAgdGltZSBzYW1wbGVzIGZvciBpbml0aWFsIHN5c3RlbSB0aW1lIHNldHRpbmcuCisgKiBsb2FkZWQgYWZ0ZXIgaHZfdm1idXMsIHRoZSBmaXJzdCBtZXNzYWdlIGlzIHVzdWFsbHkgbWlzc2VkLiBUaGlzIGJpdCBpcworICogY29uc2lkZXJlZCBhIGhhcmQgcmVxdWVzdCB0byBkaXNjaXBsaW5lIHRoZSBjbG9jay4KKyAqCisgKiBJQ1RJTUVTWU5DRkxBR19TQU1QTEUgYml0IGluZGljYXRlcyBhIHRpbWUgc2FtcGxlIGZyb20gaG9zdC4gVGhpcyBpcworICogdHlwaWNhbGx5IHVzZWQgYXMgYSBoaW50IHRvIHRoZSBndWVzdC4gVGhlIGd1ZXN0IGlzIHVuZGVyIG5vIG9ibGlnYXRpb24KKyAqIHRvIGRpc2NpcGxpbmUgdGhlIGNsb2NrLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRqX2d1ZXN0dGltZSh1NjQgaG9zdHRpbWUsIHU4IGZsYWdzKQorc3RhdGljIHN0cnVjdCBhZGpfdGltZV93b3JrICB3cms7CitzdGF0aWMgaW5saW5lIHZvaWQgYWRqX2d1ZXN0dGltZSh1NjQgaG9zdHRpbWUsIHU2NCByZWZ0aW1lLCB1OCBmbGFncykKIHsKLQlzdHJ1Y3QgYWRqX3RpbWVfd29yayAgICAqd3JrOwotCXN0YXRpYyBzMzIgc2NudCA9IDUwOwogCi0Jd3JrID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFkal90aW1lX3dvcmspLCBHRlBfQVRPTUlDKTsKLQlpZiAod3JrID09IE5VTEwpCisJLyoKKwkgKiBUaGlzIGNoZWNrIGlzIHNhZmUgc2luY2Ugd2UgYXJlIGV4ZWN1dGluZyBpbiB0aGUKKwkgKiBpbnRlcnJ1cHQgY29udGV4dCBhbmQgdGltZSBzeW5jaCBtZXNzYWdlcyBhcnJlIGFsd2F5cworCSAqIGRlbGl2ZXJlZCBvbiB0aGUgc2FtZSBDUFUuCisJICovCisJaWYgKHdvcmtfcGVuZGluZygmd3JrLndvcmspKQogCQlyZXR1cm47CiAKLQl3cmstPmhvc3RfdGltZSA9IGhvc3R0aW1lOwotCWlmICgoZmxhZ3MgJiBJQ1RJTUVTWU5DRkxBR19TWU5DKSAhPSAwKSB7Ci0JCUlOSVRfV09SSygmd3JrLT53b3JrLCBodl9zZXRfaG9zdF90aW1lKTsKLQkJc2NoZWR1bGVfd29yaygmd3JrLT53b3JrKTsKLQkJcmV0dXJuOworCXdyay5ob3N0X3RpbWUgPSBob3N0dGltZTsKKwl3cmsucmVmX3RpbWUgPSByZWZ0aW1lOworCXdyay5mbGFncyA9IGZsYWdzOworCWlmICgoZmxhZ3MgJiAoSUNUSU1FU1lOQ0ZMQUdfU1lOQyB8IElDVElNRVNZTkNGTEFHX1NBTVBMRSkpICE9IDApIHsKKwkJc2NoZWR1bGVfd29yaygmd3JrLndvcmspOwogCX0KLQotCWlmICgoZmxhZ3MgJiBJQ1RJTUVTWU5DRkxBR19TQU1QTEUpICE9IDAgJiYgc2NudCA+IDApIHsKLQkJc2NudC0tOwotCQlJTklUX1dPUksoJndyay0+d29yaywgaHZfc2V0X2hvc3RfdGltZSk7Ci0JCXNjaGVkdWxlX3dvcmsoJndyay0+d29yayk7Ci0JfSBlbHNlCi0JCWtmcmVlKHdyayk7CiB9CiAKIC8qCkBAIC0yMzcsNiArMjUxLDcgQEAKIAl1NjQgcmVxdWVzdGlkOwogCXN0cnVjdCBpY21zZ19oZHIgKmljbXNnaGRycDsKIAlzdHJ1Y3QgaWN0aW1lc3luY19kYXRhICp0aW1lZGF0YXA7CisJc3RydWN0IGljdGltZXN5bmNfcmVmX2RhdGEgKnJlZmRhdGE7CiAJdTggKnRpbWVfdHhmX2J1ZiA9IHV0aWxfdGltZXN5bmNoLnJlY3ZfYnVmZmVyOwogCXN0cnVjdCBpY21zZ19uZWdvdGlhdGUgKm5lZ29wID0gTlVMTDsKIApAQCAtMjUyLDExICsyNjcsMjcgQEAKIAkJCQkJCXRpbWVfdHhmX2J1ZiwKIAkJCQkJCXV0aWxfZndfdmVyc2lvbiwKIAkJCQkJCXRzX3Nydl92ZXJzaW9uKTsKKwkJCXByX2luZm8oIlVzaW5nIFRpbWVTeW5jIHZlcnNpb24gJWQuJWRcbiIsCisJCQkJdHNfc3J2X3ZlcnNpb24gPj4gMTYsIHRzX3Nydl92ZXJzaW9uICYgMHhGRkZGKTsKIAkJfSBlbHNlIHsKLQkJCXRpbWVkYXRhcCA9IChzdHJ1Y3QgaWN0aW1lc3luY19kYXRhICopJnRpbWVfdHhmX2J1ZlsKLQkJCQlzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpICsKLQkJCQlzaXplb2Yoc3RydWN0IGljbXNnX2hkcildOwotCQkJYWRqX2d1ZXN0dGltZSh0aW1lZGF0YXAtPnBhcmVudHRpbWUsIHRpbWVkYXRhcC0+ZmxhZ3MpOworCQkJaWYgKHRzX3Nydl92ZXJzaW9uID4gVFNfVkVSU0lPTl8zKSB7CisJCQkJcmVmZGF0YSA9IChzdHJ1Y3QgaWN0aW1lc3luY19yZWZfZGF0YSAqKQorCQkJCQkmdGltZV90eGZfYnVmWworCQkJCQlzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpICsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpY21zZ19oZHIpXTsKKworCQkJCWFkal9ndWVzdHRpbWUocmVmZGF0YS0+cGFyZW50dGltZSwKKwkJCQkJCXJlZmRhdGEtPnZtcmVmZXJlbmNldGltZSwKKwkJCQkJCXJlZmRhdGEtPmZsYWdzKTsKKwkJCX0gZWxzZSB7CisJCQkJdGltZWRhdGFwID0gKHN0cnVjdCBpY3RpbWVzeW5jX2RhdGEgKikKKwkJCQkJJnRpbWVfdHhmX2J1ZlsKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2bWJ1c3BpcGVfaGRyKSArCisJCQkJCXNpemVvZihzdHJ1Y3QgaWNtc2dfaGRyKV07CisJCQkJYWRqX2d1ZXN0dGltZSh0aW1lZGF0YXAtPnBhcmVudHRpbWUsCisJCQkJCQkwLAorCQkJCQkJdGltZWRhdGFwLT5mbGFncyk7CisJCQl9CiAJCX0KIAogCQlpY21zZ2hkcnAtPmljZmxhZ3MgPSBJQ01TR0hEUkZMQUdfVFJBTlNBQ1RJT04KQEAgLTM1MCwxNiArMzgxLDIxIEBACiAJc3dpdGNoICh2bWJ1c19wcm90b192ZXJzaW9uKSB7CiAJY2FzZSAoVkVSU0lPTl9XUzIwMDgpOgogCQl1dGlsX2Z3X3ZlcnNpb24gPSBVVElMX1dTMks4X0ZXX1ZFUlNJT047Ci0JCXNkX3Nydl92ZXJzaW9uID0gU0RfV1MyMDA4X1ZFUlNJT047Ci0JCXRzX3Nydl92ZXJzaW9uID0gVFNfV1MyMDA4X1ZFUlNJT047Ci0JCWhiX3Nydl92ZXJzaW9uID0gSEJfV1MyMDA4X1ZFUlNJT047CisJCXNkX3Nydl92ZXJzaW9uID0gU0RfVkVSU0lPTl8xOworCQl0c19zcnZfdmVyc2lvbiA9IFRTX1ZFUlNJT05fMTsKKwkJaGJfc3J2X3ZlcnNpb24gPSBIQl9WRVJTSU9OXzE7CiAJCWJyZWFrOwotCi0JZGVmYXVsdDoKKwljYXNlKFZFUlNJT05fV0lOMTApOgogCQl1dGlsX2Z3X3ZlcnNpb24gPSBVVElMX0ZXX1ZFUlNJT047CiAJCXNkX3Nydl92ZXJzaW9uID0gU0RfVkVSU0lPTjsKIAkJdHNfc3J2X3ZlcnNpb24gPSBUU19WRVJTSU9OOwogCQloYl9zcnZfdmVyc2lvbiA9IEhCX1ZFUlNJT047CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXV0aWxfZndfdmVyc2lvbiA9IFVUSUxfRldfVkVSU0lPTjsKKwkJc2Rfc3J2X3ZlcnNpb24gPSBTRF9WRVJTSU9OOworCQl0c19zcnZfdmVyc2lvbiA9IFRTX1ZFUlNJT05fMzsKKwkJaGJfc3J2X3ZlcnNpb24gPSBIQl9WRVJTSU9OOwogCX0KIAogCXJldCA9IHZtYnVzX29wZW4oZGV2LT5jaGFubmVsLCA0ICogUEFHRV9TSVpFLCA0ICogUEFHRV9TSVpFLCBOVUxMLCAwLApAQCAtNDI3LDYgKzQ2MywxNyBAQAogCS5yZW1vdmUgPSAgdXRpbF9yZW1vdmUsCiB9OwogCitzdGF0aWMgaW50IGh2X3RpbWVzeW5jX2luaXQoc3RydWN0IGh2X3V0aWxfc2VydmljZSAqc3J2KQoreworCUlOSVRfV09SSygmd3JrLndvcmssIGh2X3NldF9ob3N0X3RpbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBodl90aW1lc3luY19kZWluaXQodm9pZCkKK3sKKwljYW5jZWxfd29ya19zeW5jKCZ3cmsud29yayk7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfaHlwZXJ2X3V0aWxzKHZvaWQpCiB7CiAJcHJfaW5mbygiUmVnaXN0ZXJpbmcgSHlwZXJWIFV0aWxpdHkgRHJpdmVyXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvaHZfdXRpbHNfdHJhbnNwb3J0LmMgYi9kcml2ZXJzL2h2L2h2X3V0aWxzX3RyYW5zcG9ydC5jCmluZGV4IDlhOTk4M2YuLmMyMzVhOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHYvaHZfdXRpbHNfdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy9odi9odl91dGlsc190cmFuc3BvcnQuYwpAQCAtNzIsNiArNzIsMTAgQEAKIAlodnQtPm91dG1zZyA9IE5VTEw7CiAJaHZ0LT5vdXRtc2dfbGVuID0gMDsKIAorCWlmIChodnQtPm9uX3JlYWQpCisJCWh2dC0+b25fcmVhZCgpOworCWh2dC0+b25fcmVhZCA9IE5VTEw7CisKIG91dF91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZodnQtPmxvY2spOwogCXJldHVybiByZXQ7CkBAIC0yMTksNyArMjIzLDggQEAKIAltdXRleF91bmxvY2soJmh2dC0+bG9jayk7CiB9CiAKLWludCBodnV0aWxfdHJhbnNwb3J0X3NlbmQoc3RydWN0IGh2dXRpbF90cmFuc3BvcnQgKmh2dCwgdm9pZCAqbXNnLCBpbnQgbGVuKQoraW50IGh2dXRpbF90cmFuc3BvcnRfc2VuZChzdHJ1Y3QgaHZ1dGlsX3RyYW5zcG9ydCAqaHZ0LCB2b2lkICptc2csIGludCBsZW4sCisJCQkgIHZvaWQgKCpvbl9yZWFkX2NiKSh2b2lkKSkKIHsKIAlzdHJ1Y3QgY25fbXNnICpjbl9tc2c7CiAJaW50IHJldCA9IDA7CkBAIC0yMzcsNiArMjQyLDEzIEBACiAJCW1lbWNweShjbl9tc2ctPmRhdGEsIG1zZywgbGVuKTsKIAkJcmV0ID0gY25fbmV0bGlua19zZW5kKGNuX21zZywgMCwgMCwgR0ZQX0FUT01JQyk7CiAJCWtmcmVlKGNuX21zZyk7CisJCS8qCisJCSAqIFdlIGRvbid0IGtub3cgd2hlbiBuZXRsaW5rIG1lc3NhZ2VzIGFyZSBkZWxpdmVyZWQgYnV0IHVubGlrZQorCQkgKiBpbiBDSEFSREVWIG1vZGUgd2UncmUgbm90IGJsb2NrZWQgYW5kIHdlIGNhbiBzZW5kIG5leHQKKwkJICogbWVzc2FnZXMgcmlnaHQgYXdheS4KKwkJICovCisJCWlmIChvbl9yZWFkX2NiKQorCQkJb25fcmVhZF9jYigpOwogCQlyZXR1cm4gcmV0OwogCX0KIAkvKiBIVlVUSUxfVFJBTlNQT1JUX0NIQVJERVYgKi8KQEAgLTI1NSw2ICsyNjcsNyBAQAogCWlmIChodnQtPm91dG1zZykgewogCQltZW1jcHkoaHZ0LT5vdXRtc2csIG1zZywgbGVuKTsKIAkJaHZ0LT5vdXRtc2dfbGVuID0gbGVuOworCQlodnQtPm9uX3JlYWQgPSBvbl9yZWFkX2NiOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmh2dC0+b3V0bXNnX3EpOwogCX0gZWxzZQogCQlyZXQgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9odl91dGlsc190cmFuc3BvcnQuaCBiL2RyaXZlcnMvaHYvaHZfdXRpbHNfdHJhbnNwb3J0LmgKaW5kZXggMDYyNTRhMS4uZDk4ZjUyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9odl91dGlsc190cmFuc3BvcnQuaAorKysgYi9kcml2ZXJzL2h2L2h2X3V0aWxzX3RyYW5zcG9ydC5oCkBAIC0zNiw2ICszNiw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAgICAgICAgICAgICAgLyogaHZ0X2xpc3QgKi8KIAlpbnQgKCpvbl9tc2cpKHZvaWQgKiwgaW50KTsgICAgICAgICAvKiBjYWxsYmFjayBvbiBuZXcgdXNlciBtZXNzYWdlICovCiAJdm9pZCAoKm9uX3Jlc2V0KSh2b2lkKTsgICAgICAgICAgICAgLyogY2FsbGJhY2sgd2hlbiB1c2Vyc3BhY2UgZHJvcHMgKi8KKwl2b2lkICgqb25fcmVhZCkodm9pZCk7ICAgICAgICAgICAgICAvKiBjYWxsYmFjayBvbiBtZXNzYWdlIHJlYWQgKi8KIAl1OCAqb3V0bXNnOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXNzYWdlIHRvIHRoZSB1c2Vyc3BhY2UgKi8KIAlpbnQgb3V0bXNnX2xlbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdHMgbGVuZ3RoICovCiAJd2FpdF9xdWV1ZV9oZWFkX3Qgb3V0bXNnX3E7ICAgICAgICAgLyogcG9sbC9yZWFkIHdhaXQgcXVldWUgKi8KQEAgLTQ2LDcgKzQ3LDggQEAKIAkJCQkJICAgICAgIHUzMiBjbl9pZHgsIHUzMiBjbl92YWwsCiAJCQkJCSAgICAgICBpbnQgKCpvbl9tc2cpKHZvaWQgKiwgaW50KSwKIAkJCQkJICAgICAgIHZvaWQgKCpvbl9yZXNldCkodm9pZCkpOwotaW50IGh2dXRpbF90cmFuc3BvcnRfc2VuZChzdHJ1Y3QgaHZ1dGlsX3RyYW5zcG9ydCAqaHZ0LCB2b2lkICptc2csIGludCBsZW4pOworaW50IGh2dXRpbF90cmFuc3BvcnRfc2VuZChzdHJ1Y3QgaHZ1dGlsX3RyYW5zcG9ydCAqaHZ0LCB2b2lkICptc2csIGludCBsZW4sCisJCQkgIHZvaWQgKCpvbl9yZWFkX2NiKSh2b2lkKSk7CiB2b2lkIGh2dXRpbF90cmFuc3BvcnRfZGVzdHJveShzdHJ1Y3QgaHZ1dGlsX3RyYW5zcG9ydCAqaHZ0KTsKIAogI2VuZGlmIC8qIF9IVl9VVElMU19UUkFOU1BPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9oeXBlcnZfdm1idXMuaCBiL2RyaXZlcnMvaHYvaHlwZXJ2X3ZtYnVzLmgKaW5kZXggNzE4YjVjNy4uYTViNDQ0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9oeXBlcnZfdm1idXMuaAorKysgYi9kcml2ZXJzL2h2L2h5cGVydl92bWJ1cy5oCkBAIC00OTUsNyArNDk1LDcgQEAKIAogZXh0ZXJuIGludCBodl9pbml0KHZvaWQpOwogCi1leHRlcm4gdm9pZCBodl9jbGVhbnVwKHZvaWQpOworZXh0ZXJuIHZvaWQgaHZfY2xlYW51cChib29sIGNyYXNoKTsKIAogZXh0ZXJuIGludCBodl9wb3N0X21lc3NhZ2UodW5pb24gaHZfY29ubmVjdGlvbl9pZCBjb25uZWN0aW9uX2lkLAogCQkJIGVudW0gaHZfbWVzc2FnZV90eXBlIG1lc3NhZ2VfdHlwZSwKQEAgLTUyMiwxNCArNTIyLDE1IEBACiAvKiBJbnRlcmZhY2UgKi8KIAogCi1pbnQgaHZfcmluZ2J1ZmZlcl9pbml0KHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sIHZvaWQgKmJ1ZmZlciwKLQkJICAgdTMyIGJ1Zmxlbik7CitpbnQgaHZfcmluZ2J1ZmZlcl9pbml0KHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sCisJCSAgICAgICBzdHJ1Y3QgcGFnZSAqcGFnZXMsIHUzMiBwYWdlY250KTsKIAogdm9pZCBodl9yaW5nYnVmZmVyX2NsZWFudXAoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbyk7CiAKIGludCBodl9yaW5nYnVmZmVyX3dyaXRlKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sCiAJCSAgICBzdHJ1Y3Qga3ZlYyAqa3ZfbGlzdCwKLQkJICAgIHUzMiBrdl9jb3VudCwgYm9vbCAqc2lnbmFsLCBib29sIGxvY2spOworCQkgICAgdTMyIGt2X2NvdW50LCBib29sICpzaWduYWwsIGJvb2wgbG9jaywKKwkJICAgIGVudW0gaHZfc2lnbmFsX3BvbGljeSBwb2xpY3kpOwogCiBpbnQgaHZfcmluZ2J1ZmZlcl9yZWFkKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICppbnJpbmdfaW5mbywKIAkJICAgICAgIHZvaWQgKmJ1ZmZlciwgdTMyIGJ1ZmxlbiwgdTMyICpidWZmZXJfYWN0dWFsX2xlbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvcmluZ19idWZmZXIuYyBiL2RyaXZlcnMvaHYvcmluZ19idWZmZXIuYwppbmRleCBmZTU4NmJmLi4wODA0M2RhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L3JpbmdfYnVmZmVyLmMKKysrIGIvZHJpdmVycy9odi9yaW5nX2J1ZmZlci5jCkBAIC0yNyw2ICsyNyw4IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9oeXBlcnYuaD4KICNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAiaHlwZXJ2X3ZtYnVzLmgiCiAKQEAgLTY2LDEyICs2OCwyMCBAQAogICoJICAgYXJyaXZlZC4KICAqLwogCi1zdGF0aWMgYm9vbCBodl9uZWVkX3RvX3NpZ25hbCh1MzIgb2xkX3dyaXRlLCBzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmJpKQorc3RhdGljIGJvb2wgaHZfbmVlZF90b19zaWduYWwodTMyIG9sZF93cml0ZSwgc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJiaSwKKwkJCSAgICAgIGVudW0gaHZfc2lnbmFsX3BvbGljeSBwb2xpY3kpCiB7CiAJdmlydF9tYigpOwogCWlmIChSRUFEX09OQ0UocmJpLT5yaW5nX2J1ZmZlci0+aW50ZXJydXB0X21hc2spKQogCQlyZXR1cm4gZmFsc2U7CiAKKwkvKgorCSAqIFdoZW4gdGhlIGNsaWVudCB3YW50cyB0byBjb250cm9sIHNpZ25hbGluZywKKwkgKiB3ZSBvbmx5IGhvbm91ciB0aGUgaG9zdCBpbnRlcnJ1cHQgbWFzay4KKwkgKi8KKwlpZiAocG9saWN5ID09IEhWX1NJR05BTF9QT0xJQ1lfRVhQTElDSVQpCisJCXJldHVybiB0cnVlOworCiAJLyogY2hlY2sgaW50ZXJydXB0X21hc2sgYmVmb3JlIHJlYWRfaW5kZXggKi8KIAl2aXJ0X3JtYigpOwogCS8qCkBAIC0xNjIsMTggKzE3Miw3IEBACiAJdm9pZCAqcmluZ19idWZmZXIgPSBodl9nZXRfcmluZ19idWZmZXIocmluZ19pbmZvKTsKIAl1MzIgcmluZ19idWZmZXJfc2l6ZSA9IGh2X2dldF9yaW5nX2J1ZmZlcnNpemUocmluZ19pbmZvKTsKIAotCXUzMiBmcmFnX2xlbjsKLQotCS8qIHdyYXAtYXJvdW5kIGRldGVjdGVkIGF0IHRoZSBzcmMgKi8KLQlpZiAoZGVzdGxlbiA+IHJpbmdfYnVmZmVyX3NpemUgLSBzdGFydF9yZWFkX29mZnNldCkgewotCQlmcmFnX2xlbiA9IHJpbmdfYnVmZmVyX3NpemUgLSBzdGFydF9yZWFkX29mZnNldDsKLQotCQltZW1jcHkoZGVzdCwgcmluZ19idWZmZXIgKyBzdGFydF9yZWFkX29mZnNldCwgZnJhZ19sZW4pOwotCQltZW1jcHkoZGVzdCArIGZyYWdfbGVuLCByaW5nX2J1ZmZlciwgZGVzdGxlbiAtIGZyYWdfbGVuKTsKLQl9IGVsc2UKLQotCQltZW1jcHkoZGVzdCwgcmluZ19idWZmZXIgKyBzdGFydF9yZWFkX29mZnNldCwgZGVzdGxlbik7Ci0KKwltZW1jcHkoZGVzdCwgcmluZ19idWZmZXIgKyBzdGFydF9yZWFkX29mZnNldCwgZGVzdGxlbik7CiAKIAlzdGFydF9yZWFkX29mZnNldCArPSBkZXN0bGVuOwogCXN0YXJ0X3JlYWRfb2Zmc2V0ICU9IHJpbmdfYnVmZmVyX3NpemU7CkBAIC0xOTQsMTUgKzE5Myw4IEBACiB7CiAJdm9pZCAqcmluZ19idWZmZXIgPSBodl9nZXRfcmluZ19idWZmZXIocmluZ19pbmZvKTsKIAl1MzIgcmluZ19idWZmZXJfc2l6ZSA9IGh2X2dldF9yaW5nX2J1ZmZlcnNpemUocmluZ19pbmZvKTsKLQl1MzIgZnJhZ19sZW47CiAKLQkvKiB3cmFwLWFyb3VuZCBkZXRlY3RlZCEgKi8KLQlpZiAoc3JjbGVuID4gcmluZ19idWZmZXJfc2l6ZSAtIHN0YXJ0X3dyaXRlX29mZnNldCkgewotCQlmcmFnX2xlbiA9IHJpbmdfYnVmZmVyX3NpemUgLSBzdGFydF93cml0ZV9vZmZzZXQ7Ci0JCW1lbWNweShyaW5nX2J1ZmZlciArIHN0YXJ0X3dyaXRlX29mZnNldCwgc3JjLCBmcmFnX2xlbik7Ci0JCW1lbWNweShyaW5nX2J1ZmZlciwgc3JjICsgZnJhZ19sZW4sIHNyY2xlbiAtIGZyYWdfbGVuKTsKLQl9IGVsc2UKLQkJbWVtY3B5KHJpbmdfYnVmZmVyICsgc3RhcnRfd3JpdGVfb2Zmc2V0LCBzcmMsIHNyY2xlbik7CisJbWVtY3B5KHJpbmdfYnVmZmVyICsgc3RhcnRfd3JpdGVfb2Zmc2V0LCBzcmMsIHNyY2xlbik7CiAKIAlzdGFydF93cml0ZV9vZmZzZXQgKz0gc3JjbGVuOwogCXN0YXJ0X3dyaXRlX29mZnNldCAlPSByaW5nX2J1ZmZlcl9zaXplOwpAQCAtMjM1LDIyICsyMjcsNDYgQEAKIAogLyogSW5pdGlhbGl6ZSB0aGUgcmluZyBidWZmZXIuICovCiBpbnQgaHZfcmluZ2J1ZmZlcl9pbml0KHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sCi0JCSAgIHZvaWQgKmJ1ZmZlciwgdTMyIGJ1ZmxlbikKKwkJICAgICAgIHN0cnVjdCBwYWdlICpwYWdlcywgdTMyIHBhZ2VfY250KQogewotCWlmIChzaXplb2Yoc3RydWN0IGh2X3JpbmdfYnVmZmVyKSAhPSBQQUdFX1NJWkUpCi0JCXJldHVybiAtRUlOVkFMOworCWludCBpOworCXN0cnVjdCBwYWdlICoqcGFnZXNfd3JhcGFyb3VuZDsKKworCUJVSUxEX0JVR19PTigoc2l6ZW9mKHN0cnVjdCBodl9yaW5nX2J1ZmZlcikgIT0gUEFHRV9TSVpFKSk7CiAKIAltZW1zZXQocmluZ19pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8pKTsKIAotCXJpbmdfaW5mby0+cmluZ19idWZmZXIgPSAoc3RydWN0IGh2X3JpbmdfYnVmZmVyICopYnVmZmVyOworCS8qCisJICogRmlyc3QgcGFnZSBob2xkcyBzdHJ1Y3QgaHZfcmluZ19idWZmZXIsIGRvIHdyYXBhcm91bmQgbWFwcGluZyBmb3IKKwkgKiB0aGUgcmVzdC4KKwkgKi8KKwlwYWdlc193cmFwYXJvdW5kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiAocGFnZV9jbnQgKiAyIC0gMSksCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlc193cmFwYXJvdW5kKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBhZ2VzX3dyYXBhcm91bmRbMF0gPSBwYWdlczsKKwlmb3IgKGkgPSAwOyBpIDwgMiAqIChwYWdlX2NudCAtIDEpOyBpKyspCisJCXBhZ2VzX3dyYXBhcm91bmRbaSArIDFdID0gJnBhZ2VzW2kgJSAocGFnZV9jbnQgLSAxKSArIDFdOworCisJcmluZ19pbmZvLT5yaW5nX2J1ZmZlciA9IChzdHJ1Y3QgaHZfcmluZ19idWZmZXIgKikKKwkJdm1hcChwYWdlc193cmFwYXJvdW5kLCBwYWdlX2NudCAqIDIgLSAxLCBWTV9NQVAsIFBBR0VfS0VSTkVMKTsKKworCWtmcmVlKHBhZ2VzX3dyYXBhcm91bmQpOworCisKKwlpZiAoIXJpbmdfaW5mby0+cmluZ19idWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCiAJcmluZ19pbmZvLT5yaW5nX2J1ZmZlci0+cmVhZF9pbmRleCA9CiAJCXJpbmdfaW5mby0+cmluZ19idWZmZXItPndyaXRlX2luZGV4ID0gMDsKIAogCS8qIFNldCB0aGUgZmVhdHVyZSBiaXQgZm9yIGVuYWJsaW5nIGZsb3cgY29udHJvbC4gKi8KIAlyaW5nX2luZm8tPnJpbmdfYnVmZmVyLT5mZWF0dXJlX2JpdHMudmFsdWUgPSAxOwogCi0JcmluZ19pbmZvLT5yaW5nX3NpemUgPSBidWZsZW47Ci0JcmluZ19pbmZvLT5yaW5nX2RhdGFzaXplID0gYnVmbGVuIC0gc2l6ZW9mKHN0cnVjdCBodl9yaW5nX2J1ZmZlcik7CisJcmluZ19pbmZvLT5yaW5nX3NpemUgPSBwYWdlX2NudCA8PCBQQUdFX1NISUZUOworCXJpbmdfaW5mby0+cmluZ19kYXRhc2l6ZSA9IHJpbmdfaW5mby0+cmluZ19zaXplIC0KKwkJc2l6ZW9mKHN0cnVjdCBodl9yaW5nX2J1ZmZlcik7CiAKIAlzcGluX2xvY2tfaW5pdCgmcmluZ19pbmZvLT5yaW5nX2xvY2spOwogCkBAIC0yNjAsMTEgKzI3NiwxMyBAQAogLyogQ2xlYW51cCB0aGUgcmluZyBidWZmZXIuICovCiB2b2lkIGh2X3JpbmdidWZmZXJfY2xlYW51cChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvKQogeworCXZ1bm1hcChyaW5nX2luZm8tPnJpbmdfYnVmZmVyKTsKIH0KIAogLyogV3JpdGUgdG8gdGhlIHJpbmcgYnVmZmVyLiAqLwogaW50IGh2X3JpbmdidWZmZXJfd3JpdGUoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKm91dHJpbmdfaW5mbywKLQkJICAgIHN0cnVjdCBrdmVjICprdl9saXN0LCB1MzIga3ZfY291bnQsIGJvb2wgKnNpZ25hbCwgYm9vbCBsb2NrKQorCQkgICAgc3RydWN0IGt2ZWMgKmt2X2xpc3QsIHUzMiBrdl9jb3VudCwgYm9vbCAqc2lnbmFsLCBib29sIGxvY2ssCisJCSAgICBlbnVtIGh2X3NpZ25hbF9wb2xpY3kgcG9saWN5KQogewogCWludCBpID0gMDsKIAl1MzIgYnl0ZXNfYXZhaWxfdG93cml0ZTsKQEAgLTMyNiw3ICszNDQsNyBAQAogCWlmIChsb2NrKQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvdXRyaW5nX2luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOwogCi0JKnNpZ25hbCA9IGh2X25lZWRfdG9fc2lnbmFsKG9sZF93cml0ZSwgb3V0cmluZ19pbmZvKTsKKwkqc2lnbmFsID0gaHZfbmVlZF90b19zaWduYWwob2xkX3dyaXRlLCBvdXRyaW5nX2luZm8sIHBvbGljeSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvdm1idXNfZHJ2LmMgYi9kcml2ZXJzL2h2L3ZtYnVzX2Rydi5jCmluZGV4IGU4MmY3ZTEuLmEyNTllMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHYvdm1idXNfZHJ2LmMKKysrIGIvZHJpdmVycy9odi92bWJ1c19kcnYuYwpAQCAtMTA1LDggKzEwNSw4IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICpmYl9tbWlvX25hbWUgPSAiZmJfcmFuZ2UiOwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqZmJfbW1pbzsKLXN0cnVjdCByZXNvdXJjZSAqaHlwZXJ2X21taW87Ci1ERUZJTkVfU0VNQVBIT1JFKGh5cGVydl9tbWlvX2xvY2spOworc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqaHlwZXJ2X21taW87CitzdGF0aWMgREVGSU5FX1NFTUFQSE9SRShoeXBlcnZfbW1pb19sb2NrKTsKIAogc3RhdGljIGludCB2bWJ1c19leGlzdHModm9pZCkKIHsKQEAgLTg3NCw3ICs4NzQsNyBAQAogCWJ1c191bnJlZ2lzdGVyKCZodl9idXMpOwogCiBlcnJfY2xlYW51cDoKLQlodl9jbGVhbnVwKCk7CisJaHZfY2xlYW51cChmYWxzZSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtOTYxLDggKzk2MSw4IEBACiB7CiAJaW50IHJldCA9IDA7CiAKLQlkZXZfc2V0X25hbWUoJmNoaWxkX2RldmljZV9vYmotPmRldmljZSwgInZtYnVzXyVkIiwKLQkJICAgICBjaGlsZF9kZXZpY2Vfb2JqLT5jaGFubmVsLT5pZCk7CisJZGV2X3NldF9uYW1lKCZjaGlsZF9kZXZpY2Vfb2JqLT5kZXZpY2UsICJ2bWJ1cy0lcFVsIiwKKwkJICAgICBjaGlsZF9kZXZpY2Vfb2JqLT5jaGFubmVsLT5vZmZlcm1zZy5vZmZlci5pZl9pbnN0YW5jZS5iKTsKIAogCWNoaWxkX2RldmljZV9vYmotPmRldmljZS5idXMgPSAmaHZfYnVzOwogCWNoaWxkX2RldmljZV9vYmotPmRldmljZS5wYXJlbnQgPSAmaHZfYWNwaV9kZXYtPmRldjsKQEAgLTEzMjYsNyArMTMyNiw3IEBACiAJdm1idXNfaW5pdGlhdGVfdW5sb2FkKGZhbHNlKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKIAkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgaHZfc3luaWNfY2xlYW51cCwgTlVMTCwgMSk7Ci0JaHZfY2xlYW51cCgpOworCWh2X2NsZWFudXAoZmFsc2UpOwogfTsKIAogc3RhdGljIHZvaWQgaHZfY3Jhc2hfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKQEAgLTEzMzgsNyArMTMzOCw3IEBACiAJICogZm9yIGtkdW1wLgogCSAqLwogCWh2X3N5bmljX2NsZWFudXAoTlVMTCk7Ci0JaHZfY2xlYW51cCgpOworCWh2X2NsZWFudXAodHJ1ZSk7CiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBodl9hY3BpX2luaXQodm9pZCkKQEAgLTEzOTgsNyArMTM5OCw3IEBACiAJCQkJCQkgJmh5cGVydl9wYW5pY19ibG9jayk7CiAJfQogCWJ1c191bnJlZ2lzdGVyKCZodl9idXMpOwotCWh2X2NsZWFudXAoKTsKKwlodl9jbGVhbnVwKGZhbHNlKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQl0YXNrbGV0X2tpbGwoaHZfY29udGV4dC5ldmVudF9kcGNbY3B1XSk7CiAJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGh2X3N5bmljX2NsZWFudXAsIE5VTEwsIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVycy9od21vbi9LY29uZmlnCmluZGV4IGVhZjJmOTEuLjQ1Y2VmM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZworKysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKQEAgLTk2OSw3ICs5NjksNiBAQAogY29uZmlnIFNFTlNPUlNfTE03NQogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzUgYW5kIGNvbXBhdGlibGVzIgogCWRlcGVuZHMgb24gSTJDCi0JZGVwZW5kcyBvbiBUSEVSTUFMIHx8ICFUSEVSTUFMX09GCiAJc2VsZWN0IFJFR01BUF9JMkMKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3Igb25lIGNvbW1vbiB0eXBlIG9mCkBAIC0xMTE5LDYgKzExMTgsNyBAQAogY29uZmlnIFNFTlNPUlNfTE05NTI0NQogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTUyNDUgYW5kIGNvbXBhdGlibGVzIgogCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IFJFR01BUF9JMkMKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTE05NTIzNSBhbmQgTE05NTI0NQogCSAgdGVtcGVyYXR1cmUgc2Vuc29yIGNoaXBzLgpAQCAtMTU3Miw3ICsxNTcyLDYgQEAKIGNvbmZpZyBTRU5TT1JTX1RNUDEwMgogCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBUTVAxMDIiCiAJZGVwZW5kcyBvbiBJMkMKLQlkZXBlbmRzIG9uIFRIRVJNQUwgfHwgIVRIRVJNQUxfT0YKIAlzZWxlY3QgUkVHTUFQX0kyQwogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBUZXhhcyBJbnN0cnVtZW50cyBUTVAxMDIKQEAgLTE4MjMsNiArMTgyMiwxMyBAQAogCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIFVsdHJhNDUgd29ya3N0YXRpb24gZW52aXJvbm1lbnRhbAogCSAgc2Vuc29ycy4KIAorY29uZmlnIFNFTlNPUlNfWEdFTkUKKwl0cmlzdGF0ZSAiQVBNIFgtR2VuZSBTb0MgaGFyZHdhcmUgbW9uaXRvcmluZyBkcml2ZXIiCisJZGVwZW5kcyBvbiBYR0VORV9TTElNUFJPX01CT1ggfHwgUENDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSB0ZW1wZXJhdHVyZQorCSAgYW5kIHBvd2VyIHNlbnNvcnMgZm9yIEFQTSBYLUdlbmUgU29DLgorCiBpZiBBQ1BJCiAKIGNvbW1lbnQgIkFDUEkgZHJpdmVycyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCmluZGV4IGZlODdkMjguLmFlY2Y0YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQpAQCAtMTY1LDYgKzE2NSw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19XODNMNzg2TkcpCSs9IHc4M2w3ODZuZy5vCiBvYmotJChDT05GSUdfU0VOU09SU19XTTgzMVgpCSs9IHdtODMxeC1od21vbi5vCiBvYmotJChDT05GSUdfU0VOU09SU19XTTgzNTApCSs9IHdtODM1MC1od21vbi5vCitvYmotJChDT05GSUdfU0VOU09SU19YR0VORSkJKz0geGdlbmUtaHdtb24ubwogCiBvYmotJChDT05GSUdfUE1CVVMpCQkrPSBwbWJ1cy8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZHQ3NDExLmMgYi9kcml2ZXJzL2h3bW9uL2FkdDc0MTEuYwppbmRleCBmYzFlNjVhLi44MTJmYmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkdDc0MTEuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkdDc0MTEuYwpAQCAtNyw4ICs3LDcgQEAKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqICBUT0RPOiBTUEksIHN1cHBvcnQgZm9yIGV4dGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvcgotICoJICB1c2UgcG93ZXItZG93biBtb2RlIGZvciBzdXNwZW5kPywgaW50ZXJydXB0IGhhbmRsaW5nPworICogIFRPRE86IFNQSSwgdXNlIHBvd2VyLWRvd24gbW9kZSBmb3Igc3VzcGVuZD8sIGludGVycnVwdCBoYW5kbGluZz8KICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zMSw2ICszMCw3IEBACiAjZGVmaW5lIEFEVDc0MTFfUkVHX0NGRzEJCQkweDE4CiAjZGVmaW5lIEFEVDc0MTFfQ0ZHMV9TVEFSVF9NT05JVE9SCQkoMSA8PCAwKQogI2RlZmluZSBBRFQ3NDExX0NGRzFfUkVTRVJWRURfQklUMQkJKDEgPDwgMSkKKyNkZWZpbmUgQURUNzQxMV9DRkcxX0VYVF9URE0JCQkoMSA8PCAyKQogI2RlZmluZSBBRFQ3NDExX0NGRzFfUkVTRVJWRURfQklUMwkJKDEgPDwgMykKIAogI2RlZmluZSBBRFQ3NDExX1JFR19DRkcyCQkJMHgxOQpAQCAtNTcsNiArNTcsNyBAQAogCXVuc2lnbmVkIGxvbmcgbmV4dF91cGRhdGU7CiAJaW50IHZyZWZfY2FjaGVkOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJYm9vbCB1c2VfZXh0X3RlbXA7CiB9OwogCiAvKgpAQCAtMTI3LDExICsxMjgsMjAgQEAKIHN0YXRpYyBzc2l6ZV90IGFkdDc0MTFfc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgYWR0NzQxMV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQlpbnQgdmFsID0gYWR0NzQxMV9yZWFkXzEwX2JpdChjbGllbnQsIEFEVDc0MTFfUkVHX0lOVF9URU1QX1ZERF9MU0IsCi0JCQlBRFQ3NDExX1JFR19JTlRfVEVNUF9NU0IsIDApOworCWludCB2YWw7CisJc3RydWN0IHsKKwkJdTggbG93OworCQl1OCBoaWdoOworCX0gcmVnWzJdID0geworCQl7IEFEVDc0MTFfUkVHX0lOVF9URU1QX1ZERF9MU0IsIEFEVDc0MTFfUkVHX0lOVF9URU1QX01TQiB9LAorCQl7IEFEVDc0MTFfUkVHX0VYVF9URU1QX0FJTjE0X0xTQiwKKwkJICBBRFQ3NDExX1JFR19FWFRfVEVNUF9BSU4xX01TQiB9LAorCX07CiAKKwl2YWwgPSBhZHQ3NDExX3JlYWRfMTBfYml0KGNsaWVudCwgcmVnW25yXS5sb3csIHJlZ1tucl0uaGlnaCwgMCk7CiAJaWYgKHZhbCA8IDApCiAJCXJldHVybiB2YWw7CiAKQEAgLTIxOCwxMSArMjI4LDEzIEBACiAJcmV0dXJuIHJldCA8IDAgPyByZXQgOiBjb3VudDsKIH0KIAorCiAjZGVmaW5lIEFEVDc0MTFfQklUX0FUVFIoX19uYW1lLCBfX3JlZywgX19iaXQpIFwKIAlTRU5TT1JfREVWSUNFX0FUVFJfMihfX25hbWUsIFNfSVJVR08gfCBTX0lXVVNSLCBhZHQ3NDExX3Nob3dfYml0LCBcCiAJYWR0NzQxMV9zZXRfYml0LCBfX2JpdCwgX19yZWcpCiAKLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgYWR0NzQxMV9zaG93X3RlbXAsIE5VTEwpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgYWR0NzQxMV9zaG93X3RlbXAsIE5VTEwsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9pbnB1dCwgU19JUlVHTywgYWR0NzQxMV9zaG93X3RlbXAsIE5VTEwsIDEpOwogc3RhdGljIERFVklDRV9BVFRSKGluMF9pbnB1dCwgU19JUlVHTywgYWR0NzQxMV9zaG93X3ZkZCwgTlVMTCk7CiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9pbnB1dCwgU19JUlVHTywgYWR0NzQxMV9zaG93X2lucHV0LCBOVUxMLCAwKTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX2lucHV0LCBTX0lSVUdPLCBhZHQ3NDExX3Nob3dfaW5wdXQsIE5VTEwsIDEpOwpAQCAtMjM3LDcgKzI0OSw4IEBACiBzdGF0aWMgQURUNzQxMV9CSVRfQVRUUihhZGNfcmVmX3ZkZCwgQURUNzQxMV9SRUdfQ0ZHMywgQURUNzQxMV9DRkczX1JFRl9WREQpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWR0NzQxMV9hdHRyc1tdID0gewotCSZkZXZfYXR0cl90ZW1wMV9pbnB1dC5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJmRldl9hdHRyX2luMF9pbnB1dC5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKQEAgLTI1Myw3ICsyNjYsMjcgQEAKIAlOVUxMCiB9OwogCi1BVFRSSUJVVEVfR1JPVVBTKGFkdDc0MTEpOworc3RhdGljIHVtb2RlX3QgYWR0NzQxMV9hdHRyc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgaW50IGluZGV4KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgYWR0NzQxMV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJYm9vbCB2aXNpYmxlID0gdHJ1ZTsKKworCWlmIChhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIuYXR0cikKKwkJdmlzaWJsZSA9IGRhdGEtPnVzZV9leHRfdGVtcDsKKwllbHNlIGlmIChhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfaW4xX2lucHV0LmRldl9hdHRyLmF0dHIgfHwKKwkJIGF0dHIgPT0gJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIuYXR0cikKKwkJdmlzaWJsZSA9ICFkYXRhLT51c2VfZXh0X3RlbXA7CisKKwlyZXR1cm4gdmlzaWJsZSA/IGF0dHItPm1vZGUgOiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZHQ3NDExX2dyb3VwID0geworCS5hdHRycyA9IGFkdDc0MTFfYXR0cnMsCisJLmlzX3Zpc2libGUgPSBhZHQ3NDExX2F0dHJzX3Zpc2libGUsCit9OworX19BVFRSSUJVVEVfR1JPVVBTKGFkdDc0MTEpOwogCiBzdGF0aWMgaW50IGFkdDc0MTFfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKQEAgLTMwOSw2ICszNDIsOCBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCisJZGF0YS0+dXNlX2V4dF90ZW1wID0gcmV0ICYgQURUNzQxMV9DRkcxX0VYVF9URE07CisKIAkvKgogCSAqIFdlIG11c3Qgb25seSB3cml0ZSB6ZXJvIHRvIGJpdCAxIGFuZCBvbmx5IG9uZSB0byBiaXQgMyBhY2NvcmRpbmcgdG8KIAkgKiB0aGUgZGF0YXNoZWV0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZHQ3NDcwLmMgYi9kcml2ZXJzL2h3bW9uL2FkdDc0NzAuYwppbmRleCBmNWRhMzlhLi42ZTYwY2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkdDc0NzAuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkdDc0NzAuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3V0aWxfbWFjcm9zLmg+CiAKIC8qIEFkZHJlc3NlcyB0byBzY2FuICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJDLCAweDJFLCAweDJGLCBJMkNfQ0xJRU5UX0VORCB9OwpAQCAtODMsNiArODQsNyBAQAogI2RlZmluZSBBRFQ3NDcwX1JFR19QV01fTUlOX01BWF9BRERSCQkweDZECiAjZGVmaW5lIEFEVDc0NzBfUkVHX1BXTV9URU1QX01JTl9CQVNFX0FERFIJMHg2RQogI2RlZmluZSBBRFQ3NDcwX1JFR19QV01fVEVNUF9NSU5fTUFYX0FERFIJMHg3MQorI2RlZmluZSBBRFQ3NDcwX1JFR19DRkdfMgkJCTB4NzQKICNkZWZpbmUgQURUNzQ3MF9SRUdfQUNPVVNUSUNTMTIJCQkweDc1CiAjZGVmaW5lIEFEVDc0NzBfUkVHX0FDT1VTVElDUzM0CQkJMHg3NgogI2RlZmluZSBBRFQ3NDcwX1JFR19ERVZJQ0UJCQkweDNECkBAIC0xNDIsNiArMTQ0LDExIEBACiAjZGVmaW5lIEZBTl9QRVJJT0RfSU5WQUxJRAk2NTUzNQogI2RlZmluZSBGQU5fREFUQV9WQUxJRCh4KQkoKHgpICYmICh4KSAhPSBGQU5fUEVSSU9EX0lOVkFMSUQpCiAKKy8qIENvbmZpZyByZWdpc3RlcnMgMSBhbmQgMiBpbmNsdWRlIGZpZWxkcyBmb3Igc2VsZWN0aW5nIHRoZSBQV00gZnJlcXVlbmN5ICovCisjZGVmaW5lIEFEVDc0NzBfQ0ZHX0xGCQkweDQwCisjZGVmaW5lIEFEVDc0NzBfRlJFUV9NQVNLCTB4NzAKKyNkZWZpbmUgQURUNzQ3MF9GUkVRX1NISUZUCTQKKwogc3RydWN0IGFkdDc0NzBfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKIAlzdHJ1Y3QgbXV0ZXgJCWxvY2s7CkBAIC0xNzAsNyArMTc3LDYgQEAKIAl1OAkJCXB3bV9hdXRvX3RlbXBbQURUNzQ3MF9QV01fQ09VTlRdOwogCiAJc3RydWN0IHRhc2tfc3RydWN0CSphdXRvX3VwZGF0ZTsKLQlzdHJ1Y3QgY29tcGxldGlvbglhdXRvX3VwZGF0ZV9zdG9wOwogCXVuc2lnbmVkIGludAkJYXV0b191cGRhdGVfaW50ZXJ2YWw7CiB9OwogCkBAIC0yNjYsMTIgKzI3MiwxNCBAQAogCQltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKIAkJYWR0NzQ3MF9yZWFkX3RlbXBlcmF0dXJlcyhjbGllbnQsIGRhdGEpOwogCQltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCQlicmVhazsKLQkJbXNsZWVwX2ludGVycnVwdGlibGUoZGF0YS0+YXV0b191cGRhdGVfaW50ZXJ2YWwpOworCisJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcyhkYXRhLT5hdXRvX3VwZGF0ZV9pbnRlcnZhbCkpOwogCX0KIAotCWNvbXBsZXRlX2FsbCgmZGF0YS0+YXV0b191cGRhdGVfc3RvcCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUzOCw2ICs1NDYsMjggQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIleFxuIiwgZGF0YS0+YWxhcm1zX21hc2spOwogfQogCitzdGF0aWMgc3NpemVfdCBzZXRfYWxhcm1fbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYWR0NzQ3MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJbG9uZyBtYXNrOworCisJaWYgKGtzdHJ0b3VsKGJ1ZiwgMCwgJm1hc2spKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtYXNrICYgfjB4ZmZmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwlkYXRhLT5hbGFybXNfbWFzayA9IG1hc2s7CisJYWR0NzQ3MF93cml0ZV93b3JkX2RhdGEoZGF0YS0+Y2xpZW50LCBBRFQ3NDcwX1JFR19BTEFSTTFfTUFTSywgbWFzayk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKwogc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKIAkJCSAgICBjaGFyICpidWYpCkBAIC02ODgsNiArNzE4LDcwIEBACiAJcmV0dXJuIGNvdW50OwogfQogCisvKiBUaGVzZSBhcmUgdGhlIHZhbGlkIFBXTSBmcmVxdWVuY2llcyB0byB0aGUgbmVhcmVzdCBIeiAqLworc3RhdGljIGNvbnN0IGludCBhZHQ3NDcwX2ZyZXFfbWFwW10gPSB7CisJMTEsIDE1LCAyMiwgMjksIDM1LCA0NCwgNTksIDg4LCAxNDAwLCAyMjUwMAorfTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19wd21fZnJlcShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkdDc0NzBfZGF0YSAqZGF0YSA9IGFkdDc0NzBfdXBkYXRlX2RldmljZShkZXYpOworCXVuc2lnbmVkIGNoYXIgY2ZnX3JlZ18xOworCXVuc2lnbmVkIGNoYXIgY2ZnX3JlZ18yOworCWludCBpbmRleDsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCWNmZ19yZWdfMSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIEFEVDc0NzBfUkVHX0NGRyk7CisJY2ZnX3JlZ18yID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgQURUNzQ3MF9SRUdfQ0ZHXzIpOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlpbmRleCA9IChjZmdfcmVnXzIgJiBBRFQ3NDcwX0ZSRVFfTUFTSykgPj4gQURUNzQ3MF9GUkVRX1NISUZUOworCWlmICghKGNmZ19yZWdfMSAmIEFEVDc0NzBfQ0ZHX0xGKSkKKwkJaW5kZXggKz0gODsKKwlpZiAoaW5kZXggPj0gQVJSQVlfU0laRShhZHQ3NDcwX2ZyZXFfbWFwKSkKKwkJaW5kZXggPSBBUlJBWV9TSVpFKGFkdDc0NzBfZnJlcV9tYXApIC0gMTsKKworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgYWR0NzQ3MF9mcmVxX21hcFtpbmRleF0pOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfcHdtX2ZyZXEoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBhZHQ3NDcwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCWxvbmcgZnJlcTsKKwlpbnQgaW5kZXg7CisJaW50IGxvd19mcmVxID0gQURUNzQ3MF9DRkdfTEY7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlpZiAoa3N0cnRvbChidWYsIDEwLCAmZnJlcSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogUm91bmQgdGhlIHVzZXIgdmFsdWUgZ2l2ZW4gdG8gdGhlIGNsb3Nlc3QgYXZhaWxhYmxlIGZyZXF1ZW5jeSAqLworCWluZGV4ID0gZmluZF9jbG9zZXN0KGZyZXEsIGFkdDc0NzBfZnJlcV9tYXAsCisJCQkgICAgIEFSUkFZX1NJWkUoYWR0NzQ3MF9mcmVxX21hcCkpOworCisJaWYgKGluZGV4ID49IDgpIHsKKwkJaW5kZXggLT0gODsKKwkJbG93X2ZyZXEgPSAwOworCX0KKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCS8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAqLworCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0NGRyk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0NGRywKKwkJCQkgICh2YWwgJiB+QURUNzQ3MF9DRkdfTEYpIHwgbG93X2ZyZXEpOworCS8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0NGR18yKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfQ0ZHXzIsCisJCSh2YWwgJiB+QURUNzQ3MF9GUkVRX01BU0spIHwgKGluZGV4IDw8IEFEVDc0NzBfRlJFUV9TSElGVCkpOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHNob3dfcHdtX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCiAJCQkgICAgY2hhciAqYnVmKQpAQCAtOTE4LDcgKzEwMTIsOCBAQAogCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKGFsYXJtX21hc2ssIFNfSVJVR08sIHNob3dfYWxhcm1fbWFzaywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1fbWFzaywgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfYWxhcm1fbWFzaywKKwkJICAgc2V0X2FsYXJtX21hc2spOwogc3RhdGljIERFVklDRV9BVFRSKG51bV90ZW1wX3NlbnNvcnMsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X251bV90ZW1wX3NlbnNvcnMsCiAJCSAgIHNldF9udW1fdGVtcF9zZW5zb3JzKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihhdXRvX3VwZGF0ZV9pbnRlcnZhbCwgU19JV1VTUiB8IFNfSVJVR08sCkBAIC0xMDM4LDYgKzExMzMsOCBAQAogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20zLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19wd20sIHNldF9wd20sIDIpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd200LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19wd20sIHNldF9wd20sIDMpOwogCitzdGF0aWMgREVWSUNFX0FUVFIocHdtMV9mcmVxLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19wd21fZnJlcSwgc2V0X3B3bV9mcmVxKTsKKwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20xX2F1dG9fcG9pbnQxX3B3bSwgU19JV1VTUiB8IFNfSVJVR08sCiAJCSAgICBzaG93X3B3bV9taW4sIHNldF9wd21fbWluLCAwKTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMl9hdXRvX3BvaW50MV9wd20sIFNfSVdVU1IgfCBTX0lSVUdPLApAQCAtMTE1NCw2ICsxMjUxLDcgQEAKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjRfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZvcmNlX3B3bV9tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3B3bTEuZGV2X2F0dHIuYXR0ciwKKwkmZGV2X2F0dHJfcHdtMV9mcmVxLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9wd20yLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9wd20zLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9wd200LmRldl9hdHRyLmF0dHIsCkBAIC0xMjU2LDcgKzEzNTQsNiBAQAogCWlmIChJU19FUlIoaHdtb25fZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIoaHdtb25fZGV2KTsKIAotCWluaXRfY29tcGxldGlvbigmZGF0YS0+YXV0b191cGRhdGVfc3RvcCk7CiAJZGF0YS0+YXV0b191cGRhdGUgPSBrdGhyZWFkX3J1bihhZHQ3NDcwX3VwZGF0ZV90aHJlYWQsIGNsaWVudCwgIiVzIiwKIAkJCQkJZGV2X25hbWUoaHdtb25fZGV2KSk7CiAJaWYgKElTX0VSUihkYXRhLT5hdXRvX3VwZGF0ZSkpIHsKQEAgLTEyNzEsNyArMTM2OCw2IEBACiAJc3RydWN0IGFkdDc0NzBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCiAJa3RocmVhZF9zdG9wKGRhdGEtPmF1dG9fdXBkYXRlKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkYXRhLT5hdXRvX3VwZGF0ZV9zdG9wKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jIGIvZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jCmluZGV4IGFjZjljMDMuLjM0NzA0YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZGVsbC1zbW0taHdtb24uYworKysgYi9kcml2ZXJzL2h3bW9uL2RlbGwtc21tLWh3bW9uLmMKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMzYsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogCiAjaW5jbHVkZSA8bGludXgvaThrLmg+CiAKQEAgLTEzNCwxMSArMTM2LDExIEBACiAvKgogICogQ2FsbCB0aGUgU3lzdGVtIE1hbmFnZW1lbnQgTW9kZSBCSU9TLiBDb2RlIHByb3ZpZGVkIGJ5IEpvbmF0aGFuIEJ1enphcmQuCiAgKi8KLXN0YXRpYyBpbnQgaThrX3NtbShzdHJ1Y3Qgc21tX3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IGk4a19zbW1fZnVuYyh2b2lkICpwYXIpCiB7CiAJaW50IHJjOworCXN0cnVjdCBzbW1fcmVncyAqcmVncyA9IHBhcjsKIAlpbnQgZWF4ID0gcmVncy0+ZWF4OwotCWNwdW1hc2tfdmFyX3Qgb2xkX21hc2s7CiAKICNpZmRlZiBERUJVRwogCWludCBlYnggPSByZWdzLT5lYng7CkBAIC0xNDksMTYgKzE1MSw4IEBACiAjZW5kaWYKIAogCS8qIFNNTSByZXF1aXJlcyBDUFUgMCAqLwotCWlmICghYWxsb2NfY3B1bWFza192YXIoJm9sZF9tYXNrLCBHRlBfS0VSTkVMKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JY3B1bWFza19jb3B5KG9sZF9tYXNrLCAmY3VycmVudC0+Y3B1c19hbGxvd2VkKTsKLQlyYyA9IHNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIGNwdW1hc2tfb2YoMCkpOwotCWlmIChyYykKLQkJZ290byBvdXQ7Ci0JaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSAwKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOwogCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQogCWFzbSB2b2xhdGlsZSgicHVzaHEgJSVyYXhcblx0IgpAQCAtMjE2LDEwICsyMTAsNiBAQAogCWlmIChyYyAhPSAwIHx8IChyZWdzLT5lYXggJiAweGZmZmYpID09IDB4ZmZmZiB8fCByZWdzLT5lYXggPT0gZWF4KQogCQlyYyA9IC1FSU5WQUw7CiAKLW91dDoKLQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBvbGRfbWFzayk7Ci0JZnJlZV9jcHVtYXNrX3ZhcihvbGRfbWFzayk7Ci0KICNpZmRlZiBERUJVRwogCXJldHRpbWUgPSBrdGltZV9nZXQoKTsKIAlkZWx0YSA9IGt0aW1lX3N1YihyZXR0aW1lLCBjYWxsdGltZSk7CkBAIC0yMzIsNiArMjIyLDIwIEBACiB9CiAKIC8qCisgKiBDYWxsIHRoZSBTeXN0ZW0gTWFuYWdlbWVudCBNb2RlIEJJT1MuCisgKi8KK3N0YXRpYyBpbnQgaThrX3NtbShzdHJ1Y3Qgc21tX3JlZ3MgKnJlZ3MpCit7CisJaW50IHJldDsKKworCWdldF9vbmxpbmVfY3B1cygpOworCXJldCA9IHNtcF9jYWxsX29uX2NwdSgwLCBpOGtfc21tX2Z1bmMsIHJlZ3MsIHRydWUpOworCXB1dF9vbmxpbmVfY3B1cygpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKICAqIFJlYWQgdGhlIGZhbiBzdGF0dXMuCiAgKi8KIHN0YXRpYyBpbnQgaThrX2dldF9mYW5fc3RhdHVzKGludCBmYW4pCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2Z0c3RldXRhdGVzLmMgYi9kcml2ZXJzL2h3bW9uL2Z0c3RldXRhdGVzLmMKaW5kZXggNDg2MzNlNS4uMGYwMjc3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9mdHN0ZXV0YXRlcy5jCisrKyBiL2RyaXZlcnMvaHdtb24vZnRzdGV1dGF0ZXMuYwpAQCAtMzYsNiArMzYsMTAgQEAKICNkZWZpbmUgRlRTX0VWRU5UX1NUQVRVU19SRUcJCTB4MDAwNgogI2RlZmluZSBGVFNfR0xPQkFMX0NPTlRST0xfUkVHCQkweDAwMDcKIAorI2RlZmluZSBGVFNfREVWSUNFX0RFVEVDVF9SRUdfMQkJMHgwQworI2RlZmluZSBGVFNfREVWSUNFX0RFVEVDVF9SRUdfMgkJMHgwRAorI2RlZmluZSBGVFNfREVWSUNFX0RFVEVDVF9SRUdfMwkJMHgwRQorCiAjZGVmaW5lIEZUU19TRU5TT1JfRVZFTlRfUkVHCQkweDAwMTAKIAogI2RlZmluZSBGVFNfRkFOX0VWRU5UX1JFRwkJMHgwMDE0CkBAIC01NCw2ICs1OCw4IEBACiAjZGVmaW5lIEZUU19OT19URU1QX1NFTlNPUlMJCTB4MTAKICNkZWZpbmUgRlRTX05PX1ZPTFRfU0VOU09SUwkJMHgwNAogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDczLCBJMkNfQ0xJRU5UX0VORCB9OworCiBzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgZnRzX2lkW10gPSB7CiAJeyAiZnRzdGV1dGF0ZXMiLCAwIH0sCiAJeyB9CkBAIC03MzQsNiArNzQwLDQyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gLyByZW1vdmUgZnVuY3Rpb25zCQkJCSAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZnRzX2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkgICAgICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCit7CisJaW50IHZhbDsKKworCS8qIGRldGVjdGlvbiB3b3JrcyB3aXRoIHJldnNpb24gZ3JlYXRlciBvciBlcXVhbCB0byAweDJiICovCisJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRlRTX0RFVklDRV9SRVZJU0lPTl9SRUcpOworCWlmICh2YWwgPCAweDJiKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIERldmljZSBEZXRlY3QgUmVncyBtdXN0IGhhdmUgMHgxNyAweDM0IGFuZCAweDU0ICovCisJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRlRTX0RFVklDRV9ERVRFQ1RfUkVHXzEpOworCWlmICh2YWwgIT0gMHgxNykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBGVFNfREVWSUNFX0RFVEVDVF9SRUdfMik7CisJaWYgKHZhbCAhPSAweDM0KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEZUU19ERVZJQ0VfREVURUNUX1JFR18zKTsKKwlpZiAodmFsICE9IDB4NTQpCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKwkgKiAweDEwID09IEJhc2Vib2FyZCBNYW5hZ2VtZW50IENvbnRyb2xsZXIsIDB4MDEgPT0gVGV1dGF0ZXMKKwkgKiBEZXZpY2UgSUQgUmVnIG5lZWRzIHRvIGJlIDB4MTEKKwkgKi8KKwl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBGVFNfREVWSUNFX0lEX1JFRyk7CisJaWYgKHZhbCAhPSAweDExKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN0cmxjcHkoaW5mby0+dHlwZSwgZnRzX2lkWzBdLm5hbWUsIEkyQ19OQU1FX1NJWkUpOworCWluZm8tPmZsYWdzID0gMDsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBmdHNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IGZ0c19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKCZjbGllbnQtPmRldik7CkBAIC04MDQsMTIgKzg0NiwxNSBAQAogLyogTW9kdWxlIERldGFpbHMJCQkJCQkJICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGZ0c19kcml2ZXIgPSB7CisJLmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gImZ0c3RldXRhdGVzIiwKIAl9LAogCS5pZF90YWJsZSA9IGZ0c19pZCwKIAkucHJvYmUgPSBmdHNfcHJvYmUsCiAJLnJlbW92ZSA9IGZ0c19yZW1vdmUsCisJLmRldGVjdCA9IGZ0c19kZXRlY3QsCisJLmFkZHJlc3NfbGlzdCA9IG5vcm1hbF9pMmMsCiB9OwogCiBtb2R1bGVfaTJjX2RyaXZlcihmdHNfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaHdtb24uYyBiL2RyaXZlcnMvaHdtb24vaHdtb24uYwppbmRleCBhMjZjMzg1Li5hZGFlNjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2h3bW9uLmMKKysrIGIvZHJpdmVycy9od21vbi9od21vbi5jCkBAIC0xMiwxNyArMTIsMTcgQEAKIAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lkci5oPgotI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aGVybWFsLmg+CiAKICNkZWZpbmUgSFdNT05fSURfUFJFRklYICJod21vbiIKICNkZWZpbmUgSFdNT05fSURfRk9STUFUIEhXTU9OX0lEX1BSRUZJWCAiJWQiCkBAIC0zMCw5ICszMCwzNSBAQAogc3RydWN0IGh3bW9uX2RldmljZSB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAlzdHJ1Y3QgZGV2aWNlIGRldjsKKwljb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvICpjaGlwOworCisJc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBncm91cDsKKwljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzOwogfTsKKwogI2RlZmluZSB0b19od21vbl9kZXZpY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBod21vbl9kZXZpY2UsIGRldikKIAorc3RydWN0IGh3bW9uX2RldmljZV9hdHRyaWJ1dGUgeworCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyOworCWNvbnN0IHN0cnVjdCBod21vbl9vcHMgKm9wczsKKwllbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlOworCXUzMiBhdHRyOworCWludCBpbmRleDsKK307CisKKyNkZWZpbmUgdG9faHdtb25fYXR0cihkKSBcCisJY29udGFpbmVyX29mKGQsIHN0cnVjdCBod21vbl9kZXZpY2VfYXR0cmlidXRlLCBkZXZfYXR0cikKKworLyoKKyAqIFRoZXJtYWwgem9uZSBpbmZvcm1hdGlvbgorICogSW4gYWRkaXRpb24gdG8gdGhlIHJlZmVyZW5jZSB0byB0aGUgaHdtb24gZGV2aWNlLAorICogYWxzbyBwcm92aWRlcyB0aGUgc2Vuc29yIGluZGV4LgorICovCitzdHJ1Y3QgaHdtb25fdGhlcm1hbF9kYXRhIHsKKwlzdHJ1Y3QgaHdtb25fZGV2aWNlICpod2RldjsJLyogUmVmZXJlbmNlIHRvIGh3bW9uIGRldmljZSAqLworCWludCBpbmRleDsJCQkvKiBzZW5zb3IgaW5kZXggKi8KK307CisKIHN0YXRpYyBzc2l6ZV90CiBzaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewpAQCAtODAsNiArMTA2LDQ5OCBAQAogCiBzdGF0aWMgREVGSU5FX0lEQShod21vbl9pZGEpOwogCisvKiBUaGVybWFsIHpvbmUgaGFuZGxpbmcgKi8KKworLyoKKyAqIFRoZSBjb21wbGV4IGNvbmRpdGlvbmFsIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBhIGN5Y2xpYyBkZXBlbmRlbmN5CisgKiBiZXR3ZWVuIGh3bW9uIGFuZCB0aGVybWFsX3N5cyBtb2R1bGVzLgorICovCisjaWYgSVNfUkVBQ0hBQkxFKENPTkZJR19USEVSTUFMKSAmJiBkZWZpbmVkKENPTkZJR19USEVSTUFMX09GKSAmJiBcCisJKCFkZWZpbmVkKENPTkZJR19USEVSTUFMX0hXTU9OKSB8fCBcCisJICEoZGVmaW5lZChNT0RVTEUpICYmIElTX01PRFVMRShDT05GSUdfVEhFUk1BTCkpKQorc3RhdGljIGludCBod21vbl90aGVybWFsX2dldF90ZW1wKHZvaWQgKmRhdGEsIGludCAqdGVtcCkKK3sKKwlzdHJ1Y3QgaHdtb25fdGhlcm1hbF9kYXRhICp0ZGF0YSA9IGRhdGE7CisJc3RydWN0IGh3bW9uX2RldmljZSAqaHdkZXYgPSB0ZGF0YS0+aHdkZXY7CisJaW50IHJldDsKKwlsb25nIHQ7CisKKwlyZXQgPSBod2Rldi0+Y2hpcC0+b3BzLT5yZWFkKCZod2Rldi0+ZGV2LCBod21vbl90ZW1wLCBod21vbl90ZW1wX2lucHV0LAorCQkJCSAgICAgdGRhdGEtPmluZGV4LCAmdCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkqdGVtcCA9IHQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0aGVybWFsX3pvbmVfb2ZfZGV2aWNlX29wcyBod21vbl90aGVybWFsX29wcyA9IHsKKwkuZ2V0X3RlbXAgPSBod21vbl90aGVybWFsX2dldF90ZW1wLAorfTsKKworc3RhdGljIGludCBod21vbl90aGVybWFsX2FkZF9zZW5zb3Ioc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgaHdtb25fZGV2aWNlICpod2RldiwgaW50IGluZGV4KQoreworCXN0cnVjdCBod21vbl90aGVybWFsX2RhdGEgKnRkYXRhOworCisJdGRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnRkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0ZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0ZGF0YS0+aHdkZXYgPSBod2RldjsKKwl0ZGF0YS0+aW5kZXggPSBpbmRleDsKKworCWRldm1fdGhlcm1hbF96b25lX29mX3NlbnNvcl9yZWdpc3RlcigmaHdkZXYtPmRldiwgaW5kZXgsIHRkYXRhLAorCQkJCQkgICAgICZod21vbl90aGVybWFsX29wcyk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW50IGh3bW9uX3RoZXJtYWxfYWRkX3NlbnNvcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBod21vbl9kZXZpY2UgKmh3ZGV2LCBpbnQgaW5kZXgpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogSVNfUkVBQ0hBQkxFKENPTkZJR19USEVSTUFMKSAmJiAuLi4gKi8KKworLyogc3lzZnMgYXR0cmlidXRlIG1hbmFnZW1lbnQgKi8KKworc3RhdGljIHNzaXplX3QgaHdtb25fYXR0cl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBod21vbl9kZXZpY2VfYXR0cmlidXRlICpoYXR0ciA9IHRvX2h3bW9uX2F0dHIoZGV2YXR0cik7CisJbG9uZyB2YWw7CisJaW50IHJldDsKKworCXJldCA9IGhhdHRyLT5vcHMtPnJlYWQoZGV2LCBoYXR0ci0+dHlwZSwgaGF0dHItPmF0dHIsIGhhdHRyLT5pbmRleCwKKwkJCSAgICAgICAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgaHdtb25fYXR0cl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGh3bW9uX2RldmljZV9hdHRyaWJ1dGUgKmhhdHRyID0gdG9faHdtb25fYXR0cihkZXZhdHRyKTsKKwlsb25nIHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0ga3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGhhdHRyLT5vcHMtPndyaXRlKGRldiwgaGF0dHItPnR5cGUsIGhhdHRyLT5hdHRyLCBoYXR0ci0+aW5kZXgsCisJCQkJdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBod21vbl9hdHRyX2Jhc2UoZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSkKK3sKKwlpZiAodHlwZSA9PSBod21vbl9pbikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpod21vbl9nZW5hdHRyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgY29uc3Qgdm9pZCAqZHJ2ZGF0YSwKKwkJCQkgICAgICAgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCQkgICAgICAgdTMyIGF0dHIsCisJCQkJICAgICAgIGludCBpbmRleCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqdGVtcGxhdGUsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBod21vbl9vcHMgKm9wcykKK3sKKwlzdHJ1Y3QgaHdtb25fZGV2aWNlX2F0dHJpYnV0ZSAqaGF0dHI7CisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhdHRyOworCXN0cnVjdCBhdHRyaWJ1dGUgKmE7CisJdW1vZGVfdCBtb2RlOworCWNoYXIgKm5hbWU7CisKKwkvKiBUaGUgYXR0cmlidXRlIGlzIGludmlzaWJsZSBpZiB0aGVyZSBpcyBubyB0ZW1wbGF0ZSBzdHJpbmcgKi8KKwlpZiAoIXRlbXBsYXRlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKworCW1vZGUgPSBvcHMtPmlzX3Zpc2libGUoZHJ2ZGF0YSwgdHlwZSwgYXR0ciwgaW5kZXgpOworCWlmICghbW9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisKKwlpZiAoKG1vZGUgJiBTX0lSVUdPKSAmJiAhb3BzLT5yZWFkKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlpZiAoKG1vZGUgJiBTX0lXVUdPKSAmJiAhb3BzLT53cml0ZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlpZiAodHlwZSA9PSBod21vbl9jaGlwKSB7CisJCW5hbWUgPSAoY2hhciAqKXRlbXBsYXRlOworCX0gZWxzZSB7CisJCW5hbWUgPSBkZXZtX2t6YWxsb2MoZGV2LCBzdHJsZW4odGVtcGxhdGUpICsgMTYsIEdGUF9LRVJORUwpOworCQlpZiAoIW5hbWUpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJc2NucHJpbnRmKG5hbWUsIHN0cmxlbih0ZW1wbGF0ZSkgKyAxNiwgdGVtcGxhdGUsCisJCQkgIGluZGV4ICsgaHdtb25fYXR0cl9iYXNlKHR5cGUpKTsKKwl9CisKKwloYXR0ciA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaGF0dHIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhhdHRyKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWhhdHRyLT50eXBlID0gdHlwZTsKKwloYXR0ci0+YXR0ciA9IGF0dHI7CisJaGF0dHItPmluZGV4ID0gaW5kZXg7CisJaGF0dHItPm9wcyA9IG9wczsKKworCWRhdHRyID0gJmhhdHRyLT5kZXZfYXR0cjsKKwlkYXR0ci0+c2hvdyA9IGh3bW9uX2F0dHJfc2hvdzsKKwlkYXR0ci0+c3RvcmUgPSBod21vbl9hdHRyX3N0b3JlOworCisJYSA9ICZkYXR0ci0+YXR0cjsKKwlzeXNmc19hdHRyX2luaXQoYSk7CisJYS0+bmFtZSA9IG5hbWU7CisJYS0+bW9kZSA9IG1vZGU7CisKKwlyZXR1cm4gYTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBod21vbl9jaGlwX2F0dHJfdGVtcGxhdGVzW10gPSB7CisJW2h3bW9uX2NoaXBfdGVtcF9yZXNldF9oaXN0b3J5XSA9ICJ0ZW1wX3Jlc2V0X2hpc3RvcnkiLAorCVtod21vbl9jaGlwX2luX3Jlc2V0X2hpc3RvcnldID0gImluX3Jlc2V0X2hpc3RvcnkiLAorCVtod21vbl9jaGlwX2N1cnJfcmVzZXRfaGlzdG9yeV0gPSAiY3Vycl9yZXNldF9oaXN0b3J5IiwKKwlbaHdtb25fY2hpcF9wb3dlcl9yZXNldF9oaXN0b3J5XSA9ICJwb3dlcl9yZXNldF9oaXN0b3J5IiwKKwlbaHdtb25fY2hpcF91cGRhdGVfaW50ZXJ2YWxdID0gInVwZGF0ZV9pbnRlcnZhbCIsCisJW2h3bW9uX2NoaXBfYWxhcm1zXSA9ICJhbGFybXMiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBod21vbl90ZW1wX2F0dHJfdGVtcGxhdGVzW10gPSB7CisJW2h3bW9uX3RlbXBfaW5wdXRdID0gInRlbXAlZF9pbnB1dCIsCisJW2h3bW9uX3RlbXBfdHlwZV0gPSAidGVtcCVkX3R5cGUiLAorCVtod21vbl90ZW1wX2xjcml0XSA9ICJ0ZW1wJWRfbGNyaXQiLAorCVtod21vbl90ZW1wX2xjcml0X2h5c3RdID0gInRlbXAlZF9sY3JpdF9oeXN0IiwKKwlbaHdtb25fdGVtcF9taW5dID0gInRlbXAlZF9taW4iLAorCVtod21vbl90ZW1wX21pbl9oeXN0XSA9ICJ0ZW1wJWRfbWluX2h5c3QiLAorCVtod21vbl90ZW1wX21heF0gPSAidGVtcCVkX21heCIsCisJW2h3bW9uX3RlbXBfbWF4X2h5c3RdID0gInRlbXAlZF9tYXhfaHlzdCIsCisJW2h3bW9uX3RlbXBfY3JpdF0gPSAidGVtcCVkX2NyaXQiLAorCVtod21vbl90ZW1wX2NyaXRfaHlzdF0gPSAidGVtcCVkX2NyaXRfaHlzdCIsCisJW2h3bW9uX3RlbXBfZW1lcmdlbmN5XSA9ICJ0ZW1wJWRfZW1lcmdlbmN5IiwKKwlbaHdtb25fdGVtcF9lbWVyZ2VuY3lfaHlzdF0gPSAidGVtcCVkX2VtZXJnZW5jeV9oeXN0IiwKKwlbaHdtb25fdGVtcF9hbGFybV0gPSAidGVtcCVkX2FsYXJtIiwKKwlbaHdtb25fdGVtcF9sY3JpdF9hbGFybV0gPSAidGVtcCVkX2xjcml0X2FsYXJtIiwKKwlbaHdtb25fdGVtcF9taW5fYWxhcm1dID0gInRlbXAlZF9taW5fYWxhcm0iLAorCVtod21vbl90ZW1wX21heF9hbGFybV0gPSAidGVtcCVkX21heF9hbGFybSIsCisJW2h3bW9uX3RlbXBfY3JpdF9hbGFybV0gPSAidGVtcCVkX2NyaXRfYWxhcm0iLAorCVtod21vbl90ZW1wX2VtZXJnZW5jeV9hbGFybV0gPSAidGVtcCVkX2VtZXJnZW5jeV9hbGFybSIsCisJW2h3bW9uX3RlbXBfZmF1bHRdID0gInRlbXAlZF9mYXVsdCIsCisJW2h3bW9uX3RlbXBfb2Zmc2V0XSA9ICJ0ZW1wJWRfb2Zmc2V0IiwKKwlbaHdtb25fdGVtcF9sYWJlbF0gPSAidGVtcCVkX2xhYmVsIiwKKwlbaHdtb25fdGVtcF9sb3dlc3RdID0gInRlbXAlZF9sb3dlc3QiLAorCVtod21vbl90ZW1wX2hpZ2hlc3RdID0gInRlbXAlZF9oaWdoZXN0IiwKKwlbaHdtb25fdGVtcF9yZXNldF9oaXN0b3J5XSA9ICJ0ZW1wJWRfcmVzZXRfaGlzdG9yeSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGh3bW9uX2luX2F0dHJfdGVtcGxhdGVzW10gPSB7CisJW2h3bW9uX2luX2lucHV0XSA9ICJpbiVkX2lucHV0IiwKKwlbaHdtb25faW5fbWluXSA9ICJpbiVkX21pbiIsCisJW2h3bW9uX2luX21heF0gPSAiaW4lZF9tYXgiLAorCVtod21vbl9pbl9sY3JpdF0gPSAiaW4lZF9sY3JpdCIsCisJW2h3bW9uX2luX2NyaXRdID0gImluJWRfY3JpdCIsCisJW2h3bW9uX2luX2F2ZXJhZ2VdID0gImluJWRfYXZlcmFnZSIsCisJW2h3bW9uX2luX2xvd2VzdF0gPSAiaW4lZF9sb3dlc3QiLAorCVtod21vbl9pbl9oaWdoZXN0XSA9ICJpbiVkX2hpZ2hlc3QiLAorCVtod21vbl9pbl9yZXNldF9oaXN0b3J5XSA9ICJpbiVkX3Jlc2V0X2hpc3RvcnkiLAorCVtod21vbl9pbl9sYWJlbF0gPSAiaW4lZF9sYWJlbCIsCisJW2h3bW9uX2luX2FsYXJtXSA9ICJpbiVkX2FsYXJtIiwKKwlbaHdtb25faW5fbWluX2FsYXJtXSA9ICJpbiVkX21pbl9hbGFybSIsCisJW2h3bW9uX2luX21heF9hbGFybV0gPSAiaW4lZF9tYXhfYWxhcm0iLAorCVtod21vbl9pbl9sY3JpdF9hbGFybV0gPSAiaW4lZF9sY3JpdF9hbGFybSIsCisJW2h3bW9uX2luX2NyaXRfYWxhcm1dID0gImluJWRfY3JpdF9hbGFybSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGh3bW9uX2N1cnJfYXR0cl90ZW1wbGF0ZXNbXSA9IHsKKwlbaHdtb25fY3Vycl9pbnB1dF0gPSAiY3VyciVkX2lucHV0IiwKKwlbaHdtb25fY3Vycl9taW5dID0gImN1cnIlZF9taW4iLAorCVtod21vbl9jdXJyX21heF0gPSAiY3VyciVkX21heCIsCisJW2h3bW9uX2N1cnJfbGNyaXRdID0gImN1cnIlZF9sY3JpdCIsCisJW2h3bW9uX2N1cnJfY3JpdF0gPSAiY3VyciVkX2NyaXQiLAorCVtod21vbl9jdXJyX2F2ZXJhZ2VdID0gImN1cnIlZF9hdmVyYWdlIiwKKwlbaHdtb25fY3Vycl9sb3dlc3RdID0gImN1cnIlZF9sb3dlc3QiLAorCVtod21vbl9jdXJyX2hpZ2hlc3RdID0gImN1cnIlZF9oaWdoZXN0IiwKKwlbaHdtb25fY3Vycl9yZXNldF9oaXN0b3J5XSA9ICJjdXJyJWRfcmVzZXRfaGlzdG9yeSIsCisJW2h3bW9uX2N1cnJfbGFiZWxdID0gImN1cnIlZF9sYWJlbCIsCisJW2h3bW9uX2N1cnJfYWxhcm1dID0gImN1cnIlZF9hbGFybSIsCisJW2h3bW9uX2N1cnJfbWluX2FsYXJtXSA9ICJjdXJyJWRfbWluX2FsYXJtIiwKKwlbaHdtb25fY3Vycl9tYXhfYWxhcm1dID0gImN1cnIlZF9tYXhfYWxhcm0iLAorCVtod21vbl9jdXJyX2xjcml0X2FsYXJtXSA9ICJjdXJyJWRfbGNyaXRfYWxhcm0iLAorCVtod21vbl9jdXJyX2NyaXRfYWxhcm1dID0gImN1cnIlZF9jcml0X2FsYXJtIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaHdtb25fcG93ZXJfYXR0cl90ZW1wbGF0ZXNbXSA9IHsKKwlbaHdtb25fcG93ZXJfYXZlcmFnZV0gPSAicG93ZXIlZF9hdmVyYWdlIiwKKwlbaHdtb25fcG93ZXJfYXZlcmFnZV9pbnRlcnZhbF0gPSAicG93ZXIlZF9hdmVyYWdlX2ludGVydmFsIiwKKwlbaHdtb25fcG93ZXJfYXZlcmFnZV9pbnRlcnZhbF9tYXhdID0gInBvd2VyJWRfaW50ZXJ2YWxfbWF4IiwKKwlbaHdtb25fcG93ZXJfYXZlcmFnZV9pbnRlcnZhbF9taW5dID0gInBvd2VyJWRfaW50ZXJ2YWxfbWluIiwKKwlbaHdtb25fcG93ZXJfYXZlcmFnZV9oaWdoZXN0XSA9ICJwb3dlciVkX2F2ZXJhZ2VfaGlnaGVzdCIsCisJW2h3bW9uX3Bvd2VyX2F2ZXJhZ2VfbG93ZXN0XSA9ICJwb3dlciVkX2F2ZXJhZ2VfbG93ZXN0IiwKKwlbaHdtb25fcG93ZXJfYXZlcmFnZV9tYXhdID0gInBvd2VyJWRfYXZlcmFnZV9tYXgiLAorCVtod21vbl9wb3dlcl9hdmVyYWdlX21pbl0gPSAicG93ZXIlZF9hdmVyYWdlX21pbiIsCisJW2h3bW9uX3Bvd2VyX2lucHV0XSA9ICJwb3dlciVkX2lucHV0IiwKKwlbaHdtb25fcG93ZXJfaW5wdXRfaGlnaGVzdF0gPSAicG93ZXIlZF9pbnB1dF9oaWdoZXN0IiwKKwlbaHdtb25fcG93ZXJfaW5wdXRfbG93ZXN0XSA9ICJwb3dlciVkX2lucHV0X2xvd2VzdCIsCisJW2h3bW9uX3Bvd2VyX3Jlc2V0X2hpc3RvcnldID0gInBvd2VyJWRfcmVzZXRfaGlzdG9yeSIsCisJW2h3bW9uX3Bvd2VyX2FjY3VyYWN5XSA9ICJwb3dlciVkX2FjY3VyYWN5IiwKKwlbaHdtb25fcG93ZXJfY2FwXSA9ICJwb3dlciVkX2NhcCIsCisJW2h3bW9uX3Bvd2VyX2NhcF9oeXN0XSA9ICJwb3dlciVkX2NhcF9oeXN0IiwKKwlbaHdtb25fcG93ZXJfY2FwX21heF0gPSAicG93ZXIlZF9jYXBfbWF4IiwKKwlbaHdtb25fcG93ZXJfY2FwX21pbl0gPSAicG93ZXIlZF9jYXBfbWluIiwKKwlbaHdtb25fcG93ZXJfbWF4XSA9ICJwb3dlciVkX21heCIsCisJW2h3bW9uX3Bvd2VyX2NyaXRdID0gInBvd2VyJWRfY3JpdCIsCisJW2h3bW9uX3Bvd2VyX2xhYmVsXSA9ICJwb3dlciVkX2xhYmVsIiwKKwlbaHdtb25fcG93ZXJfYWxhcm1dID0gInBvd2VyJWRfYWxhcm0iLAorCVtod21vbl9wb3dlcl9jYXBfYWxhcm1dID0gInBvd2VyJWRfY2FwX2FsYXJtIiwKKwlbaHdtb25fcG93ZXJfbWF4X2FsYXJtXSA9ICJwb3dlciVkX21heF9hbGFybSIsCisJW2h3bW9uX3Bvd2VyX2NyaXRfYWxhcm1dID0gInBvd2VyJWRfY3JpdF9hbGFybSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGh3bW9uX2VuZXJneV9hdHRyX3RlbXBsYXRlc1tdID0geworCVtod21vbl9lbmVyZ3lfaW5wdXRdID0gImVuZXJneSVkX2lucHV0IiwKKwlbaHdtb25fZW5lcmd5X2xhYmVsXSA9ICJlbmVyZ3klZF9sYWJlbCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGh3bW9uX2h1bWlkaXR5X2F0dHJfdGVtcGxhdGVzW10gPSB7CisJW2h3bW9uX2h1bWlkaXR5X2lucHV0XSA9ICJodW1pZGl0eSVkX2lucHV0IiwKKwlbaHdtb25faHVtaWRpdHlfbGFiZWxdID0gImh1bWlkaXR5JWRfbGFiZWwiLAorCVtod21vbl9odW1pZGl0eV9taW5dID0gImh1bWlkaXR5JWRfbWluIiwKKwlbaHdtb25faHVtaWRpdHlfbWluX2h5c3RdID0gImh1bWlkaXR5JWRfbWluX2h5c3QiLAorCVtod21vbl9odW1pZGl0eV9tYXhdID0gImh1bWlkaXR5JWRfbWF4IiwKKwlbaHdtb25faHVtaWRpdHlfbWF4X2h5c3RdID0gImh1bWlkaXR5JWRfbWF4X2h5c3QiLAorCVtod21vbl9odW1pZGl0eV9hbGFybV0gPSAiaHVtaWRpdHklZF9hbGFybSIsCisJW2h3bW9uX2h1bWlkaXR5X2ZhdWx0XSA9ICJodW1pZGl0eSVkX2ZhdWx0IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaHdtb25fZmFuX2F0dHJfdGVtcGxhdGVzW10gPSB7CisJW2h3bW9uX2Zhbl9pbnB1dF0gPSAiZmFuJWRfaW5wdXQiLAorCVtod21vbl9mYW5fbGFiZWxdID0gImZhbiVkX2xhYmVsIiwKKwlbaHdtb25fZmFuX21pbl0gPSAiZmFuJWRfbWluIiwKKwlbaHdtb25fZmFuX21heF0gPSAiZmFuJWRfbWF4IiwKKwlbaHdtb25fZmFuX2Rpdl0gPSAiZmFuJWRfZGl2IiwKKwlbaHdtb25fZmFuX3B1bHNlc10gPSAiZmFuJWRfcHVsc2VzIiwKKwlbaHdtb25fZmFuX3RhcmdldF0gPSAiZmFuJWRfdGFyZ2V0IiwKKwlbaHdtb25fZmFuX2FsYXJtXSA9ICJmYW4lZF9hbGFybSIsCisJW2h3bW9uX2Zhbl9taW5fYWxhcm1dID0gImZhbiVkX21pbl9hbGFybSIsCisJW2h3bW9uX2Zhbl9tYXhfYWxhcm1dID0gImZhbiVkX21heF9hbGFybSIsCisJW2h3bW9uX2Zhbl9mYXVsdF0gPSAiZmFuJWRfZmF1bHQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBod21vbl9wd21fYXR0cl90ZW1wbGF0ZXNbXSA9IHsKKwlbaHdtb25fcHdtX2lucHV0XSA9ICJwd20lZCIsCisJW2h3bW9uX3B3bV9lbmFibGVdID0gInB3bSVkX2VuYWJsZSIsCisJW2h3bW9uX3B3bV9tb2RlXSA9ICJwd20lZF9tb2RlIiwKKwlbaHdtb25fcHdtX2ZyZXFdID0gInB3bSVkX2ZyZXEiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCAqX190ZW1wbGF0ZXNbXSA9IHsKKwlbaHdtb25fY2hpcF0gPSBod21vbl9jaGlwX2F0dHJfdGVtcGxhdGVzLAorCVtod21vbl90ZW1wXSA9IGh3bW9uX3RlbXBfYXR0cl90ZW1wbGF0ZXMsCisJW2h3bW9uX2luXSA9IGh3bW9uX2luX2F0dHJfdGVtcGxhdGVzLAorCVtod21vbl9jdXJyXSA9IGh3bW9uX2N1cnJfYXR0cl90ZW1wbGF0ZXMsCisJW2h3bW9uX3Bvd2VyXSA9IGh3bW9uX3Bvd2VyX2F0dHJfdGVtcGxhdGVzLAorCVtod21vbl9lbmVyZ3ldID0gaHdtb25fZW5lcmd5X2F0dHJfdGVtcGxhdGVzLAorCVtod21vbl9odW1pZGl0eV0gPSBod21vbl9odW1pZGl0eV9hdHRyX3RlbXBsYXRlcywKKwlbaHdtb25fZmFuXSA9IGh3bW9uX2Zhbl9hdHRyX3RlbXBsYXRlcywKKwlbaHdtb25fcHdtXSA9IGh3bW9uX3B3bV9hdHRyX3RlbXBsYXRlcywKK307CisKK3N0YXRpYyBjb25zdCBpbnQgX190ZW1wbGF0ZXNfc2l6ZVtdID0geworCVtod21vbl9jaGlwXSA9IEFSUkFZX1NJWkUoaHdtb25fY2hpcF9hdHRyX3RlbXBsYXRlcyksCisJW2h3bW9uX3RlbXBdID0gQVJSQVlfU0laRShod21vbl90ZW1wX2F0dHJfdGVtcGxhdGVzKSwKKwlbaHdtb25faW5dID0gQVJSQVlfU0laRShod21vbl9pbl9hdHRyX3RlbXBsYXRlcyksCisJW2h3bW9uX2N1cnJdID0gQVJSQVlfU0laRShod21vbl9jdXJyX2F0dHJfdGVtcGxhdGVzKSwKKwlbaHdtb25fcG93ZXJdID0gQVJSQVlfU0laRShod21vbl9wb3dlcl9hdHRyX3RlbXBsYXRlcyksCisJW2h3bW9uX2VuZXJneV0gPSBBUlJBWV9TSVpFKGh3bW9uX2VuZXJneV9hdHRyX3RlbXBsYXRlcyksCisJW2h3bW9uX2h1bWlkaXR5XSA9IEFSUkFZX1NJWkUoaHdtb25faHVtaWRpdHlfYXR0cl90ZW1wbGF0ZXMpLAorCVtod21vbl9mYW5dID0gQVJSQVlfU0laRShod21vbl9mYW5fYXR0cl90ZW1wbGF0ZXMpLAorCVtod21vbl9wd21dID0gQVJSQVlfU0laRShod21vbl9wd21fYXR0cl90ZW1wbGF0ZXMpLAorfTsKKworc3RhdGljIGludCBod21vbl9udW1fY2hhbm5lbF9hdHRycyhjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICppbmZvKQoreworCWludCBpLCBuOworCisJZm9yIChpID0gbiA9IDA7IGluZm8tPmNvbmZpZ1tpXTsgaSsrKQorCQluICs9IGh3ZWlnaHQzMihpbmZvLT5jb25maWdbaV0pOworCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgaHdtb25fZ2VuYXR0cnMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICBjb25zdCB2b2lkICpkcnZkYXRhLAorCQkJICBzdHJ1Y3QgYXR0cmlidXRlICoqYXR0cnMsCisJCQkgIGNvbnN0IHN0cnVjdCBod21vbl9vcHMgKm9wcywKKwkJCSAgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqaW5mbykKK3sKKwljb25zdCBjaGFyICogY29uc3QgKnRlbXBsYXRlczsKKwlpbnQgdGVtcGxhdGVfc2l6ZTsKKwlpbnQgaSwgYWluZGV4ID0gMDsKKworCWlmIChpbmZvLT50eXBlID49IEFSUkFZX1NJWkUoX190ZW1wbGF0ZXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRlbXBsYXRlcyA9IF9fdGVtcGxhdGVzW2luZm8tPnR5cGVdOworCXRlbXBsYXRlX3NpemUgPSBfX3RlbXBsYXRlc19zaXplW2luZm8tPnR5cGVdOworCisJZm9yIChpID0gMDsgaW5mby0+Y29uZmlnW2ldOyBpKyspIHsKKwkJdTMyIGF0dHJfbWFzayA9IGluZm8tPmNvbmZpZ1tpXTsKKwkJdTMyIGF0dHI7CisKKwkJd2hpbGUgKGF0dHJfbWFzaykgeworCQkJc3RydWN0IGF0dHJpYnV0ZSAqYTsKKworCQkJYXR0ciA9IF9fZmZzKGF0dHJfbWFzayk7CisJCQlhdHRyX21hc2sgJj0gfkJJVChhdHRyKTsKKwkJCWlmIChhdHRyID49IHRlbXBsYXRlX3NpemUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlhID0gaHdtb25fZ2VuYXR0cihkZXYsIGRydmRhdGEsIGluZm8tPnR5cGUsIGF0dHIsIGksCisJCQkJCSAgdGVtcGxhdGVzW2F0dHJdLCBvcHMpOworCQkJaWYgKElTX0VSUihhKSkgeworCQkJCWlmIChQVFJfRVJSKGEpICE9IC1FTk9FTlQpCisJCQkJCXJldHVybiBQVFJfRVJSKGEpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYXR0cnNbYWluZGV4KytdID0gYTsKKwkJfQorCX0KKwlyZXR1cm4gYWluZGV4OworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqKgorX19od21vbl9jcmVhdGVfYXR0cnMoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCB2b2lkICpkcnZkYXRhLAorCQkgICAgIGNvbnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gKmNoaXApCit7CisJaW50IHJldCwgaSwgYWluZGV4ID0gMCwgbmF0dHJzID0gMDsKKwlzdHJ1Y3QgYXR0cmlidXRlICoqYXR0cnM7CisKKwlmb3IgKGkgPSAwOyBjaGlwLT5pbmZvW2ldOyBpKyspCisJCW5hdHRycyArPSBod21vbl9udW1fY2hhbm5lbF9hdHRycyhjaGlwLT5pbmZvW2ldKTsKKworCWlmIChuYXR0cnMgPT0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlhdHRycyA9IGRldm1fa2NhbGxvYyhkZXYsIG5hdHRycyArIDEsIHNpemVvZigqYXR0cnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWF0dHJzKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWZvciAoaSA9IDA7IGNoaXAtPmluZm9baV07IGkrKykgeworCQlyZXQgPSBod21vbl9nZW5hdHRycyhkZXYsIGRydmRhdGEsICZhdHRyc1thaW5kZXhdLCBjaGlwLT5vcHMsCisJCQkJICAgICBjaGlwLT5pbmZvW2ldKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCQlhaW5kZXggKz0gcmV0OworCX0KKworCXJldHVybiBhdHRyczsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2UgKgorX19od21vbl9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkcnZkYXRhLAorCQkJY29uc3Qgc3RydWN0IGh3bW9uX2NoaXBfaW5mbyAqY2hpcCwKKwkJCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpCit7CisJc3RydWN0IGh3bW9uX2RldmljZSAqaHdkZXY7CisJc3RydWN0IGRldmljZSAqaGRldjsKKwlpbnQgaSwgaiwgZXJyLCBpZDsKKworCS8qIERvIG5vdCBhY2NlcHQgaW52YWxpZCBjaGFyYWN0ZXJzIGluIGh3bW9uIG5hbWUgYXR0cmlidXRlICovCisJaWYgKG5hbWUgJiYgKCFzdHJsZW4obmFtZSkgfHwgc3RycGJyayhuYW1lLCAiLSogXHRcbiIpKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlpZCA9IGlkYV9zaW1wbGVfZ2V0KCZod21vbl9pZGEsIDAsIDAsIEdGUF9LRVJORUwpOworCWlmIChpZCA8IDApCisJCXJldHVybiBFUlJfUFRSKGlkKTsKKworCWh3ZGV2ID0ga3phbGxvYyhzaXplb2YoKmh3ZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGh3ZGV2ID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBpZGFfcmVtb3ZlOworCX0KKworCWhkZXYgPSAmaHdkZXYtPmRldjsKKworCWlmIChjaGlwICYmIGNoaXAtPm9wcy0+aXNfdmlzaWJsZSkgeworCQlzdHJ1Y3QgYXR0cmlidXRlICoqYXR0cnM7CisJCWludCBuZ3JvdXBzID0gMjsKKworCQlpZiAoZ3JvdXBzKQorCQkJZm9yIChpID0gMDsgZ3JvdXBzW2ldOyBpKyspCisJCQkJbmdyb3VwcysrOworCisJCWh3ZGV2LT5ncm91cHMgPSBkZXZtX2tjYWxsb2MoZGV2LCBuZ3JvdXBzLCBzaXplb2YoKmdyb3VwcyksCisJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghaHdkZXYtPmdyb3VwcykKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJCWF0dHJzID0gX19od21vbl9jcmVhdGVfYXR0cnMoZGV2LCBkcnZkYXRhLCBjaGlwKTsKKwkJaWYgKElTX0VSUihhdHRycykpIHsKKwkJCWVyciA9IFBUUl9FUlIoYXR0cnMpOworCQkJZ290byBmcmVlX2h3bW9uOworCQl9CisKKwkJaHdkZXYtPmdyb3VwLmF0dHJzID0gYXR0cnM7CisJCW5ncm91cHMgPSAwOworCQlod2Rldi0+Z3JvdXBzW25ncm91cHMrK10gPSAmaHdkZXYtPmdyb3VwOworCisJCWlmIChncm91cHMpIHsKKwkJCWZvciAoaSA9IDA7IGdyb3Vwc1tpXTsgaSsrKQorCQkJCWh3ZGV2LT5ncm91cHNbbmdyb3VwcysrXSA9IGdyb3Vwc1tpXTsKKwkJfQorCisJCWhkZXYtPmdyb3VwcyA9IGh3ZGV2LT5ncm91cHM7CisJfSBlbHNlIHsKKwkJaGRldi0+Z3JvdXBzID0gZ3JvdXBzOworCX0KKworCWh3ZGV2LT5uYW1lID0gbmFtZTsKKwloZGV2LT5jbGFzcyA9ICZod21vbl9jbGFzczsKKwloZGV2LT5wYXJlbnQgPSBkZXY7CisJaGRldi0+b2Zfbm9kZSA9IGRldiA/IGRldi0+b2Zfbm9kZSA6IE5VTEw7CisJaHdkZXYtPmNoaXAgPSBjaGlwOworCWRldl9zZXRfZHJ2ZGF0YShoZGV2LCBkcnZkYXRhKTsKKwlkZXZfc2V0X25hbWUoaGRldiwgSFdNT05fSURfRk9STUFULCBpZCk7CisJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKGhkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZnJlZV9od21vbjsKKworCWlmIChjaGlwICYmIGNoaXAtPm9wcy0+aXNfdmlzaWJsZSAmJiBjaGlwLT5vcHMtPnJlYWQgJiYKKwkgICAgY2hpcC0+aW5mb1swXS0+dHlwZSA9PSBod21vbl9jaGlwICYmCisJICAgIChjaGlwLT5pbmZvWzBdLT5jb25maWdbMF0gJiBIV01PTl9DX1JFR0lTVEVSX1RaKSkgeworCQljb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICoqaW5mbyA9IGNoaXAtPmluZm87CisKKwkJZm9yIChpID0gMTsgaW5mb1tpXTsgaSsrKSB7CisJCQlpZiAoaW5mb1tpXS0+dHlwZSAhPSBod21vbl90ZW1wKQorCQkJCWNvbnRpbnVlOworCisJCQlmb3IgKGogPSAwOyBpbmZvW2ldLT5jb25maWdbal07IGorKykgeworCQkJCWlmICghY2hpcC0+b3BzLT5pc192aXNpYmxlKGRydmRhdGEsIGh3bW9uX3RlbXAsCisJCQkJCQkJICAgaHdtb25fdGVtcF9pbnB1dCwgaikpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChpbmZvW2ldLT5jb25maWdbal0gJiBIV01PTl9UX0lOUFVUKQorCQkJCQlod21vbl90aGVybWFsX2FkZF9zZW5zb3IoZGV2LCBod2Rldiwgaik7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gaGRldjsKKworZnJlZV9od21vbjoKKwlrZnJlZShod2Rldik7CitpZGFfcmVtb3ZlOgorCWlkYV9zaW1wbGVfcmVtb3ZlKCZod21vbl9pZGEsIGlkKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCiAvKioKICAqIGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyAtIHJlZ2lzdGVyIHcvIGh3bW9uCiAgKiBAZGV2OiB0aGUgcGFyZW50IGRldmljZQpAQCAtOTcsNDUgKzYxNSwzNyBAQAogCQkJCSAgdm9pZCAqZHJ2ZGF0YSwKIAkJCQkgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpCiB7Ci0Jc3RydWN0IGh3bW9uX2RldmljZSAqaHdkZXY7Ci0JaW50IGVyciwgaWQ7Ci0KLQkvKiBEbyBub3QgYWNjZXB0IGludmFsaWQgY2hhcmFjdGVycyBpbiBod21vbiBuYW1lIGF0dHJpYnV0ZSAqLwotCWlmIChuYW1lICYmICghc3RybGVuKG5hbWUpIHx8IHN0cnBicmsobmFtZSwgIi0qIFx0XG4iKSkpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCi0JaWQgPSBpZGFfc2ltcGxlX2dldCgmaHdtb25faWRhLCAwLCAwLCBHRlBfS0VSTkVMKTsKLQlpZiAoaWQgPCAwKQotCQlyZXR1cm4gRVJSX1BUUihpZCk7Ci0KLQlod2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpod2RldiksIEdGUF9LRVJORUwpOwotCWlmIChod2RldiA9PSBOVUxMKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gaWRhX3JlbW92ZTsKLQl9Ci0KLQlod2Rldi0+bmFtZSA9IG5hbWU7Ci0JaHdkZXYtPmRldi5jbGFzcyA9ICZod21vbl9jbGFzczsKLQlod2Rldi0+ZGV2LnBhcmVudCA9IGRldjsKLQlod2Rldi0+ZGV2Lmdyb3VwcyA9IGdyb3VwczsKLQlod2Rldi0+ZGV2Lm9mX25vZGUgPSBkZXYgPyBkZXYtPm9mX25vZGUgOiBOVUxMOwotCWRldl9zZXRfZHJ2ZGF0YSgmaHdkZXYtPmRldiwgZHJ2ZGF0YSk7Ci0JZGV2X3NldF9uYW1lKCZod2Rldi0+ZGV2LCBIV01PTl9JRF9GT1JNQVQsIGlkKTsKLQllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJmh3ZGV2LT5kZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gZnJlZTsKLQotCXJldHVybiAmaHdkZXYtPmRldjsKLQotZnJlZToKLQlrZnJlZShod2Rldik7Ci1pZGFfcmVtb3ZlOgotCWlkYV9zaW1wbGVfcmVtb3ZlKCZod21vbl9pZGEsIGlkKTsKLQlyZXR1cm4gRVJSX1BUUihlcnIpOworCXJldHVybiBfX2h3bW9uX2RldmljZV9yZWdpc3RlcihkZXYsIG5hbWUsIGRydmRhdGEsIE5VTEwsIGdyb3Vwcyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMpOwogCiAvKioKKyAqIGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8gLSByZWdpc3RlciB3LyBod21vbgorICogQGRldjogdGhlIHBhcmVudCBkZXZpY2UKKyAqIEBuYW1lOiBod21vbiBuYW1lIGF0dHJpYnV0ZQorICogQGRydmRhdGE6IGRyaXZlciBkYXRhIHRvIGF0dGFjaCB0byBjcmVhdGVkIGRldmljZQorICogQGluZm86IFBvaW50ZXIgdG8gaHdtb24gY2hpcCBpbmZvcm1hdGlvbgorICogQGdyb3VwcyAtIHBvaW50ZXIgdG8gbGlzdCBvZiBkcml2ZXIgc3BlY2lmaWMgYXR0cmlidXRlIGdyb3VwcworICoKKyAqIGh3bW9uX2RldmljZV91bnJlZ2lzdGVyKCkgbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGlzIG5vCisgKiBsb25nZXIgbmVlZGVkLgorICoKKyAqIFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBkZXZpY2UuCisgKi8KK3N0cnVjdCBkZXZpY2UgKgoraHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJdm9pZCAqZHJ2ZGF0YSwKKwkJCQljb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvICpjaGlwLAorCQkJCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpCit7CisJaWYgKGNoaXAgJiYgKCFjaGlwLT5vcHMgfHwgIWNoaXAtPmluZm8pKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCXJldHVybiBfX2h3bW9uX2RldmljZV9yZWdpc3RlcihkZXYsIG5hbWUsIGRydmRhdGEsIGNoaXAsIGdyb3Vwcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKTsKKworLyoqCiAgKiBod21vbl9kZXZpY2VfcmVnaXN0ZXIgLSByZWdpc3RlciB3LyBod21vbgogICogQGRldjogdGhlIGRldmljZSB0byByZWdpc3RlcgogICoKQEAgLTIxMyw2ICs3MjMsNDggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKTsKIAorLyoqCisgKiBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8gLSByZWdpc3RlciB3LyBod21vbgorICogQGRldjogdGhlIHBhcmVudCBkZXZpY2UKKyAqIEBuYW1lOiBod21vbiBuYW1lIGF0dHJpYnV0ZQorICogQGRydmRhdGE6IGRyaXZlciBkYXRhIHRvIGF0dGFjaCB0byBjcmVhdGVkIGRldmljZQorICogQGluZm86IFBvaW50ZXIgdG8gaHdtb24gY2hpcCBpbmZvcm1hdGlvbgorICogQGdyb3VwcyAtIHBvaW50ZXIgdG8gbGlzdCBvZiBkcml2ZXIgc3BlY2lmaWMgYXR0cmlidXRlIGdyb3VwcworICoKKyAqIFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBkZXZpY2UuIFRoZSBuZXcgZGV2aWNlIGlzIGF1dG9tYXRpY2FsbHkKKyAqIHVucmVnaXN0ZXJlZCB3aXRoIHRoZSBwYXJlbnQgZGV2aWNlLgorICovCitzdHJ1Y3QgZGV2aWNlICoKK2Rldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICB2b2lkICpkcnZkYXRhLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGh3bW9uX2NoaXBfaW5mbyAqY2hpcCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpCit7CisJc3RydWN0IGRldmljZSAqKnB0ciwgKmh3ZGV2OworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJcHRyID0gZGV2cmVzX2FsbG9jKGRldm1faHdtb25fcmVsZWFzZSwgc2l6ZW9mKCpwdHIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0cikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlod2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oZGV2LCBuYW1lLCBkcnZkYXRhLCBjaGlwLAorCQkJCQkJZ3JvdXBzKTsKKwlpZiAoSVNfRVJSKGh3ZGV2KSkKKwkJZ290byBlcnJvcjsKKworCSpwdHIgPSBod2RldjsKKwlkZXZyZXNfYWRkKGRldiwgcHRyKTsKKworCXJldHVybiBod2RldjsKKworZXJyb3I6CisJZGV2cmVzX2ZyZWUocHRyKTsKKwlyZXR1cm4gaHdkZXY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8pOworCiBzdGF0aWMgaW50IGRldm1faHdtb25fbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGRldmljZSAqKmh3ZGV2ID0gcmVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9pYm1wb3dlcm52LmMgYi9kcml2ZXJzL2h3bW9uL2libXBvd2VybnYuYwppbmRleCA1NWI1YThmLi42ZDJlNjYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2libXBvd2VybnYuYworKysgYi9kcml2ZXJzL2h3bW9uL2libXBvd2VybnYuYwpAQCAtMTQzLDEzICsxNDMsMTEgQEAKIAkJaWYgKGNwdWlkID49IDApCiAJCQkvKgogCQkJICogVGhlIGRpZ2l0YWwgdGhlcm1hbCBzZW5zb3JzIGFyZSBhc3NvY2lhdGVkCi0JCQkgKiB3aXRoIGEgY29yZS4gTGV0J3MgcHJpbnQgb3V0IHRoZSByYW5nZSBvZgotCQkJICogY3B1IGlkcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBoYXJkd2FyZQotCQkJICogdGhyZWFkcyBvZiB0aGUgY29yZS4KKwkJCSAqIHdpdGggYSBjb3JlLgogCQkJICovCiAJCQluICs9IHNucHJpbnRmKHNkYXRhLT5sYWJlbCArIG4sCi0JCQkJICAgICAgc2l6ZW9mKHNkYXRhLT5sYWJlbCkgLSBuLCAiICVkLSVkIiwKLQkJCQkgICAgICBjcHVpZCwgY3B1aWQgKyB0aHJlYWRzX3Blcl9jb3JlIC0gMSk7CisJCQkJICAgICAgc2l6ZW9mKHNkYXRhLT5sYWJlbCkgLSBuLCAiICVkIiwKKwkJCQkgICAgICBjcHVpZCk7CiAJCWVsc2UKIAkJCW4gKz0gc25wcmludGYoc2RhdGEtPmxhYmVsICsgbiwKIAkJCQkgICAgICBzaXplb2Yoc2RhdGEtPmxhYmVsKSAtIG4sICIgcGh5JWQiLCBpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2lpb19od21vbi5jIGIvZHJpdmVycy9od21vbi9paW9faHdtb24uYwppbmRleCA4OTQ0OTg3Li5mNmE3NjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2lpb19od21vbi5jCisrKyBiL2RyaXZlcnMvaHdtb24vaWlvX2h3bW9uLmMKQEAgLTczLDggKzczLDExIEBACiAJCW5hbWUgPSBkZXYtPm9mX25vZGUtPm5hbWU7CiAKIAljaGFubmVscyA9IGlpb19jaGFubmVsX2dldF9hbGwoZGV2KTsKLQlpZiAoSVNfRVJSKGNoYW5uZWxzKSkKKwlpZiAoSVNfRVJSKGNoYW5uZWxzKSkgeworCQlpZiAoUFRSX0VSUihjaGFubmVscykgPT0gLUVOT0RFVikKKwkJCXJldHVybiAtRVBST0JFX0RFRkVSOwogCQlyZXR1cm4gUFRSX0VSUihjaGFubmVscyk7CisJfQogCiAJc3QgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0ID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaXQ4Ny5jIGIvZHJpdmVycy9od21vbi9pdDg3LmMKaW5kZXggNzMwZDg0MC4uYWQ4MmNiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9pdDg3LmMKKysrIGIvZHJpdmVycy9od21vbi9pdDg3LmMKQEAgLTQ5MSw3ICs0OTEsNyBAQAogc3RydWN0IGl0ODdfZGF0YSB7CiAJY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqZ3JvdXBzWzddOwogCWVudW0gY2hpcHMgdHlwZTsKLQl1MTYgZmVhdHVyZXM7CisJdTMyIGZlYXR1cmVzOwogCXU4IHBlY2lfbWFzazsKIAl1OCBvbGRfcGVjaV9tYXNrOwogCkBAIC0yMDExLDEwICsyMDExLDExIEBACiAJJnNlbnNvcl9kZXZfYXR0cl9pbjdfYmVlcC5kZXZfYXR0ci5hdHRyLAkvKiAzOSAqLwogCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjhfaW5wdXQuZGV2X2F0dHIuYXR0ciwJLyogNDAgKi8KLQkmc2Vuc29yX2Rldl9hdHRyX2luOV9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiA0MSAqLwotCSZzZW5zb3JfZGV2X2F0dHJfaW4xMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiA0MSAqLwotCSZzZW5zb3JfZGV2X2F0dHJfaW4xMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiA0MSAqLwotCSZzZW5zb3JfZGV2X2F0dHJfaW4xMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiA0MSAqLworCSZzZW5zb3JfZGV2X2F0dHJfaW45X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjEwX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjExX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjEyX2lucHV0LmRldl9hdHRyLmF0dHIsCisJTlVMTAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaXQ4N19ncm91cF9pbiA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vamM0Mi5jIGIvZHJpdmVycy9od21vbi9qYzQyLmMKaW5kZXggOWQ1Zjg1Zi4uMWJmMjJlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9qYzQyLmMKKysrIGIvZHJpdmVycy9od21vbi9qYzQyLmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KLSNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KQEAgLTI1NCwxNzAgKzI1MywxNDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBzeXNmcyBmdW5jdGlvbnMgKi8KLQotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkgY2hhciAqYnVmKQorc3RhdGljIGludCBqYzQyX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkgICAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyAqdmFsKQogewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQlzdHJ1Y3QgamM0Ml9kYXRhICpkYXRhID0gamM0Ml91cGRhdGVfZGV2aWNlKGRldik7Ci0JaWYgKElTX0VSUihkYXRhKSkKLQkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCi0JCSAgICAgICBqYzQyX3RlbXBfZnJvbV9yZWcoZGF0YS0+dGVtcFthdHRyLT5pbmRleF0pKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CiAJc3RydWN0IGpjNDJfZGF0YSAqZGF0YSA9IGpjNDJfdXBkYXRlX2RldmljZShkZXYpOwogCWludCB0ZW1wLCBoeXN0OwogCiAJaWYgKElTX0VSUihkYXRhKSkKIAkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CiAKLQl0ZW1wID0gamM0Ml90ZW1wX2Zyb21fcmVnKGRhdGEtPnRlbXBbYXR0ci0+aW5kZXhdKTsKLQloeXN0ID0gamM0Ml9oeXN0ZXJlc2lzWyhkYXRhLT5jb25maWcgJiBKQzQyX0NGR19IWVNUX01BU0spCi0JCQkgICAgICAgPj4gSkM0Ml9DRkdfSFlTVF9TSElGVF07Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXAgLSBoeXN0KTsKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX3RlbXBfaW5wdXQ6CisJCSp2YWwgPSBqYzQyX3RlbXBfZnJvbV9yZWcoZGF0YS0+dGVtcFt0X2lucHV0XSk7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9taW46CisJCSp2YWwgPSBqYzQyX3RlbXBfZnJvbV9yZWcoZGF0YS0+dGVtcFt0X21pbl0pOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQkqdmFsID0gamM0Ml90ZW1wX2Zyb21fcmVnKGRhdGEtPnRlbXBbdF9tYXhdKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX2NyaXQ6CisJCSp2YWwgPSBqYzQyX3RlbXBfZnJvbV9yZWcoZGF0YS0+dGVtcFt0X2NyaXRdKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX21heF9oeXN0OgorCQl0ZW1wID0gamM0Ml90ZW1wX2Zyb21fcmVnKGRhdGEtPnRlbXBbdF9tYXhdKTsKKwkJaHlzdCA9IGpjNDJfaHlzdGVyZXNpc1soZGF0YS0+Y29uZmlnICYgSkM0Ml9DRkdfSFlTVF9NQVNLKQorCQkJCQkJPj4gSkM0Ml9DRkdfSFlTVF9TSElGVF07CisJCSp2YWwgPSB0ZW1wIC0gaHlzdDsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX2NyaXRfaHlzdDoKKwkJdGVtcCA9IGpjNDJfdGVtcF9mcm9tX3JlZyhkYXRhLT50ZW1wW3RfY3JpdF0pOworCQloeXN0ID0gamM0Ml9oeXN0ZXJlc2lzWyhkYXRhLT5jb25maWcgJiBKQzQyX0NGR19IWVNUX01BU0spCisJCQkJCQk+PiBKQzQyX0NGR19IWVNUX1NISUZUXTsKKwkJKnZhbCA9IHRlbXAgLSBoeXN0OworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfbWluX2FsYXJtOgorCQkqdmFsID0gKGRhdGEtPnRlbXBbdF9pbnB1dF0gPj4gSkM0Ml9BTEFSTV9NSU5fQklUKSAmIDE7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9tYXhfYWxhcm06CisJCSp2YWwgPSAoZGF0YS0+dGVtcFt0X2lucHV0XSA+PiBKQzQyX0FMQVJNX01BWF9CSVQpICYgMTsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX2NyaXRfYWxhcm06CisJCSp2YWwgPSAoZGF0YS0+dGVtcFt0X2lucHV0XSA+PiBKQzQyX0FMQVJNX0NSSVRfQklUKSAmIDE7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNldF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7Ci0Jc3RydWN0IGpjNDJfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBlcnIsIHJldCA9IGNvdW50OwotCWludCBuciA9IGF0dHItPmluZGV4OwotCWxvbmcgdmFsOwotCi0JaWYgKGtzdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JZGF0YS0+dGVtcFtucl0gPSBqYzQyX3RlbXBfdG9fcmVnKHZhbCwgZGF0YS0+ZXh0ZW5kZWQpOwotCWVyciA9IGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoZGF0YS0+Y2xpZW50LCB0ZW1wX3JlZ3NbbnJdLAotCQkJCQkgICBkYXRhLT50ZW1wW25yXSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldCA9IGVycjsKLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogSkM0Mi40IGNvbXBsaWFudCBjaGlwcyBvbmx5IHN1cHBvcnQgZm91ciBoeXN0ZXJlc2lzIHZhbHVlcy4KLSAqIFBpY2sgYmVzdCBjaG9pY2UgYW5kIGdvIGZyb20gdGhlcmUuCi0gKi8KLXN0YXRpYyBzc2l6ZV90IHNldF90ZW1wX2NyaXRfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIGludCBqYzQyX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJICAgICAgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nIHZhbCkKIHsKIAlzdHJ1Y3QgamM0Ml9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JbG9uZyB2YWw7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAlpbnQgZGlmZiwgaHlzdDsKLQlpbnQgZXJyOwotCWludCByZXQgPSBjb3VudDsKKwlpbnQgcmV0OwogCi0JaWYgKGtzdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKLQl2YWwgPSBjbGFtcF92YWwodmFsLCAoZGF0YS0+ZXh0ZW5kZWQgPyBKQzQyX1RFTVBfTUlOX0VYVEVOREVEIDoKLQkJCSAgICAgIEpDNDJfVEVNUF9NSU4pIC0gNjAwMCwgSkM0Ml9URU1QX01BWCk7Ci0JZGlmZiA9IGpjNDJfdGVtcF9mcm9tX3JlZyhkYXRhLT50ZW1wW3RfY3JpdF0pIC0gdmFsOwotCi0JaHlzdCA9IDA7Ci0JaWYgKGRpZmYgPiAwKSB7Ci0JCWlmIChkaWZmIDwgMjI1MCkKLQkJCWh5c3QgPSAxOwkvKiAxLjUgZGVncmVlcyBDICovCi0JCWVsc2UgaWYgKGRpZmYgPCA0NTAwKQotCQkJaHlzdCA9IDI7CS8qIDMuMCBkZWdyZWVzIEMgKi8KLQkJZWxzZQotCQkJaHlzdCA9IDM7CS8qIDYuMCBkZWdyZWVzIEMgKi8KKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX3RlbXBfbWluOgorCQlkYXRhLT50ZW1wW3RfbWluXSA9IGpjNDJfdGVtcF90b19yZWcodmFsLCBkYXRhLT5leHRlbmRlZCk7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCB0ZW1wX3JlZ3NbdF9taW5dLAorCQkJCQkJICAgZGF0YS0+dGVtcFt0X21pbl0pOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQlkYXRhLT50ZW1wW3RfbWF4XSA9IGpjNDJfdGVtcF90b19yZWcodmFsLCBkYXRhLT5leHRlbmRlZCk7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCB0ZW1wX3JlZ3NbdF9tYXhdLAorCQkJCQkJICAgZGF0YS0+dGVtcFt0X21heF0pOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdDoKKwkJZGF0YS0+dGVtcFt0X2NyaXRdID0gamM0Ml90ZW1wX3RvX3JlZyh2YWwsIGRhdGEtPmV4dGVuZGVkKTsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIHRlbXBfcmVnc1t0X2NyaXRdLAorCQkJCQkJICAgZGF0YS0+dGVtcFt0X2NyaXRdKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX2NyaXRfaHlzdDoKKwkJLyoKKwkJICogSkM0Mi40IGNvbXBsaWFudCBjaGlwcyBvbmx5IHN1cHBvcnQgZm91ciBoeXN0ZXJlc2lzIHZhbHVlcy4KKwkJICogUGljayBiZXN0IGNob2ljZSBhbmQgZ28gZnJvbSB0aGVyZS4KKwkJICovCisJCXZhbCA9IGNsYW1wX3ZhbCh2YWwsIChkYXRhLT5leHRlbmRlZCA/IEpDNDJfVEVNUF9NSU5fRVhURU5ERUQKKwkJCQkJCSAgICAgOiBKQzQyX1RFTVBfTUlOKSAtIDYwMDAsCisJCQkJSkM0Ml9URU1QX01BWCk7CisJCWRpZmYgPSBqYzQyX3RlbXBfZnJvbV9yZWcoZGF0YS0+dGVtcFt0X2NyaXRdKSAtIHZhbDsKKwkJaHlzdCA9IDA7CisJCWlmIChkaWZmID4gMCkgeworCQkJaWYgKGRpZmYgPCAyMjUwKQorCQkJCWh5c3QgPSAxOwkvKiAxLjUgZGVncmVlcyBDICovCisJCQllbHNlIGlmIChkaWZmIDwgNDUwMCkKKwkJCQloeXN0ID0gMjsJLyogMy4wIGRlZ3JlZXMgQyAqLworCQkJZWxzZQorCQkJCWh5c3QgPSAzOwkvKiA2LjAgZGVncmVlcyBDICovCisJCX0KKwkJZGF0YS0+Y29uZmlnID0gKGRhdGEtPmNvbmZpZyAmIH5KQzQyX0NGR19IWVNUX01BU0spIHwKKwkJCQkoaHlzdCA8PCBKQzQyX0NGR19IWVNUX1NISUZUKTsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChkYXRhLT5jbGllbnQsCisJCQkJCQkgICBKQzQyX1JFR19DT05GSUcsCisJCQkJCQkgICBkYXRhLT5jb25maWcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CiAJfQogCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCWRhdGEtPmNvbmZpZyA9IChkYXRhLT5jb25maWcgJiB+SkM0Ml9DRkdfSFlTVF9NQVNLKQotCSAgfCAoaHlzdCA8PCBKQzQyX0NGR19IWVNUX1NISUZUKTsKLQllcnIgPSBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGRhdGEtPmNsaWVudCwgSkM0Ml9SRUdfQ09ORklHLAotCQkJCQkgICBkYXRhLT5jb25maWcpOwotCWlmIChlcnIgPCAwKQotCQlyZXQgPSBlcnI7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyB1bW9kZV90IGpjNDJfaXNfdmlzaWJsZShjb25zdCB2b2lkICpfZGF0YSwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCSAgICAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCiB7Ci0JdTE2IGJpdCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0Jc3RydWN0IGpjNDJfZGF0YSAqZGF0YSA9IGpjNDJfdXBkYXRlX2RldmljZShkZXYpOwotCXUxNiB2YWw7Ci0KLQlpZiAoSVNfRVJSKGRhdGEpKQotCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKLQotCXZhbCA9IGRhdGEtPnRlbXBbdF9pbnB1dF07Ci0JaWYgKGJpdCAhPSBKQzQyX0FMQVJNX0NSSVRfQklUICYmIChkYXRhLT5jb25maWcgJiBKQzQyX0NGR19DUklUX09OTFkpKQotCQl2YWwgPSAwOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCAodmFsID4+IGJpdCkgJiAxKTsKLX0KLQotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCB0X2lucHV0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdCwgU19JUlVHTywgc2hvd190ZW1wLCBzZXRfdGVtcCwgdF9jcml0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWluLCBTX0lSVUdPLCBzaG93X3RlbXAsIHNldF90ZW1wLCB0X21pbik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heCwgU19JUlVHTywgc2hvd190ZW1wLCBzZXRfdGVtcCwgdF9tYXgpOwotCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd190ZW1wX2h5c3QsCi0JCQkgIHNldF90ZW1wX2NyaXRfaHlzdCwgdF9jcml0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4X2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcF9oeXN0LCBOVUxMLCB0X21heCk7Ci0KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgSkM0Ml9BTEFSTV9DUklUX0JJVCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21pbl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgSkM0Ml9BTEFSTV9NSU5fQklUKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLAotCQkJICBKQzQyX0FMQVJNX01BWF9CSVQpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqamM0Ml9hdHRyaWJ1dGVzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2NyaXRfaHlzdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4X2h5c3QuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2NyaXRfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIHVtb2RlX3QgamM0Ml9hdHRyaWJ1dGVfbW9kZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7Ci0Jc3RydWN0IGpjNDJfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWNvbnN0IHN0cnVjdCBqYzQyX2RhdGEgKmRhdGEgPSBfZGF0YTsKIAl1bnNpZ25lZCBpbnQgY29uZmlnID0gZGF0YS0+Y29uZmlnOwotCWJvb2wgcmVhZG9ubHk7CisJdW1vZGVfdCBtb2RlID0gU19JUlVHTzsKIAotCWlmIChhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdC5kZXZfYXR0ci5hdHRyKQotCQlyZWFkb25seSA9IGNvbmZpZyAmIEpDNDJfQ0ZHX1RDUklUX0xPQ0s7Ci0JZWxzZSBpZiAoYXR0ciA9PSAmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21pbi5kZXZfYXR0ci5hdHRyIHx8Ci0JCSBhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4LmRldl9hdHRyLmF0dHIpCi0JCXJlYWRvbmx5ID0gY29uZmlnICYgSkM0Ml9DRkdfRVZFTlRfTE9DSzsKLQllbHNlIGlmIChhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdF9oeXN0LmRldl9hdHRyLmF0dHIpCi0JCXJlYWRvbmx5ID0gY29uZmlnICYgKEpDNDJfQ0ZHX0VWRU5UX0xPQ0sgfCBKQzQyX0NGR19UQ1JJVF9MT0NLKTsKLQllbHNlCi0JCXJlYWRvbmx5ID0gdHJ1ZTsKLQotCXJldHVybiBTX0lSVUdPIHwgKHJlYWRvbmx5ID8gMCA6IFNfSVdVU1IpOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fdGVtcF9taW46CisJY2FzZSBod21vbl90ZW1wX21heDoKKwkJaWYgKCEoY29uZmlnICYgSkM0Ml9DRkdfRVZFTlRfTE9DSykpCisJCQltb2RlIHw9IFNfSVdVU1I7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9jcml0OgorCQlpZiAoIShjb25maWcgJiBKQzQyX0NGR19UQ1JJVF9MT0NLKSkKKwkJCW1vZGUgfD0gU19JV1VTUjsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX2NyaXRfaHlzdDoKKwkJaWYgKCEoY29uZmlnICYgKEpDNDJfQ0ZHX0VWRU5UX0xPQ0sgfCBKQzQyX0NGR19UQ1JJVF9MT0NLKSkpCisJCQltb2RlIHw9IFNfSVdVU1I7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9pbnB1dDoKKwljYXNlIGh3bW9uX3RlbXBfbWF4X2h5c3Q6CisJY2FzZSBod21vbl90ZW1wX21pbl9hbGFybToKKwljYXNlIGh3bW9uX3RlbXBfbWF4X2FsYXJtOgorCWNhc2UgaHdtb25fdGVtcF9jcml0X2FsYXJtOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQltb2RlID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBtb2RlOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBqYzQyX2dyb3VwID0gewotCS5hdHRycyA9IGpjNDJfYXR0cmlidXRlcywKLQkuaXNfdmlzaWJsZSA9IGpjNDJfYXR0cmlidXRlX21vZGUsCi19OwotX19BVFRSSUJVVEVfR1JPVVBTKGpjNDIpOwotCiAvKiBSZXR1cm4gMCBpZiBkZXRlY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgLUVOT0RFViBvdGhlcndpc2UgKi8KIHN0YXRpYyBpbnQgamM0Ml9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQogewpAQCAtNDUwLDYgKzQyNywzNCBAQAogCXJldHVybiAtRU5PREVWOwogfQogCitzdGF0aWMgY29uc3QgdTMyIGpjNDJfdGVtcF9jb25maWdbXSA9IHsKKwlIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9NSU4gfCBIV01PTl9UX01BWCB8IEhXTU9OX1RfQ1JJVCB8CisJSFdNT05fVF9NQVhfSFlTVCB8IEhXTU9OX1RfQ1JJVF9IWVNUIHwKKwlIV01PTl9UX01JTl9BTEFSTSB8IEhXTU9OX1RfTUFYX0FMQVJNIHwgSFdNT05fVF9DUklUX0FMQVJNLAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGpjNDJfdGVtcCA9IHsKKwkudHlwZSA9IGh3bW9uX3RlbXAsCisJLmNvbmZpZyA9IGpjNDJfdGVtcF9jb25maWcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqamM0Ml9pbmZvW10gPSB7CisJJmpjNDJfdGVtcCwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX29wcyBqYzQyX2h3bW9uX29wcyA9IHsKKwkuaXNfdmlzaWJsZSA9IGpjNDJfaXNfdmlzaWJsZSwKKwkucmVhZCA9IGpjNDJfcmVhZCwKKwkud3JpdGUgPSBqYzQyX3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gamM0Ml9jaGlwX2luZm8gPSB7CisJLm9wcyA9ICZqYzQyX2h3bW9uX29wcywKKwkuaW5mbyA9IGpjNDJfaW5mbywKK307CisKIHN0YXRpYyBpbnQgamM0Ml9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OwpAQCAtNDgyLDkgKzQ4Nyw5IEBACiAJfQogCWRhdGEtPmNvbmZpZyA9IGNvbmZpZzsKIAotCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgY2xpZW50LT5uYW1lLAotCQkJCQkJCSAgIGRhdGEsCi0JCQkJCQkJICAgamM0Ml9ncm91cHMpOworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgZGF0YSwgJmpjNDJfY2hpcF9pbmZvLAorCQkJCQkJCSBOVUxMKTsKIAlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03NS5jIGIvZHJpdmVycy9od21vbi9sbTc1LmMKaW5kZXggOTJmOWQ0Yi4uZWZmM2IyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTc1LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTc1LmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3RoZXJtYWwuaD4KICNpbmNsdWRlICJsbTc1LmgiCiAKIApAQCAtODgsNTYgKzg3LDc1IEBACiAJcmV0dXJuICgodGVtcCA+PiAoMTYgLSByZXNvbHV0aW9uKSkgKiAxMDAwKSA+PiAocmVzb2x1dGlvbiAtIDgpOwogfQogCi0vKiBzeXNmcyBhdHRyaWJ1dGVzIGZvciBod21vbiAqLwotCi1zdGF0aWMgaW50IGxtNzVfcmVhZF90ZW1wKHZvaWQgKmRldiwgaW50ICp0ZW1wKQorc3RhdGljIGludCBsbTc1X3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkgICAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyAqdmFsKQogewogCXN0cnVjdCBsbTc1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQl1bnNpZ25lZCBpbnQgX3RlbXA7Ci0JaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgcmVndmFsOworCWludCBlcnIsIHJlZzsKIAotCWVyciA9IHJlZ21hcF9yZWFkKGRhdGEtPnJlZ21hcCwgTE03NV9SRUdfVEVNUCwgJl90ZW1wKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2NoaXA6CisJCXN3aXRjaCAoYXR0cikgeworCQljYXNlIGh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsOgorCQkJKnZhbCA9IGRhdGEtPnNhbXBsZV90aW1lOworCQkJYnJlYWs7OworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wOgorCQlzd2l0Y2ggKGF0dHIpIHsKKwkJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCQkJcmVnID0gTE03NV9SRUdfVEVNUDsKKwkJCWJyZWFrOworCQljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQkJcmVnID0gTE03NV9SRUdfTUFYOworCQkJYnJlYWs7CisJCWNhc2UgaHdtb25fdGVtcF9tYXhfaHlzdDoKKwkJCXJlZyA9IExNNzVfUkVHX0hZU1Q7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWVyciA9IHJlZ21hcF9yZWFkKGRhdGEtPnJlZ21hcCwgcmVnLCAmcmVndmFsKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOwogCi0JKnRlbXAgPSBsbTc1X3JlZ190b19tYyhfdGVtcCwgZGF0YS0+cmVzb2x1dGlvbik7Ci0KKwkJKnZhbCA9IGxtNzVfcmVnX3RvX21jKHJlZ3ZhbCwgZGF0YS0+cmVzb2x1dGlvbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAotCQkJIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgbG03NV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCSAgICAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyB0ZW1wKQogewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CiAJc3RydWN0IGxtNzVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXVuc2lnbmVkIGludCB0ZW1wID0gMDsKLQlpbnQgZXJyOwotCi0JZXJyID0gcmVnbWFwX3JlYWQoZGF0YS0+cmVnbWFwLCBhdHRyLT5pbmRleCwgJnRlbXApOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBsbTc1X3JlZ190b19tYyh0ZW1wLCBkYXRhLT5yZXNvbHV0aW9uKSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNldF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAotCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKLQlzdHJ1Y3QgbG03NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JbG9uZyB0ZW1wOwotCWludCBlcnJvcjsKIAl1OCByZXNvbHV0aW9uOworCWludCByZWc7CiAKLQllcnJvciA9IGtzdHJ0b2woYnVmLCAxMCwgJnRlbXApOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOworCWlmICh0eXBlICE9IGh3bW9uX3RlbXApCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX21heDoKKwkJcmVnID0gTE03NV9SRUdfTUFYOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfbWF4X2h5c3Q6CisJCXJlZyA9IExNNzVfUkVHX0hZU1Q7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCS8qCiAJICogUmVzb2x1dGlvbiBvZiBsaW1pdCByZWdpc3RlcnMgaXMgYXNzdW1lZCB0byBiZSB0aGUgc2FtZSBhcyB0aGUKIAkgKiB0ZW1wZXJhdHVyZSBpbnB1dCByZWdpc3RlciByZXNvbHV0aW9uIHVubGVzcyBnaXZlbiBleHBsaWNpdGx5LgogCSAqLwotCWlmIChhdHRyLT5pbmRleCAmJiBkYXRhLT5yZXNvbHV0aW9uX2xpbWl0cykKKwlpZiAoZGF0YS0+cmVzb2x1dGlvbl9saW1pdHMpCiAJCXJlc29sdXRpb24gPSBkYXRhLT5yZXNvbHV0aW9uX2xpbWl0czsKIAllbHNlCiAJCXJlc29sdXRpb24gPSBkYXRhLT5yZXNvbHV0aW9uOwpAQCAtMTQ1LDQ2ICsxNjMsNzggQEAKIAl0ZW1wID0gY2xhbXBfdmFsKHRlbXAsIExNNzVfVEVNUF9NSU4sIExNNzVfVEVNUF9NQVgpOwogCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wICA8PCAocmVzb2x1dGlvbiAtIDgpLAogCQkJCSAxMDAwKSA8PCAoMTYgLSByZXNvbHV0aW9uKTsKLQllcnJvciA9IHJlZ21hcF93cml0ZShkYXRhLT5yZWdtYXAsIGF0dHItPmluZGV4LCB0ZW1wKTsKLQlpZiAoZXJyb3IgPCAwKQotCQlyZXR1cm4gZXJyb3I7CiAKLQlyZXR1cm4gY291bnQ7CisJcmV0dXJuIHJlZ21hcF93cml0ZShkYXRhLT5yZWdtYXAsIHJlZywgdGVtcCk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfdXBkYXRlX2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLCBjaGFyICpidWYpCitzdGF0aWMgdW1vZGVfdCBsbTc1X2lzX3Zpc2libGUoY29uc3Qgdm9pZCAqZGF0YSwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCSAgICAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCiB7Ci0Jc3RydWN0IGxtNzVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPnNhbXBsZV90aW1lKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2NoaXA6CisJCXN3aXRjaCAoYXR0cikgeworCQljYXNlIGh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsOgorCQkJcmV0dXJuIFNfSVJVR087CisJCX0KKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wOgorCQlzd2l0Y2ggKGF0dHIpIHsKKwkJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCQkJcmV0dXJuIFNfSVJVR087CisJCWNhc2UgaHdtb25fdGVtcF9tYXg6CisJCWNhc2UgaHdtb25fdGVtcF9tYXhfaHlzdDoKKwkJCXJldHVybiBTX0lSVUdPIHwgU19JV1VTUjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKLQkJCXNob3dfdGVtcCwgc2V0X3RlbXAsIExNNzVfUkVHX01BWCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywKLQkJCXNob3dfdGVtcCwgc2V0X3RlbXAsIExNNzVfUkVHX0hZU1QpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCBMTTc1X1JFR19URU1QKTsKLXN0YXRpYyBERVZJQ0VfQVRUUih1cGRhdGVfaW50ZXJ2YWwsIFNfSVJVR08sIHNob3dfdXBkYXRlX2ludGVydmFsLCBOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtNzVfYXR0cnNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heF9oeXN0LmRldl9hdHRyLmF0dHIsCi0JJmRldl9hdHRyX3VwZGF0ZV9pbnRlcnZhbC5hdHRyLAotCi0JTlVMTAotfTsKLUFUVFJJQlVURV9HUk9VUFMobG03NSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGhlcm1hbF96b25lX29mX2RldmljZV9vcHMgbG03NV9vZl90aGVybWFsX29wcyA9IHsKLQkuZ2V0X3RlbXAgPSBsbTc1X3JlYWRfdGVtcCwKLX07Ci0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKiBkZXZpY2UgcHJvYmUgYW5kIHJlbW92YWwgKi8KIAorLyogY2hpcCBjb25maWd1cmF0aW9uICovCisKK3N0YXRpYyBjb25zdCB1MzIgbG03NV9jaGlwX2NvbmZpZ1tdID0geworCUhXTU9OX0NfUkVHSVNURVJfVFogfCBIV01PTl9DX1VQREFURV9JTlRFUlZBTCwKKwkwCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyBsbTc1X2NoaXAgPSB7CisJLnR5cGUgPSBod21vbl9jaGlwLAorCS5jb25maWcgPSBsbTc1X2NoaXBfY29uZmlnLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBsbTc1X3RlbXBfY29uZmlnW10gPSB7CisJSFdNT05fVF9JTlBVVCB8IEhXTU9OX1RfTUFYIHwgSFdNT05fVF9NQVhfSFlTVCwKKwkwCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyBsbTc1X3RlbXAgPSB7CisJLnR5cGUgPSBod21vbl90ZW1wLAorCS5jb25maWcgPSBsbTc1X3RlbXBfY29uZmlnLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gKmxtNzVfaW5mb1tdID0geworCSZsbTc1X2NoaXAsCisJJmxtNzVfdGVtcCwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX29wcyBsbTc1X2h3bW9uX29wcyA9IHsKKwkuaXNfdmlzaWJsZSA9IGxtNzVfaXNfdmlzaWJsZSwKKwkucmVhZCA9IGxtNzVfcmVhZCwKKwkud3JpdGUgPSBsbTc1X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gbG03NV9jaGlwX2luZm8gPSB7CisJLm9wcyA9ICZsbTc1X2h3bW9uX29wcywKKwkuaW5mbyA9IGxtNzVfaW5mbywKK307CisKIHN0YXRpYyBib29sIGxtNzVfaXNfd3JpdGVhYmxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCiB7CiAJcmV0dXJuIHJlZyAhPSBMTTc1X1JFR19URU1QOwpAQCAtMzM3LDE1ICszODcsMTIgQEAKIAogCWRldl9kYmcoZGV2LCAiQ29uZmlnICUwMnhcbiIsIG5ldyk7CiAKLQlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKLQkJCQkJCQkgICBkYXRhLCBsbTc1X2dyb3Vwcyk7CisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKGRldiwgY2xpZW50LT5uYW1lLAorCQkJCQkJCSBkYXRhLCAmbG03NV9jaGlwX2luZm8sCisJCQkJCQkJIE5VTEwpOwogCWlmIChJU19FUlIoaHdtb25fZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIoaHdtb25fZGV2KTsKIAotCWRldm1fdGhlcm1hbF96b25lX29mX3NlbnNvcl9yZWdpc3Rlcihod21vbl9kZXYsIDAsCi0JCQkJCSAgICAgaHdtb25fZGV2LAotCQkJCQkgICAgICZsbTc1X29mX3RoZXJtYWxfb3BzKTsKLQogCWRldl9pbmZvKGRldiwgIiVzOiBzZW5zb3IgJyVzJ1xuIiwgZGV2X25hbWUoaHdtb25fZGV2KSwgY2xpZW50LT5uYW1lKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTkwLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTAuYwppbmRleCA0OTZlNzcxLi4zMjJlZDkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtOTAuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtOTAuYwpAQCAtODksNyArODksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CkBAIC0zMjYsNyArMzI1LDcgQEAKIAkJLmFsZXJ0X2FsYXJtcyA9IDB4N2MsCiAJCS5tYXhfY29udnJhdGUgPSA5LAogCQkucmVnX2xvY2FsX2V4dCA9IFRNUDQ1MV9SRUdfUl9MT0NBTF9URU1QTCwKLQl9CisJfSwKIH07CiAKIC8qCkBAIC0zNjUsNyArMzY0LDEwIEBACiAKIHN0cnVjdCBsbTkwX2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Ci0JY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqZ3JvdXBzWzZdOworCXUzMiBjaGFubmVsX2NvbmZpZ1s0XTsKKwlzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIHRlbXBfaW5mbzsKKwljb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICppbmZvWzNdOworCXN0cnVjdCBod21vbl9jaGlwX2luZm8gY2hpcDsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CiAJYm9vbCB2YWxpZDsJCS8qIHRydWUgaWYgcmVnaXN0ZXIgdmFsdWVzIGFyZSB2YWxpZCAqLwogCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOyAvKiBpbiBqaWZmaWVzICovCkBAIC00ODksMTEgKzQ5MSwxMSBAQAogICogY2xpZW50LT51cGRhdGVfbG9jayBtdXN0IGJlIGhlbGQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gKHVubGVzcyB3ZSBhcmUKICAqIGluIGRldGVjdGlvbiBvciBpbml0aWFsaXphdGlvbiBzdGVwcykuCiAgKi8KLXN0YXRpYyB2b2lkIGxtOTBfc2V0X2NvbnZyYXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBsbTkwX2RhdGEgKmRhdGEsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgaW50ZXJ2YWwpCitzdGF0aWMgaW50IGxtOTBfc2V0X2NvbnZyYXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBsbTkwX2RhdGEgKmRhdGEsCisJCQkgICAgIHVuc2lnbmVkIGludCBpbnRlcnZhbCkKIHsKLQlpbnQgaTsKIAl1bnNpZ25lZCBpbnQgdXBkYXRlX2ludGVydmFsOworCWludCBpLCBlcnI7CiAKIAkvKiBTaGlmdCBjYWxjdWxhdGlvbnMgdG8gYXZvaWQgcm91bmRpbmcgZXJyb3JzICovCiAJaW50ZXJ2YWwgPDw9IDY7CkBAIC01MDQsOCArNTA2LDkgQEAKIAkJaWYgKGludGVydmFsID49IHVwZGF0ZV9pbnRlcnZhbCAqIDMgLyA0KQogCQkJYnJlYWs7CiAKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05MF9SRUdfV19DT05WUkFURSwgaSk7CisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTBfUkVHX1dfQ09OVlJBVEUsIGkpOwogCWRhdGEtPnVwZGF0ZV9pbnRlcnZhbCA9IERJVl9ST1VORF9DTE9TRVNUKHVwZGF0ZV9pbnRlcnZhbCwgNjQpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgbG05MF91cGRhdGVfbGltaXRzKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTYwNCwxOSArNjA3LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbG05MF9kYXRhICpsbTkwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBsbTkwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXVuc2lnbmVkIGxvbmcgbmV4dF91cGRhdGU7Ci0JaW50IHZhbCA9IDA7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaW50IHZhbDsKIAogCWlmICghZGF0YS0+dmFsaWQpIHsKIAkJdmFsID0gbG05MF91cGRhdGVfbGltaXRzKGRldik7CiAJCWlmICh2YWwgPCAwKQotCQkJZ290byBlcnJvcjsKKwkJCXJldHVybiB2YWw7CiAJfQogCiAJbmV4dF91cGRhdGUgPSBkYXRhLT5sYXN0X3VwZGF0ZWQgKwpAQCAtNjI4LDUzICs2MjksNTUgQEAKIAogCQl2YWwgPSBsbTkwX3JlYWRfcmVnKGNsaWVudCwgTE05MF9SRUdfUl9MT0NBTF9MT1cpOwogCQlpZiAodmFsIDwgMCkKLQkJCWdvdG8gZXJyb3I7CisJCQlyZXR1cm4gdmFsOwogCQlkYXRhLT50ZW1wOFtMT0NBTF9MT1ddID0gdmFsOwogCiAJCXZhbCA9IGxtOTBfcmVhZF9yZWcoY2xpZW50LCBMTTkwX1JFR19SX0xPQ0FMX0hJR0gpOwogCQlpZiAodmFsIDwgMCkKLQkJCWdvdG8gZXJyb3I7CisJCQlyZXR1cm4gdmFsOwogCQlkYXRhLT50ZW1wOFtMT0NBTF9ISUdIXSA9IHZhbDsKIAogCQlpZiAoZGF0YS0+cmVnX2xvY2FsX2V4dCkgewogCQkJdmFsID0gbG05MF9yZWFkMTYoY2xpZW50LCBMTTkwX1JFR19SX0xPQ0FMX1RFTVAsCiAJCQkJCSAgZGF0YS0+cmVnX2xvY2FsX2V4dCk7CiAJCQlpZiAodmFsIDwgMCkKLQkJCQlnb3RvIGVycm9yOworCQkJCXJldHVybiB2YWw7CiAJCQlkYXRhLT50ZW1wMTFbTE9DQUxfVEVNUF0gPSB2YWw7CiAJCX0gZWxzZSB7CiAJCQl2YWwgPSBsbTkwX3JlYWRfcmVnKGNsaWVudCwgTE05MF9SRUdfUl9MT0NBTF9URU1QKTsKIAkJCWlmICh2YWwgPCAwKQotCQkJCWdvdG8gZXJyb3I7CisJCQkJcmV0dXJuIHZhbDsKIAkJCWRhdGEtPnRlbXAxMVtMT0NBTF9URU1QXSA9IHZhbCA8PCA4OwogCQl9CiAJCXZhbCA9IGxtOTBfcmVhZDE2KGNsaWVudCwgTE05MF9SRUdfUl9SRU1PVEVfVEVNUEgsCiAJCQkJICBMTTkwX1JFR19SX1JFTU9URV9URU1QTCk7CiAJCWlmICh2YWwgPCAwKQotCQkJZ290byBlcnJvcjsKKwkJCXJldHVybiB2YWw7CiAJCWRhdGEtPnRlbXAxMVtSRU1PVEVfVEVNUF0gPSB2YWw7CiAKIAkJdmFsID0gbG05MF9yZWFkX3JlZyhjbGllbnQsIExNOTBfUkVHX1JfU1RBVFVTKTsKIAkJaWYgKHZhbCA8IDApCi0JCQlnb3RvIGVycm9yOworCQkJcmV0dXJuIHZhbDsKIAkJZGF0YS0+YWxhcm1zID0gdmFsOwkvKiBsb3dlciA4IGJpdCBvZiBhbGFybXMgKi8KIAogCQlpZiAoZGF0YS0+a2luZCA9PSBtYXg2Njk2KSB7CiAJCQl2YWwgPSBsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChjbGllbnQsIGRhdGEsIDEpOwogCQkJaWYgKHZhbCA8IDApCi0JCQkJZ290byBlcnJvcjsKKwkJCQlyZXR1cm4gdmFsOwogCiAJCQl2YWwgPSBsbTkwX3JlYWQxNihjbGllbnQsIExNOTBfUkVHX1JfUkVNT1RFX1RFTVBILAogCQkJCQkgIExNOTBfUkVHX1JfUkVNT1RFX1RFTVBMKTsKLQkJCWlmICh2YWwgPCAwKQotCQkJCWdvdG8gZXJyb3I7CisJCQlpZiAodmFsIDwgMCkgeworCQkJCWxtOTBfc2VsZWN0X3JlbW90ZV9jaGFubmVsKGNsaWVudCwgZGF0YSwgMCk7CisJCQkJcmV0dXJuIHZhbDsKKwkJCX0KIAkJCWRhdGEtPnRlbXAxMVtSRU1PVEUyX1RFTVBdID0gdmFsOwogCiAJCQlsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChjbGllbnQsIGRhdGEsIDApOwogCiAJCQl2YWwgPSBsbTkwX3JlYWRfcmVnKGNsaWVudCwgTUFYNjY5Nl9SRUdfUl9TVEFUVVMyKTsKIAkJCWlmICh2YWwgPCAwKQotCQkJCWdvdG8gZXJyb3I7CisJCQkJcmV0dXJuIHZhbDsKIAkJCWRhdGEtPmFsYXJtcyB8PSB2YWwgPDwgODsKIAkJfQogCkBAIC02ODYsNyArNjg5LDcgQEAKIAkJICAgICEoZGF0YS0+YWxhcm1zICYgZGF0YS0+YWxlcnRfYWxhcm1zKSkgewogCQkJdmFsID0gbG05MF9yZWFkX3JlZyhjbGllbnQsIExNOTBfUkVHX1JfQ09ORklHMSk7CiAJCQlpZiAodmFsIDwgMCkKLQkJCQlnb3RvIGVycm9yOworCQkJCXJldHVybiB2YWw7CiAKIAkJCWlmICh2YWwgJiAweDgwKSB7CiAJCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJSZS1lbmFibGluZyBBTEVSVCNcbiIpOwpAQCAtNzAwLDEzICs3MDMsNyBAQAogCQlkYXRhLT52YWxpZCA9IHRydWU7CiAJfQogCi1lcnJvcjoKLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCWlmICh2YWwgPCAwKQotCQlyZXR1cm4gRVJSX1BUUih2YWwpOwotCi0JcmV0dXJuIGRhdGE7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC04MzIsNDIyICs4MjksMTIgQEAKIAlyZXR1cm4gKHZhbCArIDEyNSkgLyAyNTAgKiA2NDsKIH0KIAotLyoKLSAqIFN5c2ZzIHN0dWZmCi0gKi8KLQotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wOChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAotCQkJICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwotCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBsbTkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgdGVtcDsKLQotCWlmIChJU19FUlIoZGF0YSkpCi0JCXJldHVybiBQVFJfRVJSKGRhdGEpOwotCi0JaWYgKGRhdGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1MSkKLQkJdGVtcCA9IHRlbXBfZnJvbV91OF9hZHQ3NDYxKGRhdGEsIGRhdGEtPnRlbXA4W2F0dHItPmluZGV4XSk7Ci0JZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBtYXg2NjQ2KQotCQl0ZW1wID0gdGVtcF9mcm9tX3U4KGRhdGEtPnRlbXA4W2F0dHItPmluZGV4XSk7Ci0JZWxzZQotCQl0ZW1wID0gdGVtcF9mcm9tX3M4KGRhdGEtPnRlbXA4W2F0dHItPmluZGV4XSk7Ci0KLQkvKiArMTYgZGVncmVlcyBvZmZzZXQgZm9yIHRlbXAyIGZvciB0aGUgTE05OSAqLwotCWlmIChkYXRhLT5raW5kID09IGxtOTkgJiYgYXR0ci0+aW5kZXggPT0gMykKLQkJdGVtcCArPSAxNjAwMDsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2V0X3RlbXA4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RhdGljIGNvbnN0IHU4IHJlZ1tURU1QOF9SRUdfTlVNXSA9IHsKLQkJTE05MF9SRUdfV19MT0NBTF9MT1csCi0JCUxNOTBfUkVHX1dfTE9DQUxfSElHSCwKLQkJTE05MF9SRUdfV19MT0NBTF9DUklULAotCQlMTTkwX1JFR19XX1JFTU9URV9DUklULAotCQlNQVg2NjU5X1JFR19XX0xPQ0FMX0VNRVJHLAotCQlNQVg2NjU5X1JFR19XX1JFTU9URV9FTUVSRywKLQkJTE05MF9SRUdfV19SRU1PVEVfQ1JJVCwKLQkJTUFYNjY1OV9SRUdfV19SRU1PVEVfRU1FUkcsCi0JfTsKLQotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQlpbnQgbnIgPSBhdHRyLT5pbmRleDsKLQlsb25nIHZhbDsKLQlpbnQgZXJyOwotCi0JZXJyID0ga3N0cnRvbChidWYsIDEwLCAmdmFsKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCS8qICsxNiBkZWdyZWVzIG9mZnNldCBmb3IgdGVtcDIgZm9yIHRoZSBMTTk5ICovCi0JaWYgKGRhdGEtPmtpbmQgPT0gbG05OSAmJiBhdHRyLT5pbmRleCA9PSAzKQotCQl2YWwgLT0gMTYwMDA7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JaWYgKGRhdGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1MSkKLQkJZGF0YS0+dGVtcDhbbnJdID0gdGVtcF90b191OF9hZHQ3NDYxKGRhdGEsIHZhbCk7Ci0JZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBtYXg2NjQ2KQotCQlkYXRhLT50ZW1wOFtucl0gPSB0ZW1wX3RvX3U4KHZhbCk7Ci0JZWxzZQotCQlkYXRhLT50ZW1wOFtucl0gPSB0ZW1wX3RvX3M4KHZhbCk7Ci0KLQlsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChjbGllbnQsIGRhdGEsIG5yID49IDYpOwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWdbbnJdLCBkYXRhLT50ZW1wOFtucl0pOwotCWxtOTBfc2VsZWN0X3JlbW90ZV9jaGFubmVsKGNsaWVudCwgZGF0YSwgMCk7Ci0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcDExKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKTsKLQlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gbG05MF91cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IHRlbXA7Ci0KLQlpZiAoSVNfRVJSKGRhdGEpKQotCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKLQotCWlmIChkYXRhLT5raW5kID09IGFkdDc0NjEgfHwgZGF0YS0+a2luZCA9PSB0bXA0NTEpCi0JCXRlbXAgPSB0ZW1wX2Zyb21fdTE2X2FkdDc0NjEoZGF0YSwgZGF0YS0+dGVtcDExW2F0dHItPmluZGV4XSk7Ci0JZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBtYXg2NjQ2KQotCQl0ZW1wID0gdGVtcF9mcm9tX3UxNihkYXRhLT50ZW1wMTFbYXR0ci0+aW5kZXhdKTsKLQllbHNlCi0JCXRlbXAgPSB0ZW1wX2Zyb21fczE2KGRhdGEtPnRlbXAxMVthdHRyLT5pbmRleF0pOwotCi0JLyogKzE2IGRlZ3JlZXMgb2Zmc2V0IGZvciB0ZW1wMiBmb3IgdGhlIExNOTkgKi8KLQlpZiAoZGF0YS0+a2luZCA9PSBsbTk5ICYmICBhdHRyLT5pbmRleCA8PSAyKQotCQl0ZW1wICs9IDE2MDAwOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXApOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfdGVtcDExKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCB7Ci0JCXU4IGhpZ2g7Ci0JCXU4IGxvdzsKLQkJaW50IGNoYW5uZWw7Ci0JfSByZWdbNV0gPSB7Ci0JCXsgTE05MF9SRUdfV19SRU1PVEVfTE9XSCwgTE05MF9SRUdfV19SRU1PVEVfTE9XTCwgMCB9LAotCQl7IExNOTBfUkVHX1dfUkVNT1RFX0hJR0hILCBMTTkwX1JFR19XX1JFTU9URV9ISUdITCwgMCB9LAotCQl7IExNOTBfUkVHX1dfUkVNT1RFX09GRlNILCBMTTkwX1JFR19XX1JFTU9URV9PRkZTTCwgMCB9LAotCQl7IExNOTBfUkVHX1dfUkVNT1RFX0xPV0gsIExNOTBfUkVHX1dfUkVNT1RFX0xPV0wsIDEgfSwKLQkJeyBMTTkwX1JFR19XX1JFTU9URV9ISUdISCwgTE05MF9SRUdfV19SRU1PVEVfSElHSEwsIDEgfQotCX07Ci0KLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpOwotCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwotCWludCBuciA9IGF0dHItPm5yOwotCWludCBpbmRleCA9IGF0dHItPmluZGV4OwotCWxvbmcgdmFsOwotCWludCBlcnI7Ci0KLQllcnIgPSBrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JLyogKzE2IGRlZ3JlZXMgb2Zmc2V0IGZvciB0ZW1wMiBmb3IgdGhlIExNOTkgKi8KLQlpZiAoZGF0YS0+a2luZCA9PSBsbTk5ICYmIGluZGV4IDw9IDIpCi0JCXZhbCAtPSAxNjAwMDsKLQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlpZiAoZGF0YS0+a2luZCA9PSBhZHQ3NDYxIHx8IGRhdGEtPmtpbmQgPT0gdG1wNDUxKQotCQlkYXRhLT50ZW1wMTFbaW5kZXhdID0gdGVtcF90b191MTZfYWR0NzQ2MShkYXRhLCB2YWwpOwotCWVsc2UgaWYgKGRhdGEtPmtpbmQgPT0gbWF4NjY0NikKLQkJZGF0YS0+dGVtcDExW2luZGV4XSA9IHRlbXBfdG9fdTgodmFsKSA8PCA4OwotCWVsc2UgaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX1JFTV9MSU1JVF9FWFQpCi0JCWRhdGEtPnRlbXAxMVtpbmRleF0gPSB0ZW1wX3RvX3MxNih2YWwpOwotCWVsc2UKLQkJZGF0YS0+dGVtcDExW2luZGV4XSA9IHRlbXBfdG9fczgodmFsKSA8PCA4OwotCi0JbG05MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoY2xpZW50LCBkYXRhLCByZWdbbnJdLmNoYW5uZWwpOwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWdbbnJdLmhpZ2gsCi0JCQkJICBkYXRhLT50ZW1wMTFbaW5kZXhdID4+IDgpOwotCWlmIChkYXRhLT5mbGFncyAmIExNOTBfSEFWRV9SRU1fTElNSVRfRVhUKQotCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnW25yXS5sb3csCi0JCQkJCSAgZGF0YS0+dGVtcDExW2luZGV4XSAmIDB4ZmYpOwotCWxtOTBfc2VsZWN0X3JlbW90ZV9jaGFubmVsKGNsaWVudCwgZGF0YSwgMCk7Ci0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcGh5c3Qoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKLQkJCSAgICAgY2hhciAqYnVmKQotewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gbG05MF91cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IHRlbXA7Ci0KLQlpZiAoSVNfRVJSKGRhdGEpKQotCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKLQotCWlmIChkYXRhLT5raW5kID09IGFkdDc0NjEgfHwgZGF0YS0+a2luZCA9PSB0bXA0NTEpCi0JCXRlbXAgPSB0ZW1wX2Zyb21fdThfYWR0NzQ2MShkYXRhLCBkYXRhLT50ZW1wOFthdHRyLT5pbmRleF0pOwotCWVsc2UgaWYgKGRhdGEtPmtpbmQgPT0gbWF4NjY0NikKLQkJdGVtcCA9IHRlbXBfZnJvbV91OChkYXRhLT50ZW1wOFthdHRyLT5pbmRleF0pOwotCWVsc2UKLQkJdGVtcCA9IHRlbXBfZnJvbV9zOChkYXRhLT50ZW1wOFthdHRyLT5pbmRleF0pOwotCi0JLyogKzE2IGRlZ3JlZXMgb2Zmc2V0IGZvciB0ZW1wMiBmb3IgdGhlIExNOTkgKi8KLQlpZiAoZGF0YS0+a2luZCA9PSBsbTk5ICYmIGF0dHItPmluZGV4ID09IDMpCi0JCXRlbXAgKz0gMTYwMDA7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCAtIHRlbXBfZnJvbV9zOChkYXRhLT50ZW1wX2h5c3QpKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBoeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmR1bW15LAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwotCWxvbmcgdmFsOwotCWludCBlcnI7Ci0JaW50IHRlbXA7Ci0KLQllcnIgPSBrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCWlmIChkYXRhLT5raW5kID09IGFkdDc0NjEgfHwgZGF0YS0+a2luZCA9PSB0bXA0NTEpCi0JCXRlbXAgPSB0ZW1wX2Zyb21fdThfYWR0NzQ2MShkYXRhLCBkYXRhLT50ZW1wOFtMT0NBTF9DUklUXSk7Ci0JZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBtYXg2NjQ2KQotCQl0ZW1wID0gdGVtcF9mcm9tX3U4KGRhdGEtPnRlbXA4W0xPQ0FMX0NSSVRdKTsKLQllbHNlCi0JCXRlbXAgPSB0ZW1wX2Zyb21fczgoZGF0YS0+dGVtcDhbTE9DQUxfQ1JJVF0pOwotCi0JZGF0YS0+dGVtcF9oeXN0ID0gaHlzdF90b19yZWcodGVtcCAtIHZhbCk7Ci0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTBfUkVHX1dfVENSSVRfSFlTVCwKLQkJCQkgIGRhdGEtPnRlbXBfaHlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkdW1teSwKLQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gbG05MF91cGRhdGVfZGV2aWNlKGRldik7Ci0KLQlpZiAoSVNfRVJSKGRhdGEpKQotCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5hbGFybXMpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKLQkJCSAgKmRldmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7Ci0Jc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGxtOTBfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBiaXRuciA9IGF0dHItPmluZGV4OwotCi0JaWYgKElTX0VSUihkYXRhKSkKLQkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKGRhdGEtPmFsYXJtcyA+PiBiaXRucikgJiAxKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd191cGRhdGVfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT51cGRhdGVfaW50ZXJ2YWwpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfdXBkYXRlX2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgZXJyOwotCi0JZXJyID0ga3N0cnRvdWwoYnVmLCAxMCwgJnZhbCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlsbTkwX3NldF9jb252cmF0ZShjbGllbnQsIGRhdGEsIGNsYW1wX3ZhbCh2YWwsIDAsIDEwMDAwMCkpOwotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcDExLCBOVUxMLAotCTAsIExPQ0FMX1RFTVApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAxMSwgTlVMTCwKLQkwLCBSRU1PVEVfVEVNUCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDgsCi0Jc2V0X3RlbXA4LCBMT0NBTF9MT1cpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAyX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDExLAotCXNldF90ZW1wMTEsIDAsIFJFTU9URV9MT1cpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXA4LAotCXNldF90ZW1wOCwgTE9DQUxfSElHSCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDJfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wMTEsCi0Jc2V0X3RlbXAxMSwgMSwgUkVNT1RFX0hJR0gpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wOCwKLQlzZXRfdGVtcDgsIExPQ0FMX0NSSVQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wOCwKLQlzZXRfdGVtcDgsIFJFTU9URV9DUklUKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1waHlzdCwKLQlzZXRfdGVtcGh5c3QsIExPQ0FMX0NSSVQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9jcml0X2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcGh5c3QsIE5VTEwsCi0JUkVNT1RFX0NSSVQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAyX29mZnNldCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDExLAotCXNldF90ZW1wMTEsIDIsIFJFTU9URV9PRkZTRVQpOwotCi0vKiBJbmRpdmlkdWFsIGFsYXJtIGZpbGVzICovCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXRfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfZmF1bHQsIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9taW5fYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9tYXhfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9taW5fYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDUpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXhfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDYpOwotLyogUmF3IGFsYXJtIGZpbGUgZm9yIGNvbXBhdGliaWxpdHkgKi8KLXN0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMKTsKLQotc3RhdGljIERFVklDRV9BVFRSKHVwZGF0ZV9pbnRlcnZhbCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdXBkYXRlX2ludGVydmFsLAotCQkgICBzZXRfdXBkYXRlX2ludGVydmFsKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtOTBfYXR0cmlidXRlc1tdID0gewotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9taW4uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21pbi5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9tYXguZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2NyaXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2NyaXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2NyaXRfaHlzdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdF9oeXN0LmRldl9hdHRyLmF0dHIsCi0KLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2NyaXRfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2NyaXRfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmZGV2X2F0dHJfYWxhcm1zLmF0dHIsCi0JJmRldl9hdHRyX3VwZGF0ZV9pbnRlcnZhbC5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGxtOTBfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbG05MF9hdHRyaWJ1dGVzLAotfTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtOTBfdGVtcDJfb2Zmc2V0X2F0dHJpYnV0ZXNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX29mZnNldC5kZXZfYXR0ci5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGxtOTBfdGVtcDJfb2Zmc2V0X2dyb3VwID0gewotCS5hdHRycyA9IGxtOTBfdGVtcDJfb2Zmc2V0X2F0dHJpYnV0ZXMsCi19OwotCi0vKgotICogQWRkaXRpb25hbCBhdHRyaWJ1dGVzIGZvciBkZXZpY2VzIHdpdGggZW1lcmdlbmN5IHNlbnNvcnMKLSAqLwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9lbWVyZ2VuY3ksIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXA4LAotCXNldF90ZW1wOCwgTE9DQUxfRU1FUkcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9lbWVyZ2VuY3ksIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXA4LAotCXNldF90ZW1wOCwgUkVNT1RFX0VNRVJHKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfZW1lcmdlbmN5X2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcGh5c3QsCi0JCQkgIE5VTEwsIExPQ0FMX0VNRVJHKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfZW1lcmdlbmN5X2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcGh5c3QsCi0JCQkgIE5VTEwsIFJFTU9URV9FTUVSRyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsbTkwX2VtZXJnZW5jeV9hdHRyaWJ1dGVzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9lbWVyZ2VuY3kuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2VtZXJnZW5jeS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfZW1lcmdlbmN5X2h5c3QuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2VtZXJnZW5jeV9oeXN0LmRldl9hdHRyLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbG05MF9lbWVyZ2VuY3lfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbG05MF9lbWVyZ2VuY3lfYXR0cmlidXRlcywKLX07Ci0KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfZW1lcmdlbmN5X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxNSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2VtZXJnZW5jeV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTMpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG05MF9lbWVyZ2VuY3lfYWxhcm1fYXR0cmlidXRlc1tdID0gewotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfZW1lcmdlbmN5X2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9lbWVyZ2VuY3lfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsbTkwX2VtZXJnZW5jeV9hbGFybV9ncm91cCA9IHsKLQkuYXR0cnMgPSBsbTkwX2VtZXJnZW5jeV9hbGFybV9hdHRyaWJ1dGVzLAotfTsKLQotLyoKLSAqIEFkZGl0aW9uYWwgYXR0cmlidXRlcyBmb3IgZGV2aWNlcyB3aXRoIDMgdGVtcGVyYXR1cmUgc2Vuc29ycwotICovCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcDExLCBOVUxMLAotCTAsIFJFTU9URTJfVEVNUCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDNfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wMTEsCi0Jc2V0X3RlbXAxMSwgMywgUkVNT1RFMl9MT1cpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAzX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDExLAotCXNldF90ZW1wMTEsIDQsIFJFTU9URTJfSElHSCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXA4LAotCXNldF90ZW1wOCwgUkVNT1RFMl9DUklUKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfY3JpdF9oeXN0LCBTX0lSVUdPLCBzaG93X3RlbXBoeXN0LCBOVUxMLAotCVJFTU9URTJfQ1JJVCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2VtZXJnZW5jeSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDgsCi0Jc2V0X3RlbXA4LCBSRU1PVEUyX0VNRVJHKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfZW1lcmdlbmN5X2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcGh5c3QsCi0JCQkgIE5VTEwsIFJFTU9URTJfRU1FUkcpOwotCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2NyaXRfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDkpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19mYXVsdCwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19taW5fYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDExKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2VtZXJnZW5jeV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTQpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG05MF90ZW1wM19hdHRyaWJ1dGVzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWluLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXguZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2NyaXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2NyaXRfaHlzdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfZW1lcmdlbmN5LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19lbWVyZ2VuY3lfaHlzdC5kZXZfYXR0ci5hdHRyLAotCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2NyaXRfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2VtZXJnZW5jeV9hbGFybS5kZXZfYXR0ci5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGxtOTBfdGVtcDNfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbG05MF90ZW1wM19hdHRyaWJ1dGVzLAotfTsKLQogLyogcGVjIHVzZWQgZm9yIEFETTEwMzIgb25seSAqLwogc3RhdGljIHNzaXplX3Qgc2hvd19wZWMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZHVtbXksCiAJCQljaGFyICpidWYpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShjbGllbnQtPmZsYWdzICYgSTJDX0NMSUVOVF9QRUMpKTsKIH0KIApAQCAtMTI3OCw5ICs4NjUsNDMxIEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUihwZWMsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3BlYywgc2V0X3BlYyk7CiAKLS8qCi0gKiBSZWFsIGNvZGUKLSAqLworc3RhdGljIGludCBsbTkwX2dldF90ZW1wMTEoc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwgaW50IGluZGV4KQoreworCXMxNiB0ZW1wMTEgPSBkYXRhLT50ZW1wMTFbaW5kZXhdOworCWludCB0ZW1wOworCisJaWYgKGRhdGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1MSkKKwkJdGVtcCA9IHRlbXBfZnJvbV91MTZfYWR0NzQ2MShkYXRhLCB0ZW1wMTEpOworCWVsc2UgaWYgKGRhdGEtPmtpbmQgPT0gbWF4NjY0NikKKwkJdGVtcCA9IHRlbXBfZnJvbV91MTYodGVtcDExKTsKKwllbHNlCisJCXRlbXAgPSB0ZW1wX2Zyb21fczE2KHRlbXAxMSk7CisKKwkvKiArMTYgZGVncmVlcyBvZmZzZXQgZm9yIHRlbXAyIGZvciB0aGUgTE05OSAqLworCWlmIChkYXRhLT5raW5kID09IGxtOTkgJiYgaW5kZXggPD0gMikKKwkJdGVtcCArPSAxNjAwMDsKKworCXJldHVybiB0ZW1wOworfQorCitzdGF0aWMgaW50IGxtOTBfc2V0X3RlbXAxMShzdHJ1Y3QgbG05MF9kYXRhICpkYXRhLCBpbnQgaW5kZXgsIGxvbmcgdmFsKQoreworCXN0YXRpYyBzdHJ1Y3QgcmVnIHsKKwkJdTggaGlnaDsKKwkJdTggbG93OworCX0gcmVnW10gPSB7CisJW1JFTU9URV9MT1ddID0geyBMTTkwX1JFR19XX1JFTU9URV9MT1dILCBMTTkwX1JFR19XX1JFTU9URV9MT1dMIH0sCisJW1JFTU9URV9ISUdIXSA9IHsgTE05MF9SRUdfV19SRU1PVEVfSElHSEgsIExNOTBfUkVHX1dfUkVNT1RFX0hJR0hMIH0sCisJW1JFTU9URV9PRkZTRVRdID0geyBMTTkwX1JFR19XX1JFTU9URV9PRkZTSCwgTE05MF9SRUdfV19SRU1PVEVfT0ZGU0wgfSwKKwlbUkVNT1RFMl9MT1ddID0geyBMTTkwX1JFR19XX1JFTU9URV9MT1dILCBMTTkwX1JFR19XX1JFTU9URV9MT1dMIH0sCisJW1JFTU9URTJfSElHSF0gPSB7IExNOTBfUkVHX1dfUkVNT1RFX0hJR0hILCBMTTkwX1JFR19XX1JFTU9URV9ISUdITCB9CisJfTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCXN0cnVjdCByZWcgKnJlZ3AgPSAmcmVnW2luZGV4XTsKKwlpbnQgZXJyOworCisJLyogKzE2IGRlZ3JlZXMgb2Zmc2V0IGZvciB0ZW1wMiBmb3IgdGhlIExNOTkgKi8KKwlpZiAoZGF0YS0+a2luZCA9PSBsbTk5ICYmIGluZGV4IDw9IDIpCisJCXZhbCAtPSAxNjAwMDsKKworCWlmIChkYXRhLT5raW5kID09IGFkdDc0NjEgfHwgZGF0YS0+a2luZCA9PSB0bXA0NTEpCisJCWRhdGEtPnRlbXAxMVtpbmRleF0gPSB0ZW1wX3RvX3UxNl9hZHQ3NDYxKGRhdGEsIHZhbCk7CisJZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBtYXg2NjQ2KQorCQlkYXRhLT50ZW1wMTFbaW5kZXhdID0gdGVtcF90b191OCh2YWwpIDw8IDg7CisJZWxzZSBpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfUkVNX0xJTUlUX0VYVCkKKwkJZGF0YS0+dGVtcDExW2luZGV4XSA9IHRlbXBfdG9fczE2KHZhbCk7CisJZWxzZQorCQlkYXRhLT50ZW1wMTFbaW5kZXhdID0gdGVtcF90b19zOCh2YWwpIDw8IDg7CisKKwlsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChjbGllbnQsIGRhdGEsIGluZGV4ID49IDMpOworCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWdwLT5oaWdoLAorCQkJCSAgZGF0YS0+dGVtcDExW2luZGV4XSA+PiA4KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfUkVNX0xJTUlUX0VYVCkKKwkJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZ3AtPmxvdywKKwkJCQkJCWRhdGEtPnRlbXAxMVtpbmRleF0gJiAweGZmKTsKKworCWxtOTBfc2VsZWN0X3JlbW90ZV9jaGFubmVsKGNsaWVudCwgZGF0YSwgMCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBsbTkwX2dldF90ZW1wOChzdHJ1Y3QgbG05MF9kYXRhICpkYXRhLCBpbnQgaW5kZXgpCit7CisJczggdGVtcDggPSBkYXRhLT50ZW1wOFtpbmRleF07CisJaW50IHRlbXA7CisKKwlpZiAoZGF0YS0+a2luZCA9PSBhZHQ3NDYxIHx8IGRhdGEtPmtpbmQgPT0gdG1wNDUxKQorCQl0ZW1wID0gdGVtcF9mcm9tX3U4X2FkdDc0NjEoZGF0YSwgdGVtcDgpOworCWVsc2UgaWYgKGRhdGEtPmtpbmQgPT0gbWF4NjY0NikKKwkJdGVtcCA9IHRlbXBfZnJvbV91OCh0ZW1wOCk7CisJZWxzZQorCQl0ZW1wID0gdGVtcF9mcm9tX3M4KHRlbXA4KTsKKworCS8qICsxNiBkZWdyZWVzIG9mZnNldCBmb3IgdGVtcDIgZm9yIHRoZSBMTTk5ICovCisJaWYgKGRhdGEtPmtpbmQgPT0gbG05OSAmJiBpbmRleCA9PSAzKQorCQl0ZW1wICs9IDE2MDAwOworCisJcmV0dXJuIHRlbXA7Cit9CisKK3N0YXRpYyBpbnQgbG05MF9zZXRfdGVtcDgoc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwgaW50IGluZGV4LCBsb25nIHZhbCkKK3sKKwlzdGF0aWMgY29uc3QgdTggcmVnW1RFTVA4X1JFR19OVU1dID0geworCQlMTTkwX1JFR19XX0xPQ0FMX0xPVywKKwkJTE05MF9SRUdfV19MT0NBTF9ISUdILAorCQlMTTkwX1JFR19XX0xPQ0FMX0NSSVQsCisJCUxNOTBfUkVHX1dfUkVNT1RFX0NSSVQsCisJCU1BWDY2NTlfUkVHX1dfTE9DQUxfRU1FUkcsCisJCU1BWDY2NTlfUkVHX1dfUkVNT1RFX0VNRVJHLAorCQlMTTkwX1JFR19XX1JFTU9URV9DUklULAorCQlNQVg2NjU5X1JFR19XX1JFTU9URV9FTUVSRywKKwl9OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CisJaW50IGVycjsKKworCS8qICsxNiBkZWdyZWVzIG9mZnNldCBmb3IgdGVtcDIgZm9yIHRoZSBMTTk5ICovCisJaWYgKGRhdGEtPmtpbmQgPT0gbG05OSAmJiBpbmRleCA9PSAzKQorCQl2YWwgLT0gMTYwMDA7CisKKwlpZiAoZGF0YS0+a2luZCA9PSBhZHQ3NDYxIHx8IGRhdGEtPmtpbmQgPT0gdG1wNDUxKQorCQlkYXRhLT50ZW1wOFtpbmRleF0gPSB0ZW1wX3RvX3U4X2FkdDc0NjEoZGF0YSwgdmFsKTsKKwllbHNlIGlmIChkYXRhLT5raW5kID09IG1heDY2NDYpCisJCWRhdGEtPnRlbXA4W2luZGV4XSA9IHRlbXBfdG9fdTgodmFsKTsKKwllbHNlCisJCWRhdGEtPnRlbXA4W2luZGV4XSA9IHRlbXBfdG9fczgodmFsKTsKKworCWxtOTBfc2VsZWN0X3JlbW90ZV9jaGFubmVsKGNsaWVudCwgZGF0YSwgaW5kZXggPj0gNik7CisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZ1tpbmRleF0sIGRhdGEtPnRlbXA4W2luZGV4XSk7CisJbG05MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoY2xpZW50LCBkYXRhLCAwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbG05MF9nZXRfdGVtcGh5c3Qoc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwgaW50IGluZGV4KQoreworCWludCB0ZW1wOworCisJaWYgKGRhdGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1MSkKKwkJdGVtcCA9IHRlbXBfZnJvbV91OF9hZHQ3NDYxKGRhdGEsIGRhdGEtPnRlbXA4W2luZGV4XSk7CisJZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBtYXg2NjQ2KQorCQl0ZW1wID0gdGVtcF9mcm9tX3U4KGRhdGEtPnRlbXA4W2luZGV4XSk7CisJZWxzZQorCQl0ZW1wID0gdGVtcF9mcm9tX3M4KGRhdGEtPnRlbXA4W2luZGV4XSk7CisKKwkvKiArMTYgZGVncmVlcyBvZmZzZXQgZm9yIHRlbXAyIGZvciB0aGUgTE05OSAqLworCWlmIChkYXRhLT5raW5kID09IGxtOTkgJiYgaW5kZXggPT0gMykKKwkJdGVtcCArPSAxNjAwMDsKKworCXJldHVybiB0ZW1wIC0gdGVtcF9mcm9tX3M4KGRhdGEtPnRlbXBfaHlzdCk7Cit9CisKK3N0YXRpYyBpbnQgbG05MF9zZXRfdGVtcGh5c3Qoc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwgbG9uZyB2YWwpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlpbnQgdGVtcDsKKwlpbnQgZXJyOworCisJaWYgKGRhdGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1MSkKKwkJdGVtcCA9IHRlbXBfZnJvbV91OF9hZHQ3NDYxKGRhdGEsIGRhdGEtPnRlbXA4W0xPQ0FMX0NSSVRdKTsKKwllbHNlIGlmIChkYXRhLT5raW5kID09IG1heDY2NDYpCisJCXRlbXAgPSB0ZW1wX2Zyb21fdTgoZGF0YS0+dGVtcDhbTE9DQUxfQ1JJVF0pOworCWVsc2UKKwkJdGVtcCA9IHRlbXBfZnJvbV9zOChkYXRhLT50ZW1wOFtMT0NBTF9DUklUXSk7CisKKwlkYXRhLT50ZW1wX2h5c3QgPSBoeXN0X3RvX3JlZyh0ZW1wIC0gdmFsKTsKKwllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05MF9SRUdfV19UQ1JJVF9IWVNULAorCQkJCQlkYXRhLT50ZW1wX2h5c3QpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCB1OCBsbTkwX3RlbXBfaW5kZXhbM10gPSB7CisJTE9DQUxfVEVNUCwgUkVNT1RFX1RFTVAsIFJFTU9URTJfVEVNUAorfTsKKworc3RhdGljIGNvbnN0IHU4IGxtOTBfdGVtcF9taW5faW5kZXhbM10gPSB7CisJTE9DQUxfTE9XLCBSRU1PVEVfTE9XLCBSRU1PVEUyX0xPVworfTsKKworc3RhdGljIGNvbnN0IHU4IGxtOTBfdGVtcF9tYXhfaW5kZXhbM10gPSB7CisJTE9DQUxfSElHSCwgUkVNT1RFX0hJR0gsIFJFTU9URTJfSElHSAorfTsKKworc3RhdGljIGNvbnN0IHU4IGxtOTBfdGVtcF9jcml0X2luZGV4WzNdID0geworCUxPQ0FMX0NSSVQsIFJFTU9URV9DUklULCBSRU1PVEUyX0NSSVQKK307CisKK3N0YXRpYyBjb25zdCB1OCBsbTkwX3RlbXBfZW1lcmdfaW5kZXhbM10gPSB7CisJTE9DQUxfRU1FUkcsIFJFTU9URV9FTUVSRywgUkVNT1RFMl9FTUVSRworfTsKKworc3RhdGljIGNvbnN0IHU4IGxtOTBfbWluX2FsYXJtX2JpdHNbM10gPSB7IDUsIDMsIDExIH07CitzdGF0aWMgY29uc3QgdTggbG05MF9tYXhfYWxhcm1fYml0c1szXSA9IHsgMCwgNCwgMTIgfTsKK3N0YXRpYyBjb25zdCB1OCBsbTkwX2NyaXRfYWxhcm1fYml0c1szXSA9IHsgMCwgMSwgOSB9Oworc3RhdGljIGNvbnN0IHU4IGxtOTBfZW1lcmdlbmN5X2FsYXJtX2JpdHNbM10gPSB7IDE1LCAxMywgMTQgfTsKK3N0YXRpYyBjb25zdCB1OCBsbTkwX2ZhdWx0X2JpdHNbM10gPSB7IDAsIDIsIDEwIH07CisKK3N0YXRpYyBpbnQgbG05MF90ZW1wX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnZhbCkKK3sKKwlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwllcnIgPSBsbTkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCQkqdmFsID0gbG05MF9nZXRfdGVtcDExKGRhdGEsIGxtOTBfdGVtcF9pbmRleFtjaGFubmVsXSk7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9taW5fYWxhcm06CisJCSp2YWwgPSAoZGF0YS0+YWxhcm1zID4+IGxtOTBfbWluX2FsYXJtX2JpdHNbY2hhbm5lbF0pICYgMTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX21heF9hbGFybToKKwkJKnZhbCA9IChkYXRhLT5hbGFybXMgPj4gbG05MF9tYXhfYWxhcm1fYml0c1tjaGFubmVsXSkgJiAxOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9hbGFybToKKwkJKnZhbCA9IChkYXRhLT5hbGFybXMgPj4gbG05MF9jcml0X2FsYXJtX2JpdHNbY2hhbm5lbF0pICYgMTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX2VtZXJnZW5jeV9hbGFybToKKwkJKnZhbCA9IChkYXRhLT5hbGFybXMgPj4gbG05MF9lbWVyZ2VuY3lfYWxhcm1fYml0c1tjaGFubmVsXSkgJiAxOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfZmF1bHQ6CisJCSp2YWwgPSAoZGF0YS0+YWxhcm1zID4+IGxtOTBfZmF1bHRfYml0c1tjaGFubmVsXSkgJiAxOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfbWluOgorCQlpZiAoY2hhbm5lbCA9PSAwKQorCQkJKnZhbCA9IGxtOTBfZ2V0X3RlbXA4KGRhdGEsCisJCQkJCSAgICAgIGxtOTBfdGVtcF9taW5faW5kZXhbY2hhbm5lbF0pOworCQllbHNlCisJCQkqdmFsID0gbG05MF9nZXRfdGVtcDExKGRhdGEsCisJCQkJCSAgICAgICBsbTkwX3RlbXBfbWluX2luZGV4W2NoYW5uZWxdKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX21heDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkKKwkJCSp2YWwgPSBsbTkwX2dldF90ZW1wOChkYXRhLAorCQkJCQkgICAgICBsbTkwX3RlbXBfbWF4X2luZGV4W2NoYW5uZWxdKTsKKwkJZWxzZQorCQkJKnZhbCA9IGxtOTBfZ2V0X3RlbXAxMShkYXRhLAorCQkJCQkgICAgICAgbG05MF90ZW1wX21heF9pbmRleFtjaGFubmVsXSk7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9jcml0OgorCQkqdmFsID0gbG05MF9nZXRfdGVtcDgoZGF0YSwgbG05MF90ZW1wX2NyaXRfaW5kZXhbY2hhbm5lbF0pOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9oeXN0OgorCQkqdmFsID0gbG05MF9nZXRfdGVtcGh5c3QoZGF0YSwgbG05MF90ZW1wX2NyaXRfaW5kZXhbY2hhbm5lbF0pOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfZW1lcmdlbmN5OgorCQkqdmFsID0gbG05MF9nZXRfdGVtcDgoZGF0YSwgbG05MF90ZW1wX2VtZXJnX2luZGV4W2NoYW5uZWxdKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX2VtZXJnZW5jeV9oeXN0OgorCQkqdmFsID0gbG05MF9nZXRfdGVtcGh5c3QoZGF0YSwgbG05MF90ZW1wX2VtZXJnX2luZGV4W2NoYW5uZWxdKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX29mZnNldDoKKwkJKnZhbCA9IGxtOTBfZ2V0X3RlbXAxMShkYXRhLCBSRU1PVEVfT0ZGU0VUKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsbTkwX3RlbXBfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgdmFsKQoreworCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJZXJyID0gbG05MF91cGRhdGVfZGV2aWNlKGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJvcjsKKworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fdGVtcF9taW46CisJCWlmIChjaGFubmVsID09IDApCisJCQllcnIgPSBsbTkwX3NldF90ZW1wOChkYXRhLAorCQkJCQkgICAgICBsbTkwX3RlbXBfbWluX2luZGV4W2NoYW5uZWxdLAorCQkJCQkgICAgICB2YWwpOworCQllbHNlCisJCQllcnIgPSBsbTkwX3NldF90ZW1wMTEoZGF0YSwKKwkJCQkJICAgICAgbG05MF90ZW1wX21pbl9pbmRleFtjaGFubmVsXSwKKwkJCQkJICAgICAgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX21heDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkKKwkJCWVyciA9IGxtOTBfc2V0X3RlbXA4KGRhdGEsCisJCQkJCSAgICAgbG05MF90ZW1wX21heF9pbmRleFtjaGFubmVsXSwKKwkJCQkJICAgICB2YWwpOworCQllbHNlCisJCQllcnIgPSBsbTkwX3NldF90ZW1wMTEoZGF0YSwKKwkJCQkJICAgICAgbG05MF90ZW1wX21heF9pbmRleFtjaGFubmVsXSwKKwkJCQkJICAgICAgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX2NyaXQ6CisJCWVyciA9IGxtOTBfc2V0X3RlbXA4KGRhdGEsIGxtOTBfdGVtcF9jcml0X2luZGV4W2NoYW5uZWxdLCB2YWwpOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9oeXN0OgorCQllcnIgPSBsbTkwX3NldF90ZW1waHlzdChkYXRhLCB2YWwpOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfZW1lcmdlbmN5OgorCQllcnIgPSBsbTkwX3NldF90ZW1wOChkYXRhLCBsbTkwX3RlbXBfZW1lcmdfaW5kZXhbY2hhbm5lbF0sIHZhbCk7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9vZmZzZXQ6CisJCWVyciA9IGxtOTBfc2V0X3RlbXAxMShkYXRhLCBSRU1PVEVfT0ZGU0VULCB2YWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorZXJyb3I6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdW1vZGVfdCBsbTkwX3RlbXBfaXNfdmlzaWJsZShjb25zdCB2b2lkICpkYXRhLCB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCit7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCWNhc2UgaHdtb25fdGVtcF9taW5fYWxhcm06CisJY2FzZSBod21vbl90ZW1wX21heF9hbGFybToKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9hbGFybToKKwljYXNlIGh3bW9uX3RlbXBfZW1lcmdlbmN5X2FsYXJtOgorCWNhc2UgaHdtb25fdGVtcF9lbWVyZ2VuY3lfaHlzdDoKKwljYXNlIGh3bW9uX3RlbXBfZmF1bHQ6CisJCXJldHVybiBTX0lSVUdPOworCWNhc2UgaHdtb25fdGVtcF9taW46CisJY2FzZSBod21vbl90ZW1wX21heDoKKwljYXNlIGh3bW9uX3RlbXBfY3JpdDoKKwljYXNlIGh3bW9uX3RlbXBfZW1lcmdlbmN5OgorCWNhc2UgaHdtb25fdGVtcF9vZmZzZXQ6CisJCXJldHVybiBTX0lSVUdPIHwgU19JV1VTUjsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9oeXN0OgorCQlpZiAoY2hhbm5lbCA9PSAwKQorCQkJcmV0dXJuIFNfSVJVR08gfCBTX0lXVVNSOworCQlyZXR1cm4gU19JUlVHTzsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbG05MF9jaGlwX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnZhbCkKK3sKKwlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwllcnIgPSBsbTkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl9jaGlwX3VwZGF0ZV9pbnRlcnZhbDoKKwkJKnZhbCA9IGRhdGEtPnVwZGF0ZV9pbnRlcnZhbDsKKwkJYnJlYWs7CisJY2FzZSBod21vbl9jaGlwX2FsYXJtczoKKwkJKnZhbCA9IGRhdGEtPmFsYXJtczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxtOTBfY2hpcF93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyB2YWwpCit7CisJc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWVyciA9IGxtOTBfdXBkYXRlX2RldmljZShkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3I7CisKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsOgorCQllcnIgPSBsbTkwX3NldF9jb252cmF0ZShjbGllbnQsIGRhdGEsCisJCQkJCWNsYW1wX3ZhbCh2YWwsIDAsIDEwMDAwMCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorZXJyb3I6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdW1vZGVfdCBsbTkwX2NoaXBfaXNfdmlzaWJsZShjb25zdCB2b2lkICpkYXRhLCB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCit7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl9jaGlwX3VwZGF0ZV9pbnRlcnZhbDoKKwkJcmV0dXJuIFNfSVJVR08gfCBTX0lXVVNSOworCWNhc2UgaHdtb25fY2hpcF9hbGFybXM6CisJCXJldHVybiBTX0lSVUdPOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBsbTkwX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkgICAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyAqdmFsKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgaHdtb25fY2hpcDoKKwkJcmV0dXJuIGxtOTBfY2hpcF9yZWFkKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwljYXNlIGh3bW9uX3RlbXA6CisJCXJldHVybiBsbTkwX3RlbXBfcmVhZChkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworc3RhdGljIGludCBsbTkwX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJICAgICAgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nIHZhbCkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2NoaXA6CisJCXJldHVybiBsbTkwX2NoaXBfd3JpdGUoZGV2LCBhdHRyLCBjaGFubmVsLCB2YWwpOworCWNhc2UgaHdtb25fdGVtcDoKKwkJcmV0dXJuIGxtOTBfdGVtcF93cml0ZShkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworc3RhdGljIHVtb2RlX3QgbG05MF9pc192aXNpYmxlKGNvbnN0IHZvaWQgKmRhdGEsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkgICAgICAgdTMyIGF0dHIsIGludCBjaGFubmVsKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgaHdtb25fY2hpcDoKKwkJcmV0dXJuIGxtOTBfY2hpcF9pc192aXNpYmxlKGRhdGEsIGF0dHIsIGNoYW5uZWwpOworCWNhc2UgaHdtb25fdGVtcDoKKwkJcmV0dXJuIGxtOTBfdGVtcF9pc192aXNpYmxlKGRhdGEsIGF0dHIsIGNoYW5uZWwpOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KIAogLyogUmV0dXJuIDAgaWYgZGV0ZWN0aW9uIGlzIHN1Y2Nlc3NmdWwsIC1FTk9ERVYgb3RoZXJ3aXNlICovCiBzdGF0aWMgaW50IGxtOTBfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCkBAIC0xNjE3LDE1ICsxNjI2LDMyIEBACiAJcmVndWxhdG9yX2Rpc2FibGUocmVndWxhdG9yKTsKIH0KIAorc3RhdGljIGNvbnN0IHUzMiBsbTkwX2NoaXBfY29uZmlnW10gPSB7CisJSFdNT05fQ19SRUdJU1RFUl9UWiB8IEhXTU9OX0NfVVBEQVRFX0lOVEVSVkFMIHwgSFdNT05fQ19BTEFSTVMsCisJMAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbG05MF9jaGlwX2luZm8gPSB7CisJLnR5cGUgPSBod21vbl9jaGlwLAorCS5jb25maWcgPSBsbTkwX2NoaXBfY29uZmlnLAorfTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX29wcyBsbTkwX29wcyA9IHsKKwkuaXNfdmlzaWJsZSA9IGxtOTBfaXNfdmlzaWJsZSwKKwkucmVhZCA9IGxtOTBfcmVhZCwKKwkud3JpdGUgPSBsbTkwX3dyaXRlLAorfTsKKwogc3RhdGljIGludCBsbTkwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoZGV2LT5wYXJlbnQpOwotCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGE7CisJc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3I7CiAJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwotCWludCBncm91cHMgPSAwOworCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGE7CiAJaW50IGVycjsKIAogCXJlZ3VsYXRvciA9IGRldm1fcmVndWxhdG9yX2dldChkZXYsICJ2Y2MiKTsKQEAgLTE2NjUsNiArMTY5MSw0OSBAQAogCiAJLyogU2V0IGNoaXAgY2FwYWJpbGl0aWVzICovCiAJZGF0YS0+ZmxhZ3MgPSBsbTkwX3BhcmFtc1tkYXRhLT5raW5kXS5mbGFnczsKKworCWRhdGEtPmNoaXAub3BzID0gJmxtOTBfb3BzOworCWRhdGEtPmNoaXAuaW5mbyA9IGRhdGEtPmluZm87CisKKwlkYXRhLT5pbmZvWzBdID0gJmxtOTBfY2hpcF9pbmZvOworCWRhdGEtPmluZm9bMV0gPSAmZGF0YS0+dGVtcF9pbmZvOworCisJaW5mbyA9ICZkYXRhLT50ZW1wX2luZm87CisJaW5mby0+dHlwZSA9IGh3bW9uX3RlbXA7CisJaW5mby0+Y29uZmlnID0gZGF0YS0+Y2hhbm5lbF9jb25maWc7CisKKwlkYXRhLT5jaGFubmVsX2NvbmZpZ1swXSA9IEhXTU9OX1RfSU5QVVQgfCBIV01PTl9UX01JTiB8IEhXTU9OX1RfTUFYIHwKKwkJSFdNT05fVF9DUklUIHwgSFdNT05fVF9DUklUX0hZU1QgfCBIV01PTl9UX01JTl9BTEFSTSB8CisJCUhXTU9OX1RfTUFYX0FMQVJNIHwgSFdNT05fVF9DUklUX0FMQVJNOworCWRhdGEtPmNoYW5uZWxfY29uZmlnWzFdID0gSFdNT05fVF9JTlBVVCB8IEhXTU9OX1RfTUlOIHwgSFdNT05fVF9NQVggfAorCQlIV01PTl9UX0NSSVQgfCBIV01PTl9UX0NSSVRfSFlTVCB8IEhXTU9OX1RfTUlOX0FMQVJNIHwKKwkJSFdNT05fVF9NQVhfQUxBUk0gfCBIV01PTl9UX0NSSVRfQUxBUk0gfCBIV01PTl9UX0ZBVUxUOworCisJaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX09GRlNFVCkKKwkJZGF0YS0+Y2hhbm5lbF9jb25maWdbMV0gfD0gSFdNT05fVF9PRkZTRVQ7CisKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfRU1FUkdFTkNZKSB7CisJCWRhdGEtPmNoYW5uZWxfY29uZmlnWzBdIHw9IEhXTU9OX1RfRU1FUkdFTkNZIHwKKwkJCUhXTU9OX1RfRU1FUkdFTkNZX0hZU1Q7CisJCWRhdGEtPmNoYW5uZWxfY29uZmlnWzFdIHw9IEhXTU9OX1RfRU1FUkdFTkNZIHwKKwkJCUhXTU9OX1RfRU1FUkdFTkNZX0hZU1Q7CisJfQorCisJaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX0VNRVJHRU5DWV9BTEFSTSkgeworCQlkYXRhLT5jaGFubmVsX2NvbmZpZ1swXSB8PSBIV01PTl9UX0VNRVJHRU5DWV9BTEFSTTsKKwkJZGF0YS0+Y2hhbm5lbF9jb25maWdbMV0gfD0gSFdNT05fVF9FTUVSR0VOQ1lfQUxBUk07CisJfQorCisJaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX1RFTVAzKSB7CisJCWRhdGEtPmNoYW5uZWxfY29uZmlnWzJdID0gSFdNT05fVF9JTlBVVCB8CisJCQlIV01PTl9UX01JTiB8IEhXTU9OX1RfTUFYIHwKKwkJCUhXTU9OX1RfQ1JJVCB8IEhXTU9OX1RfQ1JJVF9IWVNUIHwKKwkJCUhXTU9OX1RfRU1FUkdFTkNZIHwgSFdNT05fVF9FTUVSR0VOQ1lfSFlTVCB8CisJCQlIV01PTl9UX01JTl9BTEFSTSB8IEhXTU9OX1RfTUFYX0FMQVJNIHwKKwkJCUhXTU9OX1RfQ1JJVF9BTEFSTSB8IEhXTU9OX1RfRU1FUkdFTkNZX0FMQVJNIHwKKwkJCUhXTU9OX1RfRkFVTFQ7CisJfQorCiAJZGF0YS0+cmVnX2xvY2FsX2V4dCA9IGxtOTBfcGFyYW1zW2RhdGEtPmtpbmRdLnJlZ19sb2NhbF9leHQ7CiAKIAkvKiBTZXQgbWF4aW11bSBjb252ZXJzaW9uIHJhdGUgKi8KQEAgLTE2NzcsMjEgKzE3NDYsMTAgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwotCWRhdGEtPmdyb3Vwc1tncm91cHMrK10gPSAmbG05MF9ncm91cDsKLQotCWlmIChkYXRhLT5mbGFncyAmIExNOTBfSEFWRV9PRkZTRVQpCi0JCWRhdGEtPmdyb3Vwc1tncm91cHMrK10gPSAmbG05MF90ZW1wMl9vZmZzZXRfZ3JvdXA7Ci0KLQlpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfRU1FUkdFTkNZKQotCQlkYXRhLT5ncm91cHNbZ3JvdXBzKytdID0gJmxtOTBfZW1lcmdlbmN5X2dyb3VwOwotCi0JaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX0VNRVJHRU5DWV9BTEFSTSkKLQkJZGF0YS0+Z3JvdXBzW2dyb3VwcysrXSA9ICZsbTkwX2VtZXJnZW5jeV9hbGFybV9ncm91cDsKLQotCWlmIChkYXRhLT5mbGFncyAmIExNOTBfSEFWRV9URU1QMykKLQkJZGF0YS0+Z3JvdXBzW2dyb3VwcysrXSA9ICZsbTkwX3RlbXAzX2dyb3VwOwotCisJLyoKKwkgKiBUaGUgJ3BlYycgYXR0cmlidXRlIGlzIGF0dGFjaGVkIHRvIHRoZSBpMmMgZGV2aWNlIGFuZCB0aHVzIGNyZWF0ZWQKKwkgKiBzZXBhcmF0ZWx5LgorCSAqLwogCWlmIChjbGllbnQtPmZsYWdzICYgSTJDX0NMSUVOVF9QRUMpIHsKIAkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3BlYyk7CiAJCWlmIChlcnIpCkBAIC0xNzAxLDggKzE3NTksOSBAQAogCQkJcmV0dXJuIGVycjsKIAl9CiAKLQlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKLQkJCQkJCQkgICBkYXRhLCBkYXRhLT5ncm91cHMpOworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgZGF0YSwgJmRhdGEtPmNoaXAsCisJCQkJCQkJIE5VTEwpOwogCWlmIChJU19FUlIoaHdtb25fZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIoaHdtb25fZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTk1MjQxLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYwppbmRleCBjZGYxOWFkLi44YzU3M2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYwpAQCAtMTUsMjIgKzE1LDE3IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9od21vbi5oPgotI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNkZWZpbmUgREVWTkFNRSAibG05NTI0MSIKIApAQCAtNTQsMjYgKzQ5LDI1IEBACiAjZGVmaW5lIExNOTUyNDFfUkVHX1JXX1JFTU9URV9NT0RFTAkweDMwCiAKIC8qIExNOTUyNDEgc3BlY2lmaWMgYml0ZmllbGRzICovCi0jZGVmaW5lIENGR19TVE9QIDB4NDAKLSNkZWZpbmUgQ0ZHX0NSMDA3NiAweDAwCi0jZGVmaW5lIENGR19DUjAxODIgMHgxMAotI2RlZmluZSBDRkdfQ1IxMDAwIDB4MjAKLSNkZWZpbmUgQ0ZHX0NSMjcwMCAweDMwCi0jZGVmaW5lIFIxTVNfU0hJRlQgMAotI2RlZmluZSBSMk1TX1NISUZUIDIKLSNkZWZpbmUgUjFNU19NQVNLICgweDAxIDw8IChSMU1TX1NISUZUKSkKLSNkZWZpbmUgUjJNU19NQVNLICgweDAxIDw8IChSMk1TX1NISUZUKSkKLSNkZWZpbmUgUjFERl9TSElGVCAxCi0jZGVmaW5lIFIyREZfU0hJRlQgMgotI2RlZmluZSBSMURGX01BU0sgKDB4MDEgPDwgKFIxREZfU0hJRlQpKQotI2RlZmluZSBSMkRGX01BU0sgKDB4MDEgPDwgKFIyREZfU0hJRlQpKQotI2RlZmluZSBSMUZFX01BU0sgMHgwMQotI2RlZmluZSBSMkZFX01BU0sgMHgwNQotI2RlZmluZSBUVDFfU0hJRlQgMAotI2RlZmluZSBUVDJfU0hJRlQgNAotI2RlZmluZSBUVF9PRkYgMAotI2RlZmluZSBUVF9PTiAxCi0jZGVmaW5lIFRUX01BU0sgNworI2RlZmluZSBDRkdfU1RPUAlCSVQoNikKKyNkZWZpbmUgQ0ZHX0NSMDA3NgkweDAwCisjZGVmaW5lIENGR19DUjAxODIJQklUKDQpCisjZGVmaW5lIENGR19DUjEwMDAJQklUKDUpCisjZGVmaW5lIENGR19DUjI3MDAJKEJJVCg0KSB8IEJJVCg1KSkKKyNkZWZpbmUgQ0ZHX0NSTUFTSwkoQklUKDQpIHwgQklUKDUpKQorI2RlZmluZSBSMU1TX01BU0sJQklUKDApCisjZGVmaW5lIFIyTVNfTUFTSwlCSVQoMikKKyNkZWZpbmUgUjFERl9NQVNLCUJJVCgxKQorI2RlZmluZSBSMkRGX01BU0sJQklUKDIpCisjZGVmaW5lIFIxRkVfTUFTSwlCSVQoMCkKKyNkZWZpbmUgUjJGRV9NQVNLCUJJVCgyKQorI2RlZmluZSBSMURNCQlCSVQoMCkKKyNkZWZpbmUgUjJETQkJQklUKDEpCisjZGVmaW5lIFRUMV9TSElGVAkwCisjZGVmaW5lIFRUMl9TSElGVAk0CisjZGVmaW5lIFRUX09GRgkJMAorI2RlZmluZSBUVF9PTgkJMQorI2RlZmluZSBUVF9NQVNLCQk3CiAjZGVmaW5lIE5BVFNFTUlfTUFOX0lECTB4MDEKICNkZWZpbmUgTE05NTIzMV9DSElQX0lECTB4QTEKICNkZWZpbmUgTE05NTI0MV9DSElQX0lECTB4QTQKQEAgLTkxLDExICs4NSwxMiBAQAogc3RydWN0IGxtOTUyNDFfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQsIGludGVydmFsOwkvKiBpbiBqaWZmaWVzICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIGluIGppZmZpZXMgKi8KKwl1bnNpZ25lZCBsb25nIGludGVydmFsOwkJLyogaW4gbWlsbGktc2Vjb25kcyAqLwogCWNoYXIgdmFsaWQ7CQkvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCiAJLyogcmVnaXN0ZXJzIHZhbHVlcyAqLwogCXU4IHRlbXBbQVJSQVlfU0laRShsbTk1MjQxX3JlZ19hZGRyZXNzKV07Ci0JdTggY29uZmlnLCBtb2RlbCwgdHJ1dGhlcm07CisJdTggc3RhdHVzLCBjb25maWcsIG1vZGVsLCB0cnV0aGVybTsKIH07CiAKIC8qIENvbnZlcnNpb25zICovCkBAIC0xMTgsNyArMTEzLDggQEAKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAotCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIGRhdGEtPmludGVydmFsKSB8fAorCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZAorCQkgICAgICAgKyBtc2Vjc190b19qaWZmaWVzKGRhdGEtPmludGVydmFsKSkgfHwKIAkgICAgIWRhdGEtPnZhbGlkKSB7CiAJCWludCBpOwogCkBAIC0xMjcsNiArMTIzLDkgQEAKIAkJCWRhdGEtPnRlbXBbaV0KIAkJCSAgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAogCQkJCQkJICAgICBsbTk1MjQxX3JlZ19hZGRyZXNzW2ldKTsKKworCQlkYXRhLT5zdGF0dXMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJCUxNOTUyNDFfUkVHX1JfU1RBVFVTKTsKIAkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKIAkJZGF0YS0+dmFsaWQgPSAxOwogCX0KQEAgLTEzNiwxOTcgKzEzNSwyNDEgQEAKIAlyZXR1cm4gZGF0YTsKIH0KIAotLyogU3lzZnMgc3R1ZmYgKi8KLXN0YXRpYyBzc2l6ZV90IHNob3dfaW5wdXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgY2hhciAqYnVmKQotewotCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBsbTk1MjQxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVkXG4iLAotCQkJaW5kZXggPT0gMCB8fCAoZGF0YS0+Y29uZmlnICYgKDEgPDwgKGluZGV4IC8gMikpKSA/Ci0JCXRlbXBfZnJvbV9yZWdfc2lnbmVkKGRhdGEtPnRlbXBbaW5kZXhdLCBkYXRhLT50ZW1wW2luZGV4ICsgMV0pIDoKLQkJdGVtcF9mcm9tX3JlZ191bnNpZ25lZChkYXRhLT50ZW1wW2luZGV4XSwKLQkJCQkgICAgICAgZGF0YS0+dGVtcFtpbmRleCArIDFdKSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfdHlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgbG05NTI0MV9yZWFkX2NoaXAoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICAgIGxvbmcgKnZhbCkKIHsKIAlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLAotCQlkYXRhLT5tb2RlbCAmIHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXggPyAiMVxuIiA6ICIyXG4iKTsKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsOgorCQkqdmFsID0gZGF0YS0+aW50ZXJ2YWw7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNldF90eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBpbnQgbG05NTI0MV9yZWFkX3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICAgIGxvbmcgKnZhbCkKK3sKKwlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gbG05NTI0MV91cGRhdGVfZGV2aWNlKGRldik7CisKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX3RlbXBfaW5wdXQ6CisJCWlmICghY2hhbm5lbCB8fCAoZGF0YS0+Y29uZmlnICYgQklUKGNoYW5uZWwgLSAxKSkpCisJCQkqdmFsID0gdGVtcF9mcm9tX3JlZ19zaWduZWQoZGF0YS0+dGVtcFtjaGFubmVsICogMl0sCisJCQkJCQlkYXRhLT50ZW1wW2NoYW5uZWwgKiAyICsgMV0pOworCQllbHNlCisJCQkqdmFsID0gdGVtcF9mcm9tX3JlZ191bnNpZ25lZChkYXRhLT50ZW1wW2NoYW5uZWwgKiAyXSwKKwkJCQkJCWRhdGEtPnRlbXBbY2hhbm5lbCAqIDIgKyAxXSk7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9taW46CisJCWlmIChjaGFubmVsID09IDEpCisJCQkqdmFsID0gKGRhdGEtPmNvbmZpZyAmIFIxREZfTUFTSykgPyAtMTI4MDAwIDogMDsKKwkJZWxzZQorCQkJKnZhbCA9IChkYXRhLT5jb25maWcgJiBSMkRGX01BU0spID8gLTEyODAwMCA6IDA7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9tYXg6CisJCWlmIChjaGFubmVsID09IDEpCisJCQkqdmFsID0gKGRhdGEtPmNvbmZpZyAmIFIxREZfTUFTSykgPyAxMjc4NzUgOiAyNTU4NzU7CisJCWVsc2UKKwkJCSp2YWwgPSAoZGF0YS0+Y29uZmlnICYgUjJERl9NQVNLKSA/IDEyNzg3NSA6IDI1NTg3NTsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX3R5cGU6CisJCWlmIChjaGFubmVsID09IDEpCisJCQkqdmFsID0gKGRhdGEtPm1vZGVsICYgUjFNU19NQVNLKSA/IDEgOiAyOworCQllbHNlCisJCQkqdmFsID0gKGRhdGEtPm1vZGVsICYgUjJNU19NQVNLKSA/IDEgOiAyOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfZmF1bHQ6CisJCWlmIChjaGFubmVsID09IDEpCisJCQkqdmFsID0gISEoZGF0YS0+c3RhdHVzICYgUjFETSk7CisJCWVsc2UKKwkJCSp2YWwgPSAhIShkYXRhLT5zdGF0dXMgJiBSMkRNKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworc3RhdGljIGludCBsbTk1MjQxX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nICp2YWwpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9jaGlwOgorCQlyZXR1cm4gbG05NTI0MV9yZWFkX2NoaXAoZGV2LCBhdHRyLCBjaGFubmVsLCB2YWwpOworCWNhc2UgaHdtb25fdGVtcDoKKwkJcmV0dXJuIGxtOTUyNDFfcmVhZF90ZW1wKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgaW50IGxtOTUyNDFfd3JpdGVfY2hpcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgIGxvbmcgdmFsKQoreworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgY29udnJhdGU7CisJdTggY29uZmlnOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsOgorCQljb25maWcgPSBkYXRhLT5jb25maWcgJiB+Q0ZHX0NSTUFTSzsKKwkJaWYgKHZhbCA8IDEzMCkgeworCQkJY29udnJhdGUgPSA3NjsKKwkJCWNvbmZpZyB8PSBDRkdfQ1IwMDc2OworCQl9IGVsc2UgaWYgKHZhbCA8IDU5MCkgeworCQkJY29udnJhdGUgPSAxODI7CisJCQljb25maWcgfD0gQ0ZHX0NSMDE4MjsKKwkJfSBlbHNlIGlmICh2YWwgPCAxODUwKSB7CisJCQljb252cmF0ZSA9IDEwMDA7CisJCQljb25maWcgfD0gQ0ZHX0NSMTAwMDsKKwkJfSBlbHNlIHsKKwkJCWNvbnZyYXRlID0gMjcwMDsKKwkJCWNvbmZpZyB8PSBDRkdfQ1IyNzAwOworCQl9CisJCWRhdGEtPmludGVydmFsID0gY29udnJhdGU7CisJCWRhdGEtPmNvbmZpZyA9IGNvbmZpZzsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJCQlMTTk1MjQxX1JFR19SV19DT05GSUcsIGNvbmZpZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsbTk1MjQxX3dyaXRlX3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICAgICBsb25nIHZhbCkKIHsKIAlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgc2hpZnQ7Ci0JdTggbWFzayA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0KLQlpZiAoa3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc2hpZnQgPSBtYXNrID09IFIxTVNfTUFTSyA/IFRUMV9TSElGVCA6IFRUMl9TSElGVDsKKwlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCi0JZGF0YS0+dHJ1dGhlcm0gJj0gfihUVF9NQVNLIDw8IHNoaWZ0KTsKLQlpZiAodmFsID09IDEpIHsKLQkJZGF0YS0+bW9kZWwgfD0gbWFzazsKLQkJZGF0YS0+dHJ1dGhlcm0gfD0gKFRUX09OIDw8IHNoaWZ0KTsKLQl9IGVsc2UgewotCQlkYXRhLT5tb2RlbCAmPSB+bWFzazsKLQkJZGF0YS0+dHJ1dGhlcm0gfD0gKFRUX09GRiA8PCBzaGlmdCk7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX21pbjoKKwkJaWYgKGNoYW5uZWwgPT0gMSkgeworCQkJaWYgKHZhbCA8IDApCisJCQkJZGF0YS0+Y29uZmlnIHw9IFIxREZfTUFTSzsKKwkJCWVsc2UKKwkJCQlkYXRhLT5jb25maWcgJj0gflIxREZfTUFTSzsKKwkJfSBlbHNlIHsKKwkJCWlmICh2YWwgPCAwKQorCQkJCWRhdGEtPmNvbmZpZyB8PSBSMkRGX01BU0s7CisJCQllbHNlCisJCQkJZGF0YS0+Y29uZmlnICY9IH5SMkRGX01BU0s7CisJCX0KKwkJZGF0YS0+dmFsaWQgPSAwOworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLAorCQkJCQkJZGF0YS0+Y29uZmlnKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX21heDoKKwkJaWYgKGNoYW5uZWwgPT0gMSkgeworCQkJaWYgKHZhbCA8PSAxMjc4NzUpCisJCQkJZGF0YS0+Y29uZmlnIHw9IFIxREZfTUFTSzsKKwkJCWVsc2UKKwkJCQlkYXRhLT5jb25maWcgJj0gflIxREZfTUFTSzsKKwkJfSBlbHNlIHsKKwkJCWlmICh2YWwgPD0gMTI3ODc1KQorCQkJCWRhdGEtPmNvbmZpZyB8PSBSMkRGX01BU0s7CisJCQllbHNlCisJCQkJZGF0YS0+Y29uZmlnICY9IH5SMkRGX01BU0s7CisJCX0KKwkJZGF0YS0+dmFsaWQgPSAwOworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLAorCQkJCQkJZGF0YS0+Y29uZmlnKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX3R5cGU6CisJCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMikgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjaGFubmVsID09IDEpIHsKKwkJCWRhdGEtPnRydXRoZXJtICY9IH4oVFRfTUFTSyA8PCBUVDFfU0hJRlQpOworCQkJaWYgKHZhbCA9PSAxKSB7CisJCQkJZGF0YS0+bW9kZWwgfD0gUjFNU19NQVNLOworCQkJCWRhdGEtPnRydXRoZXJtIHw9IChUVF9PTiA8PCBUVDFfU0hJRlQpOworCQkJfSBlbHNlIHsKKwkJCQlkYXRhLT5tb2RlbCAmPSB+UjFNU19NQVNLOworCQkJCWRhdGEtPnRydXRoZXJtIHw9IChUVF9PRkYgPDwgVFQxX1NISUZUKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRhdGEtPnRydXRoZXJtICY9IH4oVFRfTUFTSyA8PCBUVDJfU0hJRlQpOworCQkJaWYgKHZhbCA9PSAxKSB7CisJCQkJZGF0YS0+bW9kZWwgfD0gUjJNU19NQVNLOworCQkJCWRhdGEtPnRydXRoZXJtIHw9IChUVF9PTiA8PCBUVDJfU0hJRlQpOworCQkJfSBlbHNlIHsKKwkJCQlkYXRhLT5tb2RlbCAmPSB+UjJNU19NQVNLOworCQkJCWRhdGEtPnRydXRoZXJtIHw9IChUVF9PRkYgPDwgVFQyX1NISUZUKTsKKwkJCX0KKwkJfQorCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCUxNOTUyNDFfUkVHX1JXX1JFTU9URV9NT0RFTCwKKwkJCQkJCWRhdGEtPm1vZGVsKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX1RSVVRIRVJNLAorCQkJCQkJZGF0YS0+dHJ1dGhlcm0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CiAJfQotCWRhdGEtPnZhbGlkID0gMDsKLQotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19SRU1PVEVfTU9ERUwsCi0JCQkJICBkYXRhLT5tb2RlbCk7Ci0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX1RSVVRIRVJNLAotCQkJCSAgZGF0YS0+dHJ1dGhlcm0pOwogCiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKLQlyZXR1cm4gY291bnQ7CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCWNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgbG05NTI0MV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nIHZhbCkKIHsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLAotCQkJZGF0YS0+Y29uZmlnICYgdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleCA/Ci0JCQkiLTEyNzAwMFxuIiA6ICIwXG4iKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2NoaXA6CisJCXJldHVybiBsbTk1MjQxX3dyaXRlX2NoaXAoZGV2LCBhdHRyLCBjaGFubmVsLCB2YWwpOworCWNhc2UgaHdtb25fdGVtcDoKKwkJcmV0dXJuIGxtOTUyNDFfd3JpdGVfdGVtcChkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3Qgc2V0X21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgdW1vZGVfdCBsbTk1MjQxX2lzX3Zpc2libGUoY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkJICB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCiB7Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWxvbmcgdmFsOwotCi0JaWYgKGtzdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodmFsIDwgLTEyODAwMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlpZiAodmFsIDwgMCkKLQkJZGF0YS0+Y29uZmlnIHw9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0JZWxzZQotCQlkYXRhLT5jb25maWcgJj0gfnRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0JZGF0YS0+dmFsaWQgPSAwOwotCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIExNOTUyNDFfUkVHX1JXX0NPTkZJRywKLQkJCQkgIGRhdGEtPmNvbmZpZyk7Ci0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCXJldHVybiBjb3VudDsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2NoaXA6CisJCXN3aXRjaCAoYXR0cikgeworCQljYXNlIGh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsOgorCQkJcmV0dXJuIFNfSVJVR08gfCBTX0lXVVNSOworCQl9CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcDoKKwkJc3dpdGNoIChhdHRyKSB7CisJCWNhc2UgaHdtb25fdGVtcF9pbnB1dDoKKwkJCXJldHVybiBTX0lSVUdPOworCQljYXNlIGh3bW9uX3RlbXBfZmF1bHQ6CisJCQlyZXR1cm4gU19JUlVHTzsKKwkJY2FzZSBod21vbl90ZW1wX21pbjoKKwkJY2FzZSBod21vbl90ZW1wX21heDoKKwkJY2FzZSBod21vbl90ZW1wX3R5cGU6CisJCQlyZXR1cm4gU19JUlVHTyB8IFNfSVdVU1I7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsCi0JCQlkYXRhLT5jb25maWcgJiB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4ID8KLQkJCSIxMjcwMDBcbiIgOiAiMjU1MDAwXG4iKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2V0X21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWxvbmcgdmFsOwotCi0JaWYgKGtzdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodmFsID49IDI1NjAwMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlpZiAodmFsIDw9IDEyNzAwMCkKLQkJZGF0YS0+Y29uZmlnIHw9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0JZWxzZQotCQlkYXRhLT5jb25maWcgJj0gfnRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0JZGF0YS0+dmFsaWQgPSAwOwotCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIExNOTUyNDFfUkVHX1JXX0NPTkZJRywKLQkJCQkgIGRhdGEtPmNvbmZpZyk7Ci0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGxtOTUyNDFfdXBkYXRlX2RldmljZShkZXYpOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVsdVxuIiwgMTAwMCAqIGRhdGEtPmludGVydmFsCi0JCQkvIEhaKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2V0X2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCi0JaWYgKGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkYXRhLT5pbnRlcnZhbCA9IHZhbCAqIEhaIC8gMTAwMDsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd19pbnB1dCwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X2lucHV0LCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5wdXQsIE5VTEwsIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl90eXBlLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190eXBlLCBzZXRfdHlwZSwKLQkJCSAgUjFNU19NQVNLKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfdHlwZSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdHlwZSwgc2V0X3R5cGUsCi0JCQkgIFIyTVNfTUFTSyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbWluLCBzZXRfbWluLAotCQkJICBSMURGX01BU0spOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X21pbiwgc2V0X21pbiwKLQkJCSAgUjJERl9NQVNLKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19tYXgsIHNldF9tYXgsCi0JCQkgIFIxREZfTUFTSyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbWF4LCBzZXRfbWF4LAotCQkJICBSMkRGX01BU0spOwotc3RhdGljIERFVklDRV9BVFRSKHVwZGF0ZV9pbnRlcnZhbCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW50ZXJ2YWwsCi0JCSAgIHNldF9pbnRlcnZhbCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsbTk1MjQxX2F0dHJzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl90eXBlLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM190eXBlLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9taW4uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21pbi5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWF4LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXguZGV2X2F0dHIuYXR0ciwKLQkmZGV2X2F0dHJfdXBkYXRlX2ludGVydmFsLmF0dHIsCi0JTlVMTAotfTsKLUFUVFJJQlVURV9HUk9VUFMobG05NTI0MSk7Ci0KIC8qIFJldHVybiAwIGlmIGRldGVjdGlvbiBpcyBzdWNjZXNzZnVsLCAtRU5PREVWIG90aGVyd2lzZSAqLwogc3RhdGljIGludCBsbTk1MjQxX2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCwKIAkJCSAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQpAQCAtMzYyLDggKzQwNSw4IEBACiBzdGF0aWMgdm9pZCBsbTk1MjQxX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSkKIHsKLQlkYXRhLT5pbnRlcnZhbCA9IEhaOwkvKiAxIHNlYyBkZWZhdWx0ICovCi0JZGF0YS0+Y29uZmlnID0gQ0ZHX0NSMDA3NjsKKwlkYXRhLT5pbnRlcnZhbCA9IDEwMDA7CisJZGF0YS0+Y29uZmlnID0gQ0ZHX0NSMTAwMDsKIAlkYXRhLT50cnV0aGVybSA9IChUVF9PRkYgPDwgVFQxX1NISUZUKSB8IChUVF9PRkYgPDwgVFQyX1NISUZUKTsKIAogCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19DT05GSUcsIGRhdGEtPmNvbmZpZyk7CkBAIC0zNzUsNiArNDE4LDQ3IEBACiAJCQkJICBkYXRhLT5tb2RlbCk7CiB9CiAKK3N0YXRpYyBjb25zdCB1MzIgbG05NTI0MV9jaGlwX2NvbmZpZ1tdID0geworCUhXTU9OX0NfVVBEQVRFX0lOVEVSVkFMLAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGxtOTUyNDFfY2hpcCA9IHsKKwkudHlwZSA9IGh3bW9uX2NoaXAsCisJLmNvbmZpZyA9IGxtOTUyNDFfY2hpcF9jb25maWcsCit9OworCitzdGF0aWMgY29uc3QgdTMyIGxtOTUyNDFfdGVtcF9jb25maWdbXSA9IHsKKwlIV01PTl9UX0lOUFVULAorCUhXTU9OX1RfSU5QVVQgfCBIV01PTl9UX01BWCB8IEhXTU9OX1RfTUlOIHwgSFdNT05fVF9UWVBFIHwKKwkJSFdNT05fVF9GQVVMVCwKKwlIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9NQVggfCBIV01PTl9UX01JTiB8IEhXTU9OX1RfVFlQRSB8CisJCUhXTU9OX1RfRkFVTFQsCisJMAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbG05NTI0MV90ZW1wID0geworCS50eXBlID0gaHdtb25fdGVtcCwKKwkuY29uZmlnID0gbG05NTI0MV90ZW1wX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICpsbTk1MjQxX2luZm9bXSA9IHsKKwkmbG05NTI0MV9jaGlwLAorCSZsbTk1MjQxX3RlbXAsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9vcHMgbG05NTI0MV9od21vbl9vcHMgPSB7CisJLmlzX3Zpc2libGUgPSBsbTk1MjQxX2lzX3Zpc2libGUsCisJLnJlYWQgPSBsbTk1MjQxX3JlYWQsCisJLndyaXRlID0gbG05NTI0MV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvIGxtOTUyNDFfY2hpcF9pbmZvID0geworCS5vcHMgPSAmbG05NTI0MV9od21vbl9vcHMsCisJLmluZm8gPSBsbTk1MjQxX2luZm8sCit9OworCiBzdGF0aWMgaW50IGxtOTUyNDFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CkBAIC0zOTIsOSArNDc2LDEwIEBACiAJLyogSW5pdGlhbGl6ZSB0aGUgTE05NTI0MSBjaGlwICovCiAJbG05NTI0MV9pbml0X2NsaWVudChjbGllbnQsIGRhdGEpOwogCi0JaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsCisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKGRldiwgY2xpZW50LT5uYW1lLAogCQkJCQkJCSAgIGRhdGEsCi0JCQkJCQkJICAgbG05NTI0MV9ncm91cHMpOworCQkJCQkJCSAgICZsbTk1MjQxX2NoaXBfaW5mbywKKwkJCQkJCQkgICBOVUxMKTsKIAlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7CiB9CiAKQEAgLTQyMCw1ICs1MDUsNSBAQAogbW9kdWxlX2kyY19kcml2ZXIobG05NTI0MV9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJEYXZpZGUgUml6em8gPGVscGEucml6em9AZ21haWwuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJMTTk1MjQxIHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTE05NTIzMS9MTTk1MjQxIHNlbnNvciBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG05NTI0NS5jIGIvZHJpdmVycy9od21vbi9sbTk1MjQ1LmMKaW5kZXggZTdhZWY0NS4uYTNiZmQ4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTk1MjQ1LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTk1MjQ1LmMKQEAgLTE1LDIyICsxNSwxNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaHdtb24uaD4KLSNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7CiAJMHgxOCwgMHgxOSwgMHgyOSwgMHg0YywgMHg0ZCwgSTJDX0NMSUVOVF9FTkQgfTsKQEAgLTg5LDYgKzgzLDcgQEAKICNkZWZpbmUgUkFURV9DUjEwMDAJMHgwMgogI2RlZmluZSBSQVRFX0NSMjUwMAkweDAzCiAKKyNkZWZpbmUgU1RBVFVTMV9ST1MJCTB4MTAKICNkZWZpbmUgU1RBVFVTMV9ESU9ERV9GQVVMVAkweDA0CiAjZGVmaW5lIFNUQVRVUzFfUlRDUklUCQkweDAyCiAjZGVmaW5lIFNUQVRVUzFfTE9DCQkweDAxCkBAIC0xMTIsMTQgKzEwNyw5IEBACiAKIC8qIENsaWVudCBkYXRhIChlYWNoIGNsaWVudCBnZXRzIGl0cyBvd24pICovCiBzdHJ1Y3QgbG05NTI0NV9kYXRhIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIGluIGppZmZpZXMgKi8KLQl1bnNpZ25lZCBsb25nIGludGVydmFsOwkvKiBpbiBtc2VjcyAqLwotCWJvb2wgdmFsaWQ7CQkvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCi0JLyogcmVnaXN0ZXJzIHZhbHVlcyAqLwotCXU4IHJlZ3NbQVJSQVlfU0laRShsbTk1MjQ1X3JlZ19hZGRyZXNzKV07Ci0JdTggY29uZmlnMSwgY29uZmlnMjsKKwlpbnQgaW50ZXJ2YWw7CS8qIGluIG1zZWNzICovCiB9OwogCiAvKiBDb252ZXJzaW9ucyAqLwpAQCAtMTM1LDYwICsxMjUsMzYgQEAKIAlyZXR1cm4gdGVtcF9mcm9tX3JlZ191bnNpZ25lZCh2YWxfaCwgdmFsX2wpOwogfQogCi1zdGF0aWMgc3RydWN0IGxtOTUyNDVfZGF0YSAqbG05NTI0NV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgbG05NTI0NV9yZWFkX2NvbnZlcnNpb25fcmF0ZShzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCXVuc2lnbmVkIGludCByYXRlOworCWludCByZXQ7CiAKLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQKLQkJKyBtc2Vjc190b19qaWZmaWVzKGRhdGEtPmludGVydmFsKSkgfHwgIWRhdGEtPnZhbGlkKSB7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxtOTUyNDVfcmVnX2FkZHJlc3MpOyBpKyspCi0JCQlkYXRhLT5yZWdzW2ldCi0JCQkgID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCSAgICAgbG05NTI0NV9yZWdfYWRkcmVzc1tpXSk7Ci0JCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7Ci0JCWRhdGEtPnZhbGlkID0gMTsKLQl9Ci0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCXJldHVybiBkYXRhOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsbTk1MjQ1X3JlYWRfY29udmVyc2lvbl9yYXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JaW50IHJhdGU7Ci0JdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsKLQotCXJhdGUgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQ1X1JFR19SV19DT05WRVJTX1JBVEUpOworCXJldCA9IHJlZ21hcF9yZWFkKGRhdGEtPnJlZ21hcCwgTE05NTI0NV9SRUdfUldfQ09OVkVSU19SQVRFLCAmcmF0ZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAlzd2l0Y2ggKHJhdGUpIHsKIAljYXNlIFJBVEVfQ1IwMDYzOgotCQlpbnRlcnZhbCA9IDYzOworCQlkYXRhLT5pbnRlcnZhbCA9IDYzOwogCQlicmVhazsKIAljYXNlIFJBVEVfQ1IwMzY0OgotCQlpbnRlcnZhbCA9IDM2NDsKKwkJZGF0YS0+aW50ZXJ2YWwgPSAzNjQ7CiAJCWJyZWFrOwogCWNhc2UgUkFURV9DUjEwMDA6Ci0JCWludGVydmFsID0gMTAwMDsKKwkJZGF0YS0+aW50ZXJ2YWwgPSAxMDAwOwogCQlicmVhazsKIAljYXNlIFJBVEVfQ1IyNTAwOgogCWRlZmF1bHQ6Ci0JCWludGVydmFsID0gMjUwMDsKKwkJZGF0YS0+aW50ZXJ2YWwgPSAyNTAwOwogCQlicmVhazsKIAl9Ci0KLQlyZXR1cm4gaW50ZXJ2YWw7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxtOTUyNDVfc2V0X2NvbnZlcnNpb25fcmF0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJdW5zaWduZWQgbG9uZyBpbnRlcnZhbCkKK3N0YXRpYyBpbnQgbG05NTI0NV9zZXRfY29udmVyc2lvbl9yYXRlKHN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEsIGxvbmcgaW50ZXJ2YWwpCiB7Ci0JaW50IHJhdGU7CisJaW50IHJldCwgcmF0ZTsKIAogCWlmIChpbnRlcnZhbCA8PSA2MykgewogCQlpbnRlcnZhbCA9IDYzOwpAQCAtMjA0LDIyMCArMTcwLDI4OCBAQAogCQlyYXRlID0gUkFURV9DUjI1MDA7CiAJfQogCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDVfUkVHX1JXX0NPTlZFUlNfUkFURSwgcmF0ZSk7CisJcmV0ID0gcmVnbWFwX3dyaXRlKGRhdGEtPnJlZ21hcCwgTE05NTI0NV9SRUdfUldfQ09OVkVSU19SQVRFLCByYXRlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAotCXJldHVybiBpbnRlcnZhbDsKKwlkYXRhLT5pbnRlcnZhbCA9IGludGVydmFsOworCXJldHVybiAwOwogfQogCi0vKiBTeXNmcyBzdHVmZiAqLwotc3RhdGljIHNzaXplX3Qgc2hvd19pbnB1dChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGxtOTUyNDVfdXBkYXRlX2RldmljZShkZXYpOwotCWludCB0ZW1wOwotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0KLQkvKgotCSAqIEluZGV4IDAgKExvY2FsIHRlbXApIGlzIGFsd2F5cyBzaWduZWQKLQkgKiBJbmRleCAyIChSZW1vdGUgdGVtcCkgaGFzIGJvdGggc2lnbmVkIGFuZCB1bnNpZ25lZCBkYXRhCi0JICogdXNlIHNpZ25lZCBjYWxjdWxhdGlvbiBmb3IgcmVtb3RlIGlmIHNpZ25lZCBiaXQgaXMgc2V0Ci0JICovCi0JaWYgKGluZGV4ID09IDAgfHwgZGF0YS0+cmVnc1tpbmRleF0gJiAweDgwKQotCQl0ZW1wID0gdGVtcF9mcm9tX3JlZ19zaWduZWQoZGF0YS0+cmVnc1tpbmRleF0sCi0JCQkgICAgZGF0YS0+cmVnc1tpbmRleCArIDFdKTsKLQllbHNlCi0JCXRlbXAgPSB0ZW1wX2Zyb21fcmVnX3Vuc2lnbmVkKGRhdGEtPnJlZ3NbaW5kZXggKyAyXSwKLQkJCSAgICBkYXRhLT5yZWdzW2luZGV4ICsgM10pOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVkXG4iLCB0ZW1wKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19saW1pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gbG05NTI0NV91cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlZFxuIiwKLQkJCWRhdGEtPnJlZ3NbaW5kZXhdICogMTAwMCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNldF9saW1pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgaW50IGxtOTUyNDVfcmVhZF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLAorCQkJICAgICBsb25nICp2YWwpCiB7CiAJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQl1bnNpZ25lZCBsb25nIHZhbDsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBkYXRhLT5yZWdtYXA7CisJaW50IHJldCwgcmVnbCwgcmVnaCwgcmVndmFsbCwgcmVndmFsaDsKIAotCWlmIChrc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdmFsIC89IDEwMDA7Ci0KLQl2YWwgPSBjbGFtcF92YWwodmFsLCAwLCAoaW5kZXggPT0gNiA/IDEyNyA6IDI1NSkpOwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JZGF0YS0+dmFsaWQgPSAwOwotCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIGxtOTUyNDVfcmVnX2FkZHJlc3NbaW5kZXhdLCB2YWwpOwotCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlyZXR1cm4gY291bnQ7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCQlyZWdsID0gY2hhbm5lbCA/IExNOTUyNDVfUkVHX1JfUkVNT1RFX1RFTVBMX1MgOgorCQkJCSBMTTk1MjQ1X1JFR19SX0xPQ0FMX1RFTVBMX1M7CisJCXJlZ2ggPSBjaGFubmVsID8gTE05NTI0NV9SRUdfUl9SRU1PVEVfVEVNUEhfUyA6CisJCQkJIExNOTUyNDVfUkVHX1JfTE9DQUxfVEVNUEhfUzsKKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCByZWdsLCAmcmVndmFsbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCByZWdoLCAmcmVndmFsaCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJLyoKKwkJICogTG9jYWwgdGVtcCBpcyBhbHdheXMgc2lnbmVkLgorCQkgKiBSZW1vdGUgdGVtcCBoYXMgYm90aCBzaWduZWQgYW5kIHVuc2lnbmVkIGRhdGEuCisJCSAqIFVzZSBzaWduZWQgY2FsY3VsYXRpb24gZm9yIHJlbW90ZSBpZiBzaWduZWQgYml0IGlzIHNldAorCQkgKiBvciBpZiByZXBvcnRlZCB0ZW1wZXJhdHVyZSBpcyBiZWxvdyBzaWduZWQgbGltaXQuCisJCSAqLworCQlpZiAoIWNoYW5uZWwgfHwgKHJlZ3ZhbGggJiAweDgwKSB8fCByZWd2YWxoIDwgMHg3ZikgeworCQkJKnZhbCA9IHRlbXBfZnJvbV9yZWdfc2lnbmVkKHJlZ3ZhbGgsIHJlZ3ZhbGwpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBMTTk1MjQ1X1JFR19SX1JFTU9URV9URU1QTF9VLAorCQkJCSAgJnJlZ3ZhbGwpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTE05NTI0NV9SRUdfUl9SRU1PVEVfVEVNUEhfVSwKKwkJCQkgICZyZWd2YWxoKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFsID0gdGVtcF9mcm9tX3JlZ191bnNpZ25lZChyZWd2YWxoLCByZWd2YWxsKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX21heDoKKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBMTTk1MjQ1X1JFR19SV19SRU1PVEVfT1NfTElNSVQsCisJCQkJICAmcmVndmFsaCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9IHJlZ3ZhbGggKiAxMDAwOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdDoKKwkJcmVnaCA9IGNoYW5uZWwgPyBMTTk1MjQ1X1JFR19SV19SRU1PVEVfVENSSVRfTElNSVQgOgorCQkJCSBMTTk1MjQ1X1JFR19SV19MT0NBTF9PU19UQ1JJVF9MSU1JVDsKKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCByZWdoLCAmcmVndmFsaCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9IHJlZ3ZhbGggKiAxMDAwOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfbWF4X2h5c3Q6CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTE05NTI0NV9SRUdfUldfUkVNT1RFX09TX0xJTUlULAorCQkJCSAgJnJlZ3ZhbGgpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTE05NTI0NV9SRUdfUldfQ09NTU9OX0hZU1RFUkVTSVMsCisJCQkJICAmcmVndmFsbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9IChyZWd2YWxoIC0gcmVndmFsbCkgKiAxMDAwOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9oeXN0OgorCQlyZWdoID0gY2hhbm5lbCA/IExNOTUyNDVfUkVHX1JXX1JFTU9URV9UQ1JJVF9MSU1JVCA6CisJCQkJIExNOTUyNDVfUkVHX1JXX0xPQ0FMX09TX1RDUklUX0xJTUlUOworCQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIHJlZ2gsICZyZWd2YWxoKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIExNOTUyNDVfUkVHX1JXX0NPTU1PTl9IWVNURVJFU0lTLAorCQkJCSAgJnJlZ3ZhbGwpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCSp2YWwgPSAocmVndmFsaCAtIHJlZ3ZhbGwpICogMTAwMDsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX3R5cGU6CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTE05NTI0NV9SRUdfUldfQ09ORklHMiwgJnJlZ3ZhbGgpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCSp2YWwgPSAocmVndmFsaCAmIENGRzJfUkVNT1RFX1RUKSA/IDEgOiAyOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfb2Zmc2V0OgorCQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIExNOTUyNDVfUkVHX1JXX1JFTU9URV9PRkZMLAorCQkJCSAgJnJlZ3ZhbGwpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTE05NTI0NV9SRUdfUldfUkVNT1RFX09GRkgsCisJCQkJICAmcmVndmFsaCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9IHRlbXBfZnJvbV9yZWdfc2lnbmVkKHJlZ3ZhbGgsIHJlZ3ZhbGwpOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfbWF4X2FsYXJtOgorCQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIExNOTUyNDVfUkVHX1JfU1RBVFVTMSwgJnJlZ3ZhbGgpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCSp2YWwgPSAhIShyZWd2YWxoICYgU1RBVFVTMV9ST1MpOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9hbGFybToKKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBMTTk1MjQ1X1JFR19SX1NUQVRVUzEsICZyZWd2YWxoKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFsID0gISEocmVndmFsaCAmIChjaGFubmVsID8gU1RBVFVTMV9SVENSSVQgOiBTVEFUVVMxX0xPQykpOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfZmF1bHQ6CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTE05NTI0NV9SRUdfUl9TVEFUVVMxLCAmcmVndmFsaCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9ICEhKHJlZ3ZhbGggJiBTVEFUVVMxX0RJT0RFX0ZBVUxUKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19jcml0X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gbG05NTI0NV91cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKLQlpbnQgaHlzdCA9IGRhdGEtPnJlZ3NbaW5kZXhdIC0gZGF0YS0+cmVnc1s4XTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlZFxuIiwgaHlzdCAqIDEwMDApOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfY3JpdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBpbnQgbG05NTI0NV93cml0ZV90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLAorCQkJICAgICAgbG9uZyB2YWwpCiB7CiAJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgaHlzdCwgbGltaXQ7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGF0YS0+cmVnbWFwOworCXVuc2lnbmVkIGludCByZWd2YWw7CisJaW50IHJldCwgcmVnOwogCi0JaWYgKGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlsaW1pdCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIGxtOTUyNDVfcmVnX2FkZHJlc3NbaW5kZXhdKTsKLQloeXN0ID0gbGltaXQgLSB2YWwgLyAxMDAwOwotCWh5c3QgPSBjbGFtcF92YWwoaHlzdCwgMCwgMzEpOwotCWRhdGEtPnJlZ3NbOF0gPSBoeXN0OwotCi0JLyogc2hhcmVkIGNyaXQgaHlzdGVyZXNpcyAqLwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQ1X1JFR19SV19DT01NT05fSFlTVEVSRVNJUywKLQkJaHlzdCk7Ci0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCXJldHVybiBjb3VudDsKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQl2YWwgPSBjbGFtcF92YWwodmFsIC8gMTAwMCwgMCwgMjU1KTsKKwkJcmV0ID0gcmVnbWFwX3dyaXRlKHJlZ21hcCwgTE05NTI0NV9SRUdfUldfUkVNT1RFX09TX0xJTUlULCB2YWwpOworCQlyZXR1cm4gcmV0OworCWNhc2UgaHdtb25fdGVtcF9jcml0OgorCQlyZWcgPSBjaGFubmVsID8gTE05NTI0NV9SRUdfUldfUkVNT1RFX1RDUklUX0xJTUlUIDoKKwkJCQlMTTk1MjQ1X1JFR19SV19MT0NBTF9PU19UQ1JJVF9MSU1JVDsKKwkJdmFsID0gY2xhbXBfdmFsKHZhbCAvIDEwMDAsIDAsIGNoYW5uZWwgPyAyNTUgOiAxMjcpOworCQlyZXQgPSByZWdtYXBfd3JpdGUocmVnbWFwLCByZWcsIHZhbCk7CisJCXJldHVybiByZXQ7CisJY2FzZSBod21vbl90ZW1wX2NyaXRfaHlzdDoKKwkJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIExNOTUyNDVfUkVHX1JXX0xPQ0FMX09TX1RDUklUX0xJTUlULAorCQkJCSAgJnJlZ3ZhbCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJLyogQ2xhbXAgdG8gcmVhc29uYWJsZSByYW5nZSB0byBwcmV2ZW50IG92ZXJmbG93ICovCisJCXZhbCA9IGNsYW1wX3ZhbCh2YWwsIC0xMDAwMDAwLCAxMDAwMDAwKTsKKwkJdmFsID0gcmVndmFsIC0gdmFsIC8gMTAwMDsKKwkJdmFsID0gY2xhbXBfdmFsKHZhbCwgMCwgMzEpOworCQlyZXQgPSByZWdtYXBfd3JpdGUocmVnbWFwLCBMTTk1MjQ1X1JFR19SV19DT01NT05fSFlTVEVSRVNJUywKKwkJCQkgICB2YWwpOworCQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwljYXNlIGh3bW9uX3RlbXBfb2Zmc2V0OgorCQl2YWwgPSBjbGFtcF92YWwodmFsLCAtMTI4MDAwLCAxMjc4NzUpOworCQl2YWwgPSB2YWwgKiAyNTYgLyAxMDAwOworCQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCXJldCA9IHJlZ21hcF93cml0ZShyZWdtYXAsIExNOTUyNDVfUkVHX1JXX1JFTU9URV9PRkZMLAorCQkJCSAgIHZhbCAmIDB4ZTApOworCQlpZiAocmV0IDwgMCkgeworCQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldCA9IHJlZ21hcF93cml0ZShyZWdtYXAsIExNOTUyNDVfUkVHX1JXX1JFTU9URV9PRkZILAorCQkJCSAgICh2YWwgPj4gOCkgJiAweGZmKTsKKwkJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCXJldHVybiByZXQ7CisJY2FzZSBod21vbl90ZW1wX3R5cGU6CisJCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMikKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBMTTk1MjQ1X1JFR19SV19DT05GSUcyLAorCQkJCQkgQ0ZHMl9SRU1PVEVfVFQsCisJCQkJCSB2YWwgPT0gMSA/IENGRzJfUkVNT1RFX1RUIDogMCk7CisJCXJldHVybiByZXQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd190eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgY2hhciAqYnVmKQorc3RhdGljIGludCBsbTk1MjQ1X3JlYWRfY2hpcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgbG9uZyAqdmFsKQogewogCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsCi0JCWRhdGEtPmNvbmZpZzIgJiBDRkcyX1JFTU9URV9UVCA/ICIxXG4iIDogIjJcbiIpOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fY2hpcF91cGRhdGVfaW50ZXJ2YWw6CisJCSp2YWwgPSBkYXRhLT5pbnRlcnZhbDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3Qgc2V0X3R5cGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIGludCBsbTk1MjQ1X3dyaXRlX2NoaXAoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICAgICBsb25nIHZhbCkKIHsKIAlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgcmV0OwogCi0JaWYgKGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCWlmICh2YWwgPT0gMSkKLQkJZGF0YS0+Y29uZmlnMiB8PSBDRkcyX1JFTU9URV9UVDsKLQllbHNlCi0JCWRhdGEtPmNvbmZpZzIgJj0gfkNGRzJfUkVNT1RFX1RUOwotCi0JZGF0YS0+dmFsaWQgPSAwOwotCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDVfUkVHX1JXX0NPTkZJRzIsCi0JCQkJICBkYXRhLT5jb25maWcyKTsKLQotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JcmV0dXJuIGNvdW50OworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fY2hpcF91cGRhdGVfaW50ZXJ2YWw6CisJCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJcmV0ID0gbG05NTI0NV9zZXRfY29udmVyc2lvbl9yYXRlKGRhdGEsIHZhbCk7CisJCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCQlyZXR1cm4gcmV0OworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSBjaGFyICpidWYpCitzdGF0aWMgaW50IGxtOTUyNDVfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQl1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnZhbCkKIHsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gbG05NTI0NV91cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlZFxuIiwKLQkJCSEhKGRhdGEtPnJlZ3NbOV0gJiBpbmRleCkpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgaHdtb25fY2hpcDoKKwkJcmV0dXJuIGxtOTUyNDVfcmVhZF9jaGlwKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwljYXNlIGh3bW9uX3RlbXA6CisJCXJldHVybiBsbTk1MjQ1X3JlYWRfdGVtcChkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICBjaGFyICpidWYpCitzdGF0aWMgaW50IGxtOTUyNDVfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyB2YWwpCiB7Ci0Jc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGxtOTUyNDVfdXBkYXRlX2RldmljZShkZXYpOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVsdVxuIiwgZGF0YS0+aW50ZXJ2YWwpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgaHdtb25fY2hpcDoKKwkJcmV0dXJuIGxtOTUyNDVfd3JpdGVfY2hpcChkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJY2FzZSBod21vbl90ZW1wOgorCQlyZXR1cm4gbG05NTI0NV93cml0ZV90ZW1wKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogfQogCi1zdGF0aWMgc3NpemVfdCBzZXRfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyB1bW9kZV90IGxtOTUyNDVfdGVtcF9pc192aXNpYmxlKGNvbnN0IHZvaWQgKmRhdGEsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKIHsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQotCWlmIChrc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JZGF0YS0+aW50ZXJ2YWwgPSBsbTk1MjQ1X3NldF9jb252ZXJzaW9uX3JhdGUoY2xpZW50LCB2YWwpOwotCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlyZXR1cm4gY291bnQ7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCWNhc2UgaHdtb25fdGVtcF9tYXhfYWxhcm06CisJY2FzZSBod21vbl90ZW1wX21heF9oeXN0OgorCWNhc2UgaHdtb25fdGVtcF9jcml0X2FsYXJtOgorCWNhc2UgaHdtb25fdGVtcF9mYXVsdDoKKwkJcmV0dXJuIFNfSVJVR087CisJY2FzZSBod21vbl90ZW1wX3R5cGU6CisJY2FzZSBod21vbl90ZW1wX21heDoKKwljYXNlIGh3bW9uX3RlbXBfY3JpdDoKKwljYXNlIGh3bW9uX3RlbXBfb2Zmc2V0OgorCQlyZXR1cm4gU19JUlVHTyB8IFNfSVdVU1I7CisJY2FzZSBod21vbl90ZW1wX2NyaXRfaHlzdDoKKwkJcmV0dXJuIChjaGFubmVsID09IDApID8gU19JUlVHTyB8IFNfSVdVU1IgOiBTX0lSVUdPOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KIH0KIAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd19pbnB1dCwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2xpbWl0LAotCQlzZXRfbGltaXQsIDYpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9jcml0X2h5c3QsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2NyaXRfaHlzdCwKLQkJc2V0X2NyaXRfaHlzdCwgNik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXRfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCi0JCVNUQVRVUzFfTE9DKTsKLQotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9pbnB1dCwgU19JUlVHTywgc2hvd19pbnB1dCwgTlVMTCwgMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2xpbWl0LAotCQlzZXRfbGltaXQsIDcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9jcml0X2h5c3QsIFNfSVJVR08sIHNob3dfY3JpdF9oeXN0LCBOVUxMLCA3KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfY3JpdF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKLQkJU1RBVFVTMV9SVENSSVQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl90eXBlLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190eXBlLAotCQlzZXRfdHlwZSwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2ZhdWx0LCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLAotCQlTVEFUVVMxX0RJT0RFX0ZBVUxUKTsKLQotc3RhdGljIERFVklDRV9BVFRSKHVwZGF0ZV9pbnRlcnZhbCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW50ZXJ2YWwsCi0JCXNldF9pbnRlcnZhbCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsbTk1MjQ1X2F0dHJzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdF9oeXN0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9jcml0X2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdF9oeXN0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9jcml0X2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl90eXBlLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZkZXZfYXR0cl91cGRhdGVfaW50ZXJ2YWwuYXR0ciwKLQlOVUxMCi19OwotQVRUUklCVVRFX0dST1VQUyhsbTk1MjQ1KTsKK3N0YXRpYyB1bW9kZV90IGxtOTUyNDVfaXNfdmlzaWJsZShjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCQkgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2NoaXA6CisJCXN3aXRjaCAoYXR0cikgeworCQljYXNlIGh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsOgorCQkJcmV0dXJuIFNfSVJVR08gfCBTX0lXVVNSOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIGh3bW9uX3RlbXA6CisJCXJldHVybiBsbTk1MjQ1X3RlbXBfaXNfdmlzaWJsZShkYXRhLCBhdHRyLCBjaGFubmVsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CiAKIC8qIFJldHVybiAwIGlmIGRldGVjdGlvbiBpcyBzdWNjZXNzZnVsLCAtRU5PREVWIG90aGVyd2lzZSAqLwogc3RhdGljIGludCBsbTk1MjQ1X2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCwKQEAgLTQ1Myw0NCArNDg3LDEzMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBsbTk1MjQ1X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSkKK3N0YXRpYyBpbnQgbG05NTI0NV9pbml0X2NsaWVudChzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhKQogewotCWRhdGEtPmludGVydmFsID0gbG05NTI0NV9yZWFkX2NvbnZlcnNpb25fcmF0ZShjbGllbnQpOworCWludCByZXQ7CiAKLQlkYXRhLT5jb25maWcxID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJTE05NTI0NV9SRUdfUldfQ09ORklHMSk7Ci0JZGF0YS0+Y29uZmlnMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCUxNOTUyNDVfUkVHX1JXX0NPTkZJRzIpOworCXJldCA9IGxtOTUyNDVfcmVhZF9jb252ZXJzaW9uX3JhdGUoZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKLQlpZiAoZGF0YS0+Y29uZmlnMSAmIENGR19TVE9QKSB7Ci0JCS8qIENsZWFyIHRoZSBzdGFuZGJ5IGJpdCAqLwotCQlkYXRhLT5jb25maWcxICY9IH5DRkdfU1RPUDsKLQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDVfUkVHX1JXX0NPTkZJRzEsCi0JCQlkYXRhLT5jb25maWcxKTsKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGRhdGEtPnJlZ21hcCwgTE05NTI0NV9SRUdfUldfQ09ORklHMSwKKwkJCQkgIENGR19TVE9QLCAwKTsKK30KKworc3RhdGljIGJvb2wgbG05NTI0NV9pc193cml0ZWFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTE05NTI0NV9SRUdfUldfQ09ORklHMToKKwljYXNlIExNOTUyNDVfUkVHX1JXX0NPTlZFUlNfUkFURToKKwljYXNlIExNOTUyNDVfUkVHX1dfT05FX1NIT1Q6CisJY2FzZSBMTTk1MjQ1X1JFR19SV19DT05GSUcyOgorCWNhc2UgTE05NTI0NV9SRUdfUldfUkVNT1RFX09GRkg6CisJY2FzZSBMTTk1MjQ1X1JFR19SV19SRU1PVEVfT0ZGTDoKKwljYXNlIExNOTUyNDVfUkVHX1JXX1JFTU9URV9PU19MSU1JVDoKKwljYXNlIExNOTUyNDVfUkVHX1JXX0xPQ0FMX09TX1RDUklUX0xJTUlUOgorCWNhc2UgTE05NTI0NV9SRUdfUldfUkVNT1RFX1RDUklUX0xJTUlUOgorCWNhc2UgTE05NTI0NV9SRUdfUldfQ09NTU9OX0hZU1RFUkVTSVM6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKIAl9CiB9CiAKK3N0YXRpYyBib29sIGxtOTUyNDVfaXNfdm9sYXRpbGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTE05NTI0NV9SRUdfUl9TVEFUVVMxOgorCWNhc2UgTE05NTI0NV9SRUdfUl9TVEFUVVMyOgorCWNhc2UgTE05NTI0NV9SRUdfUl9MT0NBTF9URU1QSF9TOgorCWNhc2UgTE05NTI0NV9SRUdfUl9MT0NBTF9URU1QTF9TOgorCWNhc2UgTE05NTI0NV9SRUdfUl9SRU1PVEVfVEVNUEhfUzoKKwljYXNlIExNOTUyNDVfUkVHX1JfUkVNT1RFX1RFTVBMX1M6CisJY2FzZSBMTTk1MjQ1X1JFR19SX1JFTU9URV9URU1QSF9VOgorCWNhc2UgTE05NTI0NV9SRUdfUl9SRU1PVEVfVEVNUExfVToKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGxtOTUyNDVfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisJLndyaXRlYWJsZV9yZWcgPSBsbTk1MjQ1X2lzX3dyaXRlYWJsZV9yZWcsCisJLnZvbGF0aWxlX3JlZyA9IGxtOTUyNDVfaXNfdm9sYXRpbGVfcmVnLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS51c2Vfc2luZ2xlX3J3ID0gdHJ1ZSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgbG05NTI0NV9jaGlwX2NvbmZpZ1tdID0geworCUhXTU9OX0NfVVBEQVRFX0lOVEVSVkFMLAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGxtOTUyNDVfY2hpcCA9IHsKKwkudHlwZSA9IGh3bW9uX2NoaXAsCisJLmNvbmZpZyA9IGxtOTUyNDVfY2hpcF9jb25maWcsCit9OworCitzdGF0aWMgY29uc3QgdTMyIGxtOTUyNDVfdGVtcF9jb25maWdbXSA9IHsKKwlIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9DUklUIHwgSFdNT05fVF9DUklUX0hZU1QgfCBIV01PTl9UX0NSSVRfQUxBUk0sCisJSFdNT05fVF9JTlBVVCB8IEhXTU9OX1RfTUFYIHwgSFdNT05fVF9NQVhfSFlTVCB8IEhXTU9OX1RfQ1JJVCB8CisJCUhXTU9OX1RfQ1JJVF9IWVNUIHwgSFdNT05fVF9GQVVMVCB8IEhXTU9OX1RfTUFYX0FMQVJNIHwKKwkJSFdNT05fVF9DUklUX0FMQVJNIHwgSFdNT05fVF9UWVBFIHwgSFdNT05fVF9PRkZTRVQsCisJMAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbG05NTI0NV90ZW1wID0geworCS50eXBlID0gaHdtb25fdGVtcCwKKwkuY29uZmlnID0gbG05NTI0NV90ZW1wX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICpsbTk1MjQ1X2luZm9bXSA9IHsKKwkmbG05NTI0NV9jaGlwLAorCSZsbTk1MjQ1X3RlbXAsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9vcHMgbG05NTI0NV9od21vbl9vcHMgPSB7CisJLmlzX3Zpc2libGUgPSBsbTk1MjQ1X2lzX3Zpc2libGUsCisJLnJlYWQgPSBsbTk1MjQ1X3JlYWQsCisJLndyaXRlID0gbG05NTI0NV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvIGxtOTUyNDVfY2hpcF9pbmZvID0geworCS5vcHMgPSAmbG05NTI0NV9od21vbl9vcHMsCisJLmluZm8gPSBsbTk1MjQ1X2luZm8sCit9OworCiBzdGF0aWMgaW50IGxtOTUyNDVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OwogCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGE7CiAJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCWludCByZXQ7CiAKIAlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBsbTk1MjQ1X2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCWRhdGEtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJmxtOTUyNDVfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihkYXRhLT5yZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5yZWdtYXApOworCiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgTE05NTI0NSBjaGlwICovCi0JbG05NTI0NV9pbml0X2NsaWVudChjbGllbnQsIGRhdGEpOworCXJldCA9IGxtOTUyNDVfaW5pdF9jbGllbnQoZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKLQlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKLQkJCQkJCQkgICBkYXRhLAotCQkJCQkJCSAgIGxtOTUyNDVfZ3JvdXBzKTsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oZGV2LCBjbGllbnQtPm5hbWUsCisJCQkJCQkJIGRhdGEsCisJCQkJCQkJICZsbTk1MjQ1X2NoaXBfaW5mbywKKwkJCQkJCQkgTlVMTCk7CiAJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21vbl9kZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2x0YzQxNTEuYyBiL2RyaXZlcnMvaHdtb24vbHRjNDE1MS5jCmluZGV4IGM4NmExODQuLjg0NDVjOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbHRjNDE1MS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbHRjNDE1MS5jCkBAIC0zMCw2ICszMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC01Miw2ICs1Myw3IEBACiAJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOwogCWJvb2wgdmFsaWQ7CiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIGluIGppZmZpZXMgKi8KKwl1bnNpZ25lZCBpbnQgc2h1bnQ7IC8qIGluIG1pY3JvIG9obXMgKi8KIAogCS8qIFJlZ2lzdGVycyAqLwogCXU4IHJlZ3NbNl07CkBAIC0xMTEsOSArMTEzLDkgQEAKIAljYXNlIExUQzQxNTFfU0VOU0VfSDoKIAkJLyoKIAkJICogMjB1ViByZXNvbHV0aW9uLiBDb252ZXJ0IHRvIGN1cnJlbnQgYXMgbWVhc3VyZWQgd2l0aAotCQkgKiBhbiAxIG1PaG0gc2Vuc2UgcmVzaXN0b3IsIGluIG1BLgorCQkgKiBhIGdpdmVuIHNlbnNlIHJlc2lzdG9yLCBpbiBtQS4KIAkJICovCi0JCXZhbCA9IHZhbCAqIDIwOworCQl2YWwgPSB2YWwgKiAyMCAqIDEwMDAgLyBkYXRhLT5zaHVudDsKIAkJYnJlYWs7CiAJY2FzZSBMVEM0MTUxX1ZJTl9IOgogCQkvKiAyNSBtViBwZXIgaW5jcmVtZW50ICovCkBAIC0xNzYsNiArMTc4LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJc3RydWN0IGx0YzQxNTFfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJdTMyIHNodW50OwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE4NCw2ICsxODcsMTUgQEAKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNsaWVudC0+ZGV2Lm9mX25vZGUsCisJCQkJICJzaHVudC1yZXNpc3Rvci1taWNyby1vaG1zIiwgJnNodW50KSkKKwkJc2h1bnQgPSAxMDAwOyAvKiAxIG1PaG0gaWYgbm90IHNldCB2aWEgRFQgKi8KKworCWlmIChzaHVudCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRhdGEtPnNodW50ID0gc2h1bnQ7CisKIAlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCkBAIC0xOTksMTAgKzIxMSwxNiBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsdGM0MTUxX2lkKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbHRjNDE1MV9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibGx0YyxsdGM0MTUxIiB9LAorCXt9LAorfTsKKwogLyogVGhpcyBpcyB0aGUgZHJpdmVyIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCAqLwogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGx0YzQxNTFfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gImx0YzQxNTEiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobHRjNDE1MV9tYXRjaCksCiAJfSwKIAkucHJvYmUJCT0gbHRjNDE1MV9wcm9iZSwKIAkuaWRfdGFibGUJPSBsdGM0MTUxX2lkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sdGM0MjQ1LmMgYi9kcml2ZXJzL2h3bW9uL2x0YzQyNDUuYwppbmRleCA2ODFiNWI3Li40NjgwZDg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2x0YzQyNDUuYworKysgYi9kcml2ZXJzL2h3bW9uL2x0YzQyNDUuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CkBAIC01Myw4ICs1NCw2IEBACiBzdHJ1Y3QgbHRjNDI0NV9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCi0JY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqZ3JvdXBzWzNdOwotCiAJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOwogCWJvb2wgdmFsaWQ7CiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIGluIGppZmZpZXMgKi8KQEAgLTE2Miw3ICsxNjEsNyBAQAogCQlsdGM0MjQ1X3VwZGF0ZV9ncGlvcyhkZXYpOwogCiAJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7Ci0JCWRhdGEtPnZhbGlkID0gMTsKKwkJZGF0YS0+dmFsaWQgPSB0cnVlOwogCX0KIAogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwpAQCAtMjU2LDIxNCArMjU1LDIwNSBAQAogCXJldHVybiBjdXJyOwogfQogCi1zdGF0aWMgc3NpemVfdCBsdGM0MjQ1X3Nob3dfdm9sdGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKLQkJCQkgICAgY2hhciAqYnVmKQorLyogTWFwIGZyb20gdm9sdGFnZSBjaGFubmVsIGluZGV4IHRvIHZvbHRhZ2UgcmVnaXN0ZXIgKi8KKworc3RhdGljIGNvbnN0IHM4IGx0YzQyNDVfaW5fcmVnc1tdID0geworCUxUQzQyNDVfMTJWSU4sIExUQzQyNDVfNVZJTiwgTFRDNDI0NV8zVklOLCBMVEM0MjQ1X1ZFRUlOLAorCUxUQzQyNDVfMTJWT1VULCBMVEM0MjQ1XzVWT1VULCBMVEM0MjQ1XzNWT1VULCBMVEM0MjQ1X1ZFRU9VVCwKK307CisKKy8qIE1hcCBmcm9tIGN1cnJlbnQgY2hhbm5lbCBpbmRleCB0byBjdXJyZW50IHJlZ2lzdGVyICovCisKK3N0YXRpYyBjb25zdCBzOCBsdGM0MjQ1X2N1cnJfcmVnc1tdID0geworCUxUQzQyNDVfMTJWU0VOU0UsIExUQzQyNDVfNVZTRU5TRSwgTFRDNDI0NV8zVlNFTlNFLCBMVEM0MjQ1X1ZFRVNFTlNFLAorfTsKKworc3RhdGljIGludCBsdGM0MjQ1X3JlYWRfY3VycihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgbG9uZyAqdmFsKQogewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7Ci0JY29uc3QgaW50IHZvbHRhZ2UgPSBsdGM0MjQ1X2dldF92b2x0YWdlKGRldiwgYXR0ci0+aW5kZXgpOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHZvbHRhZ2UpOwotfQotCi1zdGF0aWMgc3NpemVfdCBsdGM0MjQ1X3Nob3dfY3VycmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKLQkJCQkgICAgY2hhciAqYnVmKQotewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7Ci0JY29uc3QgdW5zaWduZWQgaW50IGN1cnIgPSBsdGM0MjQ1X2dldF9jdXJyZW50KGRldiwgYXR0ci0+aW5kZXgpOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIGN1cnIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBsdGM0MjQ1X3Nob3dfcG93ZXIoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAotCQkJCSAgY2hhciAqYnVmKQotewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7Ci0JY29uc3QgdW5zaWduZWQgaW50IGN1cnIgPSBsdGM0MjQ1X2dldF9jdXJyZW50KGRldiwgYXR0ci0+aW5kZXgpOwotCWNvbnN0IGludCBvdXRwdXRfdm9sdGFnZSA9IGx0YzQyNDVfZ2V0X3ZvbHRhZ2UoZGV2LCBhdHRyLT5pbmRleCsxKTsKLQotCS8qIGN1cnJlbnQgaW4gbUEgKiB2b2x0YWdlIGluIG1WID09IHBvd2VyIGluIHVXICovCi0JY29uc3QgdW5zaWduZWQgaW50IHBvd2VyID0gYWJzKG91dHB1dF92b2x0YWdlICogY3Vycik7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgcG93ZXIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBsdGM0MjQ1X3Nob3dfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKLQkJCQkJICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkYSk7CiAJc3RydWN0IGx0YzQyNDVfZGF0YSAqZGF0YSA9IGx0YzQyNDVfdXBkYXRlX2RldmljZShkZXYpOwotCWNvbnN0IHU4IHJlZyA9IGRhdGEtPmNyZWdzW2F0dHItPmluZGV4XTsKLQljb25zdCB1MzIgbWFzayA9IGF0dHItPm5yOwogCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIChyZWcgJiBtYXNrKSA/IDEgOiAwKTsKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX2N1cnJfaW5wdXQ6CisJCSp2YWwgPSBsdGM0MjQ1X2dldF9jdXJyZW50KGRldiwgbHRjNDI0NV9jdXJyX3JlZ3NbY2hhbm5lbF0pOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX2N1cnJfbWF4X2FsYXJtOgorCQkqdmFsID0gISEoZGF0YS0+Y3JlZ3NbTFRDNDI0NV9GQVVMVDFdICYgQklUKGNoYW5uZWwgKyA0KSk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGx0YzQyNDVfc2hvd19ncGlvKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAotCQkJCSBjaGFyICpidWYpCitzdGF0aWMgaW50IGx0YzQyNDVfcmVhZF9pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyAqdmFsKQogewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CiAJc3RydWN0IGx0YzQyNDVfZGF0YSAqZGF0YSA9IGx0YzQyNDVfdXBkYXRlX2RldmljZShkZXYpOwotCWludCB2YWwgPSBkYXRhLT5ncGlvc1thdHRyLT5pbmRleF07CiAKLQkvKiBoYW5kbGUgc3RhbGUgR1BJTydzICovCi0JaWYgKHZhbCA8IDApCi0JCXJldHVybiB2YWw7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl9pbl9pbnB1dDoKKwkJaWYgKGNoYW5uZWwgPCA4KSB7CisJCQkqdmFsID0gbHRjNDI0NV9nZXRfdm9sdGFnZShkZXYsCisJCQkJCQlsdGM0MjQ1X2luX3JlZ3NbY2hhbm5lbF0pOworCQl9IGVsc2UgeworCQkJaW50IHJlZ3ZhbCA9IGRhdGEtPmdwaW9zW2NoYW5uZWwgLSA4XTsKIAotCS8qIENvbnZlcnQgdG8gbWlsbGl2b2x0cyBhbmQgcHJpbnQgKi8KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgdmFsICogMTApOworCQkJaWYgKHJlZ3ZhbCA8IDApCisJCQkJcmV0dXJuIHJlZ3ZhbDsKKwkJCSp2YWwgPSByZWd2YWwgKiAxMDsKKwkJfQorCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX2luX21pbl9hbGFybToKKwkJaWYgKGNoYW5uZWwgPCA0KQorCQkJKnZhbCA9ICEhKGRhdGEtPmNyZWdzW0xUQzQyNDVfRkFVTFQxXSAmIEJJVChjaGFubmVsKSk7CisJCWVsc2UKKwkJCSp2YWwgPSAhIShkYXRhLT5jcmVnc1tMVEM0MjQ1X0ZBVUxUMl0gJgorCQkJCSAgQklUKGNoYW5uZWwgLSA0KSk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiB9CiAKLS8qIENvbnN0cnVjdCBhIHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIHN0cnVjdHVyZSBmb3IgZWFjaCByZWdpc3RlciAqLwotCi0vKiBJbnB1dCB2b2x0YWdlcyAqLwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd192b2x0YWdlLCBOVUxMLAotCQkJICBMVEM0MjQ1XzEyVklOKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfdm9sdGFnZSwgTlVMTCwKLQkJCSAgTFRDNDI0NV81VklOKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4zX2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfdm9sdGFnZSwgTlVMTCwKLQkJCSAgTFRDNDI0NV8zVklOKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW40X2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfdm9sdGFnZSwgTlVMTCwKLQkJCSAgTFRDNDI0NV9WRUVJTik7Ci0KLS8qIElucHV0IHVuZGVydm9sdGFnZSBhbGFybXMgKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjFfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfYWxhcm0sIE5VTEwsCi0JCQkgICAgMSA8PCAwLCBMVEM0MjQ1X0ZBVUxUMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4yX21pbl9hbGFybSwgU19JUlVHTywgbHRjNDI0NV9zaG93X2FsYXJtLCBOVUxMLAotCQkJICAgIDEgPDwgMSwgTFRDNDI0NV9GQVVMVDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluM19taW5fYWxhcm0sIFNfSVJVR08sIGx0YzQyNDVfc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgICAxIDw8IDIsIExUQzQyNDVfRkFVTFQxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjRfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfYWxhcm0sIE5VTEwsCi0JCQkgICAgMSA8PCAzLCBMVEM0MjQ1X0ZBVUxUMSk7Ci0KLS8qIEN1cnJlbnRzICh2aWEgc2Vuc2UgcmVzaXN0b3IpICovCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGN1cnIxX2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfY3VycmVudCwgTlVMTCwKLQkJCSAgTFRDNDI0NV8xMlZTRU5TRSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGN1cnIyX2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfY3VycmVudCwgTlVMTCwKLQkJCSAgTFRDNDI0NV81VlNFTlNFKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoY3VycjNfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd19jdXJyZW50LCBOVUxMLAotCQkJICBMVEM0MjQ1XzNWU0VOU0UpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihjdXJyNF9pbnB1dCwgU19JUlVHTywgbHRjNDI0NV9zaG93X2N1cnJlbnQsIE5VTEwsCi0JCQkgIExUQzQyNDVfVkVFU0VOU0UpOwotCi0vKiBPdmVyY3VycmVudCBhbGFybXMgKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihjdXJyMV9tYXhfYWxhcm0sIFNfSVJVR08sIGx0YzQyNDVfc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgICAxIDw8IDQsIExUQzQyNDVfRkFVTFQxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihjdXJyMl9tYXhfYWxhcm0sIFNfSVJVR08sIGx0YzQyNDVfc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgICAxIDw8IDUsIExUQzQyNDVfRkFVTFQxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihjdXJyM19tYXhfYWxhcm0sIFNfSVJVR08sIGx0YzQyNDVfc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgICAxIDw8IDYsIExUQzQyNDVfRkFVTFQxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihjdXJyNF9tYXhfYWxhcm0sIFNfSVJVR08sIGx0YzQyNDVfc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgICAxIDw8IDcsIExUQzQyNDVfRkFVTFQxKTsKLQotLyogT3V0cHV0IHZvbHRhZ2VzICovCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNV9pbnB1dCwgU19JUlVHTywgbHRjNDI0NV9zaG93X3ZvbHRhZ2UsIE5VTEwsCi0JCQkgIExUQzQyNDVfMTJWT1VUKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW42X2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfdm9sdGFnZSwgTlVMTCwKLQkJCSAgTFRDNDI0NV81Vk9VVCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluN19pbnB1dCwgU19JUlVHTywgbHRjNDI0NV9zaG93X3ZvbHRhZ2UsIE5VTEwsCi0JCQkgIExUQzQyNDVfM1ZPVVQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjhfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd192b2x0YWdlLCBOVUxMLAotCQkJICBMVEM0MjQ1X1ZFRU9VVCk7Ci0KLS8qIFBvd2VyIEJhZCBhbGFybXMgKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjVfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfYWxhcm0sIE5VTEwsCi0JCQkgICAgMSA8PCAwLCBMVEM0MjQ1X0ZBVUxUMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW42X21pbl9hbGFybSwgU19JUlVHTywgbHRjNDI0NV9zaG93X2FsYXJtLCBOVUxMLAotCQkJICAgIDEgPDwgMSwgTFRDNDI0NV9GQVVMVDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluN19taW5fYWxhcm0sIFNfSVJVR08sIGx0YzQyNDVfc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgICAxIDw8IDIsIExUQzQyNDVfRkFVTFQyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjhfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfYWxhcm0sIE5VTEwsCi0JCQkgICAgMSA8PCAzLCBMVEM0MjQ1X0ZBVUxUMik7Ci0KLS8qIEdQSU8gdm9sdGFnZXMgKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW45X2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfZ3BpbywgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTBfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd19ncGlvLCBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xMV9pbnB1dCwgU19JUlVHTywgbHRjNDI0NV9zaG93X2dwaW8sIE5VTEwsIDIpOwotCi0vKiBQb3dlciBDb25zdW1wdGlvbiAodmlydHVhbCkgKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocG93ZXIxX2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfcG93ZXIsIE5VTEwsCi0JCQkgIExUQzQyNDVfMTJWU0VOU0UpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwb3dlcjJfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd19wb3dlciwgTlVMTCwKLQkJCSAgTFRDNDI0NV81VlNFTlNFKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocG93ZXIzX2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfcG93ZXIsIE5VTEwsCi0JCQkgIExUQzQyNDVfM1ZTRU5TRSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHBvd2VyNF9pbnB1dCwgU19JUlVHTywgbHRjNDI0NV9zaG93X3Bvd2VyLCBOVUxMLAotCQkJICBMVEM0MjQ1X1ZFRVNFTlNFKTsKLQotLyoKLSAqIEZpbmFsbHksIGNvbnN0cnVjdCBhbiBhcnJheSBvZiBwb2ludGVycyB0byBtZW1iZXJzIG9mIHRoZSBhYm92ZSBvYmplY3RzLAotICogYXMgcmVxdWlyZWQgZm9yIHN5c2ZzX2NyZWF0ZV9ncm91cCgpCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsdGM0MjQ1X3N0ZF9hdHRyaWJ1dGVzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl9pbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4zX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQotCSZzZW5zb3JfZGV2X2F0dHJfaW4xX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4yX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4zX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW40X21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAotCi0JJnNlbnNvcl9kZXZfYXR0cl9jdXJyMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfY3VycjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2N1cnIzX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9jdXJyNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCi0JJnNlbnNvcl9kZXZfYXR0cl9jdXJyMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2N1cnIyX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfY3VycjNfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9jdXJyNF9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQotCSZzZW5zb3JfZGV2X2F0dHJfaW41X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luN19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW44X2lucHV0LmRldl9hdHRyLmF0dHIsCi0KLQkmc2Vuc29yX2Rldl9hdHRyX2luNV9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luNl9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luN19taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luOF9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQotCSZzZW5zb3JfZGV2X2F0dHJfaW45X2lucHV0LmRldl9hdHRyLmF0dHIsCi0KLQkmc2Vuc29yX2Rldl9hdHRyX3Bvd2VyMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXIyX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wb3dlcjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3Bvd2VyNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsdGM0MjQ1X2dwaW9fYXR0cmlidXRlc1tdID0gewotCSZzZW5zb3JfZGV2X2F0dHJfaW4xMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4xMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCU5VTEwsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsdGM0MjQ1X3N0ZF9ncm91cCA9IHsKLQkuYXR0cnMgPSBsdGM0MjQ1X3N0ZF9hdHRyaWJ1dGVzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbHRjNDI0NV9ncGlvX2dyb3VwID0gewotCS5hdHRycyA9IGx0YzQyNDVfZ3Bpb19hdHRyaWJ1dGVzLAotfTsKLQotc3RhdGljIHZvaWQgbHRjNDI0NV9zeXNmc19hZGRfZ3JvdXBzKHN0cnVjdCBsdGM0MjQ1X2RhdGEgKmRhdGEpCitzdGF0aWMgaW50IGx0YzQyNDVfcmVhZF9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgIGxvbmcgKnZhbCkKIHsKLQkvKiBzdGFuZGFyZCBzeXNmcyBhdHRyaWJ1dGVzICovCi0JZGF0YS0+Z3JvdXBzWzBdID0gJmx0YzQyNDVfc3RkX2dyb3VwOworCXVuc2lnbmVkIGxvbmcgY3VycjsKKwlsb25nIHZvbHRhZ2U7CiAKLQkvKiBpZiB3ZSdyZSB1c2luZyB0aGUgZXh0cmEgZ3BpbyBzdXBwb3J0LCByZWdpc3RlciBpdCdzIGF0dHJpYnV0ZXMgKi8KLQlpZiAoZGF0YS0+dXNlX2V4dHJhX2dwaW9zKQotCQlkYXRhLT5ncm91cHNbMV0gPSAmbHRjNDI0NV9ncGlvX2dyb3VwOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fcG93ZXJfaW5wdXQ6CisJCSh2b2lkKWx0YzQyNDVfdXBkYXRlX2RldmljZShkZXYpOworCQljdXJyID0gbHRjNDI0NV9nZXRfY3VycmVudChkZXYsIGx0YzQyNDVfY3Vycl9yZWdzW2NoYW5uZWxdKTsKKwkJdm9sdGFnZSA9IGx0YzQyNDVfZ2V0X3ZvbHRhZ2UoZGV2LCBsdGM0MjQ1X2luX3JlZ3NbY2hhbm5lbF0pOworCQkqdmFsID0gYWJzKGN1cnIgKiB2b2x0YWdlKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAorc3RhdGljIGludCBsdGM0MjQ1X3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nICp2YWwpCit7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2N1cnI6CisJCXJldHVybiBsdGM0MjQ1X3JlYWRfY3VycihkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJY2FzZSBod21vbl9wb3dlcjoKKwkJcmV0dXJuIGx0YzQyNDVfcmVhZF9wb3dlcihkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJY2FzZSBod21vbl9pbjoKKwkJcmV0dXJuIGx0YzQyNDVfcmVhZF9pbihkZXYsIGF0dHIsIGNoYW5uZWwgLSAxLCB2YWwpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKK3N0YXRpYyB1bW9kZV90IGx0YzQyNDVfaXNfdmlzaWJsZShjb25zdCB2b2lkICpfZGF0YSwKKwkJCQkgIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkJICB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCit7CisJY29uc3Qgc3RydWN0IGx0YzQyNDVfZGF0YSAqZGF0YSA9IF9kYXRhOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9pbjoKKwkJaWYgKGNoYW5uZWwgPT0gMCkKKwkJCXJldHVybiAwOworCQlzd2l0Y2ggKGF0dHIpIHsKKwkJY2FzZSBod21vbl9pbl9pbnB1dDoKKwkJCWlmIChjaGFubmVsID4gOSAmJiAhZGF0YS0+dXNlX2V4dHJhX2dwaW9zKQorCQkJCXJldHVybiAwOworCQkJcmV0dXJuIFNfSVJVR087CisJCWNhc2UgaHdtb25faW5fbWluX2FsYXJtOgorCQkJaWYgKGNoYW5uZWwgPiA4KQorCQkJCXJldHVybiAwOworCQkJcmV0dXJuIFNfSVJVR087CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgaHdtb25fY3VycjoKKwkJc3dpdGNoIChhdHRyKSB7CisJCWNhc2UgaHdtb25fY3Vycl9pbnB1dDoKKwkJY2FzZSBod21vbl9jdXJyX21heF9hbGFybToKKwkJCXJldHVybiBTX0lSVUdPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIGh3bW9uX3Bvd2VyOgorCQlzd2l0Y2ggKGF0dHIpIHsKKwkJY2FzZSBod21vbl9wb3dlcl9pbnB1dDoKKwkJCXJldHVybiBTX0lSVUdPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCB1MzIgbHRjNDI0NV9pbl9jb25maWdbXSA9IHsKKwlIV01PTl9JX0lOUFVULAkJCS8qIGR1bW15LCBza2lwcGVkIGluIGlzX3Zpc2libGUgKi8KKwlIV01PTl9JX0lOUFVUIHwgSFdNT05fSV9NSU5fQUxBUk0sCisJSFdNT05fSV9JTlBVVCB8IEhXTU9OX0lfTUlOX0FMQVJNLAorCUhXTU9OX0lfSU5QVVQgfCBIV01PTl9JX01JTl9BTEFSTSwKKwlIV01PTl9JX0lOUFVUIHwgSFdNT05fSV9NSU5fQUxBUk0sCisJSFdNT05fSV9JTlBVVCB8IEhXTU9OX0lfTUlOX0FMQVJNLAorCUhXTU9OX0lfSU5QVVQgfCBIV01PTl9JX01JTl9BTEFSTSwKKwlIV01PTl9JX0lOUFVUIHwgSFdNT05fSV9NSU5fQUxBUk0sCisJSFdNT05fSV9JTlBVVCB8IEhXTU9OX0lfTUlOX0FMQVJNLAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGx0YzQyNDVfaW4gPSB7CisJLnR5cGUgPSBod21vbl9pbiwKKwkuY29uZmlnID0gbHRjNDI0NV9pbl9jb25maWcsCit9OworCitzdGF0aWMgY29uc3QgdTMyIGx0YzQyNDVfY3Vycl9jb25maWdbXSA9IHsKKwlIV01PTl9DX0lOUFVUIHwgSFdNT05fQ19NQVhfQUxBUk0sCisJSFdNT05fQ19JTlBVVCB8IEhXTU9OX0NfTUFYX0FMQVJNLAorCUhXTU9OX0NfSU5QVVQgfCBIV01PTl9DX01BWF9BTEFSTSwKKwlIV01PTl9DX0lOUFVUIHwgSFdNT05fQ19NQVhfQUxBUk0sCisJMAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbHRjNDI0NV9jdXJyID0geworCS50eXBlID0gaHdtb25fY3VyciwKKwkuY29uZmlnID0gbHRjNDI0NV9jdXJyX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCB1MzIgbHRjNDI0NV9wb3dlcl9jb25maWdbXSA9IHsKKwlIV01PTl9QX0lOUFVULAorCUhXTU9OX1BfSU5QVVQsCisJSFdNT05fUF9JTlBVVCwKKwlIV01PTl9QX0lOUFVULAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGx0YzQyNDVfcG93ZXIgPSB7CisJLnR5cGUgPSBod21vbl9wb3dlciwKKwkuY29uZmlnID0gbHRjNDI0NV9wb3dlcl9jb25maWcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqbHRjNDI0NV9pbmZvW10gPSB7CisJJmx0YzQyNDVfaW4sCisJJmx0YzQyNDVfY3VyciwKKwkmbHRjNDI0NV9wb3dlciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX29wcyBsdGM0MjQ1X2h3bW9uX29wcyA9IHsKKwkuaXNfdmlzaWJsZSA9IGx0YzQyNDVfaXNfdmlzaWJsZSwKKwkucmVhZCA9IGx0YzQyNDVfcmVhZCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvIGx0YzQyNDVfY2hpcF9pbmZvID0geworCS5vcHMgPSAmbHRjNDI0NV9od21vbl9vcHMsCisJLmluZm8gPSBsdGM0MjQ1X2luZm8sCit9OworCiBzdGF0aWMgYm9vbCBsdGM0MjQ1X3VzZV9leHRyYV9ncGlvcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBsdGM0MjQ1X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmY2xpZW50LT5kZXYpOwpAQCAtNTAyLDEyICs0OTIsMTAgQEAKIAlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTFRDNDI0NV9GQVVMVDEsIDB4MDApOwogCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMVEM0MjQ1X0ZBVUxUMiwgMHgwMCk7CiAKLQkvKiBBZGQgc3lzZnMgaG9va3MgKi8KLQlsdGM0MjQ1X3N5c2ZzX2FkZF9ncm91cHMoZGF0YSk7Ci0KLQlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcygmY2xpZW50LT5kZXYsCi0JCQkJCQkJICAgY2xpZW50LT5uYW1lLCBkYXRhLAotCQkJCQkJCSAgIGRhdGEtPmdyb3Vwcyk7CisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKCZjbGllbnQtPmRldiwKKwkJCQkJCQkgY2xpZW50LT5uYW1lLCBkYXRhLAorCQkJCQkJCSAmbHRjNDI0NV9jaGlwX2luZm8sCisJCQkJCQkJIE5VTEwpOwogCXJldHVybiBQVFJfRVJSX09SX1pFUk8oaHdtb25fZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9tYXgzMTc5MC5jIGIvZHJpdmVycy9od21vbi9tYXgzMTc5MC5jCmluZGV4IDY5YzBhYzguLmJlZjg0ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbWF4MzE3OTAuYworKysgYi9kcml2ZXJzL2h3bW9uL21heDMxNzkwLmMKQEAgLTE3LDcgKzE3LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgpAQCAtMTY5LDM2MiArMTY4LDI4OCBAQAogCXJldHVybiBiaXRzOwogfQogCi1zdGF0aWMgc3NpemVfdCBnZXRfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCitzdGF0aWMgaW50IG1heDMxNzkwX3JlYWRfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLAorCQkJICAgICBsb25nICp2YWwpCiB7Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwogCXN0cnVjdCBtYXgzMTc5MF9kYXRhICpkYXRhID0gbWF4MzE3OTBfdXBkYXRlX2RldmljZShkZXYpOwogCWludCBzciwgcnBtOwogCiAJaWYgKElTX0VSUihkYXRhKSkKIAkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CiAKLQlzciA9IGdldF90YWNoX3BlcmlvZChkYXRhLT5mYW5fZHluYW1pY3NbYXR0ci0+aW5kZXhdKTsKLQlycG0gPSBSUE1fRlJPTV9SRUcoZGF0YS0+dGFjaFthdHRyLT5pbmRleF0sIHNyKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBycG0pOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fZmFuX2lucHV0OgorCQlzciA9IGdldF90YWNoX3BlcmlvZChkYXRhLT5mYW5fZHluYW1pY3NbY2hhbm5lbF0pOworCQlycG0gPSBSUE1fRlJPTV9SRUcoZGF0YS0+dGFjaFtjaGFubmVsXSwgc3IpOworCQkqdmFsID0gcnBtOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX2Zhbl90YXJnZXQ6CisJCXNyID0gZ2V0X3RhY2hfcGVyaW9kKGRhdGEtPmZhbl9keW5hbWljc1tjaGFubmVsXSk7CisJCXJwbSA9IFJQTV9GUk9NX1JFRyhkYXRhLT50YXJnZXRfY291bnRbY2hhbm5lbF0sIHNyKTsKKwkJKnZhbCA9IHJwbTsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl9mYW5fZmF1bHQ6CisJCSp2YWwgPSAhIShkYXRhLT5mYXVsdF9zdGF0dXMgJiAoMSA8PCBjaGFubmVsKSk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGdldF9mYW5fdGFyZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCitzdGF0aWMgaW50IG1heDMxNzkwX3dyaXRlX2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgIGxvbmcgdmFsKQogewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQlzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IG1heDMxNzkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgc3IsIHJwbTsKLQotCWlmIChJU19FUlIoZGF0YSkpCi0JCXJldHVybiBQVFJfRVJSKGRhdGEpOwotCi0Jc3IgPSBnZXRfdGFjaF9wZXJpb2QoZGF0YS0+ZmFuX2R5bmFtaWNzW2F0dHItPmluZGV4XSk7Ci0JcnBtID0gUlBNX0ZST01fUkVHKGRhdGEtPnRhcmdldF9jb3VudFthdHRyLT5pbmRleF0sIHNyKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBycG0pOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfZmFuX3RhcmdldChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKIAlzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CisJaW50IHRhcmdldF9jb3VudDsKKwlpbnQgZXJyID0gMDsKIAl1OCBiaXRzOwogCWludCBzcjsKLQlpbnQgdGFyZ2V0X2NvdW50OwotCXVuc2lnbmVkIGxvbmcgcnBtOwotCWludCBlcnI7Ci0KLQllcnIgPSBrc3RydG91bChidWYsIDEwLCAmcnBtKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCi0JcnBtID0gY2xhbXBfdmFsKHJwbSwgRkFOX1JQTV9NSU4sIEZBTl9SUE1fTUFYKTsKLQliaXRzID0gYml0c19mb3JfdGFjaF9wZXJpb2QocnBtKTsKLQlkYXRhLT5mYW5fZHluYW1pY3NbYXR0ci0+aW5kZXhdID0KLQkJCSgoZGF0YS0+ZmFuX2R5bmFtaWNzW2F0dHItPmluZGV4XQotCQkJICAmIH5NQVgzMTc5MF9GQU5fRFlOX1NSX01BU0spCi0JCQkgfCAoYml0cyA8PCBNQVgzMTc5MF9GQU5fRFlOX1NSX1NISUZUKSk7Ci0JZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCi0JCQlNQVgzMTc5MF9SRUdfRkFOX0RZTkFNSUNTKGF0dHItPmluZGV4KSwKLQkJCWRhdGEtPmZhbl9keW5hbWljc1thdHRyLT5pbmRleF0pOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fZmFuX3RhcmdldDoKKwkJdmFsID0gY2xhbXBfdmFsKHZhbCwgRkFOX1JQTV9NSU4sIEZBTl9SUE1fTUFYKTsKKwkJYml0cyA9IGJpdHNfZm9yX3RhY2hfcGVyaW9kKHZhbCk7CisJCWRhdGEtPmZhbl9keW5hbWljc1tjaGFubmVsXSA9CisJCQkoKGRhdGEtPmZhbl9keW5hbWljc1tjaGFubmVsXSAmCisJCQkgIH5NQVgzMTc5MF9GQU5fRFlOX1NSX01BU0spIHwKKwkJCSAoYml0cyA8PCBNQVgzMTc5MF9GQU5fRFlOX1NSX1NISUZUKSk7CisJCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQlNQVgzMTc5MF9SRUdfRkFOX0RZTkFNSUNTKGNoYW5uZWwpLAorCQkJCQlkYXRhLT5mYW5fZHluYW1pY3NbY2hhbm5lbF0pOworCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOwogCi0JaWYgKGVyciA8IDApIHsKLQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JCXJldHVybiBlcnI7Ci0JfQorCQlzciA9IGdldF90YWNoX3BlcmlvZChkYXRhLT5mYW5fZHluYW1pY3NbY2hhbm5lbF0pOworCQl0YXJnZXRfY291bnQgPSBSUE1fVE9fUkVHKHZhbCwgc3IpOworCQl0YXJnZXRfY291bnQgPSBjbGFtcF92YWwodGFyZ2V0X2NvdW50LCAweDEsIDB4N0ZGKTsKIAotCXNyID0gZ2V0X3RhY2hfcGVyaW9kKGRhdGEtPmZhbl9keW5hbWljc1thdHRyLT5pbmRleF0pOwotCXRhcmdldF9jb3VudCA9IFJQTV9UT19SRUcocnBtLCBzcik7Ci0JdGFyZ2V0X2NvdW50ID0gY2xhbXBfdmFsKHRhcmdldF9jb3VudCwgMHgxLCAweDdGRik7CisJCWRhdGEtPnRhcmdldF9jb3VudFtjaGFubmVsXSA9IHRhcmdldF9jb3VudCA8PCA1OwogCi0JZGF0YS0+dGFyZ2V0X2NvdW50W2F0dHItPmluZGV4XSA9IHRhcmdldF9jb3VudCA8PCA1OwotCi0JZXJyID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsCi0JCQlNQVgzMTc5MF9SRUdfVEFSR0VUX0NPVU5UKGF0dHItPmluZGV4KSwKLQkJCWRhdGEtPnRhcmdldF9jb3VudFthdHRyLT5pbmRleF0pOwotCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgZ2V0X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQlzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IG1heDMxNzkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgcHdtOwotCi0JaWYgKElTX0VSUihkYXRhKSkKLQkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7Ci0KLQlwd20gPSBkYXRhLT5wd21bYXR0ci0+aW5kZXhdID4+IDg7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcHdtKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2V0X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKLQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQlzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7Ci0JdW5zaWduZWQgbG9uZyBwd207Ci0JaW50IGVycjsKLQotCWVyciA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZwd20pOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAocHdtID4gMjU1KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCWRhdGEtPnB3bVthdHRyLT5pbmRleF0gPSBwd20gPDwgODsKLQllcnIgPSBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwKLQkJCU1BWDMxNzkwX1JFR19QV01PVVQoYXR0ci0+aW5kZXgpLAotCQkJZGF0YS0+cHdtW2F0dHItPmluZGV4XSk7Ci0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBnZXRfcHdtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQlzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IG1heDMxNzkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgbW9kZTsKLQotCWlmIChJU19FUlIoZGF0YSkpCi0JCXJldHVybiBQVFJfRVJSKGRhdGEpOwotCi0JaWYgKGRhdGEtPmZhbl9jb25maWdbYXR0ci0+aW5kZXhdICYgTUFYMzE3OTBfRkFOX0NGR19SUE1fTU9ERSkKLQkJbW9kZSA9IDI7Ci0JZWxzZSBpZiAoZGF0YS0+ZmFuX2NvbmZpZ1thdHRyLT5pbmRleF0gJiBNQVgzMTc5MF9GQU5fQ0ZHX1RBQ0hfSU5QVVRfRU4pCi0JCW1vZGUgPSAxOwotCWVsc2UKLQkJbW9kZSA9IDA7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgbW9kZSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNldF9wd21fZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAotCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwotCXN0cnVjdCBtYXgzMTc5MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQl1bnNpZ25lZCBsb25nIG1vZGU7Ci0JaW50IGVycjsKLQotCWVyciA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZtb2RlKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSAwOgotCQlkYXRhLT5mYW5fY29uZmlnW2F0dHItPmluZGV4XSA9Ci0JCQlkYXRhLT5mYW5fY29uZmlnW2F0dHItPmluZGV4XQotCQkJJiB+KE1BWDMxNzkwX0ZBTl9DRkdfVEFDSF9JTlBVVF9FTgotCQkJICAgIHwgTUFYMzE3OTBfRkFOX0NGR19SUE1fTU9ERSk7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJZGF0YS0+ZmFuX2NvbmZpZ1thdHRyLT5pbmRleF0gPQotCQkJKGRhdGEtPmZhbl9jb25maWdbYXR0ci0+aW5kZXhdCi0JCQkgfCBNQVgzMTc5MF9GQU5fQ0ZHX1RBQ0hfSU5QVVRfRU4pCi0JCQkmIH5NQVgzMTc5MF9GQU5fQ0ZHX1JQTV9NT0RFOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWRhdGEtPmZhbl9jb25maWdbYXR0ci0+aW5kZXhdID0KLQkJCWRhdGEtPmZhbl9jb25maWdbYXR0ci0+aW5kZXhdCi0JCQl8IE1BWDMxNzkwX0ZBTl9DRkdfVEFDSF9JTlBVVF9FTgotCQkJfCBNQVgzMTc5MF9GQU5fQ0ZHX1JQTV9NT0RFOworCQllcnIgPSBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwKKwkJCQkJTUFYMzE3OTBfUkVHX1RBUkdFVF9DT1VOVChjaGFubmVsKSwKKwkJCQkJZGF0YS0+dGFyZ2V0X2NvdW50W2NoYW5uZWxdKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKIAl9CiAKLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCU1BWDMxNzkwX1JFR19GQU5fQ09ORklHKGF0dHItPmluZGV4KSwKLQkJCWRhdGEtPmZhbl9jb25maWdbYXR0ci0+aW5kZXhdKTsKLQogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCi0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gY291bnQ7CisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHNzaXplX3QgZ2V0X2Zhbl9mYXVsdChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCitzdGF0aWMgdW1vZGVfdCBtYXgzMTc5MF9mYW5faXNfdmlzaWJsZShjb25zdCB2b2lkICpfZGF0YSwgdTMyIGF0dHIsIGludCBjaGFubmVsKQogewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwljb25zdCBzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IF9kYXRhOworCXU4IGZhbl9jb25maWcgPSBkYXRhLT5mYW5fY29uZmlnW2NoYW5uZWwgJSBOUl9DSEFOTkVMXTsKKworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fZmFuX2lucHV0OgorCWNhc2UgaHdtb25fZmFuX2ZhdWx0OgorCQlpZiAoY2hhbm5lbCA8IE5SX0NIQU5ORUwgfHwKKwkJICAgIChmYW5fY29uZmlnICYgTUFYMzE3OTBfRkFOX0NGR19UQUNIX0lOUFVUKSkKKwkJCXJldHVybiBTX0lSVUdPOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX2Zhbl90YXJnZXQ6CisJCWlmIChjaGFubmVsIDwgTlJfQ0hBTk5FTCAmJgorCQkgICAgIShmYW5fY29uZmlnICYgTUFYMzE3OTBfRkFOX0NGR19UQUNIX0lOUFVUKSkKKwkJCXJldHVybiBTX0lSVUdPIHwgU19JV1VTUjsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IG1heDMxNzkwX3JlYWRfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLAorCQkJICAgICBsb25nICp2YWwpCit7CiAJc3RydWN0IG1heDMxNzkwX2RhdGEgKmRhdGEgPSBtYXgzMTc5MF91cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IGZhdWx0OworCXU4IGZhbl9jb25maWcgPSBkYXRhLT5mYW5fY29uZmlnW2NoYW5uZWxdOwogCiAJaWYgKElTX0VSUihkYXRhKSkKIAkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CiAKLQlmYXVsdCA9ICEhKGRhdGEtPmZhdWx0X3N0YXR1cyAmICgxIDw8IGF0dHItPmluZGV4KSk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZmF1bHQpOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fcHdtX2lucHV0OgorCQkqdmFsID0gZGF0YS0+cHdtW2NoYW5uZWxdID4+IDg7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fcHdtX2VuYWJsZToKKwkJaWYgKGZhbl9jb25maWcgJiBNQVgzMTc5MF9GQU5fQ0ZHX1JQTV9NT0RFKQorCQkJKnZhbCA9IDI7CisJCWVsc2UgaWYgKGZhbl9jb25maWcgJiBNQVgzMTc5MF9GQU5fQ0ZHX1RBQ0hfSU5QVVRfRU4pCisJCQkqdmFsID0gMTsKKwkJZWxzZQorCQkJKnZhbCA9IDA7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiB9CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMV9pbnB1dCwgU19JUlVHTywgZ2V0X2ZhbiwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfaW5wdXQsIFNfSVJVR08sIGdldF9mYW4sIE5VTEwsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4zX2lucHV0LCBTX0lSVUdPLCBnZXRfZmFuLCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNF9pbnB1dCwgU19JUlVHTywgZ2V0X2ZhbiwgTlVMTCwgMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjVfaW5wdXQsIFNfSVJVR08sIGdldF9mYW4sIE5VTEwsIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW42X2lucHV0LCBTX0lSVUdPLCBnZXRfZmFuLCBOVUxMLCA1KTsKK3N0YXRpYyBpbnQgbWF4MzE3OTBfd3JpdGVfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLAorCQkJICAgICAgbG9uZyB2YWwpCit7CisJc3RydWN0IG1heDMxNzkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCXU4IGZhbl9jb25maWc7CisJaW50IGVyciA9IDA7CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMV9mYXVsdCwgU19JUlVHTywgZ2V0X2Zhbl9mYXVsdCwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfZmF1bHQsIFNfSVJVR08sIGdldF9mYW5fZmF1bHQsIE5VTEwsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4zX2ZhdWx0LCBTX0lSVUdPLCBnZXRfZmFuX2ZhdWx0LCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNF9mYXVsdCwgU19JUlVHTywgZ2V0X2Zhbl9mYXVsdCwgTlVMTCwgMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjVfZmF1bHQsIFNfSVJVR08sIGdldF9mYW5fZmF1bHQsIE5VTEwsIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW42X2ZhdWx0LCBTX0lSVUdPLCBnZXRfZmFuX2ZhdWx0LCBOVUxMLCA1KTsKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuN19pbnB1dCwgU19JUlVHTywgZ2V0X2ZhbiwgTlVMTCwgNik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjhfaW5wdXQsIFNfSVJVR08sIGdldF9mYW4sIE5VTEwsIDcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW45X2lucHV0LCBTX0lSVUdPLCBnZXRfZmFuLCBOVUxMLCA4KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMTBfaW5wdXQsIFNfSVJVR08sIGdldF9mYW4sIE5VTEwsIDkpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xMV9pbnB1dCwgU19JUlVHTywgZ2V0X2ZhbiwgTlVMTCwgMTApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xMl9pbnB1dCwgU19JUlVHTywgZ2V0X2ZhbiwgTlVMTCwgMTEpOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fcHdtX2lucHV0OgorCQlpZiAodmFsIDwgMCB8fCB2YWwgPiAyNTUpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlkYXRhLT5wd21bY2hhbm5lbF0gPSB2YWwgPDwgODsKKwkJZXJyID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsCisJCQkJCQkgICBNQVgzMTc5MF9SRUdfUFdNT1VUKGNoYW5uZWwpLAorCQkJCQkJICAgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl9wd21fZW5hYmxlOgorCQlmYW5fY29uZmlnID0gZGF0YS0+ZmFuX2NvbmZpZ1tjaGFubmVsXTsKKwkJaWYgKHZhbCA9PSAwKSB7CisJCQlmYW5fY29uZmlnICY9IH4oTUFYMzE3OTBfRkFOX0NGR19UQUNIX0lOUFVUX0VOIHwKKwkJCQkJTUFYMzE3OTBfRkFOX0NGR19SUE1fTU9ERSk7CisJCX0gZWxzZSBpZiAodmFsID09IDEpIHsKKwkJCWZhbl9jb25maWcgPSAoZmFuX2NvbmZpZyB8CisJCQkJICAgICAgTUFYMzE3OTBfRkFOX0NGR19UQUNIX0lOUFVUX0VOKSAmCisJCQkJICAgICB+TUFYMzE3OTBfRkFOX0NGR19SUE1fTU9ERTsKKwkJfSBlbHNlIGlmICh2YWwgPT0gMikgeworCQkJZmFuX2NvbmZpZyB8PSBNQVgzMTc5MF9GQU5fQ0ZHX1RBQ0hfSU5QVVRfRU4gfAorCQkJCSAgICAgIE1BWDMxNzkwX0ZBTl9DRkdfUlBNX01PREU7CisJCX0gZWxzZSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJZGF0YS0+ZmFuX2NvbmZpZ1tjaGFubmVsXSA9IGZhbl9jb25maWc7CisJCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQlNQVgzMTc5MF9SRUdfRkFOX0NPTkZJRyhjaGFubmVsKSwKKwkJCQkJZmFuX2NvbmZpZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKwl9CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuN19mYXVsdCwgU19JUlVHTywgZ2V0X2Zhbl9mYXVsdCwgTlVMTCwgNik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjhfZmF1bHQsIFNfSVJVR08sIGdldF9mYW5fZmF1bHQsIE5VTEwsIDcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW45X2ZhdWx0LCBTX0lSVUdPLCBnZXRfZmFuX2ZhdWx0LCBOVUxMLCA4KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMTBfZmF1bHQsIFNfSVJVR08sIGdldF9mYW5fZmF1bHQsIE5VTEwsIDkpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xMV9mYXVsdCwgU19JUlVHTywgZ2V0X2Zhbl9mYXVsdCwgTlVMTCwgMTApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xMl9mYXVsdCwgU19JUlVHTywgZ2V0X2Zhbl9mYXVsdCwgTlVMTCwgMTEpOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfdGFyZ2V0LCBTX0lXVVNSIHwgU19JUlVHTywKLQkJZ2V0X2Zhbl90YXJnZXQsIHNldF9mYW5fdGFyZ2V0LCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl90YXJnZXQsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQlnZXRfZmFuX3RhcmdldCwgc2V0X2Zhbl90YXJnZXQsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4zX3RhcmdldCwgU19JV1VTUiB8IFNfSVJVR08sCi0JCWdldF9mYW5fdGFyZ2V0LCBzZXRfZmFuX3RhcmdldCwgMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjRfdGFyZ2V0LCBTX0lXVVNSIHwgU19JUlVHTywKLQkJZ2V0X2Zhbl90YXJnZXQsIHNldF9mYW5fdGFyZ2V0LCAzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNV90YXJnZXQsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQlnZXRfZmFuX3RhcmdldCwgc2V0X2Zhbl90YXJnZXQsIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW42X3RhcmdldCwgU19JV1VTUiB8IFNfSVJVR08sCi0JCWdldF9mYW5fdGFyZ2V0LCBzZXRfZmFuX3RhcmdldCwgNSk7CisJcmV0dXJuIGVycjsKK30KIAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20xLCBTX0lXVVNSIHwgU19JUlVHTywgZ2V0X3B3bSwgc2V0X3B3bSwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTIsIFNfSVdVU1IgfCBTX0lSVUdPLCBnZXRfcHdtLCBzZXRfcHdtLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMywgU19JV1VTUiB8IFNfSVJVR08sIGdldF9wd20sIHNldF9wd20sIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd200LCBTX0lXVVNSIHwgU19JUlVHTywgZ2V0X3B3bSwgc2V0X3B3bSwgMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTUsIFNfSVdVU1IgfCBTX0lSVUdPLCBnZXRfcHdtLCBzZXRfcHdtLCA0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtNiwgU19JV1VTUiB8IFNfSVJVR08sIGdldF9wd20sIHNldF9wd20sIDUpOworc3RhdGljIHVtb2RlX3QgbWF4MzE3OTBfcHdtX2lzX3Zpc2libGUoY29uc3Qgdm9pZCAqX2RhdGEsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKK3sKKwljb25zdCBzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IF9kYXRhOworCXU4IGZhbl9jb25maWcgPSBkYXRhLT5mYW5fY29uZmlnW2NoYW5uZWxdOwogCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTFfZW5hYmxlLCBTX0lXVVNSIHwgU19JUlVHTywKLQkJZ2V0X3B3bV9lbmFibGUsIHNldF9wd21fZW5hYmxlLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMl9lbmFibGUsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQlnZXRfcHdtX2VuYWJsZSwgc2V0X3B3bV9lbmFibGUsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20zX2VuYWJsZSwgU19JV1VTUiB8IFNfSVJVR08sCi0JCWdldF9wd21fZW5hYmxlLCBzZXRfcHdtX2VuYWJsZSwgMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTRfZW5hYmxlLCBTX0lXVVNSIHwgU19JUlVHTywKLQkJZ2V0X3B3bV9lbmFibGUsIHNldF9wd21fZW5hYmxlLCAzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtNV9lbmFibGUsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQlnZXRfcHdtX2VuYWJsZSwgc2V0X3B3bV9lbmFibGUsIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd202X2VuYWJsZSwgU19JV1VTUiB8IFNfSVJVR08sCi0JCWdldF9wd21fZW5hYmxlLCBzZXRfcHdtX2VuYWJsZSwgNSk7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl9wd21faW5wdXQ6CisJY2FzZSBod21vbl9wd21fZW5hYmxlOgorCQlpZiAoIShmYW5fY29uZmlnICYgTUFYMzE3OTBfRkFOX0NGR19UQUNIX0lOUFVUKSkKKwkJCXJldHVybiBTX0lSVUdPIHwgU19JV1VTUjsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbWF4MzE3OTBfYXR0cnNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKK3N0YXRpYyBpbnQgbWF4MzE3OTBfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nICp2YWwpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9mYW46CisJCXJldHVybiBtYXgzMTc5MF9yZWFkX2ZhbihkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJY2FzZSBod21vbl9wd206CisJCXJldHVybiBtYXgzMTc5MF9yZWFkX3B3bShkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KIAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuM19mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNF9mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNV9mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNl9mYXVsdC5kZXZfYXR0ci5hdHRyLAorc3RhdGljIGludCBtYXgzMTc5MF93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyB2YWwpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9mYW46CisJCXJldHVybiBtYXgzMTc5MF93cml0ZV9mYW4oZGV2LCBhdHRyLCBjaGFubmVsLCB2YWwpOworCWNhc2UgaHdtb25fcHdtOgorCQlyZXR1cm4gbWF4MzE3OTBfd3JpdGVfcHdtKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQogCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW43X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW44X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW45X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4xMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMTFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjEyX2lucHV0LmRldl9hdHRyLmF0dHIsCitzdGF0aWMgdW1vZGVfdCBtYXgzMTc5MF9pc192aXNpYmxlKGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCQkgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9mYW46CisJCXJldHVybiBtYXgzMTc5MF9mYW5faXNfdmlzaWJsZShkYXRhLCBhdHRyLCBjaGFubmVsKTsKKwljYXNlIGh3bW9uX3B3bToKKwkJcmV0dXJuIG1heDMxNzkwX3B3bV9pc192aXNpYmxlKGRhdGEsIGF0dHIsIGNoYW5uZWwpOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KIAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuN19mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuOF9mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuOV9mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMTBfZmF1bHQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjExX2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4xMl9mYXVsdC5kZXZfYXR0ci5hdHRyLAorc3RhdGljIGNvbnN0IHUzMiBtYXgzMTc5MF9mYW5fY29uZmlnW10gPSB7CisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfVEFSR0VUIHwgSFdNT05fRl9GQVVMVCwKKwlIV01PTl9GX0lOUFVUIHwgSFdNT05fRl9UQVJHRVQgfCBIV01PTl9GX0ZBVUxULAorCUhXTU9OX0ZfSU5QVVQgfCBIV01PTl9GX1RBUkdFVCB8IEhXTU9OX0ZfRkFVTFQsCisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfVEFSR0VUIHwgSFdNT05fRl9GQVVMVCwKKwlIV01PTl9GX0lOUFVUIHwgSFdNT05fRl9UQVJHRVQgfCBIV01PTl9GX0ZBVUxULAorCUhXTU9OX0ZfSU5QVVQgfCBIV01PTl9GX1RBUkdFVCB8IEhXTU9OX0ZfRkFVTFQsCisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfRkFVTFQsCisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfRkFVTFQsCisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfRkFVTFQsCisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfRkFVTFQsCisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfRkFVTFQsCisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfRkFVTFQsCisJMAorfTsKIAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV90YXJnZXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfdGFyZ2V0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4zX3RhcmdldC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNF90YXJnZXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjVfdGFyZ2V0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW42X3RhcmdldC5kZXZfYXR0ci5hdHRyLAorc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbWF4MzE3OTBfZmFuID0geworCS50eXBlID0gaHdtb25fZmFuLAorCS5jb25maWcgPSBtYXgzMTc5MF9mYW5fY29uZmlnLAorfTsKIAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMi5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMy5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtNC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtNS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtNi5kZXZfYXR0ci5hdHRyLAorc3RhdGljIGNvbnN0IHUzMiBtYXgzMTc5MF9wd21fY29uZmlnW10gPSB7CisJSFdNT05fUFdNX0lOUFVUIHwgSFdNT05fUFdNX0VOQUJMRSwKKwlIV01PTl9QV01fSU5QVVQgfCBIV01PTl9QV01fRU5BQkxFLAorCUhXTU9OX1BXTV9JTlBVVCB8IEhXTU9OX1BXTV9FTkFCTEUsCisJSFdNT05fUFdNX0lOUFVUIHwgSFdNT05fUFdNX0VOQUJMRSwKKwlIV01PTl9QV01fSU5QVVQgfCBIV01PTl9QV01fRU5BQkxFLAorCUhXTU9OX1BXTV9JTlBVVCB8IEhXTU9OX1BXTV9FTkFCTEUsCisJMAorfTsKIAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMV9lbmFibGUuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTJfZW5hYmxlLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd20zX2VuYWJsZS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtNF9lbmFibGUuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTVfZW5hYmxlLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd202X2VuYWJsZS5kZXZfYXR0ci5hdHRyLAorc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbWF4MzE3OTBfcHdtID0geworCS50eXBlID0gaHdtb25fcHdtLAorCS5jb25maWcgPSBtYXgzMTc5MF9wd21fY29uZmlnLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gKm1heDMxNzkwX2luZm9bXSA9IHsKKwkmbWF4MzE3OTBfZmFuLAorCSZtYXgzMTc5MF9wd20sCiAJTlVMTAogfTsKIAotc3RhdGljIHVtb2RlX3QgbWF4MzE3OTBfYXR0cnNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmEsIGludCBuKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKLQlzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyID0KLQkJCWNvbnRhaW5lcl9vZihhLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSwgYXR0cik7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleCAlIE5SX0NIQU5ORUw7Ci0JdTggZmFuX2NvbmZpZzsKLQotCWZhbl9jb25maWcgPSBkYXRhLT5mYW5fY29uZmlnW2luZGV4XTsKLQotCWlmIChuID49IE5SX0NIQU5ORUwgKiAyICYmIG4gPCBOUl9DSEFOTkVMICogNCAmJgotCSAgICAhKGZhbl9jb25maWcgJiBNQVgzMTc5MF9GQU5fQ0ZHX1RBQ0hfSU5QVVQpKQotCQlyZXR1cm4gMDsKLQlpZiAobiA+PSBOUl9DSEFOTkVMICogNCAmJiAoZmFuX2NvbmZpZyAmIE1BWDMxNzkwX0ZBTl9DRkdfVEFDSF9JTlBVVCkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGEtPm1vZGU7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1heDMxNzkwX2dyb3VwID0gewotCS5hdHRycyA9IG1heDMxNzkwX2F0dHJzLAotCS5pc192aXNpYmxlID0gbWF4MzE3OTBfYXR0cnNfdmlzaWJsZSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fb3BzIG1heDMxNzkwX2h3bW9uX29wcyA9IHsKKwkuaXNfdmlzaWJsZSA9IG1heDMxNzkwX2lzX3Zpc2libGUsCisJLnJlYWQgPSBtYXgzMTc5MF9yZWFkLAorCS53cml0ZSA9IG1heDMxNzkwX3dyaXRlLAogfTsKLV9fQVRUUklCVVRFX0dST1VQUyhtYXgzMTc5MCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvIG1heDMxNzkwX2NoaXBfaW5mbyA9IHsKKwkub3BzID0gJm1heDMxNzkwX2h3bW9uX29wcywKKwkuaW5mbyA9IG1heDMxNzkwX2luZm8sCit9OwogCiBzdGF0aWMgaW50IG1heDMxNzkwX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJc3RydWN0IG1heDMxNzkwX2RhdGEgKmRhdGEpCkBAIC01NzUsOCArNTAwLDEwIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwKLQkJCWNsaWVudC0+bmFtZSwgZGF0YSwgbWF4MzE3OTBfZ3JvdXBzKTsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oZGV2LCBjbGllbnQtPm5hbWUsCisJCQkJCQkJIGRhdGEsCisJCQkJCQkJICZtYXgzMTc5MF9jaGlwX2luZm8sCisJCQkJCQkJIE5VTEwpOwogCiAJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21vbl9kZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9tYXg2NjUwLmMgYi9kcml2ZXJzL2h3bW9uL21heDY2NTAuYwppbmRleCAxNjJhNTIwLi5hOTkzYjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL21heDY2NTAuYworKysgYi9kcml2ZXJzL2h3bW9uL21heDY2NTAuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIAogLyoKICAqIEluc21vZCBwYXJhbWV0ZXJzCkBAIC00OCw3ICs0OSw3IEBACiBzdGF0aWMgaW50IGZhbl92b2x0YWdlOwogLyogcHJlc2NhbGVyOiBQb3NzaWJsZSB2YWx1ZXMgYXJlIDEsIDIsIDQsIDgsIDE2IG9yIDAgZm9yIGRvbid0IGNoYW5nZSAqLwogc3RhdGljIGludCBwcmVzY2FsZXI7Ci0vKiBjbG9jazogVGhlIGNsb2NrIGZyZXF1ZW5jeSBvZiB0aGUgY2hpcCB0aGUgZHJpdmVyIHNob3VsZCBhc3N1bWUgKi8KKy8qIGNsb2NrOiBUaGUgY2xvY2sgZnJlcXVlbmN5IG9mIHRoZSBjaGlwIChtYXg2NjUxIGNhbiBiZSBjbG9ja2VkIGV4dGVybmFsbHkpICovCiBzdGF0aWMgaW50IGNsb2NrID0gMjU0MDAwOwogCiBtb2R1bGVfcGFyYW0oZmFuX3ZvbHRhZ2UsIGludCwgU19JUlVHTyk7CkBAIC0xMzMsNiArMTM0LDE5IEBACiAJTUFYNjY1MF9SRUdfVEFDSDMsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtYXg2NjUwX2R0X21hdGNoW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJtYXhpbSxtYXg2NjUwIiwKKwkJLmRhdGEgPSAodm9pZCAqKTEKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAibWF4aW0sbWF4NjY1MSIsCisJCS5kYXRhID0gKHZvaWQgKik0CisJfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbWF4NjY1MF9kdF9tYXRjaCk7CisKIHN0YXRpYyBzdHJ1Y3QgbWF4NjY1MF9kYXRhICptYXg2NjUwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKQEAgLTE3MSw2ICsxODUsMzAgQEAKIAlyZXR1cm4gZGF0YTsKIH0KIAorLyoKKyAqIENoYW5nZSB0aGUgb3BlcmF0aW5nIG1vZGUgb2YgdGhlIGNoaXAgKGlmIG5lZWRlZCkuCisgKiBtb2RlIGlzIG9uZSBvZiB0aGUgTUFYNjY1MF9DRkdfTU9ERV8qIHZhbHVlcy4KKyAqLworc3RhdGljIGludCBtYXg2NjUwX3NldF9vcGVyYXRpbmdfbW9kZShzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhLCB1OCBtb2RlKQoreworCWludCByZXN1bHQ7CisJdTggY29uZmlnID0gZGF0YS0+Y29uZmlnOworCisJaWYgKG1vZGUgPT0gKGNvbmZpZyAmIE1BWDY2NTBfQ0ZHX01PREVfTUFTSykpCisJCXJldHVybiAwOworCisJY29uZmlnID0gKGNvbmZpZyAmIH5NQVg2NjUwX0NGR19NT0RFX01BU0spIHwgbW9kZTsKKworCXJlc3VsdCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBNQVg2NjUwX1JFR19DT05GSUcsCisJCQkJCSAgIGNvbmZpZyk7CisJaWYgKHJlc3VsdCA8IDApCisJCXJldHVybiByZXN1bHQ7CisKKwlkYXRhLT5jb25maWcgPSBjb25maWc7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHNzaXplX3QgZ2V0X2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAogCQkgICAgICAgY2hhciAqYnVmKQogewpAQCAtMjUyLDE4ICsyOTAsMTIgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcnBtKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2V0X3RhcmdldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAotCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIGludCBtYXg2NjUwX3NldF90YXJnZXQoc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSwgdW5zaWduZWQgbG9uZyBycG0pCiB7Ci0Jc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJaW50IGtzY2FsZSwga3RhY2g7Ci0JdW5zaWduZWQgbG9uZyBycG07Ci0JaW50IGVycjsKIAotCWVyciA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZycG0pOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJaWYgKHJwbSA9PSAwKQorCQlyZXR1cm4gbWF4NjY1MF9zZXRfb3BlcmF0aW5nX21vZGUoZGF0YSwgTUFYNjY1MF9DRkdfTU9ERV9PRkYpOwogCiAJcnBtID0gY2xhbXBfdmFsKHJwbSwgRkFOX1JQTV9NSU4sIEZBTl9SUE1fTUFYKTsKIApAQCAtMjc0LDggKzMwNiw2IEBACiAJICogICAgIEtUQUNIID0gWyhmQ0xLIHggS1NDQUxFKSAvICgyNTYgeCBGYW5TcGVlZCldIC0gMQogCSAqLwogCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCiAJa3NjYWxlID0gRElWX0ZST01fUkVHKGRhdGEtPmNvbmZpZyk7CiAJa3RhY2ggPSAoKGNsb2NrICoga3NjYWxlKSAvICgyNTYgKiBycG0gLyA2MCkpIC0gMTsKIAlpZiAoa3RhY2ggPCAwKQpAQCAtMjg0LDEwICszMTQsMzAgQEAKIAkJa3RhY2ggPSAyNTU7CiAJZGF0YS0+c3BlZWQgPSBrdGFjaDsKIAotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19TUEVFRCwgZGF0YS0+c3BlZWQpOworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgTUFYNjY1MF9SRUdfU1BFRUQsCisJCQkJCSBkYXRhLT5zcGVlZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF90YXJnZXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBycG07CisJaW50IGVycjsKKworCWVyciA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZycG0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwllcnIgPSBtYXg2NjUwX3NldF90YXJnZXQoZGF0YSwgcnBtKTsKIAogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTM0MSwxMiArMzkxLDExIEBACiAJCWRhdGEtPmRhYyA9IDE4MCAtICgxODAgKiBwd20pLzI1NTsKIAllbHNlCiAJCWRhdGEtPmRhYyA9IDc2IC0gKDc2ICogcHdtKS8yNTU7Ci0KLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjY1MF9SRUdfREFDLCBkYXRhLT5kYWMpOworCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19EQUMsIGRhdGEtPmRhYyk7CiAKIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAotCXJldHVybiBjb3VudDsKKwlyZXR1cm4gZXJyIDwgMCA/IGVyciA6IGNvdW50OwogfQogCiAvKgpAQCAtMzU1LDE0ICs0MDQsMTQgQEAKICAqIDAgPSBGYW4gYWx3YXlzIG9uCiAgKiAxID0gT3BlbiBsb29wLCBWb2x0YWdlIGlzIHNldCBhY2NvcmRpbmcgdG8gc3BlZWQsIG5vdCByZWd1bGF0ZWQuCiAgKiAyID0gQ2xvc2VkIGxvb3AsIFJQTSBmb3IgYWxsIGZhbnMgcmVndWxhdGVkIGJ5IGZhbjEgdGFjaG9tZXRlcgorICogMyA9IEZhbiBvZmYKICAqLwotCiBzdGF0aWMgc3NpemVfdCBnZXRfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCiAJCQkgIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gbWF4NjY1MF91cGRhdGVfZGV2aWNlKGRldik7CiAJaW50IG1vZGUgPSAoZGF0YS0+Y29uZmlnICYgTUFYNjY1MF9DRkdfTU9ERV9NQVNLKSA+PiA0OwotCWludCBzeXNmc19tb2Rlc1s0XSA9IHswLCAxLCAyLCAxfTsKKwlpbnQgc3lzZnNfbW9kZXNbNF0gPSB7MCwgMywgMiwgMX07CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3lzZnNfbW9kZXNbbW9kZV0pOwogfQpAQCAtMzcxLDI1ICs0MjAsMjUgQEAKIAkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7Ci0JaW50IG1heDY2NTBfbW9kZXNbM10gPSB7MCwgMywgMn07CiAJdW5zaWduZWQgbG9uZyBtb2RlOwogCWludCBlcnI7CisJY29uc3QgdTggbWF4NjY1MF9tb2Rlc1tdID0geworCQlNQVg2NjUwX0NGR19NT0RFX09OLAorCQlNQVg2NjUwX0NGR19NT0RFX09QRU5fTE9PUCwKKwkJTUFYNjY1MF9DRkdfTU9ERV9DTE9TRURfTE9PUCwKKwkJTUFYNjY1MF9DRkdfTU9ERV9PRkYsCisJCX07CiAKIAllcnIgPSBrc3RydG91bChidWYsIDEwLCAmbW9kZSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmIChtb2RlID4gMikKKwlpZiAobW9kZSA+PSBBUlJBWV9TSVpFKG1heDY2NTBfbW9kZXMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAotCWRhdGEtPmNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDY2NTBfUkVHX0NPTkZJRyk7Ci0JZGF0YS0+Y29uZmlnID0gKGRhdGEtPmNvbmZpZyAmIH5NQVg2NjUwX0NGR19NT0RFX01BU0spCi0JCSAgICAgICB8IChtYXg2NjUwX21vZGVzW21vZGVdIDw8IDQpOwotCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE1BWDY2NTBfUkVHX0NPTkZJRywgZGF0YS0+Y29uZmlnKTsKKwltYXg2NjUwX3NldF9vcGVyYXRpbmdfbW9kZShkYXRhLCBtYXg2NjUwX21vZGVzW21vZGVdKTsKIAogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCkBAIC01NjYsNiArNjE1LDE4IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OwogCWludCBjb25maWc7CiAJaW50IGVyciA9IC1FSU87CisJdTMyIHZvbHRhZ2U7CisJdTMyIHByZXNjYWxlOworCXUzMiB0YXJnZXRfcnBtOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgIm1heGltLGZhbi1taWNyb3ZvbHQiLAorCQkJCSAmdm9sdGFnZSkpCisJCXZvbHRhZ2UgPSBmYW5fdm9sdGFnZTsKKwllbHNlCisJCXZvbHRhZ2UgLz0gMTAwMDAwMDsgLyogTWljcm92b2x0cyB0byB2b2x0cyAqLworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUsICJtYXhpbSxmYW4tcHJlc2NhbGUiLAorCQkJCSAmcHJlc2NhbGUpKQorCQlwcmVzY2FsZSA9IHByZXNjYWxlcjsKIAogCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDY2NTBfUkVHX0NPTkZJRyk7CiAKQEAgLTU3NCw3ICs2MzUsNyBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXN3aXRjaCAoZmFuX3ZvbHRhZ2UpIHsKKwlzd2l0Y2ggKHZvbHRhZ2UpIHsKIAljYXNlIDA6CiAJCWJyZWFrOwogCWNhc2UgNToKQEAgLTU4NCwxNCArNjQ1LDEwIEBACiAJCWNvbmZpZyB8PSBNQVg2NjUwX0NGR19WMTI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGV2LCAiaWxsZWdhbCB2YWx1ZSBmb3IgZmFuX3ZvbHRhZ2UgKCVkKVxuIiwKLQkJCWZhbl92b2x0YWdlKTsKKwkJZGV2X2VycihkZXYsICJpbGxlZ2FsIHZhbHVlIGZvciBmYW5fdm9sdGFnZSAoJWQpXG4iLCB2b2x0YWdlKTsKIAl9CiAKLQlkZXZfaW5mbyhkZXYsICJGYW4gdm9sdGFnZSBpcyBzZXQgdG8gJWRWLlxuIiwKLQkJIChjb25maWcgJiBNQVg2NjUwX0NGR19WMTIpID8gMTIgOiA1KTsKLQotCXN3aXRjaCAocHJlc2NhbGVyKSB7CisJc3dpdGNoIChwcmVzY2FsZSkgewogCWNhc2UgMDoKIAkJYnJlYWs7CiAJY2FzZSAxOgpAQCAtNjE0LDI4ICs2NzEsMTMgQEAKIAkJCSB8IE1BWDY2NTBfQ0ZHX1BSRVNDQUxFUl8xNjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycihkZXYsICJpbGxlZ2FsIHZhbHVlIGZvciBwcmVzY2FsZXIgKCVkKVxuIiwgcHJlc2NhbGVyKTsKKwkJZGV2X2VycihkZXYsICJpbGxlZ2FsIHZhbHVlIGZvciBwcmVzY2FsZXIgKCVkKVxuIiwgcHJlc2NhbGUpOwogCX0KIAotCWRldl9pbmZvKGRldiwgIlByZXNjYWxlciBpcyBzZXQgdG8gJWQuXG4iLAorCWRldl9pbmZvKGRldiwgIkZhbiB2b2x0YWdlOiAlZFYsIHByZXNjYWxlcjogJWQuXG4iLAorCQkgKGNvbmZpZyAmIE1BWDY2NTBfQ0ZHX1YxMikgPyAxMiA6IDUsCiAJCSAxIDw8IChjb25maWcgJiBNQVg2NjUwX0NGR19QUkVTQ0FMRVJfTUFTSykpOwogCi0JLyoKLQkgKiBJZiBtb2RlIGlzIHNldCB0byAiZnVsbCBvZmYiLCB3ZSBjaGFuZ2UgaXQgdG8gIm9wZW4gbG9vcCIgYW5kCi0JICogc2V0IERBQyB0byAyNTUsIHdoaWNoIGhhcyB0aGUgc2FtZSBlZmZlY3QuIFdlIGRvIHRoaXMgYmVjYXVzZQotCSAqIHRoZXJlJ3Mgbm8gImZ1bGwgb2ZmIiBtb2RlIGRlZmluZWQgaW4gaHdtb24gc3BlY2lmaWNhdGlvbnMuCi0JICovCi0KLQlpZiAoKGNvbmZpZyAmIE1BWDY2NTBfQ0ZHX01PREVfTUFTSykgPT0gTUFYNjY1MF9DRkdfTU9ERV9PRkYpIHsKLQkJZGV2X2RiZyhkZXYsICJDaGFuZ2UgbW9kZSB0byBvcGVuIGxvb3AsIGZ1bGwgb2ZmLlxuIik7Ci0JCWNvbmZpZyA9IChjb25maWcgJiB+TUFYNjY1MF9DRkdfTU9ERV9NQVNLKQotCQkJIHwgTUFYNjY1MF9DRkdfTU9ERV9PUEVOX0xPT1A7Ci0JCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjY1MF9SRUdfREFDLCAyNTUpKSB7Ci0JCQlkZXZfZXJyKGRldiwgIkRBQyB3cml0ZSBlcnJvciwgYWJvcnRpbmcuXG4iKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQl9Ci0KIAlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE1BWDY2NTBfUkVHX0NPTkZJRywgY29uZmlnKSkgewogCQlkZXZfZXJyKGRldiwgIkNvbmZpZyB3cml0ZSBlcnJvciwgYWJvcnRpbmcuXG4iKTsKIAkJcmV0dXJuIGVycjsKQEAgLTY0NCw2ICs2ODYsMTIgQEAKIAlkYXRhLT5jb25maWcgPSBjb25maWc7CiAJZGF0YS0+Y291bnQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19DT1VOVCk7CiAKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKGNsaWVudC0+ZGV2Lm9mX25vZGUsICJtYXhpbSxmYW4tdGFyZ2V0LXJwbSIsCisJCQkJICAmdGFyZ2V0X3JwbSkpIHsKKwkJbWF4NjY1MF9zZXRfdGFyZ2V0KGRhdGEsIHRhcmdldF9ycG0pOworCQltYXg2NjUwX3NldF9vcGVyYXRpbmdfbW9kZShkYXRhLCBNQVg2NjUwX0NGR19NT0RFX0NMT1NFRF9MT09QKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjUxLDYgKzY5OSw4IEBACiAJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZCA9CisJCW9mX21hdGNoX2RldmljZShvZl9tYXRjaF9wdHIobWF4NjY1MF9kdF9tYXRjaCksIGRldik7CiAJc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiAJaW50IGVycjsKQEAgLTY2MSw3ICs3MTEsNyBAQAogCiAJZGF0YS0+Y2xpZW50ID0gY2xpZW50OwogCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlkYXRhLT5ucl9mYW5zID0gaWQtPmRyaXZlcl9kYXRhOworCWRhdGEtPm5yX2ZhbnMgPSBvZl9pZCA/IChpbnQpKHVpbnRwdHJfdClvZl9pZC0+ZGF0YSA6IGlkLT5kcml2ZXJfZGF0YTsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgbWF4NjY1MCBjaGlwCkBAIC02OTEsNiArNzQxLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtYXg2NjUwX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJtYXg2NjUwIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKG1heDY2NTBfZHRfbWF0Y2gpLAogCX0sCiAJLnByb2JlCQk9IG1heDY2NTBfcHJvYmUsCiAJLmlkX3RhYmxlCT0gbWF4NjY1MF9pZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbmN0Njc3NS5jIGIvZHJpdmVycy9od21vbi9uY3Q2Nzc1LmMKaW5kZXggZDA4N2E4ZS4uY2U3NWRkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9uY3Q2Nzc1LmMKKysrIGIvZHJpdmVycy9od21vbi9uY3Q2Nzc1LmMKQEAgLTE5NSw2ICsxOTUsOCBAQAogCiAjZGVmaW5lIE5VTV9GQU4JCTYKIAorI2RlZmluZSBURU1QX1NPVVJDRV9WSVJUVUFMCTB4MWYKKwogLyogQ29tbW9uIGFuZCBOQ1Q2Nzc1IHNwZWNpZmljIGRhdGEgKi8KIAogLyogVm9sdGFnZSBtaW4vbWF4IHJlZ2lzdGVycyBmb3IgbnI9Ny4uMTQgYXJlIGluIGJhbmsgNSAqLwpAQCAtMzk0MCw3ICszOTQyLDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCXNyYyA9IG5jdDY3NzVfcmVhZF92YWx1ZShkYXRhLCBkYXRhLT5SRUdfVEVNUF9TRUxbaV0pICYgMHgxZjsKLQkJaWYgKCFzcmMgfHwgKG1hc2sgJiAoMSA8PCBzcmMpKSkKKwkJaWYgKCFzcmMpCiAJCQljb250aW51ZTsKIAogCQlpZiAoc3JjID49IGRhdGEtPnRlbXBfbGFiZWxfbnVtIHx8CkBAIC0zOTUyLDcgKzM5NTQsMTYgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJbWFzayB8PSAxIDw8IHNyYzsKKwkJLyoKKwkJICogRm9yIHZpcnR1YWwgdGVtcGVyYXR1cmUgc291cmNlcywgdGhlICd2aXJ0dWFsJyB0ZW1wZXJhdHVyZQorCQkgKiBmb3IgZWFjaCBmYW4gcmVmbGVjdHMgYSBkaWZmZXJlbnQgdGVtcGVyYXR1cmUsIGFuZCB0aGVyZQorCQkgKiBhcmUgbm8gZHVwbGljYXRlcy4KKwkJICovCisJCWlmIChzcmMgIT0gVEVNUF9TT1VSQ0VfVklSVFVBTCkgeworCQkJaWYgKG1hc2sgJiAoMSA8PCBzcmMpKQorCQkJCWNvbnRpbnVlOworCQkJbWFzayB8PSAxIDw8IHNyYzsKKwkJfQogCiAJCS8qIFVzZSBmaXhlZCBpbmRleCBmb3IgU1lTVElOKDEpLCBDUFVUSU4oMiksIEFVWFRJTigzKSAqLwogCQlpZiAoc3JjIDw9IGRhdGEtPnRlbXBfZml4ZWRfbnVtKSB7CkBAIC00MjMyLDExICs0MjQzLDExIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmIChmb3JjZV9pZCkKKwl2YWwgPSAoc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19ERVZJRCkgPDwgOCkgfAorCQlzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9fUkVHX0RFVklEICsgMSk7CisJaWYgKGZvcmNlX2lkICYmIHZhbCAhPSAweGZmZmYpCiAJCXZhbCA9IGZvcmNlX2lkOwotCWVsc2UKLQkJdmFsID0gKHN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfREVWSUQpIDw8IDgpCi0JCSAgICB8IHN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfREVWSUQgKyAxKTsKKwogCXN3aXRjaCAodmFsICYgU0lPX0lEX01BU0spIHsKIAljYXNlIFNJT19OQ1Q2MTA2X0lEOgogCQlzaW9fZGF0YS0+a2luZCA9IG5jdDYxMDY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL25jdDc5MDQuYyBiL2RyaXZlcnMvaHdtb24vbmN0NzkwNC5jCmluZGV4IDA4ZmY4OWQuLjk1YTY4YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbmN0NzkwNC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbmN0NzkwNC5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi5oPgotI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CiAKICNkZWZpbmUgVkVORE9SX0lEX1JFRwkJMHg3QQkvKiBBbnkgYmFuayAqLwogI2RlZmluZSBOVVZPVE9OX0lECQkweDUwCkBAIC0xNTMsMzQxICsxNTIsMjMwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogRkFOSU4gQVRUUiAqLwotc3RhdGljIHNzaXplX3Qgc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LAotCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgbmN0NzkwNF9yZWFkX2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICBsb25nICp2YWwpCiB7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IGNudCwgcnBtOwogCWludCByZXQ7Ci0JdW5zaWduZWQgY250LCBycG07CiAKLQlyZXQgPSBuY3Q3OTA0X3JlYWRfcmVnMTYoZGF0YSwgQkFOS18wLCBGQU5JTjFfSFZfUkVHICsgaW5kZXggKiAyKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQljbnQgPSAoKHJldCAmIDB4ZmYwMCkgPj4gMykgfCAocmV0ICYgMHgxZik7Ci0JaWYgKGNudCA9PSAweDFmZmYpCi0JCXJwbSA9IDA7Ci0JZWxzZQotCQlycG0gPSAxMzUwMDAwIC8gY250OwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBycG0pOworCXN3aXRjaChhdHRyKSB7CisJY2FzZSBod21vbl9mYW5faW5wdXQ6CisJCXJldCA9IG5jdDc5MDRfcmVhZF9yZWcxNihkYXRhLCBCQU5LXzAsCisJCQkJCSBGQU5JTjFfSFZfUkVHICsgY2hhbm5lbCAqIDIpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWNudCA9ICgocmV0ICYgMHhmZjAwKSA+PiAzKSB8IChyZXQgJiAweDFmKTsKKwkJaWYgKGNudCA9PSAweDFmZmYpCisJCQlycG0gPSAwOworCQllbHNlCisJCQlycG0gPSAxMzUwMDAwIC8gY250OworCQkqdmFsID0gcnBtOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogfQogCi1zdGF0aWMgdW1vZGVfdCBuY3Q3OTA0X2ZhbmluX2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJCXN0cnVjdCBhdHRyaWJ1dGUgKmEsIGludCBuKQorc3RhdGljIHVtb2RlX3QgbmN0NzkwNF9mYW5faXNfdmlzaWJsZShjb25zdCB2b2lkICpfZGF0YSwgdTMyIGF0dHIsIGludCBjaGFubmVsKQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKLQlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJY29uc3Qgc3RydWN0IG5jdDc5MDRfZGF0YSAqZGF0YSA9IF9kYXRhOwogCi0JaWYgKGRhdGEtPmZhbmluX21hc2sgJiAoMSA8PCBuKSkKLQkJcmV0dXJuIGEtPm1vZGU7CisJaWYgKGF0dHIgPT0gaHdtb25fZmFuX2lucHV0ICYmIGRhdGEtPmZhbmluX21hc2sgJiAoMSA8PCBjaGFubmVsKSkKKwkJcmV0dXJuIFNfSVJVR087CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMV9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjNfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNF9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW41X2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjZfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCA1KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuN19pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDYpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW44X2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgNyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjlfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCA4KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMTBfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCA5KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMTFfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAxMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjEyX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMTEpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbmN0NzkwNF9mYW5pbl9hdHRyc1tdID0gewotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuM19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuN19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuOF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuOV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMTBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjExX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4xMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCU5VTEwKK3N0YXRpYyB1OCBuY3Q3OTA0X2NoYW5fdG9faW5kZXhbXSA9IHsKKwkwLAkvKiBOb3QgdXNlZCAqLworCTAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisJMTgsIDE5LCAyMCwgMTYKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG5jdDc5MDRfZmFuaW5fZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbmN0NzkwNF9mYW5pbl9hdHRycywKLQkuaXNfdmlzaWJsZSA9IG5jdDc5MDRfZmFuaW5faXNfdmlzaWJsZSwKLX07Ci0KLS8qIFZTRU4gQVRUUiAqLwotc3RhdGljIHNzaXplX3Qgc2hvd192b2x0YWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQorc3RhdGljIGludCBuY3Q3OTA0X3JlYWRfaW4oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICBsb25nICp2YWwpCiB7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHJldDsKLQlpbnQgdm9sdDsKKwlpbnQgcmV0LCB2b2x0LCBpbmRleDsKIAotCXJldCA9IG5jdDc5MDRfcmVhZF9yZWcxNihkYXRhLCBCQU5LXzAsIFZTRU4xX0hWX1JFRyArIGluZGV4ICogMik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0Jdm9sdCA9ICgocmV0ICYgMHhmZjAwKSA+PiA1KSB8IChyZXQgJiAweDcpOwotCWlmIChpbmRleCA8IDE0KQotCQl2b2x0ICo9IDI7IC8qIDAuMDAyViBzY2FsZSAqLwotCWVsc2UKLQkJdm9sdCAqPSA2OyAvKiAwLjAwNlYgc2NhbGUgKi8KKwlpbmRleCA9IG5jdDc5MDRfY2hhbl90b19pbmRleFtjaGFubmVsXTsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2b2x0KTsKKwlzd2l0Y2goYXR0cikgeworCWNhc2UgaHdtb25faW5faW5wdXQ6CisJCXJldCA9IG5jdDc5MDRfcmVhZF9yZWcxNihkYXRhLCBCQU5LXzAsCisJCQkJCSBWU0VOMV9IVl9SRUcgKyBpbmRleCAqIDIpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXZvbHQgPSAoKHJldCAmIDB4ZmYwMCkgPj4gNSkgfCAocmV0ICYgMHg3KTsKKwkJaWYgKGluZGV4IDwgMTQpCisJCQl2b2x0ICo9IDI7IC8qIDAuMDAyViBzY2FsZSAqLworCQllbHNlCisJCQl2b2x0ICo9IDY7IC8qIDAuMDA2ViBzY2FsZSAqLworCQkqdmFsID0gdm9sdDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19sdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCitzdGF0aWMgdW1vZGVfdCBuY3Q3OTA0X2luX2lzX3Zpc2libGUoY29uc3Qgdm9pZCAqX2RhdGEsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKIHsKLQlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHJldDsKLQlpbnQgdGVtcDsKKwljb25zdCBzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gX2RhdGE7CisJaW50IGluZGV4ID0gbmN0NzkwNF9jaGFuX3RvX2luZGV4W2NoYW5uZWxdOwogCi0JcmV0ID0gbmN0NzkwNF9yZWFkX3JlZzE2KGRhdGEsIEJBTktfMCwgTFREX0hWX1JFRyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JdGVtcCA9ICgocmV0ICYgMHhmZjAwKSA+PiA1KSB8IChyZXQgJiAweDcpOwotCXRlbXAgPSBzaWduX2V4dGVuZDMyKHRlbXAsIDEwKSAqIDEyNTsKKwlpZiAoY2hhbm5lbCA+IDAgJiYgYXR0ciA9PSBod21vbl9pbl9pbnB1dCAmJgorCSAgICAoZGF0YS0+dnNlbl9tYXNrICYgQklUKGluZGV4KSkpCisJCXJldHVybiBTX0lSVUdPOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXApOwotfQotCi1zdGF0aWMgdW1vZGVfdCBuY3Q3OTA0X3ZzZW5faXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYSwgaW50IG4pCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOwotCXN0cnVjdCBuY3Q3OTA0X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCWlmIChkYXRhLT52c2VuX21hc2sgJiAoMSA8PCBuKSkKLQkJcmV0dXJuIGEtPm1vZGU7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluM19pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW40X2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjVfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNl9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCA1KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW43X2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDYpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjhfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgNyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluOV9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCA4KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xMF9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCA5KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xMV9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAxMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTJfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgMTEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjEzX2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDEyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xNF9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAxMyk7Ci0vKgotICogTmV4dCAzIHZvbHRhZ2Ugc2Vuc29ycyBoYXZlIHNwZWNpZmljIG5hbWVzIGluIHRoZSBOdXZvdG9uIGRvYwotICogKDNWREQsIFZCQVQsIDNWU0IpIGJ1dCB3ZSB1c2UgdmFjYW50IG51bWJlcnMgZm9yIHRoZW0uCi0gKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xNV9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAxNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTZfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgMTUpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjIwX2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDE2KTsKLS8qIFRoaXMgaXMgbm90IGEgdm9sdGFnZSwgYnV0IGEgbG9jYWwgdGVtcGVyYXR1cmUgc2Vuc29yLiAqLwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd19sdGVtcCwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTdfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgMTgpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjE4X2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDE5KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xOV9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAyMCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpuY3Q3OTA0X3ZzZW5fYXR0cnNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX2luMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW41X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luN19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW44X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjlfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMTBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMTFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMTJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMTNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMTRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMTVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMTZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMjBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjE3X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjE4X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjE5X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbmN0NzkwNF92c2VuX2dyb3VwID0gewotCS5hdHRycyA9IG5jdDc5MDRfdnNlbl9hdHRycywKLQkuaXNfdmlzaWJsZSA9IG5jdDc5MDRfdnNlbl9pc192aXNpYmxlLAotfTsKLQotLyogQ1BVX1RFTVAgQVRUUiAqLwotc3RhdGljIHNzaXplX3Qgc2hvd190Y3B1KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQorc3RhdGljIGludCBuY3Q3OTA0X3JlYWRfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgbG9uZyAqdmFsKQogewotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CiAJc3RydWN0IG5jdDc5MDRfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCByZXQ7Ci0JaW50IHRlbXA7CisJaW50IHJldCwgdGVtcDsKIAotCXJldCA9IG5jdDc5MDRfcmVhZF9yZWcxNihkYXRhLCBCQU5LXzAsIFRfQ1BVMV9IVl9SRUcgKyBpbmRleCAqIDIpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JdGVtcCA9ICgocmV0ICYgMHhmZjAwKSA+PiA1KSB8IChyZXQgJiAweDcpOwotCXRlbXAgPSBzaWduX2V4dGVuZDMyKHRlbXAsIDEwKSAqIDEyNTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCk7CisJc3dpdGNoKGF0dHIpIHsKKwljYXNlIGh3bW9uX3RlbXBfaW5wdXQ6CisJCWlmIChjaGFubmVsID09IDApCisJCQlyZXQgPSBuY3Q3OTA0X3JlYWRfcmVnMTYoZGF0YSwgQkFOS18wLCBMVERfSFZfUkVHKTsKKwkJZWxzZQorCQkJcmV0ID0gbmN0NzkwNF9yZWFkX3JlZzE2KGRhdGEsIEJBTktfMCwKKwkJCQkJVF9DUFUxX0hWX1JFRyArIChjaGFubmVsIC0gMSkgKiAyKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQl0ZW1wID0gKChyZXQgJiAweGZmMDApID4+IDUpIHwgKHJldCAmIDB4Nyk7CisJCSp2YWwgPSBzaWduX2V4dGVuZDMyKHRlbXAsIDEwKSAqIDEyNTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHVtb2RlX3QgbmN0NzkwNF90Y3B1X2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJICAgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmEsIGludCBuKQorc3RhdGljIHVtb2RlX3QgbmN0NzkwNF90ZW1wX2lzX3Zpc2libGUoY29uc3Qgdm9pZCAqX2RhdGEsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7Ci0Jc3RydWN0IG5jdDc5MDRfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWNvbnN0IHN0cnVjdCBuY3Q3OTA0X2RhdGEgKmRhdGEgPSBfZGF0YTsKIAotCWlmIChkYXRhLT50Y3B1X21hc2sgJiAoMSA8PCBuKSkKLQkJcmV0dXJuIGEtPm1vZGU7CisJaWYgKGF0dHIgPT0gaHdtb25fdGVtcF9pbnB1dCkgeworCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoZGF0YS0+dnNlbl9tYXNrICYgQklUKDE3KSkKKwkJCQlyZXR1cm4gU19JUlVHTzsKKwkJfSBlbHNlIHsKKwkJCWlmIChkYXRhLT50Y3B1X21hc2sgJiBCSVQoY2hhbm5lbCAtIDEpKQorCQkJCXJldHVybiBTX0lSVUdPOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKLS8qICJ0ZW1wMV9pbnB1dCIgcmVzZXJ2ZWQgZm9yIGxvY2FsIHRlbXAgKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfdGNwdSwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2lucHV0LCBTX0lSVUdPLCBzaG93X3RjcHUsIE5VTEwsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNF9pbnB1dCwgU19JUlVHTywgc2hvd190Y3B1LCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDVfaW5wdXQsIFNfSVJVR08sIHNob3dfdGNwdSwgTlVMTCwgMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA2X2lucHV0LCBTX0lSVUdPLCBzaG93X3RjcHUsIE5VTEwsIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wN19pbnB1dCwgU19JUlVHTywgc2hvd190Y3B1LCBOVUxMLCA1KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDhfaW5wdXQsIFNfSVJVR08sIHNob3dfdGNwdSwgTlVMTCwgNik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA5X2lucHV0LCBTX0lSVUdPLCBzaG93X3RjcHUsIE5VTEwsIDcpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbmN0NzkwNF90Y3B1X2F0dHJzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA3X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wOF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDlfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBuY3Q3OTA0X3RjcHVfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbmN0NzkwNF90Y3B1X2F0dHJzLAotCS5pc192aXNpYmxlID0gbmN0NzkwNF90Y3B1X2lzX3Zpc2libGUsCi19OwotCi0vKiBQV00gQVRUUiAqLwotc3RhdGljIHNzaXplX3Qgc3RvcmVfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgaW50IG5jdDc5MDRfcmVhZF9wd20oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICAgbG9uZyAqdmFsKQogewotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CiAJc3RydWN0IG5jdDc5MDRfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXVuc2lnbmVkIGxvbmcgdmFsOwogCWludCByZXQ7CiAKLQlpZiAoa3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodmFsID4gMjU1KQotCQlyZXR1cm4gLUVJTlZBTDsKKwlzd2l0Y2goYXR0cikgeworCWNhc2UgaHdtb25fcHdtX2lucHV0OgorCQlyZXQgPSBuY3Q3OTA0X3JlYWRfcmVnKGRhdGEsIEJBTktfMywgRkFOQ1RMMV9PVVRfUkVHICsgY2hhbm5lbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9IHJldDsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl9wd21fZW5hYmxlOgorCQlyZXQgPSBuY3Q3OTA0X3JlYWRfcmVnKGRhdGEsIEJBTktfMywgRkFOQ1RMMV9GTVJfUkVHICsgY2hhbm5lbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAotCXJldCA9IG5jdDc5MDRfd3JpdGVfcmVnKGRhdGEsIEJBTktfMywgRkFOQ1RMMV9PVVRfUkVHICsgaW5kZXgsIHZhbCk7Ci0KLQlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7CisJCSp2YWwgPSByZXQgPyAyIDogMTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19wd20oc3RydWN0IGRldmljZSAqZGV2LAotCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgbmN0NzkwNF93cml0ZV9wd20oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICAgIGxvbmcgdmFsKQogewotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CiAJc3RydWN0IG5jdDc5MDRfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCB2YWw7Ci0KLQl2YWwgPSBuY3Q3OTA0X3JlYWRfcmVnKGRhdGEsIEJBTktfMywgRkFOQ1RMMV9PVVRfUkVHICsgaW5kZXgpOwotCWlmICh2YWwgPCAwKQotCQlyZXR1cm4gdmFsOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKLQlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JdW5zaWduZWQgbG9uZyB2YWw7CiAJaW50IHJldDsKIAotCWlmIChrc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh2YWwgPCAxIHx8IHZhbCA+IDIgfHwgKHZhbCA9PSAyICYmICFkYXRhLT5mYW5fbW9kZVtpbmRleF0pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IG5jdDc5MDRfd3JpdGVfcmVnKGRhdGEsIEJBTktfMywgRkFOQ1RMMV9GTVJfUkVHICsgaW5kZXgsCi0JCQkJdmFsID09IDIgPyBkYXRhLT5mYW5fbW9kZVtpbmRleF0gOiAwKTsKLQotCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKKwlzd2l0Y2goYXR0cikgeworCWNhc2UgaHdtb25fcHdtX2lucHV0OgorCQlpZiAodmFsIDwgMCB8fCB2YWwgPiAyNTUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0ID0gbmN0NzkwNF93cml0ZV9yZWcoZGF0YSwgQkFOS18zLCBGQU5DVEwxX09VVF9SRUcgKyBjaGFubmVsLAorCQkJCQl2YWwpOworCQlyZXR1cm4gcmV0OworCWNhc2UgaHdtb25fcHdtX2VuYWJsZToKKwkJaWYgKHZhbCA8IDEgfHwgdmFsID4gMiB8fAorCQkgICAgKHZhbCA9PSAyICYmICFkYXRhLT5mYW5fbW9kZVtjaGFubmVsXSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0ID0gbmN0NzkwNF93cml0ZV9yZWcoZGF0YSwgQkFOS18zLCBGQU5DVEwxX0ZNUl9SRUcgKyBjaGFubmVsLAorCQkJCQl2YWwgPT0gMiA/IGRhdGEtPmZhbl9tb2RlW2NoYW5uZWxdIDogMCk7CisJCXJldHVybiByZXQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotLyogUmV0dXJuIDEgZm9yIG1hbnVhbCBtb2RlIG9yIDIgZm9yIFNtYXJ0RmFuIG1vZGUgKi8KLXN0YXRpYyBzc2l6ZV90IHNob3dfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCitzdGF0aWMgdW1vZGVfdCBuY3Q3OTA0X3B3bV9pc192aXNpYmxlKGNvbnN0IHZvaWQgKl9kYXRhLCB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCiB7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKLQlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHZhbDsKLQotCXZhbCA9IG5jdDc5MDRfcmVhZF9yZWcoZGF0YSwgQkFOS18zLCBGQU5DVEwxX0ZNUl9SRUcgKyBpbmRleCk7Ci0JaWYgKHZhbCA8IDApCi0JCXJldHVybiB2YWw7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsID8gMiA6IDEpOworCXN3aXRjaChhdHRyKSB7CisJY2FzZSBod21vbl9wd21faW5wdXQ6CisJY2FzZSBod21vbl9wd21fZW5hYmxlOgorCQlyZXR1cm4gU19JUlVHTyB8IFNfSVdVU1I7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQogfQogCi0vKiAyIGF0dHJpYnV0ZXMgcGVyIGNoYW5uZWw6IHB3bSBhbmQgbW9kZSAqLwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20xLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJCXNob3dfcHdtLCBzdG9yZV9wd20sIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20xX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCQlzaG93X2VuYWJsZSwgc3RvcmVfZW5hYmxlLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMiwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCQlzaG93X3B3bSwgc3RvcmVfcHdtLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMl9lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkJc2hvd19lbmFibGUsIHN0b3JlX2VuYWJsZSwgMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTMsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkJc2hvd19wd20sIHN0b3JlX3B3bSwgMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTNfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJCXNob3dfZW5hYmxlLCBzdG9yZV9lbmFibGUsIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd200LCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJCXNob3dfcHdtLCBzdG9yZV9wd20sIDMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd200X2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCQlzaG93X2VuYWJsZSwgc3RvcmVfZW5hYmxlLCAzKTsKK3N0YXRpYyBpbnQgbmN0NzkwNF9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCXUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyAqdmFsKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgaHdtb25faW46CisJCXJldHVybiBuY3Q3OTA0X3JlYWRfaW4oZGV2LCBhdHRyLCBjaGFubmVsLCB2YWwpOworCWNhc2UgaHdtb25fZmFuOgorCQlyZXR1cm4gbmN0NzkwNF9yZWFkX2ZhbihkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJY2FzZSBod21vbl9wd206CisJCXJldHVybiBuY3Q3OTA0X3JlYWRfcHdtKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwljYXNlIGh3bW9uX3RlbXA6CisJCXJldHVybiBuY3Q3OTA0X3JlYWRfdGVtcChkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KIAotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm5jdDc5MDRfZmFuY3RsX2F0dHJzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl9wd20xLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd20xX2VuYWJsZS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMi5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMl9lbmFibGUuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTMuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTNfZW5hYmxlLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd200LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd200X2VuYWJsZS5kZXZfYXR0ci5hdHRyLAotCU5VTEwKLX07CitzdGF0aWMgaW50IG5jdDc5MDRfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyB2YWwpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9wd206CisJCXJldHVybiBuY3Q3OTA0X3dyaXRlX3B3bShkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbmN0NzkwNF9mYW5jdGxfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbmN0NzkwNF9mYW5jdGxfYXR0cnMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqbmN0NzkwNF9ncm91cHNbXSA9IHsKLQkmbmN0NzkwNF9mYW5pbl9ncm91cCwKLQkmbmN0NzkwNF92c2VuX2dyb3VwLAotCSZuY3Q3OTA0X3RjcHVfZ3JvdXAsCi0JJm5jdDc5MDRfZmFuY3RsX2dyb3VwLAotCU5VTEwKLX07CitzdGF0aWMgdW1vZGVfdCBuY3Q3OTA0X2lzX3Zpc2libGUoY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkJICB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9pbjoKKwkJcmV0dXJuIG5jdDc5MDRfaW5faXNfdmlzaWJsZShkYXRhLCBhdHRyLCBjaGFubmVsKTsKKwljYXNlIGh3bW9uX2ZhbjoKKwkJcmV0dXJuIG5jdDc5MDRfZmFuX2lzX3Zpc2libGUoZGF0YSwgYXR0ciwgY2hhbm5lbCk7CisJY2FzZSBod21vbl9wd206CisJCXJldHVybiBuY3Q3OTA0X3B3bV9pc192aXNpYmxlKGRhdGEsIGF0dHIsIGNoYW5uZWwpOworCWNhc2UgaHdtb25fdGVtcDoKKwkJcmV0dXJuIG5jdDc5MDRfdGVtcF9pc192aXNpYmxlKGRhdGEsIGF0dHIsIGNoYW5uZWwpOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KIAogLyogUmV0dXJuIDAgaWYgZGV0ZWN0aW9uIGlzIHN1Y2Nlc3NmdWwsIC1FTk9ERVYgb3RoZXJ3aXNlICovCiBzdGF0aWMgaW50IG5jdDc5MDRfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCkBAIC01MTIsNiArNDAwLDEwMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3QgdTMyIG5jdDc5MDRfaW5fY29uZmlnW10gPSB7CisJSFdNT05fSV9JTlBVVCwgICAgICAgICAgICAgICAgICAvKiBkdW1teSwgc2tpcHBlZCBpbiBpc192aXNpYmxlICovCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIG5jdDc5MDRfaW4gPSB7CisJLnR5cGUgPSBod21vbl9pbiwKKwkuY29uZmlnID0gbmN0NzkwNF9pbl9jb25maWcsCit9OworCitzdGF0aWMgY29uc3QgdTMyIG5jdDc5MDRfZmFuX2NvbmZpZ1tdID0geworICAgICAgICAgICAgSFdNT05fRl9JTlBVVCwKKyAgICAgICAgICAgIEhXTU9OX0ZfSU5QVVQsCisgICAgICAgICAgICBIV01PTl9GX0lOUFVULAorICAgICAgICAgICAgSFdNT05fRl9JTlBVVCwKKyAgICAgICAgICAgIEhXTU9OX0ZfSU5QVVQsCisgICAgICAgICAgICBIV01PTl9GX0lOUFVULAorICAgICAgICAgICAgSFdNT05fRl9JTlBVVCwKKyAgICAgICAgICAgIEhXTU9OX0ZfSU5QVVQsCisJICAgIDAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIG5jdDc5MDRfZmFuID0geworCS50eXBlID0gaHdtb25fZmFuLAorCS5jb25maWcgPSBuY3Q3OTA0X2Zhbl9jb25maWcsCit9OworCitzdGF0aWMgY29uc3QgdTMyIG5jdDc5MDRfcHdtX2NvbmZpZ1tdID0geworICAgICAgICAgICAgSFdNT05fUFdNX0lOUFVUIHwgSFdNT05fUFdNX0VOQUJMRSwKKyAgICAgICAgICAgIEhXTU9OX1BXTV9JTlBVVCB8IEhXTU9OX1BXTV9FTkFCTEUsCisgICAgICAgICAgICBIV01PTl9QV01fSU5QVVQgfCBIV01PTl9QV01fRU5BQkxFLAorICAgICAgICAgICAgSFdNT05fUFdNX0lOUFVUIHwgSFdNT05fUFdNX0VOQUJMRSwKKwkgICAgMAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbmN0NzkwNF9wd20gPSB7CisJLnR5cGUgPSBod21vbl9wd20sCisJLmNvbmZpZyA9IG5jdDc5MDRfcHdtX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCB1MzIgbmN0NzkwNF90ZW1wX2NvbmZpZ1tdID0geworICAgICAgICAgICAgSFdNT05fVF9JTlBVVCwKKyAgICAgICAgICAgIEhXTU9OX1RfSU5QVVQsCisgICAgICAgICAgICBIV01PTl9UX0lOUFVULAorICAgICAgICAgICAgSFdNT05fVF9JTlBVVCwKKyAgICAgICAgICAgIEhXTU9OX1RfSU5QVVQsCisgICAgICAgICAgICBIV01PTl9UX0lOUFVULAorICAgICAgICAgICAgSFdNT05fVF9JTlBVVCwKKyAgICAgICAgICAgIEhXTU9OX1RfSU5QVVQsCisgICAgICAgICAgICBIV01PTl9UX0lOUFVULAorCSAgICAwCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyBuY3Q3OTA0X3RlbXAgPSB7CisJLnR5cGUgPSBod21vbl90ZW1wLAorCS5jb25maWcgPSBuY3Q3OTA0X3RlbXBfY29uZmlnLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gKm5jdDc5MDRfaW5mb1tdID0geworCSZuY3Q3OTA0X2luLAorCSZuY3Q3OTA0X2ZhbiwKKwkmbmN0NzkwNF9wd20sCisJJm5jdDc5MDRfdGVtcCwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX29wcyBuY3Q3OTA0X2h3bW9uX29wcyA9IHsKKwkuaXNfdmlzaWJsZSA9IG5jdDc5MDRfaXNfdmlzaWJsZSwKKwkucmVhZCA9IG5jdDc5MDRfcmVhZCwKKwkud3JpdGUgPSBuY3Q3OTA0X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gbmN0NzkwNF9jaGlwX2luZm8gPSB7CisJLm9wcyA9ICZuY3Q3OTA0X2h3bW9uX29wcywKKwkuaW5mbyA9IG5jdDc5MDRfaW5mbywKK307CisKIHN0YXRpYyBpbnQgbmN0NzkwNF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKQEAgLTU2Niw4ICs1NTEsOCBAQAogCX0KIAogCWh3bW9uX2RldiA9Ci0JCWRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgY2xpZW50LT5uYW1lLCBkYXRhLAotCQkJCQkJICAgICAgIG5jdDc5MDRfZ3JvdXBzKTsKKwkJZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKGRldiwgY2xpZW50LT5uYW1lLCBkYXRhLAorCQkJCQkJICAgICAmbmN0NzkwNF9jaGlwX2luZm8sIE5VTEwpOwogCXJldHVybiBQVFJfRVJSX09SX1pFUk8oaHdtb25fZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9udGNfdGhlcm1pc3Rvci5jIGIvZHJpdmVycy9od21vbi9udGNfdGhlcm1pc3Rvci5jCmluZGV4IDhlZjdiNzEuLmM1MmQwN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbnRjX3RoZXJtaXN0b3IuYworKysgYi9kcml2ZXJzL2h3bW9uL250Y190aGVybWlzdG9yLmMKQEAgLTI1MywxMiArMjUzLDkgQEAKIH07CiAKIHN0cnVjdCBudGNfZGF0YSB7Ci0Jc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwogCXN0cnVjdCBudGNfdGhlcm1pc3Rvcl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAljb25zdCBzdHJ1Y3QgbnRjX2NvbXBlbnNhdGlvbiAqY29tcDsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJaW50IG5fY29tcDsKLQljaGFyIG5hbWVbUExBVEZPUk1fTkFNRV9TSVpFXTsKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19PRikgJiYgSVNfRU5BQkxFRChDT05GSUdfSUlPKQpAQCAtMzE2LDIyICszMTMsMjIgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG50Y19tYXRjaCk7CiAKIHN0YXRpYyBzdHJ1Y3QgbnRjX3RoZXJtaXN0b3JfcGxhdGZvcm1fZGF0YSAqCi1udGNfdGhlcm1pc3Rvcl9wYXJzZV9kdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorbnRjX3RoZXJtaXN0b3JfcGFyc2VfZHQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBpaW9fY2hhbm5lbCAqY2hhbjsKIAllbnVtIGlpb19jaGFuX3R5cGUgdHlwZTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKIAlzdHJ1Y3QgbnRjX3RoZXJtaXN0b3JfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJaW50IHJldDsKIAogCWlmICghbnApCiAJCXJldHVybiBOVUxMOwogCi0JcGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOworCXBkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghcGRhdGEpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JY2hhbiA9IGlpb19jaGFubmVsX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKwljaGFuID0gZGV2bV9paW9fY2hhbm5lbF9nZXQoZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKGNoYW4pKQogCQlyZXR1cm4gRVJSX0NBU1QoY2hhbik7CiAKQEAgLTM1OSwyMiArMzU2LDE1IEBACiAKIAlyZXR1cm4gcGRhdGE7CiB9Ci1zdGF0aWMgdm9pZCBudGNfaWlvX2NoYW5uZWxfcmVsZWFzZShzdHJ1Y3QgbnRjX3RoZXJtaXN0b3JfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCi17Ci0JaWYgKHBkYXRhLT5jaGFuKQotCQlpaW9fY2hhbm5lbF9yZWxlYXNlKHBkYXRhLT5jaGFuKTsKLX0KICNlbHNlCiBzdGF0aWMgc3RydWN0IG50Y190aGVybWlzdG9yX3BsYXRmb3JtX2RhdGEgKgotbnRjX3RoZXJtaXN0b3JfcGFyc2VfZHQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK250Y190aGVybWlzdG9yX3BhcnNlX2R0KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gTlVMTDsKIH0KIAogI2RlZmluZSBudGNfbWF0Y2gJTlVMTAogCi1zdGF0aWMgdm9pZCBudGNfaWlvX2NoYW5uZWxfcmVsZWFzZShzdHJ1Y3QgbnRjX3RoZXJtaXN0b3JfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCi17IH0KICNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHU2NCBkaXY2NF91NjRfc2FmZSh1NjQgZGl2aWRlbmQsIHU2NCBkaXZpc29yKQpAQCAtNTE2LDkgKzUwNiw4IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgbnRjX3JlYWRfdGVtcCh2b2lkICpkZXYsIGludCAqdGVtcCkKK3N0YXRpYyBpbnQgbnRjX3JlYWRfdGVtcCh2b2lkICpkYXRhLCBpbnQgKnRlbXApCiB7Ci0Jc3RydWN0IG50Y19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IG9obTsKIAogCW9obSA9IG50Y190aGVybWlzdG9yX2dldF9vaG0oZGF0YSk7CkBAIC01MzAsMTQgKzUxOSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IG50Y19zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBudGNfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGRhdGEtPm5hbWUpOwotfQotCiBzdGF0aWMgc3NpemVfdCBudGNfc2hvd190eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTU1OSwxOCArNTQwLDEzIEBACiAKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfdHlwZSwgU19JUlVHTywgbnRjX3Nob3dfdHlwZSwgTlVMTCwgMCk7CiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBudGNfc2hvd190ZW1wLCBOVUxMLCAwKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBudGNfc2hvd19uYW1lLCBOVUxMKTsKIAotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm50Y19hdHRyaWJ1dGVzW10gPSB7Ci0JJmRldl9hdHRyX25hbWUuYXR0ciwKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpudGNfYXR0cnNbXSA9IHsKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX3R5cGUuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJTlVMTCwKIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG50Y19hdHRyX2dyb3VwID0gewotCS5hdHRycyA9IG50Y19hdHRyaWJ1dGVzLAotfTsKK0FUVFJJQlVURV9HUk9VUFMobnRjKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB0aGVybWFsX3pvbmVfb2ZfZGV2aWNlX29wcyBudGNfb2ZfdGhlcm1hbF9vcHMgPSB7CiAJLmdldF90ZW1wID0gbnRjX3JlYWRfdGVtcCwKQEAgLTU3OSwzMyArNTU1LDM0IEBACiBzdGF0aWMgaW50IG50Y190aGVybWlzdG9yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQgPQotCQkJb2ZfbWF0Y2hfZGV2aWNlKG9mX21hdGNoX3B0cihudGNfbWF0Y2gpLCAmcGRldi0+ZGV2KTsKKwkJCW9mX21hdGNoX2RldmljZShvZl9tYXRjaF9wdHIobnRjX21hdGNoKSwgZGV2KTsKIAljb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkICpwZGV2X2lkOwogCXN0cnVjdCBudGNfdGhlcm1pc3Rvcl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiAJc3RydWN0IG50Y19kYXRhICpkYXRhOwotCWludCByZXQ7CiAKLQlwZGF0YSA9IG50Y190aGVybWlzdG9yX3BhcnNlX2R0KHBkZXYpOworCXBkYXRhID0gbnRjX3RoZXJtaXN0b3JfcGFyc2VfZHQoZGV2KTsKIAlpZiAoSVNfRVJSKHBkYXRhKSkKIAkJcmV0dXJuIFBUUl9FUlIocGRhdGEpOwogCWVsc2UgaWYgKHBkYXRhID09IE5VTEwpCi0JCXBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwkJcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CiAKIAlpZiAoIXBkYXRhKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHBsYXRmb3JtIGluaXQgZGF0YSBzdXBwbGllZC5cbiIpOworCQlkZXZfZXJyKGRldiwgIk5vIHBsYXRmb3JtIGluaXQgZGF0YSBzdXBwbGllZC5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAkvKiBFaXRoZXIgb25lIG9mIHRoZSB0d28gaXMgcmVxdWlyZWQuICovCiAJaWYgKCFwZGF0YS0+cmVhZF91diAmJiAhcGRhdGEtPnJlYWRfb2htKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJZGV2X2VycihkZXYsCiAJCQkiQm90aCByZWFkX3V2IGFuZCByZWFkX29obSBtaXNzaW5nLiBOZWVkIGVpdGhlciBvbmUgb2YgdGhlIHR3by5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAocGRhdGEtPnJlYWRfdXYgJiYgcGRhdGEtPnJlYWRfb2htKSB7Ci0JCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCWRldl93YXJuKGRldiwKIAkJCSAiT25seSBvbmUgb2YgcmVhZF91diBhbmQgcmVhZF9vaG0gaXMgbmVlZGVkOyBpZ25vcmluZyByZWFkX3V2LlxuIik7CiAJCXBkYXRhLT5yZWFkX3V2ID0gTlVMTDsKIAl9CkBAIC02MTcsMjAgKzU5NCwxNyBAQAogCQkJCSBOVENfQ09OTkVDVEVEX1BPU0lUSVZFKSB8fAogCQkJCShwZGF0YS0+Y29ubmVjdCAhPSBOVENfQ09OTkVDVEVEX1BPU0lUSVZFICYmCiAJCQkJIHBkYXRhLT5jb25uZWN0ICE9IE5UQ19DT05ORUNURURfR1JPVU5EKSkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIlJlcXVpcmVkIGRhdGEgdG8gdXNlIHJlYWRfdXYgbm90IHN1cHBsaWVkLlxuIik7CisJCWRldl9lcnIoZGV2LCAiUmVxdWlyZWQgZGF0YSB0byB1c2UgcmVhZF91diBub3Qgc3VwcGxpZWQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IG50Y19kYXRhKSwgR0ZQX0tFUk5FTCk7CisJZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgbnRjX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJcGRldl9pZCA9IG9mX2lkID8gb2ZfaWQtPmRhdGEgOiBwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpOwogCi0JZGF0YS0+ZGV2ID0gJnBkZXYtPmRldjsKIAlkYXRhLT5wZGF0YSA9IHBkYXRhOwotCXN0cmxjcHkoZGF0YS0+bmFtZSwgcGRldl9pZC0+bmFtZSwgc2l6ZW9mKGRhdGEtPm5hbWUpKTsKIAogCXN3aXRjaCAocGRldl9pZC0+ZHJpdmVyX2RhdGEpIHsKIAljYXNlIFRZUEVfTkNQWFhXQjQ3MzoKQEAgLTY1NCw0OSArNjI4LDI1IEBACiAJCWRhdGEtPm5fY29tcCA9IEFSUkFZX1NJWkUobmNwWFh4aDEwMyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVua25vd24gZGV2aWNlIHR5cGU6ICVsdSglcylcbiIsCisJCWRldl9lcnIoZGV2LCAiVW5rbm93biBkZXZpY2UgdHlwZTogJWx1KCVzKVxuIiwKIAkJCQlwZGV2X2lkLT5kcml2ZXJfZGF0YSwgcGRldl9pZC0+bmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRhdGEpOwotCi0JcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkYXRhLT5kZXYtPmtvYmosICZudGNfYXR0cl9ncm91cCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRhdGEtPmRldiwgInVuYWJsZSB0byBjcmVhdGUgc3lzZnMgZmlsZXNcbiIpOwotCQlyZXR1cm4gcmV0OworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgcGRldl9pZC0+bmFtZSwKKwkJCQkJCQkgICBkYXRhLCBudGNfZ3JvdXBzKTsKKwlpZiAoSVNfRVJSKGh3bW9uX2RldikpIHsKKwkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgYXMgaHdtb24gZGV2aWNlLlxuIik7CisJCXJldHVybiBQVFJfRVJSKGh3bW9uX2Rldik7CiAJfQogCi0JZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKGRhdGEtPmRldik7Ci0JaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7Ci0JCWRldl9lcnIoZGF0YS0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIGFzIGh3bW9uIGRldmljZS5cbiIpOwotCQlyZXQgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7Ci0JCWdvdG8gZXJyX2FmdGVyX3N5c2ZzOwotCX0KKwlkZXZfaW5mbyhkZXYsICJUaGVybWlzdG9yIHR5cGU6ICVzIHN1Y2Nlc3NmdWxseSBwcm9iZWQuXG4iLAorCQkgcGRldl9pZC0+bmFtZSk7CiAKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiVGhlcm1pc3RvciB0eXBlOiAlcyBzdWNjZXNzZnVsbHkgcHJvYmVkLlxuIiwKLQkJCQkJCQkJcGRldl9pZC0+bmFtZSk7Ci0KLQl0eiA9IGRldm1fdGhlcm1hbF96b25lX29mX3NlbnNvcl9yZWdpc3RlcihkYXRhLT5kZXYsIDAsIGRhdGEtPmRldiwKKwl0eiA9IGRldm1fdGhlcm1hbF96b25lX29mX3NlbnNvcl9yZWdpc3RlcihkZXYsIDAsIGRhdGEsCiAJCQkJCQkgICZudGNfb2ZfdGhlcm1hbF9vcHMpOwogCWlmIChJU19FUlIodHopKQotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgdG8gdGhlcm1hbCBmdy5cbiIpOwotCi0JcmV0dXJuIDA7Ci1lcnJfYWZ0ZXJfc3lzZnM6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZkYXRhLT5kZXYtPmtvYmosICZudGNfYXR0cl9ncm91cCk7Ci0JbnRjX2lpb19jaGFubmVsX3JlbGVhc2UocGRhdGEpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbnRjX3RoZXJtaXN0b3JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG50Y19kYXRhICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IG50Y190aGVybWlzdG9yX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGF0YS0+cGRhdGE7Ci0KLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGF0YS0+ZGV2LT5rb2JqLCAmbnRjX2F0dHJfZ3JvdXApOwotCW50Y19paW9fY2hhbm5lbF9yZWxlYXNlKHBkYXRhKTsKKwkJZGV2X2RiZyhkZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgdG8gdGhlcm1hbCBmdy5cbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03MDcsNyArNjU3LDYgQEAKIAkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKG50Y19tYXRjaCksCiAJfSwKIAkucHJvYmUgPSBudGNfdGhlcm1pc3Rvcl9wcm9iZSwKLQkucmVtb3ZlID0gbnRjX3RoZXJtaXN0b3JfcmVtb3ZlLAogCS5pZF90YWJsZSA9IG50Y190aGVybWlzdG9yX2lkLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9wbWJ1cy9LY29uZmlnIGIvZHJpdmVycy9od21vbi9wbWJ1cy9LY29uZmlnCmluZGV4IDA1NGQzZDguLmNhZDEyMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vcG1idXMvS2NvbmZpZworKysgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL0tjb25maWcKQEAgLTEyNiwxMiArMTI2LDEyIEBACiAJICBiZSBjYWxsZWQgdHBzNDA0MjIuCiAKIGNvbmZpZyBTRU5TT1JTX1VDRDkwMDAKLQl0cmlzdGF0ZSAiVEkgVUNEOTAxMjAsIFVDRDkwMTI0LCBVQ0Q5MDkwLCBVQ0Q5MDkxMCIKKwl0cmlzdGF0ZSAiVEkgVUNEOTAxMjAsIFVDRDkwMTI0LCBVQ0Q5MDE2MCwgVUNEOTA5MCwgVUNEOTA5MTAiCiAJZGVmYXVsdCBuCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IGhhcmR3YXJlIG1vbml0b3Jpbmcgc3VwcG9ydCBmb3IgVEkKLQkgIFVDRDkwMTIwLCBVQ0Q5MDEyNCwgVUNEOTA5MCwgVUNEOTA5MTAgU2VxdWVuY2VyIGFuZCBTeXN0ZW0gSGVhbHRoCi0JICBDb250cm9sbGVycy4KKwkgIFVDRDkwMTIwLCBVQ0Q5MDEyNCwgVUNEOTAxNjAsIFVDRDkwOTAsIFVDRDkwOTEwLCBTZXF1ZW5jZXIgYW5kIFN5c3RlbQorCSAgSGVhbHRoIENvbnRyb2xsZXJzLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAogCSAgYmUgY2FsbGVkIHVjZDkwMDAuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzLmMgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzLmMKaW5kZXggMGE3NDk5MS4uNDRjYThhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wbWJ1cy9wbWJ1cy5jCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXMvcG1idXMuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy9wbWJ1cy5oPgogI2luY2x1ZGUgInBtYnVzLmgiCiAKIC8qCkBAIC0xNjcsMTQgKzE2OCwyNiBAQAogCQkgICAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgcG1idXNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBOVUxMOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKIAotCWluZm8gPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvKSwKLQkJCSAgICBHRlBfS0VSTkVMKTsKKwlpbmZvID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghaW5mbykKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlpZiAoIXN0cmNtcChpZC0+bmFtZSwgImRwczQ2MCIpIHx8ICFzdHJjbXAoaWQtPm5hbWUsICJkcHM4MDAiKSB8fAorCSAgICAhc3RyY21wKGlkLT5uYW1lLCAic2dkMDA5IikpIHsKKwkJcGRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IHBtYnVzX3BsYXRmb3JtX2RhdGEpLAorCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghcGRhdGEpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlwZGF0YS0+ZmxhZ3MgPSBQTUJVU19TS0lQX1NUQVRVU19DSEVDSzsKKwl9CisKIAlpbmZvLT5wYWdlcyA9IGlkLT5kcml2ZXJfZGF0YTsKIAlpbmZvLT5pZGVudGlmeSA9IHBtYnVzX2lkZW50aWZ5OworCWRldi0+cGxhdGZvcm1fZGF0YSA9IHBkYXRhOwogCiAJcmV0dXJuIHBtYnVzX2RvX3Byb2JlKGNsaWVudCwgaWQsIGluZm8pOwogfQpAQCAtMTg2LDYgKzE5OSw4IEBACiAJeyJhZHA0MDAwIiwgMX0sCiAJeyJibXI0NTMiLCAxfSwKIAl7ImJtcjQ1NCIsIDF9LAorCXsiZHBzNDYwIiwgMX0sCisJeyJkcHM4MDAiLCAxfSwKIAl7Im1kdDA0MCIsIDF9LAogCXsibmNwNDIwMCIsIDF9LAogCXsibmNwNDIwOCIsIDF9LApAQCAtMTkzLDYgKzIwOCw3IEBACiAJeyJwZHQwMDYiLCAxfSwKIAl7InBkdDAxMiIsIDF9LAogCXsicG1idXMiLCAwfSwKKwl7InNnZDAwOSIsIDF9LAogCXsidHBzNDA0MDAiLCAxfSwKIAl7InRwczU0NGIyMCIsIDF9LAogCXsidHBzNTQ0YjI1IiwgMX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BtYnVzL3VjZDkwMDAuYyBiL2RyaXZlcnMvaHdtb24vcG1idXMvdWNkOTAwMC5jCmluZGV4IGZiYjE0NzkuLjNlM2FhOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vcG1idXMvdWNkOTAwMC5jCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXMvdWNkOTAwMC5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjL3BtYnVzLmg+CiAjaW5jbHVkZSAicG1idXMuaCIKIAotZW51bSBjaGlwcyB7IHVjZDkwMDAsIHVjZDkwMTIwLCB1Y2Q5MDEyNCwgdWNkOTA5MCwgdWNkOTA5MTAgfTsKK2VudW0gY2hpcHMgeyB1Y2Q5MDAwLCB1Y2Q5MDEyMCwgdWNkOTAxMjQsIHVjZDkwMTYwLCB1Y2Q5MDkwLCB1Y2Q5MDkxMCB9OwogCiAjZGVmaW5lIFVDRDkwMDBfTU9OSVRPUl9DT05GSUcJCTB4ZDUKICNkZWZpbmUgVUNEOTAwMF9OVU1fUEFHRVMJCTB4ZDYKQEAgLTExMiw2ICsxMTIsNyBAQAogCXsidWNkOTAwMCIsIHVjZDkwMDB9LAogCXsidWNkOTAxMjAiLCB1Y2Q5MDEyMH0sCiAJeyJ1Y2Q5MDEyNCIsIHVjZDkwMTI0fSwKKwl7InVjZDkwMTYwIiwgdWNkOTAxNjB9LAogCXsidWNkOTA5MCIsIHVjZDkwOTB9LAogCXsidWNkOTA5MTAiLCB1Y2Q5MDkxMH0sCiAJe30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vc2NwaS1od21vbi5jIGIvZHJpdmVycy9od21vbi9zY3BpLWh3bW9uLmMKaW5kZXggMjViNDRlNi4uNTU5YTNkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zY3BpLWh3bW9uLmMKKysrIGIvZHJpdmVycy9od21vbi9zY3BpLWh3bW9uLmMKQEAgLTI1NSw3ICsyNTUsNiBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2NwaV9od21vbl9wbGF0ZHJ2ID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gInNjcGktaHdtb24iLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm9mX21hdGNoX3RhYmxlID0gc2NwaV9vZl9tYXRjaCwKIAl9LAogCS5wcm9iZQkJPSBzY3BpX2h3bW9uX3Byb2JlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi90bXAxMDIuYyBiL2RyaXZlcnMvaHdtb24vdG1wMTAyLmMKaW5kZXggODQ3OWFjNS4uMzZiYmEyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi90bXAxMDIuYworKysgYi9kcml2ZXJzL2h3bW9uL3RtcDEwMi5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3RoZXJtYWwuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogCiAjZGVmaW5lCURSSVZFUl9OQU1FICJ0bXAxMDIiCkBAIC03OSw4NCArNzgsMTEzIEBACiAJcmV0dXJuICh2YWwgKiAxMjgpIC8gMTAwMDsKIH0KIAotc3RhdGljIGludCB0bXAxMDJfcmVhZF90ZW1wKHZvaWQgKmRldiwgaW50ICp0ZW1wKQorc3RhdGljIGludCB0bXAxMDJfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCSAgICAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnRlbXApCiB7CiAJc3RydWN0IHRtcDEwMiAqdG1wMTAyID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JdW5zaWduZWQgaW50IHJlZzsKLQlpbnQgcmV0OworCXVuc2lnbmVkIGludCByZWd2YWw7CisJaW50IGVyciwgcmVnOwogCi0JaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRtcDEwMi0+cmVhZHlfdGltZSkpIHsKLQkJZGV2X2RiZyhkZXYsICIlczogQ29udmVyc2lvbiBub3QgcmVhZHkgeWV0Li5cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FQUdBSU47CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCQkvKiBJcyBpdCB0b28gZWFybHkgdG8gcmV0dXJuIGEgY29udmVyc2lvbiA/ICovCisJCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0bXAxMDItPnJlYWR5X3RpbWUpKSB7CisJCQlkZXZfZGJnKGRldiwgIiVzOiBDb252ZXJzaW9uIG5vdCByZWFkeSB5ZXQuLlxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJcmVnID0gVE1QMTAyX1RFTVBfUkVHOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfbWF4X2h5c3Q6CisJCXJlZyA9IFRNUDEwMl9UTE9XX1JFRzsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX21heDoKKwkJcmVnID0gVE1QMTAyX1RISUdIX1JFRzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAotCXJldCA9IHJlZ21hcF9yZWFkKHRtcDEwMi0+cmVnbWFwLCBUTVAxMDJfVEVNUF9SRUcsICZyZWcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JKnRlbXAgPSB0bXAxMDJfcmVnX3RvX21DKHJlZyk7CisJZXJyID0gcmVnbWFwX3JlYWQodG1wMTAyLT5yZWdtYXAsIHJlZywgJnJlZ3ZhbCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJKnRlbXAgPSB0bXAxMDJfcmVnX3RvX21DKHJlZ3ZhbCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3QgdG1wMTAyX3Nob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJY2hhciAqYnVmKQorc3RhdGljIGludCB0bXAxMDJfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nIHRlbXApCiB7Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZGEgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7CiAJc3RydWN0IHRtcDEwMiAqdG1wMTAyID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHJlZ2FkZHIgPSBzZGEtPmluZGV4OwotCXVuc2lnbmVkIGludCByZWc7Ci0JaW50IGVycjsKKwlpbnQgcmVnOwogCi0JaWYgKHJlZ2FkZHIgPT0gVE1QMTAyX1RFTVBfUkVHICYmCi0JICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRtcDEwMi0+cmVhZHlfdGltZSkpCi0JCXJldHVybiAtRUFHQUlOOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fdGVtcF9tYXhfaHlzdDoKKwkJcmVnID0gVE1QMTAyX1RMT1dfUkVHOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQlyZWcgPSBUTVAxMDJfVEhJR0hfUkVHOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogCi0JZXJyID0gcmVnbWFwX3JlYWQodG1wMTAyLT5yZWdtYXAsIHJlZ2FkZHIsICZyZWcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRtcDEwMl9yZWdfdG9fbUMocmVnKSk7CisJdGVtcCA9IGNsYW1wX3ZhbCh0ZW1wLCAtMjU2MDAwLCAyNTUwMDApOworCXJldHVybiByZWdtYXBfd3JpdGUodG1wMTAyLT5yZWdtYXAsIHJlZywgdG1wMTAyX21DX3RvX3JlZyh0ZW1wKSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHRtcDEwMl9zZXRfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgdW1vZGVfdCB0bXAxMDJfaXNfdmlzaWJsZShjb25zdCB2b2lkICpkYXRhLCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJCSB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCiB7Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZGEgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7Ci0Jc3RydWN0IHRtcDEwMiAqdG1wMTAyID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHJlZyA9IHNkYS0+aW5kZXg7Ci0JbG9uZyB2YWw7Ci0JaW50IGVycjsKKwlpZiAodHlwZSAhPSBod21vbl90ZW1wKQorCQlyZXR1cm4gMDsKIAotCWlmIChrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JdmFsID0gY2xhbXBfdmFsKHZhbCwgLTI1NjAwMCwgMjU1MDAwKTsKLQotCWVyciA9IHJlZ21hcF93cml0ZSh0bXAxMDItPnJlZ21hcCwgcmVnLCB0bXAxMDJfbUNfdG9fcmVnKHZhbCkpOwotCXJldHVybiBlcnIgPyA6IGNvdW50OworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fdGVtcF9pbnB1dDoKKwkJcmV0dXJuIFNfSVJVR087CisJY2FzZSBod21vbl90ZW1wX21heF9oeXN0OgorCWNhc2UgaHdtb25fdGVtcF9tYXg6CisJCXJldHVybiBTX0lSVUdPIHwgU19JV1VTUjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CiB9CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHRtcDEwMl9zaG93X3RlbXAsIE5VTEwsCi0JCQkgIFRNUDEwMl9URU1QX1JFRyk7CitzdGF0aWMgdTMyIHRtcDEwMl9jaGlwX2NvbmZpZ1tdID0geworCUhXTU9OX0NfUkVHSVNURVJfVFosCisJMAorfTsKIAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXhfaHlzdCwgU19JV1VTUiB8IFNfSVJVR08sIHRtcDEwMl9zaG93X3RlbXAsCi0JCQkgIHRtcDEwMl9zZXRfdGVtcCwgVE1QMTAyX1RMT1dfUkVHKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIHRtcDEwMl9jaGlwID0geworCS50eXBlID0gaHdtb25fY2hpcCwKKwkuY29uZmlnID0gdG1wMTAyX2NoaXBfY29uZmlnLAorfTsKIAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCB0bXAxMDJfc2hvd190ZW1wLAotCQkJICB0bXAxMDJfc2V0X3RlbXAsIFRNUDEwMl9USElHSF9SRUcpOworc3RhdGljIHUzMiB0bXAxMDJfdGVtcF9jb25maWdbXSA9IHsKKwlIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9NQVggfCBIV01PTl9UX01BWF9IWVNULAorCTAKK307CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0bXAxMDJfYXR0cnNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXhfaHlzdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4LmRldl9hdHRyLmF0dHIsCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyB0bXAxMDJfdGVtcCA9IHsKKwkudHlwZSA9IGh3bW9uX3RlbXAsCisJLmNvbmZpZyA9IHRtcDEwMl90ZW1wX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICp0bXAxMDJfaW5mb1tdID0geworCSZ0bXAxMDJfY2hpcCwKKwkmdG1wMTAyX3RlbXAsCiAJTlVMTAogfTsKLUFUVFJJQlVURV9HUk9VUFModG1wMTAyKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB0aGVybWFsX3pvbmVfb2ZfZGV2aWNlX29wcyB0bXAxMDJfb2ZfdGhlcm1hbF9vcHMgPSB7Ci0JLmdldF90ZW1wID0gdG1wMTAyX3JlYWRfdGVtcCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fb3BzIHRtcDEwMl9od21vbl9vcHMgPSB7CisJLmlzX3Zpc2libGUgPSB0bXAxMDJfaXNfdmlzaWJsZSwKKwkucmVhZCA9IHRtcDEwMl9yZWFkLAorCS53cml0ZSA9IHRtcDEwMl93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvIHRtcDEwMl9jaGlwX2luZm8gPSB7CisJLm9wcyA9ICZ0bXAxMDJfaHdtb25fb3BzLAorCS5pbmZvID0gdG1wMTAyX2luZm8sCiB9OwogCiBzdGF0aWMgdm9pZCB0bXAxMDJfcmVzdG9yZV9jb25maWcodm9pZCAqZGF0YSkKQEAgLTE4OCw3ICsyMTYsNyBAQAogfTsKIAogc3RhdGljIGludCB0bXAxMDJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCQkgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwpAQCAtMjQ5LDE2ICsyNzcsMTQgQEAKIAkJdG1wMTAyLT5yZWFkeV90aW1lICs9IG1zZWNzX3RvX2ppZmZpZXMoQ09OVkVSU0lPTl9USU1FX01TKTsKIAl9CiAKLQlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKLQkJCQkJCQkgICB0bXAxMDIsCi0JCQkJCQkJICAgdG1wMTAyX2dyb3Vwcyk7CisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKGRldiwgY2xpZW50LT5uYW1lLAorCQkJCQkJCSB0bXAxMDIsCisJCQkJCQkJICZ0bXAxMDJfY2hpcF9pbmZvLAorCQkJCQkJCSBOVUxMKTsKIAlpZiAoSVNfRVJSKGh3bW9uX2RldikpIHsKIAkJZGV2X2RiZyhkZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgaHdtb24gZGV2aWNlXG4iKTsKIAkJcmV0dXJuIFBUUl9FUlIoaHdtb25fZGV2KTsKIAl9Ci0JZGV2bV90aGVybWFsX3pvbmVfb2Zfc2Vuc29yX3JlZ2lzdGVyKGh3bW9uX2RldiwgMCwgaHdtb25fZGV2LAotCQkJCQkgICAgICZ0bXAxMDJfb2ZfdGhlcm1hbF9vcHMpOwotCiAJZGV2X2luZm8oZGV2LCAiaW5pdGlhbGl6ZWRcbiIpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3RtcDQyMS5jIGIvZHJpdmVycy9od21vbi90bXA0MjEuYwppbmRleCA4NWQ0OGQ4Li5iZmI5OGI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3RtcDQyMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vdG1wNDIxLmMKQEAgLTcyLDYgKzcyLDEwIEBACiBzdHJ1Y3QgdG1wNDIxX2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOworCXUzMiB0ZW1wX2NvbmZpZ1s1XTsKKwlzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIHRlbXBfaW5mbzsKKwljb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICppbmZvWzJdOworCXN0cnVjdCBod21vbl9jaGlwX2luZm8gY2hpcDsKIAljaGFyIHZhbGlkOwogCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwogCWludCBjaGFubmVsczsKQEAgLTEyNSw4NSArMTI5LDQ2IEBACiAJcmV0dXJuIGRhdGE7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF92YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgdG1wNDIxX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkgICAgICAgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nICp2YWwpCiB7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKLQlzdHJ1Y3QgdG1wNDIxX2RhdGEgKmRhdGEgPSB0bXA0MjFfdXBkYXRlX2RldmljZShkZXYpOwotCWludCB0ZW1wOworCXN0cnVjdCB0bXA0MjFfZGF0YSAqdG1wNDIxID0gdG1wNDIxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlpZiAoZGF0YS0+Y29uZmlnICYgVE1QNDIxX0NPTkZJR19SQU5HRSkKLQkJdGVtcCA9IHRlbXBfZnJvbV91MTYoZGF0YS0+dGVtcFtpbmRleF0pOwotCWVsc2UKLQkJdGVtcCA9IHRlbXBfZnJvbV9zMTYoZGF0YS0+dGVtcFtpbmRleF0pOwotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fdGVtcF9pbnB1dDoKKwkJaWYgKHRtcDQyMS0+Y29uZmlnICYgVE1QNDIxX0NPTkZJR19SQU5HRSkKKwkJCSp2YWwgPSB0ZW1wX2Zyb21fdTE2KHRtcDQyMS0+dGVtcFtjaGFubmVsXSk7CisJCWVsc2UKKwkJCSp2YWwgPSB0ZW1wX2Zyb21fczE2KHRtcDQyMS0+dGVtcFtjaGFubmVsXSk7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9mYXVsdDoKKwkJLyoKKwkJICogVGhlIE9QRU4gYml0IHNpZ25hbHMgYSBmYXVsdC4gVGhpcyBpcyBiaXQgMCBvZiB0aGUgdGVtcGVyYXR1cmUKKwkJICogcmVnaXN0ZXIgKGxvdyBieXRlKS4KKwkJICovCisJCSp2YWwgPSB0bXA0MjEtPnRlbXBbY2hhbm5lbF0gJiAweDAxOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXApOwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X2ZhdWx0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyB1bW9kZV90IHRtcDQyMV9pc192aXNpYmxlKGNvbnN0IHZvaWQgKmRhdGEsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkJIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKIHsKLQlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwotCXN0cnVjdCB0bXA0MjFfZGF0YSAqZGF0YSA9IHRtcDQyMV91cGRhdGVfZGV2aWNlKGRldik7Ci0KLQkvKgotCSAqIFRoZSBPUEVOIGJpdCBzaWduYWxzIGEgZmF1bHQuIFRoaXMgaXMgYml0IDAgb2YgdGhlIHRlbXBlcmF0dXJlCi0JICogcmVnaXN0ZXIgKGxvdyBieXRlKS4KLQkgKi8KLQlpZiAoZGF0YS0+dGVtcFtpbmRleF0gJiAweDAxKQotCQlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsKLQllbHNlCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjBcbiIpOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fdGVtcF9mYXVsdDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gU19JUlVHTzsKKwljYXNlIGh3bW9uX3RlbXBfaW5wdXQ6CisJCXJldHVybiBTX0lSVUdPOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KIH0KIAotc3RhdGljIHVtb2RlX3QgdG1wNDIxX2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmEsCi0JCQkJaW50IG4pCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOwotCXN0cnVjdCB0bXA0MjFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyOwotCXVuc2lnbmVkIGludCBpbmRleDsKLQotCWRldmF0dHIgPSBjb250YWluZXJfb2YoYSwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUsIGF0dHIpOwotCWluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKLQotCWlmIChpbmRleCA8IGRhdGEtPmNoYW5uZWxzKQotCQlyZXR1cm4gYS0+bW9kZTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfdmFsdWUsIE5VTEwsIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wX3ZhbHVlLCBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfZmF1bHQsIFNfSVJVR08sIHNob3dfZmF1bHQsIE5VTEwsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wX3ZhbHVlLCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfZmF1bHQsIFNfSVJVR08sIHNob3dfZmF1bHQsIE5VTEwsIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNF9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wX3ZhbHVlLCBOVUxMLCAzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfZmF1bHQsIFNfSVJVR08sIHNob3dfZmF1bHQsIE5VTEwsIDMpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdG1wNDIxX2F0dHJbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfZmF1bHQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdG1wNDIxX2dyb3VwID0gewotCS5hdHRycyA9IHRtcDQyMV9hdHRyLAotCS5pc192aXNpYmxlID0gdG1wNDIxX2lzX3Zpc2libGUsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqdG1wNDIxX2dyb3Vwc1tdID0gewotCSZ0bXA0MjFfZ3JvdXAsCi0JTlVMTAotfTsKLQogc3RhdGljIGludCB0bXA0MjFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlpbnQgY29uZmlnLCBjb25maWdfb3JpZzsKQEAgLTI4OSwxMyArMjU0LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fb3BzIHRtcDQyMV9vcHMgPSB7CisJLmlzX3Zpc2libGUgPSB0bXA0MjFfaXNfdmlzaWJsZSwKKwkucmVhZCA9IHRtcDQyMV9yZWFkLAorfTsKKwogc3RhdGljIGludCB0bXA0MjFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwogCXN0cnVjdCB0bXA0MjFfZGF0YSAqZGF0YTsKLQlpbnQgZXJyOworCWludCBpLCBlcnI7CiAKIAlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCB0bXA0MjFfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkKQEAgLTMwOSw4ICsyNzksMjEgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsCi0JCQkJCQkJICAgZGF0YSwgdG1wNDIxX2dyb3Vwcyk7CisJZm9yIChpID0gMDsgaSA8IGRhdGEtPmNoYW5uZWxzOyBpKyspCisJCWRhdGEtPnRlbXBfY29uZmlnW2ldID0gSFdNT05fVF9JTlBVVCB8IEhXTU9OX1RfRkFVTFQ7CisKKwlkYXRhLT5jaGlwLm9wcyA9ICZ0bXA0MjFfb3BzOworCWRhdGEtPmNoaXAuaW5mbyA9IGRhdGEtPmluZm87CisKKwlkYXRhLT5pbmZvWzBdID0gJmRhdGEtPnRlbXBfaW5mbzsKKworCWRhdGEtPnRlbXBfaW5mby50eXBlID0gaHdtb25fdGVtcDsKKwlkYXRhLT50ZW1wX2luZm8uY29uZmlnID0gZGF0YS0+dGVtcF9jb25maWc7CisKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oZGV2LCBjbGllbnQtPm5hbWUsCisJCQkJCQkJIGRhdGEsCisJCQkJCQkJICZkYXRhLT5jaGlwLAorCQkJCQkJCSBOVUxMKTsKIAlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24veGdlbmUtaHdtb24uYyBiL2RyaXZlcnMvaHdtb24veGdlbmUtaHdtb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzBkYmI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi94Z2VuZS1od21vbi5jCkBAIC0wLDAgKzEsNzg3IEBACisvKgorICogQVBNIFgtR2VuZSBTb0MgSGFyZHdhcmUgTW9uaXRvcmluZyBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEFwcGxpZWQgTWljcm8gQ2lyY3VpdHMgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogTG9jIEhvIDxsaG9AYXBtLmNvbT4KKyAqICAgICAgICAgSG9hbiBUcmFuIDxob3RyYW5AYXBtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogVGhpcyBkcml2ZXIgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczoKKyAqICAtIFJldHJpZXZlIENQVSB0b3RhbCBwb3dlciAodVcpCisgKiAgLSBSZXRyaWV2ZSBJTyB0b3RhbCBwb3dlciAodVcpCisgKiAgLSBSZXRyaWV2ZSBTb0MgdGVtcGVyYXR1cmUgKG1pbGxpLWRlZ3JlZSBDKSBhbmQgYWxhcm0KKyAqLworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvbWFpbGJveF9jb250cm9sbGVyLmg+CisjaW5jbHVkZSA8bGludXgvbWFpbGJveF9jbGllbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YWNwaS9wY2MuaD4KKworLyogU0xJTXBybyBtZXNzYWdlIGRlZmluZXMgKi8KKyNkZWZpbmUgTVNHX1RZUEVfREJHCQkJMAorI2RlZmluZSBNU0dfVFlQRV9FUlIJCQk3CisjZGVmaW5lIE1TR19UWVBFX1BXUk1HTVQJCTkKKworI2RlZmluZSBNU0dfVFlQRSh2KQkJCSgoKHYpICYgMHhGMDAwMDAwMCkgPj4gMjgpCisjZGVmaW5lIE1TR19UWVBFX1NFVCh2KQkJCSgoKHYpIDw8IDI4KSAmIDB4RjAwMDAwMDApCisjZGVmaW5lIE1TR19TVUJUWVBFKHYpCQkJKCgodikgJiAweDBGMDAwMDAwKSA+PiAyNCkKKyNkZWZpbmUgTVNHX1NVQlRZUEVfU0VUKHYpCQkoKCh2KSA8PCAyNCkgJiAweDBGMDAwMDAwKQorCisjZGVmaW5lIERCR19TVUJUWVBFX1NFTlNPUl9SRUFECQk0CisjZGVmaW5lIFNFTlNPUl9SRF9NU0cJCQkweDA0RkZFOTAyCisjZGVmaW5lIFNFTlNPUl9SRF9FTl9BRERSKGEpCQkoKGEpICYgMHgwMDBGRkZGRikKKyNkZWZpbmUgUE1EX1BXUl9SRUcJCQkweDIwCisjZGVmaW5lIFBNRF9QV1JfTVdfUkVHCQkJMHgyNgorI2RlZmluZSBTT0NfUFdSX1JFRwkJCTB4MjEKKyNkZWZpbmUgU09DX1BXUl9NV19SRUcJCQkweDI3CisjZGVmaW5lIFNPQ19URU1QX1JFRwkJCTB4MTAKKworI2RlZmluZSBURU1QX05FR0FUSVZFX0JJVAkJOAorI2RlZmluZSBTRU5TT1JfSU5WQUxJRF9EQVRBCQlCSVQoMTUpCisKKyNkZWZpbmUgUFdSTUdNVF9TVUJUWVBFX1RQQwkJMQorI2RlZmluZSBUUENfQUxBUk0JCQkyCisjZGVmaW5lIFRQQ19HRVRfQUxBUk0JCQkzCisjZGVmaW5lIFRQQ19DTUQodikJCQkoKCh2KSAmIDB4MDBGRjAwMDApID4+IDE2KQorI2RlZmluZSBUUENfQ01EX1NFVCh2KQkJCSgoKHYpIDw8IDE2KSAmIDB4MDBGRjAwMDApCisjZGVmaW5lIFRQQ19FTl9NU0coaG5kbCwgY21kLCB0eXBlKSBcCisJKE1TR19UWVBFX1NFVChNU0dfVFlQRV9QV1JNR01UKSB8IFwKKwlNU0dfU1VCVFlQRV9TRVQoaG5kbCkgfCBUUENfQ01EX1NFVChjbWQpIHwgdHlwZSkKKworLyogUENDIGRlZmluZXMgKi8KKyNkZWZpbmUgUENDX1NJR05BVFVSRV9NQVNLCQkweDUwNDI0MzAwCisjZGVmaW5lIFBDQ0NfR0VORVJBVEVfREJfSU5UCQlCSVQoMTUpCisjZGVmaW5lIFBDQ1NfQ01EX0NPTVBMRVRFCQlCSVQoMCkKKyNkZWZpbmUgUENDU19TQ0lfRE9PUkJFTAkJQklUKDEpCisjZGVmaW5lIFBDQ1NfUExBVEZPUk1fTk9USUZJQ0FUSU9OCUJJVCgzKQorLyoKKyAqIEFyYml0cmFyeSByZXRyaWVzIGluIGNhc2UgdGhlIHJlbW90ZSBwcm9jZXNzb3IgaXMgc2xvdyB0byByZXNwb25kCisgKiB0byBQQ0MgY29tbWFuZHMKKyAqLworI2RlZmluZSBQQ0NfTlVNX1JFVFJJRVMJCQk1MDAKKworI2RlZmluZSBBU1lOQ19NU0dfRklGT19TSVpFCQkxNgorI2RlZmluZSBNQk9YX09QX1RJTUVPVVRNUwkJMTAwMAorCisjZGVmaW5lIFdBVFRfVE9fbVdBVFQoeCkJCSgoeCkgKiAxMDAwKQorI2RlZmluZSBtV0FUVF9UT191V0FUVCh4KQkJKCh4KSAqIDEwMDApCisjZGVmaW5lIENFTFNJVVNfVE9fbUNFTFNJVVMoeCkJCSgoeCkgKiAxMDAwKQorCisjZGVmaW5lIHRvX3hnZW5lX2h3bW9uX2RldihjbCkJCVwKKwljb250YWluZXJfb2YoY2wsIHN0cnVjdCB4Z2VuZV9od21vbl9kZXYsIG1ib3hfY2xpZW50KQorCitzdHJ1Y3Qgc2xpbXByb19yZXNwX21zZyB7CisJdTMyIG1zZzsKKwl1MzIgcGFyYW0xOworCXUzMiBwYXJhbTI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2IHsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBtYm94X2NoYW4JKm1ib3hfY2hhbjsKKwlzdHJ1Y3QgbWJveF9jbGllbnQJbWJveF9jbGllbnQ7CisJaW50CQkJbWJveF9pZHg7CisKKwlzcGlubG9ja190CQlrZmlmb19sb2NrOworCXN0cnVjdCBtdXRleAkJcmRfbXV0ZXg7CisJc3RydWN0IGNvbXBsZXRpb24JcmRfY29tcGxldGU7CisJaW50CQkJcmVzcF9wZW5kaW5nOworCXN0cnVjdCBzbGltcHJvX3Jlc3BfbXNnIHN5bmNfbXNnOworCisJc3RydWN0IHdvcmtfc3RydWN0CXdvcmtxOworCXN0cnVjdCBrZmlmb19yZWNfcHRyXzEJYXN5bmNfbXNnX2ZpZm87CisKKwlzdHJ1Y3QgZGV2aWNlCQkqaHdtb25fZGV2OworCWJvb2wJCQl0ZW1wX2NyaXRpY2FsX2FsYXJtOworCisJcGh5c19hZGRyX3QJCWNvbW1fYmFzZV9hZGRyOworCXZvaWQJCQkqcGNjX2NvbW1fYWRkcjsKKwl1NjQJCQl1c2Vjc19sYXQ7Cit9OworCisvKgorICogVGhpcyBmdW5jdGlvbiB0ZXN0cyBhbmQgY2xlYXJzIGEgYml0bWFzayB0aGVuIHJldHVybnMgaXRzIG9sZCB2YWx1ZQorICovCitzdGF0aWMgdTE2IHhnZW5lX3dvcmRfdHN0X2FuZF9jbHIodTE2ICphZGRyLCB1MTYgbWFzaykKK3sKKwl1MTYgcmV0LCB2YWw7CisKKwl2YWwgPSBsZTE2X3RvX2NwdShSRUFEX09OQ0UoKmFkZHIpKTsKKwlyZXQgPSB2YWwgJiBtYXNrOworCXZhbCAmPSB+bWFzazsKKwlXUklURV9PTkNFKCphZGRyLCBjcHVfdG9fbGUxNih2YWwpKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfaHdtb25fcGNjX3JkKHN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCwgdTMyICptc2cpCit7CisJc3RydWN0IGFjcGlfcGNjdF9zaGFyZWRfbWVtb3J5ICpnZW5lcmljX2NvbW1fYmFzZSA9IGN0eC0+cGNjX2NvbW1fYWRkcjsKKwl1MzIgKnB0ciA9ICh2b2lkICopKGdlbmVyaWNfY29tbV9iYXNlICsgMSk7CisJaW50IHJjLCBpOworCXUxNiB2YWw7CisKKwltdXRleF9sb2NrKCZjdHgtPnJkX211dGV4KTsKKwlpbml0X2NvbXBsZXRpb24oJmN0eC0+cmRfY29tcGxldGUpOworCWN0eC0+cmVzcF9wZW5kaW5nID0gdHJ1ZTsKKworCS8qIFdyaXRlIHNpZ25hdHVyZSBmb3Igc3Vic3BhY2UgKi8KKwlXUklURV9PTkNFKGdlbmVyaWNfY29tbV9iYXNlLT5zaWduYXR1cmUsCisJCSAgIGNwdV90b19sZTMyKFBDQ19TSUdOQVRVUkVfTUFTSyB8IGN0eC0+bWJveF9pZHgpKTsKKworCS8qIFdyaXRlIHRvIHRoZSBzaGFyZWQgY29tbWFuZCByZWdpb24gKi8KKwlXUklURV9PTkNFKGdlbmVyaWNfY29tbV9iYXNlLT5jb21tYW5kLAorCQkgICBjcHVfdG9fbGUxNihNU0dfVFlQRShtc2dbMF0pIHwgUENDQ19HRU5FUkFURV9EQl9JTlQpKTsKKworCS8qIEZsaXAgQ01EIENPTVBMRVRFIGJpdCAqLworCXZhbCA9IGxlMTZfdG9fY3B1KFJFQURfT05DRShnZW5lcmljX2NvbW1fYmFzZS0+c3RhdHVzKSk7CisJdmFsICY9IH5QQ0NTX0NNRF9DT01QTEVURTsKKwlXUklURV9PTkNFKGdlbmVyaWNfY29tbV9iYXNlLT5zdGF0dXMsIGNwdV90b19sZTE2KHZhbCkpOworCisJLyogQ29weSB0aGUgbWVzc2FnZSB0byB0aGUgUENDIGNvbW0gc3BhY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCBzbGltcHJvX3Jlc3BfbXNnKSAvIDQ7IGkrKykKKwkJV1JJVEVfT05DRShwdHJbaV0sIGNwdV90b19sZTMyKG1zZ1tpXSkpOworCisJLyogUmluZyB0aGUgZG9vcmJlbGwgKi8KKwlyYyA9IG1ib3hfc2VuZF9tZXNzYWdlKGN0eC0+bWJveF9jaGFuLCBtc2cpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycihjdHgtPmRldiwgIk1haWxib3ggc2VuZCBlcnJvciAlZFxuIiwgcmMpOworCQlnb3RvIGVycjsKKwl9CisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmN0eC0+cmRfY29tcGxldGUsCisJCQkJCSB1c2Vjc190b19qaWZmaWVzKGN0eC0+dXNlY3NfbGF0KSkpIHsKKwkJZGV2X2VycihjdHgtPmRldiwgIk1haWxib3ggb3BlcmF0aW9uIHRpbWVkIG91dFxuIik7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBlcnI7CisJfQorCisJLyogQ2hlY2sgZm9yIGVycm9yIG1lc3NhZ2UgKi8KKwlpZiAoTVNHX1RZUEUoY3R4LT5zeW5jX21zZy5tc2cpID09IE1TR19UWVBFX0VSUikgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCW1zZ1swXSA9IGN0eC0+c3luY19tc2cubXNnOworCW1zZ1sxXSA9IGN0eC0+c3luY19tc2cucGFyYW0xOworCW1zZ1syXSA9IGN0eC0+c3luY19tc2cucGFyYW0yOworCitlcnI6CisJbWJveF9jaGFuX3R4ZG9uZShjdHgtPm1ib3hfY2hhbiwgMCk7CisJY3R4LT5yZXNwX3BlbmRpbmcgPSBmYWxzZTsKKwltdXRleF91bmxvY2soJmN0eC0+cmRfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB4Z2VuZV9od21vbl9yZChzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2ICpjdHgsIHUzMiAqbXNnKQoreworCWludCByYzsKKworCW11dGV4X2xvY2soJmN0eC0+cmRfbXV0ZXgpOworCWluaXRfY29tcGxldGlvbigmY3R4LT5yZF9jb21wbGV0ZSk7CisJY3R4LT5yZXNwX3BlbmRpbmcgPSB0cnVlOworCisJcmMgPSBtYm94X3NlbmRfbWVzc2FnZShjdHgtPm1ib3hfY2hhbiwgbXNnKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoY3R4LT5kZXYsICJNYWlsYm94IHNlbmQgZXJyb3IgJWRcbiIsIHJjKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmN0eC0+cmRfY29tcGxldGUsCisJCQkJCSBtc2Vjc190b19qaWZmaWVzKE1CT1hfT1BfVElNRU9VVE1TKSkpIHsKKwkJZGV2X2VycihjdHgtPmRldiwgIk1haWxib3ggb3BlcmF0aW9uIHRpbWVkIG91dFxuIik7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBlcnI7CisJfQorCisJLyogQ2hlY2sgZm9yIGVycm9yIG1lc3NhZ2UgKi8KKwlpZiAoTVNHX1RZUEUoY3R4LT5zeW5jX21zZy5tc2cpID09IE1TR19UWVBFX0VSUikgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCW1zZ1swXSA9IGN0eC0+c3luY19tc2cubXNnOworCW1zZ1sxXSA9IGN0eC0+c3luY19tc2cucGFyYW0xOworCW1zZ1syXSA9IGN0eC0+c3luY19tc2cucGFyYW0yOworCitlcnI6CisJY3R4LT5yZXNwX3BlbmRpbmcgPSBmYWxzZTsKKwltdXRleF91bmxvY2soJmN0eC0+cmRfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB4Z2VuZV9od21vbl9yZWdfbWFwX3JkKHN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCwgdTMyIGFkZHIsCisJCQkJICB1MzIgKmRhdGEpCit7CisJdTMyIG1zZ1szXTsKKwlpbnQgcmM7CisKKwltc2dbMF0gPSBTRU5TT1JfUkRfTVNHOworCW1zZ1sxXSA9IFNFTlNPUl9SRF9FTl9BRERSKGFkZHIpOworCW1zZ1syXSA9IDA7CisKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJcmMgPSB4Z2VuZV9od21vbl9yZChjdHgsIG1zZyk7CisJZWxzZQorCQlyYyA9IHhnZW5lX2h3bW9uX3BjY19yZChjdHgsIG1zZyk7CisKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKgorCSAqIENoZWNrIGlmIHNlbnNvciBkYXRhIGlzIHZhbGlkLgorCSAqLworCWlmIChtc2dbMV0gJiBTRU5TT1JfSU5WQUxJRF9EQVRBKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwkqZGF0YSA9IG1zZ1sxXTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB4Z2VuZV9od21vbl9nZXRfbm90aWZpY2F0aW9uX21zZyhzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2ICpjdHgsCisJCQkJCSAgICB1MzIgKmFtc2cpCit7CisJdTMyIG1zZ1szXTsKKwlpbnQgcmM7CisKKwltc2dbMF0gPSBUUENfRU5fTVNHKFBXUk1HTVRfU1VCVFlQRV9UUEMsIFRQQ19HRVRfQUxBUk0sIDApOworCW1zZ1sxXSA9IDA7CisJbXNnWzJdID0gMDsKKworCXJjID0geGdlbmVfaHdtb25fcGNjX3JkKGN0eCwgbXNnKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlhbXNnWzBdID0gbXNnWzBdOworCWFtc2dbMV0gPSBtc2dbMV07CisJYW1zZ1syXSA9IG1zZ1syXTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB4Z2VuZV9od21vbl9nZXRfY3B1X3B3cihzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2ICpjdHgsIHUzMiAqdmFsKQoreworCXUzMiB3YXR0LCBtd2F0dDsKKwlpbnQgcmM7CisKKwlyYyA9IHhnZW5lX2h3bW9uX3JlZ19tYXBfcmQoY3R4LCBQTURfUFdSX1JFRywgJndhdHQpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJjID0geGdlbmVfaHdtb25fcmVnX21hcF9yZChjdHgsIFBNRF9QV1JfTVdfUkVHLCAmbXdhdHQpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCSp2YWwgPSBXQVRUX1RPX21XQVRUKHdhdHQpICsgbXdhdHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfaHdtb25fZ2V0X2lvX3B3cihzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2ICpjdHgsIHUzMiAqdmFsKQoreworCXUzMiB3YXR0LCBtd2F0dDsKKwlpbnQgcmM7CisKKwlyYyA9IHhnZW5lX2h3bW9uX3JlZ19tYXBfcmQoY3R4LCBTT0NfUFdSX1JFRywgJndhdHQpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJjID0geGdlbmVfaHdtb25fcmVnX21hcF9yZChjdHgsIFNPQ19QV1JfTVdfUkVHLCAmbXdhdHQpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCSp2YWwgPSBXQVRUX1RPX21XQVRUKHdhdHQpICsgbXdhdHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfaHdtb25fZ2V0X3RlbXAoc3RydWN0IHhnZW5lX2h3bW9uX2RldiAqY3R4LCB1MzIgKnZhbCkKK3sKKwlyZXR1cm4geGdlbmVfaHdtb25fcmVnX21hcF9yZChjdHgsIFNPQ19URU1QX1JFRywgdmFsKTsKK30KKworLyoKKyAqIFNlbnNvciB0ZW1wZXJhdHVyZS9wb3dlciBmdW5jdGlvbnMKKyAqLworc3RhdGljIHNzaXplX3QgdGVtcDFfaW5wdXRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByYywgdGVtcDsKKwl1MzIgdmFsOworCisJcmMgPSB4Z2VuZV9od21vbl9nZXRfdGVtcChjdHgsICZ2YWwpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXRlbXAgPSBzaWduX2V4dGVuZDMyKHZhbCwgVEVNUF9ORUdBVElWRV9CSVQpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIENFTFNJVVNfVE9fbUNFTFNJVVModGVtcCkpOworfQorCitzdGF0aWMgc3NpemVfdCB0ZW1wMV9sYWJlbF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiU29DIFRlbXBlcmF0dXJlXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgdGVtcDFfY3JpdGljYWxfYWxhcm1fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2ICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBjdHgtPnRlbXBfY3JpdGljYWxfYWxhcm0pOworfQorCitzdGF0aWMgc3NpemVfdCBwb3dlcjFfbGFiZWxfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiQ1BVIHBvd2VyXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgcG93ZXIyX2xhYmVsX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIklPIHBvd2VyXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgcG93ZXIxX2lucHV0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUzMiB2YWw7CisJaW50IHJjOworCisJcmMgPSB4Z2VuZV9od21vbl9nZXRfY3B1X3B3cihjdHgsICZ2YWwpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCBtV0FUVF9UT191V0FUVCh2YWwpKTsKK30KKworc3RhdGljIHNzaXplX3QgcG93ZXIyX2lucHV0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUzMiB2YWw7CisJaW50IHJjOworCisJcmMgPSB4Z2VuZV9od21vbl9nZXRfaW9fcHdyKGN0eCwgJnZhbCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIG1XQVRUX1RPX3VXQVRUKHZhbCkpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFJfUk8odGVtcDFfbGFiZWwpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHRlbXAxX2lucHV0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyh0ZW1wMV9jcml0aWNhbF9hbGFybSk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocG93ZXIxX2xhYmVsKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwb3dlcjFfaW5wdXQpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHBvd2VyMl9sYWJlbCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocG93ZXIyX2lucHV0KTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnhnZW5lX2h3bW9uX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3RlbXAxX2xhYmVsLmF0dHIsCisJJmRldl9hdHRyX3RlbXAxX2lucHV0LmF0dHIsCisJJmRldl9hdHRyX3RlbXAxX2NyaXRpY2FsX2FsYXJtLmF0dHIsCisJJmRldl9hdHRyX3Bvd2VyMV9sYWJlbC5hdHRyLAorCSZkZXZfYXR0cl9wb3dlcjFfaW5wdXQuYXR0ciwKKwkmZGV2X2F0dHJfcG93ZXIyX2xhYmVsLmF0dHIsCisJJmRldl9hdHRyX3Bvd2VyMl9pbnB1dC5hdHRyLAorCU5VTEwsCit9OworCitBVFRSSUJVVEVfR1JPVVBTKHhnZW5lX2h3bW9uKTsKKworc3RhdGljIGludCB4Z2VuZV9od21vbl90cGNfYWxhcm0oc3RydWN0IHhnZW5lX2h3bW9uX2RldiAqY3R4LAorCQkJCSBzdHJ1Y3Qgc2xpbXByb19yZXNwX21zZyAqYW1zZykKK3sKKwljdHgtPnRlbXBfY3JpdGljYWxfYWxhcm0gPSAhIWFtc2ctPnBhcmFtMjsKKwlzeXNmc19ub3RpZnkoJmN0eC0+ZGV2LT5rb2JqLCBOVUxMLCAidGVtcDFfY3JpdGljYWxfYWxhcm0iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4Z2VuZV9od21vbl9wcm9jZXNzX3B3cm1zZyhzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2ICpjdHgsCisJCQkJICAgICAgIHN0cnVjdCBzbGltcHJvX3Jlc3BfbXNnICphbXNnKQoreworCWlmICgoTVNHX1NVQlRZUEUoYW1zZy0+bXNnKSA9PSBQV1JNR01UX1NVQlRZUEVfVFBDKSAmJgorCSAgICAoVFBDX0NNRChhbXNnLT5tc2cpID09IFRQQ19BTEFSTSkpCisJCXhnZW5lX2h3bW9uX3RwY19hbGFybShjdHgsIGFtc2cpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBhc3luYyB3b3JrIHF1ZXVlCisgKi8KK3N0YXRpYyB2b2lkIHhnZW5lX2h3bW9uX2V2dF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc2xpbXByb19yZXNwX21zZyBhbXNnOworCXN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eDsKKwlpbnQgcmV0OworCisJY3R4ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB4Z2VuZV9od21vbl9kZXYsIHdvcmtxKTsKKwl3aGlsZSAoa2ZpZm9fb3V0X3NwaW5sb2NrZWQoJmN0eC0+YXN5bmNfbXNnX2ZpZm8sICZhbXNnLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNsaW1wcm9fcmVzcF9tc2cpLAorCQkJCSAgICAmY3R4LT5rZmlmb19sb2NrKSkgeworCQkvKgorCQkgKiBJZiBQQ0MsIHNlbmQgYSBjb25zdW1lciBjb21tYW5kIHRvIFBsYXRmb3JtIHRvIGdldCBpbmZvCisJCSAqIElmIFNsaW1wcm8gTWFpbGJveCwgZ2V0IG1lc3NhZ2UgZnJvbSBzcGVjaWZpYyBGSUZPCisJCSAqLworCQlpZiAoIWFjcGlfZGlzYWJsZWQpIHsKKwkJCXJldCA9IHhnZW5lX2h3bW9uX2dldF9ub3RpZmljYXRpb25fbXNnKGN0eCwKKwkJCQkJCQkgICAgICAgKHUzMiAqKSZhbXNnKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKE1TR19UWVBFKGFtc2cubXNnKSA9PSBNU0dfVFlQRV9QV1JNR01UKQorCQkJeGdlbmVfaHdtb25fcHJvY2Vzc19wd3Jtc2coY3R4LCAmYW1zZyk7CisJfQorfQorCitzdGF0aWMgaW50IHhnZW5lX2h3bW9uX3J4X3JlYWR5KHN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCwgdm9pZCAqbXNnKQoreworCWlmIChJU19FUlJfT1JfTlVMTChjdHgtPmh3bW9uX2RldikgJiYgIWN0eC0+cmVzcF9wZW5kaW5nKSB7CisJCS8qIEVucXVldWUgdG8gdGhlIEZJRk8gKi8KKwkJa2ZpZm9faW5fc3BpbmxvY2tlZCgmY3R4LT5hc3luY19tc2dfZmlmbywgbXNnLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNsaW1wcm9fcmVzcF9tc2cpLAorCQkJCSAgICAmY3R4LT5rZmlmb19sb2NrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBTTElNcHJvIE1haWxib3ggcmVjZWl2ZWQgYSBtZXNzYWdlCisgKi8KK3N0YXRpYyB2b2lkIHhnZW5lX2h3bW9uX3J4X2NiKHN0cnVjdCBtYm94X2NsaWVudCAqY2wsIHZvaWQgKm1zZykKK3sKKwlzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2ICpjdHggPSB0b194Z2VuZV9od21vbl9kZXYoY2wpOworCisJLyoKKwkgKiBXaGlsZSB0aGUgZHJpdmVyIHJlZ2lzdGVycyB3aXRoIHRoZSBtYWlsYm94IGZyYW1ld29yaywgYW4gaW50ZXJydXB0CisJICogY2FuIGJlIHBlbmRpbmcgYmVmb3JlIHRoZSBwcm9iZSBmdW5jdGlvbiBjb21wbGV0ZXMgaXRzCisJICogaW5pdGlhbGl6YXRpb24uIElmIHN1Y2ggY29uZGl0aW9uIG9jY3VycywganVzdCBxdWV1ZSB1cCB0aGUgbWVzc2FnZQorCSAqIGFzIHRoZSBkcml2ZXIgaXMgbm90IHJlYWR5IGZvciBzZXJ2aWNpbmcgdGhlIGNhbGxiYWNrLgorCSAqLworCWlmICh4Z2VuZV9od21vbl9yeF9yZWFkeShjdHgsIG1zZykgPCAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFJlc3BvbnNlIG1lc3NhZ2UgZm9ybWF0OgorCSAqIG1zZ1swXSBpcyB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlIG9wZXJhdGlvbgorCSAqIG1zZ1sxXSBpcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHdvcmQKKwkgKiBtc2dbMl0gaXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd29yZAorCSAqCisJICogQXMgbWVzc2FnZSBvbmx5IHN1cHBvcnRzIGR3b3JkIHNpemUsIGp1c3QgYXNzaWduIGl0LgorCSAqLworCisJLyogQ2hlY2sgZm9yIHN5bmMgcXVlcnkgKi8KKwlpZiAoY3R4LT5yZXNwX3BlbmRpbmcgJiYKKwkgICAgKChNU0dfVFlQRSgoKHUzMiAqKW1zZylbMF0pID09IE1TR19UWVBFX0VSUikgfHwKKwkgICAgIChNU0dfVFlQRSgoKHUzMiAqKW1zZylbMF0pID09IE1TR19UWVBFX0RCRyAmJgorCSAgICAgIE1TR19TVUJUWVBFKCgodTMyICopbXNnKVswXSkgPT0gREJHX1NVQlRZUEVfU0VOU09SX1JFQUQpIHx8CisJICAgICAoTVNHX1RZUEUoKCh1MzIgKiltc2cpWzBdKSA9PSBNU0dfVFlQRV9QV1JNR01UICYmCisJICAgICAgTVNHX1NVQlRZUEUoKCh1MzIgKiltc2cpWzBdKSA9PSBQV1JNR01UX1NVQlRZUEVfVFBDICYmCisJICAgICAgVFBDX0NNRCgoKHUzMiAqKW1zZylbMF0pID09IFRQQ19BTEFSTSkpKSB7CisJCWN0eC0+c3luY19tc2cubXNnID0gKCh1MzIgKiltc2cpWzBdOworCQljdHgtPnN5bmNfbXNnLnBhcmFtMSA9ICgodTMyICopbXNnKVsxXTsKKwkJY3R4LT5zeW5jX21zZy5wYXJhbTIgPSAoKHUzMiAqKW1zZylbMl07CisKKwkJLyogT3BlcmF0aW9uIHdhaXRpbmcgZm9yIHJlc3BvbnNlICovCisJCWNvbXBsZXRlKCZjdHgtPnJkX2NvbXBsZXRlKTsKKworCQlyZXR1cm47CisJfQorCisJLyogRW5xdWV1ZSB0byB0aGUgRklGTyAqLworCWtmaWZvX2luX3NwaW5sb2NrZWQoJmN0eC0+YXN5bmNfbXNnX2ZpZm8sIG1zZywKKwkJCSAgICBzaXplb2Yoc3RydWN0IHNsaW1wcm9fcmVzcF9tc2cpLCAmY3R4LT5rZmlmb19sb2NrKTsKKwkvKiBTY2hlZHVsZSB0aGUgYm90dG9tIGhhbmRsZXIgKi8KKwlzY2hlZHVsZV93b3JrKCZjdHgtPndvcmtxKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIFBDQyBNYWlsYm94IHJlY2VpdmVkIGEgbWVzc2FnZQorICovCitzdGF0aWMgdm9pZCB4Z2VuZV9od21vbl9wY2NfcnhfY2Ioc3RydWN0IG1ib3hfY2xpZW50ICpjbCwgdm9pZCAqbXNnKQoreworCXN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCA9IHRvX3hnZW5lX2h3bW9uX2RldihjbCk7CisJc3RydWN0IGFjcGlfcGNjdF9zaGFyZWRfbWVtb3J5ICpnZW5lcmljX2NvbW1fYmFzZSA9IGN0eC0+cGNjX2NvbW1fYWRkcjsKKwlzdHJ1Y3Qgc2xpbXByb19yZXNwX21zZyBhbXNnOworCisJLyoKKwkgKiBXaGlsZSB0aGUgZHJpdmVyIHJlZ2lzdGVycyB3aXRoIHRoZSBtYWlsYm94IGZyYW1ld29yaywgYW4gaW50ZXJydXB0CisJICogY2FuIGJlIHBlbmRpbmcgYmVmb3JlIHRoZSBwcm9iZSBmdW5jdGlvbiBjb21wbGV0ZXMgaXRzCisJICogaW5pdGlhbGl6YXRpb24uIElmIHN1Y2ggY29uZGl0aW9uIG9jY3VycywganVzdCBxdWV1ZSB1cCB0aGUgbWVzc2FnZQorCSAqIGFzIHRoZSBkcml2ZXIgaXMgbm90IHJlYWR5IGZvciBzZXJ2aWNpbmcgdGhlIGNhbGxiYWNrLgorCSAqLworCWlmICh4Z2VuZV9od21vbl9yeF9yZWFkeShjdHgsICZhbXNnKSA8IDApCisJCXJldHVybjsKKworCW1zZyA9IGdlbmVyaWNfY29tbV9iYXNlICsgMTsKKwkvKiBDaGVjayBpZiBwbGF0Zm9ybSBzZW5kcyBpbnRlcnJ1cHQgKi8KKwlpZiAoIXhnZW5lX3dvcmRfdHN0X2FuZF9jbHIoJmdlbmVyaWNfY29tbV9iYXNlLT5zdGF0dXMsCisJCQkJICAgIFBDQ1NfU0NJX0RPT1JCRUwpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFJlc3BvbnNlIG1lc3NhZ2UgZm9ybWF0OgorCSAqIG1zZ1swXSBpcyB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlIG9wZXJhdGlvbgorCSAqIG1zZ1sxXSBpcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHdvcmQKKwkgKiBtc2dbMl0gaXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd29yZAorCSAqCisJICogQXMgbWVzc2FnZSBvbmx5IHN1cHBvcnRzIGR3b3JkIHNpemUsIGp1c3QgYXNzaWduIGl0LgorCSAqLworCisJLyogQ2hlY2sgZm9yIHN5bmMgcXVlcnkgKi8KKwlpZiAoY3R4LT5yZXNwX3BlbmRpbmcgJiYKKwkgICAgKChNU0dfVFlQRSgoKHUzMiAqKW1zZylbMF0pID09IE1TR19UWVBFX0VSUikgfHwKKwkgICAgIChNU0dfVFlQRSgoKHUzMiAqKW1zZylbMF0pID09IE1TR19UWVBFX0RCRyAmJgorCSAgICAgIE1TR19TVUJUWVBFKCgodTMyICopbXNnKVswXSkgPT0gREJHX1NVQlRZUEVfU0VOU09SX1JFQUQpIHx8CisJICAgICAoTVNHX1RZUEUoKCh1MzIgKiltc2cpWzBdKSA9PSBNU0dfVFlQRV9QV1JNR01UICYmCisJICAgICAgTVNHX1NVQlRZUEUoKCh1MzIgKiltc2cpWzBdKSA9PSBQV1JNR01UX1NVQlRZUEVfVFBDICYmCisJICAgICAgVFBDX0NNRCgoKHUzMiAqKW1zZylbMF0pID09IFRQQ19BTEFSTSkpKSB7CisJCS8qIENoZWNrIGlmIHBsYXRmb3JtIGNvbXBsZXRlcyBjb21tYW5kICovCisJCWlmICh4Z2VuZV93b3JkX3RzdF9hbmRfY2xyKCZnZW5lcmljX2NvbW1fYmFzZS0+c3RhdHVzLAorCQkJCQkgICBQQ0NTX0NNRF9DT01QTEVURSkpIHsKKwkJCWN0eC0+c3luY19tc2cubXNnID0gKCh1MzIgKiltc2cpWzBdOworCQkJY3R4LT5zeW5jX21zZy5wYXJhbTEgPSAoKHUzMiAqKW1zZylbMV07CisJCQljdHgtPnN5bmNfbXNnLnBhcmFtMiA9ICgodTMyICopbXNnKVsyXTsKKworCQkJLyogT3BlcmF0aW9uIHdhaXRpbmcgZm9yIHJlc3BvbnNlICovCisJCQljb21wbGV0ZSgmY3R4LT5yZF9jb21wbGV0ZSk7CisKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qCisJICogUGxhdGZvcm0gbm90aWZpZXMgaW50ZXJydXB0IHRvIE9TUE0uCisJICogT1BTTSBzY2hlZHVsZXMgYSBjb25zdW1lciBjb21tYW5kIHRvIGdldCB0aGlzIGluZm9ybWF0aW9uCisJICogaW4gYSB3b3JrcXVldWUuIFBsYXRmb3JtIG11c3Qgd2FpdCB1bnRpbCBPU1BNIGhhcyBpc3N1ZWQKKwkgKiBhIGNvbnN1bWVyIGNvbW1hbmQgdGhhdCBzZXJ2ZXMgdGhpcyBub3RpZmljYXRpb24uCisJICovCisKKwkvKiBFbnF1ZXVlIHRvIHRoZSBGSUZPICovCisJa2ZpZm9faW5fc3BpbmxvY2tlZCgmY3R4LT5hc3luY19tc2dfZmlmbywgJmFtc2csCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzbGltcHJvX3Jlc3BfbXNnKSwgJmN0eC0+a2ZpZm9fbG9jayk7CisJLyogU2NoZWR1bGUgdGhlIGJvdHRvbSBoYW5kbGVyICovCisJc2NoZWR1bGVfd29yaygmY3R4LT53b3JrcSk7Cit9CisKK3N0YXRpYyB2b2lkIHhnZW5lX2h3bW9uX3R4X2RvbmUoc3RydWN0IG1ib3hfY2xpZW50ICpjbCwgdm9pZCAqbXNnLCBpbnQgcmV0KQoreworCWlmIChyZXQpIHsKKwkJZGV2X2RiZyhjbC0+ZGV2LCAiVFggZGlkIG5vdCBjb21wbGV0ZTogQ01EIHNlbnQ6JXgsIHJldDolZFxuIiwKKwkJCSoodTE2ICopbXNnLCByZXQpOworCX0gZWxzZSB7CisJCWRldl9kYmcoY2wtPmRldiwgIlRYIGNvbXBsZXRlZC4gQ01EIHNlbnQ6JXgsIHJldDolZFxuIiwKKwkJCSoodTE2ICopbXNnLCByZXQpOworCX0KK30KKworc3RhdGljIGludCB4Z2VuZV9od21vbl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eDsKKwlzdHJ1Y3QgbWJveF9jbGllbnQgKmNsOworCWludCByYzsKKworCWN0eCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpOworCWlmICghY3R4KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWN0eC0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjdHgpOworCWNsID0gJmN0eC0+bWJveF9jbGllbnQ7CisKKwlzcGluX2xvY2tfaW5pdCgmY3R4LT5rZmlmb19sb2NrKTsKKwltdXRleF9pbml0KCZjdHgtPnJkX211dGV4KTsKKworCXJjID0ga2ZpZm9fYWxsb2MoJmN0eC0+YXN5bmNfbXNnX2ZpZm8sCisJCQkgc2l6ZW9mKHN0cnVjdCBzbGltcHJvX3Jlc3BfbXNnKSAqIEFTWU5DX01TR19GSUZPX1NJWkUsCisJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9tYm94X2ZyZWU7CisKKwlJTklUX1dPUksoJmN0eC0+d29ya3EsIHhnZW5lX2h3bW9uX2V2dF93b3JrKTsKKworCS8qIFJlcXVlc3QgbWFpbGJveCBjaGFubmVsICovCisJY2wtPmRldiA9ICZwZGV2LT5kZXY7CisJY2wtPnR4X2RvbmUgPSB4Z2VuZV9od21vbl90eF9kb25lOworCWNsLT50eF9ibG9jayA9IGZhbHNlOworCWNsLT50eF90b3V0ID0gTUJPWF9PUF9USU1FT1VUTVM7CisJY2wtPmtub3dzX3R4ZG9uZSA9IGZhbHNlOworCWlmIChhY3BpX2Rpc2FibGVkKSB7CisJCWNsLT5yeF9jYWxsYmFjayA9IHhnZW5lX2h3bW9uX3J4X2NiOworCQljdHgtPm1ib3hfY2hhbiA9IG1ib3hfcmVxdWVzdF9jaGFubmVsKGNsLCAwKTsKKwkJaWYgKElTX0VSUihjdHgtPm1ib3hfY2hhbikpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiU0xJTXBybyBtYWlsYm94IGNoYW5uZWwgcmVxdWVzdCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgYWNwaV9wY2N0X2h3X3JlZHVjZWQgKmNwcGNfc3M7CisKKwkJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMigmcGRldi0+ZGV2LCAicGNjLWNoYW5uZWwiLAorCQkJCQkgICAgICZjdHgtPm1ib3hfaWR4KSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gcGNjLWNoYW5uZWwgcHJvcGVydHlcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQljbC0+cnhfY2FsbGJhY2sgPSB4Z2VuZV9od21vbl9wY2NfcnhfY2I7CisJCWN0eC0+bWJveF9jaGFuID0gcGNjX21ib3hfcmVxdWVzdF9jaGFubmVsKGNsLCBjdHgtPm1ib3hfaWR4KTsKKwkJaWYgKElTX0VSUihjdHgtPm1ib3hfY2hhbikpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiUFBDIGNoYW5uZWwgcmVxdWVzdCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQkvKgorCQkgKiBUaGUgUENDIG1haWxib3ggY29udHJvbGxlciBkcml2ZXIgc2hvdWxkCisJCSAqIGhhdmUgcGFyc2VkIHRoZSBQQ0NUIChnbG9iYWwgdGFibGUgb2YgYWxsCisJCSAqIFBDQyBjaGFubmVscykgYW5kIHN0b3JlZCBwb2ludGVycyB0byB0aGUKKwkJICogc3Vic3BhY2UgY29tbXVuaWNhdGlvbiByZWdpb24gaW4gY29uX3ByaXYuCisJCSAqLworCQljcHBjX3NzID0gY3R4LT5tYm94X2NoYW4tPmNvbl9wcml2OworCQlpZiAoIWNwcGNfc3MpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIlBQQyBzdWJzcGFjZSBub3QgZm91bmRcbiIpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBvdXRfbWJveF9mcmVlOworCQl9CisKKwkJaWYgKCFjdHgtPm1ib3hfY2hhbi0+bWJveC0+dHhkb25lX2lycSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiUENDIElSUSBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0X21ib3hfZnJlZTsKKwkJfQorCisJCS8qCisJCSAqIFRoaXMgaXMgdGhlIHNoYXJlZCBjb21tdW5pY2F0aW9uIHJlZ2lvbgorCQkgKiBmb3IgdGhlIE9TIGFuZCBQbGF0Zm9ybSB0byBjb21tdW5pY2F0ZSBvdmVyLgorCQkgKi8KKwkJY3R4LT5jb21tX2Jhc2VfYWRkciA9IGNwcGNfc3MtPmJhc2VfYWRkcmVzczsKKwkJaWYgKGN0eC0+Y29tbV9iYXNlX2FkZHIpIHsKKwkJCWN0eC0+cGNjX2NvbW1fYWRkciA9IG1lbXJlbWFwKGN0eC0+Y29tbV9iYXNlX2FkZHIsCisJCQkJCQkJY3BwY19zcy0+bGVuZ3RoLAorCQkJCQkJCU1FTVJFTUFQX1dCKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgUENDIGNvbW0gcmVnaW9uXG4iKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0X21ib3hfZnJlZTsKKwkJfQorCisJCWlmICghY3R4LT5wY2NfY29tbV9hZGRyKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkZhaWxlZCB0byBpb3JlbWFwIFBDQyBjb21tIHJlZ2lvblxuIik7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9tYm94X2ZyZWU7CisJCX0KKworCQkvKgorCQkgKiBjcHBjX3NzLT5sYXRlbmN5IGlzIGp1c3QgYSBOb21pbmFsIHZhbHVlLiBJbiByZWFsaXR5CisJCSAqIHRoZSByZW1vdGUgcHJvY2Vzc29yIGNvdWxkIGJlIG11Y2ggc2xvd2VyIHRvIHJlcGx5LgorCQkgKiBTbyBhZGQgYW4gYXJiaXRyYXJ5IGFtb3VudCBvZiB3YWl0IG9uIHRvcCBvZiBOb21pbmFsLgorCQkgKi8KKwkJY3R4LT51c2Vjc19sYXQgPSBQQ0NfTlVNX1JFVFJJRVMgKiBjcHBjX3NzLT5sYXRlbmN5OworCX0KKworCWN0eC0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGN0eC0+ZGV2LAorCQkJCQkJCSAgICJhcG1feGdlbmUiLAorCQkJCQkJCSAgIGN0eCwKKwkJCQkJCQkgICB4Z2VuZV9od21vbl9ncm91cHMpOworCWlmIChJU19FUlIoY3R4LT5od21vbl9kZXYpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBIVyBtb25pdG9yIGRldmljZVxuIik7CisJCXJjID0gUFRSX0VSUihjdHgtPmh3bW9uX2Rldik7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogU2NoZWR1bGUgdGhlIGJvdHRvbSBoYW5kbGVyIGlmIHRoZXJlIGlzIGEgcGVuZGluZyBtZXNzYWdlLgorCSAqLworCXNjaGVkdWxlX3dvcmsoJmN0eC0+d29ya3EpOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkFQTSBYLUdlbmUgU29DIEhXIG1vbml0b3IgZHJpdmVyIHJlZ2lzdGVyZWRcbiIpOworCisJcmV0dXJuIDA7CisKK291dDoKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJbWJveF9mcmVlX2NoYW5uZWwoY3R4LT5tYm94X2NoYW4pOworCWVsc2UKKwkJcGNjX21ib3hfZnJlZV9jaGFubmVsKGN0eC0+bWJveF9jaGFuKTsKK291dF9tYm94X2ZyZWU6CisJa2ZpZm9fZnJlZSgmY3R4LT5hc3luY19tc2dfZmlmbyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfaHdtb25fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHhnZW5lX2h3bW9uX2RldiAqY3R4ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihjdHgtPmh3bW9uX2Rldik7CisJa2ZpZm9fZnJlZSgmY3R4LT5hc3luY19tc2dfZmlmbyk7CisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCW1ib3hfZnJlZV9jaGFubmVsKGN0eC0+bWJveF9jaGFuKTsKKwllbHNlCisJCXBjY19tYm94X2ZyZWVfY2hhbm5lbChjdHgtPm1ib3hfY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19BQ1BJCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHhnZW5lX2h3bW9uX2FjcGlfbWF0Y2hbXSA9IHsKKwl7IkFQTUMwRDI5IiwgMH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCB4Z2VuZV9od21vbl9hY3BpX21hdGNoKTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB4Z2VuZV9od21vbl9vZl9tYXRjaFtdID0geworCXsuY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtc2xpbXByby1od21vbiJ9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgeGdlbmVfaHdtb25fb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB4Z2VuZV9od21vbl9kcml2ZXIgX19yZWZkYXRhID0geworCS5wcm9iZSA9IHhnZW5lX2h3bW9uX3Byb2JlLAorCS5yZW1vdmUgPSB4Z2VuZV9od21vbl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAieGdlbmUtc2xpbXByby1od21vbiIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHhnZW5lX2h3bW9uX29mX21hdGNoLAorCQkuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKHhnZW5lX2h3bW9uX2FjcGlfbWF0Y2gpLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih4Z2VuZV9od21vbl9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFQTSBYLUdlbmUgU29DIGhhcmR3YXJlIG1vbml0b3IiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRiMTAuYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRiMTAuYwppbmRleCA0ZDIwYjBiLi5kNzMyNWM2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldGIxMC5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRiMTAuYwpAQCAtMTg0LDggKzE4NCw3IEBACiAKIAlpZiAoY29yZXNpZ2h0X3RpbWVvdXQoZHJ2ZGF0YS0+YmFzZSwgRVRCX0ZGQ1IsIEVUQl9GRkNSX0JJVCwgMCkpIHsKIAkJZGV2X2VycihkcnZkYXRhLT5kZXYsCi0JCQkidGltZW91dCBvYnNlcnZlZCB3aGVuIHByb2JpbmcgYXQgb2Zmc2V0ICUjeFxuIiwKLQkJCUVUQl9GRkNSKTsKKwkJInRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgY29tcGxldGlvbiBvZiBNYW51YWwgRmx1c2hcbiIpOwogCX0KIAogCS8qIGRpc2FibGUgdHJhY2UgY2FwdHVyZSAqLwpAQCAtMTkzLDggKzE5Miw3IEBACiAKIAlpZiAoY29yZXNpZ2h0X3RpbWVvdXQoZHJ2ZGF0YS0+YmFzZSwgRVRCX0ZGU1IsIEVUQl9GRlNSX0JJVCwgMSkpIHsKIAkJZGV2X2VycihkcnZkYXRhLT5kZXYsCi0JCQkidGltZW91dCBvYnNlcnZlZCB3aGVuIHByb2JpbmcgYXQgb2Zmc2V0ICUjeFxuIiwKLQkJCUVUQl9GRkNSKTsKKwkJCSJ0aW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIEZvcm1hdHRlciB0byBTdG9wXG4iKTsKIAl9CiAKIAlDU19MT0NLKGRydmRhdGEtPmJhc2UpOwpAQCAtNTYxLDcgKzU1OSw3IEBACiB9OwogCiAjZGVmaW5lIGNvcmVzaWdodF9ldGIxMF9zaW1wbGVfZnVuYyhuYW1lLCBvZmZzZXQpICAgICAgICAgICAgICAgICAgICAgICBcCi0JY29yZXNpZ2h0X3NpbXBsZV9mdW5jKHN0cnVjdCBldGJfZHJ2ZGF0YSwgbmFtZSwgb2Zmc2V0KQorCWNvcmVzaWdodF9zaW1wbGVfZnVuYyhzdHJ1Y3QgZXRiX2RydmRhdGEsIE5VTEwsIG5hbWUsIG9mZnNldCkKIAogY29yZXNpZ2h0X2V0YjEwX3NpbXBsZV9mdW5jKHJkcCwgRVRCX1JBTV9ERVBUSF9SRUcpOwogY29yZXNpZ2h0X2V0YjEwX3NpbXBsZV9mdW5jKHN0cywgRVRCX1NUQVRVU19SRUcpOwpAQCAtNjM4LDcgKzYzNiw3IEBACiAJc3RydWN0IGNvcmVzaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IGV0Yl9kcnZkYXRhICpkcnZkYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmFkZXYtPnJlczsKLQlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgKmRlc2M7CisJc3RydWN0IGNvcmVzaWdodF9kZXNjIGRlc2MgPSB7IDAgfTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gYWRldi0+ZGV2Lm9mX25vZGU7CiAKIAlpZiAobnApIHsKQEAgLTY4NCwxNyArNjgyLDEzIEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWRlc2MgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRlc2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRlc2MpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZGVzYy0+dHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9TSU5LOwotCWRlc2MtPnN1YnR5cGUuc2lua19zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX1NJTktfQlVGRkVSOwotCWRlc2MtPm9wcyA9ICZldGJfY3Nfb3BzOwotCWRlc2MtPnBkYXRhID0gcGRhdGE7Ci0JZGVzYy0+ZGV2ID0gZGV2OwotCWRlc2MtPmdyb3VwcyA9IGNvcmVzaWdodF9ldGJfZ3JvdXBzOwotCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKGRlc2MpOworCWRlc2MudHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9TSU5LOworCWRlc2Muc3VidHlwZS5zaW5rX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU0lOS19CVUZGRVI7CisJZGVzYy5vcHMgPSAmZXRiX2NzX29wczsKKwlkZXNjLnBkYXRhID0gcGRhdGE7CisJZGVzYy5kZXYgPSBkZXY7CisJZGVzYy5ncm91cHMgPSBjb3Jlc2lnaHRfZXRiX2dyb3VwczsKKwlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcigmZGVzYyk7CiAJaWYgKElTX0VSUihkcnZkYXRhLT5jc2RldikpCiAJCXJldHVybiBQVFJfRVJSKGRydmRhdGEtPmNzZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0tcGVyZi5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0tcGVyZi5jCmluZGV4IDc1NTEyNWYuLjJjZDdjNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtLXBlcmYuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bS1wZXJmLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCisjaW5jbHVkZSAiY29yZXNpZ2h0LWV0bS1wZXJmLmgiCiAjaW5jbHVkZSAiY29yZXNpZ2h0LXByaXYuaCIKIAogc3RhdGljIHN0cnVjdCBwbXUgZXRtX3BtdTsKQEAgLTcxLDE0ICs3Miw0OCBAQAogCiBzdGF0aWMgdm9pZCBldG1fZXZlbnRfcmVhZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpIHt9CiAKLXN0YXRpYyBpbnQgZXRtX2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQorc3RhdGljIGludCBldG1fYWRkcl9maWx0ZXJzX2FsbG9jKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKLQlpZiAoZXZlbnQtPmF0dHIudHlwZSAhPSBldG1fcG11LnR5cGUpCi0JCXJldHVybiAtRU5PRU5UOworCXN0cnVjdCBldG1fZmlsdGVycyAqZmlsdGVyczsKKwlpbnQgbm9kZSA9IGV2ZW50LT5jcHUgPT0gLTEgPyAtMSA6IGNwdV90b19ub2RlKGV2ZW50LT5jcHUpOworCisJZmlsdGVycyA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGV0bV9maWx0ZXJzKSwgR0ZQX0tFUk5FTCwgbm9kZSk7CisJaWYgKCFmaWx0ZXJzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChldmVudC0+cGFyZW50KQorCQltZW1jcHkoZmlsdGVycywgZXZlbnQtPnBhcmVudC0+aHcuYWRkcl9maWx0ZXJzLAorCQkgICAgICAgc2l6ZW9mKCpmaWx0ZXJzKSk7CisKKwlldmVudC0+aHcuYWRkcl9maWx0ZXJzID0gZmlsdGVyczsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBldG1fZXZlbnRfZGVzdHJveShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJa2ZyZWUoZXZlbnQtPmh3LmFkZHJfZmlsdGVycyk7CisJZXZlbnQtPmh3LmFkZHJfZmlsdGVycyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZXRtX2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCWludCByZXQgPSAwOworCisJaWYgKGV2ZW50LT5hdHRyLnR5cGUgIT0gZXRtX3BtdS50eXBlKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGV0bV9hZGRyX2ZpbHRlcnNfYWxsb2MoZXZlbnQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJZXZlbnQtPmRlc3Ryb3kgPSBldG1fZXZlbnRfZGVzdHJveTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgdm9pZCBmcmVlX2V2ZW50X2RhdGEoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCWludCBjcHU7CkBAIC0xMDAsNyArMTM1LDcgQEAKIAl9CiAKIAlmb3JfZWFjaF9jcHUoY3B1LCBtYXNrKSB7Ci0JCWlmIChldmVudF9kYXRhLT5wYXRoW2NwdV0pCisJCWlmICghKElTX0VSUl9PUl9OVUxMKGV2ZW50X2RhdGEtPnBhdGhbY3B1XSkpKQogCQkJY29yZXNpZ2h0X3JlbGVhc2VfcGF0aChldmVudF9kYXRhLT5wYXRoW2NwdV0pOwogCX0KIApAQCAtMTg1LDcgKzIyMCw3IEBACiAJCSAqIHJlZmVyZW5jZWQgbGF0ZXIgd2hlbiB0aGUgcGF0aCBpcyBhY3R1YWxseSBuZWVkZWQuCiAJCSAqLwogCQlldmVudF9kYXRhLT5wYXRoW2NwdV0gPSBjb3Jlc2lnaHRfYnVpbGRfcGF0aChjc2Rldik7Ci0JCWlmICghZXZlbnRfZGF0YS0+cGF0aFtjcHVdKQorCQlpZiAoSVNfRVJSKGV2ZW50X2RhdGEtPnBhdGhbY3B1XSkpCiAJCQlnb3RvIGVycjsKIAl9CiAKQEAgLTI1OCw3ICsyOTMsNyBAQAogCWV2ZW50LT5ody5zdGF0ZSA9IDA7CiAKIAkvKiBGaW5hbGx5IGVuYWJsZSB0aGUgdHJhY2VyICovCi0JaWYgKHNvdXJjZV9vcHMoY3NkZXYpLT5lbmFibGUoY3NkZXYsICZldmVudC0+YXR0ciwgQ1NfTU9ERV9QRVJGKSkKKwlpZiAoc291cmNlX29wcyhjc2RldiktPmVuYWJsZShjc2RldiwgZXZlbnQsIENTX01PREVfUEVSRikpCiAJCWdvdG8gZmFpbF9lbmRfc3RvcDsKIAogb3V0OgpAQCAtMjkxLDcgKzMyNiw3IEBACiAJCXJldHVybjsKIAogCS8qIHN0b3AgdHJhY2VyICovCi0Jc291cmNlX29wcyhjc2RldiktPmRpc2FibGUoY3NkZXYpOworCXNvdXJjZV9vcHMoY3NkZXYpLT5kaXNhYmxlKGNzZGV2LCBldmVudCk7CiAKIAkvKiB0ZWxsIHRoZSBjb3JlICovCiAJZXZlbnQtPmh3LnN0YXRlID0gUEVSRl9IRVNfU1RPUFBFRDsKQEAgLTM0Miw2ICszNzcsODcgQEAKIAlldG1fZXZlbnRfc3RvcChldmVudCwgUEVSRl9FRl9VUERBVEUpOwogfQogCitzdGF0aWMgaW50IGV0bV9hZGRyX2ZpbHRlcnNfdmFsaWRhdGUoc3RydWN0IGxpc3RfaGVhZCAqZmlsdGVycykKK3sKKwlib29sIHJhbmdlID0gZmFsc2UsIGFkZHJlc3MgPSBmYWxzZTsKKwlpbnQgaW5kZXggPSAwOworCXN0cnVjdCBwZXJmX2FkZHJfZmlsdGVyICpmaWx0ZXI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZpbHRlciwgZmlsdGVycywgZW50cnkpIHsKKwkJLyoKKwkJICogTm8gbmVlZCB0byBnbyBmdXJ0aGVyIGlmIHRoZXJlJ3Mgbm8gbW9yZQorCQkgKiByb29tIGZvciBmaWx0ZXJzLgorCQkgKi8KKwkJaWYgKCsraW5kZXggPiBFVE1fQUREUl9DTVBfTUFYKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJCS8qCisJCSAqIEFzIHRha2VuIGZyb20gdGhlIHN0cnVjdCBwZXJmX2FkZHJfZmlsdGVyIGRvY3VtZW50YXRpb246CisJCSAqCUByYW5nZToJMTogcmFuZ2UsIDA6IGFkZHJlc3MKKwkJICoKKwkJICogQXQgdGhpcyB0aW1lIHdlIGRvbid0IGFsbG93IHJhbmdlIGFuZCBzdGFydC9zdG9wIGZpbHRlcmluZworCQkgKiB0byBjb2hhYml0YXRlLCB0aGV5IGhhdmUgdG8gYmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorCQkgKi8KKwkJaWYgKChmaWx0ZXItPnJhbmdlID09IDEpICYmIGFkZHJlc3MpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkJaWYgKChmaWx0ZXItPnJhbmdlID09IDApICYmIHJhbmdlKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJCS8qCisJCSAqIEZvciByYW5nZSBmaWx0ZXJpbmcsIHRoZSBzZWNvbmQgYWRkcmVzcyBpbiB0aGUgYWRkcmVzcworCQkgKiByYW5nZSBjb21wYXJhdG9yIG5lZWRzIHRvIGJlIGhpZ2hlciB0aGFuIHRoZSBmaXJzdC4KKwkJICogSW52YWxpZCBvdGhlcndpc2UuCisJCSAqLworCQlpZiAoZmlsdGVyLT5yYW5nZSAmJiBmaWx0ZXItPnNpemUgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qCisJCSAqIEV2ZXJ5dGhpbmcgY2hlY2tzIG91dCB3aXRoIHRoaXMgZmlsdGVyLCByZWNvcmQgd2hhdCB3ZSd2ZQorCQkgKiByZWNlaXZlZCBiZWZvcmUgbW92aW5nIG9uIHRvIHRoZSBuZXh0IG9uZS4KKwkJICovCisJCWlmIChmaWx0ZXItPnJhbmdlKQorCQkJcmFuZ2UgPSB0cnVlOworCQllbHNlCisJCQlhZGRyZXNzID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXRtX2FkZHJfZmlsdGVyc19zeW5jKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgcGVyZl9hZGRyX2ZpbHRlcnNfaGVhZCAqaGVhZCA9IHBlcmZfZXZlbnRfYWRkcl9maWx0ZXJzKGV2ZW50KTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBzdG9wLCAqb2ZmcyA9IGV2ZW50LT5hZGRyX2ZpbHRlcnNfb2ZmczsKKwlzdHJ1Y3QgZXRtX2ZpbHRlcnMgKmZpbHRlcnMgPSBldmVudC0+aHcuYWRkcl9maWx0ZXJzOworCXN0cnVjdCBldG1fZmlsdGVyICpldG1fZmlsdGVyOworCXN0cnVjdCBwZXJmX2FkZHJfZmlsdGVyICpmaWx0ZXI7CisJaW50IGkgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmaWx0ZXIsICZoZWFkLT5saXN0LCBlbnRyeSkgeworCQlzdGFydCA9IGZpbHRlci0+b2Zmc2V0ICsgb2Zmc1tpXTsKKwkJc3RvcCA9IHN0YXJ0ICsgZmlsdGVyLT5zaXplOworCQlldG1fZmlsdGVyID0gJmZpbHRlcnMtPmV0bV9maWx0ZXJbaV07CisKKwkJaWYgKGZpbHRlci0+cmFuZ2UgPT0gMSkgeworCQkJZXRtX2ZpbHRlci0+c3RhcnRfYWRkciA9IHN0YXJ0OworCQkJZXRtX2ZpbHRlci0+c3RvcF9hZGRyID0gc3RvcDsKKwkJCWV0bV9maWx0ZXItPnR5cGUgPSBFVE1fQUREUl9UWVBFX1JBTkdFOworCQl9IGVsc2UgeworCQkJaWYgKGZpbHRlci0+ZmlsdGVyID09IDEpIHsKKwkJCQlldG1fZmlsdGVyLT5zdGFydF9hZGRyID0gc3RhcnQ7CisJCQkJZXRtX2ZpbHRlci0+dHlwZSA9IEVUTV9BRERSX1RZUEVfU1RBUlQ7CisJCQl9IGVsc2UgeworCQkJCWV0bV9maWx0ZXItPnN0b3BfYWRkciA9IHN0b3A7CisJCQkJZXRtX2ZpbHRlci0+dHlwZSA9IEVUTV9BRERSX1RZUEVfU1RPUDsKKwkJCX0KKwkJfQorCQlpKys7CisJfQorCisJZmlsdGVycy0+bnJfZmlsdGVycyA9IGk7Cit9CisKIGludCBldG1fcGVyZl9zeW1saW5rKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldiwgYm9vbCBsaW5rKQogewogCWNoYXIgZW50cnlbc2l6ZW9mKCJjcHU5OTk5OTk5IildOwpAQCAtMzcxLDE4ICs0ODcsMjEgQEAKIHsKIAlpbnQgcmV0OwogCi0JZXRtX3BtdS5jYXBhYmlsaXRpZXMJPSBQRVJGX1BNVV9DQVBfRVhDTFVTSVZFOworCWV0bV9wbXUuY2FwYWJpbGl0aWVzCQk9IFBFUkZfUE1VX0NBUF9FWENMVVNJVkU7CiAKLQlldG1fcG11LmF0dHJfZ3JvdXBzCT0gZXRtX3BtdV9hdHRyX2dyb3VwczsKLQlldG1fcG11LnRhc2tfY3R4X25yCT0gcGVyZl9zd19jb250ZXh0OwotCWV0bV9wbXUucmVhZAkJPSBldG1fZXZlbnRfcmVhZDsKLQlldG1fcG11LmV2ZW50X2luaXQJPSBldG1fZXZlbnRfaW5pdDsKLQlldG1fcG11LnNldHVwX2F1eAk9IGV0bV9zZXR1cF9hdXg7Ci0JZXRtX3BtdS5mcmVlX2F1eAk9IGV0bV9mcmVlX2F1eDsKLQlldG1fcG11LnN0YXJ0CQk9IGV0bV9ldmVudF9zdGFydDsKLQlldG1fcG11LnN0b3AJCT0gZXRtX2V2ZW50X3N0b3A7Ci0JZXRtX3BtdS5hZGQJCT0gZXRtX2V2ZW50X2FkZDsKLQlldG1fcG11LmRlbAkJPSBldG1fZXZlbnRfZGVsOworCWV0bV9wbXUuYXR0cl9ncm91cHMJCT0gZXRtX3BtdV9hdHRyX2dyb3VwczsKKwlldG1fcG11LnRhc2tfY3R4X25yCQk9IHBlcmZfc3dfY29udGV4dDsKKwlldG1fcG11LnJlYWQJCQk9IGV0bV9ldmVudF9yZWFkOworCWV0bV9wbXUuZXZlbnRfaW5pdAkJPSBldG1fZXZlbnRfaW5pdDsKKwlldG1fcG11LnNldHVwX2F1eAkJPSBldG1fc2V0dXBfYXV4OworCWV0bV9wbXUuZnJlZV9hdXgJCT0gZXRtX2ZyZWVfYXV4OworCWV0bV9wbXUuc3RhcnQJCQk9IGV0bV9ldmVudF9zdGFydDsKKwlldG1fcG11LnN0b3AJCQk9IGV0bV9ldmVudF9zdG9wOworCWV0bV9wbXUuYWRkCQkJPSBldG1fZXZlbnRfYWRkOworCWV0bV9wbXUuZGVsCQkJPSBldG1fZXZlbnRfZGVsOworCWV0bV9wbXUuYWRkcl9maWx0ZXJzX3N5bmMJPSBldG1fYWRkcl9maWx0ZXJzX3N5bmM7CisJZXRtX3BtdS5hZGRyX2ZpbHRlcnNfdmFsaWRhdGUJPSBldG1fYWRkcl9maWx0ZXJzX3ZhbGlkYXRlOworCWV0bV9wbXUubnJfYWRkcl9maWx0ZXJzCQk9IEVUTV9BRERSX0NNUF9NQVg7CiAKIAlyZXQgPSBwZXJmX3BtdV9yZWdpc3RlcigmZXRtX3BtdSwgQ09SRVNJR0hUX0VUTV9QTVVfTkFNRSwgLTEpOwogCWlmIChyZXQgPT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtLXBlcmYuaCBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtLXBlcmYuaAppbmRleCA4N2Y1YTEzLi4zZmZjOWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bS1wZXJmLmgKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0tcGVyZi5oCkBAIC0xOCw4ICsxOCw0MiBAQAogI2lmbmRlZiBfQ09SRVNJR0hUX0VUTV9QRVJGX0gKICNkZWZpbmUgX0NPUkVTSUdIVF9FVE1fUEVSRl9ICiAKKyNpbmNsdWRlICJjb3Jlc2lnaHQtcHJpdi5oIgorCiBzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZTsKIAorLyoKKyAqIEluIGJvdGggRVRNdjMgYW5kIHY0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBhZGRyZXNzIGNvbXBhcmF0b3IgaW1wbGVudGFibGUKKyAqIGlzIDguICBUaGUgYWN0dWFsIG51bWJlciBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBhbmQgd2lsbCBiZSBjaGVja2VkCisgKiB3aGVuIGZpbHRlcnMgYXJlIGFwcGxpZWQuCisgKi8KKyNkZWZpbmUgRVRNX0FERFJfQ01QX01BWAk4CisKKy8qKgorICogc3RydWN0IGV0bV9maWx0ZXIgLSBzaW5nbGUgaW5zdHJ1Y3Rpb24gcmFuZ2Ugb3Igc3RhcnQvc3RvcCBjb25maWd1cmF0aW9uLgorICogQHN0YXJ0X2FkZHI6CVRoZSBhZGRyZXNzIHRvIHN0YXJ0IHRyYWNpbmcgb24uCisgKiBAc3RvcF9hZGRyOglUaGUgYWRkcmVzcyB0byBzdG9wIHRyYWNpbmcgb24uCisgKiBAdHlwZToJSXMgdGhpcyBhIHJhbmdlIG9yIHN0YXJ0L3N0b3AgZmlsdGVyLgorICovCitzdHJ1Y3QgZXRtX2ZpbHRlciB7CisJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyOworCXVuc2lnbmVkIGxvbmcgc3RvcF9hZGRyOworCWVudW0gZXRtX2FkZHJfdHlwZSB0eXBlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZXRtX2ZpbHRlcnMgLSBzZXQgb2YgZmlsdGVycyBmb3IgYSBzZXNzaW9uCisgKiBAZXRtX2ZpbHRlcjoJQWxsIHRoZSBmaWx0ZXJzIGZvciB0aGlzIHNlc3Npb24uCisgKiBAbnJfZmlsdGVyczoJTnVtYmVyIG9mIGZpbHRlcnMKKyAqIEBzc3N0YXR1czoJU3RhdHVzIG9mIHRoZSBzdGFydC9zdG9wIGxvZ2ljLgorICovCitzdHJ1Y3QgZXRtX2ZpbHRlcnMgeworCXN0cnVjdCBldG1fZmlsdGVyCWV0bV9maWx0ZXJbRVRNX0FERFJfQ01QX01BWF07CisJdW5zaWduZWQgaW50CQlucl9maWx0ZXJzOworCWJvb2wJCQlzc3N0YXR1czsKK307CisKKwogI2lmZGVmIENPTkZJR19DT1JFU0lHSFQKIGludCBldG1fcGVyZl9zeW1saW5rKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldiwgYm9vbCBsaW5rKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0uaCBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtLmgKaW5kZXggNTE1OTdjYi4uNGExOGVlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0uaAorKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bS5oCkBAIC0yNTksMTQgKzI1OSw2IEBACiAJc3RydWN0IGV0bV9jb25maWcJCWNvbmZpZzsKIH07CiAKLWVudW0gZXRtX2FkZHJfdHlwZSB7Ci0JRVRNX0FERFJfVFlQRV9OT05FLAotCUVUTV9BRERSX1RZUEVfU0lOR0xFLAotCUVUTV9BRERSX1RZUEVfUkFOR0UsCi0JRVRNX0FERFJfVFlQRV9TVEFSVCwKLQlFVE1fQUREUl9UWVBFX1NUT1AsCi19OwotCiBzdGF0aWMgaW5saW5lIHZvaWQgZXRtX3dyaXRlbChzdHJ1Y3QgZXRtX2RydmRhdGEgKmRydmRhdGEsCiAJCQkgICAgICB1MzIgdmFsLCB1MzIgb2ZmKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0zeC1zeXNmcy5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0zeC1zeXNmcy5jCmluZGV4IDAyZDRiNjIuLmU5YjA3MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtM3gtc3lzZnMuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTN4LXN5c2ZzLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlICJjb3Jlc2lnaHQtZXRtLmgiCisjaW5jbHVkZSAiY29yZXNpZ2h0LXByaXYuaCIKIAogc3RhdGljIHNzaXplX3QgbnJfYWRkcl9jbXBfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTEyMjIsNyArMTIyMyw3IEBACiB9OwogCiAjZGVmaW5lIGNvcmVzaWdodF9ldG0zeF9zaW1wbGVfZnVuYyhuYW1lLCBvZmZzZXQpCQkJXAotCWNvcmVzaWdodF9zaW1wbGVfZnVuYyhzdHJ1Y3QgZXRtX2RydmRhdGEsIG5hbWUsIG9mZnNldCkKKwljb3Jlc2lnaHRfc2ltcGxlX2Z1bmMoc3RydWN0IGV0bV9kcnZkYXRhLCBOVUxMLCBuYW1lLCBvZmZzZXQpCiAKIGNvcmVzaWdodF9ldG0zeF9zaW1wbGVfZnVuYyhldG1jY3IsIEVUTUNDUik7CiBjb3Jlc2lnaHRfZXRtM3hfc2ltcGxlX2Z1bmMoZXRtY2NlciwgRVRNQ0NFUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTN4LmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTN4LmMKaW5kZXggMmRlNGNhZC4uM2ZlMzY4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0zeC5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtM3guYwpAQCAtMzExLDkgKzMxMSwxMCBAQAogI2RlZmluZSBFVE0zWF9TVVBQT1JURURfT1BUSU9OUyAoRVRNQ1JfQ1lDX0FDQyB8IEVUTUNSX1RJTUVTVEFNUF9FTikKIAogc3RhdGljIGludCBldG1fcGFyc2VfZXZlbnRfY29uZmlnKHN0cnVjdCBldG1fZHJ2ZGF0YSAqZHJ2ZGF0YSwKLQkJCQkgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIpCisJCQkJICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJc3RydWN0IGV0bV9jb25maWcgKmNvbmZpZyA9ICZkcnZkYXRhLT5jb25maWc7CisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciA9ICZldmVudC0+YXR0cjsKIAogCWlmICghYXR0cikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00NTksNyArNDYwLDcgQEAKIH0KIAogc3RhdGljIGludCBldG1fZW5hYmxlX3BlcmYoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2LAotCQkJICAgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0cikKKwkJCSAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgZXRtX2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoY3NkZXYtPmRldi5wYXJlbnQpOwogCkBAIC00NjcsNyArNDY4LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBDb25maWd1cmUgdGhlIHRyYWNlciBiYXNlZCBvbiB0aGUgc2Vzc2lvbidzIHNwZWNpZmljcyAqLwotCWV0bV9wYXJzZV9ldmVudF9jb25maWcoZHJ2ZGF0YSwgYXR0cik7CisJZXRtX3BhcnNlX2V2ZW50X2NvbmZpZyhkcnZkYXRhLCBldmVudCk7CiAJLyogQW5kIGVuYWJsZSBpdCAqLwogCWV0bV9lbmFibGVfaHcoZHJ2ZGF0YSk7CiAKQEAgLTUwNCw3ICs1MDUsNyBAQAogfQogCiBzdGF0aWMgaW50IGV0bV9lbmFibGUoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2LAotCQkgICAgICBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLCB1MzIgbW9kZSkKKwkJICAgICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB1MzIgbW9kZSkKIHsKIAlpbnQgcmV0OwogCXUzMiB2YWw7CkBAIC01MjEsNyArNTIyLDcgQEAKIAkJcmV0ID0gZXRtX2VuYWJsZV9zeXNmcyhjc2Rldik7CiAJCWJyZWFrOwogCWNhc2UgQ1NfTU9ERV9QRVJGOgotCQlyZXQgPSBldG1fZW5hYmxlX3BlcmYoY3NkZXYsIGF0dHIpOworCQlyZXQgPSBldG1fZW5hYmxlX3BlcmYoY3NkZXYsIGV2ZW50KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVJTlZBTDsKQEAgLTYwMSw3ICs2MDIsOCBAQAogCWRldl9pbmZvKGRydmRhdGEtPmRldiwgIkVUTSB0cmFjaW5nIGRpc2FibGVkXG4iKTsKIH0KIAotc3RhdGljIHZvaWQgZXRtX2Rpc2FibGUoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2KQorc3RhdGljIHZvaWQgZXRtX2Rpc2FibGUoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2LAorCQkJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCXUzMiBtb2RlOwogCXN0cnVjdCBldG1fZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShjc2Rldi0+ZGV2LnBhcmVudCk7CkBAIC03NTYsMTMgKzc1OCw5IEBACiAJc3RydWN0IGNvcmVzaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IGV0bV9kcnZkYXRhICpkcnZkYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmFkZXYtPnJlczsKLQlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgKmRlc2M7CisJc3RydWN0IGNvcmVzaWdodF9kZXNjIGRlc2MgPSB7IDAgfTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gYWRldi0+ZGV2Lm9mX25vZGU7CiAKLQlkZXNjID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkZXNjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXNjKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCWRydmRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRydmRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRydmRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtODI1LDEzICs4MjMsMTMgQEAKIAlldG1faW5pdF90cmFjZV9pZChkcnZkYXRhKTsKIAlldG1fc2V0X2RlZmF1bHQoJmRydmRhdGEtPmNvbmZpZyk7CiAKLQlkZXNjLT50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX1NPVVJDRTsKLQlkZXNjLT5zdWJ0eXBlLnNvdXJjZV9zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX1NPVVJDRV9QUk9DOwotCWRlc2MtPm9wcyA9ICZldG1fY3Nfb3BzOwotCWRlc2MtPnBkYXRhID0gcGRhdGE7Ci0JZGVzYy0+ZGV2ID0gZGV2OwotCWRlc2MtPmdyb3VwcyA9IGNvcmVzaWdodF9ldG1fZ3JvdXBzOwotCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKGRlc2MpOworCWRlc2MudHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9TT1VSQ0U7CisJZGVzYy5zdWJ0eXBlLnNvdXJjZV9zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX1NPVVJDRV9QUk9DOworCWRlc2Mub3BzID0gJmV0bV9jc19vcHM7CisJZGVzYy5wZGF0YSA9IHBkYXRhOworCWRlc2MuZGV2ID0gZGV2OworCWRlc2MuZ3JvdXBzID0gY29yZXNpZ2h0X2V0bV9ncm91cHM7CisJZHJ2ZGF0YS0+Y3NkZXYgPSBjb3Jlc2lnaHRfcmVnaXN0ZXIoJmRlc2MpOwogCWlmIChJU19FUlIoZHJ2ZGF0YS0+Y3NkZXYpKSB7CiAJCXJldCA9IFBUUl9FUlIoZHJ2ZGF0YS0+Y3NkZXYpOwogCQlnb3RvIGVycl9hcmNoX3N1cHBvcnRlZDsKQEAgLTg5Myw2ICs4OTEsMTEgQEAKIAkJLm1hc2sJPSAweDAwMDNmZmZmLAogCQkuZGF0YQk9ICJFVE0gMy4zIiwKIAl9LAorCXsJLyogRVRNIDMuNSAtIENvcnRleC1BNSAqLworCQkuaWQJPSAweDAwMDNiOTU1LAorCQkubWFzawk9IDB4MDAwM2ZmZmYsCisJCS5kYXRhCT0gIkVUTSAzLjUiLAorCX0sCiAJewkvKiBFVE0gMy41ICovCiAJCS5pZAk9IDB4MDAwM2I5NTYsCiAJCS5tYXNrCT0gMHgwMDAzZmZmZiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtNHgtc3lzZnMuYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtNHgtc3lzZnMuYwppbmRleCA3Yzg0MzA4Li5iOWIxZTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTR4LXN5c2ZzLmMKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG00eC1zeXNmcy5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSAiY29yZXNpZ2h0LWV0bTR4LmgiCisjaW5jbHVkZSAiY29yZXNpZ2h0LXByaXYuaCIKIAogc3RhdGljIGludCBldG00X3NldF9tb2RlX2V4Y2x1ZGUoc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGEsIGJvb2wgZXhjbHVkZSkKIHsKQEAgLTIwMzksMTUgKzIwNDAsNDIgQEAKIAlOVUxMLAogfTsKIAotI2RlZmluZSBjb3Jlc2lnaHRfZXRtNHhfc2ltcGxlX2Z1bmMobmFtZSwgb2Zmc2V0KQkJCVwKLQljb3Jlc2lnaHRfc2ltcGxlX2Z1bmMoc3RydWN0IGV0bXY0X2RydmRhdGEsIG5hbWUsIG9mZnNldCkKK3N0cnVjdCBldG12NF9yZWcgeworCXZvaWQgX19pb21lbSAqYWRkcjsKKwl1MzIgZGF0YTsKK307CiAKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNvc2xzciwgVFJDT1NMU1IpOworc3RhdGljIHZvaWQgZG9fc21wX2Nyb3NzX3JlYWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZXRtdjRfcmVnICpyZWcgPSBkYXRhOworCisJcmVnLT5kYXRhID0gcmVhZGxfcmVsYXhlZChyZWctPmFkZHIpOworfQorCitzdGF0aWMgdTMyIGV0bXY0X2Nyb3NzX3JlYWQoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCB1MzIgb2Zmc2V0KQoreworCXN0cnVjdCBldG12NF9kcnZkYXRhICpkcnZkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGV0bXY0X3JlZyByZWc7CisKKwlyZWcuYWRkciA9IGRydmRhdGEtPmJhc2UgKyBvZmZzZXQ7CisJLyoKKwkgKiBzbXAgY3Jvc3MgY2FsbCBlbnN1cmVzIHRoZSBDUFUgd2lsbCBiZSBwb3dlcmVkIHVwIGJlZm9yZQorCSAqIGFjY2Vzc2luZyB0aGUgRVRNdjQgdHJhY2UgY29yZSByZWdpc3RlcnMKKwkgKi8KKwlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoZHJ2ZGF0YS0+Y3B1LCBkb19zbXBfY3Jvc3NfcmVhZCwgJnJlZywgMSk7CisJcmV0dXJuIHJlZy5kYXRhOworfQorCisjZGVmaW5lIGNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyhuYW1lLCBvZmZzZXQpCQkJXAorCWNvcmVzaWdodF9zaW1wbGVfZnVuYyhzdHJ1Y3QgZXRtdjRfZHJ2ZGF0YSwgTlVMTCwgbmFtZSwgb2Zmc2V0KQorCisjZGVmaW5lIGNvcmVzaWdodF9ldG00eF9jcm9zc19yZWFkKG5hbWUsIG9mZnNldCkJCQlcCisJY29yZXNpZ2h0X3NpbXBsZV9mdW5jKHN0cnVjdCBldG12NF9kcnZkYXRhLCBldG12NF9jcm9zc19yZWFkLAlcCisJCQkgICAgICBuYW1lLCBvZmZzZXQpCisKIGNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNwZGNyLCBUUkNQRENSKTsKIGNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNwZHNyLCBUUkNQRFNSKTsKIGNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNsc3IsIFRSQ0xTUik7Ci1jb3Jlc2lnaHRfZXRtNHhfc2ltcGxlX2Z1bmModHJjY29uZmlnLCBUUkNDT05GSUdSKTsKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmN0cmFjZWlkLCBUUkNUUkFDRUlEUik7CiBjb3Jlc2lnaHRfZXRtNHhfc2ltcGxlX2Z1bmModHJjYXV0aHN0YXR1cywgVFJDQVVUSFNUQVRVUyk7CiBjb3Jlc2lnaHRfZXRtNHhfc2ltcGxlX2Z1bmModHJjZGV2aWQsIFRSQ0RFVklEKTsKIGNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNkZXZ0eXBlLCBUUkNERVZUWVBFKTsKQEAgLTIwNTUsNiArMjA4Myw5IEBACiBjb3Jlc2lnaHRfZXRtNHhfc2ltcGxlX2Z1bmModHJjcGlkcjEsIFRSQ1BJRFIxKTsKIGNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNwaWRyMiwgVFJDUElEUjIpOwogY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY3BpZHIzLCBUUkNQSURSMyk7Citjb3Jlc2lnaHRfZXRtNHhfY3Jvc3NfcmVhZCh0cmNvc2xzciwgVFJDT1NMU1IpOworY29yZXNpZ2h0X2V0bTR4X2Nyb3NzX3JlYWQodHJjY29uZmlnLCBUUkNDT05GSUdSKTsKK2NvcmVzaWdodF9ldG00eF9jcm9zc19yZWFkKHRyY3RyYWNlaWQsIFRSQ1RSQUNFSURSKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNvcmVzaWdodF9ldG12NF9tZ210X2F0dHJzW10gPSB7CiAJJmRldl9hdHRyX3RyY29zbHNyLmF0dHIsCkBAIC0yMDczLDE5ICsyMTA0LDE5IEBACiAJTlVMTCwKIH07CiAKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNpZHIwLCBUUkNJRFIwKTsKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNpZHIxLCBUUkNJRFIxKTsKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNpZHIyLCBUUkNJRFIyKTsKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNpZHIzLCBUUkNJRFIzKTsKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNpZHI0LCBUUkNJRFI0KTsKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNpZHI1LCBUUkNJRFI1KTsKK2NvcmVzaWdodF9ldG00eF9jcm9zc19yZWFkKHRyY2lkcjAsIFRSQ0lEUjApOworY29yZXNpZ2h0X2V0bTR4X2Nyb3NzX3JlYWQodHJjaWRyMSwgVFJDSURSMSk7Citjb3Jlc2lnaHRfZXRtNHhfY3Jvc3NfcmVhZCh0cmNpZHIyLCBUUkNJRFIyKTsKK2NvcmVzaWdodF9ldG00eF9jcm9zc19yZWFkKHRyY2lkcjMsIFRSQ0lEUjMpOworY29yZXNpZ2h0X2V0bTR4X2Nyb3NzX3JlYWQodHJjaWRyNCwgVFJDSURSNCk7Citjb3Jlc2lnaHRfZXRtNHhfY3Jvc3NfcmVhZCh0cmNpZHI1LCBUUkNJRFI1KTsKIC8qIHRyY2lkcls2LDddIGFyZSByZXNlcnZlZCAqLwotY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY2lkcjgsIFRSQ0lEUjgpOwotY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY2lkcjksIFRSQ0lEUjkpOwotY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY2lkcjEwLCBUUkNJRFIxMCk7Ci1jb3Jlc2lnaHRfZXRtNHhfc2ltcGxlX2Z1bmModHJjaWRyMTEsIFRSQ0lEUjExKTsKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNpZHIxMiwgVFJDSURSMTIpOwotY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY2lkcjEzLCBUUkNJRFIxMyk7Citjb3Jlc2lnaHRfZXRtNHhfY3Jvc3NfcmVhZCh0cmNpZHI4LCBUUkNJRFI4KTsKK2NvcmVzaWdodF9ldG00eF9jcm9zc19yZWFkKHRyY2lkcjksIFRSQ0lEUjkpOworY29yZXNpZ2h0X2V0bTR4X2Nyb3NzX3JlYWQodHJjaWRyMTAsIFRSQ0lEUjEwKTsKK2NvcmVzaWdodF9ldG00eF9jcm9zc19yZWFkKHRyY2lkcjExLCBUUkNJRFIxMSk7Citjb3Jlc2lnaHRfZXRtNHhfY3Jvc3NfcmVhZCh0cmNpZHIxMiwgVFJDSURSMTIpOworY29yZXNpZ2h0X2V0bTR4X2Nyb3NzX3JlYWQodHJjaWRyMTMsIFRSQ0lEUjEzKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNvcmVzaWdodF9ldG12NF90cmNpZHJfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfdHJjaWRyMC5hdHRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG00eC5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG00eC5jCmluZGV4IDFhNWUwZDEuLjRkYjhkNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtNHguYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTR4LmMKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL2xvY2FsLmg+CiAKQEAgLTQ2LDcgKzQ1LDkgQEAKIC8qIFRoZSBudW1iZXIgb2YgRVRNdjQgY3VycmVudGx5IHJlZ2lzdGVyZWQgKi8KIHN0YXRpYyBpbnQgZXRtNF9jb3VudDsKIHN0YXRpYyBzdHJ1Y3QgZXRtdjRfZHJ2ZGF0YSAqZXRtZHJ2ZGF0YVtOUl9DUFVTXTsKLXN0YXRpYyB2b2lkIGV0bTRfc2V0X2RlZmF1bHQoc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnKTsKK3N0YXRpYyB2b2lkIGV0bTRfc2V0X2RlZmF1bHRfY29uZmlnKHN0cnVjdCBldG12NF9jb25maWcgKmNvbmZpZyk7CitzdGF0aWMgaW50IGV0bTRfc2V0X2V2ZW50X2ZpbHRlcnMoc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGEsCisJCQkJICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOwogCiBzdGF0aWMgZW51bSBjcHVocF9zdGF0ZSBocF9vbmxpbmU7CiAKQEAgLTc5LDIyICs4MCw4IEBACiBzdGF0aWMgaW50IGV0bTRfdHJhY2VfaWQoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2KQogewogCXN0cnVjdCBldG12NF9kcnZkYXRhICpkcnZkYXRhID0gZGV2X2dldF9kcnZkYXRhKGNzZGV2LT5kZXYucGFyZW50KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCB0cmFjZV9pZCA9IC0xOwogCi0JaWYgKCFsb2NhbF9yZWFkKCZkcnZkYXRhLT5tb2RlKSkKLQkJcmV0dXJuIGRydmRhdGEtPnRyY2lkOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRydmRhdGEtPnNwaW5sb2NrLCBmbGFncyk7Ci0KLQlDU19VTkxPQ0soZHJ2ZGF0YS0+YmFzZSk7Ci0JdHJhY2VfaWQgPSByZWFkbF9yZWxheGVkKGRydmRhdGEtPmJhc2UgKyBUUkNUUkFDRUlEUik7Ci0JdHJhY2VfaWQgJj0gRVRNX1RSQUNFSURfTUFTSzsKLQlDU19MT0NLKGRydmRhdGEtPmJhc2UpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2ZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiB0cmFjZV9pZDsKKwlyZXR1cm4gZHJ2ZGF0YS0+dHJjaWQ7CiB9CiAKIHN0YXRpYyB2b2lkIGV0bTRfZW5hYmxlX2h3KHZvaWQgKmluZm8pCkBAIC0xMTMsOCArMTAwLDcgQEAKIAkvKiB3YWl0IGZvciBUUkNTVEFUUi5JRExFIHRvIGdvIHVwICovCiAJaWYgKGNvcmVzaWdodF90aW1lb3V0KGRydmRhdGEtPmJhc2UsIFRSQ1NUQVRSLCBUUkNTVEFUUl9JRExFX0JJVCwgMSkpCiAJCWRldl9lcnIoZHJ2ZGF0YS0+ZGV2LAotCQkJInRpbWVvdXQgb2JzZXJ2ZWQgd2hlbiBwcm9iaW5nIGF0IG9mZnNldCAlI3hcbiIsCi0JCQlUUkNTVEFUUik7CisJCQkidGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBJZGxlIFRyYWNlIFN0YXR1c1xuIik7CiAKIAl3cml0ZWxfcmVsYXhlZChjb25maWctPnBlX3NlbCwgZHJ2ZGF0YS0+YmFzZSArIFRSQ1BST0NTRUxSKTsKIAl3cml0ZWxfcmVsYXhlZChjb25maWctPmNmZywgZHJ2ZGF0YS0+YmFzZSArIFRSQ0NPTkZJR1IpOwpAQCAtMTgwLDE0ICsxNjYsMjAgQEAKIAl3cml0ZWxfcmVsYXhlZChjb25maWctPnZtaWRfbWFzazAsIGRydmRhdGEtPmJhc2UgKyBUUkNWTUlEQ0NUTFIwKTsKIAl3cml0ZWxfcmVsYXhlZChjb25maWctPnZtaWRfbWFzazEsIGRydmRhdGEtPmJhc2UgKyBUUkNWTUlEQ0NUTFIxKTsKIAorCS8qCisJICogUmVxdWVzdCB0byBrZWVwIHRoZSB0cmFjZSB1bml0IHBvd2VyZWQgYW5kIGFsc28KKwkgKiBlbXVsYXRpb24gb2YgcG93ZXJkb3duCisJICovCisJd3JpdGVsX3JlbGF4ZWQocmVhZGxfcmVsYXhlZChkcnZkYXRhLT5iYXNlICsgVFJDUERDUikgfCBUUkNQRENSX1BVLAorCQkgICAgICAgZHJ2ZGF0YS0+YmFzZSArIFRSQ1BEQ1IpOworCiAJLyogRW5hYmxlIHRoZSB0cmFjZSB1bml0ICovCiAJd3JpdGVsX3JlbGF4ZWQoMSwgZHJ2ZGF0YS0+YmFzZSArIFRSQ1BSR0NUTFIpOwogCiAJLyogd2FpdCBmb3IgVFJDU1RBVFIuSURMRSB0byBnbyBiYWNrIGRvd24gdG8gJzAnICovCiAJaWYgKGNvcmVzaWdodF90aW1lb3V0KGRydmRhdGEtPmJhc2UsIFRSQ1NUQVRSLCBUUkNTVEFUUl9JRExFX0JJVCwgMCkpCiAJCWRldl9lcnIoZHJ2ZGF0YS0+ZGV2LAotCQkJInRpbWVvdXQgb2JzZXJ2ZWQgd2hlbiBwcm9iaW5nIGF0IG9mZnNldCAlI3hcbiIsCi0JCQlUUkNTVEFUUik7CisJCQkidGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBJZGxlIFRyYWNlIFN0YXR1c1xuIik7CiAKIAlDU19MT0NLKGRydmRhdGEtPmJhc2UpOwogCkBAIC0xOTUsMTIgKzE4NywxNiBAQAogfQogCiBzdGF0aWMgaW50IGV0bTRfcGFyc2VfZXZlbnRfY29uZmlnKHN0cnVjdCBldG12NF9kcnZkYXRhICpkcnZkYXRhLAotCQkJCSAgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIpCisJCQkJICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogeworCWludCByZXQgPSAwOwogCXN0cnVjdCBldG12NF9jb25maWcgKmNvbmZpZyA9ICZkcnZkYXRhLT5jb25maWc7CisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciA9ICZldmVudC0+YXR0cjsKIAotCWlmICghYXR0cikKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFhdHRyKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KIAogCS8qIENsZWFyIGNvbmZpZ3VyYXRpb24gZnJvbSBwcmV2aW91cyBydW4gKi8KIAltZW1zZXQoY29uZmlnLCAwLCBzaXplb2Yoc3RydWN0IGV0bXY0X2NvbmZpZykpOwpAQCAtMjEyLDE0ICsyMDgsMTIgQEAKIAkJY29uZmlnLT5tb2RlID0gRVRNX01PREVfRVhDTF9VU0VSOwogCiAJLyogQWx3YXlzIHN0YXJ0IGZyb20gdGhlIGRlZmF1bHQgY29uZmlnICovCi0JZXRtNF9zZXRfZGVmYXVsdChjb25maWcpOworCWV0bTRfc2V0X2RlZmF1bHRfY29uZmlnKGNvbmZpZyk7CiAKLQkvKgotCSAqIEJ5IGRlZmF1bHQgdGhlIHRyYWNlcnMgYXJlIGNvbmZpZ3VyZWQgdG8gdHJhY2UgdGhlIHdob2xlIGFkZHJlc3MKLQkgKiByYW5nZS4gIE5hcnJvdyB0aGUgZmllbGQgb25seSBpZiByZXF1ZXN0ZWQgYnkgdXNlciBzcGFjZS4KLQkgKi8KLQlpZiAoY29uZmlnLT5tb2RlKQotCQlldG00X2NvbmZpZ190cmFjZV9tb2RlKGNvbmZpZyk7CisJLyogQ29uZmlndXJlIGZpbHRlcnMgc3BlY2lmaWVkIG9uIHRoZSBwZXJmIGNtZCBsaW5lLCBpZiBhbnkuICovCisJcmV0ID0gZXRtNF9zZXRfZXZlbnRfZmlsdGVycyhkcnZkYXRhLCBldmVudCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CiAKIAkvKiBHbyBmcm9tIGdlbmVyaWMgb3B0aW9uIHRvIEVUTXY0IHNwZWNpZmljcyAqLwogCWlmIChhdHRyLT5jb25maWcgJiBCSVQoRVRNX09QVF9DWUNBQ0MpKQpAQCAtMjI3LDIzICsyMjEsMzAgQEAKIAlpZiAoYXR0ci0+Y29uZmlnICYgQklUKEVUTV9PUFRfVFMpKQogCQljb25maWctPmNmZyB8PSBFVE12NF9NT0RFX1RJTUVTVEFNUDsKIAotCXJldHVybiAwOworb3V0OgorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZXRtNF9lbmFibGVfcGVyZihzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYsCi0JCQkgICAgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0cikKKwkJCSAgICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CisJaW50IHJldCA9IDA7CiAJc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoY3NkZXYtPmRldi5wYXJlbnQpOwogCi0JaWYgKFdBUk5fT05fT05DRShkcnZkYXRhLT5jcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKFdBUk5fT05fT05DRShkcnZkYXRhLT5jcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CiAKIAkvKiBDb25maWd1cmUgdGhlIHRyYWNlciBiYXNlZCBvbiB0aGUgc2Vzc2lvbidzIHNwZWNpZmljcyAqLwotCWV0bTRfcGFyc2VfZXZlbnRfY29uZmlnKGRydmRhdGEsIGF0dHIpOworCXJldCA9IGV0bTRfcGFyc2VfZXZlbnRfY29uZmlnKGRydmRhdGEsIGV2ZW50KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKIAkvKiBBbmQgZW5hYmxlIGl0ICovCiAJZXRtNF9lbmFibGVfaHcoZHJ2ZGF0YSk7CiAKLQlyZXR1cm4gMDsKK291dDoKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGV0bTRfZW5hYmxlX3N5c2ZzKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldikKQEAgLTI3NCw3ICsyNzUsNyBAQAogfQogCiBzdGF0aWMgaW50IGV0bTRfZW5hYmxlKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldiwKLQkJICAgICAgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsIHUzMiBtb2RlKQorCQkgICAgICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB1MzIgbW9kZSkKIHsKIAlpbnQgcmV0OwogCXUzMiB2YWw7CkBAIC0yOTEsNyArMjkyLDcgQEAKIAkJcmV0ID0gZXRtNF9lbmFibGVfc3lzZnMoY3NkZXYpOwogCQlicmVhazsKIAljYXNlIENTX01PREVfUEVSRjoKLQkJcmV0ID0gZXRtNF9lbmFibGVfcGVyZihjc2RldiwgYXR0cik7CisJCXJldCA9IGV0bTRfZW5hYmxlX3BlcmYoY3NkZXYsIGV2ZW50KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVJTlZBTDsKQEAgLTMxMSw2ICszMTIsMTEgQEAKIAogCUNTX1VOTE9DSyhkcnZkYXRhLT5iYXNlKTsKIAorCS8qIHBvd2VyIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHRyYWNlIHVuaXQgbm93ICovCisJY29udHJvbCA9IHJlYWRsX3JlbGF4ZWQoZHJ2ZGF0YS0+YmFzZSArIFRSQ1BEQ1IpOworCWNvbnRyb2wgJj0gflRSQ1BEQ1JfUFU7CisJd3JpdGVsX3JlbGF4ZWQoY29udHJvbCwgZHJ2ZGF0YS0+YmFzZSArIFRSQ1BEQ1IpOworCiAJY29udHJvbCA9IHJlYWRsX3JlbGF4ZWQoZHJ2ZGF0YS0+YmFzZSArIFRSQ1BSR0NUTFIpOwogCiAJLyogRU4sIGJpdFswXSBUcmFjZSB1bml0IGVuYWJsZSBiaXQgKi8KQEAgLTMyNiwxNCArMzMyLDI4IEBACiAJZGV2X2RiZyhkcnZkYXRhLT5kZXYsICJjcHU6ICVkIGRpc2FibGUgc21wIGNhbGwgZG9uZVxuIiwgZHJ2ZGF0YS0+Y3B1KTsKIH0KIAotc3RhdGljIGludCBldG00X2Rpc2FibGVfcGVyZihzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYpCitzdGF0aWMgaW50IGV0bTRfZGlzYWJsZV9wZXJmKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldiwKKwkJCSAgICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogeworCXUzMiBjb250cm9sOworCXN0cnVjdCBldG1fZmlsdGVycyAqZmlsdGVycyA9IGV2ZW50LT5ody5hZGRyX2ZpbHRlcnM7CiAJc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoY3NkZXYtPmRldi5wYXJlbnQpOwogCiAJaWYgKFdBUk5fT05fT05DRShkcnZkYXRhLT5jcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlldG00X2Rpc2FibGVfaHcoZHJ2ZGF0YSk7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBzdGFydC9zdG9wIGxvZ2ljIHdhcyBhY3RpdmUgd2hlbiB0aGUgdW5pdCB3YXMgc3RvcHBlZC4KKwkgKiBUaGF0IHdheSB3ZSBjYW4gcmUtZW5hYmxlIHRoZSBzdGFydC9zdG9wIGxvZ2ljIHdoZW4gdGhlIHByb2Nlc3MgaXMKKwkgKiBzY2hlZHVsZWQgYWdhaW4uICBDb25maWd1cmF0aW9uIG9mIHRoZSBzdGFydC9zdG9wIGxvZ2ljIGhhcHBlbnMgaW4KKwkgKiBmdW5jdGlvbiBldG00X3NldF9ldmVudF9maWx0ZXJzKCkuCisJICovCisJY29udHJvbCA9IHJlYWRsX3JlbGF4ZWQoZHJ2ZGF0YS0+YmFzZSArIFRSQ1ZJQ1RMUik7CisJLyogVFJDVklDVExSOjpTU1NUQVRVUywgYml0WzldICovCisJZmlsdGVycy0+c3NzdGF0dXMgPSAoY29udHJvbCAmIEJJVCg5KSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzYyLDcgKzM4Miw4IEBACiAJZGV2X2luZm8oZHJ2ZGF0YS0+ZGV2LCAiRVRNIHRyYWNpbmcgZGlzYWJsZWRcbiIpOwogfQogCi1zdGF0aWMgdm9pZCBldG00X2Rpc2FibGUoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2KQorc3RhdGljIHZvaWQgZXRtNF9kaXNhYmxlKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldiwKKwkJCSBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJdTMyIG1vZGU7CiAJc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoY3NkZXYtPmRldi5wYXJlbnQpOwpAQCAtMzgxLDcgKzQwMiw3IEBACiAJCWV0bTRfZGlzYWJsZV9zeXNmcyhjc2Rldik7CiAJCWJyZWFrOwogCWNhc2UgQ1NfTU9ERV9QRVJGOgotCQlldG00X2Rpc2FibGVfcGVyZihjc2Rldik7CisJCWV0bTRfZGlzYWJsZV9wZXJmKGNzZGV2LCBldmVudCk7CiAJCWJyZWFrOwogCX0KIApAQCAtNTY0LDIxICs1ODUsOCBAQAogCUNTX0xPQ0soZHJ2ZGF0YS0+YmFzZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGV0bTRfc2V0X2RlZmF1bHQoc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnKQorc3RhdGljIHZvaWQgZXRtNF9zZXRfZGVmYXVsdF9jb25maWcoc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnKQogewotCWlmIChXQVJOX09OX09OQ0UoIWNvbmZpZykpCi0JCXJldHVybjsKLQotCS8qCi0JICogTWFrZSBkZWZhdWx0IGluaXRpYWxpc2F0aW9uIHRyYWNlIGV2ZXJ5dGhpbmcKLQkgKgotCSAqIFNlbGVjdCB0aGUgImFsd2F5cyB0cnVlIiByZXNvdXJjZSBzZWxlY3RvciBvbiB0aGUKLQkgKiAiRW5hYmxpZ24gRXZlbnQiIGxpbmUgYW5kIGNvbmZpZ3VyZSBhZGRyZXNzIHJhbmdlIGNvbXBhcmF0b3IKLQkgKiAnMCcgdG8gdHJhY2UgYWxsIHRoZSBwb3NzaWJsZSBhZGRyZXNzIHJhbmdlLiAgRnJvbSB0aGVyZQotCSAqIGNvbmZpZ3VyZSB0aGUgImluY2x1ZGUvZXhjbHVkZSIgZW5naW5lIHRvIGluY2x1ZGUgYWRkcmVzcwotCSAqIHJhbmdlIGNvbXBhcmF0b3IgJzAnLgotCSAqLwotCiAJLyogZGlzYWJsZSBhbGwgZXZlbnRzIHRyYWNpbmcgKi8KIAljb25maWctPmV2ZW50Y3RybDAgPSAweDA7CiAJY29uZmlnLT5ldmVudGN0cmwxID0gMHgwOwpAQCAtNTk0LDYgKzYwMiwxMDggQEAKIAogCS8qIFRSQ1ZJQ1RMUjo6RVZFTlQgPSAweDAxLCBzZWxlY3QgdGhlIGFsd2F5cyBvbiBsb2dpYyAqLwogCWNvbmZpZy0+dmluc3RfY3RybCB8PSBCSVQoMCk7Cit9CisKK3N0YXRpYyB1NjQgZXRtNF9nZXRfYWNjZXNzX3R5cGUoc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnKQoreworCXU2NCBhY2Nlc3NfdHlwZSA9IDA7CisKKwkvKgorCSAqIEVYTEVWRUxfTlMsIGJpdHNbMTU6MTJdCisJICogVGhlIEV4Y2VwdGlvbiBsZXZlbHMgYXJlOgorCSAqICAgQml0WzEyXSBFeGNlcHRpb24gbGV2ZWwgMCAtIEFwcGxpY2F0aW9uCisJICogICBCaXRbMTNdIEV4Y2VwdGlvbiBsZXZlbCAxIC0gT1MKKwkgKiAgIEJpdFsxNF0gRXhjZXB0aW9uIGxldmVsIDIgLSBIeXBlcnZpc29yCisJICogICBCaXRbMTVdIE5ldmVyIGltcGxlbWVudGVkCisJICoKKwkgKiBBbHdheXMgc3RheSBhd2F5IGZyb20gaHlwZXJ2aXNvciBtb2RlLgorCSAqLworCWFjY2Vzc190eXBlID0gRVRNX0VYTEVWRUxfTlNfSFlQOworCisJaWYgKGNvbmZpZy0+bW9kZSAmIEVUTV9NT0RFX0VYQ0xfS0VSTikKKwkJYWNjZXNzX3R5cGUgfD0gRVRNX0VYTEVWRUxfTlNfT1M7CisKKwlpZiAoY29uZmlnLT5tb2RlICYgRVRNX01PREVfRVhDTF9VU0VSKQorCQlhY2Nlc3NfdHlwZSB8PSBFVE1fRVhMRVZFTF9OU19BUFA7CisKKwkvKgorCSAqIEVYTEVWRUxfUywgYml0c1sxMTo4XSwgZG9uJ3QgdHJhY2UgYW55dGhpbmcgaGFwcGVuaW5nCisJICogaW4gc2VjdXJlIHN0YXRlLgorCSAqLworCWFjY2Vzc190eXBlIHw9IChFVE1fRVhMRVZFTF9TX0FQUAl8CisJCQlFVE1fRVhMRVZFTF9TX09TCXwKKwkJCUVUTV9FWExFVkVMX1NfSFlQKTsKKworCXJldHVybiBhY2Nlc3NfdHlwZTsKK30KKworc3RhdGljIHZvaWQgZXRtNF9zZXRfY29tcGFyYXRvcl9maWx0ZXIoc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnLAorCQkJCSAgICAgICB1NjQgc3RhcnQsIHU2NCBzdG9wLCBpbnQgY29tcGFyYXRvcikKK3sKKwl1NjQgYWNjZXNzX3R5cGUgPSBldG00X2dldF9hY2Nlc3NfdHlwZShjb25maWcpOworCisJLyogRmlyc3QgaGFsZiBvZiBkZWZhdWx0IGFkZHJlc3MgY29tcGFyYXRvciAqLworCWNvbmZpZy0+YWRkcl92YWxbY29tcGFyYXRvcl0gPSBzdGFydDsKKwljb25maWctPmFkZHJfYWNjW2NvbXBhcmF0b3JdID0gYWNjZXNzX3R5cGU7CisJY29uZmlnLT5hZGRyX3R5cGVbY29tcGFyYXRvcl0gPSBFVE1fQUREUl9UWVBFX1JBTkdFOworCisJLyogU2Vjb25kIGhhbGYgb2YgZGVmYXVsdCBhZGRyZXNzIGNvbXBhcmF0b3IgKi8KKwljb25maWctPmFkZHJfdmFsW2NvbXBhcmF0b3IgKyAxXSA9IHN0b3A7CisJY29uZmlnLT5hZGRyX2FjY1tjb21wYXJhdG9yICsgMV0gPSBhY2Nlc3NfdHlwZTsKKwljb25maWctPmFkZHJfdHlwZVtjb21wYXJhdG9yICsgMV0gPSBFVE1fQUREUl9UWVBFX1JBTkdFOworCisJLyoKKwkgKiBDb25maWd1cmUgdGhlIFZpZXdJbnN0IGZ1bmN0aW9uIHRvIGluY2x1ZGUgdGhpcyBhZGRyZXNzIHJhbmdlCisJICogY29tcGFyYXRvci4KKwkgKgorCSAqIEBjb21wYXJhdG9yIGlzIGRpdmlkZWQgYnkgdHdvIHNpbmNlIGl0IGlzIHRoZSBpbmRleCBpbiB0aGUKKwkgKiBldG12NF9jb25maWc6OmFkZHJfdmFsIGFycmF5IGJ1dCByZWdpc3RlciBUUkNWSUlFQ1RMUiBkZWFscyB3aXRoCisJICogYWRkcmVzcyByYW5nZSBjb21wYXJhdG9yIF9wYWlyc18uCisJICoKKwkgKiBUaGVyZWZvcmU6CisJICoJaW5kZXggMCAtPiBjb21wYXRhdG9yIHBhaXIgMAorCSAqCWluZGV4IDIgLT4gY29tcGFyYXRvciBwYWlyIDEKKwkgKglpbmRleCA0IC0+IGNvbXBhcmF0b3IgcGFpciAyCisJICoJLi4uCisJICoJaW5kZXggMTQgLT4gY29tcGFyYXRvciBwYWlyIDcKKwkgKi8KKwljb25maWctPnZpaWVjdGxyIHw9IEJJVChjb21wYXJhdG9yIC8gMik7Cit9CisKK3N0YXRpYyB2b2lkIGV0bTRfc2V0X3N0YXJ0X3N0b3BfZmlsdGVyKHN0cnVjdCBldG12NF9jb25maWcgKmNvbmZpZywKKwkJCQkgICAgICAgdTY0IGFkZHJlc3MsIGludCBjb21wYXJhdG9yLAorCQkJCSAgICAgICBlbnVtIGV0bV9hZGRyX3R5cGUgdHlwZSkKK3sKKwlpbnQgc2hpZnQ7CisJdTY0IGFjY2Vzc190eXBlID0gZXRtNF9nZXRfYWNjZXNzX3R5cGUoY29uZmlnKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgY29tcGFyYXRvciAqLworCWNvbmZpZy0+YWRkcl92YWxbY29tcGFyYXRvcl0gPSBhZGRyZXNzOworCWNvbmZpZy0+YWRkcl9hY2NbY29tcGFyYXRvcl0gPSBhY2Nlc3NfdHlwZTsKKwljb25maWctPmFkZHJfdHlwZVtjb21wYXJhdG9yXSA9IHR5cGU7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBWaWV3SW5zdCBTdGFydC1TdG9wIGNvbnRyb2wgcmVnaXN0ZXIuCisJICogQWRkcmVzc2VzIGNvbmZpZ3VyZWQgdG8gc3RhcnQgdHJhY2luZyBnbyBmcm9tIGJpdCAwIHRvIG4tMSwKKwkgKiB3aGlsZSB0aG9zZSBjb25maWd1cmVkIHRvIHN0b3AgdHJhY2luZyBmcm9tIDE2IHRvIDE2ICsgbi0xLgorCSAqLworCXNoaWZ0ID0gKHR5cGUgPT0gRVRNX0FERFJfVFlQRV9TVEFSVCA/IDAgOiAxNik7CisJY29uZmlnLT52aXNzY3RsciB8PSBCSVQoc2hpZnQgKyBjb21wYXJhdG9yKTsKK30KKworc3RhdGljIHZvaWQgZXRtNF9zZXRfZGVmYXVsdF9maWx0ZXIoc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnKQoreworCXU2NCBzdGFydCwgc3RvcDsKKworCS8qCisJICogQ29uZmlndXJlIGFkZHJlc3MgcmFuZ2UgY29tcGFyYXRvciAnMCcgdG8gZW5jb21wYXNzIGFsbAorCSAqIHBvc3NpYmxlIGFkZHJlc3Nlcy4KKwkgKi8KKwlzdGFydCA9IDB4MDsKKwlzdG9wID0gfjB4MDsKKworCWV0bTRfc2V0X2NvbXBhcmF0b3JfZmlsdGVyKGNvbmZpZywgc3RhcnQsIHN0b3AsCisJCQkJICAgRVRNX0RFRkFVTFRfQUREUl9DT01QKTsKIAogCS8qCiAJICogVFJDVklDVExSOjpTU1NUQVRVUyA9PSAxLCB0aGUgc3RhcnQtc3RvcCBsb2dpYyBpcwpAQCAtNjAxLDQ1ICs3MTEsMTU4IEBACiAJICovCiAJY29uZmlnLT52aW5zdF9jdHJsIHw9IEJJVCg5KTsKIAotCS8qCi0JICogQ29uZmlndXJlIGFkZHJlc3MgcmFuZ2UgY29tcGFyYXRvciAnMCcgdG8gZW5jb21wYXNzIGFsbAotCSAqIHBvc3NpYmxlIGFkZHJlc3Nlcy4KLQkgKi8KLQotCS8qIEZpcnN0IGhhbGYgb2YgZGVmYXVsdCBhZGRyZXNzIGNvbXBhcmF0b3I6IHN0YXJ0IGF0IGFkZHJlc3MgMCAqLwotCWNvbmZpZy0+YWRkcl92YWxbRVRNX0RFRkFVTFRfQUREUl9DT01QXSA9IDB4MDsKLQkvKiB0cmFjZSBpbnN0cnVjdGlvbiBhZGRyZXNzZXMgKi8KLQljb25maWctPmFkZHJfYWNjW0VUTV9ERUZBVUxUX0FERFJfQ09NUF0gJj0gfihCSVQoMCkgfCBCSVQoMSkpOwotCS8qIEVYTEVWRUxfTlMsIGJpdHNbMTI6MTVdLCBvbmx5IHRyYWNlIGFwcGxpY2F0aW9uIGFuZCBrZXJuZWwgc3BhY2UgKi8KLQljb25maWctPmFkZHJfYWNjW0VUTV9ERUZBVUxUX0FERFJfQ09NUF0gfD0gRVRNX0VYTEVWRUxfTlNfSFlQOwotCS8qIEVYTEVWRUxfUywgYml0c1sxMTo4XSwgZG9uJ3QgdHJhY2UgYW55dGhpbmcgaW4gc2VjdXJlIHN0YXRlICovCi0JY29uZmlnLT5hZGRyX2FjY1tFVE1fREVGQVVMVF9BRERSX0NPTVBdIHw9IChFVE1fRVhMRVZFTF9TX0FQUCB8Ci0JCQkJCQkgICAgRVRNX0VYTEVWRUxfU19PUyB8Ci0JCQkJCQkgICAgRVRNX0VYTEVWRUxfU19IWVApOwotCWNvbmZpZy0+YWRkcl90eXBlW0VUTV9ERUZBVUxUX0FERFJfQ09NUF0gPSBFVE1fQUREUl9UWVBFX1JBTkdFOwotCi0JLyoKLQkgKiBTZWNvbmQgaGFsZiBvZiBkZWZhdWx0IGFkZHJlc3MgY29tcGFyYXRvcjogZ28gYWxsCi0JICogdGhlIHdheSB0byB0aGUgdG9wLgotCSovCi0JY29uZmlnLT5hZGRyX3ZhbFtFVE1fREVGQVVMVF9BRERSX0NPTVAgKyAxXSA9IH4weDA7Ci0JLyogdHJhY2UgaW5zdHJ1Y3Rpb24gYWRkcmVzc2VzICovCi0JY29uZmlnLT5hZGRyX2FjY1tFVE1fREVGQVVMVF9BRERSX0NPTVAgKyAxXSAmPSB+KEJJVCgwKSB8IEJJVCgxKSk7Ci0JLyogQWRkcmVzcyBjb21wYXJhdG9yIHR5cGUgbXVzdCBiZSBlcXVhbCBmb3IgYm90aCBoYWx2ZXMgKi8KLQljb25maWctPmFkZHJfYWNjW0VUTV9ERUZBVUxUX0FERFJfQ09NUCArIDFdID0KLQkJCQkJY29uZmlnLT5hZGRyX2FjY1tFVE1fREVGQVVMVF9BRERSX0NPTVBdOwotCWNvbmZpZy0+YWRkcl90eXBlW0VUTV9ERUZBVUxUX0FERFJfQ09NUCArIDFdID0gRVRNX0FERFJfVFlQRV9SQU5HRTsKLQotCS8qCi0JICogQ29uZmlndXJlIHRoZSBWaWV3SW5zdCBmdW5jdGlvbiB0byBmaWx0ZXIgb24gYWRkcmVzcyByYW5nZQotCSAqIGNvbXBhcmF0b3IgJzAnLgotCSAqLwotCWNvbmZpZy0+dmlpZWN0bHIgPSBCSVQoMCk7Ci0KLQkvKiBubyBzdGFydC1zdG9wIGZpbHRlcmluZyBmb3IgVmlld0luc3QgKi8KKwkvKiBObyBzdGFydC1zdG9wIGZpbHRlcmluZyBmb3IgVmlld0luc3QgKi8KIAljb25maWctPnZpc3NjdGxyID0gMHgwOwogfQogCitzdGF0aWMgdm9pZCBldG00X3NldF9kZWZhdWx0KHN0cnVjdCBldG12NF9jb25maWcgKmNvbmZpZykKK3sKKwlpZiAoV0FSTl9PTl9PTkNFKCFjb25maWcpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIE1ha2UgZGVmYXVsdCBpbml0aWFsaXNhdGlvbiB0cmFjZSBldmVyeXRoaW5nCisJICoKKwkgKiBTZWxlY3QgdGhlICJhbHdheXMgdHJ1ZSIgcmVzb3VyY2Ugc2VsZWN0b3Igb24gdGhlCisJICogIkVuYWJsaWduIEV2ZW50IiBsaW5lIGFuZCBjb25maWd1cmUgYWRkcmVzcyByYW5nZSBjb21wYXJhdG9yCisJICogJzAnIHRvIHRyYWNlIGFsbCB0aGUgcG9zc2libGUgYWRkcmVzcyByYW5nZS4gIEZyb20gdGhlcmUKKwkgKiBjb25maWd1cmUgdGhlICJpbmNsdWRlL2V4Y2x1ZGUiIGVuZ2luZSB0byBpbmNsdWRlIGFkZHJlc3MKKwkgKiByYW5nZSBjb21wYXJhdG9yICcwJy4KKwkgKi8KKwlldG00X3NldF9kZWZhdWx0X2NvbmZpZyhjb25maWcpOworCWV0bTRfc2V0X2RlZmF1bHRfZmlsdGVyKGNvbmZpZyk7Cit9CisKK3N0YXRpYyBpbnQgZXRtNF9nZXRfbmV4dF9jb21wYXJhdG9yKHN0cnVjdCBldG12NF9kcnZkYXRhICpkcnZkYXRhLCB1MzIgdHlwZSkKK3sKKwlpbnQgbnJfY29tcGFyYXRvciwgaW5kZXggPSAwOworCXN0cnVjdCBldG12NF9jb25maWcgKmNvbmZpZyA9ICZkcnZkYXRhLT5jb25maWc7CisKKwkvKgorCSAqIG5yX2FkZHJfY21wIGhvbGRzIHRoZSBudW1iZXIgb2YgY29tcGFyYXRvciBfcGFpcl8sIHNvIHRpbWUgMgorCSAqIGZvciB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbXBhcmF0b3JzLgorCSAqLworCW5yX2NvbXBhcmF0b3IgPSBkcnZkYXRhLT5ucl9hZGRyX2NtcCAqIDI7CisKKwkvKiBHbyB0aHJvdWdoIHRoZSB0YWxseSBvZiBjb21wYXJhdG9ycyBsb29raW5nIGZvciBhIGZyZWUgb25lLiAqLworCXdoaWxlIChpbmRleCA8IG5yX2NvbXBhcmF0b3IpIHsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgRVRNX0FERFJfVFlQRV9SQU5HRToKKwkJCWlmIChjb25maWctPmFkZHJfdHlwZVtpbmRleF0gPT0gRVRNX0FERFJfVFlQRV9OT05FICYmCisJCQkgICAgY29uZmlnLT5hZGRyX3R5cGVbaW5kZXggKyAxXSA9PSBFVE1fQUREUl9UWVBFX05PTkUpCisJCQkJcmV0dXJuIGluZGV4OworCisJCQkvKiBBZGRyZXNzIHJhbmdlIGNvbXBhcmF0b3JzIGdvIGluIHBhaXJzICovCisJCQlpbmRleCArPSAyOworCQkJYnJlYWs7CisJCWNhc2UgRVRNX0FERFJfVFlQRV9TVEFSVDoKKwkJY2FzZSBFVE1fQUREUl9UWVBFX1NUT1A6CisJCQlpZiAoY29uZmlnLT5hZGRyX3R5cGVbaW5kZXhdID09IEVUTV9BRERSX1RZUEVfTk9ORSkKKwkJCQlyZXR1cm4gaW5kZXg7CisKKwkJCS8qIFN0YXJ0L3N0b3AgYWRkcmVzcyBjYW4gaGF2ZSBvZGQgaW5kZXhlcyAqLworCQkJaW5kZXggKz0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBJZiB3ZSBhcmUgaGVyZSBhbGwgdGhlIGNvbXBhcmF0b3JzIGhhdmUgYmVlbiB1c2VkLiAqLworCXJldHVybiAtRU5PU1BDOworfQorCitzdGF0aWMgaW50IGV0bTRfc2V0X2V2ZW50X2ZpbHRlcnMoc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGEsCisJCQkJICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJaW50IGksIGNvbXBhcmF0b3IsIHJldCA9IDA7CisJdTY0IGFkZHJlc3M7CisJc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnID0gJmRydmRhdGEtPmNvbmZpZzsKKwlzdHJ1Y3QgZXRtX2ZpbHRlcnMgKmZpbHRlcnMgPSBldmVudC0+aHcuYWRkcl9maWx0ZXJzOworCisJaWYgKCFmaWx0ZXJzKQorCQlnb3RvIGRlZmF1bHRfZmlsdGVyOworCisJLyogU3luYyBldmVudHMgd2l0aCB3aGF0IFBlcmYgZ290ICovCisJcGVyZl9ldmVudF9hZGRyX2ZpbHRlcnNfc3luYyhldmVudCk7CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBubyBmaWx0ZXJzIHRvIGRlYWwgd2l0aCBzaW1wbHkgZ28gYWhlYWQgd2l0aAorCSAqIHRoZSBkZWZhdWx0IGZpbHRlciwgaS5lIHRoZSBlbnRpcmUgYWRkcmVzcyByYW5nZS4KKwkgKi8KKwlpZiAoIWZpbHRlcnMtPm5yX2ZpbHRlcnMpCisJCWdvdG8gZGVmYXVsdF9maWx0ZXI7CisKKwlmb3IgKGkgPSAwOyBpIDwgZmlsdGVycy0+bnJfZmlsdGVyczsgaSsrKSB7CisJCXN0cnVjdCBldG1fZmlsdGVyICpmaWx0ZXIgPSAmZmlsdGVycy0+ZXRtX2ZpbHRlcltpXTsKKwkJZW51bSBldG1fYWRkcl90eXBlIHR5cGUgPSBmaWx0ZXItPnR5cGU7CisKKwkJLyogU2VlIGlmIGEgY29tcGFyYXRvciBpcyBmcmVlLiAqLworCQljb21wYXJhdG9yID0gZXRtNF9nZXRfbmV4dF9jb21wYXJhdG9yKGRydmRhdGEsIHR5cGUpOworCQlpZiAoY29tcGFyYXRvciA8IDApIHsKKwkJCXJldCA9IGNvbXBhcmF0b3I7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIEVUTV9BRERSX1RZUEVfUkFOR0U6CisJCQlldG00X3NldF9jb21wYXJhdG9yX2ZpbHRlcihjb25maWcsCisJCQkJCQkgICBmaWx0ZXItPnN0YXJ0X2FkZHIsCisJCQkJCQkgICBmaWx0ZXItPnN0b3BfYWRkciwKKwkJCQkJCSAgIGNvbXBhcmF0b3IpOworCQkJLyoKKwkJCSAqIFRSQ1ZJQ1RMUjo6U1NTVEFUVVMgPT0gMSwgdGhlIHN0YXJ0LXN0b3AgbG9naWMgaXMKKwkJCSAqIGluIHRoZSBzdGFydGVkIHN0YXRlCisJCQkgKi8KKwkJCWNvbmZpZy0+dmluc3RfY3RybCB8PSBCSVQoOSk7CisKKwkJCS8qIE5vIHN0YXJ0LXN0b3AgZmlsdGVyaW5nIGZvciBWaWV3SW5zdCAqLworCQkJY29uZmlnLT52aXNzY3RsciA9IDB4MDsKKwkJCWJyZWFrOworCQljYXNlIEVUTV9BRERSX1RZUEVfU1RBUlQ6CisJCWNhc2UgRVRNX0FERFJfVFlQRV9TVE9QOgorCQkJLyogR2V0IHRoZSByaWdodCBzdGFydCBvciBzdG9wIGFkZHJlc3MgKi8KKwkJCWFkZHJlc3MgPSAodHlwZSA9PSBFVE1fQUREUl9UWVBFX1NUQVJUID8KKwkJCQkgICBmaWx0ZXItPnN0YXJ0X2FkZHIgOgorCQkJCSAgIGZpbHRlci0+c3RvcF9hZGRyKTsKKworCQkJLyogQ29uZmlndXJlIGNvbXBhcmF0b3IgKi8KKwkJCWV0bTRfc2V0X3N0YXJ0X3N0b3BfZmlsdGVyKGNvbmZpZywgYWRkcmVzcywKKwkJCQkJCSAgIGNvbXBhcmF0b3IsIHR5cGUpOworCisJCQkvKgorCQkJICogSWYgZmlsdGVyczo6c3NzdGF0dXMgPT0gMSwgdHJhY2UgYWNxdWlzaXRpb24gd2FzCisJCQkgKiBzdGFydGVkIGJ1dCB0aGUgcHJvY2VzcyB3YXMgeWFua2VkIGF3YXkgYmVmb3JlIHRoZQorCQkJICogdGhlIHN0b3AgYWRkcmVzcyB3YXMgaGl0LiAgQXMgc3VjaCB0aGUgc3RhcnQvc3RvcAorCQkJICogbG9naWMgbmVlZHMgdG8gYmUgcmUtc3RhcnRlZCBzbyB0aGF0IHRyYWNpbmcgY2FuCisJCQkgKiByZXN1bWUgd2hlcmUgaXQgbGVmdC4KKwkJCSAqCisJCQkgKiBUaGUgc3RhcnQvc3RvcCBsb2dpYyBzdGF0dXMgd2hlbiBhIHByb2Nlc3MgaXMKKwkJCSAqIHNjaGVkdWxlZCBvdXQgaXMgY2hlY2tlZCBpbiBmdW5jdGlvbgorCQkJICogZXRtNF9kaXNhYmxlX3BlcmYoKS4KKwkJCSAqLworCQkJaWYgKGZpbHRlcnMtPnNzc3RhdHVzKQorCQkJCWNvbmZpZy0+dmluc3RfY3RybCB8PSBCSVQoOSk7CisKKwkJCS8qIE5vIGluY2x1ZGUvZXhjbHVkZSBmaWx0ZXJpbmcgZm9yIFZpZXdJbnN0ICovCisJCQljb25maWctPnZpaWVjdGxyID0gMHgwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlnb3RvIG91dDsKKworCitkZWZhdWx0X2ZpbHRlcjoKKwlldG00X3NldF9kZWZhdWx0X2ZpbHRlcihjb25maWcpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwogdm9pZCBldG00X2NvbmZpZ190cmFjZV9tb2RlKHN0cnVjdCBldG12NF9jb25maWcgKmNvbmZpZykKIHsKIAl1MzIgYWRkcl9hY2MsIG1vZGU7CkBAIC03MjcsMTMgKzk1MCw5IEBACiAJc3RydWN0IGNvcmVzaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGE7CiAJc3RydWN0IHJlc291cmNlICpyZXMgPSAmYWRldi0+cmVzOwotCXN0cnVjdCBjb3Jlc2lnaHRfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgZGVzYyA9IHsgMCB9OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBhZGV2LT5kZXYub2Zfbm9kZTsKIAotCWRlc2MgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRlc2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRlc2MpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJZHJ2ZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZHJ2ZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZHJ2ZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC03ODgsMTMgKzEwMDcsMTMgQEAKIAlldG00X2luaXRfdHJhY2VfaWQoZHJ2ZGF0YSk7CiAJZXRtNF9zZXRfZGVmYXVsdCgmZHJ2ZGF0YS0+Y29uZmlnKTsKIAotCWRlc2MtPnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfU09VUkNFOwotCWRlc2MtPnN1YnR5cGUuc291cmNlX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU09VUkNFX1BST0M7Ci0JZGVzYy0+b3BzID0gJmV0bTRfY3Nfb3BzOwotCWRlc2MtPnBkYXRhID0gcGRhdGE7Ci0JZGVzYy0+ZGV2ID0gZGV2OwotCWRlc2MtPmdyb3VwcyA9IGNvcmVzaWdodF9ldG12NF9ncm91cHM7Ci0JZHJ2ZGF0YS0+Y3NkZXYgPSBjb3Jlc2lnaHRfcmVnaXN0ZXIoZGVzYyk7CisJZGVzYy50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX1NPVVJDRTsKKwlkZXNjLnN1YnR5cGUuc291cmNlX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU09VUkNFX1BST0M7CisJZGVzYy5vcHMgPSAmZXRtNF9jc19vcHM7CisJZGVzYy5wZGF0YSA9IHBkYXRhOworCWRlc2MuZGV2ID0gZGV2OworCWRlc2MuZ3JvdXBzID0gY29yZXNpZ2h0X2V0bXY0X2dyb3VwczsKKwlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcigmZGVzYyk7CiAJaWYgKElTX0VSUihkcnZkYXRhLT5jc2RldikpIHsKIAkJcmV0ID0gUFRSX0VSUihkcnZkYXRhLT5jc2Rldik7CiAJCWdvdG8gZXJyX2FyY2hfc3VwcG9ydGVkOwpAQCAtODI2LDEyICsxMDQ1LDEyIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9pZCBldG00X2lkc1tdID0gewotCXsgICAgICAgLyogRVRNIDQuMCAtIFF1YWxjb21tICovCi0JCS5pZAk9IDB4MDAwM2I5NWQsCi0JCS5tYXNrCT0gMHgwMDAzZmZmZiwKKwl7ICAgICAgIC8qIEVUTSA0LjAgLSBDb3J0ZXgtQTUzICAqLworCQkuaWQJPSAweDAwMGJiOTVkLAorCQkubWFzawk9IDB4MDAwZmZmZmYsCiAJCS5kYXRhCT0gIkVUTSA0LjAiLAogCX0sCi0JeyAgICAgICAvKiBFVE0gNC4wIC0gSnVubyBib2FyZCAqLworCXsgICAgICAgLyogRVRNIDQuMCAtIENvcnRleC1BNTcgKi8KIAkJLmlkCT0gMHgwMDBiYjk1ZSwKIAkJLm1hc2sJPSAweDAwMGZmZmZmLAogCQkuZGF0YQk9ICJFVE0gNC4wIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtNHguaCBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtNHguaAppbmRleCA1MzU5YzUxLi5iYThkM2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTR4LmgKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG00eC5oCkBAIC0xODMsNiArMTgzLDkgQEAKICNkZWZpbmUgVFJDU1RBVFJfSURMRV9CSVQJCTAKICNkZWZpbmUgRVRNX0RFRkFVTFRfQUREUl9DT01QCQkwCiAKKy8qIFBvd2VyRG93biBDb250cm9sIFJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgVFJDUERDUl9QVQkJCUJJVCgzKQorCiAvKiBzZWN1cmUgc3RhdGUgYWNjZXNzIGxldmVscyAqLwogI2RlZmluZSBFVE1fRVhMRVZFTF9TX0FQUAkJQklUKDgpCiAjZGVmaW5lIEVUTV9FWExFVkVMX1NfT1MJCUJJVCg5KQpAQCAtNDA3LDE0ICs0MTAsNiBAQAogCUVUTV9DVFhfQ1RYSURfVk1JRCwKIH07CiAKLWVudW0gZXRtX2FkZHJfdHlwZSB7Ci0JRVRNX0FERFJfVFlQRV9OT05FLAotCUVUTV9BRERSX1RZUEVfU0lOR0xFLAotCUVUTV9BRERSX1RZUEVfUkFOR0UsCi0JRVRNX0FERFJfVFlQRV9TVEFSVCwKLQlFVE1fQUREUl9UWVBFX1NUT1AsCi19OwotCiBleHRlcm4gY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqY29yZXNpZ2h0X2V0bXY0X2dyb3Vwc1tdOwogdm9pZCBldG00X2NvbmZpZ190cmFjZV9tb2RlKHN0cnVjdCBldG12NF9jb25maWcgKmNvbmZpZyk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZnVubmVsLmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWZ1bm5lbC5jCmluZGV4IDA1ZGY3ODkuLjg2MGZlNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZnVubmVsLmMKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1mdW5uZWwuYwpAQCAtMTc2LDcgKzE3Niw3IEBACiAJc3RydWN0IGNvcmVzaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IGZ1bm5lbF9kcnZkYXRhICpkcnZkYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmFkZXYtPnJlczsKLQlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgKmRlc2M7CisJc3RydWN0IGNvcmVzaWdodF9kZXNjIGRlc2MgPSB7IDAgfTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gYWRldi0+ZGV2Lm9mX25vZGU7CiAKIAlpZiAobnApIHsKQEAgLTIwNywxNyArMjA3LDEzIEBACiAJZHJ2ZGF0YS0+YmFzZSA9IGJhc2U7CiAJcG1fcnVudGltZV9wdXQoJmFkZXYtPmRldik7CiAKLQlkZXNjID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkZXNjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXNjKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRlc2MtPnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfTElOSzsKLQlkZXNjLT5zdWJ0eXBlLmxpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9MSU5LX01FUkc7Ci0JZGVzYy0+b3BzID0gJmZ1bm5lbF9jc19vcHM7Ci0JZGVzYy0+cGRhdGEgPSBwZGF0YTsKLQlkZXNjLT5kZXYgPSBkZXY7Ci0JZGVzYy0+Z3JvdXBzID0gY29yZXNpZ2h0X2Z1bm5lbF9ncm91cHM7Ci0JZHJ2ZGF0YS0+Y3NkZXYgPSBjb3Jlc2lnaHRfcmVnaXN0ZXIoZGVzYyk7CisJZGVzYy50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX0xJTks7CisJZGVzYy5zdWJ0eXBlLmxpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9MSU5LX01FUkc7CisJZGVzYy5vcHMgPSAmZnVubmVsX2NzX29wczsKKwlkZXNjLnBkYXRhID0gcGRhdGE7CisJZGVzYy5kZXYgPSBkZXY7CisJZGVzYy5ncm91cHMgPSBjb3Jlc2lnaHRfZnVubmVsX2dyb3VwczsKKwlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcigmZGVzYyk7CiAJaWYgKElTX0VSUihkcnZkYXRhLT5jc2RldikpCiAJCXJldHVybiBQVFJfRVJSKGRydmRhdGEtPmNzZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1wcml2LmggYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXByaXYuaAppbmRleCBhZDk3NWM1Li4xOTZhMTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXByaXYuaAorKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXByaXYuaApAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY29yZXNpZ2h0Lmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiAvKgogICogQ29yZXNpZ2h0IG1hbmFnZW1lbnQgcmVnaXN0ZXJzICgweGYwMC0weGZjYykKQEAgLTM3LDE2ICszOCwzMiBAQAogI2RlZmluZSBFVE1fTU9ERV9FWENMX0tFUk4JQklUKDMwKQogI2RlZmluZSBFVE1fTU9ERV9FWENMX1VTRVIJQklUKDMxKQogCi0jZGVmaW5lIGNvcmVzaWdodF9zaW1wbGVfZnVuYyh0eXBlLCBuYW1lLCBvZmZzZXQpCQkJXAordHlwZWRlZiB1MzIgKCpjb3Jlc2lnaHRfcmVhZF9mbikoY29uc3Qgc3RydWN0IGRldmljZSAqLCB1MzIgb2Zmc2V0KTsKKyNkZWZpbmUgY29yZXNpZ2h0X3NpbXBsZV9mdW5jKHR5cGUsIGZ1bmMsIG5hbWUsIG9mZnNldCkJCQlcCiBzdGF0aWMgc3NpemVfdCBuYW1lIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpfZGV2LAkJCQlcCiAJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCiB7CQkJCQkJCQkJXAogCXR5cGUgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldi0+cGFyZW50KTsJCQlcCi0JcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JXhcbiIsCQkJXAotCQkJIHJlYWRsX3JlbGF4ZWQoZHJ2ZGF0YS0+YmFzZSArIG9mZnNldCkpOwlcCisJY29yZXNpZ2h0X3JlYWRfZm4gZm4gPSBmdW5jOwkJCQkJXAorCXUzMiB2YWw7CQkJCQkJCVwKKwlwbV9ydW50aW1lX2dldF9zeW5jKF9kZXYtPnBhcmVudCk7CQkJCVwKKwlpZiAoZm4pCQkJCQkJCQlcCisJCXZhbCA9IGZuKF9kZXYtPnBhcmVudCwgb2Zmc2V0KTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJdmFsID0gcmVhZGxfcmVsYXhlZChkcnZkYXRhLT5iYXNlICsgb2Zmc2V0KTsJCVwKKwlwbV9ydW50aW1lX3B1dF9zeW5jKF9kZXYtPnBhcmVudCk7CQkJCVwKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHgleFxuIiwgdmFsKTsJCVwKIH0JCQkJCQkJCQlcCiBzdGF0aWMgREVWSUNFX0FUVFJfUk8obmFtZSkKIAorZW51bSBldG1fYWRkcl90eXBlIHsKKwlFVE1fQUREUl9UWVBFX05PTkUsCisJRVRNX0FERFJfVFlQRV9TSU5HTEUsCisJRVRNX0FERFJfVFlQRV9SQU5HRSwKKwlFVE1fQUREUl9UWVBFX1NUQVJULAorCUVUTV9BRERSX1RZUEVfU1RPUCwKK307CisKIGVudW0gY3NfbW9kZSB7CiAJQ1NfTU9ERV9ESVNBQkxFRCwKIAlDU19NT0RFX1NZU0ZTLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1yZXBsaWNhdG9yLXFjb20uYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtcmVwbGljYXRvci1xY29tLmMKaW5kZXggNzAwZjcxMC4uMGEzZDE1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1yZXBsaWNhdG9yLXFjb20uYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXJlcGxpY2F0b3ItcWNvbS5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZhZGV2LT5yZXM7CiAJc3RydWN0IGNvcmVzaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IHJlcGxpY2F0b3Jfc3RhdGUgKmRydmRhdGE7Ci0Jc3RydWN0IGNvcmVzaWdodF9kZXNjICpkZXNjOworCXN0cnVjdCBjb3Jlc2lnaHRfZGVzYyBkZXNjID0geyAwIH07CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGFkZXYtPmRldi5vZl9ub2RlOwogCXZvaWQgX19pb21lbSAqYmFzZTsKIApAQCAtMTM0LDE2ICsxMzQsMTIgQEAKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBkcnZkYXRhKTsKIAlwbV9ydW50aW1lX3B1dCgmYWRldi0+ZGV2KTsKIAotCWRlc2MgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRlc2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRlc2MpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZGVzYy0+dHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9MSU5LOwotCWRlc2MtPnN1YnR5cGUubGlua19zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX0xJTktfU1BMSVQ7Ci0JZGVzYy0+b3BzID0gJnJlcGxpY2F0b3JfY3Nfb3BzOwotCWRlc2MtPnBkYXRhID0gYWRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JZGVzYy0+ZGV2ID0gJmFkZXYtPmRldjsKLQlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcihkZXNjKTsKKwlkZXNjLnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfTElOSzsKKwlkZXNjLnN1YnR5cGUubGlua19zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX0xJTktfU1BMSVQ7CisJZGVzYy5vcHMgPSAmcmVwbGljYXRvcl9jc19vcHM7CisJZGVzYy5wZGF0YSA9IGFkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWRlc2MuZGV2ID0gJmFkZXYtPmRldjsKKwlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcigmZGVzYyk7CiAJaWYgKElTX0VSUihkcnZkYXRhLT5jc2RldikpCiAJCXJldHVybiBQVFJfRVJSKGRydmRhdGEtPmNzZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1yZXBsaWNhdG9yLmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXJlcGxpY2F0b3IuYwppbmRleCBjNjk4MmUzLi4zNzU2ZTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXJlcGxpY2F0b3IuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXJlcGxpY2F0b3IuYwpAQCAtNjksNyArNjksNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJc3RydWN0IGNvcmVzaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IHJlcGxpY2F0b3JfZHJ2ZGF0YSAqZHJ2ZGF0YTsKLQlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgKmRlc2M7CisJc3RydWN0IGNvcmVzaWdodF9kZXNjIGRlc2MgPSB7IDAgfTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAKIAlpZiAobnApIHsKQEAgLTk1LDE4ICs5NSwxMiBAQAogCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRydmRhdGEpOwogCi0JZGVzYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGVzYyksIEdGUF9LRVJORUwpOwotCWlmICghZGVzYykgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9kaXNhYmxlX3BtOwotCX0KLQotCWRlc2MtPnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfTElOSzsKLQlkZXNjLT5zdWJ0eXBlLmxpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9MSU5LX1NQTElUOwotCWRlc2MtPm9wcyA9ICZyZXBsaWNhdG9yX2NzX29wczsKLQlkZXNjLT5wZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWRlc2MtPmRldiA9ICZwZGV2LT5kZXY7Ci0JZHJ2ZGF0YS0+Y3NkZXYgPSBjb3Jlc2lnaHRfcmVnaXN0ZXIoZGVzYyk7CisJZGVzYy50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX0xJTks7CisJZGVzYy5zdWJ0eXBlLmxpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9MSU5LX1NQTElUOworCWRlc2Mub3BzID0gJnJlcGxpY2F0b3JfY3Nfb3BzOworCWRlc2MucGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlkZXNjLmRldiA9ICZwZGV2LT5kZXY7CisJZHJ2ZGF0YS0+Y3NkZXYgPSBjb3Jlc2lnaHRfcmVnaXN0ZXIoJmRlc2MpOwogCWlmIChJU19FUlIoZHJ2ZGF0YS0+Y3NkZXYpKSB7CiAJCXJldCA9IFBUUl9FUlIoZHJ2ZGF0YS0+Y3NkZXYpOwogCQlnb3RvIG91dF9kaXNhYmxlX3BtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1zdG0uYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtc3RtLmMKaW5kZXggNzNiZTU4YS4uNDllMGYxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1zdG0uYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXN0bS5jCkBAIC0xMDUsMTAgKzEwNSwxMiBAQAogLyoqCiAgKiBzdHJ1Y3QgY2hhbm5lbF9zcGFjZSAtIGNlbnRyYWwgbWFuYWdlbWVudCBlbnRpdHkgZm9yIGV4dGVuZGVkIHBvcnRzCiAgKiBAYmFzZToJCW1lbW9yeSBtYXBwZWQgYmFzZSBhZGRyZXNzIHdoZXJlIGNoYW5uZWxzIHN0YXJ0LgorICogQHBoeXM6CQlwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgY2hhbm5lbCByZWdpb24uCiAgKiBAZ3VhcmFuZWVkOgkJaXMgdGhlIGNoYW5uZWwgZGVsaXZlcnkgZ3VhcmFudGVlZC4KICAqLwogc3RydWN0IGNoYW5uZWxfc3BhY2UgewogCXZvaWQgX19pb21lbQkJKmJhc2U7CisJcGh5c19hZGRyX3QJCXBoeXM7CiAJdW5zaWduZWQgbG9uZwkJKmd1YXJhbnRlZWQ7CiB9OwogCkBAIC0xOTYsNyArMTk4LDcgQEAKIH0KIAogc3RhdGljIGludCBzdG1fZW5hYmxlKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldiwKLQkJICAgICAgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwgdTMyIG1vZGUpCisJCSAgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdTMyIG1vZGUpCiB7CiAJdTMyIHZhbDsKIAlzdHJ1Y3Qgc3RtX2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoY3NkZXYtPmRldi5wYXJlbnQpOwpAQCAtMjU4LDcgKzI2MCw4IEBACiAJCXN0bV9od2V2ZW50X2Rpc2FibGVfaHcoZHJ2ZGF0YSk7CiB9CiAKLXN0YXRpYyB2b2lkIHN0bV9kaXNhYmxlKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldikKK3N0YXRpYyB2b2lkIHN0bV9kaXNhYmxlKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldiwKKwkJCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3Qgc3RtX2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoY3NkZXYtPmRldi5wYXJlbnQpOwogCkBAIC0zNTMsNyArMzU2LDI0IEBACiAJaWYgKCFkcnZkYXRhIHx8ICFkcnZkYXRhLT5jc2RldikKIAkJcmV0dXJuOwogCi0Jc3RtX2Rpc2FibGUoZHJ2ZGF0YS0+Y3NkZXYpOworCXN0bV9kaXNhYmxlKGRydmRhdGEtPmNzZGV2LCBOVUxMKTsKK30KKworc3RhdGljIHBoeXNfYWRkcl90CitzdG1fbW1pb19hZGRyKHN0cnVjdCBzdG1fZGF0YSAqc3RtX2RhdGEsIHVuc2lnbmVkIGludCBtYXN0ZXIsCisJICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBucl9jaGFucykKK3sKKwlzdHJ1Y3Qgc3RtX2RydmRhdGEgKmRydmRhdGEgPSBjb250YWluZXJfb2Yoc3RtX2RhdGEsCisJCQkJCQkgICBzdHJ1Y3Qgc3RtX2RydmRhdGEsIHN0bSk7CisJcGh5c19hZGRyX3QgYWRkcjsKKworCWFkZHIgPSBkcnZkYXRhLT5jaHMucGh5cyArIGNoYW5uZWwgKiBCWVRFU19QRVJfQ0hBTk5FTDsKKworCWlmIChvZmZzZXRfaW5fcGFnZShhZGRyKSB8fAorCSAgICBvZmZzZXRfaW5fcGFnZShucl9jaGFucyAqIEJZVEVTX1BFUl9DSEFOTkVMKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gYWRkcjsKIH0KIAogc3RhdGljIGxvbmcgc3RtX2dlbmVyaWNfc2V0X29wdGlvbnMoc3RydWN0IHN0bV9kYXRhICpzdG1fZGF0YSwKQEAgLTYxNiw3ICs2MzYsNyBAQAogc3RhdGljIERFVklDRV9BVFRSX1JXKHRyYWNlaWQpOwogCiAjZGVmaW5lIGNvcmVzaWdodF9zdG1fc2ltcGxlX2Z1bmMobmFtZSwgb2Zmc2V0KQlcCi0JY29yZXNpZ2h0X3NpbXBsZV9mdW5jKHN0cnVjdCBzdG1fZHJ2ZGF0YSwgbmFtZSwgb2Zmc2V0KQorCWNvcmVzaWdodF9zaW1wbGVfZnVuYyhzdHJ1Y3Qgc3RtX2RydmRhdGEsIE5VTEwsIG5hbWUsIG9mZnNldCkKIAogY29yZXNpZ2h0X3N0bV9zaW1wbGVfZnVuYyh0Y3NyLCBTVE1UQ1NSKTsKIGNvcmVzaWdodF9zdG1fc2ltcGxlX2Z1bmModHNmcmVxciwgU1RNVFNGUkVRUik7CkBAIC03NjEsNyArNzgxLDkgQEAKIAlkcnZkYXRhLT5zdG0uc3dfZW5kID0gMTsKIAlkcnZkYXRhLT5zdG0uaHdfb3ZlcnJpZGUgPSB0cnVlOwogCWRydmRhdGEtPnN0bS5zd19uY2hhbm5lbHMgPSBkcnZkYXRhLT5udW1zcDsKKwlkcnZkYXRhLT5zdG0uc3dfbW1pb3N6ID0gQllURVNfUEVSX0NIQU5ORUw7CiAJZHJ2ZGF0YS0+c3RtLnBhY2tldCA9IHN0bV9nZW5lcmljX3BhY2tldDsKKwlkcnZkYXRhLT5zdG0ubW1pb19hZGRyID0gc3RtX21taW9fYWRkcjsKIAlkcnZkYXRhLT5zdG0ubGluayA9IHN0bV9nZW5lcmljX2xpbms7CiAJZHJ2ZGF0YS0+c3RtLnVubGluayA9IHN0bV9nZW5lcmljX3VubGluazsKIAlkcnZkYXRhLT5zdG0uc2V0X29wdGlvbnMgPSBzdG1fZ2VuZXJpY19zZXRfb3B0aW9uczsKQEAgLTc3OCw3ICs4MDAsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmFkZXYtPnJlczsKIAlzdHJ1Y3QgcmVzb3VyY2UgY2hfcmVzOwogCXNpemVfdCByZXNfc2l6ZSwgYml0bWFwX3NpemU7Ci0Jc3RydWN0IGNvcmVzaWdodF9kZXNjICpkZXNjOworCXN0cnVjdCBjb3Jlc2lnaHRfZGVzYyBkZXNjID0geyAwIH07CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGFkZXYtPmRldi5vZl9ub2RlOwogCiAJaWYgKG5wKSB7CkBAIC04MDgsNiArODMwLDcgQEAKIAlyZXQgPSBzdG1fZ2V0X3Jlc291cmNlX2J5bmFtZShucCwgInN0bS1zdGltdWx1cy1iYXNlIiwgJmNoX3Jlcyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKKwlkcnZkYXRhLT5jaHMucGh5cyA9IGNoX3Jlcy5zdGFydDsKIAogCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCAmY2hfcmVzKTsKIAlpZiAoSVNfRVJSKGJhc2UpKQpAQCAtODQzLDE5ICs4NjYsMTMgQEAKIAkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CiAJfQogCi0JZGVzYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGVzYyksIEdGUF9LRVJORUwpOwotCWlmICghZGVzYykgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIHN0bV91bnJlZ2lzdGVyOwotCX0KLQotCWRlc2MtPnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfU09VUkNFOwotCWRlc2MtPnN1YnR5cGUuc291cmNlX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU09VUkNFX1NPRlRXQVJFOwotCWRlc2MtPm9wcyA9ICZzdG1fY3Nfb3BzOwotCWRlc2MtPnBkYXRhID0gcGRhdGE7Ci0JZGVzYy0+ZGV2ID0gZGV2OwotCWRlc2MtPmdyb3VwcyA9IGNvcmVzaWdodF9zdG1fZ3JvdXBzOwotCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKGRlc2MpOworCWRlc2MudHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9TT1VSQ0U7CisJZGVzYy5zdWJ0eXBlLnNvdXJjZV9zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX1NPVVJDRV9TT0ZUV0FSRTsKKwlkZXNjLm9wcyA9ICZzdG1fY3Nfb3BzOworCWRlc2MucGRhdGEgPSBwZGF0YTsKKwlkZXNjLmRldiA9IGRldjsKKwlkZXNjLmdyb3VwcyA9IGNvcmVzaWdodF9zdG1fZ3JvdXBzOworCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKCZkZXNjKTsKIAlpZiAoSVNfRVJSKGRydmRhdGEtPmNzZGV2KSkgewogCQlyZXQgPSBQVFJfRVJSKGRydmRhdGEtPmNzZGV2KTsKIAkJZ290byBzdG1fdW5yZWdpc3RlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLWV0Zi5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMtZXRmLmMKaW5kZXggNDY2YWY4Ni4uZDY5NDFlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMtZXRmLmMKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMtZXRmLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlICJjb3Jlc2lnaHQtcHJpdi5oIgogI2luY2x1ZGUgImNvcmVzaWdodC10bWMuaCIKIAotdm9pZCB0bWNfZXRiX2VuYWJsZV9odyhzdHJ1Y3QgdG1jX2RydmRhdGEgKmRydmRhdGEpCitzdGF0aWMgdm9pZCB0bWNfZXRiX2VuYWJsZV9odyhzdHJ1Y3QgdG1jX2RydmRhdGEgKmRydmRhdGEpCiB7CiAJQ1NfVU5MT0NLKGRydmRhdGEtPmJhc2UpOwogCkBAIC00OCw2ICs0OCw3IEBACiAJaW50IGk7CiAKIAlidWZwID0gZHJ2ZGF0YS0+YnVmOworCWRydmRhdGEtPmxlbiA9IDA7CiAJd2hpbGUgKDEpIHsKIAkJZm9yIChpID0gMDsgaSA8IGRydmRhdGEtPm1lbXdpZHRoOyBpKyspIHsKIAkJCXJlYWRfZGF0YSA9IHJlYWRsX3JlbGF4ZWQoZHJ2ZGF0YS0+YmFzZSArIFRNQ19SUkQpOwpAQCAtNTUsNiArNTYsNyBAQAogCQkJCXJldHVybjsKIAkJCW1lbWNweShidWZwLCAmcmVhZF9kYXRhLCA0KTsKIAkJCWJ1ZnAgKz0gNDsKKwkJCWRydmRhdGEtPmxlbiArPSA0OwogCQl9CiAJfQogfQpAQCAtMTY2LDcgKzE2OCw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2ZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKIAogCS8qIEZyZWUgbWVtb3J5IG91dHNpZGUgdGhlIHNwaW5sb2NrIGlmIG5lZWQgYmUgKi8KLQlpZiAoIXVzZWQgJiYgYnVmKQorCWlmICghdXNlZCkKIAkJa2ZyZWUoYnVmKTsKIAogCWlmICghcmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMtZXRyLmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy1ldHIuYwppbmRleCA2ODhiZTllLi44ODZlYTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy1ldHIuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy1ldHIuYwpAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgImNvcmVzaWdodC1wcml2LmgiCiAjaW5jbHVkZSAiY29yZXNpZ2h0LXRtYy5oIgogCi12b2lkIHRtY19ldHJfZW5hYmxlX2h3KHN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSkKK3N0YXRpYyB2b2lkIHRtY19ldHJfZW5hYmxlX2h3KHN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSkKIHsKIAl1MzIgYXhpY3RsOwogCkBAIC02NCwxMSArNjQsMTcgQEAKIAlyd3AgPSByZWFkbF9yZWxheGVkKGRydmRhdGEtPmJhc2UgKyBUTUNfUldQKTsKIAl2YWwgPSByZWFkbF9yZWxheGVkKGRydmRhdGEtPmJhc2UgKyBUTUNfU1RTKTsKIAotCS8qIEhvdyBtdWNoIG1lbW9yeSBkbyB3ZSBzdGlsbCBoYXZlICovCi0JaWYgKHZhbCAmIEJJVCgwKSkKKwkvKgorCSAqIEFkanVzdCB0aGUgYnVmZmVyIHRvIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRyYWNlIGRhdGEKKwkgKiBhbmQgdXBkYXRlIHRoZSBhdmFpbGFibGUgdHJhY2UgZGF0YS4KKwkgKi8KKwlpZiAodmFsICYgVE1DX1NUU19GVUxMKSB7CiAJCWRydmRhdGEtPmJ1ZiA9IGRydmRhdGEtPnZhZGRyICsgcndwIC0gZHJ2ZGF0YS0+cGFkZHI7Ci0JZWxzZQorCQlkcnZkYXRhLT5sZW4gPSBkcnZkYXRhLT5zaXplOworCX0gZWxzZSB7CiAJCWRydmRhdGEtPmJ1ZiA9IGRydmRhdGEtPnZhZGRyOworCQlkcnZkYXRhLT5sZW4gPSByd3AgLSBkcnZkYXRhLT5wYWRkcjsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHRtY19ldHJfZGlzYWJsZV9odyhzdHJ1Y3QgdG1jX2RydmRhdGEgKmRydmRhdGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMuYwppbmRleCA5ZTAyYWM5Li5kODUxN2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLmMKQEAgLTM4LDggKzM4LDcgQEAKIAlpZiAoY29yZXNpZ2h0X3RpbWVvdXQoZHJ2ZGF0YS0+YmFzZSwKIAkJCSAgICAgIFRNQ19TVFMsIFRNQ19TVFNfVE1DUkVBRFlfQklULCAxKSkgewogCQlkZXZfZXJyKGRydmRhdGEtPmRldiwKLQkJCSJ0aW1lb3V0IG9ic2VydmVkIHdoZW4gcHJvYmluZyBhdCBvZmZzZXQgJSN4XG4iLAotCQkJVE1DX1NUUyk7CisJCQkidGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBUTUMgdG8gYmUgUmVhZHlcbiIpOwogCX0KIH0KIApAQCAtNTYsOCArNTUsNyBAQAogCWlmIChjb3Jlc2lnaHRfdGltZW91dChkcnZkYXRhLT5iYXNlLAogCQkJICAgICAgVE1DX0ZGQ1IsIFRNQ19GRkNSX0ZMVVNITUFOX0JJVCwgMCkpIHsKIAkJZGV2X2VycihkcnZkYXRhLT5kZXYsCi0JCQkidGltZW91dCBvYnNlcnZlZCB3aGVuIHByb2JpbmcgYXQgb2Zmc2V0ICUjeFxuIiwKLQkJCVRNQ19GRkNSKTsKKwkJInRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgY29tcGxldGlvbiBvZiBNYW51YWwgRmx1c2hcbiIpOwogCX0KIAogCXRtY193YWl0X2Zvcl90bWNyZWFkeShkcnZkYXRhKTsKQEAgLTE0MCw4ICsxMzgsOCBAQAogCQkJCQkJICAgc3RydWN0IHRtY19kcnZkYXRhLCBtaXNjZGV2KTsKIAljaGFyICpidWZwID0gZHJ2ZGF0YS0+YnVmICsgKnBwb3M7CiAKLQlpZiAoKnBwb3MgKyBsZW4gPiBkcnZkYXRhLT5zaXplKQotCQlsZW4gPSBkcnZkYXRhLT5zaXplIC0gKnBwb3M7CisJaWYgKCpwcG9zICsgbGVuID4gZHJ2ZGF0YS0+bGVuKQorCQlsZW4gPSBkcnZkYXRhLT5sZW4gLSAqcHBvczsKIAogCWlmIChkcnZkYXRhLT5jb25maWdfdHlwZSA9PSBUTUNfQ09ORklHX1RZUEVfRVRSKSB7CiAJCWlmIChidWZwID09IChjaGFyICopKGRydmRhdGEtPnZhZGRyICsgZHJ2ZGF0YS0+c2l6ZSkpCkBAIC0xNjAsNyArMTU4LDcgQEAKIAkqcHBvcyArPSBsZW47CiAKIAlkZXZfZGJnKGRydmRhdGEtPmRldiwgIiVzOiAlenUgYnl0ZXMgY29waWVkLCAlZCBieXRlcyBsZWZ0XG4iLAotCQlfX2Z1bmNfXywgbGVuLCAoaW50KShkcnZkYXRhLT5zaXplIC0gKnBwb3MpKTsKKwkJX19mdW5jX18sIGxlbiwgKGludCkoZHJ2ZGF0YS0+bGVuIC0gKnBwb3MpKTsKIAlyZXR1cm4gbGVuOwogfQogCkBAIC0yMjAsNyArMjE4LDcgQEAKIH0KIAogI2RlZmluZSBjb3Jlc2lnaHRfdG1jX3NpbXBsZV9mdW5jKG5hbWUsIG9mZnNldCkJCQlcCi0JY29yZXNpZ2h0X3NpbXBsZV9mdW5jKHN0cnVjdCB0bWNfZHJ2ZGF0YSwgbmFtZSwgb2Zmc2V0KQorCWNvcmVzaWdodF9zaW1wbGVfZnVuYyhzdHJ1Y3QgdG1jX2RydmRhdGEsIE5VTEwsIG5hbWUsIG9mZnNldCkKIAogY29yZXNpZ2h0X3RtY19zaW1wbGVfZnVuYyhyc3osIFRNQ19SU1opOwogY29yZXNpZ2h0X3RtY19zaW1wbGVfZnVuYyhzdHMsIFRNQ19TVFMpOwpAQCAtMjQ5LDggKzI0Nyw4IEBACiAJTlVMTCwKIH07CiAKLXNzaXplX3QgdHJpZ2dlcl9jbnRyX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgdHJpZ2dlcl9jbnRyX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7CiAJdW5zaWduZWQgbG9uZyB2YWwgPSBkcnZkYXRhLT50cmlnZ2VyX2NudHI7CkBAIC0zMDQsMjcgKzMwMiwzMiBAQAogCXN0cnVjdCBjb3Jlc2lnaHRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBOVUxMOwogCXN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZhZGV2LT5yZXM7Ci0Jc3RydWN0IGNvcmVzaWdodF9kZXNjICpkZXNjOworCXN0cnVjdCBjb3Jlc2lnaHRfZGVzYyBkZXNjID0geyAwIH07CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGFkZXYtPmRldi5vZl9ub2RlOwogCiAJaWYgKG5wKSB7CiAJCXBkYXRhID0gb2ZfZ2V0X2NvcmVzaWdodF9wbGF0Zm9ybV9kYXRhKGRldiwgbnApOwotCQlpZiAoSVNfRVJSKHBkYXRhKSkKLQkJCXJldHVybiBQVFJfRVJSKHBkYXRhKTsKKwkJaWYgKElTX0VSUihwZGF0YSkpIHsKKwkJCXJldCA9IFBUUl9FUlIocGRhdGEpOworCQkJZ290byBvdXQ7CisJCX0KIAkJYWRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKIAl9CiAKKwlyZXQgPSAtRU5PTUVNOwogCWRydmRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRydmRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRydmRhdGEpCi0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIG91dDsKIAogCWRydmRhdGEtPmRldiA9ICZhZGV2LT5kZXY7CiAJZGV2X3NldF9kcnZkYXRhKGRldiwgZHJ2ZGF0YSk7CiAKIAkvKiBWYWxpZGl0eSBmb3IgdGhlIHJlc291cmNlIGlzIGFscmVhZHkgY2hlY2tlZCBieSB0aGUgQU1CQSBjb3JlICovCiAJYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7Ci0JaWYgKElTX0VSUihiYXNlKSkKLQkJcmV0dXJuIFBUUl9FUlIoYmFzZSk7CisJaWYgKElTX0VSUihiYXNlKSkgeworCQlyZXQgPSBQVFJfRVJSKGJhc2UpOworCQlnb3RvIG91dDsKKwl9CiAKIAlkcnZkYXRhLT5iYXNlID0gYmFzZTsKIApAQCAtMzQ3LDMzICszNTAsMjggQEAKIAogCXBtX3J1bnRpbWVfcHV0KCZhZGV2LT5kZXYpOwogCi0JZGVzYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGVzYyksIEdGUF9LRVJORUwpOwotCWlmICghZGVzYykgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9kZXZtX2t6YWxsb2M7Ci0JfQotCi0JZGVzYy0+cGRhdGEgPSBwZGF0YTsKLQlkZXNjLT5kZXYgPSBkZXY7Ci0JZGVzYy0+c3VidHlwZS5zaW5rX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU0lOS19CVUZGRVI7Ci0JZGVzYy0+Z3JvdXBzID0gY29yZXNpZ2h0X3RtY19ncm91cHM7CisJZGVzYy5wZGF0YSA9IHBkYXRhOworCWRlc2MuZGV2ID0gZGV2OworCWRlc2MuZ3JvdXBzID0gY29yZXNpZ2h0X3RtY19ncm91cHM7CiAKIAlpZiAoZHJ2ZGF0YS0+Y29uZmlnX3R5cGUgPT0gVE1DX0NPTkZJR19UWVBFX0VUQikgewotCQlkZXNjLT50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX1NJTks7Ci0JCWRlc2MtPm9wcyA9ICZ0bWNfZXRiX2NzX29wczsKKwkJZGVzYy50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX1NJTks7CisJCWRlc2Muc3VidHlwZS5zaW5rX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU0lOS19CVUZGRVI7CisJCWRlc2Mub3BzID0gJnRtY19ldGJfY3Nfb3BzOwogCX0gZWxzZSBpZiAoZHJ2ZGF0YS0+Y29uZmlnX3R5cGUgPT0gVE1DX0NPTkZJR19UWVBFX0VUUikgewotCQlkZXNjLT50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX1NJTks7Ci0JCWRlc2MtPm9wcyA9ICZ0bWNfZXRyX2NzX29wczsKKwkJZGVzYy50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX1NJTks7CisJCWRlc2Muc3VidHlwZS5zaW5rX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU0lOS19CVUZGRVI7CisJCWRlc2Mub3BzID0gJnRtY19ldHJfY3Nfb3BzOwogCX0gZWxzZSB7Ci0JCWRlc2MtPnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfTElOS1NJTks7Ci0JCWRlc2MtPnN1YnR5cGUubGlua19zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX0xJTktfRklGTzsKLQkJZGVzYy0+b3BzID0gJnRtY19ldGZfY3Nfb3BzOworCQlkZXNjLnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfTElOS1NJTks7CisJCWRlc2Muc3VidHlwZS5saW5rX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfTElOS19GSUZPOworCQlkZXNjLm9wcyA9ICZ0bWNfZXRmX2NzX29wczsKIAl9CiAKLQlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcihkZXNjKTsKKwlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcigmZGVzYyk7CiAJaWYgKElTX0VSUihkcnZkYXRhLT5jc2RldikpIHsKIAkJcmV0ID0gUFRSX0VSUihkcnZkYXRhLT5jc2Rldik7Ci0JCWdvdG8gZXJyX2Rldm1fa3phbGxvYzsKKwkJZ290byBvdXQ7CiAJfQogCiAJZHJ2ZGF0YS0+bWlzY2Rldi5uYW1lID0gcGRhdGEtPm5hbWU7CkBAIC0zODEsMTYgKzM3OSw4IEBACiAJZHJ2ZGF0YS0+bWlzY2Rldi5mb3BzID0gJnRtY19mb3BzOwogCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmRydmRhdGEtPm1pc2NkZXYpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyX21pc2NfcmVnaXN0ZXI7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX21pc2NfcmVnaXN0ZXI6Ci0JY29yZXNpZ2h0X3VucmVnaXN0ZXIoZHJ2ZGF0YS0+Y3NkZXYpOwotZXJyX2Rldm1fa3phbGxvYzoKLQlpZiAoZHJ2ZGF0YS0+Y29uZmlnX3R5cGUgPT0gVE1DX0NPTkZJR19UWVBFX0VUUikKLQkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBkcnZkYXRhLT5zaXplLAotCQkJCWRydmRhdGEtPnZhZGRyLCBkcnZkYXRhLT5wYWRkcik7CisJCWNvcmVzaWdodF91bnJlZ2lzdGVyKGRydmRhdGEtPmNzZGV2KTsKK291dDoKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy5oIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMuaAppbmRleCA1YzVmZTJhLi40NGIzYWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy5oCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLmgKQEAgLTk4LDcgKzk4LDggQEAKICAqIEBidWY6CWFyZWEgb2YgbWVtb3J5IHdoZXJlIHRyYWNlIGRhdGEgZ2V0IHNlbnQuCiAgKiBAcGFkZHI6CURNQSBzdGFydCBsb2NhdGlvbiBpbiBSQU0uCiAgKiBAdmFkZHI6CXZpcnR1YWwgcmVwcmVzZW50YXRpb24gb2YgQHBhZGRyLgotICogQHNpemU6CUBidWYgc2l6ZS4KKyAqIEBzaXplOgl0cmFjZSBidWZmZXIgc2l6ZS4KKyAqIEBsZW46CXNpemUgb2YgdGhlIGF2YWlsYWJsZSB0cmFjZS4KICAqIEBtb2RlOglob3cgdGhpcyBUTUMgaXMgYmVpbmcgdXNlZC4KICAqIEBjb25maWdfdHlwZTogVE1DIHZhcmlhbnQsIG11c3QgYmUgb2YgdHlwZSBAdG1jX2NvbmZpZ190eXBlLgogICogQG1lbXdpZHRoOgl3aWR0aCBvZiB0aGUgbWVtb3J5IGludGVyZmFjZSBkYXRhYnVzLCBpbiBieXRlcy4KQEAgLTExNSw2ICsxMTYsNyBAQAogCWRtYV9hZGRyX3QJCXBhZGRyOwogCXZvaWQgX19pb21lbQkJKnZhZGRyOwogCXUzMgkJCXNpemU7CisJdTMyCQkJbGVuOwogCWxvY2FsX3QJCQltb2RlOwogCWVudW0gdG1jX2NvbmZpZ190eXBlCWNvbmZpZ190eXBlOwogCWVudW0gdG1jX21lbV9pbnRmX3dpZHRoCW1lbXdpZHRoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10cGl1LmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRwaXUuYwppbmRleCA0ZTQ3MWUyLi4wNjczYmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRwaXUuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRwaXUuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAJc3RydWN0IGNvcmVzaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IHRwaXVfZHJ2ZGF0YSAqZHJ2ZGF0YTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZhZGV2LT5yZXM7Ci0Jc3RydWN0IGNvcmVzaWdodF9kZXNjICpkZXNjOworCXN0cnVjdCBjb3Jlc2lnaHRfZGVzYyBkZXNjID0geyAwIH07CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGFkZXYtPmRldi5vZl9ub2RlOwogCiAJaWYgKG5wKSB7CkBAIC0xNTQsMTYgKzE1NCwxMiBAQAogCiAJcG1fcnVudGltZV9wdXQoJmFkZXYtPmRldik7CiAKLQlkZXNjID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkZXNjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXNjKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRlc2MtPnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfU0lOSzsKLQlkZXNjLT5zdWJ0eXBlLnNpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9TSU5LX1BPUlQ7Ci0JZGVzYy0+b3BzID0gJnRwaXVfY3Nfb3BzOwotCWRlc2MtPnBkYXRhID0gcGRhdGE7Ci0JZGVzYy0+ZGV2ID0gZGV2OwotCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKGRlc2MpOworCWRlc2MudHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9TSU5LOworCWRlc2Muc3VidHlwZS5zaW5rX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU0lOS19QT1JUOworCWRlc2Mub3BzID0gJnRwaXVfY3Nfb3BzOworCWRlc2MucGRhdGEgPSBwZGF0YTsKKwlkZXNjLmRldiA9IGRldjsKKwlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcigmZGVzYyk7CiAJaWYgKElTX0VSUihkcnZkYXRhLT5jc2RldikpCiAJCXJldHVybiBQVFJfRVJSKGRydmRhdGEtPmNzZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC5jCmluZGV4IGQwOGQxYWIuLjdiZjAwYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LmMKQEAgLTI1Nyw3ICsyNTcsNyBAQAogewogCWlmIChhdG9taWNfZGVjX3JldHVybihjc2Rldi0+cmVmY250KSA9PSAwKSB7CiAJCWlmIChzb3VyY2Vfb3BzKGNzZGV2KS0+ZGlzYWJsZSkgewotCQkJc291cmNlX29wcyhjc2RldiktPmRpc2FibGUoY3NkZXYpOworCQkJc291cmNlX29wcyhjc2RldiktPmRpc2FibGUoY3NkZXYsIE5VTEwpOwogCQkJY3NkZXYtPmVuYWJsZSA9IGZhbHNlOwogCQl9CiAJfQpAQCAtNDI5LDcgKzQyOSw3IEBACiAKIAlwYXRoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksIEdGUF9LRVJORUwpOwogCWlmICghcGF0aCkKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJSU5JVF9MSVNUX0hFQUQocGF0aCk7CiAKQEAgLTcyNSw3ICs3MjUsOCBAQAogCQkvKiBXZSBoYXZlIGZvdW5kIGF0IGxlYXN0IG9uZSBvcnBoYW4gY29ubmVjdGlvbiAqLwogCQlpZiAoY29ubi0+Y2hpbGRfZGV2ID09IE5VTEwpIHsKIAkJCS8qIERvZXMgaXQgbWF0Y2ggdGhpcyBuZXdseSBhZGRlZCBkZXZpY2U/ICovCi0JCQlpZiAoIXN0cmNtcChkZXZfbmFtZSgmY3NkZXYtPmRldiksIGNvbm4tPmNoaWxkX25hbWUpKSB7CisJCQlpZiAoY29ubi0+Y2hpbGRfbmFtZSAmJgorCQkJICAgICFzdHJjbXAoZGV2X25hbWUoJmNzZGV2LT5kZXYpLCBjb25uLT5jaGlsZF9uYW1lKSkgewogCQkJCWNvbm4tPmNoaWxkX2RldiA9IGNzZGV2OwogCQkJfSBlbHNlIHsKIAkJCQkvKiBUaGlzIGNvbXBvbmVudCBzdGlsbCBoYXMgYW4gb3JwaGFuICovCkBAIC04OTMsNyArODk0LDcgQEAKIAlpbnQgbnJfcmVmY250cyA9IDE7CiAJYXRvbWljX3QgKnJlZmNudHMgPSBOVUxMOwogCXN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldjsKLQlzdHJ1Y3QgY29yZXNpZ2h0X2Nvbm5lY3Rpb24gKmNvbm5zOworCXN0cnVjdCBjb3Jlc2lnaHRfY29ubmVjdGlvbiAqY29ubnMgPSBOVUxMOwogCiAJY3NkZXYgPSBremFsbG9jKHNpemVvZigqY3NkZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNzZGV2KSB7CkBAIC05MjEsMTYgKzkyMiwyMCBAQAogCiAJY3NkZXYtPm5yX2lucG9ydCA9IGRlc2MtPnBkYXRhLT5ucl9pbnBvcnQ7CiAJY3NkZXYtPm5yX291dHBvcnQgPSBkZXNjLT5wZGF0YS0+bnJfb3V0cG9ydDsKLQljb25ucyA9IGtjYWxsb2MoY3NkZXYtPm5yX291dHBvcnQsIHNpemVvZigqY29ubnMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNvbm5zKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2t6YWxsb2NfY29ubnM7Ci0JfQogCi0JZm9yIChpID0gMDsgaSA8IGNzZGV2LT5ucl9vdXRwb3J0OyBpKyspIHsKLQkJY29ubnNbaV0ub3V0cG9ydCA9IGRlc2MtPnBkYXRhLT5vdXRwb3J0c1tpXTsKLQkJY29ubnNbaV0uY2hpbGRfbmFtZSA9IGRlc2MtPnBkYXRhLT5jaGlsZF9uYW1lc1tpXTsKLQkJY29ubnNbaV0uY2hpbGRfcG9ydCA9IGRlc2MtPnBkYXRhLT5jaGlsZF9wb3J0c1tpXTsKKwkvKiBJbml0aWFsaXNlIGNvbm5lY3Rpb25zIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBvdXRwb3J0ICovCisJaWYgKGNzZGV2LT5ucl9vdXRwb3J0KSB7CisJCWNvbm5zID0ga2NhbGxvYyhjc2Rldi0+bnJfb3V0cG9ydCwgc2l6ZW9mKCpjb25ucyksIEdGUF9LRVJORUwpOworCQlpZiAoIWNvbm5zKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnJfa3phbGxvY19jb25uczsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBjc2Rldi0+bnJfb3V0cG9ydDsgaSsrKSB7CisJCQljb25uc1tpXS5vdXRwb3J0ID0gZGVzYy0+cGRhdGEtPm91dHBvcnRzW2ldOworCQkJY29ubnNbaV0uY2hpbGRfbmFtZSA9IGRlc2MtPnBkYXRhLT5jaGlsZF9uYW1lc1tpXTsKKwkJCWNvbm5zW2ldLmNoaWxkX3BvcnQgPSBkZXNjLT5wZGF0YS0+Y2hpbGRfcG9ydHNbaV07CisJCX0KIAl9CiAKIAljc2Rldi0+Y29ubnMgPSBjb25uczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9vZl9jb3Jlc2lnaHQuYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9vZl9jb3Jlc2lnaHQuYwppbmRleCBiNjhkYTE4Li42MjllMDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvb2ZfY29yZXNpZ2h0LmMKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L29mX2NvcmVzaWdodC5jCkBAIC0xNjYsNyArMTY2LDcgQEAKIAogCQkJcmRldiA9IG9mX2NvcmVzaWdodF9nZXRfZW5kcG9pbnRfZGV2aWNlKHJwYXJlbnQpOwogCQkJaWYgKCFyZGV2KQotCQkJCWNvbnRpbnVlOworCQkJCXJldHVybiBFUlJfUFRSKC1FUFJPQkVfREVGRVIpOwogCiAJCQlwZGF0YS0+Y2hpbGRfbmFtZXNbaV0gPSBkZXZfbmFtZShyZGV2KTsKIAkJCXBkYXRhLT5jaGlsZF9wb3J0c1tpXSA9IHJlbmRwb2ludC5pZDsKQEAgLTE4NCw2ICsxODQsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAl9CisJb2Zfbm9kZV9wdXQoZG4pOwogCiAJcmV0dXJuIHBkYXRhOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdDkxLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF0OTEuYwppbmRleCBmMjMzNzI2Li4xYmI5N2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF0OTEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF0OTEuYwpAQCAtMzgsNiArMzgsNyBAQAogI2RlZmluZSBBVDkxX0kyQ19USU1FT1VUCW1zZWNzX3RvX2ppZmZpZXMoMTAwKQkvKiB0cmFuc2ZlciB0aW1lb3V0ICovCiAjZGVmaW5lIEFUOTFfSTJDX0RNQV9USFJFU0hPTEQJOAkJCS8qIGVuYWJsZSBETUEgaWYgdHJhbnNmZXIgc2l6ZSBpcyBiaWdnZXIgdGhhbiB0aGlzIHRocmVzaG9sZCAqLwogI2RlZmluZSBBVVRPU1VTUEVORF9USU1FT1VUCQkyMDAwCisjZGVmaW5lIEFUOTFfSTJDX01BWF9BTFRfQ01EX0RBVEFfU0laRQkyNTYKIAogLyogQVQ5MSBUV0kgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUJQVQ5MV9UV0lfQ1IJCTB4MDAwMAkvKiBDb250cm9sIFJlZ2lzdGVyICovCkBAIC0xNDEsNiArMTQyLDcgQEAKIAl1bnNpZ25lZCB0d2lfY3dncl9yZWc7CiAJc3RydWN0IGF0OTFfdHdpX3BkYXRhICpwZGF0YTsKIAlib29sIHVzZV9kbWE7CisJYm9vbCB1c2VfYWx0X2NtZDsKIAlib29sIHJlY3ZfbGVuX2Fib3J0OwogCXUzMiBmaWZvX3NpemU7CiAJc3RydWN0IGF0OTFfdHdpX2RtYSBkbWE7CkBAIC0yNjksNyArMjcxLDcgQEAKIAogCS8qIHNlbmQgc3RvcCB3aGVuIGxhc3QgYnl0ZSBoYXMgYmVlbiB3cml0dGVuICovCiAJaWYgKC0tZGV2LT5idWZfbGVuID09IDApCi0JCWlmICghZGV2LT5wZGF0YS0+aGFzX2FsdF9jbWQpCisJCWlmICghZGV2LT51c2VfYWx0X2NtZCkKIAkJCWF0OTFfdHdpX3dyaXRlKGRldiwgQVQ5MV9UV0lfQ1IsIEFUOTFfVFdJX1NUT1ApOwogCiAJZGV2X2RiZyhkZXYtPmRldiwgIndyb3RlIDB4JXgsIHRvIGdvICVkXG4iLCAqZGV2LT5idWYsIGRldi0+YnVmX2xlbik7CkBAIC0yOTIsNyArMjk0LDcgQEAKIAkgKiB3ZSBqdXN0IGhhdmUgdG8gZW5hYmxlIFRYQ09NUCBvbmUuCiAJICovCiAJYXQ5MV90d2lfd3JpdGUoZGV2LCBBVDkxX1RXSV9JRVIsIEFUOTFfVFdJX1RYQ09NUCk7Ci0JaWYgKCFkZXYtPnBkYXRhLT5oYXNfYWx0X2NtZCkKKwlpZiAoIWRldi0+dXNlX2FsdF9jbWQpCiAJCWF0OTFfdHdpX3dyaXRlKGRldiwgQVQ5MV9UV0lfQ1IsIEFUOTFfVFdJX1NUT1ApOwogfQogCkBAIC00MTAsNyArNDEyLDcgQEAKIAl9CiAKIAkvKiBzZW5kIHN0b3AgaWYgc2Vjb25kIGJ1dCBsYXN0IGJ5dGUgaGFzIGJlZW4gcmVhZCAqLwotCWlmICghZGV2LT5wZGF0YS0+aGFzX2FsdF9jbWQgJiYgZGV2LT5idWZfbGVuID09IDEpCisJaWYgKCFkZXYtPnVzZV9hbHRfY21kICYmIGRldi0+YnVmX2xlbiA9PSAxKQogCQlhdDkxX3R3aV93cml0ZShkZXYsIEFUOTFfVFdJX0NSLCBBVDkxX1RXSV9TVE9QKTsKIAogCWRldl9kYmcoZGV2LT5kZXYsICJyZWFkIDB4JXgsIHRvIGdvICVkXG4iLCAqZGV2LT5idWYsIGRldi0+YnVmX2xlbik7CkBAIC00MjYsNyArNDI4LDcgQEAKIAlkbWFfdW5tYXBfc2luZ2xlKGRldi0+ZGV2LCBzZ19kbWFfYWRkcmVzcygmZGV2LT5kbWEuc2dbMF0pLAogCQkJIGRldi0+YnVmX2xlbiwgRE1BX0ZST01fREVWSUNFKTsKIAotCWlmICghZGV2LT5wZGF0YS0+aGFzX2FsdF9jbWQpIHsKKwlpZiAoIWRldi0+dXNlX2FsdF9jbWQpIHsKIAkJLyogVGhlIGxhc3QgdHdvIGJ5dGVzIGhhdmUgdG8gYmUgcmVhZCB3aXRob3V0IHVzaW5nIGRtYSAqLwogCQlkZXYtPmJ1ZiArPSBkZXYtPmJ1Zl9sZW4gLSAyOwogCQlkZXYtPmJ1Zl9sZW4gPSAyOwpAQCAtNDQzLDcgKzQ0NSw3IEBACiAJc3RydWN0IGRtYV9jaGFuICpjaGFuX3J4ID0gZG1hLT5jaGFuX3J4OwogCXNpemVfdCBidWZfbGVuOwogCi0JYnVmX2xlbiA9IChkZXYtPnBkYXRhLT5oYXNfYWx0X2NtZCkgPyBkZXYtPmJ1Zl9sZW4gOiBkZXYtPmJ1Zl9sZW4gLSAyOworCWJ1Zl9sZW4gPSAoZGV2LT51c2VfYWx0X2NtZCkgPyBkZXYtPmJ1Zl9sZW4gOiBkZXYtPmJ1Zl9sZW4gLSAyOwogCWRtYS0+ZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOwogCiAJLyogS2VlcCBpbiBtaW5kIHRoYXQgd2Ugd29uJ3QgdXNlIGRtYSB0byByZWFkIHRoZSBsYXN0IHR3byBieXRlcyAqLwpAQCAtNjUxLDcgKzY1Myw3IEBACiAJCXVuc2lnbmVkIHN0YXJ0X2ZsYWdzID0gQVQ5MV9UV0lfU1RBUlQ7CiAKIAkJLyogaWYgb25seSBvbmUgYnl0ZSBpcyB0byBiZSByZWFkLCBpbW1lZGlhdGVseSBzdG9wIHRyYW5zZmVyICovCi0JCWlmICghaGFzX2FsdF9jbWQgJiYgZGV2LT5idWZfbGVuIDw9IDEgJiYKKwkJaWYgKCFkZXYtPnVzZV9hbHRfY21kICYmIGRldi0+YnVmX2xlbiA8PSAxICYmCiAJCSAgICAhKGRldi0+bXNnLT5mbGFncyAmIEkyQ19NX1JFQ1ZfTEVOKSkKIAkJCXN0YXJ0X2ZsYWdzIHw9IEFUOTFfVFdJX1NUT1A7CiAJCWF0OTFfdHdpX3dyaXRlKGRldiwgQVQ5MV9UV0lfQ1IsIHN0YXJ0X2ZsYWdzKTsKQEAgLTc0NSw3ICs3NDcsNyBAQAogCWludCByZXQ7CiAJdW5zaWduZWQgaW50X2FkZHJfZmxhZyA9IDA7CiAJc3RydWN0IGkyY19tc2cgKm1fc3RhcnQgPSBtc2c7Ci0JYm9vbCBpc19yZWFkLCB1c2VfYWx0X2NtZCA9IGZhbHNlOworCWJvb2wgaXNfcmVhZDsKIAogCWRldl9kYmcoJmFkYXAtPmRldiwgImF0OTFfeGZlcjogcHJvY2Vzc2luZyAlZCBtZXNzYWdlczpcbiIsIG51bSk7CiAKQEAgLTc2OCwxNCArNzcwLDE2IEBACiAJCWF0OTFfdHdpX3dyaXRlKGRldiwgQVQ5MV9UV0lfSUFEUiwgaW50ZXJuYWxfYWRkcmVzcyk7CiAJfQogCisJZGV2LT51c2VfYWx0X2NtZCA9IGZhbHNlOwogCWlzX3JlYWQgPSAobV9zdGFydC0+ZmxhZ3MgJiBJMkNfTV9SRCk7CiAJaWYgKGRldi0+cGRhdGEtPmhhc19hbHRfY21kKSB7Ci0JCWlmIChtX3N0YXJ0LT5sZW4gPiAwKSB7CisJCWlmIChtX3N0YXJ0LT5sZW4gPiAwICYmCisJCSAgICBtX3N0YXJ0LT5sZW4gPCBBVDkxX0kyQ19NQVhfQUxUX0NNRF9EQVRBX1NJWkUpIHsKIAkJCWF0OTFfdHdpX3dyaXRlKGRldiwgQVQ5MV9UV0lfQ1IsIEFUOTFfVFdJX0FDTUVOKTsKIAkJCWF0OTFfdHdpX3dyaXRlKGRldiwgQVQ5MV9UV0lfQUNSLAogCQkJCSAgICAgICBBVDkxX1RXSV9BQ1JfREFUQUwobV9zdGFydC0+bGVuKSB8CiAJCQkJICAgICAgICgoaXNfcmVhZCkgPyBBVDkxX1RXSV9BQ1JfRElSIDogMCkpOwotCQkJdXNlX2FsdF9jbWQgPSB0cnVlOworCQkJZGV2LT51c2VfYWx0X2NtZCA9IHRydWU7CiAJCX0gZWxzZSB7CiAJCQlhdDkxX3R3aV93cml0ZShkZXYsIEFUOTFfVFdJX0NSLCBBVDkxX1RXSV9BQ01ESVMpOwogCQl9CkBAIC03ODQsNyArNzg4LDcgQEAKIAlhdDkxX3R3aV93cml0ZShkZXYsIEFUOTFfVFdJX01NUiwKIAkJICAgICAgIChtX3N0YXJ0LT5hZGRyIDw8IDE2KSB8CiAJCSAgICAgICBpbnRfYWRkcl9mbGFnIHwKLQkJICAgICAgICgoIXVzZV9hbHRfY21kICYmIGlzX3JlYWQpID8gQVQ5MV9UV0lfTVJFQUQgOiAwKSk7CisJCSAgICAgICAoKCFkZXYtPnVzZV9hbHRfY21kICYmIGlzX3JlYWQpID8gQVQ5MV9UV0lfTVJFQUQgOiAwKSk7CiAKIAlkZXYtPmJ1Zl9sZW4gPSBtX3N0YXJ0LT5sZW47CiAJZGV2LT5idWYgPSBtX3N0YXJ0LT5idWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJjbS1pcHJvYy5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iY20taXByb2MuYwppbmRleCAxOWM4NDM4Li45NWY3Y2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJjbS1pcHJvYy5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmNtLWlwcm9jLmMKQEAgLTE1OCw3ICsxNTgsNyBAQAogCiAJaWYgKHN0YXR1cyAmIEJJVChJU19NX1NUQVJUX0JVU1lfU0hJRlQpKSB7CiAJCWlwcm9jX2kyYy0+eGZlcl9pc19kb25lID0gMTsKLQkJY29tcGxldGVfYWxsKCZpcHJvY19pMmMtPmRvbmUpOworCQljb21wbGV0ZSgmaXByb2NfaTJjLT5kb25lKTsKIAl9CiAKIAl3cml0ZWwoc3RhdHVzLCBpcHJvY19pMmMtPmJhc2UgKyBJU19PRkZTRVQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iY20ta29uYS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iY20ta29uYS5jCmluZGV4IGFjOWY0NzYuLjI1OGNiOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmNtLWtvbmEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJjbS1rb25hLmMKQEAgLTIyOSw3ICsyMjksNyBAQAogCQkgICAgICAgZGV2LT5iYXNlICsgVFhGQ1JfT0ZGU0VUKTsKIAogCXdyaXRlbChzdGF0dXMgJiB+SVNSX1JFU0VSVkVEX01BU0ssIGRldi0+YmFzZSArIElTUl9PRkZTRVQpOwotCWNvbXBsZXRlX2FsbCgmZGV2LT5kb25lKTsKKwljb21wbGV0ZSgmZGV2LT5kb25lKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTY0Myw3ICs2NDMsNyBAQAogCQkJaWYgKHJjIDwgMCkgewogCQkJCWRldl9lcnIoZGV2LT5kZXZpY2UsCiAJCQkJCSJyZXN0YXJ0IGNtZCBmYWlsZWQgcmMgPSAlZFxuIiwgcmMpOwotCQkJCQlnb3RvIHhmZXJfc2VuZF9zdG9wOworCQkJCWdvdG8geGZlcl9zZW5kX3N0b3A7CiAJCQl9CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1icmNtc3RiLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJyY21zdGIuYwppbmRleCAzZjVhNGQ3Li4zODViNTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJyY21zdGIuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJyY21zdGIuYwpAQCAtMjI4LDcgKzIyOCw3IEBACiAJCXJldHVybiBJUlFfTk9ORTsKIAogCWJyY21zdGJfaTJjX2VuYWJsZV9kaXNhYmxlX2lycShkZXYsIElOVF9ESVNBQkxFKTsKLQljb21wbGV0ZV9hbGwoJmRldi0+ZG9uZSk7CisJY29tcGxldGUoJmRldi0+ZG9uZSk7CiAKIAlkZXZfZGJnKGRldi0+ZGV2aWNlLCAiaXNyIGhhbmRsZWQiKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWNhZGVuY2UuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY2FkZW5jZS5jCmluZGV4IDkwYmJkOWYuLjNjMTZhMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY2FkZW5jZS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY2FkZW5jZS5jCkBAIC03NjcsNyArNzY3LDcgQEAKICAqIGRlcGVuZGluZyBvbiB0aGUgc2NhbGluZyBkaXJlY3Rpb24uCiAgKgogICogUmV0dXJuOglOT1RJRllfU1RPUCBpZiB0aGUgcmF0ZSBjaGFuZ2Ugc2hvdWxkIGJlIGFib3J0ZWQsIE5PVElGWV9PSwotICoJCXRvIGFja25vd2VkZ2UgdGhlIGNoYW5nZSwgTk9USUZZX0RPTkUgaWYgdGhlIG5vdGlmaWNhdGlvbiBpcworICoJCXRvIGFja25vd2xlZGdlIHRoZSBjaGFuZ2UsIE5PVElGWV9ET05FIGlmIHRoZSBub3RpZmljYXRpb24gaXMKICAqCQljb25zaWRlcmVkIGlycmVsZXZhbnQuCiAgKi8KIHN0YXRpYyBpbnQgY2Ruc19pMmNfY2xrX25vdGlmaWVyX2NiKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3Jvcy1lYy10dW5uZWwuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3Jvcy1lYy10dW5uZWwuYwppbmRleCBhMGQ5NWZmLi4yZDVmZjg2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1jcm9zLWVjLXR1bm5lbC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3Jvcy1lYy10dW5uZWwuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAJbXNnLT5vdXRzaXplID0gcmVxdWVzdF9sZW47CiAJbXNnLT5pbnNpemUgPSByZXNwb25zZV9sZW47CiAKLQlyZXN1bHQgPSBjcm9zX2VjX2NtZF94ZmVyKGJ1cy0+ZWMsIG1zZyk7CisJcmVzdWx0ID0gY3Jvc19lY19jbWRfeGZlcl9zdGF0dXMoYnVzLT5lYywgbXNnKTsKIAlpZiAocmVzdWx0IDwgMCkgewogCQlkZXZfZXJyKGRldiwgIkVycm9yIHRyYW5zZmVycmluZyBFQyBpMmMgbWVzc2FnZSAlZFxuIiwgcmVzdWx0KTsKIAkJZ290byBleGl0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLWNvcmUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1jb3JlLmMKaW5kZXggYzY5MjJiOC4uZmNkOTczZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLWNvcmUuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUtY29yZS5jCkBAIC0zNjcsMTMgKzM2NywxNyBAQAogCWRldl9kYmcoZGV2LT5kZXYsICJGYXN0LW1vZGUgSENOVDpMQ05UID0gJWQ6JWRcbiIsIGhjbnQsIGxjbnQpOwogCiAJLyogQ29uZmlndXJlIFNEQSBIb2xkIFRpbWUgaWYgcmVxdWlyZWQgKi8KLQlpZiAoZGV2LT5zZGFfaG9sZF90aW1lKSB7Ci0JCXJlZyA9IGR3X3JlYWRsKGRldiwgRFdfSUNfQ09NUF9WRVJTSU9OKTsKLQkJaWYgKHJlZyA+PSBEV19JQ19TREFfSE9MRF9NSU5fVkVSUykKKwlyZWcgPSBkd19yZWFkbChkZXYsIERXX0lDX0NPTVBfVkVSU0lPTik7CisJaWYgKHJlZyA+PSBEV19JQ19TREFfSE9MRF9NSU5fVkVSUykgeworCQlpZiAoZGV2LT5zZGFfaG9sZF90aW1lKSB7CiAJCQlkd193cml0ZWwoZGV2LCBkZXYtPnNkYV9ob2xkX3RpbWUsIERXX0lDX1NEQV9IT0xEKTsKLQkJZWxzZQotCQkJZGV2X3dhcm4oZGV2LT5kZXYsCi0JCQkJIkhhcmR3YXJlIHRvbyBvbGQgdG8gYWRqdXN0IFNEQSBob2xkIHRpbWUuIik7CisJCX0gZWxzZSB7CisJCQkvKiBLZWVwIHByZXZpb3VzIGhvbGQgdGltZSBzZXR0aW5nIGlmIG5vIG9uZSBzZXQgaXQgKi8KKwkJCWRldi0+c2RhX2hvbGRfdGltZSA9IGR3X3JlYWRsKGRldiwgRFdfSUNfU0RBX0hPTEQpOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X3dhcm4oZGV2LT5kZXYsCisJCQkiSGFyZHdhcmUgdG9vIG9sZCB0byBhZGp1c3QgU0RBIGhvbGQgdGltZS5cbiIpOwogCX0KIAogCS8qIENvbmZpZ3VyZSBUeC9SeCBGSUZPIHRocmVzaG9sZCBsZXZlbHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWcyMHQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWcyMHQuYwppbmRleCAxMzcxMjViLi41Y2U3MWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWVnMjB0LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1lZzIwdC5jCkBAIC03NzMsMTMgKzc3Myw2IEBACiAJLyogU2V0IHRoZSBudW1iZXIgb2YgSTJDIGNoYW5uZWwgaW5zdGFuY2UgKi8KIAlhZGFwX2luZm8tPmNoX251bSA9IGlkLT5kcml2ZXJfZGF0YTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgcGNoX2kyY19oYW5kbGVyLCBJUlFGX1NIQVJFRCwKLQkJICBLQlVJTERfTU9ETkFNRSwgYWRhcF9pbmZvKTsKLQlpZiAocmV0KSB7Ci0JCXBjaF9wY2lfZXJyKHBkZXYsICJyZXF1ZXN0X2lycSBGQUlMRURcbiIpOwotCQlnb3RvIGVycl9yZXF1ZXN0X2lycTsKLQl9Ci0KIAlmb3IgKGkgPSAwOyBpIDwgYWRhcF9pbmZvLT5jaF9udW07IGkrKykgewogCQlwY2hfYWRhcCA9ICZhZGFwX2luZm8tPnBjaF9kYXRhW2ldLnBjaF9hZGFwdGVyOwogCQlhZGFwX2luZm8tPnBjaF9pMmNfc3VzcGVuZGVkID0gZmFsc2U7CkBAIC03OTcsNiArNzkwLDE3IEBACiAKIAkJcGNoX2FkYXAtPmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJCXBjaF9hZGFwLT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHBjaF9pMmNfaGFuZGxlciwgSVJRRl9TSEFSRUQsCisJCSAgS0JVSUxEX01PRE5BTUUsIGFkYXBfaW5mbyk7CisJaWYgKHJldCkgeworCQlwY2hfcGNpX2VycihwZGV2LCAicmVxdWVzdF9pcnEgRkFJTEVEXG4iKTsKKwkJZ290byBlcnJfcmVxdWVzdF9pcnE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGFkYXBfaW5mby0+Y2hfbnVtOyBpKyspIHsKKwkJcGNoX2FkYXAgPSAmYWRhcF9pbmZvLT5wY2hfZGF0YVtpXS5wY2hfYWRhcHRlcjsKIAogCQlwY2hfaTJjX2luaXQoJmFkYXBfaW5mby0+cGNoX2RhdGFbaV0pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCmluZGV4IDVlZjliNzMuLjI2Mjk4YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCkBAIC0xNDg2LDcgKzE0ODYsOSBAQAogCQlwcml2LT5mZWF0dXJlcyB8PSBGRUFUVVJFX0lSUTsKIAkJcHJpdi0+ZmVhdHVyZXMgfD0gRkVBVFVSRV9TTUJVU19QRUM7CiAJCXByaXYtPmZlYXR1cmVzIHw9IEZFQVRVUkVfQkxPQ0tfQlVGRkVSOwotCQlwcml2LT5mZWF0dXJlcyB8PSBGRUFUVVJFX1RDTzsKKwkJLyogSWYgd2UgaGF2ZSBBQ1BJIGJhc2VkIHdhdGNoZG9nIHVzZSB0aGF0IGluc3RlYWQgKi8KKwkJaWYgKCFhY3BpX2hhc193YXRjaGRvZygpKQorCQkJcHJpdi0+ZmVhdHVyZXMgfD0gRkVBVFVSRV9UQ087CiAJCXByaXYtPmZlYXR1cmVzIHw9IEZFQVRVUkVfSE9TVF9OT1RJRlk7CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1lc29uLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1lc29uLmMKaW5kZXggNzFkMzkyOS4uNzZlMjg5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tZXNvbi5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbWVzb24uYwpAQCAtMjExLDcgKzIxMSw3IEBACiAJCW1lc29uX2kyY19hZGRfdG9rZW4oaTJjLCBUT0tFTl9TVE9QKTsKIAl9IGVsc2UgewogCQlpMmMtPnN0YXRlID0gU1RBVEVfSURMRTsKLQkJY29tcGxldGVfYWxsKCZpMmMtPmRvbmUpOworCQljb21wbGV0ZSgmaTJjLT5kb25lKTsKIAl9CiB9CiAKQEAgLTIzOCw3ICsyMzgsNyBAQAogCQlkZXZfZGJnKGkyYy0+ZGV2LCAiZXJyb3IgYml0IHNldFxuIik7CiAJCWkyYy0+ZXJyb3IgPSAtRU5YSU87CiAJCWkyYy0+c3RhdGUgPSBTVEFURV9JRExFOwotCQljb21wbGV0ZV9hbGwoJmkyYy0+ZG9uZSk7CisJCWNvbXBsZXRlKCZpMmMtPmRvbmUpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTI2OSw3ICsyNjksNyBAQAogCQlicmVhazsKIAljYXNlIFNUQVRFX1NUT1A6CiAJCWkyYy0+c3RhdGUgPSBTVEFURV9JRExFOwotCQljb21wbGV0ZV9hbGwoJmkyYy0+ZG9uZSk7CisJCWNvbXBsZXRlKCZpMmMtPmRvbmUpOwogCQlicmVhazsKIAljYXNlIFNUQVRFX0lETEU6CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vY29yZXMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2NvcmVzLmMKaW5kZXggZGZhN2E0Yi4uYWM4OGE1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vY29yZXMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9jb3Jlcy5jCkBAIC0zNzksNiArMzc5LDcgQEAKIAkJCWlmICghY2xvY2tfZnJlcXVlbmN5X3ByZXNlbnQpIHsKIAkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkJCSJNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciAnb3BlbmNvcmVzLGlwLWNsb2NrLWZyZXF1ZW5jeSdcbiIpOworCQkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShpMmMtPmNsayk7CiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQl9CiAJCQlpMmMtPmlwX2Nsb2NrX2toeiA9IGNsb2NrX2ZyZXF1ZW5jeSAvIDEwMDA7CkBAIC00NjcsMjAgKzQ2OCwyMSBAQAogCQlkZWZhdWx0OgogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5zdXBwb3J0ZWQgSS9PIHdpZHRoICglZClcbiIsCiAJCQkJaTJjLT5yZWdfaW9fd2lkdGgpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfY2xrOwogCQl9CiAJfQogCiAJcmV0ID0gb2NvcmVzX2luaXQoJnBkZXYtPmRldiwgaTJjKTsKIAlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycl9jbGs7CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpMmMtPndhaXQpOwogCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCBvY29yZXNfaXNyLCAwLAogCQkJICAgICAgIHBkZXYtPm5hbWUsIGkyYyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgY2xhaW0gSVJRXG4iKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJfY2xrOwogCX0KIAogCS8qIGhvb2sgdXAgZHJpdmVyIHRvIHRyZWUgKi8KQEAgLTQ5NCw3ICs0OTYsNyBAQAogCXJldCA9IGkyY19hZGRfYWRhcHRlcigmaTJjLT5hZGFwKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhZGQgYWRhcHRlclxuIik7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyX2NsazsKIAl9CiAKIAkvKiBhZGQgaW4ga25vd24gZGV2aWNlcyB0byB0aGUgYnVzICovCkBAIC01MDQsNiArNTA2LDEwIEBACiAJfQogCiAJcmV0dXJuIDA7CisKK2Vycl9jbGs6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGkyYy0+Y2xrKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG9jb3Jlc19pMmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXF1cC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1xdXAuYwppbmRleCA1MDFiZDE1Li5hODQ5N2NmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXF1cC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcXVwLmMKQEAgLTE1OTksNyArMTU5OSw4IEBACiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IHF1cF9pMmNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7Ci0JcXVwX2kyY19wbV9zdXNwZW5kX3J1bnRpbWUoZGV2aWNlKTsKKwlpZiAoIXBtX3J1bnRpbWVfc3VzcGVuZGVkKGRldmljZSkpCisJCXJldHVybiBxdXBfaTJjX3BtX3N1c3BlbmRfcnVudGltZShkZXZpY2UpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXJjYXIuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcmNhci5jCmluZGV4IDUyNDA3ZjMuLjliZDg0OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcmNhci5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcmNhci5jCkBAIC0zNzgsNyArMzc4LDcgQEAKIAl9CiAKIAlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGNoYW4tPmRldmljZS0+ZGV2LCBidWYsIGxlbiwgZGlyKTsKLQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBkbWFfYWRkcikpIHsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoY2hhbi0+ZGV2aWNlLT5kZXYsIGRtYV9hZGRyKSkgewogCQlkZXZfZGJnKGRldiwgImRtYSBtYXAgZmFpbGVkLCB1c2luZyBQSU9cbiIpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1yazN4LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXJrM3guYwppbmRleCAyYmM4YjAxLi41YzViN2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXJrM3guYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXJrM3guYwpAQCAtOTE4LDcgKzkxOCw3IEBACiAgKiBDb2RlIGFkYXB0ZWQgZnJvbSBpMmMtY2FkZW5jZS5jLgogICoKICAqIFJldHVybjoJTk9USUZZX1NUT1AgaWYgdGhlIHJhdGUgY2hhbmdlIHNob3VsZCBiZSBhYm9ydGVkLCBOT1RJRllfT0sKLSAqCQl0byBhY2tub3dlZGdlIHRoZSBjaGFuZ2UsIE5PVElGWV9ET05FIGlmIHRoZSBub3RpZmljYXRpb24gaXMKKyAqCQl0byBhY2tub3dsZWRnZSB0aGUgY2hhbmdlLCBOT1RJRllfRE9ORSBpZiB0aGUgbm90aWZpY2F0aW9uIGlzCiAgKgkJY29uc2lkZXJlZCBpcnJlbGV2YW50LgogICovCiBzdGF0aWMgaW50IHJrM3hfaTJjX2Nsa19ub3RpZmllcl9jYihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nCkBAIC0xMTExLDYgKzExMTEsMTUgQEAKIAlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IG51bTsKIH0KIAorc3RhdGljIF9fbWF5YmVfdW51c2VkIGludCByazN4X2kyY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCByazN4X2kyYyAqaTJjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyazN4X2kyY19hZGFwdF9kaXYoaTJjLCBjbGtfZ2V0X3JhdGUoaTJjLT5jbGspKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdTMyIHJrM3hfaTJjX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQogewogCXJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMIHwgSTJDX0ZVTkNfUFJPVE9DT0xfTUFOR0xJTkc7CkBAIC0xMzM0LDEyICsxMzQzLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhyazN4X2kyY19wbV9vcHMsIE5VTEwsIHJrM3hfaTJjX3Jlc3VtZSk7CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJrM3hfaTJjX2RyaXZlciA9IHsKIAkucHJvYmUgICA9IHJrM3hfaTJjX3Byb2JlLAogCS5yZW1vdmUgID0gcmszeF9pMmNfcmVtb3ZlLAogCS5kcml2ZXIgID0gewogCQkubmFtZSAgPSAicmszeC1pMmMiLAogCQkub2ZfbWF0Y2hfdGFibGUgPSByazN4X2kyY19tYXRjaCwKKwkJLnBtID0gJnJrM3hfaTJjX3BtX29wcywKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaF9tb2JpbGUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2hfbW9iaWxlLmMKaW5kZXggNmZiM2UyNi4uMDViMWVlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaF9tb2JpbGUuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoX21vYmlsZS5jCkBAIC02MTAsNyArNjEwLDcgQEAKIAkJcmV0dXJuOwogCiAJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShjaGFuLT5kZXZpY2UtPmRldiwgcGQtPm1zZy0+YnVmLCBwZC0+bXNnLT5sZW4sIGRpcik7Ci0JaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHBkLT5kZXYsIGRtYV9hZGRyKSkgeworCWlmIChkbWFfbWFwcGluZ19lcnJvcihjaGFuLT5kZXZpY2UtPmRldiwgZG1hX2FkZHIpKSB7CiAJCWRldl9kYmcocGQtPmRldiwgImRtYSBtYXAgZmFpbGVkLCB1c2luZyBQSU9cbiIpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLWRlbXV4LXBpbmN0cmwuYyBiL2RyaXZlcnMvaTJjL211eGVzL2kyYy1kZW11eC1waW5jdHJsLmMKaW5kZXggOGRlMDczYS4uYjM4OTNmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLWRlbXV4LXBpbmN0cmwuYworKysgYi9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtZGVtdXgtcGluY3RybC5jCkBAIC0zNyw4ICszNyw2IEBACiAJc3RydWN0IGkyY19kZW11eF9waW5jdHJsX2NoYW4gY2hhbltdOwogfTsKIAotc3RhdGljIHN0cnVjdCBwcm9wZXJ0eSBzdGF0dXNfb2theSA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmxlbmd0aCA9IDMsIC52YWx1ZSA9ICJvayIgfTsKLQogc3RhdGljIGludCBpMmNfZGVtdXhfbWFzdGVyX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyBtc2dzW10sIGludCBudW0pCiB7CiAJc3RydWN0IGkyY19kZW11eF9waW5jdHJsX3ByaXYgKnByaXYgPSBhZGFwLT5hbGdvX2RhdGE7CkBAIC02OCw3ICs2Niw3IEBACiAJYWRhcCA9IG9mX2ZpbmRfaTJjX2FkYXB0ZXJfYnlfbm9kZShwcml2LT5jaGFuW25ld19jaGFuXS5wYXJlbnRfbnApOwogCWlmICghYWRhcCkgewogCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycjsKKwkJZ290byBlcnJfd2l0aF9yZXZlcnQ7CiAJfQogCiAJcCA9IGRldm1fcGluY3RybF9nZXRfc2VsZWN0KGFkYXAtPmRldi5wYXJlbnQsIHByaXYtPmJ1c19uYW1lKTsKQEAgLTEwMyw4ICsxMDEsMTEgQEAKIAogIGVycl93aXRoX3B1dDoKIAlpMmNfcHV0X2FkYXB0ZXIoYWRhcCk7CisgZXJyX3dpdGhfcmV2ZXJ0OgorCW9mX2NoYW5nZXNldF9yZXZlcnQoJnByaXYtPmNoYW5bbmV3X2NoYW5dLmNoZ3NldCk7CiAgZXJyOgogCWRldl9lcnIocHJpdi0+ZGV2LCAiZmFpbGVkIHRvIHNldHVwIGRlbXV4LWFkYXB0ZXIgJWQgKCVkKVxuIiwgbmV3X2NoYW4sIHJldCk7CisJcHJpdi0+Y3VyX2NoYW4gPSAtRUlOVkFMOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE5MCw2ICsxOTEsNyBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAlzdHJ1Y3QgaTJjX2RlbXV4X3BpbmN0cmxfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3BzOwogCWludCBudW1fY2hhbiwgaSwgaiwgZXJyOwogCiAJbnVtX2NoYW4gPSBvZl9jb3VudF9waGFuZGxlX3dpdGhfYXJncyhucCwgImkyYy1wYXJlbnQiLCBOVUxMKTsKQEAgLTIwMCw3ICsyMDIsMTAgQEAKIAogCXByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwcml2KQogCQkJICAgKyBudW1fY2hhbiAqIHNpemVvZihzdHJ1Y3QgaTJjX2RlbXV4X3BpbmN0cmxfY2hhbiksIEdGUF9LRVJORUwpOwotCWlmICghcHJpdikKKworCXByb3BzID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIG51bV9jaGFuLCBzaXplb2YoKnByb3BzKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXByaXYgfHwgIXByb3BzKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWVyciA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAiaTJjLWJ1cy1uYW1lIiwgJnByaXYtPmJ1c19uYW1lKTsKQEAgLTIxOCw4ICsyMjMsMTIgQEAKIAkJfQogCQlwcml2LT5jaGFuW2ldLnBhcmVudF9ucCA9IGFkYXBfbnA7CiAKKwkJcHJvcHNbaV0ubmFtZSA9IGRldm1fa3N0cmR1cCgmcGRldi0+ZGV2LCAic3RhdHVzIiwgR0ZQX0tFUk5FTCk7CisJCXByb3BzW2ldLnZhbHVlID0gZGV2bV9rc3RyZHVwKCZwZGV2LT5kZXYsICJvayIsIEdGUF9LRVJORUwpOworCQlwcm9wc1tpXS5sZW5ndGggPSAzOworCiAJCW9mX2NoYW5nZXNldF9pbml0KCZwcml2LT5jaGFuW2ldLmNoZ3NldCk7Ci0JCW9mX2NoYW5nZXNldF91cGRhdGVfcHJvcGVydHkoJnByaXYtPmNoYW5baV0uY2hnc2V0LCBhZGFwX25wLCAmc3RhdHVzX29rYXkpOworCQlvZl9jaGFuZ2VzZXRfdXBkYXRlX3Byb3BlcnR5KCZwcml2LT5jaGFuW2ldLmNoZ3NldCwgYWRhcF9ucCwgJnByb3BzW2ldKTsKIAl9CiAKIAlwcml2LT5udW1fY2hhbiA9IG51bV9jaGFuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLW11eC1wY2E5NTR4LmMgYi9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LXBjYTk1NHguYwppbmRleCA1MjhlNzU1Li4zMjc4ZWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LXBjYTk1NHguYworKysgYi9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LXBjYTk1NHguYwpAQCAtMTY0LDcgKzE2NCw3IEBACiAJLyogT25seSBzZWxlY3QgdGhlIGNoYW5uZWwgaWYgaXRzIGRpZmZlcmVudCBmcm9tIHRoZSBsYXN0IGNoYW5uZWwgKi8KIAlpZiAoZGF0YS0+bGFzdF9jaGFuICE9IHJlZ3ZhbCkgewogCQlyZXQgPSBwY2E5NTR4X3JlZ193cml0ZShtdXhjLT5wYXJlbnQsIGNsaWVudCwgcmVndmFsKTsKLQkJZGF0YS0+bGFzdF9jaGFuID0gcmVndmFsOworCQlkYXRhLT5sYXN0X2NoYW4gPSByZXQgPyAwIDogcmVndmFsOwogCX0KIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9LY29uZmlnIGIvZHJpdmVycy9paW8vYWNjZWwvS2NvbmZpZwppbmRleCA4OWQ3ODIwLi4yYjc5MWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hY2NlbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL0tjb25maWcKQEAgLTIwLDYgKzIwLDggQEAKIGNvbmZpZyBCTUEyMjAKICAgICB0cmlzdGF0ZSAiQm9zY2ggQk1BMjIwIDMtQXhpcyBBY2NlbGVyb21ldGVyIERyaXZlciIKIAlkZXBlbmRzIG9uIFNQSQorCXNlbGVjdCBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSRURfQlVGRkVSCiAgICAgaGVscAogICAgICAgU2F5IHllcyBoZXJlIHRvIGFkZCBzdXBwb3J0IGZvciB0aGUgQm9zY2ggQk1BMjIwIHRyaWF4aWFsCiAgICAgICBhY2NlbGVyYXRpb24gc2Vuc29yLgpAQCAtNTAsNiArNTIsMjcgQEAKIAl0cmlzdGF0ZQogCXNlbGVjdCBSRUdNQVBfU1BJCiAKK2NvbmZpZyBETUFSRDA2CisJdHJpc3RhdGUgIkRvbWludGVjaCBETUFSRDA2IERpZ2l0YWwgQWNjZWxlcm9tZXRlciBEcml2ZXIiCisJZGVwZW5kcyBvbiBPRiB8fCBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgRG9taW50ZWNoIGxvdy1nIHRyaS1heGlhbAorCSAgZGlnaXRhbCBhY2NlbGVyb21ldGVyczogRE1BUkQwNSwgRE1BUkQwNiwgRE1BUkQwNy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZG1hcmQwNi4KKworY29uZmlnIERNQVJEMDkKKwl0cmlzdGF0ZSAiRG9taW50ZWNoIERNQVJEMDkgMy1heGlzIEFjY2VsZXJvbWV0ZXIgRHJpdmVyIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGdldCBzdXBwb3J0IGZvciB0aGUgRG9taW50ZWNoIERNQVJEMDkgMy1heGlzCisJICBhY2NlbGVyb21ldGVyLgorCisJICBDaG9vc2luZyBNIHdpbGwgYnVpbGQgdGhlIGRyaXZlciBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGRtYXJkMDkuCisKIGNvbmZpZyBISURfU0VOU09SX0FDQ0VMXzNECiAJZGVwZW5kcyBvbiBISURfU0VOU09SX0hVQgogCXNlbGVjdCBJSU9fQlVGRkVSCkBAIC05NiwxNCArMTE5LDM1IEBACiAKIGNvbmZpZyBLWFNEOQogCXRyaXN0YXRlICJLaW9uaXggS1hTRDkgQWNjZWxlcm9tZXRlciBEcml2ZXIiCi0JZGVwZW5kcyBvbiBTUEkKKwlzZWxlY3QgSUlPX0JVRkZFUgorCXNlbGVjdCBJSU9fVFJJR0dFUkVEX0JVRkZFUgogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgS2lvbml4IEtYU0Q5IGFjY2VsZXJvbWV0ZXIuCi0JICBDdXJyZW50bHkgdGhpcyBvbmx5IHN1cHBvcnRzIHRoZSBkZXZpY2UgdmlhIGFuIFNQSSBpbnRlcmZhY2UuCisJICBJdCBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgYW4gKG9wdGlvbmFsKSBTUEkgb3IgSTJDIGludGVyZmFjZS4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQga3hzZDkuCiAKK2NvbmZpZyBLWFNEOV9TUEkKKwl0cmlzdGF0ZSAiS2lvbml4IEtYU0Q5IFNQSSB0cmFuc3BvcnQiCisJZGVwZW5kcyBvbiBLWFNEOQorCWRlcGVuZHMgb24gU1BJCisJZGVmYXVsdCBLWFNEOQorCXNlbGVjdCBSRUdNQVBfU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGVuYWJsZSB0aGUgS2lvbml4IEtYU0Q5IGFjY2VsZXJvbWV0ZXIKKwkgIFNQSSB0cmFuc3BvcnQgY2hhbm5lbC4KKworY29uZmlnIEtYU0Q5X0kyQworCXRyaXN0YXRlICJLaW9uaXggS1hTRDkgSTJDIHRyYW5zcG9ydCIKKwlkZXBlbmRzIG9uIEtYU0Q5CisJZGVwZW5kcyBvbiBJMkMKKwlkZWZhdWx0IEtYU0Q5CisJc2VsZWN0IFJFR01BUF9JMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gZW5hYmxlIHRoZSBLaW9uaXggS1hTRDkgYWNjZWxlcm9tZXRlcgorCSAgSTJDIHRyYW5zcG9ydCBjaGFubmVsLgorCiBjb25maWcgS1hDSksxMDEzCiAJdHJpc3RhdGUgIktpb25peCAzLUF4aXMgQWNjZWxlcm9tZXRlciBEcml2ZXIiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTExNyw2ICsxNjEsMTYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAogCSAgYmUgY2FsbGVkIGt4Y2prLTEwMTMuCiAKK2NvbmZpZyBNQzMyMzAKKwl0cmlzdGF0ZSAibUN1YmUgTUMzMjMwIERpZ2l0YWwgQWNjZWxlcm9tZXRlciBEcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIG1DdWJlIE1DMzIzMCBsb3ctZyB0cmktYXhpYWwKKwkgIGRpZ2l0YWwgYWNjZWxlcm9tZXRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWMzMjMwLgorCiBjb25maWcgTU1BNzQ1NQogCXRyaXN0YXRlCiAJc2VsZWN0IElJT19CVUZGRVIKQEAgLTIzNCw3ICsyODgsOCBAQAogY29uZmlnIFNUSzhCQTUwCiAJdHJpc3RhdGUgIlNlbnNvcnRlayBTVEs4QkE1MCAzLUF4aXMgQWNjZWxlcm9tZXRlciBEcml2ZXIiCiAJZGVwZW5kcyBvbiBJMkMKLQlkZXBlbmRzIG9uIElJT19UUklHR0VSCisJc2VsZWN0IElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVJFRF9CVUZGRVIKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gZ2V0IHN1cHBvcnQgZm9yIHRoZSBTZW5zb3J0ZWsgU1RLOEJBNTAgMy1heGlzCiAJICBhY2NlbGVyb21ldGVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvTWFrZWZpbGUgYi9kcml2ZXJzL2lpby9hY2NlbC9NYWtlZmlsZQppbmRleCA2Y2VkYmVjLi5mNWQzZGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hY2NlbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lpby9hY2NlbC9NYWtlZmlsZQpAQCAtOCw5ICs4LDE0IEBACiBvYmotJChDT05GSUdfQk1DMTUwX0FDQ0VMKSArPSBibWMxNTAtYWNjZWwtY29yZS5vCiBvYmotJChDT05GSUdfQk1DMTUwX0FDQ0VMX0kyQykgKz0gYm1jMTUwLWFjY2VsLWkyYy5vCiBvYmotJChDT05GSUdfQk1DMTUwX0FDQ0VMX1NQSSkgKz0gYm1jMTUwLWFjY2VsLXNwaS5vCitvYmotJChDT05GSUdfRE1BUkQwNikJKz0gZG1hcmQwNi5vCitvYmotJChDT05GSUdfRE1BUkQwOSkJKz0gZG1hcmQwOS5vCiBvYmotJChDT05GSUdfSElEX1NFTlNPUl9BQ0NFTF8zRCkgKz0gaGlkLXNlbnNvci1hY2NlbC0zZC5vCiBvYmotJChDT05GSUdfS1hDSksxMDEzKSArPSBreGNqay0xMDEzLm8KIG9iai0kKENPTkZJR19LWFNEOSkJKz0ga3hzZDkubworb2JqLSQoQ09ORklHX0tYU0Q5X1NQSSkJKz0ga3hzZDktc3BpLm8KK29iai0kKENPTkZJR19LWFNEOV9JMkMpCSs9IGt4c2Q5LWkyYy5vCitvYmotJChDT05GSUdfTUMzMjMwKQkrPSBtYzMyMzAubwogCiBvYmotJChDT05GSUdfTU1BNzQ1NSkJCSs9IG1tYTc0NTVfY29yZS5vCiBvYmotJChDT05GSUdfTU1BNzQ1NV9JMkMpCSs9IG1tYTc0NTVfaTJjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FjY2VsL2JtYTE4MC5jIGIvZHJpdmVycy9paW8vYWNjZWwvYm1hMTgwLmMKaW5kZXggZTNmODhiYS4uMDg5MDkzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWNjZWwvYm1hMTgwLmMKKysrIGIvZHJpdmVycy9paW8vYWNjZWwvYm1hMTgwLmMKQEAgLTQ2OSwxMyArNDY5LDE0IEBACiAKIAlzd2l0Y2ggKG1hc2spIHsKIAljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlyZXQgPSBpaW9fZGV2aWNlX2NsYWltX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCiAJCW11dGV4X2xvY2soJmRhdGEtPm11dGV4KTsKLQkJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKSB7Ci0JCQltdXRleF91bmxvY2soJmRhdGEtPm11dGV4KTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KIAkJcmV0ID0gYm1hMTgwX2dldF9kYXRhX3JlZyhkYXRhLCBjaGFuLT5zY2FuX2luZGV4KTsKIAkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7CisJCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJCSp2YWwgPSBzaWduX2V4dGVuZDMyKHJldCA+PiBjaGFuLT5zY2FuX3R5cGUuc2hpZnQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9ibWEyMjBfc3BpLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9ibWEyMjBfc3BpLmMKaW5kZXggMTA5OGQxMC4uNTA5OWYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWNjZWwvYm1hMjIwX3NwaS5jCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL2JtYTIyMF9zcGkuYwpAQCAtMjUzLDcgKzI1Myw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsIE5VTEwsCisJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwKIAkJCQkJIGJtYTIyMF90cmlnZ2VyX2hhbmRsZXIsIE5VTEwpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LCAiaWlvIHRyaWdnZXJlZCBidWZmZXIgc2V0dXAgZmFpbGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FjY2VsL2JtYzE1MC1hY2NlbC1jb3JlLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9ibWMxNTAtYWNjZWwtY29yZS5jCmluZGV4IGJmMTdhYWUuLjU5YjM4MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL2JtYzE1MC1hY2NlbC1jb3JlLmMKKysrIGIvZHJpdmVycy9paW8vYWNjZWwvYm1jMTUwLWFjY2VsLWNvcmUuYwpAQCAtNjcsNiArNjcsOSBAQAogI2RlZmluZSBCTUMxNTBfQUNDRUxfUkVHX1BNVV9CVwkJMHgxMAogI2RlZmluZSBCTUMxNTBfQUNDRUxfREVGX0JXCQkJMTI1CiAKKyNkZWZpbmUgQk1DMTUwX0FDQ0VMX1JFR19SRVNFVAkJCTB4MTQKKyNkZWZpbmUgQk1DMTUwX0FDQ0VMX1JFU0VUX1ZBTAkJCTB4QjYKKwogI2RlZmluZSBCTUMxNTBfQUNDRUxfUkVHX0lOVF9NQVBfMAkJMHgxOQogI2RlZmluZSBCTUMxNTBfQUNDRUxfSU5UX01BUF8wX0JJVF9TTE9QRQlCSVQoMikKIApAQCAtMTQ5Nyw2ICsxNTAwLDE0IEBACiAJaW50IHJldCwgaTsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCisJLyoKKwkgKiBSZXNldCBjaGlwIHRvIGdldCBpdCBpbiBhIGtub3duIGdvb2Qgc3RhdGUuIEEgZGVsYXkgb2YgMS44bXMgYWZ0ZXIKKwkgKiByZXNldCBpcyByZXF1aXJlZCBhY2NvcmRpbmcgdG8gdGhlIGRhdGEgc2hlZXRzIG9mIHN1cHBvcnRlZCBjaGlwcy4KKwkgKi8KKwlyZWdtYXBfd3JpdGUoZGF0YS0+cmVnbWFwLCBCTUMxNTBfQUNDRUxfUkVHX1JFU0VULAorCQkgICAgIEJNQzE1MF9BQ0NFTF9SRVNFVF9WQUwpOworCXVzbGVlcF9yYW5nZSgxODAwLCAyNTAwKTsKKwogCXJldCA9IHJlZ21hcF9yZWFkKGRhdGEtPnJlZ21hcCwgQk1DMTUwX0FDQ0VMX1JFR19DSElQX0lELCAmdmFsKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGRldiwgIkVycm9yOiBSZWFkaW5nIGNoaXAgaWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvZG1hcmQwNi5jIGIvZHJpdmVycy9paW8vYWNjZWwvZG1hcmQwNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NmNhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9hY2NlbC9kbWFyZDA2LmMKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiBJSU8gZHJpdmVyIGZvciBEb21pbnRlY2ggRE1BUkQwNiBhY2NlbGVyb21ldGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFsZWtzZWkgTWFtbGluIDxtYW1saW5hdkBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisKKyNkZWZpbmUgRE1BUkQwNl9EUlZfTkFNRQkJImRtYXJkMDYiCisKKy8qIERldmljZSBkYXRhIHJlZ2lzdGVycyAqLworI2RlZmluZSBETUFSRDA2X0NISVBfSURfUkVHCQkweDBmCisjZGVmaW5lIERNQVJEMDZfVE9VVF9SRUcJCTB4NDAKKyNkZWZpbmUgRE1BUkQwNl9YT1VUX1JFRwkJMHg0MQorI2RlZmluZSBETUFSRDA2X1lPVVRfUkVHCQkweDQyCisjZGVmaW5lIERNQVJEMDZfWk9VVF9SRUcJCTB4NDMKKyNkZWZpbmUgRE1BUkQwNl9DVFJMMV9SRUcJCTB4NDQKKworLyogRGV2aWNlIElEIHZhbHVlICovCisjZGVmaW5lIERNQVJEMDVfQ0hJUF9JRAkJCTB4MDUKKyNkZWZpbmUgRE1BUkQwNl9DSElQX0lECQkJMHgwNgorI2RlZmluZSBETUFSRDA3X0NISVBfSUQJCQkweDA3CisKKy8qIERldmljZSB2YWx1ZXMgKi8KKyNkZWZpbmUgRE1BUkQwNV9BWElTX1NDQUxFX1ZBTAkJMTU2MjUKKyNkZWZpbmUgRE1BUkQwNl9BWElTX1NDQUxFX1ZBTAkJMzEyNTAKKyNkZWZpbmUgRE1BUkQwNl9URU1QX0NFTlRFUl9WQUwJCTI1CisjZGVmaW5lIERNQVJEMDZfU0lHTl9CSVQJCTcKKworLyogRGV2aWNlIHBvd2VyIG1vZGVzICovCisjZGVmaW5lIERNQVJEMDZfTU9ERV9OT1JNQUwJCTB4MjcKKyNkZWZpbmUgRE1BUkQwNl9NT0RFX1BPV0VSRE9XTgkJMHgwMAorCisvKiBEZXZpY2UgY2hhbm5lbHMgKi8KKyNkZWZpbmUgRE1BUkQwNl9BQ0NFTF9DSEFOTkVMKF9heGlzLCBfcmVnKSB7CQkJXAorCS50eXBlID0gSUlPX0FDQ0VMLAkJCQkJXAorCS5hZGRyZXNzID0gX3JlZywJCQkJCVwKKwkuY2hhbm5lbDIgPSBJSU9fTU9EXyMjX2F4aXMsCQkJCVwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJCVwKKwkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fU0NBTEUpLAlcCisJLm1vZGlmaWVkID0gMSwJCQkJCQlcCit9CisKKyNkZWZpbmUgRE1BUkQwNl9URU1QX0NIQU5ORUwoX3JlZykgewkJCQlcCisJLnR5cGUgPSBJSU9fVEVNUCwJCQkJCVwKKwkuYWRkcmVzcyA9IF9yZWcsCQkJCQlcCisJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfAkJXAorCQkJICAgICAgQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSwJXAorfQorCitzdHJ1Y3QgZG1hcmQwNl9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXU4IGNoaXBfaWQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgZG1hcmQwNl9jaGFubmVsc1tdID0geworCURNQVJEMDZfQUNDRUxfQ0hBTk5FTChYLCBETUFSRDA2X1hPVVRfUkVHKSwKKwlETUFSRDA2X0FDQ0VMX0NIQU5ORUwoWSwgRE1BUkQwNl9ZT1VUX1JFRyksCisJRE1BUkQwNl9BQ0NFTF9DSEFOTkVMKFosIERNQVJEMDZfWk9VVF9SRUcpLAorCURNQVJEMDZfVEVNUF9DSEFOTkVMKERNQVJEMDZfVE9VVF9SRUcpLAorfTsKKworc3RhdGljIGludCBkbWFyZDA2X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBkbWFyZDA2X2RhdGEgKmRtYXJkMDYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZG1hcmQwNi0+Y2xpZW50LAorCQkJCQkgICAgICAgY2hhbi0+YWRkcmVzcyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZkbWFyZDA2LT5jbGllbnQtPmRldiwKKwkJCQkiRXJyb3IgcmVhZGluZyBkYXRhOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQkqdmFsID0gc2lnbl9leHRlbmQzMihyZXQsIERNQVJEMDZfU0lHTl9CSVQpOworCisJCWlmIChkbWFyZDA2LT5jaGlwX2lkID09IERNQVJEMDZfQ0hJUF9JRCkKKwkJCSp2YWwgPSAqdmFsID4+IDE7CisKKwkJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJCWNhc2UgSUlPX0FDQ0VMOgorCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQljYXNlIElJT19URU1QOgorCQkJaWYgKGRtYXJkMDYtPmNoaXBfaWQgIT0gRE1BUkQwNl9DSElQX0lEKQorCQkJCSp2YWwgPSAqdmFsIC8gMjsKKwkJCXJldHVybiBJSU9fVkFMX0lOVDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJY2FzZSBJSU9fQ0hBTl9JTkZPX09GRlNFVDoKKwkJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJCWNhc2UgSUlPX1RFTVA6CisJCQkqdmFsID0gRE1BUkQwNl9URU1QX0NFTlRFUl9WQUw7CisJCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKKwkJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJCWNhc2UgSUlPX0FDQ0VMOgorCQkJKnZhbCA9IDA7CisJCQlpZiAoZG1hcmQwNi0+Y2hpcF9pZCA9PSBETUFSRDA2X0NISVBfSUQpCisJCQkJKnZhbDIgPSBETUFSRDA2X0FYSVNfU0NBTEVfVkFMOworCQkJZWxzZQorCQkJCSp2YWwyID0gRE1BUkQwNV9BWElTX1NDQUxFX1ZBTDsKKwkJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gZG1hcmQwNl9pbmZvID0geworCS5kcml2ZXJfbW9kdWxlCT0gVEhJU19NT0RVTEUsCisJLnJlYWRfcmF3CT0gZG1hcmQwNl9yZWFkX3JhdywKK307CisKK3N0YXRpYyBpbnQgZG1hcmQwNl9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgZG1hcmQwNl9kYXRhICpkbWFyZDA2OworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgY2hlY2sgZnVuY3Rpb25hbGl0eSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqZG1hcmQwNikpOworCWlmICghaW5kaW9fZGV2KSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGlpbyBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkbWFyZDA2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlkbWFyZDA2LT5jbGllbnQgPSBjbGllbnQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZG1hcmQwNi0+Y2xpZW50LCBETUFSRDA2X0NISVBfSURfUkVHKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkVycm9yIHJlYWRpbmcgY2hpcCBpZDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHJldCAhPSBETUFSRDA1X0NISVBfSUQgJiYgcmV0ICE9IERNQVJEMDZfQ0hJUF9JRCAmJgorCSAgICByZXQgIT0gRE1BUkQwN19DSElQX0lEKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSW52YWxpZCBjaGlwIGlkOiAlMDJkXG4iLCByZXQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkbWFyZDA2LT5jaGlwX2lkID0gcmV0OworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaW5kaW9fZGV2KTsKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisJaW5kaW9fZGV2LT5uYW1lID0gRE1BUkQwNl9EUlZfTkFNRTsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGRtYXJkMDZfY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGRtYXJkMDZfY2hhbm5lbHMpOworCWluZGlvX2Rldi0+aW5mbyA9ICZkbWFyZDA2X2luZm87CisKKwlyZXR1cm4gZGV2bV9paW9fZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgaW5kaW9fZGV2KTsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBkbWFyZDA2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEodG9faTJjX2NsaWVudChkZXYpKTsKKwlzdHJ1Y3QgZG1hcmQwNl9kYXRhICpkbWFyZDA2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkbWFyZDA2LT5jbGllbnQsIERNQVJEMDZfQ1RSTDFfUkVHLAorCQkJCQlETUFSRDA2X01PREVfUE9XRVJET1dOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRtYXJkMDZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKHRvX2kyY19jbGllbnQoZGV2KSk7CisJc3RydWN0IGRtYXJkMDZfZGF0YSAqZG1hcmQwNiA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZG1hcmQwNi0+Y2xpZW50LCBETUFSRDA2X0NUUkwxX1JFRywKKwkJCQkJRE1BUkQwNl9NT0RFX05PUk1BTCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGRtYXJkMDZfcG1fb3BzLCBkbWFyZDA2X3N1c3BlbmQsIGRtYXJkMDZfcmVzdW1lKTsKKyNkZWZpbmUgRE1BUkQwNl9QTV9PUFMgKCZkbWFyZDA2X3BtX29wcykKKyNlbHNlCisjZGVmaW5lIERNQVJEMDZfUE1fT1BTIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgZG1hcmQwNl9pZFtdID0geworCXsgImRtYXJkMDUiLCAwIH0sCisJeyAiZG1hcmQwNiIsIDAgfSwKKwl7ICJkbWFyZDA3IiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBkbWFyZDA2X2lkKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZG1hcmQwNl9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiZG9taW50ZWNoLGRtYXJkMDUiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJkb21pbnRlY2gsZG1hcmQwNiIgfSwKKwl7IC5jb21wYXRpYmxlID0gImRvbWludGVjaCxkbWFyZDA3IiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGRtYXJkMDZfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZG1hcmQwNl9kcml2ZXIgPSB7CisJLnByb2JlID0gZG1hcmQwNl9wcm9iZSwKKwkuaWRfdGFibGUgPSBkbWFyZDA2X2lkLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRE1BUkQwNl9EUlZfTkFNRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGRtYXJkMDZfb2ZfbWF0Y2gpLAorCQkucG0gPSBETUFSRDA2X1BNX09QUywKKwl9LAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKGRtYXJkMDZfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiQWxla3NlaSBNYW1saW4gPG1hbWxpbmF2QGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRG9taW50ZWNoIERNQVJEMDYgYWNjZWxlcm9tZXRlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FjY2VsL2RtYXJkMDkuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL2RtYXJkMDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2EyOGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWNjZWwvZG1hcmQwOS5jCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogSUlPIGRyaXZlciBmb3IgdGhlIDMtYXhpcyBhY2NlbGVyb21ldGVyIERvbWludGVjaCBETUFSRDA5LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgSmVsbGUgdmFuIGRlciBXYWEgPGplbGxlQHZkd2FhLm5sPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKworI2RlZmluZSBETUFSRDA5X0RSVl9OQU1FCSJkbWFyZDA5IgorCisjZGVmaW5lIERNQVJEMDlfUkVHX0NISVBJRCAgICAgIDB4MTgKKyNkZWZpbmUgRE1BUkQwOV9SRUdfU1RBVAkweDBBCisjZGVmaW5lIERNQVJEMDlfUkVHX1gJCTB4MEMKKyNkZWZpbmUgRE1BUkQwOV9SRUdfWQkJMHgwRQorI2RlZmluZSBETUFSRDA5X1JFR19aCQkweDEwCisjZGVmaW5lIERNQVJEMDlfQ0hJUElECQkweDk1CisKKyNkZWZpbmUgRE1BUkQwOV9CVUZfTEVOIDgKKyNkZWZpbmUgRE1BUkQwOV9BWElTX1ggMAorI2RlZmluZSBETUFSRDA5X0FYSVNfWSAxCisjZGVmaW5lIERNQVJEMDlfQVhJU19aIDIKKyNkZWZpbmUgRE1BUkQwOV9BWElTX1hfT0ZGU0VUICgoRE1BUkQwOV9BWElTX1ggKyAxKSAqIDIpCisjZGVmaW5lIERNQVJEMDlfQVhJU19ZX09GRlNFVCAoKERNQVJEMDlfQVhJU19ZICsgMSApKiAyKQorI2RlZmluZSBETUFSRDA5X0FYSVNfWl9PRkZTRVQgKChETUFSRDA5X0FYSVNfWiArIDEpICogMikKKworc3RydWN0IGRtYXJkMDlfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKK307CisKKyNkZWZpbmUgRE1BUkQwOV9DSEFOTkVMKF9heGlzLCBvZmZzZXQpIHsJCQlcCisJLnR5cGUgPSBJSU9fQUNDRUwsCQkJCQlcCisJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCQlcCisJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwJXAorCS5tb2RpZmllZCA9IDEsCQkJCQkJXAorCS5hZGRyZXNzID0gb2Zmc2V0LAkJCQkJXAorCS5jaGFubmVsMiA9IElJT19NT0RfIyNfYXhpcywJCQkJXAorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgZG1hcmQwOV9jaGFubmVsc1tdID0geworCURNQVJEMDlfQ0hBTk5FTChYLCBETUFSRDA5X0FYSVNfWF9PRkZTRVQpLAorCURNQVJEMDlfQ0hBTk5FTChZLCBETUFSRDA5X0FYSVNfWV9PRkZTRVQpLAorCURNQVJEMDlfQ0hBTk5FTChaLCBETUFSRDA5X0FYSVNfWl9PRkZTRVQpLAorfTsKKworc3RhdGljIGludCBkbWFyZDA5X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBkbWFyZDA5X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXU4IGJ1ZltETUFSRDA5X0JVRl9MRU5dOworCWludCByZXQ7CisJczE2IGFjY2VsOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJLyoKKwkJICogUmVhZCBmcm9tIHRoZSBETUFSMDlfUkVHX1NUQVQgcmVnaXN0ZXIsIHNpbmNlIHRoZSBjaGlwCisJCSAqIGNhY2hlcyByZWFkcyBmcm9tIHRoZSBpbmRpdmlkdWFsIFgsIFksIFogcmVnaXN0ZXJzLgorCQkgKi8KKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCQkJICAgIERNQVJEMDlfUkVHX1NUQVQsCisJCQkJCQkgICAgRE1BUkQwOV9CVUZfTEVOLCBidWYpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsICJFcnJvciByZWFkaW5nIHJlZyAlZFxuIiwKKwkJCQlETUFSRDA5X1JFR19TVEFUKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlhY2NlbCA9IGdldF91bmFsaWduZWRfbGUxNigmYnVmW2NoYW4tPmFkZHJlc3NdKTsKKworCQkvKiBSZW1vdmUgbG93ZXIgMyBiaXRzIGFuZCBzaWduIGV4dGVuZCAqLworCQlhY2NlbCA8PD0gNDsKKwkJYWNjZWwgPj49IDc7CisKKwkJKnZhbCA9IGFjY2VsOworCisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gZG1hcmQwOV9pbmZvID0geworCS5kcml2ZXJfbW9kdWxlCT0gVEhJU19NT0RVTEUsCisJLnJlYWRfcmF3CT0gZG1hcmQwOV9yZWFkX3JhdywKK307CisKK3N0YXRpYyBpbnQgZG1hcmQwOV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgZG1hcmQwOV9kYXRhICpkYXRhOworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpkYXRhKSk7CisJaWYgKCFpbmRpb19kZXYpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpaW8gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBETUFSRDA5X1JFR19DSElQSUQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRXJyb3IgcmVhZGluZyBjaGlwIGlkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZXQgIT0gRE1BUkQwOV9DSElQSUQpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJbnZhbGlkIGNoaXAgaWQgJWRcbiIsIHJldCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGluZGlvX2Rldik7CisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWluZGlvX2Rldi0+bmFtZSA9IERNQVJEMDlfRFJWX05BTUU7CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBkbWFyZDA5X2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShkbWFyZDA5X2NoYW5uZWxzKTsKKwlpbmRpb19kZXYtPmluZm8gPSAmZG1hcmQwOV9pbmZvOworCisJcmV0dXJuIGRldm1faWlvX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYsIGluZGlvX2Rldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBkbWFyZDA5X2lkW10gPSB7CisJeyAiZG1hcmQwOSIsIDB9LAorCXsgfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBkbWFyZDA5X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRtYXJkMDlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRE1BUkQwOV9EUlZfTkFNRQorCX0sCisJLnByb2JlID0gZG1hcmQwOV9wcm9iZSwKKwkuaWRfdGFibGUgPSBkbWFyZDA5X2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIoZG1hcmQwOV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJKZWxsZSB2YW4gZGVyIFdhYSA8amVsbGVAdmR3YWEubmw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRNQVJEMDkgMy1heGlzIGFjY2VsZXJvbWV0ZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9reGNqay0xMDEzLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9reGNqay0xMDEzLmMKaW5kZXggNzY1YTcyMy4uM2Y5NjhjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWNjZWwva3hjamstMTAxMy5jCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL2t4Y2prLTEwMTMuYwpAQCAtMTM5Miw2ICsxMzkyLDcgQEAKIAl7IktYQ0oxMDEzIiwgS1hDSksxMDEzfSwKIAl7IktYQ0oxMDA4IiwgS1hDSjkxMDA4fSwKIAl7IktYQ0o5MDAwIiwgS1hDSjkxMDA4fSwKKwl7IktJT1gwMDBBIiwgS1hDSjkxMDA4fSwKIAl7IktYVEoxMDA5IiwgS1hUSjIxMDA5fSwKIAl7IlNNTzg1MDAiLCAgS1hDSjkxMDA4fSwKIAl7IH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9reHNkOS1pMmMuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL2t4c2Q5LWkyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZTIwODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9hY2NlbC9reHNkOS1pMmMuYwpAQCAtMCwwICsxLDY0IEBACisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNpbmNsdWRlICJreHNkOS5oIgorCitzdGF0aWMgaW50IGt4c2Q5X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBjb25maWcgPSB7CisJCS5yZWdfYml0cyA9IDgsCisJCS52YWxfYml0cyA9IDgsCisJCS5tYXhfcmVnaXN0ZXIgPSAweDBlLAorCX07CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCisJcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAmY29uZmlnKTsKKwlpZiAoSVNfRVJSKHJlZ21hcCkpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgaTJjIHJlZ21hcCAlZFxuIiwKKwkJCShpbnQpUFRSX0VSUihyZWdtYXApKTsKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKKwl9CisKKwlyZXR1cm4ga3hzZDlfY29tbW9uX3Byb2JlKCZpMmMtPmRldiwKKwkJCQkgIHJlZ21hcCwKKwkJCQkgIGkyYy0+bmFtZSk7Cit9CisKK3N0YXRpYyBpbnQga3hzZDlfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiBreHNkOV9jb21tb25fcmVtb3ZlKCZjbGllbnQtPmRldik7Cit9CisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGt4c2Q5X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJraW9uaXgsa3hzZDkiLCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBreHNkOV9vZl9tYXRjaCk7CisjZWxzZQorI2RlZmluZSBreHNkOV9vZl9tYXRjaCBOVUxMCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGt4c2Q5X2kyY19pZFtdID0geworCXsia3hzZDkiLCAwfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGt4c2Q5X2kyY19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBreHNkOV9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImt4c2Q5IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGt4c2Q5X29mX21hdGNoKSwKKwkJLnBtID0gJmt4c2Q5X2Rldl9wbV9vcHMsCisJfSwKKwkucHJvYmUJCT0ga3hzZDlfaTJjX3Byb2JlLAorCS5yZW1vdmUJCT0ga3hzZDlfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBreHNkOV9pMmNfaWQsCit9OworbW9kdWxlX2kyY19kcml2ZXIoa3hzZDlfaTJjX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9reHNkOS1zcGkuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL2t4c2Q5LXNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZDAwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9hY2NlbC9reHNkOS1zcGkuYwpAQCAtMCwwICsxLDU2IEBACisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2luY2x1ZGUgImt4c2Q5LmgiCisKK3N0YXRpYyBpbnQga3hzZDlfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGNvbmZpZyA9IHsKKwkJLnJlZ19iaXRzID0gOCwKKwkJLnZhbF9iaXRzID0gOCwKKwkJLm1heF9yZWdpc3RlciA9IDB4MGUsCisJfTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisKKwlzcGktPm1vZGUgPSBTUElfTU9ERV8wOworCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfc3BpKHNwaSwgJmNvbmZpZyk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IHJlZ21hcCBhbGxvY2F0aW9uIGZhaWxlZDogJWxkXG4iLAorCQkJX19mdW5jX18sIFBUUl9FUlIocmVnbWFwKSk7CisJCXJldHVybiBQVFJfRVJSKHJlZ21hcCk7CisJfQorCisJcmV0dXJuIGt4c2Q5X2NvbW1vbl9wcm9iZSgmc3BpLT5kZXYsCisJCQkJICByZWdtYXAsCisJCQkJICBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5uYW1lKTsKK30KKworc3RhdGljIGludCBreHNkOV9zcGlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJcmV0dXJuIGt4c2Q5X2NvbW1vbl9yZW1vdmUoJnNwaS0+ZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGt4c2Q5X3NwaV9pZFtdID0geworCXsia3hzZDkiLCAwfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIGt4c2Q5X3NwaV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBreHNkOV9zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImt4c2Q5IiwKKwkJLnBtID0gJmt4c2Q5X2Rldl9wbV9vcHMsCisJfSwKKwkucHJvYmUgPSBreHNkOV9zcGlfcHJvYmUsCisJLnJlbW92ZSA9IGt4c2Q5X3NwaV9yZW1vdmUsCisJLmlkX3RhYmxlID0ga3hzZDlfc3BpX2lkLAorfTsKK21vZHVsZV9zcGlfZHJpdmVyKGt4c2Q5X3NwaV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBDYW1lcm9uIDxqaWMyM0BrZXJuZWwub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJLaW9uaXggS1hTRDkgU1BJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwva3hzZDkuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL2t4c2Q5LmMKaW5kZXggM2E5ZjEwNi4uOWFmNjBhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWNjZWwva3hzZDkuYworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9reHNkOS5jCkBAIC0xMiwxOSArMTIsMjUgQEAKICAqIEkgaGF2ZSBhIHN1aXRhYmxlIHdpcmUgbWFkZSB1cC4KICAqCiAgKiBUT0RPOglTdXBwb3J0IHRoZSBtb3Rpb24gZGV0ZWN0b3IKLSAqCQlVc2VzIHJlZ2lzdGVyIGFkZHJlc3MgaW5jcmVtZW50aW5nIHNvIGNvdWxkIGhhdmUgYQotICoJCWhlYXZpbHkgb3B0aW1pemVkIHJpbmcgYnVmZmVyIGFjY2VzcyBmdW5jdGlvbi4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lpby9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcmVkX2J1ZmZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyX2NvbnN1bWVyLmg+CisKKyNpbmNsdWRlICJreHNkOS5oIgogCiAjZGVmaW5lIEtYU0Q5X1JFR19YCQkweDAwCiAjZGVmaW5lIEtYU0Q5X1JFR19ZCQkweDAyCkBAIC0zMywyOCArMzksNDUgQEAKICNkZWZpbmUgS1hTRDlfUkVHX1JFU0VUCQkweDBhCiAjZGVmaW5lIEtYU0Q5X1JFR19DVFJMX0MJMHgwYwogCi0jZGVmaW5lIEtYU0Q5X0ZTX01BU0sJCTB4MDMKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX0ZTX01BU0sJMHgwMworI2RlZmluZSBLWFNEOV9DVFJMX0NfRlNfOEcJMHgwMAorI2RlZmluZSBLWFNEOV9DVFJMX0NfRlNfNkcJMHgwMQorI2RlZmluZSBLWFNEOV9DVFJMX0NfRlNfNEcJMHgwMgorI2RlZmluZSBLWFNEOV9DVFJMX0NfRlNfMkcJMHgwMworI2RlZmluZSBLWFNEOV9DVFJMX0NfTU9UX0xBVAlCSVQoMykKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX01PVF9MRVYJQklUKDQpCisjZGVmaW5lIEtYU0Q5X0NUUkxfQ19MUF9NQVNLCTB4ZTAKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX0xQX05PTkUJMHgwMAorI2RlZmluZSBLWFNEOV9DVFJMX0NfTFBfMjAwMEhaQwlCSVQoNSkKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX0xQXzIwMDBIWkIJQklUKDYpCisjZGVmaW5lIEtYU0Q5X0NUUkxfQ19MUF8yMDAwSFpBCShCSVQoNSl8QklUKDYpKQorI2RlZmluZSBLWFNEOV9DVFJMX0NfTFBfMTAwMEhaCUJJVCg3KQorI2RlZmluZSBLWFNEOV9DVFJMX0NfTFBfNTAwSFoJKEJJVCg3KXxCSVQoNSkpCisjZGVmaW5lIEtYU0Q5X0NUUkxfQ19MUF8xMDBIWgkoQklUKDcpfEJJVCg2KSkKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX0xQXzUwSFoJKEJJVCg3KXxCSVQoNil8QklUKDUpKQogCiAjZGVmaW5lIEtYU0Q5X1JFR19DVFJMX0IJMHgwZAorCisjZGVmaW5lIEtYU0Q5X0NUUkxfQl9DTEtfSExECUJJVCg3KQorI2RlZmluZSBLWFNEOV9DVFJMX0JfRU5BQkxFCUJJVCg2KQorI2RlZmluZSBLWFNEOV9DVFJMX0JfU1QJCUJJVCg1KSAvKiBTZWxmLXRlc3QgKi8KKwogI2RlZmluZSBLWFNEOV9SRUdfQ1RSTF9BCTB4MGUKIAotI2RlZmluZSBLWFNEOV9SRUFEKGEpICgweDgwIHwgKGEpKQotI2RlZmluZSBLWFNEOV9XUklURShhKSAoYSkKLQotI2RlZmluZSBLWFNEOV9TVEFURV9SWF9TSVpFIDIKLSNkZWZpbmUgS1hTRDlfU1RBVEVfVFhfU0laRSAyCiAvKioKICAqIHN0cnVjdCBreHNkOV9zdGF0ZSAtIGRldmljZSByZWxhdGVkIHN0b3JhZ2UKLSAqIEBidWZfbG9jazoJcHJvdGVjdCB0aGUgcnggYW5kIHR4IGJ1ZmZlcnMuCi0gKiBAdXM6CQlzcGkgZGV2aWNlCi0gKiBAcng6CQlzaW5nbGUgcnggYnVmZmVyIHN0b3JhZ2UKLSAqIEB0eDoJCXNpbmdsZSB0eCBidWZmZXIgc3RvcmFnZQotICoqLworICogQGRldjogcG9pbnRlciB0byB0aGUgcGFyZW50IGRldmljZQorICogQG1hcDogcmVnbWFwIHRvIHRoZSBkZXZpY2UKKyAqIEBvcmllbnRhdGlvbjogbW91bnRpbmcgbWF0cml4LCBmbGlwcGVkIGF4aXMgZXRjCisgKiBAcmVnczogcmVndWxhdG9ycyBmb3IgdGhpcyBkZXZpY2UsIFZERCBhbmQgSU9WREQKKyAqIEBzY2FsZTogdGhlIGN1cnJlbnQgc2NhbGluZyBzZXR0aW5nCisgKi8KIHN0cnVjdCBreHNkOV9zdGF0ZSB7Ci0Jc3RydWN0IG11dGV4IGJ1Zl9sb2NrOwotCXN0cnVjdCBzcGlfZGV2aWNlICp1czsKLQl1OCByeFtLWFNEOV9TVEFURV9SWF9TSVpFXSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7Ci0JdTggdHhbS1hTRDlfU1RBVEVfVFhfU0laRV07CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCByZWdtYXAgKm1hcDsKKwlzdHJ1Y3QgaWlvX21vdW50X21hdHJpeCBvcmllbnRhdGlvbjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSByZWdzWzJdOworCXU4IHNjYWxlOwogfTsKIAogI2RlZmluZSBLWFNEOV9TQ0FMRV8yRyAiMC4wMTE5NzgiCkBAIC02NSw2ICs4OCwxNCBAQAogLyogcmV2ZXJzZSBvcmRlciAqLwogc3RhdGljIGNvbnN0IGludCBreHNkOV9taWNyb19zY2FsZXNbNF0gPSB7IDQ3ODUzLCAzNTkzNCwgMjM5MjcsIDExOTc4IH07CiAKKyNkZWZpbmUgS1hTRDlfWkVST19HX09GRlNFVCAtMjA0OAorCisvKgorICogUmVndWxhdG9yIG5hbWVzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGt4c2Q5X3JlZ192ZGRbXSA9ICJ2ZGQiOworc3RhdGljIGNvbnN0IGNoYXIga3hzZDlfcmVnX2lvdmRkW10gPSAiaW92ZGQiOworCiBzdGF0aWMgaW50IGt4c2Q5X3dyaXRlX3NjYWxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGludCBtaWNybykKIHsKIAlpbnQgcmV0LCBpOwpAQCAtNzksNDIgKzExMCwxNyBAQAogCWlmICghZm91bmRpdCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOwotCXJldCA9IHNwaV93OHI4KHN0LT51cywgS1hTRDlfUkVBRChLWFNEOV9SRUdfQ1RSTF9DKSk7CisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHN0LT5tYXAsCisJCQkJIEtYU0Q5X1JFR19DVFJMX0MsCisJCQkJIEtYU0Q5X0NUUkxfQ19GU19NQVNLLAorCQkJCSBpKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcl9yZXQ7Ci0Jc3QtPnR4WzBdID0gS1hTRDlfV1JJVEUoS1hTRDlfUkVHX0NUUkxfQyk7Ci0Jc3QtPnR4WzFdID0gKHJldCAmIH5LWFNEOV9GU19NQVNLKSB8IGk7CiAKLQlyZXQgPSBzcGlfd3JpdGUoc3QtPnVzLCBzdC0+dHgsIDIpOworCS8qIENhY2hlZCBzY2FsZSB3aGVuIHRoZSBzZW5zb3IgaXMgcG93ZXJlZCBkb3duICovCisJc3QtPnNjYWxlID0gaTsKKwogZXJyb3JfcmV0OgotCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGt4c2Q5X3JlYWQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdTggYWRkcmVzcykKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBreHNkOV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKLQkJewotCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAotCQkJLmxlbiA9IDEsCi0JCQkuZGVsYXlfdXNlY3MgPSAyMDAsCi0JCQkudHhfYnVmID0gc3QtPnR4LAotCQl9LCB7Ci0JCQkuYml0c19wZXJfd29yZCA9IDgsCi0JCQkubGVuID0gMiwKLQkJCS5yeF9idWYgPSBzdC0+cngsCi0JCX0sCi0JfTsKLQotCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7Ci0Jc3QtPnR4WzBdID0gS1hTRDlfUkVBRChhZGRyZXNzKTsKLQlyZXQgPSBzcGlfc3luY190cmFuc2ZlcihzdC0+dXMsIHhmZXJzLCBBUlJBWV9TSVpFKHhmZXJzKSk7Ci0JaWYgKCFyZXQpCi0JCXJldCA9ICgoKHUxNikoc3QtPnJ4WzBdKSkgPDwgOCkgfCAoc3QtPnJ4WzFdICYgMHhGMCk7Ci0JbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEzNiw2ICsxNDIsOSBAQAogCQkJICAgbG9uZyBtYXNrKQogewogCWludCByZXQgPSAtRUlOVkFMOworCXN0cnVjdCBreHNkOV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJcG1fcnVudGltZV9nZXRfc3luYyhzdC0+ZGV2KTsKIAogCWlmIChtYXNrID09IElJT19DSEFOX0lORk9fU0NBTEUpIHsKIAkJLyogQ2hlY2sgbm8gaW50ZWdlciBjb21wb25lbnQgKi8KQEAgLTE0NCw2ICsxNTMsOSBAQAogCQlyZXQgPSBreHNkOV93cml0ZV9zY2FsZShpbmRpb19kZXYsIHZhbDIpOwogCX0KIAorCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koc3QtPmRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoc3QtPmRldik7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNTMsNDQgKzE2NSwxNTQgQEAKIHsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAlzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBpbnQgcmVndmFsOworCV9fYmUxNiByYXdfdmFsOworCXUxNiBudmFsOworCisJcG1fcnVudGltZV9nZXRfc3luYyhzdC0+ZGV2KTsKIAogCXN3aXRjaCAobWFzaykgewogCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6Ci0JCXJldCA9IGt4c2Q5X3JlYWQoaW5kaW9fZGV2LCBjaGFuLT5hZGRyZXNzKTsKLQkJaWYgKHJldCA8IDApCisJCXJldCA9IHJlZ21hcF9idWxrX3JlYWQoc3QtPm1hcCwgY2hhbi0+YWRkcmVzcywgJnJhd192YWwsCisJCQkJICAgICAgIHNpemVvZihyYXdfdmFsKSk7CisJCWlmIChyZXQpCiAJCQlnb3RvIGVycm9yX3JldDsKLQkJKnZhbCA9IHJldDsKKwkJbnZhbCA9IGJlMTZfdG9fY3B1KHJhd192YWwpOworCQkvKiBPbmx5IDEyIGJpdHMgYXJlIHZhbGlkICovCisJCW52YWwgPj49IDQ7CisJCSp2YWwgPSBudmFsOworCQlyZXQgPSBJSU9fVkFMX0lOVDsKKwkJYnJlYWs7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX09GRlNFVDoKKwkJLyogVGhpcyBoYXMgYSBiaWFzIG9mIC0yMDQ4ICovCisJCSp2YWwgPSBLWFNEOV9aRVJPX0dfT0ZGU0VUOworCQlyZXQgPSBJSU9fVkFMX0lOVDsKIAkJYnJlYWs7CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgotCQlyZXQgPSBzcGlfdzhyOChzdC0+dXMsIEtYU0Q5X1JFQUQoS1hTRDlfUkVHX0NUUkxfQykpOworCQlyZXQgPSByZWdtYXBfcmVhZChzdC0+bWFwLAorCQkJCSAgS1hTRDlfUkVHX0NUUkxfQywKKwkJCQkgICZyZWd2YWwpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZXJyb3JfcmV0OwotCQkqdmFsMiA9IGt4c2Q5X21pY3JvX3NjYWxlc1tyZXQgJiBLWFNEOV9GU19NQVNLXTsKKwkJKnZhbCA9IDA7CisJCSp2YWwyID0ga3hzZDlfbWljcm9fc2NhbGVzW3JlZ3ZhbCAmIEtYU0Q5X0NUUkxfQ19GU19NQVNLXTsKIAkJcmV0ID0gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKIAkJYnJlYWs7CiAJfQogCiBlcnJvcl9yZXQ6CisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShzdC0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChzdC0+ZGV2KTsKKwogCXJldHVybiByZXQ7CiB9OwotI2RlZmluZSBLWFNEOV9BQ0NFTF9DSEFOKGF4aXMpCQkJCQkJXAorCitzdGF0aWMgaXJxcmV0dXJuX3Qga3hzZDlfdHJpZ2dlcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnApCit7CisJY29uc3Qgc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmID0gcDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKKwlzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCS8qIDQgKiAxNmJpdCB2YWx1ZXMgQU5EIHRpbWVzdGFtcCAqLworCV9fYmUxNiBod192YWx1ZXNbOF07CisKKwlyZXQgPSByZWdtYXBfYnVsa19yZWFkKHN0LT5tYXAsCisJCQkgICAgICAgS1hTRDlfUkVHX1gsCisJCQkgICAgICAgJmh3X3ZhbHVlcywKKwkJCSAgICAgICA4KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoc3QtPmRldiwKKwkJCSJlcnJvciByZWFkaW5nIGRhdGFcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlpb19wdXNoX3RvX2J1ZmZlcnNfd2l0aF90aW1lc3RhbXAoaW5kaW9fZGV2LAorCQkJCQkgICBod192YWx1ZXMsCisJCQkJCSAgIGlpb19nZXRfdGltZV9ucyhpbmRpb19kZXYpKTsKKwlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShpbmRpb19kZXYtPnRyaWcpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGt4c2Q5X2J1ZmZlcl9wcmVlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoc3QtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBreHNkOV9idWZmZXJfcG9zdGRpc2FibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koc3QtPmRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoc3QtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fYnVmZmVyX3NldHVwX29wcyBreHNkOV9idWZmZXJfc2V0dXBfb3BzID0geworCS5wcmVlbmFibGUgPSBreHNkOV9idWZmZXJfcHJlZW5hYmxlLAorCS5wb3N0ZW5hYmxlID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSwKKwkucHJlZGlzYWJsZSA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3ByZWRpc2FibGUsCisJLnBvc3RkaXNhYmxlID0ga3hzZDlfYnVmZmVyX3Bvc3RkaXNhYmxlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fbW91bnRfbWF0cml4ICoKK2t4c2Q5X2dldF9tb3VudF9tYXRyaXgoY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuKQoreworCXN0cnVjdCBreHNkOV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJcmV0dXJuICZzdC0+b3JpZW50YXRpb247Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlY19leHRfaW5mbyBreHNkOV9leHRfaW5mb1tdID0geworCUlJT19NT1VOVF9NQVRSSVgoSUlPX1NIQVJFRF9CWV9UWVBFLCBreHNkOV9nZXRfbW91bnRfbWF0cml4KSwKKwl7IH0sCit9OworCisjZGVmaW5lIEtYU0Q5X0FDQ0VMX0NIQU4oYXhpcywgaW5kZXgpCQkJCQkJXAogCXsJCQkJCQkJCVwKIAkJLnR5cGUgPSBJSU9fQUNDRUwsCQkJCQlcCiAJCS5tb2RpZmllZCA9IDEsCQkJCQkJXAogCQkuY2hhbm5lbDIgPSBJSU9fTU9EXyMjYXhpcywJCQkJXAogCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJCVwKLQkJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwJXAorCQkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fU0NBTEUpIHwJXAorCQkJCQlCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpLAlcCisJCS5leHRfaW5mbyA9IGt4c2Q5X2V4dF9pbmZvLAkJCQlcCiAJCS5hZGRyZXNzID0gS1hTRDlfUkVHXyMjYXhpcywJCQkJXAorCQkuc2Nhbl9pbmRleCA9IGluZGV4LAkJCQkJXAorCQkuc2Nhbl90eXBlID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCS5zaWduID0gJ3UnLAkJCQkJXAorCQkJLnJlYWxiaXRzID0gMTIsCQkJCQlcCisJCQkuc3RvcmFnZWJpdHMgPSAxNiwJCQkJXAorCQkJLnNoaWZ0ID0gNCwJCQkJCVwKKwkJCS5lbmRpYW5uZXNzID0gSUlPX0JFLAkJCQlcCisJCX0sCQkJCQkJCVwKIAl9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBreHNkOV9jaGFubmVsc1tdID0gewotCUtYU0Q5X0FDQ0VMX0NIQU4oWCksIEtYU0Q5X0FDQ0VMX0NIQU4oWSksIEtYU0Q5X0FDQ0VMX0NIQU4oWiksCisJS1hTRDlfQUNDRUxfQ0hBTihYLCAwKSwKKwlLWFNEOV9BQ0NFTF9DSEFOKFksIDEpLAorCUtYU0Q5X0FDQ0VMX0NIQU4oWiwgMiksCiAJewogCQkudHlwZSA9IElJT19WT0xUQUdFLAogCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwKIAkJLmluZGV4ZWQgPSAxLAogCQkuYWRkcmVzcyA9IEtYU0Q5X1JFR19BVVgsCi0JfQorCQkuc2Nhbl9pbmRleCA9IDMsCisJCS5zY2FuX3R5cGUgPSB7CisJCQkuc2lnbiA9ICd1JywKKwkJCS5yZWFsYml0cyA9IDEyLAorCQkJLnN0b3JhZ2ViaXRzID0gMTYsCisJCQkuc2hpZnQgPSA0LAorCQkJLmVuZGlhbm5lc3MgPSBJSU9fQkUsCisJCX0sCisJfSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg0KSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGt4c2Q5X2F0dHJpYnV0ZV9ncm91cCA9IHsKQEAgLTIwMSwxNyArMzIzLDY5IEBACiB7CiAJaW50IHJldDsKIAotCXN0LT50eFswXSA9IDB4MGQ7Ci0Jc3QtPnR4WzFdID0gMHg0MDsKLQlyZXQgPSBzcGlfd3JpdGUoc3QtPnVzLCBzdC0+dHgsIDIpOworCS8qIEVuYWJsZSB0aGUgcmVndWxhdG9ycyAqLworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKHN0LT5yZWdzKSwgc3QtPnJlZ3MpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihzdC0+ZGV2LCAiQ2Fubm90IGVuYWJsZSByZWd1bGF0b3JzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBQb3dlciB1cCAqLworCXJldCA9IHJlZ21hcF93cml0ZShzdC0+bWFwLAorCQkJICAgS1hTRDlfUkVHX0NUUkxfQiwKKwkJCSAgIEtYU0Q5X0NUUkxfQl9FTkFCTEUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlzdC0+dHhbMF0gPSAweDBjOwotCXN0LT50eFsxXSA9IDB4OWI7Ci0JcmV0dXJuIHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgMik7CisJLyoKKwkgKiBTZXQgMTAwMEh6IExQRiwgMmcgZnVsbHNjYWxlLCBtb3Rpb24gd2FrZXVwIHRocmVzaG9sZCAxZywKKwkgKiBsYXRjaGVkIHdha2V1cAorCSAqLworCXJldCA9IHJlZ21hcF93cml0ZShzdC0+bWFwLAorCQkJICAgS1hTRDlfUkVHX0NUUkxfQywKKwkJCSAgIEtYU0Q5X0NUUkxfQ19MUF8xMDAwSFogfAorCQkJICAgS1hTRDlfQ1RSTF9DX01PVF9MRVYJfAorCQkJICAgS1hTRDlfQ1RSTF9DX01PVF9MQVQgfAorCQkJICAgc3QtPnNjYWxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBQb3dlci11cCB0aW1lIGRlcGVuZHMgb24gdGhlIExQRiBzZXR0aW5nLCBidXQgdHlwIDE1LjkgbXMsIGxldCdzCisJICogc2V0IDIwIG1zIHRvIGFsbG93IGZvciBzb21lIHNsYWNrLgorCSAqLworCW1zbGVlcCgyMCk7CisKKwlyZXR1cm4gMDsKIH07CiAKK3N0YXRpYyBpbnQga3hzZDlfcG93ZXJfZG93bihzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0KQoreworCWludCByZXQ7CisKKwkvKgorCSAqIFNldCBpbnRvIGxvdyBwb3dlciBtb2RlIC0gc2luY2UgdGhlcmUgbWF5IGJlIG1vcmUgdXNlcnMgb2YgdGhlCisJICogcmVndWxhdG9ycyB0aGlzIGlzIHRoZSBmaXJzdCBzdGVwIG9mIHRoZSBwb3dlciBzYXZpbmc6IGl0IHdpbGwKKwkgKiBtYWtlIHN1cmUgd2UgY29uc2VydmUgcG93ZXIgZXZlbiBpZiB0aGVyZSBhcmUgb3RoZXJzIHVzZXJzIG9uIHRoZQorCSAqIHJlZ3VsYXRvcnMuCisJICovCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHN0LT5tYXAsCisJCQkJIEtYU0Q5X1JFR19DVFJMX0IsCisJCQkJIEtYU0Q5X0NUUkxfQl9FTkFCTEUsCisJCQkJIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBEaXNhYmxlIHRoZSByZWd1bGF0b3JzICovCisJcmV0ID0gcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHN0LT5yZWdzKSwgc3QtPnJlZ3MpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihzdC0+ZGV2LCAiQ2Fubm90IGRpc2FibGUgcmVndWxhdG9yc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8ga3hzZDlfaW5mbyA9IHsKIAkucmVhZF9yYXcgPSAma3hzZDlfcmVhZF9yYXcsCiAJLndyaXRlX3JhdyA9ICZreHNkOV93cml0ZV9yYXcsCkBAIC0yMTksNTcgKzM5MywxMzYgQEAKIAkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAogfTsKIAotc3RhdGljIGludCBreHNkOV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQorLyogRm91ciBjaGFubmVscyBhcGFydCBmcm9tIHRpbWVzdGFtcCwgc2NhbiBtYXNrID0gMHgwZiAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcga3hzZDlfc2Nhbl9tYXNrc1tdID0geyAweGYsIDAgfTsKKworaW50IGt4c2Q5X2NvbW1vbl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgcmVnbWFwICptYXAsCisJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAJc3RydWN0IGt4c2Q5X3N0YXRlICpzdDsKKwlpbnQgcmV0OwogCi0JaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpzdCkpOworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYyhkZXYsIHNpemVvZigqc3QpKTsKIAlpZiAoIWluZGlvX2RldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0Jc3BpX3NldF9kcnZkYXRhKHNwaSwgaW5kaW9fZGV2KTsKKwlzdC0+ZGV2ID0gZGV2OworCXN0LT5tYXAgPSBtYXA7CiAKLQlzdC0+dXMgPSBzcGk7Ci0JbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKIAlpbmRpb19kZXYtPmNoYW5uZWxzID0ga3hzZDlfY2hhbm5lbHM7CiAJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGt4c2Q5X2NoYW5uZWxzKTsKLQlpbmRpb19kZXYtPm5hbWUgPSBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5uYW1lOwotCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlpbmRpb19kZXYtPm5hbWUgPSBuYW1lOworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9IGRldjsKIAlpbmRpb19kZXYtPmluZm8gPSAma3hzZDlfaW5mbzsKIAlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5hdmFpbGFibGVfc2Nhbl9tYXNrcyA9IGt4c2Q5X3NjYW5fbWFza3M7CiAKLQlzcGktPm1vZGUgPSBTUElfTU9ERV8wOwotCXNwaV9zZXR1cChzcGkpOworCS8qIFJlYWQgdGhlIG1vdW50aW5nIG1hdHJpeCwgaWYgcHJlc2VudCAqLworCXJldCA9IG9mX2lpb19yZWFkX21vdW50X21hdHJpeChkZXYsCisJCQkJICAgICAgICJtb3VudC1tYXRyaXgiLAorCQkJCSAgICAgICAmc3QtPm9yaWVudGF0aW9uKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogRmV0Y2ggYW5kIHR1cm4gb24gcmVndWxhdG9ycyAqLworCXN0LT5yZWdzWzBdLnN1cHBseSA9IGt4c2Q5X3JlZ192ZGQ7CisJc3QtPnJlZ3NbMV0uc3VwcGx5ID0ga3hzZDlfcmVnX2lvdmRkOworCXJldCA9IGRldm1fcmVndWxhdG9yX2J1bGtfZ2V0KGRldiwKKwkJCQkgICAgICBBUlJBWV9TSVpFKHN0LT5yZWdzKSwKKwkJCQkgICAgICBzdC0+cmVncyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBnZXQgcmVndWxhdG9yc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCS8qIERlZmF1bHQgc2NhbGluZyAqLworCXN0LT5zY2FsZSA9IEtYU0Q5X0NUUkxfQ19GU18yRzsKKwogCWt4c2Q5X3Bvd2VyX3VwKHN0KTsKIAotCXJldHVybiBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci19CisJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LAorCQkJCQkgaWlvX3BvbGxmdW5jX3N0b3JlX3RpbWUsCisJCQkJCSBreHNkOV90cmlnZ2VyX2hhbmRsZXIsCisJCQkJCSAma3hzZDlfYnVmZmVyX3NldHVwX29wcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgInRyaWdnZXJlZCBidWZmZXIgc2V0dXAgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfcG93ZXJfZG93bjsKKwl9CiAKLXN0YXRpYyBpbnQga3hzZDlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2NsZWFudXBfYnVmZmVyOworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgaW5kaW9fZGV2KTsKKworCS8qIEVuYWJsZSBydW50aW1lIFBNICovCisJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCS8qCisJICogU2V0IGF1dG9zdXNwZW5kIHRvIHR3byBvcmRlcnMgb2YgbWFnbml0dWRlIGxhcmdlciB0aGFuIHRoZQorCSAqIHN0YXJ0LXVwIHRpbWUuIDIwbXMgc3RhcnQtdXAgdGltZSBtZWFucyAyMDAwbXMgYXV0b3N1c3BlbmQsCisJICogaS5lLiAyIHNlY29uZHMuCisJICovCisJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoZGV2LCAyMDAwKTsKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZChkZXYpOworCXBtX3J1bnRpbWVfcHV0KGRldik7CisKKwlyZXR1cm4gMDsKKworZXJyX2NsZWFudXBfYnVmZmVyOgorCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKK2Vycl9wb3dlcl9kb3duOgorCWt4c2Q5X3Bvd2VyX2Rvd24oc3QpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woa3hzZDlfY29tbW9uX3Byb2JlKTsKKworaW50IGt4c2Q5X2NvbW1vbl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQogewotCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzcGlfZ2V0X2RydmRhdGEoc3BpKSk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBreHNkOV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2KTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKwlreHNkOV9wb3dlcl9kb3duKHN0KTsKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChreHNkOV9jb21tb25fcmVtb3ZlKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGt4c2Q5X2lkW10gPSB7Ci0JeyJreHNkOSIsIDB9LAotCXsgfSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwga3hzZDlfaWQpOworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBreHNkOV9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAotc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGt4c2Q5X2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJreHNkOSIsCi0JfSwKLQkucHJvYmUgPSBreHNkOV9wcm9iZSwKLQkucmVtb3ZlID0ga3hzZDlfcmVtb3ZlLAotCS5pZF90YWJsZSA9IGt4c2Q5X2lkLAorCXJldHVybiBreHNkOV9wb3dlcl9kb3duKHN0KTsKK30KKworc3RhdGljIGludCBreHNkOV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBreHNkOV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJcmV0dXJuIGt4c2Q5X3Bvd2VyX3VwKHN0KTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworY29uc3Qgc3RydWN0IGRldl9wbV9vcHMga3hzZDlfZGV2X3BtX29wcyA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhwbV9ydW50aW1lX2ZvcmNlX3N1c3BlbmQsCisJCQkJcG1fcnVudGltZV9mb3JjZV9yZXN1bWUpCisJU0VUX1JVTlRJTUVfUE1fT1BTKGt4c2Q5X3J1bnRpbWVfc3VzcGVuZCwKKwkJCSAgIGt4c2Q5X3J1bnRpbWVfcmVzdW1lLCBOVUxMKQogfTsKLW1vZHVsZV9zcGlfZHJpdmVyKGt4c2Q5X2RyaXZlcik7CitFWFBPUlRfU1lNQk9MKGt4c2Q5X2Rldl9wbV9vcHMpOwogCiBNT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBDYW1lcm9uIDxqaWMyM0BrZXJuZWwub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJLaW9uaXggS1hTRDkgU1BJIGRyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJLaW9uaXggS1hTRDkgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9reHNkOS5oIGIvZHJpdmVycy9paW8vYWNjZWwva3hzZDkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZThhMjgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWNjZWwva3hzZDkuaApAQCAtMCwwICsxLDEyIEBACisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNkZWZpbmUgS1hTRDlfU1RBVEVfUlhfU0laRSAyCisjZGVmaW5lIEtYU0Q5X1NUQVRFX1RYX1NJWkUgMgorCitpbnQga3hzZDlfY29tbW9uX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCByZWdtYXAgKm1hcCwKKwkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGt4c2Q5X2NvbW1vbl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGt4c2Q5X2Rldl9wbV9vcHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9tYzMyMzAuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL21jMzIzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYTJmZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9hY2NlbC9tYzMyMzAuYwpAQCAtMCwwICsxLDIxMSBAQAorLyoqCisgKiBtQ3ViZSBNQzMyMzAgMy1BeGlzIEFjY2VsZXJvbWV0ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIElJTyBkcml2ZXIgZm9yIG1DdWJlIE1DMzIzMDsgNy1iaXQgSTJDIGFkZHJlc3M6IDB4NGMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vc3lzZnMuaD4KKworI2RlZmluZSBNQzMyMzBfUkVHX1hPVVQJCQkweDAwCisjZGVmaW5lIE1DMzIzMF9SRUdfWU9VVAkJCTB4MDEKKyNkZWZpbmUgTUMzMjMwX1JFR19aT1VUCQkJMHgwMgorCisjZGVmaW5lIE1DMzIzMF9SRUdfTU9ERQkJCTB4MDcKKyNkZWZpbmUgTUMzMjMwX01PREVfT1BDT05fTUFTSwkJMHgwMworI2RlZmluZSBNQzMyMzBfTU9ERV9PUENPTl9XQUtFCQkweDAxCisjZGVmaW5lIE1DMzIzMF9NT0RFX09QQ09OX1NUQU5EQlkJMHgwMworCisjZGVmaW5lIE1DMzIzMF9SRUdfQ0hJUF9JRAkJMHgxOAorI2RlZmluZSBNQzMyMzBfQ0hJUF9JRAkJCTB4MDEKKworI2RlZmluZSBNQzMyMzBfUkVHX1BST0RVQ1RfQ09ERQkJMHgzYgorI2RlZmluZSBNQzMyMzBfUFJPRFVDVF9DT0RFCQkweDE5CisKKy8qCisgKiBUaGUgYWNjZWxlcm9tZXRlciBoYXMgb25lIG1lYXN1cmVtZW50IHJhbmdlOgorICoKKyAqIC0xLjVnIC0gKzEuNWcgKDgtYml0LCBzaWduZWQpCisgKgorICogc2NhbGUgPSAoMS41ICsgMS41KSAqIDkuODEgLyAoMl44IC0gMSkJPSAwLjExNTQxMTc2NQorICovCisKK3N0YXRpYyBjb25zdCBpbnQgbWMzMjMwX25zY2FsZSA9IDExNTQxMTc2NTsKKworI2RlZmluZSBNQzMyMzBfQ0hBTk5FTChyZWcsIGF4aXMpIHsJXAorCS50eXBlID0gSUlPX0FDQ0VMLAlcCisJLmFkZHJlc3MgPSByZWcsCVwKKwkubW9kaWZpZWQgPSAxLAlcCisJLmNoYW5uZWwyID0gSUlPX01PRF8jI2F4aXMsCVwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJXAorCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCVwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIG1jMzIzMF9jaGFubmVsc1tdID0geworCU1DMzIzMF9DSEFOTkVMKE1DMzIzMF9SRUdfWE9VVCwgWCksCisJTUMzMjMwX0NIQU5ORUwoTUMzMjMwX1JFR19ZT1VULCBZKSwKKwlNQzMyMzBfQ0hBTk5FTChNQzMyMzBfUkVHX1pPVVQsIFopLAorfTsKKworc3RydWN0IG1jMzIzMF9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworfTsKKworc3RhdGljIGludCBtYzMyMzBfc2V0X29wY29uKHN0cnVjdCBtYzMyMzBfZGF0YSAqZGF0YSwgaW50IG9wY29uKQoreworCWludCByZXQ7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1DMzIzMF9SRUdfTU9ERSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVhZCBtb2RlIHJlZzogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ICY9IH5NQzMyMzBfTU9ERV9PUENPTl9NQVNLOworCXJldCB8PSBvcGNvbjsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNQzMyMzBfUkVHX01PREUsIHJldCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gd3JpdGUgbW9kZSByZWc6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1jMzIzMF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJCWludCAqdmFsLCBpbnQgKnZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgbWMzMjMwX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBjaGFuLT5hZGRyZXNzKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFsID0gc2lnbl9leHRlbmQzMihyZXQsIDcpOworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgorCQkqdmFsID0gMDsKKwkJKnZhbDIgPSBtYzMyMzBfbnNjYWxlOworCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19OQU5POworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBtYzMyMzBfaW5mbyA9IHsKKwkuZHJpdmVyX21vZHVsZQk9IFRISVNfTU9EVUxFLAorCS5yZWFkX3Jhdwk9IG1jMzIzMF9yZWFkX3JhdywKK307CisKK3N0YXRpYyBpbnQgbWMzMjMwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCBtYzMyMzBfZGF0YSAqZGF0YTsKKworCS8qIEZpcnN0IGNoZWNrIGNoaXAtaWQgYW5kIHByb2R1Y3QtaWQgKi8KKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQzMyMzBfUkVHX0NISVBfSUQpOworCWlmIChyZXQgIT0gTUMzMjMwX0NISVBfSUQpCisJCXJldHVybiAocmV0IDwgMCkgPyByZXQgOiAtRU5PREVWOworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUMzMjMwX1JFR19QUk9EVUNUX0NPREUpOworCWlmIChyZXQgIT0gTUMzMjMwX1BST0RVQ1RfQ09ERSkKKwkJcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IC1FTk9ERVY7CisKKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmRhdGEpKTsKKwlpZiAoIWluZGlvX2RldikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImlpbyBhbGxvY2F0aW9uIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaW5kaW9fZGV2KTsKKworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwlpbmRpb19kZXYtPmluZm8gPSAmbWMzMjMwX2luZm87CisJaW5kaW9fZGV2LT5uYW1lID0gIm1jMzIzMCI7CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBtYzMyMzBfY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKG1jMzIzMF9jaGFubmVscyk7CisKKwlyZXQgPSBtYzMyMzBfc2V0X29wY29uKGRhdGEsIE1DMzIzMF9NT0RFX09QQ09OX1dBS0UpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIik7CisJCW1jMzIzMF9zZXRfb3Bjb24oZGF0YSwgTUMzMjMwX01PREVfT1BDT05fU1RBTkRCWSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtYzMyMzBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisKKwlyZXR1cm4gbWMzMjMwX3NldF9vcGNvbihpaW9fcHJpdihpbmRpb19kZXYpLCBNQzMyMzBfTU9ERV9PUENPTl9TVEFOREJZKTsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBtYzMyMzBfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1jMzIzMF9kYXRhICpkYXRhOworCisJZGF0YSA9IGlpb19wcml2KGkyY19nZXRfY2xpZW50ZGF0YSh0b19pMmNfY2xpZW50KGRldikpKTsKKworCXJldHVybiBtYzMyMzBfc2V0X29wY29uKGRhdGEsIE1DMzIzMF9NT0RFX09QQ09OX1NUQU5EQlkpOworfQorCitzdGF0aWMgaW50IG1jMzIzMF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtYzMyMzBfZGF0YSAqZGF0YTsKKworCWRhdGEgPSBpaW9fcHJpdihpMmNfZ2V0X2NsaWVudGRhdGEodG9faTJjX2NsaWVudChkZXYpKSk7CisKKwlyZXR1cm4gbWMzMjMwX3NldF9vcGNvbihkYXRhLCBNQzMyMzBfTU9ERV9PUENPTl9XQUtFKTsKK30KKyNlbmRpZgorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMobWMzMjMwX3BtX29wcywgbWMzMjMwX3N1c3BlbmQsIG1jMzIzMF9yZXN1bWUpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbWMzMjMwX2kyY19pZFtdID0geworCXsibWMzMjMwIiwgMH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbWMzMjMwX2kyY19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtYzMyMzBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1jMzIzMCIsCisJCS5wbSA9ICZtYzMyMzBfcG1fb3BzLAorCX0sCisJLnByb2JlCQk9IG1jMzIzMF9wcm9iZSwKKwkucmVtb3ZlCQk9IG1jMzIzMF9yZW1vdmUsCisJLmlkX3RhYmxlCT0gbWMzMjMwX2kyY19pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKG1jMzIzMF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJtQ3ViZSBNQzMyMzAgMy1BeGlzIEFjY2VsZXJvbWV0ZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9tbWE3NjYwLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9tbWE3NjYwLmMKaW5kZXggMGFjZGVlNS4uMDNiZWFkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWNjZWwvbW1hNzY2MC5jCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL21tYTc2NjAuYwpAQCAtMjUxLDYgKzI1MSw3IEBACiAJeyJtbWE3NjYwIiwgMH0sCiAJe30KIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbW1hNzY2MF9pMmNfaWQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIG1tYTc2NjBfYWNwaV9pZFtdID0gewogCXsiTU1BNzY2MCIsIDB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvbXhjNjI1NS5jIGIvZHJpdmVycy9paW8vYWNjZWwvbXhjNjI1NS5jCmluZGV4IDk3Y2NkZTcuLjBhYmFkNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL214YzYyNTUuYworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9teGM2MjU1LmMKQEAgLTE1NCw3ICsxNTQsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmIChjaGlwX2lkICE9IE1YQzYyNTVfQ0hJUF9JRCkgeworCWlmICgoY2hpcF9pZCAmIDB4MWYpICE9IE1YQzYyNTVfQ0hJUF9JRCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkludmFsaWQgY2hpcCBpZCAleFxuIiwgY2hpcF9pZCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTE3MSwxMiArMTcxLDE0IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgbXhjNjI1NV9hY3BpX21hdGNoW10gPSB7CisJeyJNWEM2MjI1IiwJMH0sCiAJeyJNWEM2MjU1IiwJMH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBteGM2MjU1X2FjcGlfbWF0Y2gpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbXhjNjI1NV9pZFtdID0geworCXsibXhjNjIyNSIsCTB9LAogCXsibXhjNjI1NSIsCTB9LAogCXsgfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FjY2VsL3NzcF9hY2NlbF9zZW5zb3IuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL3NzcF9hY2NlbF9zZW5zb3IuYwppbmRleCA0YWUwNWZjLi4zMWRiMDA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hY2NlbC9zc3BfYWNjZWxfc2Vuc29yLmMKKysrIGIvZHJpdmVycy9paW8vYWNjZWwvc3NwX2FjY2VsX3NlbnNvci5jCkBAIC03NCw3ICs3NCw3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaWlvX2luZm8gc3NwX2FjY2VsX2lpb19pbmZvID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBzc3BfYWNjZWxfaWlvX2luZm8gPSB7CiAJLnJlYWRfcmF3ID0gJnNzcF9hY2NlbF9yZWFkX3JhdywKIAkud3JpdGVfcmF3ID0gJnNzcF9hY2NlbF93cml0ZV9yYXcsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL0tjb25maWcgYi9kcml2ZXJzL2lpby9hZGMvS2NvbmZpZwppbmRleCAxZGUzMWJkZC4uN2VkY2YzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL0tjb25maWcKKysrIGIvZHJpdmVycy9paW8vYWRjL0tjb25maWcKQEAgLTI2NCw2ICsyNjQsMTUgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQogCSAgY2FsbGVkIGxwYzE4eHhfYWRjLgogCitjb25maWcgTFRDMjQ4NQorCXRyaXN0YXRlICJMaW5lYXIgVGVjaG5vbG9neSBMVEMyNDg1IEFEQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDMjQ4NSBBREMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGx0YzI0ODUuCisKIGNvbmZpZyBNQVgxMDI3CiAJdHJpc3RhdGUgIk1heGltIG1heDEwMjcgQURDIGRyaXZlciIKIAlkZXBlbmRzIG9uIFNQSQpAQCAtMzE3LDYgKzMyNiwxOSBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCBtY3AzNDIyLgogCitjb25maWcgTUVESUFURUtfTVQ2NTc3X0FVWEFEQworICAgICAgICB0cmlzdGF0ZSAiTWVkaWFUZWsgQVVYQURDIGRyaXZlciIKKyAgICAgICAgZGVwZW5kcyBvbiBBUkNIX01FRElBVEVLIHx8IENPTVBJTEVfVEVTVAorICAgICAgICBkZXBlbmRzIG9uIEhBU19JT01FTQorICAgICAgICBoZWxwCisgICAgICAgICAgU2F5IHllcyBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBNZWRpYVRlayBtdDY1eHggQVVYQURDLgorCisgICAgICAgICAgVGhlIGRyaXZlciBzdXBwb3J0cyBpbW1lZGlhdGUgbW9kZSBvcGVyYXRpb24gdG8gcmVhZCBmcm9tIG9uZSBvZiBzaXh0ZWVuCisgICAgICAgICAgY2hhbm5lbHMgKGV4dGVybmFsIG9yIGludGVybmFsKS4KKworICAgICAgICAgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCisgICAgICAgICAgY2FsbGVkIG10NjU3N19hdXhhZGMuCisKIGNvbmZpZyBNRU5fWjE4OF9BREMKIAl0cmlzdGF0ZSAiTUVOIDE2ejE4OCBBREMgSVAgQ29yZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gTUNCCkBAIC0zODksNiArNDExLDcgQEAKIGNvbmZpZyBST0NLQ0hJUF9TQVJBREMKIAl0cmlzdGF0ZSAiUm9ja2NoaXAgU0FSQURDIGRyaXZlciIKIAlkZXBlbmRzIG9uIEFSQ0hfUk9DS0NISVAgfHwgKEFSTSAmJiBDT01QSUxFX1RFU1QpCisJZGVwZW5kcyBvbiBSRVNFVF9DT05UUk9MTEVSCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBTQVJBREMgZm91bmQgaW4gU29DcyBmcm9tCiAJICBSb2NrY2hpcC4KQEAgLTM5Niw2ICs0MTksMjEgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJvY2tjaGlwX3NhcmFkYy4KIAorY29uZmlnIFNUWDEwNAorCXRyaXN0YXRlICJBcGV4IEVtYmVkZGVkIFN5c3RlbXMgU1RYMTA0IGRyaXZlciIKKwlkZXBlbmRzIG9uIFg4NiAmJiBJU0FfQlVTX0FQSQorCXNlbGVjdCBHUElPTElCCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBBcGV4IEVtYmVkZGVkIFN5c3RlbXMgU1RYMTA0CisJICBpbnRlZ3JhdGVkIGFuYWxvZyBQQy8xMDQgY2FyZC4KKworCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIDE2IGNoYW5uZWxzIG9mIHNpbmdsZS1lbmRlZCAoOCBjaGFubmVscyBvZgorCSAgZGlmZmVyZW50aWFsKSBhbmFsb2cgaW5wdXRzLCAyIGNoYW5uZWxzIG9mIGFuYWxvZyBvdXRwdXQsIDQgZGlnaXRhbAorCSAgaW5wdXRzLCBhbmQgNCBkaWdpdGFsIG91dHB1dHMgcHJvdmlkZWQgYnkgdGhlIFNUWDEwNC4KKworCSAgVGhlIGJhc2UgcG9ydCBhZGRyZXNzZXMgZm9yIHRoZSBkZXZpY2VzIG1heSBiZSBjb25maWd1cmVkIHZpYSB0aGUgYmFzZQorCSAgYXJyYXkgbW9kdWxlIHBhcmFtZXRlci4KKwogY29uZmlnIFRJX0FEQzA4MUMKIAl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgQURDMDgxQy9BREMxMDFDL0FEQzEyMUMgZmFtaWx5IgogCWRlcGVuZHMgb24gSTJDCkBAIC00MTYsNiArNDU0LDE4IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQogCSAgY2FsbGVkIHRpLWFkYzA4MzIuCiAKK2NvbmZpZyBUSV9BREMxMjEzOAorCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBBREMxMjEzMC9BREMxMjEzMi9BREMxMjEzOCIKKwlkZXBlbmRzIG9uIFNQSQorCXNlbGVjdCBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSRURfQlVGRkVSCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIFRleGFzIEluc3RydW1lbnRzIEFEQzEyMTMwLAorCSAgQURDMTIxMzIgYW5kIEFEQzEyMTM4IGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHRpLWFkYzEyMTM4LgorCiBjb25maWcgVElfQURDMTI4UzA1MgogCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBBREMxMjhTMDUyL0FEQzEyMlMwMjEvQURDMTI0UzAyMSIKIAlkZXBlbmRzIG9uIFNQSQpAQCAtNDI2LDYgKzQ3NiwxOCBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCB0aS1hZGMxMjhzMDUyLgogCitjb25maWcgVElfQURDMTYxUzYyNgorCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBBREMxNjFTNjI2IDEtY2hhbm5lbCBkaWZmZXJlbnRpYWwgQURDIgorCWRlcGVuZHMgb24gU1BJCisJc2VsZWN0IElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVJFRF9CVUZGRVIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgQURDMTQxUzYyNiwKKwkgIGFuZCBBREMxNjFTNjI2IGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHRpLWFkYzE2MXM2MjYuCisKIGNvbmZpZyBUSV9BRFMxMDE1CiAJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIEFEUzEwMTUgQURDIgogCWRlcGVuZHMgb24gSTJDICYmICFTRU5TT1JTX0FEUzEwMTUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9NYWtlZmlsZSBiL2RyaXZlcnMvaWlvL2FkYy9NYWtlZmlsZQppbmRleCAwYmEwZDUwLi43YTQwYzA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9paW8vYWRjL01ha2VmaWxlCkBAIC0yNywxMCArMjcsMTIgQEAKIG9iai0kKENPTkZJR19JTkEyWFhfQURDKSArPSBpbmEyeHgtYWRjLm8KIG9iai0kKENPTkZJR19MUDg3ODhfQURDKSArPSBscDg3ODhfYWRjLm8KIG9iai0kKENPTkZJR19MUEMxOFhYX0FEQykgKz0gbHBjMTh4eF9hZGMubworb2JqLSQoQ09ORklHX0xUQzI0ODUpICs9IGx0YzI0ODUubwogb2JqLSQoQ09ORklHX01BWDEwMjcpICs9IG1heDEwMjcubwogb2JqLSQoQ09ORklHX01BWDEzNjMpICs9IG1heDEzNjMubwogb2JqLSQoQ09ORklHX01DUDMyMFgpICs9IG1jcDMyMHgubwogb2JqLSQoQ09ORklHX01DUDM0MjIpICs9IG1jcDM0MjIubworb2JqLSQoQ09ORklHX01FRElBVEVLX01UNjU3N19BVVhBREMpICs9IG10NjU3N19hdXhhZGMubwogb2JqLSQoQ09ORklHX01FTl9aMTg4X0FEQykgKz0gbWVuX3oxODhfYWRjLm8KIG9iai0kKENPTkZJR19NWFNfTFJBREMpICs9IG14cy1scmFkYy5vCiBvYmotJChDT05GSUdfTkFVNzgwMikgKz0gbmF1NzgwMi5vCkBAIC0zOCw5ICs0MCwxMiBAQAogb2JqLSQoQ09ORklHX1FDT01fU1BNSV9JQURDKSArPSBxY29tLXNwbWktaWFkYy5vCiBvYmotJChDT05GSUdfUUNPTV9TUE1JX1ZBREMpICs9IHFjb20tc3BtaS12YWRjLm8KIG9iai0kKENPTkZJR19ST0NLQ0hJUF9TQVJBREMpICs9IHJvY2tjaGlwX3NhcmFkYy5vCitvYmotJChDT05GSUdfU1RYMTA0KSArPSBzdHgxMDQubwogb2JqLSQoQ09ORklHX1RJX0FEQzA4MUMpICs9IHRpLWFkYzA4MWMubwogb2JqLSQoQ09ORklHX1RJX0FEQzA4MzIpICs9IHRpLWFkYzA4MzIubworb2JqLSQoQ09ORklHX1RJX0FEQzEyMTM4KSArPSB0aS1hZGMxMjEzOC5vCiBvYmotJChDT05GSUdfVElfQURDMTI4UzA1MikgKz0gdGktYWRjMTI4czA1Mi5vCitvYmotJChDT05GSUdfVElfQURDMTYxUzYyNikgKz0gdGktYWRjMTYxczYyNi5vCiBvYmotJChDT05GSUdfVElfQURTMTAxNSkgKz0gdGktYWRzMTAxNS5vCiBvYmotJChDT05GSUdfVElfQURTODY4OCkgKz0gdGktYWRzODY4OC5vCiBvYmotJChDT05GSUdfVElfQU0zMzVYX0FEQykgKz0gdGlfYW0zMzV4X2FkYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvYWQ3MjY2LmMgYi9kcml2ZXJzL2lpby9hZGMvYWQ3MjY2LmMKaW5kZXggYzBmNmE5OC4uYjhkNWNmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL2FkNzI2Ni5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9hZDcyNjYuYwpAQCAtNDgxLDcgKzQ4MSw3IEBACiAJaWYgKCFzdC0+Zml4ZWRfYWRkcikKIAkJZ3Bpb19mcmVlX2FycmF5KHN0LT5ncGlvcywgQVJSQVlfU0laRShzdC0+Z3Bpb3MpKTsKIGVycm9yX2Rpc2FibGVfcmVnOgotCWlmICghSVNfRVJSX09SX05VTEwoc3QtPnJlZykpCisJaWYgKCFJU19FUlIoc3QtPnJlZykpCiAJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOwogCiAJcmV0dXJuIHJldDsKQEAgLTQ5Niw3ICs0OTYsNyBAQAogCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKIAlpZiAoIXN0LT5maXhlZF9hZGRyKQogCQlncGlvX2ZyZWVfYXJyYXkoc3QtPmdwaW9zLCBBUlJBWV9TSVpFKHN0LT5ncGlvcykpOwotCWlmICghSVNfRVJSX09SX05VTEwoc3QtPnJlZykpCisJaWYgKCFJU19FUlIoc3QtPnJlZykpCiAJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvYWQ3Mjk4LmMgYi9kcml2ZXJzL2lpby9hZGMvYWQ3Mjk4LmMKaW5kZXggMTBlYzhmYy4uZTM5OWJmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL2FkNzI5OC5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9hZDcyOTguYwpAQCAtMjM5LDE2ICsyMzksMTYgQEAKIAogCXN3aXRjaCAobSkgewogCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6Ci0JCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwotCQlpZiAoaW5kaW9fZGV2LT5jdXJyZW50bW9kZSA9PSBJTkRJT19CVUZGRVJfVFJJR0dFUkVEKSB7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY2hhbi0+YWRkcmVzcyA9PSBBRDcyOThfQ0hfVEVNUCkKLQkJCQlyZXQgPSBhZDcyOThfc2Nhbl90ZW1wKHN0LCB2YWwpOwotCQkJZWxzZQotCQkJCXJldCA9IGFkNzI5OF9zY2FuX2RpcmVjdChzdCwgY2hhbi0+YWRkcmVzcyk7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJcmV0ID0gaWlvX2RldmljZV9jbGFpbV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAoY2hhbi0+YWRkcmVzcyA9PSBBRDcyOThfQ0hfVEVNUCkKKwkJCXJldCA9IGFkNzI5OF9zY2FuX3RlbXAoc3QsIHZhbCk7CisJCWVsc2UKKwkJCXJldCA9IGFkNzI5OF9zY2FuX2RpcmVjdChzdCwgY2hhbi0+YWRkcmVzcyk7CisKKwkJaWlvX2RldmljZV9yZWxlYXNlX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CiAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL2FkNzc5My5jIGIvZHJpdmVycy9paW8vYWRjL2FkNzc5My5jCmluZGV4IDg0Nzc4OWIuLmU2NzA2YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy9hZDc3OTMuYworKysgYi9kcml2ZXJzL2lpby9hZGMvYWQ3NzkzLmMKQEAgLTUxOSwxMSArNTE5LDkgQEAKIAlpbnQgcmV0LCBpOwogCXVuc2lnbmVkIGludCB0bXA7CiAKLQltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKLQlpZiAoaWlvX2J1ZmZlcl9lbmFibGVkKGluZGlvX2RldikpIHsKLQkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9CisJcmV0ID0gaWlvX2RldmljZV9jbGFpbV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlzd2l0Y2ggKG1hc2spIHsKIAljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CkBAIC01NDgsNyArNTQ2LDcgQEAKIAkJcmV0ID0gLUVJTlZBTDsKIAl9CiAKLQltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9hZDc5OXguYyBiL2RyaXZlcnMvaWlvL2FkYy9hZDc5OXguYwppbmRleCBiNjE2Mzc2Li45NzA0MDkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvYWQ3OTl4LmMKKysrIGIvZHJpdmVycy9paW8vYWRjL2FkNzk5eC5jCkBAIC01MjcsNiArNTI3LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gYWQ3OTkxX2luZm8gPSB7CiAJLnJlYWRfcmF3ID0gJmFkNzk5eF9yZWFkX3JhdywKIAkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCS51cGRhdGVfc2Nhbl9tb2RlID0gYWQ3OTl4X3VwZGF0ZV9zY2FuX21vZGUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNzk5M180XzdfOF9ub2lycV9pbmZvID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL2F0OTFfYWRjLmMgYi9kcml2ZXJzL2lpby9hZGMvYXQ5MV9hZGMuYwppbmRleCA1MjQzMGJhLi5iYmRhYzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvYXQ5MV9hZGMuYworKysgYi9kcml2ZXJzL2lpby9hZGMvYXQ5MV9hZGMuYwpAQCAtMTEzLDYgKzExMyw3IEBACiAjZGVmaW5lCQlBVDkxX0FEQ19UU01SX1RTQVYJKDMgPDwgNCkJLyogQXZlcmFnZXMgc2FtcGxlcyAqLwogI2RlZmluZQkJCUFUOTFfQURDX1RTTVJfVFNBVl8oeCkJCSgoeCkgPDwgNCkKICNkZWZpbmUJCUFUOTFfQURDX1RTTVJfU0NUSU0JKDB4MGYgPDwgMTYpCS8qIFN3aXRjaCBjbG9zdXJlIHRpbWUgKi8KKyNkZWZpbmUJCQlBVDkxX0FEQ19UU01SX1NDVElNXyh4KQkJKCh4KSA8PCAxNikKICNkZWZpbmUJCUFUOTFfQURDX1RTTVJfUEVOREJDCSgweDBmIDw8IDI4KQkvKiBQZW4gRGVib3VuY2UgdGltZSAqLwogI2RlZmluZQkJCUFUOTFfQURDX1RTTVJfUEVOREJDXyh4KQkoKHgpIDw8IDI4KQogI2RlZmluZQkJQVQ5MV9BRENfVFNNUl9OT1RTRE1BCSgxIDw8IDIyKQkvKiBObyBUb3VjaHNjcmVlbiBETUEgKi8KQEAgLTE1MCw2ICsxNTEsNyBAQAogI2RlZmluZSBNQVhfUkxQT1NfQklUUyAgICAgICAgIDEwCiAjZGVmaW5lIFRPVUNIX1NBTVBMRV9QRVJJT0RfVVNfUkwgICAgICAxMDAwMCAgIC8qIDEwbXMsIHRoZSBTb0MgY2FuJ3Qga2VlcCB1cCB3aXRoIDJtcyAqLwogI2RlZmluZSBUT1VDSF9TSFRJTSAgICAgICAgICAgICAgICAgICAgMHhhCisjZGVmaW5lIFRPVUNIX1NDVElNX1VTCQkxMAkJLyogMTB1cyBmb3IgdGhlIFRvdWNoc2NyZWVuIFN3aXRjaGVzIENsb3N1cmUgVGltZSAqLwogCiAvKioKICAqIHN0cnVjdCBhdDkxX2FkY19yZWdfZGVzYyAtIFZhcmlvdXMgaW5mb3JtYXRpb25zIHJlbGF0aXZlIHRvIHJlZ2lzdGVycwpAQCAtMzgxLDggKzM4Myw4IEBACiAJCXN0LT50c19idWZmZXJlZG1lYXN1cmUgPSBmYWxzZTsKIAkJaW5wdXRfcmVwb3J0X2tleShzdC0+dHNfaW5wdXQsIEJUTl9UT1VDSCwgMCk7CiAJCWlucHV0X3N5bmMoc3QtPnRzX2lucHV0KTsKLQl9IGVsc2UgaWYgKHN0YXR1cyAmIEFUOTFfQURDX0VPQygzKSkgewotCQkvKiBDb252ZXJzaW9uIGZpbmlzaGVkICovCisJfSBlbHNlIGlmIChzdGF0dXMgJiBBVDkxX0FEQ19FT0MoMykgJiYgc3QtPnRzX2lucHV0KSB7CisJCS8qIENvbnZlcnNpb24gZmluaXNoZWQgYW5kIHdlJ3ZlIGEgdG91Y2hzY3JlZW4gKi8KIAkJaWYgKHN0LT50c19idWZmZXJlZG1lYXN1cmUpIHsKIAkJCS8qCiAJCQkgKiBMYXN0IG1lYXN1cmVtZW50IGlzIGFsd2F5cyBkaXNjYXJkZWQsIHNpbmNlIGl0IGNhbgpAQCAtMTAwMSw3ICsxMDAzLDkgQEAKIAogc3RhdGljIGludCBhdDkxX3RzX2h3X2luaXQoc3RydWN0IGF0OTFfYWRjX3N0YXRlICpzdCwgdTMyIGFkY19jbGtfa2h6KQogeworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gaWlvX3ByaXZfdG9fZGV2KHN0KTsKIAl1MzIgcmVnID0gMDsKKwl1MzIgdHNzY3RpbSA9IDA7CiAJaW50IGkgPSAwOwogCiAJLyogYSBQZW4gRGV0ZWN0IERlYm91bmNlIFRpbWUgaXMgbmVjZXNzYXJ5IGZvciB0aGUgQURDIFRvdWNoIHRvIGF2b2lkCkBAIC0xMDM0LDExICsxMDM4LDIwIEBACiAJCXJldHVybiAwOwogCX0KIAorCS8qIFRvdWNoc2NyZWVuIFN3aXRjaGVzIENsb3N1cmUgdGltZSBuZWVkZWQgZm9yIGFsbG93aW5nIHRoZSB2YWx1ZSB0bworCSAqIHN0YWJpbGl6ZS4KKwkgKiBTd2l0Y2ggQ2xvc3VyZSBUaW1lID0gKFRTU0NUSU0gKiA0KSBBRENDbG9jayBwZXJpb2RzCisJICovCisJdHNzY3RpbSA9IERJVl9ST1VORF9VUChUT1VDSF9TQ1RJTV9VUyAqIGFkY19jbGtfa2h6IC8gMTAwMCwgNCk7CisJZGV2X2RiZygmaWRldi0+ZGV2LCAiYWRjX2NsayBhdDogJWQgS0h6LCB0c3NjdGltIGF0OiAlZFxuIiwKKwkJYWRjX2Nsa19raHosIHRzc2N0aW0pOworCiAJaWYgKHN0LT50b3VjaHNjcmVlbl90eXBlID09IEFUTUVMX0FEQ19UT1VDSFNDUkVFTl80V0lSRSkKIAkJcmVnID0gQVQ5MV9BRENfVFNNUl9UU01PREVfNFdJUkVfUFJFU1M7CiAJZWxzZQogCQlyZWcgPSBBVDkxX0FEQ19UU01SX1RTTU9ERV81V0lSRTsKIAorCXJlZyB8PSBBVDkxX0FEQ19UU01SX1NDVElNXyh0c3NjdGltKSAmIEFUOTFfQURDX1RTTVJfU0NUSU07CiAJcmVnIHw9IEFUOTFfQURDX1RTTVJfVFNBVl8oc3QtPmNhcHMtPnRzX2ZpbHRlcl9hdmVyYWdlKQogCSAgICAgICAmIEFUOTFfQURDX1RTTVJfVFNBVjsKIAlyZWcgfD0gQVQ5MV9BRENfVFNNUl9QRU5EQkNfKHN0LT50c19wZW5kYmMpICYgQVQ5MV9BRENfVFNNUl9QRU5EQkM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvaW5hMnh4LWFkYy5jIGIvZHJpdmVycy9paW8vYWRjL2luYTJ4eC1hZGMuYwppbmRleCA5NTVmM2ZkLi41OWI3ZDc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvaW5hMnh4LWFkYy5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9pbmEyeHgtYWRjLmMKQEAgLTExNCw3ICsxMTQsNiBAQAogCXN0cnVjdCBtdXRleCBzdGF0ZV9sb2NrOwogCXVuc2lnbmVkIGludCBzaHVudF9yZXNpc3RvcjsKIAlpbnQgYXZnOwotCXM2NCBwcmV2X25zOyAvKiB0cmFjayBidWZmZXIgY2FwdHVyZSB0aW1lLCBjaGVjayBmb3IgdW5kZXJydW5zICovCiAJaW50IGludF90aW1lX3ZidXM7IC8qIEJ1cyB2b2x0YWdlIGludGVncmF0aW9uIHRpbWUgdVMgKi8KIAlpbnQgaW50X3RpbWVfdnNodW50OyAvKiBTaHVudCB2b2x0YWdlIGludGVncmF0aW9uIHRpbWUgdVMgKi8KIAlib29sIGFsbG93X2FzeW5jX3JlYWRvdXQ7CkBAIC01MDksOCArNTA4LDYgQEAKIAlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2RldiwKIAkJCQkJICAgKHVuc2lnbmVkIGludCAqKWRhdGEsIHRpbWVfYSk7CiAKLQljaGlwLT5wcmV2X25zID0gdGltZV9hOwotCiAJcmV0dXJuICh1bnNpZ25lZCBsb25nKSh0aW1lX2IgLSB0aW1lX2EpIC8gMTAwMDsKIH07CiAKQEAgLTU1NCw4ICs1NTEsNiBAQAogCWRldl9kYmcoJmluZGlvX2Rldi0+ZGV2LCAiQXN5bmMgcmVhZG91dCBtb2RlOiAlZFxuIiwKIAkJY2hpcC0+YWxsb3dfYXN5bmNfcmVhZG91dCk7CiAKLQljaGlwLT5wcmV2X25zID0gaWlvX2dldF90aW1lX25zKGluZGlvX2Rldik7Ci0KIAljaGlwLT50YXNrID0ga3RocmVhZF9ydW4oaW5hMnh4X2NhcHR1cmVfdGhyZWFkLCAodm9pZCAqKWluZGlvX2RldiwKIAkJCQkgIiVzOiVkLSV1dXMiLCBpbmRpb19kZXYtPm5hbWUsIGluZGlvX2Rldi0+aWQsCiAJCQkJIHNhbXBsaW5nX3VzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9sdGMyNDg1LmMgYi9kcml2ZXJzL2lpby9hZGMvbHRjMjQ4NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjkxZjEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWRjL2x0YzI0ODUuYwpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIGx0YzI0ODUuYyAtIERyaXZlciBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDMjQ4NSBBREMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQWxpc29uIFNjaG9maWVsZCA8YW1zZmllbGQyMkBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBEYXRhc2hlZXQ6IGh0dHA6Ly9jZHMubGluZWFyLmNvbS9kb2NzL2VuL2RhdGFzaGVldC8yNDg1ZmQucGRmCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CisKKy8qIFBvd2VyLW9uIGNvbmZpZ3VyYXRpb246IHJlamVjdHMgYm90aCA1MC82MEh6LCBvcGVyYXRlcyBhdCAxeCBzcGVlZCAqLworI2RlZmluZSBMVEMyNDg1X0NPTkZJR19ERUZBVUxUCQkwCisKK3N0cnVjdCBsdGMyNDg1X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CisJa3RpbWVfdAkJCXRpbWVfcHJldjsJLyogbGFzdCBjb252ZXJzaW9uICovCit9OworCitzdGF0aWMgdm9pZCBsdGMyNDg1X3dhaXRfY29udihzdHJ1Y3QgbHRjMjQ4NV9kYXRhICpkYXRhKQoreworCWNvbnN0IHVuc2lnbmVkIGludCBjb252X3RpbWUgPSAxNDc7CS8qIGNvbnZlcnNpb24gdGltZSBtcyAqLworCXVuc2lnbmVkIGludCB0aW1lX2VsYXBzZWQ7CisKKwkvKiBkZWxheSBpZiBjb252ZXJzaW9uIHRpbWUgbm90IHBhc3NlZCBzaW5jZSBsYXN0IHJlYWQgb3Igd3JpdGUgKi8KKwl0aW1lX2VsYXBzZWQgPSBrdGltZV9tc19kZWx0YShrdGltZV9nZXQoKSwgZGF0YS0+dGltZV9wcmV2KTsKKworCWlmICh0aW1lX2VsYXBzZWQgPCBjb252X3RpbWUpCisJCW1zbGVlcChjb252X3RpbWUgLSB0aW1lX2VsYXBzZWQpOworfQorCitzdGF0aWMgaW50IGx0YzI0ODVfcmVhZChzdHJ1Y3QgbHRjMjQ4NV9kYXRhICpkYXRhLCBpbnQgKnZhbCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCV9fYmUzMiBidWYgPSAwOworCWludCByZXQ7CisKKwlsdGMyNDg1X3dhaXRfY29udihkYXRhKTsKKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIChjaGFyICopJmJ1ZiwgNCk7CisJaWYgKHJldCA8IDApICB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaTJjX21hc3Rlcl9yZWN2IGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCWRhdGEtPnRpbWVfcHJldiA9IGt0aW1lX2dldCgpOworCSp2YWwgPSBzaWduX2V4dGVuZDMyKGJlMzJfdG9fY3B1KGJ1ZikgPj4gNiwgMjQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsdGMyNDg1X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBsdGMyNDg1X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisKKwlpZiAobWFzayA9PSBJSU9fQ0hBTl9JTkZPX1JBVykgeworCQlyZXQgPSBsdGMyNDg1X3JlYWQoZGF0YSwgdmFsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldHVybiBJSU9fVkFMX0lOVDsKKworCX0gZWxzZSBpZiAobWFzayA9PSBJSU9fQ0hBTl9JTkZPX1NDQUxFKSB7CisJCSp2YWwgPSA1MDAwOwkJCS8qIG9uIGJvYXJkIHZyZWYgbWlsbGl2b2x0cyAqLworCQkqdmFsMiA9IDI1OwkJCS8qIDI1ICgyNCArIHNpZ24pIGRhdGEgYml0cyAqLworCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMX0xPRzI7CisKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBsdGMyNDg1X2NoYW5uZWxbXSA9IHsKKwl7CisJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAorCQkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fU0NBTEUpCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gbHRjMjQ4NV9pbmZvID0geworCS5yZWFkX3JhdyA9IGx0YzI0ODVfcmVhZF9yYXcsCisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgbHRjMjQ4NV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCBsdGMyNDg1X2RhdGEgKmRhdGE7CisJaW50IHJldDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMgfAorCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqZGF0YSkpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGluZGlvX2Rldik7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWluZGlvX2Rldi0+bmFtZSA9IGlkLT5uYW1lOworCWluZGlvX2Rldi0+aW5mbyA9ICZsdGMyNDg1X2luZm87CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBsdGMyNDg1X2NoYW5uZWw7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGx0YzI0ODVfY2hhbm5lbCk7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShkYXRhLT5jbGllbnQsIExUQzI0ODVfQ09ORklHX0RFRkFVTFQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZGF0YS0+dGltZV9wcmV2ID0ga3RpbWVfZ2V0KCk7CisKKwlyZXR1cm4gZGV2bV9paW9fZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgaW5kaW9fZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGx0YzI0ODVfaWRbXSA9IHsKKwl7ICJsdGMyNDg1IiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsdGMyNDg1X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGx0YzI0ODVfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImx0YzI0ODUiLAorCX0sCisJLnByb2JlID0gbHRjMjQ4NV9wcm9iZSwKKwkuaWRfdGFibGUgPSBsdGMyNDg1X2lkLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKGx0YzI0ODVfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiQWxpc29uIFNjaG9maWVsZCA8YW1zZmllbGQyMkBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxpbmVhciBUZWNobm9sb2d5IExUQzI0ODUgQURDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL21lbl96MTg4X2FkYy5jIGIvZHJpdmVycy9paW8vYWRjL21lbl96MTg4X2FkYy5jCmluZGV4IGQwOTVlZmUuLjhmMzYwNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy9tZW5fejE4OF9hZGMuYworKysgYi9kcml2ZXJzL2lpby9hZGMvbWVuX3oxODhfYWRjLmMKQEAgLTc4LDcgKzc4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGlpb19pbmZvIHoxODhfYWRjX2luZm8gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIHoxODhfYWRjX2luZm8gPSB7CiAJLnJlYWRfcmF3ID0gJnoxODhfaWlvX3JlYWRfcmF3LAogCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL210NjU3N19hdXhhZGMuYyBiL2RyaXZlcnMvaWlvL2FkYy9tdDY1NzdfYXV4YWRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxMDRjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9tdDY1NzdfYXV4YWRjLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTWVkaWFUZWsgSW5jLgorICogQXV0aG9yOiBaaGl5b25nIFRhbyA8emhpeW9uZy50YW9AbWVkaWF0ZWsuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBNVDY1NzdfQVVYQURDX0NPTjAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19DT04xICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIE1UNjU3N19BVVhBRENfQ09OMiAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBNVDY1NzdfQVVYQURDX1NUQSAgICAgICAgICAgICAgICAgICAgIEJJVCgwKQorCisjZGVmaW5lIE1UNjU3N19BVVhBRENfREFUMCAgICAgICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBNVDY1NzdfQVVYQURDX1JEWTAgICAgICAgICAgICAgICAgICAgIEJJVCgxMikKKworI2RlZmluZSBNVDY1NzdfQVVYQURDX01JU0MgICAgICAgICAgICAgICAgICAgIDB4OTQKKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19QRE5fRU4gICAgICAgICAgICAgICAgICBCSVQoMTQpCisKKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19EQVRfTUFTSyAgICAgICAgICAgICAgICAweGZmZgorI2RlZmluZSBNVDY1NzdfQVVYQURDX1NMRUVQX1VTICAgICAgICAgICAgICAgIDEwMDAKKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19USU1FT1VUX1VTICAgICAgICAgICAgICAxMDAwMAorI2RlZmluZSBNVDY1NzdfQVVYQURDX1BPV0VSX1JFQURZX01TICAgICAgICAgIDEKKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19TQU1QTEVfUkVBRFlfVVMgICAgICAgICAyNQorCitzdHJ1Y3QgbXQ2NTc3X2F1eGFkY19kZXZpY2UgeworCXZvaWQgX19pb21lbSAqcmVnX2Jhc2U7CisJc3RydWN0IGNsayAqYWRjX2NsazsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKK307CisKKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKGlkeCkgewkJCQkgICAgXAorCQkudHlwZSA9IElJT19WT0xUQUdFLAkJCQkgICAgXAorCQkuaW5kZXhlZCA9IDEsCQkJCQkgICAgXAorCQkuY2hhbm5lbCA9IChpZHgpLAkJCQkgICAgXAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUFJPQ0VTU0VEKSwgXAorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgbXQ2NTc3X2F1eGFkY19paW9fY2hhbm5lbHNbXSA9IHsKKwlNVDY1NzdfQVVYQURDX0NIQU5ORUwoMCksCisJTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKDEpLAorCU1UNjU3N19BVVhBRENfQ0hBTk5FTCgyKSwKKwlNVDY1NzdfQVVYQURDX0NIQU5ORUwoMyksCisJTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKDQpLAorCU1UNjU3N19BVVhBRENfQ0hBTk5FTCg1KSwKKwlNVDY1NzdfQVVYQURDX0NIQU5ORUwoNiksCisJTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKDcpLAorCU1UNjU3N19BVVhBRENfQ0hBTk5FTCg4KSwKKwlNVDY1NzdfQVVYQURDX0NIQU5ORUwoOSksCisJTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKDEwKSwKKwlNVDY1NzdfQVVYQURDX0NIQU5ORUwoMTEpLAorCU1UNjU3N19BVVhBRENfQ0hBTk5FTCgxMiksCisJTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKDEzKSwKKwlNVDY1NzdfQVVYQURDX0NIQU5ORUwoMTQpLAorCU1UNjU3N19BVVhBRENfQ0hBTk5FTCgxNSksCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgbXQ2NTc3X2F1eGFkY19tb2RfcmVnKHZvaWQgX19pb21lbSAqcmVnLAorCQkJCQkgdTMyIG9yX21hc2ssIHUzMiBhbmRfbWFzaykKK3sKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGwocmVnKTsKKwl2YWwgfD0gb3JfbWFzazsKKwl2YWwgJj0gfmFuZF9tYXNrOworCXdyaXRlbCh2YWwsIHJlZyk7Cit9CisKK3N0YXRpYyBpbnQgbXQ2NTc3X2F1eGFkY19yZWFkKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbikKK3sKKwl1MzIgdmFsOworCXZvaWQgX19pb21lbSAqcmVnX2NoYW5uZWw7CisJaW50IHJldDsKKwlzdHJ1Y3QgbXQ2NTc3X2F1eGFkY19kZXZpY2UgKmFkY19kZXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJcmVnX2NoYW5uZWwgPSBhZGNfZGV2LT5yZWdfYmFzZSArIE1UNjU3N19BVVhBRENfREFUMCArCisJCSAgICAgIGNoYW4tPmNoYW5uZWwgKiAweDA0OworCisJbXV0ZXhfbG9jaygmYWRjX2Rldi0+bG9jayk7CisKKwltdDY1NzdfYXV4YWRjX21vZF9yZWcoYWRjX2Rldi0+cmVnX2Jhc2UgKyBNVDY1NzdfQVVYQURDX0NPTjEsCisJCQkgICAgICAwLCAxIDw8IGNoYW4tPmNoYW5uZWwpOworCisJLyogcmVhZCBjaGFubmVsIGFuZCBtYWtlIHN1cmUgb2xkIHJlYWR5IGJpdCA9PSAwICovCisJcmV0ID0gcmVhZGxfcG9sbF90aW1lb3V0KHJlZ19jaGFubmVsLCB2YWwsCisJCQkJICgodmFsICYgTVQ2NTc3X0FVWEFEQ19SRFkwKSA9PSAwKSwKKwkJCQkgTVQ2NTc3X0FVWEFEQ19TTEVFUF9VUywKKwkJCQkgTVQ2NTc3X0FVWEFEQ19USU1FT1VUX1VTKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGluZGlvX2Rldi0+ZGV2LnBhcmVudCwKKwkJCSJ3YWl0IGZvciBjaGFubmVsWyVkXSByZWFkeSBiaXQgY2xlYXIgdGltZSBvdXRcbiIsCisJCQljaGFuLT5jaGFubmVsKTsKKwkJZ290byBlcnJfdGltZW91dDsKKwl9CisKKwkvKiBzZXQgYml0IHRvIHRyaWdnZXIgc2FtcGxlICovCisJbXQ2NTc3X2F1eGFkY19tb2RfcmVnKGFkY19kZXYtPnJlZ19iYXNlICsgTVQ2NTc3X0FVWEFEQ19DT04xLAorCQkJICAgICAgMSA8PCBjaGFuLT5jaGFubmVsLCAwKTsKKworCS8qIHdlIG11c3QgZGVsYXkgaGVyZSBmb3IgaGFyZHdhcmUgc2FtcGxlIGNoYW5uZWwgZGF0YSAqLworCXVkZWxheShNVDY1NzdfQVVYQURDX1NBTVBMRV9SRUFEWV9VUyk7CisKKwkvKiBjaGVjayBNVEtfQVVYQURDX0NPTjIgaWYgYXV4YWRjIGlzIGlkbGUgKi8KKwlyZXQgPSByZWFkbF9wb2xsX3RpbWVvdXQoYWRjX2Rldi0+cmVnX2Jhc2UgKyBNVDY1NzdfQVVYQURDX0NPTjIsIHZhbCwKKwkJCQkgKCh2YWwgJiBNVDY1NzdfQVVYQURDX1NUQSkgPT0gMCksCisJCQkJIE1UNjU3N19BVVhBRENfU0xFRVBfVVMsCisJCQkJIE1UNjU3N19BVVhBRENfVElNRU9VVF9VUyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihpbmRpb19kZXYtPmRldi5wYXJlbnQsCisJCQkid2FpdCBmb3IgYXV4YWRjIGlkbGUgdGltZSBvdXRcbiIpOworCQlnb3RvIGVycl90aW1lb3V0OworCX0KKworCS8qIHJlYWQgY2hhbm5lbCBhbmQgbWFrZSBzdXJlIHJlYWR5IGJpdCA9PSAxICovCisJcmV0ID0gcmVhZGxfcG9sbF90aW1lb3V0KHJlZ19jaGFubmVsLCB2YWwsCisJCQkJICgodmFsICYgTVQ2NTc3X0FVWEFEQ19SRFkwKSAhPSAwKSwKKwkJCQkgTVQ2NTc3X0FVWEFEQ19TTEVFUF9VUywKKwkJCQkgTVQ2NTc3X0FVWEFEQ19USU1FT1VUX1VTKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGluZGlvX2Rldi0+ZGV2LnBhcmVudCwKKwkJCSJ3YWl0IGZvciBjaGFubmVsWyVkXSBkYXRhIHJlYWR5IHRpbWUgb3V0XG4iLAorCQkJY2hhbi0+Y2hhbm5lbCk7CisJCWdvdG8gZXJyX3RpbWVvdXQ7CisJfQorCisJLyogcmVhZCBkYXRhICovCisJdmFsID0gcmVhZGwocmVnX2NoYW5uZWwpICYgTVQ2NTc3X0FVWEFEQ19EQVRfTUFTSzsKKworCW11dGV4X3VubG9jaygmYWRjX2Rldi0+bG9jayk7CisKKwlyZXR1cm4gdmFsOworCitlcnJfdGltZW91dDoKKworCW11dGV4X3VubG9jaygmYWRjX2Rldi0+bG9jayk7CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RhdGljIGludCBtdDY1NzdfYXV4YWRjX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCQkgIGludCAqdmFsLAorCQkJCSAgaW50ICp2YWwyLAorCQkJCSAgbG9uZyBpbmZvKQoreworCXN3aXRjaCAoaW5mbykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19QUk9DRVNTRUQ6CisJCSp2YWwgPSBtdDY1NzdfYXV4YWRjX3JlYWQoaW5kaW9fZGV2LCBjaGFuKTsKKwkJaWYgKCp2YWwgPCAwKSB7CisJCQlkZXZfZXJyKGluZGlvX2Rldi0+ZGV2LnBhcmVudCwKKwkJCQkiZmFpbGVkIHRvIHNhbXBsZSBkYXRhIG9uIGNoYW5uZWxbJWRdXG4iLAorCQkJCWNoYW4tPmNoYW5uZWwpOworCQkJcmV0dXJuICp2YWw7CisJCX0KKwkJcmV0dXJuIElJT19WQUxfSU5UOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIG10NjU3N19hdXhhZGNfaW5mbyA9IHsKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5yZWFkX3JhdyA9ICZtdDY1NzdfYXV4YWRjX3JlYWRfcmF3LAorfTsKKworc3RhdGljIGludCBtdDY1NzdfYXV4YWRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG10NjU3N19hdXhhZGNfZGV2aWNlICphZGNfZGV2OworCXVuc2lnbmVkIGxvbmcgYWRjX2Nsa19yYXRlOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJaW50IHJldDsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmFkY19kZXYpKTsKKwlpZiAoIWluZGlvX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhZGNfZGV2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCWluZGlvX2Rldi0+bmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOworCWluZGlvX2Rldi0+aW5mbyA9ICZtdDY1NzdfYXV4YWRjX2luZm87CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBtdDY1NzdfYXV4YWRjX2lpb19jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUobXQ2NTc3X2F1eGFkY19paW9fY2hhbm5lbHMpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlhZGNfZGV2LT5yZWdfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoYWRjX2Rldi0+cmVnX2Jhc2UpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgYXV4YWRjIGJhc2UgYWRkcmVzc1xuIik7CisJCXJldHVybiBQVFJfRVJSKGFkY19kZXYtPnJlZ19iYXNlKTsKKwl9CisKKwlhZGNfZGV2LT5hZGNfY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJtYWluIik7CisJaWYgKElTX0VSUihhZGNfZGV2LT5hZGNfY2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGF1eGFkYyBjbG9ja1xuIik7CisJCXJldHVybiBQVFJfRVJSKGFkY19kZXYtPmFkY19jbGspOworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShhZGNfZGV2LT5hZGNfY2xrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBlbmFibGUgYXV4YWRjIGNsb2NrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhZGNfY2xrX3JhdGUgPSBjbGtfZ2V0X3JhdGUoYWRjX2Rldi0+YWRjX2Nsayk7CisJaWYgKCFhZGNfY2xrX3JhdGUpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibnVsbCBjbG9jayByYXRlXG4iKTsKKwkJZ290byBlcnJfZGlzYWJsZV9jbGs7CisJfQorCisJbXV0ZXhfaW5pdCgmYWRjX2Rldi0+bG9jayk7CisKKwltdDY1NzdfYXV4YWRjX21vZF9yZWcoYWRjX2Rldi0+cmVnX2Jhc2UgKyBNVDY1NzdfQVVYQURDX01JU0MsCisJCQkgICAgICBNVDY1NzdfQVVYQURDX1BETl9FTiwgMCk7CisJbWRlbGF5KE1UNjU3N19BVVhBRENfUE9XRVJfUkVBRFlfTVMpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5kaW9fZGV2KTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgaWlvIGRldmljZVxuIik7CisJCWdvdG8gZXJyX3Bvd2VyX29mZjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3Bvd2VyX29mZjoKKwltdDY1NzdfYXV4YWRjX21vZF9yZWcoYWRjX2Rldi0+cmVnX2Jhc2UgKyBNVDY1NzdfQVVYQURDX01JU0MsCisJCQkgICAgICAwLCBNVDY1NzdfQVVYQURDX1BETl9FTik7CitlcnJfZGlzYWJsZV9jbGs6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFkY19kZXYtPmFkY19jbGspOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXQ2NTc3X2F1eGFkY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG10NjU3N19hdXhhZGNfZGV2aWNlICphZGNfZGV2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCisJbXQ2NTc3X2F1eGFkY19tb2RfcmVnKGFkY19kZXYtPnJlZ19iYXNlICsgTVQ2NTc3X0FVWEFEQ19NSVNDLAorCQkJICAgICAgMCwgTVQ2NTc3X0FVWEFEQ19QRE5fRU4pOworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFkY19kZXYtPmFkY19jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG10NjU3N19hdXhhZGNfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10MjcwMS1hdXhhZGMiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ4MTczLWF1eGFkYyIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXQ2NTc3X2F1eGFkY19vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG10NjU3N19hdXhhZGNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lICAgPSAibXQ2NTc3LWF1eGFkYyIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG10NjU3N19hdXhhZGNfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUJPSBtdDY1NzdfYXV4YWRjX3Byb2JlLAorCS5yZW1vdmUJPSBtdDY1NzdfYXV4YWRjX3JlbW92ZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG10NjU3N19hdXhhZGNfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiWmhpeW9uZyBUYW8gPHpoaXlvbmcudGFvQG1lZGlhdGVrLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTVRLIEFVWEFEQyBEZXZpY2UgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvbmF1NzgwMi5jIGIvZHJpdmVycy9paW8vYWRjL25hdTc4MDIuYwppbmRleCBkYjliODI5Li4wOGY0NDY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvbmF1NzgwMi5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9uYXU3ODAyLmMKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCWlmIChzdC0+Y29udmVyc2lvbl9jb3VudCA8IE5BVTc4MDJfTUlOX0NPTlZFUlNJT05TKQogCQlzdC0+Y29udmVyc2lvbl9jb3VudCsrOwogCWlmIChzdC0+Y29udmVyc2lvbl9jb3VudCA+PSBOQVU3ODAyX01JTl9DT05WRVJTSU9OUykKLQkJY29tcGxldGVfYWxsKCZzdC0+dmFsdWVfb2spOworCQljb21wbGV0ZSgmc3QtPnZhbHVlX29rKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9yb2NrY2hpcF9zYXJhZGMuYyBiL2RyaXZlcnMvaWlvL2FkYy9yb2NrY2hpcF9zYXJhZGMuYwppbmRleCBmOWFkNmMyLi44NWQ3MDEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvcm9ja2NoaXBfc2FyYWRjLmMKKysrIGIvZHJpdmVycy9paW8vYWRjL3JvY2tjaGlwX3NhcmFkYy5jCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CiAKQEAgLTUzLDYgKzU1LDcgQEAKIAlzdHJ1Y3QgY2xrCQkqY2xrOwogCXN0cnVjdCBjb21wbGV0aW9uCWNvbXBsZXRpb247CiAJc3RydWN0IHJlZ3VsYXRvcgkqdnJlZjsKKwlzdHJ1Y3QgcmVzZXRfY29udHJvbAkqcmVzZXQ7CiAJY29uc3Qgc3RydWN0IHJvY2tjaGlwX3NhcmFkY19kYXRhICpkYXRhOwogCXUxNgkJCWxhc3RfdmFsOwogfTsKQEAgLTE5MCw2ICsxOTMsMTYgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByb2NrY2hpcF9zYXJhZGNfbWF0Y2gpOwogCisvKioKKyAqIFJlc2V0IFNBUkFEQyBDb250cm9sbGVyLgorICovCitzdGF0aWMgdm9pZCByb2NrY2hpcF9zYXJhZGNfcmVzZXRfY29udHJvbGxlcihzdHJ1Y3QgcmVzZXRfY29udHJvbCAqcmVzZXQpCit7CisJcmVzZXRfY29udHJvbF9hc3NlcnQocmVzZXQpOworCXVzbGVlcF9yYW5nZSgxMCwgMjApOworCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQocmVzZXQpOworfQorCiBzdGF0aWMgaW50IHJvY2tjaGlwX3NhcmFkY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCByb2NrY2hpcF9zYXJhZGMgKmluZm8gPSBOVUxMOwpAQCAtMjE4LDYgKzIzMSwyMCBAQAogCWlmIChJU19FUlIoaW5mby0+cmVncykpCiAJCXJldHVybiBQVFJfRVJSKGluZm8tPnJlZ3MpOwogCisJLyoKKwkgKiBUaGUgcmVzZXQgc2hvdWxkIGJlIGFuIG9wdGlvbmFsIHByb3BlcnR5LCBhcyBpdCBzaG91bGQgd29yaworCSAqIHdpdGggb2xkIGRldmljZXRyZWVzIGFzIHdlbGwKKwkgKi8KKwlpbmZvLT5yZXNldCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoJnBkZXYtPmRldiwgInNhcmFkYy1hcGIiKTsKKwlpZiAoSVNfRVJSKGluZm8tPnJlc2V0KSkgeworCQlyZXQgPSBQVFJfRVJSKGluZm8tPnJlc2V0KTsKKwkJaWYgKHJldCAhPSAtRU5PRU5UKQorCQkJcmV0dXJuIHJldDsKKworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJubyByZXNldCBjb250cm9sIGZvdW5kXG4iKTsKKwkJaW5mby0+cmVzZXQgPSBOVUxMOworCX0KKwogCWluaXRfY29tcGxldGlvbigmaW5mby0+Y29tcGxldGlvbik7CiAKIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwpAQCAtMjUyLDYgKzI3OSw5IEBACiAJCXJldHVybiBQVFJfRVJSKGluZm8tPnZyZWYpOwogCX0KIAorCWlmIChpbmZvLT5yZXNldCkKKwkJcm9ja2NoaXBfc2FyYWRjX3Jlc2V0X2NvbnRyb2xsZXIoaW5mby0+cmVzZXQpOworCiAJLyoKIAkgKiBVc2UgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgY29udmVydGVyIGNsb2NrLgogCSAqIFRoaXMgbWF5IGJlY29tZSB1c2VyLWNvbmZpZ3VyYWJsZSBpbiB0aGUgZnV0dXJlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3N0eDEwNC5jIGIvZHJpdmVycy9paW8vYWRjL3N0eDEwNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMzY0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9hZGMvc3R4MTA0LmMKQEAgLTAsMCArMSwzODAgQEAKKy8qCisgKiBJSU8gZHJpdmVyIGZvciB0aGUgQXBleCBFbWJlZGRlZCBTeXN0ZW1zIFNUWDEwNAorICogQ29weXJpZ2h0IChDKSAyMDE2IFdpbGxpYW0gQnJlYXRoaXR0IEdyYXkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNkZWZpbmUgU1RYMTA0X09VVF9DSEFOKGNoYW4pIHsJCQkJXAorCS50eXBlID0gSUlPX1ZPTFRBR0UsCQkJCVwKKwkuY2hhbm5lbCA9IGNoYW4sCQkJCVwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJXAorCS5pbmRleGVkID0gMSwJCQkJCVwKKwkub3V0cHV0ID0gMQkJCQkJXAorfQorI2RlZmluZSBTVFgxMDRfSU5fQ0hBTihjaGFuLCBkaWZmKSB7CQkJCQlcCisJLnR5cGUgPSBJSU9fVk9MVEFHRSwJCQkJCQlcCisJLmNoYW5uZWwgPSBjaGFuLAkJCQkJCVwKKwkuY2hhbm5lbDIgPSBjaGFuLAkJCQkJCVwKKwkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fSEFSRFdBUkVHQUlOKSB8CVwKKwkJQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwJXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAkJCVwKKwkuaW5kZXhlZCA9IDEsCQkJCQkJCVwKKwkuZGlmZmVyZW50aWFsID0gZGlmZgkJCQkJCVwKK30KKworI2RlZmluZSBTVFgxMDRfTlVNX09VVF9DSEFOIDIKKworI2RlZmluZSBTVFgxMDRfRVhURU5UIDE2CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYmFzZVttYXhfbnVtX2lzYV9kZXYoU1RYMTA0X0VYVEVOVCldOworc3RhdGljIHVuc2lnbmVkIGludCBudW1fc3R4MTA0OworbW9kdWxlX3BhcmFtX2FycmF5KGJhc2UsIHVpbnQsICZudW1fc3R4MTA0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYmFzZSwgIkFwZXggRW1iZWRkZWQgU3lzdGVtcyBTVFgxMDQgYmFzZSBhZGRyZXNzZXMiKTsKKworLyoqCisgKiBzdHJ1Y3Qgc3R4MTA0X2lpbyAtIElJTyBkZXZpY2UgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQorICogQGNoYW5fb3V0X3N0YXRlczoJY2hhbm5lbHMnIG91dHB1dCBzdGF0ZXMKKyAqIEBiYXNlOgkJYmFzZSBwb3J0IGFkZHJlc3Mgb2YgdGhlIElJTyBkZXZpY2UKKyAqLworc3RydWN0IHN0eDEwNF9paW8geworCXVuc2lnbmVkIGludCBjaGFuX291dF9zdGF0ZXNbU1RYMTA0X05VTV9PVVRfQ0hBTl07CisJdW5zaWduZWQgaW50IGJhc2U7Cit9OworCisvKioKKyAqIHN0cnVjdCBzdHgxMDRfZ3BpbyAtIEdQSU8gZGV2aWNlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBjaGlwOglpbnN0YW5jZSBvZiB0aGUgZ3Bpb19jaGlwCisgKiBAbG9jazoJc3luY2hyb25pemF0aW9uIGxvY2sgdG8gcHJldmVudCBJL08gcmFjZSBjb25kaXRpb25zCisgKiBAYmFzZToJYmFzZSBwb3J0IGFkZHJlc3Mgb2YgdGhlIEdQSU8gZGV2aWNlCisgKiBAb3V0X3N0YXRlOglvdXRwdXQgYml0cyBzdGF0ZQorICovCitzdHJ1Y3Qgc3R4MTA0X2dwaW8geworCXN0cnVjdCBncGlvX2NoaXAgY2hpcDsKKwlzcGlubG9ja190IGxvY2s7CisJdW5zaWduZWQgaW50IGJhc2U7CisJdW5zaWduZWQgaW50IG91dF9zdGF0ZTsKK307CisKKy8qKgorICogc3RydWN0IHN0eDEwNF9kZXYgLSBTVFgxMDQgZGV2aWNlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBpbmRpb19kZXY6CUlJTyBkZXZpY2UKKyAqIEBjaGlwOglpbnN0YW5jZSBvZiB0aGUgZ3Bpb19jaGlwCisgKi8KK3N0cnVjdCBzdHgxMDRfZGV2IHsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXA7Cit9OworCitzdGF0aWMgaW50IHN0eDEwNF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLCBpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCit7CisJc3RydWN0IHN0eDEwNF9paW8gKmNvbnN0IHByaXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXVuc2lnbmVkIGludCBhZGNfY29uZmlnOworCWludCBhZGJ1OworCWludCBnYWluOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX0hBUkRXQVJFR0FJTjoKKwkJLyogZ2V0IGdhaW4gY29uZmlndXJhdGlvbiAqLworCQlhZGNfY29uZmlnID0gaW5iKHByaXYtPmJhc2UgKyAxMSk7CisJCWdhaW4gPSBhZGNfY29uZmlnICYgMHgzOworCisJCSp2YWwgPSAxIDw8IGdhaW47CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlpZiAoY2hhbi0+b3V0cHV0KSB7CisJCQkqdmFsID0gcHJpdi0+Y2hhbl9vdXRfc3RhdGVzW2NoYW4tPmNoYW5uZWxdOworCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQl9CisKKwkJLyogc2VsZWN0IEFEQyBjaGFubmVsICovCisJCW91dGIoY2hhbi0+Y2hhbm5lbCB8IChjaGFuLT5jaGFubmVsIDw8IDQpLCBwcml2LT5iYXNlICsgMik7CisKKwkJLyogdHJpZ2dlciBBREMgc2FtcGxlIGNhcHR1cmUgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwkJb3V0YigwLCBwcml2LT5iYXNlKTsKKwkJd2hpbGUgKGluYihwcml2LT5iYXNlICsgOCkgJiBCSVQoNykpOworCisJCSp2YWwgPSBpbncocHJpdi0+YmFzZSk7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlIElJT19DSEFOX0lORk9fT0ZGU0VUOgorCQkvKiBnZXQgQURDIGJpcG9sYXIvdW5pcG9sYXIgY29uZmlndXJhdGlvbiAqLworCQlhZGNfY29uZmlnID0gaW5iKHByaXYtPmJhc2UgKyAxMSk7CisJCWFkYnUgPSAhKGFkY19jb25maWcgJiBCSVQoMikpOworCisJCSp2YWwgPSAtMzI3NjggKiBhZGJ1OworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgorCQkvKiBnZXQgQURDIGJpcG9sYXIvdW5pcG9sYXIgYW5kIGdhaW4gY29uZmlndXJhdGlvbiAqLworCQlhZGNfY29uZmlnID0gaW5iKHByaXYtPmJhc2UgKyAxMSk7CisJCWFkYnUgPSAhKGFkY19jb25maWcgJiBCSVQoMikpOworCQlnYWluID0gYWRjX2NvbmZpZyAmIDB4MzsKKworCQkqdmFsID0gNTsKKwkJKnZhbDIgPSAxNSAtIGFkYnUgKyBnYWluOworCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMX0xPRzI7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgc3R4MTA0X3dyaXRlX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLCBpbnQgdmFsLCBpbnQgdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBzdHgxMDRfaWlvICpjb25zdCBwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19IQVJEV0FSRUdBSU46CisJCS8qIE9ubHkgZm91ciBnYWluIHN0YXRlcyAoeDEsIHgyLCB4NCwgeDgpICovCisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgMToKKwkJCW91dGIoMCwgcHJpdi0+YmFzZSArIDExKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlvdXRiKDEsIHByaXYtPmJhc2UgKyAxMSk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJb3V0YigyLCBwcml2LT5iYXNlICsgMTEpOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCW91dGIoMywgcHJpdi0+YmFzZSArIDExKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlyZXR1cm4gMDsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlpZiAoY2hhbi0+b3V0cHV0KSB7CisJCQkvKiBEQUMgY2FuIG9ubHkgYWNjZXB0IHVwIHRvIGEgMTYtYml0IHZhbHVlICovCisJCQlpZiAoKHVuc2lnbmVkIGludCl2YWwgPiA2NTUzNSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJcHJpdi0+Y2hhbl9vdXRfc3RhdGVzW2NoYW4tPmNoYW5uZWxdID0gdmFsOworCQkJb3V0dyh2YWwsIHByaXYtPmJhc2UgKyA0ICsgMiAqIGNoYW4tPmNoYW5uZWwpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBzdHgxMDRfaW5mbyA9IHsKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5yZWFkX3JhdyA9IHN0eDEwNF9yZWFkX3JhdywKKwkud3JpdGVfcmF3ID0gc3R4MTA0X3dyaXRlX3JhdworfTsKKworLyogc2luZ2xlLWVuZGVkIGlucHV0IGNoYW5uZWxzIGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzdHgxMDRfY2hhbm5lbHNfc2luZ1tdID0geworCVNUWDEwNF9PVVRfQ0hBTigwKSwgU1RYMTA0X09VVF9DSEFOKDEpLAorCVNUWDEwNF9JTl9DSEFOKDAsIDApLCBTVFgxMDRfSU5fQ0hBTigxLCAwKSwgU1RYMTA0X0lOX0NIQU4oMiwgMCksCisJU1RYMTA0X0lOX0NIQU4oMywgMCksIFNUWDEwNF9JTl9DSEFOKDQsIDApLCBTVFgxMDRfSU5fQ0hBTig1LCAwKSwKKwlTVFgxMDRfSU5fQ0hBTig2LCAwKSwgU1RYMTA0X0lOX0NIQU4oNywgMCksIFNUWDEwNF9JTl9DSEFOKDgsIDApLAorCVNUWDEwNF9JTl9DSEFOKDksIDApLCBTVFgxMDRfSU5fQ0hBTigxMCwgMCksIFNUWDEwNF9JTl9DSEFOKDExLCAwKSwKKwlTVFgxMDRfSU5fQ0hBTigxMiwgMCksIFNUWDEwNF9JTl9DSEFOKDEzLCAwKSwgU1RYMTA0X0lOX0NIQU4oMTQsIDApLAorCVNUWDEwNF9JTl9DSEFOKDE1LCAwKQorfTsKKy8qIGRpZmZlcmVudGlhbCBpbnB1dCBjaGFubmVscyBjb25maWd1cmF0aW9uICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgc3R4MTA0X2NoYW5uZWxzX2RpZmZbXSA9IHsKKwlTVFgxMDRfT1VUX0NIQU4oMCksIFNUWDEwNF9PVVRfQ0hBTigxKSwKKwlTVFgxMDRfSU5fQ0hBTigwLCAxKSwgU1RYMTA0X0lOX0NIQU4oMSwgMSksIFNUWDEwNF9JTl9DSEFOKDIsIDEpLAorCVNUWDEwNF9JTl9DSEFOKDMsIDEpLCBTVFgxMDRfSU5fQ0hBTig0LCAxKSwgU1RYMTA0X0lOX0NIQU4oNSwgMSksCisJU1RYMTA0X0lOX0NIQU4oNiwgMSksIFNUWDEwNF9JTl9DSEFOKDcsIDEpCit9OworCitzdGF0aWMgaW50IHN0eDEwNF9ncGlvX2dldF9kaXJlY3Rpb24oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCS8qIEdQSU8gMC0zIGFyZSBpbnB1dCBvbmx5LCB3aGlsZSB0aGUgcmVzdCBhcmUgb3V0cHV0IG9ubHkgKi8KKwlpZiAob2Zmc2V0IDwgNCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHgxMDRfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCWlmIChvZmZzZXQgPj0gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHgxMDRfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJdW5zaWduZWQgaW50IG9mZnNldCwgaW50IHZhbHVlKQoreworCWlmIChvZmZzZXQgPCA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNoaXAtPnNldChjaGlwLCBvZmZzZXQsIHZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHgxMDRfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3Qgc3R4MTA0X2dwaW8gKmNvbnN0IHN0eDEwNGdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCWlmIChvZmZzZXQgPj0gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gISEoaW5iKHN0eDEwNGdwaW8tPmJhc2UpICYgQklUKG9mZnNldCkpOworfQorCitzdGF0aWMgdm9pZCBzdHgxMDRfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCwKKwlpbnQgdmFsdWUpCit7CisJc3RydWN0IHN0eDEwNF9ncGlvICpjb25zdCBzdHgxMDRncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJY29uc3QgdW5zaWduZWQgaW50IG1hc2sgPSBCSVQob2Zmc2V0KSA+PiA0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob2Zmc2V0IDwgNCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0eDEwNGdwaW8tPmxvY2ssIGZsYWdzKTsKKworCWlmICh2YWx1ZSkKKwkJc3R4MTA0Z3Bpby0+b3V0X3N0YXRlIHw9IG1hc2s7CisJZWxzZQorCQlzdHgxMDRncGlvLT5vdXRfc3RhdGUgJj0gfm1hc2s7CisKKwlvdXRiKHN0eDEwNGdwaW8tPm91dF9zdGF0ZSwgc3R4MTA0Z3Bpby0+YmFzZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdHgxMDRncGlvLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgc3R4MTA0X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlkKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IHN0eDEwNF9paW8gKnByaXY7CisJc3RydWN0IHN0eDEwNF9ncGlvICpzdHgxMDRncGlvOworCXN0cnVjdCBzdHgxMDRfZGV2ICpzdHgxMDRkZXY7CisJaW50IGVycjsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYyhkZXYsIHNpemVvZigqcHJpdikpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0eDEwNGdwaW8gPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnN0eDEwNGdwaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0eDEwNGdwaW8pCisJCXJldHVybiAtRU5PTUVNOworCisJc3R4MTA0ZGV2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzdHgxMDRkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0eDEwNGRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIWRldm1fcmVxdWVzdF9yZWdpb24oZGV2LCBiYXNlW2lkXSwgU1RYMTA0X0VYVEVOVCwKKwkJZGV2X25hbWUoZGV2KSkpIHsKKwkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gbG9jayBwb3J0IGFkZHJlc3NlcyAoMHglWC0weCVYKVxuIiwKKwkJCWJhc2VbaWRdLCBiYXNlW2lkXSArIFNUWDEwNF9FWFRFTlQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWluZGlvX2Rldi0+aW5mbyA9ICZzdHgxMDRfaW5mbzsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwkvKiBkZXRlcm1pbmUgaWYgZGlmZmVyZW50aWFsIGlucHV0cyAqLworCWlmIChpbmIoYmFzZVtpZF0gKyA4KSAmIEJJVCg1KSkgeworCQlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoc3R4MTA0X2NoYW5uZWxzX2RpZmYpOworCQlpbmRpb19kZXYtPmNoYW5uZWxzID0gc3R4MTA0X2NoYW5uZWxzX2RpZmY7CisJfSBlbHNlIHsKKwkJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHN0eDEwNF9jaGFubmVsc19zaW5nKTsKKwkJaW5kaW9fZGV2LT5jaGFubmVscyA9IHN0eDEwNF9jaGFubmVsc19zaW5nOworCX0KKworCWluZGlvX2Rldi0+bmFtZSA9IGRldl9uYW1lKGRldik7CisKKwlwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlwcml2LT5iYXNlID0gYmFzZVtpZF07CisKKwkvKiBjb25maWd1cmUgZGV2aWNlIGZvciBzb2Z0d2FyZSB0cmlnZ2VyIG9wZXJhdGlvbiAqLworCW91dGIoMCwgYmFzZVtpZF0gKyA5KTsKKworCS8qIGluaXRpYWxpemUgZ2FpbiBzZXR0aW5nIHRvIHgxICovCisJb3V0YigwLCBiYXNlW2lkXSArIDExKTsKKworCS8qIGluaXRpYWxpemUgREFDIG91dHB1dCB0byAwViAqLworCW91dHcoMCwgYmFzZVtpZF0gKyA0KTsKKwlvdXR3KDAsIGJhc2VbaWRdICsgNik7CisKKwlzdHgxMDRncGlvLT5jaGlwLmxhYmVsID0gZGV2X25hbWUoZGV2KTsKKwlzdHgxMDRncGlvLT5jaGlwLnBhcmVudCA9IGRldjsKKwlzdHgxMDRncGlvLT5jaGlwLm93bmVyID0gVEhJU19NT0RVTEU7CisJc3R4MTA0Z3Bpby0+Y2hpcC5iYXNlID0gLTE7CisJc3R4MTA0Z3Bpby0+Y2hpcC5uZ3BpbyA9IDg7CisJc3R4MTA0Z3Bpby0+Y2hpcC5nZXRfZGlyZWN0aW9uID0gc3R4MTA0X2dwaW9fZ2V0X2RpcmVjdGlvbjsKKwlzdHgxMDRncGlvLT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IHN0eDEwNF9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKKwlzdHgxMDRncGlvLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSBzdHgxMDRfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OworCXN0eDEwNGdwaW8tPmNoaXAuZ2V0ID0gc3R4MTA0X2dwaW9fZ2V0OworCXN0eDEwNGdwaW8tPmNoaXAuc2V0ID0gc3R4MTA0X2dwaW9fc2V0OworCXN0eDEwNGdwaW8tPmJhc2UgPSBiYXNlW2lkXSArIDM7CisJc3R4MTA0Z3Bpby0+b3V0X3N0YXRlID0gMHgwOworCisJc3Bpbl9sb2NrX2luaXQoJnN0eDEwNGdwaW8tPmxvY2spOworCisJc3R4MTA0ZGV2LT5pbmRpb19kZXYgPSBpbmRpb19kZXY7CisJc3R4MTA0ZGV2LT5jaGlwID0gJnN0eDEwNGdwaW8tPmNoaXA7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgc3R4MTA0ZGV2KTsKKworCWVyciA9IGdwaW9jaGlwX2FkZF9kYXRhKCZzdHgxMDRncGlvLT5jaGlwLCBzdHgxMDRncGlvKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoZGV2LCAiR1BJTyByZWdpc3RlcmluZyBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgIklJTyBkZXZpY2UgcmVnaXN0ZXJpbmcgZmFpbGVkICglZClcbiIsIGVycik7CisJCWdwaW9jaGlwX3JlbW92ZSgmc3R4MTA0Z3Bpby0+Y2hpcCk7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3R4MTA0X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpZCkKK3sKKwlzdHJ1Y3Qgc3R4MTA0X2RldiAqY29uc3Qgc3R4MTA0ZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3R4MTA0ZGV2LT5pbmRpb19kZXYpOworCWdwaW9jaGlwX3JlbW92ZShzdHgxMDRkZXYtPmNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXNhX2RyaXZlciBzdHgxMDRfZHJpdmVyID0geworCS5wcm9iZSA9IHN0eDEwNF9wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzdHgxMDQiCisJfSwKKwkucmVtb3ZlID0gc3R4MTA0X3JlbW92ZQorfTsKKworbW9kdWxlX2lzYV9kcml2ZXIoc3R4MTA0X2RyaXZlciwgbnVtX3N0eDEwNCk7CisKK01PRFVMRV9BVVRIT1IoIldpbGxpYW0gQnJlYXRoaXR0IEdyYXkgPHZpbGhlbG0uZ3JheUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFwZXggRW1iZWRkZWQgU3lzdGVtcyBTVFgxMDQgSUlPIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3RpLWFkYzEyMTM4LmMgYi9kcml2ZXJzL2lpby9hZGMvdGktYWRjMTIxMzguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzJmMDNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWRjL3RpLWFkYzEyMTM4LmMKQEAgLTAsMCArMSw1NTIgQEAKKy8qCisgKiBBREMxMjEzMC9BREMxMjEzMi9BREMxMjEzOCAxMi1iaXQgcGx1cyBzaWduIEFEQyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQWtpbm9idSBNaXRhIDxha2lub2J1Lm1pdGFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluCisgKiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogRGF0YXNoZWV0OiBodHRwOi8vd3d3LnRpLmNvbS9saXQvZHMvc3ltbGluay9hZGMxMjEzOC5wZGYKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2J1ZmZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJlZF9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcl9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorCisjZGVmaW5lIEFEQzEyMTM4X01PREVfQVVUT19DQUwJCQkweDA4CisjZGVmaW5lIEFEQzEyMTM4X01PREVfUkVBRF9TVEFUVVMJCTB4MGMKKyNkZWZpbmUgQURDMTIxMzhfTU9ERV9BQ1FVSVNJVElPTl9USU1FXzYJMHgwZQorI2RlZmluZSBBREMxMjEzOF9NT0RFX0FDUVVJU0lUSU9OX1RJTUVfMTAJMHg0ZQorI2RlZmluZSBBREMxMjEzOF9NT0RFX0FDUVVJU0lUSU9OX1RJTUVfMTgJMHg4ZQorI2RlZmluZSBBREMxMjEzOF9NT0RFX0FDUVVJU0lUSU9OX1RJTUVfMzQJMHhjZQorCisjZGVmaW5lIEFEQzEyMTM4X1NUQVRVU19DQUwJCQlCSVQoNikKKworZW51bSB7CisJYWRjMTIxMzAsCisJYWRjMTIxMzIsCisJYWRjMTIxMzgsCit9OworCitzdHJ1Y3QgYWRjMTIxMzggeworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7CisJdW5zaWduZWQgaW50IGlkOworCS8qIGNvbnZlcnNpb24gY2xvY2sgKi8KKwlzdHJ1Y3QgY2xrICpjY2xrOworCS8qIHBvc2l0aXZlIGFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZSAqLworCXN0cnVjdCByZWd1bGF0b3IgKnZyZWZfcDsKKwkvKiBuZWdhdGl2ZSBhbmFsb2cgdm9sdGFnZSByZWZlcmVuY2UgKi8KKwlzdHJ1Y3QgcmVndWxhdG9yICp2cmVmX247CisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGU7CisJLyogVGhlIG51bWJlciBvZiBjY2xrIHBlcmlvZHMgZm9yIHRoZSBTL0gncyBhY3F1aXNpdGlvbiB0aW1lICovCisJdW5zaWduZWQgaW50IGFjcXVpc2l0aW9uX3RpbWU7CisKKwl1OCB0eF9idWZbMl0gX19fX2NhY2hlbGluZV9hbGlnbmVkOworCXU4IHJ4X2J1ZlsyXTsKK307CisKKyNkZWZpbmUgQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMKGNoYW4pCQkJCQlcCisJewkJCQkJCQkJXAorCQkudHlwZSA9IElJT19WT0xUQUdFLAkJCQkJXAorCQkuaW5kZXhlZCA9IDEsCQkJCQkJXAorCQkuY2hhbm5lbCA9IGNoYW4sCQkJCQlcCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAkJXAorCQkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fU0NBTEUpCVwKKwkJCQkJfCBCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpLAlcCisJCS5zY2FuX2luZGV4ID0gY2hhbiwJCQkJCVwKKwkJLnNjYW5fdHlwZSA9IHsJCQkJCQlcCisJCQkuc2lnbiA9ICdzJywJCQkJCVwKKwkJCS5yZWFsYml0cyA9IDEzLAkJCQkJXAorCQkJLnN0b3JhZ2ViaXRzID0gMTYsCQkJCVwKKwkJCS5zaGlmdCA9IDMsCQkJCQlcCisJCQkuZW5kaWFubmVzcyA9IElJT19CRSwJCQkJXAorCQl9LAkJCQkJCQlcCisJfQorCisjZGVmaW5lIEFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTF9ESUZGKGNoYW4xLCBjaGFuMiwgc2kpCQkJXAorCXsJCQkJCQkJCVwKKwkJLnR5cGUgPSBJSU9fVk9MVEFHRSwJCQkJCVwKKwkJLmluZGV4ZWQgPSAxLAkJCQkJCVwKKwkJLmNoYW5uZWwgPSAoY2hhbjEpLAkJCQkJXAorCQkuY2hhbm5lbDIgPSAoY2hhbjIpLAkJCQkJXAorCQkuZGlmZmVyZW50aWFsID0gMSwJCQkJCVwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCQlcCisJCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSkJXAorCQkJCQl8IEJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCksCVwKKwkJLnNjYW5faW5kZXggPSBzaSwJCQkJCVwKKwkJLnNjYW5fdHlwZSA9IHsJCQkJCQlcCisJCQkuc2lnbiA9ICdzJywJCQkJCVwKKwkJCS5yZWFsYml0cyA9IDEzLAkJCQkJXAorCQkJLnN0b3JhZ2ViaXRzID0gMTYsCQkJCVwKKwkJCS5zaGlmdCA9IDMsCQkJCQlcCisJCQkuZW5kaWFubmVzcyA9IElJT19CRSwJCQkJXAorCQl9LAkJCQkJCQlcCisJfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgYWRjMTIxMzJfY2hhbm5lbHNbXSA9IHsKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUwoMCksCisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMKDEpLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTF9ESUZGKDAsIDEsIDIpLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTF9ESUZGKDEsIDAsIDMpLAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGFkYzEyMTM4X2NoYW5uZWxzW10gPSB7CisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMKDApLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTCgxKSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUwoMiksCisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMKDMpLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTCg0KSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUwoNSksCisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMKDYpLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTCg3KSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUxfRElGRigwLCAxLCA4KSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUxfRElGRigxLCAwLCA5KSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUxfRElGRigyLCAzLCAxMCksCisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMX0RJRkYoMywgMiwgMTEpLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTF9ESUZGKDQsIDUsIDEyKSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUxfRElGRig1LCA0LCAxMyksCisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMX0RJRkYoNiwgNywgMTQpLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTF9ESUZGKDcsIDYsIDE1KSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgxNiksCit9OworCitzdGF0aWMgaW50IGFkYzEyMTM4X21vZGVfcHJvZ3JhbW1pbmcoc3RydWN0IGFkYzEyMTM4ICphZGMsIHU4IG1vZGUsCisJCQkJICAgICB2b2lkICpyeF9idWYsIGludCBsZW4pCit7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyID0geworCQkudHhfYnVmID0gYWRjLT50eF9idWYsCisJCS5yeF9idWYgPSBhZGMtPnJ4X2J1ZiwKKwkJLmxlbiA9IGxlbiwKKwl9OworCWludCByZXQ7CisKKwkvKiBTa2lwIHVudXNlZCBiaXRzIGZvciBBREMxMjEzMCBhbmQgQURDMTIxMzIgKi8KKwlpZiAoYWRjLT5pZCAhPSBhZGMxMjEzOCkKKwkJbW9kZSA9IChtb2RlICYgMHhjMCkgfCAoKG1vZGUgJiAweDBmKSA8PCAyKTsKKworCWFkYy0+dHhfYnVmWzBdID0gbW9kZTsKKworCXJldCA9IHNwaV9zeW5jX3RyYW5zZmVyKGFkYy0+c3BpLCAmeGZlciwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW1lbWNweShyeF9idWYsIGFkYy0+cnhfYnVmLCBsZW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRjMTIxMzhfcmVhZF9zdGF0dXMoc3RydWN0IGFkYzEyMTM4ICphZGMpCit7CisJdTggcnhfYnVmWzJdOworCWludCByZXQ7CisKKwlyZXQgPSBhZGMxMjEzOF9tb2RlX3Byb2dyYW1taW5nKGFkYywgQURDMTIxMzhfTU9ERV9SRUFEX1NUQVRVUywKKwkJCQkJcnhfYnVmLCAyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIChyeF9idWZbMF0gPDwgMSkgfCAocnhfYnVmWzFdID4+IDcpOworfQorCitzdGF0aWMgaW50IF9fYWRjMTIxMzhfc3RhcnRfY29udihzdHJ1Y3QgYWRjMTIxMzggKmFkYywKKwkJCQkgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW5uZWwsCisJCQkJIHZvaWQgKmRhdGEsIGludCBsZW4pCisKK3sKKwljb25zdCB1OCBjaF90b19tdXhbXSA9IHsgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyB9OworCXU4IG1vZGUgPSAoY2hfdG9fbXV4W2NoYW5uZWwtPmNoYW5uZWxdIDw8IDQpIHwKKwkJICAoY2hhbm5lbC0+ZGlmZmVyZW50aWFsID8gMCA6IDB4ODApOworCisJcmV0dXJuIGFkYzEyMTM4X21vZGVfcHJvZ3JhbW1pbmcoYWRjLCBtb2RlLCBkYXRhLCBsZW4pOworfQorCitzdGF0aWMgaW50IGFkYzEyMTM4X3N0YXJ0X2NvbnYoc3RydWN0IGFkYzEyMTM4ICphZGMsCisJCQkgICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW5uZWwpCit7CisJdTggdHJhc2g7CisKKwlyZXR1cm4gX19hZGMxMjEzOF9zdGFydF9jb252KGFkYywgY2hhbm5lbCwgJnRyYXNoLCAxKTsKK30KKworc3RhdGljIGludCBhZGMxMjEzOF9zdGFydF9hbmRfcmVhZF9jb252KHN0cnVjdCBhZGMxMjEzOCAqYWRjLAorCQkJCQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbm5lbCwKKwkJCQkJX19iZTE2ICpkYXRhKQoreworCXJldHVybiBfX2FkYzEyMTM4X3N0YXJ0X2NvbnYoYWRjLCBjaGFubmVsLCBkYXRhLCAyKTsKK30KKworc3RhdGljIGludCBhZGMxMjEzOF9yZWFkX2NvbnZfZGF0YShzdHJ1Y3QgYWRjMTIxMzggKmFkYywgX19iZTE2ICp2YWx1ZSkKK3sKKwkvKiBJc3N1ZSBhIHJlYWQgc3RhdHVzIGluc3RydWN0aW9uIGFuZCByZWFkIHByZXZpb3VzIGNvbnZlcnNpb24gZGF0YSAqLworCXJldHVybiBhZGMxMjEzOF9tb2RlX3Byb2dyYW1taW5nKGFkYywgQURDMTIxMzhfTU9ERV9SRUFEX1NUQVRVUywKKwkJCQkJIHZhbHVlLCBzaXplb2YoKnZhbHVlKSk7Cit9CisKK3N0YXRpYyBpbnQgYWRjMTIxMzhfd2FpdF9lb2Moc3RydWN0IGFkYzEyMTM4ICphZGMsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmYWRjLT5jb21wbGV0ZSwgdGltZW91dCkpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRjMTIxMzhfYWRjX2NvbnZlcnNpb24oc3RydWN0IGFkYzEyMTM4ICphZGMsCisJCQkJICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW5uZWwsCisJCQkJICAgX19iZTE2ICp2YWx1ZSkKK3sKKwlpbnQgcmV0OworCisJcmVpbml0X2NvbXBsZXRpb24oJmFkYy0+Y29tcGxldGUpOworCisJcmV0ID0gYWRjMTIxMzhfc3RhcnRfY29udihhZGMsIGNoYW5uZWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZGMxMjEzOF93YWl0X2VvYyhhZGMsIG1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBhZGMxMjEzOF9yZWFkX2NvbnZfZGF0YShhZGMsIHZhbHVlKTsKK30KKworc3RhdGljIGludCBhZGMxMjEzOF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaWlvLAorCQkJICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbm5lbCwgaW50ICp2YWx1ZSwKKwkJCSAgICAgaW50ICpzaGlmdCwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBhZGMxMjEzOCAqYWRjID0gaWlvX3ByaXYoaWlvKTsKKwlpbnQgcmV0OworCV9fYmUxNiBkYXRhOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJbXV0ZXhfbG9jaygmYWRjLT5sb2NrKTsKKwkJcmV0ID0gYWRjMTIxMzhfYWRjX2NvbnZlcnNpb24oYWRjLCBjaGFubmVsLCAmZGF0YSk7CisJCW11dGV4X3VubG9jaygmYWRjLT5sb2NrKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJKnZhbHVlID0gc2lnbl9leHRlbmQzMihiZTE2X3RvX2NwdShkYXRhKSA+PiAzLCAxMik7CisKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKKwkJcmV0ID0gcmVndWxhdG9yX2dldF92b2x0YWdlKGFkYy0+dnJlZl9wKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFsdWUgPSByZXQ7CisKKwkJaWYgKCFJU19FUlIoYWRjLT52cmVmX24pKSB7CisJCQlyZXQgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UoYWRjLT52cmVmX24pOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCSp2YWx1ZSAtPSByZXQ7CisJCX0KKworCQkvKiBjb252ZXJ0IHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZSB0byBtViAqLworCQkqdmFsdWUgLz0gMTAwMDsKKwkJKnNoaWZ0ID0gY2hhbm5lbC0+c2Nhbl90eXBlLnJlYWxiaXRzIC0gMTsKKworCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMX0xPRzI7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX09GRlNFVDoKKwkJaWYgKCFJU19FUlIoYWRjLT52cmVmX24pKSB7CisJCQkqdmFsdWUgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UoYWRjLT52cmVmX24pOworCQkJaWYgKCp2YWx1ZSA8IDApCisJCQkJcmV0dXJuICp2YWx1ZTsKKwkJfSBlbHNlIHsKKwkJCSp2YWx1ZSA9IDA7CisJCX0KKworCQkvKiBjb252ZXJ0IHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZSB0byBtViAqLworCQkqdmFsdWUgLz0gMTAwMDsKKworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gYWRjMTIxMzhfaW5mbyA9IHsKKwkucmVhZF9yYXcgPSBhZGMxMjEzOF9yZWFkX3JhdywKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBhZGMxMjEzOF9pbml0KHN0cnVjdCBhZGMxMjEzOCAqYWRjKQoreworCWludCByZXQ7CisJaW50IHN0YXR1czsKKwl1OCBtb2RlOworCXU4IHRyYXNoOworCisJcmVpbml0X2NvbXBsZXRpb24oJmFkYy0+Y29tcGxldGUpOworCisJcmV0ID0gYWRjMTIxMzhfbW9kZV9wcm9ncmFtbWluZyhhZGMsIEFEQzEyMTM4X01PREVfQVVUT19DQUwsICZ0cmFzaCwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGRhdGEgb3V0cHV0IGF0IHRoaXMgdGltZSBoYXMgbm8gc2lnbmlmaWNhbmNlICovCisJc3RhdHVzID0gYWRjMTIxMzhfcmVhZF9zdGF0dXMoYWRjKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCWFkYzEyMTM4X3dhaXRfZW9jKGFkYywgbXNlY3NfdG9famlmZmllcygxMDApKTsKKworCXN0YXR1cyA9IGFkYzEyMTM4X3JlYWRfc3RhdHVzKGFkYyk7CisJaWYgKHN0YXR1cyAmIEFEQzEyMTM4X1NUQVRVU19DQUwpIHsKKwkJZGV2X3dhcm4oJmFkYy0+c3BpLT5kZXYsCisJCQkiQXV0byBDYWwgc2VxdWVuY2UgaXMgc3RpbGwgaW4gcHJvZ3Jlc3M6ICUjeFxuIiwKKwkJCXN0YXR1cyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXN3aXRjaCAoYWRjLT5hY3F1aXNpdGlvbl90aW1lKSB7CisJY2FzZSA2OgorCQltb2RlID0gQURDMTIxMzhfTU9ERV9BQ1FVSVNJVElPTl9USU1FXzY7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCW1vZGUgPSBBREMxMjEzOF9NT0RFX0FDUVVJU0lUSU9OX1RJTUVfMTA7CisJCWJyZWFrOworCWNhc2UgMTg6CisJCW1vZGUgPSBBREMxMjEzOF9NT0RFX0FDUVVJU0lUSU9OX1RJTUVfMTg7CisJCWJyZWFrOworCWNhc2UgMzQ6CisJCW1vZGUgPSBBREMxMjEzOF9NT0RFX0FDUVVJU0lUSU9OX1RJTUVfMzQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBhZGMxMjEzOF9tb2RlX3Byb2dyYW1taW5nKGFkYywgbW9kZSwgJnRyYXNoLCAxKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGFkYzEyMTM4X3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwKQoreworCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHA7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7CisJc3RydWN0IGFkYzEyMTM4ICphZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCV9fYmUxNiBkYXRhWzIwXSA9IHsgfTsgLyogMTZ4IDIgYnl0ZXMgQURDIGRhdGEgKyA4IGJ5dGVzIHRpbWVzdGFtcCAqLworCV9fYmUxNiB0cmFzaDsKKwlpbnQgcmV0OworCWludCBzY2FuX2luZGV4OworCWludCBpID0gMDsKKworCW11dGV4X2xvY2soJmFkYy0+bG9jayk7CisKKwlmb3JfZWFjaF9zZXRfYml0KHNjYW5faW5kZXgsIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaywKKwkJCSBpbmRpb19kZXYtPm1hc2tsZW5ndGgpIHsKKwkJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKnNjYW5fY2hhbiA9CisJCQkJJmluZGlvX2Rldi0+Y2hhbm5lbHNbc2Nhbl9pbmRleF07CisKKwkJcmVpbml0X2NvbXBsZXRpb24oJmFkYy0+Y29tcGxldGUpOworCisJCXJldCA9IGFkYzEyMTM4X3N0YXJ0X2FuZF9yZWFkX2NvbnYoYWRjLCBzY2FuX2NoYW4sCisJCQkJCQkgICBpID8gJmRhdGFbaSAtIDFdIDogJnRyYXNoKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X3dhcm4oJmFkYy0+c3BpLT5kZXYsCisJCQkJICJmYWlsZWQgdG8gc3RhcnQgY29udmVyc2lvblxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldCA9IGFkYzEyMTM4X3dhaXRfZW9jKGFkYywgbXNlY3NfdG9famlmZmllcygxMDApKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X3dhcm4oJmFkYy0+c3BpLT5kZXYsICJ3YWl0IGVvYyB0aW1lb3V0XG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaSsrOworCX0KKworCWlmIChpKSB7CisJCXJldCA9IGFkYzEyMTM4X3JlYWRfY29udl9kYXRhKGFkYywgJmRhdGFbaSAtIDFdKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X3dhcm4oJmFkYy0+c3BpLT5kZXYsCisJCQkJICJmYWlsZWQgdG8gZ2V0IGNvbnZlcnNpb24gZGF0YVxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlpb19wdXNoX3RvX2J1ZmZlcnNfd2l0aF90aW1lc3RhbXAoaW5kaW9fZGV2LCBkYXRhLAorCQkJCQkgICBpaW9fZ2V0X3RpbWVfbnMoaW5kaW9fZGV2KSk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZhZGMtPmxvY2spOworCisJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoaW5kaW9fZGV2LT50cmlnKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGFkYzEyMTM4X2VvY19oYW5kbGVyKGludCBpcnEsIHZvaWQgKnApCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHA7CisJc3RydWN0IGFkYzEyMTM4ICphZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJY29tcGxldGUoJmFkYy0+Y29tcGxldGUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGFkYzEyMTM4X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgYWRjMTIxMzggKmFkYzsKKwlpbnQgcmV0OworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCphZGMpKTsKKwlpZiAoIWluZGlvX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWFkYy0+c3BpID0gc3BpOworCWFkYy0+aWQgPSBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5kcml2ZXJfZGF0YTsKKwltdXRleF9pbml0KCZhZGMtPmxvY2spOworCWluaXRfY29tcGxldGlvbigmYWRjLT5jb21wbGV0ZSk7CisKKwlpbmRpb19kZXYtPm5hbWUgPSBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5uYW1lOworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlpbmRpb19kZXYtPmluZm8gPSAmYWRjMTIxMzhfaW5mbzsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlzd2l0Y2ggKGFkYy0+aWQpIHsKKwljYXNlIGFkYzEyMTMwOgorCWNhc2UgYWRjMTIxMzI6CisJCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBhZGMxMjEzMl9jaGFubmVsczsKKwkJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGFkYzEyMTMyX2NoYW5uZWxzKTsKKwkJYnJlYWs7CisJY2FzZSBhZGMxMjEzODoKKwkJaW5kaW9fZGV2LT5jaGFubmVscyA9IGFkYzEyMTM4X2NoYW5uZWxzOworCQlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoYWRjMTIxMzhfY2hhbm5lbHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihzcGktPmRldi5vZl9ub2RlLCAidGksYWNxdWlzaXRpb24tdGltZSIsCisJCQkJICAgJmFkYy0+YWNxdWlzaXRpb25fdGltZSk7CisJaWYgKHJldCkKKwkJYWRjLT5hY3F1aXNpdGlvbl90aW1lID0gMTA7CisKKwlhZGMtPmNjbGsgPSBkZXZtX2Nsa19nZXQoJnNwaS0+ZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKGFkYy0+Y2NsaykpCisJCXJldHVybiBQVFJfRVJSKGFkYy0+Y2Nsayk7CisKKwlhZGMtPnZyZWZfcCA9IGRldm1fcmVndWxhdG9yX2dldCgmc3BpLT5kZXYsICJ2cmVmLXAiKTsKKwlpZiAoSVNfRVJSKGFkYy0+dnJlZl9wKSkKKwkJcmV0dXJuIFBUUl9FUlIoYWRjLT52cmVmX3ApOworCisJYWRjLT52cmVmX24gPSBkZXZtX3JlZ3VsYXRvcl9nZXRfb3B0aW9uYWwoJnNwaS0+ZGV2LCAidnJlZi1uIik7CisJaWYgKElTX0VSUihhZGMtPnZyZWZfbikpIHsKKwkJLyoKKwkJICogQXNzdW1lIHZyZWZfbiBpcyAwViBpZiBhbiBvcHRpb25hbCByZWd1bGF0b3IgaXMgbm90CisJCSAqIHNwZWNpZmllZCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZXJyb3IgY29kZS4KKwkJICovCisJCXJldCA9IFBUUl9FUlIoYWRjLT52cmVmX24pOworCQlpZiAocmV0ICE9IC1FTk9ERVYpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnNwaS0+ZGV2LCBzcGktPmlycSwgYWRjMTIxMzhfZW9jX2hhbmRsZXIsCisJCQkgICAgICAgSVJRRl9UUklHR0VSX1JJU0lORywgaW5kaW9fZGV2LT5uYW1lLCBpbmRpb19kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoYWRjLT5jY2xrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShhZGMtPnZyZWZfcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfY2xrX2Rpc2FibGU7CisKKwlpZiAoIUlTX0VSUihhZGMtPnZyZWZfbikpIHsKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShhZGMtPnZyZWZfbik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl92cmVmX3BfZGlzYWJsZTsKKwl9CisKKwlyZXQgPSBhZGMxMjEzOF9pbml0KGFkYyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfdnJlZl9uX2Rpc2FibGU7CisKKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBpbmRpb19kZXYpOworCisJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBOVUxMLAorCQkJCQkgYWRjMTIxMzhfdHJpZ2dlcl9oYW5kbGVyLCBOVUxMKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl92cmVmX25fZGlzYWJsZTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9idWZmZXJfY2xlYW51cDsKKworCXJldHVybiAwOworZXJyX2J1ZmZlcl9jbGVhbnVwOgorCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKK2Vycl92cmVmX25fZGlzYWJsZToKKwlpZiAoIUlTX0VSUihhZGMtPnZyZWZfbikpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGFkYy0+dnJlZl9uKTsKK2Vycl92cmVmX3BfZGlzYWJsZToKKwlyZWd1bGF0b3JfZGlzYWJsZShhZGMtPnZyZWZfcCk7CitlcnJfY2xrX2Rpc2FibGU6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFkYy0+Y2Nsayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkYzEyMTM4X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgYWRjMTIxMzggKmFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CisJaWYgKCFJU19FUlIoYWRjLT52cmVmX24pKQorCQlyZWd1bGF0b3JfZGlzYWJsZShhZGMtPnZyZWZfbik7CisJcmVndWxhdG9yX2Rpc2FibGUoYWRjLT52cmVmX3ApOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShhZGMtPmNjbGspOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfT0YKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYWRjMTIxMzhfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ0aSxhZGMxMjEzMCIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSxhZGMxMjEzMiIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSxhZGMxMjEzOCIsIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhZGMxMjEzOF9kdF9pZHMpOworCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkYzEyMTM4X2lkW10gPSB7CisJeyAiYWRjMTIxMzAiLCBhZGMxMjEzMCB9LAorCXsgImFkYzEyMTMyIiwgYWRjMTIxMzIgfSwKKwl7ICJhZGMxMjEzOCIsIGFkYzEyMTM4IH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYWRjMTIxMzhfaWQpOworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRjMTIxMzhfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkYzEyMTM4IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGFkYzEyMTM4X2R0X2lkcyksCisJfSwKKwkucHJvYmUgPSBhZGMxMjEzOF9wcm9iZSwKKwkucmVtb3ZlID0gYWRjMTIxMzhfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGFkYzEyMTM4X2lkLAorfTsKK21vZHVsZV9zcGlfZHJpdmVyKGFkYzEyMTM4X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkFraW5vYnUgTWl0YSA8YWtpbm9idS5taXRhQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQURDMTIxMzAvQURDMTIxMzIvQURDMTIxMzggZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvdGktYWRjMTYxczYyNi5jIGIvZHJpdmVycy9paW8vYWRjL3RpLWFkYzE2MXM2MjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTRiNjlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWRjL3RpLWFkYzE2MXM2MjYuYwpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIHRpLWFkYzE2MXM2MjYuYyAtIFRleGFzIEluc3RydW1lbnRzIEFEQzE2MVM2MjYgMS1jaGFubmVsIGRpZmZlcmVudGlhbCBBREMKKyAqCisgKiBBREMgRGV2aWNlcyBTdXBwb3J0ZWQ6CisgKiAgYWRjMTQxczYyNiAtIDE0LWJpdCBBREMKKyAqICBhZGMxNjFzNjI2IC0gMTYtYml0IEFEQworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBNYXR0IFJhbm9zdGF5IDxtcmFub3N0YXlAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcl9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmg+CisKKyNkZWZpbmUgVElfQURDX0RSVl9OQU1FCSJ0aS1hZGMxNjFzNjI2IgorCitlbnVtIHsKKwlUSV9BREMxNDFTNjI2LAorCVRJX0FEQzE2MVM2MjYsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgdGlfYWRjMTQxczYyNl9jaGFubmVsc1tdID0geworCXsKKwkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJLmNoYW5uZWwgPSAwLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwKKwkJLnNjYW5faW5kZXggPSAwLAorCQkuc2Nhbl90eXBlID0geworCQkJLnNpZ24gPSAncycsCisJCQkucmVhbGJpdHMgPSAxNCwKKwkJCS5zdG9yYWdlYml0cyA9IDE2LAorCQl9LAorCX0sCisJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgdGlfYWRjMTYxczYyNl9jaGFubmVsc1tdID0geworCXsKKwkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJLmNoYW5uZWwgPSAwLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwKKwkJLnNjYW5faW5kZXggPSAwLAorCQkuc2Nhbl90eXBlID0geworCQkJLnNpZ24gPSAncycsCisJCQkucmVhbGJpdHMgPSAxNiwKKwkJCS5zdG9yYWdlYml0cyA9IDE2LAorCQl9LAorCX0sCisJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoMSksCit9OworCitzdHJ1Y3QgdGlfYWRjX2RhdGEgeworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaTsKKwl1OCByZWFkX3NpemU7CisJdTggc2hpZnQ7CisKKwl1OCBidWZmZXJbMTZdIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKK307CisKK3N0YXRpYyBpbnQgdGlfYWRjX3JlYWRfbWVhc3VyZW1lbnQoc3RydWN0IHRpX2FkY19kYXRhICpkYXRhLAorCQkJCSAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLCBpbnQgKnZhbCkKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChkYXRhLT5yZWFkX3NpemUpIHsKKwljYXNlIDI6IHsKKwkJX19iZTE2IGJ1ZjsKKworCQlyZXQgPSBzcGlfcmVhZChkYXRhLT5zcGksICh2b2lkICopICZidWYsIDIpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQkqdmFsID0gYmUxNl90b19jcHUoYnVmKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgMzogeworCQlfX2JlMzIgYnVmOworCisJCXJldCA9IHNwaV9yZWFkKGRhdGEtPnNwaSwgKHZvaWQgKikgJmJ1ZiwgMyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCSp2YWwgPSBiZTMyX3RvX2NwdShidWYpID4+IDg7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqdmFsID0gc2lnbl9leHRlbmQzMigqdmFsID4+IGRhdGEtPnNoaWZ0LCBjaGFuLT5zY2FuX3R5cGUucmVhbGJpdHMgLSAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdGlfYWRjX3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHByaXZhdGU7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7CisJc3RydWN0IHRpX2FkY19kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gdGlfYWRjX3JlYWRfbWVhc3VyZW1lbnQoZGF0YSwgJmluZGlvX2Rldi0+Y2hhbm5lbHNbMF0sCisJCQkJICAgICAoaW50ICopICZkYXRhLT5idWZmZXIpOworCWlmICghcmV0KQorCQlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2RldiwKKwkJCQkJZGF0YS0+YnVmZmVyLAorCQkJCQlpaW9fZ2V0X3RpbWVfbnMoaW5kaW9fZGV2KSk7CisKKwlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShpbmRpb19kZXYtPnRyaWcpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHRpX2FkY19yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICBpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCit7CisJc3RydWN0IHRpX2FkY19kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKG1hc2sgIT0gSUlPX0NIQU5fSU5GT19SQVcpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gaWlvX2RldmljZV9jbGFpbV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB0aV9hZGNfcmVhZF9tZWFzdXJlbWVudChkYXRhLCBjaGFuLCB2YWwpOworCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCisJaWYgKCFyZXQpCisJCXJldHVybiBJSU9fVkFMX0lOVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIHRpX2FkY19pbmZvID0geworCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJLnJlYWRfcmF3ID0gdGlfYWRjX3JlYWRfcmF3LAorfTsKKworc3RhdGljIGludCB0aV9hZGNfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCB0aV9hZGNfZGF0YSAqZGF0YTsKKwlpbnQgcmV0OworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpkYXRhKSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5kaW9fZGV2LT5pbmZvID0gJnRpX2FkY19pbmZvOworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlpbmRpb19kZXYtPmRldi5vZl9ub2RlID0gc3BpLT5kZXYub2Zfbm9kZTsKKwlpbmRpb19kZXYtPm5hbWUgPSBUSV9BRENfRFJWX05BTUU7CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGluZGlvX2Rldik7CisKKwlkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlkYXRhLT5zcGkgPSBzcGk7CisKKwlzd2l0Y2ggKHNwaV9nZXRfZGV2aWNlX2lkKHNwaSktPmRyaXZlcl9kYXRhKSB7CisJY2FzZSBUSV9BREMxNDFTNjI2OgorCQlpbmRpb19kZXYtPmNoYW5uZWxzID0gdGlfYWRjMTQxczYyNl9jaGFubmVsczsKKwkJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHRpX2FkYzE0MXM2MjZfY2hhbm5lbHMpOworCQlkYXRhLT5zaGlmdCA9IDA7CisJCWRhdGEtPnJlYWRfc2l6ZSA9IDI7CisJCWJyZWFrOworCWNhc2UgVElfQURDMTYxUzYyNjoKKwkJaW5kaW9fZGV2LT5jaGFubmVscyA9IHRpX2FkYzE2MXM2MjZfY2hhbm5lbHM7CisJCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRSh0aV9hZGMxNjFzNjI2X2NoYW5uZWxzKTsKKwkJZGF0YS0+c2hpZnQgPSA2OworCQlkYXRhLT5yZWFkX3NpemUgPSAzOworCQlicmVhazsKKwl9CisKKwlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsIE5VTEwsCisJCQkJCSB0aV9hZGNfdHJpZ2dlcl9oYW5kbGVyLCBOVUxMKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5yZWdfYnVmZmVyOworCisJcmV0dXJuIDA7CisKK2Vycm9yX3VucmVnX2J1ZmZlcjoKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRpX2FkY19yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGlfYWRjX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAidGksYWRjMTQxczYyNiIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSxhZGMxNjFzNjI2IiwgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRpX2FkY19kdF9pZHMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgdGlfYWRjX2lkW10gPSB7CisJeyJhZGMxNDFzNjI2IiwgVElfQURDMTQxUzYyNn0sCisJeyJhZGMxNjFzNjI2IiwgVElfQURDMTYxUzYyNn0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIHRpX2FkY19pZCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB0aV9hZGNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gVElfQURDX0RSVl9OQU1FLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIodGlfYWRjX2R0X2lkcyksCisJfSwKKwkucHJvYmUJCT0gdGlfYWRjX3Byb2JlLAorCS5yZW1vdmUJCT0gdGlfYWRjX3JlbW92ZSwKKwkuaWRfdGFibGUJPSB0aV9hZGNfaWQsCit9OworbW9kdWxlX3NwaV9kcml2ZXIodGlfYWRjX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIk1hdHQgUmFub3N0YXkgPG1yYW5vc3RheUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRleGFzIEluc3RydW1lbnRzIEFEQzF4MVMgMS1jaGFubmVsIGRpZmZlcmVudGlhbCBBREMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy90aS1hZHMxMDE1LmMgYi9kcml2ZXJzL2lpby9hZGMvdGktYWRzMTAxNS5jCmluZGV4IDFlZjM5ODc3Li5jZGU2ZjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvdGktYWRzMTAxNS5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy90aS1hZHMxMDE1LmMKQEAgLTQ4OSw3ICs0ODksOCBAQAogI2lmZGVmIENPTkZJR19PRgogc3RhdGljIGludCBhZHMxMDE1X2dldF9jaGFubmVsc19jb25maWdfb2Yoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlzdHJ1Y3QgYWRzMTAxNV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBhZHMxMDE1X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKIAogCWlmICghY2xpZW50LT5kZXYub2Zfbm9kZSB8fApAQCAtNTIxLDYgKzUyMiw3IEBACiAJCQlpZiAocGdhID4gNikgewogCQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaW52YWxpZCBnYWluIG9uICVzXG4iLAogCQkJCQlub2RlLT5mdWxsX25hbWUpOworCQkJCW9mX25vZGVfcHV0KG5vZGUpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9CkBAIC01MzEsNiArNTMzLDcgQEAKIAkJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKIAkJCQkJImludmFsaWQgZGF0YV9yYXRlIG9uICVzXG4iLAogCQkJCQlub2RlLT5mdWxsX25hbWUpOworCQkJCW9mX25vZGVfcHV0KG5vZGUpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvdGktYWRzODY4OC5jIGIvZHJpdmVycy9paW8vYWRjL3RpLWFkczg2ODguYwppbmRleCBjNDAwNDM5Li40YTE2MzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvdGktYWRzODY4OC5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy90aS1hZHM4Njg4LmMKQEAgLTQzOCw3ICs0MzgsNyBAQAogCXJldHVybiAwOwogCiBlcnJvcl9vdXQ6Ci0JaWYgKCFJU19FUlJfT1JfTlVMTChzdC0+cmVnKSkKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkKIAkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnJlZyk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtNDUxLDcgKzQ1MSw3IEBACiAKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAotCWlmICghSVNfRVJSX09SX05VTEwoc3QtPnJlZykpCisJaWYgKCFJU19FUlIoc3QtPnJlZykpCiAJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvdGlfYW0zMzV4X2FkYy5jIGIvZHJpdmVycy9paW8vYWRjL3RpX2FtMzM1eF9hZGMuYwppbmRleCA4YTM2ODc1Li5jM2NmYWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvdGlfYW0zMzV4X2FkYy5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy90aV9hbTMzNXhfYWRjLmMKQEAgLTMyLDYgKzMyLDcgQEAKIAogc3RydWN0IHRpYWRjX2RldmljZSB7CiAJc3RydWN0IHRpX3RzY2FkY19kZXYgKm1mZF90c2NhZGM7CisJc3RydWN0IG11dGV4IGZpZm8xX2xvY2s7IC8qIHRvIHByb3RlY3QgZmlmbyBhY2Nlc3MgKi8KIAlpbnQgY2hhbm5lbHM7CiAJdTggY2hhbm5lbF9saW5lWzhdOwogCXU4IGNoYW5uZWxfc3RlcFs4XTsKQEAgLTM1OSw2ICszNjAsNyBAQAogCQlpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCiB7CiAJc3RydWN0IHRpYWRjX2RldmljZSAqYWRjX2RldiA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldCA9IElJT19WQUxfSU5UOwogCWludCBpLCBtYXBfdmFsOwogCXVuc2lnbmVkIGludCBmaWZvMWNvdW50LCByZWFkLCBzdGVwaWQ7CiAJYm9vbCBmb3VuZCA9IGZhbHNlOwpAQCAtMzcyLDEzICszNzQsMTQgQEAKIAlpZiAoIXN0ZXBfZW4pCiAJCXJldHVybiAtRUlOVkFMOwogCisJbXV0ZXhfbG9jaygmYWRjX2Rldi0+ZmlmbzFfbG9jayk7CiAJZmlmbzFjb3VudCA9IHRpYWRjX3JlYWRsKGFkY19kZXYsIFJFR19GSUZPMUNOVCk7CiAJd2hpbGUgKGZpZm8xY291bnQtLSkKIAkJdGlhZGNfcmVhZGwoYWRjX2RldiwgUkVHX0ZJRk8xKTsKIAogCWFtMzM1eF90c2Nfc2Vfc2V0X29uY2UoYWRjX2Rldi0+bWZkX3RzY2FkYywgc3RlcF9lbik7CiAKLQl0aW1lb3V0ID0gamlmZmllcyArIHVzZWNzX3RvX2ppZmZpZXMKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMKIAkJCQkoSURMRV9USU1FT1VUICogYWRjX2Rldi0+Y2hhbm5lbHMpOwogCS8qIFdhaXQgZm9yIEZpZm8gdGhyZXNob2xkIGludGVycnVwdCAqLwogCXdoaWxlICgxKSB7CkBAIC0zODgsNyArMzkxLDggQEAKIAogCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgewogCQkJYW0zMzV4X3RzY19zZV9hZGNfZG9uZShhZGNfZGV2LT5tZmRfdHNjYWRjKTsKLQkJCXJldHVybiAtRUFHQUlOOworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWdvdG8gZXJyX3VubG9jazsKIAkJfQogCX0KIAltYXBfdmFsID0gYWRjX2Rldi0+Y2hhbm5lbF9zdGVwW2NoYW4tPnNjYW5faW5kZXhdOwpAQCAtNDE0LDggKzQxOCwxMSBAQAogCWFtMzM1eF90c2Nfc2VfYWRjX2RvbmUoYWRjX2Rldi0+bWZkX3RzY2FkYyk7CiAKIAlpZiAoZm91bmQgPT0gZmFsc2UpCi0JCXJldHVybiAtRUJVU1k7Ci0JcmV0dXJuIElJT19WQUxfSU5UOworCQlyZXQgPSAgLUVCVVNZOworCitlcnJfdW5sb2NrOgorCW11dGV4X3VubG9jaygmYWRjX2Rldi0+ZmlmbzFfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyB0aWFkY19pbmZvID0gewpAQCAtNDgzLDYgKzQ5MCw3IEBACiAKIAl0aWFkY19zdGVwX2NvbmZpZyhpbmRpb19kZXYpOwogCXRpYWRjX3dyaXRlbChhZGNfZGV2LCBSRUdfRklGTzFUSFIsIEZJRk8xX1RIUkVTSE9MRCk7CisJbXV0ZXhfaW5pdCgmYWRjX2Rldi0+ZmlmbzFfbG9jayk7CiAKIAllcnIgPSB0aWFkY19jaGFubmVsX2luaXQoaW5kaW9fZGV2LCBhZGNfZGV2LT5jaGFubmVscyk7CiAJaWYgKGVyciA8IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9idWZmZXIvaW5kdXN0cmlhbGlvLWJ1ZmZlci1jYi5jIGIvZHJpdmVycy9paW8vYnVmZmVyL2luZHVzdHJpYWxpby1idWZmZXItY2IuYwppbmRleCAzMjMwNzljLi5iOGY1NTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9idWZmZXIvaW5kdXN0cmlhbGlvLWJ1ZmZlci1jYi5jCisrKyBiL2RyaXZlcnMvaWlvL2J1ZmZlci9pbmR1c3RyaWFsaW8tYnVmZmVyLWNiLmMKQEAgLTE4LDYgKzE4LDcgQEAKIAlpbnQgKCpjYikoY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSk7CiAJdm9pZCAqcHJpdmF0ZTsKIAlzdHJ1Y3QgaWlvX2NoYW5uZWwgKmNoYW5uZWxzOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiB9OwogCiBzdGF0aWMgc3RydWN0IGlpb19jYl9idWZmZXIgKmJ1ZmZlcl90b19jYl9idWZmZXIoc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlcikKQEAgLTUyLDcgKzUzLDYgQEAKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBpaW9fY2JfYnVmZmVyICpjYl9idWZmOwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAJc3RydWN0IGlpb19jaGFubmVsICpjaGFuOwogCiAJY2JfYnVmZiA9IGt6YWxsb2Moc2l6ZW9mKCpjYl9idWZmKSwgR0ZQX0tFUk5FTCk7CkBAIC03MiwxNyArNzIsMTcgQEAKIAkJZ290byBlcnJvcl9mcmVlX2NiX2J1ZmY7CiAJfQogCi0JaW5kaW9fZGV2ID0gY2JfYnVmZi0+Y2hhbm5lbHNbMF0uaW5kaW9fZGV2OworCWNiX2J1ZmYtPmluZGlvX2RldiA9IGNiX2J1ZmYtPmNoYW5uZWxzWzBdLmluZGlvX2RldjsKIAljYl9idWZmLT5idWZmZXIuc2Nhbl9tYXNrCi0JCT0ga2NhbGxvYyhCSVRTX1RPX0xPTkdTKGluZGlvX2Rldi0+bWFza2xlbmd0aCksIHNpemVvZihsb25nKSwKLQkJCSAgR0ZQX0tFUk5FTCk7CisJCT0ga2NhbGxvYyhCSVRTX1RPX0xPTkdTKGNiX2J1ZmYtPmluZGlvX2Rldi0+bWFza2xlbmd0aCksCisJCQkgIHNpemVvZihsb25nKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNiX2J1ZmYtPmJ1ZmZlci5zY2FuX21hc2sgPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yX3JlbGVhc2VfY2hhbm5lbHM7CiAJfQogCWNoYW4gPSAmY2JfYnVmZi0+Y2hhbm5lbHNbMF07CiAJd2hpbGUgKGNoYW4tPmluZGlvX2RldikgewotCQlpZiAoY2hhbi0+aW5kaW9fZGV2ICE9IGluZGlvX2RldikgeworCQlpZiAoY2hhbi0+aW5kaW9fZGV2ICE9IGNiX2J1ZmYtPmluZGlvX2RldikgewogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gZXJyb3JfZnJlZV9zY2FuX21hc2s7CiAJCX0KQEAgLTEwNSwxNyArMTA1LDE0IEBACiAKIGludCBpaW9fY2hhbm5lbF9zdGFydF9hbGxfY2Ioc3RydWN0IGlpb19jYl9idWZmZXIgKmNiX2J1ZmYpCiB7Ci0JcmV0dXJuIGlpb191cGRhdGVfYnVmZmVycyhjYl9idWZmLT5jaGFubmVsc1swXS5pbmRpb19kZXYsCi0JCQkJICAmY2JfYnVmZi0+YnVmZmVyLAorCXJldHVybiBpaW9fdXBkYXRlX2J1ZmZlcnMoY2JfYnVmZi0+aW5kaW9fZGV2LCAmY2JfYnVmZi0+YnVmZmVyLAogCQkJCSAgTlVMTCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpaW9fY2hhbm5lbF9zdGFydF9hbGxfY2IpOwogCiB2b2lkIGlpb19jaGFubmVsX3N0b3BfYWxsX2NiKHN0cnVjdCBpaW9fY2JfYnVmZmVyICpjYl9idWZmKQogewotCWlpb191cGRhdGVfYnVmZmVycyhjYl9idWZmLT5jaGFubmVsc1swXS5pbmRpb19kZXYsCi0JCQkgICBOVUxMLAotCQkJICAgJmNiX2J1ZmYtPmJ1ZmZlcik7CisJaWlvX3VwZGF0ZV9idWZmZXJzKGNiX2J1ZmYtPmluZGlvX2RldiwgTlVMTCwgJmNiX2J1ZmYtPmJ1ZmZlcik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpaW9fY2hhbm5lbF9zdG9wX2FsbF9jYik7CiAKQEAgLTEzMyw2ICsxMzAsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlpb19jaGFubmVsX2NiX2dldF9jaGFubmVscyk7CiAKK3N0cnVjdCBpaW9fZGV2CisqaWlvX2NoYW5uZWxfY2JfZ2V0X2lpb19kZXYoY29uc3Qgc3RydWN0IGlpb19jYl9idWZmZXIgKmNiX2J1ZmZlcikKK3sKKwlyZXR1cm4gY2JfYnVmZmVyLT5pbmRpb19kZXY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpaW9fY2hhbm5lbF9jYl9nZXRfaWlvX2Rldik7CisKIE1PRFVMRV9BVVRIT1IoIkpvbmF0aGFuIENhbWVyb24gPGppYzIzQGtlcm5lbC5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkluZHVzdHJpYWwgSS9PIGNhbGxiYWNrIGJ1ZmZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYnVmZmVyL2luZHVzdHJpYWxpby10cmlnZ2VyZWQtYnVmZmVyLmMgYi9kcml2ZXJzL2lpby9idWZmZXIvaW5kdXN0cmlhbGlvLXRyaWdnZXJlZC1idWZmZXIuYwppbmRleCA0YjI4NThiLi5kM2RiMWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9idWZmZXIvaW5kdXN0cmlhbGlvLXRyaWdnZXJlZC1idWZmZXIuYworKysgYi9kcml2ZXJzL2lpby9idWZmZXIvaW5kdXN0cmlhbGlvLXRyaWdnZXJlZC1idWZmZXIuYwpAQCAtOTgsNiArOTgsNDggQEAKIH0KIEVYUE9SVF9TWU1CT0woaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cCk7CiAKK3N0YXRpYyB2b2lkIGRldm1faWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW4oc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMpCit7CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cCgqKHN0cnVjdCBpaW9fZGV2ICoqKXJlcyk7Cit9CisKK2ludCBkZXZtX2lpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgaXJxcmV0dXJuX3QgKCpoKShpbnQgaXJxLCB2b2lkICpwKSwKKwkJCQkgICAgaXJxcmV0dXJuX3QgKCp0aHJlYWQpKGludCBpcnEsIHZvaWQgKnApLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgKm9wcykKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqKnB0cjsKKwlpbnQgcmV0OworCisJcHRyID0gZGV2cmVzX2FsbG9jKGRldm1faWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW4sIHNpemVvZigqcHRyKSwKKwkJCSAgIEdGUF9LRVJORUwpOworCWlmICghcHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCSpwdHIgPSBpbmRpb19kZXY7CisKKwlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsIGgsIHRocmVhZCwgb3BzKTsKKwlpZiAoIXJldCkKKwkJZGV2cmVzX2FkZChkZXYsIHB0cik7CisJZWxzZQorCQlkZXZyZXNfZnJlZShwdHIpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldm1faWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXApOworCit2b2lkIGRldm1faWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJaW50IHJjOworCisJcmMgPSBkZXZyZXNfcmVsZWFzZShkZXYsIGRldm1faWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW4sCisJCQkgICAgZGV2bV9paW9fZGV2aWNlX21hdGNoLCBpbmRpb19kZXYpOworCVdBUk5fT04ocmMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGV2bV9paW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKTsKKwogTU9EVUxFX0FVVEhPUigiTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklJTyBoZWxwZXIgZnVuY3Rpb25zIGZvciBzZXR0aW5nIHVwIHRyaWdnZXJlZCBidWZmZXJzIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9jaGVtaWNhbC9LY29uZmlnIGIvZHJpdmVycy9paW8vY2hlbWljYWwvS2NvbmZpZwppbmRleCA0YmNjMDI1Li5jZWE3Zjk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9jaGVtaWNhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWlvL2NoZW1pY2FsL0tjb25maWcKQEAgLTE2LDYgKzE2LDcgQEAKIAkgQXRsYXMgU2NpZW50aWZpYyBPRU0gU00gc2Vuc29yczoKIAkgICAgKiBwSCBTTSBzZW5zb3IKIAkgICAgKiBFQyBTTSBzZW5zb3IKKwkgICAgKiBPUlAgU00gc2Vuc29yCiAKIAkgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYXRsYXMtcGgtc2Vuc29yLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vY2hlbWljYWwvYXRsYXMtcGgtc2Vuc29yLmMgYi9kcml2ZXJzL2lpby9jaGVtaWNhbC9hdGxhcy1waC1zZW5zb3IuYwppbmRleCBhZTAzOGE1Li5iZDMyMWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9jaGVtaWNhbC9hdGxhcy1waC1zZW5zb3IuYworKysgYi9kcml2ZXJzL2lpby9jaGVtaWNhbC9hdGxhcy1waC1zZW5zb3IuYwpAQCAtNjYsMTIgKzY2LDE3IEBACiAjZGVmaW5lIEFUTEFTX1JFR19URFNfREFUQQkJMHgxYwogI2RlZmluZSBBVExBU19SRUdfUFNTX0RBVEEJCTB4MjAKIAorI2RlZmluZSBBVExBU19SRUdfT1JQX0NBTElCX1NUQVRVUwkweDBkCisjZGVmaW5lIEFUTEFTX1JFR19PUlBfREFUQQkJMHgwZQorCiAjZGVmaW5lIEFUTEFTX1BIX0lOVF9USU1FX0lOX1VTCQk0NTAwMDAKICNkZWZpbmUgQVRMQVNfRUNfSU5UX1RJTUVfSU5fVVMJCTY1MDAwMAorI2RlZmluZSBBVExBU19PUlBfSU5UX1RJTUVfSU5fVVMJNDUwMDAwCiAKIGVudW0gewogCUFUTEFTX1BIX1NNLAogCUFUTEFTX0VDX1NNLAorCUFUTEFTX09SUF9TTSwKIH07CiAKIHN0cnVjdCBhdGxhc19kYXRhIHsKQEAgLTg0LDI2ICs4OSwxMCBAQAogCV9fYmUzMiBidWZmZXJbNl07IC8qIDk2LWJpdCBkYXRhICsgMzItYml0IHBhZCArIDY0LWJpdCB0aW1lc3RhbXAgKi8KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlIGF0bGFzX3ZvbGF0aWxlX3Jhbmdlc1tdID0gewotCXJlZ21hcF9yZWdfcmFuZ2UoQVRMQVNfUkVHX0lOVF9DT05UUk9MLCBBVExBU19SRUdfSU5UX0NPTlRST0wpLAotCXJlZ21hcF9yZWdfcmFuZ2UoQVRMQVNfUkVHX1BIX0RBVEEsIEFUTEFTX1JFR19QSF9EQVRBICsgNCksCi0JcmVnbWFwX3JlZ19yYW5nZShBVExBU19SRUdfRUNfREFUQSwgQVRMQVNfUkVHX1BTU19EQVRBICsgNCksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgYXRsYXNfdm9sYXRpbGVfdGFibGUgPSB7Ci0JLnllc19yYW5nZXMJPSBhdGxhc192b2xhdGlsZV9yYW5nZXMsCi0JLm5feWVzX3Jhbmdlcwk9IEFSUkFZX1NJWkUoYXRsYXNfdm9sYXRpbGVfcmFuZ2VzKSwKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhdGxhc19yZWdtYXBfY29uZmlnID0gewogCS5uYW1lID0gQVRMQVNfUkVHTUFQX05BTUUsCi0KIAkucmVnX2JpdHMgPSA4LAogCS52YWxfYml0cyA9IDgsCi0KLQkudm9sYXRpbGVfdGFibGUgPSAmYXRsYXNfdm9sYXRpbGVfdGFibGUsCi0JLm1heF9yZWdpc3RlciA9IEFUTEFTX1JFR19QU1NfREFUQSArIDQsCi0JLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgYXRsYXNfcGhfY2hhbm5lbHNbXSA9IHsKQEAgLTE3NSw2ICsxNjQsMjMgQEAKIAl9LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGF0bGFzX29ycF9jaGFubmVsc1tdID0geworCXsKKwkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJLmFkZHJlc3MgPSBBVExBU19SRUdfT1JQX0RBVEEsCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPQorCQkJQklUKElJT19DSEFOX0lORk9fUkFXKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwKKwkJLnNjYW5faW5kZXggPSAwLAorCQkuc2Nhbl90eXBlID0geworCQkJLnNpZ24gPSAncycsCisJCQkucmVhbGJpdHMgPSAzMiwKKwkJCS5zdG9yYWdlYml0cyA9IDMyLAorCQkJLmVuZGlhbm5lc3MgPSBJSU9fQkUsCisJCX0sCisJfSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgxKSwKK307CisKIHN0YXRpYyBpbnQgYXRsYXNfY2hlY2tfcGhfY2FsaWJyYXRpb24oc3RydWN0IGF0bGFzX2RhdGEgKmRhdGEpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmRhdGEtPmNsaWVudC0+ZGV2OwpAQCAtMjQwLDYgKzI0NiwyMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGF0bGFzX2NoZWNrX29ycF9jYWxpYnJhdGlvbihzdHJ1Y3QgYXRsYXNfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGF0YS0+Y2xpZW50LT5kZXY7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJcmV0ID0gcmVnbWFwX3JlYWQoZGF0YS0+cmVnbWFwLCBBVExBU19SRUdfT1JQX0NBTElCX1NUQVRVUywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICghdmFsKQorCQlkZXZfd2FybihkZXYsICJkZXZpY2UgaGFzIG5vdCBiZWVuIGNhbGlicmF0ZWRcbiIpOworCisJcmV0dXJuIDA7Cit9OworCiBzdHJ1Y3QgYXRsYXNfZGV2aWNlIHsKIAljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbm5lbHM7CiAJaW50IG51bV9jaGFubmVsczsKQEAgLTI2NCw3ICsyODYsMTMgQEAKIAkJCQkuY2FsaWJyYXRpb24gPSAmYXRsYXNfY2hlY2tfZWNfY2FsaWJyYXRpb24sCiAJCQkJLmRlbGF5ID0gQVRMQVNfRUNfSU5UX1RJTUVfSU5fVVMsCiAJfSwKLQorCVtBVExBU19PUlBfU01dID0geworCQkJCS5jaGFubmVscyA9IGF0bGFzX29ycF9jaGFubmVscywKKwkJCQkubnVtX2NoYW5uZWxzID0gMiwKKwkJCQkuZGF0YV9yZWcgPSBBVExBU19SRUdfT1JQX0RBVEEsCisJCQkJLmNhbGlicmF0aW9uID0gJmF0bGFzX2NoZWNrX29ycF9jYWxpYnJhdGlvbiwKKwkJCQkuZGVsYXkgPSBBVExBU19PUlBfSU5UX1RJTUVfSU5fVVMsCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgYXRsYXNfc2V0X3Bvd2VybW9kZShzdHJ1Y3QgYXRsYXNfZGF0YSAqZGF0YSwgaW50IG9uKQpAQCAtNDAyLDE1ICs0MzAsMTQgQEAKIAkJY2FzZSBJSU9fUEg6CiAJCWNhc2UgSUlPX0NPTkNFTlRSQVRJT046CiAJCWNhc2UgSUlPX0VMRUNUUklDQUxDT05EVUNUSVZJVFk6Ci0JCQltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJY2FzZSBJSU9fVk9MVEFHRToKKwkJCXJldCA9IGlpb19kZXZpY2VfY2xhaW1fZGlyZWN0X21vZGUoaW5kaW9fZGV2KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKIAotCQkJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKQotCQkJCXJldCA9IC1FQlVTWTsKLQkJCWVsc2UKLQkJCQlyZXQgPSBhdGxhc19yZWFkX21lYXN1cmVtZW50KGRhdGEsCi0JCQkJCQkJY2hhbi0+YWRkcmVzcywgJnJlZyk7CisJCQlyZXQgPSBhdGxhc19yZWFkX21lYXN1cmVtZW50KGRhdGEsIGNoYW4tPmFkZHJlc3MsICZyZWcpOwogCi0JCQltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCQkJaWlvX2RldmljZV9yZWxlYXNlX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldCA9IC1FSU5WQUw7CkBAIC00MzQsMTIgKzQ2MSwxNiBAQAogCQkJYnJlYWs7CiAJCWNhc2UgSUlPX0VMRUNUUklDQUxDT05EVUNUSVZJVFk6CiAJCQkqdmFsID0gMTsgLyogMC4wMDAwMSAqLwotCQkJKnZhbCA9IDEwMDAwMDsKKwkJCSp2YWwyID0gMTAwMDAwOwogCQkJYnJlYWs7CiAJCWNhc2UgSUlPX0NPTkNFTlRSQVRJT046CiAJCQkqdmFsID0gMDsgLyogMC4wMDAwMDAwMDEgKi8KIAkJCSp2YWwyID0gMTAwMDsKIAkJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX05BTk87CisJCWNhc2UgSUlPX1ZPTFRBR0U6CisJCQkqdmFsID0gMTsgLyogMC4xICovCisJCQkqdmFsMiA9IDEwOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtNDc1LDYgKzUwNiw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYXRsYXNfaWRbXSA9IHsKIAl7ICJhdGxhcy1waC1zbSIsIEFUTEFTX1BIX1NNfSwKIAl7ICJhdGxhcy1lYy1zbSIsIEFUTEFTX0VDX1NNfSwKKwl7ICJhdGxhcy1vcnAtc20iLCBBVExBU19PUlBfU019LAogCXt9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGF0bGFzX2lkKTsKQEAgLTQ4Miw2ICs1MTQsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXRsYXNfZHRfaWRzW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJhdGxhcyxwaC1zbSIsIC5kYXRhID0gKHZvaWQgKilBVExBU19QSF9TTSwgfSwKIAl7IC5jb21wYXRpYmxlID0gImF0bGFzLGVjLXNtIiwgLmRhdGEgPSAodm9pZCAqKUFUTEFTX0VDX1NNLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiYXRsYXMsb3JwLXNtIiwgLmRhdGEgPSAodm9pZCAqKUFUTEFTX09SUF9TTSwgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhdGxhc19kdF9pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vY2hlbWljYWwvdno4OXguYyBiL2RyaXZlcnMvaWlvL2NoZW1pY2FsL3Z6ODl4LmMKaW5kZXggNjUyNjQ5ZC4uOGUwZTQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vY2hlbWljYWwvdno4OXguYworKysgYi9kcml2ZXJzL2lpby9jaGVtaWNhbC92ejg5eC5jCkBAIC0xOSwyNSArMTksNTUgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogCiAjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lpby9zeXNmcy5oPgogCiAjZGVmaW5lIFZaODlYX1JFR19NRUFTVVJFTUVOVAkJMHgwOQotI2RlZmluZSBWWjg5WF9SRUdfTUVBU1VSRU1FTlRfU0laRQk2CisjZGVmaW5lIFZaODlYX1JFR19NRUFTVVJFTUVOVF9SRF9TSVpFCTYKKyNkZWZpbmUgVlo4OVhfUkVHX01FQVNVUkVNRU5UX1dSX1NJWkUJMwogCiAjZGVmaW5lIFZaODlYX1ZPQ19DTzJfSURYCQkwCiAjZGVmaW5lIFZaODlYX1ZPQ19TSE9SVF9JRFgJCTEKICNkZWZpbmUgVlo4OVhfVk9DX1RWT0NfSURYCQkyCiAjZGVmaW5lIFZaODlYX1ZPQ19SRVNJU1RBTkNFX0lEWAkzCiAKKyNkZWZpbmUgVlo4OVRFX1JFR19NRUFTVVJFTUVOVAkJMHgwYworI2RlZmluZSBWWjg5VEVfUkVHX01FQVNVUkVNRU5UX1JEX1NJWkUJNworI2RlZmluZSBWWjg5VEVfUkVHX01FQVNVUkVNRU5UX1dSX1NJWkUJNgorCisjZGVmaW5lIFZaODlURV9WT0NfVFZPQ19JRFgJCTAKKyNkZWZpbmUgVlo4OVRFX1ZPQ19DTzJfSURYCQkxCisjZGVmaW5lIFZaODlURV9WT0NfUkVTSVNUQU5DRV9JRFgJMgorCitlbnVtIHsKKwlWWjg5WCwKKwlWWjg5VEUsCit9OworCitzdHJ1Y3Qgdno4OXhfY2hpcF9kYXRhOworCiBzdHJ1Y3Qgdno4OXhfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwljb25zdCBzdHJ1Y3Qgdno4OXhfY2hpcF9kYXRhICpjaGlwOwogCXN0cnVjdCBtdXRleCBsb2NrOwogCWludCAoKnhmZXIpKHN0cnVjdCB2ejg5eF9kYXRhICpkYXRhLCB1OCBjbWQpOwogCisJYm9vbCBpc192YWxpZDsKIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlOwotCXU4IGJ1ZmZlcltWWjg5WF9SRUdfTUVBU1VSRU1FTlRfU0laRV07CisJdTggYnVmZmVyW1ZaODlURV9SRUdfTUVBU1VSRU1FTlRfUkRfU0laRV07Cit9OworCitzdHJ1Y3Qgdno4OXhfY2hpcF9kYXRhIHsKKwlib29sICgqdmFsaWQpKHN0cnVjdCB2ejg5eF9kYXRhICpkYXRhKTsKKwljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbm5lbHM7CisJdTggbnVtX2NoYW5uZWxzOworCisJdTggY21kOworCXU4IHJlYWRfc2l6ZTsKKwl1OCB3cml0ZV9zaXplOwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHZ6ODl4X2NoYW5uZWxzW10gPSB7CkBAIC03MCw2ICsxMDAsNDAgQEAKIAkJLmluZm9fbWFza19zZXBhcmF0ZSA9CiAJCQlCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwgQklUKElJT19DSEFOX0lORk9fU0NBTEUpLAogCQkuYWRkcmVzcyA9IFZaODlYX1ZPQ19SRVNJU1RBTkNFX0lEWCwKKwkJLnNjYW5faW5kZXggPSAtMSwKKwkJLnNjYW5fdHlwZSA9IHsKKwkJCS5lbmRpYW5uZXNzID0gSUlPX0xFLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgdno4OXRlX2NoYW5uZWxzW10gPSB7CisJeworCQkudHlwZSA9IElJT19DT05DRU5UUkFUSU9OLAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EX1ZPQywKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9CisJCQlCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpIHwgQklUKElJT19DSEFOX0lORk9fUkFXKSwKKwkJLmFkZHJlc3MgPSBWWjg5VEVfVk9DX1RWT0NfSURYLAorCX0sCisKKwl7CisJCS50eXBlID0gSUlPX0NPTkNFTlRSQVRJT04sCisJCS5jaGFubmVsMiA9IElJT19NT0RfQ08yLAorCQkubW9kaWZpZWQgPSAxLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0KKwkJCUJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCkgfCBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAorCQkuYWRkcmVzcyA9IFZaODlURV9WT0NfQ08yX0lEWCwKKwl9LAorCXsKKwkJLnR5cGUgPSBJSU9fUkVTSVNUQU5DRSwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9CisJCQlCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwgQklUKElJT19DSEFOX0lORk9fU0NBTEUpLAorCQkuYWRkcmVzcyA9IFZaODlURV9WT0NfUkVTSVNUQU5DRV9JRFgsCisJCS5zY2FuX2luZGV4ID0gLTEsCisJCS5zY2FuX3R5cGUgPSB7CisJCQkuZW5kaWFubmVzcyA9IElJT19CRSwKKwkJfSwKIAl9LAogfTsKIApAQCAtOTMsMjkgKzE1Nyw0NSBAQAogICogYWx3YXlzIHplcm8sIGFuZCBieSBhbHNvIGNvbmZpcm1pbmcgdGhlIFZPQ19zaG9ydCBpc24ndCB6ZXJvLgogICovCiAKLXN0YXRpYyBpbnQgdno4OXhfbWVhc3VyZW1lbnRfaXNfdmFsaWQoc3RydWN0IHZ6ODl4X2RhdGEgKmRhdGEpCitzdGF0aWMgYm9vbCB2ejg5eF9tZWFzdXJlbWVudF9pc192YWxpZChzdHJ1Y3Qgdno4OXhfZGF0YSAqZGF0YSkKIHsKIAlpZiAoZGF0YS0+YnVmZmVyW1ZaODlYX1ZPQ19TSE9SVF9JRFhdID09IDApCi0JCXJldHVybiAxOworCQlyZXR1cm4gdHJ1ZTsKIAotCXJldHVybiAhIShkYXRhLT5idWZmZXJbVlo4OVhfUkVHX01FQVNVUkVNRU5UX1NJWkUgLSAxXSA+IDApOworCXJldHVybiAhIShkYXRhLT5idWZmZXJbZGF0YS0+Y2hpcC0+cmVhZF9zaXplIC0gMV0gPiAwKTsKK30KKworLyogVlo4OVRFIGRldmljZSBoYXMgYSBtb2RpZmllZCBDUkMtOCB0d28gY29tcGxlbWVudCBjaGVjayAqLworc3RhdGljIGJvb2wgdno4OXRlX21lYXN1cmVtZW50X2lzX3ZhbGlkKHN0cnVjdCB2ejg5eF9kYXRhICpkYXRhKQoreworCXU4IGNyYyA9IDA7CisJaW50IGksIHN1bSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgKGRhdGEtPmNoaXAtPnJlYWRfc2l6ZSAtIDEpOyBpKyspIHsKKwkJc3VtID0gY3JjICsgZGF0YS0+YnVmZmVyW2ldOworCQljcmMgPSBzdW07CisJCWNyYyArPSBzdW0gLyAyNTY7CisJfQorCisJcmV0dXJuICEoKDB4ZmYgLSBjcmMpID09IGRhdGEtPmJ1ZmZlcltkYXRhLT5jaGlwLT5yZWFkX3NpemUgLSAxXSk7CiB9CiAKIHN0YXRpYyBpbnQgdno4OXhfaTJjX3hmZXIoc3RydWN0IHZ6ODl4X2RhdGEgKmRhdGEsIHU4IGNtZCkKIHsKKwljb25zdCBzdHJ1Y3Qgdno4OXhfY2hpcF9kYXRhICpjaGlwID0gZGF0YS0+Y2hpcDsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXN0cnVjdCBpMmNfbXNnIG1zZ1syXTsKIAlpbnQgcmV0OwotCXU4IGJ1ZlszXSA9IHsgY21kLCAwLCAwfTsKKwl1OCBidWZbNl0gPSB7IGNtZCwgMCwgMCwgMCwgMCwgMHhmMyB9OwogCiAJbXNnWzBdLmFkZHIgPSBjbGllbnQtPmFkZHI7CiAJbXNnWzBdLmZsYWdzID0gY2xpZW50LT5mbGFnczsKLQltc2dbMF0ubGVuID0gMzsKKwltc2dbMF0ubGVuID0gY2hpcC0+d3JpdGVfc2l6ZTsKIAltc2dbMF0uYnVmICA9IChjaGFyICopICZidWY7CiAKIAltc2dbMV0uYWRkciA9IGNsaWVudC0+YWRkcjsKIAltc2dbMV0uZmxhZ3MgPSBjbGllbnQtPmZsYWdzIHwgSTJDX01fUkQ7Ci0JbXNnWzFdLmxlbiA9IFZaODlYX1JFR19NRUFTVVJFTUVOVF9TSVpFOworCW1zZ1sxXS5sZW4gPSBjaGlwLT5yZWFkX3NpemU7CiAJbXNnWzFdLmJ1ZiA9IChjaGFyICopICZkYXRhLT5idWZmZXI7CiAKIAlyZXQgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2csIDIpOwpAQCAtMTMzLDcgKzIxMyw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgVlo4OVhfUkVHX01FQVNVUkVNRU5UX1NJWkU7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5jaGlwLT5yZWFkX3NpemU7IGkrKykgewogCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlKGNsaWVudCk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKQEAgLTE0NSwzMCArMjI1LDQ3IEBACiAKIHN0YXRpYyBpbnQgdno4OXhfZ2V0X21lYXN1cmVtZW50KHN0cnVjdCB2ejg5eF9kYXRhICpkYXRhKQogeworCWNvbnN0IHN0cnVjdCB2ejg5eF9jaGlwX2RhdGEgKmNoaXAgPSBkYXRhLT5jaGlwOwogCWludCByZXQ7CiAKIAkvKiBzZW5zb3IgY2FuIG9ubHkgYmUgcG9sbGVkIG9uY2UgYSBzZWNvbmQgbWF4IHBlciBkYXRhc2hlZXQgKi8KIAlpZiAoIXRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGUgKyBIWikpCi0JCXJldHVybiAwOworCQlyZXR1cm4gZGF0YS0+aXNfdmFsaWQgPyAwIDogLUVBR0FJTjsKIAotCXJldCA9IGRhdGEtPnhmZXIoZGF0YSwgVlo4OVhfUkVHX01FQVNVUkVNRU5UKTsKKwlkYXRhLT5pc192YWxpZCA9IGZhbHNlOworCWRhdGEtPmxhc3RfdXBkYXRlID0gamlmZmllczsKKworCXJldCA9IGRhdGEtPnhmZXIoZGF0YSwgY2hpcC0+Y21kKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IHZ6ODl4X21lYXN1cmVtZW50X2lzX3ZhbGlkKGRhdGEpOworCXJldCA9IGNoaXAtPnZhbGlkKGRhdGEpOwogCWlmIChyZXQpCiAJCXJldHVybiAtRUFHQUlOOwogCi0JZGF0YS0+bGFzdF91cGRhdGUgPSBqaWZmaWVzOworCWRhdGEtPmlzX3ZhbGlkID0gdHJ1ZTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZ6ODl4X2dldF9yZXNpc3RhbmNlX3JlYWRpbmcoc3RydWN0IHZ6ODl4X2RhdGEgKmRhdGEpCitzdGF0aWMgaW50IHZ6ODl4X2dldF9yZXNpc3RhbmNlX3JlYWRpbmcoc3RydWN0IHZ6ODl4X2RhdGEgKmRhdGEsCisJCQkJCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJCQlpbnQgKnZhbCkKIHsKLQl1OCAqYnVmID0gJmRhdGEtPmJ1ZmZlcltWWjg5WF9WT0NfUkVTSVNUQU5DRV9JRFhdOworCXU4ICp0bXAgPSAodTggKikgJmRhdGEtPmJ1ZmZlcltjaGFuLT5hZGRyZXNzXTsKIAotCXJldHVybiBidWZbMF0gfCAoYnVmWzFdIDw8IDgpOworCXN3aXRjaCAoY2hhbi0+c2Nhbl90eXBlLmVuZGlhbm5lc3MpIHsKKwljYXNlIElJT19MRToKKwkJKnZhbCA9IGxlMzJfdG9fY3B1cCgoX19sZTMyICopIHRtcCkgJiBHRU5NQVNLKDIzLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBJSU9fQkU6CisJCSp2YWwgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKSB0bXApID4+IDg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHZ6ODl4X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCkBAIC0xODcsMTUgKzI4NCwxNSBAQAogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAotCQlzd2l0Y2ggKGNoYW4tPmFkZHJlc3MpIHsKLQkJY2FzZSBWWjg5WF9WT0NfQ08yX0lEWDoKLQkJY2FzZSBWWjg5WF9WT0NfU0hPUlRfSURYOgotCQljYXNlIFZaODlYX1ZPQ19UVk9DX0lEWDoKKwkJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJCWNhc2UgSUlPX0NPTkNFTlRSQVRJT046CiAJCQkqdmFsID0gZGF0YS0+YnVmZmVyW2NoYW4tPmFkZHJlc3NdOwogCQkJcmV0dXJuIElJT19WQUxfSU5UOwotCQljYXNlIFZaODlYX1ZPQ19SRVNJU1RBTkNFX0lEWDoKLQkJCSp2YWwgPSB2ejg5eF9nZXRfcmVzaXN0YW5jZV9yZWFkaW5nKGRhdGEpOwotCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQljYXNlIElJT19SRVNJU1RBTkNFOgorCQkJcmV0ID0gdno4OXhfZ2V0X3Jlc2lzdGFuY2VfcmVhZGluZyhkYXRhLCBjaGFuLCB2YWwpOworCQkJaWYgKCFyZXQpCisJCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMjEwLDEyICszMDcsMTIgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIElJT19DSEFOX0lORk9fT0ZGU0VUOgotCQlzd2l0Y2ggKGNoYW4tPmFkZHJlc3MpIHsKLQkJY2FzZSBWWjg5WF9WT0NfQ08yX0lEWDoKKwkJc3dpdGNoIChjaGFuLT5jaGFubmVsMikgeworCQljYXNlIElJT19NT0RfQ08yOgogCQkJKnZhbCA9IDQ0OwogCQkJKnZhbDIgPSAyNTAwMDA7CiAJCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKLQkJY2FzZSBWWjg5WF9WT0NfVFZPQ19JRFg6CisJCWNhc2UgSUlPX01PRF9WT0M6CiAJCQkqdmFsID0gLTEzOwogCQkJcmV0dXJuIElJT19WQUxfSU5UOwogCQlkZWZhdWx0OgpAQCAtMjMyLDExICszMjksNDMgQEAKIAkuZHJpdmVyX21vZHVsZQk9IFRISVNfTU9EVUxFLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCB2ejg5eF9jaGlwX2RhdGEgdno4OXhfY2hpcHNbXSA9IHsKKwl7CisJCS52YWxpZCA9IHZ6ODl4X21lYXN1cmVtZW50X2lzX3ZhbGlkLAorCisJCS5jbWQgPSBWWjg5WF9SRUdfTUVBU1VSRU1FTlQsCisJCS5yZWFkX3NpemUgPSBWWjg5WF9SRUdfTUVBU1VSRU1FTlRfUkRfU0laRSwKKwkJLndyaXRlX3NpemUgPSBWWjg5WF9SRUdfTUVBU1VSRU1FTlRfV1JfU0laRSwKKworCQkuY2hhbm5lbHMgPSB2ejg5eF9jaGFubmVscywKKwkJLm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUodno4OXhfY2hhbm5lbHMpLAorCX0sCisJeworCQkudmFsaWQgPSB2ejg5dGVfbWVhc3VyZW1lbnRfaXNfdmFsaWQsCisKKwkJLmNtZCA9IFZaODlURV9SRUdfTUVBU1VSRU1FTlQsCisJCS5yZWFkX3NpemUgPSBWWjg5VEVfUkVHX01FQVNVUkVNRU5UX1JEX1NJWkUsCisJCS53cml0ZV9zaXplID0gVlo4OVRFX1JFR19NRUFTVVJFTUVOVF9XUl9TSVpFLAorCisJCS5jaGFubmVscyA9IHZ6ODl0ZV9jaGFubmVscywKKwkJLm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUodno4OXRlX2NoYW5uZWxzKSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdno4OXhfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzZ3gsdno4OXgiLCAuZGF0YSA9ICh2b2lkICopIFZaODlYIH0sCisJeyAuY29tcGF0aWJsZSA9ICJzZ3gsdno4OXRlIiwgLmRhdGEgPSAodm9pZCAqKSBWWjg5VEUgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB2ejg5eF9kdF9pZHMpOworCiBzdGF0aWMgaW50IHZ6ODl4X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCSAgICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKIAlzdHJ1Y3Qgdno4OXhfZGF0YSAqZGF0YTsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZDsKKwlpbnQgY2hpcF9pZDsKIAogCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqZGF0YSkpOwogCWlmICghaW5kaW9fZGV2KQpAQCAtMjUxLDggKzM4MCwxNSBAQAogCWVsc2UKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCisJb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2Uodno4OXhfZHRfaWRzLCAmY2xpZW50LT5kZXYpOworCWlmICghb2ZfaWQpCisJCWNoaXBfaWQgPSBpZC0+ZHJpdmVyX2RhdGE7CisJZWxzZQorCQljaGlwX2lkID0gKHVuc2lnbmVkIGxvbmcpb2ZfaWQtPmRhdGE7CisKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpbmRpb19kZXYpOwogCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKKwlkYXRhLT5jaGlwID0gJnZ6ODl4X2NoaXBzW2NoaXBfaWRdOwogCWRhdGEtPmxhc3RfdXBkYXRlID0gamlmZmllcyAtIEhaOwogCW11dGV4X2luaXQoJmRhdGEtPmxvY2spOwogCkBAIC0yNjEsMjQgKzM5NywxOSBAQAogCWluZGlvX2Rldi0+bmFtZSA9IGRldl9uYW1lKCZjbGllbnQtPmRldik7CiAJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOwogCi0JaW5kaW9fZGV2LT5jaGFubmVscyA9IHZ6ODl4X2NoYW5uZWxzOwotCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRSh2ejg5eF9jaGFubmVscyk7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGRhdGEtPmNoaXAtPmNoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gZGF0YS0+Y2hpcC0+bnVtX2NoYW5uZWxzOwogCiAJcmV0dXJuIGRldm1faWlvX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYsIGluZGlvX2Rldik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB2ejg5eF9pZFtdID0gewotCXsgInZ6ODl4IiwgMCB9LAorCXsgInZ6ODl4IiwgVlo4OVggfSwKKwl7ICJ2ejg5dGUiLCBWWjg5VEUgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgdno4OXhfaWQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB2ejg5eF9kdF9pZHNbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInNneCx2ejg5eCIgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB2ejg5eF9kdF9pZHMpOwotCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdno4OXhfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gInZ6ODl4IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2NvbW1vbi9oaWQtc2Vuc29ycy9oaWQtc2Vuc29yLWF0dHJpYnV0ZXMuYyBiL2RyaXZlcnMvaWlvL2NvbW1vbi9oaWQtc2Vuc29ycy9oaWQtc2Vuc29yLWF0dHJpYnV0ZXMuYwppbmRleCBlODFmNDM0Li5kYzMzYzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9jb21tb24vaGlkLXNlbnNvcnMvaGlkLXNlbnNvci1hdHRyaWJ1dGVzLmMKKysrIGIvZHJpdmVycy9paW8vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItYXR0cmlidXRlcy5jCkBAIC01Niw4ICs1Niw4IEBACiAJe0hJRF9VU0FHRV9TRU5TT1JfQUxTLCAwLCAxLCAwfSwKIAl7SElEX1VTQUdFX1NFTlNPUl9BTFMsIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfTFVYLCAxLCAwfSwKIAotCXtISURfVVNBR0VfU0VOU09SX1BSRVNTVVJFLCAwLCAxMDAwMDAsIDB9LAotCXtISURfVVNBR0VfU0VOU09SX1BSRVNTVVJFLCBISURfVVNBR0VfU0VOU09SX1VOSVRTX1BBU0NBTCwgMSwgMH0sCisJe0hJRF9VU0FHRV9TRU5TT1JfUFJFU1NVUkUsIDAsIDEwMCwgMH0sCisJe0hJRF9VU0FHRV9TRU5TT1JfUFJFU1NVUkUsIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfUEFTQ0FMLCAwLCAxMDAwfSwKIH07CiAKIHN0YXRpYyBpbnQgcG93XzEwKHVuc2lnbmVkIHBvd2VyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItdHJpZ2dlci5jIGIvZHJpdmVycy9paW8vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItdHJpZ2dlci5jCmluZGV4IDViNDFmOWQuLmEzY2NlM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2NvbW1vbi9oaWQtc2Vuc29ycy9oaWQtc2Vuc29yLXRyaWdnZXIuYworKysgYi9kcml2ZXJzL2lpby9jb21tb24vaGlkLXNlbnNvcnMvaGlkLXNlbnNvci10cmlnZ2VyLmMKQEAgLTEyMiw2ICsxMjIsMTQgQEAKICNlbmRpZgogfQogCitzdGF0aWMgdm9pZCBoaWRfc2Vuc29yX3NldF9wb3dlcl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9jb21tb24gKmF0dHJiID0gY29udGFpbmVyX29mKHdvcmssCisJCQkJCQkgICAgICAgc3RydWN0IGhpZF9zZW5zb3JfY29tbW9uLAorCQkJCQkJICAgICAgIHdvcmspOworCV9oaWRfc2Vuc29yX3Bvd2VyX3N0YXRlKGF0dHJiLCB0cnVlKTsKK30KKwogc3RhdGljIGludCBoaWRfc2Vuc29yX2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywKIAkJCQkJCWJvb2wgc3RhdGUpCiB7CkBAIC0xMzAsNiArMTM4LDcgQEAKIAogdm9pZCBoaWRfc2Vuc29yX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBoaWRfc2Vuc29yX2NvbW1vbiAqYXR0cmIpCiB7CisJY2FuY2VsX3dvcmtfc3luYygmYXR0cmItPndvcmspOwogCWlpb190cmlnZ2VyX3VucmVnaXN0ZXIoYXR0cmItPnRyaWdnZXIpOwogCWlpb190cmlnZ2VyX2ZyZWUoYXR0cmItPnRyaWdnZXIpOwogfQpAQCAtMTcwLDYgKzE3OSw5IEBACiAJCWdvdG8gZXJyb3JfdW5yZWdfdHJpZ2dlcjsKIAogCWlpb19kZXZpY2Vfc2V0X2RydmRhdGEoaW5kaW9fZGV2LCBhdHRyYik7CisKKwlJTklUX1dPUksoJmF0dHJiLT53b3JrLCBoaWRfc2Vuc29yX3NldF9wb3dlcl93b3JrKTsKKwogCXBtX3N1c3BlbmRfaWdub3JlX2NoaWxkcmVuKCZhdHRyYi0+cGRldi0+ZGV2LCB0cnVlKTsKIAlwbV9ydW50aW1lX2VuYWJsZSgmYXR0cmItPnBkZXYtPmRldik7CiAJLyogRGVmYXVsdCB0byAzIHNlY29uZHMsIGJ1dCBjYW4gYmUgY2hhbmdlZCBmcm9tIHN5c2ZzICovCkBAIC0xODcsOCArMTk5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woaGlkX3NlbnNvcl9zZXR1cF90cmlnZ2VyKTsKIAotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBoaWRfc2Vuc29yX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBfX21heWJlX3VudXNlZCBoaWRfc2Vuc29yX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CkBAIC0xOTcsMjEgKzIwOCwyNyBAQAogCXJldHVybiBfaGlkX3NlbnNvcl9wb3dlcl9zdGF0ZShhdHRyYiwgZmFsc2UpOwogfQogCi1zdGF0aWMgaW50IGhpZF9zZW5zb3JfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgaGlkX3NlbnNvcl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGhpZF9zZW5zb3JfY29tbW9uICphdHRyYiA9IGlpb19kZXZpY2VfZ2V0X2RydmRhdGEoaW5kaW9fZGV2KTsKLQotCXJldHVybiBfaGlkX3NlbnNvcl9wb3dlcl9zdGF0ZShhdHRyYiwgdHJ1ZSk7CisJc2NoZWR1bGVfd29yaygmYXR0cmItPndvcmspOworCXJldHVybiAwOwogfQogCi0jZW5kaWYKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgaGlkX3NlbnNvcl9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9jb21tb24gKmF0dHJiID0gaWlvX2RldmljZV9nZXRfZHJ2ZGF0YShpbmRpb19kZXYpOworCXJldHVybiBfaGlkX3NlbnNvcl9wb3dlcl9zdGF0ZShhdHRyYiwgdHJ1ZSk7Cit9CiAKIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGhpZF9zZW5zb3JfcG1fb3BzID0gewogCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGhpZF9zZW5zb3Jfc3VzcGVuZCwgaGlkX3NlbnNvcl9yZXN1bWUpCiAJU0VUX1JVTlRJTUVfUE1fT1BTKGhpZF9zZW5zb3Jfc3VzcGVuZCwKLQkJCSAgIGhpZF9zZW5zb3JfcmVzdW1lLCBOVUxMKQorCQkJICAgaGlkX3NlbnNvcl9ydW50aW1lX3Jlc3VtZSwgTlVMTCkKIH07CiBFWFBPUlRfU1lNQk9MKGhpZF9zZW5zb3JfcG1fb3BzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vY29tbW9uL3N0X3NlbnNvcnMvc3Rfc2Vuc29yc19idWZmZXIuYyBiL2RyaXZlcnMvaWlvL2NvbW1vbi9zdF9zZW5zb3JzL3N0X3NlbnNvcnNfYnVmZmVyLmMKaW5kZXggZDA2ZTcyOC4uZmU3Nzc1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vY29tbW9uL3N0X3NlbnNvcnMvc3Rfc2Vuc29yc19idWZmZXIuYworKysgYi9kcml2ZXJzL2lpby9jb21tb24vc3Rfc2Vuc29ycy9zdF9zZW5zb3JzX2J1ZmZlci5jCkBAIC02Myw3ICs2Myw3IEBACiAJICogdGhlIGhhcmR3YXJlIHRyaWdnZXIpIGFuZCB0aGUgaHdfdGltZXN0YW1wIG1heSBnZXQgdXBkYXRlZC4KIAkgKiBCeSBzdG9yaW5nIGl0IGluIGEgbG9jYWwgdmFyaWFibGUgZmlyc3QsIHdlIGFyZSBzYWZlLgogCSAqLwotCWlmIChzZGF0YS0+aHdfaXJxX3RyaWdnZXIpCisJaWYgKGlpb190cmlnZ2VyX3VzaW5nX293bihpbmRpb19kZXYpKQogCQl0aW1lc3RhbXAgPSBzZGF0YS0+aHdfdGltZXN0YW1wOwogCWVsc2UKIAkJdGltZXN0YW1wID0gaWlvX2dldF90aW1lX25zKGluZGlvX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9jb21tb24vc3Rfc2Vuc29ycy9zdF9zZW5zb3JzX2NvcmUuYyBiL2RyaXZlcnMvaWlvL2NvbW1vbi9zdF9zZW5zb3JzL3N0X3NlbnNvcnNfY29yZS5jCmluZGV4IDJkNTI4MmUuLjI4NWE2NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2NvbW1vbi9zdF9zZW5zb3JzL3N0X3NlbnNvcnNfY29yZS5jCisrKyBiL2RyaXZlcnMvaWlvL2NvbW1vbi9zdF9zZW5zb3JzL3N0X3NlbnNvcnNfY29yZS5jCkBAIC0yMzQsMzkgKzIzNCwzNSBAQAogCWludCBlcnI7CiAKIAkvKiBSZWd1bGF0b3JzIG5vdCBtYW5kYXRvcnksIGJ1dCBpZiByZXF1ZXN0ZWQgd2Ugc2hvdWxkIGVuYWJsZSB0aGVtLiAqLwotCXBkYXRhLT52ZGQgPSBkZXZtX3JlZ3VsYXRvcl9nZXRfb3B0aW9uYWwoaW5kaW9fZGV2LT5kZXYucGFyZW50LCAidmRkIik7Ci0JaWYgKCFJU19FUlIocGRhdGEtPnZkZCkpIHsKLQkJZXJyID0gcmVndWxhdG9yX2VuYWJsZShwZGF0YS0+dmRkKTsKLQkJaWYgKGVyciAhPSAwKSB7Ci0JCQlkZXZfd2FybigmaW5kaW9fZGV2LT5kZXYsCi0JCQkJICJGYWlsZWQgdG8gZW5hYmxlIHNwZWNpZmllZCBWZGQgc3VwcGx5XG4iKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQl9IGVsc2UgewotCQllcnIgPSBQVFJfRVJSKHBkYXRhLT52ZGQpOwotCQlpZiAoZXJyICE9IC1FTk9ERVYpCi0JCQlyZXR1cm4gZXJyOworCXBkYXRhLT52ZGQgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoaW5kaW9fZGV2LT5kZXYucGFyZW50LCAidmRkIik7CisJaWYgKElTX0VSUihwZGF0YS0+dmRkKSkgeworCQlkZXZfZXJyKCZpbmRpb19kZXYtPmRldiwgInVuYWJsZSB0byBnZXQgVmRkIHN1cHBseVxuIik7CisJCXJldHVybiBQVFJfRVJSKHBkYXRhLT52ZGQpOworCX0KKwllcnIgPSByZWd1bGF0b3JfZW5hYmxlKHBkYXRhLT52ZGQpOworCWlmIChlcnIgIT0gMCkgeworCQlkZXZfd2FybigmaW5kaW9fZGV2LT5kZXYsCisJCQkgIkZhaWxlZCB0byBlbmFibGUgc3BlY2lmaWVkIFZkZCBzdXBwbHlcbiIpOworCQlyZXR1cm4gZXJyOwogCX0KIAotCXBkYXRhLT52ZGRfaW8gPSBkZXZtX3JlZ3VsYXRvcl9nZXRfb3B0aW9uYWwoaW5kaW9fZGV2LT5kZXYucGFyZW50LCAidmRkaW8iKTsKLQlpZiAoIUlTX0VSUihwZGF0YS0+dmRkX2lvKSkgewotCQllcnIgPSByZWd1bGF0b3JfZW5hYmxlKHBkYXRhLT52ZGRfaW8pOwotCQlpZiAoZXJyICE9IDApIHsKLQkJCWRldl93YXJuKCZpbmRpb19kZXYtPmRldiwKLQkJCQkgIkZhaWxlZCB0byBlbmFibGUgc3BlY2lmaWVkIFZkZF9JTyBzdXBwbHlcbiIpOwotCQkJZ290byBzdF9zZW5zb3JzX2Rpc2FibGVfdmRkOwotCQl9Ci0JfSBlbHNlIHsKKwlwZGF0YS0+dmRkX2lvID0gZGV2bV9yZWd1bGF0b3JfZ2V0KGluZGlvX2Rldi0+ZGV2LnBhcmVudCwgInZkZGlvIik7CisJaWYgKElTX0VSUihwZGF0YS0+dmRkX2lvKSkgeworCQlkZXZfZXJyKCZpbmRpb19kZXYtPmRldiwgInVuYWJsZSB0byBnZXQgVmRkX0lPIHN1cHBseVxuIik7CiAJCWVyciA9IFBUUl9FUlIocGRhdGEtPnZkZF9pbyk7Ci0JCWlmIChlcnIgIT0gLUVOT0RFVikKLQkJCWdvdG8gc3Rfc2Vuc29yc19kaXNhYmxlX3ZkZDsKKwkJZ290byBzdF9zZW5zb3JzX2Rpc2FibGVfdmRkOworCX0KKwllcnIgPSByZWd1bGF0b3JfZW5hYmxlKHBkYXRhLT52ZGRfaW8pOworCWlmIChlcnIgIT0gMCkgeworCQlkZXZfd2FybigmaW5kaW9fZGV2LT5kZXYsCisJCQkgIkZhaWxlZCB0byBlbmFibGUgc3BlY2lmaWVkIFZkZF9JTyBzdXBwbHlcbiIpOworCQlnb3RvIHN0X3NlbnNvcnNfZGlzYWJsZV92ZGQ7CiAJfQogCiAJcmV0dXJuIDA7CiAKIHN0X3NlbnNvcnNfZGlzYWJsZV92ZGQ6Ci0JaWYgKCFJU19FUlJfT1JfTlVMTChwZGF0YS0+dmRkKSkKLQkJcmVndWxhdG9yX2Rpc2FibGUocGRhdGEtPnZkZCk7CisJcmVndWxhdG9yX2Rpc2FibGUocGRhdGEtPnZkZCk7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0woc3Rfc2Vuc29yc19wb3dlcl9lbmFibGUpOwpAQCAtMjc1LDExICsyNzEsOCBAQAogewogCXN0cnVjdCBzdF9zZW5zb3JfZGF0YSAqcGRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCi0JaWYgKCFJU19FUlJfT1JfTlVMTChwZGF0YS0+dmRkKSkKLQkJcmVndWxhdG9yX2Rpc2FibGUocGRhdGEtPnZkZCk7Ci0KLQlpZiAoIUlTX0VSUl9PUl9OVUxMKHBkYXRhLT52ZGRfaW8pKQotCQlyZWd1bGF0b3JfZGlzYWJsZShwZGF0YS0+dmRkX2lvKTsKKwlyZWd1bGF0b3JfZGlzYWJsZShwZGF0YS0+dmRkKTsKKwlyZWd1bGF0b3JfZGlzYWJsZShwZGF0YS0+dmRkX2lvKTsKIH0KIEVYUE9SVF9TWU1CT0woc3Rfc2Vuc29yc19wb3dlcl9kaXNhYmxlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vY29tbW9uL3N0X3NlbnNvcnMvc3Rfc2Vuc29yc190cmlnZ2VyLmMgYi9kcml2ZXJzL2lpby9jb21tb24vc3Rfc2Vuc29ycy9zdF9zZW5zb3JzX3RyaWdnZXIuYwppbmRleCBlNjZmMTJlLi5mYTczZTY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9jb21tb24vc3Rfc2Vuc29ycy9zdF9zZW5zb3JzX3RyaWdnZXIuYworKysgYi9kcml2ZXJzL2lpby9jb21tb24vc3Rfc2Vuc29ycy9zdF9zZW5zb3JzX3RyaWdnZXIuYwpAQCAtNjYsNyArNjYsNyBAQAogICogQGlycTogaXJxIG51bWJlcgogICogQHA6IHByaXZhdGUgaGFuZGxlciBkYXRhCiAgKi8KLWlycXJldHVybl90IHN0X3NlbnNvcnNfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcCkKK3N0YXRpYyBpcnFyZXR1cm5fdCBzdF9zZW5zb3JzX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnApCiB7CiAJc3RydWN0IGlpb190cmlnZ2VyICp0cmlnID0gcDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaWlvX3RyaWdnZXJfZ2V0X2RydmRhdGEodHJpZyk7CkBAIC04Miw3ICs4Miw3IEBACiAgKiBAaXJxOiBpcnEgbnVtYmVyCiAgKiBAcDogcHJpdmF0ZSBoYW5kbGVyIGRhdGEKICAqLwotaXJxcmV0dXJuX3Qgc3Rfc2Vuc29yc19pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKnApCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3Rfc2Vuc29yc19pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKnApCiB7CiAJc3RydWN0IGlpb190cmlnZ2VyICp0cmlnID0gcDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaWlvX3RyaWdnZXJfZ2V0X2RydmRhdGEodHJpZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9kYWMvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL2RhYy9LY29uZmlnCmluZGV4IGNhODE0NDcuLjEyMGIyNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2RhYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWlvL2RhYy9LY29uZmlnCkBAIC0xODEsNiArMTgxLDI1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIG1vZHVsZSBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCiAJICBhZDczMDMuCiAKK2NvbmZpZyBDSU9fREFDCisJdHJpc3RhdGUgIk1lYXN1cmVtZW50IENvbXB1dGluZyBDSU8tREFDIElJTyBkcml2ZXIiCisJZGVwZW5kcyBvbiBYODYgJiYgSVNBX0JVU19BUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIE1lYXN1cmVtZW50IENvbXB1dGluZyBDSU8tREFDCisJICBhbmFsb2cgb3V0cHV0IGRldmljZSBmYW1pbHkgKENJTy1EQUMxNiwgQ0lPLURBQzA4LCBQQzEwNC1EQUMwNikuIFRoZQorCSAgYmFzZSBwb3J0IGFkZHJlc3NlcyBmb3IgdGhlIGRldmljZXMgbWF5IGJlIGNvbmZpZ3VyZWQgdmlhIHRoZSBiYXNlCisJICBhcnJheSBtb2R1bGUgcGFyYW1ldGVyLgorCitjb25maWcgQUQ4ODAxCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFEODgwMS9BRDg4MDMgREFDIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQUQ4ODAxLCBBRDg4MDMgRGlnaXRhbCB0bworCSAgQW5hbG9nIENvbnZlcnRlcnMgKERBQykuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgYWQ4ODAxLgorCiBjb25maWcgTFBDMThYWF9EQUMKIAl0cmlzdGF0ZSAiTlhQIExQQzE4eHggREFDIGRyaXZlciIKIAlkZXBlbmRzIG9uIEFSQ0hfTFBDMThYWCB8fCBDT01QSUxFX1RFU1QKQEAgLTI0NSwxNiArMjY0LDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIG1jcDQ5MjIuCiAKLWNvbmZpZyBTVFgxMDQKLQl0cmlzdGF0ZSAiQXBleCBFbWJlZGRlZCBTeXN0ZW1zIFNUWDEwNCBEQUMgZHJpdmVyIgotCWRlcGVuZHMgb24gWDg2ICYmIElTQV9CVVNfQVBJCi0Jc2VsZWN0IEdQSU9MSUIKLQloZWxwCi0JICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIDItY2hhbm5lbCBEQUMgYW5kIEdQSU8gb24gdGhlCi0JICBBcGV4IEVtYmVkZGVkIFN5c3RlbXMgU1RYMTA0IGludGVncmF0ZWQgYW5hbG9nIFBDLzEwNCBjYXJkLiBUaGUgYmFzZQotCSAgcG9ydCBhZGRyZXNzZXMgZm9yIHRoZSBkZXZpY2VzIG1heSBiZSBjb25maWd1cmVkIHZpYSB0aGUgYmFzZSBhcnJheQotCSAgbW9kdWxlIHBhcmFtZXRlci4KLQogY29uZmlnIFZGNjEwX0RBQwogCXRyaXN0YXRlICJWeWJyaWQgdmY2MTAgREFDIGRyaXZlciIKIAlkZXBlbmRzIG9uIE9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9kYWMvTWFrZWZpbGUgYi9kcml2ZXJzL2lpby9kYWMvTWFrZWZpbGUKaW5kZXggOGI3OGQ1Yy4uMjc2NDJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vZGFjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaWlvL2RhYy9NYWtlZmlsZQpAQCAtMjAsMTEgKzIwLDEyIEBACiBvYmotJChDT05GSUdfQUQ1NzkxKSArPSBhZDU3OTEubwogb2JqLSQoQ09ORklHX0FENTY4NikgKz0gYWQ1Njg2Lm8KIG9iai0kKENPTkZJR19BRDczMDMpICs9IGFkNzMwMy5vCitvYmotJChDT05GSUdfQUQ4ODAxKSArPSBhZDg4MDEubworb2JqLSQoQ09ORklHX0NJT19EQUMpICs9IGNpby1kYWMubwogb2JqLSQoQ09ORklHX0xQQzE4WFhfREFDKSArPSBscGMxOHh4X2RhYy5vCiBvYmotJChDT05GSUdfTTYyMzMyKSArPSBtNjIzMzIubwogb2JqLSQoQ09ORklHX01BWDUxNykgKz0gbWF4NTE3Lm8KIG9iai0kKENPTkZJR19NQVg1ODIxKSArPSBtYXg1ODIxLm8KIG9iai0kKENPTkZJR19NQ1A0NzI1KSArPSBtY3A0NzI1Lm8KIG9iai0kKENPTkZJR19NQ1A0OTIyKSArPSBtY3A0OTIyLm8KLW9iai0kKENPTkZJR19TVFgxMDQpICs9IHN0eDEwNC5vCiBvYmotJChDT05GSUdfVkY2MTBfREFDKSArPSB2ZjYxMF9kYWMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vZGFjL2FkNTc1NS5jIGIvZHJpdmVycy9paW8vZGFjL2FkNTc1NS5jCmluZGV4IDBmZGU1OTMuLjVmNzk2ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2RhYy9hZDU3NTUuYworKysgYi9kcml2ZXJzL2lpby9kYWMvYWQ1NzU1LmMKQEAgLTY1NSw3ICs2NTUsNyBAQAogCiAJZGV2bnIgPSAwOwogCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobnAsIHBwKSB7Ci0JCWlmIChkZXZuciA+IEFENTc1NV9OVU1fQ0hBTk5FTFMpIHsKKwkJaWYgKGRldm5yID49IEFENTc1NV9OVU1fQ0hBTk5FTFMpIHsKIAkJCWRldl9lcnIoZGV2LAogCQkJCSJUaGVyZSBpcyB0byBtYW55IGNoYW5uZWxzIGRlZmluZWQgaW4gRFRcbiIpOwogCQkJZ290byBlcnJvcl9vdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9kYWMvYWQ4ODAxLmMgYi9kcml2ZXJzL2lpby9kYWMvYWQ4ODAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2ZmFhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2RhYy9hZDg4MDEuYwpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIElJTyBEQUMgZHJpdmVyIGZvciBBbmFsb2cgRGV2aWNlcyBBRDg4MDEgREFDCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEd3ZW5oYWVsIEdvYXZlYy1NZXJvdQorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworI2RlZmluZSBBRDg4MDFfQ0ZHX0FERFJfT0ZGU0VUIDgKKworZW51bSBhZDg4MDFfZGV2aWNlX2lkcyB7CisJSURfQUQ4ODAxLAorCUlEX0FEODgwMywKK307CisKK3N0cnVjdCBhZDg4MDFfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7CisJdW5zaWduZWQgY2hhciBkYWNfY2FjaGVbOF07IC8qIFZhbHVlIHdyaXRlIG9uIGVhY2ggY2hhbm5lbCAqLworCXVuc2lnbmVkIGludCB2cmVmaF9tdjsKKwl1bnNpZ25lZCBpbnQgdnJlZmxfbXY7CisJc3RydWN0IHJlZ3VsYXRvciAqdnJlZmhfcmVnOworCXN0cnVjdCByZWd1bGF0b3IgKnZyZWZsX3JlZzsKKworCV9fYmUxNiBkYXRhIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKK307CisKK3N0YXRpYyBpbnQgYWQ4ODAxX3NwaV93cml0ZShzdHJ1Y3QgYWQ4ODAxX3N0YXRlICpzdGF0ZSwKKwl1OCBjaGFubmVsLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworCXN0YXRlLT5kYXRhID0gY3B1X3RvX2JlMTYoKGNoYW5uZWwgPDwgQUQ4ODAxX0NGR19BRERSX09GRlNFVCkgfCB2YWx1ZSk7CisJcmV0dXJuIHNwaV93cml0ZShzdGF0ZS0+c3BpLCAmc3RhdGUtPmRhdGEsIHNpemVvZihzdGF0ZS0+ZGF0YSkpOworfQorCitzdGF0aWMgaW50IGFkODgwMV93cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50IHZhbCwgaW50IHZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgYWQ4ODAxX3N0YXRlICpzdGF0ZSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6CisJCWlmICh2YWwgPj0gMjU2IHx8IHZhbCA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXQgPSBhZDg4MDFfc3BpX3dyaXRlKHN0YXRlLCBjaGFuLT5jaGFubmVsLCB2YWwpOworCQlpZiAocmV0ID09IDApCisJCQlzdGF0ZS0+ZGFjX2NhY2hlW2NoYW4tPmNoYW5uZWxdID0gdmFsOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWQ4ODAxX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sIGludCAqdmFsLCBpbnQgKnZhbDIsIGxvbmcgaW5mbykKK3sKKwlzdHJ1Y3QgYWQ4ODAxX3N0YXRlICpzdGF0ZSA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlzd2l0Y2ggKGluZm8pIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQkqdmFsID0gc3RhdGUtPmRhY19jYWNoZVtjaGFuLT5jaGFubmVsXTsKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKKwkJKnZhbCA9IHN0YXRlLT52cmVmaF9tdiAtIHN0YXRlLT52cmVmbF9tdjsKKwkJKnZhbDIgPSA4OworCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMX0xPRzI7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX09GRlNFVDoKKwkJKnZhbCA9IHN0YXRlLT52cmVmbF9tdjsKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkODgwMV9pbmZvID0geworCS5yZWFkX3JhdyA9IGFkODgwMV9yZWFkX3JhdywKKwkud3JpdGVfcmF3ID0gYWQ4ODAxX3dyaXRlX3JhdywKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworI2RlZmluZSBBRDg4MDFfQ0hBTk5FTChjaGFuKSB7CQlcCisJLnR5cGUgPSBJSU9fVk9MVEFHRSwJCQlcCisJLmluZGV4ZWQgPSAxLAkJCQlcCisJLm91dHB1dCA9IDEsCQkJCVwKKwkuY2hhbm5lbCA9IGNoYW4sCQkJXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLCBcCisJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSB8CVwKKwkJQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSwgXAorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgYWQ4ODAxX2NoYW5uZWxzW10gPSB7CisJQUQ4ODAxX0NIQU5ORUwoMCksCisJQUQ4ODAxX0NIQU5ORUwoMSksCisJQUQ4ODAxX0NIQU5ORUwoMiksCisJQUQ4ODAxX0NIQU5ORUwoMyksCisJQUQ4ODAxX0NIQU5ORUwoNCksCisJQUQ4ODAxX0NIQU5ORUwoNSksCisJQUQ4ODAxX0NIQU5ORUwoNiksCisJQUQ4ODAxX0NIQU5ORUwoNyksCit9OworCitzdGF0aWMgaW50IGFkODgwMV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IGFkODgwMV9zdGF0ZSAqc3RhdGU7CisJY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgKmlkOworCWludCByZXQ7CisKKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJnNwaS0+ZGV2LCBzaXplb2YoKnN0YXRlKSk7CisJaWYgKGluZGlvX2RldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0YXRlID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdGF0ZS0+c3BpID0gc3BpOworCWlkID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKTsKKworCXN0YXRlLT52cmVmaF9yZWcgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJnNwaS0+ZGV2LCAidnJlZmgiKTsKKwlpZiAoSVNfRVJSKHN0YXRlLT52cmVmaF9yZWcpKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVnJlZmggcmVndWxhdG9yIG5vdCBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gUFRSX0VSUihzdGF0ZS0+dnJlZmhfcmVnKTsKKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHN0YXRlLT52cmVmaF9yZWcpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIHZyZWZoIHJlZ3VsYXRvcjogJWRcbiIsCisJCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Uoc3RhdGUtPnZyZWZoX3JlZyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgdG8gcmVhZCB2cmVmaCByZWd1bGF0b3I6ICVkXG4iLAorCQkJCXJldCk7CisJCWdvdG8gZXJyb3JfZGlzYWJsZV92cmVmaF9yZWc7CisJfQorCXN0YXRlLT52cmVmaF9tdiA9IHJldCAvIDEwMDA7CisKKwlpZiAoaWQtPmRyaXZlcl9kYXRhID09IElEX0FEODgwMykgeworCQlzdGF0ZS0+dnJlZmxfcmVnID0gZGV2bV9yZWd1bGF0b3JfZ2V0KCZzcGktPmRldiwgInZyZWZsIik7CisJCWlmIChJU19FUlIoc3RhdGUtPnZyZWZsX3JlZykpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVnJlZmwgcmVndWxhdG9yIG5vdCBzcGVjaWZpZWRcbiIpOworCQkJcmV0ID0gUFRSX0VSUihzdGF0ZS0+dnJlZmxfcmVnKTsKKwkJCWdvdG8gZXJyb3JfZGlzYWJsZV92cmVmaF9yZWc7CisJCX0KKworCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHN0YXRlLT52cmVmbF9yZWcpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwgIkZhaWxlZCB0byBlbmFibGUgdnJlZmwgcmVndWxhdG9yOiAlZFxuIiwKKwkJCQkJcmV0KTsKKwkJCWdvdG8gZXJyb3JfZGlzYWJsZV92cmVmaF9yZWc7CisJCX0KKworCQlyZXQgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Uoc3RhdGUtPnZyZWZsX3JlZyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwgIkZhaWxlZCB0byByZWFkIHZyZWZsIHJlZ3VsYXRvcjogJWRcbiIsCisJCQkJCXJldCk7CisJCQlnb3RvIGVycm9yX2Rpc2FibGVfdnJlZmxfcmVnOworCQl9CisJCXN0YXRlLT52cmVmbF9tdiA9IHJldCAvIDEwMDA7CisJfSBlbHNlIHsKKwkJc3RhdGUtPnZyZWZsX212ID0gMDsKKwkJc3RhdGUtPnZyZWZsX3JlZyA9IE5VTEw7CisJfQorCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgaW5kaW9fZGV2KTsKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJaW5kaW9fZGV2LT5pbmZvID0gJmFkODgwMV9pbmZvOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gYWQ4ODAxX2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShhZDg4MDFfY2hhbm5lbHMpOworCWluZGlvX2Rldi0+bmFtZSA9IGlkLT5uYW1lOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgaWlvIGRldmljZTogJWRcbiIsCisJCQkJcmV0KTsKKwkJZ290byBlcnJvcl9kaXNhYmxlX3ZyZWZsX3JlZzsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZGlzYWJsZV92cmVmbF9yZWc6CisJaWYgKHN0YXRlLT52cmVmbF9yZWcpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0YXRlLT52cmVmbF9yZWcpOworZXJyb3JfZGlzYWJsZV92cmVmaF9yZWc6CisJcmVndWxhdG9yX2Rpc2FibGUoc3RhdGUtPnZyZWZoX3JlZyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZDg4MDFfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBhZDg4MDFfc3RhdGUgKnN0YXRlID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChzdGF0ZS0+dnJlZmxfcmVnKQorCQlyZWd1bGF0b3JfZGlzYWJsZShzdGF0ZS0+dnJlZmxfcmVnKTsKKwlyZWd1bGF0b3JfZGlzYWJsZShzdGF0ZS0+dnJlZmhfcmVnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWQ4ODAxX2lkc1tdID0geworCXsiYWQ4ODAxIiwgSURfQUQ4ODAxfSwKKwl7ImFkODgwMyIsIElEX0FEODgwM30sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYWQ4ODAxX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDg4MDFfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImFkODgwMSIsCisJfSwKKwkucHJvYmUJCT0gYWQ4ODAxX3Byb2JlLAorCS5yZW1vdmUJCT0gYWQ4ODAxX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBhZDg4MDFfaWRzLAorfTsKK21vZHVsZV9zcGlfZHJpdmVyKGFkODgwMV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJHd2VuaGFlbCBHb2F2ZWMtTWVyb3UgPGd3ZW5oYWVsLmdvYXZlYy1tZXJvdUB0cmFidWNheXJlLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ4ODAxL0FEODgwMyBEQUMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2RhYy9jaW8tZGFjLmMgYi9kcml2ZXJzL2lpby9kYWMvY2lvLWRhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNzQzZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9kYWMvY2lvLWRhYy5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogSUlPIGRyaXZlciBmb3IgdGhlIE1lYXN1cmVtZW50IENvbXB1dGluZyBDSU8tREFDCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgV2lsbGlhbSBCcmVhdGhpdHQgR3JheQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgTWVhc3VyZW1lbnQgQ29tcHV0aW5nIGRldmljZXM6IENJTy1EQUMxNiwKKyAqIENJTy1EQUMwNiwgYW5kIFBDMTA0LURBQzA2LgorICovCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCisjZGVmaW5lIENJT19EQUNfTlVNX0NIQU4gMTYKKworI2RlZmluZSBDSU9fREFDX0NIQU4oY2hhbikgewkJCQlcCisJLnR5cGUgPSBJSU9fVk9MVEFHRSwJCQkJXAorCS5jaGFubmVsID0gY2hhbiwJCQkJXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAlcCisJLmluZGV4ZWQgPSAxLAkJCQkJXAorCS5vdXRwdXQgPSAxCQkJCQlcCit9CisKKyNkZWZpbmUgQ0lPX0RBQ19FWFRFTlQgMzIKKworc3RhdGljIHVuc2lnbmVkIGludCBiYXNlW21heF9udW1faXNhX2RldihDSU9fREFDX0VYVEVOVCldOworc3RhdGljIHVuc2lnbmVkIGludCBudW1fY2lvX2RhYzsKK21vZHVsZV9wYXJhbV9hcnJheShiYXNlLCB1aW50LCAmbnVtX2Npb19kYWMsIDApOworTU9EVUxFX1BBUk1fREVTQyhiYXNlLCAiTWVhc3VyZW1lbnQgQ29tcHV0aW5nIENJTy1EQUMgYmFzZSBhZGRyZXNzZXMiKTsKKworLyoqCisgKiBzdHJ1Y3QgY2lvX2RhY19paW8gLSBJSU8gZGV2aWNlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBjaGFuX291dF9zdGF0ZXM6CWNoYW5uZWxzJyBvdXRwdXQgc3RhdGVzCisgKiBAYmFzZToJCWJhc2UgcG9ydCBhZGRyZXNzIG9mIHRoZSBJSU8gZGV2aWNlCisgKi8KK3N0cnVjdCBjaW9fZGFjX2lpbyB7CisJaW50IGNoYW5fb3V0X3N0YXRlc1tDSU9fREFDX05VTV9DSEFOXTsKKwl1bnNpZ25lZCBpbnQgYmFzZTsKK307CisKK3N0YXRpYyBpbnQgY2lvX2RhY19yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLCBpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCit7CisJc3RydWN0IGNpb19kYWNfaWlvICpjb25zdCBwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlmIChtYXNrICE9IElJT19DSEFOX0lORk9fUkFXKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSp2YWwgPSBwcml2LT5jaGFuX291dF9zdGF0ZXNbY2hhbi0+Y2hhbm5lbF07CisKKwlyZXR1cm4gSUlPX1ZBTF9JTlQ7Cit9CisKK3N0YXRpYyBpbnQgY2lvX2RhY193cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50IHZhbCwgaW50IHZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgY2lvX2RhY19paW8gKmNvbnN0IHByaXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWNvbnN0IHVuc2lnbmVkIGludCBjaGFuX2FkZHJfb2Zmc2V0ID0gMiAqIGNoYW4tPmNoYW5uZWw7CisKKwlpZiAobWFzayAhPSBJSU9fQ0hBTl9JTkZPX1JBVykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBEQUMgY2FuIG9ubHkgYWNjZXB0IHVwIHRvIGEgMTYtYml0IHZhbHVlICovCisJaWYgKCh1bnNpZ25lZCBpbnQpdmFsID4gNjU1MzUpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJpdi0+Y2hhbl9vdXRfc3RhdGVzW2NoYW4tPmNoYW5uZWxdID0gdmFsOworCW91dHcodmFsLCBwcml2LT5iYXNlICsgY2hhbl9hZGRyX29mZnNldCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBjaW9fZGFjX2luZm8gPSB7CisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkucmVhZF9yYXcgPSBjaW9fZGFjX3JlYWRfcmF3LAorCS53cml0ZV9yYXcgPSBjaW9fZGFjX3dyaXRlX3JhdworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNpb19kYWNfY2hhbm5lbHNbQ0lPX0RBQ19OVU1fQ0hBTl0gPSB7CisJQ0lPX0RBQ19DSEFOKDApLCBDSU9fREFDX0NIQU4oMSksIENJT19EQUNfQ0hBTigyKSwgQ0lPX0RBQ19DSEFOKDMpLAorCUNJT19EQUNfQ0hBTig0KSwgQ0lPX0RBQ19DSEFOKDUpLCBDSU9fREFDX0NIQU4oNiksIENJT19EQUNfQ0hBTig3KSwKKwlDSU9fREFDX0NIQU4oOCksIENJT19EQUNfQ0hBTig5KSwgQ0lPX0RBQ19DSEFOKDEwKSwgQ0lPX0RBQ19DSEFOKDExKSwKKwlDSU9fREFDX0NIQU4oMTIpLCBDSU9fREFDX0NIQU4oMTMpLCBDSU9fREFDX0NIQU4oMTQpLCBDSU9fREFDX0NIQU4oMTUpCit9OworCitzdGF0aWMgaW50IGNpb19kYWNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaWQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgY2lvX2RhY19paW8gKnByaXY7CisJdW5zaWduZWQgaW50IGk7CisKKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoZGV2LCBzaXplb2YoKnByaXYpKTsKKwlpZiAoIWluZGlvX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIWRldm1fcmVxdWVzdF9yZWdpb24oZGV2LCBiYXNlW2lkXSwgQ0lPX0RBQ19FWFRFTlQsCisJCWRldl9uYW1lKGRldikpKSB7CisJCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIHJlcXVlc3QgcG9ydCBhZGRyZXNzZXMgKDB4JVgtMHglWClcbiIsCisJCQliYXNlW2lkXSwgYmFzZVtpZF0gKyBDSU9fREFDX0VYVEVOVCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaW5kaW9fZGV2LT5pbmZvID0gJmNpb19kYWNfaW5mbzsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGNpb19kYWNfY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBDSU9fREFDX05VTV9DSEFOOworCWluZGlvX2Rldi0+bmFtZSA9IGRldl9uYW1lKGRldik7CisKKwlwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlwcml2LT5iYXNlID0gYmFzZVtpZF07CisKKwkvKiBpbml0aWFsaXplIERBQyBvdXRwdXRzIHRvIDBWICovCisJZm9yIChpID0gMDsgaSA8IDMyOyBpICs9IDIpCisJCW91dHcoMCwgYmFzZVtpZF0gKyBpKTsKKworCXJldHVybiBkZXZtX2lpb19kZXZpY2VfcmVnaXN0ZXIoZGV2LCBpbmRpb19kZXYpOworfQorCitzdGF0aWMgc3RydWN0IGlzYV9kcml2ZXIgY2lvX2RhY19kcml2ZXIgPSB7CisJLnByb2JlID0gY2lvX2RhY19wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJjaW8tZGFjIgorCX0KK307CisKK21vZHVsZV9pc2FfZHJpdmVyKGNpb19kYWNfZHJpdmVyLCBudW1fY2lvX2RhYyk7CisKK01PRFVMRV9BVVRIT1IoIldpbGxpYW0gQnJlYXRoaXR0IEdyYXkgPHZpbGhlbG0uZ3JheUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1lYXN1cmVtZW50IENvbXB1dGluZyBDSU8tREFDIElJTyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2RhYy9zdHgxMDQuYyBiL2RyaXZlcnMvaWlvL2RhYy9zdHgxMDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyYTk3MS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2lpby9kYWMvc3R4MTA0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoKLSAqIERBQyBkcml2ZXIgZm9yIHRoZSBBcGV4IEVtYmVkZGVkIFN5c3RlbXMgU1RYMTA0Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgV2lsbGlhbSBCcmVhdGhpdHQgR3JheQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvL2RyaXZlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KLSNpbmNsdWRlIDxsaW51eC9paW8vdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLQotI2RlZmluZSBTVFgxMDRfTlVNX0NIQU4gMgotCi0jZGVmaW5lIFNUWDEwNF9DSEFOKGNoYW4pIHsJCQkJXAotCS50eXBlID0gSUlPX1ZPTFRBR0UsCQkJCVwKLQkuY2hhbm5lbCA9IGNoYW4sCQkJCVwKLQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJXAotCS5pbmRleGVkID0gMSwJCQkJCVwKLQkub3V0cHV0ID0gMQkJCQkJXAotfQotCi0jZGVmaW5lIFNUWDEwNF9FWFRFTlQgMTYKLQotc3RhdGljIHVuc2lnbmVkIGludCBiYXNlW21heF9udW1faXNhX2RldihTVFgxMDRfRVhURU5UKV07Ci1zdGF0aWMgdW5zaWduZWQgaW50IG51bV9zdHgxMDQ7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoYmFzZSwgdWludCwgJm51bV9zdHgxMDQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhiYXNlLCAiQXBleCBFbWJlZGRlZCBTeXN0ZW1zIFNUWDEwNCBiYXNlIGFkZHJlc3NlcyIpOwotCi0vKioKLSAqIHN0cnVjdCBzdHgxMDRfaWlvIC0gSUlPIGRldmljZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlCi0gKiBAY2hhbl9vdXRfc3RhdGVzOgljaGFubmVscycgb3V0cHV0IHN0YXRlcwotICogQGJhc2U6CQliYXNlIHBvcnQgYWRkcmVzcyBvZiB0aGUgSUlPIGRldmljZQotICovCi1zdHJ1Y3Qgc3R4MTA0X2lpbyB7Ci0JdW5zaWduZWQgY2hhbl9vdXRfc3RhdGVzW1NUWDEwNF9OVU1fQ0hBTl07Ci0JdW5zaWduZWQgYmFzZTsKLX07Ci0KLS8qKgotICogc3RydWN0IHN0eDEwNF9ncGlvIC0gR1BJTyBkZXZpY2UgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQotICogQGNoaXA6CWluc3RhbmNlIG9mIHRoZSBncGlvX2NoaXAKLSAqIEBsb2NrOglzeW5jaHJvbml6YXRpb24gbG9jayB0byBwcmV2ZW50IEkvTyByYWNlIGNvbmRpdGlvbnMKLSAqIEBiYXNlOgliYXNlIHBvcnQgYWRkcmVzcyBvZiB0aGUgR1BJTyBkZXZpY2UKLSAqIEBvdXRfc3RhdGU6CW91dHB1dCBiaXRzIHN0YXRlCi0gKi8KLXN0cnVjdCBzdHgxMDRfZ3BpbyB7Ci0Jc3RydWN0IGdwaW9fY2hpcCBjaGlwOwotCXNwaW5sb2NrX3QgbG9jazsKLQl1bnNpZ25lZCBpbnQgYmFzZTsKLQl1bnNpZ25lZCBpbnQgb3V0X3N0YXRlOwotfTsKLQotc3RhdGljIGludCBzdHgxMDRfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKLQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQotewotCXN0cnVjdCBzdHgxMDRfaWlvICpjb25zdCBwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQotCWlmIChtYXNrICE9IElJT19DSEFOX0lORk9fUkFXKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCSp2YWwgPSBwcml2LT5jaGFuX291dF9zdGF0ZXNbY2hhbi0+Y2hhbm5lbF07Ci0KLQlyZXR1cm4gSUlPX1ZBTF9JTlQ7Ci19Ci0KLXN0YXRpYyBpbnQgc3R4MTA0X3dyaXRlX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAotCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLCBpbnQgdmFsLCBpbnQgdmFsMiwgbG9uZyBtYXNrKQotewotCXN0cnVjdCBzdHgxMDRfaWlvICpjb25zdCBwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQljb25zdCB1bnNpZ25lZCBjaGFuX2FkZHJfb2Zmc2V0ID0gMiAqIGNoYW4tPmNoYW5uZWw7Ci0KLQlpZiAobWFzayAhPSBJSU9fQ0hBTl9JTkZPX1JBVykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwcml2LT5jaGFuX291dF9zdGF0ZXNbY2hhbi0+Y2hhbm5lbF0gPSB2YWw7Ci0Jb3V0dyh2YWwsIHByaXYtPmJhc2UgKyA0ICsgY2hhbl9hZGRyX29mZnNldCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBzdHgxMDRfaW5mbyA9IHsKLQkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAotCS5yZWFkX3JhdyA9IHN0eDEwNF9yZWFkX3JhdywKLQkud3JpdGVfcmF3ID0gc3R4MTA0X3dyaXRlX3JhdwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHN0eDEwNF9jaGFubmVsc1tTVFgxMDRfTlVNX0NIQU5dID0gewotCVNUWDEwNF9DSEFOKDApLAotCVNUWDEwNF9DSEFOKDEpCi19OwotCi1zdGF0aWMgaW50IHN0eDEwNF9ncGlvX2dldF9kaXJlY3Rpb24oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0KQotewotCWlmIChvZmZzZXQgPCA0KQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN0eDEwNF9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCXVuc2lnbmVkIGludCBvZmZzZXQpCi17Ci0JaWYgKG9mZnNldCA+PSA0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN0eDEwNF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0JaWYgKG9mZnNldCA8IDQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY2hpcC0+c2V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN0eDEwNF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQotewotCXN0cnVjdCBzdHgxMDRfZ3BpbyAqY29uc3Qgc3R4MTA0Z3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwotCi0JaWYgKG9mZnNldCA+PSA0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAhIShpbmIoc3R4MTA0Z3Bpby0+YmFzZSkgJiBCSVQob2Zmc2V0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0eDEwNF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAotCWludCB2YWx1ZSkKLXsKLQlzdHJ1Y3Qgc3R4MTA0X2dwaW8gKmNvbnN0IHN0eDEwNGdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKLQljb25zdCB1bnNpZ25lZCBpbnQgbWFzayA9IEJJVChvZmZzZXQpID4+IDQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChvZmZzZXQgPCA0KQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3R4MTA0Z3Bpby0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHZhbHVlKQotCQlzdHgxMDRncGlvLT5vdXRfc3RhdGUgfD0gbWFzazsKLQllbHNlCi0JCXN0eDEwNGdwaW8tPm91dF9zdGF0ZSAmPSB+bWFzazsKLQotCW91dGIoc3R4MTA0Z3Bpby0+b3V0X3N0YXRlLCBzdHgxMDRncGlvLT5iYXNlKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0eDEwNGdwaW8tPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBzdHgxMDRfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaWQpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKLQlzdHJ1Y3Qgc3R4MTA0X2lpbyAqcHJpdjsKLQlzdHJ1Y3Qgc3R4MTA0X2dwaW8gKnN0eDEwNGdwaW87Ci0JaW50IGVycjsKLQotCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYyhkZXYsIHNpemVvZigqcHJpdikpOwotCWlmICghaW5kaW9fZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXN0eDEwNGdwaW8gPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnN0eDEwNGdwaW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXN0eDEwNGdwaW8pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKCFkZXZtX3JlcXVlc3RfcmVnaW9uKGRldiwgYmFzZVtpZF0sIFNUWDEwNF9FWFRFTlQsCi0JCWRldl9uYW1lKGRldikpKSB7Ci0JCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIGxvY2sgcG9ydCBhZGRyZXNzZXMgKDB4JVgtMHglWClcbiIsCi0JCQliYXNlW2lkXSwgYmFzZVtpZF0gKyBTVFgxMDRfRVhURU5UKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlpbmRpb19kZXYtPmluZm8gPSAmc3R4MTA0X2luZm87Ci0JaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOwotCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBzdHgxMDRfY2hhbm5lbHM7Ci0JaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBTVFgxMDRfTlVNX0NIQU47Ci0JaW5kaW9fZGV2LT5uYW1lID0gZGV2X25hbWUoZGV2KTsKLQotCXByaXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXByaXYtPmJhc2UgPSBiYXNlW2lkXTsKLQotCS8qIGluaXRpYWxpemUgREFDIG91dHB1dCB0byAwViAqLwotCW91dHcoMCwgYmFzZVtpZF0gKyA0KTsKLQlvdXR3KDAsIGJhc2VbaWRdICsgNik7Ci0KLQllcnIgPSBkZXZtX2lpb19kZXZpY2VfcmVnaXN0ZXIoZGV2LCBpbmRpb19kZXYpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycihkZXYsICJJSU8gZGV2aWNlIHJlZ2lzdGVyaW5nIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCXN0eDEwNGdwaW8tPmNoaXAubGFiZWwgPSBkZXZfbmFtZShkZXYpOwotCXN0eDEwNGdwaW8tPmNoaXAucGFyZW50ID0gZGV2OwotCXN0eDEwNGdwaW8tPmNoaXAub3duZXIgPSBUSElTX01PRFVMRTsKLQlzdHgxMDRncGlvLT5jaGlwLmJhc2UgPSAtMTsKLQlzdHgxMDRncGlvLT5jaGlwLm5ncGlvID0gODsKLQlzdHgxMDRncGlvLT5jaGlwLmdldF9kaXJlY3Rpb24gPSBzdHgxMDRfZ3Bpb19nZXRfZGlyZWN0aW9uOwotCXN0eDEwNGdwaW8tPmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gc3R4MTA0X2dwaW9fZGlyZWN0aW9uX2lucHV0OwotCXN0eDEwNGdwaW8tPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IHN0eDEwNF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7Ci0Jc3R4MTA0Z3Bpby0+Y2hpcC5nZXQgPSBzdHgxMDRfZ3Bpb19nZXQ7Ci0Jc3R4MTA0Z3Bpby0+Y2hpcC5zZXQgPSBzdHgxMDRfZ3Bpb19zZXQ7Ci0Jc3R4MTA0Z3Bpby0+YmFzZSA9IGJhc2VbaWRdICsgMzsKLQlzdHgxMDRncGlvLT5vdXRfc3RhdGUgPSAweDA7Ci0KLQlzcGluX2xvY2tfaW5pdCgmc3R4MTA0Z3Bpby0+bG9jayk7Ci0KLQlkZXZfc2V0X2RydmRhdGEoZGV2LCBzdHgxMDRncGlvKTsKLQotCWVyciA9IGdwaW9jaGlwX2FkZF9kYXRhKCZzdHgxMDRncGlvLT5jaGlwLCBzdHgxMDRncGlvKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoZGV2LCAiR1BJTyByZWdpc3RlcmluZyBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzdHgxMDRfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlkKQotewotCXN0cnVjdCBzdHgxMDRfZ3BpbyAqY29uc3Qgc3R4MTA0Z3BpbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JZ3Bpb2NoaXBfcmVtb3ZlKCZzdHgxMDRncGlvLT5jaGlwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGlzYV9kcml2ZXIgc3R4MTA0X2RyaXZlciA9IHsKLQkucHJvYmUgPSBzdHgxMDRfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAic3R4MTA0IgotCX0sCi0JLnJlbW92ZSA9IHN0eDEwNF9yZW1vdmUKLX07Ci0KLW1vZHVsZV9pc2FfZHJpdmVyKHN0eDEwNF9kcml2ZXIsIG51bV9zdHgxMDQpOwotCi1NT0RVTEVfQVVUSE9SKCJXaWxsaWFtIEJyZWF0aGl0dCBHcmF5IDx2aWxoZWxtLmdyYXlAZ21haWwuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBcGV4IEVtYmVkZGVkIFN5c3RlbXMgU1RYMTA0IERBQyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2d5cm8vc3NwX2d5cm9fc2Vuc29yLmMgYi9kcml2ZXJzL2lpby9neXJvL3NzcF9neXJvX3NlbnNvci5jCmluZGV4IDBhOGFmZGQuLjFmMjVmNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2d5cm8vc3NwX2d5cm9fc2Vuc29yLmMKKysrIGIvZHJpdmVycy9paW8vZ3lyby9zc3BfZ3lyb19zZW5zb3IuYwpAQCAtNzQsNyArNzQsNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgc3RydWN0IGlpb19pbmZvIHNzcF9neXJvX2lpb19pbmZvID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBzc3BfZ3lyb19paW9faW5mbyA9IHsKIAkucmVhZF9yYXcgPSAmc3NwX2d5cm9fcmVhZF9yYXcsCiAJLndyaXRlX3JhdyA9ICZzc3BfZ3lyb193cml0ZV9yYXcsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaHVtaWRpdHkvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL2h1bWlkaXR5L0tjb25maWcKaW5kZXggNzM4YTg2ZC4uYjE3ZTJlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaHVtaWRpdHkvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9odW1pZGl0eS9LY29uZmlnCkBAIC02LDYgKzYsOCBAQAogY29uZmlnIEFNMjMxNQogICAgIHRyaXN0YXRlICJBb3NvbmcgQU0yMzE1IHJlbGF0aXZlIGh1bWlkaXR5IGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3IiCiAgICAgZGVwZW5kcyBvbiBJMkMKKyAgICBzZWxlY3QgSUlPX0JVRkZFUgorICAgIHNlbGVjdCBJSU9fVFJJR0dFUkVEX0JVRkZFUgogICAgIGhlbHAKICAgICAgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgQW9zb25nIEFNMjMxNQogICAgICAgcmVsYXRpdmUgaHVtaWRpdHkgYW5kIGFtYmllbnQgdGVtcGVyYXR1cmUgc2Vuc29yLgpAQCAtMjYsMTEgKzI4LDExIEBACiAJdHJpc3RhdGUgIlRJIEhEQzEwMHggcmVsYXRpdmUgaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvciIKIAlkZXBlbmRzIG9uIEkyQwogCWhlbHAKLQkgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBUSSBIREMxMDB4IHNlcmllcyBvZgotCSByZWxhdGl2ZSBodW1pZGl0eSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29ycy4KKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMKKwkgIEhEQzEwMDAgYW5kIEhEQzEwMDggcmVsYXRpdmUgaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvcnMuCiAKLQkgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQotCSB3aWxsIGJlIGNhbGxlZCBoZGMxMDB4LgorCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaGRjMTAweC4KIAogY29uZmlnIEhUVTIxCiAJdHJpc3RhdGUgIk1lYXN1cmVtZW50IFNwZWNpYWx0aWVzIEhUVTIxIGh1bWlkaXR5ICYgdGVtcGVyYXR1cmUgc2Vuc29yIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaHVtaWRpdHkvYW0yMzE1LmMgYi9kcml2ZXJzL2lpby9odW1pZGl0eS9hbTIzMTUuYwppbmRleCAzZTIwMGY2Li5mZjk2YjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9odW1pZGl0eS9hbTIzMTUuYworKysgYi9kcml2ZXJzL2lpby9odW1pZGl0eS9hbTIzMTUuYwpAQCAtMjQ0LDcgKzI0NCw3IEBACiAJaW5kaW9fZGV2LT5jaGFubmVscyA9IGFtMjMxNV9jaGFubmVsczsKIAlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoYW0yMzE1X2NoYW5uZWxzKTsKIAotCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKGluZGlvX2RldiwgTlVMTCwKKwlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsIGlpb19wb2xsZnVuY19zdG9yZV90aW1lLAogCQkJCQkgYW0yMzE1X3RyaWdnZXJfaGFuZGxlciwgTlVMTCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpaW8gdHJpZ2dlcmVkIGJ1ZmZlciBzZXR1cCBmYWlsZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaHVtaWRpdHkvaGRjMTAweC5jIGIvZHJpdmVycy9paW8vaHVtaWRpdHkvaGRjMTAweC5jCmluZGV4IGEwMzgzMmEuLmUwYzljNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2h1bWlkaXR5L2hkYzEwMHguYworKysgYi9kcml2ZXJzL2lpby9odW1pZGl0eS9oZGMxMDB4LmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJaW50IGRlbGF5ID0gZGF0YS0+YWRjX2ludF91c1tjaGFuLT5hZGRyZXNzXTsKIAlpbnQgcmV0OwotCWludCB2YWw7CisJX19iZTE2IHZhbDsKIAogCS8qIHN0YXJ0IG1lYXN1cmVtZW50ICovCiAJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCBjaGFuLT5hZGRyZXNzKTsKQEAgLTE1NCwyNiArMTU0LDEzIEBACiAJLyogd2FpdCBmb3IgaW50ZWdyYXRpb24gdGltZSB0byBwYXNzICovCiAJdXNsZWVwX3JhbmdlKGRlbGF5LCBkZWxheSArIDEwMDApOwogCi0JLyoKLQkgKiBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEgY2Fubm90KCkgYmUgdXNlZCBoZXJlIGR1ZSB0byB0aGUgY29tbWFuZAotCSAqIHZhbHVlIG5vdCBiZWluZyB1bmRlcnN0b29kIGFuZCBjYXVzZXMgTkFLcyBwcmV2ZW50aW5nIGFueSByZWFkaW5nCi0JICogZnJvbSBiZWluZyBhY2Nlc3NlZC4KLQkgKi8KLQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlKGNsaWVudCk7CisJLyogcmVhZCBtZWFzdXJlbWVudCAqLworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihkYXRhLT5jbGllbnQsIChjaGFyICopJnZhbCwgc2l6ZW9mKHZhbCkpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiY2Fubm90IHJlYWQgaGlnaCBieXRlIG1lYXN1cmVtZW50Iik7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiY2Fubm90IHJlYWQgc2Vuc29yIGRhdGFcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KLQl2YWwgPSByZXQgPDwgODsKLQotCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGUoY2xpZW50KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImNhbm5vdCByZWFkIGxvdyBieXRlIG1lYXN1cmVtZW50Iik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXZhbCB8PSByZXQ7Ci0KLQlyZXR1cm4gdmFsOworCXJldHVybiBiZTE2X3RvX2NwdSh2YWwpOwogfQogCiBzdGF0aWMgaW50IGhkYzEwMHhfZ2V0X2hlYXRlcl9zdGF0dXMoc3RydWN0IGhkYzEwMHhfZGF0YSAqZGF0YSkKQEAgLTI3Miw4ICsyNTksOCBAQAogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAJc3RydWN0IGhkYzEwMHhfZGF0YSAqZGF0YTsKIAotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAotCQkJCUkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSB8IEkyQ19GVU5DX1NNQlVTX0JZVEUpKQorCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfAorCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfQllURSB8IEkyQ19GVU5DX0kyQykpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqZGF0YSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jCmluZGV4IDkwNDYyZmMuLjE1OGFhZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1idWZmZXIuYworKysgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tYnVmZmVyLmMKQEAgLTEwNyw5ICsxMDcsMTAgQEAKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBpaW9fYnVmZmVyICpyYiA9IGluZGlvX2Rldi0+YnVmZmVyOworCURFRklORV9XQUlUX0ZVTkMod2FpdCwgd29rZW5fd2FrZV9mdW5jdGlvbik7CiAJc2l6ZV90IGRhdHVtX3NpemU7CiAJc2l6ZV90IHRvX3dhaXQ7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAogCWlmICghaW5kaW9fZGV2LT5pbmZvKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTEzMSwxOSArMTMyLDI5IEBACiAJZWxzZQogCQl0b193YWl0ID0gbWluX3Qoc2l6ZV90LCBuIC8gZGF0dW1fc2l6ZSwgcmItPndhdGVybWFyayk7CiAKKwlhZGRfd2FpdF9xdWV1ZSgmcmItPnBvbGxxLCAmd2FpdCk7CiAJZG8gewotCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocmItPnBvbGxxLAotCQkgICAgICBpaW9fYnVmZmVyX3JlYWR5KGluZGlvX2RldiwgcmIsIHRvX3dhaXQsIG4gLyBkYXR1bV9zaXplKSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQlpZiAoIWluZGlvX2Rldi0+aW5mbykgeworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWJyZWFrOworCQl9CiAKLQkJaWYgKCFpbmRpb19kZXYtPmluZm8pCi0JCQlyZXR1cm4gLUVOT0RFVjsKKwkJaWYgKCFpaW9fYnVmZmVyX3JlYWR5KGluZGlvX2RldiwgcmIsIHRvX3dhaXQsIG4gLyBkYXR1bV9zaXplKSkgeworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCisJCQl3YWl0X3dva2VuKCZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUsCisJCQkJICAgTUFYX1NDSEVEVUxFX1RJTUVPVVQpOworCQkJY29udGludWU7CisJCX0KIAogCQlyZXQgPSByYi0+YWNjZXNzLT5yZWFkX2ZpcnN0X24ocmIsIG4sIGJ1Zik7CiAJCWlmIChyZXQgPT0gMCAmJiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKQogCQkJcmV0ID0gLUVBR0FJTjsKLQkgfSB3aGlsZSAocmV0ID09IDApOworCX0gd2hpbGUgKHJldCA9PSAwKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcmItPnBvbGxxLCAmd2FpdCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWNvcmUuYyBiL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1jb3JlLmMKaW5kZXggZjkxNGQ1ZC4uZmMzNDBlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWNvcmUuYworKysgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tY29yZS5jCkBAIC02MTMsOSArNjEzLDggQEAKIAkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkLiUwOXVcbiIsIHZhbHNbMF0sIHZhbHNbMV0pOwogCWNhc2UgSUlPX1ZBTF9GUkFDVElPTkFMOgogCQl0bXAgPSBkaXZfczY0KChzNjQpdmFsc1swXSAqIDEwMDAwMDAwMDBMTCwgdmFsc1sxXSk7Ci0JCXZhbHNbMV0gPSBkb19kaXYodG1wLCAxMDAwMDAwMDAwTEwpOwotCQl2YWxzWzBdID0gdG1wOwotCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZC4lMDl1XG4iLCB2YWxzWzBdLCB2YWxzWzFdKTsKKwkJdmFsc1swXSA9IChpbnQpZGl2X3M2NF9yZW0odG1wLCAxMDAwMDAwMDAwLCAmdmFsc1sxXSk7CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkLiUwOXVcbiIsIHZhbHNbMF0sIGFicyh2YWxzWzFdKSk7CiAJY2FzZSBJSU9fVkFMX0ZSQUNUSU9OQUxfTE9HMjoKIAkJdG1wID0gKHM2NCl2YWxzWzBdICogMTAwMDAwMDAwMExMID4+IHZhbHNbMV07CiAJCXZhbHNbMV0gPSBkb19kaXYodG1wLCAxMDAwMDAwMDAwTEwpOwpAQCAtMTMwOSw3ICsxMzA4LDcgQEAKIAlpaW9fZGV2aWNlX2ZyZWUoKihzdHJ1Y3QgaWlvX2RldiAqKilyZXMpOwogfQogCi1zdGF0aWMgaW50IGRldm1faWlvX2RldmljZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcywgdm9pZCAqZGF0YSkKK2ludCBkZXZtX2lpb19kZXZpY2VfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGlpb19kZXYgKipyID0gcmVzOwogCWlmICghciB8fCAhKnIpIHsKQEAgLTEzMTgsNiArMTMxNyw3IEBACiAJfQogCXJldHVybiAqciA9PSBkYXRhOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZGV2bV9paW9fZGV2aWNlX21hdGNoKTsKIAogLyoqCiAgKiBkZXZtX2lpb19kZXZpY2VfYWxsb2MgLSBSZXNvdXJjZS1tYW5hZ2VkIGlpb19kZXZpY2VfYWxsb2MoKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWV2ZW50LmMgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tZXZlbnQuYwppbmRleCAwZWJmYzkyLi45MGZhYzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tZXZlbnQuYworKysgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tZXZlbnQuYwpAQCAtNTcsNiArNTcsMTEgQEAKICAqCiAgKiBOb3RlOiBUaGUgY2FsbGVyIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBub3QgcnVubmluZwogICogY29uY3VycmVudGx5IGZvciB0aGUgc2FtZSBpbmRpb19kZXYgbW9yZSB0aGFuIG9uY2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgc2FmZWx5IHVzZWQgYXMgc29vbiBhcyBhIHZhbGlkIHJlZmVyZW5jZSB0byBpaW9fZGV2IGhhcworICogYmVlbiBvYnRhaW5lZCB2aWEgaWlvX2RldmljZV9hbGxvYygpLCBidXQgYW55IGV2ZW50cyB0aGF0IGFyZSBzdWJtaXR0ZWQKKyAqIGJlZm9yZSBpaW9fZGV2aWNlX3JlZ2lzdGVyKCkgaGFzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgd2lsbCBiZSBzaWxlbnRseQorICogZGlzY2FyZGVkLgogICoqLwogaW50IGlpb19wdXNoX2V2ZW50KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHU2NCBldl9jb2RlLCBzNjQgdGltZXN0YW1wKQogewpAQCAtNjQsNiArNjksOSBAQAogCXN0cnVjdCBpaW9fZXZlbnRfZGF0YSBldjsKIAlpbnQgY29waWVkOwogCisJaWYgKCFldl9pbnQpCisJCXJldHVybiAwOworCiAJLyogRG9lcyBhbnlvbmUgY2FyZT8gKi8KIAlpZiAoaWlvX2V2ZW50X2VuYWJsZWQoZXZfaW50KSkgewogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dlci5jIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLXRyaWdnZXIuYwppbmRleCA3YWQ4MmZkLi5lMWUxMDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dlci5jCisrKyBiL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby10cmlnZ2VyLmMKQEAgLTExOSw2ICsxMTksMjIgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWlvX3RyaWdnZXJfdW5yZWdpc3Rlcik7CiAKK2ludCBpaW9fdHJpZ2dlcl9zZXRfaW1tdXRhYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZykKK3sKKwlpZiAoIWluZGlvX2RldiB8fCAhdHJpZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlXQVJOX09OKGluZGlvX2Rldi0+dHJpZ19yZWFkb25seSk7CisKKwlpbmRpb19kZXYtPnRyaWcgPSBpaW9fdHJpZ2dlcl9nZXQodHJpZyk7CisJaW5kaW9fZGV2LT50cmlnX3JlYWRvbmx5ID0gdHJ1ZTsKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlpb190cmlnZ2VyX3NldF9pbW11dGFibGUpOworCiAvKiBTZWFyY2ggZm9yIHRyaWdnZXIgYnkgbmFtZSwgYXNzdW1pbmcgaWlvX3RyaWdnZXJfbGlzdF9sb2NrIGhlbGQgKi8KIHN0YXRpYyBzdHJ1Y3QgaWlvX3RyaWdnZXIgKl9faWlvX3RyaWdnZXJfZmluZF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCiB7CkBAIC0yNTUsNiArMjcxLDE0IEBACiAJCQlnb3RvIG91dF9mcmVlX2lycTsKIAl9CiAKKwkvKgorCSAqIENoZWNrIGlmIHdlIGp1c3QgcmVnaXN0ZXJlZCB0byBvdXIgb3duIHRyaWdnZXI6IHdlIGRldGVybWluZSB0aGF0CisJICogdGhpcyBpcyB0aGUgY2FzZSBpZiB0aGUgSUlPIGRldmljZSBhbmQgdGhlIHRyaWdnZXIgZGV2aWNlIHNoYXJlIHRoZQorCSAqIHNhbWUgcGFyZW50IGRldmljZS4KKwkgKi8KKwlpZiAocGYtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9PSB0cmlnLT5kZXYucGFyZW50KQorCQl0cmlnLT5hdHRhY2hlZF9vd25fZGV2aWNlID0gdHJ1ZTsKKwogCXJldHVybiByZXQ7CiAKIG91dF9mcmVlX2lycToKQEAgLTI3OSw2ICszMDMsOCBAQAogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9CisJaWYgKHBmLT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPT0gdHJpZy0+ZGV2LnBhcmVudCkKKwkJdHJpZy0+YXR0YWNoZWRfb3duX2RldmljZSA9IGZhbHNlOwogCWlpb190cmlnZ2VyX3B1dF9pcnEodHJpZywgcGYtPmlycSk7CiAJZnJlZV9pcnEocGYtPmlycSwgcGYpOwogCW1vZHVsZV9wdXQocGYtPmluZGlvX2Rldi0+aW5mby0+ZHJpdmVyX21vZHVsZSk7CkBAIC0zODQsNiArNDEwLDEwIEBACiAJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQorCWlmIChpbmRpb19kZXYtPnRyaWdfcmVhZG9ubHkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CiAJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKIAogCXRyaWcgPSBpaW9fdHJpZ2dlcl9maW5kX2J5X25hbWUoYnVmLCBsZW4pOwpAQCAtNjIyLDYgKzY1Miw3MSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGV2bV9paW9fdHJpZ2dlcl9mcmVlKTsKIAorc3RhdGljIHZvaWQgZGV2bV9paW9fdHJpZ2dlcl91bnJlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcykKK3sKKwlpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKCooc3RydWN0IGlpb190cmlnZ2VyICoqKXJlcyk7Cit9CisKKy8qKgorICogZGV2bV9paW9fdHJpZ2dlcl9yZWdpc3RlciAtIFJlc291cmNlLW1hbmFnZWQgaWlvX3RyaWdnZXJfcmVnaXN0ZXIoKQorICogQGRldjoJZGV2aWNlIHRoaXMgdHJpZ2dlciB3YXMgYWxsb2NhdGVkIGZvcgorICogQHRyaWdfaW5mbzoJdHJpZ2dlciB0byByZWdpc3RlcgorICoKKyAqIE1hbmFnZWQgaWlvX3RyaWdnZXJfcmVnaXN0ZXIoKS4gIFRoZSBJSU8gdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggdGhpcworICogZnVuY3Rpb24gaXMgYXV0b21hdGljYWxseSB1bnJlZ2lzdGVyZWQgb24gZHJpdmVyIGRldGFjaC4gVGhpcyBmdW5jdGlvbgorICogY2FsbHMgaWlvX3RyaWdnZXJfcmVnaXN0ZXIoKSBpbnRlcm5hbGx5LiBSZWZlciB0byB0aGF0IGZ1bmN0aW9uIGZvciBtb3JlCisgKiBpbmZvcm1hdGlvbi4KKyAqCisgKiBJZiBhbiBpaW9fdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSB1bnJlZ2lzdGVyZWQKKyAqIHNlcGFyYXRlbHksIGRldm1faWlvX3RyaWdnZXJfdW5yZWdpc3RlcigpIG11c3QgYmUgdXNlZC4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb24gZmFpbHVyZS4KKyAqLworaW50IGRldm1faWlvX3RyaWdnZXJfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWdfaW5mbykKK3sKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKipwdHI7CisJaW50IHJldDsKKworCXB0ciA9IGRldnJlc19hbGxvYyhkZXZtX2lpb190cmlnZ2VyX3VucmVnLCBzaXplb2YoKnB0ciksIEdGUF9LRVJORUwpOworCWlmICghcHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCSpwdHIgPSB0cmlnX2luZm87CisJcmV0ID0gaWlvX3RyaWdnZXJfcmVnaXN0ZXIodHJpZ19pbmZvKTsKKwlpZiAoIXJldCkKKwkJZGV2cmVzX2FkZChkZXYsIHB0cik7CisJZWxzZQorCQlkZXZyZXNfZnJlZShwdHIpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldm1faWlvX3RyaWdnZXJfcmVnaXN0ZXIpOworCisvKioKKyAqIGRldm1faWlvX3RyaWdnZXJfdW5yZWdpc3RlciAtIFJlc291cmNlLW1hbmFnZWQgaWlvX3RyaWdnZXJfdW5yZWdpc3RlcigpCisgKiBAZGV2OglkZXZpY2UgdGhpcyBpaW9fdHJpZ2dlciBiZWxvbmdzIHRvCisgKiBAdHJpZ19pbmZvOgl0aGUgdHJpZ2dlciBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZQorICoKKyAqIFVucmVnaXN0ZXIgdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggZGV2bV9paW9fdHJpZ2dlcl9yZWdpc3RlcigpLgorICovCit2b2lkIGRldm1faWlvX3RyaWdnZXJfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZ19pbmZvKQoreworCWludCByYzsKKworCXJjID0gZGV2cmVzX3JlbGVhc2UoZGV2LCBkZXZtX2lpb190cmlnZ2VyX3VucmVnLCBkZXZtX2lpb190cmlnZ2VyX21hdGNoLAorCQkJICAgIHRyaWdfaW5mbyk7CisJV0FSTl9PTihyYyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX2lpb190cmlnZ2VyX3VucmVnaXN0ZXIpOworCitib29sIGlpb190cmlnZ2VyX3VzaW5nX293bihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXJldHVybiBpbmRpb19kZXYtPnRyaWctPmF0dGFjaGVkX293bl9kZXZpY2U7Cit9CitFWFBPUlRfU1lNQk9MKGlpb190cmlnZ2VyX3VzaW5nX293bik7CisKIHZvaWQgaWlvX2RldmljZV9yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJaW5kaW9fZGV2LT5ncm91cHNbaW5kaW9fZGV2LT5ncm91cGNvdW50ZXIrK10gPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbGlnaHQvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL2xpZ2h0L0tjb25maWcKaW5kZXggN2M1NjZmNS4uYmEyZTY0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbGlnaHQvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9saWdodC9LY29uZmlnCkBAIC03Niw3ICs3Niw2IEBACiBjb25maWcgQkgxNzgwCiAJdHJpc3RhdGUgIlJPSE0gQkgxNzgwIGFtYmllbnQgbGlnaHQgc2Vuc29yIgogCWRlcGVuZHMgb24gSTJDCi0JZGVwZW5kcyBvbiAhU0VOU09SU19CSDE3ODAKIAloZWxwCiAJIFNheSBZIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIFJPSE0gQkgxNzgwR0xJIGFtYmllbnQKIAkgbGlnaHQgc2Vuc29yLgpAQCAtMjM4LDYgKzIzNyw4IEBACiAJdHJpc3RhdGUgIk1BWDQ0MDAwIEFtYmllbnQgYW5kIEluZnJhcmVkIFByb3hpbWl0eSBTZW5zb3IiCiAJZGVwZW5kcyBvbiBJMkMKIAlzZWxlY3QgUkVHTUFQX0kyQworCXNlbGVjdCBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSRURfQlVGRkVSCiAJaGVscAogCSBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIE1heGltIEludGVncmF0ZWQncwogCSBNQVg0NDAwMCBhbWJpZW50IGFuZCBpbmZyYXJlZCBwcm94aW1pdHkgc2Vuc29yIGRldmljZS4KQEAgLTI2Niw2ICsyNjcsMTkgQEAKICAgICAgICAgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKICAgICAgICAgIHdpbGwgYmUgY2FsbGVkIHBhMTIyMDMwMDEuCiAKK2NvbmZpZyBTSTExNDUKKwl0cmlzdGF0ZSAiU0kxMTMyIGFuZCBTSTExNDEvMi8zLzUvNi83IGNvbWJpbmVkIEFMUywgVVYgaW5kZXggYW5kIHByb3hpbWl0eSBzZW5zb3IiCisJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgSUlPX0JVRkZFUgorCXNlbGVjdCBJSU9fVFJJR0dFUkVEX0JVRkZFUgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgYSBkcml2ZXIgZm9yIHRoZSBTaWxpY29uIExhYnMgU0kxMTMyIG9yCisJICBTSTExNDEvMi8zLzUvNi83IGNvbWJpbmVkIGFtYmllbnQgbGlnaHQsIFVWIGluZGV4IGFuZCBwcm94aW1pdHkgc2Vuc29yCisJICBjaGlwcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgc2kxMTQ1LgorCiBjb25maWcgU1RLMzMxMAogCXRyaXN0YXRlICJTVEszMzEwIEFMUyBhbmQgcHJveGltaXR5IHNlbnNvciIKIAlkZXBlbmRzIG9uIEkyQwpAQCAtMzMzLDExICszNDcsMTEgQEAKIAkgd2lsbCBiZSBjYWxsZWQgdXM1MTgyZC4KIAogY29uZmlnIFZDTkw0MDAwCi0JdHJpc3RhdGUgIlZDTkw0MDAwIGNvbWJpbmVkIEFMUyBhbmQgcHJveGltaXR5IHNlbnNvciIKKwl0cmlzdGF0ZSAiVkNOTDQwMDAvNDAxMC80MDIwIGNvbWJpbmVkIEFMUyBhbmQgcHJveGltaXR5IHNlbnNvciIKIAlkZXBlbmRzIG9uIEkyQwogCWhlbHAKLQkgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBhIGRyaXZlciBmb3IgdGhlIFZpc2hheSBWQ05MNDAwMAotCSBjb21iaW5lZCBhbWJpZW50IGxpZ2h0IGFuZCBwcm94aW1pdHkgc2Vuc29yLgorCSBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGEgZHJpdmVyIGZvciB0aGUgVmlzaGF5IFZDTkw0MDAwLAorCSBWQ05MNDAxMCwgVkNOTDQwMjAgY29tYmluZWQgYW1iaWVudCBsaWdodCBhbmQgcHJveGltaXR5IHNlbnNvci4KIAogCSBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHZjbmw0MDAwLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbGlnaHQvTWFrZWZpbGUgYi9kcml2ZXJzL2lpby9saWdodC9NYWtlZmlsZQppbmRleCA2ZjJhM2M2Mi4uYzU3NjhkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbGlnaHQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9paW8vbGlnaHQvTWFrZWZpbGUKQEAgLTI2LDYgKzI2LDcgQEAKIG9iai0kKENPTkZJR19QQTEyMjAzMDAxKQkrPSBwYTEyMjAzMDAxLm8KIG9iai0kKENPTkZJR19SUFIwNTIxKQkJKz0gcnByMDUyMS5vCiBvYmotJChDT05GSUdfU0VOU09SU19UU0wyNTYzKQkrPSB0c2wyNTYzLm8KK29iai0kKENPTkZJR19TSTExNDUpCQkrPSBzaTExNDUubwogb2JqLSQoQ09ORklHX1NUSzMzMTApICAgICAgICAgICs9IHN0azMzMTAubwogb2JqLSQoQ09ORklHX1RDUzM0MTQpCQkrPSB0Y3MzNDE0Lm8KIG9iai0kKENPTkZJR19UQ1MzNDcyKQkJKz0gdGNzMzQ3Mi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9saWdodC9zaTExNDUuYyBiL2RyaXZlcnMvaWlvL2xpZ2h0L3NpMTE0NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NjAzNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9saWdodC9zaTExNDUuYwpAQCAtMCwwICsxLDE0MDQgQEAKKy8qCisgKiBzaTExNDUuYyAtIFN1cHBvcnQgZm9yIFNpbGFicyBTSTExMzIgYW5kIFNJMTE0MS8yLzMvNS82LzcgY29tYmluZWQgYW1iaWVudAorICogbGlnaHQsIFVWIGluZGV4IGFuZCBwcm94aW1pdHkgc2Vuc29ycworICoKKyAqIENvcHlyaWdodCAyMDE0LTE2IFBldGVyIE1lZXJ3YWxkLVN0YWRsZXIgPHBtZWVyd0BwbWVlcncubmV0PgorICogQ29weXJpZ2h0IDIwMTYgQ3Jlc3RleiBEYW4gTGVvbmFyZCA8bGVvbmFyZC5jcmVzdGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdmVyc2lvbiAyIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbgorICogZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFNJMTEzMiAoNy1iaXQgSTJDIHNsYXZlIGFkZHJlc3MgMHg2MCkKKyAqIFNJMTE0MS8yLzMgKDctYml0IEkyQyBzbGF2ZSBhZGRyZXNzIDB4NWEpCisgKiBTSTExNDUvNi82ICg3LWJpdCBJMkMgc2xhdmUgYWRkcmVzcyAweDYwKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcl9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2J1ZmZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3V0aWxfbWFjcm9zLmg+CisKKyNkZWZpbmUgU0kxMTQ1X1JFR19QQVJUX0lECQkweDAwCisjZGVmaW5lIFNJMTE0NV9SRUdfUkVWX0lECQkweDAxCisjZGVmaW5lIFNJMTE0NV9SRUdfU0VRX0lECQkweDAyCisjZGVmaW5lIFNJMTE0NV9SRUdfSU5UX0NGRwkJMHgwMworI2RlZmluZSBTSTExNDVfUkVHX0lSUV9FTkFCTEUJCTB4MDQKKyNkZWZpbmUgU0kxMTQ1X1JFR19JUlFfTU9ERQkJMHgwNQorI2RlZmluZSBTSTExNDVfUkVHX0hXX0tFWQkJMHgwNworI2RlZmluZSBTSTExNDVfUkVHX01FQVNfUkFURQkJMHgwOAorI2RlZmluZSBTSTExNDVfUkVHX1BTX0xFRDIxCQkweDBmCisjZGVmaW5lIFNJMTE0NV9SRUdfUFNfTEVEMwkJMHgxMAorI2RlZmluZSBTSTExNDVfUkVHX1VDT0VGMQkJMHgxMworI2RlZmluZSBTSTExNDVfUkVHX1VDT0VGMgkJMHgxNAorI2RlZmluZSBTSTExNDVfUkVHX1VDT0VGMwkJMHgxNQorI2RlZmluZSBTSTExNDVfUkVHX1VDT0VGNAkJMHgxNgorI2RlZmluZSBTSTExNDVfUkVHX1BBUkFNX1dSCQkweDE3CisjZGVmaW5lIFNJMTE0NV9SRUdfQ09NTUFORAkJMHgxOAorI2RlZmluZSBTSTExNDVfUkVHX1JFU1BPTlNFCQkweDIwCisjZGVmaW5lIFNJMTE0NV9SRUdfSVJRX1NUQVRVUwkJMHgyMQorI2RlZmluZSBTSTExNDVfUkVHX0FMU1ZJU19EQVRBCQkweDIyCisjZGVmaW5lIFNJMTE0NV9SRUdfQUxTSVJfREFUQQkJMHgyNAorI2RlZmluZSBTSTExNDVfUkVHX1BTMV9EQVRBCQkweDI2CisjZGVmaW5lIFNJMTE0NV9SRUdfUFMyX0RBVEEJCTB4MjgKKyNkZWZpbmUgU0kxMTQ1X1JFR19QUzNfREFUQQkJMHgyYQorI2RlZmluZSBTSTExNDVfUkVHX0FVWF9EQVRBCQkweDJjCisjZGVmaW5lIFNJMTE0NV9SRUdfUEFSQU1fUkQJCTB4MmUKKyNkZWZpbmUgU0kxMTQ1X1JFR19DSElQX1NUQVQJCTB4MzAKKworI2RlZmluZSBTSTExNDVfVUNPRUYxX0RFRkFVTFQJCTB4N2IKKyNkZWZpbmUgU0kxMTQ1X1VDT0VGMl9ERUZBVUxUCQkweDZiCisjZGVmaW5lIFNJMTE0NV9VQ09FRjNfREVGQVVMVAkJMHgwMQorI2RlZmluZSBTSTExNDVfVUNPRUY0X0RFRkFVTFQJCTB4MDAKKworLyogSGVscGVyIHRvIGZpZ3VyZSBvdXQgUFNfTEVEIHJlZ2lzdGVyIC8gc2hpZnQgcGVyIGNoYW5uZWwgKi8KKyNkZWZpbmUgU0kxMTQ1X1BTX0xFRF9SRUcoY2gpIFwKKwkoKChjaCkgPT0gMikgPyBTSTExNDVfUkVHX1BTX0xFRDMgOiBTSTExNDVfUkVHX1BTX0xFRDIxKQorI2RlZmluZSBTSTExNDVfUFNfTEVEX1NISUZUKGNoKSBcCisJKCgoY2gpID09IDEpID8gNCA6IDApCisKKy8qIFBhcmFtZXRlciBvZmZzZXRzICovCisjZGVmaW5lIFNJMTE0NV9QQVJBTV9DSExJU1QJCTB4MDEKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX1BTTEVEMTJfU0VMRUNUCTB4MDIKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX1BTTEVEM19TRUxFQ1QJMHgwMworI2RlZmluZSBTSTExNDVfUEFSQU1fUFNfRU5DT0RJTkcJMHgwNQorI2RlZmluZSBTSTExNDVfUEFSQU1fQUxTX0VOQ09ESU5HCTB4MDYKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX1BTMV9BRENfTVVYCTB4MDcKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX1BTMl9BRENfTVVYCTB4MDgKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX1BTM19BRENfTVVYCTB4MDkKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX1BTX0FEQ19DT1VOVEVSCTB4MGEKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX1BTX0FEQ19HQUlOCTB4MGIKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX1BTX0FEQ19NSVNDCTB4MGMKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0FMU19BRENfTVVYCTB4MGQKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0FMU0lSX0FEQ19NVVgJMHgwZQorI2RlZmluZSBTSTExNDVfUEFSQU1fQVVYX0FEQ19NVVgJMHgwZgorI2RlZmluZSBTSTExNDVfUEFSQU1fQUxTVklTX0FEQ19DT1VOVEVSCTB4MTAKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0FMU1ZJU19BRENfR0FJTgkweDExCisjZGVmaW5lIFNJMTE0NV9QQVJBTV9BTFNWSVNfQURDX01JU0MJMHgxMgorI2RlZmluZSBTSTExNDVfUEFSQU1fTEVEX1JFQ09WRVJZCTB4MWMKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0FMU0lSX0FEQ19DT1VOVEVSCTB4MWQKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0FMU0lSX0FEQ19HQUlOCTB4MWUKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0FMU0lSX0FEQ19NSVNDCTB4MWYKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0FEQ19PRkZTRVQJCTB4MWEKKworLyogQ2hhbm5lbCBlbmFibGUgbWFza3MgZm9yIENITElTVCBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgU0kxMTQ1X0NITElTVF9FTl9QUzEJCUJJVCgwKQorI2RlZmluZSBTSTExNDVfQ0hMSVNUX0VOX1BTMgkJQklUKDEpCisjZGVmaW5lIFNJMTE0NV9DSExJU1RfRU5fUFMzCQlCSVQoMikKKyNkZWZpbmUgU0kxMTQ1X0NITElTVF9FTl9BTFNWSVMJCUJJVCg0KQorI2RlZmluZSBTSTExNDVfQ0hMSVNUX0VOX0FMU0lSCQlCSVQoNSkKKyNkZWZpbmUgU0kxMTQ1X0NITElTVF9FTl9BVVgJCUJJVCg2KQorI2RlZmluZSBTSTExNDVfQ0hMSVNUX0VOX1VWCQlCSVQoNykKKworLyogUHJveGltaXR5IG1lYXN1cmVtZW50IG1vZGUgZm9yIEFEQ19NSVNDIHBhcmFtZXRlciAqLworI2RlZmluZSBTSTExNDVfUFNfQURDX01PREVfTk9STUFMCUJJVCgyKQorLyogU2lnbmFsIHJhbmdlIG1hc2sgZm9yIEFEQ19NSVNDIHBhcmFtZXRlciAqLworI2RlZmluZSBTSTExNDVfQURDX01JU0NfUkFOR0UJCUJJVCg1KQorCisvKiBDb21tYW5kcyBmb3IgUkVHX0NPTU1BTkQgKi8KKyNkZWZpbmUgU0kxMTQ1X0NNRF9OT1AJCQkweDAwCisjZGVmaW5lIFNJMTE0NV9DTURfUkVTRVQJCTB4MDEKKyNkZWZpbmUgU0kxMTQ1X0NNRF9QU19GT1JDRQkJMHgwNQorI2RlZmluZSBTSTExNDVfQ01EX0FMU19GT1JDRQkJMHgwNgorI2RlZmluZSBTSTExNDVfQ01EX1BTQUxTX0ZPUkNFCQkweDA3CisjZGVmaW5lIFNJMTE0NV9DTURfUFNfUEFVU0UJCTB4MDkKKyNkZWZpbmUgU0kxMTQ1X0NNRF9BTFNfUEFVU0UJCTB4MGEKKyNkZWZpbmUgU0kxMTQ1X0NNRF9QU0FMU19QQVVTRQkJMHgwYgorI2RlZmluZSBTSTExNDVfQ01EX1BTX0FVVE8JCTB4MGQKKyNkZWZpbmUgU0kxMTQ1X0NNRF9BTFNfQVVUTwkJMHgwZQorI2RlZmluZSBTSTExNDVfQ01EX1BTQUxTX0FVVE8JCTB4MGYKKyNkZWZpbmUgU0kxMTQ1X0NNRF9QQVJBTV9RVUVSWQkJMHg4MAorI2RlZmluZSBTSTExNDVfQ01EX1BBUkFNX1NFVAkJMHhhMAorCisjZGVmaW5lIFNJMTE0NV9SU1BfSU5WQUxJRF9TRVRUSU5HCTB4ODAKKyNkZWZpbmUgU0kxMTQ1X1JTUF9DT1VOVEVSX01BU0sJCTB4MEYKKworLyogTWluaW11bSBzbGVlcCBhZnRlciBlYWNoIGNvbW1hbmQgdG8gZW5zdXJlIGl0J3MgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgU0kxMTQ1X0NPTU1BTkRfTUlOU0xFRVBfTVMJNQorLyogUmV0dXJuIC1FVElNRURPVVQgYWZ0ZXIgdGhpcyBsb25nICovCisjZGVmaW5lIFNJMTE0NV9DT01NQU5EX1RJTUVPVVRfTVMJMjUKKworLyogSW50ZXJydXB0IGNvbmZpZ3VyYXRpb24gbWFza3MgZm9yIElOVF9DRkcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0kxMTQ1X0lOVF9DRkdfT0UJCUJJVCgwKSAvKiBlbmFibGUgaW50ZXJydXB0ICovCisjZGVmaW5lIFNJMTE0NV9JTlRfQ0ZHX01PREUJCUJJVCgxKSAvKiBhdXRvIHJlc2V0IGludGVycnVwdCBwaW4gKi8KKworLyogSW50ZXJydXB0IGVuYWJsZSBtYXNrcyBmb3IgSVJRX0VOQUJMRSByZWdpc3RlciAqLworI2RlZmluZSBTSTExNDVfTUFTS19BTExfSUUJCShCSVQoNCkgfCBCSVQoMykgfCBCSVQoMikgfCBCSVQoMCkpCisKKyNkZWZpbmUgU0kxMTQ1X01VWF9URU1QCQkJMHg2NQorI2RlZmluZSBTSTExNDVfTVVYX1ZERAkJCTB4NzUKKworLyogUHJveGltaXR5IExFRCBjdXJyZW50OyBzZWUgVGFibGUgMiBpbiBkYXRhc2hlZXQgKi8KKyNkZWZpbmUgU0kxMTQ1X0xFRF9DVVJSRU5UXzQ1bUEJCTB4MDQKKworZW51bSB7CisJU0kxMTMyLAorCVNJMTE0MSwKKwlTSTExNDIsCisJU0kxMTQzLAorCVNJMTE0NSwKKwlTSTExNDYsCisJU0kxMTQ3LAorfTsKKworc3RydWN0IHNpMTE0NV9wYXJ0X2luZm8geworCXU4IHBhcnQ7CisJY29uc3Qgc3RydWN0IGlpb19pbmZvICppaW9faW5mbzsKKwljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbm5lbHM7CisJdW5zaWduZWQgaW50IG51bV9jaGFubmVsczsKKwl1bnNpZ25lZCBpbnQgbnVtX2xlZHM7CisJYm9vbCB1bmNvbXByZXNzZWRfbWVhc19yYXRlOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2kxMTQ1X2RhdGEgLSBzaTExNDUgY2hpcCBzdGF0ZSBkYXRhCisgKiBAY2xpZW50OglJMkMgY2xpZW50CisgKiBAbG9jazoJbXV0ZXggdG8gcHJvdGVjdCBzaGFyZWQgc3RhdGUuCisgKiBAY21kbG9jazoJTG93LWxldmVsIG11dGV4IHRvIHByb3RlY3QgY29tbWFuZCBleGVjdXRpb24gb25seQorICogQHJzcF9zZXE6CU5leHQgZXhwZWN0ZWQgcmVzcG9uc2UgbnVtYmVyIG9yIC0xIGlmIGNvdW50ZXIgcmVzZXQgcmVxdWlyZWQKKyAqIEBzY2FuX21hc2s6CVNhdmVkIHNjYW4gbWFzayB0byBhdm9pZCBkdXBsaWNhdGUgc2V0X2NobGlzdAorICogQGF1dG9ub21vdXM6IElmIGF1dG9tYXRpYyBtZWFzdXJlbWVudHMgYXJlIGFjdGl2ZSAoZm9yIGJ1ZmZlciBzdXBwb3J0KQorICogQHBhcnRfaW5mbzoJUGFydCBpbmZvcm1hdGlvbgorICogQHRyaWc6CVBvaW50ZXIgdG8gaWlvIHRyaWdnZXIKKyAqIEBtZWFzX3JhdGU6CVZhbHVlIG9mIE1FQVNfUkFURSByZWdpc3Rlci4gT25seSBzZXQgaW4gSFcgaW4gYXV0byBtb2RlCisgKi8KK3N0cnVjdCBzaTExNDVfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgbXV0ZXggY21kbG9jazsKKwlpbnQgcnNwX3NlcTsKKwljb25zdCBzdHJ1Y3Qgc2kxMTQ1X3BhcnRfaW5mbyAqcGFydF9pbmZvOworCXVuc2lnbmVkIGxvbmcgc2Nhbl9tYXNrOworCWJvb2wgYXV0b25vbW91czsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWc7CisJaW50IG1lYXNfcmF0ZTsKK307CisKKy8qKgorICogX19zaTExNDVfY29tbWFuZF9yZXNldCgpIC0gU2VuZCBDTURfTk9QIGFuZCB3YWl0IGZvciByZXNwb25zZSAwCisgKgorICogRG9lcyBub3QgbW9kaWZ5IGRhdGEtPnJzcF9zZXEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IF9fc2kxMTQ1X2NvbW1hbmRfcmVzZXQoc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkYXRhLT5jbGllbnQtPmRldjsKKwl1bnNpZ25lZCBsb25nIHN0b3BfamlmZmllczsKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIFNJMTE0NV9SRUdfQ09NTUFORCwKKwkJCQkJCSAgICAgIFNJMTE0NV9DTURfTk9QKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwltc2xlZXAoU0kxMTQ1X0NPTU1BTkRfTUlOU0xFRVBfTVMpOworCisJc3RvcF9qaWZmaWVzID0gamlmZmllcyArIFNJMTE0NV9DT01NQU5EX1RJTUVPVVRfTVMgKiBIWiAvIDEwMDA7CisJd2hpbGUgKHRydWUpIHsKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkJICAgICAgIFNJMTE0NV9SRUdfUkVTUE9OU0UpOworCQlpZiAocmV0IDw9IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdG9wX2ppZmZpZXMpKSB7CisJCQlkZXZfd2FybihkZXYsICJ0aW1lb3V0IG9uIHJlc2V0XG4iKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJCW1zbGVlcChTSTExNDVfQ09NTUFORF9NSU5TTEVFUF9NUyk7CisJCWNvbnRpbnVlOworCX0KK30KKworLyoqCisgKiBzaTExNDVfY29tbWFuZCgpIC0gRXhlY3V0ZSBhIGNvbW1hbmQgYW5kIHBvbGwgdGhlIHJlc3BvbnNlIHJlZ2lzdGVyCisgKgorICogQWxsIGNvbnZlcnNpb24gb3ZlcmZsb3dzIGFyZSByZXBvcnRlZCBhcyAtRU9WRVJGTE9XCisgKiBJTlZBTElEX1NFVFRJTkcgaXMgcmVwb3J0ZWQgYXMgLUVJTlZBTAorICogVGltZW91dHMgYXJlIHJlcG9ydGVkIGFzIC1FVElNRURPVVQKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciAtZXJybm8gb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IHNpMTE0NV9jb21tYW5kKHN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSwgdTggY21kKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkYXRhLT5jbGllbnQtPmRldjsKKwl1bnNpZ25lZCBsb25nIHN0b3BfamlmZmllczsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZGF0YS0+Y21kbG9jayk7CisKKwlpZiAoZGF0YS0+cnNwX3NlcSA8IDApIHsKKwkJcmV0ID0gX19zaTExNDVfY29tbWFuZF9yZXNldChkYXRhKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlc2V0IGNvbW1hbmQgY291bnRlciwgcmV0PSVkXG4iLAorCQkJCXJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlkYXRhLT5yc3Bfc2VxID0gMDsKKwl9CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgU0kxMTQ1X1JFR19DT01NQU5ELCBjbWQpOworCWlmIChyZXQpIHsKKwkJZGV2X3dhcm4oZGV2LCAiZmFpbGVkIHRvIHdyaXRlIGNvbW1hbmQsIHJldD0lZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCS8qIFNsZWVwIGEgbGl0dGxlIHRvIGVuc3VyZSB0aGUgY29tbWFuZCBpcyByZWNlaXZlZCAqLworCW1zbGVlcChTSTExNDVfQ09NTUFORF9NSU5TTEVFUF9NUyk7CisKKwlzdG9wX2ppZmZpZXMgPSBqaWZmaWVzICsgU0kxMTQ1X0NPTU1BTkRfVElNRU9VVF9NUyAqIEhaIC8gMTAwMDsKKwl3aGlsZSAodHJ1ZSkgeworCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCQkgICAgICAgU0kxMTQ1X1JFR19SRVNQT05TRSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfd2FybihkZXYsICJmYWlsZWQgdG8gcmVhZCByZXNwb25zZSwgcmV0PSVkXG4iLCByZXQpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHJldCAmIH5TSTExNDVfUlNQX0NPVU5URVJfTUFTSykgPT0gMCkgeworCQkJaWYgKHJldCA9PSBkYXRhLT5yc3Bfc2VxKSB7CisJCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RvcF9qaWZmaWVzKSkgeworCQkJCQlkZXZfd2FybihkZXYsICJ0aW1lb3V0IG9uIGNvbW1hbmQgJSMwMmhoeFxuIiwKKwkJCQkJCSBjbWQpOworCQkJCQlyZXQgPSAtRVRJTUVET1VUOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbXNsZWVwKFNJMTE0NV9DT01NQU5EX01JTlNMRUVQX01TKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChyZXQgPT0gKChkYXRhLT5yc3Bfc2VxICsgMSkgJgorCQkJCVNJMTE0NV9SU1BfQ09VTlRFUl9NQVNLKSkgeworCQkJCWRhdGEtPnJzcF9zZXEgPSByZXQ7CisJCQkJcmV0ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRldl93YXJuKGRldiwgInVuZXhwZWN0ZWQgcmVzcG9uc2UgY291bnRlciAlZCBpbnN0ZWFkIG9mICVkXG4iLAorCQkJCSByZXQsIChkYXRhLT5yc3Bfc2VxICsgMSkgJgorCQkJCQlTSTExNDVfUlNQX0NPVU5URVJfTUFTSyk7CisJCQlyZXQgPSAtRUlPOworCQl9IGVsc2UgeworCQkJaWYgKHJldCA9PSBTSTExNDVfUlNQX0lOVkFMSURfU0VUVElORykgeworCQkJCWRldl93YXJuKGRldiwgIklOVkFMSURfU0VUVElORyBlcnJvciBvbiBjb21tYW5kICUjMDJoaHhcbiIsCisJCQkJCSBjbWQpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQl9IGVsc2UgeworCQkJCS8qIEFsbCBvdmVyZmxvd3MgYXJlIHRyZWF0ZWQgaWRlbnRpY2FsbHkgKi8KKwkJCQlkZXZfZGJnKGRldiwgIm92ZXJmbG93LCByZXQ9JWQsIGNtZD0lIzAyaGh4XG4iLAorCQkJCQlyZXQsIGNtZCk7CisJCQkJcmV0ID0gLUVPVkVSRkxPVzsKKwkJCX0KKwkJfQorCisJCS8qIEZvcmNlIGEgY291bnRlciByZXNldCBuZXh0IHRpbWUgKi8KKwkJZGF0YS0+cnNwX3NlcSA9IC0xOworCQlicmVhazsKKwl9CisKK291dDoKKwltdXRleF91bmxvY2soJmRhdGEtPmNtZGxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzaTExNDVfcGFyYW1fdXBkYXRlKHN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSwgdTggb3AsIHU4IHBhcmFtLAorCQkJICAgICAgIHU4IHZhbHVlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJU0kxMTQ1X1JFR19QQVJBTV9XUiwgdmFsdWUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNpMTE0NV9jb21tYW5kKGRhdGEsIG9wIHwgKHBhcmFtICYgMHgxRikpOworfQorCitzdGF0aWMgaW50IHNpMTE0NV9wYXJhbV9zZXQoc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhLCB1OCBwYXJhbSwgdTggdmFsdWUpCit7CisJcmV0dXJuIHNpMTE0NV9wYXJhbV91cGRhdGUoZGF0YSwgU0kxMTQ1X0NNRF9QQVJBTV9TRVQsIHBhcmFtLCB2YWx1ZSk7Cit9CisKKy8qIFNldCBwYXJhbS4gUmV0dXJucyBuZWdhdGl2ZSBlcnJubyBvciBjdXJyZW50IHZhbHVlICovCitzdGF0aWMgaW50IHNpMTE0NV9wYXJhbV9xdWVyeShzdHJ1Y3Qgc2kxMTQ1X2RhdGEgKmRhdGEsIHU4IHBhcmFtKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzaTExNDVfY29tbWFuZChkYXRhLCBTSTExNDVfQ01EX1BBUkFNX1FVRVJZIHwgKHBhcmFtICYgMHgxRikpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIFNJMTE0NV9SRUdfUEFSQU1fUkQpOworfQorCisvKiBFeHBhbmQgOCBiaXQgY29tcHJlc3NlZCB2YWx1ZSB0byAxNiBiaXQsIHNlZSBTaWxhYnMgQU40OTggKi8KK3N0YXRpYyB1MTYgc2kxMTQ1X3VuY29tcHJlc3ModTggeCkKK3sKKwl1MTYgcmVzdWx0ID0gMDsKKwl1OCBleHBvbmVudCA9IDA7CisKKwlpZiAoeCA8IDgpCisJCXJldHVybiAwOworCisJZXhwb25lbnQgPSAoeCAmIDB4ZjApID4+IDQ7CisJcmVzdWx0ID0gMHgxMCB8ICh4ICYgMHgwZik7CisKKwlpZiAoZXhwb25lbnQgPj0gNCkKKwkJcmV0dXJuIHJlc3VsdCA8PCAoZXhwb25lbnQgLSA0KTsKKwlyZXR1cm4gcmVzdWx0ID4+ICg0IC0gZXhwb25lbnQpOworfQorCisvKiBDb21wcmVzcyAxNiBiaXQgdmFsdWUgdG8gOCBiaXQsIHNlZSBTaWxhYnMgQU40OTggKi8KK3N0YXRpYyB1OCBzaTExNDVfY29tcHJlc3ModTE2IHgpCit7CisJdTMyIGV4cG9uZW50ID0gMDsKKwl1MzIgc2lnbmlmaWNhbmQgPSAwOworCXUzMiB0bXAgPSB4OworCisJaWYgKHggPT0gMHgwMDAwKQorCQlyZXR1cm4gMHgwMDsKKwlpZiAoeCA9PSAweDAwMDEpCisJCXJldHVybiAweDA4OworCisJd2hpbGUgKDEpIHsKKwkJdG1wID4+PSAxOworCQlleHBvbmVudCArPSAxOworCQlpZiAodG1wID09IDEpCisJCQlicmVhazsKKwl9CisKKwlpZiAoZXhwb25lbnQgPCA1KSB7CisJCXNpZ25pZmljYW5kID0geCA8PCAoNCAtIGV4cG9uZW50KTsKKwkJcmV0dXJuIChleHBvbmVudCA8PCA0KSB8IChzaWduaWZpY2FuZCAmIDB4Rik7CisJfQorCisJc2lnbmlmaWNhbmQgPSB4ID4+IChleHBvbmVudCAtIDUpOworCWlmIChzaWduaWZpY2FuZCAmIDEpIHsKKwkJc2lnbmlmaWNhbmQgKz0gMjsKKwkJaWYgKHNpZ25pZmljYW5kICYgMHgwMDQwKSB7CisJCQlleHBvbmVudCArPSAxOworCQkJc2lnbmlmaWNhbmQgPj49IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gKGV4cG9uZW50IDw8IDQpIHwgKChzaWduaWZpY2FuZCA+PiAxKSAmIDB4Rik7Cit9CisKKy8qIFdyaXRlIG1lYXNfcmF0ZSBpbiBoYXJkd2FyZSAqLworc3RhdGljIGludCBzaTExNDVfc2V0X21lYXNfcmF0ZShzdHJ1Y3Qgc2kxMTQ1X2RhdGEgKmRhdGEsIGludCBpbnRlcnZhbCkKK3sKKwlpZiAoZGF0YS0+cGFydF9pbmZvLT51bmNvbXByZXNzZWRfbWVhc19yYXRlKQorCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShkYXRhLT5jbGllbnQsCisJCQlTSTExNDVfUkVHX01FQVNfUkFURSwgaW50ZXJ2YWwpOworCWVsc2UKKwkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJU0kxMTQ1X1JFR19NRUFTX1JBVEUsIGludGVydmFsKTsKK30KKworc3RhdGljIGludCBzaTExNDVfcmVhZF9zYW1wX2ZyZXEoc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhLCBpbnQgKnZhbCwgaW50ICp2YWwyKQoreworCSp2YWwgPSAzMjAwMDsKKwlpZiAoZGF0YS0+cGFydF9pbmZvLT51bmNvbXByZXNzZWRfbWVhc19yYXRlKQorCQkqdmFsMiA9IGRhdGEtPm1lYXNfcmF0ZTsKKwllbHNlCisJCSp2YWwyID0gc2kxMTQ1X3VuY29tcHJlc3MoZGF0YS0+bWVhc19yYXRlKTsKKwlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMOworfQorCisvKiBTZXQgdGhlIHNhbXAgZnJlcSBpbiBkcml2ZXIgcHJpdmF0ZSBkYXRhICovCitzdGF0aWMgaW50IHNpMTE0NV9zdG9yZV9zYW1wX2ZyZXEoc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhLCBpbnQgdmFsKQoreworCWludCByZXQgPSAwOworCWludCBtZWFzX3JhdGU7CisKKwlpZiAodmFsIDw9IDAgfHwgdmFsID4gMzIwMDApCisJCXJldHVybiAtRVJBTkdFOworCW1lYXNfcmF0ZSA9IDMyMDAwIC8gdmFsOworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJaWYgKGRhdGEtPmF1dG9ub21vdXMpIHsKKwkJcmV0ID0gc2kxMTQ1X3NldF9tZWFzX3JhdGUoZGF0YSwgbWVhc19yYXRlKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKwlpZiAoZGF0YS0+cGFydF9pbmZvLT51bmNvbXByZXNzZWRfbWVhc19yYXRlKQorCQlkYXRhLT5tZWFzX3JhdGUgPSBtZWFzX3JhdGU7CisJZWxzZQorCQlkYXRhLT5tZWFzX3JhdGUgPSBzaTExNDVfY29tcHJlc3MobWVhc19yYXRlKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2kxMTQ1X3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHByaXZhdGU7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7CisJc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwkvKgorCSAqIE1heGltdW0gYnVmZmVyIHNpemU6CisJICogICA2KjIgYnl0ZXMgY2hhbm5lbHMgZGF0YSArIDQgYnl0ZXMgYWxpZ25tZW50ICsKKwkgKiAgIDggYnl0ZXMgdGltZXN0YW1wCisJICovCisJdTggYnVmZmVyWzI0XTsKKwlpbnQgaSwgaiA9IDA7CisJaW50IHJldDsKKwl1OCBpcnFfc3RhdHVzID0gMDsKKworCWlmICghZGF0YS0+YXV0b25vbW91cykgeworCQlyZXQgPSBzaTExNDVfY29tbWFuZChkYXRhLCBTSTExNDVfQ01EX1BTQUxTX0ZPUkNFKTsKKwkJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FT1ZFUkZMT1cpCisJCQlnb3RvIGRvbmU7CisJfSBlbHNlIHsKKwkJaXJxX3N0YXR1cyA9IHJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJU0kxMTQ1X1JFR19JUlFfU1RBVFVTKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGRvbmU7CisJCWlmICghKGlycV9zdGF0dXMgJiBTSTExNDVfTUFTS19BTExfSUUpKQorCQkJZ290byBkb25lOworCX0KKworCWZvcl9lYWNoX3NldF9iaXQoaSwgaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrLAorCQlpbmRpb19kZXYtPm1hc2tsZW5ndGgpIHsKKwkJaW50IHJ1biA9IDE7CisKKwkJd2hpbGUgKGkgKyBydW4gPCBpbmRpb19kZXYtPm1hc2tsZW5ndGgpIHsKKwkJCWlmICghdGVzdF9iaXQoaSArIHJ1biwgaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrKSkKKwkJCQlicmVhazsKKwkJCWlmIChpbmRpb19kZXYtPmNoYW5uZWxzW2kgKyBydW5dLmFkZHJlc3MgIT0KKwkJCQlpbmRpb19kZXYtPmNoYW5uZWxzW2ldLmFkZHJlc3MgKyAyICogcnVuKQorCQkJCWJyZWFrOworCQkJcnVuKys7CisJCX0KKworCQlyZXQgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YV9vcl9lbXVsYXRlZCgKKwkJCQlkYXRhLT5jbGllbnQsIGluZGlvX2Rldi0+Y2hhbm5lbHNbaV0uYWRkcmVzcywKKwkJCQlzaXplb2YodTE2KSAqIHJ1biwgJmJ1ZmZlcltqXSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBkb25lOworCQlqICs9IHJ1biAqIHNpemVvZih1MTYpOworCQlpICs9IHJ1biAtIDE7CisJfQorCisJaWYgKGRhdGEtPmF1dG9ub21vdXMpIHsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJU0kxMTQ1X1JFR19JUlFfU1RBVFVTLAorCQkJCWlycV9zdGF0dXMgJiBTSTExNDVfTUFTS19BTExfSUUpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2RldiwgYnVmZmVyLAorCQlpaW9fZ2V0X3RpbWVfbnMoaW5kaW9fZGV2KSk7CisKK2RvbmU6CisJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoaW5kaW9fZGV2LT50cmlnKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgc2kxMTQ1X3NldF9jaGxpc3Qoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdW5zaWduZWQgbG9uZyBzY2FuX21hc2spCit7CisJc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1OCByZWcgPSAwLCBtdXg7CisJaW50IHJldDsKKwlpbnQgaTsKKworCS8qIGNoYW5uZWwgbGlzdCBhbHJlYWR5IHNldCwgbm8gbmVlZCB0byByZXByb2dyYW0gKi8KKwlpZiAoZGF0YS0+c2Nhbl9tYXNrID09IHNjYW5fbWFzaykKKwkJcmV0dXJuIDA7CisKKwlmb3JfZWFjaF9zZXRfYml0KGksICZzY2FuX21hc2ssIGluZGlvX2Rldi0+bWFza2xlbmd0aCkgeworCQlzd2l0Y2ggKGluZGlvX2Rldi0+Y2hhbm5lbHNbaV0uYWRkcmVzcykgeworCQljYXNlIFNJMTE0NV9SRUdfQUxTVklTX0RBVEE6CisJCQlyZWcgfD0gU0kxMTQ1X0NITElTVF9FTl9BTFNWSVM7CisJCQlicmVhazsKKwkJY2FzZSBTSTExNDVfUkVHX0FMU0lSX0RBVEE6CisJCQlyZWcgfD0gU0kxMTQ1X0NITElTVF9FTl9BTFNJUjsKKwkJCWJyZWFrOworCQljYXNlIFNJMTE0NV9SRUdfUFMxX0RBVEE6CisJCQlyZWcgfD0gU0kxMTQ1X0NITElTVF9FTl9QUzE7CisJCQlicmVhazsKKwkJY2FzZSBTSTExNDVfUkVHX1BTMl9EQVRBOgorCQkJcmVnIHw9IFNJMTE0NV9DSExJU1RfRU5fUFMyOworCQkJYnJlYWs7CisJCWNhc2UgU0kxMTQ1X1JFR19QUzNfREFUQToKKwkJCXJlZyB8PSBTSTExNDVfQ0hMSVNUX0VOX1BTMzsKKwkJCWJyZWFrOworCQljYXNlIFNJMTE0NV9SRUdfQVVYX0RBVEE6CisJCQlzd2l0Y2ggKGluZGlvX2Rldi0+Y2hhbm5lbHNbaV0udHlwZSkgeworCQkJY2FzZSBJSU9fVVZJTkRFWDoKKwkJCQlyZWcgfD0gU0kxMTQ1X0NITElTVF9FTl9VVjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmVnIHw9IFNJMTE0NV9DSExJU1RfRU5fQVVYOworCQkJCWlmIChpbmRpb19kZXYtPmNoYW5uZWxzW2ldLnR5cGUgPT0gSUlPX1RFTVApCisJCQkJCW11eCA9IFNJMTE0NV9NVVhfVEVNUDsKKwkJCQllbHNlCisJCQkJCW11eCA9IFNJMTE0NV9NVVhfVkREOworCQkJCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwKKwkJCQkJU0kxMTQ1X1BBUkFNX0FVWF9BRENfTVVYLCBtdXgpOworCQkJCWlmIChyZXQgPCAwKQorCQkJCQlyZXR1cm4gcmV0OworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlkYXRhLT5zY2FuX21hc2sgPSBzY2FuX21hc2s7CisJcmV0ID0gc2kxMTQ1X3BhcmFtX3NldChkYXRhLCBTSTExNDVfUEFSQU1fQ0hMSVNULCByZWcpOworCisJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAwOworfQorCitzdGF0aWMgaW50IHNpMTE0NV9tZWFzdXJlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuKQoreworCXN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdTggY21kOworCWludCByZXQ7CisKKwlyZXQgPSBzaTExNDVfc2V0X2NobGlzdChpbmRpb19kZXYsIEJJVChjaGFuLT5zY2FuX2luZGV4KSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwljbWQgPSAoY2hhbi0+dHlwZSA9PSBJSU9fUFJPWElNSVRZKSA/IFNJMTE0NV9DTURfUFNfRk9SQ0UgOgorCQlTSTExNDVfQ01EX0FMU19GT1JDRTsKKwlyZXQgPSBzaTExNDVfY29tbWFuZChkYXRhLCBjbWQpOworCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRU9WRVJGTE9XKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShkYXRhLT5jbGllbnQsIGNoYW4tPmFkZHJlc3MpOworfQorCisvKgorICogQ29udmVyc2lvbiBiZXR3ZWVuIGlpbyBzY2FsZSBhbmQgQURDX0dBSU4gdmFsdWVzCisgKiBUaGVzZSBjb3VsZCBiZSBmdXJ0aGVyIGFkanVzdGVkIGJ1dCBwcm94aW1pdHkvaW50ZW5zaXR5IGFyZSBkaW1lbnNpb25sZXNzCisgKi8KK3N0YXRpYyBjb25zdCBpbnQgc2kxMTQ1X3Byb3hpbWl0eV9zY2FsZV9hdmFpbGFibGVbXSA9IHsKKwkxMjgsIDY0LCAzMiwgMTYsIDgsIDR9Oworc3RhdGljIGNvbnN0IGludCBzaTExNDVfaW50ZW5zaXR5X3NjYWxlX2F2YWlsYWJsZVtdID0geworCTEyOCwgNjQsIDMyLCAxNiwgOCwgNCwgMiwgMX07CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW5fcHJveGltaXR5X3NjYWxlX2F2YWlsYWJsZSwKKwkiMTI4IDY0IDMyIDE2IDggNCIpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluX2ludGVuc2l0eV9zY2FsZV9hdmFpbGFibGUsCisJIjEyOCA2NCAzMiAxNiA4IDQgMiAxIik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW5faW50ZW5zaXR5X2lyX3NjYWxlX2F2YWlsYWJsZSwKKwkiMTI4IDY0IDMyIDE2IDggNCAyIDEiKTsKKworc3RhdGljIGludCBzaTExNDVfc2NhbGVfZnJvbV9hZGNnYWluKGludCByZWd2YWwpCit7CisJcmV0dXJuIDEyOCA+PiByZWd2YWw7Cit9CisKK3N0YXRpYyBpbnQgc2kxMTQ1X3Byb3hpbWl0eV9hZGNnYWluX2Zyb21fc2NhbGUoaW50IHZhbCwgaW50IHZhbDIpCit7CisJdmFsID0gZmluZF9jbG9zZXN0X2Rlc2NlbmRpbmcodmFsLCBzaTExNDVfcHJveGltaXR5X3NjYWxlX2F2YWlsYWJsZSwKKwkJCQlBUlJBWV9TSVpFKHNpMTE0NV9wcm94aW1pdHlfc2NhbGVfYXZhaWxhYmxlKSk7CisJaWYgKHZhbCA8IDAgfHwgdmFsID4gNSB8fCB2YWwyICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBzaTExNDVfaW50ZW5zaXR5X2FkY2dhaW5fZnJvbV9zY2FsZShpbnQgdmFsLCBpbnQgdmFsMikKK3sKKwl2YWwgPSBmaW5kX2Nsb3Nlc3RfZGVzY2VuZGluZyh2YWwsIHNpMTE0NV9pbnRlbnNpdHlfc2NhbGVfYXZhaWxhYmxlLAorCQkJCUFSUkFZX1NJWkUoc2kxMTQ1X2ludGVuc2l0eV9zY2FsZV9hdmFpbGFibGUpKTsKKwlpZiAodmFsIDwgMCB8fCB2YWwgPiA3IHx8IHZhbDIgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IHNpMTE0NV9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJCWludCAqdmFsLCBpbnQgKnZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3Qgc2kxMTQ1X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisJdTggcmVnOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJCWNhc2UgSUlPX0lOVEVOU0lUWToKKwkJY2FzZSBJSU9fUFJPWElNSVRZOgorCQljYXNlIElJT19WT0xUQUdFOgorCQljYXNlIElJT19URU1QOgorCQljYXNlIElJT19VVklOREVYOgorCQkJcmV0ID0gaWlvX2RldmljZV9jbGFpbV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJcmV0ID0gc2kxMTQ1X21lYXN1cmUoaW5kaW9fZGV2LCBjaGFuKTsKKwkJCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQkqdmFsID0gcmV0OworCisJCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJCWNhc2UgSUlPX0NVUlJFTlQ6CisJCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCVNJMTE0NV9QU19MRURfUkVHKGNoYW4tPmNoYW5uZWwpKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisKKwkJCSp2YWwgPSAocmV0ID4+IFNJMTE0NV9QU19MRURfU0hJRlQoY2hhbi0+Y2hhbm5lbCkpCisJCQkJJiAweDBmOworCisJCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKKwkJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJCWNhc2UgSUlPX1BST1hJTUlUWToKKwkJCXJlZyA9IFNJMTE0NV9QQVJBTV9QU19BRENfR0FJTjsKKwkJCWJyZWFrOworCQljYXNlIElJT19JTlRFTlNJVFk6CisJCQlpZiAoY2hhbi0+Y2hhbm5lbDIgPT0gSUlPX01PRF9MSUdIVF9JUikKKwkJCQlyZWcgPSBTSTExNDVfUEFSQU1fQUxTSVJfQURDX0dBSU47CisJCQllbHNlCisJCQkJcmVnID0gU0kxMTQ1X1BBUkFNX0FMU1ZJU19BRENfR0FJTjsKKwkJCWJyZWFrOworCQljYXNlIElJT19URU1QOgorCQkJKnZhbCA9IDI4OworCQkJKnZhbDIgPSA1NzE0Mjk7CisJCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKKwkJY2FzZSBJSU9fVVZJTkRFWDoKKwkJCSp2YWwgPSAwOworCQkJKnZhbDIgPSAxMDAwMDsKKwkJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlyZXQgPSBzaTExNDVfcGFyYW1fcXVlcnkoZGF0YSwgcmVnKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCSp2YWwgPSBzaTExNDVfc2NhbGVfZnJvbV9hZGNnYWluKHJldCAmIDB4MDcpOworCisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlIElJT19DSEFOX0lORk9fT0ZGU0VUOgorCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fVEVNUDoKKwkJCS8qCisJCQkgKiAtQURDIG9mZnNldCAtIEFEQyBjb3VudHMgQCAyNcKwQyAtCisJCQkgKiAgIDM1ICogQURDIGNvdW50cyAvIMKwQworCQkJICovCisJCQkqdmFsID0gLTI1NiAtIDExMTM2ICsgMjUgKiAzNTsKKwkJCXJldHVybiBJSU9fVkFMX0lOVDsKKwkJZGVmYXVsdDoKKwkJCS8qCisJCQkgKiBBbGwgQURDIG1lYXN1cmVtZW50cyBoYXZlIGFyZSBieSBkZWZhdWx0IG9mZnNldAorCQkJICogYnkgLTI1NgorCQkJICogU2VlIEFONDk4IDUuNi4zCisJCQkgKi8KKwkJCXJldCA9IHNpMTE0NV9wYXJhbV9xdWVyeShkYXRhLCBTSTExNDVfUEFSQU1fQURDX09GRlNFVCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJKnZhbCA9IC1zaTExNDVfdW5jb21wcmVzcyhyZXQpOworCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQl9CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUToKKwkJcmV0dXJuIHNpMTE0NV9yZWFkX3NhbXBfZnJlcShkYXRhLCB2YWwsIHZhbDIpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBzaTExNDVfd3JpdGVfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgICAgaW50IHZhbCwgaW50IHZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3Qgc2kxMTQ1X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXU4IHJlZzEsIHJlZzIsIHNoaWZ0OworCWludCByZXQ7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19QUk9YSU1JVFk6CisJCQl2YWwgPSBzaTExNDVfcHJveGltaXR5X2FkY2dhaW5fZnJvbV9zY2FsZSh2YWwsIHZhbDIpOworCQkJaWYgKHZhbCA8IDApCisJCQkJcmV0dXJuIHZhbDsKKwkJCXJlZzEgPSBTSTExNDVfUEFSQU1fUFNfQURDX0dBSU47CisJCQlyZWcyID0gU0kxMTQ1X1BBUkFNX1BTX0FEQ19DT1VOVEVSOworCQkJYnJlYWs7CisJCWNhc2UgSUlPX0lOVEVOU0lUWToKKwkJCXZhbCA9IHNpMTE0NV9pbnRlbnNpdHlfYWRjZ2Fpbl9mcm9tX3NjYWxlKHZhbCwgdmFsMik7CisJCQlpZiAodmFsIDwgMCkKKwkJCQlyZXR1cm4gdmFsOworCQkJaWYgKGNoYW4tPmNoYW5uZWwyID09IElJT19NT0RfTElHSFRfSVIpIHsKKwkJCQlyZWcxID0gU0kxMTQ1X1BBUkFNX0FMU0lSX0FEQ19HQUlOOworCQkJCXJlZzIgPSBTSTExNDVfUEFSQU1fQUxTSVJfQURDX0NPVU5URVI7CisJCQl9IGVsc2UgeworCQkJCXJlZzEgPSBTSTExNDVfUEFSQU1fQUxTVklTX0FEQ19HQUlOOworCQkJCXJlZzIgPSBTSTExNDVfUEFSQU1fQUxTVklTX0FEQ19DT1VOVEVSOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJldCA9IGlpb19kZXZpY2VfY2xhaW1fZGlyZWN0X21vZGUoaW5kaW9fZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gc2kxMTQ1X3BhcmFtX3NldChkYXRhLCByZWcxLCB2YWwpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWlvX2RldmljZV9yZWxlYXNlX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCS8qIFNldCByZWNvdmVyeSBwZXJpb2QgdG8gb25lJ3MgY29tcGxlbWVudCBvZiBnYWluICovCisJCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgcmVnMiwgKH52YWwgJiAweDA3KSA8PCA0KTsKKwkJaWlvX2RldmljZV9yZWxlYXNlX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJCXJldHVybiByZXQ7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJaWYgKGNoYW4tPnR5cGUgIT0gSUlPX0NVUlJFTlQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAodmFsIDwgMCB8fCB2YWwgPiAxNSB8fCB2YWwyICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZWcxID0gU0kxMTQ1X1BTX0xFRF9SRUcoY2hhbi0+Y2hhbm5lbCk7CisJCXNoaWZ0ID0gU0kxMTQ1X1BTX0xFRF9TSElGVChjaGFuLT5jaGFubmVsKTsKKworCQlyZXQgPSBpaW9fZGV2aWNlX2NsYWltX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIHJlZzEpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWlvX2RldmljZV9yZWxlYXNlX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCByZWcxLAorCQkJKHJldCAmIH4oMHgwZiA8PCBzaGlmdCkpIHwKKwkJCSgodmFsICYgMHgwZikgPDwgc2hpZnQpKTsKKwkJaWlvX2RldmljZV9yZWxlYXNlX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJCXJldHVybiByZXQ7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUToKKwkJcmV0dXJuIHNpMTE0NV9zdG9yZV9zYW1wX2ZyZXEoZGF0YSwgdmFsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKyNkZWZpbmUgU0kxMTQ1X1NUIHsgXAorCS5zaWduID0gJ3UnLCBcCisJLnJlYWxiaXRzID0gMTYsIFwKKwkuc3RvcmFnZWJpdHMgPSAxNiwgXAorCS5lbmRpYW5uZXNzID0gSUlPX0xFLCBcCit9CisKKyNkZWZpbmUgU0kxMTQ1X0lOVEVOU0lUWV9DSEFOTkVMKF9zaSkgeyBcCisJLnR5cGUgPSBJSU9fSU5URU5TSVRZLCBcCisJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfCBcCisJCQkgICAgICBCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpIHwgXAorCQkJICAgICAgQklUKElJT19DSEFOX0lORk9fU0NBTEUpLCBcCisJLmluZm9fbWFza19zaGFyZWRfYnlfYWxsID0gQklUKElJT19DSEFOX0lORk9fU0FNUF9GUkVRKSwgXAorCS5zY2FuX3R5cGUgPSBTSTExNDVfU1QsIFwKKwkuc2Nhbl9pbmRleCA9IF9zaSwgXAorCS5hZGRyZXNzID0gU0kxMTQ1X1JFR19BTFNWSVNfREFUQSwgXAorfQorCisjZGVmaW5lIFNJMTE0NV9JTlRFTlNJVFlfSVJfQ0hBTk5FTChfc2kpIHsgXAorCS50eXBlID0gSUlPX0lOVEVOU0lUWSwgXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwgXAorCQkJICAgICAgQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSB8IFwKKwkJCSAgICAgIEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwgXAorCS5pbmZvX21hc2tfc2hhcmVkX2J5X2FsbCA9IEJJVChJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUSksIFwKKwkubW9kaWZpZWQgPSAxLCBcCisJLmNoYW5uZWwyID0gSUlPX01PRF9MSUdIVF9JUiwgXAorCS5zY2FuX3R5cGUgPSBTSTExNDVfU1QsIFwKKwkuc2Nhbl9pbmRleCA9IF9zaSwgXAorCS5hZGRyZXNzID0gU0kxMTQ1X1JFR19BTFNJUl9EQVRBLCBcCit9CisKKyNkZWZpbmUgU0kxMTQ1X1RFTVBfQ0hBTk5FTChfc2kpIHsgXAorCS50eXBlID0gSUlPX1RFTVAsIFwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSB8IFwKKwkJCSAgICAgIEJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCkgfCBcCisJCQkgICAgICBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksIFwKKwkuaW5mb19tYXNrX3NoYXJlZF9ieV9hbGwgPSBCSVQoSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEpLCBcCisJLnNjYW5fdHlwZSA9IFNJMTE0NV9TVCwgXAorCS5zY2FuX2luZGV4ID0gX3NpLCBcCisJLmFkZHJlc3MgPSBTSTExNDVfUkVHX0FVWF9EQVRBLCBcCit9CisKKyNkZWZpbmUgU0kxMTQ1X1VWX0NIQU5ORUwoX3NpKSB7IFwKKwkudHlwZSA9IElJT19VVklOREVYLCBcCisJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfCBcCisJCQkgICAgICBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksIFwKKwkuaW5mb19tYXNrX3NoYXJlZF9ieV9hbGwgPSBCSVQoSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEpLCBcCisJLnNjYW5fdHlwZSA9IFNJMTE0NV9TVCwgXAorCS5zY2FuX2luZGV4ID0gX3NpLCBcCisJLmFkZHJlc3MgPSBTSTExNDVfUkVHX0FVWF9EQVRBLCBcCit9CisKKyNkZWZpbmUgU0kxMTQ1X1BST1hJTUlUWV9DSEFOTkVMKF9zaSwgX2NoKSB7IFwKKwkudHlwZSA9IElJT19QUk9YSU1JVFksIFwKKwkuaW5kZXhlZCA9IDEsIFwKKwkuY2hhbm5lbCA9IF9jaCwgXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLCBcCisJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSB8IFwKKwkJCQkgICAgQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSwgXAorCS5pbmZvX21hc2tfc2hhcmVkX2J5X2FsbCA9IEJJVChJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUSksIFwKKwkuc2Nhbl90eXBlID0gU0kxMTQ1X1NULCBcCisJLnNjYW5faW5kZXggPSBfc2ksIFwKKwkuYWRkcmVzcyA9IFNJMTE0NV9SRUdfUFMxX0RBVEEgKyBfY2ggKiAyLCBcCit9CisKKyNkZWZpbmUgU0kxMTQ1X1ZPTFRBR0VfQ0hBTk5FTChfc2kpIHsgXAorCS50eXBlID0gSUlPX1ZPTFRBR0UsIFwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwgXAorCS5pbmZvX21hc2tfc2hhcmVkX2J5X2FsbCA9IEJJVChJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUSksIFwKKwkuc2Nhbl90eXBlID0gU0kxMTQ1X1NULCBcCisJLnNjYW5faW5kZXggPSBfc2ksIFwKKwkuYWRkcmVzcyA9IFNJMTE0NV9SRUdfQVVYX0RBVEEsIFwKK30KKworI2RlZmluZSBTSTExNDVfQ1VSUkVOVF9DSEFOTkVMKF9jaCkgeyBcCisJLnR5cGUgPSBJSU9fQ1VSUkVOVCwgXAorCS5pbmRleGVkID0gMSwgXAorCS5jaGFubmVsID0gX2NoLCBcCisJLm91dHB1dCA9IDEsIFwKKwkuc2Nhbl9pbmRleCA9IC0xLCBcCisJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksIFwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHNpMTEzMl9jaGFubmVsc1tdID0geworCVNJMTE0NV9JTlRFTlNJVFlfQ0hBTk5FTCgwKSwKKwlTSTExNDVfSU5URU5TSVRZX0lSX0NIQU5ORUwoMSksCisJU0kxMTQ1X1RFTVBfQ0hBTk5FTCgyKSwKKwlTSTExNDVfVk9MVEFHRV9DSEFOTkVMKDMpLAorCVNJMTE0NV9VVl9DSEFOTkVMKDQpLAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHNpMTE0MV9jaGFubmVsc1tdID0geworCVNJMTE0NV9JTlRFTlNJVFlfQ0hBTk5FTCgwKSwKKwlTSTExNDVfSU5URU5TSVRZX0lSX0NIQU5ORUwoMSksCisJU0kxMTQ1X1BST1hJTUlUWV9DSEFOTkVMKDIsIDApLAorCVNJMTE0NV9URU1QX0NIQU5ORUwoMyksCisJU0kxMTQ1X1ZPTFRBR0VfQ0hBTk5FTCg0KSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg1KSwKKwlTSTExNDVfQ1VSUkVOVF9DSEFOTkVMKDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHNpMTE0Ml9jaGFubmVsc1tdID0geworCVNJMTE0NV9JTlRFTlNJVFlfQ0hBTk5FTCgwKSwKKwlTSTExNDVfSU5URU5TSVRZX0lSX0NIQU5ORUwoMSksCisJU0kxMTQ1X1BST1hJTUlUWV9DSEFOTkVMKDIsIDApLAorCVNJMTE0NV9QUk9YSU1JVFlfQ0hBTk5FTCgzLCAxKSwKKwlTSTExNDVfVEVNUF9DSEFOTkVMKDQpLAorCVNJMTE0NV9WT0xUQUdFX0NIQU5ORUwoNSksCisJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoNiksCisJU0kxMTQ1X0NVUlJFTlRfQ0hBTk5FTCgwKSwKKwlTSTExNDVfQ1VSUkVOVF9DSEFOTkVMKDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHNpMTE0M19jaGFubmVsc1tdID0geworCVNJMTE0NV9JTlRFTlNJVFlfQ0hBTk5FTCgwKSwKKwlTSTExNDVfSU5URU5TSVRZX0lSX0NIQU5ORUwoMSksCisJU0kxMTQ1X1BST1hJTUlUWV9DSEFOTkVMKDIsIDApLAorCVNJMTE0NV9QUk9YSU1JVFlfQ0hBTk5FTCgzLCAxKSwKKwlTSTExNDVfUFJPWElNSVRZX0NIQU5ORUwoNCwgMiksCisJU0kxMTQ1X1RFTVBfQ0hBTk5FTCg1KSwKKwlTSTExNDVfVk9MVEFHRV9DSEFOTkVMKDYpLAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDcpLAorCVNJMTE0NV9DVVJSRU5UX0NIQU5ORUwoMCksCisJU0kxMTQ1X0NVUlJFTlRfQ0hBTk5FTCgxKSwKKwlTSTExNDVfQ1VSUkVOVF9DSEFOTkVMKDIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHNpMTE0NV9jaGFubmVsc1tdID0geworCVNJMTE0NV9JTlRFTlNJVFlfQ0hBTk5FTCgwKSwKKwlTSTExNDVfSU5URU5TSVRZX0lSX0NIQU5ORUwoMSksCisJU0kxMTQ1X1BST1hJTUlUWV9DSEFOTkVMKDIsIDApLAorCVNJMTE0NV9URU1QX0NIQU5ORUwoMyksCisJU0kxMTQ1X1ZPTFRBR0VfQ0hBTk5FTCg0KSwKKwlTSTExNDVfVVZfQ0hBTk5FTCg1KSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg2KSwKKwlTSTExNDVfQ1VSUkVOVF9DSEFOTkVMKDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHNpMTE0Nl9jaGFubmVsc1tdID0geworCVNJMTE0NV9JTlRFTlNJVFlfQ0hBTk5FTCgwKSwKKwlTSTExNDVfSU5URU5TSVRZX0lSX0NIQU5ORUwoMSksCisJU0kxMTQ1X1RFTVBfQ0hBTk5FTCgyKSwKKwlTSTExNDVfVk9MVEFHRV9DSEFOTkVMKDMpLAorCVNJMTE0NV9VVl9DSEFOTkVMKDQpLAorCVNJMTE0NV9QUk9YSU1JVFlfQ0hBTk5FTCg1LCAwKSwKKwlTSTExNDVfUFJPWElNSVRZX0NIQU5ORUwoNiwgMSksCisJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoNyksCisJU0kxMTQ1X0NVUlJFTlRfQ0hBTk5FTCgwKSwKKwlTSTExNDVfQ1VSUkVOVF9DSEFOTkVMKDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHNpMTE0N19jaGFubmVsc1tdID0geworCVNJMTE0NV9JTlRFTlNJVFlfQ0hBTk5FTCgwKSwKKwlTSTExNDVfSU5URU5TSVRZX0lSX0NIQU5ORUwoMSksCisJU0kxMTQ1X1BST1hJTUlUWV9DSEFOTkVMKDIsIDApLAorCVNJMTE0NV9QUk9YSU1JVFlfQ0hBTk5FTCgzLCAxKSwKKwlTSTExNDVfUFJPWElNSVRZX0NIQU5ORUwoNCwgMiksCisJU0kxMTQ1X1RFTVBfQ0hBTk5FTCg1KSwKKwlTSTExNDVfVk9MVEFHRV9DSEFOTkVMKDYpLAorCVNJMTE0NV9VVl9DSEFOTkVMKDcpLAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDgpLAorCVNJMTE0NV9DVVJSRU5UX0NIQU5ORUwoMCksCisJU0kxMTQ1X0NVUlJFTlRfQ0hBTk5FTCgxKSwKKwlTSTExNDVfQ1VSUkVOVF9DSEFOTkVMKDIpLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnNpMTEzMl9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19jb25zdF9hdHRyX2luX2ludGVuc2l0eV9zY2FsZV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5faW50ZW5zaXR5X2lyX3NjYWxlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc2kxMTR4X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2NvbnN0X2F0dHJfaW5faW50ZW5zaXR5X3NjYWxlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl9pbnRlbnNpdHlfaXJfc2NhbGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luX3Byb3hpbWl0eV9zY2FsZV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgc2kxMTMyX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBzaTExMzJfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNpMTE0eF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gc2kxMTR4X2F0dHJpYnV0ZXMsCit9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gc2kxMTMyX2luZm8gPSB7CisJLnJlYWRfcmF3ID0gc2kxMTQ1X3JlYWRfcmF3LAorCS53cml0ZV9yYXcgPSBzaTExNDVfd3JpdGVfcmF3LAorCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJLmF0dHJzID0gJnNpMTEzMl9hdHRyaWJ1dGVfZ3JvdXAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIHNpMTE0eF9pbmZvID0geworCS5yZWFkX3JhdyA9IHNpMTE0NV9yZWFkX3JhdywKKwkud3JpdGVfcmF3ID0gc2kxMTQ1X3dyaXRlX3JhdywKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5hdHRycyA9ICZzaTExNHhfYXR0cmlidXRlX2dyb3VwLAorfTsKKworI2RlZmluZSBTSTExNDVfUEFSVChpZCwgaWlvX2luZm8sIGNoYW5zLCBsZWRzLCB1bmNvbXByZXNzZWRfbWVhc19yYXRlKSBcCisJe2lkLCBpaW9faW5mbywgY2hhbnMsIEFSUkFZX1NJWkUoY2hhbnMpLCBsZWRzLCB1bmNvbXByZXNzZWRfbWVhc19yYXRlfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNpMTE0NV9wYXJ0X2luZm8gc2kxMTQ1X3BhcnRfaW5mb1tdID0geworCVtTSTExMzJdID0gU0kxMTQ1X1BBUlQoMHgzMiwgJnNpMTEzMl9pbmZvLCBzaTExMzJfY2hhbm5lbHMsIDAsIHRydWUpLAorCVtTSTExNDFdID0gU0kxMTQ1X1BBUlQoMHg0MSwgJnNpMTE0eF9pbmZvLCBzaTExNDFfY2hhbm5lbHMsIDEsIGZhbHNlKSwKKwlbU0kxMTQyXSA9IFNJMTE0NV9QQVJUKDB4NDIsICZzaTExNHhfaW5mbywgc2kxMTQyX2NoYW5uZWxzLCAyLCBmYWxzZSksCisJW1NJMTE0M10gPSBTSTExNDVfUEFSVCgweDQzLCAmc2kxMTR4X2luZm8sIHNpMTE0M19jaGFubmVscywgMywgZmFsc2UpLAorCVtTSTExNDVdID0gU0kxMTQ1X1BBUlQoMHg0NSwgJnNpMTE0eF9pbmZvLCBzaTExNDVfY2hhbm5lbHMsIDEsIHRydWUpLAorCVtTSTExNDZdID0gU0kxMTQ1X1BBUlQoMHg0NiwgJnNpMTE0eF9pbmZvLCBzaTExNDZfY2hhbm5lbHMsIDIsIHRydWUpLAorCVtTSTExNDddID0gU0kxMTQ1X1BBUlQoMHg0NywgJnNpMTE0eF9pbmZvLCBzaTExNDdfY2hhbm5lbHMsIDMsIHRydWUpLAorfTsKKworc3RhdGljIGludCBzaTExNDVfaW5pdGlhbGl6ZShzdHJ1Y3Qgc2kxMTQ1X2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFNJMTE0NV9SRUdfQ09NTUFORCwKKwkJCQkJU0kxMTQ1X0NNRF9SRVNFVCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJbXNsZWVwKFNJMTE0NV9DT01NQU5EX1RJTUVPVVRfTVMpOworCisJLyogSGFyZHdhcmUga2V5LCBtYWdpYyB2YWx1ZSAqLworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBTSTExNDVfUkVHX0hXX0tFWSwgMHgxNyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJbXNsZWVwKFNJMTE0NV9DT01NQU5EX1RJTUVPVVRfTVMpOworCisJLyogVHVybiBvZmYgYXV0b25vbW91cyBtb2RlICovCisJcmV0ID0gc2kxMTQ1X3NldF9tZWFzX3JhdGUoZGF0YSwgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBJbml0aWFsaXplIHNhbXBsaW5nIGZyZXEgdG8gMTAgSHogKi8KKwlyZXQgPSBzaTExNDVfc3RvcmVfc2FtcF9mcmVxKGRhdGEsIDEwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFNldCBMRUQgY3VycmVudHMgdG8gNDUgbUE7IGhhdmUgNCBiaXRzLCBzZWUgVGFibGUgMiBpbiBkYXRhc2hlZXQgKi8KKwlzd2l0Y2ggKGRhdGEtPnBhcnRfaW5mby0+bnVtX2xlZHMpIHsKKwljYXNlIDM6CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJU0kxMTQ1X1JFR19QU19MRUQzLAorCQkJCQkJU0kxMTQ1X0xFRF9DVVJSRU5UXzQ1bUEpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSAyOgorCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCVNJMTE0NV9SRUdfUFNfTEVEMjEsCisJCQkJCQkoU0kxMTQ1X0xFRF9DVVJSRU5UXzQ1bUEgPDwgNCkgfAorCQkJCQkJU0kxMTQ1X0xFRF9DVVJSRU5UXzQ1bUEpOworCQlicmVhazsKKwljYXNlIDE6CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJU0kxMTQ1X1JFR19QU19MRUQyMSwKKwkJCQkJCVNJMTE0NV9MRURfQ1VSUkVOVF80NW1BKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJfQorCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0IG5vcm1hbCBwcm94aW1pdHkgbWVhc3VyZW1lbnQgbW9kZSAqLworCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgU0kxMTQ1X1BBUkFNX1BTX0FEQ19NSVNDLAorCQkJICAgICAgIFNJMTE0NV9QU19BRENfTU9ERV9OT1JNQUwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc2kxMTQ1X3BhcmFtX3NldChkYXRhLCBTSTExNDVfUEFSQU1fUFNfQURDX0dBSU4sIDB4MDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogQURDX0NPVU5URVIgc2hvdWxkIGJlIG9uZSBjb21wbGVtZW50IG9mIEFEQ19HQUlOICovCisJcmV0ID0gc2kxMTQ1X3BhcmFtX3NldChkYXRhLCBTSTExNDVfUEFSQU1fUFNfQURDX0NPVU5URVIsIDB4MDYgPDwgNCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBTZXQgQUxTIHZpc2libGUgbWVhc3VyZW1lbnQgbW9kZSAqLworCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgU0kxMTQ1X1BBUkFNX0FMU1ZJU19BRENfTUlTQywKKwkJCSAgICAgICBTSTExNDVfQURDX01JU0NfUkFOR0UpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc2kxMTQ1X3BhcmFtX3NldChkYXRhLCBTSTExNDVfUEFSQU1fQUxTVklTX0FEQ19HQUlOLCAweDAzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgU0kxMTQ1X1BBUkFNX0FMU1ZJU19BRENfQ09VTlRFUiwKKwkJCSAgICAgICAweDA0IDw8IDQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0IEFMUyBJUiBtZWFzdXJlbWVudCBtb2RlICovCisJcmV0ID0gc2kxMTQ1X3BhcmFtX3NldChkYXRhLCBTSTExNDVfUEFSQU1fQUxTSVJfQURDX01JU0MsCisJCQkgICAgICAgU0kxMTQ1X0FEQ19NSVNDX1JBTkdFKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgU0kxMTQ1X1BBUkFNX0FMU0lSX0FEQ19HQUlOLCAweDAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgU0kxMTQ1X1BBUkFNX0FMU0lSX0FEQ19DT1VOVEVSLAorCQkJICAgICAgIDB4MDYgPDwgNCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIEluaXRpYWxpemUgVUNPRUYgdG8gZGVmYXVsdCB2YWx1ZXMgaW4gZGF0YXNoZWV0CisJICogVGhlc2UgcmVnaXN0ZXJzIGFyZSBub3JtYWxseSB6ZXJvIG9uIHJlc2V0CisJICovCisJaWYgKGRhdGEtPnBhcnRfaW5mbyA9PSAmc2kxMTQ1X3BhcnRfaW5mb1tTSTExMzJdIHx8CisJCWRhdGEtPnBhcnRfaW5mbyA9PSAmc2kxMTQ1X3BhcnRfaW5mb1tTSTExNDVdIHx8CisJCWRhdGEtPnBhcnRfaW5mbyA9PSAmc2kxMTQ1X3BhcnRfaW5mb1tTSTExNDZdIHx8CisJCWRhdGEtPnBhcnRfaW5mbyA9PSAmc2kxMTQ1X3BhcnRfaW5mb1tTSTExNDddKSB7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCQkJU0kxMTQ1X1JFR19VQ09FRjEsCisJCQkJCQlTSTExNDVfVUNPRUYxX0RFRkFVTFQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCVNJMTE0NV9SRUdfVUNPRUYyLCBTSTExNDVfVUNPRUYyX0RFRkFVTFQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCVNJMTE0NV9SRUdfVUNPRUYzLCBTSTExNDVfVUNPRUYzX0RFRkFVTFQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCVNJMTE0NV9SRUdfVUNPRUY0LCBTSTExNDVfVUNPRUY0X0RFRkFVTFQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9ncmFtIHRoZSBjaGFubmVscyB3ZSB3YW50IHRvIG1lYXN1cmUgd2l0aCBDTURfUFNBTFNfQVVUTy4gTm8gbmVlZCBmb3IKKyAqIF9wb3N0ZGlzYWJsZSBhcyB3ZSBzdG9wIHdpdGggQ01EX1BTQUxTX1BBVVNFOyBzaW5nbGUgbWVhc3VyZW1lbnQgKGRpcmVjdCkKKyAqIG1vZGUgcmVwcm9ncmFtcyB0aGUgY2hhbm5lbHMgbGlzdCBhbnl3YXkuLi4KKyAqLworc3RhdGljIGludCBzaTExNDVfYnVmZmVyX3ByZWVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCXJldCA9IHNpMTE0NV9zZXRfY2hsaXN0KGluZGlvX2RldiwgKmluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzayk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBib29sIHNpMTE0NV92YWxpZGF0ZV9zY2FuX21hc2soc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nICpzY2FuX21hc2spCit7CisJc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCWludCBpOworCisJLyogQ2hlY2sgdGhhdCBhdCBtb3N0IG9uZSBBVVggY2hhbm5lbCBpcyBlbmFibGVkICovCisJZm9yX2VhY2hfc2V0X2JpdChpLCBzY2FuX21hc2ssIGRhdGEtPnBhcnRfaW5mby0+bnVtX2NoYW5uZWxzKSB7CisJCWlmIChpbmRpb19kZXYtPmNoYW5uZWxzW2ldLmFkZHJlc3MgPT0gU0kxMTQ1X1JFR19BVVhfREFUQSkKKwkJCWNvdW50Kys7CisJfQorCisJcmV0dXJuIGNvdW50IDw9IDE7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgc2kxMTQ1X2J1ZmZlcl9zZXR1cF9vcHMgPSB7CisJLnByZWVuYWJsZSA9IHNpMTE0NV9idWZmZXJfcHJlZW5hYmxlLAorCS5wb3N0ZW5hYmxlID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSwKKwkucHJlZGlzYWJsZSA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3ByZWRpc2FibGUsCisJLnZhbGlkYXRlX3NjYW5fbWFzayA9IHNpMTE0NV92YWxpZGF0ZV9zY2FuX21hc2ssCit9OworCisvKioKKyAqIHNpMTE0NV90cmlnZ2VyX3NldF9zdGF0ZSgpIC0gU2V0IHRyaWdnZXIgc3RhdGUKKyAqCisgKiBXaGVuIG5vdCB1c2luZyB0cmlnZ2VycyBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBhbmQgbWVhc3VyZW1lbnQgcmF0ZSBpcworICogc2V0IHRvIHplcm8gaW4gb3JkZXIgdG8gbWluaW1pemUgcG93ZXIgY29uc3VtcHRpb24uCisgKi8KK3N0YXRpYyBpbnQgc2kxMTQ1X3RyaWdnZXJfc2V0X3N0YXRlKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywgYm9vbCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaWlvX3RyaWdnZXJfZ2V0X2RydmRhdGEodHJpZyk7CisJc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgZXJyID0gMCwgcmV0OworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisKKwlpZiAoc3RhdGUpIHsKKwkJZGF0YS0+YXV0b25vbW91cyA9IHRydWU7CisJCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCVNJMTE0NV9SRUdfSU5UX0NGRywgU0kxMTQ1X0lOVF9DRkdfT0UpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZGlzYWJsZTsKKwkJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJU0kxMTQ1X1JFR19JUlFfRU5BQkxFLCBTSTExNDVfTUFTS19BTExfSUUpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZGlzYWJsZTsKKwkJZXJyID0gc2kxMTQ1X3NldF9tZWFzX3JhdGUoZGF0YSwgZGF0YS0+bWVhc19yYXRlKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGRpc2FibGU7CisJCWVyciA9IHNpMTE0NV9jb21tYW5kKGRhdGEsIFNJMTE0NV9DTURfUFNBTFNfQVVUTyk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBkaXNhYmxlOworCX0gZWxzZSB7CitkaXNhYmxlOgorCQkvKiBEaXNhYmxlIGFzIG11Y2ggYXMgcG9zc2libGUgc2tpcHBpbmcgZXJyb3JzICovCisJCXJldCA9IHNpMTE0NV9jb21tYW5kKGRhdGEsIFNJMTE0NV9DTURfUFNBTFNfUEFVU0UpOworCQlpZiAocmV0IDwgMCAmJiAhZXJyKQorCQkJZXJyID0gcmV0OworCQlyZXQgPSBzaTExNDVfc2V0X21lYXNfcmF0ZShkYXRhLCAwKTsKKwkJaWYgKHJldCA8IDAgJiYgIWVycikKKwkJCWVyciA9IHJldDsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJCQlTSTExNDVfUkVHX0lSUV9FTkFCTEUsIDApOworCQlpZiAocmV0IDwgMCAmJiAhZXJyKQorCQkJZXJyID0gcmV0OworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkJCVNJMTE0NV9SRUdfSU5UX0NGRywgMCk7CisJCWlmIChyZXQgPCAwICYmICFlcnIpCisJCQllcnIgPSByZXQ7CisJCWRhdGEtPmF1dG9ub21vdXMgPSBmYWxzZTsKKwl9CisKKwltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3RyaWdnZXJfb3BzIHNpMTE0NV90cmlnZ2VyX29wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuc2V0X3RyaWdnZXJfc3RhdGUgPSBzaTExNDVfdHJpZ2dlcl9zZXRfc3RhdGUsCit9OworCitzdGF0aWMgaW50IHNpMTE0NV9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCXN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZzsKKwlpbnQgcmV0OworCisJdHJpZyA9IGRldm1faWlvX3RyaWdnZXJfYWxsb2MoJmNsaWVudC0+ZGV2LAorCQkJIiVzLWRldiVkIiwgaW5kaW9fZGV2LT5uYW1lLCBpbmRpb19kZXYtPmlkKTsKKwlpZiAoIXRyaWcpCisJCXJldHVybiAtRU5PTUVNOworCisJdHJpZy0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwl0cmlnLT5vcHMgPSAmc2kxMTQ1X3RyaWdnZXJfb3BzOworCWlpb190cmlnZ2VyX3NldF9kcnZkYXRhKHRyaWcsIGluZGlvX2Rldik7CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZjbGllbnQtPmRldiwgY2xpZW50LT5pcnEsCisJCQkgIGlpb190cmlnZ2VyX2dlbmVyaWNfZGF0YV9yZHlfcG9sbCwKKwkJCSAgSVJRRl9UUklHR0VSX0ZBTExJTkcsCisJCQkgICJzaTExNDVfaXJxIiwKKwkJCSAgdHJpZyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpcnEgcmVxdWVzdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGlpb190cmlnZ2VyX3JlZ2lzdGVyKHRyaWcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlkYXRhLT50cmlnID0gdHJpZzsKKwlpbmRpb19kZXYtPnRyaWcgPSBpaW9fdHJpZ2dlcl9nZXQoZGF0YS0+dHJpZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2kxMTQ1X3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlmIChkYXRhLT50cmlnKSB7CisJCWlpb190cmlnZ2VyX3VucmVnaXN0ZXIoZGF0YS0+dHJpZyk7CisJCWRhdGEtPnRyaWcgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBzaTExNDVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3Qgc2kxMTQ1X2RhdGEgKmRhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwl1OCBwYXJ0X2lkLCByZXZfaWQsIHNlcV9pZDsKKwlpbnQgcmV0OworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpkYXRhKSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaW5kaW9fZGV2KTsKKwlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisJZGF0YS0+cGFydF9pbmZvID0gJnNpMTE0NV9wYXJ0X2luZm9baWQtPmRyaXZlcl9kYXRhXTsKKworCXBhcnRfaWQgPSByZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCQkJIFNJMTE0NV9SRUdfUEFSVF9JRCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV2X2lkID0gcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkJCVNJMTE0NV9SRUdfUkVWX0lEKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlzZXFfaWQgPSByZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCQkJU0kxMTQ1X1JFR19TRVFfSUQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWRldl9pbmZvKCZjbGllbnQtPmRldiwgImRldmljZSBJRCBwYXJ0ICUjMDJoaHggcmV2ICUjMDJoaHggc2VxICUjMDJoaHhcbiIsCisJCQlwYXJ0X2lkLCByZXZfaWQsIHNlcV9pZCk7CisJaWYgKHBhcnRfaWQgIT0gZGF0YS0+cGFydF9pbmZvLT5wYXJ0KSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAicGFydCBJRCBtaXNtYXRjaCBnb3QgJSMwMmhoeCwgZXhwZWN0ZWQgJSMwMnhcbiIsCisJCQkJcGFydF9pZCwgZGF0YS0+cGFydF9pbmZvLT5wYXJ0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWluZGlvX2Rldi0+bmFtZSA9IGlkLT5uYW1lOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBkYXRhLT5wYXJ0X2luZm8tPmNoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gZGF0YS0+cGFydF9pbmZvLT5udW1fY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5pbmZvID0gZGF0YS0+cGFydF9pbmZvLT5paW9faW5mbzsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwltdXRleF9pbml0KCZkYXRhLT5sb2NrKTsKKwltdXRleF9pbml0KCZkYXRhLT5jbWRsb2NrKTsKKworCXJldCA9IHNpMTE0NV9pbml0aWFsaXplKGRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBOVUxMLAorCQlzaTExNDVfdHJpZ2dlcl9oYW5kbGVyLCAmc2kxMTQ1X2J1ZmZlcl9zZXR1cF9vcHMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGNsaWVudC0+aXJxKSB7CisJCXJldCA9IHNpMTE0NV9wcm9iZV90cmlnZ2VyKGluZGlvX2Rldik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJvcl9mcmVlX2J1ZmZlcjsKKwl9IGVsc2UgeworCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJubyBpcnEsIHVzaW5nIHBvbGxpbmdcbiIpOworCX0KKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9mcmVlX3RyaWdnZXI7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV90cmlnZ2VyOgorCXNpMTE0NV9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworZXJyb3JfZnJlZV9idWZmZXI6CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHNpMTE0NV9pZHNbXSA9IHsKKwl7ICJzaTExMzIiLCBTSTExMzIgfSwKKwl7ICJzaTExNDEiLCBTSTExNDEgfSwKKwl7ICJzaTExNDIiLCBTSTExNDIgfSwKKwl7ICJzaTExNDMiLCBTSTExNDMgfSwKKwl7ICJzaTExNDUiLCBTSTExNDUgfSwKKwl7ICJzaTExNDYiLCBTSTExNDYgfSwKKwl7ICJzaTExNDciLCBTSTExNDcgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgc2kxMTQ1X2lkcyk7CisKK3N0YXRpYyBpbnQgc2kxMTQ1X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCXNpMTE0NV9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgc2kxMTQ1X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSAgID0gInNpMTE0NSIsCisJfSwKKwkucHJvYmUgID0gc2kxMTQ1X3Byb2JlLAorCS5yZW1vdmUgPSBzaTExNDVfcmVtb3ZlLAorCS5pZF90YWJsZSA9IHNpMTE0NV9pZHMsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihzaTExNDVfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiUGV0ZXIgTWVlcndhbGQtU3RhZGxlciA8cG1lZXJ3QHBtZWVydy5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpbGFicyBTSTExMzIgYW5kIFNJMTE0MS8yLzMvNS82LzcgcHJveGltaXR5LCBhbWJpZW50IGxpZ2h0IGFuZCBVViBpbmRleCBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9saWdodC91czUxODJkLmMgYi9kcml2ZXJzL2lpby9saWdodC91czUxODJkLmMKaW5kZXggMjBjNDBmNy4uMThjZjJlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbGlnaHQvdXM1MTgyZC5jCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L3VzNTE4MmQuYwpAQCAtODk0LDcgKzg5NCw3IEBACiAJCWdvdG8gb3V0X2VycjsKIAogCWlmIChkYXRhLT5kZWZhdWx0X2NvbnRpbnVvdXMpIHsKLQkJcG1fcnVudGltZV9zZXRfYWN0aXZlKCZjbGllbnQtPmRldik7CisJCXJldCA9IHBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmY2xpZW50LT5kZXYpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0X2VycjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9saWdodC92Y25sNDAwMC5jIGIvZHJpdmVycy9paW8vbGlnaHQvdmNubDQwMDAuYwppbmRleCBjOWQ4NWJiLi4zNjBiNmU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9saWdodC92Y25sNDAwMC5jCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L3Zjbmw0MDAwLmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogdmNubDQwMDAuYyAtIFN1cHBvcnQgZm9yIFZpc2hheSBWQ05MNDAwMCBjb21iaW5lZCBhbWJpZW50IGxpZ2h0IGFuZAotICogcHJveGltaXR5IHNlbnNvcgorICogdmNubDQwMDAuYyAtIFN1cHBvcnQgZm9yIFZpc2hheSBWQ05MNDAwMC80MDEwLzQwMjAgY29tYmluZWQgYW1iaWVudAorICogbGlnaHQgYW5kIHByb3hpbWl0eSBzZW5zb3IKICAqCiAgKiBDb3B5cmlnaHQgMjAxMiBQZXRlciBNZWVyd2FsZCA8cG1lZXJ3QHBtZWVydy5uZXQ+CiAgKgpAQCAtMTMsNiArMTMsOCBAQAogICogVE9ETzoKICAqICAgYWxsb3cgdG8gYWRqdXN0IElSIGN1cnJlbnQKICAqICAgcHJveGltaXR5IHRocmVzaG9sZCBhbmQgZXZlbnQgaGFuZGxpbmcKKyAqICAgcGVyaW9kaWMgQUxTL3Byb3hpbWl0eSBtZWFzdXJlbWVudCAoVkNOTDQwMTAvMjApCisgKiAgIGludGVycnVwdHMgKFZDTkw0MDEwLzIwKQogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTI0LDYgKzI2LDggQEAKICNpbmNsdWRlIDxsaW51eC9paW8vc3lzZnMuaD4KIAogI2RlZmluZSBWQ05MNDAwMF9EUlZfTkFNRSAidmNubDQwMDAiCisjZGVmaW5lIFZDTkw0MDAwX0lECQkweDAxCisjZGVmaW5lIFZDTkw0MDEwX0lECQkweDAyIC8qIGZvciBWQ05MNDAyMCwgVkNOTDQwMTAgKi8KIAogI2RlZmluZSBWQ05MNDAwMF9DT01NQU5ECTB4ODAgLyogQ29tbWFuZCByZWdpc3RlciAqLwogI2RlZmluZSBWQ05MNDAwMF9QUk9EX1JFVgkweDgxIC8qIFByb2R1Y3QgSUQgYW5kIFJldmlzaW9uIElEICovCkBAIC0zNywxMyArNDEsMTQgQEAKICNkZWZpbmUgVkNOTDQwMDBfUFNfTU9EX0FESgkweDhhIC8qIFByb3hpbWl0eSBtb2R1bGF0b3IgdGltaW5nIGFkanVzdG1lbnQgKi8KIAogLyogQml0IG1hc2tzIGZvciBDT01NQU5EIHJlZ2lzdGVyICovCi0jZGVmaW5lIFZDTkw0MDAwX0FMX1JEWQkJMHg0MCAvKiBBTFMgZGF0YSByZWFkeT8gKi8KLSNkZWZpbmUgVkNOTDQwMDBfUFNfUkRZCQkweDIwIC8qIHByb3hpbWl0eSBkYXRhIHJlYWR5PyAqLwotI2RlZmluZSBWQ05MNDAwMF9BTF9PRAkJMHgxMCAvKiBzdGFydCBvbi1kZW1hbmQgQUxTIG1lYXN1cmVtZW50ICovCi0jZGVmaW5lIFZDTkw0MDAwX1BTX09ECQkweDA4IC8qIHN0YXJ0IG9uLWRlbWFuZCBwcm94aW1pdHkgbWVhc3VyZW1lbnQgKi8KKyNkZWZpbmUgVkNOTDQwMDBfQUxfUkRZCQlCSVQoNikgLyogQUxTIGRhdGEgcmVhZHk/ICovCisjZGVmaW5lIFZDTkw0MDAwX1BTX1JEWQkJQklUKDUpIC8qIHByb3hpbWl0eSBkYXRhIHJlYWR5PyAqLworI2RlZmluZSBWQ05MNDAwMF9BTF9PRAkJQklUKDQpIC8qIHN0YXJ0IG9uLWRlbWFuZCBBTFMgbWVhc3VyZW1lbnQgKi8KKyNkZWZpbmUgVkNOTDQwMDBfUFNfT0QJCUJJVCgzKSAvKiBzdGFydCBvbi1kZW1hbmQgcHJveGltaXR5IG1lYXN1cmVtZW50ICovCiAKIHN0cnVjdCB2Y25sNDAwMF9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBtdXRleCBsb2NrOwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHZjbmw0MDAwX2lkW10gPSB7CkBAIC01OSwxNiArNjQsMTggQEAKIAlfX2JlMTYgYnVmOwogCWludCByZXQ7CiAKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwogCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBWQ05MNDAwMF9DT01NQU5ELAogCQkJCQlyZXFfbWFzayk7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZmFpbDsKIAogCS8qIHdhaXQgZm9yIGRhdGEgdG8gYmVjb21lIHJlYWR5ICovCiAJd2hpbGUgKHRyaWVzLS0pIHsKIAkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgVkNOTDQwMDBfQ09NTUFORCk7CiAJCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gZmFpbDsKIAkJaWYgKHJldCAmIHJkeV9tYXNrKQogCQkJYnJlYWs7CiAJCW1zbGVlcCgyMCk7IC8qIG1lYXN1cmVtZW50IHRha2VzIHVwIHRvIDEwMCBtcyAqLwpAQCAtNzcsMTcgKzg0LDIzIEBACiAJaWYgKHRyaWVzIDwgMCkgewogCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwKIAkJCSJ2Y25sNDAwMF9tZWFzdXJlKCkgZmFpbGVkLCBkYXRhIG5vdCByZWFkeVxuIik7Ci0JCXJldHVybiAtRUlPOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGZhaWw7CiAJfQogCiAJcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoZGF0YS0+Y2xpZW50LAogCQlkYXRhX3JlZywgc2l6ZW9mKGJ1ZiksICh1OCAqKSAmYnVmKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBmYWlsOwogCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKIAkqdmFsID0gYmUxNl90b19jcHUoYnVmKTsKIAogCXJldHVybiAwOworCitmYWlsOgorCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHZjbmw0MDAwX2NoYW5uZWxzW10gPSB7CkBAIC0xMDUsNyArMTE4LDcgQEAKIAkJCQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKIAkJCQlpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCiB7Ci0JaW50IHJldCA9IC1FSU5WQUw7CisJaW50IHJldDsKIAlzdHJ1Y3QgdmNubDQwMDBfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKIAlzd2l0Y2ggKG1hc2spIHsKQEAgLTExNywzMiArMTMwLDI3IEBACiAJCQkJVkNOTDQwMDBfQUxfUkVTVUxUX0hJLCB2YWwpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJcmV0dXJuIHJldDsKLQkJCXJldCA9IElJT19WQUxfSU5UOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CiAJCWNhc2UgSUlPX1BST1hJTUlUWToKIAkJCXJldCA9IHZjbmw0MDAwX21lYXN1cmUoZGF0YSwKIAkJCQlWQ05MNDAwMF9QU19PRCwgVkNOTDQwMDBfUFNfUkRZLAogCQkJCVZDTkw0MDAwX1BTX1JFU1VMVF9ISSwgdmFsKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7Ci0JCQlyZXQgPSBJSU9fVkFMX0lOVDsKLQkJCWJyZWFrOworCQkJcmV0dXJuIElJT19WQUxfSU5UOwogCQlkZWZhdWx0OgotCQkJYnJlYWs7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlicmVhazsKIAljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6Ci0JCWlmIChjaGFuLT50eXBlID09IElJT19MSUdIVCkgewotCQkJKnZhbCA9IDA7Ci0JCQkqdmFsMiA9IDI1MDAwMDsKLQkJCXJldCA9IElJT19WQUxfSU5UX1BMVVNfTUlDUk87Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQorCQlpZiAoY2hhbi0+dHlwZSAhPSBJSU9fTElHSFQpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiByZXQ7CisJCSp2YWwgPSAwOworCQkqdmFsMiA9IDI1MDAwMDsKKwkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIHZjbmw0MDAwX2luZm8gPSB7CkBAIC0xNTUsNyArMTYzLDcgQEAKIHsKIAlzdHJ1Y3QgdmNubDQwMDBfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OwotCWludCByZXQ7CisJaW50IHJldCwgcHJvZF9pZDsKIAogCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqZGF0YSkpOwogCWlmICghaW5kaW9fZGV2KQpAQCAtMTY0LDEzICsxNzIsMTkgQEAKIAlkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpbmRpb19kZXYpOwogCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKKwltdXRleF9pbml0KCZkYXRhLT5sb2NrKTsKIAogCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIFZDTkw0MDAwX1BST0RfUkVWKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIlZDTkw0MDAwIEFtYmllbnQgbGlnaHQvcHJveGltaXR5IHNlbnNvciwgUHJvZCAlMDJ4LCBSZXY6ICUwMnhcbiIsCi0JCXJldCA+PiA0LCByZXQgJiAweGYpOworCXByb2RfaWQgPSByZXQgPj4gNDsKKwlpZiAocHJvZF9pZCAhPSBWQ05MNDAxMF9JRCAmJiBwcm9kX2lkICE9IFZDTkw0MDAwX0lEKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXMgQW1iaWVudCBsaWdodC9wcm94aW1pdHkgc2Vuc29yLCBSZXY6ICUwMnhcbiIsCisJCShwcm9kX2lkID09IFZDTkw0MDEwX0lEKSA/ICJWQ05MNDAxMC80MDIwIiA6ICJWQ05MNDAwMCIsCisJCXJldCAmIDB4Zik7CiAKIAlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CiAJaW5kaW9fZGV2LT5pbmZvID0gJnZjbmw0MDAwX2luZm87CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9LY29uZmlnCmluZGV4IDFmODQyYWIuLjQyMWFkOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9LY29uZmlnCkBAIC01LDggKzUsMjIgQEAKIAogbWVudSAiTWFnbmV0b21ldGVyIHNlbnNvcnMiCiAKK2NvbmZpZyBBSzg5NzQKKwl0cmlzdGF0ZSAiQXNhaGkgS2FzZWkgQUs4OTc0IDMtQXhpcyBNYWduZXRvbWV0ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwlkZXBlbmRzIG9uIE9GCisJc2VsZWN0IFJFR01BUF9JMkMKKwlzZWxlY3QgSUlPX0JVRkZFUgorCXNlbGVjdCBJSU9fVFJJR0dFUkVEX0JVRkZFUgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBc2FoaSBLYXNlaSBBSzg5NzQgb3IKKwkgIEFNSTMwNSBJMkMtYmFzZWQgMy1heGlzIG1hZ25ldG9tZXRlciBjaGlwcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYWs4OTc0LgorCiBjb25maWcgQUs4OTc1Ci0JdHJpc3RhdGUgIkFzYWhpIEthc2VpIEFLIDMtQXhpcyBNYWduZXRvbWV0ZXIiCisJdHJpc3RhdGUgIkFzYWhpIEthc2VpIEFLODk3NSAzLUF4aXMgTWFnbmV0b21ldGVyIgogCWRlcGVuZHMgb24gSTJDCiAJZGVwZW5kcyBvbiBHUElPTElCIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBJSU9fQlVGRkVSCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvTWFrZWZpbGUKaW5kZXggOTJhNzQ1Yy4uYjg2ZDZjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9NYWtlZmlsZQpAQCAtMyw2ICszLDcgQEAKICMKIAogIyBXaGVuIGFkZGluZyBuZXcgZW50cmllcyBrZWVwIHRoZSBsaXN0IGluIGFscGhhYmV0aWNhbCBvcmRlcgorb2JqLSQoQ09ORklHX0FLODk3NCkJKz0gYWs4OTc0Lm8KIG9iai0kKENPTkZJR19BSzg5NzUpCSs9IGFrODk3NS5vCiBvYmotJChDT05GSUdfQk1DMTUwX01BR04pICs9IGJtYzE1MF9tYWduLm8KIG9iai0kKENPTkZJR19CTUMxNTBfTUFHTl9JMkMpICs9IGJtYzE1MF9tYWduX2kyYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvYWs4OTc0LmMgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvYWs4OTc0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3MzUzMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9hazg5NzQuYwpAQCAtMCwwICsxLDg2MCBAQAorLyoKKyAqIERyaXZlciBmb3IgdGhlIEFzYWhpIEthc2VpIEVNRCBDb3Jwb3JhdGlvbiBBSzg5NzQKKyAqIGFuZCBBaWNoaSBTdGVlbCBBTUkzMDUgbWFnbmV0b21ldGVyIGNoaXBzLgorICogQmFzZWQgb24gYSBwYXRjaCBmcm9tIFNhbXUgT25rYWxvIGFuZCB0aGUgQUs4OTc1IElJTyBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAqIENvcHlyaWdodCAoYykgMjAxMCBOVklESUEgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTGluYXJvIEx0ZC4KKyAqCisgKiBBdXRob3I6IFNhbXUgT25rYWxvIDxzYW11LnAub25rYWxvQG5va2lhLmNvbT4KKyAqIEF1dGhvcjogTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBsaW5hcm8ub3JnPgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+IC8qIEZvciBpcnFfZ2V0X2lycV9kYXRhKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vYnVmZmVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcl9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmg+CisKKy8qCisgKiAxNi1iaXQgcmVnaXN0ZXJzIGFyZSBsaXR0bGUtZW5kaWFuLiBMU0IgaXMgYXQgdGhlIGFkZHJlc3MgZGVmaW5lZCBiZWxvdworICogYW5kIE1TQiBpcyBhdCB0aGUgbmV4dCBoaWdoZXIgYWRkcmVzcy4KKyAqLworCisvKiBUaGVzZSByZWdpc3RlcnMgYXJlIGNvbW1vbiBmb3IgQUs4OTc0IGFuZCBBTUkzMDUgKi8KKyNkZWZpbmUgQUs4OTc0X1NFTEZURVNUCQkweDBDCisjZGVmaW5lIEFLODk3NF9TRUxGVEVTVF9JRExFCTB4NTUKKyNkZWZpbmUgQUs4OTc0X1NFTEZURVNUX09LCTB4QUEKKworI2RlZmluZSBBSzg5NzRfSU5GTwkJMHgwRAorCisjZGVmaW5lIEFLODk3NF9XSE9BTUkJCTB4MEYKKyNkZWZpbmUgQUs4OTc0X1dIT0FNSV9WQUxVRV9BTUkzMDUgMHg0NworI2RlZmluZSBBSzg5NzRfV0hPQU1JX1ZBTFVFX0FLODk3NCAweDQ4CisKKyNkZWZpbmUgQUs4OTc0X0RBVEFfWAkJMHgxMAorI2RlZmluZSBBSzg5NzRfREFUQV9ZCQkweDEyCisjZGVmaW5lIEFLODk3NF9EQVRBX1oJCTB4MTQKKyNkZWZpbmUgQUs4OTc0X0lOVF9TUkMJCTB4MTYKKyNkZWZpbmUgQUs4OTc0X1NUQVRVUwkJMHgxOAorI2RlZmluZSBBSzg5NzRfSU5UX0NMRUFSCTB4MUEKKyNkZWZpbmUgQUs4OTc0X0NUUkwxCQkweDFCCisjZGVmaW5lIEFLODk3NF9DVFJMMgkJMHgxQworI2RlZmluZSBBSzg5NzRfQ1RSTDMJCTB4MUQKKyNkZWZpbmUgQUs4OTc0X0lOVF9DVFJMCQkweDFFCisjZGVmaW5lIEFLODk3NF9JTlRfVEhSRVMJMHgyNiAgLyogQWJzb2x1dGUgYW55IGF4aXMgdmFsdWUgdGhyZXNob2xkICovCisjZGVmaW5lIEFLODk3NF9QUkVTRVQJCTB4MzAKKworLyogQUs4OTc0LXNwZWNpZmljIG9mZnNldHMgKi8KKyNkZWZpbmUgQUs4OTc0X09GRlNFVF9YCQkweDIwCisjZGVmaW5lIEFLODk3NF9PRkZTRVRfWQkJMHgyMgorI2RlZmluZSBBSzg5NzRfT0ZGU0VUX1oJCTB4MjQKKy8qIEFNSTMwNS1zcGVjaWZpYyBvZmZzZXRzICovCisjZGVmaW5lIEFNSTMwNV9PRkZTRVRfWAkJMHg2QworI2RlZmluZSBBTUkzMDVfT0ZGU0VUX1kJCTB4NzIKKyNkZWZpbmUgQU1JMzA1X09GRlNFVF9aCQkweDc4CisKKy8qIERpZmZlcmVudCB0ZW1wZXJhdHVyZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQUs4OTc0X1RFTVAJCTB4MzEKKyNkZWZpbmUgQU1JMzA1X1RFTVAJCTB4NjAKKworI2RlZmluZSBBSzg5NzRfSU5UX1hfSElHSAlCSVQoNykgLyogQXhpcyBvdmVyICt0aHJlc2hvbGQgICovCisjZGVmaW5lIEFLODk3NF9JTlRfWV9ISUdICUJJVCg2KQorI2RlZmluZSBBSzg5NzRfSU5UX1pfSElHSAlCSVQoNSkKKyNkZWZpbmUgQUs4OTc0X0lOVF9YX0xPVwlCSVQoNCkgLyogQXhpcyBiZWxvdyAtdGhyZXNob2xkCSovCisjZGVmaW5lIEFLODk3NF9JTlRfWV9MT1cJQklUKDMpCisjZGVmaW5lIEFLODk3NF9JTlRfWl9MT1cJQklUKDIpCisjZGVmaW5lIEFLODk3NF9JTlRfUkFOR0UJQklUKDEpIC8qIFJhbmdlIG92ZXJmbG93IChhbnkgYXhpcykgKi8KKworI2RlZmluZSBBSzg5NzRfU1RBVFVTX0RSRFkJQklUKDYpIC8qIERhdGEgcmVhZHkgKi8KKyNkZWZpbmUgQUs4OTc0X1NUQVRVU19PVkVSUlVOCUJJVCg1KSAvKiBEYXRhIG92ZXJydW4gKi8KKyNkZWZpbmUgQUs4OTc0X1NUQVRVU19JTlQJQklUKDQpIC8qIEludGVycnVwdCBvY2N1cnJlZCAqLworCisjZGVmaW5lIEFLODk3NF9DVFJMMV9QT1dFUglCSVQoNykgLyogMCA9IHN0YW5kYnk7IDEgPSBhY3RpdmUgKi8KKyNkZWZpbmUgQUs4OTc0X0NUUkwxX1JBVEUJQklUKDQpIC8qIDAgPSAxMCBIejsgMSA9IDIwIEh6CSAqLworI2RlZmluZSBBSzg5NzRfQ1RSTDFfRk9SQ0VfRU4JQklUKDEpIC8qIDAgPSBub3JtYWw7IDEgPSBmb3JjZQkgKi8KKyNkZWZpbmUgQUs4OTc0X0NUUkwxX01PREUyCUJJVCgwKSAvKiAwICovCisKKyNkZWZpbmUgQUs4OTc0X0NUUkwyX0lOVF9FTglCSVQoNCkgIC8qIDEgPSBlbmFibGUgaW50ZXJydXB0cwkgICAgICAqLworI2RlZmluZSBBSzg5NzRfQ1RSTDJfRFJEWV9FTglCSVQoMykgIC8qIDEgPSBlbmFibGUgZGF0YSByZWFkeSBzaWduYWwgKi8KKyNkZWZpbmUgQUs4OTc0X0NUUkwyX0RSRFlfUE9MCUJJVCgyKSAgLyogMSA9IGRhdGEgcmVhZHkgYWN0aXZlIGhpZ2ggICAqLworI2RlZmluZSBBSzg5NzRfQ1RSTDJfUkVTREVGCShBSzg5NzRfQ1RSTDJfRFJEWV9QT0wpCisKKyNkZWZpbmUgQUs4OTc0X0NUUkwzX1JFU0VUCUJJVCg3KSAvKiBTb2Z0d2FyZSByZXNldAkJICAqLworI2RlZmluZSBBSzg5NzRfQ1RSTDNfRk9SQ0UJQklUKDYpIC8qIFN0YXJ0IGZvcmNlZCBtZWFzdXJlbWVudCAqLworI2RlZmluZSBBSzg5NzRfQ1RSTDNfU0VMRlRFU1QJQklUKDQpIC8qIFNldCBzZWxmdGVzdCByZWdpc3RlcgkgICovCisjZGVmaW5lIEFLODk3NF9DVFJMM19SRVNERUYJMHgwMAorCisjZGVmaW5lIEFLODk3NF9JTlRfQ1RSTF9YRU4JQklUKDcpIC8qIEVuYWJsZSBpbnRlcnJ1cHQgZm9yIHRoaXMgYXhpcyAqLworI2RlZmluZSBBSzg5NzRfSU5UX0NUUkxfWUVOCUJJVCg2KQorI2RlZmluZSBBSzg5NzRfSU5UX0NUUkxfWkVOCUJJVCg1KQorI2RlZmluZSBBSzg5NzRfSU5UX0NUUkxfWFlaRU4JKEJJVCg3KXxCSVQoNil8QklUKDUpKQorI2RlZmluZSBBSzg5NzRfSU5UX0NUUkxfUE9MCUJJVCgzKSAvKiAwID0gYWN0aXZlIGxvdzsgMSA9IGFjdGl2ZSBoaWdoICovCisjZGVmaW5lIEFLODk3NF9JTlRfQ1RSTF9QVUxTRQlCSVQoMSkgLyogMCA9IGxhdGNoZWQ7IDEgPSBwdWxzZSAoNTAgdXNlYykgKi8KKyNkZWZpbmUgQUs4OTc0X0lOVF9DVFJMX1JFU0RFRgkoQUs4OTc0X0lOVF9DVFJMX1hZWkVOIHwgQUs4OTc0X0lOVF9DVFJMX1BPTCkKKworLyogVGhlIEFNSTMwNSBoYXMgZWxhYm9yYXRlIEZXIHZlcnNpb24gYW5kIHNlcmlhbCBudW1iZXIgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFNSTMwNV9WRVIJCTB4RTgKKyNkZWZpbmUgQU1JMzA1X1NOCQkweEVBCisKKyNkZWZpbmUgQUs4OTc0X01BWF9SQU5HRQkyMDQ4CisKKyNkZWZpbmUgQUs4OTc0X1BPV0VST05fREVMQVkJNTAKKyNkZWZpbmUgQUs4OTc0X0FDVElWQVRFX0RFTEFZCTEKKyNkZWZpbmUgQUs4OTc0X1NFTEZURVNUX0RFTEFZCTEKKy8qCisgKiBTZXQgdGhlIGF1dG9zdXNwZW5kIHRvIHR3byBvcmRlcnMgb2YgbWFnbml0dWRlIGxhcmdlciB0aGFuIHRoZSBwb3dlcm9uCisgKiBkZWxheSB0byBtYWtlIHNhbmUgcmVhc29uYWJsZSBwb3dlciB0cmFkZW9mZiBzYXZpbmdzICg1IHNlY29uZHMgaW4KKyAqIHRoaXMgY2FzZSkuCisgKi8KKyNkZWZpbmUgQUs4OTc0X0FVVE9TVVNQRU5EX0RFTEFZIDUwMDAKKworI2RlZmluZSBBSzg5NzRfTUVBU1RJTUUJCTMKKworI2RlZmluZSBBSzg5NzRfUFdSX09OCQkxCisjZGVmaW5lIEFLODk3NF9QV1JfT0ZGCQkwCisKKy8qKgorICogc3RydWN0IGFrODk3NCAtIHN0YXRlIGNvbnRhaW5lciBmb3IgdGhlIEFLODk3NCBkcml2ZXIKKyAqIEBpMmM6IHBhcmVudCBJMkMgY2xpZW50CisgKiBAb3JpZW50YXRpb246IG1vdW50aW5nIG1hdHJpeCwgZmxpcHBlZCBheGlzIGV0YworICogQG1hcDogcmVnbWFwIHRvIGFjY2VzcyB0aGUgQUs4OTc0IHJlZ2lzdGVycyBvdmVyIEkyQworICogQHJlZ3M6IHRoZSBhdmRkIGFuZCBkdmRkIHBvd2VyIHJlZ3VsYXRvcnMKKyAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgcGFydAorICogQHZhcmlhbnQ6IHRoZSB3aG9hbWkgSUQgdmFsdWUgKGZvciBzZWxlY3RpbmcgY29kZSBwYXRocykKKyAqIEBsb2NrOiBsb2NrcyB0aGUgbWFnbmV0b21ldGVyIGZvciBleGNsdXNpdmUgdXNlIGR1cmluZyBhIG1lYXN1cmVtZW50CisgKiBAZHJkeV9pcnE6IHVzZXMgdGhlIERSRFkgSVJRIGxpbmUKKyAqIEBkcmR5X2NvbXBsZXRlOiBjb21wbGV0aW9uIGZvciBEUkRZCisgKiBAZHJkeV9hY3RpdmVfbG93OiB0aGUgRFJEWSBJUlEgaXMgYWN0aXZlIGxvdworICovCitzdHJ1Y3QgYWs4OTc0IHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjOworCXN0cnVjdCBpaW9fbW91bnRfbWF0cml4IG9yaWVudGF0aW9uOworCXN0cnVjdCByZWdtYXAgKm1hcDsKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSByZWdzWzJdOworCWNvbnN0IGNoYXIgKm5hbWU7CisJdTggdmFyaWFudDsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlib29sIGRyZHlfaXJxOworCXN0cnVjdCBjb21wbGV0aW9uIGRyZHlfY29tcGxldGU7CisJYm9vbCBkcmR5X2FjdGl2ZV9sb3c7Cit9OworCitzdGF0aWMgY29uc3QgY2hhciBhazg5NzRfcmVnX2F2ZGRbXSA9ICJhdmRkIjsKK3N0YXRpYyBjb25zdCBjaGFyIGFrODk3NF9yZWdfZHZkZFtdID0gImR2ZGQiOworCitzdGF0aWMgaW50IGFrODk3NF9zZXRfcG93ZXIoc3RydWN0IGFrODk3NCAqYWs4OTc0LCBib29sIG1vZGUpCit7CisJaW50IHJldDsKKwl1OCB2YWw7CisKKwl2YWwgPSBtb2RlID8gQUs4OTc0X0NUUkwxX1BPV0VSIDogMDsKKwl2YWwgfD0gQUs4OTc0X0NUUkwxX0ZPUkNFX0VOOworCXJldCA9IHJlZ21hcF93cml0ZShhazg5NzQtPm1hcCwgQUs4OTc0X0NUUkwxLCB2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKG1vZGUpCisJCW1zbGVlcChBSzg5NzRfQUNUSVZBVEVfREVMQVkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWs4OTc0X3Jlc2V0KHN0cnVjdCBhazg5NzQgKmFrODk3NCkKK3sKKwlpbnQgcmV0OworCisJLyogUG93ZXIgb24gdG8gZ2V0IHJlZ2lzdGVyIGFjY2Vzcy4gU2V0cyBDVFJMMSByZWcgdG8gcmVzZXQgc3RhdGUgKi8KKwlyZXQgPSBhazg5NzRfc2V0X3Bvd2VyKGFrODk3NCwgQUs4OTc0X1BXUl9PTik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSByZWdtYXBfd3JpdGUoYWs4OTc0LT5tYXAsIEFLODk3NF9DVFJMMiwgQUs4OTc0X0NUUkwyX1JFU0RFRik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSByZWdtYXBfd3JpdGUoYWs4OTc0LT5tYXAsIEFLODk3NF9DVFJMMywgQUs4OTc0X0NUUkwzX1JFU0RFRik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSByZWdtYXBfd3JpdGUoYWs4OTc0LT5tYXAsIEFLODk3NF9JTlRfQ1RSTCwKKwkJCSAgIEFLODk3NF9JTlRfQ1RSTF9SRVNERUYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBBZnRlciByZXNldCwgcG93ZXIgb2ZmIGlzIGRlZmF1bHQgc3RhdGUgKi8KKwlyZXR1cm4gYWs4OTc0X3NldF9wb3dlcihhazg5NzQsIEFLODk3NF9QV1JfT0ZGKTsKK30KKworc3RhdGljIGludCBhazg5NzRfY29uZmlndXJlKHN0cnVjdCBhazg5NzQgKmFrODk3NCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnbWFwX3dyaXRlKGFrODk3NC0+bWFwLCBBSzg5NzRfQ1RSTDIsIEFLODk3NF9DVFJMMl9EUkRZX0VOIHwKKwkJCSAgIEFLODk3NF9DVFJMMl9JTlRfRU4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gcmVnbWFwX3dyaXRlKGFrODk3NC0+bWFwLCBBSzg5NzRfQ1RSTDMsIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gcmVnbWFwX3dyaXRlKGFrODk3NC0+bWFwLCBBSzg5NzRfSU5UX0NUUkwsIEFLODk3NF9JTlRfQ1RSTF9QT0wpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcmVnbWFwX3dyaXRlKGFrODk3NC0+bWFwLCBBSzg5NzRfUFJFU0VULCAwKTsKK30KKworc3RhdGljIGludCBhazg5NzRfdHJpZ21lYXMoc3RydWN0IGFrODk3NCAqYWs4OTc0KQoreworCXVuc2lnbmVkIGludCBjbGVhcjsKKwl1OCBtYXNrOworCXU4IHZhbDsKKwlpbnQgcmV0OworCisJLyogQ2xlYXIgYW55IHByZXZpb3VzIG1lYXN1cmVtZW50IG92ZXJmbG93IHN0YXR1cyAqLworCXJldCA9IHJlZ21hcF9yZWFkKGFrODk3NC0+bWFwLCBBSzg5NzRfSU5UX0NMRUFSLCAmY2xlYXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBJZiB3ZSBoYXZlIGEgRFJEWSBJUlEgbGluZSwgdXNlIGl0ICovCisJaWYgKGFrODk3NC0+ZHJkeV9pcnEpIHsKKwkJbWFzayA9IEFLODk3NF9DVFJMMl9JTlRfRU4gfAorCQkJQUs4OTc0X0NUUkwyX0RSRFlfRU4gfAorCQkJQUs4OTc0X0NUUkwyX0RSRFlfUE9MOworCQl2YWwgPSBBSzg5NzRfQ1RSTDJfRFJEWV9FTjsKKworCQlpZiAoIWFrODk3NC0+ZHJkeV9hY3RpdmVfbG93KQorCQkJdmFsIHw9IEFLODk3NF9DVFJMMl9EUkRZX1BPTDsKKworCQlpbml0X2NvbXBsZXRpb24oJmFrODk3NC0+ZHJkeV9jb21wbGV0ZSk7CisJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhhazg5NzQtPm1hcCwgQUs4OTc0X0NUUkwyLAorCQkJCQkgbWFzaywgdmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogRm9yY2UgYSBtZWFzdXJlbWVudCAqLworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoYWs4OTc0LT5tYXAsCisJCQkJICBBSzg5NzRfQ1RSTDMsCisJCQkJICBBSzg5NzRfQ1RSTDNfRk9SQ0UsCisJCQkJICBBSzg5NzRfQ1RSTDNfRk9SQ0UpOworfQorCitzdGF0aWMgaW50IGFrODk3NF9hd2FpdF9kcmR5KHN0cnVjdCBhazg5NzQgKmFrODk3NCkKK3sKKwlpbnQgdGltZW91dCA9IDI7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgcmV0OworCisJaWYgKGFrODk3NC0+ZHJkeV9pcnEpIHsKKwkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZhazg5NzQtPmRyZHlfY29tcGxldGUsCisJCQkJCTEgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKwkJaWYgKCFyZXQpIHsKKwkJCWRldl9lcnIoJmFrODk3NC0+aTJjLT5kZXYsCisJCQkJInRpbWVvdXQgd2FpdGluZyBmb3IgRFJEWSBJUlFcbiIpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyogRGVmYXVsdCBkZWxheS1iYXNlZCBwb2xsIGxvb3AgKi8KKwlkbyB7CisJCW1zbGVlcChBSzg5NzRfTUVBU1RJTUUpOworCQlyZXQgPSByZWdtYXBfcmVhZChhazg5NzQtPm1hcCwgQUs4OTc0X1NUQVRVUywgJnZhbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHZhbCAmIEFLODk3NF9TVEFUVVNfRFJEWSkKKwkJCXJldHVybiAwOworCX0gd2hpbGUgKC0tdGltZW91dCk7CisJaWYgKCF0aW1lb3V0KSB7CisJCWRldl9lcnIoJmFrODk3NC0+aTJjLT5kZXYsCisJCQkidGltZW91dCB3YWl0aW5nIGZvciBEUkRZXG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWs4OTc0X2dldHJlc3VsdChzdHJ1Y3QgYWs4OTc0ICphazg5NzQsIHMxNiAqcmVzdWx0KQoreworCXVuc2lnbmVkIGludCBzcmM7CisJaW50IHJldDsKKworCXJldCA9IGFrODk3NF9hd2FpdF9kcmR5KGFrODk3NCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSByZWdtYXBfcmVhZChhazg5NzQtPm1hcCwgQUs4OTc0X0lOVF9TUkMsICZzcmMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogT3V0IG9mIHJhbmdlIG92ZXJmbG93ISBTdHJvbmcgbWFnbmV0IGNsb3NlPyAqLworCWlmIChzcmMgJiBBSzg5NzRfSU5UX1JBTkdFKSB7CisJCWRldl9lcnIoJmFrODk3NC0+aTJjLT5kZXYsCisJCQkicmFuZ2Ugb3ZlcmZsb3cgaW4gc2Vuc29yXG4iKTsKKwkJcmV0dXJuIC1FUkFOR0U7CisJfQorCisJcmV0ID0gcmVnbWFwX2J1bGtfcmVhZChhazg5NzQtPm1hcCwgQUs4OTc0X0RBVEFfWCwgcmVzdWx0LCA2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IGFrODk3NF9kcmR5X2lycShpbnQgaXJxLCB2b2lkICpkKQoreworCXN0cnVjdCBhazg5NzQgKmFrODk3NCA9IGQ7CisKKwlpZiAoIWFrODk3NC0+ZHJkeV9pcnEpCisJCXJldHVybiBJUlFfTk9ORTsKKworCS8qIFRPRE86IHRpbWVzdGFtcCBoZXJlIHRvIGdldCBnb29kIG1lYXN1cmVtZW50IHN0YW1wcyAqLworCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhazg5NzRfZHJkeV9pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKmQpCit7CisJc3RydWN0IGFrODk3NCAqYWs4OTc0ID0gZDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZXQ7CisKKwkvKiBDaGVjayBpZiB0aGlzIHdhcyBhIERSRFkgZnJvbSB1cyAqLworCXJldCA9IHJlZ21hcF9yZWFkKGFrODk3NC0+bWFwLCBBSzg5NzRfU1RBVFVTLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZhazg5NzQtPmkyYy0+ZGV2LCAiZXJyb3IgcmVhZGluZyBEUkRZIHN0YXR1c1xuIik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJaWYgKHZhbCAmIEFLODk3NF9TVEFUVVNfRFJEWSkgeworCQkvKiBZZXMgdGhpcyB3YXMgb3VyIElSUSAqLworCQljb21wbGV0ZSgmYWs4OTc0LT5kcmR5X2NvbXBsZXRlKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCS8qIFdlIG1heSBiZSBvbiBhIHNoYXJlZCBJUlEsIGxldCB0aGUgbmV4dCBjbGllbnQgY2hlY2sgKi8KKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgYWs4OTc0X3NlbGZ0ZXN0KHN0cnVjdCBhazg5NzQgKmFrODk3NCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWs4OTc0LT5pMmMtPmRldjsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSByZWdtYXBfcmVhZChhazg5NzQtPm1hcCwgQUs4OTc0X1NFTEZURVNULCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmICh2YWwgIT0gQUs4OTc0X1NFTEZURVNUX0lETEUpIHsKKwkJZGV2X2VycihkZXYsICJzZWxmdGVzdCBub3QgaWRsZSBiZWZvcmUgdGVzdFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFRyaWdnZXIgc2VsZi10ZXN0ICovCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGFrODk3NC0+bWFwLAorCQkJQUs4OTc0X0NUUkwzLAorCQkJQUs4OTc0X0NUUkwzX1NFTEZURVNULAorCQkJQUs4OTc0X0NUUkwzX1NFTEZURVNUKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IHdyaXRlIENUUkwzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltc2xlZXAoQUs4OTc0X1NFTEZURVNUX0RFTEFZKTsKKworCXJldCA9IHJlZ21hcF9yZWFkKGFrODk3NC0+bWFwLCBBSzg5NzRfU0VMRlRFU1QsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKHZhbCAhPSBBSzg5NzRfU0VMRlRFU1RfT0spIHsKKwkJZGV2X2VycihkZXYsICJzZWxmdGVzdCByZXN1bHQgTk9UIE9LICglMDJ4KVxuIiwgdmFsKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gcmVnbWFwX3JlYWQoYWs4OTc0LT5tYXAsIEFLODk3NF9TRUxGVEVTVCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlpZiAodmFsICE9IEFLODk3NF9TRUxGVEVTVF9JRExFKSB7CisJCWRldl9lcnIoZGV2LCAic2VsZnRlc3Qgbm90IGlkbGUgYWZ0ZXIgdGVzdCAoJTAyeClcbiIsIHZhbCk7CisJCXJldHVybiAtRUlPOworCX0KKwlkZXZfZGJnKGRldiwgInBhc3NlZCBzZWxmLXRlc3RcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWs4OTc0X2dldF91MTZfdmFsKHN0cnVjdCBhazg5NzQgKmFrODk3NCwgdTggcmVnLCB1MTYgKnZhbCkKK3sKKwlpbnQgcmV0OworCXUxNiBidWxrOworCisJcmV0ID0gcmVnbWFwX2J1bGtfcmVhZChhazg5NzQtPm1hcCwgcmVnLCAmYnVsaywgMik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkqdmFsID0gbGUxNl90b19jcHUoYnVsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhazg5NzRfZGV0ZWN0KHN0cnVjdCBhazg5NzQgKmFrODk3NCkKK3sKKwl1bnNpZ25lZCBpbnQgd2hvYW1pOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgZnc7CisJdTE2IHNuOworCisJcmV0ID0gcmVnbWFwX3JlYWQoYWs4OTc0LT5tYXAsIEFLODk3NF9XSE9BTUksICZ3aG9hbWkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKHdob2FtaSkgeworCWNhc2UgQUs4OTc0X1dIT0FNSV9WQUxVRV9BTUkzMDU6CisJCW5hbWUgPSAiYW1pMzA1IjsKKwkJcmV0ID0gcmVnbWFwX3JlYWQoYWs4OTc0LT5tYXAsIEFNSTMwNV9WRVIsICZmdyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlmdyAmPSAweDdmOyAvKiBvbmx5IGJpdHMgMCB0aHJ1IDYgdmFsaWQgKi8KKwkJcmV0ID0gYWs4OTc0X2dldF91MTZfdmFsKGFrODk3NCwgQU1JMzA1X1NOLCAmc24pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJZGV2X2luZm8oJmFrODk3NC0+aTJjLT5kZXYsCisJCQkgImRldGVjdGVkICVzLCBGVyB2ZXIgJTAyeCwgUy9OOiAlMDR4XG4iLAorCQkJIG5hbWUsIGZ3LCBzbik7CisJCWJyZWFrOworCWNhc2UgQUs4OTc0X1dIT0FNSV9WQUxVRV9BSzg5NzQ6CisJCW5hbWUgPSAiYWs4OTc0IjsKKwkJZGV2X2luZm8oJmFrODk3NC0+aTJjLT5kZXYsICJkZXRlY3RlZCBBSzg5NzRcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZhazg5NzQtPmkyYy0+ZGV2LCAidW5zdXBwb3J0ZWQgZGV2aWNlICglMDJ4KSAiLAorCQkJd2hvYW1pKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJYWs4OTc0LT5uYW1lID0gbmFtZTsKKwlhazg5NzQtPnZhcmlhbnQgPSB3aG9hbWk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhazg5NzRfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgaW50ICp2YWwsIGludCAqdmFsMiwKKwkJCSAgIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgYWs4OTc0ICphazg5NzQgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXMxNiBod192YWx1ZXNbM107CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlwbV9ydW50aW1lX2dldF9zeW5jKCZhazg5NzQtPmkyYy0+ZGV2KTsKKwltdXRleF9sb2NrKCZhazg5NzQtPmxvY2spOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJaWYgKGNoYW4tPmFkZHJlc3MgPiAyKSB7CisJCQlkZXZfZXJyKCZhazg5NzQtPmkyYy0+ZGV2LCAiZmF1bHR5IGNoYW5uZWwgYWRkcmVzc1xuIik7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJCXJldCA9IGFrODk3NF90cmlnbWVhcyhhazg5NzQpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfdW5sb2NrOworCQlyZXQgPSBhazg5NzRfZ2V0cmVzdWx0KGFrODk3NCwgaHdfdmFsdWVzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X3VubG9jazsKKworCQkvKgorCQkgKiBXZSByZWFkIGFsbCBheGVzIGFuZCBkaXNjYXJkIGFsbCBidXQgb25lLCBmb3Igb3B0aW1pemVkCisJCSAqIHJlYWRpbmcsIHVzZSB0aGUgdHJpZ2dlcmVkIGJ1ZmZlci4KKwkJICovCisJCSp2YWwgPSBsZTE2X3RvX2NwdShod192YWx1ZXNbY2hhbi0+YWRkcmVzc10pOworCisJCXJldCA9IElJT19WQUxfSU5UOworCX0KKworIG91dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZhazg5NzQtPmxvY2spOworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koJmFrODk3NC0+aTJjLT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKCZhazg5NzQtPmkyYy0+ZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGFrODk3NF9maWxsX2J1ZmZlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCBhazg5NzQgKmFrODk3NCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzMTYgaHdfdmFsdWVzWzhdOyAvKiBUaHJlZSBheGVzICsgNjRiaXQgcGFkZGluZyAqLworCisJcG1fcnVudGltZV9nZXRfc3luYygmYWs4OTc0LT5pMmMtPmRldik7CisJbXV0ZXhfbG9jaygmYWs4OTc0LT5sb2NrKTsKKworCXJldCA9IGFrODk3NF90cmlnbWVhcyhhazg5NzQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmYWs4OTc0LT5pMmMtPmRldiwgImVycm9yIHRyaWdnZXJpbmcgbWVhc3VyZVxuIik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJcmV0ID0gYWs4OTc0X2dldHJlc3VsdChhazg5NzQsIGh3X3ZhbHVlcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZhazg5NzQtPmkyYy0+ZGV2LCAiZXJyb3IgZ2V0dGluZyBtZWFzdXJlc1xuIik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2RldiwgaHdfdmFsdWVzLAorCQkJCQkgICBpaW9fZ2V0X3RpbWVfbnMoaW5kaW9fZGV2KSk7CisKKyBvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmYWs4OTc0LT5sb2NrKTsKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KCZhazg5NzQtPmkyYy0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZCgmYWs4OTc0LT5pMmMtPmRldik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhazg5NzRfaGFuZGxlX3RyaWdnZXIoaW50IGlycSwgdm9pZCAqcCkKK3sKKwljb25zdCBzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYgPSBwOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+aW5kaW9fZGV2OworCisJYWs4OTc0X2ZpbGxfYnVmZmVyKGluZGlvX2Rldik7CisJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoaW5kaW9fZGV2LT50cmlnKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fbW91bnRfbWF0cml4ICoKK2FrODk3NF9nZXRfbW91bnRfbWF0cml4KGNvbnN0IHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbikKK3sKKwlzdHJ1Y3QgYWs4OTc0ICphazg5NzQgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJcmV0dXJuICZhazg5NzQtPm9yaWVudGF0aW9uOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWNfZXh0X2luZm8gYWs4OTc0X2V4dF9pbmZvW10gPSB7CisJSUlPX01PVU5UX01BVFJJWChJSU9fU0hBUkVEX0JZX0RJUiwgYWs4OTc0X2dldF9tb3VudF9tYXRyaXgpLAorCXsgfSwKK307CisKKyNkZWZpbmUgQUs4OTc0X0FYSVNfQ0hBTk5FTChheGlzLCBpbmRleCkJCQkJXAorCXsJCQkJCQkJCVwKKwkJLnR5cGUgPSBJSU9fTUFHTiwJCQkJCVwKKwkJLm1vZGlmaWVkID0gMSwJCQkJCQlcCisJCS5jaGFubmVsMiA9IElJT19NT0RfIyNheGlzLAkJCQlcCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAkJXAorCQkuZXh0X2luZm8gPSBhazg5NzRfZXh0X2luZm8sCQkJCVwKKwkJLmFkZHJlc3MgPSBpbmRleCwJCQkJCVwKKwkJLnNjYW5faW5kZXggPSBpbmRleCwJCQkJCVwKKwkJLnNjYW5fdHlwZSA9IHsJCQkJCQlcCisJCQkuc2lnbiA9ICdzJywJCQkJCVwKKwkJCS5yZWFsYml0cyA9IDE2LAkJCQkJXAorCQkJLnN0b3JhZ2ViaXRzID0gMTYsCQkJCVwKKwkJCS5lbmRpYW5uZXNzID0gSUlPX0xFCQkJCVwKKwkJfSwJCQkJCQkJXAorCX0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGFrODk3NF9jaGFubmVsc1tdID0geworCUFLODk3NF9BWElTX0NIQU5ORUwoWCwgMCksCisJQUs4OTc0X0FYSVNfQ0hBTk5FTChZLCAxKSwKKwlBSzg5NzRfQVhJU19DSEFOTkVMKFosIDIpLAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDMpLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgYWs4OTc0X3NjYW5fbWFza3NbXSA9IHsgMHg3LCAwIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gYWs4OTc0X2luZm8gPSB7CisJLnJlYWRfcmF3ID0gJmFrODk3NF9yZWFkX3JhdywKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGJvb2wgYWs4OTc0X3dyaXRlYWJsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShpMmMpOworCXN0cnVjdCBhazg5NzQgKmFrODk3NCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgQUs4OTc0X0NUUkwxOgorCWNhc2UgQUs4OTc0X0NUUkwyOgorCWNhc2UgQUs4OTc0X0NUUkwzOgorCWNhc2UgQUs4OTc0X0lOVF9DVFJMOgorCWNhc2UgQUs4OTc0X0lOVF9USFJFUzoKKwljYXNlIEFLODk3NF9JTlRfVEhSRVMgKyAxOgorCWNhc2UgQUs4OTc0X1BSRVNFVDoKKwljYXNlIEFLODk3NF9QUkVTRVQgKyAxOgorCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIEFLODk3NF9PRkZTRVRfWDoKKwljYXNlIEFLODk3NF9PRkZTRVRfWCArIDE6CisJY2FzZSBBSzg5NzRfT0ZGU0VUX1k6CisJY2FzZSBBSzg5NzRfT0ZGU0VUX1kgKyAxOgorCWNhc2UgQUs4OTc0X09GRlNFVF9aOgorCWNhc2UgQUs4OTc0X09GRlNFVF9aICsgMToKKwkJaWYgKGFrODk3NC0+dmFyaWFudCA9PSBBSzg5NzRfV0hPQU1JX1ZBTFVFX0FLODk3NCkKKwkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJY2FzZSBBTUkzMDVfT0ZGU0VUX1g6CisJY2FzZSBBTUkzMDVfT0ZGU0VUX1ggKyAxOgorCWNhc2UgQU1JMzA1X09GRlNFVF9ZOgorCWNhc2UgQU1JMzA1X09GRlNFVF9ZICsgMToKKwljYXNlIEFNSTMwNV9PRkZTRVRfWjoKKwljYXNlIEFNSTMwNV9PRkZTRVRfWiArIDE6CisJCWlmIChhazg5NzQtPnZhcmlhbnQgPT0gQUs4OTc0X1dIT0FNSV9WQUxVRV9BTUkzMDUpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhazg5NzRfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisJLm1heF9yZWdpc3RlciA9IDB4ZmYsCisJLndyaXRlYWJsZV9yZWcgPSBhazg5NzRfd3JpdGVhYmxlX3JlZywKK307CisKK3N0YXRpYyBpbnQgYWs4OTc0X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgYWs4OTc0ICphazg5NzQ7CisJdW5zaWduZWQgbG9uZyBpcnFfdHJpZzsKKwlpbnQgaXJxID0gaTJjLT5pcnE7CisJaW50IHJldDsKKworCS8qIFJlZ2lzdGVyIHdpdGggSUlPICovCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZpMmMtPmRldiwgc2l6ZW9mKCphazg5NzQpKTsKKwlpZiAoaW5kaW9fZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYWs4OTc0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBpbmRpb19kZXYpOworCWFrODk3NC0+aTJjID0gaTJjOworCW11dGV4X2luaXQoJmFrODk3NC0+bG9jayk7CisKKwlyZXQgPSBvZl9paW9fcmVhZF9tb3VudF9tYXRyaXgoJmkyYy0+ZGV2LAorCQkJCSAgICAgICAibW91bnQtbWF0cml4IiwKKwkJCQkgICAgICAgJmFrODk3NC0+b3JpZW50YXRpb24pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlhazg5NzQtPnJlZ3NbMF0uc3VwcGx5ID0gYWs4OTc0X3JlZ19hdmRkOworCWFrODk3NC0+cmVnc1sxXS5zdXBwbHkgPSBhazg5NzRfcmVnX2R2ZGQ7CisKKwlyZXQgPSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldCgmaTJjLT5kZXYsCisJCQkJICAgICAgQVJSQVlfU0laRShhazg5NzQtPnJlZ3MpLAorCQkJCSAgICAgIGFrODk3NC0+cmVncyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJjYW5ub3QgZ2V0IHJlZ3VsYXRvcnNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKGFrODk3NC0+cmVncyksIGFrODk3NC0+cmVncyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJjYW5ub3QgZW5hYmxlIHJlZ3VsYXRvcnNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFRha2UgcnVudGltZSBQTSBvbmxpbmUgKi8KKwlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZSgmaTJjLT5kZXYpOworCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmaTJjLT5kZXYpOworCXBtX3J1bnRpbWVfZW5hYmxlKCZpMmMtPmRldik7CisKKwlhazg5NzQtPm1hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJmFrODk3NF9yZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKGFrODk3NC0+bWFwKSkgeworCQlkZXZfZXJyKCZpMmMtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXBcbiIpOworCQlyZXR1cm4gUFRSX0VSUihhazg5NzQtPm1hcCk7CisJfQorCisJcmV0ID0gYWs4OTc0X3NldF9wb3dlcihhazg5NzQsIEFLODk3NF9QV1JfT04pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJjb3VsZCBub3QgcG93ZXIgb25cbiIpOworCQlnb3RvIHBvd2VyX29mZjsKKwl9CisKKwlyZXQgPSBhazg5NzRfZGV0ZWN0KGFrODk3NCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpMmMtPmRldiwgIm5laXRoZXIgQUs4OTc0IG5vciBBTUkzMDUgZm91bmRcbiIpOworCQlnb3RvIHBvd2VyX29mZjsKKwl9CisKKwlyZXQgPSBhazg5NzRfc2VsZnRlc3QoYWs4OTc0KTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZpMmMtPmRldiwgInNlbGZ0ZXN0IGZhaWxlZCAoY29udGludWluZyBhbnl3YXkpXG4iKTsKKworCXJldCA9IGFrODk3NF9yZXNldChhazg5NzQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJBSzg5NzQgcmVzZXQgZmFpbGVkXG4iKTsKKwkJZ290byBwb3dlcl9vZmY7CisJfQorCisJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoJmkyYy0+ZGV2LAorCQkJCQkgQUs4OTc0X0FVVE9TVVNQRU5EX0RFTEFZKTsKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZCgmaTJjLT5kZXYpOworCXBtX3J1bnRpbWVfcHV0KCZpMmMtPmRldik7CisKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmaTJjLT5kZXY7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGFrODk3NF9jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoYWs4OTc0X2NoYW5uZWxzKTsKKwlpbmRpb19kZXYtPmluZm8gPSAmYWs4OTc0X2luZm87CisJaW5kaW9fZGV2LT5hdmFpbGFibGVfc2Nhbl9tYXNrcyA9IGFrODk3NF9zY2FuX21hc2tzOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPm5hbWUgPSBhazg5NzQtPm5hbWU7CisKKwlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsIE5VTEwsCisJCQkJCSBhazg5NzRfaGFuZGxlX3RyaWdnZXIsCisJCQkJCSBOVUxMKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAidHJpZ2dlcmVkIGJ1ZmZlciBzZXR1cCBmYWlsZWRcbiIpOworCQlnb3RvIGRpc2FibGVfcG07CisJfQorCisJLyogSWYgd2UgaGF2ZSBhIHZhbGlkIERSRFkgSVJRLCBtYWtlIHVzZSBvZiBpdCAqLworCWlmIChpcnEgPiAwKSB7CisJCWlycV90cmlnID0gaXJxZF9nZXRfdHJpZ2dlcl90eXBlKGlycV9nZXRfaXJxX2RhdGEoaXJxKSk7CisJCWlmIChpcnFfdHJpZyA9PSBJUlFGX1RSSUdHRVJfUklTSU5HKSB7CisJCQlkZXZfaW5mbygmaTJjLT5kZXYsICJlbmFibGUgcmlzaW5nIGVkZ2UgRFJEWSBJUlFcbiIpOworCQl9IGVsc2UgaWYgKGlycV90cmlnID09IElSUUZfVFJJR0dFUl9GQUxMSU5HKSB7CisJCQlhazg5NzQtPmRyZHlfYWN0aXZlX2xvdyA9IHRydWU7CisJCQlkZXZfaW5mbygmaTJjLT5kZXYsICJlbmFibGUgZmFsbGluZyBlZGdlIERSRFkgSVJRXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWlycV90cmlnID0gSVJRRl9UUklHR0VSX1JJU0lORzsKKwkJfQorCQlpcnFfdHJpZyB8PSBJUlFGX09ORVNIT1Q7CisJCWlycV90cmlnIHw9IElSUUZfU0hBUkVEOworCisJCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJmkyYy0+ZGV2LAorCQkJCQkJaXJxLAorCQkJCQkJYWs4OTc0X2RyZHlfaXJxLAorCQkJCQkJYWs4OTc0X2RyZHlfaXJxX3RocmVhZCwKKwkJCQkJCWlycV90cmlnLAorCQkJCQkJYWs4OTc0LT5uYW1lLAorCQkJCQkJYWs4OTc0KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmaTJjLT5kZXYsICJ1bmFibGUgdG8gcmVxdWVzdCBEUkRZIElSUSAiCisJCQkJIi0gcHJvY2VlZGluZyB3aXRob3V0IElSUVxuIik7CisJCQlnb3RvIG5vX2lycTsKKwkJfQorCQlhazg5NzQtPmRyZHlfaXJxID0gdHJ1ZTsKKwl9CisKK25vX2lycToKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpMmMtPmRldiwgImRldmljZSByZWdpc3RlciBmYWlsZWRcbiIpOworCQlnb3RvIGNsZWFudXBfYnVmZmVyOworCX0KKworCXJldHVybiAwOworCitjbGVhbnVwX2J1ZmZlcjoKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CitkaXNhYmxlX3BtOgorCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmaTJjLT5kZXYpOworCXBtX3J1bnRpbWVfZGlzYWJsZSgmaTJjLT5kZXYpOworCWFrODk3NF9zZXRfcG93ZXIoYWs4OTc0LCBBSzg5NzRfUFdSX09GRik7Citwb3dlcl9vZmY6CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGFrODk3NC0+cmVncyksIGFrODk3NC0+cmVncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBhazg5NzRfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShpMmMpOworCXN0cnVjdCBhazg5NzQgKmFrODk3NCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CisJcG1fcnVudGltZV9nZXRfc3luYygmaTJjLT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmaTJjLT5kZXYpOworCXBtX3J1bnRpbWVfZGlzYWJsZSgmaTJjLT5kZXYpOworCWFrODk3NF9zZXRfcG93ZXIoYWs4OTc0LCBBSzg5NzRfUFdSX09GRik7CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGFrODk3NC0+cmVncyksIGFrODk3NC0+cmVncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBhazg5NzRfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWs4OTc0ICphazg5NzQgPQorCQlpaW9fcHJpdihpMmNfZ2V0X2NsaWVudGRhdGEodG9faTJjX2NsaWVudChkZXYpKSk7CisKKwlhazg5NzRfc2V0X3Bvd2VyKGFrODk3NCwgQUs4OTc0X1BXUl9PRkYpOworCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShhazg5NzQtPnJlZ3MpLCBhazg5NzQtPnJlZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgYWs4OTc0X3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWs4OTc0ICphazg5NzQgPQorCQlpaW9fcHJpdihpMmNfZ2V0X2NsaWVudGRhdGEodG9faTJjX2NsaWVudChkZXYpKSk7CisJaW50IHJldDsKKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKGFrODk3NC0+cmVncyksIGFrODk3NC0+cmVncyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwltc2xlZXAoQUs4OTc0X1BPV0VST05fREVMQVkpOworCXJldCA9IGFrODk3NF9zZXRfcG93ZXIoYWs4OTc0LCBBSzg5NzRfUFdSX09OKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9yZWd1bGF0b3JfZGlzYWJsZTsKKworCXJldCA9IGFrODk3NF9jb25maWd1cmUoYWs4OTc0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9kaXNhYmxlX3Bvd2VyOworCisJcmV0dXJuIDA7CisKK291dF9kaXNhYmxlX3Bvd2VyOgorCWFrODk3NF9zZXRfcG93ZXIoYWs4OTc0LCBBSzg5NzRfUFdSX09GRik7CitvdXRfcmVndWxhdG9yX2Rpc2FibGU6CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGFrODk3NC0+cmVncyksIGFrODk3NC0+cmVncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgYWs4OTc0X2Rldl9wbV9vcHMgPSB7CisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMocG1fcnVudGltZV9mb3JjZV9zdXNwZW5kLAorCQkJCXBtX3J1bnRpbWVfZm9yY2VfcmVzdW1lKQorCVNFVF9SVU5USU1FX1BNX09QUyhhazg5NzRfcnVudGltZV9zdXNwZW5kLAorCQkJICAgYWs4OTc0X3J1bnRpbWVfcmVzdW1lLCBOVUxMKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFrODk3NF9pZFtdID0geworCXsiYW1pMzA1IiwgMCB9LAorCXsiYWs4OTc0IiwgMCB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFrODk3NF9pZCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFrODk3NF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYXNhaGkta2FzZWksYWs4OTc0IiwgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFrODk3NF9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhazg5NzRfZHJpdmVyID0geworCS5kcml2ZXIJID0geworCQkubmFtZQk9ICJhazg5NzQiLAorCQkucG0gPSAmYWs4OTc0X2Rldl9wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihhazg5NzRfb2ZfbWF0Y2gpLAorCX0sCisJLnByb2JlCSAgPSBhazg5NzRfcHJvYmUsCisJLnJlbW92ZQkgID0gX19leGl0X3AoYWs4OTc0X3JlbW92ZSksCisJLmlkX3RhYmxlID0gYWs4OTc0X2lkLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKGFrODk3NF9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFLODk3NCBhbmQgQU1JMzA1IDMtYXhpcyBtYWduZXRvbWV0ZXIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJTYW11IE9ua2FsbyIpOworTU9EVUxFX0FVVEhPUigiTGludXMgV2FsbGVpaiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL21hZzMxMTAuYyBiL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9tYWczMTEwLmMKaW5kZXggZjJiZTRhMC4uZjJiM2JkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL21hZzMxMTAuYworKysgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvbWFnMzExMC5jCkBAIC0xNTQsMzQgKzE1NCw0MSBAQAogCiAJc3dpdGNoIChtYXNrKSB7CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKLQkJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKQotCQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0ID0gaWlvX2RldmljZV9jbGFpbV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKIAkJY2FzZSBJSU9fTUFHTjogLyogaW4gMC4xIHVUIC8gTFNCICovCiAJCQlyZXQgPSBtYWczMTEwX3JlYWQoZGF0YSwgYnVmZmVyKTsKIAkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQ7CisJCQkJZ290byByZWxlYXNlOwogCQkJKnZhbCA9IHNpZ25fZXh0ZW5kMzIoCiAJCQkJYmUxNl90b19jcHUoYnVmZmVyW2NoYW4tPnNjYW5faW5kZXhdKSwgMTUpOwotCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQkJcmV0ID0gSUlPX1ZBTF9JTlQ7CisJCQlicmVhazsKIAkJY2FzZSBJSU9fVEVNUDogLyogaW4gMSBDIC8gTFNCICovCiAJCQltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKIAkJCXJldCA9IG1hZzMxMTBfcmVxdWVzdChkYXRhKTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKLQkJCQlyZXR1cm4gcmV0OworCQkJCWdvdG8gcmVsZWFzZTsKIAkJCX0KIAkJCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCiAJCQkJTUFHMzExMF9ESUVfVEVNUCk7CiAJCQltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOwogCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKKwkJCQlnb3RvIHJlbGVhc2U7CiAJCQkqdmFsID0gc2lnbl9leHRlbmQzMihyZXQsIDcpOwotCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQkJcmV0ID0gSUlPX1ZBTF9JTlQ7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0ID0gLUVJTlZBTDsKIAkJfQorcmVsZWFzZToKKwkJaWlvX2RldmljZV9yZWxlYXNlX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJCXJldHVybiByZXQ7CisKIAljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CiAJCXN3aXRjaCAoY2hhbi0+dHlwZSkgewogCQljYXNlIElJT19NQUdOOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL0tjb25maWcKaW5kZXggZDEzMGNkYy4uMTVjZDQxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9LY29uZmlnCkBAIC04LDggKzgsNiBAQAogY29uZmlnIEJNUDI4MAogCXRyaXN0YXRlICJCb3NjaCBTZW5zb3J0ZWMgQk1QMTgwL0JNUDI4MCBwcmVzc3VyZSBzZW5zb3IgSTJDIGRyaXZlciIKIAlkZXBlbmRzIG9uIChJMkMgfHwgU1BJX01BU1RFUikKLQlkZXBlbmRzIG9uICEoQk1QMDg1X0kyQz15IHx8IEJNUDA4NV9JMkM9bSkKLQlkZXBlbmRzIG9uICEoQk1QMDg1X1NQST15IHx8IEJNUDA4NV9TUEk9bSkKIAlzZWxlY3QgUkVHTUFQCiAJc2VsZWN0IEJNUDI4MF9JMkMgaWYgKEkyQykKIAlzZWxlY3QgQk1QMjgwX1NQSSBpZiAoU1BJX01BU1RFUikKQEAgLTE4Nyw0ICsxODUsMjYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCiAJICBiZSBjYWxsZWQgaHAyMDZjLgogCitjb25maWcgWlBBMjMyNgorCXRyaXN0YXRlICJNdXJhdGEgWlBBMjMyNiBwcmVzc3VyZSBzZW5zb3IgZHJpdmVyIgorCXNlbGVjdCBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSRURfQlVGRkVSCisJc2VsZWN0IFJFR01BUAorCXNlbGVjdCBaUEEyMzI2X0kyQyBpZiBJMkMKKwlzZWxlY3QgWlBBMjMyNl9TUEkgaWYgU1BJX01BU1RFUgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIE11cmF0YSBaUEEyMzI2IHByZXNzdXJlIGFuZAorCSAgdGVtcGVyYXR1cmUgc2Vuc29yLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCB6cGEyMzI2LgorCitjb25maWcgWlBBMjMyNl9JMkMKKwl0cmlzdGF0ZQorCXNlbGVjdCBSRUdNQVBfSTJDCisKK2NvbmZpZyBaUEEyMzI2X1NQSQorCXRyaXN0YXRlCisJc2VsZWN0IFJFR01BUF9TUEkKKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvTWFrZWZpbGUgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9NYWtlZmlsZQppbmRleCA3ZjM5NWJlLi5mZmY3NzE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9NYWtlZmlsZQpAQCAtMjIsNiArMjIsOSBAQAogc3RfcHJlc3N1cmUtJChDT05GSUdfSUlPX0JVRkZFUikgKz0gc3RfcHJlc3N1cmVfYnVmZmVyLm8KIG9iai0kKENPTkZJR19UNTQwMykgKz0gdDU0MDMubwogb2JqLSQoQ09ORklHX0hQMjA2QykgKz0gaHAyMDZjLm8KK29iai0kKENPTkZJR19aUEEyMzI2KSArPSB6cGEyMzI2Lm8KK29iai0kKENPTkZJR19aUEEyMzI2X0kyQykgKz0genBhMjMyNl9pMmMubworb2JqLSQoQ09ORklHX1pQQTIzMjZfU1BJKSArPSB6cGEyMzI2X3NwaS5vCiAKIG9iai0kKENPTkZJR19JSU9fU1RfUFJFU1NfSTJDKSArPSBzdF9wcmVzc3VyZV9pMmMubwogb2JqLSQoQ09ORklHX0lJT19TVF9QUkVTU19TUEkpICs9IHN0X3ByZXNzdXJlX3NwaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9ibXAyODAtY29yZS5jIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvYm1wMjgwLWNvcmUuYwppbmRleCA2OTQzNjg4Li5lNWE1MzNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9ibXAyODAtY29yZS5jCisrKyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL2JtcDI4MC1jb3JlLmMKQEAgLTk3MCw3ICs5NzAsNyBAQAogCWRhdGEtPnZkZGEgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoZGV2LCAidmRkYSIpOwogCWlmIChJU19FUlIoZGF0YS0+dmRkYSkpIHsKIAkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IFZEREEgcmVndWxhdG9yXG4iKTsKLQkJcmV0ID0gUFRSX0VSUihkYXRhLT52ZGRkKTsKKwkJcmV0ID0gUFRSX0VSUihkYXRhLT52ZGRhKTsKIAkJZ290byBvdXRfZGlzYWJsZV92ZGRkOwogCX0KIAlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGRhdGEtPnZkZGEpOwpAQCAtMTA3OSw3ICsxMDc5LDggQEAKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgYm1wMjgwX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGJtcDI4MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBibXAyODBfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJaW50IHJldDsKIAogCXJldCA9IHJlZ3VsYXRvcl9kaXNhYmxlKGRhdGEtPnZkZGEpOwpAQCAtMTA5MCw3ICsxMDkxLDggQEAKIAogc3RhdGljIGludCBibXAyODBfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBibXAyODBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYm1wMjgwX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCWludCByZXQ7CiAKIAlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGRhdGEtPnZkZGQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvbXM1NjExX2NvcmUuYyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21zNTYxMV9jb3JlLmMKaW5kZXggZmViNDFmOC4uYTc0ZWQxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvbXM1NjExX2NvcmUuYworKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9tczU2MTFfY29yZS5jCkBAIC00MTYsOCArNDE2LDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyX3JlZ3VsYXRvcl9kaXNhYmxlOgotCWlmICghSVNfRVJSX09SX05VTEwoc3QtPnZkZCkpCi0JCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT52ZGQpOworCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT52ZGQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQyNSw4ICs0MjQsNyBAQAogewogCWNvbnN0IHN0cnVjdCBtczU2MTFfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAotCWlmICghSVNfRVJSX09SX05VTEwoc3QtPnZkZCkpCi0JCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT52ZGQpOworCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT52ZGQpOwogfQogCiBpbnQgbXM1NjExX3Byb2JlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHN0cnVjdCBkZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3pwYTIzMjYuYyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3pwYTIzMjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWQyZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvenBhMjMyNi5jCkBAIC0wLDAgKzEsMTczNSBAQAorLyoKKyAqIE11cmF0YSBaUEEyMzI2IHByZXNzdXJlIGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3IgSUlPIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBQYXJyb3QgUy5BLgorICoKKyAqIEF1dGhvcjogR3JlZ29yIEJvaXJpZSA8Z3JlZ29yLmJvaXJpZUBwYXJyb3QuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqIERPQzogWlBBMjMyNiB0aGVvcnkgb2Ygb3BlcmF0aW9ucworICoKKyAqIFRoaXMgZHJpdmVyIHN1cHBvcnRzICVJTkRJT19ESVJFQ1RfTU9ERSBhbmQgJUlORElPX0JVRkZFUl9UUklHR0VSRUQgSUlPCisgKiBtb2Rlcy4KKyAqIEEgaW50ZXJuYWwgaGFyZHdhcmUgdHJpZ2dlciBpcyBhbHNvIGltcGxlbWVudGVkIHRvIGRpc3BhdGNoIHJlZ2lzdGVyZWQgSUlPCisgKiB0cmlnZ2VyIGNvbnN1bWVycyB1cG9uICJzYW1wbGUgcmVhZHkiIGludGVycnVwdHMuCisgKgorICogWlBBMjMyNiBoYXJkd2FyZSBzdXBwb3J0cyAyIHNhbXBsaW5nIG1vZGU6IG9uZSBzaG90IGFuZCBjb250aW51b3VzLgorICoKKyAqIEEgY29tcGxldGUgb25lIHNob3Qgc2FtcGxpbmcgY3ljbGUgZ2V0cyBkZXZpY2Ugb3V0IG9mIGxvdyBwb3dlciBtb2RlLAorICogcGVyZm9ybXMgcHJlc3N1cmUgYW5kIHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50cywgdGhlbiBhdXRvbWF0aWNhbGx5IHN3aXRjaGVzCisgKiBiYWNrIHRvIGxvdyBwb3dlciBtb2RlLiBJdCBpcyBtZWFudCBmb3Igb24gZGVtYW5kIHNhbXBsaW5nIHdpdGggb3B0aW1hbCBwb3dlcgorICogc2F2aW5nIGF0IHRoZSBjb3N0IG9mIGxvd2VyIHNhbXBsaW5nIHJhdGUgYW5kIGhpZ2hlciBzb2Z0d2FyZSBvdmVyaGVhZC4KKyAqIFRoaXMgaXMgYSBuYXR1cmFsIGNhbmRpZGF0ZSBmb3IgSUlPIHJlYWRfcmF3IGhvb2sgaW1wbGVtZW50YXRpb24KKyAqICglSU5ESU9fRElSRUNUX01PREUpLiBJdCBpcyBhbHNvIHVzZWQgZm9yIHRyaWdnZXJlZCBidWZmZXJpbmcgc3VwcG9ydCB0bworICogZW5zdXJlIGV4cGxpY2l0IHN5bmNocm9uaXphdGlvbiB3aXRoIGV4dGVybmFsIHRyaWdnZXIgZXZlbnRzCisgKiAoJUlORElPX0JVRkZFUl9UUklHR0VSRUQpLgorICoKKyAqIFRoZSBjb250aW51b3VzIG1vZGUgd29ya3MgYWNjb3JkaW5nIHRvIGEgcGVyaW9kaWMgaGFyZHdhcmUgbWVhc3VyZW1lbnQKKyAqIHByb2Nlc3MgY29udGludW91c2x5IHB1c2hpbmcgc2FtcGxlcyBpbnRvIGFuIGludGVybmFsIGhhcmR3YXJlIEZJRk8gKGZvcgorICogcHJlc3N1cmUgc2FtcGxlcyBvbmx5KS4gTWVhc3VyZW1lbnQgY3ljbGUgY29tcGxldGlvbiBtYXkgYmUgc2lnbmFsZWQgYnkgYQorICogInNhbXBsZSByZWFkeSIgaW50ZXJydXB0LgorICogVHlwaWNhbCBzb2Z0d2FyZSBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIDoKKyAqIC0gZ2V0IGRldmljZSBvdXQgb2YgbG93IHBvd2VyIG1vZGUsCisgKiAtIHNldHVwIGhhcmR3YXJlIHNhbXBsaW5nIHBlcmlvZCwKKyAqIC0gYXQgZW5kIG9mIHBlcmlvZCwgdXBvbiBkYXRhIHJlYWR5IGludGVycnVwdDogcG9wIHByZXNzdXJlIHNhbXBsZXMgb3V0IG9mCisgKiAgIGhhcmR3YXJlIEZJRk8gYW5kIGZldGNoIHRlbXBlcmF0dXJlIHNhbXBsZQorICogLSB3aGVuIG5vIGxvbmdlciBuZWVkZWQsIHN0b3Agc2FtcGxpbmcgcHJvY2VzcyBieSBwdXR0aW5nIGRldmljZSBpbnRvCisgKiAgIGxvdyBwb3dlciBtb2RlLgorICogVGhpcyBtb2RlIGlzIHVzZWQgdG8gaW1wbGVtZW50ICVJTkRJT19CVUZGRVJfVFJJR0dFUkVEIG1vZGUgaWYgZGV2aWNlIHRyZWUKKyAqIGRlY2xhcmVzIGEgdmFsaWQgaW50ZXJydXB0IGxpbmUuIEluIHRoaXMgY2FzZSwgdGhlIGludGVybmFsIGhhcmR3YXJlIHRyaWdnZXIKKyAqIGRyaXZlcyBhY3F1aXNpdGlvbi4KKyAqCisgKiBOb3RlIHRoYXQgaGFyZHdhcmUgc2FtcGxpbmcgZnJlcXVlbmN5IGlzIHRha2VuIGludG8gYWNjb3VudCBvbmx5IHdoZW4KKyAqIGludGVybmFsIGhhcmR3YXJlIHRyaWdnZXIgaXMgYXR0YWNoZWQgYXMgdGhlIGhpZ2hlc3Qgc2FtcGxpbmcgcmF0ZSBzZWVtcyB0bworICogYmUgdGhlIG1vc3QgZW5lcmd5IGVmZmljaWVudC4KKyAqCisgKiBUT0RPOgorICogICBwcmVzZXQgcHJlc3N1cmUgdGhyZXNob2xkIGNyb3NzaW5nIC8gSUlPIGV2ZW50cyA7CisgKiAgIGRpZmZlcmVudGlhbCBwcmVzc3VyZSBzYW1wbGluZyA7CisgKiAgIGhhcmR3YXJlIHNhbXBsZXMgYXZlcmFnaW5nLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2J1ZmZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJfY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcmVkX2J1ZmZlci5oPgorI2luY2x1ZGUgInpwYTIzMjYuaCIKKworLyogMjAwIG1zIHNob3VsZCBiZSBlbm91Z2ggZm9yIHRoZSBsb25nZXN0IGNvbnZlcnNpb24gdGltZSBpbiBvbmUtc2hvdCBtb2RlLiAqLworI2RlZmluZSBaUEEyMzI2X0NPTlZFUlNJT05fSklGRklFUyAoSFogLyA1KQorCisvKiBUaGVyZSBzaG91bGQgYmUgYSAxIG1zIGRlbGF5IChUcHVwKSBhZnRlciBnZXR0aW5nIG91dCBvZiByZXNldC4gKi8KKyNkZWZpbmUgWlBBMjMyNl9UUFVQX1VTRUNfTUlOICAgICAgKDEwMDApCisjZGVmaW5lIFpQQTIzMjZfVFBVUF9VU0VDX01BWCAgICAgICgyMDAwKQorCisvKioKKyAqIHN0cnVjdCB6cGEyMzI2X2ZyZXF1ZW5jeSAtIEhhcmR3YXJlIHNhbXBsaW5nIGZyZXF1ZW5jeSBkZXNjcmlwdG9yCisgKiBAaHogOiBGcmVxdWVuY3kgaW4gSGVydHouCisgKiBAb2RyOiBPdXRwdXQgRGF0YSBSYXRlIHdvcmQgYXMgZXhwZWN0ZWQgYnkgJVpQQTIzMjZfQ1RSTF9SRUczX1JFRy4KKyAqLworc3RydWN0IHpwYTIzMjZfZnJlcXVlbmN5IHsKKwlpbnQgaHo7CisJdTE2IG9kcjsKK307CisKKy8qCisgKiBLZWVwIHRoZXNlIGluIHN0cmljdCBhc2NlbmRpbmcgb3JkZXI6IGxhc3QgYXJyYXkgZW50cnkgaXMgZXhwZWN0ZWQgdG8KKyAqIGNvcnJlc3BvbmQgdG8gdGhlIGhpZ2hlc3Qgc2FtcGxpbmcgZnJlcXVlbmN5LgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHpwYTIzMjZfZnJlcXVlbmN5IHpwYTIzMjZfc2FtcGxpbmdfZnJlcXVlbmNpZXNbXSA9IHsKKwl7IC5oeiA9IDEsICAub2RyID0gMSA8PCBaUEEyMzI2X0NUUkxfUkVHM19PRFJfU0hJRlQgfSwKKwl7IC5oeiA9IDUsICAub2RyID0gNSA8PCBaUEEyMzI2X0NUUkxfUkVHM19PRFJfU0hJRlQgfSwKKwl7IC5oeiA9IDExLCAub2RyID0gNiA8PCBaUEEyMzI2X0NUUkxfUkVHM19PRFJfU0hJRlQgfSwKKwl7IC5oeiA9IDIzLCAub2RyID0gNyA8PCBaUEEyMzI2X0NUUkxfUkVHM19PRFJfU0hJRlQgfSwKK307CisKKy8qIFJldHVybiB0aGUgaGlnaGVzdCBoYXJkd2FyZSBzYW1wbGluZyBmcmVxdWVuY3kgYXZhaWxhYmxlLiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB6cGEyMzI2X2ZyZXF1ZW5jeSAqenBhMjMyNl9oaWdoZXN0X2ZyZXF1ZW5jeSh2b2lkKQoreworCXJldHVybiAmenBhMjMyNl9zYW1wbGluZ19mcmVxdWVuY2llc1sKKwkJQVJSQVlfU0laRSh6cGEyMzI2X3NhbXBsaW5nX2ZyZXF1ZW5jaWVzKSAtIDFdOworfQorCisvKioKKyAqIHN0cnVjdCB6cGFfcHJpdmF0ZSAtIFBlci1kZXZpY2UgaW50ZXJuYWwgcHJpdmF0ZSBzdGF0ZQorICogQHRpbWVzdGFtcDogIEJ1ZmZlcmVkIHNhbXBsZXMgcmVhZHkgZGF0dW0uCisgKiBAcmVnbWFwOiAgICAgVW5kZXJseWluZyBJMkMgLyBTUEkgYnVzIGFkYXB0ZXIgdXNlZCB0byBhYnN0cmFjdCBzbGF2ZSByZWdpc3RlcgorICogICAgICAgICAgICAgIGFjY2Vzc2VzLgorICogQHJlc3VsdDogICAgIEFsbG93cyBzYW1wbGluZyBsb2dpYyB0byBnZXQgY29tcGxldGlvbiBzdGF0dXMgb2Ygb3BlcmF0aW9ucworICogICAgICAgICAgICAgIHRoYXQgaW50ZXJydXB0IGhhbmRsZXJzIHBlcmZvcm0gYXN5bmNocm9ub3VzbHkuCisgKiBAZGF0YV9yZWFkeTogSW50ZXJydXB0IGhhbmRsZXIgdXNlcyB0aGlzIHRvIHdha2UgdXNlciBjb250ZXh0IHVwIGF0IHNhbXBsaW5nCisgKiAgICAgICAgICAgICAgb3BlcmF0aW9uIGNvbXBsZXRpb24uCisgKiBAdHJpZ2dlcjogICAgT3B0aW9uYWwgaGFyZHdhcmUgLyBpbnRlcnJ1cHQgZHJpdmVuIHRyaWdnZXIgdXNlZCB0byBub3RpZnkKKyAqICAgICAgICAgICAgICBleHRlcm5hbCBkZXZpY2VzIGEgbmV3IHNhbXBsZSBpcyByZWFkeS4KKyAqIEB3YWtlbjogICAgICBGbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgZGV2aWNlIGhhcyBqdXN0IGJlZW4gcG93ZXJlZCBvbi4KKyAqIEBpcnE6ICAgICAgICBPcHRpb25hbCBpbnRlcnJ1cHQgbGluZTogbmVnYXRpdmUgb3IgemVybyBpZiBub3QgZGVjbGFyZWQgaW50bworICogICAgICAgICAgICAgIERULCBpbiB3aGljaCBjYXNlIHNhbXBsaW5nIGxvZ2ljIGtlZXBzIHBvbGxpbmcgc3RhdHVzIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgdG8gZGV0ZWN0IGNvbXBsZXRpb24uCisgKiBAZnJlcXVlbmN5OiAgQ3VycmVudCBoYXJkd2FyZSBzYW1wbGluZyBmcmVxdWVuY3kuCisgKiBAdnJlZjogICAgICAgUG93ZXIgLyB2b2x0YWdlIHJlZmVyZW5jZS4KKyAqIEB2ZGQ6ICAgICAgICBQb3dlciBzdXBwbHkuCisgKi8KK3N0cnVjdCB6cGEyMzI2X3ByaXZhdGUgeworCXM2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOworCXN0cnVjdCByZWdtYXAgICAgICAgICAgICAgICAgICAqcmVnbWFwOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OworCXN0cnVjdCBjb21wbGV0aW9uICAgICAgICAgICAgICAgZGF0YV9yZWFkeTsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgICAgICAgICAgICAgKnRyaWdnZXI7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWtlbjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlycTsKKwljb25zdCBzdHJ1Y3QgenBhMjMyNl9mcmVxdWVuY3kgKmZyZXF1ZW5jeTsKKwlzdHJ1Y3QgcmVndWxhdG9yICAgICAgICAgICAgICAgKnZyZWY7CisJc3RydWN0IHJlZ3VsYXRvciAgICAgICAgICAgICAgICp2ZGQ7Cit9OworCisjZGVmaW5lIHpwYTIzMjZfZXJyKF9pZGV2LCBfZm9ybWF0LCBfYXJnLi4uKSBcCisJZGV2X2VycihfaWRldi0+ZGV2LnBhcmVudCwgX2Zvcm1hdCwgIyNfYXJnKQorCisjZGVmaW5lIHpwYTIzMjZfd2FybihfaWRldiwgX2Zvcm1hdCwgX2FyZy4uLikgXAorCWRldl93YXJuKF9pZGV2LT5kZXYucGFyZW50LCBfZm9ybWF0LCAjI19hcmcpCisKKyNpZmRlZiBERUJVRworI2RlZmluZSB6cGEyMzI2X2RiZyhfaWRldiwgX2Zvcm1hdCwgX2FyZy4uLikgXAorCWRldl9kYmcoX2lkZXYtPmRldi5wYXJlbnQsIF9mb3JtYXQsICMjX2FyZykKKyNlbHNlCisjZGVmaW5lIHpwYTIzMjZfZGJnKF9pZGV2LCBfZm9ybWF0LCBfYXJnLi4uKQorI2VuZGlmCisKK2Jvb2wgenBhMjMyNl9pc3JlZ193cml0ZWFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBaUEEyMzI2X1JFRl9QX1hMX1JFRzoKKwljYXNlIFpQQTIzMjZfUkVGX1BfTF9SRUc6CisJY2FzZSBaUEEyMzI2X1JFRl9QX0hfUkVHOgorCWNhc2UgWlBBMjMyNl9SRVNfQ09ORl9SRUc6CisJY2FzZSBaUEEyMzI2X0NUUkxfUkVHMF9SRUc6CisJY2FzZSBaUEEyMzI2X0NUUkxfUkVHMV9SRUc6CisJY2FzZSBaUEEyMzI2X0NUUkxfUkVHMl9SRUc6CisJY2FzZSBaUEEyMzI2X0NUUkxfUkVHM19SRUc6CisJY2FzZSBaUEEyMzI2X1RIU19QX0xPV19SRUc6CisJY2FzZSBaUEEyMzI2X1RIU19QX0hJR0hfUkVHOgorCQlyZXR1cm4gdHJ1ZTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh6cGEyMzI2X2lzcmVnX3dyaXRlYWJsZSk7CisKK2Jvb2wgenBhMjMyNl9pc3JlZ19yZWFkYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFpQQTIzMjZfUkVGX1BfWExfUkVHOgorCWNhc2UgWlBBMjMyNl9SRUZfUF9MX1JFRzoKKwljYXNlIFpQQTIzMjZfUkVGX1BfSF9SRUc6CisJY2FzZSBaUEEyMzI2X0RFVklDRV9JRF9SRUc6CisJY2FzZSBaUEEyMzI2X1JFU19DT05GX1JFRzoKKwljYXNlIFpQQTIzMjZfQ1RSTF9SRUcwX1JFRzoKKwljYXNlIFpQQTIzMjZfQ1RSTF9SRUcxX1JFRzoKKwljYXNlIFpQQTIzMjZfQ1RSTF9SRUcyX1JFRzoKKwljYXNlIFpQQTIzMjZfQ1RSTF9SRUczX1JFRzoKKwljYXNlIFpQQTIzMjZfSU5UX1NPVVJDRV9SRUc6CisJY2FzZSBaUEEyMzI2X1RIU19QX0xPV19SRUc6CisJY2FzZSBaUEEyMzI2X1RIU19QX0hJR0hfUkVHOgorCWNhc2UgWlBBMjMyNl9TVEFUVVNfUkVHOgorCWNhc2UgWlBBMjMyNl9QUkVTU19PVVRfWExfUkVHOgorCWNhc2UgWlBBMjMyNl9QUkVTU19PVVRfTF9SRUc6CisJY2FzZSBaUEEyMzI2X1BSRVNTX09VVF9IX1JFRzoKKwljYXNlIFpQQTIzMjZfVEVNUF9PVVRfTF9SRUc6CisJY2FzZSBaUEEyMzI2X1RFTVBfT1VUX0hfUkVHOgorCQlyZXR1cm4gdHJ1ZTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh6cGEyMzI2X2lzcmVnX3JlYWRhYmxlKTsKKworYm9vbCB6cGEyMzI2X2lzcmVnX3ByZWNpb3VzKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgWlBBMjMyNl9JTlRfU09VUkNFX1JFRzoKKwljYXNlIFpQQTIzMjZfUFJFU1NfT1VUX0hfUkVHOgorCQlyZXR1cm4gdHJ1ZTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh6cGEyMzI2X2lzcmVnX3ByZWNpb3VzKTsKKworLyoqCisgKiB6cGEyMzI2X2VuYWJsZV9kZXZpY2UoKSAtIEVuYWJsZSBkZXZpY2UsIGkuZS4gZ2V0IG91dCBvZiBsb3cgcG93ZXIgbW9kZS4KKyAqIEBpbmRpb19kZXY6IFRoZSBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFyZHdhcmUgdG8gZW5hYmxlLgorICoKKyAqIFJlcXVpcmVkIHRvIGFjY2VzcyBjb21wbGV0ZSByZWdpc3RlciBzcGFjZSBhbmQgdG8gcGVyZm9ybSBhbnkgc2FtcGxpbmcKKyAqIG9yIGNvbnRyb2wgb3BlcmF0aW9ucy4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHpwYTIzMjZfZW5hYmxlX2RldmljZShjb25zdCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCBlcnI7CisKKwllcnIgPSByZWdtYXBfd3JpdGUoKChzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICopCisJCQkgICAgaWlvX3ByaXYoaW5kaW9fZGV2KSktPnJlZ21hcCwKKwkJCSAgICBaUEEyMzI2X0NUUkxfUkVHMF9SRUcsIFpQQTIzMjZfQ1RSTF9SRUcwX0VOQUJMRSk7CisJaWYgKGVycikgeworCQl6cGEyMzI2X2VycihpbmRpb19kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGRldmljZSAoJWQpIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl6cGEyMzI2X2RiZyhpbmRpb19kZXYsICJlbmFibGVkIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6cGEyMzI2X3NsZWVwKCkgLSBEaXNhYmxlIGRldmljZSwgaS5lLiBzd2l0Y2ggdG8gbG93IHBvd2VyIG1vZGUuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhhcmR3YXJlIHRvIGRpc2FibGUuCisgKgorICogT25seSAlWlBBMjMyNl9ERVZJQ0VfSURfUkVHIGFuZCAlWlBBMjMyNl9DVFJMX1JFRzBfUkVHIHJlZ2lzdGVycyBtYXkgYmUKKyAqIGFjY2Vzc2VkIG9uY2UgZGV2aWNlIGlzIGluIHRoZSBkaXNhYmxlZCBzdGF0ZS4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHpwYTIzMjZfc2xlZXAoY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcmVnbWFwX3dyaXRlKCgoc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqKQorCQkJICAgIGlpb19wcml2KGluZGlvX2RldikpLT5yZWdtYXAsCisJCQkgICAgWlBBMjMyNl9DVFJMX1JFRzBfUkVHLCAwKTsKKwlpZiAoZXJyKSB7CisJCXpwYTIzMjZfZXJyKGluZGlvX2RldiwgImZhaWxlZCB0byBzbGVlcCAoJWQpIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl6cGEyMzI2X2RiZyhpbmRpb19kZXYsICJzbGVlcGluZyIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenBhMjMyNl9yZXNldF9kZXZpY2UoKSAtIFJlc2V0IGRldmljZSB0byBkZWZhdWx0IGhhcmR3YXJlIHN0YXRlLgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYXJkd2FyZSB0byByZXNldC4KKyAqCisgKiBEaXNhYmxlIHNhbXBsaW5nIGFuZCBlbXB0eSBoYXJkd2FyZSBGSUZPLgorICogRGV2aWNlIG11c3QgYmUgZW5hYmxlZCBiZWZvcmUgcmVzZXQsIGkuZS4gbm90IGluIGxvdyBwb3dlciBtb2RlLgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9yZXNldF9kZXZpY2UoY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcmVnbWFwX3dyaXRlKCgoc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqKQorCQkJICAgIGlpb19wcml2KGluZGlvX2RldikpLT5yZWdtYXAsCisJCQkgICAgWlBBMjMyNl9DVFJMX1JFRzJfUkVHLCBaUEEyMzI2X0NUUkxfUkVHMl9TV1JFU0VUKTsKKwlpZiAoZXJyKSB7CisJCXpwYTIzMjZfZXJyKGluZGlvX2RldiwgImZhaWxlZCB0byByZXNldCBkZXZpY2UgKCVkKSIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJdXNsZWVwX3JhbmdlKFpQQTIzMjZfVFBVUF9VU0VDX01JTiwgWlBBMjMyNl9UUFVQX1VTRUNfTUFYKTsKKworCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgInJlc2V0Iik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6cGEyMzI2X3N0YXJ0X29uZXNob3QoKSAtIFN0YXJ0IGEgc2luZ2xlIHNhbXBsaW5nIGN5Y2xlLCBpLmUuIGluIG9uZSBzaG90CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICoKKyAqIERldmljZSBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IGVuYWJsZWQgYW5kIGNvbmZpZ3VyZWQgZm9yIG9uZSBzaG90IG1vZGUuCisgKiBEZXZpY2Ugd2lsbCBiZSBzd2l0Y2hlZCBiYWNrIHRvIGxvdyBwb3dlciBtb2RlIGF0IGVuZCBvZiBjeWNsZS4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHpwYTIzMjZfc3RhcnRfb25lc2hvdChjb25zdCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCBlcnI7CisKKwllcnIgPSByZWdtYXBfd3JpdGUoKChzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICopCisJCQkgICAgaWlvX3ByaXYoaW5kaW9fZGV2KSktPnJlZ21hcCwKKwkJCSAgICBaUEEyMzI2X0NUUkxfUkVHMF9SRUcsCisJCQkgICAgWlBBMjMyNl9DVFJMX1JFRzBfRU5BQkxFIHwKKwkJCSAgICBaUEEyMzI2X0NUUkxfUkVHMF9PTkVfU0hPVCk7CisJaWYgKGVycikgeworCQl6cGEyMzI2X2VycihpbmRpb19kZXYsICJmYWlsZWQgdG8gc3RhcnQgb25lIHNob3QgY3ljbGUgKCVkKSIsCisJCQkgICAgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl6cGEyMzI2X2RiZyhpbmRpb19kZXYsICJvbmUgc2hvdCBjeWNsZSBzdGFydGVkIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6cGEyMzI2X3Bvd2VyX29uKCkgLSBQb3dlciBvbiBkZXZpY2UgdG8gYWxsb3cgc3Vic2VxdWVudCBjb25maWd1cmF0aW9uLgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqIEBwcml2YXRlOiAgIEludGVybmFsIHByaXZhdGUgc3RhdGUgcmVsYXRlZCB0byBAaW5kaW9fZGV2LgorICoKKyAqIFNhbXBsaW5nIHdpbGwgYmUgZGlzYWJsZWQsIHByZXZlbnRpbmcgc3RyYW5nZSB0aGluZ3MgZnJvbSBoYXBwZW5pbmcgaW4gb3VyCisgKiBiYWNrLiBIYXJkd2FyZSBGSUZPIGNvbnRlbnQgd2lsbCBiZSBjbGVhcmVkLgorICogV2hlbiBzdWNjZXNzZnVsLCBkZXZpY2Ugd2lsbCBiZSBsZWZ0IGluIHRoZSBlbmFibGVkIHN0YXRlIHRvIGFsbG93IGZ1cnRoZXIKKyAqIGNvbmZpZ3VyYXRpb24uCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB6cGEyMzI2X3Bvd2VyX29uKGNvbnN0IHN0cnVjdCBpaW9fZGV2ICAgICAgICAgKmluZGlvX2RldiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICpwcml2YXRlKQoreworCWludCBlcnI7CisKKwllcnIgPSByZWd1bGF0b3JfZW5hYmxlKHByaXZhdGUtPnZyZWYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSByZWd1bGF0b3JfZW5hYmxlKHByaXZhdGUtPnZkZCk7CisJaWYgKGVycikKKwkJZ290byB2cmVmOworCisJenBhMjMyNl9kYmcoaW5kaW9fZGV2LCAicG93ZXJlZCBvbiIpOworCisJZXJyID0genBhMjMyNl9lbmFibGVfZGV2aWNlKGluZGlvX2Rldik7CisJaWYgKGVycikKKwkJZ290byB2ZGQ7CisKKwllcnIgPSB6cGEyMzI2X3Jlc2V0X2RldmljZShpbmRpb19kZXYpOworCWlmIChlcnIpCisJCWdvdG8gc2xlZXA7CisKKwlyZXR1cm4gMDsKKworc2xlZXA6CisJenBhMjMyNl9zbGVlcChpbmRpb19kZXYpOwordmRkOgorCXJlZ3VsYXRvcl9kaXNhYmxlKHByaXZhdGUtPnZkZCk7Cit2cmVmOgorCXJlZ3VsYXRvcl9kaXNhYmxlKHByaXZhdGUtPnZyZWYpOworCisJenBhMjMyNl9kYmcoaW5kaW9fZGV2LCAicG93ZXJlZCBvZmYiKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogenBhMjMyNl9wb3dlcl9vZmYoKSAtIFBvd2VyIG9mZiBkZXZpY2UsIGkuZS4gZGlzYWJsZSBhdHRhY2hlZCBwb3dlcgorICogICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXRvcnMuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICogQHByaXZhdGU6ICAgSW50ZXJuYWwgcHJpdmF0ZSBzdGF0ZSByZWxhdGVkIHRvIEBpbmRpb19kZXYuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIHZvaWQgenBhMjMyNl9wb3dlcl9vZmYoY29uc3Qgc3RydWN0IGlpb19kZXYgICAgICAgICAqaW5kaW9fZGV2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqcHJpdmF0ZSkKK3sKKwlyZWd1bGF0b3JfZGlzYWJsZShwcml2YXRlLT52ZGQpOworCXJlZ3VsYXRvcl9kaXNhYmxlKHByaXZhdGUtPnZyZWYpOworCisJenBhMjMyNl9kYmcoaW5kaW9fZGV2LCAicG93ZXJlZCBvZmYiKTsKK30KKworLyoqCisgKiB6cGEyMzI2X2NvbmZpZ19vbmVzaG90KCkgLSBTZXR1cCBkZXZpY2UgZm9yIG9uZSBzaG90IC8gb24gZGVtYW5kIG1vZGUuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICogQGlycTogICAgICAgT3B0aW9uYWwgaW50ZXJydXB0IGxpbmUgdGhlIGhhcmR3YXJlIHVzZXMgdG8gbm90aWZ5IG5ldyBkYXRhCisgKiAgICAgICAgICAgICBzYW1wbGVzIGFyZSByZWFkeS4gTmVnYXRpdmUgb3IgemVybyB2YWx1ZXMgaW5kaWNhdGUgbm8gaW50ZXJydXB0cworICogICAgICAgICAgICAgYXJlIGF2YWlsYWJsZSwgbWVhbmluZyBwb2xsaW5nIGlzIHJlcXVpcmVkLgorICoKKyAqIE91dHB1dCBEYXRhIFJhdGUgaXMgY29uZmlndXJlZCBmb3IgdGhlIGhpZ2hlc3QgcG9zc2libGUgcmF0ZSBzbyB0aGF0CisgKiBjb252ZXJzaW9uIHRpbWUgYW5kIHBvd2VyIGNvbnN1bXB0aW9uIGFyZSByZWR1Y2VkIHRvIGEgbWluaW11bS4KKyAqIE5vdGUgdGhhdCBoYXJkd2FyZSBpbnRlcm5hbCBhdmVyYWdpbmcgbWFjaGluZXJ5IChub3QgaW1wbGVtZW50ZWQgaW4gdGhpcworICogZHJpdmVyKSBpcyBub3QgYXBwbGljYWJsZSBpbiB0aGlzIG1vZGUuCisgKgorICogRGV2aWNlIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgZW5hYmxlZCBiZWZvcmUgY2FsbGluZworICogenBhMjMyNl9jb25maWdfb25lc2hvdCgpLgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9jb25maWdfb25lc2hvdChjb25zdCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCSAgaW50ICAgICAgICAgICAgICAgICAgIGlycSkKK3sKKwlzdHJ1Y3QgcmVnbWFwICAgICAgICAgICAgICAgICAgKnJlZ3MgPSAoKHN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKikKKwkJCQkJCWlpb19wcml2KGluZGlvX2RldikpLT5yZWdtYXA7CisJY29uc3Qgc3RydWN0IHpwYTIzMjZfZnJlcXVlbmN5ICpmcmVxID0genBhMjMyNl9oaWdoZXN0X2ZyZXF1ZW5jeSgpOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyOworCisJLyogU2V0dXAgaGlnaGVzdCBhdmFpbGFibGUgT3V0cHV0IERhdGEgUmF0ZSBmb3Igb25lIHNob3QgbW9kZS4gKi8KKwllcnIgPSByZWdtYXBfd3JpdGUocmVncywgWlBBMjMyNl9DVFJMX1JFRzNfUkVHLCBmcmVxLT5vZHIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoaXJxID4gMCkgeworCQkvKiBSZXF1ZXN0IGludGVycnVwdCB3aGVuIG5ldyBzYW1wbGUgaXMgYXZhaWxhYmxlLiAqLworCQllcnIgPSByZWdtYXBfd3JpdGUocmVncywgWlBBMjMyNl9DVFJMX1JFRzFfUkVHLAorCQkJCSAgICh1OCl+WlBBMjMyNl9DVFJMX1JFRzFfTUFTS19EQVRBX1JFQURZKTsKKworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKGluZGlvX2Rldi0+ZGV2LnBhcmVudCwKKwkJCQkiZmFpbGVkIHRvIHNldHVwIG9uZSBzaG90IG1vZGUgKCVkKSIsIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJenBhMjMyNl9kYmcoaW5kaW9fZGV2LCAib25lIHNob3QgbW9kZSBzZXR1cCBAJWRIeiIsIGZyZXEtPmh6KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHpwYTIzMjZfY2xlYXJfZmlmbygpIC0gQ2xlYXIgcmVtYWluaW5nIGVudHJpZXMgaW4gaGFyZHdhcmUgRklGTy4KKyAqIEBpbmRpb19kZXY6IFRoZSBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxpbmcgaGFyZHdhcmUuCisgKiBAbWluX2NvdW50OiBOdW1iZXIgb2Ygc2FtcGxlcyBwcmVzZW50IHdpdGhpbiBoYXJkd2FyZSBGSUZPLgorICoKKyAqIEBtaW5fY291bnQgYXJndW1lbnQgaXMgYSBoaW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGtub3duIG1pbmltdW0gbnVtYmVyIG9mCisgKiBzYW1wbGVzIGN1cnJlbnRseSBsaXZpbmcgaW4gdGhlIEZJRk8uIFRoaXMgYWxsb3dzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGJ1cworICogYWNjZXNzZXMgYnkgc2tpcHBpbmcgc3RhdHVzIHJlZ2lzdGVyIHJlYWQgb3BlcmF0aW9uIGFzIGxvbmcgYXMgd2Uga25vdyBmb3IKKyAqIHN1cmUgdGhlcmUgYXJlIHN0aWxsIGVudHJpZXMgbGVmdC4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHpwYTIzMjZfY2xlYXJfZmlmbyhjb25zdCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgIG1pbl9jb3VudCkKK3sKKwlzdHJ1Y3QgcmVnbWFwICpyZWdzID0gKChzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICopCisJCQkgICAgICAgaWlvX3ByaXYoaW5kaW9fZGV2KSktPnJlZ21hcDsKKwlpbnQgICAgICAgICAgICBlcnI7CisJdW5zaWduZWQgaW50ICAgdmFsOworCisJaWYgKCFtaW5fY291bnQpIHsKKwkJLyoKKwkJICogTm8gaGludDogcmVhZCBzdGF0dXMgcmVnaXN0ZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgRklGTyBpcworCQkgKiBlbXB0eSBvciBub3QuCisJCSAqLworCQllcnIgPSByZWdtYXBfcmVhZChyZWdzLCBaUEEyMzI2X1NUQVRVU19SRUcsICZ2YWwpOworCisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnI7CisKKwkJaWYgKHZhbCAmIFpQQTIzMjZfU1RBVFVTX0ZJRk9fRSkKKwkJCS8qIEZpZm8gaXMgZW1wdHk6IG5vdGhpbmcgdG8gdHJhc2guICovCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDbGVhciBGSUZPLiAqLworCWRvIHsKKwkJLyoKKwkJICogQSBzaW5nbGUgZmV0Y2ggZnJvbSBwcmVzc3VyZSBNU0IgcmVnaXN0ZXIgaXMgZW5vdWdoIHRvIHBvcAorCQkgKiB2YWx1ZXMgb3V0IG9mIEZJRk8uCisJCSAqLworCQllcnIgPSByZWdtYXBfcmVhZChyZWdzLCBaUEEyMzI2X1BSRVNTX09VVF9IX1JFRywgJnZhbCk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnI7CisKKwkJaWYgKG1pbl9jb3VudCkgeworCQkJLyoKKwkJCSAqIFdlIGtub3cgZm9yIHN1cmUgdGhlcmUgYXJlIGF0IGxlYXN0IG1pbl9jb3VudCBlbnRyaWVzCisJCQkgKiBsZWZ0IGluIEZJRk8uIFNraXAgc3RhdHVzIHJlZ2lzdGVyIHJlYWQuCisJCQkgKi8KKwkJCW1pbl9jb3VudC0tOworCQkJY29udGludWU7CisJCX0KKworCQllcnIgPSByZWdtYXBfcmVhZChyZWdzLCBaUEEyMzI2X1NUQVRVU19SRUcsICZ2YWwpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyOworCisJfSB3aGlsZSAoISh2YWwgJiBaUEEyMzI2X1NUQVRVU19GSUZPX0UpKTsKKworCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgIkZJRk8gY2xlYXJlZCIpOworCisJcmV0dXJuIDA7CisKK2VycjoKKwl6cGEyMzI2X2VycihpbmRpb19kZXYsICJmYWlsZWQgdG8gY2xlYXIgRklGTyAoJWQpIiwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogenBhMjMyNl9kZXF1ZXVlX3ByZXNzdXJlKCkgLSBSZXRyaWV2ZSB0aGUgbW9zdCByZWNlbnQgcHJlc3N1cmUgc2FtcGxlIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmUgRklGTy4KKyAqIEBpbmRpb19kZXY6IFRoZSBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxpbmcgaGFyZHdhcmUuCisgKiBAcHJlc3N1cmU6ICBTYW1wbGVkIHByZXNzdXJlIG91dHB1dC4KKyAqCisgKiBOb3RlIHRoYXQgWlBBMjMyNiBoYXJkd2FyZSBGSUZPIHN0b3JlcyBwcmVzc3VyZSBzYW1wbGVzIG9ubHkuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB6cGEyMzI2X2RlcXVldWVfcHJlc3N1cmUoY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgdTMyICAgICAgICAgICAgICAgICAgKnByZXNzdXJlKQoreworCXN0cnVjdCByZWdtYXAgKnJlZ3MgPSAoKHN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKikKKwkJCSAgICAgICBpaW9fcHJpdihpbmRpb19kZXYpKS0+cmVnbWFwOworCXVuc2lnbmVkIGludCAgIHZhbDsKKwlpbnQgICAgICAgICAgICBlcnI7CisJaW50ICAgICAgICAgICAgY2xlYXJlZCA9IC0xOworCisJZXJyID0gcmVnbWFwX3JlYWQocmVncywgWlBBMjMyNl9TVEFUVVNfUkVHLCAmdmFsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCSpwcmVzc3VyZSA9IDA7CisKKwlpZiAodmFsICYgWlBBMjMyNl9TVEFUVVNfUF9PUikgeworCQkvKgorCQkgKiBGaWZvIG92ZXJydW4gOiBmaXJzdCBzYW1wbGUgZGVxdWV1ZWQgZnJvbSBGSUZPIGlzIHRoZQorCQkgKiBuZXdlc3QuCisJCSAqLworCQl6cGEyMzI2X3dhcm4oaW5kaW9fZGV2LCAiRklGTyBvdmVyZmxvdyIpOworCisJCWVyciA9IHJlZ21hcF9idWxrX3JlYWQocmVncywgWlBBMjMyNl9QUkVTU19PVVRfWExfUkVHLCBwcmVzc3VyZSwKKwkJCQkgICAgICAgMyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisjZGVmaW5lIFpQQTIzMjZfRklGT19ERVBUSCAoMTZVKQorCQkvKiBIYXJkd2FyZSBGSUZPIG1heSBob2xkIG5vIG1vcmUgdGhhbiAxNiBwcmVzc3VyZSBzYW1wbGVzLiAqLworCQlyZXR1cm4genBhMjMyNl9jbGVhcl9maWZvKGluZGlvX2RldiwgWlBBMjMyNl9GSUZPX0RFUFRIIC0gMSk7CisJfQorCisJLyoKKwkgKiBGaWZvIGhhcyBub3Qgb3ZlcmZsb3duIDogcmV0cmlldmUgbmV3ZXN0IHNhbXBsZS4gV2UgbmVlZCB0byBwb3AKKwkgKiB2YWx1ZXMgb3V0IHVudGlsIEZJRk8gaXMgZW1wdHkgOiBsYXN0IGZldGNoZWQgcHJlc3N1cmUgaXMgdGhlIG5ld2VzdC4KKwkgKiBJbiBub21pbmFsIGNhc2VzLCB3ZSBzaG91bGQgZmluZCBhIHNpbmdsZSBxdWV1ZWQgc2FtcGxlIG9ubHkuCisJICovCisJZG8geworCQllcnIgPSByZWdtYXBfYnVsa19yZWFkKHJlZ3MsIFpQQTIzMjZfUFJFU1NfT1VUX1hMX1JFRywgcHJlc3N1cmUsCisJCQkJICAgICAgIDMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQllcnIgPSByZWdtYXBfcmVhZChyZWdzLCBaUEEyMzI2X1NUQVRVU19SRUcsICZ2YWwpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisKKwkJY2xlYXJlZCsrOworCX0gd2hpbGUgKCEodmFsICYgWlBBMjMyNl9TVEFUVVNfRklGT19FKSk7CisKKwlpZiAoY2xlYXJlZCkKKwkJLyoKKwkJICogU2FtcGxlcyB3ZXJlIHB1c2hlZCBieSBoYXJkd2FyZSBkdXJpbmcgcHJldmlvdXMgcm91bmRzIGJ1dCB3ZQorCQkgKiBkaWRuJ3QgY29uc3VtZSB0aGVtIGZhc3QgZW5vdWdoOiBpbmZvcm0gdXNlci4KKwkJICovCisJCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgImNsZWFyZWQgJWQgRklGTyBlbnRyaWVzIiwgY2xlYXJlZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6cGEyMzI2X2ZpbGxfc2FtcGxlX2J1ZmZlcigpIC0gRW5xdWV1ZSBuZXcgY2hhbm5lbCBzYW1wbGVzIHRvIElJTyBidWZmZXIuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICogQHByaXZhdGU6ICAgSW50ZXJuYWwgcHJpdmF0ZSBzdGF0ZSByZWxhdGVkIHRvIEBpbmRpb19kZXYuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB6cGEyMzI2X2ZpbGxfc2FtcGxlX2J1ZmZlcihzdHJ1Y3QgaWlvX2RldiAgICAgICAgICAgICAgICppbmRpb19kZXYsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3QgeworCQl1MzIgcHJlc3N1cmU7CisJCXUxNiB0ZW1wZXJhdHVyZTsKKwkJdTY0IHRpbWVzdGFtcDsKKwl9ICAgc2FtcGxlOworCWludCBlcnI7CisKKwlpZiAodGVzdF9iaXQoMCwgaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrKSkgeworCQkvKiBHZXQgY3VycmVudCBwcmVzc3VyZSBmcm9tIGhhcmR3YXJlIEZJRk8uICovCisJCWVyciA9IHpwYTIzMjZfZGVxdWV1ZV9wcmVzc3VyZShpbmRpb19kZXYsICZzYW1wbGUucHJlc3N1cmUpOworCQlpZiAoZXJyKSB7CisJCQl6cGEyMzI2X3dhcm4oaW5kaW9fZGV2LCAiZmFpbGVkIHRvIGZldGNoIHByZXNzdXJlICglZCkiLAorCQkJCSAgICAgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlpZiAodGVzdF9iaXQoMSwgaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrKSkgeworCQkvKiBHZXQgY3VycmVudCB0ZW1wZXJhdHVyZS4gKi8KKwkJZXJyID0gcmVnbWFwX2J1bGtfcmVhZChwcml2YXRlLT5yZWdtYXAsIFpQQTIzMjZfVEVNUF9PVVRfTF9SRUcsCisJCQkJICAgICAgICZzYW1wbGUudGVtcGVyYXR1cmUsIDIpOworCQlpZiAoZXJyKSB7CisJCQl6cGEyMzI2X3dhcm4oaW5kaW9fZGV2LAorCQkJCSAgICAgImZhaWxlZCB0byBmZXRjaCB0ZW1wZXJhdHVyZSAoJWQpIiwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwkvKgorCSAqIE5vdyBwdXNoIHNhbXBsZXMgdXNpbmcgdGltZXN0YW1wIHN0b3JlZCBlaXRoZXIgOgorCSAqICAgLSBieSBoYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBpZiBpbnRlcnJ1cHQgaXMgYXZhaWxhYmxlOiBzZWUKKwkgKiAgICAgenBhMjMyNl9oYW5kbGVfaXJxKCksCisJICogICAtIG9yIG9uZXNob3QgY29tcGxldGlvbiBwb2xsaW5nIG1hY2hpbmVyeSA6IHNlZQorCSAqICAgICB6cGEyMzI2X3RyaWdnZXJfaGFuZGxlcigpLgorCSAqLworCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgImZpbGxpbmcgcmF3IHNhbXBsZXMgYnVmZmVyIik7CisKKwlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2RldiwgJnNhbXBsZSwKKwkJCQkJICAgcHJpdmF0ZS0+dGltZXN0YW1wKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHpwYTIzMjZfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwljb25zdCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBhcmVudCk7CisKKwlpZiAocG1fcnVudGltZV9hdXRvc3VzcGVuZF9leHBpcmF0aW9uKHBhcmVudCkpCisJCS8qIFVzZXJzcGFjZSBjaGFuZ2VkIGF1dG9zdXNwZW5kIGRlbGF5LiAqLworCQlyZXR1cm4gLUVBR0FJTjsKKworCXpwYTIzMjZfcG93ZXJfb2ZmKGluZGlvX2RldiwgaWlvX3ByaXYoaW5kaW9fZGV2KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB6cGEyMzI2X3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwljb25zdCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBhcmVudCk7CisKKwlyZXR1cm4genBhMjMyNl9wb3dlcl9vbihpbmRpb19kZXYsIGlpb19wcml2KGluZGlvX2RldikpOworfQorCitjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB6cGEyMzI2X3BtX29wcyA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhwbV9ydW50aW1lX2ZvcmNlX3N1c3BlbmQsCisJCQkJcG1fcnVudGltZV9mb3JjZV9yZXN1bWUpCisJU0VUX1JVTlRJTUVfUE1fT1BTKHpwYTIzMjZfcnVudGltZV9zdXNwZW5kLCB6cGEyMzI2X3J1bnRpbWVfcmVzdW1lLAorCQkJICAgTlVMTCkKK307CitFWFBPUlRfU1lNQk9MX0dQTCh6cGEyMzI2X3BtX29wcyk7CisKKy8qKgorICogenBhMjMyNl9yZXN1bWUoKSAtIFJlcXVlc3QgdGhlIFBNIGxheWVyIHRvIHBvd2VyIHN1cHBseSB0aGUgZGV2aWNlLgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqCisgKiBSZXR1cm46CisgKiAgPCAwIC0gYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG1lYW5pbmcgZmFpbHVyZSA7CisgKiAgICAwIC0gc3VjY2VzcywgZGV2aWNlIGhhcyBqdXN0IGJlZW4gcG93ZXJlZCB1cCA7CisgKiAgICAxIC0gc3VjY2VzcywgZGV2aWNlIHdhcyBhbHJlYWR5IHBvd2VyZWQuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9yZXN1bWUoY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcG1fcnVudGltZV9nZXRfc3luYyhpbmRpb19kZXYtPmRldi5wYXJlbnQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGVyciA+IDApIHsKKwkJLyoKKwkJICogRGV2aWNlIHdhcyBhbHJlYWR5IHBvd2VyIHN1cHBsaWVkOiBnZXQgaXQgb3V0IG9mIGxvdyBwb3dlcgorCQkgKiBtb2RlIGFuZCBpbmZvcm0gY2FsbGVyLgorCQkgKi8KKwkJenBhMjMyNl9lbmFibGVfZGV2aWNlKGluZGlvX2Rldik7CisJCXJldHVybiAxOworCX0KKworCS8qIEluZm9ybSBjYWxsZXIgZGV2aWNlIGhhcyBqdXN0IGJlZW4gYnJvdWdodCBiYWNrIHRvIGxpZmUuICovCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenBhMjMyNl9zdXNwZW5kKCkgLSBTY2hlZHVsZSBhIHBvd2VyIGRvd24gdXNpbmcgYXV0b3N1c3BlbmQgZmVhdHVyZSBvZiBQTQorICogICAgICAgICAgICAgICAgICAgICBsYXllci4KKyAqIEBpbmRpb19kZXY6IFRoZSBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxpbmcgaGFyZHdhcmUuCisgKgorICogRGV2aWNlIGlzIHN3aXRjaGVkIHRvIGxvdyBwb3dlciBtb2RlIGF0IGZpcnN0IHRvIHNhdmUgcG93ZXIgZXZlbiB3aGVuCisgKiBhdHRhY2hlZCByZWd1bGF0b3IgaXMgYSAiZHVtbXkiIG9uZS4KKyAqLworc3RhdGljIHZvaWQgenBhMjMyNl9zdXNwZW5kKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGRldmljZSAqcGFyZW50ID0gaW5kaW9fZGV2LT5kZXYucGFyZW50OworCisJenBhMjMyNl9zbGVlcChpbmRpb19kZXYpOworCisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShwYXJlbnQpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHBhcmVudCk7Cit9CisKK3N0YXRpYyB2b2lkIHpwYTIzMjZfaW5pdF9ydW50aW1lKHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZShwYXJlbnQpOworCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShwYXJlbnQpOworCXBtX3J1bnRpbWVfZW5hYmxlKHBhcmVudCk7CisJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkocGFyZW50LCAxMDAwKTsKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZChwYXJlbnQpOworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kocGFyZW50KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChwYXJlbnQpOworfQorCitzdGF0aWMgdm9pZCB6cGEyMzI2X2ZpbmlfcnVudGltZShzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCit7CisJcG1fcnVudGltZV9kaXNhYmxlKHBhcmVudCk7CisJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKHBhcmVudCk7Cit9CisjZWxzZSAvKiAhQ09ORklHX1BNICovCitzdGF0aWMgaW50IHpwYTIzMjZfcmVzdW1lKGNvbnN0IHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJenBhMjMyNl9lbmFibGVfZGV2aWNlKGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgenBhMjMyNl9zdXNwZW5kKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJenBhMjMyNl9zbGVlcChpbmRpb19kZXYpOworfQorCisjZGVmaW5lIHpwYTIzMjZfaW5pdF9ydW50aW1lKF9wYXJlbnQpCisjZGVmaW5lIHpwYTIzMjZfZmluaV9ydW50aW1lKF9wYXJlbnQpCisjZW5kaWYgLyogIUNPTkZJR19QTSAqLworCisvKioKKyAqIHpwYTIzMjZfaGFuZGxlX2lycSgpIC0gUHJvY2VzcyBoYXJkd2FyZSBpbnRlcnJ1cHRzLgorICogQGlycTogIEludGVycnVwdCBsaW5lIHRoZSBoYXJkd2FyZSB1c2VzIHRvIG5vdGlmeSBuZXcgZGF0YSBoYXMgYXJyaXZlZC4KKyAqIEBkYXRhOiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICoKKyAqIFRpbWVzdGFtcCBidWZmZXJlZCBzYW1wbGVzIGFzIHNvb24gYXMgcG9zc2libGUgdGhlbiBzY2hlZHVsZSB0aHJlYWRlZCBib3R0b20KKyAqIGhhbGYuCisgKgorICogUmV0dXJuOiBBbHdheXMgc3VjY2Vzc2Z1bC4KKyAqLworc3RhdGljIGlycXJldHVybl90IHpwYTIzMjZfaGFuZGxlX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSAoc3RydWN0IGlpb19kZXYgKilkYXRhOworCisJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKSB7CisJCS8qIFRpbWVzdGFtcGluZyBuZWVkZWQgZm9yIGJ1ZmZlcmVkIHNhbXBsaW5nIG9ubHkuICovCisJCSgoc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqKQorCQkgaWlvX3ByaXYoaW5kaW9fZGV2KSktPnRpbWVzdGFtcCA9IGlpb19nZXRfdGltZV9ucyhpbmRpb19kZXYpOworCX0KKworCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7Cit9CisKKy8qKgorICogenBhMjMyNl9oYW5kbGVfdGhyZWFkZWRfaXJxKCkgLSBJbnRlcnJ1cHQgYm90dG9tLWhhbGYgaGFuZGxlci4KKyAqIEBpcnE6ICBJbnRlcnJ1cHQgbGluZSB0aGUgaGFyZHdhcmUgdXNlcyB0byBub3RpZnkgbmV3IGRhdGEgaGFzIGFycml2ZWQuCisgKiBAZGF0YTogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqCisgKiBNYWlubHkgZW5zdXJlcyBpbnRlcnJ1cHQgaXMgY2F1c2VkIGJ5IGEgcmVhbCAibmV3IHNhbXBsZSBhdmFpbGFibGUiCisgKiBjb25kaXRpb24uIFRoaXMgcmVsaWVzIHVwb24gdGhlIGFiaWxpdHkgdG8gcGVyZm9ybSBibG9ja2luZyAvIHNsZWVwaW5nIGJ1cworICogYWNjZXNzZXMgdG8gc2xhdmUncyByZWdpc3RlcnMuIFRoaXMgaXMgd2h5IHpwYTIzMjZfaGFuZGxlX3RocmVhZGVkX2lycSgpIGlzCisgKiBjYWxsZWQgZnJvbSB3aXRoaW4gYSB0aHJlYWQsIGkuZS4gbm90IGNhbGxlZCBmcm9tIGhhcmQgaW50ZXJydXB0IGNvbnRleHQuCisgKgorICogV2hlbiBkZXZpY2UgaXMgdXNpbmcgaXRzIG93biBpbnRlcm5hbCBoYXJkd2FyZSB0cmlnZ2VyIGluIGNvbnRpbnVvdXMgc2FtcGxpbmcKKyAqIG1vZGUsIGRhdGEgYXJlIGF2YWlsYWJsZSBpbnRvIGhhcmR3YXJlIEZJRk8gb25jZSBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkLiBBbGwKKyAqIHdlIGhhdmUgdG8gZG8gaXMgdG8gZGlzcGF0Y2ggdGhlIHRyaWdnZXIsIHdoaWNoIGluIHR1cm4gd2lsbCBmZXRjaCBkYXRhIGFuZAorICogZmlsbCBJSU8gYnVmZmVyLgorICoKKyAqIFdoZW4gbm90IHVzaW5nIGl0cyBvd24gaW50ZXJuYWwgaGFyZHdhcmUgdHJpZ2dlciwgdGhlIGRldmljZSBoYXMgYmVlbgorICogY29uZmlndXJlZCBpbiBvbmUtc2hvdCBtb2RlIGVpdGhlciBieSBhbiBleHRlcm5hbCB0cmlnZ2VyIG9yIHRoZSBJSU8gcmVhZF9yYXcKKyAqIGhvb2suIFRoaXMgbWVhbnMgb25lIG9mIHRoZSBsYXR0ZXIgaXMgY3VycmVudGx5IHdhaXRpbmcgZm9yIHNhbXBsaW5nCisgKiBjb21wbGV0aW9uLCBpbiB3aGljaCBjYXNlIHdlIG11c3Qgc2ltcGx5IHdha2UgaXQgdXAuCisgKgorICogU2VlIHpwYTIzMjZfdHJpZ2dlcl9oYW5kbGVyKCkuCisgKgorICogUmV0dXJuOgorICogICAlSVJRX05PTkUgLSBubyBjb25zaXN0ZW50IGludGVycnVwdCBoYXBwZW5lZCA7CisgKiAgICVJUlFfSEFORExFRCAtIHRoZXJlIHdhcyBuZXcgc2FtcGxlcyBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB6cGEyMzI2X2hhbmRsZV90aHJlYWRlZF9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAgICAgICAgICppbmRpb19kZXYgPSAoc3RydWN0IGlpb19kZXYgKilkYXRhOworCXN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKnByaXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIHZhbDsKKwlib29sICAgICAgICAgICAgICAgICAgICBjb250OworCWlycXJldHVybl90ICAgICAgICAgICAgIHJldCA9IElSUV9OT05FOworCisJLyoKKwkgKiBBcmUgd2UgdXNpbmcgb3VyIG93biBpbnRlcm5hbCB0cmlnZ2VyIGluIHRyaWdnZXJlZCBidWZmZXIgbW9kZSwgaS5lLiwKKwkgKiBjdXJyZW50bHkgd29ya2luZyBpbiBjb250aW51b3VzIHNhbXBsaW5nIG1vZGUgPworCSAqLworCWNvbnQgPSAoaWlvX2J1ZmZlcl9lbmFibGVkKGluZGlvX2RldikgJiYKKwkJaWlvX3RyaWdnZXJfdXNpbmdfb3duKGluZGlvX2RldikpOworCisJLyoKKwkgKiBEZXZpY2Ugd29ya3MgYWNjb3JkaW5nIHRvIGEgbGV2ZWwgaW50ZXJydXB0IHNjaGVtZTogcmVhZGluZyBpbnRlcnJ1cHQKKwkgKiBzdGF0dXMgZGUtYXNzZXJ0cyBpbnRlcnJ1cHQgbGluZS4KKwkgKi8KKwlwcml2LT5yZXN1bHQgPSByZWdtYXBfcmVhZChwcml2LT5yZWdtYXAsIFpQQTIzMjZfSU5UX1NPVVJDRV9SRUcsICZ2YWwpOworCWlmIChwcml2LT5yZXN1bHQgPCAwKSB7CisJCWlmIChjb250KQorCQkJcmV0dXJuIElSUV9OT05FOworCisJCWdvdG8gY29tcGxldGU7CisJfQorCisJLyogRGF0YSByZWFkeSBpcyB0aGUgb25seSBpbnRlcnJ1cHQgc291cmNlIHdlIHJlcXVlc3RlZC4gKi8KKwlpZiAoISh2YWwgJiBaUEEyMzI2X0lOVF9TT1VSQ0VfREFUQV9SRUFEWSkpIHsKKwkJLyoKKwkJICogSW50ZXJydXB0IGhhcHBlbmVkIGJ1dCBubyBuZXcgc2FtcGxlIGF2YWlsYWJsZTogbGlrZWx5IGNhdXNlZAorCQkgKiBieSBzcHVyaW91cyBpbnRlcnJ1cHRzLCBpbiB3aGljaCBjYXNlLCByZXR1cm5pbmcgSVJRX05PTkUKKwkJICogYWxsb3dzIHRvIGJlbmVmaXQgZnJvbSB0aGUgZ2VuZXJpYyBzcHVyaW91cyBpbnRlcnJ1cHRzCisJCSAqIGhhbmRsaW5nLgorCQkgKi8KKwkJenBhMjMyNl93YXJuKGluZGlvX2RldiwgInVuZXhwZWN0ZWQgaW50ZXJydXB0IHN0YXR1cyAlMDJ4IiwKKwkJCSAgICAgdmFsKTsKKworCQlpZiAoY29udCkKKwkJCXJldHVybiBJUlFfTk9ORTsKKworCQlwcml2LT5yZXN1bHQgPSAtRU5PREFUQTsKKwkJZ290byBjb21wbGV0ZTsKKwl9CisKKwkvKiBOZXcgc2FtcGxlIGF2YWlsYWJsZTogZGlzcGF0Y2ggaW50ZXJuYWwgdHJpZ2dlciBjb25zdW1lcnMuICovCisJaWlvX3RyaWdnZXJfcG9sbF9jaGFpbmVkKHByaXYtPnRyaWdnZXIpOworCisJaWYgKGNvbnQpCisJCS8qCisJCSAqIEludGVybmFsIGhhcmR3YXJlIHRyaWdnZXIgaGFzIGJlZW4gc2NoZWR1bGVkIGFib3ZlIDogaXQgd2lsbAorCQkgKiBmZXRjaCBkYXRhIG9uIGl0cyBvd24uCisJCSAqLworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlyZXQgPSBJUlFfSEFORExFRDsKKworY29tcGxldGU6CisJLyoKKwkgKiBXYWtlIHVwIGRpcmVjdCBvciBleHRlcm5hbHkgdHJpZ2dlcmVkIGJ1ZmZlciBtb2RlIHdhaXRlcnM6IHNlZQorCSAqIHpwYTIzMjZfc2FtcGxlX29uZXNob3QoKSBhbmQgenBhMjMyNl90cmlnZ2VyX2hhbmRsZXIoKS4KKwkgKi8KKwljb21wbGV0ZSgmcHJpdi0+ZGF0YV9yZWFkeSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHpwYTIzMjZfd2FpdF9vbmVzaG90X2NvbXBsZXRpb24oKSAtIFdhaXQgZm9yIG9uZXNob3QgZGF0YSByZWFkeSBpbnRlcnJ1cHQuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICogQHByaXZhdGU6ICAgSW50ZXJuYWwgcHJpdmF0ZSBzdGF0ZSByZWxhdGVkIHRvIEBpbmRpb19kZXYuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB6cGEyMzI2X3dhaXRfb25lc2hvdF9jb21wbGV0aW9uKGNvbnN0IHN0cnVjdCBpaW9fZGV2ICAgKmluZGlvX2RldiwKKwkJCQkJICAgc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqcHJpdmF0ZSkKK3sKKwlpbnQgICAgICAgICAgcmV0OworCXVuc2lnbmVkIGludCB2YWw7CisKKwl6cGEyMzI2X2RiZyhpbmRpb19kZXYsICJ3YWl0aW5nIGZvciBvbmUgc2hvdCBjb21wbGV0aW9uIGludGVycnVwdCIpOworCisJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisJCSZwcml2YXRlLT5kYXRhX3JlYWR5LCBaUEEyMzI2X0NPTlZFUlNJT05fSklGRklFUyk7CisJaWYgKHJldCA+IDApCisJCS8qCisJCSAqIEludGVycnVwdCBoYW5kbGVyIGNvbXBsZXRlZCBiZWZvcmUgdGltZW91dDogcmV0dXJuIG9wZXJhdGlvbgorCQkgKiBzdGF0dXMuCisJCSAqLworCQlyZXR1cm4gcHJpdmF0ZS0+cmVzdWx0OworCisJLyogQ2xlYXIgYWxsIGludGVycnVwdHMganVzdCB0byBiZSBzdXJlLiAqLworCXJlZ21hcF9yZWFkKHByaXZhdGUtPnJlZ21hcCwgWlBBMjMyNl9JTlRfU09VUkNFX1JFRywgJnZhbCk7CisKKwlpZiAoIXJldCkKKwkJLyogVGltZWQgb3V0LiAqLworCQlyZXQgPSAtRVRJTUU7CisKKwlpZiAocmV0ICE9IC1FUkVTVEFSVFNZUykKKwkJenBhMjMyNl93YXJuKGluZGlvX2RldiwgIm5vIG9uZSBzaG90IGludGVycnVwdCBvY2N1cnJlZCAoJWQpIiwKKwkJCSAgICAgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgenBhMjMyNl9pbml0X21hbmFnZWRfaXJxKHN0cnVjdCBkZXZpY2UgICAgICAgICAgKnBhcmVudCwKKwkJCQkgICAgc3RydWN0IGlpb19kZXYgICAgICAgICAqaW5kaW9fZGV2LAorCQkJCSAgICBzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICpwcml2YXRlLAorCQkJCSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBpcnEpCit7CisJaW50IGVycjsKKworCXByaXZhdGUtPmlycSA9IGlycTsKKworCWlmIChpcnEgPD0gMCkgeworCQkvKgorCQkgKiBQbGF0Zm9ybSBkZWNsYXJlZCBubyBpbnRlcnJ1cHQgbGluZTogZGV2aWNlIHdpbGwgYmUgcG9sbGVkCisJCSAqIGZvciBkYXRhIGF2YWlsYWJpbGl0eS4KKwkJICovCisJCWRldl9pbmZvKHBhcmVudCwgIm5vIGludGVycnVwdCBmb3VuZCwgcnVubmluZyBpbiBwb2xsaW5nIG1vZGUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZwcml2YXRlLT5kYXRhX3JlYWR5KTsKKworCS8qIFJlcXVlc3QgaGFuZGxlciB0byBiZSBzY2hlZHVsZWQgaW50byB0aHJlYWRlZCBpbnRlcnJ1cHQgY29udGV4dC4gKi8KKwllcnIgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKHBhcmVudCwgaXJxLCB6cGEyMzI2X2hhbmRsZV9pcnEsCisJCQkJCXpwYTIzMjZfaGFuZGxlX3RocmVhZGVkX2lycSwKKwkJCQkJSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfT05FU0hPVCwKKwkJCQkJZGV2X25hbWUocGFyZW50KSwgaW5kaW9fZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIocGFyZW50LCAiZmFpbGVkIHRvIHJlcXVlc3QgaW50ZXJydXB0ICVkICglZCkiLCBpcnEsCisJCQllcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWRldl9pbmZvKHBhcmVudCwgInVzaW5nIGludGVycnVwdCAlZCIsIGlycSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6cGEyMzI2X3BvbGxfb25lc2hvdF9jb21wbGV0aW9uKCkgLSBBY3RpdmVseSBwb2xsIGZvciBvbmUgc2hvdCBkYXRhIHJlYWR5LgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqCisgKiBMb29wIG92ZXIgcmVnaXN0ZXJzIGNvbnRlbnQgdG8gZGV0ZWN0IGVuZCBvZiBzYW1wbGluZyBjeWNsZS4gVXNlZCB3aGVuIERUCisgKiBkZWNsYXJlZCBubyB2YWxpZCBpbnRlcnJ1cHQgbGluZXMuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB6cGEyMzI2X3BvbGxfb25lc2hvdF9jb21wbGV0aW9uKGNvbnN0IHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJdW5zaWduZWQgbG9uZyAgdG1vdXQgPSBqaWZmaWVzICsgWlBBMjMyNl9DT05WRVJTSU9OX0pJRkZJRVM7CisJc3RydWN0IHJlZ21hcCAqcmVncyA9ICgoc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqKQorCQkJICAgICAgIGlpb19wcml2KGluZGlvX2RldikpLT5yZWdtYXA7CisJdW5zaWduZWQgaW50ICAgdmFsOworCWludCAgICAgICAgICAgIGVycjsKKworCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgInBvbGxpbmcgZm9yIG9uZSBzaG90IGNvbXBsZXRpb24iKTsKKworCS8qCisJICogQXQgbGVhc3QsIDEwMCBtcyBpcyBuZWVkZWQgZm9yIHRoZSBkZXZpY2UgdG8gY29tcGxldGUgaXRzIG9uZS1zaG90CisJICogY3ljbGUuCisJICovCisJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwkvKiBQb2xsIGZvciBjb252ZXJzaW9uIGNvbXBsZXRpb24gaW4gaGFyZHdhcmUuICovCisJd2hpbGUgKHRydWUpIHsKKwkJZXJyID0gcmVnbWFwX3JlYWQocmVncywgWlBBMjMyNl9DVFJMX1JFRzBfUkVHLCAmdmFsKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycjsKKworCQlpZiAoISh2YWwgJiBaUEEyMzI2X0NUUkxfUkVHMF9PTkVfU0hPVCkpCisJCQkvKiBPbmUtc2hvdCBiaXQgc2VsZiBjbGVhcnMgYXQgY29udmVyc2lvbiBlbmQuICovCisJCQlicmVhazsKKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0bW91dCkpIHsKKwkJCS8qIFByZXZlbnQgZnJvbSB3YWl0aW5nIGZvcmV2ZXIgOiBsZXQncyB0aW1lIG91dC4gKi8KKwkJCWVyciA9IC1FVElNRTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJdXNsZWVwX3JhbmdlKDEwMDAwLCAyMDAwMCk7CisJfQorCisJLyoKKwkgKiBJbiBvbmVzaG90IG1vZGUsIHByZXNzdXJlIHNhbXBsZSBhdmFpbGFiaWxpdHkgZ3VhcmFudGVlcyB0aGF0CisJICogdGVtcGVyYXR1cmUgY29udmVyc2lvbiBoYXMgYWxzbyBjb21wbGV0ZWQgOiBqdXN0IGNoZWNrIHByZXNzdXJlCisJICogc3RhdHVzIGJpdCB0byBrZWVwIHRoaW5ncyBzaW1wbGUuCisJICovCisJZXJyID0gcmVnbWFwX3JlYWQocmVncywgWlBBMjMyNl9TVEFUVVNfUkVHLCAmdmFsKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnI7CisKKwlpZiAoISh2YWwgJiBaUEEyMzI2X1NUQVRVU19QX0RBKSkgeworCQkvKiBObyBzYW1wbGUgYXZhaWxhYmxlLiAqLworCQllcnIgPSAtRU5PREFUQTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIDA7CisKK2VycjoKKwl6cGEyMzI2X3dhcm4oaW5kaW9fZGV2LCAiZmFpbGVkIHRvIHBvbGwgb25lIHNob3QgY29tcGxldGlvbiAoJWQpIiwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogenBhMjMyNl9mZXRjaF9yYXdfc2FtcGxlKCkgLSBSZXRyaWV2ZSBhIHJhdyBzYW1wbGUgYW5kIGNvbnZlcnQgaXQgdG8gQ1BVCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZGlhbm5lc3MuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICogQHR5cGU6ICAgICAgVHlwZSBvZiBtZWFzdXJlbWVudCAvIGNoYW5uZWwgdG8gZmV0Y2ggZnJvbS4KKyAqIEB2YWx1ZTogICAgIFNhbXBsZSBvdXRwdXQuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB6cGEyMzI2X2ZldGNoX3Jhd19zYW1wbGUoY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgZW51bSBpaW9fY2hhbl90eXBlICAgIHR5cGUsCisJCQkJICAgIGludCAgICAgICAgICAgICAgICAgICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgcmVnbWFwICpyZWdzID0gKChzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICopCisJCQkgICAgICAgaWlvX3ByaXYoaW5kaW9fZGV2KSktPnJlZ21hcDsKKwlpbnQgICAgICAgICAgICBlcnI7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElJT19QUkVTU1VSRToKKwkJenBhMjMyNl9kYmcoaW5kaW9fZGV2LCAiZmV0Y2hpbmcgcmF3IHByZXNzdXJlIHNhbXBsZSIpOworCisJCWVyciA9IHJlZ21hcF9idWxrX3JlYWQocmVncywgWlBBMjMyNl9QUkVTU19PVVRfWExfUkVHLCB2YWx1ZSwKKwkJCQkgICAgICAgMyk7CisJCWlmIChlcnIpIHsKKwkJCXpwYTIzMjZfd2FybihpbmRpb19kZXYsICJmYWlsZWQgdG8gZmV0Y2ggcHJlc3N1cmUgKCVkKSIsCisJCQkJICAgICBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCS8qIFByZXNzdXJlIGlzIGEgMjQgYml0cyB3aWRlIGxpdHRsZS1lbmRpYW4gdW5zaWduZWQgaW50LiAqLworCQkqdmFsdWUgPSAoKCh1OCAqKXZhbHVlKVsyXSA8PCAxNikgfCAoKCh1OCAqKXZhbHVlKVsxXSA8PCA4KSB8CisJCQkgKCh1OCAqKXZhbHVlKVswXTsKKworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisKKwljYXNlIElJT19URU1QOgorCQl6cGEyMzI2X2RiZyhpbmRpb19kZXYsICJmZXRjaGluZyByYXcgdGVtcGVyYXR1cmUgc2FtcGxlIik7CisKKwkJZXJyID0gcmVnbWFwX2J1bGtfcmVhZChyZWdzLCBaUEEyMzI2X1RFTVBfT1VUX0xfUkVHLCB2YWx1ZSwgMik7CisJCWlmIChlcnIpIHsKKwkJCXpwYTIzMjZfd2FybihpbmRpb19kZXYsCisJCQkJICAgICAiZmFpbGVkIHRvIGZldGNoIHRlbXBlcmF0dXJlICglZCkiLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCS8qIFRlbXBlcmF0dXJlIGlzIGEgMTYgYml0cyB3aWRlIGxpdHRsZS1lbmRpYW4gc2lnbmVkIGludC4gKi8KKwkJKnZhbHVlID0gKGludClsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKXZhbHVlKTsKKworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKy8qKgorICogenBhMjMyNl9zYW1wbGVfb25lc2hvdCgpIC0gUGVyZm9ybSBhIGNvbXBsZXRlIG9uZSBzaG90IHNhbXBsaW5nIGN5Y2xlLgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqIEB0eXBlOiAgICAgIFR5cGUgb2YgbWVhc3VyZW1lbnQgLyBjaGFubmVsIHRvIGZldGNoIGZyb20uCisgKiBAdmFsdWU6ICAgICBTYW1wbGUgb3V0cHV0LgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9zYW1wbGVfb25lc2hvdChzdHJ1Y3QgaWlvX2RldiAgICAgKmluZGlvX2RldiwKKwkJCQkgIGVudW0gaWlvX2NoYW5fdHlwZSAgdHlwZSwKKwkJCQkgIGludCAgICAgICAgICAgICAgICAqdmFsdWUpCit7CisJaW50ICAgICAgICAgICAgICAgICAgICAgcmV0OworCXN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKnByaXY7CisKKwlyZXQgPSBpaW9fZGV2aWNlX2NsYWltX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHpwYTIzMjZfcmVzdW1lKGluZGlvX2Rldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gcmVsZWFzZTsKKworCXByaXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJaWYgKHJldCA+IDApIHsKKwkJLyoKKwkJICogV2Ugd2VyZSBhbHJlYWR5IHBvd2VyIHN1cHBsaWVkLiBKdXN0IGNsZWFyIGhhcmR3YXJlIEZJRk8gdG8KKwkJICogZ2V0IHJpZCBvZiBzYW1wbGVzIGFjcXVpcmVkIGR1cmluZyBwcmV2aW91cyByb3VuZHMgKGlmIGFueSkuCisJCSAqIFNhbXBsaW5nIG9wZXJhdGlvbiBhbHdheXMgZ2VuZXJhdGVzIGJvdGggdGVtcGVyYXR1cmUgYW5kCisJCSAqIHByZXNzdXJlIHNhbXBsZXMuIFRoZSBsYXR0ZXIgYXJlIGFsd2F5cyBlbnF1ZXVlZCBpbnRvCisJCSAqIGhhcmR3YXJlIEZJRk8uIFRoaXMgbWF5IGxlYWQgdG8gc2l0dWF0aW9ucyB3ZXJlIHByZXNzdXJlCisJCSAqIHNhbXBsZXMgc3RpbGwgc2l0IGludG8gRklGTyB3aGVuIHByZXZpb3VzIGN5Y2xlKHMpIGZldGNoZWQKKwkJICogdGVtcGVyYXR1cmUgZGF0YSBvbmx5LgorCQkgKiBIZW5jZSwgd2UgbmVlZCB0byBjbGVhciBoYXJkd2FyZSBGSUZPIGNvbnRlbnQgdG8gcHJldmVudCBmcm9tCisJCSAqIGdldHRpbmcgb3V0ZGF0ZWQgdmFsdWVzIGF0IHRoZSBlbmQgb2YgY3VycmVudCBjeWNsZS4KKwkJICovCisJCWlmICh0eXBlID09IElJT19QUkVTU1VSRSkgeworCQkJcmV0ID0genBhMjMyNl9jbGVhcl9maWZvKGluZGlvX2RldiwgMCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gc3VzcGVuZDsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlIGhhdmUganVzdCBiZWVuIHBvd2VyIHN1cHBsaWVkLCBpLmUuIGRldmljZSBpcyBpbiBkZWZhdWx0CisJCSAqICJvdXQgb2YgcmVzZXQiIHN0YXRlLCBtZWFuaW5nIHdlIG5lZWQgdG8gcmVjb25maWd1cmUgaXQKKwkJICogZW50aXJlbHkuCisJCSAqLworCQlyZXQgPSB6cGEyMzI2X2NvbmZpZ19vbmVzaG90KGluZGlvX2RldiwgcHJpdi0+aXJxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gc3VzcGVuZDsKKwl9CisKKwkvKiBTdGFydCBhIHNhbXBsaW5nIGN5Y2xlIGluIG9uZXNob3QgbW9kZS4gKi8KKwlyZXQgPSB6cGEyMzI2X3N0YXJ0X29uZXNob3QoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIHN1c3BlbmQ7CisKKwkvKiBXYWl0IGZvciBzYW1wbGluZyBjeWNsZSB0byBjb21wbGV0ZS4gKi8KKwlpZiAocHJpdi0+aXJxID4gMCkKKwkJcmV0ID0genBhMjMyNl93YWl0X29uZXNob3RfY29tcGxldGlvbihpbmRpb19kZXYsIHByaXYpOworCWVsc2UKKwkJcmV0ID0genBhMjMyNl9wb2xsX29uZXNob3RfY29tcGxldGlvbihpbmRpb19kZXYpOworCisJaWYgKHJldCkKKwkJZ290byBzdXNwZW5kOworCisJLyogUmV0cmlldmUgcmF3IHNhbXBsZSB2YWx1ZSBhbmQgY29udmVydCBpdCB0byBDUFUgZW5kaWFubmVzcy4gKi8KKwlyZXQgPSB6cGEyMzI2X2ZldGNoX3Jhd19zYW1wbGUoaW5kaW9fZGV2LCB0eXBlLCB2YWx1ZSk7CisKK3N1c3BlbmQ6CisJenBhMjMyNl9zdXNwZW5kKGluZGlvX2Rldik7CityZWxlYXNlOgorCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB6cGEyMzI2X3RyaWdnZXJfaGFuZGxlcigpIC0gUGVyZm9ybSBhbiBJSU8gYnVmZmVyZWQgc2FtcGxpbmcgcm91bmQgaW4gb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdCBtb2RlLgorICogQGlycTogIFRoZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgYXNzaWduZWQgdG8gQGRhdGEKKyAqIEBkYXRhOiBUaGUgSUlPIHBvbGwgZnVuY3Rpb24gZGlzcGF0Y2hlZCBieSBleHRlcm5hbCB0cmlnZ2VyIG91ciBkZXZpY2UgaXMKKyAqICAgICAgICBhdHRhY2hlZCB0by4KKyAqCisgKiBCb3R0b20taGFsZiBoYW5kbGVyIGNhbGxlZCBieSB0aGUgSUlPIHRyaWdnZXIgdG8gd2hpY2ggb3VyIGRldmljZSBpcworICogY3VycmVudGx5IGF0dGFjaGVkLiBBbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhpcyBkZXZpY2UgYnVmZmVyZWQgc2FtcGxpbmcKKyAqIGVpdGhlciB3aXRoIGV4dGVybmFsIGV2ZW50cyAoc3VjaCBhcyB0aW1lciBleHBpcmF0aW9uLCBleHRlcm5hbCBkZXZpY2Ugc2FtcGxlCisgKiByZWFkeSwgZXRjLi4uKSBvciB3aXRoIGl0cyBvd24gaW50ZXJydXB0IChpbnRlcm5hbCBoYXJkd2FyZSB0cmlnZ2VyKS4KKyAqCisgKiBXaGVuIHVzaW5nIGFuIGV4dGVybmFsIHRyaWdnZXIsIGJhc2ljYWxseSBydW4gdGhlIHNhbWUgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucworICogYXMgZm9yIHpwYTIzMjZfc2FtcGxlX29uZXNob3QoKSB3aXRoIHRoZSBmb2xsb3dpbmcgaGVyZWFmdGVyLiBIYXJkd2FyZSBGSUZPCisgKiBpcyBub3QgY2xlYXJlZCBzaW5jZSBhbHJlYWR5IGRvbmUgYXQgYnVmZmVyaW5nIGVuYWJsZSB0aW1lIGFuZCBzYW1wbGVzCisgKiBkZXF1ZXVlaW5nIGFsd2F5cyByZXRyaWV2ZXMgdGhlIG1vc3QgcmVjZW50IHZhbHVlLgorICoKKyAqIE90aGVyd2lzZSwgd2hlbiBpbnRlcm5hbCBoYXJkd2FyZSB0cmlnZ2VyIGhhcyBkaXNwYXRjaGVkIHVzLCBqdXN0IGZldGNoIGRhdGEKKyAqIGZyb20gaGFyZHdhcmUgRklGTy4KKyAqCisgKiBGZXRjaGVkIGRhdGEgd2lsbCBwdXNoZWQgdW5wcm9jZXNzZWQgdG8gSUlPIGJ1ZmZlciBzaW5jZSBzYW1wbGVzIGNvbnZlcnNpb24KKyAqIGlzIGRlbGVnYXRlZCB0byB1c2Vyc3BhY2UgaW4gYnVmZmVyZWQgbW9kZSAoZW5kaWFubmVzcywgZXRjLi4uKS4KKyAqCisgKiBSZXR1cm46CisgKiAgICVJUlFfTk9ORSAtIG5vIGNvbnNpc3RlbnQgaW50ZXJydXB0IGhhcHBlbmVkIDsKKyAqICAgJUlSUV9IQU5ETEVEIC0gdGhlcmUgd2FzIG5ldyBzYW1wbGVzIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIGlycXJldHVybl90IHpwYTIzMjZfdHJpZ2dlcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlpb19kZXYgICAgICAgICAqaW5kaW9fZGV2ID0gKChzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqKQorCQkJCQkgICAgIGRhdGEpLT5pbmRpb19kZXY7CisJc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqcHJpdiA9IGlpb19wcml2KGluZGlvX2Rldik7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgY29udDsKKworCS8qCisJICogV2UgaGF2ZSBiZWVuIGRpc3BhdGNoZWQsIG1lYW5pbmcgd2UgYXJlIGluIHRyaWdnZXJlZCBidWZmZXIgbW9kZS4KKwkgKiBVc2luZyBvdXIgb3duIGludGVybmFsIHRyaWdnZXIgaW1wbGllcyB3ZSBhcmUgY3VycmVudGx5IGluIGNvbnRpbnVvdXMKKwkgKiBoYXJkd2FyZSBzYW1wbGluZyBtb2RlLgorCSAqLworCWNvbnQgPSBpaW9fdHJpZ2dlcl91c2luZ19vd24oaW5kaW9fZGV2KTsKKworCWlmICghY29udCkgeworCQkvKiBPbiBkZW1hbmQgc2FtcGxpbmcgOiBzdGFydCBhIG9uZSBzaG90IGN5Y2xlLiAqLworCQlpZiAoenBhMjMyNl9zdGFydF9vbmVzaG90KGluZGlvX2RldikpCisJCQlnb3RvIG91dDsKKworCQkvKiBXYWl0IGZvciBzYW1wbGluZyBjeWNsZSB0byBjb21wbGV0ZS4gKi8KKwkJaWYgKHByaXYtPmlycSA8PSAwKSB7CisJCQkvKiBObyBpbnRlcnJ1cHQgYXZhaWxhYmxlOiBwb2xsIGZvciBjb21wbGV0aW9uLiAqLworCQkJaWYgKHpwYTIzMjZfcG9sbF9vbmVzaG90X2NvbXBsZXRpb24oaW5kaW9fZGV2KSkKKwkJCQlnb3RvIG91dDsKKworCQkJLyogT25seSB0aW1lc3RhbXAgc2FtcGxlIG9uY2UgaXQgaXMgcmVhZHkuICovCisJCQlwcml2LT50aW1lc3RhbXAgPSBpaW9fZ2V0X3RpbWVfbnMoaW5kaW9fZGV2KTsKKwkJfSBlbHNlIHsKKwkJCS8qIEludGVycnVwdCBoYW5kbGVycyB3aWxsIHRpbWVzdGFtcCBmb3IgdXMuICovCisJCQlpZiAoenBhMjMyNl93YWl0X29uZXNob3RfY29tcGxldGlvbihpbmRpb19kZXYsIHByaXYpKQorCQkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogRW5xdWV1ZSB0byBJSU8gYnVmZmVyIC8gdXNlcnNwYWNlLiAqLworCXpwYTIzMjZfZmlsbF9zYW1wbGVfYnVmZmVyKGluZGlvX2RldiwgcHJpdik7CisKK291dDoKKwlpZiAoIWNvbnQpCisJCS8qIERvbid0IHN3aXRjaCB0byBsb3cgcG93ZXIgaWYgc2FtcGxpbmcgY29udGludW91c2x5LiAqLworCQl6cGEyMzI2X3NsZWVwKGluZGlvX2Rldik7CisKKwkvKiBJbmZvcm0gYXR0YWNoZWQgdHJpZ2dlciB3ZSBhcmUgZG9uZS4gKi8KKwlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShpbmRpb19kZXYtPnRyaWcpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIHpwYTIzMjZfcHJlZW5hYmxlX2J1ZmZlcigpIC0gUHJlcGFyZSBkZXZpY2UgZm9yIGNvbmZpZ3VyaW5nIHRyaWdnZXJlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZworICogbW9kZXMuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICoKKyAqIEJhc2ljYWxseSBwb3dlciB1cCBkZXZpY2UuCisgKiBDYWxsZWQgd2l0aCBJSU8gZGV2aWNlJ3MgbG9jayBoZWxkLgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9wcmVlbmFibGVfYnVmZmVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJaW50IHJldCA9IHpwYTIzMjZfcmVzdW1lKGluZGlvX2Rldik7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFRlbGwgenBhMjMyNl9wb3N0ZW5hYmxlX2J1ZmZlcigpIGlmIHdlIGhhdmUganVzdCBiZWVuIHBvd2VyZWQgb24uICovCisJKChzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICopCisJIGlpb19wcml2KGluZGlvX2RldikpLT53YWtlbiA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6cGEyMzI2X3Bvc3RlbmFibGVfYnVmZmVyKCkgLSBDb25maWd1cmUgZGV2aWNlIGZvciB0cmlnZ2VyZWQgc2FtcGxpbmcuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICoKKyAqIEJhc2ljYWxseSBzZXR1cCBvbmUtc2hvdCBtb2RlIGlmIHBsdWdnaW5nIGV4dGVybmFsIHRyaWdnZXIuCisgKiBPdGhlcndpc2UsIGxldCBpbnRlcm5hbCB0cmlnZ2VyIGNvbmZpZ3VyZSBjb250aW51b3VzIHNhbXBsaW5nIDoKKyAqIHNlZSB6cGEyMzI2X3NldF90cmlnZ2VyX3N0YXRlKCkuCisgKgorICogSWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQsIElJTyBsYXllciB3aWxsIGNhbGwgb3VyIHBvc3RkaXNhYmxlIGhvb2sgZm9yIHVzLAorICogaS5lLiBubyBuZWVkIHRvIGV4cGxpY2l0bHkgcG93ZXIgZGV2aWNlIG9mZiBoZXJlLgorICogQ2FsbGVkIHdpdGggSUlPIGRldmljZSdzIGxvY2sgaGVsZC4KKyAqCisgKiBDYWxsZWQgd2l0aCBJSU8gZGV2aWNlJ3MgbG9jayBoZWxkLgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9wb3N0ZW5hYmxlX2J1ZmZlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWNvbnN0IHN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKnByaXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycjsKKworCWlmICghcHJpdi0+d2FrZW4pIHsKKwkJLyoKKwkJICogV2Ugd2VyZSBhbHJlYWR5IHBvd2VyIHN1cHBsaWVkLiBKdXN0IGNsZWFyIGhhcmR3YXJlIEZJRk8gdG8KKwkJICogZ2V0IHJpZCBvZiBzYW1wbGVzIGFjcXVpcmVkIGR1cmluZyBwcmV2aW91cyByb3VuZHMgKGlmIGFueSkuCisJCSAqLworCQllcnIgPSB6cGEyMzI2X2NsZWFyX2ZpZm8oaW5kaW9fZGV2LCAwKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyOworCX0KKworCWlmICghaWlvX3RyaWdnZXJfdXNpbmdfb3duKGluZGlvX2RldikgJiYgcHJpdi0+d2FrZW4pIHsKKwkJLyoKKwkJICogV2UgYXJlIHVzaW5nIGFuIGV4dGVybmFsIHRyaWdnZXIgYW5kIHdlIGhhdmUganVzdCBiZWVuCisJCSAqIHBvd2VyZWQgdXA6IHJlY29uZmlndXJlIG9uZS1zaG90IG1vZGUuCisJCSAqLworCQllcnIgPSB6cGEyMzI2X2NvbmZpZ19vbmVzaG90KGluZGlvX2RldiwgcHJpdi0+aXJxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyOworCX0KKworCS8qIFBsdWcgb3VyIG93biB0cmlnZ2VyIGV2ZW50IGhhbmRsZXIuICovCisJZXJyID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZShpbmRpb19kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CisKK2VycjoKKwl6cGEyMzI2X2VycihpbmRpb19kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGJ1ZmZlcmluZyAoJWQpIiwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgenBhMjMyNl9wb3N0ZGlzYWJsZV9idWZmZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwl6cGEyMzI2X3N1c3BlbmQoaW5kaW9fZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19idWZmZXJfc2V0dXBfb3BzIHpwYTIzMjZfYnVmZmVyX3NldHVwX29wcyA9IHsKKwkucHJlZW5hYmxlICAgPSB6cGEyMzI2X3ByZWVuYWJsZV9idWZmZXIsCisJLnBvc3RlbmFibGUgID0genBhMjMyNl9wb3N0ZW5hYmxlX2J1ZmZlciwKKwkucHJlZGlzYWJsZSAgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlLAorCS5wb3N0ZGlzYWJsZSA9IHpwYTIzMjZfcG9zdGRpc2FibGVfYnVmZmVyCit9OworCisvKioKKyAqIHpwYTIzMjZfc2V0X3RyaWdnZXJfc3RhdGUoKSAtIFN0YXJ0IC8gc3RvcCBjb250aW51b3VzIHNhbXBsaW5nLgorICogQHRyaWc6ICBUaGUgdHJpZ2dlciBiZWluZyBhdHRhY2hlZCB0byBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxpbmcKKyAqICAgICAgICAgaGFyZHdhcmUuCisgKiBAc3RhdGU6IFRlbGwgd2hldGhlciB0byBzdGFydCAodHJ1ZSkgb3Igc3RvcCAoZmFsc2UpCisgKgorICogQmFzaWNhbGx5IGVuYWJsZSAvIGRpc2FibGUgaGFyZHdhcmUgY29udGludW91cyBzYW1wbGluZyBtb2RlLgorICoKKyAqIENhbGxlZCB3aXRoIElJTyBkZXZpY2UncyBsb2NrIGhlbGQgYXQgcG9zdGVuYWJsZSgpIG9yIHByZWRpc2FibGUoKSB0aW1lLgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9zZXRfdHJpZ2dlcl9zdGF0ZShzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcsIGJvb2wgc3RhdGUpCit7CisJY29uc3Qgc3RydWN0IGlpb19kZXYgICAgICAgICAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKAorCQkJCQkJCXRyaWctPmRldi5wYXJlbnQpOworCWNvbnN0IHN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKnByaXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycjsKKworCWlmICghc3RhdGUpIHsKKwkJLyoKKwkJICogU3dpdGNoIHRyaWdnZXIgb2ZmIDogaW4gY2FzZSBvZiBmYWlsdXJlLCBpbnRlcnJ1cHQgaXMgbGVmdAorCQkgKiBkaXNhYmxlZCBpbiBvcmRlciB0byBwcmV2ZW50IGhhbmRsZXIgZnJvbSBhY2Nlc3NpbmcgcmVsZWFzZWQKKwkJICogcmVzb3VyY2VzLgorCQkgKi8KKwkJdW5zaWduZWQgaW50IHZhbDsKKworCQkvKgorCQkgKiBBcyBkZXZpY2UgaXMgd29ya2luZyBpbiBjb250aW51b3VzIG1vZGUsIGhhbmRsZXJzIG1heSBiZQorCQkgKiBhY2Nlc3NpbmcgcmVzb3VyY2VzIHdlIGFyZSBjdXJyZW50bHkgZnJlZWluZy4uLgorCQkgKiBQcmV2ZW50IHRoaXMgYnkgZGlzYWJsaW5nIGludGVycnVwdCBoYW5kbGVycyBhbmQgZW5zdXJlCisJCSAqIHRoZSBkZXZpY2Ugd2lsbCBnZW5lcmF0ZSBubyBtb3JlIGludGVycnVwdHMgdW5sZXNzIGV4cGxpY2l0bHkKKwkJICogcmVxdWlyZWQgdG8sIGkuZS4gYnkgcmVzdG9yaW5nIGJhY2sgdG8gZGVmYXVsdCBvbmUgc2hvdCBtb2RlLgorCQkgKi8KKwkJZGlzYWJsZV9pcnEocHJpdi0+aXJxKTsKKworCQkvKgorCQkgKiBEaXNhYmxlIGNvbnRpbnVvdXMgc2FtcGxpbmcgbW9kZSB0byByZXN0b3JlIHNldHRpbmdzIGZvcgorCQkgKiBvbmUgc2hvdCAvIGRpcmVjdCBzYW1wbGluZyBvcGVyYXRpb25zLgorCQkgKi8KKwkJZXJyID0gcmVnbWFwX3dyaXRlKHByaXYtPnJlZ21hcCwgWlBBMjMyNl9DVFJMX1JFRzNfUkVHLAorCQkJCSAgIHpwYTIzMjZfaGlnaGVzdF9mcmVxdWVuY3koKS0+b2RyKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJLyoKKwkJICogTm93IHRoYXQgZGV2aWNlIHdvbid0IGdlbmVyYXRlIGludGVycnVwdHMgb24gaXRzIG93biwKKwkJICogYWNrbm93bGVkZ2UgYW55IGN1cnJlbnRseSBhY3RpdmUgaW50ZXJydXB0cyAobWF5IGhhcHBlbiBvbgorCQkgKiByYXJlIG9jY2FzaW9ucyB3aGlsZSBzdG9wcGluZyBjb250aW51b3VzIG1vZGUpLgorCQkgKi8KKwkJZXJyID0gcmVnbWFwX3JlYWQocHJpdi0+cmVnbWFwLCBaUEEyMzI2X0lOVF9TT1VSQ0VfUkVHLCAmdmFsKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCisJCS8qCisJCSAqIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIG9ubHkgaWYgd2UgY2FuIGd1YXJhbnRlZSB0aGUgZGV2aWNlIHdpbGwKKwkJICogZ2VuZXJhdGUgbm8gbW9yZSBpbnRlcnJ1cHRzIHRvIHByZXZlbnQgaGFuZGxlcnMgZnJvbQorCQkgKiBhY2Nlc3NpbmcgcmVsZWFzZWQgcmVzb3VyY2VzLgorCQkgKi8KKwkJZW5hYmxlX2lycShwcml2LT5pcnEpOworCisJCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgImNvbnRpbnVvdXMgbW9kZSBzdG9wcGVkIik7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU3dpdGNoIHRyaWdnZXIgb24gOiBzdGFydCBjb250aW51b3VzIHNhbXBsaW5nIGF0IHJlcXVpcmVkCisJCSAqIGZyZXF1ZW5jeS4KKwkJICovCisKKwkJaWYgKHByaXYtPndha2VuKSB7CisJCQkvKiBFbmFibGUgaW50ZXJydXB0IGlmIGdldHRpbmcgb3V0IG9mIHJlc2V0LiAqLworCQkJZXJyID0gcmVnbWFwX3dyaXRlKHByaXYtPnJlZ21hcCwgWlBBMjMyNl9DVFJMX1JFRzFfUkVHLAorCQkJCQkgICAodTgpCisJCQkJCSAgIH5aUEEyMzI2X0NUUkxfUkVHMV9NQVNLX0RBVEFfUkVBRFkpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJLyogRW5hYmxlIGNvbnRpbnVvdXMgc2FtcGxpbmcgYXQgc3BlY2lmaWVkIGZyZXF1ZW5jeS4gKi8KKwkJZXJyID0gcmVnbWFwX3dyaXRlKHByaXYtPnJlZ21hcCwgWlBBMjMyNl9DVFJMX1JFRzNfUkVHLAorCQkJCSAgIFpQQTIzMjZfQ1RSTF9SRUczX0VOQUJMRV9NRUFTIHwKKwkJCQkgICBwcml2LT5mcmVxdWVuY3ktPm9kcik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgImNvbnRpbnVvdXMgbW9kZSBzZXR1cCBAJWRIeiIsCisJCQkgICAgcHJpdi0+ZnJlcXVlbmN5LT5oeik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3RyaWdnZXJfb3BzIHpwYTIzMjZfdHJpZ2dlcl9vcHMgPSB7CisJLm93bmVyICAgICAgICAgICAgID0gVEhJU19NT0RVTEUsCisJLnNldF90cmlnZ2VyX3N0YXRlID0genBhMjMyNl9zZXRfdHJpZ2dlcl9zdGF0ZSwKK307CisKKy8qKgorICogenBhMjMyNl9pbml0X3RyaWdnZXIoKSAtIENyZWF0ZSBhbiBpbnRlcnJ1cHQgZHJpdmVuIC8gaGFyZHdhcmUgdHJpZ2dlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93aW5nIHRvIG5vdGlmeSBleHRlcm5hbCBkZXZpY2VzIGEgbmV3IHNhbXBsZSBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5LgorICogQHBhcmVudDogICAgSGFyZHdhcmUgc2FtcGxpbmcgZGV2aWNlIEBpbmRpb19kZXYgaXMgYSBjaGlsZCBvZi4KKyAqIEBpbmRpb19kZXY6IFRoZSBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxpbmcgaGFyZHdhcmUuCisgKiBAcHJpdmF0ZTogICBJbnRlcm5hbCBwcml2YXRlIHN0YXRlIHJlbGF0ZWQgdG8gQGluZGlvX2Rldi4KKyAqIEBpcnE6ICAgICAgIE9wdGlvbmFsIGludGVycnVwdCBsaW5lIHRoZSBoYXJkd2FyZSB1c2VzIHRvIG5vdGlmeSBuZXcgZGF0YQorICogICAgICAgICAgICAgc2FtcGxlcyBhcmUgcmVhZHkuIE5lZ2F0aXZlIG9yIHplcm8gdmFsdWVzIGluZGljYXRlIG5vIGludGVycnVwdHMKKyAqICAgICAgICAgICAgIGFyZSBhdmFpbGFibGUsIG1lYW5pbmcgcG9sbGluZyBpcyByZXF1aXJlZC4KKyAqCisgKiBPbmx5IHJlbGV2YW50IHdoZW4gRFQgZGVjbGFyZXMgYSB2YWxpZCBpbnRlcnJ1cHQgbGluZS4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHpwYTIzMjZfaW5pdF9tYW5hZ2VkX3RyaWdnZXIoc3RydWN0IGRldmljZSAgICAgICAgICAqcGFyZW50LAorCQkJCQlzdHJ1Y3QgaWlvX2RldiAgICAgICAgICppbmRpb19kZXYsCisJCQkJCXN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKnByaXZhdGUsCisJCQkJCWludCAgICAgICAgICAgICAgICAgICAgIGlycSkKK3sKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWdnZXI7CisJaW50ICAgICAgICAgICAgICAgICByZXQ7CisKKwlpZiAoaXJxIDw9IDApCisJCXJldHVybiAwOworCisJdHJpZ2dlciA9IGRldm1faWlvX3RyaWdnZXJfYWxsb2MocGFyZW50LCAiJXMtZGV2JWQiLAorCQkJCQkgaW5kaW9fZGV2LT5uYW1lLCBpbmRpb19kZXYtPmlkKTsKKwlpZiAoIXRyaWdnZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogQmFzaWMgc2V0dXAuICovCisJdHJpZ2dlci0+ZGV2LnBhcmVudCA9IHBhcmVudDsKKwl0cmlnZ2VyLT5vcHMgPSAmenBhMjMyNl90cmlnZ2VyX29wczsKKworCXByaXZhdGUtPnRyaWdnZXIgPSB0cmlnZ2VyOworCisJLyogUmVnaXN0ZXIgdG8gdHJpZ2dlcnMgc3BhY2UuICovCisJcmV0ID0gZGV2bV9paW9fdHJpZ2dlcl9yZWdpc3RlcihwYXJlbnQsIHRyaWdnZXIpOworCWlmIChyZXQpCisJCWRldl9lcnIocGFyZW50LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGhhcmR3YXJlIHRyaWdnZXIgKCVkKSIsCisJCQlyZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB6cGEyMzI2X2dldF9mcmVxdWVuY3koY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gKChzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICopaWlvX3ByaXYoaW5kaW9fZGV2KSktPmZyZXF1ZW5jeS0+aHo7Cit9CisKK3N0YXRpYyBpbnQgenBhMjMyNl9zZXRfZnJlcXVlbmN5KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGludCBoeikKK3sKKwlzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICpwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBmcmVxOworCWludCAgICAgICAgICAgICAgICAgICAgIGVycjsKKworCS8qIENoZWNrIGlmIHJlcXVlc3RlZCBmcmVxdWVuY3kgaXMgc3VwcG9ydGVkLiAqLworCWZvciAoZnJlcSA9IDA7IGZyZXEgPCBBUlJBWV9TSVpFKHpwYTIzMjZfc2FtcGxpbmdfZnJlcXVlbmNpZXMpOyBmcmVxKyspCisJCWlmICh6cGEyMzI2X3NhbXBsaW5nX2ZyZXF1ZW5jaWVzW2ZyZXFdLmh6ID09IGh6KQorCQkJYnJlYWs7CisJaWYgKGZyZXEgPT0gQVJSQVlfU0laRSh6cGEyMzI2X3NhbXBsaW5nX2ZyZXF1ZW5jaWVzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBEb24ndCBhbGxvdyBjaGFuZ2luZyBmcmVxdWVuY3kgaWYgYnVmZmVyZWQgc2FtcGxpbmcgaXMgb25nb2luZy4gKi8KKwllcnIgPSBpaW9fZGV2aWNlX2NsYWltX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXByaXYtPmZyZXF1ZW5jeSA9ICZ6cGEyMzI2X3NhbXBsaW5nX2ZyZXF1ZW5jaWVzW2ZyZXFdOworCisJaWlvX2RldmljZV9yZWxlYXNlX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworLyogRXhwb3NlIHN1cHBvcnRlZCBoYXJkd2FyZSBzYW1wbGluZyBmcmVxdWVuY2llcyAoSHopIHRocm91Z2ggc3lzZnMuICovCitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0FNUF9GUkVRX0FWQUlMKCIxIDUgMTEgMjMiKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnpwYTIzMjZfYXR0cmlidXRlc1tdID0geworCSZpaW9fY29uc3RfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgenBhMjMyNl9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0genBhMjMyNl9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCB6cGEyMzI2X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICAgICAgICAgICAgICppbmRpb19kZXYsCisJCQkgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgKnZhbCwKKwkJCSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAqdmFsMiwKKwkJCSAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykKK3sKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlyZXR1cm4genBhMjMyNl9zYW1wbGVfb25lc2hvdChpbmRpb19kZXYsIGNoYW4tPnR5cGUsIHZhbCk7CisKKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19QUkVTU1VSRToKKwkJCS8qCisJCQkgKiBQcmVzc3VyZSByZXNvbHV0aW9uIGlzIDEvNjQgUGFzY2FsLiBTY2FsZSB0byBrUGFzY2FsCisJCQkgKiBhcyByZXF1aXJlZCBieSBJSU8gQUJJLgorCQkJICovCisJCQkqdmFsID0gMTsKKwkJCSp2YWwyID0gNjQwMDA7CisJCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMOworCisJCWNhc2UgSUlPX1RFTVA6CisJCQkvKgorCQkJICogVGVtcGVyYXR1cmUgZm9sbG93cyB0aGUgZXF1YXRpb246CisJCQkgKiAgICAgVGVtcFtkZWdDXSA9IFRlbXBjb2RlICogMC4wMDY0OSAtIDE3Ni44MworCQkJICogd2hlcmU6CisJCQkgKiAgICAgVGVtcGNvZGUgaXMgY29tcG9zZWQgdGhlIHJhdyBzYW1wbGVkIDE2IGJpdHMuCisJCQkgKgorCQkJICogSGVuY2UsIHRvIHByb2R1Y2UgYSB0ZW1wZXJhdHVyZSBpbiBtaWxsaS1kZWdyZWVzCisJCQkgKiBDZWxzaXVzIGFjY29yZGluZyB0byBJSU8gQUJJLCB3ZSBuZWVkIHRvIGFwcGx5IHRoZQorCQkJICogZm9sbG93aW5nIGVxdWF0aW9uIHRvIHJhdyBzYW1wbGVzOgorCQkJICogICAgIFRlbXBbbWlsbGkgZGVnQ10gPSAoVGVtcGNvZGUgKyBPZmZzZXQpICogU2NhbGUKKwkJCSAqIHdoZXJlOgorCQkJICogICAgIE9mZnNldCA9IC0xNzYuODMgLyAwLjAwNjQ5CisJCQkgKiAgICAgU2NhbGUgPSAwLjAwNjQ5ICogMTAwMAorCQkJICovCisJCQkqdmFsID0gNjsKKwkJCSp2YWwyID0gNDkwMDAwOworCQkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwljYXNlIElJT19DSEFOX0lORk9fT0ZGU0VUOgorCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fVEVNUDoKKwkJCSp2YWwgPSAtMTc2ODMwMDA7CisJCQkqdmFsMiA9IDY0OTsKKwkJCXJldHVybiBJSU9fVkFMX0ZSQUNUSU9OQUw7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwljYXNlIElJT19DSEFOX0lORk9fU0FNUF9GUkVROgorCQkqdmFsID0genBhMjMyNl9nZXRfZnJlcXVlbmN5KGluZGlvX2Rldik7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCB6cGEyMzI2X3dyaXRlX3JhdyhzdHJ1Y3QgaWlvX2RldiAgICAgICAgICAgICAqaW5kaW9fZGV2LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwKKwkJCSAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwKKwkJCSAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHZhbDIsCisJCQkgICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgICBtYXNrKQoreworCWlmICgobWFzayAhPSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUSkgfHwgdmFsMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4genBhMjMyNl9zZXRfZnJlcXVlbmN5KGluZGlvX2RldiwgdmFsKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHpwYTIzMjZfY2hhbm5lbHNbXSA9IHsKKwlbMF0gPSB7CisJCS50eXBlICAgICAgICAgICAgICAgICAgICA9IElJT19QUkVTU1VSRSwKKwkJLnNjYW5faW5kZXggICAgICAgICAgICAgID0gMCwKKwkJLnNjYW5fdHlwZSAgICAgICAgICAgICAgID0geworCQkJLnNpZ24gICAgICAgICAgICAgICAgICAgPSAndScsCisJCQkucmVhbGJpdHMgICAgICAgICAgICAgICA9IDI0LAorCQkJLnN0b3JhZ2ViaXRzICAgICAgICAgICAgPSAzMiwKKwkJCS5lbmRpYW5uZXNzICAgICAgICAgICAgID0gSUlPX0xFLAorCQl9LAorCQkuaW5mb19tYXNrX3NlcGFyYXRlICAgICAgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwKKwkJCQkJICAgQklUKElJT19DSEFOX0lORk9fU0NBTEUpLAorCQkuaW5mb19tYXNrX3NoYXJlZF9ieV9hbGwgPSBCSVQoSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEpLAorCX0sCisJWzFdID0geworCQkudHlwZSAgICAgICAgICAgICAgICAgICAgPSBJSU9fVEVNUCwKKwkJLnNjYW5faW5kZXggICAgICAgICAgICAgID0gMSwKKwkJLnNjYW5fdHlwZSAgICAgICAgICAgICAgID0geworCQkJLnNpZ24gICAgICAgICAgICAgICAgICAgPSAncycsCisJCQkucmVhbGJpdHMgICAgICAgICAgICAgICA9IDE2LAorCQkJLnN0b3JhZ2ViaXRzICAgICAgICAgICAgPSAxNiwKKwkJCS5lbmRpYW5uZXNzICAgICAgICAgICAgID0gSUlPX0xFLAorCQl9LAorCQkuaW5mb19tYXNrX3NlcGFyYXRlICAgICAgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwKKwkJCQkJICAgQklUKElJT19DSEFOX0lORk9fU0NBTEUpIHwKKwkJCQkJICAgQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSwKKwkJLmluZm9fbWFza19zaGFyZWRfYnlfYWxsID0gQklUKElJT19DSEFOX0lORk9fU0FNUF9GUkVRKSwKKwl9LAorCVsyXSA9IElJT19DSEFOX1NPRlRfVElNRVNUQU1QKDIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyB6cGEyMzI2X2luZm8gPSB7CisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkuYXR0cnMgICAgICAgICA9ICZ6cGEyMzI2X2F0dHJpYnV0ZV9ncm91cCwKKwkucmVhZF9yYXcgICAgICA9IHpwYTIzMjZfcmVhZF9yYXcsCisJLndyaXRlX3JhdyAgICAgPSB6cGEyMzI2X3dyaXRlX3JhdywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWlvX2RldiAqenBhMjMyNl9jcmVhdGVfbWFuYWdlZF9paW9kZXYoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJCQkJICAgICBjb25zdCBjaGFyICAgICpuYW1lLAorCQkJCQkJICAgICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKworCS8qIEFsbG9jYXRlIHNwYWNlIHRvIGhvbGQgSUlPIGRldmljZSBpbnRlcm5hbCBzdGF0ZS4gKi8KKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoZGV2aWNlLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgenBhMjMyNl9wcml2YXRlKSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiBOVUxMOworCisJLyogU2V0dXAgZm9yIHVzZXJzcGFjZSBzeW5jaHJvbm91cyBvbiBkZW1hbmQgc2FtcGxpbmcuICovCisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9IGRldmljZTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0genBhMjMyNl9jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoenBhMjMyNl9jaGFubmVscyk7CisJaW5kaW9fZGV2LT5uYW1lID0gbmFtZTsKKwlpbmRpb19kZXYtPmluZm8gPSAmenBhMjMyNl9pbmZvOworCisJcmV0dXJuIGluZGlvX2RldjsKK30KKworaW50IHpwYTIzMjZfcHJvYmUoc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkgIGNvbnN0IGNoYXIgICAgKm5hbWUsCisJCSAgaW50ICAgICAgICAgICAgaXJxLAorCQkgIHVuc2lnbmVkIGludCAgIGh3aWQsCisJCSAgc3RydWN0IHJlZ21hcCAqcmVnbWFwKQoreworCXN0cnVjdCBpaW9fZGV2ICAgICAgICAgKmluZGlvX2RldjsKKwlzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICpwcml2OworCWludCAgICAgICAgICAgICAgICAgICAgIGVycjsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBpZDsKKworCWluZGlvX2RldiA9IHpwYTIzMjZfY3JlYXRlX21hbmFnZWRfaWlvZGV2KHBhcmVudCwgbmFtZSwgcmVnbWFwKTsKKwlpZiAoIWluZGlvX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXByaXYtPnZyZWYgPSBkZXZtX3JlZ3VsYXRvcl9nZXQocGFyZW50LCAidnJlZiIpOworCWlmIChJU19FUlIocHJpdi0+dnJlZikpCisJCXJldHVybiBQVFJfRVJSKHByaXYtPnZyZWYpOworCisJcHJpdi0+dmRkID0gZGV2bV9yZWd1bGF0b3JfZ2V0KHBhcmVudCwgInZkZCIpOworCWlmIChJU19FUlIocHJpdi0+dmRkKSkKKwkJcmV0dXJuIFBUUl9FUlIocHJpdi0+dmRkKTsKKworCS8qIFNldCBkZWZhdWx0IGhhcmR3YXJlIHNhbXBsaW5nIGZyZXF1ZW5jeSB0byBoaWdoZXN0IHJhdGUgc3VwcG9ydGVkLiAqLworCXByaXYtPmZyZXF1ZW5jeSA9IHpwYTIzMjZfaGlnaGVzdF9mcmVxdWVuY3koKTsKKworCS8qCisJICogUGx1ZyBkZXZpY2UncyB1bmRlcmx5aW5nIGJ1cyBhYnN0cmFjdGlvbiA6IHRoaXMgTVVTVCBiZSBzZXQgYmVmb3JlCisJICogcmVnaXN0ZXJpbmcgaW50ZXJydXB0IGhhbmRsZXJzIHNpbmNlIGFuIGludGVycnVwdCBtaWdodCBoYXBwZW4gaWYKKwkgKiBwb3dlciB1cCBzZXF1ZW5jZSBpcyBub3QgcHJvcGVybHkgYXBwbGllZC4KKwkgKi8KKwlwcml2LT5yZWdtYXAgPSByZWdtYXA7CisKKwllcnIgPSBkZXZtX2lpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKHBhcmVudCwgaW5kaW9fZGV2LCBOVUxMLAorCQkJCQkgICAgICB6cGEyMzI2X3RyaWdnZXJfaGFuZGxlciwKKwkJCQkJICAgICAgJnpwYTIzMjZfYnVmZmVyX3NldHVwX29wcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHpwYTIzMjZfaW5pdF9tYW5hZ2VkX3RyaWdnZXIocGFyZW50LCBpbmRpb19kZXYsIHByaXYsIGlycSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHpwYTIzMjZfaW5pdF9tYW5hZ2VkX2lycShwYXJlbnQsIGluZGlvX2RldiwgcHJpdiwgaXJxKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogUG93ZXIgdXAgdG8gY2hlY2sgZGV2aWNlIElEIGFuZCBwZXJmb3JtIGluaXRpYWwgaGFyZHdhcmUgc2V0dXAuICovCisJZXJyID0genBhMjMyNl9wb3dlcl9vbihpbmRpb19kZXYsIHByaXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBSZWFkIGlkIHJlZ2lzdGVyIHRvIGNoZWNrIHdlIGFyZSB0YWxraW5nIHRvIHRoZSByaWdodCBzbGF2ZS4gKi8KKwllcnIgPSByZWdtYXBfcmVhZChyZWdtYXAsIFpQQTIzMjZfREVWSUNFX0lEX1JFRywgJmlkKTsKKwlpZiAoZXJyKQorCQlnb3RvIHNsZWVwOworCisJaWYgKGlkICE9IGh3aWQpIHsKKwkJZGV2X2VycihwYXJlbnQsICJmb3VuZCBkZXZpY2Ugd2l0aCB1bmV4cGVjdGVkIGlkICUwMngiLCBpZCk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gc2xlZXA7CisJfQorCisJZXJyID0genBhMjMyNl9jb25maWdfb25lc2hvdChpbmRpb19kZXYsIGlycSk7CisJaWYgKGVycikKKwkJZ290byBzbGVlcDsKKworCS8qIFNldHVwIGRvbmUgOiBnbyBzbGVlcGluZy4gRGV2aWNlIHdpbGwgYmUgYXdha2VuIHVwb24gdXNlciByZXF1ZXN0LiAqLworCWVyciA9IHpwYTIzMjZfc2xlZXAoaW5kaW9fZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIHBvd2Vyb2ZmOworCisJZGV2X3NldF9kcnZkYXRhKHBhcmVudCwgaW5kaW9fZGV2KTsKKworCXpwYTIzMjZfaW5pdF9ydW50aW1lKHBhcmVudCk7CisKKwllcnIgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKGVycikgeworCQl6cGEyMzI2X2ZpbmlfcnVudGltZShwYXJlbnQpOworCQlnb3RvIHBvd2Vyb2ZmOworCX0KKworCXJldHVybiAwOworCitzbGVlcDoKKwkvKiBQdXQgdG8gc2xlZXAganVzdCBpbiBjYXNlIHBvd2VyIHJlZ3VsYXRvcnMgYXJlICJkdW1teSIgb25lcy4gKi8KKwl6cGEyMzI2X3NsZWVwKGluZGlvX2Rldik7Citwb3dlcm9mZjoKKwl6cGEyMzI2X3Bvd2VyX29mZihpbmRpb19kZXYsIHByaXYpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHpwYTIzMjZfcHJvYmUpOworCit2b2lkIHpwYTIzMjZfcmVtb3ZlKGNvbnN0IHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBhcmVudCk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwl6cGEyMzI2X2ZpbmlfcnVudGltZShpbmRpb19kZXYtPmRldi5wYXJlbnQpOworCXpwYTIzMjZfc2xlZXAoaW5kaW9fZGV2KTsKKwl6cGEyMzI2X3Bvd2VyX29mZihpbmRpb19kZXYsIGlpb19wcml2KGluZGlvX2RldikpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoenBhMjMyNl9yZW1vdmUpOworCitNT0RVTEVfQVVUSE9SKCJHcmVnb3IgQm9pcmllIDxncmVnb3IuYm9pcmllQHBhcnJvdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvcmUgZHJpdmVyIGZvciBNdXJhdGEgWlBBMjMyNiBwcmVzc3VyZSBzZW5zb3IiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3pwYTIzMjYuaCBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3pwYTIzMjYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWQzZTFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvenBhMjMyNi5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBNdXJhdGEgWlBBMjMyNiBwcmVzc3VyZSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29yIElJTyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUGFycm90IFMuQS4KKyAqCisgKiBBdXRob3I6IEdyZWdvciBCb2lyaWUgPGdyZWdvci5ib2lyaWVAcGFycm90LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfWlBBMjMyNl9ICisjZGVmaW5lIF9aUEEyMzI2X0gKKworLyogUmVnaXN0ZXIgbWFwLiAqLworI2RlZmluZSBaUEEyMzI2X1JFRl9QX1hMX1JFRyAgICAgICAgICAgICAgKDB4OCkKKyNkZWZpbmUgWlBBMjMyNl9SRUZfUF9MX1JFRyAgICAgICAgICAgICAgICgweDkpCisjZGVmaW5lIFpQQTIzMjZfUkVGX1BfSF9SRUcgICAgICAgICAgICAgICAoMHhhKQorI2RlZmluZSBaUEEyMzI2X0RFVklDRV9JRF9SRUcgICAgICAgICAgICAgKDB4ZikKKyNkZWZpbmUgWlBBMjMyNl9ERVZJQ0VfSUQgICAgICAgICAgICAgICAgICgweGI5KQorI2RlZmluZSBaUEEyMzI2X1JFU19DT05GX1JFRyAgICAgICAgICAgICAgKDB4MTApCisjZGVmaW5lIFpQQTIzMjZfQ1RSTF9SRUcwX1JFRyAgICAgICAgICAgICAoMHgyMCkKKyNkZWZpbmUgWlBBMjMyNl9DVFJMX1JFRzBfT05FX1NIT1QgICAgICAgIEJJVCgwKQorI2RlZmluZSBaUEEyMzI2X0NUUkxfUkVHMF9FTkFCTEUgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFpQQTIzMjZfQ1RSTF9SRUcxX1JFRyAgICAgICAgICAgICAoMHgyMSkKKyNkZWZpbmUgWlBBMjMyNl9DVFJMX1JFRzFfTUFTS19EQVRBX1JFQURZIEJJVCgyKQorI2RlZmluZSBaUEEyMzI2X0NUUkxfUkVHMl9SRUcgICAgICAgICAgICAgKDB4MjIpCisjZGVmaW5lIFpQQTIzMjZfQ1RSTF9SRUcyX1NXUkVTRVQgICAgICAgICBCSVQoMikKKyNkZWZpbmUgWlBBMjMyNl9DVFJMX1JFRzNfUkVHICAgICAgICAgICAgICgweDIzKQorI2RlZmluZSBaUEEyMzI2X0NUUkxfUkVHM19PRFJfU0hJRlQgICAgICAgKDQpCisjZGVmaW5lIFpQQTIzMjZfQ1RSTF9SRUczX0VOQUJMRV9NRUFTICAgICBCSVQoNykKKyNkZWZpbmUgWlBBMjMyNl9JTlRfU09VUkNFX1JFRyAgICAgICAgICAgICgweDI0KQorI2RlZmluZSBaUEEyMzI2X0lOVF9TT1VSQ0VfREFUQV9SRUFEWSAgICAgQklUKDIpCisjZGVmaW5lIFpQQTIzMjZfVEhTX1BfTE9XX1JFRyAgICAgICAgICAgICAoMHgyNSkKKyNkZWZpbmUgWlBBMjMyNl9USFNfUF9ISUdIX1JFRyAgICAgICAgICAgICgweDI2KQorI2RlZmluZSBaUEEyMzI2X1NUQVRVU19SRUcgICAgICAgICAgICAgICAgKDB4MjcpCisjZGVmaW5lIFpQQTIzMjZfU1RBVFVTX1BfREEgICAgICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgWlBBMjMyNl9TVEFUVVNfRklGT19FICAgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBaUEEyMzI2X1NUQVRVU19QX09SICAgICAgICAgICAgICAgQklUKDUpCisjZGVmaW5lIFpQQTIzMjZfUFJFU1NfT1VUX1hMX1JFRyAgICAgICAgICAoMHgyOCkKKyNkZWZpbmUgWlBBMjMyNl9QUkVTU19PVVRfTF9SRUcgICAgICAgICAgICgweDI5KQorI2RlZmluZSBaUEEyMzI2X1BSRVNTX09VVF9IX1JFRyAgICAgICAgICAgKDB4MmEpCisjZGVmaW5lIFpQQTIzMjZfVEVNUF9PVVRfTF9SRUcgICAgICAgICAgICAoMHgyYikKKyNkZWZpbmUgWlBBMjMyNl9URU1QX09VVF9IX1JFRyAgICAgICAgICAgICgweDJjKQorCitzdHJ1Y3QgZGV2aWNlOworc3RydWN0IHJlZ21hcDsKKworYm9vbCB6cGEyMzI2X2lzcmVnX3dyaXRlYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpOworYm9vbCB6cGEyMzI2X2lzcmVnX3JlYWRhYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZyk7Citib29sIHpwYTIzMjZfaXNyZWdfcHJlY2lvdXMoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKTsKKworLyoqCisgKiB6cGEyMzI2X3Byb2JlKCkgLSBJbnN0YW50aWF0ZSBhbmQgcmVnaXN0ZXIgY29yZSBaUEEyMzI2IElJTyBkZXZpY2UKKyAqIEBwYXJlbnQ6IEhhcmR3YXJlIHNhbXBsaW5nIGRldmljZSB0aGUgY3JlYXRlZCBJSU8gZGV2aWNlIHdpbGwgYmUgYSBjaGlsZCBvZi4KKyAqIEBuYW1lOiAgIEFyYml0cmFyeSBuYW1lIHRvIGlkZW50aWZ5IHRoZSBkZXZpY2UuCisgKiBAaXJxOiAgICBJbnRlcnJ1cHQgbGluZSwgbmVnYXRpdmUgaWYgbm9uZS4KKyAqIEBod2lkOiAgIEV4cGVjdGVkIGRldmljZSBoYXJkd2FyZSBpZC4KKyAqIEByZWdtYXA6IFJlZ2lzdGVycyBtYXAgdXNlZCB0byBhYnN0cmFjdCB1bmRlcmx5aW5nIGJ1cyBhY2Nlc3Nlcy4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgenBhMjMyNl9wcm9iZShzdHJ1Y3QgZGV2aWNlICAgICAgICAqcGFyZW50LAorCQkgIGNvbnN0IGNoYXIgICAgICAgICAgICpuYW1lLAorCQkgIGludCAgICAgICAgICAgICAgICAgICBpcnEsCisJCSAgdW5zaWduZWQgaW50ICAgICAgICAgIGh3aWQsCisJCSAgc3RydWN0IHJlZ21hcCAgICAgICAgKnJlZ21hcCk7CisKKy8qKgorICogenBhMjMyNl9yZW1vdmUoKSAtIFVucmVnaXN0ZXIgYW5kIGRlc3Ryb3kgY29yZSBaUEEyMzI2IElJTyBkZXZpY2UuCisgKiBAcGFyZW50OiBIYXJkd2FyZSBzYW1wbGluZyBkZXZpY2UgdGhlIElJTyBkZXZpY2UgdG8gcmVtb3ZlIGlzIGEgY2hpbGQgb2YuCisgKi8KK3ZvaWQgenBhMjMyNl9yZW1vdmUoY29uc3Qgc3RydWN0IGRldmljZSAqcGFyZW50KTsKKworI2lmZGVmIENPTkZJR19QTQorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CitleHRlcm4gY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgenBhMjMyNl9wbV9vcHM7CisjZGVmaW5lIFpQQTIzMjZfUE1fT1BTICgmenBhMjMyNl9wbV9vcHMpCisjZWxzZQorI2RlZmluZSBaUEEyMzI2X1BNX09QUyAoTlVMTCkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3pwYTIzMjZfaTJjLmMgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS96cGEyMzI2X2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZDI3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS96cGEyMzI2X2kyYy5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBNdXJhdGEgWlBBMjMyNiBJMkMgcHJlc3N1cmUgYW5kIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUGFycm90IFMuQS4KKyAqCisgKiBBdXRob3I6IEdyZWdvciBCb2lyaWUgPGdyZWdvci5ib2lyaWVAcGFycm90LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgInpwYTIzMjYuaCIKKworLyoKKyAqIHJlYWRfZmxhZ19tYXNrOgorICogICAtIGFkZHJlc3MgYml0IDcgbXVzdCBiZSBzZXQgdG8gcmVxdWVzdCBhIHJlZ2lzdGVyIHJlYWQgb3BlcmF0aW9uCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB6cGEyMzI2X3JlZ21hcF9pMmNfY29uZmlnID0geworCS5yZWdfYml0cyAgICAgICA9IDgsCisJLnZhbF9iaXRzICAgICAgID0gOCwKKwkud3JpdGVhYmxlX3JlZyAgPSB6cGEyMzI2X2lzcmVnX3dyaXRlYWJsZSwKKwkucmVhZGFibGVfcmVnICAgPSB6cGEyMzI2X2lzcmVnX3JlYWRhYmxlLAorCS5wcmVjaW91c19yZWcgICA9IHpwYTIzMjZfaXNyZWdfcHJlY2lvdXMsCisJLm1heF9yZWdpc3RlciAgID0gWlBBMjMyNl9URU1QX09VVF9IX1JFRywKKwkucmVhZF9mbGFnX21hc2sgPSBCSVQoNyksCisJLmNhY2hlX3R5cGUgICAgID0gUkVHQ0FDSEVfTk9ORSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgenBhMjMyNl9pMmNfaHdpZChjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworI2RlZmluZSBaUEEyMzI2X1NBMChfYWRkcikgICAgICAgICAgKF9hZGRyICYgQklUKDApKQorI2RlZmluZSBaUEEyMzI2X0RFVklDRV9JRF9TQTBfU0hJRlQgKDEpCisKKwkvKiBJZGVudGlmaWNhdGlvbiByZWdpc3RlciBiaXQgMSBtaXJyb3JzIGRldmljZSBhZGRyZXNzIGJpdCAwLiAqLworCXJldHVybiAoWlBBMjMyNl9ERVZJQ0VfSUQgfAorCQkoWlBBMjMyNl9TQTAoY2xpZW50LT5hZGRyKSA8PCBaUEEyMzI2X0RFVklDRV9JRF9TQTBfU0hJRlQpKTsKK30KKworc3RhdGljIGludCB6cGEyMzI2X3Byb2JlX2kyYyhzdHJ1Y3QgaTJjX2NsaWVudCAgICAgICAgICAqY2xpZW50LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaTJjX2lkKQoreworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKworCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJnpwYTIzMjZfcmVnbWFwX2kyY19jb25maWcpOworCWlmIChJU19FUlIocmVnbWFwKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byBpbml0IHJlZ2lzdGVycyBtYXAiKTsKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKKwl9CisKKwlyZXR1cm4genBhMjMyNl9wcm9iZSgmY2xpZW50LT5kZXYsIGkyY19pZC0+bmFtZSwgY2xpZW50LT5pcnEsCisJCQkgICAgIHpwYTIzMjZfaTJjX2h3aWQoY2xpZW50KSwgcmVnbWFwKTsKK30KKworc3RhdGljIGludCB6cGEyMzI2X3JlbW92ZV9pMmMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwl6cGEyMzI2X3JlbW92ZSgmY2xpZW50LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB6cGEyMzI2X2kyY19pZHNbXSA9IHsKKwl7ICJ6cGEyMzI2IiwgMCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgenBhMjMyNl9pMmNfaWRzKTsKKworI2lmIGRlZmluZWQoQ09ORklHX09GKQorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgenBhMjMyNl9pMmNfbWF0Y2hlc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAibXVyYXRhLHpwYTIzMjYiIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgenBhMjMyNl9pMmNfbWF0Y2hlcyk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHpwYTIzMjZfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSAgICAgICAgICAgPSAienBhMjMyNi1pMmMiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoenBhMjMyNl9pMmNfbWF0Y2hlcyksCisJCS5wbSAgICAgICAgICAgICA9IFpQQTIzMjZfUE1fT1BTLAorCX0sCisJLnByb2JlICAgID0genBhMjMyNl9wcm9iZV9pMmMsCisJLnJlbW92ZSAgID0genBhMjMyNl9yZW1vdmVfaTJjLAorCS5pZF90YWJsZSA9IHpwYTIzMjZfaTJjX2lkcywKK307Cittb2R1bGVfaTJjX2RyaXZlcih6cGEyMzI2X2kyY19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJHcmVnb3IgQm9pcmllIDxncmVnb3IuYm9pcmllQHBhcnJvdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkkyQyBkcml2ZXIgZm9yIE11cmF0YSBaUEEyMzI2IHByZXNzdXJlIHNlbnNvciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvenBhMjMyNl9zcGkuYyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3pwYTIzMjZfc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyYzFjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3pwYTIzMjZfc3BpLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBNdXJhdGEgWlBBMjMyNiBTUEkgcHJlc3N1cmUgYW5kIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUGFycm90IFMuQS4KKyAqCisgKiBBdXRob3I6IEdyZWdvciBCb2lyaWUgPGdyZWdvci5ib2lyaWVAcGFycm90LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlICJ6cGEyMzI2LmgiCisKKy8qCisgKiByZWFkX2ZsYWdfbWFzazoKKyAqICAgLSBhZGRyZXNzIGJpdCA3IG11c3QgYmUgc2V0IHRvIHJlcXVlc3QgYSByZWdpc3RlciByZWFkIG9wZXJhdGlvbgorICogICAtIGFkZHJlc3MgYml0IDYgbXVzdCBiZSBzZXQgdG8gcmVxdWVzdCByZWdpc3RlciBhZGRyZXNzIGF1dG8gaW5jcmVtZW50CisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB6cGEyMzI2X3JlZ21hcF9zcGlfY29uZmlnID0geworCS5yZWdfYml0cyAgICAgICA9IDgsCisJLnZhbF9iaXRzICAgICAgID0gOCwKKwkud3JpdGVhYmxlX3JlZyAgPSB6cGEyMzI2X2lzcmVnX3dyaXRlYWJsZSwKKwkucmVhZGFibGVfcmVnICAgPSB6cGEyMzI2X2lzcmVnX3JlYWRhYmxlLAorCS5wcmVjaW91c19yZWcgICA9IHpwYTIzMjZfaXNyZWdfcHJlY2lvdXMsCisJLm1heF9yZWdpc3RlciAgID0gWlBBMjMyNl9URU1QX09VVF9IX1JFRywKKwkucmVhZF9mbGFnX21hc2sgPSBCSVQoNykgfCBCSVQoNiksCisJLmNhY2hlX3R5cGUgICAgID0gUkVHQ0FDSEVfTk9ORSwKK307CisKK3N0YXRpYyBpbnQgenBhMjMyNl9wcm9iZV9zcGkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJaW50ICAgICAgICAgICAgZXJyOworCisJcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9zcGkoc3BpLCAmenBhMjMyNl9yZWdtYXBfc3BpX2NvbmZpZyk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiZmFpbGVkIHRvIGluaXQgcmVnaXN0ZXJzIG1hcCIpOworCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOworCX0KKworCS8qCisJICogRW5mb3JjZSBTUEkgc2xhdmUgc2V0dGluZ3MgdG8gcHJldmVudCBmcm9tIERUIG1pc2NvbmZpZ3VyYXRpb24uCisJICoKKwkgKiBDbG9jayBpcyBpZGxlIGhpZ2guIFNhbXBsaW5nIGhhcHBlbnMgb24gdHJhaWxpbmcgZWRnZSwgaS5lLiwgcmlzaW5nCisJICogZWRnZS4gTWF4aW11bSBidXMgZnJlcXVlbmN5IGlzIDEgTUh6LiBSZWdpc3RlcnMgYXJlIDggYml0cyB3aWRlLgorCSAqLworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpLT5tYXhfc3BlZWRfaHogPSBtaW4oc3BpLT5tYXhfc3BlZWRfaHosIDEwMDAwMDBVKTsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCWVyciA9IHNwaV9zZXR1cChzcGkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIHpwYTIzMjZfcHJvYmUoJnNwaS0+ZGV2LCBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5uYW1lLAorCQkJICAgICBzcGktPmlycSwgWlBBMjMyNl9ERVZJQ0VfSUQsIHJlZ21hcCk7Cit9CisKK3N0YXRpYyBpbnQgenBhMjMyNl9yZW1vdmVfc3BpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJenBhMjMyNl9yZW1vdmUoJnNwaS0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgenBhMjMyNl9zcGlfaWRzW10gPSB7CisJeyAienBhMjMyNiIsIDAgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIHpwYTIzMjZfc3BpX2lkcyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19PRikKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHpwYTIzMjZfc3BpX21hdGNoZXNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm11cmF0YSx6cGEyMzI2IiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHpwYTIzMjZfc3BpX21hdGNoZXMpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB6cGEyMzI2X3NwaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gInpwYTIzMjYtc3BpIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHpwYTIzMjZfc3BpX21hdGNoZXMpLAorCQkucG0gICAgICAgICAgICAgPSBaUEEyMzI2X1BNX09QUywKKwl9LAorCS5wcm9iZSAgICA9IHpwYTIzMjZfcHJvYmVfc3BpLAorCS5yZW1vdmUgICA9IHpwYTIzMjZfcmVtb3ZlX3NwaSwKKwkuaWRfdGFibGUgPSB6cGEyMzI2X3NwaV9pZHMsCit9OworbW9kdWxlX3NwaV9kcml2ZXIoenBhMjMyNl9zcGlfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiR3JlZ29yIEJvaXJpZSA8Z3JlZ29yLmJvaXJpZUBwYXJyb3QuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTUEkgZHJpdmVyIGZvciBNdXJhdGEgWlBBMjMyNiBwcmVzc3VyZSBzZW5zb3IiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3Byb3hpbWl0eS9hczM5MzUuYyBiL2RyaXZlcnMvaWlvL3Byb3hpbWl0eS9hczM5MzUuYwppbmRleCAyZTNhNzBlLi41NjU2ZGViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9wcm94aW1pdHkvYXMzOTM1LmMKKysrIGIvZHJpdmVycy9paW8vcHJveGltaXR5L2FzMzkzNS5jCkBAIC0zOTcsNyArMzk3LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsIE5VTEwsCisJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwKIAkJJmFzMzkzNV90cmlnZ2VyX2hhbmRsZXIsIE5VTEwpOwogCiAJaWYgKHJldCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJveGltaXR5L3N4OTUwMC5jIGIvZHJpdmVycy9paW8vcHJveGltaXR5L3N4OTUwMC5jCmluZGV4IDFkNzRiM2EuLjFmMDYyODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL3Byb3hpbWl0eS9zeDk1MDAuYworKysgYi9kcml2ZXJzL2lpby9wcm94aW1pdHkvc3g5NTAwLmMKQEAgLTUxNiw3ICs1MTYsNyBAQAogCQlzeDk1MDBfcHVzaF9ldmVudHMoaW5kaW9fZGV2KTsKIAogCWlmICh2YWwgJiBTWDk1MDBfQ09OVkRPTkVfSVJRKQotCQljb21wbGV0ZV9hbGwoJmRhdGEtPmNvbXBsZXRpb24pOworCQljb21wbGV0ZSgmZGF0YS0+Y29tcGxldGlvbik7CiAKIG91dDoKIAltdXRleF91bmxvY2soJmRhdGEtPm11dGV4KTsKQEAgLTEwMjUsNiArMTAyNSwxMiBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgc3g5NTAwX2FjcGlfbWF0Y2gpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzeDk1MDBfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInNlbXRlY2gsc3g5NTAwIiwgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzeDk1MDBfb2ZfbWF0Y2gpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgc3g5NTAwX2lkW10gPSB7CiAJeyJzeDk1MDAiLCAwfSwKIAl7IH0sCkBAIC0xMDM1LDYgKzEwNDEsNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gU1g5NTAwX0RSSVZFUl9OQU1FLAogCQkuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKHN4OTUwMF9hY3BpX21hdGNoKSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHN4OTUwMF9vZl9tYXRjaCksCiAJCS5wbSA9ICZzeDk1MDBfcG1fb3BzLAogCX0sCiAJLnByb2JlCQk9IHN4OTUwMF9wcm9iZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL0tjb25maWcgYi9kcml2ZXJzL2lpby90ZW1wZXJhdHVyZS9LY29uZmlnCmluZGV4IGM0NjY0ZTUuLjVlYTc3YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL0tjb25maWcKKysrIGIvZHJpdmVycy9paW8vdGVtcGVyYXR1cmUvS2NvbmZpZwpAQCAtMyw2ICszLDIyIEBACiAjCiBtZW51ICJUZW1wZXJhdHVyZSBzZW5zb3JzIgogCitjb25maWcgTUFYSU1fVEhFUk1PQ09VUExFCisJdHJpc3RhdGUgIk1heGltIHRoZXJtb2NvdXBsZSBzZW5zb3JzIgorCWRlcGVuZHMgb24gU1BJCisJc2VsZWN0IElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVJFRF9CVUZGRVIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE1heGltIHNlcmllcyBvZgorCSAgdGhlcm1vY291cGxlIHNlbnNvcnMgY29ubmVjdGVkIHZpYSBTUEkuCisKKwkgIFN1cHBvcnRlZCBzZW5zb3JzOgorCSAgICogTUFYNjY3NQorCSAgICogTUFYMzE4NTUKKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBtYXhpbV90aGVybW9jb3VwbGUuCisKIGNvbmZpZyBNTFg5MDYxNAogCXRyaXN0YXRlICJNTFg5MDYxNCBjb250YWN0LWxlc3MgaW5mcmFyZWQgc2Vuc29yIgogCWRlcGVuZHMgb24gSTJDCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby90ZW1wZXJhdHVyZS9NYWtlZmlsZSBiL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL01ha2VmaWxlCmluZGV4IDAyYmM3OWQuLjc4YzNkZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL01ha2VmaWxlCkBAIC0yLDYgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgaW5kdXN0cmlhbCBJL08gdGVtcGVyYXR1cmUgZHJpdmVycwogIwogCitvYmotJChDT05GSUdfTUFYSU1fVEhFUk1PQ09VUExFKSArPSBtYXhpbV90aGVybW9jb3VwbGUubwogb2JqLSQoQ09ORklHX01MWDkwNjE0KSArPSBtbHg5MDYxNC5vCiBvYmotJChDT05GSUdfVE1QMDA2KSArPSB0bXAwMDYubwogb2JqLSQoQ09ORklHX1RTWVMwMSkgKz0gdHN5czAxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL21heGltX3RoZXJtb2NvdXBsZS5jIGIvZHJpdmVycy9paW8vdGVtcGVyYXR1cmUvbWF4aW1fdGhlcm1vY291cGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkZDIwMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL21heGltX3RoZXJtb2NvdXBsZS5jCkBAIC0wLDAgKzEsMjgxIEBACisvKgorICogbWF4aW1fdGhlcm1vY291cGxlLmMgIC0gU3VwcG9ydCBmb3IgTWF4aW0gdGhlcm1vY291cGxlIGNoaXBzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IE1hdHQgUmFub3N0YXkgPG1yYW5vc3RheUBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vYnVmZmVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJlZF9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcl9jb25zdW1lci5oPgorCisjZGVmaW5lIE1BWElNX1RIRVJNT0NPVVBMRV9EUlZfTkFNRQkibWF4aW1fdGhlcm1vY291cGxlIgorCitlbnVtIHsKKwlNQVg2Njc1LAorCU1BWDMxODU1LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIG1heDY2NzVfY2hhbm5lbHNbXSA9IHsKKwl7CS8qIHRoZXJtb2NvdXBsZSB0ZW1wZXJhdHVyZSAqLworCQkudHlwZSA9IElJT19URU1QLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0KKwkJCUJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfCBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCisJCS5zY2FuX2luZGV4ID0gMCwKKwkJLnNjYW5fdHlwZSA9IHsKKwkJCS5zaWduID0gJ3MnLAorCQkJLnJlYWxiaXRzID0gMTMsCisJCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJCS5zaGlmdCA9IDMsCisJCQkuZW5kaWFubmVzcyA9IElJT19CRSwKKwkJfSwKKwl9LAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIG1heDMxODU1X2NoYW5uZWxzW10gPSB7CisJewkvKiB0aGVybW9jb3VwbGUgdGVtcGVyYXR1cmUgKi8KKwkJLnR5cGUgPSBJSU9fVEVNUCwKKwkJLmFkZHJlc3MgPSAyLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0KKwkJCUJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfCBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCisJCS5zY2FuX2luZGV4ID0gMCwKKwkJLnNjYW5fdHlwZSA9IHsKKwkJCS5zaWduID0gJ3MnLAorCQkJLnJlYWxiaXRzID0gMTQsCisJCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJCS5zaGlmdCA9IDIsCisJCQkuZW5kaWFubmVzcyA9IElJT19CRSwKKwkJfSwKKwl9LAorCXsJLyogY29sZCBqdW5jdGlvbiB0ZW1wZXJhdHVyZSAqLworCQkudHlwZSA9IElJT19URU1QLAorCQkuYWRkcmVzcyA9IDAsCisJCS5jaGFubmVsMiA9IElJT19NT0RfVEVNUF9BTUJJRU5ULAorCQkubW9kaWZpZWQgPSAxLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0KKwkJCUJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfCBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCisJCS5zY2FuX2luZGV4ID0gMSwKKwkJLnNjYW5fdHlwZSA9IHsKKwkJCS5zaWduID0gJ3MnLAorCQkJLnJlYWxiaXRzID0gMTIsCisJCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJCS5zaGlmdCA9IDQsCisJCQkuZW5kaWFubmVzcyA9IElJT19CRSwKKwkJfSwKKwl9LAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDIpLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbWF4MzE4NTVfc2Nhbl9tYXNrc1tdID0gezB4MywgMH07CisKK3N0cnVjdCBtYXhpbV90aGVybW9jb3VwbGVfY2hpcCB7CisJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnNjYW5fbWFza3M7CisJdTggbnVtX2NoYW5uZWxzOworCXU4IHJlYWRfc2l6ZTsKKworCS8qIGJpdC1jaGVjayBmb3IgdmFsaWQgaW5wdXQgKi8KKwl1MzIgc3RhdHVzX2JpdDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWF4aW1fdGhlcm1vY291cGxlX2NoaXAgbWF4aW1fdGhlcm1vY291cGxlX2NoaXBzW10gPSB7CisJW01BWDY2NzVdID0geworCQkJLmNoYW5uZWxzID0gbWF4NjY3NV9jaGFubmVscywKKwkJCS5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKG1heDY2NzVfY2hhbm5lbHMpLAorCQkJLnJlYWRfc2l6ZSA9IDIsCisJCQkuc3RhdHVzX2JpdCA9IEJJVCgyKSwKKwkJfSwKKwlbTUFYMzE4NTVdID0geworCQkJLmNoYW5uZWxzID0gbWF4MzE4NTVfY2hhbm5lbHMsCisJCQkubnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShtYXgzMTg1NV9jaGFubmVscyksCisJCQkucmVhZF9zaXplID0gNCwKKwkJCS5zY2FuX21hc2tzID0gbWF4MzE4NTVfc2Nhbl9tYXNrcywKKwkJCS5zdGF0dXNfYml0ID0gQklUKDE2KSwKKwkJfSwKK307CisKK3N0cnVjdCBtYXhpbV90aGVybW9jb3VwbGVfZGF0YSB7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaTsKKwljb25zdCBzdHJ1Y3QgbWF4aW1fdGhlcm1vY291cGxlX2NoaXAgKmNoaXA7CisKKwl1OCBidWZmZXJbMTZdIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKK307CisKK3N0YXRpYyBpbnQgbWF4aW1fdGhlcm1vY291cGxlX3JlYWQoc3RydWN0IG1heGltX3RoZXJtb2NvdXBsZV9kYXRhICpkYXRhLAorCQkJCSAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLCBpbnQgKnZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RvcmFnZV9ieXRlcyA9IGRhdGEtPmNoaXAtPnJlYWRfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgc2hpZnQgPSBjaGFuLT5zY2FuX3R5cGUuc2hpZnQgKyAoY2hhbi0+YWRkcmVzcyAqIDgpOworCXVuc2lnbmVkIGludCBidWY7CisJaW50IHJldDsKKworCXJldCA9IHNwaV9yZWFkKGRhdGEtPnNwaSwgKHZvaWQgKikgJmJ1Ziwgc3RvcmFnZV9ieXRlcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAoc3RvcmFnZV9ieXRlcykgeworCWNhc2UgMjoKKwkJKnZhbCA9IGJlMTZfdG9fY3B1KGJ1Zik7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJKnZhbCA9IGJlMzJfdG9fY3B1KGJ1Zik7CisJCWJyZWFrOworCX0KKworCS8qIGNoZWNrIHRvIGJlIHN1cmUgdGhpcyBpcyBhIHZhbGlkIHJlYWRpbmcgKi8KKwlpZiAoKnZhbCAmIGRhdGEtPmNoaXAtPnN0YXR1c19iaXQpCisJCXJldHVybiAtRUlOVkFMOworCisJKnZhbCA9IHNpZ25fZXh0ZW5kMzIoKnZhbCA+PiBzaGlmdCwgY2hhbi0+c2Nhbl90eXBlLnJlYWxiaXRzIC0gMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IG1heGltX3RoZXJtb2NvdXBsZV90cmlnZ2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYgPSBwcml2YXRlOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+aW5kaW9fZGV2OworCXN0cnVjdCBtYXhpbV90aGVybW9jb3VwbGVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCXJldCA9IHNwaV9yZWFkKGRhdGEtPnNwaSwgZGF0YS0+YnVmZmVyLCBkYXRhLT5jaGlwLT5yZWFkX3NpemUpOworCWlmICghcmV0KSB7CisJCWlpb19wdXNoX3RvX2J1ZmZlcnNfd2l0aF90aW1lc3RhbXAoaW5kaW9fZGV2LCBkYXRhLT5idWZmZXIsCisJCQkJCQkgICBpaW9fZ2V0X3RpbWVfbnMoaW5kaW9fZGV2KSk7CisJfQorCisJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoaW5kaW9fZGV2LT50cmlnKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBtYXhpbV90aGVybW9jb3VwbGVfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkJICAgICAgIGludCAqdmFsLCBpbnQgKnZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgbWF4aW1fdGhlcm1vY291cGxlX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQgPSAtRUlOVkFMOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJcmV0ID0gaWlvX2RldmljZV9jbGFpbV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBtYXhpbV90aGVybW9jb3VwbGVfcmVhZChkYXRhLCBjaGFuLCB2YWwpOworCQlpaW9fZGV2aWNlX3JlbGVhc2VfZGlyZWN0X21vZGUoaW5kaW9fZGV2KTsKKworCQlpZiAoIXJldCkKKwkJCXJldHVybiBJSU9fVkFMX0lOVDsKKworCQlicmVhazsKKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCXN3aXRjaCAoY2hhbi0+Y2hhbm5lbDIpIHsKKwkJY2FzZSBJSU9fTU9EX1RFTVBfQU1CSUVOVDoKKwkJCSp2YWwgPSA2MjsKKwkJCSp2YWwyID0gNTAwMDAwOyAvKiAxMDAwICogMC4wNjI1ICovCisJCQlyZXQgPSBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkqdmFsID0gMjUwOyAvKiAxMDAwICogMC4yNSAqLworCQkJcmV0ID0gSUlPX1ZBTF9JTlQ7CisJCX07CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gbWF4aW1fdGhlcm1vY291cGxlX2luZm8gPSB7CisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkucmVhZF9yYXcgPSBtYXhpbV90aGVybW9jb3VwbGVfcmVhZF9yYXcsCit9OworCitzdGF0aWMgaW50IG1heGltX3RoZXJtb2NvdXBsZV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkICppZCA9IHNwaV9nZXRfZGV2aWNlX2lkKHNwaSk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgbWF4aW1fdGhlcm1vY291cGxlX2RhdGEgKmRhdGE7CisJY29uc3Qgc3RydWN0IG1heGltX3RoZXJtb2NvdXBsZV9jaGlwICpjaGlwID0KKwkJCSZtYXhpbV90aGVybW9jb3VwbGVfY2hpcHNbaWQtPmRyaXZlcl9kYXRhXTsKKwlpbnQgcmV0OworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpkYXRhKSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5kaW9fZGV2LT5pbmZvID0gJm1heGltX3RoZXJtb2NvdXBsZV9pbmZvOworCWluZGlvX2Rldi0+bmFtZSA9IE1BWElNX1RIRVJNT0NPVVBMRV9EUlZfTkFNRTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gY2hpcC0+Y2hhbm5lbHM7CisJaW5kaW9fZGV2LT5hdmFpbGFibGVfc2Nhbl9tYXNrcyA9IGNoaXAtPnNjYW5fbWFza3M7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBjaGlwLT5udW1fY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJZGF0YS0+c3BpID0gc3BpOworCWRhdGEtPmNoaXAgPSBjaGlwOworCisJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBOVUxMLAorCQkJCW1heGltX3RoZXJtb2NvdXBsZV90cmlnZ2VyX2hhbmRsZXIsIE5VTEwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ19idWZmZXI7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfdW5yZWdfYnVmZmVyOgorCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF4aW1fdGhlcm1vY291cGxlX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgbWF4aW1fdGhlcm1vY291cGxlX2lkW10gPSB7CisJeyJtYXg2Njc1IiwgTUFYNjY3NX0sCisJeyJtYXgzMTg1NSIsIE1BWDMxODU1fSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgbWF4aW1fdGhlcm1vY291cGxlX2lkKTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIG1heGltX3RoZXJtb2NvdXBsZV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSBNQVhJTV9USEVSTU9DT1VQTEVfRFJWX05BTUUsCisJfSwKKwkucHJvYmUJCT0gbWF4aW1fdGhlcm1vY291cGxlX3Byb2JlLAorCS5yZW1vdmUJCT0gbWF4aW1fdGhlcm1vY291cGxlX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBtYXhpbV90aGVybW9jb3VwbGVfaWQsCit9OworbW9kdWxlX3NwaV9kcml2ZXIobWF4aW1fdGhlcm1vY291cGxlX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIk1hdHQgUmFub3N0YXkgPG1yYW5vc3RheUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1heGltIHRoZXJtb2NvdXBsZSBzZW5zb3JzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbWEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtYS5jCmluZGV4IGU2ZGZhMWIuLjVmNjVhNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtYS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtYS5jCkBAIC0yNDYyLDE4ICsyNDYyLDI0IEBACiAKIAlpZiAoYWRkci0+ZGV2X2FkZHIuYm91bmRfZGV2X2lmKSB7CiAJCW5kZXYgPSBkZXZfZ2V0X2J5X2luZGV4KCZpbml0X25ldCwgYWRkci0+ZGV2X2FkZHIuYm91bmRfZGV2X2lmKTsKLQkJaWYgKCFuZGV2KQotCQkJcmV0dXJuIC1FTk9ERVY7CisJCWlmICghbmRldikgeworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyMjsKKwkJfQogCiAJCWlmIChuZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykgewogCQkJZGV2X3B1dChuZGV2KTsKLQkJCWlmICghaWRfcHJpdi0+aWQuZGV2aWNlLT5nZXRfbmV0ZGV2KQotCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCWlmICghaWRfcHJpdi0+aWQuZGV2aWNlLT5nZXRfbmV0ZGV2KSB7CisJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQkJZ290byBlcnIyOworCQkJfQogCiAJCQluZGV2ID0gaWRfcHJpdi0+aWQuZGV2aWNlLT5nZXRfbmV0ZGV2KGlkX3ByaXYtPmlkLmRldmljZSwKIAkJCQkJCQkgICAgICBpZF9wcml2LT5pZC5wb3J0X251bSk7Ci0JCQlpZiAoIW5kZXYpCi0JCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlpZiAoIW5kZXYpIHsKKwkJCQlyZXQgPSAtRU5PREVWOworCQkJCWdvdG8gZXJyMjsKKwkJCX0KIAkJfQogCiAJCXJvdXRlLT5wYXRoX3JlYy0+bmV0ID0gJmluaXRfbmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbXVsdGljYXN0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tdWx0aWNhc3QuYwppbmRleCAzYTNjNWQ3Li41MWM3OWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tdWx0aWNhc3QuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tdWx0aWNhc3QuYwpAQCAtMTA2LDcgKzEwNiw2IEBACiAJYXRvbWljX3QJCXJlZmNvdW50OwogCWVudW0gbWNhc3RfZ3JvdXBfc3RhdGUJc3RhdGU7CiAJc3RydWN0IGliX3NhX3F1ZXJ5CSpxdWVyeTsKLQlpbnQJCQlxdWVyeV9pZDsKIAl1MTYJCQlwa2V5X2luZGV4OwogCXU4CQkJbGVhdmVfc3RhdGU7CiAJaW50CQkJcmV0cmllczsKQEAgLTM0MCwxMSArMzM5LDcgQEAKIAkJCQkgICAgICAgbWVtYmVyLT5tdWx0aWNhc3QuY29tcF9tYXNrLAogCQkJCSAgICAgICAzMDAwLCBHRlBfS0VSTkVMLCBqb2luX2hhbmRsZXIsIGdyb3VwLAogCQkJCSAgICAgICAmZ3JvdXAtPnF1ZXJ5KTsKLQlpZiAocmV0ID49IDApIHsKLQkJZ3JvdXAtPnF1ZXJ5X2lkID0gcmV0OwotCQlyZXQgPSAwOwotCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiAocmV0ID4gMCkgPyAwIDogcmV0OwogfQogCiBzdGF0aWMgaW50IHNlbmRfbGVhdmUoc3RydWN0IG1jYXN0X2dyb3VwICpncm91cCwgdTggbGVhdmVfc3RhdGUpCkBAIC0zNjQsMTEgKzM1OSw3IEBACiAJCQkJICAgICAgIElCX1NBX01DTUVNQkVSX1JFQ19KT0lOX1NUQVRFLAogCQkJCSAgICAgICAzMDAwLCBHRlBfS0VSTkVMLCBsZWF2ZV9oYW5kbGVyLAogCQkJCSAgICAgICBncm91cCwgJmdyb3VwLT5xdWVyeSk7Ci0JaWYgKHJldCA+PSAwKSB7Ci0JCWdyb3VwLT5xdWVyeV9pZCA9IHJldDsKLQkJcmV0ID0gMDsKLQl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gKHJldCA+IDApID8gMCA6IHJldDsKIH0KIAogc3RhdGljIHZvaWQgam9pbl9ncm91cChzdHJ1Y3QgbWNhc3RfZ3JvdXAgKmdyb3VwLCBzdHJ1Y3QgbWNhc3RfbWVtYmVyICptZW1iZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvS2NvbmZpZyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9LY29uZmlnCmluZGV4IDIzZjM4Y2YuLmFmZThiMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIElORklOSUJBTkRfQ1hHQjQKIAl0cmlzdGF0ZSAiQ2hlbHNpbyBUNC9UNSBSRE1BIERyaXZlciIKIAlkZXBlbmRzIG9uIENIRUxTSU9fVDQgJiYgSU5FVCAmJiAoSVBWNiB8fCBJUFY2PW4pCisJc2VsZWN0IENIRUxTSU9fTElCCiAJc2VsZWN0IEdFTkVSSUNfQUxMT0NBVE9SCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhbiBpV0FSUC9SRE1BIGRyaXZlciBmb3IgdGhlIENoZWxzaW8gVDQgYW5kIFQ1CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvTWFrZWZpbGUgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvTWFrZWZpbGUKaW5kZXggZTExY2Y3Mi4uZmE0MGI2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9NYWtlZmlsZQpAQCAtMSw0ICsxLDUgQEAKIGNjZmxhZ3MteSA6PSAtSWRyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vbGliY3hnYgogCiBvYmotJChDT05GSUdfSU5GSU5JQkFORF9DWEdCNCkgKz0gaXdfY3hnYjQubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jCmluZGV4IDNhY2E3ZjYuLjcxYzg4NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jCkBAIC00OSw2ICs0OSw3IEBACiAKICNpbmNsdWRlIDxyZG1hL2liX2FkZHIuaD4KIAorI2luY2x1ZGUgPGxpYmN4Z2JfY20uaD4KICNpbmNsdWRlICJpd19jeGdiNC5oIgogI2luY2x1ZGUgImNsaXBfdGJsLmgiCiAKQEAgLTIzOSwxNSArMjQwLDEzIEBACiAKIHN0YXRpYyB2b2lkIHJlbGVhc2VfdGlkKHN0cnVjdCBjNGl3X3JkZXYgKnJkZXYsIHUzMiBod3RpZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgY3BsX3RpZF9yZWxlYXNlICpyZXE7CisJdTMyIGxlbiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCBjcGxfdGlkX3JlbGVhc2UpLCAxNik7CiAKLQlza2IgPSBnZXRfc2tiKHNrYiwgc2l6ZW9mICpyZXEsIEdGUF9LRVJORUwpOworCXNrYiA9IGdldF9za2Ioc2tiLCBsZW4sIEdGUF9LRVJORUwpOwogCWlmICghc2tiKQogCQlyZXR1cm47Ci0JcmVxID0gKHN0cnVjdCBjcGxfdGlkX3JlbGVhc2UgKikgc2tiX3B1dChza2IsIHNpemVvZigqcmVxKSk7Ci0JSU5JVF9UUF9XUihyZXEsIGh3dGlkKTsKLQlPUENPREVfVElEKHJlcSkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9USURfUkVMRUFTRSwgaHd0aWQpKTsKLQlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX1NFVFVQLCAwKTsKKworCWN4Z2JfbWtfdGlkX3JlbGVhc2Uoc2tiLCBsZW4sIGh3dGlkLCAwKTsKIAljNGl3X29mbGRfc2VuZChyZGV2LCBza2IpOwogCXJldHVybjsKIH0KQEAgLTMzMyw2ICszMzIsOCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVwLT5jb20uZGV2LT5sb2NrLCBmbGFncyk7CiAJX3JlbW92ZV9oYW5kbGUoZXAtPmNvbS5kZXYsICZlcC0+Y29tLmRldi0+aHd0aWRfaWRyLCBlcC0+aHd0aWQsIDApOworCWlmIChpZHJfaXNfZW1wdHkoJmVwLT5jb20uZGV2LT5od3RpZF9pZHIpKQorCQl3YWtlX3VwKCZlcC0+Y29tLmRldi0+d2FpdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPmNvbS5kZXYtPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtNDY0LDcyICs0NjUsNiBAQAogCXJldHVybiByZG1hX3ZsYW5fZGV2X3JlYWxfZGV2KGVncmVzc19kZXYpID8gOiBlZ3Jlc3NfZGV2OwogfQogCi1zdGF0aWMgaW50IG91cl9pbnRlcmZhY2Uoc3RydWN0IGM0aXdfZGV2ICpkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICplZ3Jlc3NfZGV2KQotewotCWludCBpOwotCi0JZWdyZXNzX2RldiA9IGdldF9yZWFsX2RldihlZ3Jlc3NfZGV2KTsKLQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5yZGV2LmxsZGkubnBvcnRzOyBpKyspCi0JCWlmIChkZXYtPnJkZXYubGxkaS5wb3J0c1tpXSA9PSBlZ3Jlc3NfZGV2KQotCQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICpmaW5kX3JvdXRlNihzdHJ1Y3QgYzRpd19kZXYgKmRldiwgX191OCAqbG9jYWxfaXAsCi0JCQkJICAgICBfX3U4ICpwZWVyX2lwLCBfX2JlMTYgbG9jYWxfcG9ydCwKLQkJCQkgICAgIF9fYmUxNiBwZWVyX3BvcnQsIHU4IHRvcywKLQkJCQkgICAgIF9fdTMyIHNpbjZfc2NvcGVfaWQpCi17Ci0Jc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gTlVMTDsKLQotCWlmIChJU19FTkFCTEVEKENPTkZJR19JUFY2KSkgewotCQlzdHJ1Y3QgZmxvd2k2IGZsNjsKLQotCQltZW1zZXQoJmZsNiwgMCwgc2l6ZW9mKGZsNikpOwotCQltZW1jcHkoJmZsNi5kYWRkciwgcGVlcl9pcCwgMTYpOwotCQltZW1jcHkoJmZsNi5zYWRkciwgbG9jYWxfaXAsIDE2KTsKLQkJaWYgKGlwdjZfYWRkcl90eXBlKCZmbDYuZGFkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkKLQkJCWZsNi5mbG93aTZfb2lmID0gc2luNl9zY29wZV9pZDsKLQkJZHN0ID0gaXA2X3JvdXRlX291dHB1dCgmaW5pdF9uZXQsIE5VTEwsICZmbDYpOwotCQlpZiAoIWRzdCkKLQkJCWdvdG8gb3V0OwotCQlpZiAoIW91cl9pbnRlcmZhY2UoZGV2LCBpcDZfZHN0X2lkZXYoZHN0KS0+ZGV2KSAmJgotCQkgICAgIShpcDZfZHN0X2lkZXYoZHN0KS0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykpIHsKLQkJCWRzdF9yZWxlYXNlKGRzdCk7Ci0JCQlkc3QgPSBOVUxMOwotCQl9Ci0JfQotCi1vdXQ6Ci0JcmV0dXJuIGRzdDsKLX0KLQotc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgKmZpbmRfcm91dGUoc3RydWN0IGM0aXdfZGV2ICpkZXYsIF9fYmUzMiBsb2NhbF9pcCwKLQkJCQkgX19iZTMyIHBlZXJfaXAsIF9fYmUxNiBsb2NhbF9wb3J0LAotCQkJCSBfX2JlMTYgcGVlcl9wb3J0LCB1OCB0b3MpCi17Ci0Jc3RydWN0IHJ0YWJsZSAqcnQ7Ci0Jc3RydWN0IGZsb3dpNCBmbDQ7Ci0Jc3RydWN0IG5laWdoYm91ciAqbjsKLQotCXJ0ID0gaXBfcm91dGVfb3V0cHV0X3BvcnRzKCZpbml0X25ldCwgJmZsNCwgTlVMTCwgcGVlcl9pcCwgbG9jYWxfaXAsCi0JCQkJICAgcGVlcl9wb3J0LCBsb2NhbF9wb3J0LCBJUFBST1RPX1RDUCwKLQkJCQkgICB0b3MsIDApOwotCWlmIChJU19FUlIocnQpKQotCQlyZXR1cm4gTlVMTDsKLQluID0gZHN0X25laWdoX2xvb2t1cCgmcnQtPmRzdCwgJnBlZXJfaXApOwotCWlmICghbikKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFvdXJfaW50ZXJmYWNlKGRldiwgbi0+ZGV2KSAmJgotCSAgICAhKG4tPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKSB7Ci0JCW5laWdoX3JlbGVhc2Uobik7Ci0JCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW5laWdoX3JlbGVhc2Uobik7Ci0JcmV0dXJuICZydC0+ZHN0OwotfQotCiBzdGF0aWMgdm9pZCBhcnBfZmFpbHVyZV9kaXNjYXJkKHZvaWQgKmhhbmRsZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlwcl9lcnIoTU9EICJBUlAgZmFpbHVyZVxuIik7CkBAIC03MDQsNTggKzYzOSwzNCBAQAogCiBzdGF0aWMgaW50IHNlbmRfaGFsZmNsb3NlKHN0cnVjdCBjNGl3X2VwICplcCkKIHsKLQlzdHJ1Y3QgY3BsX2Nsb3NlX2Nvbl9yZXEgKnJlcTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2tiX2RlcXVldWUoJmVwLT5jb20uZXBfc2tiX2xpc3QpOwotCWludCB3cmxlbiA9IHJvdW5kdXAoc2l6ZW9mICpyZXEsIDE2KTsKKwl1MzIgd3JsZW4gPSByb3VuZHVwKHNpemVvZihzdHJ1Y3QgY3BsX2Nsb3NlX2Nvbl9yZXEpLCAxNik7CiAKIAlQREJHKCIlcyBlcCAlcCB0aWQgJXVcbiIsIF9fZnVuY19fLCBlcCwgZXAtPmh3dGlkKTsKIAlpZiAoV0FSTl9PTighc2tiKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0RBVEEsIGVwLT50eHFfaWR4KTsKLQl0NF9zZXRfYXJwX2Vycl9oYW5kbGVyKHNrYiwgTlVMTCwgYXJwX2ZhaWx1cmVfZGlzY2FyZCk7Ci0JcmVxID0gKHN0cnVjdCBjcGxfY2xvc2VfY29uX3JlcSAqKSBza2JfcHV0KHNrYiwgd3JsZW4pOwotCW1lbXNldChyZXEsIDAsIHdybGVuKTsKLQlJTklUX1RQX1dSKHJlcSwgZXAtPmh3dGlkKTsKLQlPUENPREVfVElEKHJlcSkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9DTE9TRV9DT05fUkVRLAotCQkJCQkJICAgIGVwLT5od3RpZCkpOworCWN4Z2JfbWtfY2xvc2VfY29uX3JlcShza2IsIHdybGVuLCBlcC0+aHd0aWQsIGVwLT50eHFfaWR4LAorCQkJICAgICAgTlVMTCwgYXJwX2ZhaWx1cmVfZGlzY2FyZCk7CisKIAlyZXR1cm4gYzRpd19sMnRfc2VuZCgmZXAtPmNvbS5kZXYtPnJkZXYsIHNrYiwgZXAtPmwydCk7CiB9CiAKIHN0YXRpYyBpbnQgc2VuZF9hYm9ydChzdHJ1Y3QgYzRpd19lcCAqZXApCiB7Ci0Jc3RydWN0IGNwbF9hYm9ydF9yZXEgKnJlcTsKLQlpbnQgd3JsZW4gPSByb3VuZHVwKHNpemVvZiAqcmVxLCAxNik7CisJdTMyIHdybGVuID0gcm91bmR1cChzaXplb2Yoc3RydWN0IGNwbF9hYm9ydF9yZXEpLCAxNik7CiAJc3RydWN0IHNrX2J1ZmYgKnJlcV9za2IgPSBza2JfZGVxdWV1ZSgmZXAtPmNvbS5lcF9za2JfbGlzdCk7CiAKIAlQREJHKCIlcyBlcCAlcCB0aWQgJXVcbiIsIF9fZnVuY19fLCBlcCwgZXAtPmh3dGlkKTsKIAlpZiAoV0FSTl9PTighcmVxX3NrYikpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc2V0X3dyX3R4cShyZXFfc2tiLCBDUExfUFJJT1JJVFlfREFUQSwgZXAtPnR4cV9pZHgpOwotCXQ0X3NldF9hcnBfZXJyX2hhbmRsZXIocmVxX3NrYiwgZXAsIGFib3J0X2FycF9mYWlsdXJlKTsKLQlyZXEgPSAoc3RydWN0IGNwbF9hYm9ydF9yZXEgKilza2JfcHV0KHJlcV9za2IsIHdybGVuKTsKLQltZW1zZXQocmVxLCAwLCB3cmxlbik7Ci0JSU5JVF9UUF9XUihyZXEsIGVwLT5od3RpZCk7Ci0JT1BDT0RFX1RJRChyZXEpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfQUJPUlRfUkVRLCBlcC0+aHd0aWQpKTsKLQlyZXEtPmNtZCA9IENQTF9BQk9SVF9TRU5EX1JTVDsKKwljeGdiX21rX2Fib3J0X3JlcShyZXFfc2tiLCB3cmxlbiwgZXAtPmh3dGlkLCBlcC0+dHhxX2lkeCwKKwkJCSAgZXAsIGFib3J0X2FycF9mYWlsdXJlKTsKKwogCXJldHVybiBjNGl3X2wydF9zZW5kKCZlcC0+Y29tLmRldi0+cmRldiwgcmVxX3NrYiwgZXAtPmwydCk7CiB9CiAKLXN0YXRpYyB2b2lkIGJlc3RfbXR1KGNvbnN0IHVuc2lnbmVkIHNob3J0ICptdHVzLCB1bnNpZ25lZCBzaG9ydCBtdHUsCi0JCSAgICAgdW5zaWduZWQgaW50ICppZHgsIGludCB1c2VfdHMsIGludCBpcHY2KQotewotCXVuc2lnbmVkIHNob3J0IGhkcl9zaXplID0gKGlwdjYgPwotCQkJCSAgIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgOgotCQkJCSAgIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSArCi0JCQkJICBzaXplb2Yoc3RydWN0IHRjcGhkcikgKwotCQkJCSAgKHVzZV90cyA/Ci0JCQkJICAgcm91bmRfdXAoVENQT0xFTl9USU1FU1RBTVAsIDQpIDogMCk7Ci0JdW5zaWduZWQgc2hvcnQgZGF0YV9zaXplID0gbXR1IC0gaGRyX3NpemU7Ci0KLQljeGdiNF9iZXN0X2FsaWduZWRfbXR1KG10dXMsIGhkcl9zaXplLCBkYXRhX3NpemUsIDgsIGlkeCk7Ci19Ci0KIHN0YXRpYyBpbnQgc2VuZF9jb25uZWN0KHN0cnVjdCBjNGl3X2VwICplcCkKIHsKIAlzdHJ1Y3QgY3BsX2FjdF9vcGVuX3JlcSAqcmVxID0gTlVMTDsKQEAgLTc2OCw3ICs2NzksNyBAQAogCXU2NCBvcHQwOwogCXUzMiBvcHQyOwogCXVuc2lnbmVkIGludCBtdHVfaWR4OwotCWludCB3c2NhbGU7CisJdTMyIHdzY2FsZTsKIAlpbnQgd2luLCBzaXpldjQsIHNpemV2Niwgd3JsZW47CiAJc3RydWN0IHNvY2thZGRyX2luICpsYSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikKIAkJCQkgJmVwLT5jb20ubG9jYWxfYWRkcjsKQEAgLTgxNSwxMCArNzI2LDEwIEBACiAJfQogCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfU0VUVVAsIGVwLT5jdHJscV9pZHgpOwogCi0JYmVzdF9tdHUoZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5tdHVzLCBlcC0+bXR1LCAmbXR1X2lkeCwKLQkJIGVuYWJsZV90Y3BfdGltZXN0YW1wcywKLQkJIChBRl9JTkVUID09IGVwLT5jb20ucmVtb3RlX2FkZHIuc3NfZmFtaWx5KSA/IDAgOiAxKTsKLQl3c2NhbGUgPSBjb21wdXRlX3dzY2FsZShyY3Zfd2luKTsKKwljeGdiX2Jlc3RfbXR1KGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubXR1cywgZXAtPm10dSwgJm10dV9pZHgsCisJCSAgICAgIGVuYWJsZV90Y3BfdGltZXN0YW1wcywKKwkJICAgICAgKGVwLT5jb20ucmVtb3RlX2FkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQpID8gMCA6IDEpOworCXdzY2FsZSA9IGN4Z2JfY29tcHV0ZV93c2NhbGUocmN2X3dpbik7CiAKIAkvKgogCSAqIFNwZWNpZnkgdGhlIGxhcmdlc3Qgd2luZG93IHRoYXQgd2lsbCBmaXQgaW4gb3B0MC4gVGhlCkBAIC0xNDQ1LDkgKzEzNTYsOSBAQAogCiBzdGF0aWMgaW50IHVwZGF0ZV9yeF9jcmVkaXRzKHN0cnVjdCBjNGl3X2VwICplcCwgdTMyIGNyZWRpdHMpCiB7Ci0Jc3RydWN0IGNwbF9yeF9kYXRhX2FjayAqcmVxOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IHdybGVuID0gcm91bmR1cChzaXplb2YgKnJlcSwgMTYpOworCXUzMiB3cmxlbiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCBjcGxfcnhfZGF0YV9hY2spLCAxNik7CisJdTMyIGNyZWRpdF9kYWNrOwogCiAJUERCRygiJXMgZXAgJXAgdGlkICV1IGNyZWRpdHMgJXVcbiIsIF9fZnVuY19fLCBlcCwgZXAtPmh3dGlkLCBjcmVkaXRzKTsKIAlza2IgPSBnZXRfc2tiKE5VTEwsIHdybGVuLCBHRlBfS0VSTkVMKTsKQEAgLTE0NjQsMTUgKzEzNzUsMTIgQEAKIAlpZiAoZXAtPnJjdl93aW4gPiBSQ1ZfQlVGU0laX00gKiAxMDI0KQogCQljcmVkaXRzICs9IGVwLT5yY3Zfd2luIC0gUkNWX0JVRlNJWl9NICogMTAyNDsKIAotCXJlcSA9IChzdHJ1Y3QgY3BsX3J4X2RhdGFfYWNrICopIHNrYl9wdXQoc2tiLCB3cmxlbik7Ci0JbWVtc2V0KHJlcSwgMCwgd3JsZW4pOwotCUlOSVRfVFBfV1IocmVxLCBlcC0+aHd0aWQpOwotCU9QQ09ERV9USUQocmVxKSA9IGNwdV90b19iZTMyKE1LX09QQ09ERV9USUQoQ1BMX1JYX0RBVEFfQUNLLAotCQkJCQkJICAgIGVwLT5od3RpZCkpOwotCXJlcS0+Y3JlZGl0X2RhY2sgPSBjcHVfdG9fYmUzMihjcmVkaXRzIHwgUlhfRk9SQ0VfQUNLX0YgfAotCQkJCSAgICAgICBSWF9EQUNLX0NIQU5HRV9GIHwKLQkJCQkgICAgICAgUlhfREFDS19NT0RFX1YoZGFja19tb2RlKSk7Ci0Jc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9BQ0ssIGVwLT5jdHJscV9pZHgpOworCWNyZWRpdF9kYWNrID0gY3JlZGl0cyB8IFJYX0ZPUkNFX0FDS19GIHwgUlhfREFDS19DSEFOR0VfRiB8CisJCSAgICAgIFJYX0RBQ0tfTU9ERV9WKGRhY2tfbW9kZSk7CisKKwljeGdiX21rX3J4X2RhdGFfYWNrKHNrYiwgd3JsZW4sIGVwLT5od3RpZCwgZXAtPmN0cmxxX2lkeCwKKwkJCSAgICBjcmVkaXRfZGFjayk7CisKIAljNGl3X29mbGRfc2VuZCgmZXAtPmNvbS5kZXYtPnJkZXYsIHNrYik7CiAJcmV0dXJuIGNyZWRpdHM7CiB9CkBAIC0xODI3LDggKzE3MzUsMTIgQEAKIAkJCQkoZXAtPm1wYV9wa3QgKyBzaXplb2YoKm1wYSkpOwogCQkJZXAtPmlyZCA9IG50b2hzKG1wYV92Ml9wYXJhbXMtPmlyZCkgJgogCQkJCU1QQV9WMl9JUkRfT1JEX01BU0s7CisJCQllcC0+aXJkID0gbWluX3QodTMyLCBlcC0+aXJkLAorCQkJCQljdXJfbWF4X3JlYWRfZGVwdGgoZXAtPmNvbS5kZXYpKTsKIAkJCWVwLT5vcmQgPSBudG9ocyhtcGFfdjJfcGFyYW1zLT5vcmQpICYKIAkJCQlNUEFfVjJfSVJEX09SRF9NQVNLOworCQkJZXAtPm9yZCA9IG1pbl90KHUzMiwgZXAtPm9yZCwKKwkJCQkJY3VyX21heF9yZWFkX2RlcHRoKGVwLT5jb20uZGV2KSk7CiAJCQlQREJHKCIlcyBpbml0aWF0b3IgaXJkICV1IG9yZCAldVxuIiwgX19mdW5jX18sIGVwLT5pcmQsCiAJCQkgICAgIGVwLT5vcmQpOwogCQkJaWYgKG50b2hzKG1wYV92Ml9wYXJhbXMtPmlyZCkgJiBNUEFfVjJfUEVFUjJQRUVSX01PREVMKQpAQCAtMTk2Niw3ICsxODc4LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBmd19vZmxkX2Nvbm5lY3Rpb25fd3IgKnJlcTsKIAl1bnNpZ25lZCBpbnQgbXR1X2lkeDsKLQlpbnQgd3NjYWxlOworCXUzMiB3c2NhbGU7CiAJc3RydWN0IHNvY2thZGRyX2luICpzaW47CiAJaW50IHdpbjsKIApAQCAtMTk5MSwxMCArMTkwMywxMCBAQAogCQkJaHRvbnMoRldfT0ZMRF9DT05ORUNUSU9OX1dSX0NQTFJYREFUQUFDS19GKTsKIAlyZXEtPnRjYi50eF9tYXggPSAoX19mb3JjZSBfX2JlMzIpIGppZmZpZXM7CiAJcmVxLT50Y2IucmN2X2FkdiA9IGh0b25zKDEpOwotCWJlc3RfbXR1KGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubXR1cywgZXAtPm10dSwgJm10dV9pZHgsCi0JCSBlbmFibGVfdGNwX3RpbWVzdGFtcHMsCi0JCSAoQUZfSU5FVCA9PSBlcC0+Y29tLnJlbW90ZV9hZGRyLnNzX2ZhbWlseSkgPyAwIDogMSk7Ci0Jd3NjYWxlID0gY29tcHV0ZV93c2NhbGUocmN2X3dpbik7CisJY3hnYl9iZXN0X210dShlcC0+Y29tLmRldi0+cmRldi5sbGRpLm10dXMsIGVwLT5tdHUsICZtdHVfaWR4LAorCQkgICAgICBlbmFibGVfdGNwX3RpbWVzdGFtcHMsCisJCSAgICAgIChlcC0+Y29tLnJlbW90ZV9hZGRyLnNzX2ZhbWlseSA9PSBBRl9JTkVUKSA/IDAgOiAxKTsKKwl3c2NhbGUgPSBjeGdiX2NvbXB1dGVfd3NjYWxlKHJjdl93aW4pOwogCiAJLyoKIAkgKiBTcGVjaWZ5IHRoZSBsYXJnZXN0IHdpbmRvdyB0aGF0IHdpbGwgZml0IGluIG9wdDAuIFRoZQpAQCAtMjA0OCwxNSArMTk2MCw2IEBACiAJCXN0YXR1cyAhPSBDUExfRVJSX0NPTk5fRVhJU1QpOwogfQogCi0vKiBSZXR1cm5zIHdoZXRoZXIgYSBDUEwgc3RhdHVzIGNvbnZleXMgbmVnYXRpdmUgYWR2aWNlLgotICovCi1zdGF0aWMgaW50IGlzX25lZ19hZHYodW5zaWduZWQgaW50IHN0YXR1cykKLXsKLQlyZXR1cm4gc3RhdHVzID09IENQTF9FUlJfUlRYX05FR19BRFZJQ0UgfHwKLQkgICAgICAgc3RhdHVzID09IENQTF9FUlJfUEVSU0lTVF9ORUdfQURWSUNFIHx8Ci0JICAgICAgIHN0YXR1cyA9PSBDUExfRVJSX0tFRVBBTFZfTkVHX0FEVklDRTsKLX0KLQogc3RhdGljIGNoYXIgKm5lZ19hZHZfc3RyKHVuc2lnbmVkIGludCBzdGF0dXMpCiB7CiAJc3dpdGNoIChzdGF0dXMpIHsKQEAgLTIxMTMsOCArMjAxNiwxMCBAQAogCQl9CiAJCWVwLT5sMnQgPSBjeGdiNF9sMnRfZ2V0KGNkZXYtPnJkZXYubGxkaS5sMnQsCiAJCQkJCW4sIHBkZXYsIHJ0X3RvczJwcmlvcml0eSh0b3MpKTsKLQkJaWYgKCFlcC0+bDJ0KQorCQlpZiAoIWVwLT5sMnQpIHsKKwkJCWRldl9wdXQocGRldik7CiAJCQlnb3RvIG91dDsKKwkJfQogCQllcC0+bXR1ID0gcGRldi0+bXR1OwogCQllcC0+dHhfY2hhbiA9IGN4Z2I0X3BvcnRfY2hhbihwZGV2KTsKIAkJZXAtPnNtYWNfaWR4ID0gY3hnYjRfdHBfc210X2lkeChhZGFwdGVyX3R5cGUsCkBAIC0yMjEwLDE2ICsyMTE1LDIxIEBACiAKIAkvKiBmaW5kIGEgcm91dGUgKi8KIAlpZiAoZXAtPmNvbS5jbV9pZC0+bV9sb2NhbF9hZGRyLnNzX2ZhbWlseSA9PSBBRl9JTkVUKSB7Ci0JCWVwLT5kc3QgPSBmaW5kX3JvdXRlKGVwLT5jb20uZGV2LCBsYWRkci0+c2luX2FkZHIuc19hZGRyLAotCQkJCSAgICAgcmFkZHItPnNpbl9hZGRyLnNfYWRkciwgbGFkZHItPnNpbl9wb3J0LAotCQkJCSAgICAgcmFkZHItPnNpbl9wb3J0LCBlcC0+Y29tLmNtX2lkLT50b3MpOworCQllcC0+ZHN0ID0gY3hnYl9maW5kX3JvdXRlKCZlcC0+Y29tLmRldi0+cmRldi5sbGRpLCBnZXRfcmVhbF9kZXYsCisJCQkJCSAgbGFkZHItPnNpbl9hZGRyLnNfYWRkciwKKwkJCQkJICByYWRkci0+c2luX2FkZHIuc19hZGRyLAorCQkJCQkgIGxhZGRyLT5zaW5fcG9ydCwKKwkJCQkJICByYWRkci0+c2luX3BvcnQsIGVwLT5jb20uY21faWQtPnRvcyk7CiAJCWlwdHlwZSA9IDQ7CiAJCXJhID0gKF9fdTggKikmcmFkZHItPnNpbl9hZGRyOwogCX0gZWxzZSB7Ci0JCWVwLT5kc3QgPSBmaW5kX3JvdXRlNihlcC0+Y29tLmRldiwgbGFkZHI2LT5zaW42X2FkZHIuczZfYWRkciwKLQkJCQkgICAgICByYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAotCQkJCSAgICAgIGxhZGRyNi0+c2luNl9wb3J0LCByYWRkcjYtPnNpbjZfcG9ydCwgMCwKLQkJCQkgICAgICByYWRkcjYtPnNpbjZfc2NvcGVfaWQpOworCQllcC0+ZHN0ID0gY3hnYl9maW5kX3JvdXRlNigmZXAtPmNvbS5kZXYtPnJkZXYubGxkaSwKKwkJCQkJICAgZ2V0X3JlYWxfZGV2LAorCQkJCQkgICBsYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAorCQkJCQkgICByYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAorCQkJCQkgICBsYWRkcjYtPnNpbjZfcG9ydCwKKwkJCQkJICAgcmFkZHI2LT5zaW42X3BvcnQsIDAsCisJCQkJCSAgIHJhZGRyNi0+c2luNl9zY29wZV9pZCk7CiAJCWlwdHlwZSA9IDY7CiAJCXJhID0gKF9fdTggKikmcmFkZHI2LT5zaW42X2FkZHI7CiAJfQpAQCAtMjI5MSw3ICsyMjAxLDcgQEAKIAlQREJHKCIlcyBlcCAlcCBhdGlkICV1IHN0YXR1cyAldSBlcnJubyAlZFxuIiwgX19mdW5jX18sIGVwLCBhdGlkLAogCSAgICAgc3RhdHVzLCBzdGF0dXMyZXJybm8oc3RhdHVzKSk7CiAKLQlpZiAoaXNfbmVnX2FkdihzdGF0dXMpKSB7CisJaWYgKGN4Z2JfaXNfbmVnX2FkdihzdGF0dXMpKSB7CiAJCVBEQkcoIiVzIENvbm5lY3Rpb24gcHJvYmxlbXMgZm9yIGF0aWQgJXUgc3RhdHVzICV1ICglcylcbiIsCiAJCSAgICAgX19mdW5jX18sIGF0aWQsIHN0YXR1cywgbmVnX2Fkdl9zdHIoc3RhdHVzKSk7CiAJCWVwLT5zdGF0cy5jb25uZWN0X25lZ19hZHYrKzsKQEAgLTI0MTgsNyArMjMyOCw3IEBACiAJdW5zaWduZWQgaW50IG10dV9pZHg7CiAJdTY0IG9wdDA7CiAJdTMyIG9wdDI7Ci0JaW50IHdzY2FsZTsKKwl1MzIgd3NjYWxlOwogCXN0cnVjdCBjcGxfdDVfcGFzc19hY2NlcHRfcnBsICpycGw1ID0gTlVMTDsKIAlpbnQgd2luOwogCWVudW0gY2hpcF90eXBlIGFkYXB0ZXJfdHlwZSA9IGVwLT5jb20uZGV2LT5yZGV2LmxsZGkuYWRhcHRlcl90eXBlOwpAQCAtMjQzOSwxMCArMjM0OSwxMCBAQAogCU9QQ09ERV9USUQocnBsKSA9IGNwdV90b19iZTMyKE1LX09QQ09ERV9USUQoQ1BMX1BBU1NfQUNDRVBUX1JQTCwKIAkJCQkJCSAgICBlcC0+aHd0aWQpKTsKIAotCWJlc3RfbXR1KGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubXR1cywgZXAtPm10dSwgJm10dV9pZHgsCi0JCSBlbmFibGVfdGNwX3RpbWVzdGFtcHMgJiYgcmVxLT50Y3BvcHQudHN0YW1wLAotCQkgKEFGX0lORVQgPT0gZXAtPmNvbS5yZW1vdGVfYWRkci5zc19mYW1pbHkpID8gMCA6IDEpOwotCXdzY2FsZSA9IGNvbXB1dGVfd3NjYWxlKHJjdl93aW4pOworCWN4Z2JfYmVzdF9tdHUoZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5tdHVzLCBlcC0+bXR1LCAmbXR1X2lkeCwKKwkJICAgICAgZW5hYmxlX3RjcF90aW1lc3RhbXBzICYmIHJlcS0+dGNwb3B0LnRzdGFtcCwKKwkJICAgICAgKGVwLT5jb20ucmVtb3RlX2FkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQpID8gMCA6IDEpOworCXdzY2FsZSA9IGN4Z2JfY29tcHV0ZV93c2NhbGUocmN2X3dpbik7CiAKIAkvKgogCSAqIFNwZWNpZnkgdGhlIGxhcmdlc3Qgd2luZG93IHRoYXQgd2lsbCBmaXQgaW4gb3B0MC4gVGhlCkBAIC0yNTE0LDQyICsyNDI0LDYgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkIGdldF80dHVwbGUoc3RydWN0IGNwbF9wYXNzX2FjY2VwdF9yZXEgKnJlcSwgZW51bSBjaGlwX3R5cGUgdHlwZSwKLQkJICAgICAgIGludCAqaXB0eXBlLCBfX3U4ICpsb2NhbF9pcCwgX191OCAqcGVlcl9pcCwKLQkJICAgICAgIF9fYmUxNiAqbG9jYWxfcG9ydCwgX19iZTE2ICpwZWVyX3BvcnQpCi17Ci0JaW50IGV0aF9sZW4gPSAoQ0hFTFNJT19DSElQX1ZFUlNJT04odHlwZSkgPD0gQ0hFTFNJT19UNSkgPwotCQkgICAgICBFVEhfSERSX0xFTl9HKGJlMzJfdG9fY3B1KHJlcS0+aGRyX2xlbikpIDoKLQkJICAgICAgVDZfRVRIX0hEUl9MRU5fRyhiZTMyX3RvX2NwdShyZXEtPmhkcl9sZW4pKTsKLQlpbnQgaXBfbGVuID0gKENIRUxTSU9fQ0hJUF9WRVJTSU9OKHR5cGUpIDw9IENIRUxTSU9fVDUpID8KLQkJICAgICBJUF9IRFJfTEVOX0coYmUzMl90b19jcHUocmVxLT5oZHJfbGVuKSkgOgotCQkgICAgIFQ2X0lQX0hEUl9MRU5fRyhiZTMyX3RvX2NwdShyZXEtPmhkcl9sZW4pKTsKLQlzdHJ1Y3QgaXBoZHIgKmlwID0gKHN0cnVjdCBpcGhkciAqKSgodTggKikocmVxICsgMSkgKyBldGhfbGVuKTsKLQlzdHJ1Y3QgaXB2NmhkciAqaXA2ID0gKHN0cnVjdCBpcHY2aGRyICopKCh1OCAqKShyZXEgKyAxKSArIGV0aF9sZW4pOwotCXN0cnVjdCB0Y3BoZHIgKnRjcCA9IChzdHJ1Y3QgdGNwaGRyICopCi0JCQkgICAgICgodTggKikocmVxICsgMSkgKyBldGhfbGVuICsgaXBfbGVuKTsKLQotCWlmIChpcC0+dmVyc2lvbiA9PSA0KSB7Ci0JCVBEQkcoIiVzIHNhZGRyIDB4JXggZGFkZHIgMHgleCBzcG9ydCAldSBkcG9ydCAldVxuIiwgX19mdW5jX18sCi0JCSAgICAgbnRvaGwoaXAtPnNhZGRyKSwgbnRvaGwoaXAtPmRhZGRyKSwgbnRvaHModGNwLT5zb3VyY2UpLAotCQkgICAgIG50b2hzKHRjcC0+ZGVzdCkpOwotCQkqaXB0eXBlID0gNDsKLQkJbWVtY3B5KHBlZXJfaXAsICZpcC0+c2FkZHIsIDQpOwotCQltZW1jcHkobG9jYWxfaXAsICZpcC0+ZGFkZHIsIDQpOwotCX0gZWxzZSB7Ci0JCVBEQkcoIiVzIHNhZGRyICVwSTYgZGFkZHIgJXBJNiBzcG9ydCAldSBkcG9ydCAldVxuIiwgX19mdW5jX18sCi0JCSAgICAgaXA2LT5zYWRkci5zNl9hZGRyLCBpcDYtPmRhZGRyLnM2X2FkZHIsIG50b2hzKHRjcC0+c291cmNlKSwKLQkJICAgICBudG9ocyh0Y3AtPmRlc3QpKTsKLQkJKmlwdHlwZSA9IDY7Ci0JCW1lbWNweShwZWVyX2lwLCBpcDYtPnNhZGRyLnM2X2FkZHIsIDE2KTsKLQkJbWVtY3B5KGxvY2FsX2lwLCBpcDYtPmRhZGRyLnM2X2FkZHIsIDE2KTsKLQl9Ci0JKnBlZXJfcG9ydCA9IHRjcC0+c291cmNlOwotCSpsb2NhbF9wb3J0ID0gdGNwLT5kZXN0OwotCi0JcmV0dXJuOwotfQotCiBzdGF0aWMgaW50IHBhc3NfYWNjZXB0X3JlcShzdHJ1Y3QgYzRpd19kZXYgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgYzRpd19lcCAqY2hpbGRfZXAgPSBOVUxMLCAqcGFyZW50X2VwOwpAQCAtMjU3OCw4ICsyNDUyLDggQEAKIAkJZ290byByZWplY3Q7CiAJfQogCi0JZ2V0XzR0dXBsZShyZXEsIHBhcmVudF9lcC0+Y29tLmRldi0+cmRldi5sbGRpLmFkYXB0ZXJfdHlwZSwgJmlwdHlwZSwKLQkJICAgbG9jYWxfaXAsIHBlZXJfaXAsICZsb2NhbF9wb3J0LCAmcGVlcl9wb3J0KTsKKwljeGdiX2dldF80dHVwbGUocmVxLCBwYXJlbnRfZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5hZGFwdGVyX3R5cGUsCisJCQkmaXB0eXBlLCBsb2NhbF9pcCwgcGVlcl9pcCwgJmxvY2FsX3BvcnQsICZwZWVyX3BvcnQpOwogCiAJLyogRmluZCBvdXRwdXQgcm91dGUgKi8KIAlpZiAoaXB0eXBlID09IDQpICB7CkBAIC0yNTg3LDE4ICsyNDYxLDE5IEBACiAJCSAgICAgLCBfX2Z1bmNfXywgcGFyZW50X2VwLCBod3RpZCwKIAkJICAgICBsb2NhbF9pcCwgcGVlcl9pcCwgbnRvaHMobG9jYWxfcG9ydCksCiAJCSAgICAgbnRvaHMocGVlcl9wb3J0KSwgcGVlcl9tc3MpOwotCQlkc3QgPSBmaW5kX3JvdXRlKGRldiwgKihfX2JlMzIgKilsb2NhbF9pcCwgKihfX2JlMzIgKilwZWVyX2lwLAotCQkJCSBsb2NhbF9wb3J0LCBwZWVyX3BvcnQsCi0JCQkJIHRvcyk7CisJCWRzdCA9IGN4Z2JfZmluZF9yb3V0ZSgmZGV2LT5yZGV2LmxsZGksIGdldF9yZWFsX2RldiwKKwkJCQkgICAgICAqKF9fYmUzMiAqKWxvY2FsX2lwLCAqKF9fYmUzMiAqKXBlZXJfaXAsCisJCQkJICAgICAgbG9jYWxfcG9ydCwgcGVlcl9wb3J0LCB0b3MpOwogCX0gZWxzZSB7CiAJCVBEQkcoIiVzIHBhcmVudCBlcCAlcCBod3RpZCAldSBsYWRkciAlcEk2IHJhZGRyICVwSTYgbHBvcnQgJWQgcnBvcnQgJWQgcGVlcl9tc3MgJWRcbiIKIAkJICAgICAsIF9fZnVuY19fLCBwYXJlbnRfZXAsIGh3dGlkLAogCQkgICAgIGxvY2FsX2lwLCBwZWVyX2lwLCBudG9ocyhsb2NhbF9wb3J0KSwKIAkJICAgICBudG9ocyhwZWVyX3BvcnQpLCBwZWVyX21zcyk7Ci0JCWRzdCA9IGZpbmRfcm91dGU2KGRldiwgbG9jYWxfaXAsIHBlZXJfaXAsIGxvY2FsX3BvcnQsIHBlZXJfcG9ydCwKLQkJCQkgIFBBU1NfT1BFTl9UT1NfRyhudG9obChyZXEtPnRvc19zdGlkKSksCi0JCQkJICAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikKLQkJCQkgICZwYXJlbnRfZXAtPmNvbS5sb2NhbF9hZGRyKS0+c2luNl9zY29wZV9pZCk7CisJCWRzdCA9IGN4Z2JfZmluZF9yb3V0ZTYoJmRldi0+cmRldi5sbGRpLCBnZXRfcmVhbF9kZXYsCisJCQkJbG9jYWxfaXAsIHBlZXJfaXAsIGxvY2FsX3BvcnQsIHBlZXJfcG9ydCwKKwkJCQlQQVNTX09QRU5fVE9TX0cobnRvaGwocmVxLT50b3Nfc3RpZCkpLAorCQkJCSgoc3RydWN0IHNvY2thZGRyX2luNiAqKQorCQkJCSAmcGFyZW50X2VwLT5jb20ubG9jYWxfYWRkciktPnNpbjZfc2NvcGVfaWQpOwogCX0KIAlpZiAoIWRzdCkgewogCQlwcmludGsoS0VSTl9FUlIgTU9EICIlcyAtIGZhaWxlZCB0byBmaW5kIGRzdCBlbnRyeSFcbiIsCkBAIC0yODMxLDE4ICsyNzA2LDE4IEBACiB7CiAJc3RydWN0IGNwbF9hYm9ydF9yZXFfcnNzICpyZXEgPSBjcGxoZHIoc2tiKTsKIAlzdHJ1Y3QgYzRpd19lcCAqZXA7Ci0Jc3RydWN0IGNwbF9hYm9ydF9ycGwgKnJwbDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcnBsX3NrYjsKIAlzdHJ1Y3QgYzRpd19xcF9hdHRyaWJ1dGVzIGF0dHJzOwogCWludCByZXQ7CiAJaW50IHJlbGVhc2UgPSAwOwogCXVuc2lnbmVkIGludCB0aWQgPSBHRVRfVElEKHJlcSk7CisJdTMyIGxlbiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCBjcGxfYWJvcnRfcnBsKSwgMTYpOwogCiAJZXAgPSBnZXRfZXBfZnJvbV90aWQoZGV2LCB0aWQpOwogCWlmICghZXApCiAJCXJldHVybiAwOwogCi0JaWYgKGlzX25lZ19hZHYocmVxLT5zdGF0dXMpKSB7CisJaWYgKGN4Z2JfaXNfbmVnX2FkdihyZXEtPnN0YXR1cykpIHsKIAkJUERCRygiJXMgTmVnYXRpdmUgYWR2aWNlIG9uIGFib3J0LSB0aWQgJXUgc3RhdHVzICVkICglcylcbiIsCiAJCSAgICAgX19mdW5jX18sIGVwLT5od3RpZCwgcmVxLT5zdGF0dXMsCiAJCSAgICAgbmVnX2Fkdl9zdHIocmVxLT5zdGF0dXMpKTsKQEAgLTI5MzUsMTEgKzI4MTAsOSBAQAogCQlyZWxlYXNlID0gMTsKIAkJZ290byBvdXQ7CiAJfQotCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfREFUQSwgZXAtPnR4cV9pZHgpOwotCXJwbCA9IChzdHJ1Y3QgY3BsX2Fib3J0X3JwbCAqKSBza2JfcHV0KHJwbF9za2IsIHNpemVvZigqcnBsKSk7Ci0JSU5JVF9UUF9XUihycGwsIGVwLT5od3RpZCk7Ci0JT1BDT0RFX1RJRChycGwpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfQUJPUlRfUlBMLCBlcC0+aHd0aWQpKTsKLQlycGwtPmNtZCA9IENQTF9BQk9SVF9OT19SU1Q7CisKKwljeGdiX21rX2Fib3J0X3JwbChycGxfc2tiLCBsZW4sIGVwLT5od3RpZCwgZXAtPnR4cV9pZHgpOworCiAJYzRpd19vZmxkX3NlbmQoJmVwLT5jb20uZGV2LT5yZGV2LCBycGxfc2tiKTsKIG91dDoKIAlpZiAocmVsZWFzZSkKQEAgLTMxMzYsNyArMzAwOSw3IEBACiAJaWYgKGVwLT5tcGFfYXR0ci52ZXJzaW9uID09IDIgJiYgZXAtPm1wYV9hdHRyLmVuaGFuY2VkX3JkbWFfY29ubikgewogCQlpZiAoY29ubl9wYXJhbS0+b3JkID4gZXAtPmlyZCkgewogCQkJaWYgKFJFTEFYRURfSVJEX05FR09USUFUSU9OKSB7Ci0JCQkJZXAtPm9yZCA9IGVwLT5pcmQ7CisJCQkJY29ubl9wYXJhbS0+b3JkID0gZXAtPmlyZDsKIAkJCX0gZWxzZSB7CiAJCQkJZXAtPmlyZCA9IGNvbm5fcGFyYW0tPmlyZDsKIAkJCQllcC0+b3JkID0gY29ubl9wYXJhbS0+b3JkOwpAQCAtMzM3MSw5ICszMjQ0LDExIEBACiAJCVBEQkcoIiVzIHNhZGRyICVwSTQgc3BvcnQgMHgleCByYWRkciAlcEk0IHJwb3J0IDB4JXhcbiIsCiAJCSAgICAgX19mdW5jX18sICZsYWRkci0+c2luX2FkZHIsIG50b2hzKGxhZGRyLT5zaW5fcG9ydCksCiAJCSAgICAgcmEsIG50b2hzKHJhZGRyLT5zaW5fcG9ydCkpOwotCQllcC0+ZHN0ID0gZmluZF9yb3V0ZShkZXYsIGxhZGRyLT5zaW5fYWRkci5zX2FkZHIsCi0JCQkJICAgICByYWRkci0+c2luX2FkZHIuc19hZGRyLCBsYWRkci0+c2luX3BvcnQsCi0JCQkJICAgICByYWRkci0+c2luX3BvcnQsIGNtX2lkLT50b3MpOworCQllcC0+ZHN0ID0gY3hnYl9maW5kX3JvdXRlKCZkZXYtPnJkZXYubGxkaSwgZ2V0X3JlYWxfZGV2LAorCQkJCQkgIGxhZGRyLT5zaW5fYWRkci5zX2FkZHIsCisJCQkJCSAgcmFkZHItPnNpbl9hZGRyLnNfYWRkciwKKwkJCQkJICBsYWRkci0+c2luX3BvcnQsCisJCQkJCSAgcmFkZHItPnNpbl9wb3J0LCBjbV9pZC0+dG9zKTsKIAl9IGVsc2UgewogCQlpcHR5cGUgPSA2OwogCQlyYSA9IChfX3U4ICopJnJhZGRyNi0+c2luNl9hZGRyOwpAQCAtMzM5MiwxMCArMzI2NywxMiBAQAogCQkgICAgIF9fZnVuY19fLCBsYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAogCQkgICAgIG50b2hzKGxhZGRyNi0+c2luNl9wb3J0KSwKIAkJICAgICByYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLCBudG9ocyhyYWRkcjYtPnNpbjZfcG9ydCkpOwotCQllcC0+ZHN0ID0gZmluZF9yb3V0ZTYoZGV2LCBsYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAotCQkJCSAgICAgIHJhZGRyNi0+c2luNl9hZGRyLnM2X2FkZHIsCi0JCQkJICAgICAgbGFkZHI2LT5zaW42X3BvcnQsIHJhZGRyNi0+c2luNl9wb3J0LCAwLAotCQkJCSAgICAgIHJhZGRyNi0+c2luNl9zY29wZV9pZCk7CisJCWVwLT5kc3QgPSBjeGdiX2ZpbmRfcm91dGU2KCZkZXYtPnJkZXYubGxkaSwgZ2V0X3JlYWxfZGV2LAorCQkJCQkgICBsYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAorCQkJCQkgICByYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAorCQkJCQkgICBsYWRkcjYtPnNpbjZfcG9ydCwKKwkJCQkJICAgcmFkZHI2LT5zaW42X3BvcnQsIDAsCisJCQkJCSAgIHJhZGRyNi0+c2luNl9zY29wZV9pZCk7CiAJfQogCWlmICghZXAtPmRzdCkgewogCQlwcmludGsoS0VSTl9FUlIgTU9EICIlcyAtIGNhbm5vdCBmaW5kIHJvdXRlLlxuIiwgX19mdW5jX18pOwpAQCAtNDAzNyw4ICszOTE0LDkgQEAKIAkgICAgIG50b2hsKGlwaC0+ZGFkZHIpLCBudG9ocyh0Y3BoLT5kZXN0KSwgbnRvaGwoaXBoLT5zYWRkciksCiAJICAgICBudG9ocyh0Y3BoLT5zb3VyY2UpLCBpcGgtPnRvcyk7CiAKLQlkc3QgPSBmaW5kX3JvdXRlKGRldiwgaXBoLT5kYWRkciwgaXBoLT5zYWRkciwgdGNwaC0+ZGVzdCwgdGNwaC0+c291cmNlLAotCQkJIGlwaC0+dG9zKTsKKwlkc3QgPSBjeGdiX2ZpbmRfcm91dGUoJmRldi0+cmRldi5sbGRpLCBnZXRfcmVhbF9kZXYsCisJCQkgICAgICBpcGgtPmRhZGRyLCBpcGgtPnNhZGRyLCB0Y3BoLT5kZXN0LAorCQkJICAgICAgdGNwaC0+c291cmNlLCBpcGgtPnRvcyk7CiAJaWYgKCFkc3QpIHsKIAkJcHJfZXJyKCIlcyAtIGZhaWxlZCB0byBmaW5kIGRzdCBlbnRyeSFcbiIsCiAJCSAgICAgICBfX2Z1bmNfXyk7CkBAIC00MzEzLDcgKzQxOTEsNyBAQAogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIDA7CiAJfQotCWlmIChpc19uZWdfYWR2KHJlcS0+c3RhdHVzKSkgeworCWlmIChjeGdiX2lzX25lZ19hZHYocmVxLT5zdGF0dXMpKSB7CiAJCVBEQkcoIiVzIE5lZ2F0aXZlIGFkdmljZSBvbiBhYm9ydC0gdGlkICV1IHN0YXR1cyAlZCAoJXMpXG4iLAogCQkgICAgIF9fZnVuY19fLCBlcC0+aHd0aWQsIHJlcS0+c3RhdHVzLAogCQkgICAgIG5lZ19hZHZfc3RyKHJlcS0+c3RhdHVzKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY3EuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jcS5jCmluZGV4IDgxMmFiNzIuLmFjOTI2YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jcS5jCkBAIC0xMDE2LDE1ICsxMDE2LDE1IEBACiBpbnQgYzRpd19hcm1fY3Eoc3RydWN0IGliX2NxICppYmNxLCBlbnVtIGliX2NxX25vdGlmeV9mbGFncyBmbGFncykKIHsKIAlzdHJ1Y3QgYzRpd19jcSAqY2hwOwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnOwogCiAJY2hwID0gdG9fYzRpd19jcShpYmNxKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hwLT5sb2NrLCBmbGFnKTsKLQlyZXQgPSB0NF9hcm1fY3EoJmNocC0+Y3EsCi0JCQkoZmxhZ3MgJiBJQl9DUV9TT0xJQ0lURURfTUFTSykgPT0gSUJfQ1FfU09MSUNJVEVEKTsKKwl0NF9hcm1fY3EoJmNocC0+Y3EsCisJCSAgKGZsYWdzICYgSUJfQ1FfU09MSUNJVEVEX01BU0spID09IElCX0NRX1NPTElDSVRFRCk7CisJaWYgKGZsYWdzICYgSUJfQ1FfUkVQT1JUX01JU1NFRF9FVkVOVFMpCisJCXJldCA9IHQ0X2NxX25vdGVtcHR5KCZjaHAtPmNxKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaHAtPmxvY2ssIGZsYWcpOwotCWlmIChyZXQgJiYgIShmbGFncyAmIElCX0NRX1JFUE9SVF9NSVNTRURfRVZFTlRTKSkKLQkJcmV0ID0gMDsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2RldmljZS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2RldmljZS5jCmluZGV4IDA3MWQ3MzMuLjkzZTNkMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9kZXZpY2UuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvZGV2aWNlLmMKQEAgLTg3Miw5ICs4NzIsMTMgQEAKIHN0YXRpYyB2b2lkIGM0aXdfZGVhbGxvYyhzdHJ1Y3QgdWxkX2N0eCAqY3R4KQogewogCWM0aXdfcmRldl9jbG9zZSgmY3R4LT5kZXYtPnJkZXYpOworCVdBUk5fT05fT05DRSghaWRyX2lzX2VtcHR5KCZjdHgtPmRldi0+Y3FpZHIpKTsKIAlpZHJfZGVzdHJveSgmY3R4LT5kZXYtPmNxaWRyKTsKKwlXQVJOX09OX09OQ0UoIWlkcl9pc19lbXB0eSgmY3R4LT5kZXYtPnFwaWRyKSk7CiAJaWRyX2Rlc3Ryb3koJmN0eC0+ZGV2LT5xcGlkcik7CisJV0FSTl9PTl9PTkNFKCFpZHJfaXNfZW1wdHkoJmN0eC0+ZGV2LT5tbWlkcikpOwogCWlkcl9kZXN0cm95KCZjdHgtPmRldi0+bW1pZHIpOworCXdhaXRfZXZlbnQoY3R4LT5kZXYtPndhaXQsIGlkcl9pc19lbXB0eSgmY3R4LT5kZXYtPmh3dGlkX2lkcikpOwogCWlkcl9kZXN0cm95KCZjdHgtPmRldi0+aHd0aWRfaWRyKTsKIAlpZHJfZGVzdHJveSgmY3R4LT5kZXYtPnN0aWRfaWRyKTsKIAlpZHJfZGVzdHJveSgmY3R4LT5kZXYtPmF0aWRfaWRyKTsKQEAgLTk5Miw2ICs5OTYsNyBAQAogCW11dGV4X2luaXQoJmRldnAtPnJkZXYuc3RhdHMubG9jayk7CiAJbXV0ZXhfaW5pdCgmZGV2cC0+ZGJfbXV0ZXgpOwogCUlOSVRfTElTVF9IRUFEKCZkZXZwLT5kYl9mY19saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZwLT53YWl0KTsKIAlkZXZwLT5hdmFpbF9pcmQgPSBkZXZwLT5yZGV2LmxsZGkubWF4X2lyZF9hZGFwdGVyOwogCiAJaWYgKGM0aXdfZGVidWdmc19yb290KSB7CkBAIC0xNDc1LDYgKzE0ODAsMTAgQEAKIAogc3RhdGljIHN0cnVjdCBjeGdiNF91bGRfaW5mbyBjNGl3X3VsZF9pbmZvID0gewogCS5uYW1lID0gRFJWX05BTUUsCisJLm5yeHEgPSBNQVhfVUxEX1FTRVRTLAorCS5yeHFfc2l6ZSA9IDUxMSwKKwkuY2lxID0gdHJ1ZSwKKwkubHJvID0gZmFsc2UsCiAJLmFkZCA9IGM0aXdfdWxkX2FkZCwKIAkucnhfaGFuZGxlciA9IGM0aXdfdWxkX3J4X2hhbmRsZXIsCiAJLnN0YXRlX2NoYW5nZSA9IGM0aXdfdWxkX3N0YXRlX2NoYW5nZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9pd19jeGdiNC5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2l3X2N4Z2I0LmgKaW5kZXggYWE0N2UwYS4uY2RjZjNlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2l3X2N4Z2I0LmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2l3X2N4Z2I0LmgKQEAgLTI2Myw2ICsyNjMsNyBAQAogCXN0cnVjdCBpZHIgc3RpZF9pZHI7CiAJc3RydWN0IGxpc3RfaGVhZCBkYl9mY19saXN0OwogCXUzMiBhdmFpbF9pcmQ7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGM0aXdfZGV2ICp0b19jNGl3X2RldihzdHJ1Y3QgaWJfZGV2aWNlICppYmRldikKQEAgLTg4MSwxNSArODgyLDYgQEAKIAlyZXR1cm4gY21faWQtPnByb3ZpZGVyX2RhdGE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNvbXB1dGVfd3NjYWxlKGludCB3aW4pCi17Ci0JaW50IHdzY2FsZSA9IDA7Ci0KLQl3aGlsZSAod3NjYWxlIDwgMTQgJiYgKDY1NTM1PDx3c2NhbGUpIDwgd2luKQotCQl3c2NhbGUrKzsKLQlyZXR1cm4gd3NjYWxlOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBvY3FwX3N1cHBvcnRlZChjb25zdCBzdHJ1Y3QgY3hnYjRfbGxkX2luZm8gKmluZm9wKQogewogI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChDT05GSUdfUFBDNjQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9xcC5jCmluZGV4IGVkYjExNzIuLjY5MDQzNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9xcC5jCkBAIC02ODMsNyArNjgzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBfZnJlZV9xcChzdHJ1Y3Qga3JlZiAqa3JlZikKK3N0YXRpYyB2b2lkIF9mcmVlX3FwKHN0cnVjdCBrcmVmICprcmVmKQogewogCXN0cnVjdCBjNGl3X3FwICpxaHA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC90NC5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3Q0LmgKaW5kZXggNjEyNmJiZS4uMDIxNzNmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3Q0LmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3Q0LmgKQEAgLTYzNCw2ICs2MzQsMTEgQEAKIAlyZXR1cm4gKENRRV9HRU5CSVQoY3FlKSA9PSBjcS0+Z2VuKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgdDRfY3Ffbm90ZW1wdHkoc3RydWN0IHQ0X2NxICpjcSkKK3sKKwlyZXR1cm4gY3EtPnN3X2luX3VzZSB8fCB0NF92YWxpZF9jcWUoY3EsICZjcS0+cXVldWVbY3EtPmNpZHhdKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgdDRfbmV4dF9od19jcWUoc3RydWN0IHQ0X2NxICpjcSwgc3RydWN0IHQ0X2NxZSAqKmNxZSkKIHsKIAlpbnQgcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvYWZmaW5pdHkuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2FmZmluaXR5LmMKaW5kZXggNzk1NzVlZS4uYTI2YTlhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvYWZmaW5pdHkuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9hZmZpbml0eS5jCkBAIC00Nyw3ICs0Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCiAjaW5jbHVkZSAiaGZpLmgiCiAjaW5jbHVkZSAiYWZmaW5pdHkuaCIKQEAgLTU2LDcgKzU2LDcgQEAKIAogc3RydWN0IGhmaTFfYWZmaW5pdHlfbm9kZV9saXN0IG5vZGVfYWZmaW5pdHkgPSB7CiAJLmxpc3QgPSBMSVNUX0hFQURfSU5JVChub2RlX2FmZmluaXR5Lmxpc3QpLAotCS5sb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoJm5vZGVfYWZmaW5pdHkubG9jayksCisJLmxvY2sgPSBfX01VVEVYX0lOSVRJQUxJWkVSKG5vZGVfYWZmaW5pdHkubG9jaykKIH07CiAKIC8qIE5hbWUgb2YgSVJRIHR5cGVzLCBpbmRleGVkIGJ5IGVudW0gaXJxX3R5cGUgKi8KQEAgLTE2MCwxNCArMTYwLDE0IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqcTsKIAlzdHJ1Y3QgaGZpMV9hZmZpbml0eV9ub2RlICplbnRyeTsKIAotCXNwaW5fbG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKKwltdXRleF9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHEsICZub2RlX2FmZmluaXR5Lmxpc3QpIHsKIAkJZW50cnkgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGhmaTFfYWZmaW5pdHlfbm9kZSwKIAkJCQkgICBsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKIAkJa2ZyZWUoZW50cnkpOwogCX0KLQlzcGluX3VubG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKKwltdXRleF91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJa2ZyZWUoaGZpMV9wZXJfbm9kZV9jbnRyKTsKIH0KIApAQCAtMjM0LDkgKzIzNCw4IEBACiAJaWYgKGNwdW1hc2tfZmlyc3QobG9jYWxfbWFzaykgPj0gbnJfY3B1X2lkcykKIAkJbG9jYWxfbWFzayA9IHRvcG9sb2d5X2NvcmVfY3B1bWFzaygwKTsKIAotCXNwaW5fbG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKKwltdXRleF9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCWVudHJ5ID0gbm9kZV9hZmZpbml0eV9sb29rdXAoZGQtPm5vZGUpOwotCXNwaW5fdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCiAJLyoKIAkgKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoaXMgTlVNQSBub2RlJ3MgYWZmaW5pdHkgaXMgdXNlZCwKQEAgLTI0Nyw2ICsyNDYsNyBAQAogCQlpZiAoIWVudHJ5KSB7CiAJCQlkZF9kZXZfZXJyKGRkLAogCQkJCSAgICJVbmFibGUgdG8gYWxsb2NhdGUgZ2xvYmFsIGFmZmluaXR5IG5vZGVcbiIpOworCQkJbXV0ZXhfdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJaW5pdF9jcHVfbWFza19zZXQoJmVudHJ5LT5kZWZfaW50cik7CkBAIC0zMDMsMTUgKzMwMywxMTMgQEAKIAkJCQkJICAgICAmZW50cnktPmdlbmVyYWxfaW50cl9tYXNrKTsKIAkJfQogCi0JCXNwaW5fbG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKIAkJbm9kZV9hZmZpbml0eV9hZGRfdGFpbChlbnRyeSk7Ci0JCXNwaW5fdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCX0KLQorCW11dGV4X3VubG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIAotaW50IGhmaTFfZ2V0X2lycV9hZmZpbml0eShzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgc3RydWN0IGhmaTFfbXNpeF9lbnRyeSAqbXNpeCkKKy8qCisgKiBGdW5jdGlvbiB1cGRhdGVzIHRoZSBpcnEgYWZmaW5pdHkgaGludCBmb3IgbXNpeCBhZnRlciBpdCBoYXMgYmVlbiBjaGFuZ2VkCisgKiBieSB0aGUgdXNlciB1c2luZyB0aGUgL3Byb2MvaXJxIGludGVyZmFjZS4gVGhpcyBmdW5jdGlvbiBvbmx5IGFjY2VwdHMKKyAqIG9uZSBjcHUgaW4gdGhlIG1hc2suCisgKi8KK3N0YXRpYyB2b2lkIGhmaTFfdXBkYXRlX3NkbWFfYWZmaW5pdHkoc3RydWN0IGhmaTFfbXNpeF9lbnRyeSAqbXNpeCwgaW50IGNwdSkKK3sKKwlzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSA9IG1zaXgtPmFyZzsKKwlzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCA9IHNkZS0+ZGQ7CisJc3RydWN0IGhmaTFfYWZmaW5pdHlfbm9kZSAqZW50cnk7CisJc3RydWN0IGNwdV9tYXNrX3NldCAqc2V0OworCWludCBpLCBvbGRfY3B1OworCisJaWYgKGNwdSA+IG51bV9vbmxpbmVfY3B1cygpIHx8IGNwdSA9PSBzZGUtPmNwdSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKKwllbnRyeSA9IG5vZGVfYWZmaW5pdHlfbG9va3VwKGRkLT5ub2RlKTsKKwlpZiAoIWVudHJ5KQorCQlnb3RvIHVubG9jazsKKworCW9sZF9jcHUgPSBzZGUtPmNwdTsKKwlzZGUtPmNwdSA9IGNwdTsKKwljcHVtYXNrX2NsZWFyKCZtc2l4LT5tYXNrKTsKKwljcHVtYXNrX3NldF9jcHUoY3B1LCAmbXNpeC0+bWFzayk7CisJZGRfZGV2X2RiZyhkZCwgIklSUSB2ZWN0b3I6ICV1LCB0eXBlICVzIGVuZ2luZSAldSAtPiBjcHU6ICVkXG4iLAorCQkgICBtc2l4LT5tc2l4LnZlY3RvciwgaXJxX3R5cGVfbmFtZXNbbXNpeC0+dHlwZV0sCisJCSAgIHNkZS0+dGhpc19pZHgsIGNwdSk7CisJaXJxX3NldF9hZmZpbml0eV9oaW50KG1zaXgtPm1zaXgudmVjdG9yLCAmbXNpeC0+bWFzayk7CisKKwkvKgorCSAqIFNldCB0aGUgbmV3IGNwdSBpbiB0aGUgaGZpMV9hZmZpbml0eV9ub2RlIGFuZCBjbGVhbgorCSAqIHRoZSBvbGQgY3B1IGlmIGl0IGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBJUlEKKwkgKi8KKwlzZXQgPSAmZW50cnktPmRlZl9pbnRyOworCWNwdW1hc2tfc2V0X2NwdShjcHUsICZzZXQtPm1hc2spOworCWNwdW1hc2tfc2V0X2NwdShjcHUsICZzZXQtPnVzZWQpOworCWZvciAoaSA9IDA7IGkgPCBkZC0+bnVtX21zaXhfZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBoZmkxX21zaXhfZW50cnkgKm90aGVyX21zaXg7CisKKwkJb3RoZXJfbXNpeCA9ICZkZC0+bXNpeF9lbnRyaWVzW2ldOworCQlpZiAob3RoZXJfbXNpeC0+dHlwZSAhPSBJUlFfU0RNQSB8fCBvdGhlcl9tc2l4ID09IG1zaXgpCisJCQljb250aW51ZTsKKworCQlpZiAoY3B1bWFza190ZXN0X2NwdShvbGRfY3B1LCAmb3RoZXJfbXNpeC0+bWFzaykpCisJCQlnb3RvIHVubG9jazsKKwl9CisJY3B1bWFza19jbGVhcl9jcHUob2xkX2NwdSwgJnNldC0+bWFzayk7CisJY3B1bWFza19jbGVhcl9jcHUob2xkX2NwdSwgJnNldC0+dXNlZCk7Cit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOworfQorCitzdGF0aWMgdm9pZCBoZmkxX2lycV9ub3RpZmllcl9ub3RpZnkoc3RydWN0IGlycV9hZmZpbml0eV9ub3RpZnkgKm5vdGlmeSwKKwkJCQkgICAgIGNvbnN0IGNwdW1hc2tfdCAqbWFzaykKK3sKKwlpbnQgY3B1ID0gY3B1bWFza19maXJzdChtYXNrKTsKKwlzdHJ1Y3QgaGZpMV9tc2l4X2VudHJ5ICptc2l4ID0gY29udGFpbmVyX29mKG5vdGlmeSwKKwkJCQkJCSAgICBzdHJ1Y3QgaGZpMV9tc2l4X2VudHJ5LAorCQkJCQkJICAgIG5vdGlmeSk7CisKKwkvKiBPbmx5IG9uZSBDUFUgY29uZmlndXJhdGlvbiBzdXBwb3J0ZWQgY3VycmVudGx5ICovCisJaGZpMV91cGRhdGVfc2RtYV9hZmZpbml0eShtc2l4LCBjcHUpOworfQorCitzdGF0aWMgdm9pZCBoZmkxX2lycV9ub3RpZmllcl9yZWxlYXNlKHN0cnVjdCBrcmVmICpyZWYpCit7CisJLyoKKwkgKiBUaGlzIGlzIHJlcXVpcmVkIGJ5IGFmZmluaXR5IG5vdGlmaWVyLiBXZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvCisJICogZnJlZSBoZXJlLgorCSAqLworfQorCitzdGF0aWMgdm9pZCBoZmkxX3NldHVwX3NkbWFfbm90aWZpZXIoc3RydWN0IGhmaTFfbXNpeF9lbnRyeSAqbXNpeCkKK3sKKwlzdHJ1Y3QgaXJxX2FmZmluaXR5X25vdGlmeSAqbm90aWZ5ID0gJm1zaXgtPm5vdGlmeTsKKworCW5vdGlmeS0+aXJxID0gbXNpeC0+bXNpeC52ZWN0b3I7CisJbm90aWZ5LT5ub3RpZnkgPSBoZmkxX2lycV9ub3RpZmllcl9ub3RpZnk7CisJbm90aWZ5LT5yZWxlYXNlID0gaGZpMV9pcnFfbm90aWZpZXJfcmVsZWFzZTsKKworCWlmIChpcnFfc2V0X2FmZmluaXR5X25vdGlmaWVyKG5vdGlmeS0+aXJxLCBub3RpZnkpKQorCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBzZG1hIGlycSBhZmZpbml0eSBub3RpZmllciBmb3IgaXJxICVkXG4iLAorCQkgICAgICAgbm90aWZ5LT5pcnEpOworfQorCitzdGF0aWMgdm9pZCBoZmkxX2NsZWFudXBfc2RtYV9ub3RpZmllcihzdHJ1Y3QgaGZpMV9tc2l4X2VudHJ5ICptc2l4KQoreworCXN0cnVjdCBpcnFfYWZmaW5pdHlfbm90aWZ5ICpub3RpZnkgPSAmbXNpeC0+bm90aWZ5OworCisJaWYgKGlycV9zZXRfYWZmaW5pdHlfbm90aWZpZXIobm90aWZ5LT5pcnEsIE5VTEwpKQorCQlwcl9lcnIoIkZhaWxlZCB0byBjbGVhbnVwIHNkbWEgaXJxIGFmZmluaXR5IG5vdGlmaWVyIGZvciBpcnEgJWRcbiIsCisJCSAgICAgICBub3RpZnktPmlycSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzZXRzIHRoZSBpcnEgYWZmaW5pdHkgZm9yIG1zaXguCisgKiBJdCAqbXVzdCogYmUgY2FsbGVkIHdpdGggbm9kZV9hZmZpbml0eS5sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2lycV9hZmZpbml0eShzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwKKwkJCSAgICBzdHJ1Y3QgaGZpMV9tc2l4X2VudHJ5ICptc2l4KQogewogCWludCByZXQ7CiAJY3B1bWFza192YXJfdCBkaWZmOwpAQCAtMzI5LDkgKzQyNyw3IEBACiAJaWYgKCFyZXQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc3Bpbl9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCWVudHJ5ID0gbm9kZV9hZmZpbml0eV9sb29rdXAoZGQtPm5vZGUpOwotCXNwaW5fdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCiAJc3dpdGNoIChtc2l4LT50eXBlKSB7CiAJY2FzZSBJUlFfU0RNQToKQEAgLTM2MSw3ICs0NTcsNiBAQAogCSAqIGZpbmRzIGl0cyBDUFUgaGVyZS4KIAkgKi8KIAlpZiAoY3B1ID09IC0xICYmIHNldCkgewotCQlzcGluX2xvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJCWlmIChjcHVtYXNrX2VxdWFsKCZzZXQtPm1hc2ssICZzZXQtPnVzZWQpKSB7CiAJCQkvKgogCQkJICogV2UndmUgdXNlZCB1cCBhbGwgdGhlIENQVXMsIGJ1bXAgdXAgdGhlIGdlbmVyYXRpb24KQEAgLTM3MywxNyArNDY4LDYgQEAKIAkJY3B1bWFza19hbmRub3QoZGlmZiwgJnNldC0+bWFzaywgJnNldC0+dXNlZCk7CiAJCWNwdSA9IGNwdW1hc2tfZmlyc3QoZGlmZik7CiAJCWNwdW1hc2tfc2V0X2NwdShjcHUsICZzZXQtPnVzZWQpOwotCQlzcGluX3VubG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKLQl9Ci0KLQlzd2l0Y2ggKG1zaXgtPnR5cGUpIHsKLQljYXNlIElSUV9TRE1BOgotCQlzZGUtPmNwdSA9IGNwdTsKLQkJYnJlYWs7Ci0JY2FzZSBJUlFfR0VORVJBTDoKLQljYXNlIElSUV9SQ1ZDVFhUOgotCWNhc2UgSVJRX09USEVSOgotCQlicmVhazsKIAl9CiAKIAljcHVtYXNrX3NldF9jcHUoY3B1LCAmbXNpeC0+bWFzayk7CkBAIC0zOTIsMTAgKzQ3NiwyNSBAQAogCQkgICAgZXh0cmEsIGNwdSk7CiAJaXJxX3NldF9hZmZpbml0eV9oaW50KG1zaXgtPm1zaXgudmVjdG9yLCAmbXNpeC0+bWFzayk7CiAKKwlpZiAobXNpeC0+dHlwZSA9PSBJUlFfU0RNQSkgeworCQlzZGUtPmNwdSA9IGNwdTsKKwkJaGZpMV9zZXR1cF9zZG1hX25vdGlmaWVyKG1zaXgpOworCX0KKwogCWZyZWVfY3B1bWFza192YXIoZGlmZik7CiAJcmV0dXJuIDA7CiB9CiAKK2ludCBoZmkxX2dldF9pcnFfYWZmaW5pdHkoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHN0cnVjdCBoZmkxX21zaXhfZW50cnkgKm1zaXgpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CisJcmV0ID0gZ2V0X2lycV9hZmZpbml0eShkZCwgbXNpeCk7CisJbXV0ZXhfdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOworCXJldHVybiByZXQ7Cit9CisKIHZvaWQgaGZpMV9wdXRfaXJxX2FmZmluaXR5KHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLAogCQkJICAgc3RydWN0IGhmaTFfbXNpeF9lbnRyeSAqbXNpeCkKIHsKQEAgLTQwMywxMyArNTAyLDEzIEBACiAJc3RydWN0IGhmaTFfY3R4dGRhdGEgKnJjZDsKIAlzdHJ1Y3QgaGZpMV9hZmZpbml0eV9ub2RlICplbnRyeTsKIAotCXNwaW5fbG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKKwltdXRleF9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCWVudHJ5ID0gbm9kZV9hZmZpbml0eV9sb29rdXAoZGQtPm5vZGUpOwotCXNwaW5fdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCiAJc3dpdGNoIChtc2l4LT50eXBlKSB7CiAJY2FzZSBJUlFfU0RNQToKIAkJc2V0ID0gJmVudHJ5LT5kZWZfaW50cjsKKwkJaGZpMV9jbGVhbnVwX3NkbWFfbm90aWZpZXIobXNpeCk7CiAJCWJyZWFrOwogCWNhc2UgSVJRX0dFTkVSQUw6CiAJCS8qIERvbid0IGRvIGFjY291bnRpbmcgZm9yIGdlbmVyYWwgY29udGV4dHMgKi8KQEAgLTQyMSwyMSArNTIwLDIxIEBACiAJCQlzZXQgPSAmZW50cnktPnJjdl9pbnRyOwogCQlicmVhazsKIAlkZWZhdWx0OgorCQltdXRleF91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAoc2V0KSB7Ci0JCXNwaW5fbG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKIAkJY3B1bWFza19hbmRub3QoJnNldC0+dXNlZCwgJnNldC0+dXNlZCwgJm1zaXgtPm1hc2spOwogCQlpZiAoY3B1bWFza19lbXB0eSgmc2V0LT51c2VkKSAmJiBzZXQtPmdlbikgewogCQkJc2V0LT5nZW4tLTsKIAkJCWNwdW1hc2tfY29weSgmc2V0LT51c2VkLCAmc2V0LT5tYXNrKTsKIAkJfQotCQlzcGluX3VubG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKIAl9CiAKIAlpcnFfc2V0X2FmZmluaXR5X2hpbnQobXNpeC0+bXNpeC52ZWN0b3IsIE5VTEwpOwogCWNwdW1hc2tfY2xlYXIoJm1zaXgtPm1hc2spOworCW11dGV4X3VubG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKIH0KIAogLyogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdpdGggbm9kZV9hZmZpbml0eS5sb2NrIGhlbGQgKi8KQEAgLTUzNiw3ICs2MzUsNyBAQAogCWlmICghcmV0KQogCQlnb3RvIGZyZWVfYXZhaWxhYmxlX21hc2s7CiAKLQlzcGluX2xvY2soJmFmZmluaXR5LT5sb2NrKTsKKwltdXRleF9sb2NrKCZhZmZpbml0eS0+bG9jayk7CiAJLyoKIAkgKiBJZiB3ZSd2ZSB1c2VkIGFsbCBhdmFpbGFibGUgSFcgdGhyZWFkcywgY2xlYXIgdGhlIG1hc2sgYW5kIHN0YXJ0CiAJICogb3ZlcmxvYWRpbmcuCkBAIC02NDQsNyArNzQzLDggQEAKIAkJY3B1ID0gLTE7CiAJZWxzZQogCQljcHVtYXNrX3NldF9jcHUoY3B1LCAmc2V0LT51c2VkKTsKLQlzcGluX3VubG9jaygmYWZmaW5pdHktPmxvY2spOworCisJbXV0ZXhfdW5sb2NrKCZhZmZpbml0eS0+bG9jayk7CiAJaGZpMV9jZGJnKFBST0MsICJQcm9jZXNzIGFzc2lnbmVkIHRvIENQVSAlZCIsIGNwdSk7CiAKIAlmcmVlX2NwdW1hc2tfdmFyKGludHJzX21hc2spOwpAQCAtNjY1LDQ5ICs3NjUsNTMgQEAKIAogCWlmIChjcHUgPCAwKQogCQlyZXR1cm47Ci0Jc3Bpbl9sb2NrKCZhZmZpbml0eS0+bG9jayk7CisKKwltdXRleF9sb2NrKCZhZmZpbml0eS0+bG9jayk7CiAJY3B1bWFza19jbGVhcl9jcHUoY3B1LCAmc2V0LT51c2VkKTsKIAloZmkxX2NkYmcoUFJPQywgIlJldHVybmluZyBDUFUgJWQgZm9yIGZ1dHVyZSBwcm9jZXNzIGFzc2lnbm1lbnQiLCBjcHUpOwogCWlmIChjcHVtYXNrX2VtcHR5KCZzZXQtPnVzZWQpICYmIHNldC0+Z2VuKSB7CiAJCXNldC0+Z2VuLS07CiAJCWNwdW1hc2tfY29weSgmc2V0LT51c2VkLCAmc2V0LT5tYXNrKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJmFmZmluaXR5LT5sb2NrKTsKKwltdXRleF91bmxvY2soJmFmZmluaXR5LT5sb2NrKTsKIH0KIAotLyogUHJldmVudHMgY29uY3VycmVudCByZWFkcyBhbmQgd3JpdGVzIG9mIHRoZSBzZG1hX2FmZmluaXR5IGF0dHJpYiAqLwotc3RhdGljIERFRklORV9NVVRFWChzZG1hX2FmZmluaXR5X211dGV4KTsKLQogaW50IGhmaTFfc2V0X3NkbWFfYWZmaW5pdHkoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJCSAgIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaGZpMV9hZmZpbml0eV9ub2RlICplbnRyeTsKLQlzdHJ1Y3QgY3B1bWFzayBtYXNrOworCWNwdW1hc2tfdmFyX3QgbWFzazsKIAlpbnQgcmV0LCBpOwogCi0Jc3Bpbl9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOworCW11dGV4X2xvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJZW50cnkgPSBub2RlX2FmZmluaXR5X2xvb2t1cChkZC0+bm9kZSk7Ci0Jc3Bpbl91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAKLQlpZiAoIWVudHJ5KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IGNwdWxpc3RfcGFyc2UoYnVmLCAmbWFzayk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlmICghY3B1bWFza19zdWJzZXQoJm1hc2ssIGNwdV9vbmxpbmVfbWFzaykgfHwgY3B1bWFza19lbXB0eSgmbWFzaykpIHsKLQkJZGRfZGV2X3dhcm4oZGQsICJJbnZhbGlkIENQVSBtYXNrXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFlbnRyeSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKIAl9CiAKLQltdXRleF9sb2NrKCZzZG1hX2FmZmluaXR5X211dGV4KTsKKwlyZXQgPSB6YWxsb2NfY3B1bWFza192YXIoJm1hc2ssIEdGUF9LRVJORUwpOworCWlmICghcmV0KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gdW5sb2NrOworCX0KKworCXJldCA9IGNwdWxpc3RfcGFyc2UoYnVmLCBtYXNrKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlmICghY3B1bWFza19zdWJzZXQobWFzaywgY3B1X29ubGluZV9tYXNrKSB8fCBjcHVtYXNrX2VtcHR5KG1hc2spKSB7CisJCWRkX2Rldl93YXJuKGRkLCAiSW52YWxpZCBDUFUgbWFza1xuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwogCS8qIHJlc2V0IHRoZSBTRE1BIGludGVycnVwdCBhZmZpbml0eSBkZXRhaWxzICovCiAJaW5pdF9jcHVfbWFza19zZXQoJmVudHJ5LT5kZWZfaW50cik7Ci0JY3B1bWFza19jb3B5KCZlbnRyeS0+ZGVmX2ludHIubWFzaywgJm1hc2spOwotCS8qCi0JICogUmVhc3NpZ24gdGhlIGFmZmluaXR5IGZvciBlYWNoIFNETUEgaW50ZXJydXB0LgotCSAqLworCWNwdW1hc2tfY29weSgmZW50cnktPmRlZl9pbnRyLm1hc2ssIG1hc2spOworCisJLyogUmVhc3NpZ24gdGhlIGFmZmluaXR5IGZvciBlYWNoIFNETUEgaW50ZXJydXB0LiAqLwogCWZvciAoaSA9IDA7IGkgPCBkZC0+bnVtX21zaXhfZW50cmllczsgaSsrKSB7CiAJCXN0cnVjdCBoZmkxX21zaXhfZW50cnkgKm1zaXg7CiAKQEAgLTcxNSwxMyArODE5LDE1IEBACiAJCWlmIChtc2l4LT50eXBlICE9IElSUV9TRE1BKQogCQkJY29udGludWU7CiAKLQkJcmV0ID0gaGZpMV9nZXRfaXJxX2FmZmluaXR5KGRkLCBtc2l4KTsKKwkJcmV0ID0gZ2V0X2lycV9hZmZpbml0eShkZCwgbXNpeCk7CiAKIAkJaWYgKHJldCkKIAkJCWJyZWFrOwogCX0KLQotCW11dGV4X3VubG9jaygmc2RtYV9hZmZpbml0eV9tdXRleCk7CitvdXQ6CisJZnJlZV9jcHVtYXNrX3ZhcihtYXNrKTsKK3VubG9jazoKKwltdXRleF91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJcmV0dXJuIHJldCA/IHJldCA6IHN0cm5sZW4oYnVmLCBQQUdFX1NJWkUpOwogfQogCkBAIC03MjksMTUgKzgzNSwxNSBAQAogewogCXN0cnVjdCBoZmkxX2FmZmluaXR5X25vZGUgKmVudHJ5OwogCi0Jc3Bpbl9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOworCW11dGV4X2xvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJZW50cnkgPSBub2RlX2FmZmluaXR5X2xvb2t1cChkZC0+bm9kZSk7Ci0Jc3Bpbl91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAKLQlpZiAoIWVudHJ5KQorCWlmICghZW50cnkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKLQltdXRleF9sb2NrKCZzZG1hX2FmZmluaXR5X211dGV4KTsKIAljcHVtYXBfcHJpbnRfdG9fcGFnZWJ1Zih0cnVlLCBidWYsICZlbnRyeS0+ZGVmX2ludHIubWFzayk7Ci0JbXV0ZXhfdW5sb2NrKCZzZG1hX2FmZmluaXR5X211dGV4KTsKKwltdXRleF91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJcmV0dXJuIHN0cm5sZW4oYnVmLCBQQUdFX1NJWkUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvYWZmaW5pdHkuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2FmZmluaXR5LmgKaW5kZXggODg3OWNmNy4uYjg5ZWEzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvYWZmaW5pdHkuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9hZmZpbml0eS5oCkBAIC0xMjEsOCArMTIxLDcgQEAKIAlpbnQgbnVtX2NvcmVfc2libGluZ3M7CiAJaW50IG51bV9vbmxpbmVfbm9kZXM7CiAJaW50IG51bV9vbmxpbmVfY3B1czsKLQkvKiBwcm90ZWN0IGFmZmluaXR5IG5vZGUgbGlzdCAqLwotCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsgLyogcHJvdGVjdHMgYWZmaW5pdHkgbm9kZXMgKi8KIH07CiAKIGludCBub2RlX2FmZmluaXR5X2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9jaGlwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9jaGlwLmMKaW5kZXggYjMyNjM4ZC4uOWJmNWYyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvY2hpcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2NoaXAuYwpAQCAtOTcxLDcgKzk3MSw5IEBACiAJRkxBR19FTlRSWTAoIkZhaWxlZCBMTkkoVmVyaWZ5Q2FwXzEpIiwgRkFJTEVEX0xOSV9WRVJJRllfQ0FQMSksCiAJRkxBR19FTlRSWTAoIkZhaWxlZCBMTkkoVmVyaWZ5Q2FwXzIpIiwgRkFJTEVEX0xOSV9WRVJJRllfQ0FQMiksCiAJRkxBR19FTlRSWTAoIkZhaWxlZCBMTkkoQ29uZmlnTFQpIiwgICAgRkFJTEVEX0xOSV9DT05GSUdMVCksCi0JRkxBR19FTlRSWTAoIkhvc3QgSGFuZHNoYWtlIFRpbWVvdXQiLCAgSE9TVF9IQU5EU0hBS0VfVElNRU9VVCkKKwlGTEFHX0VOVFJZMCgiSG9zdCBIYW5kc2hha2UgVGltZW91dCIsICBIT1NUX0hBTkRTSEFLRV9USU1FT1VUKSwKKwlGTEFHX0VOVFJZMCgiRXh0ZXJuYWwgRGV2aWNlIFJlcXVlc3QgVGltZW91dCIsCisJCSAgICBFWFRFUk5BTF9ERVZJQ0VfUkVRX1RJTUVPVVQpLAogfTsKIAogLyoKQEAgLTY4MjUsNyArNjgyNyw2IEBACiAJCXNldF9saW5rX2Rvd25fcmVhc29uKHBwZCwgT1BBX0xJTktET1dOX1JFQVNPTl9TUEVFRF9QT0xJQ1ksIDAsCiAJCQkJICAgICBPUEFfTElOS0RPV05fUkVBU09OX1NQRUVEX1BPTElDWSk7CiAJCXNldF9saW5rX3N0YXRlKHBwZCwgSExTX0ROX09GRkxJTkUpOwotCQl0dW5lX3NlcmRlcyhwcGQpOwogCQlzdGFydF9saW5rKHBwZCk7CiAJfQogfQpAQCAtNjk5OCwxMiArNjk5OSwxMCBAQAogCSAqIElmIHRoZXJlIGlzIG5vIGNhYmxlIGF0dGFjaGVkLCB0dXJuIHRoZSBEQyBvZmYuIE90aGVyd2lzZSwKIAkgKiBzdGFydCB0aGUgbGluayBicmluZyB1cC4KIAkgKi8KLQlpZiAocHBkLT5wb3J0X3R5cGUgPT0gUE9SVF9UWVBFX1FTRlAgJiYgIXFzZnBfbW9kX3ByZXNlbnQocHBkKSkgeworCWlmIChwcGQtPnBvcnRfdHlwZSA9PSBQT1JUX1RZUEVfUVNGUCAmJiAhcXNmcF9tb2RfcHJlc2VudChwcGQpKQogCQlkY19zaHV0ZG93bihwcGQtPmRkKTsKLQl9IGVsc2UgewotCQl0dW5lX3NlcmRlcyhwcGQpOworCWVsc2UKIAkJc3RhcnRfbGluayhwcGQpOwotCX0KIH0KIAogdm9pZCBoYW5kbGVfbGlua19ib3VuY2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtNzAxNiw3ICs3MDE1LDYgQEAKIAkgKi8KIAlpZiAocHBkLT5ob3N0X2xpbmtfc3RhdGUgJiBITFNfVVApIHsKIAkJc2V0X2xpbmtfc3RhdGUocHBkLCBITFNfRE5fT0ZGTElORSk7Ci0JCXR1bmVfc2VyZGVzKHBwZCk7CiAJCXN0YXJ0X2xpbmsocHBkKTsKIAl9IGVsc2UgewogCQlkZF9kZXZfaW5mbyhwcGQtPmRkLCAiJXM6IGxpbmsgbm90IHVwICglcyksIG5vdGhpbmcgdG8gZG9cbiIsCkBAIC03NTMxLDcgKzc1MjksNiBAQAogCQlzZXRfbGlua19kb3duX3JlYXNvbihwcGQsIE9QQV9MSU5LRE9XTl9SRUFTT05fV0lEVEhfUE9MSUNZLCAwLAogCQkJCSAgICAgT1BBX0xJTktET1dOX1JFQVNPTl9XSURUSF9QT0xJQ1kpOwogCQlzZXRfbGlua19zdGF0ZShwcGQsIEhMU19ETl9PRkZMSU5FKTsKLQkJdHVuZV9zZXJkZXMocHBkKTsKIAkJc3RhcnRfbGluayhwcGQpOwogCX0KIH0KQEAgLTkxNjEsNiArOTE1OCwxMiBAQAogICovCiBpbnQgc3RhcnRfbGluayhzdHJ1Y3QgaGZpMV9wcG9ydGRhdGEgKnBwZCkKIHsKKwkvKgorCSAqIFR1bmUgdGhlIFNlckRlcyB0byBhIGJhbGxwYXJrIHNldHRpbmcgZm9yIG9wdGltYWwgc2lnbmFsIGFuZCBiaXQKKwkgKiBlcnJvciByYXRlLiAgTmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgc3RhcnRpbmcgdGhlIGxpbmsuCisJICovCisJdHVuZV9zZXJkZXMocHBkKTsKKwogCWlmICghcHBkLT5saW5rX2VuYWJsZWQpIHsKIAkJZGRfZGV2X2luZm8ocHBkLT5kZCwKIAkJCSAgICAiJXM6IHN0b3BwaW5nIGxpbmsgc3RhcnQgYmVjYXVzZSBsaW5rIGlzIGRpc2FibGVkXG4iLApAQCAtOTQwMSw4ICs5NDA0LDYgQEAKIAkJICovCiAJCXNldF9xc2ZwX2ludF9uKHBwZCwgMSk7CiAKLQkJdHVuZV9zZXJkZXMocHBkKTsKLQogCQlzdGFydF9saW5rKHBwZCk7CiAJfQogCkBAIC05NDkwLDYgKzk0OTEsNzMgQEAKIAl3cml0ZV9jc3IoZGQsIERDX0xDQl9DRkdfVFhfRklGT1NfUkVTRVQsIDB4MDApOwogfQogCisvKgorICogUGVyZm9ybSBhIHRlc3QgcmVhZCBvbiB0aGUgUVNGUC4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC1FUlJOTworICogb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgdGVzdF9xc2ZwX3JlYWQoc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQpCit7CisJaW50IHJldDsKKwl1OCBzdGF0dXM7CisKKwkvKiByZXBvcnQgc3VjY2VzcyBpZiBub3QgYSBRU0ZQICovCisJaWYgKHBwZC0+cG9ydF90eXBlICE9IFBPUlRfVFlQRV9RU0ZQKQorCQlyZXR1cm4gMDsKKworCS8qIHJlYWQgYnl0ZSAyLCB0aGUgc3RhdHVzIGJ5dGUgKi8KKwlyZXQgPSBvbmVfcXNmcF9yZWFkKHBwZCwgcHBkLT5kZC0+aGZpMV9pZCwgMiwgJnN0YXR1cywgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKHJldCAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOyAvKiBzdWNjZXNzICovCit9CisKKy8qCisgKiBWYWx1ZXMgZm9yIFFTRlAgcmV0cnkuCisgKgorICogR2l2ZSB1cCBhZnRlciAxMHMgKDIwIHggNTAwbXMpLiAgVGhlIG92ZXJhbGwgdGltZW91dCB3YXMgZW1waXJpY2FsbHkKKyAqIGFycml2ZWQgYXQgZnJvbSBleHBlcmllbmNlIG9uIGEgbGFyZ2UgY2x1c3Rlci4KKyAqLworI2RlZmluZSBNQVhfUVNGUF9SRVRSSUVTIDIwCisjZGVmaW5lIFFTRlBfUkVUUllfV0FJVCA1MDAgLyogbXNlYyAqLworCisvKgorICogVHJ5IGEgUVNGUCByZWFkLiAgSWYgaXQgZmFpbHMsIHNjaGVkdWxlIGEgcmV0cnkgZm9yIGxhdGVyLgorICogQ2FsbGVkIG9uIGZpcnN0IGxpbmsgYWN0aXZhdGlvbiBhZnRlciBkcml2ZXIgbG9hZC4KKyAqLworc3RhdGljIHZvaWQgdHJ5X3N0YXJ0X2xpbmsoc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQpCit7CisJaWYgKHRlc3RfcXNmcF9yZWFkKHBwZCkpIHsKKwkJLyogcmVhZCBmYWlsZWQgKi8KKwkJaWYgKHBwZC0+cXNmcF9yZXRyeV9jb3VudCA+PSBNQVhfUVNGUF9SRVRSSUVTKSB7CisJCQlkZF9kZXZfZXJyKHBwZC0+ZGQsICJRU0ZQIG5vdCByZXNwb25kaW5nLCBnaXZpbmcgdXBcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWRkX2Rldl9pbmZvKHBwZC0+ZGQsCisJCQkgICAgIlFTRlAgbm90IHJlc3BvbmRpbmcsIHdhaXRpbmcgYW5kIHJldHJ5aW5nICVkXG4iLAorCQkJICAgIChpbnQpcHBkLT5xc2ZwX3JldHJ5X2NvdW50KTsKKwkJcHBkLT5xc2ZwX3JldHJ5X2NvdW50Kys7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcGQtPmhmaTFfd3EsICZwcGQtPnN0YXJ0X2xpbmtfd29yaywKKwkJCQkgICBtc2Vjc190b19qaWZmaWVzKFFTRlBfUkVUUllfV0FJVCkpOworCQlyZXR1cm47CisJfQorCXBwZC0+cXNmcF9yZXRyeV9jb3VudCA9IDA7CisKKwlzdGFydF9saW5rKHBwZCk7Cit9CisKKy8qCisgKiBXb3JrcXVldWUgZnVuY3Rpb24gdG8gc3RhcnQgdGhlIGxpbmsgYWZ0ZXIgYSBkZWxheS4KKyAqLwordm9pZCBoYW5kbGVfc3RhcnRfbGluayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGhmaTFfcHBvcnRkYXRhLAorCQkJCQkJICBzdGFydF9saW5rX3dvcmsud29yayk7CisJdHJ5X3N0YXJ0X2xpbmsocHBkKTsKK30KKwogaW50IGJyaW5ndXBfc2VyZGVzKHN0cnVjdCBoZmkxX3Bwb3J0ZGF0YSAqcHBkKQogewogCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkID0gcHBkLT5kZDsKQEAgLTk1MjUsMTQgKzk1OTMsOCBAQAogCQlzZXRfcXNmcF9pbnRfbihwcGQsIDEpOwogCX0KIAotCS8qCi0JICogVHVuZSB0aGUgU2VyRGVzIHRvIGEgYmFsbHBhcmsgc2V0dGluZyBmb3IKLQkgKiBvcHRpbWFsIHNpZ25hbCBhbmQgYml0IGVycm9yIHJhdGUKLQkgKiBOZWVkcyB0byBiZSBkb25lIGJlZm9yZSBzdGFydGluZyB0aGUgbGluawotCSAqLwotCXR1bmVfc2VyZGVzKHBwZCk7Ci0KLQlyZXR1cm4gc3RhcnRfbGluayhwcGQpOworCXRyeV9zdGFydF9saW5rKHBwZCk7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgaGZpMV9xdWlldF9zZXJkZXMoc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQpCkBAIC05NTQ5LDYgKzk2MTEsMTAgQEAKIAlwcGQtPmRyaXZlcl9saW5rX3JlYWR5ID0gMDsKIAlwcGQtPmxpbmtfZW5hYmxlZCA9IDA7CiAKKwlwcGQtPnFzZnBfcmV0cnlfY291bnQgPSBNQVhfUVNGUF9SRVRSSUVTOyAvKiBwcmV2ZW50IG1vcmUgcmV0cmllcyAqLworCWZsdXNoX2RlbGF5ZWRfd29yaygmcHBkLT5zdGFydF9saW5rX3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHBkLT5zdGFydF9saW5rX3dvcmspOworCiAJcHBkLT5vZmZsaW5lX2Rpc2FibGVkX3JlYXNvbiA9CiAJCQlIRkkxX09EUl9NQVNLKE9QQV9MSU5LRE9XTl9SRUFTT05fU01BX0RJU0FCTEVEKTsKIAlzZXRfbGlua19kb3duX3JlYXNvbihwcGQsIE9QQV9MSU5LRE9XTl9SRUFTT05fU01BX0RJU0FCTEVELCAwLApAQCAtOTY0OCwxMiArOTcxNCwxMiBAQAogCQloZmkxX3B1dF90aWQoZGQsIGksIFBUX0lOVkFMSUQsIDAsIDApOwogfQogCi1zdHJ1Y3QgaGZpMV9tZXNzYWdlX2hlYWRlciAqaGZpMV9nZXRfbXNnaGVhZGVyKAotCQkJCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBfX2xlMzIgKnJoZl9hZGRyKQorc3RydWN0IGliX2hlYWRlciAqaGZpMV9nZXRfbXNnaGVhZGVyKAorCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBfX2xlMzIgKnJoZl9hZGRyKQogewogCXUzMiBvZmZzZXQgPSByaGZfaGRycV9vZmZzZXQocmhmX3RvX2NwdShyaGZfYWRkcikpOwogCi0JcmV0dXJuIChzdHJ1Y3QgaGZpMV9tZXNzYWdlX2hlYWRlciAqKQorCXJldHVybiAoc3RydWN0IGliX2hlYWRlciAqKQogCQkocmhmX2FkZHIgLSBkZC0+cmhmX29mZnNldCArIG9mZnNldCk7CiB9CiAKQEAgLTExNDg5LDEwICsxMTU1NSwxMCBAQAogCSAgICAhKHJjdmN0cmwgJiBSQ1ZfQ1RYVF9DVFJMX0VOQUJMRV9TTUFTSykpIHsKIAkJLyogcmVzZXQgdGhlIHRhaWwgYW5kIGhkciBhZGRyZXNzZXMsIGFuZCBzZXF1ZW5jZSBjb3VudCAqLwogCQl3cml0ZV9rY3R4dF9jc3IoZGQsIGN0eHQsIFJDVl9IRFJfQUREUiwKLQkJCQlyY2QtPnJjdmhkcnFfcGh5cyk7CisJCQkJcmNkLT5yY3ZoZHJxX2RtYSk7CiAJCWlmIChIRkkxX0NBUF9LR0VUX01BU0socmNkLT5mbGFncywgRE1BX1JUQUlMKSkKIAkJCXdyaXRlX2tjdHh0X2NzcihkZCwgY3R4dCwgUkNWX0hEUl9UQUlMX0FERFIsCi0JCQkJCXJjZC0+cmN2aGRycXRhaWxhZGRyX3BoeXMpOworCQkJCQlyY2QtPnJjdmhkcnF0YWlsYWRkcl9kbWEpOwogCQlyY2QtPnNlcV9jbnQgPSAxOwogCiAJCS8qIHJlc2V0IHRoZSBjYWNoZWQgcmVjZWl2ZSBoZWFkZXIgcXVldWUgaGVhZCB2YWx1ZSAqLwpAQCAtMTE1NTcsOSArMTE2MjMsOSBAQAogCQkgKiB1cGRhdGUgd2l0aCBhIGR1bW15IHRhaWwgYWRkcmVzcyBhbmQgdGhlbiBkaXNhYmxlCiAJCSAqIHJlY2VpdmUgY29udGV4dC4KIAkJICovCi0JCWlmIChkZC0+cmN2aGRydGFpbF9kdW1teV9waHlzYWRkcikgeworCQlpZiAoZGQtPnJjdmhkcnRhaWxfZHVtbXlfZG1hKSB7CiAJCQl3cml0ZV9rY3R4dF9jc3IoZGQsIGN0eHQsIFJDVl9IRFJfVEFJTF9BRERSLAotCQkJCQlkZC0+cmN2aGRydGFpbF9kdW1teV9waHlzYWRkcik7CisJCQkJCWRkLT5yY3ZoZHJ0YWlsX2R1bW15X2RtYSk7CiAJCQkvKiBFbmFibGluZyBSY3ZDdHh0Q3RybC5UYWlsVXBkIGlzIGludGVudGlvbmFsLiAqLwogCQkJcmN2Y3RybCB8PSBSQ1ZfQ1RYVF9DVFJMX1RBSUxfVVBEX1NNQVNLOwogCQl9CkBAIC0xMTU3MCw3ICsxMTYzNiw3IEBACiAJCXJjdmN0cmwgfD0gUkNWX0NUWFRfQ1RSTF9JTlRSX0FWQUlMX1NNQVNLOwogCWlmIChvcCAmIEhGSTFfUkNWQ1RSTF9JTlRSQVZBSUxfRElTKQogCQlyY3ZjdHJsICY9IH5SQ1ZfQ1RYVF9DVFJMX0lOVFJfQVZBSUxfU01BU0s7Ci0JaWYgKG9wICYgSEZJMV9SQ1ZDVFJMX1RBSUxVUERfRU5CICYmIHJjZC0+cmN2aGRycXRhaWxhZGRyX3BoeXMpCisJaWYgKG9wICYgSEZJMV9SQ1ZDVFJMX1RBSUxVUERfRU5CICYmIHJjZC0+cmN2aGRycXRhaWxhZGRyX2RtYSkKIAkJcmN2Y3RybCB8PSBSQ1ZfQ1RYVF9DVFJMX1RBSUxfVVBEX1NNQVNLOwogCWlmIChvcCAmIEhGSTFfUkNWQ1RSTF9UQUlMVVBEX0RJUykgewogCQkvKiBTZWUgY29tbWVudCBvbiBSY3ZDdHh0Q3RybC5UYWlsVXBkIGFib3ZlICovCkBAIC0xMTY0Miw3ICsxMTcwOCw3IEBACiAJCSAqIHNvIGl0IGRvZXNuJ3QgY29udGFpbiBhbiBhZGRyZXNzIHRoYXQgaXMgaW52YWxpZC4KIAkJICovCiAJCXdyaXRlX2tjdHh0X2NzcihkZCwgY3R4dCwgUkNWX0hEUl9UQUlMX0FERFIsCi0JCQkJZGQtPnJjdmhkcnRhaWxfZHVtbXlfcGh5c2FkZHIpOworCQkJCWRkLT5yY3ZoZHJ0YWlsX2R1bW15X2RtYSk7CiB9CiAKIHUzMiBoZmkxX3JlYWRfY250cnMoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIGNoYXIgKipuYW1lcCwgdTY0ICoqY250cnApCkBAIC0xMjg2NSw3ICsxMjkzMSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc2V0X3VwX2NvbnRleHRfdmFyaWFibGVzKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkKQogewotCWludCBudW1fa2VybmVsX2NvbnRleHRzOworCXVuc2lnbmVkIGxvbmcgbnVtX2tlcm5lbF9jb250ZXh0czsKIAlpbnQgdG90YWxfY29udGV4dHM7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBuZ3JvdXBzOwpAQCAtMTI4OTQsOSArMTI5NjAsOSBAQAogCSAqLwogCWlmIChudW1fa2VybmVsX2NvbnRleHRzID4gKGRkLT5jaGlwX3NlbmRfY29udGV4dHMgLSBudW1fdmxzIC0gMSkpIHsKIAkJZGRfZGV2X2VycihkZCwKLQkJCSAgICJSZWR1Y2luZyAjIGtlcm5lbCByY3YgY29udGV4dHMgdG86ICVkLCBmcm9tICVkXG4iLAorCQkJICAgIlJlZHVjaW5nICMga2VybmVsIHJjdiBjb250ZXh0cyB0bzogJWQsIGZyb20gJWx1XG4iLAogCQkJICAgKGludCkoZGQtPmNoaXBfc2VuZF9jb250ZXh0cyAtIG51bV92bHMgLSAxKSwKLQkJCSAgIChpbnQpbnVtX2tlcm5lbF9jb250ZXh0cyk7CisJCQkgICBudW1fa2VybmVsX2NvbnRleHRzKTsKIAkJbnVtX2tlcm5lbF9jb250ZXh0cyA9IGRkLT5jaGlwX3NlbmRfY29udGV4dHMgLSBudW1fdmxzIC0gMTsKIAl9CiAJLyoKQEAgLTEzMzE5LDkgKzEzMzg1LDkgQEAKIAkJLyoKIAkJICogR2l2ZSB1cCBhZnRlciAxbXMgLSBtYXhpbXVtIHdhaXQgdGltZS4KIAkJICoKLQkJICogUkJ1ZiBzaXplIGlzIDE0OEtpQi4gIFNsb3dlc3QgcG9zc2libGUgaXMgUENJZSBHZW4xIHgxIGF0CisJCSAqIFJCdWYgc2l6ZSBpcyAxMzZLaUIuICBTbG93ZXN0IHBvc3NpYmxlIGlzIFBDSWUgR2VuMSB4MSBhdAogCQkgKiAyNTBNQi9zIGJhbmR3aWR0aC4gIExvd2VyIHJhdGUgdG8gNjYlIGZvciBvdmVyaGVhZCB0byBnZXQ6Ci0JCSAqCTE0OCBLQiAvICg2NiUgKiAyNTBNQi9zKSA9IDkyMHVzCisJCSAqCTEzNiBLQiAvICg2NiUgKiAyNTBNQi9zKSA9IDg0NHVzCiAJCSAqLwogCQlpZiAoY291bnQrKyA+IDUwMCkgewogCQkJZGRfZGV2X2VycihkZCwKQEAgLTE0NTAwLDYgKzE0NTY2LDExIEBACiAJaWYgKHJldCkKIAkJZ290byBiYWlsX2NsZWFudXA7CiAKKwkvKiBjYWxsIGJlZm9yZSBnZXRfcGxhdGZvcm1fY29uZmlnKCksIGFmdGVyIGluaXRfY2hpcF9yZXNvdXJjZXMoKSAqLworCXJldCA9IGVwcm9tX2luaXQoZGQpOworCWlmIChyZXQpCisJCWdvdG8gYmFpbF9mcmVlX3JjdmVycjsKKwogCS8qIE5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgaGZpMV9maXJtd2FyZV9pbml0ICovCiAJZ2V0X3BsYXRmb3JtX2NvbmZpZyhkZCk7CiAKQEAgLTE0NjIwLDEwICsxNDY5MSw2IEBACiAJaWYgKHJldCkKIAkJZ290byBiYWlsX2ZyZWVfY250cnM7CiAKLQlyZXQgPSBlcHJvbV9pbml0KGRkKTsKLQlpZiAocmV0KQotCQlnb3RvIGJhaWxfZnJlZV9yY3ZlcnI7Ci0KIAlnb3RvIGJhaWw7CiAKIGJhaWxfZnJlZV9yY3ZlcnI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9jaGlwLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9jaGlwLmgKaW5kZXggZWQxMTEwNy4uOTIzNDUyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvY2hpcC5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2NoaXAuaApAQCAtODIsNyArODIsNyBAQAogICovCiAjZGVmaW5lIENNX1ZBVSAzCiAvKiBIRkkgbGluayBjcmVkaXQgY291bnQsIEFLQSByZWNlaXZlIGJ1ZmZlciBkZXB0aCAoUkJVRl9ERVBUSCkgKi8KLSNkZWZpbmUgQ01fR0xPQkFMX0NSRURJVFMgMHg5NDAKKyNkZWZpbmUgQ01fR0xPQkFMX0NSRURJVFMgMHg4ODAKIC8qIE51bWJlciBvZiBQS2V5IGVudHJpZXMgaW4gdGhlIEhXICovCiAjZGVmaW5lIE1BWF9QS0VZX1ZBTFVFUyAxNgogCkBAIC0yNTQsMTIgKzI1NCwxNCBAQAogI2RlZmluZSBGQUlMRURfTE5JX1ZFUklGWV9DQVAyCQlCSVQoMTApCiAjZGVmaW5lIEZBSUxFRF9MTklfQ09ORklHTFQJCUJJVCgxMSkKICNkZWZpbmUgSE9TVF9IQU5EU0hBS0VfVElNRU9VVAkJQklUKDEyKQorI2RlZmluZSBFWFRFUk5BTF9ERVZJQ0VfUkVRX1RJTUVPVVQJQklUKDEzKQogCiAjZGVmaW5lIEZBSUxFRF9MTkkgKEZBSUxFRF9MTklfUE9MTElORyB8IEZBSUxFRF9MTklfREVCT1VOQ0UgXAogCQkJfCBGQUlMRURfTE5JX0VTVEJDT01NIHwgRkFJTEVEX0xOSV9PUFRFUSBcCiAJCQl8IEZBSUxFRF9MTklfVkVSSUZZX0NBUDEgXAogCQkJfCBGQUlMRURfTE5JX1ZFUklGWV9DQVAyIFwKLQkJCXwgRkFJTEVEX0xOSV9DT05GSUdMVCB8IEhPU1RfSEFORFNIQUtFX1RJTUVPVVQpCisJCQl8IEZBSUxFRF9MTklfQ09ORklHTFQgfCBIT1NUX0hBTkRTSEFLRV9USU1FT1VUIFwKKwkJCXwgRVhURVJOQUxfREVWSUNFX1JFUV9USU1FT1VUKQogCiAvKiBEQ19EQzgwNTFfREJHX0VSUl9JTkZPX1NFVF9CWV84MDUxLkhPU1RfTVNHIC0gaG9zdCBtZXNzYWdlIGZsYWdzICovCiAjZGVmaW5lIEhPU1RfUkVRX0RPTkUJCUJJVCgwKQpAQCAtNzA2LDYgKzcwOCw3IEBACiB2b2lkIGhhbmRsZV9saW5rX2Rvd24oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQgaGFuZGxlX2xpbmtfZG93bmdyYWRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiB2b2lkIGhhbmRsZV9saW5rX2JvdW5jZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwordm9pZCBoYW5kbGVfc3RhcnRfbGluayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogdm9pZCBoYW5kbGVfc21hX21lc3NhZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQgcmVzZXRfcXNmcChzdHJ1Y3QgaGZpMV9wcG9ydGRhdGEgKnBwZCk7CiB2b2lkIHFzZnBfZXZlbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKQEAgLTEzMzUsNyArMTMzOCw3IEBACiB1NjQgZ2V0X2FsbF9jcHVfdG90YWwodTY0IF9fcGVyY3B1ICpjbnRyKTsKIHZvaWQgaGZpMV9zdGFydF9jbGVhbnVwKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkKTsKIHZvaWQgaGZpMV9jbGVhcl90aWRzKHN0cnVjdCBoZmkxX2N0eHRkYXRhICpyY2QpOwotc3RydWN0IGhmaTFfbWVzc2FnZV9oZWFkZXIgKmhmaTFfZ2V0X21zZ2hlYWRlcigKK3N0cnVjdCBpYl9oZWFkZXIgKmhmaTFfZ2V0X21zZ2hlYWRlcigKIAkJCQlzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgX19sZTMyICpyaGZfYWRkcik7CiBpbnQgaGZpMV9pbml0X2N0eHQoc3RydWN0IHNlbmRfY29udGV4dCAqc2MpOwogdm9pZCBoZmkxX3B1dF90aWQoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHUzMiBpbmRleCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2NvbW1vbi5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvY29tbW9uLmgKaW5kZXggZmNjOWMyMS4uZGE3YmUyMWJlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvY29tbW9uLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvY29tbW9uLmgKQEAgLTMyMCwxNCArMzIwLDYgQEAKIC8qIFJIRiByZWNlaXZlIHR5cGUgZXJyb3IgLSBieXBhc3MgcGFja2V0IGVycm9ycyAqLwogI2RlZmluZSBSSEZfUlRFX0JZUEFTU19OT19FUlIJCTB4MAogCi0vKgotICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGZpcnN0IGZpZWxkIGNvbW1vbiB0byBhbGwgcHJvdG9jb2xzCi0gKiB0aGF0IGVtcGxveSB0aGlzIGNoaXAuCi0gKi8KLXN0cnVjdCBoZmkxX21lc3NhZ2VfaGVhZGVyIHsKLQlfX2JlMTYgbHJoWzRdOwotfTsKLQogLyogSUIgLSBMUkggaGVhZGVyIGNvbnN0YW50cyAqLwogI2RlZmluZSBIRkkxX0xSSF9HUkggMHgwMDAzICAgICAgLyogMS4gd29yZCBvZiBJQiBMUkggLSBuZXh0IGhlYWRlcjogR1JIICovCiAjZGVmaW5lIEhGSTFfTFJIX0JUSCAweDAwMDIgICAgICAvKiAxLiB3b3JkIG9mIElCIExSSCAtIG5leHQgaGVhZGVyOiBCVEggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2RlYnVnZnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2RlYnVnZnMuYwppbmRleCBkYmFiOWQ5Li42MzJiYTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZGVidWdmcy5jCkBAIC01OSw2ICs1OSw0MCBAQAogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqaGZpMV9kYmdfcm9vdDsKIAorLyogd3JhcHBlcnMgdG8gZW5mb3JjZSBzcmN1IGluIHNlcSBmaWxlICovCitzdGF0aWMgc3NpemVfdCBoZmkxX3NlcV9yZWFkKAorCXN0cnVjdCBmaWxlICpmaWxlLAorCWNoYXIgX191c2VyICpidWYsCisJc2l6ZV90IHNpemUsCisJbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBkZW50cnkgKmQgPSBmaWxlLT5mX3BhdGguZGVudHJ5OworCWludCBzcmN1X2lkeDsKKwlzc2l6ZV90IHI7CisKKwlyID0gZGVidWdmc191c2VfZmlsZV9zdGFydChkLCAmc3JjdV9pZHgpOworCWlmIChsaWtlbHkoIXIpKQorCQlyID0gc2VxX3JlYWQoZmlsZSwgYnVmLCBzaXplLCBwcG9zKTsKKwlkZWJ1Z2ZzX3VzZV9maWxlX2ZpbmlzaChzcmN1X2lkeCk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBsb2ZmX3QgaGZpMV9zZXFfbHNlZWsoCisJc3RydWN0IGZpbGUgKmZpbGUsCisJbG9mZl90IG9mZnNldCwKKwlpbnQgd2hlbmNlKQoreworCXN0cnVjdCBkZW50cnkgKmQgPSBmaWxlLT5mX3BhdGguZGVudHJ5OworCWludCBzcmN1X2lkeDsKKwlsb2ZmX3QgcjsKKworCXIgPSBkZWJ1Z2ZzX3VzZV9maWxlX3N0YXJ0KGQsICZzcmN1X2lkeCk7CisJaWYgKGxpa2VseSghcikpCisJCXIgPSBzZXFfbHNlZWsoZmlsZSwgb2Zmc2V0LCB3aGVuY2UpOworCWRlYnVnZnNfdXNlX2ZpbGVfZmluaXNoKHNyY3VfaWR4KTsKKwlyZXR1cm4gcjsKK30KKwogI2RlZmluZSBwcml2YXRlMmRkKGZpbGUpIChmaWxlX2lub2RlKGZpbGUpLT5pX3ByaXZhdGUpCiAjZGVmaW5lIHByaXZhdGUycHBkKGZpbGUpIChmaWxlX2lub2RlKGZpbGUpLT5pX3ByaXZhdGUpCiAKQEAgLTg3LDggKzEyMSw4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBfIyNuYW1lIyNfZmlsZV9vcHMgPSB7IFwKIAkub3duZXIgICA9IFRISVNfTU9EVUxFLCBcCiAJLm9wZW4gICAgPSBfIyNuYW1lIyNfb3BlbiwgXAotCS5yZWFkICAgID0gc2VxX3JlYWQsIFwKLQkubGxzZWVrICA9IHNlcV9sc2VlaywgXAorCS5yZWFkICAgID0gaGZpMV9zZXFfcmVhZCwgXAorCS5sbHNlZWsgID0gaGZpMV9zZXFfbHNlZWssIFwKIAkucmVsZWFzZSA9IHNlcV9yZWxlYXNlIFwKIH0KIApAQCAtMTA1LDExICsxMzksOSBAQAogCURFQlVHRlNfRklMRV9DUkVBVEUoI25hbWUsIHBhcmVudCwgZGF0YSwgJl8jI25hbWUjI19maWxlX29wcywgU19JUlVHTykKIAogc3RhdGljIHZvaWQgKl9vcGNvZGVfc3RhdHNfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpCi1fX2FjcXVpcmVzKFJDVSkKIHsKIAlzdHJ1Y3QgaGZpMV9vcGNvZGVfc3RhdHNfcGVyY3R4ICpvcHN0YXRzOwogCi0JcmN1X3JlYWRfbG9jaygpOwogCWlmICgqcG9zID49IEFSUkFZX1NJWkUob3BzdGF0cy0+c3RhdHMpKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gcG9zOwpAQCAtMTI2LDkgKzE1OCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIF9vcGNvZGVfc3RhdHNfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQotX19yZWxlYXNlcyhSQ1UpCiB7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIHN0YXRpYyBpbnQgX29wY29kZV9zdGF0c19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCkBAIC0yMjMsMjggKzI1MywzMiBAQAogREVCVUdGU19GSUxFX09QUyhjdHhfc3RhdHMpOwogCiBzdGF0aWMgdm9pZCAqX3FwX3N0YXRzX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGxvZmZfdCAqcG9zKQotX19hY3F1aXJlcyhSQ1UpCisJX19hY3F1aXJlcyhSQ1UpCiB7CiAJc3RydWN0IHFwX2l0ZXIgKml0ZXI7CiAJbG9mZl90IG4gPSAqcG9zOwogCi0JcmN1X3JlYWRfbG9jaygpOwogCWl0ZXIgPSBxcF9pdGVyX2luaXQocy0+cHJpdmF0ZSk7CisKKwkvKiBzdG9wIGNhbGxzIHJjdV9yZWFkX3VubG9jayAqLworCXJjdV9yZWFkX2xvY2soKTsKKwogCWlmICghaXRlcikKIAkJcmV0dXJuIE5VTEw7CiAKLQl3aGlsZSAobi0tKSB7CisJZG8gewogCQlpZiAocXBfaXRlcl9uZXh0KGl0ZXIpKSB7CiAJCQlrZnJlZShpdGVyKTsKIAkJCXJldHVybiBOVUxMOwogCQl9Ci0JfQorCX0gd2hpbGUgKG4tLSk7CiAKIAlyZXR1cm4gaXRlcjsKIH0KIAogc3RhdGljIHZvaWQgKl9xcF9zdGF0c19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKml0ZXJfcHRyLAogCQkJCWxvZmZfdCAqcG9zKQorCV9fbXVzdF9ob2xkKFJDVSkKIHsKIAlzdHJ1Y3QgcXBfaXRlciAqaXRlciA9IGl0ZXJfcHRyOwogCkBAIC0yNTksNyArMjkzLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgX3FwX3N0YXRzX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqaXRlcl9wdHIpCi1fX3JlbGVhc2VzKFJDVSkKKwlfX3JlbGVhc2VzKFJDVSkKIHsKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KQEAgLTI4MSwxMiArMzE1LDEwIEBACiBERUJVR0ZTX0ZJTEVfT1BTKHFwX3N0YXRzKTsKIAogc3RhdGljIHZvaWQgKl9zZGVzX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGxvZmZfdCAqcG9zKQotX19hY3F1aXJlcyhSQ1UpCiB7CiAJc3RydWN0IGhmaTFfaWJkZXYgKmliZDsKIAlzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZDsKIAotCXJjdV9yZWFkX2xvY2soKTsKIAlpYmQgPSAoc3RydWN0IGhmaTFfaWJkZXYgKilzLT5wcml2YXRlOwogCWRkID0gZGRfZnJvbV9kZXYoaWJkKTsKIAlpZiAoIWRkLT5wZXJfc2RtYSB8fCAqcG9zID49IGRkLT5udW1fc2RtYSkKQEAgLTMwNiw5ICszMzgsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBfc2Rlc19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCi1fX3JlbGVhc2VzKFJDVSkKIHsKLQlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAogc3RhdGljIGludCBfc2Rlc19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCkBAIC0zMzUsMTEgKzM2NSw5IEBACiAJc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQ7CiAJc3NpemVfdCBydmFsOwogCi0JcmN1X3JlYWRfbG9jaygpOwogCWRkID0gcHJpdmF0ZTJkZChmaWxlKTsKIAlhdmFpbCA9IGhmaTFfcmVhZF9jbnRycyhkZCwgTlVMTCwgJmNvdW50ZXJzKTsKIAlydmFsID0gIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGNvdW50ZXJzLCBhdmFpbCk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHJ2YWw7CiB9CiAKQEAgLTM1MiwxMSArMzgwLDkgQEAKIAlzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZDsKIAlzc2l6ZV90IHJ2YWw7CiAKLQlyY3VfcmVhZF9sb2NrKCk7CiAJZGQgPSBwcml2YXRlMmRkKGZpbGUpOwogCWF2YWlsID0gaGZpMV9yZWFkX2NudHJzKGRkLCAmbmFtZXMsIE5VTEwpOwogCXJ2YWwgPSAgc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgbmFtZXMsIGF2YWlsKTsKLQlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcnZhbDsKIH0KIApAQCAtMzc5LDExICs0MDUsOSBAQAogCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkOwogCXNzaXplX3QgcnZhbDsKIAotCXJjdV9yZWFkX2xvY2soKTsKIAlkZCA9IHByaXZhdGUyZGQoZmlsZSk7CiAJYXZhaWwgPSBoZmkxX3JlYWRfcG9ydGNudHJzKGRkLT5wcG9ydCwgJm5hbWVzLCBOVUxMKTsKIAlydmFsID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgbmFtZXMsIGF2YWlsKTsKLQlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcnZhbDsKIH0KIApAQCAtMzk2LDExICs0MjAsOSBAQAogCXN0cnVjdCBoZmkxX3Bwb3J0ZGF0YSAqcHBkOwogCXNzaXplX3QgcnZhbDsKIAotCXJjdV9yZWFkX2xvY2soKTsKIAlwcGQgPSBwcml2YXRlMnBwZChmaWxlKTsKIAlhdmFpbCA9IGhmaTFfcmVhZF9wb3J0Y250cnMocHBkLCBOVUxMLCAmY291bnRlcnMpOwogCXJ2YWwgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCBjb3VudGVycywgYXZhaWwpOwotCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiBydmFsOwogfQogCkBAIC00MzAsMTYgKzQ1MiwxMyBAQAogCWludCB1c2VkOwogCWludCBpOwogCi0JcmN1X3JlYWRfbG9jaygpOwogCXBwZCA9IHByaXZhdGUycHBkKGZpbGUpOwogCWRkID0gcHBkLT5kZDsKIAlzaXplID0gUEFHRV9TSVpFOwogCXVzZWQgPSAwOwogCXRtcCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0bXApIHsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJaWYgKCF0bXApCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXNjcmF0Y2gwID0gcmVhZF9jc3IoZGQsIEFTSUNfQ0ZHX1NDUkFUQ0gpOwogCXVzZWQgKz0gc2NucHJpbnRmKHRtcCArIHVzZWQsIHNpemUgLSB1c2VkLApAQCAtNDY2LDcgKzQ4NSw2IEBACiAJdXNlZCArPSBzY25wcmludGYodG1wICsgdXNlZCwgc2l6ZSAtIHVzZWQsICJXcml0ZSBiaXRzIHRvIGNsZWFyXG4iKTsKIAogCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIHRtcCwgdXNlZCk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiAJa2ZyZWUodG1wKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDgyLDE1ICs1MDAsMTIgQEAKIAl1NjQgc2NyYXRjaDA7CiAJdTY0IGNsZWFyOwogCi0JcmN1X3JlYWRfbG9jaygpOwogCXBwZCA9IHByaXZhdGUycHBkKGZpbGUpOwogCWRkID0gcHBkLT5kZDsKIAogCWJ1ZmYgPSBrbWFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZG9fcmV0dXJuOwotCX0KKwlpZiAoIWJ1ZmYpCisJCXJldHVybiAtRU5PTUVNOwogCiAJcmV0ID0gY29weV9mcm9tX3VzZXIoYnVmZiwgYnVmLCBjb3VudCk7CiAJaWYgKHJldCA+IDApIHsKQEAgLTUyMyw4ICs1MzgsNiBAQAogCiAgZG9fZnJlZToKIAlrZnJlZShidWZmKTsKLSBkb19yZXR1cm46Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTM4LDE4ICs1NTEsMTQgQEAKIAljaGFyICp0bXA7CiAJaW50IHJldDsKIAotCXJjdV9yZWFkX2xvY2soKTsKIAlwcGQgPSBwcml2YXRlMnBwZChmaWxlKTsKIAl0bXAgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0bXApIHsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJaWYgKCF0bXApCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXJldCA9IHFzZnBfZHVtcChwcGQsIHRtcCwgUEFHRV9TSVpFKTsKIAlpZiAocmV0ID4gMCkKIAkJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgdG1wLCByZXQpOwotCXJjdV9yZWFkX3VubG9jaygpOwogCWtmcmVlKHRtcCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTU2NSw3ICs1NzQsNiBAQAogCWludCBvZmZzZXQ7CiAJaW50IHRvdGFsX3dyaXR0ZW47CiAKLQlyY3VfcmVhZF9sb2NrKCk7CiAJcHBkID0gcHJpdmF0ZTJwcGQoZmlsZSk7CiAKIAkvKiBieXRlIG9mZnNldCBmb3JtYXQ6IFtvZmZzZXRTaXplXVtpMmNBZGRyXVtvZmZzZXRIaWdoXVtvZmZzZXRMb3ddICovCkBAIC01NzMsMTYgKzU4MSwxMiBAQAogCW9mZnNldCA9ICpwcG9zICYgMHhmZmZmOwogCiAJLyogZXhwbGljaXRseSByZWplY3QgaW52YWxpZCBhZGRyZXNzIDAgdG8gY2F0Y2ggY3AgYW5kIGNhdCAqLwotCWlmIChpMmNfYWRkciA9PSAwKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gX3JldHVybjsKLQl9CisJaWYgKGkyY19hZGRyID09IDApCisJCXJldHVybiAtRUlOVkFMOwogCiAJYnVmZiA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIF9yZXR1cm47Ci0JfQorCWlmICghYnVmZikKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXQgPSBjb3B5X2Zyb21fdXNlcihidWZmLCBidWYsIGNvdW50KTsKIAlpZiAocmV0ID4gMCkgewpAQCAtNjAyLDggKzYwNiw2IEBACiAKICBfZnJlZToKIAlrZnJlZShidWZmKTsKLSBfcmV0dXJuOgotCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTYzMiw3ICs2MzQsNiBAQAogCWludCBvZmZzZXQ7CiAJaW50IHRvdGFsX3JlYWQ7CiAKLQlyY3VfcmVhZF9sb2NrKCk7CiAJcHBkID0gcHJpdmF0ZTJwcGQoZmlsZSk7CiAKIAkvKiBieXRlIG9mZnNldCBmb3JtYXQ6IFtvZmZzZXRTaXplXVtpMmNBZGRyXVtvZmZzZXRIaWdoXVtvZmZzZXRMb3ddICovCkBAIC02NDAsMTYgKzY0MSwxMiBAQAogCW9mZnNldCA9ICpwcG9zICYgMHhmZmZmOwogCiAJLyogZXhwbGljaXRseSByZWplY3QgaW52YWxpZCBhZGRyZXNzIDAgdG8gY2F0Y2ggY3AgYW5kIGNhdCAqLwotCWlmIChpMmNfYWRkciA9PSAwKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gX3JldHVybjsKLQl9CisJaWYgKGkyY19hZGRyID09IDApCisJCXJldHVybiAtRUlOVkFMOwogCiAJYnVmZiA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIF9yZXR1cm47Ci0JfQorCWlmICghYnVmZikKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAl0b3RhbF9yZWFkID0gaTJjX3JlYWQocHBkLCB0YXJnZXQsIGkyY19hZGRyLCBvZmZzZXQsIGJ1ZmYsIGNvdW50KTsKIAlpZiAodG90YWxfcmVhZCA8IDApIHsKQEAgLTY2OSw4ICs2NjYsNiBAQAogCiAgX2ZyZWU6CiAJa2ZyZWUoYnVmZik7Ci0gX3JldHVybjoKLQlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC02OTcsMjYgKzY5MiwyMCBAQAogCWludCByZXQ7CiAJaW50IHRvdGFsX3dyaXR0ZW47CiAKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JaWYgKCpwcG9zICsgY291bnQgPiBRU0ZQX1BBR0VTSVpFICogNCkgeyAvKiBiYXNlIHBhZ2UgKyBwYWdlMDAtcGFnZTAzICovCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gX3JldHVybjsKLQl9CisJaWYgKCpwcG9zICsgY291bnQgPiBRU0ZQX1BBR0VTSVpFICogNCkgLyogYmFzZSBwYWdlICsgcGFnZTAwLXBhZ2UwMyAqLworCQlyZXR1cm4gLUVJTlZBTDsKIAogCXBwZCA9IHByaXZhdGUycHBkKGZpbGUpOwogCiAJYnVmZiA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIF9yZXR1cm47Ci0JfQorCWlmICghYnVmZikKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXQgPSBjb3B5X2Zyb21fdXNlcihidWZmLCBidWYsIGNvdW50KTsKIAlpZiAocmV0ID4gMCkgewogCQlyZXQgPSAtRUZBVUxUOwogCQlnb3RvIF9mcmVlOwogCX0KLQogCXRvdGFsX3dyaXR0ZW4gPSBxc2ZwX3dyaXRlKHBwZCwgdGFyZ2V0LCAqcHBvcywgYnVmZiwgY291bnQpOwogCWlmICh0b3RhbF93cml0dGVuIDwgMCkgewogCQlyZXQgPSB0b3RhbF93cml0dGVuOwpAQCAtNzI5LDggKzcxOCw2IEBACiAKICBfZnJlZToKIAlrZnJlZShidWZmKTsKLSBfcmV0dXJuOgotCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTc1Nyw3ICs3NDQsNiBAQAogCWludCByZXQ7CiAJaW50IHRvdGFsX3JlYWQ7CiAKLQlyY3VfcmVhZF9sb2NrKCk7CiAJaWYgKCpwcG9zICsgY291bnQgPiBRU0ZQX1BBR0VTSVpFICogNCkgeyAvKiBiYXNlIHBhZ2UgKyBwYWdlMDAtcGFnZTAzICovCiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gX3JldHVybjsKQEAgLTc5MCw3ICs3NzYsNiBAQAogIF9mcmVlOgogCWtmcmVlKGJ1ZmYpOwogIF9yZXR1cm46Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtOTQ4LDYgKzkzMyw0MyBAQAogCURFQlVHRlNfT1BTKCJhc2ljX2ZsYWdzIiwgYXNpY19mbGFnc19yZWFkLCBhc2ljX2ZsYWdzX3dyaXRlKSwKIH07CiAKK3N0YXRpYyB2b2lkICpfc2RtYV9jcHVfbGlzdF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzLCBsb2ZmX3QgKnBvcykKK3sKKwlpZiAoKnBvcyA+PSBudW1fb25saW5lX2NwdXMoKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gcG9zOworfQorCitzdGF0aWMgdm9pZCAqX3NkbWFfY3B1X2xpc3Rfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwkrKypwb3M7CisJaWYgKCpwb3MgPj0gbnVtX29ubGluZV9jcHVzKCkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHBvczsKK30KKworc3RhdGljIHZvaWQgX3NkbWFfY3B1X2xpc3Rfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCS8qIG5vdGhpbmcgYWxsb2NhdGVkICovCit9CisKK3N0YXRpYyBpbnQgX3NkbWFfY3B1X2xpc3Rfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCXN0cnVjdCBoZmkxX2liZGV2ICppYmQgPSAoc3RydWN0IGhmaTFfaWJkZXYgKilzLT5wcml2YXRlOworCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkID0gZGRfZnJvbV9kZXYoaWJkKTsKKwlsb2ZmX3QgKnNwb3MgPSB2OworCWxvZmZfdCBpID0gKnNwb3M7CisKKwlzZG1hX3NlcWZpbGVfZHVtcF9jcHVfbGlzdChzLCBkZCwgKHVuc2lnbmVkIGxvbmcpaSk7CisJcmV0dXJuIDA7Cit9CisKK0RFQlVHRlNfU0VRX0ZJTEVfT1BTKHNkbWFfY3B1X2xpc3QpOworREVCVUdGU19TRVFfRklMRV9PUEVOKHNkbWFfY3B1X2xpc3QpCitERUJVR0ZTX0ZJTEVfT1BTKHNkbWFfY3B1X2xpc3QpOworCiB2b2lkIGhmaTFfZGJnX2liZGV2X2luaXQoc3RydWN0IGhmaTFfaWJkZXYgKmliZCkKIHsKIAljaGFyIG5hbWVbc2l6ZW9mKCJwb3J0MGNvdW50ZXJzIikgKyAxXTsKQEAgLTk3Niw2ICs5OTgsNyBAQAogCURFQlVHRlNfU0VRX0ZJTEVfQ1JFQVRFKGN0eF9zdGF0cywgaWJkLT5oZmkxX2liZGV2X2RiZywgaWJkKTsKIAlERUJVR0ZTX1NFUV9GSUxFX0NSRUFURShxcF9zdGF0cywgaWJkLT5oZmkxX2liZGV2X2RiZywgaWJkKTsKIAlERUJVR0ZTX1NFUV9GSUxFX0NSRUFURShzZGVzLCBpYmQtPmhmaTFfaWJkZXZfZGJnLCBpYmQpOworCURFQlVHRlNfU0VRX0ZJTEVfQ1JFQVRFKHNkbWFfY3B1X2xpc3QsIGliZC0+aGZpMV9pYmRldl9kYmcsIGliZCk7CiAJLyogZGV2IGNvdW50ZXIgZmlsZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbnRyX29wcyk7IGkrKykKIAkJREVCVUdGU19GSUxFX0NSRUFURShjbnRyX29wc1tpXS5uYW1lLApAQCAtMTAwNiw3ICsxMDI5LDYgQEAKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoaWJkLT5oZmkxX2liZGV2X2RiZyk7CiBvdXQ6CiAJaWJkLT5oZmkxX2liZGV2X2RiZyA9IE5VTEw7Ci0Jc3luY2hyb25pemVfcmN1KCk7CiB9CiAKIC8qCkBAIC0xMDMxLDkgKzEwNTMsNyBAQAogfTsKIAogc3RhdGljIHZvaWQgKl9kcml2ZXJfc3RhdHNfbmFtZXNfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpCi1fX2FjcXVpcmVzKFJDVSkKIHsKLQlyY3VfcmVhZF9sb2NrKCk7CiAJaWYgKCpwb3MgPj0gQVJSQVlfU0laRShoZmkxX3N0YXRuYW1lcykpCiAJCXJldHVybiBOVUxMOwogCXJldHVybiBwb3M7CkBAIC0xMDUxLDkgKzEwNzEsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBfZHJpdmVyX3N0YXRzX25hbWVzX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKLV9fcmVsZWFzZXMoUkNVKQogewotCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiBzdGF0aWMgaW50IF9kcml2ZXJfc3RhdHNfbmFtZXNfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQpAQCAtMTA2OSw5ICsxMDg3LDcgQEAKIERFQlVHRlNfRklMRV9PUFMoZHJpdmVyX3N0YXRzX25hbWVzKTsKIAogc3RhdGljIHZvaWQgKl9kcml2ZXJfc3RhdHNfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpCi1fX2FjcXVpcmVzKFJDVSkKIHsKLQlyY3VfcmVhZF9sb2NrKCk7CiAJaWYgKCpwb3MgPj0gQVJSQVlfU0laRShoZmkxX3N0YXRuYW1lcykpCiAJCXJldHVybiBOVUxMOwogCXJldHVybiBwb3M7CkBAIC0xMDg2LDkgKzExMDIsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBfZHJpdmVyX3N0YXRzX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKLV9fcmVsZWFzZXMoUkNVKQogewotCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiBzdGF0aWMgdTY0IGhmaTFfc3BzX2ludHModm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2RyaXZlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZHJpdmVyLmMKaW5kZXggODI0NmRjNy4uNjU2M2U0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZHJpdmVyLmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogc3RhdGljIHZvaWQgcmN2X2hkcmVycihzdHJ1Y3QgaGZpMV9jdHh0ZGF0YSAqcmNkLCBzdHJ1Y3QgaGZpMV9wcG9ydGRhdGEgKnBwZCwKIAkJICAgICAgIHN0cnVjdCBoZmkxX3BhY2tldCAqcGFja2V0KQogewotCXN0cnVjdCBoZmkxX21lc3NhZ2VfaGVhZGVyICpyaGRyID0gcGFja2V0LT5oZHI7CisJc3RydWN0IGliX2hlYWRlciAqcmhkciA9IHBhY2tldC0+aGRyOwogCXUzMiBydGUgPSByaGZfcmN2X3R5cGVfZXJyKHBhY2tldC0+cmhmKTsKIAlpbnQgbG5oID0gYmUxNl90b19jcHUocmhkci0+bHJoWzBdKSAmIDM7CiAJc3RydWN0IGhmaTFfaWJwb3J0ICppYnAgPSAmcHBkLT5pYnBvcnRfZGF0YTsKQEAgLTI4OCwxMCArMjg4LDkgQEAKIAogCWlmIChwYWNrZXQtPnJoZiAmIFJIRl9USURfRVJSKSB7CiAJCS8qIEZvciBUSURFUlIgYW5kIFJDIFFQcyBwcmVlbXB0aXZlbHkgc2NoZWR1bGUgYSBOQUsgKi8KLQkJc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIgPSAoc3RydWN0IGhmaTFfaWJfaGVhZGVyICopcmhkcjsKLQkJc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkciA9IE5VTEw7CisJCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyID0gTlVMTDsKIAkJdTMyIHRsZW4gPSByaGZfcGt0X2xlbihwYWNrZXQtPnJoZik7IC8qIGluIGJ5dGVzICovCi0JCXUxNiBsaWQgID0gYmUxNl90b19jcHUoaGRyLT5scmhbMV0pOworCQl1MTYgbGlkICA9IGJlMTZfdG9fY3B1KHJoZHItPmxyaFsxXSk7CiAJCXUzMiBxcF9udW07CiAJCXUzMiByY3ZfZmxhZ3MgPSAwOwogCkBAIC0zMDEsMTQgKzMwMCwxNCBAQAogCiAJCS8qIENoZWNrIGZvciBHUkggKi8KIAkJaWYgKGxuaCA9PSBIRkkxX0xSSF9CVEgpIHsKLQkJCW9oZHIgPSAmaGRyLT51Lm90aDsKKwkJCW9oZHIgPSAmcmhkci0+dS5vdGg7CiAJCX0gZWxzZSBpZiAobG5oID09IEhGSTFfTFJIX0dSSCkgewogCQkJdTMyIHZ0ZjsKIAotCQkJb2hkciA9ICZoZHItPnUubC5vdGg7Ci0JCQlpZiAoaGRyLT51LmwuZ3JoLm5leHRfaGRyICE9IElCX0dSSF9ORVhUX0hEUikKKwkJCW9oZHIgPSAmcmhkci0+dS5sLm90aDsKKwkJCWlmIChyaGRyLT51LmwuZ3JoLm5leHRfaGRyICE9IElCX0dSSF9ORVhUX0hEUikKIAkJCQlnb3RvIGRyb3A7Ci0JCQl2dGYgPSBiZTMyX3RvX2NwdShoZHItPnUubC5ncmgudmVyc2lvbl90Y2xhc3NfZmxvdyk7CisJCQl2dGYgPSBiZTMyX3RvX2NwdShyaGRyLT51LmwuZ3JoLnZlcnNpb25fdGNsYXNzX2Zsb3cpOwogCQkJaWYgKCh2dGYgPj4gSUJfR1JIX1ZFUlNJT05fU0hJRlQpICE9IElCX0dSSF9WRVJTSU9OKQogCQkJCWdvdG8gZHJvcDsKIAkJCXJjdl9mbGFncyB8PSBIRkkxX0hBU19HUkg7CkBAIC0zNDQsNyArMzQzLDcgQEAKIAkJCWNhc2UgSUJfUVBUX1JDOgogCQkJCWhmaTFfcmNfaGRyZXJyKAogCQkJCQlyY2QsCi0JCQkJCWhkciwKKwkJCQkJcmhkciwKIAkJCQkJcmN2X2ZsYWdzLAogCQkJCQlxcCk7CiAJCQkJYnJlYWs7CkBAIC00NTIsOCArNDUxLDggQEAKIAkJCSAgICAgICBib29sIGRvX2NucCkKIHsKIAlzdHJ1Y3QgaGZpMV9pYnBvcnQgKmlicCA9IHRvX2lwb3J0KHFwLT5pYnFwLmRldmljZSwgcXAtPnBvcnRfbnVtKTsKLQlzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkciA9IHBrdC0+aGRyOwotCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHIgPSBwa3QtPm9oZHI7CisJc3RydWN0IGliX2hlYWRlciAqaGRyID0gcGt0LT5oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHIgPSBwa3QtPm9oZHI7CiAJc3RydWN0IGliX2dyaCAqZ3JoID0gTlVMTDsKIAl1MzIgcnFwbiA9IDAsIGJ0aDE7CiAJdTE2IHJsaWQsIGRsaWQgPSBiZTE2X3RvX2NwdShoZHItPmxyaFsxXSk7CkBAIC00ODcsNyArNDg2LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXNjID0gaGRyMnNjKChzdHJ1Y3QgaGZpMV9tZXNzYWdlX2hlYWRlciAqKWhkciwgcGt0LT5yaGYpOworCXNjID0gaGRyMnNjKGhkciwgcGt0LT5yaGYpOwogCiAJYnRoMSA9IGJlMzJfdG9fY3B1KG9oZHItPmJ0aFsxXSk7CiAJaWYgKGRvX2NucCAmJiAoYnRoMSAmIEhGSTFfRkVDTl9TTUFTSykpIHsKQEAgLTU5OSw4ICs1OTgsOCBAQAogCQlfX2xlMzIgKnJoZl9hZGRyID0gKF9fbGUzMiAqKXJjZC0+cmN2aGRycSArIG1kYXRhLnBzX2hlYWQgKwogCQkJCQkgZGQtPnJoZl9vZmZzZXQ7CiAJCXN0cnVjdCBydnRfcXAgKnFwOwotCQlzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkcjsKLQkJc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwkJc3RydWN0IGliX2hlYWRlciAqaGRyOworCQlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAkJc3RydWN0IHJ2dF9kZXZfaW5mbyAqcmRpID0gJmRkLT52ZXJic19kZXYucmRpOwogCQl1NjQgcmhmID0gcmhmX3RvX2NwdShyaGZfYWRkcik7CiAJCXUzMiBldHlwZSA9IHJoZl9yY3ZfdHlwZShyaGYpLCBxcG4sIGJ0aDE7CkBAIC02MTYsOCArNjE1LDggQEAKIAkJaWYgKGV0eXBlICE9IFJIRl9SQ1ZfVFlQRV9JQikKIAkJCWdvdG8gbmV4dDsKIAotCQloZHIgPSAoc3RydWN0IGhmaTFfaWJfaGVhZGVyICopCi0JCQloZmkxX2dldF9tc2doZWFkZXIoZGQsIHJoZl9hZGRyKTsKKwkJaGRyID0gaGZpMV9nZXRfbXNnaGVhZGVyKGRkLCByaGZfYWRkcik7CisKIAkJbG5oID0gYmUxNl90b19jcHUoaGRyLT5scmhbMF0pICYgMzsKIAogCQlpZiAobG5oID09IEhGSTFfTFJIX0JUSCkKQEAgLTg4OCwxNCArODg3LDE1IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNldF9hcm1lZF90b19hY3RpdmUoc3RydWN0IGhmaTFfY3R4dGRhdGEgKnJjZCwKLQkJCQkgICAgICBzdHJ1Y3QgaGZpMV9wYWNrZXQgcGFja2V0LAorCQkJCSAgICAgIHN0cnVjdCBoZmkxX3BhY2tldCAqcGFja2V0LAogCQkJCSAgICAgIHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkKQogewogCXN0cnVjdCB3b3JrX3N0cnVjdCAqbHNhdyA9ICZyY2QtPnBwZC0+bGlua3N0YXRlX2FjdGl2ZV93b3JrOwotCXN0cnVjdCBoZmkxX21lc3NhZ2VfaGVhZGVyICpoZHIgPSBoZmkxX2dldF9tc2doZWFkZXIocGFja2V0LnJjZC0+ZGQsCi0JCQkJCQkJICAgICBwYWNrZXQucmhmX2FkZHIpOworCXN0cnVjdCBpYl9oZWFkZXIgKmhkciA9IGhmaTFfZ2V0X21zZ2hlYWRlcihwYWNrZXQtPnJjZC0+ZGQsCisJCQkJCQkgICBwYWNrZXQtPnJoZl9hZGRyKTsKKwl1OCBldHlwZSA9IHJoZl9yY3ZfdHlwZShwYWNrZXQtPnJoZik7CiAKLQlpZiAoaGRyMnNjKGhkciwgcGFja2V0LnJoZikgIT0gMHhmKSB7CisJaWYgKGV0eXBlID09IFJIRl9SQ1ZfVFlQRV9JQiAmJiBoZHIyc2MoaGRyLCBwYWNrZXQtPnJoZikgIT0gMHhmKSB7CiAJCWludCBod3N0YXRlID0gcmVhZF9sb2dpY2FsX3N0YXRlKGRkKTsKIAogCQlpZiAoaHdzdGF0ZSAhPSBMU1RBVEVfQUNUSVZFKSB7CkBAIC05NzksNyArOTc5LDcgQEAKIAkJCS8qIEF1dG8gYWN0aXZhdGUgbGluayBvbiBub24tU0MxNSBwYWNrZXQgcmVjZWl2ZSAqLwogCQkJaWYgKHVubGlrZWx5KHJjZC0+cHBkLT5ob3N0X2xpbmtfc3RhdGUgPT0KIAkJCQkgICAgIEhMU19VUF9BUk1FRCkgJiYKLQkJCSAgICBzZXRfYXJtZWRfdG9fYWN0aXZlKHJjZCwgcGFja2V0LCBkZCkpCisJCQkgICAgc2V0X2FybWVkX3RvX2FjdGl2ZShyY2QsICZwYWNrZXQsIGRkKSkKIAkJCQlnb3RvIGJhaWw7CiAJCQlsYXN0ID0gcHJvY2Vzc19yY3ZfcGFja2V0KCZwYWNrZXQsIHRocmVhZCk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2Vwcm9tLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9lcHJvbS5jCmluZGV4IDM2Yjc3OTQuLmU3MGMyMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2Vwcm9tLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZXByb20uYwpAQCAtNDksNyArNDksMjYgQEAKICNpbmNsdWRlICJjb21tb24uaCIKICNpbmNsdWRlICJlcHJvbS5oIgogCisvKgorICogVGhlIEVQUk9NIGlzIGxvZ2ljYWxseSBkaXZpZGVkIGludG8gdGhyZWUgcGFydGl0aW9uczoKKyAqCXBhcnRpdGlvbiAwOiB0aGUgZmlyc3QgMTI4SywgdmlzaWJsZSBmcm9tIFBDSSBST00gQkFSCisgKglwYXJ0aXRpb24gMTogNEsgY29uZmlnIGZpbGUgKHNlY3RvciBzaXplKQorICoJcGFydGl0aW9uIDI6IHRoZSByZXN0CisgKi8KKyNkZWZpbmUgUDBfU0laRSAoMTI4ICogMTAyNCkKKyNkZWZpbmUgUDFfU0laRSAgICg0ICogMTAyNCkKKyNkZWZpbmUgUDFfU1RBUlQgUDBfU0laRQorI2RlZmluZSBQMl9TVEFSVCAoUDBfU0laRSArIFAxX1NJWkUpCisKKy8qIGNvbnRyb2xsZXIgcGFnZSBzaXplLCBpbiBieXRlcyAqLworI2RlZmluZSBFUF9QQUdFX1NJWkUgMjU2CisjZGVmaW5lIEVQX1BBR0VfTUFTSyAoRVBfUEFHRV9TSVpFIC0gMSkKKyNkZWZpbmUgRVBfUEFHRV9EV09SRFMgKEVQX1BBR0VfU0laRSAvIHNpemVvZih1MzIpKQorCisvKiBjb250cm9sbGVyIGNvbW1hbmRzICovCiAjZGVmaW5lIENNRF9TSElGVCAyNAorI2RlZmluZSBDTURfTk9QCQkJICAgICgwKQorI2RlZmluZSBDTURfUkVBRF9EQVRBKGFkZHIpCSAgICAoKDB4MDMgPDwgQ01EX1NISUZUKSB8IGFkZHIpCiAjZGVmaW5lIENNRF9SRUxFQVNFX1BPV0VSRE9XTl9OT0lEICAoKDB4YWIgPDwgQ01EX1NISUZUKSkKIAogLyogY29udHJvbGxlciBpbnRlcmZhY2Ugc3BlZWRzICovCkBAIC02MSw2ICs4MCw5MCBAQAogICogRG91YmxlIGl0IGZvciBzYWZldHkuCiAgKi8KICNkZWZpbmUgRVBST01fVElNRU9VVCA4MDAwMCAvKiBtcyAqLworCisvKgorICogUmVhZCBhIDI1NiBieXRlICg2NCBkd29yZCkgRVBST00gcGFnZS4KKyAqIEFsbCBjYWxsZXJzIGhhdmUgdmVyaWZpZWQgdGhlIG9mZnNldCBpcyBhdCBhIHBhZ2UgYm91bmRhcnkuCisgKi8KK3N0YXRpYyB2b2lkIHJlYWRfcGFnZShzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgdTMyIG9mZnNldCwgdTMyICpyZXN1bHQpCit7CisJaW50IGk7CisKKwl3cml0ZV9jc3IoZGQsIEFTSUNfRUVQX0FERFJfQ01ELCBDTURfUkVBRF9EQVRBKG9mZnNldCkpOworCWZvciAoaSA9IDA7IGkgPCBFUF9QQUdFX0RXT1JEUzsgaSsrKQorCQlyZXN1bHRbaV0gPSAodTMyKXJlYWRfY3NyKGRkLCBBU0lDX0VFUF9EQVRBKTsKKwl3cml0ZV9jc3IoZGQsIEFTSUNfRUVQX0FERFJfQ01ELCBDTURfTk9QKTsgLyogY2xvc2Ugb3BlbiBwYWdlICovCit9CisKKy8qCisgKiBSZWFkIGxlbmd0aCBieXRlcyBzdGFydGluZyBhdCBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIEVQUk9NLgorICovCitzdGF0aWMgaW50IHJlYWRfbGVuZ3RoKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCB1MzIgc3RhcnQsIHUzMiBsZW4sIHZvaWQgKmRlc3QpCit7CisJdTMyIGJ1ZmZlcltFUF9QQUdFX0RXT1JEU107CisJdTMyIGVuZDsKKwl1MzIgc3RhcnRfb2Zmc2V0OworCXUzMiByZWFkX3N0YXJ0OworCXUzMiBieXRlczsKKworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIDA7CisKKwllbmQgPSBzdGFydCArIGxlbjsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZSByZWFkIHJhbmdlIGlzIG5vdCBvdXRzaWRlIG9mIHRoZSBjb250cm9sbGVyIHJlYWQKKwkgKiBjb21tYW5kIGFkZHJlc3MgcmFuZ2UuICBOb3RlIHRoYXQgJz4nIGlzIGNvcnJlY3QgYmVsb3cgLSB0aGUgZW5kCisJICogb2YgdGhlIHJhbmdlIGlzIE9LIGlmIGl0IHN0b3BzIGF0IHRoZSBsaW1pdCwgYnV0IG5vIGhpZ2hlci4KKwkgKi8KKwlpZiAoZW5kID4gKDEgPDwgQ01EX1NISUZUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiByZWFkIHRoZSBmaXJzdCBwYXJ0aWFsIHBhZ2UgKi8KKwlzdGFydF9vZmZzZXQgPSBzdGFydCAmIEVQX1BBR0VfTUFTSzsKKwlpZiAoc3RhcnRfb2Zmc2V0KSB7CisJCS8qIHBhcnRpYWwgc3RhcnRpbmcgcGFnZSAqLworCisJCS8qIGFsaWduIGFuZCByZWFkIHRoZSBwYWdlIHRoYXQgY29udGFpbnMgdGhlIHN0YXJ0ICovCisJCXJlYWRfc3RhcnQgPSBzdGFydCAmIH5FUF9QQUdFX01BU0s7CisJCXJlYWRfcGFnZShkZCwgcmVhZF9zdGFydCwgYnVmZmVyKTsKKworCQkvKiB0aGUgcmVzdCBvZiB0aGUgcGFnZSBpcyBhdmFpbGFibGUgZGF0YSAqLworCQlieXRlcyA9IEVQX1BBR0VfU0laRSAtIHN0YXJ0X29mZnNldDsKKworCQlpZiAobGVuIDw9IGJ5dGVzKSB7CisJCQkvKiBlbmQgaXMgd2l0aGluIHRoaXMgcGFnZSAqLworCQkJbWVtY3B5KGRlc3QsICh1OCAqKWJ1ZmZlciArIHN0YXJ0X29mZnNldCwgbGVuKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJbWVtY3B5KGRlc3QsICh1OCAqKWJ1ZmZlciArIHN0YXJ0X29mZnNldCwgYnl0ZXMpOworCisJCXN0YXJ0ICs9IGJ5dGVzOworCQlsZW4gLT0gYnl0ZXM7CisJCWRlc3QgKz0gYnl0ZXM7CisJfQorCS8qIHN0YXJ0IGlzIG5vdyBwYWdlIGFsaWduZWQgKi8KKworCS8qIHJlYWQgd2hvbGUgcGFnZXMgKi8KKwl3aGlsZSAobGVuID49IEVQX1BBR0VfU0laRSkgeworCQlyZWFkX3BhZ2UoZGQsIHN0YXJ0LCBidWZmZXIpOworCQltZW1jcHkoZGVzdCwgYnVmZmVyLCBFUF9QQUdFX1NJWkUpOworCisJCXN0YXJ0ICs9IEVQX1BBR0VfU0laRTsKKwkJbGVuIC09IEVQX1BBR0VfU0laRTsKKwkJZGVzdCArPSBFUF9QQUdFX1NJWkU7CisJfQorCisJLyogcmVhZCB0aGUgbGFzdCBwYXJ0aWFsIHBhZ2UgKi8KKwlpZiAobGVuKSB7CisJCXJlYWRfcGFnZShkZCwgc3RhcnQsIGJ1ZmZlcik7CisJCW1lbWNweShkZXN0LCBidWZmZXIsIGxlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBJbml0aWFsaXplIHRoZSBFUFJPTSBoYW5kbGVyLgogICovCkBAIC0xMDAsMyArMjAzLDg1IEBACiBkb25lX2FzaWM6CiAJcmV0dXJuIHJldDsKIH0KKworLyogbWFnaWMgY2hhcmFjdGVyIHNlcXVlbmNlIHRoYXQgdHJhaWxzIGFuIGltYWdlICovCisjZGVmaW5lIElNQUdFX1RSQUlMX01BR0lDICJlZ2FtaUFQTyIKKworLyoKKyAqIFJlYWQgYWxsIG9mIHBhcnRpdGlvbiAxLiAgVGhlIGFjdHVhbCBmaWxlIGlzIGF0IHRoZSBmcm9udC4gIEFkanVzdAorICogdGhlIHJldHVybmVkIHNpemUgaWYgYSB0cmFpbGluZyBpbWFnZSBtYWdpYyBpcyBmb3VuZC4KKyAqLworc3RhdGljIGludCByZWFkX3BhcnRpdGlvbl9wbGF0Zm9ybV9jb25maWcoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHZvaWQgKipkYXRhLAorCQkJCQkgIHUzMiAqc2l6ZSkKK3sKKwl2b2lkICpidWZmZXI7CisJdm9pZCAqcDsKKwl1MzIgbGVuZ3RoOworCWludCByZXQ7CisKKwlidWZmZXIgPSBrbWFsbG9jKFAxX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IHJlYWRfbGVuZ3RoKGRkLCBQMV9TVEFSVCwgUDFfU0laRSwgYnVmZmVyKTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKGJ1ZmZlcik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogc2NhbiBmb3IgaW1hZ2UgbWFnaWMgdGhhdCBtYXkgdHJhaWwgdGhlIGFjdHVhbCBkYXRhICovCisJcCA9IHN0cm5zdHIoYnVmZmVyLCBJTUFHRV9UUkFJTF9NQUdJQywgUDFfU0laRSk7CisJaWYgKHApCisJCWxlbmd0aCA9IHAgLSBidWZmZXI7CisJZWxzZQorCQlsZW5ndGggPSBQMV9TSVpFOworCisJKmRhdGEgPSBidWZmZXI7CisJKnNpemUgPSBsZW5ndGg7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIGZpbGUgZnJvbSB0aGUgRVBST00uCisgKgorICogT24gc3VjY2VzcywgYW4gYWxsb2NhdGVkIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIGFuZCBpdHMgc2l6ZSBhcmUKKyAqIHJldHVybmVkLiAgSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBmcmVlIHRoaXMgYnVmZmVyLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqICAgMAkgICAgICAtIHN1Y2Nlc3MKKyAqICAgLUVOWElPICAgLSBubyBFUFJPTSBpcyBhdmFpbGFibGUKKyAqICAgLUVCVVNZICAgLSBub3QgYWJsZSB0byBhY3F1aXJlIGFjY2VzcyB0byB0aGUgRVBST00KKyAqICAgLUVOT0VOVCAgLSBubyByZWNvZ25pemFibGUgZmlsZSB3cml0dGVuCisgKiAgIC1FTk9NRU0gIC0gYnVmZmVyIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQKKyAqLworaW50IGVwcm9tX3JlYWRfcGxhdGZvcm1fY29uZmlnKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCB2b2lkICoqZGF0YSwgdTMyICpzaXplKQoreworCXUzMiBkaXJlY3RvcnlbRVBfUEFHRV9EV09SRFNdOyAvKiBhbGlnbmVkIGJ1ZmZlciAqLworCWludCByZXQ7CisKKwlpZiAoIWRkLT5lcHJvbV9hdmFpbGFibGUpCisJCXJldHVybiAtRU5YSU87CisKKwlyZXQgPSBhY3F1aXJlX2NoaXBfcmVzb3VyY2UoZGQsIENSX0VQUk9NLCBFUFJPTV9USU1FT1VUKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogcmVhZCB0aGUgbGFzdCBwYWdlIG9mIFAwIGZvciB0aGUgRVBST00gZm9ybWF0IG1hZ2ljICovCisJcmV0ID0gcmVhZF9sZW5ndGgoZGQsIFAxX1NUQVJUIC0gRVBfUEFHRV9TSVpFLCBFUF9QQUdFX1NJWkUsIGRpcmVjdG9yeSk7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCisJLyogbGFzdCBkd29yZCBvZiBQMCBjb250YWlucyBhIG1hZ2ljIGluZGljYXRvciAqLworCWlmIChkaXJlY3RvcnlbRVBfUEFHRV9EV09SRFMgLSAxXSA9PSAwKSB7CisJCS8qIHBhcnRpdGlvbiBmb3JtYXQgKi8KKwkJcmV0ID0gcmVhZF9wYXJ0aXRpb25fcGxhdGZvcm1fY29uZmlnKGRkLCBkYXRhLCBzaXplKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIG5vdGhpbmcgcmVjb2duaXplZCAqLworCXJldCA9IC1FTk9FTlQ7CisKK2RvbmU6CisJcmVsZWFzZV9jaGlwX3Jlc291cmNlKGRkLCBDUl9FUFJPTSk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2Vwcm9tLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9lcHJvbS5oCmluZGV4IGQ0MWYwYjEuLmU3NzQxODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2Vwcm9tLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZXByb20uaApAQCAtNDUsOCArNDUsOCBAQAogICoKICAqLwogCi1zdHJ1Y3QgaGZpMV9jbWQ7CiBzdHJ1Y3QgaGZpMV9kZXZkYXRhOwogCiBpbnQgZXByb21faW5pdChzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCk7Ci1pbnQgaGFuZGxlX2Vwcm9tX2NvbW1hbmQoc3RydWN0IGZpbGUgKmZwLCBjb25zdCBzdHJ1Y3QgaGZpMV9jbWQgKmNtZCk7CitpbnQgZXByb21fcmVhZF9wbGF0Zm9ybV9jb25maWcoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHZvaWQgKipidWZfcmV0LAorCQkJICAgICAgIHUzMiAqc2l6ZV9yZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZmlsZV9vcHMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2ZpbGVfb3BzLmMKaW5kZXggMWVjYmVjMS4uNjc3ZWZhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZmlsZV9vcHMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9maWxlX29wcy5jCkBAIC01OCw3ICs1OCw2IEBACiAjaW5jbHVkZSAidHJhY2UuaCIKICNpbmNsdWRlICJ1c2VyX3NkbWEuaCIKICNpbmNsdWRlICJ1c2VyX2V4cF9yY3YuaCIKLSNpbmNsdWRlICJlcHJvbS5oIgogI2luY2x1ZGUgImFzcG0uaCIKICNpbmNsdWRlICJtbXVfcmIuaCIKIApAQCAtMTgzLDYgKzE4Miw3IEBACiAJaWYgKGZkKSB7CiAJCWZkLT5yZWNfY3B1X251bSA9IC0xOyAvKiBubyBjcHUgYWZmaW5pdHkgYnkgZGVmYXVsdCAqLwogCQlmZC0+bW0gPSBjdXJyZW50LT5tbTsKKwkJYXRvbWljX2luYygmZmQtPm1tLT5tbV9jb3VudCk7CiAJfQogCiAJZnAtPnByaXZhdGVfZGF0YSA9IGZkOwpAQCAtMjIyLDcgKzIyMiw3IEBACiAJCXJldCA9IGFzc2lnbl9jdHh0KGZwLCAmdWluZm8pOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7Ci0JCXNldHVwX2N0eHQoZnApOworCQlyZXQgPSBzZXR1cF9jdHh0KGZwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJCXJldCA9IHVzZXJfaW5pdChmcCk7CkBAIC00MzksOSArNDM5LDEwIEBACiAJc3RydWN0IGhmaTFfZmlsZWRhdGEgKmZkID0gZnAtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaGZpMV9jdHh0ZGF0YSAqdWN0eHQgPSBmZC0+dWN0eHQ7CiAJc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgcGZuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTY0IHRva2VuID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZULAogCQltZW1hZGRyID0gMDsKKwl2b2lkICptZW12aXJ0ID0gTlVMTDsKIAl1OCBzdWJjdHh0LCBtYXBpbyA9IDAsIHZtZiA9IDAsIHR5cGU7CiAJc3NpemVfdCBtZW1sZW4gPSAwOwogCWludCByZXQgPSAwOwpAQCAtNDkyLDcgKzQ5Myw4IEBACiAJCSAqIHNlY29uZCBvciB0aGlyZCBwYWdlIGFsbG9jYXRlZCBmb3IgY3JlZGl0IHJldHVybnMgKGlmIG51bWJlcgogCQkgKiBvZiBlbmFibGVkIGNvbnRleHRzID4gNjQgYW5kIDEyOCByZXNwZWN0aXZlbHkpLgogCQkgKi8KLQkJbWVtYWRkciA9IGRkLT5jcl9iYXNlW3VjdHh0LT5udW1hX2lkXS5wYSArCisJCW1lbXZpcnQgPSBkZC0+Y3JfYmFzZVt1Y3R4dC0+bnVtYV9pZF0udmE7CisJCW1lbWFkZHIgPSB2aXJ0X3RvX3BoeXMobWVtdmlydCkgKwogCQkJKCgodTY0KXVjdHh0LT5zYy0+aHdfZnJlZSAtCiAJCQkgICh1NjQpZGQtPmNyX2Jhc2VbdWN0eHQtPm51bWFfaWRdLnZhKSAmIFBBR0VfTUFTSyk7CiAJCW1lbWxlbiA9IFBBR0VfU0laRTsKQEAgLTUwNyw4ICs1MDksOCBAQAogCQltYXBpbyA9IDE7CiAJCWJyZWFrOwogCWNhc2UgUkNWX0hEUlE6Ci0JCW1lbWFkZHIgPSB1Y3R4dC0+cmN2aGRycV9waHlzOwogCQltZW1sZW4gPSB1Y3R4dC0+cmN2aGRycV9zaXplOworCQltZW12aXJ0ID0gdWN0eHQtPnJjdmhkcnE7CiAJCWJyZWFrOwogCWNhc2UgUkNWX0VHUkJVRjogewogCQl1bnNpZ25lZCBsb25nIGFkZHI7CkBAIC01MzIsMTQgKzUzNCwyMSBAQAogCQl2bWEtPnZtX2ZsYWdzICY9IH5WTV9NQVlXUklURTsKIAkJYWRkciA9IHZtYS0+dm1fc3RhcnQ7CiAJCWZvciAoaSA9IDAgOyBpIDwgdWN0eHQtPmVncmJ1ZnMubnVtYnVmczsgaSsrKSB7CisJCQltZW1sZW4gPSB1Y3R4dC0+ZWdyYnVmcy5idWZmZXJzW2ldLmxlbjsKKwkJCW1lbXZpcnQgPSB1Y3R4dC0+ZWdyYnVmcy5idWZmZXJzW2ldLmFkZHI7CiAJCQlyZXQgPSByZW1hcF9wZm5fcmFuZ2UoCiAJCQkJdm1hLCBhZGRyLAotCQkJCXVjdHh0LT5lZ3JidWZzLmJ1ZmZlcnNbaV0ucGh5cyA+PiBQQUdFX1NISUZULAotCQkJCXVjdHh0LT5lZ3JidWZzLmJ1ZmZlcnNbaV0ubGVuLAorCQkJCS8qCisJCQkJICogdmlydF90b19wZm4oKSBkb2VzIHRoZSBzYW1lLCBidXQKKwkJCQkgKiBpdCdzIG5vdCBhdmFpbGFibGUgb24geDg2XzY0CisJCQkJICogd2hlbiBDT05GSUdfTU1VIGlzIGVuYWJsZWQuCisJCQkJICovCisJCQkJUEZOX0RPV04oX19wYShtZW12aXJ0KSksCisJCQkJbWVtbGVuLAogCQkJCXZtYS0+dm1fcGFnZV9wcm90KTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWdvdG8gZG9uZTsKLQkJCWFkZHIgKz0gdWN0eHQtPmVncmJ1ZnMuYnVmZmVyc1tpXS5sZW47CisJCQlhZGRyICs9IG1lbWxlbjsKIAkJfQogCQlyZXQgPSAwOwogCQlnb3RvIGRvbmU7CkBAIC01OTUsOCArNjA0LDggQEAKIAkJCXJldCA9IC1FUEVSTTsKIAkJCWdvdG8gZG9uZTsKIAkJfQotCQltZW1hZGRyID0gdWN0eHQtPnJjdmhkcnF0YWlsYWRkcl9waHlzOwogCQltZW1sZW4gPSBQQUdFX1NJWkU7CisJCW1lbXZpcnQgPSAodm9pZCAqKXVjdHh0LT5yY3ZoZHJ0YWlsX2t2YWRkcjsKIAkJZmxhZ3MgJj0gflZNX01BWVdSSVRFOwogCQlicmVhazsKIAljYXNlIFNVQkNUWFRfVVJFR1M6CkBAIC02NDksMTYgKzY1OCwyNCBAQAogCQkgICIldToldSB0eXBlOiV1IGlvL3ZmOiVkLyVkLCBhZGRyOjB4JWxseCwgbGVuOiVsdSglbHUpLCBmbGFnczoweCVseFxuIiwKIAkJICAgIGN0eHQsIHN1YmN0eHQsIHR5cGUsIG1hcGlvLCB2bWYsIG1lbWFkZHIsIG1lbWxlbiwKIAkJICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwgdm1hLT52bV9mbGFncyk7Ci0JcGZuID0gKHVuc2lnbmVkIGxvbmcpKG1lbWFkZHIgPj4gUEFHRV9TSElGVCk7CiAJaWYgKHZtZikgewotCQl2bWEtPnZtX3Bnb2ZmID0gcGZuOworCQl2bWEtPnZtX3Bnb2ZmID0gUEZOX0RPV04obWVtYWRkcik7CiAJCXZtYS0+dm1fb3BzID0gJnZtX29wczsKIAkJcmV0ID0gMDsKIAl9IGVsc2UgaWYgKG1hcGlvKSB7Ci0JCXJldCA9IGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHBmbiwgbWVtbGVuLAorCQlyZXQgPSBpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJCQkgUEZOX0RPV04obWVtYWRkciksCisJCQkJCSBtZW1sZW4sCiAJCQkJCSB2bWEtPnZtX3BhZ2VfcHJvdCk7CisJfSBlbHNlIGlmIChtZW12aXJ0KSB7CisJCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkJICAgICAgUEZOX0RPV04oX19wYShtZW12aXJ0KSksCisJCQkJICAgICAgbWVtbGVuLAorCQkJCSAgICAgIHZtYS0+dm1fcGFnZV9wcm90KTsKIAl9IGVsc2UgewotCQlyZXQgPSByZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBwZm4sIG1lbWxlbiwKKwkJcmV0ID0gcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCQkgICAgICBQRk5fRE9XTihtZW1hZGRyKSwKKwkJCQkgICAgICBtZW1sZW4sCiAJCQkJICAgICAgdm1hLT52bV9wYWdlX3Byb3QpOwogCX0KIGRvbmU6CkBAIC03NzksNiArNzk2LDcgQEAKIAltdXRleF91bmxvY2soJmhmaTFfbXV0ZXgpOwogCWhmaTFfZnJlZV9jdHh0ZGF0YShkZCwgdWN0eHQpOwogZG9uZToKKwltbWRyb3AoZmRhdGEtPm1tKTsKIAlrb2JqZWN0X3B1dCgmZGQtPmtvYmopOwogCWtmcmVlKGZkYXRhKTsKIAlyZXR1cm4gMDsKQEAgLTk1OSwxNCArOTc3LDE2IEBACiAJICovCiAJdWN0eHQtPnNjID0gc2NfYWxsb2MoZGQsIFNDX1VTRVIsIHVjdHh0LT5yY3ZoZHJxZW50c2l6ZSwKIAkJCSAgICAgdWN0eHQtPmRkLT5ub2RlKTsKLQlpZiAoIXVjdHh0LT5zYykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KKwlpZiAoIXVjdHh0LT5zYykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGN0eGRhdGFfZnJlZTsKKwl9CiAJaGZpMV9jZGJnKFBST0MsICJhbGxvY2F0ZWQgc2VuZCBjb250ZXh0ICV1KCV1KVxuIiwgdWN0eHQtPnNjLT5zd19pbmRleCwKIAkJICB1Y3R4dC0+c2MtPmh3X2NvbnRleHQpOwogCXJldCA9IHNjX2VuYWJsZSh1Y3R4dC0+c2MpOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gY3R4ZGF0YV9mcmVlOworCiAJLyoKIAkgKiBTZXR1cCBzaGFyZWQgY29udGV4dCByZXNvdXJjZXMgaWYgdGhlIHVzZXItbGV2ZWwgaGFzIHJlcXVlc3RlZAogCSAqIHNoYXJlZCBjb250ZXh0cyBhbmQgdGhpcyBpcyB0aGUgJ21hc3RlcicgcHJvY2Vzcy4KQEAgLTk4MCw3ICsxMDAwLDcgQEAKIAkJICogc2VuZCBjb250ZXh0IGJlY2F1c2UgaXQgd2lsbCBiZSBkb25lIGR1cmluZyBmaWxlIGNsb3NlCiAJCSAqLwogCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gY3R4ZGF0YV9mcmVlOwogCX0KIAl1Y3R4dC0+dXNlcnZlcnNpb24gPSB1aW5mby0+dXNlcnZlcnNpb247CiAJdWN0eHQtPmZsYWdzID0gaGZpMV9jYXBfbWFzazsgLyogc2F2ZSBjdXJyZW50IGZsYWcgc3RhdGUgKi8KQEAgLTEwMDAsNiArMTAyMCwxMSBAQAogCWZkLT51Y3R4dCA9IHVjdHh0OwogCiAJcmV0dXJuIDA7CisKK2N0eGRhdGFfZnJlZToKKwlkZC0+cmNkW2N0eHRdID0gTlVMTDsKKwloZmkxX2ZyZWVfY3R4dGRhdGEoZGQsIHVjdHh0KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGluaXRfc3ViY3R4dHMoc3RydWN0IGhmaTFfY3R4dGRhdGEgKnVjdHh0LApAQCAtMTI1OCw3ICsxMjgzLDcgQEAKIAkJCQkJICAgICAgIHVjdHh0LT5yY3ZoZHJxKTsKIAliaW5mby5yY3ZlZ3JfYnVmYmFzZSA9IEhGSTFfTU1BUF9UT0tFTihSQ1ZfRUdSQlVGLCB1Y3R4dC0+Y3R4dCwKIAkJCQkJICAgICAgIGZkLT5zdWJjdHh0LAotCQkJCQkgICAgICAgdWN0eHQtPmVncmJ1ZnMucmN2dGlkc1swXS5waHlzKTsKKwkJCQkJICAgICAgIHVjdHh0LT5lZ3JidWZzLnJjdnRpZHNbMF0uZG1hKTsKIAliaW5mby5zZG1hX2NvbXBfYnVmYmFzZSA9IEhGSTFfTU1BUF9UT0tFTihTRE1BX0NPTVAsIHVjdHh0LT5jdHh0LAogCQkJCQkJIGZkLT5zdWJjdHh0LCAwKTsKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvaGZpLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9oZmkuaAppbmRleCAxMDAwZTBmLi43ZWVmMTFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9oZmkuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9oZmkuaApAQCAtNjQsNiArNjQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlIDxyZG1hL2liX2hkcnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yaGFzaHRhYmxlLmg+CiAjaW5jbHVkZSA8cmRtYS9yZG1hX3Z0Lmg+CiAKICNpbmNsdWRlICJjaGlwX3JlZ2lzdGVycy5oIgpAQCAtMTcxLDEyICsxNzMsMTIgQEAKIAl1MzIgdGhyZXNob2xkOyAgICAgICAgICAgLyogaGVhZCB1cGRhdGUgdGhyZXNob2xkICovCiAJc3RydWN0IGVhZ2VyX2J1ZmZlciB7CiAJCXZvaWQgKmFkZHI7Ci0JCWRtYV9hZGRyX3QgcGh5czsKKwkJZG1hX2FkZHJfdCBkbWE7CiAJCXNzaXplX3QgbGVuOwogCX0gKmJ1ZmZlcnM7CiAJc3RydWN0IHsKIAkJdm9pZCAqYWRkcjsKLQkJZG1hX2FkZHJfdCBwaHlzOworCQlkbWFfYWRkcl90IGRtYTsKIAl9ICpyY3Z0aWRzOwogfTsKIApAQCAtMjA3LDggKzIwOSw4IEBACiAJLyogc2l6ZSBvZiBlYWNoIG9mIHRoZSByY3ZoZHJxIGVudHJpZXMgKi8KIAl1MTYgcmN2aGRycWVudHNpemU7CiAJLyogbW1hcCBvZiBoZHJxLCBtdXN0IGZpdCBpbiA0NCBiaXRzICovCi0JZG1hX2FkZHJfdCByY3ZoZHJxX3BoeXM7Ci0JZG1hX2FkZHJfdCByY3ZoZHJxdGFpbGFkZHJfcGh5czsKKwlkbWFfYWRkcl90IHJjdmhkcnFfZG1hOworCWRtYV9hZGRyX3QgcmN2aGRycXRhaWxhZGRyX2RtYTsKIAlzdHJ1Y3QgY3R4dF9lYWdlcl9idWZzIGVncmJ1ZnM7CiAJLyogdGhpcyByZWNlaXZlIGNvbnRleHQncyBhc3NpZ25lZCBQSU8gQUNLIHNlbmQgY29udGV4dCAqLwogCXN0cnVjdCBzZW5kX2NvbnRleHQgKnNjOwpAQCAtMzUwLDcgKzM1Miw3IEBACiAJc3RydWN0IGhmaTFfY3R4dGRhdGEgKnJjZDsKIAlfX2xlMzIgKnJoZl9hZGRyOwogCXN0cnVjdCBydnRfcXAgKnFwOwotCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJdTY0IHJoZjsKIAl1MzIgbWF4Y250OwogCXUzMiByaHFvZmY7CkBAIC01MjksNiArNTMxLDcgQEAKIAl2b2lkICphcmc7CiAJY2hhciBuYW1lW01BWF9OQU1FX1NJWkVdOwogCWNwdW1hc2tfdCBtYXNrOworCXN0cnVjdCBpcnFfYWZmaW5pdHlfbm90aWZ5IG5vdGlmeTsKIH07CiAKIC8qIHBlci1TTCBDQ0EgaW5mb3JtYXRpb24gKi8KQEAgLTYwNSw2ICs2MDgsNyBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCBmcmVlemVfd29yazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbGlua19kb3duZ3JhZGVfd29yazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbGlua19ib3VuY2Vfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHN0YXJ0X2xpbmtfd29yazsKIAkvKiBob3N0IGxpbmsgc3RhdGUgdmFyaWFibGVzICovCiAJc3RydWN0IG11dGV4IGhsc19sb2NrOwogCXUzMiBob3N0X2xpbmtfc3RhdGU7CkBAIC02NTksNiArNjYzLDcgQEAKIAl1OCBsaW5raW5pdF9yZWFzb247CiAJdTggbG9jYWxfdHhfcmF0ZTsJLyogcmF0ZSBnaXZlbiB0byA4MDUxIGZpcm13YXJlICovCiAJdTggbGFzdF9wc3RhdGU7CQkvKiBpbmZvIG9ubHkgKi8KKwl1OCBxc2ZwX3JldHJ5X2NvdW50OwogCiAJLyogcGxhY2Vob2xkZXJzIGZvciBJQiBNQUQgcGFja2V0IHNldHRpbmdzICovCiAJdTggb3ZlcnJ1bl90aHJlc2hvbGQ7CkBAIC0xMDU4LDggKzEwNjMsNiBAQAogCXU4IHBzeG1pdHdhaXRfc3VwcG9ydGVkOwogCS8qIGN5Y2xlIGxlbmd0aCBvZiBQUyogY291bnRlcnMgaW4gSFcgKGluIHBpY29zZWNvbmRzKSAqLwogCXUxNiBwc3htaXR3YWl0X2NoZWNrX3JhdGU7Ci0JLyogaGlnaCB2b2x1bWUgb3ZlcmZsb3cgZXJyb3JzIGRlZmVycmVkIHRvIHRhc2tsZXQgKi8KLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgZXJyb3JfdGFza2xldDsKIAogCS8qIE1TSS1YIGluZm9ybWF0aW9uICovCiAJc3RydWN0IGhmaTFfbXNpeF9lbnRyeSAqbXNpeF9lbnRyaWVzOwpAQCAtMTE2Miw3ICsxMTY1LDcgQEAKIAogCS8qIHJlY2VpdmUgY29udGV4dCB0YWlsIGR1bW15IGFkZHJlc3MgKi8KIAlfX2xlNjQgKnJjdmhkcnRhaWxfZHVtbXlfa3ZhZGRyOwotCWRtYV9hZGRyX3QgcmN2aGRydGFpbF9kdW1teV9waHlzYWRkcjsKKwlkbWFfYWRkcl90IHJjdmhkcnRhaWxfZHVtbXlfZG1hOwogCiAJYm9vbCBlcHJvbV9hdmFpbGFibGU7CS8qIHRydWUgaWYgRVBST00gaXMgYXZhaWxhYmxlIGZvciB0aGlzIGRldmljZSAqLwogCWJvb2wgYXNwbV9zdXBwb3J0ZWQ7CS8qIERvZXMgSFcgc3VwcG9ydCBBU1BNICovCkBAIC0xMTczLDYgKzExNzYsNyBAQAogCWF0b21pY190IGFzcG1fZGlzYWJsZWRfY250OwogCiAJc3RydWN0IGhmaTFfYWZmaW5pdHkgKmFmZmluaXR5OworCXN0cnVjdCByaGFzaHRhYmxlIHNkbWFfcmh0OwogCXN0cnVjdCBrb2JqZWN0IGtvYmo7CiB9OwogCkBAIC0xMjY2LDE1ICsxMjcwLDMyIEBACiB2b2lkIHJlY2VpdmVfaW50ZXJydXB0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogLyogZXh0cmFjdCBzZXJ2aWNlIGNoYW5uZWwgZnJvbSBoZWFkZXIgYW5kIHJoZiAqLwotc3RhdGljIGlubGluZSBpbnQgaGRyMnNjKHN0cnVjdCBoZmkxX21lc3NhZ2VfaGVhZGVyICpoZHIsIHU2NCByaGYpCitzdGF0aWMgaW5saW5lIGludCBoZHIyc2Moc3RydWN0IGliX2hlYWRlciAqaGRyLCB1NjQgcmhmKQogewogCXJldHVybiAoKGJlMTZfdG9fY3B1KGhkci0+bHJoWzBdKSA+PiAxMikgJiAweGYpIHwKIAkgICAgICAgKCghIShyaGZfZGNfaW5mbyhyaGYpKSkgPDwgNCk7CiB9CiAKKyNkZWZpbmUgSEZJMV9KS0VZX1dJRFRIICAgICAgIDE2CisjZGVmaW5lIEhGSTFfSktFWV9NQVNLICAgICAgICAoQklUKDE2KSAtIDEpCisjZGVmaW5lIEhGSTFfQURNSU5fSktFWV9SQU5HRSAzMgorCisvKgorICogSl9LRVlzIGFyZSBzcGxpdCBhbmQgYWxsb2NhdGVkIGluIHRoZSBmb2xsb3dpbmcgZ3JvdXBzOgorICogICAwIC0gMzEgICAgLSB1c2VycyB3aXRoIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcworICogIDMyIC0gNjMgICAgLSBrZXJuZWwgcHJvdG9jb2xzIHVzaW5nIEtERVRIIHBhY2tldHMKKyAqICA2NCAtIDY1NTM1IC0gYWxsIG90aGVyIHVzZXJzIHVzaW5nIEtERVRIIHBhY2tldHMKKyAqLwogc3RhdGljIGlubGluZSB1MTYgZ2VuZXJhdGVfamtleShrdWlkX3QgdWlkKQogewotCXJldHVybiBmcm9tX2t1aWQoY3VycmVudF91c2VyX25zKCksIHVpZCkgJiAweGZmZmY7CisJdTE2IGprZXkgPSBmcm9tX2t1aWQoY3VycmVudF91c2VyX25zKCksIHVpZCkgJiBIRkkxX0pLRVlfTUFTSzsKKworCWlmIChjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlqa2V5ICY9IEhGSTFfQURNSU5fSktFWV9SQU5HRSAtIDE7CisJZWxzZSBpZiAoamtleSA8IDY0KQorCQlqa2V5IHw9IEJJVChIRkkxX0pLRVlfV0lEVEggLSAxKTsKKworCXJldHVybiBqa2V5OwogfQogCiAvKgpAQCAtMTU4NCw3ICsxNjA1LDcgQEAKIHN0YXRpYyBpbmxpbmUgYm9vbCBwcm9jZXNzX2VjbihzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IGhmaTFfcGFja2V0ICpwa3QsCiAJCQkgICAgICAgYm9vbCBkb19jbnApCiB7Ci0Jc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkciA9IHBrdC0+b2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciA9IHBrdC0+b2hkcjsKIAl1MzIgYnRoMTsKIAogCWJ0aDEgPSBiZTMyX3RvX2NwdShvaGRyLT5idGhbMV0pOwpAQCAtMTY1Niw3ICsxNjc3LDYgQEAKIHN0cnVjdCBoZmkxX2RldmRhdGEgKmhmaTFfaW5pdF9kZChzdHJ1Y3QgcGNpX2RldiAqLAogCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CiB2b2lkIGhmaTFfZnJlZV9kZXZkYXRhKHN0cnVjdCBoZmkxX2RldmRhdGEgKik7Ci12b2lkIGNjX3N0YXRlX3JlY2xhaW0oc3RydWN0IHJjdV9oZWFkICpyY3UpOwogc3RydWN0IGhmaTFfZGV2ZGF0YSAqaGZpMV9hbGxvY19kZXZkYXRhKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzaXplX3QgZXh0cmEpOwogCiAvKiBMRUQgYmVhY29uaW5nIGZ1bmN0aW9ucyAqLwpAQCAtMTc4OCw3ICsxODA4LDcgQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQgaGZpMV9jdTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgdXNlcl9jcmVkaXRfcmV0dXJuX3RocmVzaG9sZDsKIGV4dGVybiBpbnQgbnVtX3VzZXJfY29udGV4dHM7Ci1leHRlcm4gdW5zaWduZWQgbl9rcmN2cXM7CitleHRlcm4gdW5zaWduZWQgbG9uZyBuX2tyY3ZxczsKIGV4dGVybiB1aW50IGtyY3Zxc1tdOwogZXh0ZXJuIGludCBrcmN2cXNzZXQ7CiBleHRlcm4gdWludCBrZGV0aF9xcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2luaXQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2luaXQuYwppbmRleCBhMzU4ZDIzLi42MGRiNjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9pbml0LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvaW5pdC5jCkBAIC05NCw3ICs5NCw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKGtyY3ZxcywgIkFycmF5IG9mIHRoZSBudW1iZXIgb2Ygbm9uLWNvbnRyb2wga2VybmVsIHJlY2VpdmUgcXVldWVzIGJ5IFZMIik7CiAKIC8qIGNvbXB1dGVkIGJhc2VkIG9uIGFib3ZlIGFycmF5ICovCi11bnNpZ25lZCBuX2tyY3ZxczsKK3Vuc2lnbmVkIGxvbmcgbl9rcmN2cXM7CiAKIHN0YXRpYyB1bnNpZ25lZCBoZmkxX3JjdmFycl9zcGxpdCA9IDI1OwogbW9kdWxlX3BhcmFtX25hbWVkKHJjdmFycl9zcGxpdCwgaGZpMV9yY3ZhcnJfc3BsaXQsIHVpbnQsIFNfSVJVR08pOwpAQCAtMzM2LDYgKzMzNiw3IEBACiAJfQogCXJldHVybiByY2Q7CiBiYWlsOgorCWRkLT5yY2RbY3R4dF0gPSBOVUxMOwogCWtmcmVlKHJjZC0+ZWdyYnVmcy5yY3Z0aWRzKTsKIAlrZnJlZShyY2QtPmVncmJ1ZnMuYnVmZmVycyk7CiAJa2ZyZWUocmNkKTsKQEAgLTUwMCw2ICs1MDEsNyBAQAogCUlOSVRfV09SSygmcHBkLT5saW5rX2Rvd25ncmFkZV93b3JrLCBoYW5kbGVfbGlua19kb3duZ3JhZGUpOwogCUlOSVRfV09SSygmcHBkLT5zbWFfbWVzc2FnZV93b3JrLCBoYW5kbGVfc21hX21lc3NhZ2UpOwogCUlOSVRfV09SSygmcHBkLT5saW5rX2JvdW5jZV93b3JrLCBoYW5kbGVfbGlua19ib3VuY2UpOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcGQtPnN0YXJ0X2xpbmtfd29yaywgaGFuZGxlX3N0YXJ0X2xpbmspOwogCUlOSVRfV09SSygmcHBkLT5saW5rc3RhdGVfYWN0aXZlX3dvcmssIHJlY2VpdmVfaW50ZXJydXB0X3dvcmspOwogCUlOSVRfV09SSygmcHBkLT5xc2ZwX2luZm8ucXNmcF93b3JrLCBxc2ZwX2V2ZW50KTsKIApAQCAtNzA4LDcgKzcxMCw3IEBACiAJLyogYWxsb2NhdGUgZHVtbXkgdGFpbCBtZW1vcnkgZm9yIGFsbCByZWNlaXZlIGNvbnRleHRzICovCiAJZGQtPnJjdmhkcnRhaWxfZHVtbXlfa3ZhZGRyID0gZG1hX3phbGxvY19jb2hlcmVudCgKIAkJJmRkLT5wY2lkZXYtPmRldiwgc2l6ZW9mKHU2NCksCi0JCSZkZC0+cmN2aGRydGFpbF9kdW1teV9waHlzYWRkciwKKwkJJmRkLT5yY3ZoZHJ0YWlsX2R1bW15X2RtYSwKIAkJR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIWRkLT5yY3ZoZHJ0YWlsX2R1bW15X2t2YWRkcikgewpAQCAtOTQxLDEyICs5NDMsMTIgQEAKIAogCWlmIChyY2QtPnJjdmhkcnEpIHsKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJmRkLT5wY2lkZXYtPmRldiwgcmNkLT5yY3ZoZHJxX3NpemUsCi0JCQkJICByY2QtPnJjdmhkcnEsIHJjZC0+cmN2aGRycV9waHlzKTsKKwkJCQkgIHJjZC0+cmN2aGRycSwgcmNkLT5yY3ZoZHJxX2RtYSk7CiAJCXJjZC0+cmN2aGRycSA9IE5VTEw7CiAJCWlmIChyY2QtPnJjdmhkcnRhaWxfa3ZhZGRyKSB7CiAJCQlkbWFfZnJlZV9jb2hlcmVudCgmZGQtPnBjaWRldi0+ZGV2LCBQQUdFX1NJWkUsCiAJCQkJCSAgKHZvaWQgKilyY2QtPnJjdmhkcnRhaWxfa3ZhZGRyLAotCQkJCQkgIHJjZC0+cmN2aGRycXRhaWxhZGRyX3BoeXMpOworCQkJCQkgIHJjZC0+cmN2aGRycXRhaWxhZGRyX2RtYSk7CiAJCQlyY2QtPnJjdmhkcnRhaWxfa3ZhZGRyID0gTlVMTDsKIAkJfQogCX0KQEAgLTk1NSwxMSArOTU3LDExIEBACiAJa2ZyZWUocmNkLT5lZ3JidWZzLnJjdnRpZHMpOwogCiAJZm9yIChlID0gMDsgZSA8IHJjZC0+ZWdyYnVmcy5hbGxvY2VkOyBlKyspIHsKLQkJaWYgKHJjZC0+ZWdyYnVmcy5idWZmZXJzW2VdLnBoeXMpCisJCWlmIChyY2QtPmVncmJ1ZnMuYnVmZmVyc1tlXS5kbWEpCiAJCQlkbWFfZnJlZV9jb2hlcmVudCgmZGQtPnBjaWRldi0+ZGV2LAogCQkJCQkgIHJjZC0+ZWdyYnVmcy5idWZmZXJzW2VdLmxlbiwKIAkJCQkJICByY2QtPmVncmJ1ZnMuYnVmZmVyc1tlXS5hZGRyLAotCQkJCQkgIHJjZC0+ZWdyYnVmcy5idWZmZXJzW2VdLnBoeXMpOworCQkJCQkgIHJjZC0+ZWdyYnVmcy5idWZmZXJzW2VdLmRtYSk7CiAJfQogCWtmcmVlKHJjZC0+ZWdyYnVmcy5idWZmZXJzKTsKIApAQCAtMTMzMyw3ICsxMzM1LDcgQEAKIAkJc3Bpbl91bmxvY2soJnBwZC0+Y2Nfc3RhdGVfbG9jayk7CiAKIAkJaWYgKGNjX3N0YXRlKQotCQkJY2FsbF9yY3UoJmNjX3N0YXRlLT5yY3UsIGNjX3N0YXRlX3JlY2xhaW0pOworCQkJa2ZyZWVfcmN1KGNjX3N0YXRlLCByY3UpOwogCX0KIAogCWZyZWVfY3JlZGl0X3JldHVybihkZCk7CkBAIC0xMzUzLDcgKzEzNTUsNyBAQAogCWlmIChkZC0+cmN2aGRydGFpbF9kdW1teV9rdmFkZHIpIHsKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJmRkLT5wY2lkZXYtPmRldiwgc2l6ZW9mKHU2NCksCiAJCQkJICAodm9pZCAqKWRkLT5yY3ZoZHJ0YWlsX2R1bW15X2t2YWRkciwKLQkJCQkgIGRkLT5yY3ZoZHJ0YWlsX2R1bW15X3BoeXNhZGRyKTsKKwkJCQkgIGRkLT5yY3ZoZHJ0YWlsX2R1bW15X2RtYSk7CiAJCWRkLT5yY3ZoZHJ0YWlsX2R1bW15X2t2YWRkciA9IE5VTEw7CiAJfQogCkBAIC0xNTc2LDcgKzE1NzgsNyBAQAogCXU2NCByZWc7CiAKIAlpZiAoIXJjZC0+cmN2aGRycSkgewotCQlkbWFfYWRkcl90IHBoeXNfaGRycXRhaWw7CisJCWRtYV9hZGRyX3QgZG1hX2hkcnF0YWlsOwogCQlnZnBfdCBnZnBfZmxhZ3M7CiAKIAkJLyoKQEAgLTE1ODksNyArMTU5MSw3IEBACiAJCWdmcF9mbGFncyA9IChyY2QtPmN0eHQgPj0gZGQtPmZpcnN0X3VzZXJfY3R4dCkgPwogCQkJR0ZQX1VTRVIgOiBHRlBfS0VSTkVMOwogCQlyY2QtPnJjdmhkcnEgPSBkbWFfemFsbG9jX2NvaGVyZW50KAotCQkJJmRkLT5wY2lkZXYtPmRldiwgYW10LCAmcmNkLT5yY3ZoZHJxX3BoeXMsCisJCQkmZGQtPnBjaWRldi0+ZGV2LCBhbXQsICZyY2QtPnJjdmhkcnFfZG1hLAogCQkJZ2ZwX2ZsYWdzIHwgX19HRlBfQ09NUCk7CiAKIAkJaWYgKCFyY2QtPnJjdmhkcnEpIHsKQEAgLTE2MDEsMTEgKzE2MDMsMTEgQEAKIAogCQlpZiAoSEZJMV9DQVBfS0dFVF9NQVNLKHJjZC0+ZmxhZ3MsIERNQV9SVEFJTCkpIHsKIAkJCXJjZC0+cmN2aGRydGFpbF9rdmFkZHIgPSBkbWFfemFsbG9jX2NvaGVyZW50KAotCQkJCSZkZC0+cGNpZGV2LT5kZXYsIFBBR0VfU0laRSwgJnBoeXNfaGRycXRhaWwsCisJCQkJJmRkLT5wY2lkZXYtPmRldiwgUEFHRV9TSVpFLCAmZG1hX2hkcnF0YWlsLAogCQkJCWdmcF9mbGFncyk7CiAJCQlpZiAoIXJjZC0+cmN2aGRydGFpbF9rdmFkZHIpCiAJCQkJZ290byBiYWlsX2ZyZWU7Ci0JCQlyY2QtPnJjdmhkcnF0YWlsYWRkcl9waHlzID0gcGh5c19oZHJxdGFpbDsKKwkJCXJjZC0+cmN2aGRycXRhaWxhZGRyX2RtYSA9IGRtYV9oZHJxdGFpbDsKIAkJfQogCiAJCXJjZC0+cmN2aGRycV9zaXplID0gYW10OwpAQCAtMTYzMyw3ICsxNjM1LDcgQEAKIAkgKiBiZWZvcmUgZW5hYmxpbmcgYW55IHJlY2VpdmUgY29udGV4dAogCSAqLwogCXdyaXRlX2tjdHh0X2NzcihkZCwgcmNkLT5jdHh0LCBSQ1ZfSERSX1RBSUxfQUREUiwKLQkJCWRkLT5yY3ZoZHJ0YWlsX2R1bW15X3BoeXNhZGRyKTsKKwkJCWRkLT5yY3ZoZHJ0YWlsX2R1bW15X2RtYSk7CiAKIAlyZXR1cm4gMDsKIApAQCAtMTY0NCw3ICsxNjQ2LDcgQEAKIAl2ZnJlZShyY2QtPnVzZXJfZXZlbnRfbWFzayk7CiAJcmNkLT51c2VyX2V2ZW50X21hc2sgPSBOVUxMOwogCWRtYV9mcmVlX2NvaGVyZW50KCZkZC0+cGNpZGV2LT5kZXYsIGFtdCwgcmNkLT5yY3ZoZHJxLAotCQkJICByY2QtPnJjdmhkcnFfcGh5cyk7CisJCQkgIHJjZC0+cmN2aGRycV9kbWEpOwogCXJjZC0+cmN2aGRycSA9IE5VTEw7CiBiYWlsOgogCXJldHVybiAtRU5PTUVNOwpAQCAtMTcwNSwxNSArMTcwNywxNSBAQAogCQlyY2QtPmVncmJ1ZnMuYnVmZmVyc1tpZHhdLmFkZHIgPQogCQkJZG1hX3phbGxvY19jb2hlcmVudCgmZGQtPnBjaWRldi0+ZGV2LAogCQkJCQkgICAgcmNkLT5lZ3JidWZzLnJjdnRpZF9zaXplLAotCQkJCQkgICAgJnJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0ucGh5cywKKwkJCQkJICAgICZyY2QtPmVncmJ1ZnMuYnVmZmVyc1tpZHhdLmRtYSwKIAkJCQkJICAgIGdmcF9mbGFncyk7CiAJCWlmIChyY2QtPmVncmJ1ZnMuYnVmZmVyc1tpZHhdLmFkZHIpIHsKIAkJCXJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0ubGVuID0KIAkJCQlyY2QtPmVncmJ1ZnMucmN2dGlkX3NpemU7CiAJCQlyY2QtPmVncmJ1ZnMucmN2dGlkc1tyY2QtPmVncmJ1ZnMuYWxsb2NlZF0uYWRkciA9CiAJCQkJcmNkLT5lZ3JidWZzLmJ1ZmZlcnNbaWR4XS5hZGRyOwotCQkJcmNkLT5lZ3JidWZzLnJjdnRpZHNbcmNkLT5lZ3JidWZzLmFsbG9jZWRdLnBoeXMgPQotCQkJCXJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0ucGh5czsKKwkJCXJjZC0+ZWdyYnVmcy5yY3Z0aWRzW3JjZC0+ZWdyYnVmcy5hbGxvY2VkXS5kbWEgPQorCQkJCXJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0uZG1hOwogCQkJcmNkLT5lZ3JidWZzLmFsbG9jZWQrKzsKIAkJCWFsbG9jZWRfYnl0ZXMgKz0gcmNkLT5lZ3JidWZzLnJjdnRpZF9zaXplOwogCQkJaWR4Kys7CkBAIC0xNzU0LDE0ICsxNzU2LDE0IEBACiAJCQlmb3IgKGkgPSAwLCBqID0gMCwgb2Zmc2V0ID0gMDsgaiA8IGlkeDsgaSsrKSB7CiAJCQkJaWYgKGkgPj0gcmNkLT5lZ3JidWZzLmNvdW50KQogCQkJCQlicmVhazsKLQkJCQlyY2QtPmVncmJ1ZnMucmN2dGlkc1tpXS5waHlzID0KLQkJCQkJcmNkLT5lZ3JidWZzLmJ1ZmZlcnNbal0ucGh5cyArIG9mZnNldDsKKwkJCQlyY2QtPmVncmJ1ZnMucmN2dGlkc1tpXS5kbWEgPQorCQkJCQlyY2QtPmVncmJ1ZnMuYnVmZmVyc1tqXS5kbWEgKyBvZmZzZXQ7CiAJCQkJcmNkLT5lZ3JidWZzLnJjdnRpZHNbaV0uYWRkciA9CiAJCQkJCXJjZC0+ZWdyYnVmcy5idWZmZXJzW2pdLmFkZHIgKyBvZmZzZXQ7CiAJCQkJcmNkLT5lZ3JidWZzLmFsbG9jZWQrKzsKLQkJCQlpZiAoKHJjZC0+ZWdyYnVmcy5idWZmZXJzW2pdLnBoeXMgKyBvZmZzZXQgKworCQkJCWlmICgocmNkLT5lZ3JidWZzLmJ1ZmZlcnNbal0uZG1hICsgb2Zmc2V0ICsKIAkJCQkgICAgIG5ld19zaXplKSA9PQotCQkJCSAgICAocmNkLT5lZ3JidWZzLmJ1ZmZlcnNbal0ucGh5cyArCisJCQkJICAgIChyY2QtPmVncmJ1ZnMuYnVmZmVyc1tqXS5kbWEgKwogCQkJCSAgICAgcmNkLT5lZ3JidWZzLmJ1ZmZlcnNbal0ubGVuKSkgewogCQkJCQlqKys7CiAJCQkJCW9mZnNldCA9IDA7CkBAIC0xODEzLDcgKzE4MTUsNyBAQAogCiAJZm9yIChpZHggPSAwOyBpZHggPCByY2QtPmVncmJ1ZnMuYWxsb2NlZDsgaWR4KyspIHsKIAkJaGZpMV9wdXRfdGlkKGRkLCByY2QtPmVhZ2VyX2Jhc2UgKyBpZHgsIFBUX0VBR0VSLAotCQkJICAgICByY2QtPmVncmJ1ZnMucmN2dGlkc1tpZHhdLnBoeXMsIG9yZGVyKTsKKwkJCSAgICAgcmNkLT5lZ3JidWZzLnJjdnRpZHNbaWR4XS5kbWEsIG9yZGVyKTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJfQogCWdvdG8gYmFpbDsKQEAgLTE4MjUsOSArMTgyNyw5IEBACiAJCWRtYV9mcmVlX2NvaGVyZW50KCZkZC0+cGNpZGV2LT5kZXYsCiAJCQkJICByY2QtPmVncmJ1ZnMuYnVmZmVyc1tpZHhdLmxlbiwKIAkJCQkgIHJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0uYWRkciwKLQkJCQkgIHJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0ucGh5cyk7CisJCQkJICByY2QtPmVncmJ1ZnMuYnVmZmVyc1tpZHhdLmRtYSk7CiAJCXJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0uYWRkciA9IE5VTEw7Ci0JCXJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0ucGh5cyA9IDA7CisJCXJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0uZG1hID0gMDsKIAkJcmNkLT5lZ3JidWZzLmJ1ZmZlcnNbaWR4XS5sZW4gPSAwOwogCX0KIGJhaWw6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9tYWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL21hZC5jCmluZGV4IDEyNjNhYmUuLjk0ODdjOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL21hZC5jCkBAIC0xMDEzLDcgKzEwMTMsNiBAQAogCQkJICogb2ZmbGluZS4KIAkJCSAqLwogCQkJc2V0X2xpbmtfc3RhdGUocHBkLCBITFNfRE5fT0ZGTElORSk7Ci0JCQl0dW5lX3NlcmRlcyhwcGQpOwogCQkJc3RhcnRfbGluayhwcGQpOwogCQl9IGVsc2UgewogCQkJc2V0X2xpbmtfc3RhdGUocHBkLCBsaW5rX3N0YXRlKTsKQEAgLTE0MDcsMTIgKzE0MDYsNiBAQAogCQlpZiAoa2V5ID09IG9rZXkpCiAJCQljb250aW51ZTsKIAkJLyoKLQkJICogRG9uJ3QgdXBkYXRlIHBrZXlzWzJdLCBpZiBhbiBIRkkgcG9ydCB3aXRob3V0IE1nbXRBbGxvd2VkCi0JCSAqIGJ5IG5laWdoYm9yIGlzIGEgc3dpdGNoLgotCQkgKi8KLQkJaWYgKGkgPT0gMiAmJiAhcHBkLT5tZ210X2FsbG93ZWQgJiYgcHBkLT5uZWlnaGJvcl90eXBlID09IDEpCi0JCQljb250aW51ZTsKLQkJLyoKIAkJICogVGhlIFNNIGdpdmVzIHVzIHRoZSBjb21wbGV0ZSBQS2V5IHRhYmxlLiBXZSBoYXZlCiAJCSAqIHRvIGVuc3VyZSB0aGF0IHdlIHB1dCB0aGUgUEtleXMgaW4gdGhlIG1hdGNoaW5nCiAJCSAqIHNsb3RzLgpAQCAtMTgxOSw2ICsxODEyLDExIEBACiAJdTMyIGxlbiA9IE9QQV9BTV9DSV9MRU4oYW0pICsgMTsKIAlpbnQgcmV0OwogCisJaWYgKGRkLT5wcG9ydC0+cG9ydF90eXBlICE9IFBPUlRfVFlQRV9RU0ZQKSB7CisJCXNtcC0+c3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOworCQlyZXR1cm4gcmVwbHkoKHN0cnVjdCBpYl9tYWRfaGRyICopc21wKTsKKwl9CisKICNkZWZpbmUgX19DSV9QQUdFX1NJWkUgQklUKDcpIC8qIDEyOCBieXRlcyAqLwogI2RlZmluZSBfX0NJX1BBR0VfTUFTSyB+KF9fQ0lfUEFHRV9TSVpFIC0gMSkKICNkZWZpbmUgX19DSV9QQUdFX05VTShhKSAoKGEpICYgX19DSV9QQUdFX01BU0spCkBAIC0yNTk5LDcgKzI1OTcsNyBAQAogCXU4IGxxLCBudW1fdmxzOwogCXU4IHJlc19sbGksIHJlc19sZXI7CiAJdTY0IHBvcnRfbWFzazsKLQl1bnNpZ25lZCBsb25nIHBvcnRfbnVtOworCXU4IHBvcnRfbnVtOwogCXVuc2lnbmVkIGxvbmcgdmw7CiAJdTMyIHZsX3NlbGVjdF9tYXNrOwogCWludCB2Zmk7CkBAIC0yNjMzLDkgKzI2MzEsOSBAQAogCSAqLwogCXBvcnRfbWFzayA9IGJlNjRfdG9fY3B1KHJlcS0+cG9ydF9zZWxlY3RfbWFza1szXSk7CiAJcG9ydF9udW0gPSBmaW5kX2ZpcnN0X2JpdCgodW5zaWduZWQgbG9uZyAqKSZwb3J0X21hc2ssCi0JCQkJICBzaXplb2YocG9ydF9tYXNrKSk7CisJCQkJICBzaXplb2YocG9ydF9tYXNrKSAqIDgpOwogCi0JaWYgKCh1OClwb3J0X251bSAhPSBwb3J0KSB7CisJaWYgKHBvcnRfbnVtICE9IHBvcnQpIHsKIAkJcG1wLT5tYWRfaGRyLnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKIAkJcmV0dXJuIHJlcGx5KChzdHJ1Y3QgaWJfbWFkX2hkciAqKXBtcCk7CiAJfQpAQCAtMjgzNyw3ICsyODM1LDcgQEAKIAkgKi8KIAlwb3J0X21hc2sgPSBiZTY0X3RvX2NwdShyZXEtPnBvcnRfc2VsZWN0X21hc2tbM10pOwogCXBvcnRfbnVtID0gZmluZF9maXJzdF9iaXQoKHVuc2lnbmVkIGxvbmcgKikmcG9ydF9tYXNrLAotCQkJCSAgc2l6ZW9mKHBvcnRfbWFzaykpOworCQkJCSAgc2l6ZW9mKHBvcnRfbWFzaykgKiA4KTsKIAogCWlmIChwb3J0X251bSAhPSBwb3J0KSB7CiAJCXBtcC0+bWFkX2hkci5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CkBAIC0zMDEwLDcgKzMwMDgsNyBAQAogCSAqLwogCXBvcnRfbWFzayA9IGJlNjRfdG9fY3B1KHJlcS0+cG9ydF9zZWxlY3RfbWFza1szXSk7CiAJcG9ydF9udW0gPSBmaW5kX2ZpcnN0X2JpdCgodW5zaWduZWQgbG9uZyAqKSZwb3J0X21hc2ssCi0JCQkJICBzaXplb2YocG9ydF9tYXNrKSk7CisJCQkJICBzaXplb2YocG9ydF9tYXNrKSAqIDgpOwogCiAJaWYgKHBvcnRfbnVtICE9IHBvcnQpIHsKIAkJcG1wLT5tYWRfaGRyLnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKQEAgLTMyNDcsNyArMzI0NSw3IEBACiAJICovCiAJcG9ydF9tYXNrID0gYmU2NF90b19jcHUocmVxLT5wb3J0X3NlbGVjdF9tYXNrWzNdKTsKIAlwb3J0X251bSA9IGZpbmRfZmlyc3RfYml0KCh1bnNpZ25lZCBsb25nICopJnBvcnRfbWFzaywKLQkJCQkgIHNpemVvZihwb3J0X21hc2spKTsKKwkJCQkgIHNpemVvZihwb3J0X21hc2spICogOCk7CiAKIAlpZiAocG9ydF9udW0gIT0gcG9ydCkgewogCQlwbXAtPm1hZF9oZHIuc3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOwpAQCAtMzM5OCw3ICszMzk2LDcgQEAKIAogCXNwaW5fdW5sb2NrKCZwcGQtPmNjX3N0YXRlX2xvY2spOwogCi0JY2FsbF9yY3UoJm9sZF9jY19zdGF0ZS0+cmN1LCBjY19zdGF0ZV9yZWNsYWltKTsKKwlrZnJlZV9yY3Uob2xkX2NjX3N0YXRlLCByY3UpOwogfQogCiBzdGF0aWMgaW50IF9fc3Vibl9zZXRfb3BhX2Nvbmdfc2V0dGluZyhzdHJ1Y3Qgb3BhX3NtcCAqc21wLCB1MzIgYW0sIHU4ICpkYXRhLApAQCAtMzU1MywxMyArMzU1MSw2IEBACiAJcmV0dXJuIHJlcGx5KChzdHJ1Y3QgaWJfbWFkX2hkciAqKXNtcCk7CiB9CiAKLXZvaWQgY2Nfc3RhdGVfcmVjbGFpbShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKLXsKLQlzdHJ1Y3QgY2Nfc3RhdGUgKmNjX3N0YXRlID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IGNjX3N0YXRlLCByY3UpOwotCi0Ja2ZyZWUoY2Nfc3RhdGUpOwotfQotCiBzdGF0aWMgaW50IF9fc3Vibl9zZXRfb3BhX2NjX3RhYmxlKHN0cnVjdCBvcGFfc21wICpzbXAsIHUzMiBhbSwgdTggKmRhdGEsCiAJCQkJICAgc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHU4IHBvcnQsCiAJCQkJICAgdTMyICpyZXNwX2xlbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3Bpby5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGlvLmMKaW5kZXggYWMxYmY0YS4uNTBhM2EzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGlvLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGlvLmMKQEAgLTU1MSwxMSArNTUxLDExIEBACiB9CiAKIC8qCi0gKiBPYnRhaW4gdGhlIGNyZWRpdCByZXR1cm4gYWRkcmVzc2VzLCBrZXJuZWwgdmlydHVhbCBhbmQgcGh5c2ljYWwsIGZvciB0aGUKKyAqIE9idGFpbiB0aGUgY3JlZGl0IHJldHVybiBhZGRyZXNzZXMsIGtlcm5lbCB2aXJ0dWFsIGFuZCBidXMsIGZvciB0aGUKICAqIGdpdmVuIHNjLgogICoKICAqIFRvIHVuZGVyc3RhbmQgdGhpcyByb3V0aW5lOgotICogbyB2YSBhbmQgcGEgYXJlIGFycmF5cyBvZiBzdHJ1Y3QgY3JlZGl0X3JldHVybi4gIE9uZSBmb3IgZWFjaCBwaHlzaWNhbAorICogbyB2YSBhbmQgZG1hIGFyZSBhcnJheXMgb2Ygc3RydWN0IGNyZWRpdF9yZXR1cm4uICBPbmUgZm9yIGVhY2ggcGh5c2ljYWwKICAqICAgc2VuZCBjb250ZXh0LCBwZXIgTlVNQS4KICAqIG8gRWFjaCBzZW5kIGNvbnRleHQgYWx3YXlzIGxvb2tzIGluIGl0cyByZWxhdGl2ZSBsb2NhdGlvbiBpbiBhIHN0cnVjdAogICogICBjcmVkaXRfcmV0dXJuIGZvciBpdHMgY3JlZGl0IHJldHVybi4KQEAgLTU2MywxNCArNTYzLDE0IEBACiAgKiAgIHdpdGggdGhlIHNhbWUgdmFsdWUuICBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHNlbmQgY29udGV4dCBpbiB0aGUKICAqICAgZ3JvdXAuCiAgKi8KLXN0YXRpYyB2b2lkIGNyX2dyb3VwX2FkZHJlc3NlcyhzdHJ1Y3Qgc2VuZF9jb250ZXh0ICpzYywgZG1hX2FkZHJfdCAqcGEpCitzdGF0aWMgdm9pZCBjcl9ncm91cF9hZGRyZXNzZXMoc3RydWN0IHNlbmRfY29udGV4dCAqc2MsIGRtYV9hZGRyX3QgKmRtYSkKIHsKIAl1MzIgZ2MgPSBncm91cF9jb250ZXh0KHNjLT5od19jb250ZXh0LCBzYy0+Z3JvdXApOwogCXUzMiBpbmRleCA9IHNjLT5od19jb250ZXh0ICYgMHg3OwogCiAJc2MtPmh3X2ZyZWUgPSAmc2MtPmRkLT5jcl9iYXNlW3NjLT5ub2RlXS52YVtnY10uY3JbaW5kZXhdOwotCSpwYSA9ICh1bnNpZ25lZCBsb25nKQotCSAgICAgICAmKChzdHJ1Y3QgY3JlZGl0X3JldHVybiAqKXNjLT5kZC0+Y3JfYmFzZVtzYy0+bm9kZV0ucGEpW2djXTsKKwkqZG1hID0gKHVuc2lnbmVkIGxvbmcpCisJICAgICAgICYoKHN0cnVjdCBjcmVkaXRfcmV0dXJuICopc2MtPmRkLT5jcl9iYXNlW3NjLT5ub2RlXS5kbWEpW2djXTsKIH0KIAogLyoKQEAgLTcxMCw3ICs3MTAsNyBAQAogewogCXN0cnVjdCBzZW5kX2NvbnRleHRfaW5mbyAqc2NpOwogCXN0cnVjdCBzZW5kX2NvbnRleHQgKnNjID0gTlVMTDsKLQlkbWFfYWRkcl90IHBhOworCWRtYV9hZGRyX3QgZG1hOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTY0IHJlZzsKIAl1MzIgdGhyZXNoOwpAQCAtNzYzLDcgKzc2Myw3IEBACiAKIAlzYy0+c3dfaW5kZXggPSBzd19pbmRleDsKIAlzYy0+aHdfY29udGV4dCA9IGh3X2NvbnRleHQ7Ci0JY3JfZ3JvdXBfYWRkcmVzc2VzKHNjLCAmcGEpOworCWNyX2dyb3VwX2FkZHJlc3NlcyhzYywgJmRtYSk7CiAJc2MtPmNyZWRpdHMgPSBzY2ktPmNyZWRpdHM7CiAKIC8qIFBJTyBTZW5kIE1lbW9yeSBBZGRyZXNzIGRldGFpbHMgKi8KQEAgLTgwNSw3ICs4MDUsNyBAQAogCQkJKCh1NjQpb3B2YWwgPDwgU0MoQ0hFQ0tfT1BDT0RFX1ZBTFVFX1NISUZUKSkpOwogCiAJLyogc2V0IHVwIGNyZWRpdCByZXR1cm4gKi8KLQlyZWcgPSBwYSAmIFNDKENSRURJVF9SRVRVUk5fQUREUl9BRERSRVNTX1NNQVNLKTsKKwlyZWcgPSBkbWEgJiBTQyhDUkVESVRfUkVUVVJOX0FERFJfQUREUkVTU19TTUFTSyk7CiAJd3JpdGVfa2N0eHRfY3NyKGRkLCBod19jb250ZXh0LCBTQyhDUkVESVRfUkVUVVJOX0FERFIpLCByZWcpOwogCiAJLyoKQEAgLTIwNjQsNyArMjA2NCw3IEBACiAJCWRkLT5jcl9iYXNlW2ldLnZhID0gZG1hX3phbGxvY19jb2hlcmVudCgKIAkJCQkJJmRkLT5wY2lkZXYtPmRldiwKIAkJCQkJYnl0ZXMsCi0JCQkJCSZkZC0+Y3JfYmFzZVtpXS5wYSwKKwkJCQkJJmRkLT5jcl9iYXNlW2ldLmRtYSwKIAkJCQkJR0ZQX0tFUk5FTCk7CiAJCWlmICghZGQtPmNyX2Jhc2VbaV0udmEpIHsKIAkJCXNldF9kZXZfbm9kZSgmZGQtPnBjaWRldi0+ZGV2LCBkZC0+bm9kZSk7CkBAIC0yMDk3LDcgKzIwOTcsNyBAQAogCQkJCQkgIFRYRV9OVU1fQ09OVEVYVFMgKgogCQkJCQkgIHNpemVvZihzdHJ1Y3QgY3JlZGl0X3JldHVybiksCiAJCQkJCSAgZGQtPmNyX2Jhc2VbaV0udmEsCi0JCQkJCSAgZGQtPmNyX2Jhc2VbaV0ucGEpOworCQkJCQkgIGRkLT5jcl9iYXNlW2ldLmRtYSk7CiAJCX0KIAl9CiAJa2ZyZWUoZGQtPmNyX2Jhc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGlvLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9waW8uaAppbmRleCA0NjRjYmQyLi5lNzA5ZWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9waW8uaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9waW8uaApAQCAtMTU0LDcgKzE1NCw3IEBACiAvKiBOVU1BIGluZGV4ZWQgY3JlZGl0IHJldHVybiBhcnJheSAqLwogc3RydWN0IGNyZWRpdF9yZXR1cm5fYmFzZSB7CiAJc3RydWN0IGNyZWRpdF9yZXR1cm4gKnZhOwotCWRtYV9hZGRyX3QgcGE7CisJZG1hX2FkZHJfdCBkbWE7CiB9OwogCiAvKiBzZW5kIGNvbnRleHQgY29uZmlndXJhdGlvbiBzaXplcyAob25lIHBlciB0eXBlKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGlvX2NvcHkuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3Bpb19jb3B5LmMKaW5kZXggOGMyNWUxYi4uYWE3NzczNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGlvX2NvcHkuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9waW9fY29weS5jCkBAIC0xNjUsOSArMTY1LDYgQEAKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCi0vKiBVU0VfU0hJRlRTIGlzIGZhc3RlciBpbiB1c2VyLXNwYWNlIHRlc3RzIG9uIGEgWGVvbiBYNTU3MCBAIDIuOTNHSHogKi8KLSNkZWZpbmUgVVNFX1NISUZUUyAxCi0jaWZkZWYgVVNFX1NISUZUUwogLyoKICAqIEhhbmRsZSBjYXJyeSBieXRlcyB1c2luZyBzaGlmdHMgYW5kIG1hc2tzLgogICoKQEAgLTE4NywzNyArMTg0LDU1IEBACiAjZGVmaW5lIG1zaGlmdCh4KSAoOCAqICh4KSkKIAogLyoKLSAqIFJlYWQgbmJ5dGVzIGJ5dGVzIGZyb20gImZyb20iIGFuZCByZXR1cm4gdGhlbSBpbiB0aGUgTFNCIGJ5dGVzCi0gKiBvZiBwYnVmLT5jYXJyeS4gIE90aGVyIGJ5dGVzIGFyZSB6ZXJvZWQuICBBbnkgcHJldmlvdXMgdmFsdWUKLSAqIHBidWYtPmNhcnJ5IGlzIGxvc3QuCisgKiBKdW1wIGNvcHkgLSBuby1sb29wIGNvcHkgZm9yIDwgOCBieXRlcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGpjb3B5KHU4ICpkZXN0LCBjb25zdCB1OCAqc3JjLCB1MzIgbikKK3sKKwlzd2l0Y2ggKG4pIHsKKwljYXNlIDc6CisJCSpkZXN0KysgPSAqc3JjKys7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgNjoKKwkJKmRlc3QrKyA9ICpzcmMrKzsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSA1OgorCQkqZGVzdCsrID0gKnNyYysrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIDQ6CisJCSpkZXN0KysgPSAqc3JjKys7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgMzoKKwkJKmRlc3QrKyA9ICpzcmMrKzsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAyOgorCQkqZGVzdCsrID0gKnNyYysrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIDE6CisJCSpkZXN0KysgPSAqc3JjKys7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCX0KK30KKworLyoKKyAqIFJlYWQgbmJ5dGVzIGZyb20gImZyb20iIGFuZCBhbmQgcGxhY2UgdGhlbSBpbiB0aGUgbG93IGJ5dGVzCisgKiBvZiBwYnVmLT5jYXJyeS4gIE90aGVyIGJ5dGVzIGFyZSBsZWZ0IGFzLWlzLiAgQW55IHByZXZpb3VzCisgKiB2YWx1ZSBpbiBwYnVmLT5jYXJyeSBpcyBsb3N0LgogICoKICAqIE5PVEVTOgogICogbyBkbyBub3QgcmVhZCBmcm9tIGZyb20gaWYgbmJ5dGVzIGlzIHplcm8KLSAqIG8gZnJvbSBtYXkgX25vdF8gYmUgdTY0IGFsaWduZWQKLSAqIG8gbmJ5dGVzIG11c3Qgbm90IHNwYW4gYSBRVyBib3VuZGFyeQorICogbyBmcm9tIG1heSBfbm90XyBiZSB1NjQgYWxpZ25lZC4KICAqLwogc3RhdGljIGlubGluZSB2b2lkIHJlYWRfbG93X2J5dGVzKHN0cnVjdCBwaW9fYnVmICpwYnVmLCBjb25zdCB2b2lkICpmcm9tLAogCQkJCSAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQl1bnNpZ25lZCBsb25nIG9mZjsKLQotCWlmIChuYnl0ZXMgPT0gMCkgewotCQlwYnVmLT5jYXJyeS52YWw2NCA9IDA7Ci0JfSBlbHNlIHsKLQkJLyogYWxpZ24gb3VyIHBvaW50ZXIgKi8KLQkJb2ZmID0gKHVuc2lnbmVkIGxvbmcpZnJvbSAmIDB4NzsKLQkJZnJvbSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWZyb20gJiB+MHg3bCk7Ci0JCXBidWYtPmNhcnJ5LnZhbDY0ID0gKCgqKHU2NCAqKWZyb20pCi0JCQkJPDwgenNoaWZ0KG5ieXRlcyArIG9mZikpLyogemVybyB1cHBlciBieXRlcyAqLwotCQkJCT4+IHpzaGlmdChuYnl0ZXMpOwkvKiBwbGFjZSBhdCBib3R0b20gKi8KLQl9CisJcGJ1Zi0+Y2FycnkudmFsNjQgPSAwOworCWpjb3B5KCZwYnVmLT5jYXJyeS52YWw4WzBdLCBmcm9tLCBuYnl0ZXMpOwogCXBidWYtPmNhcnJ5X2J5dGVzID0gbmJ5dGVzOwogfQogCiAvKgotICogUmVhZCBuYnl0ZXMgYnl0ZXMgZnJvbSAiZnJvbSIgYW5kIHB1dCB0aGVtIGF0IHRoZSBuZXh0IHNpZ25pZmljYW50IGJ5dGVzCi0gKiBvZiBwYnVmLT5jYXJyeS4gIFVudXNlZCBieXRlcyBhcmUgemVyb2VkLiAgSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgZXh0cmEKLSAqIHJlYWQgZG9lcyBub3Qgb3ZlcmZpbGwgY2FycnkuCisgKiBSZWFkIG5ieXRlcyBieXRlcyBmcm9tICJmcm9tIiBhbmQgcHV0IHRoZW0gYXQgdGhlIGVuZCBvZiBwYnVmLT5jYXJyeS4KKyAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGV4dHJhIHJlYWQgZG9lcyBub3Qgb3ZlcmZpbGwgY2FycnkuCiAgKgogICogTk9URVM6CiAgKiBvIGZyb20gbWF5IF9ub3RfIGJlIHU2NCBhbGlnbmVkCkBAIC0yMjYsNTUgKzI0MSw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcmVhZF9leHRyYV9ieXRlcyhzdHJ1Y3QgcGlvX2J1ZiAqcGJ1ZiwKIAkJCQkgICAgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQl1bnNpZ25lZCBsb25nIG9mZiA9ICh1bnNpZ25lZCBsb25nKWZyb20gJiAweDc7Ci0JdW5zaWduZWQgaW50IHJvb20sIHhieXRlczsKLQotCS8qIGFsaWduIG91ciBwb2ludGVyICovCi0JZnJvbSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWZyb20gJiB+MHg3bCk7Ci0KLQkvKiBjaGVjayBjb3VudCBmaXJzdCAtIGRvbid0IHJlYWQgYW55dGhpbmcgaWYgY291bnQgaXMgemVybyAqLwotCXdoaWxlIChuYnl0ZXMpIHsKLQkJLyogZmluZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoaXMgdTY0ICovCi0JCXJvb20gPSA4IC0gb2ZmOwkvKiB0aGlzIHU2NCBoYXMgcm9vbSBmb3IgdGhpcyBtYW55IGJ5dGVzICovCi0JCXhieXRlcyA9IG1pbihyb29tLCBuYnl0ZXMpOwotCi0JCS8qCi0JCSAqIHNoaWZ0IGRvd24gdG8gemVybyBsb3dlciBieXRlcywgc2hpZnQgdXAgdG8gemVybyB1cHBlcgotCQkgKiBieXRlcywgc2hpZnQgYmFjayBkb3duIHRvIG1vdmUgaW50byBwbGFjZQotCQkgKi8KLQkJcGJ1Zi0+Y2FycnkudmFsNjQgfD0gKCgoKih1NjQgKilmcm9tKQotCQkJCQk+PiBtc2hpZnQob2ZmKSkKLQkJCQkJPDwgenNoaWZ0KHhieXRlcykpCi0JCQkJCT4+IHpzaGlmdCh4Ynl0ZXMgKyBwYnVmLT5jYXJyeV9ieXRlcyk7Ci0JCW9mZiA9IDA7Ci0JCXBidWYtPmNhcnJ5X2J5dGVzICs9IHhieXRlczsKLQkJbmJ5dGVzIC09IHhieXRlczsKLQkJZnJvbSArPSBzaXplb2YodTY0KTsKLQl9Ci19Ci0KLS8qCi0gKiBaZXJvIGV4dHJhIGJ5dGVzIGZyb20gdGhlIGVuZCBvZiBwYnVmLT5jYXJyeS4KLSAqCi0gKiBOT1RFUzoKLSAqIG8gemJ5dGVzIDw9IG9sZF9ieXRlcwotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgemVyb19leHRyYV9ieXRlcyhzdHJ1Y3QgcGlvX2J1ZiAqcGJ1ZiwgdW5zaWduZWQgaW50IHpieXRlcykKLXsKLQl1bnNpZ25lZCBpbnQgcmVtYWluaW5nOwotCi0JaWYgKHpieXRlcyA9PSAwKQkvKiBub3RoaW5nIHRvIGRvICovCi0JCXJldHVybjsKLQotCXJlbWFpbmluZyA9IHBidWYtPmNhcnJ5X2J5dGVzIC0gemJ5dGVzOwkvKiByZW1haW5pbmcgYnl0ZXMgKi8KLQotCS8qIE5PVEU6IHpzaGlmdCBvbmx5IGd1YXJhbnRlZWQgdG8gd29yayBpZiByZW1haW5pbmcgIT0gMCAqLwotCWlmIChyZW1haW5pbmcpCi0JCXBidWYtPmNhcnJ5LnZhbDY0ID0gKHBidWYtPmNhcnJ5LnZhbDY0IDw8IHpzaGlmdChyZW1haW5pbmcpKQotCQkJCQk+PiB6c2hpZnQocmVtYWluaW5nKTsKLQllbHNlCi0JCXBidWYtPmNhcnJ5LnZhbDY0ID0gMDsKLQlwYnVmLT5jYXJyeV9ieXRlcyA9IHJlbWFpbmluZzsKKwlqY29weSgmcGJ1Zi0+Y2FycnkudmFsOFtwYnVmLT5jYXJyeV9ieXRlc10sIGZyb20sIG5ieXRlcyk7CisJcGJ1Zi0+Y2FycnlfYnl0ZXMgKz0gbmJ5dGVzOwogfQogCiAvKgpAQCAtMzIzLDEyNiArMjkxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2Vsc2UgLyogVVNFX1NISUZUUyAqLwotLyoKLSAqIEhhbmRsZSBjYXJyeSBieXRlcyB1c2luZyBieXRlIGNvcGllcy4KLSAqCi0gKiBOT1RFOiB0aGUgdmFsdWUgdGhlIHVudXNlZCBwb3J0aW9uIG9mIGNhcnJ5IGlzIGxlZnQgdW5pbml0aWFsaXplZC4KLSAqLwotCi0vKgotICogSnVtcCBjb3B5IC0gbm8tbG9vcCBjb3B5IGZvciA8IDggYnl0ZXMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBqY29weSh1OCAqZGVzdCwgY29uc3QgdTggKnNyYywgdTMyIG4pCi17Ci0Jc3dpdGNoIChuKSB7Ci0JY2FzZSA3OgotCQkqZGVzdCsrID0gKnNyYysrOwotCWNhc2UgNjoKLQkJKmRlc3QrKyA9ICpzcmMrKzsKLQljYXNlIDU6Ci0JCSpkZXN0KysgPSAqc3JjKys7Ci0JY2FzZSA0OgotCQkqZGVzdCsrID0gKnNyYysrOwotCWNhc2UgMzoKLQkJKmRlc3QrKyA9ICpzcmMrKzsKLQljYXNlIDI6Ci0JCSpkZXN0KysgPSAqc3JjKys7Ci0JY2FzZSAxOgotCQkqZGVzdCsrID0gKnNyYysrOwotCX0KLX0KLQotLyoKLSAqIFJlYWQgbmJ5dGVzIGZyb20gImZyb20iIGFuZCBhbmQgcGxhY2UgdGhlbSBpbiB0aGUgbG93IGJ5dGVzCi0gKiBvZiBwYnVmLT5jYXJyeS4gIE90aGVyIGJ5dGVzIGFyZSBsZWZ0IGFzLWlzLiAgQW55IHByZXZpb3VzCi0gKiB2YWx1ZSBpbiBwYnVmLT5jYXJyeSBpcyBsb3N0LgotICoKLSAqIE5PVEVTOgotICogbyBkbyBub3QgcmVhZCBmcm9tIGZyb20gaWYgbmJ5dGVzIGlzIHplcm8KLSAqIG8gZnJvbSBtYXkgX25vdF8gYmUgdTY0IGFsaWduZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByZWFkX2xvd19ieXRlcyhzdHJ1Y3QgcGlvX2J1ZiAqcGJ1ZiwgY29uc3Qgdm9pZCAqZnJvbSwKLQkJCQkgIHVuc2lnbmVkIGludCBuYnl0ZXMpCi17Ci0JamNvcHkoJnBidWYtPmNhcnJ5LnZhbDhbMF0sIGZyb20sIG5ieXRlcyk7Ci0JcGJ1Zi0+Y2FycnlfYnl0ZXMgPSBuYnl0ZXM7Ci19Ci0KLS8qCi0gKiBSZWFkIG5ieXRlcyBieXRlcyBmcm9tICJmcm9tIiBhbmQgcHV0IHRoZW0gYXQgdGhlIGVuZCBvZiBwYnVmLT5jYXJyeS4KLSAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGV4dHJhIHJlYWQgZG9lcyBub3Qgb3ZlcmZpbGwgY2FycnkuCi0gKgotICogTk9URVM6Ci0gKiBvIGZyb20gbWF5IF9ub3RfIGJlIHU2NCBhbGlnbmVkCi0gKiBvIG5ieXRlcyBtYXkgc3BhbiBhIFFXIGJvdW5kYXJ5Ci0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByZWFkX2V4dHJhX2J5dGVzKHN0cnVjdCBwaW9fYnVmICpwYnVmLAotCQkJCSAgICBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCWpjb3B5KCZwYnVmLT5jYXJyeS52YWw4W3BidWYtPmNhcnJ5X2J5dGVzXSwgZnJvbSwgbmJ5dGVzKTsKLQlwYnVmLT5jYXJyeV9ieXRlcyArPSBuYnl0ZXM7Ci19Ci0KLS8qCi0gKiBaZXJvIGV4dHJhIGJ5dGVzIGZyb20gdGhlIGVuZCBvZiBwYnVmLT5jYXJyeS4KLSAqCi0gKiBXZSBkbyBub3QgY2FyZSBhYm91dCB0aGUgdmFsdWUgb2YgdW51c2VkIGJ5dGVzIGluIGNhcnJ5LCBzbyBqdXN0Ci0gKiByZWR1Y2UgdGhlIGJ5dGUgY291bnQuCi0gKgotICogTk9URVM6Ci0gKiBvIHpieXRlcyA8PSBvbGRfYnl0ZXMKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHplcm9fZXh0cmFfYnl0ZXMoc3RydWN0IHBpb19idWYgKnBidWYsIHVuc2lnbmVkIGludCB6Ynl0ZXMpCi17Ci0JcGJ1Zi0+Y2FycnlfYnl0ZXMgLT0gemJ5dGVzOwotfQotCi0vKgotICogV3JpdGUgYSBxdWFkIHdvcmQgdXNpbmcgcGFydHMgb2YgcGJ1Zi0+Y2FycnkgYW5kIHRoZSBuZXh0IDggYnl0ZXMgb2Ygc3JjLgotICogUHV0IHRoZSB1bnVzZWQgcGFydCBvZiB0aGUgbmV4dCA4IGJ5dGVzIG9mIHNyYyBpbnRvIHRoZSBsb3cgYnl0ZXMgb2YKLSAqIHBidWYtPmNhcnJ5LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbWVyZ2Vfd3JpdGU4KAotCXN0cnVjdCBwaW9fYnVmICpwYnVmLAotCXZvaWQgKmRlc3QsCi0JY29uc3Qgdm9pZCAqc3JjKQotewotCXUzMiByZW1haW5kZXIgPSA4IC0gcGJ1Zi0+Y2FycnlfYnl0ZXM7Ci0KLQlqY29weSgmcGJ1Zi0+Y2FycnkudmFsOFtwYnVmLT5jYXJyeV9ieXRlc10sIHNyYywgcmVtYWluZGVyKTsKLQl3cml0ZXEocGJ1Zi0+Y2FycnkudmFsNjQsIGRlc3QpOwotCWpjb3B5KCZwYnVmLT5jYXJyeS52YWw4WzBdLCBzcmMgKyByZW1haW5kZXIsIHBidWYtPmNhcnJ5X2J5dGVzKTsKLX0KLQotLyoKLSAqIFdyaXRlIGEgcXVhZCB3b3JkIHVzaW5nIGFsbCBieXRlcyBvZiBjYXJyeS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGNhcnJ5OF93cml0ZTgodW5pb24gbWl4IGNhcnJ5LCB2b2lkICpkZXN0KQotewotCXdyaXRlcShjYXJyeS52YWw2NCwgZGVzdCk7Ci19Ci0KLS8qCi0gKiBXcml0ZSBhIHF1YWQgd29yZCB1c2luZyBhbGwgdGhlIHZhbGlkIGJ5dGVzIG9mIGNhcnJ5LiAgSWYgY2FycnkKLSAqIGhhcyB6ZXJvIHZhbGlkIGJ5dGVzLCBub3RoaW5nIGlzIHdyaXR0ZW4uCi0gKiBSZXR1cm5zIDAgb24gbm90aGluZyB3cml0dGVuLCBub24temVybyBvbiBxdWFkIHdvcmQgd3JpdHRlbi4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgY2Fycnlfd3JpdGU4KHN0cnVjdCBwaW9fYnVmICpwYnVmLCB2b2lkICpkZXN0KQotewotCWlmIChwYnVmLT5jYXJyeV9ieXRlcykgewotCQl1NjQgemVybyA9IDA7Ci0KLQkJamNvcHkoJnBidWYtPmNhcnJ5LnZhbDhbcGJ1Zi0+Y2FycnlfYnl0ZXNdLCAodTggKikmemVybywKLQkJICAgICAgOCAtIHBidWYtPmNhcnJ5X2J5dGVzKTsKLQkJd3JpdGVxKHBidWYtPmNhcnJ5LnZhbDY0LCBkZXN0KTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogVVNFX1NISUZUUyAqLwotCiAvKgogICogU2VnbWVudGVkIFBJTyBDb3B5IC0gc3RhcnQKICAqCkBAIC01NTAsOCArMzk4LDggQEAKIHsKIAl2b2lkIF9faW9tZW0gKmRlc3QgPSBwYnVmLT5zdGFydCArIChwYnVmLT5xd193cml0dGVuICogc2l6ZW9mKHU2NCkpOwogCXZvaWQgX19pb21lbSAqZGVuZDsJCQkvKiA4LWJ5dGUgZGF0YSBlbmQgKi8KLQl1bnNpZ25lZCBsb25nIHF3X3RvX3dyaXRlID0gKHBidWYtPmNhcnJ5X2J5dGVzICsgbmJ5dGVzKSA+PiAzOwotCXVuc2lnbmVkIGxvbmcgYnl0ZXNfbGVmdCA9IChwYnVmLT5jYXJyeV9ieXRlcyArIG5ieXRlcykgJiAweDc7CisJdW5zaWduZWQgbG9uZyBxd190b193cml0ZSA9IG5ieXRlcyA+PiAzOworCXVuc2lnbmVkIGxvbmcgYnl0ZXNfbGVmdCA9IG5ieXRlcyAmIDB4NzsKIAogCS8qIGNhbGN1bGF0ZSA4LWJ5dGUgZGF0YSBlbmQgKi8KIAlkZW5kID0gZGVzdCArIChxd190b193cml0ZSAqIHNpemVvZih1NjQpKTsKQEAgLTYyMSwxNiArNDY5LDQ2IEBACiAJCWRlc3QgKz0gc2l6ZW9mKHU2NCk7CiAJfQogCi0JLyogYWRqdXN0IGNhcnJ5ICovCi0JaWYgKHBidWYtPmNhcnJ5X2J5dGVzIDwgYnl0ZXNfbGVmdCkgewotCQkvKiBuZWVkIHRvIHJlYWQgbW9yZSAqLwotCQlyZWFkX2V4dHJhX2J5dGVzKHBidWYsIGZyb20sIGJ5dGVzX2xlZnQgLSBwYnVmLT5jYXJyeV9ieXRlcyk7Ci0JfSBlbHNlIHsKLQkJLyogcmVtb3ZlIGludmFsaWQgYnl0ZXMgKi8KLQkJemVyb19leHRyYV9ieXRlcyhwYnVmLCBwYnVmLT5jYXJyeV9ieXRlcyAtIGJ5dGVzX2xlZnQpOwotCX0KLQogCXBidWYtPnF3X3dyaXR0ZW4gKz0gcXdfdG9fd3JpdGU7CisKKwkvKiBoYW5kbGUgY2FycnkgYW5kIGxlZnQtb3ZlciBieXRlcyAqLworCWlmIChwYnVmLT5jYXJyeV9ieXRlcyArIGJ5dGVzX2xlZnQgPj0gOCkgeworCQl1bnNpZ25lZCBsb25nIG5yZWFkOworCisJCS8qIHRoZXJlIGlzIGVub3VnaCB0byBmaWxsIGFub3RoZXIgcXcgLSBmaWxsIGNhcnJ5ICovCisJCW5yZWFkID0gOCAtIHBidWYtPmNhcnJ5X2J5dGVzOworCQlyZWFkX2V4dHJhX2J5dGVzKHBidWYsIGZyb20sIG5yZWFkKTsKKworCQkvKgorCQkgKiBPbmUgbW9yZSB3cml0ZSAtIGJ1dCBuZWVkIHRvIG1ha2Ugc3VyZSBkZXN0IGlzIGNvcnJlY3QuCisJCSAqIENoZWNrIGZvciB3cmFwIGFuZCB0aGUgcG9zc2liaWxpdHkgdGhlIHdyaXRlCisJCSAqIHNob3VsZCBiZSBpbiBTT1Agc3BhY2UuCisJCSAqCisJCSAqIFRoZSB0d28gY2hlY2tzIGltbWVkaWF0ZWx5IGJlbG93IGNhbm5vdCBib3RoIGJlIHRydWUsIGhlbmNlCisJCSAqIHRoZSBlbHNlLiBJZiB3ZSBoYXZlIHdyYXBwZWQsIHdlIGNhbm5vdCBzdGlsbCBiZSB3aXRoaW4gdGhlCisJCSAqIGZpcnN0IGJsb2NrLiBDb252ZXJzZWx5LCBpZiB3ZSBhcmUgc3RpbGwgaW4gdGhlIGZpcnN0IGJsb2NrLAorCQkgKiB3ZSBjYW5ub3QgaGF2ZSB3cmFwcGVkLiBXZSBkbyB0aGUgd3JhcCBjaGVjayBmaXJzdCBhcyB0aGF0CisJCSAqIGlzIG1vcmUgbGlrZWx5LgorCQkgKi8KKwkJLyogYWRqdXN0IGlmIHdlIGhhdmUgd3JhcHBlZCAqLworCQlpZiAoZGVzdCA+PSBwYnVmLT5lbmQpCisJCQlkZXN0IC09IHBidWYtPnNpemU7CisJCS8qIGp1bXAgdG8gdGhlIFNPUCByYW5nZSBpZiB3aXRoaW4gdGhlIGZpcnN0IGJsb2NrICovCisJCWVsc2UgaWYgKHBidWYtPnF3X3dyaXR0ZW4gPCBQSU9fQkxPQ0tfUVdTKQorCQkJZGVzdCArPSBTT1BfRElTVEFOQ0U7CisKKwkJLyogZmx1c2ggb3V0IGZ1bGwgY2FycnkgKi8KKwkJY2Fycnk4X3dyaXRlOChwYnVmLT5jYXJyeSwgZGVzdCk7CisJCXBidWYtPnF3X3dyaXR0ZW4rKzsKKworCQkvKiBub3cgYWRqdXN0IGFuZCByZWFkIHRoZSByZXN0IG9mIHRoZSBieXRlcyBpbnRvIGNhcnJ5ICovCisJCWJ5dGVzX2xlZnQgLT0gbnJlYWQ7CisJCWZyb20gKz0gbnJlYWQ7IC8qIGZyb20gaXMgbm93IG5vdCBhbGlnbmVkICovCisJCXJlYWRfbG93X2J5dGVzKHBidWYsIGZyb20sIGJ5dGVzX2xlZnQpOworCX0gZWxzZSB7CisJCS8qIG5vdCBlbm91Z2ggdG8gZmlsbCBhbm90aGVyIHF3LCBhcHBlbmQgdGhlIHJlc3QgdG8gY2FycnkgKi8KKwkJcmVhZF9leHRyYV9ieXRlcyhwYnVmLCBmcm9tLCBieXRlc19sZWZ0KTsKKwl9CiB9CiAKIC8qCkBAIC03NzEsNiArNjQ5LDkgQEAKIAkJCXJlYWRfZXh0cmFfYnl0ZXMocGJ1ZiwgZnJvbSwgdG9fZmlsbCk7CiAJCQlmcm9tICs9IHRvX2ZpbGw7CiAJCQluYnl0ZXMgLT0gdG9fZmlsbDsKKwkJCS8qIG1heSBub3QgYmUgZW5vdWdoIHZhbGlkIGJ5dGVzIGxlZnQgdG8gYWxpZ24gKi8KKwkJCWlmIChleHRyYSA+IG5ieXRlcykKKwkJCQlleHRyYSA9IG5ieXRlczsKIAogCQkJLyogLi4ubm93IHdyaXRlIGNhcnJ5ICovCiAJCQlkZXN0ID0gcGJ1Zi0+c3RhcnQgKyAocGJ1Zi0+cXdfd3JpdHRlbiAqIHNpemVvZih1NjQpKTsKQEAgLTc5OCw2ICs2NzksMTUgQEAKIAkJCXJlYWRfbG93X2J5dGVzKHBidWYsIGZyb20sIGV4dHJhKTsKIAkJCWZyb20gKz0gZXh0cmE7CiAJCQluYnl0ZXMgLT0gZXh0cmE7CisJCQkvKgorCQkJICogSWYgbm8gYnl0ZXMgYXJlIGxlZnQsIHJldHVybiBlYXJseSAtIHdlIGFyZSBkb25lLgorCQkJICogTk9URTogVGhpcyBzaG9ydC1jaXJjdWl0IGlzICpyZXF1aXJlZCogYmVjYXVzZQorCQkJICogImV4dHJhIiBtYXkgaGF2ZSBiZWVuIHJlZHVjZWQgaW4gc2l6ZSBhbmQgImZyb20iCisJCQkgKiBpcyBub3QgYWxpZ25lZCwgYXMgcmVxdWlyZWQgd2hlbiBsZWF2aW5nIHRoaXMKKwkJCSAqIGlmIGJsb2NrLgorCQkJICovCisJCQlpZiAobmJ5dGVzID09IDApCisJCQkJcmV0dXJuOwogCQl9CiAKIAkJLyogYXQgdGhpcyBwb2ludCwgZnJvbSBpcyBRVyBhbGlnbmVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9wbGF0Zm9ybS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGxhdGZvcm0uYwppbmRleCA5NjVjOGFlLi4yMDI0MzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3BsYXRmb3JtLmMKQEAgLTQ3LDI5ICs0NywzOSBAQAogCiAjaW5jbHVkZSAiaGZpLmgiCiAjaW5jbHVkZSAiZWZpdmFyLmgiCisjaW5jbHVkZSAiZXByb20uaCIKIAogdm9pZCBnZXRfcGxhdGZvcm1fY29uZmlnKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkKQogewogCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDA7CiAJdTggKnRlbXBfcGxhdGZvcm1fY29uZmlnID0gTlVMTDsKKwl1MzIgZXNpemU7CisKKwlyZXQgPSBlcHJvbV9yZWFkX3BsYXRmb3JtX2NvbmZpZyhkZCwgKHZvaWQgKiopJnRlbXBfcGxhdGZvcm1fY29uZmlnLAorCQkJCQkgJmVzaXplKTsKKwlpZiAoIXJldCkgeworCQkvKiBzdWNjZXNzICovCisJCXNpemUgPSBlc2l6ZTsKKwkJZ290byBzdWNjZXNzOworCX0KKwkvKiBmYWlsLCB0cnkgRUZJIHZhcmlhYmxlICovCiAKIAlyZXQgPSByZWFkX2hmaTFfZWZpX3ZhcihkZCwgImNvbmZpZ3VyYXRpb24iLCAmc2l6ZSwKIAkJCQkodm9pZCAqKikmdGVtcF9wbGF0Zm9ybV9jb25maWcpOwotCWlmIChyZXQpIHsKLQkJZGRfZGV2X2luZm8oZGQsCi0JCQkgICAgIiVzOiBGYWlsZWQgdG8gZ2V0IHBsYXRmb3JtIGNvbmZpZyBmcm9tIFVFRkksIGZhbGxpbmcgYmFjayB0byByZXF1ZXN0IGZpcm13YXJlXG4iLAotCQkJICAgIF9fZnVuY19fKTsKLQkJLyogZmFsbCBiYWNrIHRvIHJlcXVlc3QgZmlybXdhcmUgKi8KLQkJcGxhdGZvcm1fY29uZmlnX2xvYWQgPSAxOwotCQlnb3RvIGJhaWw7Ci0JfQorCWlmICghcmV0KQorCQlnb3RvIHN1Y2Nlc3M7CiAKKwlkZF9kZXZfaW5mbyhkZCwKKwkJICAgICIlczogRmFpbGVkIHRvIGdldCBwbGF0Zm9ybSBjb25maWcgZnJvbSBVRUZJLCBmYWxsaW5nIGJhY2sgdG8gcmVxdWVzdCBmaXJtd2FyZVxuIiwKKwkJICAgIF9fZnVuY19fKTsKKwkvKiBmYWxsIGJhY2sgdG8gcmVxdWVzdCBmaXJtd2FyZSAqLworCXBsYXRmb3JtX2NvbmZpZ19sb2FkID0gMTsKKwlyZXR1cm47CisKK3N1Y2Nlc3M6CiAJZGQtPnBsYXRmb3JtX2NvbmZpZy5kYXRhID0gdGVtcF9wbGF0Zm9ybV9jb25maWc7CiAJZGQtPnBsYXRmb3JtX2NvbmZpZy5zaXplID0gc2l6ZTsKLQotYmFpbDoKLQkvKiBleGl0ICovOwogfQogCiB2b2lkIGZyZWVfcGxhdGZvcm1fY29uZmlnKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3FwLmMKaW5kZXggYTVhYTM1MS4uOWZjNzVlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9xcC5jCkBAIC0yMDIsOCArMjAyLDcgQEAKIAl3cml0ZV9zZXFsb2NrX2lycXNhdmUoJmRldi0+aW93YWl0X2xvY2ssIGZsYWdzKTsKIAlpZiAoIWxpc3RfZW1wdHkoJnByaXYtPnNfaW93YWl0Lmxpc3QpKSB7CiAJCWxpc3RfZGVsX2luaXQoJnByaXYtPnNfaW93YWl0Lmxpc3QpOwotCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcXAtPnJlZmNvdW50KSkKLQkJCXdha2VfdXAoJnFwLT53YWl0KTsKKwkJcnZ0X3B1dF9xcChxcCk7CiAJfQogCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlvd2FpdF9sb2NrLCBmbGFncyk7CiB9CkBAIC00NTAsMTMgKzQ0OSwxNCBAQAogICovCiB2b2lkIGhmaTFfc2NoZWR1bGVfc2VuZChzdHJ1Y3QgcnZ0X3FwICpxcCkKIHsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAlpZiAoaGZpMV9zZW5kX29rKHFwKSkKIAkJX2hmaTFfc2NoZWR1bGVfc2VuZChxcCk7CiB9CiAKIC8qKgotICogaGZpMV9nZXRfY3JlZGl0IC0gZmx1c2ggdGhlIHNlbmQgd29yayBxdWV1ZSBvZiBhIFFQCi0gKiBAcXA6IHRoZSBxcCB3aG8ncyBzZW5kIHdvcmsgcXVldWUgdG8gZmx1c2gKKyAqIGhmaTFfZ2V0X2NyZWRpdCAtIGhhbmRsZSBjcmVkaXQgaW4gYWV0aAorICogQHFwOiB0aGUgcXAKICAqIEBhZXRoOiB0aGUgQWNrbm93bGVkZ2UgRXh0ZW5kZWQgVHJhbnNwb3J0IEhlYWRlcgogICoKICAqIFRoZSBRUCBzX2xvY2sgc2hvdWxkIGJlIGhlbGQuCkBAIC00NjUsNiArNDY1LDcgQEAKIHsKIAl1MzIgY3JlZGl0ID0gKGFldGggPj4gSEZJMV9BRVRIX0NSRURJVF9TSElGVCkgJiBIRkkxX0FFVEhfQ1JFRElUX01BU0s7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAkvKgogCSAqIElmIHRoZSBjcmVkaXQgaXMgaW52YWxpZCwgd2UgY2FuIHNlbmQKIAkgKiBhcyBtYW55IHBhY2tldHMgYXMgd2UgbGlrZS4gIE90aGVyd2lzZSwgd2UgaGF2ZSB0bwpAQCAtNTAzLDggKzUwNCw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKIAkvKiBOb3RpZnkgaGZpMV9kZXN0cm95X3FwKCkgaWYgaXQgaXMgd2FpdGluZy4gKi8KLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcXAtPnJlZmNvdW50KSkKLQkJd2FrZV91cCgmcXAtPndhaXQpOworCXJ2dF9wdXRfcXAocXApOwogfQogCiBzdGF0aWMgaW50IGlvd2FpdF9zbGVlcCgKQEAgLTU0NCw3ICs1NDQsNyBAQAogCQkJcXAtPnNfZmxhZ3MgfD0gUlZUX1NfV0FJVF9ETUFfREVTQzsKIAkJCWxpc3RfYWRkX3RhaWwoJnByaXYtPnNfaW93YWl0Lmxpc3QsICZzZGUtPmRtYXdhaXQpOwogCQkJdHJhY2VfaGZpMV9xcHNsZWVwKHFwLCBSVlRfU19XQUlUX0RNQV9ERVNDKTsKLQkJCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCQlydnRfZ2V0X3FwKHFwKTsKIAkJfQogCQl3cml0ZV9zZXF1bmxvY2soJmRldi0+aW93YWl0X2xvY2spOwogCQlxcC0+c19mbGFncyAmPSB+UlZUX1NfQlVTWTsKQEAgLTY1NiwxMCArNjU2LDYgQEAKIAogCWl0ZXItPmRldiA9IGRldjsKIAlpdGVyLT5zcGVjaWFscyA9IGRldi0+cmRpLmliZGV2LnBoeXNfcG9ydF9jbnQgKiAyOwotCWlmIChxcF9pdGVyX25leHQoaXRlcikpIHsKLQkJa2ZyZWUoaXRlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KIAogCXJldHVybiBpdGVyOwogfQpAQCAtODEyLDYgKzgwOCwxMyBAQAogCQlrZnJlZShwcml2KTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQorCWlvd2FpdF9pbml0KAorCQkmcHJpdi0+c19pb3dhaXQsCisJCTEsCisJCV9oZmkxX2RvX3NlbmQsCisJCWlvd2FpdF9zbGVlcCwKKwkJaW93YWl0X3dha2V1cCwKKwkJaW93YWl0X3NkbWFfZHJhaW5lZCk7CiAJc2V0dXBfdGltZXIoJnByaXYtPnNfcm5yX3RpbWVyLCBoZmkxX3JjX3Jucl9yZXRyeSwgKHVuc2lnbmVkIGxvbmcpcXApOwogCXFwLT5zX3RpbWVyLmZ1bmN0aW9uID0gaGZpMV9yY190aW1lb3V0OwogCXJldHVybiBwcml2OwpAQCAtODUyLDYgKzg1NSw3IEBACiAKIHZvaWQgZmx1c2hfcXBfd2FpdGVycyhzdHJ1Y3QgcnZ0X3FwICpxcCkKIHsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAlmbHVzaF9pb3dhaXQocXApOwogCWhmaTFfc3RvcF9yY190aW1lcnMocXApOwogfQpAQCAtODc3LDEzICs4ODEsNiBAQAogewogCXN0cnVjdCBoZmkxX3FwX3ByaXYgKnByaXYgPSBxcC0+cHJpdjsKIAotCWlvd2FpdF9pbml0KAotCQkmcHJpdi0+c19pb3dhaXQsCi0JCTEsCi0JCV9oZmkxX2RvX3NlbmQsCi0JCWlvd2FpdF9zbGVlcCwKLQkJaW93YWl0X3dha2V1cCwKLQkJaW93YWl0X3NkbWFfZHJhaW5lZCk7CiAJcHJpdi0+cl9hZGVmZXJlZCA9IDA7CiAJY2xlYXJfYWhnKHFwKTsKIH0KQEAgLTk2Nyw4ICs5NjQsNyBAQAogCWlmICghbGlzdF9lbXB0eSgmcHJpdi0+c19pb3dhaXQubGlzdCkgJiYgIShxcC0+c19mbGFncyAmIFJWVF9TX0JVU1kpKSB7CiAJCXFwLT5zX2ZsYWdzICY9IH5SVlRfU19BTllfV0FJVF9JTzsKIAkJbGlzdF9kZWxfaW5pdCgmcHJpdi0+c19pb3dhaXQubGlzdCk7Ci0JCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZxcC0+cmVmY291bnQpKQotCQkJd2FrZV91cCgmcXAtPndhaXQpOworCQlydnRfcHV0X3FwKHFwKTsKIAl9CiAJd3JpdGVfc2VxdW5sb2NrKCZkZXYtPmlvd2FpdF9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcXNmcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcXNmcC5jCmluZGV4IGEyMDc3MTcuLjE4NjlmNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3FzZnAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9xc2ZwLmMKQEAgLTE2MSw3ICsxNjEsNyBAQAogCWJ1cy0+YWxnby5nZXRzZGEgPSBoZmkxX2dldHNkYTsKIAlidXMtPmFsZ28uZ2V0c2NsID0gaGZpMV9nZXRzY2w7CiAJYnVzLT5hbGdvLnVkZWxheSA9IDU7Ci0JYnVzLT5hbGdvLnRpbWVvdXQgPSB1c2Vjc190b19qaWZmaWVzKDUwKTsKKwlidXMtPmFsZ28udGltZW91dCA9IHVzZWNzX3RvX2ppZmZpZXMoMTAwMDAwKTsKIAlidXMtPmFsZ28uZGF0YSA9IGJ1czsKIAogCWJ1cy0+YWRhcHRlci5vd25lciA9IFRISVNfTU9EVUxFOwpAQCAtNzA2LDggKzcwNiw4IEBACiAJCSAgIHU4ICpkYXRhKQogewogCXN0cnVjdCBoZmkxX3Bwb3J0ZGF0YSAqcHBkOwotCXUzMiBleGNlc3NfbGVuID0gMDsKLQlpbnQgcmV0ID0gMDsKKwl1MzIgZXhjZXNzX2xlbiA9IGxlbjsKKwlpbnQgcmV0ID0gMCwgb2Zmc2V0ID0gMDsKIAogCWlmIChwb3J0X251bSA+IGRkLT5udW1fcHBvcnRzIHx8IHBvcnRfbnVtIDwgMSkgewogCQlkZF9kZXZfaW5mbyhkZCwgIiVzOiBJbnZhbGlkIHBvcnQgbnVtYmVyICVkXG4iLApAQCAtNzQwLDYgKzc0MCwzNCBAQAogCX0KIAogCW1lbWNweShkYXRhLCAmcHBkLT5xc2ZwX2luZm8uY2FjaGVbYWRkcl0sIGxlbik7CisKKwlpZiAoYWRkciA8PSBRU0ZQX01PTklUT1JfVkFMX0VORCAmJgorCSAgICAoYWRkciArIGxlbikgPj0gUVNGUF9NT05JVE9SX1ZBTF9TVEFSVCkgeworCQkvKiBPdmVybGFwIHdpdGggdGhlIGR5bmFtaWMgY2hhbm5lbCBtb25pdG9yIHJhbmdlICovCisJCWlmIChhZGRyIDwgUVNGUF9NT05JVE9SX1ZBTF9TVEFSVCkgeworCQkJaWYgKGFkZHIgKyBsZW4gPD0gUVNGUF9NT05JVE9SX1ZBTF9FTkQpCisJCQkJbGVuID0gYWRkciArIGxlbiAtIFFTRlBfTU9OSVRPUl9WQUxfU1RBUlQ7CisJCQllbHNlCisJCQkJbGVuID0gUVNGUF9NT05JVE9SX1JBTkdFOworCQkJb2Zmc2V0ID0gUVNGUF9NT05JVE9SX1ZBTF9TVEFSVCAtIGFkZHI7CisJCQlhZGRyID0gUVNGUF9NT05JVE9SX1ZBTF9TVEFSVDsKKwkJfSBlbHNlIGlmIChhZGRyID09IFFTRlBfTU9OSVRPUl9WQUxfU1RBUlQpIHsKKwkJCW9mZnNldCA9IDA7CisJCQlpZiAoYWRkciArIGxlbiA+IFFTRlBfTU9OSVRPUl9WQUxfRU5EKQorCQkJCWxlbiA9IFFTRlBfTU9OSVRPUl9SQU5HRTsKKwkJfSBlbHNlIHsKKwkJCW9mZnNldCA9IDA7CisJCQlpZiAoYWRkciArIGxlbiA+IFFTRlBfTU9OSVRPUl9WQUxfRU5EKQorCQkJCWxlbiA9IFFTRlBfTU9OSVRPUl9WQUxfRU5EIC0gYWRkciArIDE7CisJCX0KKwkJLyogUmVmcmVzaCB0aGUgdmFsdWVzIG9mIHRoZSBkeW5hbWljIG1vbml0b3JzIGZyb20gdGhlIGNhYmxlICovCisJCXJldCA9IG9uZV9xc2ZwX3JlYWQocHBkLCBkZC0+aGZpMV9pZCwgYWRkciwgZGF0YSArIG9mZnNldCwgbGVuKTsKKwkJaWYgKHJldCAhPSBsZW4pIHsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlnb3RvIHNldF96ZXJvZXM7CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIAogc2V0X3plcm9lczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3FzZnAuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3FzZnAuaAppbmRleCA2OTI3NWViLi4zNmNmNTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9xc2ZwLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcXNmcC5oCkBAIC03NCw2ICs3NCw5IEBACiAvKiBEZWZpbmVkIGZpZWxkcyB0aGF0IEludGVsIHJlcXVpcmVzIG9mIHF1YWxpZmllZCBjYWJsZXMgKi8KIC8qIEJ5dGUgMCBpcyBJZGVudGlmaWVyLCBub3QgY2hlY2tlZCAqLwogLyogQnl0ZSAxIGlzIHJlc2VydmVkICJzdGF0dXMgTVNCIiAqLworI2RlZmluZSBRU0ZQX01PTklUT1JfVkFMX1NUQVJUIDIyCisjZGVmaW5lIFFTRlBfTU9OSVRPUl9WQUxfRU5EIDgxCisjZGVmaW5lIFFTRlBfTU9OSVRPUl9SQU5HRSAoUVNGUF9NT05JVE9SX1ZBTF9FTkQgLSBRU0ZQX01PTklUT1JfVkFMX1NUQVJUICsgMSkKICNkZWZpbmUgUVNGUF9UWF9DVFJMX0JZVEVfT0ZGUyA4NgogI2RlZmluZSBRU0ZQX1BXUl9DVFJMX0JZVEVfT0ZGUyA5MwogI2RlZmluZSBRU0ZQX0NEUl9DVFJMX0JZVEVfT0ZGUyA5OApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcmMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3JjLmMKaW5kZXggNWRhMTkwZS4uOGJjNTAxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcmMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9yYy5jCkBAIC01NSw3ICs1NSw3IEBACiAjaW5jbHVkZSAidHJhY2UuaCIKIAogLyogY3V0IGRvd24gcmlkaWN1bG91c2x5IGxvbmcgSUIgbWFjcm8gbmFtZXMgKi8KLSNkZWZpbmUgT1AoeCkgSUJfT1BDT0RFX1JDXyMjeAorI2RlZmluZSBPUCh4KSBSQ19PUCh4KQogCiAvKioKICAqIGhmaTFfYWRkX3JldHJ5X3RpbWVyIC0gYWRkL3N0YXJ0IGEgcmV0cnkgdGltZXIKQEAgLTY4LDYgKzY4LDcgQEAKIAlzdHJ1Y3QgaWJfcXAgKmlicXAgPSAmcXAtPmlicXA7CiAJc3RydWN0IHJ2dF9kZXZfaW5mbyAqcmRpID0gaWJfdG9fcnZ0KGlicXAtPmRldmljZSk7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAlxcC0+c19mbGFncyB8PSBSVlRfU19USU1FUjsKIAkvKiA0LjA5NiB1c2VjLiAqICgxIDw8IHFwLT50aW1lb3V0KSAqLwogCXFwLT5zX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgcXAtPnRpbWVvdXRfamlmZmllcyArCkBAIC04Niw2ICs4Nyw3IEBACiB7CiAJc3RydWN0IGhmaTFfcXBfcHJpdiAqcHJpdiA9IHFwLT5wcml2OwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJcXAtPnNfZmxhZ3MgfD0gUlZUX1NfV0FJVF9STlI7CiAJcXAtPnNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB1c2Vjc190b19qaWZmaWVzKHRvKTsKIAlhZGRfdGltZXIoJnByaXYtPnNfcm5yX3RpbWVyKTsKQEAgLTEwMyw2ICsxMDUsNyBAQAogCXN0cnVjdCBpYl9xcCAqaWJxcCA9ICZxcC0+aWJxcDsKIAlzdHJ1Y3QgcnZ0X2Rldl9pbmZvICpyZGkgPSBpYl90b19ydnQoaWJxcC0+ZGV2aWNlKTsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5zX2xvY2spOwogCXFwLT5zX2ZsYWdzIHw9IFJWVF9TX1RJTUVSOwogCS8qIDQuMDk2IHVzZWMuICogKDEgPDwgcXAtPnRpbWVvdXQpICovCiAJbW9kX3RpbWVyKCZxcC0+c190aW1lciwgamlmZmllcyArIHFwLT50aW1lb3V0X2ppZmZpZXMgKwpAQCAtMTIwLDYgKzEyMyw3IEBACiB7CiAJaW50IHJ2YWwgPSAwOwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJLyogUmVtb3ZlIFFQIGZyb20gcmV0cnkgKi8KIAlpZiAocXAtPnNfZmxhZ3MgJiBSVlRfU19USU1FUikgewogCQlxcC0+c19mbGFncyAmPSB+UlZUX1NfVElNRVI7CkBAIC0xMzgsNiArMTQyLDcgQEAKIHsKIAlzdHJ1Y3QgaGZpMV9xcF9wcml2ICpwcml2ID0gcXAtPnByaXY7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAkvKiBSZW1vdmUgUVAgZnJvbSBhbGwgdGltZXJzICovCiAJaWYgKHFwLT5zX2ZsYWdzICYgKFJWVF9TX1RJTUVSIHwgUlZUX1NfV0FJVF9STlIpKSB7CiAJCXFwLT5zX2ZsYWdzICY9IH4oUlZUX1NfVElNRVIgfCBSVlRfU19XQUlUX1JOUik7CkBAIC0xNTgsNiArMTYzLDcgQEAKIAlpbnQgcnZhbCA9IDA7CiAJc3RydWN0IGhmaTFfcXBfcHJpdiAqcHJpdiA9IHFwLT5wcml2OwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJLyogUmVtb3ZlIFFQIGZyb20gcm5yIHRpbWVyICovCiAJaWYgKHFwLT5zX2ZsYWdzICYgUlZUX1NfV0FJVF9STlIpIHsKIAkJcXAtPnNfZmxhZ3MgJj0gflJWVF9TX1dBSVRfUk5SOwpAQCAtMTc4LDE4ICsxODQsNiBAQAogCWRlbF90aW1lcl9zeW5jKCZwcml2LT5zX3Jucl90aW1lcik7CiB9CiAKLS8qIG9ubHkgb3Bjb2RlIG1hc2sgZm9yIGFkYXB0aXZlIHBpbyAqLwotY29uc3QgdTMyIHJjX29ubHlfb3Bjb2RlID0KLQlCSVQoT1AoU0VORF9PTkxZKSAmIDB4MWYpIHwKLQlCSVQoT1AoU0VORF9PTkxZX1dJVEhfSU1NRURJQVRFICYgMHgxZikpIHwKLQlCSVQoT1AoUkRNQV9XUklURV9PTkxZICYgMHgxZikpIHwKLQlCSVQoT1AoUkRNQV9XUklURV9PTkxZX1dJVEhfSU1NRURJQVRFICYgMHgxZikpIHwKLQlCSVQoT1AoUkRNQV9SRUFEX1JFUVVFU1QgJiAweDFmKSkgfAotCUJJVChPUChBQ0tOT1dMRURHRSAmIDB4MWYpKSB8Ci0JQklUKE9QKEFUT01JQ19BQ0tOT1dMRURHRSAmIDB4MWYpKSB8Ci0JQklUKE9QKENPTVBBUkVfU1dBUCAmIDB4MWYpKSB8Ci0JQklUKE9QKEZFVENIX0FERCAmIDB4MWYpKTsKLQogc3RhdGljIHUzMiByZXN0YXJ0X3NnZShzdHJ1Y3QgcnZ0X3NnZV9zdGF0ZSAqc3MsIHN0cnVjdCBydnRfc3dxZSAqd3FlLAogCQkgICAgICAgdTMyIHBzbiwgdTMyIHBtdHUpCiB7CkBAIC0yMTYsNyArMjEwLDcgQEAKICAqIE5vdGUgdGhlIFFQIHNfbG9jayBtdXN0IGJlIGhlbGQuCiAgKi8KIHN0YXRpYyBpbnQgbWFrZV9yY19hY2soc3RydWN0IGhmaTFfaWJkZXYgKmRldiwgc3RydWN0IHJ2dF9xcCAqcXAsCi0JCSAgICAgICBzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyLAorCQkgICAgICAgc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHIsCiAJCSAgICAgICBzdHJ1Y3QgaGZpMV9wa3Rfc3RhdGUgKnBzKQogewogCXN0cnVjdCBydnRfYWNrX2VudHJ5ICplOwpAQCAtMjI4LDYgKzIyMiw3IEBACiAJdTMyIHBtdHUgPSBxcC0+cG10dTsKIAlzdHJ1Y3QgaGZpMV9xcF9wcml2ICpwcml2ID0gcXAtPnByaXY7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAkvKiBEb24ndCBzZW5kIGFuIEFDSyBpZiB3ZSBhcmVuJ3Qgc3VwcG9zZWQgdG8uICovCiAJaWYgKCEoaWJfcnZ0X3N0YXRlX29wc1txcC0+c3RhdGVdICYgUlZUX1BST0NFU1NfUkVDVl9PSykpCiAJCWdvdG8gYmFpbDsKQEAgLTI5OSwxMCArMjk0LDcgQEAKIAkJCWxlbiA9IDA7CiAJCQlxcC0+c19hY2tfc3RhdGUgPSBPUChBVE9NSUNfQUNLTk9XTEVER0UpOwogCQkJb2hkci0+dS5hdC5hZXRoID0gaGZpMV9jb21wdXRlX2FldGgocXApOwotCQkJb2hkci0+dS5hdC5hdG9taWNfYWNrX2V0aFswXSA9Ci0JCQkJY3B1X3RvX2JlMzIoZS0+YXRvbWljX2RhdGEgPj4gMzIpOwotCQkJb2hkci0+dS5hdC5hdG9taWNfYWNrX2V0aFsxXSA9Ci0JCQkJY3B1X3RvX2JlMzIoZS0+YXRvbWljX2RhdGEpOworCQkJaWJfdTY0X3B1dChlLT5hdG9taWNfZGF0YSwgJm9oZHItPnUuYXQuYXRvbWljX2Fja19ldGgpOwogCQkJaHdvcmRzICs9IHNpemVvZihvaGRyLT51LmF0KSAvIHNpemVvZih1MzIpOwogCQkJYnRoMiA9IG1hc2tfcHNuKGUtPnBzbik7CiAJCQllLT5zZW50ID0gMTsKQEAgLTM5MCw3ICszODIsNyBAQAogewogCXN0cnVjdCBoZmkxX3FwX3ByaXYgKnByaXYgPSBxcC0+cHJpdjsKIAlzdHJ1Y3QgaGZpMV9pYmRldiAqZGV2ID0gdG9faWRldihxcC0+aWJxcC5kZXZpY2UpOwotCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJc3RydWN0IHJ2dF9zZ2Vfc3RhdGUgKnNzOwogCXN0cnVjdCBydnRfc3dxZSAqd3FlOwogCS8qIGhlYWRlciBzaXplIGluIDMyLWJpdCB3b3JkcyBMUkgrQlRIID0gKDgrMTIpLzQuICovCkBAIC00MDMsNiArMzk1LDcgQEAKIAlpbnQgbWlkZGxlID0gMDsKIAlpbnQgZGVsdGE7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAlwcy0+c190eHJlcSA9IGdldF90eHJlcShwcy0+ZGV2LCBxcCk7CiAJaWYgKElTX0VSUihwcy0+c190eHJlcSkpCiAJCWdvdG8gYmFpbF9ub190eDsKQEAgLTU2Niw4ICs1NTksOSBAQAogCQkJCXFwLT5zX2ZsYWdzIHw9IFJWVF9TX1dBSVRfU1NOX0NSRURJVDsKIAkJCQlnb3RvIGJhaWw7CiAJCQl9Ci0JCQlvaGRyLT51LnJjLnJldGgudmFkZHIgPQotCQkJCWNwdV90b19iZTY0KHdxZS0+cmRtYV93ci5yZW1vdGVfYWRkcik7CisJCQlwdXRfaWJfcmV0aF92YWRkcigKKwkJCQl3cWUtPnJkbWFfd3IucmVtb3RlX2FkZHIsCisJCQkJJm9oZHItPnUucmMucmV0aCk7CiAJCQlvaGRyLT51LnJjLnJldGgucmtleSA9CiAJCQkJY3B1X3RvX2JlMzIod3FlLT5yZG1hX3dyLnJrZXkpOwogCQkJb2hkci0+dS5yYy5yZXRoLmxlbmd0aCA9IGNwdV90b19iZTMyKGxlbik7CkBAIC02MDgsOCArNjAyLDkgQEAKIAkJCQlpZiAoIShxcC0+c19mbGFncyAmIFJWVF9TX1VOTElNSVRFRF9DUkVESVQpKQogCQkJCQlxcC0+c19sc24rKzsKIAkJCX0KLQkJCW9oZHItPnUucmMucmV0aC52YWRkciA9Ci0JCQkJY3B1X3RvX2JlNjQod3FlLT5yZG1hX3dyLnJlbW90ZV9hZGRyKTsKKwkJCXB1dF9pYl9yZXRoX3ZhZGRyKAorCQkJCXdxZS0+cmRtYV93ci5yZW1vdGVfYWRkciwKKwkJCQkmb2hkci0+dS5yYy5yZXRoKTsKIAkJCW9oZHItPnUucmMucmV0aC5ya2V5ID0KIAkJCQljcHVfdG9fYmUzMih3cWUtPnJkbWFfd3IucmtleSk7CiAJCQlvaGRyLT51LnJjLnJldGgubGVuZ3RoID0gY3B1X3RvX2JlMzIobGVuKTsKQEAgLTY0MCwyMCArNjM1LDE4IEBACiAJCQl9CiAJCQlpZiAod3FlLT53ci5vcGNvZGUgPT0gSUJfV1JfQVRPTUlDX0NNUF9BTkRfU1dQKSB7CiAJCQkJcXAtPnNfc3RhdGUgPSBPUChDT01QQVJFX1NXQVApOwotCQkJCW9oZHItPnUuYXRvbWljX2V0aC5zd2FwX2RhdGEgPSBjcHVfdG9fYmU2NCgKLQkJCQkJd3FlLT5hdG9taWNfd3Iuc3dhcCk7Ci0JCQkJb2hkci0+dS5hdG9taWNfZXRoLmNvbXBhcmVfZGF0YSA9IGNwdV90b19iZTY0KAotCQkJCQl3cWUtPmF0b21pY193ci5jb21wYXJlX2FkZCk7CisJCQkJcHV0X2liX2F0ZXRoX3N3YXAod3FlLT5hdG9taWNfd3Iuc3dhcCwKKwkJCQkJCSAgJm9oZHItPnUuYXRvbWljX2V0aCk7CisJCQkJcHV0X2liX2F0ZXRoX2NvbXBhcmUod3FlLT5hdG9taWNfd3IuY29tcGFyZV9hZGQsCisJCQkJCQkgICAgICZvaGRyLT51LmF0b21pY19ldGgpOwogCQkJfSBlbHNlIHsKIAkJCQlxcC0+c19zdGF0ZSA9IE9QKEZFVENIX0FERCk7Ci0JCQkJb2hkci0+dS5hdG9taWNfZXRoLnN3YXBfZGF0YSA9IGNwdV90b19iZTY0KAotCQkJCQl3cWUtPmF0b21pY193ci5jb21wYXJlX2FkZCk7Ci0JCQkJb2hkci0+dS5hdG9taWNfZXRoLmNvbXBhcmVfZGF0YSA9IDA7CisJCQkJcHV0X2liX2F0ZXRoX3N3YXAod3FlLT5hdG9taWNfd3IuY29tcGFyZV9hZGQsCisJCQkJCQkgICZvaGRyLT51LmF0b21pY19ldGgpOworCQkJCXB1dF9pYl9hdGV0aF9jb21wYXJlKDAsICZvaGRyLT51LmF0b21pY19ldGgpOwogCQkJfQotCQkJb2hkci0+dS5hdG9taWNfZXRoLnZhZGRyWzBdID0gY3B1X3RvX2JlMzIoCi0JCQkJd3FlLT5hdG9taWNfd3IucmVtb3RlX2FkZHIgPj4gMzIpOwotCQkJb2hkci0+dS5hdG9taWNfZXRoLnZhZGRyWzFdID0gY3B1X3RvX2JlMzIoCi0JCQkJd3FlLT5hdG9taWNfd3IucmVtb3RlX2FkZHIpOworCQkJcHV0X2liX2F0ZXRoX3ZhZGRyKHdxZS0+YXRvbWljX3dyLnJlbW90ZV9hZGRyLAorCQkJCQkgICAmb2hkci0+dS5hdG9taWNfZXRoKTsKIAkJCW9oZHItPnUuYXRvbWljX2V0aC5ya2V5ID0gY3B1X3RvX2JlMzIoCiAJCQkJd3FlLT5hdG9taWNfd3IucmtleSk7CiAJCQlod29yZHMgKz0gc2l6ZW9mKHN0cnVjdCBpYl9hdG9taWNfZXRoKSAvIHNpemVvZih1MzIpOwpAQCAtNzc5LDggKzc3Miw5IEBACiAJCSAqIFNlZSByZXN0YXJ0X3JjKCkuCiAJCSAqLwogCQlsZW4gPSAoZGVsdGFfcHNuKHFwLT5zX3Bzbiwgd3FlLT5wc24pKSAqIHBtdHU7Ci0JCW9oZHItPnUucmMucmV0aC52YWRkciA9Ci0JCQljcHVfdG9fYmU2NCh3cWUtPnJkbWFfd3IucmVtb3RlX2FkZHIgKyBsZW4pOworCQlwdXRfaWJfcmV0aF92YWRkcigKKwkJCXdxZS0+cmRtYV93ci5yZW1vdGVfYWRkciArIGxlbiwKKwkJCSZvaGRyLT51LnJjLnJldGgpOwogCQlvaGRyLT51LnJjLnJldGgucmtleSA9CiAJCQljcHVfdG9fYmUzMih3cWUtPnJkbWFfd3IucmtleSk7CiAJCW9oZHItPnUucmMucmV0aC5sZW5ndGggPSBjcHVfdG9fYmUzMih3cWUtPmxlbmd0aCAtIGxlbik7CkBAIC04NDEsNyArODM1LDcgQEAKICAqCiAgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGhmaTFfcmNfcmN2KCkgYW5kIGhhbmRsZV9yZWNlaXZlX2ludGVycnVwdCgpLgogICogTm90ZSB0aGF0IFJETUEgcmVhZHMgYW5kIGF0b21pY3MgYXJlIGhhbmRsZWQgaW4gdGhlCi0gKiBzZW5kIHNpZGUgUVAgc3RhdGUgYW5kIHRhc2tsZXQuCisgKiBzZW5kIHNpZGUgUVAgc3RhdGUgYW5kIHNlbmQgZW5naW5lLgogICovCiB2b2lkIGhmaTFfc2VuZF9yY19hY2soc3RydWN0IGhmaTFfY3R4dGRhdGEgKnJjZCwgc3RydWN0IHJ2dF9xcCAqcXAsCiAJCSAgICAgIGludCBpc19mZWNuKQpAQCAtODU2LDggKzg1MCw4IEBACiAJdTMyIHZsLCBwbGVuOwogCXN0cnVjdCBzZW5kX2NvbnRleHQgKnNjOwogCXN0cnVjdCBwaW9fYnVmICpwYnVmOwotCXN0cnVjdCBoZmkxX2liX2hlYWRlciBoZHI7Ci0Jc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwlzdHJ1Y3QgaWJfaGVhZGVyIGhkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogRG9uJ3Qgc2VuZCBBQ0sgb3IgTkFLIGlmIGEgUkRNQSByZWFkIG9yIGF0b21pYyBpcyBwZW5kaW5nLiAqLwpAQCAtOTE3LDcgKzkxMSw3IEBACiAJaWYgKCFwYnVmKSB7CiAJCS8qCiAJCSAqIFdlIGhhdmUgbm8gcm9vbSB0byBzZW5kIGF0IHRoZSBtb21lbnQuICBQYXNzCi0JCSAqIHJlc3BvbnNpYmlsaXR5IGZvciBzZW5kaW5nIHRoZSBBQ0sgdG8gdGhlIHNlbmQgdGFza2xldAorCQkgKiByZXNwb25zaWJpbGl0eSBmb3Igc2VuZGluZyB0aGUgQUNLIHRvIHRoZSBzZW5kIGVuZ2luZQogCQkgKiBzbyB0aGF0IHdoZW4gZW5vdWdoIGJ1ZmZlciBzcGFjZSBiZWNvbWVzIGF2YWlsYWJsZSwKIAkJICogdGhlIEFDSyBpcyBzZW50IGFoZWFkIG9mIG90aGVyIG91dGdvaW5nIHBhY2tldHMuCiAJCSAqLwpAQCAtOTMyLDE2ICs5MjYsMTkgQEAKIAlyZXR1cm47CiAKIHF1ZXVlX2FjazoKLQl0aGlzX2NwdV9pbmMoKmlicC0+cnZwLnJjX3FhY2tzKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcXAtPnNfbG9jaywgZmxhZ3MpOworCWlmICghKGliX3J2dF9zdGF0ZV9vcHNbcXAtPnN0YXRlXSAmIFJWVF9QUk9DRVNTX1JFQ1ZfT0spKQorCQlnb3RvIHVubG9jazsKKwl0aGlzX2NwdV9pbmMoKmlicC0+cnZwLnJjX3FhY2tzKTsKIAlxcC0+c19mbGFncyB8PSBSVlRfU19BQ0tfUEVORElORyB8IFJWVF9TX1JFU1BfUEVORElORzsKIAlxcC0+c19uYWtfc3RhdGUgPSBxcC0+cl9uYWtfc3RhdGU7CiAJcXAtPnNfYWNrX3BzbiA9IHFwLT5yX2Fja19wc247CiAJaWYgKGlzX2ZlY24pCiAJCXFwLT5zX2ZsYWdzIHw9IFJWVF9TX0VDTjsKIAotCS8qIFNjaGVkdWxlIHRoZSBzZW5kIHRhc2tsZXQuICovCisJLyogU2NoZWR1bGUgdGhlIHNlbmQgZW5naW5lLiAqLwogCWhmaTFfc2NoZWR1bGVfc2VuZChxcCk7Cit1bmxvY2s6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXAtPnNfbG9jaywgZmxhZ3MpOwogfQogCkBAIC05NjAsNiArOTU3LDcgQEAKIAlzdHJ1Y3QgcnZ0X3N3cWUgKndxZSA9IHJ2dF9nZXRfc3dxZV9wdHIocXAsIG4pOwogCXUzMiBvcGNvZGU7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAlxcC0+c19jdXIgPSBuOwogCiAJLyoKQEAgLTEwMjcsNyArMTAyNSw3IEBACiAJcXAtPnNfcHNuID0gcHNuOwogCS8qCiAJICogU2V0IFJWVF9TX1dBSVRfUFNOIGFzIHJjX2NvbXBsZXRlKCkgbWF5IHN0YXJ0IHRoZSB0aW1lcgotCSAqIGFzeW5jaHJvbm91c2x5IGJlZm9yZSB0aGUgc2VuZCB0YXNrbGV0IGNhbiBnZXQgc2NoZWR1bGVkLgorCSAqIGFzeW5jaHJvbm91c2x5IGJlZm9yZSB0aGUgc2VuZCBlbmdpbmUgY2FuIGdldCBzY2hlZHVsZWQuCiAJICogRG9pbmcgaXQgaW4gaGZpMV9tYWtlX3JjX3JlcSgpIGlzIHRvbyBsYXRlLgogCSAqLwogCWlmICgoY21wX3BzbihxcC0+c19wc24sIHFwLT5zX3NlbmRpbmdfaHBzbikgPD0gMCkgJiYKQEAgLTEwNDUsNiArMTA0Myw4IEBACiAJc3RydWN0IHJ2dF9zd3FlICp3cWUgPSBydnRfZ2V0X3N3cWVfcHRyKHFwLCBxcC0+c19hY2tlZCk7CiAJc3RydWN0IGhmaTFfaWJwb3J0ICppYnA7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+cl9sb2NrKTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAlpZiAocXAtPnNfcmV0cnkgPT0gMCkgewogCQlpZiAocXAtPnNfbWlnX3N0YXRlID09IElCX01JR19BUk1FRCkgewogCQkJaGZpMV9taWdyYXRlX3FwKHFwKTsKQEAgLTExMjEsNiArMTEyMSw3IEBACiAJc3RydWN0IHJ2dF9zd3FlICp3cWU7CiAJdTMyIG4gPSBxcC0+c19sYXN0OwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJLyogRmluZCB0aGUgd29yayByZXF1ZXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFBTTi4gKi8KIAlmb3IgKDs7KSB7CiAJCXdxZSA9IHJ2dF9nZXRfc3dxZV9wdHIocXAsIG4pOwpAQCAtMTE0MSwxNSArMTE0MiwxNiBAQAogLyoKICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBRUCBzX2xvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4KICAqLwotdm9pZCBoZmkxX3JjX3NlbmRfY29tcGxldGUoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyKQordm9pZCBoZmkxX3JjX3NlbmRfY29tcGxldGUoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBpYl9oZWFkZXIgKmhkcikKIHsKLQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXN0cnVjdCBydnRfc3dxZSAqd3FlOwogCXN0cnVjdCBpYl93YyB3YzsKIAl1bnNpZ25lZCBpOwogCXUzMiBvcGNvZGU7CiAJdTMyIHBzbjsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5zX2xvY2spOwogCWlmICghKGliX3J2dF9zdGF0ZV9vcHNbcXAtPnN0YXRlXSAmIFJWVF9QUk9DRVNTX09SX0ZMVVNIX1NFTkQpKQogCQlyZXR1cm47CiAKQEAgLTEyNDEsNiArMTI0Myw3IEBACiAJc3RydWN0IGliX3djIHdjOwogCXVuc2lnbmVkIGk7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAkvKgogCSAqIERvbid0IGRlY3JlbWVudCByZWZjb3VudCBhbmQgZG9uJ3QgZ2VuZXJhdGUgYQogCSAqIGNvbXBsZXRpb24gaWYgdGhlIFNXUUUgaXMgYmVpbmcgcmVzZW50IHVudGlsIHRoZSBzZW5kCkBAIC0xMzQwLDYgKzEzNDMsNyBAQAogCWludCBkaWZmOwogCXVuc2lnbmVkIGxvbmcgdG87CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAkvKgogCSAqIE5vdGUgdGhhdCBOQUtzIGltcGxpY2l0bHkgQUNLIG91dHN0YW5kaW5nIFNFTkQgYW5kIFJETUEgd3JpdGUKIAkgKiByZXF1ZXN0cyBhbmQgaW1wbGljaXRseSBOQUsgUkRNQSByZWFkIGFuZCBhdG9taWMgcmVxdWVzdHMgaXNzdWVkCkBAIC0xMzg5LDcgKzEzOTMsNyBAQAogCQkJCXJlc3RhcnRfcmMocXAsIHFwLT5zX2xhc3RfcHNuICsgMSwgMCk7CiAJCQkJaWYgKGxpc3RfZW1wdHkoJnFwLT5yc3B3YWl0KSkgewogCQkJCQlxcC0+cl9mbGFncyB8PSBSVlRfUl9SU1BfU0VORDsKLQkJCQkJYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKKwkJCQkJcnZ0X2dldF9xcChxcCk7CiAJCQkJCWxpc3RfYWRkX3RhaWwoJnFwLT5yc3B3YWl0LAogCQkJCQkJICAgICAgJnJjZC0+cXBfd2FpdF9saXN0KTsKIAkJCQl9CkBAIC0xNTU1LDYgKzE1NTksNyBAQAogewogCXN0cnVjdCBydnRfc3dxZSAqd3FlOwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJLyogUmVtb3ZlIFFQIGZyb20gcmV0cnkgdGltZXIgKi8KIAloZmkxX3N0b3BfcmNfdGltZXJzKHFwKTsKIApAQCAtMTU3Myw3ICsxNTc4LDcgQEAKIAlyZXN0YXJ0X3JjKHFwLCBxcC0+c19sYXN0X3BzbiArIDEsIDApOwogCWlmIChsaXN0X2VtcHR5KCZxcC0+cnNwd2FpdCkpIHsKIAkJcXAtPnJfZmxhZ3MgfD0gUlZUX1JfUlNQX1NFTkQ7Ci0JCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCXJ2dF9nZXRfcXAocXApOwogCQlsaXN0X2FkZF90YWlsKCZxcC0+cnNwd2FpdCwgJnJjZC0+cXBfd2FpdF9saXN0KTsKIAl9CiB9CkBAIC0xNTk1LDcgKzE2MDAsNyBAQAogICogQ2FsbGVkIGF0IGludGVycnVwdCBsZXZlbC4KICAqLwogc3RhdGljIHZvaWQgcmNfcmN2X3Jlc3Aoc3RydWN0IGhmaTFfaWJwb3J0ICppYnAsCi0JCQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyLAorCQkJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHIsCiAJCQl2b2lkICpkYXRhLCB1MzIgdGxlbiwgc3RydWN0IHJ2dF9xcCAqcXAsCiAJCQl1MzIgb3Bjb2RlLCB1MzIgcHNuLCB1MzIgaGRyc2l6ZSwgdTMyIHBtdHUsCiAJCQlzdHJ1Y3QgaGZpMV9jdHh0ZGF0YSAqcmNkKQpAQCAtMTY0OSwxNCArMTY1NCwxMCBAQAogCWNhc2UgT1AoQVRPTUlDX0FDS05PV0xFREdFKToKIAljYXNlIE9QKFJETUFfUkVBRF9SRVNQT05TRV9GSVJTVCk6CiAJCWFldGggPSBiZTMyX3RvX2NwdShvaGRyLT51LmFldGgpOwotCQlpZiAob3Bjb2RlID09IE9QKEFUT01JQ19BQ0tOT1dMRURHRSkpIHsKLQkJCV9fYmUzMiAqcCA9IG9oZHItPnUuYXQuYXRvbWljX2Fja19ldGg7Ci0KLQkJCXZhbCA9ICgodTY0KWJlMzJfdG9fY3B1KHBbMF0pIDw8IDMyKSB8Ci0JCQkJYmUzMl90b19jcHUocFsxXSk7Ci0JCX0gZWxzZSB7CisJCWlmIChvcGNvZGUgPT0gT1AoQVRPTUlDX0FDS05PV0xFREdFKSkKKwkJCXZhbCA9IGliX3U2NF9nZXQoJm9oZHItPnUuYXQuYXRvbWljX2Fja19ldGgpOworCQllbHNlCiAJCQl2YWwgPSAwOwotCQl9CiAJCWlmICghZG9fcmNfYWNrKHFwLCBhZXRoLCBwc24sIG9wY29kZSwgdmFsLCByY2QpIHx8CiAJCSAgICBvcGNvZGUgIT0gT1AoUkRNQV9SRUFEX1JFU1BPTlNFX0ZJUlNUKSkKIAkJCWdvdG8gYWNrX2RvbmU7CkBAIC0xNzgyLDcgKzE3ODMsNyBAQAogewogCWlmIChsaXN0X2VtcHR5KCZxcC0+cnNwd2FpdCkpIHsKIAkJcXAtPnJfZmxhZ3MgfD0gUlZUX1JfUlNQX05BSzsKLQkJYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKKwkJcnZ0X2dldF9xcChxcCk7CiAJCWxpc3RfYWRkX3RhaWwoJnFwLT5yc3B3YWl0LCAmcmNkLT5xcF93YWl0X2xpc3QpOwogCX0KIH0KQEAgLTE3OTYsOCArMTc5Nyw3IEBACiAJCXJldHVybjsKIAlsaXN0X2RlbF9pbml0KCZxcC0+cnNwd2FpdCk7CiAJcXAtPnJfZmxhZ3MgJj0gflJWVF9SX1JTUF9OQUs7Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnFwLT5yZWZjb3VudCkpCi0JCXdha2VfdXAoJnFwLT53YWl0KTsKKwlydnRfcHV0X3FwKHFwKTsKIH0KIAogLyoqCkBAIC0xODE1LDcgKzE4MTUsNyBAQAogICogUmV0dXJuIDEgaWYgbm8gbW9yZSBwcm9jZXNzaW5nIGlzIG5lZWRlZDsgb3RoZXJ3aXNlIHJldHVybiAwIHRvCiAgKiBzY2hlZHVsZSBhIHJlc3BvbnNlIHRvIGJlIHNlbnQuCiAgKi8KLXN0YXRpYyBub2lubGluZSBpbnQgcmNfcmN2X2Vycm9yKHN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHIsIHZvaWQgKmRhdGEsCitzdGF0aWMgbm9pbmxpbmUgaW50IHJjX3Jjdl9lcnJvcihzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciwgdm9pZCAqZGF0YSwKIAkJCQkgc3RydWN0IHJ2dF9xcCAqcXAsIHUzMiBvcGNvZGUsIHUzMiBwc24sCiAJCQkJIGludCBkaWZmLCBzdHJ1Y3QgaGZpMV9jdHh0ZGF0YSAqcmNkKQogewpAQCAtMTkyMyw3ICsxOTIzLDcgQEAKIAkJfQogCQlpZiAobGVuICE9IDApIHsKIAkJCXUzMiBya2V5ID0gYmUzMl90b19jcHUocmV0aC0+cmtleSk7Ci0JCQl1NjQgdmFkZHIgPSBiZTY0X3RvX2NwdShyZXRoLT52YWRkcik7CisJCQl1NjQgdmFkZHIgPSBnZXRfaWJfcmV0aF92YWRkcihyZXRoKTsKIAkJCWludCBvazsKIAogCQkJb2sgPSBydnRfcmtleV9vayhxcCwgJmUtPnJkbWFfc2dlLCBsZW4sIHZhZGRyLCBya2V5LApAQCAtMTk0Niw3ICsxOTQ2LDcgQEAKIAljYXNlIE9QKEZFVENIX0FERCk6IHsKIAkJLyoKIAkJICogSWYgd2UgZGlkbid0IGZpbmQgdGhlIGF0b21pYyByZXF1ZXN0IGluIHRoZSBhY2sgcXVldWUKLQkJICogb3IgdGhlIHNlbmQgdGFza2xldCBpcyBhbHJlYWR5IGJhY2tlZCB1cCB0byBzZW5kIGFuCisJCSAqIG9yIHRoZSBzZW5kIGVuZ2luZSBpcyBhbHJlYWR5IGJhY2tlZCB1cCB0byBzZW5kIGFuCiAJCSAqIGVhcmxpZXIgZW50cnksIHdlIGNhbiBpZ25vcmUgdGhpcyByZXF1ZXN0LgogCQkgKi8KIAkJaWYgKCFlIHx8IGUtPm9wY29kZSAhPSAodTgpb3Bjb2RlIHx8IG9sZF9yZXEpCkBAIC0yMTIzLDEzICsyMTIzLDEzIEBACiB2b2lkIGhmaTFfcmNfcmN2KHN0cnVjdCBoZmkxX3BhY2tldCAqcGFja2V0KQogewogCXN0cnVjdCBoZmkxX2N0eHRkYXRhICpyY2QgPSBwYWNrZXQtPnJjZDsKLQlzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkciA9IHBhY2tldC0+aGRyOworCXN0cnVjdCBpYl9oZWFkZXIgKmhkciA9IHBhY2tldC0+aGRyOwogCXUzMiByY3ZfZmxhZ3MgPSBwYWNrZXQtPnJjdl9mbGFnczsKIAl2b2lkICpkYXRhID0gcGFja2V0LT5lYnVmOwogCXUzMiB0bGVuID0gcGFja2V0LT50bGVuOwogCXN0cnVjdCBydnRfcXAgKnFwID0gcGFja2V0LT5xcDsKIAlzdHJ1Y3QgaGZpMV9pYnBvcnQgKmlicCA9IHRvX2lwb3J0KHFwLT5pYnFwLmRldmljZSwgcXAtPnBvcnRfbnVtKTsKLQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyID0gcGFja2V0LT5vaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyID0gcGFja2V0LT5vaGRyOwogCXUzMiBidGgwLCBvcGNvZGU7CiAJdTMyIGhkcnNpemUgPSBwYWNrZXQtPmhsZW47CiAJdTMyIHBzbjsKQEAgLTIxNDMsNiArMjE0Myw3IEBACiAJaW50IGNvcHlfbGFzdCA9IDA7CiAJdTMyIHJrZXk7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+cl9sb2NrKTsKIAlidGgwID0gYmUzMl90b19jcHUob2hkci0+YnRoWzBdKTsKIAlpZiAoaGZpMV9ydWNfY2hlY2tfaGRyKGlicCwgaGRyLCByY3ZfZmxhZ3MgJiBIRkkxX0hBU19HUkgsIHFwLCBidGgwKSkKIAkJcmV0dXJuOwpAQCAtMjM0Miw3ICsyMzQzLDcgQEAKIAkJcXAtPnJfc2dlLnNnX2xpc3QgPSBOVUxMOwogCQlpZiAocXAtPnJfbGVuICE9IDApIHsKIAkJCXUzMiBya2V5ID0gYmUzMl90b19jcHUocmV0aC0+cmtleSk7Ci0JCQl1NjQgdmFkZHIgPSBiZTY0X3RvX2NwdShyZXRoLT52YWRkcik7CisJCQl1NjQgdmFkZHIgPSBnZXRfaWJfcmV0aF92YWRkcihyZXRoKTsKIAkJCWludCBvazsKIAogCQkJLyogQ2hlY2sgcmtleSAmIE5BSyAqLwpAQCAtMjM5Nyw3ICsyMzk4LDcgQEAKIAkJbGVuID0gYmUzMl90b19jcHUocmV0aC0+bGVuZ3RoKTsKIAkJaWYgKGxlbikgewogCQkJdTMyIHJrZXkgPSBiZTMyX3RvX2NwdShyZXRoLT5ya2V5KTsKLQkJCXU2NCB2YWRkciA9IGJlNjRfdG9fY3B1KHJldGgtPnZhZGRyKTsKKwkJCXU2NCB2YWRkciA9IGdldF9pYl9yZXRoX3ZhZGRyKHJldGgpOwogCQkJaW50IG9rOwogCiAJCQkvKiBDaGVjayBya2V5ICYgTkFLICovCkBAIC0yNDMyLDcgKzI0MzMsNyBAQAogCQlxcC0+cl9uYWtfc3RhdGUgPSAwOwogCQlxcC0+cl9oZWFkX2Fja19xdWV1ZSA9IG5leHQ7CiAKLQkJLyogU2NoZWR1bGUgdGhlIHNlbmQgdGFza2xldC4gKi8KKwkJLyogU2NoZWR1bGUgdGhlIHNlbmQgZW5naW5lLiAqLwogCQlxcC0+c19mbGFncyB8PSBSVlRfU19SRVNQX1BFTkRJTkc7CiAJCWhmaTFfc2NoZWR1bGVfc2VuZChxcCk7CiAKQEAgLTI0NjksOCArMjQ3MCw3IEBACiAJCQllLT5yZG1hX3NnZS5tciA9IE5VTEw7CiAJCX0KIAkJYXRldGggPSAmb2hkci0+dS5hdG9taWNfZXRoOwotCQl2YWRkciA9ICgodTY0KWJlMzJfdG9fY3B1KGF0ZXRoLT52YWRkclswXSkgPDwgMzIpIHwKLQkJCWJlMzJfdG9fY3B1KGF0ZXRoLT52YWRkclsxXSk7CisJCXZhZGRyID0gZ2V0X2liX2F0ZXRoX3ZhZGRyKGF0ZXRoKTsKIAkJaWYgKHVubGlrZWx5KHZhZGRyICYgKHNpemVvZih1NjQpIC0gMSkpKQogCQkJZ290byBuYWNrX2ludl91bmxjazsKIAkJcmtleSA9IGJlMzJfdG9fY3B1KGF0ZXRoLT5ya2V5KTsKQEAgLTI0ODEsMTEgKzI0ODEsMTEgQEAKIAkJCWdvdG8gbmFja19hY2NfdW5sY2s7CiAJCS8qIFBlcmZvcm0gYXRvbWljIE9QIGFuZCBzYXZlIHJlc3VsdC4gKi8KIAkJbWFkZHIgPSAoYXRvbWljNjRfdCAqKXFwLT5yX3NnZS5zZ2UudmFkZHI7Ci0JCXNkYXRhID0gYmU2NF90b19jcHUoYXRldGgtPnN3YXBfZGF0YSk7CisJCXNkYXRhID0gZ2V0X2liX2F0ZXRoX3N3YXAoYXRldGgpOwogCQllLT5hdG9taWNfZGF0YSA9IChvcGNvZGUgPT0gT1AoRkVUQ0hfQUREKSkgPwogCQkJKHU2NClhdG9taWM2NF9hZGRfcmV0dXJuKHNkYXRhLCBtYWRkcikgLSBzZGF0YSA6CiAJCQkodTY0KWNtcHhjaGcoKHU2NCAqKXFwLT5yX3NnZS5zZ2UudmFkZHIsCi0JCQkJICAgICAgYmU2NF90b19jcHUoYXRldGgtPmNvbXBhcmVfZGF0YSksCisJCQkJICAgICAgZ2V0X2liX2F0ZXRoX2NvbXBhcmUoYXRldGgpLAogCQkJCSAgICAgIHNkYXRhKTsKIAkJcnZ0X3B1dF9tcihxcC0+cl9zZ2Uuc2dlLm1yKTsKIAkJcXAtPnJfc2dlLm51bV9zZ2UgPSAwOwpAQCAtMjQ5OSw3ICsyNDk5LDcgQEAKIAkJcXAtPnJfbmFrX3N0YXRlID0gMDsKIAkJcXAtPnJfaGVhZF9hY2tfcXVldWUgPSBuZXh0OwogCi0JCS8qIFNjaGVkdWxlIHRoZSBzZW5kIHRhc2tsZXQuICovCisJCS8qIFNjaGVkdWxlIHRoZSBzZW5kIGVuZ2luZS4gKi8KIAkJcXAtPnNfZmxhZ3MgfD0gUlZUX1NfUkVTUF9QRU5ESU5HOwogCQloZmkxX3NjaGVkdWxlX3NlbmQocXApOwogCkBAIC0yNTc1LDEyICsyNTc1LDEyIEBACiAKIHZvaWQgaGZpMV9yY19oZHJlcnIoCiAJc3RydWN0IGhmaTFfY3R4dGRhdGEgKnJjZCwKLQlzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkciwKKwlzdHJ1Y3QgaWJfaGVhZGVyICpoZHIsCiAJdTMyIHJjdl9mbGFncywKIAlzdHJ1Y3QgcnZ0X3FwICpxcCkKIHsKIAlpbnQgaGFzX2dyaCA9IHJjdl9mbGFncyAmIEhGSTFfSEFTX0dSSDsKLQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXN0cnVjdCBoZmkxX2licG9ydCAqaWJwID0gdG9faXBvcnQocXAtPmlicXAuZGV2aWNlLCBxcC0+cG9ydF9udW0pOwogCWludCBkaWZmOwogCXUzMiBvcGNvZGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9ydWMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3J1Yy5jCmluZGV4IDQ4ZDUwOTQuLmExNTc2YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3J1Yy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3J1Yy5jCkBAIC0yNjIsNyArMjYyLDcgQEAKICAqCiAgKiBUaGUgc19sb2NrIHdpbGwgYmUgYWNxdWlyZWQgYXJvdW5kIHRoZSBoZmkxX21pZ3JhdGVfcXAoKSBjYWxsLgogICovCi1pbnQgaGZpMV9ydWNfY2hlY2tfaGRyKHN0cnVjdCBoZmkxX2licG9ydCAqaWJwLCBzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkciwKK2ludCBoZmkxX3J1Y19jaGVja19oZHIoc3RydWN0IGhmaTFfaWJwb3J0ICppYnAsIHN0cnVjdCBpYl9oZWFkZXIgKmhkciwKIAkJICAgICAgIGludCBoYXNfZ3JoLCBzdHJ1Y3QgcnZ0X3FwICpxcCwgdTMyIGJ0aDApCiB7CiAJX19iZTY0IGd1aWQ7CkBAIC0zNTIsNyArMzUyLDcgQEAKICAqCiAgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGhmaTFfZG9fc2VuZCgpIHRvCiAgKiBmb3J3YXJkIGEgV1FFIGFkZHJlc3NlZCB0byB0aGUgc2FtZSBIRkkuCi0gKiBOb3RlIHRoYXQgYWx0aG91Z2ggd2UgYXJlIHNpbmdsZSB0aHJlYWRlZCBkdWUgdG8gdGhlIHRhc2tsZXQsIHdlIHN0aWxsCisgKiBOb3RlIHRoYXQgYWx0aG91Z2ggd2UgYXJlIHNpbmdsZSB0aHJlYWRlZCBkdWUgdG8gdGhlIHNlbmQgZW5naW5lLCB3ZSBzdGlsbAogICogaGF2ZSB0byBwcm90ZWN0IGFnYWluc3QgcG9zdF9zZW5kKCkuICBXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0CiAgKiByZWNlaXZlIGludGVycnVwdHMgc2luY2UgdGhpcyBpcyBhIGNvbm5lY3RlZCBwcm90b2NvbCBhbmQgYWxsIHBhY2tldHMKICAqIHdpbGwgcGFzcyB0aHJvdWdoIGhlcmUuCkBAIC03NjUsNyArNzY1LDcgQEAKIAl9CiB9CiAKLXZvaWQgaGZpMV9tYWtlX3J1Y19oZWFkZXIoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHIsCit2b2lkIGhmaTFfbWFrZV9ydWNfaGVhZGVyKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciwKIAkJCSAgdTMyIGJ0aDAsIHUzMiBidGgyLCBpbnQgbWlkZGxlLAogCQkJICBzdHJ1Y3QgaGZpMV9wa3Rfc3RhdGUgKnBzKQogewpAQCAtODQ2LDcgKzg0Niw3IEBACiAgKiBAd29yazogY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBRUAogICoKICAqIFByb2Nlc3MgZW50cmllcyBpbiB0aGUgc2VuZCB3b3JrIHF1ZXVlIHVudGlsIGNyZWRpdCBvciBxdWV1ZSBpcwotICogZXhoYXVzdGVkLiAgT25seSBhbGxvdyBvbmUgQ1BVIHRvIHNlbmQgYSBwYWNrZXQgcGVyIFFQICh0YXNrbGV0KS4KKyAqIGV4aGF1c3RlZC4gIE9ubHkgYWxsb3cgb25lIENQVSB0byBzZW5kIGEgcGFja2V0IHBlciBRUC4KICAqIE90aGVyd2lzZSwgdHdvIHRocmVhZHMgY291bGQgc2VuZCBwYWNrZXRzIG91dCBvZiBvcmRlci4KICAqLwogdm9pZCBoZmkxX2RvX3NlbmQoc3RydWN0IHJ2dF9xcCAqcXApCkBAIC05MDksNyArOTA5LDcgQEAKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5zX2xvY2ssIHBzLmZsYWdzKTsKIAkJCS8qCiAJCQkgKiBJZiB0aGUgcGFja2V0IGNhbm5vdCBiZSBzZW50IG5vdywgcmV0dXJuIGFuZAotCQkJICogdGhlIHNlbmQgdGFza2xldCB3aWxsIGJlIHdva2VuIHVwIGxhdGVyLgorCQkJICogdGhlIHNlbmQgZW5naW5lIHdpbGwgYmUgd29rZW4gdXAgbGF0ZXIuCiAJCQkgKi8KIAkJCWlmIChoZmkxX3ZlcmJzX3NlbmQocXAsICZwcykpCiAJCQkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvc2RtYS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvc2RtYS5jCmluZGV4IGY5YmVmYzAuLmZkMzliY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3NkbWEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9zZG1hLmMKQEAgLTcyNiw2ICs3MjYsMzQgQEAKIH0KIAogLyoqCisgKiBzZG1hX2VuZ2luZV9nZXRfdmwoKSAtIHJldHVybiB2bCBmb3IgYSBnaXZlbiBzZG1hIGVuZ2luZQorICogQHNkZTogc2RtYSBlbmdpbmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZsIG1hcHBlZCB0byBhIGdpdmVuIGVuZ2luZSwgb3IgYW4gZXJyb3IgaWYKKyAqIHRoZSBtYXBwaW5nIGNhbid0IGJlIGZvdW5kLiBUaGUgbWFwcGluZyBmaWVsZHMgYXJlIHByb3RlY3RlZCBieSBSQ1UuCisgKi8KK2ludCBzZG1hX2VuZ2luZV9nZXRfdmwoc3RydWN0IHNkbWFfZW5naW5lICpzZGUpCit7CisJc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQgPSBzZGUtPmRkOworCXN0cnVjdCBzZG1hX3ZsX21hcCAqbTsKKwl1OCB2bDsKKworCWlmIChzZGUtPnRoaXNfaWR4ID49IFRYRV9OVU1fU0RNQV9FTkdJTkVTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwltID0gcmN1X2RlcmVmZXJlbmNlKGRkLT5zZG1hX21hcCk7CisJaWYgKHVubGlrZWx5KCFtKSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXZsID0gbS0+ZW5naW5lX3RvX3ZsW3NkZS0+dGhpc19pZHhdOworCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIHZsOworfQorCisvKioKICAqIHNkbWFfc2VsZWN0X2VuZ2luZV92bCgpIC0gc2VsZWN0IHNkbWEgZW5naW5lCiAgKiBAZGQ6IGRldmRhdGEKICAqIEBzZWxlY3RvcjogYSBzcHJlYWRpbmcgZmFjdG9yCkBAIC03ODgsNiArODE2LDMyNiBAQAogCXJldHVybiBzZG1hX3NlbGVjdF9lbmdpbmVfdmwoZGQsIHNlbGVjdG9yLCB2bCk7CiB9CiAKK3N0cnVjdCBzZG1hX3JodF9tYXBfZWxlbSB7CisJdTMyIG1hc2s7CisJdTggY3RyOworCXN0cnVjdCBzZG1hX2VuZ2luZSAqc2RlWzBdOworfTsKKworc3RydWN0IHNkbWFfcmh0X25vZGUgeworCXVuc2lnbmVkIGxvbmcgY3B1X2lkOworCXN0cnVjdCBzZG1hX3JodF9tYXBfZWxlbSAqbWFwW0hGSTFfTUFYX1ZMU19TVVBQT1JURURdOworCXN0cnVjdCByaGFzaF9oZWFkIG5vZGU7Cit9OworCisjZGVmaW5lIE5SX0NQVVNfSElOVCAxOTIKKworc3RhdGljIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBzZG1hX3JodF9wYXJhbXMgPSB7CisJLm5lbGVtX2hpbnQgPSBOUl9DUFVTX0hJTlQsCisJLmhlYWRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNkbWFfcmh0X25vZGUsIG5vZGUpLAorCS5rZXlfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNkbWFfcmh0X25vZGUsIGNwdV9pZCksCisJLmtleV9sZW4gPSBGSUVMRF9TSVpFT0Yoc3RydWN0IHNkbWFfcmh0X25vZGUsIGNwdV9pZCksCisJLm1heF9zaXplID0gTlJfQ1BVUywKKwkubWluX3NpemUgPSA4LAorCS5hdXRvbWF0aWNfc2hyaW5raW5nID0gdHJ1ZSwKK307CisKKy8qCisgKiBzZG1hX3NlbGVjdF91c2VyX2VuZ2luZSgpIC0gc2VsZWN0IHNkbWEgZW5naW5lIGJhc2VkIG9uIHVzZXIgc2V0dXAKKyAqIEBkZDogZGV2ZGF0YQorICogQHNlbGVjdG9yOiBhIHNwcmVhZGluZyBmYWN0b3IKKyAqIEB2bDogdGhpcyB2bAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBzZG1hIGVuZ2luZSBmb3IgYSB1c2VyIHNkbWEgcmVxdWVzdC4KKyAqIFVzZXIgZGVmaW5lZCBzZG1hIGVuZ2luZSBhZmZpbml0eSBzZXR0aW5nIGlzIGhvbm9yZWQgd2hlbiBhcHBsaWNhYmxlLAorICogb3RoZXJ3aXNlIHN5c3RlbSBkZWZhdWx0IHNkbWEgZW5naW5lIG1hcHBpbmcgaXMgdXNlZC4gVG8gZW5zdXJlIGNvcnJlY3QKKyAqIG9yZGVyaW5nLCB0aGUgbWFwcGluZyBmcm9tIDxzZWxlY3Rvciwgdmw+IHRvIHNkZSBtdXN0IHJlbWFpbiB1bmNoYW5nZWQuCisgKi8KK3N0cnVjdCBzZG1hX2VuZ2luZSAqc2RtYV9zZWxlY3RfdXNlcl9lbmdpbmUoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsCisJCQkJCSAgICB1MzIgc2VsZWN0b3IsIHU4IHZsKQoreworCXN0cnVjdCBzZG1hX3JodF9ub2RlICpyaHRfbm9kZTsKKwlzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGNwdW1hc2sgKmN1cnJlbnRfbWFzayA9IHRza19jcHVzX2FsbG93ZWQoY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBjcHVfaWQ7CisKKwkvKgorCSAqIFRvIGVuc3VyZSB0aGF0IGFsd2F5cyB0aGUgc2FtZSBzZG1hIGVuZ2luZShzKSB3aWxsIGJlCisJICogc2VsZWN0ZWQgbWFrZSBzdXJlIHRoZSBwcm9jZXNzIGlzIHBpbm5lZCB0byB0aGlzIENQVSBvbmx5LgorCSAqLworCWlmIChjcHVtYXNrX3dlaWdodChjdXJyZW50X21hc2spICE9IDEpCisJCWdvdG8gb3V0OworCisJY3B1X2lkID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXJjdV9yZWFkX2xvY2soKTsKKwlyaHRfbm9kZSA9IHJoYXNodGFibGVfbG9va3VwX2Zhc3QoJmRkLT5zZG1hX3JodCwgJmNwdV9pZCwKKwkJCQkJICBzZG1hX3JodF9wYXJhbXMpOworCisJaWYgKHJodF9ub2RlICYmIHJodF9ub2RlLT5tYXBbdmxdKSB7CisJCXN0cnVjdCBzZG1hX3JodF9tYXBfZWxlbSAqbWFwID0gcmh0X25vZGUtPm1hcFt2bF07CisKKwkJc2RlID0gbWFwLT5zZGVbc2VsZWN0b3IgJiBtYXAtPm1hc2tdOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmIChzZGUpCisJCXJldHVybiBzZGU7CisKK291dDoKKwlyZXR1cm4gc2RtYV9zZWxlY3RfZW5naW5lX3ZsKGRkLCBzZWxlY3RvciwgdmwpOworfQorCitzdGF0aWMgdm9pZCBzZG1hX3BvcHVsYXRlX3NkZV9tYXAoc3RydWN0IHNkbWFfcmh0X21hcF9lbGVtICptYXApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcm91bmR1cF9wb3dfb2ZfdHdvKG1hcC0+Y3RyID8gOiAxKSAtIG1hcC0+Y3RyOyBpKyspCisJCW1hcC0+c2RlW21hcC0+Y3RyICsgaV0gPSBtYXAtPnNkZVtpXTsKK30KKworc3RhdGljIHZvaWQgc2RtYV9jbGVhbnVwX3NkZV9tYXAoc3RydWN0IHNkbWFfcmh0X21hcF9lbGVtICptYXAsCisJCQkJIHN0cnVjdCBzZG1hX2VuZ2luZSAqc2RlKQoreworCXVuc2lnbmVkIGludCBpLCBwb3c7CisKKwkvKiBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlIGZpcnN0IGN0ciBlbnRyaWVzIGZvciBhIG1hdGNoICovCisJZm9yIChpID0gMDsgaSA8IG1hcC0+Y3RyOyBpKyspIHsKKwkJaWYgKG1hcC0+c2RlW2ldID09IHNkZSkgeworCQkJbWVtbW92ZSgmbWFwLT5zZGVbaV0sICZtYXAtPnNkZVtpICsgMV0sCisJCQkJKG1hcC0+Y3RyIC0gaSAtIDEpICogc2l6ZW9mKG1hcC0+c2RlWzBdKSk7CisJCQltYXAtPmN0ci0tOworCQkJcG93ID0gcm91bmR1cF9wb3dfb2ZfdHdvKG1hcC0+Y3RyID8gOiAxKTsKKwkJCW1hcC0+bWFzayA9IHBvdyAtIDE7CisJCQlzZG1hX3BvcHVsYXRlX3NkZV9tYXAobWFwKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKgorICogUHJldmVudHMgY29uY3VycmVudCByZWFkcyBhbmQgd3JpdGVzIG9mIHRoZSBzZG1hIGVuZ2luZSBjcHVfbWFzaworICovCitzdGF0aWMgREVGSU5FX01VVEVYKHByb2Nlc3NfdG9fc2RlX211dGV4KTsKKworc3NpemVfdCBzZG1hX3NldF9jcHVfdG9fc2RlX21hcChzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSwgY29uc3QgY2hhciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCA9IHNkZS0+ZGQ7CisJY3B1bWFza192YXJfdCBtYXNrLCBuZXdfbWFzazsKKwl1bnNpZ25lZCBsb25nIGNwdTsKKwlpbnQgcmV0LCB2bCwgc3o7CisKKwl2bCA9IHNkbWFfZW5naW5lX2dldF92bChzZGUpOworCWlmICh1bmxpa2VseSh2bCA8IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHphbGxvY19jcHVtYXNrX3ZhcigmbWFzaywgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXQpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gemFsbG9jX2NwdW1hc2tfdmFyKCZuZXdfbWFzaywgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXQpIHsKKwkJZnJlZV9jcHVtYXNrX3ZhcihtYXNrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldCA9IGNwdWxpc3RfcGFyc2UoYnVmLCBtYXNrKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mcmVlOworCisJaWYgKCFjcHVtYXNrX3N1YnNldChtYXNrLCBjcHVfb25saW5lX21hc2spKSB7CisJCWRkX2Rldl93YXJuKHNkZS0+ZGQsICJJbnZhbGlkIENQVSBtYXNrXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlzeiA9IHNpemVvZihzdHJ1Y3Qgc2RtYV9yaHRfbWFwX2VsZW0pICsKKwkJCShUWEVfTlVNX1NETUFfRU5HSU5FUyAqIHNpemVvZihzdHJ1Y3Qgc2RtYV9lbmdpbmUgKikpOworCisJbXV0ZXhfbG9jaygmcHJvY2Vzc190b19zZGVfbXV0ZXgpOworCisJZm9yX2VhY2hfY3B1KGNwdSwgbWFzaykgeworCQlzdHJ1Y3Qgc2RtYV9yaHRfbm9kZSAqcmh0X25vZGU7CisKKwkJLyogQ2hlY2sgaWYgd2UgaGF2ZSB0aGlzIGFscmVhZHkgbWFwcGVkICovCisJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgJnNkZS0+Y3B1X21hc2spKSB7CisJCQljcHVtYXNrX3NldF9jcHUoY3B1LCBuZXdfbWFzayk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJodF9ub2RlID0gcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgmZGQtPnNkbWFfcmh0LCAmY3B1LAorCQkJCQkJICBzZG1hX3JodF9wYXJhbXMpOworCQlpZiAoIXJodF9ub2RlKSB7CisJCQlyaHRfbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKCpyaHRfbm9kZSksIEdGUF9LRVJORUwpOworCQkJaWYgKCFyaHRfbm9kZSkgeworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXJodF9ub2RlLT5tYXBbdmxdID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXJodF9ub2RlLT5tYXBbdmxdKSB7CisJCQkJa2ZyZWUocmh0X25vZGUpOworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlyaHRfbm9kZS0+Y3B1X2lkID0gY3B1OworCQkJcmh0X25vZGUtPm1hcFt2bF0tPm1hc2sgPSAwOworCQkJcmh0X25vZGUtPm1hcFt2bF0tPmN0ciA9IDE7CisJCQlyaHRfbm9kZS0+bWFwW3ZsXS0+c2RlWzBdID0gc2RlOworCisJCQlyZXQgPSByaGFzaHRhYmxlX2luc2VydF9mYXN0KCZkZC0+c2RtYV9yaHQsCisJCQkJCQkgICAgICZyaHRfbm9kZS0+bm9kZSwKKwkJCQkJCSAgICAgc2RtYV9yaHRfcGFyYW1zKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlrZnJlZShyaHRfbm9kZS0+bWFwW3ZsXSk7CisJCQkJa2ZyZWUocmh0X25vZGUpOworCQkJCWRkX2Rldl9lcnIoc2RlLT5kZCwgIkZhaWxlZCB0byBzZXQgcHJvY2VzcyB0byBzZGUgYWZmaW5pdHkgZm9yIGNwdSAlbHVcbiIsCisJCQkJCSAgIGNwdSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCWludCBjdHIsIHBvdzsKKworCQkJLyogQWRkIG5ldyB1c2VyIG1hcHBpbmdzICovCisJCQlpZiAoIXJodF9ub2RlLT5tYXBbdmxdKQorCQkJCXJodF9ub2RlLT5tYXBbdmxdID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisKKwkJCWlmICghcmh0X25vZGUtPm1hcFt2bF0pIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlyaHRfbm9kZS0+bWFwW3ZsXS0+Y3RyKys7CisJCQljdHIgPSByaHRfbm9kZS0+bWFwW3ZsXS0+Y3RyOworCQkJcmh0X25vZGUtPm1hcFt2bF0tPnNkZVtjdHIgLSAxXSA9IHNkZTsKKwkJCXBvdyA9IHJvdW5kdXBfcG93X29mX3R3byhjdHIpOworCQkJcmh0X25vZGUtPm1hcFt2bF0tPm1hc2sgPSBwb3cgLSAxOworCisJCQkvKiBQb3B1bGF0ZSB0aGUgc2RlIG1hcCB0YWJsZSAqLworCQkJc2RtYV9wb3B1bGF0ZV9zZGVfbWFwKHJodF9ub2RlLT5tYXBbdmxdKTsKKwkJfQorCQljcHVtYXNrX3NldF9jcHUoY3B1LCBuZXdfbWFzayk7CisJfQorCisJLyogQ2xlYW4gdXAgb2xkIG1hcHBpbmdzICovCisJZm9yX2VhY2hfY3B1KGNwdSwgY3B1X29ubGluZV9tYXNrKSB7CisJCXN0cnVjdCBzZG1hX3JodF9ub2RlICpyaHRfbm9kZTsKKworCQkvKiBEb24ndCBjbGVhbnVwIHNkZXMgdGhhdCBhcmUgc2V0IGluIHRoZSBuZXcgbWFzayAqLworCQlpZiAoY3B1bWFza190ZXN0X2NwdShjcHUsIG1hc2spKQorCQkJY29udGludWU7CisKKwkJcmh0X25vZGUgPSByaGFzaHRhYmxlX2xvb2t1cF9mYXN0KCZkZC0+c2RtYV9yaHQsICZjcHUsCisJCQkJCQkgIHNkbWFfcmh0X3BhcmFtcyk7CisJCWlmIChyaHRfbm9kZSkgeworCQkJYm9vbCBlbXB0eSA9IHRydWU7CisJCQlpbnQgaTsKKworCQkJLyogUmVtb3ZlIG1hcHBpbmdzIGZvciBvbGQgc2RlICovCisJCQlmb3IgKGkgPSAwOyBpIDwgSEZJMV9NQVhfVkxTX1NVUFBPUlRFRDsgaSsrKQorCQkJCWlmIChyaHRfbm9kZS0+bWFwW2ldKQorCQkJCQlzZG1hX2NsZWFudXBfc2RlX21hcChyaHRfbm9kZS0+bWFwW2ldLAorCQkJCQkJCSAgICAgc2RlKTsKKworCQkJLyogRnJlZSBlbXB0eSBoYXNoIHRhYmxlIGVudHJpZXMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBIRkkxX01BWF9WTFNfU1VQUE9SVEVEOyBpKyspIHsKKwkJCQlpZiAoIXJodF9ub2RlLT5tYXBbaV0pCisJCQkJCWNvbnRpbnVlOworCisJCQkJaWYgKHJodF9ub2RlLT5tYXBbaV0tPmN0cikgeworCQkJCQllbXB0eSA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChlbXB0eSkgeworCQkJCXJldCA9IHJoYXNodGFibGVfcmVtb3ZlX2Zhc3QoJmRkLT5zZG1hX3JodCwKKwkJCQkJCQkgICAgICZyaHRfbm9kZS0+bm9kZSwKKwkJCQkJCQkgICAgIHNkbWFfcmh0X3BhcmFtcyk7CisJCQkJV0FSTl9PTihyZXQpOworCisJCQkJZm9yIChpID0gMDsgaSA8IEhGSTFfTUFYX1ZMU19TVVBQT1JURUQ7IGkrKykKKwkJCQkJa2ZyZWUocmh0X25vZGUtPm1hcFtpXSk7CisKKwkJCQlrZnJlZShyaHRfbm9kZSk7CisJCQl9CisJCX0KKwl9CisKKwljcHVtYXNrX2NvcHkoJnNkZS0+Y3B1X21hc2ssIG5ld19tYXNrKTsKK291dDoKKwltdXRleF91bmxvY2soJnByb2Nlc3NfdG9fc2RlX211dGV4KTsKK291dF9mcmVlOgorCWZyZWVfY3B1bWFza192YXIobWFzayk7CisJZnJlZV9jcHVtYXNrX3ZhcihuZXdfbWFzayk7CisJcmV0dXJuIHJldCA/IDogc3RybmxlbihidWYsIFBBR0VfU0laRSk7Cit9CisKK3NzaXplX3Qgc2RtYV9nZXRfY3B1X3RvX3NkZV9tYXAoc3RydWN0IHNkbWFfZW5naW5lICpzZGUsIGNoYXIgKmJ1ZikKK3sKKwltdXRleF9sb2NrKCZwcm9jZXNzX3RvX3NkZV9tdXRleCk7CisJaWYgKGNwdW1hc2tfZW1wdHkoJnNkZS0+Y3B1X21hc2spKQorCQlzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCAiZW1wdHkiKTsKKwllbHNlCisJCWNwdW1hcF9wcmludF90b19wYWdlYnVmKHRydWUsIGJ1ZiwgJnNkZS0+Y3B1X21hc2spOworCW11dGV4X3VubG9jaygmcHJvY2Vzc190b19zZGVfbXV0ZXgpOworCXJldHVybiBzdHJubGVuKGJ1ZiwgUEFHRV9TSVpFKTsKK30KKworc3RhdGljIHZvaWQgc2RtYV9yaHRfZnJlZSh2b2lkICpwdHIsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgc2RtYV9yaHRfbm9kZSAqcmh0X25vZGUgPSBwdHI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSEZJMV9NQVhfVkxTX1NVUFBPUlRFRDsgaSsrKQorCQlrZnJlZShyaHRfbm9kZS0+bWFwW2ldKTsKKworCWtmcmVlKHJodF9ub2RlKTsKK30KKworLyoqCisgKiBzZG1hX3NlcWZpbGVfZHVtcF9jcHVfbGlzdCgpIC0gZGVidWdmcyBkdW1wIHRoZSBjcHUgdG8gc2RtYSBtYXBwaW5ncworICogQHM6IHNlcSBmaWxlCisgKiBAZGQ6IGhmaTFfZGV2ZGF0YQorICogQGNwdWlkOiBjcHUgaWQKKyAqCisgKiBUaGlzIHJvdXRpbmUgZHVtcHMgdGhlIHByb2Nlc3MgdG8gc2RlIG1hcHBpbmdzIHBlciBjcHUKKyAqLwordm9pZCBzZG1hX3NlcWZpbGVfZHVtcF9jcHVfbGlzdChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCisJCQkJc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsCisJCQkJdW5zaWduZWQgbG9uZyBjcHVpZCkKK3sKKwlzdHJ1Y3Qgc2RtYV9yaHRfbm9kZSAqcmh0X25vZGU7CisJaW50IGksIGo7CisKKwlyaHRfbm9kZSA9IHJoYXNodGFibGVfbG9va3VwX2Zhc3QoJmRkLT5zZG1hX3JodCwgJmNwdWlkLAorCQkJCQkgIHNkbWFfcmh0X3BhcmFtcyk7CisJaWYgKCFyaHRfbm9kZSkKKwkJcmV0dXJuOworCisJc2VxX3ByaW50ZihzLCAiY3B1JTNsdTogIiwgY3B1aWQpOworCWZvciAoaSA9IDA7IGkgPCBIRkkxX01BWF9WTFNfU1VQUE9SVEVEOyBpKyspIHsKKwkJaWYgKCFyaHRfbm9kZS0+bWFwW2ldIHx8ICFyaHRfbm9kZS0+bWFwW2ldLT5jdHIpCisJCQljb250aW51ZTsKKworCQlzZXFfcHJpbnRmKHMsICIgdmwlZDogWyIsIGkpOworCisJCWZvciAoaiA9IDA7IGogPCByaHRfbm9kZS0+bWFwW2ldLT5jdHI7IGorKykgeworCQkJaWYgKCFyaHRfbm9kZS0+bWFwW2ldLT5zZGVbal0pCisJCQkJY29udGludWU7CisKKwkJCWlmIChqID4gMCkKKwkJCQlzZXFfcHV0cyhzLCAiLCIpOworCisJCQlzZXFfcHJpbnRmKHMsICIgc2RtYSUyZCIsCisJCQkJICAgcmh0X25vZGUtPm1hcFtpXS0+c2RlW2pdLT50aGlzX2lkeCk7CisJCX0KKwkJc2VxX3B1dHMocywgIiBdIik7CisJfQorCisJc2VxX3B1dHMocywgIlxuIik7Cit9CisKIC8qCiAgKiBGcmVlIHRoZSBpbmRpY2F0ZWQgbWFwIHN0cnVjdAogICovCkBAIC0xMTYxLDYgKzE1MDksMTAgQEAKIAlkZC0+bnVtX3NkbWEgPSBudW1fZW5naW5lczsKIAlpZiAoc2RtYV9tYXBfaW5pdChkZCwgcG9ydCwgcHBkLT52bHNfb3BlcmF0aW9uYWwsIE5VTEwpKQogCQlnb3RvIGJhaWw7CisKKwlpZiAocmhhc2h0YWJsZV9pbml0KCZkZC0+c2RtYV9yaHQsICZzZG1hX3JodF9wYXJhbXMpKQorCQlnb3RvIGJhaWw7CisKIAlkZF9kZXZfaW5mbyhkZCwgIlNETUEgbnVtX3NkbWE6ICV1XG4iLCBkZC0+bnVtX3NkbWEpOwogCXJldHVybiAwOwogCkBAIC0xMjUyLDYgKzE2MDQsNyBAQAogCQlzZG1hX2ZpbmFscHV0KCZzZGUtPnN0YXRlKTsKIAl9CiAJc2RtYV9jbGVhbihkZCwgZGQtPm51bV9zZG1hKTsKKwlyaGFzaHRhYmxlX2ZyZWVfYW5kX2Rlc3Ryb3koJmRkLT5zZG1hX3JodCwgc2RtYV9yaHRfZnJlZSwgTlVMTCk7CiB9CiAKIC8qCkBAIC0yMDg2LDYgKzI0MzksMTEgQEAKICAqIEBzZGU6IHNkbWEgZW5naW5lIHRvIHVzZQogICogQHdhaXQ6IHdhaXQgc3RydWN0dXJlIHRvIHVzZSB3aGVuIGZ1bGwgKG1heSBiZSBOVUxMKQogICogQHR4X2xpc3Q6IGxpc3Qgb2Ygc2RtYV90eHJlcXMgdG8gc3VibWl0CisgKiBAY291bnQ6IHBvaW50ZXIgdG8gYSB1MzIgd2hpY2gsIGFmdGVyIHJldHVybiB3aWxsIGNvbnRhaW4gdGhlIHRvdGFsIG51bWJlciBvZgorICogICAgICAgICBzZG1hX3R4cmVxcyByZW1vdmVkIGZyb20gdGhlIHR4X2xpc3QuIFRoaXMgd2lsbCBpbmNsdWRlIHNkbWFfdHhyZXFzCisgKiAgICAgICAgIHdob3NlIFNETUEgZGVzY3JpcHRvcnMgYXJlIHN1Ym1pdHRlZCB0byB0aGUgcmluZyBhbmQgdGhlIHNkbWFfdHhyZXFzCisgKiAgICAgICAgIHdoaWNoIGFyZSBhZGRlZCB0byBTRE1BIGVuZ2luZSBmbHVzaCBsaXN0IGlmIHRoZSBTRE1BIGVuZ2luZSBzdGF0ZSBpcworICogICAgICAgICBub3QgcnVubmluZy4KICAqCiAgKiBUaGUgY2FsbCBzdWJtaXRzIHRoZSBsaXN0IGludG8gdGhlIHJpbmcuCiAgKgpAQCAtMjEwMCwxOCArMjQ1OCwxOCBAQAogICogc2lkZSBsb2NraW5nLgogICoKICAqIFJldHVybjoKLSAqID4gMCAtIFN1Y2Nlc3MgKHZhbHVlIGlzIG51bWJlciBvZiBzZG1hX3R4cmVxJ3Mgc3VibWl0dGVkKSwKKyAqIDAgLSBTdWNjZXNzLAogICogLUVJTlZBTCAtIHNkbWFfdHhyZXEgaW5jb21wbGV0ZSwgLUVCVVNZIC0gbm8gc3BhY2UgaW4gcmluZyAod2FpdCA9PSBOVUxMKQogICogLUVJT0NCUVVFVUVEIC0gdHggcXVldWVkIHRvIGlvd2FpdCwgLUVDT01NIGJhZCBzZG1hIHN0YXRlCiAgKi8KIGludCBzZG1hX3NlbmRfdHhsaXN0KHN0cnVjdCBzZG1hX2VuZ2luZSAqc2RlLCBzdHJ1Y3QgaW93YWl0ICp3YWl0LAotCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnR4X2xpc3QpCisJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqdHhfbGlzdCwgdTMyICpjb3VudF9vdXQpCiB7CiAJc3RydWN0IHNkbWFfdHhyZXEgKnR4LCAqdHhfbmV4dDsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUxNiB0YWlsID0gSU5WQUxJRF9UQUlMOwotCWludCBjb3VudCA9IDA7CisJdTMyIHN1Ym1pdF9jb3VudCA9IDAsIGZsdXNoX2NvdW50ID0gMCwgdG90YWxfY291bnQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2RlLT50YWlsX2xvY2ssIGZsYWdzKTsKIHJldHJ5OgpAQCAtMjEyNywzMyArMjQ4NSwzNCBAQAogCQl9CiAJCWxpc3RfZGVsX2luaXQoJnR4LT5saXN0KTsKIAkJdGFpbCA9IHN1Ym1pdF90eChzZGUsIHR4KTsKLQkJY291bnQrKzsKKwkJc3VibWl0X2NvdW50Kys7CiAJCWlmICh0YWlsICE9IElOVkFMSURfVEFJTCAmJgotCQkgICAgKGNvdW50ICYgU0RNQV9UQUlMX1VQREFURV9USFJFU0gpID09IDApIHsKKwkJICAgIChzdWJtaXRfY291bnQgJiBTRE1BX1RBSUxfVVBEQVRFX1RIUkVTSCkgPT0gMCkgewogCQkJc2RtYV91cGRhdGVfdGFpbChzZGUsIHRhaWwpOwogCQkJdGFpbCA9IElOVkFMSURfVEFJTDsKIAkJfQogCX0KIHVwZGF0ZV90YWlsOgorCXRvdGFsX2NvdW50ID0gc3VibWl0X2NvdW50ICsgZmx1c2hfY291bnQ7CiAJaWYgKHdhaXQpCi0JCWlvd2FpdF9zZG1hX2FkZCh3YWl0LCBjb3VudCk7CisJCWlvd2FpdF9zZG1hX2FkZCh3YWl0LCB0b3RhbF9jb3VudCk7CiAJaWYgKHRhaWwgIT0gSU5WQUxJRF9UQUlMKQogCQlzZG1hX3VwZGF0ZV90YWlsKHNkZSwgdGFpbCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RlLT50YWlsX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0ID09IDAgPyBjb3VudCA6IHJldDsKKwkqY291bnRfb3V0ID0gdG90YWxfY291bnQ7CisJcmV0dXJuIHJldDsKIHVubG9ja19ub2Nvbm46CiAJc3Bpbl9sb2NrKCZzZGUtPmZsdXNobGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHgsIHR4X25leHQsIHR4X2xpc3QsIGxpc3QpIHsKIAkJdHgtPndhaXQgPSB3YWl0OwogCQlsaXN0X2RlbF9pbml0KCZ0eC0+bGlzdCk7Ci0JCWlmICh3YWl0KQotCQkJaW93YWl0X3NkbWFfaW5jKHdhaXQpOwogCQl0eC0+bmV4dF9kZXNjcV9pZHggPSAwOwogI2lmZGVmIENPTkZJR19IRkkxX0RFQlVHX1NETUFfT1JERVIKIAkJdHgtPnNuID0gc2RlLT50YWlsX3NuKys7CiAJCXRyYWNlX2hmaTFfc2RtYV9pbl9zbihzZGUsIHR4LT5zbik7CiAjZW5kaWYKIAkJbGlzdF9hZGRfdGFpbCgmdHgtPmxpc3QsICZzZGUtPmZsdXNobGlzdCk7CisJCWZsdXNoX2NvdW50Kys7CiAJCWlmICh3YWl0KSB7CiAJCQl3YWl0LT50eF9jb3VudCsrOwogCQkJd2FpdC0+Y291bnQgKz0gdHgtPm51bV9kZXNjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvc2RtYS5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvc2RtYS5oCmluZGV4IDhmNTBjOTkuLjU2MjU3ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3NkbWEuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9zZG1hLmgKQEAgLTQxMyw2ICs0MTMsOCBAQAogCXNwaW5sb2NrX3QgZmx1c2hsaXN0X2xvY2s7CiAJLyogcHJpdmF0ZTogKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGZsdXNobGlzdDsKKwlzdHJ1Y3QgY3B1bWFzayBjcHVfbWFzazsKKwlzdHJ1Y3Qga29iamVjdCBrb2JqOwogfTsKIAogaW50IHNkbWFfaW5pdChzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgdTggcG9ydCk7CkBAIC04NDcsNyArODQ5LDggQEAKIAkJICAgIHN0cnVjdCBzZG1hX3R4cmVxICp0eCk7CiBpbnQgc2RtYV9zZW5kX3R4bGlzdChzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSwKIAkJICAgICBzdHJ1Y3QgaW93YWl0ICp3YWl0LAotCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnR4X2xpc3QpOworCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnR4X2xpc3QsCisJCSAgICAgdTMyICpjb3VudCk7CiAKIGludCBzZG1hX2FoZ19hbGxvYyhzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSk7CiB2b2lkIHNkbWFfYWhnX2ZyZWUoc3RydWN0IHNkbWFfZW5naW5lICpzZGUsIGludCBhaGdfaW5kZXgpOwpAQCAtMTA1OCw3ICsxMDYxLDE1IEBACiAJdTMyIHNlbGVjdG9yLAogCXU4IHZsKTsKIAorc3RydWN0IHNkbWFfZW5naW5lICpzZG1hX3NlbGVjdF91c2VyX2VuZ2luZShzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwKKwkJCQkJICAgIHUzMiBzZWxlY3RvciwgdTggdmwpOworc3NpemVfdCBzZG1hX2dldF9jcHVfdG9fc2RlX21hcChzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSwgY2hhciAqYnVmKTsKK3NzaXplX3Qgc2RtYV9zZXRfY3B1X3RvX3NkZV9tYXAoc3RydWN0IHNkbWFfZW5naW5lICpzZGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQpOworaW50IHNkbWFfZW5naW5lX2dldF92bChzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSk7CiB2b2lkIHNkbWFfc2VxZmlsZV9kdW1wX3NkZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCBzZG1hX2VuZ2luZSAqKTsKK3ZvaWQgc2RtYV9zZXFmaWxlX2R1bXBfY3B1X2xpc3Qoc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwKKwkJCQl1bnNpZ25lZCBsb25nIGNwdWlkKTsKIAogI2lmZGVmIENPTkZJR19TRE1BX1ZFUkJPU0lUWQogdm9pZCBzZG1hX2R1bXBzdGF0ZShzdHJ1Y3Qgc2RtYV9lbmdpbmUgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9zeXNmcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvc3lzZnMuYwppbmRleCA3NGM4NGM2Li5lZGJhMjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9zeXNmcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3N5c2ZzLmMKQEAgLTc2NiwxMyArNzY2LDk1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RydWN0IHNkZV9hdHRyaWJ1dGUgeworCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKKwlzc2l6ZV90ICgqc2hvdykoc3RydWN0IHNkbWFfZW5naW5lICpzZGUsIGNoYXIgKmJ1Zik7CisJc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY250KTsKK307CisKK3N0YXRpYyBzc2l6ZV90IHNkZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNkZV9hdHRyaWJ1dGUgKnNkZV9hdHRyID0KKwkJY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBzZGVfYXR0cmlidXRlLCBhdHRyKTsKKwlzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSA9CisJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3Qgc2RtYV9lbmdpbmUsIGtvYmopOworCisJaWYgKCFzZGVfYXR0ci0+c2hvdykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc2RlX2F0dHItPnNob3coc2RlLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBzZGVfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNkZV9hdHRyaWJ1dGUgKnNkZV9hdHRyID0KKwkJY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBzZGVfYXR0cmlidXRlLCBhdHRyKTsKKwlzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSA9CisJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3Qgc2RtYV9lbmdpbmUsIGtvYmopOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKCFzZGVfYXR0ci0+c3RvcmUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHNkZV9hdHRyLT5zdG9yZShzZGUsIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyBzZGVfc3lzZnNfb3BzID0geworCS5zaG93ID0gc2RlX3Nob3csCisJLnN0b3JlID0gc2RlX3N0b3JlLAorfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgc2RlX2t0eXBlID0geworCS5zeXNmc19vcHMgPSAmc2RlX3N5c2ZzX29wcywKK307CisKKyNkZWZpbmUgU0RFX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKSBcCisJc3RydWN0IHNkZV9hdHRyaWJ1dGUgc2RlX2F0dHJfIyNfbmFtZSA9IFwKKwkJX19BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3csIF9zdG9yZSkKKworc3RhdGljIHNzaXplX3Qgc2RlX3Nob3dfY3B1X3RvX3NkZV9tYXAoc3RydWN0IHNkbWFfZW5naW5lICpzZGUsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc2RtYV9nZXRfY3B1X3RvX3NkZV9tYXAoc2RlLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBzZGVfc3RvcmVfY3B1X3RvX3NkZV9tYXAoc3RydWN0IHNkbWFfZW5naW5lICpzZGUsCisJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBzZG1hX3NldF9jcHVfdG9fc2RlX21hcChzZGUsIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgc3NpemVfdCBzZGVfc2hvd192bChzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSwgY2hhciAqYnVmKQoreworCWludCB2bDsKKworCXZsID0gc2RtYV9lbmdpbmVfZ2V0X3ZsKHNkZSk7CisJaWYgKHZsIDwgMCkKKwkJcmV0dXJuIHZsOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHZsKTsKK30KKworc3RhdGljIFNERV9BVFRSKGNwdV9saXN0LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJc2RlX3Nob3dfY3B1X3RvX3NkZV9tYXAsCisJCXNkZV9zdG9yZV9jcHVfdG9fc2RlX21hcCk7CitzdGF0aWMgU0RFX0FUVFIodmwsIFNfSVJVR08sIHNkZV9zaG93X3ZsLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBzZGVfYXR0cmlidXRlICpzZGVfYXR0cmlic1tdID0geworCSZzZGVfYXR0cl9jcHVfbGlzdCwKKwkmc2RlX2F0dHJfdmwKK307CisKIC8qCiAgKiBSZWdpc3RlciBhbmQgY3JlYXRlIG91ciBmaWxlcyBpbiAvc3lzL2NsYXNzL2luZmluaWJhbmQuCiAgKi8KIGludCBoZmkxX3ZlcmJzX3JlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkKQogewogCXN0cnVjdCBpYl9kZXZpY2UgKmRldiA9ICZkZC0+dmVyYnNfZGV2LnJkaS5pYmRldjsKLQlpbnQgaSwgcmV0OworCXN0cnVjdCBkZXZpY2UgKmNsYXNzX2RldiA9ICZkZXYtPmRldjsKKwlpbnQgaSwgaiwgcmV0OwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaGZpMV9hdHRyaWJ1dGVzKTsgKytpKSB7CiAJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsIGhmaTFfYXR0cmlidXRlc1tpXSk7CkBAIC03ODAsMTAgKzg2MiwyOSBAQAogCQkJZ290byBiYWlsOwogCX0KIAorCWZvciAoaSA9IDA7IGkgPCBkZC0+bnVtX3NkbWE7IGkrKykgeworCQlyZXQgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmZGQtPnBlcl9zZG1hW2ldLmtvYmosCisJCQkJCSAgICZzZGVfa3R5cGUsICZjbGFzc19kZXYtPmtvYmosCisJCQkJCSAgICJzZG1hJWQiLCBpKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gYmFpbDsKKworCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShzZGVfYXR0cmlicyk7IGorKykgeworCQkJcmV0ID0gc3lzZnNfY3JlYXRlX2ZpbGUoJmRkLT5wZXJfc2RtYVtpXS5rb2JqLAorCQkJCQkJJnNkZV9hdHRyaWJzW2pdLT5hdHRyKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBiYWlsOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiBiYWlsOgogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhmaTFfYXR0cmlidXRlcyk7ICsraSkKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgaGZpMV9hdHRyaWJ1dGVzW2ldKTsKKworCWZvciAoaSA9IDA7IGkgPCBkZC0+bnVtX3NkbWE7IGkrKykKKwkJa29iamVjdF9kZWwoJmRkLT5wZXJfc2RtYVtpXS5rb2JqKTsKKwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZS5jCmluZGV4IDRjZmIxMzcuLjAxZjUyNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdHJhY2UuYwpAQCAtNDcsOSArNDcsOSBAQAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSAidHJhY2UuaCIKIAotdTggaWJoZHJfZXhoZHJfbGVuKHN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyKQordTggaWJoZHJfZXhoZHJfbGVuKHN0cnVjdCBpYl9oZWFkZXIgKmhkcikKIHsKLQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXU4IG9wY29kZTsKIAl1OCBsbmggPSAodTgpKGJlMTZfdG9fY3B1KGhkci0+bHJoWzBdKSAmIDMpOwogCkBAIC02NywxNiArNjcsMTEgQEAKICNkZWZpbmUgQUVUSF9QUk4gImFldGggc3luIDB4JS4yeCAlcyBtc24gMHglLjh4IgogI2RlZmluZSBERVRIX1BSTiAiZGV0aCBxa2V5IDB4JS44eCBzcXBuIDB4JS42eCIKICNkZWZpbmUgSUVUSF9QUk4gImlldGggcmtleSAweCUuOHgiCi0jZGVmaW5lIEFUT01JQ0FDS0VUSF9QUk4gIm9yaWdkYXRhICVsbGQiCi0jZGVmaW5lIEFUT01JQ0VUSF9QUk4gInZhZGRyIDB4JWxseCBya2V5IDB4JS44eCBzZGF0YSAlbGxkIGNkYXRhICVsbGQiCisjZGVmaW5lIEFUT01JQ0FDS0VUSF9QUk4gIm9yaWdkYXRhICVsbHgiCisjZGVmaW5lIEFUT01JQ0VUSF9QUk4gInZhZGRyIDB4JWxseCBya2V5IDB4JS44eCBzZGF0YSAlbGx4IGNkYXRhICVsbHgiCiAKICNkZWZpbmUgT1AodHJhbnNwb3J0LCBvcCkgSUJfT1BDT0RFXyMjIHRyYW5zcG9ydCAjIyBfICMjIG9wCiAKLXN0YXRpYyB1NjQgaWJfdTY0X2dldChfX2JlMzIgKnApCi17Ci0JcmV0dXJuICgodTY0KWJlMzJfdG9fY3B1KHBbMF0pIDw8IDMyKSB8IGJlMzJfdG9fY3B1KHBbMV0pOwotfQotCiBzdGF0aWMgY29uc3QgY2hhciAqcGFyc2Vfc3luZHJvbWUodTggc3luZHJvbWUpCiB7CiAJc3dpdGNoIChzeW5kcm9tZSA+PiA1KSB7CkBAIC0xMTMsOCArMTA4LDcgQEAKIAljYXNlIE9QKFJDLCBSRE1BX1dSSVRFX09OTFlfV0lUSF9JTU1FRElBVEUpOgogCWNhc2UgT1AoVUMsIFJETUFfV1JJVEVfT05MWV9XSVRIX0lNTUVESUFURSk6CiAJCXRyYWNlX3NlcV9wcmludGYocCwgUkVUSF9QUk4gIiAiIElNTV9QUk4sCi0JCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpaWJfdTY0X2dldCgKLQkJCQkgKF9fYmUzMiAqKSZlaC0+cmMucmV0aC52YWRkciksCisJCQkJIGdldF9pYl9yZXRoX3ZhZGRyKCZlaC0+cmMucmV0aCksCiAJCQkJIGJlMzJfdG9fY3B1KGVoLT5yYy5yZXRoLnJrZXkpLAogCQkJCSBiZTMyX3RvX2NwdShlaC0+cmMucmV0aC5sZW5ndGgpLAogCQkJCSBiZTMyX3RvX2NwdShlaC0+cmMuaW1tX2RhdGEpKTsKQEAgLTEyNiw4ICsxMjAsNyBAQAogCWNhc2UgT1AoUkMsIFJETUFfV1JJVEVfT05MWSk6CiAJY2FzZSBPUChVQywgUkRNQV9XUklURV9PTkxZKToKIAkJdHJhY2Vfc2VxX3ByaW50ZihwLCBSRVRIX1BSTiwKLQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylpYl91NjRfZ2V0KAotCQkJCSAoX19iZTMyICopJmVoLT5yYy5yZXRoLnZhZGRyKSwKKwkJCQkgZ2V0X2liX3JldGhfdmFkZHIoJmVoLT5yYy5yZXRoKSwKIAkJCQkgYmUzMl90b19jcHUoZWgtPnJjLnJldGgucmtleSksCiAJCQkJIGJlMzJfdG9fY3B1KGVoLT5yYy5yZXRoLmxlbmd0aCkpOwogCQlicmVhazsKQEAgLTE0NSwyMCArMTM4LDE2IEBACiAJCQkJIGJlMzJfdG9fY3B1KGVoLT5hdC5hZXRoKSA+PiAyNCwKIAkJCQkgcGFyc2Vfc3luZHJvbWUoYmUzMl90b19jcHUoZWgtPmF0LmFldGgpID4+IDI0KSwKIAkJCQkgYmUzMl90b19jcHUoZWgtPmF0LmFldGgpICYgSEZJMV9NU05fTUFTSywKLQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykKLQkJCQkgaWJfdTY0X2dldChlaC0+YXQuYXRvbWljX2Fja19ldGgpKTsKKwkJCQkgaWJfdTY0X2dldCgmZWgtPmF0LmF0b21pY19hY2tfZXRoKSk7CiAJCWJyZWFrOwogCS8qIGF0b21pY2V0aCAqLwogCWNhc2UgT1AoUkMsIENPTVBBUkVfU1dBUCk6CiAJY2FzZSBPUChSQywgRkVUQ0hfQUREKToKIAkJdHJhY2Vfc2VxX3ByaW50ZihwLCBBVE9NSUNFVEhfUFJOLAotCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKWliX3U2NF9nZXQoCi0JCQkJIGVoLT5hdG9taWNfZXRoLnZhZGRyKSwKKwkJCQkgZ2V0X2liX2F0ZXRoX3ZhZGRyKCZlaC0+YXRvbWljX2V0aCksCiAJCQkJIGVoLT5hdG9taWNfZXRoLnJrZXksCi0JCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpaWJfdTY0X2dldCgKLQkJCQkgKF9fYmUzMiAqKSZlaC0+YXRvbWljX2V0aC5zd2FwX2RhdGEpLAotCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKWliX3U2NF9nZXQoCi0JCQkJIChfX2JlMzIgKikmZWgtPmF0b21pY19ldGguY29tcGFyZV9kYXRhKSk7CisJCQkJIGdldF9pYl9hdGV0aF9zd2FwKCZlaC0+YXRvbWljX2V0aCksCisJCQkJIGdldF9pYl9hdGV0aF9jb21wYXJlKCZlaC0+YXRvbWljX2V0aCkpOwogCQlicmVhazsKIAkvKiBkZXRoICovCiAJY2FzZSBPUChVRCwgU0VORF9PTkxZKToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlX2N0eHRzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZV9jdHh0cy5oCmluZGV4IDMxNjU0YmIuLjI2YWU3ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlX2N0eHRzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdHJhY2VfY3R4dHMuaApAQCAtNjcsOSArNjcsOSBAQAogCQkJICAgICBfX2ZpZWxkKHU2NCwgaHdfZnJlZSkKIAkJCSAgICAgX19maWVsZCh2b2lkIF9faW9tZW0gKiwgcGlvYmFzZSkKIAkJCSAgICAgX19maWVsZCh1MTYsIHJjdmhkcnFfY250KQotCQkJICAgICBfX2ZpZWxkKHU2NCwgcmN2aGRycV9waHlzKQorCQkJICAgICBfX2ZpZWxkKHU2NCwgcmN2aGRycV9kbWEpCiAJCQkgICAgIF9fZmllbGQodTMyLCBlYWdlcl9jbnQpCi0JCQkgICAgIF9fZmllbGQodTY0LCByY3ZlZ3JfcGh5cykKKwkJCSAgICAgX19maWVsZCh1NjQsIHJjdmVncl9kbWEpCiAJCQkgICAgICksCiAJICAgIFRQX2Zhc3RfYXNzaWduKEREX0RFVl9BU1NJR04oZGQpOwogCQkJICAgX19lbnRyeS0+Y3R4dCA9IHVjdHh0LT5jdHh0OwpAQCAtNzcsMTAgKzc3LDkgQEAKIAkJCSAgIF9fZW50cnktPmh3X2ZyZWUgPSBsZTY0X3RvX2NwdSgqdWN0eHQtPnNjLT5od19mcmVlKTsKIAkJCSAgIF9fZW50cnktPnBpb2Jhc2UgPSB1Y3R4dC0+c2MtPmJhc2VfYWRkcjsKIAkJCSAgIF9fZW50cnktPnJjdmhkcnFfY250ID0gdWN0eHQtPnJjdmhkcnFfY250OwotCQkJICAgX19lbnRyeS0+cmN2aGRycV9waHlzID0gdWN0eHQtPnJjdmhkcnFfcGh5czsKKwkJCSAgIF9fZW50cnktPnJjdmhkcnFfZG1hID0gdWN0eHQtPnJjdmhkcnFfZG1hOwogCQkJICAgX19lbnRyeS0+ZWFnZXJfY250ID0gdWN0eHQtPmVncmJ1ZnMuYWxsb2NlZDsKLQkJCSAgIF9fZW50cnktPnJjdmVncl9waHlzID0KLQkJCSAgIHVjdHh0LT5lZ3JidWZzLnJjdnRpZHNbMF0ucGh5czsKKwkJCSAgIF9fZW50cnktPnJjdmVncl9kbWEgPSB1Y3R4dC0+ZWdyYnVmcy5yY3Z0aWRzWzBdLmRtYTsKIAkJCSAgICksCiAJICAgIFRQX3ByaW50aygiWyVzXSBjdHh0ICV1ICIgVUNUWFRfRk1ULAogCQkgICAgICBfX2dldF9zdHIoZGV2KSwKQEAgLTg5LDkgKzg4LDkgQEAKIAkJICAgICAgX19lbnRyeS0+aHdfZnJlZSwKIAkJICAgICAgX19lbnRyeS0+cGlvYmFzZSwKIAkJICAgICAgX19lbnRyeS0+cmN2aGRycV9jbnQsCi0JCSAgICAgIF9fZW50cnktPnJjdmhkcnFfcGh5cywKKwkJICAgICAgX19lbnRyeS0+cmN2aGRycV9kbWEsCiAJCSAgICAgIF9fZW50cnktPmVhZ2VyX2NudCwKLQkJICAgICAgX19lbnRyeS0+cmN2ZWdyX3BoeXMKKwkJICAgICAgX19lbnRyeS0+cmN2ZWdyX2RtYQogCQkgICAgICApCiApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZV9pYmhkcnMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlX2liaGRycy5oCmluZGV4IGMzZTQxYWUuLjM4MmZjZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlX2liaGRycy5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlX2liaGRycy5oCkBAIC01NSw3ICs1NSw3IEBACiAjdW5kZWYgVFJBQ0VfU1lTVEVNCiAjZGVmaW5lIFRSQUNFX1NZU1RFTSBoZmkxX2liaGRycwogCi11OCBpYmhkcl9leGhkcl9sZW4oc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIpOwordTggaWJoZHJfZXhoZHJfbGVuKHN0cnVjdCBpYl9oZWFkZXIgKmhkcik7CiBjb25zdCBjaGFyICpwYXJzZV9ldmVyYnNfaGRycyhzdHJ1Y3QgdHJhY2Vfc2VxICpwLCB1OCBvcGNvZGUsIHZvaWQgKmVoZHJzKTsKIAogI2RlZmluZSBfX3BhcnNlX2liX2VoZHJzKG9wLCBlaGRycykgcGFyc2VfZXZlcmJzX2hkcnMocCwgb3AsIGVoZHJzKQpAQCAtNzQsNyArNzQsNyBAQAogCiBERUNMQVJFX0VWRU5UX0NMQVNTKGhmaTFfaWJoZHJfdGVtcGxhdGUsCiAJCSAgICBUUF9QUk9UTyhzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwKLQkJCSAgICAgc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIpLAorCQkJICAgICBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIpLAogCQkgICAgVFBfQVJHUyhkZCwgaGRyKSwKIAkJICAgIFRQX1NUUlVDVF9fZW50cnkoCiAJCQlERF9ERVZfRU5UUlkoZGQpCkBAIC0xMDIsNyArMTAyLDcgQEAKIAkJCV9fZHluYW1pY19hcnJheSh1OCwgZWhkcnMsIGliaGRyX2V4aGRyX2xlbihoZHIpKQogCQkJKSwKIAkJICAgICAgVFBfZmFzdF9hc3NpZ24oCi0JCQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyOworCQkJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAKIAkJCUREX0RFVl9BU1NJR04oZGQpOwogCQkJLyogTFJIICovCkBAIC0xODUsMTkgKzE4NSwxOSBAQAogKTsKIAogREVGSU5FX0VWRU5UKGhmaTFfaWJoZHJfdGVtcGxhdGUsIGlucHV0X2liaGRyLAotCSAgICAgVFBfUFJPVE8oc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyKSwKKwkgICAgIFRQX1BST1RPKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIpLAogCSAgICAgVFBfQVJHUyhkZCwgaGRyKSk7CiAKIERFRklORV9FVkVOVChoZmkxX2liaGRyX3RlbXBsYXRlLCBwaW9fb3V0cHV0X2liaGRyLAotCSAgICAgVFBfUFJPVE8oc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyKSwKKwkgICAgIFRQX1BST1RPKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIpLAogCSAgICAgVFBfQVJHUyhkZCwgaGRyKSk7CiAKIERFRklORV9FVkVOVChoZmkxX2liaGRyX3RlbXBsYXRlLCBhY2tfb3V0cHV0X2liaGRyLAotCSAgICAgVFBfUFJPVE8oc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyKSwKKwkgICAgIFRQX1BST1RPKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIpLAogCSAgICAgVFBfQVJHUyhkZCwgaGRyKSk7CiAKIERFRklORV9FVkVOVChoZmkxX2liaGRyX3RlbXBsYXRlLCBzZG1hX291dHB1dF9pYmhkciwKLQkgICAgIFRQX1BST1RPKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkciksCisJICAgICBUUF9QUk9UTyhzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgc3RydWN0IGliX2hlYWRlciAqaGRyKSwKIAkgICAgIFRQX0FSR1MoZGQsIGhkcikpOwogCiAjZW5kaWYgLyogX19IRkkxX1RSQUNFX0lCSERSU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZV9yeC5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdHJhY2VfcnguaAppbmRleCA5YmExZjYxLi4xMWUwMmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZV9yeC5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlX3J4LmgKQEAgLTI2MCw3ICsyNjAsNyBAQAogVFJBQ0VfRVZFTlQoc25vb3BfY2FwdHVyZSwKIAkgICAgVFBfUFJPVE8oc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsCiAJCSAgICAgaW50IGhkcl9sZW4sCi0JCSAgICAgc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIsCisJCSAgICAgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQkgICAgIGludCBkYXRhX2xlbiwKIAkJICAgICB2b2lkICpkYXRhKSwKIAkgICAgVFBfQVJHUyhkZCwgaGRyX2xlbiwgaGRyLCBkYXRhX2xlbiwgZGF0YSksCkBAIC0yNzksNyArMjc5LDcgQEAKIAkJCSAgICAgX19keW5hbWljX2FycmF5KHU4LCByYXdfcGt0LCBkYXRhX2xlbikKIAkJCSAgICAgKSwKIAkgICAgVFBfZmFzdF9hc3NpZ24oCi0JCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHI7CisJCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCiAJCV9fZW50cnktPmxuaCA9ICh1OCkoYmUxNl90b19jcHUoaGRyLT5scmhbMF0pICYgMyk7CiAJCWlmIChfX2VudHJ5LT5sbmggPT0gSEZJMV9MUkhfQlRIKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdWMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3VjLmMKaW5kZXggYTcyNmQ5Ni4uNWU2ZDFiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdWMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS91Yy5jCkBAIC01MCwxNCArNTAsNyBAQAogI2luY2x1ZGUgInFwLmgiCiAKIC8qIGN1dCBkb3duIHJpZGljdWxvdXNseSBsb25nIElCIG1hY3JvIG5hbWVzICovCi0jZGVmaW5lIE9QKHgpIElCX09QQ09ERV9VQ18jI3gKLQotLyogb25seSBvcGNvZGUgbWFzayBmb3IgYWRhcHRpdmUgcGlvICovCi1jb25zdCB1MzIgdWNfb25seV9vcGNvZGUgPQotCUJJVChPUChTRU5EX09OTFkpICYgMHgxZikgfAotCUJJVChPUChTRU5EX09OTFlfV0lUSF9JTU1FRElBVEUgJiAweDFmKSkgfAotCUJJVChPUChSRE1BX1dSSVRFX09OTFkgJiAweDFmKSkgfAotCUJJVChPUChSRE1BX1dSSVRFX09OTFlfV0lUSF9JTU1FRElBVEUgJiAweDFmKSk7CisjZGVmaW5lIE9QKHgpIFVDX09QKHgpCiAKIC8qKgogICogaGZpMV9tYWtlX3VjX3JlcSAtIGNvbnN0cnVjdCBhIHJlcXVlc3QgcGFja2V0IChTRU5ELCBSRE1BIHdyaXRlKQpAQCAtNzAsNyArNjMsNyBAQAogaW50IGhmaTFfbWFrZV91Y19yZXEoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBoZmkxX3BrdF9zdGF0ZSAqcHMpCiB7CiAJc3RydWN0IGhmaTFfcXBfcHJpdiAqcHJpdiA9IHFwLT5wcml2OwotCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJc3RydWN0IHJ2dF9zd3FlICp3cWU7CiAJdTMyIGh3b3JkcyA9IDU7CiAJdTMyIGJ0aDAgPSAwOwpAQCAtMzA0LDEyICsyOTcsMTIgQEAKIHZvaWQgaGZpMV91Y19yY3Yoc3RydWN0IGhmaTFfcGFja2V0ICpwYWNrZXQpCiB7CiAJc3RydWN0IGhmaTFfaWJwb3J0ICppYnAgPSAmcGFja2V0LT5yY2QtPnBwZC0+aWJwb3J0X2RhdGE7Ci0Jc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIgPSBwYWNrZXQtPmhkcjsKKwlzdHJ1Y3QgaWJfaGVhZGVyICpoZHIgPSBwYWNrZXQtPmhkcjsKIAl1MzIgcmN2X2ZsYWdzID0gcGFja2V0LT5yY3ZfZmxhZ3M7CiAJdm9pZCAqZGF0YSA9IHBhY2tldC0+ZWJ1ZjsKIAl1MzIgdGxlbiA9IHBhY2tldC0+dGxlbjsKIAlzdHJ1Y3QgcnZ0X3FwICpxcCA9IHBhY2tldC0+cXA7Ci0Jc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkciA9IHBhY2tldC0+b2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciA9IHBhY2tldC0+b2hkcjsKIAl1MzIgYnRoMCwgb3Bjb2RlOwogCXUzMiBoZHJzaXplID0gcGFja2V0LT5obGVuOwogCXUzMiBwc247CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS91ZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdWQuYwppbmRleCBmMDFlOGUxLi45N2FlMjRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS91ZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3VkLmMKQEAgLTI3MSw3ICsyNzEsNyBAQAogaW50IGhmaTFfbWFrZV91ZF9yZXEoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBoZmkxX3BrdF9zdGF0ZSAqcHMpCiB7CiAJc3RydWN0IGhmaTFfcXBfcHJpdiAqcHJpdiA9IHFwLT5wcml2OwotCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJc3RydWN0IGliX2FoX2F0dHIgKmFoX2F0dHI7CiAJc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQ7CiAJc3RydWN0IGhmaTFfaWJwb3J0ICppYnA7CkBAIC01MTAsOCArNTEwLDggQEAKIAl1MzIgYnRoMCwgcGxlbiwgdmwsIGh3b3JkcyA9IDU7CiAJdTE2IGxyaDA7CiAJdTggc2wgPSBpYnAtPnNjX3RvX3NsW3NjNV07Ci0Jc3RydWN0IGhmaTFfaWJfaGVhZGVyIGhkcjsKLQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9oZWFkZXIgaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXN0cnVjdCBwaW9fYnVmICpwYnVmOwogCXN0cnVjdCBzZW5kX2NvbnRleHQgKmN0eHQgPSBxcF90b19zZW5kX2NvbnRleHQocXAsIHNjNSk7CiAJc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQgPSBwcGRfZnJvbV9pYnAoaWJwKTsKQEAgLTU1OSw4ICs1NTksOCBAQAogCiAvKgogICogb3BhX3NtcF9jaGVjaygpIC0gRG8gdGhlIHJlZ3VsYXIgcGtleSBjaGVja2luZywgYW5kIHRoZSBhZGRpdGlvbmFsCi0gKiBjaGVja3MgZm9yIFNNUHMgc3BlY2lmaWVkIGluIE9QQXYxIHJldiAwLjkwLCBzZWN0aW9uIDkuMTAuMjYKLSAqICgiU01BIFBhY2tldCBDaGVja3MiKS4KKyAqIGNoZWNrcyBmb3IgU01QcyBzcGVjaWZpZWQgaW4gT1BBdjEgcmV2IDEuMCwgOS8xOS8yMDE2IHVwZGF0ZSwgc2VjdGlvbgorICogOS4xMC4yNSAoIlNNQSBQYWNrZXQgQ2hlY2tzIikuCiAgKgogICogTm90ZSB0aGF0OgogICogICAtIENoZWNrcyBhcmUgZG9uZSB1c2luZyB0aGUgcGtleSBkaXJlY3RseSBmcm9tIHRoZSBwYWNrZXQncyBCVEgsCkBAIC02MDMsMjMgKzYwMywyOCBAQAogCiAJLyoKIAkgKiBTTVBzIGZhbGwgaW50byBvbmUgb2YgZm91ciAoZGlzam9pbnQpIGNhdGVnb3JpZXM6Ci0JICogU01BIHJlcXVlc3QsIFNNQSByZXNwb25zZSwgdHJhcCwgb3IgdHJhcCByZXByZXNzLgotCSAqIE91ciByZXNwb25zZSBkZXBlbmRzLCBpbiBwYXJ0LCBvbiB3aGljaCB0eXBlIG9mCi0JICogU01QIHdlJ3JlIHByb2Nlc3NpbmcuCisJICogU01BIHJlcXVlc3QsIFNNQSByZXNwb25zZSwgU01BIHRyYXAsIG9yIFNNQSB0cmFwIHJlcHJlc3MuCisJICogT3VyIHJlc3BvbnNlIGRlcGVuZHMsIGluIHBhcnQsIG9uIHdoaWNoIHR5cGUgb2YgU01QIHdlJ3JlCisJICogcHJvY2Vzc2luZy4KIAkgKgotCSAqIElmIHRoaXMgaXMgbm90IGFuIFNNQSByZXF1ZXN0LCBvciB0cmFwIHJlcHJlc3M6Ci0JICogICAtIGFjY2VwdCBNQUQgaWYgdGhlIHBvcnQgaXMgcnVubmluZyBhbiBTTQotCSAqICAgLSBwa2V5ID09IEZVTExfTUdNVF9QX0tFWSA9PgotCSAqICAgICAgIHJlcGx5IHdpdGggdW5zdXBwb3J0ZWQgbWV0aG9kIChpLmUuLCBqdXN0IG1hcmsKLQkgKiAgICAgICB0aGUgc21wJ3Mgc3RhdHVzIGZpZWxkIGhlcmUsIGFuZCBsZXQgaXQgYmUKLQkgKiAgICAgICBwcm9jZXNzZWQgbm9ybWFsbHkpCi0JICogICAtIHBrZXkgIT0gTElNX01HTVRfUF9LRVkgPT4KLQkgKiAgICAgICBpbmNyZW1lbnQgcG9ydCByZWN2IGNvbnN0cmFpbnQgZXJyb3JzLCBkcm9wIE1BRAotCSAqIElmIHRoaXMgaXMgYW4gU01BIHJlcXVlc3Qgb3IgdHJhcCByZXByZXNzOgorCSAqIElmIHRoaXMgaXMgYW4gU01BIHJlc3BvbnNlLCBza2lwIHRoZSBjaGVjayBoZXJlLgorCSAqCisJICogSWYgdGhpcyBpcyBhbiBTTUEgcmVxdWVzdCBvciBTTUEgdHJhcCByZXByZXNzOgogCSAqICAgLSBwa2V5ICE9IEZVTExfTUdNVF9QX0tFWSA9PgogCSAqICAgICAgIGluY3JlbWVudCBwb3J0IHJlY3YgY29uc3RyYWludCBlcnJvcnMsIGRyb3AgTUFECisJICoKKwkgKiBPdGhlcndpc2U6CisJICogICAgLSBhY2NlcHQgaWYgdGhlIHBvcnQgaXMgcnVubmluZyBhbiBTTQorCSAqICAgIC0gZHJvcCBNQUQgaWYgaXQncyBhbiBTTUEgdHJhcAorCSAqICAgIC0gcGtleSA9PSBGVUxMX01HTVRfUF9LRVkgPT4KKwkgKiAgICAgICAgcmVwbHkgd2l0aCB1bnN1cHBvcnRlZCBtZXRob2QKKwkgKiAgICAtIHBrZXkgIT0gRlVMTF9NR01UX1BfS0VZID0+CisJICoJICBpbmNyZW1lbnQgcG9ydCByZWN2IGNvbnN0cmFpbnQgZXJyb3JzLCBkcm9wIE1BRAogCSAqLwogCXN3aXRjaCAoc21wLT5tZXRob2QpIHsKKwljYXNlIElCX01HTVRfTUVUSE9EX0dFVF9SRVNQOgorCWNhc2UgSUJfTUdNVF9NRVRIT0RfUkVQT1JUX1JFU1A6CisJCWJyZWFrOwogCWNhc2UgSUJfTUdNVF9NRVRIT0RfR0VUOgogCWNhc2UgSUJfTUdNVF9NRVRIT0RfU0VUOgogCWNhc2UgSUJfTUdNVF9NRVRIT0RfUkVQT1JUOgpAQCAtNjI5LDIzICs2MzQsMTcgQEAKIAkJCXJldHVybiAxOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgSUJfTUdNVF9NRVRIT0RfU0VORDoKLQljYXNlIElCX01HTVRfTUVUSE9EX1RSQVA6Ci0JY2FzZSBJQl9NR01UX01FVEhPRF9HRVRfUkVTUDoKLQljYXNlIElCX01HTVRfTUVUSE9EX1JFUE9SVF9SRVNQOgorCWRlZmF1bHQ6CiAJCWlmIChpYnAtPnJ2cC5wb3J0X2NhcF9mbGFncyAmIElCX1BPUlRfU00pCiAJCQlyZXR1cm4gMDsKKwkJaWYgKHNtcC0+bWV0aG9kID09IElCX01HTVRfTUVUSE9EX1RSQVApCisJCQlyZXR1cm4gMTsKIAkJaWYgKHBrZXkgPT0gRlVMTF9NR01UX1BfS0VZKSB7CiAJCQlzbXAtPnN0YXR1cyB8PSBJQl9TTVBfVU5TVVBfTUVUSE9EOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJaWYgKHBrZXkgIT0gTElNX01HTVRfUF9LRVkpIHsKLQkJCWluZ3Jlc3NfcGtleV90YWJsZV9mYWlsKHBwZCwgcGtleSwgc2xpZCk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKKwkJaW5ncmVzc19wa2V5X3RhYmxlX2ZhaWwocHBkLCBwa2V5LCBzbGlkKTsKKwkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNjY1LDcgKzY2NCw3IEBACiAgKi8KIHZvaWQgaGZpMV91ZF9yY3Yoc3RydWN0IGhmaTFfcGFja2V0ICpwYWNrZXQpCiB7Ci0Jc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkciA9IHBhY2tldC0+b2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciA9IHBhY2tldC0+b2hkcjsKIAlpbnQgb3Bjb2RlOwogCXUzMiBoZHJzaXplID0gcGFja2V0LT5obGVuOwogCXN0cnVjdCBpYl93YyB3YzsKQEAgLTY3NSwxMyArNjc0LDEzIEBACiAJaW50IG1nbXRfcGtleV9pZHggPSAtMTsKIAlzdHJ1Y3QgaGZpMV9pYnBvcnQgKmlicCA9ICZwYWNrZXQtPnJjZC0+cHBkLT5pYnBvcnRfZGF0YTsKIAlzdHJ1Y3QgaGZpMV9wcG9ydGRhdGEgKnBwZCA9IHBwZF9mcm9tX2licChpYnApOwotCXN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyID0gcGFja2V0LT5oZHI7CisJc3RydWN0IGliX2hlYWRlciAqaGRyID0gcGFja2V0LT5oZHI7CiAJdTMyIHJjdl9mbGFncyA9IHBhY2tldC0+cmN2X2ZsYWdzOwogCXZvaWQgKmRhdGEgPSBwYWNrZXQtPmVidWY7CiAJdTMyIHRsZW4gPSBwYWNrZXQtPnRsZW47CiAJc3RydWN0IHJ2dF9xcCAqcXAgPSBwYWNrZXQtPnFwOwogCWJvb2wgaGFzX2dyaCA9IHJjdl9mbGFncyAmIEhGSTFfSEFTX0dSSDsKLQl1OCBzYzUgPSBoZHIyc2MoKHN0cnVjdCBoZmkxX21lc3NhZ2VfaGVhZGVyICopaGRyLCBwYWNrZXQtPnJoZik7CisJdTggc2M1ID0gaGRyMnNjKGhkciwgcGFja2V0LT5yaGYpOwogCXUzMiBidGgxOwogCXU4IHNsX2Zyb21fc2MsIHNsOwogCXUxNiBzbGlkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdXNlcl9zZG1hLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS91c2VyX3NkbWEuYwppbmRleCAwZWNmMjc5Li5hNzYxZjgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS91c2VyX3NkbWEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS91c2VyX3NkbWEuYwpAQCAtMTE0LDYgKzExNCw4IEBACiAjZGVmaW5lIEtERVRIX0hDUkNfTE9XRVJfU0hJRlQgICAgMjQKICNkZWZpbmUgS0RFVEhfSENSQ19MT1dFUl9NQVNLICAgICAweGZmCiAKKyNkZWZpbmUgQUhHX0tERVRIX0lOVFJfU0hJRlQgMTIKKwogI2RlZmluZSBQQkMyTFJIKHgpICgoKCh4KSAmIDB4ZmZmKSA8PCAyKSAtIDQpCiAjZGVmaW5lIExSSDJQQkMoeCkgKCgoKHgpID4+IDIpICsgMSkgJiAweGZmZikKIApAQCAtNTQ2LDcgKzU0OCw3IEBACiAJdTggb3Bjb2RlLCBzYywgdmw7CiAJaW50IHJlcV9xdWV1ZWQgPSAwOwogCXUxNiBkbGlkOwotCXU4IHNlbGVjdG9yOworCXUzMiBzZWxlY3RvcjsKIAogCWlmIChpb3ZlY1tpZHhdLmlvdl9sZW4gPCBzaXplb2YoaW5mbykgKyBzaXplb2YocmVxLT5oZHIpKSB7CiAJCWhmaTFfY2RiZygKQEAgLTc1MSwxMiArNzUzLDkgQEAKIAogCWRsaWQgPSBiZTE2X3RvX2NwdShyZXEtPmhkci5scmhbMV0pOwogCXNlbGVjdG9yID0gZGxpZF90b19zZWxlY3RvcihkbGlkKTsKKwlzZWxlY3RvciArPSB1Y3R4dC0+Y3R4dCArIGZkLT5zdWJjdHh0OworCXJlcS0+c2RlID0gc2RtYV9zZWxlY3RfdXNlcl9lbmdpbmUoZGQsIHNlbGVjdG9yLCB2bCk7CiAKLQkvKiBIYXZlIHRvIHNlbGVjdCB0aGUgZW5naW5lICovCi0JcmVxLT5zZGUgPSBzZG1hX3NlbGVjdF9lbmdpbmVfdmwoZGQsCi0JCQkJCSAodTMyKSh1Y3R4dC0+Y3R4dCArIGZkLT5zdWJjdHh0ICsKLQkJCQkJICAgICAgIHNlbGVjdG9yKSwKLQkJCQkJIHZsKTsKIAlpZiAoIXJlcS0+c2RlIHx8ICFzZG1hX3J1bm5pbmcocmVxLT5zZGUpKSB7CiAJCXJldCA9IC1FQ09NTTsKIAkJZ290byBmcmVlX3JlcTsKQEAgLTg5Miw3ICs4OTEsNyBAQAogCiBzdGF0aWMgaW50IHVzZXJfc2RtYV9zZW5kX3BrdHMoc3RydWN0IHVzZXJfc2RtYV9yZXF1ZXN0ICpyZXEsIHVuc2lnbmVkIG1heHBrdHMpCiB7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldCA9IDAsIGNvdW50OwogCXVuc2lnbmVkIG5wa3RzID0gMDsKIAlzdHJ1Y3QgdXNlcl9zZG1hX3R4cmVxICp0eCA9IE5VTEw7CiAJc3RydWN0IGhmaTFfdXNlcl9zZG1hX3BrdF9xICpwcSA9IE5VTEw7CkBAIC0xMDg4LDIzICsxMDg3LDE4IEBACiAJCW5wa3RzKys7CiAJfQogZG9zZW5kOgotCXJldCA9IHNkbWFfc2VuZF90eGxpc3QocmVxLT5zZGUsICZwcS0+YnVzeSwgJnJlcS0+dHhwcyk7Ci0JaWYgKGxpc3RfZW1wdHkoJnJlcS0+dHhwcykpIHsKLQkJcmVxLT5zZXFzdWJtaXR0ZWQgPSByZXEtPnNlcW51bTsKLQkJaWYgKHJlcS0+c2VxbnVtID09IHJlcS0+aW5mby5ucGt0cykgewotCQkJc2V0X2JpdChTRE1BX1JFUV9TRU5EX0RPTkUsICZyZXEtPmZsYWdzKTsKLQkJCS8qCi0JCQkgKiBUaGUgdHhyZXEgaGFzIGFscmVhZHkgYmVlbiBzdWJtaXR0ZWQgdG8gdGhlIEhXIHF1ZXVlCi0JCQkgKiBzbyB3ZSBjYW4gZnJlZSB0aGUgQUhHIGVudHJ5IG5vdy4gQ29ycnVwdGlvbiB3aWxsIG5vdAotCQkJICogaGFwcGVuIGR1ZSB0byB0aGUgc2VxdWVudGlhbCBtYW5uZXIgaW4gd2hpY2gKLQkJCSAqIGRlc2NyaXB0b3JzIGFyZSBwcm9jZXNzZWQuCi0JCQkgKi8KLQkJCWlmICh0ZXN0X2JpdChTRE1BX1JFUV9IQVZFX0FIRywgJnJlcS0+ZmxhZ3MpKQotCQkJCXNkbWFfYWhnX2ZyZWUocmVxLT5zZGUsIHJlcS0+YWhnX2lkeCk7Ci0JCX0KLQl9IGVsc2UgaWYgKHJldCA+IDApIHsKLQkJcmVxLT5zZXFzdWJtaXR0ZWQgKz0gcmV0OwotCQlyZXQgPSAwOworCXJldCA9IHNkbWFfc2VuZF90eGxpc3QocmVxLT5zZGUsICZwcS0+YnVzeSwgJnJlcS0+dHhwcywgJmNvdW50KTsKKwlyZXEtPnNlcXN1Ym1pdHRlZCArPSBjb3VudDsKKwlpZiAocmVxLT5zZXFzdWJtaXR0ZWQgPT0gcmVxLT5pbmZvLm5wa3RzKSB7CisJCXNldF9iaXQoU0RNQV9SRVFfU0VORF9ET05FLCAmcmVxLT5mbGFncyk7CisJCS8qCisJCSAqIFRoZSB0eHJlcSBoYXMgYWxyZWFkeSBiZWVuIHN1Ym1pdHRlZCB0byB0aGUgSFcgcXVldWUKKwkJICogc28gd2UgY2FuIGZyZWUgdGhlIEFIRyBlbnRyeSBub3cuIENvcnJ1cHRpb24gd2lsbCBub3QKKwkJICogaGFwcGVuIGR1ZSB0byB0aGUgc2VxdWVudGlhbCBtYW5uZXIgaW4gd2hpY2gKKwkJICogZGVzY3JpcHRvcnMgYXJlIHByb2Nlc3NlZC4KKwkJICovCisJCWlmICh0ZXN0X2JpdChTRE1BX1JFUV9IQVZFX0FIRywgJnJlcS0+ZmxhZ3MpKQorCQkJc2RtYV9haGdfZnJlZShyZXEtPnNkZSwgcmVxLT5haGdfaWR4KTsKIAl9CiAJcmV0dXJuIHJldDsKIApAQCAtMTQ4MCw3ICsxNDc0LDggQEAKIAkJLyogQ2xlYXIgS0RFVEguU0ggb24gbGFzdCBwYWNrZXQgKi8KIAkJaWYgKHVubGlrZWx5KHR4LT5mbGFncyAmIFRYUkVRX0ZMQUdTX1JFUV9MQVNUX1BLVCkpIHsKIAkJCXZhbCB8PSBjcHVfdG9fbGUxNihLREVUSF9HRVQoaGRyLT5rZGV0aC52ZXJfdGlkX29mZnNldCwKLQkJCQkJCQkJSU5UUikgPj4gMTYpOworCQkJCQkJICAgICBJTlRSKSA8PAorCQkJCQkgICBBSEdfS0RFVEhfSU5UUl9TSElGVCk7CiAJCQl2YWwgJj0gY3B1X3RvX2xlMTYofigxVSA8PCAxMykpOwogCQkJQUhHX0hFQURFUl9TRVQocmVxLT5haGcsIGRpZmYsIDcsIDE2LCAxNCwgdmFsKTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3ZlcmJzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS92ZXJicy5jCmluZGV4IDJiMzU5NTQuLmYyZjZiNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3ZlcmJzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdmVyYnMuYwpAQCAtNzYsNyArNzYsNyBAQAogbW9kdWxlX3BhcmFtX25hbWVkKG1heF9haHMsIGhmaTFfbWF4X2FocywgdWludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKG1heF9haHMsICJNYXhpbXVtIG51bWJlciBvZiBhZGRyZXNzIGhhbmRsZXMgdG8gc3VwcG9ydCIpOwogCi11bnNpZ25lZCBpbnQgaGZpMV9tYXhfY3FlcyA9IDB4MkZGRkY7Cit1bnNpZ25lZCBpbnQgaGZpMV9tYXhfY3FlcyA9IDB4MkZGRkZGOwogbW9kdWxlX3BhcmFtX25hbWVkKG1heF9jcWVzLCBoZmkxX21heF9jcWVzLCB1aW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MobWF4X2NxZXMsCiAJCSAiTWF4aW11bSBudW1iZXIgb2YgY29tcGxldGlvbiBxdWV1ZSBlbnRyaWVzIHRvIHN1cHBvcnQiKTsKQEAgLTg5LDcgKzg5LDcgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChtYXhfcXBfd3JzLCBoZmkxX21heF9xcF93cnMsIHVpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhtYXhfcXBfd3JzLCAiTWF4aW11bSBudW1iZXIgb2YgUVAgV1JzIHRvIHN1cHBvcnQiKTsKIAotdW5zaWduZWQgaW50IGhmaTFfbWF4X3FwcyA9IDE2Mzg0OwordW5zaWduZWQgaW50IGhmaTFfbWF4X3FwcyA9IDMyNzY4OwogbW9kdWxlX3BhcmFtX25hbWVkKG1heF9xcHMsIGhmaTFfbWF4X3FwcywgdWludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKG1heF9xcHMsICJNYXhpbXVtIG51bWJlciBvZiBRUHMgdG8gc3VwcG9ydCIpOwogCkBAIC0zMzUsNyArMzM1LDcgQEAKIAlbSUJfT1BDT0RFX1JDX1JETUFfUkVBRF9SRVNQT05TRV9MQVNUXSAgICAgICAgPSAxMiArIDggKyA0LAogCVtJQl9PUENPREVfUkNfUkRNQV9SRUFEX1JFU1BPTlNFX09OTFldICAgICAgICA9IDEyICsgOCArIDQsCiAJW0lCX09QQ09ERV9SQ19BQ0tOT1dMRURHRV0gICAgICAgICAgICAgICAgICAgID0gMTIgKyA4ICsgNCwKLQlbSUJfT1BDT0RFX1JDX0FUT01JQ19BQ0tOT1dMRURHRV0gICAgICAgICAgICAgPSAxMiArIDggKyA0LAorCVtJQl9PUENPREVfUkNfQVRPTUlDX0FDS05PV0xFREdFXSAgICAgICAgICAgICA9IDEyICsgOCArIDQgKyA4LAogCVtJQl9PUENPREVfUkNfQ09NUEFSRV9TV0FQXSAgICAgICAgICAgICAgICAgICA9IDEyICsgOCArIDI4LAogCVtJQl9PUENPREVfUkNfRkVUQ0hfQUREXSAgICAgICAgICAgICAgICAgICAgICA9IDEyICsgOCArIDI4LAogCVtJQl9PUENPREVfUkNfU0VORF9MQVNUX1dJVEhfSU5WQUxJREFURV0gICAgICA9IDEyICsgOCArIDQsCkBAIC00MDMsNiArNDAzLDI4IEBACiAJW0lCX09QQ09ERV9DTlBdCQkJCSAgICAgID0gJmhmaTFfY25wX3JjdgogfTsKIAorI2RlZmluZSBPUE1BU0sgMHgxZgorCitzdGF0aWMgY29uc3QgdTMyIHBpb19vcG1hc2tbQklUKDMpXSA9IHsKKwkvKiBSQyAqLworCVtJQl9PUENPREVfUkMgPj4gNV0gPQorCQlCSVQoUkNfT1AoU0VORF9PTkxZKSAmIE9QTUFTSykgfAorCQlCSVQoUkNfT1AoU0VORF9PTkxZX1dJVEhfSU1NRURJQVRFKSAmIE9QTUFTSykgfAorCQlCSVQoUkNfT1AoUkRNQV9XUklURV9PTkxZKSAmIE9QTUFTSykgfAorCQlCSVQoUkNfT1AoUkRNQV9XUklURV9PTkxZX1dJVEhfSU1NRURJQVRFKSAmIE9QTUFTSykgfAorCQlCSVQoUkNfT1AoUkRNQV9SRUFEX1JFUVVFU1QpICYgT1BNQVNLKSB8CisJCUJJVChSQ19PUChBQ0tOT1dMRURHRSkgJiBPUE1BU0spIHwKKwkJQklUKFJDX09QKEFUT01JQ19BQ0tOT1dMRURHRSkgJiBPUE1BU0spIHwKKwkJQklUKFJDX09QKENPTVBBUkVfU1dBUCkgJiBPUE1BU0spIHwKKwkJQklUKFJDX09QKEZFVENIX0FERCkgJiBPUE1BU0spLAorCS8qIFVDICovCisJW0lCX09QQ09ERV9VQyA+PiA1XSA9CisJCUJJVChVQ19PUChTRU5EX09OTFkpICYgT1BNQVNLKSB8CisJCUJJVChVQ19PUChTRU5EX09OTFlfV0lUSF9JTU1FRElBVEUpICYgT1BNQVNLKSB8CisJCUJJVChVQ19PUChSRE1BX1dSSVRFX09OTFkpICYgT1BNQVNLKSB8CisJCUJJVChVQ19PUChSRE1BX1dSSVRFX09OTFlfV0lUSF9JTU1FRElBVEUpICYgT1BNQVNLKSwKK307CisKIC8qCiAgKiBTeXN0ZW0gaW1hZ2UgR1VJRC4KICAqLwpAQCAtNTY3LDcgKzU4OSw3IEBACiB2b2lkIGhmaTFfaWJfcmN2KHN0cnVjdCBoZmkxX3BhY2tldCAqcGFja2V0KQogewogCXN0cnVjdCBoZmkxX2N0eHRkYXRhICpyY2QgPSBwYWNrZXQtPnJjZDsKLQlzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkciA9IHBhY2tldC0+aGRyOworCXN0cnVjdCBpYl9oZWFkZXIgKmhkciA9IHBhY2tldC0+aGRyOwogCXUzMiB0bGVuID0gcGFja2V0LT50bGVuOwogCXN0cnVjdCBoZmkxX3Bwb3J0ZGF0YSAqcHBkID0gcmNkLT5wcGQ7CiAJc3RydWN0IGhmaTFfaWJwb3J0ICppYnAgPSAmcHBkLT5pYnBvcnRfZGF0YTsKQEAgLTcxOSw3ICs3NDEsNyBAQAogCWlmICh0eC0+d3FlKSB7CiAJCWhmaTFfc2VuZF9jb21wbGV0ZShxcCwgdHgtPndxZSwgSUJfV0NfU1VDQ0VTUyk7CiAJfSBlbHNlIGlmIChxcC0+aWJxcC5xcF90eXBlID09IElCX1FQVF9SQykgewotCQlzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkcjsKKwkJc3RydWN0IGliX2hlYWRlciAqaGRyOwogCiAJCWhkciA9ICZ0eC0+cGhkci5oZHI7CiAJCWhmaTFfcmNfc2VuZF9jb21wbGV0ZShxcCwgaGRyKTsKQEAgLTc0OCw3ICs3NzAsNyBAQAogCQkJcXAtPnNfZmxhZ3MgfD0gUlZUX1NfV0FJVF9LTUVNOwogCQkJbGlzdF9hZGRfdGFpbCgmcHJpdi0+c19pb3dhaXQubGlzdCwgJmRldi0+bWVtd2FpdCk7CiAJCQl0cmFjZV9oZmkxX3Fwc2xlZXAocXAsIFJWVF9TX1dBSVRfS01FTSk7Ci0JCQlhdG9taWNfaW5jKCZxcC0+cmVmY291bnQpOworCQkJcnZ0X2dldF9xcChxcCk7CiAJCX0KIAkJd3JpdGVfc2VxdW5sb2NrKCZkZXYtPmlvd2FpdF9sb2NrKTsKIAkJcXAtPnNfZmxhZ3MgJj0gflJWVF9TX0JVU1k7CkBAIC05NTksNyArOTgxLDcgQEAKIAkJCXdhc19lbXB0eSA9IGxpc3RfZW1wdHkoJnNjLT5waW93YWl0KTsKIAkJCWxpc3RfYWRkX3RhaWwoJnByaXYtPnNfaW93YWl0Lmxpc3QsICZzYy0+cGlvd2FpdCk7CiAJCQl0cmFjZV9oZmkxX3Fwc2xlZXAocXAsIFJWVF9TX1dBSVRfUElPKTsKLQkJCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCQlydnRfZ2V0X3FwKHFwKTsKIAkJCS8qIGNvdW50aW5nOiBvbmx5IGNhbGwgd2FudHBpb2J1Zl9pbnRyIGlmIGZpcnN0IHVzZXIgKi8KIAkJCWlmICh3YXNfZW1wdHkpCiAJCQkJaGZpMV9zY193YW50cGlvYnVmX2ludHIoc2MsIDEpOwpAQCAtMTIwMCw3ICsxMjIyLDcgQEAKIHsKIAlzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCA9IGRkX2Zyb21faWJkZXYocXAtPmlicXAuZGV2aWNlKTsKIAlzdHJ1Y3QgaGZpMV9xcF9wcml2ICpwcml2ID0gcXAtPnByaXY7Ci0Jc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoID0gJnR4LT5waGRyLmhkcjsKKwlzdHJ1Y3QgaWJfaGVhZGVyICpoID0gJnR4LT5waGRyLmhkcjsKIAogCWlmICh1bmxpa2VseSghKGRkLT5mbGFncyAmIEhGSTFfSEFTX1NFTkRfRE1BKSkpCiAJCXJldHVybiBkZC0+cHJvY2Vzc19waW9fc2VuZDsKQEAgLTEyMTAsMjIgKzEyMzIsMTggQEAKIAljYXNlIElCX1FQVF9HU0k6CiAJY2FzZSBJQl9RUFRfVUQ6CiAJCWJyZWFrOwotCWNhc2UgSUJfUVBUX1JDOgotCQlpZiAocGlvdGhyZXNob2xkICYmCi0JCSAgICBxcC0+c19jdXJfc2l6ZSA8PSBtaW4ocGlvdGhyZXNob2xkLCBxcC0+cG10dSkgJiYKLQkJICAgIChCSVQoZ2V0X29wY29kZShoKSAmIDB4MWYpICYgcmNfb25seV9vcGNvZGUpICYmCi0JCSAgICBpb3dhaXRfc2RtYV9wZW5kaW5nKCZwcml2LT5zX2lvd2FpdCkgPT0gMCAmJgotCQkgICAgIXNkbWFfdHhyZXFfYnVpbHQoJnR4LT50eHJlcSkpCi0JCQlyZXR1cm4gZGQtPnByb2Nlc3NfcGlvX3NlbmQ7Ci0JCWJyZWFrOwogCWNhc2UgSUJfUVBUX1VDOgorCWNhc2UgSUJfUVBUX1JDOiB7CisJCXU4IG9wID0gZ2V0X29wY29kZShoKTsKKwogCQlpZiAocGlvdGhyZXNob2xkICYmCiAJCSAgICBxcC0+c19jdXJfc2l6ZSA8PSBtaW4ocGlvdGhyZXNob2xkLCBxcC0+cG10dSkgJiYKLQkJICAgIChCSVQoZ2V0X29wY29kZShoKSAmIDB4MWYpICYgdWNfb25seV9vcGNvZGUpICYmCisJCSAgICAoQklUKG9wICYgT1BNQVNLKSAmIHBpb19vcG1hc2tbb3AgPj4gNV0pICYmCiAJCSAgICBpb3dhaXRfc2RtYV9wZW5kaW5nKCZwcml2LT5zX2lvd2FpdCkgPT0gMCAmJgogCQkgICAgIXNkbWFfdHhyZXFfYnVpbHQoJnR4LT50eHJlcSkpCiAJCQlyZXR1cm4gZGQtPnByb2Nlc3NfcGlvX3NlbmQ7CiAJCWJyZWFrOworCX0KIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC0xMjQ0LDggKzEyNjIsOCBAQAogewogCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkID0gZGRfZnJvbV9pYmRldihxcC0+aWJxcC5kZXZpY2UpOwogCXN0cnVjdCBoZmkxX3FwX3ByaXYgKnByaXYgPSBxcC0+cHJpdjsKLQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyOwotCXN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9oZWFkZXIgKmhkcjsKIAlzZW5kX3JvdXRpbmUgc3I7CiAJaW50IHJldDsKIAl1OCBsbmg7CkBAIC0xNzU0LDcgKzE3NzIsNyBAQAogewogCXN0cnVjdCBoZmkxX2licG9ydCAqaWJwID0gJnBhY2tldC0+cmNkLT5wcGQtPmlicG9ydF9kYXRhOwogCXN0cnVjdCBoZmkxX3Bwb3J0ZGF0YSAqcHBkID0gcHBkX2Zyb21faWJwKGlicCk7Ci0Jc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIgPSBwYWNrZXQtPmhkcjsKKwlzdHJ1Y3QgaWJfaGVhZGVyICpoZHIgPSBwYWNrZXQtPmhkcjsKIAlzdHJ1Y3QgcnZ0X3FwICpxcCA9IHBhY2tldC0+cXA7CiAJdTMyIGxxcG4sIHJxcG4gPSAwOwogCXUxNiBybGlkID0gMDsKQEAgLTE3ODEsNyArMTc5OSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlzYzUgPSBoZHIyc2MoKHN0cnVjdCBoZmkxX21lc3NhZ2VfaGVhZGVyICopaGRyLCBwYWNrZXQtPnJoZik7CisJc2M1ID0gaGRyMnNjKGhkciwgcGFja2V0LT5yaGYpOwogCXNsID0gaWJwLT5zY190b19zbFtzYzVdOwogCWxxcG4gPSBxcC0+aWJxcC5xcF9udW07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3ZlcmJzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS92ZXJicy5oCmluZGV4IGQxYjEwMWMuLjFjMzgxNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3ZlcmJzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdmVyYnMuaApAQCAtNjAsNiArNjAsNyBAQAogI2luY2x1ZGUgPHJkbWEvaWJfcGFjay5oPgogI2luY2x1ZGUgPHJkbWEvaWJfdXNlcl92ZXJicy5oPgogI2luY2x1ZGUgPHJkbWEvaWJfbWFkLmg+CisjaW5jbHVkZSA8cmRtYS9pYl9oZHJzLmg+CiAjaW5jbHVkZSA8cmRtYS9yZG1hX3Z0Lmg+CiAjaW5jbHVkZSA8cmRtYS9yZG1hdnRfcXAuaD4KICNpbmNsdWRlIDxyZG1hL3JkbWF2dF9jcS5oPgpAQCAtODAsMTYgKzgxLDYgQEAKICAqLwogI2RlZmluZSBIRkkxX1VWRVJCU19BQklfVkVSU0lPTiAgICAgICAyCiAKLSNkZWZpbmUgSUJfU0VRX05BSwkoMyA8PCAyOSkKLQotLyogQUVUSCBOQUsgb3Bjb2RlIHZhbHVlcyAqLwotI2RlZmluZSBJQl9STlJfTkFLICAgICAgICAgICAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgSUJfTkFLX1BTTl9FUlJPUiAgICAgICAgICAgICAgICAweDYwCi0jZGVmaW5lIElCX05BS19JTlZBTElEX1JFUVVFU1QgICAgICAgICAgMHg2MQotI2RlZmluZSBJQl9OQUtfUkVNT1RFX0FDQ0VTU19FUlJPUiAgICAgIDB4NjIKLSNkZWZpbmUgSUJfTkFLX1JFTU9URV9PUEVSQVRJT05BTF9FUlJPUiAweDYzCi0jZGVmaW5lIElCX05BS19JTlZBTElEX1JEX1JFUVVFU1QgICAgICAgMHg2NAotCiAvKiBJQiBQZXJmb3JtYW5jZSBNYW5hZ2VyIHN0YXR1cyB2YWx1ZXMgKi8KICNkZWZpbmUgSUJfUE1BX1NBTVBMRV9TVEFUVVNfRE9ORSAgICAgICAweDAwCiAjZGVmaW5lIElCX1BNQV9TQU1QTEVfU1RBVFVTX1NUQVJURUQgICAgMHgwMQpAQCAtMTA0LDgwICs5NSwxNiBAQAogCiAjZGVmaW5lIEhGSTFfVkVORE9SX0lQRwkJY3B1X3RvX2JlMTYoMHhGRkEwKQogCi0jZGVmaW5lIElCX0JUSF9SRVFfQUNLCQlCSVQoMzEpCi0jZGVmaW5lIElCX0JUSF9TT0xJQ0lURUQJQklUKDIzKQotI2RlZmluZSBJQl9CVEhfTUlHX1JFUQkJQklUKDIyKQotCi0jZGVmaW5lIElCX0dSSF9WRVJTSU9OCQk2Ci0jZGVmaW5lIElCX0dSSF9WRVJTSU9OX01BU0sJMHhGCi0jZGVmaW5lIElCX0dSSF9WRVJTSU9OX1NISUZUCTI4Ci0jZGVmaW5lIElCX0dSSF9UQ0xBU1NfTUFTSwkweEZGCi0jZGVmaW5lIElCX0dSSF9UQ0xBU1NfU0hJRlQJMjAKLSNkZWZpbmUgSUJfR1JIX0ZMT1dfTUFTSwkweEZGRkZGCi0jZGVmaW5lIElCX0dSSF9GTE9XX1NISUZUCTAKLSNkZWZpbmUgSUJfR1JIX05FWFRfSERSCQkweDFCCi0KICNkZWZpbmUgSUJfREVGQVVMVF9HSURfUFJFRklYCWNwdV90b19iZTY0KDB4ZmU4MDAwMDAwMDAwMDAwMFVMTCkKIAorI2RlZmluZSBSQ19PUCh4KSBJQl9PUENPREVfUkNfIyN4CisjZGVmaW5lIFVDX09QKHgpIElCX09QQ09ERV9VQ18jI3gKKwogLyogZmxhZ3MgcGFzc2VkIGJ5IGhmaTFfaWJfcmN2KCkgKi8KIGVudW0gewogCUhGSTFfSEFTX0dSSCA9ICgxIDw8IDApLAogfTsKIAotc3RydWN0IGliX3JldGggewotCV9fYmU2NCB2YWRkcjsKLQlfX2JlMzIgcmtleTsKLQlfX2JlMzIgbGVuZ3RoOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGliX2F0b21pY19ldGggewotCV9fYmUzMiB2YWRkclsyXTsgICAgICAgIC8qIHVuYWxpZ25lZCBzbyBhY2Nlc3MgYXMgMiAzMi1iaXQgd29yZHMgKi8KLQlfX2JlMzIgcmtleTsKLQlfX2JlNjQgc3dhcF9kYXRhOwotCV9fYmU2NCBjb21wYXJlX2RhdGE7Ci19IF9fcGFja2VkOwotCi11bmlvbiBpYl9laGRycyB7Ci0Jc3RydWN0IHsKLQkJX19iZTMyIGRldGhbMl07Ci0JCV9fYmUzMiBpbW1fZGF0YTsKLQl9IHVkOwotCXN0cnVjdCB7Ci0JCXN0cnVjdCBpYl9yZXRoIHJldGg7Ci0JCV9fYmUzMiBpbW1fZGF0YTsKLQl9IHJjOwotCXN0cnVjdCB7Ci0JCV9fYmUzMiBhZXRoOwotCQlfX2JlMzIgYXRvbWljX2Fja19ldGhbMl07Ci0JfSBhdDsKLQlfX2JlMzIgaW1tX2RhdGE7Ci0JX19iZTMyIGFldGg7Ci0JX19iZTMyIGlldGg7Ci0Jc3RydWN0IGliX2F0b21pY19ldGggYXRvbWljX2V0aDsKLX0gIF9fcGFja2VkOwotCi1zdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzIHsKLQlfX2JlMzIgYnRoWzNdOwotCXVuaW9uIGliX2VoZHJzIHU7Ci19IF9fcGFja2VkOwotCi0vKgotICogTm90ZSB0aGF0IFVEIHBhY2tldHMgd2l0aCBhIEdSSCBoZWFkZXIgYXJlIDgrNDArMTIrOCA9IDY4IGJ5dGVzCi0gKiBsb25nICg3MiB3LyBpbW1fZGF0YSkuICBPbmx5IHRoZSBmaXJzdCA1NiBieXRlcyBvZiB0aGUgSUIgaGVhZGVyCi0gKiB3aWxsIGJlIGluIHRoZSBlYWdlciBoZWFkZXIgYnVmZmVyLiAgVGhlIHJlbWFpbmluZyAxMiBvciAxNiBieXRlcwotICogYXJlIGluIHRoZSBkYXRhIGJ1ZmZlci4KLSAqLwotc3RydWN0IGhmaTFfaWJfaGVhZGVyIHsKLQlfX2JlMTYgbHJoWzRdOwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCXN0cnVjdCBpYl9ncmggZ3JoOwotCQkJc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyBvdGg7Ci0JCX0gbDsKLQkJc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyBvdGg7Ci0JfSB1OwotfSBfX3BhY2tlZDsKLQogc3RydWN0IGhmaTFfYWhnX2luZm8gewogCXUzMiBhaGdkZXNjWzJdOwogCXUxNiB0eF9mbGFnczsKQEAgLTE4Nyw3ICsxMTQsNyBAQAogCiBzdHJ1Y3QgaGZpMV9zZG1hX2hlYWRlciB7CiAJX19sZTY0IHBiYzsKLQlzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgaGRyOworCXN0cnVjdCBpYl9oZWFkZXIgaGRyOwogfSBfX3BhY2tlZDsKIAogLyoKQEAgLTM4Niw3ICszMTMsNyBAQAogCiB2b2lkIGhmaTFfcmNfaGRyZXJyKAogCXN0cnVjdCBoZmkxX2N0eHRkYXRhICpyY2QsCi0Jc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIsCisJc3RydWN0IGliX2hlYWRlciAqaGRyLAogCXUzMiByY3ZfZmxhZ3MsCiAJc3RydWN0IHJ2dF9xcCAqcXApOwogCkBAIC00MDAsNyArMzI3LDcgQEAKIHZvaWQgaGZpMV9kZWxfdGltZXJzX3N5bmMoc3RydWN0IHJ2dF9xcCAqcXApOwogdm9pZCBoZmkxX3N0b3BfcmNfdGltZXJzKHN0cnVjdCBydnRfcXAgKnFwKTsKIAotdm9pZCBoZmkxX3JjX3NlbmRfY29tcGxldGUoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyKTsKK3ZvaWQgaGZpMV9yY19zZW5kX2NvbXBsZXRlKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIpOwogCiB2b2lkIGhmaTFfcmNfZXJyb3Ioc3RydWN0IHJ2dF9xcCAqcXAsIGVudW0gaWJfd2Nfc3RhdHVzIGVycik7CiAKQEAgLTQyMyw3ICszNTAsNyBAQAogZXh0ZXJuIGNvbnN0IHUzMiByY19vbmx5X29wY29kZTsKIGV4dGVybiBjb25zdCB1MzIgdWNfb25seV9vcGNvZGU7CiAKLXN0YXRpYyBpbmxpbmUgdTggZ2V0X29wY29kZShzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmgpCitzdGF0aWMgaW5saW5lIHU4IGdldF9vcGNvZGUoc3RydWN0IGliX2hlYWRlciAqaCkKIHsKIAl1MTYgbG5oID0gYmUxNl90b19jcHUoaC0+bHJoWzBdKSAmIDM7CiAKQEAgLTQzMywxMyArMzYwLDEzIEBACiAJCXJldHVybiBiZTMyX3RvX2NwdShoLT51Lmwub3RoLmJ0aFswXSkgPj4gMjQ7CiB9CiAKLWludCBoZmkxX3J1Y19jaGVja19oZHIoc3RydWN0IGhmaTFfaWJwb3J0ICppYnAsIHN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyLAoraW50IGhmaTFfcnVjX2NoZWNrX2hkcihzdHJ1Y3QgaGZpMV9pYnBvcnQgKmlicCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQkgICAgICAgaW50IGhhc19ncmgsIHN0cnVjdCBydnRfcXAgKnFwLCB1MzIgYnRoMCk7CiAKIHUzMiBoZmkxX21ha2VfZ3JoKHN0cnVjdCBoZmkxX2licG9ydCAqaWJwLCBzdHJ1Y3QgaWJfZ3JoICpoZHIsCiAJCSAgc3RydWN0IGliX2dsb2JhbF9yb3V0ZSAqZ3JoLCB1MzIgaHdvcmRzLCB1MzIgbndvcmRzKTsKIAotdm9pZCBoZmkxX21ha2VfcnVjX2hlYWRlcihzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkciwKK3ZvaWQgaGZpMV9tYWtlX3J1Y19oZWFkZXIoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyLAogCQkJICB1MzIgYnRoMCwgdTMyIGJ0aDIsIGludCBtaWRkbGUsCiAJCQkgIHN0cnVjdCBoZmkxX3BrdF9zdGF0ZSAqcHMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS92ZXJic190eHJlcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdmVyYnNfdHhyZXEuYwppbmRleCBkOGZiMDU2Li4wOTRhYjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS92ZXJic190eHJlcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3ZlcmJzX3R4cmVxLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogCQkJcXAtPnNfZmxhZ3MgfD0gUlZUX1NfV0FJVF9UWDsKIAkJCWxpc3RfYWRkX3RhaWwoJnByaXYtPnNfaW93YWl0Lmxpc3QsICZkZXYtPnR4d2FpdCk7CiAJCQl0cmFjZV9oZmkxX3Fwc2xlZXAocXAsIFJWVF9TX1dBSVRfVFgpOwotCQkJYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKKwkJCXJ2dF9nZXRfcXAocXApOwogCQl9CiAJCXFwLT5zX2ZsYWdzICY9IH5SVlRfU19CVVNZOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pNDBpdy9pNDBpdy5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3LmgKaW5kZXggYjczOGFjZC4uOGVjMDllNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3LmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3LmgKQEAgLTIzMiw3ICsyMzIsNyBAQAogCXN0cnVjdCBpNDBlX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBpNDBpd19odyBodzsKIAlzdHJ1Y3QgaTQwaXdfY21fY29yZSBjbV9jb3JlOwotCXVuc2lnbmVkIGxvbmcgKm1lbV9yZXNvdXJjZXM7CisJdTggKm1lbV9yZXNvdXJjZXM7CiAJdW5zaWduZWQgbG9uZyAqYWxsb2NhdGVkX3FwczsKIAl1bnNpZ25lZCBsb25nICphbGxvY2F0ZWRfY3FzOwogCXVuc2lnbmVkIGxvbmcgKmFsbG9jYXRlZF9tcnM7CkBAIC00MzUsOCArNDM1LDggQEAKIAkqbmV4dCA9IHJlc291cmNlX251bSArIDE7CiAJaWYgKCpuZXh0ID09IG1heF9yZXNvdXJjZXMpCiAJCSpuZXh0ID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpd2Rldi0+cmVzb3VyY2VfbG9jaywgZmxhZ3MpOwogCSpyZXFfcmVzb3VyY2VfbnVtID0gcmVzb3VyY2VfbnVtOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJml3ZGV2LT5yZXNvdXJjZV9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pNDBpdy9pNDBpd19jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X2NtLmMKaW5kZXggNTAyNmRjNy4uN2NhMDYzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X2NtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X2NtLmMKQEAgLTUzNSw4ICs1MzUsOCBAQAogCQlidWYgKz0gaGRyX2xlbjsKIAl9CiAKLQlpZiAocGRfbGVuKQotCQltZW1jcHkoYnVmLCBwZGF0YS0+YWRkciwgcGRfbGVuKTsKKwlpZiAocGRhdGEgJiYgcGRhdGEtPmFkZHIpCisJCW1lbWNweShidWYsIHBkYXRhLT5hZGRyLCBwZGF0YS0+c2l6ZSk7CiAKIAlhdG9taWNfc2V0KCZzcWJ1Zi0+cmVmY291bnQsIDEpOwogCkBAIC0zMzQ3LDI2ICszMzQ3LDYgQEAKIH0KIAogLyoqCi0gKiBpNDBpd19sb29wYmFja19ub3AgLSBTZW5kIGEgbm9wCi0gKiBAcXA6IGFzc29jaWF0ZWQgaHcgcXAKLSAqLwotc3RhdGljIHZvaWQgaTQwaXdfbG9vcGJhY2tfbm9wKHN0cnVjdCBpNDBpd19zY19xcCAqcXApCi17Ci0JdTY0ICp3cWU7Ci0JdTY0IGhlYWRlcjsKLQotCXdxZSA9IHFwLT5xcF91ay5zcV9iYXNlLT5lbGVtOwotCXNldF82NGJpdF92YWwod3FlLCAwLCAwKTsKLQlzZXRfNjRiaXRfdmFsKHdxZSwgOCwgMCk7Ci0Jc2V0XzY0Yml0X3ZhbCh3cWUsIDE2LCAwKTsKLQotCWhlYWRlciA9IExTXzY0KEk0MElXUVBfT1BfTk9QLCBJNDBJV1FQU1FfT1BDT0RFKSB8Ci0JICAgIExTXzY0KDAsIEk0MElXUVBTUV9TSUdDT01QTCkgfAotCSAgICBMU182NChxcC0+cXBfdWsuc3dxZV9wb2xhcml0eSwgSTQwSVdRUFNRX1ZBTElEKTsKLQlzZXRfNjRiaXRfdmFsKHdxZSwgMjQsIGhlYWRlcik7Ci19Ci0KLS8qKgogICogaTQwaXdfcXBfZGlzY29ubmVjdCAtIGZyZWUgcXAgYW5kIGNsb3NlIGNtCiAgKiBAaXdxcDogYXNzb2NpYXRlIHFwIGZvciB0aGUgY29ubmVjdGlvbgogICovCkBAIC0zNjM4LDcgKzM2MTgsNyBAQAogCX0gZWxzZSB7CiAJCWlmIChpd3FwLT5wYWdlKQogCQkJaXdxcC0+c2NfcXAucXBfdWsuc3FfYmFzZSA9IGttYXAoaXdxcC0+cGFnZSk7Ci0JCWk0MGl3X2xvb3BiYWNrX25vcCgmaXdxcC0+c2NfcXApOworCQlkZXYtPml3X3ByaXZfcXBfb3BzLT5xcF9zZW5kX2xzbW0oJml3cXAtPnNjX3FwLCBOVUxMLCAwLCAwKTsKIAl9CiAKIAlpZiAoaXdxcC0+cGFnZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pNDBpdy9pNDBpd19ody5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X2h3LmMKaW5kZXggM2VlMGNhZC4uMGM5MmE0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X2h3LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X2h3LmMKQEAgLTI2NSw2ICsyNjUsNyBAQAogCQlpbmZvLmRvbnRfc2VuZF9maW4gPSBmYWxzZTsKIAlpZiAoaXdxcC0+c2NfcXAudGVybV9mbGFncyAmJiAoc3RhdGUgPT0gSTQwSVdfUVBfU1RBVEVfRVJST1IpKQogCQlpbmZvLnJlc2V0X3RjcF9jb25uID0gdHJ1ZTsKKwlpd3FwLT5od19pd2FycF9zdGF0ZSA9IHN0YXRlOwogCWk0MGl3X2h3X21vZGlmeV9xcChpd3FwLT5pd2RldiwgaXdxcCwgJmluZm8sIDApOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaTQwaXcvaTQwaXdfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X21haW4uYwppbmRleCA2ZTkwODEzLi40NDVlMjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaTQwaXcvaTQwaXdfbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pNDBpdy9pNDBpd19tYWluLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCS5ub3RpZmllcl9jYWxsID0gaTQwaXdfbmV0X2V2ZW50CiB9OwogCi1zdGF0aWMgaW50IGk0MGl3X25vdGlmaWVyc19yZWdpc3RlcmVkOworc3RhdGljIGF0b21pY190IGk0MGl3X25vdGlmaWVyc19yZWdpc3RlcmVkOwogCiAvKioKICAqIGk0MGl3X2ZpbmRfaTQwZV9oYW5kbGVyIC0gZmluZCBhIGhhbmRsZXIgZ2l2ZW4gYSBjbGllbnQgaW5mbwpAQCAtMTM0MiwxMiArMTM0MiwxMSBAQAogICovCiBzdGF0aWMgdm9pZCBpNDBpd19yZWdpc3Rlcl9ub3RpZmllcnModm9pZCkKIHsKLQlpZiAoIWk0MGl3X25vdGlmaWVyc19yZWdpc3RlcmVkKSB7CisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZpNDBpd19ub3RpZmllcnNfcmVnaXN0ZXJlZCkgPT0gMSkgewogCQlyZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmaTQwaXdfaW5ldGFkZHJfbm90aWZpZXIpOwogCQlyZWdpc3Rlcl9pbmV0NmFkZHJfbm90aWZpZXIoJmk0MGl3X2luZXRhZGRyNl9ub3RpZmllcik7CiAJCXJlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyKCZpNDBpd19uZXRfbm90aWZpZXIpOwogCX0KLQlpNDBpd19ub3RpZmllcnNfcmVnaXN0ZXJlZCsrOwogfQogCiAvKioKQEAgLTE0MjksOCArMTQyOCw3IEBACiAJCQlpNDBpd19kZWxfbWFjaXBfZW50cnkoaXdkZXYsICh1OClpd2Rldi0+bWFjX2lwX3RhYmxlX2lkeCk7CiAJCS8qIGZhbGx0aHJvdWdoICovCiAJY2FzZSBJTkVUX05PVElGSUVSOgotCQlpZiAoaTQwaXdfbm90aWZpZXJzX3JlZ2lzdGVyZWQgPiAwKSB7Ci0JCQlpNDBpd19ub3RpZmllcnNfcmVnaXN0ZXJlZC0tOworCQlpZiAoIWF0b21pY19kZWNfcmV0dXJuKCZpNDBpd19ub3RpZmllcnNfcmVnaXN0ZXJlZCkpIHsKIAkJCXVucmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXIoJmk0MGl3X25ldF9ub3RpZmllcik7CiAJCQl1bnJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZpNDBpd19pbmV0YWRkcl9ub3RpZmllcik7CiAJCQl1bnJlZ2lzdGVyX2luZXQ2YWRkcl9ub3RpZmllcigmaTQwaXdfaW5ldGFkZHI2X25vdGlmaWVyKTsKQEAgLTE1NTgsNiArMTU1NiwxMCBAQAogCWVudW0gaTQwaXdfc3RhdHVzX2NvZGUgc3RhdHVzOwogCXN0cnVjdCBpNDBpd19oYW5kbGVyICpoZGw7CiAKKwloZGwgPSBpNDBpd19maW5kX25ldGRldihsZGV2LT5uZXRkZXYpOworCWlmIChoZGwpCisJCXJldHVybiAwOworCiAJaGRsID0ga3phbGxvYyhzaXplb2YoKmhkbCksIEdGUF9LRVJORUwpOwogCWlmICghaGRsKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pNDBpdy9pNDBpd191dGlscy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X3V0aWxzLmMKaW5kZXggMGU4ZGIwYS4uNmZkMDQzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X3V0aWxzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X3V0aWxzLmMKQEAgLTY3Myw4ICs2NzMsMTEgQEAKIHsKIAlpZiAoIW1lbSkKIAkJcmV0dXJuIEk0MElXX0VSUl9QQVJBTTsKKwkvKgorCSAqIG1lbS0+dmEgcG9pbnRzIHRvIHRoZSBwYXJlbnQgb2YgbWVtLCBzbyBib3RoIG1lbSBhbmQgbWVtLT52YQorCSAqIGNhbiBub3QgYmUgdG91Y2hlZCBvbmNlIG1lbS0+dmEgaXMgZnJlZWQKKwkgKi8KIAlrZnJlZShtZW0tPnZhKTsKLQltZW0tPnZhID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X3ZlcmJzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaTQwaXcvaTQwaXdfdmVyYnMuYwppbmRleCAyMzYwMzM4Li42MzI5Yzk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaTQwaXcvaTQwaXdfdmVyYnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaTQwaXcvaTQwaXdfdmVyYnMuYwpAQCAtNzk0LDcgKzc5NCw2IEBACiAJcmV0dXJuICZpd3FwLT5pYnFwOwogZXJyb3I6CiAJaTQwaXdfZnJlZV9xcF9yZXNvdXJjZXMoaXdkZXYsIGl3cXAsIHFwX251bSk7Ci0Ja2ZyZWUobWVtKTsKIAlyZXR1cm4gRVJSX1BUUihlcnJfY29kZSk7CiB9CiAKQEAgLTE5MjYsOCArMTkyNSw3IEBACiAJCX0KIAkJaWYgKGl3cGJsLT5wYmxfYWxsb2NhdGVkKQogCQkJaTQwaXdfZnJlZV9wYmxlKGl3ZGV2LT5wYmxlX3JzcmMsIHBhbGxvYyk7Ci0JCWtmcmVlKGl3cGJsLT5pd21yKTsKLQkJaXdwYmwtPml3bXIgPSBOVUxMOworCQlrZnJlZShpd21yKTsKIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvY3EuYwppbmRleCBkNmZjOGE2Li41ZGY2M2RhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L2NxLmMKQEAgLTU3Niw4ICs1NzYsOCBAQAogCQljaGVja3N1bSA9PSBjcHVfdG9fYmUxNigweGZmZmYpOwogfQogCi1zdGF0aWMgaW50IHVzZV90dW5uZWxfZGF0YShzdHJ1Y3QgbWx4NF9pYl9xcCAqcXAsIHN0cnVjdCBtbHg0X2liX2NxICpjcSwgc3RydWN0IGliX3djICp3YywKLQkJCSAgIHVuc2lnbmVkIHRhaWwsIHN0cnVjdCBtbHg0X2NxZSAqY3FlLCBpbnQgaXNfZXRoKQorc3RhdGljIHZvaWQgdXNlX3R1bm5lbF9kYXRhKHN0cnVjdCBtbHg0X2liX3FwICpxcCwgc3RydWN0IG1seDRfaWJfY3EgKmNxLCBzdHJ1Y3QgaWJfd2MgKndjLAorCQkJICAgIHVuc2lnbmVkIHRhaWwsIHN0cnVjdCBtbHg0X2NxZSAqY3FlLCBpbnQgaXNfZXRoKQogewogCXN0cnVjdCBtbHg0X2liX3Byb3h5X3NxcF9oZHIgKmhkcjsKIApAQCAtNjAwLDggKzYwMCw2IEBACiAJCXdjLT5zbGlkICAgICAgICA9IGJlMTZfdG9fY3B1KGhkci0+dHVuLnNsaWRfbWFjXzQ3XzMyKTsKIAkJd2MtPnNsICAgICAgICAgID0gKHU4KSAoYmUxNl90b19jcHUoaGRyLT50dW4uc2xfdmlkKSA+PiAxMik7CiAJfQotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIG1seDRfaWJfcXBfc3dfY29tcChzdHJ1Y3QgbWx4NF9pYl9xcCAqcXAsIGludCBudW1fZW50cmllcywKQEAgLTY4OSwxMiArNjg3LDYgQEAKIAlpc19lcnJvciA9IChjcWUtPm93bmVyX3NyX29wY29kZSAmIE1MWDRfQ1FFX09QQ09ERV9NQVNLKSA9PQogCQlNTFg0X0NRRV9PUENPREVfRVJST1I7CiAKLQlpZiAodW5saWtlbHkoKGNxZS0+b3duZXJfc3Jfb3Bjb2RlICYgTUxYNF9DUUVfT1BDT0RFX01BU0spID09IE1MWDRfT1BDT0RFX05PUCAmJgotCQkgICAgIGlzX3NlbmQpKSB7Ci0JCXByX3dhcm4oIkNvbXBsZXRpb24gZm9yIE5PUCBvcGNvZGUgZGV0ZWN0ZWQhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJLyogUmVzaXplIENRIGluIHByb2dyZXNzICovCiAJaWYgKHVubGlrZWx5KChjcWUtPm93bmVyX3NyX29wY29kZSAmIE1MWDRfQ1FFX09QQ09ERV9NQVNLKSA9PSBNTFg0X0NRRV9PUENPREVfUkVTSVpFKSkgewogCQlpZiAoY3EtPnJlc2l6ZV9idWYpIHsKQEAgLTcyMCwxMiArNzEyLDYgQEAKIAkJICovCiAJCW1xcCA9IF9fbWx4NF9xcF9sb29rdXAodG9fbWRldihjcS0+aWJjcS5kZXZpY2UpLT5kZXYsCiAJCQkJICAgICAgIGJlMzJfdG9fY3B1KGNxZS0+dmxhbl9teV9xcG4pKTsKLQkJaWYgKHVubGlrZWx5KCFtcXApKSB7Ci0JCQlwcl93YXJuKCJDUSAlMDZ4IHdpdGggZW50cnkgZm9yIHVua25vd24gUVBOICUwNnhcbiIsCi0JCQkgICAgICAgY3EtPm1jcS5jcW4sIGJlMzJfdG9fY3B1KGNxZS0+dmxhbl9teV9xcG4pICYgTUxYNF9DUUVfUVBOX01BU0spOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQogCQkqY3VyX3FwID0gdG9fbWlicXAobXFwKTsKIAl9CiAKQEAgLTczOCwxMSArNzI0LDYgQEAKIAkJLyogU1JRIGlzIGFsc28gaW4gdGhlIHJhZGl4IHRyZWUgKi8KIAkJbXNycSA9IG1seDRfc3JxX2xvb2t1cCh0b19tZGV2KGNxLT5pYmNxLmRldmljZSktPmRldiwKIAkJCQkgICAgICAgc3JxX251bSk7Ci0JCWlmICh1bmxpa2VseSghbXNycSkpIHsKLQkJCXByX3dhcm4oIkNRICUwNnggd2l0aCBlbnRyeSBmb3IgdW5rbm93biBTUlFOICUwNnhcbiIsCi0JCQkJY3EtPm1jcS5jcW4sIHNycV9udW0pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KIAl9CiAKIAlpZiAoaXNfc2VuZCkgewpAQCAtODUyLDkgKzgzMywxMSBAQAogCQlpZiAobWx4NF9pc19tZnVuYyh0b19tZGV2KGNxLT5pYmNxLmRldmljZSktPmRldikpIHsKIAkJCWlmICgoKmN1cl9xcCktPm1seDRfaWJfcXBfdHlwZSAmCiAJCQkgICAgKE1MWDRfSUJfUVBUX1BST1hZX1NNSV9PV05FUiB8Ci0JCQkgICAgIE1MWDRfSUJfUVBUX1BST1hZX1NNSSB8IE1MWDRfSUJfUVBUX1BST1hZX0dTSSkpCi0JCQkJcmV0dXJuIHVzZV90dW5uZWxfZGF0YSgqY3VyX3FwLCBjcSwgd2MsIHRhaWwsCi0JCQkJCQkgICAgICAgY3FlLCBpc19ldGgpOworCQkJICAgICBNTFg0X0lCX1FQVF9QUk9YWV9TTUkgfCBNTFg0X0lCX1FQVF9QUk9YWV9HU0kpKSB7CisJCQkJdXNlX3R1bm5lbF9kYXRhKCpjdXJfcXAsIGNxLCB3YywgdGFpbCwgY3FlLAorCQkJCQkJaXNfZXRoKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KIAkJfQogCiAJCXdjLT5zbGlkCSAgID0gYmUxNl90b19jcHUoY3FlLT5ybGlkKTsKQEAgLTg5MSw3ICs4NzQsNiBAQAogCXN0cnVjdCBtbHg0X2liX3FwICpjdXJfcXAgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IG5wb2xsZWQ7Ci0JaW50IGVyciA9IDA7CiAJc3RydWN0IG1seDRfaWJfZGV2ICptZGV2ID0gdG9fbWRldihjcS0+aWJjcS5kZXZpY2UpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNxLT5sb2NrLCBmbGFncyk7CkBAIC05MDEsOCArODgzLDcgQEAKIAl9CiAKIAlmb3IgKG5wb2xsZWQgPSAwOyBucG9sbGVkIDwgbnVtX2VudHJpZXM7ICsrbnBvbGxlZCkgewotCQllcnIgPSBtbHg0X2liX3BvbGxfb25lKGNxLCAmY3VyX3FwLCB3YyArIG5wb2xsZWQpOwotCQlpZiAoZXJyKQorCQlpZiAobWx4NF9pYl9wb2xsX29uZShjcSwgJmN1cl9xcCwgd2MgKyBucG9sbGVkKSkKIAkJCWJyZWFrOwogCX0KIApAQCAtOTExLDEwICs4OTIsNyBAQAogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNxLT5sb2NrLCBmbGFncyk7CiAKLQlpZiAoZXJyID09IDAgfHwgZXJyID09IC1FQUdBSU4pCi0JCXJldHVybiBucG9sbGVkOwotCWVsc2UKLQkJcmV0dXJuIGVycjsKKwlyZXR1cm4gbnBvbGxlZDsKIH0KIAogaW50IG1seDRfaWJfYXJtX2NxKHN0cnVjdCBpYl9jcSAqaWJjcSwgZW51bSBpYl9jcV9ub3RpZnlfZmxhZ3MgZmxhZ3MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCmluZGV4IDljMmU1M2QuLjBmMjFjM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCkBAIC0xMTI4LDYgKzExMjgsMjcgQEAKIAogCQkvKiBHZW5lcmF0ZSBHVUlEIGNoYW5nZWQgZXZlbnQgKi8KIAkJaWYgKGNoYW5nZWRfYXR0ciAmIE1MWDRfRVFfUE9SVF9JTkZPX0dJRF9QRlhfQ0hBTkdFX01BU0spIHsKKwkJCWlmIChtbHg0X2lzX21hc3RlcihkZXYtPmRldikpIHsKKwkJCQl1bmlvbiBpYl9naWQgZ2lkOworCQkJCWludCBlcnIgPSAwOworCisJCQkJaWYgKCFlcWUtPmV2ZW50LnBvcnRfbWdtdF9jaGFuZ2UucGFyYW1zLnBvcnRfaW5mby5naWRfcHJlZml4KQorCQkJCQllcnIgPSBfX21seDRfaWJfcXVlcnlfZ2lkKCZkZXYtPmliX2RldiwgcG9ydCwgMCwgJmdpZCwgMSk7CisJCQkJZWxzZQorCQkJCQlnaWQuZ2xvYmFsLnN1Ym5ldF9wcmVmaXggPQorCQkJCQkJZXFlLT5ldmVudC5wb3J0X21nbXRfY2hhbmdlLnBhcmFtcy5wb3J0X2luZm8uZ2lkX3ByZWZpeDsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCXByX3dhcm4oIkNvdWxkIG5vdCBjaGFuZ2UgUVAxIHN1Ym5ldCBwcmVmaXggZm9yIHBvcnQgJWQ6IHF1ZXJ5X2dpZCBlcnJvciAoJWQpXG4iLAorCQkJCQkJcG9ydCwgZXJyKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcl9kZWJ1ZygiQ2hhbmdpbmcgUVAxIHN1Ym5ldCBwcmVmaXggZm9yIHBvcnQgJWQuIG9sZD0weCVsbHguIG5ldz0weCVsbHhcbiIsCisJCQkJCQkgcG9ydCwKKwkJCQkJCSAodTY0KWF0b21pYzY0X3JlYWQoJmRldi0+c3Jpb3YuZGVtdXhbcG9ydCAtIDFdLnN1Ym5ldF9wcmVmaXgpLAorCQkJCQkJIGJlNjRfdG9fY3B1KGdpZC5nbG9iYWwuc3VibmV0X3ByZWZpeCkpOworCQkJCQlhdG9taWM2NF9zZXQoJmRldi0+c3Jpb3YuZGVtdXhbcG9ydCAtIDFdLnN1Ym5ldF9wcmVmaXgsCisJCQkJCQkgICAgIGJlNjRfdG9fY3B1KGdpZC5nbG9iYWwuc3VibmV0X3ByZWZpeCkpOworCQkJCX0KKwkJCX0KIAkJCW1seDRfaWJfZGlzcGF0Y2hfZXZlbnQoZGV2LCBwb3J0LCBJQl9FVkVOVF9HSURfQ0hBTkdFKTsKIAkJCS8qaWYgbWFzdGVyLCBub3RpZnkgYWxsIHNsYXZlcyovCiAJCQlpZiAobWx4NF9pc19tYXN0ZXIoZGV2LT5kZXYpKQpAQCAtMjIwMiw2ICsyMjIzLDggQEAKIAkJaWYgKGVycikKIAkJCWdvdG8gZGVtdXhfZXJyOwogCQlkZXYtPnNyaW92LmRlbXV4W2ldLmd1aWRfY2FjaGVbMF0gPSBnaWQuZ2xvYmFsLmludGVyZmFjZV9pZDsKKwkJYXRvbWljNjRfc2V0KCZkZXYtPnNyaW92LmRlbXV4W2ldLnN1Ym5ldF9wcmVmaXgsCisJCQkgICAgIGJlNjRfdG9fY3B1KGdpZC5nbG9iYWwuc3VibmV0X3ByZWZpeCkpOwogCQllcnIgPSBhbGxvY19wdl9vYmplY3QoZGV2LCBtbHg0X21hc3Rlcl9mdW5jX251bShkZXYtPmRldiksIGkgKyAxLAogCQkJCSAgICAgICZkZXYtPnNyaW92LnNxcHNbaV0pOwogCQlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFpbi5jCmluZGV4IDJhZjQ0YzIuLjg3YmE5YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWluLmMKQEAgLTIyMDIsNiArMjIwMiw5IEBACiAJYm9vbCBwZXJfcG9ydCA9ICEhKGliZGV2LT5kZXYtPmNhcHMuZmxhZ3MyICYKIAkJTUxYNF9ERVZfQ0FQX0ZMQUcyX0RJQUdfUEVSX1BPUlQpOwogCisJaWYgKG1seDRfaXNfc2xhdmUoaWJkZXYtPmRldikpCisJCXJldHVybiAwOworCiAJZm9yIChpID0gMDsgaSA8IE1MWDRfRElBR19DT1VOVEVSU19UWVBFUzsgaSsrKSB7CiAJCS8qIGkgPT0gMSBtZWFucyB3ZSBhcmUgYnVpbGRpbmcgcG9ydCBjb3VudGVycyAqLwogCQlpZiAoaSAmJiAhcGVyX3BvcnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tY2cuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21jZy5jCmluZGV4IDhmN2FkMDcuLjA5N2JmY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21jZy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21jZy5jCkBAIC00ODksNyArNDg5LDcgQEAKIAkJaWYgKCFncm91cC0+bWVtYmVyc1tpXSkKIAkJCWxlYXZlX3N0YXRlIHw9ICgxIDw8IGkpOwogCi0JcmV0dXJuIGxlYXZlX3N0YXRlICYgKGdyb3VwLT5yZWMuc2NvcGVfam9pbl9zdGF0ZSAmIDcpOworCXJldHVybiBsZWF2ZV9zdGF0ZSAmIChncm91cC0+cmVjLnNjb3BlX2pvaW5fc3RhdGUgJiAweGYpOwogfQogCiBzdGF0aWMgaW50IGpvaW5fZ3JvdXAoc3RydWN0IG1jYXN0X2dyb3VwICpncm91cCwgaW50IHNsYXZlLCB1OCBqb2luX21hc2spCkBAIC01NjQsOCArNTY0LDggQEAKIAkJfSBlbHNlCiAJCQltY2dfd2Fybl9ncm91cChncm91cCwgIkRSSVZFUiBCVUdcbiIpOwogCX0gZWxzZSBpZiAoZ3JvdXAtPnN0YXRlID09IE1DQVNUX0xFQVZFX1NFTlQpIHsKLQkJaWYgKGdyb3VwLT5yZWMuc2NvcGVfam9pbl9zdGF0ZSAmIDcpCi0JCQlncm91cC0+cmVjLnNjb3BlX2pvaW5fc3RhdGUgJj0gMHhmODsKKwkJaWYgKGdyb3VwLT5yZWMuc2NvcGVfam9pbl9zdGF0ZSAmIDB4ZikKKwkJCWdyb3VwLT5yZWMuc2NvcGVfam9pbl9zdGF0ZSAmPSAweGYwOwogCQlncm91cC0+c3RhdGUgPSBNQ0FTVF9JRExFOwogCQltdXRleF91bmxvY2soJmdyb3VwLT5sb2NrKTsKIAkJaWYgKHJlbGVhc2VfZ3JvdXAoZ3JvdXAsIDEpKQpAQCAtNjA1LDcgKzYwNSw3IEBACiBzdGF0aWMgaW50IGhhbmRsZV9qb2luX3JlcShzdHJ1Y3QgbWNhc3RfZ3JvdXAgKmdyb3VwLCB1OCBqb2luX21hc2ssCiAJCQkgICBzdHJ1Y3QgbWNhc3RfcmVxICpyZXEpCiB7Ci0JdTggZ3JvdXBfam9pbl9zdGF0ZSA9IGdyb3VwLT5yZWMuc2NvcGVfam9pbl9zdGF0ZSAmIDc7CisJdTggZ3JvdXBfam9pbl9zdGF0ZSA9IGdyb3VwLT5yZWMuc2NvcGVfam9pbl9zdGF0ZSAmIDB4ZjsKIAlpbnQgcmVmID0gMDsKIAl1MTYgc3RhdHVzOwogCXN0cnVjdCBpYl9zYV9tY21lbWJlcl9kYXRhICpzYV9kYXRhID0gKHN0cnVjdCBpYl9zYV9tY21lbWJlcl9kYXRhICopcmVxLT5zYV9tYWQuZGF0YTsKQEAgLTY5MCw4ICs2OTAsOCBAQAogCQkJdTggY3VyX2pvaW5fc3RhdGU7CiAKIAkJCXJlc3Bfam9pbl9zdGF0ZSA9ICgoc3RydWN0IGliX3NhX21jbWVtYmVyX2RhdGEgKikKLQkJCQkJCWdyb3VwLT5yZXNwb25zZV9zYV9tYWQuZGF0YSktPnNjb3BlX2pvaW5fc3RhdGUgJiA3OwotCQkJY3VyX2pvaW5fc3RhdGUgPSBncm91cC0+cmVjLnNjb3BlX2pvaW5fc3RhdGUgJiA3OworCQkJCQkJZ3JvdXAtPnJlc3BvbnNlX3NhX21hZC5kYXRhKS0+c2NvcGVfam9pbl9zdGF0ZSAmIDB4ZjsKKwkJCWN1cl9qb2luX3N0YXRlID0gZ3JvdXAtPnJlYy5zY29wZV9qb2luX3N0YXRlICYgMHhmOwogCiAJCQlpZiAobWV0aG9kID09IElCX01HTVRfTUVUSE9EX0dFVF9SRVNQKSB7CiAJCQkJLyogc3VjY2Vzc2Z1bGwgam9pbiAqLwpAQCAtNzEwLDcgKzcxMCw3IEBACiAJCXJlcSA9IGxpc3RfZmlyc3RfZW50cnkoJmdyb3VwLT5wZW5kaW5nX2xpc3QsIHN0cnVjdCBtY2FzdF9yZXEsCiAJCQkJICAgICAgIGdyb3VwX2xpc3QpOwogCQlzYV9kYXRhID0gKHN0cnVjdCBpYl9zYV9tY21lbWJlcl9kYXRhICopcmVxLT5zYV9tYWQuZGF0YTsKLQkJcmVxX2pvaW5fc3RhdGUgPSBzYV9kYXRhLT5zY29wZV9qb2luX3N0YXRlICYgMHg3OworCQlyZXFfam9pbl9zdGF0ZSA9IHNhX2RhdGEtPnNjb3BlX2pvaW5fc3RhdGUgJiAweGY7CiAKIAkJLyogRm9yIGEgbGVhdmUgcmVxdWVzdCwgd2Ugd2lsbCBpbW1lZGlhdGVseSBhbnN3ZXIgdGhlIFZGLCBhbmQKIAkJICogdXBkYXRlIG91ciBpbnRlcm5hbCBjb3VudGVycy4gVGhlIGFjdHVhbCBsZWF2ZSB3aWxsIGJlIHNlbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21seDRfaWIuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21seDRfaWIuaAppbmRleCA3YzU4MzJlLi42ODZhYjQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tbHg0X2liLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWx4NF9pYi5oCkBAIC00NDgsNyArNDQ4LDcgQEAKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnVkX3dxOwogCXNwaW5sb2NrX3QgdWRfbG9jazsKLQlfX2JlNjQgc3VibmV0X3ByZWZpeDsKKwlhdG9taWM2NF90IHN1Ym5ldF9wcmVmaXg7CiAJX19iZTY0IGd1aWRfY2FjaGVbMTI4XTsKIAlzdHJ1Y3QgbWx4NF9pYl9kZXYgKmRldjsKIAkvKiB0aGUgZm9sbG93aW5nIGxvY2sgcHJvdGVjdHMgYm90aCBtY2dfdGFibGUgYW5kIG1jZ19tZ2lkMF9saXN0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvcXAuYwppbmRleCA3NjgwODVmLi43ZmI5NjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3FwLmMKQEAgLTI0OTMsMjQgKzI0OTMsMjcgQEAKIAkJc3FwLT51ZF9oZWFkZXIuZ3JoLmZsb3dfbGFiZWwgICAgPQogCQkJYWgtPmF2LmliLnNsX3RjbGFzc19mbG93bGFiZWwgJiBjcHVfdG9fYmUzMigweGZmZmZmKTsKIAkJc3FwLT51ZF9oZWFkZXIuZ3JoLmhvcF9saW1pdCAgICAgPSBhaC0+YXYuaWIuaG9wX2xpbWl0OwotCQlpZiAoaXNfZXRoKQorCQlpZiAoaXNfZXRoKSB7CiAJCQltZW1jcHkoc3FwLT51ZF9oZWFkZXIuZ3JoLnNvdXJjZV9naWQucmF3LCBzZ2lkLnJhdywgMTYpOwotCQllbHNlIHsKLQkJaWYgKG1seDRfaXNfbWZ1bmModG9fbWRldihpYl9kZXYpLT5kZXYpKSB7Ci0JCQkvKiBXaGVuIG11bHRpLWZ1bmN0aW9uIGlzIGVuYWJsZWQsIHRoZSBpYl9jb3JlIGdpZAotCQkJICogaW5kZXhlcyBkb24ndCBuZWNlc3NhcmlseSBtYXRjaCB0aGUgaHcgb25lcywgc28KLQkJCSAqIHdlIG11c3QgdXNlIG91ciBvd24gY2FjaGUgKi8KLQkJCXNxcC0+dWRfaGVhZGVyLmdyaC5zb3VyY2VfZ2lkLmdsb2JhbC5zdWJuZXRfcHJlZml4ID0KLQkJCQl0b19tZGV2KGliX2RldiktPnNyaW92LmRlbXV4W3NxcC0+cXAucG9ydCAtIDFdLgotCQkJCQkJICAgICAgIHN1Ym5ldF9wcmVmaXg7Ci0JCQlzcXAtPnVkX2hlYWRlci5ncmguc291cmNlX2dpZC5nbG9iYWwuaW50ZXJmYWNlX2lkID0KLQkJCQl0b19tZGV2KGliX2RldiktPnNyaW92LmRlbXV4W3NxcC0+cXAucG9ydCAtIDFdLgotCQkJCQkgICAgICAgZ3VpZF9jYWNoZVthaC0+YXYuaWIuZ2lkX2luZGV4XTsKLQkJfSBlbHNlCi0JCQlpYl9nZXRfY2FjaGVkX2dpZChpYl9kZXYsCi0JCQkJCSAgYmUzMl90b19jcHUoYWgtPmF2LmliLnBvcnRfcGQpID4+IDI0LAotCQkJCQkgIGFoLT5hdi5pYi5naWRfaW5kZXgsCi0JCQkJCSAgJnNxcC0+dWRfaGVhZGVyLmdyaC5zb3VyY2VfZ2lkLCBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChtbHg0X2lzX21mdW5jKHRvX21kZXYoaWJfZGV2KS0+ZGV2KSkgeworCQkJCS8qIFdoZW4gbXVsdGktZnVuY3Rpb24gaXMgZW5hYmxlZCwgdGhlIGliX2NvcmUgZ2lkCisJCQkJICogaW5kZXhlcyBkb24ndCBuZWNlc3NhcmlseSBtYXRjaCB0aGUgaHcgb25lcywgc28KKwkJCQkgKiB3ZSBtdXN0IHVzZSBvdXIgb3duIGNhY2hlCisJCQkJICovCisJCQkJc3FwLT51ZF9oZWFkZXIuZ3JoLnNvdXJjZV9naWQuZ2xvYmFsLnN1Ym5ldF9wcmVmaXggPQorCQkJCQljcHVfdG9fYmU2NChhdG9taWM2NF9yZWFkKCYodG9fbWRldihpYl9kZXYpLT5zcmlvdi4KKwkJCQkJCQkJICAgIGRlbXV4W3NxcC0+cXAucG9ydCAtIDFdLgorCQkJCQkJCQkgICAgc3VibmV0X3ByZWZpeCkpKTsKKwkJCQlzcXAtPnVkX2hlYWRlci5ncmguc291cmNlX2dpZC5nbG9iYWwuaW50ZXJmYWNlX2lkID0KKwkJCQkJdG9fbWRldihpYl9kZXYpLT5zcmlvdi5kZW11eFtzcXAtPnFwLnBvcnQgLSAxXS4KKwkJCQkJCSAgICAgICBndWlkX2NhY2hlW2FoLT5hdi5pYi5naWRfaW5kZXhdOworCQkJfSBlbHNlIHsKKwkJCQlpYl9nZXRfY2FjaGVkX2dpZChpYl9kZXYsCisJCQkJCQkgIGJlMzJfdG9fY3B1KGFoLT5hdi5pYi5wb3J0X3BkKSA+PiAyNCwKKwkJCQkJCSAgYWgtPmF2LmliLmdpZF9pbmRleCwKKwkJCQkJCSAgJnNxcC0+dWRfaGVhZGVyLmdyaC5zb3VyY2VfZ2lkLCBOVUxMKTsKKwkJCX0KIAkJfQogCQltZW1jcHkoc3FwLT51ZF9oZWFkZXIuZ3JoLmRlc3RpbmF0aW9uX2dpZC5yYXcsCiAJCSAgICAgICBhaC0+YXYuaWIuZGdpZCwgMTYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvY3EuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L2NxLmMKaW5kZXggMzA4YTM1OC4uNWRlOWE2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvY3EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9jcS5jCkBAIC01NTMsMTIgKzU1Myw2IEBACiAJCSAqIGZyb20gdGhlIHRhYmxlLgogCQkgKi8KIAkJbXFwID0gX19tbHg1X3FwX2xvb2t1cChkZXYtPm1kZXYsIHFwbik7Ci0JCWlmICh1bmxpa2VseSghbXFwKSkgewotCQkJbWx4NV9pYl93YXJuKGRldiwgIkNRRUBDUSAlMDZ4IGZvciB1bmtub3duIFFQTiAlNnhcbiIsCi0JCQkJICAgICBjcS0+bWNxLmNxbiwgcXBuKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KIAkJKmN1cl9xcCA9IHRvX21pYnFwKG1xcCk7CiAJfQogCkBAIC02MTksMTMgKzYxMyw2IEBACiAJCXJlYWRfbG9jaygmZGV2LT5tZGV2LT5wcml2Lm1rZXlfdGFibGUubG9jayk7CiAJCW1ta2V5ID0gX19tbHg1X21yX2xvb2t1cChkZXYtPm1kZXYsCiAJCQkJCSBtbHg1X2Jhc2VfbWtleShiZTMyX3RvX2NwdShzaWdfZXJyX2NxZS0+bWtleSkpKTsKLQkJaWYgKHVubGlrZWx5KCFtbWtleSkpIHsKLQkJCXJlYWRfdW5sb2NrKCZkZXYtPm1kZXYtPnByaXYubWtleV90YWJsZS5sb2NrKTsKLQkJCW1seDVfaWJfd2FybihkZXYsICJDUUVAQ1EgJTA2eCBmb3IgdW5rbm93biBNUiAlNnhcbiIsCi0JCQkJICAgICBjcS0+bWNxLmNxbiwgYmUzMl90b19jcHUoc2lnX2Vycl9jcWUtPm1rZXkpKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KIAkJbXIgPSB0b19taWJtcihtbWtleSk7CiAJCWdldF9zaWdfZXJyX2l0ZW0oc2lnX2Vycl9jcWUsICZtci0+c2lnLT5lcnJfaXRlbSk7CiAJCW1yLT5zaWctPnNpZ19lcnJfZXhpc3RzID0gdHJ1ZTsKQEAgLTY3Niw3ICs2NjMsNiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHNvZnRfcG9sbGVkID0gMDsKIAlpbnQgbnBvbGxlZDsKLQlpbnQgZXJyID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjcS0+bG9jaywgZmxhZ3MpOwogCWlmIChtZGV2LT5zdGF0ZSA9PSBNTFg1X0RFVklDRV9TVEFURV9JTlRFUk5BTF9FUlJPUikgewpAQCAtNjg4LDggKzY3NCw3IEBACiAJCXNvZnRfcG9sbGVkID0gcG9sbF9zb2Z0X3djKGNxLCBudW1fZW50cmllcywgd2MpOwogCiAJZm9yIChucG9sbGVkID0gMDsgbnBvbGxlZCA8IG51bV9lbnRyaWVzIC0gc29mdF9wb2xsZWQ7IG5wb2xsZWQrKykgewotCQllcnIgPSBtbHg1X3BvbGxfb25lKGNxLCAmY3VyX3FwLCB3YyArIHNvZnRfcG9sbGVkICsgbnBvbGxlZCk7Ci0JCWlmIChlcnIpCisJCWlmIChtbHg1X3BvbGxfb25lKGNxLCAmY3VyX3FwLCB3YyArIHNvZnRfcG9sbGVkICsgbnBvbGxlZCkpCiAJCQlicmVhazsKIAl9CiAKQEAgLTY5OCwxMCArNjgzLDcgQEAKIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcS0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKGVyciA9PSAwIHx8IGVyciA9PSAtRUFHQUlOKQotCQlyZXR1cm4gc29mdF9wb2xsZWQgKyBucG9sbGVkOwotCWVsc2UKLQkJcmV0dXJuIGVycjsKKwlyZXR1cm4gc29mdF9wb2xsZWQgKyBucG9sbGVkOwogfQogCiBpbnQgbWx4NV9pYl9hcm1fY3Eoc3RydWN0IGliX2NxICppYmNxLCBlbnVtIGliX2NxX25vdGlmeV9mbGFncyBmbGFncykKQEAgLTc0NywxNCArNzI5LDE2IEBACiAKIHN0YXRpYyBpbnQgY3JlYXRlX2NxX3VzZXIoc3RydWN0IG1seDVfaWJfZGV2ICpkZXYsIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEsCiAJCQkgIHN0cnVjdCBpYl91Y29udGV4dCAqY29udGV4dCwgc3RydWN0IG1seDVfaWJfY3EgKmNxLAotCQkJICBpbnQgZW50cmllcywgc3RydWN0IG1seDVfY3JlYXRlX2NxX21ib3hfaW4gKipjcWIsCisJCQkgIGludCBlbnRyaWVzLCB1MzIgKipjcWIsCiAJCQkgIGludCAqY3FlX3NpemUsIGludCAqaW5kZXgsIGludCAqaW5sZW4pCiB7CiAJc3RydWN0IG1seDVfaWJfY3JlYXRlX2NxIHVjbWQ7CiAJc2l6ZV90IHVjbWRsZW47CiAJaW50IHBhZ2Vfc2hpZnQ7CisJX19iZTY0ICpwYXM7CiAJaW50IG5wYWdlczsKIAlpbnQgbmNvbnQ7CisJdm9pZCAqY3FjOwogCWludCBlcnI7CiAKIAl1Y21kbGVuID0KQEAgLTc5MiwxNCArNzc2LDIwIEBACiAJbWx4NV9pYl9kYmcoZGV2LCAiYWRkciAweCVsbHgsIHNpemUgJXUsIG5wYWdlcyAlZCwgcGFnZV9zaGlmdCAlZCwgbmNvbnQgJWRcbiIsCiAJCSAgICB1Y21kLmJ1Zl9hZGRyLCBlbnRyaWVzICogdWNtZC5jcWVfc2l6ZSwgbnBhZ2VzLCBwYWdlX3NoaWZ0LCBuY29udCk7CiAKLQkqaW5sZW4gPSBzaXplb2YoKipjcWIpICsgc2l6ZW9mKCooKmNxYiktPnBhcykgKiBuY29udDsKKwkqaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKGNyZWF0ZV9jcV9pbikgKworCQkgTUxYNV9GTERfU1pfQllURVMoY3JlYXRlX2NxX2luLCBwYXNbMF0pICogbmNvbnQ7CiAJKmNxYiA9IG1seDVfdnphbGxvYygqaW5sZW4pOwogCWlmICghKmNxYikgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9kYjsKIAl9Ci0JbWx4NV9pYl9wb3B1bGF0ZV9wYXMoZGV2LCBjcS0+YnVmLnVtZW0sIHBhZ2Vfc2hpZnQsICgqY3FiKS0+cGFzLCAwKTsKLQkoKmNxYiktPmN0eC5sb2dfcGdfc3ogPSBwYWdlX3NoaWZ0IC0gTUxYNV9BREFQVEVSX1BBR0VfU0hJRlQ7CisKKwlwYXMgPSAoX19iZTY0ICopTUxYNV9BRERSX09GKGNyZWF0ZV9jcV9pbiwgKmNxYiwgcGFzKTsKKwltbHg1X2liX3BvcHVsYXRlX3BhcyhkZXYsIGNxLT5idWYudW1lbSwgcGFnZV9zaGlmdCwgcGFzLCAwKTsKKworCWNxYyA9IE1MWDVfQUREUl9PRihjcmVhdGVfY3FfaW4sICpjcWIsIGNxX2NvbnRleHQpOworCU1MWDVfU0VUKGNxYywgY3FjLCBsb2dfcGFnZV9zaXplLAorCQkgcGFnZV9zaGlmdCAtIE1MWDVfQURBUFRFUl9QQUdFX1NISUZUKTsKIAogCSppbmRleCA9IHRvX211Y29udGV4dChjb250ZXh0KS0+dXVhcmkudWFyc1swXS5pbmRleDsKIApAQCAtODM0LDkgKzgyNCwxMCBAQAogCiBzdGF0aWMgaW50IGNyZWF0ZV9jcV9rZXJuZWwoc3RydWN0IG1seDVfaWJfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2liX2NxICpjcSwKIAkJCSAgICBpbnQgZW50cmllcywgaW50IGNxZV9zaXplLAotCQkJICAgIHN0cnVjdCBtbHg1X2NyZWF0ZV9jcV9tYm94X2luICoqY3FiLAotCQkJICAgIGludCAqaW5kZXgsIGludCAqaW5sZW4pCisJCQkgICAgdTMyICoqY3FiLCBpbnQgKmluZGV4LCBpbnQgKmlubGVuKQogeworCV9fYmU2NCAqcGFzOworCXZvaWQgKmNxYzsKIAlpbnQgZXJyOwogCiAJZXJyID0gbWx4NV9kYl9hbGxvYyhkZXYtPm1kZXYsICZjcS0+ZGIpOwpAQCAtODUzLDE1ICs4NDQsMjEgQEAKIAogCWluaXRfY3FfYnVmKGNxLCAmY3EtPmJ1Zik7CiAKLQkqaW5sZW4gPSBzaXplb2YoKipjcWIpICsgc2l6ZW9mKCooKmNxYiktPnBhcykgKiBjcS0+YnVmLmJ1Zi5ucGFnZXM7CisJKmlubGVuID0gTUxYNV9TVF9TWl9CWVRFUyhjcmVhdGVfY3FfaW4pICsKKwkJIE1MWDVfRkxEX1NaX0JZVEVTKGNyZWF0ZV9jcV9pbiwgcGFzWzBdKSAqIGNxLT5idWYuYnVmLm5wYWdlczsKIAkqY3FiID0gbWx4NV92emFsbG9jKCppbmxlbik7CiAJaWYgKCEqY3FiKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2J1ZjsKIAl9Ci0JbWx4NV9maWxsX3BhZ2VfYXJyYXkoJmNxLT5idWYuYnVmLCAoKmNxYiktPnBhcyk7CiAKLQkoKmNxYiktPmN0eC5sb2dfcGdfc3ogPSBjcS0+YnVmLmJ1Zi5wYWdlX3NoaWZ0IC0gTUxYNV9BREFQVEVSX1BBR0VfU0hJRlQ7CisJcGFzID0gKF9fYmU2NCAqKU1MWDVfQUREUl9PRihjcmVhdGVfY3FfaW4sICpjcWIsIHBhcyk7CisJbWx4NV9maWxsX3BhZ2VfYXJyYXkoJmNxLT5idWYuYnVmLCBwYXMpOworCisJY3FjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9jcV9pbiwgKmNxYiwgY3FfY29udGV4dCk7CisJTUxYNV9TRVQoY3FjLCBjcWMsIGxvZ19wYWdlX3NpemUsCisJCSBjcS0+YnVmLmJ1Zi5wYWdlX3NoaWZ0IC0gTUxYNV9BREFQVEVSX1BBR0VfU0hJRlQpOworCiAJKmluZGV4ID0gZGV2LT5tZGV2LT5wcml2LnV1YXJpLnVhcnNbMF0uaW5kZXg7CiAKIAlyZXR1cm4gMDsKQEAgLTg5NSwxMSArODkyLDEyIEBACiB7CiAJaW50IGVudHJpZXMgPSBhdHRyLT5jcWU7CiAJaW50IHZlY3RvciA9IGF0dHItPmNvbXBfdmVjdG9yOwotCXN0cnVjdCBtbHg1X2NyZWF0ZV9jcV9tYm94X2luICpjcWIgPSBOVUxMOwogCXN0cnVjdCBtbHg1X2liX2RldiAqZGV2ID0gdG9fbWRldihpYmRldik7CiAJc3RydWN0IG1seDVfaWJfY3EgKmNxOwogCWludCB1bmluaXRpYWxpemVkX3ZhcihpbmRleCk7CiAJaW50IHVuaW5pdGlhbGl6ZWRfdmFyKGlubGVuKTsKKwl1MzIgKmNxYiA9IE5VTEw7CisJdm9pZCAqY3FjOwogCWludCBjcWVfc2l6ZTsKIAl1bnNpZ25lZCBpbnQgaXJxbjsKIAlpbnQgZXFuOwpAQCAtOTQ1LDE5ICs5NDMsMjAgQEAKIAkJSU5JVF9XT1JLKCZjcS0+bm90aWZ5X3dvcmssIG5vdGlmeV9zb2Z0X3djX2hhbmRsZXIpOwogCX0KIAotCWNxLT5jcWVfc2l6ZSA9IGNxZV9zaXplOwotCWNxYi0+Y3R4LmNxZV9zel9mbGFncyA9IGNxZV9zel90b19tbHhfc3ooY3FlX3NpemUpIDw8IDU7Ci0KLQlpZiAoY3EtPmNyZWF0ZV9mbGFncyAmIElCX0NRX0ZMQUdTX0lHTk9SRV9PVkVSUlVOKQotCQljcWItPmN0eC5jcWVfc3pfZmxhZ3MgfD0gKDEgPDwgMSk7Ci0KLQljcWItPmN0eC5sb2dfc3pfdXNyX3BhZ2UgPSBjcHVfdG9fYmUzMigoaWxvZzIoZW50cmllcykgPDwgMjQpIHwgaW5kZXgpOwogCWVyciA9IG1seDVfdmVjdG9yMmVxbihkZXYtPm1kZXYsIHZlY3RvciwgJmVxbiwgJmlycW4pOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2NxYjsKIAotCWNxYi0+Y3R4LmNfZXFuID0gY3B1X3RvX2JlMTYoZXFuKTsKLQljcWItPmN0eC5kYl9yZWNvcmRfYWRkciA9IGNwdV90b19iZTY0KGNxLT5kYi5kbWEpOworCWNxLT5jcWVfc2l6ZSA9IGNxZV9zaXplOworCisJY3FjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9jcV9pbiwgY3FiLCBjcV9jb250ZXh0KTsKKwlNTFg1X1NFVChjcWMsIGNxYywgY3FlX3N6LCBjcWVfc3pfdG9fbWx4X3N6KGNxZV9zaXplKSk7CisJTUxYNV9TRVQoY3FjLCBjcWMsIGxvZ19jcV9zaXplLCBpbG9nMihlbnRyaWVzKSk7CisJTUxYNV9TRVQoY3FjLCBjcWMsIHVhcl9wYWdlLCBpbmRleCk7CisJTUxYNV9TRVQoY3FjLCBjcWMsIGNfZXFuLCBlcW4pOworCU1MWDVfU0VUNjQoY3FjLCBjcWMsIGRicl9hZGRyLCBjcS0+ZGIuZG1hKTsKKwlpZiAoY3EtPmNyZWF0ZV9mbGFncyAmIElCX0NRX0ZMQUdTX0lHTk9SRV9PVkVSUlVOKQorCQlNTFg1X1NFVChjcWMsIGNxYywgb2ksIDEpOwogCiAJZXJyID0gbWx4NV9jb3JlX2NyZWF0ZV9jcShkZXYtPm1kZXYsICZjcS0+bWNxLCBjcWIsIGlubGVuKTsKIAlpZiAoZXJyKQpAQCAtMTA4OCwyNyArMTA4NywxNSBAQAogCiBpbnQgbWx4NV9pYl9tb2RpZnlfY3Eoc3RydWN0IGliX2NxICpjcSwgdTE2IGNxX2NvdW50LCB1MTYgY3FfcGVyaW9kKQogewotCXN0cnVjdCBtbHg1X21vZGlmeV9jcV9tYm94X2luICppbjsKIAlzdHJ1Y3QgbWx4NV9pYl9kZXYgKmRldiA9IHRvX21kZXYoY3EtPmRldmljZSk7CiAJc3RydWN0IG1seDVfaWJfY3EgKm1jcSA9IHRvX21jcShjcSk7CiAJaW50IGVycjsKLQl1MzIgZnNlbDsKIAogCWlmICghTUxYNV9DQVBfR0VOKGRldi0+bWRldiwgY3FfbW9kZXJhdGlvbikpCiAJCXJldHVybiAtRU5PU1lTOwogCi0JaW4gPSBremFsbG9jKHNpemVvZigqaW4pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWluKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWluLT5jcW4gPSBjcHVfdG9fYmUzMihtY3EtPm1jcS5jcW4pOwotCWZzZWwgPSAoTUxYNV9DUV9NT0RJRllfUEVSSU9EIHwgTUxYNV9DUV9NT0RJRllfQ09VTlQpOwotCWluLT5jdHguY3FfcGVyaW9kID0gY3B1X3RvX2JlMTYoY3FfcGVyaW9kKTsKLQlpbi0+Y3R4LmNxX21heF9jb3VudCA9IGNwdV90b19iZTE2KGNxX2NvdW50KTsKLQlpbi0+ZmllbGRfc2VsZWN0ID0gY3B1X3RvX2JlMzIoZnNlbCk7Ci0JZXJyID0gbWx4NV9jb3JlX21vZGlmeV9jcShkZXYtPm1kZXYsICZtY3EtPm1jcSwgaW4sIHNpemVvZigqaW4pKTsKLQlrZnJlZShpbik7Ci0KKwllcnIgPSBtbHg1X2NvcmVfbW9kaWZ5X2NxX21vZGVyYXRpb24oZGV2LT5tZGV2LCAmbWNxLT5tY3EsCisJCQkJCSAgICAgY3FfcGVyaW9kLCBjcV9jb3VudCk7CiAJaWYgKGVycikKIAkJbWx4NV9pYl93YXJuKGRldiwgIm1vZGlmeSBjcSAweCV4IGZhaWxlZFxuIiwgbWNxLT5tY3EuY3FuKTsKIApAQCAtMTI0MSw5ICsxMjI4LDExIEBACiB7CiAJc3RydWN0IG1seDVfaWJfZGV2ICpkZXYgPSB0b19tZGV2KGliY3EtPmRldmljZSk7CiAJc3RydWN0IG1seDVfaWJfY3EgKmNxID0gdG9fbWNxKGliY3EpOwotCXN0cnVjdCBtbHg1X21vZGlmeV9jcV9tYm94X2luICppbjsKKwl2b2lkICpjcWM7CisJdTMyICppbjsKIAlpbnQgZXJyOwogCWludCBucGFzOworCV9fYmU2NCAqcGFzOwogCWludCBwYWdlX3NoaWZ0OwogCWludCBpbmxlbjsKIAlpbnQgdW5pbml0aWFsaXplZF92YXIoY3FlX3NpemUpOwpAQCAtMTI4NSwyOCArMTI3NCwzNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXg7CiAKLQlpbmxlbiA9IHNpemVvZigqaW4pICsgbnBhcyAqIHNpemVvZihpbi0+cGFzWzBdKTsKKwlpbmxlbiA9IE1MWDVfU1RfU1pfQllURVMobW9kaWZ5X2NxX2luKSArCisJCU1MWDVfRkxEX1NaX0JZVEVTKG1vZGlmeV9jcV9pbiwgcGFzWzBdKSAqIG5wYXM7CisKIAlpbiA9IG1seDVfdnphbGxvYyhpbmxlbik7CiAJaWYgKCFpbikgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGV4X3Jlc2l6ZTsKIAl9CiAKKwlwYXMgPSAoX19iZTY0ICopTUxYNV9BRERSX09GKG1vZGlmeV9jcV9pbiwgaW4sIHBhcyk7CiAJaWYgKHVkYXRhKQogCQltbHg1X2liX3BvcHVsYXRlX3BhcyhkZXYsIGNxLT5yZXNpemVfdW1lbSwgcGFnZV9zaGlmdCwKLQkJCQkgICAgIGluLT5wYXMsIDApOworCQkJCSAgICAgcGFzLCAwKTsKIAllbHNlCi0JCW1seDVfZmlsbF9wYWdlX2FycmF5KCZjcS0+cmVzaXplX2J1Zi0+YnVmLCBpbi0+cGFzKTsKKwkJbWx4NV9maWxsX3BhZ2VfYXJyYXkoJmNxLT5yZXNpemVfYnVmLT5idWYsIHBhcyk7CiAKLQlpbi0+ZmllbGRfc2VsZWN0ID0gY3B1X3RvX2JlMzIoTUxYNV9NT0RJRllfQ1FfTUFTS19MT0dfU0laRSAgfAotCQkJCSAgICAgICBNTFg1X01PRElGWV9DUV9NQVNLX1BHX09GRlNFVCB8Ci0JCQkJICAgICAgIE1MWDVfTU9ESUZZX0NRX01BU0tfUEdfU0laRSk7Ci0JaW4tPmN0eC5sb2dfcGdfc3ogPSBwYWdlX3NoaWZ0IC0gTUxYNV9BREFQVEVSX1BBR0VfU0hJRlQ7Ci0JaW4tPmN0eC5jcWVfc3pfZmxhZ3MgPSBjcWVfc3pfdG9fbWx4X3N6KGNxZV9zaXplKSA8PCA1OwotCWluLT5jdHgucGFnZV9vZmZzZXQgPSAwOwotCWluLT5jdHgubG9nX3N6X3Vzcl9wYWdlID0gY3B1X3RvX2JlMzIoaWxvZzIoZW50cmllcykgPDwgMjQpOwotCWluLT5oZHIub3Btb2QgPSBjcHVfdG9fYmUxNihNTFg1X0NRX09QTU9EX1JFU0laRSk7Ci0JaW4tPmNxbiA9IGNwdV90b19iZTMyKGNxLT5tY3EuY3FuKTsKKwlNTFg1X1NFVChtb2RpZnlfY3FfaW4sIGluLAorCQkgbW9kaWZ5X2ZpZWxkX3NlbGVjdF9yZXNpemVfZmllbGRfc2VsZWN0LnJlc2l6ZV9maWVsZF9zZWxlY3QucmVzaXplX2ZpZWxkX3NlbGVjdCwKKwkJIE1MWDVfTU9ESUZZX0NRX01BU0tfTE9HX1NJWkUgIHwKKwkJIE1MWDVfTU9ESUZZX0NRX01BU0tfUEdfT0ZGU0VUIHwKKwkJIE1MWDVfTU9ESUZZX0NRX01BU0tfUEdfU0laRSk7CisKKwljcWMgPSBNTFg1X0FERFJfT0YobW9kaWZ5X2NxX2luLCBpbiwgY3FfY29udGV4dCk7CisKKwlNTFg1X1NFVChjcWMsIGNxYywgbG9nX3BhZ2Vfc2l6ZSwKKwkJIHBhZ2Vfc2hpZnQgLSBNTFg1X0FEQVBURVJfUEFHRV9TSElGVCk7CisJTUxYNV9TRVQoY3FjLCBjcWMsIGNxZV9zeiwgY3FlX3N6X3RvX21seF9zeihjcWVfc2l6ZSkpOworCU1MWDVfU0VUKGNxYywgY3FjLCBsb2dfY3Ffc2l6ZSwgaWxvZzIoZW50cmllcykpOworCisJTUxYNV9TRVQobW9kaWZ5X2NxX2luLCBpbiwgb3BfbW9kLCBNTFg1X0NRX09QTU9EX1JFU0laRSk7CisJTUxYNV9TRVQobW9kaWZ5X2NxX2luLCBpbiwgY3FuLCBjcS0+bWNxLmNxbik7CiAKIAllcnIgPSBtbHg1X2NvcmVfbW9kaWZ5X2NxKGRldi0+bWRldiwgJmNxLT5tY3EsIGluLCBpbmxlbik7CiAJaWYgKGVycikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21haW4uYwppbmRleCBhODRiYjc2Li41NTFhYTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvbWFpbi5jCkBAIC0zNyw3ICszNyw2IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8tbWFwcGluZy5oPgogI2lmIGRlZmluZWQoQ09ORklHX1g4NikKICNpbmNsdWRlIDxhc20vcGF0Lmg+CiAjZW5kaWYKQEAgLTIzMywyMyArMjMyLDE5IEBACiAJCQkgY29uc3QgdW5pb24gaWJfZ2lkICpnaWQsCiAJCQkgY29uc3Qgc3RydWN0IGliX2dpZF9hdHRyICphdHRyKQogewotCXN0cnVjdCBtbHg1X2liX2RldiAqZGV2CT0gdG9fbWRldihkZXZpY2UpOwotCXUzMiAgaW5bTUxYNV9TVF9TWl9EVyhzZXRfcm9jZV9hZGRyZXNzX2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKHNldF9yb2NlX2FkZHJlc3Nfb3V0KV07CisJc3RydWN0IG1seDVfaWJfZGV2ICpkZXYgPSB0b19tZGV2KGRldmljZSk7CisJdTMyICBpbltNTFg1X1NUX1NaX0RXKHNldF9yb2NlX2FkZHJlc3NfaW4pXSAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHNldF9yb2NlX2FkZHJlc3Nfb3V0KV0gPSB7MH07CiAJdm9pZCAqaW5fYWRkciA9IE1MWDVfQUREUl9PRihzZXRfcm9jZV9hZGRyZXNzX2luLCBpbiwgcm9jZV9hZGRyZXNzKTsKIAllbnVtIHJkbWFfbGlua19sYXllciBsbCA9IG1seDVfaWJfcG9ydF9saW5rX2xheWVyKGRldmljZSwgcG9ydF9udW0pOwogCiAJaWYgKGxsICE9IElCX0xJTktfTEFZRVJfRVRIRVJORVQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQogCWliX2dpZF90b19tbHg1X3JvY2VfYWRkcihnaWQsIGF0dHIsIGluX2FkZHIpOwogCiAJTUxYNV9TRVQoc2V0X3JvY2VfYWRkcmVzc19pbiwgaW4sIHJvY2VfYWRkcmVzc19pbmRleCwgaW5kZXgpOwogCU1MWDVfU0VUKHNldF9yb2NlX2FkZHJlc3NfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX1NFVF9ST0NFX0FERFJFU1MpOwotCi0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwogCXJldHVybiBtbHg1X2NtZF9leGVjKGRldi0+bWRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCkBAIC0yODksNyArMjg0LDkgQEAKIAogc3RhdGljIGludCBtbHg1X3VzZV9tYWRfaWZjKHN0cnVjdCBtbHg1X2liX2RldiAqZGV2KQogewotCXJldHVybiAhTUxYNV9DQVBfR0VOKGRldi0+bWRldiwgaWJfdmlydCk7CisJaWYgKE1MWDVfQ0FQX0dFTihkZXYtPm1kZXYsIHBvcnRfdHlwZSkgPT0gTUxYNV9DQVBfUE9SVF9UWVBFX0lCKQorCQlyZXR1cm4gIU1MWDVfQ0FQX0dFTihkZXYtPm1kZXYsIGliX3ZpcnQpOworCXJldHVybiAwOwogfQogCiBlbnVtIHsKQEAgLTc1Miw4ICs3NDksNyBAQAogCQkJCSAgICAgJnByb3BzLT5hY3RpdmVfd2lkdGgpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWVyciA9IG1seDVfcXVlcnlfcG9ydF9wcm90b19vcGVyKG1kZXYsICZwcm9wcy0+YWN0aXZlX3NwZWVkLCBNTFg1X1BUWVNfSUIsCi0JCQkJCSBwb3J0KTsKKwllcnIgPSBtbHg1X3F1ZXJ5X3BvcnRfaWJfcHJvdG9fb3BlcihtZGV2LCAmcHJvcHMtPmFjdGl2ZV9zcGVlZCwgcG9ydCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTE0MjksNiArMTQyNSwxMyBAQAogCQkJCQkgICAgIGRtYWNfNDdfMTYpLAogCQkJCWliX3NwZWMtPmV0aC52YWwuZHN0X21hYyk7CiAKKwkJZXRoZXJfYWRkcl9jb3B5KE1MWDVfQUREUl9PRihmdGVfbWF0Y2hfc2V0X2x5cl8yXzQsIG91dGVyX2hlYWRlcnNfYywKKwkJCQkJICAgICBzbWFjXzQ3XzE2KSwKKwkJCQlpYl9zcGVjLT5ldGgubWFzay5zcmNfbWFjKTsKKwkJZXRoZXJfYWRkcl9jb3B5KE1MWDVfQUREUl9PRihmdGVfbWF0Y2hfc2V0X2x5cl8yXzQsIG91dGVyX2hlYWRlcnNfdiwKKwkJCQkJICAgICBzbWFjXzQ3XzE2KSwKKwkJCQlpYl9zcGVjLT5ldGgudmFsLnNyY19tYWMpOworCiAJCWlmIChpYl9zcGVjLT5ldGgubWFzay52bGFuX3RhZykgewogCQkJTUxYNV9TRVQoZnRlX21hdGNoX3NldF9seXJfMl80LCBvdXRlcl9oZWFkZXJzX2MsCiAJCQkJIHZsYW5fdGFnLCAxKTsKQEAgLTE4NTAsNiArMTg1Myw3IEBACiAJCQkJCSAgIGludCBkb21haW4pCiB7CiAJc3RydWN0IG1seDVfaWJfZGV2ICpkZXYgPSB0b19tZGV2KHFwLT5kZXZpY2UpOworCXN0cnVjdCBtbHg1X2liX3FwICptcXAgPSB0b19tcXAocXApOwogCXN0cnVjdCBtbHg1X2liX2Zsb3dfaGFuZGxlciAqaGFuZGxlciA9IE5VTEw7CiAJc3RydWN0IG1seDVfZmxvd19kZXN0aW5hdGlvbiAqZHN0ID0gTlVMTDsKIAlzdHJ1Y3QgbWx4NV9pYl9mbG93X3ByaW8gKmZ0X3ByaW87CkBAIC0xODc2LDcgKzE4ODAsMTAgQEAKIAl9CiAKIAlkc3QtPnR5cGUgPSBNTFg1X0ZMT1dfREVTVElOQVRJT05fVFlQRV9USVI7Ci0JZHN0LT50aXJfbnVtID0gdG9fbXFwKHFwKS0+cmF3X3BhY2tldF9xcC5ycS50aXJuOworCWlmIChtcXAtPmZsYWdzICYgTUxYNV9JQl9RUF9SU1MpCisJCWRzdC0+dGlyX251bSA9IG1xcC0+cnNzX3FwLnRpcm47CisJZWxzZQorCQlkc3QtPnRpcl9udW0gPSBtcXAtPnJhd19wYWNrZXRfcXAucnEudGlybjsKIAogCWlmIChmbG93X2F0dHItPnR5cGUgPT0gSUJfRkxPV19BVFRSX05PUk1BTCkgewogCQlpZiAoZmxvd19hdHRyLT5mbGFncyAmIElCX0ZMT1dfQVRUUl9GTEFHU19ET05UX1RSQVApICB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tZW0uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21lbS5jCmluZGV4IDQwZGYyY2MuLjk5NmI1NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21lbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21lbS5jCkBAIC03MSw3ICs3MSw3IEBACiAKIAlhZGRyID0gYWRkciA+PiBwYWdlX3NoaWZ0OwogCXRtcCA9ICh1bnNpZ25lZCBsb25nKWFkZHI7Ci0JbSA9IGZpbmRfZmlyc3RfYml0KCZ0bXAsIHNpemVvZih0bXApKTsKKwltID0gZmluZF9maXJzdF9iaXQoJnRtcCwgQklUU19QRVJfTE9ORyk7CiAJc2tpcCA9IDEgPDwgbTsKIAltYXNrID0gc2tpcCAtIDE7CiAJaSA9IDA7CkBAIC04MSw3ICs4MSw3IEBACiAJCWZvciAoayA9IDA7IGsgPCBsZW47IGsrKykgewogCQkJaWYgKCEoaSAmIG1hc2spKSB7CiAJCQkJdG1wID0gKHVuc2lnbmVkIGxvbmcpcGZuOwotCQkJCW0gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBtLCBmaW5kX2ZpcnN0X2JpdCgmdG1wLCBzaXplb2YodG1wKSkpOworCQkJCW0gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBtLCBmaW5kX2ZpcnN0X2JpdCgmdG1wLCBCSVRTX1BFUl9MT05HKSk7CiAJCQkJc2tpcCA9IDEgPDwgbTsKIAkJCQltYXNrID0gc2tpcCAtIDE7CiAJCQkJYmFzZSA9IHBmbjsKQEAgLTg5LDcgKzg5LDcgQEAKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKGJhc2UgKyBwICE9IHBmbikgewogCQkJCQl0bXAgPSAodW5zaWduZWQgbG9uZylwOwotCQkJCQltID0gZmluZF9maXJzdF9iaXQoJnRtcCwgc2l6ZW9mKHRtcCkpOworCQkJCQltID0gZmluZF9maXJzdF9iaXQoJnRtcCwgQklUU19QRVJfTE9ORyk7CiAJCQkJCXNraXAgPSAxIDw8IG07CiAJCQkJCW1hc2sgPSBza2lwIC0gMTsKIAkJCQkJYmFzZSA9IHBmbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21seDVfaWIuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21seDVfaWIuaAppbmRleCAzNzIzODVkLi42N2NjNzQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tbHg1X2liLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvbWx4NV9pYi5oCkBAIC00MDIsNiArNDAyLDcgQEAKIAkvKiBRUCB1c2VzIDEgYXMgaXRzIHNvdXJjZSBRUCBudW1iZXIgKi8KIAlNTFg1X0lCX1FQX1NRUE5fUVAxCQkJPSAxIDw8IDYsCiAJTUxYNV9JQl9RUF9DQVBfU0NBVFRFUl9GQ1MJCT0gMSA8PCA3LAorCU1MWDVfSUJfUVBfUlNTCQkJCT0gMSA8PCA4LAogfTsKIAogc3RydWN0IG1seDVfdW1yX3dyIHsKQEAgLTUwNCw3ICs1MDUsNyBAQAogCWludAkJCXVtcmVkOwogCWludAkJCW5wYWdlczsKIAlzdHJ1Y3QgbWx4NV9pYl9kZXYgICAgICpkZXY7Ci0Jc3RydWN0IG1seDVfY3JlYXRlX21rZXlfbWJveF9vdXQgb3V0OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfbWtleV9vdXQpXTsKIAlzdHJ1Y3QgbWx4NV9jb3JlX3NpZ19jdHggICAgKnNpZzsKIAlpbnQJCQlsaXZlOwogCXZvaWQJCQkqZGVzY3NfYWxsb2M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvbXIuYwppbmRleCA0YjAyMTMwLi42ZjdlMzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21yLmMKQEAgLTEzNSwyMCArMTM1LDEwIEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAobXItPm91dC5oZHIuc3RhdHVzKSB7Ci0JCW1seDVfaWJfd2FybihkZXYsICJmYWlsZWQgLSBzdGF0dXMgJWQsIHN5bmRvcm1lIDB4JXhcbiIsCi0JCQkgICAgIG1yLT5vdXQuaGRyLnN0YXR1cywKLQkJCSAgICAgYmUzMl90b19jcHUobXItPm91dC5oZHIuc3luZHJvbWUpKTsKLQkJa2ZyZWUobXIpOwotCQlkZXYtPmZpbGxfZGVsYXkgPSAxOwotCQltb2RfdGltZXIoJmRldi0+ZGVsYXlfdGltZXIsIGppZmZpZXMgKyBIWik7Ci0JCXJldHVybjsKLQl9Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5tZGV2LT5wcml2Lm1rZXlfbG9jaywgZmxhZ3MpOwogCWtleSA9IGRldi0+bWRldi0+cHJpdi5ta2V5X2tleSsrOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bWRldi0+cHJpdi5ta2V5X2xvY2ssIGZsYWdzKTsKLQltci0+bW1rZXkua2V5ID0gbWx4NV9pZHhfdG9fbWtleShiZTMyX3RvX2NwdShtci0+b3V0Lm1rZXkpICYgMHhmZmZmZmYpIHwga2V5OworCW1yLT5tbWtleS5rZXkgPSBtbHg1X2lkeF90b19ta2V5KE1MWDVfR0VUKGNyZWF0ZV9ta2V5X291dCwgbXItPm91dCwgbWtleV9pbmRleCkpIHwga2V5OwogCiAJY2FjaGUtPmxhc3RfYWRkID0gamlmZmllczsKIApAQCAtMTcwLDE2ICsxNjAsMTkgQEAKIHsKIAlzdHJ1Y3QgbWx4NV9tcl9jYWNoZSAqY2FjaGUgPSAmZGV2LT5jYWNoZTsKIAlzdHJ1Y3QgbWx4NV9jYWNoZV9lbnQgKmVudCA9ICZjYWNoZS0+ZW50W2NdOwotCXN0cnVjdCBtbHg1X2NyZWF0ZV9ta2V5X21ib3hfaW4gKmluOworCWludCBpbmxlbiA9IE1MWDVfU1RfU1pfQllURVMoY3JlYXRlX21rZXlfaW4pOwogCXN0cnVjdCBtbHg1X2liX21yICptcjsKIAlpbnQgbnBhZ2VzID0gMSA8PCBlbnQtPm9yZGVyOworCXZvaWQgKm1rYzsKKwl1MzIgKmluOwogCWludCBlcnIgPSAwOwogCWludCBpOwogCi0JaW4gPSBremFsbG9jKHNpemVvZigqaW4pLCBHRlBfS0VSTkVMKTsKKwlpbiA9IGt6YWxsb2MoaW5sZW4sIEdGUF9LRVJORUwpOwogCWlmICghaW4pCiAJCXJldHVybiAtRU5PTUVNOwogCisJbWtjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9ta2V5X2luLCBpbiwgbWVtb3J5X2tleV9ta2V5X2VudHJ5KTsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKIAkJaWYgKGVudC0+cGVuZGluZyA+PSBNQVhfUEVORElOR19SRUdfTVIpIHsKIAkJCWVyciA9IC1FQUdBSU47CkBAIC0xOTQsMTggKzE4NywyMiBAQAogCQltci0+b3JkZXIgPSBlbnQtPm9yZGVyOwogCQltci0+dW1yZWQgPSAxOwogCQltci0+ZGV2ID0gZGV2OwotCQlpbi0+c2VnLnN0YXR1cyA9IE1MWDVfTUtFWV9TVEFUVVNfRlJFRTsKLQkJaW4tPnNlZy54bHRfb2N0X3NpemUgPSBjcHVfdG9fYmUzMigobnBhZ2VzICsgMSkgLyAyKTsKLQkJaW4tPnNlZy5xcG5fbWtleTdfMCA9IGNwdV90b19iZTMyKDB4ZmZmZmZmIDw8IDgpOwotCQlpbi0+c2VnLmZsYWdzID0gTUxYNV9BQ0NFU1NfTU9ERV9NVFQgfCBNTFg1X1BFUk1fVU1SX0VOOwotCQlpbi0+c2VnLmxvZzJfcGFnZV9zaXplID0gMTI7CisKKwkJTUxYNV9TRVQobWtjLCBta2MsIGZyZWUsIDEpOworCQlNTFg1X1NFVChta2MsIG1rYywgdW1yX2VuLCAxKTsKKwkJTUxYNV9TRVQobWtjLCBta2MsIGFjY2Vzc19tb2RlLCBNTFg1X01LQ19BQ0NFU1NfTU9ERV9NVFQpOworCisJCU1MWDVfU0VUKG1rYywgbWtjLCBxcG4sIDB4ZmZmZmZmKTsKKwkJTUxYNV9TRVQobWtjLCBta2MsIHRyYW5zbGF0aW9uc19vY3R3b3JkX3NpemUsIChucGFnZXMgKyAxKSAvIDIpOworCQlNTFg1X1NFVChta2MsIG1rYywgbG9nX3BhZ2Vfc2l6ZSwgMTIpOwogCiAJCXNwaW5fbG9ja19pcnEoJmVudC0+bG9jayk7CiAJCWVudC0+cGVuZGluZysrOwogCQlzcGluX3VubG9ja19pcnEoJmVudC0+bG9jayk7Ci0JCWVyciA9IG1seDVfY29yZV9jcmVhdGVfbWtleShkZXYtPm1kZXYsICZtci0+bW1rZXksIGluLAotCQkJCQkgICAgc2l6ZW9mKCppbiksIHJlZ19tcl9jYWxsYmFjaywKLQkJCQkJICAgIG1yLCAmbXItPm91dCk7CisJCWVyciA9IG1seDVfY29yZV9jcmVhdGVfbWtleV9jYihkZXYtPm1kZXYsICZtci0+bW1rZXksCisJCQkJCSAgICAgICBpbiwgaW5sZW4sCisJCQkJCSAgICAgICBtci0+b3V0LCBzaXplb2YobXItPm91dCksCisJCQkJCSAgICAgICByZWdfbXJfY2FsbGJhY2ssIG1yKTsKIAkJaWYgKGVycikgewogCQkJc3Bpbl9sb2NrX2lycSgmZW50LT5sb2NrKTsKIAkJCWVudC0+cGVuZGluZy0tOwpAQCAtNjcwLDMwICs2NjcsMzggQEAKIHN0cnVjdCBpYl9tciAqbWx4NV9pYl9nZXRfZG1hX21yKHN0cnVjdCBpYl9wZCAqcGQsIGludCBhY2MpCiB7CiAJc3RydWN0IG1seDVfaWJfZGV2ICpkZXYgPSB0b19tZGV2KHBkLT5kZXZpY2UpOworCWludCBpbmxlbiA9IE1MWDVfU1RfU1pfQllURVMoY3JlYXRlX21rZXlfaW4pOwogCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2ID0gZGV2LT5tZGV2OwotCXN0cnVjdCBtbHg1X2NyZWF0ZV9ta2V5X21ib3hfaW4gKmluOwotCXN0cnVjdCBtbHg1X21rZXlfc2VnICpzZWc7CiAJc3RydWN0IG1seDVfaWJfbXIgKm1yOworCXZvaWQgKm1rYzsKKwl1MzIgKmluOwogCWludCBlcnI7CiAKIAltciA9IGt6YWxsb2Moc2l6ZW9mKCptciksIEdGUF9LRVJORUwpOwogCWlmICghbXIpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JaW4gPSBremFsbG9jKHNpemVvZigqaW4pLCBHRlBfS0VSTkVMKTsKKwlpbiA9IGt6YWxsb2MoaW5sZW4sIEdGUF9LRVJORUwpOwogCWlmICghaW4pIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKLQlzZWcgPSAmaW4tPnNlZzsKLQlzZWctPmZsYWdzID0gY29udmVydF9hY2Nlc3MoYWNjKSB8IE1MWDVfQUNDRVNTX01PREVfUEE7Ci0Jc2VnLT5mbGFnc19wZCA9IGNwdV90b19iZTMyKHRvX21wZChwZCktPnBkbiB8IE1MWDVfTUtFWV9MRU42NCk7Ci0Jc2VnLT5xcG5fbWtleTdfMCA9IGNwdV90b19iZTMyKDB4ZmZmZmZmIDw8IDgpOwotCXNlZy0+c3RhcnRfYWRkciA9IDA7CisJbWtjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9ta2V5X2luLCBpbiwgbWVtb3J5X2tleV9ta2V5X2VudHJ5KTsKIAotCWVyciA9IG1seDVfY29yZV9jcmVhdGVfbWtleShtZGV2LCAmbXItPm1ta2V5LCBpbiwgc2l6ZW9mKCppbiksIE5VTEwsIE5VTEwsCi0JCQkJICAgIE5VTEwpOworCU1MWDVfU0VUKG1rYywgbWtjLCBhY2Nlc3NfbW9kZSwgTUxYNV9NS0NfQUNDRVNTX01PREVfUEEpOworCU1MWDVfU0VUKG1rYywgbWtjLCBhLCAhIShhY2MgJiBJQl9BQ0NFU1NfUkVNT1RFX0FUT01JQykpOworCU1MWDVfU0VUKG1rYywgbWtjLCBydywgISEoYWNjICYgSUJfQUNDRVNTX1JFTU9URV9XUklURSkpOworCU1MWDVfU0VUKG1rYywgbWtjLCByciwgISEoYWNjICYgSUJfQUNDRVNTX1JFTU9URV9SRUFEKSk7CisJTUxYNV9TRVQobWtjLCBta2MsIGx3LCAhIShhY2MgJiBJQl9BQ0NFU1NfTE9DQUxfV1JJVEUpKTsKKwlNTFg1X1NFVChta2MsIG1rYywgbHIsIDEpOworCisJTUxYNV9TRVQobWtjLCBta2MsIGxlbmd0aDY0LCAxKTsKKwlNTFg1X1NFVChta2MsIG1rYywgcGQsIHRvX21wZChwZCktPnBkbik7CisJTUxYNV9TRVQobWtjLCBta2MsIHFwbiwgMHhmZmZmZmYpOworCU1MWDVfU0VUNjQobWtjLCBta2MsIHN0YXJ0X2FkZHIsIDApOworCisJZXJyID0gbWx4NV9jb3JlX2NyZWF0ZV9ta2V5KG1kZXYsICZtci0+bW1rZXksIGluLCBpbmxlbik7CiAJaWYgKGVycikKIAkJZ290byBlcnJfaW47CiAKQEAgLTEwNjMsOSArMTA2OCwxMSBAQAogCQkJCSAgICAgaW50IHBhZ2Vfc2hpZnQsIGludCBhY2Nlc3NfZmxhZ3MpCiB7CiAJc3RydWN0IG1seDVfaWJfZGV2ICpkZXYgPSB0b19tZGV2KHBkLT5kZXZpY2UpOwotCXN0cnVjdCBtbHg1X2NyZWF0ZV9ta2V5X21ib3hfaW4gKmluOwogCXN0cnVjdCBtbHg1X2liX21yICptcjsKKwlfX2JlNjQgKnBhczsKKwl2b2lkICpta2M7CiAJaW50IGlubGVuOworCXUzMiAqaW47CiAJaW50IGVycjsKIAlib29sIHBnX2NhcCA9ICEhKE1MWDVfQ0FQX0dFTihkZXYtPm1kZXYsIHBnKSk7CiAKQEAgLTEwNzMsMzEgKzEwODAsNDEgQEAKIAlpZiAoIW1yKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCWlubGVuID0gc2l6ZW9mKCppbikgKyBzaXplb2YoKmluLT5wYXMpICogKChucGFnZXMgKyAxKSAvIDIpICogMjsKKwlpbmxlbiA9IE1MWDVfU1RfU1pfQllURVMoY3JlYXRlX21rZXlfaW4pICsKKwkJc2l6ZW9mKCpwYXMpICogKChucGFnZXMgKyAxKSAvIDIpICogMjsKIAlpbiA9IG1seDVfdnphbGxvYyhpbmxlbik7CiAJaWYgKCFpbikgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl8xOwogCX0KLQltbHg1X2liX3BvcHVsYXRlX3BhcyhkZXYsIHVtZW0sIHBhZ2Vfc2hpZnQsIGluLT5wYXMsCisJcGFzID0gKF9fYmU2NCAqKU1MWDVfQUREUl9PRihjcmVhdGVfbWtleV9pbiwgaW4sIGtsbV9wYXNfbXR0KTsKKwltbHg1X2liX3BvcHVsYXRlX3BhcyhkZXYsIHVtZW0sIHBhZ2Vfc2hpZnQsIHBhcywKIAkJCSAgICAgcGdfY2FwID8gTUxYNV9JQl9NVFRfUFJFU0VOVCA6IDApOwogCi0JLyogVGhlIE1MWDVfTUtFWV9JTkJPWF9QR19BQ0NFU1MgYml0IGFsbG93cyBzZXR0aW5nIHRoZSBhY2Nlc3MgZmxhZ3MKKwkvKiBUaGUgcGdfYWNjZXNzIGJpdCBhbGxvd3Mgc2V0dGluZyB0aGUgYWNjZXNzIGZsYWdzCiAJICogaW4gdGhlIHBhZ2UgbGlzdCBzdWJtaXR0ZWQgd2l0aCB0aGUgY29tbWFuZC4gKi8KLQlpbi0+ZmxhZ3MgPSBwZ19jYXAgPyBjcHVfdG9fYmUzMihNTFg1X01LRVlfSU5CT1hfUEdfQUNDRVNTKSA6IDA7Ci0JaW4tPnNlZy5mbGFncyA9IGNvbnZlcnRfYWNjZXNzKGFjY2Vzc19mbGFncykgfAotCQlNTFg1X0FDQ0VTU19NT0RFX01UVDsKLQlpbi0+c2VnLmZsYWdzX3BkID0gY3B1X3RvX2JlMzIodG9fbXBkKHBkKS0+cGRuKTsKLQlpbi0+c2VnLnN0YXJ0X2FkZHIgPSBjcHVfdG9fYmU2NCh2aXJ0X2FkZHIpOwotCWluLT5zZWcubGVuID0gY3B1X3RvX2JlNjQobGVuZ3RoKTsKLQlpbi0+c2VnLmJzZnNfb2N0b19zaXplID0gMDsKLQlpbi0+c2VnLnhsdF9vY3Rfc2l6ZSA9IGNwdV90b19iZTMyKGdldF9vY3RvX2xlbih2aXJ0X2FkZHIsIGxlbmd0aCwgMSA8PCBwYWdlX3NoaWZ0KSk7Ci0JaW4tPnNlZy5sb2cyX3BhZ2Vfc2l6ZSA9IHBhZ2Vfc2hpZnQ7Ci0JaW4tPnNlZy5xcG5fbWtleTdfMCA9IGNwdV90b19iZTMyKDB4ZmZmZmZmIDw8IDgpOwotCWluLT54bGF0X29jdF9hY3Rfc2l6ZSA9IGNwdV90b19iZTMyKGdldF9vY3RvX2xlbih2aXJ0X2FkZHIsIGxlbmd0aCwKLQkJCQkJCQkgMSA8PCBwYWdlX3NoaWZ0KSk7Ci0JZXJyID0gbWx4NV9jb3JlX2NyZWF0ZV9ta2V5KGRldi0+bWRldiwgJm1yLT5tbWtleSwgaW4sIGlubGVuLCBOVUxMLAotCQkJCSAgICBOVUxMLCBOVUxMKTsKKwlNTFg1X1NFVChjcmVhdGVfbWtleV9pbiwgaW4sIHBnX2FjY2VzcywgISEocGdfY2FwKSk7CisKKwlta2MgPSBNTFg1X0FERFJfT0YoY3JlYXRlX21rZXlfaW4sIGluLCBtZW1vcnlfa2V5X21rZXlfZW50cnkpOworCU1MWDVfU0VUKG1rYywgbWtjLCBhY2Nlc3NfbW9kZSwgTUxYNV9NS0NfQUNDRVNTX01PREVfTVRUKTsKKwlNTFg1X1NFVChta2MsIG1rYywgYSwgISEoYWNjZXNzX2ZsYWdzICYgSUJfQUNDRVNTX1JFTU9URV9BVE9NSUMpKTsKKwlNTFg1X1NFVChta2MsIG1rYywgcncsICEhKGFjY2Vzc19mbGFncyAmIElCX0FDQ0VTU19SRU1PVEVfV1JJVEUpKTsKKwlNTFg1X1NFVChta2MsIG1rYywgcnIsICEhKGFjY2Vzc19mbGFncyAmIElCX0FDQ0VTU19SRU1PVEVfUkVBRCkpOworCU1MWDVfU0VUKG1rYywgbWtjLCBsdywgISEoYWNjZXNzX2ZsYWdzICYgSUJfQUNDRVNTX0xPQ0FMX1dSSVRFKSk7CisJTUxYNV9TRVQobWtjLCBta2MsIGxyLCAxKTsKKworCU1MWDVfU0VUNjQobWtjLCBta2MsIHN0YXJ0X2FkZHIsIHZpcnRfYWRkcik7CisJTUxYNV9TRVQ2NChta2MsIG1rYywgbGVuLCBsZW5ndGgpOworCU1MWDVfU0VUKG1rYywgbWtjLCBwZCwgdG9fbXBkKHBkKS0+cGRuKTsKKwlNTFg1X1NFVChta2MsIG1rYywgYnNmX29jdHdvcmRfc2l6ZSwgMCk7CisJTUxYNV9TRVQobWtjLCBta2MsIHRyYW5zbGF0aW9uc19vY3R3b3JkX3NpemUsCisJCSBnZXRfb2N0b19sZW4odmlydF9hZGRyLCBsZW5ndGgsIDEgPDwgcGFnZV9zaGlmdCkpOworCU1MWDVfU0VUKG1rYywgbWtjLCBsb2dfcGFnZV9zaXplLCBwYWdlX3NoaWZ0KTsKKwlNTFg1X1NFVChta2MsIG1rYywgcXBuLCAweGZmZmZmZik7CisJTUxYNV9TRVQoY3JlYXRlX21rZXlfaW4sIGluLCB0cmFuc2xhdGlvbnNfb2N0d29yZF9hY3R1YWxfc2l6ZSwKKwkJIGdldF9vY3RvX2xlbih2aXJ0X2FkZHIsIGxlbmd0aCwgMSA8PCBwYWdlX3NoaWZ0KSk7CisKKwllcnIgPSBtbHg1X2NvcmVfY3JlYXRlX21rZXkoZGV2LT5tZGV2LCAmbXItPm1ta2V5LCBpbiwgaW5sZW4pOwogCWlmIChlcnIpIHsKIAkJbWx4NV9pYl93YXJuKGRldiwgImNyZWF0ZSBta2V5IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyXzI7CkBAIC0xNTIzLDMwICsxNTQwLDMyIEBACiAJCQkgICAgICAgdTMyIG1heF9udW1fc2cpCiB7CiAJc3RydWN0IG1seDVfaWJfZGV2ICpkZXYgPSB0b19tZGV2KHBkLT5kZXZpY2UpOwotCXN0cnVjdCBtbHg1X2NyZWF0ZV9ta2V5X21ib3hfaW4gKmluOwotCXN0cnVjdCBtbHg1X2liX21yICptcjsKKwlpbnQgaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKGNyZWF0ZV9ta2V5X2luKTsKIAlpbnQgbmRlc2NzID0gQUxJR04obWF4X251bV9zZywgNCk7CisJc3RydWN0IG1seDVfaWJfbXIgKm1yOworCXZvaWQgKm1rYzsKKwl1MzIgKmluOwogCWludCBlcnI7CiAKIAltciA9IGt6YWxsb2Moc2l6ZW9mKCptciksIEdGUF9LRVJORUwpOwogCWlmICghbXIpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JaW4gPSBremFsbG9jKHNpemVvZigqaW4pLCBHRlBfS0VSTkVMKTsKKwlpbiA9IGt6YWxsb2MoaW5sZW4sIEdGUF9LRVJORUwpOwogCWlmICghaW4pIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKLQlpbi0+c2VnLnN0YXR1cyA9IE1MWDVfTUtFWV9TVEFUVVNfRlJFRTsKLQlpbi0+c2VnLnhsdF9vY3Rfc2l6ZSA9IGNwdV90b19iZTMyKG5kZXNjcyk7Ci0JaW4tPnNlZy5xcG5fbWtleTdfMCA9IGNwdV90b19iZTMyKDB4ZmZmZmZmIDw8IDgpOwotCWluLT5zZWcuZmxhZ3NfcGQgPSBjcHVfdG9fYmUzMih0b19tcGQocGQpLT5wZG4pOworCW1rYyA9IE1MWDVfQUREUl9PRihjcmVhdGVfbWtleV9pbiwgaW4sIG1lbW9yeV9rZXlfbWtleV9lbnRyeSk7CisJTUxYNV9TRVQobWtjLCBta2MsIGZyZWUsIDEpOworCU1MWDVfU0VUKG1rYywgbWtjLCB0cmFuc2xhdGlvbnNfb2N0d29yZF9zaXplLCBuZGVzY3MpOworCU1MWDVfU0VUKG1rYywgbWtjLCBxcG4sIDB4ZmZmZmZmKTsKKwlNTFg1X1NFVChta2MsIG1rYywgcGQsIHRvX21wZChwZCktPnBkbik7CiAKIAlpZiAobXJfdHlwZSA9PSBJQl9NUl9UWVBFX01FTV9SRUcpIHsKLQkJbXItPmFjY2Vzc19tb2RlID0gTUxYNV9BQ0NFU1NfTU9ERV9NVFQ7Ci0JCWluLT5zZWcubG9nMl9wYWdlX3NpemUgPSBQQUdFX1NISUZUOwotCisJCW1yLT5hY2Nlc3NfbW9kZSA9IE1MWDVfTUtDX0FDQ0VTU19NT0RFX01UVDsKKwkJTUxYNV9TRVQobWtjLCBta2MsIGxvZ19wYWdlX3NpemUsIFBBR0VfU0hJRlQpOwogCQllcnIgPSBtbHg1X2FsbG9jX3ByaXZfZGVzY3MocGQtPmRldmljZSwgbXIsCiAJCQkJCSAgICBuZGVzY3MsIHNpemVvZih1NjQpKTsKIAkJaWYgKGVycikKQEAgLTE1NTUsNyArMTU3NCw3IEBACiAJCW1yLT5kZXNjX3NpemUgPSBzaXplb2YodTY0KTsKIAkJbXItPm1heF9kZXNjcyA9IG5kZXNjczsKIAl9IGVsc2UgaWYgKG1yX3R5cGUgPT0gSUJfTVJfVFlQRV9TR19HQVBTKSB7Ci0JCW1yLT5hY2Nlc3NfbW9kZSA9IE1MWDVfQUNDRVNTX01PREVfS0xNOworCQltci0+YWNjZXNzX21vZGUgPSBNTFg1X01LQ19BQ0NFU1NfTU9ERV9LTE1TOwogCiAJCWVyciA9IG1seDVfYWxsb2NfcHJpdl9kZXNjcyhwZC0+ZGV2aWNlLCBtciwKIAkJCQkJICAgIG5kZXNjcywgc2l6ZW9mKHN0cnVjdCBtbHg1X2tsbSkpOwpAQCAtMTU2Niw5ICsxNTg1LDggQEAKIAl9IGVsc2UgaWYgKG1yX3R5cGUgPT0gSUJfTVJfVFlQRV9TSUdOQVRVUkUpIHsKIAkJdTMyIHBzdl9pbmRleFsyXTsKIAotCQlpbi0+c2VnLmZsYWdzX3BkID0gY3B1X3RvX2JlMzIoYmUzMl90b19jcHUoaW4tPnNlZy5mbGFnc19wZCkgfAotCQkJCQkJCSAgIE1MWDVfTUtFWV9CU0ZfRU4pOwotCQlpbi0+c2VnLmJzZnNfb2N0b19zaXplID0gY3B1X3RvX2JlMzIoTUxYNV9NS0VZX0JTRl9PQ1RPX1NJWkUpOworCQlNTFg1X1NFVChta2MsIG1rYywgYnNmX2VuLCAxKTsKKwkJTUxYNV9TRVQobWtjLCBta2MsIGJzZl9vY3R3b3JkX3NpemUsIE1MWDVfTUtFWV9CU0ZfT0NUT19TSVpFKTsKIAkJbXItPnNpZyA9IGt6YWxsb2Moc2l6ZW9mKCptci0+c2lnKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghbXItPnNpZykgewogCQkJZXJyID0gLUVOT01FTTsKQEAgLTE1ODEsNyArMTU5OSw3IEBACiAJCWlmIChlcnIpCiAJCQlnb3RvIGVycl9mcmVlX3NpZzsKIAotCQltci0+YWNjZXNzX21vZGUgPSBNTFg1X0FDQ0VTU19NT0RFX0tMTTsKKwkJbXItPmFjY2Vzc19tb2RlID0gTUxYNV9NS0NfQUNDRVNTX01PREVfS0xNUzsKIAkJbXItPnNpZy0+cHN2X21lbW9yeS5wc3ZfaWR4ID0gcHN2X2luZGV4WzBdOwogCQltci0+c2lnLT5wc3Zfd2lyZS5wc3ZfaWR4ID0gcHN2X2luZGV4WzFdOwogCkBAIC0xNTk1LDkgKzE2MTMsMTAgQEAKIAkJZ290byBlcnJfZnJlZV9pbjsKIAl9CiAKLQlpbi0+c2VnLmZsYWdzID0gTUxYNV9QRVJNX1VNUl9FTiB8IG1yLT5hY2Nlc3NfbW9kZTsKLQllcnIgPSBtbHg1X2NvcmVfY3JlYXRlX21rZXkoZGV2LT5tZGV2LCAmbXItPm1ta2V5LCBpbiwgc2l6ZW9mKCppbiksCi0JCQkJICAgIE5VTEwsIE5VTEwsIE5VTEwpOworCU1MWDVfU0VUKG1rYywgbWtjLCBhY2Nlc3NfbW9kZSwgbXItPmFjY2Vzc19tb2RlKTsKKwlNTFg1X1NFVChta2MsIG1rYywgdW1yX2VuLCAxKTsKKworCWVyciA9IG1seDVfY29yZV9jcmVhdGVfbWtleShkZXYtPm1kZXYsICZtci0+bW1rZXksIGluLCBpbmxlbik7CiAJaWYgKGVycikKIAkJZ290byBlcnJfZGVzdHJveV9wc3Y7CiAKQEAgLTE2MzMsOCArMTY1MiwxMCBAQAogCQkJICAgICAgIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpCiB7CiAJc3RydWN0IG1seDVfaWJfZGV2ICpkZXYgPSB0b19tZGV2KHBkLT5kZXZpY2UpOwotCXN0cnVjdCBtbHg1X2NyZWF0ZV9ta2V5X21ib3hfaW4gKmluID0gTlVMTDsKKwlpbnQgaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKGNyZWF0ZV9ta2V5X2luKTsKIAlzdHJ1Y3QgbWx4NV9pYl9tdyAqbXcgPSBOVUxMOworCXUzMiAqaW4gPSBOVUxMOworCXZvaWQgKm1rYzsKIAlpbnQgbmRlc2NzOwogCWludCBlcnI7CiAJc3RydWN0IG1seDVfaWJfYWxsb2NfbXcgcmVxID0ge307CkBAIC0xNjU4LDIzICsxNjc5LDI0IEBACiAJbmRlc2NzID0gcmVxLm51bV9rbG1zID8gcm91bmR1cChyZXEubnVtX2tsbXMsIDQpIDogcm91bmR1cCgxLCA0KTsKIAogCW13ID0ga3phbGxvYyhzaXplb2YoKm13KSwgR0ZQX0tFUk5FTCk7Ci0JaW4gPSBremFsbG9jKHNpemVvZigqaW4pLCBHRlBfS0VSTkVMKTsKKwlpbiA9IGt6YWxsb2MoaW5sZW4sIEdGUF9LRVJORUwpOwogCWlmICghbXcgfHwgIWluKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZnJlZTsKIAl9CiAKLQlpbi0+c2VnLnN0YXR1cyA9IE1MWDVfTUtFWV9TVEFUVVNfRlJFRTsKLQlpbi0+c2VnLnhsdF9vY3Rfc2l6ZSA9IGNwdV90b19iZTMyKG5kZXNjcyk7Ci0JaW4tPnNlZy5mbGFnc19wZCA9IGNwdV90b19iZTMyKHRvX21wZChwZCktPnBkbik7Ci0JaW4tPnNlZy5mbGFncyA9IE1MWDVfUEVSTV9VTVJfRU4gfCBNTFg1X0FDQ0VTU19NT0RFX0tMTSB8Ci0JCU1MWDVfUEVSTV9MT0NBTF9SRUFEOwotCWlmICh0eXBlID09IElCX01XX1RZUEVfMikKLQkJaW4tPnNlZy5mbGFnc19wZCB8PSBjcHVfdG9fYmUzMihNTFg1X01LRVlfUkVNT1RFX0lOVkFMKTsKLQlpbi0+c2VnLnFwbl9ta2V5N18wID0gY3B1X3RvX2JlMzIoMHhmZmZmZmYgPDwgOCk7CisJbWtjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9ta2V5X2luLCBpbiwgbWVtb3J5X2tleV9ta2V5X2VudHJ5KTsKIAotCWVyciA9IG1seDVfY29yZV9jcmVhdGVfbWtleShkZXYtPm1kZXYsICZtdy0+bW1rZXksIGluLCBzaXplb2YoKmluKSwKLQkJCQkgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisJTUxYNV9TRVQobWtjLCBta2MsIGZyZWUsIDEpOworCU1MWDVfU0VUKG1rYywgbWtjLCB0cmFuc2xhdGlvbnNfb2N0d29yZF9zaXplLCBuZGVzY3MpOworCU1MWDVfU0VUKG1rYywgbWtjLCBwZCwgdG9fbXBkKHBkKS0+cGRuKTsKKwlNTFg1X1NFVChta2MsIG1rYywgdW1yX2VuLCAxKTsKKwlNTFg1X1NFVChta2MsIG1rYywgbHIsIDEpOworCU1MWDVfU0VUKG1rYywgbWtjLCBhY2Nlc3NfbW9kZSwgTUxYNV9NS0NfQUNDRVNTX01PREVfS0xNUyk7CisJTUxYNV9TRVQobWtjLCBta2MsIGVuX3JpbnZhbCwgISEoKHR5cGUgPT0gSUJfTVdfVFlQRV8yKSkpOworCU1MWDVfU0VUKG1rYywgbWtjLCBxcG4sIDB4ZmZmZmZmKTsKKworCWVyciA9IG1seDVfY29yZV9jcmVhdGVfbWtleShkZXYtPm1kZXYsICZtdy0+bW1rZXksIGluLCBpbmxlbik7CiAJaWYgKGVycikKIAkJZ290byBmcmVlOwogCkBAIC0xODExLDcgKzE4MzMsNyBAQAogCQkJCSAgIG1yLT5kZXNjX3NpemUgKiBtci0+bWF4X2Rlc2NzLAogCQkJCSAgIERNQV9UT19ERVZJQ0UpOwogCi0JaWYgKG1yLT5hY2Nlc3NfbW9kZSA9PSBNTFg1X0FDQ0VTU19NT0RFX0tMTSkKKwlpZiAobXItPmFjY2Vzc19tb2RlID09IE1MWDVfTUtDX0FDQ0VTU19NT0RFX0tMTVMpCiAJCW4gPSBtbHg1X2liX3NnX3RvX2tsbXMobXIsIHNnLCBzZ19uZW50cywgc2dfb2Zmc2V0KTsKIAllbHNlCiAJCW4gPSBpYl9zZ190b19wYWdlcyhpYm1yLCBzZywgc2dfbmVudHMsIHNnX29mZnNldCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9xcC5jCmluZGV4IDBkZDdkOTMuLjk1MjliNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvcXAuYwpAQCAtNzI2LDcgKzcyNiw3IEBACiBzdGF0aWMgaW50IGNyZWF0ZV91c2VyX3FwKHN0cnVjdCBtbHg1X2liX2RldiAqZGV2LCBzdHJ1Y3QgaWJfcGQgKnBkLAogCQkJICBzdHJ1Y3QgbWx4NV9pYl9xcCAqcXAsIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEsCiAJCQkgIHN0cnVjdCBpYl9xcF9pbml0X2F0dHIgKmF0dHIsCi0JCQkgIHN0cnVjdCBtbHg1X2NyZWF0ZV9xcF9tYm94X2luICoqaW4sCisJCQkgIHUzMiAqKmluLAogCQkJICBzdHJ1Y3QgbWx4NV9pYl9jcmVhdGVfcXBfcmVzcCAqcmVzcCwgaW50ICppbmxlbiwKIAkJCSAgc3RydWN0IG1seDVfaWJfcXBfYmFzZSAqYmFzZSkKIHsKQEAgLTczOSw2ICs3MzksOCBAQAogCXUzMiBvZmZzZXQgPSAwOwogCWludCB1dWFybjsKIAlpbnQgbmNvbnQgPSAwOworCV9fYmU2NCAqcGFzOworCXZvaWQgKnFwYzsKIAlpbnQgZXJyOwogCiAJZXJyID0gaWJfY29weV9mcm9tX3VkYXRhKCZ1Y21kLCB1ZGF0YSwgc2l6ZW9mKHVjbWQpKTsKQEAgLTc5NSwyMCArNzk3LDI0IEBACiAJCXVidWZmZXItPnVtZW0gPSBOVUxMOwogCX0KIAotCSppbmxlbiA9IHNpemVvZigqKmluKSArIHNpemVvZigqKCppbiktPnBhcykgKiBuY29udDsKKwkqaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKGNyZWF0ZV9xcF9pbikgKworCQkgTUxYNV9GTERfU1pfQllURVMoY3JlYXRlX3FwX2luLCBwYXNbMF0pICogbmNvbnQ7CiAJKmluID0gbWx4NV92emFsbG9jKCppbmxlbik7CiAJaWYgKCEqaW4pIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfdW1lbTsKIAl9Ci0JaWYgKHVidWZmZXItPnVtZW0pCi0JCW1seDVfaWJfcG9wdWxhdGVfcGFzKGRldiwgdWJ1ZmZlci0+dW1lbSwgcGFnZV9zaGlmdCwKLQkJCQkgICAgICgqaW4pLT5wYXMsIDApOwotCSgqaW4pLT5jdHgubG9nX3BnX3N6X3JlbW90ZV9xcG4gPQotCQljcHVfdG9fYmUzMigocGFnZV9zaGlmdCAtIE1MWDVfQURBUFRFUl9QQUdFX1NISUZUKSA8PCAyNCk7Ci0JKCppbiktPmN0eC5wYXJhbXMyID0gY3B1X3RvX2JlMzIob2Zmc2V0IDw8IDYpOwogCi0JKCppbiktPmN0eC5xcF9jb3VudGVyX3NldF91c3JfcGFnZSA9IGNwdV90b19iZTMyKHVhcl9pbmRleCk7CisJcGFzID0gKF9fYmU2NCAqKU1MWDVfQUREUl9PRihjcmVhdGVfcXBfaW4sICppbiwgcGFzKTsKKwlpZiAodWJ1ZmZlci0+dW1lbSkKKwkJbWx4NV9pYl9wb3B1bGF0ZV9wYXMoZGV2LCB1YnVmZmVyLT51bWVtLCBwYWdlX3NoaWZ0LCBwYXMsIDApOworCisJcXBjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9xcF9pbiwgKmluLCBxcGMpOworCisJTUxYNV9TRVQocXBjLCBxcGMsIGxvZ19wYWdlX3NpemUsIHBhZ2Vfc2hpZnQgLSBNTFg1X0FEQVBURVJfUEFHRV9TSElGVCk7CisJTUxYNV9TRVQocXBjLCBxcGMsIHBhZ2Vfb2Zmc2V0LCBvZmZzZXQpOworCisJTUxYNV9TRVQocXBjLCBxcGMsIHVhcl9wYWdlLCB1YXJfaW5kZXgpOwogCXJlc3AtPnV1YXJfaW5kZXggPSB1dWFybjsKIAlxcC0+dXVhcm4gPSB1dWFybjsKIApAQCAtODU3LDEyICs4NjMsMTMgQEAKIHN0YXRpYyBpbnQgY3JlYXRlX2tlcm5lbF9xcChzdHJ1Y3QgbWx4NV9pYl9kZXYgKmRldiwKIAkJCSAgICBzdHJ1Y3QgaWJfcXBfaW5pdF9hdHRyICppbml0X2F0dHIsCiAJCQkgICAgc3RydWN0IG1seDVfaWJfcXAgKnFwLAotCQkJICAgIHN0cnVjdCBtbHg1X2NyZWF0ZV9xcF9tYm94X2luICoqaW4sIGludCAqaW5sZW4sCisJCQkgICAgdTMyICoqaW4sIGludCAqaW5sZW4sCiAJCQkgICAgc3RydWN0IG1seDVfaWJfcXBfYmFzZSAqYmFzZSkKIHsKIAllbnVtIG1seDVfaWJfbGF0ZW5jeV9jbGFzcyBsYyA9IE1MWDVfSUJfTEFURU5DWV9DTEFTU19MT1c7CiAJc3RydWN0IG1seDVfdXVhcl9pbmZvICp1dWFyaTsKIAlpbnQgdWFyX2luZGV4OworCXZvaWQgKnFwYzsKIAlpbnQgdXVhcm47CiAJaW50IGVycjsKIApAQCAtOTAyLDI1ICs5MDksMjkgQEAKIAl9CiAKIAlxcC0+c3EucWVuZCA9IG1seDVfZ2V0X3NlbmRfd3FlKHFwLCBxcC0+c3Eud3FlX2NudCk7Ci0JKmlubGVuID0gc2l6ZW9mKCoqaW4pICsgc2l6ZW9mKCooKmluKS0+cGFzKSAqIHFwLT5idWYubnBhZ2VzOworCSppbmxlbiA9IE1MWDVfU1RfU1pfQllURVMoY3JlYXRlX3FwX2luKSArCisJCSBNTFg1X0ZMRF9TWl9CWVRFUyhjcmVhdGVfcXBfaW4sIHBhc1swXSkgKiBxcC0+YnVmLm5wYWdlczsKIAkqaW4gPSBtbHg1X3Z6YWxsb2MoKmlubGVuKTsKIAlpZiAoISppbikgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9idWY7CiAJfQotCSgqaW4pLT5jdHgucXBfY291bnRlcl9zZXRfdXNyX3BhZ2UgPSBjcHVfdG9fYmUzMih1YXJfaW5kZXgpOwotCSgqaW4pLT5jdHgubG9nX3BnX3N6X3JlbW90ZV9xcG4gPQotCQljcHVfdG9fYmUzMigocXAtPmJ1Zi5wYWdlX3NoaWZ0IC0gTUxYNV9BREFQVEVSX1BBR0VfU0hJRlQpIDw8IDI0KTsKKworCXFwYyA9IE1MWDVfQUREUl9PRihjcmVhdGVfcXBfaW4sICppbiwgcXBjKTsKKwlNTFg1X1NFVChxcGMsIHFwYywgdWFyX3BhZ2UsIHVhcl9pbmRleCk7CisJTUxYNV9TRVQocXBjLCBxcGMsIGxvZ19wYWdlX3NpemUsIHFwLT5idWYucGFnZV9zaGlmdCAtIE1MWDVfQURBUFRFUl9QQUdFX1NISUZUKTsKKwogCS8qIFNldCAiZmFzdCByZWdpc3RyYXRpb24gZW5hYmxlZCIgZm9yIGFsbCBrZXJuZWwgUVBzICovCi0JKCppbiktPmN0eC5wYXJhbXMxIHw9IGNwdV90b19iZTMyKDEgPDwgMTEpOwotCSgqaW4pLT5jdHguc3FfY3JxX3NpemUgfD0gY3B1X3RvX2JlMTYoMSA8PCA0KTsKKwlNTFg1X1NFVChxcGMsIHFwYywgZnJlLCAxKTsKKwlNTFg1X1NFVChxcGMsIHFwYywgcmxreSwgMSk7CiAKIAlpZiAoaW5pdF9hdHRyLT5jcmVhdGVfZmxhZ3MgJiBtbHg1X2liX2NyZWF0ZV9xcF9zcXBuX3FwMSgpKSB7Ci0JCSgqaW4pLT5jdHguZGV0aF9zcXBuID0gY3B1X3RvX2JlMzIoMSk7CisJCU1MWDVfU0VUKHFwYywgcXBjLCBkZXRoX3NxcG4sIDEpOwogCQlxcC0+ZmxhZ3MgfD0gTUxYNV9JQl9RUF9TUVBOX1FQMTsKIAl9CiAKLQltbHg1X2ZpbGxfcGFnZV9hcnJheSgmcXAtPmJ1ZiwgKCppbiktPnBhcyk7CisJbWx4NV9maWxsX3BhZ2VfYXJyYXkoJnFwLT5idWYsCisJCQkgICAgIChfX2JlNjQgKilNTFg1X0FERFJfT0YoY3JlYXRlX3FwX2luLCAqaW4sIHBhcykpOwogCiAJZXJyID0gbWx4NV9kYl9hbGxvYyhkZXYtPm1kZXYsICZxcC0+ZGIpOwogCWlmIChlcnIpIHsKQEAgLTk3NCwxNSArOTg1LDE1IEBACiAJZnJlZV91dWFyKCZkZXYtPm1kZXYtPnByaXYudXVhcmksIHFwLT5iZi0+dXVhcm4pOwogfQogCi1zdGF0aWMgX19iZTMyIGdldF9yeF90eXBlKHN0cnVjdCBtbHg1X2liX3FwICpxcCwgc3RydWN0IGliX3FwX2luaXRfYXR0ciAqYXR0cikKK3N0YXRpYyB1MzIgZ2V0X3J4X3R5cGUoc3RydWN0IG1seDVfaWJfcXAgKnFwLCBzdHJ1Y3QgaWJfcXBfaW5pdF9hdHRyICphdHRyKQogewogCWlmIChhdHRyLT5zcnEgfHwgKGF0dHItPnFwX3R5cGUgPT0gSUJfUVBUX1hSQ19UR1QpIHx8CiAJICAgIChhdHRyLT5xcF90eXBlID09IElCX1FQVF9YUkNfSU5JKSkKLQkJcmV0dXJuIGNwdV90b19iZTMyKE1MWDVfU1JRX1JRKTsKKwkJcmV0dXJuIE1MWDVfU1JRX1JROwogCWVsc2UgaWYgKCFxcC0+aGFzX3JxKQotCQlyZXR1cm4gY3B1X3RvX2JlMzIoTUxYNV9aRVJPX0xFTl9SUSk7CisJCXJldHVybiBNTFg1X1pFUk9fTEVOX1JROwogCWVsc2UKLQkJcmV0dXJuIGNwdV90b19iZTMyKE1MWDVfTk9OX1pFUk9fUlEpOworCQlyZXR1cm4gTUxYNV9OT05fWkVST19SUTsKIH0KIAogc3RhdGljIGludCBpc19jb25uZWN0ZWQoZW51bSBpYl9xcF90eXBlIHFwX3R5cGUpCkBAIC05OTYsMTMgKzEwMDcsMTAgQEAKIHN0YXRpYyBpbnQgY3JlYXRlX3Jhd19wYWNrZXRfcXBfdGlzKHN0cnVjdCBtbHg1X2liX2RldiAqZGV2LAogCQkJCSAgICBzdHJ1Y3QgbWx4NV9pYl9zcSAqc3EsIHUzMiB0ZG4pCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoY3JlYXRlX3Rpc19pbildOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGNyZWF0ZV90aXNfaW4pXSA9IHswfTsKIAl2b2lkICp0aXNjID0gTUxYNV9BRERSX09GKGNyZWF0ZV90aXNfaW4sIGluLCBjdHgpOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQogCU1MWDVfU0VUKHRpc2MsIHRpc2MsIHRyYW5zcG9ydF9kb21haW4sIHRkbik7Ci0KIAlyZXR1cm4gbWx4NV9jb3JlX2NyZWF0ZV90aXMoZGV2LT5tZGV2LCBpbiwgc2l6ZW9mKGluKSwgJnNxLT50aXNuKTsKIH0KIApAQCAtMTE5MSw3ICsxMTk5LDcgQEAKIH0KIAogc3RhdGljIGludCBjcmVhdGVfcmF3X3BhY2tldF9xcChzdHJ1Y3QgbWx4NV9pYl9kZXYgKmRldiwgc3RydWN0IG1seDVfaWJfcXAgKnFwLAotCQkJCXN0cnVjdCBtbHg1X2NyZWF0ZV9xcF9tYm94X2luICppbiwKKwkJCQl1MzIgKmluLAogCQkJCXN0cnVjdCBpYl9wZCAqcGQpCiB7CiAJc3RydWN0IG1seDVfaWJfcmF3X3BhY2tldF9xcCAqcmF3X3BhY2tldF9xcCA9ICZxcC0+cmF3X3BhY2tldF9xcDsKQEAgLTE0NDksNiArMTQ1Nyw3IEBACiAJa3ZmcmVlKGluKTsKIAkvKiBxcG4gaXMgcmVzZXJ2ZWQgZm9yIHRoYXQgUVAgKi8KIAlxcC0+dHJhbnNfcXAuYmFzZS5tcXAucXBuID0gMDsKKwlxcC0+ZmxhZ3MgfD0gTUxYNV9JQl9RUF9SU1M7CiAJcmV0dXJuIDA7CiAKIGVycjoKQEAgLTE0NjEsMTggKzE0NzAsMTggQEAKIAkJCSAgICBzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhLCBzdHJ1Y3QgbWx4NV9pYl9xcCAqcXApCiB7CiAJc3RydWN0IG1seDVfaWJfcmVzb3VyY2VzICpkZXZyID0gJmRldi0+ZGV2cjsKKwlpbnQgaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKGNyZWF0ZV9xcF9pbik7CiAJc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYgPSBkZXYtPm1kZXY7Ci0Jc3RydWN0IG1seDVfaWJfcXBfYmFzZSAqYmFzZTsKIAlzdHJ1Y3QgbWx4NV9pYl9jcmVhdGVfcXBfcmVzcCByZXNwOwotCXN0cnVjdCBtbHg1X2NyZWF0ZV9xcF9tYm94X2luICppbjsKLQlzdHJ1Y3QgbWx4NV9pYl9jcmVhdGVfcXAgdWNtZDsKIAlzdHJ1Y3QgbWx4NV9pYl9jcSAqc2VuZF9jcTsKIAlzdHJ1Y3QgbWx4NV9pYl9jcSAqcmVjdl9jcTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpbmxlbiA9IHNpemVvZigqaW4pOwotCWludCBlcnI7CiAJdTMyIHVpZHggPSBNTFg1X0lCX0RFRkFVTFRfVUlEWDsKKwlzdHJ1Y3QgbWx4NV9pYl9jcmVhdGVfcXAgdWNtZDsKKwlzdHJ1Y3QgbWx4NV9pYl9xcF9iYXNlICpiYXNlOwogCXZvaWQgKnFwYzsKKwl1MzIgKmluOworCWludCBlcnI7CiAKIAliYXNlID0gaW5pdF9hdHRyLT5xcF90eXBlID09IElCX1FQVF9SQVdfUEFDS0VUID8KIAkgICAgICAgJnFwLT5yYXdfcGFja2V0X3FwLnJxLmJhc2UgOgpAQCAtMTYwMCw3ICsxNjA5LDcgQEAKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAJfSBlbHNlIHsKLQkJaW4gPSBtbHg1X3Z6YWxsb2Moc2l6ZW9mKCppbikpOworCQlpbiA9IG1seDVfdnphbGxvYyhpbmxlbik7CiAJCWlmICghaW4pCiAJCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTYxMCwyNiArMTYxOSwyOSBAQAogCWlmIChpc19zcXAoaW5pdF9hdHRyLT5xcF90eXBlKSkKIAkJcXAtPnBvcnQgPSBpbml0X2F0dHItPnBvcnRfbnVtOwogCi0JaW4tPmN0eC5mbGFncyA9IGNwdV90b19iZTMyKHRvX21seDVfc3QoaW5pdF9hdHRyLT5xcF90eXBlKSA8PCAxNiB8Ci0JCQkJICAgIE1MWDVfUVBfUE1fTUlHUkFURUQgPDwgMTEpOworCXFwYyA9IE1MWDVfQUREUl9PRihjcmVhdGVfcXBfaW4sIGluLCBxcGMpOworCisJTUxYNV9TRVQocXBjLCBxcGMsIHN0LCB0b19tbHg1X3N0KGluaXRfYXR0ci0+cXBfdHlwZSkpOworCU1MWDVfU0VUKHFwYywgcXBjLCBwbV9zdGF0ZSwgTUxYNV9RUF9QTV9NSUdSQVRFRCk7CiAKIAlpZiAoaW5pdF9hdHRyLT5xcF90eXBlICE9IE1MWDVfSUJfUVBUX1JFR19VTVIpCi0JCWluLT5jdHguZmxhZ3NfcGQgPSBjcHVfdG9fYmUzMih0b19tcGQocGQgPyBwZCA6IGRldnItPnAwKS0+cGRuKTsKKwkJTUxYNV9TRVQocXBjLCBxcGMsIHBkLCB0b19tcGQocGQgPyBwZCA6IGRldnItPnAwKS0+cGRuKTsKIAllbHNlCi0JCWluLT5jdHguZmxhZ3NfcGQgPSBjcHVfdG9fYmUzMihNTFg1X1FQX0xBVF9TRU5TSVRJVkUpOworCQlNTFg1X1NFVChxcGMsIHFwYywgbGF0ZW5jeV9zZW5zaXRpdmUsIDEpOworCiAKIAlpZiAocXAtPndxX3NpZykKLQkJaW4tPmN0eC5mbGFnc19wZCB8PSBjcHVfdG9fYmUzMihNTFg1X1FQX0VOQUJMRV9TSUcpOworCQlNTFg1X1NFVChxcGMsIHFwYywgd3Ffc2lnbmF0dXJlLCAxKTsKIAogCWlmIChxcC0+ZmxhZ3MgJiBNTFg1X0lCX1FQX0JMT0NLX01VTFRJQ0FTVF9MT09QQkFDSykKLQkJaW4tPmN0eC5mbGFnc19wZCB8PSBjcHVfdG9fYmUzMihNTFg1X1FQX0JMT0NLX01DQVNUKTsKKwkJTUxYNV9TRVQocXBjLCBxcGMsIGJsb2NrX2xiX21jLCAxKTsKIAogCWlmIChxcC0+ZmxhZ3MgJiBNTFg1X0lCX1FQX0NST1NTX0NIQU5ORUwpCi0JCWluLT5jdHgucGFyYW1zMiB8PSBjcHVfdG9fYmUzMihNTFg1X1FQX0JJVF9DQ19NQVNURVIpOworCQlNTFg1X1NFVChxcGMsIHFwYywgY2RfbWFzdGVyLCAxKTsKIAlpZiAocXAtPmZsYWdzICYgTUxYNV9JQl9RUF9NQU5BR0VEX1NFTkQpCi0JCWluLT5jdHgucGFyYW1zMiB8PSBjcHVfdG9fYmUzMihNTFg1X1FQX0JJVF9DQ19TTEFWRV9TRU5EKTsKKwkJTUxYNV9TRVQocXBjLCBxcGMsIGNkX3NsYXZlX3NlbmQsIDEpOwogCWlmIChxcC0+ZmxhZ3MgJiBNTFg1X0lCX1FQX01BTkFHRURfUkVDVikKLQkJaW4tPmN0eC5wYXJhbXMyIHw9IGNwdV90b19iZTMyKE1MWDVfUVBfQklUX0NDX1NMQVZFX1JFQ1YpOworCQlNTFg1X1NFVChxcGMsIHFwYywgY2Rfc2xhdmVfcmVjZWl2ZSwgMSk7CiAKIAlpZiAocXAtPnNjYXRfY3FlICYmIGlzX2Nvbm5lY3RlZChpbml0X2F0dHItPnFwX3R5cGUpKSB7CiAJCWludCByY3FlX3N6OwpAQCAtMTYzOSw3MSArMTY1MSw2OCBAQAogCQlzY3FlX3N6ID0gbWx4NV9pYl9nZXRfY3FlX3NpemUoZGV2LCBpbml0X2F0dHItPnNlbmRfY3EpOwogCiAJCWlmIChyY3FlX3N6ID09IDEyOCkKLQkJCWluLT5jdHguY3NfcmVzID0gTUxYNV9SRVNfU0NBVF9EQVRBNjRfQ1FFOworCQkJTUxYNV9TRVQocXBjLCBxcGMsIGNzX3JlcywgTUxYNV9SRVNfU0NBVF9EQVRBNjRfQ1FFKTsKIAkJZWxzZQotCQkJaW4tPmN0eC5jc19yZXMgPSBNTFg1X1JFU19TQ0FUX0RBVEEzMl9DUUU7CisJCQlNTFg1X1NFVChxcGMsIHFwYywgY3NfcmVzLCBNTFg1X1JFU19TQ0FUX0RBVEEzMl9DUUUpOwogCiAJCWlmIChpbml0X2F0dHItPnNxX3NpZ190eXBlID09IElCX1NJR05BTF9BTExfV1IpIHsKIAkJCWlmIChzY3FlX3N6ID09IDEyOCkKLQkJCQlpbi0+Y3R4LmNzX3JlcSA9IE1MWDVfUkVRX1NDQVRfREFUQTY0X0NRRTsKKwkJCQlNTFg1X1NFVChxcGMsIHFwYywgY3NfcmVxLCBNTFg1X1JFUV9TQ0FUX0RBVEE2NF9DUUUpOwogCQkJZWxzZQotCQkJCWluLT5jdHguY3NfcmVxID0gTUxYNV9SRVFfU0NBVF9EQVRBMzJfQ1FFOworCQkJCU1MWDVfU0VUKHFwYywgcXBjLCBjc19yZXEsIE1MWDVfUkVRX1NDQVRfREFUQTMyX0NRRSk7CiAJCX0KIAl9CiAKIAlpZiAocXAtPnJxLndxZV9jbnQpIHsKLQkJaW4tPmN0eC5ycV9zaXplX3N0cmlkZSA9IChxcC0+cnEud3FlX3NoaWZ0IC0gNCk7Ci0JCWluLT5jdHgucnFfc2l6ZV9zdHJpZGUgfD0gaWxvZzIocXAtPnJxLndxZV9jbnQpIDw8IDM7CisJCU1MWDVfU0VUKHFwYywgcXBjLCBsb2dfcnFfc3RyaWRlLCBxcC0+cnEud3FlX3NoaWZ0IC0gNCk7CisJCU1MWDVfU0VUKHFwYywgcXBjLCBsb2dfcnFfc2l6ZSwgaWxvZzIocXAtPnJxLndxZV9jbnQpKTsKIAl9CiAKLQlpbi0+Y3R4LnJxX3R5cGVfc3JxbiA9IGdldF9yeF90eXBlKHFwLCBpbml0X2F0dHIpOworCU1MWDVfU0VUKHFwYywgcXBjLCBycV90eXBlLCBnZXRfcnhfdHlwZShxcCwgaW5pdF9hdHRyKSk7CiAKIAlpZiAocXAtPnNxLndxZV9jbnQpCi0JCWluLT5jdHguc3FfY3JxX3NpemUgfD0gY3B1X3RvX2JlMTYoaWxvZzIocXAtPnNxLndxZV9jbnQpIDw8IDExKTsKKwkJTUxYNV9TRVQocXBjLCBxcGMsIGxvZ19zcV9zaXplLCBpbG9nMihxcC0+c3Eud3FlX2NudCkpOwogCWVsc2UKLQkJaW4tPmN0eC5zcV9jcnFfc2l6ZSB8PSBjcHVfdG9fYmUxNigweDgwMDApOworCQlNTFg1X1NFVChxcGMsIHFwYywgbm9fc3EsIDEpOwogCiAJLyogU2V0IGRlZmF1bHQgcmVzb3VyY2VzICovCiAJc3dpdGNoIChpbml0X2F0dHItPnFwX3R5cGUpIHsKIAljYXNlIElCX1FQVF9YUkNfVEdUOgotCQlpbi0+Y3R4LmNxbl9yZWN2ID0gY3B1X3RvX2JlMzIodG9fbWNxKGRldnItPmMwKS0+bWNxLmNxbik7Ci0JCWluLT5jdHguY3FuX3NlbmQgPSBjcHVfdG9fYmUzMih0b19tY3EoZGV2ci0+YzApLT5tY3EuY3FuKTsKLQkJaW4tPmN0eC5ycV90eXBlX3NycW4gfD0gY3B1X3RvX2JlMzIodG9fbXNycShkZXZyLT5zMCktPm1zcnEuc3Jxbik7Ci0JCWluLT5jdHgueHJjZCA9IGNwdV90b19iZTMyKHRvX214cmNkKGluaXRfYXR0ci0+eHJjZCktPnhyY2RuKTsKKwkJTUxYNV9TRVQocXBjLCBxcGMsIGNxbl9yY3YsIHRvX21jcShkZXZyLT5jMCktPm1jcS5jcW4pOworCQlNTFg1X1NFVChxcGMsIHFwYywgY3FuX3NuZCwgdG9fbWNxKGRldnItPmMwKS0+bWNxLmNxbik7CisJCU1MWDVfU0VUKHFwYywgcXBjLCBzcnFuX3JtcG5feHJxbiwgdG9fbXNycShkZXZyLT5zMCktPm1zcnEuc3Jxbik7CisJCU1MWDVfU0VUKHFwYywgcXBjLCB4cmNkLCB0b19teHJjZChpbml0X2F0dHItPnhyY2QpLT54cmNkbik7CiAJCWJyZWFrOwogCWNhc2UgSUJfUVBUX1hSQ19JTkk6Ci0JCWluLT5jdHguY3FuX3JlY3YgPSBjcHVfdG9fYmUzMih0b19tY3EoZGV2ci0+YzApLT5tY3EuY3FuKTsKLQkJaW4tPmN0eC54cmNkID0gY3B1X3RvX2JlMzIodG9fbXhyY2QoZGV2ci0+eDEpLT54cmNkbik7Ci0JCWluLT5jdHgucnFfdHlwZV9zcnFuIHw9IGNwdV90b19iZTMyKHRvX21zcnEoZGV2ci0+czApLT5tc3JxLnNycW4pOworCQlNTFg1X1NFVChxcGMsIHFwYywgY3FuX3JjdiwgdG9fbWNxKGRldnItPmMwKS0+bWNxLmNxbik7CisJCU1MWDVfU0VUKHFwYywgcXBjLCB4cmNkLCB0b19teHJjZChkZXZyLT54MSktPnhyY2RuKTsKKwkJTUxYNV9TRVQocXBjLCBxcGMsIHNycW5fcm1wbl94cnFuLCB0b19tc3JxKGRldnItPnMwKS0+bXNycS5zcnFuKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJaWYgKGluaXRfYXR0ci0+c3JxKSB7Ci0JCQlpbi0+Y3R4LnhyY2QgPSBjcHVfdG9fYmUzMih0b19teHJjZChkZXZyLT54MCktPnhyY2RuKTsKLQkJCWluLT5jdHgucnFfdHlwZV9zcnFuIHw9IGNwdV90b19iZTMyKHRvX21zcnEoaW5pdF9hdHRyLT5zcnEpLT5tc3JxLnNycW4pOworCQkJTUxYNV9TRVQocXBjLCBxcGMsIHhyY2QsIHRvX214cmNkKGRldnItPngwKS0+eHJjZG4pOworCQkJTUxYNV9TRVQocXBjLCBxcGMsIHNycW5fcm1wbl94cnFuLCB0b19tc3JxKGluaXRfYXR0ci0+c3JxKS0+bXNycS5zcnFuKTsKIAkJfSBlbHNlIHsKLQkJCWluLT5jdHgueHJjZCA9IGNwdV90b19iZTMyKHRvX214cmNkKGRldnItPngxKS0+eHJjZG4pOwotCQkJaW4tPmN0eC5ycV90eXBlX3NycW4gfD0KLQkJCQljcHVfdG9fYmUzMih0b19tc3JxKGRldnItPnMxKS0+bXNycS5zcnFuKTsKKwkJCU1MWDVfU0VUKHFwYywgcXBjLCB4cmNkLCB0b19teHJjZChkZXZyLT54MSktPnhyY2RuKTsKKwkJCU1MWDVfU0VUKHFwYywgcXBjLCBzcnFuX3JtcG5feHJxbiwgdG9fbXNycShkZXZyLT5zMSktPm1zcnEuc3Jxbik7CiAJCX0KIAl9CiAKIAlpZiAoaW5pdF9hdHRyLT5zZW5kX2NxKQotCQlpbi0+Y3R4LmNxbl9zZW5kID0gY3B1X3RvX2JlMzIodG9fbWNxKGluaXRfYXR0ci0+c2VuZF9jcSktPm1jcS5jcW4pOworCQlNTFg1X1NFVChxcGMsIHFwYywgY3FuX3NuZCwgdG9fbWNxKGluaXRfYXR0ci0+c2VuZF9jcSktPm1jcS5jcW4pOwogCiAJaWYgKGluaXRfYXR0ci0+cmVjdl9jcSkKLQkJaW4tPmN0eC5jcW5fcmVjdiA9IGNwdV90b19iZTMyKHRvX21jcShpbml0X2F0dHItPnJlY3ZfY3EpLT5tY3EuY3FuKTsKKwkJTUxYNV9TRVQocXBjLCBxcGMsIGNxbl9yY3YsIHRvX21jcShpbml0X2F0dHItPnJlY3ZfY3EpLT5tY3EuY3FuKTsKIAotCWluLT5jdHguZGJfcmVjX2FkZHIgPSBjcHVfdG9fYmU2NChxcC0+ZGIuZG1hKTsKKwlNTFg1X1NFVDY0KHFwYywgcXBjLCBkYnJfYWRkciwgcXAtPmRiLmRtYSk7CiAKLQlpZiAoTUxYNV9DQVBfR0VOKG1kZXYsIGNxZV92ZXJzaW9uKSA9PSBNTFg1X0NRRV9WRVJTSU9OX1YxKSB7Ci0JCXFwYyA9IE1MWDVfQUREUl9PRihjcmVhdGVfcXBfaW4sIGluLCBxcGMpOwotCQkvKiAweGZmZmZmZiBtZWFucyB3ZSBhc2sgdG8gd29yayB3aXRoIGNxZSB2ZXJzaW9uIDAgKi8KKwkvKiAweGZmZmZmZiBtZWFucyB3ZSBhc2sgdG8gd29yayB3aXRoIGNxZSB2ZXJzaW9uIDAgKi8KKwlpZiAoTUxYNV9DQVBfR0VOKG1kZXYsIGNxZV92ZXJzaW9uKSA9PSBNTFg1X0NRRV9WRVJTSU9OX1YxKQogCQlNTFg1X1NFVChxcGMsIHFwYywgdXNlcl9pbmRleCwgdWlkeCk7Ci0JfQorCiAJLyogd2UgdXNlIElCX1FQX0NSRUFURV9JUE9JQl9VRF9MU08gdG8gaW5kaWNhdGVzIGlwb2liIHFwICovCiAJaWYgKGluaXRfYXR0ci0+cXBfdHlwZSA9PSBJQl9RUFRfVUQgJiYKIAkgICAgKGluaXRfYXR0ci0+Y3JlYXRlX2ZsYWdzICYgSUJfUVBfQ1JFQVRFX0lQT0lCX1VEX0xTTykpIHsKLQkJcXBjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9xcF9pbiwgaW4sIHFwYyk7CiAJCU1MWDVfU0VUKHFwYywgcXBjLCB1bHBfc3RhdGVsZXNzX29mZmxvYWRfbW9kZSwgMSk7CiAJCXFwLT5mbGFncyB8PSBNTFg1X0lCX1FQX0xTTzsKIAl9CkBAIC0xODYwLDcgKzE4NjksNiBAQAogewogCXN0cnVjdCBtbHg1X2liX2NxICpzZW5kX2NxLCAqcmVjdl9jcTsKIAlzdHJ1Y3QgbWx4NV9pYl9xcF9iYXNlICpiYXNlID0gJnFwLT50cmFuc19xcC5iYXNlOwotCXN0cnVjdCBtbHg1X21vZGlmeV9xcF9tYm94X2luICppbjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnI7CiAKQEAgLTE4NzMsMTYgKzE4ODEsMTIgQEAKIAkgICAgICAgJnFwLT5yYXdfcGFja2V0X3FwLnJxLmJhc2UgOgogCSAgICAgICAmcXAtPnRyYW5zX3FwLmJhc2U7CiAKLQlpbiA9IGt6YWxsb2Moc2l6ZW9mKCppbiksIEdGUF9LRVJORUwpOwotCWlmICghaW4pCi0JCXJldHVybjsKLQogCWlmIChxcC0+c3RhdGUgIT0gSUJfUVBTX1JFU0VUKSB7CiAJCWlmIChxcC0+aWJxcC5xcF90eXBlICE9IElCX1FQVF9SQVdfUEFDS0VUKSB7CiAJCQltbHg1X2liX3FwX2Rpc2FibGVfcGFnZWZhdWx0cyhxcCk7CiAJCQllcnIgPSBtbHg1X2NvcmVfcXBfbW9kaWZ5KGRldi0+bWRldiwKLQkJCQkJCSAgTUxYNV9DTURfT1BfMlJTVF9RUCwgaW4sIDAsCi0JCQkJCQkgICZiYXNlLT5tcXApOworCQkJCQkJICBNTFg1X0NNRF9PUF8yUlNUX1FQLCAwLAorCQkJCQkJICBOVUxMLCAmYmFzZS0+bXFwKTsKIAkJfSBlbHNlIHsKIAkJCWVyciA9IG1vZGlmeV9yYXdfcGFja2V0X3FwKGRldiwgcXAsCiAJCQkJCQkgICBNTFg1X0NNRF9PUF8yUlNUX1FQKTsKQEAgLTE5MjQsOCArMTkyOCw2IEBACiAJCQkJICAgICBiYXNlLT5tcXAucXBuKTsKIAl9CiAKLQlrZnJlZShpbik7Ci0KIAlpZiAocXAtPmNyZWF0ZV90eXBlID09IE1MWDVfUVBfS0VSTkVMKQogCQlkZXN0cm95X3FwX2tlcm5lbChkZXYsIHFwKTsKIAllbHNlIGlmIChxcC0+Y3JlYXRlX3R5cGUgPT0gTUxYNV9RUF9VU0VSKQpAQCAtMjUxMSw3ICsyNTEzLDYgQEAKIAlzdHJ1Y3QgbWx4NV9pYl9xcF9iYXNlICpiYXNlID0gJnFwLT50cmFuc19xcC5iYXNlOwogCXN0cnVjdCBtbHg1X2liX2NxICpzZW5kX2NxLCAqcmVjdl9jcTsKIAlzdHJ1Y3QgbWx4NV9xcF9jb250ZXh0ICpjb250ZXh0OwotCXN0cnVjdCBtbHg1X21vZGlmeV9xcF9tYm94X2luICppbjsKIAlzdHJ1Y3QgbWx4NV9pYl9wZCAqcGQ7CiAJZW51bSBtbHg1X3FwX3N0YXRlIG1seDVfY3VyLCBtbHg1X25ldzsKIAllbnVtIG1seDVfcXBfb3B0cGFyIG9wdHBhcjsKQEAgLTI1MjAsMTEgKzI1MjEsMTAgQEAKIAlpbnQgZXJyOwogCXUxNiBvcDsKIAotCWluID0ga3phbGxvYyhzaXplb2YoKmluKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbikKKwljb250ZXh0ID0ga3phbGxvYyhzaXplb2YoKmNvbnRleHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbnRleHQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JY29udGV4dCA9ICZpbi0+Y3R4OwogCWVyciA9IHRvX21seDVfc3QoaWJxcC0+cXBfdHlwZSk7CiAJaWYgKGVyciA8IDApIHsKIAkJbWx4NV9pYl9kYmcoZGV2LCAidW5zdXBwb3J0ZWQgcXAgdHlwZSAlZFxuIiwgaWJxcC0+cXBfdHlwZSk7CkBAIC0yNjg5LDEyICsyNjg5LDExIEBACiAJb3AgPSBvcHRhYlttbHg1X2N1cl1bbWx4NV9uZXddOwogCW9wdHBhciA9IGliX21hc2tfdG9fbWx4NV9vcHQoYXR0cl9tYXNrKTsKIAlvcHRwYXIgJj0gb3B0X21hc2tbbWx4NV9jdXJdW21seDVfbmV3XVttbHg1X3N0XTsKLQlpbi0+b3B0cGFyYW0gPSBjcHVfdG9fYmUzMihvcHRwYXIpOwogCiAJaWYgKHFwLT5pYnFwLnFwX3R5cGUgPT0gSUJfUVBUX1JBV19QQUNLRVQpCiAJCWVyciA9IG1vZGlmeV9yYXdfcGFja2V0X3FwKGRldiwgcXAsIG9wKTsKIAllbHNlCi0JCWVyciA9IG1seDVfY29yZV9xcF9tb2RpZnkoZGV2LT5tZGV2LCBvcCwgaW4sIHNxZF9ldmVudCwKKwkJZXJyID0gbWx4NV9jb3JlX3FwX21vZGlmeShkZXYtPm1kZXYsIG9wLCBvcHRwYXIsIGNvbnRleHQsCiAJCQkJCSAgJmJhc2UtPm1xcCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CkBAIC0yNzM1LDcgKzI3MzQsNyBAQAogCX0KIAogb3V0OgotCWtmcmVlKGluKTsKKwlrZnJlZShjb250ZXh0KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yOTY4LDcgKzI5NjcsNyBAQAogCiAJbWVtc2V0KHVtciwgMCwgc2l6ZW9mKCp1bXIpKTsKIAotCWlmIChtci0+YWNjZXNzX21vZGUgPT0gTUxYNV9BQ0NFU1NfTU9ERV9LTE0pCisJaWYgKG1yLT5hY2Nlc3NfbW9kZSA9PSBNTFg1X01LQ19BQ0NFU1NfTU9ERV9LTE1TKQogCQkvKiBLTE1zIHRha2UgdHdpY2UgdGhlIHNpemUgb2YgTVRUcyAqLwogCQluZGVzY3MgKj0gMjsKIApAQCAtMzExMSw5ICszMTEwLDkgQEAKIAogCW1lbXNldChzZWcsIDAsIHNpemVvZigqc2VnKSk7CiAKLQlpZiAobXItPmFjY2Vzc19tb2RlID09IE1MWDVfQUNDRVNTX01PREVfTVRUKQorCWlmIChtci0+YWNjZXNzX21vZGUgPT0gTUxYNV9NS0NfQUNDRVNTX01PREVfTVRUKQogCQlzZWctPmxvZzJfcGFnZV9zaXplID0gaWxvZzIobXItPmlibXIucGFnZV9zaXplKTsKLQllbHNlIGlmIChtci0+YWNjZXNzX21vZGUgPT0gTUxYNV9BQ0NFU1NfTU9ERV9LTE0pCisJZWxzZSBpZiAobXItPmFjY2Vzc19tb2RlID09IE1MWDVfTUtDX0FDQ0VTU19NT0RFX0tMTVMpCiAJCS8qIEtMTXMgdGFrZSB0d2ljZSB0aGUgc2l6ZSBvZiBNVFRzICovCiAJCW5kZXNjcyAqPSAyOwogCkBAIC0zNDU0LDcgKzM0NTMsNyBAQAogCW1lbXNldChzZWcsIDAsIHNpemVvZigqc2VnKSk7CiAKIAlzZWctPmZsYWdzID0gZ2V0X3Vtcl9mbGFncyh3ci0+YWNjZXNzX2ZsYWdzKSB8Ci0JCQkJICAgTUxYNV9BQ0NFU1NfTU9ERV9LTE07CisJCQkJICAgTUxYNV9NS0NfQUNDRVNTX01PREVfS0xNUzsKIAlzZWctPnFwbl9ta2V5N18wID0gY3B1X3RvX2JlMzIoKHNpZ19rZXkgJiAweGZmKSB8IDB4ZmZmZmZmMDApOwogCXNlZy0+ZmxhZ3NfcGQgPSBjcHVfdG9fYmUzMihNTFg1X01LRVlfUkVNT1RFX0lOVkFMIHwgc2lnZXJyIDw8IDI2IHwKIAkJCQkgICAgTUxYNV9NS0VZX0JTRl9FTiB8IHBkbik7CkBAIC0zNjU4LDEyICszNjU3LDggQEAKIAkJICAgICBzdHJ1Y3QgaWJfc2VuZF93ciAqd3IsIHVuc2lnbmVkICppZHgsCiAJCSAgICAgaW50ICpzaXplLCBpbnQgbnJlcSkKIHsKLQlpbnQgZXJyID0gMDsKLQotCWlmICh1bmxpa2VseShtbHg1X3dxX292ZXJmbG93KCZxcC0+c3EsIG5yZXEsIHFwLT5pYnFwLnNlbmRfY3EpKSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlyZXR1cm4gZXJyOwotCX0KKwlpZiAodW5saWtlbHkobWx4NV93cV9vdmVyZmxvdygmcXAtPnNxLCBucmVxLCBxcC0+aWJxcC5zZW5kX2NxKSkpCisJCXJldHVybiAtRU5PTUVNOwogCiAJKmlkeCA9IHFwLT5zcS5jdXJfcG9zdCAmIChxcC0+c3Eud3FlX2NudCAtIDEpOwogCSpzZWcgPSBtbHg1X2dldF9zZW5kX3dxZShxcCwgKmlkeCk7CkBAIC0zNjc5LDcgKzM2NzQsNyBAQAogCSpzZWcgKz0gc2l6ZW9mKCoqY3RybCk7CiAJKnNpemUgPSBzaXplb2YoKipjdHJsKSAvIDE2OwogCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZmluaXNoX3dxZShzdHJ1Y3QgbWx4NV9pYl9xcCAqcXAsCkBAIC0zNzU4LDcgKzM3NTMsNyBAQAogCQludW1fc2dlID0gd3ItPm51bV9zZ2U7CiAJCWlmICh1bmxpa2VseShudW1fc2dlID4gcXAtPnNxLm1heF9ncykpIHsKIAkJCW1seDVfaWJfd2FybihkZXYsICJcbiIpOwotCQkJZXJyID0gLUVOT01FTTsKKwkJCWVyciA9IC1FSU5WQUw7CiAJCQkqYmFkX3dyID0gd3I7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtNDMyMCwyMSArNDMxNSwyNCBAQAogc3RhdGljIGludCBxdWVyeV9xcF9hdHRyKHN0cnVjdCBtbHg1X2liX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9pYl9xcCAqcXAsCiAJCQkgc3RydWN0IGliX3FwX2F0dHIgKnFwX2F0dHIpCiB7Ci0Jc3RydWN0IG1seDVfcXVlcnlfcXBfbWJveF9vdXQgKm91dGI7CisJaW50IG91dGxlbiA9IE1MWDVfU1RfU1pfQllURVMocXVlcnlfcXBfb3V0KTsKIAlzdHJ1Y3QgbWx4NV9xcF9jb250ZXh0ICpjb250ZXh0OwogCWludCBtbHg1X3N0YXRlOworCXUzMiAqb3V0YjsKIAlpbnQgZXJyID0gMDsKIAotCW91dGIgPSBremFsbG9jKHNpemVvZigqb3V0YiksIEdGUF9LRVJORUwpOworCW91dGIgPSBremFsbG9jKG91dGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFvdXRiKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWNvbnRleHQgPSAmb3V0Yi0+Y3R4OwogCWVyciA9IG1seDVfY29yZV9xcF9xdWVyeShkZXYtPm1kZXYsICZxcC0+dHJhbnNfcXAuYmFzZS5tcXAsIG91dGIsCi0JCQkJIHNpemVvZigqb3V0YikpOworCQkJCSBvdXRsZW4pOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCisJLyogRklYTUU6IHVzZSBNTFg1X0dFVCByYXRoZXIgdGhhbiBtbHg1X3FwX2NvbnRleHQgbWFudWFsIHN0cnVjdCAqLworCWNvbnRleHQgPSAoc3RydWN0IG1seDVfcXBfY29udGV4dCAqKU1MWDVfQUREUl9PRihxdWVyeV9xcF9vdXQsIG91dGIsIHFwYyk7CisKIAltbHg1X3N0YXRlID0gYmUzMl90b19jcHUoY29udGV4dC0+ZmxhZ3MpID4+IDI4OwogCiAJcXAtPnN0YXRlCQkgICAgID0gdG9faWJfcXBfc3RhdGUobWx4NV9zdGF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvb2NyZG1hL29jcmRtYV9ody5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L29jcmRtYS9vY3JkbWFfaHcuYwppbmRleCAxNjc0MGRjLi42N2ZjMGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvb2NyZG1hL29jcmRtYV9ody5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9vY3JkbWEvb2NyZG1hX2h3LmMKQEAgLTExNTYsMTggKzExNTYsMTggQEAKIAlhdHRyLT5tYXhfc3JxID0KIAkJKHJzcC0+bWF4X3NycV9ycGlyX3FwcyAmIE9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9TUlFfTUFTSykgPj4KIAkJT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX1NSUV9PRkZTRVQ7Ci0JYXR0ci0+bWF4X3NlbmRfc2dlID0gKChyc3AtPm1heF93cml0ZV9zZW5kX3NnZSAmCisJYXR0ci0+bWF4X3NlbmRfc2dlID0gKChyc3AtPm1heF9yZWN2X3NlbmRfc2dlICYKIAkJCSAgICAgICBPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfU0VORF9TR0VfTUFTSykgPj4KIAkJCSAgICAgIE9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9TRU5EX1NHRV9TSElGVCk7Ci0JYXR0ci0+bWF4X3JlY3Zfc2dlID0gKHJzcC0+bWF4X3dyaXRlX3NlbmRfc2dlICYKLQkJCSAgICAgIE9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9TRU5EX1NHRV9NQVNLKSA+PgotCSAgICBPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfU0VORF9TR0VfU0hJRlQ7CisJYXR0ci0+bWF4X3JlY3Zfc2dlID0gKHJzcC0+bWF4X3JlY3Zfc2VuZF9zZ2UgJgorCQkJICAgICAgT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX1JFQ1ZfU0dFX01BU0spID4+CisJICAgIE9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9SRUNWX1NHRV9TSElGVDsKIAlhdHRyLT5tYXhfc3JxX3NnZSA9IChyc3AtPm1heF9zcnFfcnFlX3NnZSAmCiAJCQkgICAgICBPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfU1JRX1NHRV9NQVNLKSA+PgogCSAgICBPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfU1JRX1NHRV9PRkZTRVQ7Ci0JYXR0ci0+bWF4X3JkbWFfc2dlID0gKHJzcC0+bWF4X3dyaXRlX3NlbmRfc2dlICYKLQkJCSAgICAgIE9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9XUklURV9TR0VfTUFTSykgPj4KLQkgICAgT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX1dSSVRFX1NHRV9TSElGVDsKKwlhdHRyLT5tYXhfcmRtYV9zZ2UgPSAocnNwLT5tYXhfd3JfcmRfc2dlICYKKwkJCSAgICAgIE9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9SRF9TR0VfTUFTSykgPj4KKwkgICAgT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX1JEX1NHRV9TSElGVDsKIAlhdHRyLT5tYXhfb3JkX3Blcl9xcCA9IChyc3AtPm1heF9pcmRfb3JkX3Blcl9xcCAmCiAJCQkJT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX09SRF9QRVJfUVBfTUFTSykgPj4KIAkgICAgT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX09SRF9QRVJfUVBfU0hJRlQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvb2NyZG1hL29jcmRtYV9zbGkuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9vY3JkbWEvb2NyZG1hX3NsaS5oCmluZGV4IDBlZmM5NjYuLjM3ZGY0NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9vY3JkbWEvb2NyZG1hX3NsaS5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9vY3JkbWEvb2NyZG1hX3NsaS5oCkBAIC01NTQsOSArNTU0LDkgQEAKIAlPQ1JETUFfTUJYX1FVRVJZX0NGR19MM19UWVBFX01BU0sJCT0gMHgxOCwKIAlPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfU0VORF9TR0VfU0hJRlQJCT0gMCwKIAlPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfU0VORF9TR0VfTUFTSwkJPSAweEZGRkYsCi0JT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX1dSSVRFX1NHRV9TSElGVAk9IDE2LAotCU9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9XUklURV9TR0VfTUFTSwkJPSAweEZGRkYgPDwKLQkJCQlPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfV1JJVEVfU0dFX1NISUZULAorCU9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9SRUNWX1NHRV9TSElGVAk9IDE2LAorCU9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9SRUNWX1NHRV9NQVNLCQk9IDB4RkZGRiA8PAorCQkJCU9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9SRUNWX1NHRV9TSElGVCwKIAogCU9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9PUkRfUEVSX1FQX1NISUZUCT0gMCwKIAlPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfT1JEX1BFUl9RUF9NQVNLCT0gMHhGRkZGLApAQCAtNjEyLDYgKzYxMiw4IEBACiAJT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX1NSUV9TR0VfT0ZGU0VUCQk9IDAsCiAJT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX1NSUV9TR0VfTUFTSwkJPSAweEZGRkYgPDwKIAkJCQlPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfU1JRX1NHRV9PRkZTRVQsCisJT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX1JEX1NHRV9TSElGVAkJPSAwLAorCU9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9SRF9TR0VfTUFTSwkJPSAweEZGRkYsCiB9OwogCiBzdHJ1Y3Qgb2NyZG1hX21ieF9xdWVyeV9jb25maWcgewpAQCAtNjE5LDcgKzYyMSw3IEBACiAJc3RydWN0IG9jcmRtYV9tYnhfcnNwIHJzcDsKIAl1MzIgcXBfc3JxX2NxX2lyZF9vcmQ7CiAJdTMyIG1heF9wZF9jYV9hY2tfZGVsYXk7Ci0JdTMyIG1heF93cml0ZV9zZW5kX3NnZTsKKwl1MzIgbWF4X3JlY3Zfc2VuZF9zZ2U7CiAJdTMyIG1heF9pcmRfb3JkX3Blcl9xcDsKIAl1MzIgbWF4X3NoYXJlZF9pcmRfb3JkOwogCXUzMiBtYXhfbXI7CkBAIC02MzksNiArNjQxLDggQEAKIAl1MzIgbWF4X3dxZXNfcnFlc19wZXJfcTsKIAl1MzIgbWF4X2NxX2NxZXNfcGVyX2NxOwogCXUzMiBtYXhfc3JxX3JxZV9zZ2U7CisJdTMyIG1heF93cl9yZF9zZ2U7CisJdTMyIGlyZF9wZ3N6X251bV9wYWdlczsKIH07CiAKIHN0cnVjdCBvY3JkbWFfZndfdmVyX3JzcCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvb2NyZG1hL29jcmRtYV92ZXJicy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L29jcmRtYS9vY3JkbWFfdmVyYnMuYwppbmRleCBiMWEzZDkxLi4wYWE4NTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvb2NyZG1hL29jcmRtYV92ZXJicy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9vY3JkbWEvb2NyZG1hX3ZlcmJzLmMKQEAgLTEyNSw4ICsxMjUsOCBAQAogCQkJCQlJQl9ERVZJQ0VfU1lTX0lNQUdFX0dVSUQgfAogCQkJCQlJQl9ERVZJQ0VfTE9DQUxfRE1BX0xLRVkgfAogCQkJCQlJQl9ERVZJQ0VfTUVNX01HVF9FWFRFTlNJT05TOwotCWF0dHItPm1heF9zZ2UgPSBkZXYtPmF0dHIubWF4X3NlbmRfc2dlOwotCWF0dHItPm1heF9zZ2VfcmQgPSBhdHRyLT5tYXhfc2dlOworCWF0dHItPm1heF9zZ2UgPSBtaW4oZGV2LT5hdHRyLm1heF9zZW5kX3NnZSwgZGV2LT5hdHRyLm1heF9yZWN2X3NnZSk7CisJYXR0ci0+bWF4X3NnZV9yZCA9IGRldi0+YXR0ci5tYXhfcmRtYV9zZ2U7CiAJYXR0ci0+bWF4X2NxID0gZGV2LT5hdHRyLm1heF9jcTsKIAlhdHRyLT5tYXhfY3FlID0gZGV2LT5hdHRyLm1heF9jcWU7CiAJYXR0ci0+bWF4X21yID0gZGV2LT5hdHRyLm1heF9tcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYi5oCmluZGV4IGJiZjBhMTYuLmEzZTIxYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWIuaApAQCAtNTIsNiArNTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxyZG1hL2liX2hkcnMuaD4KICNpbmNsdWRlIDxyZG1hL3JkbWFfdnQuaD4KIAogI2luY2x1ZGUgInFpYl9jb21tb24uaCIKQEAgLTExMzEsNyArMTEzMiw2IEBACiBleHRlcm4gc3RydWN0IHFpYl9kZXZkYXRhICpxaWJfbG9va3VwKGludCB1bml0KTsKIGV4dGVybiB1MzIgcWliX2NwdWxpc3RfY291bnQ7CiBleHRlcm4gdW5zaWduZWQgbG9uZyAqcWliX2NwdWxpc3Q7Ci1leHRlcm4gdTE2IHFwdF9tYXNrOwogZXh0ZXJuIHVuc2lnbmVkIHFpYl9jY190YWJsZV9zaXplOwogCiBpbnQgcWliX2luaXQoc3RydWN0IHFpYl9kZXZkYXRhICosIGludCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kZWJ1Z2ZzLmMKaW5kZXggNWU3NWI0My4uNWJhZDhlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2RlYnVnZnMuYwpAQCAtMTg5LDI3ICsxODksMzIgQEAKIERFQlVHRlNfRklMRShjdHhfc3RhdHMpCiAKIHN0YXRpYyB2b2lkICpfcXBfc3RhdHNfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpCisJX19hY3F1aXJlcyhSQ1UpCiB7CiAJc3RydWN0IHFpYl9xcF9pdGVyICppdGVyOwogCWxvZmZfdCBuID0gKnBvczsKIAotCXJjdV9yZWFkX2xvY2soKTsKIAlpdGVyID0gcWliX3FwX2l0ZXJfaW5pdChzLT5wcml2YXRlKTsKKworCS8qIHN0b3AgY2FsbHMgcmN1X3JlYWRfdW5sb2NrICovCisJcmN1X3JlYWRfbG9jaygpOworCiAJaWYgKCFpdGVyKQogCQlyZXR1cm4gTlVMTDsKIAotCXdoaWxlIChuLS0pIHsKKwlkbyB7CiAJCWlmIChxaWJfcXBfaXRlcl9uZXh0KGl0ZXIpKSB7CiAJCQlrZnJlZShpdGVyKTsKIAkJCXJldHVybiBOVUxMOwogCQl9Ci0JfQorCX0gd2hpbGUgKG4tLSk7CiAKIAlyZXR1cm4gaXRlcjsKIH0KIAogc3RhdGljIHZvaWQgKl9xcF9zdGF0c19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKml0ZXJfcHRyLAogCQkJCSAgIGxvZmZfdCAqcG9zKQorCV9fbXVzdF9ob2xkKFJDVSkKIHsKIAlzdHJ1Y3QgcWliX3FwX2l0ZXIgKml0ZXIgPSBpdGVyX3B0cjsKIApAQCAtMjI0LDYgKzIyOSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIF9xcF9zdGF0c19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKml0ZXJfcHRyKQorCV9fcmVsZWFzZXMoUkNVKQogewogCXJjdV9yZWFkX3VubG9jaygpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZHJpdmVyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kcml2ZXIuYwppbmRleCA2N2VlNjQzLi43MjhlMGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kcml2ZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kcml2ZXIuYwpAQCAtMzE5LDggKzMxOSw4IEBACiAJCXJldCA9IDE7CiAJZWxzZSBpZiAoZWZsYWdzID09IFFMT0dJQ19JQl9SSEZfSF9USURFUlIpIHsKIAkJLyogRm9yIFRJREVSUiBhbmQgUkMgUVBzIHByZW1wdGl2ZWx5IHNjaGVkdWxlIGEgTkFLICovCi0JCXN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIgPSAoc3RydWN0IHFpYl9pYl9oZWFkZXIgKikgcmhkcjsKLQkJc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyID0gTlVMTDsKKwkJc3RydWN0IGliX2hlYWRlciAqaGRyID0gKHN0cnVjdCBpYl9oZWFkZXIgKilyaGRyOworCQlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciA9IE5VTEw7CiAJCXN0cnVjdCBxaWJfaWJwb3J0ICppYnAgPSAmcHBkLT5pYnBvcnRfZGF0YTsKIAkJc3RydWN0IHFpYl9kZXZkYXRhICpkZCA9IHBwZC0+ZGQ7CiAJCXN0cnVjdCBydnRfZGV2X2luZm8gKnJkaSA9ICZkZC0+dmVyYnNfZGV2LnJkaTsKQEAgLTU4OCw4ICs1ODgsNyBAQAogCQkJCXFpYl9zY2hlZHVsZV9zZW5kKHFwKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKIAkJfQotCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcXAtPnJlZmNvdW50KSkKLQkJCXdha2VfdXAoJnFwLT53YWl0KTsKKwkJcnZ0X3B1dF9xcChxcCk7CiAJfQogCiBiYWlsOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ZzLmMKaW5kZXggZmNkZjM3OTEuLmMzZWRjMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ZzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZnMuYwpAQCAtMzI4LDI2ICszMjgsMTIgQEAKIAogCXBvcyA9ICpwcG9zOwogCi0JaWYgKHBvcyAhPSAwKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gYmFpbDsKLQl9CisJaWYgKHBvcyAhPSAwIHx8IGNvdW50ICE9IHNpemVvZihzdHJ1Y3QgcWliX2ZsYXNoKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoY291bnQgIT0gc2l6ZW9mKHN0cnVjdCBxaWJfZmxhc2gpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KLQl0bXAgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRtcCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGJhaWw7Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKHRtcCwgYnVmLCBjb3VudCkpIHsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBiYWlsX3RtcDsKLQl9CisJdG1wID0gbWVtZHVwX3VzZXIoYnVmLCBjb3VudCk7CisJaWYgKElTX0VSUih0bXApKQorCQlyZXR1cm4gUFRSX0VSUih0bXApOwogCiAJZGQgPSBwcml2YXRlMmRkKGZpbGUpOwogCWlmIChxaWJfZWVwcm9tX3dyaXRlKGRkLCBwb3MsIHRtcCwgY291bnQpKSB7CkBAIC0zNjEsOCArMzQ3LDYgQEAKIAogYmFpbF90bXA6CiAJa2ZyZWUodG1wKTsKLQotYmFpbDoKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MzIyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MzIyLmMKaW5kZXggY2U0MDM0MC4uZGVkMjcxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzMyMi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTczMjIuYwpAQCAtMTQxNSw3ICsxNDE1LDcgQEAKIAl1MzIgKmhkcjsKIAl1NjQgcGJjOwogCWNvbnN0IHVuc2lnbmVkIGhkcndvcmRzID0gNzsKLQlzdGF0aWMgc3RydWN0IHFpYl9pYl9oZWFkZXIgaWJoZHIgPSB7CisJc3RhdGljIHN0cnVjdCBpYl9oZWFkZXIgaWJoZHIgPSB7CiAJCS5scmhbMF0gPSBjcHVfdG9fYmUxNigweEYwMDAgfCBRSUJfTFJIX0JUSCksCiAJCS5scmhbMV0gPSBJQl9MSURfUEVSTUlTU0lWRSwKIAkJLmxyaFsyXSA9IGNwdV90b19iZTE2KGhkcndvcmRzICsgU0laRV9PRl9DUkMpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3FwLmMKaW5kZXggOWNjMGFhZS4uOTlkMzFlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9xcC5jCkBAIC00MSwxNCArNDEsNiBAQAogCiAjaW5jbHVkZSAicWliLmgiCiAKLS8qCi0gKiBtYXNrIGZpZWxkIHdoaWNoIHdhcyBwcmVzZW50IGluIG5vdyBkZWxldGVkIHFpYl9xcG5fdGFibGUKLSAqIGlzIG5vdCBwcmVzZW50IGluIHJ2dF9xcG5fdGFibGUuIERlZmluaW5nIHRoZSBzYW1lIGZpZWxkCi0gKiBhcyBxcHRfbWFzayBoZXJlIGluc3RlYWQgb2YgYWRkaW5nIHRoZSBtYXNrIGZpZWxkIHRvCi0gKiBydnRfcXBuX3RhYmxlLgotICovCi11MTYgcXB0X21hc2s7Ci0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbWtfcXBuKHN0cnVjdCBydnRfcXBuX3RhYmxlICpxcHQsCiAJCQkgICAgICBzdHJ1Y3QgcnZ0X3Fwbl9tYXAgKm1hcCwgdW5zaWduZWQgb2ZmKQogewpAQCAtNTcsNyArNDksNyBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGZpbmRfbmV4dF9vZmZzZXQoc3RydWN0IHJ2dF9xcG5fdGFibGUgKnFwdCwKIAkJCQkJc3RydWN0IHJ2dF9xcG5fbWFwICptYXAsIHVuc2lnbmVkIG9mZiwKLQkJCQkJdW5zaWduZWQgbikKKwkJCQkJdW5zaWduZWQgbiwgdTE2IHFwdF9tYXNrKQogewogCWlmIChxcHRfbWFzaykgewogCQlvZmYrKzsKQEAgLTE3OSw2ICsxNzEsNyBAQAogCXN0cnVjdCBxaWJfaWJkZXYgKnZlcmJzX2RldiA9IGNvbnRhaW5lcl9vZihyZGksIHN0cnVjdCBxaWJfaWJkZXYsIHJkaSk7CiAJc3RydWN0IHFpYl9kZXZkYXRhICpkZCA9IGNvbnRhaW5lcl9vZih2ZXJic19kZXYsIHN0cnVjdCBxaWJfZGV2ZGF0YSwKIAkJCQkJICAgICAgdmVyYnNfZGV2KTsKKwl1MTYgcXB0X21hc2sgPSBkZC0+cXBuX21hc2s7CiAKIAlpZiAodHlwZSA9PSBJQl9RUFRfU01JIHx8IHR5cGUgPT0gSUJfUVBUX0dTSSkgewogCQl1bnNpZ25lZCBuOwpAQCAtMjE1LDcgKzIwOCw3IEBACiAJCQkJZ290byBiYWlsOwogCQkJfQogCQkJb2Zmc2V0ID0gZmluZF9uZXh0X29mZnNldChxcHQsIG1hcCwgb2Zmc2V0LAotCQkJCWRkLT5uX2tyY3ZfcXVldWVzKTsKKwkJCQlkZC0+bl9rcmN2X3F1ZXVlcywgcXB0X21hc2spOwogCQkJcXBuID0gbWtfcXBuKHFwdCwgbWFwLCBvZmZzZXQpOwogCQkJLyoKIAkJCSAqIFRoaXMgdGVzdCBkaWZmZXJzIGZyb20gYWxsb2NfcGlkbWFwKCkuCkBAIC01NzMsMTAgKzU2Niw2IEBACiAJCXJldHVybiBOVUxMOwogCiAJaXRlci0+ZGV2ID0gZGV2OwotCWlmIChxaWJfcXBfaXRlcl9uZXh0KGl0ZXIpKSB7Ci0JCWtmcmVlKGl0ZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlyZXR1cm4gaXRlcjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3JjLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9yYy5jCmluZGV4IDQ0NDAyOGEuLjIwOTc1MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3JjLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcmMuYwpAQCAtNzUsNyArNzUsNyBAQAogICogTm90ZSB0aGUgUVAgc19sb2NrIG11c3QgYmUgaGVsZC4KICAqLwogc3RhdGljIGludCBxaWJfbWFrZV9yY19hY2soc3RydWN0IHFpYl9pYmRldiAqZGV2LCBzdHJ1Y3QgcnZ0X3FwICpxcCwKLQkJCSAgIHN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkciwgdTMyIHBtdHUpCisJCQkgICBzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciwgdTMyIHBtdHUpCiB7CiAJc3RydWN0IHJ2dF9hY2tfZW50cnkgKmU7CiAJdTMyIGh3b3JkczsKQEAgLTE1NCwxMCArMTU0LDcgQEAKIAkJCWxlbiA9IDA7CiAJCQlxcC0+c19hY2tfc3RhdGUgPSBPUChBVE9NSUNfQUNLTk9XTEVER0UpOwogCQkJb2hkci0+dS5hdC5hZXRoID0gcWliX2NvbXB1dGVfYWV0aChxcCk7Ci0JCQlvaGRyLT51LmF0LmF0b21pY19hY2tfZXRoWzBdID0KLQkJCQljcHVfdG9fYmUzMihlLT5hdG9taWNfZGF0YSA+PiAzMik7Ci0JCQlvaGRyLT51LmF0LmF0b21pY19hY2tfZXRoWzFdID0KLQkJCQljcHVfdG9fYmUzMihlLT5hdG9taWNfZGF0YSk7CisJCQlpYl91NjRfcHV0KGUtPmF0b21pY19kYXRhLCAmb2hkci0+dS5hdC5hdG9taWNfYWNrX2V0aCk7CiAJCQlod29yZHMgKz0gc2l6ZW9mKG9oZHItPnUuYXQpIC8gc2l6ZW9mKHUzMik7CiAJCQlidGgyID0gZS0+cHNuICYgUUlCX1BTTl9NQVNLOwogCQkJZS0+c2VudCA9IDE7CkBAIC0yMzQsNyArMjMxLDcgQEAKIHsKIAlzdHJ1Y3QgcWliX3FwX3ByaXYgKnByaXYgPSBxcC0+cHJpdjsKIAlzdHJ1Y3QgcWliX2liZGV2ICpkZXYgPSB0b19pZGV2KHFwLT5pYnFwLmRldmljZSk7Ci0Jc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXN0cnVjdCBydnRfc2dlX3N0YXRlICpzczsKIAlzdHJ1Y3QgcnZ0X3N3cWUgKndxZTsKIAl1MzIgaHdvcmRzOwpAQCAtNDQ0LDIwICs0NDEsMTggQEAKIAkJCX0KIAkJCWlmICh3cWUtPmF0b21pY193ci53ci5vcGNvZGUgPT0gSUJfV1JfQVRPTUlDX0NNUF9BTkRfU1dQKSB7CiAJCQkJcXAtPnNfc3RhdGUgPSBPUChDT01QQVJFX1NXQVApOwotCQkJCW9oZHItPnUuYXRvbWljX2V0aC5zd2FwX2RhdGEgPSBjcHVfdG9fYmU2NCgKLQkJCQkJd3FlLT5hdG9taWNfd3Iuc3dhcCk7Ci0JCQkJb2hkci0+dS5hdG9taWNfZXRoLmNvbXBhcmVfZGF0YSA9IGNwdV90b19iZTY0KAotCQkJCQl3cWUtPmF0b21pY193ci5jb21wYXJlX2FkZCk7CisJCQkJcHV0X2liX2F0ZXRoX3N3YXAod3FlLT5hdG9taWNfd3Iuc3dhcCwKKwkJCQkJCSAgJm9oZHItPnUuYXRvbWljX2V0aCk7CisJCQkJcHV0X2liX2F0ZXRoX3N3YXAod3FlLT5hdG9taWNfd3IuY29tcGFyZV9hZGQsCisJCQkJCQkgICZvaGRyLT51LmF0b21pY19ldGgpOwogCQkJfSBlbHNlIHsKIAkJCQlxcC0+c19zdGF0ZSA9IE9QKEZFVENIX0FERCk7Ci0JCQkJb2hkci0+dS5hdG9taWNfZXRoLnN3YXBfZGF0YSA9IGNwdV90b19iZTY0KAotCQkJCQl3cWUtPmF0b21pY193ci5jb21wYXJlX2FkZCk7Ci0JCQkJb2hkci0+dS5hdG9taWNfZXRoLmNvbXBhcmVfZGF0YSA9IDA7CisJCQkJcHV0X2liX2F0ZXRoX3N3YXAod3FlLT5hdG9taWNfd3IuY29tcGFyZV9hZGQsCisJCQkJCQkgICZvaGRyLT51LmF0b21pY19ldGgpOworCQkJCXB1dF9pYl9hdGV0aF9zd2FwKDAsICZvaGRyLT51LmF0b21pY19ldGgpOwogCQkJfQotCQkJb2hkci0+dS5hdG9taWNfZXRoLnZhZGRyWzBdID0gY3B1X3RvX2JlMzIoCi0JCQkJd3FlLT5hdG9taWNfd3IucmVtb3RlX2FkZHIgPj4gMzIpOwotCQkJb2hkci0+dS5hdG9taWNfZXRoLnZhZGRyWzFdID0gY3B1X3RvX2JlMzIoCi0JCQkJd3FlLT5hdG9taWNfd3IucmVtb3RlX2FkZHIpOworCQkJcHV0X2liX2F0ZXRoX3ZhZGRyKHdxZS0+YXRvbWljX3dyLnJlbW90ZV9hZGRyLAorCQkJCQkgICAmb2hkci0+dS5hdG9taWNfZXRoKTsKIAkJCW9oZHItPnUuYXRvbWljX2V0aC5ya2V5ID0gY3B1X3RvX2JlMzIoCiAJCQkJd3FlLT5hdG9taWNfd3IucmtleSk7CiAJCQlod29yZHMgKz0gc2l6ZW9mKHN0cnVjdCBpYl9hdG9taWNfZXRoKSAvIHNpemVvZih1MzIpOwpAQCAtNjMyLDggKzYyNyw4IEBACiAJdTMyIGh3b3JkczsKIAl1MzIgcGJ1Zm47CiAJdTMyIF9faW9tZW0gKnBpb2J1ZjsKLQlzdHJ1Y3QgcWliX2liX2hlYWRlciBoZHI7Ci0Jc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9oZWFkZXIgaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXUzMiBjb250cm9sOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTk0Miw5ICs5MzcsOSBAQAogLyoKICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBRUCBzX2xvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4KICAqLwotdm9pZCBxaWJfcmNfc2VuZF9jb21wbGV0ZShzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkcikKK3ZvaWQgcWliX3JjX3NlbmRfY29tcGxldGUoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBpYl9oZWFkZXIgKmhkcikKIHsKLQlzdHJ1Y3QgcWliX290aGVyX2hlYWRlcnMgKm9oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJc3RydWN0IHJ2dF9zd3FlICp3cWU7CiAJc3RydWN0IGliX3djIHdjOwogCXVuc2lnbmVkIGk7CkBAIC0xMTc3LDcgKzExNzIsNyBAQAogCQkJCXFpYl9yZXN0YXJ0X3JjKHFwLCBxcC0+c19sYXN0X3BzbiArIDEsIDApOwogCQkJCWlmIChsaXN0X2VtcHR5KCZxcC0+cnNwd2FpdCkpIHsKIAkJCQkJcXAtPnJfZmxhZ3MgfD0gUlZUX1JfUlNQX1NFTkQ7Ci0JCQkJCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCQkJCXJ2dF9nZXRfcXAocXApOwogCQkJCQlsaXN0X2FkZF90YWlsKCZxcC0+cnNwd2FpdCwKIAkJCQkJCSAgICAgICZyY2QtPnFwX3dhaXRfbGlzdCk7CiAJCQkJfQpAQCAtMTM2MSw3ICsxMzU2LDcgQEAKIAlxaWJfcmVzdGFydF9yYyhxcCwgcXAtPnNfbGFzdF9wc24gKyAxLCAwKTsKIAlpZiAobGlzdF9lbXB0eSgmcXAtPnJzcHdhaXQpKSB7CiAJCXFwLT5yX2ZsYWdzIHw9IFJWVF9SX1JTUF9TRU5EOwotCQlhdG9taWNfaW5jKCZxcC0+cmVmY291bnQpOworCQlydnRfZ2V0X3FwKHFwKTsKIAkJbGlzdF9hZGRfdGFpbCgmcXAtPnJzcHdhaXQsICZyY2QtPnFwX3dhaXRfbGlzdCk7CiAJfQogfQpAQCAtMTM4Myw3ICsxMzc4LDcgQEAKICAqIENhbGxlZCBhdCBpbnRlcnJ1cHQgbGV2ZWwuCiAgKi8KIHN0YXRpYyB2b2lkIHFpYl9yY19yY3ZfcmVzcChzdHJ1Y3QgcWliX2licG9ydCAqaWJwLAotCQkJICAgIHN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkciwKKwkJCSAgICBzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciwKIAkJCSAgICB2b2lkICpkYXRhLCB1MzIgdGxlbiwKIAkJCSAgICBzdHJ1Y3QgcnZ0X3FwICpxcCwKIAkJCSAgICB1MzIgb3Bjb2RlLApAQCAtMTQ2MywxMiArMTQ1OCw5IEBACiAJY2FzZSBPUChBVE9NSUNfQUNLTk9XTEVER0UpOgogCWNhc2UgT1AoUkRNQV9SRUFEX1JFU1BPTlNFX0ZJUlNUKToKIAkJYWV0aCA9IGJlMzJfdG9fY3B1KG9oZHItPnUuYWV0aCk7Ci0JCWlmIChvcGNvZGUgPT0gT1AoQVRPTUlDX0FDS05PV0xFREdFKSkgewotCQkJX19iZTMyICpwID0gb2hkci0+dS5hdC5hdG9taWNfYWNrX2V0aDsKLQotCQkJdmFsID0gKCh1NjQpIGJlMzJfdG9fY3B1KHBbMF0pIDw8IDMyKSB8Ci0JCQkJYmUzMl90b19jcHUocFsxXSk7Ci0JCX0gZWxzZQorCQlpZiAob3Bjb2RlID09IE9QKEFUT01JQ19BQ0tOT1dMRURHRSkpCisJCQl2YWwgPSBpYl91NjRfZ2V0KCZvaGRyLT51LmF0LmF0b21pY19hY2tfZXRoKTsKKwkJZWxzZQogCQkJdmFsID0gMDsKIAkJaWYgKCFkb19yY19hY2socXAsIGFldGgsIHBzbiwgb3Bjb2RlLCB2YWwsIHJjZCkgfHwKIAkJICAgIG9wY29kZSAhPSBPUChSRE1BX1JFQURfUkVTUE9OU0VfRklSU1QpKQpAQCAtMTYwOCw3ICsxNjAwLDcgQEAKICAqIFJldHVybiAxIGlmIG5vIG1vcmUgcHJvY2Vzc2luZyBpcyBuZWVkZWQ7IG90aGVyd2lzZSByZXR1cm4gMCB0bwogICogc2NoZWR1bGUgYSByZXNwb25zZSB0byBiZSBzZW50LgogICovCi1zdGF0aWMgaW50IHFpYl9yY19yY3ZfZXJyb3Ioc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyLAorc3RhdGljIGludCBxaWJfcmNfcmN2X2Vycm9yKHN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyLAogCQkJICAgIHZvaWQgKmRhdGEsCiAJCQkgICAgc3RydWN0IHJ2dF9xcCAqcXAsCiAJCQkgICAgdTMyIG9wY29kZSwKQEAgLTE2NDAsNyArMTYzMiw3IEBACiAJCQkgKi8KIAkJCWlmIChsaXN0X2VtcHR5KCZxcC0+cnNwd2FpdCkpIHsKIAkJCQlxcC0+cl9mbGFncyB8PSBSVlRfUl9SU1BfTkFLOwotCQkJCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCQkJcnZ0X2dldF9xcChxcCk7CiAJCQkJbGlzdF9hZGRfdGFpbCgmcXAtPnJzcHdhaXQsICZyY2QtPnFwX3dhaXRfbGlzdCk7CiAJCQl9CiAJCX0KQEAgLTE4NDgsMTEgKzE4NDAsMTEgQEAKICAqIGZvciB0aGUgZ2l2ZW4gUVAuCiAgKiBDYWxsZWQgYXQgaW50ZXJydXB0IGxldmVsLgogICovCi12b2lkIHFpYl9yY19yY3Yoc3RydWN0IHFpYl9jdHh0ZGF0YSAqcmNkLCBzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyLAordm9pZCBxaWJfcmNfcmN2KHN0cnVjdCBxaWJfY3R4dGRhdGEgKnJjZCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQlpbnQgaGFzX2dyaCwgdm9pZCAqZGF0YSwgdTMyIHRsZW4sIHN0cnVjdCBydnRfcXAgKnFwKQogewogCXN0cnVjdCBxaWJfaWJwb3J0ICppYnAgPSAmcmNkLT5wcGQtPmlicG9ydF9kYXRhOwotCXN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAl1MzIgb3Bjb2RlOwogCXUzMiBoZHJzaXplOwogCXUzMiBwc247CkBAIC0yMTc3LDggKzIxNjksNyBAQAogCQkJZS0+cmRtYV9zZ2UubXIgPSBOVUxMOwogCQl9CiAJCWF0ZXRoID0gJm9oZHItPnUuYXRvbWljX2V0aDsKLQkJdmFkZHIgPSAoKHU2NCkgYmUzMl90b19jcHUoYXRldGgtPnZhZGRyWzBdKSA8PCAzMikgfAotCQkJYmUzMl90b19jcHUoYXRldGgtPnZhZGRyWzFdKTsKKwkJdmFkZHIgPSBnZXRfaWJfYXRldGhfdmFkZHIoYXRldGgpOwogCQlpZiAodW5saWtlbHkodmFkZHIgJiAoc2l6ZW9mKHU2NCkgLSAxKSkpCiAJCQlnb3RvIG5hY2tfaW52X3VubGNrOwogCQlya2V5ID0gYmUzMl90b19jcHUoYXRldGgtPnJrZXkpOwpAQCAtMjE4OSwxMSArMjE4MCwxMSBAQAogCQkJZ290byBuYWNrX2FjY191bmxjazsKIAkJLyogUGVyZm9ybSBhdG9taWMgT1AgYW5kIHNhdmUgcmVzdWx0LiAqLwogCQltYWRkciA9IChhdG9taWM2NF90ICopIHFwLT5yX3NnZS5zZ2UudmFkZHI7Ci0JCXNkYXRhID0gYmU2NF90b19jcHUoYXRldGgtPnN3YXBfZGF0YSk7CisJCXNkYXRhID0gZ2V0X2liX2F0ZXRoX3N3YXAoYXRldGgpOwogCQllLT5hdG9taWNfZGF0YSA9IChvcGNvZGUgPT0gT1AoRkVUQ0hfQUREKSkgPwogCQkJKHU2NCkgYXRvbWljNjRfYWRkX3JldHVybihzZGF0YSwgbWFkZHIpIC0gc2RhdGEgOgogCQkJKHU2NCkgY21weGNoZygodTY0ICopIHFwLT5yX3NnZS5zZ2UudmFkZHIsCi0JCQkJICAgICAgYmU2NF90b19jcHUoYXRldGgtPmNvbXBhcmVfZGF0YSksCisJCQkJICAgICAgZ2V0X2liX2F0ZXRoX2NvbXBhcmUoYXRldGgpLAogCQkJCSAgICAgIHNkYXRhKTsKIAkJcnZ0X3B1dF9tcihxcC0+cl9zZ2Uuc2dlLm1yKTsKIAkJcXAtPnJfc2dlLm51bV9zZ2UgPSAwOwpAQCAtMjIzMyw3ICsyMjI0LDcgQEAKIAkvKiBRdWV1ZSBSTlIgTkFLIGZvciBsYXRlciAqLwogCWlmIChsaXN0X2VtcHR5KCZxcC0+cnNwd2FpdCkpIHsKIAkJcXAtPnJfZmxhZ3MgfD0gUlZUX1JfUlNQX05BSzsKLQkJYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKKwkJcnZ0X2dldF9xcChxcCk7CiAJCWxpc3RfYWRkX3RhaWwoJnFwLT5yc3B3YWl0LCAmcmNkLT5xcF93YWl0X2xpc3QpOwogCX0KIAlyZXR1cm47CkBAIC0yMjQ1LDcgKzIyMzYsNyBAQAogCS8qIFF1ZXVlIE5BSyBmb3IgbGF0ZXIgKi8KIAlpZiAobGlzdF9lbXB0eSgmcXAtPnJzcHdhaXQpKSB7CiAJCXFwLT5yX2ZsYWdzIHw9IFJWVF9SX1JTUF9OQUs7Ci0JCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCXJ2dF9nZXRfcXAocXApOwogCQlsaXN0X2FkZF90YWlsKCZxcC0+cnNwd2FpdCwgJnJjZC0+cXBfd2FpdF9saXN0KTsKIAl9CiAJcmV0dXJuOwpAQCAtMjI1OSw3ICsyMjUwLDcgQEAKIAkvKiBRdWV1ZSBOQUsgZm9yIGxhdGVyICovCiAJaWYgKGxpc3RfZW1wdHkoJnFwLT5yc3B3YWl0KSkgewogCQlxcC0+cl9mbGFncyB8PSBSVlRfUl9SU1BfTkFLOwotCQlhdG9taWNfaW5jKCZxcC0+cmVmY291bnQpOworCQlydnRfZ2V0X3FwKHFwKTsKIAkJbGlzdF9hZGRfdGFpbCgmcXAtPnJzcHdhaXQsICZyY2QtPnFwX3dhaXRfbGlzdCk7CiAJfQogCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3J1Yy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcnVjLmMKaW5kZXggYjY3Nzc5Mi4uZGUxYmRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcnVjLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcnVjLmMKQEAgLTI2NSw3ICsyNjUsNyBAQAogICoKICAqIFRoZSBzX2xvY2sgd2lsbCBiZSBhY3F1aXJlZCBhcm91bmQgdGhlIHFpYl9taWdyYXRlX3FwKCkgY2FsbC4KICAqLwotaW50IHFpYl9ydWNfY2hlY2tfaGRyKHN0cnVjdCBxaWJfaWJwb3J0ICppYnAsIHN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIsCitpbnQgcWliX3J1Y19jaGVja19oZHIoc3RydWN0IHFpYl9pYnBvcnQgKmlicCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQkgICAgICBpbnQgaGFzX2dyaCwgc3RydWN0IHJ2dF9xcCAqcXAsIHUzMiBidGgwKQogewogCV9fYmU2NCBndWlkOwpAQCAtNjgwLDcgKzY4MCw3IEBACiAJcmV0dXJuIHNpemVvZihzdHJ1Y3QgaWJfZ3JoKSAvIHNpemVvZih1MzIpOwogfQogCi12b2lkIHFpYl9tYWtlX3J1Y19oZWFkZXIoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkciwKK3ZvaWQgcWliX21ha2VfcnVjX2hlYWRlcihzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHIsCiAJCQkgdTMyIGJ0aDAsIHUzMiBidGgyKQogewogCXN0cnVjdCBxaWJfcXBfcHJpdiAqcHJpdiA9IHFwLT5wcml2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdWMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VjLmMKaW5kZXggMWQ2MWJkMC4uNWIyZDQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdWMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91Yy5jCkBAIC00OCw3ICs0OCw3IEBACiBpbnQgcWliX21ha2VfdWNfcmVxKHN0cnVjdCBydnRfcXAgKnFwLCB1bnNpZ25lZCBsb25nICpmbGFncykKIHsKIAlzdHJ1Y3QgcWliX3FwX3ByaXYgKnByaXYgPSBxcC0+cHJpdjsKLQlzdHJ1Y3QgcWliX290aGVyX2hlYWRlcnMgKm9oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJc3RydWN0IHJ2dF9zd3FlICp3cWU7CiAJdTMyIGh3b3JkczsKIAl1MzIgYnRoMDsKQEAgLTIzNiwxMCArMjM2LDEwIEBACiAgKiBmb3IgdGhlIGdpdmVuIFFQLgogICogQ2FsbGVkIGF0IGludGVycnVwdCBsZXZlbC4KICAqLwotdm9pZCBxaWJfdWNfcmN2KHN0cnVjdCBxaWJfaWJwb3J0ICppYnAsIHN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIsCit2b2lkIHFpYl91Y19yY3Yoc3RydWN0IHFpYl9pYnBvcnQgKmlicCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQlpbnQgaGFzX2dyaCwgdm9pZCAqZGF0YSwgdTMyIHRsZW4sIHN0cnVjdCBydnRfcXAgKnFwKQogewotCXN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAl1MzIgb3Bjb2RlOwogCXUzMiBoZHJzaXplOwogCXUzMiBwc247CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91ZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdWQuYwppbmRleCAxMGQwNjI1Li5mNDVjYWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91ZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VkLmMKQEAgLTI0NSw3ICsyNDUsNyBAQAogaW50IHFpYl9tYWtlX3VkX3JlcShzdHJ1Y3QgcnZ0X3FwICpxcCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCiB7CiAJc3RydWN0IHFpYl9xcF9wcml2ICpwcml2ID0gcXAtPnByaXY7Ci0Jc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXN0cnVjdCBpYl9haF9hdHRyICphaF9hdHRyOwogCXN0cnVjdCBxaWJfcHBvcnRkYXRhICpwcGQ7CiAJc3RydWN0IHFpYl9pYnBvcnQgKmlicDsKQEAgLTQzNSwxMCArNDM1LDEwIEBACiAgKiBmb3IgdGhlIGdpdmVuIFFQLgogICogQ2FsbGVkIGF0IGludGVycnVwdCBsZXZlbC4KICAqLwotdm9pZCBxaWJfdWRfcmN2KHN0cnVjdCBxaWJfaWJwb3J0ICppYnAsIHN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIsCit2b2lkIHFpYl91ZF9yY3Yoc3RydWN0IHFpYl9pYnBvcnQgKmlicCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQlpbnQgaGFzX2dyaCwgdm9pZCAqZGF0YSwgdTMyIHRsZW4sIHN0cnVjdCBydnRfcXAgKnFwKQogewotCXN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAlpbnQgb3Bjb2RlOwogCXUzMiBoZHJzaXplOwogCXUzMiBwYWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl92ZXJicy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdmVyYnMuYwppbmRleCBmZDFkZmJjLi44NzZlYmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl92ZXJicy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3ZlcmJzLmMKQEAgLTMxMyw3ICszMTMsNyBAQAogICogZm9yIHRoZSBnaXZlbiBRUC4KICAqIENhbGxlZCBhdCBpbnRlcnJ1cHQgbGV2ZWwuCiAgKi8KLXN0YXRpYyB2b2lkIHFpYl9xcF9yY3Yoc3RydWN0IHFpYl9jdHh0ZGF0YSAqcmNkLCBzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyLAorc3RhdGljIHZvaWQgcWliX3FwX3JjdihzdHJ1Y3QgcWliX2N0eHRkYXRhICpyY2QsIHN0cnVjdCBpYl9oZWFkZXIgKmhkciwKIAkJICAgICAgIGludCBoYXNfZ3JoLCB2b2lkICpkYXRhLCB1MzIgdGxlbiwgc3RydWN0IHJ2dF9xcCAqcXApCiB7CiAJc3RydWN0IHFpYl9pYnBvcnQgKmlicCA9ICZyY2QtPnBwZC0+aWJwb3J0X2RhdGE7CkBAIC0zNjYsMTAgKzM2NiwxMCBAQAogewogCXN0cnVjdCBxaWJfcHBvcnRkYXRhICpwcGQgPSByY2QtPnBwZDsKIAlzdHJ1Y3QgcWliX2licG9ydCAqaWJwID0gJnBwZC0+aWJwb3J0X2RhdGE7Ci0Jc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkciA9IHJoZHI7CisJc3RydWN0IGliX2hlYWRlciAqaGRyID0gcmhkcjsKIAlzdHJ1Y3QgcWliX2RldmRhdGEgKmRkID0gcHBkLT5kZDsKIAlzdHJ1Y3QgcnZ0X2Rldl9pbmZvICpyZGkgPSAmZGQtPnZlcmJzX2Rldi5yZGk7Ci0Jc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXN0cnVjdCBydnRfcXAgKnFwOwogCXUzMiBxcF9udW07CiAJaW50IGxuaDsKQEAgLTg0MSw3ICs4NDEsNyBAQAogCWlmICh0eC0+d3FlKQogCQlxaWJfc2VuZF9jb21wbGV0ZShxcCwgdHgtPndxZSwgSUJfV0NfU1VDQ0VTUyk7CiAJZWxzZSBpZiAocXAtPmlicXAucXBfdHlwZSA9PSBJQl9RUFRfUkMpIHsKLQkJc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkcjsKKwkJc3RydWN0IGliX2hlYWRlciAqaGRyOwogCiAJCWlmICh0eC0+dHhyZXEuZmxhZ3MgJiBRSUJfU0RNQV9UWFJFUV9GX0ZSRUVCVUYpCiAJCQloZHIgPSAmdHgtPmFsaWduX2J1Zi0+aGRyOwpAQCAtODg5LDcgKzg4OSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBxaWJfdmVyYnNfc2VuZF9kbWEoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIsCitzdGF0aWMgaW50IHFpYl92ZXJic19zZW5kX2RtYShzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQkJICAgICAgdTMyIGhkcndvcmRzLCBzdHJ1Y3QgcnZ0X3NnZV9zdGF0ZSAqc3MsIHUzMiBsZW4sCiAJCQkgICAgICB1MzIgcGxlbiwgdTMyIGR3b3JkcykKIHsKQEAgLTEwMjUsNyArMTAyNSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBxaWJfdmVyYnNfc2VuZF9waW8oc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBxaWJfaWJfaGVhZGVyICppYmhkciwKK3N0YXRpYyBpbnQgcWliX3ZlcmJzX3NlbmRfcGlvKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaWJfaGVhZGVyICppYmhkciwKIAkJCSAgICAgIHUzMiBoZHJ3b3Jkcywgc3RydWN0IHJ2dF9zZ2Vfc3RhdGUgKnNzLCB1MzIgbGVuLAogCQkJICAgICAgdTMyIHBsZW4sIHUzMiBkd29yZHMpCiB7CkBAIC0xMTMzLDcgKzExMzMsNyBAQAogICogUmV0dXJuIHplcm8gaWYgcGFja2V0IGlzIHNlbnQgb3IgcXVldWVkIE9LLgogICogUmV0dXJuIG5vbi16ZXJvIGFuZCBjbGVhciBxcC0+c19mbGFncyBSVlRfU19CVVNZIG90aGVyd2lzZS4KICAqLwotaW50IHFpYl92ZXJic19zZW5kKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyLAoraW50IHFpYl92ZXJic19zZW5kKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIsCiAJCSAgIHUzMiBoZHJ3b3Jkcywgc3RydWN0IHJ2dF9zZ2Vfc3RhdGUgKnNzLCB1MzIgbGVuKQogewogCXN0cnVjdCBxaWJfZGV2ZGF0YSAqZGQgPSBkZF9mcm9tX2liZGV2KHFwLT5pYnFwLmRldmljZSk7CkBAIC0xNjA2LDggKzE2MDYsNiBAQAogCS8qIE9ubHkgbmVlZCB0byBpbml0aWFsaXplIG5vbi16ZXJvIGZpZWxkcy4gKi8KIAlzZXR1cF90aW1lcigmZGV2LT5tZW1fdGltZXIsIG1lbV90aW1lciwgKHVuc2lnbmVkIGxvbmcpZGV2KTsKIAotCXFwdF9tYXNrID0gZGQtPnFwbl9tYXNrOwotCiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+cGlvd2FpdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+ZG1hd2FpdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+dHh3YWl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3ZlcmJzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl92ZXJicy5oCmluZGV4IDczNmNlZDYuLjk0ZmQzMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3ZlcmJzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdmVyYnMuaApAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxyZG1hL2liX3BhY2suaD4KICNpbmNsdWRlIDxyZG1hL2liX3VzZXJfdmVyYnMuaD4KKyNpbmNsdWRlIDxyZG1hL2liX2hkcnMuaD4KICNpbmNsdWRlIDxyZG1hL3JkbWFfdnQuaD4KICNpbmNsdWRlIDxyZG1hL3JkbWF2dF9jcS5oPgogCkBAIC02MywxNiArNjQsNiBAQAogICovCiAjZGVmaW5lIFFJQl9VVkVSQlNfQUJJX1ZFUlNJT04gICAgICAgMgogCi0jZGVmaW5lIElCX1NFUV9OQUsJKDMgPDwgMjkpCi0KLS8qIEFFVEggTkFLIG9wY29kZSB2YWx1ZXMgKi8KLSNkZWZpbmUgSUJfUk5SX05BSyAgICAgICAgICAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIElCX05BS19QU05fRVJST1IgICAgICAgICAgICAgICAgMHg2MAotI2RlZmluZSBJQl9OQUtfSU5WQUxJRF9SRVFVRVNUICAgICAgICAgIDB4NjEKLSNkZWZpbmUgSUJfTkFLX1JFTU9URV9BQ0NFU1NfRVJST1IgICAgICAweDYyCi0jZGVmaW5lIElCX05BS19SRU1PVEVfT1BFUkFUSU9OQUxfRVJST1IgMHg2MwotI2RlZmluZSBJQl9OQUtfSU5WQUxJRF9SRF9SRVFVRVNUICAgICAgIDB4NjQKLQogLyogSUIgUGVyZm9ybWFuY2UgTWFuYWdlciBzdGF0dXMgdmFsdWVzICovCiAjZGVmaW5lIElCX1BNQV9TQU1QTEVfU1RBVFVTX0RPTkUgICAgICAgMHgwMAogI2RlZmluZSBJQl9QTUFfU0FNUExFX1NUQVRVU19TVEFSVEVEICAgIDB4MDEKQEAgLTg3LDIyICs3OCw5IEBACiAKICNkZWZpbmUgUUlCX1ZFTkRPUl9JUEcJCWNwdV90b19iZTE2KDB4RkZBMCkKIAotI2RlZmluZSBJQl9CVEhfUkVRX0FDSwkJKDEgPDwgMzEpCi0jZGVmaW5lIElCX0JUSF9TT0xJQ0lURUQJKDEgPDwgMjMpCi0jZGVmaW5lIElCX0JUSF9NSUdfUkVRCQkoMSA8PCAyMikKLQogLyogWFhYIFNob3VsZCBiZSBkZWZpbmVkIGluIGliX3ZlcmJzLmggZW51bSBpYl9wb3J0X2NhcF9mbGFncyAqLwogI2RlZmluZSBJQl9QT1JUX09USEVSX0xPQ0FMX0NIQU5HRVNfU1VQICgxIDw8IDI2KQogCi0jZGVmaW5lIElCX0dSSF9WRVJTSU9OCQk2Ci0jZGVmaW5lIElCX0dSSF9WRVJTSU9OX01BU0sJMHhGCi0jZGVmaW5lIElCX0dSSF9WRVJTSU9OX1NISUZUCTI4Ci0jZGVmaW5lIElCX0dSSF9UQ0xBU1NfTUFTSwkweEZGCi0jZGVmaW5lIElCX0dSSF9UQ0xBU1NfU0hJRlQJMjAKLSNkZWZpbmUgSUJfR1JIX0ZMT1dfTUFTSwkweEZGRkZGCi0jZGVmaW5lIElCX0dSSF9GTE9XX1NISUZUCTAKLSNkZWZpbmUgSUJfR1JIX05FWFRfSERSCQkweDFCCi0KICNkZWZpbmUgSUJfREVGQVVMVF9HSURfUFJFRklYCWNwdV90b19iZTY0KDB4ZmU4MDAwMDAwMDAwMDAwMFVMTCkKIAogLyogVmFsdWVzIGZvciBzZXQvZ2V0IHBvcnRpbmZvIFZMQ2FwIE9wZXJhdGlvbmFsVkxzICovCkBAIC0xMjksNjEgKzEwNyw5IEBACiAJfQogfQogCi1zdHJ1Y3QgaWJfcmV0aCB7Ci0JX19iZTY0IHZhZGRyOwotCV9fYmUzMiBya2V5OwotCV9fYmUzMiBsZW5ndGg7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaWJfYXRvbWljX2V0aCB7Ci0JX19iZTMyIHZhZGRyWzJdOyAgICAgICAgLyogdW5hbGlnbmVkIHNvIGFjY2VzcyBhcyAyIDMyLWJpdCB3b3JkcyAqLwotCV9fYmUzMiBya2V5OwotCV9fYmU2NCBzd2FwX2RhdGE7Ci0JX19iZTY0IGNvbXBhcmVfZGF0YTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyB7Ci0JX19iZTMyIGJ0aFszXTsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQlfX2JlMzIgZGV0aFsyXTsKLQkJCV9fYmUzMiBpbW1fZGF0YTsKLQkJfSB1ZDsKLQkJc3RydWN0IHsKLQkJCXN0cnVjdCBpYl9yZXRoIHJldGg7Ci0JCQlfX2JlMzIgaW1tX2RhdGE7Ci0JCX0gcmM7Ci0JCXN0cnVjdCB7Ci0JCQlfX2JlMzIgYWV0aDsKLQkJCV9fYmUzMiBhdG9taWNfYWNrX2V0aFsyXTsKLQkJfSBhdDsKLQkJX19iZTMyIGltbV9kYXRhOwotCQlfX2JlMzIgYWV0aDsKLQkJX19iZTMyIGlldGg7Ci0JCXN0cnVjdCBpYl9hdG9taWNfZXRoIGF0b21pY19ldGg7Ci0JfSB1OwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIE5vdGUgdGhhdCBVRCBwYWNrZXRzIHdpdGggYSBHUkggaGVhZGVyIGFyZSA4KzQwKzEyKzggPSA2OCBieXRlcwotICogbG9uZyAoNzIgdy8gaW1tX2RhdGEpLiAgT25seSB0aGUgZmlyc3QgNTYgYnl0ZXMgb2YgdGhlIElCIGhlYWRlcgotICogd2lsbCBiZSBpbiB0aGUgZWFnZXIgaGVhZGVyIGJ1ZmZlci4gIFRoZSByZW1haW5pbmcgMTIgb3IgMTYgYnl0ZXMKLSAqIGFyZSBpbiB0aGUgZGF0YSBidWZmZXIuCi0gKi8KLXN0cnVjdCBxaWJfaWJfaGVhZGVyIHsKLQlfX2JlMTYgbHJoWzRdOwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCXN0cnVjdCBpYl9ncmggZ3JoOwotCQkJc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzIG90aDsKLQkJfSBsOwotCQlzdHJ1Y3QgcWliX290aGVyX2hlYWRlcnMgb3RoOwotCX0gdTsKLX0gX19wYWNrZWQ7Ci0KIHN0cnVjdCBxaWJfcGlvX2hlYWRlciB7CiAJX19sZTMyIHBiY1syXTsKLQlzdHJ1Y3QgcWliX2liX2hlYWRlciBoZHI7CisJc3RydWN0IGliX2hlYWRlciBoZHI7CiB9IF9fcGFja2VkOwogCiAvKgpAQCAtMTkxLDcgKzExNyw3IEBACiAgKiBpcyBtYWRlIGNvbW1vbi4KICAqLwogc3RydWN0IHFpYl9xcF9wcml2IHsKLQlzdHJ1Y3QgcWliX2liX2hlYWRlciAqc19oZHI7ICAgIC8qIG5leHQgcGFja2V0IGhlYWRlciB0byBzZW5kICovCisJc3RydWN0IGliX2hlYWRlciAqc19oZHI7ICAgICAgICAvKiBuZXh0IHBhY2tldCBoZWFkZXIgdG8gc2VuZCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgaW93YWl0OyAgICAgICAgLyogbGluayBmb3Igd2FpdCBQSU8gYnVmICovCiAJYXRvbWljX3Qgc19kbWFfYnVzeTsKIAlzdHJ1Y3QgcWliX3ZlcmJzX3R4cmVxICpzX3R4OwpAQCAtMzc2LDcgKzMwMiw3IEBACiAKIHZvaWQgcWliX3B1dF90eHJlcShzdHJ1Y3QgcWliX3ZlcmJzX3R4cmVxICp0eCk7CiAKLWludCBxaWJfdmVyYnNfc2VuZChzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkciwKK2ludCBxaWJfdmVyYnNfc2VuZChzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQkgICB1MzIgaGRyd29yZHMsIHN0cnVjdCBydnRfc2dlX3N0YXRlICpzcywgdTMyIGxlbik7CiAKIHZvaWQgcWliX2NvcHlfc2dlKHN0cnVjdCBydnRfc2dlX3N0YXRlICpzcywgdm9pZCAqZGF0YSwgdTMyIGxlbmd0aCwKQEAgLTM4NCwxMCArMzEwLDEwIEBACiAKIHZvaWQgcWliX3NraXBfc2dlKHN0cnVjdCBydnRfc2dlX3N0YXRlICpzcywgdTMyIGxlbmd0aCwgaW50IHJlbGVhc2UpOwogCi12b2lkIHFpYl91Y19yY3Yoc3RydWN0IHFpYl9pYnBvcnQgKmlicCwgc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkciwKK3ZvaWQgcWliX3VjX3JjdihzdHJ1Y3QgcWliX2licG9ydCAqaWJwLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIsCiAJCWludCBoYXNfZ3JoLCB2b2lkICpkYXRhLCB1MzIgdGxlbiwgc3RydWN0IHJ2dF9xcCAqcXApOwogCi12b2lkIHFpYl9yY19yY3Yoc3RydWN0IHFpYl9jdHh0ZGF0YSAqcmNkLCBzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyLAordm9pZCBxaWJfcmNfcmN2KHN0cnVjdCBxaWJfY3R4dGRhdGEgKnJjZCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQlpbnQgaGFzX2dyaCwgdm9pZCAqZGF0YSwgdTMyIHRsZW4sIHN0cnVjdCBydnRfcXAgKnFwKTsKIAogaW50IHFpYl9jaGVja19haChzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgc3RydWN0IGliX2FoX2F0dHIgKmFoX2F0dHIpOwpAQCAtMzk4LDEzICszMjQsMTMgQEAKIAogdm9pZCBxaWJfcmNfcm5yX3JldHJ5KHVuc2lnbmVkIGxvbmcgYXJnKTsKIAotdm9pZCBxaWJfcmNfc2VuZF9jb21wbGV0ZShzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkcik7Cit2b2lkIHFpYl9yY19zZW5kX2NvbXBsZXRlKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIpOwogCiB2b2lkIHFpYl9yY19lcnJvcihzdHJ1Y3QgcnZ0X3FwICpxcCwgZW51bSBpYl93Y19zdGF0dXMgZXJyKTsKIAogaW50IHFpYl9wb3N0X3VkX3NlbmQoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBpYl9zZW5kX3dyICp3cik7CiAKLXZvaWQgcWliX3VkX3JjdihzdHJ1Y3QgcWliX2licG9ydCAqaWJwLCBzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyLAordm9pZCBxaWJfdWRfcmN2KHN0cnVjdCBxaWJfaWJwb3J0ICppYnAsIHN0cnVjdCBpYl9oZWFkZXIgKmhkciwKIAkJaW50IGhhc19ncmgsIHZvaWQgKmRhdGEsIHUzMiB0bGVuLCBzdHJ1Y3QgcnZ0X3FwICpxcCk7CiAKIHZvaWQgbXJfcmN1X2NhbGxiYWNrKHN0cnVjdCByY3VfaGVhZCAqbGlzdCk7CkBAIC00MTMsMTMgKzMzOSwxMyBAQAogCiB2b2lkIHFpYl9taWdyYXRlX3FwKHN0cnVjdCBydnRfcXAgKnFwKTsKIAotaW50IHFpYl9ydWNfY2hlY2tfaGRyKHN0cnVjdCBxaWJfaWJwb3J0ICppYnAsIHN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIsCitpbnQgcWliX3J1Y19jaGVja19oZHIoc3RydWN0IHFpYl9pYnBvcnQgKmlicCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQkgICAgICBpbnQgaGFzX2dyaCwgc3RydWN0IHJ2dF9xcCAqcXAsIHUzMiBidGgwKTsKIAogdTMyIHFpYl9tYWtlX2dyaChzdHJ1Y3QgcWliX2licG9ydCAqaWJwLCBzdHJ1Y3QgaWJfZ3JoICpoZHIsCiAJCSBzdHJ1Y3QgaWJfZ2xvYmFsX3JvdXRlICpncmgsIHUzMiBod29yZHMsIHUzMiBud29yZHMpOwogCi12b2lkIHFpYl9tYWtlX3J1Y19oZWFkZXIoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkciwKK3ZvaWQgcWliX21ha2VfcnVjX2hlYWRlcihzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHIsCiAJCQkgdTMyIGJ0aDAsIHUzMiBidGgyKTsKIAogdm9pZCBfcWliX2RvX3NlbmQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody91c25pYy91c25pY19pYl9tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvdXNuaWMvdXNuaWNfaWJfbWFpbi5jCmluZGV4IGMyMjliOWYuLjBhODlhOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody91c25pYy91c25pY19pYl9tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3VzbmljL3VzbmljX2liX21haW4uYwpAQCAtNjY0LDcgKzY2NCw4IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0JaWYgKHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnVzbmljX2liX3BjaV9kcml2ZXIpKSB7CisJZXJyID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdXNuaWNfaWJfcGNpX2RyaXZlcik7CisJaWYgKGVycikgewogCQl1c25pY19lcnIoIlVuYWJsZSB0byByZWdpc3RlciB3aXRoIFBDSVxuIik7CiAJCWdvdG8gb3V0X3VtZW1fZmluaTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvc3cvcmRtYXZ0L21yLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcmRtYXZ0L21yLmMKaW5kZXggODBjNGI2Yi4uNDZiNjQ5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3JkbWF2dC9tci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yZG1hdnQvbXIuYwpAQCAtMjk0LDcgKzI5NCw3IEBACiB7CiAJcnZ0X2RlaW5pdF9tcmVnaW9uKCZtci0+bXIpOwogCXJ2dF9mcmVlX2xrZXkoJm1yLT5tcik7Ci0JdmZyZWUobXIpOworCWtmcmVlKG1yKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvc3cvcmRtYXZ0L3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcmRtYXZ0L3FwLmMKaW5kZXggYmRiNTQwZi4uNjUwMGMzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3JkbWF2dC9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yZG1hdnQvcXAuYwpAQCAtNDg4LDYwICs0ODgsMjMgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZGktPnFwX2Rldi0+cXB0X2xvY2ssIGZsYWdzKTsKIAlpZiAocmVtb3ZlZCkgewogCQlzeW5jaHJvbml6ZV9yY3UoKTsKLQkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnFwLT5yZWZjb3VudCkpCi0JCQl3YWtlX3VwKCZxcC0+d2FpdCk7CisJCXJ2dF9wdXRfcXAocXApOwogCX0KIH0KIAogLyoqCi0gKiByZXNldF9xcCAtIGluaXRpYWxpemUgdGhlIFFQIHN0YXRlIHRvIHRoZSByZXNldCBzdGF0ZQotICogQHFwOiB0aGUgUVAgdG8gcmVzZXQKKyAqIHJ2dF9pbml0X3FwIC0gaW5pdGlhbGl6ZSB0aGUgUVAgc3RhdGUgdG8gdGhlIHJlc2V0IHN0YXRlCisgKiBAcXA6IHRoZSBRUCB0byBpbml0IG9yIHJlaW5pdAogICogQHR5cGU6IHRoZSBRUCB0eXBlCi0gKiByIGFuZCBzIGxvY2sgYXJlIHJlcXVpcmVkIHRvIGJlIGhlbGQgYnkgdGhlIGNhbGxlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYm90aCBydnRfY3JlYXRlX3FwKCkgYW5kCisgKiBydnRfcmVzZXRfcXAoKS4gICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSByZXNldAorICogcGF0Y2ggdGhlIG5lY2Vzc2FyeSBsb2NrcyB0byBwcm90ZWN0IGFnYWluc3QgY29uY3VyZW50CisgKiBhY2Nlc3MuCiAgKi8KLXN0YXRpYyB2b2lkIHJ2dF9yZXNldF9xcChzdHJ1Y3QgcnZ0X2Rldl9pbmZvICpyZGksIHN0cnVjdCBydnRfcXAgKnFwLAotCQkgIGVudW0gaWJfcXBfdHlwZSB0eXBlKQotCV9fcmVsZWFzZXMoJnFwLT5zX2xvY2spCi0JX19yZWxlYXNlcygmcXAtPnNfaGxvY2spCi0JX19yZWxlYXNlcygmcXAtPnJfbG9jaykKLQlfX2FjcXVpcmVzKCZxcC0+cl9sb2NrKQotCV9fYWNxdWlyZXMoJnFwLT5zX2hsb2NrKQotCV9fYWNxdWlyZXMoJnFwLT5zX2xvY2spCitzdGF0aWMgdm9pZCBydnRfaW5pdF9xcChzdHJ1Y3QgcnZ0X2Rldl9pbmZvICpyZGksIHN0cnVjdCBydnRfcXAgKnFwLAorCQkJZW51bSBpYl9xcF90eXBlIHR5cGUpCiB7Ci0JaWYgKHFwLT5zdGF0ZSAhPSBJQl9RUFNfUkVTRVQpIHsKLQkJcXAtPnN0YXRlID0gSUJfUVBTX1JFU0VUOwotCi0JCS8qIExldCBkcml2ZXJzIGZsdXNoIHRoZWlyIHdhaXRsaXN0ICovCi0JCXJkaS0+ZHJpdmVyX2YuZmx1c2hfcXBfd2FpdGVycyhxcCk7Ci0JCXFwLT5zX2ZsYWdzICY9IH4oUlZUX1NfVElNRVIgfCBSVlRfU19BTllfV0FJVCk7Ci0JCXNwaW5fdW5sb2NrKCZxcC0+c19sb2NrKTsKLQkJc3Bpbl91bmxvY2soJnFwLT5zX2hsb2NrKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZxcC0+cl9sb2NrKTsKLQotCQkvKiBTdG9wIHRoZSBzZW5kIHF1ZXVlIGFuZCB0aGUgcmV0cnkgdGltZXIgKi8KLQkJcmRpLT5kcml2ZXJfZi5zdG9wX3NlbmRfcXVldWUocXApOwotCi0JCS8qIFdhaXQgZm9yIHRoaW5ncyB0byBzdG9wICovCi0JCXJkaS0+ZHJpdmVyX2YucXVpZXNjZV9xcChxcCk7Ci0KLQkJLyogdGFrZSBxcCBvdXQgdGhlIGhhc2ggYW5kIHdhaXQgZm9yIGl0IHRvIGJlIHVudXNlZCAqLwotCQlydnRfcmVtb3ZlX3FwKHJkaSwgcXApOwotCQl3YWl0X2V2ZW50KHFwLT53YWl0LCAhYXRvbWljX3JlYWQoJnFwLT5yZWZjb3VudCkpOwotCi0JCS8qIGdyYWIgdGhlIGxvY2sgYi9jIGl0IHdhcyBsb2NrZWQgYXQgY2FsbCB0aW1lICovCi0JCXNwaW5fbG9ja19pcnEoJnFwLT5yX2xvY2spOwotCQlzcGluX2xvY2soJnFwLT5zX2hsb2NrKTsKLQkJc3Bpbl9sb2NrKCZxcC0+c19sb2NrKTsKLQotCQlydnRfY2xlYXJfbXJfcmVmcyhxcCwgMSk7Ci0JfQotCi0JLyoKLQkgKiBMZXQgdGhlIGRyaXZlciBkbyBhbnkgdGVhciBkb3duIGl0IG5lZWRzIHRvIGZvciBhIHFwCi0JICogdGhhdCBoYXMgYmVlbiByZXNldAotCSAqLwotCXJkaS0+ZHJpdmVyX2Yubm90aWZ5X3FwX3Jlc2V0KHFwKTsKLQogCXFwLT5yZW1vdGVfcXBuID0gMDsKIAlxcC0+cWtleSA9IDA7CiAJcXAtPnFwX2FjY2Vzc19mbGFncyA9IDA7CkBAIC01ODcsNiArNTUwLDYwIEBACiB9CiAKIC8qKgorICogcnZ0X3Jlc2V0X3FwIC0gaW5pdGlhbGl6ZSB0aGUgUVAgc3RhdGUgdG8gdGhlIHJlc2V0IHN0YXRlCisgKiBAcXA6IHRoZSBRUCB0byByZXNldAorICogQHR5cGU6IHRoZSBRUCB0eXBlCisgKgorICogcl9sb2NrLCBzX2hsb2NrLCBhbmQgc19sb2NrIGFyZSByZXF1aXJlZCB0byBiZSBoZWxkIGJ5IHRoZSBjYWxsZXIKKyAqLworc3RhdGljIHZvaWQgcnZ0X3Jlc2V0X3FwKHN0cnVjdCBydnRfZGV2X2luZm8gKnJkaSwgc3RydWN0IHJ2dF9xcCAqcXAsCisJCQkgZW51bSBpYl9xcF90eXBlIHR5cGUpCisJX19tdXN0X2hvbGQoJnFwLT5zX2xvY2spCisJX19tdXN0X2hvbGQoJnFwLT5zX2hsb2NrKQorCV9fbXVzdF9ob2xkKCZxcC0+cl9sb2NrKQoreworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5yX2xvY2spOworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5zX2hsb2NrKTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKKwlpZiAocXAtPnN0YXRlICE9IElCX1FQU19SRVNFVCkgeworCQlxcC0+c3RhdGUgPSBJQl9RUFNfUkVTRVQ7CisKKwkJLyogTGV0IGRyaXZlcnMgZmx1c2ggdGhlaXIgd2FpdGxpc3QgKi8KKwkJcmRpLT5kcml2ZXJfZi5mbHVzaF9xcF93YWl0ZXJzKHFwKTsKKwkJcXAtPnNfZmxhZ3MgJj0gfihSVlRfU19USU1FUiB8IFJWVF9TX0FOWV9XQUlUKTsKKwkJc3Bpbl91bmxvY2soJnFwLT5zX2xvY2spOworCQlzcGluX3VubG9jaygmcXAtPnNfaGxvY2spOworCQlzcGluX3VubG9ja19pcnEoJnFwLT5yX2xvY2spOworCisJCS8qIFN0b3AgdGhlIHNlbmQgcXVldWUgYW5kIHRoZSByZXRyeSB0aW1lciAqLworCQlyZGktPmRyaXZlcl9mLnN0b3Bfc2VuZF9xdWV1ZShxcCk7CisKKwkJLyogV2FpdCBmb3IgdGhpbmdzIHRvIHN0b3AgKi8KKwkJcmRpLT5kcml2ZXJfZi5xdWllc2NlX3FwKHFwKTsKKworCQkvKiB0YWtlIHFwIG91dCB0aGUgaGFzaCBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgdW51c2VkICovCisJCXJ2dF9yZW1vdmVfcXAocmRpLCBxcCk7CisJCXdhaXRfZXZlbnQocXAtPndhaXQsICFhdG9taWNfcmVhZCgmcXAtPnJlZmNvdW50KSk7CisKKwkJLyogZ3JhYiB0aGUgbG9jayBiL2MgaXQgd2FzIGxvY2tlZCBhdCBjYWxsIHRpbWUgKi8KKwkJc3Bpbl9sb2NrX2lycSgmcXAtPnJfbG9jayk7CisJCXNwaW5fbG9jaygmcXAtPnNfaGxvY2spOworCQlzcGluX2xvY2soJnFwLT5zX2xvY2spOworCisJCXJ2dF9jbGVhcl9tcl9yZWZzKHFwLCAxKTsKKwkJLyoKKwkJICogTGV0IHRoZSBkcml2ZXIgZG8gYW55IHRlYXIgZG93biBvciByZS1pbml0IGl0IG5lZWRzIHRvIGZvcgorCQkgKiBhIHFwIHRoYXQgaGFzIGJlZW4gcmVzZXQKKwkJICovCisJCXJkaS0+ZHJpdmVyX2Yubm90aWZ5X3FwX3Jlc2V0KHFwKTsKKwl9CisJcnZ0X2luaXRfcXAocmRpLCBxcCwgdHlwZSk7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnJfbG9jayk7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfaGxvY2spOworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5zX2xvY2spOworfQorCisvKioKICAqIHJ2dF9jcmVhdGVfcXAgLSBjcmVhdGUgYSBxdWV1ZSBwYWlyIGZvciBhIGRldmljZQogICogQGlicGQ6IHRoZSBwcm90ZWN0aW9uIGRvbWFpbiB3aG8ncyBkZXZpY2Ugd2UgY3JlYXRlIHRoZSBxdWV1ZSBwYWlyIGZvcgogICogQGluaXRfYXR0cjogdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHF1ZXVlIHBhaXIKQEAgLTc2Niw3ICs3ODMsNyBAQAogCQl9CiAJCXFwLT5pYnFwLnFwX251bSA9IGVycjsKIAkJcXAtPnBvcnRfbnVtID0gaW5pdF9hdHRyLT5wb3J0X251bTsKLQkJcnZ0X3Jlc2V0X3FwKHJkaSwgcXAsIGluaXRfYXR0ci0+cXBfdHlwZSk7CisJCXJ2dF9pbml0X3FwKHJkaSwgcXAsIGluaXRfYXR0ci0+cXBfdHlwZSk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTg3Myw3ICs4OTAsOCBAQAogCWZyZWVfcXBuKCZyZGktPnFwX2Rldi0+cXBuX3RhYmxlLCBxcC0+aWJxcC5xcF9udW0pOwogCiBiYWlsX3JxX3dxOgotCXZmcmVlKHFwLT5yX3JxLndxKTsKKwlpZiAoIXFwLT5pcCkKKwkJdmZyZWUocXAtPnJfcnEud3EpOwogCiBiYWlsX2RyaXZlcl9wcml2OgogCXJkaS0+ZHJpdmVyX2YucXBfcHJpdl9mcmVlKHJkaSwgcXApOwpAQCAtOTA1LDYgKzkyMyw4IEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IHJ2dF9kZXZfaW5mbyAqcmRpID0gaWJfdG9fcnZ0KHFwLT5pYnFwLmRldmljZSk7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+cl9sb2NrKTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAlpZiAocXAtPnN0YXRlID09IElCX1FQU19FUlIgfHwgcXAtPnN0YXRlID09IElCX1FQU19SRVNFVCkKIAkJZ290byBiYWlsOwogCkBAIC05NzksNyArOTk5LDcgQEAKIAlzdHJ1Y3QgcnZ0X2licG9ydCAqcnZwID0gcmRpLT5wb3J0c1txcC0+cG9ydF9udW0gLSAxXTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKKwlydnRfZ2V0X3FwKHFwKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcmRpLT5xcF9kZXYtPnFwdF9sb2NrLCBmbGFncyk7CiAKIAlpZiAocXAtPmlicXAucXBfbnVtIDw9IDEpIHsKQEAgLTk5Niw3ICsxMDE2LDcgQEAKIH0KIAogLyoqCi0gKiBxaWJfbW9kaWZ5X3FwIC0gbW9kaWZ5IHRoZSBhdHRyaWJ1dGVzIG9mIGEgcXVldWUgcGFpcgorICogcnZ0X21vZGlmeV9xcCAtIG1vZGlmeSB0aGUgYXR0cmlidXRlcyBvZiBhIHF1ZXVlIHBhaXIKICAqIEBpYnFwOiB0aGUgcXVldWUgcGFpciB3aG8ncyBhdHRyaWJ1dGVzIHdlJ3JlIG1vZGlmeWluZwogICogQGF0dHI6IHRoZSBuZXcgYXR0cmlidXRlcwogICogQGF0dHJfbWFzazogdGhlIG1hc2sgb2YgYXR0cmlidXRlcyB0byBtb2RpZnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZS5jCmluZGV4IDU1ZjBlOGYuLmRkZDU5MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGUuYwpAQCAtMzYyLDE1ICszNjIsMzQgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQllcnIgPSByeGVfbmV0X2luaXQoKTsKKwllcnIgPSByeGVfbmV0X2lwdjRfaW5pdCgpOwogCWlmIChlcnIpIHsKLQkJcHJfZXJyKCJyeGU6IHVuYWJsZSB0byBpbml0XG4iKTsKKwkJcHJfZXJyKCJyeGU6IHVuYWJsZSB0byBpbml0IGlwdjQgdHVubmVsXG4iKTsKIAkJcnhlX2NhY2hlX2V4aXQoKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byBleGl0OwogCX0KKworCWVyciA9IHJ4ZV9uZXRfaXB2Nl9pbml0KCk7CisJaWYgKGVycikgeworCQlwcl9lcnIoInJ4ZTogdW5hYmxlIHRvIGluaXQgaXB2NiB0dW5uZWxcbiIpOworCQlyeGVfY2FjaGVfZXhpdCgpOworCQlnb3RvIGV4aXQ7CisJfQorCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZyeGVfbmV0X25vdGlmaWVyKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigicnhlOiBGYWlsZWQgdG8gcmlnaXN0ZXIgbmV0ZGV2IG5vdGlmaWVyXG4iKTsKKwkJZ290byBleGl0OworCX0KKwogCXByX2luZm8oInJ4ZTogbG9hZGVkXG4iKTsKIAogCXJldHVybiAwOworCitleGl0OgorCXJ4ZV9yZWxlYXNlX3VkcF90dW5uZWwocmVjdl9zb2NrZXRzLnNrNCk7CisJcnhlX3JlbGVhc2VfdWRwX3R1bm5lbChyZWN2X3NvY2tldHMuc2s2KTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcnhlX21vZHVsZV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9jb21wLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9jb21wLmMKaW5kZXggMzZmNjdkZS4uMWM1OWVmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfY29tcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX2NvbXAuYwpAQCAtNjg5LDcgKzY4OSwxNCBAQAogCQkJCQlxcC0+cmVxLm5lZWRfcmV0cnkgPSAxOwogCQkJCQlyeGVfcnVuX3Rhc2soJnFwLT5yZXEudGFzaywgMSk7CiAJCQkJfQorCisJCQkJaWYgKHBrdCkgeworCQkJCQlyeGVfZHJvcF9yZWYocGt0LT5xcCk7CisJCQkJCWtmcmVlX3NrYihza2IpOworCQkJCX0KKwogCQkJCWdvdG8gZXhpdDsKKwogCQkJfSBlbHNlIHsKIAkJCQl3cWUtPnN0YXR1cyA9IElCX1dDX1JFVFJZX0VYQ19FUlI7CiAJCQkJc3RhdGUgPSBDT01QU1RfRVJST1I7CkBAIC03MTYsNiArNzIzLDEyIEBACiAJCWNhc2UgQ09NUFNUX0VSUk9SOgogCQkJZG9fY29tcGxldGUocXAsIHdxZSk7CiAJCQlyeGVfcXBfZXJyb3IocXApOworCisJCQlpZiAocGt0KSB7CisJCQkJcnhlX2Ryb3BfcmVmKHBrdC0+cXApOworCQkJCWtmcmVlX3NrYihza2IpOworCQkJfQorCiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9uZXQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX25ldC5jCmluZGV4IDBiOGQyZWEuLmVlZGYyZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX25ldC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX25ldC5jCkBAIC0yNzUsOSArMjc1LDEwIEBACiAJcmV0dXJuIHNvY2s7CiB9CiAKLXN0YXRpYyB2b2lkIHJ4ZV9yZWxlYXNlX3VkcF90dW5uZWwoc3RydWN0IHNvY2tldCAqc2spCit2b2lkIHJ4ZV9yZWxlYXNlX3VkcF90dW5uZWwoc3RydWN0IHNvY2tldCAqc2spCiB7Ci0JdWRwX3R1bm5lbF9zb2NrX3JlbGVhc2Uoc2spOworCWlmIChzaykKKwkJdWRwX3R1bm5lbF9zb2NrX3JlbGVhc2Uoc2spOwogfQogCiBzdGF0aWMgdm9pZCBwcmVwYXJlX3VkcF9oZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgX19iZTE2IHNyY19wb3J0LApAQCAtNjU4LDUxICs2NTksNDUgQEAKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHJ4ZV9uZXRfbm90aWZpZXIgPSB7CitzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcnhlX25ldF9ub3RpZmllciA9IHsKIAkubm90aWZpZXJfY2FsbCA9IHJ4ZV9ub3RpZnksCiB9OwogCi1pbnQgcnhlX25ldF9pbml0KHZvaWQpCitpbnQgcnhlX25ldF9pcHY0X2luaXQodm9pZCkKIHsKLQlpbnQgZXJyOworCXNwaW5fbG9ja19pbml0KCZkZXZfbGlzdF9sb2NrKTsKKworCXJlY3Zfc29ja2V0cy5zazQgPSByeGVfc2V0dXBfdWRwX3R1bm5lbCgmaW5pdF9uZXQsCisJCQkJaHRvbnMoUk9DRV9WMl9VRFBfRFBPUlQpLCBmYWxzZSk7CisJaWYgKElTX0VSUihyZWN2X3NvY2tldHMuc2s0KSkgeworCQlyZWN2X3NvY2tldHMuc2s0ID0gTlVMTDsKKwkJcHJfZXJyKCJyeGU6IEZhaWxlZCB0byBjcmVhdGUgSVB2NCBVRFAgdHVubmVsXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcnhlX25ldF9pcHY2X2luaXQodm9pZCkKK3sKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCiAJc3Bpbl9sb2NrX2luaXQoJmRldl9saXN0X2xvY2spOwogCiAJcmVjdl9zb2NrZXRzLnNrNiA9IHJ4ZV9zZXR1cF91ZHBfdHVubmVsKCZpbml0X25ldCwKLQkJCWh0b25zKFJPQ0VfVjJfVURQX0RQT1JUKSwgdHJ1ZSk7CisJCQkJCQlodG9ucyhST0NFX1YyX1VEUF9EUE9SVCksIHRydWUpOwogCWlmIChJU19FUlIocmVjdl9zb2NrZXRzLnNrNikpIHsKIAkJcmVjdl9zb2NrZXRzLnNrNiA9IE5VTEw7CiAJCXByX2VycigicnhlOiBGYWlsZWQgdG8gY3JlYXRlIElQdjYgVURQIHR1bm5lbFxuIik7CiAJCXJldHVybiAtMTsKIAl9Ci0KLQlyZWN2X3NvY2tldHMuc2s0ID0gcnhlX3NldHVwX3VkcF90dW5uZWwoJmluaXRfbmV0LAotCQkJaHRvbnMoUk9DRV9WMl9VRFBfRFBPUlQpLCBmYWxzZSk7Ci0JaWYgKElTX0VSUihyZWN2X3NvY2tldHMuc2s0KSkgewotCQlyeGVfcmVsZWFzZV91ZHBfdHVubmVsKHJlY3Zfc29ja2V0cy5zazYpOwotCQlyZWN2X3NvY2tldHMuc2s0ID0gTlVMTDsKLQkJcmVjdl9zb2NrZXRzLnNrNiA9IE5VTEw7Ci0JCXByX2VycigicnhlOiBGYWlsZWQgdG8gY3JlYXRlIElQdjQgVURQIHR1bm5lbFxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQllcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnJ4ZV9uZXRfbm90aWZpZXIpOwotCWlmIChlcnIpIHsKLQkJcnhlX3JlbGVhc2VfdWRwX3R1bm5lbChyZWN2X3NvY2tldHMuc2s2KTsKLQkJcnhlX3JlbGVhc2VfdWRwX3R1bm5lbChyZWN2X3NvY2tldHMuc2s0KTsKLQkJcHJfZXJyKCJyeGU6IEZhaWxlZCB0byByaWdpc3RlciBuZXRkZXYgbm90aWZpZXJcbiIpOwotCX0KLQotCXJldHVybiBlcnI7CisjZW5kaWYKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCByeGVfbmV0X2V4aXQodm9pZCkKIHsKLQlpZiAocmVjdl9zb2NrZXRzLnNrNikKLQkJcnhlX3JlbGVhc2VfdWRwX3R1bm5lbChyZWN2X3NvY2tldHMuc2s2KTsKLQotCWlmIChyZWN2X3NvY2tldHMuc2s0KQotCQlyeGVfcmVsZWFzZV91ZHBfdHVubmVsKHJlY3Zfc29ja2V0cy5zazQpOwotCisJcnhlX3JlbGVhc2VfdWRwX3R1bm5lbChyZWN2X3NvY2tldHMuc2s2KTsKKwlyeGVfcmVsZWFzZV91ZHBfdHVubmVsKHJlY3Zfc29ja2V0cy5zazQpOwogCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZyeGVfbmV0X25vdGlmaWVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX25ldC5oIGIvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfbmV0LmgKaW5kZXggN2IwNmY3Ni4uMGRhZjdmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfbmV0LmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfbmV0LmgKQEAgLTQ0LDEwICs0NCwxMyBAQAogfTsKIAogZXh0ZXJuIHN0cnVjdCByeGVfcmVjdl9zb2NrZXRzIHJlY3Zfc29ja2V0czsKK2V4dGVybiBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcnhlX25ldF9ub3RpZmllcjsKK3ZvaWQgcnhlX3JlbGVhc2VfdWRwX3R1bm5lbChzdHJ1Y3Qgc29ja2V0ICpzayk7CiAKIHN0cnVjdCByeGVfZGV2ICpyeGVfbmV0X2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldik7CiAKLWludCByeGVfbmV0X2luaXQodm9pZCk7CitpbnQgcnhlX25ldF9pcHY0X2luaXQodm9pZCk7CitpbnQgcnhlX25ldF9pcHY2X2luaXQodm9pZCk7CiB2b2lkIHJ4ZV9uZXRfZXhpdCh2b2lkKTsKIAogI2VuZGlmIC8qIFJYRV9ORVRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfcmVjdi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfcmVjdi5jCmluZGV4IDNkNDY0YzIuLjE0NGQyZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3JlY3YuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9yZWN2LmMKQEAgLTMxMiw3ICszMTIsNyBAQAogCQkgKiBtYWtlIGEgY29weSBvZiB0aGUgc2tiIHRvIHBvc3QgdG8gdGhlIG5leHQgcXAKIAkJICovCiAJCXNrYl9jb3B5ID0gKG1jZS0+cXBfbGlzdC5uZXh0ICE9ICZtY2ctPnFwX2xpc3QpID8KLQkJCQlza2JfY2xvbmUoc2tiLCBHRlBfS0VSTkVMKSA6IE5VTEw7CisJCQkJc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQykgOiBOVUxMOwogCiAJCXBrdC0+cXAgPSBxcDsKIAkJcnhlX2FkZF9yZWYocXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfcmVxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9yZXEuYwppbmRleCAzM2IyZDlkLi4xM2E4NDhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9yZXEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9yZXEuYwpAQCAtNTExLDI0ICs1MTEsMjEgQEAKIH0KIAogc3RhdGljIHZvaWQgdXBkYXRlX3dxZV9zdGF0ZShzdHJ1Y3QgcnhlX3FwICpxcCwKLQkJCSAgICAgc3RydWN0IHJ4ZV9zZW5kX3dxZSAqd3FlLAotCQkJICAgICBzdHJ1Y3QgcnhlX3BrdF9pbmZvICpwa3QsCi0JCQkgICAgIGVudW0gd3FlX3N0YXRlICpwcmV2X3N0YXRlKQorCQlzdHJ1Y3QgcnhlX3NlbmRfd3FlICp3cWUsCisJCXN0cnVjdCByeGVfcGt0X2luZm8gKnBrdCkKIHsKLQllbnVtIHdxZV9zdGF0ZSBwcmV2X3N0YXRlXyA9IHdxZS0+c3RhdGU7Ci0KIAlpZiAocGt0LT5tYXNrICYgUlhFX0VORF9NQVNLKSB7CiAJCWlmIChxcF90eXBlKHFwKSA9PSBJQl9RUFRfUkMpCiAJCQl3cWUtPnN0YXRlID0gd3FlX3N0YXRlX3BlbmRpbmc7CiAJfSBlbHNlIHsKIAkJd3FlLT5zdGF0ZSA9IHdxZV9zdGF0ZV9wcm9jZXNzaW5nOwogCX0KLQotCSpwcmV2X3N0YXRlID0gcHJldl9zdGF0ZV87CiB9CiAKLXN0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0ZShzdHJ1Y3QgcnhlX3FwICpxcCwgc3RydWN0IHJ4ZV9zZW5kX3dxZSAqd3FlLAotCQkJIHN0cnVjdCByeGVfcGt0X2luZm8gKnBrdCwgaW50IHBheWxvYWQpCitzdGF0aWMgdm9pZCB1cGRhdGVfd3FlX3BzbihzdHJ1Y3QgcnhlX3FwICpxcCwKKwkJCSAgIHN0cnVjdCByeGVfc2VuZF93cWUgKndxZSwKKwkJCSAgIHN0cnVjdCByeGVfcGt0X2luZm8gKnBrdCwKKwkJCSAgIGludCBwYXlsb2FkKQogewogCS8qIG51bWJlciBvZiBwYWNrZXRzIGxlZnQgdG8gc2VuZCBpbmNsdWRpbmcgY3VycmVudCBvbmUgKi8KIAlpbnQgbnVtX3BrdCA9ICh3cWUtPmRtYS5yZXNpZCArIHBheWxvYWQgKyBxcC0+bXR1IC0gMSkgLyBxcC0+bXR1OwpAQCAtNTQ2LDEwICs1NDMsMzUgQEAKIAkJcXAtPnJlcS5wc24gPSAod3FlLT5maXJzdF9wc24gKyBudW1fcGt0KSAmIEJUSF9QU05fTUFTSzsKIAllbHNlCiAJCXFwLT5yZXEucHNuID0gKHFwLT5yZXEucHNuICsgMSkgJiBCVEhfUFNOX01BU0s7Cit9CiAKK3N0YXRpYyB2b2lkIHNhdmVfc3RhdGUoc3RydWN0IHJ4ZV9zZW5kX3dxZSAqd3FlLAorCQkgICAgICAgc3RydWN0IHJ4ZV9xcCAqcXAsCisJCSAgICAgICBzdHJ1Y3QgcnhlX3NlbmRfd3FlICpyb2xsYmFja193cWUsCisJCSAgICAgICBzdHJ1Y3QgcnhlX3FwICpyb2xsYmFja19xcCkKK3sKKwlyb2xsYmFja193cWUtPnN0YXRlICAgICA9IHdxZS0+c3RhdGU7CisJcm9sbGJhY2tfd3FlLT5maXJzdF9wc24gPSB3cWUtPmZpcnN0X3BzbjsKKwlyb2xsYmFja193cWUtPmxhc3RfcHNuICA9IHdxZS0+bGFzdF9wc247CisJcm9sbGJhY2tfcXAtPnJlcS5wc24gICAgPSBxcC0+cmVxLnBzbjsKK30KKworc3RhdGljIHZvaWQgcm9sbGJhY2tfc3RhdGUoc3RydWN0IHJ4ZV9zZW5kX3dxZSAqd3FlLAorCQkJICAgc3RydWN0IHJ4ZV9xcCAqcXAsCisJCQkgICBzdHJ1Y3QgcnhlX3NlbmRfd3FlICpyb2xsYmFja193cWUsCisJCQkgICBzdHJ1Y3QgcnhlX3FwICpyb2xsYmFja19xcCkKK3sKKwl3cWUtPnN0YXRlICAgICA9IHJvbGxiYWNrX3dxZS0+c3RhdGU7CisJd3FlLT5maXJzdF9wc24gPSByb2xsYmFja193cWUtPmZpcnN0X3BzbjsKKwl3cWUtPmxhc3RfcHNuICA9IHJvbGxiYWNrX3dxZS0+bGFzdF9wc247CisJcXAtPnJlcS5wc24gICAgPSByb2xsYmFja19xcC0+cmVxLnBzbjsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRlKHN0cnVjdCByeGVfcXAgKnFwLCBzdHJ1Y3QgcnhlX3NlbmRfd3FlICp3cWUsCisJCQkgc3RydWN0IHJ4ZV9wa3RfaW5mbyAqcGt0LCBpbnQgcGF5bG9hZCkKK3sKIAlxcC0+cmVxLm9wY29kZSA9IHBrdC0+b3Bjb2RlOwogCi0KIAlpZiAocGt0LT5tYXNrICYgUlhFX0VORF9NQVNLKQogCQlxcC0+cmVxLndxZV9pbmRleCA9IG5leHRfaW5kZXgocXAtPnNxLnF1ZXVlLCBxcC0+cmVxLndxZV9pbmRleCk7CiAKQEAgLTU3MSw3ICs1OTMsOCBAQAogCWludCBtdHU7CiAJaW50IG9wY29kZTsKIAlpbnQgcmV0OwotCWVudW0gd3FlX3N0YXRlIHByZXZfc3RhdGU7CisJc3RydWN0IHJ4ZV9xcCByb2xsYmFja19xcDsKKwlzdHJ1Y3QgcnhlX3NlbmRfd3FlIHJvbGxiYWNrX3dxZTsKIAogbmV4dF93cWU6CiAJaWYgKHVubGlrZWx5KCFxcC0+dmFsaWQgfHwgcXAtPnJlcS5zdGF0ZSA9PSBRUF9TVEFURV9FUlJPUikpCkBAIC02ODgsMTMgKzcxMSwyMSBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQl1cGRhdGVfd3FlX3N0YXRlKHFwLCB3cWUsICZwa3QsICZwcmV2X3N0YXRlKTsKKwkvKgorCSAqIFRvIHByZXZlbnQgYSByYWNlIG9uIHdxZSBhY2Nlc3MgYmV0d2VlbiByZXF1ZXN0ZXIgYW5kIGNvbXBsZXRlciwKKwkgKiB3cWUgbWVtYmVycyBzdGF0ZSBhbmQgcHNuIG5lZWQgdG8gYmUgc2V0IGJlZm9yZSBjYWxsaW5nCisJICogcnhlX3htaXRfcGFja2V0KCkuCisJICogT3RoZXJ3aXNlLCBjb21wbGV0ZXIgbWlnaHQgaW5pdGlhdGUgYW4gdW5qdXN0aWZpZWQgcmV0cnkgZmxvdy4KKwkgKi8KKwlzYXZlX3N0YXRlKHdxZSwgcXAsICZyb2xsYmFja193cWUsICZyb2xsYmFja19xcCk7CisJdXBkYXRlX3dxZV9zdGF0ZShxcCwgd3FlLCAmcGt0KTsKKwl1cGRhdGVfd3FlX3BzbihxcCwgd3FlLCAmcGt0LCBwYXlsb2FkKTsKIAlyZXQgPSByeGVfeG1pdF9wYWNrZXQodG9fcmRldihxcC0+aWJxcC5kZXZpY2UpLCBxcCwgJnBrdCwgc2tiKTsKIAlpZiAocmV0KSB7CiAJCXFwLT5uZWVkX3JlcV9za2IgPSAxOwogCQlrZnJlZV9za2Ioc2tiKTsKIAotCQl3cWUtPnN0YXRlID0gcHJldl9zdGF0ZTsKKwkJcm9sbGJhY2tfc3RhdGUod3FlLCBxcCwgJnJvbGxiYWNrX3dxZSwgJnJvbGxiYWNrX3FwKTsKIAogCQlpZiAocmV0ID09IC1FQUdBSU4pIHsKIAkJCXJ4ZV9ydW5fdGFzaygmcXAtPnJlcS50YXNrLCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3Jlc3AuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3Jlc3AuYwppbmRleCBlYmIwM2I0Li4zZTBmMGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9yZXNwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfcmVzcC5jCkBAIC05NzIsMTEgKzk3MiwxMyBAQAogCWZyZWVfcmRfYXRvbWljX3Jlc291cmNlKHFwLCByZXMpOwogCXJ4ZV9hZHZhbmNlX3Jlc3BfcmVzb3VyY2UocXApOwogCisJbWVtY3B5KFNLQl9UT19QS1Qoc2tiKSwgJmFja19wa3QsIHNpemVvZihza2ItPmNiKSk7CisKIAlyZXMtPnR5cGUgPSBSWEVfQVRPTUlDX01BU0s7CiAJcmVzLT5hdG9taWMuc2tiID0gc2tiOwotCXJlcy0+Zmlyc3RfcHNuID0gcXAtPnJlc3AucHNuOwotCXJlcy0+bGFzdF9wc24gPSBxcC0+cmVzcC5wc247Ci0JcmVzLT5jdXJfcHNuID0gcXAtPnJlc3AucHNuOworCXJlcy0+Zmlyc3RfcHNuID0gYWNrX3BrdC5wc247CisJcmVzLT5sYXN0X3BzbiAgPSBhY2tfcGt0LnBzbjsKKwlyZXMtPmN1cl9wc24gICA9IGFja19wa3QucHNuOwogCiAJcmMgPSByeGVfeG1pdF9wYWNrZXQocnhlLCBxcCwgJmFja19wa3QsIHNrYl9jb3B5KTsKIAlpZiAocmMpIHsKQEAgLTExMTYsOCArMTExOCw3IEBACiAJCQkJcmMgPSBSRVNQU1RfQ0xFQU5VUDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJCWJ0aF9zZXRfcHNuKFNLQl9UT19QS1Qoc2tiX2NvcHkpLAotCQkJCSAgICBxcC0+cmVzcC5wc24gLSAxKTsKKwogCQkJLyogUmVzZW5kIHRoZSByZXN1bHQuICovCiAJCQlyYyA9IHJ4ZV94bWl0X3BhY2tldCh0b19yZGV2KHFwLT5pYnFwLmRldmljZSksIHFwLAogCQkJCQkgICAgIHBrdCwgc2tiX2NvcHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oCmluZGV4IDRmN2Q5YjQuLjlkYmZjYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWIuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liLmgKQEAgLTQ3OCw2ICs0NzgsNyBAQAogCQlzdHJ1Y3QgaXBvaWJfYWggKmFkZHJlc3MsIHUzMiBxcG4pOwogdm9pZCBpcG9pYl9yZWFwX2FoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKK3N0cnVjdCBpcG9pYl9wYXRoICpfX3BhdGhfZmluZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpnaWQpOwogdm9pZCBpcG9pYl9tYXJrX3BhdGhzX2ludmFsaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiB2b2lkIGlwb2liX2ZsdXNoX3BhdGhzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogaW50IGlwb2liX2NoZWNrX3NtX3NlbmRvbmx5X2Z1bGxtZW1iZXJfc3VwcG9ydChzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9jbS5jCmluZGV4IDk1MWQ5YWIuLjRhZDI5N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2NtLmMKQEAgLTEzMTgsNiArMTMxOCw4IEBACiAJfQogfQogCisjZGVmaW5lIFFQTl9BTkRfT1BUSU9OU19PRkZTRVQJNAorCiBzdGF0aWMgdm9pZCBpcG9pYl9jbV90eF9zdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcG9pYl9kZXZfcHJpdiwKQEAgLTEzMjYsNiArMTMyOCw3IEBACiAJc3RydWN0IGlwb2liX25laWdoICpuZWlnaDsKIAlzdHJ1Y3QgaXBvaWJfY21fdHggKnA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXBvaWJfcGF0aCAqcGF0aDsKIAlpbnQgcmV0OwogCiAJc3RydWN0IGliX3NhX3BhdGhfcmVjIHBhdGhyZWM7CkBAIC0xMzM4LDcgKzEzNDEsMTkgQEAKIAkJcCA9IGxpc3RfZW50cnkocHJpdi0+Y20uc3RhcnRfbGlzdC5uZXh0LCB0eXBlb2YoKnApLCBsaXN0KTsKIAkJbGlzdF9kZWxfaW5pdCgmcC0+bGlzdCk7CiAJCW5laWdoID0gcC0+bmVpZ2g7CisKIAkJcXBuID0gSVBPSUJfUVBOKG5laWdoLT5kYWRkcik7CisJCS8qCisJCSAqIEFzIGxvbmcgYXMgdGhlIHNlYXJjaCBpcyB3aXRoIHRoZXNlIDIgbG9ja3MsCisJCSAqIHBhdGggZXhpc3RlbmNlIGluZGljYXRlcyBpdHMgdmFsaWRpdHkuCisJCSAqLworCQlwYXRoID0gX19wYXRoX2ZpbmQoZGV2LCBuZWlnaC0+ZGFkZHIgKyBRUE5fQU5EX09QVElPTlNfT0ZGU0VUKTsKKwkJaWYgKCFwYXRoKSB7CisJCQlwcl9pbmZvKCIlcyBpZ25vcmUgbm90IHZhbGlkIHBhdGggJXBJNlxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQluZWlnaC0+ZGFkZHIgKyBRUE5fQU5EX09QVElPTlNfT0ZGU0VUKTsKKwkJCWdvdG8gZnJlZV9uZWlnaDsKKwkJfQogCQltZW1jcHkoJnBhdGhyZWMsICZwLT5wYXRoLT5wYXRocmVjLCBzaXplb2YgcGF0aHJlYyk7CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtMTM1MCw2ICsxMzY1LDcgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAogCQlpZiAocmV0KSB7CitmcmVlX25laWdoOgogCQkJbmVpZ2ggPSBwLT5uZWlnaDsKIAkJCWlmIChuZWlnaCkgewogCQkJCW5laWdoLT5jbSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMKaW5kZXggZGM2ZDI0MS4uYmUxMWQ1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYwpAQCAtMTE2MSw4ICsxMTYxLDE3IEBACiAJfQogCiAJaWYgKGxldmVsID09IElQT0lCX0ZMVVNIX0xJR0hUKSB7CisJCWludCBvcGVyX3VwOwogCQlpcG9pYl9tYXJrX3BhdGhzX2ludmFsaWQoZGV2KTsKKwkJLyogU2V0IElQb0lCIG9wZXJhdGlvbiBhcyBkb3duIHRvIHByZXZlbnQgcmFjZXMgYmV0d2VlbjoKKwkJICogdGhlIGZsdXNoIGZsb3cgd2hpY2ggbGVhdmVzIE1DRyBhbmQgb24gdGhlIGZseSBqb2lucworCQkgKiB3aGljaCBjYW4gaGFwcGVuIGR1cmluZyB0aGF0IHRpbWUuIG1jYXN0IHJlc3RhcnQgdGFzaworCQkgKiBzaG91bGQgZGVhbCB3aXRoIGpvaW4gcmVxdWVzdHMgd2UgbWlzc2VkLgorCQkgKi8KKwkJb3Blcl91cCA9IHRlc3RfYW5kX2NsZWFyX2JpdChJUE9JQl9GTEFHX09QRVJfVVAsICZwcml2LT5mbGFncyk7CiAJCWlwb2liX21jYXN0X2Rldl9mbHVzaChkZXYpOworCQlpZiAob3Blcl91cCkKKwkJCXNldF9iaXQoSVBPSUJfRkxBR19PUEVSX1VQLCAmcHJpdi0+ZmxhZ3MpOwogCQlpcG9pYl9mbHVzaF9haChkZXYpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYwppbmRleCA3NGJjYWEwLi5jYzFjMWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYwpAQCAtNDg1LDcgKzQ4NSw3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXBvaWJfcGF0aCAqX19wYXRoX2ZpbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqZ2lkKQorc3RydWN0IGlwb2liX3BhdGggKl9fcGF0aF9maW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmdpZCkKIHsKIAlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCByYl9ub2RlICpuID0gcHJpdi0+cGF0aF90cmVlLnJiX25vZGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXJ0L2liX2lzZXJ0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXJ0L2liX2lzZXJ0LmMKaW5kZXggYmE2YmUwNi4uY2FlOWJiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VydC9pYl9pc2VydC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlcnQvaWJfaXNlcnQuYwpAQCAtNDAzLDYgKzQwMyw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJmlzZXJ0X2Nvbm4tPm5vZGUpOwogCWluaXRfY29tcGxldGlvbigmaXNlcnRfY29ubi0+bG9naW5fY29tcCk7CiAJaW5pdF9jb21wbGV0aW9uKCZpc2VydF9jb25uLT5sb2dpbl9yZXFfY29tcCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaXNlcnRfY29ubi0+cmVtX3dhaXQpOwogCWtyZWZfaW5pdCgmaXNlcnRfY29ubi0+a3JlZik7CiAJbXV0ZXhfaW5pdCgmaXNlcnRfY29ubi0+bXV0ZXgpOwogCUlOSVRfV09SSygmaXNlcnRfY29ubi0+cmVsZWFzZV93b3JrLCBpc2VydF9yZWxlYXNlX3dvcmspOwpAQCAtNDQ4LDcgKzQ0OSw3IEBACiAKIAlpc2VydF9jb25uLT5sb2dpbl9yc3BfYnVmID0ga3phbGxvYyhJU0VSX1JYX1BBWUxPQURfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpc2VydF9jb25uLT5sb2dpbl9yc3BfYnVmKSB7Ci0JCWlzZXJ0X2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIGlzZXJ0X2Nvbm4tPmxvZ2luX3JzcGJ1ZlxuIik7CisJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X3VubWFwX2xvZ2luX3JlcV9idWY7CiAJfQogCkBAIC01NzgsNyArNTc5LDggQEAKIAlCVUdfT04oIWRldmljZSk7CiAKIAlpc2VydF9mcmVlX3J4X2Rlc2NyaXB0b3JzKGlzZXJ0X2Nvbm4pOwotCWlmIChpc2VydF9jb25uLT5jbV9pZCkKKwlpZiAoaXNlcnRfY29ubi0+Y21faWQgJiYKKwkgICAgIWlzZXJ0X2Nvbm4tPmRldl9yZW1vdmVkKQogCQlyZG1hX2Rlc3Ryb3lfaWQoaXNlcnRfY29ubi0+Y21faWQpOwogCiAJaWYgKGlzZXJ0X2Nvbm4tPnFwKSB7CkBAIC01OTMsNyArNTk1LDEwIEBACiAKIAlpc2VydF9kZXZpY2VfcHV0KGRldmljZSk7CiAKLQlrZnJlZShpc2VydF9jb25uKTsKKwlpZiAoaXNlcnRfY29ubi0+ZGV2X3JlbW92ZWQpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaXNlcnRfY29ubi0+cmVtX3dhaXQpOworCWVsc2UKKwkJa2ZyZWUoaXNlcnRfY29ubik7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC03NTMsNiArNzU4LDcgQEAKIGlzZXJ0X2NtYV9oYW5kbGVyKHN0cnVjdCByZG1hX2NtX2lkICpjbWFfaWQsIHN0cnVjdCByZG1hX2NtX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgaXNlcnRfbnAgKmlzZXJ0X25wID0gY21hX2lkLT5jb250ZXh0OworCXN0cnVjdCBpc2VydF9jb25uICppc2VydF9jb25uOwogCWludCByZXQgPSAwOwogCiAJaXNlcnRfaW5mbygiJXMgKCVkKTogc3RhdHVzICVkIGlkICVwIG5wICVwXG4iLApAQCAtNzczLDEwICs3NzksMjEgQEAKIAkJYnJlYWs7CiAJY2FzZSBSRE1BX0NNX0VWRU5UX0FERFJfQ0hBTkdFOiAgICAvKiBGQUxMVEhSVSAqLwogCWNhc2UgUkRNQV9DTV9FVkVOVF9ESVNDT05ORUNURUQ6ICAgLyogRkFMTFRIUlUgKi8KLQljYXNlIFJETUFfQ01fRVZFTlRfREVWSUNFX1JFTU9WQUw6IC8qIEZBTExUSFJVICovCiAJY2FzZSBSRE1BX0NNX0VWRU5UX1RJTUVXQUlUX0VYSVQ6ICAvKiBGQUxMVEhSVSAqLwogCQlyZXQgPSBpc2VydF9kaXNjb25uZWN0ZWRfaGFuZGxlcihjbWFfaWQsIGV2ZW50LT5ldmVudCk7CiAJCWJyZWFrOworCWNhc2UgUkRNQV9DTV9FVkVOVF9ERVZJQ0VfUkVNT1ZBTDoKKwkJaXNlcnRfY29ubiA9IGNtYV9pZC0+cXAtPnFwX2NvbnRleHQ7CisJCWlzZXJ0X2Nvbm4tPmRldl9yZW1vdmVkID0gdHJ1ZTsKKwkJaXNlcnRfZGlzY29ubmVjdGVkX2hhbmRsZXIoY21hX2lkLCBldmVudC0+ZXZlbnQpOworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaXNlcnRfY29ubi0+cmVtX3dhaXQsCisJCQkJCSBpc2VydF9jb25uLT5zdGF0ZSA9PSBJU0VSX0NPTk5fRE9XTik7CisJCWtmcmVlKGlzZXJ0X2Nvbm4pOworCQkvKgorCQkgKiByZXR1cm4gbm9uLXplcm8gZnJvbSB0aGUgY2FsbGJhY2sgdG8gZGVzdHJveQorCQkgKiB0aGUgcmRtYSBjbSBpZAorCQkgKi8KKwkJcmV0dXJuIDE7CiAJY2FzZSBSRE1BX0NNX0VWRU5UX1JFSkVDVEVEOiAgICAgICAvKiBGQUxMVEhSVSAqLwogCWNhc2UgUkRNQV9DTV9FVkVOVF9VTlJFQUNIQUJMRTogICAgLyogRkFMTFRIUlUgKi8KIAljYXNlIFJETUFfQ01fRVZFTlRfQ09OTkVDVF9FUlJPUjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlcnQvaWJfaXNlcnQuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlcnQvaWJfaXNlcnQuaAppbmRleCBmYzc5MWVmLi5jMDJhZGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXJ0L2liX2lzZXJ0LmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VydC9pYl9pc2VydC5oCkBAIC0xNTgsNiArMTU4LDggQEAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcmVsZWFzZV93b3JrOwogCWJvb2wgICAgICAgICAgICAgICAgICAgIGxvZ291dF9wb3N0ZWQ7CiAJYm9vbCAgICAgICAgICAgICAgICAgICAgc25kX3dfaW52OworCXdhaXRfcXVldWVfaGVhZF90CXJlbV93YWl0OworCWJvb2wJCQlkZXZfcmVtb3ZlZDsKIH07CiAKICNkZWZpbmUgSVNFUlRfTUFYX0NRIDY0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycHQvaWJfc3JwdC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnB0L2liX3NycHQuYwppbmRleCBkZmEyM2IwLi44ODNiYmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycHQvaWJfc3JwdC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwdC9pYl9zcnB0LmMKQEAgLTUyMiw2ICs1MjIsMTEgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl9xdWVyeV9wb3J0OwogCisJc25wcmludGYoc3BvcnQtPnBvcnRfZ3VpZCwgc2l6ZW9mKHNwb3J0LT5wb3J0X2d1aWQpLAorCQkiMHglMDE2bGx4JTAxNmxseCIsCisJCWJlNjRfdG9fY3B1KHNwb3J0LT5naWQuZ2xvYmFsLnN1Ym5ldF9wcmVmaXgpLAorCQliZTY0X3RvX2NwdShzcG9ydC0+Z2lkLmdsb2JhbC5pbnRlcmZhY2VfaWQpKTsKKwogCWlmICghc3BvcnQtPm1hZF9hZ2VudCkgewogCQltZW1zZXQoJnJlZ19yZXEsIDAsIHNpemVvZihyZWdfcmVxKSk7CiAJCXJlZ19yZXEubWdtdF9jbGFzcyA9IElCX01HTVRfQ0xBU1NfREVWSUNFX01HTVQ7CkBAIC0yNTQ4LDEwICsyNTUzLDYgQEAKIAkJCSAgICAgICBzZGV2LT5kZXZpY2UtPm5hbWUsIGkpOwogCQkJZ290byBlcnJfcmluZzsKIAkJfQotCQlzbnByaW50ZihzcG9ydC0+cG9ydF9ndWlkLCBzaXplb2Yoc3BvcnQtPnBvcnRfZ3VpZCksCi0JCQkiMHglMDE2bGx4JTAxNmxseCIsCi0JCQliZTY0X3RvX2NwdShzcG9ydC0+Z2lkLmdsb2JhbC5zdWJuZXRfcHJlZml4KSwKLQkJCWJlNjRfdG9fY3B1KHNwb3J0LT5naWQuZ2xvYmFsLmludGVyZmFjZV9pZCkpOwogCX0KIAogCXNwaW5fbG9jaygmc3JwdF9kZXZfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveWRldi5jIGIvZHJpdmVycy9pbnB1dC9qb3lkZXYuYwppbmRleCA1ZDExZmVhLi5mMzEzNWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveWRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95ZGV2LmMKQEAgLTk1MCw2ICs5NTAsMTIgQEAKIAkJLmZsYWdzID0gSU5QVVRfREVWSUNFX0lEX01BVENIX0VWQklUIHwKIAkJCQlJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfQUJTQklULAogCQkuZXZiaXQgPSB7IEJJVF9NQVNLKEVWX0FCUykgfSwKKwkJLmFic2JpdCA9IHsgQklUX01BU0soQUJTX1opIH0sCisJfSwKKwl7CisJCS5mbGFncyA9IElOUFVUX0RFVklDRV9JRF9NQVRDSF9FVkJJVCB8CisJCQkJSU5QVVRfREVWSUNFX0lEX01BVENIX0FCU0JJVCwKKwkJLmV2Yml0ID0geyBCSVRfTUFTSyhFVl9BQlMpIH0sCiAJCS5hYnNiaXQgPSB7IEJJVF9NQVNLKEFCU19XSEVFTCkgfSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdGVncmEta2JjLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3RlZ3JhLWtiYy5jCmluZGV4IDdkNjE0MzkuLjBjMDdlMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdGVncmEta2JjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90ZWdyYS1rYmMuYwpAQCAtMzc2LDcgKzM3Niw3IEBACiAJLyogUmVzZXQgdGhlIEtCQyBjb250cm9sbGVyIHRvIGNsZWFyIGFsbCBwcmV2aW91cyBzdGF0dXMuKi8KIAlyZXNldF9jb250cm9sX2Fzc2VydChrYmMtPnJzdCk7CiAJdWRlbGF5KDEwMCk7Ci0JcmVzZXRfY29udHJvbF9hc3NlcnQoa2JjLT5yc3QpOworCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQoa2JjLT5yc3QpOwogCXVkZWxheSgxMDApOwogCiAJdGVncmFfa2JjX2NvbmZpZ19waW5zKGtiYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvdWlucHV0LmMgYi9kcml2ZXJzL2lucHV0L21pc2MvdWlucHV0LmMKaW5kZXggNjVlYmJkMS4uOTI1OTViOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL3VpbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy91aW5wdXQuYwpAQCAtMTAxMywyMyArMTAxMywxMiBAQAogCS5taW5vcgkJPSBVSU5QVVRfTUlOT1IsCiAJLm5hbWUJCT0gVUlOUFVUX05BTUUsCiB9OworbW9kdWxlX21pc2NfZGV2aWNlKHVpbnB1dF9taXNjKTsKKwogTU9EVUxFX0FMSUFTX01JU0NERVYoVUlOUFVUX01JTk9SKTsKIE1PRFVMRV9BTElBUygiZGV2bmFtZToiIFVJTlBVVF9OQU1FKTsKIAotc3RhdGljIGludCBfX2luaXQgdWlucHV0X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmdWlucHV0X21pc2MpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdWlucHV0X2V4aXQodm9pZCkKLXsKLQltaXNjX2RlcmVnaXN0ZXIoJnVpbnB1dF9taXNjKTsKLX0KLQogTU9EVUxFX0FVVEhPUigiQXJpc3RldSBTZXJnaW8gUm96YW5za2kgRmlsaG8iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVXNlciBsZXZlbCBkcml2ZXIgc3VwcG9ydCBmb3IgaW5wdXQgc3Vic3lzdGVtIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfVkVSU0lPTigiMC4zIik7Ci0KLW1vZHVsZV9pbml0KHVpbnB1dF9pbml0KTsKLW1vZHVsZV9leGl0KHVpbnB1dF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvcm1pNC9ybWlfZHJpdmVyLmMgYi9kcml2ZXJzL2lucHV0L3JtaTQvcm1pX2RyaXZlci5jCmluZGV4IGZhYTI5NWUuLmM4M2JjZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvcm1pNC9ybWlfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9ybWk0L3JtaV9kcml2ZXIuYwpAQCAtNTUzLDcgKzU1Myw2IEBACiAJCWdvdG8gZnJlZV9zdHJ1Y3RfYnVmZjsKIAogCXJlZyA9IGZpbmRfZmlyc3RfYml0KHJkZXNjLT5wcmVzZW5zZV9tYXAsIFJNSV9SRUdfREVTQ19QUkVTRU5TRV9CSVRTKTsKLQltYXBfb2Zmc2V0ID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgcmRlc2MtPm51bV9yZWdpc3RlcnM7IGkrKykgewogCQlzdHJ1Y3Qgcm1pX3JlZ2lzdGVyX2Rlc2NfaXRlbSAqaXRlbSA9ICZyZGVzYy0+cmVnaXN0ZXJzW2ldOwogCQlpbnQgcmVnX3NpemUgPSBzdHJ1Y3RfYnVmW29mZnNldF07CkBAIC01NzYsNiArNTc1LDggQEAKIAkJaXRlbS0+cmVnID0gcmVnOwogCQlpdGVtLT5yZWdfc2l6ZSA9IHJlZ19zaXplOwogCisJCW1hcF9vZmZzZXQgPSAwOworCiAJCWRvIHsKIAkJCWZvciAoYiA9IDA7IGIgPCA3OyBiKyspIHsKIAkJCQlpZiAoc3RydWN0X2J1ZltvZmZzZXRdICYgKDB4MSA8PCBiKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIuYwppbmRleCBiNGQzNDA4Li40MDUyNTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi5jCkBAIC0xMzA1LDYgKzEzMDUsNyBAQAogCXNlcmlvLT53cml0ZQkJPSBpODA0Ml9hdXhfd3JpdGU7CiAJc2VyaW8tPnN0YXJ0CQk9IGk4MDQyX3N0YXJ0OwogCXNlcmlvLT5zdG9wCQk9IGk4MDQyX3N0b3A7CisJc2VyaW8tPnBzMl9jbWRfbXV0ZXgJPSAmaTgwNDJfbXV0ZXg7CiAJc2VyaW8tPnBvcnRfZGF0YQk9IHBvcnQ7CiAJc2VyaW8tPmRldi5wYXJlbnQJPSAmaTgwNDJfcGxhdGZvcm1fZGV2aWNlLT5kZXY7CiAJaWYgKGlkeCA8IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKaW5kZXggYTYxYjIxNS4uMWNlM2VjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKQEAgLTE0NzMsNyArMTQ3Myw2IEBACiAKIAlhZHM3ODR4X2h3bW9uX3VucmVnaXN0ZXIoc3BpLCB0cyk7CiAKLQlyZWd1bGF0b3JfZGlzYWJsZSh0cy0+cmVnKTsKIAlyZWd1bGF0b3JfcHV0KHRzLT5yZWcpOwogCiAJaWYgKCF0cy0+Z2V0X3BlbmRvd25fc3RhdGUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vc2lsZWFkLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3NpbGVhZC5jCmluZGV4IDczNzlmZTEuLmY1MDJjODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vc2lsZWFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9zaWxlYWQuYwpAQCAtMzkwLDkgKzM5MCwxMCBAQAogCQlkYXRhLT5tYXhfZmluZ2VycyA9IDU7IC8qIE1vc3QgZGV2aWNlcyBoYW5kbGUgdXAtdG8gNSBmaW5nZXJzICovCiAJfQogCi0JZXJyb3IgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9zdHJpbmcoZGV2LCAidG91Y2hzY3JlZW4tZnctbmFtZSIsICZzdHIpOworCWVycm9yID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfc3RyaW5nKGRldiwgImZpcm13YXJlLW5hbWUiLCAmc3RyKTsKIAlpZiAoIWVycm9yKQotCQlzbnByaW50ZihkYXRhLT5md19uYW1lLCBzaXplb2YoZGF0YS0+ZndfbmFtZSksICIlcyIsIHN0cik7CisJCXNucHJpbnRmKGRhdGEtPmZ3X25hbWUsIHNpemVvZihkYXRhLT5md19uYW1lKSwKKwkJCSAic2lsZWFkLyVzIiwgc3RyKTsKIAllbHNlCiAJCWRldl9kYmcoZGV2LCAiRmlybXdhcmUgZmlsZSBuYW1lIHJlYWQgZXJyb3IuIFVzaW5nIGRlZmF1bHQuIik7CiB9CkBAIC00MTAsMTQgKzQxMSwxNCBAQAogCQlpZiAoIWFjcGlfaWQpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAotCQlzbnByaW50ZihkYXRhLT5md19uYW1lLCBzaXplb2YoZGF0YS0+ZndfbmFtZSksICIlcy5mdyIsCi0JCQlhY3BpX2lkLT5pZCk7CisJCXNucHJpbnRmKGRhdGEtPmZ3X25hbWUsIHNpemVvZihkYXRhLT5md19uYW1lKSwKKwkJCSAic2lsZWFkLyVzLmZ3IiwgYWNwaV9pZC0+aWQpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4oZGF0YS0+ZndfbmFtZSk7IGkrKykKIAkJCWRhdGEtPmZ3X25hbWVbaV0gPSB0b2xvd2VyKGRhdGEtPmZ3X25hbWVbaV0pOwogCX0gZWxzZSB7Ci0JCXNucHJpbnRmKGRhdGEtPmZ3X25hbWUsIHNpemVvZihkYXRhLT5md19uYW1lKSwgIiVzLmZ3IiwKLQkJCWlkLT5uYW1lKTsKKwkJc25wcmludGYoZGF0YS0+ZndfbmFtZSwgc2l6ZW9mKGRhdGEtPmZ3X25hbWUpLAorCQkJICJzaWxlYWQvJXMuZnciLCBpZC0+bmFtZSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC00MjYsNyArNDI3LDggQEAKIHN0YXRpYyBpbnQgc2lsZWFkX3RzX3NldF9kZWZhdWx0X2Z3X25hbWUoc3RydWN0IHNpbGVhZF90c19kYXRhICpkYXRhLAogCQkJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewotCXNucHJpbnRmKGRhdGEtPmZ3X25hbWUsIHNpemVvZihkYXRhLT5md19uYW1lKSwgIiVzLmZ3IiwgaWQtPm5hbWUpOworCXNucHJpbnRmKGRhdGEtPmZ3X25hbWUsIHNpemVvZihkYXRhLT5md19uYW1lKSwKKwkJICJzaWxlYWQvJXMuZnciLCBpZC0+bmFtZSk7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKQEAgLTQ2NCw3ICs0NjYsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIFBvd2VyIEdQSU8gcGluICovCi0JZGF0YS0+Z3Bpb19wb3dlciA9IGdwaW9kX2dldF9vcHRpb25hbChkZXYsICJwb3dlciIsIEdQSU9EX09VVF9MT1cpOworCWRhdGEtPmdwaW9fcG93ZXIgPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbChkZXYsICJwb3dlciIsIEdQSU9EX09VVF9MT1cpOwogCWlmIChJU19FUlIoZGF0YS0+Z3Bpb19wb3dlcikpIHsKIAkJaWYgKFBUUl9FUlIoZGF0YS0+Z3Bpb19wb3dlcikgIT0gLUVQUk9CRV9ERUZFUikKIAkJCWRldl9lcnIoZGV2LCAiU2h1dGRvd24gR1BJTyByZXF1ZXN0IGZhaWxlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2FtZF9pb21tdS5jIGIvZHJpdmVycy9pb21tdS9hbWRfaW9tbXUuYwppbmRleCA5NmRlOTdhLi40MDI1MjkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2FtZF9pb21tdS5jCisrKyBiL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11LmMKQEAgLTk0MCwxNSArOTQwLDEzIEBACiAgKiBXcml0ZXMgdGhlIGNvbW1hbmQgdG8gdGhlIElPTU1VcyBjb21tYW5kIGJ1ZmZlciBhbmQgaW5mb3JtcyB0aGUKICAqIGhhcmR3YXJlIGFib3V0IHRoZSBuZXcgY29tbWFuZC4KICAqLwotc3RhdGljIGludCBpb21tdV9xdWV1ZV9jb21tYW5kX3N5bmMoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsCi0JCQkJICAgIHN0cnVjdCBpb21tdV9jbWQgKmNtZCwKLQkJCQkgICAgYm9vbCBzeW5jKQorc3RhdGljIGludCBfX2lvbW11X3F1ZXVlX2NvbW1hbmRfc3luYyhzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwKKwkJCQkgICAgICBzdHJ1Y3QgaW9tbXVfY21kICpjbWQsCisJCQkJICAgICAgYm9vbCBzeW5jKQogewogCXUzMiBsZWZ0LCB0YWlsLCBoZWFkLCBuZXh0X3RhaWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogYWdhaW46Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiAKIAloZWFkICAgICAgPSByZWFkbChpb21tdS0+bW1pb19iYXNlICsgTU1JT19DTURfSEVBRF9PRkZTRVQpOwogCXRhaWwgICAgICA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NNRF9UQUlMX09GRlNFVCk7CkBAIC05NTcsMTUgKzk1NSwxNCBAQAogCiAJaWYgKGxlZnQgPD0gMikgewogCQlzdHJ1Y3QgaW9tbXVfY21kIHN5bmNfY21kOwotCQl2b2xhdGlsZSB1NjQgc2VtID0gMDsKIAkJaW50IHJldDsKIAotCQlidWlsZF9jb21wbGV0aW9uX3dhaXQoJnN5bmNfY21kLCAodTY0KSZzZW0pOworCQlpb21tdS0+Y21kX3NlbSA9IDA7CisKKwkJYnVpbGRfY29tcGxldGlvbl93YWl0KCZzeW5jX2NtZCwgKHU2NCkmaW9tbXUtPmNtZF9zZW0pOwogCQljb3B5X2NtZF90b19idWZmZXIoaW9tbXUsICZzeW5jX2NtZCwgdGFpbCk7CiAKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAoKHJldCA9IHdhaXRfb25fc2VtKCZzZW0pKSAhPSAwKQorCQlpZiAoKHJldCA9IHdhaXRfb25fc2VtKCZpb21tdS0+Y21kX3NlbSkpICE9IDApCiAJCQlyZXR1cm4gcmV0OwogCiAJCWdvdG8gYWdhaW47CkBAIC05NzYsOSArOTczLDIxIEBACiAJLyogV2UgbmVlZCB0byBzeW5jIG5vdyB0byBtYWtlIHN1cmUgYWxsIGNvbW1hbmRzIGFyZSBwcm9jZXNzZWQgKi8KIAlpb21tdS0+bmVlZF9zeW5jID0gc3luYzsKIAorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvbW11X3F1ZXVlX2NvbW1hbmRfc3luYyhzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwKKwkJCQkgICAgc3RydWN0IGlvbW11X2NtZCAqY21kLAorCQkJCSAgICBib29sIHN5bmMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisJcmV0ID0gX19pb21tdV9xdWV1ZV9jb21tYW5kX3N5bmMoaW9tbXUsIGNtZCwgc3luYyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaW9tbXVfcXVldWVfY29tbWFuZChzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwgc3RydWN0IGlvbW11X2NtZCAqY21kKQpAQCAtOTkzLDE5ICsxMDAyLDI5IEBACiBzdGF0aWMgaW50IGlvbW11X2NvbXBsZXRpb25fd2FpdChzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKIHsKIAlzdHJ1Y3QgaW9tbXVfY21kIGNtZDsKLQl2b2xhdGlsZSB1NjQgc2VtID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKIAlpZiAoIWlvbW11LT5uZWVkX3N5bmMpCiAJCXJldHVybiAwOwogCi0JYnVpbGRfY29tcGxldGlvbl93YWl0KCZjbWQsICh1NjQpJnNlbSk7CiAKLQlyZXQgPSBpb21tdV9xdWV1ZV9jb21tYW5kX3N5bmMoaW9tbXUsICZjbWQsIGZhbHNlKTsKKwlidWlsZF9jb21wbGV0aW9uX3dhaXQoJmNtZCwgKHU2NCkmaW9tbXUtPmNtZF9zZW0pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisKKwlpb21tdS0+Y21kX3NlbSA9IDA7CisKKwlyZXQgPSBfX2lvbW11X3F1ZXVlX2NvbW1hbmRfc3luYyhpb21tdSwgJmNtZCwgZmFsc2UpOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAotCXJldHVybiB3YWl0X29uX3NlbSgmc2VtKTsKKwlyZXQgPSB3YWl0X29uX3NlbSgmaW9tbXUtPmNtZF9zZW0pOworCitvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGlvbW11X2ZsdXNoX2R0ZShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwgdTE2IGRldmlkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfdHlwZXMuaCBiL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11X3R5cGVzLmgKaW5kZXggY2FmNWUzOC4uOTY1Mjg0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfdHlwZXMuaAorKysgYi9kcml2ZXJzL2lvbW11L2FtZF9pb21tdV90eXBlcy5oCkBAIC01MjQsNiArNTI0LDggQEAKIAlzdHJ1Y3QgaXJxX2RvbWFpbiAqaXJfZG9tYWluOwogCXN0cnVjdCBpcnFfZG9tYWluICptc2lfZG9tYWluOwogI2VuZGlmCisKKwl2b2xhdGlsZSB1NjQgX19hbGlnbmVkKDgpIGNtZF9zZW07CiB9OwogCiAjZGVmaW5lIEFDUElISURfVUlEX0xFTiAyNTYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvYXJtLXNtbXUtdjMuYyBiL2RyaXZlcnMvaW9tbXUvYXJtLXNtbXUtdjMuYwppbmRleCBjZTgwMTE3Li42NDFlODg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2FybS1zbW11LXYzLmMKKysrIGIvZHJpdmVycy9pb21tdS9hcm0tc21tdS12My5jCkBAIC04NzksNyArODc5LDcgQEAKIAkgKiBXZSBtYXkgaGF2ZSBjb25jdXJyZW50IHByb2R1Y2Vycywgc28gd2UgbmVlZCB0byBiZSBjYXJlZnVsCiAJICogbm90IHRvIHRvdWNoIGFueSBvZiB0aGUgc2hhZG93IGNtZHEgc3RhdGUuCiAJICovCi0JcXVldWVfcmVhZChjbWQsIFFfRU5UKHEsIGlkeCksIHEtPmVudF9kd29yZHMpOworCXF1ZXVlX3JlYWQoY21kLCBRX0VOVChxLCBjb25zKSwgcS0+ZW50X2R3b3Jkcyk7CiAJZGV2X2VycihzbW11LT5kZXYsICJza2lwcGluZyBjb21tYW5kIGluIGVycm9yIHN0YXRlOlxuIik7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY21kKTsgKytpKQogCQlkZXZfZXJyKHNtbXUtPmRldiwgIlx0MHglMDE2bGx4XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWNtZFtpXSk7CkBAIC04OTAsNyArODkwLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXF1ZXVlX3dyaXRlKGNtZCwgUV9FTlQocSwgaWR4KSwgcS0+ZW50X2R3b3Jkcyk7CisJcXVldWVfd3JpdGUoUV9FTlQocSwgY29ucyksIGNtZCwgcS0+ZW50X2R3b3Jkcyk7CiB9CiAKIHN0YXRpYyB2b2lkIGFybV9zbW11X2NtZHFfaXNzdWVfY21kKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUsCkBAIC0xMDM0LDYgKzEwMzQsOSBAQAogCQljYXNlIFNUUlRBQl9TVEVfMF9DRkdfUzJfVFJBTlM6CiAJCQlzdGVfbGl2ZSA9IHRydWU7CiAJCQlicmVhazsKKwkJY2FzZSBTVFJUQUJfU1RFXzBfQ0ZHX0FCT1JUOgorCQkJaWYgKGRpc2FibGVfYnlwYXNzKQorCQkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJQlVHKCk7IC8qIFNURSBjb3JydXB0aW9uICovCiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvYXJtLXNtbXUuYyBiL2RyaXZlcnMvaW9tbXUvYXJtLXNtbXUuYwppbmRleCA0ZjQ5ZmUyLi4yZGI3NGViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2FybS1zbW11LmMKKysrIGIvZHJpdmVycy9pb21tdS9hcm0tc21tdS5jCkBAIC02ODYsOCArNjg2LDcgQEAKIAogc3RhdGljIGlycXJldHVybl90IGFybV9zbW11X2NvbnRleHRfZmF1bHQoaW50IGlycSwgdm9pZCAqZGV2KQogewotCWludCBmbGFncywgcmV0OwotCXUzMiBmc3IsIGZzeW5yLCByZXN1bWU7CisJdTMyIGZzciwgZnN5bnI7CiAJdW5zaWduZWQgbG9uZyBpb3ZhOwogCXN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiA9IGRldjsKIAlzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluICpzbW11X2RvbWFpbiA9IHRvX3NtbXVfZG9tYWluKGRvbWFpbik7CkBAIC03MDEsMzQgKzcwMCwxNSBAQAogCWlmICghKGZzciAmIEZTUl9GQVVMVCkpCiAJCXJldHVybiBJUlFfTk9ORTsKIAotCWlmIChmc3IgJiBGU1JfSUdOKQotCQlkZXZfZXJyX3JhdGVsaW1pdGVkKHNtbXUtPmRldiwKLQkJCQkgICAgIlVuZXhwZWN0ZWQgY29udGV4dCBmYXVsdCAoZnNyIDB4JXgpXG4iLAotCQkJCSAgICBmc3IpOwotCiAJZnN5bnIgPSByZWFkbF9yZWxheGVkKGNiX2Jhc2UgKyBBUk1fU01NVV9DQl9GU1lOUjApOwotCWZsYWdzID0gZnN5bnIgJiBGU1lOUjBfV05SID8gSU9NTVVfRkFVTFRfV1JJVEUgOiBJT01NVV9GQVVMVF9SRUFEOwotCiAJaW92YSA9IHJlYWRxX3JlbGF4ZWQoY2JfYmFzZSArIEFSTV9TTU1VX0NCX0ZBUik7Ci0JaWYgKCFyZXBvcnRfaW9tbXVfZmF1bHQoZG9tYWluLCBzbW11LT5kZXYsIGlvdmEsIGZsYWdzKSkgewotCQlyZXQgPSBJUlFfSEFORExFRDsKLQkJcmVzdW1lID0gUkVTVU1FX1JFVFJZOwotCX0gZWxzZSB7Ci0JCWRldl9lcnJfcmF0ZWxpbWl0ZWQoc21tdS0+ZGV2LAotCQkgICAgIlVuaGFuZGxlZCBjb250ZXh0IGZhdWx0OiBpb3ZhPTB4JTA4bHgsIGZzeW5yPTB4JXgsIGNiPSVkXG4iLAotCQkgICAgaW92YSwgZnN5bnIsIGNmZy0+Y2JuZHgpOwotCQlyZXQgPSBJUlFfTk9ORTsKLQkJcmVzdW1lID0gUkVTVU1FX1RFUk1JTkFURTsKLQl9CiAKLQkvKiBDbGVhciB0aGUgZmF1bHRpbmcgRlNSICovCisJZGV2X2Vycl9yYXRlbGltaXRlZChzbW11LT5kZXYsCisJIlVuaGFuZGxlZCBjb250ZXh0IGZhdWx0OiBmc3I9MHgleCwgaW92YT0weCUwOGx4LCBmc3lucj0weCV4LCBjYj0lZFxuIiwKKwkJCSAgICBmc3IsIGlvdmEsIGZzeW5yLCBjZmctPmNibmR4KTsKKwogCXdyaXRlbChmc3IsIGNiX2Jhc2UgKyBBUk1fU01NVV9DQl9GU1IpOwotCi0JLyogUmV0cnkgb3IgdGVybWluYXRlIGFueSBzdGFsbGVkIHRyYW5zYWN0aW9ucyAqLwotCWlmIChmc3IgJiBGU1JfU1MpCi0JCXdyaXRlbF9yZWxheGVkKHJlc3VtZSwgY2JfYmFzZSArIEFSTV9TTU1VX0NCX1JFU1VNRSk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGFybV9zbW11X2dsb2JhbF9mYXVsdChpbnQgaXJxLCB2b2lkICpkZXYpCkBAIC04MzcsNyArODE3LDcgQEAKIAl9CiAKIAkvKiBTQ1RMUiAqLwotCXJlZyA9IFNDVExSX0NGQ0ZHIHwgU0NUTFJfQ0ZJRSB8IFNDVExSX0NGUkUgfCBTQ1RMUl9NIHwgU0NUTFJfRUFFX1NCT1A7CisJcmVnID0gU0NUTFJfQ0ZJRSB8IFNDVExSX0NGUkUgfCBTQ1RMUl9NIHwgU0NUTFJfRUFFX1NCT1A7CiAJaWYgKHN0YWdlMSkKIAkJcmVnIHw9IFNDVExSX1MxX0FTSURQTkU7CiAjaWZkZWYgX19CSUdfRU5ESUFOCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2RtYS1pb21tdS5jIGIvZHJpdmVycy9pb21tdS9kbWEtaW9tbXUuYwppbmRleCAwOGExZTJmLi4wMGM4YTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2RtYS1pb21tdS5jCisrKyBiL2RyaXZlcnMvaW9tbXUvZG1hLWlvbW11LmMKQEAgLTY4LDcgKzY4LDggQEAKIAlpZiAoIWlvdmFkKQogCQlyZXR1cm47CiAKLQlwdXRfaW92YV9kb21haW4oaW92YWQpOworCWlmIChpb3ZhZC0+Z3JhbnVsZSkKKwkJcHV0X2lvdmFfZG9tYWluKGlvdmFkKTsKIAlrZnJlZShpb3ZhZCk7CiAJZG9tYWluLT5pb3ZhX2Nvb2tpZSA9IE5VTEw7CiB9CkBAIC0xNTEsMTIgKzE1MiwxNSBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBpb3ZhICpfX2FsbG9jX2lvdmEoc3RydWN0IGlvdmFfZG9tYWluICppb3ZhZCwgc2l6ZV90IHNpemUsCitzdGF0aWMgc3RydWN0IGlvdmEgKl9fYWxsb2NfaW92YShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHNpemVfdCBzaXplLAogCQlkbWFfYWRkcl90IGRtYV9saW1pdCkKIHsKKwlzdHJ1Y3QgaW92YV9kb21haW4gKmlvdmFkID0gZG9tYWluLT5pb3ZhX2Nvb2tpZTsKIAl1bnNpZ25lZCBsb25nIHNoaWZ0ID0gaW92YV9zaGlmdChpb3ZhZCk7CiAJdW5zaWduZWQgbG9uZyBsZW5ndGggPSBpb3ZhX2FsaWduKGlvdmFkLCBzaXplKSA+PiBzaGlmdDsKIAorCWlmIChkb21haW4tPmdlb21ldHJ5LmZvcmNlX2FwZXJ0dXJlKQorCQlkbWFfbGltaXQgPSBtaW4oZG1hX2xpbWl0LCBkb21haW4tPmdlb21ldHJ5LmFwZXJ0dXJlX2VuZCk7CiAJLyoKIAkgKiBFbmZvcmNlIHNpemUtYWxpZ25tZW50IHRvIGJlIHNhZmUgLSB0aGVyZSBjb3VsZCBwZXJoYXBzIGJlIGFuCiAJICogYXR0cmlidXRlIHRvIGNvbnRyb2wgdGhpcyBwZXItZGV2aWNlLCBvciBhdCBsZWFzdCBwZXItZG9tYWluLi4uCkBAIC0zMTQsNyArMzE4LDcgQEAKIAlpZiAoIXBhZ2VzKQogCQlyZXR1cm4gTlVMTDsKIAotCWlvdmEgPSBfX2FsbG9jX2lvdmEoaW92YWQsIHNpemUsIGRldi0+Y29oZXJlbnRfZG1hX21hc2spOworCWlvdmEgPSBfX2FsbG9jX2lvdmEoZG9tYWluLCBzaXplLCBkZXYtPmNvaGVyZW50X2RtYV9tYXNrKTsKIAlpZiAoIWlvdmEpCiAJCWdvdG8gb3V0X2ZyZWVfcGFnZXM7CiAKQEAgLTM4Niw3ICszOTAsNyBAQAogCXBoeXNfYWRkcl90IHBoeXMgPSBwYWdlX3RvX3BoeXMocGFnZSkgKyBvZmZzZXQ7CiAJc2l6ZV90IGlvdmFfb2ZmID0gaW92YV9vZmZzZXQoaW92YWQsIHBoeXMpOwogCXNpemVfdCBsZW4gPSBpb3ZhX2FsaWduKGlvdmFkLCBzaXplICsgaW92YV9vZmYpOwotCXN0cnVjdCBpb3ZhICppb3ZhID0gX19hbGxvY19pb3ZhKGlvdmFkLCBsZW4sIGRtYV9nZXRfbWFzayhkZXYpKTsKKwlzdHJ1Y3QgaW92YSAqaW92YSA9IF9fYWxsb2NfaW92YShkb21haW4sIGxlbiwgZG1hX2dldF9tYXNrKGRldikpOwogCiAJaWYgKCFpb3ZhKQogCQlyZXR1cm4gRE1BX0VSUk9SX0NPREU7CkBAIC01MzgsNyArNTQyLDcgQEAKIAkJcHJldiA9IHM7CiAJfQogCi0JaW92YSA9IF9fYWxsb2NfaW92YShpb3ZhZCwgaW92YV9sZW4sIGRtYV9nZXRfbWFzayhkZXYpKTsKKwlpb3ZhID0gX19hbGxvY19pb3ZhKGRvbWFpbiwgaW92YV9sZW4sIGRtYV9nZXRfbWFzayhkZXYpKTsKIAlpZiAoIWlvdmEpCiAJCWdvdG8gb3V0X3Jlc3RvcmVfc2c7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS1hcm0tdjdzLmMgYi9kcml2ZXJzL2lvbW11L2lvLXBndGFibGUtYXJtLXY3cy5jCmluZGV4IDhjNjEzOTkuLmRlZjhjYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS1hcm0tdjdzLmMKKysrIGIvZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLWFybS12N3MuYwpAQCAtMjg2LDEyICsyODYsMTQgQEAKIAlpbnQgcHJvdCA9IElPTU1VX1JFQUQ7CiAJYXJtX3Y3c19pb3B0ZSBhdHRyID0gcHRlID4+IEFSTV9WN1NfQVRUUl9TSElGVChsdmwpOwogCi0JaWYgKGF0dHIgJiBBUk1fVjdTX1BURV9BUF9SRE9OTFkpCisJaWYgKCEoYXR0ciAmIEFSTV9WN1NfUFRFX0FQX1JET05MWSkpCiAJCXByb3QgfD0gSU9NTVVfV1JJVEU7CiAJaWYgKChhdHRyICYgKEFSTV9WN1NfVEVYX01BU0sgPDwgQVJNX1Y3U19URVhfU0hJRlQpKSA9PSAwKQogCQlwcm90IHw9IElPTU1VX01NSU87CiAJZWxzZSBpZiAocHRlICYgQVJNX1Y3U19BVFRSX0MpCiAJCXByb3QgfD0gSU9NTVVfQ0FDSEU7CisJaWYgKHB0ZSAmIEFSTV9WN1NfQVRUUl9YTihsdmwpKQorCQlwcm90IHw9IElPTU1VX05PRVhFQzsKIAogCXJldHVybiBwcm90OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9tdGtfaW9tbXUuaCBiL2RyaXZlcnMvaW9tbXUvbXRrX2lvbW11LmgKaW5kZXggOWVkMGE4NC4uM2RhYjEzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9tdGtfaW9tbXUuaAorKysgYi9kcml2ZXJzL2lvbW11L210a19pb21tdS5oCkBAIC01NSwxOSArNTUsMTkgQEAKIAlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZV80R0I7CiB9OwogCi1zdGF0aWMgaW50IGNvbXBhcmVfb2Yoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQorc3RhdGljIGlubGluZSBpbnQgY29tcGFyZV9vZihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7CiAJcmV0dXJuIGRldi0+b2Zfbm9kZSA9PSBkYXRhOwogfQogCi1zdGF0aWMgaW50IG10a19pb21tdV9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgaW50IG10a19pb21tdV9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbXRrX2lvbW11X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXJldHVybiBjb21wb25lbnRfYmluZF9hbGwoZGV2LCAmZGF0YS0+c21pX2ltdSk7CiB9CiAKLXN0YXRpYyB2b2lkIG10a19pb21tdV91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGlubGluZSB2b2lkIG10a19pb21tdV91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBtdGtfaW9tbXVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L3MzOTAtaW9tbXUuYyBiL2RyaXZlcnMvaW9tbXUvczM5MC1pb21tdS5jCmluZGV4IGEwNGQ0OTEuLjNiNDRiMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvczM5MC1pb21tdS5jCisrKyBiL2RyaXZlcnMvaW9tbXUvczM5MC1pb21tdS5jCkBAIC0xMDEsOCArMTAxLDcgQEAKIAkJenBjaV9kbWFfZXhpdF9kZXZpY2UoemRldik7CiAKIAl6ZGV2LT5kbWFfdGFibGUgPSBzMzkwX2RvbWFpbi0+ZG1hX3RhYmxlOwotCXJjID0genBjaV9yZWdpc3Rlcl9pb2F0KHpkZXYsIDAsIHpkZXYtPnN0YXJ0X2RtYSArIFBBR0VfT0ZGU0VULAotCQkJCXpkZXYtPnN0YXJ0X2RtYSArIHpkZXYtPmlvbW11X3NpemUgLSAxLAorCXJjID0genBjaV9yZWdpc3Rlcl9pb2F0KHpkZXYsIDAsIHpkZXYtPnN0YXJ0X2RtYSwgemRldi0+ZW5kX2RtYSwKIAkJCQkodTY0KSB6ZGV2LT5kbWFfdGFibGUpOwogCWlmIChyYykKIAkJZ290byBvdXRfcmVzdG9yZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9LY29uZmlnIGIvZHJpdmVycy9pcnFjaGlwL0tjb25maWcKaW5kZXggN2Y4NzI4OS4uODJiMGI1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL0tjb25maWcKKysrIGIvZHJpdmVycy9pcnFjaGlwL0tjb25maWcKQEAgLTM5LDYgKzM5LDcgQEAKIAlib29sCiAJZGVwZW5kcyBvbiBQQ0kKIAlkZXBlbmRzIG9uIFBDSV9NU0kKKwlzZWxlY3QgQUNQSV9JT1JUIGlmIEFDUEkKIAogY29uZmlnIEFSTV9OVklDCiAJYm9vbApAQCAtMTU2LDYgKzE1NywxMyBAQAogCXNlbGVjdCBHRU5FUklDX0lSUV9DSElQCiAJc2VsZWN0IElSUV9ET01BSU4KIAorY29uZmlnIEpDT1JFX0FJQworCWJvb2wgIkotQ29yZSBpbnRlZ3JhdGVkIEFJQyIKKwlkZXBlbmRzIG9uIE9GICYmIChTVVBFUkggfHwgQ09NUElMRV9URVNUKQorCXNlbGVjdCBJUlFfRE9NQUlOCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdGhlIEotQ29yZSBpbnRlZ3JhdGVkIEFJQy4KKwogY29uZmlnIFJFTkVTQVNfSU5UQ19JUlFQSU4KIAlib29sCiAJc2VsZWN0IElSUV9ET01BSU4KQEAgLTI1MSw2ICsyNTksOSBAQAogY29uZmlnIE1WRUJVX09ETUkKIAlib29sCiAKK2NvbmZpZyBNVkVCVV9QSUMKKwlib29sCisKIGNvbmZpZyBMU19TQ0ZHX01TSQogCWRlZl9ib29sIHkgaWYgU09DX0xTMTAyMUEgfHwgQVJDSF9MQVlFUlNDQVBFCiAJZGVwZW5kcyBvbiBQQ0kgJiYgUENJX01TSQpAQCAtMjY0LDMgKzI3NSw3IEBACiAJc2VsZWN0IElSUV9ET01BSU4KIAloZWxwCiAJICBTdXBwb3J0IHRoZSBFWmNoaXAgTlBTNDAwIGdsb2JhbCBpbnRlcnJ1cHQgY29udHJvbGxlcgorCitjb25maWcgU1RNMzJfRVhUSQorCWJvb2wKKwlzZWxlY3QgSVJRX0RPTUFJTgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL01ha2VmaWxlIGIvZHJpdmVycy9pcnFjaGlwL01ha2VmaWxlCmluZGV4IDRjMjAzYjYuLmIzNzJlNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lycWNoaXAvTWFrZWZpbGUKQEAgLTQwLDYgKzQwLDcgQEAKIG9iai0kKENPTkZJR19JTUdQRENfSVJRKQkJKz0gaXJxLWltZ3BkYy5vCiBvYmotJChDT05GSUdfSVJRX01JUFNfQ1BVKQkJKz0gaXJxLW1pcHMtY3B1Lm8KIG9iai0kKENPTkZJR19TSVJGX0lSUSkJCQkrPSBpcnEtc2lyZnNvYy5vCitvYmotJChDT05GSUdfSkNPUkVfQUlDKQkJCSs9IGlycS1qY29yZS1haWMubwogb2JqLSQoQ09ORklHX1JFTkVTQVNfSU5UQ19JUlFQSU4pCSs9IGlycS1yZW5lc2FzLWludGMtaXJxcGluLm8KIG9iai0kKENPTkZJR19SRU5FU0FTX0lSUUMpCQkrPSBpcnEtcmVuZXNhcy1pcnFjLm8KIG9iai0kKENPTkZJR19WRVJTQVRJTEVfRlBHQV9JUlEpCSs9IGlycS12ZXJzYXRpbGUtZnBnYS5vCkBAIC02OCw2ICs2OSw4IEBACiBvYmotJChDT05GSUdfSU1YX0dQQ1YyKQkJCSs9IGlycS1pbXgtZ3BjdjIubwogb2JqLSQoQ09ORklHX1BJQzMyX0VWSUMpCQkrPSBpcnEtcGljMzItZXZpYy5vCiBvYmotJChDT05GSUdfTVZFQlVfT0RNSSkJCSs9IGlycS1tdmVidS1vZG1pLm8KK29iai0kKENPTkZJR19NVkVCVV9QSUMpCQkJKz0gaXJxLW12ZWJ1LXBpYy5vCiBvYmotJChDT05GSUdfTFNfU0NGR19NU0kpCQkrPSBpcnEtbHMtc2NmZy1tc2kubwogb2JqLSQoQ09ORklHX0VaTlBTX0dJQykJCQkrPSBpcnEtZXpucHMubwogb2JqLSQoQ09ORklHX0FSQ0hfQVNQRUVEKQkJKz0gaXJxLWFzcGVlZC12aWMubworb2JqLSQoQ09ORklHX1NUTTMyX0VYVEkpIAkJKz0gaXJxLXN0bTMyLWV4dGkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1hdG1lbC1haWMuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXRtZWwtYWljLmMKaW5kZXggMTEyZTE3Yy4uMzdmOTUyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1hdG1lbC1haWMuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWF0bWVsLWFpYy5jCkBAIC0xNzYsNiArMTc2LDcgQEAKIHsKIAlzdHJ1Y3QgaXJxX2RvbWFpbl9jaGlwX2dlbmVyaWMgKmRnYyA9IGQtPmdjOwogCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIHNtcjsKIAlpbnQgaWR4OwogCWludCByZXQ7CkBAIC0xOTQsMTEgKzE5NSwxMSBAQAogCiAJZ2MgPSBkZ2MtPmdjW2lkeF07CiAKLQlpcnFfZ2NfbG9jayhnYyk7CisJaXJxX2djX2xvY2tfaXJxc2F2ZShnYywgZmxhZ3MpOwogCXNtciA9IGlycV9yZWdfcmVhZGwoZ2MsIEFUOTFfQUlDX1NNUigqb3V0X2h3aXJxKSk7CiAJYWljX2NvbW1vbl9zZXRfcHJpb3JpdHkoaW50c3BlY1syXSwgJnNtcik7CiAJaXJxX3JlZ193cml0ZWwoZ2MsIHNtciwgQVQ5MV9BSUNfU01SKCpvdXRfaHdpcnEpKTsKLQlpcnFfZ2NfdW5sb2NrKGdjKTsKKwlpcnFfZ2NfdW5sb2NrX2lycXJlc3RvcmUoZ2MsIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWF0bWVsLWFpYzUuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXRtZWwtYWljNS5jCmluZGV4IDRmMGQwNjguLjJhNjI0ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXRtZWwtYWljNS5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXRtZWwtYWljNS5jCkBAIC0yNTgsNiArMjU4LDcgQEAKIAkJCQkgdW5zaWduZWQgaW50ICpvdXRfdHlwZSkKIHsKIAlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqYmdjID0gaXJxX2dldF9kb21haW5fZ2VuZXJpY19jaGlwKGQsIDApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgc21yOwogCWludCByZXQ7CiAKQEAgLTI2OSwxMiArMjcwLDEyIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlycV9nY19sb2NrKGJnYyk7CisJaXJxX2djX2xvY2tfaXJxc2F2ZShiZ2MsIGZsYWdzKTsKIAlpcnFfcmVnX3dyaXRlbChiZ2MsICpvdXRfaHdpcnEsIEFUOTFfQUlDNV9TU1IpOwogCXNtciA9IGlycV9yZWdfcmVhZGwoYmdjLCBBVDkxX0FJQzVfU01SKTsKIAlhaWNfY29tbW9uX3NldF9wcmlvcml0eShpbnRzcGVjWzJdLCAmc21yKTsKIAlpcnFfcmVnX3dyaXRlbChiZ2MsIHNtciwgQVQ5MV9BSUM1X1NNUik7Ci0JaXJxX2djX3VubG9jayhiZ2MpOworCWlycV9nY191bmxvY2tfaXJxcmVzdG9yZShiZ2MsIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy1wbS5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtcG0uYwppbmRleCA0Y2JmZmJhLi5lY2FmZDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy1wbS5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXBtLmMKQEAgLTY0LDcgKzY0LDYgQEAKIAogc3RhdGljIGludCBnaWNfZ2V0X2Nsb2NrcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBnaWNfY2xrX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IGNsayAqY2xrOwogCXVuc2lnbmVkIGludCBpOwogCWludCByZXQ7CiAKQEAgLTc2LDI4ICs3NSwxNiBAQAogCQlyZXR1cm4gcmV0OwogCiAJZm9yIChpID0gMDsgaSA8IGRhdGEtPm51bV9jbG9ja3M7IGkrKykgewotCQljbGsgPSBvZl9jbGtfZ2V0X2J5X25hbWUoZGV2LT5vZl9ub2RlLCBkYXRhLT5jbG9ja3NbaV0pOwotCQlpZiAoSVNfRVJSKGNsaykpIHsKLQkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9jayAlc1xuIiwKLQkJCQlkYXRhLT5jbG9ja3NbaV0pOwotCQkJcmV0ID0gUFRSX0VSUihjbGspOwotCQkJZ290byBlcnJvcjsKLQkJfQotCi0JCXJldCA9IHBtX2Nsa19hZGRfY2xrKGRldiwgY2xrKTsKKwkJcmV0ID0gb2ZfcG1fY2xrX2FkZF9jbGsoZGV2LCBkYXRhLT5jbG9ja3NbaV0pOwogCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhZGQgY2xvY2sgYXQgaW5kZXggJWRcbiIsIGkpOwotCQkJY2xrX3B1dChjbGspOwotCQkJZ290byBlcnJvcjsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFkZCBjbG9jayAlc1xuIiwKKwkJCQlkYXRhLT5jbG9ja3NbaV0pOworCQkJcG1fY2xrX2Rlc3Ryb3koZGV2KTsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKLQotZXJyb3I6Ci0JcG1fY2xrX2Rlc3Ryb3koZGV2KTsKLQotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZ2ljX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My1pdHMtcGNpLW1zaS5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMtaXRzLXBjaS1tc2kuYwppbmRleCBhZWU2MGVkLi5hZWUxYzYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My1pdHMtcGNpLW1zaS5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXYzLWl0cy1wY2ktbXNpLmMKQEAgLTE1LDYgKzE1LDcgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9hY3BpX2lvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tc2kuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgpAQCAtMTA2LDM0ICsxMDcsOTEgQEAKIAl7fSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGl0c19wY2lfbXNpX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGl0c19wY2lfbXNpX2luaXRfb25lKHN0cnVjdCBmd25vZGVfaGFuZGxlICpoYW5kbGUsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGlycV9kb21haW4gKnBhcmVudDsKKworCXBhcmVudCA9IGlycV9maW5kX21hdGNoaW5nX2Z3bm9kZShoYW5kbGUsIERPTUFJTl9CVVNfTkVYVVMpOworCWlmICghcGFyZW50IHx8ICFtc2lfZ2V0X2RvbWFpbl9pbmZvKHBhcmVudCkpIHsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIGxvY2F0ZSBJVFMgZG9tYWluXG4iLCBuYW1lKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlpZiAoIXBjaV9tc2lfY3JlYXRlX2lycV9kb21haW4oaGFuZGxlLCAmaXRzX3BjaV9tc2lfZG9tYWluX2luZm8sCisJCQkJICAgICAgIHBhcmVudCkpIHsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIGNyZWF0ZSBQQ0kgZG9tYWluXG4iLCBuYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGl0c19wY2lfb2ZfbXNpX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXN0cnVjdCBpcnFfZG9tYWluICpwYXJlbnQ7CiAKIAlmb3IgKG5wID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKE5VTEwsIGl0c19kZXZpY2VfaWQpOyBucDsKIAkgICAgIG5wID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKG5wLCBpdHNfZGV2aWNlX2lkKSkgewogCQlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgIm1zaS1jb250cm9sbGVyIikpCiAJCQljb250aW51ZTsKIAotCQlwYXJlbnQgPSBpcnFfZmluZF9tYXRjaGluZ19ob3N0KG5wLCBET01BSU5fQlVTX05FWFVTKTsKLQkJaWYgKCFwYXJlbnQgfHwgIW1zaV9nZXRfZG9tYWluX2luZm8ocGFyZW50KSkgewotCQkJcHJfZXJyKCIlczogdW5hYmxlIHRvIGxvY2F0ZSBJVFMgZG9tYWluXG4iLAotCQkJICAgICAgIG5wLT5mdWxsX25hbWUpOworCQlpZiAoaXRzX3BjaV9tc2lfaW5pdF9vbmUob2Zfbm9kZV90b19md25vZGUobnApLCBucC0+ZnVsbF9uYW1lKSkKIAkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKCFwY2lfbXNpX2NyZWF0ZV9pcnFfZG9tYWluKG9mX25vZGVfdG9fZndub2RlKG5wKSwKLQkJCQkJICAgICAgICZpdHNfcGNpX21zaV9kb21haW5faW5mbywKLQkJCQkJICAgICAgIHBhcmVudCkpIHsKLQkJCXByX2VycigiJXM6IHVuYWJsZSB0byBjcmVhdGUgUENJIGRvbWFpblxuIiwKLQkJCSAgICAgICBucC0+ZnVsbF9uYW1lKTsKLQkJCWNvbnRpbnVlOwotCQl9CiAKIAkJcHJfaW5mbygiUENJL01TSTogJXMgZG9tYWluIGNyZWF0ZWRcbiIsIG5wLT5mdWxsX25hbWUpOwogCX0KIAogCXJldHVybiAwOwogfQorCisjaWZkZWYgQ09ORklHX0FDUEkKKworc3RhdGljIGludCBfX2luaXQKK2l0c19wY2lfbXNpX3BhcnNlX21hZHQoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICpoZWFkZXIsCisJCSAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlzdHJ1Y3QgYWNwaV9tYWR0X2dlbmVyaWNfdHJhbnNsYXRvciAqaXRzX2VudHJ5OworCXN0cnVjdCBmd25vZGVfaGFuZGxlICpkb21faGFuZGxlOworCWNvbnN0IGNoYXIgKm5vZGVfbmFtZTsKKwlpbnQgZXJyID0gLUVOWElPOworCisJaXRzX2VudHJ5ID0gKHN0cnVjdCBhY3BpX21hZHRfZ2VuZXJpY190cmFuc2xhdG9yICopaGVhZGVyOworCW5vZGVfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiSVRTQDB4JWx4IiwKKwkJCSAgICAgIChsb25nKWl0c19lbnRyeS0+YmFzZV9hZGRyZXNzKTsKKwlkb21faGFuZGxlID0gaW9ydF9maW5kX2RvbWFpbl90b2tlbihpdHNfZW50cnktPnRyYW5zbGF0aW9uX2lkKTsKKwlpZiAoIWRvbV9oYW5kbGUpIHsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIGxvY2F0ZSBJVFMgZG9tYWluIGhhbmRsZVxuIiwgbm9kZV9uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gaXRzX3BjaV9tc2lfaW5pdF9vbmUoZG9tX2hhbmRsZSwgbm9kZV9uYW1lKTsKKwlpZiAoIWVycikKKwkJcHJfaW5mbygiUENJL01TSTogJXMgZG9tYWluIGNyZWF0ZWRcbiIsIG5vZGVfbmFtZSk7CisKK291dDoKKwlrZnJlZShub2RlX25hbWUpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGl0c19wY2lfYWNwaV9tc2lfaW5pdCh2b2lkKQoreworCWFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfVFlQRV9HRU5FUklDX1RSQU5TTEFUT1IsCisJCQkgICAgICBpdHNfcGNpX21zaV9wYXJzZV9tYWR0LCAwKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW50IF9faW5pdCBpdHNfcGNpX2FjcGlfbXNpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBpdHNfcGNpX21zaV9pbml0KHZvaWQpCit7CisJaXRzX3BjaV9vZl9tc2lfaW5pdCgpOworCWl0c19wY2lfYWNwaV9tc2lfaW5pdCgpOworCisJcmV0dXJuIDA7Cit9CiBlYXJseV9pbml0Y2FsbChpdHNfcGNpX21zaV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXYzLWl0cy5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMtaXRzLmMKaW5kZXggN2NlYWJhOC4uMzVjODUxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMtaXRzLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMtaXRzLmMKQEAgLTE1LDEwICsxNSwxMyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGlfaW9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21zaS5oPgpAQCAtNzUsNyArNzgsNyBAQAogCXJhd19zcGlubG9ja190CQlsb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQJZW50cnk7CiAJdm9pZCBfX2lvbWVtCQkqYmFzZTsKLQl1bnNpZ25lZCBsb25nCQlwaHlzX2Jhc2U7CisJcGh5c19hZGRyX3QJCXBoeXNfYmFzZTsKIAlzdHJ1Y3QgaXRzX2NtZF9ibG9jawkqY21kX2Jhc2U7CiAJc3RydWN0IGl0c19jbWRfYmxvY2sJKmNtZF93cml0ZTsKIAlzdHJ1Y3QgaXRzX2Jhc2VyCXRhYmxlc1tHSVRTX0JBU0VSX05SX1JFR1NdOwpAQCAtMTE1LDYgKzExOCw3IEBACiBzdGF0aWMgTElTVF9IRUFEKGl0c19ub2Rlcyk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGl0c19sb2NrKTsKIHN0YXRpYyBzdHJ1Y3QgcmRpc3RzICpnaWNfcmRpc3RzOworc3RhdGljIHN0cnVjdCBpcnFfZG9tYWluICppdHNfcGFyZW50OwogCiAjZGVmaW5lIGdpY19kYXRhX3JkaXN0KCkJCShyYXdfY3B1X3B0cihnaWNfcmRpc3RzLT5yZGlzdCkpCiAjZGVmaW5lIGdpY19kYXRhX3JkaXN0X3JkX2Jhc2UoKQkoZ2ljX2RhdGFfcmRpc3QoKS0+cmRfYmFzZSkKQEAgLTE0MzcsNiArMTQ0MSwxMSBAQAogCQlmd3NwZWMucGFyYW1bMF0gPSBHSUNfSVJRX1RZUEVfTFBJOwogCQlmd3NwZWMucGFyYW1bMV0gPSBod2lycTsKIAkJZndzcGVjLnBhcmFtWzJdID0gSVJRX1RZUEVfRURHRV9SSVNJTkc7CisJfSBlbHNlIGlmIChpc19md25vZGVfaXJxY2hpcChkb21haW4tPnBhcmVudC0+Zndub2RlKSkgeworCQlmd3NwZWMuZndub2RlID0gZG9tYWluLT5wYXJlbnQtPmZ3bm9kZTsKKwkJZndzcGVjLnBhcmFtX2NvdW50ID0gMjsKKwkJZndzcGVjLnBhcmFtWzBdID0gaHdpcnE7CisJCWZ3c3BlYy5wYXJhbVsxXSA9IElSUV9UWVBFX0VER0VfUklTSU5HOwogCX0gZWxzZSB7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE1NDUsNyArMTU1NCwxMiBAQAogCXUzMiB2YWw7CiAKIAl2YWwgPSByZWFkbF9yZWxheGVkKGJhc2UgKyBHSVRTX0NUTFIpOwotCWlmICh2YWwgJiBHSVRTX0NUTFJfUVVJRVNDRU5UKQorCS8qCisJICogR0lDIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIHRoZSBJVFMgdG8gYmUgYm90aAorCSAqIGRpc2FibGVkIGFuZCBxdWllc2NlbnQgZm9yIHdyaXRlcyB0byBHSVRTX0JBU0VSPG4+IG9yCisJICogR0lUU19DQkFTRVIgdG8gbm90IGhhdmUgVU5QUkVESUNUQUJMRSByZXN1bHRzLgorCSAqLworCWlmICgodmFsICYgR0lUU19DVExSX1FVSUVTQ0VOVCkgJiYgISh2YWwgJiBHSVRTX0NUTFJfRU5BQkxFKSkKIAkJcmV0dXJuIDA7CiAKIAkvKiBEaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIGFsbCBpbnRlcnJ1cHRzIHRvIHRoaXMgSVRTICovCkBAIC0xNjA5LDQ0ICsxNjIzLDU5IEBACiAJZ2ljX2VuYWJsZV9xdWlya3MoaWlkciwgaXRzX3F1aXJrcywgaXRzKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgaXRzX3Byb2JlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKLQkJCSAgICBzdHJ1Y3QgaXJxX2RvbWFpbiAqcGFyZW50KQorc3RhdGljIGludCBpdHNfaW5pdF9kb21haW4oc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmhhbmRsZSwgc3RydWN0IGl0c19ub2RlICppdHMpCiB7Ci0Jc3RydWN0IHJlc291cmNlIHJlczsKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqaW5uZXJfZG9tYWluOworCXN0cnVjdCBtc2lfZG9tYWluX2luZm8gKmluZm87CisKKwlpbmZvID0ga3phbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRU5PTUVNOworCisJaW5uZXJfZG9tYWluID0gaXJxX2RvbWFpbl9jcmVhdGVfdHJlZShoYW5kbGUsICZpdHNfZG9tYWluX29wcywgaXRzKTsKKwlpZiAoIWlubmVyX2RvbWFpbikgeworCQlrZnJlZShpbmZvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW5uZXJfZG9tYWluLT5wYXJlbnQgPSBpdHNfcGFyZW50OworCWlubmVyX2RvbWFpbi0+YnVzX3Rva2VuID0gRE9NQUlOX0JVU19ORVhVUzsKKwlpbmZvLT5vcHMgPSAmaXRzX21zaV9kb21haW5fb3BzOworCWluZm8tPmRhdGEgPSBpdHM7CisJaW5uZXJfZG9tYWluLT5ob3N0X2RhdGEgPSBpbmZvOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGl0c19wcm9iZV9vbmUoc3RydWN0IHJlc291cmNlICpyZXMsCisJCQkJc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmhhbmRsZSwgaW50IG51bWFfbm9kZSkKK3sKIAlzdHJ1Y3QgaXRzX25vZGUgKml0czsKIAl2b2lkIF9faW9tZW0gKml0c19iYXNlOwotCXN0cnVjdCBpcnFfZG9tYWluICppbm5lcl9kb21haW47CiAJdTMyIHZhbDsKIAl1NjQgYmFzZXIsIHRtcDsKIAlpbnQgZXJyOwogCi0JZXJyID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShub2RlLCAwLCAmcmVzKTsKLQlpZiAoZXJyKSB7Ci0JCXByX3dhcm4oIiVzOiBubyByZWdzP1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQlpdHNfYmFzZSA9IGlvcmVtYXAocmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyZXMpKTsKKwlpdHNfYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAlpZiAoIWl0c19iYXNlKSB7Ci0JCXByX3dhcm4oIiVzOiB1bmFibGUgdG8gbWFwIHJlZ2lzdGVyc1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcHJfd2FybigiSVRTQCVwYTogVW5hYmxlIHRvIG1hcCBJVFMgcmVnaXN0ZXJzXG4iLCAmcmVzLT5zdGFydCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCXZhbCA9IHJlYWRsX3JlbGF4ZWQoaXRzX2Jhc2UgKyBHSVRTX1BJRFIyKSAmIEdJQ19QSURSMl9BUkNIX01BU0s7CiAJaWYgKHZhbCAhPSAweDMwICYmIHZhbCAhPSAweDQwKSB7Ci0JCXByX3dhcm4oIiVzOiBubyBJVFMgZGV0ZWN0ZWQsIGdpdmluZyB1cFxuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcHJfd2FybigiSVRTQCVwYTogTm8gSVRTIGRldGVjdGVkLCBnaXZpbmcgdXBcbiIsICZyZXMtPnN0YXJ0KTsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBvdXRfdW5tYXA7CiAJfQogCiAJZXJyID0gaXRzX2ZvcmNlX3F1aWVzY2VudChpdHNfYmFzZSk7CiAJaWYgKGVycikgewotCQlwcl93YXJuKCIlczogZmFpbGVkIHRvIHF1aWVzY2UsIGdpdmluZyB1cFxuIiwKLQkJCW5vZGUtPmZ1bGxfbmFtZSk7CisJCXByX3dhcm4oIklUU0AlcGE6IEZhaWxlZCB0byBxdWllc2NlLCBnaXZpbmcgdXBcbiIsICZyZXMtPnN0YXJ0KTsKIAkJZ290byBvdXRfdW5tYXA7CiAJfQogCi0JcHJfaW5mbygiSVRTOiAlc1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwlwcl9pbmZvKCJJVFMgJXBSXG4iLCByZXMpOwogCiAJaXRzID0ga3phbGxvYyhzaXplb2YoKml0cyksIEdGUF9LRVJORUwpOwogCWlmICghaXRzKSB7CkBAIC0xNjU4LDkgKzE2ODcsOSBAQAogCUlOSVRfTElTVF9IRUFEKCZpdHMtPmVudHJ5KTsKIAlJTklUX0xJU1RfSEVBRCgmaXRzLT5pdHNfZGV2aWNlX2xpc3QpOwogCWl0cy0+YmFzZSA9IGl0c19iYXNlOwotCWl0cy0+cGh5c19iYXNlID0gcmVzLnN0YXJ0OworCWl0cy0+cGh5c19iYXNlID0gcmVzLT5zdGFydDsKIAlpdHMtPml0ZV9zaXplID0gKChyZWFkbF9yZWxheGVkKGl0c19iYXNlICsgR0lUU19UWVBFUikgPj4gNCkgJiAweGYpICsgMTsKLQlpdHMtPm51bWFfbm9kZSA9IG9mX25vZGVfdG9fbmlkKG5vZGUpOworCWl0cy0+bnVtYV9ub2RlID0gbnVtYV9ub2RlOwogCiAJaXRzLT5jbWRfYmFzZSA9IGt6YWxsb2MoSVRTX0NNRF9RVUVVRV9TWiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpdHMtPmNtZF9iYXNlKSB7CkBAIC0xNzA3LDI4ICsxNzM2LDkgQEAKIAl3cml0ZXFfcmVsYXhlZCgwLCBpdHMtPmJhc2UgKyBHSVRTX0NXUklURVIpOwogCXdyaXRlbF9yZWxheGVkKEdJVFNfQ1RMUl9FTkFCTEUsIGl0cy0+YmFzZSArIEdJVFNfQ1RMUik7CiAKLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsICJtc2ktY29udHJvbGxlciIpKSB7Ci0JCXN0cnVjdCBtc2lfZG9tYWluX2luZm8gKmluZm87Ci0KLQkJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghaW5mbykgewotCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0X2ZyZWVfdGFibGVzOwotCQl9Ci0KLQkJaW5uZXJfZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfdHJlZShub2RlLCAmaXRzX2RvbWFpbl9vcHMsIGl0cyk7Ci0JCWlmICghaW5uZXJfZG9tYWluKSB7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJa2ZyZWUoaW5mbyk7Ci0JCQlnb3RvIG91dF9mcmVlX3RhYmxlczsKLQkJfQotCi0JCWlubmVyX2RvbWFpbi0+cGFyZW50ID0gcGFyZW50OwotCQlpbm5lcl9kb21haW4tPmJ1c190b2tlbiA9IERPTUFJTl9CVVNfTkVYVVM7Ci0JCWluZm8tPm9wcyA9ICZpdHNfbXNpX2RvbWFpbl9vcHM7Ci0JCWluZm8tPmRhdGEgPSBpdHM7Ci0JCWlubmVyX2RvbWFpbi0+aG9zdF9kYXRhID0gaW5mbzsKLQl9CisJZXJyID0gaXRzX2luaXRfZG9tYWluKGhhbmRsZSwgaXRzKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlX3RhYmxlczsKIAogCXNwaW5fbG9jaygmaXRzX2xvY2spOwogCWxpc3RfYWRkKCZpdHMtPmVudHJ5LCAmaXRzX25vZGVzKTsKQEAgLTE3NDQsNyArMTc1NCw3IEBACiAJa2ZyZWUoaXRzKTsKIG91dF91bm1hcDoKIAlpb3VubWFwKGl0c19iYXNlKTsKLQlwcl9lcnIoIklUUzogZmFpbGVkIHByb2JpbmcgJXMgKCVkKVxuIiwgbm9kZS0+ZnVsbF9uYW1lLCBlcnIpOworCXByX2VycigiSVRTQCVwYTogZmFpbGVkIHByb2JpbmcgKCVkKVxuIiwgJnJlcy0+c3RhcnQsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTc3MiwxNSArMTc4Miw5MSBAQAogCXt9LAogfTsKIAotaW50IF9faW5pdCBpdHNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHN0cnVjdCByZGlzdHMgKnJkaXN0cywKLQkgICAgIHN0cnVjdCBpcnFfZG9tYWluICpwYXJlbnRfZG9tYWluKQorc3RhdGljIGludCBfX2luaXQgaXRzX29mX3Byb2JlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXN0cnVjdCByZXNvdXJjZSByZXM7CiAKIAlmb3IgKG5wID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKG5vZGUsIGl0c19kZXZpY2VfaWQpOyBucDsKIAkgICAgIG5wID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKG5wLCBpdHNfZGV2aWNlX2lkKSkgewotCQlpdHNfcHJvYmUobnAsIHBhcmVudF9kb21haW4pOworCQlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgIm1zaS1jb250cm9sbGVyIikpIHsKKwkJCXByX3dhcm4oIiVzOiBubyBtc2ktY29udHJvbGxlciBwcm9wZXJ0eSwgSVRTIGlnbm9yZWRcbiIsCisJCQkJbnAtPmZ1bGxfbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKSkgeworCQkJcHJfd2FybigiJXM6IG5vIHJlZ3M/XG4iLCBucC0+ZnVsbF9uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaXRzX3Byb2JlX29uZSgmcmVzLCAmbnAtPmZ3bm9kZSwgb2Zfbm9kZV90b19uaWQobnApKTsKIAl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQUNQSQorCisjZGVmaW5lIEFDUElfR0lDVjNfSVRTX01FTV9TSVpFIChTWl8xMjhLKQorCitzdGF0aWMgaW50IF9faW5pdCBnaWNfYWNwaV9wYXJzZV9tYWR0X2l0cyhzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmhlYWRlciwKKwkJCQkJICBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlzdHJ1Y3QgYWNwaV9tYWR0X2dlbmVyaWNfdHJhbnNsYXRvciAqaXRzX2VudHJ5OworCXN0cnVjdCBmd25vZGVfaGFuZGxlICpkb21faGFuZGxlOworCXN0cnVjdCByZXNvdXJjZSByZXM7CisJaW50IGVycjsKKworCWl0c19lbnRyeSA9IChzdHJ1Y3QgYWNwaV9tYWR0X2dlbmVyaWNfdHJhbnNsYXRvciAqKWhlYWRlcjsKKwltZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHJlcykpOworCXJlcy5zdGFydCA9IGl0c19lbnRyeS0+YmFzZV9hZGRyZXNzOworCXJlcy5lbmQgPSBpdHNfZW50cnktPmJhc2VfYWRkcmVzcyArIEFDUElfR0lDVjNfSVRTX01FTV9TSVpFIC0gMTsKKwlyZXMuZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKworCWRvbV9oYW5kbGUgPSBpcnFfZG9tYWluX2FsbG9jX2Z3bm9kZSgodm9pZCAqKWl0c19lbnRyeS0+YmFzZV9hZGRyZXNzKTsKKwlpZiAoIWRvbV9oYW5kbGUpIHsKKwkJcHJfZXJyKCJJVFNAJXBhOiBVbmFibGUgdG8gYWxsb2NhdGUgR0lDdjMgSVRTIGRvbWFpbiB0b2tlblxuIiwKKwkJICAgICAgICZyZXMuc3RhcnQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllcnIgPSBpb3J0X3JlZ2lzdGVyX2RvbWFpbl90b2tlbihpdHNfZW50cnktPnRyYW5zbGF0aW9uX2lkLCBkb21faGFuZGxlKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiSVRTQCVwYTogVW5hYmxlIHRvIHJlZ2lzdGVyIEdJQ3YzIElUUyBkb21haW4gdG9rZW4gKElUUyBJRCAlZCkgdG8gSU9SVFxuIiwKKwkJICAgICAgICZyZXMuc3RhcnQsIGl0c19lbnRyeS0+dHJhbnNsYXRpb25faWQpOworCQlnb3RvIGRvbV9lcnI7CisJfQorCisJZXJyID0gaXRzX3Byb2JlX29uZSgmcmVzLCBkb21faGFuZGxlLCBOVU1BX05PX05PREUpOworCWlmICghZXJyKQorCQlyZXR1cm4gMDsKKworCWlvcnRfZGVyZWdpc3Rlcl9kb21haW5fdG9rZW4oaXRzX2VudHJ5LT50cmFuc2xhdGlvbl9pZCk7Citkb21fZXJyOgorCWlycV9kb21haW5fZnJlZV9md25vZGUoZG9tX2hhbmRsZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGl0c19hY3BpX3Byb2JlKHZvaWQpCit7CisJYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9UWVBFX0dFTkVSSUNfVFJBTlNMQVRPUiwKKwkJCSAgICAgIGdpY19hY3BpX3BhcnNlX21hZHRfaXRzLCAwKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBfX2luaXQgaXRzX2FjcGlfcHJvYmUodm9pZCkgeyB9CisjZW5kaWYKKworaW50IF9faW5pdCBpdHNfaW5pdChzdHJ1Y3QgZndub2RlX2hhbmRsZSAqaGFuZGxlLCBzdHJ1Y3QgcmRpc3RzICpyZGlzdHMsCisJCSAgICBzdHJ1Y3QgaXJxX2RvbWFpbiAqcGFyZW50X2RvbWFpbikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7CisKKwlpdHNfcGFyZW50ID0gcGFyZW50X2RvbWFpbjsKKwlvZl9ub2RlID0gdG9fb2Zfbm9kZShoYW5kbGUpOworCWlmIChvZl9ub2RlKQorCQlpdHNfb2ZfcHJvYmUob2Zfbm9kZSk7CisJZWxzZQorCQlpdHNfYWNwaV9wcm9iZSgpOwogCiAJaWYgKGxpc3RfZW1wdHkoJml0c19ub2RlcykpIHsKIAkJcHJfd2FybigiSVRTOiBObyBJVFMgYXZhaWxhYmxlLCBub3QgZW5hYmxpbmcgTFBJc1xuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMuYwppbmRleCA2ZmM1NmMzLi45YjgxYmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXYzLmMKQEAgLTQ5NSw2ICs0OTUsMTQgQEAKIAkvKiBTZXQgcHJpb3JpdHkgbWFzayByZWdpc3RlciAqLwogCWdpY193cml0ZV9wbXIoREVGQVVMVF9QTVJfVkFMVUUpOwogCisJLyoKKwkgKiBTb21lIGZpcm13YXJlcyBoYW5kIG92ZXIgdG8gdGhlIGtlcm5lbCB3aXRoIHRoZSBCUFIgY2hhbmdlZCBmcm9tCisJICogaXRzIHJlc2V0IHZhbHVlIChhbmQgd2l0aCBhIHZhbHVlIGxhcmdlIGVub3VnaCB0byBwcmV2ZW50CisJICogYW55IHByZS1lbXB0aXZlIGludGVycnVwdHMgZnJvbSB3b3JraW5nIGF0IGFsbCkuIFdyaXRpbmcgYSB6ZXJvCisJICogdG8gQlBSIHJlc3RvcmVzIGlzIHJlc2V0IHZhbHVlLgorCSAqLworCWdpY193cml0ZV9icHIxKDApOworCiAJaWYgKHN0YXRpY19rZXlfdHJ1ZSgmc3VwcG9ydHNfZGVhY3RpdmF0ZSkpIHsKIAkJLyogRU9JIGRyb3BzIHByaW9yaXR5IG9ubHkgKG1vZGUgMSkgKi8KIAkJZ2ljX3dyaXRlX2N0bHIoSUNDX0NUTFJfRUwxX0VPSW1vZGVfZHJvcCk7CkBAIC01NDgsNyArNTU2LDcgQEAKIHN0YXRpYyB1MTYgZ2ljX2NvbXB1dGVfdGFyZ2V0X2xpc3QoaW50ICpiYXNlX2NwdSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssCiAJCQkJICAgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2lkKQogewotCWludCBjcHUgPSAqYmFzZV9jcHU7CisJaW50IG5leHRfY3B1LCBjcHUgPSAqYmFzZV9jcHU7CiAJdW5zaWduZWQgbG9uZyBtcGlkciA9IGNwdV9sb2dpY2FsX21hcChjcHUpOwogCXUxNiB0bGlzdCA9IDA7CiAKQEAgLTU2Miw5ICs1NzAsMTAgQEAKIAogCQl0bGlzdCB8PSAxIDw8IChtcGlkciAmIDB4Zik7CiAKLQkJY3B1ID0gY3B1bWFza19uZXh0KGNwdSwgbWFzayk7Ci0JCWlmIChjcHUgPj0gbnJfY3B1X2lkcykKKwkJbmV4dF9jcHUgPSBjcHVtYXNrX25leHQoY3B1LCBtYXNrKTsKKwkJaWYgKG5leHRfY3B1ID49IG5yX2NwdV9pZHMpCiAJCQlnb3RvIG91dDsKKwkJY3B1ID0gbmV4dF9jcHU7CiAKIAkJbXBpZHIgPSBjcHVfbG9naWNhbF9tYXAoY3B1KTsKIApAQCAtNjY3LDEzICs2NzYsMjAgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0NQVV9QTQorLyogQ2hlY2sgd2hldGhlciBpdCdzIHNpbmdsZSBzZWN1cml0eSBzdGF0ZSB2aWV3ICovCitzdGF0aWMgYm9vbCBnaWNfZGlzdF9zZWN1cml0eV9kaXNhYmxlZCh2b2lkKQoreworCXJldHVybiByZWFkbF9yZWxheGVkKGdpY19kYXRhLmRpc3RfYmFzZSArIEdJQ0RfQ1RMUikgJiBHSUNEX0NUTFJfRFM7Cit9CisKIHN0YXRpYyBpbnQgZ2ljX2NwdV9wbV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBjbWQsIHZvaWQgKnYpCiB7CiAJaWYgKGNtZCA9PSBDUFVfUE1fRVhJVCkgewotCQlnaWNfZW5hYmxlX3JlZGlzdCh0cnVlKTsKKwkJaWYgKGdpY19kaXN0X3NlY3VyaXR5X2Rpc2FibGVkKCkpCisJCQlnaWNfZW5hYmxlX3JlZGlzdCh0cnVlKTsKIAkJZ2ljX2NwdV9zeXNfcmVnX2luaXQoKTsKLQl9IGVsc2UgaWYgKGNtZCA9PSBDUFVfUE1fRU5URVIpIHsKKwl9IGVsc2UgaWYgKGNtZCA9PSBDUFVfUE1fRU5URVIgJiYgZ2ljX2Rpc3Rfc2VjdXJpdHlfZGlzYWJsZWQoKSkgewogCQlnaWNfd3JpdGVfZ3JwZW4xKDApOwogCQlnaWNfZW5hYmxlX3JlZGlzdChmYWxzZSk7CiAJfQpAQCAtOTAzLDcgKzkxOSw2IEBACiAJCQkJIHU2NCByZWRpc3Rfc3RyaWRlLAogCQkJCSBzdHJ1Y3QgZndub2RlX2hhbmRsZSAqaGFuZGxlKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKIAl1MzIgdHlwZXI7CiAJaW50IGdpY19pcnFzOwogCWludCBlcnI7CkBAIC05NDQsMTAgKzk1OSw4IEBACiAKIAlzZXRfaGFuZGxlX2lycShnaWNfaGFuZGxlX2lycSk7CiAKLQlub2RlID0gdG9fb2Zfbm9kZShoYW5kbGUpOwotCWlmIChJU19FTkFCTEVEKENPTkZJR19BUk1fR0lDX1YzX0lUUykgJiYgZ2ljX2Rpc3Rfc3VwcG9ydHNfbHBpcygpICYmCi0JICAgIG5vZGUpIC8qIFRlbXAgaGFjayB0byBwcmV2ZW50IElUUyBpbml0IGZvciBBQ1BJICovCi0JCWl0c19pbml0KG5vZGUsICZnaWNfZGF0YS5yZGlzdHMsIGdpY19kYXRhLmRvbWFpbik7CisJaWYgKElTX0VOQUJMRUQoQ09ORklHX0FSTV9HSUNfVjNfSVRTKSAmJiBnaWNfZGlzdF9zdXBwb3J0c19scGlzKCkpCisJCWl0c19pbml0KGhhbmRsZSwgJmdpY19kYXRhLnJkaXN0cywgZ2ljX2RhdGEuZG9tYWluKTsKIAogCWdpY19zbXBfaW5pdCgpOwogCWdpY19kaXN0X2luaXQoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy5jCmluZGV4IGMyY2FiNTcuLjU4ZTViNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1naWMuYwpAQCAtOTEsNyArOTEsMjcgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0soaXJxX2NvbnRyb2xsZXJfbG9jayk7CisjaWZkZWYgQ09ORklHX0JMX1NXSVRDSEVSCisKK3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGNwdV9tYXBfbG9jayk7CisKKyNkZWZpbmUgZ2ljX2xvY2tfaXJxc2F2ZShmKQkJXAorCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmY3B1X21hcF9sb2NrLCAoZikpCisjZGVmaW5lIGdpY191bmxvY2tfaXJxcmVzdG9yZShmKQlcCisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwdV9tYXBfbG9jaywgKGYpKQorCisjZGVmaW5lIGdpY19sb2NrKCkJCQlyYXdfc3Bpbl9sb2NrKCZjcHVfbWFwX2xvY2spCisjZGVmaW5lIGdpY191bmxvY2soKQkJCXJhd19zcGluX3VubG9jaygmY3B1X21hcF9sb2NrKQorCisjZWxzZQorCisjZGVmaW5lIGdpY19sb2NrX2lycXNhdmUoZikJCWRvIHsgKHZvaWQpKGYpOyB9IHdoaWxlKDApCisjZGVmaW5lIGdpY191bmxvY2tfaXJxcmVzdG9yZShmKQlkbyB7ICh2b2lkKShmKTsgfSB3aGlsZSgwKQorCisjZGVmaW5lIGdpY19sb2NrKCkJCQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgZ2ljX3VubG9jaygpCQkJZG8geyB9IHdoaWxlKDApCisKKyNlbmRpZgogCiAvKgogICogVGhlIEdJQyBtYXBwaW5nIG9mIENQVSBpbnRlcmZhY2VzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1hdGNoCkBAIC0zMTcsMTIgKzMzNywxMiBAQAogCWlmIChjcHUgPj0gTlJfR0lDX0NQVV9JRiB8fCBjcHUgPj0gbnJfY3B1X2lkcykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKKwlnaWNfbG9ja19pcnFzYXZlKGZsYWdzKTsKIAltYXNrID0gMHhmZiA8PCBzaGlmdDsKIAliaXQgPSBnaWNfY3B1X21hcFtjcHVdIDw8IHNoaWZ0OwogCXZhbCA9IHJlYWRsX3JlbGF4ZWQocmVnKSAmIH5tYXNrOwogCXdyaXRlbF9yZWxheGVkKHZhbCB8IGJpdCwgcmVnKTsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2NvbnRyb2xsZXJfbG9jaywgZmxhZ3MpOworCWdpY191bmxvY2tfaXJxcmVzdG9yZShmbGFncyk7CiAKIAlyZXR1cm4gSVJRX1NFVF9NQVNLX09LX0RPTkU7CiB9CkBAIC0zNzQsOSArMzk0LDcgQEAKIAogCWNoYWluZWRfaXJxX2VudGVyKGNoaXAsIGRlc2MpOwogCi0JcmF3X3NwaW5fbG9jaygmaXJxX2NvbnRyb2xsZXJfbG9jayk7CiAJc3RhdHVzID0gcmVhZGxfcmVsYXhlZChnaWNfZGF0YV9jcHVfYmFzZShjaGlwX2RhdGEpICsgR0lDX0NQVV9JTlRBQ0spOwotCXJhd19zcGluX3VubG9jaygmaXJxX2NvbnRyb2xsZXJfbG9jayk7CiAKIAlnaWNfaXJxID0gKHN0YXR1cyAmIEdJQ0NfSUFSX0lOVF9JRF9NQVNLKTsKIAlpZiAoZ2ljX2lycSA9PSBHSUNDX0lOVF9TUFVSSU9VUykKQEAgLTc2OSw3ICs3ODcsMTQgQEAKIAlpbnQgY3B1OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG1hcCA9IDA7CiAKLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKKwlpZiAodW5saWtlbHkobnJfY3B1X2lkcyA9PSAxKSkgeworCQkvKiBPbmx5IG9uZSBDUFU/IGxldCdzIGRvIGEgc2VsZi1JUEkuLi4gKi8KKwkJd3JpdGVsX3JlbGF4ZWQoMiA8PCAyNCB8IGlycSwKKwkJCSAgICAgICBnaWNfZGF0YV9kaXN0X2Jhc2UoJmdpY19kYXRhWzBdKSArIEdJQ19ESVNUX1NPRlRJTlQpOworCQlyZXR1cm47CisJfQorCisJZ2ljX2xvY2tfaXJxc2F2ZShmbGFncyk7CiAKIAkvKiBDb252ZXJ0IG91ciBsb2dpY2FsIENQVSBtYXNrIGludG8gYSBwaHlzaWNhbCBvbmUuICovCiAJZm9yX2VhY2hfY3B1KGNwdSwgbWFzaykKQEAgLTc4NCw3ICs4MDksNyBAQAogCS8qIHRoaXMgYWx3YXlzIGhhcHBlbnMgb24gR0lDMCAqLwogCXdyaXRlbF9yZWxheGVkKG1hcCA8PCAxNiB8IGlycSwgZ2ljX2RhdGFfZGlzdF9iYXNlKCZnaWNfZGF0YVswXSkgKyBHSUNfRElTVF9TT0ZUSU5UKTsKIAotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7CisJZ2ljX3VubG9ja19pcnFyZXN0b3JlKGZsYWdzKTsKIH0KICNlbmRpZgogCkBAIC04NTIsNyArODc3LDcgQEAKIAljdXJfdGFyZ2V0X21hc2sgPSAweDAxMDEwMTAxIDw8IGN1cl9jcHVfaWQ7CiAJcm9yX3ZhbCA9IChjdXJfY3B1X2lkIC0gbmV3X2NwdV9pZCkgJiAzMTsKIAotCXJhd19zcGluX2xvY2soJmlycV9jb250cm9sbGVyX2xvY2spOworCWdpY19sb2NrKCk7CiAKIAkvKiBVcGRhdGUgdGhlIHRhcmdldCBpbnRlcmZhY2UgZm9yIHRoaXMgbG9naWNhbCBDUFUgKi8KIAlnaWNfY3B1X21hcFtjcHVdID0gMSA8PCBuZXdfY3B1X2lkOwpAQCAtODcyLDcgKzg5Nyw3IEBACiAJCX0KIAl9CiAKLQlyYXdfc3Bpbl91bmxvY2soJmlycV9jb250cm9sbGVyX2xvY2spOworCWdpY191bmxvY2soKTsKIAogCS8qCiAJICogTm93IGxldCdzIG1pZ3JhdGUgYW5kIGNsZWFyIGFueSBwb3RlbnRpYWwgU0dJcyB0aGF0IG1pZ2h0IGJlCkBAIC05MTQsNyArOTM5LDcgQEAKIAlyZXR1cm4gZ2ljX2Rpc3RfcGh5c2FkZHIgKyBHSUNfRElTVF9TT0ZUSU5UOwogfQogCi12b2lkIF9faW5pdCBnaWNfaW5pdF9waHlzYWRkcihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCitzdGF0aWMgdm9pZCBfX2luaXQgZ2ljX2luaXRfcGh5c2FkZHIoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQogewogCXN0cnVjdCByZXNvdXJjZSByZXM7CiAJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uobm9kZSwgMCwgJnJlcykgPT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1qY29yZS1haWMuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtamNvcmUtYWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiMDFkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtamNvcmUtYWljLmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIEotQ29yZSBTb0MgQUlDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFNtYXJ0IEVuZXJneSBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKworI2RlZmluZSBKQ09SRV9BSUNfTUFYX0hXSVJRCTEyNworI2RlZmluZSBKQ09SRV9BSUMxX01JTl9IV0lSUQkxNgorI2RlZmluZSBKQ09SRV9BSUMyX01JTl9IV0lSUQk2NAorCisjZGVmaW5lIEpDT1JFX0FJQzFfSU5UUFJJX1JFRwk4CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgamNvcmVfYWljOworCitzdGF0aWMgaW50IGpjb3JlX2FpY19pcnFkb21haW5fbWFwKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBpbnQgaXJxLAorCQkJCSAgIGlycV9od19udW1iZXJfdCBod2lycSkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmFpYyA9IGQtPmhvc3RfZGF0YTsKKworCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsIGFpYywgaGFuZGxlX3NpbXBsZV9pcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgamNvcmVfYWljX2lycWRvbWFpbl9vcHMgPSB7CisJLm1hcCA9IGpjb3JlX2FpY19pcnFkb21haW5fbWFwLAorCS54bGF0ZSA9IGlycV9kb21haW5feGxhdGVfb25lY2VsbCwKK307CisKK3N0YXRpYyB2b2lkIG5vb3Aoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworfQorCitzdGF0aWMgaW50IF9faW5pdCBhaWNfaXJxX29mX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCSAgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpCit7CisJdW5zaWduZWQgbWluX2lycSA9IEpDT1JFX0FJQzJfTUlOX0hXSVJROworCXVuc2lnbmVkIGRvbV9zeiA9IEpDT1JFX0FJQ19NQVhfSFdJUlErMTsKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluOworCisJcHJfaW5mbygiSW5pdGlhbGl6aW5nIEotQ29yZSBBSUNcbiIpOworCisJLyogQUlDMSBuZWVkcyBwcmlvcml0eSBpbml0aWFsaXphdGlvbiB0byByZWNlaXZlIGludGVycnVwdHMuICovCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5vZGUsICJqY29yZSxhaWMxIikpIHsKKwkJdW5zaWduZWQgY3B1OworCisJCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgeworCQkJdm9pZCBfX2lvbWVtICpiYXNlID0gb2ZfaW9tYXAobm9kZSwgY3B1KTsKKworCQkJaWYgKCFiYXNlKSB7CisJCQkJcHJfZXJyKCJVbmFibGUgdG8gbWFwIEFJQyBmb3IgY3B1ICV1XG4iLCBjcHUpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJX19yYXdfd3JpdGVsKDB4ZmZmZmZmZmYsIGJhc2UgKyBKQ09SRV9BSUMxX0lOVFBSSV9SRUcpOworCQkJaW91bm1hcChiYXNlKTsKKwkJfQorCQltaW5faXJxID0gSkNPUkVfQUlDMV9NSU5fSFdJUlE7CisJfQorCisJLyoKKwkgKiBUaGUgaXJxIGNoaXAgZnJhbWV3b3JrIHJlcXVpcmVzIGVpdGhlciBtYXNrL3VubWFzayBvciBlbmFibGUvZGlzYWJsZQorCSAqIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGJlIHByb3ZpZGVkLCBidXQgdGhlIGhhcmR3YXJlIGRvZXMgbm90IGhhdmUgYW55CisJICogc3VjaCBtZWNoYW5pc207IHRoZSBvbmx5IGludGVycnVwdCBtYXNraW5nIGlzIGF0IHRoZSBjcHUgbGV2ZWwgYW5kCisJICogaXQgYWZmZWN0cyBhbGwgaW50ZXJydXB0cy4gV2UgcHJvdmlkZSBkdW1teSBtYXNrL3VubWFzay4gVGhlIGhhcmR3YXJlCisJICogaGFuZGxlcyBhbGwgaW50ZXJydXB0IGNvbnRyb2wgYW5kIGNsZWFycyBwZW5kaW5nIHN0YXR1cyB3aGVuIHRoZSBjcHUKKwkgKiBhY2NlcHRzIHRoZSBpbnRlcnJ1cHQuCisJICovCisJamNvcmVfYWljLmlycV9tYXNrID0gbm9vcDsKKwlqY29yZV9haWMuaXJxX3VubWFzayA9IG5vb3A7CisJamNvcmVfYWljLm5hbWUgPSAiQUlDIjsKKworCWRvbWFpbiA9IGlycV9kb21haW5fYWRkX2xpbmVhcihub2RlLCBkb21fc3osICZqY29yZV9haWNfaXJxZG9tYWluX29wcywKKwkJCQkgICAgICAgJmpjb3JlX2FpYyk7CisJaWYgKCFkb21haW4pCisJCXJldHVybiAtRU5PTUVNOworCWlycV9jcmVhdGVfc3RyaWN0X21hcHBpbmdzKGRvbWFpbiwgbWluX2lycSwgbWluX2lycSwgZG9tX3N6IC0gbWluX2lycSk7CisKKwlyZXR1cm4gMDsKK30KKworSVJRQ0hJUF9ERUNMQVJFKGpjb3JlX2FpYzIsICJqY29yZSxhaWMyIiwgYWljX2lycV9vZl9pbml0KTsKK0lSUUNISVBfREVDTEFSRShqY29yZV9haWMxLCAiamNvcmUsYWljMSIsIGFpY19pcnFfb2ZfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWtleXN0b25lLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWtleXN0b25lLmMKaW5kZXggZGViODlkNi4uNTRhNWU4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1rZXlzdG9uZS5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEta2V5c3RvbmUuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAJCQlkZXZfZGJnKGtpcnEtPmRldiwgImRpc3BhdGNoIGJpdCAlZCwgdmlycSAlZFxuIiwKIAkJCQlzcmMsIHZpcnEpOwogCQkJaWYgKCF2aXJxKQotCQkJCWRldl93YXJuKGtpcnEtPmRldiwgInNwb3Jpb3VzIGlycSBkZXRlY3RlZCBod2lycSAlZCwgdmlycSAlZFxuIiwKKwkJCQlkZXZfd2FybihraXJxLT5kZXYsICJzcHVyaW91cyBpcnEgZGV0ZWN0ZWQgaHdpcnEgJWQsIHZpcnEgJWRcbiIsCiAJCQkJCSBzcmMsIHZpcnEpOwogCQkJZ2VuZXJpY19oYW5kbGVfaXJxKHZpcnEpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLW1pcHMtZ2ljLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW1pcHMtZ2ljLmMKaW5kZXggYzVmMzNjMy4uYzAxNzhhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1taXBzLWdpYy5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtbWlwcy1naWMuYwpAQCAtMzcxLDE4ICszNzEsMTMgQEAKIAliaXRtYXBfYW5kKHBlbmRpbmcsIHBlbmRpbmcsIGludHJtYXNrLCBnaWNfc2hhcmVkX2ludHJzKTsKIAliaXRtYXBfYW5kKHBlbmRpbmcsIHBlbmRpbmcsIHBjcHVfbWFzaywgZ2ljX3NoYXJlZF9pbnRycyk7CiAKLQlpbnRyID0gZmluZF9maXJzdF9iaXQocGVuZGluZywgZ2ljX3NoYXJlZF9pbnRycyk7Ci0Jd2hpbGUgKGludHIgIT0gZ2ljX3NoYXJlZF9pbnRycykgeworCWZvcl9lYWNoX3NldF9iaXQoaW50ciwgcGVuZGluZywgZ2ljX3NoYXJlZF9pbnRycykgewogCQl2aXJxID0gaXJxX2xpbmVhcl9yZXZtYXAoZ2ljX2lycV9kb21haW4sCiAJCQkJCSBHSUNfU0hBUkVEX1RPX0hXSVJRKGludHIpKTsKIAkJaWYgKGNoYWluZWQpCiAJCQlnZW5lcmljX2hhbmRsZV9pcnEodmlycSk7CiAJCWVsc2UKIAkJCWRvX0lSUSh2aXJxKTsKLQotCQkvKiBnbyB0byBuZXh0IHBlbmRpbmcgYml0ICovCi0JCWJpdG1hcF9jbGVhcihwZW5kaW5nLCBpbnRyLCAxKTsKLQkJaW50ciA9IGZpbmRfZmlyc3RfYml0KHBlbmRpbmcsIGdpY19zaGFyZWRfaW50cnMpOwogCX0KIH0KIApAQCAtNTE4LDE4ICs1MTMsMTMgQEAKIAogCWJpdG1hcF9hbmQoJnBlbmRpbmcsICZwZW5kaW5nLCAmbWFza2VkLCBHSUNfTlVNX0xPQ0FMX0lOVFJTKTsKIAotCWludHIgPSBmaW5kX2ZpcnN0X2JpdCgmcGVuZGluZywgR0lDX05VTV9MT0NBTF9JTlRSUyk7Ci0Jd2hpbGUgKGludHIgIT0gR0lDX05VTV9MT0NBTF9JTlRSUykgeworCWZvcl9lYWNoX3NldF9iaXQoaW50ciwgJnBlbmRpbmcsIEdJQ19OVU1fTE9DQUxfSU5UUlMpIHsKIAkJdmlycSA9IGlycV9saW5lYXJfcmV2bWFwKGdpY19pcnFfZG9tYWluLAogCQkJCQkgR0lDX0xPQ0FMX1RPX0hXSVJRKGludHIpKTsKIAkJaWYgKGNoYWluZWQpCiAJCQlnZW5lcmljX2hhbmRsZV9pcnEodmlycSk7CiAJCWVsc2UKIAkJCWRvX0lSUSh2aXJxKTsKLQotCQkvKiBnbyB0byBuZXh0IHBlbmRpbmcgYml0ICovCi0JCWJpdG1hcF9jbGVhcigmcGVuZGluZywgaW50ciwgMSk7Ci0JCWludHIgPSBmaW5kX2ZpcnN0X2JpdCgmcGVuZGluZywgR0lDX05VTV9MT0NBTF9JTlRSUyk7CiAJfQogfQogCkBAIC02MzgsMjcgKzYyOCw2IEBACiAJaWYgKCFnaWNfbG9jYWxfaXJxX2lzX3JvdXRhYmxlKGludHIpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JLyoKLQkgKiBIQUNLOiBUaGVzZSBhcmUgYWxsIHJlYWxseSBwZXJjcHUgaW50ZXJydXB0cywgYnV0IHRoZSByZXN0Ci0JICogb2YgdGhlIE1JUFMga2VybmVsIGNvZGUgZG9lcyBub3QgdXNlIHRoZSBwZXJjcHUgSVJRIEFQSSBmb3IKLQkgKiB0aGUgQ1AwIHRpbWVyIGFuZCBwZXJmb3JtYW5jZSBjb3VudGVyIGludGVycnVwdHMuCi0JICovCi0Jc3dpdGNoIChpbnRyKSB7Ci0JY2FzZSBHSUNfTE9DQUxfSU5UX1RJTUVSOgotCWNhc2UgR0lDX0xPQ0FMX0lOVF9QRVJGQ1RSOgotCWNhc2UgR0lDX0xPQ0FMX0lOVF9GREM6Ci0JCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcih2aXJxLAotCQkJCQkgJmdpY19hbGxfdnBlc19sb2NhbF9pcnFfY29udHJvbGxlciwKLQkJCQkJIGhhbmRsZV9wZXJjcHVfaXJxKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsCi0JCQkJCSAmZ2ljX2xvY2FsX2lycV9jb250cm9sbGVyLAotCQkJCQkgaGFuZGxlX3BlcmNwdV9kZXZpZF9pcnEpOwotCQlpcnFfc2V0X3BlcmNwdV9kZXZpZCh2aXJxKTsKLQkJYnJlYWs7Ci0JfQotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdpY19sb2NrLCBmbGFncyk7CiAJZm9yIChpID0gMDsgaSA8IGdpY192cGVzOyBpKyspIHsKIAkJdTMyIHZhbCA9IEdJQ19NQVBfVE9fUElOX01TSyB8IGdpY19jcHVfcGluOwpAQCAtNzEzLDkgKzY4Miw2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaTsKIAotCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmZ2ljX2xldmVsX2lycV9jb250cm9sbGVyLAotCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZnaWNfbG9jaywgZmxhZ3MpOwogCWdpY19tYXBfdG9fcGluKGludHIsIGdpY19jcHVfcGluKTsKIAlnaWNfbWFwX3RvX3ZwZShpbnRyLCBtaXBzX2NtX3ZwX2lkKHZwZSkpOwpAQCAtNzI3LDEyICs2OTMsNDIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnaWNfaXJxX2RvbWFpbl9tYXAoc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGludCB2aXJxLAotCQkJICAgICAgaXJxX2h3X251bWJlcl90IGh3KQorc3RhdGljIGludCBnaWNfc2V0dXBfZGV2X2NoaXAoc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGludCB2aXJxLAorCQkJICAgICAgdW5zaWduZWQgaW50IGh3aXJxKQogewotCWlmIChHSUNfSFdJUlFfVE9fTE9DQUwoaHcpIDwgR0lDX05VTV9MT0NBTF9JTlRSUykKLQkJcmV0dXJuIGdpY19sb2NhbF9pcnFfZG9tYWluX21hcChkLCB2aXJxLCBodyk7Ci0JcmV0dXJuIGdpY19zaGFyZWRfaXJxX2RvbWFpbl9tYXAoZCwgdmlycSwgaHcsIDApOworCXN0cnVjdCBpcnFfY2hpcCAqY2hpcDsKKwlpbnQgZXJyOworCisJaWYgKGh3aXJxID49IEdJQ19TSEFSRURfSFdJUlFfQkFTRSkgeworCQllcnIgPSBpcnFfZG9tYWluX3NldF9od2lycV9hbmRfY2hpcChkLCB2aXJxLCBod2lycSwKKwkJCQkJCSAgICAmZ2ljX2xldmVsX2lycV9jb250cm9sbGVyLAorCQkJCQkJICAgIE5VTEwpOworCX0gZWxzZSB7CisJCXN3aXRjaCAoR0lDX0hXSVJRX1RPX0xPQ0FMKGh3aXJxKSkgeworCQljYXNlIEdJQ19MT0NBTF9JTlRfVElNRVI6CisJCWNhc2UgR0lDX0xPQ0FMX0lOVF9QRVJGQ1RSOgorCQljYXNlIEdJQ19MT0NBTF9JTlRfRkRDOgorCQkJLyoKKwkJCSAqIEhBQ0s6IFRoZXNlIGFyZSBhbGwgcmVhbGx5IHBlcmNwdSBpbnRlcnJ1cHRzLCBidXQKKwkJCSAqIHRoZSByZXN0IG9mIHRoZSBNSVBTIGtlcm5lbCBjb2RlIGRvZXMgbm90IHVzZSB0aGUKKwkJCSAqIHBlcmNwdSBJUlEgQVBJIGZvciB0aGVtLgorCQkJICovCisJCQljaGlwID0gJmdpY19hbGxfdnBlc19sb2NhbF9pcnFfY29udHJvbGxlcjsKKwkJCWlycV9zZXRfaGFuZGxlcih2aXJxLCBoYW5kbGVfcGVyY3B1X2lycSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJY2hpcCA9ICZnaWNfbG9jYWxfaXJxX2NvbnRyb2xsZXI7CisJCQlpcnFfc2V0X2hhbmRsZXIodmlycSwgaGFuZGxlX3BlcmNwdV9kZXZpZF9pcnEpOworCQkJaXJxX3NldF9wZXJjcHVfZGV2aWQodmlycSk7CisJCQlicmVhazsKKwkJfQorCisJCWVyciA9IGlycV9kb21haW5fc2V0X2h3aXJxX2FuZF9jaGlwKGQsIHZpcnEsIGh3aXJxLAorCQkJCQkJICAgIGNoaXAsIE5VTEwpOworCX0KKworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgZ2ljX2lycV9kb21haW5fYWxsb2Moc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGludCB2aXJxLApAQCAtNzQzLDE1ICs3MzksMTIgQEAKIAlpbnQgY3B1LCByZXQsIGk7CiAKIAlpZiAoc3BlYy0+dHlwZSA9PSBHSUNfREVWSUNFKSB7Ci0JCS8qIHZlcmlmeSB0aGF0IGl0IGRvZXNuJ3QgY29uZmxpY3Qgd2l0aCBhbiBJUEkgaXJxICovCi0JCWlmICh0ZXN0X2JpdChzcGVjLT5od2lycSwgaXBpX3Jlc3J2KSkKKwkJLyogdmVyaWZ5IHRoYXQgc2hhcmVkIGlycXMgZG9uJ3QgY29uZmxpY3Qgd2l0aCBhbiBJUEkgaXJxICovCisJCWlmICgoc3BlYy0+aHdpcnEgPj0gR0lDX1NIQVJFRF9IV0lSUV9CQVNFKSAmJgorCQkgICAgdGVzdF9iaXQoR0lDX0hXSVJRX1RPX1NIQVJFRChzcGVjLT5od2lycSksIGlwaV9yZXNydikpCiAJCQlyZXR1cm4gLUVCVVNZOwogCi0JCWh3aXJxID0gR0lDX1NIQVJFRF9UT19IV0lSUShzcGVjLT5od2lycSk7Ci0KLQkJcmV0dXJuIGlycV9kb21haW5fc2V0X2h3aXJxX2FuZF9jaGlwKGQsIHZpcnEsIGh3aXJxLAotCQkJCQkJICAgICAmZ2ljX2xldmVsX2lycV9jb250cm9sbGVyLAotCQkJCQkJICAgICBOVUxMKTsKKwkJcmV0dXJuIGdpY19zZXR1cF9kZXZfY2hpcChkLCB2aXJxLCBzcGVjLT5od2lycSk7CiAJfSBlbHNlIHsKIAkJYmFzZV9od2lycSA9IGZpbmRfZmlyc3RfYml0KGlwaV9yZXNydiwgZ2ljX3NoYXJlZF9pbnRycyk7CiAJCWlmIChiYXNlX2h3aXJxID09IGdpY19zaGFyZWRfaW50cnMpIHsKQEAgLTc3MSwxMSArNzY0LDEzIEBACiAJCQlod2lycSA9IEdJQ19TSEFSRURfVE9fSFdJUlEoYmFzZV9od2lycSArIGkpOwogCiAJCQlyZXQgPSBpcnFfZG9tYWluX3NldF9od2lycV9hbmRfY2hpcChkLCB2aXJxICsgaSwgaHdpcnEsCi0JCQkJCQkJICAgICZnaWNfZWRnZV9pcnFfY29udHJvbGxlciwKKwkJCQkJCQkgICAgJmdpY19sZXZlbF9pcnFfY29udHJvbGxlciwKIAkJCQkJCQkgICAgTlVMTCk7CiAJCQlpZiAocmV0KQogCQkJCWdvdG8gZXJyb3I7CiAKKwkJCWlycV9zZXRfaGFuZGxlcih2aXJxICsgaSwgaGFuZGxlX2xldmVsX2lycSk7CisKIAkJCXJldCA9IGdpY19zaGFyZWRfaXJxX2RvbWFpbl9tYXAoZCwgdmlycSArIGksIGh3aXJxLCBjcHUpOwogCQkJaWYgKHJldCkKIAkJCQlnb3RvIGVycm9yOwpAQCAtODE4LDcgKzgxMyw2IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgZ2ljX2lycV9kb21haW5fb3BzID0gewotCS5tYXAgPSBnaWNfaXJxX2RvbWFpbl9tYXAsCiAJLmFsbG9jID0gZ2ljX2lycV9kb21haW5fYWxsb2MsCiAJLmZyZWUgPSBnaWNfaXJxX2RvbWFpbl9mcmVlLAogCS5tYXRjaCA9IGdpY19pcnFfZG9tYWluX21hdGNoLApAQCAtODQ5LDI5ICs4NDMsMjAgQEAKIAlzdHJ1Y3QgaXJxX2Z3c3BlYyAqZndzcGVjID0gYXJnOwogCXN0cnVjdCBnaWNfaXJxX3NwZWMgc3BlYyA9IHsKIAkJLnR5cGUgPSBHSUNfREVWSUNFLAotCQkuaHdpcnEgPSBmd3NwZWMtPnBhcmFtWzFdLAogCX07CiAJaW50IGksIHJldDsKLQlib29sIGlzX3NoYXJlZCA9IGZ3c3BlYy0+cGFyYW1bMF0gPT0gR0lDX1NIQVJFRDsKIAotCWlmIChpc19zaGFyZWQpIHsKLQkJcmV0ID0gaXJxX2RvbWFpbl9hbGxvY19pcnFzX3BhcmVudChkLCB2aXJxLCBucl9pcnFzLCAmc3BlYyk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KKwlpZiAoZndzcGVjLT5wYXJhbVswXSA9PSBHSUNfU0hBUkVEKQorCQlzcGVjLmh3aXJxID0gR0lDX1NIQVJFRF9UT19IV0lSUShmd3NwZWMtPnBhcmFtWzFdKTsKKwllbHNlCisJCXNwZWMuaHdpcnEgPSBHSUNfTE9DQUxfVE9fSFdJUlEoZndzcGVjLT5wYXJhbVsxXSk7CisKKwlyZXQgPSBpcnFfZG9tYWluX2FsbG9jX2lycXNfcGFyZW50KGQsIHZpcnEsIG5yX2lycXMsICZzcGVjKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJZm9yIChpID0gMDsgaSA8IG5yX2lycXM7IGkrKykgewotCQlpcnFfaHdfbnVtYmVyX3QgaHdpcnE7Ci0KLQkJaWYgKGlzX3NoYXJlZCkKLQkJCWh3aXJxID0gR0lDX1NIQVJFRF9UT19IV0lSUShzcGVjLmh3aXJxICsgaSk7Ci0JCWVsc2UKLQkJCWh3aXJxID0gR0lDX0xPQ0FMX1RPX0hXSVJRKHNwZWMuaHdpcnEgKyBpKTsKLQotCQlyZXQgPSBpcnFfZG9tYWluX3NldF9od2lycV9hbmRfY2hpcChkLCB2aXJxICsgaSwKLQkJCQkJCSAgICBod2lycSwKLQkJCQkJCSAgICAmZ2ljX2xldmVsX2lycV9jb250cm9sbGVyLAotCQkJCQkJICAgIE5VTEwpOworCQlyZXQgPSBnaWNfc2V0dXBfZGV2X2NoaXAoZCwgdmlycSArIGksIHNwZWMuaHdpcnEgKyBpKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3I7CiAJfQpAQCAtODkwLDEwICs4NzUsMjAgQEAKIAlyZXR1cm47CiB9CiAKK3N0YXRpYyB2b2lkIGdpY19kZXZfZG9tYWluX2FjdGl2YXRlKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sCisJCQkJICAgIHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlpZiAoR0lDX0hXSVJRX1RPX0xPQ0FMKGQtPmh3aXJxKSA8IEdJQ19OVU1fTE9DQUxfSU5UUlMpCisJCWdpY19sb2NhbF9pcnFfZG9tYWluX21hcChkb21haW4sIGQtPmlycSwgZC0+aHdpcnEpOworCWVsc2UKKwkJZ2ljX3NoYXJlZF9pcnFfZG9tYWluX21hcChkb21haW4sIGQtPmlycSwgZC0+aHdpcnEsIDApOworfQorCiBzdGF0aWMgc3RydWN0IGlycV9kb21haW5fb3BzIGdpY19kZXZfZG9tYWluX29wcyA9IHsKIAkueGxhdGUgPSBnaWNfZGV2X2RvbWFpbl94bGF0ZSwKIAkuYWxsb2MgPSBnaWNfZGV2X2RvbWFpbl9hbGxvYywKIAkuZnJlZSA9IGdpY19kZXZfZG9tYWluX2ZyZWUsCisJLmFjdGl2YXRlID0gZ2ljX2Rldl9kb21haW5fYWN0aXZhdGUsCiB9OwogCiBzdGF0aWMgaW50IGdpY19pcGlfZG9tYWluX3hsYXRlKHN0cnVjdCBpcnFfZG9tYWluICpkLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmN0cmxyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1tdmVidS1waWMuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtbXZlYnUtcGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVjNjM5NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtbXZlYnUtcGljLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTWFydmVsbAorICoKKyAqIFllaHVkYSBZaXRzY2hhayA8eWVodWRheUBtYXJ2ZWxsLmNvbT4KKyAqIFRob21hcyBQZXRhenpvbmkgPHRob21hcy5wZXRhenpvbmlAZnJlZS1lbGVjdHJvbnMuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2NoYWluZWRfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNkZWZpbmUgUElDX0NBVVNFCSAgICAgICAweDAKKyNkZWZpbmUgUElDX01BU0sJICAgICAgIDB4NAorCisjZGVmaW5lIFBJQ19NQVhfSVJRUwkJMzIKKyNkZWZpbmUgUElDX01BWF9JUlFfTUFTSwkoKDFVTCA8PCBQSUNfTUFYX0lSUVMpIC0gMSkKKworc3RydWN0IG12ZWJ1X3BpYyB7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXUzMiBwYXJlbnRfaXJxOworCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW47CisJc3RydWN0IGlycV9jaGlwIGlycV9jaGlwOworfTsKKworc3RhdGljIHZvaWQgbXZlYnVfcGljX3Jlc2V0KHN0cnVjdCBtdmVidV9waWMgKnBpYykKK3sKKwkvKiBBQ0sgYW5kIG1hc2sgYWxsIGludGVycnVwdHMgKi8KKwl3cml0ZWwoMCwgcGljLT5iYXNlICsgUElDX01BU0spOworCXdyaXRlbChQSUNfTUFYX0lSUV9NQVNLLCBwaWMtPmJhc2UgKyBQSUNfQ0FVU0UpOworfQorCitzdGF0aWMgdm9pZCBtdmVidV9waWNfZW9pX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IG12ZWJ1X3BpYyAqcGljID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisKKwl3cml0ZWwoMSA8PCBkLT5od2lycSwgcGljLT5iYXNlICsgUElDX0NBVVNFKTsKK30KKworc3RhdGljIHZvaWQgbXZlYnVfcGljX21hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgbXZlYnVfcGljICpwaWMgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1MzIgcmVnOworCisJcmVnID0gIHJlYWRsKHBpYy0+YmFzZSArIFBJQ19NQVNLKTsKKwlyZWcgfD0gKDEgPDwgZC0+aHdpcnEpOworCXdyaXRlbChyZWcsIHBpYy0+YmFzZSArIFBJQ19NQVNLKTsKK30KKworc3RhdGljIHZvaWQgbXZlYnVfcGljX3VubWFza19pcnEoc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBtdmVidV9waWMgKnBpYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXUzMiByZWc7CisKKwlyZWcgPSByZWFkbChwaWMtPmJhc2UgKyBQSUNfTUFTSyk7CisJcmVnICY9IH4oMSA8PCBkLT5od2lycSk7CisJd3JpdGVsKHJlZywgcGljLT5iYXNlICsgUElDX01BU0spOworfQorCitzdGF0aWMgaW50IG12ZWJ1X3BpY19pcnFfbWFwKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGludCB2aXJxLAorCQkJICAgICBpcnFfaHdfbnVtYmVyX3QgaHdpcnEpCit7CisJc3RydWN0IG12ZWJ1X3BpYyAqcGljID0gZG9tYWluLT5ob3N0X2RhdGE7CisKKwlpcnFfc2V0X3BlcmNwdV9kZXZpZCh2aXJxKTsKKwlpcnFfc2V0X2NoaXBfZGF0YSh2aXJxLCBwaWMpOworCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmcGljLT5pcnFfY2hpcCwKKwkJCQkgaGFuZGxlX3BlcmNwdV9kZXZpZF9pcnEpOworCWlycV9zZXRfc3RhdHVzX2ZsYWdzKHZpcnEsIElSUV9MRVZFTCk7CisJaXJxX3NldF9wcm9iZSh2aXJxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzIG12ZWJ1X3BpY19kb21haW5fb3BzID0geworCS5tYXAgPSBtdmVidV9waWNfaXJxX21hcCwKKwkueGxhdGUgPSBpcnFfZG9tYWluX3hsYXRlX29uZWNlbGwsCit9OworCitzdGF0aWMgdm9pZCBtdmVidV9waWNfaGFuZGxlX2Nhc2NhZGVfaXJxKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgbXZlYnVfcGljICpwaWMgPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOworCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kZXNjX2dldF9jaGlwKGRlc2MpOworCXVuc2lnbmVkIGxvbmcgaXJxbWFwLCBpcnFuOworCXVuc2lnbmVkIGludCBjYXNjYWRlX2lycTsKKworCWlycW1hcCA9IHJlYWRsX3JlbGF4ZWQocGljLT5iYXNlICsgUElDX0NBVVNFKTsKKwljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKKworCWZvcl9lYWNoX3NldF9iaXQoaXJxbiwgJmlycW1hcCwgQklUU19QRVJfTE9ORykgeworCQljYXNjYWRlX2lycSA9IGlycV9maW5kX21hcHBpbmcocGljLT5kb21haW4sIGlycW4pOworCQlnZW5lcmljX2hhbmRsZV9pcnEoY2FzY2FkZV9pcnEpOworCX0KKworCWNoYWluZWRfaXJxX2V4aXQoY2hpcCwgZGVzYyk7Cit9CisKK3N0YXRpYyB2b2lkIG12ZWJ1X3BpY19lbmFibGVfcGVyY3B1X2lycSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBtdmVidV9waWMgKnBpYyA9IGRhdGE7CisKKwltdmVidV9waWNfcmVzZXQocGljKTsKKwllbmFibGVfcGVyY3B1X2lycShwaWMtPnBhcmVudF9pcnEsIElSUV9UWVBFX05PTkUpOworfQorCitzdGF0aWMgdm9pZCBtdmVidV9waWNfZGlzYWJsZV9wZXJjcHVfaXJxKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG12ZWJ1X3BpYyAqcGljID0gZGF0YTsKKworCWRpc2FibGVfcGVyY3B1X2lycShwaWMtPnBhcmVudF9pcnEpOworfQorCitzdGF0aWMgaW50IG12ZWJ1X3BpY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBtdmVidV9waWMgKnBpYzsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmlycV9jaGlwOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJcGljID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgbXZlYnVfcGljKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwaWMpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlwaWMtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHBpYy0+YmFzZSkpCisJCXJldHVybiBQVFJfRVJSKHBpYy0+YmFzZSk7CisKKwlpcnFfY2hpcCA9ICZwaWMtPmlycV9jaGlwOworCWlycV9jaGlwLT5uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7CisJaXJxX2NoaXAtPmlycV9tYXNrID0gbXZlYnVfcGljX21hc2tfaXJxOworCWlycV9jaGlwLT5pcnFfdW5tYXNrID0gbXZlYnVfcGljX3VubWFza19pcnE7CisJaXJxX2NoaXAtPmlycV9lb2kgPSBtdmVidV9waWNfZW9pX2lycTsKKworCXBpYy0+cGFyZW50X2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5vZGUsIDApOworCWlmIChwaWMtPnBhcmVudF9pcnEgPD0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcGFyc2UgcGFyZW50IGludGVycnVwdFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBpYy0+ZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfbGluZWFyKG5vZGUsIFBJQ19NQVhfSVJRUywKKwkJCQkJICAgICZtdmVidV9waWNfZG9tYWluX29wcywgcGljKTsKKwlpZiAoIXBpYy0+ZG9tYWluKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBpcnEgZG9tYWluXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIocGljLT5wYXJlbnRfaXJxLCBtdmVidV9waWNfaGFuZGxlX2Nhc2NhZGVfaXJxKTsKKwlpcnFfc2V0X2hhbmRsZXJfZGF0YShwaWMtPnBhcmVudF9pcnEsIHBpYyk7CisKKwlvbl9lYWNoX2NwdShtdmVidV9waWNfZW5hYmxlX3BlcmNwdV9pcnEsIHBpYywgMSk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwaWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXZlYnVfcGljX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtdmVidV9waWMgKnBpYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJb25fZWFjaF9jcHUobXZlYnVfcGljX2Rpc2FibGVfcGVyY3B1X2lycSwgcGljLCAxKTsKKwlpcnFfZG9tYWluX3JlbW92ZShwaWMtPmRvbWFpbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXZlYnVfcGljX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGFybWFkYS04ay1waWMiLCB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG12ZWJ1X3BpY19vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG12ZWJ1X3BpY19kcml2ZXIgPSB7CisJLnByb2JlICA9IG12ZWJ1X3BpY19wcm9iZSwKKwkucmVtb3ZlID0gbXZlYnVfcGljX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtdmVidS1waWMiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtdmVidV9waWNfb2ZfbWF0Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG12ZWJ1X3BpY19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJZZWh1ZGEgWWl0c2NoYWsgPHllaHVkYXlAbWFydmVsbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgUGV0YXp6b25pIDx0aG9tYXMucGV0YXp6b25pQGZyZWUtZWxlY3Ryb25zLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06bXZlYnVfcGljIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtc3RtMzItZXh0aS5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1zdG0zMi1leHRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxNTY4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtc3RtMzItZXh0aS5jCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSBNYXhpbWUgQ29xdWVsaW4gMjAxNQorICogQXV0aG9yOiAgTWF4aW1lIENvcXVlbGluIDxtY29xdWVsaW4uc3RtMzJAZ21haWwuY29tPgorICogTGljZW5zZSB0ZXJtczogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCB2ZXJzaW9uIDIKKyAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFjaGlwLmg+CisjaW5jbHVkZSA8bGludXgvaXJxY2hpcC9jaGFpbmVkX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKworI2RlZmluZSBFWFRJX0lNUgkweDAKKyNkZWZpbmUgRVhUSV9FTVIJMHg0CisjZGVmaW5lIEVYVElfUlRTUgkweDgKKyNkZWZpbmUgRVhUSV9GVFNSCTB4YworI2RlZmluZSBFWFRJX1NXSUVSCTB4MTAKKyNkZWZpbmUgRVhUSV9QUgkJMHgxNAorCitzdGF0aWMgdm9pZCBzdG0zMl9pcnFfaGFuZGxlcihzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbiA9IGlycV9kZXNjX2dldF9oYW5kbGVyX2RhdGEoZGVzYyk7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gZG9tYWluLT5nYy0+Z2NbMF07CisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2Rlc2NfZ2V0X2NoaXAoZGVzYyk7CisJdW5zaWduZWQgbG9uZyBwZW5kaW5nOworCWludCBuOworCisJY2hhaW5lZF9pcnFfZW50ZXIoY2hpcCwgZGVzYyk7CisKKwl3aGlsZSAoKHBlbmRpbmcgPSBpcnFfcmVnX3JlYWRsKGdjLCBFWFRJX1BSKSkpIHsKKwkJZm9yX2VhY2hfc2V0X2JpdChuLCAmcGVuZGluZywgQklUU19QRVJfTE9ORykgeworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycV9maW5kX21hcHBpbmcoZG9tYWluLCBuKSk7CisJCQlpcnFfcmVnX3dyaXRlbChnYywgQklUKG4pLCBFWFRJX1BSKTsKKwkJfQorCX0KKworCWNoYWluZWRfaXJxX2V4aXQoY2hpcCwgZGVzYyk7Cit9CisKK3N0YXRpYyBpbnQgc3RtMzJfaXJxX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJaW50IHBpbiA9IGRhdGEtPmh3aXJxOworCXUzMiBydHNyLCBmdHNyOworCisJaXJxX2djX2xvY2soZ2MpOworCisJcnRzciA9IGlycV9yZWdfcmVhZGwoZ2MsIEVYVElfUlRTUik7CisJZnRzciA9IGlycV9yZWdfcmVhZGwoZ2MsIEVYVElfRlRTUik7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgorCQlydHNyIHw9IEJJVChwaW4pOworCQlmdHNyICY9IH5CSVQocGluKTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6CisJCXJ0c3IgJj0gfkJJVChwaW4pOworCQlmdHNyIHw9IEJJVChwaW4pOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwkJcnRzciB8PSBCSVQocGluKTsKKwkJZnRzciB8PSBCSVQocGluKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaXJxX2djX3VubG9jayhnYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlycV9yZWdfd3JpdGVsKGdjLCBydHNyLCBFWFRJX1JUU1IpOworCWlycV9yZWdfd3JpdGVsKGdjLCBmdHNyLCBFWFRJX0ZUU1IpOworCisJaXJxX2djX3VubG9jayhnYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdG0zMl9pcnFfc2V0X3dha2Uoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgb24pCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJaW50IHBpbiA9IGRhdGEtPmh3aXJxOworCXUzMiBlbXI7CisKKwlpcnFfZ2NfbG9jayhnYyk7CisKKwllbXIgPSBpcnFfcmVnX3JlYWRsKGdjLCBFWFRJX0VNUik7CisJaWYgKG9uKQorCQllbXIgfD0gQklUKHBpbik7CisJZWxzZQorCQllbXIgJj0gfkJJVChwaW4pOworCWlycV9yZWdfd3JpdGVsKGdjLCBlbXIsIEVYVElfRU1SKTsKKworCWlycV9nY191bmxvY2soZ2MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RtMzJfZXh0aV9hbGxvYyhzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwgdW5zaWduZWQgaW50IHZpcnEsCisJCQkgICAgdW5zaWduZWQgaW50IG5yX2lycXMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gZC0+Z2MtPmdjWzBdOworCXN0cnVjdCBpcnFfZndzcGVjICpmd3NwZWMgPSBkYXRhOworCWlycV9od19udW1iZXJfdCBod2lycTsKKworCWh3aXJxID0gZndzcGVjLT5wYXJhbVswXTsKKworCWlycV9tYXBfZ2VuZXJpY19jaGlwKGQsIHZpcnEsIGh3aXJxKTsKKwlpcnFfZG9tYWluX3NldF9pbmZvKGQsIHZpcnEsIGh3aXJxLCAmZ2MtPmNoaXBfdHlwZXMtPmNoaXAsIGdjLAorCQkJICAgIGhhbmRsZV9zaW1wbGVfaXJxLCBOVUxMLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdG0zMl9leHRpX2ZyZWUoc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGludCB2aXJxLAorCQkJICAgIHVuc2lnbmVkIGludCBucl9pcnFzKQoreworCXN0cnVjdCBpcnFfZGF0YSAqZGF0YSA9IGlycV9kb21haW5fZ2V0X2lycV9kYXRhKGQsIHZpcnEpOworCisJaXJxX2RvbWFpbl9yZXNldF9pcnFfZGF0YShkYXRhKTsKK30KKworc3RydWN0IGlycV9kb21haW5fb3BzIGlycV9leHRpX2RvbWFpbl9vcHMgPSB7CisJLm1hcAk9IGlycV9tYXBfZ2VuZXJpY19jaGlwLAorCS54bGF0ZQk9IGlycV9kb21haW5feGxhdGVfb25ldHdvY2VsbCwKKwkuYWxsb2MgID0gc3RtMzJfZXh0aV9hbGxvYywKKwkuZnJlZQk9IHN0bTMyX2V4dGlfZnJlZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHN0bTMyX2V4dGlfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCkKK3sKKwl1bnNpZ25lZCBpbnQgY2xyID0gSVJRX05PUkVRVUVTVCB8IElSUV9OT1BST0JFIHwgSVJRX05PQVVUT0VOOworCWludCBucl9pcnFzLCBucl9leHRpLCByZXQsIGk7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjOworCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW47CisJdm9pZCAqYmFzZTsKKworCWJhc2UgPSBvZl9pb21hcChub2RlLCAwKTsKKwlpZiAoIWJhc2UpIHsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIG1hcCByZWdpc3RlcnNcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIERldGVybWluZSBudW1iZXIgb2YgaXJxcyBzdXBwb3J0ZWQgKi8KKwl3cml0ZWxfcmVsYXhlZCh+MFVMLCBiYXNlICsgRVhUSV9SVFNSKTsKKwlucl9leHRpID0gZmxzKHJlYWRsX3JlbGF4ZWQoYmFzZSArIEVYVElfUlRTUikpOworCXdyaXRlbF9yZWxheGVkKDAsIGJhc2UgKyBFWFRJX1JUU1IpOworCisJcHJfaW5mbygiJXM6ICVkIEV4dGVybmFsIElSUXMgZGV0ZWN0ZWRcbiIsIG5vZGUtPmZ1bGxfbmFtZSwgbnJfZXh0aSk7CisKKwlkb21haW4gPSBpcnFfZG9tYWluX2FkZF9saW5lYXIobm9kZSwgbnJfZXh0aSwKKwkJCQkgICAgICAgJmlycV9leHRpX2RvbWFpbl9vcHMsIE5VTEwpOworCWlmICghZG9tYWluKSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCByZWdpc3RlciBpbnRlcnJ1cHQgZG9tYWluLlxuIiwKKwkJCQlub2RlLT5uYW1lKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5tYXA7CisJfQorCisJcmV0ID0gaXJxX2FsbG9jX2RvbWFpbl9nZW5lcmljX2NoaXBzKGRvbWFpbiwgbnJfZXh0aSwgMSwgImV4dGkiLAorCQkJCQkgICAgIGhhbmRsZV9lZGdlX2lycSwgY2xyLCAwLCAwKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBnZW5lcmljIGludGVycnVwdCBjaGlwLlxuIiwKKwkJCW5vZGUtPmZ1bGxfbmFtZSk7CisJCWdvdG8gb3V0X2ZyZWVfZG9tYWluOworCX0KKworCWdjID0gZG9tYWluLT5nYy0+Z2NbMF07CisJZ2MtPnJlZ19iYXNlICAgICAgICAgICAgICAgICAgICAgICAgID0gYmFzZTsKKwlnYy0+Y2hpcF90eXBlcy0+dHlwZSAgICAgICAgICAgICAgID0gSVJRX1RZUEVfRURHRV9CT1RIOworCWdjLT5jaGlwX3R5cGVzLT5jaGlwLm5hbWUgICAgICAgICAgPSBnYy0+Y2hpcF90eXBlc1swXS5jaGlwLm5hbWU7CisJZ2MtPmNoaXBfdHlwZXMtPmNoaXAuaXJxX2FjayAgICAgICA9IGlycV9nY19hY2tfc2V0X2JpdDsKKwlnYy0+Y2hpcF90eXBlcy0+Y2hpcC5pcnFfbWFzayAgICAgID0gaXJxX2djX21hc2tfY2xyX2JpdDsKKwlnYy0+Y2hpcF90eXBlcy0+Y2hpcC5pcnFfdW5tYXNrICAgID0gaXJxX2djX21hc2tfc2V0X2JpdDsKKwlnYy0+Y2hpcF90eXBlcy0+Y2hpcC5pcnFfc2V0X3R5cGUgID0gc3RtMzJfaXJxX3NldF90eXBlOworCWdjLT5jaGlwX3R5cGVzLT5jaGlwLmlycV9zZXRfd2FrZSAgPSBzdG0zMl9pcnFfc2V0X3dha2U7CisJZ2MtPmNoaXBfdHlwZXMtPnJlZ3MuYWNrICAgICAgICAgICA9IEVYVElfUFI7CisJZ2MtPmNoaXBfdHlwZXMtPnJlZ3MubWFzayAgICAgICAgICA9IEVYVElfSU1SOworCWdjLT5jaGlwX3R5cGVzLT5oYW5kbGVyICAgICAgICAgICAgPSBoYW5kbGVfZWRnZV9pcnE7CisKKwlucl9pcnFzID0gb2ZfaXJxX2NvdW50KG5vZGUpOworCWZvciAoaSA9IDA7IGkgPCBucl9pcnFzOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IGlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5vZGUsIGkpOworCisJCWlycV9zZXRfaGFuZGxlcl9kYXRhKGlycSwgZG9tYWluKTsKKwkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoaXJxLCBzdG0zMl9pcnFfaGFuZGxlcik7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9mcmVlX2RvbWFpbjoKKwlpcnFfZG9tYWluX3JlbW92ZShkb21haW4pOworb3V0X3VubWFwOgorCWlvdW5tYXAoYmFzZSk7CisJcmV0dXJuIHJldDsKK30KKworSVJRQ0hJUF9ERUNMQVJFKHN0bTMyX2V4dGksICJzdCxzdG0zMi1leHRpIiwgc3RtMzJfZXh0aV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9hdm1mcml0ei5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2F2bWZyaXR6LmMKaW5kZXggMjkyOTkxYy4uZTNmYTFjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2F2bWZyaXR6LmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2F2bWZyaXR6LmMKQEAgLTI4NCw3ICsyODQsNyBAQAogCQkJCQkgIEFWTV9IRExDX1NUQVRVU18xKSk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiB3cml0ZV9jdHJsKHN0cnVjdCBiY2hhbm5lbCAqYmNoLCBpbnQgd2hpY2gpIHsKIAlzdHJ1Y3QgZnJpdHpjYXJkICpmYyA9IGJjaC0+aHc7CiAJc3RydWN0IGhkbGNfaHcgKmhkbGM7CkBAIC03NDEsNyArNzQxLDcgQEAKIAltb2RlaGRsYygmZmMtPmJjaFsxXSwgLTEpOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogY2xlYXJfcGVuZGluZ19oZGxjX2ludHMoc3RydWN0IGZyaXR6Y2FyZCAqZmMpCiB7CiAJdTMyIHZhbDsKQEAgLTk2Miw3ICs5NjIsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludAorc3RhdGljIGludAogc2V0dXBfZnJpdHooc3RydWN0IGZyaXR6Y2FyZCAqZmMpCiB7CiAJdTMyIHZhbCwgdmVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjbXVsdGkuYwppbmRleCAyODU0M2Q3Li40ODBjMmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjbXVsdGkuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjbXVsdGkuYwpAQCAtNTY0LDE5ICs1NjQsMTkgQEAKICNkZWZpbmUJTUFYX1RETV9DSEFOIDMyCiAKIAotaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogZW5hYmxlcGNpYnJpZGdlKHN0cnVjdCBoZmNfbXVsdGkgKmMpCiB7CiAJSEZDX291dGIoYywgUl9CUkdfUENNX0NGRywgKDB4MCA8PCA2KSB8IDB4Myk7IC8qIHdhcyBfaW8gYmVmb3JlICovCiB9CiAKLWlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIGRpc2FibGVwY2licmlkZ2Uoc3RydWN0IGhmY19tdWx0aSAqYykKIHsKIAlIRkNfb3V0YihjLCBSX0JSR19QQ01fQ0ZHLCAoMHgwIDw8IDYpIHwgMHgyKTsgLyogd2FzIF9pbyBiZWZvcmUgKi8KIH0KIAotaW5saW5lIHVuc2lnbmVkIGNoYXIKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhcgogcmVhZHBjaWJyaWRnZShzdHJ1Y3QgaGZjX211bHRpICpoYywgdW5zaWduZWQgY2hhciBhZGRyZXNzKQogewogCXVuc2lnbmVkIHNob3J0IGNpcHY7CkBAIC02MDQsNyArNjA0LDcgQEAKIAlyZXR1cm4gZGF0YTsKIH0KIAotaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogd3JpdGVwY2licmlkZ2Uoc3RydWN0IGhmY19tdWx0aSAqaGMsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywgdW5zaWduZWQgY2hhciBkYXRhKQogewogCXVuc2lnbmVkIHNob3J0IGNpcHY7CkBAIC02MzQsMTQgKzYzNCwxNCBAQAogCW91dGwoZGF0YXYsIGhjLT5wY2lfaW9iYXNlKTsKIH0KIAotaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogY3BsZF9zZXRfcmVnKHN0cnVjdCBoZmNfbXVsdGkgKmhjLCB1bnNpZ25lZCBjaGFyIHJlZykKIHsKIAkvKiBEbyBkYXRhIHBpbiByZWFkIGxvdyBieXRlICovCiAJSEZDX291dGIoaGMsIFJfR1BJT19PVVQxLCByZWcpOwogfQogCi1pbmxpbmUgdm9pZAorc3RhdGljIGlubGluZSB2b2lkCiBjcGxkX3dyaXRlX3JlZyhzdHJ1Y3QgaGZjX211bHRpICpoYywgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKQogewogCWNwbGRfc2V0X3JlZyhoYywgcmVnKTsKQEAgLTY1Myw3ICs2NTMsNyBAQAogCXJldHVybjsKIH0KIAotaW5saW5lIHVuc2lnbmVkIGNoYXIKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhcgogY3BsZF9yZWFkX3JlZyhzdHJ1Y3QgaGZjX211bHRpICpoYywgdW5zaWduZWQgY2hhciByZWcpCiB7CiAJdW5zaWduZWQgY2hhciBieXRlaW47CkBAIC02NzAsMTQgKzY3MCwxNCBAQAogCXJldHVybiBieXRlaW47CiB9CiAKLWlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIHZwbV93cml0ZV9hZGRyZXNzKHN0cnVjdCBoZmNfbXVsdGkgKmhjLCB1bnNpZ25lZCBzaG9ydCBhZGRyKQogewogCWNwbGRfd3JpdGVfcmVnKGhjLCAwLCAweGZmICYgYWRkcik7CiAJY3BsZF93cml0ZV9yZWcoaGMsIDEsIDB4MDEgJiAoYWRkciA+PiA4KSk7CiB9CiAKLWlubGluZSB1bnNpZ25lZCBzaG9ydAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAogdnBtX3JlYWRfYWRkcmVzcyhzdHJ1Y3QgaGZjX211bHRpICpjKQogewogCXVuc2lnbmVkIHNob3J0IGFkZHI7CkBAIC02OTEsNyArNjkxLDcgQEAKIAlyZXR1cm4gYWRkciAmIDB4MWZmOwogfQogCi1pbmxpbmUgdW5zaWduZWQgY2hhcgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyCiB2cG1faW4oc3RydWN0IGhmY19tdWx0aSAqYywgaW50IHdoaWNoLCB1bnNpZ25lZCBzaG9ydCBhZGRyKQogewogCXVuc2lnbmVkIGNoYXIgcmVzOwpAQCAtNzEyLDcgKzcxMiw3IEBACiAJcmV0dXJuIHJlczsKIH0KIAotaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogdnBtX291dChzdHJ1Y3QgaGZjX211bHRpICpjLCBpbnQgd2hpY2gsIHVuc2lnbmVkIHNob3J0IGFkZHIsCiAJdW5zaWduZWQgY2hhciBkYXRhKQogewpAQCAtMTAyNCw3ICsxMDI0LDcgQEAKIH0KIAogLyogVGhpcyBtdXN0IGJlIGNhbGxlZCBBTkQgaGMgbXVzdCBiZSBsb2NrZWQgaXJxc2F2ZSEhISAqLwotaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogcGx4c2RfY2hlY2tzeW5jKHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBpbnQgcm0pCiB7CiAJaWYgKGhjLT5zeW5jcm9uaXplZCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL21JU0ROaXBhYy5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL21JU0ROaXBhYy5jCmluZGV4IGFhOWI2YzMuLjhkMzM4YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9tSVNETmlwYWMuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vbUlTRE5pcGFjLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCXByX2RlYnVnKCIlczogVEUgbmV3c3RhdGUgJXhcbiIsIGlzYWMtPm5hbWUsIGRjaC0+c3RhdGUpOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogaXNhY19lbXB0eV9maWZvKHN0cnVjdCBpc2FjX2h3ICppc2FjLCBpbnQgY291bnQpCiB7CiAJdTggKnB0cjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi93NjY5Mi5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL3c2NjkyLmMKaW5kZXggNzQxNjc1NS4uM2IwNjdlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL3c2NjkyLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL3c2NjkyLmMKQEAgLTg0OCw3ICs4NDgsNyBAQAogCX0KIH0KIAotdm9pZCBpbml0VzY2OTIoc3RydWN0IHc2NjkyX2h3ICpjYXJkKQorc3RhdGljIHZvaWQgaW5pdFc2NjkyKHN0cnVjdCB3NjY5Ml9odyAqY2FyZCkKIHsKIAl1OAl2YWw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9LY29uZmlnIGIvZHJpdmVycy9sZWRzL0tjb25maWcKaW5kZXggOWRjYzliMS4uN2E2MjhjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL0tjb25maWcKKysrIGIvZHJpdmVycy9sZWRzL0tjb25maWcKQEAgLTU4NCw2ICs1ODQsMTggQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbyB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBsZWRzLXNlYWQzLgogCitjb25maWcgTEVEU19JUzMxRkwzMTlYCisJdHJpc3RhdGUgIkxFRCBTdXBwb3J0IGZvciBJU1NJIElTMzFGTDMxOXggSTJDIExFRCBjb250cm9sbGVyIGZhbWlseSIKKwlkZXBlbmRzIG9uIExFRFNfQ0xBU1MgJiYgSTJDICYmIE9GCisJc2VsZWN0IFJFR01BUF9JMkMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIExFRHMgY29ubmVjdGVkIHRvIElTU0kgSVMzMUZMMzE5eAorCSAgZmFuY3kgTEVEIGRyaXZlciBjaGlwcyBhY2Nlc3NlZCB2aWEgdGhlIEkyQyBidXMuCisJICBEcml2ZXIgc3VwcG9ydHMgaW5kaXZpZHVhbCBQV00gYnJpZ2h0bmVzcyBjb250cm9sIGZvciBlYWNoIGNoYW5uZWwuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbyB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBsZWRzLWlzMzFmbDMxOXguCisKIGNvbmZpZyBMRURTX0lTMzFGTDMyWFgKIAl0cmlzdGF0ZSAiTEVEIHN1cHBvcnQgZm9yIElTU0kgSVMzMUZMMzJYWCBJMkMgTEVEIGNvbnRyb2xsZXIgZmFtaWx5IgogCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBJMkMgJiYgT0YKQEAgLTYzMSw2ICs2NDMsMjIgQEAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZWQgc3VwcG9ydCBmb3IgdGhlIExFRHMgb24gdGhlIEFSTSBWZXJzYXRpbGUKIAkgIGFuZCBSZWFsVmlldyBib2FyZHMuIFNheSBZIHRvIGVuYWJsZWQgdGhlc2UuCiAKK2NvbmZpZyBMRURTX1BNODA1OAorCXRyaXN0YXRlICJMRUQgU3VwcG9ydCBmb3IgdGhlIFF1YWxjb21tIFBNODA1OCBQTUlDIgorCWRlcGVuZHMgb24gTUZEX1BNODkyMV9DT1JFCisJZGVwZW5kcyBvbiBMRURTX0NMQVNTCisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgTEVEIGRyaXZlcnMgaW4KKwkgIHRoZSBRdWFsY29tbSBQTTgwNTggUE1JQy4KKworY29uZmlnIExFRFNfTUxYQ1BMRAorCXRyaXN0YXRlICJMRUQgc3VwcG9ydCBmb3IgdGhlIE1lbGxhbm94IGJvYXJkcyIKKwlkZXBlbmRzIG9uIFg4Nl82NCAmJiBETUkKKwlkZXBlbmRzIG9uIExFRFNfQ0xBU1MKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVkIHN1cHBvcnQgZm9yIHRoZSBMRURzIG9uIHRoZSBNZWxsYW5veAorCSAgYm9hcmRzLiBTYXkgWSB0byBlbmFibGVkIHRoZXNlLgorCiBjb21tZW50ICJMRUQgVHJpZ2dlcnMiCiBzb3VyY2UgImRyaXZlcnMvbGVkcy90cmlnZ2VyL0tjb25maWciCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9NYWtlZmlsZSBiL2RyaXZlcnMvbGVkcy9NYWtlZmlsZQppbmRleCAwNjg0Yzg2Li4zOTY1MDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9sZWRzL01ha2VmaWxlCkBAIC02Nyw3ICs2NywxMCBAQAogb2JqLSQoQ09ORklHX0xFRFNfS1REMjY5MikJCSs9IGxlZHMta3RkMjY5Mi5vCiBvYmotJChDT05GSUdfTEVEU19QT1dFUk5WKQkJKz0gbGVkcy1wb3dlcm52Lm8KIG9iai0kKENPTkZJR19MRURTX1NFQUQzKQkJKz0gbGVkcy1zZWFkMy5vCitvYmotJChDT05GSUdfTEVEU19JUzMxRkwzMTlYKQkJKz0gbGVkcy1pczMxZmwzMTl4Lm8KIG9iai0kKENPTkZJR19MRURTX0lTMzFGTDMyWFgpCQkrPSBsZWRzLWlzMzFmbDMyeHgubworb2JqLSQoQ09ORklHX0xFRFNfUE04MDU4KQkJKz0gbGVkcy1wbTgwNTgubworb2JqLSQoQ09ORklHX0xFRFNfTUxYQ1BMRCkJCSs9IGxlZHMtbWx4Y3BsZC5vCiAKICMgTEVEIFNQSSBEcml2ZXJzCiBvYmotJChDT05GSUdfTEVEU19EQUMxMjRTMDg1KQkJKz0gbGVkcy1kYWMxMjRzMDg1Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWQtdHJpZ2dlcnMuYyBiL2RyaXZlcnMvbGVkcy9sZWQtdHJpZ2dlcnMuYwppbmRleCBjOTI3MDJhLi40MzExMjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkLXRyaWdnZXJzLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZC10cmlnZ2Vycy5jCkBAIC0xMSw3ICsxMSw3IEBACiAgKgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTgxLDIxICs4MSwyMyBAQAogCWRvd25fcmVhZCgmbGVkX2NkZXYtPnRyaWdnZXJfbG9jayk7CiAKIAlpZiAoIWxlZF9jZGV2LT50cmlnZ2VyKQotCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiW25vbmVdICIpOworCQlsZW4gKz0gc2NucHJpbnRmKGJ1ZitsZW4sIFBBR0VfU0laRSAtIGxlbiwgIltub25lXSAiKTsKIAllbHNlCi0JCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJub25lICIpOworCQlsZW4gKz0gc2NucHJpbnRmKGJ1ZitsZW4sIFBBR0VfU0laRSAtIGxlbiwgIm5vbmUgIik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyaWcsICZ0cmlnZ2VyX2xpc3QsIG5leHRfdHJpZykgewogCQlpZiAobGVkX2NkZXYtPnRyaWdnZXIgJiYgIXN0cmNtcChsZWRfY2Rldi0+dHJpZ2dlci0+bmFtZSwKIAkJCQkJCQl0cmlnLT5uYW1lKSkKLQkJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJbJXNdICIsIHRyaWctPm5hbWUpOworCQkJbGVuICs9IHNjbnByaW50ZihidWYrbGVuLCBQQUdFX1NJWkUgLSBsZW4sICJbJXNdICIsCisJCQkJCSB0cmlnLT5uYW1lKTsKIAkJZWxzZQotCQkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiVzICIsIHRyaWctPm5hbWUpOworCQkJbGVuICs9IHNjbnByaW50ZihidWYrbGVuLCBQQUdFX1NJWkUgLSBsZW4sICIlcyAiLAorCQkJCQkgdHJpZy0+bmFtZSk7CiAJfQogCXVwX3JlYWQoJmxlZF9jZGV2LT50cmlnZ2VyX2xvY2spOwogCXVwX3JlYWQoJnRyaWdnZXJzX2xpc3RfbG9jayk7CiAKLQlsZW4gKz0gc3ByaW50ZihsZW4rYnVmLCAiXG4iKTsKKwlsZW4gKz0gc2NucHJpbnRmKGxlbitidWYsIFBBR0VfU0laRSAtIGxlbiwgIlxuIik7CiAJcmV0dXJuIGxlbjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxlZF90cmlnZ2VyX3Nob3cpOwpAQCAtMTA4LDYgKzExMCw5IEBACiAJY2hhciAqZW52cFsyXTsKIAljb25zdCBjaGFyICpuYW1lOwogCisJaWYgKCFsZWRfY2Rldi0+dHJpZ2dlciAmJiAhdHJpZykKKwkJcmV0dXJuOworCiAJbmFtZSA9IHRyaWcgPyB0cmlnLT5uYW1lIDogIm5vbmUiOwogCWV2ZW50ID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJUUklHR0VSPSVzIiwgbmFtZSk7CiAKQEAgLTEzNiw3ICsxNDEsOSBAQAogCWlmIChldmVudCkgewogCQllbnZwWzBdID0gZXZlbnQ7CiAJCWVudnBbMV0gPSBOVUxMOwotCQlrb2JqZWN0X3VldmVudF9lbnYoJmxlZF9jZGV2LT5kZXYtPmtvYmosIEtPQkpfQ0hBTkdFLCBlbnZwKTsKKwkJaWYgKGtvYmplY3RfdWV2ZW50X2VudigmbGVkX2NkZXYtPmRldi0+a29iaiwgS09CSl9DSEFOR0UsIGVudnApKQorCQkJZGV2X2VycihsZWRfY2Rldi0+ZGV2LAorCQkJCSIlczogRXJyb3Igc2VuZGluZyB1ZXZlbnRcbiIsIF9fZnVuY19fKTsKIAkJa2ZyZWUoZXZlbnQpOwogCX0KIH0KQEAgLTM1Nyw3ICszNjQsMyBAQAogCWtmcmVlKHRyaWcpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobGVkX3RyaWdnZXJfdW5yZWdpc3Rlcl9zaW1wbGUpOwotCi1NT0RVTEVfQVVUSE9SKCJSaWNoYXJkIFB1cmRpZSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJMRUQgVHJpZ2dlcnMgQ29yZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtZ3Bpby5jIGIvZHJpdmVycy9sZWRzL2xlZHMtZ3Bpby5jCmluZGV4IDliOTkxZDQuLmQ0MDBkY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLWdwaW8uYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1ncGlvLmMKQEAgLTI2LDE1ICsyNiwxOSBAQAogCXN0cnVjdCBncGlvX2Rlc2MgKmdwaW9kOwogCXU4IGNhbl9zbGVlcDsKIAl1OCBibGlua2luZzsKLQlpbnQgKCpwbGF0Zm9ybV9ncGlvX2JsaW5rX3NldCkoc3RydWN0IGdwaW9fZGVzYyAqZGVzYywgaW50IHN0YXRlLAotCQkJdW5zaWduZWQgbG9uZyAqZGVsYXlfb24sIHVuc2lnbmVkIGxvbmcgKmRlbGF5X29mZik7CisJZ3Bpb19ibGlua19zZXRfdCBwbGF0Zm9ybV9ncGlvX2JsaW5rX3NldDsKIH07CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGdwaW9fbGVkX2RhdGEgKgorCQkJY2Rldl90b19ncGlvX2xlZF9kYXRhKHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQoreworCXJldHVybiBjb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCBncGlvX2xlZF9kYXRhLCBjZGV2KTsKK30KKwogc3RhdGljIHZvaWQgZ3Bpb19sZWRfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAogCWVudW0gbGVkX2JyaWdodG5lc3MgdmFsdWUpCiB7Ci0Jc3RydWN0IGdwaW9fbGVkX2RhdGEgKmxlZF9kYXQgPQotCQljb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCBncGlvX2xlZF9kYXRhLCBjZGV2KTsKKwlzdHJ1Y3QgZ3Bpb19sZWRfZGF0YSAqbGVkX2RhdCA9IGNkZXZfdG9fZ3Bpb19sZWRfZGF0YShsZWRfY2Rldik7CiAJaW50IGxldmVsOwogCiAJaWYgKHZhbHVlID09IExFRF9PRkYpCkBAIC02NCw4ICs2OCw3IEBACiBzdGF0aWMgaW50IGdwaW9fYmxpbmtfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAogCXVuc2lnbmVkIGxvbmcgKmRlbGF5X29uLCB1bnNpZ25lZCBsb25nICpkZWxheV9vZmYpCiB7Ci0Jc3RydWN0IGdwaW9fbGVkX2RhdGEgKmxlZF9kYXQgPQotCQljb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCBncGlvX2xlZF9kYXRhLCBjZGV2KTsKKwlzdHJ1Y3QgZ3Bpb19sZWRfZGF0YSAqbGVkX2RhdCA9IGNkZXZfdG9fZ3Bpb19sZWRfZGF0YShsZWRfY2Rldik7CiAKIAlsZWRfZGF0LT5ibGlua2luZyA9IDE7CiAJcmV0dXJuIGxlZF9kYXQtPnBsYXRmb3JtX2dwaW9fYmxpbmtfc2V0KGxlZF9kYXQtPmdwaW9kLCBHUElPX0xFRF9CTElOSywKQEAgLTc0LDggKzc3LDcgQEAKIAogc3RhdGljIGludCBjcmVhdGVfZ3Bpb19sZWQoY29uc3Qgc3RydWN0IGdwaW9fbGVkICp0ZW1wbGF0ZSwKIAlzdHJ1Y3QgZ3Bpb19sZWRfZGF0YSAqbGVkX2RhdCwgc3RydWN0IGRldmljZSAqcGFyZW50LAotCWludCAoKmJsaW5rX3NldCkoc3RydWN0IGdwaW9fZGVzYyAqLCBpbnQsIHVuc2lnbmVkIGxvbmcgKiwKLQkJCSB1bnNpZ25lZCBsb25nICopKQorCWdwaW9fYmxpbmtfc2V0X3QgYmxpbmtfc2V0KQogewogCWludCByZXQsIHN0YXRlOwogCkBAIC0xMjAsMTAgKzEyMiwxMyBAQAogCQlsZWRfZGF0LT5wbGF0Zm9ybV9ncGlvX2JsaW5rX3NldCA9IGJsaW5rX3NldDsKIAkJbGVkX2RhdC0+Y2Rldi5ibGlua19zZXQgPSBncGlvX2JsaW5rX3NldDsKIAl9Ci0JaWYgKHRlbXBsYXRlLT5kZWZhdWx0X3N0YXRlID09IExFRFNfR1BJT19ERUZTVEFURV9LRUVQKQotCQlzdGF0ZSA9ICEhZ3Bpb2RfZ2V0X3ZhbHVlX2NhbnNsZWVwKGxlZF9kYXQtPmdwaW9kKTsKLQllbHNlCisJaWYgKHRlbXBsYXRlLT5kZWZhdWx0X3N0YXRlID09IExFRFNfR1BJT19ERUZTVEFURV9LRUVQKSB7CisJCXN0YXRlID0gZ3Bpb2RfZ2V0X3ZhbHVlX2NhbnNsZWVwKGxlZF9kYXQtPmdwaW9kKTsKKwkJaWYgKHN0YXRlIDwgMCkKKwkJCXJldHVybiBzdGF0ZTsKKwl9IGVsc2UgewogCQlzdGF0ZSA9ICh0ZW1wbGF0ZS0+ZGVmYXVsdF9zdGF0ZSA9PSBMRURTX0dQSU9fREVGU1RBVEVfT04pOworCX0KIAlsZWRfZGF0LT5jZGV2LmJyaWdodG5lc3MgPSBzdGF0ZSA/IExFRF9GVUxMIDogTEVEX09GRjsKIAlpZiAoIXRlbXBsYXRlLT5yZXRhaW5fc3RhdGVfc3VzcGVuZGVkKQogCQlsZWRfZGF0LT5jZGV2LmZsYWdzIHw9IExFRF9DT1JFX1NVU1BFTkRSRVNVTUU7CkBAIC0xMzQsNyArMTM5LDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldHVybiBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIocGFyZW50LCAmbGVkX2RhdC0+Y2Rldik7CisJcmV0dXJuIGRldm1fbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKHBhcmVudCwgJmxlZF9kYXQtPmNkZXYpOwogfQogCiBzdHJ1Y3QgZ3Bpb19sZWRzX3ByaXYgewpAQCAtMTU0LDcgKzE1OSw2IEBACiAJc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmNoaWxkOwogCXN0cnVjdCBncGlvX2xlZHNfcHJpdiAqcHJpdjsKIAlpbnQgY291bnQsIHJldDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCiAJY291bnQgPSBkZXZpY2VfZ2V0X2NoaWxkX25vZGVfY291bnQoZGV2KTsKIAlpZiAoIWNvdW50KQpAQCAtMTY4LDI2ICsxNzIsMjIgQEAKIAkJc3RydWN0IGdwaW9fbGVkX2RhdGEgKmxlZF9kYXQgPSAmcHJpdi0+bGVkc1twcml2LT5udW1fbGVkc107CiAJCXN0cnVjdCBncGlvX2xlZCBsZWQgPSB7fTsKIAkJY29uc3QgY2hhciAqc3RhdGUgPSBOVUxMOworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gdG9fb2Zfbm9kZShjaGlsZCk7CiAKIAkJbGVkLmdwaW9kID0gZGV2bV9nZXRfZ3Bpb2RfZnJvbV9jaGlsZChkZXYsIE5VTEwsIGNoaWxkKTsKIAkJaWYgKElTX0VSUihsZWQuZ3Bpb2QpKSB7CiAJCQlmd25vZGVfaGFuZGxlX3B1dChjaGlsZCk7Ci0JCQlyZXQgPSBQVFJfRVJSKGxlZC5ncGlvZCk7Ci0JCQlnb3RvIGVycjsKKwkJCXJldHVybiBFUlJfQ0FTVChsZWQuZ3Bpb2QpOwogCQl9CiAKLQkJbnAgPSB0b19vZl9ub2RlKGNoaWxkKTsKLQotCQlpZiAoZndub2RlX3Byb3BlcnR5X3ByZXNlbnQoY2hpbGQsICJsYWJlbCIpKSB7Ci0JCQlmd25vZGVfcHJvcGVydHlfcmVhZF9zdHJpbmcoY2hpbGQsICJsYWJlbCIsICZsZWQubmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoSVNfRU5BQkxFRChDT05GSUdfT0YpICYmICFsZWQubmFtZSAmJiBucCkKLQkJCQlsZWQubmFtZSA9IG5wLT5uYW1lOwotCQkJaWYgKCFsZWQubmFtZSkgewotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJZ290byBlcnI7Ci0JCQl9CisJCXJldCA9IGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3N0cmluZyhjaGlsZCwgImxhYmVsIiwgJmxlZC5uYW1lKTsKKwkJaWYgKHJldCAmJiBJU19FTkFCTEVEKENPTkZJR19PRikgJiYgbnApCisJCQlsZWQubmFtZSA9IG5wLT5uYW1lOworCQlpZiAoIWxlZC5uYW1lKSB7CisJCQlmd25vZGVfaGFuZGxlX3B1dChjaGlsZCk7CisJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAkJfQorCiAJCWZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3N0cmluZyhjaGlsZCwgImxpbnV4LGRlZmF1bHQtdHJpZ2dlciIsCiAJCQkJCSAgICAmbGVkLmRlZmF1bHRfdHJpZ2dlcik7CiAKQEAgLTIwOSwxOCArMjA5LDEzIEBACiAJCXJldCA9IGNyZWF0ZV9ncGlvX2xlZCgmbGVkLCBsZWRfZGF0LCBkZXYsIE5VTEwpOwogCQlpZiAocmV0IDwgMCkgewogCQkJZndub2RlX2hhbmRsZV9wdXQoY2hpbGQpOwotCQkJZ290byBlcnI7CisJCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCQl9CiAJCWxlZF9kYXQtPmNkZXYuZGV2LT5vZl9ub2RlID0gbnA7CiAJCXByaXYtPm51bV9sZWRzKys7CiAJfQogCiAJcmV0dXJuIHByaXY7Ci0KLWVycjoKLQlmb3IgKGNvdW50ID0gcHJpdi0+bnVtX2xlZHMgLSAxOyBjb3VudCA+PSAwOyBjb3VudC0tKQotCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmcHJpdi0+bGVkc1tjb3VudF0uY2Rldik7Ci0JcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfZ3Bpb19sZWRzX21hdGNoW10gPSB7CkBAIC0yNDgsMTMgKzI0Myw4IEBACiAJCQlyZXQgPSBjcmVhdGVfZ3Bpb19sZWQoJnBkYXRhLT5sZWRzW2ldLAogCQkJCQkgICAgICAmcHJpdi0+bGVkc1tpXSwKIAkJCQkJICAgICAgJnBkZXYtPmRldiwgcGRhdGEtPmdwaW9fYmxpbmtfc2V0KTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJLyogT24gZmFpbHVyZTogdW53aW5kIHRoZSBsZWQgY3JlYXRpb25zICovCi0JCQkJZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKQotCQkJCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigKLQkJCQkJCQkmcHJpdi0+bGVkc1tpXS5jZGV2KTsKKwkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7Ci0JCQl9CiAJCX0KIAl9IGVsc2UgewogCQlwcml2ID0gZ3Bpb19sZWRzX2NyZWF0ZShwZGV2KTsKQEAgLTI2NywxNyArMjU3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBncGlvX2xlZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZ3Bpb19sZWRzX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBwcml2LT5udW1fbGVkczsgaSsrKQotCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmcHJpdi0+bGVkc1tpXS5jZGV2KTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBncGlvX2xlZF9zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBncGlvX2xlZHNfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwpAQCAtMjkyLDcgKzI3MSw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdwaW9fbGVkX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gZ3Bpb19sZWRfcHJvYmUsCi0JLnJlbW92ZQkJPSBncGlvX2xlZF9yZW1vdmUsCiAJLnNodXRkb3duCT0gZ3Bpb19sZWRfc2h1dGRvd24sCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gImxlZHMtZ3BpbyIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1pczMxZmwzMTl4LmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1pczMxZmwzMTl4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyMzMwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWlzMzFmbDMxOXguYwpAQCAtMCwwICsxLDQ1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1LTE2IEdvbGRlbiBEZWxpY2lvdXMgQ29tcHV0ZXJzCisgKgorICogQXV0aG9yOiBOaWtvbGF1cyBTY2hhbGxlciA8aG5zQGdvbGRlbGljby5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHZlcnNpb24gMiBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4KKyAqIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBMRUQgZHJpdmVyIGZvciB0aGUgSVMzMUZMMzE5ezAsMSwzLDYsOX0gdG8gZHJpdmUgMSwgMywgNiBvciA5IGxpZ2h0CisgKiBlZmZlY3QgTEVEcy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworLyogcmVnaXN0ZXIgbnVtYmVycyAqLworI2RlZmluZSBJUzMxRkwzMTlYX1NIVVRET1dOCQkweDAwCisjZGVmaW5lIElTMzFGTDMxOVhfQ1RSTDEJCTB4MDEKKyNkZWZpbmUgSVMzMUZMMzE5WF9DVFJMMgkJMHgwMgorI2RlZmluZSBJUzMxRkwzMTlYX0NPTkZJRzEJCTB4MDMKKyNkZWZpbmUgSVMzMUZMMzE5WF9DT05GSUcyCQkweDA0CisjZGVmaW5lIElTMzFGTDMxOVhfUkFNUF9NT0RFCQkweDA1CisjZGVmaW5lIElTMzFGTDMxOVhfQlJFQVRIX01BU0sJCTB4MDYKKyNkZWZpbmUgSVMzMUZMMzE5WF9QV00oY2hhbm5lbCkJCSgweDA3ICsgY2hhbm5lbCkKKyNkZWZpbmUgSVMzMUZMMzE5WF9EQVRBX1VQREFURQkJMHgxMAorI2RlZmluZSBJUzMxRkwzMTlYX1QwKGNoYW5uZWwpCQkoMHgxMSArIGNoYW5uZWwpCisjZGVmaW5lIElTMzFGTDMxOVhfVDEyM18xCQkweDFhCisjZGVmaW5lIElTMzFGTDMxOVhfVDEyM18yCQkweDFiCisjZGVmaW5lIElTMzFGTDMxOVhfVDEyM18zCQkweDFjCisjZGVmaW5lIElTMzFGTDMxOVhfVDQoY2hhbm5lbCkJCSgweDFkICsgY2hhbm5lbCkKKyNkZWZpbmUgSVMzMUZMMzE5WF9USU1FX1VQREFURQkJMHgyNgorI2RlZmluZSBJUzMxRkwzMTlYX1JFU0VUCQkweGZmCisKKyNkZWZpbmUgSVMzMUZMMzE5WF9SRUdfQ05UCQkoSVMzMUZMMzE5WF9SRVNFVCArIDEpCisKKyNkZWZpbmUgSVMzMUZMMzE5WF9NQVhfTEVEUwkJOQorCisvKiBDUyAoQ3VycmVudCBTZXR0aW5nKSBpbiBDT05GSUcyIHJlZ2lzdGVyICovCisjZGVmaW5lIElTMzFGTDMxOVhfQ09ORklHMl9DU19TSElGVAk0CisjZGVmaW5lIElTMzFGTDMxOVhfQ09ORklHMl9DU19NQVNLCTB4NworI2RlZmluZSBJUzMxRkwzMTlYX0NPTkZJRzJfQ1NfU1RFUF9SRUYJMTIKKworI2RlZmluZSBJUzMxRkwzMTlYX0NVUlJFTlRfTUlOCQkoKHUzMik1MDAwKQorI2RlZmluZSBJUzMxRkwzMTlYX0NVUlJFTlRfTUFYCQkoKHUzMik0MDAwMCkKKyNkZWZpbmUgSVMzMUZMMzE5WF9DVVJSRU5UX1NURVAJCSgodTMyKTUwMDApCisjZGVmaW5lIElTMzFGTDMxOVhfQ1VSUkVOVF9ERUZBVUxUCSgodTMyKTIwMDAwKQorCisvKiBBdWRpbyBnYWluIGluIENPTkZJRzIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVMzMUZMMzE5WF9BVURJT19HQUlOX0RCX01BWAkoKHUzMikyMSkKKyNkZWZpbmUgSVMzMUZMMzE5WF9BVURJT19HQUlOX0RCX1NURVAJKCh1MzIpMykKKworLyoKKyAqIHJlZ21hcCBpcyB1c2VkIGFzIGEgY2FjaGUgb2YgY2hpcCdzIHJlZ2lzdGVyIHNwYWNlLAorICogdG8gYXZvaWQgcmVhZGluZyBiYWNrIGJyaWdodG5lc3MgdmFsdWVzIGZyb20gY2hpcCwKKyAqIHdoaWNoIGlzIGtub3duIHRvIGhhbmcuCisgKi8KK3N0cnVjdCBpczMxZmwzMTl4X2NoaXAgeworCWNvbnN0IHN0cnVjdCBpczMxZmwzMTl4X2NoaXBkZWYgKmNkZWY7CisJc3RydWN0IGkyY19jbGllbnQgICAgICAgICAgICAgICAqY2xpZW50OworCXN0cnVjdCByZWdtYXAgICAgICAgICAgICAgICAgICAgKnJlZ21hcDsKKwlzdHJ1Y3QgbXV0ZXggICAgICAgICAgICAgICAgICAgIGxvY2s7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19nYWluX2RiOworCisJc3RydWN0IGlzMzFmbDMxOXhfbGVkIHsKKwkJc3RydWN0IGlzMzFmbDMxOXhfY2hpcCAgKmNoaXA7CisJCXN0cnVjdCBsZWRfY2xhc3NkZXYgICAgIGNkZXY7CisJCXUzMiAgICAgICAgICAgICAgICAgICAgIG1heF9taWNyb2FtcDsKKwkJYm9vbCAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZDsKKwl9IGxlZHNbSVMzMUZMMzE5WF9NQVhfTEVEU107Cit9OworCitzdHJ1Y3QgaXMzMWZsMzE5eF9jaGlwZGVmIHsKKwlpbnQgbnVtX2xlZHM7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlzMzFmbDMxOXhfY2hpcGRlZiBpczMxZmwzMTkwX2NkZWYgPSB7CisJLm51bV9sZWRzID0gMSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXMzMWZsMzE5eF9jaGlwZGVmIGlzMzFmbDMxOTNfY2RlZiA9IHsKKwkubnVtX2xlZHMgPSAzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpczMxZmwzMTl4X2NoaXBkZWYgaXMzMWZsMzE5Nl9jZGVmID0geworCS5udW1fbGVkcyA9IDYsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlzMzFmbDMxOXhfY2hpcGRlZiBpczMxZmwzMTk5X2NkZWYgPSB7CisJLm51bV9sZWRzID0gOSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2lzMzFmbDMxOXhfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImlzc2ksaXMzMWZsMzE5MCIsIC5kYXRhID0gJmlzMzFmbDMxOTBfY2RlZiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImlzc2ksaXMzMWZsMzE5MSIsIC5kYXRhID0gJmlzMzFmbDMxOTBfY2RlZiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImlzc2ksaXMzMWZsMzE5MyIsIC5kYXRhID0gJmlzMzFmbDMxOTNfY2RlZiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImlzc2ksaXMzMWZsMzE5NiIsIC5kYXRhID0gJmlzMzFmbDMxOTZfY2RlZiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImlzc2ksaXMzMWZsMzE5OSIsIC5kYXRhID0gJmlzMzFmbDMxOTlfY2RlZiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInNpLWVuLHNuMzE5OSIsICAgIC5kYXRhID0gJmlzMzFmbDMxOTlfY2RlZiwgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9pczMxZmwzMTl4X21hdGNoKTsKKworc3RhdGljIGludCBpczMxZmwzMTl4X2JyaWdodG5lc3Nfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXYsCisJCQkJICAgICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCit7CisJc3RydWN0IGlzMzFmbDMxOXhfbGVkICpsZWQgPSBjb250YWluZXJfb2YoY2Rldiwgc3RydWN0IGlzMzFmbDMxOXhfbGVkLAorCQkJCQkJICBjZGV2KTsKKwlzdHJ1Y3QgaXMzMWZsMzE5eF9jaGlwICppczMxID0gbGVkLT5jaGlwOworCWludCBjaGFuID0gbGVkIC0gaXMzMS0+bGVkczsKKwlpbnQgcmV0OworCWludCBpOworCXU4IGN0cmwxID0gMCwgY3RybDIgPSAwOworCisJZGV2X2RiZygmaXMzMS0+Y2xpZW50LT5kZXYsICIlcyAlZDogJWRcbiIsIF9fZnVuY19fLCBjaGFuLCBicmlnaHRuZXNzKTsKKworCW11dGV4X2xvY2soJmlzMzEtPmxvY2spOworCisJLyogdXBkYXRlIFBXTSByZWdpc3RlciAqLworCXJldCA9IHJlZ21hcF93cml0ZShpczMxLT5yZWdtYXAsIElTMzFGTDMxOVhfUFdNKGNoYW4pLCBicmlnaHRuZXNzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiByZWFkIGN1cnJlbnQgYnJpZ2h0bmVzcyBvZiBhbGwgUFdNIGNoYW5uZWxzICovCisJZm9yIChpID0gMDsgaSA8IGlzMzEtPmNkZWYtPm51bV9sZWRzOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IHB3bV92YWx1ZTsKKwkJYm9vbCBvbjsKKworCQkvKgorCQkgKiBzaW5jZSBuZWl0aGVyIGNkZXYgbm9yIHRoZSBjaGlwIGNhbiBwcm92aWRlCisJCSAqIHRoZSBjdXJyZW50IHNldHRpbmcsIHdlIHJlYWQgZnJvbSB0aGUgcmVnbWFwIGNhY2hlCisJCSAqLworCisJCXJldCA9IHJlZ21hcF9yZWFkKGlzMzEtPnJlZ21hcCwgSVMzMUZMMzE5WF9QV00oaSksICZwd21fdmFsdWUpOworCQlkZXZfZGJnKCZpczMxLT5jbGllbnQtPmRldiwgIiVzIHJlYWQgJWQ6IHJldD0lZDogJWRcbiIsCisJCQlfX2Z1bmNfXywgaSwgcmV0LCBwd21fdmFsdWUpOworCQlvbiA9IHJldCA+PSAwICYmIHB3bV92YWx1ZSA+IExFRF9PRkY7CisKKwkJaWYgKGkgPCAzKQorCQkJY3RybDEgfD0gb24gPDwgaTsgICAgICAgLyogMC4uMiA9PiBiaXQgMC4uMiAqLworCQllbHNlIGlmIChpIDwgNikKKwkJCWN0cmwxIHw9IG9uIDw8IChpICsgMSk7IC8qIDMuLjUgPT4gYml0IDQuLjYgKi8KKwkJZWxzZQorCQkJY3RybDIgfD0gb24gPDwgKGkgLSA2KTsgLyogNi4uOCA9PiBiaXQgMC4uMiAqLworCX0KKworCWlmIChjdHJsMSA+IDAgfHwgY3RybDIgPiAwKSB7CisJCWRldl9kYmcoJmlzMzEtPmNsaWVudC0+ZGV2LCAicG93ZXIgdXAgJTAyeCAlMDJ4XG4iLAorCQkJY3RybDEsIGN0cmwyKTsKKwkJcmVnbWFwX3dyaXRlKGlzMzEtPnJlZ21hcCwgSVMzMUZMMzE5WF9DVFJMMSwgY3RybDEpOworCQlyZWdtYXBfd3JpdGUoaXMzMS0+cmVnbWFwLCBJUzMxRkwzMTlYX0NUUkwyLCBjdHJsMik7CisJCS8qIHVwZGF0ZSBQV01zICovCisJCXJlZ21hcF93cml0ZShpczMxLT5yZWdtYXAsIElTMzFGTDMxOVhfREFUQV9VUERBVEUsIDB4MDApOworCQkvKiBlbmFibGUgY2hpcCBmcm9tIHNodXQgZG93biAqLworCQlyZXQgPSByZWdtYXBfd3JpdGUoaXMzMS0+cmVnbWFwLCBJUzMxRkwzMTlYX1NIVVRET1dOLCAweDAxKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZpczMxLT5jbGllbnQtPmRldiwgInBvd2VyIGRvd25cbiIpOworCQkvKiBzaHV0IGRvd24gKG5vIG5lZWQgdG8gY2xlYXIgQ1RSTDEvMikgKi8KKwkJcmV0ID0gcmVnbWFwX3dyaXRlKGlzMzEtPnJlZ21hcCwgSVMzMUZMMzE5WF9TSFVURE9XTiwgMHgwMCk7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpczMxLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXMzMWZsMzE5eF9wYXJzZV9jaGlsZF9kdChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkLAorCQkJCSAgICAgc3RydWN0IGlzMzFmbDMxOXhfbGVkICpsZWQpCit7CisJc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiA9ICZsZWQtPmNkZXY7CisJaW50IHJldDsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhjaGlsZCwgImxhYmVsIiwgJmNkZXYtPm5hbWUpKQorCQljZGV2LT5uYW1lID0gY2hpbGQtPm5hbWU7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhjaGlsZCwgImxpbnV4LGRlZmF1bHQtdHJpZ2dlciIsCisJCQkJICAgICAgJmNkZXYtPmRlZmF1bHRfdHJpZ2dlcik7CisJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FSU5WQUwpIC8qIGlzIG9wdGlvbmFsICovCisJCXJldHVybiByZXQ7CisKKwlsZWQtPm1heF9taWNyb2FtcCA9IElTMzFGTDMxOVhfQ1VSUkVOVF9ERUZBVUxUOworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNoaWxkLCAibGVkLW1heC1taWNyb2FtcCIsCisJCQkJICAgJmxlZC0+bWF4X21pY3JvYW1wKTsKKwlpZiAoIXJldCkgeworCQlpZiAobGVkLT5tYXhfbWljcm9hbXAgPCBJUzMxRkwzMTlYX0NVUlJFTlRfTUlOKQorCQkJcmV0dXJuIC1FSU5WQUw7CS8qIG5vdCBzdXBwb3J0ZWQgKi8KKwkJbGVkLT5tYXhfbWljcm9hbXAgPSBtaW4obGVkLT5tYXhfbWljcm9hbXAsCisJCQkJCSAgSVMzMUZMMzE5WF9DVVJSRU5UX01BWCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXMzMWZsMzE5eF9wYXJzZV9kdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGlzMzFmbDMxOXhfY2hpcCAqaXMzMSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlLCAqY2hpbGQ7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfZGV2X2lkOworCWludCBjb3VudDsKKwlpbnQgcmV0OworCisJaWYgKCFucCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvZl9kZXZfaWQgPSBvZl9tYXRjaF9kZXZpY2Uob2ZfaXMzMWZsMzE5eF9tYXRjaCwgZGV2KTsKKwlpZiAoIW9mX2Rldl9pZCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBtYXRjaCBkZXZpY2Ugd2l0aCBzdXBwb3J0ZWQgY2hpcHNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpczMxLT5jZGVmID0gb2ZfZGV2X2lkLT5kYXRhOworCisJY291bnQgPSBvZl9nZXRfY2hpbGRfY291bnQobnApOworCisJZGV2X2RiZyhkZXYsICJwcm9iZSAlcyB3aXRoICVkIGxlZHMgZGVmaW5lZCBpbiBEVFxuIiwKKwkJb2ZfZGV2X2lkLT5jb21wYXRpYmxlLCBjb3VudCk7CisKKwlpZiAoIWNvdW50IHx8IGNvdW50ID4gaXMzMS0+Y2RlZi0+bnVtX2xlZHMpIHsKKwkJZGV2X2VycihkZXYsICJOdW1iZXIgb2YgbGVkcyBkZWZpbmVkIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAldVxuIiwKKwkJCWlzMzEtPmNkZWYtPm51bV9sZWRzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShucCwgY2hpbGQpIHsKKwkJc3RydWN0IGlzMzFmbDMxOXhfbGVkICpsZWQ7CisJCXUzMiByZWc7CisKKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoY2hpbGQsICJyZWciLCAmcmVnKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVhZCBsZWQgJ3JlZycgcHJvcGVydHlcbiIpOworCQkJZ290byBwdXRfY2hpbGRfbm9kZTsKKwkJfQorCisJCWlmIChyZWcgPCAxIHx8IHJlZyA+IGlzMzEtPmNkZWYtPm51bV9sZWRzKSB7CisJCQlkZXZfZXJyKGRldiwgImludmFsaWQgbGVkIHJlZyAldVxuIiwgcmVnKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIHB1dF9jaGlsZF9ub2RlOworCQl9CisKKwkJbGVkID0gJmlzMzEtPmxlZHNbcmVnIC0gMV07CisKKwkJaWYgKGxlZC0+Y29uZmlndXJlZCkgeworCQkJZGV2X2VycihkZXYsICJsZWQgJXUgaXMgYWxyZWFkeSBjb25maWd1cmVkXG4iLCByZWcpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gcHV0X2NoaWxkX25vZGU7CisJCX0KKworCQlyZXQgPSBpczMxZmwzMTl4X3BhcnNlX2NoaWxkX2R0KGRldiwgY2hpbGQsIGxlZCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LCAibGVkICV1IERUIHBhcnNpbmcgZmFpbGVkXG4iLCByZWcpOworCQkJZ290byBwdXRfY2hpbGRfbm9kZTsKKwkJfQorCisJCWxlZC0+Y29uZmlndXJlZCA9IHRydWU7CisJfQorCisJaXMzMS0+YXVkaW9fZ2Fpbl9kYiA9IDA7CisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJhdWRpby1nYWluLWRiIiwgJmlzMzEtPmF1ZGlvX2dhaW5fZGIpOworCWlmICghcmV0KQorCQlpczMxLT5hdWRpb19nYWluX2RiID0gbWluKGlzMzEtPmF1ZGlvX2dhaW5fZGIsCisJCQkJCSAgSVMzMUZMMzE5WF9BVURJT19HQUlOX0RCX01BWCk7CisKKwlyZXR1cm4gMDsKKworcHV0X2NoaWxkX25vZGU6CisJb2Zfbm9kZV9wdXQoY2hpbGQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBib29sIGlzMzFmbDMxOXhfcmVhZGFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sgLyogd2UgaGF2ZSBubyByZWFkYWJsZSByZWdpc3RlcnMgKi8KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGlzMzFmbDMxOXhfdm9sYXRpbGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sgLyogdm9sYXRpbGUgcmVnaXN0ZXJzIGFyZSBub3QgY2FjaGVkICovCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIElTMzFGTDMxOVhfREFUQV9VUERBVEU6CisJY2FzZSBJUzMxRkwzMTlYX1RJTUVfVVBEQVRFOgorCWNhc2UgSVMzMUZMMzE5WF9SRVNFVDoKKwkJcmV0dXJuIHRydWU7IC8qIGFsd2F5cyB3cml0ZS10aHJvdWdoICovCisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCBpczMxZmwzMTl4X3JlZ19kZWZhdWx0c1tdID0geworCXsgSVMzMUZMMzE5WF9DT05GSUcxLCAweDAwfSwKKwl7IElTMzFGTDMxOVhfQ09ORklHMiwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSgwKSwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSgxKSwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSgyKSwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSgzKSwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSg0KSwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSg1KSwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSg2KSwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSg3KSwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSg4KSwgMHgwMH0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisJLm1heF9yZWdpc3RlciA9IElTMzFGTDMxOVhfUkVHX0NOVCwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCisJLnJlYWRhYmxlX3JlZyA9IGlzMzFmbDMxOXhfcmVhZGFibGVfcmVnLAorCS52b2xhdGlsZV9yZWcgPSBpczMxZmwzMTl4X3ZvbGF0aWxlX3JlZywKKwkucmVnX2RlZmF1bHRzID0gaXMzMWZsMzE5eF9yZWdfZGVmYXVsdHMsCisJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKGlzMzFmbDMxOXhfcmVnX2RlZmF1bHRzKSwKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzMzFmbDMxOXhfbWljcm9hbXBfdG9fY3Moc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbWljcm9hbXApCit7IC8qIHJvdW5kIGRvd24gdG8gbmVhcmVzdCBzdXBwb3J0ZWQgdmFsdWUgKHJhbmdlIGNoZWNrIGRvbmUgYnkgY2FsbGVyKSAqLworCXUzMiBzdGVwID0gbWljcm9hbXAgLyBJUzMxRkwzMTlYX0NVUlJFTlRfU1RFUDsKKworCXJldHVybiAoKElTMzFGTDMxOVhfQ09ORklHMl9DU19TVEVQX1JFRiAtIHN0ZXApICYKKwkJSVMzMUZMMzE5WF9DT05GSUcyX0NTX01BU0spIDw8CisJCUlTMzFGTDMxOVhfQ09ORklHMl9DU19TSElGVDsgLyogQ1MgZW5jb2RpbmcgKi8KK30KKworc3RhdGljIGlubGluZSBpbnQgaXMzMWZsMzE5eF9kYl90b19nYWluKHUzMiBkZXppYmVsKQoreyAvKiByb3VuZCBkb3duIHRvIG5lYXJlc3Qgc3VwcG9ydGVkIHZhbHVlIChyYW5nZSBjaGVjayBkb25lIGJ5IGNhbGxlcikgKi8KKwlyZXR1cm4gZGV6aWJlbCAvIElTMzFGTDMxOVhfQVVESU9fR0FJTl9EQl9TVEVQOworfQorCitzdGF0aWMgaW50IGlzMzFmbDMxOXhfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGlzMzFmbDMxOXhfY2hpcCAqaXMzMTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoZGV2LT5wYXJlbnQpOworCWludCBlcnI7CisJaW50IGkgPSAwOworCXUzMiBhZ2dyZWdhdGVkX2xlZF9taWNyb2FtcCA9IElTMzFGTDMxOVhfQ1VSUkVOVF9NQVg7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpCisJCXJldHVybiAtRUlPOworCisJaXMzMSA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqaXMzMSksIEdGUF9LRVJORUwpOworCWlmICghaXMzMSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9pbml0KCZpczMxLT5sb2NrKTsKKworCWVyciA9IGlzMzFmbDMxOXhfcGFyc2VfZHQoJmNsaWVudC0+ZGV2LCBpczMxKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZyZWVfbXV0ZXg7CisKKwlpczMxLT5jbGllbnQgPSBjbGllbnQ7CisJaXMzMS0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihpczMxLT5yZWdtYXApKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHJlZ2lzdGVyIG1hcFxuIik7CisJCWVyciA9IFBUUl9FUlIoaXMzMS0+cmVnbWFwKTsKKwkJZ290byBmcmVlX211dGV4OworCX0KKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGlzMzEpOworCisJLyogY2hlY2sgZm9yIHdyaXRlLXJlcGx5IGZyb20gY2hpcCAod2UgY2FuJ3QgcmVhZCBhbnkgcmVnaXN0ZXJzKSAqLworCWVyciA9IHJlZ21hcF93cml0ZShpczMxLT5yZWdtYXAsIElTMzFGTDMxOVhfUkVTRVQsIDB4MDApOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAibm8gcmVzcG9uc2UgZnJvbSBjaGlwIHdyaXRlOiBlcnIgPSAlZFxuIiwKKwkJCWVycik7CisJCWVyciA9IC1FSU87IC8qIGRvZXMgbm90IGFuc3dlciAqLworCQlnb3RvIGZyZWVfbXV0ZXg7CisJfQorCisJLyoKKwkgKiBLZXJuZWwgY29udmVudGlvbnMgcmVxdWlyZSBwZXItTEVEIGxlZC1tYXgtbWljcm9hbXAgcHJvcGVydHkuCisJICogQnV0IHRoZSBjaGlwIGRvZXMgbm90IGFsbG93IHRvIGxpbWl0IGluZGl2aWR1YWwgTEVEcy4KKwkgKiBTbyB3ZSB0YWtlIG1pbmltdW0gZnJvbSBhbGwgc3Vibm9kZXMgZm9yIHNhZmV0eSBvZiBoYXJkd2FyZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaXMzMS0+Y2RlZi0+bnVtX2xlZHM7IGkrKykKKwkJaWYgKGlzMzEtPmxlZHNbaV0uY29uZmlndXJlZCAmJgorCQkgICAgaXMzMS0+bGVkc1tpXS5tYXhfbWljcm9hbXAgPCBhZ2dyZWdhdGVkX2xlZF9taWNyb2FtcCkKKwkJCWFnZ3JlZ2F0ZWRfbGVkX21pY3JvYW1wID0gaXMzMS0+bGVkc1tpXS5tYXhfbWljcm9hbXA7CisKKwlyZWdtYXBfd3JpdGUoaXMzMS0+cmVnbWFwLCBJUzMxRkwzMTlYX0NPTkZJRzIsCisJCSAgICAgaXMzMWZsMzE5eF9taWNyb2FtcF90b19jcyhkZXYsIGFnZ3JlZ2F0ZWRfbGVkX21pY3JvYW1wKSB8CisJCSAgICAgaXMzMWZsMzE5eF9kYl90b19nYWluKGlzMzEtPmF1ZGlvX2dhaW5fZGIpKTsKKworCWZvciAoaSA9IDA7IGkgPCBpczMxLT5jZGVmLT5udW1fbGVkczsgaSsrKSB7CisJCXN0cnVjdCBpczMxZmwzMTl4X2xlZCAqbGVkID0gJmlzMzEtPmxlZHNbaV07CisKKwkJaWYgKCFsZWQtPmNvbmZpZ3VyZWQpCisJCQljb250aW51ZTsKKworCQlsZWQtPmNoaXAgPSBpczMxOworCQlsZWQtPmNkZXYuYnJpZ2h0bmVzc19zZXRfYmxvY2tpbmcgPSBpczMxZmwzMTl4X2JyaWdodG5lc3Nfc2V0OworCisJCWVyciA9IGRldm1fbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmxlZC0+Y2Rldik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBmcmVlX211dGV4OworCX0KKworCXJldHVybiAwOworCitmcmVlX211dGV4OgorCW11dGV4X2Rlc3Ryb3koJmlzMzEtPmxvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaXMzMWZsMzE5eF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgaXMzMWZsMzE5eF9jaGlwICppczMxID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwltdXRleF9kZXN0cm95KCZpczMxLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGkyYy1jb3JlIChhbmQgbW9kYWxpYXMpIHJlcXVpcmVzIHRoYXQgaWRfdGFibGUgYmUgcHJvcGVybHkgZmlsbGVkLAorICogZXZlbiB0aG91Z2ggaXQgaXMgbm90IHVzZWQgZm9yIERldmljZVRyZWUgYmFzZWQgaW5zdGFudGlhdGlvbi4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGlzMzFmbDMxOXhfaWRbXSA9IHsKKwl7ICJpczMxZmwzMTkwIiB9LAorCXsgImlzMzFmbDMxOTEiIH0sCisJeyAiaXMzMWZsMzE5MyIgfSwKKwl7ICJpczMxZmwzMTk2IiB9LAorCXsgImlzMzFmbDMxOTkiIH0sCisJeyAic24zMTk5IiB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBpczMxZmwzMTl4X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGlzMzFmbDMxOXhfZHJpdmVyID0geworCS5kcml2ZXIgICA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gImxlZHMtaXMzMWZsMzE5eCIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihvZl9pczMxZmwzMTl4X21hdGNoKSwKKwl9LAorCS5wcm9iZSAgICA9IGlzMzFmbDMxOXhfcHJvYmUsCisJLnJlbW92ZSAgID0gaXMzMWZsMzE5eF9yZW1vdmUsCisJLmlkX3RhYmxlID0gaXMzMWZsMzE5eF9pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKGlzMzFmbDMxOXhfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSC4gTmlrb2xhdXMgU2NoYWxsZXIgPGhuc0Bnb2xkZWxpY28uY29tPiIpOworTU9EVUxFX0FVVEhPUigiQW5kcmV5IFV0a2luIDxhbmRyZXlfdXRraW5AZmFzdG1haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUzMxRkwzMTlYIExFRCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLW1seGNwbGQuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLW1seGNwbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTdhYjliCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtbWx4Y3BsZC5jCkBAIC0wLDAgKzEsNDMwIEBACisvKgorICogZHJpdmVycy9sZWRzL2xlZHMtbWx4Y3BsZC5jCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTWVsbGFub3ggVGVjaG5vbG9naWVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDE2IFZhZGltIFBhc3Rlcm5hayA8dmFkaW1wQG1lbGxhbm94LmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIE1MWFBMQVRfQ1BMRF9MUENfUkVHX0JBU0VfQURSUiAgICAgMHgyNTAwIC8qIExQQyBidXMgYWNjZXNzICovCisKKy8qIENvbG9yIGNvZGVzIGZvciBMRURzICovCisjZGVmaW5lIE1MWENQTERfTEVEX09GRlNFVF9IQUxGCQkweDAxIC8qIE9mZnNldCBmcm9tIHNvbGlkOiAzSHogYmxpbmsgKi8KKyNkZWZpbmUgTUxYQ1BMRF9MRURfT0ZGU0VUX0ZVTEwJCTB4MDIgLyogT2Zmc2V0IGZyb20gc29saWQ6IDZIeiBibGluayAqLworI2RlZmluZSBNTFhDUExEX0xFRF9JU19PRkYJCTB4MDAgLyogT2ZmICovCisjZGVmaW5lIE1MWENQTERfTEVEX1JFRF9TVEFUSUNfT04JMHgwNSAvKiBTb2xpZCByZWQgKi8KKyNkZWZpbmUgTUxYQ1BMRF9MRURfUkVEX0JMSU5LX0hBTEYJKE1MWENQTERfTEVEX1JFRF9TVEFUSUNfT04gKyBcCisJCQkJCSBNTFhDUExEX0xFRF9PRkZTRVRfSEFMRikKKyNkZWZpbmUgTUxYQ1BMRF9MRURfUkVEX0JMSU5LX0ZVTEwJKE1MWENQTERfTEVEX1JFRF9TVEFUSUNfT04gKyBcCisJCQkJCSBNTFhDUExEX0xFRF9PRkZTRVRfRlVMTCkKKyNkZWZpbmUgTUxYQ1BMRF9MRURfR1JFRU5fU1RBVElDX09OCTB4MEQgLyogU29saWQgZ3JlZW4gKi8KKyNkZWZpbmUgTUxYQ1BMRF9MRURfR1JFRU5fQkxJTktfSEFMRgkoTUxYQ1BMRF9MRURfR1JFRU5fU1RBVElDX09OICsgXAorCQkJCQkgTUxYQ1BMRF9MRURfT0ZGU0VUX0hBTEYpCisjZGVmaW5lIE1MWENQTERfTEVEX0dSRUVOX0JMSU5LX0ZVTEwJKE1MWENQTERfTEVEX0dSRUVOX1NUQVRJQ19PTiArIFwKKwkJCQkJIE1MWENQTERfTEVEX09GRlNFVF9GVUxMKQorI2RlZmluZSBNTFhDUExEX0xFRF9CTElOS18zSFoJCTE2NyAvKiB+MTY3IG1zZWMgb2ZmL29uICovCisjZGVmaW5lIE1MWENQTERfTEVEX0JMSU5LXzZIWgkJODMgLyogfjgzIG1zZWMgb2ZmL29uICovCisKKy8qKgorICogbWx4Y3BsZF9wYXJhbSAtIExFRCBhY2Nlc3MgcGFyYW1ldGVyczoKKyAqIEBvZmZzZXQgLSBvZmZzZXQgZm9yIExFRCBhY2Nlc3MgaW4gQ1BMRCBkZXZpY2UKKyAqIEBtYXNrIC0gbWFzayBmb3IgTEVEIGFjY2VzcyBpbiBDUExEIGRldmljZQorICogQGJhc2VfY29sb3IgLSBiYXNlIGNvbG9yIGNvZGUgZm9yIExFRAorKiovCitzdHJ1Y3QgbWx4Y3BsZF9wYXJhbSB7CisJdTggb2Zmc2V0OworCXU4IG1hc2s7CisJdTggYmFzZV9jb2xvcjsKK307CisKKy8qKgorICogbWx4Y3BsZF9sZWRfcHJpdiAtIExFRCBwcml2YXRlIGRhdGE6CisgKiBAY2xlZCAtIExFRCBjbGFzcyBkZXZpY2UgaW5zdGFuY2UKKyAqIEBwYXJhbSAtIExFRCBDUExEIGFjY2VzcyBwYXJhbWV0ZXJzCisqKi8KK3N0cnVjdCBtbHhjcGxkX2xlZF9wcml2IHsKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2IGNkZXY7CisJc3RydWN0IG1seGNwbGRfcGFyYW0gcGFyYW07Cit9OworCisjZGVmaW5lIGNkZXZfdG9fcHJpdihjKQkJY29udGFpbmVyX29mKGMsIHN0cnVjdCBtbHhjcGxkX2xlZF9wcml2LCBjZGV2KQorCisvKioKKyAqIG1seGNwbGRfbGVkX3Byb2ZpbGUgLSBzeXN0ZW0gTEVEIHByb2ZpbGUgKGRlZmluZWQgcGVyIHN5c3RlbSBjbGFzcyk6CisgKiBAb2Zmc2V0IC0gb2Zmc2V0IGZvciBMRUQgYWNjZXNzIGluIENQTEQgZGV2aWNlCisgKiBAbWFzayAtIG1hc2sgZm9yIExFRCBhY2Nlc3MgaW4gQ1BMRCBkZXZpY2UKKyAqIEBiYXNlX2NvbG9yIC0gYmFzZSBjb2xvciBjb2RlCisgKiBAYnJpZ2h0bmVzcyAtIGRlZmF1bHQgYnJpZ2h0bmVzcyBzZXR0aW5nIChvbi9vZmYpCisgKiBAbmFtZSAtIExFRCBuYW1lCisqKi8KK3N0cnVjdCBtbHhjcGxkX2xlZF9wcm9maWxlIHsKKwl1OCBvZmZzZXQ7CisJdTggbWFzazsKKwl1OCBiYXNlX2NvbG9yOworCWVudW0gbGVkX2JyaWdodG5lc3MgYnJpZ2h0bmVzczsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworLyoqCisgKiBtbHhjcGxkX2xlZF9wZGF0YSAtIHN5c3RlbSBMRUQgcHJpdmF0ZSBkYXRhCisgKiBAcGRldiAtIHBsYXRmb3JtIGRldmljZSBwb2ludGVyCisgKiBAcGxlZCAtIExFRCBjbGFzcyBkZXZpY2UgaW5zdGFuY2UKKyAqIEBwcm9maWxlIC0gc3lzdGVtIGNvbmZpZ3VyYXRpb24gcHJvZmlsZQorICogQG51bV9sZWRfaW5zdGFuY2VzIC0gbnVtYmVyIG9mIExFRCBpbnN0YW5jZXMKKyAqIEBsb2NrIC0gZGV2aWNlIGFjY2VzcyBsb2NrCisqKi8KK3N0cnVjdCBtbHhjcGxkX2xlZF9wZGF0YSB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgbWx4Y3BsZF9sZWRfcHJpdiAqcGxlZDsKKwlzdHJ1Y3QgbWx4Y3BsZF9sZWRfcHJvZmlsZSAqcHJvZmlsZTsKKwlpbnQgbnVtX2xlZF9pbnN0YW5jZXM7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworc3RhdGljIHN0cnVjdCBtbHhjcGxkX2xlZF9wZGF0YSAqbWx4Y3BsZF9sZWQ7CisKKy8qIERlZmF1bHQgcHJvZmlsZSBmaXQgdGhlIG5leHQgTWVsbGFub3ggc3lzdGVtczoKKyAqICJtc3g2NzEwIiwgIm1zeDY3MjAiLCAibXNiNzcwMCIsICJtc24yNzAwIiwgIm1zeDE0MTAiLAorICogIm1zbjI0MTAiLCAibXNiNzgwMCIsICJtc24yNzQwIgorICovCitzdGF0aWMgc3RydWN0IG1seGNwbGRfbGVkX3Byb2ZpbGUgbWx4Y3BsZF9sZWRfZGVmYXVsdF9wcm9maWxlW10gPSB7CisJeworCQkweDIxLCAweGYwLCBNTFhDUExEX0xFRF9HUkVFTl9TVEFUSUNfT04sIDEsCisJCSJtbHhjcGxkOmZhbjE6Z3JlZW4iLAorCX0sCisJeworCQkweDIxLCAweGYwLCBNTFhDUExEX0xFRF9SRURfU1RBVElDX09OLCBMRURfT0ZGLAorCQkibWx4Y3BsZDpmYW4xOnJlZCIsCisJfSwKKwl7CisJCTB4MjEsIDB4MGYsIE1MWENQTERfTEVEX0dSRUVOX1NUQVRJQ19PTiwgMSwKKwkJIm1seGNwbGQ6ZmFuMjpncmVlbiIsCisJfSwKKwl7CisJCTB4MjEsIDB4MGYsIE1MWENQTERfTEVEX1JFRF9TVEFUSUNfT04sIExFRF9PRkYsCisJCSJtbHhjcGxkOmZhbjI6cmVkIiwKKwl9LAorCXsKKwkJMHgyMiwgMHhmMCwgTUxYQ1BMRF9MRURfR1JFRU5fU1RBVElDX09OLCAxLAorCQkibWx4Y3BsZDpmYW4zOmdyZWVuIiwKKwl9LAorCXsKKwkJMHgyMiwgMHhmMCwgTUxYQ1BMRF9MRURfUkVEX1NUQVRJQ19PTiwgTEVEX09GRiwKKwkJIm1seGNwbGQ6ZmFuMzpyZWQiLAorCX0sCisJeworCQkweDIyLCAweDBmLCBNTFhDUExEX0xFRF9HUkVFTl9TVEFUSUNfT04sIDEsCisJCSJtbHhjcGxkOmZhbjQ6Z3JlZW4iLAorCX0sCisJeworCQkweDIyLCAweDBmLCBNTFhDUExEX0xFRF9SRURfU1RBVElDX09OLCBMRURfT0ZGLAorCQkibWx4Y3BsZDpmYW40OnJlZCIsCisJfSwKKwl7CisJCTB4MjAsIDB4MGYsIE1MWENQTERfTEVEX0dSRUVOX1NUQVRJQ19PTiwgMSwKKwkJIm1seGNwbGQ6cHN1OmdyZWVuIiwKKwl9LAorCXsKKwkJMHgyMCwgMHgwZiwgTUxYQ1BMRF9MRURfUkVEX1NUQVRJQ19PTiwgTEVEX09GRiwKKwkJIm1seGNwbGQ6cHN1OnJlZCIsCisJfSwKKwl7CisJCTB4MjAsIDB4ZjAsIE1MWENQTERfTEVEX0dSRUVOX1NUQVRJQ19PTiwgMSwKKwkJIm1seGNwbGQ6c3RhdHVzOmdyZWVuIiwKKwl9LAorCXsKKwkJMHgyMCwgMHhmMCwgTUxYQ1BMRF9MRURfUkVEX1NUQVRJQ19PTiwgTEVEX09GRiwKKwkJIm1seGNwbGQ6c3RhdHVzOnJlZCIsCisJfSwKK307CisKKy8qIFByb2ZpbGUgZml0IHRoZSBNZWxsYW5veCBzeXN0ZW1zIGJhc2VkIG9uICJtc24yMTAwIiAqLworc3RhdGljIHN0cnVjdCBtbHhjcGxkX2xlZF9wcm9maWxlIG1seGNwbGRfbGVkX21zbjIxMDBfcHJvZmlsZVtdID0geworCXsKKwkJMHgyMSwgMHhmMCwgTUxYQ1BMRF9MRURfR1JFRU5fU1RBVElDX09OLCAxLAorCQkibWx4Y3BsZDpmYW46Z3JlZW4iLAorCX0sCisJeworCQkweDIxLCAweGYwLCBNTFhDUExEX0xFRF9SRURfU1RBVElDX09OLCBMRURfT0ZGLAorCQkibWx4Y3BsZDpmYW46cmVkIiwKKwl9LAorCXsKKwkJMHgyMywgMHhmMCwgTUxYQ1BMRF9MRURfR1JFRU5fU1RBVElDX09OLCAxLAorCQkibWx4Y3BsZDpwc3UxOmdyZWVuIiwKKwl9LAorCXsKKwkJMHgyMywgMHhmMCwgTUxYQ1BMRF9MRURfUkVEX1NUQVRJQ19PTiwgTEVEX09GRiwKKwkJIm1seGNwbGQ6cHN1MTpyZWQiLAorCX0sCisJeworCQkweDIzLCAweDBmLCBNTFhDUExEX0xFRF9HUkVFTl9TVEFUSUNfT04sIDEsCisJCSJtbHhjcGxkOnBzdTI6Z3JlZW4iLAorCX0sCisJeworCQkweDIzLCAweDBmLCBNTFhDUExEX0xFRF9SRURfU1RBVElDX09OLCBMRURfT0ZGLAorCQkibWx4Y3BsZDpwc3UyOnJlZCIsCisJfSwKKwl7CisJCTB4MjAsIDB4ZjAsIE1MWENQTERfTEVEX0dSRUVOX1NUQVRJQ19PTiwgMSwKKwkJIm1seGNwbGQ6c3RhdHVzOmdyZWVuIiwKKwl9LAorCXsKKwkJMHgyMCwgMHhmMCwgTUxYQ1BMRF9MRURfUkVEX1NUQVRJQ19PTiwgTEVEX09GRiwKKwkJIm1seGNwbGQ6c3RhdHVzOnJlZCIsCisJfSwKKwl7CisJCTB4MjQsIDB4ZjAsIE1MWENQTERfTEVEX0dSRUVOX1NUQVRJQ19PTiwgTEVEX09GRiwKKwkJIm1seGNwbGQ6dWlkOmJsdWUiLAorCX0sCit9OworCitlbnVtIG1seGNwbGRfbGVkX3BsYXRmb3JtX3R5cGVzIHsKKwlNTFhDUExEX0xFRF9QTEFURk9STV9ERUZBVUxULAorCU1MWENQTERfTEVEX1BMQVRGT1JNX01TTjIxMDAsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbWx4X3Byb2R1Y3RfbmFtZXNbXSA9IHsKKwkiREVGQVVMVCIsCisJIk1TTjIxMDAiLAorfTsKKworc3RhdGljIGVudW0KK21seGNwbGRfbGVkX3BsYXRmb3JtX3R5cGVzIG1seGNwbGRfbGVkX3BsYXRmb3JtX2NoZWNrX3N5c190eXBlKHZvaWQpCit7CisJY29uc3QgY2hhciAqbWx4X3Byb2R1Y3RfbmFtZTsKKwlpbnQgaTsKKworCW1seF9wcm9kdWN0X25hbWUgPSBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9QUk9EVUNUX05BTUUpOworCWlmICghbWx4X3Byb2R1Y3RfbmFtZSkKKwkJcmV0dXJuIE1MWENQTERfTEVEX1BMQVRGT1JNX0RFRkFVTFQ7CisKKwlmb3IgKGkgPSAxOyAgaSA8IEFSUkFZX1NJWkUobWx4X3Byb2R1Y3RfbmFtZXMpOyBpKyspIHsKKwkJaWYgKHN0cnN0cihtbHhfcHJvZHVjdF9uYW1lLCBtbHhfcHJvZHVjdF9uYW1lc1tpXSkpCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gTUxYQ1BMRF9MRURfUExBVEZPUk1fREVGQVVMVDsKK30KKworc3RhdGljIHZvaWQgbWx4Y3BsZF9sZWRfYnVzX2FjY2Vzc19mdW5jKHUxNiBiYXNlLCB1OCBvZmZzZXQsIHU4IHJ3X2ZsYWcsCisJCQkJCXU4ICpkYXRhKQoreworCXUzMiBhZGRyID0gYmFzZSArIG9mZnNldDsKKworCWlmIChyd19mbGFnID09IDApCisJCW91dGIoKmRhdGEsIGFkZHIpOworCWVsc2UKKwkJKmRhdGEgPSBpbmIoYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIG1seGNwbGRfbGVkX3N0b3JlX2h3KHU4IG1hc2ssIHU4IG9mZiwgdTggdnNldCkKK3sKKwl1OCBuaWIsIHZhbDsKKworCS8qCisJICogRWFjaCBMRUQgaXMgY29udHJvbGxlZCB0aHJvdWdoIGxvdyBvciBoaWdoIG5pYmJsZSBvZiB0aGUgcmVsZXZhbnQKKwkgKiBDUExEIHJlZ2lzdGVyLiBSZWdpc3RlciBvZmZzZXQgaXMgc3BlY2lmaWVkIGJ5IG9mZiBwYXJhbWV0ZXIuCisJICogUGFyYW1ldGVyIHZzZXQgcHJvdmlkZXMgY29sb3IgY29kZTogMHgwIGZvciBvZmYsIDB4NSBmb3Igc29saWQgcmVkLAorCSAqIDB4NiBmb3IgM0h6IGJsaW5rIHJlZCwgMHhkIGZvciBzb2xpZCBncmVlbiwgMHhlIGZvciAzSHogYmxpbmsKKwkgKiBncmVlbi4KKwkgKiBQYXJhbWV0ZXIgbWFzayBzcGVjaWZpZXMgd2hpY2ggbmliYmxlIGlzIHVzZWQgZm9yIHNwZWNpZmljIExFRDogbWFzaworCSAqIDB4ZjAgLSBsb3dlciBuaWJibGUgaXMgdG8gYmUgdXNlZCAoYml0cyBmcm9tIDAgdG8gMyksIG1hc2sgMHgwZiAtCisJICogaGlnaGVyIG5pYmJsZSAoYml0cyBmcm9tIDQgdG8gNykuCisJICovCisJc3Bpbl9sb2NrKCZtbHhjcGxkX2xlZC0+bG9jayk7CisJbWx4Y3BsZF9sZWRfYnVzX2FjY2Vzc19mdW5jKE1MWFBMQVRfQ1BMRF9MUENfUkVHX0JBU0VfQURSUiwgb2ZmLCAxLAorCQkJCSAgICAmdmFsKTsKKwluaWIgPSAobWFzayA9PSAweGYwKSA/IHZzZXQgOiAodnNldCA8PCA0KTsKKwl2YWwgPSAodmFsICYgbWFzaykgfCBuaWI7CisJbWx4Y3BsZF9sZWRfYnVzX2FjY2Vzc19mdW5jKE1MWFBMQVRfQ1BMRF9MUENfUkVHX0JBU0VfQURSUiwgb2ZmLCAwLAorCQkJCSAgICAmdmFsKTsKKwlzcGluX3VubG9jaygmbWx4Y3BsZF9sZWQtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBtbHhjcGxkX2xlZF9icmlnaHRuZXNzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWQsCisJCQkJICAgICAgIGVudW0gbGVkX2JyaWdodG5lc3MgdmFsdWUpCit7CisJc3RydWN0IG1seGNwbGRfbGVkX3ByaXYgKnBsZWQgPSBjZGV2X3RvX3ByaXYobGVkKTsKKworCWlmICh2YWx1ZSkgeworCQltbHhjcGxkX2xlZF9zdG9yZV9odyhwbGVkLT5wYXJhbS5tYXNrLCBwbGVkLT5wYXJhbS5vZmZzZXQsCisJCQkJICAgICBwbGVkLT5wYXJhbS5iYXNlX2NvbG9yKTsKKwkJcmV0dXJuOworCX0KKworCW1seGNwbGRfbGVkX3N0b3JlX2h3KHBsZWQtPnBhcmFtLm1hc2ssIHBsZWQtPnBhcmFtLm9mZnNldCwKKwkJCSAgICAgTUxYQ1BMRF9MRURfSVNfT0ZGKTsKK30KKworc3RhdGljIGludCBtbHhjcGxkX2xlZF9ibGlua19zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkLAorCQkJCSB1bnNpZ25lZCBsb25nICpkZWxheV9vbiwKKwkJCQkgdW5zaWduZWQgbG9uZyAqZGVsYXlfb2ZmKQoreworCXN0cnVjdCBtbHhjcGxkX2xlZF9wcml2ICpwbGVkID0gY2Rldl90b19wcml2KGxlZCk7CisKKwkvKgorCSAqIEhXIHN1cHBvcnRzIHR3byB0eXBlcyBvZiBibGlua2luZzogZnVsbCAoNkh6KSBhbmQgaGFsZiAoM0h6KS4KKwkgKiBGb3IgZGVsYXkgb24vb2ZmIHplcm8gZGVmYXVsdCBzZXR0aW5nIDNIeiBpcyB1c2VkLgorCSAqLworCWlmICghKCpkZWxheV9vbiA9PSAwICYmICpkZWxheV9vZmYgPT0gMCkgJiYKKwkgICAgISgqZGVsYXlfb24gPT0gTUxYQ1BMRF9MRURfQkxJTktfM0haICYmCisJICAgICAgKmRlbGF5X29mZiA9PSBNTFhDUExEX0xFRF9CTElOS18zSFopICYmCisJICAgICEoKmRlbGF5X29uID09IE1MWENQTERfTEVEX0JMSU5LXzZIWiAmJgorCSAgICAgICpkZWxheV9vZmYgPT0gTUxYQ1BMRF9MRURfQkxJTktfNkhaKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKmRlbGF5X29uID09IE1MWENQTERfTEVEX0JMSU5LXzZIWikKKwkJbWx4Y3BsZF9sZWRfc3RvcmVfaHcocGxlZC0+cGFyYW0ubWFzaywgcGxlZC0+cGFyYW0ub2Zmc2V0LAorCQkJCSAgICAgcGxlZC0+cGFyYW0uYmFzZV9jb2xvciArCisJCQkJICAgICBNTFhDUExEX0xFRF9PRkZTRVRfRlVMTCk7CisJZWxzZQorCQltbHhjcGxkX2xlZF9zdG9yZV9odyhwbGVkLT5wYXJhbS5tYXNrLCBwbGVkLT5wYXJhbS5vZmZzZXQsCisJCQkJICAgICBwbGVkLT5wYXJhbS5iYXNlX2NvbG9yICsKKwkJCQkgICAgIE1MWENQTERfTEVEX09GRlNFVF9IQUxGKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1seGNwbGRfbGVkX2NvbmZpZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgbWx4Y3BsZF9sZWRfcGRhdGEgKmNwbGQpCit7CisJaW50IGk7CisJaW50IGVycjsKKworCWNwbGQtPnBsZWQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IG1seGNwbGRfbGVkX3ByaXYpICoKKwkJCQkgIGNwbGQtPm51bV9sZWRfaW5zdGFuY2VzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNwbGQtPnBsZWQpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IGNwbGQtPm51bV9sZWRfaW5zdGFuY2VzOyBpKyspIHsKKwkJY3BsZC0+cGxlZFtpXS5jZGV2Lm5hbWUgPSBjcGxkLT5wcm9maWxlW2ldLm5hbWU7CisJCWNwbGQtPnBsZWRbaV0uY2Rldi5icmlnaHRuZXNzID0gY3BsZC0+cHJvZmlsZVtpXS5icmlnaHRuZXNzOworCQljcGxkLT5wbGVkW2ldLmNkZXYubWF4X2JyaWdodG5lc3MgPSAxOworCQljcGxkLT5wbGVkW2ldLmNkZXYuYnJpZ2h0bmVzc19zZXQgPSBtbHhjcGxkX2xlZF9icmlnaHRuZXNzX3NldDsKKwkJY3BsZC0+cGxlZFtpXS5jZGV2LmJsaW5rX3NldCA9IG1seGNwbGRfbGVkX2JsaW5rX3NldDsKKwkJY3BsZC0+cGxlZFtpXS5jZGV2LmZsYWdzID0gTEVEX0NPUkVfU1VTUEVORFJFU1VNRTsKKwkJZXJyID0gZGV2bV9sZWRfY2xhc3NkZXZfcmVnaXN0ZXIoZGV2LCAmY3BsZC0+cGxlZFtpXS5jZGV2KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJY3BsZC0+cGxlZFtpXS5wYXJhbS5vZmZzZXQgPSBtbHhjcGxkX2xlZC0+cHJvZmlsZVtpXS5vZmZzZXQ7CisJCWNwbGQtPnBsZWRbaV0ucGFyYW0ubWFzayA9IG1seGNwbGRfbGVkLT5wcm9maWxlW2ldLm1hc2s7CisJCWNwbGQtPnBsZWRbaV0ucGFyYW0uYmFzZV9jb2xvciA9CisJCQkJCW1seGNwbGRfbGVkLT5wcm9maWxlW2ldLmJhc2VfY29sb3I7CisKKwkJaWYgKG1seGNwbGRfbGVkLT5wcm9maWxlW2ldLmJyaWdodG5lc3MpCisJCQltbHhjcGxkX2xlZF9icmlnaHRuZXNzX3NldCgmY3BsZC0+cGxlZFtpXS5jZGV2LAorCQkJCQltbHhjcGxkX2xlZC0+cHJvZmlsZVtpXS5icmlnaHRuZXNzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbWx4Y3BsZF9sZWRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwllbnVtIG1seGNwbGRfbGVkX3BsYXRmb3JtX3R5cGVzIG1seGNwbGRfbGVkX3BsYXQgPQorCQkJCQltbHhjcGxkX2xlZF9wbGF0Zm9ybV9jaGVja19zeXNfdHlwZSgpOworCisJbWx4Y3BsZF9sZWQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCptbHhjcGxkX2xlZCksCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFtbHhjcGxkX2xlZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltbHhjcGxkX2xlZC0+cGRldiA9IHBkZXY7CisKKwlzd2l0Y2ggKG1seGNwbGRfbGVkX3BsYXQpIHsKKwljYXNlIE1MWENQTERfTEVEX1BMQVRGT1JNX01TTjIxMDA6CisJCW1seGNwbGRfbGVkLT5wcm9maWxlID0gbWx4Y3BsZF9sZWRfbXNuMjEwMF9wcm9maWxlOworCQltbHhjcGxkX2xlZC0+bnVtX2xlZF9pbnN0YW5jZXMgPQorCQkJCUFSUkFZX1NJWkUobWx4Y3BsZF9sZWRfbXNuMjEwMF9wcm9maWxlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQltbHhjcGxkX2xlZC0+cHJvZmlsZSA9IG1seGNwbGRfbGVkX2RlZmF1bHRfcHJvZmlsZTsKKwkJbWx4Y3BsZF9sZWQtPm51bV9sZWRfaW5zdGFuY2VzID0KKwkJCQlBUlJBWV9TSVpFKG1seGNwbGRfbGVkX2RlZmF1bHRfcHJvZmlsZSk7CisJCWJyZWFrOworCX0KKworCXNwaW5fbG9ja19pbml0KCZtbHhjcGxkX2xlZC0+bG9jayk7CisKKwlyZXR1cm4gbWx4Y3BsZF9sZWRfY29uZmlnKCZwZGV2LT5kZXYsIG1seGNwbGRfbGVkKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWx4Y3BsZF9sZWRfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gS0JVSUxEX01PRE5BTUUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1seGNwbGRfbGVkX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCWludCBlcnI7CisKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShLQlVJTERfTU9ETkFNRSwgLTEsIE5VTEwsIDApOworCWlmIChJU19FUlIocGRldikpIHsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwZGV2KTsKKwl9CisKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJm1seGNwbGRfbGVkX2RyaXZlciwgbWx4Y3BsZF9sZWRfcHJvYmUpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJQcm9iZSBwbGF0Zm9ybSBkcml2ZXIgZmFpbGVkXG4iKTsKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1seGNwbGRfbGVkX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihtbHhjcGxkX2xlZC0+cGRldik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1seGNwbGRfbGVkX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG1seGNwbGRfbGVkX2luaXQpOworbW9kdWxlX2V4aXQobWx4Y3BsZF9sZWRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlZhZGltIFBhc3Rlcm5hayA8dmFkaW1wQG1lbGxhbm94LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWVsbGFub3ggYm9hcmQgTEVEIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpsZWRzX21seGNwbGQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXBtODA1OC5jIGIvZHJpdmVycy9sZWRzL2xlZHMtcG04MDU4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyNjc0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLXBtODA1OC5jCkBAIC0wLDAgKzEsMTkxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEsIDIwMTYgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNkZWZpbmUgUE04MDU4X0xFRF9UWVBFX0NPTU1PTgkweDAwCisjZGVmaW5lIFBNODA1OF9MRURfVFlQRV9LRVlQQUQJMHgwMQorI2RlZmluZSBQTTgwNThfTEVEX1RZUEVfRkxBU0gJMHgwMgorCisjZGVmaW5lIFBNODA1OF9MRURfVFlQRV9DT01NT05fTUFTSwkweGY4CisjZGVmaW5lIFBNODA1OF9MRURfVFlQRV9LRVlQQURfTUFTSwkweGYwCisjZGVmaW5lIFBNODA1OF9MRURfVFlQRV9DT01NT05fU0hJRlQJMworI2RlZmluZSBQTTgwNThfTEVEX1RZUEVfS0VZUEFEX1NISUZUCTQKKworc3RydWN0IHBtODA1OF9sZWQgeworCXN0cnVjdCByZWdtYXAgKm1hcDsKKwl1MzIgcmVnOworCXUzMiBsZWR0eXBlOworCXN0cnVjdCBsZWRfY2xhc3NkZXYgY2RldjsKK307CisKK3N0YXRpYyB2b2lkIHBtODA1OF9sZWRfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmNsZWQsCisJZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKK3sKKwlzdHJ1Y3QgcG04MDU4X2xlZCAqbGVkOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKwl1bnNpZ25lZCBpbnQgdmFsID0gMDsKKworCWxlZCA9IGNvbnRhaW5lcl9vZihjbGVkLCBzdHJ1Y3QgcG04MDU4X2xlZCwgY2Rldik7CisJc3dpdGNoIChsZWQtPmxlZHR5cGUpIHsKKwljYXNlIFBNODA1OF9MRURfVFlQRV9DT01NT046CisJCW1hc2sgPSBQTTgwNThfTEVEX1RZUEVfQ09NTU9OX01BU0s7CisJCXZhbCA9IHZhbHVlIDw8IFBNODA1OF9MRURfVFlQRV9DT01NT05fU0hJRlQ7CisJCWJyZWFrOworCWNhc2UgUE04MDU4X0xFRF9UWVBFX0tFWVBBRDoKKwljYXNlIFBNODA1OF9MRURfVFlQRV9GTEFTSDoKKwkJbWFzayA9IFBNODA1OF9MRURfVFlQRV9LRVlQQURfTUFTSzsKKwkJdmFsID0gdmFsdWUgPDwgUE04MDU4X0xFRF9UWVBFX0tFWVBBRF9TSElGVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGxlZC0+bWFwLCBsZWQtPnJlZywgbWFzaywgdmFsKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIkZhaWxlZCB0byBzZXQgTEVEIGJyaWdodG5lc3NcbiIpOworfQorCitzdGF0aWMgZW51bSBsZWRfYnJpZ2h0bmVzcyBwbTgwNThfbGVkX2dldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjbGVkKQoreworCXN0cnVjdCBwbTgwNThfbGVkICpsZWQ7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJbGVkID0gY29udGFpbmVyX29mKGNsZWQsIHN0cnVjdCBwbTgwNThfbGVkLCBjZGV2KTsKKworCXJldCA9IHJlZ21hcF9yZWFkKGxlZC0+bWFwLCBsZWQtPnJlZywgJnZhbCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBnZXQgTEVEIGJyaWdodG5lc3NcbiIpOworCQlyZXR1cm4gTEVEX09GRjsKKwl9CisKKwlzd2l0Y2ggKGxlZC0+bGVkdHlwZSkgeworCWNhc2UgUE04MDU4X0xFRF9UWVBFX0NPTU1PTjoKKwkJdmFsICY9IFBNODA1OF9MRURfVFlQRV9DT01NT05fTUFTSzsKKwkJdmFsID4+PSBQTTgwNThfTEVEX1RZUEVfQ09NTU9OX1NISUZUOworCQlicmVhazsKKwljYXNlIFBNODA1OF9MRURfVFlQRV9LRVlQQUQ6CisJY2FzZSBQTTgwNThfTEVEX1RZUEVfRkxBU0g6CisJCXZhbCAmPSBQTTgwNThfTEVEX1RZUEVfS0VZUEFEX01BU0s7CisJCXZhbCA+Pj0gUE04MDU4X0xFRF9UWVBFX0tFWVBBRF9TSElGVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmFsID0gTEVEX09GRjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBwbTgwNThfbGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBtODA1OF9sZWQgKmxlZDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJaW50IHJldDsKKwlzdHJ1Y3QgcmVnbWFwICptYXA7CisJY29uc3QgY2hhciAqc3RhdGU7CisJZW51bSBsZWRfYnJpZ2h0bmVzcyBtYXhicmlnaHQ7CisKKwlsZWQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpsZWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxlZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsZWQtPmxlZHR5cGUgPSAodTMyKW9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSgmcGRldi0+ZGV2KTsKKworCW1hcCA9IGRldl9nZXRfcmVnbWFwKHBkZXYtPmRldi5wYXJlbnQsIE5VTEwpOworCWlmICghbWFwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlBhcmVudCByZWdtYXAgdW5hdmFpbGFibGUuXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJbGVkLT5tYXAgPSBtYXA7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJlZyIsICZsZWQtPnJlZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyByZWdpc3RlciBvZmZzZXQgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVXNlIGxhYmVsIGVsc2Ugbm9kZSBuYW1lICovCisJbGVkLT5jZGV2Lm5hbWUgPSBvZl9nZXRfcHJvcGVydHkobnAsICJsYWJlbCIsIE5VTEwpID8gOiBucC0+bmFtZTsKKwlsZWQtPmNkZXYuZGVmYXVsdF90cmlnZ2VyID0KKwkJb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibGludXgsZGVmYXVsdC10cmlnZ2VyIiwgTlVMTCk7CisJbGVkLT5jZGV2LmJyaWdodG5lc3Nfc2V0ID0gcG04MDU4X2xlZF9zZXQ7CisJbGVkLT5jZGV2LmJyaWdodG5lc3NfZ2V0ID0gcG04MDU4X2xlZF9nZXQ7CisJaWYgKGxlZC0+bGVkdHlwZSA9PSBQTTgwNThfTEVEX1RZUEVfQ09NTU9OKQorCQltYXhicmlnaHQgPSAzMTsgLyogNSBiaXRzICovCisJZWxzZQorCQltYXhicmlnaHQgPSAxNTsgLyogNCBiaXRzICovCisJbGVkLT5jZGV2Lm1heF9icmlnaHRuZXNzID0gbWF4YnJpZ2h0OworCisJc3RhdGUgPSBvZl9nZXRfcHJvcGVydHkobnAsICJkZWZhdWx0LXN0YXRlIiwgTlVMTCk7CisJaWYgKHN0YXRlKSB7CisJCWlmICghc3RyY21wKHN0YXRlLCAia2VlcCIpKSB7CisJCQlsZWQtPmNkZXYuYnJpZ2h0bmVzcyA9IHBtODA1OF9sZWRfZ2V0KCZsZWQtPmNkZXYpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoc3RhdGUsICJvbiIpKSB7CisJCQlsZWQtPmNkZXYuYnJpZ2h0bmVzcyA9IG1heGJyaWdodDsKKwkJCXBtODA1OF9sZWRfc2V0KCZsZWQtPmNkZXYsIG1heGJyaWdodCk7CisJCX0gZWxzZSB7CisJCQlsZWQtPmNkZXYuYnJpZ2h0bmVzcyA9IExFRF9PRkY7CisJCQlwbTgwNThfbGVkX3NldCgmbGVkLT5jZGV2LCBMRURfT0ZGKTsKKwkJfQorCX0KKworCWlmIChsZWQtPmxlZHR5cGUgPT0gUE04MDU4X0xFRF9UWVBFX0tFWVBBRCB8fAorCSAgICBsZWQtPmxlZHR5cGUgPT0gUE04MDU4X0xFRF9UWVBFX0ZMQVNIKQorCQlsZWQtPmNkZXYuZmxhZ3MJPSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FOworCisJcmV0ID0gZGV2bV9sZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmxlZC0+Y2Rldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgbGVkIFwiJXNcIlxuIiwKKwkJCWxlZC0+Y2Rldi5uYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcG04MDU4X2xlZHNfaWRfdGFibGVbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gInFjb20scG04MDU4LWxlZCIsCisJCS5kYXRhID0gKHZvaWQgKilQTTgwNThfTEVEX1RZUEVfQ09NTU9OCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInFjb20scG04MDU4LWtleXBhZC1sZWQiLAorCQkuZGF0YSA9ICh2b2lkICopUE04MDU4X0xFRF9UWVBFX0tFWVBBRAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJxY29tLHBtODA1OC1mbGFzaC1sZWQiLAorCQkuZGF0YSA9ICh2b2lkICopUE04MDU4X0xFRF9UWVBFX0ZMQVNICisJfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcG04MDU4X2xlZHNfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwbTgwNThfbGVkX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcG04MDU4X2xlZF9wcm9iZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicG04MDU4LWxlZHMiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBwbTgwNThfbGVkc19pZF90YWJsZSwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocG04MDU4X2xlZF9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlBNODA1OCBMRURzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpwbTgwNTgtbGVkcyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9saWdodG52bS9jb3JlLmMgYi9kcml2ZXJzL2xpZ2h0bnZtL2NvcmUuYwppbmRleCA5ZWJkMmNmLi5jNzg0ZGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xpZ2h0bnZtL2NvcmUuYworKysgYi9kcml2ZXJzL2xpZ2h0bnZtL2NvcmUuYwpAQCAtMTE3MSwyNyArMTE3MSwxMCBAQAogCS5ub2RlbmFtZQk9ICJsaWdodG52bS9jb250cm9sIiwKIAkuZm9wcwkJPSAmX2N0bF9mb3BzLAogfTsKK21vZHVsZV9taXNjX2RldmljZShfbnZtX21pc2MpOwogCiBNT0RVTEVfQUxJQVNfTUlTQ0RFVihNSVNDX0RZTkFNSUNfTUlOT1IpOwogCi1zdGF0aWMgaW50IF9faW5pdCBudm1fbW9kX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gbWlzY19yZWdpc3RlcigmX252bV9taXNjKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoIm52bTogbWlzY19yZWdpc3RlciBmYWlsZWQgZm9yIGNvbnRyb2wgZGV2aWNlIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbnZtX21vZF9leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZfbnZtX21pc2MpOwotfQotCiBNT0RVTEVfQVVUSE9SKCJNYXRpYXMgQmpvcmxpbmcgPG1AYmpvcmxpbmcubWU+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CiBNT0RVTEVfVkVSU0lPTigiMC4xIik7Ci1tb2R1bGVfaW5pdChudm1fbW9kX2luaXQpOwotbW9kdWxlX2V4aXQobnZtX21vZF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL2Ftcy9hbXMtaTJjLmMgYi9kcml2ZXJzL21hY2ludG9zaC9hbXMvYW1zLWkyYy5jCmluZGV4IDk3OGVkYTguLjhhM2JhNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL2Ftcy9hbXMtaTJjLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvYW1zL2Ftcy1pMmMuYwpAQCAtNzMsNyArNzMsNiBAQAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFtc19pMmNfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lICAgPSAiYW1zIiwKLQkJLm93bmVyICA9IFRISVNfTU9EVUxFLAogCX0sCiAJLnByb2JlICAgICAgICAgID0gYW1zX2kyY19wcm9iZSwKIAkucmVtb3ZlICAgICAgICAgPSBhbXNfaTJjX3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtMTEyLmMgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9wbTExMi5jCmluZGV4IDMwMjQ2ODUuLjk2ZDE2ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtMTEyLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcG0xMTIuYwpAQCAtNjY4LDcgKzY2OCw2IEBACiAJLnJlbW92ZSA9IHdmX3BtMTEyX3JlbW92ZSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJ3aW5kZmFybSIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9wbTcyLmMgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9wbTcyLmMKaW5kZXggMmY1MDZiOS4uZTg4Y2ZiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcG03Mi5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtNzIuYwpAQCAtNzg5LDcgKzc4OSw2IEBACiAJLnJlbW92ZQk9IHdmX3BtNzJfcmVtb3ZlLAogCS5kcml2ZXIJPSB7CiAJCS5uYW1lID0gIndpbmRmYXJtIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3JtMzEuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3JtMzEuYwppbmRleCA4MmZjODZhLi5iZGZjYjhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9ybTMxLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcm0zMS5jCkBAIC02ODIsNyArNjgyLDYgQEAKIAkucmVtb3ZlCT0gd2Zfcm0zMV9yZW1vdmUsCiAJLmRyaXZlcgk9IHsKIAkJLm5hbWUgPSAid2luZGZhcm0iLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWlsYm94L0tjb25maWcgYi9kcml2ZXJzL21haWxib3gvS2NvbmZpZwppbmRleCA5N2MzNzI5Li43ODE3ZDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21haWxib3gvS2NvbmZpZworKysgYi9kcml2ZXJzL21haWxib3gvS2NvbmZpZwpAQCAtMTI3LDYgKzEyNyw3IEBACiBjb25maWcgQkNNX1BEQ19NQk9YCiAJdHJpc3RhdGUgIkJyb2FkY29tIFBEQyBNYWlsYm94IgogCWRlcGVuZHMgb24gQVJNNjQgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBIQVNfRE1BCiAJZGVmYXVsdCBBUkNIX0JDTV9JUFJPQwogCWhlbHAKIAkgIE1haWxib3ggaW1wbGVtZW50YXRpb24gZm9yIHRoZSBCcm9hZGNvbSBQREMgcmluZyBtYW5hZ2VyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWlsYm94L2JjbS1wZGMtbWFpbGJveC5jIGIvZHJpdmVycy9tYWlsYm94L2JjbS1wZGMtbWFpbGJveC5jCmluZGV4IGNiZTBjMWUuLmMxOWRkODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFpbGJveC9iY20tcGRjLW1haWxib3guYworKysgYi9kcml2ZXJzL21haWxib3gvYmNtLXBkYy1tYWlsYm94LmMKQEAgLTQ2OSw3ICs0NjksNyBAQAogICogdGhpcyBkaXJlY3RvcnkgZm9yIGEgU1BVLgogICogQHBkY3M6IFBEQyBzdGF0ZSBzdHJ1Y3R1cmUKICAqLwotdm9pZCBwZGNfc2V0dXBfZGVidWdmcyhzdHJ1Y3QgcGRjX3N0YXRlICpwZGNzKQorc3RhdGljIHZvaWQgcGRjX3NldHVwX2RlYnVnZnMoc3RydWN0IHBkY19zdGF0ZSAqcGRjcykKIHsKIAljaGFyIHNwdV9zdGF0c19uYW1lWzE2XTsKIApAQCAtNDg1LDcgKzQ4NSw3IEBACiAJCQkJCQkgICZwZGNfZGVidWdmc19zdGF0cyk7CiB9CiAKLXZvaWQgcGRjX2ZyZWVfZGVidWdmcyh2b2lkKQorc3RhdGljIHZvaWQgcGRjX2ZyZWVfZGVidWdmcyh2b2lkKQogewogCWlmIChkZWJ1Z2ZzX2RpciAmJiBzaW1wbGVfZW1wdHkoZGVidWdmc19kaXIpKSB7CiAJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkZWJ1Z2ZzX2Rpcik7CkBAIC0xMTkxLDEwICsxMTkxLDExIEBACiB7CiAJc3RydWN0IHBkY19zdGF0ZSAqcGRjcyA9IGNoYW4tPmNvbl9wcml2OwogCi0JaWYgKHBkY3MpCi0JCWRldl9kYmcoJnBkY3MtPnBkZXYtPmRldiwKLQkJCSJTaHV0ZG93biBtYWlsYm94IGNoYW5uZWwgZm9yIFBEQyAldSIsIHBkY3MtPnBkY19pZHgpOworCWlmICghcGRjcykKKwkJcmV0dXJuOwogCisJZGV2X2RiZygmcGRjcy0+cGRldi0+ZGV2LAorCQkiU2h1dGRvd24gbWFpbGJveCBjaGFubmVsIGZvciBQREMgJXUiLCBwZGNzLT5wZGNfaWR4KTsKIAlwZGNfcmluZ19mcmVlKHBkY3MpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21haWxib3gvcGNjLmMgYi9kcml2ZXJzL21haWxib3gvcGNjLmMKaW5kZXggMDQzODI4ZC4uMDhjODdmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWlsYm94L3BjYy5jCisrKyBiL2RyaXZlcnMvbWFpbGJveC9wY2MuYwpAQCAtNTksNiArNTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21haWxib3hfY29udHJvbGxlci5oPgpAQCAtNjgsMTEgKzY5LDE2IEBACiAjaW5jbHVkZSAibWFpbGJveC5oIgogCiAjZGVmaW5lIE1BWF9QQ0NfU1VCU1BBQ0VTCTI1NgorI2RlZmluZSBNQk9YX0lSUV9OQU1FCQkicGNjLW1ib3giCiAKIHN0YXRpYyBzdHJ1Y3QgbWJveF9jaGFuICpwY2NfbWJveF9jaGFubmVsczsKIAogLyogQXJyYXkgb2YgY2FjaGVkIHZpcnR1YWwgYWRkcmVzcyBmb3IgZG9vcmJlbGwgcmVnaXN0ZXJzICovCiBzdGF0aWMgdm9pZCBfX2lvbWVtICoqcGNjX2Rvb3JiZWxsX3ZhZGRyOworLyogQXJyYXkgb2YgY2FjaGVkIHZpcnR1YWwgYWRkcmVzcyBmb3IgZG9vcmJlbGwgYWNrIHJlZ2lzdGVycyAqLworc3RhdGljIHZvaWQgX19pb21lbSAqKnBjY19kb29yYmVsbF9hY2tfdmFkZHI7CisvKiBBcnJheSBvZiBkb29yYmVsbCBpbnRlcnJ1cHRzICovCitzdGF0aWMgaW50ICpwY2NfZG9vcmJlbGxfaXJxOwogCiBzdGF0aWMgc3RydWN0IG1ib3hfY29udHJvbGxlciBwY2NfbWJveF9jdHJsID0ge307CiAvKioKQEAgLTkxLDc5ICs5Nyw2IEBACiAJcmV0dXJuICZwY2NfbWJveF9jaGFubmVsc1tpZF07CiB9CiAKLS8qKgotICogcGNjX21ib3hfcmVxdWVzdF9jaGFubmVsIC0gUENDIGNsaWVudHMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvCi0gKgkJcmVxdWVzdCBhIHBvaW50ZXIgdG8gdGhlaXIgUENDIHN1YnNwYWNlLCBmcm9tIHdoaWNoIHRoZXkKLSAqCQljYW4gZ2V0IHRoZSBkZXRhaWxzIG9mIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgcmVtb3RlLgotICogQGNsOiBQb2ludGVyIHRvIE1haWxib3ggY2xpZW50LCBzbyB3ZSBrbm93IHdoZXJlIHRvIGJpbmQgdGhlCi0gKgkJQ2hhbm5lbC4KLSAqIEBzdWJzcGFjZV9pZDogVGhlIFBDQyBTdWJzcGFjZSBpbmRleCBhcyBwYXJzZWQgaW4gdGhlIFBDQyBjbGllbnQKLSAqCQlBQ1BJIHBhY2thZ2UuIFRoaXMgaXMgdXNlZCB0byBsb29rdXAgdGhlIGFycmF5IG9mIFBDQwotICoJCXN1YnNwYWNlcyBhcyBwYXJzZWQgYnkgdGhlIFBDQyBNYWlsYm94IGNvbnRyb2xsZXIuCi0gKgotICogUmV0dXJuOiBQb2ludGVyIHRvIHRoZSBNYWlsYm94IENoYW5uZWwgaWYgc3VjY2Vzc2Z1bCBvcgotICoJCUVSUl9QVFIuCi0gKi8KLXN0cnVjdCBtYm94X2NoYW4gKnBjY19tYm94X3JlcXVlc3RfY2hhbm5lbChzdHJ1Y3QgbWJveF9jbGllbnQgKmNsLAotCQlpbnQgc3Vic3BhY2VfaWQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcGNjX21ib3hfY3RybC5kZXY7Ci0Jc3RydWN0IG1ib3hfY2hhbiAqY2hhbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyoKLQkgKiBFYWNoIFBDQyBTdWJzcGFjZSBpcyBhIE1haWxib3ggQ2hhbm5lbC4KLQkgKiBUaGUgUENDIENsaWVudHMgZ2V0IHRoZWlyIFBDQyBTdWJzcGFjZSBJRAotCSAqIGZyb20gdGhlaXIgb3duIHRhYmxlcyBhbmQgcGFzcyBpdCBoZXJlLgotCSAqIFRoaXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIFBDQyBzdWJzcGFjZQotCSAqIGZvciB0aGUgQ2xpZW50IHRvIG9wZXJhdGUgb24uCi0JICovCi0JY2hhbiA9IGdldF9wY2NfY2hhbm5lbChzdWJzcGFjZV9pZCk7Ci0KLQlpZiAoSVNfRVJSKGNoYW4pIHx8IGNoYW4tPmNsKSB7Ci0JCWRldl9lcnIoZGV2LCAiQ2hhbm5lbCBub3QgZm91bmQgZm9yIGlkeDogJWRcbiIsIHN1YnNwYWNlX2lkKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+bG9jaywgZmxhZ3MpOwotCWNoYW4tPm1zZ19mcmVlID0gMDsKLQljaGFuLT5tc2dfY291bnQgPSAwOwotCWNoYW4tPmFjdGl2ZV9yZXEgPSBOVUxMOwotCWNoYW4tPmNsID0gY2w7Ci0JaW5pdF9jb21wbGV0aW9uKCZjaGFuLT50eF9jb21wbGV0ZSk7Ci0KLQlpZiAoY2hhbi0+dHhkb25lX21ldGhvZCA9PSBUWERPTkVfQllfUE9MTCAmJiBjbC0+a25vd3NfdHhkb25lKQotCQljaGFuLT50eGRvbmVfbWV0aG9kIHw9IFRYRE9ORV9CWV9BQ0s7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gY2hhbjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHBjY19tYm94X3JlcXVlc3RfY2hhbm5lbCk7Ci0KLS8qKgotICogcGNjX21ib3hfZnJlZV9jaGFubmVsIC0gQ2xpZW50cyBjYWxsIHRoaXMgdG8gZnJlZSB0aGVpciBDaGFubmVsLgotICoKLSAqIEBjaGFuOiBQb2ludGVyIHRvIHRoZSBtYWlsYm94IGNoYW5uZWwgYXMgcmV0dXJuZWQgYnkKLSAqCQlwY2NfbWJveF9yZXF1ZXN0X2NoYW5uZWwoKQotICovCi12b2lkIHBjY19tYm94X2ZyZWVfY2hhbm5lbChzdHJ1Y3QgbWJveF9jaGFuICpjaGFuKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWNoYW4gfHwgIWNoYW4tPmNsKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+bG9jaywgZmxhZ3MpOwotCWNoYW4tPmNsID0gTlVMTDsKLQljaGFuLT5hY3RpdmVfcmVxID0gTlVMTDsKLQlpZiAoY2hhbi0+dHhkb25lX21ldGhvZCA9PSAoVFhET05FX0JZX1BPTEwgfCBUWERPTkVfQllfQUNLKSkKLQkJY2hhbi0+dHhkb25lX21ldGhvZCA9IFRYRE9ORV9CWV9QT0xMOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+bG9jaywgZmxhZ3MpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwocGNjX21ib3hfZnJlZV9jaGFubmVsKTsKLQogLyoKICAqIFBDQyBjYW4gYmUgdXNlZCB3aXRoIHBlcmYgY3JpdGljYWwgZHJpdmVycyBzdWNoIGFzIENQUEMKICAqIFNvIGl0IG1ha2VzIHNlbnNlIHRvIGxvY2FsbHkgY2FjaGUgdGhlIHZpcnR1YWwgYWRkcmVzcyBhbmQKQEAgLTIyNSw2ICsxNTgsMTY3IEBACiB9CiAKIC8qKgorICogcGNjX21hcF9pbnRlcnJ1cHQgLSBNYXAgYSBQQ0Mgc3Vic3BhY2UgR1NJIHRvIGEgbGludXggSVJRIG51bWJlcgorICogQGludGVycnVwdDogR1NJIG51bWJlci4KKyAqIEBmbGFnczogaW50ZXJydXB0IGZsYWdzCisgKgorICogUmV0dXJuczogYSB2YWxpZCBsaW51eCBJUlEgbnVtYmVyIG9uIHN1Y2Nlc3MKKyAqCQkwIG9yIC1FSU5WQUwgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IHBjY19tYXBfaW50ZXJydXB0KHUzMiBpbnRlcnJ1cHQsIHUzMiBmbGFncykKK3sKKwlpbnQgdHJpZ2dlciwgcG9sYXJpdHk7CisKKwlpZiAoIWludGVycnVwdCkKKwkJcmV0dXJuIDA7CisKKwl0cmlnZ2VyID0gKGZsYWdzICYgQUNQSV9QQ0NUX0lOVEVSUlVQVF9NT0RFKSA/IEFDUElfRURHRV9TRU5TSVRJVkUKKwkJCTogQUNQSV9MRVZFTF9TRU5TSVRJVkU7CisKKwlwb2xhcml0eSA9IChmbGFncyAmIEFDUElfUENDVF9JTlRFUlJVUFRfUE9MQVJJVFkpID8gQUNQSV9BQ1RJVkVfTE9XCisJCQk6IEFDUElfQUNUSVZFX0hJR0g7CisKKwlyZXR1cm4gYWNwaV9yZWdpc3Rlcl9nc2koTlVMTCwgaW50ZXJydXB0LCB0cmlnZ2VyLCBwb2xhcml0eSk7Cit9CisKKy8qKgorICogcGNjX21ib3hfaXJxIC0gUENDIG1haWxib3ggaW50ZXJydXB0IGhhbmRsZXIKKyAqLworc3RhdGljIGlycXJldHVybl90IHBjY19tYm94X2lycShpbnQgaXJxLCB2b2lkICpwKQoreworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZG9vcmJlbGxfYWNrOworCXN0cnVjdCBhY3BpX3BjY3RfaHdfcmVkdWNlZCAqcGNjdF9zczsKKwlzdHJ1Y3QgbWJveF9jaGFuICpjaGFuID0gcDsKKwl1NjQgZG9vcmJlbGxfYWNrX3ByZXNlcnZlOworCXU2NCBkb29yYmVsbF9hY2tfd3JpdGU7CisJdTY0IGRvb3JiZWxsX2Fja192YWw7CisJaW50IHJldDsKKworCXBjY3Rfc3MgPSBjaGFuLT5jb25fcHJpdjsKKworCW1ib3hfY2hhbl9yZWNlaXZlZF9kYXRhKGNoYW4sIE5VTEwpOworCisJaWYgKHBjY3Rfc3MtPmhlYWRlci50eXBlID09IEFDUElfUENDVF9UWVBFX0hXX1JFRFVDRURfU1VCU1BBQ0VfVFlQRTIpIHsKKwkJc3RydWN0IGFjcGlfcGNjdF9od19yZWR1Y2VkX3R5cGUyICpwY2N0Ml9zcyA9IGNoYW4tPmNvbl9wcml2OworCQl1MzIgaWQgPSBjaGFuIC0gcGNjX21ib3hfY2hhbm5lbHM7CisKKwkJZG9vcmJlbGxfYWNrID0gJnBjY3QyX3NzLT5kb29yYmVsbF9hY2tfcmVnaXN0ZXI7CisJCWRvb3JiZWxsX2Fja19wcmVzZXJ2ZSA9IHBjY3QyX3NzLT5hY2tfcHJlc2VydmVfbWFzazsKKwkJZG9vcmJlbGxfYWNrX3dyaXRlID0gcGNjdDJfc3MtPmFja193cml0ZV9tYXNrOworCisJCXJldCA9IHJlYWRfcmVnaXN0ZXIocGNjX2Rvb3JiZWxsX2Fja192YWRkcltpZF0sCisJCQkJICAgICZkb29yYmVsbF9hY2tfdmFsLAorCQkJCSAgICBkb29yYmVsbF9hY2stPmJpdF93aWR0aCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gSVJRX05PTkU7CisKKwkJcmV0ID0gd3JpdGVfcmVnaXN0ZXIocGNjX2Rvb3JiZWxsX2Fja192YWRkcltpZF0sCisJCQkJICAgICAoZG9vcmJlbGxfYWNrX3ZhbCAmIGRvb3JiZWxsX2Fja19wcmVzZXJ2ZSkKKwkJCQkJfCBkb29yYmVsbF9hY2tfd3JpdGUsCisJCQkJICAgICBkb29yYmVsbF9hY2stPmJpdF93aWR0aCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIHBjY19tYm94X3JlcXVlc3RfY2hhbm5lbCAtIFBDQyBjbGllbnRzIGNhbGwgdGhpcyBmdW5jdGlvbiB0bworICoJCXJlcXVlc3QgYSBwb2ludGVyIHRvIHRoZWlyIFBDQyBzdWJzcGFjZSwgZnJvbSB3aGljaCB0aGV5CisgKgkJY2FuIGdldCB0aGUgZGV0YWlscyBvZiBjb21tdW5pY2F0aW5nIHdpdGggdGhlIHJlbW90ZS4KKyAqIEBjbDogUG9pbnRlciB0byBNYWlsYm94IGNsaWVudCwgc28gd2Uga25vdyB3aGVyZSB0byBiaW5kIHRoZQorICoJCUNoYW5uZWwuCisgKiBAc3Vic3BhY2VfaWQ6IFRoZSBQQ0MgU3Vic3BhY2UgaW5kZXggYXMgcGFyc2VkIGluIHRoZSBQQ0MgY2xpZW50CisgKgkJQUNQSSBwYWNrYWdlLiBUaGlzIGlzIHVzZWQgdG8gbG9va3VwIHRoZSBhcnJheSBvZiBQQ0MKKyAqCQlzdWJzcGFjZXMgYXMgcGFyc2VkIGJ5IHRoZSBQQ0MgTWFpbGJveCBjb250cm9sbGVyLgorICoKKyAqIFJldHVybjogUG9pbnRlciB0byB0aGUgTWFpbGJveCBDaGFubmVsIGlmIHN1Y2Nlc3NmdWwgb3IKKyAqCQlFUlJfUFRSLgorICovCitzdHJ1Y3QgbWJveF9jaGFuICpwY2NfbWJveF9yZXF1ZXN0X2NoYW5uZWwoc3RydWN0IG1ib3hfY2xpZW50ICpjbCwKKwkJaW50IHN1YnNwYWNlX2lkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBjY19tYm94X2N0cmwuZGV2OworCXN0cnVjdCBtYm94X2NoYW4gKmNoYW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogRWFjaCBQQ0MgU3Vic3BhY2UgaXMgYSBNYWlsYm94IENoYW5uZWwuCisJICogVGhlIFBDQyBDbGllbnRzIGdldCB0aGVpciBQQ0MgU3Vic3BhY2UgSUQKKwkgKiBmcm9tIHRoZWlyIG93biB0YWJsZXMgYW5kIHBhc3MgaXQgaGVyZS4KKwkgKiBUaGlzIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBQQ0Mgc3Vic3BhY2UKKwkgKiBmb3IgdGhlIENsaWVudCB0byBvcGVyYXRlIG9uLgorCSAqLworCWNoYW4gPSBnZXRfcGNjX2NoYW5uZWwoc3Vic3BhY2VfaWQpOworCisJaWYgKElTX0VSUihjaGFuKSB8fCBjaGFuLT5jbCkgeworCQlkZXZfZXJyKGRldiwgIkNoYW5uZWwgbm90IGZvdW5kIGZvciBpZHg6ICVkXG4iLCBzdWJzcGFjZV9pZCk7CisJCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmxvY2ssIGZsYWdzKTsKKwljaGFuLT5tc2dfZnJlZSA9IDA7CisJY2hhbi0+bXNnX2NvdW50ID0gMDsKKwljaGFuLT5hY3RpdmVfcmVxID0gTlVMTDsKKwljaGFuLT5jbCA9IGNsOworCWluaXRfY29tcGxldGlvbigmY2hhbi0+dHhfY29tcGxldGUpOworCisJaWYgKGNoYW4tPnR4ZG9uZV9tZXRob2QgPT0gVFhET05FX0JZX1BPTEwgJiYgY2wtPmtub3dzX3R4ZG9uZSkKKwkJY2hhbi0+dHhkb25lX21ldGhvZCB8PSBUWERPTkVfQllfQUNLOworCisJaWYgKHBjY19kb29yYmVsbF9pcnFbc3Vic3BhY2VfaWRdID4gMCkgeworCQlpbnQgcmM7CisKKwkJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgcGNjX2Rvb3JiZWxsX2lycVtzdWJzcGFjZV9pZF0sCisJCQkJICAgICAgcGNjX21ib3hfaXJxLCAwLCBNQk9YX0lSUV9OQU1FLCBjaGFuKTsKKwkJaWYgKHVubGlrZWx5KHJjKSkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgUENDIGludGVycnVwdCAlZFxuIiwKKwkJCQlwY2NfZG9vcmJlbGxfaXJxW3N1YnNwYWNlX2lkXSk7CisJCQljaGFuID0gRVJSX1BUUihyYyk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gY2hhbjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjY19tYm94X3JlcXVlc3RfY2hhbm5lbCk7CisKKy8qKgorICogcGNjX21ib3hfZnJlZV9jaGFubmVsIC0gQ2xpZW50cyBjYWxsIHRoaXMgdG8gZnJlZSB0aGVpciBDaGFubmVsLgorICoKKyAqIEBjaGFuOiBQb2ludGVyIHRvIHRoZSBtYWlsYm94IGNoYW5uZWwgYXMgcmV0dXJuZWQgYnkKKyAqCQlwY2NfbWJveF9yZXF1ZXN0X2NoYW5uZWwoKQorICovCit2b2lkIHBjY19tYm94X2ZyZWVfY2hhbm5lbChzdHJ1Y3QgbWJveF9jaGFuICpjaGFuKQoreworCXUzMiBpZCA9IGNoYW4gLSBwY2NfbWJveF9jaGFubmVsczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFjaGFuIHx8ICFjaGFuLT5jbCkKKwkJcmV0dXJuOworCisJaWYgKGlkID49IHBjY19tYm94X2N0cmwubnVtX2NoYW5zKSB7CisJCXByX2RlYnVnKCJwY2NfbWJveF9mcmVlX2NoYW5uZWw6IEludmFsaWQgbWJveF9jaGFuIHBhc3NlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+bG9jaywgZmxhZ3MpOworCWNoYW4tPmNsID0gTlVMTDsKKwljaGFuLT5hY3RpdmVfcmVxID0gTlVMTDsKKwlpZiAoY2hhbi0+dHhkb25lX21ldGhvZCA9PSAoVFhET05FX0JZX1BPTEwgfCBUWERPTkVfQllfQUNLKSkKKwkJY2hhbi0+dHhkb25lX21ldGhvZCA9IFRYRE9ORV9CWV9QT0xMOworCisJaWYgKHBjY19kb29yYmVsbF9pcnFbaWRdID4gMCkKKwkJZGV2bV9mcmVlX2lycShjaGFuLT5tYm94LT5kZXYsIHBjY19kb29yYmVsbF9pcnFbaWRdLCBjaGFuKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjY19tYm94X2ZyZWVfY2hhbm5lbCk7CisKKworLyoqCiAgKiBwY2Nfc2VuZF9kYXRhIC0gQ2FsbGVkIGZyb20gTWFpbGJveCBDb250cm9sbGVyIGNvZGUuIFVzZWQKICAqCQloZXJlIG9ubHkgdG8gcmluZyB0aGUgY2hhbm5lbCBkb29yYmVsbC4gVGhlIFBDQyBjbGllbnQKICAqCQlzcGVjaWZpYyByZWFkL3dyaXRlIGlzIGRvbmUgaW4gdGhlIGNsaWVudCBkcml2ZXIgaW4KQEAgLTI5Niw4ICszOTAsMTAgQEAKIAlpZiAocGNjX21ib3hfY3RybC5udW1fY2hhbnMgPD0gTUFYX1BDQ19TVUJTUEFDRVMpIHsKIAkJcGNjdF9zcyA9IChzdHJ1Y3QgYWNwaV9wY2N0X2h3X3JlZHVjZWQgKikgaGVhZGVyOwogCi0JCWlmIChwY2N0X3NzLT5oZWFkZXIudHlwZSAhPQotCQkJCUFDUElfUENDVF9UWVBFX0hXX1JFRFVDRURfU1VCU1BBQ0UpIHsKKwkJaWYgKChwY2N0X3NzLT5oZWFkZXIudHlwZSAhPQorCQkJCUFDUElfUENDVF9UWVBFX0hXX1JFRFVDRURfU1VCU1BBQ0UpCisJCSAgICAmJiAocGNjdF9zcy0+aGVhZGVyLnR5cGUgIT0KKwkJCQlBQ1BJX1BDQ1RfVFlQRV9IV19SRURVQ0VEX1NVQlNQQUNFX1RZUEUyKSkgewogCQkJcHJfZXJyKCJJbmNvcnJlY3QgUENDIFN1YnNwYWNlIHR5cGUgZGV0ZWN0ZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTMwNyw2ICs0MDMsNDMgQEAKIH0KIAogLyoqCisgKiBwY2NfcGFyc2Vfc3Vic3BhY2VfaXJxIC0gUGFyc2UgdGhlIFBDQyBJUlEgYW5kIFBDQyBBQ0sgcmVnaXN0ZXIKKyAqCQlUaGVyZSBzaG91bGQgYmUgb25lIGVudHJ5IHBlciBQQ0MgY2xpZW50LgorICogQGlkOiBQQ0Mgc3Vic3BhY2UgaW5kZXguCisgKiBAcGNjdF9zczogUG9pbnRlciB0byB0aGUgQUNQSSBzdWJ0YWJsZSBoZWFkZXIgdW5kZXIgdGhlIFBDQ1QuCisgKgorICogUmV0dXJuOiAwIGZvciBTdWNjZXNzLCBlbHNlIGVycm5vLgorICoKKyAqIFRoaXMgZ2V0cyBjYWxsZWQgZm9yIGVhY2ggZW50cnkgaW4gdGhlIFBDQyB0YWJsZS4KKyAqLworc3RhdGljIGludCBwY2NfcGFyc2Vfc3Vic3BhY2VfaXJxKGludCBpZCwKKwkJCQkgIHN0cnVjdCBhY3BpX3BjY3RfaHdfcmVkdWNlZCAqcGNjdF9zcykKK3sKKwlwY2NfZG9vcmJlbGxfaXJxW2lkXSA9IHBjY19tYXBfaW50ZXJydXB0KHBjY3Rfc3MtPmRvb3JiZWxsX2ludGVycnVwdCwKKwkJCQkJCSAodTMyKXBjY3Rfc3MtPmZsYWdzKTsKKwlpZiAocGNjX2Rvb3JiZWxsX2lycVtpZF0gPD0gMCkgeworCQlwcl9lcnIoIlBDQyBHU0kgJWQgbm90IHJlZ2lzdGVyZWRcbiIsCisJCSAgICAgICBwY2N0X3NzLT5kb29yYmVsbF9pbnRlcnJ1cHQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocGNjdF9zcy0+aGVhZGVyLnR5cGUKKwkJPT0gQUNQSV9QQ0NUX1RZUEVfSFdfUkVEVUNFRF9TVUJTUEFDRV9UWVBFMikgeworCQlzdHJ1Y3QgYWNwaV9wY2N0X2h3X3JlZHVjZWRfdHlwZTIgKnBjY3QyX3NzID0gKHZvaWQgKilwY2N0X3NzOworCisJCXBjY19kb29yYmVsbF9hY2tfdmFkZHJbaWRdID0gYWNwaV9vc19pb3JlbWFwKAorCQkJCXBjY3QyX3NzLT5kb29yYmVsbF9hY2tfcmVnaXN0ZXIuYWRkcmVzcywKKwkJCQlwY2N0Ml9zcy0+ZG9vcmJlbGxfYWNrX3JlZ2lzdGVyLmJpdF93aWR0aCAvIDgpOworCQlpZiAoIXBjY19kb29yYmVsbF9hY2tfdmFkZHJbaWRdKSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byBpb3JlbWFwIFBDQyBBQ0sgcmVnaXN0ZXJcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKiBhY3BpX3BjY19wcm9iZSAtIFBhcnNlIHRoZSBBQ1BJIHRyZWUgZm9yIHRoZSBQQ0NULgogICoKICAqIFJldHVybjogMCBmb3IgU3VjY2VzcywgZWxzZSBlcnJuby4KQEAgLTMxNiw3ICs0NDksOSBAQAogCWFjcGlfc2l6ZSBwY2N0X3RibF9oZWFkZXJfc2l6ZTsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnBjY3RfdGJsOwogCXN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqcGNjdF9lbnRyeTsKLQlpbnQgY291bnQsIGk7CisJc3RydWN0IGFjcGlfdGFibGVfcGNjdCAqYWNwaV9wY2N0X3RibDsKKwlpbnQgY291bnQsIGksIHJjOworCWludCBzdW0gPSAwOwogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCiAJLyogU2VhcmNoIGZvciBQQ0NUICovCkBAIC0zMzMsMzcgKzQ2OCw2NiBAQAogCQkJc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX3BjY3QpLAogCQkJQUNQSV9QQ0NUX1RZUEVfSFdfUkVEVUNFRF9TVUJTUEFDRSwKIAkJCXBhcnNlX3BjY19zdWJzcGFjZSwgTUFYX1BDQ19TVUJTUEFDRVMpOworCXN1bSArPSAoY291bnQgPiAwKSA/IGNvdW50IDogMDsKIAotCWlmIChjb3VudCA8PSAwKSB7CisJY291bnQgPSBhY3BpX3RhYmxlX3BhcnNlX2VudHJpZXMoQUNQSV9TSUdfUENDVCwKKwkJCXNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9wY2N0KSwKKwkJCUFDUElfUENDVF9UWVBFX0hXX1JFRFVDRURfU1VCU1BBQ0VfVFlQRTIsCisJCQlwYXJzZV9wY2Nfc3Vic3BhY2UsIE1BWF9QQ0NfU1VCU1BBQ0VTKTsKKwlzdW0gKz0gKGNvdW50ID4gMCkgPyBjb3VudCA6IDA7CisKKwlpZiAoc3VtID09IDAgfHwgc3VtID49IE1BWF9QQ0NfU1VCU1BBQ0VTKSB7CiAJCXByX2VycigiRXJyb3IgcGFyc2luZyBQQ0Mgc3Vic3BhY2VzIGZyb20gUENDVFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXBjY19tYm94X2NoYW5uZWxzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1ib3hfY2hhbikgKgotCQkJY291bnQsIEdGUF9LRVJORUwpOwotCisJCQlzdW0sIEdGUF9LRVJORUwpOwogCWlmICghcGNjX21ib3hfY2hhbm5lbHMpIHsKIAkJcHJfZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgc3BhY2UgZm9yIFBDQyBtYm94IGNoYW5uZWxzXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JcGNjX2Rvb3JiZWxsX3ZhZGRyID0ga2NhbGxvYyhjb3VudCwgc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpOworCXBjY19kb29yYmVsbF92YWRkciA9IGtjYWxsb2Moc3VtLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwY2NfZG9vcmJlbGxfdmFkZHIpIHsKLQkJa2ZyZWUocGNjX21ib3hfY2hhbm5lbHMpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX21ib3g7CisJfQorCisJcGNjX2Rvb3JiZWxsX2Fja192YWRkciA9IGtjYWxsb2Moc3VtLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwY2NfZG9vcmJlbGxfYWNrX3ZhZGRyKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9kYl92YWRkcjsKKwl9CisKKwlwY2NfZG9vcmJlbGxfaXJxID0ga2NhbGxvYyhzdW0sIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjY19kb29yYmVsbF9pcnEpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX2RiX2Fja192YWRkcjsKIAl9CiAKIAkvKiBQb2ludCB0byB0aGUgZmlyc3QgUENDIHN1YnNwYWNlIGVudHJ5ICovCiAJcGNjdF9lbnRyeSA9IChzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKikgKAogCQkodW5zaWduZWQgbG9uZykgcGNjdF90YmwgKyBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfcGNjdCkpOwogCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwlhY3BpX3BjY3RfdGJsID0gKHN0cnVjdCBhY3BpX3RhYmxlX3BjY3QgKikgcGNjdF90Ymw7CisJaWYgKGFjcGlfcGNjdF90YmwtPmZsYWdzICYgQUNQSV9QQ0NUX0RPT1JCRUxMKQorCQlwY2NfbWJveF9jdHJsLnR4ZG9uZV9pcnEgPSB0cnVlOworCisJZm9yIChpID0gMDsgaSA8IHN1bTsgaSsrKSB7CiAJCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZGJfcmVnOwogCQlzdHJ1Y3QgYWNwaV9wY2N0X2h3X3JlZHVjZWQgKnBjY3Rfc3M7CiAJCXBjY19tYm94X2NoYW5uZWxzW2ldLmNvbl9wcml2ID0gcGNjdF9lbnRyeTsKIAorCQlwY2N0X3NzID0gKHN0cnVjdCBhY3BpX3BjY3RfaHdfcmVkdWNlZCAqKSBwY2N0X2VudHJ5OworCisJCWlmIChwY2NfbWJveF9jdHJsLnR4ZG9uZV9pcnEpIHsKKwkJCXJjID0gcGNjX3BhcnNlX3N1YnNwYWNlX2lycShpLCBwY2N0X3NzKTsKKwkJCWlmIChyYyA8IDApCisJCQkJZ290byBlcnI7CisJCX0KKwogCQkvKiBJZiBkb29yYmVsbCBpcyBpbiBzeXN0ZW0gbWVtb3J5IGNhY2hlIHRoZSB2aXJ0IGFkZHJlc3MgKi8KLQkJcGNjdF9zcyA9IChzdHJ1Y3QgYWNwaV9wY2N0X2h3X3JlZHVjZWQgKilwY2N0X2VudHJ5OwogCQlkYl9yZWcgPSAmcGNjdF9zcy0+ZG9vcmJlbGxfcmVnaXN0ZXI7CiAJCWlmIChkYl9yZWctPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlkpCiAJCQlwY2NfZG9vcmJlbGxfdmFkZHJbaV0gPSBhY3BpX29zX2lvcmVtYXAoZGJfcmVnLT5hZGRyZXNzLApAQCAtMzcyLDExICs1MzYsMjEgQEAKIAkJCSgodW5zaWduZWQgbG9uZykgcGNjdF9lbnRyeSArIHBjY3RfZW50cnktPmxlbmd0aCk7CiAJfQogCi0JcGNjX21ib3hfY3RybC5udW1fY2hhbnMgPSBjb3VudDsKKwlwY2NfbWJveF9jdHJsLm51bV9jaGFucyA9IHN1bTsKIAogCXByX2luZm8oIkRldGVjdGVkICVkIFBDQyBTdWJzcGFjZXNcbiIsIHBjY19tYm94X2N0cmwubnVtX2NoYW5zKTsKIAogCXJldHVybiAwOworCitlcnI6CisJa2ZyZWUocGNjX2Rvb3JiZWxsX2lycSk7CitlcnJfZnJlZV9kYl9hY2tfdmFkZHI6CisJa2ZyZWUocGNjX2Rvb3JiZWxsX2Fja192YWRkcik7CitlcnJfZnJlZV9kYl92YWRkcjoKKwlrZnJlZShwY2NfZG9vcmJlbGxfdmFkZHIpOworZXJyX2ZyZWVfbWJveDoKKwlrZnJlZShwY2NfbWJveF9jaGFubmVscyk7CisJcmV0dXJuIHJjOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWNiL0tjb25maWcgYi9kcml2ZXJzL21jYi9LY29uZmlnCmluZGV4IGU5YTY5NzYuLjc2ZDljNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWNiL0tjb25maWcKKysrIGIvZHJpdmVycy9tY2IvS2NvbmZpZwpAQCAtMjgsNCArMjgsMTMgQEAKIAogCSAgIElmIGJ1aWxkIGFzIGEgbW9kdWxlLCB0aGUgbW9kdWxlIGlzIGNhbGxlZCBtY2ItcGNpLmtvCiAKK2NvbmZpZyBNQ0JfTFBDCisJICAgdHJpc3RhdGUgIkxQQyAobm9uIFBDSSkgYmFzZWQgTUNCIGNhcnJpZXIiCisJICAgZGVmYXVsdCBuCisJICAgaGVscAorCisJICAgVGhpcyBpcyBhIE1DQiBjYXJyaWVyIG9uIGEgTFBDIG9yIG5vbiBQQ0kgZGV2aWNlLgorCisJICAgSWYgYnVpbGQgYXMgYSBtb2R1bGUsIHRoZSBtb2R1bGUgaXMgY2FsbGVkIG1jYi1scGMua28KKwogZW5kaWYgIyBNQ0IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWNiL01ha2VmaWxlIGIvZHJpdmVycy9tY2IvTWFrZWZpbGUKaW5kZXggMWFlMTQxMy4uYmNjNzc0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tY2IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tY2IvTWFrZWZpbGUKQEAgLTUsMyArNSw0IEBACiBtY2IteSArPSBtY2ItcGFyc2UubwogCiBvYmotJChDT05GSUdfTUNCX1BDSSkgKz0gbWNiLXBjaS5vCitvYmotJChDT05GSUdfTUNCX0xQQykgKz0gbWNiLWxwYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21jYi9tY2ItY29yZS5jIGIvZHJpdmVycy9tY2IvbWNiLWNvcmUuYwppbmRleCA2ZjJjODUyLi45MjFhNWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21jYi9tY2ItY29yZS5jCisrKyBiL2RyaXZlcnMvbWNiL21jYi1jb3JlLmMKQEAgLTIzMyw2ICsyMzMsNyBAQAogCWRldi0+ZGV2LmJ1cyA9ICZtY2JfYnVzX3R5cGU7CiAJZGV2LT5kZXYucGFyZW50ID0gYnVzLT5kZXYucGFyZW50OwogCWRldi0+ZGV2LnJlbGVhc2UgPSBtY2JfcmVsZWFzZV9kZXY7CisJZGV2LT5kbWFfZGV2ID0gYnVzLT5jYXJyaWVyOwogCiAJZGV2aWNlX2lkID0gZGV2LT5pZDsKIAlkZXZfc2V0X25hbWUoJmRldi0+ZGV2LCAibWNiJWQtMTZ6JTAzZC0lZDolZDolZCIsCkBAIC0zNjksNyArMzcwLDYgQEAKIAlpZiAoIWRldikKIAkJcmV0dXJuIE5VTEw7CiAKLQlJTklUX0xJU1RfSEVBRCgmZGV2LT5idXNfbGlzdCk7CiAJZGV2LT5idXMgPSBidXM7CiAKIAlyZXR1cm4gZGV2OwpAQCAtNDA1LDIwICs0MDUsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9fbWNiX2J1c19hZGRfY2hpbGQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBtY2JfZGV2aWNlICptZGV2ID0gdG9fbWNiX2RldmljZShkZXYpOwotCXN0cnVjdCBtY2JfYnVzICpjaGlsZDsKLQotCUJVR19PTighbWRldi0+aXNfYWRkZWQpOwotCWNoaWxkID0gbWRldi0+c3Vib3JkaW5hdGU7Ci0KLQlpZiAoY2hpbGQpCi0JCW1jYl9idXNfYWRkX2RldmljZXMoY2hpbGQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qKgogICogbWNiX2J1c19hZGRfZGV2aWNlcygpIC0gQWRkIGRldmljZXMgaW4gdGhlIGJ1cycgaW50ZXJuYWwgZGV2aWNlIGxpc3QKICAqIEBidXM6IFRoZSBAbWNiX2J1cyB3ZSBhZGQgdGhlIGRldmljZXMKQEAgLTQyOCw4ICs0MTQsNiBAQAogdm9pZCBtY2JfYnVzX2FkZF9kZXZpY2VzKGNvbnN0IHN0cnVjdCBtY2JfYnVzICpidXMpCiB7CiAJYnVzX2Zvcl9lYWNoX2RldigmbWNiX2J1c190eXBlLCBOVUxMLCBOVUxMLCBfX21jYl9idXNfYWRkX2RldmljZXMpOwotCWJ1c19mb3JfZWFjaF9kZXYoJm1jYl9idXNfdHlwZSwgTlVMTCwgTlVMTCwgX19tY2JfYnVzX2FkZF9jaGlsZCk7Ci0KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1jYl9idXNfYWRkX2RldmljZXMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21jYi9tY2ItaW50ZXJuYWwuaCBiL2RyaXZlcnMvbWNiL21jYi1pbnRlcm5hbC5oCmluZGV4IDUyNTRlMDIuLmQ2ZTY5MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWNiL21jYi1pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvbWNiL21jYi1pbnRlcm5hbC5oCkBAIC0xMTIsNiArMTEyLDE1IEBACiAJdTMyIHNpemU7CiB9IF9fcGFja2VkOwogCitzdHJ1Y3QgY2hhbWVsZW9uX2JhciB7CisJdTMyIGFkZHI7CisJdTMyIHNpemU7Cit9OworCisjZGVmaW5lIEJBUl9DTlQoeCkgKCh4KSAmIDB4MDcpCisjZGVmaW5lIENIQU1FTEVPTl9CQVJfTUFYCTYKKyNkZWZpbmUgQkFSX0RFU0NfU0laRSh4KQkoKHgpICogc2l6ZW9mKHN0cnVjdCBjaGFtZWxlb25fYmFyKSArIHNpemVvZihfX2xlMzIpKQorCiBpbnQgY2hhbWVsZW9uX3BhcnNlX2NlbGxzKHN0cnVjdCBtY2JfYnVzICpidXMsIHBoeXNfYWRkcl90IG1hcGJhc2UsCiAJCQkgIHZvaWQgX19pb21lbSAqYmFzZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWNiL21jYi1scGMuYyBiL2RyaXZlcnMvbWNiL21jYi1scGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDcyYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tY2IvbWNiLWxwYy5jCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogTUVOIENoYW1lbGVvbiBCdXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IE1FTiBNaWtyb2VsZWt0cm9uaWsgR21iSCAod3d3Lm1lbi5kZSkKKyAqIEF1dGhvcjogQW5kcmVhcyBXZXJuZXIgPGFuZHJlYXMud2VybmVyQG1lbi5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvbWNiLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlICJtY2ItaW50ZXJuYWwuaCIKKworc3RydWN0IHByaXYgeworCXN0cnVjdCBtY2JfYnVzICpidXM7CisJc3RydWN0IHJlc291cmNlICptZW07CisJdm9pZCBfX2lvbWVtICpiYXNlOworfTsKKworc3RhdGljIGludCBtY2JfbHBjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IHByaXYgKnByaXY7CisJaW50IHJldCA9IDA7CisKKwlwcml2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcml2LT5tZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcHJpdi0+bWVtKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIE1lbW9yeSByZXNvdXJjZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlcyA9IGRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHByaXYtPm1lbS0+c3RhcnQsCisJCQkJICAgICAgcmVzb3VyY2Vfc2l6ZShwcml2LT5tZW0pLAorCQkJCSAgICAgIEtCVUlMRF9NT0ROQU1FKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBJTyBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXByaXYtPmJhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcHJpdi0+bWVtLT5zdGFydCwKKwkJCQkgIHJlc291cmNlX3NpemUocHJpdi0+bWVtKSk7CisJaWYgKCFwcml2LT5iYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBpb3JlbWFwXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CisKKwlwcml2LT5idXMgPSBtY2JfYWxsb2NfYnVzKCZwZGV2LT5kZXYpOworCWlmIChJU19FUlIocHJpdi0+YnVzKSkKKwkJcmV0dXJuIFBUUl9FUlIocHJpdi0+YnVzKTsKKworCXJldCA9IGNoYW1lbGVvbl9wYXJzZV9jZWxscyhwcml2LT5idXMsIHByaXYtPm1lbS0+c3RhcnQsIHByaXYtPmJhc2UpOworCWlmIChyZXQgPCAwKSB7CisJCW1jYl9yZWxlYXNlX2J1cyhwcml2LT5idXMpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9kYmcoJnBkZXYtPmRldiwgIkZvdW5kICVkIGNlbGxzXG4iLCByZXQpOworCisJbWNiX2J1c19hZGRfZGV2aWNlcyhwcml2LT5idXMpOworCisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCBtY2JfbHBjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwltY2JfcmVsZWFzZV9idXMocHJpdi0+YnVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbWNiX2xwY19wZGV2OworCitzdGF0aWMgaW50IG1jYl9scGNfY3JlYXRlX3BsYXRmb3JtX2RldmljZShjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCit7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBpZC0+ZHJpdmVyX2RhdGE7CisJaW50IHJldDsKKworCW1jYl9scGNfcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygibWNiLWxwYyIsIC0xKTsKKwlpZiAoIW1jYl9scGNfcGRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhtY2JfbHBjX3BkZXYsIHJlcywgMSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfcHV0OworCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChtY2JfbHBjX3BkZXYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3B1dDsKKworCXJldHVybiAwOworCitvdXRfcHV0OgorCXBsYXRmb3JtX2RldmljZV9wdXQobWNiX2xwY19wZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNjMjRfZnBnYV9yZXNvdXJjZSA9IHsKKwkuc3RhcnQgPSAweGUwMDBlMDAwLAorCS5lbmQgPSAweGUwMDBlMDAwICsgQ0hBTV9IRUFERVJfU0laRSwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1jYl9scGNfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZSA9ICJtY2ItbHBjIiwKKwl9LAorCS5wcm9iZQkJPSBtY2JfbHBjX3Byb2JlLAorCS5yZW1vdmUJCT0gbWNiX2xwY19yZW1vdmUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgbWNiX2xwY19kbWlfdGFibGVbXSA9IHsKKwl7CisJCS5pZGVudCA9ICJTQzI0IiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJNRU4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiMTRTQzI0IiksCisJCX0sCisJCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopJnNjMjRfZnBnYV9yZXNvdXJjZSwKKwkJLmNhbGxiYWNrID0gbWNiX2xwY19jcmVhdGVfcGxhdGZvcm1fZGV2aWNlLAorCX0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGRtaSwgbWNiX2xwY19kbWlfdGFibGUpOworCitzdGF0aWMgaW50IF9faW5pdCBtY2JfbHBjX2luaXQodm9pZCkKK3sKKwlpZiAoIWRtaV9jaGVja19zeXN0ZW0obWNiX2xwY19kbWlfdGFibGUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1jYl9scGNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1jYl9scGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKG1jYl9scGNfcGRldik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1jYl9scGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobWNiX2xwY19pbml0KTsKK21vZHVsZV9leGl0KG1jYl9scGNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkFuZHJlYXMgV2VybmVyIDxhbmRyZWFzLndlcm5lckBtZW4uZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1DQiBvdmVyIExQQyBzdXBwb3J0Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21jYi9tY2ItcGFyc2UuYyBiL2RyaXZlcnMvbWNiL21jYi1wYXJzZS5jCmluZGV4IGRiZWNiZWQuLjRjYTI3MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWNiL21jYi1wYXJzZS5jCisrKyBiL2RyaXZlcnMvbWNiL21jYi1wYXJzZS5jCkBAIC0yNiwxOSArMjYsMjAgQEAKIH0KIAogc3RhdGljIGludCBjaGFtZWxlb25fcGFyc2VfYmRkKHN0cnVjdCBtY2JfYnVzICpidXMsCi0JCQlwaHlzX2FkZHJfdCBtYXBiYXNlLAorCQkJc3RydWN0IGNoYW1lbGVvbl9iYXIgKmNiLAogCQkJdm9pZCBfX2lvbWVtICpiYXNlKQogewogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGNoYW1lbGVvbl9wYXJzZV9nZGQoc3RydWN0IG1jYl9idXMgKmJ1cywKLQkJCXBoeXNfYWRkcl90IG1hcGJhc2UsCi0JCQl2b2lkIF9faW9tZW0gKmJhc2UpCisJCQlzdHJ1Y3QgY2hhbWVsZW9uX2JhciAqY2IsCisJCQl2b2lkIF9faW9tZW0gKmJhc2UsIGludCBiYXJfY291bnQpCiB7CiAJc3RydWN0IGNoYW1lbGVvbl9nZGQgX19pb21lbSAqZ2RkID0KIAkJKHN0cnVjdCBjaGFtZWxlb25fZ2RkIF9faW9tZW0gKikgYmFzZTsKIAlzdHJ1Y3QgbWNiX2RldmljZSAqbWRldjsKKwl1MzIgZGV2X21hcGJhc2U7CiAJdTMyIG9mZnNldDsKIAl1MzIgc2l6ZTsKIAlpbnQgcmV0OwpAQCAtNjEsMTMgKzYyLDM5IEBACiAJbWRldi0+Z3JvdXAgPSBHRERfR1JQKHJlZzIpOwogCW1kZXYtPmluc3QgPSBHRERfSU5TKHJlZzIpOwogCisJLyoKKwkgKiBJZiB0aGUgQkFSIGlzIG1pc3NpbmcsIGRldl9tYXBiYXNlIGlzIHplcm8sIG9yIGlmIHRoZQorCSAqIGRldmljZSBpcyBJTyBtYXBwZWQgd2UganVzdCBwcmludCBhIHdhcm5pbmcgYW5kIGdvIG9uIHdpdGggdGhlCisJICogbmV4dCBkZXZpY2UsIGluc3RlYWQgb2YgY29tcGxldGVseSBzdG9wIHRoZSBnZGQgcGFyc2VyCisJICovCisJaWYgKG1kZXYtPmJhciA+IGJhcl9jb3VudCAtIDEpIHsKKwkJcHJfaW5mbygiTm8gQkFSIGZvciAxNnolMDNkXG4iLCBtZGV2LT5pZCk7CisJCXJldCA9IDA7CisJCWdvdG8gZXJyOworCX0KKworCWRldl9tYXBiYXNlID0gY2JbbWRldi0+YmFyXS5hZGRyOworCWlmICghZGV2X21hcGJhc2UpIHsKKwkJcHJfaW5mbygiQkFSIG5vdCBhc3NpZ25lZCBmb3IgMTZ6JTAzZFxuIiwgbWRldi0+aWQpOworCQlyZXQgPSAwOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoZGV2X21hcGJhc2UgJiAweDAxKSB7CisJCXByX2luZm8oIklPIG1hcHBlZCBEZXZpY2UgKDE2eiUwM2QpIG5vdCB5ZXQgc3VwcG9ydGVkXG4iLAorCQkJbWRldi0+aWQpOworCQlyZXQgPSAwOworCQlnb3RvIGVycjsKKwl9CisKIAlwcl9kZWJ1ZygiRm91bmQgYSAxNnolMDNkXG4iLCBtZGV2LT5pZCk7CiAKIAltZGV2LT5pcnEuc3RhcnQgPSBHRERfSVJRKHJlZzEpOwogCW1kZXYtPmlycS5lbmQgPSBHRERfSVJRKHJlZzEpOwogCW1kZXYtPmlycS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROwogCi0JbWRldi0+bWVtLnN0YXJ0ID0gbWFwYmFzZSArIG9mZnNldDsKKwltZGV2LT5tZW0uc3RhcnQgPSBkZXZfbWFwYmFzZSArIG9mZnNldDsKKwogCW1kZXYtPm1lbS5lbmQgPSBtZGV2LT5tZW0uc3RhcnQgKyBzaXplIC0gMTsKIAltZGV2LT5tZW0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKIApAQCAtODUsMTMgKzExMiw3NiBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIGNoYW1lbGVvbl9wYXJzZV9iYXIodm9pZCBfX2lvbWVtICpiYXNlLAorCQkJCXN0cnVjdCBjaGFtZWxlb25fYmFyICpjYiwgaW50IGJhcl9jb3VudCkKK3sKKwljaGFyIF9faW9tZW0gKnAgPSBiYXNlOworCWludCBpOworCisJLyogc2tpcCByZWcxICovCisJcCArPSBzaXplb2YoX19sZTMyKTsKKworCWZvciAoaSA9IDA7IGkgPCBiYXJfY291bnQ7IGkrKykgeworCQljYltpXS5hZGRyID0gcmVhZGwocCk7CisJCWNiW2ldLnNpemUgPSByZWFkbChwICsgNCk7CisKKwkJcCArPSBzaXplb2Yoc3RydWN0IGNoYW1lbGVvbl9iYXIpOworCX0KK30KKworc3RhdGljIGludCBjaGFtZWxlb25fZ2V0X2JhcihjaGFyIF9faW9tZW0gKipiYXNlLCBwaHlzX2FkZHJfdCBtYXBiYXNlLAorCQkJICAgICBzdHJ1Y3QgY2hhbWVsZW9uX2JhciAqKmNiKQoreworCXN0cnVjdCBjaGFtZWxlb25fYmFyICpjOworCWludCBiYXJfY291bnQ7CisJX19sZTMyIHJlZzsKKwl1MzIgZHR5cGU7CisKKwkvKgorCSAqIEZvciB0aG9zZSBkZXZpY2VzIHdoaWNoIGFyZSBub3QgY29ubmVjdGVkCisJICogdG8gdGhlIFBDSSBCdXMgKGUuZy4gTFBDKSB0aGVyZSBpcyBhIGJhcgorCSAqIGRlc2NyaXB0b3IgbG9jYXRlZCBkaXJlY3RseSBhZnRlciB0aGUKKwkgKiBjaGFtZWxlb24gaGVhZGVyLiBUaGlzIGhlYWRlciBpcyBjb21wYXJhYmxlCisJICogdG8gYSBQQ0kgaGVhZGVyLgorCSAqLworCWR0eXBlID0gZ2V0X25leHRfZHR5cGUoKmJhc2UpOworCWlmIChkdHlwZSA9PSBDSEFNRUxFT05fRFRZUEVfQkFSKSB7CisJCXJlZyA9IHJlYWRsKCpiYXNlKTsKKworCQliYXJfY291bnQgPSBCQVJfQ05UKHJlZyk7CisJCWlmIChiYXJfY291bnQgPD0gMCAmJiBiYXJfY291bnQgPiBDSEFNRUxFT05fQkFSX01BWCkKKwkJCXJldHVybiAtRU5PREVWOworCisJCWMgPSBrY2FsbG9jKGJhcl9jb3VudCwgc2l6ZW9mKHN0cnVjdCBjaGFtZWxlb25fYmFyKSwKKwkJCSAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJY2hhbWVsZW9uX3BhcnNlX2JhcigqYmFzZSwgYywgYmFyX2NvdW50KTsKKwkJKmJhc2UgKz0gQkFSX0RFU0NfU0laRShiYXJfY291bnQpOworCX0gZWxzZSB7CisJCWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2hhbWVsZW9uX2JhciksIEdGUF9LRVJORUwpOworCQlpZiAoIWMpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQliYXJfY291bnQgPSAxOworCQljLT5hZGRyID0gbWFwYmFzZTsKKwl9CisKKwkqY2IgPSBjOworCisJcmV0dXJuIGJhcl9jb3VudDsKK30KKwogaW50IGNoYW1lbGVvbl9wYXJzZV9jZWxscyhzdHJ1Y3QgbWNiX2J1cyAqYnVzLCBwaHlzX2FkZHJfdCBtYXBiYXNlLAogCQkJdm9pZCBfX2lvbWVtICpiYXNlKQogewotCWNoYXIgX19pb21lbSAqcCA9IGJhc2U7CiAJc3RydWN0IGNoYW1lbGVvbl9mcGdhX2hlYWRlciAqaGVhZGVyOwotCXVpbnQzMl90IGR0eXBlOworCXN0cnVjdCBjaGFtZWxlb25fYmFyICpjYjsKKwljaGFyIF9faW9tZW0gKnAgPSBiYXNlOwogCWludCBudW1fY2VsbHMgPSAwOworCXVpbnQzMl90IGR0eXBlOworCWludCBiYXJfY291bnQ7CiAJaW50IHJldCA9IDA7CiAJdTMyIGhzaXplOwogCkBAIC0xMDgsOCArMTk4LDggQEAKIAlpZiAoaGVhZGVyLT5tYWdpYyAhPSBDSEFNRUxFT05WMl9NQUdJQykgewogCQlwcl9lcnIoIlVuc3VwcG9ydGVkIGNoYW1lbGVvbiB2ZXJzaW9uIDB4JXhcbiIsCiAJCQkJaGVhZGVyLT5tYWdpYyk7Ci0JCWtmcmVlKGhlYWRlcik7Ci0JCXJldHVybiAtRU5PREVWOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfaGVhZGVyOwogCX0KIAlwICs9IGhzaXplOwogCkBAIC0xMTksMTYgKzIwOSwyMCBAQAogCXNucHJpbnRmKGJ1cy0+bmFtZSwgQ0hBTUVMRU9OX0ZJTEVOQU1FX0xFTiArIDEsICIlcyIsCiAJCSBoZWFkZXItPmZpbGVuYW1lKTsKIAorCWJhcl9jb3VudCA9IGNoYW1lbGVvbl9nZXRfYmFyKCZwLCBtYXBiYXNlLCAmY2IpOworCWlmIChiYXJfY291bnQgPCAwKQorCQlnb3RvIGZyZWVfaGVhZGVyOworCiAJZm9yX2VhY2hfY2hhbWVsZW9uX2NlbGwoZHR5cGUsIHApIHsKIAkJc3dpdGNoIChkdHlwZSkgewogCQljYXNlIENIQU1FTEVPTl9EVFlQRV9HRU5FUkFMOgotCQkJcmV0ID0gY2hhbWVsZW9uX3BhcnNlX2dkZChidXMsIG1hcGJhc2UsIHApOworCQkJcmV0ID0gY2hhbWVsZW9uX3BhcnNlX2dkZChidXMsIGNiLCBwLCBiYXJfY291bnQpOwogCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byBvdXQ7CisJCQkJZ290byBmcmVlX2JhcjsKIAkJCXAgKz0gc2l6ZW9mKHN0cnVjdCBjaGFtZWxlb25fZ2RkKTsKIAkJCWJyZWFrOwogCQljYXNlIENIQU1FTEVPTl9EVFlQRV9CUklER0U6Ci0JCQljaGFtZWxlb25fcGFyc2VfYmRkKGJ1cywgbWFwYmFzZSwgcCk7CisJCQljaGFtZWxlb25fcGFyc2VfYmRkKGJ1cywgY2IsIHApOwogCQkJcCArPSBzaXplb2Yoc3RydWN0IGNoYW1lbGVvbl9iZGQpOwogCQkJYnJlYWs7CiAJCWNhc2UgQ0hBTUVMRU9OX0RUWVBFX0VORDoKQEAgLTEzNiw4ICsyMzAsOCBAQAogCQlkZWZhdWx0OgogCQkJcHJfZXJyKCJJbnZhbGlkIGNoYW1lbGVvbiBkZXNjcmlwdG9yIHR5cGUgMHgleFxuIiwKIAkJCQlkdHlwZSk7Ci0JCQlrZnJlZShoZWFkZXIpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBmcmVlX2JhcjsKIAkJfQogCQludW1fY2VsbHMrKzsKIAl9CkBAIC0xNDUsMTEgKzIzOSwxNSBAQAogCWlmIChudW1fY2VsbHMgPT0gMCkKIAkJbnVtX2NlbGxzID0gLUVJTlZBTDsKIAorCWtmcmVlKGNiKTsKIAlrZnJlZShoZWFkZXIpOwogCXJldHVybiBudW1fY2VsbHM7CiAKLW91dDoKK2ZyZWVfYmFyOgorCWtmcmVlKGNiKTsKK2ZyZWVfaGVhZGVyOgogCWtmcmVlKGhlYWRlcik7CisKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2hhbWVsZW9uX3BhcnNlX2NlbGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWNiL21jYi1wY2kuYyBiL2RyaXZlcnMvbWNiL21jYi1wY2kuYwppbmRleCBiMTVhMDM0Li5hZjRkMmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21jYi9tY2ItcGNpLmMKKysrIGIvZHJpdmVycy9tY2IvbWNiLXBjaS5jCkBAIC00Niw2ICs0Niw3IEBACiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAogCXByaXYtPm1hcGJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CiAJaWYgKCFwcml2LT5tYXBiYXNlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9zdXBlci5jIGIvZHJpdmVycy9tZC9iY2FjaGUvc3VwZXIuYwppbmRleCA5NWE0Y2E2Li44NDlhZDQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9zdXBlci5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL3N1cGVyLmMKQEAgLTc2MCw3ICs3NjAsOCBAQAogCWlmICghZC0+bnJfc3RyaXBlcyB8fAogCSAgICBkLT5ucl9zdHJpcGVzID4gSU5UX01BWCB8fAogCSAgICBkLT5ucl9zdHJpcGVzID4gU0laRV9NQVggLyBzaXplb2YoYXRvbWljX3QpKSB7Ci0JCXByX2VycigibnJfc3RyaXBlcyB0b28gbGFyZ2UiKTsKKwkJcHJfZXJyKCJucl9zdHJpcGVzIHRvbyBsYXJnZSBvciBpbnZhbGlkOiAldSAoc3RhcnQgc2VjdG9yIGJleW9uZCBlbmQgb2YgZGlzaz8pIiwKKwkJCSh1bnNpZ25lZClkLT5ucl9zdHJpcGVzKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xODIwLDcgKzE4MjEsNyBAQAogCWZyZWUgPSByb3VuZHVwX3Bvd19vZl90d28oY2EtPnNiLm5idWNrZXRzKSA+PiAxMDsKIAogCWlmICghaW5pdF9maWZvKCZjYS0+ZnJlZVtSRVNFUlZFX0JUUkVFXSwgOCwgR0ZQX0tFUk5FTCkgfHwKLQkgICAgIWluaXRfZmlmbygmY2EtPmZyZWVbUkVTRVJWRV9QUklPXSwgcHJpb19idWNrZXRzKGNhKSwgR0ZQX0tFUk5FTCkgfHwKKwkgICAgIWluaXRfZmlmb19leGFjdCgmY2EtPmZyZWVbUkVTRVJWRV9QUklPXSwgcHJpb19idWNrZXRzKGNhKSwgR0ZQX0tFUk5FTCkgfHwKIAkgICAgIWluaXRfZmlmbygmY2EtPmZyZWVbUkVTRVJWRV9NT1ZJTkdHQ10sIGZyZWUsIEdGUF9LRVJORUwpIHx8CiAJICAgICFpbml0X2ZpZm8oJmNhLT5mcmVlW1JFU0VSVkVfTk9ORV0sIGZyZWUsIEdGUF9LRVJORUwpIHx8CiAJICAgICFpbml0X2ZpZm8oJmNhLT5mcmVlX2luYywJZnJlZSA8PCAyLCBHRlBfS0VSTkVMKSB8fApAQCAtMTg0NCw3ICsxODQ1LDcgQEAKIAkJCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgY2FjaGUgKmNhKQogewogCWNoYXIgbmFtZVtCREVWTkFNRV9TSVpFXTsKLQljb25zdCBjaGFyICplcnIgPSBOVUxMOworCWNvbnN0IGNoYXIgKmVyciA9IE5VTEw7IC8qIG11c3QgYmUgc2V0IGZvciBhbnkgZXJyb3IgY2FzZSAqLwogCWludCByZXQgPSAwOwogCiAJbWVtY3B5KCZjYS0+c2IsIHNiLCBzaXplb2Yoc3RydWN0IGNhY2hlX3NiKSk7CkBAIC0xODYxLDggKzE4NjIsMTMgQEAKIAkJY2EtPmRpc2NhcmQgPSBDQUNIRV9ESVNDQVJEKCZjYS0+c2IpOwogCiAJcmV0ID0gY2FjaGVfYWxsb2MoY2EpOwotCWlmIChyZXQgIT0gMCkKKwlpZiAocmV0ICE9IDApIHsKKwkJaWYgKHJldCA9PSAtRU5PTUVNKQorCQkJZXJyID0gImNhY2hlX2FsbG9jKCk6IC1FTk9NRU0iOworCQllbHNlCisJCQllcnIgPSAiY2FjaGVfYWxsb2MoKTogdW5rbm93biBlcnJvciI7CiAJCWdvdG8gZXJyOworCX0KIAogCWlmIChrb2JqZWN0X2FkZCgmY2EtPmtvYmosICZwYXJ0X3RvX2RldihiZGV2LT5iZF9wYXJ0KS0+a29iaiwgImJjYWNoZSIpKSB7CiAJCWVyciA9ICJlcnJvciBjYWxsaW5nIGtvYmplY3RfYWRkIjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYml0bWFwLmMgYi9kcml2ZXJzL21kL2JpdG1hcC5jCmluZGV4IDZmZmY3OTQuLjEzMDQxZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYml0bWFwLmMKKysrIGIvZHJpdmVycy9tZC9iaXRtYXAuYwpAQCAtMjE4MywxOSArMjE4MywyOSBAQAogc3RhdGljIHNzaXplX3QKIGxvY2F0aW9uX3N0b3JlKHN0cnVjdCBtZGRldiAqbWRkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKKwlpbnQgcnY7CiAKKwlydiA9IG1kZGV2X2xvY2sobWRkZXYpOworCWlmIChydikKKwkJcmV0dXJuIHJ2OwogCWlmIChtZGRldi0+cGVycykgewotCQlpZiAoIW1kZGV2LT5wZXJzLT5xdWllc2NlKQotCQkJcmV0dXJuIC1FQlVTWTsKLQkJaWYgKG1kZGV2LT5yZWNvdmVyeSB8fCBtZGRldi0+c3luY190aHJlYWQpCi0JCQlyZXR1cm4gLUVCVVNZOworCQlpZiAoIW1kZGV2LT5wZXJzLT5xdWllc2NlKSB7CisJCQlydiA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChtZGRldi0+cmVjb3ZlcnkgfHwgbWRkZXYtPnN5bmNfdGhyZWFkKSB7CisJCQlydiA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CiAJfQogCiAJaWYgKG1kZGV2LT5iaXRtYXAgfHwgbWRkZXYtPmJpdG1hcF9pbmZvLmZpbGUgfHwKIAkgICAgbWRkZXYtPmJpdG1hcF9pbmZvLm9mZnNldCkgewogCQkvKiBiaXRtYXAgYWxyZWFkeSBjb25maWd1cmVkLiAgT25seSBvcHRpb24gaXMgdG8gY2xlYXIgaXQgKi8KLQkJaWYgKHN0cm5jbXAoYnVmLCAibm9uZSIsIDQpICE9IDApCi0JCQlyZXR1cm4gLUVCVVNZOworCQlpZiAoc3RybmNtcChidWYsICJub25lIiwgNCkgIT0gMCkgeworCQkJcnYgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQogCQlpZiAobWRkZXYtPnBlcnMpIHsKIAkJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAxKTsKIAkJCWJpdG1hcF9kZXN0cm95KG1kZGV2KTsKQEAgLTIyMTQsMjEgKzIyMjQsMjUgQEAKIAkJCS8qIG5vdGhpbmcgdG8gYmUgZG9uZSAqLzsKIAkJZWxzZSBpZiAoc3RybmNtcChidWYsICJmaWxlOiIsIDUpID09IDApIHsKIAkJCS8qIE5vdCBzdXBwb3J0ZWQgeWV0ICovCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJ2ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OwogCQl9IGVsc2UgewotCQkJaW50IHJ2OwogCQkJaWYgKGJ1ZlswXSA9PSAnKycpCiAJCQkJcnYgPSBrc3RydG9sbChidWYrMSwgMTAsICZvZmZzZXQpOwogCQkJZWxzZQogCQkJCXJ2ID0ga3N0cnRvbGwoYnVmLCAxMCwgJm9mZnNldCk7CiAJCQlpZiAocnYpCi0JCQkJcmV0dXJuIHJ2OwotCQkJaWYgKG9mZnNldCA9PSAwKQotCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJaWYgKG9mZnNldCA9PSAwKSB7CisJCQkJcnYgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQogCQkJaWYgKG1kZGV2LT5iaXRtYXBfaW5mby5leHRlcm5hbCA9PSAwICYmCiAJCQkgICAgbWRkZXYtPm1ham9yX3ZlcnNpb24gPT0gMCAmJgotCQkJICAgIG9mZnNldCAhPSBtZGRldi0+Yml0bWFwX2luZm8uZGVmYXVsdF9vZmZzZXQpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkgICAgb2Zmc2V0ICE9IG1kZGV2LT5iaXRtYXBfaW5mby5kZWZhdWx0X29mZnNldCkgeworCQkJCXJ2ID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAkJCW1kZGV2LT5iaXRtYXBfaW5mby5vZmZzZXQgPSBvZmZzZXQ7CiAJCQlpZiAobWRkZXYtPnBlcnMpIHsKIAkJCQlzdHJ1Y3QgYml0bWFwICpiaXRtYXA7CkBAIC0yMjQ1LDcgKzIyNTksNyBAQAogCQkJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAwKTsKIAkJCQlpZiAocnYpIHsKIAkJCQkJYml0bWFwX2Rlc3Ryb3kobWRkZXYpOwotCQkJCQlyZXR1cm4gcnY7CisJCQkJCWdvdG8gb3V0OwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMjI1Nyw2ICsyMjcxLDExIEBACiAJCXNldF9iaXQoTURfQ0hBTkdFX0RFVlMsICZtZGRldi0+ZmxhZ3MpOwogCQltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOwogCX0KKwlydiA9IDA7CitvdXQ6CisJbWRkZXZfdW5sb2NrKG1kZGV2KTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKIAlyZXR1cm4gbGVuOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWJ1ZmlvLmMgYi9kcml2ZXJzL21kL2RtLWJ1ZmlvLmMKaW5kZXggNjU3MWM4MS4uODYyNTA0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1idWZpby5jCisrKyBiL2RyaXZlcnMvbWQvZG0tYnVmaW8uYwpAQCAtMTg3OSw3ICsxODc5LDcgQEAKIAlfX2NhY2hlX3NpemVfcmVmcmVzaCgpOwogCW11dGV4X3VubG9jaygmZG1fYnVmaW9fY2xpZW50c19sb2NrKTsKIAotCWRtX2J1ZmlvX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImRtX2J1ZmlvX2NhY2hlIik7CisJZG1fYnVmaW9fd3EgPSBhbGxvY193b3JrcXVldWUoImRtX2J1ZmlvX2NhY2hlIiwgV1FfTUVNX1JFQ0xBSU0sIDApOwogCWlmICghZG1fYnVmaW9fd3EpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWNyeXB0LmMgYi9kcml2ZXJzL21kL2RtLWNyeXB0LmMKaW5kZXggNGU5Nzg0Yi4uODc0Mjk1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1jcnlwdC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tY3J5cHQuYwpAQCAtMTgxLDcgKzE4MSw3IEBACiAJdTgga2V5WzBdOwogfTsKIAotI2RlZmluZSBNSU5fSU9TICAgICAgICAxNgorI2RlZmluZSBNSU5fSU9TICAgICAgICA2NAogCiBzdGF0aWMgdm9pZCBjbG9uZV9pbml0KHN0cnVjdCBkbV9jcnlwdF9pbyAqLCBzdHJ1Y3QgYmlvICopOwogc3RhdGljIHZvaWQga2NyeXB0ZF9xdWV1ZV9jcnlwdChzdHJ1Y3QgZG1fY3J5cHRfaW8gKmlvKTsKQEAgLTE0NTMsNyArMTQ1Myw3IEBACiAJdW5zaWduZWQgaTsKIAlpbnQgZXJyOwogCi0JY2MtPnRmbXMgPSBrbWFsbG9jKGNjLT50Zm1zX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBjcnlwdG9fc2tjaXBoZXIgKiksCisJY2MtPnRmbXMgPSBremFsbG9jKGNjLT50Zm1zX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBjcnlwdG9fc2tjaXBoZXIgKiksCiAJCQkgICBHRlBfS0VSTkVMKTsKIAlpZiAoIWNjLT50Zm1zKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE5MjQsNiArMTkyNCwxMyBAQAogCQlyZXR1cm4gRE1fTUFQSU9fUkVNQVBQRUQ7CiAJfQogCisJLyoKKwkgKiBDaGVjayBpZiBiaW8gaXMgdG9vIGxhcmdlLCBzcGxpdCBhcyBuZWVkZWQuCisJICovCisJaWYgKHVubGlrZWx5KGJpby0+YmlfaXRlci5iaV9zaXplID4gKEJJT19NQVhfUEFHRVMgPDwgUEFHRV9TSElGVCkpICYmCisJICAgIGJpb19kYXRhX2RpcihiaW8pID09IFdSSVRFKQorCQlkbV9hY2NlcHRfcGFydGlhbF9iaW8oYmlvLCAoKEJJT19NQVhfUEFHRVMgPDwgUEFHRV9TSElGVCkgPj4gU0VDVE9SX1NISUZUKSk7CisKIAlpbyA9IGRtX3Blcl9iaW9fZGF0YShiaW8sIGNjLT5wZXJfYmlvX2RhdGFfc2l6ZSk7CiAJY3J5cHRfaW9faW5pdChpbywgY2MsIGJpbywgZG1fdGFyZ2V0X29mZnNldCh0aSwgYmlvLT5iaV9pdGVyLmJpX3NlY3RvcikpOwogCWlvLT5jdHgucmVxID0gKHN0cnVjdCBza2NpcGhlcl9yZXF1ZXN0ICopKGlvICsgMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWZsYWtleS5jIGIvZHJpdmVycy9tZC9kbS1mbGFrZXkuYwppbmRleCA5N2U0NDZkLi42YTJlOGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWZsYWtleS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tZmxha2V5LmMKQEAgLTI4OSwxNSArMjg5LDEzIEBACiAJCXBiLT5iaW9fc3VibWl0dGVkID0gdHJ1ZTsKIAogCQkvKgotCQkgKiBNYXAgcmVhZHMgYXMgbm9ybWFsIG9ubHkgaWYgY29ycnVwdF9iaW9fYnl0ZSBzZXQuCisJCSAqIEVycm9yIHJlYWRzIGlmIG5laXRoZXIgY29ycnVwdF9iaW9fYnl0ZSBvciBkcm9wX3dyaXRlcyBhcmUgc2V0LgorCQkgKiBPdGhlcndpc2UsIGZsYWtleV9lbmRfaW8oKSB3aWxsIGRlY2lkZSBpZiB0aGUgcmVhZHMgc2hvdWxkIGJlIG1vZGlmaWVkLgogCQkgKi8KIAkJaWYgKGJpb19kYXRhX2RpcihiaW8pID09IFJFQUQpIHsKLQkJCS8qIElmIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCBvbmx5IGNvcnJ1cHQgdGhvc2UgdGhhdCBtYXRjaC4gKi8KLQkJCWlmIChmYy0+Y29ycnVwdF9iaW9fYnl0ZSAmJiAoZmMtPmNvcnJ1cHRfYmlvX3J3ID09IFJFQUQpICYmCi0JCQkgICAgYWxsX2NvcnJ1cHRfYmlvX2ZsYWdzX21hdGNoKGJpbywgZmMpKQotCQkJCWdvdG8gbWFwX2JpbzsKLQkJCWVsc2UKKwkJCWlmICghZmMtPmNvcnJ1cHRfYmlvX2J5dGUgJiYgIXRlc3RfYml0KERST1BfV1JJVEVTLCAmZmMtPmZsYWdzKSkKIAkJCQlyZXR1cm4gLUVJTzsKKwkJCWdvdG8gbWFwX2JpbzsKIAkJfQogCiAJCS8qCkBAIC0zMzQsMTQgKzMzMiwyMSBAQAogCXN0cnVjdCBmbGFrZXlfYyAqZmMgPSB0aS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgcGVyX2Jpb19kYXRhICpwYiA9IGRtX3Blcl9iaW9fZGF0YShiaW8sIHNpemVvZihzdHJ1Y3QgcGVyX2Jpb19kYXRhKSk7CiAKLQkvKgotCSAqIENvcnJ1cHQgc3VjY2Vzc2Z1bCBSRUFEcyB3aGlsZSBpbiBkb3duIHN0YXRlLgotCSAqLwogCWlmICghZXJyb3IgJiYgcGItPmJpb19zdWJtaXR0ZWQgJiYgKGJpb19kYXRhX2RpcihiaW8pID09IFJFQUQpKSB7Ci0JCWlmIChmYy0+Y29ycnVwdF9iaW9fYnl0ZSkKKwkJaWYgKGZjLT5jb3JydXB0X2Jpb19ieXRlICYmIChmYy0+Y29ycnVwdF9iaW9fcncgPT0gUkVBRCkgJiYKKwkJICAgIGFsbF9jb3JydXB0X2Jpb19mbGFnc19tYXRjaChiaW8sIGZjKSkgeworCQkJLyoKKwkJCSAqIENvcnJ1cHQgc3VjY2Vzc2Z1bCBtYXRjaGluZyBSRUFEcyB3aGlsZSBpbiBkb3duIHN0YXRlLgorCQkJICovCiAJCQljb3JydXB0X2Jpb19kYXRhKGJpbywgZmMpOwotCQllbHNlCisKKwkJfSBlbHNlIGlmICghdGVzdF9iaXQoRFJPUF9XUklURVMsICZmYy0+ZmxhZ3MpKSB7CisJCQkvKgorCQkJICogRXJyb3IgcmVhZCBkdXJpbmcgdGhlIGRvd25faW50ZXJ2YWwgaWYgZHJvcF93cml0ZXMKKwkJCSAqIHdhc24ndCBjb25maWd1cmVkLgorCQkJICovCiAJCQlyZXR1cm4gLUVJTzsKKwkJfQogCX0KIAogCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbG9nLXdyaXRlcy5jIGIvZHJpdmVycy9tZC9kbS1sb2ctd3JpdGVzLmMKaW5kZXggNGFiNjgwMy4uNDllNGQ4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1sb2ctd3JpdGVzLmMKKysrIGIvZHJpdmVycy9tZC9kbS1sb2ctd3JpdGVzLmMKQEAgLTI1OSwxMiArMjU5LDEyIEBACiAJCWdvdG8gb3V0OwogCXNlY3RvcisrOwogCi0JYmlvID0gYmlvX2FsbG9jKEdGUF9LRVJORUwsIGJsb2NrLT52ZWNfY250KTsKKwlhdG9taWNfaW5jKCZsYy0+aW9fYmxvY2tzKTsKKwliaW8gPSBiaW9fYWxsb2MoR0ZQX0tFUk5FTCwgbWluKGJsb2NrLT52ZWNfY250LCBCSU9fTUFYX1BBR0VTKSk7CiAJaWYgKCFiaW8pIHsKIAkJRE1FUlIoIkNvdWxkbid0IGFsbG9jIGxvZyBiaW8iKTsKIAkJZ290byBlcnJvcjsKIAl9Ci0JYXRvbWljX2luYygmbGMtPmlvX2Jsb2Nrcyk7CiAJYmlvLT5iaV9pdGVyLmJpX3NpemUgPSAwOwogCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBzZWN0b3I7CiAJYmlvLT5iaV9iZGV2ID0gbGMtPmxvZ2Rldi0+YmRldjsKQEAgLTI4Miw3ICsyODIsNyBAQAogCQlpZiAocmV0ICE9IGJsb2NrLT52ZWNzW2ldLmJ2X2xlbikgewogCQkJYXRvbWljX2luYygmbGMtPmlvX2Jsb2Nrcyk7CiAJCQlzdWJtaXRfYmlvKGJpbyk7Ci0JCQliaW8gPSBiaW9fYWxsb2MoR0ZQX0tFUk5FTCwgYmxvY2stPnZlY19jbnQgLSBpKTsKKwkJCWJpbyA9IGJpb19hbGxvYyhHRlBfS0VSTkVMLCBtaW4oYmxvY2stPnZlY19jbnQgLSBpLCBCSU9fTUFYX1BBR0VTKSk7CiAJCQlpZiAoIWJpbykgewogCQkJCURNRVJSKCJDb3VsZG4ndCBhbGxvYyBsb2cgYmlvIik7CiAJCQkJZ290byBlcnJvcjsKQEAgLTQ1OSw5ICs0NTksOSBAQAogCQlnb3RvIGJhZDsKIAl9CiAKLQlyZXQgPSAtRUlOVkFMOwogCWxjLT5sb2dfa3RocmVhZCA9IGt0aHJlYWRfcnVuKGxvZ193cml0ZXNfa3RocmVhZCwgbGMsICJsb2ctd3JpdGUiKTsKLQlpZiAoIWxjLT5sb2dfa3RocmVhZCkgeworCWlmIChJU19FUlIobGMtPmxvZ19rdGhyZWFkKSkgeworCQlyZXQgPSBQVFJfRVJSKGxjLT5sb2dfa3RocmVhZCk7CiAJCXRpLT5lcnJvciA9ICJDb3VsZG4ndCBhbGxvYyBrdGhyZWFkIjsKIAkJZG1fcHV0X2RldmljZSh0aSwgbGMtPmRldik7CiAJCWRtX3B1dF9kZXZpY2UodGksIGxjLT5sb2dkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1sb2cuYyBiL2RyaXZlcnMvbWQvZG0tbG9nLmMKaW5kZXggNGNhMmQxZC4uMDdmYzFhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1sb2cuYworKysgYi9kcml2ZXJzL21kL2RtLWxvZy5jCkBAIC0yOTEsOSArMjkxLDEwIEBACiAJY29yZS0+bnJfcmVnaW9ucyA9IGxlNjRfdG9fY3B1KGRpc2stPm5yX3JlZ2lvbnMpOwogfQogCi1zdGF0aWMgaW50IHJ3X2hlYWRlcihzdHJ1Y3QgbG9nX2MgKmxjLCBpbnQgcncpCitzdGF0aWMgaW50IHJ3X2hlYWRlcihzdHJ1Y3QgbG9nX2MgKmxjLCBpbnQgb3ApCiB7Ci0JbGMtPmlvX3JlcS5iaV9vcCA9IHJ3OworCWxjLT5pb19yZXEuYmlfb3AgPSBvcDsKKwlsYy0+aW9fcmVxLmJpX29wX2ZsYWdzID0gMDsKIAogCXJldHVybiBkbV9pbygmbGMtPmlvX3JlcSwgMSwgJmxjLT5oZWFkZXJfbG9jYXRpb24sIE5VTEwpOwogfQpAQCAtMzE2LDcgKzMxNyw3IEBACiB7CiAJaW50IHI7CiAKLQlyID0gcndfaGVhZGVyKGxvZywgUkVBRCk7CisJciA9IHJ3X2hlYWRlcihsb2csIFJFUV9PUF9SRUFEKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKQEAgLTYzMCw3ICs2MzEsNyBAQAogCWhlYWRlcl90b19kaXNrKCZsYy0+aGVhZGVyLCBsYy0+ZGlza19oZWFkZXIpOwogCiAJLyogd3JpdGUgdGhlIG5ldyBoZWFkZXIgKi8KLQlyID0gcndfaGVhZGVyKGxjLCBXUklURSk7CisJciA9IHJ3X2hlYWRlcihsYywgUkVRX09QX1dSSVRFKTsKIAlpZiAoIXIpIHsKIAkJciA9IGZsdXNoX2hlYWRlcihsYyk7CiAJCWlmIChyKQpAQCAtNjk4LDcgKzY5OSw3IEBACiAJCQlsb2dfY2xlYXJfYml0KGxjLCBsYy0+Y2xlYW5fYml0cywgaSk7CiAJfQogCi0JciA9IHJ3X2hlYWRlcihsYywgV1JJVEUpOworCXIgPSByd19oZWFkZXIobGMsIFJFUV9PUF9XUklURSk7CiAJaWYgKHIpCiAJCWZhaWxfbG9nX2RldmljZShsYyk7CiAJZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXJhaWQuYyBiL2RyaXZlcnMvbWQvZG0tcmFpZC5jCmluZGV4IDFiOTc5NWQuLjhhYmRlNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tcmFpZC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tcmFpZC5jCkBAIC0xOTEsNyArMTkxLDYgQEAKICNkZWZpbmUgUlRfRkxBR19SU19CSVRNQVBfTE9BREVECTIKICNkZWZpbmUgUlRfRkxBR19VUERBVEVfU0JTCQkzCiAjZGVmaW5lIFJUX0ZMQUdfUkVTSEFQRV9SUwkJNAotI2RlZmluZSBSVF9GTEFHX0tFRVBfUlNfRlJPWkVOCQk1CiAKIC8qIEFycmF5IGVsZW1lbnRzIG9mIDY0IGJpdCBuZWVkZWQgZm9yIHJlYnVpbGQvZmFpbGVkIGRpc2sgYml0cyAqLwogI2RlZmluZSBESVNLU19BUlJBWV9FTEVNUyAoKE1BWF9SQUlEX0RFVklDRVMgKyAoc2l6ZW9mKHVpbnQ2NF90KSAqIDggLSAxKSkgLyBzaXplb2YodWludDY0X3QpIC8gOCkKQEAgLTg2MSw2ICs4NjAsOSBAQAogewogCXVuc2lnbmVkIGxvbmcgbWluX3JlZ2lvbl9zaXplID0gcnMtPnRpLT5sZW4gLyAoMSA8PCAyMSk7CiAKKwlpZiAocnNfaXNfcmFpZDAocnMpKQorCQlyZXR1cm4gMDsKKwogCWlmICghcmVnaW9uX3NpemUpIHsKIAkJLyoKIAkJICogQ2hvb3NlIGEgcmVhc29uYWJsZSBkZWZhdWx0LgkgQWxsIGZpZ3VyZXMgaW4gc2VjdG9ycy4KQEAgLTkzMCw2ICs5MzIsOCBAQAogCQkJcmVidWlsZF9jbnQrKzsKIAogCXN3aXRjaCAocnMtPnJhaWRfdHlwZS0+bGV2ZWwpIHsKKwljYXNlIDA6CisJCWJyZWFrOwogCWNhc2UgMToKIAkJaWYgKHJlYnVpbGRfY250ID49IHJzLT5tZC5yYWlkX2Rpc2tzKQogCQkJZ290byB0b29fbWFueTsKQEAgLTIzMzUsNiArMjMzOSwxMyBAQAogCQljYXNlIDA6CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKKwkJCS8qCisJCQkgKiBXZSBoYXZlIHRvIGtlZXAgYW55IHJhaWQwIGRhdGEvbWV0YWRhdGEgZGV2aWNlIHBhaXJzIG9yCisJCQkgKiB0aGUgTUQgcmFpZDAgcGVyc29uYWxpdHkgd2lsbCBmYWlsIHRvIHN0YXJ0IHRoZSBhcnJheS4KKwkJCSAqLworCQkJaWYgKHJzX2lzX3JhaWQwKHJzKSkKKwkJCQljb250aW51ZTsKKwogCQkJZGV2ID0gY29udGFpbmVyX29mKHJkZXYsIHN0cnVjdCByYWlkX2RldiwgcmRldik7CiAJCQlpZiAoZGV2LT5tZXRhX2RldikKIAkJCQlkbV9wdXRfZGV2aWNlKHRpLCBkZXYtPm1ldGFfZGV2KTsKQEAgLTI1NzksNyArMjU5MCw2IEBACiAJCX0gZWxzZSB7CiAJCQkvKiBQcm9jZXNzIHJhaWQxIHdpdGhvdXQgZGVsdGFfZGlza3MgKi8KIAkJCW1kZGV2LT5yYWlkX2Rpc2tzID0gcnMtPnJhaWRfZGlza3M7Ci0JCQlzZXRfYml0KFJUX0ZMQUdfS0VFUF9SU19GUk9aRU4sICZycy0+cnVudGltZV9mbGFncyk7CiAJCQlyZXNoYXBlID0gZmFsc2U7CiAJCX0KIAl9IGVsc2UgewpAQCAtMjU5MCw3ICsyNjAwLDYgQEAKIAlpZiAocmVzaGFwZSkgewogCQlzZXRfYml0KFJUX0ZMQUdfUkVTSEFQRV9SUywgJnJzLT5ydW50aW1lX2ZsYWdzKTsKIAkJc2V0X2JpdChSVF9GTEFHX1VQREFURV9TQlMsICZycy0+cnVudGltZV9mbGFncyk7Ci0JCXNldF9iaXQoUlRfRkxBR19LRUVQX1JTX0ZST1pFTiwgJnJzLT5ydW50aW1lX2ZsYWdzKTsKIAl9IGVsc2UgaWYgKG1kZGV2LT5yYWlkX2Rpc2tzIDwgcnMtPnJhaWRfZGlza3MpCiAJCS8qIENyZWF0ZSBuZXcgc3VwZXJibG9ja3MgYW5kIGJpdG1hcHMsIGlmIGFueSBuZXcgZGlza3MgKi8KIAkJc2V0X2JpdChSVF9GTEFHX1VQREFURV9TQlMsICZycy0+cnVudGltZV9mbGFncyk7CkBAIC0yOTAyLDcgKzI5MTEsNiBAQAogCQkJZ290byBiYWQ7CiAKIAkJc2V0X2JpdChSVF9GTEFHX1VQREFURV9TQlMsICZycy0+cnVudGltZV9mbGFncyk7Ci0JCXNldF9iaXQoUlRfRkxBR19LRUVQX1JTX0ZST1pFTiwgJnJzLT5ydW50aW1lX2ZsYWdzKTsKIAkJLyogVGFrZW92ZXIgYWluJ3QgcmVjb3ZlcnksIHNvIGRpc2FibGUgcmVjb3ZlcnkgKi8KIAkJcnNfc2V0dXBfcmVjb3ZlcnkocnMsIE1heFNlY3Rvcik7CiAJCXJzX3NldF9uZXcocnMpOwpAQCAtMzM4NiwyMSArMzM5NCwyOCBAQAogewogCXN0cnVjdCByYWlkX3NldCAqcnMgPSB0aS0+cHJpdmF0ZTsKIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlRfRkxBR19SU19SRVNVTUVELCAmcnMtPnJ1bnRpbWVfZmxhZ3MpKSB7Ci0JCWlmICghcnMtPm1kLnN1c3BlbmRlZCkKLQkJCW1kZGV2X3N1c3BlbmQoJnJzLT5tZCk7Ci0JCXJzLT5tZC5ybyA9IDE7Ci0JfQorCWlmICghcnMtPm1kLnN1c3BlbmRlZCkKKwkJbWRkZXZfc3VzcGVuZCgmcnMtPm1kKTsKKworCXJzLT5tZC5ybyA9IDE7CiB9CiAKIHN0YXRpYyB2b2lkIGF0dGVtcHRfcmVzdG9yZV9vZl9mYXVsdHlfZGV2aWNlcyhzdHJ1Y3QgcmFpZF9zZXQgKnJzKQogewogCWludCBpOwotCXVpbnQ2NF90IGZhaWxlZF9kZXZpY2VzLCBjbGVhcmVkX2ZhaWxlZF9kZXZpY2VzID0gMDsKKwl1aW50NjRfdCBjbGVhcmVkX2ZhaWxlZF9kZXZpY2VzW0RJU0tTX0FSUkFZX0VMRU1TXTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgY2xlYXJlZCA9IGZhbHNlOwogCXN0cnVjdCBkbV9yYWlkX3N1cGVyYmxvY2sgKnNiOworCXN0cnVjdCBtZGRldiAqbWRkZXYgPSAmcnMtPm1kOwogCXN0cnVjdCBtZF9yZGV2ICpyOwogCisJLyogUkFJRCBwZXJzb25hbGl0aWVzIGhhdmUgdG8gcHJvdmlkZSBob3QgYWRkL3JlbW92ZSBtZXRob2RzIG9yIHdlIG5lZWQgdG8gYmFpbCBvdXQuICovCisJaWYgKCFtZGRldi0+cGVycyB8fCAhbWRkZXYtPnBlcnMtPmhvdF9hZGRfZGlzayB8fCAhbWRkZXYtPnBlcnMtPmhvdF9yZW1vdmVfZGlzaykKKwkJcmV0dXJuOworCisJbWVtc2V0KGNsZWFyZWRfZmFpbGVkX2RldmljZXMsIDAsIHNpemVvZihjbGVhcmVkX2ZhaWxlZF9kZXZpY2VzKSk7CisKIAlmb3IgKGkgPSAwOyBpIDwgcnMtPm1kLnJhaWRfZGlza3M7IGkrKykgewogCQlyID0gJnJzLT5kZXZbaV0ucmRldjsKIAkJaWYgKHRlc3RfYml0KEZhdWx0eSwgJnItPmZsYWdzKSAmJiByLT5zYl9wYWdlICYmCkBAIC0zNDIwLDcgKzM0MzUsNyBAQAogCQkJICogb3Vyc2VsdmVzLgogCQkJICovCiAJCQlpZiAoKHItPnJhaWRfZGlzayA+PSAwKSAmJgotCQkJICAgIChyLT5tZGRldi0+cGVycy0+aG90X3JlbW92ZV9kaXNrKHItPm1kZGV2LCByKSAhPSAwKSkKKwkJCSAgICAobWRkZXYtPnBlcnMtPmhvdF9yZW1vdmVfZGlzayhtZGRldiwgcikgIT0gMCkpCiAJCQkJLyogRmFpbGVkIHRvIHJldml2ZSB0aGlzIGRldmljZSwgdHJ5IG5leHQgKi8KIAkJCQljb250aW51ZTsKIApAQCAtMzQzMCwyMiArMzQ0NSwzMCBAQAogCQkJY2xlYXJfYml0KEZhdWx0eSwgJnItPmZsYWdzKTsKIAkJCWNsZWFyX2JpdChXcml0ZUVycm9yU2VlbiwgJnItPmZsYWdzKTsKIAkJCWNsZWFyX2JpdChJbl9zeW5jLCAmci0+ZmxhZ3MpOwotCQkJaWYgKHItPm1kZGV2LT5wZXJzLT5ob3RfYWRkX2Rpc2soci0+bWRkZXYsIHIpKSB7CisJCQlpZiAobWRkZXYtPnBlcnMtPmhvdF9hZGRfZGlzayhtZGRldiwgcikpIHsKIAkJCQlyLT5yYWlkX2Rpc2sgPSAtMTsKIAkJCQlyLT5zYXZlZF9yYWlkX2Rpc2sgPSAtMTsKIAkJCQlyLT5mbGFncyA9IGZsYWdzOwogCQkJfSBlbHNlIHsKIAkJCQlyLT5yZWNvdmVyeV9vZmZzZXQgPSAwOwotCQkJCWNsZWFyZWRfZmFpbGVkX2RldmljZXMgfD0gMSA8PCBpOworCQkJCXNldF9iaXQoaSwgKHZvaWQgKikgY2xlYXJlZF9mYWlsZWRfZGV2aWNlcyk7CisJCQkJY2xlYXJlZCA9IHRydWU7CiAJCQl9CiAJCX0KIAl9Ci0JaWYgKGNsZWFyZWRfZmFpbGVkX2RldmljZXMpIHsKKworCS8qIElmIGFueSBmYWlsZWQgZGV2aWNlcyBjb3VsZCBiZSBjbGVhcmVkLCB1cGRhdGUgYWxsIHNicyBmYWlsZWRfZGV2aWNlcyBiaXRzICovCisJaWYgKGNsZWFyZWQpIHsKKwkJdWludDY0X3QgZmFpbGVkX2RldmljZXNbRElTS1NfQVJSQVlfRUxFTVNdOworCiAJCXJkZXZfZm9yX2VhY2gociwgJnJzLT5tZCkgewogCQkJc2IgPSBwYWdlX2FkZHJlc3Moci0+c2JfcGFnZSk7Ci0JCQlmYWlsZWRfZGV2aWNlcyA9IGxlNjRfdG9fY3B1KHNiLT5mYWlsZWRfZGV2aWNlcyk7Ci0JCQlmYWlsZWRfZGV2aWNlcyAmPSB+Y2xlYXJlZF9mYWlsZWRfZGV2aWNlczsKLQkJCXNiLT5mYWlsZWRfZGV2aWNlcyA9IGNwdV90b19sZTY0KGZhaWxlZF9kZXZpY2VzKTsKKwkJCXNiX3JldHJpZXZlX2ZhaWxlZF9kZXZpY2VzKHNiLCBmYWlsZWRfZGV2aWNlcyk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBESVNLU19BUlJBWV9FTEVNUzsgaSsrKQorCQkJCWZhaWxlZF9kZXZpY2VzW2ldICY9IH5jbGVhcmVkX2ZhaWxlZF9kZXZpY2VzW2ldOworCisJCQlzYl91cGRhdGVfZmFpbGVkX2RldmljZXMoc2IsIGZhaWxlZF9kZXZpY2VzKTsKIAkJfQogCX0KIH0KQEAgLTM2MTAsMjYgKzM2MzMsMTUgQEAKIAkJICogZGV2aWNlcyBhcmUgcmVhY2hhYmxlIGFnYWluLgogCQkgKi8KIAkJYXR0ZW1wdF9yZXN0b3JlX29mX2ZhdWx0eV9kZXZpY2VzKHJzKTsKLQl9IGVsc2UgewotCQltZGRldi0+cm8gPSAwOwotCQltZGRldi0+aW5fc3luYyA9IDA7Ci0KLQkJLyoKLQkJICogV2hlbiBwYXNzaW5nIGluIGZsYWdzIHRvIHRoZSBjdHIsIHdlIGV4cGVjdCB1c2Vyc3BhY2UKLQkJICogdG8gcmVzZXQgdGhlbSBiZWNhdXNlIHRoZXkgbWFkZSBpdCB0byB0aGUgc3VwZXJibG9ja3MKLQkJICogYW5kIHJlbG9hZCB0aGUgbWFwcGluZyBhbnl3YXkuCi0JCSAqCi0JCSAqIC0+IG9ubHkgdW5mcmVlemUgcmVjb3ZlcnkgaW4gY2FzZSBvZiBhIHRhYmxlIHJlbG9hZCBvcgotCQkgKiAgICB3ZSdsbCBoYXZlIGEgYm9ndXMgcmVjb3ZlcnkvcmVzaGFwZSBwb3NpdGlvbgotCQkgKiAgICByZXRyaWV2ZWQgZnJvbSB0aGUgc3VwZXJibG9jayBieSB0aGUgY3RyIGJlY2F1c2UKLQkJICogICAgdGhlIG9uZ29pbmcgcmVjb3ZlcnkvcmVzaGFwZSB3aWxsIGNoYW5nZSBpdCBhZnRlciByZWFkLgotCQkgKi8KLQkJaWYgKCF0ZXN0X2JpdChSVF9GTEFHX0tFRVBfUlNfRlJPWkVOLCAmcnMtPnJ1bnRpbWVfZmxhZ3MpKQotCQkJY2xlYXJfYml0KE1EX1JFQ09WRVJZX0ZST1pFTiwgJm1kZGV2LT5yZWNvdmVyeSk7Ci0KLQkJaWYgKG1kZGV2LT5zdXNwZW5kZWQpCi0JCQltZGRldl9yZXN1bWUobWRkZXYpOwogCX0KKworCW1kZGV2LT5ybyA9IDA7CisJbWRkZXYtPmluX3N5bmMgPSAwOworCisJY2xlYXJfYml0KE1EX1JFQ09WRVJZX0ZST1pFTiwgJm1kZGV2LT5yZWNvdmVyeSk7CisKKwlpZiAobWRkZXYtPnN1c3BlbmRlZCkKKwkJbWRkZXZfcmVzdW1lKG1kZGV2KTsKIH0KIAogc3RhdGljIHN0cnVjdCB0YXJnZXRfdHlwZSByYWlkX3RhcmdldCA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tcm91bmQtcm9iaW4uYyBiL2RyaXZlcnMvbWQvZG0tcm91bmQtcm9iaW4uYwppbmRleCA0YWNlMWRhLi42YzI1MjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXJvdW5kLXJvYmluLmMKKysrIGIvZHJpdmVycy9tZC9kbS1yb3VuZC1yb2Jpbi5jCkBAIC0yMTAsMTQgKzIxMCwxNyBAQAogCXN0cnVjdCBwYXRoX2luZm8gKnBpID0gTlVMTDsKIAlzdHJ1Y3QgZG1fcGF0aCAqY3VycmVudF9wYXRoID0gTlVMTDsKIAorCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAljdXJyZW50X3BhdGggPSAqdGhpc19jcHVfcHRyKHMtPmN1cnJlbnRfcGF0aCk7CiAJaWYgKGN1cnJlbnRfcGF0aCkgewogCQlwZXJjcHVfY291bnRlcl9kZWMoJnMtPnJlcGVhdF9jb3VudCk7Ci0JCWlmIChwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzLT5yZXBlYXRfY291bnQpID4gMCkKKwkJaWYgKHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoJnMtPnJlcGVhdF9jb3VudCkgPiAwKSB7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJCQlyZXR1cm4gY3VycmVudF9wYXRoOworCQl9CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJnMtPmxvY2spOwogCWlmICghbGlzdF9lbXB0eSgmcy0+dmFsaWRfcGF0aHMpKSB7CiAJCXBpID0gbGlzdF9lbnRyeShzLT52YWxpZF9wYXRocy5uZXh0LCBzdHJ1Y3QgcGF0aF9pbmZvLCBsaXN0KTsKIAkJbGlzdF9tb3ZlX3RhaWwoJnBpLT5saXN0LCAmcy0+dmFsaWRfcGF0aHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tZC1jbHVzdGVyLmMgYi9kcml2ZXJzL21kL21kLWNsdXN0ZXIuYwppbmRleCA0MTU3M2YxLi4zNGE4NDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL21kLWNsdXN0ZXIuYworKysgYi9kcml2ZXJzL21kL21kLWNsdXN0ZXIuYwpAQCAtODM0LDggKzgzNCwxMCBAQAogCQlnb3RvIGVycjsKIAl9CiAJY2luZm8tPmFja19sb2NrcmVzID0gbG9ja3Jlc19pbml0KG1kZGV2LCAiYWNrIiwgYWNrX2Jhc3QsIDApOwotCWlmICghY2luZm8tPmFja19sb2NrcmVzKQorCWlmICghY2luZm8tPmFja19sb2NrcmVzKSB7CisJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOworCX0KIAkvKiBnZXQgc3luYyBDUiBsb2NrIG9uIEFDSy4gKi8KIAlpZiAoZGxtX2xvY2tfc3luYyhjaW5mby0+YWNrX2xvY2tyZXMsIERMTV9MT0NLX0NSKSkKIAkJcHJfZXJyKCJtZC1jbHVzdGVyOiBmYWlsZWQgdG8gZ2V0IGEgc3luYyBDUiBsb2NrIG9uIEFDSyEoJWQpXG4iLApAQCAtODQ5LDggKzg1MSwxMCBAQAogCXByX2luZm8oIm1kLWNsdXN0ZXI6IEpvaW5lZCBjbHVzdGVyICVzIHNsb3QgJWRcbiIsIHN0ciwgY2luZm8tPnNsb3RfbnVtYmVyKTsKIAlzbnByaW50ZihzdHIsIDY0LCAiYml0bWFwJTA0ZCIsIGNpbmZvLT5zbG90X251bWJlciAtIDEpOwogCWNpbmZvLT5iaXRtYXBfbG9ja3JlcyA9IGxvY2tyZXNfaW5pdChtZGRldiwgc3RyLCBOVUxMLCAxKTsKLQlpZiAoIWNpbmZvLT5iaXRtYXBfbG9ja3JlcykKKwlpZiAoIWNpbmZvLT5iaXRtYXBfbG9ja3JlcykgeworCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKKwl9CiAJaWYgKGRsbV9sb2NrX3N5bmMoY2luZm8tPmJpdG1hcF9sb2NrcmVzLCBETE1fTE9DS19QVykpIHsKIAkJcHJfZXJyKCJGYWlsZWQgdG8gZ2V0IGJpdG1hcCBsb2NrXG4iKTsKIAkJcmV0ID0gLUVJTlZBTDsKQEAgLTg1OCw4ICs4NjIsMTAgQEAKIAl9CiAKIAljaW5mby0+cmVzeW5jX2xvY2tyZXMgPSBsb2NrcmVzX2luaXQobWRkZXYsICJyZXN5bmMiLCBOVUxMLCAwKTsKLQlpZiAoIWNpbmZvLT5yZXN5bmNfbG9ja3JlcykKKwlpZiAoIWNpbmZvLT5yZXN5bmNfbG9ja3JlcykgeworCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKKwl9CiAKIAlyZXR1cm4gMDsKIGVycjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwppbmRleCBkNjQ2ZjZlLi45MTVlODRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC0xNjA0LDExICsxNjA0LDggQEAKIAkJCW1kZGV2LT5uZXdfY2h1bmtfc2VjdG9ycyA9IG1kZGV2LT5jaHVua19zZWN0b3JzOwogCQl9CiAKLQkJaWYgKGxlMzJfdG9fY3B1KHNiLT5mZWF0dXJlX21hcCkgJiBNRF9GRUFUVVJFX0pPVVJOQUwpIHsKKwkJaWYgKGxlMzJfdG9fY3B1KHNiLT5mZWF0dXJlX21hcCkgJiBNRF9GRUFUVVJFX0pPVVJOQUwpCiAJCQlzZXRfYml0KE1EX0hBU19KT1VSTkFMLCAmbWRkZXYtPmZsYWdzKTsKLQkJCWlmIChtZGRldi0+cmVjb3ZlcnlfY3AgPT0gTWF4U2VjdG9yKQotCQkJCXNldF9iaXQoTURfSk9VUk5BTF9DTEVBTiwgJm1kZGV2LT5mbGFncyk7Ci0JCX0KIAl9IGVsc2UgaWYgKG1kZGV2LT5wZXJzID09IE5VTEwpIHsKIAkJLyogSW5zaXN0IG9mIGdvb2QgZXZlbnQgY291bnRlciB3aGlsZSBhc3NlbWJsaW5nLCBleGNlcHQgZm9yCiAJCSAqIHNwYXJlcyAod2hpY2ggZG9uJ3QgbmVlZCBhbiBldmVudCBjb3VudCkgKi8KQEAgLTU4NTEsNiArNTg0OCw5IEBACiAJCQl3b3JraW5nKys7CiAJCQlpZiAodGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSkKIAkJCQlpbnN5bmMrKzsKKwkJCWVsc2UgaWYgKHRlc3RfYml0KEpvdXJuYWwsICZyZGV2LT5mbGFncykpCisJCQkJLyogVE9ETzogYWRkIGpvdXJuYWwgY291bnQgdG8gbWRfdS5oICovCisJCQkJOwogCQkJZWxzZQogCQkJCXNwYXJlKys7CiAJCX0KQEAgLTc2MTAsMTYgKzc2MTAsMTIgQEAKIAogaW50IG1kX3NldHVwX2NsdXN0ZXIoc3RydWN0IG1kZGV2ICptZGRldiwgaW50IG5vZGVzKQogewotCWludCBlcnI7Ci0KLQllcnIgPSByZXF1ZXN0X21vZHVsZSgibWQtY2x1c3RlciIpOwotCWlmIChlcnIpIHsKLQkJcHJfZXJyKCJtZC1jbHVzdGVyIG1vZHVsZSBub3QgZm91bmQuXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCisJaWYgKCFtZF9jbHVzdGVyX29wcykKKwkJcmVxdWVzdF9tb2R1bGUoIm1kLWNsdXN0ZXIiKTsKIAlzcGluX2xvY2soJnBlcnNfbG9jayk7CisJLyogZW5zdXJlIG1vZHVsZSB3b24ndCBiZSB1bmxvYWRlZCAqLwogCWlmICghbWRfY2x1c3Rlcl9vcHMgfHwgIXRyeV9tb2R1bGVfZ2V0KG1kX2NsdXN0ZXJfbW9kKSkgeworCQlwcl9lcnIoImNhbid0IGZpbmQgbWQtY2x1c3RlciBtb2R1bGUgb3IgZ2V0IGl0J3MgcmVmZXJlbmNlLlxuIik7CiAJCXNwaW5fdW5sb2NrKCZwZXJzX2xvY2spOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CkBAIC03ODYyLDYgKzc4NTgsNyBAQAogCSAqLwogCiAJZG8geworCQlpbnQgbWRkZXYyX21pbm9yID0gLTE7CiAJCW1kZGV2LT5jdXJyX3Jlc3luYyA9IDI7CiAKIAl0cnlfYWdhaW46CkBAIC03ODkxLDEwICs3ODg4LDE0IEBACiAJCQkJcHJlcGFyZV90b193YWl0KCZyZXN5bmNfd2FpdCwgJndxLCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJCWlmICghdGVzdF9iaXQoTURfUkVDT1ZFUllfSU5UUiwgJm1kZGV2LT5yZWNvdmVyeSkgJiYKIAkJCQkgICAgbWRkZXYyLT5jdXJyX3Jlc3luYyA+PSBtZGRldi0+Y3Vycl9yZXN5bmMpIHsKLQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IGRlbGF5aW5nICVzIG9mICVzIgotCQkJCQkgICAgICAgIiB1bnRpbCAlcyBoYXMgZmluaXNoZWQgKHRoZXkiCi0JCQkJCSAgICAgICAiIHNoYXJlIG9uZSBvciBtb3JlIHBoeXNpY2FsIHVuaXRzKVxuIiwKLQkJCQkJICAgICAgIGRlc2MsIG1kbmFtZShtZGRldiksIG1kbmFtZShtZGRldjIpKTsKKwkJCQkJaWYgKG1kZGV2Ml9taW5vciAhPSBtZGRldjItPm1kX21pbm9yKSB7CisJCQkJCQltZGRldjJfbWlub3IgPSBtZGRldjItPm1kX21pbm9yOworCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IGRlbGF5aW5nICVzIG9mICVzIgorCQkJCQkJICAgICAgICIgdW50aWwgJXMgaGFzIGZpbmlzaGVkICh0aGV5IgorCQkJCQkJICAgICAgICIgc2hhcmUgb25lIG9yIG1vcmUgcGh5c2ljYWwgdW5pdHMpXG4iLAorCQkJCQkJICAgICAgIGRlc2MsIG1kbmFtZShtZGRldiksCisJCQkJCQkgICAgICAgbWRuYW1lKG1kZGV2MikpOworCQkJCQl9CiAJCQkJCW1kZGV2X3B1dChtZGRldjIpOwogCQkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQkJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwpAQCAtODI3NSwxNiArODI3NiwxMyBAQAogc3RhdGljIHZvaWQgbWRfc3RhcnRfc3luYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndzKQogewogCXN0cnVjdCBtZGRldiAqbWRkZXYgPSBjb250YWluZXJfb2Yod3MsIHN0cnVjdCBtZGRldiwgZGVsX3dvcmspOwotCWludCByZXQgPSAwOwogCiAJbWRkZXYtPnN5bmNfdGhyZWFkID0gbWRfcmVnaXN0ZXJfdGhyZWFkKG1kX2RvX3N5bmMsCiAJCQkJCQltZGRldiwKIAkJCQkJCSJyZXN5bmMiKTsKIAlpZiAoIW1kZGV2LT5zeW5jX3RocmVhZCkgewotCQlpZiAoIShtZGRldl9pc19jbHVzdGVyZWQobWRkZXYpICYmIHJldCA9PSAtRUFHQUlOKSkKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBzdGFydCByZXN5bmMiCi0JCQkgICAgICAgIiB0aHJlYWQuLi5cbiIsCi0JCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBzdGFydCByZXN5bmMgdGhyZWFkLi4uXG4iLAorCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7CiAJCS8qIGxlYXZlIHRoZSBzcGFyZXMgd2hlcmUgdGhleSBhcmUsIGl0IHNob3VsZG4ndCBodXJ0ICovCiAJCWNsZWFyX2JpdChNRF9SRUNPVkVSWV9TWU5DLCAmbWRkZXYtPnJlY292ZXJ5KTsKIAkJY2xlYXJfYml0KE1EX1JFQ09WRVJZX1JFU0hBUEUsICZtZGRldi0+cmVjb3ZlcnkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMTAuYyBiL2RyaXZlcnMvbWQvcmFpZDEwLmMKaW5kZXggMGU0ZWZjZC4uYmUxYTlmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMTAuYworKysgYi9kcml2ZXJzL21kL3JhaWQxMC5jCkBAIC0xMDY0LDYgKzEwNjQsOCBAQAogCWludCBtYXhfc2VjdG9yczsKIAlpbnQgc2VjdG9yczsKIAorCW1kX3dyaXRlX3N0YXJ0KG1kZGV2LCBiaW8pOworCiAJLyoKIAkgKiBSZWdpc3RlciB0aGUgbmV3IHJlcXVlc3QgYW5kIHdhaXQgaWYgdGhlIHJlY29uc3RydWN0aW9uCiAJICogdGhyZWFkIGhhcyBwdXQgdXAgYSBiYXIgZm9yIG5ldyByZXF1ZXN0cy4KQEAgLTE0NDUsOCArMTQ0Nyw2IEBACiAJCXJldHVybjsKIAl9CiAKLQltZF93cml0ZV9zdGFydChtZGRldiwgYmlvKTsKLQogCWRvIHsKIAogCQkvKgpAQCAtMjQ2NSwyMCArMjQ2NSwyMSBAQAogCiAJd2hpbGUgKHNlY3RfdG9fd3JpdGUpIHsKIAkJc3RydWN0IGJpbyAqd2JpbzsKKwkJc2VjdG9yX3Qgd3NlY3RvcjsKIAkJaWYgKHNlY3RvcnMgPiBzZWN0X3RvX3dyaXRlKQogCQkJc2VjdG9ycyA9IHNlY3RfdG9fd3JpdGU7CiAJCS8qIFdyaXRlIGF0ICdzZWN0b3InIGZvciAnc2VjdG9ycycgKi8KIAkJd2JpbyA9IGJpb19jbG9uZV9tZGRldihiaW8sIEdGUF9OT0lPLCBtZGRldik7CiAJCWJpb190cmltKHdiaW8sIHNlY3RvciAtIGJpby0+YmlfaXRlci5iaV9zZWN0b3IsIHNlY3RvcnMpOwotCQl3YmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IChyMTBfYmlvLT5kZXZzW2ldLmFkZHIrCi0JCQkJICAgY2hvb3NlX2RhdGFfb2Zmc2V0KHIxMF9iaW8sIHJkZXYpICsKLQkJCQkgICAoc2VjdG9yIC0gcjEwX2Jpby0+c2VjdG9yKSk7CisJCXdzZWN0b3IgPSByMTBfYmlvLT5kZXZzW2ldLmFkZHIgKyAoc2VjdG9yIC0gcjEwX2Jpby0+c2VjdG9yKTsKKwkJd2Jpby0+YmlfaXRlci5iaV9zZWN0b3IgPSB3c2VjdG9yICsKKwkJCQkgICBjaG9vc2VfZGF0YV9vZmZzZXQocjEwX2JpbywgcmRldik7CiAJCXdiaW8tPmJpX2JkZXYgPSByZGV2LT5iZGV2OwogCQliaW9fc2V0X29wX2F0dHJzKHdiaW8sIFJFUV9PUF9XUklURSwgMCk7CiAKIAkJaWYgKHN1Ym1pdF9iaW9fd2FpdCh3YmlvKSA8IDApCiAJCQkvKiBGYWlsdXJlISAqLwotCQkJb2sgPSByZGV2X3NldF9iYWRibG9ja3MocmRldiwgc2VjdG9yLAorCQkJb2sgPSByZGV2X3NldF9iYWRibG9ja3MocmRldiwgd3NlY3RvciwKIAkJCQkJCXNlY3RvcnMsIDApCiAJCQkJJiYgb2s7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDUtY2FjaGUuYyBiL2RyaXZlcnMvbWQvcmFpZDUtY2FjaGUuYwppbmRleCA1MWY3NmRkLi4xYjFhYjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQ1LWNhY2hlLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkNS1jYWNoZS5jCkBAIC05Niw3ICs5Niw2IEBACiAJc3BpbmxvY2tfdCBub19zcGFjZV9zdHJpcGVzX2xvY2s7CiAKIAlib29sIG5lZWRfY2FjaGVfZmx1c2g7Ci0JYm9vbCBpbl90ZWFyZG93bjsKIH07CiAKIC8qCkBAIC03MDQsMzEgKzcwMywyMiBAQAogCiAJbWRkZXYgPSBsb2ctPnJkZXYtPm1kZGV2OwogCS8qCi0JICogVGhpcyBpcyB0byBhdm9pZCBhIGRlYWRsb2NrLiByNWxfcXVpZXNjZSBob2xkcyByZWNvbmZpZ19tdXRleCBhbmQKLQkgKiB3YWl0IGZvciB0aGlzIHRocmVhZCB0byBmaW5pc2guIFRoaXMgdGhyZWFkIHdhaXRzIGZvcgotCSAqIE1EX0NIQU5HRV9QRU5ESU5HIGNsZWFyLCB3aGljaCBpcyBzdXBwb3NlZCB0byBiZSBkb25lIGluCi0JICogbWRfY2hlY2tfcmVjb3ZlcnkoKS4gbWRfY2hlY2tfcmVjb3ZlcnkoKSB0cmllcyB0byBnZXQKLQkgKiByZWNvbmZpZ19tdXRleC4gU2luY2UgcjVsX3F1aWVzY2UgYWxyZWFkeSBob2xkcyB0aGUgbXV0ZXgsCi0JICogbWRfY2hlY2tfcmVjb3ZlcnkoKSBmYWlscywgc28gdGhlIFBFTkRJTkcgbmV2ZXIgZ2V0IGNsZWFyZWQuIFRoZQotCSAqIGluX3RlYXJkb3duIGNoZWNrIHdvcmthcm91bmQgdGhpcyBpc3N1ZS4KKwkgKiBEaXNjYXJkIGNvdWxkIHplcm8gZGF0YSwgc28gYmVmb3JlIGRpc2NhcmQgd2UgbXVzdCBtYWtlIHN1cmUKKwkgKiBzdXBlcmJsb2NrIGlzIHVwZGF0ZWQgdG8gbmV3IGxvZyB0YWlsLiBVcGRhdGluZyBzdXBlcmJsb2NrIChlaXRoZXIKKwkgKiBkaXJlY3RseSBjYWxsIG1kX3VwZGF0ZV9zYigpIG9yIGRlcGVuZCBvbiBtZCB0aHJlYWQpIG11c3QgaG9sZAorCSAqIHJlY29uZmlnIG11dGV4LiBPbiB0aGUgb3RoZXIgaGFuZCwgcmFpZDVfcXVpZXNjZSBpcyBjYWxsZWQgd2l0aAorCSAqIHJlY29uZmlnX211dGV4IGhvbGQuIFRoZSBmaXJzdCBzdGVwIG9mIHJhaWQ1X3F1aWVzY2UoKSBpcyB3YWl0dGluZworCSAqIGZvciBhbGwgSU8gZmluaXNoLCBoZW5jZSB3YWl0dGluZyBmb3IgcmVjbGFpbSB0aHJlYWQsIHdoaWxlIHJlY2xhaW0KKwkgKiB0aHJlYWQgaXMgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGFuZCB3YWl0dGluZyBmb3IgcmVjb25maWcgbXV0ZXguIFNvCisJICogdGhlcmUgaXMgYSBkZWFkbG9jay4gV2Ugd29ya2Fyb3VuZCB0aGlzIGlzc3VlIHdpdGggYSB0cnlsb2NrLgorCSAqIEZJWE1FOiB3ZSBjb3VsZCBtaXNzIGRpc2NhcmQgaWYgd2UgY2FuJ3QgdGFrZSByZWNvbmZpZyBtdXRleAogCSAqLwotCWlmICghbG9nLT5pbl90ZWFyZG93bikgewotCQlzZXRfbWFza19iaXRzKCZtZGRldi0+ZmxhZ3MsIDAsCi0JCQkgICAgICBCSVQoTURfQ0hBTkdFX0RFVlMpIHwgQklUKE1EX0NIQU5HRV9QRU5ESU5HKSk7Ci0JCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7Ci0JCXdhaXRfZXZlbnQobWRkZXYtPnNiX3dhaXQsCi0JCQkhdGVzdF9iaXQoTURfQ0hBTkdFX1BFTkRJTkcsICZtZGRldi0+ZmxhZ3MpIHx8Ci0JCQlsb2ctPmluX3RlYXJkb3duKTsKLQkJLyoKLQkJICogcjVsX3F1aWVzY2UgY291bGQgcnVuIGFmdGVyIGluX3RlYXJkb3duIGNoZWNrIGFuZCBob2xkCi0JCSAqIG11dGV4IGZpcnN0LiBTdXBlcmJsb2NrIG1pZ2h0IGdldCB1cGRhdGVkIHR3aWNlLgotCQkgKi8KLQkJaWYgKGxvZy0+aW5fdGVhcmRvd24pCi0JCQltZF91cGRhdGVfc2IobWRkZXYsIDEpOwotCX0gZWxzZSB7Ci0JCVdBUk5fT04oIW1kZGV2X2lzX2xvY2tlZChtZGRldikpOwotCQltZF91cGRhdGVfc2IobWRkZXYsIDEpOwotCX0KKwlzZXRfbWFza19iaXRzKCZtZGRldi0+ZmxhZ3MsIDAsCisJCUJJVChNRF9DSEFOR0VfREVWUykgfCBCSVQoTURfQ0hBTkdFX1BFTkRJTkcpKTsKKwlpZiAoIW1kZGV2X3RyeWxvY2sobWRkZXYpKQorCQlyZXR1cm47CisJbWRfdXBkYXRlX3NiKG1kZGV2LCAxKTsKKwltZGRldl91bmxvY2sobWRkZXYpOwogCiAJLyogZGlzY2FyZCBJTyBlcnJvciByZWFsbHkgZG9lc24ndCBtYXR0ZXIsIGlnbm9yZSBpdCAqLwogCWlmIChsb2ctPmxhc3RfY2hlY2twb2ludCA8IGVuZCkgewpAQCAtODI3LDcgKzgxNyw2IEBACiAJaWYgKCFsb2cgfHwgc3RhdGUgPT0gMikKIAkJcmV0dXJuOwogCWlmIChzdGF0ZSA9PSAwKSB7Ci0JCWxvZy0+aW5fdGVhcmRvd24gPSAwOwogCQkvKgogCQkgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIGZvciBob3RhZGQuIEluIHN1c3BlbmQsIHRoZSBhcnJheSBoYXMKIAkJICogbm8gam91cm5hbC4gSW4gcmVzdW1lLCBqb3VybmFsIGlzIGluaXRpYWxpemVkIGFzIHdlbGwgYXMgdGhlCkBAIC04MzgsMTEgKzgyNyw2IEBACiAJCWxvZy0+cmVjbGFpbV90aHJlYWQgPSBtZF9yZWdpc3Rlcl90aHJlYWQocjVsX3JlY2xhaW1fdGhyZWFkLAogCQkJCQlsb2ctPnJkZXYtPm1kZGV2LCAicmVjbGFpbSIpOwogCX0gZWxzZSBpZiAoc3RhdGUgPT0gMSkgewotCQkvKgotCQkgKiBhdCB0aGlzIHBvaW50IGFsbCBzdHJpcGVzIGFyZSBmaW5pc2hlZCwgc28gaW9fdW5pdCBpcyBhdAotCQkgKiBsZWFzdCBpbiBTVFJJUEVfRU5EIHN0YXRlCi0JCSAqLwotCQlsb2ctPmluX3RlYXJkb3duID0gMTsKIAkJLyogbWFrZSBzdXJlIHI1bF93cml0ZV9zdXBlcl9hbmRfZGlzY2FyZF9zcGFjZSBleGl0cyAqLwogCQltZGRldiA9IGxvZy0+cmRldi0+bWRkZXY7CiAJCXdha2VfdXAoJm1kZGV2LT5zYl93YWl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDUuYyBiL2RyaXZlcnMvbWQvcmFpZDUuYwppbmRleCA4OTEyNDA3Li41Mjg3ZTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQ1LmMKKysrIGIvZHJpdmVycy9tZC9yYWlkNS5jCkBAIC02NTksNiArNjU5LDcgQEAKIHsKIAlzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoOwogCWludCBoYXNoID0gc3RyaXBlX2hhc2hfbG9ja3NfaGFzaChzZWN0b3IpOworCWludCBpbmNfZW1wdHlfaW5hY3RpdmVfbGlzdF9mbGFnOwogCiAJcHJfZGVidWcoImdldF9zdHJpcGUsIHNlY3RvciAlbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXNlY3Rvcik7CiAKQEAgLTcwMyw3ICs3MDQsMTIgQEAKIAkJCQkJYXRvbWljX2luYygmY29uZi0+YWN0aXZlX3N0cmlwZXMpOwogCQkJCUJVR19PTihsaXN0X2VtcHR5KCZzaC0+bHJ1KSAmJgogCQkJCSAgICAgICAhdGVzdF9iaXQoU1RSSVBFX0VYUEFORElORywgJnNoLT5zdGF0ZSkpOworCQkJCWluY19lbXB0eV9pbmFjdGl2ZV9saXN0X2ZsYWcgPSAwOworCQkJCWlmICghbGlzdF9lbXB0eShjb25mLT5pbmFjdGl2ZV9saXN0ICsgaGFzaCkpCisJCQkJCWluY19lbXB0eV9pbmFjdGl2ZV9saXN0X2ZsYWcgPSAxOwogCQkJCWxpc3RfZGVsX2luaXQoJnNoLT5scnUpOworCQkJCWlmIChsaXN0X2VtcHR5KGNvbmYtPmluYWN0aXZlX2xpc3QgKyBoYXNoKSAmJiBpbmNfZW1wdHlfaW5hY3RpdmVfbGlzdF9mbGFnKQorCQkJCQlhdG9taWNfaW5jKCZjb25mLT5lbXB0eV9pbmFjdGl2ZV9saXN0X25yKTsKIAkJCQlpZiAoc2gtPmdyb3VwKSB7CiAJCQkJCXNoLT5ncm91cC0+c3RyaXBlc19jbnQtLTsKIAkJCQkJc2gtPmdyb3VwID0gTlVMTDsKQEAgLTc2Miw2ICs3NjgsNyBAQAogCXNlY3Rvcl90IGhlYWRfc2VjdG9yLCB0bXBfc2VjOwogCWludCBoYXNoOwogCWludCBkZF9pZHg7CisJaW50IGluY19lbXB0eV9pbmFjdGl2ZV9saXN0X2ZsYWc7CiAKIAkvKiBEb24ndCBjcm9zcyBjaHVua3MsIHNvIHN0cmlwZSBwZF9pZHgvcWRfaWR4IGlzIHRoZSBzYW1lICovCiAJdG1wX3NlYyA9IHNoLT5zZWN0b3I7CkBAIC03NzksNyArNzg2LDEyIEBACiAJCQkJYXRvbWljX2luYygmY29uZi0+YWN0aXZlX3N0cmlwZXMpOwogCQkJQlVHX09OKGxpc3RfZW1wdHkoJmhlYWQtPmxydSkgJiYKIAkJCSAgICAgICAhdGVzdF9iaXQoU1RSSVBFX0VYUEFORElORywgJmhlYWQtPnN0YXRlKSk7CisJCQlpbmNfZW1wdHlfaW5hY3RpdmVfbGlzdF9mbGFnID0gMDsKKwkJCWlmICghbGlzdF9lbXB0eShjb25mLT5pbmFjdGl2ZV9saXN0ICsgaGFzaCkpCisJCQkJaW5jX2VtcHR5X2luYWN0aXZlX2xpc3RfZmxhZyA9IDE7CiAJCQlsaXN0X2RlbF9pbml0KCZoZWFkLT5scnUpOworCQkJaWYgKGxpc3RfZW1wdHkoY29uZi0+aW5hY3RpdmVfbGlzdCArIGhhc2gpICYmIGluY19lbXB0eV9pbmFjdGl2ZV9saXN0X2ZsYWcpCisJCQkJYXRvbWljX2luYygmY29uZi0+ZW1wdHlfaW5hY3RpdmVfbGlzdF9ucik7CiAJCQlpZiAoaGVhZC0+Z3JvdXApIHsKIAkJCQloZWFkLT5ncm91cC0+c3RyaXBlc19jbnQtLTsKIAkJCQloZWFkLT5ncm91cCA9IE5VTEw7CkBAIC05OTMsNyArMTAwNSw2IEBACiAKIAkJCXNldF9iaXQoU1RSSVBFX0lPX1NUQVJURUQsICZzaC0+c3RhdGUpOwogCi0JCQliaW9fcmVzZXQoYmkpOwogCQkJYmktPmJpX2JkZXYgPSByZGV2LT5iZGV2OwogCQkJYmlvX3NldF9vcF9hdHRycyhiaSwgb3AsIG9wX2ZsYWdzKTsKIAkJCWJpLT5iaV9lbmRfaW8gPSBvcF9pc193cml0ZShvcCkKQEAgLTEwNDUsNyArMTA1Niw2IEBACiAKIAkJCXNldF9iaXQoU1RSSVBFX0lPX1NUQVJURUQsICZzaC0+c3RhdGUpOwogCi0JCQliaW9fcmVzZXQocmJpKTsKIAkJCXJiaS0+YmlfYmRldiA9IHJyZGV2LT5iZGV2OwogCQkJYmlvX3NldF9vcF9hdHRycyhyYmksIG9wLCBvcF9mbGFncyk7CiAJCQlCVUdfT04oIW9wX2lzX3dyaXRlKG9wKSk7CkBAIC0xOTc4LDkgKzE5ODgsMTEgQEAKIAlwdXRfY3B1KCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3RyaXBlX2hlYWQgKmFsbG9jX3N0cmlwZShzdHJ1Y3Qga21lbV9jYWNoZSAqc2MsIGdmcF90IGdmcCkKK3N0YXRpYyBzdHJ1Y3Qgc3RyaXBlX2hlYWQgKmFsbG9jX3N0cmlwZShzdHJ1Y3Qga21lbV9jYWNoZSAqc2MsIGdmcF90IGdmcCwKKwlpbnQgZGlza3MpCiB7CiAJc3RydWN0IHN0cmlwZV9oZWFkICpzaDsKKwlpbnQgaTsKIAogCXNoID0ga21lbV9jYWNoZV96YWxsb2Moc2MsIGdmcCk7CiAJaWYgKHNoKSB7CkBAIC0xOTg5LDYgKzIwMDEsMTcgQEAKIAkJSU5JVF9MSVNUX0hFQUQoJnNoLT5iYXRjaF9saXN0KTsKIAkJSU5JVF9MSVNUX0hFQUQoJnNoLT5scnUpOwogCQlhdG9taWNfc2V0KCZzaC0+Y291bnQsIDEpOworCQlmb3IgKGkgPSAwOyBpIDwgZGlza3M7IGkrKykgeworCQkJc3RydWN0IHI1ZGV2ICpkZXYgPSAmc2gtPmRldltpXTsKKworCQkJYmlvX2luaXQoJmRldi0+cmVxKTsKKwkJCWRldi0+cmVxLmJpX2lvX3ZlYyA9ICZkZXYtPnZlYzsKKwkJCWRldi0+cmVxLmJpX21heF92ZWNzID0gMTsKKworCQkJYmlvX2luaXQoJmRldi0+cnJlcSk7CisJCQlkZXYtPnJyZXEuYmlfaW9fdmVjID0gJmRldi0+cnZlYzsKKwkJCWRldi0+cnJlcS5iaV9tYXhfdmVjcyA9IDE7CisJCX0KIAl9CiAJcmV0dXJuIHNoOwogfQpAQCAtMTk5Niw3ICsyMDE5LDcgQEAKIHsKIAlzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoOwogCi0Jc2ggPSBhbGxvY19zdHJpcGUoY29uZi0+c2xhYl9jYWNoZSwgZ2ZwKTsKKwlzaCA9IGFsbG9jX3N0cmlwZShjb25mLT5zbGFiX2NhY2hlLCBnZnAsIGNvbmYtPnBvb2xfc2l6ZSk7CiAJaWYgKCFzaCkKIAkJcmV0dXJuIDA7CiAKQEAgLTIxNjcsNyArMjE5MCw3IEBACiAJbXV0ZXhfbG9jaygmY29uZi0+Y2FjaGVfc2l6ZV9tdXRleCk7CiAKIAlmb3IgKGkgPSBjb25mLT5tYXhfbnJfc3RyaXBlczsgaTsgaS0tKSB7Ci0JCW5zaCA9IGFsbG9jX3N0cmlwZShzYywgR0ZQX0tFUk5FTCk7CisJCW5zaCA9IGFsbG9jX3N0cmlwZShzYywgR0ZQX0tFUk5FTCwgbmV3c2l6ZSk7CiAJCWlmICghbnNoKQogCQkJYnJlYWs7CiAKQEAgLTIyOTksNiArMjMyMiw3IEBACiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgaSwgYXRvbWljX3JlYWQoJnNoLT5jb3VudCksCiAJCWJpLT5iaV9lcnJvcik7CiAJaWYgKGkgPT0gZGlza3MpIHsKKwkJYmlvX3Jlc2V0KGJpKTsKIAkJQlVHKCk7CiAJCXJldHVybjsKIAl9CkBAIC0yMzk5LDYgKzI0MjMsNyBAQAogCQl9CiAJfQogCXJkZXZfZGVjX3BlbmRpbmcocmRldiwgY29uZi0+bWRkZXYpOworCWJpb19yZXNldChiaSk7CiAJY2xlYXJfYml0KFI1X0xPQ0tFRCwgJnNoLT5kZXZbaV0uZmxhZ3MpOwogCXNldF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7CiAJcmFpZDVfcmVsZWFzZV9zdHJpcGUoc2gpOwpAQCAtMjQzNiw2ICsyNDYxLDcgQEAKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBpLCBhdG9taWNfcmVhZCgmc2gtPmNvdW50KSwKIAkJYmktPmJpX2Vycm9yKTsKIAlpZiAoaSA9PSBkaXNrcykgeworCQliaW9fcmVzZXQoYmkpOwogCQlCVUcoKTsKIAkJcmV0dXJuOwogCX0KQEAgLTI0NzIsNiArMjQ5OCw3IEBACiAJaWYgKHNoLT5iYXRjaF9oZWFkICYmIGJpLT5iaV9lcnJvciAmJiAhcmVwbGFjZW1lbnQpCiAJCXNldF9iaXQoU1RSSVBFX0JBVENIX0VSUiwgJnNoLT5iYXRjaF9oZWFkLT5zdGF0ZSk7CiAKKwliaW9fcmVzZXQoYmkpOwogCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KFI1X0RPVUJMRV9MT0NLRUQsICZzaC0+ZGV2W2ldLmZsYWdzKSkKIAkJY2xlYXJfYml0KFI1X0xPQ0tFRCwgJnNoLT5kZXZbaV0uZmxhZ3MpOwogCXNldF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7CkBAIC0yNDg1LDE2ICsyNTEyLDYgQEAKIHsKIAlzdHJ1Y3QgcjVkZXYgKmRldiA9ICZzaC0+ZGV2W2ldOwogCi0JYmlvX2luaXQoJmRldi0+cmVxKTsKLQlkZXYtPnJlcS5iaV9pb192ZWMgPSAmZGV2LT52ZWM7Ci0JZGV2LT5yZXEuYmlfbWF4X3ZlY3MgPSAxOwotCWRldi0+cmVxLmJpX3ByaXZhdGUgPSBzaDsKLQotCWJpb19pbml0KCZkZXYtPnJyZXEpOwotCWRldi0+cnJlcS5iaV9pb192ZWMgPSAmZGV2LT5ydmVjOwotCWRldi0+cnJlcS5iaV9tYXhfdmVjcyA9IDE7Ci0JZGV2LT5ycmVxLmJpX3ByaXZhdGUgPSBzaDsKLQogCWRldi0+ZmxhZ3MgPSAwOwogCWRldi0+c2VjdG9yID0gcmFpZDVfY29tcHV0ZV9ibG9ja25yKHNoLCBpLCBwcmV2aW91cyk7CiB9CkBAIC00NjI4LDcgKzQ2NDUsOSBAQAogCX0KIAogCWlmICghYmlvX2xpc3RfZW1wdHkoJnMucmV0dXJuX2JpKSkgewotCQlpZiAodGVzdF9iaXQoTURfQ0hBTkdFX1BFTkRJTkcsICZjb25mLT5tZGRldi0+ZmxhZ3MpKSB7CisJCWlmICh0ZXN0X2JpdChNRF9DSEFOR0VfUEVORElORywgJmNvbmYtPm1kZGV2LT5mbGFncykgJiYKKwkJCQkocy5mYWlsZWQgPD0gY29uZi0+bWF4X2RlZ3JhZGVkIHx8CisJCQkJCWNvbmYtPm1kZGV2LT5leHRlcm5hbCA9PSAwKSkgewogCQkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwogCQkJYmlvX2xpc3RfbWVyZ2UoJmNvbmYtPnJldHVybl9iaSwgJnMucmV0dXJuX2JpKTsKIAkJCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwpAQCAtNjMzMCwyMiArNjM0OSwyMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHJhaWQ0NTZfY3B1X2RlYWQodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCit7CisJc3RydWN0IHI1Y29uZiAqY29uZiA9IGhsaXN0X2VudHJ5X3NhZmUobm9kZSwgc3RydWN0IHI1Y29uZiwgbm9kZSk7CisKKwlmcmVlX3NjcmF0Y2hfYnVmZmVyKGNvbmYsIHBlcl9jcHVfcHRyKGNvbmYtPnBlcmNwdSwgY3B1KSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIHJhaWQ1X2ZyZWVfcGVyY3B1KHN0cnVjdCByNWNvbmYgKmNvbmYpCiB7Ci0JdW5zaWduZWQgbG9uZyBjcHU7Ci0KIAlpZiAoIWNvbmYtPnBlcmNwdSkKIAkJcmV0dXJuOwogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0JdW5yZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmNvbmYtPmNwdV9ub3RpZnkpOwotI2VuZGlmCi0KLQlnZXRfb25saW5lX2NwdXMoKTsKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQotCQlmcmVlX3NjcmF0Y2hfYnVmZmVyKGNvbmYsIHBlcl9jcHVfcHRyKGNvbmYtPnBlcmNwdSwgY3B1KSk7Ci0JcHV0X29ubGluZV9jcHVzKCk7Ci0KKwljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2UoQ1BVSFBfTURfUkFJRDVfUFJFUEFSRSwgJmNvbmYtPm5vZGUpOwogCWZyZWVfcGVyY3B1KGNvbmYtPnBlcmNwdSk7CiB9CiAKQEAgLTYzNjQsNjQgKzYzODEsMjggQEAKIAlrZnJlZShjb25mKTsKIH0KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotc3RhdGljIGludCByYWlkNDU2X2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAotCQkJICAgICAgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgcmFpZDQ1Nl9jcHVfdXBfcHJlcGFyZSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKIHsKLQlzdHJ1Y3QgcjVjb25mICpjb25mID0gY29udGFpbmVyX29mKG5mYiwgc3RydWN0IHI1Y29uZiwgY3B1X25vdGlmeSk7Ci0JbG9uZyBjcHUgPSAobG9uZyloY3B1OworCXN0cnVjdCByNWNvbmYgKmNvbmYgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCByNWNvbmYsIG5vZGUpOwogCXN0cnVjdCByYWlkNV9wZXJjcHUgKnBlcmNwdSA9IHBlcl9jcHVfcHRyKGNvbmYtPnBlcmNwdSwgY3B1KTsKIAotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRToKLQljYXNlIENQVV9VUF9QUkVQQVJFX0ZST1pFTjoKLQkJaWYgKGFsbG9jX3NjcmF0Y2hfYnVmZmVyKGNvbmYsIHBlcmNwdSkpIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgY3B1JWxkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBjcHUpOwotCQkJcmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8oLUVOT01FTSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDUFVfREVBRDoKLQljYXNlIENQVV9ERUFEX0ZST1pFTjoKLQljYXNlIENQVV9VUF9DQU5DRUxFRDoKLQljYXNlIENQVV9VUF9DQU5DRUxFRF9GUk9aRU46Ci0JCWZyZWVfc2NyYXRjaF9idWZmZXIoY29uZiwgcGVyX2NwdV9wdHIoY29uZi0+cGVyY3B1LCBjcHUpKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7CisJaWYgKGFsbG9jX3NjcmF0Y2hfYnVmZmVyKGNvbmYsIHBlcmNwdSkpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIG1lbW9yeSBhbGxvY2F0aW9uIGZvciBjcHUldVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjcHUpOworCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKKwlyZXR1cm4gMDsKIH0KLSNlbmRpZgogCiBzdGF0aWMgaW50IHJhaWQ1X2FsbG9jX3BlcmNwdShzdHJ1Y3QgcjVjb25mICpjb25mKQogewotCXVuc2lnbmVkIGxvbmcgY3B1OwogCWludCBlcnIgPSAwOwogCiAJY29uZi0+cGVyY3B1ID0gYWxsb2NfcGVyY3B1KHN0cnVjdCByYWlkNV9wZXJjcHUpOwogCWlmICghY29uZi0+cGVyY3B1KQogCQlyZXR1cm4gLUVOT01FTTsKIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCWNvbmYtPmNwdV9ub3RpZnkubm90aWZpZXJfY2FsbCA9IHJhaWQ0NTZfY3B1X25vdGlmeTsKLQljb25mLT5jcHVfbm90aWZ5LnByaW9yaXR5ID0gMDsKLQllcnIgPSByZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmNvbmYtPmNwdV9ub3RpZnkpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0jZW5kaWYKLQotCWdldF9vbmxpbmVfY3B1cygpOwotCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgewotCQllcnIgPSBhbGxvY19zY3JhdGNoX2J1ZmZlcihjb25mLCBwZXJfY3B1X3B0cihjb25mLT5wZXJjcHUsIGNwdSkpOwotCQlpZiAoZXJyKSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgbWVtb3J5IGFsbG9jYXRpb24gZm9yIGNwdSVsZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgY3B1KTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXB1dF9vbmxpbmVfY3B1cygpOwotCisJZXJyID0gY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlKENQVUhQX01EX1JBSUQ1X1BSRVBBUkUsICZjb25mLT5ub2RlKTsKIAlpZiAoIWVycikgewogCQljb25mLT5zY3JpYmJsZV9kaXNrcyA9IG1heChjb25mLT5yYWlkX2Rpc2tzLAogCQkJY29uZi0+cHJldmlvdXNfcmFpZF9kaXNrcyk7CkBAIC02NjIwLDYgKzY2MDEsMTYgQEAKIAl9CiAKIAljb25mLT5taW5fbnJfc3RyaXBlcyA9IE5SX1NUUklQRVM7CisJaWYgKG1kZGV2LT5yZXNoYXBlX3Bvc2l0aW9uICE9IE1heFNlY3RvcikgeworCQlpbnQgc3RyaXBlcyA9IG1heF90KGludCwKKwkJCSgobWRkZXYtPmNodW5rX3NlY3RvcnMgPDwgOSkgLyBTVFJJUEVfU0laRSkgKiA0LAorCQkJKChtZGRldi0+bmV3X2NodW5rX3NlY3RvcnMgPDwgOSkgLyBTVFJJUEVfU0laRSkgKiA0KTsKKwkJY29uZi0+bWluX25yX3N0cmlwZXMgPSBtYXgoTlJfU1RSSVBFUywgc3RyaXBlcyk7CisJCWlmIChjb25mLT5taW5fbnJfc3RyaXBlcyAhPSBOUl9TVFJJUEVTKQorCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSJtZC9yYWlkOiVzOiBmb3JjZSBzdHJpcGUgc2l6ZSAlZCBmb3IgcmVzaGFwZVxuIiwKKwkJCQltZG5hbWUobWRkZXYpLCBjb25mLT5taW5fbnJfc3RyaXBlcyk7CisJfQogCW1lbW9yeSA9IGNvbmYtPm1pbl9ucl9zdHJpcGVzICogKHNpemVvZihzdHJ1Y3Qgc3RyaXBlX2hlYWQpICsKIAkJIG1heF9kaXNrcyAqICgoc2l6ZW9mKHN0cnVjdCBiaW8pICsgUEFHRV9TSVpFKSkpIC8gMTAyNDsKIAlhdG9taWNfc2V0KCZjb25mLT5lbXB0eV9pbmFjdGl2ZV9saXN0X25yLCBOUl9TVFJJUEVfSEFTSF9MT0NLUyk7CkBAIC02ODI2LDExICs2ODE3LDE0IEBACiAJaWYgKElTX0VSUihjb25mKSkKIAkJcmV0dXJuIFBUUl9FUlIoY29uZik7CiAKLQlpZiAodGVzdF9iaXQoTURfSEFTX0pPVVJOQUwsICZtZGRldi0+ZmxhZ3MpICYmICFqb3VybmFsX2RldikgewotCQlwcmludGsoS0VSTl9FUlIgIm1kL3JhaWQ6JXM6IGpvdXJuYWwgZGlzayBpcyBtaXNzaW5nLCBmb3JjZSBhcnJheSByZWFkb25seVxuIiwKLQkJICAgICAgIG1kbmFtZShtZGRldikpOwotCQltZGRldi0+cm8gPSAxOwotCQlzZXRfZGlza19ybyhtZGRldi0+Z2VuZGlzaywgMSk7CisJaWYgKHRlc3RfYml0KE1EX0hBU19KT1VSTkFMLCAmbWRkZXYtPmZsYWdzKSkgeworCQlpZiAoIWpvdXJuYWxfZGV2KSB7CisJCQlwcl9lcnIoIm1kL3JhaWQ6JXM6IGpvdXJuYWwgZGlzayBpcyBtaXNzaW5nLCBmb3JjZSBhcnJheSByZWFkb25seVxuIiwKKwkJCSAgICAgICBtZG5hbWUobWRkZXYpKTsKKwkJCW1kZGV2LT5ybyA9IDE7CisJCQlzZXRfZGlza19ybyhtZGRldi0+Z2VuZGlzaywgMSk7CisJCX0gZWxzZSBpZiAobWRkZXYtPnJlY292ZXJ5X2NwID09IE1heFNlY3RvcikKKwkJCXNldF9iaXQoTURfSk9VUk5BTF9DTEVBTiwgJm1kZGV2LT5mbGFncyk7CiAJfQogCiAJY29uZi0+bWluX29mZnNldF9kaWZmID0gbWluX29mZnNldF9kaWZmOwpAQCAtNzk1MywxMCArNzk0NywyMSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCByYWlkNV9pbml0KHZvaWQpCiB7CisJaW50IHJldDsKKwogCXJhaWQ1X3dxID0gYWxsb2Nfd29ya3F1ZXVlKCJyYWlkNXdxIiwKIAkJV1FfVU5CT1VORHxXUV9NRU1fUkVDTEFJTXxXUV9DUFVfSU5URU5TSVZFfFdRX1NZU0ZTLCAwKTsKIAlpZiAoIXJhaWQ1X3dxKQogCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX211bHRpKENQVUhQX01EX1JBSUQ1X1BSRVBBUkUsCisJCQkJICAgICAgIm1kL3JhaWQ1OnByZXBhcmUiLAorCQkJCSAgICAgIHJhaWQ0NTZfY3B1X3VwX3ByZXBhcmUsCisJCQkJICAgICAgcmFpZDQ1Nl9jcHVfZGVhZCk7CisJaWYgKHJldCkgeworCQlkZXN0cm95X3dvcmtxdWV1ZShyYWlkNV93cSk7CisJCXJldHVybiByZXQ7CisJfQogCXJlZ2lzdGVyX21kX3BlcnNvbmFsaXR5KCZyYWlkNl9wZXJzb25hbGl0eSk7CiAJcmVnaXN0ZXJfbWRfcGVyc29uYWxpdHkoJnJhaWQ1X3BlcnNvbmFsaXR5KTsKIAlyZWdpc3Rlcl9tZF9wZXJzb25hbGl0eSgmcmFpZDRfcGVyc29uYWxpdHkpOwpAQCAtNzk2OCw2ICs3OTczLDcgQEAKIAl1bnJlZ2lzdGVyX21kX3BlcnNvbmFsaXR5KCZyYWlkNl9wZXJzb25hbGl0eSk7CiAJdW5yZWdpc3Rlcl9tZF9wZXJzb25hbGl0eSgmcmFpZDVfcGVyc29uYWxpdHkpOwogCXVucmVnaXN0ZXJfbWRfcGVyc29uYWxpdHkoJnJhaWQ0X3BlcnNvbmFsaXR5KTsKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoQ1BVSFBfTURfUkFJRDVfUFJFUEFSRSk7CiAJZGVzdHJveV93b3JrcXVldWUocmFpZDVfd3EpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ1LmggYi9kcml2ZXJzL21kL3JhaWQ1LmgKaW5kZXggNTE3ZDRiNi4uNTdlYzQ5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNS5oCisrKyBiL2RyaXZlcnMvbWQvcmFpZDUuaApAQCAtNTEyLDkgKzUxMiw3IEBACiAJfSBfX3BlcmNwdSAqcGVyY3B1OwogCWludCBzY3JpYmJsZV9kaXNrczsKIAlpbnQgc2NyaWJibGVfc2VjdG9yczsKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sJY3B1X25vdGlmeTsKLSNlbmRpZgorCXN0cnVjdCBobGlzdF9ub2RlIG5vZGU7CiAKIAkvKgogCSAqIEZyZWUgc3RyaXBlcyBwb29sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NlYy1lZGlkLmMgYi9kcml2ZXJzL21lZGlhL2NlYy1lZGlkLmMKaW5kZXggNzAwMTgyNC4uNTcxOWI5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jZWMtZWRpZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY2VjLWVkaWQuYwpAQCAtNzAsNyArNzAsMTAgQEAKIAkJCQl1OCB0YWcgPSBlZGlkW2ldID4+IDU7CiAJCQkJdTggbGVuID0gZWRpZFtpXSAmIDB4MWY7CiAKLQkJCQlpZiAodGFnID09IDMgJiYgbGVuID49IDUgJiYgaSArIGxlbiA8PSBlbmQpCisJCQkJaWYgKHRhZyA9PSAzICYmIGxlbiA+PSA1ICYmIGkgKyBsZW4gPD0gZW5kICYmCisJCQkJICAgIGVkaWRbaSArIDFdID09IDB4MDMgJiYKKwkJCQkgICAgZWRpZFtpICsgMl0gPT0gMHgwYyAmJgorCQkJCSAgICBlZGlkW2kgKyAzXSA9PSAweDAwKQogCQkJCQlyZXR1cm4gaSArIDQ7CiAJCQkJaSArPSBsZW4gKyAxOwogCQkJfSB3aGlsZSAoaSA8IGVuZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvcnRsMjgzMl9zZHIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9ydGwyODMyX3Nkci5jCmluZGV4IDZlMjJhZjMuLmUwMzhlODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9ydGwyODMyX3Nkci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9ydGwyODMyX3Nkci5jCkBAIC0zOTIsNyArMzkyLDYgQEAKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiYWxsb2MgdXJiPSVkXG4iLCBpKTsKIAkJZGV2LT51cmJfbGlzdFtpXSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CiAJCWlmICghZGV2LT51cmJfbGlzdFtpXSkgewotCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiZmFpbGVkXG4iKTsKIAkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCiAJCQkJdXNiX2ZyZWVfdXJiKGRldi0+dXJiX2xpc3Rbal0pOwogCQkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BjaS9jeDIzODg1L2N4MjM4ODUtNDE3LmMgYi9kcml2ZXJzL21lZGlhL3BjaS9jeDIzODg1L2N4MjM4ODUtNDE3LmMKaW5kZXggZWZlYzJkMS4uNGQwODBkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvY3gyMzg4NS9jeDIzODg1LTQxNy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL2N4MjM4ODUvY3gyMzg4NS00MTcuYwpAQCAtMTU1Miw2ICsxNTUyLDcgQEAKIAlxLT5tZW1fb3BzID0gJnZiMl9kbWFfc2dfbWVtb3BzOwogCXEtPnRpbWVzdGFtcF9mbGFncyA9IFY0TDJfQlVGX0ZMQUdfVElNRVNUQU1QX01PTk9UT05JQzsKIAlxLT5sb2NrID0gJmRldi0+bG9jazsKKwlxLT5kZXYgPSAmZGV2LT5wY2ktPmRldjsKIAogCWVyciA9IHZiMl9xdWV1ZV9pbml0KHEpOwogCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCmluZGV4IGRiOTg3ZTUuLjU5YTRiNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTcxMzQtZHZiLmMKQEAgLTEyMzgsNiArMTIzOCw3IEBACiAJcS0+YnVmX3N0cnVjdF9zaXplID0gc2l6ZW9mKHN0cnVjdCBzYWE3MTM0X2J1Zik7CiAJcS0+dGltZXN0YW1wX2ZsYWdzID0gVjRMMl9CVUZfRkxBR19USU1FU1RBTVBfTU9OT1RPTklDOwogCXEtPmxvY2sgPSAmZGV2LT5sb2NrOworCXEtPmRldiA9ICZkZXYtPnBjaS0+ZGV2OwogCXJldCA9IHZiMl9xdWV1ZV9pbml0KHEpOwogCWlmIChyZXQpIHsKIAkJdmIyX2R2Yl9kZWFsbG9jX2Zyb250ZW5kcygmZGV2LT5mcm9udGVuZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYyBiL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMKaW5kZXggY2E0MTdhNC4uNzkxYTUxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTcxMzQtZW1wcmVzcy5jCkBAIC0yOTUsNiArMjk1LDcgQEAKIAlxLT5idWZfc3RydWN0X3NpemUgPSBzaXplb2Yoc3RydWN0IHNhYTcxMzRfYnVmKTsKIAlxLT50aW1lc3RhbXBfZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX1RJTUVTVEFNUF9NT05PVE9OSUM7CiAJcS0+bG9jayA9ICZkZXYtPmxvY2s7CisJcS0+ZGV2ID0gJmRldi0+cGNpLT5kZXY7CiAJZXJyID0gdmIyX3F1ZXVlX2luaXQocSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vS2NvbmZpZwppbmRleCBmMjUzNDRiLi41NTJiNjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9LY29uZmlnCkBAIC0xNjksNyArMTY5LDcgQEAKIGNvbmZpZyBWSURFT19NRURJQVRFS19WQ09ERUMKIAl0cmlzdGF0ZSAiTWVkaWF0ZWsgVmlkZW8gQ29kZWMgZHJpdmVyIgogCWRlcGVuZHMgb24gTVRLX0lPTU1VIHx8IENPTVBJTEVfVEVTVAotCWRlcGVuZHMgb24gVklERU9fREVWICYmIFZJREVPX1Y0TDIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBWSURFT19WNEwyICYmIEhBU19ETUEKIAlkZXBlbmRzIG9uIEFSQ0hfTUVESUFURUsgfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IFZJREVPQlVGMl9ETUFfQ09OVElHCiAJc2VsZWN0IFY0TDJfTUVNMk1FTV9ERVYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2Rydi5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZHJ2LmgKaW5kZXggOTRmMGE0Mi4uM2E4ZTY5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZHJ2LmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZHJ2LmgKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWNvcmUuaD4KIAotI2luY2x1ZGUgIm10a192Y29kZWNfdXRpbC5oIgogCiAjZGVmaW5lIE1US19WQ09ERUNfRFJWX05BTUUJIm10a192Y29kZWNfZHJ2IgogI2RlZmluZSBNVEtfVkNPREVDX0VOQ19OQU1FCSJtdGstdmNvZGVjLWVuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2VuYy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jLmMKaW5kZXggM2VkM2YyZC4uMmM1NzE5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jLmMKQEAgLTQ4Nyw3ICs0ODcsNiBAQAogCXN0cnVjdCBtdGtfcV9kYXRhICpxX2RhdGE7CiAJaW50IHJldCwgaTsKIAlzdHJ1Y3QgbXRrX3ZpZGVvX2ZtdCAqZm10OwotCXVuc2lnbmVkIGludCBwaXRjaF93X2RpdjE2OwogCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXhfZm10X21wID0gJmYtPmZtdC5waXhfbXA7CiAKIAl2cSA9IHY0bDJfbTJtX2dldF92cShjdHgtPm0ybV9jdHgsIGYtPnR5cGUpOwpAQCAtNTMwLDE1ICs1MjksNiBAQAogCXFfZGF0YS0+Y29kZWRfd2lkdGggPSBmLT5mbXQucGl4X21wLndpZHRoOwogCXFfZGF0YS0+Y29kZWRfaGVpZ2h0ID0gZi0+Zm10LnBpeF9tcC5oZWlnaHQ7CiAKLQlwaXRjaF93X2RpdjE2ID0gRElWX1JPVU5EX1VQKHFfZGF0YS0+dmlzaWJsZV93aWR0aCwgMTYpOwotCWlmIChwaXRjaF93X2RpdjE2ICUgOCAhPSAwKSB7Ci0JCS8qIEFkanVzdCByZXR1cm5lZCB3aWR0aC9oZWlnaHQsIHNvIGFwcGxpY2F0aW9uIGNvdWxkIGNvcnJlY3RseQotCQkgKiBhbGxvY2F0ZSBodyByZXF1aXJlZCBtZW1vcnkKLQkJICovCi0JCXFfZGF0YS0+dmlzaWJsZV9oZWlnaHQgKz0gMzI7Ci0JCXZpZGlvY190cnlfZm10KGYsIHFfZGF0YS0+Zm10KTsKLQl9Ci0KIAlxX2RhdGEtPmZpZWxkID0gZi0+Zm10LnBpeF9tcC5maWVsZDsKIAljdHgtPmNvbG9yc3BhY2UgPSBmLT5mbXQucGl4X21wLmNvbG9yc3BhY2U7CiAJY3R4LT55Y2Jjcl9lbmMgPSBmLT5mbXQucGl4X21wLnljYmNyX2VuYzsKQEAgLTg3OCw3ICs4NjgsOCBAQAogewogCXN0cnVjdCBtdGtfdmNvZGVjX2N0eCAqY3R4ID0gcHJpdjsKIAlpbnQgcmV0OwotCXN0cnVjdCB2YjJfYnVmZmVyICpkc3RfYnVmOworCXN0cnVjdCB2YjJfYnVmZmVyICpzcmNfYnVmLCAqZHN0X2J1ZjsKKwlzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyICpkc3RfdmIyX3Y0bDIsICpzcmNfdmIyX3Y0bDI7CiAJc3RydWN0IG10a192Y29kZWNfbWVtIGJzX2J1ZjsKIAlzdHJ1Y3QgdmVuY19kb25lX3Jlc3VsdCBlbmNfcmVzdWx0OwogCkBAIC05MTEsNiArOTAyLDE1IEBACiAJCW10a192NGwyX2VycigidmVuY19pZl9lbmNvZGUgZmFpbGVkPSVkIiwgcmV0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCXNyY19idWYgPSB2NGwyX20ybV9uZXh0X3NyY19idWYoY3R4LT5tMm1fY3R4KTsKKwlpZiAoc3JjX2J1ZikgeworCQlzcmNfdmIyX3Y0bDIgPSB0b192YjJfdjRsMl9idWZmZXIoc3JjX2J1Zik7CisJCWRzdF92YjJfdjRsMiA9IHRvX3ZiMl92NGwyX2J1ZmZlcihkc3RfYnVmKTsKKwkJZHN0X2J1Zi0+dGltZXN0YW1wID0gc3JjX2J1Zi0+dGltZXN0YW1wOworCQlkc3RfdmIyX3Y0bDItPnRpbWVjb2RlID0gc3JjX3ZiMl92NGwyLT50aW1lY29kZTsKKwl9IGVsc2UgeworCQltdGtfdjRsMl9lcnIoIk5vIHRpbWVzdGFtcCBmb3IgdGhlIGhlYWRlciBidWZmZXIuIik7CisJfQogCiAJY3R4LT5zdGF0ZSA9IE1US19TVEFURV9IRUFERVI7CiAJZHN0X2J1Zi0+cGxhbmVzWzBdLmJ5dGVzdXNlZCA9IGVuY19yZXN1bHQuYnNfc2l6ZTsKQEAgLTEwMDMsNyArMTAwMyw3IEBACiAJc3RydWN0IG10a192Y29kZWNfbWVtIGJzX2J1ZjsKIAlzdHJ1Y3QgdmVuY19kb25lX3Jlc3VsdCBlbmNfcmVzdWx0OwogCWludCByZXQsIGk7Ci0Jc3RydWN0IHZiMl92NGwyX2J1ZmZlciAqdmIyX3Y0bDI7CisJc3RydWN0IHZiMl92NGwyX2J1ZmZlciAqZHN0X3ZiMl92NGwyLCAqc3JjX3ZiMl92NGwyOwogCiAJLyogY2hlY2sgZHN0X2J1ZiwgZHN0X2J1ZiBtYXkgYmUgcmVtb3ZlZCBpbiBkZXZpY2VfcnVuCiAJICogdG8gc3RvcmVkIGVuY2RvZSBoZWFkZXIgc28gd2UgbmVlZCBjaGVjayBkc3RfYnVmIGFuZApAQCAtMTA0Myw5ICsxMDQzLDE0IEBACiAJcmV0ID0gdmVuY19pZl9lbmNvZGUoY3R4LCBWRU5DX1NUQVJUX09QVF9FTkNPREVfRlJBTUUsCiAJCQkgICAgICZmcm1fYnVmLCAmYnNfYnVmLCAmZW5jX3Jlc3VsdCk7CiAKLQl2YjJfdjRsMiA9IGNvbnRhaW5lcl9vZihkc3RfYnVmLCBzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyLCB2YjJfYnVmKTsKKwlzcmNfdmIyX3Y0bDIgPSB0b192YjJfdjRsMl9idWZmZXIoc3JjX2J1Zik7CisJZHN0X3ZiMl92NGwyID0gdG9fdmIyX3Y0bDJfYnVmZmVyKGRzdF9idWYpOworCisJZHN0X2J1Zi0+dGltZXN0YW1wID0gc3JjX2J1Zi0+dGltZXN0YW1wOworCWRzdF92YjJfdjRsMi0+dGltZWNvZGUgPSBzcmNfdmIyX3Y0bDItPnRpbWVjb2RlOworCiAJaWYgKGVuY19yZXN1bHQuaXNfa2V5X2ZybSkKLQkJdmIyX3Y0bDItPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfS0VZRlJBTUU7CisJCWRzdF92YjJfdjRsMi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19LRVlGUkFNRTsKIAogCWlmIChyZXQpIHsKIAkJdjRsMl9tMm1fYnVmX2RvbmUodG9fdmIyX3Y0bDJfYnVmZmVyKHNyY19idWYpLApAQCAtMTIxNyw3ICsxMjIyLDcgQEAKIAkJCTAsIFY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9TRVBBUkFURSk7CiAJdjRsMl9jdHJsX25ld19zdGRfbWVudShoYW5kbGVyLCBvcHMsIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QUk9GSUxFLAogCQkJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdILAotCQkJMCwgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9NQUlOKTsKKwkJCTAsIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSCk7CiAJdjRsMl9jdHJsX25ld19zdGRfbWVudShoYW5kbGVyLCBvcHMsIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MRVZFTCwKIAkJCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMiwKIAkJCTAsIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMCk7CkBAIC0xMjg4LDUgKzEyOTMsMTAgQEAKIAogdm9pZCBtdGtfdmNvZGVjX2VuY19yZWxlYXNlKHN0cnVjdCBtdGtfdmNvZGVjX2N0eCAqY3R4KQogewotCXZlbmNfaWZfZGVpbml0KGN0eCk7CisJaW50IHJldCA9IHZlbmNfaWZfZGVpbml0KGN0eCk7CisKKwlpZiAocmV0KQorCQltdGtfdjRsMl9lcnIoInZlbmNfaWZfZGVpbml0IGZhaWxlZD0lZCIsIHJldCk7CisKKwljdHgtPnN0YXRlID0gTVRLX1NUQVRFX0ZSRUU7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19lbmNfZHJ2LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19lbmNfZHJ2LmMKaW5kZXggYzc4MDZlYy4uNWNkMjE1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jX2Rydi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2VuY19kcnYuYwpAQCAtMjE4LDExICsyMTgsMTUgQEAKIAltdGtfdjRsMl9kZWJ1ZygxLCAiWyVkXSBlbmNvZGVyIiwgY3R4LT5pZCk7CiAJbXV0ZXhfbG9jaygmZGV2LT5kZXZfbXV0ZXgpOwogCisJLyoKKwkgKiBDYWxsIHY0bDJfbTJtX2N0eF9yZWxlYXNlIHRvIG1ha2Ugc3VyZSB0aGUgd29ya2VyIHRocmVhZCBpcyBub3QKKwkgKiBydW5uaW5nIGFmdGVyIHZlbmNfaWZfZGVpbml0LgorCSAqLworCXY0bDJfbTJtX2N0eF9yZWxlYXNlKGN0eC0+bTJtX2N0eCk7CiAJbXRrX3Zjb2RlY19lbmNfcmVsZWFzZShjdHgpOwogCXY0bDJfZmhfZGVsKCZjdHgtPmZoKTsKIAl2NGwyX2ZoX2V4aXQoJmN0eC0+ZmgpOwogCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJmN0eC0+Y3RybF9oZGwpOwotCXY0bDJfbTJtX2N0eF9yZWxlYXNlKGN0eC0+bTJtX2N0eCk7CiAKIAlsaXN0X2RlbF9pbml0KCZjdHgtPmxpc3QpOwogCWRldi0+bnVtX2luc3RhbmNlcy0tOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfaW50ci5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfaW50ci5oCmluZGV4IDMzZTg5MGYuLjEyMTMxODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2ludHIuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19pbnRyLmgKQEAgLTE2LDcgKzE2LDYgQEAKICNkZWZpbmUgX01US19WQ09ERUNfSU5UUl9IXwogCiAjZGVmaW5lIE1US19JTlNUX0lSUV9SRUNFSVZFRAkJMHgxCi0jZGVmaW5lIE1US19JTlNUX1dPUktfVEhSRUFEX0FCT1JUX0RPTkUJMHgyCiAKIHN0cnVjdCBtdGtfdmNvZGVjX2N0eDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZlbmMvdmVuY19oMjY0X2lmLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmVuYy92ZW5jX2gyNjRfaWYuYwppbmRleCA5YTYwMDUyLi42M2Q0YmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmVuYy92ZW5jX2gyNjRfaWYuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmVuYy92ZW5jX2gyNjRfaWYuYwpAQCAtNjEsNiArNjEsOCBAQAogCiAvKgogICogc3RydWN0IHZlbmNfaDI2NF92cHVfY29uZmlnIC0gU3RydWN0dXJlIGZvciBoMjY0IGVuY29kZXIgY29uZmlndXJhdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVAtVy9SIDogQVAgaXMgd3JpdGVyL3JlYWRlciBvbiB0aGlzIGl0ZW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQVS1XL1I6IFZQVSBpcyB3cml0ZS9yZWFkZXIgb24gdGhpcyBpdGVtCiAgKiBAaW5wdXRfZm91cmNjOiBpbnB1dCBmb3VyY2MKICAqIEBiaXRyYXRlOiB0YXJnZXQgYml0cmF0ZSAoaW4gYnBzKQogICogQHBpY193OiBwaWN0dXJlIHdpZHRoLiBQaWN0dXJlIHNpemUgaXMgdmlzaWJsZSBzdHJlYW0gcmVzb2x1dGlvbiwgaW4gcGl4ZWxzLApAQCAtOTQsMTMgKzk2LDEzIEBACiAKIC8qCiAgKiBzdHJ1Y3QgdmVuY19oMjY0X3ZwdV9idWYgLSBTdHJ1Y3R1cmUgZm9yIGJ1ZmZlciBpbmZvcm1hdGlvbgotICogQGFsaWduOiBidWZmZXIgYWxpZ25tZW50IChpbiBieXRlcykKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQLVcvUiA6IEFQIGlzIHdyaXRlci9yZWFkZXIgb24gdGhpcyBpdGVtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUFUtVy9SOiBWUFUgaXMgd3JpdGUvcmVhZGVyIG9uIHRoaXMgaXRlbQogICogQGlvdmE6IElPIHZpcnR1YWwgYWRkcmVzcwogICogQHZwdWE6IFZQVSBzaWRlIG1lbW9yeSBhZGRyIHdoaWNoIGlzIHVzZWQgYnkgUkNfQ09ERQogICogQHNpemU6IGJ1ZmZlciBzaXplIChpbiBieXRlcykKICAqLwogc3RydWN0IHZlbmNfaDI2NF92cHVfYnVmIHsKLQl1MzIgYWxpZ247CiAJdTMyIGlvdmE7CiAJdTMyIHZwdWE7CiAJdTMyIHNpemU7CkBAIC0xMDgsNiArMTEwLDggQEAKIAogLyoKICAqIHN0cnVjdCB2ZW5jX2gyNjRfdnNpIC0gU3RydWN0dXJlIGZvciBWUFUgZHJpdmVyIGNvbnRyb2wgYW5kIGluZm8gc2hhcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgQVAtVy9SIDogQVAgaXMgd3JpdGVyL3JlYWRlciBvbiB0aGlzIGl0ZW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgVlBVLVcvUjogVlBVIGlzIHdyaXRlL3JlYWRlciBvbiB0aGlzIGl0ZW0KICAqIFRoaXMgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBpbiBWUFUgc2lkZSBhbmQgc2hhcmVkIHRvIEFQIHNpZGUuCiAgKiBAY29uZmlnOiBoMjY0IGVuY29kZXIgY29uZmlndXJhdGlvbgogICogQHdvcmtfYnVmczogd29ya2luZyBidWZmZXIgaW5mb3JtYXRpb24gaW4gVlBVIHNpZGUKQEAgLTE1MCwxMiArMTU0LDYgQEAKIAlzdHJ1Y3QgbXRrX3Zjb2RlY19jdHggKmN0eDsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBoMjY0X3dyaXRlX3JlZyhzdHJ1Y3QgdmVuY19oMjY0X2luc3QgKmluc3QsIHUzMiBhZGRyLAotCQkJCSAgdTMyIHZhbCkKLXsKLQl3cml0ZWwodmFsLCBpbnN0LT5od19iYXNlICsgYWRkcik7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdTMyIGgyNjRfcmVhZF9yZWcoc3RydWN0IHZlbmNfaDI2NF9pbnN0ICppbnN0LCB1MzIgYWRkcikKIHsKIAlyZXR1cm4gcmVhZGwoaW5zdC0+aHdfYmFzZSArIGFkZHIpOwpAQCAtMjE0LDYgKzIxMiw4IEBACiAJCXJldHVybiA0MDsKIAljYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMToKIAkJcmV0dXJuIDQxOworCWNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8yOgorCQlyZXR1cm4gNDI7CiAJZGVmYXVsdDoKIAkJbXRrX3Zjb2RlY19kZWJ1ZyhpbnN0LCAidW5zdXBwb3J0ZWQgbGV2ZWwgJWQiLCBsZXZlbCk7CiAJCXJldHVybiAzMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZW5jL3ZlbmNfdnA4X2lmLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmVuYy92ZW5jX3ZwOF9pZi5jCmluZGV4IDYwYmJjZDIuLjZkOTc1ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZW5jL3ZlbmNfdnA4X2lmLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZlbmMvdmVuY192cDhfaWYuYwpAQCAtNTYsNiArNTYsOCBAQAogCiAvKgogICogc3RydWN0IHZlbmNfdnA4X3ZwdV9jb25maWcgLSBTdHJ1Y3R1cmUgZm9yIHZwOCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVAtVy9SIDogQVAgaXMgd3JpdGVyL3JlYWRlciBvbiB0aGlzIGl0ZW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlBVLVcvUjogVlBVIGlzIHdyaXRlL3JlYWRlciBvbiB0aGlzIGl0ZW0KICAqIEBpbnB1dF9mb3VyY2M6IGlucHV0IGZvdXJjYwogICogQGJpdHJhdGU6IHRhcmdldCBiaXRyYXRlIChpbiBicHMpCiAgKiBAcGljX3c6IHBpY3R1cmUgd2lkdGguIFBpY3R1cmUgc2l6ZSBpcyB2aXNpYmxlIHN0cmVhbSByZXNvbHV0aW9uLCBpbiBwaXhlbHMsCkBAIC04MywxNCArODUsMTQgQEAKIH07CiAKIC8qCi0gKiBzdHJ1Y3QgdmVuY192cDhfdnB1X2J1ZiAtU3RydWN0dXJlIGZvciBidWZmZXIgaW5mb3JtYXRpb24KLSAqIEBhbGlnbjogYnVmZmVyIGFsaWdubWVudCAoaW4gYnl0ZXMpCisgKiBzdHJ1Y3QgdmVuY192cDhfdnB1X2J1ZiAtIFN0cnVjdHVyZSBmb3IgYnVmZmVyIGluZm9ybWF0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQLVcvUiA6IEFQIGlzIHdyaXRlci9yZWFkZXIgb24gdGhpcyBpdGVtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQVS1XL1I6IFZQVSBpcyB3cml0ZS9yZWFkZXIgb24gdGhpcyBpdGVtCiAgKiBAaW92YTogSU8gdmlydHVhbCBhZGRyZXNzCiAgKiBAdnB1YTogVlBVIHNpZGUgbWVtb3J5IGFkZHIgd2hpY2ggaXMgdXNlZCBieSBSQ19DT0RFCiAgKiBAc2l6ZTogYnVmZmVyIHNpemUgKGluIGJ5dGVzKQogICovCiBzdHJ1Y3QgdmVuY192cDhfdnB1X2J1ZiB7Ci0JdTMyIGFsaWduOwogCXUzMiBpb3ZhOwogCXUzMiB2cHVhOwogCXUzMiBzaXplOwpAQCAtOTgsNiArMTAwLDggQEAKIAogLyoKICAqIHN0cnVjdCB2ZW5jX3ZwOF92c2kgLSBTdHJ1Y3R1cmUgZm9yIFZQVSBkcml2ZXIgY29udHJvbCBhbmQgaW5mbyBzaGFyZQorICogICAgICAgICAgICAgICAgICAgICAgIEFQLVcvUiA6IEFQIGlzIHdyaXRlci9yZWFkZXIgb24gdGhpcyBpdGVtCisgKiAgICAgICAgICAgICAgICAgICAgICAgVlBVLVcvUjogVlBVIGlzIHdyaXRlL3JlYWRlciBvbiB0aGlzIGl0ZW0KICAqIFRoaXMgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBpbiBWUFUgc2lkZSBhbmQgc2hhcmVkIHRvIEFQIHNpZGUuCiAgKiBAY29uZmlnOiB2cDggZW5jb2RlciBjb25maWd1cmF0aW9uCiAgKiBAd29ya19idWZzOiB3b3JraW5nIGJ1ZmZlciBpbmZvcm1hdGlvbiBpbiBWUFUgc2lkZQpAQCAtMTM4LDEyICsxNDIsNiBAQAogCXN0cnVjdCBtdGtfdmNvZGVjX2N0eCAqY3R4OwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIHZwOF9lbmNfd3JpdGVfcmVnKHN0cnVjdCB2ZW5jX3ZwOF9pbnN0ICppbnN0LCB1MzIgYWRkciwKLQkJCQkgICAgIHUzMiB2YWwpCi17Ci0Jd3JpdGVsKHZhbCwgaW5zdC0+aHdfYmFzZSArIGFkZHIpOwotfQotCiBzdGF0aWMgaW5saW5lIHUzMiB2cDhfZW5jX3JlYWRfcmVnKHN0cnVjdCB2ZW5jX3ZwOF9pbnN0ICppbnN0LCB1MzIgYWRkcikKIHsKIAlyZXR1cm4gcmVhZGwoaW5zdC0+aHdfYmFzZSArIGFkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9yY2FyLWZjcC5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9yY2FyLWZjcC5jCmluZGV4IDZhN2JjYzMuLmJjNTBjNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vcmNhci1mY3AuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3JjYXItZmNwLmMKQEAgLTk5LDEwICs5OSwxNiBAQAogICovCiBpbnQgcmNhcl9mY3BfZW5hYmxlKHN0cnVjdCByY2FyX2ZjcF9kZXZpY2UgKmZjcCkKIHsKKwlpbnQgZXJyb3I7CisKIAlpZiAoIWZjcCkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gcG1fcnVudGltZV9nZXRfc3luYyhmY3AtPmRldik7CisJZXJyb3IgPSBwbV9ydW50aW1lX2dldF9zeW5jKGZjcC0+ZGV2KTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJjYXJfZmNwX2VuYWJsZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC11c2IuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC11c2IuYwppbmRleCAwOTFkNzkzLi40YjEzMmMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtdXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LXVzYi5jCkBAIC02MjcsNyArNjI3LDYgQEAKIAogCXJhZGlvLT5pbnRfaW5fdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJhZGlvLT5pbnRfaW5fdXJiKSB7Ci0JCWRldl9pbmZvKCZpbnRmLT5kZXYsICJjb3VsZCBub3QgYWxsb2NhdGUgaW50X2luX3VyYiIpOwogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9pbnRidWZmZXI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pbW9uLmMgYi9kcml2ZXJzL21lZGlhL3JjL2ltb24uYwppbmRleCA2NWY4MGI4Li44NmNjNzBmZTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2ltb24uYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2ltb24uYwpAQCAtMjIxMSwxNiArMjIxMSwxMSBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCXJ4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyeF91cmIpIHsKLQkJZGV2X2VycihkZXYsICIlczogdXNiX2FsbG9jX3VyYiBmYWlsZWQgZm9yIElSIHVyYiIsIF9fZnVuY19fKTsKKwlpZiAoIXJ4X3VyYikKIAkJZ290byByeF91cmJfYWxsb2NfZmFpbGVkOwotCX0KIAl0eF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghdHhfdXJiKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHVzYl9hbGxvY191cmIgZmFpbGVkIGZvciBkaXNwbGF5IHVyYiIsCi0JCQlfX2Z1bmNfXyk7CisJaWYgKCF0eF91cmIpCiAJCWdvdG8gdHhfdXJiX2FsbG9jX2ZhaWxlZDsKLQl9CiAKIAltdXRleF9pbml0KCZpY3R4LT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmaWN0eC0+a2NfbG9jayk7CkBAIC0yMzA1LDEwICsyMzAwLDggQEAKIAlpbnQgcmV0ID0gLUVOT01FTTsKIAogCXJ4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyeF91cmIpIHsKLQkJcHJfZXJyKCJ1c2JfYWxsb2NfdXJiIGZhaWxlZCBmb3IgSVIgdXJiXG4iKTsKKwlpZiAoIXJ4X3VyYikKIAkJZ290byByeF91cmJfYWxsb2NfZmFpbGVkOwotCX0KIAogCW11dGV4X2xvY2soJmljdHgtPmxvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL3JlZHJhdDMuYyBiL2RyaXZlcnMvbWVkaWEvcmMvcmVkcmF0My5jCmluZGV4IDM5OWY0NGQuLmVjODAxNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvcmVkcmF0My5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvcmVkcmF0My5jCkBAIC05NzAsMTAgKzk3MCw4IEBACiAKIAkvKiBzZXQgdXAgYnVsay1pbiBlbmRwb2ludCAqLwogCXJyMy0+cmVhZF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghcnIzLT5yZWFkX3VyYikgewotCQlkZXZfZXJyKGRldiwgIlJlYWQgdXJiIGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisJaWYgKCFycjMtPnJlYWRfdXJiKQogCQlnb3RvIGVycm9yOwotCX0KIAogCXJyMy0+ZXBfaW4gPSBlcF9pbjsKIAlycjMtPmJ1bGtfaW5fYnVmID0gdXNiX2FsbG9jX2NvaGVyZW50KHVkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9haXJzcHkvYWlyc3B5LmMgYi9kcml2ZXJzL21lZGlhL3VzYi9haXJzcHkvYWlyc3B5LmMKaW5kZXggZmUwMzFiMC4uM2M1NTZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvYWlyc3B5L2FpcnNweS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2FpcnNweS9haXJzcHkuYwpAQCAtNDI2LDcgKzQyNiw2IEBACiAJCWRldl9kYmcocy0+ZGV2LCAiYWxsb2MgdXJiPSVkXG4iLCBpKTsKIAkJcy0+dXJiX2xpc3RbaV0gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwogCQlpZiAoIXMtPnVyYl9saXN0W2ldKSB7Ci0JCQlkZXZfZGJnKHMtPmRldiwgImZhaWxlZFxuIik7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQogCQkJCXVzYl9mcmVlX3VyYihzLT51cmJfbGlzdFtqXSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2FzMTAyL2FzMTAyX3VzYl9kcnYuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2FzMTAyL2FzMTAyX3VzYl9kcnYuYwppbmRleCAwZTgwMzBjLi42OGMzYTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9hczEwMi9hczEwMl91c2JfZHJ2LmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvYXMxMDIvYXMxMDJfdXNiX2Rydi5jCkBAIC0yNzAsOCArMjcwLDYgQEAKIAogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwogCQlpZiAodXJiID09IE5VTEwpIHsKLQkJCWRldl9kYmcoJmRldi0+YnVzX2FkYXAudXNiX2Rldi0+ZGV2LAotCQkJCSIlczogdXNiX2FsbG9jX3VyYiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAkJCWFzMTAyX2ZyZWVfdXNiX3N0cmVhbV9idWZmZXIoZGV2KTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9hdTA4MjgvYXUwODI4LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9hdTA4MjgvYXUwODI4LXZpZGVvLmMKaW5kZXggODJiMDI2OS4uMTNiODM4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvYXUwODI4L2F1MDgyOC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2F1MDgyOC9hdTA4MjgtdmlkZW8uYwpAQCAtMjQ1LDcgKzI0NSw2IEBACiAJZm9yIChpID0gMDsgaSA8IGRldi0+aXNvY19jdGwubnVtX2J1ZnM7IGkrKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKG1heF9wYWNrZXRzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWF1MDgyOF9pc29jZGJnKCJjYW5ub3QgYWxsb2MgaXNvY19jdGwudXJiICVpXG4iLCBpKTsKIAkJCWF1MDgyOF91bmluaXRfaXNvYyhkZXYpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2NwaWEyL2NwaWEyX3VzYi5jIGIvZHJpdmVycy9tZWRpYS91c2IvY3BpYTIvY3BpYTJfdXNiLmMKaW5kZXggYzFhYTFhYi4uMTM2MjBjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvY3BpYTIvY3BpYTJfdXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvY3BpYTIvY3BpYTJfdXNiLmMKQEAgLTY2Miw3ICs2NjIsNiBAQAogCQl9CiAJCXVyYiA9IHVzYl9hbGxvY191cmIoRlJBTUVTX1BFUl9ERVNDLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCUVSUigiJXM6IHVzYl9hbGxvY191cmIgZXJyb3IhXG4iLCBfX2Z1bmNfXyk7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQogCQkJCXVzYl9mcmVlX3VyYihjYW0tPnNidWZbal0udXJiKTsKIAkJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LWF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtYXVkaW8uYwppbmRleCBhNmE5NTA4Li40Y2Q1ZmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtYXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtYXVkaW8uYwpAQCAtMjkzLDcgKzI5Myw2IEBACiAJCW1lbXNldChkZXYtPmFkZXYudHJhbnNmZXJfYnVmZmVyW2ldLCAweDgwLCBzYl9zaXplKTsKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihDWDIzMVhYX0lTT19OVU1fQVVESU9fUEFDS0VUUywgR0ZQX0FUT01JQyk7CiAJCWlmICghdXJiKSB7Ci0JCQlkZXZfZXJyKGRldi0+ZGV2LCAidXNiX2FsbG9jX3VyYiBmYWlsZWQhXG4iKTsKIAkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKIAkJCQl1c2JfZnJlZV91cmIoZGV2LT5hZGV2LnVyYltqXSk7CiAJCQkJa2ZyZWUoZGV2LT5hZGV2LnRyYW5zZmVyX2J1ZmZlcltqXSk7CkBAIC0zNTUsNyArMzU0LDYgQEAKIAkJbWVtc2V0KGRldi0+YWRldi50cmFuc2Zlcl9idWZmZXJbaV0sIDB4ODAsIHNiX3NpemUpOwogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKENYMjMxWFhfTlVNX0FVRElPX1BBQ0tFVFMsIEdGUF9BVE9NSUMpOwogCQlpZiAoIXVyYikgewotCQkJZGV2X2VycihkZXYtPmRldiwgInVzYl9hbGxvY191cmIgZmFpbGVkIVxuIik7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CiAJCQkJdXNiX2ZyZWVfdXJiKGRldi0+YWRldi51cmJbal0pOwogCQkJCWtmcmVlKGRldi0+YWRldi50cmFuc2Zlcl9idWZmZXJbal0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvY3gyMzF4eC1jb3JlLmMKaW5kZXggNjMwZjRmYy4uOGVjMDVjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtY29yZS5jCkBAIC0xMDM1LDggKzEwMzUsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPnZpZGVvX21vZGUuaXNvY19jdGwubnVtX2J1ZnM7IGkrKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKG1heF9wYWNrZXRzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWRldl9lcnIoZGV2LT5kZXYsCi0JCQkJImNhbm5vdCBhbGxvYyBpc29jX2N0bC51cmIgJWlcbiIsIGkpOwogCQkJY3gyMzF4eF91bmluaXRfaXNvYyhkZXYpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTExNzIsOCArMTE3MCw2IEBACiAJZm9yIChpID0gMDsgaSA8IGRldi0+dmlkZW9fbW9kZS5idWxrX2N0bC5udW1fYnVmczsgaSsrKSB7CiAJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7Ci0JCQlkZXZfZXJyKGRldi0+ZGV2LAotCQkJCSJjYW5ub3QgYWxsb2MgYnVsa19jdGwudXJiICVpXG4iLCBpKTsKIAkJCWN4MjMxeHhfdW5pbml0X2J1bGsoZGV2KTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtdmJpLmMKaW5kZXggMTViYjU3My4uNzZlOTAxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LXZiaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvY3gyMzF4eC12YmkuYwpAQCAtNDQyLDggKzQ0Miw2IEBACiAKIAkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWRldl9lcnIoZGV2LT5kZXYsCi0JCQkJImNhbm5vdCBhbGxvYyBidWxrX2N0bC51cmIgJWlcbiIsIGkpOwogCQkJY3gyMzF4eF91bmluaXRfdmJpX2lzb2MoZGV2KTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiL2RpYjA3MDBfY29yZS5jIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi9kaWIwNzAwX2NvcmUuYwppbmRleCBiZjg5MGMzLi4yNjc5Nzk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiL2RpYjA3MDBfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2IvZGliMDcwMF9jb3JlLmMKQEAgLTc4MywxMCArNzgzLDggQEAKIAkvKiBTdGFydGluZyBpbiBmaXJtd2FyZSAxLjIwLCB0aGUgUkMgaW5mbyBpcyBwcm92aWRlZCBvbiBhIGJ1bGsgcGlwZSAqLwogCiAJcHVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHB1cmIgPT0gTlVMTCkgewotCQllcnIoInJjIHVzYiBhbGxvYyB1cmIgZmFpbGVkIik7CisJaWYgKHB1cmIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcHVyYi0+dHJhbnNmZXJfYnVmZmVyID0ga3phbGxvYyhSQ19NU0dfU0laRV9WMV8yMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKHB1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWF1ZGlvLmMKaW5kZXggNDlhNWY5NS4uNzhmMzY4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1hdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtYXVkaW8uYwpAQCAtODUwLDcgKzg1MCw2IEBACiAKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihucGFja2V0cywgR0ZQX0FUT01JQyk7CiAJCWlmICghdXJiKSB7Ci0JCQllbTI4eHhfZXJyZGV2KCJ1c2JfYWxsb2NfdXJiIGZhaWxlZCFcbiIpOwogCQkJZW0yOHh4X2F1ZGlvX2ZyZWVfdXJiKGRldik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWNvcmUuYwppbmRleCAzNzQ1NjA3Li5lZWJkNWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWNvcmUuYwpAQCAtOTM0LDcgKzkzNCw2IEBACiAJZm9yIChpID0gMDsgaSA8IHVzYl9idWZzLT5udW1fYnVmczsgaSsrKSB7CiAJCXVyYiA9IHVzYl9hbGxvY191cmIodXNiX2J1ZnMtPm51bV9wYWNrZXRzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWVtMjh4eF9lcnIoImNhbm5vdCBhbGxvYyB1c2JfY3RsLnVyYiAlaVxuIiwgaSk7CiAJCQllbTI4eHhfdW5pbml0X3VzYl94ZmVyKGRldiwgbW9kZSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZ3NwY2EvYmVucS5jIGIvZHJpdmVycy9tZWRpYS91c2IvZ3NwY2EvYmVucS5jCmluZGV4IDc5MGJhZWQuLjVmYTY3YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2dzcGNhL2JlbnEuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9nc3BjYS9iZW5xLmMKQEAgLTk1LDEwICs5NSw4IEBACiAjZGVmaW5lIFNEX05QS1QgMzIKIAlmb3IgKG4gPSAwOyBuIDwgNDsgbisrKSB7CiAJCXVyYiA9IHVzYl9hbGxvY191cmIoU0RfTlBLVCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdXJiKSB7Ci0JCQlwcl9lcnIoInVzYl9hbGxvY191cmIgZmFpbGVkXG4iKTsKKwkJaWYgKCF1cmIpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJfQogCQlnc3BjYV9kZXYtPnVyYltuXSA9IHVyYjsKIAkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSB1c2JfYWxsb2NfY29oZXJlbnQoZ3NwY2FfZGV2LT5kZXYsCiAJCQkJCQlTRF9QS1RfU1ogKiBTRF9OUEtULApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZ3NwY2EvZ3NwY2EuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2dzcGNhL2dzcGNhLmMKaW5kZXggYjE3YmQ3ZS4uYWYyMzk1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvZ3NwY2EvZ3NwY2EuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9nc3BjYS9nc3BjYS5jCkBAIC03OTUsMTAgKzc5NSw4IEBACiAKIAlmb3IgKG4gPSAwOyBuIDwgbnVyYnM7IG4rKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKG5wa3QsIEdGUF9LRVJORUwpOwotCQlpZiAoIXVyYikgewotCQkJcHJfZXJyKCJ1c2JfYWxsb2NfdXJiIGZhaWxlZFxuIik7CisJCWlmICghdXJiKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KIAkJZ3NwY2FfZGV2LT51cmJbbl0gPSB1cmI7CiAJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdXNiX2FsbG9jX2NvaGVyZW50KGdzcGNhX2Rldi0+ZGV2LAogCQkJCQkJYnNpemUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9nc3BjYS9rb25pY2EuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2dzcGNhL2tvbmljYS5jCmluZGV4IDA3MTJiMWIuLjQwYWFhYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2dzcGNhL2tvbmljYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2dzcGNhL2tvbmljYS5jCkBAIC0yMDgsMTAgKzIwOCw4IEBACiAJCXBhY2tldF9zaXplID0KIAkJCWxlMTZfdG9fY3B1KGFsdC0+ZW5kcG9pbnRbaV0uZGVzYy53TWF4UGFja2V0U2l6ZSk7CiAJCXVyYiA9IHVzYl9hbGxvY191cmIoU0RfTlBLVCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdXJiKSB7Ci0JCQlwcl9lcnIoInVzYl9hbGxvY191cmIgZmFpbGVkXG4iKTsKKwkJaWYgKCF1cmIpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJfQogCQlnc3BjYV9kZXYtPnVyYltuXSA9IHVyYjsKIAkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSB1c2JfYWxsb2NfY29oZXJlbnQoZ3NwY2FfZGV2LT5kZXYsCiAJCQkJCQlwYWNrZXRfc2l6ZSAqIFNEX05QS1QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9oYWNrcmYvaGFja3JmLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9oYWNrcmYvaGFja3JmLmMKaW5kZXggYjFlMjI5YS4uYzJjOGQxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvaGFja3JmL2hhY2tyZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2hhY2tyZi9oYWNrcmYuYwpAQCAtNjkxLDcgKzY5MSw2IEBACiAJCWRldl9kYmcoZGV2LT5kZXYsICJhbGxvYyB1cmI9JWRcbiIsIGkpOwogCQlkZXYtPnVyYl9saXN0W2ldID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFkZXYtPnVyYl9saXN0W2ldKSB7Ci0JCQlkZXZfZGJnKGRldi0+ZGV2LCAiZmFpbGVkXG4iKTsKIAkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCiAJCQkJdXNiX2ZyZWVfdXJiKGRldi0+dXJiX2xpc3Rbal0pOwogCQkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9oZHB2ci9oZHB2ci12aWRlby5jIGIvZHJpdmVycy9tZWRpYS91c2IvaGRwdnIvaGRwdnItdmlkZW8uYwppbmRleCAyYTNhOGI0Li42ZDQzZDc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9oZHB2ci9oZHB2ci12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2hkcHZyL2hkcHZyLXZpZGVvLmMKQEAgLTE1NSwxMCArMTU1LDggQEAKIAkJYnVmLT5kZXYgPSBkZXY7CiAKIAkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF1cmIpIHsKLQkJCXY0bDJfZXJyKCZkZXYtPnY0bDJfZGV2LCAiY2Fubm90IGFsbG9jYXRlIHVyYlxuIik7CisJCWlmICghdXJiKQogCQkJZ290byBleGl0X3VyYjsKLQkJfQogCQlidWYtPnVyYiA9IHVyYjsKIAogCQltZW0gPSB1c2JfYWxsb2NfY29oZXJlbnQoZGV2LT51ZGV2LCBkZXYtPmJ1bGtfaW5fc2l6ZSwgR0ZQX0tFUk5FTCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL21zaTI1MDAvbXNpMjUwMC5jIGIvZHJpdmVycy9tZWRpYS91c2IvbXNpMjUwMC9tc2kyNTAwLmMKaW5kZXggZTdmMTY3ZC4uMzY3ZWI3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvbXNpMjUwMC9tc2kyNTAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvbXNpMjUwMC9tc2kyNTAwLmMKQEAgLTUwOSw3ICs1MDksNiBAQAogCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKElTT19GUkFNRVNfUEVSX0RFU0MsIEdGUF9LRVJORUwpOwogCQlpZiAodXJiID09IE5VTEwpIHsKLQkJCWRldl9lcnIoZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgdXJiICVkXG4iLCBpKTsKIAkJCW1zaTI1MDBfaXNvY19jbGVhbnVwKGRldik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvcHdjL3B3Yy1pZi5jIGIvZHJpdmVycy9tZWRpYS91c2IvcHdjL3B3Yy1pZi5jCmluZGV4IGI1MWIyN2EuLmM0NDU0YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL3B3Yy9wd2MtaWYuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9wd2MvcHdjLWlmLmMKQEAgLTQxMCw3ICs0MTAsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKElTT19GUkFNRVNfUEVSX0RFU0MsIEdGUF9LRVJORUwpOwogCQlpZiAodXJiID09IE5VTEwpIHsKLQkJCVBXQ19FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIHVyYiAlZFxuIiwgaSk7CiAJCQlwd2NfaXNvY19jbGVhbnVwKHBkZXYpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL3MyMjU1L3MyMjU1ZHJ2LmMgYi9kcml2ZXJzL21lZGlhL3VzYi9zMjI1NS9zMjI1NWRydi5jCmluZGV4IDQzYmE3MWEuLjk0NThlYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL3MyMjU1L3MyMjU1ZHJ2LmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvczIyNTUvczIyNTVkcnYuYwpAQCAtMjExMywxMSArMjExMyw4IEBACiAJcGlwZV9pbmZvLT5zdGF0ZSA9IDE7CiAJcGlwZV9pbmZvLT5lcnJfY291bnQgPSAwOwogCXBpcGVfaW5mby0+c3RyZWFtX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwaXBlX2luZm8tPnN0cmVhbV91cmIpIHsKLQkJZGV2X2VycigmZGV2LT51ZGV2LT5kZXYsCi0JCQkiUmVhZFN0cmVhbTogVW5hYmxlIHRvIGFsbG9jIFVSQlxuIik7CisJaWYgKCFwaXBlX2luZm8tPnN0cmVhbV91cmIpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAkvKiB0cmFuc2ZlciBidWZmZXIgYWxsb2NhdGVkIGluIGJvYXJkX2luaXQgKi8KIAl1c2JfZmlsbF9idWxrX3VyYihwaXBlX2luZm8tPnN0cmVhbV91cmIsIGRldi0+dWRldiwKIAkJCSAgcGlwZSwKQEAgLTIyOTAsMTAgKzIyODcsOCBAQAogCX0KIAogCWRldi0+ZndfZGF0YS0+ZndfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+ZndfZGF0YS0+ZndfdXJiKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAib3V0IG9mIG1lbW9yeSFcbiIpOworCWlmICghZGV2LT5md19kYXRhLT5md191cmIpCiAJCWdvdG8gZXJyb3JGV1VSQjsKLQl9CiAKIAlkZXYtPmZ3X2RhdGEtPnBmd19kYXRhID0ga3phbGxvYyhDSFVOS19TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldi0+ZndfZGF0YS0+cGZ3X2RhdGEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL3N0azExNjAvc3RrMTE2MC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS91c2Ivc3RrMTE2MC9zdGsxMTYwLXZpZGVvLmMKaW5kZXggNmVjYjBiNC4uY2U4ZWJiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2Ivc3RrMTE2MC9zdGsxMTYwLXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2Ivc3RrMTE2MC9zdGsxMTYwLXZpZGVvLmMKQEAgLTQ1NywxMCArNDU3LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2J1ZnM7IGkrKykgewogCiAJCXVyYiA9IHVzYl9hbGxvY191cmIobWF4X3BhY2tldHMsIEdGUF9LRVJORUwpOwotCQlpZiAoIXVyYikgewotCQkJc3RrMTE2MF9lcnIoImNhbm5vdCBhbGxvYyB1cmJbJWRdXG4iLCBpKTsKKwkJaWYgKCF1cmIpCiAJCQlnb3RvIGZyZWVfaV9idWZzOwotCQl9CiAJCWRldi0+aXNvY19jdGwudXJiW2ldID0gdXJiOwogCiAjaWZuZGVmIENPTkZJR19ETUFfTk9OQ09IRVJFTlQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL3N0a3dlYmNhbS9zdGstd2ViY2FtLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9zdGt3ZWJjYW0vc3RrLXdlYmNhbS5jCmluZGV4IGMyMWM0YzAuLmRiMjAwYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL3N0a3dlYmNhbS9zdGstd2ViY2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2Ivc3Rrd2ViY2FtL3N0ay13ZWJjYW0uYwpAQCAtNDUyLDEwICs0NTIsOCBAQAogCQkJU1RLX0VSUk9SKCJpc29idWYgZGF0YSBhbHJlYWR5IGFsbG9jYXRlZFxuIik7CiAJCWlmIChkZXYtPmlzb2J1ZnNbaV0udXJiID09IE5VTEwpIHsKIAkJCXVyYiA9IHVzYl9hbGxvY191cmIoSVNPX0ZSQU1FU19QRVJfREVTQywgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAodXJiID09IE5VTEwpIHsKLQkJCQlTVEtfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBVUkIgJWRcbiIsIGkpOworCQkJaWYgKHVyYiA9PSBOVUxMKQogCQkJCWdvdG8gaXNvYnVmc19vdXQ7Ci0JCQl9CiAJCQlkZXYtPmlzb2J1ZnNbaV0udXJiID0gdXJiOwogCQl9IGVsc2UgewogCQkJU1RLX0VSUk9SKCJLaWxsaW5nIFVSQlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi90bTYwMDAvdG02MDAwLWR2Yi5jIGIvZHJpdmVycy9tZWRpYS91c2IvdG02MDAwL3RtNjAwMC1kdmIuYwppbmRleCAwOTVmNWRiLi4wNDI2YjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi90bTYwMDAvdG02MDAwLWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL3RtNjAwMC90bTYwMDAtZHZiLmMKQEAgLTEyOSwxMCArMTI5LDggQEAKIAl9CiAKIAlkdmItPmJ1bGtfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoZHZiLT5idWxrX3VyYiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBjb3VsZG4ndCBhbGxvY2F0ZSB1cmJcbiIpOworCWlmIChkdmItPmJ1bGtfdXJiID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXBpcGUgPSB1c2JfcmN2YnVsa3BpcGUoZGV2LT51ZGV2LCBkZXYtPmJ1bGtfaW4uZW5kcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzCiAJCQkJCQkJICAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi90bTYwMDAvdG02MDAwLXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3VzYi90bTYwMDAvdG02MDAwLXZpZGVvLmMKaW5kZXggZmE1ZThiZC4uZGVlN2U3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvdG02MDAwL3RtNjAwMC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL3RtNjAwMC90bTYwMDAtdmlkZW8uYwpAQCAtNjM1LDcgKzYzNSw2IEBACiAJZm9yIChpID0gMDsgaSA8IGRldi0+aXNvY19jdGwubnVtX2J1ZnM7IGkrKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKG1heF9wYWNrZXRzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCXRtNjAwMF9lcnIoImNhbm5vdCBhbGxvYyBpc29jX2N0bC51cmIgJWlcbiIsIGkpOwogCQkJdG02MDAwX3VuaW5pdF9pc29jKGRldik7CiAJCQl1c2JfZnJlZV91cmIodXJiKTsKIAkJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvdXNidmlzaW9uL3VzYnZpc2lvbi1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3VzYi91c2J2aXNpb24vdXNidmlzaW9uLWNvcmUuYwppbmRleCA1MmFjNDM5Li5jMjNiZjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi91c2J2aXNpb24vdXNidmlzaW9uLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi91c2J2aXNpb24vdXNidmlzaW9uLWNvcmUuYwpAQCAtMjMwMywxMSArMjMwMyw4IEBACiAJCXN0cnVjdCB1cmIgKnVyYjsKIAogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKFVTQlZJU0lPTl9VUkJfRlJBTUVTLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHVyYiA9PSBOVUxMKSB7Ci0JCQlkZXZfZXJyKCZ1c2J2aXNpb24tPmRldi0+ZGV2LAotCQkJCSIlczogdXNiX2FsbG9jX3VyYigpIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlpZiAodXJiID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJfQogCQl1c2J2aXNpb24tPnNidWZbYnVmX2lkeF0udXJiID0gdXJiOwogCQl1c2J2aXNpb24tPnNidWZbYnVmX2lkeF0uZGF0YSA9CiAJCQl1c2JfYWxsb2NfY29oZXJlbnQodXNidmlzaW9uLT5kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi96cjM2NHh4L3pyMzY0eHguYyBiL2RyaXZlcnMvbWVkaWEvdXNiL3pyMzY0eHgvenIzNjR4eC5jCmluZGV4IDc0MzNiYTUuLmNjMTI4ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL3pyMzY0eHgvenIzNjR4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL3pyMzY0eHgvenIzNjR4eC5jCkBAIC0xMDQ1LDEwICsxMDQ1LDggQEAKIAlwaXBlX2luZm8tPnN0YXRlID0gMTsKIAlwaXBlX2luZm8tPmVycl9jb3VudCA9IDA7CiAJcGlwZV9pbmZvLT5zdHJlYW1fdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBpcGVfaW5mby0+c3RyZWFtX3VyYikgewotCQlkZXZfZXJyKCZjYW0tPnVkZXYtPmRldiwgIlJlYWRTdHJlYW06IFVuYWJsZSB0byBhbGxvYyBVUkJcbiIpOworCWlmICghcGlwZV9pbmZvLT5zdHJlYW1fdXJiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJLyogdHJhbnNmZXIgYnVmZmVyIGFsbG9jYXRlZCBpbiBib2FyZF9pbml0ICovCiAJdXNiX2ZpbGxfYnVsa191cmIocGlwZV9pbmZvLT5zdHJlYW1fdXJiLCBjYW0tPnVkZXYsCiAJCQkgIHBpcGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbW9yeS9vZl9tZW1vcnkuYyBiL2RyaXZlcnMvbWVtb3J5L29mX21lbW9yeS5jCmluZGV4IDlkYWY5NGIuLjU2OGYwNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVtb3J5L29mX21lbW9yeS5jCisrKyBiL2RyaXZlcnMvbWVtb3J5L29mX21lbW9yeS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bWVtb3J5L2plZGVjX2Rkci5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgIm9mX21lbW9yeS5oIgogCiAvKioKICAqIG9mX2dldF9taW5fdGNrKCkgLSBleHRyYWN0IG1pbiB0aW1pbmcgdmFsdWVzIGZvciBkZHIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtb3J5L29tYXAtZ3BtYy5jIGIvZHJpdmVycy9tZW1vcnkvb21hcC1ncG1jLmMKaW5kZXggODY5YzgzZi4uZjAwZjNlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZW1vcnkvb21hcC1ncG1jLmMKKysrIGIvZHJpdmVycy9tZW1vcnkvb21hcC1ncG1jLmMKQEAgLTIxODUsNyArMjE4NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ3BtY19wcm9iZV9kdF9jaGlsZHJlbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIHZvaWQgZ3BtY19wcm9iZV9kdF9jaGlsZHJlbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWludCByZXQ7CiAJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZDsKQEAgLTIyMDAsMTEgKzIyMDAsMTEgQEAKIAkJZWxzZQogCQkJcmV0ID0gZ3BtY19wcm9iZV9nZW5lcmljX2NoaWxkKHBkZXYsIGNoaWxkKTsKIAotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHByb2JlIERUIGNoaWxkICclcyc6ICVkXG4iLAorCQkJCWNoaWxkLT5uYW1lLCByZXQpOworCQl9CiAJfQotCi0JcmV0dXJuIDA7CiB9CiAjZWxzZQogc3RhdGljIGludCBncG1jX3Byb2JlX2R0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0yMjEyLDkgKzIyMTIsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdwbWNfcHJvYmVfZHRfY2hpbGRyZW4oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyB2b2lkIGdwbWNfcHJvYmVfZHRfY2hpbGRyZW4oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlyZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBDT05GSUdfT0YgKi8KIApAQCAtMjM2OSwxNiArMjM2OCwxMCBAQAogCQlnb3RvIHNldHVwX2lycV9mYWlsZWQ7CiAJfQogCi0JcmMgPSBncG1jX3Byb2JlX2R0X2NoaWxkcmVuKHBkZXYpOwotCWlmIChyYyA8IDApIHsKLQkJZGV2X2VycihncG1jLT5kZXYsICJmYWlsZWQgdG8gcHJvYmUgRFQgY2hpbGRyZW5cbiIpOwotCQlnb3RvIGR0X2NoaWxkcmVuX2ZhaWxlZDsKLQl9CisJZ3BtY19wcm9iZV9kdF9jaGlsZHJlbihwZGV2KTsKIAogCXJldHVybiAwOwogCi1kdF9jaGlsZHJlbl9mYWlsZWQ6Ci0JZ3BtY19mcmVlX2lycShncG1jKTsKIHNldHVwX2lycV9mYWlsZWQ6CiAJZ3BtY19ncGlvX2V4aXQoZ3BtYyk7CiBncGlvX2luaXRfZmFpbGVkOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvS2NvbmZpZyBiL2RyaXZlcnMvbWZkL0tjb25maWcKaW5kZXggMmQxZmI2NC4uMmNhZjdlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvS2NvbmZpZworKysgYi9kcml2ZXJzL21mZC9LY29uZmlnCkBAIC0zNDAsMTQgKzM0MCw2IEBACiAJaGVscAogCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGVuYWJsZSBIaXNpbGljb24gaGk2NTV4IHNlcmllcyBwbWljIGRyaXZlci4KIAotY29uZmlnIEhUQ19FR1BJTwotCWJvb2wgIkhUQyBFR1BJTyBzdXBwb3J0IgotCWRlcGVuZHMgb24gR1BJT0xJQiAmJiBBUk0KLQloZWxwCi0JICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBDUExEIGVncGlvIGNoaXAgcHJlc2VudCBvbgotCSAgICBzZXZlcmFsIEhUQyBwaG9uZXMuICBJdCBwcm92aWRlcyBiYXNpYyBzdXBwb3J0IGZvciBpbnB1dAotCSAgICBwaW5zLCBvdXRwdXQgcGlucywgYW5kIGlycXMuCi0KIGNvbmZpZyBIVENfUEFTSUMzCiAJdHJpc3RhdGUgIkhUQyBQQVNJQzMgTEVEL0RTMVdNIGNoaXAgc3VwcG9ydCIKIAlzZWxlY3QgTUZEX0NPUkUKQEAgLTEyMjQsNiArMTIxNiwyMCBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgdHBzNjUyMTcuCiAKK2NvbmZpZyBNRkRfVElfTFA4NzNYCisJdHJpc3RhdGUgIlRJIExQODczWCBQb3dlciBNYW5hZ2VtZW50IElDIgorCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IE1GRF9DT1JFCisJc2VsZWN0IFJFR01BUF9JMkMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHRoZW4geW91IGdldCBzdXBwb3J0IGZvciB0aGUgTFA4NzNYIHNlcmllcyBvZgorCSAgUG93ZXIgTWFuYWdlbWVudCBJbnRlZ3JhdGVkIENpcmN1aXRzIChQTUlDKS4KKwkgIFRoZXNlIGluY2x1ZGUgdm9sdGFnZSByZWd1bGF0b3JzLCB0aGVybWFsIHByb3RlY3Rpb24sIGNvbmZpZ3VyYWJsZQorCSAgR2VuZXJhbCBQdXJwb3NlIE91dHB1dHMgKEdQTykgdGhhdCBhcmUgdXNlZCBpbiBwb3J0YWJsZSBkZXZpY2VzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxwODczeC4KKwogY29uZmlnIE1GRF9UUFM2NTIxOAogCXRyaXN0YXRlICJUSSBUUFM2NTIxOCBQb3dlciBNYW5hZ2VtZW50IGNoaXBzIgogCWRlcGVuZHMgb24gSTJDCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9NYWtlZmlsZSBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCmluZGV4IDJiYTNiYTMuLjJiZjZhMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCkBAIC0xOCwxMCArMTgsMTEgQEAKIG9iai0kKENPTkZJR19NRkRfUlRTWF9QQ0kpCSs9IHJ0c3hfcGNpLm8KIG9iai0kKENPTkZJR19NRkRfUlRTWF9VU0IpCSs9IHJ0c3hfdXNiLm8KIAotb2JqLSQoQ09ORklHX0hUQ19FR1BJTykJCSs9IGh0Yy1lZ3Bpby5vCiBvYmotJChDT05GSUdfSFRDX1BBU0lDMykJKz0gaHRjLXBhc2ljMy5vCiBvYmotJChDT05GSUdfSFRDX0kyQ1BMRCkJKz0gaHRjLWkyY3BsZC5vCiAKK29iai0kKENPTkZJR19NRkRfVElfTFA4NzNYKQkrPSBscDg3M3gubworCiBvYmotJChDT05GSUdfTUZEX0RBVklOQ0lfVk9JQ0VDT0RFQykJKz0gZGF2aW5jaV92b2ljZWNvZGVjLm8KIG9iai0kKENPTkZJR19NRkRfRE0zNTVFVk1fTVNQKQkrPSBkbTM1NWV2bV9tc3Aubwogb2JqLSQoQ09ORklHX01GRF9USV9BTTMzNVhfVFNDQURDKQkrPSB0aV9hbTMzNXhfdHNjYWRjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2h0Yy1lZ3Bpby5jIGIvZHJpdmVycy9tZmQvaHRjLWVncGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxM2NmYzUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZmQvaHRjLWVncGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotLyoKLSAqIFN1cHBvcnQgZm9yIHRoZSBHUElPL0lSUSBleHBhbmRlciBjaGlwcyBwcmVzZW50IG9uIHNldmVyYWwgSFRDIHBob25lcy4KLSAqIFRoZXNlIGFyZSBpbXBsZW1lbnRlZCBpbiBDUExEIGNoaXBzIHByZXNlbnQgb24gdGhlIGJvYXJkLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNyBLZXZpbiBPJ0Nvbm5vciA8a2V2aW5Aa29jb25ub3IubmV0PgotICogQ29weXJpZ2h0IChjKSAyMDA3IFBoaWxpcHAgWmFiZWwgPHBoaWxpcHAuemFiZWxAZ21haWwuY29tPgotICoKLSAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIGxpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvaHRjLWVncGlvLmg+Ci0KLXN0cnVjdCBlZ3Bpb19jaGlwIHsKLQlpbnQgICAgICAgICAgICAgIHJlZ19zdGFydDsKLQlpbnQgICAgICAgICAgICAgIGNhY2hlZF92YWx1ZXM7Ci0JdW5zaWduZWQgbG9uZyAgICBpc19vdXQ7Ci0Jc3RydWN0IGRldmljZSAgICAqZGV2OwotCXN0cnVjdCBncGlvX2NoaXAgY2hpcDsKLX07Ci0KLXN0cnVjdCBlZ3Bpb19pbmZvIHsKLQlzcGlubG9ja190ICAgICAgICBsb2NrOwotCi0JLyogaW9tZW0gaW5mbyAqLwotCXZvaWQgX19pb21lbSAgICAgICpiYXNlX2FkZHI7Ci0JaW50ICAgICAgICAgICAgICAgYnVzX3NoaWZ0OwkvKiBieXRlIHNoaWZ0ICovCi0JaW50ICAgICAgICAgICAgICAgcmVnX3NoaWZ0OwkvKiBiaXQgc2hpZnQgKi8KLQlpbnQgICAgICAgICAgICAgICByZWdfbWFzazsKLQotCS8qIGlycSBpbmZvICovCi0JaW50ICAgICAgICAgICAgICAgYWNrX3JlZ2lzdGVyOwotCWludCAgICAgICAgICAgICAgIGFja193cml0ZTsKLQl1MTYgICAgICAgICAgICAgICBpcnFzX2VuYWJsZWQ7Ci0JdWludCAgICAgICAgICAgICAgaXJxX3N0YXJ0OwotCWludCAgICAgICAgICAgICAgIG5pcnFzOwotCXVpbnQgICAgICAgICAgICAgIGNoYWluZWRfaXJxOwotCi0JLyogZWdwaW8gaW5mbyAqLwotCXN0cnVjdCBlZ3Bpb19jaGlwICpjaGlwOwotCWludCAgICAgICAgICAgICAgIG5jaGlwczsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBlZ3Bpb193cml0ZXcodTE2IHZhbHVlLCBzdHJ1Y3QgZWdwaW9faW5mbyAqZWksIGludCByZWcpCi17Ci0Jd3JpdGV3KHZhbHVlLCBlaS0+YmFzZV9hZGRyICsgKHJlZyA8PCBlaS0+YnVzX3NoaWZ0KSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTE2IGVncGlvX3JlYWR3KHN0cnVjdCBlZ3Bpb19pbmZvICplaSwgaW50IHJlZykKLXsKLQlyZXR1cm4gcmVhZHcoZWktPmJhc2VfYWRkciArIChyZWcgPDwgZWktPmJ1c19zaGlmdCkpOwotfQotCi0vKgotICogSVJRcwotICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhY2tfaXJxcyhzdHJ1Y3QgZWdwaW9faW5mbyAqZWkpCi17Ci0JZWdwaW9fd3JpdGV3KGVpLT5hY2tfd3JpdGUsIGVpLCBlaS0+YWNrX3JlZ2lzdGVyKTsKLQlwcl9kZWJ1ZygiRUdQSU8gYWNrIC0gd3JpdGUgJXggdG8gYmFzZSsleFxuIiwKLQkJCWVpLT5hY2tfd3JpdGUsIGVpLT5hY2tfcmVnaXN0ZXIgPDwgZWktPmJ1c19zaGlmdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVncGlvX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci19Ci0KLS8qIFRoZXJlIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHdheSB0byBwcm9hY3RpdmVseSBtYXNrIGludGVycnVwdHMKLSAqIG9uIHRoZSBlZ3BpbyBjaGlwIGl0c2VsZi4gIFNvLCB3ZSBzaW1wbHkgaWdub3JlIGludGVycnVwdHMgdGhhdAotICogYXJlbid0IGRlc2lyZWQuICovCi1zdGF0aWMgdm9pZCBlZ3Bpb19tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQlzdHJ1Y3QgZWdwaW9faW5mbyAqZWkgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKLQllaS0+aXJxc19lbmFibGVkICY9IH4oMSA8PCAoZGF0YS0+aXJxIC0gZWktPmlycV9zdGFydCkpOwotCXByX2RlYnVnKCJFR1BJTyBtYXNrICVkICUwNHhcbiIsIGRhdGEtPmlycSwgZWktPmlycXNfZW5hYmxlZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVncGlvX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IGVncGlvX2luZm8gKmVpID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Ci0JZWktPmlycXNfZW5hYmxlZCB8PSAxIDw8IChkYXRhLT5pcnEgLSBlaS0+aXJxX3N0YXJ0KTsKLQlwcl9kZWJ1ZygiRUdQSU8gdW5tYXNrICVkICUwNHhcbiIsIGRhdGEtPmlycSwgZWktPmlycXNfZW5hYmxlZCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZWdwaW9fbXV4ZWRfY2hpcCA9IHsKLQkubmFtZQkJPSAiaHRjLWVncGlvIiwKLQkuaXJxX2Fjawk9IGVncGlvX2FjaywKLQkuaXJxX21hc2sJPSBlZ3Bpb19tYXNrLAotCS5pcnFfdW5tYXNrCT0gZWdwaW9fdW5tYXNrLAotfTsKLQotc3RhdGljIHZvaWQgZWdwaW9faGFuZGxlcihzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCi17Ci0Jc3RydWN0IGVncGlvX2luZm8gKmVpID0gaXJxX2Rlc2NfZ2V0X2hhbmRsZXJfZGF0YShkZXNjKTsKLQlpbnQgaXJxcGluOwotCi0JLyogUmVhZCBjdXJyZW50IHBpbnMuICovCi0JdW5zaWduZWQgbG9uZyByZWFkdmFsID0gZWdwaW9fcmVhZHcoZWksIGVpLT5hY2tfcmVnaXN0ZXIpOwotCXByX2RlYnVnKCJJUlEgcmVnOiAleFxuIiwgKHVuc2lnbmVkIGludClyZWFkdmFsKTsKLQkvKiBBY2svdW5tYXNrIGludGVycnVwdHMuICovCi0JYWNrX2lycXMoZWkpOwotCS8qIFByb2Nlc3MgYWxsIHNldCBwaW5zLiAqLwotCXJlYWR2YWwgJj0gZWktPmlycXNfZW5hYmxlZDsKLQlmb3JfZWFjaF9zZXRfYml0KGlycXBpbiwgJnJlYWR2YWwsIGVpLT5uaXJxcykgewotCQkvKiBSdW4gaXJxIGhhbmRsZXIgKi8KLQkJcHJfZGVidWcoImdvdCBJUlEgJWRcbiIsIGlycXBpbik7Ci0JCWdlbmVyaWNfaGFuZGxlX2lycShlaS0+aXJxX3N0YXJ0ICsgaXJxcGluKTsKLQl9Ci19Ci0KLWludCBodGNfZWdwaW9fZ2V0X3dha2V1cF9pcnEoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBlZ3Bpb19pbmZvICplaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JLyogUmVhZCBjdXJyZW50IHBpbnMuICovCi0JdTE2IHJlYWR2YWwgPSBlZ3Bpb19yZWFkdyhlaSwgZWktPmFja19yZWdpc3Rlcik7Ci0JLyogQWNrL3VubWFzayBpbnRlcnJ1cHRzLiAqLwotCWFja19pcnFzKGVpKTsKLQkvKiBSZXR1cm4gZmlyc3Qgc2V0IHBpbi4gKi8KLQlyZWFkdmFsICY9IGVpLT5pcnFzX2VuYWJsZWQ7Ci0JcmV0dXJuIGVpLT5pcnFfc3RhcnQgKyBmZnMocmVhZHZhbCkgLSAxOwotfQotRVhQT1JUX1NZTUJPTChodGNfZWdwaW9fZ2V0X3dha2V1cF9pcnEpOwotCi1zdGF0aWMgaW5saW5lIGludCBlZ3Bpb19wb3Moc3RydWN0IGVncGlvX2luZm8gKmVpLCBpbnQgYml0KQotewotCXJldHVybiBiaXQgPj4gZWktPnJlZ19zaGlmdDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZWdwaW9fYml0KHN0cnVjdCBlZ3Bpb19pbmZvICplaSwgaW50IGJpdCkKLXsKLQlyZXR1cm4gMSA8PCAoYml0ICYgKCgxIDw8IGVpLT5yZWdfc2hpZnQpLTEpKTsKLX0KLQotLyoKLSAqIElucHV0IHBpbnMKLSAqLwotCi1zdGF0aWMgaW50IGVncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jc3RydWN0IGVncGlvX2NoaXAgKmVncGlvOwotCXN0cnVjdCBlZ3Bpb19pbmZvICplaTsKLQl1bnNpZ25lZCAgICAgICAgICAgYml0OwotCWludCAgICAgICAgICAgICAgICByZWc7Ci0JaW50ICAgICAgICAgICAgICAgIHZhbHVlOwotCi0JcHJfZGVidWcoImVncGlvX2dldF92YWx1ZSglZClcbiIsIGNoaXAtPmJhc2UgKyBvZmZzZXQpOwotCi0JZWdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKLQllaSAgICA9IGRldl9nZXRfZHJ2ZGF0YShlZ3Bpby0+ZGV2KTsKLQliaXQgICA9IGVncGlvX2JpdChlaSwgb2Zmc2V0KTsKLQlyZWcgICA9IGVncGlvLT5yZWdfc3RhcnQgKyBlZ3Bpb19wb3MoZWksIG9mZnNldCk7Ci0KLQl2YWx1ZSA9IGVncGlvX3JlYWR3KGVpLCByZWcpOwotCXByX2RlYnVnKCJyZWFkdyglcCArICV4KSA9ICV4XG4iLAotCQkJZWktPmJhc2VfYWRkciwgcmVnIDw8IGVpLT5idXNfc2hpZnQsIHZhbHVlKTsKLQlyZXR1cm4gISEodmFsdWUgJiBiaXQpOwotfQotCi1zdGF0aWMgaW50IGVncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jc3RydWN0IGVncGlvX2NoaXAgKmVncGlvOwotCi0JZWdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKLQlyZXR1cm4gdGVzdF9iaXQob2Zmc2V0LCAmZWdwaW8tPmlzX291dCkgPyAtRUlOVkFMIDogMDsKLX0KLQotCi0vKgotICogT3V0cHV0IHBpbnMKLSAqLwotCi1zdGF0aWMgdm9pZCBlZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0JdW5zaWduZWQgbG9uZyAgICAgZmxhZzsKLQlzdHJ1Y3QgZWdwaW9fY2hpcCAqZWdwaW87Ci0Jc3RydWN0IGVncGlvX2luZm8gKmVpOwotCXVuc2lnbmVkICAgICAgICAgIGJpdDsKLQlpbnQgICAgICAgICAgICAgICBwb3M7Ci0JaW50ICAgICAgICAgICAgICAgcmVnOwotCWludCAgICAgICAgICAgICAgIHNoaWZ0OwotCi0JcHJfZGVidWcoImVncGlvX3NldCglcywgJWQoJWQpLCAlZClcbiIsCi0JCQljaGlwLT5sYWJlbCwgb2Zmc2V0LCBvZmZzZXQrY2hpcC0+YmFzZSwgdmFsdWUpOwotCi0JZWdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKLQllaSAgICA9IGRldl9nZXRfZHJ2ZGF0YShlZ3Bpby0+ZGV2KTsKLQliaXQgICA9IGVncGlvX2JpdChlaSwgb2Zmc2V0KTsKLQlwb3MgICA9IGVncGlvX3BvcyhlaSwgb2Zmc2V0KTsKLQlyZWcgICA9IGVncGlvLT5yZWdfc3RhcnQgKyBwb3M7Ci0Jc2hpZnQgPSBwb3MgPDwgZWktPnJlZ19zaGlmdDsKLQotCXByX2RlYnVnKCJlZ3BpbyAlczogcmVnICVkID0gMHglMDR4XG4iLCB2YWx1ZSA/ICJzZXQiIDogImNsZWFyIiwKLQkJCXJlZywgKGVncGlvLT5jYWNoZWRfdmFsdWVzID4+IHNoaWZ0KSAmIGVpLT5yZWdfbWFzayk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZWktPmxvY2ssIGZsYWcpOwotCWlmICh2YWx1ZSkKLQkJZWdwaW8tPmNhY2hlZF92YWx1ZXMgfD0gKDEgPDwgb2Zmc2V0KTsKLQllbHNlCi0JCWVncGlvLT5jYWNoZWRfdmFsdWVzICY9IH4oMSA8PCBvZmZzZXQpOwotCWVncGlvX3dyaXRldygoZWdwaW8tPmNhY2hlZF92YWx1ZXMgPj4gc2hpZnQpICYgZWktPnJlZ19tYXNrLCBlaSwgcmVnKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaS0+bG9jaywgZmxhZyk7Ci19Ci0KLXN0YXRpYyBpbnQgZWdwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCQkJCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgZWdwaW9fY2hpcCAqZWdwaW87Ci0KLQllZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwotCWlmICh0ZXN0X2JpdChvZmZzZXQsICZlZ3Bpby0+aXNfb3V0KSkgewotCQllZ3Bpb19zZXQoY2hpcCwgb2Zmc2V0LCB2YWx1ZSk7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZWdwaW9fd3JpdGVfY2FjaGUoc3RydWN0IGVncGlvX2luZm8gKmVpKQotewotCWludCAgICAgICAgICAgICAgIGk7Ci0Jc3RydWN0IGVncGlvX2NoaXAgKmVncGlvOwotCWludCAgICAgICAgICAgICAgIHNoaWZ0OwotCi0JZm9yIChpID0gMDsgaSA8IGVpLT5uY2hpcHM7IGkrKykgewotCQllZ3BpbyA9ICYoZWktPmNoaXBbaV0pOwotCQlpZiAoIWVncGlvLT5pc19vdXQpCi0JCQljb250aW51ZTsKLQotCQlmb3IgKHNoaWZ0ID0gMDsgc2hpZnQgPCBlZ3Bpby0+Y2hpcC5uZ3BpbzsKLQkJCQlzaGlmdCArPSAoMTw8ZWktPnJlZ19zaGlmdCkpIHsKLQotCQkJaW50IHJlZyA9IGVncGlvLT5yZWdfc3RhcnQgKyBlZ3Bpb19wb3MoZWksIHNoaWZ0KTsKLQotCQkJaWYgKCEoKGVncGlvLT5pc19vdXQgPj4gc2hpZnQpICYgZWktPnJlZ19tYXNrKSkKLQkJCQljb250aW51ZTsKLQotCQkJcHJfZGVidWcoIkVHUElPOiBzZXR0aW5nICV4IHRvICV4LCB3YXMgJXhcbiIsIHJlZywKLQkJCQkoZWdwaW8tPmNhY2hlZF92YWx1ZXMgPj4gc2hpZnQpICYgZWktPnJlZ19tYXNrLAotCQkJCWVncGlvX3JlYWR3KGVpLCByZWcpKTsKLQotCQkJZWdwaW9fd3JpdGV3KChlZ3Bpby0+Y2FjaGVkX3ZhbHVlcyA+PiBzaGlmdCkKLQkJCQkJJiBlaS0+cmVnX21hc2ssIGVpLCByZWcpOwotCQl9Ci0JfQotfQotCi0KLS8qCi0gKiBTZXR1cAotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGVncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGh0Y19lZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7Ci0Jc3RydWN0IHJlc291cmNlICAgKnJlczsKLQlzdHJ1Y3QgZWdwaW9faW5mbyAqZWk7Ci0Jc3RydWN0IGdwaW9fY2hpcCAgKmNoaXA7Ci0JdW5zaWduZWQgaW50ICAgICAgaXJxLCBpcnFfZW5kOwotCWludCAgICAgICAgICAgICAgIGk7Ci0JaW50ICAgICAgICAgICAgICAgcmV0OwotCi0JLyogSW5pdGlhbGl6ZSBlaSBkYXRhIHN0cnVjdHVyZS4gKi8KLQllaSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmVpKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlaSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcGluX2xvY2tfaW5pdCgmZWktPmxvY2spOwotCi0JLyogRmluZCBjaGFpbmVkIGlycSAqLwotCXJldCA9IC1FSU5WQUw7Ci0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKLQlpZiAocmVzKQotCQllaS0+Y2hhaW5lZF9pcnEgPSByZXMtPnN0YXJ0OwotCi0JLyogTWFwIGVncGlvIGNoaXAgaW50byB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuICovCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXJlcykKLQkJZ290byBmYWlsOwotCWVpLT5iYXNlX2FkZHIgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZSgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LAotCQkJCQkgICAgIHJlc291cmNlX3NpemUocmVzKSk7Ci0JaWYgKCFlaS0+YmFzZV9hZGRyKQotCQlnb3RvIGZhaWw7Ci0JcHJfZGVidWcoIkVHUElPIHBoeXM9JTA4eCB2aXJ0PSVwXG4iLCAodTMyKXJlcy0+c3RhcnQsIGVpLT5iYXNlX2FkZHIpOwotCi0JaWYgKChwZGF0YS0+YnVzX3dpZHRoICE9IDE2KSAmJiAocGRhdGEtPmJ1c193aWR0aCAhPSAzMikpCi0JCWdvdG8gZmFpbDsKLQllaS0+YnVzX3NoaWZ0ID0gZmxzKHBkYXRhLT5idXNfd2lkdGggLSAxKSAtIDM7Ci0JcHJfZGVidWcoImJ1c19zaGlmdCA9ICVkXG4iLCBlaS0+YnVzX3NoaWZ0KTsKLQotCWlmICgocGRhdGEtPnJlZ193aWR0aCAhPSA4KSAmJiAocGRhdGEtPnJlZ193aWR0aCAhPSAxNikpCi0JCWdvdG8gZmFpbDsKLQllaS0+cmVnX3NoaWZ0ID0gZmxzKHBkYXRhLT5yZWdfd2lkdGggLSAxKTsKLQlwcl9kZWJ1ZygicmVnX3NoaWZ0ID0gJWRcbiIsIGVpLT5yZWdfc2hpZnQpOwotCi0JZWktPnJlZ19tYXNrID0gKDEgPDwgcGRhdGEtPnJlZ193aWR0aCkgLSAxOwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZWkpOwotCi0JZWktPm5jaGlwcyA9IHBkYXRhLT5udW1fY2hpcHM7Ci0JZWktPmNoaXAgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKLQkJCQlzaXplb2Yoc3RydWN0IGVncGlvX2NoaXApICogZWktPm5jaGlwcywKLQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWVpLT5jaGlwKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IGVpLT5uY2hpcHM7IGkrKykgewotCQllaS0+Y2hpcFtpXS5yZWdfc3RhcnQgPSBwZGF0YS0+Y2hpcFtpXS5yZWdfc3RhcnQ7Ci0JCWVpLT5jaGlwW2ldLmNhY2hlZF92YWx1ZXMgPSBwZGF0YS0+Y2hpcFtpXS5pbml0aWFsX3ZhbHVlczsKLQkJZWktPmNoaXBbaV0uaXNfb3V0ID0gcGRhdGEtPmNoaXBbaV0uZGlyZWN0aW9uOwotCQllaS0+Y2hpcFtpXS5kZXYgPSAmKHBkZXYtPmRldik7Ci0JCWNoaXAgPSAmKGVpLT5jaGlwW2ldLmNoaXApOwotCQljaGlwLT5sYWJlbCAgICAgICAgICAgPSAiaHRjLWVncGlvIjsKLQkJY2hpcC0+cGFyZW50ICAgICAgICAgID0gJnBkZXYtPmRldjsKLQkJY2hpcC0+b3duZXIgICAgICAgICAgID0gVEhJU19NT0RVTEU7Ci0JCWNoaXAtPmdldCAgICAgICAgICAgICA9IGVncGlvX2dldDsKLQkJY2hpcC0+c2V0ICAgICAgICAgICAgID0gZWdwaW9fc2V0OwotCQljaGlwLT5kaXJlY3Rpb25faW5wdXQgPSBlZ3Bpb19kaXJlY3Rpb25faW5wdXQ7Ci0JCWNoaXAtPmRpcmVjdGlvbl9vdXRwdXQgPSBlZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OwotCQljaGlwLT5iYXNlICAgICAgICAgICAgPSBwZGF0YS0+Y2hpcFtpXS5ncGlvX2Jhc2U7Ci0JCWNoaXAtPm5ncGlvICAgICAgICAgICA9IHBkYXRhLT5jaGlwW2ldLm51bV9ncGlvczsKLQotCQlncGlvY2hpcF9hZGRfZGF0YShjaGlwLCAmZWktPmNoaXBbaV0pOwotCX0KLQotCS8qIFNldCBpbml0aWFsIHBpbiB2YWx1ZXMgKi8KLQllZ3Bpb193cml0ZV9jYWNoZShlaSk7Ci0KLQllaS0+aXJxX3N0YXJ0ID0gcGRhdGEtPmlycV9iYXNlOwotCWVpLT5uaXJxcyA9IHBkYXRhLT5udW1faXJxczsKLQllaS0+YWNrX3JlZ2lzdGVyID0gcGRhdGEtPmFja19yZWdpc3RlcjsKLQotCWlmIChlaS0+Y2hhaW5lZF9pcnEpIHsKLQkJLyogU2V0dXAgaXJxIGhhbmRsZXJzICovCi0JCWVpLT5hY2tfd3JpdGUgPSAweEZGRkY7Ci0JCWlmIChwZGF0YS0+aW52ZXJ0X2Fja3MpCi0JCQllaS0+YWNrX3dyaXRlID0gMDsKLQkJaXJxX2VuZCA9IGVpLT5pcnFfc3RhcnQgKyBlaS0+bmlycXM7Ci0JCWZvciAoaXJxID0gZWktPmlycV9zdGFydDsgaXJxIDwgaXJxX2VuZDsgaXJxKyspIHsKLQkJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZlZ3Bpb19tdXhlZF9jaGlwLAotCQkJCQkJIGhhbmRsZV9zaW1wbGVfaXJxKTsKLQkJCWlycV9zZXRfY2hpcF9kYXRhKGlycSwgZWkpOwotCQkJaXJxX2NsZWFyX3N0YXR1c19mbGFncyhpcnEsIElSUV9OT1JFUVVFU1QgfCBJUlFfTk9QUk9CRSk7Ci0JCX0KLQkJaXJxX3NldF9pcnFfdHlwZShlaS0+Y2hhaW5lZF9pcnEsIElSUV9UWVBFX0VER0VfUklTSU5HKTsKLQkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXJfYW5kX2RhdGEoZWktPmNoYWluZWRfaXJxLAotCQkJCQkJIGVncGlvX2hhbmRsZXIsIGVpKTsKLQkJYWNrX2lycXMoZWkpOwotCi0JCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZmFpbDoKLQlwcmludGsoS0VSTl9FUlIgIkVHUElPIGZhaWxlZCB0byBzZXR1cFxuIik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2V4aXQgZWdwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGVncGlvX2luZm8gKmVpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JdW5zaWduZWQgaW50ICAgICAgaXJxLCBpcnFfZW5kOwotCi0JaWYgKGVpLT5jaGFpbmVkX2lycSkgewotCQlpcnFfZW5kID0gZWktPmlycV9zdGFydCArIGVpLT5uaXJxczsKLQkJZm9yIChpcnEgPSBlaS0+aXJxX3N0YXJ0OyBpcnEgPCBpcnFfZW5kOyBpcnErKykgewotCQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgTlVMTCwgTlVMTCk7Ci0JCQlpcnFfc2V0X3N0YXR1c19mbGFncyhpcnEsIElSUV9OT1JFUVVFU1QgfCBJUlFfTk9QUk9CRSk7Ci0JCX0KLQkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoZWktPmNoYWluZWRfaXJxLCBOVUxMKTsKLQkJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDApOwotCX0KLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGVncGlvX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBlZ3Bpb19pbmZvICplaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JaWYgKGVpLT5jaGFpbmVkX2lycSAmJiBkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkKLQkJZW5hYmxlX2lycV93YWtlKGVpLT5jaGFpbmVkX2lycSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZWdwaW9fcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGVncGlvX2luZm8gKmVpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlpZiAoZWktPmNoYWluZWRfaXJxICYmIGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQotCQlkaXNhYmxlX2lycV93YWtlKGVpLT5jaGFpbmVkX2lycSk7Ci0KLQkvKiBVcGRhdGUgcmVnaXN0ZXJzIGZyb20gdGhlIGNhY2hlLCBpbiBjYXNlCi0JICAgdGhlIENQTEQgd2FzIHBvd2VyZWQgb2ZmIGR1cmluZyBzdXNwZW5kICovCi0JZWdwaW9fd3JpdGVfY2FjaGUoZWkpOwotCXJldHVybiAwOwotfQotI2Vsc2UKLSNkZWZpbmUgZWdwaW9fc3VzcGVuZCBOVUxMCi0jZGVmaW5lIGVncGlvX3Jlc3VtZSBOVUxMCi0jZW5kaWYKLQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBlZ3Bpb19kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiaHRjLWVncGlvIiwKLQl9LAotCS5yZW1vdmUgICAgICAgPSBfX2V4aXRfcChlZ3Bpb19yZW1vdmUpLAotCS5zdXNwZW5kICAgICAgPSBlZ3Bpb19zdXNwZW5kLAotCS5yZXN1bWUgICAgICAgPSBlZ3Bpb19yZXN1bWUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBlZ3Bpb19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZWdwaW9fZHJpdmVyLCBlZ3Bpb19wcm9iZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBlZ3Bpb19leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmVncGlvX2RyaXZlcik7Ci19Ci0KLS8qIHN0YXJ0IGVhcmx5IGZvciBkZXBlbmRlbmNpZXMgKi8KLXN1YnN5c19pbml0Y2FsbChlZ3Bpb19pbml0KTsKLW1vZHVsZV9leGl0KGVncGlvX2V4aXQpCi0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIktldmluIE8nQ29ubm9yIDxrZXZpbkBrb2Nvbm5vci5uZXQ+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9scDg3M3guYyBiL2RyaXZlcnMvbWZkL2xwODczeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZjA2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC9scDg3M3guYwpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICoKKyAqIEF1dGhvcjogS2VlcnRoeSA8ai1rZWVydGh5QHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCAiYXMgaXMiIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQ7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2luY2x1ZGUgPGxpbnV4L21mZC9scDg3M3guaD4KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGxwODczeF9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKKwkubWF4X3JlZ2lzdGVyID0gTFA4NzNYX1JFR19NQVgsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1mZF9jZWxsIGxwODczeF9jZWxsc1tdID0geworCXsgLm5hbWUgPSAibHA4NzN4LXJlZ3VsYXRvciIsIH0sCisJeyAubmFtZSA9ICJscDg3M3gtZ3BpbyIsIH0sCit9OworCitzdGF0aWMgaW50IGxwODczeF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkcykKK3sKKwlzdHJ1Y3QgbHA4NzN4ICpscDg3MzsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBvdHBpZDsKKworCWxwODczID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpscDg3MyksIEdGUF9LRVJORUwpOworCWlmICghbHA4NzMpCisJCXJldHVybiAtRU5PTUVNOworCisJbHA4NzMtPmRldiA9ICZjbGllbnQtPmRldjsKKworCWxwODczLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZscDg3M3hfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihscDg3My0+cmVnbWFwKSkgeworCQlyZXQgPSBQVFJfRVJSKGxwODczLT5yZWdtYXApOworCQlkZXZfZXJyKGxwODczLT5kZXYsCisJCQkiRmFpbGVkIHRvIGluaXRpYWxpemUgcmVnaXN0ZXIgbWFwOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltdXRleF9pbml0KCZscDg3My0+bG9jayk7CisKKwlyZXQgPSByZWdtYXBfcmVhZChscDg3My0+cmVnbWFwLCBMUDg3M1hfUkVHX09UUF9SRVYsICZvdHBpZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGxwODczLT5kZXYsICJGYWlsZWQgdG8gcmVhZCBPVFAgSURcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWxwODczLT5yZXYgPSBvdHBpZCAmIExQODczWF9PVFBfUkVWX09UUF9JRDsKKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGxwODczKTsKKworCXJldCA9IG1mZF9hZGRfZGV2aWNlcyhscDg3My0+ZGV2LCBQTEFURk9STV9ERVZJRF9BVVRPLCBscDg3M3hfY2VsbHMsCisJCQkgICAgICBBUlJBWV9TSVpFKGxwODczeF9jZWxscyksIE5VTEwsIDAsIE5VTEwpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfbHA4NzN4X21hdGNoX3RhYmxlW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ0aSxscDg3MzMiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksbHA4NzMyIiwgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9mX2xwODczeF9tYXRjaF90YWJsZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBscDg3M3hfaWRfdGFibGVbXSA9IHsKKwl7ICJscDg3M3giLCAwIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBscDg3M3hfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbHA4NzN4X2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJscDg3M3giLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9scDg3M3hfbWF0Y2hfdGFibGUsCisJfSwKKwkucHJvYmUJCT0gbHA4NzN4X3Byb2JlLAorCS5pZF90YWJsZQk9IGxwODczeF9pZF90YWJsZSwKK307Cittb2R1bGVfaTJjX2RyaXZlcihscDg3M3hfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSiBLZWVydGh5IDxqLWtlZXJ0aHlAdGkuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMUDg3M1ggY2hpcCBmYW1pbHkgTXVsdGktRnVuY3Rpb24gRGV2aWNlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbHBjX2ljaC5jIGIvZHJpdmVycy9tZmQvbHBjX2ljaC5jCmluZGV4IGJkM2FhNDUuLmM4ZGVlNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2xwY19pY2guYworKysgYi9kcml2ZXJzL21mZC9scGNfaWNoLmMKQEAgLTk4NCw2ICs5ODQsMTAgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCisJLyogSWYgd2UgaGF2ZSBBQ1BJIGJhc2VkIHdhdGNoZG9nIHVzZSB0aGF0IGluc3RlYWQgKi8KKwlpZiAoYWNwaV9oYXNfd2F0Y2hkb2coKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAkvKiBTZXR1cCBwb3dlciBtYW5hZ2VtZW50IGJhc2UgcmVnaXN0ZXIgKi8KIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwcml2LT5hYmFzZSwgJmJhc2VfYWRkcl9jZmcpOwogCWJhc2VfYWRkciA9IGJhc2VfYWRkcl9jZmcgJiAweDAwMDBmZjgwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvc3RtcGUtaTJjLmMgYi9kcml2ZXJzL21mZC9zdG1wZS1pMmMuYwppbmRleCBjM2Y0YWFiLi44NjNjMzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9zdG1wZS1pMmMuYworKysgYi9kcml2ZXJzL21mZC9zdG1wZS1pMmMuYwpAQCAtNTcsNiArNTcsNyBAQAogCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RtcGU2MTAiLCAuZGF0YSA9ICh2b2lkICopU1RNUEU2MTAsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJzdCxzdG1wZTgwMSIsIC5kYXRhID0gKHZvaWQgKilTVE1QRTgwMSwgfSwKIAl7IC5jb21wYXRpYmxlID0gInN0LHN0bXBlODExIiwgLmRhdGEgPSAodm9pZCAqKVNUTVBFODExLCB9LAorCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RtcGUxNjAwIiwgLmRhdGEgPSAodm9pZCAqKVNUTVBFMTYwMCwgfSwKIAl7IC5jb21wYXRpYmxlID0gInN0LHN0bXBlMTYwMSIsIC5kYXRhID0gKHZvaWQgKilTVE1QRTE2MDEsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJzdCxzdG1wZTE4MDEiLCAuZGF0YSA9ICh2b2lkICopU1RNUEUxODAxLCB9LAogCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RtcGUyNDAxIiwgLmRhdGEgPSAodm9pZCAqKVNUTVBFMjQwMSwgfSwKQEAgLTEwMSw2ICsxMDIsNyBAQAogCXsgInN0bXBlNjEwIiwgU1RNUEU2MTAgfSwKIAl7ICJzdG1wZTgwMSIsIFNUTVBFODAxIH0sCiAJeyAic3RtcGU4MTEiLCBTVE1QRTgxMSB9LAorCXsgInN0bXBlMTYwMCIsIFNUTVBFMTYwMCB9LAogCXsgInN0bXBlMTYwMSIsIFNUTVBFMTYwMSB9LAogCXsgInN0bXBlMTgwMSIsIFNUTVBFMTgwMSB9LAogCXsgInN0bXBlMjQwMSIsIFNUTVBFMjQwMSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvc3RtcGUuYyBiL2RyaXZlcnMvbWZkL3N0bXBlLmMKaW5kZXggOTRjN2NjMC4uY2ZkYWU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvc3RtcGUuYworKysgYi9kcml2ZXJzL21mZC9zdG1wZS5jCkBAIC00NjksNiArNDY5LDggQEAKIAogc3RhdGljIGNvbnN0IHU4IHN0bXBlODExX3JlZ3NbXSA9IHsKIAlbU1RNUEVfSURYX0NISVBfSURdCT0gU1RNUEU4MTFfUkVHX0NISVBfSUQsCisJW1NUTVBFX0lEWF9TWVNfQ1RSTF0JPSBTVE1QRTgxMV9SRUdfU1lTX0NUUkwsCisJW1NUTVBFX0lEWF9TWVNfQ1RSTDJdCT0gU1RNUEU4MTFfUkVHX1NZU19DVFJMMiwKIAlbU1RNUEVfSURYX0lDUl9MU0JdCT0gU1RNUEU4MTFfUkVHX0lOVF9DVFJMLAogCVtTVE1QRV9JRFhfSUVSX0xTQl0JPSBTVE1QRTgxMV9SRUdfSU5UX0VOLAogCVtTVE1QRV9JRFhfSVNSX01TQl0JPSBTVE1QRTgxMV9SRUdfSU5UX1NUQSwKQEAgLTQ4MSw3ICs0ODMsNyBAQAogCVtTVE1QRV9JRFhfR1BBRlJfVV9NU0JdCT0gU1RNUEU4MTFfUkVHX0dQSU9fQUYsCiAJW1NUTVBFX0lEWF9JRUdQSU9SX0xTQl0JPSBTVE1QRTgxMV9SRUdfR1BJT19JTlRfRU4sCiAJW1NUTVBFX0lEWF9JU0dQSU9SX01TQl0JPSBTVE1QRTgxMV9SRUdfR1BJT19JTlRfU1RBLAotCVtTVE1QRV9JRFhfR1BFRFJfTVNCXQk9IFNUTVBFODExX1JFR19HUElPX0VELAorCVtTVE1QRV9JRFhfR1BFRFJfTFNCXQk9IFNUTVBFODExX1JFR19HUElPX0VELAogfTsKIAogc3RhdGljIHN0cnVjdCBzdG1wZV92YXJpYW50X2Jsb2NrIHN0bXBlODExX2Jsb2Nrc1tdID0gewpAQCAtNTExLDcgKzUxMyw3IEBACiAJaWYgKGJsb2NrcyAmIFNUTVBFX0JMT0NLX1RPVUNIU0NSRUVOKQogCQltYXNrIHw9IFNUTVBFODExX1NZU19DVFJMMl9UU0NfT0ZGOwogCi0JcmV0dXJuIF9fc3RtcGVfc2V0X2JpdHMoc3RtcGUsIFNUTVBFODExX1JFR19TWVNfQ1RSTDIsIG1hc2ssCisJcmV0dXJuIF9fc3RtcGVfc2V0X2JpdHMoc3RtcGUsIHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9TWVNfQ1RSTDJdLCBtYXNrLAogCQkJCWVuYWJsZSA/IDAgOiBtYXNrKTsKIH0KIApAQCAtNTUxLDI1ICs1NTMsODkgQEAKIH07CiAKIC8qCisgKiBTVE1QRTE2MDAKKyAqIENvbXBhcmVkIHRvIGFsbCBvdGhlcnMgU1RNUEUgdmFyaWFudCwgTFNCIGFuZCBNU0IgcmVncyBhcmUgbG9jYXRlZCBpbiB0aGlzCisgKiBvcmRlciA6CUxTQiAgIGFkZHIKKyAqCQlNU0IgICBhZGRyICsgMQorICogQXMgdGhlcmUgaXMgb25seSAyICogOGJpdHMgcmVnaXN0ZXJzIGZvciBHUE1SL0dQU1IvSUVHUElPUFIsIENTQiBpbmRleCBpcyBNU0IgcmVnaXN0ZXJzCisgKi8KKworc3RhdGljIGNvbnN0IHU4IHN0bXBlMTYwMF9yZWdzW10gPSB7CisJW1NUTVBFX0lEWF9DSElQX0lEXQk9IFNUTVBFMTYwMF9SRUdfQ0hJUF9JRCwKKwlbU1RNUEVfSURYX1NZU19DVFJMXQk9IFNUTVBFMTYwMF9SRUdfU1lTX0NUUkwsCisJW1NUTVBFX0lEWF9JQ1JfTFNCXQk9IFNUTVBFMTYwMF9SRUdfU1lTX0NUUkwsCisJW1NUTVBFX0lEWF9HUE1SX0xTQl0JPSBTVE1QRTE2MDBfUkVHX0dQTVJfTFNCLAorCVtTVE1QRV9JRFhfR1BNUl9DU0JdCT0gU1RNUEUxNjAwX1JFR19HUE1SX01TQiwKKwlbU1RNUEVfSURYX0dQU1JfTFNCXQk9IFNUTVBFMTYwMF9SRUdfR1BTUl9MU0IsCisJW1NUTVBFX0lEWF9HUFNSX0NTQl0JPSBTVE1QRTE2MDBfUkVHX0dQU1JfTVNCLAorCVtTVE1QRV9JRFhfR1BEUl9MU0JdCT0gU1RNUEUxNjAwX1JFR19HUERSX0xTQiwKKwlbU1RNUEVfSURYX0dQRFJfQ1NCXQk9IFNUTVBFMTYwMF9SRUdfR1BEUl9NU0IsCisJW1NUTVBFX0lEWF9JRUdQSU9SX0xTQl0JPSBTVE1QRTE2MDBfUkVHX0lFR1BJT1JfTFNCLAorCVtTVE1QRV9JRFhfSUVHUElPUl9DU0JdCT0gU1RNUEUxNjAwX1JFR19JRUdQSU9SX01TQiwKKwlbU1RNUEVfSURYX0lTR1BJT1JfTFNCXQk9IFNUTVBFMTYwMF9SRUdfSVNHUElPUl9MU0IsCit9OworCitzdGF0aWMgc3RydWN0IHN0bXBlX3ZhcmlhbnRfYmxvY2sgc3RtcGUxNjAwX2Jsb2Nrc1tdID0geworCXsKKwkJLmNlbGwJPSAmc3RtcGVfZ3Bpb19jZWxsLAorCQkuaXJxCT0gMCwKKwkJLmJsb2NrCT0gU1RNUEVfQkxPQ0tfR1BJTywKKwl9LAorfTsKKworc3RhdGljIGludCBzdG1wZTE2MDBfZW5hYmxlKHN0cnVjdCBzdG1wZSAqc3RtcGUsIHVuc2lnbmVkIGludCBibG9ja3MsCisJCQkgICBib29sIGVuYWJsZSkKK3sKKwlpZiAoYmxvY2tzICYgU1RNUEVfQkxPQ0tfR1BJTykKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBzdG1wZV92YXJpYW50X2luZm8gc3RtcGUxNjAwID0geworCS5uYW1lCQk9ICJzdG1wZTE2MDAiLAorCS5pZF92YWwJCT0gU1RNUEUxNjAwX0lELAorCS5pZF9tYXNrCT0gMHhmZmZmLAorCS5udW1fZ3Bpb3MJPSAxNiwKKwkuYWZfYml0cwk9IDAsCisJLnJlZ3MJCT0gc3RtcGUxNjAwX3JlZ3MsCisJLmJsb2NrcwkJPSBzdG1wZTE2MDBfYmxvY2tzLAorCS5udW1fYmxvY2tzCT0gQVJSQVlfU0laRShzdG1wZTE2MDBfYmxvY2tzKSwKKwkubnVtX2lycXMJPSBTVE1QRTE2MDBfTlJfSU5URVJOQUxfSVJRUywKKwkuZW5hYmxlCQk9IHN0bXBlMTYwMF9lbmFibGUsCit9OworCisvKgogICogU1RNUEUxNjAxCiAgKi8KIAogc3RhdGljIGNvbnN0IHU4IHN0bXBlMTYwMV9yZWdzW10gPSB7CiAJW1NUTVBFX0lEWF9DSElQX0lEXQk9IFNUTVBFMTYwMV9SRUdfQ0hJUF9JRCwKKwlbU1RNUEVfSURYX1NZU19DVFJMXQk9IFNUTVBFMTYwMV9SRUdfU1lTX0NUUkwsCisJW1NUTVBFX0lEWF9TWVNfQ1RSTDJdCT0gU1RNUEUxNjAxX1JFR19TWVNfQ1RSTDIsCiAJW1NUTVBFX0lEWF9JQ1JfTFNCXQk9IFNUTVBFMTYwMV9SRUdfSUNSX0xTQiwKKwlbU1RNUEVfSURYX0lFUl9NU0JdCT0gU1RNUEUxNjAxX1JFR19JRVJfTVNCLAogCVtTVE1QRV9JRFhfSUVSX0xTQl0JPSBTVE1QRTE2MDFfUkVHX0lFUl9MU0IsCiAJW1NUTVBFX0lEWF9JU1JfTVNCXQk9IFNUTVBFMTYwMV9SRUdfSVNSX01TQiwKIAlbU1RNUEVfSURYX0dQTVJfTFNCXQk9IFNUTVBFMTYwMV9SRUdfR1BJT19NUF9MU0IsCisJW1NUTVBFX0lEWF9HUE1SX0NTQl0JPSBTVE1QRTE2MDFfUkVHX0dQSU9fTVBfTVNCLAogCVtTVE1QRV9JRFhfR1BTUl9MU0JdCT0gU1RNUEUxNjAxX1JFR19HUElPX1NFVF9MU0IsCisJW1NUTVBFX0lEWF9HUFNSX0NTQl0JPSBTVE1QRTE2MDFfUkVHX0dQSU9fU0VUX01TQiwKIAlbU1RNUEVfSURYX0dQQ1JfTFNCXQk9IFNUTVBFMTYwMV9SRUdfR1BJT19DTFJfTFNCLAorCVtTVE1QRV9JRFhfR1BDUl9DU0JdCT0gU1RNUEUxNjAxX1JFR19HUElPX0NMUl9NU0IsCiAJW1NUTVBFX0lEWF9HUERSX0xTQl0JPSBTVE1QRTE2MDFfUkVHX0dQSU9fU0VUX0RJUl9MU0IsCisJW1NUTVBFX0lEWF9HUERSX0NTQl0JPSBTVE1QRTE2MDFfUkVHX0dQSU9fU0VUX0RJUl9NU0IsCisJW1NUTVBFX0lEWF9HUEVEUl9MU0JdCT0gU1RNUEUxNjAxX1JFR19HUElPX0VEX0xTQiwKKwlbU1RNUEVfSURYX0dQRURSX0NTQl0JPSBTVE1QRTE2MDFfUkVHX0dQSU9fRURfTVNCLAogCVtTVE1QRV9JRFhfR1BSRVJfTFNCXQk9IFNUTVBFMTYwMV9SRUdfR1BJT19SRV9MU0IsCisJW1NUTVBFX0lEWF9HUFJFUl9DU0JdCT0gU1RNUEUxNjAxX1JFR19HUElPX1JFX01TQiwKIAlbU1RNUEVfSURYX0dQRkVSX0xTQl0JPSBTVE1QRTE2MDFfUkVHX0dQSU9fRkVfTFNCLAorCVtTVE1QRV9JRFhfR1BGRVJfQ1NCXQk9IFNUTVBFMTYwMV9SRUdfR1BJT19GRV9NU0IsCiAJW1NUTVBFX0lEWF9HUFBVUl9MU0JdCT0gU1RNUEUxNjAxX1JFR19HUElPX1BVX0xTQiwKIAlbU1RNUEVfSURYX0dQQUZSX1VfTVNCXQk9IFNUTVBFMTYwMV9SRUdfR1BJT19BRl9VX01TQiwKIAlbU1RNUEVfSURYX0lFR1BJT1JfTFNCXQk9IFNUTVBFMTYwMV9SRUdfSU5UX0VOX0dQSU9fTUFTS19MU0IsCisJW1NUTVBFX0lEWF9JRUdQSU9SX0NTQl0JPSBTVE1QRTE2MDFfUkVHX0lOVF9FTl9HUElPX01BU0tfTVNCLAogCVtTVE1QRV9JRFhfSVNHUElPUl9NU0JdCT0gU1RNUEUxNjAxX1JFR19JTlRfU1RBX0dQSU9fTVNCLAotCVtTVE1QRV9JRFhfR1BFRFJfTVNCXQk9IFNUTVBFMTYwMV9SRUdfR1BJT19FRF9NU0IsCiB9OwogCiBzdGF0aWMgc3RydWN0IHN0bXBlX3ZhcmlhbnRfYmxvY2sgc3RtcGUxNjAxX2Jsb2Nrc1tdID0gewpAQCAtNjQwLDEzICs3MDYsMTMgQEAKIAkJcmV0dXJuIHRpbWVvdXQ7CiAJfQogCi0JcmV0ID0gX19zdG1wZV9zZXRfYml0cyhzdG1wZSwgU1RNUEUxNjAxX1JFR19TWVNfQ1RSTDIsCisJcmV0ID0gX19zdG1wZV9zZXRfYml0cyhzdG1wZSwgc3RtcGUtPnJlZ3NbU1RNUEVfSURYX1NZU19DVFJMMl0sCiAJCQlTVE1QRTE2MDFfQVVUT1NMRUVQX1RJTUVPVVRfTUFTSywKIAkJCXRpbWVvdXQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0dXJuIF9fc3RtcGVfc2V0X2JpdHMoc3RtcGUsIFNUTVBFMTYwMV9SRUdfU1lTX0NUUkwyLAorCXJldHVybiBfX3N0bXBlX3NldF9iaXRzKHN0bXBlLCBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfU1lTX0NUUkwyXSwKIAkJCVNUUE1FMTYwMV9BVVRPU0xFRVBfRU5BQkxFLAogCQkJU1RQTUUxNjAxX0FVVE9TTEVFUF9FTkFCTEUpOwogfQpAQCAtNjcxLDcgKzczNyw3IEBACiAJZWxzZQogCQltYXNrICY9IH5TVE1QRTE2MDFfU1lTX0NUUkxfRU5BQkxFX1NQV007CiAKLQlyZXR1cm4gX19zdG1wZV9zZXRfYml0cyhzdG1wZSwgU1RNUEUxNjAxX1JFR19TWVNfQ1RSTCwgbWFzaywKKwlyZXR1cm4gX19zdG1wZV9zZXRfYml0cyhzdG1wZSwgc3RtcGUtPnJlZ3NbU1RNUEVfSURYX1NZU19DVFJMXSwgbWFzaywKIAkJCQllbmFibGUgPyBtYXNrIDogMCk7CiB9CiAKQEAgLTcxMCwxOCArNzc2LDMzIEBACiAgKi8KIHN0YXRpYyBjb25zdCB1OCBzdG1wZTE4MDFfcmVnc1tdID0gewogCVtTVE1QRV9JRFhfQ0hJUF9JRF0JPSBTVE1QRTE4MDFfUkVHX0NISVBfSUQsCisJW1NUTVBFX0lEWF9TWVNfQ1RSTF0JPSBTVE1QRTE4MDFfUkVHX1NZU19DVFJMLAogCVtTVE1QRV9JRFhfSUNSX0xTQl0JPSBTVE1QRTE4MDFfUkVHX0lOVF9DVFJMX0xPVywKIAlbU1RNUEVfSURYX0lFUl9MU0JdCT0gU1RNUEUxODAxX1JFR19JTlRfRU5fTUFTS19MT1csCiAJW1NUTVBFX0lEWF9JU1JfTFNCXQk9IFNUTVBFMTgwMV9SRUdfSU5UX1NUQV9MT1csCiAJW1NUTVBFX0lEWF9HUE1SX0xTQl0JPSBTVE1QRTE4MDFfUkVHX0dQSU9fTVBfTE9XLAorCVtTVE1QRV9JRFhfR1BNUl9DU0JdCT0gU1RNUEUxODAxX1JFR19HUElPX01QX01JRCwKKwlbU1RNUEVfSURYX0dQTVJfTVNCXQk9IFNUTVBFMTgwMV9SRUdfR1BJT19NUF9ISUdILAogCVtTVE1QRV9JRFhfR1BTUl9MU0JdCT0gU1RNUEUxODAxX1JFR19HUElPX1NFVF9MT1csCisJW1NUTVBFX0lEWF9HUFNSX0NTQl0JPSBTVE1QRTE4MDFfUkVHX0dQSU9fU0VUX01JRCwKKwlbU1RNUEVfSURYX0dQU1JfTVNCXQk9IFNUTVBFMTgwMV9SRUdfR1BJT19TRVRfSElHSCwKIAlbU1RNUEVfSURYX0dQQ1JfTFNCXQk9IFNUTVBFMTgwMV9SRUdfR1BJT19DTFJfTE9XLAorCVtTVE1QRV9JRFhfR1BDUl9DU0JdCT0gU1RNUEUxODAxX1JFR19HUElPX0NMUl9NSUQsCisJW1NUTVBFX0lEWF9HUENSX01TQl0JPSBTVE1QRTE4MDFfUkVHX0dQSU9fQ0xSX0hJR0gsCiAJW1NUTVBFX0lEWF9HUERSX0xTQl0JPSBTVE1QRTE4MDFfUkVHX0dQSU9fU0VUX0RJUl9MT1csCisJW1NUTVBFX0lEWF9HUERSX0NTQl0JPSBTVE1QRTE4MDFfUkVHX0dQSU9fU0VUX0RJUl9NSUQsCisJW1NUTVBFX0lEWF9HUERSX01TQl0JPSBTVE1QRTE4MDFfUkVHX0dQSU9fU0VUX0RJUl9ISUdILAogCVtTVE1QRV9JRFhfR1BSRVJfTFNCXQk9IFNUTVBFMTgwMV9SRUdfR1BJT19SRV9MT1csCisJW1NUTVBFX0lEWF9HUFJFUl9DU0JdCT0gU1RNUEUxODAxX1JFR19HUElPX1JFX01JRCwKKwlbU1RNUEVfSURYX0dQUkVSX01TQl0JPSBTVE1QRTE4MDFfUkVHX0dQSU9fUkVfSElHSCwKIAlbU1RNUEVfSURYX0dQRkVSX0xTQl0JPSBTVE1QRTE4MDFfUkVHX0dQSU9fRkVfTE9XLAorCVtTVE1QRV9JRFhfR1BGRVJfQ1NCXQk9IFNUTVBFMTgwMV9SRUdfR1BJT19GRV9NSUQsCisJW1NUTVBFX0lEWF9HUEZFUl9NU0JdCT0gU1RNUEUxODAxX1JFR19HUElPX0ZFX0hJR0gsCiAJW1NUTVBFX0lEWF9HUFBVUl9MU0JdCT0gU1RNUEUxODAxX1JFR19HUElPX1BVTExfVVBfTE9XLAogCVtTVE1QRV9JRFhfSUVHUElPUl9MU0JdCT0gU1RNUEUxODAxX1JFR19JTlRfRU5fR1BJT19NQVNLX0xPVywKLQlbU1RNUEVfSURYX0lTR1BJT1JfTFNCXQk9IFNUTVBFMTgwMV9SRUdfSU5UX1NUQV9HUElPX0xPVywKKwlbU1RNUEVfSURYX0lFR1BJT1JfQ1NCXQk9IFNUTVBFMTgwMV9SRUdfSU5UX0VOX0dQSU9fTUFTS19NSUQsCisJW1NUTVBFX0lEWF9JRUdQSU9SX01TQl0JPSBTVE1QRTE4MDFfUkVHX0lOVF9FTl9HUElPX01BU0tfSElHSCwKKwlbU1RNUEVfSURYX0lTR1BJT1JfTVNCXQk9IFNUTVBFMTgwMV9SRUdfSU5UX1NUQV9HUElPX0hJR0gsCiB9OwogCiBzdGF0aWMgc3RydWN0IHN0bXBlX3ZhcmlhbnRfYmxvY2sgc3RtcGUxODAxX2Jsb2Nrc1tdID0gewpAQCAtNzUxLDIyICs4MzIsMzEgQEAKIAkJCQllbmFibGUgPyBtYXNrIDogMCk7CiB9CiAKLXN0YXRpYyBpbnQgc3RtcGUxODAxX3Jlc2V0KHN0cnVjdCBzdG1wZSAqc3RtcGUpCitzdGF0aWMgaW50IHN0bXBlX3Jlc2V0KHN0cnVjdCBzdG1wZSAqc3RtcGUpCiB7CisJdTE2IGlkX3ZhbCA9IHN0bXBlLT52YXJpYW50LT5pZF92YWw7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCWludCByZXQgPSAwOworCXU4IHJlc2V0X2JpdDsKIAotCXJldCA9IF9fc3RtcGVfc2V0X2JpdHMoc3RtcGUsIFNUTVBFMTgwMV9SRUdfU1lTX0NUUkwsCi0JCVNUTVBFMTgwMV9NU0tfU1lTX0NUUkxfUkVTRVQsIFNUTVBFMTgwMV9NU0tfU1lTX0NUUkxfUkVTRVQpOworCWlmIChpZF92YWwgPT0gU1RNUEU4MTFfSUQpCisJCS8qIFNUTVBFODAxIGFuZCBTVE1QRTYxMCB1c2UgYml0IDEgb2YgU1lTX0NUUkwgcmVnaXN0ZXIgKi8KKwkJcmVzZXRfYml0ID0gU1RNUEU4MTFfU1lTX0NUUkxfUkVTRVQ7CisJZWxzZQorCQkvKiBhbGwgb3RoZXIgU1RNUEUgdmFyaWFudCB1c2UgYml0IDcgb2YgU1lTX0NUUkwgcmVnaXN0ZXIgKi8KKwkJcmVzZXRfYml0ID0gU1RNUEVfU1lTX0NUUkxfUkVTRVQ7CisKKwlyZXQgPSBfX3N0bXBlX3NldF9iaXRzKHN0bXBlLCBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfU1lTX0NUUkxdLAorCQkJICAgICAgIHJlc2V0X2JpdCwgcmVzZXRfYml0KTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOwogCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewotCQlyZXQgPSBfX3N0bXBlX3JlZ19yZWFkKHN0bXBlLCBTVE1QRTE4MDFfUkVHX1NZU19DVFJMKTsKKwkJcmV0ID0gX19zdG1wZV9yZWdfcmVhZChzdG1wZSwgc3RtcGUtPnJlZ3NbU1RNUEVfSURYX1NZU19DVFJMXSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKLQkJaWYgKCEocmV0ICYgU1RNUEUxODAxX01TS19TWVNfQ1RSTF9SRVNFVCkpCisJCWlmICghKHJldCAmIHJlc2V0X2JpdCkpCiAJCQlyZXR1cm4gMDsKIAkJdXNsZWVwX3JhbmdlKDEwMCwgMjAwKTsKIAl9CkBAIC03OTQsMjAgKzg4NCwzOSBAQAogCiBzdGF0aWMgY29uc3QgdTggc3RtcGUyNHh4X3JlZ3NbXSA9IHsKIAlbU1RNUEVfSURYX0NISVBfSURdCT0gU1RNUEUyNFhYX1JFR19DSElQX0lELAorCVtTVE1QRV9JRFhfU1lTX0NUUkxdCT0gU1RNUEUyNFhYX1JFR19TWVNfQ1RSTCwKKwlbU1RNUEVfSURYX1NZU19DVFJMMl0JPSBTVE1QRTI0WFhfUkVHX1NZU19DVFJMMiwKIAlbU1RNUEVfSURYX0lDUl9MU0JdCT0gU1RNUEUyNFhYX1JFR19JQ1JfTFNCLAorCVtTVE1QRV9JRFhfSUVSX01TQl0JPSBTVE1QRTI0WFhfUkVHX0lFUl9NU0IsCiAJW1NUTVBFX0lEWF9JRVJfTFNCXQk9IFNUTVBFMjRYWF9SRUdfSUVSX0xTQiwKIAlbU1RNUEVfSURYX0lTUl9NU0JdCT0gU1RNUEUyNFhYX1JFR19JU1JfTVNCLAogCVtTVE1QRV9JRFhfR1BNUl9MU0JdCT0gU1RNUEUyNFhYX1JFR19HUE1SX0xTQiwKKwlbU1RNUEVfSURYX0dQTVJfQ1NCXQk9IFNUTVBFMjRYWF9SRUdfR1BNUl9DU0IsCisJW1NUTVBFX0lEWF9HUE1SX01TQl0JPSBTVE1QRTI0WFhfUkVHX0dQTVJfTVNCLAogCVtTVE1QRV9JRFhfR1BTUl9MU0JdCT0gU1RNUEUyNFhYX1JFR19HUFNSX0xTQiwKKwlbU1RNUEVfSURYX0dQU1JfQ1NCXQk9IFNUTVBFMjRYWF9SRUdfR1BTUl9DU0IsCisJW1NUTVBFX0lEWF9HUFNSX01TQl0JPSBTVE1QRTI0WFhfUkVHX0dQU1JfTVNCLAogCVtTVE1QRV9JRFhfR1BDUl9MU0JdCT0gU1RNUEUyNFhYX1JFR19HUENSX0xTQiwKKwlbU1RNUEVfSURYX0dQQ1JfQ1NCXQk9IFNUTVBFMjRYWF9SRUdfR1BDUl9DU0IsCisJW1NUTVBFX0lEWF9HUENSX01TQl0JPSBTVE1QRTI0WFhfUkVHX0dQQ1JfTVNCLAogCVtTVE1QRV9JRFhfR1BEUl9MU0JdCT0gU1RNUEUyNFhYX1JFR19HUERSX0xTQiwKKwlbU1RNUEVfSURYX0dQRFJfQ1NCXQk9IFNUTVBFMjRYWF9SRUdfR1BEUl9DU0IsCisJW1NUTVBFX0lEWF9HUERSX01TQl0JPSBTVE1QRTI0WFhfUkVHX0dQRFJfTVNCLAogCVtTVE1QRV9JRFhfR1BSRVJfTFNCXQk9IFNUTVBFMjRYWF9SRUdfR1BSRVJfTFNCLAorCVtTVE1QRV9JRFhfR1BSRVJfQ1NCXQk9IFNUTVBFMjRYWF9SRUdfR1BSRVJfQ1NCLAorCVtTVE1QRV9JRFhfR1BSRVJfTVNCXQk9IFNUTVBFMjRYWF9SRUdfR1BSRVJfTVNCLAogCVtTVE1QRV9JRFhfR1BGRVJfTFNCXQk9IFNUTVBFMjRYWF9SRUdfR1BGRVJfTFNCLAorCVtTVE1QRV9JRFhfR1BGRVJfQ1NCXQk9IFNUTVBFMjRYWF9SRUdfR1BGRVJfQ1NCLAorCVtTVE1QRV9JRFhfR1BGRVJfTVNCXQk9IFNUTVBFMjRYWF9SRUdfR1BGRVJfTVNCLAogCVtTVE1QRV9JRFhfR1BQVVJfTFNCXQk9IFNUTVBFMjRYWF9SRUdfR1BQVVJfTFNCLAogCVtTVE1QRV9JRFhfR1BQRFJfTFNCXQk9IFNUTVBFMjRYWF9SRUdfR1BQRFJfTFNCLAogCVtTVE1QRV9JRFhfR1BBRlJfVV9NU0JdCT0gU1RNUEUyNFhYX1JFR19HUEFGUl9VX01TQiwKIAlbU1RNUEVfSURYX0lFR1BJT1JfTFNCXQk9IFNUTVBFMjRYWF9SRUdfSUVHUElPUl9MU0IsCisJW1NUTVBFX0lEWF9JRUdQSU9SX0NTQl0JPSBTVE1QRTI0WFhfUkVHX0lFR1BJT1JfQ1NCLAorCVtTVE1QRV9JRFhfSUVHUElPUl9NU0JdCT0gU1RNUEUyNFhYX1JFR19JRUdQSU9SX01TQiwKIAlbU1RNUEVfSURYX0lTR1BJT1JfTVNCXQk9IFNUTVBFMjRYWF9SRUdfSVNHUElPUl9NU0IsCisJW1NUTVBFX0lEWF9HUEVEUl9MU0JdCT0gU1RNUEUyNFhYX1JFR19HUEVEUl9MU0IsCisJW1NUTVBFX0lEWF9HUEVEUl9DU0JdCT0gU1RNUEUyNFhYX1JFR19HUEVEUl9DU0IsCiAJW1NUTVBFX0lEWF9HUEVEUl9NU0JdCT0gU1RNUEUyNFhYX1JFR19HUEVEUl9NU0IsCiB9OwogCkBAIC04NDAsNyArOTQ5LDcgQEAKIAlpZiAoYmxvY2tzICYgU1RNUEVfQkxPQ0tfS0VZUEFEKQogCQltYXNrIHw9IFNUTVBFMjRYWF9TWVNfQ1RSTF9FTkFCTEVfS1BDOwogCi0JcmV0dXJuIF9fc3RtcGVfc2V0X2JpdHMoc3RtcGUsIFNUTVBFMjRYWF9SRUdfU1lTX0NUUkwsIG1hc2ssCisJcmV0dXJuIF9fc3RtcGVfc2V0X2JpdHMoc3RtcGUsIHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9TWVNfQ1RSTF0sIG1hc2ssCiAJCQkJZW5hYmxlID8gbWFzayA6IDApOwogfQogCkBAIC04OTMsNiArMTAwMiw3IEBACiAJW1NUTVBFNjEwXQk9ICZzdG1wZTYxMCwKIAlbU1RNUEU4MDFdCT0gJnN0bXBlODAxLAogCVtTVE1QRTgxMV0JPSAmc3RtcGU4MTEsCisJW1NUTVBFMTYwMF0JPSAmc3RtcGUxNjAwLAogCVtTVE1QRTE2MDFdCT0gJnN0bXBlMTYwMSwKIAlbU1RNUEUxODAxXQk9ICZzdG1wZTE4MDEsCiAJW1NUTVBFMjQwMV0JPSAmc3RtcGUyNDAxLApAQCAtOTE5LDcgKzEwMjksOCBAQAogCWludCByZXQ7CiAJaW50IGk7CiAKLQlpZiAodmFyaWFudC0+aWRfdmFsID09IFNUTVBFODAxX0lEKSB7CisJaWYgKHZhcmlhbnQtPmlkX3ZhbCA9PSBTVE1QRTgwMV9JRCB8fAorCSAgICB2YXJpYW50LT5pZF92YWwgPT0gU1RNUEUxNjAwX0lEKSB7CiAJCWludCBiYXNlID0gaXJxX2NyZWF0ZV9tYXBwaW5nKHN0bXBlLT5kb21haW4sIDApOwogCiAJCWhhbmRsZV9uZXN0ZWRfaXJxKGJhc2UpOwpAQCAtOTgyLDcgKzEwOTMsNyBAQAogCQkJY29udGludWU7CiAKIAkJc3RtcGUtPm9sZGllcltpXSA9IG5ldzsKLQkJc3RtcGVfcmVnX3dyaXRlKHN0bXBlLCBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfSUVSX0xTQl0gLSBpLCBuZXcpOworCQlzdG1wZV9yZWdfd3JpdGUoc3RtcGUsIHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9JRVJfTFNCICsgaV0sIG5ldyk7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZzdG1wZS0+aXJxX2xvY2spOwpAQCAtMTA4OCwyMCArMTE5OSwxOCBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoaWQgPT0gU1RNUEUxODAxX0lEKQl7Ci0JCXJldCA9ICBzdG1wZTE4MDFfcmVzZXQoc3RtcGUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JfQorCXJldCA9ICBzdG1wZV9yZXNldChzdG1wZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAlpZiAoc3RtcGUtPmlycSA+PSAwKSB7Ci0JCWlmIChpZCA9PSBTVE1QRTgwMV9JRCkKLQkJCWljciA9IFNUTVBFODAxX1JFR19TWVNfQ1RSTF9JTlRfRU47CisJCWlmIChpZCA9PSBTVE1QRTgwMV9JRCB8fCBpZCA9PSBTVE1QRTE2MDBfSUQpCisJCQlpY3IgPSBTVE1QRV9TWVNfQ1RSTF9JTlRfRU47CiAJCWVsc2UKIAkJCWljciA9IFNUTVBFX0lDUl9MU0JfR0lNOwogCi0JCS8qIFNUTVBFODAxIGRvZXNuJ3Qgc3VwcG9ydCBFZGdlIGludGVycnVwdHMgKi8KLQkJaWYgKGlkICE9IFNUTVBFODAxX0lEKSB7CisJCS8qIFNUTVBFODAxIGFuZCBTVE1QRTE2MDAgZG9uJ3Qgc3VwcG9ydCBFZGdlIGludGVycnVwdHMgKi8KKwkJaWYgKGlkICE9IFNUTVBFODAxX0lEICYmIGlkICE9IFNUTVBFMTYwMF9JRCkgewogCQkJaWYgKGlycV90cmlnZ2VyID09IElSUUZfVFJJR0dFUl9GQUxMSU5HIHx8CiAJCQkJCWlycV90cmlnZ2VyID09IElSUUZfVFJJR0dFUl9SSVNJTkcpCiAJCQkJaWNyIHw9IFNUTVBFX0lDUl9MU0JfRURHRTsKQEAgLTExMDksOCArMTIxOCw4IEBACiAKIAkJaWYgKGlycV90cmlnZ2VyID09IElSUUZfVFJJR0dFUl9SSVNJTkcgfHwKIAkJCQlpcnFfdHJpZ2dlciA9PSBJUlFGX1RSSUdHRVJfSElHSCkgewotCQkJaWYgKGlkID09IFNUTVBFODAxX0lEKQotCQkJCWljciB8PSBTVE1QRTgwMV9SRUdfU1lTX0NUUkxfSU5UX0hJOworCQkJaWYgKGlkID09IFNUTVBFODAxX0lEIHx8IGlkID09IFNUTVBFMTYwMF9JRCkKKwkJCQlpY3IgfD0gU1RNUEVfU1lTX0NUUkxfSU5UX0hJOwogCQkJZWxzZQogCQkJCWljciB8PSBTVE1QRV9JQ1JfTFNCX0hJR0g7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3N0bXBlLmggYi9kcml2ZXJzL21mZC9zdG1wZS5oCmluZGV4IDg0YWRiNDYuLmY3ZWZkZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3N0bXBlLmgKKysrIGIvZHJpdmVycy9tZmQvc3RtcGUuaApAQCAtMTA0LDYgKzEwNCwxMCBAQAogI2RlZmluZSBTVE1QRV9JQ1JfTFNCX0VER0UJKDEgPDwgMSkKICNkZWZpbmUgU1RNUEVfSUNSX0xTQl9HSU0JKDEgPDwgMCkKIAorI2RlZmluZSBTVE1QRV9TWVNfQ1RSTF9SRVNFVAkoMSA8PCA3KQorI2RlZmluZSBTVE1QRV9TWVNfQ1RSTF9JTlRfRU4JKDEgPDwgMikKKyNkZWZpbmUgU1RNUEVfU1lTX0NUUkxfSU5UX0hJCSgxIDw8IDApCisKIC8qCiAgKiBTVE1QRTgwMQogICovCkBAIC0xMTksMTMgKzEyMywxMCBAQAogI2RlZmluZSBTVE1QRTgwMV9SRUdfR1BJT19TRVRfUElOCTB4MTEKICNkZWZpbmUgU1RNUEU4MDFfUkVHX0dQSU9fRElSCQkweDEyCiAKLSNkZWZpbmUgU1RNUEU4MDFfUkVHX1NZU19DVFJMX1JFU0VUCSgxIDw8IDcpCi0jZGVmaW5lIFNUTVBFODAxX1JFR19TWVNfQ1RSTF9JTlRfRU4JKDEgPDwgMikKLSNkZWZpbmUgU1RNUEU4MDFfUkVHX1NZU19DVFJMX0lOVF9ISQkoMSA8PCAwKQotCiAvKgogICogU1RNUEU4MTEKICAqLworI2RlZmluZSBTVE1QRTgxMV9JRAkJCTB4MDgxMQogCiAjZGVmaW5lIFNUTVBFODExX0lSUV9UT1VDSF9ERVQJCTAKICNkZWZpbmUgU1RNUEU4MTFfSVJRX0ZJRk9fVEgJCTEKQEAgLTEzOCw2ICsxMzksNyBAQAogI2RlZmluZSBTVE1QRTgxMV9OUl9JTlRFUk5BTF9JUlFTCTgKIAogI2RlZmluZSBTVE1QRTgxMV9SRUdfQ0hJUF9JRAkJMHgwMAorI2RlZmluZSBTVE1QRTgxMV9SRUdfU1lTX0NUUkwJCTB4MDMKICNkZWZpbmUgU1RNUEU4MTFfUkVHX1NZU19DVFJMMgkJMHgwNAogI2RlZmluZSBTVE1QRTgxMV9SRUdfU1BJX0NGRwkJMHgwOAogI2RlZmluZSBTVE1QRTgxMV9SRUdfSU5UX0NUUkwJCTB4MDkKQEAgLTE1NCwxMiArMTU2LDM1IEBACiAjZGVmaW5lIFNUTVBFODExX1JFR19HUElPX0ZFCQkweDE2CiAjZGVmaW5lIFNUTVBFODExX1JFR19HUElPX0FGCQkweDE3CiAKKyNkZWZpbmUgU1RNUEU4MTFfU1lTX0NUUkxfUkVTRVQJCSgxIDw8IDEpCisKICNkZWZpbmUgU1RNUEU4MTFfU1lTX0NUUkwyX0FEQ19PRkYJKDEgPDwgMCkKICNkZWZpbmUgU1RNUEU4MTFfU1lTX0NUUkwyX1RTQ19PRkYJKDEgPDwgMSkKICNkZWZpbmUgU1RNUEU4MTFfU1lTX0NUUkwyX0dQSU9fT0ZGCSgxIDw8IDIpCiAjZGVmaW5lIFNUTVBFODExX1NZU19DVFJMMl9UU19PRkYJKDEgPDwgMykKIAogLyoKKyAqIFNUTVBFMTYwMAorICovCisjZGVmaW5lIFNUTVBFMTYwMF9JRAkJCTB4MDAxNgorI2RlZmluZSBTVE1QRTE2MDBfTlJfSU5URVJOQUxfSVJRUwkxNgorCisjZGVmaW5lIFNUTVBFMTYwMF9SRUdfQ0hJUF9JRAkJMHgwMAorI2RlZmluZSBTVE1QRTE2MDBfUkVHX1NZU19DVFJMCQkweDAzCisjZGVmaW5lIFNUTVBFMTYwMF9SRUdfSUVHUElPUl9MU0IJMHgwOAorI2RlZmluZSBTVE1QRTE2MDBfUkVHX0lFR1BJT1JfTVNCCTB4MDkKKyNkZWZpbmUgU1RNUEUxNjAwX1JFR19JU0dQSU9SX0xTQgkweDBBCisjZGVmaW5lIFNUTVBFMTYwMF9SRUdfSVNHUElPUl9NU0IJMHgwQgorI2RlZmluZSBTVE1QRTE2MDBfUkVHX0dQTVJfTFNCCQkweDEwCisjZGVmaW5lIFNUTVBFMTYwMF9SRUdfR1BNUl9NU0IJCTB4MTEKKyNkZWZpbmUgU1RNUEUxNjAwX1JFR19HUFNSX0xTQgkJMHgxMgorI2RlZmluZSBTVE1QRTE2MDBfUkVHX0dQU1JfTVNCCQkweDEzCisjZGVmaW5lIFNUTVBFMTYwMF9SRUdfR1BEUl9MU0IJCTB4MTQKKyNkZWZpbmUgU1RNUEUxNjAwX1JFR19HUERSX01TQgkJMHgxNQorI2RlZmluZSBTVE1QRTE2MDBfUkVHX0dQUElSX0xTQgkJMHgxNgorI2RlZmluZSBTVE1QRTE2MDBfUkVHX0dQUElSX01TQgkJMHgxNworCisvKgogICogU1RNUEUxNjAxCiAgKi8KIApAQCAtMTc1LDE5ICsyMDAsMzIgQEAKIAogI2RlZmluZSBTVE1QRTE2MDFfUkVHX1NZU19DVFJMCQkJMHgwMgogI2RlZmluZSBTVE1QRTE2MDFfUkVHX1NZU19DVFJMMgkJCTB4MDMKKyNkZWZpbmUgU1RNUEUxNjAxX1JFR19JQ1JfTVNCCQkJMHgxMAogI2RlZmluZSBTVE1QRTE2MDFfUkVHX0lDUl9MU0IJCQkweDExCisjZGVmaW5lIFNUTVBFMTYwMV9SRUdfSUVSX01TQgkJCTB4MTIKICNkZWZpbmUgU1RNUEUxNjAxX1JFR19JRVJfTFNCCQkJMHgxMwogI2RlZmluZSBTVE1QRTE2MDFfUkVHX0lTUl9NU0IJCQkweDE0Ci0jZGVmaW5lIFNUTVBFMTYwMV9SRUdfQ0hJUF9JRAkJCTB4ODAKKyNkZWZpbmUgU1RNUEUxNjAxX1JFR19JU1JfTFNCCQkJMHgxNQorI2RlZmluZSBTVE1QRTE2MDFfUkVHX0lOVF9FTl9HUElPX01BU0tfTVNCCTB4MTYKICNkZWZpbmUgU1RNUEUxNjAxX1JFR19JTlRfRU5fR1BJT19NQVNLX0xTQgkweDE3CiAjZGVmaW5lIFNUTVBFMTYwMV9SRUdfSU5UX1NUQV9HUElPX01TQgkJMHgxOAotI2RlZmluZSBTVE1QRTE2MDFfUkVHX0dQSU9fTVBfTFNCCQkweDg3CisjZGVmaW5lIFNUTVBFMTYwMV9SRUdfSU5UX1NUQV9HUElPX0xTQgkJMHgxOQorI2RlZmluZSBTVE1QRTE2MDFfUkVHX0NISVBfSUQJCQkweDgwCisjZGVmaW5lIFNUTVBFMTYwMV9SRUdfR1BJT19TRVRfTVNCCQkweDgyCiAjZGVmaW5lIFNUTVBFMTYwMV9SRUdfR1BJT19TRVRfTFNCCQkweDgzCisjZGVmaW5lIFNUTVBFMTYwMV9SRUdfR1BJT19DTFJfTVNCCQkweDg0CiAjZGVmaW5lIFNUTVBFMTYwMV9SRUdfR1BJT19DTFJfTFNCCQkweDg1CisjZGVmaW5lIFNUTVBFMTYwMV9SRUdfR1BJT19NUF9NU0IJCTB4ODYKKyNkZWZpbmUgU1RNUEUxNjAxX1JFR19HUElPX01QX0xTQgkJMHg4NworI2RlZmluZSBTVE1QRTE2MDFfUkVHX0dQSU9fU0VUX0RJUl9NU0IJCTB4ODgKICNkZWZpbmUgU1RNUEUxNjAxX1JFR19HUElPX1NFVF9ESVJfTFNCCQkweDg5CiAjZGVmaW5lIFNUTVBFMTYwMV9SRUdfR1BJT19FRF9NU0IJCTB4OEEKKyNkZWZpbmUgU1RNUEUxNjAxX1JFR19HUElPX0VEX0xTQgkJMHg4QgorI2RlZmluZSBTVE1QRTE2MDFfUkVHX0dQSU9fUkVfTVNCCQkweDhDCiAjZGVmaW5lIFNUTVBFMTYwMV9SRUdfR1BJT19SRV9MU0IJCTB4OEQKKyNkZWZpbmUgU1RNUEUxNjAxX1JFR19HUElPX0ZFX01TQgkJMHg4RQogI2RlZmluZSBTVE1QRTE2MDFfUkVHX0dQSU9fRkVfTFNCCQkweDhGCisjZGVmaW5lIFNUTVBFMTYwMV9SRUdfR1BJT19QVV9NU0IJCTB4OTAKICNkZWZpbmUgU1RNUEUxNjAxX1JFR19HUElPX1BVX0xTQgkJMHg5MQogI2RlZmluZSBTVE1QRTE2MDFfUkVHX0dQSU9fQUZfVV9NU0IJCTB4OTIKIApAQCAtMjQzLDggKzI4MSw2IEBACiAjZGVmaW5lIFNUTVBFMTgwMV9SRUdfR1BJT19QVUxMX1VQX01JRAkJMHgyMwogI2RlZmluZSBTVE1QRTE4MDFfUkVHX0dQSU9fUFVMTF9VUF9ISUdICQkweDI0CiAKLSNkZWZpbmUgU1RNUEUxODAxX01TS19TWVNfQ1RSTF9SRVNFVAkJKDEgPDwgNykKLQogI2RlZmluZSBTVE1QRTE4MDFfTVNLX0lOVF9FTl9LUEMJCSgxIDw8IDEpCiAjZGVmaW5lIFNUTVBFMTgwMV9NU0tfSU5UX0VOX0dQSU8JCSgxIDw8IDMpCiAKQEAgLTI2NCwyMyArMzAwLDQ4IEBACiAjZGVmaW5lIFNUTVBFMjRYWF9OUl9JTlRFUk5BTF9JUlFTCTkKIAogI2RlZmluZSBTVE1QRTI0WFhfUkVHX1NZU19DVFJMCQkweDAyCisjZGVmaW5lIFNUTVBFMjRYWF9SRUdfU1lTX0NUUkwyCQkweDAzCisjZGVmaW5lIFNUTVBFMjRYWF9SRUdfSUNSX01TQgkJMHgxMAogI2RlZmluZSBTVE1QRTI0WFhfUkVHX0lDUl9MU0IJCTB4MTEKKyNkZWZpbmUgU1RNUEUyNFhYX1JFR19JRVJfTVNCCQkweDEyCiAjZGVmaW5lIFNUTVBFMjRYWF9SRUdfSUVSX0xTQgkJMHgxMwogI2RlZmluZSBTVE1QRTI0WFhfUkVHX0lTUl9NU0IJCTB4MTQKLSNkZWZpbmUgU1RNUEUyNFhYX1JFR19DSElQX0lECQkweDgwCisjZGVmaW5lIFNUTVBFMjRYWF9SRUdfSVNSX0xTQgkJMHgxNQorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0lFR1BJT1JfTVNCCTB4MTYKKyNkZWZpbmUgU1RNUEUyNFhYX1JFR19JRUdQSU9SX0NTQgkweDE3CiAjZGVmaW5lIFNUTVBFMjRYWF9SRUdfSUVHUElPUl9MU0IJMHgxOAogI2RlZmluZSBTVE1QRTI0WFhfUkVHX0lTR1BJT1JfTVNCCTB4MTkKLSNkZWZpbmUgU1RNUEUyNFhYX1JFR19HUE1SX0xTQgkJMHhBNAorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0lTR1BJT1JfQ1NCCTB4MUEKKyNkZWZpbmUgU1RNUEUyNFhYX1JFR19JU0dQSU9SX0xTQgkweDFCCisjZGVmaW5lIFNUTVBFMjRYWF9SRUdfQ0hJUF9JRAkJMHg4MAorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQU1JfTVNCCQkweDgzCisjZGVmaW5lIFNUTVBFMjRYWF9SRUdfR1BTUl9DU0IJCTB4ODQKICNkZWZpbmUgU1RNUEUyNFhYX1JFR19HUFNSX0xTQgkJMHg4NQorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQQ1JfTVNCCQkweDg2CisjZGVmaW5lIFNUTVBFMjRYWF9SRUdfR1BDUl9DU0IJCTB4ODcKICNkZWZpbmUgU1RNUEUyNFhYX1JFR19HUENSX0xTQgkJMHg4OAorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQRFJfTVNCCQkweDg5CisjZGVmaW5lIFNUTVBFMjRYWF9SRUdfR1BEUl9DU0IJCTB4OEEKICNkZWZpbmUgU1RNUEUyNFhYX1JFR19HUERSX0xTQgkJMHg4QgogI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQRURSX01TQgkJMHg4QworI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQRURSX0NTQgkJMHg4RAorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQRURSX0xTQgkJMHg4RQorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUkVSX01TQgkJMHg4RgorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUkVSX0NTQgkJMHg5MAogI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUkVSX0xTQgkJMHg5MQorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQRkVSX01TQgkJMHg5MgorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQRkVSX0NTQgkJMHg5MwogI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQRkVSX0xTQgkJMHg5NAorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUFVSX01TQgkJMHg5NQorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUFVSX0NTQgkJMHg5NgogI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUFVSX0xTQgkJMHg5NwotI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUERSX0xTQgkJMHg5YQorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUERSX01TQgkJMHg5OAorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUERSX0NTQgkJMHg5OQorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUERSX0xTQgkJMHg5QQogI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQQUZSX1VfTVNCCTB4OUIKLQorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQTVJfTVNCCQkweEEyCisjZGVmaW5lIFNUTVBFMjRYWF9SRUdfR1BNUl9DU0IJCTB4QTMKKyNkZWZpbmUgU1RNUEUyNFhYX1JFR19HUE1SX0xTQgkJMHhBNAogI2RlZmluZSBTVE1QRTI0WFhfU1lTX0NUUkxfRU5BQkxFX0dQSU8JCSgxIDw8IDMpCiAjZGVmaW5lIFNUTVBFMjRYWF9TWVNDT05fRU5BQkxFX1BXTQkJKDEgPDwgMikKICNkZWZpbmUgU1RNUEUyNFhYX1NZU19DVFJMX0VOQUJMRV9LUEMJCSgxIDw8IDEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90cHM2NTIxOC5jIGIvZHJpdmVycy9tZmQvdHBzNjUyMTguYwppbmRleCA4MGI5ZGMzLi5iYTYxMGFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90cHM2NTIxOC5jCisrKyBiL2RyaXZlcnMvbWZkL3RwczY1MjE4LmMKQEAgLTIxOSw2ICsyMTksNyBAQAogCXN0cnVjdCB0cHM2NTIxOCAqdHBzOwogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCWludCByZXQ7CisJdW5zaWduZWQgaW50IGNoaXBpZDsKIAogCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKG9mX3RwczY1MjE4X21hdGNoX3RhYmxlLCAmY2xpZW50LT5kZXYpOwogCWlmICghbWF0Y2gpIHsKQEAgLTI1MCw2ICsyNTEsMTQgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAorCXJldCA9IHRwczY1MjE4X3JlZ19yZWFkKHRwcywgVFBTNjUyMThfUkVHX0NISVBJRCwgJmNoaXBpZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHRwcy0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgY2hpcGlkOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl0cHMtPnJldiA9IGNoaXBpZCAmIFRQUzY1MjE4X0NISVBJRF9SRVZfTUFTSzsKKwogCXJldCA9IG9mX3BsYXRmb3JtX3BvcHVsYXRlKGNsaWVudC0+ZGV2Lm9mX25vZGUsIE5VTEwsIE5VTEwsCiAJCQkJICAgJmNsaWVudC0+ZGV2KTsKIAlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9taXNjL0tjb25maWcKaW5kZXggYTIxNmI0Ni4uNjQ5NzFiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9taXNjL0tjb25maWcKQEAgLTM0NSwxNiArMzQ1LDYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHRzbDI1NTAuCiAKLWNvbmZpZyBTRU5TT1JTX0JIMTc4MAotCXRyaXN0YXRlICJST0hNIEJIMTc4MEdMSSBhbWJpZW50IGxpZ2h0IHNlbnNvciIKLQlkZXBlbmRzIG9uIEkyQyAmJiBTWVNGUwotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgUk9ITSBCSDE3ODBHTEkKLQkgIGFtYmllbnQgbGlnaHQgc2Vuc29yLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBiaDE3ODBnbGkuCi0KIGNvbmZpZyBTRU5TT1JTX0JIMTc3MAogICAgICAgICAgdHJpc3RhdGUgIkJIMTc3MEdMQyAvIFNGSDc3NzAgY29tYmluZWQgQUxTIC0gUHJveGltaXR5IHNlbnNvciIKICAgICAgICAgIGRlcGVuZHMgb24gSTJDCkBAIC00MzksMzQgKzQyOSw2IEBACiAJICBsaW5lIGFuZCB0aGUgTGludXggdmVyc2lvbiBvbiB0aGUgc2Vjb25kIGxpbmUsIGJ1dCB0aGF0J3MKIAkgIHN0aWxsIHVzZWZ1bC4KIAotY29uZmlnIEJNUDA4NQotCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBTWVNGUwotCi1jb25maWcgQk1QMDg1X0kyQwotCXRyaXN0YXRlICJCTVAwODUgZGlnaXRhbCBwcmVzc3VyZSBzZW5zb3Igb24gSTJDIgotCXNlbGVjdCBCTVAwODUKLQlzZWxlY3QgUkVHTUFQX0kyQwotCWRlcGVuZHMgb24gSTJDICYmIFNZU0ZTCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IEJvc2NoIFNlbnNvcnRlYydzIGRpZ2l0YWwgcHJlc3N1cmUKLQkgIHNlbnNvciBob29rZWQgdG8gYW4gSTJDIGJ1cy4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYm1wMDg1LWkyYy4KLQotY29uZmlnIEJNUDA4NV9TUEkKLQl0cmlzdGF0ZSAiQk1QMDg1IGRpZ2l0YWwgcHJlc3N1cmUgc2Vuc29yIG9uIFNQSSIKLQlzZWxlY3QgQk1QMDg1Ci0Jc2VsZWN0IFJFR01BUF9TUEkKLQlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgU1lTRlMKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQgQm9zY2ggU2Vuc29ydGVjJ3MgZGlnaXRhbCBwcmVzc3VyZQotCSAgc2Vuc29yIGhvb2tlZCB0byBhbiBTUEkgYnVzLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBibXAwODUtc3BpLgotCiBjb25maWcgUENIX1BIVUIKIAl0cmlzdGF0ZSAiSW50ZWwgRUcyMFQgUENIL0xBUElTIFNlbWljb24gSU9IKE1MNzIxMy9NTDcyMjMvTUw3ODMxKSBQSFVCIgogCXNlbGVjdCBHRU5FUklDX05FVF9VVElMUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL01ha2VmaWxlIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCmluZGV4IDc0MTBjNmQuLjMxOTgzMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21pc2MvTWFrZWZpbGUKQEAgLTksOSArOSw2IEBACiBvYmotJChDT05GSUdfSU5URUxfTUlEX1BUSSkJKz0gcHRpLm8KIG9iai0kKENPTkZJR19BVE1FTF9TU0MpCQkrPSBhdG1lbC1zc2Mubwogb2JqLSQoQ09ORklHX0FUTUVMX1RDTElCKQkrPSBhdG1lbF90Y2xpYi5vCi1vYmotJChDT05GSUdfQk1QMDg1KQkJKz0gYm1wMDg1Lm8KLW9iai0kKENPTkZJR19CTVAwODVfSTJDKQkrPSBibXAwODUtaTJjLm8KLW9iai0kKENPTkZJR19CTVAwODVfU1BJKQkrPSBibXAwODUtc3BpLm8KIG9iai0kKENPTkZJR19EVU1NWV9JUlEpCQkrPSBkdW1teS1pcnEubwogb2JqLSQoQ09ORklHX0lDUzkzMlM0MDEpCSs9IGljczkzMnM0MDEubwogb2JqLSQoQ09ORklHX0xLRFRNKQkJKz0gbGtkdG0ubwpAQCAtMTksNyArMTYsNiBAQAogb2JqLSQoQ09ORklHX1RJRk1fN1hYMSkgICAgICAgCSs9IHRpZm1fN3h4MS5vCiBvYmotJChDT05GSUdfUEhBTlRPTSkJCSs9IHBoYW50b20ubwogb2JqLSQoQ09ORklHX1FDT01fQ09JTkNFTEwpCSs9IHFjb20tY29pbmNlbGwubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfQkgxNzgwKQkrPSBiaDE3ODBnbGkubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQkgxNzcwKQkrPSBiaDE3NzBnbGMubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQVBEUzk5MFgpCSs9IGFwZHM5OTB4Lm8KIG9iai0kKENPTkZJR19TR0lfSU9DNCkJCSs9IGlvYzQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2JoMTc4MGdsaS5jIGIvZHJpdmVycy9taXNjL2JoMTc4MGdsaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjkwY2U1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9iaDE3ODBnbGkuYworKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKgotICogYmgxNzgwZ2xpLmMKLSAqIFJPSE0gQW1iaWVudCBMaWdodCBTZW5zb3IgRHJpdmVyCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzCi0gKiBBdXRob3I6IEhlbWFudGggViA8aGVtYW50aHZAdGkuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0KLSNkZWZpbmUgQkgxNzgwX1JFR19DT05UUk9MCTB4ODAKLSNkZWZpbmUgQkgxNzgwX1JFR19QQVJUSUQJMHg4QQotI2RlZmluZSBCSDE3ODBfUkVHX01BTkZJRAkweDhCCi0jZGVmaW5lIEJIMTc4MF9SRUdfRExPVwkweDhDCi0jZGVmaW5lIEJIMTc4MF9SRUdfREhJR0gJMHg4RAotCi0jZGVmaW5lIEJIMTc4MF9SRVZNQVNLCQkoMHhmKQotI2RlZmluZSBCSDE3ODBfUE9XTUFTSwkJKDB4MykKLSNkZWZpbmUgQkgxNzgwX1BPRkYJCSgweDApCi0jZGVmaW5lIEJIMTc4MF9QT04JCSgweDMpCi0KLS8qIHBvd2VyIG9uIHNldHRsaW5nIHRpbWUgaW4gbXMgKi8KLSNkZWZpbmUgQkgxNzgwX1BPTl9ERUxBWQkyCi0KLXN0cnVjdCBiaDE3ODBfZGF0YSB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKLQlpbnQgcG93ZXJfc3RhdGU7Ci0JLyogbG9jayBmb3Igc3lzZnMgb3BlcmF0aW9ucyAqLwotCXN0cnVjdCBtdXRleCBsb2NrOwotfTsKLQotc3RhdGljIGludCBiaDE3ODBfd3JpdGUoc3RydWN0IGJoMTc4MF9kYXRhICpkZGF0YSwgdTggcmVnLCB1OCB2YWwsIGNoYXIgKm1zZykKLXsKLQlpbnQgcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkZGF0YS0+Y2xpZW50LCByZWcsIHZhbCk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoJmRkYXRhLT5jbGllbnQtPmRldiwKLQkJCSJpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhIGZhaWxlZCBlcnJvciAlZCBSZWdpc3RlciAoJXMpXG4iLAotCQkJcmV0LCBtc2cpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYmgxNzgwX3JlYWQoc3RydWN0IGJoMTc4MF9kYXRhICpkZGF0YSwgdTggcmVnLCBjaGFyICptc2cpCi17Ci0JaW50IHJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkZGF0YS0+Y2xpZW50LCByZWcpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKCZkZGF0YS0+Y2xpZW50LT5kZXYsCi0JCQkiaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhIGZhaWxlZCBlcnJvciAlZCBSZWdpc3RlciAoJXMpXG4iLAotCQkJcmV0LCBtc2cpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJoMTc4MF9zaG93X2x1eChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0Jc3RydWN0IGJoMTc4MF9kYXRhICpkZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCBsc2IsIG1zYjsKLQotCWxzYiA9IGJoMTc4MF9yZWFkKGRkYXRhLCBCSDE3ODBfUkVHX0RMT1csICJETE9XIik7Ci0JaWYgKGxzYiA8IDApCi0JCXJldHVybiBsc2I7Ci0KLQltc2IgPSBiaDE3ODBfcmVhZChkZGF0YSwgQkgxNzgwX1JFR19ESElHSCwgIkRISUdIIik7Ci0JaWYgKG1zYiA8IDApCi0JCXJldHVybiBtc2I7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKG1zYiA8PCA4KSB8IGxzYik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJoMTc4MF9zaG93X3Bvd2VyX3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0Jc3RydWN0IGJoMTc4MF9kYXRhICpkZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCBzdGF0ZTsKLQotCXN0YXRlID0gYmgxNzgwX3JlYWQoZGRhdGEsIEJIMTc4MF9SRUdfQ09OVFJPTCwgIkNPTlRST0wiKTsKLQlpZiAoc3RhdGUgPCAwKQotCQlyZXR1cm4gc3RhdGU7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3RhdGUgJiBCSDE3ODBfUE9XTUFTSyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJoMTc4MF9zdG9yZV9wb3dlcl9zdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0Jc3RydWN0IGJoMTc4MF9kYXRhICpkZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCBlcnJvcjsKLQotCWVycm9yID0ga3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQotCWlmICh2YWwgPCBCSDE3ODBfUE9GRiB8fCB2YWwgPiBCSDE3ODBfUE9OKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKLQotCWVycm9yID0gYmgxNzgwX3dyaXRlKGRkYXRhLCBCSDE3ODBfUkVHX0NPTlRST0wsIHZhbCwgIkNPTlRST0wiKTsKLQlpZiAoZXJyb3IgPCAwKSB7Ci0JCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JbXNsZWVwKEJIMTc4MF9QT05fREVMQVkpOwotCWRkYXRhLT5wb3dlcl9zdGF0ZSA9IHZhbDsKLQltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGx1eCwgU19JUlVHTywgYmgxNzgwX3Nob3dfbHV4LCBOVUxMKTsKLQotc3RhdGljIERFVklDRV9BVFRSKHBvd2VyX3N0YXRlLCBTX0lXVVNSIHwgU19JUlVHTywKLQkJYmgxNzgwX3Nob3dfcG93ZXJfc3RhdGUsIGJoMTc4MF9zdG9yZV9wb3dlcl9zdGF0ZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpiaDE3ODBfYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl9wb3dlcl9zdGF0ZS5hdHRyLAotCSZkZXZfYXR0cl9sdXguYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBiaDE3ODBfYXR0cl9ncm91cCA9IHsKLQkuYXR0cnMgPSBiaDE3ODBfYXR0cmlidXRlcywKLX07Ci0KLXN0YXRpYyBpbnQgYmgxNzgwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgYmgxNzgwX2RhdGEgKmRkYXRhOwotCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCk7Ci0KLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEUpKQotCQlyZXR1cm4gLUVJTzsKLQotCWRkYXRhID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBiaDE3ODBfZGF0YSksCi0JCQkgICAgIEdGUF9LRVJORUwpOwotCWlmIChkZGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRkYXRhLT5jbGllbnQgPSBjbGllbnQ7Ci0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGRhdGEpOwotCi0JcmV0ID0gYmgxNzgwX3JlYWQoZGRhdGEsIEJIMTc4MF9SRUdfUEFSVElELCAiUEFSVCBJRCIpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiQW1iaWVudCBMaWdodCBTZW5zb3IsIFJldiA6ICVkXG4iLAotCQkJKHJldCAmIEJIMTc4MF9SRVZNQVNLKSk7Ci0KLQltdXRleF9pbml0KCZkZGF0YS0+bG9jayk7Ci0KLQlyZXR1cm4gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYmgxNzgwX2F0dHJfZ3JvdXApOwotfQotCi1zdGF0aWMgaW50IGJoMTc4MF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZiaDE3ODBfYXR0cl9ncm91cCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19QTV9TTEVFUAotc3RhdGljIGludCBiaDE3ODBfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJoMTc4MF9kYXRhICpkZGF0YTsKLQlpbnQgc3RhdGUsIHJldDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCi0JZGRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlzdGF0ZSA9IGJoMTc4MF9yZWFkKGRkYXRhLCBCSDE3ODBfUkVHX0NPTlRST0wsICJDT05UUk9MIik7Ci0JaWYgKHN0YXRlIDwgMCkKLQkJcmV0dXJuIHN0YXRlOwotCi0JZGRhdGEtPnBvd2VyX3N0YXRlID0gc3RhdGUgJiBCSDE3ODBfUE9XTUFTSzsKLQotCXJldCA9IGJoMTc4MF93cml0ZShkZGF0YSwgQkgxNzgwX1JFR19DT05UUk9MLCBCSDE3ODBfUE9GRiwKLQkJCQkiQ09OVFJPTCIpOwotCi0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiaDE3ODBfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYmgxNzgwX2RhdGEgKmRkYXRhOwotCWludCBzdGF0ZSwgcmV0OwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0KLQlkZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCXN0YXRlID0gZGRhdGEtPnBvd2VyX3N0YXRlOwotCXJldCA9IGJoMTc4MF93cml0ZShkZGF0YSwgQkgxNzgwX1JFR19DT05UUk9MLCBzdGF0ZSwKLQkJCQkiQ09OVFJPTCIpOwotCi0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KLQotc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGJoMTc4MF9wbSwgYmgxNzgwX3N1c3BlbmQsIGJoMTc4MF9yZXN1bWUpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYmgxNzgwX2lkW10gPSB7Ci0JeyAiYmgxNzgwIiwgMCB9LAotCXsgfSwKLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBiaDE3ODBfaWQpOwotCi0jaWZkZWYgQ09ORklHX09GCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9iaDE3ODBfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInJvaG0sYmgxNzgwZ2xpIiwgfSwKLQl7fSwKLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9mX2JoMTc4MF9tYXRjaCk7Ci0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGJoMTc4MF9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IGJoMTc4MF9wcm9iZSwKLQkucmVtb3ZlCQk9IGJoMTc4MF9yZW1vdmUsCi0JLmlkX3RhYmxlCT0gYmgxNzgwX2lkLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImJoMTc4MCIsCi0JCS5wbQk9ICZiaDE3ODBfcG0sCi0JCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihvZl9iaDE3ODBfbWF0Y2gpLAotCX0sCi19OwotCi1tb2R1bGVfaTJjX2RyaXZlcihiaDE3ODBfZHJpdmVyKTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJCSDE3ODBHTEkgQW1iaWVudCBMaWdodCBTZW5zb3IgRHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJIZW1hbnRoIFYgPGhlbWFudGh2QHRpLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9ibXAwODUtaTJjLmMgYi9kcml2ZXJzL21pc2MvYm1wMDg1LWkyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzVjMjE4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9ibXAwODUtaTJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEyICBCb3NjaCBTZW5zb3J0ZWMgR21iSAotICogQ29weXJpZ2h0IChjKSAyMDEyICBVbml4cGhlcmUgQUIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSAiYm1wMDg1LmgiCi0KLSNkZWZpbmUgQk1QMDg1X0kyQ19BRERSRVNTCTB4NzcKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgQk1QMDg1X0kyQ19BRERSRVNTLAotCQkJCQkJCUkyQ19DTElFTlRfRU5EIH07Ci0KLXN0YXRpYyBpbnQgYm1wMDg1X2kyY19kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCSAgICAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQotewotCWlmIChjbGllbnQtPmFkZHIgIT0gQk1QMDg1X0kyQ19BRERSRVNTKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldHVybiBibXAwODVfZGV0ZWN0KCZjbGllbnQtPmRldik7Ci19Ci0KLXN0YXRpYyBpbnQgYm1wMDg1X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwKLQkJCQkJCSAgICAgJmJtcDA4NV9yZWdtYXBfY29uZmlnKTsKLQotCWlmIChJU19FUlIocmVnbWFwKSkgewotCQllcnIgPSBQVFJfRVJSKHJlZ21hcCk7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGluaXQgcmVnbWFwOiAlZFxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gYm1wMDg1X3Byb2JlKCZjbGllbnQtPmRldiwgcmVnbWFwLCBjbGllbnQtPmlycSk7Ci19Ci0KLXN0YXRpYyBpbnQgYm1wMDg1X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlyZXR1cm4gYm1wMDg1X3JlbW92ZSgmY2xpZW50LT5kZXYpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYm1wMDg1X2lkW10gPSB7Ci0JeyBCTVAwODVfTkFNRSwgMCB9LAotCXsgImJtcDE4MCIsIDAgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYm1wMDg1X2lkKTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGJtcDA4NV9pMmNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gQk1QMDg1X05BTUUsCi0JfSwKLQkuaWRfdGFibGUJPSBibXAwODVfaWQsCi0JLnByb2JlCQk9IGJtcDA4NV9pMmNfcHJvYmUsCi0JLnJlbW92ZQkJPSBibXAwODVfaTJjX3JlbW92ZSwKLQotCS5kZXRlY3QJCT0gYm1wMDg1X2kyY19kZXRlY3QsCi0JLmFkZHJlc3NfbGlzdAk9IG5vcm1hbF9pMmMKLX07Ci0KLW1vZHVsZV9pMmNfZHJpdmVyKGJtcDA4NV9pMmNfZHJpdmVyKTsKLQotTU9EVUxFX0FVVEhPUigiRXJpYyBBbmRlcnNzb24gPGVyaWMuYW5kZXJzc29uQHVuaXhwaGVyZS5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkJNUDA4NSBJMkMgYnVzIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2JtcDA4NS1zcGkuYyBiL2RyaXZlcnMvbWlzYy9ibXAwODUtc3BpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZWNiZjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL2JtcDA4NS1zcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgIEJvc2NoIFNlbnNvcnRlYyBHbWJICi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgIFVuaXhwaGVyZSBBQgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSAiYm1wMDg1LmgiCi0KLXN0YXRpYyBpbnQgYm1wMDg1X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqY2xpZW50KQotewotCWludCBlcnI7Ci0Jc3RydWN0IHJlZ21hcCAqcmVnbWFwOwotCi0JY2xpZW50LT5iaXRzX3Blcl93b3JkID0gODsKLQllcnIgPSBzcGlfc2V0dXAoY2xpZW50KTsKLQlpZiAoZXJyIDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInNwaV9zZXR1cCBmYWlsZWQhXG4iKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3NwaShjbGllbnQsICZibXAwODVfcmVnbWFwX2NvbmZpZyk7Ci0JaWYgKElTX0VSUihyZWdtYXApKSB7Ci0JCWVyciA9IFBUUl9FUlIocmVnbWFwKTsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gaW5pdCByZWdtYXA6ICVkXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiBibXAwODVfcHJvYmUoJmNsaWVudC0+ZGV2LCByZWdtYXAsIGNsaWVudC0+aXJxKTsKLX0KLQotc3RhdGljIGludCBibXAwODVfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqY2xpZW50KQotewotCXJldHVybiBibXAwODVfcmVtb3ZlKCZjbGllbnQtPmRldik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJtcDA4NV9vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAiYm9zY2gsYm1wMDg1IiwgfSwKLQl7IH0sCi19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYm1wMDg1X29mX21hdGNoKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGJtcDA4NV9pZFtdID0gewotCXsgImJtcDE4MCIsIDAgfSwKLQl7ICJibXAxODEiLCAwIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIGJtcDA4NV9pZCk7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBibXAwODVfc3BpX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZQk9IEJNUDA4NV9OQU1FLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBibXAwODVfb2ZfbWF0Y2gKLQl9LAotCS5pZF90YWJsZQk9IGJtcDA4NV9pZCwKLQkucHJvYmUJCT0gYm1wMDg1X3NwaV9wcm9iZSwKLQkucmVtb3ZlCQk9IGJtcDA4NV9zcGlfcmVtb3ZlCi19OwotCi1tb2R1bGVfc3BpX2RyaXZlcihibXAwODVfc3BpX2RyaXZlcik7Ci0KLU1PRFVMRV9BVVRIT1IoIkVyaWMgQW5kZXJzc29uIDxlcmljLmFuZGVyc3NvbkB1bml4cGhlcmUuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJCTVAwODUgU1BJIGJ1cyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9ibXAwODUuYyBiL2RyaXZlcnMvbWlzYy9ibXAwODUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzMTNmNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvYm1wMDg1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYgKzAsMCBAQAotLyogIENvcHlyaWdodCAoYykgMjAxMCAgQ2hyaXN0b3BoIE1haXIgPGNocmlzdG9waC5tYWlyQGdtYWlsLmNvbT4KLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIEJvc2NoIFNlbnNvcnRlYyBHbWJICi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBVbml4cGhlcmUgQUIKLSAqCi0gKiAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIGJtcDA4NSBhbmQgYm1wMTh4IGRpZ2l0YWwgYmFyb21ldHJpYyBwcmVzc3VyZQotICogIGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3JzIGZyb20gQm9zY2ggU2Vuc29ydGVjLiBUaGUgZGF0YXNoZWV0cwotICogIGFyZSBhdmFpbGFibGUgZnJvbSB0aGVpciB3ZWJzaXRlOgotICogIGh0dHA6Ly93d3cuYm9zY2gtc2Vuc29ydGVjLmNvbS9jb250ZW50L2xhbmd1YWdlMS9kb3dubG9hZHMvQlNULUJNUDA4NS1EUzAwMC0wNS5wZGYKLSAqICBodHRwOi8vd3d3LmJvc2NoLXNlbnNvcnRlYy5jb20vY29udGVudC9sYW5ndWFnZTEvZG93bmxvYWRzL0JTVC1CTVAxODAtRFMwMDAtMDcucGRmCi0gKgotICogIEEgcHJlc3N1cmUgbWVhc3VyZW1lbnQgaXMgaXNzdWVkIGJ5IHJlYWRpbmcgZnJvbSBwcmVzc3VyZTBfaW5wdXQuCi0gKiAgVGhlIHJldHVybiB2YWx1ZSByYW5nZXMgZnJvbSAzMDAwMCB0byAxMTAwMDAgcGFzY2FsIHdpdGggYSByZXN1bHV0aW9uCi0gKiAgb2YgMSBwYXNjYWwgKDAuMDEgbWlsbGliYXIpIHdoaWNoIGVuYWJsZXMgbWVhc3VyZW1lbnRzIGZyb20gOTAwMG0gYWJvdmUKLSAqICB0byA1MDBtIGJlbG93IHNlYSBsZXZlbC4KLSAqCi0gKiAgVGhlIHRlbXBlcmF0dXJlIGNhbiBiZSByZWFkIGZyb20gdGVtcDBfaW5wdXQuIFZhbHVlcyByYW5nZSBmcm9tCi0gKiAgLTQwMCB0byA4NTAgcmVwcmVzZW50aW5nIHRoZSBhbWJpZW50IHRlbXBlcmF0dXJlIGluIGRlZ3JlZSBjZWxzaXVzCi0gKiAgbXVsdGlwbGllZCBieSAxMC5UaGUgcmVzb2x1dGlvbiBpcyAwLjEgY2Vsc2l1cy4KLSAqCi0gKiAgQmVjYXVzZSBhbWJpZW50IHByZXNzdXJlIGlzIHRlbXBlcmF0dXJlIGRlcGVuZGVudCwgYSB0ZW1wZXJhdHVyZQotICogIG1lYXN1cmVtZW50IHdpbGwgYmUgZXhlY3V0ZWQgYXV0b21hdGljYWxseSBldmVuIGlmIHRoZSB1c2VyIGlzIHJlYWRpbmcKLSAqICBmcm9tIHByZXNzdXJlMF9pbnB1dC4gVGhpcyBoYXBwZW5zIGlmIHRoZSBsYXN0IHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50Ci0gKiAgaGFzIGJlZW4gZXhlY3V0ZWQgbW9yZSB0aGVuIG9uZSBzZWNvbmQgYWdvLgotICoKLSAqICBUbyBkZWNyZWFzZSBSTVMgbm9pc2UgZnJvbSBwcmVzc3VyZSBtZWFzdXJlbWVudHMsIHRoZSBibXAwODUgY2FuCi0gKiAgYXV0b25vbW91c2x5IGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiB1cCB0byBlaWdodCBzYW1wbGVzLiBUaGlzIGlzCi0gKiAgc2V0IHVwIGJ5IHdyaXRpbmcgdG8gdGhlIG92ZXJzYW1wbGluZyBzeXNmcyBmaWxlLiBBY2NlcHRlZCB2YWx1ZXMKLSAqICBhcmUgMCwgMSwgMiBhbmQgMy4gMl54IHdoZW4geCBpcyB0aGUgdmFsdWUgd3JpdHRlbiB0byB0aGlzIGZpbGUKLSAqICBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBhbWJpZW50IHByZXNzdXJlLgotICogIFJNUyBub2lzZSBpcyBzcGVjaWZpZWQgd2l0aCBzaXggcGFzY2FsICh3aXRob3V0IGF2ZXJhZ2luZykgYW5kIGRlY3JlYXNlcwotICogIGRvd24gdG8gMyBwYXNjYWwgd2hlbiB1c2luZyBhbiBvdmVyc2FtcGxpbmcgc2V0dGluZyBvZiAzLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgImJtcDA4NS5oIgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0KLSNkZWZpbmUgQk1QMDg1X0NISVBfSUQJCQkweDU1Ci0jZGVmaW5lIEJNUDA4NV9DQUxJQlJBVElPTl9EQVRBX1NUQVJUCTB4QUEKLSNkZWZpbmUgQk1QMDg1X0NBTElCUkFUSU9OX0RBVEFfTEVOR1RICTExCS8qIDE2IGJpdCB2YWx1ZXMgKi8KLSNkZWZpbmUgQk1QMDg1X0NISVBfSURfUkVHCQkweEQwCi0jZGVmaW5lIEJNUDA4NV9DVFJMX1JFRwkJCTB4RjQKLSNkZWZpbmUgQk1QMDg1X1RFTVBfTUVBU1VSRU1FTlQJCTB4MkUKLSNkZWZpbmUgQk1QMDg1X1BSRVNTVVJFX01FQVNVUkVNRU5UCTB4MzQKLSNkZWZpbmUgQk1QMDg1X0NPTlZFUlNJT05fUkVHSVNURVJfTVNCCTB4RjYKLSNkZWZpbmUgQk1QMDg1X0NPTlZFUlNJT05fUkVHSVNURVJfTFNCCTB4RjcKLSNkZWZpbmUgQk1QMDg1X0NPTlZFUlNJT05fUkVHSVNURVJfWExTQgkweEY4Ci0jZGVmaW5lIEJNUDA4NV9URU1QX0NPTlZFUlNJT05fVElNRQk1Ci0KLXN0cnVjdCBibXAwODVfY2FsaWJyYXRpb25fZGF0YSB7Ci0JczE2IEFDMSwgQUMyLCBBQzM7Ci0JdTE2IEFDNCwgQUM1LCBBQzY7Ci0JczE2IEIxLCBCMjsKLQlzMTYgTUIsIE1DLCBNRDsKLX07Ci0KLXN0cnVjdCBibXAwODVfZGF0YSB7Ci0Jc3RydWN0CWRldmljZSAqZGV2OwotCXN0cnVjdCAgcmVnbWFwICpyZWdtYXA7Ci0Jc3RydWN0CW11dGV4IGxvY2s7Ci0Jc3RydWN0CWJtcDA4NV9jYWxpYnJhdGlvbl9kYXRhIGNhbGlicmF0aW9uOwotCXU4CW92ZXJzYW1wbGluZ19zZXR0aW5nOwotCXUzMglyYXdfdGVtcGVyYXR1cmU7Ci0JdTMyCXJhd19wcmVzc3VyZTsKLQl1MzIJdGVtcF9tZWFzdXJlbWVudF9wZXJpb2Q7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3RlbXBfbWVhc3VyZW1lbnQ7Ci0JdTgJY2hpcF9pZDsKLQlzMzIJYjY7IC8qIGNhbGN1bGF0ZWQgdGVtcGVyYXR1cmUgY29ycmVjdGlvbiBjb2VmZmljaWVudCAqLwotCWludAlpcnE7Ci0Jc3RydWN0CWNvbXBsZXRpb24gZG9uZTsKLX07Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBibXAwODVfZW9jX2lzcihpbnQgaXJxLCB2b2lkICpkZXZpZCkKLXsKLQlzdHJ1Y3QgYm1wMDg1X2RhdGEgKmRhdGEgPSBkZXZpZDsKLQotCWNvbXBsZXRlKCZkYXRhLT5kb25lKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHMzMiBibXAwODVfcmVhZF9jYWxpYnJhdGlvbl9kYXRhKHN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSkKLXsKLQl1MTYgdG1wW0JNUDA4NV9DQUxJQlJBVElPTl9EQVRBX0xFTkdUSF07Ci0Jc3RydWN0IGJtcDA4NV9jYWxpYnJhdGlvbl9kYXRhICpjYWxpID0gJihkYXRhLT5jYWxpYnJhdGlvbik7Ci0JczMyIHN0YXR1cyA9IHJlZ21hcF9idWxrX3JlYWQoZGF0YS0+cmVnbWFwLAotCQkJCUJNUDA4NV9DQUxJQlJBVElPTl9EQVRBX1NUQVJULCAodTggKil0bXAsCi0JCQkJKEJNUDA4NV9DQUxJQlJBVElPTl9EQVRBX0xFTkdUSCA8PCAxKSk7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCXJldHVybiBzdGF0dXM7Ci0KLQljYWxpLT5BQzEgPSAgYmUxNl90b19jcHUodG1wWzBdKTsKLQljYWxpLT5BQzIgPSAgYmUxNl90b19jcHUodG1wWzFdKTsKLQljYWxpLT5BQzMgPSAgYmUxNl90b19jcHUodG1wWzJdKTsKLQljYWxpLT5BQzQgPSAgYmUxNl90b19jcHUodG1wWzNdKTsKLQljYWxpLT5BQzUgPSAgYmUxNl90b19jcHUodG1wWzRdKTsKLQljYWxpLT5BQzYgPSBiZTE2X3RvX2NwdSh0bXBbNV0pOwotCWNhbGktPkIxID0gYmUxNl90b19jcHUodG1wWzZdKTsKLQljYWxpLT5CMiA9IGJlMTZfdG9fY3B1KHRtcFs3XSk7Ci0JY2FsaS0+TUIgPSBiZTE2X3RvX2NwdSh0bXBbOF0pOwotCWNhbGktPk1DID0gYmUxNl90b19jcHUodG1wWzldKTsKLQljYWxpLT5NRCA9IGJlMTZfdG9fY3B1KHRtcFsxMF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgczMyIGJtcDA4NV91cGRhdGVfcmF3X3RlbXBlcmF0dXJlKHN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSkKLXsKLQl1MTYgdG1wOwotCXMzMiBzdGF0dXM7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKLQotCWluaXRfY29tcGxldGlvbigmZGF0YS0+ZG9uZSk7Ci0KLQlzdGF0dXMgPSByZWdtYXBfd3JpdGUoZGF0YS0+cmVnbWFwLCBCTVAwODVfQ1RSTF9SRUcsCi0JCQkgICAgICBCTVAwODVfVEVNUF9NRUFTVVJFTUVOVCk7Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJZGV2X2VycihkYXRhLT5kZXYsCi0JCQkiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudC5cbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZGF0YS0+ZG9uZSwgMSArIG1zZWNzX3RvX2ppZmZpZXMoCi0JCQkJCSAgICBCTVAwODVfVEVNUF9DT05WRVJTSU9OX1RJTUUpKTsKLQotCXN0YXR1cyA9IHJlZ21hcF9idWxrX3JlYWQoZGF0YS0+cmVnbWFwLCBCTVAwODVfQ09OVkVSU0lPTl9SRUdJU1RFUl9NU0IsCi0JCQkJICZ0bXAsIHNpemVvZih0bXApKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQlkZXZfZXJyKGRhdGEtPmRldiwKLQkJCSJFcnJvciB3aGlsZSByZWFkaW5nIHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50IHJlc3VsdFxuIik7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JZGF0YS0+cmF3X3RlbXBlcmF0dXJlID0gYmUxNl90b19jcHUodG1wKTsKLQlkYXRhLT5sYXN0X3RlbXBfbWVhc3VyZW1lbnQgPSBqaWZmaWVzOwotCXN0YXR1cyA9IDA7CS8qIGV2ZXJ5dGhpbmcgb2ssIHJldHVybiAwICovCi0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgczMyIGJtcDA4NV91cGRhdGVfcmF3X3ByZXNzdXJlKHN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSkKLXsKLQl1MzIgdG1wID0gMDsKLQlzMzIgc3RhdHVzOwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7Ci0KLQlpbml0X2NvbXBsZXRpb24oJmRhdGEtPmRvbmUpOwotCi0Jc3RhdHVzID0gcmVnbWFwX3dyaXRlKGRhdGEtPnJlZ21hcCwgQk1QMDg1X0NUUkxfUkVHLAotCQkJQk1QMDg1X1BSRVNTVVJFX01FQVNVUkVNRU5UICsKLQkJCShkYXRhLT5vdmVyc2FtcGxpbmdfc2V0dGluZyA8PCA2KSk7Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJZGV2X2VycihkYXRhLT5kZXYsCi0JCQkiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBwcmVzc3VyZSBtZWFzdXJlbWVudC5cbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogd2FpdCBmb3IgdGhlIGVuZCBvZiBjb252ZXJzaW9uICovCi0Jd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkYXRhLT5kb25lLCAxICsgbXNlY3NfdG9famlmZmllcygKLQkJCQkJMisoMyA8PCBkYXRhLT5vdmVyc2FtcGxpbmdfc2V0dGluZykpKTsKLQkvKiBjb3B5IGRhdGEgaW50byBhIHUzMiAoNCBieXRlcyksIGJ1dCBza2lwIHRoZSBmaXJzdCBieXRlLiAqLwotCXN0YXR1cyA9IHJlZ21hcF9idWxrX3JlYWQoZGF0YS0+cmVnbWFwLCBCTVAwODVfQ09OVkVSU0lPTl9SRUdJU1RFUl9NU0IsCi0JCQkJICgodTggKikmdG1wKSsxLCAzKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQlkZXZfZXJyKGRhdGEtPmRldiwKLQkJCSJFcnJvciB3aGlsZSByZWFkaW5nIHByZXNzdXJlIG1lYXN1cmVtZW50IHJlc3VsdHNcbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCWRhdGEtPnJhd19wcmVzc3VyZSA9IGJlMzJfdG9fY3B1KCh0bXApKTsKLQlkYXRhLT5yYXdfcHJlc3N1cmUgPj49ICg4LWRhdGEtPm92ZXJzYW1wbGluZ19zZXR0aW5nKTsKLQlzdGF0dXMgPSAwOwkvKiBldmVyeXRoaW5nIG9rLCByZXR1cm4gMCAqLwotCi1leGl0OgotCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHRoZSB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudCBhbmQgcmV0dXJucyB0aGUgdmFsdWUKLSAqIGluIHRlbnRoIG9mIGEgZGVncmVlIGNlbHNpdXMuCi0gKi8KLXN0YXRpYyBzMzIgYm1wMDg1X2dldF90ZW1wZXJhdHVyZShzdHJ1Y3QgYm1wMDg1X2RhdGEgKmRhdGEsIGludCAqdGVtcGVyYXR1cmUpCi17Ci0Jc3RydWN0IGJtcDA4NV9jYWxpYnJhdGlvbl9kYXRhICpjYWxpID0gJmRhdGEtPmNhbGlicmF0aW9uOwotCWxvbmcgeDEsIHgyOwotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBibXAwODVfdXBkYXRlX3Jhd190ZW1wZXJhdHVyZShkYXRhKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJZ290byBleGl0OwotCi0JeDEgPSAoKGRhdGEtPnJhd190ZW1wZXJhdHVyZSAtIGNhbGktPkFDNikgKiBjYWxpLT5BQzUpID4+IDE1OwotCXgyID0gKGNhbGktPk1DIDw8IDExKSAvICh4MSArIGNhbGktPk1EKTsKLQlkYXRhLT5iNiA9IHgxICsgeDIgLSA0MDAwOwotCS8qIGlmIE5VTEwganVzdCB1cGRhdGUgYjYuIFVzZWQgZm9yIHByZXNzdXJlIG9ubHkgbWVhc3VyZW1lbnRzICovCi0JaWYgKHRlbXBlcmF0dXJlICE9IE5VTEwpCi0JCSp0ZW1wZXJhdHVyZSA9ICh4MSt4Mis4KSA+PiA0OwotCi1leGl0OgotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyB0aGUgcHJlc3N1cmUgbWVhc3VyZW1lbnQgYW5kIHJldHVybnMgdGhlIHZhbHVlCi0gKiBpbiBtaWxsaWJhci4gU2luY2UgdGhlIHByZXNzdXJlIGRlcGVuZHMgb24gdGhlIGFtYmllbnQgdGVtcGVyYXR1cmUsCi0gKiBhIHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50IGlzIGV4ZWN1dGVkIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gdGVtcGVyYXR1cmUKLSAqIG1lYXN1cmVtZW50IHBlcmlvZCAoZGVmYXVsdCBpcyAxIHNlYyBib3VuZGFyeSkuIFRoaXMgcGVyaW9kIGNvdWxkIHZhcnkKLSAqIGFuZCBuZWVkcyB0byBiZSBhZGp1c3RlZCBhY2NvcmRpbmcgdG8gdGhlIHNlbnNvciBlbnZpcm9ubWVudCwgaS5lLiBpZiBiaWcKLSAqIHRlbXBlcmF0dXJlIHZhcmlhdGlvbnMgdGhlbiB0aGUgdGVtcGVyYXR1cmUgbmVlZHMgdG8gYmUgcmVhZCBvdXQgb2Z0ZW4uCi0gKi8KLXN0YXRpYyBzMzIgYm1wMDg1X2dldF9wcmVzc3VyZShzdHJ1Y3QgYm1wMDg1X2RhdGEgKmRhdGEsIGludCAqcHJlc3N1cmUpCi17Ci0Jc3RydWN0IGJtcDA4NV9jYWxpYnJhdGlvbl9kYXRhICpjYWxpID0gJmRhdGEtPmNhbGlicmF0aW9uOwotCXMzMiB4MSwgeDIsIHgzLCBiMzsKLQl1MzIgYjQsIGI3OwotCXMzMiBwOwotCWludCBzdGF0dXM7Ci0KLQkvKiBhbHQgbGVhc3QgZXZlcnkgc2Vjb25kIGZvcmNlIGFuIHVwZGF0ZSBvZiB0aGUgYW1iaWVudCB0ZW1wZXJhdHVyZSAqLwotCWlmICgoZGF0YS0+bGFzdF90ZW1wX21lYXN1cmVtZW50ID09IDApIHx8Ci0JICAgIHRpbWVfaXNfYmVmb3JlX2ppZmZpZXMoZGF0YS0+bGFzdF90ZW1wX21lYXN1cmVtZW50ICsgMSpIWikpIHsKLQkJc3RhdHVzID0gYm1wMDg1X2dldF90ZW1wZXJhdHVyZShkYXRhLCBOVUxMKTsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXN0YXR1cyA9IGJtcDA4NV91cGRhdGVfcmF3X3ByZXNzdXJlKGRhdGEpOwotCWlmIChzdGF0dXMgPCAwKQotCQlyZXR1cm4gc3RhdHVzOwotCi0JeDEgPSAoZGF0YS0+YjYgKiBkYXRhLT5iNikgPj4gMTI7Ci0JeDEgKj0gY2FsaS0+QjI7Ci0JeDEgPj49IDExOwotCi0JeDIgPSBjYWxpLT5BQzIgKiBkYXRhLT5iNjsKLQl4MiA+Pj0gMTE7Ci0KLQl4MyA9IHgxICsgeDI7Ci0KLQliMyA9ICgoKCgoczMyKWNhbGktPkFDMSkgKiA0ICsgeDMpIDw8IGRhdGEtPm92ZXJzYW1wbGluZ19zZXR0aW5nKSArIDIpOwotCWIzID4+PSAyOwotCi0JeDEgPSAoY2FsaS0+QUMzICogZGF0YS0+YjYpID4+IDEzOwotCXgyID0gKGNhbGktPkIxICogKChkYXRhLT5iNiAqIGRhdGEtPmI2KSA+PiAxMikpID4+IDE2OwotCXgzID0gKHgxICsgeDIgKyAyKSA+PiAyOwotCWI0ID0gKGNhbGktPkFDNCAqICh1MzIpKHgzICsgMzI3NjgpKSA+PiAxNTsKLQotCWI3ID0gKCh1MzIpZGF0YS0+cmF3X3ByZXNzdXJlIC0gYjMpICoKLQkJCQkJKDUwMDAwID4+IGRhdGEtPm92ZXJzYW1wbGluZ19zZXR0aW5nKTsKLQlwID0gKChiNyA8IDB4ODAwMDAwMDApID8gKChiNyA8PCAxKSAvIGI0KSA6ICgoYjcgLyBiNCkgKiAyKSk7Ci0KLQl4MSA9IHAgPj4gODsKLQl4MSAqPSB4MTsKLQl4MSA9ICh4MSAqIDMwMzgpID4+IDE2OwotCXgyID0gKC03MzU3ICogcCkgPj4gMTY7Ci0JcCArPSAoeDEgKyB4MiArIDM3OTEpID4+IDQ7Ci0KLQkqcHJlc3N1cmUgPSBwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGNoaXAtaW50ZXJuYWwgb3ZlcnNhbXBsaW5nLiBWYWxpZCB2YWx1ZXMgYXJlIDAuLjMuCi0gKiBUaGUgY2hpcCB3aWxsIHVzZSAyXm92ZXJzYW1wbGluZyBzYW1wbGVzIGZvciBpbnRlcm5hbCBhdmVyYWdpbmcuCi0gKiBUaGlzIGluZmx1ZW5jZXMgdGhlIG1lYXN1cmVtZW50IHRpbWUgYW5kIHRoZSBhY2N1cmFjeTsgbGFyZ2VyIHZhbHVlcwotICogaW5jcmVhc2UgYm90aC4gVGhlIGRhdGFzaGVldCBnaXZlcyBhbiBvdmVydmlldyBvbiBob3cgbWVhc3VyZW1lbnQgdGltZSwKLSAqIGFjY3VyYWN5IGFuZCBub2lzZSBjb3JyZWxhdGUuCi0gKi8KLXN0YXRpYyB2b2lkIGJtcDA4NV9zZXRfb3ZlcnNhbXBsaW5nKHN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSwKLQkJCQkJCXVuc2lnbmVkIGNoYXIgb3ZlcnNhbXBsaW5nKQotewotCWlmIChvdmVyc2FtcGxpbmcgPiAzKQotCQlvdmVyc2FtcGxpbmcgPSAzOwotCWRhdGEtPm92ZXJzYW1wbGluZ19zZXR0aW5nID0gb3ZlcnNhbXBsaW5nOwotfQotCi0vKgotICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG92ZXJzYW1wbGluZy4gUmFuZ2U6IDAuLjMKLSAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgYm1wMDg1X2dldF9vdmVyc2FtcGxpbmcoc3RydWN0IGJtcDA4NV9kYXRhICpkYXRhKQotewotCXJldHVybiBkYXRhLT5vdmVyc2FtcGxpbmdfc2V0dGluZzsKLX0KLQotLyogc3lzZnMgY2FsbGJhY2tzICovCi1zdGF0aWMgc3NpemVfdCBzZXRfb3ZlcnNhbXBsaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgYm1wMDg1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQl1bnNpZ25lZCBsb25nIG92ZXJzYW1wbGluZzsKLQlpbnQgZXJyID0ga3N0cnRvdWwoYnVmLCAxMCwgJm92ZXJzYW1wbGluZyk7Ci0KLQlpZiAoZXJyID09IDApIHsKLQkJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7Ci0JCWJtcDA4NV9zZXRfb3ZlcnNhbXBsaW5nKGRhdGEsIG92ZXJzYW1wbGluZyk7Ci0JCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X292ZXJzYW1wbGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJtcDA4NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgYm1wMDg1X2dldF9vdmVyc2FtcGxpbmcoZGF0YSkpOwotfQotc3RhdGljIERFVklDRV9BVFRSKG92ZXJzYW1wbGluZywgU19JV1VTUiB8IFNfSVJVR08sCi0JCQkJCXNob3dfb3ZlcnNhbXBsaW5nLCBzZXRfb3ZlcnNhbXBsaW5nKTsKLQotCi1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXBlcmF0dXJlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCWludCB0ZW1wZXJhdHVyZTsKLQlpbnQgc3RhdHVzOwotCXN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0Jc3RhdHVzID0gYm1wMDg1X2dldF90ZW1wZXJhdHVyZShkYXRhLCAmdGVtcGVyYXR1cmUpOwotCWlmIChzdGF0dXMgPCAwKQotCQlyZXR1cm4gc3RhdHVzOwotCWVsc2UKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXBlcmF0dXJlKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMF9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wZXJhdHVyZSwgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19wcmVzc3VyZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0JaW50IHByZXNzdXJlOwotCWludCBzdGF0dXM7Ci0Jc3RydWN0IGJtcDA4NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlzdGF0dXMgPSBibXAwODVfZ2V0X3ByZXNzdXJlKGRhdGEsICZwcmVzc3VyZSk7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCXJldHVybiBzdGF0dXM7Ci0JZWxzZQotCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcHJlc3N1cmUpOwotfQotc3RhdGljIERFVklDRV9BVFRSKHByZXNzdXJlMF9pbnB1dCwgU19JUlVHTywgc2hvd19wcmVzc3VyZSwgTlVMTCk7Ci0KLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmJtcDA4NV9hdHRyaWJ1dGVzW10gPSB7Ci0JJmRldl9hdHRyX3RlbXAwX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX3ByZXNzdXJlMF9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl9vdmVyc2FtcGxpbmcuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBibXAwODVfYXR0cl9ncm91cCA9IHsKLQkuYXR0cnMgPSBibXAwODVfYXR0cmlidXRlcywKLX07Ci0KLWludCBibXAwODVfZGV0ZWN0KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYm1wMDg1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQl1bnNpZ25lZCBpbnQgaWQ7Ci0JaW50IHJldDsKLQotCXJldCA9IHJlZ21hcF9yZWFkKGRhdGEtPnJlZ21hcCwgQk1QMDg1X0NISVBfSURfUkVHLCAmaWQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKGlkICE9IGRhdGEtPmNoaXBfaWQpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChibXAwODVfZGV0ZWN0KTsKLQotc3RhdGljIHZvaWQgYm1wMDg1X2dldF9vZl9wcm9wZXJ0aWVzKHN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSkKLXsKLSNpZmRlZiBDT05GSUdfT0YKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGF0YS0+ZGV2LT5vZl9ub2RlOwotCXUzMiBwcm9wOwotCi0JaWYgKCFucCkKLQkJcmV0dXJuOwotCi0JaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImNoaXAtaWQiLCAmcHJvcCkpCi0JCWRhdGEtPmNoaXBfaWQgPSBwcm9wICYgMHhmZjsKLQotCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ0ZW1wLW1lYXN1cmVtZW50LXBlcmlvZCIsICZwcm9wKSkKLQkJZGF0YS0+dGVtcF9tZWFzdXJlbWVudF9wZXJpb2QgPSAocHJvcC8xMDApKkhaOwotCi0JaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImRlZmF1bHQtb3ZlcnNhbXBsaW5nIiwgJnByb3ApKQotCQlkYXRhLT5vdmVyc2FtcGxpbmdfc2V0dGluZyA9IHByb3AgJiAweGZmOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQgYm1wMDg1X2luaXRfY2xpZW50KHN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSkKLXsKLQlpbnQgc3RhdHVzID0gYm1wMDg1X3JlYWRfY2FsaWJyYXRpb25fZGF0YShkYXRhKTsKLQotCWlmIChzdGF0dXMgPCAwKQotCQlyZXR1cm4gc3RhdHVzOwotCi0JLyogZGVmYXVsdCBzZXR0aW5ncyAqLwotCWRhdGEtPmNoaXBfaWQgPSBCTVAwODVfQ0hJUF9JRDsKLQlkYXRhLT5sYXN0X3RlbXBfbWVhc3VyZW1lbnQgPSAwOwotCWRhdGEtPnRlbXBfbWVhc3VyZW1lbnRfcGVyaW9kID0gMSpIWjsKLQlkYXRhLT5vdmVyc2FtcGxpbmdfc2V0dGluZyA9IDM7Ci0KLQlibXAwODVfZ2V0X29mX3Byb3BlcnRpZXMoZGF0YSk7Ci0KLQltdXRleF9pbml0KCZkYXRhLT5sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgcmVnbWFwX2NvbmZpZyBibXAwODVfcmVnbWFwX2NvbmZpZyA9IHsKLQkucmVnX2JpdHMgPSA4LAotCS52YWxfYml0cyA9IDgKLX07Ci1FWFBPUlRfU1lNQk9MX0dQTChibXAwODVfcmVnbWFwX2NvbmZpZyk7Ci0KLWludCBibXAwODVfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCBpcnEpCi17Ci0Jc3RydWN0IGJtcDA4NV9kYXRhICpkYXRhOwotCWludCBlcnIgPSAwOwotCi0JZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBibXAwODVfZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghZGF0YSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JZGV2X3NldF9kcnZkYXRhKGRldiwgZGF0YSk7Ci0JZGF0YS0+ZGV2ID0gZGV2OwotCWRhdGEtPnJlZ21hcCA9IHJlZ21hcDsKLQlkYXRhLT5pcnEgPSBpcnE7Ci0KLQlpZiAoZGF0YS0+aXJxID4gMCkgewotCQllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgZGF0YS0+aXJxLCBibXAwODVfZW9jX2lzciwKLQkJCQkJICAgICAgSVJRRl9UUklHR0VSX1JJU0lORywgImJtcDA4NSIsCi0JCQkJCSAgICAgIGRhdGEpOwotCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gZXhpdF9mcmVlOwotCX0KLQotCS8qIEluaXRpYWxpemUgdGhlIEJNUDA4NSBjaGlwICovCi0JZXJyID0gYm1wMDg1X2luaXRfY2xpZW50KGRhdGEpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGV4aXRfZnJlZTsKLQotCWVyciA9IGJtcDA4NV9kZXRlY3QoZGV2KTsKLQlpZiAoZXJyIDwgMCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBjaGlwX2lkIGZhaWxlZCFcbiIsIEJNUDA4NV9OQU1FKTsKLQkJZ290byBleGl0X2ZyZWU7Ci0JfQotCi0JLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmJtcDA4NV9hdHRyX2dyb3VwKTsKLQlpZiAoZXJyKQotCQlnb3RvIGV4aXRfZnJlZTsKLQotCWRldl9pbmZvKGRldiwgIlN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCAlcyFcbiIsIEJNUDA4NV9OQU1FKTsKLQotCXJldHVybiAwOwotCi1leGl0X2ZyZWU6Ci0Ja2ZyZWUoZGF0YSk7Ci1leGl0OgotCXJldHVybiBlcnI7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChibXAwODVfcHJvYmUpOwotCi1pbnQgYm1wMDg1X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJtcDA4NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRhdGEtPmRldi0+a29iaiwgJmJtcDA4NV9hdHRyX2dyb3VwKTsKLQlrZnJlZShkYXRhKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoYm1wMDg1X3JlbW92ZSk7Ci0KLU1PRFVMRV9BVVRIT1IoIkNocmlzdG9waCBNYWlyIDxjaHJpc3RvcGgubWFpckBnbWFpbC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkJNUDA4NSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9ibXAwODUuaCBiL2RyaXZlcnMvbWlzYy9ibXAwODUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4ZTNiMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvYm1wMDg1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEyICBCb3NjaCBTZW5zb3J0ZWMgR21iSAotICogQ29weXJpZ2h0IChjKSAyMDEyICBVbml4cGhlcmUgQUIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9CTVAwODVfSAotI2RlZmluZSBfQk1QMDg1X0gKLQotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotCi0jZGVmaW5lIEJNUDA4NV9OQU1FCQkiYm1wMDg1IgotCi1leHRlcm4gc3RydWN0IHJlZ21hcF9jb25maWcgYm1wMDg1X3JlZ21hcF9jb25maWc7Ci0KLWludCBibXAwODVfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCBpcnEpOwotaW50IGJtcDA4NV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KTsKLWludCBibXAwODVfZGV0ZWN0KHN0cnVjdCBkZXZpY2UgKmRldik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2N4bC92cGhiLmMgYi9kcml2ZXJzL21pc2MvY3hsL3ZwaGIuYwppbmRleCA3YWRhNWYxLi4zNTE5YWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvY3hsL3ZwaGIuYworKysgYi9kcml2ZXJzL21pc2MvY3hsL3ZwaGIuYwpAQCAtMjMwLDYgKzIzMCwxMSBAQAogCWlmIChwaGItPmJ1cyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOWElPOwogCisJLyogU2V0IHJlbGVhc2UgaG9vayBvbiByb290IGJ1cyAqLworCXBjaV9zZXRfaG9zdF9icmlkZ2VfcmVsZWFzZSh0b19wY2lfaG9zdF9icmlkZ2UocGhiLT5idXMtPmJyaWRnZSksCisJCQkJICAgIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyX2RlZmVycmVkLAorCQkJCSAgICAodm9pZCAqKSBwaGIpOworCiAJLyogQ2xhaW0gcmVzb3VyY2VzLiBUaGlzIG1pZ2h0IG5lZWQgc29tZSByZXdvcmsgYXMgd2VsbCBkZXBlbmRpbmcKIAkgKiB3aGV0aGVyIHdlIGFyZSBkb2luZyBwcm9iZS1vbmx5IG9yIG5vdCwgbGlrZSBhc3NpZ25pbmcgdW5hc3NpZ25lZAogCSAqIHJlc291cmNlcyBldGMuLi4KQEAgLTI1Niw3ICsyNjEsMTAgQEAKIAlhZnUtPnBoYiA9IE5VTEw7CiAKIAlwY2lfcmVtb3ZlX3Jvb3RfYnVzKHBoYi0+YnVzKTsKLQlwY2liaW9zX2ZyZWVfY29udHJvbGxlcihwaGIpOworCS8qCisJICogV2UgZG9uJ3QgZnJlZSBwaGIgaGVyZSAtIHRoYXQncyBoYW5kbGVkIGJ5CisJICogcGNpYmlvc19mcmVlX2NvbnRyb2xsZXJfZGVmZXJyZWQoKQorCSAqLwogfQogCiBzdGF0aWMgYm9vbCBfY3hsX3BjaV9pc192cGhiX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9lZXByb20vYXQyNS5jIGIvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI1LmMKaW5kZXggMmM2YzdjOC4uNWFmZTRjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI1LmMKKysrIGIvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI1LmMKQEAgLTEyMSw5ICsxMjEsOCBAQAogCSAqIHRoaXMgY2hpcCBpcyBjbG9ja2VkIHZlcnkgc2xvd2x5CiAJICovCiAJc3RhdHVzID0gc3BpX3N5bmMoYXQyNS0+c3BpLCAmbSk7Ci0JZGV2X2RiZygmYXQyNS0+c3BpLT5kZXYsCi0JCSJyZWFkICVaZCBieXRlcyBhdCAlZCAtLT4gJWRcbiIsCi0JCWNvdW50LCBvZmZzZXQsIChpbnQpIHN0YXR1cyk7CisJZGV2X2RiZygmYXQyNS0+c3BpLT5kZXYsICJyZWFkICV6dSBieXRlcyBhdCAlZCAtLT4gJXpkXG4iLAorCQljb3VudCwgb2Zmc2V0LCBzdGF0dXMpOwogCiAJbXV0ZXhfdW5sb2NrKCZhdDI1LT5sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTY3LDggKzE2Niw3IEBACiAJCSpjcCA9IEFUMjVfV1JFTjsKIAkJc3RhdHVzID0gc3BpX3dyaXRlKGF0MjUtPnNwaSwgY3AsIDEpOwogCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJZGV2X2RiZygmYXQyNS0+c3BpLT5kZXYsICJXUkVOIC0tPiAlZFxuIiwKLQkJCQkJKGludCkgc3RhdHVzKTsKKwkJCWRldl9kYmcoJmF0MjUtPnNwaS0+ZGV2LCAiV1JFTiAtLT4gJWRcbiIsIHN0YXR1cyk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xOTYsOSArMTk0LDggQEAKIAkJbWVtY3B5KGNwLCBidWYsIHNlZ21lbnQpOwogCQlzdGF0dXMgPSBzcGlfd3JpdGUoYXQyNS0+c3BpLCBib3VuY2UsCiAJCQkJc2VnbWVudCArIGF0MjUtPmFkZHJsZW4gKyAxKTsKLQkJZGV2X2RiZygmYXQyNS0+c3BpLT5kZXYsCi0JCQkJIndyaXRlICV1IGJ5dGVzIGF0ICV1IC0tPiAlZFxuIiwKLQkJCQlzZWdtZW50LCBvZmZzZXQsIChpbnQpIHN0YXR1cyk7CisJCWRldl9kYmcoJmF0MjUtPnNwaS0+ZGV2LCAid3JpdGUgJXUgYnl0ZXMgYXQgJXUgLS0+ICVkXG4iLAorCQkJc2VnbWVudCwgb2Zmc2V0LCBzdGF0dXMpOwogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCWJyZWFrOwogCkBAIC0yMjUsOCArMjIyLDcgQEAKIAogCQlpZiAoKHNyIDwgMCkgfHwgKHNyICYgQVQyNV9TUl9uUkRZKSkgewogCQkJZGV2X2VycigmYXQyNS0+c3BpLT5kZXYsCi0JCQkJIndyaXRlICVkIGJ5dGVzIG9mZnNldCAlZCwgIgotCQkJCSJ0aW1lb3V0IGFmdGVyICV1IG1zZWNzXG4iLAorCQkJCSJ3cml0ZSAldSBieXRlcyBvZmZzZXQgJXUsIHRpbWVvdXQgYWZ0ZXIgJXUgbXNlY3NcbiIsCiAJCQkJc2VnbWVudCwgb2Zmc2V0LAogCQkJCWppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtCiAJCQkJCSh0aW1lb3V0IC0gRUVfVElNRU9VVCkpKTsKQEAgLTM2OCw5ICszNjQsNyBAQAogCQlyZXR1cm4gUFRSX0VSUihhdDI1LT5udm1lbSk7CiAKIAlkZXZfaW5mbygmc3BpLT5kZXYsICIlZCAlcyAlcyBlZXByb20lcywgcGFnZXNpemUgJXVcbiIsCi0JCShjaGlwLmJ5dGVfbGVuIDwgMTAyNCkKLQkJCT8gY2hpcC5ieXRlX2xlbgotCQkJOiAoY2hpcC5ieXRlX2xlbiAvIDEwMjQpLAorCQkoY2hpcC5ieXRlX2xlbiA8IDEwMjQpID8gY2hpcC5ieXRlX2xlbiA6IChjaGlwLmJ5dGVfbGVuIC8gMTAyNCksCiAJCShjaGlwLmJ5dGVfbGVuIDwgMTAyNCkgPyAiQnl0ZSIgOiAiS0J5dGUiLAogCQlhdDI1LT5jaGlwLm5hbWUsCiAJCShjaGlwLmZsYWdzICYgRUVfUkVBRE9OTFkpID8gIiAocmVhZG9ubHkpIiA6ICIiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX2Jhc2UuYyBiL2RyaXZlcnMvbWlzYy9nZW53cWUvY2FyZF9iYXNlLmMKaW5kZXggYTcwYjg1My4uNmMxZjQ5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX2Jhc2UuYworKysgYi9kcml2ZXJzL21pc2MvZ2Vud3FlL2NhcmRfYmFzZS5jCkBAIC0xMzUxLDYgKzEzNTEsMTkgQEAKIH07CiAKIC8qKgorICogZ2Vud3FlX2Rldm5vZGUoKSAtIFNldCBkZWZhdWx0IGFjY2VzcyBtb2RlIGZvciBnZW53cWUgZGV2aWNlcy4KKyAqCisgKiBEZWZhdWx0IG1vZGUgc2hvdWxkIGJlIHJ3IGZvciBldmVyeWJvZHkuIERvIG5vdCBjaGFuZ2UgZGVmYXVsdAorICogZGV2aWNlIG5hbWUuCisgKi8KK3N0YXRpYyBjaGFyICpnZW53cWVfZGV2bm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVtb2RlX3QgKm1vZGUpCit7CisJaWYgKG1vZGUpCisJCSptb2RlID0gMDY2NjsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCiAgKiBnZW53cWVfaW5pdF9tb2R1bGUoKSAtIERyaXZlciByZWdpc3RyYXRpb24gYW5kIGluaXRpYWxpemF0aW9uCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IGdlbndxZV9pbml0X21vZHVsZSh2b2lkKQpAQCAtMTM2Myw2ICsxMzc2LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJY2xhc3NfZ2Vud3FlLT5kZXZub2RlID0gZ2Vud3FlX2Rldm5vZGU7CisKIAlkZWJ1Z2ZzX2dlbndxZSA9IGRlYnVnZnNfY3JlYXRlX2RpcihHRU5XUUVfREVWTkFNRSwgTlVMTCk7CiAJaWYgKCFkZWJ1Z2ZzX2dlbndxZSkgewogCQlyYyA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZ2Vud3FlL2NhcmRfZGRjYi5jIGIvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX2RkY2IuYwppbmRleCAzNTNlZTBjLi5kZGZlZWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvZ2Vud3FlL2NhcmRfZGRjYi5jCisrKyBiL2RyaXZlcnMvbWlzYy9nZW53cWUvY2FyZF9kZGNiLmMKQEAgLTEwNDgsOCArMTA0OCw2IEBACiAJCQkiWyVzXSAqKmVycjogY291bGQgbm90IGFsbG9jYXRlIEREQ0IgKipcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldChxdWV1ZS0+ZGRjYl92YWRkciwgMCwgcXVldWVfc2l6ZSk7Ci0KIAlxdWV1ZS0+ZGRjYl9yZXEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGRjYl9yZXF1ICopICoKIAkJCQkgIHF1ZXVlLT5kZGNiX21heCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFxdWV1ZS0+ZGRjYl9yZXEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9nZW53cWUvY2FyZF91dGlscy5jIGIvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX3V0aWxzLmMKaW5kZXggMjIyMzY3Yy4uOGE2NzllYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX3V0aWxzLmMKKysrIGIvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX3V0aWxzLmMKQEAgLTIyMCw4ICsyMjAsOCBAQAogCWlmIChnZXRfb3JkZXIoc2l6ZSkgPiBNQVhfT1JERVIpCiAJCXJldHVybiBOVUxMOwogCi0JcmV0dXJuIGRtYV9hbGxvY19jb2hlcmVudCgmY2QtPnBjaV9kZXYtPmRldiwgc2l6ZSwgZG1hX2hhbmRsZSwKLQkJCQkgIEdGUF9LRVJORUwpOworCXJldHVybiBkbWFfemFsbG9jX2NvaGVyZW50KCZjZC0+cGNpX2Rldi0+ZGV2LCBzaXplLCBkbWFfaGFuZGxlLAorCQkJCSAgIEdGUF9LRVJORUwpOwogfQogCiB2b2lkIF9fZ2Vud3FlX2ZyZWVfY29uc2lzdGVudChzdHJ1Y3QgZ2Vud3FlX2RldiAqY2QsIHNpemVfdCBzaXplLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2hwaWxvLmMgYi9kcml2ZXJzL21pc2MvaHBpbG8uYwppbmRleCBkNmE5MDFjLi5mZWE4ZmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaHBpbG8uYworKysgYi9kcml2ZXJzL21pc2MvaHBpbG8uYwpAQCAtNjg4LDcgKzY4OCw4IEBACiAKIHN0YXRpYyBpbnQgaWxvX21hcF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBpbG9faHdpbmZvICpodykKIHsKLQlpbnQgZXJyb3IgPSAtRU5PTUVNOworCWludCBiYXI7CisJdW5zaWduZWQgbG9uZyBvZmY7CiAKIAkvKiBtYXAgdGhlIG1lbW9yeSBtYXBwZWQgaS9vIHJlZ2lzdGVycyAqLwogCWh3LT5tbWlvX3ZhZGRyID0gcGNpX2lvbWFwKHBkZXYsIDEsIDApOwpAQCAtNjk4LDcgKzY5OSwxNSBAQAogCX0KIAogCS8qIG1hcCB0aGUgYWRhcHRlciBzaGFyZWQgbWVtb3J5IHJlZ2lvbiAqLwotCWh3LT5yYW1fdmFkZHIgPSBwY2lfaW9tYXAocGRldiwgMiwgbWF4X2NjYiAqIElMT0hXX0NDQl9TWik7CisJaWYgKHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwMEU0KSB7CisJCWJhciA9IDU7CisJCS8qIExhc3QgOGsgaXMgcmVzZXJ2ZWQgZm9yIENDQnMgKi8KKwkJb2ZmID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCBiYXIpIC0gMHgyMDAwOworCX0gZWxzZSB7CisJCWJhciA9IDI7CisJCW9mZiA9IDA7CisJfQorCWh3LT5yYW1fdmFkZHIgPSBwY2lfaW9tYXBfcmFuZ2UocGRldiwgYmFyLCBvZmYsIG1heF9jY2IgKiBJTE9IV19DQ0JfU1opOwogCWlmIChody0+cmFtX3ZhZGRyID09IE5VTEwpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRXJyb3IgbWFwcGluZyBzaGFyZWQgbWVtXG4iKTsKIAkJZ290byBtbWlvX2ZyZWU7CkBAIC03MTcsNyArNzI2LDcgQEAKIG1taW9fZnJlZToKIAlwY2lfaW91bm1hcChwZGV2LCBody0+bW1pb192YWRkcik7CiBvdXQ6Ci0JcmV0dXJuIGVycm9yOworCXJldHVybiAtRU5PTUVNOwogfQogCiBzdGF0aWMgdm9pZCBpbG9fcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQpAQCAtODk5LDcgKzkwOCw3IEBACiAJY2xhc3NfZGVzdHJveShpbG9fY2xhc3MpOwogfQogCi1NT0RVTEVfVkVSU0lPTigiMS40LjEiKTsKK01PRFVMRV9WRVJTSU9OKCIxLjUuMCIpOwogTU9EVUxFX0FMSUFTKElMT19OQU1FKTsKIE1PRFVMRV9ERVNDUklQVElPTihJTE9fTkFNRSk7CiBNT0RVTEVfQVVUSE9SKCJEYXZpZCBBbHRvYmVsbGkgPGRhdmlkLmFsdG9iZWxsaUBocGUuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2xrZHRtX3JvZGF0YS5jIGIvZHJpdmVycy9taXNjL2xrZHRtX3JvZGF0YS5jCmluZGV4IDE2NmIxZGIuLjM1NjQ0NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9sa2R0bV9yb2RhdGEuYworKysgYi9kcml2ZXJzL21pc2MvbGtkdG1fcm9kYXRhLmMKQEAgLTQsNyArNCw3IEBACiAgKi8KICNpbmNsdWRlICJsa2R0bS5oIgogCi12b2lkIGxrZHRtX3JvZGF0YV9kb19ub3RoaW5nKHZvaWQpCit2b2lkIG5vdHJhY2UgbGtkdG1fcm9kYXRhX2RvX25vdGhpbmcodm9pZCkKIHsKIAkvKiBEb2VzIG5vdGhpbmcuIFdlIGp1c3Qgd2FudCBhbiBhcmNoaXRlY3R1cmUgYWdub3N0aWMgInJldHVybiIuICovCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbGtkdG1fdXNlcmNvcHkuYyBiL2RyaXZlcnMvbWlzYy9sa2R0bV91c2VyY29weS5jCmluZGV4IDU1MjVhMjAuLjFkZDYxMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9sa2R0bV91c2VyY29weS5jCisrKyBiL2RyaXZlcnMvbWlzYy9sa2R0bV91c2VyY29weS5jCkBAIC05LDcgKzksMTUgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAotc3RhdGljIHNpemVfdCBjYWNoZV9zaXplID0gMTAyNDsKKy8qCisgKiBNYW55IG9mIHRoZSB0ZXN0cyBoZXJlIGVuZCB1cCB1c2luZyBjb25zdCBzaXplcywgYnV0IHRob3NlIHdvdWxkCisgKiBub3JtYWxseSBiZSBpZ25vcmVkIGJ5IGhhcmRlbmVkIHVzZXJjb3B5LCBzbyBmb3JjZSB0aGUgY29tcGlsZXIKKyAqIGludG8gY2hvb3NpbmcgdGhlIG5vbi1jb25zdCBwYXRoIHRvIG1ha2Ugc3VyZSB3ZSB0cmlnZ2VyIHRoZQorICogaGFyZGVuZWQgdXNlcmNvcHkgY2hlY2tzIGJ5IGFkZGVkICJ1bmNvbnN0IiB0byBhbGwgdGhlIGNvbnN0IGNvcGllcywKKyAqIGFuZCBtYWtpbmcgc3VyZSAiY2FjaGVfc2l6ZSIgaXNuJ3Qgb3B0aW1pemVkIGludG8gYSBjb25zdC4KKyAqLworc3RhdGljIHZvbGF0aWxlIHNpemVfdCB1bmNvbnN0ID0gMDsKK3N0YXRpYyB2b2xhdGlsZSBzaXplX3QgY2FjaGVfc2l6ZSA9IDEwMjQ7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmJhZF9jYWNoZTsKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGVzdF90ZXh0W10gPSAiVGhpcyBpcyBhIHRlc3QuXG4iOwpAQCAtNjcsMTQgKzc1LDE0IEBACiAJaWYgKHRvX3VzZXIpIHsKIAkJcHJfaW5mbygiYXR0ZW1wdGluZyBnb29kIGNvcHlfdG9fdXNlciBvZiBsb2NhbCBzdGFja1xuIik7CiAJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopdXNlcl9hZGRyLCBnb29kX3N0YWNrLAotCQkJCSBzaXplb2YoZ29vZF9zdGFjaykpKSB7CisJCQkJIHVuY29uc3QgKyBzaXplb2YoZ29vZF9zdGFjaykpKSB7CiAJCQlwcl93YXJuKCJjb3B5X3RvX3VzZXIgZmFpbGVkIHVuZXhwZWN0ZWRseT8hXG4iKTsKIAkJCWdvdG8gZnJlZV91c2VyOwogCQl9CiAKIAkJcHJfaW5mbygiYXR0ZW1wdGluZyBiYWQgY29weV90b191c2VyIG9mIGRpc3RhbnQgc3RhY2tcbiIpOwogCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKXVzZXJfYWRkciwgYmFkX3N0YWNrLAotCQkJCSBzaXplb2YoZ29vZF9zdGFjaykpKSB7CisJCQkJIHVuY29uc3QgKyBzaXplb2YoZ29vZF9zdGFjaykpKSB7CiAJCQlwcl93YXJuKCJjb3B5X3RvX3VzZXIgZmFpbGVkLCBidXQgbGFja2VkIE9vcHNcbiIpOwogCQkJZ290byBmcmVlX3VzZXI7CiAJCX0KQEAgLTg4LDE0ICs5NiwxNCBAQAogCiAJCXByX2luZm8oImF0dGVtcHRpbmcgZ29vZCBjb3B5X2Zyb21fdXNlciBvZiBsb2NhbCBzdGFja1xuIik7CiAJCWlmIChjb3B5X2Zyb21fdXNlcihnb29kX3N0YWNrLCAodm9pZCBfX3VzZXIgKil1c2VyX2FkZHIsCi0JCQkJICAgc2l6ZW9mKGdvb2Rfc3RhY2spKSkgeworCQkJCSAgIHVuY29uc3QgKyBzaXplb2YoZ29vZF9zdGFjaykpKSB7CiAJCQlwcl93YXJuKCJjb3B5X2Zyb21fdXNlciBmYWlsZWQgdW5leHBlY3RlZGx5PyFcbiIpOwogCQkJZ290byBmcmVlX3VzZXI7CiAJCX0KIAogCQlwcl9pbmZvKCJhdHRlbXB0aW5nIGJhZCBjb3B5X2Zyb21fdXNlciBvZiBkaXN0YW50IHN0YWNrXG4iKTsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKGJhZF9zdGFjaywgKHZvaWQgX191c2VyICopdXNlcl9hZGRyLAotCQkJCSAgIHNpemVvZihnb29kX3N0YWNrKSkpIHsKKwkJCQkgICB1bmNvbnN0ICsgc2l6ZW9mKGdvb2Rfc3RhY2spKSkgewogCQkJcHJfd2FybigiY29weV9mcm9tX3VzZXIgZmFpbGVkLCBidXQgbGFja2VkIE9vcHNcbiIpOwogCQkJZ290byBmcmVlX3VzZXI7CiAJCX0KQEAgLTEwOSw3ICsxMTcsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyOwogCXVuc2lnbmVkIGNoYXIgKm9uZSwgKnR3bzsKLQljb25zdCBzaXplX3Qgc2l6ZSA9IDEwMjQ7CisJc2l6ZV90IHNpemUgPSB1bmNvbnN0ICsgMTAyNDsKIAogCW9uZSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJdHdvID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKQEAgLTI4NSwxMyArMjkzLDE0IEBACiAKIAlwcl9pbmZvKCJhdHRlbXB0aW5nIGdvb2QgY29weV90b191c2VyIGZyb20ga2VybmVsIHJvZGF0YVxuIik7CiAJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKil1c2VyX2FkZHIsIHRlc3RfdGV4dCwKLQkJCSBzaXplb2YodGVzdF90ZXh0KSkpIHsKKwkJCSB1bmNvbnN0ICsgc2l6ZW9mKHRlc3RfdGV4dCkpKSB7CiAJCXByX3dhcm4oImNvcHlfdG9fdXNlciBmYWlsZWQgdW5leHBlY3RlZGx5PyFcbiIpOwogCQlnb3RvIGZyZWVfdXNlcjsKIAl9CiAKIAlwcl9pbmZvKCJhdHRlbXB0aW5nIGJhZCBjb3B5X3RvX3VzZXIgZnJvbSBrZXJuZWwgdGV4dFxuIik7Ci0JaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKil1c2VyX2FkZHIsIHZtX21tYXAsIFBBR0VfU0laRSkpIHsKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKXVzZXJfYWRkciwgdm1fbW1hcCwKKwkJCSB1bmNvbnN0ICsgUEFHRV9TSVpFKSkgewogCQlwcl93YXJuKCJjb3B5X3RvX3VzZXIgZmFpbGVkLCBidXQgbGFja2VkIE9vcHNcbiIpOwogCQlnb3RvIGZyZWVfdXNlcjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2FtdGhpZi5jIGIvZHJpdmVycy9taXNjL21laS9hbXRoaWYuYwppbmRleCBhMDM5YTVkLi43YWU4OWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2FtdGhpZi5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvYW10aGlmLmMKQEAgLTQ3LDcgKzQ3LDYgQEAKIHZvaWQgbWVpX2FtdGhpZl9yZXNldF9wYXJhbXMoc3RydWN0IG1laV9kZXZpY2UgKmRldikKIHsKIAkvKiByZXNldCBpYW10aGlmIHBhcmFtZXRlcnMuICovCi0JZGV2LT5pYW10aGlmX2N1cnJlbnRfY2IgPSBOVUxMOwogCWRldi0+aWFtdGhpZl9jYW5jZWxlZCA9IGZhbHNlOwogCWRldi0+aWFtdGhpZl9zdGF0ZSA9IE1FSV9JQU1USElGX0lETEU7CiAJZGV2LT5pYW10aGlmX3N0YWxsX3RpbWVyID0gMDsKQEAgLTY3LDggKzY2LDEyIEBACiAJc3RydWN0IG1laV9jbCAqY2wgPSAmZGV2LT5pYW10aGlmX2NsOwogCWludCByZXQ7CiAKLQlpZiAobWVpX2NsX2lzX2Nvbm5lY3RlZChjbCkpCi0JCXJldHVybiAwOworCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCisJaWYgKG1laV9jbF9pc19jb25uZWN0ZWQoY2wpKSB7CisJCXJldCA9IDA7CisJCWdvdG8gb3V0OworCX0KIAogCWRldi0+aWFtdGhpZl9zdGF0ZSA9IE1FSV9JQU1USElGX0lETEU7CiAKQEAgLTc3LDE3OSArODAsMzcgQEAKIAlyZXQgPSBtZWlfY2xfbGluayhjbCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihkZXYtPmRldiwgImFtdGhpZjogZmFpbGVkIGNsX2xpbmsgJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0OwogCX0KIAogCXJldCA9IG1laV9jbF9jb25uZWN0KGNsLCBtZV9jbCwgTlVMTCk7CiAKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIG1laV9hbXRoaWZfcmVhZCAtIHJlYWQgZGF0YSBmcm9tIEFNVEhJRiBjbGllbnQKLSAqCi0gKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQotICogQGZpbGU6IHBvaW50ZXIgdG8gZmlsZSBvYmplY3QKLSAqIEB1YnVmOiBwb2ludGVyIHRvIHVzZXIgZGF0YSBpbiB1c2VyIHNwYWNlCi0gKiBAbGVuZ3RoOiBkYXRhIGxlbmd0aCB0byByZWFkCi0gKiBAb2Zmc2V0OiBkYXRhIHJlYWQgb2Zmc2V0Ci0gKgotICogTG9ja2luZzogY2FsbGVkIHVuZGVyICJkZXYtPmRldmljZV9sb2NrIiBsb2NrCi0gKgotICogUmV0dXJuOgotICogIHJldHVybmVkIGRhdGEgbGVuZ3RoIG9uIHN1Y2Nlc3MsCi0gKiAgemVybyBpZiBubyBkYXRhIHRvIHJlYWQsCi0gKiAgbmVnYXRpdmUgb24gZmFpbHVyZS4KLSAqLwotaW50IG1laV9hbXRoaWZfcmVhZChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkgICAgICAgY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBsZW5ndGgsIGxvZmZfdCAqb2Zmc2V0KQotewotCXN0cnVjdCBtZWlfY2wgKmNsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwotCWludCByZXRzOwotCWludCB3YWl0X3JldDsKLQotCWRldl9kYmcoZGV2LT5kZXYsICJjaGVja2luZyBhbXRoaWYgZGF0YVxuIik7Ci0JY2IgPSBtZWlfY2xfcmVhZF9jYihjbCwgZmlsZSk7Ci0KLQkvKiBDaGVjayBmb3IgaWYgd2UgY2FuIGJsb2NrIG9yIG5vdCovCi0JaWYgKGNiID09IE5VTEwgJiYgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCi0JCXJldHVybiAtRUFHQUlOOwotCi0KLQlkZXZfZGJnKGRldi0+ZGV2LCAid2FpdGluZyBmb3IgYW10aGlmIGRhdGFcbiIpOwotCXdoaWxlIChjYiA9PSBOVUxMKSB7Ci0JCS8qIHVubG9jayB0aGUgTXV0ZXggKi8KLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKLQotCQl3YWl0X3JldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShjbC0+cnhfd2FpdCwKLQkJCQkJIWxpc3RfZW1wdHkoJmNsLT5yZF9jb21wbGV0ZWQpIHx8Ci0JCQkJCSFtZWlfY2xfaXNfY29ubmVjdGVkKGNsKSk7Ci0KLQkJLyogTG9ja2luZyBhZ2FpbiB0aGUgTXV0ZXggKi8KLQkJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7Ci0KLQkJaWYgKHdhaXRfcmV0KQotCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCQlpZiAoIW1laV9jbF9pc19jb25uZWN0ZWQoY2wpKSB7Ci0JCQlyZXRzID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQljYiA9IG1laV9jbF9yZWFkX2NiKGNsLCBmaWxlKTsKLQl9Ci0KLQlpZiAoY2ItPnN0YXR1cykgewotCQlyZXRzID0gY2ItPnN0YXR1czsKLQkJZGV2X2RiZyhkZXYtPmRldiwgInJlYWQgb3BlcmF0aW9uIGZhaWxlZCAlZFxuIiwgcmV0cyk7Ci0JCWdvdG8gZnJlZTsKLQl9Ci0KLQlkZXZfZGJnKGRldi0+ZGV2LCAiR290IGFtdGhpZiBkYXRhXG4iKTsKLQkvKiBpZiB0aGUgd2hvbGUgbWVzc2FnZSB3aWxsIGZpdCByZW1vdmUgaXQgZnJvbSB0aGUgbGlzdCAqLwotCWlmIChjYi0+YnVmX2lkeCA+PSAqb2Zmc2V0ICYmIGxlbmd0aCA+PSAoY2ItPmJ1Zl9pZHggLSAqb2Zmc2V0KSkKLQkJbGlzdF9kZWxfaW5pdCgmY2ItPmxpc3QpOwotCWVsc2UgaWYgKGNiLT5idWZfaWR4IDw9ICpvZmZzZXQpIHsKLQkJLyogZW5kIG9mIHRoZSBtZXNzYWdlIGhhcyBiZWVuIHJlYWNoZWQgKi8KLQkJbGlzdF9kZWxfaW5pdCgmY2ItPmxpc3QpOwotCQlyZXRzID0gMDsKLQkJZ290byBmcmVlOwotCX0KLQkJLyogZWxzZSBtZWFucyB0aGF0IG5vdCBmdWxsIGJ1ZmZlciB3aWxsIGJlIHJlYWQgYW5kIGRvIG5vdAotCQkgKiByZW1vdmUgbWVzc2FnZSBmcm9tIGRlbGV0aW9uIGxpc3QKLQkJICovCi0KLQlkZXZfZGJnKGRldi0+ZGV2LCAiYW10aGlmIGNiLT5idWYuc2l6ZSAtICV6dSBjYi0+YnVmX2lkeCAtICV6dVxuIiwKLQkJY2ItPmJ1Zi5zaXplLCBjYi0+YnVmX2lkeCk7Ci0KLQkvKiBsZW5ndGggaXMgYmVpbmcgdHJ1bmNhdGVkIHRvIFBBR0VfU0laRSwgaG93ZXZlciwKLQkgKiB0aGUgYnVmX2lkeCBtYXkgcG9pbnQgYmV5b25kICovCi0JbGVuZ3RoID0gbWluX3Qoc2l6ZV90LCBsZW5ndGgsIChjYi0+YnVmX2lkeCAtICpvZmZzZXQpKTsKLQotCWlmIChjb3B5X3RvX3VzZXIodWJ1ZiwgY2ItPmJ1Zi5kYXRhICsgKm9mZnNldCwgbGVuZ3RoKSkgewotCQlkZXZfZGJnKGRldi0+ZGV2LCAiZmFpbGVkIHRvIGNvcHkgZGF0YSB0byB1c2VybGFuZFxuIik7Ci0JCXJldHMgPSAtRUZBVUxUOwotCX0gZWxzZSB7Ci0JCXJldHMgPSBsZW5ndGg7Ci0JCWlmICgoKm9mZnNldCArIGxlbmd0aCkgPCBjYi0+YnVmX2lkeCkgewotCQkJKm9mZnNldCArPSBsZW5ndGg7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLWZyZWU6Ci0JZGV2X2RiZyhkZXYtPmRldiwgImZyZWUgYW10aGlmIGNiIG1lbW9yeS5cbiIpOwotCSpvZmZzZXQgPSAwOwotCW1laV9pb19jYl9mcmVlKGNiKTsKIG91dDoKLQlyZXR1cm4gcmV0czsKKwltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCXJldHVybiByZXQ7CiB9CiAKIC8qKgogICogbWVpX2FtdGhpZl9yZWFkX3N0YXJ0IC0gcXVldWUgbWVzc2FnZSBmb3Igc2VuZGluZyByZWFkIGNyZWRlbnRpYWwKICAqCiAgKiBAY2w6IGhvc3QgY2xpZW50Ci0gKiBAZmlsZTogZmlsZSBwb2ludGVyIG9mIG1lc3NhZ2UgcmVjaXBpZW50CisgKiBAZnA6IGZpbGUgcG9pbnRlciBvZiBtZXNzYWdlIHJlY2lwaWVudAogICoKICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgaW50IG1laV9hbXRoaWZfcmVhZF9zdGFydChzdHJ1Y3QgbWVpX2NsICpjbCwgY29uc3Qgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IG1laV9hbXRoaWZfcmVhZF9zdGFydChzdHJ1Y3QgbWVpX2NsICpjbCwgY29uc3Qgc3RydWN0IGZpbGUgKmZwKQogewogCXN0cnVjdCBtZWlfZGV2aWNlICpkZXYgPSBjbC0+ZGV2OwogCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwotCWludCByZXRzOwogCi0JY2IgPSBtZWlfaW9fY2JfaW5pdChjbCwgTUVJX0ZPUF9SRUFELCBmaWxlKTsKLQlpZiAoIWNiKSB7Ci0JCXJldHMgPSAtRU5PTUVNOwotCQlnb3RvIGVycjsKLQl9CisJY2IgPSBtZWlfY2xfZW5xdWV1ZV9jdHJsX3dyX2NiKGNsLCBtZWlfY2xfbXR1KGNsKSwgTUVJX0ZPUF9SRUFELCBmcCk7CisJaWYgKCFjYikKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZXRzID0gbWVpX2lvX2NiX2FsbG9jX2J1ZihjYiwgbWVpX2NsX210dShjbCkpOwotCWlmIChyZXRzKQotCQlnb3RvIGVycjsKLQotCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmZGV2LT5jdHJsX3dyX2xpc3QubGlzdCk7CisJY2wtPnJ4X2Zsb3dfY3RybF9jcmVkcysrOwogCiAJZGV2LT5pYW10aGlmX3N0YXRlID0gTUVJX0lBTVRISUZfUkVBRElORzsKLQlkZXYtPmlhbXRoaWZfZnAgPSBjYi0+ZnA7Ci0JZGV2LT5pYW10aGlmX2N1cnJlbnRfY2IgPSBjYjsKLQotCXJldHVybiAwOwotZXJyOgotCW1laV9pb19jYl9mcmVlKGNiKTsKLQlyZXR1cm4gcmV0czsKLX0KLQotLyoqCi0gKiBtZWlfYW10aGlmX3NlbmRfY21kIC0gc2VuZCBhbXRoaWYgY29tbWFuZCB0byB0aGUgTUUKLSAqCi0gKiBAY2w6IHRoZSBob3N0IGNsaWVudAotICogQGNiOiBtZWkgY2FsbCBiYWNrIHN0cnVjdAotICoKLSAqIFJldHVybjogMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlLgotICovCi1zdGF0aWMgaW50IG1laV9hbXRoaWZfc2VuZF9jbWQoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiKQotewotCXN0cnVjdCBtZWlfZGV2aWNlICpkZXY7Ci0JaW50IHJldDsKLQotCWlmICghY2wtPmRldiB8fCAhY2IpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZGV2ID0gY2wtPmRldjsKLQotCWRldi0+aWFtdGhpZl9zdGF0ZSA9IE1FSV9JQU1USElGX1dSSVRJTkc7Ci0JZGV2LT5pYW10aGlmX2N1cnJlbnRfY2IgPSBjYjsKLQlkZXYtPmlhbXRoaWZfZnAgPSBjYi0+ZnA7Ci0JZGV2LT5pYW10aGlmX2NhbmNlbGVkID0gZmFsc2U7Ci0KLQlyZXQgPSBtZWlfY2xfd3JpdGUoY2wsIGNiLCBmYWxzZSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoY2ItPmNvbXBsZXRlZCkKLQkJY2ItPnN0YXR1cyA9IG1laV9hbXRoaWZfcmVhZF9zdGFydChjbCwgY2ItPmZwKTsKKwljbC0+ZnAgPSBjYi0+ZnA7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI2NSwyMCArMTI2LDMyIEBACiB7CiAJc3RydWN0IG1laV9jbCAqY2wgPSAmZGV2LT5pYW10aGlmX2NsOwogCXN0cnVjdCBtZWlfY2xfY2IgKmNiOworCWludCByZXQ7CiAKIAlkZXYtPmlhbXRoaWZfY2FuY2VsZWQgPSBmYWxzZTsKLQlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9JRExFOwotCWRldi0+aWFtdGhpZl9mcCA9IE5VTEw7CiAKIAlkZXZfZGJnKGRldi0+ZGV2LCAiY29tcGxldGUgYW10aGlmIGNtZF9saXN0IGNiLlxuIik7CiAKIAljYiA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZGV2LT5hbXRoaWZfY21kX2xpc3QubGlzdCwKIAkJCQkJdHlwZW9mKCpjYiksIGxpc3QpOwotCWlmICghY2IpCisJaWYgKCFjYikgeworCQlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9JRExFOworCQljbC0+ZnAgPSBOVUxMOwogCQlyZXR1cm4gMDsKKwl9CiAKIAlsaXN0X2RlbF9pbml0KCZjYi0+bGlzdCk7Ci0JcmV0dXJuIG1laV9hbXRoaWZfc2VuZF9jbWQoY2wsIGNiKTsKKwlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9XUklUSU5HOworCWNsLT5mcCA9IGNiLT5mcDsKKworCXJldCA9IG1laV9jbF93cml0ZShjbCwgY2IsIGZhbHNlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChjYi0+Y29tcGxldGVkKQorCQljYi0+c3RhdHVzID0gbWVpX2FtdGhpZl9yZWFkX3N0YXJ0KGNsLCBjYi0+ZnApOworCisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMjk5LDggKzE3Miw3IEBACiAJLyoKIAkgKiBUaGUgcHJldmlvdXMgcmVxdWVzdCBpcyBzdGlsbCBpbiBwcm9jZXNzaW5nLCBxdWV1ZSB0aGlzIG9uZS4KIAkgKi8KLQlpZiAoZGV2LT5pYW10aGlmX3N0YXRlID4gTUVJX0lBTVRISUZfSURMRSAmJgotCSAgICBkZXYtPmlhbXRoaWZfc3RhdGUgPCBNRUlfSUFNVEhJRl9SRUFEX0NPTVBMRVRFKQorCWlmIChkZXYtPmlhbXRoaWZfc3RhdGUgIT0gTUVJX0lBTVRISUZfSURMRSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gbWVpX2FtdGhpZl9ydW5fbmV4dF9jbWQoZGV2KTsKQEAgLTMwOSw3ICsxODEsNiBAQAogLyoqCiAgKiBtZWlfYW10aGlmX3BvbGwgLSB0aGUgYW10aGlmIHBvbGwgZnVuY3Rpb24KICAqCi0gKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQogICogQGZpbGU6IHBvaW50ZXIgdG8gZmlsZSBzdHJ1Y3R1cmUKICAqIEB3YWl0OiBwb2ludGVyIHRvIHBvbGxfdGFibGUgc3RydWN0dXJlCiAgKgpAQCAtMzE3LDI2ICsxODgsMTkgQEAKICAqCiAgKiBMb2NraW5nOiBjYWxsZWQgdW5kZXIgImRldi0+ZGV2aWNlX2xvY2siIGxvY2sKICAqLwotCi11bnNpZ25lZCBpbnQgbWVpX2FtdGhpZl9wb2xsKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQordW5zaWduZWQgaW50IG1laV9hbXRoaWZfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKIHsKKwlzdHJ1Y3QgbWVpX2NsICpjbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbWVpX2NsX2NiICpjYiA9IG1laV9jbF9yZWFkX2NiKGNsLCBmaWxlKTsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CiAKLQlwb2xsX3dhaXQoZmlsZSwgJmRldi0+aWFtdGhpZl9jbC5yeF93YWl0LCB3YWl0KTsKLQotCWlmIChkZXYtPmlhbXRoaWZfc3RhdGUgPT0gTUVJX0lBTVRISUZfUkVBRF9DT01QTEVURSAmJgotCSAgICBkZXYtPmlhbXRoaWZfZnAgPT0gZmlsZSkgewotCisJcG9sbF93YWl0KGZpbGUsICZjbC0+cnhfd2FpdCwgd2FpdCk7CisJaWYgKGNiKQogCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07Ci0JCW1laV9hbXRoaWZfcnVuX25leHRfY21kKGRldik7Ci0JfQogCiAJcmV0dXJuIG1hc2s7CiB9CiAKLQotCiAvKioKICAqIG1laV9hbXRoaWZfaXJxX3dyaXRlIC0gd3JpdGUgaWFtdGhpZiBjb21tYW5kIGluIGlycSB0aHJlYWQgY29udGV4dC4KICAqCkBAIC0zOTMsNyArMjU3LDYgQEAKIAkJcmV0dXJuIDA7CiAKIAlkZXZfZGJnKGRldi0+ZGV2LCAiY29tcGxldGVkIGFtdGhpZiByZWFkLlxuICIpOwotCWRldi0+aWFtdGhpZl9jdXJyZW50X2NiID0gTlVMTDsKIAlkZXYtPmlhbXRoaWZfc3RhbGxfdGltZXIgPSAwOwogCiAJcmV0dXJuIDA7CkBAIC00MDksMTE1ICsyNzIsNjMgQEAKIHsKIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2ID0gY2wtPmRldjsKIAotCWlmIChjYi0+Zm9wX3R5cGUgPT0gTUVJX0ZPUF9XUklURSkgeworCWRldl9kYmcoZGV2LT5kZXYsICJjb21wbGV0aW5nIGFtdGhpZiBjYWxsIGJhY2suXG4iKTsKKwlzd2l0Y2ggKGNiLT5mb3BfdHlwZSkgeworCWNhc2UgTUVJX0ZPUF9XUklURToKIAkJaWYgKCFjYi0+c3RhdHVzKSB7CiAJCQlkZXYtPmlhbXRoaWZfc3RhbGxfdGltZXIgPSBNRUlfSUFNVEhJRl9TVEFMTF9USU1FUjsKKwkJCW1laV9zY2hlZHVsZV9zdGFsbF90aW1lcihkZXYpOwogCQkJbWVpX2lvX2NiX2ZyZWUoY2IpOwogCQkJcmV0dXJuOwogCQl9Ci0JCS8qCi0JCSAqIGluIGNhc2Ugb2YgZXJyb3IgZW5xdWV1ZSB0aGUgd3JpdGUgY2IgdG8gY29tcGxldGUgcmVhZCBsaXN0Ci0JCSAqIHNvIGl0IGNhbiBiZSBwcm9wYWdhdGVkIHRvIHRoZSByZWFkZXIKLQkJICovCi0JCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmY2wtPnJkX2NvbXBsZXRlZCk7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2wtPnJ4X3dhaXQpOwotCQlyZXR1cm47Ci0JfQorCQlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9JRExFOworCQljbC0+ZnAgPSBOVUxMOworCQlpZiAoIWRldi0+aWFtdGhpZl9jYW5jZWxlZCkgeworCQkJLyoKKwkJCSAqIGluIGNhc2Ugb2YgZXJyb3IgZW5xdWV1ZSB0aGUgd3JpdGUgY2IgdG8gY29tcGxldGUKKwkJCSAqIHJlYWQgbGlzdCBzbyBpdCBjYW4gYmUgcHJvcGFnYXRlZCB0byB0aGUgcmVhZGVyCisJCQkgKi8KKwkJCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmY2wtPnJkX2NvbXBsZXRlZCk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNsLT5yeF93YWl0KTsKKwkJfSBlbHNlIHsKKwkJCW1laV9pb19jYl9mcmVlKGNiKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE1FSV9GT1BfUkVBRDoKKwkJaWYgKCFkZXYtPmlhbXRoaWZfY2FuY2VsZWQpIHsKKwkJCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmY2wtPnJkX2NvbXBsZXRlZCk7CisJCQlkZXZfZGJnKGRldi0+ZGV2LCAiYW10aGlmIHJlYWQgY29tcGxldGVkXG4iKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2wtPnJ4X3dhaXQpOworCQl9IGVsc2UgeworCQkJbWVpX2lvX2NiX2ZyZWUoY2IpOworCQl9CiAKLQlpZiAoIWRldi0+aWFtdGhpZl9jYW5jZWxlZCkgewotCQlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9SRUFEX0NPTVBMRVRFOwogCQlkZXYtPmlhbXRoaWZfc3RhbGxfdGltZXIgPSAwOwotCQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmNsLT5yZF9jb21wbGV0ZWQpOwotCQlkZXZfZGJnKGRldi0+ZGV2LCAiYW10aGlmIHJlYWQgY29tcGxldGVkXG4iKTsKLQl9IGVsc2UgewogCQltZWlfYW10aGlmX3J1bl9uZXh0X2NtZChkZXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOwogCX0KLQotCWRldl9kYmcoZGV2LT5kZXYsICJjb21wbGV0aW5nIGFtdGhpZiBjYWxsIGJhY2suXG4iKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNsLT5yeF93YWl0KTsKIH0KIAogLyoqCiAgKiBtZWlfY2xlYXJfbGlzdCAtIHJlbW92ZXMgYWxsIGNhbGxiYWNrcyBhc3NvY2lhdGVkIHdpdGggZmlsZQogICoJCWZyb20gbWVpX2NiX2xpc3QKICAqCi0gKiBAZGV2OiBkZXZpY2Ugc3RydWN0dXJlLgogICogQGZpbGU6IGZpbGUgc3RydWN0dXJlCiAgKiBAbWVpX2NiX2xpc3Q6IGNhbGxiYWNrcyBsaXN0CiAgKgogICogbWVpX2NsZWFyX2xpc3QgaXMgY2FsbGVkIHRvIGNsZWFyIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggZmlsZQogICogd2hlbiBhcHBsaWNhdGlvbiBjYWxscyBjbG9zZSBmdW5jdGlvbiBvciBDdHJsLUMgd2FzIHByZXNzZWQKLSAqCi0gKiBSZXR1cm46IHRydWUgaWYgY2FsbGJhY2sgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LCBmYWxzZSBvdGhlcndpc2UKICAqLwotc3RhdGljIGJvb2wgbWVpX2NsZWFyX2xpc3Qoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKLQkJY29uc3Qgc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBsaXN0X2hlYWQgKm1laV9jYl9saXN0KQorc3RhdGljIHZvaWQgbWVpX2NsZWFyX2xpc3QoY29uc3Qgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICptZWlfY2JfbGlzdCkKIHsKLQlzdHJ1Y3QgbWVpX2NsICpjbCA9ICZkZXYtPmlhbXRoaWZfY2w7CiAJc3RydWN0IG1laV9jbF9jYiAqY2IsICpuZXh0OwotCWJvb2wgcmVtb3ZlZCA9IGZhbHNlOwogCi0JLyogbGlzdCBhbGwgbGlzdCBtZW1iZXIgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2IsIG5leHQsIG1laV9jYl9saXN0LCBsaXN0KSB7Ci0JCS8qIGNoZWNrIGlmIGxpc3QgbWVtYmVyIGFzc29jaWF0ZWQgd2l0aCBhIGZpbGUgKi8KLQkJaWYgKGZpbGUgPT0gY2ItPmZwKSB7Ci0JCQkvKiBjaGVjayBpZiBjYiBlcXVhbCB0byBjdXJyZW50IGlhbXRoaWYgY2IgKi8KLQkJCWlmIChkZXYtPmlhbXRoaWZfY3VycmVudF9jYiA9PSBjYikgewotCQkJCWRldi0+aWFtdGhpZl9jdXJyZW50X2NiID0gTlVMTDsKLQkJCQkvKiBzZW5kIGZsb3cgY29udHJvbCB0byBpYW10aGlmIGNsaWVudCAqLwotCQkJCW1laV9oYm1fY2xfZmxvd19jb250cm9sX3JlcShkZXYsIGNsKTsKLQkJCX0KLQkJCS8qIGZyZWUgYWxsIGFsbG9jYXRlZCBidWZmZXJzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNiLCBuZXh0LCBtZWlfY2JfbGlzdCwgbGlzdCkKKwkJaWYgKGZpbGUgPT0gY2ItPmZwKQogCQkJbWVpX2lvX2NiX2ZyZWUoY2IpOwotCQkJcmVtb3ZlZCA9IHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlbW92ZWQ7Ci19Ci0KLS8qKgotICogbWVpX2NsZWFyX2xpc3RzIC0gcmVtb3ZlcyBhbGwgY2FsbGJhY2tzIGFzc29jaWF0ZWQgd2l0aCBmaWxlCi0gKgotICogQGRldjogZGV2aWNlIHN0cnVjdHVyZQotICogQGZpbGU6IGZpbGUgc3RydWN0dXJlCi0gKgotICogbWVpX2NsZWFyX2xpc3RzIGlzIGNhbGxlZCB0byBjbGVhciByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGZpbGUKLSAqIHdoZW4gYXBwbGljYXRpb24gY2FsbHMgY2xvc2UgZnVuY3Rpb24gb3IgQ3RybC1DIHdhcyBwcmVzc2VkCi0gKgotICogUmV0dXJuOiB0cnVlIGlmIGNhbGxiYWNrIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCwgZmFsc2Ugb3RoZXJ3aXNlCi0gKi8KLXN0YXRpYyBib29sIG1laV9jbGVhcl9saXN0cyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlib29sIHJlbW92ZWQgPSBmYWxzZTsKLQlzdHJ1Y3QgbWVpX2NsICpjbCA9ICZkZXYtPmlhbXRoaWZfY2w7Ci0KLQkvKiByZW1vdmUgY2FsbGJhY2tzIGFzc29jaWF0ZWQgd2l0aCBhIGZpbGUgKi8KLQltZWlfY2xlYXJfbGlzdChkZXYsIGZpbGUsICZkZXYtPmFtdGhpZl9jbWRfbGlzdC5saXN0KTsKLQlpZiAobWVpX2NsZWFyX2xpc3QoZGV2LCBmaWxlLCAmY2wtPnJkX2NvbXBsZXRlZCkpCi0JCXJlbW92ZWQgPSB0cnVlOwotCi0JbWVpX2NsZWFyX2xpc3QoZGV2LCBmaWxlLCAmZGV2LT5jdHJsX3JkX2xpc3QubGlzdCk7Ci0KLQlpZiAobWVpX2NsZWFyX2xpc3QoZGV2LCBmaWxlLCAmZGV2LT5jdHJsX3dyX2xpc3QubGlzdCkpCi0JCXJlbW92ZWQgPSB0cnVlOwotCi0JaWYgKG1laV9jbGVhcl9saXN0KGRldiwgZmlsZSwgJmRldi0+d3JpdGVfd2FpdGluZ19saXN0Lmxpc3QpKQotCQlyZW1vdmVkID0gdHJ1ZTsKLQotCWlmIChtZWlfY2xlYXJfbGlzdChkZXYsIGZpbGUsICZkZXYtPndyaXRlX2xpc3QubGlzdCkpCi0JCXJlbW92ZWQgPSB0cnVlOwotCi0JLyogY2hlY2sgaWYgaWFtdGhpZl9jdXJyZW50X2NiIG5vdCBOVUxMICovCi0JaWYgKGRldi0+aWFtdGhpZl9jdXJyZW50X2NiICYmICFyZW1vdmVkKSB7Ci0JCS8qIGNoZWNrIGZpbGUgYW5kIGlhbXRoaWYgY3VycmVudCBjYiBhc3NvY2lhdGlvbiAqLwotCQlpZiAoZGV2LT5pYW10aGlmX2N1cnJlbnRfY2ItPmZwID09IGZpbGUpIHsKLQkJCS8qIHJlbW92ZSBjYiAqLwotCQkJbWVpX2lvX2NiX2ZyZWUoZGV2LT5pYW10aGlmX2N1cnJlbnRfY2IpOwotCQkJZGV2LT5pYW10aGlmX2N1cnJlbnRfY2IgPSBOVUxMOwotCQkJcmVtb3ZlZCA9IHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlbW92ZWQ7CiB9CiAKIC8qKgpAQCAtNTMwLDIzICszNDEsMjEgQEAKICovCiBpbnQgbWVpX2FtdGhpZl9yZWxlYXNlKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHN0cnVjdCBmaWxlICpmaWxlKQogeworCXN0cnVjdCBtZWlfY2wgKmNsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCiAJaWYgKGRldi0+aWFtdGhpZl9vcGVuX2NvdW50ID4gMCkKIAkJZGV2LT5pYW10aGlmX29wZW5fY291bnQtLTsKIAotCWlmIChkZXYtPmlhbXRoaWZfZnAgPT0gZmlsZSAmJgotCSAgICBkZXYtPmlhbXRoaWZfc3RhdGUgIT0gTUVJX0lBTVRISUZfSURMRSkgeworCWlmIChjbC0+ZnAgPT0gZmlsZSAmJiBkZXYtPmlhbXRoaWZfc3RhdGUgIT0gTUVJX0lBTVRISUZfSURMRSkgewogCiAJCWRldl9kYmcoZGV2LT5kZXYsICJhbXRoaWYgY2FuY2VsZWQgaWFtdGhpZiBzdGF0ZSAlZFxuIiwKIAkJICAgIGRldi0+aWFtdGhpZl9zdGF0ZSk7CiAJCWRldi0+aWFtdGhpZl9jYW5jZWxlZCA9IHRydWU7Ci0JCWlmIChkZXYtPmlhbXRoaWZfc3RhdGUgPT0gTUVJX0lBTVRISUZfUkVBRF9DT01QTEVURSkgewotCQkJZGV2X2RiZyhkZXYtPmRldiwgInJ1biBuZXh0IGFtdGhpZiBpYW10aGlmIGNiXG4iKTsKLQkJCW1laV9hbXRoaWZfcnVuX25leHRfY21kKGRldik7Ci0JCX0KIAl9CiAKLQlpZiAobWVpX2NsZWFyX2xpc3RzKGRldiwgZmlsZSkpCi0JCWRldi0+aWFtdGhpZl9zdGF0ZSA9IE1FSV9JQU1USElGX0lETEU7CisJbWVpX2NsZWFyX2xpc3QoZmlsZSwgJmRldi0+YW10aGlmX2NtZF9saXN0Lmxpc3QpOworCW1laV9jbGVhcl9saXN0KGZpbGUsICZjbC0+cmRfY29tcGxldGVkKTsKKwltZWlfY2xlYXJfbGlzdChmaWxlLCAmZGV2LT5jdHJsX3JkX2xpc3QubGlzdCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvYnVzLmMgYi9kcml2ZXJzL21pc2MvbWVpL2J1cy5jCmluZGV4IDFmMzNmZWEuLjhjYWM3ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvYnVzLmMKKysrIGIvZHJpdmVycy9taXNjL21laS9idXMuYwpAQCAtMTI2LDcgKzEyNiw4IEBACiAJCWdvdG8gb3V0OwogCiAJLyogd2FpdCBvbiBldmVudCBvbmx5IGlmIHRoZXJlIGlzIG5vIG90aGVyIHdhaXRlciAqLwotCWlmIChsaXN0X2VtcHR5KCZjbC0+cmRfY29tcGxldGVkKSAmJiAhd2FpdHF1ZXVlX2FjdGl2ZSgmY2wtPnJ4X3dhaXQpKSB7CisJLyogc3luY2hyb25pemVkIHVuZGVyIGRldmljZSBtdXRleCAqLworCWlmICghd2FpdHF1ZXVlX2FjdGl2ZSgmY2wtPnJ4X3dhaXQpKSB7CiAKIAkJbXV0ZXhfdW5sb2NrKCZidXMtPmRldmljZV9sb2NrKTsKIApAQCAtMTQyLDcgKzE0Myw3IEBACiAJCW11dGV4X2xvY2soJmJ1cy0+ZGV2aWNlX2xvY2spOwogCiAJCWlmICghbWVpX2NsX2lzX2Nvbm5lY3RlZChjbCkpIHsKLQkJCXJldHMgPSAtRUJVU1k7CisJCQlyZXRzID0gLUVOT0RFVjsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQpAQCAtMjM0LDcgKzIzNSw3IEBACiAJLyogUHJlcGFyZSBmb3IgdGhlIG5leHQgcmVhZCAqLwogCWlmIChjbGRldi0+ZXZlbnRzX21hc2sgJiBCSVQoTUVJX0NMX0VWRU5UX1JYKSkgewogCQltdXRleF9sb2NrKCZidXMtPmRldmljZV9sb2NrKTsKLQkJbWVpX2NsX3JlYWRfc3RhcnQoY2xkZXYtPmNsLCAwLCBOVUxMKTsKKwkJbWVpX2NsX3JlYWRfc3RhcnQoY2xkZXYtPmNsLCBtZWlfY2xfbXR1KGNsZGV2LT5jbCksIE5VTEwpOwogCQltdXRleF91bmxvY2soJmJ1cy0+ZGV2aWNlX2xvY2spOwogCX0KIH0KQEAgLTMyNCw3ICszMjUsNyBAQAogCiAJaWYgKGNsZGV2LT5ldmVudHNfbWFzayAmIEJJVChNRUlfQ0xfRVZFTlRfUlgpKSB7CiAJCW11dGV4X2xvY2soJmJ1cy0+ZGV2aWNlX2xvY2spOwotCQlyZXQgPSBtZWlfY2xfcmVhZF9zdGFydChjbGRldi0+Y2wsIDAsIE5VTEwpOworCQlyZXQgPSBtZWlfY2xfcmVhZF9zdGFydChjbGRldi0+Y2wsIG1laV9jbF9tdHUoY2xkZXYtPmNsKSwgTlVMTCk7CiAJCW11dGV4X3VubG9jaygmYnVzLT5kZXZpY2VfbG9jayk7CiAJCWlmIChyZXQgJiYgcmV0ICE9IC1FQlVTWSkKIAkJCXJldHVybiByZXQ7CkBAIC05ODMsMTIgKzk4NCwxMCBAQAogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG1laV9kZXZpY2UsIGJ1c19yZXNjYW5fd29yayk7CiAJc3RydWN0IG1laV9tZV9jbGllbnQgKm1lX2NsOwogCi0JbXV0ZXhfbG9jaygmYnVzLT5kZXZpY2VfbG9jayk7CiAJbWVfY2wgPSBtZWlfbWVfY2xfYnlfdXVpZChidXMsICZtZWlfYW10aGlmX2d1aWQpOwogCWlmIChtZV9jbCkKIAkJbWVpX2FtdGhpZl9ob3N0X2luaXQoYnVzLCBtZV9jbCk7CiAJbWVpX21lX2NsX3B1dChtZV9jbCk7Ci0JbXV0ZXhfdW5sb2NrKCZidXMtPmRldmljZV9sb2NrKTsKIAogCW1laV9jbF9idXNfcmVzY2FuKGJ1cyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2NsaWVudC5jIGIvZHJpdmVycy9taXNjL21laS9jbGllbnQuYwppbmRleCA2NDFjMWE1Li42ZmUwMjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2NsaWVudC5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvY2xpZW50LmMKQEAgLTM1OCw4ICszNTgsOSBAQAogICoKICAqIFJldHVybjogbWVpX2NsX2NiIHBvaW50ZXIgb3IgTlVMTDsKICAqLwotc3RydWN0IG1laV9jbF9jYiAqbWVpX2lvX2NiX2luaXQoc3RydWN0IG1laV9jbCAqY2wsIGVudW0gbWVpX2NiX2ZpbGVfb3BzIHR5cGUsCi0JCQkJIGNvbnN0IHN0cnVjdCBmaWxlICpmcCkKK3N0YXRpYyBzdHJ1Y3QgbWVpX2NsX2NiICptZWlfaW9fY2JfaW5pdChzdHJ1Y3QgbWVpX2NsICpjbCwKKwkJCQkJZW51bSBtZWlfY2JfZmlsZV9vcHMgdHlwZSwKKwkJCQkJY29uc3Qgc3RydWN0IGZpbGUgKmZwKQogewogCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwogCkBAIC00MjAsMzEgKzQyMSw2IEBACiB9CiAKIC8qKgotICogbWVpX2lvX2NiX2FsbG9jX2J1ZiAtIGFsbG9jYXRlIGNhbGxiYWNrIGJ1ZmZlcgotICoKLSAqIEBjYjogaW8gY2FsbGJhY2sgc3RydWN0dXJlCi0gKiBAbGVuZ3RoOiBzaXplIG9mIHRoZSBidWZmZXIKLSAqCi0gKiBSZXR1cm46IDAgb24gc3VjY2VzcwotICogICAgICAgICAtRUlOVkFMIGlmIGNiIGlzIE5VTEwKLSAqICAgICAgICAgLUVOT01FTSBpZiBhbGxvY2F0aW9uIGZhaWxlZAotICovCi1pbnQgbWVpX2lvX2NiX2FsbG9jX2J1ZihzdHJ1Y3QgbWVpX2NsX2NiICpjYiwgc2l6ZV90IGxlbmd0aCkKLXsKLQlpZiAoIWNiKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChsZW5ndGggPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQljYi0+YnVmLmRhdGEgPSBrbWFsbG9jKGxlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjYi0+YnVmLmRhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCWNiLT5idWYuc2l6ZSA9IGxlbmd0aDsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCiAgKiBtZWlfY2xfYWxsb2NfY2IgLSBhIGNvbnZlbmllbnQgd3JhcHBlciBmb3IgYWxsb2NhdGluZyByZWFkIGNiCiAgKgogICogQGNsOiBob3N0IGNsaWVudApAQCAtNDU1LDI0ICs0MzEsNTkgQEAKICAqIFJldHVybjogY2Igb24gc3VjY2VzcyBhbmQgTlVMTCBvbiBmYWlsdXJlCiAgKi8KIHN0cnVjdCBtZWlfY2xfY2IgKm1laV9jbF9hbGxvY19jYihzdHJ1Y3QgbWVpX2NsICpjbCwgc2l6ZV90IGxlbmd0aCwKLQkJCQkgIGVudW0gbWVpX2NiX2ZpbGVfb3BzIHR5cGUsCisJCQkJICBlbnVtIG1laV9jYl9maWxlX29wcyBmb3BfdHlwZSwKIAkJCQkgIGNvbnN0IHN0cnVjdCBmaWxlICpmcCkKIHsKIAlzdHJ1Y3QgbWVpX2NsX2NiICpjYjsKIAotCWNiID0gbWVpX2lvX2NiX2luaXQoY2wsIHR5cGUsIGZwKTsKKwljYiA9IG1laV9pb19jYl9pbml0KGNsLCBmb3BfdHlwZSwgZnApOwogCWlmICghY2IpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKG1laV9pb19jYl9hbGxvY19idWYoY2IsIGxlbmd0aCkpIHsKKwlpZiAobGVuZ3RoID09IDApCisJCXJldHVybiBjYjsKKworCWNiLT5idWYuZGF0YSA9IGttYWxsb2MobGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNiLT5idWYuZGF0YSkgewogCQltZWlfaW9fY2JfZnJlZShjYik7CiAJCXJldHVybiBOVUxMOwogCX0KKwljYi0+YnVmLnNpemUgPSBsZW5ndGg7CiAKIAlyZXR1cm4gY2I7CiB9CiAKIC8qKgorICogbWVpX2NsX2VucXVldWVfY3RybF93cl9jYiAtIGEgY29udmVuaWVudCB3cmFwcGVyIGZvciBhbGxvY2F0aW5nCisgKiAgICAgYW5kIGVucXVldWluZyBvZiB0aGUgY29udHJvbCBjb21tYW5kcyBjYgorICoKKyAqIEBjbDogaG9zdCBjbGllbnQKKyAqIEBsZW5ndGg6IHNpemUgb2YgdGhlIGJ1ZmZlcgorICogQHR5cGU6IG9wZXJhdGlvbiB0eXBlCisgKiBAZnA6IGFzc29jaWF0ZWQgZmlsZSBwb2ludGVyIChtaWdodCBiZSBOVUxMKQorICoKKyAqIFJldHVybjogY2Igb24gc3VjY2VzcyBhbmQgTlVMTCBvbiBmYWlsdXJlCisgKiBMb2NraW5nOiBjYWxsZWQgdW5kZXIgImRldi0+ZGV2aWNlX2xvY2siIGxvY2sKKyAqLworc3RydWN0IG1laV9jbF9jYiAqbWVpX2NsX2VucXVldWVfY3RybF93cl9jYihzdHJ1Y3QgbWVpX2NsICpjbCwgc2l6ZV90IGxlbmd0aCwKKwkJCQkJICAgIGVudW0gbWVpX2NiX2ZpbGVfb3BzIGZvcF90eXBlLAorCQkJCQkgICAgY29uc3Qgc3RydWN0IGZpbGUgKmZwKQoreworCXN0cnVjdCBtZWlfY2xfY2IgKmNiOworCisJLyogZm9yIFJYIGFsd2F5cyBhbGxvY2F0ZSBhdCBsZWFzdCBjbGllbnQncyBtdHUgKi8KKwlpZiAobGVuZ3RoKQorCQlsZW5ndGggPSBtYXhfdChzaXplX3QsIGxlbmd0aCwgbWVpX2NsX210dShjbCkpOworCisJY2IgPSBtZWlfY2xfYWxsb2NfY2IoY2wsIGxlbmd0aCwgZm9wX3R5cGUsIGZwKTsKKwlpZiAoIWNiKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmY2wtPmRldi0+Y3RybF93cl9saXN0Lmxpc3QpOworCXJldHVybiBjYjsKK30KKworLyoqCiAgKiBtZWlfY2xfcmVhZF9jYiAtIGZpbmQgdGhpcyBjbCdzIGNhbGxiYWNrIGluIHRoZSByZWFkIGxpc3QKICAqICAgICBmb3IgYSBzcGVjaWZpYyBmaWxlCiAgKgpAQCAtNzU0LDcgKzc2NSw4IEBACiAJbWVpX2lvX2xpc3RfZmx1c2goJmRldi0+Y3RybF9yZF9saXN0LCBjbCk7CiAJbWVpX2lvX2xpc3RfZmx1c2goJmRldi0+Y3RybF93cl9saXN0LCBjbCk7CiAJbWVpX2NsX3dha2VfYWxsKGNsKTsKLQljbC0+bWVpX2Zsb3dfY3RybF9jcmVkcyA9IDA7CisJY2wtPnJ4X2Zsb3dfY3RybF9jcmVkcyA9IDA7CisJY2wtPnR4X2Zsb3dfY3RybF9jcmVkcyA9IDA7CiAJY2wtPnRpbWVyX2NvdW50ID0gMDsKIAogCWlmICghY2wtPm1lX2NsKQpAQCAtNzY0LDcgKzc3Niw3IEBACiAJCWNsLT5tZV9jbC0+Y29ubmVjdF9jb3VudC0tOwogCiAJaWYgKGNsLT5tZV9jbC0+Y29ubmVjdF9jb3VudCA9PSAwKQotCQljbC0+bWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMgPSAwOworCQljbC0+bWVfY2wtPnR4X2Zsb3dfY3RybF9jcmVkcyA9IDA7CiAKIAltZWlfbWVfY2xfcHV0KGNsLT5tZV9jbCk7CiAJY2wtPm1lX2NsID0gTlVMTDsKQEAgLTgxNCw2ICs4MjYsNyBAQAogCiAJbGlzdF9tb3ZlX3RhaWwoJmNiLT5saXN0LCAmZGV2LT5jdHJsX3JkX2xpc3QubGlzdCk7CiAJY2wtPnRpbWVyX2NvdW50ID0gTUVJX0NPTk5FQ1RfVElNRU9VVDsKKwltZWlfc2NoZWR1bGVfc3RhbGxfdGltZXIoZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtODY3LDEzICs4ODAsMTEgQEAKIAogCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0RJU0NPTk5FQ1RJTkc7CiAKLQljYiA9IG1laV9pb19jYl9pbml0KGNsLCBNRUlfRk9QX0RJU0NPTk5FQ1QsIE5VTEwpOwotCXJldHMgPSBjYiA/IDAgOiAtRU5PTUVNOwotCWlmIChyZXRzKQorCWNiID0gbWVpX2NsX2VucXVldWVfY3RybF93cl9jYihjbCwgMCwgTUVJX0ZPUF9ESVNDT05ORUNULCBOVUxMKTsKKwlpZiAoIWNiKSB7CisJCXJldHMgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKLQotCWNsX2RiZyhkZXYsIGNsLCAiYWRkIGRpc2Nvbm5lY3QgY2IgdG8gY29udHJvbCB3cml0ZSBsaXN0XG4iKTsKLQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmRldi0+Y3RybF93cl9saXN0Lmxpc3QpOworCX0KIAogCWlmIChtZWlfaGJ1Zl9hY3F1aXJlKGRldikpIHsKIAkJcmV0cyA9IG1laV9jbF9zZW5kX2Rpc2Nvbm5lY3QoY2wsIGNiKTsKQEAgLTEwMDEsNiArMTAxMiw3IEBACiAKIAlsaXN0X21vdmVfdGFpbCgmY2ItPmxpc3QsICZkZXYtPmN0cmxfcmRfbGlzdC5saXN0KTsKIAljbC0+dGltZXJfY291bnQgPSBNRUlfQ09OTkVDVF9USU1FT1VUOworCW1laV9zY2hlZHVsZV9zdGFsbF90aW1lcihkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDQyLDE0ICsxMDU0LDE0IEBACiAgKgogICogQGNsOiBob3N0IGNsaWVudAogICogQG1lX2NsOiBtZSBjbGllbnQKLSAqIEBmaWxlOiBwb2ludGVyIHRvIGZpbGUgc3RydWN0dXJlCisgKiBAZnA6IHBvaW50ZXIgdG8gZmlsZSBzdHJ1Y3R1cmUKICAqCiAgKiBMb2NraW5nOiBjYWxsZWQgdW5kZXIgImRldi0+ZGV2aWNlX2xvY2siIGxvY2sKICAqCiAgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZS4KICAqLwogaW50IG1laV9jbF9jb25uZWN0KHN0cnVjdCBtZWlfY2wgKmNsLCBzdHJ1Y3QgbWVpX21lX2NsaWVudCAqbWVfY2wsCi0JCSAgY29uc3Qgc3RydWN0IGZpbGUgKmZpbGUpCisJCSAgIGNvbnN0IHN0cnVjdCBmaWxlICpmcCkKIHsKIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2OwogCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwpAQCAtMTA3NiwxMiArMTA4OCwxMSBAQAogCQlnb3RvIG5vcnRwbTsKIAl9CiAKLQljYiA9IG1laV9pb19jYl9pbml0KGNsLCBNRUlfRk9QX0NPTk5FQ1QsIGZpbGUpOwotCXJldHMgPSBjYiA/IDAgOiAtRU5PTUVNOwotCWlmIChyZXRzKQorCWNiID0gbWVpX2NsX2VucXVldWVfY3RybF93cl9jYihjbCwgMCwgTUVJX0ZPUF9DT05ORUNULCBmcCk7CisJaWYgKCFjYikgeworCQlyZXRzID0gLUVOT01FTTsKIAkJZ290byBvdXQ7Ci0KLQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmRldi0+Y3RybF93cl9saXN0Lmxpc3QpOworCX0KIAogCS8qIHJ1biBoYnVmIGFjcXVpcmUgbGFzdCBzbyB3ZSBkb24ndCBoYXZlIHRvIHVuZG8gKi8KIAlpZiAoIW1laV9jbF9pc19vdGhlcl9jb25uZWN0aW5nKGNsKSAmJiBtZWlfaGJ1Zl9hY3F1aXJlKGRldikpIHsKQEAgLTExNTksNTAgKzExNzAsNDIgQEAKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogCi0KLQogLyoqCi0gKiBtZWlfY2xfZmxvd19jdHJsX2NyZWRzIC0gY2hlY2tzIGZsb3dfY29udHJvbCBjcmVkaXRzIGZvciBjbC4KKyAqIG1laV9jbF90eF9mbG93X2N0cmxfY3JlZHMgLSBjaGVja3MgZmxvd19jb250cm9sIGNyZWRpdHMgZm9yIGNsLgogICoKICAqIEBjbDogaG9zdCBjbGllbnQKLSAqIEBmcDogdGhlIGZpbGUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIHBvaW50ZXIKICAqCi0gKiBSZXR1cm46IDEgaWYgbWVpX2Zsb3dfY3RybF9jcmVkcyA+MCwgMCAtIG90aGVyd2lzZS4KKyAqIFJldHVybjogMSBpZiB0eF9mbG93X2N0cmxfY3JlZHMgPjAsIDAgLSBvdGhlcndpc2UuCiAgKi8KLXN0YXRpYyBpbnQgbWVpX2NsX2Zsb3dfY3RybF9jcmVkcyhzdHJ1Y3QgbWVpX2NsICpjbCwgY29uc3Qgc3RydWN0IGZpbGUgKmZwKQorc3RhdGljIGludCBtZWlfY2xfdHhfZmxvd19jdHJsX2NyZWRzKHN0cnVjdCBtZWlfY2wgKmNsKQogewotCWludCByZXRzOwotCiAJaWYgKFdBUk5fT04oIWNsIHx8ICFjbC0+bWVfY2wpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjbC0+bWVpX2Zsb3dfY3RybF9jcmVkcyA+IDApCisJaWYgKGNsLT50eF9mbG93X2N0cmxfY3JlZHMgPiAwKQogCQlyZXR1cm4gMTsKIAotCWlmIChtZWlfY2xfaXNfZml4ZWRfYWRkcmVzcyhjbCkpIHsKLQkJcmV0cyA9IG1laV9jbF9yZWFkX3N0YXJ0KGNsLCBtZWlfY2xfbXR1KGNsKSwgZnApOwotCQlpZiAocmV0cyAmJiByZXRzICE9IC1FQlVTWSkKLQkJCXJldHVybiByZXRzOworCWlmIChtZWlfY2xfaXNfZml4ZWRfYWRkcmVzcyhjbCkpCiAJCXJldHVybiAxOwotCX0KIAogCWlmIChtZWlfY2xfaXNfc2luZ2xlX3JlY3ZfYnVmKGNsKSkgewotCQlpZiAoY2wtPm1lX2NsLT5tZWlfZmxvd19jdHJsX2NyZWRzID4gMCkKKwkJaWYgKGNsLT5tZV9jbC0+dHhfZmxvd19jdHJsX2NyZWRzID4gMCkKIAkJCXJldHVybiAxOwogCX0KIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiBtZWlfY2xfZmxvd19jdHJsX3JlZHVjZSAtIHJlZHVjZXMgZmxvd19jb250cm9sLgorICogbWVpX2NsX3R4X2Zsb3dfY3RybF9jcmVkc19yZWR1Y2UgLSByZWR1Y2VzIHRyYW5zbWl0IGZsb3cgY29udHJvbCBjcmVkaXRzCisgKiAgIGZvciBhIGNsaWVudAogICoKLSAqIEBjbDogcHJpdmF0ZSBkYXRhIG9mIHRoZSBmaWxlIG9iamVjdAorICogQGNsOiBob3N0IGNsaWVudAogICoKICAqIFJldHVybjoKICAqCTAgb24gc3VjY2VzcwogICoJLUVJTlZBTCB3aGVuIGN0cmwgY3JlZGl0cyBhcmUgPD0gMAogICovCi1zdGF0aWMgaW50IG1laV9jbF9mbG93X2N0cmxfcmVkdWNlKHN0cnVjdCBtZWlfY2wgKmNsKQorc3RhdGljIGludCBtZWlfY2xfdHhfZmxvd19jdHJsX2NyZWRzX3JlZHVjZShzdHJ1Y3QgbWVpX2NsICpjbCkKIHsKIAlpZiAoV0FSTl9PTighY2wgfHwgIWNsLT5tZV9jbCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTIxMSwxMyArMTIxNCwxMyBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChtZWlfY2xfaXNfc2luZ2xlX3JlY3ZfYnVmKGNsKSkgewotCQlpZiAoV0FSTl9PTihjbC0+bWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMgPD0gMCkpCisJCWlmIChXQVJOX09OKGNsLT5tZV9jbC0+dHhfZmxvd19jdHJsX2NyZWRzIDw9IDApKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWNsLT5tZV9jbC0+bWVpX2Zsb3dfY3RybF9jcmVkcy0tOworCQljbC0+bWVfY2wtPnR4X2Zsb3dfY3RybF9jcmVkcy0tOwogCX0gZWxzZSB7Ci0JCWlmIChXQVJOX09OKGNsLT5tZWlfZmxvd19jdHJsX2NyZWRzIDw9IDApKQorCQlpZiAoV0FSTl9PTihjbC0+dHhfZmxvd19jdHJsX2NyZWRzIDw9IDApKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWNsLT5tZWlfZmxvd19jdHJsX2NyZWRzLS07CisJCWNsLT50eF9mbG93X2N0cmxfY3JlZHMtLTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xMjkyLDcgKzEyOTUsNyBAQAogICogbWVpX2NsX25vdGlmeV9yZXF1ZXN0IC0gc2VuZCBub3RpZmljYXRpb24gc3RvcC9zdGFydCByZXF1ZXN0CiAgKgogICogQGNsOiBob3N0IGNsaWVudAotICogQGZpbGU6IGFzc29jaWF0ZSByZXF1ZXN0IHdpdGggZmlsZQorICogQGZwOiBhc3NvY2lhdGUgcmVxdWVzdCB3aXRoIGZpbGUKICAqIEByZXF1ZXN0OiAxIGZvciBzdGFydCBvciAwIGZvciBzdG9wCiAgKgogICogTG9ja2luZzogY2FsbGVkIHVuZGVyICJkZXYtPmRldmljZV9sb2NrIiBsb2NrCkBAIC0xMzAwLDcgKzEzMDMsNyBAQAogICogUmV0dXJuOiAwIG9uIHN1Y2ggYW5kIGVycm9yIG90aGVyd2lzZS4KICAqLwogaW50IG1laV9jbF9ub3RpZnlfcmVxdWVzdChzdHJ1Y3QgbWVpX2NsICpjbCwKLQkJCSAgY29uc3Qgc3RydWN0IGZpbGUgKmZpbGUsIHU4IHJlcXVlc3QpCisJCQkgIGNvbnN0IHN0cnVjdCBmaWxlICpmcCwgdTggcmVxdWVzdCkKIHsKIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2OwogCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwpAQCAtMTMyNSw3ICsxMzI4LDcgQEAKIAl9CiAKIAlmb3BfdHlwZSA9IG1laV9jbF9ub3RpZnlfcmVxMmZvcChyZXF1ZXN0KTsKLQljYiA9IG1laV9pb19jYl9pbml0KGNsLCBmb3BfdHlwZSwgZmlsZSk7CisJY2IgPSBtZWlfY2xfZW5xdWV1ZV9jdHJsX3dyX2NiKGNsLCAwLCBmb3BfdHlwZSwgZnApOwogCWlmICghY2IpIHsKIAkJcmV0cyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwpAQCAtMTMzNiw5ICsxMzM5LDcgQEAKIAkJCXJldHMgPSAtRU5PREVWOwogCQkJZ290byBvdXQ7CiAJCX0KLQkJbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZkZXYtPmN0cmxfcmRfbGlzdC5saXN0KTsKLQl9IGVsc2UgewotCQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmRldi0+Y3RybF93cl9saXN0Lmxpc3QpOworCQlsaXN0X21vdmVfdGFpbCgmY2ItPmxpc3QsICZkZXYtPmN0cmxfcmRfbGlzdC5saXN0KTsKIAl9CiAKIAltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOwpAQCAtMTQzNiwyNSArMTQzNyw2IEBACiB9CiAKIC8qKgotICogbWVpX2NsX2lzX3JlYWRfZmNfY2IgLSBjaGVjayBpZiByZWFkIGNiIGlzIHdhaXRpbmcgZm9yIGZsb3cgY29udHJvbAotICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgZ2l2ZW4gaG9zdCBjbGllbnQKLSAqCi0gKiBAY2w6IGhvc3QgY2xpZW50Ci0gKgotICogUmV0dXJuOiB0cnVlLCBpZiBmb3VuZCBhdCBsZWFzdCBvbmUgY2IuCi0gKi8KLXN0YXRpYyBib29sIG1laV9jbF9pc19yZWFkX2ZjX2NiKHN0cnVjdCBtZWlfY2wgKmNsKQotewotCXN0cnVjdCBtZWlfZGV2aWNlICpkZXYgPSBjbC0+ZGV2OwotCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjYiwgJmRldi0+Y3RybF93cl9saXN0Lmxpc3QsIGxpc3QpCi0JCWlmIChjYi0+Zm9wX3R5cGUgPT0gTUVJX0ZPUF9SRUFEICYmIGNiLT5jbCA9PSBjbCkKLQkJCXJldHVybiB0cnVlOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCiAgKiBtZWlfY2xfcmVhZF9zdGFydCAtIHRoZSBzdGFydCByZWFkIGNsaWVudCBtZXNzYWdlIGZ1bmN0aW9uLgogICoKICAqIEBjbDogaG9zdCBjbGllbnQKQEAgLTE0NzcsMjYgKzE0NTksMjIgQEAKIAlpZiAoIW1laV9jbF9pc19jb25uZWN0ZWQoY2wpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCS8qIEhXIGN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IG9uZSBwZW5kaW5nIHJlYWQgKi8KLQlpZiAoIWxpc3RfZW1wdHkoJmNsLT5yZF9wZW5kaW5nKSB8fCBtZWlfY2xfaXNfcmVhZF9mY19jYihjbCkpCi0JCXJldHVybiAtRUJVU1k7Ci0KIAlpZiAoIW1laV9tZV9jbF9pc19hY3RpdmUoY2wtPm1lX2NsKSkgewogCQljbF9lcnIoZGV2LCBjbCwgIm5vIHN1Y2ggbWUgY2xpZW50XG4iKTsKIAkJcmV0dXJuICAtRU5PVFRZOwogCX0KIAotCS8qIGFsd2F5cyBhbGxvY2F0ZSBhdCBsZWFzdCBjbGllbnQgbWF4IG1lc3NhZ2UgKi8KLQlsZW5ndGggPSBtYXhfdChzaXplX3QsIGxlbmd0aCwgbWVpX2NsX210dShjbCkpOwotCWNiID0gbWVpX2NsX2FsbG9jX2NiKGNsLCBsZW5ndGgsIE1FSV9GT1BfUkVBRCwgZnApOworCWlmIChtZWlfY2xfaXNfZml4ZWRfYWRkcmVzcyhjbCkgfHwgY2wgPT0gJmRldi0+aWFtdGhpZl9jbCkKKwkJcmV0dXJuIDA7CisKKwkvKiBIVyBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBvbmUgcGVuZGluZyByZWFkICovCisJaWYgKGNsLT5yeF9mbG93X2N0cmxfY3JlZHMpCisJCXJldHVybiAtRUJVU1k7CisKKwljYiA9IG1laV9jbF9lbnF1ZXVlX2N0cmxfd3JfY2IoY2wsIGxlbmd0aCwgTUVJX0ZPUF9SRUFELCBmcCk7CiAJaWYgKCFjYikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAobWVpX2NsX2lzX2ZpeGVkX2FkZHJlc3MoY2wpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmY2wtPnJkX3BlbmRpbmcpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlyZXRzID0gcG1fcnVudGltZV9nZXQoZGV2LT5kZXYpOwogCWlmIChyZXRzIDwgMCAmJiByZXRzICE9IC1FSU5QUk9HUkVTUykgewogCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2LT5kZXYpOwpAQCAtMTUwNCwxNiArMTQ4MiwxNSBAQAogCQlnb3RvIG5vcnRwbTsKIAl9CiAKKwlyZXRzID0gMDsKIAlpZiAobWVpX2hidWZfYWNxdWlyZShkZXYpKSB7CiAJCXJldHMgPSBtZWlfaGJtX2NsX2Zsb3dfY29udHJvbF9yZXEoZGV2LCBjbCk7CiAJCWlmIChyZXRzIDwgMCkKIAkJCWdvdG8gb3V0OwogCi0JCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmY2wtPnJkX3BlbmRpbmcpOwotCX0gZWxzZSB7Ci0JCXJldHMgPSAwOwotCQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmRldi0+Y3RybF93cl9saXN0Lmxpc3QpOworCQlsaXN0X21vdmVfdGFpbCgmY2ItPmxpc3QsICZjbC0+cmRfcGVuZGluZyk7CiAJfQorCWNsLT5yeF9mbG93X2N0cmxfY3JlZHMrKzsKIAogb3V0OgogCWNsX2RiZyhkZXYsIGNsLCAicnBtOiBhdXRvc3VzcGVuZFxuIik7CkBAIC0xNTU3LDcgKzE1MzQsNyBAQAogCiAJZmlyc3RfY2h1bmsgPSBjYi0+YnVmX2lkeCA9PSAwOwogCi0JcmV0cyA9IGZpcnN0X2NodW5rID8gbWVpX2NsX2Zsb3dfY3RybF9jcmVkcyhjbCwgY2ItPmZwKSA6IDE7CisJcmV0cyA9IGZpcnN0X2NodW5rID8gbWVpX2NsX3R4X2Zsb3dfY3RybF9jcmVkcyhjbCkgOiAxOwogCWlmIChyZXRzIDwgMCkKIAkJcmV0dXJuIHJldHM7CiAKQEAgLTE2MDUsNyArMTU4Miw3IEBACiAJY2ItPmNvbXBsZXRlZCA9IG1laV9oZHIubXNnX2NvbXBsZXRlID09IDE7CiAKIAlpZiAoZmlyc3RfY2h1bmspIHsKLQkJaWYgKG1laV9jbF9mbG93X2N0cmxfcmVkdWNlKGNsKSkKKwkJaWYgKG1laV9jbF90eF9mbG93X2N0cmxfY3JlZHNfcmVkdWNlKGNsKSkKIAkJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMTY2Myw3ICsxNjQwLDcgQEAKIAltZWlfaGRyLm1zZ19jb21wbGV0ZSA9IDA7CiAJbWVpX2hkci5pbnRlcm5hbCA9IGNiLT5pbnRlcm5hbDsKIAotCXJldHMgPSBtZWlfY2xfZmxvd19jdHJsX2NyZWRzKGNsLCBjYi0+ZnApOworCXJldHMgPSBtZWlfY2xfdHhfZmxvd19jdHJsX2NyZWRzKGNsKTsKIAlpZiAocmV0cyA8IDApCiAJCWdvdG8gZXJyOwogCkBAIC0xNjkxLDcgKzE2NjgsNyBAQAogCWlmIChyZXRzKQogCQlnb3RvIGVycjsKIAotCXJldHMgPSBtZWlfY2xfZmxvd19jdHJsX3JlZHVjZShjbCk7CisJcmV0cyA9IG1laV9jbF90eF9mbG93X2N0cmxfY3JlZHNfcmVkdWNlKGNsKTsKIAlpZiAocmV0cykKIAkJZ290byBlcnI7CiAKQEAgLTE3NjEsNiArMTczOCw5IEBACiAKIAljYXNlIE1FSV9GT1BfUkVBRDoKIAkJbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZjbC0+cmRfY29tcGxldGVkKTsKKwkJaWYgKCFtZWlfY2xfaXNfZml4ZWRfYWRkcmVzcyhjbCkgJiYKKwkJICAgICFXQVJOX09OKCFjbC0+cnhfZmxvd19jdHJsX2NyZWRzKSkKKwkJCWNsLT5yeF9mbG93X2N0cmxfY3JlZHMtLTsKIAkJaWYgKCFtZWlfY2xfYnVzX3J4X2V2ZW50KGNsKSkKIAkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2wtPnJ4X3dhaXQpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvY2xpZW50LmggYi9kcml2ZXJzL21pc2MvbWVpL2NsaWVudC5oCmluZGV4IDBkN2EzYTEuLmQyYmZhYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvY2xpZW50LmgKKysrIGIvZHJpdmVycy9taXNjL21laS9jbGllbnQuaApAQCAtODIsMTEgKzgyLDcgQEAKIC8qCiAgKiBNRUkgSU8gRnVuY3Rpb25zCiAgKi8KLXN0cnVjdCBtZWlfY2xfY2IgKm1laV9pb19jYl9pbml0KHN0cnVjdCBtZWlfY2wgKmNsLCBlbnVtIG1laV9jYl9maWxlX29wcyB0eXBlLAotCQkJCSBjb25zdCBzdHJ1Y3QgZmlsZSAqZnApOwogdm9pZCBtZWlfaW9fY2JfZnJlZShzdHJ1Y3QgbWVpX2NsX2NiICpwcml2X2NiKTsKLWludCBtZWlfaW9fY2JfYWxsb2NfYnVmKHN0cnVjdCBtZWlfY2xfY2IgKmNiLCBzaXplX3QgbGVuZ3RoKTsKLQogCiAvKioKICAqIG1laV9pb19saXN0X2luaXQgLSBTZXRzIHVwIGEgcXVldWUgbGlzdC4KQEAgLTExOCw2ICsxMTQsOSBAQAogc3RydWN0IG1laV9jbF9jYiAqbWVpX2NsX2FsbG9jX2NiKHN0cnVjdCBtZWlfY2wgKmNsLCBzaXplX3QgbGVuZ3RoLAogCQkJCSAgZW51bSBtZWlfY2JfZmlsZV9vcHMgdHlwZSwKIAkJCQkgIGNvbnN0IHN0cnVjdCBmaWxlICpmcCk7CitzdHJ1Y3QgbWVpX2NsX2NiICptZWlfY2xfZW5xdWV1ZV9jdHJsX3dyX2NiKHN0cnVjdCBtZWlfY2wgKmNsLCBzaXplX3QgbGVuZ3RoLAorCQkJCQkgICAgZW51bSBtZWlfY2JfZmlsZV9vcHMgdHlwZSwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBmaWxlICpmcCk7CiBpbnQgbWVpX2NsX2ZsdXNoX3F1ZXVlcyhzdHJ1Y3QgbWVpX2NsICpjbCwgY29uc3Qgc3RydWN0IGZpbGUgKmZwKTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaGJtLmMgYi9kcml2ZXJzL21pc2MvbWVpL2hibS5jCmluZGV4IDA4NWYzYWEuLmRkN2YxNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvaGJtLmMKKysrIGIvZHJpdmVycy9taXNjL21laS9oYm0uYwpAQCAtMTYxLDYgKzE2MSw3IEBACiAgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQogICogQGNsOiBjbGllbnQKICAqIEBoYm1fY21kOiBob3N0IGJ1cyBtZXNzYWdlIGNvbW1hbmQKKyAqIEBidWY6IG1lc3NhZ2UgYnVmZmVyCiAgKiBAbGVuOiBidWZmZXIgbGVuZ3RoCiAgKgogICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGZhaWx1cmUuCkBAIC0yNzYsNiArMjc3LDcgQEAKIAogCWRldi0+aGJtX3N0YXRlID0gTUVJX0hCTV9TVEFSVElORzsKIAlkZXYtPmluaXRfY2xpZW50c190aW1lciA9IE1FSV9DTElFTlRTX0lOSVRfVElNRU9VVDsKKwltZWlfc2NoZWR1bGVfc3RhbGxfdGltZXIoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzExLDYgKzMxMyw3IEBACiAJfQogCWRldi0+aGJtX3N0YXRlID0gTUVJX0hCTV9FTlVNX0NMSUVOVFM7CiAJZGV2LT5pbml0X2NsaWVudHNfdGltZXIgPSBNRUlfQ0xJRU5UU19JTklUX1RJTUVPVVQ7CisJbWVpX3NjaGVkdWxlX3N0YWxsX3RpbWVyKGRldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMzOSw3ICszNDIsNyBAQAogCiAJbWVfY2wtPnByb3BzID0gcmVzLT5jbGllbnRfcHJvcGVydGllczsKIAltZV9jbC0+Y2xpZW50X2lkID0gcmVzLT5tZV9hZGRyOwotCW1lX2NsLT5tZWlfZmxvd19jdHJsX2NyZWRzID0gMDsKKwltZV9jbC0+dHhfZmxvd19jdHJsX2NyZWRzID0gMDsKIAogCW1laV9tZV9jbF9hZGQoZGV2LCBtZV9jbCk7CiAKQEAgLTU2MSw2ICs1NjQsNyBAQAogCX0KIAogCWRldi0+aW5pdF9jbGllbnRzX3RpbWVyID0gTUVJX0NMSUVOVFNfSU5JVF9USU1FT1VUOworCW1laV9zY2hlZHVsZV9zdGFsbF90aW1lcihkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MzYsMjMgKzY0MCwyMiBAQAogfQogCiAvKioKLSAqIG1laV9oYm1fYWRkX3NpbmdsZV9mbG93X2NyZWRzIC0gYWRkcyBzaW5nbGUgYnVmZmVyIGNyZWRlbnRpYWxzLgorICogbWVpX2hibV9hZGRfc2luZ2xlX3R4X2Zsb3dfY3RybF9jcmVkcyAtIGFkZHMgc2luZ2xlIGJ1ZmZlciBjcmVkZW50aWFscy4KICAqCiAgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQotICogQGZsb3c6IGZsb3cgY29udHJvbC4KKyAqIEBmY3RybDogZmxvdyBjb250cm9sIHJlc3BvbnNlIGJ1cyBtZXNzYWdlCiAgKgogICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIDwgMCBvdGhlcndpc2UKICAqLwotc3RhdGljIGludCBtZWlfaGJtX2FkZF9zaW5nbGVfZmxvd19jcmVkcyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAotCQkJCSAgc3RydWN0IGhibV9mbG93X2NvbnRyb2wgKmZsb3cpCitzdGF0aWMgaW50IG1laV9oYm1fYWRkX3NpbmdsZV90eF9mbG93X2N0cmxfY3JlZHMoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKKwkJCQkJCSBzdHJ1Y3QgaGJtX2Zsb3dfY29udHJvbCAqZmN0cmwpCiB7CiAJc3RydWN0IG1laV9tZV9jbGllbnQgKm1lX2NsOwogCWludCByZXRzOwogCi0JbWVfY2wgPSBtZWlfbWVfY2xfYnlfaWQoZGV2LCBmbG93LT5tZV9hZGRyKTsKKwltZV9jbCA9IG1laV9tZV9jbF9ieV9pZChkZXYsIGZjdHJsLT5tZV9hZGRyKTsKIAlpZiAoIW1lX2NsKSB7Ci0JCWRldl9lcnIoZGV2LT5kZXYsICJubyBzdWNoIG1lIGNsaWVudCAlZFxuIiwKLQkJCWZsb3ctPm1lX2FkZHIpOworCQlkZXZfZXJyKGRldi0+ZGV2LCAibm8gc3VjaCBtZSBjbGllbnQgJWRcbiIsIGZjdHJsLT5tZV9hZGRyKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCkBAIC02NjEsOSArNjY0LDkgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JbWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMrKzsKKwltZV9jbC0+dHhfZmxvd19jdHJsX2NyZWRzKys7CiAJZGV2X2RiZyhkZXYtPmRldiwgInJlY3YgZmxvdyBjdHJsIG1zZyBNRSAlZCAoc2luZ2xlKSBjcmVkcyA9ICVkLlxuIiwKLQkgICAgZmxvdy0+bWVfYWRkciwgbWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMpOworCQlmY3RybC0+bWVfYWRkciwgbWVfY2wtPnR4X2Zsb3dfY3RybF9jcmVkcyk7CiAKIAlyZXRzID0gMDsKIG91dDoKQEAgLTY3NSwyNCArNjc4LDI0IEBACiAgKiBtZWlfaGJtX2NsX2Zsb3dfY29udHJvbF9yZXMgLSBmbG93IGNvbnRyb2wgcmVzcG9uc2UgZnJvbSBtZQogICoKICAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAZmxvd19jb250cm9sOiBmbG93IGNvbnRyb2wgcmVzcG9uc2UgYnVzIG1lc3NhZ2UKKyAqIEBmY3RybDogZmxvdyBjb250cm9sIHJlc3BvbnNlIGJ1cyBtZXNzYWdlCiAgKi8KLXN0YXRpYyB2b2lkIG1laV9oYm1fY2xfZmxvd19jb250cm9sX3JlcyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAotCQkJCQlzdHJ1Y3QgaGJtX2Zsb3dfY29udHJvbCAqZmxvd19jb250cm9sKQorc3RhdGljIHZvaWQgbWVpX2hibV9jbF90eF9mbG93X2N0cmxfY3JlZHNfcmVzKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3QgaGJtX2Zsb3dfY29udHJvbCAqZmN0cmwpCiB7CiAJc3RydWN0IG1laV9jbCAqY2w7CiAKLQlpZiAoIWZsb3dfY29udHJvbC0+aG9zdF9hZGRyKSB7CisJaWYgKCFmY3RybC0+aG9zdF9hZGRyKSB7CiAJCS8qIHNpbmdsZSByZWNlaXZlIGJ1ZmZlciAqLwotCQltZWlfaGJtX2FkZF9zaW5nbGVfZmxvd19jcmVkcyhkZXYsIGZsb3dfY29udHJvbCk7CisJCW1laV9oYm1fYWRkX3NpbmdsZV90eF9mbG93X2N0cmxfY3JlZHMoZGV2LCBmY3RybCk7CiAJCXJldHVybjsKIAl9CiAKLQljbCA9IG1laV9oYm1fY2xfZmluZF9ieV9jbWQoZGV2LCBmbG93X2NvbnRyb2wpOworCWNsID0gbWVpX2hibV9jbF9maW5kX2J5X2NtZChkZXYsIGZjdHJsKTsKIAlpZiAoY2wpIHsKLQkJY2wtPm1laV9mbG93X2N0cmxfY3JlZHMrKzsKKwkJY2wtPnR4X2Zsb3dfY3RybF9jcmVkcysrOwogCQljbF9kYmcoZGV2LCBjbCwgImZsb3cgY29udHJvbCBjcmVkcyA9ICVkLlxuIiwKLQkJCQljbC0+bWVpX2Zsb3dfY3RybF9jcmVkcyk7CisJCQkJY2wtPnR4X2Zsb3dfY3RybF9jcmVkcyk7CiAJfQogfQogCkBAIC04NzEsMTAgKzg3NCwxMCBAQAogCQljbC0+c3RhdGUgPSBNRUlfRklMRV9ESVNDT05ORUNUSU5HOwogCQljbC0+dGltZXJfY291bnQgPSAwOwogCi0JCWNiID0gbWVpX2lvX2NiX2luaXQoY2wsIE1FSV9GT1BfRElTQ09OTkVDVF9SU1AsIE5VTEwpOworCQljYiA9IG1laV9jbF9lbnF1ZXVlX2N0cmxfd3JfY2IoY2wsIDAsIE1FSV9GT1BfRElTQ09OTkVDVF9SU1AsCisJCQkJCSAgICAgICBOVUxMKTsKIAkJaWYgKCFjYikKIAkJCXJldHVybiAtRU5PTUVNOwotCQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmRldi0+Y3RybF93cl9saXN0Lmxpc3QpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTEwMjIsNyArMTAyNSw3IEBACiAKIAlzdHJ1Y3QgbWVpX2hibV9jbF9jbWQgKmNsX2NtZDsKIAlzdHJ1Y3QgaGJtX2NsaWVudF9jb25uZWN0X3JlcXVlc3QgKmRpc2Nvbm5lY3RfcmVxOwotCXN0cnVjdCBoYm1fZmxvd19jb250cm9sICpmbG93X2NvbnRyb2w7CisJc3RydWN0IGhibV9mbG93X2NvbnRyb2wgKmZjdHJsOwogCiAJLyogcmVhZCB0aGUgbWVzc2FnZSB0byBvdXIgYnVmZmVyICovCiAJQlVHX09OKGhkci0+bGVuZ3RoID49IHNpemVvZihkZXYtPnJkX21zZ19idWYpKTsKQEAgLTExMDIsOCArMTEwNSw4IEBACiAJY2FzZSBNRUlfRkxPV19DT05UUk9MX0NNRDoKIAkJZGV2X2RiZyhkZXYtPmRldiwgImhibTogY2xpZW50IGZsb3cgY29udHJvbCByZXNwb25zZTogbWVzc2FnZSByZWNlaXZlZC5cbiIpOwogCi0JCWZsb3dfY29udHJvbCA9IChzdHJ1Y3QgaGJtX2Zsb3dfY29udHJvbCAqKSBtZWlfbXNnOwotCQltZWlfaGJtX2NsX2Zsb3dfY29udHJvbF9yZXMoZGV2LCBmbG93X2NvbnRyb2wpOworCQlmY3RybCA9IChzdHJ1Y3QgaGJtX2Zsb3dfY29udHJvbCAqKW1laV9tc2c7CisJCW1laV9oYm1fY2xfdHhfZmxvd19jdHJsX2NyZWRzX3JlcyhkZXYsIGZjdHJsKTsKIAkJYnJlYWs7CiAKIAljYXNlIE1FSV9QR19JU09MQVRJT05fRU5UUllfUkVTX0NNRDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaHctbWUtcmVncy5oIGIvZHJpdmVycy9taXNjL21laS9ody1tZS1yZWdzLmgKaW5kZXggMGRjYjg1NC4uN2FkMTVkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9ody1tZS1yZWdzLmgKKysrIGIvZHJpdmVycy9taXNjL21laS9ody1tZS1yZWdzLmgKQEAgLTEyNSw2ICsxMjUsOSBAQAogI2RlZmluZSBNRUlfREVWX0lEX0JYVF9NICAgICAgMHgxQTlBICAvKiBCcm94dG9uIE0gKi8KICNkZWZpbmUgTUVJX0RFVl9JRF9BUExfSSAgICAgIDB4NUE5QSAgLyogQXBvbGxvIExha2UgSSAqLwogCisjZGVmaW5lIE1FSV9ERVZfSURfS0JQICAgICAgICAweEEyQkEgIC8qIEthYnkgUG9pbnQgKi8KKyNkZWZpbmUgTUVJX0RFVl9JRF9LQlBfMiAgICAgIDB4QTJCQiAgLyogS2FieSBQb2ludCAyICovCisKIC8qCiAgKiBNRUkgSFcgU2VjdGlvbgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2h3LW1lLmMgYi9kcml2ZXJzL21pc2MvbWVpL2h3LW1lLmMKaW5kZXggZTJmYjQ0Yy4uNTZjMjEwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9ody1tZS5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvaHctbWUuYwpAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KIAogI2luY2x1ZGUgIm1laV9kZXYuaCIKICNpbmNsdWRlICJoYm0uaCIKQEAgLTEwNjMsNiArMTA2NCw4IEBACiAJCX0KIAl9CiAKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2LT5kZXYpOworCiAJaGNzciA9IG1laV9oY3NyX3JlYWQoZGV2KTsKIAkvKiBIX1JTVCBtYXkgYmUgZm91bmQgbGl0IGJlZm9yZSByZXNldCBpcyBzdGFydGVkLAogCSAqIGZvciBleGFtcGxlIGlmIHByZWNlZGluZyByZXNldCBmbG93IGhhc24ndCBjb21wbGV0ZWQuCkBAIC0xMjYzLDggKzEyNjYsMTQgQEAKIHN0YXRpYyBib29sIG1laV9tZV9md190eXBlX3NwcyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAl1MzIgcmVnOwotCS8qIFJlYWQgTUUgRlcgU3RhdHVzIGNoZWNrIGZvciBTUFMgRmlybXdhcmUgKi8KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0NGR19IRlNfMSwgJnJlZyk7CisJdW5zaWduZWQgaW50IGRldmZuOworCisJLyoKKwkgKiBSZWFkIE1FIEZXIFN0YXR1cyByZWdpc3RlciB0byBjaGVjayBmb3IgU1BTIEZpcm13YXJlCisJICogVGhlIFNQUyBGVyBpcyBvbmx5IHNpZ25hbGVkIGluIHBjaSBmdW5jdGlvbiAwCisJICovCisJZGV2Zm4gPSBQQ0lfREVWRk4oUENJX1NMT1QocGRldi0+ZGV2Zm4pLCAwKTsKKwlwY2lfYnVzX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYtPmJ1cywgZGV2Zm4sIFBDSV9DRkdfSEZTXzEsICZyZWcpOwogCXRyYWNlX21laV9wY2lfY2ZnX3JlYWQoJnBkZXYtPmRldiwgIlBDSV9DRkdfSEZTXzEiLCBQQ0lfQ0ZHX0hGU18xLCByZWcpOwogCS8qIGlmIGJpdHMgWzE5OjE2XSA9IDE1LCBydW5uaW5nIFNQUyBGaXJtd2FyZSAqLwogCXJldHVybiAocmVnICYgMHhmMDAwMCkgPT0gMHhmMDAwMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaHctdHhlLmMgYi9kcml2ZXJzL21pc2MvbWVpL2h3LXR4ZS5jCmluZGV4IDRhNmMxYjguLmU2ZTVlNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvaHctdHhlLmMKKysrIGIvZHJpdmVycy9taXNjL21laS9ody10eGUuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21laS5oPgogCkBAIC05MzUsNiArOTM2LDggQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2LT5kZXYpOworCiAJLyogZW5hYmxlIGlucHV0IHJlYWR5IGludGVycnVwdHM6CiAJICogU0VDX0lQQ19IT1NUX0lOVF9NQVNLLklQQ19JTlBVVF9SRUFEWV9JTlRfTUFTSwogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9pbml0LmMgYi9kcml2ZXJzL21pc2MvbWVpL2luaXQuYwppbmRleCBmN2M4ZGZkLi45YTljMjQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2luaXQuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL2luaXQuYwpAQCAtOTQsNyArOTQsNyBAQAogCWNhbmNlbF93b3JrX3N5bmMoJmRldi0+cmVzZXRfd29yayk7CiAJY2FuY2VsX3dvcmtfc3luYygmZGV2LT5idXNfcmVzY2FuX3dvcmspOwogCi0JY2FuY2VsX2RlbGF5ZWRfd29yaygmZGV2LT50aW1lcl93b3JrKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmRldi0+dGltZXJfd29yayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtZWlfY2FuY2VsX3dvcmspOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2ludGVycnVwdC5jIGIvZHJpdmVycy9taXNjL21laS9pbnRlcnJ1cHQuYwppbmRleCAzODMxYTdiLi41YTQ4OTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2ludGVycnVwdC5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvaW50ZXJydXB0LmMKQEAgLTEwMiwyNiArMTAyLDI1IEBACiB7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IGNsLT5kZXY7CiAJc3RydWN0IG1laV9jbF9jYiAqY2I7Ci0JdW5zaWduZWQgY2hhciAqYnVmZmVyID0gTlVMTDsKIAlzaXplX3QgYnVmX3N6OwogCiAJY2IgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmNsLT5yZF9wZW5kaW5nLCBzdHJ1Y3QgbWVpX2NsX2NiLCBsaXN0KTsKIAlpZiAoIWNiKSB7Ci0JCWNsX2VycihkZXYsIGNsLCAicGVuZGluZyByZWFkIGNiIG5vdCBmb3VuZFxuIik7Ci0JCWdvdG8gb3V0OworCQlpZiAoIW1laV9jbF9pc19maXhlZF9hZGRyZXNzKGNsKSkgeworCQkJY2xfZXJyKGRldiwgY2wsICJwZW5kaW5nIHJlYWQgY2Igbm90IGZvdW5kXG4iKTsKKwkJCWdvdG8gZGlzY2FyZDsKKwkJfQorCQljYiA9IG1laV9jbF9hbGxvY19jYihjbCwgbWVpX2NsX210dShjbCksIE1FSV9GT1BfUkVBRCwgY2wtPmZwKTsKKwkJaWYgKCFjYikKKwkJCWdvdG8gZGlzY2FyZDsKKwkJbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZjbC0+cmRfcGVuZGluZyk7CiAJfQogCiAJaWYgKCFtZWlfY2xfaXNfY29ubmVjdGVkKGNsKSkgewogCQljbF9kYmcoZGV2LCBjbCwgIm5vdCBjb25uZWN0ZWRcbiIpOwotCQljYi0+c3RhdHVzID0gLUVOT0RFVjsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGNiLT5idWYuc2l6ZSA9PSAwIHx8IGNiLT5idWYuZGF0YSA9PSBOVUxMKSB7Ci0JCWNsX2VycihkZXYsIGNsLCAicmVzcG9uc2UgYnVmZmVyIGlzIG5vdCBhbGxvY2F0ZWQuXG4iKTsKIAkJbGlzdF9tb3ZlX3RhaWwoJmNiLT5saXN0LCAmY29tcGxldGVfbGlzdC0+bGlzdCk7Ci0JCWNiLT5zdGF0dXMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKKwkJY2ItPnN0YXR1cyA9IC1FTk9ERVY7CisJCWdvdG8gZGlzY2FyZDsKIAl9CiAKIAlidWZfc3ogPSBtZWlfaGRyLT5sZW5ndGggKyBjYi0+YnVmX2lkeDsKQEAgLTEzMiwyNSArMTMxLDE5IEBACiAKIAkJbGlzdF9tb3ZlX3RhaWwoJmNiLT5saXN0LCAmY29tcGxldGVfbGlzdC0+bGlzdCk7CiAJCWNiLT5zdGF0dXMgPSAtRU1TR1NJWkU7Ci0JCWdvdG8gb3V0OworCQlnb3RvIGRpc2NhcmQ7CiAJfQogCiAJaWYgKGNiLT5idWYuc2l6ZSA8IGJ1Zl9zeikgewogCQljbF9kYmcoZGV2LCBjbCwgIm1lc3NhZ2Ugb3ZlcmZsb3cuIHNpemUgJXp1IGxlbiAlZCBpZHggJXp1XG4iLAogCQkJY2ItPmJ1Zi5zaXplLCBtZWlfaGRyLT5sZW5ndGgsIGNiLT5idWZfaWR4KTsKLQkJYnVmZmVyID0ga3JlYWxsb2MoY2ItPmJ1Zi5kYXRhLCBidWZfc3osIEdGUF9LRVJORUwpOwogCi0JCWlmICghYnVmZmVyKSB7Ci0JCQljYi0+c3RhdHVzID0gLUVOT01FTTsKLQkJCWxpc3RfbW92ZV90YWlsKCZjYi0+bGlzdCwgJmNvbXBsZXRlX2xpc3QtPmxpc3QpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJY2ItPmJ1Zi5kYXRhID0gYnVmZmVyOwotCQljYi0+YnVmLnNpemUgPSBidWZfc3o7CisJCWxpc3RfbW92ZV90YWlsKCZjYi0+bGlzdCwgJmNvbXBsZXRlX2xpc3QtPmxpc3QpOworCQljYi0+c3RhdHVzID0gLUVNU0dTSVpFOworCQlnb3RvIGRpc2NhcmQ7CiAJfQogCi0JYnVmZmVyID0gY2ItPmJ1Zi5kYXRhICsgY2ItPmJ1Zl9pZHg7Ci0JbWVpX3JlYWRfc2xvdHMoZGV2LCBidWZmZXIsIG1laV9oZHItPmxlbmd0aCk7CisJbWVpX3JlYWRfc2xvdHMoZGV2LCBjYi0+YnVmLmRhdGEgKyBjYi0+YnVmX2lkeCwgbWVpX2hkci0+bGVuZ3RoKTsKIAogCWNiLT5idWZfaWR4ICs9IG1laV9oZHItPmxlbmd0aDsKIApAQCAtMTYyLDEwICsxNTUsMTAgQEAKIAkJcG1fcmVxdWVzdF9hdXRvc3VzcGVuZChkZXYtPmRldik7CiAJfQogCi1vdXQ6Ci0JaWYgKCFidWZmZXIpCi0JCW1laV9pcnFfZGlzY2FyZF9tc2coZGV2LCBtZWlfaGRyKTsKKwlyZXR1cm4gMDsKIAorZGlzY2FyZDoKKwltZWlfaXJxX2Rpc2NhcmRfbXNnKGRldiwgbWVpX2hkcik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxNiw2ICsyMDksOSBAQAogCWludCBzbG90czsKIAlpbnQgcmV0OwogCisJaWYgKCFsaXN0X2VtcHR5KCZjbC0+cmRfcGVuZGluZykpCisJCXJldHVybiAwOworCiAJbXNnX3Nsb3RzID0gbWVpX2RhdGEyc2xvdHMoc2l6ZW9mKHN0cnVjdCBoYm1fZmxvd19jb250cm9sKSk7CiAJc2xvdHMgPSBtZWlfaGJ1Zl9lbXB0eV9zbG90cyhkZXYpOwogCkBAIC00NjMsNiArNDU5LDE5IEBACiAJbWVpX3Jlc2V0KGRldik7CiB9CiAKKyNkZWZpbmUgTUVJX1NUQUxMX1RJTUVSX0ZSRVEgKDIgKiBIWikKKy8qKgorICogbWVpX3NjaGVkdWxlX3N0YWxsX3RpbWVyIC0gcmUtYXJtIHN0YWxsX3RpbWVyIHdvcmsKKyAqCisgKiBTY2hlZHVsZSBzdGFsbCB0aW1lcgorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3ZvaWQgbWVpX3NjaGVkdWxlX3N0YWxsX3RpbWVyKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkZXYtPnRpbWVyX3dvcmssIE1FSV9TVEFMTF9USU1FUl9GUkVRKTsKK30KKwogLyoqCiAgKiBtZWlfdGltZXIgLSB0aW1lciBmdW5jdGlvbi4KICAqCkBAIC00NzIsMTAgKzQ4MSw5IEBACiB2b2lkIG1laV90aW1lcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IG1laV9jbCAqY2w7Ci0KIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKHdvcmssCiAJCQkJCXN0cnVjdCBtZWlfZGV2aWNlLCB0aW1lcl93b3JrLndvcmspOwotCisJYm9vbCByZXNjaGVkdWxlX3RpbWVyID0gZmFsc2U7CiAKIAltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIApAQCAtNDkwLDYgKzQ5OCw3IEBACiAJCQkJbWVpX3Jlc2V0KGRldik7CiAJCQkJZ290byBvdXQ7CiAJCQl9CisJCQlyZXNjaGVkdWxlX3RpbWVyID0gdHJ1ZTsKIAkJfQogCX0KIApAQCAtNTA0LDYgKzUxMyw3IEBACiAJCQkJbWVpX2Nvbm5lY3RfdGltZW91dChjbCk7CiAJCQkJZ290byBvdXQ7CiAJCQl9CisJCQlyZXNjaGVkdWxlX3RpbWVyID0gdHJ1ZTsKIAkJfQogCX0KIApAQCAtNTE0LDE5ICs1MjQsMTYgQEAKIAkJaWYgKC0tZGV2LT5pYW10aGlmX3N0YWxsX3RpbWVyID09IDApIHsKIAkJCWRldl9lcnIoZGV2LT5kZXYsICJ0aW1lcjogYW10aGlmICBoYW5nZWQuXG4iKTsKIAkJCW1laV9yZXNldChkZXYpOwotCQkJZGV2LT5pYW10aGlmX2NhbmNlbGVkID0gZmFsc2U7Ci0JCQlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9JRExFOwogCi0JCQltZWlfaW9fY2JfZnJlZShkZXYtPmlhbXRoaWZfY3VycmVudF9jYik7Ci0JCQlkZXYtPmlhbXRoaWZfY3VycmVudF9jYiA9IE5VTEw7Ci0KLQkJCWRldi0+aWFtdGhpZl9mcCA9IE5VTEw7CiAJCQltZWlfYW10aGlmX3J1bl9uZXh0X2NtZChkZXYpOworCQkJZ290byBvdXQ7CiAJCX0KKwkJcmVzY2hlZHVsZV90aW1lciA9IHRydWU7CiAJfQogCiBvdXQ6Ci0JaWYgKGRldi0+ZGV2X3N0YXRlICE9IE1FSV9ERVZfRElTQUJMRUQpCi0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGV2LT50aW1lcl93b3JrLCAyICogSFopOworCWlmIChkZXYtPmRldl9zdGF0ZSAhPSBNRUlfREVWX0RJU0FCTEVEICYmIHJlc2NoZWR1bGVfdGltZXIpCisJCW1laV9zY2hlZHVsZV9zdGFsbF90aW1lcihkZXYpOworCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvbWFpbi5jIGIvZHJpdmVycy9taXNjL21laS9tYWluLmMKaW5kZXggNTI2MzViMC4uZmE1MDYzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9tYWluLmMKKysrIGIvZHJpdmVycy9taXNjL21laS9tYWluLmMKQEAgLTcxLDYgKzcxLDcgQEAKIAkJZ290byBlcnJfdW5sb2NrOwogCX0KIAorCWNsLT5mcCA9IGZpbGU7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2w7CiAKIAltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOwpAQCAtMTM4LDkgKzEzOSw4IEBACiAJc3RydWN0IG1laV9jbCAqY2wgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbWVpX2NsX2NiICpjYiA9IE5VTEw7CisJYm9vbCBub25ibG9jayA9ICEhKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKIAlpbnQgcmV0czsKLQlpbnQgZXJyOwotCiAKIAlpZiAoV0FSTl9PTighY2wgfHwgIWNsLT5kZXYpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE2NCwxMSArMTY0LDYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGNsID09ICZkZXYtPmlhbXRoaWZfY2wpIHsKLQkJcmV0cyA9IG1laV9hbXRoaWZfcmVhZChkZXYsIGZpbGUsIHVidWYsIGxlbmd0aCwgb2Zmc2V0KTsKLQkJZ290byBvdXQ7Ci0JfQotCiAJY2IgPSBtZWlfY2xfcmVhZF9jYihjbCwgZmlsZSk7CiAJaWYgKGNiKQogCQlnb3RvIGNvcHlfYnVmZmVyOwpAQCAtMTc2LDI0ICsxNzEsMjkgQEAKIAlpZiAoKm9mZnNldCA+IDApCiAJCSpvZmZzZXQgPSAwOwogCi0JZXJyID0gbWVpX2NsX3JlYWRfc3RhcnQoY2wsIGxlbmd0aCwgZmlsZSk7Ci0JaWYgKGVyciAmJiBlcnIgIT0gLUVCVVNZKSB7Ci0JCWNsX2RiZyhkZXYsIGNsLCAibWVpIHN0YXJ0IHJlYWQgZmFpbHVyZSBzdGF0dXMgPSAlZFxuIiwgZXJyKTsKLQkJcmV0cyA9IGVycjsKKwlyZXRzID0gbWVpX2NsX3JlYWRfc3RhcnQoY2wsIGxlbmd0aCwgZmlsZSk7CisJaWYgKHJldHMgJiYgcmV0cyAhPSAtRUJVU1kpIHsKKwkJY2xfZGJnKGRldiwgY2wsICJtZWkgc3RhcnQgcmVhZCBmYWlsdXJlIHN0YXR1cyA9ICVkXG4iLCByZXRzKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGxpc3RfZW1wdHkoJmNsLT5yZF9jb21wbGV0ZWQpICYmICF3YWl0cXVldWVfYWN0aXZlKCZjbC0+cnhfd2FpdCkpIHsKLQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCQlyZXRzID0gLUVBR0FJTjsKLQkJCWdvdG8gb3V0OwotCQl9CisJaWYgKG5vbmJsb2NrKSB7CisJCXJldHMgPSAtRUFHQUlOOworCQlnb3RvIG91dDsKKwl9CiAKKwlpZiAocmV0cyA9PSAtRUJVU1kgJiYKKwkgICAgIW1laV9jbF9lbnF1ZXVlX2N0cmxfd3JfY2IoY2wsIGxlbmd0aCwgTUVJX0ZPUF9SRUFELCBmaWxlKSkgeworCQlyZXRzID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZG8gewogCQltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogCiAJCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY2wtPnJ4X3dhaXQsCi0JCQkJKCFsaXN0X2VtcHR5KCZjbC0+cmRfY29tcGxldGVkKSkgfHwKLQkJCQkoIW1laV9jbF9pc19jb25uZWN0ZWQoY2wpKSkpIHsKKwkJCQkJICAgICAoIWxpc3RfZW1wdHkoJmNsLT5yZF9jb21wbGV0ZWQpKSB8fAorCQkJCQkgICAgICghbWVpX2NsX2lzX2Nvbm5lY3RlZChjbCkpKSkgewogCiAJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQkJcmV0dXJuIC1FSU5UUjsKQEAgLTIwMiwxNiArMjAyLDEyIEBACiAKIAkJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CiAJCWlmICghbWVpX2NsX2lzX2Nvbm5lY3RlZChjbCkpIHsKLQkJCXJldHMgPSAtRUJVU1k7CisJCQlyZXRzID0gLUVOT0RFVjsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JfQogCi0JY2IgPSBtZWlfY2xfcmVhZF9jYihjbCwgZmlsZSk7Ci0JaWYgKCFjYikgewotCQlyZXRzID0gMDsKLQkJZ290byBvdXQ7Ci0JfQorCQljYiA9IG1laV9jbF9yZWFkX2NiKGNsLCBmaWxlKTsKKwl9IHdoaWxlICghY2IpOwogCiBjb3B5X2J1ZmZlcjoKIAkvKiBub3cgY29weSB0aGUgZGF0YSB0byB1c2VyIHNwYWNlICovCkBAIC02MDksMjQgKzYwNSwyNCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoY2wgPT0gJmRldi0+aWFtdGhpZl9jbCkgewotCQltYXNrID0gbWVpX2FtdGhpZl9wb2xsKGRldiwgZmlsZSwgd2FpdCk7Ci0JCWdvdG8gb3V0OwotCX0KLQogCWlmIChub3RpZnlfZW4pIHsKIAkJcG9sbF93YWl0KGZpbGUsICZjbC0+ZXZfd2FpdCwgd2FpdCk7CiAJCWlmIChjbC0+bm90aWZ5X2V2KQogCQkJbWFzayB8PSBQT0xMUFJJOwogCX0KIAorCWlmIChjbCA9PSAmZGV2LT5pYW10aGlmX2NsKSB7CisJCW1hc2sgfD0gbWVpX2FtdGhpZl9wb2xsKGZpbGUsIHdhaXQpOworCQlnb3RvIG91dDsKKwl9CisKIAlpZiAocmVxX2V2ZW50cyAmIChQT0xMSU4gfCBQT0xMUkROT1JNKSkgewogCQlwb2xsX3dhaXQoZmlsZSwgJmNsLT5yeF93YWl0LCB3YWl0KTsKIAogCQlpZiAoIWxpc3RfZW1wdHkoJmNsLT5yZF9jb21wbGV0ZWQpKQogCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwogCQllbHNlCi0JCQltZWlfY2xfcmVhZF9zdGFydChjbCwgMCwgZmlsZSk7CisJCQltZWlfY2xfcmVhZF9zdGFydChjbCwgbWVpX2NsX210dShjbCksIGZpbGUpOwogCX0KIAogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9tZWlfZGV2LmggYi9kcml2ZXJzL21pc2MvbWVpL21laV9kZXYuaAppbmRleCBlNWUzMjUwLi4xMTY5ZmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL21laV9kZXYuaAorKysgYi9kcml2ZXJzL21pc2MvbWVpL21laV9kZXYuaApAQCAtODAsMTggKzgwLDEzIEBACiBlbnVtIGlhbXRoaWZfc3RhdGVzIHsKIAlNRUlfSUFNVEhJRl9JRExFLAogCU1FSV9JQU1USElGX1dSSVRJTkcsCi0JTUVJX0lBTVRISUZfRkxPV19DT05UUk9MLAogCU1FSV9JQU1USElGX1JFQURJTkcsCi0JTUVJX0lBTVRISUZfUkVBRF9DT01QTEVURQogfTsKIAogZW51bSBtZWlfZmlsZV90cmFuc2FjdGlvbl9zdGF0ZXMgewogCU1FSV9JRExFLAogCU1FSV9XUklUSU5HLAogCU1FSV9XUklURV9DT01QTEVURSwKLQlNRUlfRkxPV19DT05UUk9MLAotCU1FSV9SRUFESU5HLAotCU1FSV9SRUFEX0NPTVBMRVRFCiB9OwogCiAvKioKQEAgLTE0Niw3ICsxNDEsNyBAQAogICogQHJlZmNudDogc3RydWN0IHJlZmVyZW5jZSBjb3VudAogICogQHByb3BzOiBjbGllbnQgcHJvcGVydGllcwogICogQGNsaWVudF9pZDogbWUgY2xpZW50IGlkCi0gKiBAbWVpX2Zsb3dfY3RybF9jcmVkczogZmxvdyBjb250cm9sIGNyZWRpdHMKKyAqIEB0eF9mbG93X2N0cmxfY3JlZHM6IGZsb3cgY29udHJvbCBjcmVkaXRzCiAgKiBAY29ubmVjdF9jb3VudDogbnVtYmVyIGNvbm5lY3Rpb25zIHRvIHRoaXMgY2xpZW50CiAgKiBAYnVzX2FkZGVkOiBhZGRlZCB0byBidXMKICAqLwpAQCAtMTU1LDcgKzE1MCw3IEBACiAJc3RydWN0IGtyZWYgcmVmY250OwogCXN0cnVjdCBtZWlfY2xpZW50X3Byb3BlcnRpZXMgcHJvcHM7CiAJdTggY2xpZW50X2lkOwotCXU4IG1laV9mbG93X2N0cmxfY3JlZHM7CisJdTggdHhfZmxvd19jdHJsX2NyZWRzOwogCXU4IGNvbm5lY3RfY291bnQ7CiAJdTggYnVzX2FkZGVkOwogfTsKQEAgLTIwMiwxMCArMTk3LDExIEBACiAgKiBAZXZfYXN5bmM6IGV2ZW50IGFzeW5jIG5vdGlmaWNhdGlvbgogICogQHN0YXR1czogY29ubmVjdGlvbiBzdGF0dXMKICAqIEBtZV9jbDogZncgY2xpZW50IGNvbm5lY3RlZAorICogQGZwOiBmaWxlIGFzc29jaWF0ZWQgd2l0aCBjbGllbnQKICAqIEBob3N0X2NsaWVudF9pZDogaG9zdCBpZAotICogQG1laV9mbG93X2N0cmxfY3JlZHM6IHRyYW5zbWl0IGZsb3cgY3JlZGVudGlhbHMKKyAqIEB0eF9mbG93X2N0cmxfY3JlZHM6IHRyYW5zbWl0IGZsb3cgY3JlZGVudGlhbHMKKyAqIEByeF9mbG93X2N0cmxfY3JlZHM6IHJlY2VpdmUgZmxvdyBjcmVkZW50aWFscwogICogQHRpbWVyX2NvdW50OiAgd2F0Y2hkb2cgdGltZXIgZm9yIG9wZXJhdGlvbiBjb21wbGV0aW9uCi0gKiBAcmVzZXJ2ZWQ6IHJlc2VydmVkIGZvciBhbGlnbm1lbnQKICAqIEBub3RpZnlfZW46IG5vdGlmaWNhdGlvbiAtIGVuYWJsZWQvZGlzYWJsZWQKICAqIEBub3RpZnlfZXY6IHBlbmRpbmcgbm90aWZpY2F0aW9uIGV2ZW50CiAgKiBAd3JpdGluZ19zdGF0ZTogc3RhdGUgb2YgdGhlIHR4CkBAIC0yMjUsMTAgKzIyMSwxMSBAQAogCXN0cnVjdCBmYXN5bmNfc3RydWN0ICpldl9hc3luYzsKIAlpbnQgc3RhdHVzOwogCXN0cnVjdCBtZWlfbWVfY2xpZW50ICptZV9jbDsKKwljb25zdCBzdHJ1Y3QgZmlsZSAqZnA7CiAJdTggaG9zdF9jbGllbnRfaWQ7Ci0JdTggbWVpX2Zsb3dfY3RybF9jcmVkczsKKwl1OCB0eF9mbG93X2N0cmxfY3JlZHM7CisJdTggcnhfZmxvd19jdHJsX2NyZWRzOwogCXU4IHRpbWVyX2NvdW50OwotCXU4IHJlc2VydmVkOwogCXU4IG5vdGlmeV9lbjsKIAl1OCBub3RpZnlfZXY7CiAJZW51bSBtZWlfZmlsZV90cmFuc2FjdGlvbl9zdGF0ZXMgd3JpdGluZ19zdGF0ZTsKQEAgLTQwMCw5ICszOTcsNyBAQAogICogQG92ZXJyaWRlX2ZpeGVkX2FkZHJlc3M6IGZvcmNlIGFsbG93IGZpeGVkIGFkZHJlc3MgYmVoYXZpb3IKICAqCiAgKiBAYW10aGlmX2NtZF9saXN0IDogYW10aGlmIGxpc3QgZm9yIGNtZCB3YWl0aW5nCi0gKiBAaWFtdGhpZl9mcCA6IGZpbGUgZm9yIGN1cnJlbnQgYW10aGlmIG9wZXJhdGlvbgogICogQGlhbXRoaWZfY2wgIDogYW10aGlmIGhvc3QgY2xpZW50Ci0gKiBAaWFtdGhpZl9jdXJyZW50X2NiIDogYW10aGlmIGN1cnJlbnQgb3BlcmF0aW9uIGNhbGxiYWNrCiAgKiBAaWFtdGhpZl9vcGVuX2NvdW50IDogbnVtYmVyIG9mIG9wZW5lZCBhbXRoaWYgY29ubmVjdGlvbnMKICAqIEBpYW10aGlmX3N0YWxsX3RpbWVyIDogdGltZXIgdG8gZGV0ZWN0IGFtdGhpZiBoYW5nCiAgKiBAaWFtdGhpZl9zdGF0ZSA6IGFtdGhpZiBwcm9jZXNzb3Igc3RhdGUKQEAgLTQ4NCwxMCArNDc5LDcgQEAKIAogCS8qIGFtdGhpZiBsaXN0IGZvciBjbWQgd2FpdGluZyAqLwogCXN0cnVjdCBtZWlfY2xfY2IgYW10aGlmX2NtZF9saXN0OwotCS8qIGRyaXZlciBtYW5hZ2VkIGFtdGhpZiBsaXN0IGZvciByZWFkaW5nIGNvbXBsZXRlZCBhbXRoaWYgY21kIGRhdGEgKi8KLQljb25zdCBzdHJ1Y3QgZmlsZSAqaWFtdGhpZl9mcDsKIAlzdHJ1Y3QgbWVpX2NsIGlhbXRoaWZfY2w7Ci0Jc3RydWN0IG1laV9jbF9jYiAqaWFtdGhpZl9jdXJyZW50X2NiOwogCWxvbmcgaWFtdGhpZl9vcGVuX2NvdW50OwogCXUzMiBpYW10aGlmX3N0YWxsX3RpbWVyOwogCWVudW0gaWFtdGhpZl9zdGF0ZXMgaWFtdGhpZl9zdGF0ZTsKQEAgLTU1Niw2ICs1NDgsNyBAQAogICovCiAKIHZvaWQgbWVpX3RpbWVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cit2b2lkIG1laV9zY2hlZHVsZV9zdGFsbF90aW1lcihzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKIGludCBtZWlfaXJxX3JlYWRfaGFuZGxlcihzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAogCQlzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QsIHMzMiAqc2xvdHMpOwogCkBAIC01NjksMTEgKzU2Miw3IEBACiAKIGludCBtZWlfYW10aGlmX2hvc3RfaW5pdChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgbWVpX21lX2NsaWVudCAqbWVfY2wpOwogCi1pbnQgbWVpX2FtdGhpZl9yZWFkKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHN0cnVjdCBmaWxlICpmaWxlLAotCQljaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGxlbmd0aCwgbG9mZl90ICpvZmZzZXQpOwotCi11bnNpZ25lZCBpbnQgbWVpX2FtdGhpZl9wb2xsKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KTsKK3Vuc2lnbmVkIGludCBtZWlfYW10aGlmX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpOwogCiBpbnQgbWVpX2FtdGhpZl9yZWxlYXNlKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHN0cnVjdCBmaWxlICpmaWxlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9wY2ktbWUuYyBiL2RyaXZlcnMvbWlzYy9tZWkvcGNpLW1lLmMKaW5kZXggNjRlNjRkYS4uZjNmZmQ4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9wY2ktbWUuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL3BjaS1tZS5jCkBAIC04NSwxMiArODUsMTUgQEAKIAogCXtNRUlfUENJX0RFVklDRShNRUlfREVWX0lEX1NQVCwgbWVpX21lX3BjaDhfY2ZnKX0sCiAJe01FSV9QQ0lfREVWSUNFKE1FSV9ERVZfSURfU1BUXzIsIG1laV9tZV9wY2g4X2NmZyl9LAotCXtNRUlfUENJX0RFVklDRShNRUlfREVWX0lEX1NQVF9ILCBtZWlfbWVfcGNoOF9jZmcpfSwKLQl7TUVJX1BDSV9ERVZJQ0UoTUVJX0RFVl9JRF9TUFRfSF8yLCBtZWlfbWVfcGNoOF9jZmcpfSwKKwl7TUVJX1BDSV9ERVZJQ0UoTUVJX0RFVl9JRF9TUFRfSCwgbWVpX21lX3BjaDhfc3BzX2NmZyl9LAorCXtNRUlfUENJX0RFVklDRShNRUlfREVWX0lEX1NQVF9IXzIsIG1laV9tZV9wY2g4X3Nwc19jZmcpfSwKIAogCXtNRUlfUENJX0RFVklDRShNRUlfREVWX0lEX0JYVF9NLCBtZWlfbWVfcGNoOF9jZmcpfSwKIAl7TUVJX1BDSV9ERVZJQ0UoTUVJX0RFVl9JRF9BUExfSSwgbWVpX21lX3BjaDhfY2ZnKX0sCiAKKwl7TUVJX1BDSV9ERVZJQ0UoTUVJX0RFVl9JRF9LQlAsIG1laV9tZV9wY2g4X2NmZyl9LAorCXtNRUlfUENJX0RFVklDRShNRUlfREVWX0lEX0tCUF8yLCBtZWlfbWVfcGNoOF9jZmcpfSwKKwogCS8qIHJlcXVpcmVkIGxhc3QgZW50cnkgKi8KIAl7MCwgfQogfTsKQEAgLTIxNyw4ICsyMjAsNiBAQAogCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldi0+dGltZXJfd29yaywgSFopOwotCiAJLyoKIAkqIEZvciBub3Qgd2FrZS1hYmxlIEhXIHJ1bnRpbWUgcG0gZnJhbWV3b3JrCiAJKiBjYW4ndCBiZSB1c2VkIG9uIHBjaSBkZXZpY2UgbGV2ZWwuCkBAIC00MDAsNiArNDAxLDkgQEAKIAogCWRldl9kYmcoJnBkZXYtPmRldiwgInJwbTogbWU6IHJ1bnRpbWUgc3VzcGVuZCByZXQ9JWRcbiIsIHJldCk7CiAKKwlpZiAocmV0ICYmIHJldCAhPSAtRUFHQUlOKQorCQlzY2hlZHVsZV93b3JrKCZkZXYtPnJlc2V0X3dvcmspOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDIzLDYgKzQyNyw5IEBACiAKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJycG06IG1lOiBydW50aW1lIHJlc3VtZSByZXQgPSAlZFxuIiwgcmV0KTsKIAorCWlmIChyZXQpCisJCXNjaGVkdWxlX3dvcmsoJmRldi0+cmVzZXRfd29yayk7CisKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL3BjaS10eGUuYyBiL2RyaXZlcnMvbWlzYy9tZWkvcGNpLXR4ZS5jCmluZGV4IDMwY2MzMDYuLjU4ZmZkMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvcGNpLXR4ZS5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvcGNpLXR4ZS5jCkBAIC0zNDcsNiArMzQ3LDEwIEBACiAJZGV2X2RiZygmcGRldi0+ZGV2LCAicnBtOiB0eGU6IHJ1bnRpbWUgc3VzcGVuZCByZXQ9JWRcbiIsIHJldCk7CiAKIAltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCisJaWYgKHJldCAmJiByZXQgIT0gLUVBR0FJTikKKwkJc2NoZWR1bGVfd29yaygmZGV2LT5yZXNldF93b3JrKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM3Miw2ICszNzYsOSBAQAogCiAJZGV2X2RiZygmcGRldi0+ZGV2LCAicnBtOiB0eGU6IHJ1bnRpbWUgcmVzdW1lIHJldCA9ICVkXG4iLCByZXQpOwogCisJaWYgKHJldCkKKwkJc2NoZWR1bGVfd29yaygmZGV2LT5yZXNldF93b3JrKTsKKwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9taWMvc2NpZi9zY2lmX2RtYS5jIGIvZHJpdmVycy9taXNjL21pYy9zY2lmL3NjaWZfZG1hLmMKaW5kZXggY2QwMWEwZS4uNjRkNTc2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21pYy9zY2lmL3NjaWZfZG1hLmMKKysrIGIvZHJpdmVycy9taXNjL21pYy9zY2lmL3NjaWZfZG1hLmMKQEAgLTExNSw3ICsxMTUsNiBAQAogICovCiBzdGF0aWMKIHZvaWQgX19zY2lmX3JtYV9kZXN0cm95X3RjdyhzdHJ1Y3Qgc2NpZl9tbXVfbm90aWYgKm1tbiwKLQkJCSAgICBzdHJ1Y3Qgc2NpZl9lbmRwdCAqZXAsCiAJCQkgICAgdTY0IHN0YXJ0LCB1NjQgbGVuKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW0sICp0bXA7CkBAIC0xMjgsNyArMTI3LDYgQEAKIAogCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVtLCB0bXAsICZtbW4tPnRjX3JlZ19saXN0KSB7CiAJCXdpbmRvdyA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IHNjaWZfd2luZG93LCBsaXN0KTsKLQkJZXAgPSAoc3RydWN0IHNjaWZfZW5kcHQgKil3aW5kb3ctPmVwOwogCQlpZiAoIWxlbikKIAkJCWJyZWFrOwogCQlzdGFydF92YSA9IHdpbmRvdy0+dmFfZm9yX3RlbXA7CkBAIC0xNDYsNyArMTQ0LDcgQEAKIAlzdHJ1Y3Qgc2NpZl9lbmRwdCAqZXAgPSBtbW4tPmVwOwogCiAJc3Bpbl9sb2NrKCZlcC0+cm1hX2luZm8udGNfbG9jayk7Ci0JX19zY2lmX3JtYV9kZXN0cm95X3RjdyhtbW4sIGVwLCBzdGFydCwgbGVuKTsKKwlfX3NjaWZfcm1hX2Rlc3Ryb3lfdGN3KG1tbiwgc3RhcnQsIGxlbik7CiAJc3Bpbl91bmxvY2soJmVwLT5ybWFfaW5mby50Y19sb2NrKTsKIH0KIApAQCAtMTY5LDcgKzE2Nyw3IEBACiAJc3Bpbl9sb2NrKCZlcC0+cm1hX2luZm8udGNfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZW0sIHRtcCwgJmVwLT5ybWFfaW5mby5tbW5fbGlzdCkgewogCQltbW4gPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBzY2lmX21tdV9ub3RpZiwgbGlzdCk7Ci0JCV9fc2NpZl9ybWFfZGVzdHJveV90Y3cobW1uLCBlcCwgMCwgVUxPTkdfTUFYKTsKKwkJX19zY2lmX3JtYV9kZXN0cm95X3RjdyhtbW4sIDAsIFVMT05HX01BWCk7CiAJfQogCXNwaW5fdW5sb2NrKCZlcC0+cm1hX2luZm8udGNfbG9jayk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWljL3NjaWYvc2NpZl9tbWFwLmMgYi9kcml2ZXJzL21pc2MvbWljL3NjaWYvc2NpZl9tbWFwLmMKaW5kZXggNDljYjhmNy4uOTI4MjExNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21pYy9zY2lmL3NjaWZfbW1hcC5jCisrKyBiL2RyaXZlcnMvbWlzYy9taWMvc2NpZi9zY2lmX21tYXAuYwpAQCAtNTUyLDcgKzU1Miw3IEBACiB7CiAJc3RydWN0IHNjaWZfZW5kcHQgKmVwOwogCXN0cnVjdCB2bWFfcHZ0ICp2bWFwdnQgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLQlpbnQgbnJfcGFnZXMgPSAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUOworCWludCBucl9wYWdlcyA9IHZtYV9wYWdlcyh2bWEpOwogCXM2NCBvZmZzZXQ7CiAJc3RydWN0IHNjaWZfcm1hX3JlcSByZXE7CiAJc3RydWN0IHNjaWZfd2luZG93ICp3aW5kb3cgPSBOVUxMOwpAQCAtNjE0LDcgKzYxNCw3IEBACiAJc3RydWN0IHNjaWZfd2luZG93ICp3aW5kb3cgPSBOVUxMOwogCXN0cnVjdCBzY2lmX2VuZHB0ICplcCA9IChzdHJ1Y3Qgc2NpZl9lbmRwdCAqKWVwZDsKIAlzNjQgc3RhcnRfb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOwotCWludCBucl9wYWdlcyA9ICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQ7CisJaW50IG5yX3BhZ2VzID0gdm1hX3BhZ2VzKHZtYSk7CiAJaW50IGVycjsKIAlzdHJ1Y3Qgdm1hX3B2dCAqdm1hcHZ0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcGNoX3BodWIuYyBiL2RyaXZlcnMvbWlzYy9wY2hfcGh1Yi5jCmluZGV4IDQ4MTBlMDMuLmU0MmJkYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9wY2hfcGh1Yi5jCisrKyBiL2RyaXZlcnMvbWlzYy9wY2hfcGh1Yi5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKICNkZWZpbmUgUEhVQl9TVEFUVVMgMHgwMAkJLyogU3RhdHVzIFJlZ2lzdGVyIG9mZnNldCAqLwogI2RlZmluZSBQSFVCX0NPTlRST0wgMHgwNAkJLyogQ29udHJvbCBSZWdpc3RlciBvZmZzZXQgKi8KQEAgLTU3LDYgKzU4LDcgQEAKIAogLyogQ00taVRDICovCiAjZGVmaW5lIENMS0NGR19VQVJUXzQ4TUhaCQkJKDEgPDwgMTYpCisjZGVmaW5lIENMS0NGR19VQVJUXzI1TUhaCQkJKDIgPDwgMTYpCiAjZGVmaW5lIENMS0NGR19CQVVERElWCQkJCSgyIDw8IDIwKQogI2RlZmluZSBDTEtDRkdfUExMMlZDTwkJCQkoOCA8PCA5KQogI2RlZmluZSBDTEtDRkdfVUFSVENMS1NFTAkJCSgxIDw8IDE4KQpAQCAtNzExLDYgKzcxMywxMiBAQAogCiAJaWYgKGlkLT5kcml2ZXJfZGF0YSA9PSAxKSB7IC8qIEVHMjBUIFBDSCAqLwogCQljb25zdCBjaGFyICpib2FyZF9uYW1lOworCQl1bnNpZ25lZCBpbnQgcHJlZmV0Y2ggPSAweDAwMGFmZmFhOworCisJCWlmIChwZGV2LT5kZXYub2Zfbm9kZSkKKwkJCW9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkJICAiaW50ZWwsZWcyMHQtcHJlZmV0Y2giLAorCQkJCQkJICAmcHJlZmV0Y2gpOwogCiAJCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYua29iaiwKIAkJCQkJJmRldl9hdHRyX3BjaF9tYWMuYXR0cik7CkBAIC03MzYsMTEgKzc0NCwyMSBAQAogCQkJCQkJQ0xLQ0ZHX1VBUlRfTUFTSyk7CiAKIAkJLyogc2V0IHRoZSBwcmVmZWNoIHZhbHVlICovCi0JCWlvd3JpdGUzMigweDAwMGFmZmFhLCBjaGlwLT5wY2hfcGh1Yl9iYXNlX2FkZHJlc3MgKyAweDE0KTsKKwkJaW93cml0ZTMyKHByZWZldGNoLCBjaGlwLT5wY2hfcGh1Yl9iYXNlX2FkZHJlc3MgKyAweDE0KTsKIAkJLyogc2V0IHRoZSBpbnRlcnJ1cHQgZGVsYXkgdmFsdWUgKi8KIAkJaW93cml0ZTMyKDB4MjUsIGNoaXAtPnBjaF9waHViX2Jhc2VfYWRkcmVzcyArIDB4NDQpOwogCQljaGlwLT5wY2hfb3B0X3JvbV9zdGFydF9hZGRyZXNzID0gUENIX1BIVUJfUk9NX1NUQVJUX0FERFJfRUcyMFQ7CiAJCWNoaXAtPnBjaF9tYWNfc3RhcnRfYWRkcmVzcyA9IFBDSF9QSFVCX01BQ19TVEFSVF9BRERSX0VHMjBUOworCisJCS8qIHF1aXJrIGZvciBNSVBTIEJvc3RvbiBwbGF0Zm9ybSAqLworCQlpZiAocGRldi0+ZGV2Lm9mX25vZGUpIHsKKwkJCWlmIChvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoImltZyxib3N0b24iKSkgeworCQkJCXBjaF9waHViX3JlYWRfbW9kaWZ5X3dyaXRlX3JlZyhjaGlwLAorCQkJCQkodW5zaWduZWQgaW50KUNMS0NGR19SRUdfT0ZGU0VULAorCQkJCQlDTEtDRkdfVUFSVF8yNU1IWiwKKwkJCQkJQ0xLQ0ZHX1VBUlRfTUFTSyk7CisJCQl9CisJCX0KIAl9IGVsc2UgaWYgKGlkLT5kcml2ZXJfZGF0YSA9PSAyKSB7IC8qIE1MNzIxMyBJT0ggKi8KIAkJcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJnBjaF9iaW5fYXR0cik7CiAJCWlmIChyZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvdm13X3ZtY2kvdm1jaV9ob3N0LmMgYi9kcml2ZXJzL21pc2Mvdm13X3ZtY2kvdm1jaV9ob3N0LmMKaW5kZXggOWVjMjYyYS4uZWMwOTAxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3Ztd192bWNpL3ZtY2lfaG9zdC5jCisrKyBiL2RyaXZlcnMvbWlzYy92bXdfdm1jaS92bWNpX2hvc3QuYwpAQCAtMzgxLDE4ICszODEsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZGcgPSBrbWFsbG9jKHNlbmRfaW5mby5sZW4sIEdGUF9LRVJORUwpOwotCWlmICghZGcpIHsKKwlkZyA9IG1lbWR1cF91c2VyKCh2b2lkIF9fdXNlciAqKSh1aW50cHRyX3Qpc2VuZF9pbmZvLmFkZHIsCisJCQkgc2VuZF9pbmZvLmxlbik7CisJaWYgKElTX0VSUihkZykpIHsKIAkJdm1jaV9pb2N0bF9lcnIoCiAJCQkiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSB0byBkaXNwYXRjaCBkYXRhZ3JhbVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcihkZywgKHZvaWQgX191c2VyICopKHVpbnRwdHJfdClzZW5kX2luZm8uYWRkciwKLQkJCSAgIHNlbmRfaW5mby5sZW4pKSB7Ci0JCXZtY2lfaW9jdGxfZXJyKCJlcnJvciBnZXR0aW5nIGRhdGFncmFtXG4iKTsKLQkJa2ZyZWUoZGcpOwotCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIFBUUl9FUlIoZGcpOwogCX0KIAogCWlmIChWTUNJX0RHX1NJWkUoZGcpICE9IHNlbmRfaW5mby5sZW4pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYyBiL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYwppbmRleCA0OGE1ZGQ3Li5jMzMzNTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jCkBAIC0xNDIsOCArMTQyLDYgQEAKIHsKIAlzdHJ1Y3QgbW1jX3BhY2tlZCAqcGFja2VkID0gbXFycS0+cGFja2VkOwogCi0JQlVHX09OKCFwYWNrZWQpOwotCiAJbXFycS0+Y21kX3R5cGUgPSBNTUNfUEFDS0VEX05PTkU7CiAJcGFja2VkLT5ucl9lbnRyaWVzID0gTU1DX1BBQ0tFRF9OUl9aRVJPOwogCXBhY2tlZC0+aWR4X2ZhaWx1cmUgPSBNTUNfUEFDS0VEX05SX0lEWDsKQEAgLTE0NDMsOCArMTQ0MSw2IEBACiAJaW50IGVyciwgY2hlY2ssIHN0YXR1czsKIAl1OCAqZXh0X2NzZDsKIAotCUJVR19PTighcGFja2VkKTsKLQogCXBhY2tlZC0+cmV0cmllcy0tOwogCWNoZWNrID0gbW1jX2Jsa19lcnJfY2hlY2soY2FyZCwgYXJlcSk7CiAJZXJyID0gZ2V0X2NhcmRfc3RhdHVzKGNhcmQsICZzdGF0dXMsIDApOwpAQCAtMTY3Myw2ICsxNjY5LDE4IEBACiAJdTggbWF4X3BhY2tlZF9ydyA9IDA7CiAJdTggcmVxcyA9IDA7CiAKKwkvKgorCSAqIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgcGFja2VkIGZvciBhbnkgZnVydGhlcgorCSAqIG9wZXJhdGlvbiBvZiBwYWNrZWQgc3R1ZmYgYXMgd2Ugc2V0IE1NQ19QQUNLRURfTk9ORQorCSAqIGFuZCByZXR1cm4gemVybyBmb3IgcmVxcyBpZiBnZXRpbmcgbnVsbCBwYWNrZWQuIEFsc28KKwkgKiB3ZSBjbGVhbiB0aGUgZmxhZyBvZiBNTUNfQkxLX1BBQ0tFRF9DTUQgdG8gYXZvaWQgZG9pbmcKKwkgKiBpdCBhZ2FpbiB3aGVuIHJlbW92aW5nIGJsayByZXEuCisJICovCisJaWYgKCFtcXJxLT5wYWNrZWQpIHsKKwkJbWQtPmZsYWdzICY9ICh+TU1DX0JMS19QQUNLRURfQ01EKTsKKwkJZ290byBub19wYWNrZWQ7CisJfQorCiAJaWYgKCEobWQtPmZsYWdzICYgTU1DX0JMS19QQUNLRURfQ01EKSkKIAkJZ290byBub19wYWNrZWQ7CiAKQEAgLTE3MjYsNiArMTczNCw3IEBACiAJCQlicmVhazsKIAogCQlpZiAocmVxX29wKG5leHQpID09IFJFUV9PUF9ESVNDQVJEIHx8CisJCSAgICByZXFfb3AobmV4dCkgPT0gUkVRX09QX1NFQ1VSRV9FUkFTRSB8fAogCQkgICAgcmVxX29wKG5leHQpID09IFJFUV9PUF9GTFVTSCkKIAkJCWJyZWFrOwogCkBAIC0xNzgxLDggKzE3OTAsNiBAQAogCXU4IGhkcl9ibG9ja3M7CiAJdTggaSA9IDE7CiAKLQlCVUdfT04oIXBhY2tlZCk7Ci0KIAltcXJxLT5jbWRfdHlwZSA9IE1NQ19QQUNLRURfV1JJVEU7CiAJcGFja2VkLT5ibG9ja3MgPSAwOwogCXBhY2tlZC0+aWR4X2ZhaWx1cmUgPSBNTUNfUEFDS0VEX05SX0lEWDsKQEAgLTE4ODYsOCArMTg5Myw2IEBACiAJaW50IGlkeCA9IHBhY2tlZC0+aWR4X2ZhaWx1cmUsIGkgPSAwOwogCWludCByZXQgPSAwOwogCi0JQlVHX09OKCFwYWNrZWQpOwotCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZwYWNrZWQtPmxpc3QpKSB7CiAJCXBycSA9IGxpc3RfZW50cnlfcnEocGFja2VkLT5saXN0Lm5leHQpOwogCQlpZiAoaWR4ID09IGkpIHsKQEAgLTE5MTYsOCArMTkyMSw2IEBACiAJc3RydWN0IHJlcXVlc3QgKnBycTsKIAlzdHJ1Y3QgbW1jX3BhY2tlZCAqcGFja2VkID0gbXFfcnEtPnBhY2tlZDsKIAotCUJVR19PTighcGFja2VkKTsKLQogCXdoaWxlICghbGlzdF9lbXB0eSgmcGFja2VkLT5saXN0KSkgewogCQlwcnEgPSBsaXN0X2VudHJ5X3JxKHBhY2tlZC0+bGlzdC5uZXh0KTsKIAkJbGlzdF9kZWxfaW5pdCgmcHJxLT5xdWV1ZWxpc3QpOwpAQCAtMTkzNCw4ICsxOTM3LDYgQEAKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IG1xLT5xdWV1ZTsKIAlzdHJ1Y3QgbW1jX3BhY2tlZCAqcGFja2VkID0gbXFfcnEtPnBhY2tlZDsKIAotCUJVR19PTighcGFja2VkKTsKLQogCXdoaWxlICghbGlzdF9lbXB0eSgmcGFja2VkLT5saXN0KSkgewogCQlwcnEgPSBsaXN0X2VudHJ5X3JxKHBhY2tlZC0+bGlzdC5wcmV2KTsKIAkJaWYgKHBycS0+cXVldWVsaXN0LnByZXYgIT0gJnBhY2tlZC0+bGlzdCkgewpAQCAtMjE0MywxMyArMjE0NCwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1tY19ibGtfaXNzdWVfcnEoc3RydWN0IG1tY19xdWV1ZSAqbXEsIHN0cnVjdCByZXF1ZXN0ICpyZXEpCitpbnQgbW1jX2Jsa19pc3N1ZV9ycShzdHJ1Y3QgbW1jX3F1ZXVlICptcSwgc3RydWN0IHJlcXVlc3QgKnJlcSkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBtbWNfYmxrX2RhdGEgKm1kID0gbXEtPmRhdGE7CiAJc3RydWN0IG1tY19jYXJkICpjYXJkID0gbWQtPnF1ZXVlLmNhcmQ7CiAJc3RydWN0IG1tY19ob3N0ICpob3N0ID0gY2FyZC0+aG9zdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgcmVxX2lzX3NwZWNpYWwgPSBtbWNfcmVxX2lzX3NwZWNpYWwocmVxKTsKIAogCWlmIChyZXEgJiYgIW1xLT5tcXJxX3ByZXYtPnJlcSkKIAkJLyogY2xhaW0gaG9zdCBvbmx5IGZvciB0aGUgZmlyc3QgcmVxdWVzdCAqLwpAQCAtMjE5MCw4ICsyMTkyLDcgQEAKIAl9CiAKIG91dDoKLQlpZiAoKCFyZXEgJiYgIShtcS0+ZmxhZ3MgJiBNTUNfUVVFVUVfTkVXX1JFUVVFU1QpKSB8fAotCSAgICBtbWNfcmVxX2lzX3NwZWNpYWwocmVxKSkKKwlpZiAoKCFyZXEgJiYgIShtcS0+ZmxhZ3MgJiBNTUNfUVVFVUVfTkVXX1JFUVVFU1QpKSB8fCByZXFfaXNfc3BlY2lhbCkKIAkJLyoKIAkJICogUmVsZWFzZSBob3N0IHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgcmVxdWVzdHMKIAkJICogYW5kIGFmdGVyIHNwZWNpYWwgcmVxdWVzdChkaXNjYXJkLCBmbHVzaCkgaXMgZG9uZS4KQEAgLTIyNjQsNyArMjI2NSw2IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfcHV0ZGlzazsKIAotCW1kLT5xdWV1ZS5pc3N1ZV9mbiA9IG1tY19ibGtfaXNzdWVfcnE7CiAJbWQtPnF1ZXVlLmRhdGEgPSBtZDsKIAogCW1kLT5kaXNrLT5tYWpvcgk9IE1NQ19CTE9DS19NQUpPUjsKQEAgLTIzMDIsNyArMjMwMiw4IEBACiAJc2V0X2NhcGFjaXR5KG1kLT5kaXNrLCBzaXplKTsKIAogCWlmIChtbWNfaG9zdF9jbWQyMyhjYXJkLT5ob3N0KSkgewotCQlpZiAobW1jX2NhcmRfbW1jKGNhcmQpIHx8CisJCWlmICgobW1jX2NhcmRfbW1jKGNhcmQpICYmCisJCSAgICAgY2FyZC0+Y3NkLm1tY2FfdnNuID49IENTRF9TUEVDX1ZFUl8zKSB8fAogCQkgICAgKG1tY19jYXJkX3NkKGNhcmQpICYmCiAJCSAgICAgY2FyZC0+c2NyLmNtZHMgJiBTRF9TQ1JfQ01EMjNfU1VQUE9SVCkpCiAJCQltZC0+ZmxhZ3MgfD0gTU1DX0JMS19DTUQyMzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suaCBiL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGFiYjJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5oCkBAIC0wLDAgKzEgQEAKK2ludCBtbWNfYmxrX2lzc3VlX3JxKHN0cnVjdCBtbWNfcXVldWUgKm1xLCBzdHJ1Y3QgcmVxdWVzdCAqcmVxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvbW1jX3Rlc3QuYyBiL2RyaXZlcnMvbW1jL2NhcmQvbW1jX3Rlc3QuYwppbmRleCBjMDMyZWVmLi41YThkYzVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL21tY190ZXN0LmMKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9tbWNfdGVzdC5jCkBAIC0xODQsNiArMTg0LDI5IEBACiAJcmV0dXJuIG1tY19zZXRfYmxvY2tsZW4odGVzdC0+Y2FyZCwgc2l6ZSk7CiB9CiAKK3N0YXRpYyBib29sIG1tY190ZXN0X2NhcmRfY21kMjMoc3RydWN0IG1tY19jYXJkICpjYXJkKQoreworCXJldHVybiBtbWNfY2FyZF9tbWMoY2FyZCkgfHwKKwkgICAgICAgKG1tY19jYXJkX3NkKGNhcmQpICYmIGNhcmQtPnNjci5jbWRzICYgU0RfU0NSX0NNRDIzX1NVUFBPUlQpOworfQorCitzdGF0aWMgdm9pZCBtbWNfdGVzdF9wcmVwYXJlX3NiYyhzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVzdCwKKwkJCQkgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEsIHVuc2lnbmVkIGludCBibG9ja3MpCit7CisJc3RydWN0IG1tY19jYXJkICpjYXJkID0gdGVzdC0+Y2FyZDsKKworCWlmICghbXJxLT5zYmMgfHwgIW1tY19ob3N0X2NtZDIzKGNhcmQtPmhvc3QpIHx8CisJICAgICFtbWNfdGVzdF9jYXJkX2NtZDIzKGNhcmQpIHx8ICFtbWNfb3BfbXVsdGkobXJxLT5jbWQtPm9wY29kZSkgfHwKKwkgICAgKGNhcmQtPnF1aXJrcyAmIE1NQ19RVUlSS19CTEtfTk9fQ01EMjMpKSB7CisJCW1ycS0+c2JjID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKworCW1ycS0+c2JjLT5vcGNvZGUgPSBNTUNfU0VUX0JMT0NLX0NPVU5UOworCW1ycS0+c2JjLT5hcmcgPSBibG9ja3M7CisJbXJxLT5zYmMtPmZsYWdzID0gTU1DX1JTUF9SMSB8IE1NQ19DTURfQUM7Cit9CisKIC8qCiAgKiBGaWxsIGluIHRoZSBtbWNfcmVxdWVzdCBzdHJ1Y3R1cmUgZ2l2ZW4gYSBzZXQgb2YgdHJhbnNmZXIgcGFyYW1ldGVycy4KICAqLwpAQCAtMjIxLDYgKzI0NCw4IEBACiAJbXJxLT5kYXRhLT5zZyA9IHNnOwogCW1ycS0+ZGF0YS0+c2dfbGVuID0gc2dfbGVuOwogCisJbW1jX3Rlc3RfcHJlcGFyZV9zYmModGVzdCwgbXJxLCBibG9ja3MpOworCiAJbW1jX3NldF9kYXRhX3RpbWVvdXQobXJxLT5kYXRhLCB0ZXN0LT5jYXJkKTsKIH0KIApAQCAtNjkzLDYgKzcxOCw4IEBACiAKIAlyZXQgPSAwOwogCisJaWYgKG1ycS0+c2JjICYmIG1ycS0+c2JjLT5lcnJvcikKKwkJcmV0ID0gbXJxLT5zYmMtPmVycm9yOwogCWlmICghcmV0ICYmIG1ycS0+Y21kLT5lcnJvcikKIAkJcmV0ID0gbXJxLT5jbWQtPmVycm9yOwogCWlmICghcmV0ICYmIG1ycS0+ZGF0YS0+ZXJyb3IpCkBAIC0yMjc4LDYgKzIzMDUsMjQ1IEBACiAJcmV0dXJuIFJFU1VMVF9GQUlMOwogfQogCitzdHJ1Y3QgbW1jX3Rlc3RfcmVxIHsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxOworCXN0cnVjdCBtbWNfY29tbWFuZCBzYmM7CisJc3RydWN0IG1tY19jb21tYW5kIGNtZDsKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgc3RvcDsKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgc3RhdHVzOworCXN0cnVjdCBtbWNfZGF0YSBkYXRhOworfTsKKworc3RhdGljIHN0cnVjdCBtbWNfdGVzdF9yZXEgKm1tY190ZXN0X3JlcV9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBtbWNfdGVzdF9yZXEgKnJxID0ga3phbGxvYyhzaXplb2YoKnJxKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAocnEpIHsKKwkJcnEtPm1ycS5jbWQgPSAmcnEtPmNtZDsKKwkJcnEtPm1ycS5kYXRhID0gJnJxLT5kYXRhOworCQlycS0+bXJxLnN0b3AgPSAmcnEtPnN0b3A7CisJfQorCisJcmV0dXJuIHJxOworfQorCitzdGF0aWMgaW50IG1tY190ZXN0X3NlbmRfc3RhdHVzKHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0LAorCQkJCXN0cnVjdCBtbWNfY29tbWFuZCAqY21kKQoreworCW1lbXNldChjbWQsIDAsIHNpemVvZigqY21kKSk7CisKKwljbWQtPm9wY29kZSA9IE1NQ19TRU5EX1NUQVRVUzsKKwlpZiAoIW1tY19ob3N0X2lzX3NwaSh0ZXN0LT5jYXJkLT5ob3N0KSkKKwkJY21kLT5hcmcgPSB0ZXN0LT5jYXJkLT5yY2EgPDwgMTY7CisJY21kLT5mbGFncyA9IE1NQ19SU1BfU1BJX1IyIHwgTU1DX1JTUF9SMSB8IE1NQ19DTURfQUM7CisKKwlyZXR1cm4gbW1jX3dhaXRfZm9yX2NtZCh0ZXN0LT5jYXJkLT5ob3N0LCBjbWQsIDApOworfQorCitzdGF0aWMgaW50IG1tY190ZXN0X29uZ29pbmdfdHJhbnNmZXIoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgZGV2X2FkZHIsIGludCB1c2Vfc2JjLAorCQkJCSAgICAgaW50IHJlcGVhdF9jbWQsIGludCB3cml0ZSwgaW50IHVzZV9hcmVxKQoreworCXN0cnVjdCBtbWNfdGVzdF9yZXEgKnJxID0gbW1jX3Rlc3RfcmVxX2FsbG9jKCk7CisJc3RydWN0IG1tY19ob3N0ICpob3N0ID0gdGVzdC0+Y2FyZC0+aG9zdDsKKwlzdHJ1Y3QgbW1jX3Rlc3RfYXJlYSAqdCA9ICZ0ZXN0LT5hcmVhOworCXN0cnVjdCBtbWNfYXN5bmNfcmVxIGFyZXE7CisJc3RydWN0IG1tY19yZXF1ZXN0ICptcnE7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWJvb2wgZXhwaXJlZCA9IGZhbHNlOworCWludCByZXQgPSAwLCBjbWRfcmV0OworCXUzMiBzdGF0dXMgPSAwOworCWludCBjb3VudCA9IDA7CisKKwlpZiAoIXJxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1ycSA9ICZycS0+bXJxOworCWlmICh1c2Vfc2JjKQorCQltcnEtPnNiYyA9ICZycS0+c2JjOworCW1ycS0+Y2FwX2NtZF9kdXJpbmdfdGZyID0gdHJ1ZTsKKworCWFyZXEubXJxID0gbXJxOworCWFyZXEuZXJyX2NoZWNrID0gbW1jX3Rlc3RfY2hlY2tfcmVzdWx0X2FzeW5jOworCisJbW1jX3Rlc3RfcHJlcGFyZV9tcnEodGVzdCwgbXJxLCB0LT5zZywgdC0+c2dfbGVuLCBkZXZfYWRkciwgdC0+YmxvY2tzLAorCQkJICAgICA1MTIsIHdyaXRlKTsKKworCWlmICh1c2Vfc2JjICYmIHQtPmJsb2NrcyA+IDEgJiYgIW1ycS0+c2JjKSB7CisJCXJldCA9ICBtbWNfaG9zdF9jbWQyMyhob3N0KSA/CisJCSAgICAgICBSRVNVTFRfVU5TVVBfQ0FSRCA6CisJCSAgICAgICBSRVNVTFRfVU5TVVBfSE9TVDsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwkvKiBTdGFydCBvbmdvaW5nIGRhdGEgcmVxdWVzdCAqLworCWlmICh1c2VfYXJlcSkgeworCQltbWNfc3RhcnRfcmVxKGhvc3QsICZhcmVxLCAmcmV0KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2ZyZWU7CisJfSBlbHNlIHsKKwkJbW1jX3dhaXRfZm9yX3JlcShob3N0LCBtcnEpOworCX0KKworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygzMDAwKTsKKwlkbyB7CisJCWNvdW50ICs9IDE7CisKKwkJLyogU2VuZCBzdGF0dXMgY29tbWFuZCB3aGlsZSBkYXRhIHRyYW5zZmVyIGluIHByb2dyZXNzICovCisJCWNtZF9yZXQgPSBtbWNfdGVzdF9zZW5kX3N0YXR1cyh0ZXN0LCAmcnEtPnN0YXR1cyk7CisJCWlmIChjbWRfcmV0KQorCQkJYnJlYWs7CisKKwkJc3RhdHVzID0gcnEtPnN0YXR1cy5yZXNwWzBdOworCQlpZiAoc3RhdHVzICYgUjFfRVJST1IpIHsKKwkJCWNtZF9yZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAobW1jX2lzX3JlcV9kb25lKGhvc3QsIG1ycSkpCisJCQlicmVhazsKKworCQlleHBpcmVkID0gdGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KTsKKwkJaWYgKGV4cGlyZWQpIHsKKwkJCXByX2luZm8oIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIFRyYW4gc3RhdGUgc3RhdHVzICUjeFxuIiwKKwkJCQltbWNfaG9zdG5hbWUoaG9zdCksIHN0YXR1cyk7CisJCQljbWRfcmV0ID0gLUVUSU1FRE9VVDsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAocmVwZWF0X2NtZCAmJiBSMV9DVVJSRU5UX1NUQVRFKHN0YXR1cykgIT0gUjFfU1RBVEVfVFJBTik7CisKKwkvKiBXYWl0IGZvciBkYXRhIHJlcXVlc3QgdG8gY29tcGxldGUgKi8KKwlpZiAodXNlX2FyZXEpCisJCW1tY19zdGFydF9yZXEoaG9zdCwgTlVMTCwgJnJldCk7CisJZWxzZQorCQltbWNfd2FpdF9mb3JfcmVxX2RvbmUodGVzdC0+Y2FyZC0+aG9zdCwgbXJxKTsKKworCS8qCisJICogRm9yIGNhcF9jbWRfZHVyaW5nX3RmciByZXF1ZXN0LCB1cHBlciBsYXllciBtdXN0IHNlbmQgc3RvcCBpZgorCSAqIHJlcXVpcmVkLgorCSAqLworCWlmIChtcnEtPmRhdGEtPnN0b3AgJiYgKG1ycS0+ZGF0YS0+ZXJyb3IgfHwgIW1ycS0+c2JjKSkgeworCQlpZiAocmV0KQorCQkJbW1jX3dhaXRfZm9yX2NtZChob3N0LCBtcnEtPmRhdGEtPnN0b3AsIDApOworCQllbHNlCisJCQlyZXQgPSBtbWNfd2FpdF9mb3JfY21kKGhvc3QsIG1ycS0+ZGF0YS0+c3RvcCwgMCk7CisJfQorCisJaWYgKHJldCkKKwkJZ290byBvdXRfZnJlZTsKKworCWlmIChjbWRfcmV0KSB7CisJCXByX2luZm8oIiVzOiBTZW5kIFN0YXR1cyBmYWlsZWQ6IHN0YXR1cyAlI3gsIGVycm9yICVkXG4iLAorCQkJbW1jX2hvc3RuYW1lKHRlc3QtPmNhcmQtPmhvc3QpLCBzdGF0dXMsIGNtZF9yZXQpOworCX0KKworCXJldCA9IG1tY190ZXN0X2NoZWNrX3Jlc3VsdCh0ZXN0LCBtcnEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlyZXQgPSBtbWNfdGVzdF93YWl0X2J1c3kodGVzdCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZnJlZTsKKworCWlmIChyZXBlYXRfY21kICYmICh0LT5ibG9ja3MgKyAxKSA8PCA5ID4gdC0+bWF4X3RmcikKKwkJcHJfaW5mbygiJXM6ICVkIGNvbW1hbmRzIGNvbXBsZXRlZCBkdXJpbmcgdHJhbnNmZXIgb2YgJXUgYmxvY2tzXG4iLAorCQkJbW1jX2hvc3RuYW1lKHRlc3QtPmNhcmQtPmhvc3QpLCBjb3VudCwgdC0+YmxvY2tzKTsKKworCWlmIChjbWRfcmV0KQorCQlyZXQgPSBjbWRfcmV0Oworb3V0X2ZyZWU6CisJa2ZyZWUocnEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX21tY190ZXN0X2NtZHNfZHVyaW5nX3RmcihzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVzdCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHN6LCBpbnQgdXNlX3NiYywgaW50IHdyaXRlLAorCQkJCSAgICAgIGludCB1c2VfYXJlcSkKK3sKKwlzdHJ1Y3QgbW1jX3Rlc3RfYXJlYSAqdCA9ICZ0ZXN0LT5hcmVhOworCWludCByZXQ7CisKKwlpZiAoISh0ZXN0LT5jYXJkLT5ob3N0LT5jYXBzICYgTU1DX0NBUF9DTURfRFVSSU5HX1RGUikpCisJCXJldHVybiBSRVNVTFRfVU5TVVBfSE9TVDsKKworCXJldCA9IG1tY190ZXN0X2FyZWFfbWFwKHRlc3QsIHN6LCAwLCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbW1jX3Rlc3Rfb25nb2luZ190cmFuc2Zlcih0ZXN0LCB0LT5kZXZfYWRkciwgdXNlX3NiYywgMCwgd3JpdGUsCisJCQkJCXVzZV9hcmVxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIG1tY190ZXN0X29uZ29pbmdfdHJhbnNmZXIodGVzdCwgdC0+ZGV2X2FkZHIsIHVzZV9zYmMsIDEsIHdyaXRlLAorCQkJCQkgdXNlX2FyZXEpOworfQorCitzdGF0aWMgaW50IG1tY190ZXN0X2NtZHNfZHVyaW5nX3RmcihzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVzdCwgaW50IHVzZV9zYmMsCisJCQkJICAgIGludCB3cml0ZSwgaW50IHVzZV9hcmVxKQoreworCXN0cnVjdCBtbWNfdGVzdF9hcmVhICp0ID0gJnRlc3QtPmFyZWE7CisJdW5zaWduZWQgbG9uZyBzejsKKwlpbnQgcmV0OworCisJZm9yIChzeiA9IDUxMjsgc3ogPD0gdC0+bWF4X3Rmcjsgc3ogKz0gNTEyKSB7CisJCXJldCA9IF9fbW1jX3Rlc3RfY21kc19kdXJpbmdfdGZyKHRlc3QsIHN6LCB1c2Vfc2JjLCB3cml0ZSwKKwkJCQkJCSB1c2VfYXJlcSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvbW1hbmRzIGR1cmluZyByZWFkIC0gbm8gU2V0IEJsb2NrIENvdW50IChDTUQyMykuCisgKi8KK3N0YXRpYyBpbnQgbW1jX3Rlc3RfY21kc19kdXJpbmdfcmVhZChzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVzdCkKK3sKKwlyZXR1cm4gbW1jX3Rlc3RfY21kc19kdXJpbmdfdGZyKHRlc3QsIDAsIDAsIDApOworfQorCisvKgorICogQ29tbWFuZHMgZHVyaW5nIHdyaXRlIC0gbm8gU2V0IEJsb2NrIENvdW50IChDTUQyMykuCisgKi8KK3N0YXRpYyBpbnQgbW1jX3Rlc3RfY21kc19kdXJpbmdfd3JpdGUoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QpCit7CisJcmV0dXJuIG1tY190ZXN0X2NtZHNfZHVyaW5nX3Rmcih0ZXN0LCAwLCAxLCAwKTsKK30KKworLyoKKyAqIENvbW1hbmRzIGR1cmluZyByZWFkIC0gdXNlIFNldCBCbG9jayBDb3VudCAoQ01EMjMpLgorICovCitzdGF0aWMgaW50IG1tY190ZXN0X2NtZHNfZHVyaW5nX3JlYWRfY21kMjMoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QpCit7CisJcmV0dXJuIG1tY190ZXN0X2NtZHNfZHVyaW5nX3Rmcih0ZXN0LCAxLCAwLCAwKTsKK30KKworLyoKKyAqIENvbW1hbmRzIGR1cmluZyB3cml0ZSAtIHVzZSBTZXQgQmxvY2sgQ291bnQgKENNRDIzKS4KKyAqLworc3RhdGljIGludCBtbWNfdGVzdF9jbWRzX2R1cmluZ193cml0ZV9jbWQyMyhzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVzdCkKK3sKKwlyZXR1cm4gbW1jX3Rlc3RfY21kc19kdXJpbmdfdGZyKHRlc3QsIDEsIDEsIDApOworfQorCisvKgorICogQ29tbWFuZHMgZHVyaW5nIG5vbi1ibG9ja2luZyByZWFkIC0gdXNlIFNldCBCbG9jayBDb3VudCAoQ01EMjMpLgorICovCitzdGF0aWMgaW50IG1tY190ZXN0X2NtZHNfZHVyaW5nX3JlYWRfY21kMjNfbm9uYmxvY2soc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QpCit7CisJcmV0dXJuIG1tY190ZXN0X2NtZHNfZHVyaW5nX3Rmcih0ZXN0LCAxLCAwLCAxKTsKK30KKworLyoKKyAqIENvbW1hbmRzIGR1cmluZyBub24tYmxvY2tpbmcgd3JpdGUgLSB1c2UgU2V0IEJsb2NrIENvdW50IChDTUQyMykuCisgKi8KK3N0YXRpYyBpbnQgbW1jX3Rlc3RfY21kc19kdXJpbmdfd3JpdGVfY21kMjNfbm9uYmxvY2soc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QpCit7CisJcmV0dXJuIG1tY190ZXN0X2NtZHNfZHVyaW5nX3Rmcih0ZXN0LCAxLCAxLCAxKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBtbWNfdGVzdF9jYXNlIG1tY190ZXN0X2Nhc2VzW10gPSB7CiAJewogCQkubmFtZSA9ICJCYXNpYyB3cml0ZSAobm8gZGF0YSB2ZXJpZmljYXRpb24pIiwKQEAgLTI2MDUsNiArMjg3MSw0OCBAQAogCQkubmFtZSA9ICJSZXNldCB0ZXN0IiwKIAkJLnJ1biA9IG1tY190ZXN0X3Jlc2V0LAogCX0sCisKKwl7CisJCS5uYW1lID0gIkNvbW1hbmRzIGR1cmluZyByZWFkIC0gbm8gU2V0IEJsb2NrIENvdW50IChDTUQyMykiLAorCQkucHJlcGFyZSA9IG1tY190ZXN0X2FyZWFfcHJlcGFyZSwKKwkJLnJ1biA9IG1tY190ZXN0X2NtZHNfZHVyaW5nX3JlYWQsCisJCS5jbGVhbnVwID0gbW1jX3Rlc3RfYXJlYV9jbGVhbnVwLAorCX0sCisKKwl7CisJCS5uYW1lID0gIkNvbW1hbmRzIGR1cmluZyB3cml0ZSAtIG5vIFNldCBCbG9jayBDb3VudCAoQ01EMjMpIiwKKwkJLnByZXBhcmUgPSBtbWNfdGVzdF9hcmVhX3ByZXBhcmUsCisJCS5ydW4gPSBtbWNfdGVzdF9jbWRzX2R1cmluZ193cml0ZSwKKwkJLmNsZWFudXAgPSBtbWNfdGVzdF9hcmVhX2NsZWFudXAsCisJfSwKKworCXsKKwkJLm5hbWUgPSAiQ29tbWFuZHMgZHVyaW5nIHJlYWQgLSB1c2UgU2V0IEJsb2NrIENvdW50IChDTUQyMykiLAorCQkucHJlcGFyZSA9IG1tY190ZXN0X2FyZWFfcHJlcGFyZSwKKwkJLnJ1biA9IG1tY190ZXN0X2NtZHNfZHVyaW5nX3JlYWRfY21kMjMsCisJCS5jbGVhbnVwID0gbW1jX3Rlc3RfYXJlYV9jbGVhbnVwLAorCX0sCisKKwl7CisJCS5uYW1lID0gIkNvbW1hbmRzIGR1cmluZyB3cml0ZSAtIHVzZSBTZXQgQmxvY2sgQ291bnQgKENNRDIzKSIsCisJCS5wcmVwYXJlID0gbW1jX3Rlc3RfYXJlYV9wcmVwYXJlLAorCQkucnVuID0gbW1jX3Rlc3RfY21kc19kdXJpbmdfd3JpdGVfY21kMjMsCisJCS5jbGVhbnVwID0gbW1jX3Rlc3RfYXJlYV9jbGVhbnVwLAorCX0sCisKKwl7CisJCS5uYW1lID0gIkNvbW1hbmRzIGR1cmluZyBub24tYmxvY2tpbmcgcmVhZCAtIHVzZSBTZXQgQmxvY2sgQ291bnQgKENNRDIzKSIsCisJCS5wcmVwYXJlID0gbW1jX3Rlc3RfYXJlYV9wcmVwYXJlLAorCQkucnVuID0gbW1jX3Rlc3RfY21kc19kdXJpbmdfcmVhZF9jbWQyM19ub25ibG9jaywKKwkJLmNsZWFudXAgPSBtbWNfdGVzdF9hcmVhX2NsZWFudXAsCisJfSwKKworCXsKKwkJLm5hbWUgPSAiQ29tbWFuZHMgZHVyaW5nIG5vbi1ibG9ja2luZyB3cml0ZSAtIHVzZSBTZXQgQmxvY2sgQ291bnQgKENNRDIzKSIsCisJCS5wcmVwYXJlID0gbW1jX3Rlc3RfYXJlYV9wcmVwYXJlLAorCQkucnVuID0gbW1jX3Rlc3RfY21kc19kdXJpbmdfd3JpdGVfY21kMjNfbm9uYmxvY2ssCisJCS5jbGVhbnVwID0gbW1jX3Rlc3RfYXJlYV9jbGVhbnVwLAorCX0sCiB9OwogCiBzdGF0aWMgREVGSU5FX01VVEVYKG1tY190ZXN0X2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jIGIvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jCmluZGV4IGJmMTQ2NDIuLjgwMzdmNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYworKysgYi9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmMKQEAgLTE5LDcgKzE5LDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKwogI2luY2x1ZGUgInF1ZXVlLmgiCisjaW5jbHVkZSAiYmxvY2suaCIKIAogI2RlZmluZSBNTUNfUVVFVUVfQk9VTkNFU1oJNjU1MzYKIApAQCAtMzMsNyArMzUsOCBAQAogCS8qCiAJICogV2Ugb25seSBsaWtlIG5vcm1hbCBibG9jayByZXF1ZXN0cyBhbmQgZGlzY2FyZHMuCiAJICovCi0JaWYgKHJlcS0+Y21kX3R5cGUgIT0gUkVRX1RZUEVfRlMgJiYgcmVxX29wKHJlcSkgIT0gUkVRX09QX0RJU0NBUkQpIHsKKwlpZiAocmVxLT5jbWRfdHlwZSAhPSBSRVFfVFlQRV9GUyAmJiByZXFfb3AocmVxKSAhPSBSRVFfT1BfRElTQ0FSRCAmJgorCSAgICByZXFfb3AocmVxKSAhPSBSRVFfT1BfU0VDVVJFX0VSQVNFKSB7CiAJCWJsa19kdW1wX3JxX2ZsYWdzKHJlcSwgIk1NQyBiYWQgcmVxdWVzdCIpOwogCQlyZXR1cm4gQkxLUFJFUF9LSUxMOwogCX0KQEAgLTY0LDggKzY3LDEwIEBACiAJCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAogCQlpZiAocmVxIHx8IG1xLT5tcXJxX3ByZXYtPnJlcSkgeworCQkJYm9vbCByZXFfaXNfc3BlY2lhbCA9IG1tY19yZXFfaXNfc3BlY2lhbChyZXEpOworCiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCQkJbXEtPmlzc3VlX2ZuKG1xLCByZXEpOworCQkJbW1jX2Jsa19pc3N1ZV9ycShtcSwgcmVxKTsKIAkJCWNvbmRfcmVzY2hlZCgpOwogCQkJaWYgKG1xLT5mbGFncyAmIE1NQ19RVUVVRV9ORVdfUkVRVUVTVCkgewogCQkJCW1xLT5mbGFncyAmPSB+TU1DX1FVRVVFX05FV19SRVFVRVNUOwpAQCAtNzksNyArODQsNyBAQAogCQkJICogaGFzIGJlZW4gZmluaXNoZWQuIERvIG5vdCBhc3NpZ24gaXQgdG8gcHJldmlvdXMKIAkJCSAqIHJlcXVlc3QuCiAJCQkgKi8KLQkJCWlmIChtbWNfcmVxX2lzX3NwZWNpYWwocmVxKSkKKwkJCWlmIChyZXFfaXNfc3BlY2lhbCkKIAkJCQltcS0+bXFycV9jdXItPnJlcSA9IE5VTEw7CiAKIAkJCW1xLT5tcXJxX3ByZXYtPmJycS5tcnEuZGF0YSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmggYi9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmgKaW5kZXggZDYyNTMxMS4uM2MxNWE3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5oCisrKyBiL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuaApAQCAtNCw3ICs0LDkgQEAKIHN0YXRpYyBpbmxpbmUgYm9vbCBtbWNfcmVxX2lzX3NwZWNpYWwoc3RydWN0IHJlcXVlc3QgKnJlcSkKIHsKIAlyZXR1cm4gcmVxICYmCi0JCShyZXFfb3AocmVxKSA9PSBSRVFfT1BfRkxVU0ggfHwgcmVxX29wKHJlcSkgPT0gUkVRX09QX0RJU0NBUkQpOworCQkocmVxX29wKHJlcSkgPT0gUkVRX09QX0ZMVVNIIHx8CisJCSByZXFfb3AocmVxKSA9PSBSRVFfT1BfRElTQ0FSRCB8fAorCQkgcmVxX29wKHJlcSkgPT0gUkVRX09QX1NFQ1VSRV9FUkFTRSk7CiB9CiAKIHN0cnVjdCByZXF1ZXN0OwpAQCAtNTUsOCArNTcsNiBAQAogCXVuc2lnbmVkIGludAkJZmxhZ3M7CiAjZGVmaW5lIE1NQ19RVUVVRV9TVVNQRU5ERUQJKDEgPDwgMCkKICNkZWZpbmUgTU1DX1FVRVVFX05FV19SRVFVRVNUCSgxIDw8IDEpCi0KLQlpbnQJCQkoKmlzc3VlX2ZuKShzdHJ1Y3QgbW1jX3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOwogCXZvaWQJCQkqZGF0YTsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZQkqcXVldWU7CiAJc3RydWN0IG1tY19xdWV1ZV9yZXEJbXFycVsyXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jIGIvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKaW5kZXggZTU1Y2RlNi4uMjU1M2Q5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKQEAgLTU4LDYgKzU4LDkgQEAKICAqLwogI2RlZmluZSBNTUNfQktPUFNfTUFYX1RJTUVPVVQJKDQgKiA2MCAqIDEwMDApIC8qIG1heCB0aW1lIHRvIHdhaXQgaW4gbXMgKi8KIAorLyogVGhlIG1heCBlcmFzZSB0aW1lb3V0LCB1c2VkIHdoZW4gaG9zdC0+bWF4X2J1c3lfdGltZW91dCBpc24ndCBzcGVjaWZpZWQgKi8KKyNkZWZpbmUgTU1DX0VSQVNFX1RJTUVPVVRfTVMJKDYwICogMTAwMCkgLyogNjAgcyAqLworCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgZnJlcXNbXSA9IHsgNDAwMDAwLCAzMDAwMDAsIDIwMDAwMCwgMTAwMDAwIH07CiAKIC8qCkBAIC0xMTcsNiArMTIwLDI0IEBACiAKICNlbmRpZiAvKiBDT05GSUdfRkFJTF9NTUNfUkVRVUVTVCAqLwogCitzdGF0aWMgaW5saW5lIHZvaWQgbW1jX2NvbXBsZXRlX2NtZChzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKK3sKKwlpZiAobXJxLT5jYXBfY21kX2R1cmluZ190ZnIgJiYgIWNvbXBsZXRpb25fZG9uZSgmbXJxLT5jbWRfY29tcGxldGlvbikpCisJCWNvbXBsZXRlX2FsbCgmbXJxLT5jbWRfY29tcGxldGlvbik7Cit9CisKK3ZvaWQgbW1jX2NvbW1hbmRfZG9uZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQoreworCWlmICghbXJxLT5jYXBfY21kX2R1cmluZ190ZnIpCisJCXJldHVybjsKKworCW1tY19jb21wbGV0ZV9jbWQobXJxKTsKKworCXByX2RlYnVnKCIlczogY21kIGRvbmUsIHRmciBvbmdvaW5nIChDTUQldSlcbiIsCisJCSBtbWNfaG9zdG5hbWUoaG9zdCksIG1ycS0+Y21kLT5vcGNvZGUpOworfQorRVhQT1JUX1NZTUJPTChtbWNfY29tbWFuZF9kb25lKTsKKwogLyoqCiAgKgltbWNfcmVxdWVzdF9kb25lIC0gZmluaXNoIHByb2Nlc3NpbmcgYW4gTU1DIHJlcXVlc3QKICAqCUBob3N0OiBNTUMgaG9zdCB3aGljaCBjb21wbGV0ZWQgcmVxdWVzdApAQCAtMTQzLDYgKzE2NCwxMSBAQAogCQkJY21kLT5yZXRyaWVzID0gMDsKIAl9CiAKKwlpZiAoaG9zdC0+b25nb2luZ19tcnEgPT0gbXJxKQorCQlob3N0LT5vbmdvaW5nX21ycSA9IE5VTEw7CisKKwltbWNfY29tcGxldGVfY21kKG1ycSk7CisKIAl0cmFjZV9tbWNfcmVxdWVzdF9kb25lKGhvc3QsIG1ycSk7CiAKIAlpZiAoZXJyICYmIGNtZC0+cmV0cmllcyAmJiAhbW1jX2NhcmRfcmVtb3ZlZChob3N0LT5jYXJkKSkgewpAQCAtMTU1LDcgKzE4MSw4IEBACiAJfSBlbHNlIHsKIAkJbW1jX3Nob3VsZF9mYWlsX3JlcXVlc3QoaG9zdCwgbXJxKTsKIAotCQlsZWRfdHJpZ2dlcl9ldmVudChob3N0LT5sZWQsIExFRF9PRkYpOworCQlpZiAoIWhvc3QtPm9uZ29pbmdfbXJxKQorCQkJbGVkX3RyaWdnZXJfZXZlbnQoaG9zdC0+bGVkLCBMRURfT0ZGKTsKIAogCQlpZiAobXJxLT5zYmMpIHsKIAkJCXByX2RlYnVnKCIlczogcmVxIGRvbmUgPENNRCV1PjogJWQ6ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCkBAIC0yMjAsNiArMjQ3LDE1IEBACiAJCX0KIAl9CiAKKwlpZiAobXJxLT5jYXBfY21kX2R1cmluZ190ZnIpIHsKKwkJaG9zdC0+b25nb2luZ19tcnEgPSBtcnE7CisJCS8qCisJCSAqIFJldHJ5IHBhdGggY291bGQgY29tZSB0aHJvdWdoIGhlcmUgd2l0aG91dCBoYXZpbmcgd2FpdGluZyBvbgorCQkgKiBjbWRfY29tcGxldGlvbiwgc28gZW5zdXJlIGl0IGlzIHJlaW5pdGlhbGlzZWQuCisJCSAqLworCQlyZWluaXRfY29tcGxldGlvbigmbXJxLT5jbWRfY29tcGxldGlvbik7CisJfQorCiAJdHJhY2VfbW1jX3JlcXVlc3Rfc3RhcnQoaG9zdCwgbXJxKTsKIAogCWhvc3QtPm9wcy0+cmVxdWVzdChob3N0LCBtcnEpOwpAQCAtMzg2LDYgKzQyMiwxOCBAQAogCWNvbXBsZXRlKCZtcnEtPmNvbXBsZXRpb24pOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgbW1jX3dhaXRfb25nb2luZ190ZnJfY21kKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgKm9uZ29pbmdfbXJxID0gUkVBRF9PTkNFKGhvc3QtPm9uZ29pbmdfbXJxKTsKKworCS8qCisJICogSWYgdGhlcmUgaXMgYW4gb25nb2luZyB0cmFuc2Zlciwgd2FpdCBmb3IgdGhlIGNvbW1hbmQgbGluZSB0byBiZWNvbWUKKwkgKiBhdmFpbGFibGUuCisJICovCisJaWYgKG9uZ29pbmdfbXJxICYmICFjb21wbGV0aW9uX2RvbmUoJm9uZ29pbmdfbXJxLT5jbWRfY29tcGxldGlvbikpCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJm9uZ29pbmdfbXJxLT5jbWRfY29tcGxldGlvbik7Cit9CisKIC8qCiAgKl9fbW1jX3N0YXJ0X2RhdGFfcmVxKCkgLSBzdGFydHMgZGF0YSByZXF1ZXN0CiAgKiBAaG9zdDogTU1DIGhvc3QgdG8gc3RhcnQgdGhlIHJlcXVlc3QKQEAgLTM5MywxNyArNDQxLDI0IEBACiAgKgogICogU2V0cyB0aGUgZG9uZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiByZXF1ZXN0IGlzIGNvbXBsZXRlZCBieSB0aGUgY2FyZC4KICAqIFN0YXJ0cyBkYXRhIG1tYyByZXF1ZXN0IGV4ZWN1dGlvbgorICogSWYgYW4gb25nb2luZyB0cmFuc2ZlciBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3YWl0IGZvciB0aGUgY29tbWFuZCBsaW5lCisgKiB0byBiZWNvbWUgYXZhaWxhYmxlIGJlZm9yZSBzZW5kaW5nIGFub3RoZXIgY29tbWFuZC4KICAqLwogc3RhdGljIGludCBfX21tY19zdGFydF9kYXRhX3JlcShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQogewogCWludCBlcnI7CiAKKwltbWNfd2FpdF9vbmdvaW5nX3Rmcl9jbWQoaG9zdCk7CisKIAltcnEtPmRvbmUgPSBtbWNfd2FpdF9kYXRhX2RvbmU7CiAJbXJxLT5ob3N0ID0gaG9zdDsKIAorCWluaXRfY29tcGxldGlvbigmbXJxLT5jbWRfY29tcGxldGlvbik7CisKIAllcnIgPSBtbWNfc3RhcnRfcmVxdWVzdChob3N0LCBtcnEpOwogCWlmIChlcnIpIHsKIAkJbXJxLT5jbWQtPmVycm9yID0gZXJyOworCQltbWNfY29tcGxldGVfY21kKG1ycSk7CiAJCW1tY193YWl0X2RhdGFfZG9uZShtcnEpOwogCX0KIApAQCAtNDE0LDEyICs0NjksMTcgQEAKIHsKIAlpbnQgZXJyOwogCisJbW1jX3dhaXRfb25nb2luZ190ZnJfY21kKGhvc3QpOworCiAJaW5pdF9jb21wbGV0aW9uKCZtcnEtPmNvbXBsZXRpb24pOwogCW1ycS0+ZG9uZSA9IG1tY193YWl0X2RvbmU7CiAKKwlpbml0X2NvbXBsZXRpb24oJm1ycS0+Y21kX2NvbXBsZXRpb24pOworCiAJZXJyID0gbW1jX3N0YXJ0X3JlcXVlc3QoaG9zdCwgbXJxKTsKIAlpZiAoZXJyKSB7CiAJCW1ycS0+Y21kLT5lcnJvciA9IGVycjsKKwkJbW1jX2NvbXBsZXRlX2NtZChtcnEpOwogCQljb21wbGV0ZSgmbXJxLT5jb21wbGV0aW9uKTsKIAl9CiAKQEAgLTQ4Myw4ICs1NDMsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIG1tY193YWl0X2Zvcl9yZXFfZG9uZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsCi0JCQkJICBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKK3ZvaWQgbW1jX3dhaXRfZm9yX3JlcV9kb25lKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCiB7CiAJc3RydWN0IG1tY19jb21tYW5kICpjbWQ7CiAKQEAgLTUyNSw2ICs1ODQsMjggQEAKIAogCW1tY19yZXR1bmVfcmVsZWFzZShob3N0KTsKIH0KK0VYUE9SVF9TWU1CT0wobW1jX3dhaXRfZm9yX3JlcV9kb25lKTsKKworLyoqCisgKgltbWNfaXNfcmVxX2RvbmUgLSBEZXRlcm1pbmUgaWYgYSAnY2FwX2NtZF9kdXJpbmdfdGZyJyByZXF1ZXN0IGlzIGRvbmUKKyAqCUBob3N0OiBNTUMgaG9zdAorICoJQG1ycTogTU1DIHJlcXVlc3QKKyAqCisgKgltbWNfaXNfcmVxX2RvbmUoKSBpcyB1c2VkIHdpdGggcmVxdWVzdHMgdGhhdCBoYXZlCisgKgltcnEtPmNhcF9jbWRfZHVyaW5nX3RmciA9IHRydWUuIG1tY19pc19yZXFfZG9uZSgpIG11c3QgYmUgY2FsbGVkIGFmdGVyCisgKglzdGFydGluZyBhIHJlcXVlc3QgYW5kIGJlZm9yZSB3YWl0aW5nIGZvciBpdCB0byBjb21wbGV0ZS4gVGhhdCBpcywKKyAqCWVpdGhlciBpbiBiZXR3ZWVuIGNhbGxzIHRvIG1tY19zdGFydF9yZXEoKSwgb3IgYWZ0ZXIgbW1jX3dhaXRfZm9yX3JlcSgpCisgKglhbmQgYmVmb3JlIG1tY193YWl0X2Zvcl9yZXFfZG9uZSgpLiBJZiBpdCBpcyBjYWxsZWQgYXQgb3RoZXIgdGltZXMgdGhlCisgKglyZXN1bHQgaXMgbm90IG1lYW5pbmdmdWwuCisgKi8KK2Jvb2wgbW1jX2lzX3JlcV9kb25lKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCit7CisJaWYgKGhvc3QtPmFyZXEpCisJCXJldHVybiBob3N0LT5jb250ZXh0X2luZm8uaXNfZG9uZV9yY3Y7CisJZWxzZQorCQlyZXR1cm4gY29tcGxldGlvbl9kb25lKCZtcnEtPmNvbXBsZXRpb24pOworfQorRVhQT1JUX1NZTUJPTChtbWNfaXNfcmVxX2RvbmUpOwogCiAvKioKICAqCW1tY19wcmVfcmVxIC0gUHJlcGFyZSBmb3IgYSBuZXcgcmVxdWVzdApAQCAtNjQ1LDEzICs3MjYsMTggQEAKICAqCUBtcnE6IE1NQyByZXF1ZXN0IHRvIHN0YXJ0CiAgKgogICoJU3RhcnQgYSBuZXcgTU1DIGN1c3RvbSBjb21tYW5kIHJlcXVlc3QgZm9yIGEgaG9zdCwgYW5kIHdhaXQKLSAqCWZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZS4gRG9lcyBub3QgYXR0ZW1wdCB0byBwYXJzZSB0aGUKLSAqCXJlc3BvbnNlLgorICoJZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlLiBJbiB0aGUgY2FzZSBvZiAnY2FwX2NtZF9kdXJpbmdfdGZyJworICoJcmVxdWVzdHMsIHRoZSB0cmFuc2ZlciBpcyBvbmdvaW5nIGFuZCB0aGUgY2FsbGVyIGNhbiBpc3N1ZSBmdXJ0aGVyCisgKgljb21tYW5kcyB0aGF0IGRvIG5vdCB1c2UgdGhlIGRhdGEgbGluZXMsIGFuZCB0aGVuIHdhaXQgYnkgY2FsbGluZworICoJbW1jX3dhaXRfZm9yX3JlcV9kb25lKCkuCisgKglEb2VzIG5vdCBhdHRlbXB0IHRvIHBhcnNlIHRoZSByZXNwb25zZS4KICAqLwogdm9pZCBtbWNfd2FpdF9mb3JfcmVxKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCiB7CiAJX19tbWNfc3RhcnRfcmVxKGhvc3QsIG1ycSk7Ci0JbW1jX3dhaXRfZm9yX3JlcV9kb25lKGhvc3QsIG1ycSk7CisKKwlpZiAoIW1ycS0+Y2FwX2NtZF9kdXJpbmdfdGZyKQorCQltbWNfd2FpdF9mb3JfcmVxX2RvbmUoaG9zdCwgbXJxKTsKIH0KIEVYUE9SVF9TWU1CT0wobW1jX3dhaXRfZm9yX3JlcSk7CiAKQEAgLTIyMDIsNiArMjI4OCw1NCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbW1jX2FsaWduX2VyYXNlX3NpemUoc3RydWN0IG1tY19jYXJkICpjYXJkLAorCQkJCQkgdW5zaWduZWQgaW50ICpmcm9tLAorCQkJCQkgdW5zaWduZWQgaW50ICp0bywKKwkJCQkJIHVuc2lnbmVkIGludCBucikKK3sKKwl1bnNpZ25lZCBpbnQgZnJvbV9uZXcgPSAqZnJvbSwgbnJfbmV3ID0gbnIsIHJlbTsKKworCS8qCisJICogV2hlbiB0aGUgJ2NhcmQtPmVyYXNlX3NpemUnIGlzIHBvd2VyIG9mIDIsIHdlIGNhbiB1c2Ugcm91bmRfdXAvZG93bigpCisJICogdG8gYWxpZ24gdGhlIGVyYXNlIHNpemUgZWZmaWNpZW50bHkuCisJICovCisJaWYgKGlzX3Bvd2VyX29mXzIoY2FyZC0+ZXJhc2Vfc2l6ZSkpIHsKKwkJdW5zaWduZWQgaW50IHRlbXAgPSBmcm9tX25ldzsKKworCQlmcm9tX25ldyA9IHJvdW5kX3VwKHRlbXAsIGNhcmQtPmVyYXNlX3NpemUpOworCQlyZW0gPSBmcm9tX25ldyAtIHRlbXA7CisKKwkJaWYgKG5yX25ldyA+IHJlbSkKKwkJCW5yX25ldyAtPSByZW07CisJCWVsc2UKKwkJCXJldHVybiAwOworCisJCW5yX25ldyA9IHJvdW5kX2Rvd24obnJfbmV3LCBjYXJkLT5lcmFzZV9zaXplKTsKKwl9IGVsc2UgeworCQlyZW0gPSBmcm9tX25ldyAlIGNhcmQtPmVyYXNlX3NpemU7CisJCWlmIChyZW0pIHsKKwkJCXJlbSA9IGNhcmQtPmVyYXNlX3NpemUgLSByZW07CisJCQlmcm9tX25ldyArPSByZW07CisJCQlpZiAobnJfbmV3ID4gcmVtKQorCQkJCW5yX25ldyAtPSByZW07CisJCQllbHNlCisJCQkJcmV0dXJuIDA7CisJCX0KKworCQlyZW0gPSBucl9uZXcgJSBjYXJkLT5lcmFzZV9zaXplOworCQlpZiAocmVtKQorCQkJbnJfbmV3IC09IHJlbTsKKwl9CisKKwlpZiAobnJfbmV3ID09IDApCisJCXJldHVybiAwOworCisJKnRvID0gZnJvbV9uZXcgKyBucl9uZXc7CisJKmZyb20gPSBmcm9tX25ldzsKKworCXJldHVybiBucl9uZXc7Cit9CisKIC8qKgogICogbW1jX2VyYXNlIC0gZXJhc2Ugc2VjdG9ycy4KICAqIEBjYXJkOiBjYXJkIHRvIGVyYXNlCkBAIC0yMjQwLDI2ICsyMzc0LDEyIEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoYXJnID09IE1NQ19FUkFTRV9BUkcpIHsKLQkJcmVtID0gZnJvbSAlIGNhcmQtPmVyYXNlX3NpemU7Ci0JCWlmIChyZW0pIHsKLQkJCXJlbSA9IGNhcmQtPmVyYXNlX3NpemUgLSByZW07Ci0JCQlmcm9tICs9IHJlbTsKLQkJCWlmIChuciA+IHJlbSkKLQkJCQluciAtPSByZW07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmVtID0gbnIgJSBjYXJkLT5lcmFzZV9zaXplOwotCQlpZiAocmVtKQotCQkJbnIgLT0gcmVtOwotCX0KKwlpZiAoYXJnID09IE1NQ19FUkFTRV9BUkcpCisJCW5yID0gbW1jX2FsaWduX2VyYXNlX3NpemUoY2FyZCwgJmZyb20sICZ0bywgbnIpOwogCiAJaWYgKG5yID09IDApCiAJCXJldHVybiAwOwogCi0JdG8gPSBmcm9tICsgbnI7Ci0KIAlpZiAodG8gPD0gZnJvbSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTIzNTIsNiArMjQ3Miw4IEBACiAJc3RydWN0IG1tY19ob3N0ICpob3N0ID0gY2FyZC0+aG9zdDsKIAl1bnNpZ25lZCBpbnQgbWF4X2Rpc2NhcmQsIHgsIHksIHF0eSA9IDAsIG1heF9xdHksIG1pbl9xdHksIHRpbWVvdXQ7CiAJdW5zaWduZWQgaW50IGxhc3RfdGltZW91dCA9IDA7CisJdW5zaWduZWQgaW50IG1heF9idXN5X3RpbWVvdXQgPSBob3N0LT5tYXhfYnVzeV90aW1lb3V0ID8KKwkJCWhvc3QtPm1heF9idXN5X3RpbWVvdXQgOiBNTUNfRVJBU0VfVElNRU9VVF9NUzsKIAogCWlmIChjYXJkLT5lcmFzZV9zaGlmdCkgewogCQltYXhfcXR5ID0gVUlOVF9NQVggPj4gY2FyZC0+ZXJhc2Vfc2hpZnQ7CkBAIC0yMzc0LDE1ICsyNDk2LDE1IEBACiAJICogbWF0dGVyIHdoYXQgc2l6ZSBvZiAnaG9zdC0+bWF4X2J1c3lfdGltZW91dCcsIGJ1dCBpZiB0aGUKIAkgKiAnaG9zdC0+bWF4X2J1c3lfdGltZW91dCcgaXMgbGFyZ2UgZW5vdWdoIGZvciBtb3JlIGRpc2NhcmQgc2VjdG9ycywKIAkgKiB0aGVuIHdlIGNhbiBjb250aW51ZSB0byBpbmNyZWFzZSB0aGUgbWF4IGRpc2NhcmQgc2VjdG9ycyB1bnRpbCB3ZQotCSAqIGdldCBhIGJhbGFuY2UgdmFsdWUuCisJICogZ2V0IGEgYmFsYW5jZSB2YWx1ZS4gSW4gY2FzZXMgd2hlbiB0aGUgJ2hvc3QtPm1heF9idXN5X3RpbWVvdXQnCisJICogaXNuJ3Qgc3BlY2lmaWVkLCB1c2UgdGhlIGRlZmF1bHQgbWF4IGVyYXNlIHRpbWVvdXQuCiAJICovCiAJZG8gewogCQl5ID0gMDsKIAkJZm9yICh4ID0gMTsgeCAmJiB4IDw9IG1heF9xdHkgJiYgbWF4X3F0eSAtIHggPj0gcXR5OyB4IDw8PSAxKSB7CiAJCQl0aW1lb3V0ID0gbW1jX2VyYXNlX3RpbWVvdXQoY2FyZCwgYXJnLCBxdHkgKyB4KTsKIAotCQkJaWYgKHF0eSArIHggPiBtaW5fcXR5ICYmCi0JCQkgICAgdGltZW91dCA+IGhvc3QtPm1heF9idXN5X3RpbWVvdXQpCisJCQlpZiAocXR5ICsgeCA+IG1pbl9xdHkgJiYgdGltZW91dCA+IG1heF9idXN5X3RpbWVvdXQpCiAJCQkJYnJlYWs7CiAKIAkJCWlmICh0aW1lb3V0IDwgbGFzdF90aW1lb3V0KQpAQCAtMjQyNyw5ICsyNTQ5LDYgQEAKIAlzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QgPSBjYXJkLT5ob3N0OwogCXVuc2lnbmVkIGludCBtYXhfZGlzY2FyZCwgbWF4X3RyaW07CiAKLQlpZiAoIWhvc3QtPm1heF9idXN5X3RpbWVvdXQpCi0JCXJldHVybiBVSU5UX01BWDsKLQogCS8qCiAJICogV2l0aG91dCBlcmFzZV9ncm91cF9kZWYgc2V0LCBNTUMgZXJhc2UgdGltZW91dCBkZXBlbmRzIG9uIGNsb2NrCiAJICogZnJlcXVlbmNlIHdoaWNoIGNhbiBjaGFuZ2UuICBJbiB0aGF0IGNhc2UsIHRoZSBiZXN0IGNob2ljZSBpcwpAQCAtMjQ0Nyw3ICsyNTY2LDggQEAKIAkJbWF4X2Rpc2NhcmQgPSAwOwogCX0KIAlwcl9kZWJ1ZygiJXM6IGNhbGN1bGF0ZWQgbWF4LiBkaXNjYXJkIHNlY3RvcnMgJXUgZm9yIHRpbWVvdXQgJXUgbXNcbiIsCi0JCSBtbWNfaG9zdG5hbWUoaG9zdCksIG1heF9kaXNjYXJkLCBob3N0LT5tYXhfYnVzeV90aW1lb3V0KTsKKwkJbW1jX2hvc3RuYW1lKGhvc3QpLCBtYXhfZGlzY2FyZCwgaG9zdC0+bWF4X2J1c3lfdGltZW91dCA/CisJCWhvc3QtPm1heF9idXN5X3RpbWVvdXQgOiBNTUNfRVJBU0VfVElNRU9VVF9NUyk7CiAJcmV0dXJuIG1heF9kaXNjYXJkOwogfQogRVhQT1JUX1NZTUJPTChtbWNfY2FsY19tYXhfZGlzY2FyZCk7CkBAIC0yNDU2LDcgKzI1NzYsOCBAQAogewogCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQgPSB7MH07CiAKLQlpZiAobW1jX2NhcmRfYmxvY2thZGRyKGNhcmQpIHx8IG1tY19jYXJkX2RkcjUyKGNhcmQpKQorCWlmIChtbWNfY2FyZF9ibG9ja2FkZHIoY2FyZCkgfHwgbW1jX2NhcmRfZGRyNTIoY2FyZCkgfHwKKwkgICAgbW1jX2NhcmRfaHM0MDAoY2FyZCkgfHwgbW1jX2NhcmRfaHM0MDBlcyhjYXJkKSkKIAkJcmV0dXJuIDA7CiAKIAljbWQub3Bjb2RlID0gTU1DX1NFVF9CTE9DS0xFTjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMgYi9kcml2ZXJzL21tYy9jb3JlL21tYy5jCmluZGV4IGYyZDE4NWMuLjM0ODZiYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9tbWMuYwpAQCAtMTAyOSw2ICsxMDI5LDEwIEBACiAJCWVyciA9IG1tY19zd2l0Y2hfc3RhdHVzKGNhcmQpOwogCX0KIAorCWlmIChlcnIpCisJCXByX3dhcm4oIiVzOiBzd2l0Y2ggdG8gaGlnaC1zcGVlZCBmYWlsZWQsIGVycjolZFxuIiwKKwkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwgZXJyKTsKKwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTEyNjUsMTEgKzEyNjksOCBAQAogCiAJLyogU3dpdGNoIGNhcmQgdG8gSFMgbW9kZSAqLwogCWVyciA9IG1tY19zZWxlY3RfaHMoY2FyZCk7Ci0JaWYgKGVycikgewotCQlwcl9lcnIoIiVzOiBzd2l0Y2ggdG8gaGlnaC1zcGVlZCBmYWlsZWQsIGVycjolZFxuIiwKLQkJCW1tY19ob3N0bmFtZShob3N0KSwgZXJyKTsKKwlpZiAoZXJyKQogCQlnb3RvIG91dF9lcnI7Ci0JfQogCiAJZXJyID0gbW1jX3N3aXRjaF9zdGF0dXMoY2FyZCk7CiAJaWYgKGVycikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvcHdyc2VxX3NpbXBsZS5jIGIvZHJpdmVycy9tbWMvY29yZS9wd3JzZXFfc2ltcGxlLmMKaW5kZXggNDUwZDkwNy4uMTMwNDE2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9wd3JzZXFfc2ltcGxlLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9wd3JzZXFfc2ltcGxlLmMKQEAgLTE2LDYgKzE2LDggQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9wZXJ0eS5oPgogCiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KIApAQCAtMjQsNiArMjYsNyBAQAogc3RydWN0IG1tY19wd3JzZXFfc2ltcGxlIHsKIAlzdHJ1Y3QgbW1jX3B3cnNlcSBwd3JzZXE7CiAJYm9vbCBjbGtfZW5hYmxlZDsKKwl1MzIgcG9zdF9wb3dlcl9vbl9kZWxheV9tczsKIAlzdHJ1Y3QgY2xrICpleHRfY2xrOwogCXN0cnVjdCBncGlvX2Rlc2NzICpyZXNldF9ncGlvczsKIH07CkBAIC02NCw2ICs2Nyw5IEBACiAJc3RydWN0IG1tY19wd3JzZXFfc2ltcGxlICpwd3JzZXEgPSB0b19wd3JzZXFfc2ltcGxlKGhvc3QtPnB3cnNlcSk7CiAKIAltbWNfcHdyc2VxX3NpbXBsZV9zZXRfZ3Bpb3NfdmFsdWUocHdyc2VxLCAwKTsKKworCWlmIChwd3JzZXEtPnBvc3RfcG93ZXJfb25fZGVsYXlfbXMpCisJCW1zbGVlcChwd3JzZXEtPnBvc3RfcG93ZXJfb25fZGVsYXlfbXMpOwogfQogCiBzdGF0aWMgdm9pZCBtbWNfcHdyc2VxX3NpbXBsZV9wb3dlcl9vZmYoc3RydWN0IG1tY19ob3N0ICpob3N0KQpAQCAtMTExLDYgKzExNyw5IEBACiAJCXJldHVybiBQVFJfRVJSKHB3cnNlcS0+cmVzZXRfZ3Bpb3MpOwogCX0KIAorCWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJwb3N0LXBvd2VyLW9uLWRlbGF5LW1zIiwKKwkJCQkgJnB3cnNlcS0+cG9zdF9wb3dlcl9vbl9kZWxheV9tcyk7CisKIAlwd3JzZXEtPnB3cnNlcS5kZXYgPSBkZXY7CiAJcHdyc2VxLT5wd3JzZXEub3BzID0gJm1tY19wd3JzZXFfc2ltcGxlX29wczsKIAlwd3JzZXEtPnB3cnNlcS5vd25lciA9IFRISVNfTU9EVUxFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9zZC5jIGIvZHJpdmVycy9tbWMvY29yZS9zZC5jCmluZGV4IDAxMjM5MzYuLjczYzc2MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvc2QuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkLmMKQEAgLTIyMyw4ICsyMjMsNyBAQAogc3RhdGljIGludCBtbWNfcmVhZF9zc3Ioc3RydWN0IG1tY19jYXJkICpjYXJkKQogewogCXVuc2lnbmVkIGludCBhdSwgZXMsIGV0LCBlbzsKLQlpbnQgZXJyLCBpOwotCXUzMiAqc3NyOworCWludCBpOwogCiAJaWYgKCEoY2FyZC0+Y3NkLmNtZGNsYXNzICYgQ0NDX0FQUF9TUEVDKSkgewogCQlwcl93YXJuKCIlczogY2FyZCBsYWNrcyBtYW5kYXRvcnkgU0QgU3RhdHVzIGZ1bmN0aW9uXG4iLApAQCAtMjMyLDMzICsyMzEsMjcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0Jc3NyID0ga21hbGxvYyg2NCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzc3IpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZXJyID0gbW1jX2FwcF9zZF9zdGF0dXMoY2FyZCwgc3NyKTsKLQlpZiAoZXJyKSB7CisJaWYgKG1tY19hcHBfc2Rfc3RhdHVzKGNhcmQsIGNhcmQtPnJhd19zc3IpKSB7CiAJCXByX3dhcm4oIiVzOiBwcm9ibGVtIHJlYWRpbmcgU0QgU3RhdHVzIHJlZ2lzdGVyXG4iLAogCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKLQkJZXJyID0gMDsKLQkJZ290byBvdXQ7CisJCXJldHVybiAwOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQlzc3JbaV0gPSBiZTMyX3RvX2NwdShzc3JbaV0pOworCQljYXJkLT5yYXdfc3NyW2ldID0gYmUzMl90b19jcHUoY2FyZC0+cmF3X3NzcltpXSk7CiAKIAkvKgogCSAqIFVOU1RVRkZfQklUUyBvbmx5IHdvcmtzIHdpdGggZm91ciB1MzJzIHNvIHdlIGhhdmUgdG8gb2Zmc2V0IHRoZQogCSAqIGJpdGZpZWxkIHBvc2l0aW9ucyBhY2NvcmRpbmdseS4KIAkgKi8KLQlhdSA9IFVOU1RVRkZfQklUUyhzc3IsIDQyOCAtIDM4NCwgNCk7CisJYXUgPSBVTlNUVUZGX0JJVFMoY2FyZC0+cmF3X3NzciwgNDI4IC0gMzg0LCA0KTsKIAlpZiAoYXUpIHsKIAkJaWYgKGF1IDw9IDkgfHwgY2FyZC0+c2NyLnNkYV9zcGVjMykgewogCQkJY2FyZC0+c3NyLmF1ID0gc2RfYXVfc2l6ZVthdV07Ci0JCQllcyA9IFVOU1RVRkZfQklUUyhzc3IsIDQwOCAtIDM4NCwgMTYpOwotCQkJZXQgPSBVTlNUVUZGX0JJVFMoc3NyLCA0MDIgLSAzODQsIDYpOworCQkJZXMgPSBVTlNUVUZGX0JJVFMoY2FyZC0+cmF3X3NzciwgNDA4IC0gMzg0LCAxNik7CisJCQlldCA9IFVOU1RVRkZfQklUUyhjYXJkLT5yYXdfc3NyLCA0MDIgLSAzODQsIDYpOwogCQkJaWYgKGVzICYmIGV0KSB7Ci0JCQkJZW8gPSBVTlNUVUZGX0JJVFMoc3NyLCA0MDAgLSAzODQsIDIpOworCQkJCWVvID0gVU5TVFVGRl9CSVRTKGNhcmQtPnJhd19zc3IsIDQwMCAtIDM4NCwgMik7CiAJCQkJY2FyZC0+c3NyLmVyYXNlX3RpbWVvdXQgPSAoZXQgKiAxMDAwKSAvIGVzOwogCQkJCWNhcmQtPnNzci5lcmFzZV9vZmZzZXQgPSBlbyAqIDEwMDA7CiAJCQl9CkBAIC0yNjcsOSArMjYwLDggQEAKIAkJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOwogCQl9CiAJfQotb3V0OgotCWtmcmVlKHNzcik7Ci0JcmV0dXJuIGVycjsKKworCXJldHVybiAwOwogfQogCiAvKgpAQCAtNjY2LDYgKzY1OCwxNCBAQAogTU1DX0RFVl9BVFRSKGNzZCwgIiUwOHglMDh4JTA4eCUwOHhcbiIsIGNhcmQtPnJhd19jc2RbMF0sIGNhcmQtPnJhd19jc2RbMV0sCiAJY2FyZC0+cmF3X2NzZFsyXSwgY2FyZC0+cmF3X2NzZFszXSk7CiBNTUNfREVWX0FUVFIoc2NyLCAiJTA4eCUwOHhcbiIsIGNhcmQtPnJhd19zY3JbMF0sIGNhcmQtPnJhd19zY3JbMV0pOworTU1DX0RFVl9BVFRSKHNzciwKKwkiJTA4eCUwOHglMDh4JTA4eCUwOHglMDh4JTA4eCUwOHglMDh4JTA4eCUwOHglMDh4JTA4eCUwOHglMDh4JTA4eFxuIiwKKwkJY2FyZC0+cmF3X3NzclswXSwgY2FyZC0+cmF3X3NzclsxXSwgY2FyZC0+cmF3X3NzclsyXSwKKwkJY2FyZC0+cmF3X3NzclszXSwgY2FyZC0+cmF3X3Nzcls0XSwgY2FyZC0+cmF3X3Nzcls1XSwKKwkJY2FyZC0+cmF3X3Nzcls2XSwgY2FyZC0+cmF3X3Nzcls3XSwgY2FyZC0+cmF3X3Nzcls4XSwKKwkJY2FyZC0+cmF3X3Nzcls5XSwgY2FyZC0+cmF3X3NzclsxMF0sIGNhcmQtPnJhd19zc3JbMTFdLAorCQljYXJkLT5yYXdfc3NyWzEyXSwgY2FyZC0+cmF3X3NzclsxM10sIGNhcmQtPnJhd19zc3JbMTRdLAorCQljYXJkLT5yYXdfc3NyWzE1XSk7CiBNTUNfREVWX0FUVFIoZGF0ZSwgIiUwMmQvJTA0ZFxuIiwgY2FyZC0+Y2lkLm1vbnRoLCBjYXJkLT5jaWQueWVhcik7CiBNTUNfREVWX0FUVFIoZXJhc2Vfc2l6ZSwgIiV1XG4iLCBjYXJkLT5lcmFzZV9zaXplIDw8IDkpOwogTU1DX0RFVl9BVFRSKHByZWZlcnJlZF9lcmFzZV9zaXplLCAiJXVcbiIsIGNhcmQtPnByZWZfZXJhc2UgPDwgOSk7CkBAIC02OTgsNiArNjk4LDcgQEAKIAkmZGV2X2F0dHJfY2lkLmF0dHIsCiAJJmRldl9hdHRyX2NzZC5hdHRyLAogCSZkZXZfYXR0cl9zY3IuYXR0ciwKKwkmZGV2X2F0dHJfc3NyLmF0dHIsCiAJJmRldl9hdHRyX2RhdGUuYXR0ciwKIAkmZGV2X2F0dHJfZXJhc2Vfc2l6ZS5hdHRyLAogCSZkZXZfYXR0cl9wcmVmZXJyZWRfZXJhc2Vfc2l6ZS5hdHRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9zZGlvX2lvLmMgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9faW8uYwppbmRleCA3OGNiNGQ1Li40MDZlNWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL3NkaW9faW8uYworKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9faW8uYwpAQCAtMjYsOCArMjYsOCBAQAogICovCiB2b2lkIHNkaW9fY2xhaW1faG9zdChzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jKQogewotCUJVR19PTighZnVuYyk7Ci0JQlVHX09OKCFmdW5jLT5jYXJkKTsKKwlpZiAoV0FSTl9PTighZnVuYykpCisJCXJldHVybjsKIAogCW1tY19jbGFpbV9ob3N0KGZ1bmMtPmNhcmQtPmhvc3QpOwogfQpAQCAtNDIsOCArNDIsOCBAQAogICovCiB2b2lkIHNkaW9fcmVsZWFzZV9ob3N0KHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCiB7Ci0JQlVHX09OKCFmdW5jKTsKLQlCVUdfT04oIWZ1bmMtPmNhcmQpOworCWlmIChXQVJOX09OKCFmdW5jKSkKKwkJcmV0dXJuOwogCiAJbW1jX3JlbGVhc2VfaG9zdChmdW5jLT5jYXJkLT5ob3N0KTsKIH0KQEAgLTYyLDggKzYyLDggQEAKIAl1bnNpZ25lZCBjaGFyIHJlZzsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAKLQlCVUdfT04oIWZ1bmMpOwotCUJVR19PTighZnVuYy0+Y2FyZCk7CisJaWYgKCFmdW5jKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXByX2RlYnVnKCJTRElPOiBFbmFibGluZyBkZXZpY2UgJXMuLi5cbiIsIHNkaW9fZnVuY19pZChmdW5jKSk7CiAKQEAgLTExMiw4ICsxMTIsOCBAQAogCWludCByZXQ7CiAJdW5zaWduZWQgY2hhciByZWc7CiAKLQlCVUdfT04oIWZ1bmMpOwotCUJVR19PTighZnVuYy0+Y2FyZCk7CisJaWYgKCFmdW5jKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXByX2RlYnVnKCJTRElPOiBEaXNhYmxpbmcgZGV2aWNlICVzLi4uXG4iLCBzZGlvX2Z1bmNfaWQoZnVuYykpOwogCkBAIC0zMDcsNiArMzA3LDkgQEAKIAl1bnNpZ25lZCBtYXhfYmxvY2tzOwogCWludCByZXQ7CiAKKwlpZiAoIWZ1bmMgfHwgKGZ1bmMtPm51bSA+IDcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCS8qIERvIHRoZSBidWxrIG9mIHRoZSB0cmFuc2ZlciB1c2luZyBibG9jayBtb2RlIChpZiBzdXBwb3J0ZWQpLiAqLwogCWlmIChmdW5jLT5jYXJkLT5jY2NyLm11bHRpX2Jsb2NrICYmIChzaXplID4gc2Rpb19tYXhfYnl0ZV9zaXplKGZ1bmMpKSkgewogCQkvKiBCbG9ja3MgcGVyIGNvbW1hbmQgaXMgbGltaXRlZCBieSBob3N0IGNvdW50LCBob3N0IHRyYW5zZmVyCkBAIC0zNjcsNyArMzcwLDEwIEBACiAJaW50IHJldDsKIAl1OCB2YWw7CiAKLQlCVUdfT04oIWZ1bmMpOworCWlmICghZnVuYykgeworCQkqZXJyX3JldCA9IC1FSU5WQUw7CisJCXJldHVybiAweEZGOworCX0KIAogCWlmIChlcnJfcmV0KQogCQkqZXJyX3JldCA9IDA7CkBAIC0zOTgsNyArNDA0LDEwIEBACiB7CiAJaW50IHJldDsKIAotCUJVR19PTighZnVuYyk7CisJaWYgKCFmdW5jKSB7CisJCSplcnJfcmV0ID0gLUVJTlZBTDsKKwkJcmV0dXJuOworCX0KIAogCXJldCA9IG1tY19pb19yd19kaXJlY3QoZnVuYy0+Y2FyZCwgMSwgZnVuYy0+bnVtLCBhZGRyLCBiLCBOVUxMKTsKIAlpZiAoZXJyX3JldCkKQEAgLTYyMyw3ICs2MzIsMTAgQEAKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGNoYXIgdmFsOwogCi0JQlVHX09OKCFmdW5jKTsKKwlpZiAoIWZ1bmMpIHsKKwkJKmVycl9yZXQgPSAtRUlOVkFMOworCQlyZXR1cm4gMHhGRjsKKwl9CiAKIAlpZiAoZXJyX3JldCkKIAkJKmVycl9yZXQgPSAwOwpAQCAtNjU4LDcgKzY3MCwxMCBAQAogewogCWludCByZXQ7CiAKLQlCVUdfT04oIWZ1bmMpOworCWlmICghZnVuYykgeworCQkqZXJyX3JldCA9IC1FSU5WQUw7CisJCXJldHVybjsKKwl9CiAKIAlpZiAoKGFkZHIgPCAweEYwIHx8IGFkZHIgPiAweEZGKSAmJiAoIW1tY19jYXJkX2xlbmllbnRfZm4wKGZ1bmMtPmNhcmQpKSkgewogCQlpZiAoZXJyX3JldCkKQEAgLTY4NCw4ICs2OTksOCBAQAogICovCiBtbWNfcG1fZmxhZ190IHNkaW9fZ2V0X2hvc3RfcG1fY2FwcyhzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jKQogewotCUJVR19PTighZnVuYyk7Ci0JQlVHX09OKCFmdW5jLT5jYXJkKTsKKwlpZiAoIWZ1bmMpCisJCXJldHVybiAwOwogCiAJcmV0dXJuIGZ1bmMtPmNhcmQtPmhvc3QtPnBtX2NhcHM7CiB9CkBAIC03MDcsOCArNzIyLDggQEAKIHsKIAlzdHJ1Y3QgbW1jX2hvc3QgKmhvc3Q7CiAKLQlCVUdfT04oIWZ1bmMpOwotCUJVR19PTighZnVuYy0+Y2FyZCk7CisJaWYgKCFmdW5jKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWhvc3QgPSBmdW5jLT5jYXJkLT5ob3N0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3NkaW9fb3BzLmMgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9fb3BzLmMKaW5kZXggMzRmNmU4MC4uOTBmZTU1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZGlvX29wcy5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19vcHMuYwpAQCAtMjQsOCArMjQsNiBAQAogCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQgPSB7MH07CiAJaW50IGksIGVyciA9IDA7CiAKLQlCVUdfT04oIWhvc3QpOwotCiAJY21kLm9wY29kZSA9IFNEX0lPX1NFTkRfT1BfQ09ORDsKIAljbWQuYXJnID0gb2NyOwogCWNtZC5mbGFncyA9IE1NQ19SU1BfU1BJX1I0IHwgTU1DX1JTUF9SNCB8IE1NQ19DTURfQkNSOwpAQCAtNzEsOCArNjksOCBAQAogCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQgPSB7MH07CiAJaW50IGVycjsKIAotCUJVR19PTighaG9zdCk7Ci0JQlVHX09OKGZuID4gNyk7CisJaWYgKGZuID4gNykKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBzYW5pdHkgY2hlY2sgKi8KIAlpZiAoYWRkciAmIH4weDFGRkZGKQpAQCAtMTE0LDcgKzExMiw2IEBACiBpbnQgbW1jX2lvX3J3X2RpcmVjdChzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIGludCB3cml0ZSwgdW5zaWduZWQgZm4sCiAJdW5zaWduZWQgYWRkciwgdTggaW4sIHU4ICpvdXQpCiB7Ci0JQlVHX09OKCFjYXJkKTsKIAlyZXR1cm4gbW1jX2lvX3J3X2RpcmVjdF9ob3N0KGNhcmQtPmhvc3QsIHdyaXRlLCBmbiwgYWRkciwgaW4sIG91dCk7CiB9CiAKQEAgLTEyOSw4ICsxMjYsNiBAQAogCXVuc2lnbmVkIGludCBuZW50cywgbGVmdF9zaXplLCBpOwogCXVuc2lnbmVkIGludCBzZWdfc2l6ZSA9IGNhcmQtPmhvc3QtPm1heF9zZWdfc2l6ZTsKIAotCUJVR19PTighY2FyZCk7Ci0JQlVHX09OKGZuID4gNyk7CiAJV0FSTl9PTihibGtzeiA9PSAwKTsKIAogCS8qIHNhbml0eSBjaGVjayAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9kYXZpbmNpX21tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9kYXZpbmNpX21tYy5jCmluZGV4IGE1NjM3M2MuLjhmYTQ3OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvZGF2aW5jaV9tbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L2RhdmluY2lfbW1jLmMKQEAgLTEyMTYsOSArMTIxNiwxMSBAQAogCX0KIAogCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKCFyIHx8IGlycSA9PSBOT19JUlEpCisJaWYgKCFyKQogCQlyZXR1cm4gLUVOT0RFVjsKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKQorCQlyZXR1cm4gaXJxOwogCiAJbWVtX3NpemUgPSByZXNvdXJjZV9zaXplKHIpOwogCW1lbSA9IGRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHItPnN0YXJ0LCBtZW1fc2l6ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLWV4eW5vcy5jIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMtZXh5bm9zLmMKaW5kZXggZGEwZWYxNy4uN2FiM2Q3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMtZXh5bm9zLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMtZXh5bm9zLmMKQEAgLTIyNSw4ICsyMjUsMTIgQEAKIAkgKiBOb3Qgc3VwcG9ydGVkIHRvIGNvbmZpZ3VyZSByZWdpc3RlcgogCSAqIHJlbGF0ZWQgdG8gSFM0MDAKIAkgKi8KLQlpZiAocHJpdi0+Y3RybF90eXBlIDwgRFdfTUNJX1RZUEVfRVhZTk9TNTQyMCkKKwlpZiAocHJpdi0+Y3RybF90eXBlIDwgRFdfTUNJX1RZUEVfRVhZTk9TNTQyMCkgeworCQlpZiAodGltaW5nID09IE1NQ19USU1JTkdfTU1DX0hTNDAwKQorCQkJZGV2X3dhcm4oaG9zdC0+ZGV2LAorCQkJCSAiY2Fubm90IGNvbmZpZ3VyZSBIUzQwMCwgdW5zdXBwb3J0ZWQgY2hpcHNldFxuIik7CiAJCXJldHVybjsKKwl9CiAKIAlkcXMgPSBwcml2LT5zYXZlZF9kcXNfZW47CiAJc3Ryb2JlID0gcHJpdi0+c2F2ZWRfc3Ryb2JlX2N0cmw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy1rMy5jIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMtazMuYwppbmRleCA4ZTlkODg2Li42MjQ3ODk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy1rMy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLWszLmMKQEAgLTEzMSwxMSArMTMxLDE3IEBACiAJaG9zdC0+YnVzX2h6ID0gY2xrX2dldF9yYXRlKGhvc3QtPmJpdV9jbGspOwogfQogCitzdGF0aWMgaW50IGR3X21jaV9oaTYyMjBfZXhlY3V0ZV90dW5pbmcoc3RydWN0IGR3X21jaV9zbG90ICpzbG90LCB1MzIgb3Bjb2RlKQoreworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGR3X21jaV9kcnZfZGF0YSBoaTYyMjBfZGF0YSA9IHsKIAkuY2FwcwkJCT0gZHdfbWNpX2hpNjIyMF9jYXBzLAogCS5zd2l0Y2hfdm9sdGFnZQkJPSBkd19tY2lfaGk2MjIwX3N3aXRjaF92b2x0YWdlLAogCS5zZXRfaW9zCQk9IGR3X21jaV9oaTYyMjBfc2V0X2lvcywKIAkucGFyc2VfZHQJCT0gZHdfbWNpX2hpNjIyMF9wYXJzZV9kdCwKKwkuZXhlY3V0ZV90dW5pbmcJCT0gZHdfbWNpX2hpNjIyMF9leGVjdXRlX3R1bmluZywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGR3X21jaV9rM19tYXRjaFtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmMKaW5kZXggMzIzODBkNS4uNGZjYmM0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jCkBAIC02MSw2ICs2MSw4IEBACiAJCQkJIFNETU1DX0lETUFDX0lOVF9GQkUgfCBTRE1NQ19JRE1BQ19JTlRfUkkgfCBcCiAJCQkJIFNETU1DX0lETUFDX0lOVF9USSkKIAorI2RlZmluZSBERVNDX1JJTkdfQlVGX1NaCVBBR0VfU0laRQorCiBzdHJ1Y3QgaWRtYWNfZGVzY182NGFkZHIgewogCXUzMgkJZGVzMDsJLyogQ29udHJvbCBEZXNjcmlwdG9yICovCiAKQEAgLTQ2NywxMzYgKzQ2OSw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBkd19tY2lfdHJhbnNsYXRlX3NnbGlzdChzdHJ1Y3QgZHdfbWNpICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEsCi0JCQkJICAgIHVuc2lnbmVkIGludCBzZ19sZW4pCi17Ci0JdW5zaWduZWQgaW50IGRlc2NfbGVuOwotCWludCBpOwotCi0JaWYgKGhvc3QtPmRtYV82NGJpdF9hZGRyZXNzID09IDEpIHsKLQkJc3RydWN0IGlkbWFjX2Rlc2NfNjRhZGRyICpkZXNjX2ZpcnN0LCAqZGVzY19sYXN0LCAqZGVzYzsKLQotCQlkZXNjX2ZpcnN0ID0gZGVzY19sYXN0ID0gZGVzYyA9IGhvc3QtPnNnX2NwdTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgc2dfbGVuOyBpKyspIHsKLQkJCXVuc2lnbmVkIGludCBsZW5ndGggPSBzZ19kbWFfbGVuKCZkYXRhLT5zZ1tpXSk7Ci0KLQkJCXU2NCBtZW1fYWRkciA9IHNnX2RtYV9hZGRyZXNzKCZkYXRhLT5zZ1tpXSk7Ci0KLQkJCWZvciAoIDsgbGVuZ3RoIDsgZGVzYysrKSB7Ci0JCQkJZGVzY19sZW4gPSAobGVuZ3RoIDw9IERXX01DSV9ERVNDX0RBVEFfTEVOR1RIKSA/Ci0JCQkJCSAgIGxlbmd0aCA6IERXX01DSV9ERVNDX0RBVEFfTEVOR1RIOwotCi0JCQkJbGVuZ3RoIC09IGRlc2NfbGVuOwotCi0JCQkJLyoKLQkJCQkgKiBTZXQgdGhlIE9XTiBiaXQgYW5kIGRpc2FibGUgaW50ZXJydXB0cwotCQkJCSAqIGZvciB0aGlzIGRlc2NyaXB0b3IKLQkJCQkgKi8KLQkJCQlkZXNjLT5kZXMwID0gSURNQUNfREVTMF9PV04gfCBJRE1BQ19ERVMwX0RJQyB8Ci0JCQkJCQkJSURNQUNfREVTMF9DSDsKLQotCQkJCS8qIEJ1ZmZlciBsZW5ndGggKi8KLQkJCQlJRE1BQ182NEFERFJfU0VUX0JVRkZFUjFfU0laRShkZXNjLCBkZXNjX2xlbik7Ci0KLQkJCQkvKiBQaHlzaWNhbCBhZGRyZXNzIHRvIERNQSB0by9mcm9tICovCi0JCQkJZGVzYy0+ZGVzNCA9IG1lbV9hZGRyICYgMHhmZmZmZmZmZjsKLQkJCQlkZXNjLT5kZXM1ID0gbWVtX2FkZHIgPj4gMzI7Ci0KLQkJCQkvKiBVcGRhdGUgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlIG5leHQgZGVzYyAqLwotCQkJCW1lbV9hZGRyICs9IGRlc2NfbGVuOwotCi0JCQkJLyogU2F2ZSBwb2ludGVyIHRvIHRoZSBsYXN0IGRlc2NyaXB0b3IgKi8KLQkJCQlkZXNjX2xhc3QgPSBkZXNjOwotCQkJfQotCQl9Ci0KLQkJLyogU2V0IGZpcnN0IGRlc2NyaXB0b3IgKi8KLQkJZGVzY19maXJzdC0+ZGVzMCB8PSBJRE1BQ19ERVMwX0ZEOwotCi0JCS8qIFNldCBsYXN0IGRlc2NyaXB0b3IgKi8KLQkJZGVzY19sYXN0LT5kZXMwICY9IH4oSURNQUNfREVTMF9DSCB8IElETUFDX0RFUzBfRElDKTsKLQkJZGVzY19sYXN0LT5kZXMwIHw9IElETUFDX0RFUzBfTEQ7Ci0KLQl9IGVsc2UgewotCQlzdHJ1Y3QgaWRtYWNfZGVzYyAqZGVzY19maXJzdCwgKmRlc2NfbGFzdCwgKmRlc2M7Ci0KLQkJZGVzY19maXJzdCA9IGRlc2NfbGFzdCA9IGRlc2MgPSBob3N0LT5zZ19jcHU7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHNnX2xlbjsgaSsrKSB7Ci0JCQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gc2dfZG1hX2xlbigmZGF0YS0+c2dbaV0pOwotCi0JCQl1MzIgbWVtX2FkZHIgPSBzZ19kbWFfYWRkcmVzcygmZGF0YS0+c2dbaV0pOwotCi0JCQlmb3IgKCA7IGxlbmd0aCA7IGRlc2MrKykgewotCQkJCWRlc2NfbGVuID0gKGxlbmd0aCA8PSBEV19NQ0lfREVTQ19EQVRBX0xFTkdUSCkgPwotCQkJCQkgICBsZW5ndGggOiBEV19NQ0lfREVTQ19EQVRBX0xFTkdUSDsKLQotCQkJCWxlbmd0aCAtPSBkZXNjX2xlbjsKLQotCQkJCS8qCi0JCQkJICogU2V0IHRoZSBPV04gYml0IGFuZCBkaXNhYmxlIGludGVycnVwdHMKLQkJCQkgKiBmb3IgdGhpcyBkZXNjcmlwdG9yCi0JCQkJICovCi0JCQkJZGVzYy0+ZGVzMCA9IGNwdV90b19sZTMyKElETUFDX0RFUzBfT1dOIHwKLQkJCQkJCQkgSURNQUNfREVTMF9ESUMgfAotCQkJCQkJCSBJRE1BQ19ERVMwX0NIKTsKLQotCQkJCS8qIEJ1ZmZlciBsZW5ndGggKi8KLQkJCQlJRE1BQ19TRVRfQlVGRkVSMV9TSVpFKGRlc2MsIGRlc2NfbGVuKTsKLQotCQkJCS8qIFBoeXNpY2FsIGFkZHJlc3MgdG8gRE1BIHRvL2Zyb20gKi8KLQkJCQlkZXNjLT5kZXMyID0gY3B1X3RvX2xlMzIobWVtX2FkZHIpOwotCi0JCQkJLyogVXBkYXRlIHBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoZSBuZXh0IGRlc2MgKi8KLQkJCQltZW1fYWRkciArPSBkZXNjX2xlbjsKLQotCQkJCS8qIFNhdmUgcG9pbnRlciB0byB0aGUgbGFzdCBkZXNjcmlwdG9yICovCi0JCQkJZGVzY19sYXN0ID0gZGVzYzsKLQkJCX0KLQkJfQotCi0JCS8qIFNldCBmaXJzdCBkZXNjcmlwdG9yICovCi0JCWRlc2NfZmlyc3QtPmRlczAgfD0gY3B1X3RvX2xlMzIoSURNQUNfREVTMF9GRCk7Ci0KLQkJLyogU2V0IGxhc3QgZGVzY3JpcHRvciAqLwotCQlkZXNjX2xhc3QtPmRlczAgJj0gY3B1X3RvX2xlMzIofihJRE1BQ19ERVMwX0NIIHwKLQkJCQkJICAgICAgIElETUFDX0RFUzBfRElDKSk7Ci0JCWRlc2NfbGFzdC0+ZGVzMCB8PSBjcHVfdG9fbGUzMihJRE1BQ19ERVMwX0xEKTsKLQl9Ci0KLQl3bWIoKTsgLyogZHJhaW4gd3JpdGVidWZmZXIgKi8KLX0KLQotc3RhdGljIGludCBkd19tY2lfaWRtYWNfc3RhcnRfZG1hKHN0cnVjdCBkd19tY2kgKmhvc3QsIHVuc2lnbmVkIGludCBzZ19sZW4pCi17Ci0JdTMyIHRlbXA7Ci0KLQlkd19tY2lfdHJhbnNsYXRlX3NnbGlzdChob3N0LCBob3N0LT5kYXRhLCBzZ19sZW4pOwotCi0JLyogTWFrZSBzdXJlIHRvIHJlc2V0IERNQSBpbiBjYXNlIHdlIGRpZCBQSU8gYmVmb3JlIHRoaXMgKi8KLQlkd19tY2lfY3RybF9yZXNldChob3N0LCBTRE1NQ19DVFJMX0RNQV9SRVNFVCk7Ci0JZHdfbWNpX2lkbWFjX3Jlc2V0KGhvc3QpOwotCi0JLyogU2VsZWN0IElETUFDIGludGVyZmFjZSAqLwotCXRlbXAgPSBtY2lfcmVhZGwoaG9zdCwgQ1RSTCk7Ci0JdGVtcCB8PSBTRE1NQ19DVFJMX1VTRV9JRE1BQzsKLQltY2lfd3JpdGVsKGhvc3QsIENUUkwsIHRlbXApOwotCi0JLyogZHJhaW4gd3JpdGVidWZmZXIgKi8KLQl3bWIoKTsKLQotCS8qIEVuYWJsZSB0aGUgSURNQUMgKi8KLQl0ZW1wID0gbWNpX3JlYWRsKGhvc3QsIEJNT0QpOwotCXRlbXAgfD0gU0RNTUNfSURNQUNfRU5BQkxFIHwgU0RNTUNfSURNQUNfRkI7Ci0JbWNpX3dyaXRlbChob3N0LCBCTU9ELCB0ZW1wKTsKLQotCS8qIFN0YXJ0IGl0IHJ1bm5pbmcgKi8KLQltY2lfd3JpdGVsKGhvc3QsIFBMRE1ORCwgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBkd19tY2lfaWRtYWNfaW5pdChzdHJ1Y3QgZHdfbWNpICpob3N0KQogewogCWludCBpOwpAQCAtNjA0LDcgKzQ3Niw4IEBACiAJaWYgKGhvc3QtPmRtYV82NGJpdF9hZGRyZXNzID09IDEpIHsKIAkJc3RydWN0IGlkbWFjX2Rlc2NfNjRhZGRyICpwOwogCQkvKiBOdW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gdGhlIHJpbmcgYnVmZmVyICovCi0JCWhvc3QtPnJpbmdfc2l6ZSA9IFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgaWRtYWNfZGVzY182NGFkZHIpOworCQlob3N0LT5yaW5nX3NpemUgPQorCQkJREVTQ19SSU5HX0JVRl9TWiAvIHNpemVvZihzdHJ1Y3QgaWRtYWNfZGVzY182NGFkZHIpOwogCiAJCS8qIEZvcndhcmQgbGluayB0aGUgZGVzY3JpcHRvciBsaXN0ICovCiAJCWZvciAoaSA9IDAsIHAgPSBob3N0LT5zZ19jcHU7IGkgPCBob3N0LT5yaW5nX3NpemUgLSAxOwpAQCAtNjMwLDcgKzUwMyw4IEBACiAJfSBlbHNlIHsKIAkJc3RydWN0IGlkbWFjX2Rlc2MgKnA7CiAJCS8qIE51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGUgcmluZyBidWZmZXIgKi8KLQkJaG9zdC0+cmluZ19zaXplID0gUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBpZG1hY19kZXNjKTsKKwkJaG9zdC0+cmluZ19zaXplID0KKwkJCURFU0NfUklOR19CVUZfU1ogLyBzaXplb2Yoc3RydWN0IGlkbWFjX2Rlc2MpOwogCiAJCS8qIEZvcndhcmQgbGluayB0aGUgZGVzY3JpcHRvciBsaXN0ICovCiAJCWZvciAoaSA9IDAsIHAgPSBob3N0LT5zZ19jcHU7CkBAIC02NzEsNiArNTQ1LDE5NSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIGludCBkd19tY2lfcHJlcGFyZV9kZXNjNjQoc3RydWN0IGR3X21jaSAqaG9zdCwKKwkJCQkJIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSwKKwkJCQkJIHVuc2lnbmVkIGludCBzZ19sZW4pCit7CisJdW5zaWduZWQgaW50IGRlc2NfbGVuOworCXN0cnVjdCBpZG1hY19kZXNjXzY0YWRkciAqZGVzY19maXJzdCwgKmRlc2NfbGFzdCwgKmRlc2M7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCBpOworCisJZGVzY19maXJzdCA9IGRlc2NfbGFzdCA9IGRlc2MgPSBob3N0LT5zZ19jcHU7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2dfbGVuOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IGxlbmd0aCA9IHNnX2RtYV9sZW4oJmRhdGEtPnNnW2ldKTsKKworCQl1NjQgbWVtX2FkZHIgPSBzZ19kbWFfYWRkcmVzcygmZGF0YS0+c2dbaV0pOworCisJCWZvciAoIDsgbGVuZ3RoIDsgZGVzYysrKSB7CisJCQlkZXNjX2xlbiA9IChsZW5ndGggPD0gRFdfTUNJX0RFU0NfREFUQV9MRU5HVEgpID8KKwkJCQkgICBsZW5ndGggOiBEV19NQ0lfREVTQ19EQVRBX0xFTkdUSDsKKworCQkJbGVuZ3RoIC09IGRlc2NfbGVuOworCisJCQkvKgorCQkJICogV2FpdCBmb3IgdGhlIGZvcm1lciBjbGVhciBPV04gYml0IG9wZXJhdGlvbgorCQkJICogb2YgSURNQUMgdG8gbWFrZSBzdXJlIHRoYXQgdGhpcyBkZXNjcmlwdG9yCisJCQkgKiBpc24ndCBzdGlsbCBvd25lZCBieSBJRE1BQyBhcyBJRE1BQydzIHdyaXRlCisJCQkgKiBvcHMgYW5kIENQVSdzIHJlYWQgb3BzIGFyZSBhc3luY2hyb25vdXMuCisJCQkgKi8KKwkJCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOworCQkJd2hpbGUgKHJlYWRsKCZkZXNjLT5kZXMwKSAmIElETUFDX0RFUzBfT1dOKSB7CisJCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQkJCWdvdG8gZXJyX293bl9iaXQ7CisJCQkJdWRlbGF5KDEwKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFNldCB0aGUgT1dOIGJpdCBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzCisJCQkgKiBmb3IgdGhpcyBkZXNjcmlwdG9yCisJCQkgKi8KKwkJCWRlc2MtPmRlczAgPSBJRE1BQ19ERVMwX09XTiB8IElETUFDX0RFUzBfRElDIHwKKwkJCQkJCUlETUFDX0RFUzBfQ0g7CisKKwkJCS8qIEJ1ZmZlciBsZW5ndGggKi8KKwkJCUlETUFDXzY0QUREUl9TRVRfQlVGRkVSMV9TSVpFKGRlc2MsIGRlc2NfbGVuKTsKKworCQkJLyogUGh5c2ljYWwgYWRkcmVzcyB0byBETUEgdG8vZnJvbSAqLworCQkJZGVzYy0+ZGVzNCA9IG1lbV9hZGRyICYgMHhmZmZmZmZmZjsKKwkJCWRlc2MtPmRlczUgPSBtZW1fYWRkciA+PiAzMjsKKworCQkJLyogVXBkYXRlIHBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoZSBuZXh0IGRlc2MgKi8KKwkJCW1lbV9hZGRyICs9IGRlc2NfbGVuOworCisJCQkvKiBTYXZlIHBvaW50ZXIgdG8gdGhlIGxhc3QgZGVzY3JpcHRvciAqLworCQkJZGVzY19sYXN0ID0gZGVzYzsKKwkJfQorCX0KKworCS8qIFNldCBmaXJzdCBkZXNjcmlwdG9yICovCisJZGVzY19maXJzdC0+ZGVzMCB8PSBJRE1BQ19ERVMwX0ZEOworCisJLyogU2V0IGxhc3QgZGVzY3JpcHRvciAqLworCWRlc2NfbGFzdC0+ZGVzMCAmPSB+KElETUFDX0RFUzBfQ0ggfCBJRE1BQ19ERVMwX0RJQyk7CisJZGVzY19sYXN0LT5kZXMwIHw9IElETUFDX0RFUzBfTEQ7CisKKwlyZXR1cm4gMDsKK2Vycl9vd25fYml0OgorCS8qIHJlc3RvcmUgdGhlIGRlc2NyaXB0b3IgY2hhaW4gYXMgaXQncyBwb2xsdXRlZCAqLworCWRldl9kYmcoaG9zdC0+ZGV2LCAiZGVzY2lwdG9yIGlzIHN0aWxsIG93bmVkIGJ5IElETUFDLlxuIik7CisJbWVtc2V0KGhvc3QtPnNnX2NwdSwgMCwgREVTQ19SSU5HX0JVRl9TWik7CisJZHdfbWNpX2lkbWFjX2luaXQoaG9zdCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgZHdfbWNpX3ByZXBhcmVfZGVzYzMyKHN0cnVjdCBkd19tY2kgKmhvc3QsCisJCQkJCSBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEsCisJCQkJCSB1bnNpZ25lZCBpbnQgc2dfbGVuKQoreworCXVuc2lnbmVkIGludCBkZXNjX2xlbjsKKwlzdHJ1Y3QgaWRtYWNfZGVzYyAqZGVzY19maXJzdCwgKmRlc2NfbGFzdCwgKmRlc2M7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCBpOworCisJZGVzY19maXJzdCA9IGRlc2NfbGFzdCA9IGRlc2MgPSBob3N0LT5zZ19jcHU7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2dfbGVuOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IGxlbmd0aCA9IHNnX2RtYV9sZW4oJmRhdGEtPnNnW2ldKTsKKworCQl1MzIgbWVtX2FkZHIgPSBzZ19kbWFfYWRkcmVzcygmZGF0YS0+c2dbaV0pOworCisJCWZvciAoIDsgbGVuZ3RoIDsgZGVzYysrKSB7CisJCQlkZXNjX2xlbiA9IChsZW5ndGggPD0gRFdfTUNJX0RFU0NfREFUQV9MRU5HVEgpID8KKwkJCQkgICBsZW5ndGggOiBEV19NQ0lfREVTQ19EQVRBX0xFTkdUSDsKKworCQkJbGVuZ3RoIC09IGRlc2NfbGVuOworCisJCQkvKgorCQkJICogV2FpdCBmb3IgdGhlIGZvcm1lciBjbGVhciBPV04gYml0IG9wZXJhdGlvbgorCQkJICogb2YgSURNQUMgdG8gbWFrZSBzdXJlIHRoYXQgdGhpcyBkZXNjcmlwdG9yCisJCQkgKiBpc24ndCBzdGlsbCBvd25lZCBieSBJRE1BQyBhcyBJRE1BQydzIHdyaXRlCisJCQkgKiBvcHMgYW5kIENQVSdzIHJlYWQgb3BzIGFyZSBhc3luY2hyb25vdXMuCisJCQkgKi8KKwkJCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOworCQkJd2hpbGUgKHJlYWRsKCZkZXNjLT5kZXMwKSAmCisJCQkgICAgICAgY3B1X3RvX2xlMzIoSURNQUNfREVTMF9PV04pKSB7CisJCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQkJCWdvdG8gZXJyX293bl9iaXQ7CisJCQkJdWRlbGF5KDEwKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFNldCB0aGUgT1dOIGJpdCBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzCisJCQkgKiBmb3IgdGhpcyBkZXNjcmlwdG9yCisJCQkgKi8KKwkJCWRlc2MtPmRlczAgPSBjcHVfdG9fbGUzMihJRE1BQ19ERVMwX09XTiB8CisJCQkJCQkgSURNQUNfREVTMF9ESUMgfAorCQkJCQkJIElETUFDX0RFUzBfQ0gpOworCisJCQkvKiBCdWZmZXIgbGVuZ3RoICovCisJCQlJRE1BQ19TRVRfQlVGRkVSMV9TSVpFKGRlc2MsIGRlc2NfbGVuKTsKKworCQkJLyogUGh5c2ljYWwgYWRkcmVzcyB0byBETUEgdG8vZnJvbSAqLworCQkJZGVzYy0+ZGVzMiA9IGNwdV90b19sZTMyKG1lbV9hZGRyKTsKKworCQkJLyogVXBkYXRlIHBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoZSBuZXh0IGRlc2MgKi8KKwkJCW1lbV9hZGRyICs9IGRlc2NfbGVuOworCisJCQkvKiBTYXZlIHBvaW50ZXIgdG8gdGhlIGxhc3QgZGVzY3JpcHRvciAqLworCQkJZGVzY19sYXN0ID0gZGVzYzsKKwkJfQorCX0KKworCS8qIFNldCBmaXJzdCBkZXNjcmlwdG9yICovCisJZGVzY19maXJzdC0+ZGVzMCB8PSBjcHVfdG9fbGUzMihJRE1BQ19ERVMwX0ZEKTsKKworCS8qIFNldCBsYXN0IGRlc2NyaXB0b3IgKi8KKwlkZXNjX2xhc3QtPmRlczAgJj0gY3B1X3RvX2xlMzIofihJRE1BQ19ERVMwX0NIIHwKKwkJCQkgICAgICAgSURNQUNfREVTMF9ESUMpKTsKKwlkZXNjX2xhc3QtPmRlczAgfD0gY3B1X3RvX2xlMzIoSURNQUNfREVTMF9MRCk7CisKKwlyZXR1cm4gMDsKK2Vycl9vd25fYml0OgorCS8qIHJlc3RvcmUgdGhlIGRlc2NyaXB0b3IgY2hhaW4gYXMgaXQncyBwb2xsdXRlZCAqLworCWRldl9kYmcoaG9zdC0+ZGV2LCAiZGVzY2lwdG9yIGlzIHN0aWxsIG93bmVkIGJ5IElETUFDLlxuIik7CisJbWVtc2V0KGhvc3QtPnNnX2NwdSwgMCwgREVTQ19SSU5HX0JVRl9TWik7CisJZHdfbWNpX2lkbWFjX2luaXQoaG9zdCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgZHdfbWNpX2lkbWFjX3N0YXJ0X2RtYShzdHJ1Y3QgZHdfbWNpICpob3N0LCB1bnNpZ25lZCBpbnQgc2dfbGVuKQoreworCXUzMiB0ZW1wOworCWludCByZXQ7CisKKwlpZiAoaG9zdC0+ZG1hXzY0Yml0X2FkZHJlc3MgPT0gMSkKKwkJcmV0ID0gZHdfbWNpX3ByZXBhcmVfZGVzYzY0KGhvc3QsIGhvc3QtPmRhdGEsIHNnX2xlbik7CisJZWxzZQorCQlyZXQgPSBkd19tY2lfcHJlcGFyZV9kZXNjMzIoaG9zdCwgaG9zdC0+ZGF0YSwgc2dfbGVuKTsKKworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogZHJhaW4gd3JpdGVidWZmZXIgKi8KKwl3bWIoKTsKKworCS8qIE1ha2Ugc3VyZSB0byByZXNldCBETUEgaW4gY2FzZSB3ZSBkaWQgUElPIGJlZm9yZSB0aGlzICovCisJZHdfbWNpX2N0cmxfcmVzZXQoaG9zdCwgU0RNTUNfQ1RSTF9ETUFfUkVTRVQpOworCWR3X21jaV9pZG1hY19yZXNldChob3N0KTsKKworCS8qIFNlbGVjdCBJRE1BQyBpbnRlcmZhY2UgKi8KKwl0ZW1wID0gbWNpX3JlYWRsKGhvc3QsIENUUkwpOworCXRlbXAgfD0gU0RNTUNfQ1RSTF9VU0VfSURNQUM7CisJbWNpX3dyaXRlbChob3N0LCBDVFJMLCB0ZW1wKTsKKworCS8qIGRyYWluIHdyaXRlYnVmZmVyICovCisJd21iKCk7CisKKwkvKiBFbmFibGUgdGhlIElETUFDICovCisJdGVtcCA9IG1jaV9yZWFkbChob3N0LCBCTU9EKTsKKwl0ZW1wIHw9IFNETU1DX0lETUFDX0VOQUJMRSB8IFNETU1DX0lETUFDX0ZCOworCW1jaV93cml0ZWwoaG9zdCwgQk1PRCwgdGVtcCk7CisKKwkvKiBTdGFydCBpdCBydW5uaW5nICovCisJbWNpX3dyaXRlbChob3N0LCBQTERNTkQsIDEpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBkd19tY2lfZG1hX29wcyBkd19tY2lfaWRtYWNfb3BzID0gewogCS5pbml0ID0gZHdfbWNpX2lkbWFjX2luaXQsCiAJLnN0YXJ0ID0gZHdfbWNpX2lkbWFjX3N0YXJ0X2RtYSwKQEAgLTg3NiwxMSArOTM5LDggQEAKIAkgKiBNU0laRSBpcyAnMScsCiAJICogaWYgYmxrc3ogaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIEZJRk8gd2lkdGgKIAkgKi8KLQlpZiAoYmxrc3ogJSBmaWZvX3dpZHRoKSB7Ci0JCW1zaXplID0gMDsKLQkJcnhfd21hcmsgPSAxOworCWlmIChibGtzeiAlIGZpZm9fd2lkdGgpCiAJCWdvdG8gZG9uZTsKLQl9CiAKIAlkbyB7CiAJCWlmICghKChibGtzel9kZXB0aCAlIG1zenNbaWR4XSkgfHwKQEAgLTk5OCw4ICsxMDU4LDEwIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIAogCWlmIChob3N0LT5kbWFfb3BzLT5zdGFydChob3N0LCBzZ19sZW4pKSB7Ci0JCS8qIFdlIGNhbid0IGRvIERNQSAqLwotCQlkZXZfZXJyKGhvc3QtPmRldiwgIiVzOiBmYWlsZWQgdG8gc3RhcnQgRE1BLlxuIiwgX19mdW5jX18pOworCQkvKiBXZSBjYW4ndCBkbyBETUEsIHRyeSBQSU8gZm9yIHRoaXMgb25lICovCisJCWRldl9kYmcoaG9zdC0+ZGV2LAorCQkJIiVzOiBmYWxsIGJhY2sgdG8gUElPIG1vZGUgZm9yIGN1cnJlbnQgdHJhbnNmZXJcbiIsCisJCQlfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTExMiwxMSArMTE3NCwxMiBAQAogCiAJCWRpdiA9IChob3N0LT5idXNfaHogIT0gY2xvY2spID8gRElWX1JPVU5EX1VQKGRpdiwgMikgOiAwOwogCi0JCWRldl9pbmZvKCZzbG90LT5tbWMtPmNsYXNzX2RldiwKLQkJCSAiQnVzIHNwZWVkIChzbG90ICVkKSA9ICVkSHogKHNsb3QgcmVxICVkSHosIGFjdHVhbCAlZEhaIGRpdiA9ICVkKVxuIiwKLQkJCSBzbG90LT5pZCwgaG9zdC0+YnVzX2h6LCBjbG9jaywKLQkJCSBkaXYgPyAoKGhvc3QtPmJ1c19oeiAvIGRpdikgPj4gMSkgOgotCQkJIGhvc3QtPmJ1c19oeiwgZGl2KTsKKwkJaWYgKGNsb2NrICE9IHNsb3QtPl9fY2xrX29sZCB8fCBmb3JjZV9jbGtpbml0KQorCQkJZGV2X2luZm8oJnNsb3QtPm1tYy0+Y2xhc3NfZGV2LAorCQkJCSAiQnVzIHNwZWVkIChzbG90ICVkKSA9ICVkSHogKHNsb3QgcmVxICVkSHosIGFjdHVhbCAlZEhaIGRpdiA9ICVkKVxuIiwKKwkJCQkgc2xvdC0+aWQsIGhvc3QtPmJ1c19oeiwgY2xvY2ssCisJCQkJIGRpdiA/ICgoaG9zdC0+YnVzX2h6IC8gZGl2KSA+PiAxKSA6CisJCQkJIGhvc3QtPmJ1c19oeiwgZGl2KTsKIAogCQkvKiBkaXNhYmxlIGNsb2NrICovCiAJCW1jaV93cml0ZWwoaG9zdCwgQ0xLRU5BLCAwKTsKQEAgLTExMzksNiArMTIwMiw5IEBACiAKIAkJLyogaW5mb3JtIENJVSAqLwogCQltY2lfc2VuZF9jbWQoc2xvdCwgc2RtbWNfY21kX2JpdHMsIDApOworCisJCS8qIGtlZXAgdGhlIGxhc3QgY2xvY2sgdmFsdWUgdGhhdCB3YXMgcmVxdWVzdGVkIGZyb20gY29yZSAqLworCQlzbG90LT5fX2Nsa19vbGQgPSBjbG9jazsKIAl9CiAKIAlob3N0LT5jdXJyZW50X3NwZWVkID0gY2xvY2s7CkBAIC0xNjkxLDExICsxNzU3LDExIEBACiAJCQkJZGF0YS0+ZXJyb3IgPSAtRVRJTUVET1VUOwogCQkJfSBlbHNlIGlmIChob3N0LT5kaXJfc3RhdHVzID09CiAJCQkJCURXX01DSV9SRUNWX1NUQVRVUykgewotCQkJCWRhdGEtPmVycm9yID0gLUVJTzsKKwkJCQlkYXRhLT5lcnJvciA9IC1FSUxTRVE7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQkvKiBTRE1NQ19JTlRfU0JFIGlzIGluY2x1ZGVkICovCi0JCQlkYXRhLT5lcnJvciA9IC1FSU87CisJCQlkYXRhLT5lcnJvciA9IC1FSUxTRVE7CiAJCX0KIAogCQlkZXZfZGJnKGhvc3QtPmRldiwgImRhdGEgZXJyb3IsIHN0YXR1cyAweCUwOHhcbiIsIHN0YXR1cyk7CkBAIC0yNTIzLDQ3ICsyNTg5LDYgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLSNpZmRlZiBDT05GSUdfT0YKLS8qIGdpdmVuIGEgc2xvdCwgZmluZCBvdXQgdGhlIGRldmljZSBub2RlIHJlcHJlc2VudGluZyB0aGF0IHNsb3QgKi8KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmR3X21jaV9vZl9maW5kX3Nsb3Rfbm9kZShzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gc2xvdC0+bW1jLT5wYXJlbnQ7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQljb25zdCBfX2JlMzIgKmFkZHI7Ci0JaW50IGxlbjsKLQotCWlmICghZGV2IHx8ICFkZXYtPm9mX25vZGUpCi0JCXJldHVybiBOVUxMOwotCi0JZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShkZXYtPm9mX25vZGUsIG5wKSB7Ci0JCWFkZHIgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCAmbGVuKTsKLQkJaWYgKCFhZGRyIHx8IChsZW4gPCBzaXplb2YoaW50KSkpCi0JCQljb250aW51ZTsKLQkJaWYgKGJlMzJfdG9fY3B1cChhZGRyKSA9PSBzbG90LT5pZCkKLQkJCXJldHVybiBucDsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGR3X21jaV9zbG90X29mX3BhcnNlKHN0cnVjdCBkd19tY2lfc2xvdCAqc2xvdCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZHdfbWNpX29mX2ZpbmRfc2xvdF9ub2RlKHNsb3QpOwotCi0JaWYgKCFucCkKLQkJcmV0dXJuOwotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImRpc2FibGUtd3AiKSkgewotCQlzbG90LT5tbWMtPmNhcHMyIHw9IE1NQ19DQVAyX05PX1dSSVRFX1BST1RFQ1Q7Ci0JCWRldl93YXJuKHNsb3QtPm1tYy0+cGFyZW50LAotCQkJIlNsb3QgcXVpcmsgJ2Rpc2FibGUtd3AnIGlzIGRlcHJlY2F0ZWRcbiIpOwotCX0KLX0KLSNlbHNlIC8qIENPTkZJR19PRiAqLwotc3RhdGljIHZvaWQgZHdfbWNpX3Nsb3Rfb2ZfcGFyc2Uoc3RydWN0IGR3X21jaV9zbG90ICpzbG90KQotewotfQotI2VuZGlmIC8qIENPTkZJR19PRiAqLwotCiBzdGF0aWMgaW50IGR3X21jaV9pbml0X3Nsb3Qoc3RydWN0IGR3X21jaSAqaG9zdCwgdW5zaWduZWQgaW50IGlkKQogewogCXN0cnVjdCBtbWNfaG9zdCAqbW1jOwpAQCAtMjYyNiw4ICsyNjUxLDYgQEAKIAlpZiAoaG9zdC0+cGRhdGEtPmNhcHMyKQogCQltbWMtPmNhcHMyID0gaG9zdC0+cGRhdGEtPmNhcHMyOwogCi0JZHdfbWNpX3Nsb3Rfb2ZfcGFyc2Uoc2xvdCk7Ci0KIAlyZXQgPSBtbWNfb2ZfcGFyc2UobW1jKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9ob3N0X2FsbG9jYXRlZDsKQEAgLTI3MzIsNyArMjc1NSw4IEBACiAJCX0KIAogCQkvKiBBbGxvYyBtZW1vcnkgZm9yIHNnIHRyYW5zbGF0aW9uICovCi0JCWhvc3QtPnNnX2NwdSA9IGRtYW1fYWxsb2NfY29oZXJlbnQoaG9zdC0+ZGV2LCBQQUdFX1NJWkUsCisJCWhvc3QtPnNnX2NwdSA9IGRtYW1fYWxsb2NfY29oZXJlbnQoaG9zdC0+ZGV2LAorCQkJCQkJICAgREVTQ19SSU5HX0JVRl9TWiwKIAkJCQkJCSAgICZob3N0LT5zZ19kbWEsIEdGUF9LRVJORUwpOwogCQlpZiAoIWhvc3QtPnNnX2NwdSkgewogCQkJZGV2X2Vycihob3N0LT5kZXYsCkBAIC0yOTE1LDYgKzI5MzksMTMgQEAKIAlpZiAoIXBkYXRhKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAorCS8qIGZpbmQgcmVzZXQgY29udHJvbGxlciB3aGVuIGV4aXN0ICovCisJcGRhdGEtPnJzdGMgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0X29wdGlvbmFsKGRldiwgTlVMTCk7CisJaWYgKElTX0VSUihwZGF0YS0+cnN0YykpIHsKKwkJaWYgKFBUUl9FUlIocGRhdGEtPnJzdGMpID09IC1FUFJPQkVfREVGRVIpCisJCQlyZXR1cm4gRVJSX1BUUigtRVBST0JFX0RFRkVSKTsKKwl9CisKIAkvKiBmaW5kIG91dCBudW1iZXIgb2Ygc2xvdHMgc3VwcG9ydGVkICovCiAJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJudW0tc2xvdHMiLCAmcGRhdGEtPm51bV9zbG90cyk7CiAKQEAgLTI5MzMsMTEgKzI5NjQsNiBAQAogCQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAl9CiAKLQlpZiAob2ZfZmluZF9wcm9wZXJ0eShucCwgInN1cHBvcnRzLWhpZ2hzcGVlZCIsIE5VTEwpKSB7Ci0JCWRldl9pbmZvKGRldiwgInN1cHBvcnRzLWhpZ2hzcGVlZCBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLlxuIik7Ci0JCXBkYXRhLT5jYXBzIHw9IE1NQ19DQVBfU0RfSElHSFNQRUVEIHwgTU1DX0NBUF9NTUNfSElHSFNQRUVEOwotCX0KLQogCXJldHVybiBwZGF0YTsKIH0KIApAQCAtMjk4Niw3ICszMDEyLDkgQEAKIAogCWlmICghaG9zdC0+cGRhdGEpIHsKIAkJaG9zdC0+cGRhdGEgPSBkd19tY2lfcGFyc2VfZHQoaG9zdCk7Ci0JCWlmIChJU19FUlIoaG9zdC0+cGRhdGEpKSB7CisJCWlmIChQVFJfRVJSKGhvc3QtPnBkYXRhKSA9PSAtRVBST0JFX0RFRkVSKSB7CisJCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwkJfSBlbHNlIGlmIChJU19FUlIoaG9zdC0+cGRhdGEpKSB7CiAJCQlkZXZfZXJyKGhvc3QtPmRldiwgInBsYXRmb3JtIGRhdGEgbm90IGF2YWlsYWJsZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMzA0MCw2ICszMDY4LDEyIEBACiAJCX0KIAl9CiAKKwlpZiAoIUlTX0VSUihob3N0LT5wZGF0YS0+cnN0YykpIHsKKwkJcmVzZXRfY29udHJvbF9hc3NlcnQoaG9zdC0+cGRhdGEtPnJzdGMpOworCQl1c2xlZXBfcmFuZ2UoMTAsIDUwKTsKKwkJcmVzZXRfY29udHJvbF9kZWFzc2VydChob3N0LT5wZGF0YS0+cnN0Yyk7CisJfQorCiAJc2V0dXBfdGltZXIoJmhvc3QtPmNtZDExX3RpbWVyLAogCQkgICAgZHdfbWNpX2NtZDExX3RpbWVyLCAodW5zaWduZWQgbG9uZylob3N0KTsKIApAQCAtMzE4OSwxMyArMzIyMywxNCBAQAogCWlmIChob3N0LT51c2VfZG1hICYmIGhvc3QtPmRtYV9vcHMtPmV4aXQpCiAJCWhvc3QtPmRtYV9vcHMtPmV4aXQoaG9zdCk7CiAKKwlpZiAoIUlTX0VSUihob3N0LT5wZGF0YS0+cnN0YykpCisJCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KGhvc3QtPnBkYXRhLT5yc3RjKTsKKwogZXJyX2Nsa19jaXU6Ci0JaWYgKCFJU19FUlIoaG9zdC0+Y2l1X2NsaykpCi0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShob3N0LT5jaXVfY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoaG9zdC0+Y2l1X2Nsayk7CiAKIGVycl9jbGtfYml1OgotCWlmICghSVNfRVJSKGhvc3QtPmJpdV9jbGspKQotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoaG9zdC0+Yml1X2Nsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhvc3QtPmJpdV9jbGspOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTMyMjEsMTEgKzMyNTYsMTEgQEAKIAlpZiAoaG9zdC0+dXNlX2RtYSAmJiBob3N0LT5kbWFfb3BzLT5leGl0KQogCQlob3N0LT5kbWFfb3BzLT5leGl0KGhvc3QpOwogCi0JaWYgKCFJU19FUlIoaG9zdC0+Y2l1X2NsaykpCi0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShob3N0LT5jaXVfY2xrKTsKKwlpZiAoIUlTX0VSUihob3N0LT5wZGF0YS0+cnN0YykpCisJCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KGhvc3QtPnBkYXRhLT5yc3RjKTsKIAotCWlmICghSVNfRVJSKGhvc3QtPmJpdV9jbGspKQotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoaG9zdC0+Yml1X2Nsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhvc3QtPmNpdV9jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShob3N0LT5iaXVfY2xrKTsKIH0KIEVYUE9SVF9TWU1CT0woZHdfbWNpX3JlbW92ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmggYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5oCmluZGV4IDllNzQwYmMuLmU4Y2QyZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuaApAQCAtMjQ5LDYgKzI0OSw4IEBACiAgKiBAcXVldWVfbm9kZTogTGlzdCBub2RlIGZvciBwbGFjaW5nIHRoaXMgbm9kZSBpbiB0aGUgQHF1ZXVlIGxpc3Qgb2YKICAqCSZzdHJ1Y3QgZHdfbWNpLgogICogQGNsb2NrOiBDbG9jayByYXRlIGNvbmZpZ3VyZWQgYnkgc2V0X2lvcygpLiBQcm90ZWN0ZWQgYnkgaG9zdC0+bG9jay4KKyAqIEBfX2Nsa19vbGQ6IFRoZSBsYXN0IGNsb2NrIHZhbHVlIHRoYXQgd2FzIHJlcXVlc3RlZCBmcm9tIGNvcmUuCisgKglLZWVwaW5nIHRyYWNrIG9mIHRoaXMgaGVscHMgdXMgdG8gYXZvaWQgc3BhbW1pbmcgdGhlIGNvbnNvbGUuCiAgKiBAZmxhZ3M6IFJhbmRvbSBzdGF0ZSBiaXRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2xvdC4KICAqIEBpZDogTnVtYmVyIG9mIHRoaXMgc2xvdC4KICAqIEBzZGlvX2lkOiBOdW1iZXIgb2YgdGhpcyBzbG90IGluIHRoZSBTRElPIGludGVycnVwdCByZWdpc3RlcnMuCkBAIC0yNjMsNiArMjY1LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXF1ZXVlX25vZGU7CiAKIAl1bnNpZ25lZCBpbnQJCWNsb2NrOworCXVuc2lnbmVkIGludAkJX19jbGtfb2xkOwogCiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAjZGVmaW5lIERXX01NQ19DQVJEX1BSRVNFTlQJMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9tb3hhcnQtbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L21veGFydC1tbWMuYwppbmRleCA3OTkwNWNlLi5iYmFkMzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L21veGFydC1tbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L21veGFydC1tbWMuYwpAQCAtMjU3LDcgKzI1Nyw3IEBACiBzdGF0aWMgdm9pZCBtb3hhcnRfdHJhbnNmZXJfZG1hKHN0cnVjdCBtbWNfZGF0YSAqZGF0YSwgc3RydWN0IG1veGFydF9ob3N0ICpob3N0KQogewogCXUzMiBsZW4sIGRpcl9kYXRhLCBkaXJfc2xhdmU7Ci0JdW5zaWduZWQgbG9uZyBkbWFfdGltZTsKKwlsb25nIGRtYV90aW1lOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYyA9IE5VTEw7CiAJc3RydWN0IGRtYV9jaGFuICpkbWFfY2hhbjsKIApAQCAtMzk3LDcgKzM5Nyw4IEBACiBzdGF0aWMgdm9pZCBtb3hhcnRfcmVxdWVzdChzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCiB7CiAJc3RydWN0IG1veGFydF9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKLQl1bnNpZ25lZCBsb25nIHBpb190aW1lLCBmbGFnczsKKwlsb25nIHBpb190aW1lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIHN0YXR1czsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L29tYXAuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvb21hcC5jCmluZGV4IGYyM2Q2NWUuLmJlM2M0OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvb21hcC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvb21hcC5jCkBAIC0xMDE2LDE0ICsxMDE2LDE2IEBACiAKIAkJLyogT25seSByZWNvbmZpZ3VyZSBpZiB3ZSBoYXZlIGEgZGlmZmVyZW50IGJ1cnN0IHNpemUgKi8KIAkJaWYgKCpicCAhPSBidXJzdCkgewotCQkJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgY2ZnOwotCi0JCQljZmcuc3JjX2FkZHIgPSBob3N0LT5waHlzX2Jhc2UgKyBPTUFQX01NQ19SRUcoaG9zdCwgREFUQSk7Ci0JCQljZmcuZHN0X2FkZHIgPSBob3N0LT5waHlzX2Jhc2UgKyBPTUFQX01NQ19SRUcoaG9zdCwgREFUQSk7Ci0JCQljZmcuc3JjX2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMl9CWVRFUzsKLQkJCWNmZy5kc3RfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8yX0JZVEVTOwotCQkJY2ZnLnNyY19tYXhidXJzdCA9IGJ1cnN0OwotCQkJY2ZnLmRzdF9tYXhidXJzdCA9IGJ1cnN0OworCQkJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgY2ZnID0geworCQkJCS5zcmNfYWRkciA9IGhvc3QtPnBoeXNfYmFzZSArCisJCQkJCSAgICBPTUFQX01NQ19SRUcoaG9zdCwgREFUQSksCisJCQkJLmRzdF9hZGRyID0gaG9zdC0+cGh5c19iYXNlICsKKwkJCQkJICAgIE9NQVBfTU1DX1JFRyhob3N0LCBEQVRBKSwKKwkJCQkuc3JjX2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMl9CWVRFUywKKwkJCQkuZHN0X2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMl9CWVRFUywKKwkJCQkuc3JjX21heGJ1cnN0ID0gYnVyc3QsCisJCQkJLmRzdF9tYXhidXJzdCA9IGJ1cnN0LAorCQkJfTsKIAogCQkJaWYgKGRtYWVuZ2luZV9zbGF2ZV9jb25maWcoYywgJmNmZykpCiAJCQkJZ290byB1c2VfcGlvOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9vbWFwX2hzbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L29tYXBfaHNtbWMuYwppbmRleCAyNGViYzlhLi41ZjJmMjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L29tYXBfaHNtbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L29tYXBfaHNtbWMuYwpAQCAtMTQwOSwxMSArMTQwOSwxOCBAQAogc3RhdGljIGludCBvbWFwX2hzbW1jX3NldHVwX2RtYV90cmFuc2ZlcihzdHJ1Y3Qgb21hcF9oc21tY19ob3N0ICpob3N0LAogCQkJCQlzdHJ1Y3QgbW1jX3JlcXVlc3QgKnJlcSkKIHsKLQlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBjZmc7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eDsKIAlpbnQgcmV0ID0gMCwgaTsKIAlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEgPSByZXEtPmRhdGE7CiAJc3RydWN0IGRtYV9jaGFuICpjaGFuOworCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGNmZyA9IHsKKwkJLnNyY19hZGRyID0gaG9zdC0+bWFwYmFzZSArIE9NQVBfSFNNTUNfREFUQSwKKwkJLmRzdF9hZGRyID0gaG9zdC0+bWFwYmFzZSArIE9NQVBfSFNNTUNfREFUQSwKKwkJLnNyY19hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVMsCisJCS5kc3RfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTLAorCQkuc3JjX21heGJ1cnN0ID0gZGF0YS0+Ymxrc3ogLyA0LAorCQkuZHN0X21heGJ1cnN0ID0gZGF0YS0+Ymxrc3ogLyA0LAorCX07CiAKIAkvKiBTYW5pdHkgY2hlY2s6IGFsbCB0aGUgU0cgZW50cmllcyBtdXN0IGJlIGFsaWduZWQgYnkgYmxvY2sgc2l6ZS4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+c2dfbGVuOyBpKyspIHsKQEAgLTE0MzMsMTMgKzE0NDAsNiBAQAogCiAJY2hhbiA9IG9tYXBfaHNtbWNfZ2V0X2RtYV9jaGFuKGhvc3QsIGRhdGEpOwogCi0JY2ZnLnNyY19hZGRyID0gaG9zdC0+bWFwYmFzZSArIE9NQVBfSFNNTUNfREFUQTsKLQljZmcuZHN0X2FkZHIgPSBob3N0LT5tYXBiYXNlICsgT01BUF9IU01NQ19EQVRBOwotCWNmZy5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOwotCWNmZy5kc3RfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOwotCWNmZy5zcmNfbWF4YnVyc3QgPSBkYXRhLT5ibGtzeiAvIDQ7Ci0JY2ZnLmRzdF9tYXhidXJzdCA9IGRhdGEtPmJsa3N6IC8gNDsKLQogCXJldCA9IGRtYWVuZ2luZV9zbGF2ZV9jb25maWcoY2hhbiwgJmNmZyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvcnRzeF9wY2lfc2RtbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3QvcnRzeF9wY2lfc2RtbWMuYwppbmRleCAzOTZjOWI3Li4zY2NhYTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3J0c3hfcGNpX3NkbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9ydHN4X3BjaV9zZG1tYy5jCkBAIC0xMjYsNyArMTI2LDcgQEAKIAkJcmV0dXJuIFNEX1JTUF9UWVBFX1IwOwogCWNhc2UgTU1DX1JTUF9SMToKIAkJcmV0dXJuIFNEX1JTUF9UWVBFX1IxOwotCWNhc2UgTU1DX1JTUF9SMSAmIH5NTUNfUlNQX0NSQzoKKwljYXNlIE1NQ19SU1BfUjFfTk9fQ1JDOgogCQlyZXR1cm4gU0RfUlNQX1RZUEVfUjEgfCBTRF9OT19DSEVDS19DUkM3OwogCWNhc2UgTU1DX1JTUF9SMUI6CiAJCXJldHVybiBTRF9SU1BfVFlQRV9SMWI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3J0c3hfdXNiX3NkbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L3J0c3hfdXNiX3NkbW1jLmMKaW5kZXggNmM3MWZjOS4uNDEwNjI5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9ydHN4X3VzYl9zZG1tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvcnRzeF91c2Jfc2RtbWMuYwpAQCAtMzI0LDcgKzMyNCw3IEBACiAJY2FzZSBNTUNfUlNQX1IxOgogCQlyc3BfdHlwZSA9IFNEX1JTUF9UWVBFX1IxOwogCQlicmVhazsKLQljYXNlIE1NQ19SU1BfUjEgJiB+TU1DX1JTUF9DUkM6CisJY2FzZSBNTUNfUlNQX1IxX05PX0NSQzoKIAkJcnNwX3R5cGUgPSBTRF9SU1BfVFlQRV9SMSB8IFNEX05PX0NIRUNLX0NSQzc7CiAJCWJyZWFrOwogCWNhc2UgTU1DX1JTUF9SMUI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWFjcGkuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktYWNwaS5jCmluZGV4IDhmZTA3NTYuLjgxZDRkYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktYWNwaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktYWNwaS5jCkBAIC0yNzUsNyArMjc1LDcgQEAKIAkuY2hpcCAgICA9ICZzZGhjaV9hY3BpX2NoaXBfaW50LAogCS5jYXBzICAgID0gTU1DX0NBUF84X0JJVF9EQVRBIHwgTU1DX0NBUF9OT05SRU1PVkFCTEUgfAogCQkgICBNTUNfQ0FQX0hXX1JFU0VUIHwgTU1DX0NBUF8xXzhWX0REUiB8Ci0JCSAgIE1NQ19DQVBfV0FJVF9XSElMRV9CVVNZLAorCQkgICBNTUNfQ0FQX0NNRF9EVVJJTkdfVEZSIHwgTU1DX0NBUF9XQUlUX1dISUxFX0JVU1ksCiAJLmNhcHMyICAgPSBNTUNfQ0FQMl9IQ19FUkFTRV9TWiwKIAkuZmxhZ3MgICA9IFNESENJX0FDUElfUlVOVElNRV9QTSwKIAkucXVpcmtzICA9IFNESENJX1FVSVJLX05PX0VOREFUVFJfSU5fTk9QREVTQywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktYmNtLWtvbmEuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktYmNtLWtvbmEuYwppbmRleCBlNWM2MzRiLi41MWRkMmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWJjbS1rb25hLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1iY20ta29uYS5jCkBAIC0yNTMsMTIgKzI1MywxNCBAQAogCQlnb3RvIGVycl9wbHRmbV9mcmVlOwogCX0KIAotCWlmIChjbGtfc2V0X3JhdGUocGx0Zm1fcHJpdi0+Y2xrLCBob3N0LT5tbWMtPmZfbWF4KSAhPSAwKSB7CisJcmV0ID0gY2xrX3NldF9yYXRlKHBsdGZtX3ByaXYtPmNsaywgaG9zdC0+bW1jLT5mX21heCk7CisJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgcmF0ZSBjb3JlIGNsb2NrXG4iKTsKIAkJZ290byBlcnJfcGx0Zm1fZnJlZTsKIAl9CiAKLQlpZiAoY2xrX3ByZXBhcmVfZW5hYmxlKHBsdGZtX3ByaXYtPmNsaykgIT0gMCkgeworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwbHRmbV9wcml2LT5jbGspOworCWlmIChyZXQpIHsKIAkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIGNvcmUgY2xvY2tcbiIpOwogCQlnb3RvIGVycl9wbHRmbV9mcmVlOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktYnJjbXN0Yi5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1icmNtc3RiLmMKaW5kZXggY2NlMTBmZS4uMTU5ZjZmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1icmNtc3RiLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1icmNtc3RiLmMKQEAgLTk4LDYgKzk4LDggQEAKIAkgKiBwcm9wZXJ0aWVzIHRocm91Z2ggbW1jX29mX3BhcnNlKCkuCiAJICovCiAJaG9zdC0+Y2FwcyA9IHNkaGNpX3JlYWRsKGhvc3QsIFNESENJX0NBUEFCSUxJVElFUyk7CisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKHBkZXYtPmRldi5vZl9ub2RlLCAiYnJjbSxiY203NDI1LXNkaGNpIikpCisJCWhvc3QtPmNhcHMgJj0gflNESENJX0NBTl82NEJJVDsKIAlob3N0LT5jYXBzMSA9IHNkaGNpX3JlYWRsKGhvc3QsIFNESENJX0NBUEFCSUxJVElFU18xKTsKIAlob3N0LT5jYXBzMSAmPSB+KFNESENJX1NVUFBPUlRfU0RSNTAgfCBTREhDSV9TVVBQT1JUX1NEUjEwNCB8CiAJCQlTREhDSV9TVVBQT1JUX0REUjUwKTsKQEAgLTEyMSw2ICsxMjMsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzZGhjaV9icmNtX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJicmNtLGJjbTc0MjUtc2RoY2kiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJicmNtLGJjbTc0NDUtc2RoY2kiIH0sCiAJe30sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2RoY2lfYnJjbV9vZl9tYXRjaCk7CkBAIC0xMjgsNyArMTMxLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNkaGNpX2JyY21zdGJfZHJpdmVyID0gewogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJzZGhjaS1icmNtc3RiIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJCS5wbQk9ICZzZGhjaV9icmNtc3RiX3Btb3BzLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoc2RoY2lfYnJjbV9vZl9tYXRjaCksCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZXNkaGMtaW14LmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWVzZGhjLWlteC5jCmluZGV4IDk5ZTBiMzMuLjFmNTRmZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZXNkaGMtaW14LmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1lc2RoYy1pbXguYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgInNkaGNpLXBsdGZtLmgiCiAjaW5jbHVkZSAic2RoY2ktZXNkaGMuaCIKIAorI2RlZmluZSBFU0RIQ19TWVNfQ1RSTF9EVE9DVl9NQVNLCTB4MGYKICNkZWZpbmUJRVNESENfQ1RSTF9EM0NECQkJMHgwOAogI2RlZmluZSBFU0RIQ19CVVJTVF9MRU5fRU5fSU5DUgkJKDEgPDwgMjcpCiAvKiBWRU5ET1IgU1BFQyByZWdpc3RlciAqLwpAQCAtOTI4LDcgKzkyOSw4IEBACiAJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOwogCXN0cnVjdCBwbHRmbV9pbXhfZGF0YSAqaW14X2RhdGEgPSBzZGhjaV9wbHRmbV9wcml2KHBsdGZtX2hvc3QpOwogCi0JcmV0dXJuIGVzZGhjX2lzX3VzZGhjKGlteF9kYXRhKSA/IDEgPDwgMjggOiAxIDw8IDI3OworCS8qIERvYyBFcnJhdGE6IHRoZSB1U0RIQyBhY3R1YWwgbWF4aW11bSB0aW1lb3V0IGNvdW50IGlzIDEgPDwgMjkgKi8KKwlyZXR1cm4gZXNkaGNfaXNfdXNkaGMoaW14X2RhdGEpID8gMSA8PCAyOSA6IDEgPDwgMjc7CiB9CiAKIHN0YXRpYyB2b2lkIGVzZGhjX3NldF90aW1lb3V0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCkKQEAgLTkzNyw3ICs5MzksOCBAQAogCXN0cnVjdCBwbHRmbV9pbXhfZGF0YSAqaW14X2RhdGEgPSBzZGhjaV9wbHRmbV9wcml2KHBsdGZtX2hvc3QpOwogCiAJLyogdXNlIG1heGltdW0gdGltZW91dCBjb3VudGVyICovCi0Jc2RoY2lfd3JpdGViKGhvc3QsIGVzZGhjX2lzX3VzZGhjKGlteF9kYXRhKSA/IDB4RiA6IDB4RSwKKwllc2RoY19jbHJzZXRfbGUoaG9zdCwgRVNESENfU1lTX0NUUkxfRFRPQ1ZfTUFTSywKKwkJCWVzZGhjX2lzX3VzZGhjKGlteF9kYXRhKSA/IDB4RiA6IDB4RSwKIAkJCVNESENJX1RJTUVPVVRfQ09OVFJPTCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtYXJhc2FuLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWFyYXNhbi5jCmluZGV4IGUwZjE5M2YuLmRhOGU0MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtYXJhc2FuLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1hcmFzYW4uYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlICJzZGhjaS1wbHRmbS5oIgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKICNkZWZpbmUgU0RIQ0lfQVJBU0FOX0NMS19DVFJMX09GRlNFVAkweDJjCiAjZGVmaW5lIFNESENJX0FSQVNBTl9WRU5ET1JfUkVHSVNURVIJMHg3OApAQCAtMzUsNiArMzYsOCBAQAogI2RlZmluZSBDTEtfQ1RSTF9USU1FT1VUX01BU0sJCSgweGYgPDwgQ0xLX0NUUkxfVElNRU9VVF9TSElGVCkKICNkZWZpbmUgQ0xLX0NUUkxfVElNRU9VVF9NSU5fRVhQCTEzCiAKKyNkZWZpbmUgUEhZX0NMS19UT09fU0xPV19IWgkJNDAwMDAwCisKIC8qCiAgKiBPbiBzb21lIFNvQ3MgdGhlIHN5c2NvbiBhcmVhIGhhcyBhIGZlYXR1cmUgd2hlcmUgdGhlIHVwcGVyIDE2LWJpdHMgb2YKICAqIGVhY2ggMzItYml0IHJlZ2lzdGVyIGFjdCBhcyBhIHdyaXRlIG1hc2sgZm9yIHRoZSBsb3dlciAxNi1iaXRzLiAgVGhpcyBhbGxvd3MKQEAgLTY1LDEwICs2OCwxMiBAQAogICogYWNjZXNzaWJsZSB2aWEgdGhlIHN5c2NvbiBBUEkuCiAgKgogICogQGJhc2VjbGtmcmVxOglXaGVyZSB0byBmaW5kIGNvcmVjZmdfYmFzZWNsa2ZyZXEKKyAqIEBjbG9ja211bHRpcGxpZXI6CVdoZXJlIHRvIGZpbmQgY29yZWNmZ19jbG9ja211bHRpcGxpZXIKICAqIEBoaXdvcmRfdXBkYXRlOglJZiB0cnVlLCB1c2UgSElXT1JEX1VQREFURSB0byBhY2Nlc3MgdGhlIHN5c2NvbgogICovCiBzdHJ1Y3Qgc2RoY2lfYXJhc2FuX3NvY19jdGxfbWFwIHsKIAlzdHJ1Y3Qgc2RoY2lfYXJhc2FuX3NvY19jdGxfZmllbGQJYmFzZWNsa2ZyZXE7CisJc3RydWN0IHNkaGNpX2FyYXNhbl9zb2NfY3RsX2ZpZWxkCWNsb2NrbXVsdGlwbGllcjsKIAlib29sCQkJCQloaXdvcmRfdXBkYXRlOwogfTsKIApAQCAtNzcsNiArODIsNyBAQAogICogQGhvc3Q6CQlQb2ludGVyIHRvIHRoZSBtYWluIFNESENJIGhvc3Qgc3RydWN0dXJlLgogICogQGNsa19haGI6CQlQb2ludGVyIHRvIHRoZSBBSEIgY2xvY2sKICAqIEBwaHk6CQlQb2ludGVyIHRvIHRoZSBnZW5lcmljIHBoeQorICogQGlzX3BoeV9vbjoJCVRydWUgaWYgdGhlIFBIWSBpcyBvbjsgZmFsc2UgaWYgbm90LgogICogQHNkY2FyZGNsa19odzoJU3RydWN0IGZvciB0aGUgY2xvY2sgd2UgbWlnaHQgcHJvdmlkZSB0byBhIFBIWS4KICAqIEBzZGNhcmRjbGs6CQlQb2ludGVyIHRvIG5vcm1hbCAnc3RydWN0IGNsb2NrJyBmb3Igc2RjYXJkY2xrX2h3LgogICogQHNvY19jdGxfYmFzZToJUG9pbnRlciB0byByZWdtYXAgZm9yIHN5c2NvbiBmb3Igc29jX2N0bCByZWdpc3RlcnMuCkBAIC04NiwxNiArOTIsMjIgQEAKIAlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdDsKIAlzdHJ1Y3QgY2xrCSpjbGtfYWhiOwogCXN0cnVjdCBwaHkJKnBoeTsKKwlib29sCQlpc19waHlfb247CiAKIAlzdHJ1Y3QgY2xrX2h3CXNkY2FyZGNsa19odzsKIAlzdHJ1Y3QgY2xrICAgICAgKnNkY2FyZGNsazsKIAogCXN0cnVjdCByZWdtYXAJKnNvY19jdGxfYmFzZTsKIAljb25zdCBzdHJ1Y3Qgc2RoY2lfYXJhc2FuX3NvY19jdGxfbWFwICpzb2NfY3RsX21hcDsKKwl1bnNpZ25lZCBpbnQJcXVpcmtzOyAvKiBBcmFzYW4gZGV2aWF0aW9ucyBmcm9tIHNwZWMgKi8KKworLyogQ29udHJvbGxlciBkb2VzIG5vdCBoYXZlIENEIHdpcmVkIGFuZCB3aWxsIG5vdCBmdW5jdGlvbiBub3JtYWxseSB3aXRob3V0ICovCisjZGVmaW5lIFNESENJX0FSQVNBTl9RVUlSS19GT1JDRV9DRFRFU1QJQklUKDApCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNkaGNpX2FyYXNhbl9zb2NfY3RsX21hcCByazMzOTlfc29jX2N0bF9tYXAgPSB7CiAJLmJhc2VjbGtmcmVxID0geyAucmVnID0gMHhmMDAwLCAud2lkdGggPSA4LCAuc2hpZnQgPSA4IH0sCisJLmNsb2NrbXVsdGlwbGllciA9IHsgLnJlZyA9IDB4ZjAyYywgLndpZHRoID0gOCwgLnNoaWZ0ID0gMH0sCiAJLmhpd29yZF91cGRhdGUgPSB0cnVlLAogfTsKIApAQCAtMTcwLDEzICsxODIsNDcgQEAKIAlzdHJ1Y3Qgc2RoY2lfYXJhc2FuX2RhdGEgKnNkaGNpX2FyYXNhbiA9IHNkaGNpX3BsdGZtX3ByaXYocGx0Zm1faG9zdCk7CiAJYm9vbCBjdHJsX3BoeSA9IGZhbHNlOwogCi0JaWYgKGNsb2NrID4gTU1DX0hJR0hfNTJfTUFYX0RUUiAmJiAoIUlTX0VSUihzZGhjaV9hcmFzYW4tPnBoeSkpKQotCQljdHJsX3BoeSA9IHRydWU7CisJaWYgKCFJU19FUlIoc2RoY2lfYXJhc2FuLT5waHkpKSB7CisJCWlmICghc2RoY2lfYXJhc2FuLT5pc19waHlfb24gJiYgY2xvY2sgPD0gUEhZX0NMS19UT09fU0xPV19IWikgeworCQkJLyoKKwkJCSAqIElmIFBIWSBvZmYsIHNldCBjbG9jayB0byBtYXggc3BlZWQgYW5kIHBvd2VyIFBIWSBvbi4KKwkJCSAqCisJCQkgKiBBbHRob3VnaCBQSFkgZG9jcyBhcHBhcmVudGx5IHN1Z2dlc3QgcG93ZXIgY3ljbGluZworCQkJICogd2hlbiBjaGFuZ2luZyB0aGUgY2xvY2sgdGhlIFBIWSBkb2Vzbid0IGxpa2UgdG8gYmUKKwkJCSAqIHBvd2VyZWQgb24gd2hpbGUgYXQgbG93IHNwZWVkcyBsaWtlIHRob3NlIHVzZWQgaW4gSUQKKwkJCSAqIG1vZGUuICBFdmVuIHdvcnNlIGlzIHBvd2VyaW5nIHRoZSBQSFkgb24gd2hpbGUgdGhlCisJCQkgKiBjbG9jayBpcyBvZmYuCisJCQkgKgorCQkJICogVG8gd29ya2Fyb3VuZCB0aGUgUEhZIGxpbWl0YXRpb25zLCB0aGUgYmVzdCB3ZSBjYW4KKwkJCSAqIGRvIGlzIHRvIHBvd2VyIGl0IG9uIGF0IGEgZmFzdGVyIHNwZWVkIGFuZCB0aGVuIHNsYW0KKwkJCSAqIHRocm91Z2ggbG93IHNwZWVkcyB3aXRob3V0IHBvd2VyIGN5Y2xpbmcuCisJCQkgKi8KKwkJCXNkaGNpX3NldF9jbG9jayhob3N0LCBob3N0LT5tYXhfY2xrKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmaG9zdC0+bG9jayk7CisJCQlwaHlfcG93ZXJfb24oc2RoY2lfYXJhc2FuLT5waHkpOworCQkJc3Bpbl9sb2NrX2lycSgmaG9zdC0+bG9jayk7CisJCQlzZGhjaV9hcmFzYW4tPmlzX3BoeV9vbiA9IHRydWU7CiAKLQlpZiAoY3RybF9waHkpIHsKKwkJCS8qCisJCQkgKiBXZSdsbCBub3cgZmFsbCB0aHJvdWdoIHRvIHRoZSBiZWxvdyBjYXNlIHdpdGgKKwkJCSAqIGN0cmxfcGh5ID0gZmFsc2UgKHNvIHdlIHdvbid0IHR1cm4gb2ZmL29uKS4gIFRoZQorCQkJICogc2RoY2lfc2V0X2Nsb2NrKCkgd2lsbCBzZXQgdGhlIHJlYWwgY2xvY2suCisJCQkgKi8KKwkJfSBlbHNlIGlmIChjbG9jayA+IFBIWV9DTEtfVE9PX1NMT1dfSFopIHsKKwkJCS8qCisJCQkgKiBBdCBoaWdoZXIgY2xvY2sgc3BlZWRzIHRoZSBQSFkgaXMgZmluZSBiZWluZyBwb3dlcgorCQkJICogY3ljbGVkIGFuZCBkb2NzIHNheSB5b3UgX3Nob3VsZF8gcG93ZXIgY3ljbGUgd2hlbgorCQkJICogY2hhbmdpbmcgY2xvY2sgc3BlZWRzLgorCQkJICovCisJCQljdHJsX3BoeSA9IHRydWU7CisJCX0KKwl9CisKKwlpZiAoY3RybF9waHkgJiYgc2RoY2lfYXJhc2FuLT5pc19waHlfb24pIHsKIAkJc3Bpbl91bmxvY2tfaXJxKCZob3N0LT5sb2NrKTsKIAkJcGh5X3Bvd2VyX29mZihzZGhjaV9hcmFzYW4tPnBoeSk7CiAJCXNwaW5fbG9ja19pcnEoJmhvc3QtPmxvY2spOworCQlzZGhjaV9hcmFzYW4tPmlzX3BoeV9vbiA9IGZhbHNlOwogCX0KIAogCXNkaGNpX3NldF9jbG9jayhob3N0LCBjbG9jayk7CkBAIC0xODUsNiArMjMxLDcgQEAKIAkJc3Bpbl91bmxvY2tfaXJxKCZob3N0LT5sb2NrKTsKIAkJcGh5X3Bvd2VyX29uKHNkaGNpX2FyYXNhbi0+cGh5KTsKIAkJc3Bpbl9sb2NrX2lycSgmaG9zdC0+bG9jayk7CisJCXNkaGNpX2FyYXNhbi0+aXNfcGh5X29uID0gdHJ1ZTsKIAl9CiB9CiAKQEAgLTIwMywxMiArMjUwLDI3IEBACiAJd3JpdGVsKHZlbmRvciwgaG9zdC0+aW9hZGRyICsgU0RIQ0lfQVJBU0FOX1ZFTkRPUl9SRUdJU1RFUik7CiB9CiAKK3ZvaWQgc2RoY2lfYXJhc2FuX3Jlc2V0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1OCBtYXNrKQoreworCXU4IGN0cmw7CisJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOworCXN0cnVjdCBzZGhjaV9hcmFzYW5fZGF0YSAqc2RoY2lfYXJhc2FuID0gc2RoY2lfcGx0Zm1fcHJpdihwbHRmbV9ob3N0KTsKKworCXNkaGNpX3Jlc2V0KGhvc3QsIG1hc2spOworCisJaWYgKHNkaGNpX2FyYXNhbi0+cXVpcmtzICYgU0RIQ0lfQVJBU0FOX1FVSVJLX0ZPUkNFX0NEVEVTVCkgeworCQljdHJsID0gc2RoY2lfcmVhZGIoaG9zdCwgU0RIQ0lfSE9TVF9DT05UUk9MKTsKKwkJY3RybCB8PSBTREhDSV9DVFJMX0NEVEVTVF9JTlMgfCBTREhDSV9DVFJMX0NEVEVTVF9FTjsKKwkJc2RoY2lfd3JpdGViKGhvc3QsIGN0cmwsIFNESENJX0hPU1RfQ09OVFJPTCk7CisJfQorfQorCiBzdGF0aWMgc3RydWN0IHNkaGNpX29wcyBzZGhjaV9hcmFzYW5fb3BzID0gewogCS5zZXRfY2xvY2sgPSBzZGhjaV9hcmFzYW5fc2V0X2Nsb2NrLAogCS5nZXRfbWF4X2Nsb2NrID0gc2RoY2lfcGx0Zm1fY2xrX2dldF9tYXhfY2xvY2ssCiAJLmdldF90aW1lb3V0X2Nsb2NrID0gc2RoY2lfYXJhc2FuX2dldF90aW1lb3V0X2Nsb2NrLAogCS5zZXRfYnVzX3dpZHRoID0gc2RoY2lfc2V0X2J1c193aWR0aCwKLQkucmVzZXQgPSBzZGhjaV9yZXNldCwKKwkucmVzZXQgPSBzZGhjaV9hcmFzYW5fcmVzZXQsCiAJLnNldF91aHNfc2lnbmFsaW5nID0gc2RoY2lfc2V0X3Voc19zaWduYWxpbmcsCiB9OwogCkBAIC0yMzksMTMgKzMwMSwxNCBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoIUlTX0VSUihzZGhjaV9hcmFzYW4tPnBoeSkpIHsKKwlpZiAoIUlTX0VSUihzZGhjaV9hcmFzYW4tPnBoeSkgJiYgc2RoY2lfYXJhc2FuLT5pc19waHlfb24pIHsKIAkJcmV0ID0gcGh5X3Bvd2VyX29mZihzZGhjaV9hcmFzYW4tPnBoeSk7CiAJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoZGV2LCAiQ2Fubm90IHBvd2VyIG9mZiBwaHkuXG4iKTsKIAkJCXNkaGNpX3Jlc3VtZV9ob3N0KGhvc3QpOwogCQkJcmV0dXJuIHJldDsKIAkJfQorCQlzZGhjaV9hcmFzYW4tPmlzX3BoeV9vbiA9IGZhbHNlOwogCX0KIAogCWNsa19kaXNhYmxlKHBsdGZtX2hvc3QtPmNsayk7CkBAIC0yODEsMTIgKzM0NCwxMyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmICghSVNfRVJSKHNkaGNpX2FyYXNhbi0+cGh5KSkgeworCWlmICghSVNfRVJSKHNkaGNpX2FyYXNhbi0+cGh5KSAmJiBob3N0LT5tbWMtPmFjdHVhbF9jbG9jaykgewogCQlyZXQgPSBwaHlfcG93ZXJfb24oc2RoY2lfYXJhc2FuLT5waHkpOwogCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBwb3dlciBvbiBwaHkuXG4iKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KKwkJc2RoY2lfYXJhc2FuLT5pc19waHlfb24gPSB0cnVlOwogCX0KIAogCXJldHVybiBzZGhjaV9yZXN1bWVfaG9zdChob3N0KTsKQEAgLTMzOCw2ICs0MDIsNDUgQEAKIH07CiAKIC8qKgorICogc2RoY2lfYXJhc2FuX3VwZGF0ZV9jbG9ja211bHRpcGxpZXIgLSBTZXQgY29yZWNmZ19jbG9ja211bHRpcGxpZXIKKyAqCisgKiBUaGUgY29yZWNmZ19jbG9ja211bHRpcGxpZXIgaXMgc3VwcG9zZWQgdG8gY29udGFpbiBjbG9jayBtdWx0aXBsaWVyCisgKiB2YWx1ZSBvZiBwcm9ncmFtbWFibGUgY2xvY2sgZ2VuZXJhdG9yLgorICoKKyAqIE5PVEVTOgorICogLSBNYW55IGV4aXN0aW5nIGRldmljZXMgZG9uJ3Qgc2VlbSB0byBkbyB0aGlzIGFuZCB3b3JrIGZpbmUuICBUbyBrZWVwCisgKiAgIGNvbXBhdGliaWxpdHkgZm9yIG9sZCBoYXJkd2FyZSB3aGVyZSB0aGUgZGV2aWNlIHRyZWUgZG9lc24ndCBwcm92aWRlIGEKKyAqICAgcmVnaXN0ZXIgbWFwLCB0aGlzIGZ1bmN0aW9uIGlzIGEgbm9vcCBpZiBhIHNvY19jdGxfbWFwIGhhc24ndCBiZWVuIHByb3ZpZGVkCisgKiAgIGZvciB0aGlzIHBsYXRmb3JtLgorICogLSBUaGUgdmFsdWUgb2YgY29yZWNmZ19jbG9ja211bHRpcGxpZXIgc2hvdWxkIHN5bmMgd2l0aCB0aGF0IG9mIGNvcnJlc3BvbmRpbmcKKyAqICAgdmFsdWUgcmVhZGluZyBmcm9tIHNkaGNpX2NhcGFiaWxpdHlfcmVnaXN0ZXIuIFNvIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCisgKiAgIG9uY2UgYXQgcHJvYmUgdGltZSBhbmQgbmV2ZXIgY2FsbGVkIGFnYWluLgorICoKKyAqIEBob3N0OgkJVGhlIHNkaGNpX2hvc3QKKyAqLworc3RhdGljIHZvaWQgc2RoY2lfYXJhc2FuX3VwZGF0ZV9jbG9ja211bHRpcGxpZXIoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsCisJCQkJCQl1MzIgdmFsdWUpCit7CisJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOworCXN0cnVjdCBzZGhjaV9hcmFzYW5fZGF0YSAqc2RoY2lfYXJhc2FuID0gc2RoY2lfcGx0Zm1fcHJpdihwbHRmbV9ob3N0KTsKKwljb25zdCBzdHJ1Y3Qgc2RoY2lfYXJhc2FuX3NvY19jdGxfbWFwICpzb2NfY3RsX21hcCA9CisJCXNkaGNpX2FyYXNhbi0+c29jX2N0bF9tYXA7CisKKwkvKiBIYXZpbmcgYSBtYXAgaXMgb3B0aW9uYWwgKi8KKwlpZiAoIXNvY19jdGxfbWFwKQorCQlyZXR1cm47CisKKwkvKiBJZiB3ZSBoYXZlIGEgbWFwLCB3ZSBleHBlY3QgdG8gaGF2ZSBhIHN5c2NvbiAqLworCWlmICghc2RoY2lfYXJhc2FuLT5zb2NfY3RsX2Jhc2UpIHsKKwkJcHJfd2FybigiJXM6IEhhdmUgcmVnbWFwLCBidXQgbm8gc29jLWN0bC1zeXNjb25cbiIsCisJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CisJCXJldHVybjsKKwl9CisKKwlzZGhjaV9hcmFzYW5fc3lzY29uX3dyaXRlKGhvc3QsICZzb2NfY3RsX21hcC0+Y2xvY2ttdWx0aXBsaWVyLCB2YWx1ZSk7Cit9CisKKy8qKgogICogc2RoY2lfYXJhc2FuX3VwZGF0ZV9iYXNlY2xrZnJlcSAtIFNldCBjb3JlY2ZnX2Jhc2VjbGtmcmVxCiAgKgogICogVGhlIGNvcmVjZmdfYmFzZWNsa2ZyZXEgaXMgc3VwcG9zZWQgdG8gY29udGFpbiB0aGUgTUh6IG9mIGNsa194aW4uICBUaGlzCkBAIC00NjIsNiArNTY1LDcgQEAKIAlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdDsKIAlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdDsKIAlzdHJ1Y3Qgc2RoY2lfYXJhc2FuX2RhdGEgKnNkaGNpX2FyYXNhbjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAKIAlob3N0ID0gc2RoY2lfcGx0Zm1faW5pdChwZGV2LCAmc2RoY2lfYXJhc2FuX3BkYXRhLAogCQkJCXNpemVvZigqc2RoY2lfYXJhc2FuKSk7CkBAIC01MTYsOCArNjIwLDE2IEBACiAJfQogCiAJc2RoY2lfZ2V0X29mX3Byb3BlcnR5KHBkZXYpOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgInhsbngsZmFpbHMtd2l0aG91dC10ZXN0LWNkIikpCisJCXNkaGNpX2FyYXNhbi0+cXVpcmtzIHw9IFNESENJX0FSQVNBTl9RVUlSS19GT1JDRV9DRFRFU1Q7CisKIAlwbHRmbV9ob3N0LT5jbGsgPSBjbGtfeGluOwogCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCSAgICAicm9ja2NoaXAscmszMzk5LXNkaGNpLTUuMSIpKQorCQlzZGhjaV9hcmFzYW5fdXBkYXRlX2Nsb2NrbXVsdGlwbGllcihob3N0LCAweDApOworCiAJc2RoY2lfYXJhc2FuX3VwZGF0ZV9iYXNlY2xrZnJlcShob3N0KTsKIAogCXJldCA9IHNkaGNpX2FyYXNhbl9yZWdpc3Rlcl9zZGNsayhzZGhjaV9hcmFzYW4sIGNsa194aW4sICZwZGV2LT5kZXYpOwpAQCAtNTQ3LDEyICs2NTksNiBAQAogCQkJZ290byB1bnJlZ19jbGs7CiAJCX0KIAotCQlyZXQgPSBwaHlfcG93ZXJfb24oc2RoY2lfYXJhc2FuLT5waHkpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAicGh5X3Bvd2VyX29uIGVyci5cbiIpOwotCQkJZ290byBlcnJfcGh5X3Bvd2VyOwotCQl9Ci0KIAkJaG9zdC0+bW1jX2hvc3Rfb3BzLmhzNDAwX2VuaGFuY2VkX3N0cm9iZSA9CiAJCQkJCXNkaGNpX2FyYXNhbl9oczQwMF9lbmhhbmNlZF9zdHJvYmU7CiAJfQpAQCAtNTY1LDkgKzY3MSw2IEBACiAKIGVycl9hZGRfaG9zdDoKIAlpZiAoIUlTX0VSUihzZGhjaV9hcmFzYW4tPnBoeSkpCi0JCXBoeV9wb3dlcl9vZmYoc2RoY2lfYXJhc2FuLT5waHkpOwotZXJyX3BoeV9wb3dlcjoKLQlpZiAoIUlTX0VSUihzZGhjaV9hcmFzYW4tPnBoeSkpCiAJCXBoeV9leGl0KHNkaGNpX2FyYXNhbi0+cGh5KTsKIHVucmVnX2NsazoKIAlzZGhjaV9hcmFzYW5fdW5yZWdpc3Rlcl9zZGNsaygmcGRldi0+ZGV2KTsKQEAgLTU4OSw3ICs2OTIsOCBAQAogCXN0cnVjdCBjbGsgKmNsa19haGIgPSBzZGhjaV9hcmFzYW4tPmNsa19haGI7CiAKIAlpZiAoIUlTX0VSUihzZGhjaV9hcmFzYW4tPnBoeSkpIHsKLQkJcGh5X3Bvd2VyX29mZihzZGhjaV9hcmFzYW4tPnBoeSk7CisJCWlmIChzZGhjaV9hcmFzYW4tPmlzX3BoeV9vbikKKwkJCXBoeV9wb3dlcl9vZmYoc2RoY2lfYXJhc2FuLT5waHkpOwogCQlwaHlfZXhpdChzZGhjaV9hcmFzYW4tPnBoeSk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWVzZGhjLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWVzZGhjLmMKaW5kZXggMjM5YmUyZi4uZmI3MWM4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1lc2RoYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtZXNkaGMuYwpAQCAtNTgzLDcgKzU4Myw3IEBACiAKIAlucCA9IHBkZXYtPmRldi5vZl9ub2RlOwogCi0JaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImxpdHRsZS1lbmRpYW4iLCBOVUxMKSkKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAibGl0dGxlLWVuZGlhbiIpKQogCQlob3N0ID0gc2RoY2lfcGx0Zm1faW5pdChwZGV2LCAmc2RoY2lfZXNkaGNfbGVfcGRhdGEsCiAJCQkJCXNpemVvZihzdHJ1Y3Qgc2RoY2lfZXNkaGMpKTsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS1jb3JlLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS1jb3JlLmMKaW5kZXggODk3Y2ZkMi4uNzJhMWYxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2ktY29yZS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLWNvcmUuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJaWYgKCFncGlvX2lzX3ZhbGlkKGdwaW8pKQogCQlyZXR1cm47CiAKLQllcnIgPSBncGlvX3JlcXVlc3QoZ3BpbywgInNkX2NkIik7CisJZXJyID0gZGV2bV9ncGlvX3JlcXVlc3QoJnNsb3QtPmNoaXAtPnBkZXYtPmRldiwgZ3BpbywgInNkX2NkIik7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0OwogCkBAIC0xNzksNyArMTc5LDcgQEAKIAlyZXR1cm47CiAKIG91dF9mcmVlOgotCWdwaW9fZnJlZShncGlvKTsKKwlkZXZtX2dwaW9fZnJlZSgmc2xvdC0+Y2hpcC0+cGRldi0+ZGV2LCBncGlvKTsKIG91dDoKIAlkZXZfd2Fybigmc2xvdC0+Y2hpcC0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIHNldHVwIGNhcmQgZGV0ZWN0IHdha2UgdXBcbiIpOwogfQpAQCAtMTg4LDggKzE4OCw2IEBACiB7CiAJaWYgKHNsb3QtPmNkX2lycSA+PSAwKQogCQlmcmVlX2lycShzbG90LT5jZF9pcnEsIHNsb3QpOwotCWlmIChncGlvX2lzX3ZhbGlkKHNsb3QtPmNkX2dwaW8pKQotCQlncGlvX2ZyZWUoc2xvdC0+Y2RfZ3Bpbyk7CiB9CiAKICNlbHNlCkBAIC0zNTYsNiArMzU0LDcgQEAKIHsKIAlzbG90LT5ob3N0LT5tbWMtPmNhcHMgfD0gTU1DX0NBUF84X0JJVF9EQVRBIHwgTU1DX0NBUF9OT05SRU1PVkFCTEUgfAogCQkJCSBNTUNfQ0FQX0hXX1JFU0VUIHwgTU1DX0NBUF8xXzhWX0REUiB8CisJCQkJIE1NQ19DQVBfQ01EX0RVUklOR19URlIgfAogCQkJCSBNTUNfQ0FQX1dBSVRfV0hJTEVfQlVTWTsKIAlzbG90LT5ob3N0LT5tbWMtPmNhcHMyIHw9IE1NQ19DQVAyX0hDX0VSQVNFX1NaOwogCXNsb3QtPmh3X3Jlc2V0ID0gc2RoY2lfcGNpX2ludF9od19yZXNldDsKQEAgLTQyMSwxNyArNDIwLDMwIEBACiAvKiBEZWZpbmUgSG9zdCBjb250cm9sbGVycyBmb3IgSW50ZWwgTWVycmlmaWVsZCBwbGF0Zm9ybSAqLwogI2RlZmluZSBJTlRFTF9NUkZMRF9FTU1DXzAJMAogI2RlZmluZSBJTlRFTF9NUkZMRF9FTU1DXzEJMQorI2RlZmluZSBJTlRFTF9NUkZMRF9TRAkJMgorI2RlZmluZSBJTlRFTF9NUkZMRF9TRElPCTMKIAogc3RhdGljIGludCBpbnRlbF9tcmZsZF9tbWNfcHJvYmVfc2xvdChzdHJ1Y3Qgc2RoY2lfcGNpX3Nsb3QgKnNsb3QpCiB7Ci0JaWYgKChQQ0lfRlVOQyhzbG90LT5jaGlwLT5wZGV2LT5kZXZmbikgIT0gSU5URUxfTVJGTERfRU1NQ18wKSAmJgotCSAgICAoUENJX0ZVTkMoc2xvdC0+Y2hpcC0+cGRldi0+ZGV2Zm4pICE9IElOVEVMX01SRkxEX0VNTUNfMSkpCi0JCS8qIFNEIHN1cHBvcnQgaXMgbm90IHJlYWR5IHlldCAqLworCXVuc2lnbmVkIGludCBmdW5jID0gUENJX0ZVTkMoc2xvdC0+Y2hpcC0+cGRldi0+ZGV2Zm4pOworCisJc3dpdGNoIChmdW5jKSB7CisJY2FzZSBJTlRFTF9NUkZMRF9FTU1DXzA6CisJY2FzZSBJTlRFTF9NUkZMRF9FTU1DXzE6CisJCXNsb3QtPmhvc3QtPm1tYy0+Y2FwcyB8PSBNTUNfQ0FQX05PTlJFTU9WQUJMRSB8CisJCQkJCSBNTUNfQ0FQXzhfQklUX0RBVEEgfAorCQkJCQkgTU1DX0NBUF8xXzhWX0REUjsKKwkJYnJlYWs7CisJY2FzZSBJTlRFTF9NUkZMRF9TRDoKKwkJc2xvdC0+aG9zdC0+cXVpcmtzMiB8PSBTREhDSV9RVUlSSzJfTk9fMV84X1Y7CisJCWJyZWFrOworCWNhc2UgSU5URUxfTVJGTERfU0RJTzoKKwkJc2xvdC0+aG9zdC0+bW1jLT5jYXBzIHw9IE1NQ19DQVBfTk9OUkVNT1ZBQkxFIHwKKwkJCQkJIE1NQ19DQVBfUE9XRVJfT0ZGX0NBUkQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PREVWOwotCi0Jc2xvdC0+aG9zdC0+bW1jLT5jYXBzIHw9IE1NQ19DQVBfOF9CSVRfREFUQSB8IE1NQ19DQVBfTk9OUkVNT1ZBQkxFIHwKLQkJCQkgTU1DX0NBUF8xXzhWX0REUjsKLQorCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTYxNSw3ICsxNjI3LDYgQEAKIAogCXNsb3QtPmNoaXAgPSBjaGlwOwogCXNsb3QtPmhvc3QgPSBob3N0OwotCXNsb3QtPnBjaV9iYXIgPSBiYXI7CiAJc2xvdC0+cnN0X25fZ3BpbyA9IC1FSU5WQUw7CiAJc2xvdC0+Y2RfZ3BpbyA9IC1FSU5WQUw7CiAJc2xvdC0+Y2RfaWR4ID0gLTE7CkBAIC0xNjQzLDI3ICsxNjU0LDIyIEBACiAKIAlob3N0LT5pcnEgPSBwZGV2LT5pcnE7CiAKLQlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgYmFyLCBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CisJcmV0ID0gcGNpbV9pb21hcF9yZWdpb25zKHBkZXYsIEJJVChiYXIpLCBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgcmVxdWVzdCByZWdpb25cbiIpOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JaG9zdC0+aW9hZGRyID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIGJhcik7Ci0JaWYgKCFob3N0LT5pb2FkZHIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlbWFwIHJlZ2lzdGVyc1xuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gcmVsZWFzZTsKLQl9CisJaG9zdC0+aW9hZGRyID0gcGNpbV9pb21hcF90YWJsZShwZGV2KVtiYXJdOwogCiAJaWYgKGNoaXAtPmZpeGVzICYmIGNoaXAtPmZpeGVzLT5wcm9iZV9zbG90KSB7CiAJCXJldCA9IGNoaXAtPmZpeGVzLT5wcm9iZV9zbG90KHNsb3QpOwogCQlpZiAocmV0KQotCQkJZ290byB1bm1hcDsKKwkJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAlpZiAoZ3Bpb19pc192YWxpZChzbG90LT5yc3Rfbl9ncGlvKSkgewotCQlpZiAoIWdwaW9fcmVxdWVzdChzbG90LT5yc3Rfbl9ncGlvLCAiZU1NQ19yZXNldCIpKSB7CisJCWlmICghZGV2bV9ncGlvX3JlcXVlc3QoJnBkZXYtPmRldiwgc2xvdC0+cnN0X25fZ3BpbywgImVNTUNfcmVzZXQiKSkgewogCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHNsb3QtPnJzdF9uX2dwaW8sIDEpOwogCQkJc2xvdC0+aG9zdC0+bW1jLT5jYXBzIHw9IE1NQ19DQVBfSFdfUkVTRVQ7CiAJCQlzbG90LT5od19yZXNldCA9IHNkaGNpX3BjaV9ncGlvX2h3X3Jlc2V0OwpAQCAtMTcwMiwxOCArMTcwOCw5IEBACiAJcmV0dXJuIHNsb3Q7CiAKIHJlbW92ZToKLQlpZiAoZ3Bpb19pc192YWxpZChzbG90LT5yc3Rfbl9ncGlvKSkKLQkJZ3Bpb19mcmVlKHNsb3QtPnJzdF9uX2dwaW8pOwotCiAJaWYgKGNoaXAtPmZpeGVzICYmIGNoaXAtPmZpeGVzLT5yZW1vdmVfc2xvdCkKIAkJY2hpcC0+Zml4ZXMtPnJlbW92ZV9zbG90KHNsb3QsIDApOwogCi11bm1hcDoKLQlpb3VubWFwKGhvc3QtPmlvYWRkcik7Ci0KLXJlbGVhc2U6Ci0JcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIGJhcik7Ci0KIGNsZWFudXA6CiAJaWYgKHNsb3QtPmRhdGEgJiYgc2xvdC0+ZGF0YS0+Y2xlYW51cCkKIAkJc2xvdC0+ZGF0YS0+Y2xlYW51cChzbG90LT5kYXRhKTsKQEAgLTE3MzgsMTcgKzE3MzUsMTIgQEAKIAogCXNkaGNpX3JlbW92ZV9ob3N0KHNsb3QtPmhvc3QsIGRlYWQpOwogCi0JaWYgKGdwaW9faXNfdmFsaWQoc2xvdC0+cnN0X25fZ3BpbykpCi0JCWdwaW9fZnJlZShzbG90LT5yc3Rfbl9ncGlvKTsKLQogCWlmIChzbG90LT5jaGlwLT5maXhlcyAmJiBzbG90LT5jaGlwLT5maXhlcy0+cmVtb3ZlX3Nsb3QpCiAJCXNsb3QtPmNoaXAtPmZpeGVzLT5yZW1vdmVfc2xvdChzbG90LCBkZWFkKTsKIAogCWlmIChzbG90LT5kYXRhICYmIHNsb3QtPmRhdGEtPmNsZWFudXApCiAJCXNsb3QtPmRhdGEtPmNsZWFudXAoc2xvdC0+ZGF0YSk7CiAKLQlwY2lfcmVsZWFzZV9yZWdpb24oc2xvdC0+Y2hpcC0+cGRldiwgc2xvdC0+cGNpX2Jhcik7Ci0KIAlzZGhjaV9mcmVlX2hvc3Qoc2xvdC0+aG9zdCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLmggYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS5oCmluZGV4IDdlMDc4ODcuLjljN2MwOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2kuaApAQCAtNzIsNyArNzIsNiBAQAogCXN0cnVjdCBzZGhjaV9ob3N0CSpob3N0OwogCXN0cnVjdCBzZGhjaV9wY2lfZGF0YQkqZGF0YTsKIAotCWludAkJCXBjaV9iYXI7CiAJaW50CQkJcnN0X25fZ3BpbzsKIAlpbnQJCQljZF9ncGlvOwogCWludAkJCWNkX2lycTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uYwppbmRleCAxZDE3ZGNmLi5hZDQ5YmZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5jCkBAIC0xNTYsMTMgKzE1Niw2IEBACiAJCWhvc3QtPnF1aXJrczIgPSBwZGF0YS0+cXVpcmtzMjsKIAl9CiAKLQkvKgotCSAqIFNvbWUgcGxhdGZvcm1zIG5lZWQgdG8gcHJvYmUgdGhlIGNvbnRyb2xsZXIgdG8gYmUgYWJsZSB0bwotCSAqIGRldGVybWluZSB3aGljaCBjYXBzIHNob3VsZCBiZSB1c2VkLgotCSAqLwotCWlmIChob3N0LT5vcHMgJiYgaG9zdC0+b3BzLT5wbGF0Zm9ybV9pbml0KQotCQlob3N0LT5vcHMtPnBsYXRmb3JtX2luaXQoaG9zdCk7Ci0KIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBob3N0KTsKIAogCXJldHVybiBob3N0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zdC5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zdC5jCmluZGV4IGM5NWJhODMuLmVkOTJjZTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXN0LmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zdC5jCkBAIC0yOCw2ICsyOCw3IEBACiAKIHN0cnVjdCBzdF9tbWNfcGxhdGZvcm1fZGF0YSB7CiAJc3RydWN0ICByZXNldF9jb250cm9sICpyc3RjOworCXN0cnVjdCAgY2xrICppY25jbGs7CiAJdm9pZCBfX2lvbWVtICp0b3BfaW9hZGRyOwogfTsKIApAQCAtMzUzLDcgKzM1NCw3IEBACiAJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3Q7CiAJc3RydWN0IHN0X21tY19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdDsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsayAqY2xrLCAqaWNuY2xrOwogCWludCByZXQgPSAwOwogCXUxNiBob3N0X3ZlcnNpb247CiAJc3RydWN0IHJlc291cmNlICpyZXM7CkBAIC0zNjUsNiArMzY2LDExIEBACiAJCXJldHVybiBQVFJfRVJSKGNsayk7CiAJfQogCisJLyogSUNOIGNsb2NrIGlzbid0IGNvbXB1bHNvcnksIGJ1dCB1c2UgaXQgaWYgaXQncyBwcm92aWRlZC4gKi8KKwlpY25jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImljbiIpOworCWlmIChJU19FUlIoaWNuY2xrKSkKKwkJaWNuY2xrID0gTlVMTDsKKwogCXJzdGMgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOwogCWlmIChJU19FUlIocnN0YykpCiAJCXJzdGMgPSBOVUxMOwpAQCAtMzg5LDYgKzM5NSw3IEBACiAJfQogCiAJY2xrX3ByZXBhcmVfZW5hYmxlKGNsayk7CisJY2xrX3ByZXBhcmVfZW5hYmxlKGljbmNsayk7CiAKIAkvKiBDb25maWd1cmUgdGhlIEZsYXNoU1MgVG9wIHJlZ2lzdGVycyBmb3Igc2V0dGluZyBlTU1DIFRYL1JYIGRlbGF5ICovCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwKQEAgLTQwMCw2ICs0MDcsNyBAQAogCX0KIAogCXBsdGZtX2hvc3QtPmNsayA9IGNsazsKKwlwZGF0YS0+aWNuY2xrID0gaWNuY2xrOwogCiAJLyogQ29uZmlndXJlIHRoZSBBcmFzYW4gSEMgaW5zaWRlIHRoZSBmbGFzaFNTICovCiAJc3RfbW1jc3NfY2NvbmZpZyhucCwgaG9zdCk7CkBAIC00MjIsNiArNDMwLDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyX291dDoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoaWNuY2xrKTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoY2xrKTsKIGVycl9vZjoKIAlzZGhjaV9wbHRmbV9mcmVlKHBkZXYpOwpAQCAtNDQyLDYgKzQ1MSw4IEBACiAKIAlyZXQgPSBzZGhjaV9wbHRmbV91bnJlZ2lzdGVyKHBkZXYpOwogCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBkYXRhLT5pY25jbGspOworCiAJaWYgKHJzdGMpCiAJCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHJzdGMpOwogCkBAIC00NjIsNiArNDczLDcgQEAKIAlpZiAocGRhdGEtPnJzdGMpCiAJCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHBkYXRhLT5yc3RjKTsKIAorCWNsa19kaXNhYmxlX3VucHJlcGFyZShwZGF0YS0+aWNuY2xrKTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUocGx0Zm1faG9zdC0+Y2xrKTsKIG91dDoKIAlyZXR1cm4gcmV0OwpAQCAtNDc1LDYgKzQ4Nyw3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKIAogCWNsa19wcmVwYXJlX2VuYWJsZShwbHRmbV9ob3N0LT5jbGspOworCWNsa19wcmVwYXJlX2VuYWJsZShwZGF0YS0+aWNuY2xrKTsKIAogCWlmIChwZGF0YS0+cnN0YykKIAkJcmVzZXRfY29udHJvbF9kZWFzc2VydChwZGF0YS0+cnN0Yyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXRlZ3JhLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXRlZ3JhLmMKaW5kZXggMWU5M2RjNC4uMjBiNmZmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS10ZWdyYS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktdGVncmEuYwpAQCAtMzkxLDYgKzM5MSwzMSBAQAogCS5wZGF0YSA9ICZzZGhjaV90ZWdyYTExNF9wZGF0YSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSBzZGhjaV90ZWdyYTEyNF9wZGF0YSA9IHsKKwkucXVpcmtzID0gU0RIQ0lfUVVJUktfQlJPS0VOX1RJTUVPVVRfVkFMIHwKKwkJICBTREhDSV9RVUlSS19EQVRBX1RJTUVPVVRfVVNFU19TRENMSyB8CisJCSAgU0RIQ0lfUVVJUktfU0lOR0xFX1BPV0VSX1dSSVRFIHwKKwkJICBTREhDSV9RVUlSS19OT19ISVNQRF9CSVQgfAorCQkgIFNESENJX1FVSVJLX0JST0tFTl9BRE1BX1pFUk9MRU5fREVTQyB8CisJCSAgU0RIQ0lfUVVJUktfQ0FQX0NMT0NLX0JBU0VfQlJPS0VOLAorCS5xdWlya3MyID0gU0RIQ0lfUVVJUksyX1BSRVNFVF9WQUxVRV9CUk9LRU4gfAorCQkgICAvKgorCQkgICAgKiBUaGUgVFJNIHN0YXRlcyB0aGF0IHRoZSBTRC9NTUMgY29udHJvbGxlciBmb3VuZCBvbgorCQkgICAgKiBUZWdyYTEyNCBjYW4gYWRkcmVzcyAzNCBiaXRzICh0aGUgbWF4aW11bSBzdXBwb3J0ZWQgYnkKKwkJICAgICogdGhlIFRlZ3JhIG1lbW9yeSBjb250cm9sbGVyKSwgYnV0IHRlc3RzIHNob3cgdGhhdCBETUEKKwkJICAgICogdG8gb3IgZnJvbSBhYm92ZSA0IEdpQiBkb2Vzbid0IHdvcmsuIFRoaXMgaXMgcG9zc2libHkKKwkJICAgICogY2F1c2VkIGJ5IG1pc3NpbmcgcHJvZ3JhbW1pbmcsIHRob3VnaCBpdCdzIG5vdCBvYnZpb3VzCisJCSAgICAqIHdoYXQgc2VxdWVuY2UgaXMgcmVxdWlyZWQuIE1hcmsgNjQtYml0IERNQSBicm9rZW4gZm9yCisJCSAgICAqIG5vdyB0byBmaXggdGhpcyBmb3IgZXhpc3RpbmcgdXNlcnMgKGUuZy4gTnlhbiBib2FyZHMpLgorCQkgICAgKi8KKwkJICAgU0RIQ0lfUVVJUksyX0JST0tFTl82NF9CSVRfRE1BLAorCS5vcHMgID0gJnRlZ3JhMTE0X3NkaGNpX29wcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RoY2lfdGVncmFfc29jX2RhdGEgc29jX2RhdGFfdGVncmExMjQgPSB7CisJLnBkYXRhID0gJnNkaGNpX3RlZ3JhMTI0X3BkYXRhLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhIHNkaGNpX3RlZ3JhMjEwX3BkYXRhID0gewogCS5xdWlya3MgPSBTREhDSV9RVUlSS19CUk9LRU5fVElNRU9VVF9WQUwgfAogCQkgIFNESENJX1FVSVJLX0RBVEFfVElNRU9VVF9VU0VTX1NEQ0xLIHwKQEAgLTQwOCw3ICs0MzMsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzZGhjaV90ZWdyYV9kdF9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjEwLXNkaGNpIiwgLmRhdGEgPSAmc29jX2RhdGFfdGVncmEyMTAgfSwKLQl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTEyNC1zZGhjaSIsIC5kYXRhID0gJnNvY19kYXRhX3RlZ3JhMTE0IH0sCisJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmExMjQtc2RoY2kiLCAuZGF0YSA9ICZzb2NfZGF0YV90ZWdyYTEyNCB9LAogCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMTE0LXNkaGNpIiwgLmRhdGEgPSAmc29jX2RhdGFfdGVncmExMTQgfSwKIAl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTMwLXNkaGNpIiwgLmRhdGEgPSAmc29jX2RhdGFfdGVncmEzMCB9LAogCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtc2RoY2kiLCAuZGF0YSA9ICZzb2NfZGF0YV90ZWdyYTIwIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMKaW5kZXggY2Q2NWQ0Ny4uNDgwNTU2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYwpAQCAtODg4LDcgKzg4OCw4IEBACiBzdGF0aWMgaW5saW5lIGJvb2wgc2RoY2lfYXV0b19jbWQxMihzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwKIAkJCQkgICAgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCiB7Ci0JcmV0dXJuICFtcnEtPnNiYyAmJiAoaG9zdC0+ZmxhZ3MgJiBTREhDSV9BVVRPX0NNRDEyKTsKKwlyZXR1cm4gIW1ycS0+c2JjICYmIChob3N0LT5mbGFncyAmIFNESENJX0FVVE9fQ01EMTIpICYmCisJICAgICAgICFtcnEtPmNhcF9jbWRfZHVyaW5nX3RmcjsKIH0KIAogc3RhdGljIHZvaWQgc2RoY2lfc2V0X3RyYW5zZmVyX21vZGUoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsCkBAIC0xMDMxLDkgKzEwMzIsMTggQEAKIAkJCXNkaGNpX2RvX3Jlc2V0KGhvc3QsIFNESENJX1JFU0VUX0RBVEEpOwogCQl9CiAKLQkJLyogQXZvaWQgdHJpZ2dlcmluZyB3YXJuaW5nIGluIHNkaGNpX3NlbmRfY29tbWFuZCgpICovCi0JCWhvc3QtPmNtZCA9IE5VTEw7Ci0JCXNkaGNpX3NlbmRfY29tbWFuZChob3N0LCBkYXRhLT5zdG9wKTsKKwkJLyoKKwkJICogJ2NhcF9jbWRfZHVyaW5nX3RmcicgcmVxdWVzdCBtdXN0IG5vdCB1c2UgdGhlIGNvbW1hbmQgbGluZQorCQkgKiBhZnRlciBtbWNfY29tbWFuZF9kb25lKCkgaGFzIGJlZW4gY2FsbGVkLiBJdCBpcyB1cHBlciBsYXllcidzCisJCSAqIHJlc3BvbnNpYmlsaXR5IHRvIHNlbmQgdGhlIHN0b3AgY29tbWFuZCBpZiByZXF1aXJlZC4KKwkJICovCisJCWlmIChkYXRhLT5tcnEtPmNhcF9jbWRfZHVyaW5nX3RmcikgeworCQkJc2RoY2lfZmluaXNoX21ycShob3N0LCBkYXRhLT5tcnEpOworCQl9IGVsc2UgeworCQkJLyogQXZvaWQgdHJpZ2dlcmluZyB3YXJuaW5nIGluIHNkaGNpX3NlbmRfY29tbWFuZCgpICovCisJCQlob3N0LT5jbWQgPSBOVUxMOworCQkJc2RoY2lfc2VuZF9jb21tYW5kKGhvc3QsIGRhdGEtPnN0b3ApOworCQl9CiAJfSBlbHNlIHsKIAkJc2RoY2lfZmluaXNoX21ycShob3N0LCBkYXRhLT5tcnEpOwogCX0KQEAgLTExNjUsNiArMTE3NSw5IEBACiAJCX0KIAl9CiAKKwlpZiAoY21kLT5tcnEtPmNhcF9jbWRfZHVyaW5nX3RmciAmJiBjbWQgPT0gY21kLT5tcnEtPmNtZCkKKwkJbW1jX2NvbW1hbmRfZG9uZShob3N0LT5tbWMsIGNtZC0+bXJxKTsKKwogCS8qCiAJICogVGhlIGhvc3QgY2FuIHNlbmQgYW5kIGludGVycnVwdCB3aGVuIHRoZSBidXN5IHN0YXRlIGhhcwogCSAqIGVuZGVkLCBhbGxvd2luZyB1cyB0byB3YWl0IHdpdGhvdXQgd2FzdGluZyBDUFUgY3ljbGVzLgpAQCAtMjA2Miw3ICsyMDc1LDcgQEAKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAJCS8qIFdhaXQgZm9yIEJ1ZmZlciBSZWFkIFJlYWR5IGludGVycnVwdCAqLwotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChob3N0LT5idWZfcmVhZHlfaW50LAorCQl3YWl0X2V2ZW50X3RpbWVvdXQoaG9zdC0+YnVmX3JlYWR5X2ludCwKIAkJCQkJKGhvc3QtPnR1bmluZ19kb25lID09IDEpLAogCQkJCQltc2Vjc190b19qaWZmaWVzKDUwKSk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmggYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmgKaW5kZXggMDQxMWM5Zi4uYzcyMmNkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuaApAQCAtODQsNiArODQsOCBAQAogI2RlZmluZSAgIFNESENJX0NUUkxfQURNQTMyCTB4MTAKICNkZWZpbmUgICBTREhDSV9DVFJMX0FETUE2NAkweDE4CiAjZGVmaW5lICAgU0RIQ0lfQ1RSTF84QklUQlVTCTB4MjAKKyNkZWZpbmUgIFNESENJX0NUUkxfQ0RURVNUX0lOUwkweDQwCisjZGVmaW5lICBTREhDSV9DVFJMX0NEVEVTVF9FTgkweDgwCiAKICNkZWZpbmUgU0RIQ0lfUE9XRVJfQ09OVFJPTAkweDI5CiAjZGVmaW5lICBTREhDSV9QT1dFUl9PTgkJMHgwMQpAQCAtNTU1LDcgKzU1Nyw2IEBACiAJdm9pZAkoKnNldF91aHNfc2lnbmFsaW5nKShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgdW5zaWduZWQgaW50IHVocyk7CiAJdm9pZAkoKmh3X3Jlc2V0KShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCk7CiAJdm9pZCAgICAoKmFkbWFfd29ya2Fyb3VuZCkoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHUzMiBpbnRtYXNrKTsKLQl2b2lkCSgqcGxhdGZvcm1faW5pdCkoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpOwogCXZvaWQgICAgKCpjYXJkX2V2ZW50KShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCk7CiAJdm9pZAkoKnZvbHRhZ2Vfc3dpdGNoKShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCk7CiAJaW50CSgqc2VsZWN0X2RyaXZlX3N0cmVuZ3RoKShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW9iaWxlX3NkaGkuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW9iaWxlX3NkaGkuYwppbmRleCBjM2I2NTFiLi40OWVkZmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NoX21vYmlsZV9zZGhpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zaF9tb2JpbGVfc2RoaS5jCkBAIC05NCw2ICs5NCw3IEBACiAJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHNkaGktcjhhNzc5MyIsIC5kYXRhID0gJm9mX3JjYXJfZ2VuMl9jb21wYXRpYmxlLCB9LAogCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzZGhpLXI4YTc3OTQiLCAuZGF0YSA9ICZvZl9yY2FyX2dlbjJfY29tcGF0aWJsZSwgfSwKIAl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsc2RoaS1yOGE3Nzk1IiwgLmRhdGEgPSAmb2ZfcmNhcl9nZW4zX2NvbXBhdGlibGUsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHNkaGktcjhhNzc5NiIsIC5kYXRhID0gJm9mX3JjYXJfZ2VuM19jb21wYXRpYmxlLCB9LAogCXt9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNoX21vYmlsZV9zZGhpX29mX21hdGNoKTsKQEAgLTIxMyw2ICsyMTQsMTMgQEAKIAljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+Y2xrKTsKIH0KIAorc3RhdGljIGludCBzaF9tb2JpbGVfc2RoaV9jYXJkX2J1c3koc3RydWN0IG1tY19ob3N0ICptbWMpCit7CisJc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOworCisJcmV0dXJuICEoc2RfY3RybF9yZWFkMTZfYW5kXzE2X2FzXzMyKGhvc3QsIENUTF9TVEFUVVMpICYgVE1JT19TVEFUX0RBVDApOworfQorCiBzdGF0aWMgaW50IHNoX21vYmlsZV9zZGhpX3N0YXJ0X3NpZ25hbF92b2x0YWdlX3N3aXRjaChzdHJ1Y3QgbW1jX2hvc3QgKm1tYywKIAkJCQkJCSAgICAgIHN0cnVjdCBtbWNfaW9zICppb3MpCiB7CkBAIC0zNjksNyArMzc3LDE0IEBACiAJaG9zdC0+Y2xrX3VwZGF0ZQk9IHNoX21vYmlsZV9zZGhpX2Nsa191cGRhdGU7CiAJaG9zdC0+Y2xrX2Rpc2FibGUJPSBzaF9tb2JpbGVfc2RoaV9jbGtfZGlzYWJsZTsKIAlob3N0LT5tdWx0aV9pb19xdWlyawk9IHNoX21vYmlsZV9zZGhpX211bHRpX2lvX3F1aXJrOwotCWhvc3QtPnN0YXJ0X3NpZ25hbF92b2x0YWdlX3N3aXRjaCA9IHNoX21vYmlsZV9zZGhpX3N0YXJ0X3NpZ25hbF92b2x0YWdlX3N3aXRjaDsKKworCS8qIFNEUiBzcGVlZHMgYXJlIG9ubHkgYXZhaWxhYmxlIG9uIEdlbjIrICovCisJaWYgKG1tY19kYXRhLT5mbGFncyAmIFRNSU9fTU1DX01JTl9SQ0FSMikgeworCQkvKiBjYXJkX2J1c3kgY2F1c2VkIGlzc3VlcyBvbiByOGE3M2E0IChwcmUtR2VuMikgQ0QtbGVzcyBTREhJICovCisJCWhvc3QtPmNhcmRfYnVzeQk9IHNoX21vYmlsZV9zZGhpX2NhcmRfYnVzeTsKKwkJaG9zdC0+c3RhcnRfc2lnbmFsX3ZvbHRhZ2Vfc3dpdGNoID0KKwkJCXNoX21vYmlsZV9zZGhpX3N0YXJ0X3NpZ25hbF92b2x0YWdlX3N3aXRjaDsKKwl9CiAKIAkvKiBPcmdpbmFsbHkgcmVnaXN0ZXJzIHdlcmUgMTYgYml0IGFwYXJ0LCBjb3VsZCBiZSAzMiBvciA2NCBub3dhZGF5cyAqLwogCWlmICghaG9zdC0+YnVzX3NoaWZ0ICYmIHJlc291cmNlX3NpemUocmVzKSA+IDB4MTAwKSAvKiBvbGQgd2F5IHRvIGRldGVybWluZSB0aGUgc2hpZnQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc3VueGktbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L3N1bnhpLW1tYy5jCmluZGV4IDJlZTRjMjEuLmMwYTVjNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc3VueGktbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zdW54aS1tbWMuYwpAQCAtNzIsNiArNzIsMTMgQEAKICNkZWZpbmUgU0RYQ19SRUdfQ0hEQQkoMHg5MCkKICNkZWZpbmUgU0RYQ19SRUdfQ0JEQQkoMHg5NCkKIAorLyogTmV3IHJlZ2lzdGVycyBpbnRyb2R1Y2VkIGluIEE2NCAqLworI2RlZmluZSBTRFhDX1JFR19BMTJBCQkweDA1OCAvKiBTTUMgQXV0byBDb21tYW5kIDEyIFJlZ2lzdGVyICovCisjZGVmaW5lIFNEWENfUkVHX1NEX05UU1IJMHgwNUMgLyogU01DIE5ldyBUaW1pbmcgU2V0IFJlZ2lzdGVyICovCisjZGVmaW5lIFNEWENfUkVHX0RSVl9ETAkJMHgxNDAgLyogRHJpdmUgRGVsYXkgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBTRFhDX1JFR19TQU1QX0RMX1JFRwkweDE0NCAvKiBTTUMgc2FtcGxlIGRlbGF5IGNvbnRyb2wgKi8KKyNkZWZpbmUgU0RYQ19SRUdfRFNfRExfUkVHCTB4MTQ4IC8qIFNNQyBkYXRhIHN0cm9iZSBkZWxheSBjb250cm9sICovCisKICNkZWZpbmUgbW1jX3JlYWRsKGhvc3QsIHJlZykgXAogCXJlYWRsKChob3N0KS0+cmVnX2Jhc2UgKyBTRFhDXyMjcmVnKQogI2RlZmluZSBtbWNfd3JpdGVsKGhvc3QsIHJlZywgdmFsdWUpIFwKQEAgLTIxNywyMSArMjI0LDQxIEBACiAjZGVmaW5lIFNEWENfQ0xLXzUwTV9ERFIJMwogI2RlZmluZSBTRFhDX0NMS181ME1fRERSXzhCSVQJNAogCisjZGVmaW5lIFNEWENfMlhfVElNSU5HX01PREUJQklUKDMxKQorCisjZGVmaW5lIFNEWENfQ0FMX1NUQVJUCQlCSVQoMTUpCisjZGVmaW5lIFNEWENfQ0FMX0RPTkUJCUJJVCgxNCkKKyNkZWZpbmUgU0RYQ19DQUxfRExfU0hJRlQJOAorI2RlZmluZSBTRFhDX0NBTF9ETF9TV19FTglCSVQoNykKKyNkZWZpbmUgU0RYQ19DQUxfRExfU1dfU0hJRlQJMAorI2RlZmluZSBTRFhDX0NBTF9ETF9NQVNLCTB4M2YKKworI2RlZmluZSBTRFhDX0NBTF9USU1FT1VUCTMJLyogaW4gc2Vjb25kcywgM3MgaXMgZW5vdWdoKi8KKwogc3RydWN0IHN1bnhpX21tY19jbGtfZGVsYXkgewogCXUzMiBvdXRwdXQ7CiAJdTMyIHNhbXBsZTsKIH07CiAKIHN0cnVjdCBzdW54aV9pZG1hX2RlcyB7Ci0JdTMyCWNvbmZpZzsKLQl1MzIJYnVmX3NpemU7Ci0JdTMyCWJ1Zl9hZGRyX3B0cjE7Ci0JdTMyCWJ1Zl9hZGRyX3B0cjI7CisJX19sZTMyIGNvbmZpZzsKKwlfX2xlMzIgYnVmX3NpemU7CisJX19sZTMyIGJ1Zl9hZGRyX3B0cjE7CisJX19sZTMyIGJ1Zl9hZGRyX3B0cjI7Cit9OworCitzdHJ1Y3Qgc3VueGlfbW1jX2NmZyB7CisJdTMyIGlkbWFfZGVzX3NpemVfYml0czsKKwljb25zdCBzdHJ1Y3Qgc3VueGlfbW1jX2Nsa19kZWxheSAqY2xrX2RlbGF5czsKKworCS8qIGRvZXMgdGhlIElQIGJsb2NrIHN1cHBvcnQgYXV0b2NhbGlicmF0aW9uPyAqLworCWJvb2wgY2FuX2NhbGlicmF0ZTsKIH07CiAKIHN0cnVjdCBzdW54aV9tbWNfaG9zdCB7CiAJc3RydWN0IG1tY19ob3N0CSptbWM7CiAJc3RydWN0IHJlc2V0X2NvbnRyb2wgKnJlc2V0OworCWNvbnN0IHN0cnVjdCBzdW54aV9tbWNfY2ZnICpjZmc7CiAKIAkvKiBJTyBtYXBwaW5nIGJhc2UgKi8KIAl2b2lkIF9faW9tZW0JKnJlZ19iYXNlOwpAQCAtMjQxLDcgKzI2OCw2IEBACiAJc3RydWN0IGNsawkqY2xrX21tYzsKIAlzdHJ1Y3QgY2xrCSpjbGtfc2FtcGxlOwogCXN0cnVjdCBjbGsJKmNsa19vdXRwdXQ7Ci0JY29uc3Qgc3RydWN0IHN1bnhpX21tY19jbGtfZGVsYXkgKmNsa19kZWxheXM7CiAKIAkvKiBpcnEgKi8KIAlzcGlubG9ja190CWxvY2s7CkBAIC0yNTAsNyArMjc2LDYgQEAKIAl1MzIJCXNkaW9faW1hc2s7CiAKIAkvKiBkbWEgKi8KLQl1MzIJCWlkbWFfZGVzX3NpemVfYml0czsKIAlkbWFfYWRkcl90CXNnX2RtYTsKIAl2b2lkCQkqc2dfY3B1OwogCWJvb2wJCXdhaXRfZG1hOwpAQCAtMzIyLDI1ICszNDcsMjggQEAKIHsKIAlzdHJ1Y3Qgc3VueGlfaWRtYV9kZXMgKnBkZXMgPSAoc3RydWN0IHN1bnhpX2lkbWFfZGVzICopaG9zdC0+c2dfY3B1OwogCWRtYV9hZGRyX3QgbmV4dF9kZXNjID0gaG9zdC0+c2dfZG1hOwotCWludCBpLCBtYXhfbGVuID0gKDEgPDwgaG9zdC0+aWRtYV9kZXNfc2l6ZV9iaXRzKTsKKwlpbnQgaSwgbWF4X2xlbiA9ICgxIDw8IGhvc3QtPmNmZy0+aWRtYV9kZXNfc2l6ZV9iaXRzKTsKIAogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5zZ19sZW47IGkrKykgewotCQlwZGVzW2ldLmNvbmZpZyA9IFNEWENfSURNQUNfREVTMF9DSCB8IFNEWENfSURNQUNfREVTMF9PV04gfAotCQkJCSBTRFhDX0lETUFDX0RFUzBfRElDOworCQlwZGVzW2ldLmNvbmZpZyA9IGNwdV90b19sZTMyKFNEWENfSURNQUNfREVTMF9DSCB8CisJCQkJCSAgICAgU0RYQ19JRE1BQ19ERVMwX09XTiB8CisJCQkJCSAgICAgU0RYQ19JRE1BQ19ERVMwX0RJQyk7CiAKIAkJaWYgKGRhdGEtPnNnW2ldLmxlbmd0aCA9PSBtYXhfbGVuKQogCQkJcGRlc1tpXS5idWZfc2l6ZSA9IDA7IC8qIDAgPT0gbWF4X2xlbiAqLwogCQllbHNlCi0JCQlwZGVzW2ldLmJ1Zl9zaXplID0gZGF0YS0+c2dbaV0ubGVuZ3RoOworCQkJcGRlc1tpXS5idWZfc2l6ZSA9IGNwdV90b19sZTMyKGRhdGEtPnNnW2ldLmxlbmd0aCk7CiAKIAkJbmV4dF9kZXNjICs9IHNpemVvZihzdHJ1Y3Qgc3VueGlfaWRtYV9kZXMpOwotCQlwZGVzW2ldLmJ1Zl9hZGRyX3B0cjEgPSBzZ19kbWFfYWRkcmVzcygmZGF0YS0+c2dbaV0pOwotCQlwZGVzW2ldLmJ1Zl9hZGRyX3B0cjIgPSAodTMyKW5leHRfZGVzYzsKKwkJcGRlc1tpXS5idWZfYWRkcl9wdHIxID0KKwkJCWNwdV90b19sZTMyKHNnX2RtYV9hZGRyZXNzKCZkYXRhLT5zZ1tpXSkpOworCQlwZGVzW2ldLmJ1Zl9hZGRyX3B0cjIgPSBjcHVfdG9fbGUzMigodTMyKW5leHRfZGVzYyk7CiAJfQogCi0JcGRlc1swXS5jb25maWcgfD0gU0RYQ19JRE1BQ19ERVMwX0ZEOwotCXBkZXNbaSAtIDFdLmNvbmZpZyB8PSBTRFhDX0lETUFDX0RFUzBfTEQgfCBTRFhDX0lETUFDX0RFUzBfRVI7Ci0JcGRlc1tpIC0gMV0uY29uZmlnICY9IH5TRFhDX0lETUFDX0RFUzBfRElDOworCXBkZXNbMF0uY29uZmlnIHw9IGNwdV90b19sZTMyKFNEWENfSURNQUNfREVTMF9GRCk7CisJcGRlc1tpIC0gMV0uY29uZmlnIHw9IGNwdV90b19sZTMyKFNEWENfSURNQUNfREVTMF9MRCB8CisJCQkJCSAgU0RYQ19JRE1BQ19ERVMwX0VSKTsKKwlwZGVzW2kgLSAxXS5jb25maWcgJj0gY3B1X3RvX2xlMzIoflNEWENfSURNQUNfREVTMF9ESUMpOwogCXBkZXNbaSAtIDFdLmJ1Zl9hZGRyX3B0cjIgPSAwOwogCiAJLyoKQEAgLTY1MywxMSArNjgxLDg0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc3VueGlfbW1jX2NhbGlicmF0ZShzdHJ1Y3Qgc3VueGlfbW1jX2hvc3QgKmhvc3QsIGludCByZWdfb2ZmKQoreworCXUzMiByZWcgPSByZWFkbChob3N0LT5yZWdfYmFzZSArIHJlZ19vZmYpOworCXUzMiBkZWxheTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlpZiAoIWhvc3QtPmNmZy0+Y2FuX2NhbGlicmF0ZSkKKwkJcmV0dXJuIDA7CisKKwlyZWcgJj0gfihTRFhDX0NBTF9ETF9NQVNLIDw8IFNEWENfQ0FMX0RMX1NXX1NISUZUKTsKKwlyZWcgJj0gflNEWENfQ0FMX0RMX1NXX0VOOworCisJd3JpdGVsKHJlZyB8IFNEWENfQ0FMX1NUQVJULCBob3N0LT5yZWdfYmFzZSArIHJlZ19vZmYpOworCisJZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksICJjYWxpYnJhdGlvbiBzdGFydGVkXG4iKTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgSFogKiBTRFhDX0NBTF9USU1FT1VUOworCisJd2hpbGUgKCEoKHJlZyA9IHJlYWRsKGhvc3QtPnJlZ19iYXNlICsgcmVnX29mZikpICYgU0RYQ19DQUxfRE9ORSkpIHsKKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJY3B1X3JlbGF4KCk7CisJCWVsc2UgeworCQkJcmVnICY9IH5TRFhDX0NBTF9TVEFSVDsKKwkJCXdyaXRlbChyZWcsIGhvc3QtPnJlZ19iYXNlICsgcmVnX29mZik7CisKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJfQorCisJZGVsYXkgPSAocmVnID4+IFNEWENfQ0FMX0RMX1NISUZUKSAmIFNEWENfQ0FMX0RMX01BU0s7CisKKwlyZWcgJj0gflNEWENfQ0FMX1NUQVJUOworCXJlZyB8PSAoZGVsYXkgPDwgU0RYQ19DQUxfRExfU1dfU0hJRlQpIHwgU0RYQ19DQUxfRExfU1dfRU47CisKKwl3cml0ZWwocmVnLCBob3N0LT5yZWdfYmFzZSArIHJlZ19vZmYpOworCisJZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksICJjYWxpYnJhdGlvbiBlbmRlZCwgcmVnIGlzIDB4JXhcbiIsIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdW54aV9tbWNfY2xrX3NldF9waGFzZShzdHJ1Y3Qgc3VueGlfbW1jX2hvc3QgKmhvc3QsCisJCQkJICAgc3RydWN0IG1tY19pb3MgKmlvcywgdTMyIHJhdGUpCit7CisJaW50IGluZGV4OworCisJaWYgKCFob3N0LT5jZmctPmNsa19kZWxheXMpCisJCXJldHVybiAwOworCisJLyogZGV0ZXJtaW5lIGRlbGF5cyAqLworCWlmIChyYXRlIDw9IDQwMDAwMCkgeworCQlpbmRleCA9IFNEWENfQ0xLXzQwMEs7CisJfSBlbHNlIGlmIChyYXRlIDw9IDI1MDAwMDAwKSB7CisJCWluZGV4ID0gU0RYQ19DTEtfMjVNOworCX0gZWxzZSBpZiAocmF0ZSA8PSA1MjAwMDAwMCkgeworCQlpZiAoaW9zLT50aW1pbmcgIT0gTU1DX1RJTUlOR19VSFNfRERSNTAgJiYKKwkJICAgIGlvcy0+dGltaW5nICE9IE1NQ19USU1JTkdfTU1DX0REUjUyKSB7CisJCQlpbmRleCA9IFNEWENfQ0xLXzUwTTsKKwkJfSBlbHNlIGlmIChpb3MtPmJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzgpIHsKKwkJCWluZGV4ID0gU0RYQ19DTEtfNTBNX0REUl84QklUOworCQl9IGVsc2UgeworCQkJaW5kZXggPSBTRFhDX0NMS181ME1fRERSOworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2xrX3NldF9waGFzZShob3N0LT5jbGtfc2FtcGxlLCBob3N0LT5jZmctPmNsa19kZWxheXNbaW5kZXhdLnNhbXBsZSk7CisJY2xrX3NldF9waGFzZShob3N0LT5jbGtfb3V0cHV0LCBob3N0LT5jZmctPmNsa19kZWxheXNbaW5kZXhdLm91dHB1dCk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBzdW54aV9tbWNfY2xrX3NldF9yYXRlKHN0cnVjdCBzdW54aV9tbWNfaG9zdCAqaG9zdCwKIAkJCQkgIHN0cnVjdCBtbWNfaW9zICppb3MpCiB7Ci0JdTMyIHJhdGUsIG9jbGtfZGx5LCBydmFsLCBzY2xrX2RseTsKLQl1MzIgY2xvY2sgPSBpb3MtPmNsb2NrOworCWxvbmcgcmF0ZTsKKwl1MzIgcnZhbCwgY2xvY2sgPSBpb3MtPmNsb2NrOwogCWludCByZXQ7CiAKIAkvKiA4IGJpdCBERFIgcmVxdWlyZXMgYSBoaWdoZXIgbW9kdWxlIGNsb2NrICovCkBAIC02NjYsMTMgKzc2NywxOCBAQAogCQljbG9jayA8PD0gMTsKIAogCXJhdGUgPSBjbGtfcm91bmRfcmF0ZShob3N0LT5jbGtfbW1jLCBjbG9jayk7Ci0JZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksICJzZXR0aW5nIGNsayB0byAlZCwgcm91bmRlZCAlZFxuIiwKKwlpZiAocmF0ZSA8IDApIHsKKwkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksICJlcnJvciByb3VuZGluZyBjbGsgdG8gJWQ6ICVsZFxuIiwKKwkJCWNsb2NrLCByYXRlKTsKKwkJcmV0dXJuIHJhdGU7CisJfQorCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAic2V0dGluZyBjbGsgdG8gJWQsIHJvdW5kZWQgJWxkXG4iLAogCQljbG9jaywgcmF0ZSk7CiAKIAkvKiBzZXR0aW5nIGNsb2NrIHJhdGUgKi8KIAlyZXQgPSBjbGtfc2V0X3JhdGUoaG9zdC0+Y2xrX21tYywgcmF0ZSk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwgImVycm9yIHNldHRpbmcgY2xrIHRvICVkOiAlZFxuIiwKKwkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksICJlcnJvciBzZXR0aW5nIGNsayB0byAlbGQ6ICVkXG4iLAogCQkJcmF0ZSwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC02OTIsMzEgKzc5OCwxNSBAQAogCX0KIAltbWNfd3JpdGVsKGhvc3QsIFJFR19DTEtDUiwgcnZhbCk7CiAKLQkvKiBkZXRlcm1pbmUgZGVsYXlzICovCi0JaWYgKHJhdGUgPD0gNDAwMDAwKSB7Ci0JCW9jbGtfZGx5ID0gaG9zdC0+Y2xrX2RlbGF5c1tTRFhDX0NMS180MDBLXS5vdXRwdXQ7Ci0JCXNjbGtfZGx5ID0gaG9zdC0+Y2xrX2RlbGF5c1tTRFhDX0NMS180MDBLXS5zYW1wbGU7Ci0JfSBlbHNlIGlmIChyYXRlIDw9IDI1MDAwMDAwKSB7Ci0JCW9jbGtfZGx5ID0gaG9zdC0+Y2xrX2RlbGF5c1tTRFhDX0NMS18yNU1dLm91dHB1dDsKLQkJc2Nsa19kbHkgPSBob3N0LT5jbGtfZGVsYXlzW1NEWENfQ0xLXzI1TV0uc2FtcGxlOwotCX0gZWxzZSBpZiAocmF0ZSA8PSA1MjAwMDAwMCkgewotCQlpZiAoaW9zLT50aW1pbmcgIT0gTU1DX1RJTUlOR19VSFNfRERSNTAgJiYKLQkJICAgIGlvcy0+dGltaW5nICE9IE1NQ19USU1JTkdfTU1DX0REUjUyKSB7Ci0JCQlvY2xrX2RseSA9IGhvc3QtPmNsa19kZWxheXNbU0RYQ19DTEtfNTBNXS5vdXRwdXQ7Ci0JCQlzY2xrX2RseSA9IGhvc3QtPmNsa19kZWxheXNbU0RYQ19DTEtfNTBNXS5zYW1wbGU7Ci0JCX0gZWxzZSBpZiAoaW9zLT5idXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF84KSB7Ci0JCQlvY2xrX2RseSA9IGhvc3QtPmNsa19kZWxheXNbU0RYQ19DTEtfNTBNX0REUl84QklUXS5vdXRwdXQ7Ci0JCQlzY2xrX2RseSA9IGhvc3QtPmNsa19kZWxheXNbU0RYQ19DTEtfNTBNX0REUl84QklUXS5zYW1wbGU7Ci0JCX0gZWxzZSB7Ci0JCQlvY2xrX2RseSA9IGhvc3QtPmNsa19kZWxheXNbU0RYQ19DTEtfNTBNX0REUl0ub3V0cHV0OwotCQkJc2Nsa19kbHkgPSBob3N0LT5jbGtfZGVsYXlzW1NEWENfQ0xLXzUwTV9ERFJdLnNhbXBsZTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwlyZXQgPSBzdW54aV9tbWNfY2xrX3NldF9waGFzZShob3N0LCBpb3MsIHJhdGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQljbGtfc2V0X3BoYXNlKGhvc3QtPmNsa19zYW1wbGUsIHNjbGtfZGx5KTsKLQljbGtfc2V0X3BoYXNlKGhvc3QtPmNsa19vdXRwdXQsIG9jbGtfZGx5KTsKKwlyZXQgPSBzdW54aV9tbWNfY2FsaWJyYXRlKGhvc3QsIFNEWENfUkVHX1NBTVBfRExfUkVHKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogVE9ETzogZW5hYmxlIGNhbGlicmF0ZSBvbiBzZGMyIFNEWENfUkVHX0RTX0RMX1JFRyBvZiBBNjQgKi8KIAogCXJldHVybiBzdW54aV9tbWNfb2Nsa19vbm9mZihob3N0LCAxKTsKIH0KQEAgLTkzOCwxNCArMTAyOCw2IEBACiAJcmV0dXJuICEhKG1tY19yZWFkbChob3N0LCBSRUdfU1RBUykgJiBTRFhDX0NBUkRfREFUQV9CVVNZKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VueGlfbW1jX29mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLW1tYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNWktYTEzLW1tYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuOWktYTgwLW1tYyIsIH0sCi0JeyAvKiBzZW50aW5lbCAqLyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3VueGlfbW1jX29mX21hdGNoKTsKLQogc3RhdGljIHN0cnVjdCBtbWNfaG9zdF9vcHMgc3VueGlfbW1jX29wcyA9IHsKIAkucmVxdWVzdAkgPSBzdW54aV9tbWNfcmVxdWVzdCwKIAkuc2V0X2lvcwkgPSBzdW54aV9tbWNfc2V0X2lvcywKQEAgLTk3NCwyMSArMTA1Niw1NCBAQAogCVtTRFhDX0NMS181ME1fRERSXzhCSVRdCT0geyAub3V0cHV0ID0gIDcyLCAuc2FtcGxlID0gIDcyIH0sCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHN1bnhpX21tY19jZmcgc3VuNGlfYTEwX2NmZyA9IHsKKwkuaWRtYV9kZXNfc2l6ZV9iaXRzID0gMTMsCisJLmNsa19kZWxheXMgPSBOVUxMLAorCS5jYW5fY2FsaWJyYXRlID0gZmFsc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN1bnhpX21tY19jZmcgc3VuNWlfYTEzX2NmZyA9IHsKKwkuaWRtYV9kZXNfc2l6ZV9iaXRzID0gMTYsCisJLmNsa19kZWxheXMgPSBOVUxMLAorCS5jYW5fY2FsaWJyYXRlID0gZmFsc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN1bnhpX21tY19jZmcgc3VuN2lfYTIwX2NmZyA9IHsKKwkuaWRtYV9kZXNfc2l6ZV9iaXRzID0gMTYsCisJLmNsa19kZWxheXMgPSBzdW54aV9tbWNfY2xrX2RlbGF5cywKKwkuY2FuX2NhbGlicmF0ZSA9IGZhbHNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdW54aV9tbWNfY2ZnIHN1bjlpX2E4MF9jZmcgPSB7CisJLmlkbWFfZGVzX3NpemVfYml0cyA9IDE2LAorCS5jbGtfZGVsYXlzID0gc3VuOWlfbW1jX2Nsa19kZWxheXMsCisJLmNhbl9jYWxpYnJhdGUgPSBmYWxzZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VueGlfbW1jX2NmZyBzdW41MGlfYTY0X2NmZyA9IHsKKwkuaWRtYV9kZXNfc2l6ZV9iaXRzID0gMTYsCisJLmNsa19kZWxheXMgPSBOVUxMLAorCS5jYW5fY2FsaWJyYXRlID0gdHJ1ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bnhpX21tY19vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1tbWMiLCAuZGF0YSA9ICZzdW40aV9hMTBfY2ZnIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNWktYTEzLW1tYyIsIC5kYXRhID0gJnN1bjVpX2ExM19jZmcgfSwKKwl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW43aS1hMjAtbW1jIiwgLmRhdGEgPSAmc3VuN2lfYTIwX2NmZyB9LAorCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjlpLWE4MC1tbWMiLCAuZGF0YSA9ICZzdW45aV9hODBfY2ZnIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNTBpLWE2NC1tbWMiLCAuZGF0YSA9ICZzdW41MGlfYTY0X2NmZyB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN1bnhpX21tY19vZl9tYXRjaCk7CisKIHN0YXRpYyBpbnQgc3VueGlfbW1jX3Jlc291cmNlX3JlcXVlc3Qoc3RydWN0IHN1bnhpX21tY19ob3N0ICpob3N0LAogCQkJCSAgICAgIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwogCWludCByZXQ7CiAKLQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJhbGx3aW5uZXIsc3VuNGktYTEwLW1tYyIpKQotCQlob3N0LT5pZG1hX2Rlc19zaXplX2JpdHMgPSAxMzsKLQllbHNlCi0JCWhvc3QtPmlkbWFfZGVzX3NpemVfYml0cyA9IDE2OwotCi0JaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiYWxsd2lubmVyLHN1bjlpLWE4MC1tbWMiKSkKLQkJaG9zdC0+Y2xrX2RlbGF5cyA9IHN1bjlpX21tY19jbGtfZGVsYXlzOwotCWVsc2UKLQkJaG9zdC0+Y2xrX2RlbGF5cyA9IHN1bnhpX21tY19jbGtfZGVsYXlzOworCWhvc3QtPmNmZyA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSgmcGRldi0+ZGV2KTsKKwlpZiAoIWhvc3QtPmNmZykKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXQgPSBtbWNfcmVndWxhdG9yX2dldF9zdXBwbHkoaG9zdC0+bW1jKTsKIAlpZiAocmV0KSB7CkBAIC0xMDE0LDE2ICsxMTI5LDE4IEBACiAJCXJldHVybiBQVFJfRVJSKGhvc3QtPmNsa19tbWMpOwogCX0KIAotCWhvc3QtPmNsa19vdXRwdXQgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgIm91dHB1dCIpOwotCWlmIChJU19FUlIoaG9zdC0+Y2xrX291dHB1dCkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGQgbm90IGdldCBvdXRwdXQgY2xvY2tcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihob3N0LT5jbGtfb3V0cHV0KTsKLQl9CisJaWYgKGhvc3QtPmNmZy0+Y2xrX2RlbGF5cykgeworCQlob3N0LT5jbGtfb3V0cHV0ID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJvdXRwdXQiKTsKKwkJaWYgKElTX0VSUihob3N0LT5jbGtfb3V0cHV0KSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGQgbm90IGdldCBvdXRwdXQgY2xvY2tcbiIpOworCQkJcmV0dXJuIFBUUl9FUlIoaG9zdC0+Y2xrX291dHB1dCk7CisJCX0KIAotCWhvc3QtPmNsa19zYW1wbGUgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInNhbXBsZSIpOwotCWlmIChJU19FUlIoaG9zdC0+Y2xrX3NhbXBsZSkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGQgbm90IGdldCBzYW1wbGUgY2xvY2tcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihob3N0LT5jbGtfc2FtcGxlKTsKKwkJaG9zdC0+Y2xrX3NhbXBsZSA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAic2FtcGxlIik7CisJCWlmIChJU19FUlIoaG9zdC0+Y2xrX3NhbXBsZSkpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkIG5vdCBnZXQgc2FtcGxlIGNsb2NrXG4iKTsKKwkJCXJldHVybiBQVFJfRVJSKGhvc3QtPmNsa19zYW1wbGUpOworCQl9CiAJfQogCiAJaG9zdC0+cmVzZXQgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0X29wdGlvbmFsKCZwZGV2LT5kZXYsICJhaGIiKTsKQEAgLTExMjAsMTUgKzEyMzcsMTcgQEAKIAltbWMtPm1heF9ibGtfY291bnQJPSA4MTkyOwogCW1tYy0+bWF4X2Jsa19zaXplCT0gNDA5NjsKIAltbWMtPm1heF9zZWdzCQk9IFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3Qgc3VueGlfaWRtYV9kZXMpOwotCW1tYy0+bWF4X3NlZ19zaXplCT0gKDEgPDwgaG9zdC0+aWRtYV9kZXNfc2l6ZV9iaXRzKTsKKwltbWMtPm1heF9zZWdfc2l6ZQk9ICgxIDw8IGhvc3QtPmNmZy0+aWRtYV9kZXNfc2l6ZV9iaXRzKTsKIAltbWMtPm1heF9yZXFfc2l6ZQk9IG1tYy0+bWF4X3NlZ19zaXplICogbW1jLT5tYXhfc2VnczsKIAkvKiA0MDBrSHogfiA1Mk1IeiAqLwogCW1tYy0+Zl9taW4JCT0gICA0MDAwMDA7CiAJbW1jLT5mX21heAkJPSA1MjAwMDAwMDsKIAltbWMtPmNhcHMJICAgICAgIHw9IE1NQ19DQVBfTU1DX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RfSElHSFNQRUVEIHwKLQkJCQkgIE1NQ19DQVBfMV84Vl9ERFIgfAogCQkJCSAgTU1DX0NBUF9FUkFTRSB8IE1NQ19DQVBfU0RJT19JUlE7CiAKKwlpZiAoaG9zdC0+Y2ZnLT5jbGtfZGVsYXlzKQorCQltbWMtPmNhcHMgICAgICB8PSBNTUNfQ0FQXzFfOFZfRERSOworCiAJcmV0ID0gbW1jX29mX3BhcnNlKG1tYyk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9mcmVlX2RtYTsKQEAgLTExNjAsNiArMTI3OSw4IEBACiAJaWYgKCFJU19FUlIoaG9zdC0+cmVzZXQpKQogCQlyZXNldF9jb250cm9sX2Fzc2VydChob3N0LT5yZXNldCk7CiAKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoaG9zdC0+Y2xrX3NhbXBsZSk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhvc3QtPmNsa19vdXRwdXQpOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShob3N0LT5jbGtfbW1jKTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoaG9zdC0+Y2xrX2FoYik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWMuaCBiL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWMuaAppbmRleCA3ZjYzZWMwLi44ZTEyNmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5oCkBAIC03OSw2ICs3OSw5IEBACiAjZGVmaW5lCUNMS19DVExfRElWX01BU0sJMHhmZgogI2RlZmluZQlDTEtfQ1RMX1NDTEtFTgkJQklUKDgpCiAKKyNkZWZpbmUgQ0FSRF9PUFRfV0lEVEg4CQlCSVQoMTMpCisjZGVmaW5lIENBUkRfT1BUX1dJRFRICQlCSVQoMTUpCisKICNkZWZpbmUgVE1JT19CQlMJCTUxMgkJLyogQm9vdCBibG9jayBzaXplICovCiAKIC8qIERlZmluaXRpb25zIGZvciB2YWx1ZXMgdGhlIENUUkxfU0RJT19TVEFUVVMgcmVnaXN0ZXIgY2FuIHRha2UuICovCkBAIC0xNTgsNiArMTYxLDcgQEAKIAl2b2lkICgqY2xrX2Rpc2FibGUpKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0KTsKIAlpbnQgKCptdWx0aV9pb19xdWlyaykoc3RydWN0IG1tY19jYXJkICpjYXJkLAogCQkJICAgICAgdW5zaWduZWQgaW50IGRpcmVjdGlvbiwgaW50IGJsa19zaXplKTsKKwlpbnQgKCpjYXJkX2J1c3kpKHN0cnVjdCBtbWNfaG9zdCAqbW1jKTsKIAlpbnQgKCpzdGFydF9zaWduYWxfdm9sdGFnZV9zd2l0Y2gpKHN0cnVjdCBtbWNfaG9zdCAqbW1jLAogCQkJCQkgICBzdHJ1Y3QgbW1jX2lvcyAqaW9zKTsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jX3Bpby5jIGIvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tY19waW8uYwppbmRleCA5MjQ2N2VmLi43MDA1Njc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jX3Bpby5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWNfcGlvLmMKQEAgLTMzNiw3ICszMzYsOSBAQAogCiAJc3dpdGNoIChtbWNfcmVzcF90eXBlKGNtZCkpIHsKIAljYXNlIE1NQ19SU1BfTk9ORTogYyB8PSBSRVNQX05PTkU7IGJyZWFrOwotCWNhc2UgTU1DX1JTUF9SMTogICBjIHw9IFJFU1BfUjE7ICAgYnJlYWs7CisJY2FzZSBNTUNfUlNQX1IxOgorCWNhc2UgTU1DX1JTUF9SMV9OT19DUkM6CisJCQkgICBjIHw9IFJFU1BfUjE7ICAgYnJlYWs7CiAJY2FzZSBNTUNfUlNQX1IxQjogIGMgfD0gUkVTUF9SMUI7ICBicmVhazsKIAljYXNlIE1NQ19SU1BfUjI6ICAgYyB8PSBSRVNQX1IyOyAgIGJyZWFrOwogCWNhc2UgTU1DX1JTUF9SMzogICBjIHw9IFJFU1BfUjM7ICAgYnJlYWs7CkBAIC03MzAsMTIgKzczMiwxMyBAQAogCXByX2RlYnVnKCJzZXR1cCBkYXRhIHRyYW5zZmVyOiBibG9ja3NpemUgJTA4eCAgbnJfYmxvY2tzICVkXG4iLAogCQkgZGF0YS0+Ymxrc3osIGRhdGEtPmJsb2Nrcyk7CiAKLQkvKiBTb21lIGhhcmR3YXJlIGNhbm5vdCBwZXJmb3JtIDIgYnl0ZSByZXF1ZXN0cyBpbiA0IGJpdCBtb2RlICovCi0JaWYgKGhvc3QtPm1tYy0+aW9zLmJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzQpIHsKKwkvKiBTb21lIGhhcmR3YXJlIGNhbm5vdCBwZXJmb3JtIDIgYnl0ZSByZXF1ZXN0cyBpbiA0LzggYml0IG1vZGUgKi8KKwlpZiAoaG9zdC0+bW1jLT5pb3MuYnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfNCB8fAorCSAgICBob3N0LT5tbWMtPmlvcy5idXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF84KSB7CiAJCWludCBibGtzel8yYnl0ZXMgPSBwZGF0YS0+ZmxhZ3MgJiBUTUlPX01NQ19CTEtTWl8yQllURVM7CiAKIAkJaWYgKGRhdGEtPmJsa3N6IDwgMiB8fCAoZGF0YS0+Ymxrc3ogPCA0ICYmICFibGtzel8yYnl0ZXMpKSB7Ci0JCQlwcl9lcnIoIiVzOiAlZCBieXRlIGJsb2NrIHVuc3VwcG9ydGVkIGluIDQgYml0IG1vZGVcbiIsCisJCQlwcl9lcnIoIiVzOiAlZCBieXRlIGJsb2NrIHVuc3VwcG9ydGVkIGluIDQvOCBiaXQgbW9kZVxuIiwKIAkJCSAgICAgICBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgZGF0YS0+Ymxrc3opOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTg1NywxNCArODYwLDE2IEBACiBzdGF0aWMgdm9pZCB0bWlvX21tY19zZXRfYnVzX3dpZHRoKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LAogCQkJCXVuc2lnbmVkIGNoYXIgYnVzX3dpZHRoKQogewotCXN3aXRjaCAoYnVzX3dpZHRoKSB7Ci0JY2FzZSBNTUNfQlVTX1dJRFRIXzE6Ci0JCXNkX2N0cmxfd3JpdGUxNihob3N0LCBDVExfU0RfTUVNX0NBUkRfT1BULCAweDgwZTApOwotCQlicmVhazsKLQljYXNlIE1NQ19CVVNfV0lEVEhfNDoKLQkJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9TRF9NRU1fQ0FSRF9PUFQsIDB4MDBlMCk7Ci0JCWJyZWFrOwotCX0KKwl1MTYgcmVnID0gc2RfY3RybF9yZWFkMTYoaG9zdCwgQ1RMX1NEX01FTV9DQVJEX09QVCkKKwkJCQkmIH4oQ0FSRF9PUFRfV0lEVEggfCBDQVJEX09QVF9XSURUSDgpOworCisJLyogcmVnIG5vdyBhcHBsaWVzIHRvIE1NQ19CVVNfV0lEVEhfNCAqLworCWlmIChidXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF8xKQorCQlyZWcgfD0gQ0FSRF9PUFRfV0lEVEg7CisJZWxzZSBpZiAoYnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfOCkKKwkJcmVnIHw9IENBUkRfT1BUX1dJRFRIODsKKworCXNkX2N0cmxfd3JpdGUxNihob3N0LCBDVExfU0RfTUVNX0NBUkRfT1BULCByZWcpOwogfQogCiAvKiBTZXQgTU1DIGNsb2NrIC8gcG93ZXIuCkBAIC05NjAsMjAgKzk2NSwxMiBAQAogCXJldHVybiBibGtfc2l6ZTsKIH0KIAotc3RhdGljIGludCB0bWlvX21tY19jYXJkX2J1c3koc3RydWN0IG1tY19ob3N0ICptbWMpCi17Ci0Jc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOwotCi0JcmV0dXJuICEoc2RfY3RybF9yZWFkMTZfYW5kXzE2X2FzXzMyKGhvc3QsIENUTF9TVEFUVVMpICYgVE1JT19TVEFUX0RBVDApOwotfQotCiBzdGF0aWMgc3RydWN0IG1tY19ob3N0X29wcyB0bWlvX21tY19vcHMgPSB7CiAJLnJlcXVlc3QJPSB0bWlvX21tY19yZXF1ZXN0LAogCS5zZXRfaW9zCT0gdG1pb19tbWNfc2V0X2lvcywKIAkuZ2V0X3JvICAgICAgICAgPSB0bWlvX21tY19nZXRfcm8sCiAJLmdldF9jZAkJPSBtbWNfZ3Bpb19nZXRfY2QsCiAJLmVuYWJsZV9zZGlvX2lycSA9IHRtaW9fbW1jX2VuYWJsZV9zZGlvX2lycSwKLQkuY2FyZF9idXN5CT0gdG1pb19tbWNfY2FyZF9idXN5LAogCS5tdWx0aV9pb19xdWlyawk9IHRtaW9fbXVsdGlfaW9fcXVpcmssCiB9OwogCkBAIC0xMDcyLDYgKzEwNjksNyBAQAogCQlnb3RvIGhvc3RfZnJlZTsKIAl9CiAKKwl0bWlvX21tY19vcHMuY2FyZF9idXN5ID0gX2hvc3QtPmNhcmRfYnVzeTsKIAl0bWlvX21tY19vcHMuc3RhcnRfc2lnbmFsX3ZvbHRhZ2Vfc3dpdGNoID0gX2hvc3QtPnN0YXJ0X3NpZ25hbF92b2x0YWdlX3N3aXRjaDsKIAltbWMtPm9wcyA9ICZ0bWlvX21tY19vcHM7CiAKQEAgLTEwODksNiArMTA4NywxNSBAQAogCQkJCSAgIW1tY19jYXJkX2lzX3JlbW92YWJsZShtbWMpIHx8CiAJCQkJICBtbWMtPnNsb3QuY2RfaXJxID49IDApOwogCisJLyoKKwkgKiBPbiBHZW4yKywgZU1NQyB3aXRoIE5PTlJFTU9WQUJMRSBjdXJyZW50bHkgZmFpbHMgYmVjYXVzZSBuYXRpdmUKKwkgKiBob3RwbHVnIGdldHMgZGlzYWJsZWQuIEl0IHNlZW1zIFJ1bnRpbWVQTSByZWxhdGVkIHlldCB3ZSBuZWVkIGZ1cnRoZXIKKwkgKiByZXNlYXJjaC4gU2luY2Ugd2UgYXJlIHBsYW5uaW5nIGEgUE0gb3ZlcmhhdWwgYW55d2F5LCBsZXQncyBlbmZvcmNlCisJICogZm9yIG5vdyB0aGUgZGV2aWNlIGJlaW5nIGFjdGl2ZSBieSBlbmFibGluZyBuYXRpdmUgaG90cGx1ZyBhbHdheXMuCisJICovCisJaWYgKHBkYXRhLT5mbGFncyAmIFRNSU9fTU1DX01JTl9SQ0FSMikKKwkJX2hvc3QtPm5hdGl2ZV9ob3RwbHVnID0gdHJ1ZTsKKwogCWlmICh0bWlvX21tY19jbGtfZW5hYmxlKF9ob3N0KSA8IDApIHsKIAkJbW1jLT5mX21heCA9IHBkYXRhLT5oY2xrOwogCQltbWMtPmZfbWluID0gbW1jLT5mX21heCAvIDUxMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvdnViMzAwLmMgYi9kcml2ZXJzL21tYy9ob3N0L3Z1YjMwMC5jCmluZGV4IDFlODE5ZjkuLmJiM2UwZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvdnViMzAwLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC92dWIzMDAuYwpAQCAtMjExNiwxMyArMjExNiwxMSBAQAogCWNvbW1hbmRfb3V0X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb21tYW5kX291dF91cmIpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKLQkJZGV2X2VycigmdWRldi0+ZGV2LCAibm90IGVub3VnaCBtZW1vcnkgZm9yIGNvbW1hbmRfb3V0X3VyYlxuIik7CiAJCWdvdG8gZXJyb3IwOwogCX0KIAljb21tYW5kX3Jlc191cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCWlmICghY29tbWFuZF9yZXNfdXJiKSB7CiAJCXJldHZhbCA9IC1FTk9NRU07Ci0JCWRldl9lcnIoJnVkZXYtPmRldiwgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBjb21tYW5kX3Jlc191cmJcbiIpOwogCQlnb3RvIGVycm9yMTsKIAl9CiAJLyogdGhpcyBhbHNvIGFsbG9jYXRlcyBtZW1vcnkgZm9yIG91ciBWVUIzMDAgbW1jIGhvc3QgZGV2aWNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2RhdmluY2lfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9kYXZpbmNpX25hbmQuYwppbmRleCBjYzA3YmEwLi4yN2ZhOGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2RhdmluY2lfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvZGF2aW5jaV9uYW5kLmMKQEAgLTI0MCw2ICsyNDAsOSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIHZhbDsKIAorCS8qIFJlc2V0IEVDQyBoYXJkd2FyZSAqLworCWRhdmluY2lfbmFuZF9yZWFkbChpbmZvLCBOQU5EXzRCSVRfRUNDMV9PRkZTRVQpOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdmluY2lfbmFuZF9sb2NrLCBmbGFncyk7CiAKIAkvKiBTdGFydCA0LWJpdCBFQ0MgY2FsY3VsYXRpb24gZm9yIHJlYWQvd3JpdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbXRrX2VjYy5jIGIvZHJpdmVycy9tdGQvbmFuZC9tdGtfZWNjLmMKaW5kZXggMjVhNGZiZC4uZDU0ZjY2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9tdGtfZWNjLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9tdGtfZWNjLmMKQEAgLTM2Niw3ICszNjYsOCBAQAogCQkgICB1OCAqZGF0YSwgdTMyIGJ5dGVzKQogewogCWRtYV9hZGRyX3QgYWRkcjsKLQl1MzIgKnAsIGxlbiwgaTsKKwl1OCAqcDsKKwl1MzIgbGVuLCBpLCB2YWw7CiAJaW50IHJldCA9IDA7CiAKIAlhZGRyID0gZG1hX21hcF9zaW5nbGUoZWNjLT5kZXYsIGRhdGEsIGJ5dGVzLCBETUFfVE9fREVWSUNFKTsKQEAgLTM5MiwxMSArMzkzLDE0IEBACiAKIAkvKiBQcm9ncmFtIEVDQyBieXRlcyB0byBPT0I6IHBlciBzZWN0b3Igb29iID0gRkRNICsgRUNDICsgU1BBUkUgKi8KIAlsZW4gPSAoY29uZmlnLT5zdHJlbmd0aCAqIEVDQ19QQVJJVFlfQklUUyArIDcpID4+IDM7Ci0JcCA9ICh1MzIgKikoZGF0YSArIGJ5dGVzKTsKKwlwID0gZGF0YSArIGJ5dGVzOwogCiAJLyogd3JpdGUgdGhlIHBhcml0eSBieXRlcyBnZW5lcmF0ZWQgYnkgdGhlIEVDQyBiYWNrIHRvIHRoZSBPT0IgcmVnaW9uICovCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQlwW2ldID0gcmVhZGwoZWNjLT5yZWdzICsgRUNDX0VOQ1BBUihpKSk7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmICgoaSAlIDQpID09IDApCisJCQl2YWwgPSByZWFkbChlY2MtPnJlZ3MgKyBFQ0NfRU5DUEFSKGkgLyA0KSk7CisJCXBbaV0gPSAodmFsID4+ICgoaSAlIDQpICogOCkpICYgMHhmZjsKKwl9CiB0aW1lb3V0OgogCiAJZG1hX3VubWFwX3NpbmdsZShlY2MtPmRldiwgYWRkciwgYnl0ZXMsIERNQV9UT19ERVZJQ0UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9tdGtfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9tdGtfbmFuZC5jCmluZGV4IGRkYWEyYWMuLjUyMjNhMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbXRrX25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL210a19uYW5kLmMKQEAgLTkzLDYgKzkzLDkgQEAKICNkZWZpbmUJCU5GSV9GU01fTUFTSwkJKDB4ZiA8PCAxNikKICNkZWZpbmUgTkZJX0FERFJDTlRSCQkoMHg3MCkKICNkZWZpbmUJCUNOVFJfTUFTSwkJR0VOTUFTSygxNiwgMTIpCisjZGVmaW5lCQlBRERSQ05UUl9TRUNfU0hJRlQJKDEyKQorI2RlZmluZQkJQUREUkNOVFJfU0VDKHZhbCkgXAorCQkoKCh2YWwpICYgQ05UUl9NQVNLKSA+PiBBRERSQ05UUl9TRUNfU0hJRlQpCiAjZGVmaW5lIE5GSV9TVFJBRERSCQkoMHg4MCkKICNkZWZpbmUgTkZJX0JZVEVMRU4JCSgweDg0KQogI2RlZmluZSBORklfQ1NFTAkJKDB4OTApCkBAIC02OTksNyArNzAyLDcgQEAKIAl9CiAKIAlyZXQgPSByZWFkbF9wb2xsX3RpbWVvdXRfYXRvbWljKG5mYy0+cmVncyArIE5GSV9BRERSQ05UUiwgcmVnLAotCQkJCQkocmVnICYgQ05UUl9NQVNLKSA+PSBjaGlwLT5lY2Muc3RlcHMsCisJCQkJCUFERFJDTlRSX1NFQyhyZWcpID49IGNoaXAtPmVjYy5zdGVwcywKIAkJCQkJMTAsIE1US19USU1FT1VUKTsKIAlpZiAocmV0KQogCQlkZXZfZXJyKGRldiwgImh3ZWNjIHdyaXRlIHRpbWVvdXRcbiIpOwpAQCAtOTAyLDcgKzkwNSw3IEBACiAJCWRldl93YXJuKG5mYy0+ZGV2LCAicmVhZCBhaGIvZG1hIGRvbmUgdGltZW91dFxuIik7CiAKIAlyYyA9IHJlYWRsX3BvbGxfdGltZW91dF9hdG9taWMobmZjLT5yZWdzICsgTkZJX0JZVEVMRU4sIHJlZywKLQkJCQkgICAgICAgKHJlZyAmIENOVFJfTUFTSykgPj0gc2VjdG9ycywgMTAsCisJCQkJICAgICAgIEFERFJDTlRSX1NFQyhyZWcpID49IHNlY3RvcnMsIDEwLAogCQkJCSAgICAgICBNVEtfVElNRU9VVCk7CiAJaWYgKHJjIDwgMCkgewogCQlkZXZfZXJyKG5mYy0+ZGV2LCAic3VicGFnZSBkb25lIHRpbWVvdXRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9teGNfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9teGNfbmFuZC5jCmluZGV4IDUxNzNmYWQuLjU3Y2JlMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbXhjX25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL214Y19uYW5kLmMKQEAgLTk0Myw3ICs5NDMsNyBAQAogCXN0cnVjdCBuYW5kX2NoaXAgKm5hbmRfY2hpcCA9IG10ZF90b19uYW5kKG10ZCk7CiAJaW50IHN0ZXBzaXplID0gbmFuZF9jaGlwLT5lY2MuYnl0ZXMgPT0gOSA/IDE2IDogMjY7CiAKLQlpZiAoc2VjdGlvbiA+IG5hbmRfY2hpcC0+ZWNjLnN0ZXBzKQorCWlmIChzZWN0aW9uID49IG5hbmRfY2hpcC0+ZWNjLnN0ZXBzKQogCQlyZXR1cm4gLUVSQU5HRTsKIAogCWlmICghc2VjdGlvbikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9vbWFwMi5jIGIvZHJpdmVycy9tdGQvbmFuZC9vbWFwMi5jCmluZGV4IGE1OTM2MWMuLjU1MTNiZmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL29tYXAyLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9vbWFwMi5jCkBAIC0yMTY5LDcgKzIxNjksNyBAQAogCXJldHVybiAwOwogCiByZXR1cm5fZXJyb3I6Ci0JaWYgKGluZm8tPmRtYSkKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKGluZm8tPmRtYSkpCiAJCWRtYV9yZWxlYXNlX2NoYW5uZWwoaW5mby0+ZG1hKTsKIAlpZiAobmFuZF9jaGlwLT5lY2MucHJpdikgewogCQluYW5kX2JjaF9mcmVlKG5hbmRfY2hpcC0+ZWNjLnByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggMGM1NDE1Yi4uOTVjMzJmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC0xNDksNiArMTQ5LDggQEAKICAgICB0cmlzdGF0ZSAiSVAtVkxBTiBzdXBwb3J0IgogICAgIGRlcGVuZHMgb24gSU5FVAogICAgIGRlcGVuZHMgb24gSVBWNgorICAgIGRlcGVuZHMgb24gTkVURklMVEVSCisgICAgZGVwZW5kcyBvbiBORVRfTDNfTUFTVEVSX0RFVgogICAgIC0tLWhlbHAtLS0KICAgICAgIFRoaXMgYWxsb3dzIG9uZSB0byBjcmVhdGUgdmlydHVhbCBkZXZpY2VzIG9mZiBvZiBhIG1haW4gaW50ZXJmYWNlCiAgICAgICBhbmQgcGFja2V0cyB3aWxsIGJlIGRlbGl2ZXJlZCBiYXNlZCBvbiB0aGUgZGVzdCBMMyAoSVB2Ni9JUHY0IGFkZHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYwppbmRleCAxZjI3NmZhLi4zZjMxY2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogTU9EVUxFX1BBUk1fREVTQyhsYWNwX3JhdGUsICJMQUNQRFUgdHggcmF0ZSB0byByZXF1ZXN0IGZyb20gODAyLjNhZCBwYXJ0bmVyOyAiCiAJCQkgICAgIjAgZm9yIHNsb3csIDEgZm9yIGZhc3QiKTsKIG1vZHVsZV9wYXJhbShhZF9zZWxlY3QsIGNoYXJwLCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoYWRfc2VsZWN0LCAiODAzLmFkIGFnZ3JlZ2F0aW9uIHNlbGVjdGlvbiBsb2dpYzsgIgorTU9EVUxFX1BBUk1fREVTQyhhZF9zZWxlY3QsICI4MDIuM2FkIGFnZ3JlZ2F0aW9uIHNlbGVjdGlvbiBsb2dpYzsgIgogCQkJICAgICIwIGZvciBzdGFibGUgKGRlZmF1bHQpLCAxIGZvciBiYW5kd2lkdGgsICIKIAkJCSAgICAiMiBmb3IgY291bnQiKTsKIG1vZHVsZV9wYXJhbShtaW5fbGlua3MsIGludCwgMCk7CkBAIC0xMzQxLDkgKzEzNDEsMTAgQEAKIAkJCSAgICBzbGF2ZV9kZXYtPm5hbWUpOwogCX0KIAotCS8qIGFscmVhZHkgZW5zbGF2ZWQgKi8KLQlpZiAoc2xhdmVfZGV2LT5mbGFncyAmIElGRl9TTEFWRSkgewotCQluZXRkZXZfZGJnKGJvbmRfZGV2LCAiRXJyb3I6IERldmljZSB3YXMgYWxyZWFkeSBlbnNsYXZlZFxuIik7CisJLyogYWxyZWFkeSBpbi11c2U/ICovCisJaWYgKG5ldGRldl9pc19yeF9oYW5kbGVyX2J1c3koc2xhdmVfZGV2KSkgeworCQluZXRkZXZfZXJyKGJvbmRfZGV2LAorCQkJICAgIkVycm9yOiBEZXZpY2UgaXMgaW4gdXNlIGFuZCBjYW5ub3QgYmUgZW5zbGF2ZWRcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtNDYyNyw3ICs0NjI4LDcgQEAKIAogCW5ldGRldl9kYmcoYm9uZF9kZXYsICJCZWdpbiBib25kX2luaXRcbiIpOwogCi0JYm9uZC0+d3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShib25kX2Rldi0+bmFtZSk7CisJYm9uZC0+d3EgPSBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZShib25kX2Rldi0+bmFtZSwgV1FfTUVNX1JFQ0xBSU0pOwogCWlmICghYm9uZC0+d3EpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vZGV2LmMgYi9kcml2ZXJzL25ldC9jYW4vZGV2LmMKaW5kZXggZTIxZjdjYy4uOGQ2MjA4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL2Rldi5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9kZXYuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9jYW4uaD4KICNpbmNsdWRlIDxsaW51eC9jYW4vZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvY2FuL3NrYi5oPgpAQCAtNTAxLDkgKzUwMiw4IEBACiAvKgogICogQ0FOIGRldmljZSByZXN0YXJ0IGZvciBidXMtb2ZmIHJlY292ZXJ5CiAgKi8KLXN0YXRpYyB2b2lkIGNhbl9yZXN0YXJ0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIGNhbl9yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CiAJc3RydWN0IGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZGV2LT5zdGF0czsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtNTQzLDYgKzU0MywxNCBAQAogCQluZXRkZXZfZXJyKGRldiwgIkVycm9yICVkIGR1cmluZyByZXN0YXJ0IiwgZXJyKTsKIH0KIAorc3RhdGljIHZvaWQgY2FuX3Jlc3RhcnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7CisJc3RydWN0IGNhbl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgY2FuX3ByaXYsIHJlc3RhcnRfd29yayk7CisKKwljYW5fcmVzdGFydChwcml2LT5kZXYpOworfQorCiBpbnQgY2FuX3Jlc3RhcnRfbm93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTU1Niw4ICs1NjQsOCBAQAogCWlmIChwcml2LT5zdGF0ZSAhPSBDQU5fU1RBVEVfQlVTX09GRikKIAkJcmV0dXJuIC1FQlVTWTsKIAotCS8qIFJ1bnMgYXMgc29vbiBhcyBwb3NzaWJsZSBpbiB0aGUgdGltZXIgY29udGV4dCAqLwotCW1vZF90aW1lcigmcHJpdi0+cmVzdGFydF90aW1lciwgamlmZmllcyk7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5yZXN0YXJ0X3dvcmspOworCWNhbl9yZXN0YXJ0KGRldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU3OCw4ICs1ODYsOCBAQAogCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAKIAlpZiAocHJpdi0+cmVzdGFydF9tcykKLQkJbW9kX3RpbWVyKCZwcml2LT5yZXN0YXJ0X3RpbWVyLAotCQkJICBqaWZmaWVzICsgKHByaXYtPnJlc3RhcnRfbXMgKiBIWikgLyAxMDAwKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5yZXN0YXJ0X3dvcmssCisJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhwcml2LT5yZXN0YXJ0X21zKSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjYW5fYnVzX29mZik7CiAKQEAgLTY4OCw2ICs2OTYsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXByaXYtPmRldiA9IGRldjsKIAogCWlmIChlY2hvX3NrYl9tYXgpIHsKIAkJcHJpdi0+ZWNob19za2JfbWF4ID0gZWNob19za2JfbWF4OwpAQCAtNjk3LDcgKzcwNiw3IEBACiAKIAlwcml2LT5zdGF0ZSA9IENBTl9TVEFURV9TVE9QUEVEOwogCi0JaW5pdF90aW1lcigmcHJpdi0+cmVzdGFydF90aW1lcik7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPnJlc3RhcnRfd29yaywgY2FuX3Jlc3RhcnRfd29yayk7CiAKIAlyZXR1cm4gZGV2OwogfQpAQCAtNzc4LDggKzc4Nyw2IEBACiAJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGRldikpCiAJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKIAotCXNldHVwX3RpbWVyKCZwcml2LT5yZXN0YXJ0X3RpbWVyLCBjYW5fcmVzdGFydCwgKHVuc2lnbmVkIGxvbmcpZGV2KTsKLQogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwob3Blbl9jYW5kZXYpOwpAQCAtNzk0LDcgKzgwMSw3IEBACiB7CiAJc3RydWN0IGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWRlbF90aW1lcl9zeW5jKCZwcml2LT5yZXN0YXJ0X3RpbWVyKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPnJlc3RhcnRfd29yayk7CiAJY2FuX2ZsdXNoX2VjaG9fc2tiKGRldik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjbG9zZV9jYW5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL2ZsZXhjYW4uYyBiL2RyaXZlcnMvbmV0L2Nhbi9mbGV4Y2FuLmMKaW5kZXggNDFjMGZjOS4uMTZmN2NhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL2ZsZXhjYW4uYworKysgYi9kcml2ZXJzL25ldC9jYW4vZmxleGNhbi5jCkBAIC0xMjY4LDExICsxMjY4LDEwIEBACiAJc3RydWN0IGZsZXhjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGVycjsKIAotCWVyciA9IGZsZXhjYW5fY2hpcF9kaXNhYmxlKHByaXYpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCWVyciA9IGZsZXhjYW5fY2hpcF9kaXNhYmxlKHByaXYpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CiAJfQpAQCAtMTI4NSwxMyArMTI4NCwxNyBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAlzdHJ1Y3QgZmxleGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyOwogCiAJcHJpdi0+Y2FuLnN0YXRlID0gQ0FOX1NUQVRFX0VSUk9SX0FDVElWRTsKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CiAJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKIAkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJZXJyID0gZmxleGNhbl9jaGlwX2VuYWJsZShwcml2KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQotCXJldHVybiBmbGV4Y2FuX2NoaXBfZW5hYmxlKHByaXYpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoZmxleGNhbl9wbV9vcHMsIGZsZXhjYW5fc3VzcGVuZCwgZmxleGNhbl9yZXN1bWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL2lmaV9jYW5mZC9pZmlfY2FuZmQuYyBiL2RyaXZlcnMvbmV0L2Nhbi9pZmlfY2FuZmQvaWZpX2NhbmZkLmMKaW5kZXggMmQxZDIyZS4uMzY4YmIwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL2lmaV9jYW5mZC9pZmlfY2FuZmQuYworKysgYi9kcml2ZXJzL25ldC9jYW4vaWZpX2NhbmZkL2lmaV9jYW5mZC5jCkBAIC04MSw2ICs4MSwxMCBAQAogI2RlZmluZSBJRklfQ0FORkRfVElNRV9TRVRfVElNRUFfNF8xMl82XzYJQklUKDE1KQogCiAjZGVmaW5lIElGSV9DQU5GRF9UREVMQVkJCQkweDFjCisjZGVmaW5lIElGSV9DQU5GRF9UREVMQVlfREVGQVVMVAkJMHhiCisjZGVmaW5lIElGSV9DQU5GRF9UREVMQVlfTUFTSwkJCTB4M2ZmZgorI2RlZmluZSBJRklfQ0FORkRfVERFTEFZX0FCUwkJCUJJVCgxNCkKKyNkZWZpbmUgSUZJX0NBTkZEX1RERUxBWV9FTgkJCUJJVCgxNSkKIAogI2RlZmluZSBJRklfQ0FORkRfRVJST1IJCQkJMHgyMAogI2RlZmluZSBJRklfQ0FORkRfRVJST1JfVFhfT0ZGU0VUCQkwCkBAIC02NDEsNyArNjQ1LDcgQEAKIAlzdHJ1Y3QgaWZpX2NhbmZkX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAljb25zdCBzdHJ1Y3QgY2FuX2JpdHRpbWluZyAqYnQgPSAmcHJpdi0+Y2FuLmJpdHRpbWluZzsKIAljb25zdCBzdHJ1Y3QgY2FuX2JpdHRpbWluZyAqZGJ0ID0gJnByaXYtPmNhbi5kYXRhX2JpdHRpbWluZzsKLQl1MTYgYnJwLCBzancsIHRzZWcxLCB0c2VnMjsKKwl1MTYgYnJwLCBzancsIHRzZWcxLCB0c2VnMiwgdGRjOwogCiAJLyogQ29uZmlndXJlIGJpdCB0aW1pbmcgKi8KIAlicnAgPSBidC0+YnJwIC0gMjsKQEAgLTY2NCw2ICs2NjgsMTEgQEAKIAkgICAgICAgKGJycCA8PCBJRklfQ0FORkRfVElNRV9QUkVTQ0FMRV9PRkYpIHwKIAkgICAgICAgKHNqdyA8PCBJRklfQ0FORkRfVElNRV9TSldfT0ZGXzdfOV84XzgpLAogCSAgICAgICBwcml2LT5iYXNlICsgSUZJX0NBTkZEX0ZUSU1FKTsKKworCS8qIENvbmZpZ3VyZSB0cmFuc21pdHRlciBkZWxheSAqLworCXRkYyA9IChkYnQtPmJycCAqIChkYnQtPnBoYXNlX3NlZzEgKyAxKSkgJiBJRklfQ0FORkRfVERFTEFZX01BU0s7CisJd3JpdGVsKElGSV9DQU5GRF9UREVMQVlfRU4gfCBJRklfQ0FORkRfVERFTEFZX0FCUyB8IHRkYywKKwkgICAgICAgcHJpdi0+YmFzZSArIElGSV9DQU5GRF9UREVMQVkpOwogfQogCiBzdGF0aWMgdm9pZCBpZmlfY2FuZmRfc2V0X2ZpbHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgY29uc3QgdTMyIGlkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL3VzYi9lbXNfdXNiLmMgYi9kcml2ZXJzL25ldC9jYW4vdXNiL2Vtc191c2IuYwppbmRleCA3MWYwZTc5Li5iM2QwMjc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vdXNiL2Vtc191c2IuYworKysgYi9kcml2ZXJzL25ldC9jYW4vdXNiL2Vtc191c2IuYwpAQCAtNjAwLDcgKzYwMCw2IEBACiAJCS8qIGNyZWF0ZSBhIFVSQiwgYW5kIGEgYnVmZmVyIGZvciBpdCAqLwogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCQlpZiAoIXVyYikgewotCQkJbmV0ZGV2X2VycihuZXRkZXYsICJObyBtZW1vcnkgbGVmdCBmb3IgVVJCc1xuIik7CiAJCQllcnIgPSAtRU5PTUVNOwogCQkJYnJlYWs7CiAJCX0KQEAgLTc1MiwxMCArNzUxLDggQEAKIAogCS8qIGNyZWF0ZSBhIFVSQiwgYW5kIGEgYnVmZmVyIGZvciBpdCwgYW5kIGNvcHkgdGhlIGRhdGEgdG8gdGhlIFVSQiAqLwogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF1cmIpIHsKLQkJbmV0ZGV2X2VycihuZXRkZXYsICJObyBtZW1vcnkgbGVmdCBmb3IgVVJCc1xuIik7CisJaWYgKCF1cmIpCiAJCWdvdG8gbm9tZW07Ci0JfQogCiAJYnVmID0gdXNiX2FsbG9jX2NvaGVyZW50KGRldi0+dWRldiwgc2l6ZSwgR0ZQX0FUT01JQywgJnVyYi0+dHJhbnNmZXJfZG1hKTsKIAlpZiAoIWJ1ZikgewpAQCAtMTAwNywxMCArMTAwNCw4IEBACiAJCWRldi0+dHhfY29udGV4dHNbaV0uZWNob19pbmRleCA9IE1BWF9UWF9VUkJTOwogCiAJZGV2LT5pbnRyX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmludHJfdXJiKSB7Ci0JCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jIGludHIgVVJCXG4iKTsKKwlpZiAoIWRldi0+aW50cl91cmIpCiAJCWdvdG8gY2xlYW51cF9jYW5kZXY7Ci0JfQogCiAJZGV2LT5pbnRyX2luX2J1ZmZlciA9IGt6YWxsb2MoSU5UUl9JTl9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXYtPmludHJfaW5fYnVmZmVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL3VzYi9lc2RfdXNiMi5jIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9lc2RfdXNiMi5jCmluZGV4IDc4NGE5MDAuLmJlOTI4Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi91c2IvZXNkX3VzYjIuYworKysgYi9kcml2ZXJzL25ldC9jYW4vdXNiL2VzZF91c2IyLmMKQEAgLTU1OCw4ICs1NTgsNiBAQAogCQkvKiBjcmVhdGUgYSBVUkIsIGFuZCBhIGJ1ZmZlciBmb3IgaXQgKi8KIAkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWRldl93YXJuKGRldi0+dWRldi0+ZGV2LnBhcmVudCwKLQkJCQkgIk5vIG1lbW9yeSBsZWZ0IGZvciBVUkJzXG4iKTsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlicmVhazsKIAkJfQpAQCAtNzMwLDcgKzcyOCw2IEBACiAJLyogY3JlYXRlIGEgVVJCLCBhbmQgYSBidWZmZXIgZm9yIGl0LCBhbmQgY29weSB0aGUgZGF0YSB0byB0aGUgVVJCICovCiAJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXVyYikgewotCQluZXRkZXZfZXJyKG5ldGRldiwgIk5vIG1lbW9yeSBsZWZ0IGZvciBVUkJzXG4iKTsKIAkJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlnb3RvIG5vdXJibWVtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL3VzYi9nc191c2IuYyBiL2RyaXZlcnMvbmV0L2Nhbi91c2IvZ3NfdXNiLmMKaW5kZXggNmYwY2JjMy4uNzdlM2NjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL3VzYi9nc191c2IuYworKysgYi9kcml2ZXJzL25ldC9jYW4vdXNiL2dzX3VzYi5jCkBAIC00OTMsMTAgKzQ5Myw4IEBACiAKIAkvKiBjcmVhdGUgYSBVUkIsIGFuZCBhIGJ1ZmZlciBmb3IgaXQgKi8KIAl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwotCWlmICghdXJiKSB7Ci0JCW5ldGRldl9lcnIobmV0ZGV2LCAiTm8gbWVtb3J5IGxlZnQgZm9yIFVSQlxuIik7CisJaWYgKCF1cmIpCiAJCWdvdG8gbm9tZW1fdXJiOwotCX0KIAogCWhmID0gdXNiX2FsbG9jX2NvaGVyZW50KGRldi0+dWRldiwgc2l6ZW9mKCpoZiksIEdGUF9BVE9NSUMsCiAJCQkJJnVyYi0+dHJhbnNmZXJfZG1hKTsKQEAgLTYwMCwxMSArNTk4LDggQEAKIAogCQkJLyogYWxsb2MgcnggdXJiICovCiAJCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQkJaWYgKCF1cmIpIHsKLQkJCQluZXRkZXZfZXJyKG5ldGRldiwKLQkJCQkJICAgIk5vIG1lbW9yeSBsZWZ0IGZvciBVUkJcbiIpOworCQkJaWYgKCF1cmIpCiAJCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9CiAKIAkJCS8qIGFsbG9jIHJ4IGJ1ZmZlciAqLwogCQkJYnVmID0gdXNiX2FsbG9jX2NvaGVyZW50KGRldi0+dWRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi91c2Iva3Zhc2VyX3VzYi5jIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9rdmFzZXJfdXNiLmMKaW5kZXggNmYxZjNiNi4uZDUxZTBjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL3VzYi9rdmFzZXJfdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9rdmFzZXJfdXNiLmMKQEAgLTc4NywxMCArNzg3LDggQEAKIAlpbnQgZXJyOwogCiAJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXVyYikgewotCQluZXRkZXZfZXJyKG5ldGRldiwgIk5vIG1lbW9yeSBsZWZ0IGZvciBVUkJzXG4iKTsKKwlpZiAoIXVyYikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGt2YXNlcl9tc2cpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWJ1ZikgewpAQCAtMTM5Myw4ICsxMzkxLDYgQEAKIAogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCQlpZiAoIXVyYikgewotCQkJZGV2X3dhcm4oZGV2LT51ZGV2LT5kZXYucGFyZW50LAotCQkJCSAiTm8gbWVtb3J5IGxlZnQgZm9yIFVSQnNcbiIpOwogCQkJZXJyID0gLUVOT01FTTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xNjcwLDcgKzE2NjYsNiBAQAogCiAJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXVyYikgewotCQluZXRkZXZfZXJyKG5ldGRldiwgIk5vIG1lbW9yeSBsZWZ0IGZvciBVUkJzXG4iKTsKIAkJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gTkVUREVWX1RYX09LOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL3VzYi9wZWFrX3VzYi9wY2FuX3VzYl9jb3JlLmMgYi9kcml2ZXJzL25ldC9jYW4vdXNiL3BlYWtfdXNiL3BjYW5fdXNiX2NvcmUuYwppbmRleCBiZmI5MWQ4Li5jMDYzODJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vdXNiL3BlYWtfdXNiL3BjYW5fdXNiX2NvcmUuYworKysgYi9kcml2ZXJzL25ldC9jYW4vdXNiL3BlYWtfdXNiL3BjYW5fdXNiX2NvcmUuYwpAQCAtMzk5LDcgKzM5OSw2IEBACiAJCS8qIGNyZWF0ZSBhIFVSQiwgYW5kIGEgYnVmZmVyIGZvciBpdCwgdG8gcmVjZWl2ZSB1c2IgbWVzc2FnZXMgKi8KIAkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCW5ldGRldl9lcnIobmV0ZGV2LCAiTm8gbWVtb3J5IGxlZnQgZm9yIFVSQnNcbiIpOwogCQkJZXJyID0gLUVOT01FTTsKIAkJCWJyZWFrOwogCQl9CkBAIC00NTQsNyArNDUzLDYgQEAKIAkJLyogY3JlYXRlIGEgVVJCIGFuZCBhIGJ1ZmZlciBmb3IgaXQsIHRvIHRyYW5zbWl0IHVzYiBtZXNzYWdlcyAqLwogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCQlpZiAoIXVyYikgewotCQkJbmV0ZGV2X2VycihuZXRkZXYsICJObyBtZW1vcnkgbGVmdCBmb3IgVVJCc1xuIik7CiAJCQllcnIgPSAtRU5PTUVNOwogCQkJYnJlYWs7CiAJCX0KQEAgLTY1MSwxMCArNjQ5LDggQEAKIAogCS8qIGZpcnN0IGFsbG9jYXRlIGEgdXJiIHRvIGhhbmRsZSB0aGUgYXN5bmNocm9ub3VzIHN0ZXBzICovCiAJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXVyYikgewotCQluZXRkZXZfZXJyKGRldi0+bmV0ZGV2LCAibm8gbWVtb3J5IGxlZnQgZm9yIHVyYlxuIik7CisJaWYgKCF1cmIpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCS8qIGFsc28gYWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciB0aGUgY29tbWFuZHMgdG8gc2VuZCAqLwogCWJ1ZiA9IGttYWxsb2MoUENBTl9VU0JfTUFYX0NNRF9MRU4sIEdGUF9BVE9NSUMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL3VzYi91c2JfOGRldi5jIGIvZHJpdmVycy9uZXQvY2FuL3VzYi91c2JfOGRldi5jCmluZGV4IGE3MzE3MjAuLjEwOGEzMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi91c2IvdXNiXzhkZXYuYworKysgYi9kcml2ZXJzL25ldC9jYW4vdXNiL3VzYl84ZGV2LmMKQEAgLTYyMywxMCArNjIzLDggQEAKIAogCS8qIGNyZWF0ZSBhIFVSQiwgYW5kIGEgYnVmZmVyIGZvciBpdCwgYW5kIGNvcHkgdGhlIGRhdGEgdG8gdGhlIFVSQiAqLwogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF1cmIpIHsKLQkJbmV0ZGV2X2VycihuZXRkZXYsICJObyBtZW1vcnkgbGVmdCBmb3IgVVJCc1xuIik7CisJaWYgKCF1cmIpCiAJCWdvdG8gbm9tZW07Ci0JfQogCiAJYnVmID0gdXNiX2FsbG9jX2NvaGVyZW50KHByaXYtPnVkZXYsIHNpemUsIEdGUF9BVE9NSUMsCiAJCQkJICZ1cmItPnRyYW5zZmVyX2RtYSk7CkBAIC03NDgsNyArNzQ2LDYgQEAKIAkJLyogY3JlYXRlIGEgVVJCLCBhbmQgYSBidWZmZXIgZm9yIGl0ICovCiAJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7Ci0JCQluZXRkZXZfZXJyKG5ldGRldiwgIk5vIG1lbW9yeSBsZWZ0IGZvciBVUkJzXG4iKTsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL0tjb25maWcgYi9kcml2ZXJzL25ldC9kc2EvS2NvbmZpZwppbmRleCA4ZjQ1NDQzLi4wNjU5ODQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9kc2EvS2NvbmZpZwpAQCAtMTYsNiArMTYsNyBAQAogCXNlbGVjdCBGSVhFRF9QSFkKIAlzZWxlY3QgQkNNN1hYWF9QSFkKIAlzZWxlY3QgTURJT19CQ01fVU5JTUFDCisJc2VsZWN0IEI1MwogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgQnJvYWRjb20gU3RhcmZpZ2h0ZXIgMiBFdGhlcm5ldAogCSAgc3dpdGNoIGNoaXBzLgpAQCAtMjQsNCArMjUsMTMgQEAKIAogc291cmNlICJkcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L0tjb25maWciCiAKK2NvbmZpZyBORVRfRFNBX1FDQThLCisJdHJpc3RhdGUgIlF1YWxjb21tIEF0aGVyb3MgUUNBOEsgRXRoZXJuZXQgc3dpdGNoIGZhbWlseSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0RTQQorCXNlbGVjdCBORVRfRFNBX1RBR19RQ0EKKwlzZWxlY3QgUkVHTUFQCisJLS0taGVscC0tLQorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBRdWFsY29tbSBBdGhlcm9zIFFDQThLIEV0aGVybmV0CisJICBzd2l0Y2ggY2hpcHMuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2RzYS9NYWtlZmlsZQppbmRleCBjYTFlNzFiLi44MzQ2ZTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZHNhL01ha2VmaWxlCkBAIC0xLDUgKzEsNiBAQAogb2JqLSQoQ09ORklHX05FVF9EU0FfTVY4OEU2MDYwKSArPSBtdjg4ZTYwNjAubwogb2JqLSQoQ09ORklHX05FVF9EU0FfQkNNX1NGMikJKz0gYmNtX3NmMi5vCitvYmotJChDT05GSUdfTkVUX0RTQV9RQ0E4SykJKz0gcWNhOGsubwogCiBvYmoteQkJCQkrPSBiNTMvCiBvYmoteQkJCQkrPSBtdjg4ZTZ4eHgvCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19jb21tb24uYyBiL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX2NvbW1vbi5jCmluZGV4IGJkYTM3ZDMuLjc3MTdiMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX2NvbW1vbi5jCkBAIC0xNjcsNiArMTY3LDY1IEBACiAKICNkZWZpbmUgQjUzX01JQlNfU0laRQlBUlJBWV9TSVpFKGI1M19taWJzKQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGI1M19taWJfZGVzYyBiNTNfbWlic181OHh4W10gPSB7CisJeyA4LCAweDAwLCAiVHhPY3RldHMiIH0sCisJeyA0LCAweDA4LCAiVHhEcm9wUGt0cyIgfSwKKwl7IDQsIDB4MGMsICJUeFFQS1RRMCIgfSwKKwl7IDQsIDB4MTAsICJUeEJyb2FkY2FzdFBrdHMiIH0sCisJeyA0LCAweDE0LCAiVHhNdWx0aWNhc3RQa3RzIiB9LAorCXsgNCwgMHgxOCwgIlR4VW5pY2FzdFBLdHMiIH0sCisJeyA0LCAweDFjLCAiVHhDb2xsaXNpb25zIiB9LAorCXsgNCwgMHgyMCwgIlR4U2luZ2xlQ29sbGlzaW9uIiB9LAorCXsgNCwgMHgyNCwgIlR4TXVsdGlwbGVDb2xsaXNpb24iIH0sCisJeyA0LCAweDI4LCAiVHhEZWZlcnJlZENvbGxpc2lvbiIgfSwKKwl7IDQsIDB4MmMsICJUeExhdGVDb2xsaXNpb24iIH0sCisJeyA0LCAweDMwLCAiVHhFeGNlc3NpdmVDb2xsaXNpb24iIH0sCisJeyA0LCAweDM0LCAiVHhGcmFtZUluRGlzYyIgfSwKKwl7IDQsIDB4MzgsICJUeFBhdXNlUGt0cyIgfSwKKwl7IDQsIDB4M2MsICJUeFFQS1RRMSIgfSwKKwl7IDQsIDB4NDAsICJUeFFQS1RRMiIgfSwKKwl7IDQsIDB4NDQsICJUeFFQS1RRMyIgfSwKKwl7IDQsIDB4NDgsICJUeFFQS1RRNCIgfSwKKwl7IDQsIDB4NGMsICJUeFFQS1RRNSIgfSwKKwl7IDgsIDB4NTAsICJSeE9jdGV0cyIgfSwKKwl7IDQsIDB4NTgsICJSeFVuZGVyc2l6ZVBrdHMiIH0sCisJeyA0LCAweDVjLCAiUnhQYXVzZVBrdHMiIH0sCisJeyA0LCAweDYwLCAiUnhQa3RzNjRPY3RldHMiIH0sCisJeyA0LCAweDY0LCAiUnhQa3RzNjV0bzEyN09jdGV0cyIgfSwKKwl7IDQsIDB4NjgsICJSeFBrdHMxMjh0bzI1NU9jdGV0cyIgfSwKKwl7IDQsIDB4NmMsICJSeFBrdHMyNTZ0bzUxMU9jdGV0cyIgfSwKKwl7IDQsIDB4NzAsICJSeFBrdHM1MTJ0bzEwMjNPY3RldHMiIH0sCisJeyA0LCAweDc0LCAiUnhQa3RzMTAyNHRvTWF4UGt0c09jdGV0cyIgfSwKKwl7IDQsIDB4NzgsICJSeE92ZXJzaXplUGt0cyIgfSwKKwl7IDQsIDB4N2MsICJSeEphYmJlcnMiIH0sCisJeyA0LCAweDgwLCAiUnhBbGlnbm1lbnRFcnJvcnMiIH0sCisJeyA0LCAweDg0LCAiUnhGQ1NFcnJvcnMiIH0sCisJeyA4LCAweDg4LCAiUnhHb29kT2N0ZXRzIiB9LAorCXsgNCwgMHg5MCwgIlJ4RHJvcFBrdHMiIH0sCisJeyA0LCAweDk0LCAiUnhVbmljYXN0UGt0cyIgfSwKKwl7IDQsIDB4OTgsICJSeE11bHRpY2FzdFBrdHMiIH0sCisJeyA0LCAweDljLCAiUnhCcm9hZGNhc3RQa3RzIiB9LAorCXsgNCwgMHhhMCwgIlJ4U0FDaGFuZ2VzIiB9LAorCXsgNCwgMHhhNCwgIlJ4RnJhZ21lbnRzIiB9LAorCXsgNCwgMHhhOCwgIlJ4SnVtYm9Qa3QiIH0sCisJeyA0LCAweGFjLCAiUnhTeW1ibEVyciIgfSwKKwl7IDQsIDB4YjAsICJJblJhbmdlRXJyQ291bnQiIH0sCisJeyA0LCAweGI0LCAiT3V0UmFuZ2VFcnJDb3VudCIgfSwKKwl7IDQsIDB4YjgsICJFRUVMcGlFdmVudCIgfSwKKwl7IDQsIDB4YmMsICJFRUVMcGlEdXJhdGlvbiIgfSwKKwl7IDQsIDB4YzAsICJSeERpc2NhcmQiIH0sCisJeyA0LCAweGM4LCAiVHhRUEtUUTYiIH0sCisJeyA0LCAweGNjLCAiVHhRUEtUUTciIH0sCisJeyA0LCAweGQwLCAiVHhQa3RzNjRPY3RldHMiIH0sCisJeyA0LCAweGQ0LCAiVHhQa3RzNjV0bzEyN09jdGV0cyIgfSwKKwl7IDQsIDB4ZDgsICJUeFBrdHMxMjh0bzI1NU9jdGV0cyIgfSwKKwl7IDQsIDB4ZGMsICJUeFBrdHMyNTZ0bzUxMU9jZXRzIiB9LAorCXsgNCwgMHhlMCwgIlR4UGt0czUxMnRvMTAyM09jZXRzIiB9LAorCXsgNCwgMHhlNCwgIlR4UGt0czEwMjR0b01heFBrdE9jZXRzIiB9LAorfTsKKworI2RlZmluZSBCNTNfTUlCU181OFhYX1NJWkUJQVJSQVlfU0laRShiNTNfbWlic181OHh4KQorCiBzdGF0aWMgaW50IGI1M19kb192bGFuX29wKHN0cnVjdCBiNTNfZGV2aWNlICpkZXYsIHU4IG9wKQogewogCXVuc2lnbmVkIGludCBpOwpAQCAtNDE4LDcgKzQ3Nyw3IEBACiAKIHN0YXRpYyB2b2lkIGI1M19pbXBfdmxhbl9zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBjcHVfcG9ydCkKIHsKLQlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzLT5wcml2OwogCXVuc2lnbmVkIGludCBpOwogCXUxNiBwdmxhbjsKIApAQCAtNDM2LDcgKzQ5NSw3IEBACiBzdGF0aWMgaW50IGI1M19lbmFibGVfcG9ydChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJICAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeSkKIHsKLQlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzLT5wcml2OwogCXVuc2lnbmVkIGludCBjcHVfcG9ydCA9IGRldi0+Y3B1X3BvcnQ7CiAJdTE2IHB2bGFuOwogCkBAIC00NjEsNyArNTIwLDcgQEAKIHN0YXRpYyB2b2lkIGI1M19kaXNhYmxlX3BvcnQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCSAgICAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeSkKIHsKLQlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzLT5wcml2OwogCXU4IHJlZzsKIAogCS8qIERpc2FibGUgVHgvUnggZm9yIHRoZSBwb3J0ICovCkBAIC01NzAsNyArNjI5LDcgQEAKIAogc3RhdGljIGludCBiNTNfcGh5X3JlYWQxNihzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLCBpbnQgcmVnKQogewotCXN0cnVjdCBiNTNfZGV2aWNlICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGI1M19kZXZpY2UgKnByaXYgPSBkcy0+cHJpdjsKIAl1MTYgdmFsdWUgPSAwOwogCWludCByZXQ7CiAKQEAgLTU4NSw3ICs2NDQsNyBAQAogCiBzdGF0aWMgaW50IGI1M19waHlfd3JpdGUxNihzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLCBpbnQgcmVnLCB1MTYgdmFsKQogewotCXN0cnVjdCBiNTNfZGV2aWNlICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGI1M19kZXZpY2UgKnByaXYgPSBkcy0+cHJpdjsKIAogCWlmIChwcml2LT5vcHMtPnBoeV93cml0ZTE2KQogCQlyZXR1cm4gcHJpdi0+b3BzLT5waHlfd3JpdGUxNihwcml2LCBhZGRyLCByZWcsIHZhbCk7CkBAIC02MzUsNiArNjk0LDggQEAKIAkJcmV0dXJuIGI1M19taWJzXzY1OwogCWVsc2UgaWYgKGlzNjN4eChkZXYpKQogCQlyZXR1cm4gYjUzX21pYnNfNjN4eDsKKwllbHNlIGlmIChpczU4eHgoZGV2KSkKKwkJcmV0dXJuIGI1M19taWJzXzU4eHg7CiAJZWxzZQogCQlyZXR1cm4gYjUzX21pYnM7CiB9CkBAIC02NDUsMTMgKzcwNiwxNSBAQAogCQlyZXR1cm4gQjUzX01JQlNfNjVfU0laRTsKIAllbHNlIGlmIChpczYzeHgoZGV2KSkKIAkJcmV0dXJuIEI1M19NSUJTXzYzWFhfU0laRTsKKwllbHNlIGlmIChpczU4eHgoZGV2KSkKKwkJcmV0dXJuIEI1M19NSUJTXzU4WFhfU0laRTsKIAllbHNlCiAJCXJldHVybiBCNTNfTUlCU19TSVpFOwogfQogCiBzdGF0aWMgdm9pZCBiNTNfZ2V0X3N0cmluZ3Moc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgdWludDhfdCAqZGF0YSkKIHsKLQlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzLT5wcml2OwogCWNvbnN0IHN0cnVjdCBiNTNfbWliX2Rlc2MgKm1pYnMgPSBiNTNfZ2V0X21pYihkZXYpOwogCXVuc2lnbmVkIGludCBtaWJfc2l6ZSA9IGI1M19nZXRfbWliX3NpemUoZGV2KTsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTY2NCw3ICs3MjcsNyBAQAogc3RhdGljIHZvaWQgYjUzX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJICB1aW50NjRfdCAqZGF0YSkKIHsKLQlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzLT5wcml2OwogCWNvbnN0IHN0cnVjdCBiNTNfbWliX2Rlc2MgKm1pYnMgPSBiNTNfZ2V0X21pYihkZXYpOwogCXVuc2lnbmVkIGludCBtaWJfc2l6ZSA9IGI1M19nZXRfbWliX3NpemUoZGV2KTsKIAljb25zdCBzdHJ1Y3QgYjUzX21pYl9kZXNjICpzOwpAQCAtNjk2LDE5ICs3NTksMTQgQEAKIAogc3RhdGljIGludCBiNTNfZ2V0X3NzZXRfY291bnQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewotCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHMtPnByaXY7CiAKIAlyZXR1cm4gYjUzX2dldF9taWJfc2l6ZShkZXYpOwogfQogCi1zdGF0aWMgaW50IGI1M19zZXRfYWRkcihzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIHU4ICphZGRyKQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGI1M19zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiB7Ci0Jc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkcy0+cHJpdjsKIAl1bnNpZ25lZCBpbnQgcG9ydDsKIAlpbnQgcmV0OwogCkBAIC03MzksNyArNzk3LDcgQEAKIHN0YXRpYyB2b2lkIGI1M19hZGp1c3RfbGluayhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJICAgIHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7Ci0Jc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkcy0+cHJpdjsKIAl1OCByZ21paV9jdHJsID0gMCwgcmVnID0gMCwgb2ZmOwogCiAJaWYgKCFwaHlfaXNfcHNldWRvX2ZpeGVkX2xpbmsocGh5ZGV2KSkKQEAgLTg3Myw3ICs5MzEsNyBAQAogCQkJICAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfdmxhbiAqdmxhbiwKIAkJCSAgICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKIHsKLQlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzLT5wcml2OwogCiAJaWYgKChpczUzMjUoZGV2KSB8fCBpczUzNjUoZGV2KSkgJiYgdmxhbi0+dmlkX2JlZ2luID09IDApCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTg5MCw3ICs5NDgsNyBAQAogCQkJIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfdmxhbiAqdmxhbiwKIAkJCSBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKIHsKLQlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzLT5wcml2OwogCWJvb2wgdW50YWdnZWQgPSB2bGFuLT5mbGFncyAmIEJSSURHRV9WTEFOX0lORk9fVU5UQUdHRUQ7CiAJYm9vbCBwdmlkID0gdmxhbi0+ZmxhZ3MgJiBCUklER0VfVkxBTl9JTkZPX1BWSUQ7CiAJdW5zaWduZWQgaW50IGNwdV9wb3J0ID0gZGV2LT5jcHVfcG9ydDsKQEAgLTkyNCw3ICs5ODIsNyBAQAogc3RhdGljIGludCBiNTNfdmxhbl9kZWwoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCWNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfdmxhbiAqdmxhbikKIHsKLQlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzLT5wcml2OwogCWJvb2wgdW50YWdnZWQgPSB2bGFuLT5mbGFncyAmIEJSSURHRV9WTEFOX0lORk9fVU5UQUdHRUQ7CiAJdW5zaWduZWQgaW50IGNwdV9wb3J0ID0gZGV2LT5jcHVfcG9ydDsKIAlzdHJ1Y3QgYjUzX3ZsYW4gKnZsOwpAQCAtOTcwLDcgKzEwMjgsNyBAQAogCQkJIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfdmxhbiAqdmxhbiwKIAkJCSBpbnQgKCpjYikoc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaikpCiB7Ci0Jc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkcy0+cHJpdjsKIAl1MTYgdmlkLCB2aWRfc3RhcnQgPSAwLCBwdmlkOwogCXN0cnVjdCBiNTNfdmxhbiAqdmw7CiAJaW50IGVyciA9IDA7CkBAIC0xMTI5LDcgKzExODcsNyBAQAogCQkJICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYiwKIAkJCSAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQogewotCXN0cnVjdCBiNTNfZGV2aWNlICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGI1M19kZXZpY2UgKnByaXYgPSBkcy0+cHJpdjsKIAogCS8qIDUzMjUgYW5kIDUzNjUgcmVxdWlyZSBzb21lIG1vcmUgbWFzc2FnaW5nLCBidXQgY291bGQKIAkgKiBiZSBzdXBwb3J0ZWQgZXZlbnR1YWxseQpAQCAtMTE0NCw3ICsxMjAyLDcgQEAKIAkJCWNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCiAJCQlzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKIHsKLQlzdHJ1Y3QgYjUzX2RldmljZSAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiNTNfZGV2aWNlICpwcml2ID0gZHMtPnByaXY7CiAKIAlpZiAoYjUzX2FybF9vcChwcml2LCAwLCBwb3J0LCBmZGItPmFkZHIsIGZkYi0+dmlkLCB0cnVlKSkKIAkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFkZCBNQUMgYWRkcmVzc1xuIiwgX19mdW5jX18pOwpAQCAtMTE1Myw3ICsxMjExLDcgQEAKIHN0YXRpYyBpbnQgYjUzX2ZkYl9kZWwoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJICAgICAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIpCiB7Ci0Jc3RydWN0IGI1M19kZXZpY2UgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYjUzX2RldmljZSAqcHJpdiA9IGRzLT5wcml2OwogCiAJcmV0dXJuIGI1M19hcmxfb3AocHJpdiwgMCwgcG9ydCwgZmRiLT5hZGRyLCBmZGItPnZpZCwgZmFsc2UpOwogfQpAQCAtMTIxMiw3ICsxMjcwLDcgQEAKIAkJCXN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCiAJCQlpbnQgKCpjYikoc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaikpCiB7Ci0Jc3RydWN0IGI1M19kZXZpY2UgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYjUzX2RldmljZSAqcHJpdiA9IGRzLT5wcml2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2OwogCXN0cnVjdCBiNTNfYXJsX2VudHJ5IHJlc3VsdHNbMl07CiAJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKQEAgLTEyNTEsMTAgKzEzMDksMjIgQEAKIHN0YXRpYyBpbnQgYjUzX2JyX2pvaW4oc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpicmlkZ2UpCiB7Ci0Jc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkcy0+cHJpdjsKKwlzOCBjcHVfcG9ydCA9IGRzLT5kc3QtPmNwdV9wb3J0OwogCXUxNiBwdmxhbiwgcmVnOwogCXVuc2lnbmVkIGludCBpOwogCisJLyogTWFrZSB0aGlzIHBvcnQgbGVhdmUgdGhlIGFsbCBWTEFOcyBqb2luIHNpbmNlIHdlIHdpbGwgaGF2ZSBwcm9wZXIKKwkgKiBWTEFOIGVudHJpZXMgZnJvbSBub3cgb24KKwkgKi8KKwlpZiAoaXM1OHh4KGRldikpIHsKKwkJYjUzX3JlYWQxNihkZXYsIEI1M19WTEFOX1BBR0UsIEI1M19KT0lOX0FMTF9WTEFOX0VOLCAmcmVnKTsKKwkJcmVnICY9IH5CSVQocG9ydCk7CisJCWlmICgocmVnICYgQklUKGNwdV9wb3J0KSkgPT0gQklUKGNwdV9wb3J0KSkKKwkJCXJlZyAmPSB+QklUKGNwdV9wb3J0KTsKKwkJYjUzX3dyaXRlMTYoZGV2LCBCNTNfVkxBTl9QQUdFLCBCNTNfSk9JTl9BTExfVkxBTl9FTiwgcmVnKTsKKwl9CisKIAlkZXYtPnBvcnRzW3BvcnRdLmJyaWRnZV9kZXYgPSBicmlkZ2U7CiAJYjUzX3JlYWQxNihkZXYsIEI1M19QVkxBTl9QQUdFLCBCNTNfUFZMQU5fUE9SVF9NQVNLKHBvcnQpLCAmcHZsYW4pOwogCkBAIC0xMjg0LDkgKzEzNTQsMTAgQEAKIAogc3RhdGljIHZvaWQgYjUzX2JyX2xlYXZlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQpCiB7Ci0Jc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkcy0+cHJpdjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqYnJpZGdlID0gZGV2LT5wb3J0c1twb3J0XS5icmlkZ2VfZGV2OwogCXN0cnVjdCBiNTNfdmxhbiAqdmwgPSAmZGV2LT52bGFuc1swXTsKKwlzOCBjcHVfcG9ydCA9IGRzLT5kc3QtPmNwdV9wb3J0OwogCXVuc2lnbmVkIGludCBpOwogCXUxNiBwdmxhbiwgcmVnLCBwdmlkOwogCkBAIC0xMzE2LDIyICsxMzg3LDI3IEBACiAJZWxzZQogCQlwdmlkID0gMDsKIAotCWI1M19nZXRfdmxhbl9lbnRyeShkZXYsIHB2aWQsIHZsKTsKLQl2bC0+bWVtYmVycyB8PSBCSVQocG9ydCkgfCBCSVQoZGV2LT5jcHVfcG9ydCk7Ci0JdmwtPnVudGFnIHw9IEJJVChwb3J0KSB8IEJJVChkZXYtPmNwdV9wb3J0KTsKLQliNTNfc2V0X3ZsYW5fZW50cnkoZGV2LCBwdmlkLCB2bCk7CisJLyogTWFrZSB0aGlzIHBvcnQgam9pbiBhbGwgVkxBTnMgd2l0aG91dCBWTEFOIGVudHJpZXMgKi8KKwlpZiAoaXM1OHh4KGRldikpIHsKKwkJYjUzX3JlYWQxNihkZXYsIEI1M19WTEFOX1BBR0UsIEI1M19KT0lOX0FMTF9WTEFOX0VOLCAmcmVnKTsKKwkJcmVnIHw9IEJJVChwb3J0KTsKKwkJaWYgKCEocmVnICYgQklUKGNwdV9wb3J0KSkpCisJCQlyZWcgfD0gQklUKGNwdV9wb3J0KTsKKwkJYjUzX3dyaXRlMTYoZGV2LCBCNTNfVkxBTl9QQUdFLCBCNTNfSk9JTl9BTExfVkxBTl9FTiwgcmVnKTsKKwl9IGVsc2UgeworCQliNTNfZ2V0X3ZsYW5fZW50cnkoZGV2LCBwdmlkLCB2bCk7CisJCXZsLT5tZW1iZXJzIHw9IEJJVChwb3J0KSB8IEJJVChkZXYtPmNwdV9wb3J0KTsKKwkJdmwtPnVudGFnIHw9IEJJVChwb3J0KSB8IEJJVChkZXYtPmNwdV9wb3J0KTsKKwkJYjUzX3NldF92bGFuX2VudHJ5KGRldiwgcHZpZCwgdmwpOworCX0KIH0KIAotc3RhdGljIHZvaWQgYjUzX2JyX3NldF9zdHBfc3RhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKLQkJCQkgdTggc3RhdGUpCitzdGF0aWMgdm9pZCBiNTNfYnJfc2V0X3N0cF9zdGF0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCB1OCBzdGF0ZSkKIHsKLQlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHNfdG9fcHJpdihkcyk7Ci0JdTggaHdfc3RhdGUsIGN1cl9od19zdGF0ZTsKKwlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHMtPnByaXY7CisJdTggaHdfc3RhdGU7CiAJdTggcmVnOwogCi0JYjUzX3JlYWQ4KGRldiwgQjUzX0NUUkxfUEFHRSwgQjUzX1BPUlRfQ1RSTChwb3J0KSwgJnJlZyk7Ci0JY3VyX2h3X3N0YXRlID0gcmVnICYgUE9SVF9DVFJMX1NUUF9TVEFURV9NQVNLOwotCiAJc3dpdGNoIChzdGF0ZSkgewogCWNhc2UgQlJfU1RBVEVfRElTQUJMRUQ6CiAJCWh3X3N0YXRlID0gUE9SVF9DVFJMX0RJU19TVEFURTsKQEAgLTEzNTMsMzAgKzE0MjksMjggQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIEZhc3QtYWdlIEFSTCBlbnRyaWVzIGlmIHdlIGFyZSBtb3ZpbmcgYSBwb3J0IGZyb20gTGVhcm5pbmcgb3IKLQkgKiBGb3J3YXJkaW5nIChjdXJfaHdfc3RhdGUpIHN0YXRlIHRvIERpc2FibGVkLCBCbG9ja2luZyBvciBMaXN0ZW5pbmcKLQkgKiBzdGF0ZSAoaHdfc3RhdGUpCi0JICovCi0JaWYgKGN1cl9od19zdGF0ZSAhPSBod19zdGF0ZSkgewotCQlpZiAoY3VyX2h3X3N0YXRlID49IFBPUlRfQ1RSTF9MRUFSTl9TVEFURSAmJgotCQkgICAgaHdfc3RhdGUgPD0gUE9SVF9DVFJMX0xJU1RFTl9TVEFURSkgewotCQkJaWYgKGI1M19mYXN0X2FnZV9wb3J0KGRldiwgcG9ydCkpIHsKLQkJCQlkZXZfZXJyKGRzLT5kZXYsICJmYXN0IGFnZWluZyBmYWlsZWRcbiIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQogCWI1M19yZWFkOChkZXYsIEI1M19DVFJMX1BBR0UsIEI1M19QT1JUX0NUUkwocG9ydCksICZyZWcpOwogCXJlZyAmPSB+UE9SVF9DVFJMX1NUUF9TVEFURV9NQVNLOwogCXJlZyB8PSBod19zdGF0ZTsKIAliNTNfd3JpdGU4KGRldiwgQjUzX0NUUkxfUEFHRSwgQjUzX1BPUlRfQ1RSTChwb3J0KSwgcmVnKTsKIH0KIAotc3RhdGljIHN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciBiNTNfc3dpdGNoX29wcyA9IHsKLQkudGFnX3Byb3RvY29sCQk9IERTQV9UQUdfUFJPVE9fTk9ORSwKK3N0YXRpYyB2b2lkIGI1M19icl9mYXN0X2FnZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KQoreworCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkcy0+cHJpdjsKKworCWlmIChiNTNfZmFzdF9hZ2VfcG9ydChkZXYsIHBvcnQpKQorCQlkZXZfZXJyKGRzLT5kZXYsICJmYXN0IGFnZWluZyBmYWlsZWRcbiIpOworfQorCitzdGF0aWMgZW51bSBkc2FfdGFnX3Byb3RvY29sIGI1M19nZXRfdGFnX3Byb3RvY29sKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlyZXR1cm4gRFNBX1RBR19QUk9UT19OT05FOworfQorCitzdGF0aWMgc3RydWN0IGRzYV9zd2l0Y2hfb3BzIGI1M19zd2l0Y2hfb3BzID0geworCS5nZXRfdGFnX3Byb3RvY29sCT0gYjUzX2dldF90YWdfcHJvdG9jb2wsCiAJLnNldHVwCQkJPSBiNTNfc2V0dXAsCi0JLnNldF9hZGRyCQk9IGI1M19zZXRfYWRkciwKIAkuZ2V0X3N0cmluZ3MJCT0gYjUzX2dldF9zdHJpbmdzLAogCS5nZXRfZXRodG9vbF9zdGF0cwk9IGI1M19nZXRfZXRodG9vbF9zdGF0cywKIAkuZ2V0X3NzZXRfY291bnQJCT0gYjUzX2dldF9zc2V0X2NvdW50LApAQCAtMTM4OCw2ICsxNDYyLDcgQEAKIAkucG9ydF9icmlkZ2Vfam9pbgk9IGI1M19icl9qb2luLAogCS5wb3J0X2JyaWRnZV9sZWF2ZQk9IGI1M19icl9sZWF2ZSwKIAkucG9ydF9zdHBfc3RhdGVfc2V0CT0gYjUzX2JyX3NldF9zdHBfc3RhdGUsCisJLnBvcnRfZmFzdF9hZ2UJCT0gYjUzX2JyX2Zhc3RfYWdlLAogCS5wb3J0X3ZsYW5fZmlsdGVyaW5nCT0gYjUzX3ZsYW5fZmlsdGVyaW5nLAogCS5wb3J0X3ZsYW5fcHJlcGFyZQk9IGI1M192bGFuX3ByZXBhcmUsCiAJLnBvcnRfdmxhbl9hZGQJCT0gYjUzX3ZsYW5fYWRkLApAQCAtMTU5MywxMSArMTY2OCwyMiBAQAogCQkuanVtYm9fcG1fcmVnID0gQjUzX0pVTUJPX1BPUlRfTUFTSywKIAkJLmp1bWJvX3NpemVfcmVnID0gQjUzX0pVTUJPX01BWF9TSVpFLAogCX0sCisJeworCQkuY2hpcF9pZCA9IEJDTTc0NDVfREVWSUNFX0lELAorCQkuZGV2X25hbWUgPSAiQkNNNzQ0NSIsCisJCS52bGFucwk9IDQwOTYsCisJCS5lbmFibGVkX3BvcnRzID0gMHgxZmYsCisJCS5hcmxfZW50cmllcyA9IDQsCisJCS5jcHVfcG9ydCA9IEI1M19DUFVfUE9SVCwKKwkJLnZ0YV9yZWdzID0gQjUzX1ZUQV9SRUdTLAorCQkuZHVwbGV4X3JlZyA9IEI1M19EVVBMRVhfU1RBVF9HRSwKKwkJLmp1bWJvX3BtX3JlZyA9IEI1M19KVU1CT19QT1JUX01BU0ssCisJCS5qdW1ib19zaXplX3JlZyA9IEI1M19KVU1CT19NQVhfU0laRSwKKwl9LAogfTsKIAogc3RhdGljIGludCBiNTNfc3dpdGNoX2luaXQoc3RydWN0IGI1M19kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBkZXYtPmRzOwogCXVuc2lnbmVkIGludCBpOwogCWludCByZXQ7CiAKQEAgLTE2MTMsNyArMTY5OSw2IEBACiAJCQlkZXYtPnZ0YV9yZWdzWzFdID0gY2hpcC0+dnRhX3JlZ3NbMV07CiAJCQlkZXYtPnZ0YV9yZWdzWzJdID0gY2hpcC0+dnRhX3JlZ3NbMl07CiAJCQlkZXYtPmp1bWJvX3BtX3JlZyA9IGNoaXAtPmp1bWJvX3BtX3JlZzsKLQkJCWRzLT5kcnYgPSAmYjUzX3N3aXRjaF9vcHM7CiAJCQlkZXYtPmNwdV9wb3J0ID0gY2hpcC0+Y3B1X3BvcnQ7CiAJCQlkZXYtPm51bV92bGFucyA9IGNoaXAtPnZsYW5zOwogCQkJZGV2LT5udW1fYXJsX2VudHJpZXMgPSBjaGlwLT5hcmxfZW50cmllczsKQEAgLTE2ODEsNyArMTc2Niw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBiNTNfZGV2aWNlICpiNTNfc3dpdGNoX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmJhc2UsIHN0cnVjdCBiNTNfaW9fb3BzICpvcHMsCitzdHJ1Y3QgYjUzX2RldmljZSAqYjUzX3N3aXRjaF9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpiYXNlLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgYjUzX2lvX29wcyAqb3BzLAogCQkJCSAgICB2b2lkICpwcml2KQogewogCXN0cnVjdCBkc2Ffc3dpdGNoICpkczsKQEAgLTE3MDAsNiArMTc4Niw3IEBACiAJZGV2LT5kcyA9IGRzOwogCWRldi0+cHJpdiA9IHByaXY7CiAJZGV2LT5vcHMgPSBvcHM7CisJZHMtPm9wcyA9ICZiNTNfc3dpdGNoX29wczsKIAltdXRleF9pbml0KCZkZXYtPnJlZ19tdXRleCk7CiAJbXV0ZXhfaW5pdCgmZGV2LT5zdGF0c19tdXRleCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX21kaW8uYyBiL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX21kaW8uYwppbmRleCBhYTg3YzNmLi40NzdhMTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19tZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfbWRpby5jCkBAIC0yNjcsNyArMjY3LDcgQEAKIAlyZXR1cm4gbWRpb2J1c193cml0ZV9uZXN0ZWQoYnVzLCBhZGRyLCByZWcsIHZhbHVlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBiNTNfaW9fb3BzIGI1M19tZGlvX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYjUzX2lvX29wcyBiNTNfbWRpb19vcHMgPSB7CiAJLnJlYWQ4ID0gYjUzX21kaW9fcmVhZDgsCiAJLnJlYWQxNiA9IGI1M19tZGlvX3JlYWQxNiwKIAkucmVhZDMyID0gYjUzX21kaW9fcmVhZDMyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfbW1hcC5jIGIvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfbW1hcC5jCmluZGV4IDc3ZmZjNDMuLmNjOWU2YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX21tYXAuYworKysgYi9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19tbWFwLmMKQEAgLTIwOCw3ICsyMDgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGI1M19pb19vcHMgYjUzX21tYXBfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiNTNfaW9fb3BzIGI1M19tbWFwX29wcyA9IHsKIAkucmVhZDggPSBiNTNfbW1hcF9yZWFkOCwKIAkucmVhZDE2ID0gYjUzX21tYXBfcmVhZDE2LAogCS5yZWFkMzIgPSBiNTNfbW1hcF9yZWFkMzIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19wcml2LmggYi9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19wcml2LmgKaW5kZXggODM1YTc0NC4uZjE5MmE2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfcHJpdi5oCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX3ByaXYuaApAQCAtNjAsNiArNjAsNyBAQAogCUJDTTUzMDE4X0RFVklDRV9JRCA9IDB4NTMwMTgsCiAJQkNNNTMwMTlfREVWSUNFX0lEID0gMHg1MzAxOSwKIAlCQ001OFhYX0RFVklDRV9JRCA9IDB4NTgwMCwKKwlCQ003NDQ1X0RFVklDRV9JRCA9IDB4NzQ0NSwKIH07CiAKICNkZWZpbmUgQjUzX05fUE9SVFMJOQpAQCAtMTc0LDYgKzE3NSwxMiBAQAogCQlkZXYtPmNoaXBfaWQgPT0gQkNNNTMwMTlfREVWSUNFX0lEOwogfQogCitzdGF0aWMgaW5saW5lIGludCBpczU4eHgoc3RydWN0IGI1M19kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5jaGlwX2lkID09IEJDTTU4WFhfREVWSUNFX0lEIHx8CisJCWRldi0+Y2hpcF9pZCA9PSBCQ003NDQ1X0RFVklDRV9JRDsKK30KKwogI2RlZmluZSBCNTNfQ1BVX1BPUlRfMjUJNQogI2RlZmluZSBCNTNfQ1BVX1BPUlQJOAogCkBAIC0xODIsNyArMTg5LDggQEAKIAlyZXR1cm4gZGV2LT5jcHVfcG9ydDsKIH0KIAotc3RydWN0IGI1M19kZXZpY2UgKmI1M19zd2l0Y2hfYWxsb2Moc3RydWN0IGRldmljZSAqYmFzZSwgc3RydWN0IGI1M19pb19vcHMgKm9wcywKK3N0cnVjdCBiNTNfZGV2aWNlICpiNTNfc3dpdGNoX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmJhc2UsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBiNTNfaW9fb3BzICpvcHMsCiAJCQkJICAgIHZvaWQgKnByaXYpOwogCiBpbnQgYjUzX3N3aXRjaF9kZXRlY3Qoc3RydWN0IGI1M19kZXZpY2UgKmRldik7CkBAIC0zNjQsNyArMzcyLDYgQEAKIAogI2lmZGVmIENPTkZJR19CQ000N1hYCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvYmNtNDd4eF9udnJhbS5oPgogI2luY2x1ZGUgPGJjbTQ3eHhfYm9hcmQuaD4KIHN0YXRpYyBpbmxpbmUgaW50IGI1M19zd2l0Y2hfZ2V0X3Jlc2V0X2dwaW8oc3RydWN0IGI1M19kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX3JlZ3MuaCBiL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX3JlZ3MuaAppbmRleCA4ZjEyYmRkLi5kYWMwYWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19yZWdzLmgKKysrIGIvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfcmVncy5oCkBAIC0yNTgsNyArMjU4LDcgQEAKICAqIEJDTTUzMjUgYW5kIEJDTTUzNjUgc2hhcmUgbW9zdCBkZWZpbml0aW9ucyBiZWxvdwogICovCiAjZGVmaW5lIEI1M19BUkxUQkxfTUFDX1ZJRF9FTlRSWShuKQkoMHgxMCAqIChuKSkKLSNkZWZpbmUgICBBUkxUQkxfTUFDX01BU0sJCTB4ZmZmZmZmZmZmZmZmCisjZGVmaW5lICAgQVJMVEJMX01BQ19NQVNLCQkweGZmZmZmZmZmZmZmZlVMTAogI2RlZmluZSAgIEFSTFRCTF9WSURfUwkJCTQ4CiAjZGVmaW5lICAgQVJMVEJMX1ZJRF9NQVNLXzI1CQkweGZmCiAjZGVmaW5lICAgQVJMVEJMX1ZJRF9NQVNLCQkweGZmZgpAQCAtMzA5LDYgKzMwOSw5IEBACiAvKiBQb3J0IFZMQU4gbWFzayAoMTYgYml0KSBJTVAgcG9ydCBpcyBhbHdheXMgOCwgYWxzbyBvbiA1MzI1ICYgY28gKi8KICNkZWZpbmUgQjUzX1BWTEFOX1BPUlRfTUFTSyhpKQkJKChpKSAqIDIpCiAKKy8qIEpvaW4gYWxsIFZMQU5zIHJlZ2lzdGVyICgxNiBiaXQpICovCisjZGVmaW5lIEI1M19KT0lOX0FMTF9WTEFOX0VOCQkweDUwCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiA4MDIuMVEgUGFnZSBSZWdpc3RlcnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfc3BpLmMgYi9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19zcGkuYwppbmRleCAyYmRhMGI1Li5mODlmNTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19zcGkuYworKysgYi9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19zcGkuYwpAQCAtMjcwLDcgKzI3MCw3IEBACiAJcmV0dXJuIHNwaV93cml0ZShzcGksIHR4YnVmLCBzaXplb2YodHhidWYpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBiNTNfaW9fb3BzIGI1M19zcGlfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiNTNfaW9fb3BzIGI1M19zcGlfb3BzID0gewogCS5yZWFkOCA9IGI1M19zcGlfcmVhZDgsCiAJLnJlYWQxNiA9IGI1M19zcGlfcmVhZDE2LAogCS5yZWFkMzIgPSBiNTNfc3BpX3JlYWQzMiwKQEAgLTMxNyw4ICszMTcsNiBAQAogc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGI1M19zcGlfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gImI1My1zd2l0Y2giLAotCQkuYnVzCT0gJnNwaV9idXNfdHlwZSwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIAkucHJvYmUJPSBiNTNfc3BpX3Byb2JlLAogCS5yZW1vdmUJPSBiNTNfc3BpX3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX3NyYWIuYyBiL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX3NyYWIuYwppbmRleCAzZTJkNGE1Li44YTYyYjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19zcmFiLmMKKysrIGIvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfc3JhYi5jCkBAIC0zNDQsNyArMzQ0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGI1M19pb19vcHMgYjUzX3NyYWJfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiNTNfaW9fb3BzIGI1M19zcmFiX29wcyA9IHsKIAkucmVhZDggPSBiNTNfc3JhYl9yZWFkOCwKIAkucmVhZDE2ID0gYjUzX3NyYWJfcmVhZDE2LAogCS5yZWFkMzIgPSBiNTNfc3JhYl9yZWFkMzIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvYmNtX3NmMi5jIGIvZHJpdmVycy9uZXQvZHNhL2JjbV9zZjIuYwppbmRleCBiMmI4Mzg3Li5lMjE4ODg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvYmNtX3NmMi5jCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9iY21fc2YyLmMKQEAgLTI5LDEzMCArMjksMjEgQEAKICNpbmNsdWRlIDxsaW51eC9icmNtcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxuZXQvc3dpdGNoZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9iNTMuaD4KIAogI2luY2x1ZGUgImJjbV9zZjIuaCIKICNpbmNsdWRlICJiY21fc2YyX3JlZ3MuaCIKKyNpbmNsdWRlICJiNTMvYjUzX3ByaXYuaCIKKyNpbmNsdWRlICJiNTMvYjUzX3JlZ3MuaCIKIAotLyogU3RyaW5nLCBvZmZzZXQsIGFuZCByZWdpc3RlciBzaXplIGluIGJ5dGVzIGlmIGRpZmZlcmVudCBmcm9tIDQgYnl0ZXMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYmNtX3NmMl9od19zdGF0cyBiY21fc2YyX21pYltdID0gewotCXsgIlR4T2N0ZXRzIiwJCTB4MDAwLCA4CX0sCi0JeyAiVHhEcm9wUGt0cyIsCQkweDAyMAkJfSwKLQl7ICJUeFFQS1RRMCIsCQkweDAzMAkJfSwKLQl7ICJUeEJyb2FkY2FzdFBrdHMiLAkweDA0MAkJfSwKLQl7ICJUeE11bHRpY2FzdFBrdHMiLAkweDA1MAkJfSwKLQl7ICJUeFVuaWNhc3RQS3RzIiwJMHgwNjAJCX0sCi0JeyAiVHhDb2xsaXNpb25zIiwJMHgwNzAJCX0sCi0JeyAiVHhTaW5nbGVDb2xsaXNpb24iLAkweDA4MAkJfSwKLQl7ICJUeE11bHRpcGxlQ29sbGlzaW9uIiwgMHgwOTAJCX0sCi0JeyAiVHhEZWZlcnJlZENvbGxpc2lvbiIsIDB4MGEwCQl9LAotCXsgIlR4TGF0ZUNvbGxpc2lvbiIsCTB4MGIwCQl9LAotCXsgIlR4RXhjZXNzaXZlQ29sbGlzaW9uIiwgMHgwYzAJCX0sCi0JeyAiVHhGcmFtZUluRGlzYyIsCTB4MGQwCQl9LAotCXsgIlR4UGF1c2VQa3RzIiwJMHgwZTAJCX0sCi0JeyAiVHhRUEtUUTEiLAkJMHgwZjAJCX0sCi0JeyAiVHhRUEtUUTIiLAkJMHgxMDAJCX0sCi0JeyAiVHhRUEtUUTMiLAkJMHgxMTAJCX0sCi0JeyAiVHhRUEtUUTQiLAkJMHgxMjAJCX0sCi0JeyAiVHhRUEtUUTUiLAkJMHgxMzAJCX0sCi0JeyAiUnhPY3RldHMiLAkJMHgxNDAsIDgJfSwKLQl7ICJSeFVuZGVyc2l6ZVBrdHMiLAkweDE2MAkJfSwKLQl7ICJSeFBhdXNlUGt0cyIsCTB4MTcwCQl9LAotCXsgIlJ4UGt0czY0T2N0ZXRzIiwJMHgxODAJCX0sCi0JeyAiUnhQa3RzNjV0bzEyN09jdGV0cyIsIDB4MTkwCQl9LAotCXsgIlJ4UGt0czEyOHRvMjU1T2N0ZXRzIiwgMHgxYTAJCX0sCi0JeyAiUnhQa3RzMjU2dG81MTFPY3RldHMiLCAweDFiMAkJfSwKLQl7ICJSeFBrdHM1MTJ0bzEwMjNPY3RldHMiLCAweDFjMAl9LAotCXsgIlJ4UGt0czEwMjR0b01heFBrdHNPY3RldHMiLCAweDFkMAl9LAotCXsgIlJ4T3ZlcnNpemVQa3RzIiwJMHgxZTAJCX0sCi0JeyAiUnhKYWJiZXJzIiwJCTB4MWYwCQl9LAotCXsgIlJ4QWxpZ25tZW50RXJyb3JzIiwJMHgyMDAJCX0sCi0JeyAiUnhGQ1NFcnJvcnMiLAkweDIxMAkJfSwKLQl7ICJSeEdvb2RPY3RldHMiLAkweDIyMCwgOAl9LAotCXsgIlJ4RHJvcFBrdHMiLAkJMHgyNDAJCX0sCi0JeyAiUnhVbmljYXN0UGt0cyIsCTB4MjUwCQl9LAotCXsgIlJ4TXVsdGljYXN0UGt0cyIsCTB4MjYwCQl9LAotCXsgIlJ4QnJvYWRjYXN0UGt0cyIsCTB4MjcwCQl9LAotCXsgIlJ4U0FDaGFuZ2VzIiwJMHgyODAJCX0sCi0JeyAiUnhGcmFnbWVudHMiLAkweDI5MAkJfSwKLQl7ICJSeEp1bWJvUGt0IiwJCTB4MmEwCQl9LAotCXsgIlJ4U3ltYmxFcnIiLAkJMHgyYjAJCX0sCi0JeyAiSW5SYW5nZUVyckNvdW50IiwJMHgyYzAJCX0sCi0JeyAiT3V0UmFuZ2VFcnJDb3VudCIsCTB4MmQwCQl9LAotCXsgIkVFRUxwaUV2ZW50IiwJMHgyZTAJCX0sCi0JeyAiRUVFTHBpRHVyYXRpb24iLAkweDJmMAkJfSwKLQl7ICJSeERpc2NhcmQiLAkJMHgzMDAsIDgJfSwKLQl7ICJUeFFQS1RRNiIsCQkweDMyMAkJfSwKLQl7ICJUeFFQS1RRNyIsCQkweDMzMAkJfSwKLQl7ICJUeFBrdHM2NE9jdGV0cyIsCTB4MzQwCQl9LAotCXsgIlR4UGt0czY1dG8xMjdPY3RldHMiLCAweDM1MAkJfSwKLQl7ICJUeFBrdHMxMjh0bzI1NU9jdGV0cyIsIDB4MzYwCQl9LAotCXsgIlR4UGt0czI1NnRvNTExT2NldHMiLCAweDM3MAkJfSwKLQl7ICJUeFBrdHM1MTJ0bzEwMjNPY2V0cyIsIDB4MzgwCQl9LAotCXsgIlR4UGt0czEwMjR0b01heFBrdE9jZXRzIiwgMHgzOTAJfSwKLX07Ci0KLSNkZWZpbmUgQkNNX1NGMl9TVEFUU19TSVpFCUFSUkFZX1NJWkUoYmNtX3NmMl9taWIpCi0KLXN0YXRpYyB2b2lkIGJjbV9zZjJfc3dfZ2V0X3N0cmluZ3Moc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAotCQkJCSAgIGludCBwb3J0LCB1aW50OF90ICpkYXRhKQorc3RhdGljIGVudW0gZHNhX3RhZ19wcm90b2NvbCBiY21fc2YyX3N3X2dldF90YWdfcHJvdG9jb2woc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewotCXVuc2lnbmVkIGludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEJDTV9TRjJfU1RBVFNfU0laRTsgaSsrKQotCQltZW1jcHkoZGF0YSArIGkgKiBFVEhfR1NUUklOR19MRU4sCi0JCSAgICAgICBiY21fc2YyX21pYltpXS5zdHJpbmcsIEVUSF9HU1RSSU5HX0xFTik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJjbV9zZjJfc3dfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAotCQkJCQkgaW50IHBvcnQsIHVpbnQ2NF90ICpkYXRhKQotewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKLQljb25zdCBzdHJ1Y3QgYmNtX3NmMl9od19zdGF0cyAqczsKLQl1bnNpZ25lZCBpbnQgaTsKLQl1NjQgdmFsID0gMDsKLQl1MzIgb2Zmc2V0OwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+c3RhdHNfbXV0ZXgpOwotCi0JLyogTm93IGZldGNoIHRoZSBwZXItcG9ydCBjb3VudGVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBCQ01fU0YyX1NUQVRTX1NJWkU7IGkrKykgewotCQlzID0gJmJjbV9zZjJfbWliW2ldOwotCi0JCS8qIERvIGEgbGF0Y2hlZCA2NC1iaXQgcmVhZCBpZiBuZWVkZWQgKi8KLQkJb2Zmc2V0ID0gcy0+cmVnICsgQ09SRV9QX01JQl9PRkZTRVQocG9ydCk7Ci0JCWlmIChzLT5zaXplb2Zfc3RhdCA9PSA4KQotCQkJdmFsID0gY29yZV9yZWFkcShwcml2LCBvZmZzZXQpOwotCQllbHNlCi0JCQl2YWwgPSBjb3JlX3JlYWRsKHByaXYsIG9mZnNldCk7Ci0KLQkJZGF0YVtpXSA9ICh1NjQpdmFsOwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+c3RhdHNfbXV0ZXgpOwotfQotCi1zdGF0aWMgaW50IGJjbV9zZjJfc3dfZ2V0X3NzZXRfY291bnQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQotewotCXJldHVybiBCQ01fU0YyX1NUQVRTX1NJWkU7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpiY21fc2YyX3N3X2Rydl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkc2FfZGV2LAotCQkJCQlzdHJ1Y3QgZGV2aWNlICpob3N0X2RldiwgaW50IHN3X2FkZHIsCi0JCQkJCXZvaWQgKipfcHJpdikKLXsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2OwotCi0JcHJpdiA9IGRldm1fa3phbGxvYyhkc2FfZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYpCi0JCXJldHVybiBOVUxMOwotCSpfcHJpdiA9IHByaXY7Ci0KLQlyZXR1cm4gIkJyb2FkY29tIFN0YXJmaWdodGVyIDIiOworCXJldHVybiBEU0FfVEFHX1BST1RPX0JSQ007CiB9CiAKIHN0YXRpYyB2b2lkIGJjbV9zZjJfaW1wX3ZsYW5fc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgY3B1X3BvcnQpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXVuc2lnbmVkIGludCBpOwogCXUzMiByZWc7CiAKQEAgLTE3Miw3ICs2Myw3IEBACiAKIHN0YXRpYyB2b2lkIGJjbV9zZjJfaW1wX3NldHVwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXUzMiByZWcsIHZhbDsKIAogCS8qIEVuYWJsZSB0aGUgcG9ydCBtZW1vcmllcyAqLwpAQCAtMjM3LDcgKzEyOCw3IEBACiAKIHN0YXRpYyB2b2lkIGJjbV9zZjJfZWVlX2VuYWJsZV9zZXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgYm9vbCBlbmFibGUpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXUzMiByZWc7CiAKIAlyZWcgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfRUVFX0VOX0NUUkwpOwpAQCAtMjUwLDcgKzE0MSw3IEBACiAKIHN0YXRpYyB2b2lkIGJjbV9zZjJfZ3BoeV9lbmFibGVfc2V0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgYm9vbCBlbmFibGUpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXUzMiByZWc7CiAKIAlyZWcgPSByZWdfcmVhZGwocHJpdiwgUkVHX1NQSFlfQ05UUkwpOwpAQCAtMzI0LDcgKzIxNSw3IEBACiBzdGF0aWMgaW50IGJjbV9zZjJfcG9ydF9zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJICAgICAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeSkKIHsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGJjbV9zZjJfdG9fcHJpdihkcyk7CiAJczggY3B1X3BvcnQgPSBkcy0+ZHN0W2RzLT5pbmRleF0uY3B1X3BvcnQ7CiAJdTMyIHJlZzsKIApAQCAtMzY1LDcgKzI1Niw3IEBACiAJcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX1BPUlRfVkxBTl9DVExfUE9SVChwb3J0KSk7CiAJcmVnICY9IH5QT1JUX1ZMQU5fQ1RSTF9NQVNLOwogCXJlZyB8PSAoMSA8PCBwb3J0KTsKLQlyZWcgfD0gcHJpdi0+cG9ydF9zdHNbcG9ydF0udmxhbl9jdGxfbWFzazsKKwlyZWcgfD0gcHJpdi0+ZGV2LT5wb3J0c1twb3J0XS52bGFuX2N0bF9tYXNrOwogCWNvcmVfd3JpdGVsKHByaXYsIHJlZywgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQocG9ydCkpOwogCiAJYmNtX3NmMl9pbXBfdmxhbl9zZXR1cChkcywgY3B1X3BvcnQpOwpAQCAtMzgwLDcgKzI3MSw3IEBACiBzdGF0aWMgdm9pZCBiY21fc2YyX3BvcnRfZGlzYWJsZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCSBzdHJ1Y3QgcGh5X2RldmljZSAqcGh5KQogewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAl1MzIgb2ZmLCByZWc7CiAKIAlpZiAocHJpdi0+d29sX3BvcnRzX21hc2sgJiAoMSA8PCBwb3J0KSkKQEAgLTQxMiw3ICszMDMsNyBAQAogc3RhdGljIGludCBiY21fc2YyX2VlZV9pbml0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkgICAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeSkKIHsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGJjbV9zZjJfdG9fcHJpdihkcyk7CiAJc3RydWN0IGV0aHRvb2xfZWVlICpwID0gJnByaXYtPnBvcnRfc3RzW3BvcnRdLmVlZTsKIAlpbnQgcmV0OwogCkBAIC00MzAsNyArMzIxLDcgQEAKIHN0YXRpYyBpbnQgYmNtX3NmMl9zd19nZXRfZWVlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9lZWUgKmUpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXN0cnVjdCBldGh0b29sX2VlZSAqcCA9ICZwcml2LT5wb3J0X3N0c1twb3J0XS5lZWU7CiAJdTMyIHJlZzsKIApAQCAtNDQ1LDcgKzMzNiw3IEBACiAJCQkgICAgICBzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2LAogCQkJICAgICAgc3RydWN0IGV0aHRvb2xfZWVlICplKQogewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAlzdHJ1Y3QgZXRodG9vbF9lZWUgKnAgPSAmcHJpdi0+cG9ydF9zdHNbcG9ydF0uZWVlOwogCiAJcC0+ZWVlX2VuYWJsZWQgPSBlLT5lZWVfZW5hYmxlZDsKQEAgLTQ2MSw0NjkgKzM1Miw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYmNtX3NmMl9mYXN0X2FnZV9vcChzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2KQotewotCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMTAwMDsKLQl1MzIgcmVnOwotCi0JcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0ZBU1RfQUdFX0NUUkwpOwotCXJlZyB8PSBFTl9BR0VfUE9SVCB8IEVOX0FHRV9WTEFOIHwgRU5fQUdFX0RZTkFNSUMgfCBGQVNUX0FHRV9TVFJfRE9ORTsKLQljb3JlX3dyaXRlbChwcml2LCByZWcsIENPUkVfRkFTVF9BR0VfQ1RSTCk7Ci0KLQlkbyB7Ci0JCXJlZyA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9GQVNUX0FHRV9DVFJMKTsKLQkJaWYgKCEocmVnICYgRkFTVF9BR0VfU1RSX0RPTkUpKQotCQkJYnJlYWs7Ci0KLQkJY3B1X3JlbGF4KCk7Ci0JfSB3aGlsZSAodGltZW91dC0tKTsKLQotCWlmICghdGltZW91dCkKLQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0KLQljb3JlX3dyaXRlbChwcml2LCAwLCBDT1JFX0ZBU1RfQUdFX0NUUkwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIEZhc3QtYWdlaW5nIG9mIEFSTCBlbnRyaWVzIGZvciBhIGdpdmVuIHBvcnQsIGVxdWl2YWxlbnQgdG8gYW4gQVJMCi0gKiBmbHVzaCBmb3IgdGhhdCBwb3J0LgotICovCi1zdGF0aWMgaW50IGJjbV9zZjJfc3dfZmFzdF9hZ2VfcG9ydChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KQotewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKLQotCWNvcmVfd3JpdGVsKHByaXYsIHBvcnQsIENPUkVfRkFTVF9BR0VfUE9SVCk7Ci0KLQlyZXR1cm4gYmNtX3NmMl9mYXN0X2FnZV9vcChwcml2KTsKLX0KLQotc3RhdGljIGludCBiY21fc2YyX3N3X2Zhc3RfYWdlX3ZsYW4oc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiwgdTE2IHZpZCkKLXsKLQljb3JlX3dyaXRlbChwcml2LCB2aWQsIENPUkVfRkFTVF9BR0VfVklEKTsKLQotCXJldHVybiBiY21fc2YyX2Zhc3RfYWdlX29wKHByaXYpOwotfQotCi1zdGF0aWMgaW50IGJjbV9zZjJfdmxhbl9vcF93YWl0KHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgaW50IHRpbWVvdXQgPSAxMDsKLQl1MzIgcmVnOwotCi0JZG8gewotCQlyZWcgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfQVJMQV9WVEJMX1JXQ1RSTCk7Ci0JCWlmICghKHJlZyAmIEFSTEFfVlRCTF9TVEROKSkKLQkJCXJldHVybiAwOwotCi0JCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKLQl9IHdoaWxlICh0aW1lb3V0LS0pOwotCi0JcmV0dXJuIC1FVElNRURPVVQ7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl92bGFuX29wKHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYsIHU4IG9wKQotewotCWNvcmVfd3JpdGVsKHByaXYsIEFSTEFfVlRCTF9TVEROIHwgb3AsIENPUkVfQVJMQV9WVEJMX1JXQ1RSTCk7Ci0KLQlyZXR1cm4gYmNtX3NmMl92bGFuX29wX3dhaXQocHJpdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJjbV9zZjJfc2V0X3ZsYW5fZW50cnkoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiwgdTE2IHZpZCwKLQkJCQkgICBzdHJ1Y3QgYmNtX3NmMl92bGFuICp2bGFuKQotewotCWludCByZXQ7Ci0KLQljb3JlX3dyaXRlbChwcml2LCB2aWQgJiBWVEJMX0FERFJfSU5ERVhfTUFTSywgQ09SRV9BUkxBX1ZUQkxfQUREUik7Ci0JY29yZV93cml0ZWwocHJpdiwgdmxhbi0+dW50YWcgPDwgVU5UQUdfTUFQX1NISUZUIHwgdmxhbi0+bWVtYmVycywKLQkJICAgIENPUkVfQVJMQV9WVEJMX0VOVFJZKTsKLQotCXJldCA9IGJjbV9zZjJfdmxhbl9vcChwcml2LCBBUkxBX1ZUQkxfQ01EX1dSSVRFKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoImZhaWxlZCB0byB3cml0ZSBWTEFOIGVudHJ5XG4iKTsKLX0KLQotc3RhdGljIGludCBiY21fc2YyX2dldF92bGFuX2VudHJ5KHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYsIHUxNiB2aWQsCi0JCQkJICBzdHJ1Y3QgYmNtX3NmMl92bGFuICp2bGFuKQotewotCXUzMiBlbnRyeTsKLQlpbnQgcmV0OwotCi0JY29yZV93cml0ZWwocHJpdiwgdmlkICYgVlRCTF9BRERSX0lOREVYX01BU0ssIENPUkVfQVJMQV9WVEJMX0FERFIpOwotCi0JcmV0ID0gYmNtX3NmMl92bGFuX29wKHByaXYsIEFSTEFfVlRCTF9DTURfUkVBRCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWVudHJ5ID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0FSTEFfVlRCTF9FTlRSWSk7Ci0Jdmxhbi0+bWVtYmVycyA9IGVudHJ5ICYgRldEX01BUF9NQVNLOwotCXZsYW4tPnVudGFnID0gKGVudHJ5ID4+IFVOVEFHX01BUF9TSElGVCkgJiBVTlRBR19NQVBfTUFTSzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJjbV9zZjJfc3dfYnJfam9pbihzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAotCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmJyaWRnZSkKLXsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7Ci0JczggY3B1X3BvcnQgPSBkcy0+ZHN0LT5jcHVfcG9ydDsKLQl1bnNpZ25lZCBpbnQgaTsKLQl1MzIgcmVnLCBwX2N0bDsKLQotCS8qIE1ha2UgdGhpcyBwb3J0IGxlYXZlIHRoZSBhbGwgVkxBTnMgam9pbiBzaW5jZSB3ZSB3aWxsIGhhdmUgcHJvcGVyCi0JICogVkxBTiBlbnRyaWVzIGZyb20gbm93IG9uCi0JICovCi0JcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0pPSU5fQUxMX1ZMQU5fRU4pOwotCXJlZyAmPSB+QklUKHBvcnQpOwotCWlmICgocmVnICYgQklUKGNwdV9wb3J0KSkgPT0gQklUKGNwdV9wb3J0KSkKLQkJcmVnICY9IH5CSVQoY3B1X3BvcnQpOwotCWNvcmVfd3JpdGVsKHByaXYsIHJlZywgQ09SRV9KT0lOX0FMTF9WTEFOX0VOKTsKLQotCXByaXYtPnBvcnRfc3RzW3BvcnRdLmJyaWRnZV9kZXYgPSBicmlkZ2U7Ci0JcF9jdGwgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfUE9SVF9WTEFOX0NUTF9QT1JUKHBvcnQpKTsKLQotCWZvciAoaSA9IDA7IGkgPCBwcml2LT5od19wYXJhbXMubnVtX3BvcnRzOyBpKyspIHsKLQkJaWYgKHByaXYtPnBvcnRfc3RzW2ldLmJyaWRnZV9kZXYgIT0gYnJpZGdlKQotCQkJY29udGludWU7Ci0KLQkJLyogQWRkIHRoaXMgbG9jYWwgcG9ydCB0byB0aGUgcmVtb3RlIHBvcnQgVkxBTiBjb250cm9sCi0JCSAqIG1lbWJlcnNoaXAgYW5kIHVwZGF0ZSB0aGUgcmVtb3RlIHBvcnQgYml0bWFzawotCQkgKi8KLQkJcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX1BPUlRfVkxBTl9DVExfUE9SVChpKSk7Ci0JCXJlZyB8PSAxIDw8IHBvcnQ7Ci0JCWNvcmVfd3JpdGVsKHByaXYsIHJlZywgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQoaSkpOwotCQlwcml2LT5wb3J0X3N0c1tpXS52bGFuX2N0bF9tYXNrID0gcmVnOwotCi0JCXBfY3RsIHw9IDEgPDwgaTsKLQl9Ci0KLQkvKiBDb25maWd1cmUgdGhlIGxvY2FsIHBvcnQgVkxBTiBjb250cm9sIG1lbWJlcnNoaXAgdG8gaW5jbHVkZQotCSAqIHJlbW90ZSBwb3J0cyBhbmQgdXBkYXRlIHRoZSBsb2NhbCBwb3J0IGJpdG1hc2sKLQkgKi8KLQljb3JlX3dyaXRlbChwcml2LCBwX2N0bCwgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQocG9ydCkpOwotCXByaXYtPnBvcnRfc3RzW3BvcnRdLnZsYW5fY3RsX21hc2sgPSBwX2N0bDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBiY21fc2YyX3N3X2JyX2xlYXZlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQpCi17Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpicmlkZ2UgPSBwcml2LT5wb3J0X3N0c1twb3J0XS5icmlkZ2VfZGV2OwotCXM4IGNwdV9wb3J0ID0gZHMtPmRzdC0+Y3B1X3BvcnQ7Ci0JdW5zaWduZWQgaW50IGk7Ci0JdTMyIHJlZywgcF9jdGw7Ci0KLQlwX2N0bCA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQocG9ydCkpOwotCi0JZm9yIChpID0gMDsgaSA8IHByaXYtPmh3X3BhcmFtcy5udW1fcG9ydHM7IGkrKykgewotCQkvKiBEb24ndCB0b3VjaCB0aGUgcmVtYWluaW5nIHBvcnRzICovCi0JCWlmIChwcml2LT5wb3J0X3N0c1tpXS5icmlkZ2VfZGV2ICE9IGJyaWRnZSkKLQkJCWNvbnRpbnVlOwotCi0JCXJlZyA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQoaSkpOwotCQlyZWcgJj0gfigxIDw8IHBvcnQpOwotCQljb3JlX3dyaXRlbChwcml2LCByZWcsIENPUkVfUE9SVF9WTEFOX0NUTF9QT1JUKGkpKTsKLQkJcHJpdi0+cG9ydF9zdHNbcG9ydF0udmxhbl9jdGxfbWFzayA9IHJlZzsKLQotCQkvKiBQcmV2ZW50IHNlbGYgcmVtb3ZhbCB0byBwcmVzZXJ2ZSBpc29sYXRpb24gKi8KLQkJaWYgKHBvcnQgIT0gaSkKLQkJCXBfY3RsICY9IH4oMSA8PCBpKTsKLQl9Ci0KLQljb3JlX3dyaXRlbChwcml2LCBwX2N0bCwgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQocG9ydCkpOwotCXByaXYtPnBvcnRfc3RzW3BvcnRdLnZsYW5fY3RsX21hc2sgPSBwX2N0bDsKLQlwcml2LT5wb3J0X3N0c1twb3J0XS5icmlkZ2VfZGV2ID0gTlVMTDsKLQotCS8qIE1ha2UgdGhpcyBwb3J0IGpvaW4gYWxsIFZMQU5zIHdpdGhvdXQgVkxBTiBlbnRyaWVzICovCi0JcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0pPSU5fQUxMX1ZMQU5fRU4pOwotCXJlZyB8PSBCSVQocG9ydCk7Ci0JaWYgKCEocmVnICYgQklUKGNwdV9wb3J0KSkpCi0JCXJlZyB8PSBCSVQoY3B1X3BvcnQpOwotCWNvcmVfd3JpdGVsKHByaXYsIHJlZywgQ09SRV9KT0lOX0FMTF9WTEFOX0VOKTsKLX0KLQotc3RhdGljIHZvaWQgYmNtX3NmMl9zd19icl9zZXRfc3RwX3N0YXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCi0JCQkJCXU4IHN0YXRlKQotewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKLQl1OCBod19zdGF0ZSwgY3VyX2h3X3N0YXRlOwotCXUzMiByZWc7Ci0KLQlyZWcgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfR19QQ1RMX1BPUlQocG9ydCkpOwotCWN1cl9od19zdGF0ZSA9IHJlZyAmIChHX01JU1RQX1NUQVRFX01BU0sgPDwgR19NSVNUUF9TVEFURV9TSElGVCk7Ci0KLQlzd2l0Y2ggKHN0YXRlKSB7Ci0JY2FzZSBCUl9TVEFURV9ESVNBQkxFRDoKLQkJaHdfc3RhdGUgPSBHX01JU1RQX0RJU19TVEFURTsKLQkJYnJlYWs7Ci0JY2FzZSBCUl9TVEFURV9MSVNURU5JTkc6Ci0JCWh3X3N0YXRlID0gR19NSVNUUF9MSVNURU5fU1RBVEU7Ci0JCWJyZWFrOwotCWNhc2UgQlJfU1RBVEVfTEVBUk5JTkc6Ci0JCWh3X3N0YXRlID0gR19NSVNUUF9MRUFSTl9TVEFURTsKLQkJYnJlYWs7Ci0JY2FzZSBCUl9TVEFURV9GT1JXQVJESU5HOgotCQlod19zdGF0ZSA9IEdfTUlTVFBfRldEX1NUQVRFOwotCQlicmVhazsKLQljYXNlIEJSX1NUQVRFX0JMT0NLSU5HOgotCQlod19zdGF0ZSA9IEdfTUlTVFBfQkxPQ0tfU1RBVEU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGludmFsaWQgU1RQIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIEZhc3QtYWdlIEFSTCBlbnRyaWVzIGlmIHdlIGFyZSBtb3ZpbmcgYSBwb3J0IGZyb20gTGVhcm5pbmcgb3IKLQkgKiBGb3J3YXJkaW5nIChjdXJfaHdfc3RhdGUpIHN0YXRlIHRvIERpc2FibGVkLCBCbG9ja2luZyBvciBMaXN0ZW5pbmcKLQkgKiBzdGF0ZSAoaHdfc3RhdGUpCi0JICovCi0JaWYgKGN1cl9od19zdGF0ZSAhPSBod19zdGF0ZSkgewotCQlpZiAoY3VyX2h3X3N0YXRlID49IEdfTUlTVFBfTEVBUk5fU1RBVEUgJiYKLQkJICAgIGh3X3N0YXRlIDw9IEdfTUlTVFBfTElTVEVOX1NUQVRFKSB7Ci0JCQlpZiAoYmNtX3NmMl9zd19mYXN0X2FnZV9wb3J0KGRzLCBwb3J0KSkgewotCQkJCXByX2VycigiJXM6IGZhc3QtYWdlaW5nIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXJlZyA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9HX1BDVExfUE9SVChwb3J0KSk7Ci0JcmVnICY9IH4oR19NSVNUUF9TVEFURV9NQVNLIDw8IEdfTUlTVFBfU1RBVEVfU0hJRlQpOwotCXJlZyB8PSBod19zdGF0ZTsKLQljb3JlX3dyaXRlbChwcml2LCByZWcsIENPUkVfR19QQ1RMX1BPUlQocG9ydCkpOwotfQotCi0vKiBBZGRyZXNzIFJlc29sdXRpb24gTG9naWMgcm91dGluZXMgKi8KLXN0YXRpYyBpbnQgYmNtX3NmMl9hcmxfb3Bfd2FpdChzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2KQotewotCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMTA7Ci0JdTMyIHJlZzsKLQotCWRvIHsKLQkJcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0FSTEFfUldDVEwpOwotCQlpZiAoIShyZWcgJiBBUkxfU1RSVEROKSkKLQkJCXJldHVybiAwOwotCi0JCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKLQl9IHdoaWxlICh0aW1lb3V0LS0pOwotCi0JcmV0dXJuIC1FVElNRURPVVQ7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl9hcmxfcndfb3Aoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IG9wKQotewotCXUzMiBjbWQ7Ci0KLQlpZiAob3AgPiBBUkxfUlcpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY21kID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0FSTEFfUldDVEwpOwotCWNtZCAmPSB+SVZMX1NWTF9TRUxFQ1Q7Ci0JY21kIHw9IEFSTF9TVFJURE47Ci0JaWYgKG9wKQotCQljbWQgfD0gQVJMX1JXOwotCWVsc2UKLQkJY21kICY9IH5BUkxfUlc7Ci0JY29yZV93cml0ZWwocHJpdiwgY21kLCBDT1JFX0FSTEFfUldDVEwpOwotCi0JcmV0dXJuIGJjbV9zZjJfYXJsX29wX3dhaXQocHJpdik7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl9hcmxfcmVhZChzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2LCB1NjQgbWFjLAotCQkJICAgIHUxNiB2aWQsIHN0cnVjdCBiY21fc2YyX2FybF9lbnRyeSAqZW50LCB1OCAqaWR4LAotCQkJICAgIGJvb2wgaXNfdmFsaWQpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JaW50IHJldDsKLQotCXJldCA9IGJjbV9zZjJfYXJsX29wX3dhaXQocHJpdik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIFJlYWQgdGhlIDQgYmlucyAqLwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJdTY0IG1hY192aWQ7Ci0JCXUzMiBmd2RfZW50cnk7Ci0KLQkJbWFjX3ZpZCA9IGNvcmVfcmVhZHEocHJpdiwgQ09SRV9BUkxBX01BQ1ZJRF9FTlRSWShpKSk7Ci0JCWZ3ZF9lbnRyeSA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9BUkxBX0ZXRF9FTlRSWShpKSk7Ci0JCWJjbV9zZjJfYXJsX3RvX2VudHJ5KGVudCwgbWFjX3ZpZCwgZndkX2VudHJ5KTsKLQotCQlpZiAoZW50LT5pc192YWxpZCAmJiBpc192YWxpZCkgewotCQkJKmlkeCA9IGk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8qIFRoaXMgaXMgdGhlIE1BQyB3ZSBqdXN0IGRlbGV0ZWQgKi8KLQkJaWYgKCFpc192YWxpZCAmJiAobWFjX3ZpZCAmIG1hYykpCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gLUVOT0VOVDsKLX0KLQotc3RhdGljIGludCBiY21fc2YyX2FybF9vcChzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2LCBpbnQgb3AsIGludCBwb3J0LAotCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLCB1MTYgdmlkLCBib29sIGlzX3ZhbGlkKQotewotCXN0cnVjdCBiY21fc2YyX2FybF9lbnRyeSBlbnQ7Ci0JdTMyIGZ3ZF9lbnRyeTsKLQl1NjQgbWFjLCBtYWNfdmlkID0gMDsKLQl1OCBpZHggPSAwOwotCWludCByZXQ7Ci0KLQkvKiBDb252ZXJ0IHRoZSBhcnJheSBpbnRvIGEgNjQtYml0IE1BQyAqLwotCW1hYyA9IGJjbV9zZjJfbWFjX3RvX3U2NChhZGRyKTsKLQotCS8qIFBlcmZvcm0gYSByZWFkIGZvciB0aGUgZ2l2ZW4gTUFDIGFuZCBWSUQgKi8KLQljb3JlX3dyaXRlcShwcml2LCBtYWMsIENPUkVfQVJMQV9NQUMpOwotCWNvcmVfd3JpdGVsKHByaXYsIHZpZCwgQ09SRV9BUkxBX1ZJRCk7Ci0KLQkvKiBJc3N1ZSBhIHJlYWQgb3BlcmF0aW9uIGZvciB0aGlzIE1BQyAqLwotCXJldCA9IGJjbV9zZjJfYXJsX3J3X29wKHByaXYsIDEpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBiY21fc2YyX2FybF9yZWFkKHByaXYsIG1hYywgdmlkLCAmZW50LCAmaWR4LCBpc192YWxpZCk7Ci0JLyogSWYgdGhpcyBpcyBhIHJlYWQsIGp1c3QgZmluaXNoIG5vdyAqLwotCWlmIChvcCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIFdlIGNvdWxkIG5vdCBmaW5kIGEgbWF0Y2hpbmcgTUFDLCBzbyByZXNldCB0byBhIG5ldyBlbnRyeSAqLwotCWlmIChyZXQpIHsKLQkJZndkX2VudHJ5ID0gMDsKLQkJaWR4ID0gMDsKLQl9Ci0KLQltZW1zZXQoJmVudCwgMCwgc2l6ZW9mKGVudCkpOwotCWVudC5wb3J0ID0gcG9ydDsKLQllbnQuaXNfdmFsaWQgPSBpc192YWxpZDsKLQllbnQudmlkID0gdmlkOwotCWVudC5pc19zdGF0aWMgPSB0cnVlOwotCW1lbWNweShlbnQubWFjLCBhZGRyLCBFVEhfQUxFTik7Ci0JYmNtX3NmMl9hcmxfZnJvbV9lbnRyeSgmbWFjX3ZpZCwgJmZ3ZF9lbnRyeSwgJmVudCk7Ci0KLQljb3JlX3dyaXRlcShwcml2LCBtYWNfdmlkLCBDT1JFX0FSTEFfTUFDVklEX0VOVFJZKGlkeCkpOwotCWNvcmVfd3JpdGVsKHByaXYsIGZ3ZF9lbnRyeSwgQ09SRV9BUkxBX0ZXRF9FTlRSWShpZHgpKTsKLQotCXJldCA9IGJjbV9zZjJfYXJsX3J3X29wKHByaXYsIDApOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBSZS1yZWFkIHRoZSBlbnRyeSB0byBjaGVjayAqLwotCXJldHVybiBiY21fc2YyX2FybF9yZWFkKHByaXYsIG1hYywgdmlkLCAmZW50LCAmaWR4LCBpc192YWxpZCk7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl9zd19mZGJfcHJlcGFyZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAotCQkJCSAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYiwKLQkJCQkgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQotewotCS8qIFdlIGRvIG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpZmljIGhlcmUgeWV0ICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJjbV9zZjJfc3dfZmRiX2FkZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCi0JCQkgICAgICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCi17Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOwotCi0JaWYgKGJjbV9zZjJfYXJsX29wKHByaXYsIDAsIHBvcnQsIGZkYi0+YWRkciwgZmRiLT52aWQsIHRydWUpKQotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWRkIE1BQyBhZGRyZXNzXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl9zd19mZGJfZGVsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiKQotewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKLQotCXJldHVybiBiY21fc2YyX2FybF9vcChwcml2LCAwLCBwb3J0LCBmZGItPmFkZHIsIGZkYi0+dmlkLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl9hcmxfc2VhcmNoX3dhaXQoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdikKLXsKLQl1bnNpZ25lZCB0aW1lb3V0ID0gMTAwMDsKLQl1MzIgcmVnOwotCi0JZG8gewotCQlyZWcgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfQVJMQV9TUkNIX0NUTCk7Ci0JCWlmICghKHJlZyAmIEFSTEFfU1JDSF9TVEROKSkKLQkJCXJldHVybiAwOwotCi0JCWlmIChyZWcgJiBBUkxBX1NSQ0hfVkxJRCkKLQkJCXJldHVybiAwOwotCi0JCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKLQl9IHdoaWxlICh0aW1lb3V0LS0pOwotCi0JcmV0dXJuIC1FVElNRURPVVQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGJjbV9zZjJfYXJsX3NlYXJjaF9yZChzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2LCB1OCBpZHgsCi0JCQkJICBzdHJ1Y3QgYmNtX3NmMl9hcmxfZW50cnkgKmVudCkKLXsKLQl1NjQgbWFjX3ZpZDsKLQl1MzIgZndkX2VudHJ5OwotCi0JbWFjX3ZpZCA9IGNvcmVfcmVhZHEocHJpdiwgQ09SRV9BUkxBX1NSQ0hfUlNMVF9NQUNWSUQoaWR4KSk7Ci0JZndkX2VudHJ5ID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0FSTEFfU1JDSF9SU0xUKGlkeCkpOwotCWJjbV9zZjJfYXJsX3RvX2VudHJ5KGVudCwgbWFjX3ZpZCwgZndkX2VudHJ5KTsKLX0KLQotc3RhdGljIGludCBiY21fc2YyX3N3X2ZkYl9jb3B5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwb3J0LAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBiY21fc2YyX2FybF9lbnRyeSAqZW50LAotCQkJICAgICAgIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCi0JCQkgICAgICAgaW50ICgqY2IpKHN0cnVjdCBzd2l0Y2hkZXZfb2JqICpvYmopKQotewotCWlmICghZW50LT5pc192YWxpZCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAocG9ydCAhPSBlbnQtPnBvcnQpCi0JCXJldHVybiAwOwotCi0JZXRoZXJfYWRkcl9jb3B5KGZkYi0+YWRkciwgZW50LT5tYWMpOwotCWZkYi0+dmlkID0gZW50LT52aWQ7Ci0JZmRiLT5uZG1fc3RhdGUgPSBlbnQtPmlzX3N0YXRpYyA/IE5VRF9OT0FSUCA6IE5VRF9SRUFDSEFCTEU7Ci0KLQlyZXR1cm4gY2IoJmZkYi0+b2JqKTsKLX0KLQotc3RhdGljIGludCBiY21fc2YyX3N3X2ZkYl9kdW1wKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCi0JCQkgICAgICAgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYiwKLQkJCSAgICAgICBpbnQgKCpjYikoc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaikpCi17Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2OwotCXN0cnVjdCBiY21fc2YyX2FybF9lbnRyeSByZXN1bHRzWzJdOwotCXVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0JaW50IHJldDsKLQotCS8qIFN0YXJ0IHNlYXJjaCBvcGVyYXRpb24gKi8KLQljb3JlX3dyaXRlbChwcml2LCBBUkxBX1NSQ0hfU1RETiwgQ09SRV9BUkxBX1NSQ0hfQ1RMKTsKLQotCWRvIHsKLQkJcmV0ID0gYmNtX3NmMl9hcmxfc2VhcmNoX3dhaXQocHJpdik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCS8qIFJlYWQgYm90aCBlbnRyaWVzLCB0aGVuIHJldHVybiB0aGVpciB2YWx1ZXMgYmFjayAqLwotCQliY21fc2YyX2FybF9zZWFyY2hfcmQocHJpdiwgMCwgJnJlc3VsdHNbMF0pOwotCQlyZXQgPSBiY21fc2YyX3N3X2ZkYl9jb3B5KGRldiwgcG9ydCwgJnJlc3VsdHNbMF0sIGZkYiwgY2IpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQliY21fc2YyX2FybF9zZWFyY2hfcmQocHJpdiwgMSwgJnJlc3VsdHNbMV0pOwotCQlyZXQgPSBiY21fc2YyX3N3X2ZkYl9jb3B5KGRldiwgcG9ydCwgJnJlc3VsdHNbMV0sIGZkYiwgY2IpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQlpZiAoIXJlc3VsdHNbMF0uaXNfdmFsaWQgJiYgIXJlc3VsdHNbMV0uaXNfdmFsaWQpCi0JCQlicmVhazsKLQotCX0gd2hpbGUgKGNvdW50KysgPCBDT1JFX0FSTEFfTlVNX0VOVFJJRVMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgYmNtX3NmMl9zd19pbmRpcl9ydyhzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2LCBpbnQgb3AsIGludCBhZGRyLAogCQkJICAgICAgIGludCByZWdudW0sIHUxNiB2YWwpCiB7CkBAIC0xMDM2LDEyICs0NjQsMTAgQEAKIAogc3RhdGljIHZvaWQgYmNtX3NmMl9pbnRyX2Rpc2FibGUoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdikKIHsKLQlpbnRybDJfMF93cml0ZWwocHJpdiwgMHhmZmZmZmZmZiwgSU5UUkwyX0NQVV9NQVNLX1NFVCk7CisJaW50cmwyXzBfbWFza19zZXQocHJpdiwgMHhmZmZmZmZmZik7CiAJaW50cmwyXzBfd3JpdGVsKHByaXYsIDB4ZmZmZmZmZmYsIElOVFJMMl9DUFVfQ0xFQVIpOwotCWludHJsMl8wX3dyaXRlbChwcml2LCAwLCBJTlRSTDJfQ1BVX01BU0tfQ0xFQVIpOwotCWludHJsMl8xX3dyaXRlbChwcml2LCAweGZmZmZmZmZmLCBJTlRSTDJfQ1BVX01BU0tfU0VUKTsKKwlpbnRybDJfMV9tYXNrX3NldChwcml2LCAweGZmZmZmZmZmKTsKIAlpbnRybDJfMV93cml0ZWwocHJpdiwgMHhmZmZmZmZmZiwgSU5UUkwyX0NQVV9DTEVBUik7Ci0JaW50cmwyXzFfd3JpdGVsKHByaXYsIDAsIElOVFJMMl9DUFVfTUFTS19DTEVBUik7CiB9CiAKIHN0YXRpYyB2b2lkIGJjbV9zZjJfaWRlbnRpZnlfcG9ydHMoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiwKQEAgLTEwODIsNyArNTA4LDcgQEAKIAogc3RhdGljIGludCBiY21fc2YyX21kaW9fcmVnaXN0ZXIoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwogCXN0YXRpYyBpbnQgaW5kZXg7CiAJaW50IGVycjsKQEAgLTExNDYsMTQgKzU3Miw5IEBACiAJCW9mX25vZGVfcHV0KHByaXYtPm1hc3Rlcl9taWlfZG4pOwogfQogCi1zdGF0aWMgaW50IGJjbV9zZjJfc3dfc2V0X2FkZHIoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCB1OCAqYWRkcikKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHUzMiBiY21fc2YyX3N3X2dldF9waHlfZmxhZ3Moc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCkKIHsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGJjbV9zZjJfdG9fcHJpdihkcyk7CiAKIAkvKiBUaGUgQkNNN3h4eCBQSFkgZHJpdmVyIGV4cGVjdHMgdG8gZmluZCB0aGUgaW50ZWdyYXRlZCBQSFkgcmV2aXNpb24KIAkgKiBpbiBiaXRzIDE1OjggYW5kIHRoZSBwYXRjaCBsZXZlbCBpbiBiaXRzIDc6MCB3aGljaCBpcyBleGFjdGx5IHdoYXQKQEAgLTExNjYsNyArNTg3LDcgQEAKIHN0YXRpYyB2b2lkIGJjbV9zZjJfc3dfYWRqdXN0X2xpbmsoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCQkgICBzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAl1MzIgaWRfbW9kZV9kaXMgPSAwLCBwb3J0X21vZGU7CiAJY29uc3QgY2hhciAqc3RyID0gTlVMTDsKIAl1MzIgcmVnOwpAQCAtMTI0Niw3ICs2NjcsNyBAQAogc3RhdGljIHZvaWQgYmNtX3NmMl9zd19maXhlZF9saW5rX3VwZGF0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCQkgc3RydWN0IGZpeGVkX3BoeV9zdGF0dXMgKnN0YXR1cykKIHsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGJjbV9zZjJfdG9fcHJpdihkcyk7CiAJdTMyIGR1cGxleCwgcGF1c2U7CiAJdTMyIHJlZzsKIApAQCAtMTI5OCw3ICs3MTksNyBAQAogCiBzdGF0aWMgaW50IGJjbV9zZjJfc3dfc3VzcGVuZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXVuc2lnbmVkIGludCBwb3J0OwogCiAJYmNtX3NmMl9pbnRyX2Rpc2FibGUocHJpdik7CkBAIC0xMzE4LDcgKzczOSw3IEBACiAKIHN0YXRpYyBpbnQgYmNtX3NmMl9zd19yZXN1bWUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAl1bnNpZ25lZCBpbnQgcG9ydDsKIAlpbnQgcmV0OwogCkBAIC0xMzQ1LDcgKzc2Niw3IEBACiAJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpwID0gZHMtPmRzdFtkcy0+aW5kZXhdLm1hc3Rlcl9uZXRkZXY7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXN0cnVjdCBldGh0b29sX3dvbGluZm8gcHdvbDsKIAogCS8qIEdldCB0aGUgcGFyZW50IGRldmljZSBXb0wgc2V0dGluZ3MgKi8KQEAgLTEzNjgsNyArNzg5LDcgQEAKIAkJCSAgICAgIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcCA9IGRzLT5kc3RbZHMtPmluZGV4XS5tYXN0ZXJfbmV0ZGV2OwotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAlzOCBjcHVfcG9ydCA9IGRzLT5kc3RbZHMtPmluZGV4XS5jcHVfcG9ydDsKIAlzdHJ1Y3QgZXRodG9vbF93b2xpbmZvIHB3b2w7CiAKQEAgLTEzOTMsNDMgKzgxNCwzMiBAQAogCXJldHVybiBwLT5ldGh0b29sX29wcy0+c2V0X3dvbChwLCB3b2wpOwogfQogCi1zdGF0aWMgdm9pZCBiY21fc2YyX2VuYWJsZV92bGFuKHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYsIGJvb2wgZW5hYmxlKQorc3RhdGljIGludCBiY21fc2YyX3ZsYW5fb3Bfd2FpdChzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2KQogewotCXUzMiBtZ210LCB2YzAsIHZjMSwgdmM0LCB2YzU7CisJdW5zaWduZWQgaW50IHRpbWVvdXQgPSAxMDsKKwl1MzIgcmVnOwogCi0JbWdtdCA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9TV01PREUpOwotCXZjMCA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9WTEFOX0NUUkwwKTsKLQl2YzEgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfVkxBTl9DVFJMMSk7Ci0JdmM0ID0gY29yZV9yZWFkbChwcml2LCBDT1JFX1ZMQU5fQ1RSTDQpOwotCXZjNSA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9WTEFOX0NUUkw1KTsKKwlkbyB7CisJCXJlZyA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9BUkxBX1ZUQkxfUldDVFJMKTsKKwkJaWYgKCEocmVnICYgQVJMQV9WVEJMX1NURE4pKQorCQkJcmV0dXJuIDA7CiAKLQltZ210ICY9IH5TV19GV0RHX01PREU7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwl9IHdoaWxlICh0aW1lb3V0LS0pOwogCi0JaWYgKGVuYWJsZSkgewotCQl2YzAgfD0gVkxBTl9FTiB8IFZMQU5fTEVBUk5fTU9ERV9JVkw7Ci0JCXZjMSB8PSBFTl9SU1ZfTUNBU1RfVU5UQUcgfCBFTl9SU1ZfTUNBU1RfRldETUFQOwotCQl2YzQgJj0gfihJTkdSX1ZJRF9DSEtfTUFTSyA8PCBJTkdSX1ZJRF9DSEtfU0hJRlQpOwotCQl2YzQgfD0gSU5HUl9WSURfQ0hLX0RST1A7Ci0JCXZjNSB8PSBEUk9QX1ZUQUJMRV9NSVNTIHwgRU5fVklEX0ZGRl9GV0Q7Ci0JfSBlbHNlIHsKLQkJdmMwICY9IH4oVkxBTl9FTiB8IFZMQU5fTEVBUk5fTU9ERV9JVkwpOwotCQl2YzEgJj0gfihFTl9SU1ZfTUNBU1RfVU5UQUcgfCBFTl9SU1ZfTUNBU1RfRldETUFQKTsKLQkJdmM0ICY9IH4oSU5HUl9WSURfQ0hLX01BU0sgPDwgSU5HUl9WSURfQ0hLX1NISUZUKTsKLQkJdmM1ICY9IH4oRFJPUF9WVEFCTEVfTUlTUyB8IEVOX1ZJRF9GRkZfRldEKTsKLQkJdmM0IHw9IElOR1JfVklEX0NIS19WSURfVklPTF9JTVA7Ci0JfQorCXJldHVybiAtRVRJTUVET1VUOworfQogCi0JY29yZV93cml0ZWwocHJpdiwgdmMwLCBDT1JFX1ZMQU5fQ1RSTDApOwotCWNvcmVfd3JpdGVsKHByaXYsIHZjMSwgQ09SRV9WTEFOX0NUUkwxKTsKLQljb3JlX3dyaXRlbChwcml2LCAwLCBDT1JFX1ZMQU5fQ1RSTDMpOwotCWNvcmVfd3JpdGVsKHByaXYsIHZjNCwgQ09SRV9WTEFOX0NUUkw0KTsKLQljb3JlX3dyaXRlbChwcml2LCB2YzUsIENPUkVfVkxBTl9DVFJMNSk7Ci0JY29yZV93cml0ZWwocHJpdiwgbWdtdCwgQ09SRV9TV01PREUpOworc3RhdGljIGludCBiY21fc2YyX3ZsYW5fb3Aoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiwgdTggb3ApCit7CisJY29yZV93cml0ZWwocHJpdiwgQVJMQV9WVEJMX1NURE4gfCBvcCwgQ09SRV9BUkxBX1ZUQkxfUldDVFJMKTsKKworCXJldHVybiBiY21fc2YyX3ZsYW5fb3Bfd2FpdChwcml2KTsKIH0KIAogc3RhdGljIHZvaWQgYmNtX3NmMl9zd19jb25maWd1cmVfdmxhbihzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXVuc2lnbmVkIGludCBwb3J0OwogCiAJLyogQ2xlYXIgYWxsIFZMQU5zICovCkBAIC0xNDQzLDE2MiArODUzLDE5OSBAQAogCX0KIH0KIAotc3RhdGljIGludCBiY21fc2YyX3N3X3ZsYW5fZmlsdGVyaW5nKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCi0JCQkJICAgICBib29sIHZsYW5fZmlsdGVyaW5nKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJjbV9zZjJfc3dfdmxhbl9wcmVwYXJlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCi0JCQkJICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF92bGFuICp2bGFuLAotCQkJCSAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQotewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKLQotCWJjbV9zZjJfZW5hYmxlX3ZsYW4ocHJpdiwgdHJ1ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYmNtX3NmMl9zd192bGFuX2FkZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAotCQkJCWNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfdmxhbiAqdmxhbiwKLQkJCQlzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKLXsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7Ci0JYm9vbCB1bnRhZ2dlZCA9IHZsYW4tPmZsYWdzICYgQlJJREdFX1ZMQU5fSU5GT19VTlRBR0dFRDsKLQlib29sIHB2aWQgPSB2bGFuLT5mbGFncyAmIEJSSURHRV9WTEFOX0lORk9fUFZJRDsKLQlzOCBjcHVfcG9ydCA9IGRzLT5kc3QtPmNwdV9wb3J0OwotCXN0cnVjdCBiY21fc2YyX3ZsYW4gKnZsOwotCXUxNiB2aWQ7Ci0KLQlmb3IgKHZpZCA9IHZsYW4tPnZpZF9iZWdpbjsgdmlkIDw9IHZsYW4tPnZpZF9lbmQ7ICsrdmlkKSB7Ci0JCXZsID0gJnByaXYtPnZsYW5zW3ZpZF07Ci0KLQkJYmNtX3NmMl9nZXRfdmxhbl9lbnRyeShwcml2LCB2aWQsIHZsKTsKLQotCQl2bC0+bWVtYmVycyB8PSBCSVQocG9ydCkgfCBCSVQoY3B1X3BvcnQpOwotCQlpZiAodW50YWdnZWQpCi0JCQl2bC0+dW50YWcgfD0gQklUKHBvcnQpIHwgQklUKGNwdV9wb3J0KTsKLQkJZWxzZQotCQkJdmwtPnVudGFnICY9IH4oQklUKHBvcnQpIHwgQklUKGNwdV9wb3J0KSk7Ci0KLQkJYmNtX3NmMl9zZXRfdmxhbl9lbnRyeShwcml2LCB2aWQsIHZsKTsKLQkJYmNtX3NmMl9zd19mYXN0X2FnZV92bGFuKHByaXYsIHZpZCk7Ci0JfQotCi0JaWYgKHB2aWQpIHsKLQkJY29yZV93cml0ZWwocHJpdiwgdmxhbi0+dmlkX2VuZCwgQ09SRV9ERUZBVUxUXzFRX1RBR19QKHBvcnQpKTsKLQkJY29yZV93cml0ZWwocHJpdiwgdmxhbi0+dmlkX2VuZCwKLQkJCSAgICBDT1JFX0RFRkFVTFRfMVFfVEFHX1AoY3B1X3BvcnQpKTsKLQkJYmNtX3NmMl9zd19mYXN0X2FnZV92bGFuKHByaXYsIHZpZCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGJjbV9zZjJfc3dfdmxhbl9kZWwoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X3ZsYW4gKnZsYW4pCi17Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOwotCWJvb2wgdW50YWdnZWQgPSB2bGFuLT5mbGFncyAmIEJSSURHRV9WTEFOX0lORk9fVU5UQUdHRUQ7Ci0JczggY3B1X3BvcnQgPSBkcy0+ZHN0LT5jcHVfcG9ydDsKLQlzdHJ1Y3QgYmNtX3NmMl92bGFuICp2bDsKLQl1MTYgdmlkLCBwdmlkOwotCWludCByZXQ7Ci0KLQlwdmlkID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0RFRkFVTFRfMVFfVEFHX1AocG9ydCkpOwotCi0JZm9yICh2aWQgPSB2bGFuLT52aWRfYmVnaW47IHZpZCA8PSB2bGFuLT52aWRfZW5kOyArK3ZpZCkgewotCQl2bCA9ICZwcml2LT52bGFuc1t2aWRdOwotCi0JCXJldCA9IGJjbV9zZjJfZ2V0X3ZsYW5fZW50cnkocHJpdiwgdmlkLCB2bCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCXZsLT5tZW1iZXJzICY9IH5CSVQocG9ydCk7Ci0JCWlmICgodmwtPm1lbWJlcnMgJiBCSVQoY3B1X3BvcnQpKSA9PSBCSVQoY3B1X3BvcnQpKQotCQkJdmwtPm1lbWJlcnMgPSAwOwotCQlpZiAocHZpZCA9PSB2aWQpCi0JCQlwdmlkID0gMDsKLQkJaWYgKHVudGFnZ2VkKSB7Ci0JCQl2bC0+dW50YWcgJj0gfkJJVChwb3J0KTsKLQkJCWlmICgodmwtPnVudGFnICYgQklUKHBvcnQpKSA9PSBCSVQoY3B1X3BvcnQpKQotCQkJCXZsLT51bnRhZyA9IDA7Ci0JCX0KLQotCQliY21fc2YyX3NldF92bGFuX2VudHJ5KHByaXYsIHZpZCwgdmwpOwotCQliY21fc2YyX3N3X2Zhc3RfYWdlX3ZsYW4ocHJpdiwgdmlkKTsKLQl9Ci0KLQljb3JlX3dyaXRlbChwcml2LCBwdmlkLCBDT1JFX0RFRkFVTFRfMVFfVEFHX1AocG9ydCkpOwotCWNvcmVfd3JpdGVsKHByaXYsIHB2aWQsIENPUkVfREVGQVVMVF8xUV9UQUdfUChjcHVfcG9ydCkpOwotCWJjbV9zZjJfc3dfZmFzdF9hZ2Vfdmxhbihwcml2LCB2aWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl9zd192bGFuX2R1bXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKLQkJCQlzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X3ZsYW4gKnZsYW4sCi0JCQkJaW50ICgqY2IpKHN0cnVjdCBzd2l0Y2hkZXZfb2JqICpvYmopKQotewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKLQlzdHJ1Y3QgYmNtX3NmMl9wb3J0X3N0YXR1cyAqcCA9ICZwcml2LT5wb3J0X3N0c1twb3J0XTsKLQlzdHJ1Y3QgYmNtX3NmMl92bGFuICp2bDsKLQl1MTYgdmlkLCBwdmlkOwotCWludCBlcnIgPSAwOwotCi0JcHZpZCA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9ERUZBVUxUXzFRX1RBR19QKHBvcnQpKTsKLQotCWZvciAodmlkID0gMDsgdmlkIDwgVkxBTl9OX1ZJRDsgdmlkKyspIHsKLQkJdmwgPSAmcHJpdi0+dmxhbnNbdmlkXTsKLQotCQlpZiAoISh2bC0+bWVtYmVycyAmIEJJVChwb3J0KSkpCi0JCQljb250aW51ZTsKLQotCQl2bGFuLT52aWRfYmVnaW4gPSB2bGFuLT52aWRfZW5kID0gdmlkOwotCQl2bGFuLT5mbGFncyA9IDA7Ci0KLQkJaWYgKHZsLT51bnRhZyAmIEJJVChwb3J0KSkKLQkJCXZsYW4tPmZsYWdzIHw9IEJSSURHRV9WTEFOX0lORk9fVU5UQUdHRUQ7Ci0JCWlmIChwLT5wdmlkID09IHZpZCkKLQkJCXZsYW4tPmZsYWdzIHw9IEJSSURHRV9WTEFOX0lORk9fUFZJRDsKLQotCQllcnIgPSBjYigmdmxhbi0+b2JqKTsKLQkJaWYgKGVycikKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KIHN0YXRpYyBpbnQgYmNtX3NmMl9zd19zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiB7Ci0JY29uc3QgY2hhciAqcmVnX25hbWVzW0JDTV9TRjJfUkVHU19OVU1dID0gQkNNX1NGMl9SRUdTX05BTUU7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47Ci0Jdm9pZCBfX2lvbWVtICoqYmFzZTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAl1bnNpZ25lZCBpbnQgcG9ydDsKKworCS8qIEVuYWJsZSBhbGwgdmFsaWQgcG9ydHMgYW5kIGRpc2FibGUgdGhvc2UgdW51c2VkICovCisJZm9yIChwb3J0ID0gMDsgcG9ydCA8IHByaXYtPmh3X3BhcmFtcy5udW1fcG9ydHM7IHBvcnQrKykgeworCQkvKiBJTVAgcG9ydCByZWNlaXZlcyBzcGVjaWFsIHRyZWF0bWVudCAqLworCQlpZiAoKDEgPDwgcG9ydCkgJiBkcy0+ZW5hYmxlZF9wb3J0X21hc2spCisJCQliY21fc2YyX3BvcnRfc2V0dXAoZHMsIHBvcnQsIE5VTEwpOworCQllbHNlIGlmIChkc2FfaXNfY3B1X3BvcnQoZHMsIHBvcnQpKQorCQkJYmNtX3NmMl9pbXBfc2V0dXAoZHMsIHBvcnQpOworCQllbHNlCisJCQliY21fc2YyX3BvcnRfZGlzYWJsZShkcywgcG9ydCwgTlVMTCk7CisJfQorCisJYmNtX3NmMl9zd19jb25maWd1cmVfdmxhbihkcyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIFNXSVRDSF9DT1JFIHJlZ2lzdGVyIHNwYWNlIGlzIG1hbmFnZWQgYnkgYjUzIGJ1dCBvcGVyYXRlcyBvbiBhIHBhZ2UgKworICogcmVnaXN0ZXIgYmFzaXMgc28gd2UgbmVlZCB0byB0cmFuc2xhdGUgdGhhdCBpbnRvIGFuIGFkZHJlc3MgdGhhdCB0aGUKKyAqIGJ1cy1nbHVlIHVuZGVyc3RhbmRzLgorICovCisjZGVmaW5lIFNGMl9QQUdFX1JFR19NS0FERFIocGFnZSwgcmVnKQkoKHBhZ2UpIDw8IDEwIHwgKHJlZykgPDwgMikKKworc3RhdGljIGludCBiY21fc2YyX2NvcmVfcmVhZDgoc3RydWN0IGI1M19kZXZpY2UgKmRldiwgdTggcGFnZSwgdTggcmVnLAorCQkJICAgICAgdTggKnZhbCkKK3sKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCisJKnZhbCA9IGNvcmVfcmVhZGwocHJpdiwgU0YyX1BBR0VfUkVHX01LQUREUihwYWdlLCByZWcpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbV9zZjJfY29yZV9yZWFkMTYoc3RydWN0IGI1M19kZXZpY2UgKmRldiwgdTggcGFnZSwgdTggcmVnLAorCQkJICAgICAgIHUxNiAqdmFsKQoreworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisKKwkqdmFsID0gY29yZV9yZWFkbChwcml2LCBTRjJfUEFHRV9SRUdfTUtBRERSKHBhZ2UsIHJlZykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtX3NmMl9jb3JlX3JlYWQzMihzdHJ1Y3QgYjUzX2RldmljZSAqZGV2LCB1OCBwYWdlLCB1OCByZWcsCisJCQkgICAgICAgdTMyICp2YWwpCit7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKworCSp2YWwgPSBjb3JlX3JlYWRsKHByaXYsIFNGMl9QQUdFX1JFR19NS0FERFIocGFnZSwgcmVnKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY21fc2YyX2NvcmVfcmVhZDY0KHN0cnVjdCBiNTNfZGV2aWNlICpkZXYsIHU4IHBhZ2UsIHU4IHJlZywKKwkJCSAgICAgICB1NjQgKnZhbCkKK3sKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCisJKnZhbCA9IGNvcmVfcmVhZHEocHJpdiwgU0YyX1BBR0VfUkVHX01LQUREUihwYWdlLCByZWcpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbV9zZjJfY29yZV93cml0ZTgoc3RydWN0IGI1M19kZXZpY2UgKmRldiwgdTggcGFnZSwgdTggcmVnLAorCQkJICAgICAgIHU4IHZhbHVlKQoreworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisKKwljb3JlX3dyaXRlbChwcml2LCB2YWx1ZSwgU0YyX1BBR0VfUkVHX01LQUREUihwYWdlLCByZWcpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbV9zZjJfY29yZV93cml0ZTE2KHN0cnVjdCBiNTNfZGV2aWNlICpkZXYsIHU4IHBhZ2UsIHU4IHJlZywKKwkJCQl1MTYgdmFsdWUpCit7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKworCWNvcmVfd3JpdGVsKHByaXYsIHZhbHVlLCBTRjJfUEFHRV9SRUdfTUtBRERSKHBhZ2UsIHJlZykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtX3NmMl9jb3JlX3dyaXRlMzIoc3RydWN0IGI1M19kZXZpY2UgKmRldiwgdTggcGFnZSwgdTggcmVnLAorCQkJCXUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCisJY29yZV93cml0ZWwocHJpdiwgdmFsdWUsIFNGMl9QQUdFX1JFR19NS0FERFIocGFnZSwgcmVnKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY21fc2YyX2NvcmVfd3JpdGU2NChzdHJ1Y3QgYjUzX2RldmljZSAqZGV2LCB1OCBwYWdlLCB1OCByZWcsCisJCQkJdTY0IHZhbHVlKQoreworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisKKwljb3JlX3dyaXRlcShwcml2LCB2YWx1ZSwgU0YyX1BBR0VfUkVHX01LQUREUihwYWdlLCByZWcpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGI1M19pb19vcHMgYmNtX3NmMl9pb19vcHMgPSB7CisJLnJlYWQ4CT0gYmNtX3NmMl9jb3JlX3JlYWQ4LAorCS5yZWFkMTYJPSBiY21fc2YyX2NvcmVfcmVhZDE2LAorCS5yZWFkMzIJPSBiY21fc2YyX2NvcmVfcmVhZDMyLAorCS5yZWFkNDgJPSBiY21fc2YyX2NvcmVfcmVhZDY0LAorCS5yZWFkNjQJPSBiY21fc2YyX2NvcmVfcmVhZDY0LAorCS53cml0ZTgJPSBiY21fc2YyX2NvcmVfd3JpdGU4LAorCS53cml0ZTE2ID0gYmNtX3NmMl9jb3JlX3dyaXRlMTYsCisJLndyaXRlMzIgPSBiY21fc2YyX2NvcmVfd3JpdGUzMiwKKwkud3JpdGU0OCA9IGJjbV9zZjJfY29yZV93cml0ZTY0LAorCS53cml0ZTY0ID0gYmNtX3NmMl9jb3JlX3dyaXRlNjQsCit9OworCitzdGF0aWMgaW50IGJjbV9zZjJfc3dfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb25zdCBjaGFyICpyZWdfbmFtZXNbQkNNX1NGMl9SRUdTX05VTV0gPSBCQ01fU0YyX1JFR1NfTkFNRTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGI1M19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2OworCXN0cnVjdCBiNTNfZGV2aWNlICpkZXY7CisJc3RydWN0IGRzYV9zd2l0Y2ggKmRzOworCXZvaWQgX19pb21lbSAqKmJhc2U7CisJc3RydWN0IHJlc291cmNlICpyOwogCXVuc2lnbmVkIGludCBpOwogCXUzMiByZWcsIHJldjsKIAlpbnQgcmV0OwogCisJcHJpdiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2ID0gYjUzX3N3aXRjaF9hbGxvYygmcGRldi0+ZGV2LCAmYmNtX3NmMl9pb19vcHMsIHByaXYpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEF1dG8tZGV0ZWN0aW9uIHVzaW5nIHN0YW5kYXJkIHJlZ2lzdGVycyB3aWxsIG5vdCB3b3JrLCBzbworCSAqIHByb3ZpZGUgYW4gaW5kaWNhdGlvbiBvZiB3aGF0IGtpbmQgb2YgZGV2aWNlIHdlIGFyZSBmb3IKKwkgKiBiNTNfY29tbW9uIHRvIHdvcmsgd2l0aAorCSAqLworCXBkYXRhLT5jaGlwX2lkID0gQkNNNzQ0NV9ERVZJQ0VfSUQ7CisJZGV2LT5wZGF0YSA9IHBkYXRhOworCisJcHJpdi0+ZGV2ID0gZGV2OworCWRzID0gZGV2LT5kczsKKworCS8qIE92ZXJyaWRlIHRoZSBwYXJ0cyB0aGF0IGFyZSBub24tc3RhbmRhcmQgd3J0LiBub3JtYWwgYjUzIGRldmljZXMgKi8KKwlkcy0+b3BzLT5nZXRfdGFnX3Byb3RvY29sID0gYmNtX3NmMl9zd19nZXRfdGFnX3Byb3RvY29sOworCWRzLT5vcHMtPnNldHVwID0gYmNtX3NmMl9zd19zZXR1cDsKKwlkcy0+b3BzLT5nZXRfcGh5X2ZsYWdzID0gYmNtX3NmMl9zd19nZXRfcGh5X2ZsYWdzOworCWRzLT5vcHMtPmFkanVzdF9saW5rID0gYmNtX3NmMl9zd19hZGp1c3RfbGluazsKKwlkcy0+b3BzLT5maXhlZF9saW5rX3VwZGF0ZSA9IGJjbV9zZjJfc3dfZml4ZWRfbGlua191cGRhdGU7CisJZHMtPm9wcy0+c3VzcGVuZCA9IGJjbV9zZjJfc3dfc3VzcGVuZDsKKwlkcy0+b3BzLT5yZXN1bWUgPSBiY21fc2YyX3N3X3Jlc3VtZTsKKwlkcy0+b3BzLT5nZXRfd29sID0gYmNtX3NmMl9zd19nZXRfd29sOworCWRzLT5vcHMtPnNldF93b2wgPSBiY21fc2YyX3N3X3NldF93b2w7CisJZHMtPm9wcy0+cG9ydF9lbmFibGUgPSBiY21fc2YyX3BvcnRfc2V0dXA7CisJZHMtPm9wcy0+cG9ydF9kaXNhYmxlID0gYmNtX3NmMl9wb3J0X2Rpc2FibGU7CisJZHMtPm9wcy0+Z2V0X2VlZSA9IGJjbV9zZjJfc3dfZ2V0X2VlZTsKKwlkcy0+b3BzLT5zZXRfZWVlID0gYmNtX3NmMl9zd19zZXRfZWVlOworCisJLyogQXZvaWQgaGF2aW5nIERTQSBmcmVlIG91ciBzbGF2ZSBNRElPIGJ1cyAoY2hlY2tpbmcgZm9yCisJICogZHMtPnNsYXZlX21paV9idXMgYW5kIGRzLT5vcHMtPnBoeV9yZWFkIGJlaW5nIG5vbi1OVUxMKQorCSAqLworCWRzLT5vcHMtPnBoeV9yZWFkID0gTlVMTDsKKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBwcml2KTsKKwogCXNwaW5fbG9ja19pbml0KCZwcml2LT5pbmRpcl9sb2NrKTsKIAltdXRleF9pbml0KCZwcml2LT5zdGF0c19tdXRleCk7CiAKLQkvKiBBbGwgdGhlIGludGVyZXN0aW5nIHByb3BlcnRpZXMgYXJlIGF0IHRoZSBwYXJlbnQgZGV2aWNlX25vZGUKLQkgKiBsZXZlbAotCSAqLwotCWRuID0gZHMtPmNkLT5vZl9ub2RlLT5wYXJlbnQ7Ci0JYmNtX3NmMl9pZGVudGlmeV9wb3J0cyhwcml2LCBkcy0+Y2QtPm9mX25vZGUpOworCWJjbV9zZjJfaWRlbnRpZnlfcG9ydHMocHJpdiwgZG4tPmNoaWxkKTsKIAogCXByaXYtPmlycTAgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChkbiwgMCk7CiAJcHJpdi0+aXJxMSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGRuLCAxKTsKIAogCWJhc2UgPSAmcHJpdi0+Y29yZTsKIAlmb3IgKGkgPSAwOyBpIDwgQkNNX1NGMl9SRUdTX05VTTsgaSsrKSB7Ci0JCSpiYXNlID0gb2ZfaW9tYXAoZG4sIGkpOwotCQlpZiAoKmJhc2UgPT0gTlVMTCkgeworCQlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCBpKTsKKwkJKmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcik7CisJCWlmIChJU19FUlIoKmJhc2UpKSB7CiAJCQlwcl9lcnIoInVuYWJsZSB0byBmaW5kIHJlZ2lzdGVyOiAlc1xuIiwgcmVnX25hbWVzW2ldKTsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dF91bm1hcDsKKwkJCXJldHVybiBQVFJfRVJSKCpiYXNlKTsKIAkJfQogCQliYXNlKys7CiAJfQpAQCAtMTYwNiwzMCArMTA1MywzMCBAQAogCXJldCA9IGJjbV9zZjJfc3dfcnN0KHByaXYpOwogCWlmIChyZXQpIHsKIAkJcHJfZXJyKCJ1bmFibGUgdG8gc29mdHdhcmUgcmVzZXQgc3dpdGNoOiAlZFxuIiwgcmV0KTsKLQkJZ290byBvdXRfdW5tYXA7CisJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0ID0gYmNtX3NmMl9tZGlvX3JlZ2lzdGVyKGRzKTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIE1ESU8gYnVzXG4iKTsKLQkJZ290byBvdXRfdW5tYXA7CisJCXJldHVybiByZXQ7CiAJfQogCiAJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyBhbmQgcmVxdWVzdCB0aGVtICovCiAJYmNtX3NmMl9pbnRyX2Rpc2FibGUocHJpdik7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShwcml2LT5pcnEwLCBiY21fc2YyX3N3aXRjaF8wX2lzciwgMCwKLQkJCSAgInN3aXRjaF8wIiwgcHJpdik7CisJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBwcml2LT5pcnEwLCBiY21fc2YyX3N3aXRjaF8wX2lzciwgMCwKKwkJCSAgICAgICAic3dpdGNoXzAiLCBwcml2KTsKIAlpZiAocmV0IDwgMCkgewogCQlwcl9lcnIoImZhaWxlZCB0byByZXF1ZXN0IHN3aXRjaF8wIElSUVxuIik7CiAJCWdvdG8gb3V0X21kaW87CiAJfQogCi0JcmV0ID0gcmVxdWVzdF9pcnEocHJpdi0+aXJxMSwgYmNtX3NmMl9zd2l0Y2hfMV9pc3IsIDAsCi0JCQkgICJzd2l0Y2hfMSIsIHByaXYpOworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgcHJpdi0+aXJxMSwgYmNtX3NmMl9zd2l0Y2hfMV9pc3IsIDAsCisJCQkgICAgICAgInN3aXRjaF8xIiwgcHJpdik7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJfZXJyKCJmYWlsZWQgdG8gcmVxdWVzdCBzd2l0Y2hfMSBJUlFcbiIpOwotCQlnb3RvIG91dF9mcmVlX2lycTA7CisJCWdvdG8gb3V0X21kaW87CiAJfQogCiAJLyogUmVzZXQgdGhlIE1JQiBjb3VudGVycyAqLwpAQCAtMTY0OSwxOSArMTA5Niw2IEBACiAJCQkJICZwcml2LT5od19wYXJhbXMubnVtX2dwaHkpKQogCQlwcml2LT5od19wYXJhbXMubnVtX2dwaHkgPSAxOwogCi0JLyogRW5hYmxlIGFsbCB2YWxpZCBwb3J0cyBhbmQgZGlzYWJsZSB0aG9zZSB1bnVzZWQgKi8KLQlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgcHJpdi0+aHdfcGFyYW1zLm51bV9wb3J0czsgcG9ydCsrKSB7Ci0JCS8qIElNUCBwb3J0IHJlY2VpdmVzIHNwZWNpYWwgdHJlYXRtZW50ICovCi0JCWlmICgoMSA8PCBwb3J0KSAmIGRzLT5lbmFibGVkX3BvcnRfbWFzaykKLQkJCWJjbV9zZjJfcG9ydF9zZXR1cChkcywgcG9ydCwgTlVMTCk7Ci0JCWVsc2UgaWYgKGRzYV9pc19jcHVfcG9ydChkcywgcG9ydCkpCi0JCQliY21fc2YyX2ltcF9zZXR1cChkcywgcG9ydCk7Ci0JCWVsc2UKLQkJCWJjbV9zZjJfcG9ydF9kaXNhYmxlKGRzLCBwb3J0LCBOVUxMKTsKLQl9Ci0KLQliY21fc2YyX3N3X2NvbmZpZ3VyZV92bGFuKGRzKTsKLQogCXJldiA9IHJlZ19yZWFkbChwcml2LCBSRUdfU1dJVENIX1JFVklTSU9OKTsKIAlwcml2LT5od19wYXJhbXMudG9wX3JldiA9IChyZXYgPj4gU1dJVENIX1RPUF9SRVZfU0hJRlQpICYKIAkJCQkJU1dJVENIX1RPUF9SRVZfTUFTSzsKQEAgLTE2NzAsNiArMTEwNCwxMCBAQAogCXJldiA9IHJlZ19yZWFkbChwcml2LCBSRUdfUEhZX1JFVklTSU9OKTsKIAlwcml2LT5od19wYXJhbXMuZ3BoeV9yZXYgPSByZXYgJiBQSFlfUkVWSVNJT05fTUFTSzsKIAorCXJldCA9IGI1M19zd2l0Y2hfcmVnaXN0ZXIoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9tZGlvOworCiAJcHJfaW5mbygiU3RhcmZpZ2h0ZXIgMiB0b3A6ICV4LiUwMngsIGNvcmU6ICV4LiUwMnggYmFzZTogMHglcCwgSVJRczogJWQsICVkXG4iLAogCQlwcml2LT5od19wYXJhbXMudG9wX3JldiA+PiA4LCBwcml2LT5od19wYXJhbXMudG9wX3JldiAmIDB4ZmYsCiAJCXByaXYtPmh3X3BhcmFtcy5jb3JlX3JldiA+PiA4LCBwcml2LT5od19wYXJhbXMuY29yZV9yZXYgJiAweGZmLApAQCAtMTY3Nyw2NiArMTExNSw2MCBAQAogCiAJcmV0dXJuIDA7CiAKLW91dF9mcmVlX2lycTA6Ci0JZnJlZV9pcnEocHJpdi0+aXJxMCwgcHJpdik7CiBvdXRfbWRpbzoKIAliY21fc2YyX21kaW9fdW5yZWdpc3Rlcihwcml2KTsKLW91dF91bm1hcDoKLQliYXNlID0gJnByaXYtPmNvcmU7Ci0JZm9yIChpID0gMDsgaSA8IEJDTV9TRjJfUkVHU19OVU07IGkrKykgewotCQlpZiAoKmJhc2UpCi0JCQlpb3VubWFwKCpiYXNlKTsKLQkJYmFzZSsrOwotCX0KIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyIGJjbV9zZjJfc3dpdGNoX2RyaXZlciA9IHsKLQkudGFnX3Byb3RvY29sCQk9IERTQV9UQUdfUFJPVE9fQlJDTSwKLQkucHJvYmUJCQk9IGJjbV9zZjJfc3dfZHJ2X3Byb2JlLAotCS5zZXR1cAkJCT0gYmNtX3NmMl9zd19zZXR1cCwKLQkuc2V0X2FkZHIJCT0gYmNtX3NmMl9zd19zZXRfYWRkciwKLQkuZ2V0X3BoeV9mbGFncwkJPSBiY21fc2YyX3N3X2dldF9waHlfZmxhZ3MsCi0JLmdldF9zdHJpbmdzCQk9IGJjbV9zZjJfc3dfZ2V0X3N0cmluZ3MsCi0JLmdldF9ldGh0b29sX3N0YXRzCT0gYmNtX3NmMl9zd19nZXRfZXRodG9vbF9zdGF0cywKLQkuZ2V0X3NzZXRfY291bnQJCT0gYmNtX3NmMl9zd19nZXRfc3NldF9jb3VudCwKLQkuYWRqdXN0X2xpbmsJCT0gYmNtX3NmMl9zd19hZGp1c3RfbGluaywKLQkuZml4ZWRfbGlua191cGRhdGUJPSBiY21fc2YyX3N3X2ZpeGVkX2xpbmtfdXBkYXRlLAotCS5zdXNwZW5kCQk9IGJjbV9zZjJfc3dfc3VzcGVuZCwKLQkucmVzdW1lCQkJPSBiY21fc2YyX3N3X3Jlc3VtZSwKLQkuZ2V0X3dvbAkJPSBiY21fc2YyX3N3X2dldF93b2wsCi0JLnNldF93b2wJCT0gYmNtX3NmMl9zd19zZXRfd29sLAotCS5wb3J0X2VuYWJsZQkJPSBiY21fc2YyX3BvcnRfc2V0dXAsCi0JLnBvcnRfZGlzYWJsZQkJPSBiY21fc2YyX3BvcnRfZGlzYWJsZSwKLQkuZ2V0X2VlZQkJPSBiY21fc2YyX3N3X2dldF9lZWUsCi0JLnNldF9lZWUJCT0gYmNtX3NmMl9zd19zZXRfZWVlLAotCS5wb3J0X2JyaWRnZV9qb2luCT0gYmNtX3NmMl9zd19icl9qb2luLAotCS5wb3J0X2JyaWRnZV9sZWF2ZQk9IGJjbV9zZjJfc3dfYnJfbGVhdmUsCi0JLnBvcnRfc3RwX3N0YXRlX3NldAk9IGJjbV9zZjJfc3dfYnJfc2V0X3N0cF9zdGF0ZSwKLQkucG9ydF9mZGJfcHJlcGFyZQk9IGJjbV9zZjJfc3dfZmRiX3ByZXBhcmUsCi0JLnBvcnRfZmRiX2FkZAkJPSBiY21fc2YyX3N3X2ZkYl9hZGQsCi0JLnBvcnRfZmRiX2RlbAkJPSBiY21fc2YyX3N3X2ZkYl9kZWwsCi0JLnBvcnRfZmRiX2R1bXAJCT0gYmNtX3NmMl9zd19mZGJfZHVtcCwKLQkucG9ydF92bGFuX2ZpbHRlcmluZwk9IGJjbV9zZjJfc3dfdmxhbl9maWx0ZXJpbmcsCi0JLnBvcnRfdmxhbl9wcmVwYXJlCT0gYmNtX3NmMl9zd192bGFuX3ByZXBhcmUsCi0JLnBvcnRfdmxhbl9hZGQJCT0gYmNtX3NmMl9zd192bGFuX2FkZCwKLQkucG9ydF92bGFuX2RlbAkJPSBiY21fc2YyX3N3X3ZsYW5fZGVsLAotCS5wb3J0X3ZsYW5fZHVtcAkJPSBiY21fc2YyX3N3X3ZsYW5fZHVtcCwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJjbV9zZjJfaW5pdCh2b2lkKQorc3RhdGljIGludCBiY21fc2YyX3N3X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoJmJjbV9zZjJfc3dpdGNoX2RyaXZlcik7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJLyogRGlzYWJsZSBhbGwgcG9ydHMgYW5kIGludGVycnVwdHMgKi8KKwlwcml2LT53b2xfcG9ydHNfbWFzayA9IDA7CisJYmNtX3NmMl9zd19zdXNwZW5kKHByaXYtPmRldi0+ZHMpOworCWRzYV91bnJlZ2lzdGVyX3N3aXRjaChwcml2LT5kZXYtPmRzKTsKKwliY21fc2YyX21kaW9fdW5yZWdpc3Rlcihwcml2KTsKIAogCXJldHVybiAwOwogfQotbW9kdWxlX2luaXQoYmNtX3NmMl9pbml0KTsKIAotc3RhdGljIHZvaWQgX19leGl0IGJjbV9zZjJfZXhpdCh2b2lkKQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBiY21fc2YyX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCXVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigmYmNtX3NmMl9zd2l0Y2hfZHJpdmVyKTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcmV0dXJuIGRzYV9zd2l0Y2hfc3VzcGVuZChwcml2LT5kZXYtPmRzKTsKIH0KLW1vZHVsZV9leGl0KGJjbV9zZjJfZXhpdCk7CisKK3N0YXRpYyBpbnQgYmNtX3NmMl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyZXR1cm4gZHNhX3N3aXRjaF9yZXN1bWUocHJpdi0+ZGV2LT5kcyk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhiY21fc2YyX3BtX29wcywKKwkJCSBiY21fc2YyX3N1c3BlbmQsIGJjbV9zZjJfcmVzdW1lKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYmNtX3NmMl9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYnJjbSxiY203NDQ1LXN3aXRjaC12NC4wIiB9LAorCXsgLyogc2VudGluZWwgKi8gfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJjbV9zZjJfZHJpdmVyID0geworCS5wcm9iZQk9IGJjbV9zZjJfc3dfcHJvYmUsCisJLnJlbW92ZQk9IGJjbV9zZjJfc3dfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImJyY20tc2YyIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gYmNtX3NmMl9vZl9tYXRjaCwKKwkJLnBtID0gJmJjbV9zZjJfcG1fb3BzLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihiY21fc2YyX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIkJyb2FkY29tIENvcnBvcmF0aW9uIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgQnJvYWRjb20gU3RhcmZpZ2h0ZXIgMiBldGhlcm5ldCBzd2l0Y2ggY2hpcCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL2JjbV9zZjIuaCBiL2RyaXZlcnMvbmV0L2RzYS9iY21fc2YyLmgKaW5kZXggNDYzYmVkOC4uNDQ2OTI2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL2JjbV9zZjIuaAorKysgYi9kcml2ZXJzL25ldC9kc2EvYmNtX3NmMi5oCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bmV0L2RzYS5oPgogCiAjaW5jbHVkZSAiYmNtX3NmMl9yZWdzLmgiCisjaW5jbHVkZSAiYjUzL2I1M19wcml2LmgiCiAKIHN0cnVjdCBiY21fc2YyX2h3X3BhcmFtcyB7CiAJdTE2CXRvcF9yZXY7CkBAIC00OSw3MiArNTAsOCBAQAogCXVuc2lnbmVkIGludCBsaW5rOwogCiAJc3RydWN0IGV0aHRvb2xfZWVlIGVlZTsKLQotCXUzMiB2bGFuX2N0bF9tYXNrOwotCXUxNiBwdmlkOwotCi0Jc3RydWN0IG5ldF9kZXZpY2UgKmJyaWRnZV9kZXY7CiB9OwogCi1zdHJ1Y3QgYmNtX3NmMl9hcmxfZW50cnkgewotCXU4IHBvcnQ7Ci0JdTggbWFjW0VUSF9BTEVOXTsKLQl1MTYgdmlkOwotCXU4IGlzX3ZhbGlkOjE7Ci0JdTggaXNfYWdlOjE7Ci0JdTggaXNfc3RhdGljOjE7Ci19OwotCi1zdHJ1Y3QgYmNtX3NmMl92bGFuIHsKLQl1MTYgbWVtYmVyczsKLQl1MTYgdW50YWc7Ci19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgYmNtX3NmMl9tYWNfZnJvbV91NjQodTY0IHNyYywgdTggKmRzdCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQotCQlkc3RbRVRIX0FMRU4gLSAxIC0gaV0gPSAoc3JjID4+ICg4ICogaSkpICYgMHhmZjsKLX0KLQotc3RhdGljIGlubGluZSB1NjQgYmNtX3NmMl9tYWNfdG9fdTY0KGNvbnN0IHU4ICpzcmMpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JdTY0IGRzdCA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKLQkJZHN0IHw9ICh1NjQpc3JjW0VUSF9BTEVOIC0gMSAtIGldIDw8ICg4ICogaSk7Ci0KLQlyZXR1cm4gZHN0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYmNtX3NmMl9hcmxfdG9fZW50cnkoc3RydWN0IGJjbV9zZjJfYXJsX2VudHJ5ICplbnQsCi0JCQkJCXU2NCBtYWNfdmlkLCB1MzIgZndkX2VudHJ5KQotewotCW1lbXNldChlbnQsIDAsIHNpemVvZigqZW50KSk7Ci0JZW50LT5wb3J0ID0gZndkX2VudHJ5ICYgUE9SVElEX01BU0s7Ci0JZW50LT5pc192YWxpZCA9ICEhKGZ3ZF9lbnRyeSAmIEFSTF9WQUxJRCk7Ci0JZW50LT5pc19hZ2UgPSAhIShmd2RfZW50cnkgJiBBUkxfQUdFKTsKLQllbnQtPmlzX3N0YXRpYyA9ICEhKGZ3ZF9lbnRyeSAmIEFSTF9TVEFUSUMpOwotCWJjbV9zZjJfbWFjX2Zyb21fdTY0KG1hY192aWQsIGVudC0+bWFjKTsKLQllbnQtPnZpZCA9IG1hY192aWQgPj4gVklEX1NISUZUOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYmNtX3NmMl9hcmxfZnJvbV9lbnRyeSh1NjQgKm1hY192aWQsIHUzMiAqZndkX2VudHJ5LAotCQkJCQkgIGNvbnN0IHN0cnVjdCBiY21fc2YyX2FybF9lbnRyeSAqZW50KQotewotCSptYWNfdmlkID0gYmNtX3NmMl9tYWNfdG9fdTY0KGVudC0+bWFjKTsKLQkqbWFjX3ZpZCB8PSAodTY0KShlbnQtPnZpZCAmIFZJRF9NQVNLKSA8PCBWSURfU0hJRlQ7Ci0JKmZ3ZF9lbnRyeSA9IGVudC0+cG9ydCAmIFBPUlRJRF9NQVNLOwotCWlmIChlbnQtPmlzX3ZhbGlkKQotCQkqZndkX2VudHJ5IHw9IEFSTF9WQUxJRDsKLQlpZiAoZW50LT5pc19zdGF0aWMpCi0JCSpmd2RfZW50cnkgfD0gQVJMX1NUQVRJQzsKLQlpZiAoZW50LT5pc19hZ2UpCi0JCSpmd2RfZW50cnkgfD0gQVJMX0FHRTsKLX0KLQogc3RydWN0IGJjbV9zZjJfcHJpdiB7CiAJLyogQmFzZSByZWdpc3RlcnMsIGtlZXAgdGhvc2UgaW4gb3JkZXIgd2l0aCBCQ01fU0YyX1JFR1NfTkFNRSAqLwogCXZvaWQgX19pb21lbQkJCSpjb3JlOwpAQCAtMTM0LDYgKzcxLDkgQEAKIAl1MzIJCQkJaXJxMV9zdGF0OwogCXUzMgkJCQlpcnExX21hc2s7CiAKKwkvKiBCYWNraW5nIGI1M19kZXZpY2UgKi8KKwlzdHJ1Y3QgYjUzX2RldmljZQkJKmRldjsKKwogCS8qIE11dGV4IHByb3RlY3RpbmcgYWNjZXNzIHRvIHRoZSBNSUIgY291bnRlcnMgKi8KIAlzdHJ1Y3QgbXV0ZXgJCQlzdGF0c19tdXRleDsKIApAQCAtMTU1LDE2ICs5NSwxNCBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZQkJKm1hc3Rlcl9taWlfZG47CiAJc3RydWN0IG1paV9idXMJCQkqc2xhdmVfbWlpX2J1czsKIAlzdHJ1Y3QgbWlpX2J1cwkJCSptYXN0ZXJfbWlpX2J1czsKLQotCS8qIENhY2hlIG9mIHByb2dyYW1tZWQgVkxBTnMgKi8KLQlzdHJ1Y3QgYmNtX3NmMl92bGFuCQl2bGFuc1tWTEFOX05fVklEXTsKIH07CiAKLXN0cnVjdCBiY21fc2YyX2h3X3N0YXRzIHsKLQljb25zdCBjaGFyCSpzdHJpbmc7Ci0JdTE2CQlyZWc7Ci0JdTgJCXNpemVvZl9zdGF0OwotfTsKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJjbV9zZjJfcHJpdiAqYmNtX3NmMl90b19wcml2KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHMtPnByaXY7CisKKwlyZXR1cm4gZGV2LT5wcml2OworfQogCiAjZGVmaW5lIFNGMl9JT19NQUNSTyhuYW1lKSBcCiBzdGF0aWMgaW5saW5lIHUzMiBuYW1lIyNfcmVhZGwoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiwgdTMyIG9mZikJXApAQCAtMjA1LDggKzE0Myw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaW50cmwyXyMjd2hpY2gjI19tYXNrX2NsZWFyKHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYsIFwKIAkJCQkJCXUzMiBtYXNrKQkJXAogewkJCQkJCQkJCVwKLQlpbnRybDJfIyN3aGljaCMjX3dyaXRlbChwcml2LCBtYXNrLCBJTlRSTDJfQ1BVX01BU0tfQ0xFQVIpOwlcCiAJcHJpdi0+aXJxIyN3aGljaCMjX21hc2sgJj0gfihtYXNrKTsJCQkJXAorCWludHJsMl8jI3doaWNoIyNfd3JpdGVsKHByaXYsIG1hc2ssIElOVFJMMl9DUFVfTUFTS19DTEVBUik7CVwKIH0JCQkJCQkJCQlcCiBzdGF0aWMgaW5saW5lIHZvaWQgaW50cmwyXyMjd2hpY2gjI19tYXNrX3NldChzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2LCBcCiAJCQkJCQl1MzIgbWFzaykJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9iY21fc2YyX3JlZ3MuaCBiL2RyaXZlcnMvbmV0L2RzYS9iY21fc2YyX3JlZ3MuaAppbmRleCA5ZjJhOWNiLi44MzhmZTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvYmNtX3NmMl9yZWdzLmgKKysrIGIvZHJpdmVycy9uZXQvZHNhL2JjbV9zZjJfcmVncy5oCkBAIC0xMTUsMTQgKzExNSw2IEBACiAjZGVmaW5lICBSWF9CQ1NUX0VOCQkJKDEgPDwgMikKICNkZWZpbmUgIFJYX01DU1RfRU4JCQkoMSA8PCAzKQogI2RlZmluZSAgUlhfVUNTVF9FTgkJCSgxIDw8IDQpCi0jZGVmaW5lICBHX01JU1RQX1NUQVRFX1NISUZUCQk1Ci0jZGVmaW5lICBHX01JU1RQX05PX1NUUAkJCSgwIDw8IEdfTUlTVFBfU1RBVEVfU0hJRlQpCi0jZGVmaW5lICBHX01JU1RQX0RJU19TVEFURQkJKDEgPDwgR19NSVNUUF9TVEFURV9TSElGVCkKLSNkZWZpbmUgIEdfTUlTVFBfQkxPQ0tfU1RBVEUJCSgyIDw8IEdfTUlTVFBfU1RBVEVfU0hJRlQpCi0jZGVmaW5lICBHX01JU1RQX0xJU1RFTl9TVEFURQkJKDMgPDwgR19NSVNUUF9TVEFURV9TSElGVCkKLSNkZWZpbmUgIEdfTUlTVFBfTEVBUk5fU1RBVEUJCSg0IDw8IEdfTUlTVFBfU1RBVEVfU0hJRlQpCi0jZGVmaW5lICBHX01JU1RQX0ZXRF9TVEFURQkJKDUgPDwgR19NSVNUUF9TVEFURV9TSElGVCkKLSNkZWZpbmUgIEdfTUlTVFBfU1RBVEVfTUFTSwkJMHg3CiAKICNkZWZpbmUgQ09SRV9TV01PREUJCQkweDAwMDJjCiAjZGVmaW5lICBTV19GV0RHX01PREUJCQkoMSA8PCAwKQpAQCAtMjA1LDc1ICsxOTcsMTEgQEAKICNkZWZpbmUgIEJSQ01fSERSX0VOX1A1CQkJKDEgPDwgMSkKICNkZWZpbmUgIEJSQ01fSERSX0VOX1A3CQkJKDEgPDwgMikKIAotI2RlZmluZSBDT1JFX0JSQ01fSERSX0NUUkwyCQkweDA4MjgKLQotI2RlZmluZSBDT1JFX0hMX1BSVENfQ1RSTAkJMHgwOTQwCi0jZGVmaW5lICBBUlBfRU4JCQkJKDEgPDwgMCkKLSNkZWZpbmUgIFJBUlBfRU4JCQkoMSA8PCAxKQotI2RlZmluZSAgREhDUF9FTgkJCSgxIDw8IDIpCi0jZGVmaW5lICBJQ01QVjRfRU4JCQkoMSA8PCAzKQotI2RlZmluZSAgSUNNUFY2X0VOCQkJKDEgPDwgNCkKLSNkZWZpbmUgIElDTVBWNl9GV0RfTU9ERQkJKDEgPDwgNSkKLSNkZWZpbmUgIElHTVBfRElQX0VOCQkJKDEgPDwgOCkKLSNkZWZpbmUgIElHTVBfUlBUTFZFX0VOCQkJKDEgPDwgOSkKLSNkZWZpbmUgIElHTVBfUlRQTFZFX0ZXRF9NT0RFCQkoMSA8PCAxMCkKLSNkZWZpbmUgIElHTVBfUVJZX0VOCQkJKDEgPDwgMTEpCi0jZGVmaW5lICBJR01QX1FSWV9GV0RfTU9ERQkJKDEgPDwgMTIpCi0jZGVmaW5lICBJR01QX1VLTl9FTgkJCSgxIDw8IDEzKQotI2RlZmluZSAgSUdNUF9VS05fRldEX01PREUJCSgxIDw8IDE0KQotI2RlZmluZSAgTUxEX1JQVERPTkVfRU4JCQkoMSA8PCAxNSkKLSNkZWZpbmUgIE1MRF9SUFRET05FX0ZXRF9NT0RFCQkoMSA8PCAxNikKLSNkZWZpbmUgIE1MRF9RUllfRU4JCQkoMSA8PCAxNykKLSNkZWZpbmUgIE1MRF9RUllfRldEX01PREUJCSgxIDw8IDE4KQotCiAjZGVmaW5lIENPUkVfUlNUX01JQl9DTlRfRU4JCTB4MDk1MAogCiAjZGVmaW5lIENPUkVfQlJDTV9IRFJfUlhfRElTCQkweDA5ODAKICNkZWZpbmUgQ09SRV9CUkNNX0hEUl9UWF9ESVMJCTB4MDk4OAogCi0jZGVmaW5lIENPUkVfQVJMQV9OVU1fRU5UUklFUwkJMTAyNAotCi0jZGVmaW5lIENPUkVfQVJMQV9SV0NUTAkJCTB4MTQwMAotI2RlZmluZSAgQVJMX1JXCQkJCSgxIDw8IDApCi0jZGVmaW5lICBJVkxfU1ZMX1NFTEVDVAkJCSgxIDw8IDYpCi0jZGVmaW5lICBBUkxfU1RSVEROCQkJKDEgPDwgNykKLQotI2RlZmluZSBDT1JFX0FSTEFfTUFDCQkJMHgxNDA4Ci0jZGVmaW5lIENPUkVfQVJMQV9WSUQJCQkweDE0MjAKLSNkZWZpbmUgIEFSTEFfVklEVEFCX0lORFhfTUFTSwkJMHgxZmZmCi0KLSNkZWZpbmUgQ09SRV9BUkxBX01BQ1ZJRDAJCTB4MTQ0MAotI2RlZmluZSAgTUFDX01BU0sJCQkweGZmZmZmZmZmZmYKLSNkZWZpbmUgIFZJRF9TSElGVAkJCTQ4Ci0jZGVmaW5lICBWSURfTUFTSwkJCTB4ZmZmCi0KLSNkZWZpbmUgQ09SRV9BUkxBX0ZXRF9FTlRSWTAJCTB4MTQ2MAotI2RlZmluZSAgUE9SVElEX01BU0sJCQkweDFmZgotI2RlZmluZSAgQVJMX0NPTl9TSElGVAkJCTkKLSNkZWZpbmUgIEFSTF9DT05fTUFTSwkJCTB4MwotI2RlZmluZSAgQVJMX1BSSV9TSElGVAkJCTExCi0jZGVmaW5lICBBUkxfUFJJX01BU0sJCQkweDcKLSNkZWZpbmUgIEFSTF9BR0UJCQkoMSA8PCAxNCkKLSNkZWZpbmUgIEFSTF9TVEFUSUMJCQkoMSA8PCAxNSkKLSNkZWZpbmUgIEFSTF9WQUxJRAkJCSgxIDw8IDE2KQotCi0jZGVmaW5lIENPUkVfQVJMQV9NQUNWSURfRU5UUlkoeCkJKENPUkVfQVJMQV9NQUNWSUQwICsgKCh4KSAqIDB4NDApKQotI2RlZmluZSBDT1JFX0FSTEFfRldEX0VOVFJZKHgpCQkoQ09SRV9BUkxBX0ZXRF9FTlRSWTAgKyAoKHgpICogMHg0MCkpCi0KLSNkZWZpbmUgQ09SRV9BUkxBX1NSQ0hfQ1RMCQkweDE1NDAKLSNkZWZpbmUgIEFSTEFfU1JDSF9WTElECQkJKDEgPDwgMCkKLSNkZWZpbmUgIElWTF9TVkxfU0VMRUNUCQkJKDEgPDwgNikKLSNkZWZpbmUgIEFSTEFfU1JDSF9TVEROCQkJKDEgPDwgNykKLQotI2RlZmluZSBDT1JFX0FSTEFfU1JDSF9BRFIJCTB4MTU0NAotI2RlZmluZSAgQVJMQV9TUkNIX0FEUl9WQUxJRAkJKDEgPDwgMTUpCi0KLSNkZWZpbmUgQ09SRV9BUkxBX1NSQ0hfUlNMVF8wX01BQ1ZJRAkweDE1ODAKLSNkZWZpbmUgQ09SRV9BUkxBX1NSQ0hfUlNMVF8wCQkweDE1YTAKLQotI2RlZmluZSBDT1JFX0FSTEFfU1JDSF9SU0xUX01BQ1ZJRCh4KQkoQ09SRV9BUkxBX1NSQ0hfUlNMVF8wX01BQ1ZJRCArICgoeCkgKiAweDQwKSkKLSNkZWZpbmUgQ09SRV9BUkxBX1NSQ0hfUlNMVCh4KQkJKENPUkVfQVJMQV9TUkNIX1JTTFRfMCArICgoeCkgKiAweDQwKSkKLQogI2RlZmluZSBDT1JFX0FSTEFfVlRCTF9SV0NUUkwJCTB4MTYwMAogI2RlZmluZSAgQVJMQV9WVEJMX0NNRF9XUklURQkJMAogI2RlZmluZSAgQVJMQV9WVEJMX0NNRF9SRUFECQkxCkBAIC0yOTcsNTkgKzIyNSw5IEBACiAjZGVmaW5lICBQX1RYUV9QU01fVkREKHgpCQkoUF9UWFFfUFNNX1ZERF9NQVNLIDw8IFwKIAkJCQkJKCh4KSAqIFBfVFhRX1BTTV9WRERfU0hJRlQpKQogCi0jZGVmaW5lCUNPUkVfUDBfTUlCX09GRlNFVAkJMHg4MDAwCi0jZGVmaW5lIFBfTUlCX1NJWkUJCQkweDQwMAotI2RlZmluZSBDT1JFX1BfTUlCX09GRlNFVCh4KQkJKENPUkVfUDBfTUlCX09GRlNFVCArICh4KSAqIFBfTUlCX1NJWkUpCi0KICNkZWZpbmUgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQoeCkJKDB4YzQwMCArICgoeCkgKiAweDgpKQogI2RlZmluZSAgUE9SVF9WTEFOX0NUUkxfTUFTSwkJMHgxZmYKIAotI2RlZmluZSBDT1JFX1ZMQU5fQ1RSTDAJCQkweGQwMDAKLSNkZWZpbmUgIENIQU5HRV8xUF9WSURfSU5ORVIJCSgxIDw8IDApCi0jZGVmaW5lICBDSEFOR0VfMVBfVklEX09VVEVSCQkoMSA8PCAxKQotI2RlZmluZSAgQ0hBTkdFXzFRX1ZJRAkJCSgxIDw8IDMpCi0jZGVmaW5lICBWTEFOX0xFQVJOX01PREVfU1ZMCQkoMCA8PCA1KQotI2RlZmluZSAgVkxBTl9MRUFSTl9NT0RFX0lWTAkJKDMgPDwgNSkKLSNkZWZpbmUgIFZMQU5fRU4JCQkoMSA8PCA3KQotCi0jZGVmaW5lIENPUkVfVkxBTl9DVFJMMQkJCTB4ZDAwNAotI2RlZmluZSAgRU5fUlNWX01DQVNUX0ZXRE1BUAkJKDEgPDwgMikKLSNkZWZpbmUgIEVOX1JTVl9NQ0FTVF9VTlRBRwkJKDEgPDwgMykKLSNkZWZpbmUgIEVOX0lQTUNfQllQQVNTX0ZXRE1BUAkJKDEgPDwgNSkKLSNkZWZpbmUgIEVOX0lQTUNfQllQQVNTX1VOVEFHCQkoMSA8PCA2KQotCi0jZGVmaW5lIENPUkVfVkxBTl9DVFJMMgkJCTB4ZDAwOAotI2RlZmluZSAgRU5fTUlJTV9CWVBBU1NfVl9GV0RNQVAJKDEgPDwgMikKLSNkZWZpbmUgIEVOX0dNUlBfR1ZSUF9WX0ZXRE1BUAkJKDEgPDwgNSkKLSNkZWZpbmUgIEVOX0dNUlBfR1ZSUF9VTlRBR19NQVAJCSgxIDw8IDYpCi0KLSNkZWZpbmUgQ09SRV9WTEFOX0NUUkwzCQkJMHhkMDBjCi0jZGVmaW5lICBFTl9EUk9QX05PTjFRX01BU0sJCTB4MWZmCi0KLSNkZWZpbmUgQ09SRV9WTEFOX0NUUkw0CQkJMHhkMDE0Ci0jZGVmaW5lICBSRVNWX01DQVNUX0ZMT09ECQkoMSA8PCAxKQotI2RlZmluZSAgRU5fRE9VQkxFX1RBR19NQVNLCQkweDMKLSNkZWZpbmUgIEVOX0RPVUJMRV9UQUdfU0hJRlQJCTIKLSNkZWZpbmUgIEVOX01HRV9SRVZfR01SUAkJKDEgPDwgNCkKLSNkZWZpbmUgIEVOX01HRV9SRVZfR1ZSUAkJKDEgPDwgNSkKLSNkZWZpbmUgIElOR1JfVklEX0NIS19TSElGVAkJNgotI2RlZmluZSAgSU5HUl9WSURfQ0hLX01BU0sJCTB4MwotI2RlZmluZSAgSU5HUl9WSURfQ0hLX0ZXRAkJKDAgPDwgSU5HUl9WSURfQ0hLX1NISUZUKQotI2RlZmluZSAgSU5HUl9WSURfQ0hLX0RST1AJCSgxIDw8IElOR1JfVklEX0NIS19TSElGVCkKLSNkZWZpbmUgIElOR1JfVklEX0NIS19OT19DSEsJCSgyIDw8IElOR1JfVklEX0NIS19TSElGVCkKLSNkZWZpbmUgIElOR1JfVklEX0NIS19WSURfVklPTF9JTVAJKDMgPDwgSU5HUl9WSURfQ0hLX1NISUZUKQotCi0jZGVmaW5lIENPUkVfVkxBTl9DVFJMNQkJCTB4ZDAxOAotI2RlZmluZSAgRU5fQ1BVX1JYX0JZUF9JTk5FUl9DUkNDSENLCSgxIDw8IDApCi0jZGVmaW5lICBFTl9WSURfRkZGX0ZXRAkJCSgxIDw8IDIpCi0jZGVmaW5lICBEUk9QX1ZUQUJMRV9NSVNTCQkoMSA8PCAzKQotI2RlZmluZSAgRUdSRVNTX0RJUl9GUk1fQllQX1RSVU5LX0VOCSgxIDw8IDQpCi0jZGVmaW5lICBQUkVTVl9OT04xUQkJCSgxIDw8IDYpCi0KLSNkZWZpbmUgQ09SRV9WTEFOX0NUUkw2CQkJMHhkMDFjCi0jZGVmaW5lICBTVFJJQ1RfU0ZEX0RFVEVDVAkJKDEgPDwgMCkKLSNkZWZpbmUgIERJU19BUkxfQlVTVF9MTUlUCQkoMSA8PCA0KQotCiAjZGVmaW5lIENPUkVfREVGQVVMVF8xUV9UQUdfUCh4KQkoMHhkMDQwICsgKCh4KSAqIDgpKQogI2RlZmluZSAgQ0ZJX1NISUZUCQkJMTIKICNkZWZpbmUgIFBSSV9TSElGVAkJCTEzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2MDYwLmMgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2MDYwLmMKaW5kZXggZTM2YjQwOC4uN2NlMzZkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL212ODhlNjA2MC5jCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTYwNjAuYwpAQCAtMTksNyArMTksNyBAQAogCiBzdGF0aWMgaW50IHJlZ19yZWFkKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IGFkZHIsIGludCByZWcpCiB7Ci0Jc3RydWN0IG12ODhlNjA2MF9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNjA2MF9wcml2ICpwcml2ID0gZHMtPnByaXY7CiAKIAlyZXR1cm4gbWRpb2J1c19yZWFkX25lc3RlZChwcml2LT5idXMsIHByaXYtPnN3X2FkZHIgKyBhZGRyLCByZWcpOwogfQpAQCAtMzcsNyArMzcsNyBAQAogCiBzdGF0aWMgaW50IHJlZ193cml0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLCBpbnQgcmVnLCB1MTYgdmFsKQogewotCXN0cnVjdCBtdjg4ZTYwNjBfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTYwNjBfcHJpdiAqcHJpdiA9IGRzLT5wcml2OwogCiAJcmV0dXJuIG1kaW9idXNfd3JpdGVfbmVzdGVkKHByaXYtPmJ1cywgcHJpdi0+c3dfYWRkciArIGFkZHIsIHJlZywgdmFsKTsKIH0KQEAgLTY5LDYgKzY5LDExIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBlbnVtIGRzYV90YWdfcHJvdG9jb2wgbXY4OGU2MDYwX2dldF90YWdfcHJvdG9jb2woc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoreworCXJldHVybiBEU0FfVEFHX1BST1RPX1RSQUlMRVI7Cit9CisKIHN0YXRpYyBjb25zdCBjaGFyICptdjg4ZTYwNjBfZHJ2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRzYV9kZXYsCiAJCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmhvc3RfZGV2LCBpbnQgc3dfYWRkciwKIAkJCQkgICAgICAgdm9pZCAqKl9wcml2KQpAQCAtMjQ3LDggKzI1Miw4IEBACiAJcmV0dXJuIHJlZ193cml0ZShkcywgYWRkciwgcmVnbnVtLCB2YWwpOwogfQogCi1zdGF0aWMgc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyIG12ODhlNjA2MF9zd2l0Y2hfZHJpdmVyID0gewotCS50YWdfcHJvdG9jb2wJPSBEU0FfVEFHX1BST1RPX1RSQUlMRVIsCitzdGF0aWMgc3RydWN0IGRzYV9zd2l0Y2hfb3BzIG12ODhlNjA2MF9zd2l0Y2hfb3BzID0geworCS5nZXRfdGFnX3Byb3RvY29sID0gbXY4OGU2MDYwX2dldF90YWdfcHJvdG9jb2wsCiAJLnByb2JlCQk9IG12ODhlNjA2MF9kcnZfcHJvYmUsCiAJLnNldHVwCQk9IG12ODhlNjA2MF9zZXR1cCwKIAkuc2V0X2FkZHIJPSBtdjg4ZTYwNjBfc2V0X2FkZHIsCkBAIC0yNTgsMTQgKzI2MywxNCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBtdjg4ZTYwNjBfaW5pdCh2b2lkKQogewotCXJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoJm12ODhlNjA2MF9zd2l0Y2hfZHJpdmVyKTsKKwlyZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKCZtdjg4ZTYwNjBfc3dpdGNoX29wcyk7CiAJcmV0dXJuIDA7CiB9CiBtb2R1bGVfaW5pdChtdjg4ZTYwNjBfaW5pdCk7CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBtdjg4ZTYwNjBfY2xlYW51cCh2b2lkKQogewotCXVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigmbXY4OGU2MDYwX3N3aXRjaF9kcml2ZXIpOworCXVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigmbXY4OGU2MDYwX3N3aXRjaF9vcHMpOwogfQogbW9kdWxlX2V4aXQobXY4OGU2MDYwX2NsZWFudXApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L0tjb25maWcgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L0tjb25maWcKaW5kZXggNDkwYmMwNi4uNDg2NjY4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvS2NvbmZpZwpAQCAtMiw2ICsyLDE4IEBACiAJdHJpc3RhdGUgIk1hcnZlbGwgODhFNnh4eCBFdGhlcm5ldCBzd2l0Y2ggZmFicmljIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBORVRfRFNBCiAJc2VsZWN0IE5FVF9EU0FfVEFHX0VEU0EKKwlzZWxlY3QgTkVUX0RTQV9UQUdfRFNBCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciBtb3N0IG9mIHRoZSBNYXJ2ZWxsIDg4RTZ4eHggbW9kZWxzIG9mCiAJICBFdGhlcm5ldCBzd2l0Y2ggY2hpcHMsIGV4Y2VwdCA4OEU2MDYwLgorCitjb25maWcgTkVUX0RTQV9NVjg4RTZYWFhfR0xPQkFMMgorCWJvb2wgIlN3aXRjaCBHbG9iYWwgMiBSZWdpc3RlcnMgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE5FVF9EU0FfTVY4OEU2WFhYCisJaGVscAorCSAgVGhpcyByZWdpc3RlcnMgc2V0IGF0IGludGVybmFsIFNNSSBhZGRyZXNzIDB4MUMgcHJvdmlkZXMgZXh0ZW5kZWQKKwkgIGZlYXR1cmVzIGxpa2UgRUVQUk9NIGludGVyZmFjZSwgdHJ1bmtpbmcsIGNyb3NzLWNoaXAgc2V0dXAsIGV0Yy4KKworCSAgSXQgaXMgcmVxdWlyZWQgb24gbW9zdCBjaGlwcy4gSWYgdGhlIGNoaXAgeW91IGNvbXBpbGUgdGhlIHN1cHBvcnQgZm9yCisJICBkb2Vzbid0IGhhdmUgc3VjaCByZWdpc3RlcnMgc2V0LCBzYXkgTiBoZXJlLiBJbiBkb3VidCwgc2F5IFkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9NYWtlZmlsZQppbmRleCA2ZTI5YTc1Li4xMGNlODIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvTWFrZWZpbGUKQEAgLTEgKzEsNCBAQAotb2JqLSQoQ09ORklHX05FVF9EU0FfTVY4OEU2WFhYKSArPSBjaGlwLm8KK29iai0kKENPTkZJR19ORVRfRFNBX01WODhFNlhYWCkgKz0gbXY4OGU2eHh4Lm8KK212ODhlNnh4eC1vYmpzIDo9IGNoaXAubworbXY4OGU2eHh4LW9ianMgKz0gZ2xvYmFsMS5vCittdjg4ZTZ4eHgtJChDT05GSUdfTkVUX0RTQV9NVjg4RTZYWFhfR0xPQkFMMikgKz0gZ2xvYmFsMi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L2NoaXAuYyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvY2hpcC5jCmluZGV4IGQzNmFlZGQuLjg4M2ZkOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvY2hpcC5jCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvY2hpcC5jCkBAIC0yOSw3ICsyOSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPG5ldC9kc2EuaD4KICNpbmNsdWRlIDxuZXQvc3dpdGNoZGV2Lmg+CisKICNpbmNsdWRlICJtdjg4ZTZ4eHguaCIKKyNpbmNsdWRlICJnbG9iYWwxLmgiCisjaW5jbHVkZSAiZ2xvYmFsMi5oIgogCiBzdGF0aWMgdm9pZCBhc3NlcnRfcmVnX2xvY2soc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQogewpAQCAtOTUsNyArOTgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2eHh4X3NtaV9zaW5nbGVfY2hpcF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9idXNfb3BzIG12ODhlNnh4eF9zbWlfc2luZ2xlX2NoaXBfb3BzID0gewogCS5yZWFkID0gbXY4OGU2eHh4X3NtaV9zaW5nbGVfY2hpcF9yZWFkLAogCS53cml0ZSA9IG12ODhlNnh4eF9zbWlfc2luZ2xlX2NoaXBfd3JpdGUsCiB9OwpAQCAtMTc3LDEzICsxODAsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNnh4eF9zbWlfbXVsdGlfY2hpcF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9idXNfb3BzIG12ODhlNnh4eF9zbWlfbXVsdGlfY2hpcF9vcHMgPSB7CiAJLnJlYWQgPSBtdjg4ZTZ4eHhfc21pX211bHRpX2NoaXBfcmVhZCwKIAkud3JpdGUgPSBtdjg4ZTZ4eHhfc21pX211bHRpX2NoaXBfd3JpdGUsCiB9OwogCi1zdGF0aWMgaW50IG12ODhlNnh4eF9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCSAgaW50IGFkZHIsIGludCByZWcsIHUxNiAqdmFsKQoraW50IG12ODhlNnh4eF9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsIHUxNiAqdmFsKQogewogCWludCBlcnI7CiAKQEAgLTE5OSw4ICsyMDEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG12ODhlNnh4eF93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkgICBpbnQgYWRkciwgaW50IHJlZywgdTE2IHZhbCkKK2ludCBtdjg4ZTZ4eHhfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZywgdTE2IHZhbCkKIHsKIAlpbnQgZXJyOwogCkBAIC0yMTYsMjUgKzIxNywxNDQgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogSW5kaXJlY3Qgd3JpdGUgdG8gc2luZ2xlIHBvaW50ZXItZGF0YSByZWdpc3RlciB3aXRoIGFuIFVwZGF0ZSBiaXQgKi8KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X3VwZGF0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnLAotCQkJICAgIHUxNiB1cGRhdGUpCitzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X3JlYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcG9ydCwgaW50IHJlZywKKwkJCSAgICAgICB1MTYgKnZhbCkKIHsKLQl1MTYgdmFsOwotCWludCBpLCBlcnI7CisJaW50IGFkZHIgPSBjaGlwLT5pbmZvLT5wb3J0X2Jhc2VfYWRkciArIHBvcnQ7CiAKLQkvKiBXYWl0IHVudGlsIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gaXMgY29tcGxldGVkICovCi0JZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKwlyZXR1cm4gbXY4OGU2eHh4X3JlYWQoY2hpcCwgYWRkciwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvcnQsIGludCByZWcsCisJCQkJdTE2IHZhbCkKK3sKKwlpbnQgYWRkciA9IGNoaXAtPmluZm8tPnBvcnRfYmFzZV9hZGRyICsgcG9ydDsKKworCXJldHVybiBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgYWRkciwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9waHlfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwaHksCisJCQkgICAgICBpbnQgcmVnLCB1MTYgKnZhbCkKK3sKKwlpbnQgYWRkciA9IHBoeTsgLyogUEhZIGRldmljZXMgYWRkcmVzc2VzIHN0YXJ0IGF0IDB4MCAqLworCisJaWYgKCFjaGlwLT5pbmZvLT5vcHMtPnBoeV9yZWFkKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gY2hpcC0+aW5mby0+b3BzLT5waHlfcmVhZChjaGlwLCBhZGRyLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X3BoeV93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwaHksCisJCQkgICAgICAgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlpbnQgYWRkciA9IHBoeTsgLyogUEhZIGRldmljZXMgYWRkcmVzc2VzIHN0YXJ0IGF0IDB4MCAqLworCisJaWYgKCFjaGlwLT5pbmZvLT5vcHMtPnBoeV93cml0ZSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJcmV0dXJuIGNoaXAtPmluZm8tPm9wcy0+cGh5X3dyaXRlKGNoaXAsIGFkZHIsIHJlZywgdmFsKTsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfcGh5X3BhZ2VfZ2V0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBoeSwgdTggcGFnZSkKK3sKKwlpZiAoIW12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfUEhZX1BBR0UpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gbXY4OGU2eHh4X3BoeV93cml0ZShjaGlwLCBwaHksIFBIWV9QQUdFLCBwYWdlKTsKK30KKworc3RhdGljIHZvaWQgbXY4OGU2eHh4X3BoeV9wYWdlX3B1dChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwaHkpCit7CisJaW50IGVycjsKKworCS8qIFJlc3RvcmUgUEhZIHBhZ2UgQ29wcGVyIDB4MCBmb3IgYWNjZXNzIHZpYSB0aGUgcmVnaXN0ZXJlZCBNRElPIGJ1cyAqLworCWVyciA9IG12ODhlNnh4eF9waHlfd3JpdGUoY2hpcCwgcGh5LCBQSFlfUEFHRSwgUEhZX1BBR0VfQ09QUEVSKTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlkZXZfZXJyKGNoaXAtPmRldiwgImZhaWxlZCB0byByZXN0b3JlIFBIWSAlZCBwYWdlIENvcHBlciAoJWQpXG4iLAorCQkJcGh5LCBlcnIpOworCX0KK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfcGh5X3BhZ2VfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwaHksCisJCQkJICAgdTggcGFnZSwgaW50IHJlZywgdTE2ICp2YWwpCit7CisJaW50IGVycjsKKworCS8qIFRoZXJlIGlzIG5vIHBhZ2luZyBmb3IgcmVnaXN0ZXJzIDIyICovCisJaWYgKHJlZyA9PSBQSFlfUEFHRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBtdjg4ZTZ4eHhfcGh5X3BhZ2VfZ2V0KGNoaXAsIHBoeSwgcGFnZSk7CisJaWYgKCFlcnIpIHsKKwkJZXJyID0gbXY4OGU2eHh4X3BoeV9yZWFkKGNoaXAsIHBoeSwgcmVnLCB2YWwpOworCQltdjg4ZTZ4eHhfcGh5X3BhZ2VfcHV0KGNoaXAsIHBoeSk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfcGh5X3BhZ2Vfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcGh5LAorCQkJCSAgICB1OCBwYWdlLCBpbnQgcmVnLCB1MTYgdmFsKQoreworCWludCBlcnI7CisKKwkvKiBUaGVyZSBpcyBubyBwYWdpbmcgZm9yIHJlZ2lzdGVycyAyMiAqLworCWlmIChyZWcgPT0gUEhZX1BBR0UpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gbXY4OGU2eHh4X3BoeV9wYWdlX2dldChjaGlwLCBwaHksIHBhZ2UpOworCWlmICghZXJyKSB7CisJCWVyciA9IG12ODhlNnh4eF9waHlfd3JpdGUoY2hpcCwgcGh5LCBQSFlfUEFHRSwgcGFnZSk7CisJCW12ODhlNnh4eF9waHlfcGFnZV9wdXQoY2hpcCwgcGh5KTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9zZXJkZXNfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCByZWcsIHUxNiAqdmFsKQoreworCXJldHVybiBtdjg4ZTZ4eHhfcGh5X3BhZ2VfcmVhZChjaGlwLCBBRERSX1NFUkRFUywgU0VSREVTX1BBR0VfRklCRVIsCisJCQkJICAgICAgIHJlZywgdmFsKTsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfc2VyZGVzX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlyZXR1cm4gbXY4OGU2eHh4X3BoeV9wYWdlX3dyaXRlKGNoaXAsIEFERFJfU0VSREVTLCBTRVJERVNfUEFHRV9GSUJFUiwKKwkJCQkJcmVnLCB2YWwpOworfQorCitpbnQgbXY4OGU2eHh4X3dhaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZywgdTE2IG1hc2spCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQl1MTYgdmFsOworCQlpbnQgZXJyOworCiAJCWVyciA9IG12ODhlNnh4eF9yZWFkKGNoaXAsIGFkZHIsIHJlZywgJnZhbCk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCi0JCWlmICghKHZhbCAmIEJJVCgxNSkpKQotCQkJYnJlYWs7CisJCWlmICghKHZhbCAmIG1hc2spKQorCQkJcmV0dXJuIDA7CisKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwogCX0KIAotCWlmIChpID09IDE2KQotCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwlkZXZfZXJyKGNoaXAtPmRldiwgIlRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3Igc3dpdGNoXG4iKTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworLyogSW5kaXJlY3Qgd3JpdGUgdG8gc2luZ2xlIHBvaW50ZXItZGF0YSByZWdpc3RlciB3aXRoIGFuIFVwZGF0ZSBiaXQgKi8KK2ludCBtdjg4ZTZ4eHhfdXBkYXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsIHUxNiB1cGRhdGUpCit7CisJdTE2IHZhbDsKKwlpbnQgZXJyOworCisJLyogV2FpdCB1bnRpbCB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCAqLworCWVyciA9IG12ODhlNnh4eF93YWl0KGNoaXAsIGFkZHIsIHJlZywgQklUKDE1KSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCS8qIFNldCB0aGUgVXBkYXRlIGJpdCB0byB0cmlnZ2VyIGEgd3JpdGUgb3BlcmF0aW9uICovCiAJdmFsID0gQklUKDE1KSB8IHVwZGF0ZTsKQEAgLTI0Miw2MyArMzYyLDI3IEBACiAJcmV0dXJuIG12ODhlNnh4eF93cml0ZShjaGlwLCBhZGRyLCByZWcsIHZhbCk7CiB9CiAKLXN0YXRpYyBpbnQgX212ODhlNnh4eF9yZWdfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnKQorc3RhdGljIGludCBtdjg4ZTZ4eHhfcHB1X2Rpc2FibGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQogewogCXUxNiB2YWw7Ci0JaW50IGVycjsKKwlpbnQgaSwgZXJyOwogCi0JZXJyID0gbXY4OGU2eHh4X3JlYWQoY2hpcCwgYWRkciwgcmVnLCAmdmFsKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfQ09OVFJPTCwgJnZhbCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCXJldHVybiB2YWw7Ci19CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9DT05UUk9MLAorCQkJCSB2YWwgJiB+R0xPQkFMX0NPTlRST0xfUFBVX0VOQUJMRSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotc3RhdGljIGludCBfbXY4OGU2eHh4X3JlZ193cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLAotCQkJCWludCByZWcsIHUxNiB2YWwpCi17Ci0JcmV0dXJuIG12ODhlNnh4eF93cml0ZShjaGlwLCBhZGRyLCByZWcsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X21kaW9fcmVhZF9kaXJlY3Qoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCSAgICAgIGludCBhZGRyLCBpbnQgcmVnbnVtKQotewotCWlmIChhZGRyID49IDApCi0JCXJldHVybiBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIGFkZHIsIHJlZ251bSk7Ci0JcmV0dXJuIDB4ZmZmZjsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfbWRpb193cml0ZV9kaXJlY3Qoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCSAgICAgICBpbnQgYWRkciwgaW50IHJlZ251bSwgdTE2IHZhbCkKLXsKLQlpZiAoYWRkciA+PSAwKQotCQlyZXR1cm4gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgYWRkciwgcmVnbnVtLCB2YWwpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9wcHVfZGlzYWJsZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0KLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9DT05UUk9MKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9DT05UUk9MLAotCQkJCSAgIHJldCAmIH5HTE9CQUxfQ09OVFJPTF9QUFVfRU5BQkxFKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JdGltZW91dCA9IGppZmZpZXMgKyAxICogSFo7Ci0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1NUQVRVUyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfU1RBVFVTLCAmdmFsKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAKIAkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwotCQlpZiAoKHJldCAmIEdMT0JBTF9TVEFUVVNfUFBVX01BU0spICE9Ci0JCSAgICBHTE9CQUxfU1RBVFVTX1BQVV9QT0xMSU5HKQorCQlpZiAoKHZhbCAmIEdMT0JBTF9TVEFUVVNfUFBVX01BU0spICE9IEdMT0JBTF9TVEFUVVNfUFBVX1BPTExJTkcpCiAJCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTMwNywyNyArMzkxLDI1IEBACiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3BwdV9lbmFibGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQogewotCWludCByZXQsIGVycjsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdTE2IHZhbDsKKwlpbnQgaSwgZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfQ09OVFJPTCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQllcnIgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfQ09OVFJPTCwKLQkJCQkgICByZXQgfCBHTE9CQUxfQ09OVFJPTF9QUFVfRU5BQkxFKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfQ09OVFJPTCwgJnZhbCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCXRpbWVvdXQgPSBqaWZmaWVzICsgMSAqIEhaOwotCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9TVEFUVVMpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9DT05UUk9MLAorCQkJCSB2YWwgfCBHTE9CQUxfQ09OVFJPTF9QUFVfRU5BQkxFKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX1NUQVRVUywgJnZhbCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCiAJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKLQkJaWYgKChyZXQgJiBHTE9CQUxfU1RBVFVTX1BQVV9NQVNLKSA9PQotCQkgICAgR0xPQkFMX1NUQVRVU19QUFVfUE9MTElORykKKwkJaWYgKCh2YWwgJiBHTE9CQUxfU1RBVFVTX1BQVV9NQVNLKSA9PSBHTE9CQUxfU1RBVFVTX1BQVV9QT0xMSU5HKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC00MDAsMzIgKzQ4MiwzNyBAQAogCWNoaXAtPnBwdV90aW1lci5mdW5jdGlvbiA9IG12ODhlNnh4eF9wcHVfcmVlbmFibGVfdGltZXI7CiB9CiAKLXN0YXRpYyBpbnQgbXY4OGU2eHh4X21kaW9fcmVhZF9wcHUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwKLQkJCQkgICBpbnQgcmVnbnVtKQorc3RhdGljIHZvaWQgbXY4OGU2eHh4X3BwdV9zdGF0ZV9kZXN0cm95KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKIHsKLQlpbnQgcmV0OwotCi0JcmV0ID0gbXY4OGU2eHh4X3BwdV9hY2Nlc3NfZ2V0KGNoaXApOwotCWlmIChyZXQgPj0gMCkgewotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIGFkZHIsIHJlZ251bSk7Ci0JCW12ODhlNnh4eF9wcHVfYWNjZXNzX3B1dChjaGlwKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCWRlbF90aW1lcl9zeW5jKCZjaGlwLT5wcHVfdGltZXIpOwogfQogCi1zdGF0aWMgaW50IG12ODhlNnh4eF9tZGlvX3dyaXRlX3BwdShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLAotCQkJCSAgICBpbnQgcmVnbnVtLCB1MTYgdmFsKQorc3RhdGljIGludCBtdjg4ZTZ4eHhfcGh5X3BwdV9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsCisJCQkJICBpbnQgcmVnLCB1MTYgKnZhbCkKIHsKLQlpbnQgcmV0OworCWludCBlcnI7CiAKLQlyZXQgPSBtdjg4ZTZ4eHhfcHB1X2FjY2Vzc19nZXQoY2hpcCk7Ci0JaWYgKHJldCA+PSAwKSB7Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIGFkZHIsIHJlZ251bSwgdmFsKTsKKwllcnIgPSBtdjg4ZTZ4eHhfcHB1X2FjY2Vzc19nZXQoY2hpcCk7CisJaWYgKCFlcnIpIHsKKwkJZXJyID0gbXY4OGU2eHh4X3JlYWQoY2hpcCwgYWRkciwgcmVnLCB2YWwpOwogCQltdjg4ZTZ4eHhfcHB1X2FjY2Vzc19wdXQoY2hpcCk7CiAJfQogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9waHlfcHB1X3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsCisJCQkJICAgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gbXY4OGU2eHh4X3BwdV9hY2Nlc3NfZ2V0KGNoaXApOworCWlmICghZXJyKSB7CisJCWVyciA9IG12ODhlNnh4eF93cml0ZShjaGlwLCBhZGRyLCByZWcsIHZhbCk7CisJCW12ODhlNnh4eF9wcHVfYWNjZXNzX3B1dChjaGlwKTsKKwl9CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgYm9vbCBtdjg4ZTZ4eHhfNjA2NV9mYW1pbHkoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQpAQCAtNDY4LDIxICs1NTUsNiBAQAogCXJldHVybiBjaGlwLT5pbmZvLT5mYW1pbHkgPT0gTVY4OEU2WFhYX0ZBTUlMWV82MzUyOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IG12ODhlNnh4eF9udW1fZGF0YWJhc2VzKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKLXsKLQlyZXR1cm4gY2hpcC0+aW5mby0+bnVtX2RhdGFiYXNlczsKLX0KLQotc3RhdGljIGJvb2wgbXY4OGU2eHh4X2hhc19maWRfcmVnKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKLXsKLQkvKiBEb2VzIHRoZSBkZXZpY2UgaGF2ZSBkZWRpY2F0ZWQgRklEIHJlZ2lzdGVycyBmb3IgQVRVIGFuZCBWVFUgb3BzPyAqLwotCWlmIChtdjg4ZTZ4eHhfNjA5N19mYW1pbHkoY2hpcCkgfHwgbXY4OGU2eHh4XzYxNjVfZmFtaWx5KGNoaXApIHx8Ci0JICAgIG12ODhlNnh4eF82MzUxX2ZhbWlseShjaGlwKSB8fCBtdjg4ZTZ4eHhfNjM1Ml9mYW1pbHkoY2hpcCkpCi0JCXJldHVybiB0cnVlOwotCi0JcmV0dXJuIGZhbHNlOwotfQotCiAvKiBXZSBleHBlY3QgdGhlIHN3aXRjaCB0byBwZXJmb3JtIGF1dG8gbmVnb3RpYXRpb24gaWYgdGhlcmUgaXMgYSByZWFsCiAgKiBwaHkuIEhvd2V2ZXIsIGluIHRoZSBjYXNlIG9mIGEgZml4ZWQgbGluayBwaHksIHdlIGZvcmNlIHRoZSBwb3J0CiAgKiBzZXR0aW5ncyBmcm9tIHRoZSBmaXhlZCBsaW5rIHNldHRpbmdzLgpAQCAtNDkwLDI0ICs1NjIsMjQgQEAKIHN0YXRpYyB2b2lkIG12ODhlNnh4eF9hZGp1c3RfbGluayhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCSAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKLQl1MzIgcmVnOwotCWludCByZXQ7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CisJdTE2IHJlZzsKKwlpbnQgZXJyOwogCiAJaWYgKCFwaHlfaXNfcHNldWRvX2ZpeGVkX2xpbmsocGh5ZGV2KSkKIAkJcmV0dXJuOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwogCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9QQ1NfQ1RSTCk7Ci0JaWYgKHJldCA8IDApCisJZXJyID0gbXY4OGU2eHh4X3BvcnRfcmVhZChjaGlwLCBwb3J0LCBQT1JUX1BDU19DVFJMLCAmcmVnKTsKKwlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCXJlZyA9IHJldCAmIH4oUE9SVF9QQ1NfQ1RSTF9MSU5LX1VQIHwKLQkJICAgICAgUE9SVF9QQ1NfQ1RSTF9GT1JDRV9MSU5LIHwKLQkJICAgICAgUE9SVF9QQ1NfQ1RSTF9EVVBMRVhfRlVMTCB8Ci0JCSAgICAgIFBPUlRfUENTX0NUUkxfRk9SQ0VfRFVQTEVYIHwKLQkJICAgICAgUE9SVF9QQ1NfQ1RSTF9VTkZPUkNFRCk7CisJcmVnICY9IH4oUE9SVF9QQ1NfQ1RSTF9MSU5LX1VQIHwKKwkJIFBPUlRfUENTX0NUUkxfRk9SQ0VfTElOSyB8CisJCSBQT1JUX1BDU19DVFJMX0RVUExFWF9GVUxMIHwKKwkJIFBPUlRfUENTX0NUUkxfRk9SQ0VfRFVQTEVYIHwKKwkJIFBPUlRfUENTX0NUUkxfVU5GT1JDRUQpOwogCiAJcmVnIHw9IFBPUlRfUENTX0NUUkxfRk9SQ0VfTElOSzsKIAlpZiAocGh5ZGV2LT5saW5rKQpAQCAtNTM2LDcgKzYwOCw3IEBACiAJCXJlZyB8PSBQT1JUX1BDU19DVFJMX0RVUExFWF9GVUxMOwogCiAJaWYgKChtdjg4ZTZ4eHhfNjM1Ml9mYW1pbHkoY2hpcCkgfHwgbXY4OGU2eHh4XzYzNTFfZmFtaWx5KGNoaXApKSAmJgotCSAgICAocG9ydCA+PSBjaGlwLT5pbmZvLT5udW1fcG9ydHMgLSAyKSkgeworCSAgICAocG9ydCA+PSBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApIC0gMikpIHsKIAkJaWYgKHBoeWRldi0+aW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9SWElEKQogCQkJcmVnIHw9IFBPUlRfUENTX0NUUkxfUkdNSUlfREVMQVlfUlhDTEs7CiAJCWlmIChwaHlkZXYtPmludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfVFhJRCkKQEAgLTU0NSw3ICs2MTcsNyBAQAogCQkJcmVnIHw9IChQT1JUX1BDU19DVFJMX1JHTUlJX0RFTEFZX1JYQ0xLIHwKIAkJCQlQT1JUX1BDU19DVFJMX1JHTUlJX0RFTEFZX1RYQ0xLKTsKIAl9Ci0JX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksIFBPUlRfUENTX0NUUkwsIHJlZyk7CisJbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9QQ1NfQ1RSTCwgcmVnKTsKIAogb3V0OgogCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwpAQCAtNTUzLDEyICs2MjUsMTIgQEAKIAogc3RhdGljIGludCBfbXY4OGU2eHh4X3N0YXRzX3dhaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQogewotCWludCByZXQ7Ci0JaW50IGk7CisJdTE2IHZhbDsKKwlpbnQgaSwgZXJyOwogCiAJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfU1RBVFNfT1ApOwotCQlpZiAoKHJldCAmIEdMT0JBTF9TVEFUU19PUF9CVVNZKSA9PSAwKQorCQllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfU1RBVFNfT1AsICZ2YWwpOworCQlpZiAoKHZhbCAmIEdMT0JBTF9TVEFUU19PUF9CVVNZKSA9PSAwKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC01NjcsNTUgKzYzOSw1MiBAQAogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfc3RhdHNfc25hcHNob3Qoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcG9ydCkKIHsKLQlpbnQgcmV0OworCWludCBlcnI7CiAKIAlpZiAobXY4OGU2eHh4XzYzMjBfZmFtaWx5KGNoaXApIHx8IG12ODhlNnh4eF82MzUyX2ZhbWlseShjaGlwKSkKIAkJcG9ydCA9IChwb3J0ICsgMSkgPDwgNTsKIAogCS8qIFNuYXBzaG90IHRoZSBoYXJkd2FyZSBzdGF0aXN0aWNzIGNvdW50ZXJzIGZvciB0aGlzIHBvcnQuICovCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1NUQVRTX09QLAotCQkJCSAgIEdMT0JBTF9TVEFUU19PUF9DQVBUVVJFX1BPUlQgfAotCQkJCSAgIEdMT0JBTF9TVEFUU19PUF9ISVNUX1JYX1RYIHwgcG9ydCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9TVEFUU19PUCwKKwkJCQkgR0xPQkFMX1NUQVRTX09QX0NBUFRVUkVfUE9SVCB8CisJCQkJIEdMT0JBTF9TVEFUU19PUF9ISVNUX1JYX1RYIHwgcG9ydCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCS8qIFdhaXQgZm9yIHRoZSBzbmFwc2hvdHRpbmcgdG8gY29tcGxldGUuICovCi0JcmV0ID0gX212ODhlNnh4eF9zdGF0c193YWl0KGNoaXApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIF9tdjg4ZTZ4eHhfc3RhdHNfd2FpdChjaGlwKTsKIH0KIAogc3RhdGljIHZvaWQgX212ODhlNnh4eF9zdGF0c19yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKIAkJCQkgIGludCBzdGF0LCB1MzIgKnZhbCkKIHsKLQl1MzIgX3ZhbDsKLQlpbnQgcmV0OworCXUzMiB2YWx1ZTsKKwl1MTYgcmVnOworCWludCBlcnI7CiAKIAkqdmFsID0gMDsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9TVEFUU19PUCwKLQkJCQkgICBHTE9CQUxfU1RBVFNfT1BfUkVBRF9DQVBUVVJFRCB8Ci0JCQkJICAgR0xPQkFMX1NUQVRTX09QX0hJU1RfUlhfVFggfCBzdGF0KTsKLQlpZiAocmV0IDwgMCkKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX1NUQVRTX09QLAorCQkJCSBHTE9CQUxfU1RBVFNfT1BfUkVBRF9DQVBUVVJFRCB8CisJCQkJIEdMT0JBTF9TVEFUU19PUF9ISVNUX1JYX1RYIHwgc3RhdCk7CisJaWYgKGVycikKIAkJcmV0dXJuOwogCi0JcmV0ID0gX212ODhlNnh4eF9zdGF0c193YWl0KGNoaXApOwotCWlmIChyZXQgPCAwKQorCWVyciA9IF9tdjg4ZTZ4eHhfc3RhdHNfd2FpdChjaGlwKTsKKwlpZiAoZXJyKQogCQlyZXR1cm47CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9TVEFUU19DT1VOVEVSXzMyKTsKLQlpZiAocmV0IDwgMCkKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfU1RBVFNfQ09VTlRFUl8zMiwgJnJlZyk7CisJaWYgKGVycikKIAkJcmV0dXJuOwogCi0JX3ZhbCA9IHJldCA8PCAxNjsKKwl2YWx1ZSA9IHJlZyA8PCAxNjsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1NUQVRTX0NPVU5URVJfMDEpOwotCWlmIChyZXQgPCAwKQorCWVyciA9IG12ODhlNnh4eF9nMV9yZWFkKGNoaXAsIEdMT0JBTF9TVEFUU19DT1VOVEVSXzAxLCAmcmVnKTsKKwlpZiAoZXJyKQogCQlyZXR1cm47CiAKLQkqdmFsID0gX3ZhbCB8IHJldDsKKwkqdmFsID0gdmFsdWUgfCByZWc7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbXY4OGU2eHh4X2h3X3N0YXQgbXY4OGU2eHh4X2h3X3N0YXRzW10gPSB7CkBAIC03MDUsMjIgKzc3NCwyMiBAQAogewogCXUzMiBsb3c7CiAJdTMyIGhpZ2ggPSAwOwotCWludCByZXQ7CisJaW50IGVycjsKKwl1MTYgcmVnOwogCXU2NCB2YWx1ZTsKIAogCXN3aXRjaCAocy0+dHlwZSkgewogCWNhc2UgUE9SVDoKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwgcy0+cmVnKTsKLQkJaWYgKHJldCA8IDApCisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgcG9ydCwgcy0+cmVnLCAmcmVnKTsKKwkJaWYgKGVycikKIAkJCXJldHVybiBVSU5UNjRfTUFYOwogCi0JCWxvdyA9IHJldDsKKwkJbG93ID0gcmVnOwogCQlpZiAocy0+c2l6ZW9mX3N0YXQgPT0gNCkgewotCQkJcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwKLQkJCQkJCSAgcy0+cmVnICsgMSk7Ci0JCQlpZiAocmV0IDwgMCkKKwkJCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgcG9ydCwgcy0+cmVnICsgMSwgJnJlZyk7CisJCQlpZiAoZXJyKQogCQkJCXJldHVybiBVSU5UNjRfTUFYOwotCQkJaGlnaCA9IHJldDsKKwkJCWhpZ2ggPSByZWc7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBCQU5LMDoKQEAgLTczNiw3ICs4MDUsNyBAQAogc3RhdGljIHZvaWQgbXY4OGU2eHh4X2dldF9zdHJpbmdzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJICB1aW50OF90ICpkYXRhKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCXN0cnVjdCBtdjg4ZTZ4eHhfaHdfc3RhdCAqc3RhdDsKIAlpbnQgaSwgajsKIApAQCAtNzUyLDcgKzgyMSw3IEBACiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X2dldF9zc2V0X2NvdW50KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlzdHJ1Y3QgbXY4OGU2eHh4X2h3X3N0YXQgKnN0YXQ7CiAJaW50IGksIGo7CiAKQEAgLTc2Nyw3ICs4MzYsNyBAQAogc3RhdGljIHZvaWQgbXY4OGU2eHh4X2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJCXVpbnQ2NF90ICpkYXRhKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCXN0cnVjdCBtdjg4ZTZ4eHhfaHdfc3RhdCAqc3RhdDsKIAlpbnQgcmV0OwogCWludCBpLCBqOwpAQCAtNzk4LDcgKzg2Nyw5IEBACiBzdGF0aWMgdm9pZCBtdjg4ZTZ4eHhfZ2V0X3JlZ3Moc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpfcCkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKKwlpbnQgZXJyOworCXUxNiByZWc7CiAJdTE2ICpwID0gX3A7CiAJaW50IGk7CiAKQEAgLTgwOSwxNzAgKzg4MCwxMDYgQEAKIAltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQlpbnQgcmV0OwogCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX1BPUlQocG9ydCksIGkpOwotCQlpZiAocmV0ID49IDApCi0JCQlwW2ldID0gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF9yZWFkKGNoaXAsIHBvcnQsIGksICZyZWcpOworCQlpZiAoIWVycikKKwkJCXBbaV0gPSByZWc7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiB9CiAKLXN0YXRpYyBpbnQgX212ODhlNnh4eF93YWl0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHJlZywgaW50IG9mZnNldCwKLQkJCSAgIHUxNiBtYXNrKQotewotCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWiAvIDEwOwotCi0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCWludCByZXQ7Ci0KLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCByZWcsIG9mZnNldCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQkJaWYgKCEocmV0ICYgbWFzaykpCi0JCQlyZXR1cm4gMDsKLQotCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Ci0JfQotCXJldHVybiAtRVRJTUVET1VUOwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9tZGlvX3dhaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQotewotCXJldHVybiBfbXY4OGU2eHh4X3dhaXQoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfU01JX09QLAotCQkJICAgICAgIEdMT0JBTDJfU01JX09QX0JVU1kpOwotfQotCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfYXR1X3dhaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQogewotCXJldHVybiBfbXY4OGU2eHh4X3dhaXQoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0FUVV9PUCwKLQkJCSAgICAgICBHTE9CQUxfQVRVX09QX0JVU1kpOwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9tZGlvX3JlYWRfaW5kaXJlY3Qoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCQlpbnQgYWRkciwgaW50IHJlZ251bSkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfU01JX09QLAotCQkJCSAgIEdMT0JBTDJfU01JX09QXzIyX1JFQUQgfCAoYWRkciA8PCA1KSB8Ci0JCQkJICAgcmVnbnVtKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IG12ODhlNnh4eF9tZGlvX3dhaXQoY2hpcCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX1NNSV9EQVRBKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X21kaW9fd3JpdGVfaW5kaXJlY3Qoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCQkgaW50IGFkZHIsIGludCByZWdudW0sIHUxNiB2YWwpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX1NNSV9EQVRBLCB2YWwpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfU01JX09QLAotCQkJCSAgIEdMT0JBTDJfU01JX09QXzIyX1dSSVRFIHwgKGFkZHIgPDwgNSkgfAotCQkJCSAgIHJlZ251bSk7Ci0KLQlyZXR1cm4gbXY4OGU2eHh4X21kaW9fd2FpdChjaGlwKTsKKwlyZXR1cm4gbXY4OGU2eHh4X2cxX3dhaXQoY2hpcCwgR0xPQkFMX0FUVV9PUCwgR0xPQkFMX0FUVV9PUF9CVVNZKTsKIH0KIAogc3RhdGljIGludCBtdjg4ZTZ4eHhfZ2V0X2VlZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9lZWUgKmUpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7Ci0JaW50IHJlZzsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKKwl1MTYgcmVnOworCWludCBlcnI7CiAKIAlpZiAoIW12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRUVFKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwogCi0JcmVnID0gbXY4OGU2eHh4X21kaW9fcmVhZF9pbmRpcmVjdChjaGlwLCBwb3J0LCAxNik7Ci0JaWYgKHJlZyA8IDApCisJZXJyID0gbXY4OGU2eHh4X3BoeV9yZWFkKGNoaXAsIHBvcnQsIDE2LCAmcmVnKTsKKwlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAogCWUtPmVlZV9lbmFibGVkID0gISEocmVnICYgMHgwMjAwKTsKIAllLT50eF9scGlfZW5hYmxlZCA9ICEhKHJlZyAmIDB4MDEwMCk7CiAKLQlyZWcgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX1NUQVRVUyk7Ci0JaWYgKHJlZyA8IDApCisJZXJyID0gbXY4OGU2eHh4X3BvcnRfcmVhZChjaGlwLCBwb3J0LCBQT1JUX1NUQVRVUywgJnJlZyk7CisJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKIAllLT5lZWVfYWN0aXZlID0gISEocmVnICYgUE9SVF9TVEFUVVNfRUVFKTsKLQlyZWcgPSAwOwotCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JcmV0dXJuIHJlZzsKKworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3NldF9lZWUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCSAgICAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwgc3RydWN0IGV0aHRvb2xfZWVlICplKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOwotCWludCByZWc7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKKwl1MTYgcmVnOworCWludCBlcnI7CiAKIAlpZiAoIW12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRUVFKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwogCi0JcmV0ID0gbXY4OGU2eHh4X21kaW9fcmVhZF9pbmRpcmVjdChjaGlwLCBwb3J0LCAxNik7Ci0JaWYgKHJldCA8IDApCisJZXJyID0gbXY4OGU2eHh4X3BoeV9yZWFkKGNoaXAsIHBvcnQsIDE2LCAmcmVnKTsKKwlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCXJlZyA9IHJldCAmIH4weDAzMDA7CisJcmVnICY9IH4weDAzMDA7CiAJaWYgKGUtPmVlZV9lbmFibGVkKQogCQlyZWcgfD0gMHgwMjAwOwogCWlmIChlLT50eF9scGlfZW5hYmxlZCkKIAkJcmVnIHw9IDB4MDEwMDsKIAotCXJldCA9IG12ODhlNnh4eF9tZGlvX3dyaXRlX2luZGlyZWN0KGNoaXAsIHBvcnQsIDE2LCByZWcpOworCWVyciA9IG12ODhlNnh4eF9waHlfd3JpdGUoY2hpcCwgcG9ydCwgMTYsIHJlZyk7CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF9hdHVfY21kKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTE2IGZpZCwgdTE2IGNtZCkKIHsKLQlpbnQgcmV0OworCXUxNiB2YWw7CisJaW50IGVycjsKIAotCWlmIChtdjg4ZTZ4eHhfaGFzX2ZpZF9yZWcoY2hpcCkpIHsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0FUVV9GSUQsCi0JCQkJCSAgIGZpZCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19HMV9BVFVfRklEKSkgeworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0FUVV9GSUQsIGZpZCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0gZWxzZSBpZiAobXY4OGU2eHh4X251bV9kYXRhYmFzZXMoY2hpcCkgPT0gMjU2KSB7CiAJCS8qIEFUVSBEQk51bVs3OjRdIGFyZSBsb2NhdGVkIGluIEFUVSBDb250cm9sIDE1OjEyICovCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0FUVV9DT05UUk9MKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfQVRVX0NPTlRST0wsICZ2YWwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfQVRVX0NPTlRST0wsCi0JCQkJCSAgIChyZXQgJiAweGZmZikgfAotCQkJCQkgICAoKGZpZCA8PCA4KSAmIDB4ZjAwMCkpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfQVRVX0NPTlRST0wsCisJCQkJCSAodmFsICYgMHhmZmYpIHwgKChmaWQgPDwgOCkgJiAweGYwMDApKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAKIAkJLyogQVRVIERCTnVtWzM6MF0gYXJlIGxvY2F0ZWQgaW4gQVRVIE9wZXJhdGlvbiAzOjAgKi8KIAkJY21kIHw9IGZpZCAmIDB4ZjsKIAl9CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfQVRVX09QLCBjbWQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfQVRVX09QLCBjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlyZXR1cm4gX212ODhlNnh4eF9hdHVfd2FpdChjaGlwKTsKIH0KQEAgLTk5Nyw3ICsxMDA0LDcgQEAKIAkJZGF0YSB8PSAoZW50cnktPnBvcnR2X3RydW5raWQgPDwgc2hpZnQpICYgbWFzazsKIAl9CiAKLQlyZXR1cm4gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0FUVV9EQVRBLCBkYXRhKTsKKwlyZXR1cm4gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9BVFVfREFUQSwgZGF0YSk7CiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF9hdHVfZmx1c2hfbW92ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCkBAIC0xMDczLDU3ICsxMDgwLDQ1IEBACiAJCQkJIHU4IHN0YXRlKQogewogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGNoaXAtPmRzOwotCWludCByZWcsIHJldCA9IDA7CisJdTE2IHJlZzsKKwlpbnQgZXJyOwogCXU4IG9sZHN0YXRlOwogCi0JcmVnID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9DT05UUk9MKTsKLQlpZiAocmVnIDwgMCkKLQkJcmV0dXJuIHJlZzsKKwllcnIgPSBtdjg4ZTZ4eHhfcG9ydF9yZWFkKGNoaXAsIHBvcnQsIFBPUlRfQ09OVFJPTCwgJnJlZyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCW9sZHN0YXRlID0gcmVnICYgUE9SVF9DT05UUk9MX1NUQVRFX01BU0s7CiAKLQlpZiAob2xkc3RhdGUgIT0gc3RhdGUpIHsKLQkJLyogRmx1c2ggZm9yd2FyZGluZyBkYXRhYmFzZSBpZiB3ZSdyZSBtb3ZpbmcgYSBwb3J0Ci0JCSAqIGZyb20gTGVhcm5pbmcgb3IgRm9yd2FyZGluZyBzdGF0ZSB0byBEaXNhYmxlZCBvcgotCQkgKiBCbG9ja2luZyBvciBMaXN0ZW5pbmcgc3RhdGUuCi0JCSAqLwotCQlpZiAoKG9sZHN0YXRlID09IFBPUlRfQ09OVFJPTF9TVEFURV9MRUFSTklORyB8fAotCQkgICAgIG9sZHN0YXRlID09IFBPUlRfQ09OVFJPTF9TVEFURV9GT1JXQVJESU5HKSAmJgotCQkgICAgKHN0YXRlID09IFBPUlRfQ09OVFJPTF9TVEFURV9ESVNBQkxFRCB8fAotCQkgICAgIHN0YXRlID09IFBPUlRfQ09OVFJPTF9TVEFURV9CTE9DS0lORykpIHsKLQkJCXJldCA9IF9tdjg4ZTZ4eHhfYXR1X3JlbW92ZShjaGlwLCAwLCBwb3J0LCBmYWxzZSk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0JCX0KKwlyZWcgJj0gflBPUlRfQ09OVFJPTF9TVEFURV9NQVNLOworCXJlZyB8PSBzdGF0ZTsKIAotCQlyZWcgPSAocmVnICYgflBPUlRfQ09OVFJPTF9TVEFURV9NQVNLKSB8IHN0YXRlOwotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9DT05UUk9MLAotCQkJCQkgICByZWcpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0NPTlRST0wsIHJlZyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCQluZXRkZXZfZGJnKGRzLT5wb3J0c1twb3J0XS5uZXRkZXYsICJQb3J0U3RhdGUgJXMgKHdhcyAlcylcbiIsCi0JCQkgICBtdjg4ZTZ4eHhfcG9ydF9zdGF0ZV9uYW1lc1tzdGF0ZV0sCi0JCQkgICBtdjg4ZTZ4eHhfcG9ydF9zdGF0ZV9uYW1lc1tvbGRzdGF0ZV0pOwotCX0KKwluZXRkZXZfZGJnKGRzLT5wb3J0c1twb3J0XS5uZXRkZXYsICJQb3J0U3RhdGUgJXMgKHdhcyAlcylcbiIsCisJCSAgIG12ODhlNnh4eF9wb3J0X3N0YXRlX25hbWVzW3N0YXRlXSwKKwkJICAgbXY4OGU2eHh4X3BvcnRfc3RhdGVfbmFtZXNbb2xkc3RhdGVdKTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF9wb3J0X2Jhc2VkX3ZsYW5fbWFwKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvcnQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmJyaWRnZSA9IGNoaXAtPnBvcnRzW3BvcnRdLmJyaWRnZV9kZXY7Ci0JY29uc3QgdTE2IG1hc2sgPSAoMSA8PCBjaGlwLT5pbmZvLT5udW1fcG9ydHMpIC0gMTsKKwljb25zdCB1MTYgbWFzayA9ICgxIDw8IG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCkpIC0gMTsKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBjaGlwLT5kczsKIAl1MTYgb3V0cHV0X3BvcnRzID0gMDsKLQlpbnQgcmVnOworCXUxNiByZWc7CisJaW50IGVycjsKIAlpbnQgaTsKIAogCS8qIGFsbG93IENQVSBwb3J0IG9yIERTQSBsaW5rKHMpIHRvIHNlbmQgZnJhbWVzIHRvIGV2ZXJ5IHBvcnQgKi8KIAlpZiAoZHNhX2lzX2NwdV9wb3J0KGRzLCBwb3J0KSB8fCBkc2FfaXNfZHNhX3BvcnQoZHMsIHBvcnQpKSB7CiAJCW91dHB1dF9wb3J0cyA9IG1hc2s7CiAJfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IGNoaXAtPmluZm8tPm51bV9wb3J0czsgKytpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApOyArK2kpIHsKIAkJCS8qIGFsbG93IHNlbmRpbmcgZnJhbWVzIHRvIGV2ZXJ5IGdyb3VwIG1lbWJlciAqLwogCQkJaWYgKGJyaWRnZSAmJiBjaGlwLT5wb3J0c1tpXS5icmlkZ2VfZGV2ID09IGJyaWRnZSkKIAkJCQlvdXRwdXRfcG9ydHMgfD0gQklUKGkpOwpAQCAtMTEzNywyMCArMTEzMiwyMCBAQAogCS8qIHByZXZlbnQgZnJhbWVzIGZyb20gZ29pbmcgYmFjayBvdXQgb2YgdGhlIHBvcnQgdGhleSBjYW1lIGluIG9uICovCiAJb3V0cHV0X3BvcnRzICY9IH5CSVQocG9ydCk7CiAKLQlyZWcgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0JBU0VfVkxBTik7Ci0JaWYgKHJlZyA8IDApCi0JCXJldHVybiByZWc7CisJZXJyID0gbXY4OGU2eHh4X3BvcnRfcmVhZChjaGlwLCBwb3J0LCBQT1JUX0JBU0VfVkxBTiwgJnJlZyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCXJlZyAmPSB+bWFzazsKIAlyZWcgfD0gb3V0cHV0X3BvcnRzICYgbWFzazsKIAotCXJldHVybiBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9CQVNFX1ZMQU4sIHJlZyk7CisJcmV0dXJuIG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfQkFTRV9WTEFOLCByZWcpOwogfQogCiBzdGF0aWMgdm9pZCBtdjg4ZTZ4eHhfcG9ydF9zdHBfc3RhdGVfc2V0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJCSB1OCBzdGF0ZSkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlpbnQgc3RwX3N0YXRlOwogCWludCBlcnI7CiAKQEAgLTExODEsMjcgKzExNzYsMzkgQEAKIAkJCSAgIG12ODhlNnh4eF9wb3J0X3N0YXRlX25hbWVzW3N0cF9zdGF0ZV0pOwogfQogCitzdGF0aWMgdm9pZCBtdjg4ZTZ4eHhfcG9ydF9mYXN0X2FnZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJZXJyID0gX212ODhlNnh4eF9hdHVfcmVtb3ZlKGNoaXAsIDAsIHBvcnQsIGZhbHNlKTsKKwltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKworCWlmIChlcnIpCisJCW5ldGRldl9lcnIoZHMtPnBvcnRzW3BvcnRdLm5ldGRldiwgImZhaWxlZCB0byBmbHVzaCBBVFVcbiIpOworfQorCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfcG9ydF9wdmlkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvcnQsCiAJCQkJdTE2ICpuZXcsIHUxNiAqb2xkKQogewogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGNoaXAtPmRzOwotCXUxNiBwdmlkOwotCWludCByZXQ7CisJdTE2IHB2aWQsIHJlZzsKKwlpbnQgZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9ERUZBVUxUX1ZMQU4pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgcG9ydCwgUE9SVF9ERUZBVUxUX1ZMQU4sICZyZWcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlwdmlkID0gcmV0ICYgUE9SVF9ERUZBVUxUX1ZMQU5fTUFTSzsKKwlwdmlkID0gcmVnICYgUE9SVF9ERUZBVUxUX1ZMQU5fTUFTSzsKIAogCWlmIChuZXcpIHsKLQkJcmV0ICY9IH5QT1JUX0RFRkFVTFRfVkxBTl9NQVNLOwotCQlyZXQgfD0gKm5ldyAmIFBPUlRfREVGQVVMVF9WTEFOX01BU0s7CisJCXJlZyAmPSB+UE9SVF9ERUZBVUxUX1ZMQU5fTUFTSzsKKwkJcmVnIHw9ICpuZXcgJiBQT1JUX0RFRkFVTFRfVkxBTl9NQVNLOwogCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLAotCQkJCQkgICBQT1JUX0RFRkFVTFRfVkxBTiwgcmV0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0RFRkFVTFRfVkxBTiwgcmVnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAKIAkJbmV0ZGV2X2RiZyhkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2LAogCQkJICAgIkRlZmF1bHRWSUQgJWQgKHdhcyAlZClcbiIsICpuZXcsIHB2aWQpOwpAQCAtMTIyNywxNyArMTIzNCwxNiBAQAogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfdnR1X3dhaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQogewotCXJldHVybiBfbXY4OGU2eHh4X3dhaXQoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9PUCwKLQkJCSAgICAgICBHTE9CQUxfVlRVX09QX0JVU1kpOworCXJldHVybiBtdjg4ZTZ4eHhfZzFfd2FpdChjaGlwLCBHTE9CQUxfVlRVX09QLCBHTE9CQUxfVlRVX09QX0JVU1kpOwogfQogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfdnR1X2NtZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHUxNiBvcCkKIHsKLQlpbnQgcmV0OworCWludCBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfVlRVX09QLCBvcCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9WVFVfT1AsIG9wKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJcmV0dXJuIF9tdjg4ZTZ4eHhfdnR1X3dhaXQoY2hpcCk7CiB9CkBAIC0xMjU0LDIzICsxMjYwLDIxIEBACiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF92dHVfc3R1X2RhdGFfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSAqZW50cnksCisJCQkJCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5ICplbnRyeSwKIAkJCQkJdW5zaWduZWQgaW50IG5pYmJsZV9vZmZzZXQpCiB7CiAJdTE2IHJlZ3NbM107Ci0JaW50IGk7Ci0JaW50IHJldDsKKwlpbnQgaSwgZXJyOwogCiAJZm9yIChpID0gMDsgaSA8IDM7ICsraSkgewotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsCi0JCQkJCSAgR0xPQkFMX1ZUVV9EQVRBXzBfMyArIGkpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJCXUxNiAqcmVnID0gJnJlZ3NbaV07CiAKLQkJcmVnc1tpXSA9IHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX1ZUVV9EQVRBXzBfMyArIGksIHJlZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5pbmZvLT5udW1fcG9ydHM7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApOyArK2kpIHsKIAkJdW5zaWduZWQgaW50IHNoaWZ0ID0gKGkgJSA0KSAqIDQgKyBuaWJibGVfb2Zmc2V0OwogCQl1MTYgcmVnID0gcmVnc1tpIC8gNF07CiAKQEAgLTEyODEsMjYgKzEyODUsMjUgQEAKIH0KIAogc3RhdGljIGludCBtdjg4ZTZ4eHhfdnR1X2RhdGFfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJICAgc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5ICplbnRyeSkKKwkJCQkgICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSAqZW50cnkpCiB7CiAJcmV0dXJuIF9tdjg4ZTZ4eHhfdnR1X3N0dV9kYXRhX3JlYWQoY2hpcCwgZW50cnksIDApOwogfQogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9zdHVfZGF0YV9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgKmVudHJ5KQorCQkJCSAgIHN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5ICplbnRyeSkKIHsKIAlyZXR1cm4gX212ODhlNnh4eF92dHVfc3R1X2RhdGFfcmVhZChjaGlwLCBlbnRyeSwgMik7CiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF92dHVfc3R1X2RhdGFfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCQkgc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5ICplbnRyeSwKKwkJCQkJIHN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5ICplbnRyeSwKIAkJCQkJIHVuc2lnbmVkIGludCBuaWJibGVfb2Zmc2V0KQogewogCXUxNiByZWdzWzNdID0geyAwIH07Ci0JaW50IGk7Ci0JaW50IHJldDsKKwlpbnQgaSwgZXJyOwogCi0JZm9yIChpID0gMDsgaSA8IGNoaXAtPmluZm8tPm51bV9wb3J0czsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCk7ICsraSkgewogCQl1bnNpZ25lZCBpbnQgc2hpZnQgPSAoaSAlIDQpICogNCArIG5pYmJsZV9vZmZzZXQ7CiAJCXU4IGRhdGEgPSBlbnRyeS0+ZGF0YVtpXTsKIApAQCAtMTMwOCw4NiArMTMxMSw4NSBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwKLQkJCQkJICAgR0xPQkFMX1ZUVV9EQVRBXzBfMyArIGksIHJlZ3NbaV0pOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJCXUxNiByZWcgPSByZWdzW2ldOworCisJCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfVlRVX0RBVEFfMF8zICsgaSwgcmVnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3Z0dV9kYXRhX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgICAgc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5ICplbnRyeSkKKwkJCQkgICAgc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgKmVudHJ5KQogewogCXJldHVybiBfbXY4OGU2eHh4X3Z0dV9zdHVfZGF0YV93cml0ZShjaGlwLCBlbnRyeSwgMCk7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3N0dV9kYXRhX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgICAgc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5ICplbnRyeSkKKwkJCQkgICAgc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgKmVudHJ5KQogewogCXJldHVybiBfbXY4OGU2eHh4X3Z0dV9zdHVfZGF0YV93cml0ZShjaGlwLCBlbnRyeSwgMik7CiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF92dHVfdmlkX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTE2IHZpZCkKIHsKLQlyZXR1cm4gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9WSUQsCi0JCQkJICAgIHZpZCAmIEdMT0JBTF9WVFVfVklEX01BU0spOworCXJldHVybiBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX1ZUVV9WSUQsCisJCQkJICB2aWQgJiBHTE9CQUxfVlRVX1ZJRF9NQVNLKTsKIH0KIAogc3RhdGljIGludCBfbXY4OGU2eHh4X3Z0dV9nZXRuZXh0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgIHN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSAqZW50cnkpCisJCQkJICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSAqZW50cnkpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5IG5leHQgPSB7IDAgfTsKLQlpbnQgcmV0OworCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5IG5leHQgPSB7IDAgfTsKKwl1MTYgdmFsOworCWludCBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3Z0dV93YWl0KGNoaXApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IF9tdjg4ZTZ4eHhfdnR1X3dhaXQoY2hpcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfdnR1X2NtZChjaGlwLCBHTE9CQUxfVlRVX09QX1ZUVV9HRVRfTkVYVCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gX212ODhlNnh4eF92dHVfY21kKGNoaXAsIEdMT0JBTF9WVFVfT1BfVlRVX0dFVF9ORVhUKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfVlRVX1ZJRCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX1ZUVV9WSUQsICZ2YWwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQluZXh0LnZpZCA9IHJldCAmIEdMT0JBTF9WVFVfVklEX01BU0s7Ci0JbmV4dC52YWxpZCA9ICEhKHJldCAmIEdMT0JBTF9WVFVfVklEX1ZBTElEKTsKKwluZXh0LnZpZCA9IHZhbCAmIEdMT0JBTF9WVFVfVklEX01BU0s7CisJbmV4dC52YWxpZCA9ICEhKHZhbCAmIEdMT0JBTF9WVFVfVklEX1ZBTElEKTsKIAogCWlmIChuZXh0LnZhbGlkKSB7Ci0JCXJldCA9IG12ODhlNnh4eF92dHVfZGF0YV9yZWFkKGNoaXAsICZuZXh0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfdnR1X2RhdGFfcmVhZChjaGlwLCAmbmV4dCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCi0JCWlmIChtdjg4ZTZ4eHhfaGFzX2ZpZF9yZWcoY2hpcCkpIHsKLQkJCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwKLQkJCQkJCSAgR0xPQkFMX1ZUVV9GSUQpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKKwkJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRzFfVlRVX0ZJRCkpIHsKKwkJCWVyciA9IG12ODhlNnh4eF9nMV9yZWFkKGNoaXAsIEdMT0JBTF9WVFVfRklELCAmdmFsKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKIAotCQkJbmV4dC5maWQgPSByZXQgJiBHTE9CQUxfVlRVX0ZJRF9NQVNLOworCQkJbmV4dC5maWQgPSB2YWwgJiBHTE9CQUxfVlRVX0ZJRF9NQVNLOwogCQl9IGVsc2UgaWYgKG12ODhlNnh4eF9udW1fZGF0YWJhc2VzKGNoaXApID09IDI1NikgewogCQkJLyogVlRVIERCTnVtWzc6NF0gYXJlIGxvY2F0ZWQgaW4gVlRVIE9wZXJhdGlvbiAxMTo4LCBhbmQKIAkJCSAqIFZUVSBEQk51bVszOjBdIGFyZSBsb2NhdGVkIGluIFZUVSBPcGVyYXRpb24gMzowCiAJCQkgKi8KLQkJCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwKLQkJCQkJCSAgR0xPQkFMX1ZUVV9PUCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OworCQkJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX1ZUVV9PUCwgJnZhbCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CiAKLQkJCW5leHQuZmlkID0gKHJldCAmIDB4ZjAwKSA+PiA0OwotCQkJbmV4dC5maWQgfD0gcmV0ICYgMHhmOworCQkJbmV4dC5maWQgPSAodmFsICYgMHhmMDApID4+IDQ7CisJCQluZXh0LmZpZCB8PSB2YWwgJiAweGY7CiAJCX0KIAogCQlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19TVFUpKSB7Ci0JCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsCi0JCQkJCQkgIEdMT0JBTF9WVFVfU0lEKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQ7CisJCQllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfVlRVX1NJRCwgJnZhbCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CiAKLQkJCW5leHQuc2lkID0gcmV0ICYgR0xPQkFMX1ZUVV9TSURfTUFTSzsKKwkJCW5leHQuc2lkID0gdmFsICYgR0xPQkFMX1ZUVV9TSURfTUFTSzsKIAkJfQogCX0KIApAQCAtMTM5OSw4ICsxNDAxLDggQEAKIAkJCQkgICAgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF92bGFuICp2bGFuLAogCQkJCSAgICBpbnQgKCpjYikoc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaikpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7Ci0Jc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5IG5leHQ7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CisJc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgbmV4dDsKIAl1MTYgcHZpZDsKIAlpbnQgZXJyOwogCkBAIC0xNDUxLDM4ICsxNDUzLDM2IEBACiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF92dHVfbG9hZHB1cmdlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgICAgc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5ICplbnRyeSkKKwkJCQkgICAgc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgKmVudHJ5KQogewogCXUxNiBvcCA9IEdMT0JBTF9WVFVfT1BfVlRVX0xPQURfUFVSR0U7CiAJdTE2IHJlZyA9IDA7Ci0JaW50IHJldDsKKwlpbnQgZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF92dHVfd2FpdChjaGlwKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBfbXY4OGU2eHh4X3Z0dV93YWl0KGNoaXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlpZiAoIWVudHJ5LT52YWxpZCkKIAkJZ290byBsb2FkcHVyZ2U7CiAKIAkvKiBXcml0ZSBwb3J0IG1lbWJlciB0YWdzICovCi0JcmV0ID0gbXY4OGU2eHh4X3Z0dV9kYXRhX3dyaXRlKGNoaXAsIGVudHJ5KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfdnR1X2RhdGFfd3JpdGUoY2hpcCwgZW50cnkpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19TVFUpKSB7CiAJCXJlZyA9IGVudHJ5LT5zaWQgJiBHTE9CQUxfVlRVX1NJRF9NQVNLOwotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfVlRVX1NJRCwKLQkJCQkJICAgcmVnKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX1ZUVV9TSUQsIHJlZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAotCWlmIChtdjg4ZTZ4eHhfaGFzX2ZpZF9yZWcoY2hpcCkpIHsKKwlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19HMV9WVFVfRklEKSkgewogCQlyZWcgPSBlbnRyeS0+ZmlkICYgR0xPQkFMX1ZUVV9GSURfTUFTSzsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9GSUQsCi0JCQkJCSAgIHJlZyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9WVFVfRklELCByZWcpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9IGVsc2UgaWYgKG12ODhlNnh4eF9udW1fZGF0YWJhc2VzKGNoaXApID09IDI1NikgewogCQkvKiBWVFUgREJOdW1bNzo0XSBhcmUgbG9jYXRlZCBpbiBWVFUgT3BlcmF0aW9uIDExOjgsIGFuZAogCQkgKiBWVFUgREJOdW1bMzowXSBhcmUgbG9jYXRlZCBpbiBWVFUgT3BlcmF0aW9uIDM6MApAQCAtMTQ5NCw0OCArMTQ5NCw0OSBAQAogCXJlZyA9IEdMT0JBTF9WVFVfVklEX1ZBTElEOwogbG9hZHB1cmdlOgogCXJlZyB8PSBlbnRyeS0+dmlkICYgR0xPQkFMX1ZUVV9WSURfTUFTSzsKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfVlRVX1ZJRCwgcmVnKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX1ZUVV9WSUQsIHJlZyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCXJldHVybiBfbXY4OGU2eHh4X3Z0dV9jbWQoY2hpcCwgb3ApOwogfQogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfc3R1X2dldG5leHQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCB1OCBzaWQsCi0JCQkJICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgKmVudHJ5KQorCQkJCSAgc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgKmVudHJ5KQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSBuZXh0ID0geyAwIH07Ci0JaW50IHJldDsKKwlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSBuZXh0ID0geyAwIH07CisJdTE2IHZhbDsKKwlpbnQgZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF92dHVfd2FpdChjaGlwKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBfbXY4OGU2eHh4X3Z0dV93YWl0KGNoaXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfVlRVX1NJRCwKLQkJCQkgICBzaWQgJiBHTE9CQUxfVlRVX1NJRF9NQVNLKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX1ZUVV9TSUQsCisJCQkJIHNpZCAmIEdMT0JBTF9WVFVfU0lEX01BU0spOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3Z0dV9jbWQoY2hpcCwgR0xPQkFMX1ZUVV9PUF9TVFVfR0VUX05FWFQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IF9tdjg4ZTZ4eHhfdnR1X2NtZChjaGlwLCBHTE9CQUxfVlRVX09QX1NUVV9HRVRfTkVYVCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9TSUQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9nMV9yZWFkKGNoaXAsIEdMT0JBTF9WVFVfU0lELCAmdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JbmV4dC5zaWQgPSByZXQgJiBHTE9CQUxfVlRVX1NJRF9NQVNLOworCW5leHQuc2lkID0gdmFsICYgR0xPQkFMX1ZUVV9TSURfTUFTSzsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9WSUQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9nMV9yZWFkKGNoaXAsIEdMT0JBTF9WVFVfVklELCAmdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JbmV4dC52YWxpZCA9ICEhKHJldCAmIEdMT0JBTF9WVFVfVklEX1ZBTElEKTsKKwluZXh0LnZhbGlkID0gISEodmFsICYgR0xPQkFMX1ZUVV9WSURfVkFMSUQpOwogCiAJaWYgKG5leHQudmFsaWQpIHsKLQkJcmV0ID0gbXY4OGU2eHh4X3N0dV9kYXRhX3JlYWQoY2hpcCwgJm5leHQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJCWVyciA9IG12ODhlNnh4eF9zdHVfZGF0YV9yZWFkKGNoaXAsICZuZXh0KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJKmVudHJ5ID0gbmV4dDsKQEAgLTE1NDMsMzMgKzE1NDQsMzMgQEAKIH0KIAogc3RhdGljIGludCBfbXY4OGU2eHh4X3N0dV9sb2FkcHVyZ2Uoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCSAgICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgKmVudHJ5KQorCQkJCSAgICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSAqZW50cnkpCiB7CiAJdTE2IHJlZyA9IDA7Ci0JaW50IHJldDsKKwlpbnQgZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF92dHVfd2FpdChjaGlwKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBfbXY4OGU2eHh4X3Z0dV93YWl0KGNoaXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlpZiAoIWVudHJ5LT52YWxpZCkKIAkJZ290byBsb2FkcHVyZ2U7CiAKIAkvKiBXcml0ZSBwb3J0IHN0YXRlcyAqLwotCXJldCA9IG12ODhlNnh4eF9zdHVfZGF0YV93cml0ZShjaGlwLCBlbnRyeSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X3N0dV9kYXRhX3dyaXRlKGNoaXAsIGVudHJ5KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJcmVnID0gR0xPQkFMX1ZUVV9WSURfVkFMSUQ7CiBsb2FkcHVyZ2U6Ci0JcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9WSUQsIHJlZyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9WVFVfVklELCByZWcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlyZWcgPSBlbnRyeS0+c2lkICYgR0xPQkFMX1ZUVV9TSURfTUFTSzsKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfVlRVX1NJRCwgcmVnKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX1ZUVV9TSUQsIHJlZyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCXJldHVybiBfbXY4OGU2eHh4X3Z0dV9jbWQoY2hpcCwgR0xPQkFMX1ZUVV9PUF9TVFVfTE9BRF9QVVJHRSk7CiB9CkBAIC0xNTgwLDcgKzE1ODEsOCBAQAogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGNoaXAtPmRzOwogCXUxNiB1cHBlcl9tYXNrOwogCXUxNiBmaWQ7Ci0JaW50IHJldDsKKwl1MTYgcmVnOworCWludCBlcnI7CiAKIAlpZiAobXY4OGU2eHh4X251bV9kYXRhYmFzZXMoY2hpcCkgPT0gNDA5NikKIAkJdXBwZXJfbWFzayA9IDB4ZmY7CkBAIC0xNTkwLDM3ICsxNTkyLDM1IEBACiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCS8qIFBvcnQncyBkZWZhdWx0IEZJRCBiaXRzIDM6MCBhcmUgbG9jYXRlZCBpbiByZWcgMHgwNiwgb2Zmc2V0IDEyICovCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9CQVNFX1ZMQU4pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgcG9ydCwgUE9SVF9CQVNFX1ZMQU4sICZyZWcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlmaWQgPSAocmV0ICYgUE9SVF9CQVNFX1ZMQU5fRklEXzNfMF9NQVNLKSA+PiAxMjsKKwlmaWQgPSAocmVnICYgUE9SVF9CQVNFX1ZMQU5fRklEXzNfMF9NQVNLKSA+PiAxMjsKIAogCWlmIChuZXcpIHsKLQkJcmV0ICY9IH5QT1JUX0JBU0VfVkxBTl9GSURfM18wX01BU0s7Ci0JCXJldCB8PSAoKm5ldyA8PCAxMikgJiBQT1JUX0JBU0VfVkxBTl9GSURfM18wX01BU0s7CisJCXJlZyAmPSB+UE9SVF9CQVNFX1ZMQU5fRklEXzNfMF9NQVNLOworCQlyZWcgfD0gKCpuZXcgPDwgMTIpICYgUE9SVF9CQVNFX1ZMQU5fRklEXzNfMF9NQVNLOwogCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0JBU0VfVkxBTiwKLQkJCQkJICAgcmV0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0JBU0VfVkxBTiwgcmVnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJLyogUG9ydCdzIGRlZmF1bHQgRklEIGJpdHMgMTE6NCBhcmUgbG9jYXRlZCBpbiByZWcgMHgwNSwgb2Zmc2V0IDAgKi8KLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0NPTlRST0xfMSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X3BvcnRfcmVhZChjaGlwLCBwb3J0LCBQT1JUX0NPTlRST0xfMSwgJnJlZyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCWZpZCB8PSAocmV0ICYgdXBwZXJfbWFzaykgPDwgNDsKKwlmaWQgfD0gKHJlZyAmIHVwcGVyX21hc2spIDw8IDQ7CiAKIAlpZiAobmV3KSB7Ci0JCXJldCAmPSB+dXBwZXJfbWFzazsKLQkJcmV0IHw9ICgqbmV3ID4+IDQpICYgdXBwZXJfbWFzazsKKwkJcmVnICY9IH51cHBlcl9tYXNrOworCQlyZWcgfD0gKCpuZXcgPj4gNCkgJiB1cHBlcl9tYXNrOwogCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0NPTlRST0xfMSwKLQkJCQkJICAgcmV0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0NPTlRST0xfMSwgcmVnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAKIAkJbmV0ZGV2X2RiZyhkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2LAogCQkJICAgIkZJRCAlZCAod2FzICVkKVxuIiwgKm5ldywgZmlkKTsKQEAgLTE2NDcsMTMgKzE2NDcsMTMgQEAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF9maWRfbmV3KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTE2ICpmaWQpCiB7CiAJREVDTEFSRV9CSVRNQVAoZmlkX2JpdG1hcCwgTVY4OEU2WFhYX05fRklEKTsKLQlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgdmxhbjsKKwlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSB2bGFuOwogCWludCBpLCBlcnI7CiAKIAliaXRtYXBfemVybyhmaWRfYml0bWFwLCBNVjg4RTZYWFhfTl9GSUQpOwogCiAJLyogU2V0IGV2ZXJ5IEZJRCBiaXQgdXNlZCBieSB0aGUgKHVuKWJyaWRnZWQgcG9ydHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+aW5mby0+bnVtX3BvcnRzOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgbXY4OGU2eHh4X251bV9wb3J0cyhjaGlwKTsgKytpKSB7CiAJCWVyciA9IF9tdjg4ZTZ4eHhfcG9ydF9maWRfZ2V0KGNoaXAsIGksIGZpZCk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwpAQCAtMTY4OSwxMCArMTY4OSwxMCBAQAogfQogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfdnR1X25ldyhzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHUxNiB2aWQsCi0JCQkgICAgICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgKmVudHJ5KQorCQkJICAgICAgc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgKmVudHJ5KQogewogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGNoaXAtPmRzOwotCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSB2bGFuID0geworCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5IHZsYW4gPSB7CiAJCS52YWxpZCA9IHRydWUsCiAJCS52aWQgPSB2aWQsCiAJfTsKQEAgLTE3MDMsMTQgKzE3MDMsMTQgQEAKIAkJcmV0dXJuIGVycjsKIAogCS8qIGV4Y2x1ZGUgYWxsIHBvcnRzIGV4Y2VwdCB0aGUgQ1BVIGFuZCBEU0EgcG9ydHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+aW5mby0+bnVtX3BvcnRzOyArK2kpCisJZm9yIChpID0gMDsgaSA8IG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCk7ICsraSkKIAkJdmxhbi5kYXRhW2ldID0gZHNhX2lzX2NwdV9wb3J0KGRzLCBpKSB8fCBkc2FfaXNfZHNhX3BvcnQoZHMsIGkpCiAJCQk/IEdMT0JBTF9WVFVfREFUQV9NRU1CRVJfVEFHX1VOTU9ESUZJRUQKIAkJCTogR0xPQkFMX1ZUVV9EQVRBX01FTUJFUl9UQUdfTk9OX01FTUJFUjsKIAogCWlmIChtdjg4ZTZ4eHhfNjA5N19mYW1pbHkoY2hpcCkgfHwgbXY4OGU2eHh4XzYxNjVfZmFtaWx5KGNoaXApIHx8CiAJICAgIG12ODhlNnh4eF82MzUxX2ZhbWlseShjaGlwKSB8fCBtdjg4ZTZ4eHhfNjM1Ml9mYW1pbHkoY2hpcCkpIHsKLQkJc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5IHZzdHA7CisJCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5IHZzdHA7CiAKIAkJLyogQWRkaW5nIGEgVlRVIGVudHJ5IHJlcXVpcmVzIGEgdmFsaWQgU1RVIGVudHJ5LiBBcyBWU1RQIGlzIG5vdAogCQkgKiBpbXBsZW1lbnRlZCwgb25seSBvbmUgU1RVIGVudHJ5IGlzIG5lZWRlZCB0byBjb3ZlciBhbGwgVlRVCkBAIC0xNzM3LDcgKzE3MzcsNyBAQAogfQogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfdnR1X2dldChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHUxNiB2aWQsCi0JCQkgICAgICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgKmVudHJ5LCBib29sIGNyZWF0KQorCQkJICAgICAgc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgKmVudHJ5LCBib29sIGNyZWF0KQogewogCWludCBlcnI7CiAKQEAgLTE3NjgsOCArMTc2OCw4IEBACiBzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X2NoZWNrX2h3X3ZsYW4oc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCQkJdTE2IHZpZF9iZWdpbiwgdTE2IHZpZF9lbmQpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7Ci0Jc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5IHZsYW47CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CisJc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgdmxhbjsKIAlpbnQgaSwgZXJyOwogCiAJaWYgKCF2aWRfYmVnaW4pCkBAIC0xNzkyLDcgKzE3OTIsNyBAQAogCQlpZiAodmxhbi52aWQgPiB2aWRfZW5kKQogCQkJYnJlYWs7CiAKLQkJZm9yIChpID0gMDsgaSA8IGNoaXAtPmluZm8tPm51bV9wb3J0czsgKytpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApOyArK2kpIHsKIAkJCWlmIChkc2FfaXNfZHNhX3BvcnQoZHMsIGkpIHx8IGRzYV9pc19jcHVfcG9ydChkcywgaSkpCiAJCQkJY29udGludWU7CiAKQEAgLTE4MjksMjkgKzE4MjksMjkgQEAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3BvcnRfdmxhbl9maWx0ZXJpbmcoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCQkJIGJvb2wgdmxhbl9maWx0ZXJpbmcpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJdTE2IG9sZCwgbmV3ID0gdmxhbl9maWx0ZXJpbmcgPyBQT1JUX0NPTlRST0xfMl84MDIxUV9TRUNVUkUgOgogCQlQT1JUX0NPTlRST0xfMl84MDIxUV9ESVNBQkxFRDsKLQlpbnQgcmV0OworCXUxNiByZWc7CisJaW50IGVycjsKIAogCWlmICghbXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19WVFUpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0NPTlRST0xfMik7Ci0JaWYgKHJldCA8IDApCisJZXJyID0gbXY4OGU2eHh4X3BvcnRfcmVhZChjaGlwLCBwb3J0LCBQT1JUX0NPTlRST0xfMiwgJnJlZyk7CisJaWYgKGVycikKIAkJZ290byB1bmxvY2s7CiAKLQlvbGQgPSByZXQgJiBQT1JUX0NPTlRST0xfMl84MDIxUV9NQVNLOworCW9sZCA9IHJlZyAmIFBPUlRfQ09OVFJPTF8yXzgwMjFRX01BU0s7CiAKIAlpZiAobmV3ICE9IG9sZCkgewotCQlyZXQgJj0gflBPUlRfQ09OVFJPTF8yXzgwMjFRX01BU0s7Ci0JCXJldCB8PSBuZXcgJiBQT1JUX0NPTlRST0xfMl84MDIxUV9NQVNLOworCQlyZWcgJj0gflBPUlRfQ09OVFJPTF8yXzgwMjFRX01BU0s7CisJCXJlZyB8PSBuZXcgJiBQT1JUX0NPTlRST0xfMl84MDIxUV9NQVNLOwogCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0NPTlRST0xfMiwKLQkJCQkJICAgcmV0KTsKLQkJaWYgKHJldCA8IDApCisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfQ09OVFJPTF8yLCByZWcpOworCQlpZiAoZXJyKQogCQkJZ290byB1bmxvY2s7CiAKIAkJbmV0ZGV2X2RiZyhkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2LCAiODAyLjFRIE1vZGUgJXMgKHdhcyAlcylcbiIsCkBAIC0xODU5LDExICsxODU5LDExIEBACiAJCQkgICBtdjg4ZTZ4eHhfcG9ydF84MDIxcV9tb2RlX25hbWVzW29sZF0pOwogCX0KIAotCXJldCA9IDA7CisJZXJyID0gMDsKIHVubG9jazoKIAltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludApAQCAtMTg3MSw3ICsxODcxLDcgQEAKIAkJCSAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X3ZsYW4gKnZsYW4sCiAJCQkgICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJaW50IGVycjsKIAogCWlmICghbXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19WVFUpKQpAQCAtMTg5NCw3ICsxODk0LDcgQEAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF9wb3J0X3ZsYW5fYWRkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvcnQsCiAJCQkJICAgIHUxNiB2aWQsIGJvb2wgdW50YWdnZWQpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5IHZsYW47CisJc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgdmxhbjsKIAlpbnQgZXJyOwogCiAJZXJyID0gX212ODhlNnh4eF92dHVfZ2V0KGNoaXAsIHZpZCwgJnZsYW4sIHRydWUpOwpAQCAtMTkxMiw3ICsxOTEyLDcgQEAKIAkJCQkgICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF92bGFuICp2bGFuLAogCQkJCSAgICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlib29sIHVudGFnZ2VkID0gdmxhbi0+ZmxhZ3MgJiBCUklER0VfVkxBTl9JTkZPX1VOVEFHR0VEOwogCWJvb2wgcHZpZCA9IHZsYW4tPmZsYWdzICYgQlJJREdFX1ZMQU5fSU5GT19QVklEOwogCXUxNiB2aWQ7CkBAIC0xOTM5LDcgKzE5MzksNyBAQAogCQkJCSAgICBpbnQgcG9ydCwgdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBjaGlwLT5kczsKLQlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgdmxhbjsKKwlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSB2bGFuOwogCWludCBpLCBlcnI7CiAKIAllcnIgPSBfbXY4OGU2eHh4X3Z0dV9nZXQoY2hpcCwgdmlkLCAmdmxhbiwgZmFsc2UpOwpAQCAtMTk1NCw3ICsxOTU0LDcgQEAKIAogCS8qIGtlZXAgdGhlIFZMQU4gdW5sZXNzIGFsbCBwb3J0cyBhcmUgZXhjbHVkZWQgKi8KIAl2bGFuLnZhbGlkID0gZmFsc2U7Ci0JZm9yIChpID0gMDsgaSA8IGNoaXAtPmluZm8tPm51bV9wb3J0czsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCk7ICsraSkgewogCQlpZiAoZHNhX2lzX2NwdV9wb3J0KGRzLCBpKSB8fCBkc2FfaXNfZHNhX3BvcnQoZHMsIGkpKQogCQkJY29udGludWU7CiAKQEAgLTE5NzQsNyArMTk3NCw3IEBACiBzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X3ZsYW5fZGVsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF92bGFuICp2bGFuKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCXUxNiBwdmlkLCB2aWQ7CiAJaW50IGVyciA9IDA7CiAKQEAgLTIwMDgsMTQgKzIwMDgsMTMgQEAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF9hdHVfbWFjX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKIAkJCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcikKIHsKLQlpbnQgaSwgcmV0OworCWludCBpLCBlcnI7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKAotCQkJY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0FUVV9NQUNfMDEgKyBpLAotCQkJKGFkZHJbaSAqIDJdIDw8IDgpIHwgYWRkcltpICogMiArIDFdKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0FUVV9NQUNfMDEgKyBpLAorCQkJCQkgKGFkZHJbaSAqIDJdIDw8IDgpIHwgYWRkcltpICogMiArIDFdKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0yMDI0LDE1ICsyMDIzLDE2IEBACiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfYXR1X21hY19yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKIAkJCQkgICB1bnNpZ25lZCBjaGFyICphZGRyKQogewotCWludCBpLCByZXQ7CisJdTE2IHZhbDsKKwlpbnQgaSwgZXJyOwogCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsCi0JCQkJCSAgR0xPQkFMX0FUVV9NQUNfMDEgKyBpKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCQlhZGRyW2kgKiAyXSA9IHJldCA+PiA4OwotCQlhZGRyW2kgKiAyICsgMV0gPSByZXQgJiAweGZmOworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfQVRVX01BQ18wMSArIGksICZ2YWwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlhZGRyW2kgKiAyXSA9IHZhbCA+PiA4OworCQlhZGRyW2kgKiAyICsgMV0gPSB2YWwgJiAweGZmOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjA1OCwxMiArMjA1OCw0OCBAQAogCXJldHVybiBfbXY4OGU2eHh4X2F0dV9jbWQoY2hpcCwgZW50cnktPmZpZCwgR0xPQkFMX0FUVV9PUF9MT0FEX0RCKTsKIH0KIAotc3RhdGljIGludCBfbXY4OGU2eHh4X3BvcnRfZmRiX2xvYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcG9ydCwKLQkJCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwgdTE2IHZpZCwKLQkJCQkgICAgdTggc3RhdGUpCitzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfYXR1X2dldG5leHQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCB1MTYgZmlkLAorCQkJCSAgc3RydWN0IG12ODhlNnh4eF9hdHVfZW50cnkgKmVudHJ5KTsKKworc3RhdGljIGludCBtdjg4ZTZ4eHhfYXR1X2dldChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBmaWQsCisJCQkgICAgIGNvbnN0IHU4ICphZGRyLCBzdHJ1Y3QgbXY4OGU2eHh4X2F0dV9lbnRyeSAqZW50cnkpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9hdHVfZW50cnkgZW50cnkgPSB7IDAgfTsKLQlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgdmxhbjsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2F0dV9lbnRyeSBuZXh0OworCWludCBlcnI7CisKKwlldGhfYnJvYWRjYXN0X2FkZHIobmV4dC5tYWMpOworCisJZXJyID0gX212ODhlNnh4eF9hdHVfbWFjX3dyaXRlKGNoaXAsIG5leHQubWFjKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZG8geworCQllcnIgPSBfbXY4OGU2eHh4X2F0dV9nZXRuZXh0KGNoaXAsIGZpZCwgJm5leHQpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAobmV4dC5zdGF0ZSA9PSBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVU5VU0VEKQorCQkJYnJlYWs7CisKKwkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobmV4dC5tYWMsIGFkZHIpKSB7CisJCQkqZW50cnkgPSBuZXh0OworCQkJcmV0dXJuIDA7CisJCX0KKwl9IHdoaWxlICghaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIobmV4dC5tYWMpKTsKKworCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKCplbnRyeSkpOworCWVudHJ5LT5maWQgPSBmaWQ7CisJZXRoZXJfYWRkcl9jb3B5KGVudHJ5LT5tYWMsIGFkZHIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X3BvcnRfZGJfbG9hZF9wdXJnZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwb3J0LAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLCB1MTYgdmlkLAorCQkJCQl1OCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSB2bGFuOworCXN0cnVjdCBtdjg4ZTZ4eHhfYXR1X2VudHJ5IGVudHJ5OwogCWludCBlcnI7CiAKIAkvKiBOdWxsIFZMQU4gSUQgY29ycmVzcG9uZHMgdG8gdGhlIHBvcnQgcHJpdmF0ZSBkYXRhYmFzZSAqLwpAQCAtMjA3NCwxMiArMjExMCwxOCBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQllbnRyeS5maWQgPSB2bGFuLmZpZDsKLQllbnRyeS5zdGF0ZSA9IHN0YXRlOwotCWV0aGVyX2FkZHJfY29weShlbnRyeS5tYWMsIGFkZHIpOwotCWlmIChzdGF0ZSAhPSBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVU5VU0VEKSB7Ci0JCWVudHJ5LnRydW5rID0gZmFsc2U7Ci0JCWVudHJ5LnBvcnR2X3RydW5raWQgPSBCSVQocG9ydCk7CisJZXJyID0gbXY4OGU2eHh4X2F0dV9nZXQoY2hpcCwgdmxhbi5maWQsIGFkZHIsICZlbnRyeSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIFB1cmdlIHRoZSBBVFUgZW50cnkgb25seSBpZiBubyBwb3J0IGlzIHVzaW5nIGl0IGFueW1vcmUgKi8KKwlpZiAoc3RhdGUgPT0gR0xPQkFMX0FUVV9EQVRBX1NUQVRFX1VOVVNFRCkgeworCQllbnRyeS5wb3J0dl90cnVua2lkICY9IH5CSVQocG9ydCk7CisJCWlmICghZW50cnkucG9ydHZfdHJ1bmtpZCkKKwkJCWVudHJ5LnN0YXRlID0gR0xPQkFMX0FUVV9EQVRBX1NUQVRFX1VOVVNFRDsKKwl9IGVsc2UgeworCQllbnRyeS5wb3J0dl90cnVua2lkIHw9IEJJVChwb3J0KTsKKwkJZW50cnkuc3RhdGUgPSBzdGF0ZTsKIAl9CiAKIAlyZXR1cm4gX212ODhlNnh4eF9hdHVfbG9hZChjaGlwLCAmZW50cnkpOwpAQCAtMjA5OSw2MSArMjE0MSw1OSBAQAogCQkJCSAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCiAJCQkJICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCiB7Ci0JaW50IHN0YXRlID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZmRiLT5hZGRyKSA/Ci0JCUdMT0JBTF9BVFVfREFUQV9TVEFURV9NQ19TVEFUSUMgOgotCQlHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVUNfU1RBVElDOwotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwotCWlmIChfbXY4OGU2eHh4X3BvcnRfZmRiX2xvYWQoY2hpcCwgcG9ydCwgZmRiLT5hZGRyLCBmZGItPnZpZCwgc3RhdGUpKQotCQluZXRkZXZfZXJyKGRzLT5wb3J0c1twb3J0XS5uZXRkZXYsCi0JCQkgICAiZmFpbGVkIHRvIGxvYWQgTUFDIGFkZHJlc3NcbiIpOworCWlmIChtdjg4ZTZ4eHhfcG9ydF9kYl9sb2FkX3B1cmdlKGNoaXAsIHBvcnQsIGZkYi0+YWRkciwgZmRiLT52aWQsCisJCQkJCSBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVUNfU1RBVElDKSkKKwkJbmV0ZGV2X2Vycihkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2LCAiZmFpbGVkIHRvIGxvYWQgdW5pY2FzdCBNQUMgYWRkcmVzc1xuIik7CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3BvcnRfZmRiX2RlbChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCSAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYikKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKLQlpbnQgcmV0OworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OworCWludCBlcnI7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JcmV0ID0gX212ODhlNnh4eF9wb3J0X2ZkYl9sb2FkKGNoaXAsIHBvcnQsIGZkYi0+YWRkciwgZmRiLT52aWQsCi0JCQkJICAgICAgIEdMT0JBTF9BVFVfREFUQV9TVEFURV9VTlVTRUQpOworCWVyciA9IG12ODhlNnh4eF9wb3J0X2RiX2xvYWRfcHVyZ2UoY2hpcCwgcG9ydCwgZmRiLT5hZGRyLCBmZGItPnZpZCwKKwkJCQkJICAgR0xPQkFMX0FUVV9EQVRBX1NUQVRFX1VOVVNFRCk7CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF9hdHVfZ2V0bmV4dChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHUxNiBmaWQsCiAJCQkJICBzdHJ1Y3QgbXY4OGU2eHh4X2F0dV9lbnRyeSAqZW50cnkpCiB7CiAJc3RydWN0IG12ODhlNnh4eF9hdHVfZW50cnkgbmV4dCA9IHsgMCB9OwotCWludCByZXQ7CisJdTE2IHZhbDsKKwlpbnQgZXJyOwogCiAJbmV4dC5maWQgPSBmaWQ7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X2F0dV93YWl0KGNoaXApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IF9tdjg4ZTZ4eHhfYXR1X3dhaXQoY2hpcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfYXR1X2NtZChjaGlwLCBmaWQsIEdMT0JBTF9BVFVfT1BfR0VUX05FWFRfREIpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IF9tdjg4ZTZ4eHhfYXR1X2NtZChjaGlwLCBmaWQsIEdMT0JBTF9BVFVfT1BfR0VUX05FWFRfREIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X2F0dV9tYWNfcmVhZChjaGlwLCBuZXh0Lm1hYyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gX212ODhlNnh4eF9hdHVfbWFjX3JlYWQoY2hpcCwgbmV4dC5tYWMpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9BVFVfREFUQSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX0FUVV9EQVRBLCAmdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JbmV4dC5zdGF0ZSA9IHJldCAmIEdMT0JBTF9BVFVfREFUQV9TVEFURV9NQVNLOworCW5leHQuc3RhdGUgPSB2YWwgJiBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfTUFTSzsKIAlpZiAobmV4dC5zdGF0ZSAhPSBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVU5VU0VEKSB7CiAJCXVuc2lnbmVkIGludCBtYXNrLCBzaGlmdDsKIAotCQlpZiAocmV0ICYgR0xPQkFMX0FUVV9EQVRBX1RSVU5LKSB7CisJCWlmICh2YWwgJiBHTE9CQUxfQVRVX0RBVEFfVFJVTkspIHsKIAkJCW5leHQudHJ1bmsgPSB0cnVlOwogCQkJbWFzayA9IEdMT0JBTF9BVFVfREFUQV9UUlVOS19JRF9NQVNLOwogCQkJc2hpZnQgPSBHTE9CQUxfQVRVX0RBVEFfVFJVTktfSURfU0hJRlQ7CkBAIC0yMTYzLDE3ICsyMjAzLDE3IEBACiAJCQlzaGlmdCA9IEdMT0JBTF9BVFVfREFUQV9QT1JUX1ZFQ1RPUl9TSElGVDsKIAkJfQogCi0JCW5leHQucG9ydHZfdHJ1bmtpZCA9IChyZXQgJiBtYXNrKSA+PiBzaGlmdDsKKwkJbmV4dC5wb3J0dl90cnVua2lkID0gKHZhbCAmIG1hc2spID4+IHNoaWZ0OwogCX0KIAogCSplbnRyeSA9IG5leHQ7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX212ODhlNnh4eF9wb3J0X2ZkYl9kdW1wX29uZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJCXUxNiBmaWQsIHUxNiB2aWQsIGludCBwb3J0LAotCQkJCQlzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiLAotCQkJCQlpbnQgKCpjYikoc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaikpCitzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X2RiX2R1bXBfZmlkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKKwkJCQkgICAgICB1MTYgZmlkLCB1MTYgdmlkLCBpbnQgcG9ydCwKKwkJCQkgICAgICBzdHJ1Y3Qgc3dpdGNoZGV2X29iaiAqb2JqLAorCQkJCSAgICAgIGludCAoKmNiKShzdHJ1Y3Qgc3dpdGNoZGV2X29iaiAqb2JqKSkKIHsKIAlzdHJ1Y3QgbXY4OGU2eHh4X2F0dV9lbnRyeSBhZGRyID0gewogCQkubWFjID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH0sCkBAIC0yMTg3LDcyICsyMjI3LDk4IEBACiAJZG8gewogCQllcnIgPSBfbXY4OGU2eHh4X2F0dV9nZXRuZXh0KGNoaXAsIGZpZCwgJmFkZHIpOwogCQlpZiAoZXJyKQotCQkJYnJlYWs7CisJCQlyZXR1cm4gZXJyOwogCiAJCWlmIChhZGRyLnN0YXRlID09IEdMT0JBTF9BVFVfREFUQV9TVEFURV9VTlVTRUQpCiAJCQlicmVhazsKIAotCQlpZiAoIWFkZHIudHJ1bmsgJiYgYWRkci5wb3J0dl90cnVua2lkICYgQklUKHBvcnQpKSB7Ci0JCQlib29sIGlzX3N0YXRpYyA9IGFkZHIuc3RhdGUgPT0KLQkJCQkoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoYWRkci5tYWMpID8KLQkJCQkgR0xPQkFMX0FUVV9EQVRBX1NUQVRFX01DX1NUQVRJQyA6Ci0JCQkJIEdMT0JBTF9BVFVfREFUQV9TVEFURV9VQ19TVEFUSUMpOworCQlpZiAoYWRkci50cnVuayB8fCAoYWRkci5wb3J0dl90cnVua2lkICYgQklUKHBvcnQpKSA9PSAwKQorCQkJY29udGludWU7CiAKKwkJaWYgKG9iai0+aWQgPT0gU1dJVENIREVWX09CSl9JRF9QT1JUX0ZEQikgeworCQkJc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYjsKKworCQkJaWYgKCFpc191bmljYXN0X2V0aGVyX2FkZHIoYWRkci5tYWMpKQorCQkJCWNvbnRpbnVlOworCisJCQlmZGIgPSBTV0lUQ0hERVZfT0JKX1BPUlRfRkRCKG9iaik7CiAJCQlmZGItPnZpZCA9IHZpZDsKIAkJCWV0aGVyX2FkZHJfY29weShmZGItPmFkZHIsIGFkZHIubWFjKTsKLQkJCWZkYi0+bmRtX3N0YXRlID0gaXNfc3RhdGljID8gTlVEX05PQVJQIDogTlVEX1JFQUNIQUJMRTsKKwkJCWlmIChhZGRyLnN0YXRlID09IEdMT0JBTF9BVFVfREFUQV9TVEFURV9VQ19TVEFUSUMpCisJCQkJZmRiLT5uZG1fc3RhdGUgPSBOVURfTk9BUlA7CisJCQllbHNlCisJCQkJZmRiLT5uZG1fc3RhdGUgPSBOVURfUkVBQ0hBQkxFOworCQl9IGVsc2UgaWYgKG9iai0+aWQgPT0gU1dJVENIREVWX09CSl9JRF9QT1JUX01EQikgeworCQkJc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9tZGIgKm1kYjsKIAotCQkJZXJyID0gY2IoJmZkYi0+b2JqKTsKLQkJCWlmIChlcnIpCi0JCQkJYnJlYWs7CisJCQlpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGFkZHIubWFjKSkKKwkJCQljb250aW51ZTsKKworCQkJbWRiID0gU1dJVENIREVWX09CSl9QT1JUX01EQihvYmopOworCQkJbWRiLT52aWQgPSB2aWQ7CisJCQlldGhlcl9hZGRyX2NvcHkobWRiLT5hZGRyLCBhZGRyLm1hYyk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJCX0KKworCQllcnIgPSBjYihvYmopOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9IHdoaWxlICghaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoYWRkci5tYWMpKTsKIAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X3BvcnRfZGJfZHVtcChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwb3J0LAorCQkJCSAgc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaiwKKwkJCQkgIGludCAoKmNiKShzdHJ1Y3Qgc3dpdGNoZGV2X29iaiAqb2JqKSkKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSB2bGFuID0geworCQkudmlkID0gR0xPQkFMX1ZUVV9WSURfTUFTSywgLyogYWxsIG9uZXMgKi8KKwl9OworCXUxNiBmaWQ7CisJaW50IGVycjsKKworCS8qIER1bXAgcG9ydCdzIGRlZmF1bHQgRmlsdGVyaW5nIEluZm9ybWF0aW9uIERhdGFiYXNlIChWTEFOIElEIDApICovCisJZXJyID0gX212ODhlNnh4eF9wb3J0X2ZpZF9nZXQoY2hpcCwgcG9ydCwgJmZpZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IG12ODhlNnh4eF9wb3J0X2RiX2R1bXBfZmlkKGNoaXAsIGZpZCwgMCwgcG9ydCwgb2JqLCBjYik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIER1bXAgVkxBTnMnIEZpbHRlcmluZyBJbmZvcm1hdGlvbiBEYXRhYmFzZXMgKi8KKwllcnIgPSBfbXY4OGU2eHh4X3Z0dV92aWRfd3JpdGUoY2hpcCwgdmxhbi52aWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlkbyB7CisJCWVyciA9IF9tdjg4ZTZ4eHhfdnR1X2dldG5leHQoY2hpcCwgJnZsYW4pOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAoIXZsYW4udmFsaWQpCisJCQlicmVhazsKKworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF9kYl9kdW1wX2ZpZChjaGlwLCB2bGFuLmZpZCwgdmxhbi52aWQsIHBvcnQsCisJCQkJCQkgb2JqLCBjYik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0gd2hpbGUgKHZsYW4udmlkIDwgR0xPQkFMX1ZUVV9WSURfTUFTSyk7CisKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X2ZkYl9kdW1wKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJICAgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYiwKIAkJCQkgICBpbnQgKCpjYikoc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaikpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7Ci0Jc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5IHZsYW4gPSB7Ci0JCS52aWQgPSBHTE9CQUxfVlRVX1ZJRF9NQVNLLCAvKiBhbGwgb25lcyAqLwotCX07Ci0JdTE2IGZpZDsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlpbnQgZXJyOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwotCi0JLyogRHVtcCBwb3J0J3MgZGVmYXVsdCBGaWx0ZXJpbmcgSW5mb3JtYXRpb24gRGF0YWJhc2UgKFZMQU4gSUQgMCkgKi8KLQllcnIgPSBfbXY4OGU2eHh4X3BvcnRfZmlkX2dldChjaGlwLCBwb3J0LCAmZmlkKTsKLQlpZiAoZXJyKQotCQlnb3RvIHVubG9jazsKLQotCWVyciA9IF9tdjg4ZTZ4eHhfcG9ydF9mZGJfZHVtcF9vbmUoY2hpcCwgZmlkLCAwLCBwb3J0LCBmZGIsIGNiKTsKLQlpZiAoZXJyKQotCQlnb3RvIHVubG9jazsKLQotCS8qIER1bXAgVkxBTnMnIEZpbHRlcmluZyBJbmZvcm1hdGlvbiBEYXRhYmFzZXMgKi8KLQllcnIgPSBfbXY4OGU2eHh4X3Z0dV92aWRfd3JpdGUoY2hpcCwgdmxhbi52aWQpOwotCWlmIChlcnIpCi0JCWdvdG8gdW5sb2NrOwotCi0JZG8gewotCQllcnIgPSBfbXY4OGU2eHh4X3Z0dV9nZXRuZXh0KGNoaXAsICZ2bGFuKTsKLQkJaWYgKGVycikKLQkJCWJyZWFrOwotCi0JCWlmICghdmxhbi52YWxpZCkKLQkJCWJyZWFrOwotCi0JCWVyciA9IF9tdjg4ZTZ4eHhfcG9ydF9mZGJfZHVtcF9vbmUoY2hpcCwgdmxhbi5maWQsIHZsYW4udmlkLAotCQkJCQkJICAgcG9ydCwgZmRiLCBjYik7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQl9IHdoaWxlICh2bGFuLnZpZCA8IEdMT0JBTF9WVFVfVklEX01BU0spOwotCi11bmxvY2s6CisJZXJyID0gbXY4OGU2eHh4X3BvcnRfZGJfZHVtcChjaGlwLCBwb3J0LCAmZmRiLT5vYmosIGNiKTsKIAltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAogCXJldHVybiBlcnI7CkBAIC0yMjYxLDcgKzIzMjcsNyBAQAogc3RhdGljIGludCBtdjg4ZTZ4eHhfcG9ydF9icmlkZ2Vfam9pbihzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpicmlkZ2UpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJaW50IGksIGVyciA9IDA7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CkBAIC0yMjY5LDcgKzIzMzUsNyBAQAogCS8qIEFzc2lnbiB0aGUgYnJpZGdlIGFuZCByZW1hcCBlYWNoIHBvcnQncyBWTEFOVGFibGUgKi8KIAljaGlwLT5wb3J0c1twb3J0XS5icmlkZ2VfZGV2ID0gYnJpZGdlOwogCi0JZm9yIChpID0gMDsgaSA8IGNoaXAtPmluZm8tPm51bV9wb3J0czsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCk7ICsraSkgewogCQlpZiAoY2hpcC0+cG9ydHNbaV0uYnJpZGdlX2RldiA9PSBicmlkZ2UpIHsKIAkJCWVyciA9IF9tdjg4ZTZ4eHhfcG9ydF9iYXNlZF92bGFuX21hcChjaGlwLCBpKTsKIAkJCWlmIChlcnIpCkBAIC0yMjg0LDcgKzIzNTAsNyBAQAogCiBzdGF0aWMgdm9pZCBtdjg4ZTZ4eHhfcG9ydF9icmlkZ2VfbGVhdmUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqYnJpZGdlID0gY2hpcC0+cG9ydHNbcG9ydF0uYnJpZGdlX2RldjsKIAlpbnQgaTsKIApAQCAtMjI5Myw3ICsyMzU5LDcgQEAKIAkvKiBVbmFzc2lnbiB0aGUgYnJpZGdlIGFuZCByZW1hcCBlYWNoIHBvcnQncyBWTEFOVGFibGUgKi8KIAljaGlwLT5wb3J0c1twb3J0XS5icmlkZ2VfZGV2ID0gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5pbmZvLT5udW1fcG9ydHM7ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgbXY4OGU2eHh4X251bV9wb3J0cyhjaGlwKTsgKytpKQogCQlpZiAoaSA9PSBwb3J0IHx8IGNoaXAtPnBvcnRzW2ldLmJyaWRnZV9kZXYgPT0gYnJpZGdlKQogCQkJaWYgKF9tdjg4ZTZ4eHhfcG9ydF9iYXNlZF92bGFuX21hcChjaGlwLCBpKSkKIAkJCQluZXRkZXZfd2Fybihkcy0+cG9ydHNbaV0ubmV0ZGV2LApAQCAtMjMwMiw1NyArMjM2OCwyNiBAQAogCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogfQogCi1zdGF0aWMgaW50IF9tdjg4ZTZ4eHhfbWRpb19wYWdlX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgICAgICBpbnQgcG9ydCwgaW50IHBhZ2UsIGludCByZWcsIGludCB2YWwpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IG12ODhlNnh4eF9tZGlvX3dyaXRlX2luZGlyZWN0KGNoaXAsIHBvcnQsIDB4MTYsIHBhZ2UpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIHJlc3RvcmVfcGFnZV8wOwotCi0JcmV0ID0gbXY4OGU2eHh4X21kaW9fd3JpdGVfaW5kaXJlY3QoY2hpcCwgcG9ydCwgcmVnLCB2YWwpOwotcmVzdG9yZV9wYWdlXzA6Ci0JbXY4OGU2eHh4X21kaW9fd3JpdGVfaW5kaXJlY3QoY2hpcCwgcG9ydCwgMHgxNiwgMHgwKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX212ODhlNnh4eF9tZGlvX3BhZ2VfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJICAgICBpbnQgcG9ydCwgaW50IHBhZ2UsIGludCByZWcpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IG12ODhlNnh4eF9tZGlvX3dyaXRlX2luZGlyZWN0KGNoaXAsIHBvcnQsIDB4MTYsIHBhZ2UpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIHJlc3RvcmVfcGFnZV8wOwotCi0JcmV0ID0gbXY4OGU2eHh4X21kaW9fcmVhZF9pbmRpcmVjdChjaGlwLCBwb3J0LCByZWcpOwotcmVzdG9yZV9wYWdlXzA6Ci0JbXY4OGU2eHh4X21kaW9fd3JpdGVfaW5kaXJlY3QoY2hpcCwgcG9ydCwgMHgxNiwgMHgwKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3N3aXRjaF9yZXNldChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCiB7CiAJYm9vbCBwcHVfYWN0aXZlID0gbXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19QUFVfQUNUSVZFKTsKIAl1MTYgaXNfcmVzZXQgPSAocHB1X2FjdGl2ZSA/IDB4ODgwMCA6IDB4YzgwMCk7CiAJc3RydWN0IGdwaW9fZGVzYyAqZ3Bpb2QgPSBjaGlwLT5yZXNldDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0JaW50IHJldDsKKwl1MTYgcmVnOworCWludCBlcnI7CiAJaW50IGk7CiAKIAkvKiBTZXQgYWxsIHBvcnRzIHRvIHRoZSBkaXNhYmxlZCBzdGF0ZS4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+aW5mby0+bnVtX3BvcnRzOyBpKyspIHsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChpKSwgUE9SVF9DT05UUk9MKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCWZvciAoaSA9IDA7IGkgPCBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApOyBpKyspIHsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfcmVhZChjaGlwLCBpLCBQT1JUX0NPTlRST0wsICZyZWcpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChpKSwgUE9SVF9DT05UUk9MLAotCQkJCQkgICByZXQgJiAweGZmZmMpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgaSwgUE9SVF9DT05UUk9MLAorCQkJCQkgICByZWcgJiAweGZmZmMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9CiAKIAkvKiBXYWl0IGZvciB0cmFuc21pdCBxdWV1ZXMgdG8gZHJhaW4uICovCkBAIC0yMzcxLDY1ICsyNDA2LDUzIEBACiAJICogdGhyb3VnaCBnbG9iYWwgcmVnaXN0ZXJzIDB4MTggYW5kIDB4MTkuCiAJICovCiAJaWYgKHBwdV9hY3RpdmUpCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIDB4MDQsIDB4YzAwMCk7CisJCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCAweDA0LCAweGMwMDApOwogCWVsc2UKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgMHgwNCwgMHhjNDAwKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgMHgwNCwgMHhjNDAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJLyogV2FpdCB1cCB0byBvbmUgc2Vjb25kIGZvciByZXNldCB0byBjb21wbGV0ZS4gKi8KIAl0aW1lb3V0ID0gamlmZmllcyArIDEgKiBIWjsKIAl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfR0xPQkFMLCAweDAwKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCAweDAwLCAmcmVnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAKLQkJaWYgKChyZXQgJiBpc19yZXNldCkgPT0gaXNfcmVzZXQpCisJCWlmICgocmVnICYgaXNfcmVzZXQpID09IGlzX3Jlc2V0KQogCQkJYnJlYWs7CiAJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKIAl9CiAJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCi0JCXJldCA9IC1FVElNRURPVVQ7CisJCWVyciA9IC1FVElNRURPVVQ7CiAJZWxzZQotCQlyZXQgPSAwOworCQllcnIgPSAwOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG12ODhlNnh4eF9wb3dlcl9vbl9zZXJkZXMoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQorc3RhdGljIGludCBtdjg4ZTZ4eHhfc2VyZGVzX3Bvd2VyX29uKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKIHsKLQlpbnQgcmV0OworCXUxNiB2YWw7CisJaW50IGVycjsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfbWRpb19wYWdlX3JlYWQoY2hpcCwgUkVHX0ZJQkVSX1NFUkRFUywKLQkJCQkJUEFHRV9GSUJFUl9TRVJERVMsIE1JSV9CTUNSKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkvKiBDbGVhciBQb3dlciBEb3duIGJpdCAqLworCWVyciA9IG12ODhlNnh4eF9zZXJkZXNfcmVhZChjaGlwLCBNSUlfQk1DUiwgJnZhbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCWlmIChyZXQgJiBCTUNSX1BET1dOKSB7Ci0JCXJldCAmPSB+Qk1DUl9QRE9XTjsKLQkJcmV0ID0gX212ODhlNnh4eF9tZGlvX3BhZ2Vfd3JpdGUoY2hpcCwgUkVHX0ZJQkVSX1NFUkRFUywKLQkJCQkJCSBQQUdFX0ZJQkVSX1NFUkRFUywgTUlJX0JNQ1IsCi0JCQkJCQkgcmV0KTsKKwlpZiAodmFsICYgQk1DUl9QRE9XTikgeworCQl2YWwgJj0gfkJNQ1JfUERPV047CisJCWVyciA9IG12ODhlNnh4eF9zZXJkZXNfd3JpdGUoY2hpcCwgTUlJX0JNQ1IsIHZhbCk7CiAJfQogCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfcG9ydF9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvcnQsCi0JCQkgICAgICAgaW50IHJlZywgdTE2ICp2YWwpCi17Ci0JaW50IGFkZHIgPSBjaGlwLT5pbmZvLT5wb3J0X2Jhc2VfYWRkciArIHBvcnQ7Ci0KLQlpZiAocG9ydCA+PSBjaGlwLT5pbmZvLT5udW1fcG9ydHMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIG12ODhlNnh4eF9yZWFkKGNoaXAsIGFkZHIsIHJlZywgdmFsKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9zZXR1cF9wb3J0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvcnQpCiB7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gY2hpcC0+ZHM7Ci0JaW50IHJldDsKKwlpbnQgZXJyOwogCXUxNiByZWc7CiAKIAlpZiAobXY4OGU2eHh4XzYzNTJfZmFtaWx5KGNoaXApIHx8IG12ODhlNnh4eF82MzUxX2ZhbWlseShjaGlwKSB8fApAQCAtMjQ0Miw3ICsyNDY1LDcgQEAKIAkJICogYW5kIGFsbCBEU0EgcG9ydHMgdG8gdGhlaXIgbWF4aW11bSBiYW5kd2lkdGggYW5kCiAJCSAqIGZ1bGwgZHVwbGV4LgogCQkgKi8KLQkJcmVnID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9QQ1NfQ1RSTCk7CisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgcG9ydCwgUE9SVF9QQ1NfQ1RSTCwgJnJlZyk7CiAJCWlmIChkc2FfaXNfY3B1X3BvcnQoZHMsIHBvcnQpIHx8IGRzYV9pc19kc2FfcG9ydChkcywgcG9ydCkpIHsKIAkJCXJlZyAmPSB+UE9SVF9QQ1NfQ1RSTF9VTkZPUkNFRDsKIAkJCXJlZyB8PSBQT1JUX1BDU19DVFJMX0ZPUkNFX0xJTksgfApAQCAtMjQ1NywxMCArMjQ4MCw5IEBACiAJCQlyZWcgfD0gUE9SVF9QQ1NfQ1RSTF9VTkZPUkNFRDsKIAkJfQogCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLAotCQkJCQkgICBQT1JUX1BDU19DVFJMLCByZWcpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9QQ1NfQ1RSTCwgcmVnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJLyogUG9ydCBDb250cm9sOiBkaXNhYmxlIERyb3Atb24tVW5sb2NrLCBkaXNhYmxlIERyb3Atb24tTG9jaywKQEAgLTI0ODYsMjggKzI1MDgsMTMgQEAKIAkJUE9SVF9DT05UUk9MX1VTRV9UQUcgfCBQT1JUX0NPTlRST0xfVVNFX0lQIHwKIAkJUE9SVF9DT05UUk9MX1NUQVRFX0ZPUldBUkRJTkc7CiAJaWYgKGRzYV9pc19jcHVfcG9ydChkcywgcG9ydCkpIHsKLQkJaWYgKG12ODhlNnh4eF82MDk1X2ZhbWlseShjaGlwKSB8fCBtdjg4ZTZ4eHhfNjE4NV9mYW1pbHkoY2hpcCkpCi0JCQlyZWcgfD0gUE9SVF9DT05UUk9MX0RTQV9UQUc7Ci0JCWlmIChtdjg4ZTZ4eHhfNjM1Ml9mYW1pbHkoY2hpcCkgfHwKLQkJICAgIG12ODhlNnh4eF82MzUxX2ZhbWlseShjaGlwKSB8fAotCQkgICAgbXY4OGU2eHh4XzYxNjVfZmFtaWx5KGNoaXApIHx8Ci0JCSAgICBtdjg4ZTZ4eHhfNjA5N19mYW1pbHkoY2hpcCkgfHwKLQkJICAgIG12ODhlNnh4eF82MzIwX2ZhbWlseShjaGlwKSkgeworCQlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19FRFNBKSkKIAkJCXJlZyB8PSBQT1JUX0NPTlRST0xfRlJBTUVfRVRIRVJfVFlQRV9EU0EgfAotCQkJCVBPUlRfQ09OVFJPTF9GT1JXQVJEX1VOS05PV04gfAogCQkJCVBPUlRfQ09OVFJPTF9GT1JXQVJEX1VOS05PV05fTUM7Ci0JCX0KLQotCQlpZiAobXY4OGU2eHh4XzYzNTJfZmFtaWx5KGNoaXApIHx8Ci0JCSAgICBtdjg4ZTZ4eHhfNjM1MV9mYW1pbHkoY2hpcCkgfHwKLQkJICAgIG12ODhlNnh4eF82MTY1X2ZhbWlseShjaGlwKSB8fAotCQkgICAgbXY4OGU2eHh4XzYwOTdfZmFtaWx5KGNoaXApIHx8Ci0JCSAgICBtdjg4ZTZ4eHhfNjA5NV9mYW1pbHkoY2hpcCkgfHwKLQkJICAgIG12ODhlNnh4eF82MDY1X2ZhbWlseShjaGlwKSB8fAotCQkgICAgbXY4OGU2eHh4XzYxODVfZmFtaWx5KGNoaXApIHx8Ci0JCSAgICBtdjg4ZTZ4eHhfNjMyMF9mYW1pbHkoY2hpcCkpIHsKLQkJCXJlZyB8PSBQT1JUX0NPTlRST0xfRUdSRVNTX0FERF9UQUc7Ci0JCX0KKwkJZWxzZQorCQkJcmVnIHw9IFBPUlRfQ09OVFJPTF9EU0FfVEFHOworCQlyZWcgfD0gUE9SVF9DT05UUk9MX0VHUkVTU19BRERfVEFHIHwKKwkJCVBPUlRfQ09OVFJPTF9GT1JXQVJEX1VOS05PV047CiAJfQogCWlmIChkc2FfaXNfZHNhX3BvcnQoZHMsIHBvcnQpKSB7CiAJCWlmIChtdjg4ZTZ4eHhfNjA5NV9mYW1pbHkoY2hpcCkgfHwKQEAgLTI1MjYsMjYgKzI1MzMsMjUgQEAKIAkJCQlQT1JUX0NPTlRST0xfRk9SV0FSRF9VTktOT1dOX01DOwogCX0KIAlpZiAocmVnKSB7Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLAotCQkJCQkgICBQT1JUX0NPTlRST0wsIHJlZyk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0NPTlRST0wsIHJlZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAogCS8qIElmIHRoaXMgcG9ydCBpcyBjb25uZWN0ZWQgdG8gYSBTZXJEZXMsIG1ha2Ugc3VyZSB0aGUgU2VyRGVzIGlzIG5vdAogCSAqIHBvd2VyZWQgZG93bi4KIAkgKi8KLQlpZiAobXY4OGU2eHh4XzYzNTJfZmFtaWx5KGNoaXApKSB7Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX1BPUlQocG9ydCksIFBPUlRfU1RBVFVTKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCQlyZXQgJj0gUE9SVF9TVEFUVVNfQ01PREVfTUFTSzsKLQkJaWYgKChyZXQgPT0gUE9SVF9TVEFUVVNfQ01PREVfMTAwQkFTRV9YKSB8fAotCQkgICAgKHJldCA9PSBQT1JUX1NUQVRVU19DTU9ERV8xMDAwQkFTRV9YKSB8fAotCQkgICAgKHJldCA9PSBQT1JUX1NUQVRVU19DTU9ERV9TR01JSSkpIHsKLQkJCXJldCA9IG12ODhlNnh4eF9wb3dlcl9vbl9zZXJkZXMoY2hpcCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OworCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHU19TRVJERVMpKSB7CisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgcG9ydCwgUE9SVF9TVEFUVVMsICZyZWcpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJcmVnICY9IFBPUlRfU1RBVFVTX0NNT0RFX01BU0s7CisJCWlmICgocmVnID09IFBPUlRfU1RBVFVTX0NNT0RFXzEwMEJBU0VfWCkgfHwKKwkJICAgIChyZWcgPT0gUE9SVF9TVEFUVVNfQ01PREVfMTAwMEJBU0VfWCkgfHwKKwkJICAgIChyZWcgPT0gUE9SVF9TVEFUVVNfQ01PREVfU0dNSUkpKSB7CisJCQllcnIgPSBtdjg4ZTZ4eHhfc2VyZGVzX3Bvd2VyX29uKGNoaXApOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KIApAQCAtMjU3OSwxMCArMjU4NSw5IEBACiAJcmVnIHw9IFBPUlRfQ09OVFJPTF8yXzgwMjFRX0RJU0FCTEVEOwogCiAJaWYgKHJlZykgewotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwKLQkJCQkJICAgUE9SVF9DT05UUk9MXzIsIHJlZyk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0NPTlRST0xfMiwgcmVnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJLyogUG9ydCBBc3NvY2lhdGlvbiBWZWN0b3I6IHdoZW4gbGVhcm5pbmcgc291cmNlIGFkZHJlc3NlcwpAQCAtMjU5NSwxNiArMjYwMCwxNCBAQAogCWlmIChkc2FfaXNfY3B1X3BvcnQoZHMsIHBvcnQpKQogCQlyZWcgPSAwOwogCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksIFBPUlRfQVNTT0NfVkVDVE9SLAotCQkJCSAgIHJlZyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0FTU09DX1ZFQ1RPUiwgcmVnKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJLyogRWdyZXNzIHJhdGUgY29udHJvbCAyOiBkaXNhYmxlIGVncmVzcyByYXRlIGNvbnRyb2wuICovCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksIFBPUlRfUkFURV9DT05UUk9MXzIsCi0JCQkJICAgMHgwMDAwKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfUkFURV9DT05UUk9MXzIsIDB4MDAwMCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCWlmIChtdjg4ZTZ4eHhfNjM1Ml9mYW1pbHkoY2hpcCkgfHwgbXY4OGU2eHh4XzYzNTFfZmFtaWx5KGNoaXApIHx8CiAJICAgIG12ODhlNnh4eF82MTY1X2ZhbWlseShjaGlwKSB8fCBtdjg4ZTZ4eHhfNjA5N19mYW1pbHkoY2hpcCkgfHwKQEAgLTI2MTMsMTA3ICsyNjE2LDEwOCBAQAogCQkgKiBiZSBwYXVzZWQgZm9yIGJ5IHRoZSByZW1vdGUgZW5kIG9yIHRoZSBwZXJpb2Qgb2YKIAkJICogdGltZSB0aGF0IHRoaXMgcG9ydCBjYW4gcGF1c2UgdGhlIHJlbW90ZSBlbmQuCiAJCSAqLwotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwKLQkJCQkJICAgUE9SVF9QQVVTRV9DVFJMLCAweDAwMDApOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9QQVVTRV9DVFJMLCAweDAwMDApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAogCQkvKiBQb3J0IEFUVSBjb250cm9sOiBkaXNhYmxlIGxpbWl0aW5nIHRoZSBudW1iZXIgb2YKIAkJICogYWRkcmVzcyBkYXRhYmFzZSBlbnRyaWVzIHRoYXQgdGhpcyBwb3J0IGlzIGFsbG93ZWQKIAkJICogdG8gdXNlLgogCQkgKi8KLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksCi0JCQkJCSAgIFBPUlRfQVRVX0NPTlRST0wsIDB4MDAwMCk7CisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfQVRVX0NPTlRST0wsCisJCQkJCSAgIDB4MDAwMCk7CiAJCS8qIFByaW9yaXR5IE92ZXJyaWRlOiBkaXNhYmxlIERBLCBTQSBhbmQgVlRVIHByaW9yaXR5CiAJCSAqIG92ZXJyaWRlLgogCQkgKi8KLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksCi0JCQkJCSAgIFBPUlRfUFJJX09WRVJSSURFLCAweDAwMDApOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9QUklfT1ZFUlJJREUsCisJCQkJCSAgIDB4MDAwMCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCiAJCS8qIFBvcnQgRXRoZXJ0eXBlOiB1c2UgdGhlIEV0aGVydHlwZSBEU0EgRXRoZXJ0eXBlCiAJCSAqIHZhbHVlLgogCQkgKi8KLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksCi0JCQkJCSAgIFBPUlRfRVRIX1RZUEUsIEVUSF9QX0VEU0EpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRURTQSkpIHsKKwkJCWVyciA9IG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfRVRIX1RZUEUsCisJCQkJCQkgICBFVEhfUF9FRFNBKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCiAJCS8qIFRhZyBSZW1hcDogdXNlIGFuIGlkZW50aXR5IDgwMi4xcCBwcmlvIC0+IHN3aXRjaAogCQkgKiBwcmlvIG1hcHBpbmcuCiAJCSAqLwotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwKLQkJCQkJICAgUE9SVF9UQUdfUkVHTUFQXzAxMjMsIDB4MzIxMCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX1RBR19SRUdNQVBfMDEyMywKKwkJCQkJICAgMHgzMjEwKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAKIAkJLyogVGFnIFJlbWFwIDI6IHVzZSBhbiBpZGVudGl0eSA4MDIuMXAgcHJpbyAtPiBzd2l0Y2gKIAkJICogcHJpbyBtYXBwaW5nLgogCQkgKi8KLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksCi0JCQkJCSAgIFBPUlRfVEFHX1JFR01BUF80NTY3LCAweDc2NTQpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9UQUdfUkVHTUFQXzQ1NjcsCisJCQkJCSAgIDB4NzY1NCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAorCS8qIFJhdGUgQ29udHJvbDogZGlzYWJsZSBpbmdyZXNzIHJhdGUgbGltaXRpbmcuICovCiAJaWYgKG12ODhlNnh4eF82MzUyX2ZhbWlseShjaGlwKSB8fCBtdjg4ZTZ4eHhfNjM1MV9mYW1pbHkoY2hpcCkgfHwKIAkgICAgbXY4OGU2eHh4XzYxNjVfZmFtaWx5KGNoaXApIHx8IG12ODhlNnh4eF82MDk3X2ZhbWlseShjaGlwKSB8fAotCSAgICBtdjg4ZTZ4eHhfNjE4NV9mYW1pbHkoY2hpcCkgfHwgbXY4OGU2eHh4XzYwOTVfZmFtaWx5KGNoaXApIHx8CiAJICAgIG12ODhlNnh4eF82MzIwX2ZhbWlseShjaGlwKSkgewotCQkvKiBSYXRlIENvbnRyb2w6IGRpc2FibGUgaW5ncmVzcyByYXRlIGxpbWl0aW5nLiAqLwotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwKLQkJCQkJICAgUE9SVF9SQVRFX0NPTlRST0wsIDB4MDAwMSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX1JBVEVfQ09OVFJPTCwKKwkJCQkJICAgMHgwMDAxKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfSBlbHNlIGlmIChtdjg4ZTZ4eHhfNjE4NV9mYW1pbHkoY2hpcCkgfHwgbXY4OGU2eHh4XzYwOTVfZmFtaWx5KGNoaXApKSB7CisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfUkFURV9DT05UUk9MLAorCQkJCQkgICAweDAwMDApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9CiAKIAkvKiBQb3J0IENvbnRyb2wgMTogZGlzYWJsZSB0cnVua2luZywgZGlzYWJsZSBzZW5kaW5nCiAJICogbGVhcm5pbmcgbWVzc2FnZXMgdG8gdGhpcyBwb3J0LgogCSAqLwotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0NPTlRST0xfMSwKLQkJCQkgICAweDAwMDApOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9DT05UUk9MXzEsIDB4MDAwMCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCS8qIFBvcnQgYmFzZWQgVkxBTiBtYXA6IGdpdmUgZWFjaCBwb3J0IHRoZSBzYW1lIGRlZmF1bHQgYWRkcmVzcwogCSAqIGRhdGFiYXNlLCBhbmQgYWxsb3cgYmlkaXJlY3Rpb25hbCBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlCiAJICogQ1BVIGFuZCBEU0EgcG9ydChzKSwgYW5kIHRoZSBvdGhlciBwb3J0cy4KIAkgKi8KLQlyZXQgPSBfbXY4OGU2eHh4X3BvcnRfZmlkX3NldChjaGlwLCBwb3J0LCAwKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCWVyciA9IF9tdjg4ZTZ4eHhfcG9ydF9maWRfc2V0KGNoaXAsIHBvcnQsIDApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3BvcnRfYmFzZWRfdmxhbl9tYXAoY2hpcCwgcG9ydCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBfbXY4OGU2eHh4X3BvcnRfYmFzZWRfdmxhbl9tYXAoY2hpcCwgcG9ydCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCS8qIERlZmF1bHQgVkxBTiBJRCBhbmQgcHJpb3JpdHk6IGRvbid0IHNldCBhIGRlZmF1bHQgVkxBTgogCSAqIElELCBhbmQgc2V0IHRoZSBkZWZhdWx0IHBhY2tldCBwcmlvcml0eSB0byB6ZXJvLgogCSAqLwotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0RFRkFVTFRfVkxBTiwKLQkJCQkgICAweDAwMDApOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9ERUZBVUxUX1ZMQU4sIDB4MDAwMCk7CiB9CiAKLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2cxX3NldF9zd2l0Y2hfbWFjKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTggKmFkZHIpCitpbnQgbXY4OGU2eHh4X2cxX3NldF9zd2l0Y2hfbWFjKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTggKmFkZHIpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IG12ODhlNnh4eF93cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfTUFDXzAxLAotCQkJICAgICAgKGFkZHJbMF0gPDwgOCkgfCBhZGRyWzFdKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX01BQ18wMSwgKGFkZHJbMF0gPDwgOCkgfCBhZGRyWzFdKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gbXY4OGU2eHh4X3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9NQUNfMjMsCi0JCQkgICAgICAoYWRkclsyXSA8PCA4KSB8IGFkZHJbM10pOworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfTUFDXzIzLCAoYWRkclsyXSA8PCA4KSB8IGFkZHJbM10pOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlyZXR1cm4gbXY4OGU2eHh4X3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9NQUNfNDUsCi0JCQkgICAgICAgKGFkZHJbNF0gPDwgOCkgfCBhZGRyWzVdKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX01BQ180NSwgKGFkZHJbNF0gPDwgOCkgfCBhZGRyWzVdKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X2cxX3NldF9hZ2VfdGltZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCkBAIC0yNzMyLDcgKzI3MzYsNyBAQAogCS8qIFJvdW5kIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgY29lZmYgKi8KIAlhZ2VfdGltZSA9IChtc2VjcyArIGNvZWZmIC8gMikgLyBjb2VmZjsKIAotCWVyciA9IG12ODhlNnh4eF9yZWFkKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9BVFVfQ09OVFJPTCwgJnZhbCk7CisJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX0FUVV9DT05UUk9MLCAmdmFsKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yNzQwLDEzICsyNzQ0LDEzIEBACiAJdmFsICY9IH4weGZmMDsKIAl2YWwgfD0gYWdlX3RpbWUgPDwgNDsKIAotCXJldHVybiBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0FUVV9DT05UUk9MLCB2YWwpOworCXJldHVybiBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0FUVV9DT05UUk9MLCB2YWwpOwogfQogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9zZXRfYWdlaW5nX3RpbWUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAogCQkJCSAgICAgdW5zaWduZWQgaW50IGFnZWluZ190aW1lKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCWludCBlcnI7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CkBAIC0yNzcxLDcgKzI3NzUsNyBAQAogCSAgICBtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX1BQVV9BQ1RJVkUpKQogCQlyZWcgfD0gR0xPQkFMX0NPTlRST0xfUFBVX0VOQUJMRTsKIAotCWVyciA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9DT05UUk9MLCByZWcpOworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfQ09OVFJPTCwgcmVnKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yNzgxLDE1ICsyNzg1LDE0IEBACiAJcmVnID0gdXBzdHJlYW1fcG9ydCA8PCBHTE9CQUxfTU9OSVRPUl9DT05UUk9MX0lOR1JFU1NfU0hJRlQgfAogCQl1cHN0cmVhbV9wb3J0IDw8IEdMT0JBTF9NT05JVE9SX0NPTlRST0xfRUdSRVNTX1NISUZUIHwKIAkJdXBzdHJlYW1fcG9ydCA8PCBHTE9CQUxfTU9OSVRPUl9DT05UUk9MX0FSUF9TSElGVDsKLQllcnIgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfTU9OSVRPUl9DT05UUk9MLAotCQkJCSAgIHJlZyk7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9NT05JVE9SX0NPTlRST0wsIHJlZyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCS8qIERpc2FibGUgcmVtb3RlIG1hbmFnZW1lbnQsIGFuZCBzZXQgdGhlIHN3aXRjaCdzIERTQSBkZXZpY2UgbnVtYmVyLiAqLwotCWVyciA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9DT05UUk9MXzIsCi0JCQkJICAgR0xPQkFMX0NPTlRST0xfMl9NVUxUSVBMRV9DQVNDQURFIHwKLQkJCQkgICAoZHMtPmluZGV4ICYgMHgxZikpOworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfQ09OVFJPTF8yLAorCQkJCSBHTE9CQUxfQ09OVFJPTF8yX01VTFRJUExFX0NBU0NBREUgfAorCQkJCSAoZHMtPmluZGV4ICYgMHgxZikpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTI4MDIsOCArMjgwNSw4IEBACiAJICogZW5hYmxlIGFkZHJlc3MgbGVhcm4gbWVzc2FnZXMgdG8gYmUgc2VudCB0byBhbGwgbWVzc2FnZQogCSAqIHBvcnRzLgogCSAqLwotCWVyciA9IG12ODhlNnh4eF93cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfQVRVX0NPTlRST0wsCi0JCQkgICAgICBHTE9CQUxfQVRVX0NPTlRST0xfTEVBUk4yQUxMKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0FUVV9DT05UUk9MLAorCQkJCSBHTE9CQUxfQVRVX0NPTlRST0xfTEVBUk4yQUxMKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yODE3LDM5ICsyODIwLDM5IEBACiAJCXJldHVybiBlcnI7CiAKIAkvKiBDb25maWd1cmUgdGhlIElQIFRvUyBtYXBwaW5nIHJlZ2lzdGVycy4gKi8KLQllcnIgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfSVBfUFJJXzAsIDB4MDAwMCk7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9JUF9QUklfMCwgMHgwMDAwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWVyciA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9JUF9QUklfMSwgMHgwMDAwKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0lQX1BSSV8xLCAweDAwMDApOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JZXJyID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0lQX1BSSV8yLCAweDU1NTUpOworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfSVBfUFJJXzIsIDB4NTU1NSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQllcnIgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfSVBfUFJJXzMsIDB4NTU1NSk7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9JUF9QUklfMywgMHg1NTU1KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWVyciA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9JUF9QUklfNCwgMHhhYWFhKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0lQX1BSSV80LCAweGFhYWEpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JZXJyID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0lQX1BSSV81LCAweGFhYWEpOworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfSVBfUFJJXzUsIDB4YWFhYSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQllcnIgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfSVBfUFJJXzYsIDB4ZmZmZik7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9JUF9QUklfNiwgMHhmZmZmKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWVyciA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9JUF9QUklfNywgMHhmZmZmKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0lQX1BSSV83LCAweGZmZmYpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKIAkvKiBDb25maWd1cmUgdGhlIElFRUUgODAyLjFwIHByaW9yaXR5IG1hcHBpbmcgcmVnaXN0ZXIuICovCi0JZXJyID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0lFRUVfUFJJLCAweGZhNDEpOworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfSUVFRV9QUkksIDB4ZmE0MSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCS8qIENsZWFyIHRoZSBzdGF0aXN0aWNzIGNvdW50ZXJzIGZvciBhbGwgcG9ydHMgKi8KLQllcnIgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfU1RBVFNfT1AsCi0JCQkJICAgR0xPQkFMX1NUQVRTX09QX0ZMVVNIX0FMTCk7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9TVEFUU19PUCwKKwkJCQkgR0xPQkFMX1NUQVRTX09QX0ZMVVNIX0FMTCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMjg2MSwyNzcgKzI4NjQsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG12ODhlNnh4eF9nMl9kZXZpY2VfbWFwcGluZ193cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJCSAgICAgaW50IHRhcmdldCwgaW50IHBvcnQpCi17Ci0JdTE2IHZhbCA9ICh0YXJnZXQgPDwgOCkgfCAocG9ydCAmIDB4Zik7Ci0KLQlyZXR1cm4gbXY4OGU2eHh4X3VwZGF0ZShjaGlwLCBSRUdfR0xPQkFMMiwgR0xPQkFMMl9ERVZJQ0VfTUFQUElORywgdmFsKTsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfc2V0X2RldmljZV9tYXBwaW5nKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKLXsKLQlpbnQgdGFyZ2V0LCBwb3J0OwotCWludCBlcnI7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSByb3V0aW5nIHBvcnQgdG8gdGhlIDMyIHBvc3NpYmxlIHRhcmdldCBkZXZpY2VzICovCi0JZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPCAzMjsgKyt0YXJnZXQpIHsKLQkJcG9ydCA9IDB4ZjsKLQotCQlpZiAodGFyZ2V0IDwgRFNBX01BWF9TV0lUQ0hFUykgewotCQkJcG9ydCA9IGNoaXAtPmRzLT5ydGFibGVbdGFyZ2V0XTsKLQkJCWlmIChwb3J0ID09IERTQV9SVEFCTEVfTk9ORSkKLQkJCQlwb3J0ID0gMHhmOwotCQl9Ci0KLQkJZXJyID0gbXY4OGU2eHh4X2cyX2RldmljZV9tYXBwaW5nX3dyaXRlKGNoaXAsIHRhcmdldCwgcG9ydCk7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9nMl90cnVua19tYXNrX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IG51bSwKLQkJCQkJIGJvb2wgaGFzaywgdTE2IG1hc2spCi17Ci0JY29uc3QgdTE2IHBvcnRfbWFzayA9IEJJVChjaGlwLT5pbmZvLT5udW1fcG9ydHMpIC0gMTsKLQl1MTYgdmFsID0gKG51bSA8PCAxMikgfCAobWFzayAmIHBvcnRfbWFzayk7Ci0KLQlpZiAoaGFzaykKLQkJdmFsIHw9IEdMT0JBTDJfVFJVTktfTUFTS19IQVNLOwotCi0JcmV0dXJuIG12ODhlNnh4eF91cGRhdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfVFJVTktfTUFTSywgdmFsKTsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfdHJ1bmtfbWFwcGluZ193cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBpZCwKLQkJCQkJICAgIHUxNiBtYXApCi17Ci0JY29uc3QgdTE2IHBvcnRfbWFzayA9IEJJVChjaGlwLT5pbmZvLT5udW1fcG9ydHMpIC0gMTsKLQl1MTYgdmFsID0gKGlkIDw8IDExKSB8IChtYXAgJiBwb3J0X21hc2spOwotCi0JcmV0dXJuIG12ODhlNnh4eF91cGRhdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfVFJVTktfTUFQUElORywgdmFsKTsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfY2xlYXJfdHJ1bmsoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQotewotCWNvbnN0IHUxNiBwb3J0X21hc2sgPSBCSVQoY2hpcC0+aW5mby0+bnVtX3BvcnRzKSAtIDE7Ci0JaW50IGksIGVycjsKLQotCS8qIENsZWFyIGFsbCBlaWdodCBwb3NzaWJsZSBUcnVuayBNYXNrIHZlY3RvcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7Ci0JCWVyciA9IG12ODhlNnh4eF9nMl90cnVua19tYXNrX3dyaXRlKGNoaXAsIGksIGZhbHNlLCBwb3J0X21hc2spOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQkvKiBDbGVhciBhbGwgc2l4dGVlbiBwb3NzaWJsZSBUcnVuayBJRCByb3V0aW5nIHZlY3RvcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgewotCQllcnIgPSBtdjg4ZTZ4eHhfZzJfdHJ1bmtfbWFwcGluZ193cml0ZShjaGlwLCBpLCAwKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX2NsZWFyX2lybChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCi17Ci0JaW50IHBvcnQsIGVycjsKLQotCS8qIEluaXQgYWxsIEluZ3Jlc3MgUmF0ZSBMaW1pdCByZXNvdXJjZXMgb2YgYWxsIHBvcnRzICovCi0JZm9yIChwb3J0ID0gMDsgcG9ydCA8IGNoaXAtPmluZm8tPm51bV9wb3J0czsgKytwb3J0KSB7Ci0JCS8qIFhYWCBuZXdlciBjaGlwcyAobGlrZSA4OEU2MzkwKSBoYXZlIGRpZmZlcmVudCAyLWJpdCBvcHMgKi8KLQkJZXJyID0gbXY4OGU2eHh4X3dyaXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX0lSTF9DTUQsCi0JCQkJICAgICAgR0xPQkFMMl9JUkxfQ01EX09QX0lOSVRfQUxMIHwKLQkJCQkgICAgICAocG9ydCA8PCA4KSk7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQotCQkvKiBXYWl0IGZvciB0aGUgb3BlcmF0aW9uIHRvIGNvbXBsZXRlICovCi0JCWVyciA9IF9tdjg4ZTZ4eHhfd2FpdChjaGlwLCBSRUdfR0xPQkFMMiwgR0xPQkFMMl9JUkxfQ01ELAotCQkJCSAgICAgIEdMT0JBTDJfSVJMX0NNRF9CVVNZKTsKLQkJaWYgKGVycikKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qIEluZGlyZWN0IHdyaXRlIHRvIHRoZSBTd2l0Y2ggTUFDL1dvTC9Xb0YgcmVnaXN0ZXIgKi8KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3N3aXRjaF9tYWNfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCQkgdW5zaWduZWQgaW50IHBvaW50ZXIsIHU4IGRhdGEpCi17Ci0JdTE2IHZhbCA9IChwb2ludGVyIDw8IDgpIHwgZGF0YTsKLQotCXJldHVybiBtdjg4ZTZ4eHhfdXBkYXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX1NXSVRDSF9NQUMsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTggKmFkZHIpCi17Ci0JaW50IGksIGVycjsKLQotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKLQkJZXJyID0gbXY4OGU2eHh4X2cyX3N3aXRjaF9tYWNfd3JpdGUoY2hpcCwgaSwgYWRkcltpXSk7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9nMl9wb3Rfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcG9pbnRlciwKLQkJCQkgIHU4IGRhdGEpCi17Ci0JdTE2IHZhbCA9IChwb2ludGVyIDw8IDgpIHwgKGRhdGEgJiAweDcpOwotCi0JcmV0dXJuIG12ODhlNnh4eF91cGRhdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfUFJJT19PVkVSUklERSwgdmFsKTsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfY2xlYXJfcG90KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKLXsKLQlpbnQgaSwgZXJyOwotCi0JLyogQ2xlYXIgYWxsIHNpeHRlZW4gcG9zc2libGUgUHJpb3JpdHkgT3ZlcnJpZGUgZW50cmllcyAqLwotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCWVyciA9IG12ODhlNnh4eF9nMl9wb3Rfd3JpdGUoY2hpcCwgaSwgMCk7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9nMl9lZXByb21fd2FpdChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCi17Ci0JcmV0dXJuIF9tdjg4ZTZ4eHhfd2FpdChjaGlwLCBSRUdfR0xPQkFMMiwgR0xPQkFMMl9FRVBST01fQ01ELAotCQkJICAgICAgIEdMT0JBTDJfRUVQUk9NX0NNRF9CVVNZIHwKLQkJCSAgICAgICBHTE9CQUwyX0VFUFJPTV9DTURfUlVOTklORyk7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX2VlcHJvbV9jbWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCB1MTYgY21kKQotewotCWludCBlcnI7Ci0KLQllcnIgPSBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfRUVQUk9NX0NNRCwgY21kKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIG12ODhlNnh4eF9nMl9lZXByb21fd2FpdChjaGlwKTsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3JlYWQxNihzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJICAgICAgdTggYWRkciwgdTE2ICpkYXRhKQotewotCXUxNiBjbWQgPSBHTE9CQUwyX0VFUFJPTV9DTURfT1BfUkVBRCB8IGFkZHI7Ci0JaW50IGVycjsKLQotCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fd2FpdChjaGlwKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV9jbWQoY2hpcCwgY21kKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIG12ODhlNnh4eF9yZWFkKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX0VFUFJPTV9EQVRBLCBkYXRhKTsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3dyaXRlMTYoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCSAgICAgICB1OCBhZGRyLCB1MTYgZGF0YSkKLXsKLQl1MTYgY21kID0gR0xPQkFMMl9FRVBST01fQ01EX09QX1dSSVRFIHwgYWRkcjsKLQlpbnQgZXJyOwotCi0JZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV93YWl0KGNoaXApOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQllcnIgPSBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfRUVQUk9NX0RBVEEsIGRhdGEpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gbXY4OGU2eHh4X2cyX2VlcHJvbV9jbWQoY2hpcCwgY21kKTsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfc2V0dXAoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQotewotCXUxNiByZWc7Ci0JaW50IGVycjsKLQotCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMlgpKSB7Ci0JCS8qIENvbnNpZGVyIHRoZSBmcmFtZXMgd2l0aCByZXNlcnZlZCBtdWx0aWNhc3QgZGVzdGluYXRpb24KLQkJICogYWRkcmVzc2VzIG1hdGNoaW5nIDAxOjgwOmMyOjAwOjAwOjJ4IGFzIE1HTVQuCi0JCSAqLwotCQllcnIgPSBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfTUdNVF9FTl8yWCwKLQkJCQkgICAgICAweGZmZmYpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzBYKSkgewotCQkvKiBDb25zaWRlciB0aGUgZnJhbWVzIHdpdGggcmVzZXJ2ZWQgbXVsdGljYXN0IGRlc3RpbmF0aW9uCi0JCSAqIGFkZHJlc3NlcyBtYXRjaGluZyAwMTo4MDpjMjowMDowMDoweCBhcyBNR01ULgotCQkgKi8KLQkJZXJyID0gbXY4OGU2eHh4X3dyaXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX01HTVRfRU5fMFgsCi0JCQkJICAgICAgMHhmZmZmKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JLyogSWdub3JlIHJlbW92ZWQgdGFnIGRhdGEgb24gZG91Ymx5IHRhZ2dlZCBwYWNrZXRzLCBkaXNhYmxlCi0JICogZmxvdyBjb250cm9sIG1lc3NhZ2VzLCBmb3JjZSBmbG93IGNvbnRyb2wgcHJpb3JpdHkgdG8gdGhlCi0JICogaGlnaGVzdCwgYW5kIHNlbmQgYWxsIHNwZWNpYWwgbXVsdGljYXN0IGZyYW1lcyB0byB0aGUgQ1BVCi0JICogcG9ydCBhdCB0aGUgaGlnaGVzdCBwcmlvcml0eS4KLQkgKi8KLQlyZWcgPSBHTE9CQUwyX1NXSVRDSF9NR01UX0ZPUkNFX0ZMT1dfQ1RSTF9QUkkgfCAoMHg3IDw8IDQpOwotCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMFgpIHx8Ci0JICAgIG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8yWCkpCi0JCXJlZyB8PSBHTE9CQUwyX1NXSVRDSF9NR01UX1JTVkQyQ1BVIHwgMHg3OwotCWVyciA9IG12ODhlNnh4eF93cml0ZShjaGlwLCBSRUdfR0xPQkFMMiwgR0xPQkFMMl9TV0lUQ0hfTUdNVCwgcmVnKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JLyogUHJvZ3JhbSB0aGUgRFNBIHJvdXRpbmcgdGFibGUuICovCi0JZXJyID0gbXY4OGU2eHh4X2cyX3NldF9kZXZpY2VfbWFwcGluZyhjaGlwKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JLyogQ2xlYXIgYWxsIHRydW5rIG1hc2tzIGFuZCBtYXBwaW5nLiAqLwotCWVyciA9IG12ODhlNnh4eF9nMl9jbGVhcl90cnVuayhjaGlwKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdTX0lSTCkpIHsKLQkJLyogRGlzYWJsZSBpbmdyZXNzIHJhdGUgbGltaXRpbmcgYnkgcmVzZXR0aW5nIGFsbCBwZXIgcG9ydAotCQkgKiBpbmdyZXNzIHJhdGUgbGltaXQgcmVzb3VyY2VzIHRvIHRoZWlyIGluaXRpYWwgc3RhdGUuCi0JCSAqLwotCQllcnIgPSBtdjg4ZTZ4eHhfZzJfY2xlYXJfaXJsKGNoaXApOwotCQkJaWYgKGVycikKLQkJCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHU19QVlQpKSB7Ci0JCS8qIEluaXRpYWxpemUgQ3Jvc3MtY2hpcCBQb3J0IFZMQU4gVGFibGUgdG8gcmVzZXQgZGVmYXVsdHMgKi8KLQkJZXJyID0gbXY4OGU2eHh4X3dyaXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX1BWVF9BRERSLAotCQkJCSAgICAgIEdMT0JBTDJfUFZUX0FERFJfT1BfSU5JVF9PTkVTKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRzJfUE9UKSkgewotCQkvKiBDbGVhciB0aGUgcHJpb3JpdHkgb3ZlcnJpZGUgdGFibGUuICovCi0JCWVyciA9IG12ODhlNnh4eF9nMl9jbGVhcl9wb3QoY2hpcCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG12ODhlNnh4eF9zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJaW50IGVycjsKIAlpbnQgaTsKIApAQCAtMzE0NSw3ICsyODgwLDcgQEAKIAkJZ290byB1bmxvY2s7CiAKIAkvKiBTZXR1cCBTd2l0Y2ggUG9ydCBSZWdpc3RlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+aW5mby0+bnVtX3BvcnRzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgbXY4OGU2eHh4X251bV9wb3J0cyhjaGlwKTsgaSsrKSB7CiAJCWVyciA9IG12ODhlNnh4eF9zZXR1cF9wb3J0KGNoaXAsIGkpOwogCQlpZiAoZXJyKQogCQkJZ290byB1bmxvY2s7CkBAIC0zMTcxLDk4ICsyOTA2LDQ4IEBACiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3NldF9hZGRyKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgdTggKmFkZHIpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJaW50IGVycjsKIAorCWlmICghY2hpcC0+aW5mby0+b3BzLT5zZXRfc3dpdGNoX21hYykKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwotCi0JLyogSGFzIGFuIGluZGlyZWN0IFN3aXRjaCBNQUMvV29ML1dvRiByZWdpc3RlciBpbiBHbG9iYWwgMj8gKi8KLQlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19HMl9TV0lUQ0hfTUFDKSkKLQkJZXJyID0gbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjKGNoaXAsIGFkZHIpOwotCWVsc2UKLQkJZXJyID0gbXY4OGU2eHh4X2cxX3NldF9zd2l0Y2hfbWFjKGNoaXAsIGFkZHIpOwotCisJZXJyID0gY2hpcC0+aW5mby0+b3BzLT5zZXRfc3dpdGNoX21hYyhjaGlwLCBhZGRyKTsKIAltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgbXY4OGU2eHh4X21kaW9fcGFnZV9yZWFkKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGludCBwYWdlLAotCQkJCSAgICBpbnQgcmVnKQotewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JcmV0ID0gX212ODhlNnh4eF9tZGlvX3BhZ2VfcmVhZChjaGlwLCBwb3J0LCBwYWdlLCByZWcpOwotCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfbWRpb19wYWdlX3dyaXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGludCBwYWdlLAotCQkJCSAgICAgaW50IHJlZywgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwotCXJldCA9IF9tdjg4ZTZ4eHhfbWRpb19wYWdlX3dyaXRlKGNoaXAsIHBvcnQsIHBhZ2UsIHJlZywgdmFsKTsKLQltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X3BvcnRfdG9fbWRpb19hZGRyKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvcnQpCi17Ci0JaWYgKHBvcnQgPj0gMCAmJiBwb3J0IDwgY2hpcC0+aW5mby0+bnVtX3BvcnRzKQotCQlyZXR1cm4gcG9ydDsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfbWRpb19yZWFkKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBwb3J0LCBpbnQgcmVnbnVtKQorc3RhdGljIGludCBtdjg4ZTZ4eHhfbWRpb19yZWFkKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBwaHksIGludCByZWcpCiB7CiAJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gYnVzLT5wcml2OwotCWludCBhZGRyID0gbXY4OGU2eHh4X3BvcnRfdG9fbWRpb19hZGRyKGNoaXAsIHBvcnQpOwotCWludCByZXQ7CisJdTE2IHZhbDsKKwlpbnQgZXJyOwogCi0JaWYgKGFkZHIgPCAwKQorCWlmIChwaHkgPj0gbXY4OGU2eHh4X251bV9wb3J0cyhjaGlwKSkKIAkJcmV0dXJuIDB4ZmZmZjsKIAogCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQotCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX1BQVSkpCi0JCXJldCA9IG12ODhlNnh4eF9tZGlvX3JlYWRfcHB1KGNoaXAsIGFkZHIsIHJlZ251bSk7Ci0JZWxzZSBpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19TTUlfUEhZKSkKLQkJcmV0ID0gbXY4OGU2eHh4X21kaW9fcmVhZF9pbmRpcmVjdChjaGlwLCBhZGRyLCByZWdudW0pOwotCWVsc2UKLQkJcmV0ID0gbXY4OGU2eHh4X21kaW9fcmVhZF9kaXJlY3QoY2hpcCwgYWRkciwgcmVnbnVtKTsKLQorCWVyciA9IG12ODhlNnh4eF9waHlfcmVhZChjaGlwLCBwaHksIHJlZywgJnZhbCk7CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiBlcnIgPyBlcnIgOiB2YWw7CiB9CiAKLXN0YXRpYyBpbnQgbXY4OGU2eHh4X21kaW9fd3JpdGUoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHBvcnQsIGludCByZWdudW0sCi0JCQkJdTE2IHZhbCkKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X21kaW9fd3JpdGUoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHBoeSwgaW50IHJlZywgdTE2IHZhbCkKIHsKIAlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBidXMtPnByaXY7Ci0JaW50IGFkZHIgPSBtdjg4ZTZ4eHhfcG9ydF90b19tZGlvX2FkZHIoY2hpcCwgcG9ydCk7Ci0JaW50IHJldDsKKwlpbnQgZXJyOwogCi0JaWYgKGFkZHIgPCAwKQorCWlmIChwaHkgPj0gbXY4OGU2eHh4X251bV9wb3J0cyhjaGlwKSkKIAkJcmV0dXJuIDB4ZmZmZjsKIAogCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQotCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX1BQVSkpCi0JCXJldCA9IG12ODhlNnh4eF9tZGlvX3dyaXRlX3BwdShjaGlwLCBhZGRyLCByZWdudW0sIHZhbCk7Ci0JZWxzZSBpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19TTUlfUEhZKSkKLQkJcmV0ID0gbXY4OGU2eHh4X21kaW9fd3JpdGVfaW5kaXJlY3QoY2hpcCwgYWRkciwgcmVnbnVtLCB2YWwpOwotCWVsc2UKLQkJcmV0ID0gbXY4OGU2eHh4X21kaW9fd3JpdGVfZGlyZWN0KGNoaXAsIGFkZHIsIHJlZ251bSwgdmFsKTsKLQorCWVyciA9IG12ODhlNnh4eF9waHlfd3JpdGUoY2hpcCwgcGh5LCByZWcsIHZhbCk7CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X21kaW9fcmVnaXN0ZXIoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLApAQCAtMzI3Miw5ICsyOTU3LDYgQEAKIAlzdHJ1Y3QgbWlpX2J1cyAqYnVzOwogCWludCBlcnI7CiAKLQlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19QUFUpKQotCQltdjg4ZTZ4eHhfcHB1X3N0YXRlX2luaXQoY2hpcCk7Ci0KIAlpZiAobnApCiAJCWNoaXAtPm1kaW9fbnAgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShucCwgIm1kaW8iKTsKIApAQCAtMzMyOSw2OSArMzAxMSw3MCBAQAogCiBzdGF0aWMgaW50IG12ODhlNjF4eF9nZXRfdGVtcChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCAqdGVtcCkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKKwl1MTYgdmFsOwogCWludCByZXQ7Ci0JaW50IHZhbDsKIAogCSp0ZW1wID0gMDsKIAogCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAotCXJldCA9IG12ODhlNnh4eF9tZGlvX3dyaXRlX2RpcmVjdChjaGlwLCAweDAsIDB4MTYsIDB4Nik7CisJcmV0ID0gbXY4OGU2eHh4X3BoeV93cml0ZShjaGlwLCAweDAsIDB4MTYsIDB4Nik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKIAkvKiBFbmFibGUgdGVtcGVyYXR1cmUgc2Vuc29yICovCi0JcmV0ID0gbXY4OGU2eHh4X21kaW9fcmVhZF9kaXJlY3QoY2hpcCwgMHgwLCAweDFhKTsKKwlyZXQgPSBtdjg4ZTZ4eHhfcGh5X3JlYWQoY2hpcCwgMHgwLCAweDFhLCAmdmFsKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKIAotCXJldCA9IG12ODhlNnh4eF9tZGlvX3dyaXRlX2RpcmVjdChjaGlwLCAweDAsIDB4MWEsIHJldCB8ICgxIDw8IDUpKTsKKwlyZXQgPSBtdjg4ZTZ4eHhfcGh5X3dyaXRlKGNoaXAsIDB4MCwgMHgxYSwgdmFsIHwgKDEgPDwgNSkpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yOwogCiAJLyogV2FpdCBmb3IgdGVtcGVyYXR1cmUgdG8gc3RhYmlsaXplICovCiAJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMjAwMCk7CiAKLQl2YWwgPSBtdjg4ZTZ4eHhfbWRpb19yZWFkX2RpcmVjdChjaGlwLCAweDAsIDB4MWEpOwotCWlmICh2YWwgPCAwKSB7Ci0JCXJldCA9IHZhbDsKKwlyZXQgPSBtdjg4ZTZ4eHhfcGh5X3JlYWQoY2hpcCwgMHgwLCAweDFhLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKLQl9CiAKIAkvKiBEaXNhYmxlIHRlbXBlcmF0dXJlIHNlbnNvciAqLwotCXJldCA9IG12ODhlNnh4eF9tZGlvX3dyaXRlX2RpcmVjdChjaGlwLCAweDAsIDB4MWEsIHJldCAmIH4oMSA8PCA1KSk7CisJcmV0ID0gbXY4OGU2eHh4X3BoeV93cml0ZShjaGlwLCAweDAsIDB4MWEsIHZhbCAmIH4oMSA8PCA1KSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKIAkqdGVtcCA9ICgodmFsICYgMHgxZikgLSA1KSAqIDU7CiAKIGVycm9yOgotCW12ODhlNnh4eF9tZGlvX3dyaXRlX2RpcmVjdChjaGlwLCAweDAsIDB4MTYsIDB4MCk7CisJbXY4OGU2eHh4X3BoeV93cml0ZShjaGlwLCAweDAsIDB4MTYsIDB4MCk7CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBtdjg4ZTYzeHhfZ2V0X3RlbXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgKnRlbXApCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJaW50IHBoeSA9IG12ODhlNnh4eF82MzIwX2ZhbWlseShjaGlwKSA/IDMgOiAwOworCXUxNiB2YWw7CiAJaW50IHJldDsKIAogCSp0ZW1wID0gMDsKIAotCXJldCA9IG12ODhlNnh4eF9tZGlvX3BhZ2VfcmVhZChkcywgcGh5LCA2LCAyNyk7CisJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOworCXJldCA9IG12ODhlNnh4eF9waHlfcGFnZV9yZWFkKGNoaXAsIHBoeSwgNiwgMjcsICZ2YWwpOworCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JKnRlbXAgPSAocmV0ICYgMHhmZikgLSAyNTsKKwkqdGVtcCA9ICh2YWwgJiAweGZmKSAtIDI1OwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X2dldF90ZW1wKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50ICp0ZW1wKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCiAJaWYgKCFtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX1RFTVApKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC0zNDA0LDggKzMwODcsOSBAQAogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9nZXRfdGVtcF9saW1pdChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCAqdGVtcCkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlpbnQgcGh5ID0gbXY4OGU2eHh4XzYzMjBfZmFtaWx5KGNoaXApID8gMyA6IDA7CisJdTE2IHZhbDsKIAlpbnQgcmV0OwogCiAJaWYgKCFtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX1RFTVBfTElNSVQpKQpAQCAtMzQxMywzNiArMzA5Nyw0NSBAQAogCiAJKnRlbXAgPSAwOwogCi0JcmV0ID0gbXY4OGU2eHh4X21kaW9fcGFnZV9yZWFkKGRzLCBwaHksIDYsIDI2KTsKKwltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0ID0gbXY4OGU2eHh4X3BoeV9wYWdlX3JlYWQoY2hpcCwgcGh5LCA2LCAyNiwgJnZhbCk7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQkqdGVtcCA9ICgoKHJldCA+PiA4KSAmIDB4MWYpICogNSkgLSAyNTsKKwkqdGVtcCA9ICgoKHZhbCA+PiA4KSAmIDB4MWYpICogNSkgLSAyNTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9zZXRfdGVtcF9saW1pdChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCB0ZW1wKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCWludCBwaHkgPSBtdjg4ZTZ4eHhfNjMyMF9mYW1pbHkoY2hpcCkgPyAzIDogMDsKLQlpbnQgcmV0OworCXUxNiB2YWw7CisJaW50IGVycjsKIAogCWlmICghbXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19URU1QX0xJTUlUKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JcmV0ID0gbXY4OGU2eHh4X21kaW9fcGFnZV9yZWFkKGRzLCBwaHksIDYsIDI2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJZXJyID0gbXY4OGU2eHh4X3BoeV9wYWdlX3JlYWQoY2hpcCwgcGh5LCA2LCAyNiwgJnZhbCk7CisJaWYgKGVycikKKwkJZ290byB1bmxvY2s7CiAJdGVtcCA9IGNsYW1wX3ZhbChESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCA1KSArIDUsIDAsIDB4MWYpOwotCXJldHVybiBtdjg4ZTZ4eHhfbWRpb19wYWdlX3dyaXRlKGRzLCBwaHksIDYsIDI2LAotCQkJCQkgKHJldCAmIDB4ZTBmZikgfCAodGVtcCA8PCA4KSk7CisJZXJyID0gbXY4OGU2eHh4X3BoeV9wYWdlX3dyaXRlKGNoaXAsIHBoeSwgNiwgMjYsCisJCQkJICAgICAgICh2YWwgJiAweGUwZmYpIHwgKHRlbXAgPDwgOCkpOwordW5sb2NrOgorCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBtdjg4ZTZ4eHhfZ2V0X3RlbXBfYWxhcm0oc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBib29sICphbGFybSkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlpbnQgcGh5ID0gbXY4OGU2eHh4XzYzMjBfZmFtaWx5KGNoaXApID8gMyA6IDA7CisJdTE2IHZhbDsKIAlpbnQgcmV0OwogCiAJaWYgKCFtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX1RFTVBfTElNSVQpKQpAQCAtMzQ1MCwxMSArMzE0MywxMyBAQAogCiAJKmFsYXJtID0gZmFsc2U7CiAKLQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb19wYWdlX3JlYWQoZHMsIHBoeSwgNiwgMjYpOworCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXQgPSBtdjg4ZTZ4eHhfcGh5X3BhZ2VfcmVhZChjaGlwLCBwaHksIDYsIDI2LCAmdmFsKTsKKwltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCSphbGFybSA9ICEhKHJldCAmIDB4NDApOworCSphbGFybSA9ICEhKHZhbCAmIDB4NDApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNDYyLDc0ICszMTU3LDIyIEBACiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X2dldF9lZXByb21fbGVuKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAogCXJldHVybiBjaGlwLT5lZXByb21fbGVuOwogfQogCi1zdGF0aWMgaW50IG12ODhlNnh4eF9nZXRfZWVwcm9tMTYoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCSAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKQotewotCXVuc2lnbmVkIGludCBvZmZzZXQgPSBlZXByb20tPm9mZnNldDsKLQl1bnNpZ25lZCBpbnQgbGVuID0gZWVwcm9tLT5sZW47Ci0JdTE2IHZhbDsKLQlpbnQgZXJyOwotCi0JZWVwcm9tLT5sZW4gPSAwOwotCi0JaWYgKG9mZnNldCAmIDEpIHsKLQkJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV9yZWFkMTYoY2hpcCwgb2Zmc2V0ID4+IDEsICZ2YWwpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQotCQkqZGF0YSsrID0gKHZhbCA+PiA4KSAmIDB4ZmY7Ci0KLQkJb2Zmc2V0Kys7Ci0JCWxlbi0tOwotCQllZXByb20tPmxlbisrOwotCX0KLQotCXdoaWxlIChsZW4gPj0gMikgewotCQllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3JlYWQxNihjaGlwLCBvZmZzZXQgPj4gMSwgJnZhbCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCi0JCSpkYXRhKysgPSB2YWwgJiAweGZmOwotCQkqZGF0YSsrID0gKHZhbCA+PiA4KSAmIDB4ZmY7Ci0KLQkJb2Zmc2V0ICs9IDI7Ci0JCWxlbiAtPSAyOwotCQllZXByb20tPmxlbiArPSAyOwotCX0KLQotCWlmIChsZW4pIHsKLQkJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV9yZWFkMTYoY2hpcCwgb2Zmc2V0ID4+IDEsICZ2YWwpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQotCQkqZGF0YSsrID0gdmFsICYgMHhmZjsKLQotCQlvZmZzZXQrKzsKLQkJbGVuLS07Ci0JCWVlcHJvbS0+bGVuKys7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgbXY4OGU2eHh4X2dldF9lZXByb20oc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAogCQkJCXN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZGF0YSkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlpbnQgZXJyOwogCisJaWYgKCFjaGlwLT5pbmZvLT5vcHMtPmdldF9lZXByb20pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQotCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHU19FRVBST00xNikpCi0JCWVyciA9IG12ODhlNnh4eF9nZXRfZWVwcm9tMTYoY2hpcCwgZWVwcm9tLCBkYXRhKTsKLQllbHNlCi0JCWVyciA9IC1FT1BOT1RTVVBQOwotCisJZXJyID0gY2hpcC0+aW5mby0+b3BzLT5nZXRfZWVwcm9tKGNoaXAsIGVlcHJvbSwgZGF0YSk7CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKIAlpZiAoZXJyKQpAQCAtMzU0MCw5MyArMzE4MywxMzkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtdjg4ZTZ4eHhfc2V0X2VlcHJvbTE2KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZGF0YSkKLXsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gZWVwcm9tLT5vZmZzZXQ7Ci0JdW5zaWduZWQgaW50IGxlbiA9IGVlcHJvbS0+bGVuOwotCXUxNiB2YWw7Ci0JaW50IGVycjsKLQotCS8qIEVuc3VyZSB0aGUgUk8gV3JpdGVFbiBiaXQgaXMgc2V0ICovCi0JZXJyID0gbXY4OGU2eHh4X3JlYWQoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfRUVQUk9NX0NNRCwgJnZhbCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmICghKHZhbCAmIEdMT0JBTDJfRUVQUk9NX0NNRF9XUklURV9FTikpCi0JCXJldHVybiAtRVJPRlM7Ci0KLQllZXByb20tPmxlbiA9IDA7Ci0KLQlpZiAob2Zmc2V0ICYgMSkgewotCQllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3JlYWQxNihjaGlwLCBvZmZzZXQgPj4gMSwgJnZhbCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCi0JCXZhbCA9ICgqZGF0YSsrIDw8IDgpIHwgKHZhbCAmIDB4ZmYpOwotCi0JCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fd3JpdGUxNihjaGlwLCBvZmZzZXQgPj4gMSwgdmFsKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJb2Zmc2V0Kys7Ci0JCWxlbi0tOwotCQllZXByb20tPmxlbisrOwotCX0KLQotCXdoaWxlIChsZW4gPj0gMikgewotCQl2YWwgPSAqZGF0YSsrOwotCQl2YWwgfD0gKmRhdGErKyA8PCA4OwotCi0JCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fd3JpdGUxNihjaGlwLCBvZmZzZXQgPj4gMSwgdmFsKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJb2Zmc2V0ICs9IDI7Ci0JCWxlbiAtPSAyOwotCQllZXByb20tPmxlbiArPSAyOwotCX0KLQotCWlmIChsZW4pIHsKLQkJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV9yZWFkMTYoY2hpcCwgb2Zmc2V0ID4+IDEsICZ2YWwpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQotCQl2YWwgPSAodmFsICYgMHhmZjAwKSB8ICpkYXRhKys7Ci0KLQkJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV93cml0ZTE2KGNoaXAsIG9mZnNldCA+PiAxLCB2YWwpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQotCQlvZmZzZXQrKzsKLQkJbGVuLS07Ci0JCWVlcHJvbS0+bGVuKys7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3NldF9lZXByb20oc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAogCQkJCXN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZGF0YSkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlpbnQgZXJyOwogCisJaWYgKCFjaGlwLT5pbmZvLT5vcHMtPnNldF9lZXByb20pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCWlmIChlZXByb20tPm1hZ2ljICE9IDB4YzNlYzQ5NTEpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwotCi0JaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdTX0VFUFJPTTE2KSkKLQkJZXJyID0gbXY4OGU2eHh4X3NldF9lZXByb20xNihjaGlwLCBlZXByb20sIGRhdGEpOwotCWVsc2UKLQkJZXJyID0gLUVPUE5PVFNVUFA7Ci0KKwllcnIgPSBjaGlwLT5pbmZvLT5vcHMtPnNldF9lZXByb20oY2hpcCwgZWVwcm9tLCBkYXRhKTsKIAltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTYwODVfb3BzID0geworCS5zZXRfc3dpdGNoX21hYyA9IG12ODhlNnh4eF9nMV9zZXRfc3dpdGNoX21hYywKKwkucGh5X3JlYWQgPSBtdjg4ZTZ4eHhfcGh5X3BwdV9yZWFkLAorCS5waHlfd3JpdGUgPSBtdjg4ZTZ4eHhfcGh5X3BwdV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTYwOTVfb3BzID0geworCS5zZXRfc3dpdGNoX21hYyA9IG12ODhlNnh4eF9nMV9zZXRfc3dpdGNoX21hYywKKwkucGh5X3JlYWQgPSBtdjg4ZTZ4eHhfcGh5X3BwdV9yZWFkLAorCS5waHlfd3JpdGUgPSBtdjg4ZTZ4eHhfcGh5X3BwdV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTYxMjNfb3BzID0geworCS5zZXRfc3dpdGNoX21hYyA9IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYywKKwkucGh5X3JlYWQgPSBtdjg4ZTZ4eHhfcmVhZCwKKwkucGh5X3dyaXRlID0gbXY4OGU2eHh4X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNjEzMV9vcHMgPSB7CisJLnNldF9zd2l0Y2hfbWFjID0gbXY4OGU2eHh4X2cxX3NldF9zd2l0Y2hfbWFjLAorCS5waHlfcmVhZCA9IG12ODhlNnh4eF9waHlfcHB1X3JlYWQsCisJLnBoeV93cml0ZSA9IG12ODhlNnh4eF9waHlfcHB1X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNjE2MV9vcHMgPSB7CisJLnNldF9zd2l0Y2hfbWFjID0gbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjLAorCS5waHlfcmVhZCA9IG12ODhlNnh4eF9yZWFkLAorCS5waHlfd3JpdGUgPSBtdjg4ZTZ4eHhfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2MTY1X29wcyA9IHsKKwkuc2V0X3N3aXRjaF9tYWMgPSBtdjg4ZTZ4eHhfZzJfc2V0X3N3aXRjaF9tYWMsCisJLnBoeV9yZWFkID0gbXY4OGU2eHh4X3JlYWQsCisJLnBoeV93cml0ZSA9IG12ODhlNnh4eF93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTYxNzFfb3BzID0geworCS5zZXRfc3dpdGNoX21hYyA9IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYywKKwkucGh5X3JlYWQgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV9yZWFkLAorCS5waHlfd3JpdGUgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTYxNzJfb3BzID0geworCS5nZXRfZWVwcm9tID0gbXY4OGU2eHh4X2cyX2dldF9lZXByb20xNiwKKwkuc2V0X2VlcHJvbSA9IG12ODhlNnh4eF9nMl9zZXRfZWVwcm9tMTYsCisJLnNldF9zd2l0Y2hfbWFjID0gbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjLAorCS5waHlfcmVhZCA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3JlYWQsCisJLnBoeV93cml0ZSA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNjE3NV9vcHMgPSB7CisJLnNldF9zd2l0Y2hfbWFjID0gbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjLAorCS5waHlfcmVhZCA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3JlYWQsCisJLnBoeV93cml0ZSA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNjE3Nl9vcHMgPSB7CisJLmdldF9lZXByb20gPSBtdjg4ZTZ4eHhfZzJfZ2V0X2VlcHJvbTE2LAorCS5zZXRfZWVwcm9tID0gbXY4OGU2eHh4X2cyX3NldF9lZXByb20xNiwKKwkuc2V0X3N3aXRjaF9tYWMgPSBtdjg4ZTZ4eHhfZzJfc2V0X3N3aXRjaF9tYWMsCisJLnBoeV9yZWFkID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfcmVhZCwKKwkucGh5X3dyaXRlID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2MTg1X29wcyA9IHsKKwkuc2V0X3N3aXRjaF9tYWMgPSBtdjg4ZTZ4eHhfZzFfc2V0X3N3aXRjaF9tYWMsCisJLnBoeV9yZWFkID0gbXY4OGU2eHh4X3BoeV9wcHVfcmVhZCwKKwkucGh5X3dyaXRlID0gbXY4OGU2eHh4X3BoeV9wcHVfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2MjQwX29wcyA9IHsKKwkuZ2V0X2VlcHJvbSA9IG12ODhlNnh4eF9nMl9nZXRfZWVwcm9tMTYsCisJLnNldF9lZXByb20gPSBtdjg4ZTZ4eHhfZzJfc2V0X2VlcHJvbTE2LAorCS5zZXRfc3dpdGNoX21hYyA9IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYywKKwkucGh5X3JlYWQgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV9yZWFkLAorCS5waHlfd3JpdGUgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTYzMjBfb3BzID0geworCS5nZXRfZWVwcm9tID0gbXY4OGU2eHh4X2cyX2dldF9lZXByb20xNiwKKwkuc2V0X2VlcHJvbSA9IG12ODhlNnh4eF9nMl9zZXRfZWVwcm9tMTYsCisJLnNldF9zd2l0Y2hfbWFjID0gbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjLAorCS5waHlfcmVhZCA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3JlYWQsCisJLnBoeV93cml0ZSA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNjMyMV9vcHMgPSB7CisJLmdldF9lZXByb20gPSBtdjg4ZTZ4eHhfZzJfZ2V0X2VlcHJvbTE2LAorCS5zZXRfZWVwcm9tID0gbXY4OGU2eHh4X2cyX3NldF9lZXByb20xNiwKKwkuc2V0X3N3aXRjaF9tYWMgPSBtdjg4ZTZ4eHhfZzJfc2V0X3N3aXRjaF9tYWMsCisJLnBoeV9yZWFkID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfcmVhZCwKKwkucGh5X3dyaXRlID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2MzUwX29wcyA9IHsKKwkuc2V0X3N3aXRjaF9tYWMgPSBtdjg4ZTZ4eHhfZzJfc2V0X3N3aXRjaF9tYWMsCisJLnBoeV9yZWFkID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfcmVhZCwKKwkucGh5X3dyaXRlID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2MzUxX29wcyA9IHsKKwkuc2V0X3N3aXRjaF9tYWMgPSBtdjg4ZTZ4eHhfZzJfc2V0X3N3aXRjaF9tYWMsCisJLnBoeV9yZWFkID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfcmVhZCwKKwkucGh5X3dyaXRlID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2MzUyX29wcyA9IHsKKwkuZ2V0X2VlcHJvbSA9IG12ODhlNnh4eF9nMl9nZXRfZWVwcm9tMTYsCisJLnNldF9lZXByb20gPSBtdjg4ZTZ4eHhfZzJfc2V0X2VlcHJvbTE2LAorCS5zZXRfc3dpdGNoX21hYyA9IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYywKKwkucGh5X3JlYWQgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV9yZWFkLAorCS5waHlfd3JpdGUgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV93cml0ZSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X2luZm8gbXY4OGU2eHh4X3RhYmxlW10gPSB7CiAJW01WODhFNjA4NV0gPSB7CiAJCS5wcm9kX251bSA9IFBPUlRfU1dJVENIX0lEX1BST0RfTlVNXzYwODUsCkBAIC0zNjM1LDggKzMzMjQsMTAgQEAKIAkJLm51bV9kYXRhYmFzZXMgPSA0MDk2LAogCQkubnVtX3BvcnRzID0gMTAsCiAJCS5wb3J0X2Jhc2VfYWRkciA9IDB4MTAsCisJCS5nbG9iYWwxX2FkZHIgPSAweDFiLAogCQkuYWdlX3RpbWVfY29lZmYgPSAxNTAwMCwKIAkJLmZsYWdzID0gTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MDk3LAorCQkub3BzID0gJm12ODhlNjA4NV9vcHMsCiAJfSwKIAogCVtNVjg4RTYwOTVdID0gewpAQCAtMzY0Niw4ICszMzM3LDEwIEBACiAJCS5udW1fZGF0YWJhc2VzID0gMjU2LAogCQkubnVtX3BvcnRzID0gMTEsCiAJCS5wb3J0X2Jhc2VfYWRkciA9IDB4MTAsCisJCS5nbG9iYWwxX2FkZHIgPSAweDFiLAogCQkuYWdlX3RpbWVfY29lZmYgPSAxNTAwMCwKIAkJLmZsYWdzID0gTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MDk1LAorCQkub3BzID0gJm12ODhlNjA5NV9vcHMsCiAJfSwKIAogCVtNVjg4RTYxMjNdID0gewpAQCAtMzY1Nyw4ICszMzUwLDEwIEBACiAJCS5udW1fZGF0YWJhc2VzID0gNDA5NiwKIAkJLm51bV9wb3J0cyA9IDMsCiAJCS5wb3J0X2Jhc2VfYWRkciA9IDB4MTAsCisJCS5nbG9iYWwxX2FkZHIgPSAweDFiLAogCQkuYWdlX3RpbWVfY29lZmYgPSAxNTAwMCwKIAkJLmZsYWdzID0gTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MTY1LAorCQkub3BzID0gJm12ODhlNjEyM19vcHMsCiAJfSwKIAogCVtNVjg4RTYxMzFdID0gewpAQCAtMzY2OCw4ICszMzYzLDEwIEBACiAJCS5udW1fZGF0YWJhc2VzID0gMjU2LAogCQkubnVtX3BvcnRzID0gOCwKIAkJLnBvcnRfYmFzZV9hZGRyID0gMHgxMCwKKwkJLmdsb2JhbDFfYWRkciA9IDB4MWIsCiAJCS5hZ2VfdGltZV9jb2VmZiA9IDE1MDAwLAogCQkuZmxhZ3MgPSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYxODUsCisJCS5vcHMgPSAmbXY4OGU2MTMxX29wcywKIAl9LAogCiAJW01WODhFNjE2MV0gPSB7CkBAIC0zNjc5LDggKzMzNzYsMTAgQEAKIAkJLm51bV9kYXRhYmFzZXMgPSA0MDk2LAogCQkubnVtX3BvcnRzID0gNiwKIAkJLnBvcnRfYmFzZV9hZGRyID0gMHgxMCwKKwkJLmdsb2JhbDFfYWRkciA9IDB4MWIsCiAJCS5hZ2VfdGltZV9jb2VmZiA9IDE1MDAwLAogCQkuZmxhZ3MgPSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYxNjUsCisJCS5vcHMgPSAmbXY4OGU2MTYxX29wcywKIAl9LAogCiAJW01WODhFNjE2NV0gPSB7CkBAIC0zNjkwLDggKzMzODksMTAgQEAKIAkJLm51bV9kYXRhYmFzZXMgPSA0MDk2LAogCQkubnVtX3BvcnRzID0gNiwKIAkJLnBvcnRfYmFzZV9hZGRyID0gMHgxMCwKKwkJLmdsb2JhbDFfYWRkciA9IDB4MWIsCiAJCS5hZ2VfdGltZV9jb2VmZiA9IDE1MDAwLAogCQkuZmxhZ3MgPSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYxNjUsCisJCS5vcHMgPSAmbXY4OGU2MTY1X29wcywKIAl9LAogCiAJW01WODhFNjE3MV0gPSB7CkBAIC0zNzAxLDggKzM0MDIsMTAgQEAKIAkJLm51bV9kYXRhYmFzZXMgPSA0MDk2LAogCQkubnVtX3BvcnRzID0gNywKIAkJLnBvcnRfYmFzZV9hZGRyID0gMHgxMCwKKwkJLmdsb2JhbDFfYWRkciA9IDB4MWIsCiAJCS5hZ2VfdGltZV9jb2VmZiA9IDE1MDAwLAogCQkuZmxhZ3MgPSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYzNTEsCisJCS5vcHMgPSAmbXY4OGU2MTcxX29wcywKIAl9LAogCiAJW01WODhFNjE3Ml0gPSB7CkBAIC0zNzEyLDggKzM0MTUsMTAgQEAKIAkJLm51bV9kYXRhYmFzZXMgPSA0MDk2LAogCQkubnVtX3BvcnRzID0gNywKIAkJLnBvcnRfYmFzZV9hZGRyID0gMHgxMCwKKwkJLmdsb2JhbDFfYWRkciA9IDB4MWIsCiAJCS5hZ2VfdGltZV9jb2VmZiA9IDE1MDAwLAogCQkuZmxhZ3MgPSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYzNTIsCisJCS5vcHMgPSAmbXY4OGU2MTcyX29wcywKIAl9LAogCiAJW01WODhFNjE3NV0gPSB7CkBAIC0zNzIzLDggKzM0MjgsMTAgQEAKIAkJLm51bV9kYXRhYmFzZXMgPSA0MDk2LAogCQkubnVtX3BvcnRzID0gNywKIAkJLnBvcnRfYmFzZV9hZGRyID0gMHgxMCwKKwkJLmdsb2JhbDFfYWRkciA9IDB4MWIsCiAJCS5hZ2VfdGltZV9jb2VmZiA9IDE1MDAwLAogCQkuZmxhZ3MgPSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYzNTEsCisJCS5vcHMgPSAmbXY4OGU2MTc1X29wcywKIAl9LAogCiAJW01WODhFNjE3Nl0gPSB7CkBAIC0zNzM0LDggKzM0NDEsMTAgQEAKIAkJLm51bV9kYXRhYmFzZXMgPSA0MDk2LAogCQkubnVtX3BvcnRzID0gNywKIAkJLnBvcnRfYmFzZV9hZGRyID0gMHgxMCwKKwkJLmdsb2JhbDFfYWRkciA9IDB4MWIsCiAJCS5hZ2VfdGltZV9jb2VmZiA9IDE1MDAwLAogCQkuZmxhZ3MgPSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYzNTIsCisJCS5vcHMgPSAmbXY4OGU2MTc2X29wcywKIAl9LAogCiAJW01WODhFNjE4NV0gPSB7CkBAIC0zNzQ1LDggKzM0NTQsMTAgQEAKIAkJLm51bV9kYXRhYmFzZXMgPSAyNTYsCiAJCS5udW1fcG9ydHMgPSAxMCwKIAkJLnBvcnRfYmFzZV9hZGRyID0gMHgxMCwKKwkJLmdsb2JhbDFfYWRkciA9IDB4MWIsCiAJCS5hZ2VfdGltZV9jb2VmZiA9IDE1MDAwLAogCQkuZmxhZ3MgPSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYxODUsCisJCS5vcHMgPSAmbXY4OGU2MTg1X29wcywKIAl9LAogCiAJW01WODhFNjI0MF0gPSB7CkBAIC0zNzU2LDggKzM0NjcsMTAgQEAKIAkJLm51bV9kYXRhYmFzZXMgPSA0MDk2LAogCQkubnVtX3BvcnRzID0gNywKIAkJLnBvcnRfYmFzZV9hZGRyID0gMHgxMCwKKwkJLmdsb2JhbDFfYWRkciA9IDB4MWIsCiAJCS5hZ2VfdGltZV9jb2VmZiA9IDE1MDAwLAogCQkuZmxhZ3MgPSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYzNTIsCisJCS5vcHMgPSAmbXY4OGU2MjQwX29wcywKIAl9LAogCiAJW01WODhFNjMyMF0gPSB7CkBAIC0zNzY3LDggKzM0ODAsMTAgQEAKIAkJLm51bV9kYXRhYmFzZXMgPSA0MDk2LAogCQkubnVtX3BvcnRzID0gNywKIAkJLnBvcnRfYmFzZV9hZGRyID0gMHgxMCwKKwkJLmdsb2JhbDFfYWRkciA9IDB4MWIsCiAJCS5hZ2VfdGltZV9jb2VmZiA9IDE1MDAwLAogCQkuZmxhZ3MgPSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYzMjAsCisJCS5vcHMgPSAmbXY4OGU2MzIwX29wcywKIAl9LAogCiAJW01WODhFNjMyMV0gPSB7CkBAIC0zNzc4LDggKzM0OTMsMTAgQEAKIAkJLm51bV9kYXRhYmFzZXMgPSA0MDk2LAogCQkubnVtX3BvcnRzID0gNywKIAkJLnBvcnRfYmFzZV9hZGRyID0gMHgxMCwKKwkJLmdsb2JhbDFfYWRkciA9IDB4MWIsCiAJCS5hZ2VfdGltZV9jb2VmZiA9IDE1MDAwLAogCQkuZmxhZ3MgPSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYzMjAsCisJCS5vcHMgPSAmbXY4OGU2MzIxX29wcywKIAl9LAogCiAJW01WODhFNjM1MF0gPSB7CkBAIC0zNzg5LDggKzM1MDYsMTAgQEAKIAkJLm51bV9kYXRhYmFzZXMgPSA0MDk2LAogCQkubnVtX3BvcnRzID0gNywKIAkJLnBvcnRfYmFzZV9hZGRyID0gMHgxMCwKKwkJLmdsb2JhbDFfYWRkciA9IDB4MWIsCiAJCS5hZ2VfdGltZV9jb2VmZiA9IDE1MDAwLAogCQkuZmxhZ3MgPSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYzNTEsCisJCS5vcHMgPSAmbXY4OGU2MzUwX29wcywKIAl9LAogCiAJW01WODhFNjM1MV0gPSB7CkBAIC0zODAwLDggKzM1MTksMTAgQEAKIAkJLm51bV9kYXRhYmFzZXMgPSA0MDk2LAogCQkubnVtX3BvcnRzID0gNywKIAkJLnBvcnRfYmFzZV9hZGRyID0gMHgxMCwKKwkJLmdsb2JhbDFfYWRkciA9IDB4MWIsCiAJCS5hZ2VfdGltZV9jb2VmZiA9IDE1MDAwLAogCQkuZmxhZ3MgPSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYzNTEsCisJCS5vcHMgPSAmbXY4OGU2MzUxX29wcywKIAl9LAogCiAJW01WODhFNjM1Ml0gPSB7CkBAIC0zODExLDggKzM1MzIsMTAgQEAKIAkJLm51bV9kYXRhYmFzZXMgPSA0MDk2LAogCQkubnVtX3BvcnRzID0gNywKIAkJLnBvcnRfYmFzZV9hZGRyID0gMHgxMCwKKwkJLmdsb2JhbDFfYWRkciA9IDB4MWIsCiAJCS5hZ2VfdGltZV9jb2VmZiA9IDE1MDAwLAogCQkuZmxhZ3MgPSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYzNTIsCisJCS5vcHMgPSAmbXY4OGU2MzUyX29wcywKIAl9LAogfTsKIApAQCAtMzg1MCw2ICszNTczLDEwIEBACiAJLyogVXBkYXRlIHRoZSBjb21wYXRpYmxlIGluZm8gd2l0aCB0aGUgcHJvYmVkIG9uZSAqLwogCWNoaXAtPmluZm8gPSBpbmZvOwogCisJZXJyID0gbXY4OGU2eHh4X2cyX3JlcXVpcmUoY2hpcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogCWRldl9pbmZvKGNoaXAtPmRldiwgInN3aXRjaCAweCV4IGRldGVjdGVkOiAlcywgcmV2aXNpb24gJXVcbiIsCiAJCSBjaGlwLT5pbmZvLT5wcm9kX251bSwgY2hpcC0+aW5mby0+bmFtZSwgcmV2KTsKIApAQCAtMzg3MSw2ICszNTk4LDE4IEBACiAJcmV0dXJuIGNoaXA7CiB9CiAKK3N0YXRpYyB2b2lkIG12ODhlNnh4eF9waHlfaW5pdChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCit7CisJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfUFBVKSkKKwkJbXY4OGU2eHh4X3BwdV9zdGF0ZV9pbml0KGNoaXApOworfQorCitzdGF0aWMgdm9pZCBtdjg4ZTZ4eHhfcGh5X2Rlc3Ryb3koc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQoreworCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX1BQVSkpCisJCW12ODhlNnh4eF9wcHVfc3RhdGVfZGVzdHJveShjaGlwKTsKK30KKwogc3RhdGljIGludCBtdjg4ZTZ4eHhfc21pX2luaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAogCQkJICAgICAgc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHN3X2FkZHIpCiB7CkBAIC0zODgwLDcgKzM2MTksNyBAQAogCiAJaWYgKHN3X2FkZHIgPT0gMCkKIAkJY2hpcC0+c21pX29wcyA9ICZtdjg4ZTZ4eHhfc21pX3NpbmdsZV9jaGlwX29wczsKLQllbHNlIGlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX01VTFRJX0NISVApKQorCWVsc2UgaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdTX01VTFRJX0NISVApKQogCQljaGlwLT5zbWlfb3BzID0gJm12ODhlNnh4eF9zbWlfbXVsdGlfY2hpcF9vcHM7CiAJZWxzZQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM4OTEsNiArMzYzMCwxNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgZW51bSBkc2FfdGFnX3Byb3RvY29sIG12ODhlNnh4eF9nZXRfdGFnX3Byb3RvY29sKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKKworCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX0VEU0EpKQorCQlyZXR1cm4gRFNBX1RBR19QUk9UT19FRFNBOworCisJcmV0dXJuIERTQV9UQUdfUFJPVE9fRFNBOworfQorCiBzdGF0aWMgY29uc3QgY2hhciAqbXY4OGU2eHh4X2Rydl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkc2FfZGV2LAogCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpob3N0X2RldiwgaW50IHN3X2FkZHIsCiAJCQkJICAgICAgIHZvaWQgKipwcml2KQpAQCAtMzkxOCw2ICszNjY3LDggQEAKIAlpZiAoZXJyKQogCQlnb3RvIGZyZWU7CiAKKwltdjg4ZTZ4eHhfcGh5X2luaXQoY2hpcCk7CisKIAllcnIgPSBtdjg4ZTZ4eHhfbWRpb19yZWdpc3RlcihjaGlwLCBOVUxMKTsKIAlpZiAoZXJyKQogCQlnb3RvIGZyZWU7CkBAIC0zOTMxLDkgKzM2ODIsNjEgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciBtdjg4ZTZ4eHhfc3dpdGNoX2RyaXZlciA9IHsKLQkudGFnX3Byb3RvY29sCQk9IERTQV9UQUdfUFJPVE9fRURTQSwKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X3BvcnRfbWRiX3ByZXBhcmUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X21kYiAqbWRiLAorCQkJCSAgICAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQoreworCS8qIFdlIGRvbid0IG5lZWQgYW55IGR5bmFtaWMgcmVzb3VyY2UgZnJvbSB0aGUga2VybmVsICh5ZXQpLAorCSAqIHNvIHNraXAgdGhlIHByZXBhcmUgcGhhc2UuCisJICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXY4OGU2eHh4X3BvcnRfbWRiX2FkZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfbWRiICptZGIsCisJCQkJICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CisKKwltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJaWYgKG12ODhlNnh4eF9wb3J0X2RiX2xvYWRfcHVyZ2UoY2hpcCwgcG9ydCwgbWRiLT5hZGRyLCBtZGItPnZpZCwKKwkJCQkJIEdMT0JBTF9BVFVfREFUQV9TVEFURV9NQ19TVEFUSUMpKQorCQluZXRkZXZfZXJyKGRzLT5wb3J0c1twb3J0XS5uZXRkZXYsICJmYWlsZWQgdG8gbG9hZCBtdWx0aWNhc3QgTUFDIGFkZHJlc3NcbiIpOworCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X21kYl9kZWwoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfbWRiICptZGIpCit7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwllcnIgPSBtdjg4ZTZ4eHhfcG9ydF9kYl9sb2FkX3B1cmdlKGNoaXAsIHBvcnQsIG1kYi0+YWRkciwgbWRiLT52aWQsCisJCQkJCSAgIEdMT0JBTF9BVFVfREFUQV9TVEFURV9VTlVTRUQpOworCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfcG9ydF9tZGJfZHVtcChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkJCSAgIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfbWRiICptZGIsCisJCQkJICAgaW50ICgqY2IpKHN0cnVjdCBzd2l0Y2hkZXZfb2JqICpvYmopKQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJZXJyID0gbXY4OGU2eHh4X3BvcnRfZGJfZHVtcChjaGlwLCBwb3J0LCAmbWRiLT5vYmosIGNiKTsKKwltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHNhX3N3aXRjaF9vcHMgbXY4OGU2eHh4X3N3aXRjaF9vcHMgPSB7CiAJLnByb2JlCQkJPSBtdjg4ZTZ4eHhfZHJ2X3Byb2JlLAorCS5nZXRfdGFnX3Byb3RvY29sCT0gbXY4OGU2eHh4X2dldF90YWdfcHJvdG9jb2wsCiAJLnNldHVwCQkJPSBtdjg4ZTZ4eHhfc2V0dXAsCiAJLnNldF9hZGRyCQk9IG12ODhlNnh4eF9zZXRfYWRkciwKIAkuYWRqdXN0X2xpbmsJCT0gbXY4OGU2eHh4X2FkanVzdF9saW5rLApAQCAtMzk1Nyw2ICszNzYwLDcgQEAKIAkucG9ydF9icmlkZ2Vfam9pbgk9IG12ODhlNnh4eF9wb3J0X2JyaWRnZV9qb2luLAogCS5wb3J0X2JyaWRnZV9sZWF2ZQk9IG12ODhlNnh4eF9wb3J0X2JyaWRnZV9sZWF2ZSwKIAkucG9ydF9zdHBfc3RhdGVfc2V0CT0gbXY4OGU2eHh4X3BvcnRfc3RwX3N0YXRlX3NldCwKKwkucG9ydF9mYXN0X2FnZQkJPSBtdjg4ZTZ4eHhfcG9ydF9mYXN0X2FnZSwKIAkucG9ydF92bGFuX2ZpbHRlcmluZwk9IG12ODhlNnh4eF9wb3J0X3ZsYW5fZmlsdGVyaW5nLAogCS5wb3J0X3ZsYW5fcHJlcGFyZQk9IG12ODhlNnh4eF9wb3J0X3ZsYW5fcHJlcGFyZSwKIAkucG9ydF92bGFuX2FkZAkJPSBtdjg4ZTZ4eHhfcG9ydF92bGFuX2FkZCwKQEAgLTM5NjYsNiArMzc3MCwxMCBAQAogCS5wb3J0X2ZkYl9hZGQgICAgICAgICAgID0gbXY4OGU2eHh4X3BvcnRfZmRiX2FkZCwKIAkucG9ydF9mZGJfZGVsICAgICAgICAgICA9IG12ODhlNnh4eF9wb3J0X2ZkYl9kZWwsCiAJLnBvcnRfZmRiX2R1bXAgICAgICAgICAgPSBtdjg4ZTZ4eHhfcG9ydF9mZGJfZHVtcCwKKwkucG9ydF9tZGJfcHJlcGFyZSAgICAgICA9IG12ODhlNnh4eF9wb3J0X21kYl9wcmVwYXJlLAorCS5wb3J0X21kYl9hZGQgICAgICAgICAgID0gbXY4OGU2eHh4X3BvcnRfbWRiX2FkZCwKKwkucG9ydF9tZGJfZGVsICAgICAgICAgICA9IG12ODhlNnh4eF9wb3J0X21kYl9kZWwsCisJLnBvcnRfbWRiX2R1bXAgICAgICAgICAgPSBtdjg4ZTZ4eHhfcG9ydF9tZGJfZHVtcCwKIH07CiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3JlZ2lzdGVyX3N3aXRjaChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCkBAIC0zOTgwLDcgKzM3ODgsNyBAQAogCiAJZHMtPmRldiA9IGRldjsKIAlkcy0+cHJpdiA9IGNoaXA7Ci0JZHMtPmRydiA9ICZtdjg4ZTZ4eHhfc3dpdGNoX2RyaXZlcjsKKwlkcy0+b3BzID0gJm12ODhlNnh4eF9zd2l0Y2hfb3BzOwogCiAJZGV2X3NldF9kcnZkYXRhKGRldiwgZHMpOwogCkBAIC00MDE5LDExICszODI3LDEzIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAorCW12ODhlNnh4eF9waHlfaW5pdChjaGlwKTsKKwogCWNoaXAtPnJlc2V0ID0gZGV2bV9ncGlvZF9nZXRfb3B0aW9uYWwoZGV2LCAicmVzZXQiLCBHUElPRF9BU0lTKTsKIAlpZiAoSVNfRVJSKGNoaXAtPnJlc2V0KSkKIAkJcmV0dXJuIFBUUl9FUlIoY2hpcC0+cmVzZXQpOwogCi0JaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdTX0VFUFJPTTE2KSAmJgorCWlmIChjaGlwLT5pbmZvLT5vcHMtPmdldF9lZXByb20gJiYKIAkgICAgIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZWVwcm9tLWxlbmd0aCIsICZlZXByb21fbGVuKSkKIAkJY2hpcC0+ZWVwcm9tX2xlbiA9IGVlcHJvbV9sZW47CiAKQEAgLTQwNDMsOCArMzg1Myw5IEBACiBzdGF0aWMgdm9pZCBtdjg4ZTZ4eHhfcmVtb3ZlKHN0cnVjdCBtZGlvX2RldmljZSAqbWRpb2RldikKIHsKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBkZXZfZ2V0X2RydmRhdGEoJm1kaW9kZXYtPmRldik7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAKKwltdjg4ZTZ4eHhfcGh5X2Rlc3Ryb3koY2hpcCk7CiAJbXY4OGU2eHh4X3VucmVnaXN0ZXJfc3dpdGNoKGNoaXApOwogCW12ODhlNnh4eF9tZGlvX3VucmVnaXN0ZXIoY2hpcCk7CiB9CkBAIC00MDcwLDcgKzM4ODEsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBtdjg4ZTZ4eHhfaW5pdCh2b2lkKQogewotCXJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoJm12ODhlNnh4eF9zd2l0Y2hfZHJpdmVyKTsKKwlyZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKCZtdjg4ZTZ4eHhfc3dpdGNoX29wcyk7CiAJcmV0dXJuIG1kaW9fZHJpdmVyX3JlZ2lzdGVyKCZtdjg4ZTZ4eHhfZHJpdmVyKTsKIH0KIG1vZHVsZV9pbml0KG12ODhlNnh4eF9pbml0KTsKQEAgLTQwNzgsNyArMzg4OSw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgbXY4OGU2eHh4X2NsZWFudXAodm9pZCkKIHsKIAltZGlvX2RyaXZlcl91bnJlZ2lzdGVyKCZtdjg4ZTZ4eHhfZHJpdmVyKTsKLQl1bnJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoJm12ODhlNnh4eF9zd2l0Y2hfZHJpdmVyKTsKKwl1bnJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoJm12ODhlNnh4eF9zd2l0Y2hfb3BzKTsKIH0KIG1vZHVsZV9leGl0KG12ODhlNnh4eF9jbGVhbnVwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9nbG9iYWwxLmMgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L2dsb2JhbDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzU4NzIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9nbG9iYWwxLmMKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIE1hcnZlbGwgODhFNnh4eCBTd2l0Y2ggR2xvYmFsICgxKSBSZWdpc3RlcnMgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYXJ2ZWxsIFNlbWljb25kdWN0b3IKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgVml2aWVuIERpZGVsb3QgPHZpdmllbi5kaWRlbG90QHNhdm9pcmZhaXJlbGludXguY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgIm12ODhlNnh4eC5oIgorI2luY2x1ZGUgImdsb2JhbDEuaCIKKworaW50IG12ODhlNnh4eF9nMV9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHJlZywgdTE2ICp2YWwpCit7CisJaW50IGFkZHIgPSBjaGlwLT5pbmZvLT5nbG9iYWwxX2FkZHI7CisKKwlyZXR1cm4gbXY4OGU2eHh4X3JlYWQoY2hpcCwgYWRkciwgcmVnLCB2YWwpOworfQorCitpbnQgbXY4OGU2eHh4X2cxX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlpbnQgYWRkciA9IGNoaXAtPmluZm8tPmdsb2JhbDFfYWRkcjsKKworCXJldHVybiBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgYWRkciwgcmVnLCB2YWwpOworfQorCitpbnQgbXY4OGU2eHh4X2cxX3dhaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1MTYgbWFzaykKK3sKKwlyZXR1cm4gbXY4OGU2eHh4X3dhaXQoY2hpcCwgY2hpcC0+aW5mby0+Z2xvYmFsMV9hZGRyLCByZWcsIG1hc2spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9nbG9iYWwxLmggYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L2dsb2JhbDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjI5MWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9nbG9iYWwxLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIE1hcnZlbGwgODhFNnh4eCBTd2l0Y2ggR2xvYmFsICgxKSBSZWdpc3RlcnMgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYXJ2ZWxsIFNlbWljb25kdWN0b3IKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgVml2aWVuIERpZGVsb3QgPHZpdmllbi5kaWRlbG90QHNhdm9pcmZhaXJlbGludXguY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTVY4OEU2WFhYX0dMT0JBTDFfSAorI2RlZmluZSBfTVY4OEU2WFhYX0dMT0JBTDFfSAorCisjaW5jbHVkZSAibXY4OGU2eHh4LmgiCisKK2ludCBtdjg4ZTZ4eHhfZzFfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCByZWcsIHUxNiAqdmFsKTsKK2ludCBtdjg4ZTZ4eHhfZzFfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1MTYgdmFsKTsKK2ludCBtdjg4ZTZ4eHhfZzFfd2FpdChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCByZWcsIHUxNiBtYXNrKTsKKworI2VuZGlmIC8qIF9NVjg4RTZYWFhfR0xPQkFMMV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L2dsb2JhbDIuYyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvZ2xvYmFsMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjg2ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L2dsb2JhbDIuYwpAQCAtMCwwICsxLDQ5MSBAQAorLyoKKyAqIE1hcnZlbGwgODhFNnh4eCBTd2l0Y2ggR2xvYmFsIDIgUmVnaXN0ZXJzIHN1cHBvcnQgKGRldmljZSBhZGRyZXNzIDB4MUMpCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1hcnZlbGwgU2VtaWNvbmR1Y3RvcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBWaXZpZW4gRGlkZWxvdCA8dml2aWVuLmRpZGVsb3RAc2F2b2lyZmFpcmVsaW51eC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSAibXY4OGU2eHh4LmgiCisjaW5jbHVkZSAiZ2xvYmFsMi5oIgorCisjZGVmaW5lIEFERFJfR0xPQkFMMgkweDFjCisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3JlYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1MTYgKnZhbCkKK3sKKwlyZXR1cm4gbXY4OGU2eHh4X3JlYWQoY2hpcCwgQUREUl9HTE9CQUwyLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlyZXR1cm4gbXY4OGU2eHh4X3dyaXRlKGNoaXAsIEFERFJfR0xPQkFMMiwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl91cGRhdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1MTYgdXBkYXRlKQoreworCXJldHVybiBtdjg4ZTZ4eHhfdXBkYXRlKGNoaXAsIEFERFJfR0xPQkFMMiwgcmVnLCB1cGRhdGUpOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl93YWl0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHJlZywgdTE2IG1hc2spCit7CisJcmV0dXJuIG12ODhlNnh4eF93YWl0KGNoaXAsIEFERFJfR0xPQkFMMiwgcmVnLCBtYXNrKTsKK30KKworLyogT2Zmc2V0IDB4MDY6IERldmljZSBNYXBwaW5nIFRhYmxlIHJlZ2lzdGVyICovCisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX2RldmljZV9tYXBwaW5nX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKKwkJCQkJICAgICBpbnQgdGFyZ2V0LCBpbnQgcG9ydCkKK3sKKwl1MTYgdmFsID0gKHRhcmdldCA8PCA4KSB8IChwb3J0ICYgMHhmKTsKKworCXJldHVybiBtdjg4ZTZ4eHhfZzJfdXBkYXRlKGNoaXAsIEdMT0JBTDJfREVWSUNFX01BUFBJTkcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3NldF9kZXZpY2VfbWFwcGluZyhzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCit7CisJaW50IHRhcmdldCwgcG9ydDsKKwlpbnQgZXJyOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcm91dGluZyBwb3J0IHRvIHRoZSAzMiBwb3NzaWJsZSB0YXJnZXQgZGV2aWNlcyAqLworCWZvciAodGFyZ2V0ID0gMDsgdGFyZ2V0IDwgMzI7ICsrdGFyZ2V0KSB7CisJCXBvcnQgPSAweGY7CisKKwkJaWYgKHRhcmdldCA8IERTQV9NQVhfU1dJVENIRVMpIHsKKwkJCXBvcnQgPSBjaGlwLT5kcy0+cnRhYmxlW3RhcmdldF07CisJCQlpZiAocG9ydCA9PSBEU0FfUlRBQkxFX05PTkUpCisJCQkJcG9ydCA9IDB4ZjsKKwkJfQorCisJCWVyciA9IG12ODhlNnh4eF9nMl9kZXZpY2VfbWFwcGluZ193cml0ZShjaGlwLCB0YXJnZXQsIHBvcnQpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyogT2Zmc2V0IDB4MDc6IFRydW5rIE1hc2sgVGFibGUgcmVnaXN0ZXIgKi8KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfdHJ1bmtfbWFza193cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBudW0sCisJCQkJCSBib29sIGhhc2ssIHUxNiBtYXNrKQoreworCWNvbnN0IHUxNiBwb3J0X21hc2sgPSBCSVQobXY4OGU2eHh4X251bV9wb3J0cyhjaGlwKSkgLSAxOworCXUxNiB2YWwgPSAobnVtIDw8IDEyKSB8IChtYXNrICYgcG9ydF9tYXNrKTsKKworCWlmIChoYXNrKQorCQl2YWwgfD0gR0xPQkFMMl9UUlVOS19NQVNLX0hBU0s7CisKKwlyZXR1cm4gbXY4OGU2eHh4X2cyX3VwZGF0ZShjaGlwLCBHTE9CQUwyX1RSVU5LX01BU0ssIHZhbCk7Cit9CisKKy8qIE9mZnNldCAweDA4OiBUcnVuayBNYXBwaW5nIFRhYmxlIHJlZ2lzdGVyICovCisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3RydW5rX21hcHBpbmdfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgaWQsCisJCQkJCSAgICB1MTYgbWFwKQoreworCWNvbnN0IHUxNiBwb3J0X21hc2sgPSBCSVQobXY4OGU2eHh4X251bV9wb3J0cyhjaGlwKSkgLSAxOworCXUxNiB2YWwgPSAoaWQgPDwgMTEpIHwgKG1hcCAmIHBvcnRfbWFzayk7CisKKwlyZXR1cm4gbXY4OGU2eHh4X2cyX3VwZGF0ZShjaGlwLCBHTE9CQUwyX1RSVU5LX01BUFBJTkcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX2NsZWFyX3RydW5rKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKK3sKKwljb25zdCB1MTYgcG9ydF9tYXNrID0gQklUKG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCkpIC0gMTsKKwlpbnQgaSwgZXJyOworCisJLyogQ2xlYXIgYWxsIGVpZ2h0IHBvc3NpYmxlIFRydW5rIE1hc2sgdmVjdG9ycyAqLworCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKwkJZXJyID0gbXY4OGU2eHh4X2cyX3RydW5rX21hc2tfd3JpdGUoY2hpcCwgaSwgZmFsc2UsIHBvcnRfbWFzayk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIENsZWFyIGFsbCBzaXh0ZWVuIHBvc3NpYmxlIFRydW5rIElEIHJvdXRpbmcgdmVjdG9ycyAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisJCWVyciA9IG12ODhlNnh4eF9nMl90cnVua19tYXBwaW5nX3dyaXRlKGNoaXAsIGksIDApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogT2Zmc2V0IDB4MDk6IEluZ3Jlc3MgUmF0ZSBDb21tYW5kIHJlZ2lzdGVyCisgKiBPZmZzZXQgMHgwQTogSW5ncmVzcyBSYXRlIERhdGEgcmVnaXN0ZXIKKyAqLworCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl9jbGVhcl9pcmwoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQoreworCWludCBwb3J0LCBlcnI7CisKKwkvKiBJbml0IGFsbCBJbmdyZXNzIFJhdGUgTGltaXQgcmVzb3VyY2VzIG9mIGFsbCBwb3J0cyAqLworCWZvciAocG9ydCA9IDA7IHBvcnQgPCBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApOyArK3BvcnQpIHsKKwkJLyogWFhYIG5ld2VyIGNoaXBzIChsaWtlIDg4RTYzOTApIGhhdmUgZGlmZmVyZW50IDItYml0IG9wcyAqLworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfd3JpdGUoY2hpcCwgR0xPQkFMMl9JUkxfQ01ELAorCQkJCQkgR0xPQkFMMl9JUkxfQ01EX09QX0lOSVRfQUxMIHwKKwkJCQkJIChwb3J0IDw8IDgpKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCisJCS8qIFdhaXQgZm9yIHRoZSBvcGVyYXRpb24gdG8gY29tcGxldGUgKi8KKwkJZXJyID0gbXY4OGU2eHh4X2cyX3dhaXQoY2hpcCwgR0xPQkFMMl9JUkxfQ01ELAorCQkJCQlHTE9CQUwyX0lSTF9DTURfQlVTWSk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBPZmZzZXQgMHgwRDogU3dpdGNoIE1BQy9Xb0wvV29GIHJlZ2lzdGVyICovCisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3N3aXRjaF9tYWNfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAorCQkJCQkgdW5zaWduZWQgaW50IHBvaW50ZXIsIHU4IGRhdGEpCit7CisJdTE2IHZhbCA9IChwb2ludGVyIDw8IDgpIHwgZGF0YTsKKworCXJldHVybiBtdjg4ZTZ4eHhfZzJfdXBkYXRlKGNoaXAsIEdMT0JBTDJfU1dJVENIX01BQywgdmFsKTsKK30KKworaW50IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYyhzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHU4ICphZGRyKQoreworCWludCBpLCBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWVyciA9IG12ODhlNnh4eF9nMl9zd2l0Y2hfbWFjX3dyaXRlKGNoaXAsIGksIGFkZHJbaV0pOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyogT2Zmc2V0IDB4MEY6IFByaW9yaXR5IE92ZXJyaWRlIFRhYmxlICovCisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3BvdF93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwb2ludGVyLAorCQkJCSAgdTggZGF0YSkKK3sKKwl1MTYgdmFsID0gKHBvaW50ZXIgPDwgOCkgfCAoZGF0YSAmIDB4Nyk7CisKKwlyZXR1cm4gbXY4OGU2eHh4X2cyX3VwZGF0ZShjaGlwLCBHTE9CQUwyX1BSSU9fT1ZFUlJJREUsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX2NsZWFyX3BvdChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCit7CisJaW50IGksIGVycjsKKworCS8qIENsZWFyIGFsbCBzaXh0ZWVuIHBvc3NpYmxlIFByaW9yaXR5IE92ZXJyaWRlIGVudHJpZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfcG90X3dyaXRlKGNoaXAsIGksIDApOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyogT2Zmc2V0IDB4MTQ6IEVFUFJPTSBDb21tYW5kCisgKiBPZmZzZXQgMHgxNTogRUVQUk9NIERhdGEKKyAqLworCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl9lZXByb21fd2FpdChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCit7CisJcmV0dXJuIG12ODhlNnh4eF9nMl93YWl0KGNoaXAsIEdMT0JBTDJfRUVQUk9NX0NNRCwKKwkJCQkgR0xPQkFMMl9FRVBST01fQ01EX0JVU1kgfAorCQkJCSBHTE9CQUwyX0VFUFJPTV9DTURfUlVOTklORyk7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX2VlcHJvbV9jbWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCB1MTYgY21kKQoreworCWludCBlcnI7CisKKwllcnIgPSBtdjg4ZTZ4eHhfZzJfd3JpdGUoY2hpcCwgR0xPQkFMMl9FRVBST01fQ01ELCBjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gbXY4OGU2eHh4X2cyX2VlcHJvbV93YWl0KGNoaXApOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl9lZXByb21fcmVhZDE2KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKKwkJCQkgICAgICB1OCBhZGRyLCB1MTYgKmRhdGEpCit7CisJdTE2IGNtZCA9IEdMT0JBTDJfRUVQUk9NX0NNRF9PUF9SRUFEIHwgYWRkcjsKKwlpbnQgZXJyOworCisJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV93YWl0KGNoaXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX2NtZChjaGlwLCBjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gbXY4OGU2eHh4X2cyX3JlYWQoY2hpcCwgR0xPQkFMMl9FRVBST01fREFUQSwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX2VlcHJvbV93cml0ZTE2KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKKwkJCQkgICAgICAgdTggYWRkciwgdTE2IGRhdGEpCit7CisJdTE2IGNtZCA9IEdMT0JBTDJfRUVQUk9NX0NNRF9PUF9XUklURSB8IGFkZHI7CisJaW50IGVycjsKKworCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fd2FpdChjaGlwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gbXY4OGU2eHh4X2cyX3dyaXRlKGNoaXAsIEdMT0JBTDJfRUVQUk9NX0RBVEEsIGRhdGEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gbXY4OGU2eHh4X2cyX2VlcHJvbV9jbWQoY2hpcCwgY21kKTsKK30KKworaW50IG12ODhlNnh4eF9nMl9nZXRfZWVwcm9tMTYoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQgPSBlZXByb20tPm9mZnNldDsKKwl1bnNpZ25lZCBpbnQgbGVuID0gZWVwcm9tLT5sZW47CisJdTE2IHZhbDsKKwlpbnQgZXJyOworCisJZWVwcm9tLT5sZW4gPSAwOworCisJaWYgKG9mZnNldCAmIDEpIHsKKwkJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV9yZWFkMTYoY2hpcCwgb2Zmc2V0ID4+IDEsICZ2YWwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQkqZGF0YSsrID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisKKwkJb2Zmc2V0Kys7CisJCWxlbi0tOworCQllZXByb20tPmxlbisrOworCX0KKworCXdoaWxlIChsZW4gPj0gMikgeworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3JlYWQxNihjaGlwLCBvZmZzZXQgPj4gMSwgJnZhbCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCSpkYXRhKysgPSB2YWwgJiAweGZmOworCQkqZGF0YSsrID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisKKwkJb2Zmc2V0ICs9IDI7CisJCWxlbiAtPSAyOworCQllZXByb20tPmxlbiArPSAyOworCX0KKworCWlmIChsZW4pIHsKKwkJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV9yZWFkMTYoY2hpcCwgb2Zmc2V0ID4+IDEsICZ2YWwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQkqZGF0YSsrID0gdmFsICYgMHhmZjsKKworCQlvZmZzZXQrKzsKKwkJbGVuLS07CisJCWVlcHJvbS0+bGVuKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBtdjg4ZTZ4eHhfZzJfc2V0X2VlcHJvbTE2KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKKwkJCSAgICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gZWVwcm9tLT5vZmZzZXQ7CisJdW5zaWduZWQgaW50IGxlbiA9IGVlcHJvbS0+bGVuOworCXUxNiB2YWw7CisJaW50IGVycjsKKworCS8qIEVuc3VyZSB0aGUgUk8gV3JpdGVFbiBiaXQgaXMgc2V0ICovCisJZXJyID0gbXY4OGU2eHh4X2cyX3JlYWQoY2hpcCwgR0xPQkFMMl9FRVBST01fQ01ELCAmdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCEodmFsICYgR0xPQkFMMl9FRVBST01fQ01EX1dSSVRFX0VOKSkKKwkJcmV0dXJuIC1FUk9GUzsKKworCWVlcHJvbS0+bGVuID0gMDsKKworCWlmIChvZmZzZXQgJiAxKSB7CisJCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fcmVhZDE2KGNoaXAsIG9mZnNldCA+PiAxLCAmdmFsKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJdmFsID0gKCpkYXRhKysgPDwgOCkgfCAodmFsICYgMHhmZik7CisKKwkJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV93cml0ZTE2KGNoaXAsIG9mZnNldCA+PiAxLCB2YWwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlvZmZzZXQrKzsKKwkJbGVuLS07CisJCWVlcHJvbS0+bGVuKys7CisJfQorCisJd2hpbGUgKGxlbiA+PSAyKSB7CisJCXZhbCA9ICpkYXRhKys7CisJCXZhbCB8PSAqZGF0YSsrIDw8IDg7CisKKwkJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV93cml0ZTE2KGNoaXAsIG9mZnNldCA+PiAxLCB2YWwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlvZmZzZXQgKz0gMjsKKwkJbGVuIC09IDI7CisJCWVlcHJvbS0+bGVuICs9IDI7CisJfQorCisJaWYgKGxlbikgeworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3JlYWQxNihjaGlwLCBvZmZzZXQgPj4gMSwgJnZhbCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCXZhbCA9ICh2YWwgJiAweGZmMDApIHwgKmRhdGErKzsKKworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3dyaXRlMTYoY2hpcCwgb2Zmc2V0ID4+IDEsIHZhbCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCW9mZnNldCsrOworCQlsZW4tLTsKKwkJZWVwcm9tLT5sZW4rKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogT2Zmc2V0IDB4MTg6IFNNSSBQSFkgQ29tbWFuZCBSZWdpc3RlcgorICogT2Zmc2V0IDB4MTk6IFNNSSBQSFkgRGF0YSBSZWdpc3RlcgorICovCisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3NtaV9waHlfd2FpdChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCit7CisJcmV0dXJuIG12ODhlNnh4eF9nMl93YWl0KGNoaXAsIEdMT0JBTDJfU01JX1BIWV9DTUQsCisJCQkJIEdMT0JBTDJfU01JX1BIWV9DTURfQlVTWSk7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3NtaV9waHlfY21kKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTE2IGNtZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gbXY4OGU2eHh4X2cyX3dyaXRlKGNoaXAsIEdMT0JBTDJfU01JX1BIWV9DTUQsIGNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBtdjg4ZTZ4eHhfZzJfc21pX3BoeV93YWl0KGNoaXApOworfQorCitpbnQgbXY4OGU2eHh4X2cyX3NtaV9waHlfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnLAorCQkJICAgICAgdTE2ICp2YWwpCit7CisJdTE2IGNtZCA9IEdMT0JBTDJfU01JX1BIWV9DTURfT1BfMjJfUkVBRF9EQVRBIHwgKGFkZHIgPDwgNSkgfCByZWc7CisJaW50IGVycjsKKworCWVyciA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3dhaXQoY2hpcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X2NtZChjaGlwLCBjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gbXY4OGU2eHh4X2cyX3JlYWQoY2hpcCwgR0xPQkFMMl9TTUlfUEhZX0RBVEEsIHZhbCk7Cit9CisKK2ludCBtdjg4ZTZ4eHhfZzJfc21pX3BoeV93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnLAorCQkJICAgICAgIHUxNiB2YWwpCit7CisJdTE2IGNtZCA9IEdMT0JBTDJfU01JX1BIWV9DTURfT1BfMjJfV1JJVEVfREFUQSB8IChhZGRyIDw8IDUpIHwgcmVnOworCWludCBlcnI7CisKKwllcnIgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV93YWl0KGNoaXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBtdjg4ZTZ4eHhfZzJfd3JpdGUoY2hpcCwgR0xPQkFMMl9TTUlfUEhZX0RBVEEsIHZhbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBtdjg4ZTZ4eHhfZzJfc21pX3BoeV9jbWQoY2hpcCwgY21kKTsKK30KKworaW50IG12ODhlNnh4eF9nMl9zZXR1cChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCit7CisJdTE2IHJlZzsKKwlpbnQgZXJyOworCisJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8yWCkpIHsKKwkJLyogQ29uc2lkZXIgdGhlIGZyYW1lcyB3aXRoIHJlc2VydmVkIG11bHRpY2FzdCBkZXN0aW5hdGlvbgorCQkgKiBhZGRyZXNzZXMgbWF0Y2hpbmcgMDE6ODA6YzI6MDA6MDA6MnggYXMgTUdNVC4KKwkJICovCisJCWVyciA9IG12ODhlNnh4eF9nMl93cml0ZShjaGlwLCBHTE9CQUwyX01HTVRfRU5fMlgsIDB4ZmZmZik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMFgpKSB7CisJCS8qIENvbnNpZGVyIHRoZSBmcmFtZXMgd2l0aCByZXNlcnZlZCBtdWx0aWNhc3QgZGVzdGluYXRpb24KKwkJICogYWRkcmVzc2VzIG1hdGNoaW5nIDAxOjgwOmMyOjAwOjAwOjB4IGFzIE1HTVQuCisJCSAqLworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfd3JpdGUoY2hpcCwgR0xPQkFMMl9NR01UX0VOXzBYLCAweGZmZmYpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBJZ25vcmUgcmVtb3ZlZCB0YWcgZGF0YSBvbiBkb3VibHkgdGFnZ2VkIHBhY2tldHMsIGRpc2FibGUKKwkgKiBmbG93IGNvbnRyb2wgbWVzc2FnZXMsIGZvcmNlIGZsb3cgY29udHJvbCBwcmlvcml0eSB0byB0aGUKKwkgKiBoaWdoZXN0LCBhbmQgc2VuZCBhbGwgc3BlY2lhbCBtdWx0aWNhc3QgZnJhbWVzIHRvIHRoZSBDUFUKKwkgKiBwb3J0IGF0IHRoZSBoaWdoZXN0IHByaW9yaXR5LgorCSAqLworCXJlZyA9IEdMT0JBTDJfU1dJVENIX01HTVRfRk9SQ0VfRkxPV19DVFJMX1BSSSB8ICgweDcgPDwgNCk7CisJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8wWCkgfHwKKwkgICAgbXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzJYKSkKKwkJcmVnIHw9IEdMT0JBTDJfU1dJVENIX01HTVRfUlNWRDJDUFUgfCAweDc7CisJZXJyID0gbXY4OGU2eHh4X2cyX3dyaXRlKGNoaXAsIEdMT0JBTDJfU1dJVENIX01HTVQsIHJlZyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIFByb2dyYW0gdGhlIERTQSByb3V0aW5nIHRhYmxlLiAqLworCWVyciA9IG12ODhlNnh4eF9nMl9zZXRfZGV2aWNlX21hcHBpbmcoY2hpcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIENsZWFyIGFsbCB0cnVuayBtYXNrcyBhbmQgbWFwcGluZy4gKi8KKwllcnIgPSBtdjg4ZTZ4eHhfZzJfY2xlYXJfdHJ1bmsoY2hpcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHU19JUkwpKSB7CisJCS8qIERpc2FibGUgaW5ncmVzcyByYXRlIGxpbWl0aW5nIGJ5IHJlc2V0dGluZyBhbGwgcGVyIHBvcnQKKwkJICogaW5ncmVzcyByYXRlIGxpbWl0IHJlc291cmNlcyB0byB0aGVpciBpbml0aWFsIHN0YXRlLgorCQkgKi8KKwkJZXJyID0gbXY4OGU2eHh4X2cyX2NsZWFyX2lybChjaGlwKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR1NfUFZUKSkgeworCQkvKiBJbml0aWFsaXplIENyb3NzLWNoaXAgUG9ydCBWTEFOIFRhYmxlIHRvIHJlc2V0IGRlZmF1bHRzICovCisJCWVyciA9IG12ODhlNnh4eF9nMl93cml0ZShjaGlwLCBHTE9CQUwyX1BWVF9BRERSLAorCQkJCQkgR0xPQkFMMl9QVlRfQUREUl9PUF9JTklUX09ORVMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19HMl9QT1QpKSB7CisJCS8qIENsZWFyIHRoZSBwcmlvcml0eSBvdmVycmlkZSB0YWJsZS4gKi8KKwkJZXJyID0gbXY4OGU2eHh4X2cyX2NsZWFyX3BvdChjaGlwKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L2dsb2JhbDIuaCBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvZ2xvYmFsMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YmI5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L2dsb2JhbDIuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogTWFydmVsbCA4OEU2eHh4IFN3aXRjaCBHbG9iYWwgMiBSZWdpc3RlcnMgc3VwcG9ydCAoZGV2aWNlIGFkZHJlc3MgMHgxQykKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFydmVsbCBTZW1pY29uZHVjdG9yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFZpdmllbiBEaWRlbG90IDx2aXZpZW4uZGlkZWxvdEBzYXZvaXJmYWlyZWxpbnV4LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX01WODhFNlhYWF9HTE9CQUwyX0gKKyNkZWZpbmUgX01WODhFNlhYWF9HTE9CQUwyX0gKKworI2luY2x1ZGUgIm12ODhlNnh4eC5oIgorCisjaWZkZWYgQ09ORklHX05FVF9EU0FfTVY4OEU2WFhYX0dMT0JBTDIKKworc3RhdGljIGlubGluZSBpbnQgbXY4OGU2eHh4X2cyX3JlcXVpcmUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQoreworCXJldHVybiAwOworfQorCitpbnQgbXY4OGU2eHh4X2cyX3NtaV9waHlfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnLAorCQkJICAgICAgdTE2ICp2YWwpOworaW50IG12ODhlNnh4eF9nMl9zbWlfcGh5X3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsCisJCQkgICAgICAgdTE2IHZhbCk7CitpbnQgbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTggKmFkZHIpOworaW50IG12ODhlNnh4eF9nMl9nZXRfZWVwcm9tMTYoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKTsKK2ludCBtdjg4ZTZ4eHhfZzJfc2V0X2VlcHJvbTE2KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKKwkJCSAgICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZGF0YSk7CitpbnQgbXY4OGU2eHh4X2cyX3NldHVwKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCk7CisKKyNlbHNlIC8qICFDT05GSUdfTkVUX0RTQV9NVjg4RTZYWFhfR0xPQkFMMiAqLworCitzdGF0aWMgaW5saW5lIGludCBtdjg4ZTZ4eHhfZzJfcmVxdWlyZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCit7CisJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfR0xPQkFMMikpIHsKKwkJZGV2X2VycihjaGlwLT5kZXYsICJ0aGlzIGNoaXAgcmVxdWlyZXMgQ09ORklHX05FVF9EU0FfTVY4OEU2WFhYX0dMT0JBTDIgZW5hYmxlZFxuIik7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXY4OGU2eHh4X2cyX3NtaV9waHlfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCisJCQkJCSAgICBpbnQgYWRkciwgaW50IHJlZywgdTE2ICp2YWwpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdjg4ZTZ4eHhfZzJfc21pX3BoeV93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCisJCQkJCSAgICAgaW50IGFkZHIsIGludCByZWcsIHUxNiB2YWwpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdjg4ZTZ4eHhfZzJfc2V0X3N3aXRjaF9tYWMoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAorCQkJCQkgICAgICB1OCAqYWRkcikKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG12ODhlNnh4eF9nMl9nZXRfZWVwcm9tMTYoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAorCQkJCQkgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sCisJCQkJCSAgICB1OCAqZGF0YSkKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG12ODhlNnh4eF9nMl9zZXRfZWVwcm9tMTYoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAorCQkJCQkgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sCisJCQkJCSAgICB1OCAqZGF0YSkKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG12ODhlNnh4eF9nMl9zZXR1cChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisjZW5kaWYgLyogQ09ORklHX05FVF9EU0FfTVY4OEU2WFhYX0dMT0JBTDIgKi8KKworI2VuZGlmIC8qIF9NVjg4RTZYWFhfR0xPQkFMMl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L212ODhlNnh4eC5oIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9tdjg4ZTZ4eHguaAppbmRleCA0OGQ2ZWE3Li5lNTcyMTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L212ODhlNnh4eC5oCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvbXY4OGU2eHh4LmgKQEAgLTMwLDExICszMCwxMyBAQAogI2RlZmluZSBTTUlfQ01EX09QXzQ1X1JFQURfREFUQV9JTkMJKCgzIDw8IDEwKSB8IFNNSV9DTURfQlVTWSkKICNkZWZpbmUgU01JX0RBVEEJCTB4MDEKIAotLyogRmliZXIvU0VSREVTIFJlZ2lzdGVycyBhcmUgbG9jYXRlZCBhdCBTTUkgYWRkcmVzcyBGLCBwYWdlIDEgKi8KLSNkZWZpbmUgUkVHX0ZJQkVSX1NFUkRFUwkweDBmCi0jZGVmaW5lIFBBR0VfRklCRVJfU0VSREVTCTB4MDEKKy8qIFBIWSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUEhZX1BBR0UJCTB4MTYKKyNkZWZpbmUgUEhZX1BBR0VfQ09QUEVSCQkweDAwCiAKLSNkZWZpbmUgUkVHX1BPUlQocCkJCSgweDEwICsgKHApKQorI2RlZmluZSBBRERSX1NFUkRFUwkJMHgwZgorI2RlZmluZSBTRVJERVNfUEFHRV9GSUJFUgkweDAxCisKICNkZWZpbmUgUE9SVF9TVEFUVVMJCTB4MDAKICNkZWZpbmUgUE9SVF9TVEFUVVNfUEFVU0VfRU4JQklUKDE1KQogI2RlZmluZSBQT1JUX1NUQVRVU19NWV9QQVVTRQlCSVQoMTQpCkBAIC0xNTcsNyArMTU5LDYgQEAKICNkZWZpbmUgUE9SVF9UQUdfUkVHTUFQXzAxMjMJMHgxOAogI2RlZmluZSBQT1JUX1RBR19SRUdNQVBfNDU2NwkweDE5CiAKLSNkZWZpbmUgUkVHX0dMT0JBTAkJMHgxYgogI2RlZmluZSBHTE9CQUxfU1RBVFVTCQkweDAwCiAjZGVmaW5lIEdMT0JBTF9TVEFUVVNfUFBVX1NUQVRFIEJJVCgxNSkgLyogNjM1MSBhbmQgNjE3MSAqLwogLyogVHdvIGJpdHMgZm9yIDYxNjUsIDYxODUgZXRjICovCkBAIC0xNjksOCArMTcwLDggQEAKICNkZWZpbmUgR0xPQkFMX01BQ18wMQkJMHgwMQogI2RlZmluZSBHTE9CQUxfTUFDXzIzCQkweDAyCiAjZGVmaW5lIEdMT0JBTF9NQUNfNDUJCTB4MDMKLSNkZWZpbmUgR0xPQkFMX0FUVV9GSUQJCTB4MDEJLyogNjA5NyA2MTY1IDYzNTEgNjM1MiAqLwotI2RlZmluZSBHTE9CQUxfVlRVX0ZJRAkJMHgwMgkvKiA2MDk3IDYxNjUgNjM1MSA2MzUyICovCisjZGVmaW5lIEdMT0JBTF9BVFVfRklECQkweDAxCisjZGVmaW5lIEdMT0JBTF9WVFVfRklECQkweDAyCiAjZGVmaW5lIEdMT0JBTF9WVFVfRklEX01BU0sJMHhmZmYKICNkZWZpbmUgR0xPQkFMX1ZUVV9TSUQJCTB4MDMJLyogNjA5NyA2MTY1IDYzNTEgNjM1MiAqLwogI2RlZmluZSBHTE9CQUxfVlRVX1NJRF9NQVNLCTB4M2YKQEAgLTI3NSw3ICsyNzYsNiBAQAogI2RlZmluZSBHTE9CQUxfU1RBVFNfQ09VTlRFUl8zMgkweDFlCiAjZGVmaW5lIEdMT0JBTF9TVEFUU19DT1VOVEVSXzAxCTB4MWYKIAotI2RlZmluZSBSRUdfR0xPQkFMMgkJMHgxYwogI2RlZmluZSBHTE9CQUwyX0lOVF9TT1VSQ0UJMHgwMAogI2RlZmluZSBHTE9CQUwyX0lOVF9NQVNLCTB4MDEKICNkZWZpbmUgR0xPQkFMMl9NR01UX0VOXzJYCTB4MDIKQEAgLTMyOSwxNyArMzI5LDE2IEBACiAjZGVmaW5lIEdMT0JBTDJfRUVQUk9NX0RBVEEJMHgxNQogI2RlZmluZSBHTE9CQUwyX1BUUF9BVkJfT1AJMHgxNgogI2RlZmluZSBHTE9CQUwyX1BUUF9BVkJfREFUQQkweDE3Ci0jZGVmaW5lIEdMT0JBTDJfU01JX09QCQkweDE4Ci0jZGVmaW5lIEdMT0JBTDJfU01JX09QX0JVU1kJCUJJVCgxNSkKLSNkZWZpbmUgR0xPQkFMMl9TTUlfT1BfQ0xBVVNFXzIyCUJJVCgxMikKLSNkZWZpbmUgR0xPQkFMMl9TTUlfT1BfMjJfV1JJVEUJCSgoMSA8PCAxMCkgfCBHTE9CQUwyX1NNSV9PUF9CVVNZIHwgXAotCQkJCQkgR0xPQkFMMl9TTUlfT1BfQ0xBVVNFXzIyKQotI2RlZmluZSBHTE9CQUwyX1NNSV9PUF8yMl9SRUFECQkoKDIgPDwgMTApIHwgR0xPQkFMMl9TTUlfT1BfQlVTWSB8IFwKLQkJCQkJIEdMT0JBTDJfU01JX09QX0NMQVVTRV8yMikKLSNkZWZpbmUgR0xPQkFMMl9TTUlfT1BfNDVfV1JJVEVfQUREUgkoKDAgPDwgMTApIHwgR0xPQkFMMl9TTUlfT1BfQlVTWSkKLSNkZWZpbmUgR0xPQkFMMl9TTUlfT1BfNDVfV1JJVEVfREFUQQkoKDEgPDwgMTApIHwgR0xPQkFMMl9TTUlfT1BfQlVTWSkKLSNkZWZpbmUgR0xPQkFMMl9TTUlfT1BfNDVfUkVBRF9EQVRBCSgoMiA8PCAxMCkgfCBHTE9CQUwyX1NNSV9PUF9CVVNZKQotI2RlZmluZSBHTE9CQUwyX1NNSV9EQVRBCTB4MTkKKyNkZWZpbmUgR0xPQkFMMl9TTUlfUEhZX0NNRAkJCTB4MTgKKyNkZWZpbmUgR0xPQkFMMl9TTUlfUEhZX0NNRF9CVVNZCQlCSVQoMTUpCisjZGVmaW5lIEdMT0JBTDJfU01JX1BIWV9DTURfTU9ERV8yMgkJQklUKDEyKQorI2RlZmluZSBHTE9CQUwyX1NNSV9QSFlfQ01EX09QXzIyX1dSSVRFX0RBVEEJKCgweDEgPDwgMTApIHwgXAorCQkJCQkJIEdMT0JBTDJfU01JX1BIWV9DTURfTU9ERV8yMiB8IFwKKwkJCQkJCSBHTE9CQUwyX1NNSV9QSFlfQ01EX0JVU1kpCisjZGVmaW5lIEdMT0JBTDJfU01JX1BIWV9DTURfT1BfMjJfUkVBRF9EQVRBCSgoMHgyIDw8IDEwKSB8IFwKKwkJCQkJCSBHTE9CQUwyX1NNSV9QSFlfQ01EX01PREVfMjIgfCBcCisJCQkJCQkgR0xPQkFMMl9TTUlfUEhZX0NNRF9CVVNZKQorI2RlZmluZSBHTE9CQUwyX1NNSV9QSFlfREFUQQkJCTB4MTkKICNkZWZpbmUgR0xPQkFMMl9TQ1JBVENIX01JU0MJMHgxYQogI2RlZmluZSBHTE9CQUwyX1NDUkFUQ0hfQlVTWQkJQklUKDE1KQogI2RlZmluZSBHTE9CQUwyX1NDUkFUQ0hfUkVHSVNURVJfU0hJRlQJOApAQCAtMzg0LDEwICszODMsMzYgQEAKIH07CiAKIGVudW0gbXY4OGU2eHh4X2NhcCB7CisJLyogVHdvIGRpZmZlcmVudCB0YWcgcHJvdG9jb2xzIGNhbiBiZSB1c2VkIGJ5IHRoZSBkcml2ZXIuIEFsbAorCSAqIHN3aXRjaGVzIHN1cHBvcnQgRFNBLCBidXQgb25seSBsYXRlciBnZW5lcmF0aW9ucyBzdXBwb3J0CisJICogRURTQS4KKwkgKi8KKwlNVjg4RTZYWFhfQ0FQX0VEU0EsCisKIAkvKiBFbmVyZ3kgRWZmaWNpZW50IEV0aGVybmV0LgogCSAqLwogCU1WODhFNlhYWF9DQVBfRUVFLAogCisJLyogTXVsdGktY2hpcCBBZGRyZXNzaW5nIE1vZGUuCisJICogU29tZSBjaGlwcyByZXNwb25kIHRvIG9ubHkgMiByZWdpc3RlcnMgb2YgaXRzIG93biBTTUkgZGV2aWNlIGFkZHJlc3MKKwkgKiB3aGVuIGl0IGlzIG5vbi16ZXJvLCBhbmQgdXNlIGluZGlyZWN0IGFjY2VzcyB0byBpbnRlcm5hbCByZWdpc3RlcnMuCisJICovCisJTVY4OEU2WFhYX0NBUF9TTUlfQ01ELAkJLyogKDB4MDApIFNNSSBDb21tYW5kICovCisJTVY4OEU2WFhYX0NBUF9TTUlfREFUQSwJCS8qICgweDAxKSBTTUkgRGF0YSAqLworCisJLyogUEhZIFJlZ2lzdGVycy4KKwkgKi8KKwlNVjg4RTZYWFhfQ0FQX1BIWV9QQUdFLAkJLyogKDB4MTYpIFBhZ2UgUmVnaXN0ZXIgKi8KKworCS8qIEZpYmVyL1NFUkRFUyBSZWdpc3RlcnMgKFNNSSBhZGRyZXNzIEYpLgorCSAqLworCU1WODhFNlhYWF9DQVBfU0VSREVTLAorCisJLyogU3dpdGNoIEdsb2JhbCAoMSkgUmVnaXN0ZXJzLgorCSAqLworCU1WODhFNlhYWF9DQVBfRzFfQVRVX0ZJRCwJLyogKDB4MDEpIEFUVSBGSUQgUmVnaXN0ZXIgKi8KKwlNVjg4RTZYWFhfQ0FQX0cxX1ZUVV9GSUQsCS8qICgweDAyKSBWVFUgRklEIFJlZ2lzdGVyICovCisKIAkvKiBTd2l0Y2ggR2xvYmFsIDIgUmVnaXN0ZXJzLgogCSAqIFRoZSBkZXZpY2UgY29udGFpbnMgYSBzZWNvbmQgc2V0IG9mIGdsb2JhbCAxNi1iaXQgcmVnaXN0ZXJzLgogCSAqLwpAQCAtMzk4LDE2ICs0MjMsNyBAQAogCU1WODhFNlhYWF9DQVBfRzJfSVJMX0RBVEEsCS8qICgweDBhKSBJbmdyZXNzIFJhdGUgRGF0YSAqLwogCU1WODhFNlhYWF9DQVBfRzJfUFZUX0FERFIsCS8qICgweDBiKSBDcm9zcyBDaGlwIFBvcnQgVkxBTiBBZGRyICovCiAJTVY4OEU2WFhYX0NBUF9HMl9QVlRfREFUQSwJLyogKDB4MGMpIENyb3NzIENoaXAgUG9ydCBWTEFOIERhdGEgKi8KLQlNVjg4RTZYWFhfQ0FQX0cyX1NXSVRDSF9NQUMsCS8qICgweDBkKSBTd2l0Y2ggTUFDL1dvTC9Xb0YgKi8KIAlNVjg4RTZYWFhfQ0FQX0cyX1BPVCwJCS8qICgweDBmKSBQcmlvcml0eSBPdmVycmlkZSBUYWJsZSAqLwotCU1WODhFNlhYWF9DQVBfRzJfRUVQUk9NX0NNRCwJLyogKDB4MTQpIEVFUFJPTSBDb21tYW5kICovCi0JTVY4OEU2WFhYX0NBUF9HMl9FRVBST01fREFUQSwJLyogKDB4MTUpIEVFUFJPTSBEYXRhICovCi0KLQkvKiBNdWx0aS1jaGlwIEFkZHJlc3NpbmcgTW9kZS4KLQkgKiBTb21lIGNoaXBzIHJlcXVpcmUgYW4gaW5kaXJlY3QgU01JIGFjY2VzcyB3aGVuIHRoZWlyIFNNSSBkZXZpY2UKLQkgKiBhZGRyZXNzIGlzIG5vdCB6ZXJvLiBTZWUgU01JX0NNRCBhbmQgU01JX0RBVEEuCi0JICovCi0JTVY4OEU2WFhYX0NBUF9NVUxUSV9DSElQLAogCiAJLyogUEhZIFBvbGxpbmcgVW5pdC4KIAkgKiBTZWUgR0xPQkFMX0NPTlRST0xfUFBVX0VOQUJMRSBhbmQgR0xPQkFMX1NUQVRVU19QUFVfUE9MTElORy4KQEAgLTQxNSwxMiArNDMxLDYgQEAKIAlNVjg4RTZYWFhfQ0FQX1BQVSwKIAlNVjg4RTZYWFhfQ0FQX1BQVV9BQ1RJVkUsCiAKLQkvKiBTTUkgUEhZIENvbW1hbmQgYW5kIERhdGEgcmVnaXN0ZXJzLgotCSAqIFRoaXMgcmVxdWlyZXMgYW4gaW5kaXJlY3QgYWNjZXNzIHRvIFBIWSByZWdpc3RlcnMgdGhyb3VnaAotCSAqIEdMT0JBTDJfU01JX09QLCBvdGhlcndpc2UgZGlyZWN0IGFjY2VzcyB0byBQSFkgcmVnaXN0ZXJzIGlzIGRvbmUuCi0JICovCi0JTVY4OEU2WFhYX0NBUF9TTUlfUEhZLAotCiAJLyogUGVyIFZMQU4gU3Bhbm5pbmcgVHJlZSBVbml0IChTVFUpLgogCSAqIFRoZSBQb3J0IFN0YXRlIGRhdGFiYXNlLCBpZiBwcmVzZW50LCBpcyBhY2Nlc3NlZCB0aHJvdWdoIFZUVQogCSAqIG9wZXJhdGlvbnMgYW5kIGRlZGljYXRlZCBTSUQgcmVnaXN0ZXJzLiBTZWUgR0xPQkFMX1ZUVV9TSUQuCkBAIC00NDAsMTMwICs0NTAsMTQ4IEBACiB9OwogCiAvKiBCaXRtYXNrIG9mIGNhcGFiaWxpdGllcyAqLwotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19FRUUJCUJJVChNVjg4RTZYWFhfQ0FQX0VFRSkKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfR0xPQkFMMgkJQklUKE1WODhFNlhYWF9DQVBfR0xPQkFMMikKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8yWAlCSVQoTVY4OEU2WFhYX0NBUF9HMl9NR01UX0VOXzJYKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzBYCUJJVChNVjg4RTZYWFhfQ0FQX0cyX01HTVRfRU5fMFgpCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cyX0lSTF9DTUQJQklUKE1WODhFNlhYWF9DQVBfRzJfSVJMX0NNRCkKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzJfSVJMX0RBVEEJQklUKE1WODhFNlhYWF9DQVBfRzJfSVJMX0RBVEEpCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cyX1BWVF9BRERSCUJJVChNVjg4RTZYWFhfQ0FQX0cyX1BWVF9BRERSKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMl9QVlRfREFUQQlCSVQoTVY4OEU2WFhYX0NBUF9HMl9QVlRfREFUQSkKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzJfU1dJVENIX01BQwlCSVQoTVY4OEU2WFhYX0NBUF9HMl9TV0lUQ0hfTUFDKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMl9QT1QJCUJJVChNVjg4RTZYWFhfQ0FQX0cyX1BPVCkKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzJfRUVQUk9NX0NNRAlCSVQoTVY4OEU2WFhYX0NBUF9HMl9FRVBST01fQ01EKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMl9FRVBST01fREFUQQlCSVQoTVY4OEU2WFhYX0NBUF9HMl9FRVBST01fREFUQSkKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfTVVMVElfQ0hJUAlCSVQoTVY4OEU2WFhYX0NBUF9NVUxUSV9DSElQKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19QUFUJCUJJVChNVjg4RTZYWFhfQ0FQX1BQVSkKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfUFBVX0FDVElWRQlCSVQoTVY4OEU2WFhYX0NBUF9QUFVfQUNUSVZFKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19TTUlfUEhZCQlCSVQoTVY4OEU2WFhYX0NBUF9TTUlfUEhZKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19TVFUJCUJJVChNVjg4RTZYWFhfQ0FQX1NUVSkKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfVEVNUAkJQklUKE1WODhFNlhYWF9DQVBfVEVNUCkKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfVEVNUF9MSU1JVAlCSVQoTVY4OEU2WFhYX0NBUF9URU1QX0xJTUlUKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19WVFUJCUJJVChNVjg4RTZYWFhfQ0FQX1ZUVSkKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRURTQQkJQklUX1VMTChNVjg4RTZYWFhfQ0FQX0VEU0EpCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX0VFRQkJQklUX1VMTChNVjg4RTZYWFhfQ0FQX0VFRSkKIAotLyogRUVQUk9NIFByb2dyYW1taW5nIHZpYSBHbG9iYWwyIHdpdGggMTYtYml0IGRhdGEgKi8KLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdTX0VFUFJPTTE2CVwKLQkoTVY4OEU2WFhYX0ZMQUdfRzJfRUVQUk9NX0NNRCB8CVwKLQkgTVY4OEU2WFhYX0ZMQUdfRzJfRUVQUk9NX0RBVEEpCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX1NNSV9DTUQJCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9TTUlfQ01EKQorI2RlZmluZSBNVjg4RTZYWFhfRkxBR19TTUlfREFUQQkJQklUX1VMTChNVjg4RTZYWFhfQ0FQX1NNSV9EQVRBKQorCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX1BIWV9QQUdFCQlCSVRfVUxMKE1WODhFNlhYWF9DQVBfUEhZX1BBR0UpCisKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfU0VSREVTCQlCSVRfVUxMKE1WODhFNlhYWF9DQVBfU0VSREVTKQorCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cxX0FUVV9GSUQJQklUX1VMTChNVjg4RTZYWFhfQ0FQX0cxX0FUVV9GSUQpCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cxX1ZUVV9GSUQJQklUX1VMTChNVjg4RTZYWFhfQ0FQX0cxX1ZUVV9GSUQpCisKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfR0xPQkFMMgkJQklUX1VMTChNVjg4RTZYWFhfQ0FQX0dMT0JBTDIpCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMlgJQklUX1VMTChNVjg4RTZYWFhfQ0FQX0cyX01HTVRfRU5fMlgpCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMFgJQklUX1VMTChNVjg4RTZYWFhfQ0FQX0cyX01HTVRfRU5fMFgpCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cyX0lSTF9DTUQJQklUX1VMTChNVjg4RTZYWFhfQ0FQX0cyX0lSTF9DTUQpCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cyX0lSTF9EQVRBCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9HMl9JUkxfREFUQSkKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzJfUFZUX0FERFIJQklUX1VMTChNVjg4RTZYWFhfQ0FQX0cyX1BWVF9BRERSKQorI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMl9QVlRfREFUQQlCSVRfVUxMKE1WODhFNlhYWF9DQVBfRzJfUFZUX0RBVEEpCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cyX1BPVAkJQklUX1VMTChNVjg4RTZYWFhfQ0FQX0cyX1BPVCkKKworI2RlZmluZSBNVjg4RTZYWFhfRkxBR19QUFUJCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9QUFUpCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX1BQVV9BQ1RJVkUJQklUX1VMTChNVjg4RTZYWFhfQ0FQX1BQVV9BQ1RJVkUpCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX1NUVQkJQklUX1VMTChNVjg4RTZYWFhfQ0FQX1NUVSkKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfVEVNUAkJQklUX1VMTChNVjg4RTZYWFhfQ0FQX1RFTVApCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX1RFTVBfTElNSVQJQklUX1VMTChNVjg4RTZYWFhfQ0FQX1RFTVBfTElNSVQpCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX1ZUVQkJQklUX1VMTChNVjg4RTZYWFhfQ0FQX1ZUVSkKIAogLyogSW5ncmVzcyBSYXRlIExpbWl0IHVuaXQgKi8KICNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdTX0lSTAkJXAogCShNVjg4RTZYWFhfRkxBR19HMl9JUkxfQ01EIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9JUkxfREFUQSkKIAorLyogTXVsdGktY2hpcCBBZGRyZXNzaW5nIE1vZGUgKi8KKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdTX01VTFRJX0NISVAJXAorCShNVjg4RTZYWFhfRkxBR19TTUlfQ01EIHwJXAorCSBNVjg4RTZYWFhfRkxBR19TTUlfREFUQSkKKwogLyogQ3Jvc3MtY2hpcCBQb3J0IFZMQU4gVGFibGUgKi8KICNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdTX1BWVAkJXAogCShNVjg4RTZYWFhfRkxBR19HMl9QVlRfQUREUiB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfUFZUX0RBVEEpCiAKKy8qIEZpYmVyL1NFUkRFUyBSZWdpc3RlcnMgYXQgU01JIGFkZHJlc3MgRiwgcGFnZSAxICovCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHU19TRVJERVMJCVwKKwkoTVY4OEU2WFhYX0ZMQUdfUEhZX1BBR0UgfAlcCisJIE1WODhFNlhYWF9GTEFHX1NFUkRFUykKKwogI2RlZmluZSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYwOTUJXAogCShNVjg4RTZYWFhfRkxBR19HTE9CQUwyIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzBYIHwJXAotCSBNVjg4RTZYWFhfRkxBR19NVUxUSV9DSElQIHwJXAogCSBNVjg4RTZYWFhfRkxBR19QUFUgfAkJXAotCSBNVjg4RTZYWFhfRkxBR19WVFUpCisJIE1WODhFNlhYWF9GTEFHX1ZUVSB8CQlcCisJIE1WODhFNlhYWF9GTEFHU19NVUxUSV9DSElQKQogCiAjZGVmaW5lIE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjA5NwlcCi0JKE1WODhFNlhYWF9GTEFHX0dMT0JBTDIgfAlcCisJKE1WODhFNlhYWF9GTEFHX0cxX0FUVV9GSUQgfAlcCisJIE1WODhFNlhYWF9GTEFHX0cxX1ZUVV9GSUQgfAlcCisJIE1WODhFNlhYWF9GTEFHX0dMT0JBTDIgfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMlggfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMFggfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX1BPVCB8CVwKLQkgTVY4OEU2WFhYX0ZMQUdfTVVMVElfQ0hJUCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfUFBVIHwJCVwKIAkgTVY4OEU2WFhYX0ZMQUdfU1RVIHwJCVwKIAkgTVY4OEU2WFhYX0ZMQUdfVlRVIHwJCVwKIAkgTVY4OEU2WFhYX0ZMQUdTX0lSTCB8CQlcCisJIE1WODhFNlhYWF9GTEFHU19NVUxUSV9DSElQIHwJXAogCSBNVjg4RTZYWFhfRkxBR1NfUFZUKQogCiAjZGVmaW5lIE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjE2NQlcCi0JKE1WODhFNlhYWF9GTEFHX0dMT0JBTDIgfAlcCisJKE1WODhFNlhYWF9GTEFHX0cxX0FUVV9GSUQgfAlcCisJIE1WODhFNlhYWF9GTEFHX0cxX1ZUVV9GSUQgfAlcCisJIE1WODhFNlhYWF9GTEFHX0dMT0JBTDIgfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMlggfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMFggfAlcCi0JIE1WODhFNlhYWF9GTEFHX0cyX1NXSVRDSF9NQUMgfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX1BPVCB8CVwKLQkgTVY4OEU2WFhYX0ZMQUdfTVVMVElfQ0hJUCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfU1RVIHwJCVwKIAkgTVY4OEU2WFhYX0ZMQUdfVEVNUCB8CQlcCiAJIE1WODhFNlhYWF9GTEFHX1ZUVSB8CQlcCiAJIE1WODhFNlhYWF9GTEFHU19JUkwgfAkJXAorCSBNVjg4RTZYWFhfRkxBR1NfTVVMVElfQ0hJUCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdTX1BWVCkKIAogI2RlZmluZSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYxODUJXAogCShNVjg4RTZYWFhfRkxBR19HTE9CQUwyIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzBYIHwJXAotCSBNVjg4RTZYWFhfRkxBR19NVUxUSV9DSElQIHwJXAorCSBNVjg4RTZYWFhfRkxBR1NfTVVMVElfQ0hJUCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfUFBVIHwJCVwKIAkgTVY4OEU2WFhYX0ZMQUdfVlRVKQogCiAjZGVmaW5lIE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjMyMAlcCi0JKE1WODhFNlhYWF9GTEFHX0VFRSB8CQlcCisJKE1WODhFNlhYWF9GTEFHX0VEU0EgfAkJXAorCSBNVjg4RTZYWFhfRkxBR19FRUUgfAkJXAogCSBNVjg4RTZYWFhfRkxBR19HTE9CQUwyIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzJYIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzBYIHwJXAotCSBNVjg4RTZYWFhfRkxBR19HMl9TV0lUQ0hfTUFDIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9QT1QgfAlcCi0JIE1WODhFNlhYWF9GTEFHX01VTFRJX0NISVAgfAlcCiAJIE1WODhFNlhYWF9GTEFHX1BQVV9BQ1RJVkUgfAlcCi0JIE1WODhFNlhYWF9GTEFHX1NNSV9QSFkgfAlcCiAJIE1WODhFNlhYWF9GTEFHX1RFTVAgfAkJXAogCSBNVjg4RTZYWFhfRkxBR19URU1QX0xJTUlUIHwJXAogCSBNVjg4RTZYWFhfRkxBR19WVFUgfAkJXAotCSBNVjg4RTZYWFhfRkxBR1NfRUVQUk9NMTYgfAlcCiAJIE1WODhFNlhYWF9GTEFHU19JUkwgfAkJXAorCSBNVjg4RTZYWFhfRkxBR1NfTVVMVElfQ0hJUCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdTX1BWVCkKIAogI2RlZmluZSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYzNTEJXAotCShNVjg4RTZYWFhfRkxBR19HTE9CQUwyIHwJXAorCShNVjg4RTZYWFhfRkxBR19FRFNBIHwJCVwKKwkgTVY4OEU2WFhYX0ZMQUdfRzFfQVRVX0ZJRCB8CVwKKwkgTVY4OEU2WFhYX0ZMQUdfRzFfVlRVX0ZJRCB8CVwKKwkgTVY4OEU2WFhYX0ZMQUdfR0xPQkFMMiB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8yWCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8wWCB8CVwKLQkgTVY4OEU2WFhYX0ZMQUdfRzJfU1dJVENIX01BQyB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfUE9UIHwJXAotCSBNVjg4RTZYWFhfRkxBR19NVUxUSV9DSElQIHwJXAogCSBNVjg4RTZYWFhfRkxBR19QUFVfQUNUSVZFIHwJXAotCSBNVjg4RTZYWFhfRkxBR19TTUlfUEhZIHwJXAogCSBNVjg4RTZYWFhfRkxBR19TVFUgfAkJXAogCSBNVjg4RTZYWFhfRkxBR19URU1QIHwJCVwKIAkgTVY4OEU2WFhYX0ZMQUdfVlRVIHwJCVwKIAkgTVY4OEU2WFhYX0ZMQUdTX0lSTCB8CQlcCisJIE1WODhFNlhYWF9GTEFHU19NVUxUSV9DSElQIHwJXAogCSBNVjg4RTZYWFhfRkxBR1NfUFZUKQogCiAjZGVmaW5lIE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjM1MglcCi0JKE1WODhFNlhYWF9GTEFHX0VFRSB8CQlcCisJKE1WODhFNlhYWF9GTEFHX0VEU0EgfAkJXAorCSBNVjg4RTZYWFhfRkxBR19FRUUgfAkJXAorCSBNVjg4RTZYWFhfRkxBR19HMV9BVFVfRklEIHwJXAorCSBNVjg4RTZYWFhfRkxBR19HMV9WVFVfRklEIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HTE9CQUwyIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzJYIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzBYIHwJXAotCSBNVjg4RTZYWFhfRkxBR19HMl9TV0lUQ0hfTUFDIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9QT1QgfAlcCi0JIE1WODhFNlhYWF9GTEFHX01VTFRJX0NISVAgfAlcCiAJIE1WODhFNlhYWF9GTEFHX1BQVV9BQ1RJVkUgfAlcCi0JIE1WODhFNlhYWF9GTEFHX1NNSV9QSFkgfAlcCiAJIE1WODhFNlhYWF9GTEFHX1NUVSB8CQlcCiAJIE1WODhFNlhYWF9GTEFHX1RFTVAgfAkJXAogCSBNVjg4RTZYWFhfRkxBR19URU1QX0xJTUlUIHwJXAogCSBNVjg4RTZYWFhfRkxBR19WVFUgfAkJXAotCSBNVjg4RTZYWFhfRkxBR1NfRUVQUk9NMTYgfAlcCiAJIE1WODhFNlhYWF9GTEFHU19JUkwgfAkJXAotCSBNVjg4RTZYWFhfRkxBR1NfUFZUKQorCSBNVjg4RTZYWFhfRkxBR1NfTVVMVElfQ0hJUCB8CVwKKwkgTVY4OEU2WFhYX0ZMQUdTX1BWVCB8CQlcCisJIE1WODhFNlhYWF9GTEFHU19TRVJERVMpCisKK3N0cnVjdCBtdjg4ZTZ4eHhfb3BzOwogCiBzdHJ1Y3QgbXY4OGU2eHh4X2luZm8gewogCWVudW0gbXY4OGU2eHh4X2ZhbWlseSBmYW1pbHk7CkBAIC01NzIsOCArNjAwLDEwIEBACiAJdW5zaWduZWQgaW50IG51bV9kYXRhYmFzZXM7CiAJdW5zaWduZWQgaW50IG51bV9wb3J0czsKIAl1bnNpZ25lZCBpbnQgcG9ydF9iYXNlX2FkZHI7CisJdW5zaWduZWQgaW50IGdsb2JhbDFfYWRkcjsKIAl1bnNpZ25lZCBpbnQgYWdlX3RpbWVfY29lZmY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZmxhZ3M7CisJY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgKm9wczsKIH07CiAKIHN0cnVjdCBtdjg4ZTZ4eHhfYXR1X2VudHJ5IHsKQEAgLTU4NCwxOCArNjE0LDE1IEBACiAJdTgJbWFjW0VUSF9BTEVOXTsKIH07CiAKLXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSB7Ci0JLyogVlRVIG9ubHkgKi8KK3N0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5IHsKIAl1MTYJdmlkOwogCXUxNglmaWQ7Ci0KLQkvKiBWVFUgYW5kIFNUVSAqLwogCXU4CXNpZDsKIAlib29sCXZhbGlkOwogCXU4CWRhdGFbRFNBX01BWF9QT1JUU107CiB9OwogCi1zdHJ1Y3QgbXY4OGU2eHh4X29wczsKK3N0cnVjdCBtdjg4ZTZ4eHhfYnVzX29wczsKIAogc3RydWN0IG12ODhlNnh4eF9wcml2X3BvcnQgewogCXN0cnVjdCBuZXRfZGV2aWNlICpicmlkZ2VfZGV2OwpAQCAtNjE2LDEzICs2NDMsMTQgQEAKIAkvKiBUaGUgTUlJIGJ1cyBhbmQgdGhlIGFkZHJlc3Mgb24gdGhlIGJ1cyB0aGF0IGlzIHVzZWQgdG8KIAkgKiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHN3aXRjaAogCSAqLwotCWNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzICpzbWlfb3BzOworCWNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfYnVzX29wcyAqc21pX29wczsKIAlzdHJ1Y3QgbWlpX2J1cyAqYnVzOwogCWludCBzd19hZGRyOwogCiAJLyogSGFuZGxlcyBhdXRvbWF0aWMgZGlzYWJsaW5nIGFuZCByZS1lbmFibGluZyBvZiB0aGUgUEhZCiAJICogcG9sbGluZyB1bml0LgogCSAqLworCWNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfYnVzX29wcyAqcGh5X29wczsKIAlzdHJ1Y3QgbXV0ZXgJCXBwdV9tdXRleDsKIAlpbnQJCQlwcHVfZGlzYWJsZWQ7CiAJc3RydWN0IHdvcmtfc3RydWN0CXBwdV93b3JrOwpAQCAtNjUxLDExICs2NzksMjUgQEAKIAlzdHJ1Y3QgbWlpX2J1cyAqbWRpb19idXM7CiB9OwogCi1zdHJ1Y3QgbXY4OGU2eHh4X29wcyB7CitzdHJ1Y3QgbXY4OGU2eHh4X2J1c19vcHMgewogCWludCAoKnJlYWQpKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsIHUxNiAqdmFsKTsKIAlpbnQgKCp3cml0ZSkoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZywgdTE2IHZhbCk7CiB9OwogCitzdHJ1Y3QgbXY4OGU2eHh4X29wcyB7CisJaW50ICgqZ2V0X2VlcHJvbSkoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAorCQkJICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmRhdGEpOworCWludCAoKnNldF9lZXByb20pKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKKwkJCSAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKTsKKworCWludCAoKnNldF9zd2l0Y2hfbWFjKShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHU4ICphZGRyKTsKKworCWludCAoKnBoeV9yZWFkKShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnLAorCQkJdTE2ICp2YWwpOworCWludCAoKnBoeV93cml0ZSkoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZywKKwkJCSB1MTYgdmFsKTsKK307CisKIGVudW0gc3RhdF90eXBlIHsKIAlCQU5LMCwKIAlCQU5LMSwKQEAgLTY3NSw0ICs3MTcsMjAgQEAKIAlyZXR1cm4gKGNoaXAtPmluZm8tPmZsYWdzICYgZmxhZ3MpID09IGZsYWdzOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtdjg4ZTZ4eHhfbnVtX2RhdGFiYXNlcyhzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCit7CisJcmV0dXJuIGNoaXAtPmluZm8tPm51bV9kYXRhYmFzZXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG12ODhlNnh4eF9udW1fcG9ydHMoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQoreworCXJldHVybiBjaGlwLT5pbmZvLT5udW1fcG9ydHM7Cit9CisKK2ludCBtdjg4ZTZ4eHhfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnLCB1MTYgKnZhbCk7CitpbnQgbXY4OGU2eHh4X3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsIHUxNiB2YWwpOworaW50IG12ODhlNnh4eF91cGRhdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZywKKwkJICAgICB1MTYgdXBkYXRlKTsKK2ludCBtdjg4ZTZ4eHhfd2FpdChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnLCB1MTYgbWFzayk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL3FjYThrLmMgYi9kcml2ZXJzL25ldC9kc2EvcWNhOGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2RmNzBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZHNhL3FjYThrLmMKQEAgLTAsMCArMSwxMDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEZlbGl4IEZpZXRrYXUgPG5iZEBuYmQubmFtZT4KKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIEdhYm9yIEp1aG9zIDxqdWhvc2dAb3BlbndydC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDE2IEpvaG4gQ3Jpc3BpbiA8am9obkBwaHJvemVuLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvZHNhLmg+CisjaW5jbHVkZSA8bmV0L3N3aXRjaGRldi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYnJpZGdlLmg+CisjaW5jbHVkZSA8bGludXgvbWRpby5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKKyNpbmNsdWRlICJxY2E4ay5oIgorCisjZGVmaW5lIE1JQl9ERVNDKF9zLCBfbywgX24pCVwKKwl7CQkJXAorCQkuc2l6ZSA9IChfcyksCVwKKwkJLm9mZnNldCA9IChfbyksCVwKKwkJLm5hbWUgPSAoX24pLAlcCisJfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHFjYThrX21pYl9kZXNjIGFyODMyN19taWJbXSA9IHsKKwlNSUJfREVTQygxLCAweDAwLCAiUnhCcm9hZCIpLAorCU1JQl9ERVNDKDEsIDB4MDQsICJSeFBhdXNlIiksCisJTUlCX0RFU0MoMSwgMHgwOCwgIlJ4TXVsdGkiKSwKKwlNSUJfREVTQygxLCAweDBjLCAiUnhGY3NFcnIiKSwKKwlNSUJfREVTQygxLCAweDEwLCAiUnhBbGlnbkVyciIpLAorCU1JQl9ERVNDKDEsIDB4MTQsICJSeFJ1bnQiKSwKKwlNSUJfREVTQygxLCAweDE4LCAiUnhGcmFnbWVudCIpLAorCU1JQl9ERVNDKDEsIDB4MWMsICJSeDY0Qnl0ZSIpLAorCU1JQl9ERVNDKDEsIDB4MjAsICJSeDEyOEJ5dGUiKSwKKwlNSUJfREVTQygxLCAweDI0LCAiUngyNTZCeXRlIiksCisJTUlCX0RFU0MoMSwgMHgyOCwgIlJ4NTEyQnl0ZSIpLAorCU1JQl9ERVNDKDEsIDB4MmMsICJSeDEwMjRCeXRlIiksCisJTUlCX0RFU0MoMSwgMHgzMCwgIlJ4MTUxOEJ5dGUiKSwKKwlNSUJfREVTQygxLCAweDM0LCAiUnhNYXhCeXRlIiksCisJTUlCX0RFU0MoMSwgMHgzOCwgIlJ4VG9vTG9uZyIpLAorCU1JQl9ERVNDKDIsIDB4M2MsICJSeEdvb2RCeXRlIiksCisJTUlCX0RFU0MoMiwgMHg0NCwgIlJ4QmFkQnl0ZSIpLAorCU1JQl9ERVNDKDEsIDB4NGMsICJSeE92ZXJGbG93IiksCisJTUlCX0RFU0MoMSwgMHg1MCwgIkZpbHRlcmVkIiksCisJTUlCX0RFU0MoMSwgMHg1NCwgIlR4QnJvYWQiKSwKKwlNSUJfREVTQygxLCAweDU4LCAiVHhQYXVzZSIpLAorCU1JQl9ERVNDKDEsIDB4NWMsICJUeE11bHRpIiksCisJTUlCX0RFU0MoMSwgMHg2MCwgIlR4VW5kZXJSdW4iKSwKKwlNSUJfREVTQygxLCAweDY0LCAiVHg2NEJ5dGUiKSwKKwlNSUJfREVTQygxLCAweDY4LCAiVHgxMjhCeXRlIiksCisJTUlCX0RFU0MoMSwgMHg2YywgIlR4MjU2Qnl0ZSIpLAorCU1JQl9ERVNDKDEsIDB4NzAsICJUeDUxMkJ5dGUiKSwKKwlNSUJfREVTQygxLCAweDc0LCAiVHgxMDI0Qnl0ZSIpLAorCU1JQl9ERVNDKDEsIDB4NzgsICJUeDE1MThCeXRlIiksCisJTUlCX0RFU0MoMSwgMHg3YywgIlR4TWF4Qnl0ZSIpLAorCU1JQl9ERVNDKDEsIDB4ODAsICJUeE92ZXJTaXplIiksCisJTUlCX0RFU0MoMiwgMHg4NCwgIlR4Qnl0ZSIpLAorCU1JQl9ERVNDKDEsIDB4OGMsICJUeENvbGxpc2lvbiIpLAorCU1JQl9ERVNDKDEsIDB4OTAsICJUeEFib3J0Q29sIiksCisJTUlCX0RFU0MoMSwgMHg5NCwgIlR4TXVsdGlDb2wiKSwKKwlNSUJfREVTQygxLCAweDk4LCAiVHhTaW5nbGVDb2wiKSwKKwlNSUJfREVTQygxLCAweDljLCAiVHhFeGNEZWZlciIpLAorCU1JQl9ERVNDKDEsIDB4YTAsICJUeERlZmVyIiksCisJTUlCX0RFU0MoMSwgMHhhNCwgIlR4TGF0ZUNvbCIpLAorfTsKKworLyogVGhlIDMyYml0IHN3aXRjaCByZWdpc3RlcnMgYXJlIGFjY2Vzc2VkIGluZGlyZWN0bHkuIFRvIGFjaGlldmUgdGhpcyB3ZSBuZWVkCisgKiB0byBzZXQgdGhlIHBhZ2Ugb2YgdGhlIHJlZ2lzdGVyLiBUcmFjayB0aGUgbGFzdCBwYWdlIHRoYXQgd2FzIHNldCB0byByZWR1Y2UKKyAqIG1kaW8gd3JpdGVzCisgKi8KK3N0YXRpYyB1MTYgcWNhOGtfY3VycmVudF9wYWdlID0gMHhmZmZmOworCitzdGF0aWMgdm9pZAorcWNhOGtfc3BsaXRfYWRkcih1MzIgcmVnYWRkciwgdTE2ICpyMSwgdTE2ICpyMiwgdTE2ICpwYWdlKQoreworCXJlZ2FkZHIgPj49IDE7CisJKnIxID0gcmVnYWRkciAmIDB4MWU7CisKKwlyZWdhZGRyID4+PSA1OworCSpyMiA9IHJlZ2FkZHIgJiAweDc7CisKKwlyZWdhZGRyID4+PSAzOworCSpwYWdlID0gcmVnYWRkciAmIDB4M2ZmOworfQorCitzdGF0aWMgdTMyCitxY2E4a19taWlfcmVhZDMyKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBwaHlfaWQsIHUzMiByZWdudW0pCit7CisJdTMyIHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gYnVzLT5yZWFkKGJ1cywgcGh5X2lkLCByZWdudW0pOworCWlmIChyZXQgPj0gMCkgeworCQl2YWwgPSByZXQ7CisJCXJldCA9IGJ1cy0+cmVhZChidXMsIHBoeV9pZCwgcmVnbnVtICsgMSk7CisJCXZhbCB8PSByZXQgPDwgMTY7CisJfQorCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZCgmYnVzLT5kZXYsCisJCQkJICAgICJmYWlsZWQgdG8gcmVhZCBxY2E4ayAzMmJpdCByZWdpc3RlclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX21paV93cml0ZTMyKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBwaHlfaWQsIHUzMiByZWdudW0sIHUzMiB2YWwpCit7CisJdTE2IGxvLCBoaTsKKwlpbnQgcmV0OworCisJbG8gPSB2YWwgJiAweGZmZmY7CisJaGkgPSAodTE2KSh2YWwgPj4gMTYpOworCisJcmV0ID0gYnVzLT53cml0ZShidXMsIHBoeV9pZCwgcmVnbnVtLCBsbyk7CisJaWYgKHJldCA+PSAwKQorCQlyZXQgPSBidXMtPndyaXRlKGJ1cywgcGh5X2lkLCByZWdudW0gKyAxLCBoaSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJmJ1cy0+ZGV2LAorCQkJCSAgICAiZmFpbGVkIHRvIHdyaXRlIHFjYThrIDMyYml0IHJlZ2lzdGVyXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX3NldF9wYWdlKHN0cnVjdCBtaWlfYnVzICpidXMsIHUxNiBwYWdlKQoreworCWlmIChwYWdlID09IHFjYThrX2N1cnJlbnRfcGFnZSkKKwkJcmV0dXJuOworCisJaWYgKGJ1cy0+d3JpdGUoYnVzLCAweDE4LCAwLCBwYWdlKSA8IDApCisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJmJ1cy0+ZGV2LAorCQkJCSAgICAiZmFpbGVkIHRvIHNldCBxY2E4ayBwYWdlXG4iKTsKKwlxY2E4a19jdXJyZW50X3BhZ2UgPSBwYWdlOworfQorCitzdGF0aWMgdTMyCitxY2E4a19yZWFkKHN0cnVjdCBxY2E4a19wcml2ICpwcml2LCB1MzIgcmVnKQoreworCXUxNiByMSwgcjIsIHBhZ2U7CisJdTMyIHZhbDsKKworCXFjYThrX3NwbGl0X2FkZHIocmVnLCAmcjEsICZyMiwgJnBhZ2UpOworCisJbXV0ZXhfbG9ja19uZXN0ZWQoJnByaXYtPmJ1cy0+bWRpb19sb2NrLCBNRElPX01VVEVYX05FU1RFRCk7CisKKwlxY2E4a19zZXRfcGFnZShwcml2LT5idXMsIHBhZ2UpOworCXZhbCA9IHFjYThrX21paV9yZWFkMzIocHJpdi0+YnVzLCAweDEwIHwgcjIsIHIxKTsKKworCW11dGV4X3VubG9jaygmcHJpdi0+YnVzLT5tZGlvX2xvY2spOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX3dyaXRlKHN0cnVjdCBxY2E4a19wcml2ICpwcml2LCB1MzIgcmVnLCB1MzIgdmFsKQoreworCXUxNiByMSwgcjIsIHBhZ2U7CisKKwlxY2E4a19zcGxpdF9hZGRyKHJlZywgJnIxLCAmcjIsICZwYWdlKTsKKworCW11dGV4X2xvY2tfbmVzdGVkKCZwcml2LT5idXMtPm1kaW9fbG9jaywgTURJT19NVVRFWF9ORVNURUQpOworCisJcWNhOGtfc2V0X3BhZ2UocHJpdi0+YnVzLCBwYWdlKTsKKwlxY2E4a19taWlfd3JpdGUzMihwcml2LT5idXMsIDB4MTAgfCByMiwgcjEsIHZhbCk7CisKKwltdXRleF91bmxvY2soJnByaXYtPmJ1cy0+bWRpb19sb2NrKTsKK30KKworc3RhdGljIHUzMgorcWNhOGtfcm13KHN0cnVjdCBxY2E4a19wcml2ICpwcml2LCB1MzIgcmVnLCB1MzIgbWFzaywgdTMyIHZhbCkKK3sKKwl1MTYgcjEsIHIyLCBwYWdlOworCXUzMiByZXQ7CisKKwlxY2E4a19zcGxpdF9hZGRyKHJlZywgJnIxLCAmcjIsICZwYWdlKTsKKworCW11dGV4X2xvY2tfbmVzdGVkKCZwcml2LT5idXMtPm1kaW9fbG9jaywgTURJT19NVVRFWF9ORVNURUQpOworCisJcWNhOGtfc2V0X3BhZ2UocHJpdi0+YnVzLCBwYWdlKTsKKwlyZXQgPSBxY2E4a19taWlfcmVhZDMyKHByaXYtPmJ1cywgMHgxMCB8IHIyLCByMSk7CisJcmV0ICY9IH5tYXNrOworCXJldCB8PSB2YWw7CisJcWNhOGtfbWlpX3dyaXRlMzIocHJpdi0+YnVzLCAweDEwIHwgcjIsIHIxLCByZXQpOworCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5idXMtPm1kaW9fbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfcmVnX3NldChzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTMyIHZhbCkKK3sKKwlxY2E4a19ybXcocHJpdiwgcmVnLCAwLCB2YWwpOworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfcmVnX2NsZWFyKHN0cnVjdCBxY2E4a19wcml2ICpwcml2LCB1MzIgcmVnLCB1MzIgdmFsKQoreworCXFjYThrX3Jtdyhwcml2LCByZWcsIHZhbCwgMCk7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX3JlZ21hcF9yZWFkKHZvaWQgKmN0eCwgdWludDMyX3QgcmVnLCB1aW50MzJfdCAqdmFsKQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopY3R4OworCisJKnZhbCA9IHFjYThrX3JlYWQocHJpdiwgcmVnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitxY2E4a19yZWdtYXBfd3JpdGUodm9pZCAqY3R4LCB1aW50MzJfdCByZWcsIHVpbnQzMl90IHZhbCkKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWN0eDsKKworCXFjYThrX3dyaXRlKHByaXYsIHJlZywgdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9yYW5nZSBxY2E4a19yZWFkYWJsZV9yYW5nZXNbXSA9IHsKKwlyZWdtYXBfcmVnX3JhbmdlKDB4MDAwMCwgMHgwMGU0KSwgLyogR2xvYmFsIGNvbnRyb2wgKi8KKwlyZWdtYXBfcmVnX3JhbmdlKDB4MDEwMCwgMHgwMTY4KSwgLyogRUVFIGNvbnRyb2wgKi8KKwlyZWdtYXBfcmVnX3JhbmdlKDB4MDIwMCwgMHgwMjcwKSwgLyogUGFyc2VyIGNvbnRyb2wgKi8KKwlyZWdtYXBfcmVnX3JhbmdlKDB4MDQwMCwgMHgwNDU0KSwgLyogQUNMICovCisJcmVnbWFwX3JlZ19yYW5nZSgweDA2MDAsIDB4MDcxOCksIC8qIExvb2t1cCAqLworCXJlZ21hcF9yZWdfcmFuZ2UoMHgwODAwLCAweDBiNzApLCAvKiBRTSAqLworCXJlZ21hcF9yZWdfcmFuZ2UoMHgwYzAwLCAweDBjODApLCAvKiBQS1QgKi8KKwlyZWdtYXBfcmVnX3JhbmdlKDB4MGUwMCwgMHgwZTk4KSwgLyogTDMgKi8KKwlyZWdtYXBfcmVnX3JhbmdlKDB4MTAwMCwgMHgxMGFjKSwgLyogTUlCIC0gUG9ydDAgKi8KKwlyZWdtYXBfcmVnX3JhbmdlKDB4MTEwMCwgMHgxMWFjKSwgLyogTUlCIC0gUG9ydDEgKi8KKwlyZWdtYXBfcmVnX3JhbmdlKDB4MTIwMCwgMHgxMmFjKSwgLyogTUlCIC0gUG9ydDIgKi8KKwlyZWdtYXBfcmVnX3JhbmdlKDB4MTMwMCwgMHgxM2FjKSwgLyogTUlCIC0gUG9ydDMgKi8KKwlyZWdtYXBfcmVnX3JhbmdlKDB4MTQwMCwgMHgxNGFjKSwgLyogTUlCIC0gUG9ydDQgKi8KKwlyZWdtYXBfcmVnX3JhbmdlKDB4MTUwMCwgMHgxNWFjKSwgLyogTUlCIC0gUG9ydDUgKi8KKwlyZWdtYXBfcmVnX3JhbmdlKDB4MTYwMCwgMHgxNmFjKSwgLyogTUlCIC0gUG9ydDYgKi8KKworfTsKKworc3RhdGljIHN0cnVjdCByZWdtYXBfYWNjZXNzX3RhYmxlIHFjYThrX3JlYWRhYmxlX3RhYmxlID0geworCS55ZXNfcmFuZ2VzID0gcWNhOGtfcmVhZGFibGVfcmFuZ2VzLAorCS5uX3llc19yYW5nZXMgPSBBUlJBWV9TSVpFKHFjYThrX3JlYWRhYmxlX3JhbmdlcyksCit9OworCitzdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgcWNhOGtfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSAxNiwKKwkudmFsX2JpdHMgPSAzMiwKKwkucmVnX3N0cmlkZSA9IDQsCisJLm1heF9yZWdpc3RlciA9IDB4MTZhYywgLyogZW5kIE1JQiAtIFBvcnQ2IHJhbmdlICovCisJLnJlZ19yZWFkID0gcWNhOGtfcmVnbWFwX3JlYWQsCisJLnJlZ193cml0ZSA9IHFjYThrX3JlZ21hcF93cml0ZSwKKwkucmRfdGFibGUgPSAmcWNhOGtfcmVhZGFibGVfdGFibGUsCit9OworCitzdGF0aWMgaW50CitxY2E4a19idXN5X3dhaXQoc3RydWN0IHFjYThrX3ByaXYgKnByaXYsIHUzMiByZWcsIHUzMiBtYXNrKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMCk7CisKKwkvKiBsb29wIHVudGlsIHRoZSBidXN5IGZsYWcgaGFzIGNsZWFyZWQgKi8KKwlkbyB7CisJCXUzMiB2YWwgPSBxY2E4a19yZWFkKHByaXYsIHJlZyk7CisJCWludCBidXN5ID0gdmFsICYgbWFzazsKKworCQlpZiAoIWJ1c3kpCisJCQlicmVhazsKKwkJY29uZF9yZXNjaGVkKCk7CisJfSB3aGlsZSAoIXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZW91dCkpOworCisJcmV0dXJuIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZW91dCk7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a19mZGJfcmVhZChzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiwgc3RydWN0IHFjYThrX2ZkYiAqZmRiKQoreworCXUzMiByZWdbNF07CisJaW50IGk7CisKKwkvKiBsb2FkIHRoZSBBUkwgdGFibGUgaW50byBhbiBhcnJheSAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCXJlZ1tpXSA9IHFjYThrX3JlYWQocHJpdiwgUUNBOEtfUkVHX0FUVV9EQVRBMCArIChpICogNCkpOworCisJLyogdmlkIC0gODM6NzIgKi8KKwlmZGItPnZpZCA9IChyZWdbMl0gPj4gUUNBOEtfQVRVX1ZJRF9TKSAmIFFDQThLX0FUVV9WSURfTTsKKwkvKiBhZ2luZyAtIDY3OjY0ICovCisJZmRiLT5hZ2luZyA9IHJlZ1syXSAmIFFDQThLX0FUVV9TVEFUVVNfTTsKKwkvKiBwb3J0bWFzayAtIDU0OjQ4ICovCisJZmRiLT5wb3J0X21hc2sgPSAocmVnWzFdID4+IFFDQThLX0FUVV9QT1JUX1MpICYgUUNBOEtfQVRVX1BPUlRfTTsKKwkvKiBtYWMgLSA0NzowICovCisJZmRiLT5tYWNbMF0gPSAocmVnWzFdID4+IFFDQThLX0FUVV9BRERSMF9TKSAmIDB4ZmY7CisJZmRiLT5tYWNbMV0gPSByZWdbMV0gJiAweGZmOworCWZkYi0+bWFjWzJdID0gKHJlZ1swXSA+PiBRQ0E4S19BVFVfQUREUjJfUykgJiAweGZmOworCWZkYi0+bWFjWzNdID0gKHJlZ1swXSA+PiBRQ0E4S19BVFVfQUREUjNfUykgJiAweGZmOworCWZkYi0+bWFjWzRdID0gKHJlZ1swXSA+PiBRQ0E4S19BVFVfQUREUjRfUykgJiAweGZmOworCWZkYi0+bWFjWzVdID0gcmVnWzBdICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX2ZkYl93cml0ZShzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiwgdTE2IHZpZCwgdTggcG9ydF9tYXNrLCBjb25zdCB1OCAqbWFjLAorCQl1OCBhZ2luZykKK3sKKwl1MzIgcmVnWzNdID0geyAwIH07CisJaW50IGk7CisKKwkvKiB2aWQgLSA4Mzo3MiAqLworCXJlZ1syXSA9ICh2aWQgJiBRQ0E4S19BVFVfVklEX00pIDw8IFFDQThLX0FUVV9WSURfUzsKKwkvKiBhZ2luZyAtIDY3OjY0ICovCisJcmVnWzJdIHw9IGFnaW5nICYgUUNBOEtfQVRVX1NUQVRVU19NOworCS8qIHBvcnRtYXNrIC0gNTQ6NDggKi8KKwlyZWdbMV0gPSAocG9ydF9tYXNrICYgUUNBOEtfQVRVX1BPUlRfTSkgPDwgUUNBOEtfQVRVX1BPUlRfUzsKKwkvKiBtYWMgLSA0NzowICovCisJcmVnWzFdIHw9IG1hY1swXSA8PCBRQ0E4S19BVFVfQUREUjBfUzsKKwlyZWdbMV0gfD0gbWFjWzFdOworCXJlZ1swXSB8PSBtYWNbMl0gPDwgUUNBOEtfQVRVX0FERFIyX1M7CisJcmVnWzBdIHw9IG1hY1szXSA8PCBRQ0E4S19BVFVfQUREUjNfUzsKKwlyZWdbMF0gfD0gbWFjWzRdIDw8IFFDQThLX0FUVV9BRERSNF9TOworCXJlZ1swXSB8PSBtYWNbNV07CisKKwkvKiBsb2FkIHRoZSBhcnJheSBpbnRvIHRoZSBBUkwgdGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlxY2E4a193cml0ZShwcml2LCBRQ0E4S19SRUdfQVRVX0RBVEEwICsgKGkgKiA0KSwgcmVnW2ldKTsKK30KKworc3RhdGljIGludAorcWNhOGtfZmRiX2FjY2VzcyhzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiwgZW51bSBxY2E4a19mZGJfY21kIGNtZCwgaW50IHBvcnQpCit7CisJdTMyIHJlZzsKKworCS8qIFNldCB0aGUgY29tbWFuZCBhbmQgRkRCIGluZGV4ICovCisJcmVnID0gUUNBOEtfQVRVX0ZVTkNfQlVTWTsKKwlyZWcgfD0gY21kOworCWlmIChwb3J0ID49IDApIHsKKwkJcmVnIHw9IFFDQThLX0FUVV9GVU5DX1BPUlRfRU47CisJCXJlZyB8PSAocG9ydCAmIFFDQThLX0FUVV9GVU5DX1BPUlRfTSkgPDwgUUNBOEtfQVRVX0ZVTkNfUE9SVF9TOworCX0KKworCS8qIFdyaXRlIHRoZSBmdW5jdGlvbiByZWdpc3RlciB0cmlnZ2VyaW5nIHRoZSB0YWJsZSBhY2Nlc3MgKi8KKwlxY2E4a193cml0ZShwcml2LCBRQ0E4S19SRUdfQVRVX0ZVTkMsIHJlZyk7CisKKwkvKiB3YWl0IGZvciBjb21wbGV0aW9uICovCisJaWYgKHFjYThrX2J1c3lfd2FpdChwcml2LCBRQ0E4S19SRUdfQVRVX0ZVTkMsIFFDQThLX0FUVV9GVU5DX0JVU1kpKQorCQlyZXR1cm4gLTE7CisKKwkvKiBDaGVjayBmb3IgdGFibGUgZnVsbCB2aW9sYXRpb24gd2hlbiBhZGRpbmcgYW4gZW50cnkgKi8KKwlpZiAoY21kID09IFFDQThLX0ZEQl9MT0FEKSB7CisJCXJlZyA9IHFjYThrX3JlYWQocHJpdiwgUUNBOEtfUkVHX0FUVV9GVU5DKTsKKwkJaWYgKHJlZyAmIFFDQThLX0FUVV9GVU5DX0ZVTEwpCisJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX2ZkYl9uZXh0KHN0cnVjdCBxY2E4a19wcml2ICpwcml2LCBzdHJ1Y3QgcWNhOGtfZmRiICpmZGIsIGludCBwb3J0KQoreworCWludCByZXQ7CisKKwlxY2E4a19mZGJfd3JpdGUocHJpdiwgZmRiLT52aWQsIGZkYi0+cG9ydF9tYXNrLCBmZGItPm1hYywgZmRiLT5hZ2luZyk7CisJcmV0ID0gcWNhOGtfZmRiX2FjY2Vzcyhwcml2LCBRQ0E4S19GREJfTkVYVCwgcG9ydCk7CisJaWYgKHJldCA+PSAwKQorCQlxY2E4a19mZGJfcmVhZChwcml2LCBmZGIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorcWNhOGtfZmRiX2FkZChzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiwgY29uc3QgdTggKm1hYywgdTE2IHBvcnRfbWFzaywKKwkgICAgICB1MTYgdmlkLCB1OCBhZ2luZykKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmcHJpdi0+cmVnX211dGV4KTsKKwlxY2E4a19mZGJfd3JpdGUocHJpdiwgdmlkLCBwb3J0X21hc2ssIG1hYywgYWdpbmcpOworCXJldCA9IHFjYThrX2ZkYl9hY2Nlc3MocHJpdiwgUUNBOEtfRkRCX0xPQUQsIC0xKTsKKwltdXRleF91bmxvY2soJnByaXYtPnJlZ19tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitxY2E4a19mZGJfZGVsKHN0cnVjdCBxY2E4a19wcml2ICpwcml2LCBjb25zdCB1OCAqbWFjLCB1MTYgcG9ydF9tYXNrLCB1MTYgdmlkKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZwcml2LT5yZWdfbXV0ZXgpOworCXFjYThrX2ZkYl93cml0ZShwcml2LCB2aWQsIHBvcnRfbWFzaywgbWFjLCAwKTsKKwlyZXQgPSBxY2E4a19mZGJfYWNjZXNzKHByaXYsIFFDQThLX0ZEQl9QVVJHRSwgLTEpOworCW11dGV4X3VubG9jaygmcHJpdi0+cmVnX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a19mZGJfZmx1c2goc3RydWN0IHFjYThrX3ByaXYgKnByaXYpCit7CisJbXV0ZXhfbG9jaygmcHJpdi0+cmVnX211dGV4KTsKKwlxY2E4a19mZGJfYWNjZXNzKHByaXYsIFFDQThLX0ZEQl9GTFVTSCwgLTEpOworCW11dGV4X3VubG9jaygmcHJpdi0+cmVnX211dGV4KTsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX21pYl9pbml0KHN0cnVjdCBxY2E4a19wcml2ICpwcml2KQoreworCW11dGV4X2xvY2soJnByaXYtPnJlZ19tdXRleCk7CisJcWNhOGtfcmVnX3NldChwcml2LCBRQ0E4S19SRUdfTUlCLCBRQ0E4S19NSUJfRkxVU0ggfCBRQ0E4S19NSUJfQlVTWSk7CisJcWNhOGtfYnVzeV93YWl0KHByaXYsIFFDQThLX1JFR19NSUIsIFFDQThLX01JQl9CVVNZKTsKKwlxY2E4a19yZWdfc2V0KHByaXYsIFFDQThLX1JFR19NSUIsIFFDQThLX01JQl9DUFVfS0VFUCk7CisJcWNhOGtfd3JpdGUocHJpdiwgUUNBOEtfUkVHX01PRFVMRV9FTiwgUUNBOEtfTU9EVUxFX0VOX01JQik7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5yZWdfbXV0ZXgpOworfQorCitzdGF0aWMgaW50CitxY2E4a19zZXRfcGFkX2N0cmwoc3RydWN0IHFjYThrX3ByaXYgKnByaXYsIGludCBwb3J0LCBpbnQgbW9kZSkKK3sKKwl1MzIgcmVnOworCisJc3dpdGNoIChwb3J0KSB7CisJY2FzZSAwOgorCQlyZWcgPSBRQ0E4S19SRUdfUE9SVDBfUEFEX0NUUkw7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJcmVnID0gUUNBOEtfUkVHX1BPUlQ2X1BBRF9DVFJMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIkNhbid0IHNldCBQQURfQ1RSTCBvbiBwb3J0ICVkXG4iLCBwb3J0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ29uZmlndXJlIGEgcG9ydCB0byBiZSBkaXJlY3RseSBjb25uZWN0ZWQgdG8gYW4gZXh0ZXJuYWwKKwkgKiBQSFkgb3IgTUFDLgorCSAqLworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJOgorCQlxY2E4a193cml0ZShwcml2LCByZWcsCisJCQkgICAgUUNBOEtfUE9SVF9QQURfUkdNSUlfRU4gfAorCQkJICAgIFFDQThLX1BPUlRfUEFEX1JHTUlJX1RYX0RFTEFZKDMpIHwKKwkJCSAgICBRQ0E4S19QT1JUX1BBRF9SR01JSV9SWF9ERUxBWSgzKSk7CisKKwkJLyogQWNjb3JkaW5nIHRvIHRoZSBkYXRhc2hlZXQsIFJHTUlJIGRlbGF5IGlzIGVuYWJsZWQgdGhyb3VnaAorCQkgKiBQT1JUNV9QQURfQ1RSTCBmb3IgYWxsIHBvcnRzLCByYXRoZXIgdGhhbiBpbmRpdmlkdWFsIHBvcnQKKwkJICogcmVnaXN0ZXJzCisJCSAqLworCQlxY2E4a193cml0ZShwcml2LCBRQ0E4S19SRUdfUE9SVDVfUEFEX0NUUkwsCisJCQkgICAgUUNBOEtfUE9SVF9QQURfUkdNSUlfUlhfREVMQVlfRU4pOworCQlicmVhazsKKwljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9TR01JSToKKwkJcWNhOGtfd3JpdGUocHJpdiwgcmVnLCBRQ0E4S19QT1JUX1BBRF9TR01JSV9FTik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigieE1JSSBtb2RlICVkIG5vdCBzdXBwb3J0ZWRcbiIsIG1vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX3BvcnRfc2V0X3N0YXR1cyhzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiwgaW50IHBvcnQsIGludCBlbmFibGUpCit7CisJdTMyIG1hc2sgPSBRQ0E4S19QT1JUX1NUQVRVU19UWE1BQzsKKworCS8qIFBvcnQgMCBhbmQgNiBoYXZlIG5vIGludGVybmFsIFBIWSAqLworCWlmICgocG9ydCA+IDApICYmIChwb3J0IDwgNikpCisJCW1hc2sgfD0gUUNBOEtfUE9SVF9TVEFUVVNfTElOS19BVVRPOworCisJaWYgKGVuYWJsZSkKKwkJcWNhOGtfcmVnX3NldChwcml2LCBRQ0E4S19SRUdfUE9SVF9TVEFUVVMocG9ydCksIG1hc2spOworCWVsc2UKKwkJcWNhOGtfcmVnX2NsZWFyKHByaXYsIFFDQThLX1JFR19QT1JUX1NUQVRVUyhwb3J0KSwgbWFzayk7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX3NldHVwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWRzLT5wcml2OworCWludCByZXQsIGksIHBoeV9tb2RlID0gLTE7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCBwb3J0IDAgaXMgdGhlIGNwdSBwb3J0ICovCisJaWYgKCFkc2FfaXNfY3B1X3BvcnQoZHMsIDApKSB7CisJCXByX2VycigicG9ydCAwIGlzIG5vdCB0aGUgQ1BVIHBvcnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9pbml0KCZwcml2LT5yZWdfbXV0ZXgpOworCisJLyogU3RhcnQgYnkgc2V0dGluZyB1cCB0aGUgcmVnaXN0ZXIgbWFwcGluZyAqLworCXByaXYtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXQoZHMtPmRldiwgTlVMTCwgcHJpdiwKKwkJCQkJJnFjYThrX3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIocHJpdi0+cmVnbWFwKSkKKwkJcHJfd2FybigicmVnbWFwIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCisJLyogSW5pdGlhbGl6ZSBDUFUgcG9ydCBwYWQgbW9kZSAoeE1JSSB0eXBlLCBkZWxheXMuLi4pICovCisJcGh5X21vZGUgPSBvZl9nZXRfcGh5X21vZGUoZHMtPnBvcnRzW2RzLT5kc3QtPmNwdV9wb3J0XS5kbik7CisJaWYgKHBoeV9tb2RlIDwgMCkgeworCQlwcl9lcnIoIkNhbid0IGZpbmQgcGh5LW1vZGUgZm9yIG1hc3RlciBkZXZpY2VcbiIpOworCQlyZXR1cm4gcGh5X21vZGU7CisJfQorCXJldCA9IHFjYThrX3NldF9wYWRfY3RybChwcml2LCBRQ0E4S19DUFVfUE9SVCwgcGh5X21vZGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogRW5hYmxlIENQVSBQb3J0ICovCisJcWNhOGtfcmVnX3NldChwcml2LCBRQ0E4S19SRUdfR0xPQkFMX0ZXX0NUUkwwLAorCQkgICAgICBRQ0E4S19HTE9CQUxfRldfQ1RSTDBfQ1BVX1BPUlRfRU4pOworCXFjYThrX3BvcnRfc2V0X3N0YXR1cyhwcml2LCBRQ0E4S19DUFVfUE9SVCwgMSk7CisJcHJpdi0+cG9ydF9zdHNbUUNBOEtfQ1BVX1BPUlRdLmVuYWJsZWQgPSAxOworCisJLyogRW5hYmxlIE1JQiBjb3VudGVycyAqLworCXFjYThrX21pYl9pbml0KHByaXYpOworCisJLyogRW5hYmxlIFFDQSBoZWFkZXIgbW9kZSBvbiB0aGUgY3B1IHBvcnQgKi8KKwlxY2E4a193cml0ZShwcml2LCBRQ0E4S19SRUdfUE9SVF9IRFJfQ1RSTChRQ0E4S19DUFVfUE9SVCksCisJCSAgICBRQ0E4S19QT1JUX0hEUl9DVFJMX0FMTCA8PCBRQ0E4S19QT1JUX0hEUl9DVFJMX1RYX1MgfAorCQkgICAgUUNBOEtfUE9SVF9IRFJfQ1RSTF9BTEwgPDwgUUNBOEtfUE9SVF9IRFJfQ1RSTF9SWF9TKTsKKworCS8qIERpc2FibGUgZm9yd2FyZGluZyBieSBkZWZhdWx0IG9uIGFsbCBwb3J0cyAqLworCWZvciAoaSA9IDA7IGkgPCBRQ0E4S19OVU1fUE9SVFM7IGkrKykKKwkJcWNhOGtfcm13KHByaXYsIFFDQThLX1BPUlRfTE9PS1VQX0NUUkwoaSksCisJCQkgIFFDQThLX1BPUlRfTE9PS1VQX01FTUJFUiwgMCk7CisKKwkvKiBEaXNhYmxlIE1BQyBieSBkZWZhdWx0IG9uIGFsbCB1c2VyIHBvcnRzICovCisJZm9yIChpID0gMTsgaSA8IFFDQThLX05VTV9QT1JUUzsgaSsrKQorCQlpZiAoZHMtPmVuYWJsZWRfcG9ydF9tYXNrICYgQklUKGkpKQorCQkJcWNhOGtfcG9ydF9zZXRfc3RhdHVzKHByaXYsIGksIDApOworCisJLyogRm9yd2FyZCBhbGwgdW5rbm93biBmcmFtZXMgdG8gQ1BVIHBvcnQgZm9yIExpbnV4IHByb2Nlc3NpbmcgKi8KKwlxY2E4a193cml0ZShwcml2LCBRQ0E4S19SRUdfR0xPQkFMX0ZXX0NUUkwxLAorCQkgICAgQklUKDApIDw8IFFDQThLX0dMT0JBTF9GV19DVFJMMV9JR01QX0RQX1MgfAorCQkgICAgQklUKDApIDw8IFFDQThLX0dMT0JBTF9GV19DVFJMMV9CQ19EUF9TIHwKKwkJICAgIEJJVCgwKSA8PCBRQ0E4S19HTE9CQUxfRldfQ1RSTDFfTUNfRFBfUyB8CisJCSAgICBCSVQoMCkgPDwgUUNBOEtfR0xPQkFMX0ZXX0NUUkwxX1VDX0RQX1MpOworCisJLyogU2V0dXAgY29ubmVjdGlvbiBiZXR3ZWVuIENQVSBwb3J0ICYgdXNlciBwb3J0cyAqLworCWZvciAoaSA9IDA7IGkgPCBEU0FfTUFYX1BPUlRTOyBpKyspIHsKKwkJLyogQ1BVIHBvcnQgZ2V0cyBjb25uZWN0ZWQgdG8gYWxsIHVzZXIgcG9ydHMgb2YgdGhlIHN3aXRjaCAqLworCQlpZiAoZHNhX2lzX2NwdV9wb3J0KGRzLCBpKSkgeworCQkJcWNhOGtfcm13KHByaXYsIFFDQThLX1BPUlRfTE9PS1VQX0NUUkwoUUNBOEtfQ1BVX1BPUlQpLAorCQkJCSAgUUNBOEtfUE9SVF9MT09LVVBfTUVNQkVSLAorCQkJCSAgZHMtPmVuYWJsZWRfcG9ydF9tYXNrKTsKKwkJfQorCisJCS8qIEludml2aWR1YWwgdXNlciBwb3J0cyBnZXQgY29ubmVjdGVkIHRvIENQVSBwb3J0IG9ubHkgKi8KKwkJaWYgKGRzLT5lbmFibGVkX3BvcnRfbWFzayAmIEJJVChpKSkgeworCQkJaW50IHNoaWZ0ID0gMTYgKiAoaSAlIDIpOworCisJCQlxY2E4a19ybXcocHJpdiwgUUNBOEtfUE9SVF9MT09LVVBfQ1RSTChpKSwKKwkJCQkgIFFDQThLX1BPUlRfTE9PS1VQX01FTUJFUiwKKwkJCQkgIEJJVChRQ0E4S19DUFVfUE9SVCkpOworCisJCQkvKiBFbmFibGUgQVJQIEF1dG8tbGVhcm5pbmcgYnkgZGVmYXVsdCAqLworCQkJcWNhOGtfcmVnX3NldChwcml2LCBRQ0E4S19QT1JUX0xPT0tVUF9DVFJMKGkpLAorCQkJCSAgICAgIFFDQThLX1BPUlRfTE9PS1VQX0xFQVJOKTsKKworCQkJLyogRm9yIHBvcnQgYmFzZWQgdmxhbnMgdG8gd29yayB3ZSBuZWVkIHRvIHNldCB0aGUKKwkJCSAqIGRlZmF1bHQgZWdyZXNzIHZpZAorCQkJICovCisJCQlxY2E4a19ybXcocHJpdiwgUUNBOEtfRUdSRVNTX1ZMQU4oaSksCisJCQkJICAweGZmZmYgPDwgc2hpZnQsIDEgPDwgc2hpZnQpOworCQkJcWNhOGtfd3JpdGUocHJpdiwgUUNBOEtfUkVHX1BPUlRfVkxBTl9DVFJMMChpKSwKKwkJCQkgICAgUUNBOEtfUE9SVF9WTEFOX0NWSUQoMSkgfAorCQkJCSAgICBRQ0E4S19QT1JUX1ZMQU5fU1ZJRCgxKSk7CisJCX0KKwl9CisKKwkvKiBGbHVzaCB0aGUgRkRCIHRhYmxlICovCisJcWNhOGtfZmRiX2ZsdXNoKHByaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX3BoeV9yZWFkKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBoeSwgaW50IHJlZ251bSkKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWRzLT5wcml2OworCisJcmV0dXJuIG1kaW9idXNfcmVhZChwcml2LT5idXMsIHBoeSwgcmVnbnVtKTsKK30KKworc3RhdGljIGludAorcWNhOGtfcGh5X3dyaXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBoeSwgaW50IHJlZ251bSwgdTE2IHZhbCkKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWRzLT5wcml2OworCisJcmV0dXJuIG1kaW9idXNfd3JpdGUocHJpdi0+YnVzLCBwaHksIHJlZ251bSwgdmFsKTsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX2dldF9zdHJpbmdzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIHVpbnQ4X3QgKmRhdGEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhcjgzMjdfbWliKTsgaSsrKQorCQlzdHJuY3B5KGRhdGEgKyBpICogRVRIX0dTVFJJTkdfTEVOLCBhcjgzMjdfbWliW2ldLm5hbWUsCisJCQlFVEhfR1NUUklOR19MRU4pOworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCXVpbnQ2NF90ICpkYXRhKQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopZHMtPnByaXY7CisJY29uc3Qgc3RydWN0IHFjYThrX21pYl9kZXNjICptaWI7CisJdTMyIHJlZywgaTsKKwl1NjQgaGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhcjgzMjdfbWliKTsgaSsrKSB7CisJCW1pYiA9ICZhcjgzMjdfbWliW2ldOworCQlyZWcgPSBRQ0E4S19QT1JUX01JQl9DT1VOVEVSKHBvcnQpICsgbWliLT5vZmZzZXQ7CisKKwkJZGF0YVtpXSA9IHFjYThrX3JlYWQocHJpdiwgcmVnKTsKKwkJaWYgKG1pYi0+c2l6ZSA9PSAyKSB7CisJCQloaSA9IHFjYThrX3JlYWQocHJpdiwgcmVnICsgNCk7CisJCQlkYXRhW2ldIHw9IGhpIDw8IDMyOworCQl9CisJfQorfQorCitzdGF0aWMgaW50CitxY2E4a19nZXRfc3NldF9jb3VudChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJcmV0dXJuIEFSUkFZX1NJWkUoYXI4MzI3X21pYik7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a19lZWVfZW5hYmxlX3NldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWRzLT5wcml2OworCXUzMiBscGlfZW4gPSBRQ0E4S19SRUdfRUVFX0NUUkxfTFBJX0VOKHBvcnQpOworCXUzMiByZWc7CisKKwltdXRleF9sb2NrKCZwcml2LT5yZWdfbXV0ZXgpOworCXJlZyA9IHFjYThrX3JlYWQocHJpdiwgUUNBOEtfUkVHX0VFRV9DVFJMKTsKKwlpZiAoZW5hYmxlKQorCQlyZWcgfD0gbHBpX2VuOworCWVsc2UKKwkJcmVnICY9IH5scGlfZW47CisJcWNhOGtfd3JpdGUocHJpdiwgUUNBOEtfUkVHX0VFRV9DVFJMLCByZWcpOworCW11dGV4X3VubG9jaygmcHJpdi0+cmVnX211dGV4KTsKK30KKworc3RhdGljIGludAorcWNhOGtfZWVlX2luaXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkgICAgICAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeSkKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWRzLT5wcml2OworCXN0cnVjdCBldGh0b29sX2VlZSAqcCA9ICZwcml2LT5wb3J0X3N0c1twb3J0XS5lZWU7CisJaW50IHJldDsKKworCXAtPnN1cHBvcnRlZCA9IChTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCk7CisKKwlyZXQgPSBwaHlfaW5pdF9lZWUocGh5LCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcWNhOGtfZWVlX2VuYWJsZV9zZXQoZHMsIHBvcnQsIHRydWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX3NldF9lZWUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkgICAgICBzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2LAorCSAgICAgIHN0cnVjdCBldGh0b29sX2VlZSAqZSkKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWRzLT5wcml2OworCXN0cnVjdCBldGh0b29sX2VlZSAqcCA9ICZwcml2LT5wb3J0X3N0c1twb3J0XS5lZWU7CisJaW50IHJldCA9IDA7CisKKwlwLT5lZWVfZW5hYmxlZCA9IGUtPmVlZV9lbmFibGVkOworCisJaWYgKGUtPmVlZV9lbmFibGVkKSB7CisJCXAtPmVlZV9lbmFibGVkID0gcWNhOGtfZWVlX2luaXQoZHMsIHBvcnQsIHBoeWRldik7CisJCWlmICghcC0+ZWVlX2VuYWJsZWQpCisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisJcWNhOGtfZWVlX2VuYWJsZV9zZXQoZHMsIHBvcnQsIHAtPmVlZV9lbmFibGVkKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX2dldF9lZWUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkgICAgICBzdHJ1Y3QgZXRodG9vbF9lZWUgKmUpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKilkcy0+cHJpdjsKKwlzdHJ1Y3QgZXRodG9vbF9lZWUgKnAgPSAmcHJpdi0+cG9ydF9zdHNbcG9ydF0uZWVlOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2OworCWludCByZXQ7CisKKwlyZXQgPSBwaHlfZXRodG9vbF9nZXRfZWVlKG5ldGRldi0+cGh5ZGV2LCBwKTsKKwlpZiAoIXJldCkKKwkJZS0+ZWVlX2FjdGl2ZSA9CisJCQkhIShwLT5zdXBwb3J0ZWQgJiBwLT5hZHZlcnRpc2VkICYgcC0+bHBfYWR2ZXJ0aXNlZCk7CisJZWxzZQorCQllLT5lZWVfYWN0aXZlID0gMDsKKworCWUtPmVlZV9lbmFibGVkID0gcC0+ZWVlX2VuYWJsZWQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfcG9ydF9zdHBfc3RhdGVfc2V0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIHU4IHN0YXRlKQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopZHMtPnByaXY7CisJdTMyIHN0cF9zdGF0ZTsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEJSX1NUQVRFX0RJU0FCTEVEOgorCQlzdHBfc3RhdGUgPSBRQ0E4S19QT1JUX0xPT0tVUF9TVEFURV9ESVNBQkxFRDsKKwkJYnJlYWs7CisJY2FzZSBCUl9TVEFURV9CTE9DS0lORzoKKwkJc3RwX3N0YXRlID0gUUNBOEtfUE9SVF9MT09LVVBfU1RBVEVfQkxPQ0tJTkc7CisJCWJyZWFrOworCWNhc2UgQlJfU1RBVEVfTElTVEVOSU5HOgorCQlzdHBfc3RhdGUgPSBRQ0E4S19QT1JUX0xPT0tVUF9TVEFURV9MSVNURU5JTkc7CisJCWJyZWFrOworCWNhc2UgQlJfU1RBVEVfTEVBUk5JTkc6CisJCXN0cF9zdGF0ZSA9IFFDQThLX1BPUlRfTE9PS1VQX1NUQVRFX0xFQVJOSU5HOworCQlicmVhazsKKwljYXNlIEJSX1NUQVRFX0ZPUldBUkRJTkc6CisJZGVmYXVsdDoKKwkJc3RwX3N0YXRlID0gUUNBOEtfUE9SVF9MT09LVVBfU1RBVEVfRk9SV0FSRDsKKwkJYnJlYWs7CisJfQorCisJcWNhOGtfcm13KHByaXYsIFFDQThLX1BPUlRfTE9PS1VQX0NUUkwocG9ydCksCisJCSAgUUNBOEtfUE9SVF9MT09LVVBfU1RBVEVfTUFTSywgc3RwX3N0YXRlKTsKK30KKworc3RhdGljIGludAorcWNhOGtfcG9ydF9icmlkZ2Vfam9pbihzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmJyaWRnZSkKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWRzLT5wcml2OworCWludCBwb3J0X21hc2sgPSBCSVQoUUNBOEtfQ1BVX1BPUlQpOworCWludCBpOworCisJcHJpdi0+cG9ydF9zdHNbcG9ydF0uYnJpZGdlX2RldiA9IGJyaWRnZTsKKworCWZvciAoaSA9IDE7IGkgPCBRQ0E4S19OVU1fUE9SVFM7IGkrKykgeworCQlpZiAocHJpdi0+cG9ydF9zdHNbaV0uYnJpZGdlX2RldiAhPSBicmlkZ2UpCisJCQljb250aW51ZTsKKwkJLyogQWRkIHRoaXMgcG9ydCB0byB0aGUgcG9ydHZsYW4gbWFzayBvZiB0aGUgb3RoZXIgcG9ydHMKKwkJICogaW4gdGhlIGJyaWRnZQorCQkgKi8KKwkJcWNhOGtfcmVnX3NldChwcml2LAorCQkJICAgICAgUUNBOEtfUE9SVF9MT09LVVBfQ1RSTChpKSwKKwkJCSAgICAgIEJJVChwb3J0KSk7CisJCWlmIChpICE9IHBvcnQpCisJCQlwb3J0X21hc2sgfD0gQklUKGkpOworCX0KKwkvKiBBZGQgYWxsIG90aGVyIHBvcnRzIHRvIHRoaXMgcG9ydHMgcG9ydHZsYW4gbWFzayAqLworCXFjYThrX3Jtdyhwcml2LCBRQ0E4S19QT1JUX0xPT0tVUF9DVFJMKHBvcnQpLAorCQkgIFFDQThLX1BPUlRfTE9PS1VQX01FTUJFUiwgcG9ydF9tYXNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfcG9ydF9icmlkZ2VfbGVhdmUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCkKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWRzLT5wcml2OworCWludCBpOworCisJZm9yIChpID0gMTsgaSA8IFFDQThLX05VTV9QT1JUUzsgaSsrKSB7CisJCWlmIChwcml2LT5wb3J0X3N0c1tpXS5icmlkZ2VfZGV2ICE9CisJCSAgICBwcml2LT5wb3J0X3N0c1twb3J0XS5icmlkZ2VfZGV2KQorCQkJY29udGludWU7CisJCS8qIFJlbW92ZSB0aGlzIHBvcnQgdG8gdGhlIHBvcnR2bGFuIG1hc2sgb2YgdGhlIG90aGVyIHBvcnRzCisJCSAqIGluIHRoZSBicmlkZ2UKKwkJICovCisJCXFjYThrX3JlZ19jbGVhcihwcml2LAorCQkJCVFDQThLX1BPUlRfTE9PS1VQX0NUUkwoaSksCisJCQkJQklUKHBvcnQpKTsKKwl9CisJcHJpdi0+cG9ydF9zdHNbcG9ydF0uYnJpZGdlX2RldiA9IE5VTEw7CisJLyogU2V0IHRoZSBjcHUgcG9ydCB0byBiZSB0aGUgb25seSBvbmUgaW4gdGhlIHBvcnR2bGFuIG1hc2sgb2YKKwkgKiB0aGlzIHBvcnQKKwkgKi8KKwlxY2E4a19ybXcocHJpdiwgUUNBOEtfUE9SVF9MT09LVVBfQ1RSTChwb3J0KSwKKwkJICBRQ0E4S19QT1JUX0xPT0tVUF9NRU1CRVIsIEJJVChRQ0E4S19DUFVfUE9SVCkpOworfQorCitzdGF0aWMgaW50CitxY2E4a19wb3J0X2VuYWJsZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkgIHN0cnVjdCBwaHlfZGV2aWNlICpwaHkpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKilkcy0+cHJpdjsKKworCXFjYThrX3BvcnRfc2V0X3N0YXR1cyhwcml2LCBwb3J0LCAxKTsKKwlwcml2LT5wb3J0X3N0c1twb3J0XS5lbmFibGVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfcG9ydF9kaXNhYmxlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCSAgIHN0cnVjdCBwaHlfZGV2aWNlICpwaHkpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKilkcy0+cHJpdjsKKworCXFjYThrX3BvcnRfc2V0X3N0YXR1cyhwcml2LCBwb3J0LCAwKTsKKwlwcml2LT5wb3J0X3N0c1twb3J0XS5lbmFibGVkID0gMDsKK30KKworc3RhdGljIGludAorcWNhOGtfcG9ydF9mZGJfaW5zZXJ0KHN0cnVjdCBxY2E4a19wcml2ICpwcml2LCBjb25zdCB1OCAqYWRkciwKKwkJICAgICAgdTE2IHBvcnRfbWFzaywgdTE2IHZpZCkKK3sKKwkvKiBTZXQgdGhlIHZpZCB0byB0aGUgcG9ydCB2bGFuIGlkIGlmIG5vIHZpZCBpcyBzZXQgKi8KKwlpZiAoIXZpZCkKKwkJdmlkID0gMTsKKworCXJldHVybiBxY2E4a19mZGJfYWRkKHByaXYsIGFkZHIsIHBvcnRfbWFzaywgdmlkLAorCQkJICAgICBRQ0E4S19BVFVfU1RBVFVTX1NUQVRJQyk7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX3BvcnRfZmRiX3ByZXBhcmUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCisJCSAgICAgICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWRzLT5wcml2OworCisJLyogVGhlIEZEQiB0YWJsZSBmb3Igc3RhdGljIGFuZCBhdXRvIGxlYXJuZWQgZW50cmllcyBpcyB0aGUgc2FtZS4gV2UKKwkgKiBuZWVkIHRvIHJlc2VydmUgYW4gZW50cnkgd2l0aCBubyBwb3J0X21hc2sgc2V0IHRvIG1ha2Ugc3VyZSB0aGF0CisJICogd2hlbiBwb3J0X2ZkYl9hZGQgaXMgY2FsbGVkIGFuIGVudHJ5IGlzIHN0aWxsIGF2YWlsYWJsZS4gT3RoZXJ3aXNlCisJICogdGhlIGxhc3QgZnJlZSBlbnRyeSBtaWdodCBoYXZlIGJlZW4gdXNlZCB1cCBieSBhdXRvIGxlYXJuaW5nCisJICovCisJcmV0dXJuIHFjYThrX3BvcnRfZmRiX2luc2VydChwcml2LCBmZGItPmFkZHIsIDAsIGZkYi0+dmlkKTsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX3BvcnRfZmRiX2FkZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiLAorCQkgICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWRzLT5wcml2OworCXUxNiBwb3J0X21hc2sgPSBCSVQocG9ydCk7CisKKwkvKiBVcGRhdGUgdGhlIEZEQiBlbnRyeSBhZGRpbmcgdGhlIHBvcnRfbWFzayAqLworCXFjYThrX3BvcnRfZmRiX2luc2VydChwcml2LCBmZGItPmFkZHIsIHBvcnRfbWFzaywgZmRiLT52aWQpOworfQorCitzdGF0aWMgaW50CitxY2E4a19wb3J0X2ZkYl9kZWwoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYikKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWRzLT5wcml2OworCXUxNiBwb3J0X21hc2sgPSBCSVQocG9ydCk7CisJdTE2IHZpZCA9IGZkYi0+dmlkOworCisJaWYgKCF2aWQpCisJCXZpZCA9IDE7CisKKwlyZXR1cm4gcWNhOGtfZmRiX2RlbChwcml2LCBmZGItPmFkZHIsIHBvcnRfbWFzaywgdmlkKTsKK30KKworc3RhdGljIGludAorcWNhOGtfcG9ydF9mZGJfZHVtcChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkgICAgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYiwKKwkJICAgIGludCAoKmNiKShzdHJ1Y3Qgc3dpdGNoZGV2X29iaiAqb2JqKSkKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWRzLT5wcml2OworCXN0cnVjdCBxY2E4a19mZGIgX2ZkYiA9IHsgMCB9OworCWludCBjbnQgPSBRQ0E4S19OVU1fRkRCX1JFQ09SRFM7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZwcml2LT5yZWdfbXV0ZXgpOworCXdoaWxlIChjbnQtLSAmJiAhcWNhOGtfZmRiX25leHQocHJpdiwgJl9mZGIsIHBvcnQpKSB7CisJCWlmICghX2ZkYi5hZ2luZykKKwkJCWJyZWFrOworCisJCWV0aGVyX2FkZHJfY29weShmZGItPmFkZHIsIF9mZGIubWFjKTsKKwkJZmRiLT52aWQgPSBfZmRiLnZpZDsKKwkJaWYgKF9mZGIuYWdpbmcgPT0gUUNBOEtfQVRVX1NUQVRVU19TVEFUSUMpCisJCQlmZGItPm5kbV9zdGF0ZSA9IE5VRF9OT0FSUDsKKwkJZWxzZQorCQkJZmRiLT5uZG1fc3RhdGUgPSBOVURfUkVBQ0hBQkxFOworCisJCXJldCA9IGNiKCZmZGItPm9iaik7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5yZWdfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIGRzYV90YWdfcHJvdG9jb2wKK3FjYThrX2dldF90YWdfcHJvdG9jb2woc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoreworCXJldHVybiBEU0FfVEFHX1BST1RPX1FDQTsKK30KKworc3RhdGljIHN0cnVjdCBkc2Ffc3dpdGNoX29wcyBxY2E4a19zd2l0Y2hfb3BzID0geworCS5nZXRfdGFnX3Byb3RvY29sCT0gcWNhOGtfZ2V0X3RhZ19wcm90b2NvbCwKKwkuc2V0dXAJCQk9IHFjYThrX3NldHVwLAorCS5nZXRfc3RyaW5ncwkJPSBxY2E4a19nZXRfc3RyaW5ncywKKwkucGh5X3JlYWQJCT0gcWNhOGtfcGh5X3JlYWQsCisJLnBoeV93cml0ZQkJPSBxY2E4a19waHlfd3JpdGUsCisJLmdldF9ldGh0b29sX3N0YXRzCT0gcWNhOGtfZ2V0X2V0aHRvb2xfc3RhdHMsCisJLmdldF9zc2V0X2NvdW50CQk9IHFjYThrX2dldF9zc2V0X2NvdW50LAorCS5nZXRfZWVlCQk9IHFjYThrX2dldF9lZWUsCisJLnNldF9lZWUJCT0gcWNhOGtfc2V0X2VlZSwKKwkucG9ydF9lbmFibGUJCT0gcWNhOGtfcG9ydF9lbmFibGUsCisJLnBvcnRfZGlzYWJsZQkJPSBxY2E4a19wb3J0X2Rpc2FibGUsCisJLnBvcnRfc3RwX3N0YXRlX3NldAk9IHFjYThrX3BvcnRfc3RwX3N0YXRlX3NldCwKKwkucG9ydF9icmlkZ2Vfam9pbgk9IHFjYThrX3BvcnRfYnJpZGdlX2pvaW4sCisJLnBvcnRfYnJpZGdlX2xlYXZlCT0gcWNhOGtfcG9ydF9icmlkZ2VfbGVhdmUsCisJLnBvcnRfZmRiX3ByZXBhcmUJPSBxY2E4a19wb3J0X2ZkYl9wcmVwYXJlLAorCS5wb3J0X2ZkYl9hZGQJCT0gcWNhOGtfcG9ydF9mZGJfYWRkLAorCS5wb3J0X2ZkYl9kZWwJCT0gcWNhOGtfcG9ydF9mZGJfZGVsLAorCS5wb3J0X2ZkYl9kdW1wCQk9IHFjYThrX3BvcnRfZmRiX2R1bXAsCit9OworCitzdGF0aWMgaW50CitxY2E4a19zd19wcm9iZShzdHJ1Y3QgbWRpb19kZXZpY2UgKm1kaW9kZXYpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXY7CisJdTMyIGlkOworCisJLyogYWxsb2NhdGUgdGhlIHByaXZhdGUgZGF0YSBzdHJ1Y3Qgc28gdGhhdCB3ZSBjYW4gcHJvYmUgdGhlIHN3aXRjaGVzCisJICogSUQgcmVnaXN0ZXIKKwkgKi8KKwlwcml2ID0gZGV2bV9remFsbG9jKCZtZGlvZGV2LT5kZXYsIHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcml2LT5idXMgPSBtZGlvZGV2LT5idXM7CisKKwkvKiByZWFkIHRoZSBzd2l0Y2hlcyBJRCByZWdpc3RlciAqLworCWlkID0gcWNhOGtfcmVhZChwcml2LCBRQ0E4S19SRUdfTUFTS19DVFJMKTsKKwlpZCA+Pj0gUUNBOEtfTUFTS19DVFJMX0lEX1M7CisJaWQgJj0gUUNBOEtfTUFTS19DVFJMX0lEX007CisJaWYgKGlkICE9IFFDQThLX0lEX1FDQTgzMzcpCisJCXJldHVybiAtRU5PREVWOworCisJcHJpdi0+ZHMgPSBkZXZtX2t6YWxsb2MoJm1kaW9kZXYtPmRldiwgc2l6ZW9mKCpwcml2LT5kcyksIEdGUF9LRVJORUwpOworCWlmICghcHJpdi0+ZHMpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdi0+ZHMtPnByaXYgPSBwcml2OworCXByaXYtPmRzLT5kZXYgPSAmbWRpb2Rldi0+ZGV2OworCXByaXYtPmRzLT5vcHMgPSAmcWNhOGtfc3dpdGNoX29wczsKKwltdXRleF9pbml0KCZwcml2LT5yZWdfbXV0ZXgpOworCWRldl9zZXRfZHJ2ZGF0YSgmbWRpb2Rldi0+ZGV2LCBwcml2KTsKKworCXJldHVybiBkc2FfcmVnaXN0ZXJfc3dpdGNoKHByaXYtPmRzLCBwcml2LT5kcy0+ZGV2LT5vZl9ub2RlKTsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX3N3X3JlbW92ZShzdHJ1Y3QgbWRpb19kZXZpY2UgKm1kaW9kZXYpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoJm1kaW9kZXYtPmRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUUNBOEtfTlVNX1BPUlRTOyBpKyspCisJCXFjYThrX3BvcnRfc2V0X3N0YXR1cyhwcml2LCBpLCAwKTsKKworCWRzYV91bnJlZ2lzdGVyX3N3aXRjaChwcml2LT5kcyk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyB2b2lkCitxY2E4a19zZXRfcG0oc3RydWN0IHFjYThrX3ByaXYgKnByaXYsIGludCBlbmFibGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUUNBOEtfTlVNX1BPUlRTOyBpKyspIHsKKwkJaWYgKCFwcml2LT5wb3J0X3N0c1tpXS5lbmFibGVkKQorCQkJY29udGludWU7CisKKwkJcWNhOGtfcG9ydF9zZXRfc3RhdHVzKHByaXYsIGksIGVuYWJsZSk7CisJfQorfQorCitzdGF0aWMgaW50IHFjYThrX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcWNhOGtfc2V0X3BtKHByaXYsIDApOworCisJcmV0dXJuIGRzYV9zd2l0Y2hfc3VzcGVuZChwcml2LT5kcyk7Cit9CisKK3N0YXRpYyBpbnQgcWNhOGtfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXFjYThrX3NldF9wbShwcml2LCAxKTsKKworCXJldHVybiBkc2Ffc3dpdGNoX3Jlc3VtZShwcml2LT5kcyk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhxY2E4a19wbV9vcHMsCisJCQkgcWNhOGtfc3VzcGVuZCwgcWNhOGtfcmVzdW1lKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcWNhOGtfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjYSxxY2E4MzM3IiB9LAorCXsgLyogc2VudGluZWwgKi8gfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWRpb19kcml2ZXIgcWNhOGttZGlvX2RyaXZlciA9IHsKKwkucHJvYmUgID0gcWNhOGtfc3dfcHJvYmUsCisJLnJlbW92ZSA9IHFjYThrX3N3X3JlbW92ZSwKKwkubWRpb2Rydi5kcml2ZXIgPSB7CisJCS5uYW1lID0gInFjYThrIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gcWNhOGtfb2ZfbWF0Y2gsCisJCS5wbSA9ICZxY2E4a19wbV9vcHMsCisJfSwKK307CisKK21kaW9fbW9kdWxlX2RyaXZlcihxY2E4a21kaW9fZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiTWF0aGlldSBPbGl2YXJpLCBKb2huIENyaXNwaW4gPGpvaG5AcGhyb3plbi5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgUUNBOEsgZXRoZXJuZXQgc3dpdGNoIGZhbWlseSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpxY2E4ayIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL3FjYThrLmggYi9kcml2ZXJzL25ldC9kc2EvcWNhOGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDE0NjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZHNhL3FjYThrLmgKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRmVsaXggRmlldGthdSA8bmJkQG5iZC5uYW1lPgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgR2Fib3IgSnVob3MgPGp1aG9zZ0BvcGVud3J0Lm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fUUNBOEtfSAorI2RlZmluZSBfX1FDQThLX0gKKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNkZWZpbmUgUUNBOEtfTlVNX1BPUlRTCQkJCQk3CisKKyNkZWZpbmUgUEhZX0lEX1FDQTgzMzcJCQkJCTB4MDA0ZGQwMzYKKyNkZWZpbmUgUUNBOEtfSURfUUNBODMzNwkJCQkweDEzCisKKyNkZWZpbmUgUUNBOEtfTlVNX0ZEQl9SRUNPUkRTCQkJCTIwNDgKKworI2RlZmluZSBRQ0E4S19DUFVfUE9SVAkJCQkJMAorCisvKiBHbG9iYWwgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUUNBOEtfUkVHX01BU0tfQ1RSTAkJCQkweDAwMAorI2RlZmluZSAgIFFDQThLX01BU0tfQ1RSTF9JRF9NCQkJCTB4ZmYKKyNkZWZpbmUgICBRQ0E4S19NQVNLX0NUUkxfSURfUwkJCQk4CisjZGVmaW5lIFFDQThLX1JFR19QT1JUMF9QQURfQ1RSTAkJCTB4MDA0CisjZGVmaW5lIFFDQThLX1JFR19QT1JUNV9QQURfQ1RSTAkJCTB4MDA4CisjZGVmaW5lIFFDQThLX1JFR19QT1JUNl9QQURfQ1RSTAkJCTB4MDBjCisjZGVmaW5lICAgUUNBOEtfUE9SVF9QQURfUkdNSUlfRU4JCQlCSVQoMjYpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9QQURfUkdNSUlfVFhfREVMQVkoeCkJCVwKKwkJCQkJCSgoMHg4ICsgKHggJiAweDMpKSA8PCAyMikKKyNkZWZpbmUgICBRQ0E4S19QT1JUX1BBRF9SR01JSV9SWF9ERUxBWSh4KQkJXAorCQkJCQkJKCgweDEwICsgKHggJiAweDMpKSA8PCAyMCkKKyNkZWZpbmUgICBRQ0E4S19QT1JUX1BBRF9SR01JSV9SWF9ERUxBWV9FTgkJQklUKDI0KQorI2RlZmluZSAgIFFDQThLX1BPUlRfUEFEX1NHTUlJX0VOCQkJQklUKDcpCisjZGVmaW5lIFFDQThLX1JFR19NT0RVTEVfRU4JCQkJMHgwMzAKKyNkZWZpbmUgICBRQ0E4S19NT0RVTEVfRU5fTUlCCQkJCUJJVCgwKQorI2RlZmluZSBRQ0E4S19SRUdfTUlCCQkJCQkweDAzNAorI2RlZmluZSAgIFFDQThLX01JQl9GTFVTSAkJCQlCSVQoMjQpCisjZGVmaW5lICAgUUNBOEtfTUlCX0NQVV9LRUVQCQkJCUJJVCgyMCkKKyNkZWZpbmUgICBRQ0E4S19NSUJfQlVTWQkJCQlCSVQoMTcpCisjZGVmaW5lIFFDQThLX0dPTF9NQUNfQUREUjAJCQkJMHg2MAorI2RlZmluZSBRQ0E4S19HT0xfTUFDX0FERFIxCQkJCTB4NjQKKyNkZWZpbmUgUUNBOEtfUkVHX1BPUlRfU1RBVFVTKF9pKQkJCSgweDA3YyArIChfaSkgKiA0KQorI2RlZmluZSAgIFFDQThLX1BPUlRfU1RBVFVTX1NQRUVECQkJR0VOTUFTSygyLCAwKQorI2RlZmluZSAgIFFDQThLX1BPUlRfU1RBVFVTX1NQRUVEX1MJCQkwCisjZGVmaW5lICAgUUNBOEtfUE9SVF9TVEFUVVNfVFhNQUMJCQlCSVQoMikKKyNkZWZpbmUgICBRQ0E4S19QT1JUX1NUQVRVU19SWE1BQwkJCUJJVCgzKQorI2RlZmluZSAgIFFDQThLX1BPUlRfU1RBVFVTX1RYRkxPVwkJCUJJVCg0KQorI2RlZmluZSAgIFFDQThLX1BPUlRfU1RBVFVTX1JYRkxPVwkJCUJJVCg1KQorI2RlZmluZSAgIFFDQThLX1BPUlRfU1RBVFVTX0RVUExFWAkJCUJJVCg2KQorI2RlZmluZSAgIFFDQThLX1BPUlRfU1RBVFVTX0xJTktfVVAJCQlCSVQoOCkKKyNkZWZpbmUgICBRQ0E4S19QT1JUX1NUQVRVU19MSU5LX0FVVE8JCQlCSVQoOSkKKyNkZWZpbmUgICBRQ0E4S19QT1JUX1NUQVRVU19MSU5LX1BBVVNFCQkJQklUKDEwKQorI2RlZmluZSBRQ0E4S19SRUdfUE9SVF9IRFJfQ1RSTChfaSkJCQkoMHg5YyArIChfaSAqIDQpKQorI2RlZmluZSAgIFFDQThLX1BPUlRfSERSX0NUUkxfUlhfTUFTSwkJCUdFTk1BU0soMywgMikKKyNkZWZpbmUgICBRQ0E4S19QT1JUX0hEUl9DVFJMX1JYX1MJCQkyCisjZGVmaW5lICAgUUNBOEtfUE9SVF9IRFJfQ1RSTF9UWF9NQVNLCQkJR0VOTUFTSygxLCAwKQorI2RlZmluZSAgIFFDQThLX1BPUlRfSERSX0NUUkxfVFhfUwkJCTAKKyNkZWZpbmUgICBRQ0E4S19QT1JUX0hEUl9DVFJMX0FMTAkJCTIKKyNkZWZpbmUgICBRQ0E4S19QT1JUX0hEUl9DVFJMX01HTVQJCQkxCisjZGVmaW5lICAgUUNBOEtfUE9SVF9IRFJfQ1RSTF9OT05FCQkJMAorCisvKiBFRUUgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUUNBOEtfUkVHX0VFRV9DVFJMCQkJCTB4MTAwCisjZGVmaW5lICBRQ0E4S19SRUdfRUVFX0NUUkxfTFBJX0VOKF9pKQkJCSgoX2kgKyAxKSAqIDIpCisKKy8qIEFDTCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUUNBOEtfUkVHX1BPUlRfVkxBTl9DVFJMMChfaSkJCQkoMHg0MjAgKyAoX2kgKiA4KSkKKyNkZWZpbmUgICBRQ0E4S19QT1JUX1ZMQU5fQ1ZJRCh4KQkJCSh4IDw8IDE2KQorI2RlZmluZSAgIFFDQThLX1BPUlRfVkxBTl9TVklEKHgpCQkJeAorI2RlZmluZSBRQ0E4S19SRUdfUE9SVF9WTEFOX0NUUkwxKF9pKQkJCSgweDQyNCArIChfaSAqIDgpKQorI2RlZmluZSBRQ0E4S19SRUdfSVBWNF9QUklfQkFTRV9BRERSCQkJMHg0NzAKKyNkZWZpbmUgUUNBOEtfUkVHX0lQVjRfUFJJX0FERFJfTUFTSwkJCTB4NDc0CisKKy8qIExvb2t1cCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUUNBOEtfUkVHX0FUVV9EQVRBMAkJCQkweDYwMAorI2RlZmluZSAgIFFDQThLX0FUVV9BRERSMl9TCQkJCTI0CisjZGVmaW5lICAgUUNBOEtfQVRVX0FERFIzX1MJCQkJMTYKKyNkZWZpbmUgICBRQ0E4S19BVFVfQUREUjRfUwkJCQk4CisjZGVmaW5lIFFDQThLX1JFR19BVFVfREFUQTEJCQkJMHg2MDQKKyNkZWZpbmUgICBRQ0E4S19BVFVfUE9SVF9NCQkJCTB4N2YKKyNkZWZpbmUgICBRQ0E4S19BVFVfUE9SVF9TCQkJCTE2CisjZGVmaW5lICAgUUNBOEtfQVRVX0FERFIwX1MJCQkJOAorI2RlZmluZSBRQ0E4S19SRUdfQVRVX0RBVEEyCQkJCTB4NjA4CisjZGVmaW5lICAgUUNBOEtfQVRVX1ZJRF9NCQkJCTB4ZmZmCisjZGVmaW5lICAgUUNBOEtfQVRVX1ZJRF9TCQkJCTgKKyNkZWZpbmUgICBRQ0E4S19BVFVfU1RBVFVTX00JCQkJMHhmCisjZGVmaW5lICAgUUNBOEtfQVRVX1NUQVRVU19TVEFUSUMJCQkweGYKKyNkZWZpbmUgUUNBOEtfUkVHX0FUVV9GVU5DCQkJCTB4NjBjCisjZGVmaW5lICAgUUNBOEtfQVRVX0ZVTkNfQlVTWQkJCQlCSVQoMzEpCisjZGVmaW5lICAgUUNBOEtfQVRVX0ZVTkNfUE9SVF9FTgkJCUJJVCgxNCkKKyNkZWZpbmUgICBRQ0E4S19BVFVfRlVOQ19NVUxUSV9FTgkJCUJJVCgxMykKKyNkZWZpbmUgICBRQ0E4S19BVFVfRlVOQ19GVUxMCQkJCUJJVCgxMikKKyNkZWZpbmUgICBRQ0E4S19BVFVfRlVOQ19QT1JUX00JCQkJMHhmCisjZGVmaW5lICAgUUNBOEtfQVRVX0ZVTkNfUE9SVF9TCQkJCTgKKyNkZWZpbmUgUUNBOEtfUkVHX0dMT0JBTF9GV19DVFJMMAkJCTB4NjIwCisjZGVmaW5lICAgUUNBOEtfR0xPQkFMX0ZXX0NUUkwwX0NQVV9QT1JUX0VOCQlCSVQoMTApCisjZGVmaW5lIFFDQThLX1JFR19HTE9CQUxfRldfQ1RSTDEJCQkweDYyNAorI2RlZmluZSAgIFFDQThLX0dMT0JBTF9GV19DVFJMMV9JR01QX0RQX1MJCTI0CisjZGVmaW5lICAgUUNBOEtfR0xPQkFMX0ZXX0NUUkwxX0JDX0RQX1MJCQkxNgorI2RlZmluZSAgIFFDQThLX0dMT0JBTF9GV19DVFJMMV9NQ19EUF9TCQkJOAorI2RlZmluZSAgIFFDQThLX0dMT0JBTF9GV19DVFJMMV9VQ19EUF9TCQkJMAorI2RlZmluZSBRQ0E4S19QT1JUX0xPT0tVUF9DVFJMKF9pKQkJCSgweDY2MCArIChfaSkgKiAweGMpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9MT09LVVBfTUVNQkVSCQkJR0VOTUFTSyg2LCAwKQorI2RlZmluZSAgIFFDQThLX1BPUlRfTE9PS1VQX1NUQVRFX01BU0sJCQlHRU5NQVNLKDE4LCAxNikKKyNkZWZpbmUgICBRQ0E4S19QT1JUX0xPT0tVUF9TVEFURV9ESVNBQkxFRAkJKDAgPDwgMTYpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9MT09LVVBfU1RBVEVfQkxPQ0tJTkcJCSgxIDw8IDE2KQorI2RlZmluZSAgIFFDQThLX1BPUlRfTE9PS1VQX1NUQVRFX0xJU1RFTklORwkJKDIgPDwgMTYpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9MT09LVVBfU1RBVEVfTEVBUk5JTkcJCSgzIDw8IDE2KQorI2RlZmluZSAgIFFDQThLX1BPUlRfTE9PS1VQX1NUQVRFX0ZPUldBUkQJCSg0IDw8IDE2KQorI2RlZmluZSAgIFFDQThLX1BPUlRfTE9PS1VQX1NUQVRFCQkJR0VOTUFTSygxOCwgMTYpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9MT09LVVBfTEVBUk4JCQlCSVQoMjApCisKKy8qIFBrdCBlZGl0IHJlZ2lzdGVycyAqLworI2RlZmluZSBRQ0E4S19FR1JFU1NfVkxBTih4KQkJCQkoMHgwYzcwICsgKDQgKiAoeCAvIDIpKSkKKworLyogTDMgcmVnaXN0ZXJzICovCisjZGVmaW5lIFFDQThLX0hST1VURVJfQ09OVFJPTAkJCQkweGUwMAorI2RlZmluZSAgIFFDQThLX0hST1VURVJfQ09OVFJPTF9HTEJfTE9DS1RJTUVfTQkJR0VOTUFTSygxNywgMTYpCisjZGVmaW5lICAgUUNBOEtfSFJPVVRFUl9DT05UUk9MX0dMQl9MT0NLVElNRV9TCQkxNgorI2RlZmluZSAgIFFDQThLX0hST1VURVJfQ09OVFJPTF9BUlBfQUdFX01PREUJCTEKKyNkZWZpbmUgUUNBOEtfSFJPVVRFUl9QQkFTRURfQ09OVFJPTDEJCQkweGUwOAorI2RlZmluZSBRQ0E4S19IUk9VVEVSX1BCQVNFRF9DT05UUk9MMgkJCTB4ZTBjCisjZGVmaW5lIFFDQThLX0hOQVRfQ09OVFJPTAkJCQkweGUzOAorCisvKiBNSUIgcmVnaXN0ZXJzICovCisjZGVmaW5lIFFDQThLX1BPUlRfTUlCX0NPVU5URVIoX2kpCQkJKDB4MTAwMCArIChfaSkgKiAweDEwMCkKKworLyogUUNBIHNwZWNpZmljIE1JSSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUlJX0FUSF9NTURfQUREUgkJCQkweDBkCisjZGVmaW5lIE1JSV9BVEhfTU1EX0RBVEEJCQkJMHgwZQorCitlbnVtIHsKKwlRQ0E4S19QT1JUX1NQRUVEXzEwTSA9IDAsCisJUUNBOEtfUE9SVF9TUEVFRF8xMDBNID0gMSwKKwlRQ0E4S19QT1JUX1NQRUVEXzEwMDBNID0gMiwKKwlRQ0E4S19QT1JUX1NQRUVEX0VSUiA9IDMsCit9OworCitlbnVtIHFjYThrX2ZkYl9jbWQgeworCVFDQThLX0ZEQl9GTFVTSAk9IDEsCisJUUNBOEtfRkRCX0xPQUQgPSAyLAorCVFDQThLX0ZEQl9QVVJHRSA9IDMsCisJUUNBOEtfRkRCX05FWFQgPSA2LAorCVFDQThLX0ZEQl9TRUFSQ0ggPSA3LAorfTsKKworc3RydWN0IGFyOHh4eF9wb3J0X3N0YXR1cyB7CisJc3RydWN0IGV0aHRvb2xfZWVlIGVlZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqYnJpZGdlX2RldjsKKwlpbnQgZW5hYmxlZDsKK307CisKK3N0cnVjdCBxY2E4a19wcml2IHsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IG1paV9idXMgKmJ1czsKKwlzdHJ1Y3QgYXI4eHh4X3BvcnRfc3RhdHVzIHBvcnRfc3RzW1FDQThLX05VTV9QT1JUU107CisJc3RydWN0IGRzYV9zd2l0Y2ggKmRzOworCXN0cnVjdCBtdXRleCByZWdfbXV0ZXg7Cit9OworCitzdHJ1Y3QgcWNhOGtfbWliX2Rlc2MgeworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK3N0cnVjdCBxY2E4a19mZGIgeworCXUxNiB2aWQ7CisJdTggcG9ydF9tYXNrOworCXU4IGFnaW5nOworCXU4IG1hY1s2XTsKK307CisKKyNlbmRpZiAvKiBfX1FDQThLX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vM2M1OXguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vM2M1OXguYwppbmRleCAyNWM1NWFiLi45MTMzZTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC8zY29tLzNjNTl4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvM2NvbS8zYzU5eC5jCkBAIC0zMDg5LDcgKzMwODksNyBAQAogCWlvd3JpdGUxNihuZXdfbW9kZSwgaW9hZGRyICsgRUwzX0NNRCk7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19WTEFOXzgwMjFRKQogLyogU2V0dXAgdGhlIGNhcmQgc28gdGhhdCBpdCBjYW4gcmVjZWl2ZSBmcmFtZXMgd2l0aCBhbiA4MDIuMXEgVkxBTiB0YWcuCiAgICBOb3RlIHRoYXQgdGhpcyBtdXN0IGJlIGRvbmUgYWZ0ZXIgZWFjaCBSeFJlc2V0IGR1ZSB0byBzb21lIGJhY2t3YXJkcwogICAgY29tcGF0aWJpbGl0eSBsb2dpYyBpbiB0aGUgQ3ljbG9uZSBhbmQgVG9ybmFkbyBBU0lDcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L0tjb25maWcKaW5kZXggMmZmZDYzNC4uOGNjNzQ2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9LY29uZmlnCkBAIC0yNCw2ICsyNCw3IEBACiBzb3VyY2UgImRyaXZlcnMvbmV0L2V0aGVybmV0L2FsbHdpbm5lci9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL25ldC9ldGhlcm5ldC9hbHRlb24vS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9uZXQvZXRoZXJuZXQvYWx0ZXJhL0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbmV0L2V0aGVybmV0L2FwcGxlL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L01ha2VmaWxlCmluZGV4IDFkMzQ5ZTkuLmEwOTQyM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L01ha2VmaWxlCkBAIC0xMCw2ICsxMCw3IEBACiBvYmotJChDT05GSUdfTkVUX1ZFTkRPUl9BTExXSU5ORVIpICs9IGFsbHdpbm5lci8KIG9iai0kKENPTkZJR19ORVRfVkVORE9SX0FMVEVPTikgKz0gYWx0ZW9uLwogb2JqLSQoQ09ORklHX0FMVEVSQV9UU0UpICs9IGFsdGVyYS8KK29iai0kKENPTkZJR19ORVRfVkVORE9SX0FNQVpPTikgKz0gYW1hem9uLwogb2JqLSQoQ09ORklHX05FVF9WRU5ET1JfQU1EKSArPSBhbWQvCiBvYmotJChDT05GSUdfTkVUX1hHRU5FKSArPSBhcG0vCiBvYmotJChDT05GSUdfTkVUX1ZFTkRPUl9BUFBMRSkgKz0gYXBwbGUvCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZGFwdGVjL3N0YXJmaXJlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZGFwdGVjL3N0YXJmaXJlLmMKaW5kZXggMWQxMDY5Ni4uOGFmMmM4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWRhcHRlYy9zdGFyZmlyZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FkYXB0ZWMvc3RhcmZpcmUuYwpAQCAtNjYsNyArNjYsNyBAQAogICovCiAjZGVmaW5lIFpFUk9DT1BZCiAKLSNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19WTEFOXzgwMjFRKQogI2RlZmluZSBWTEFOX1NVUFBPUlQKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZGkvYmZpbl9tYWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FkaS9iZmluX21hYy5jCmluZGV4IDM4ZWFlYTEuLjAwZjllZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FkaS9iZmluX21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FkaS9iZmluX21hYy5jCkBAIC0xOTIsOCArMTkyLDggQEAKIAkJCWdvdG8gaW5pdF9lcnJvcjsKIAogCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCBORVRfSVBfQUxJR04pOwotCQkvKiBJbnZpZGF0ZSB0aGUgZGF0YSBjYWNoZSBvZiBza2ItPmRhdGEgcmFuZ2Ugd2hlbiBpdCBpcyB3cml0ZSBiYWNrCi0JCSAqIGNhY2hlLiBJdCB3aWxsIHByZXZlbnQgb3ZlcndyaXR0aW5nIHRoZSBuZXcgZGF0YSBmcm9tIERNQQorCQkvKiBJbnZhbGlkYXRlIHRoZSBkYXRhIGNhY2hlIG9mIHNrYi0+ZGF0YSByYW5nZSB3aGVuIGl0IGlzIHdyaXRlIGJhY2sKKwkJICogY2FjaGUuIEl0IHdpbGwgcHJldmVudCBvdmVyd3JpdGluZyB0aGUgbmV3IGRhdGEgZnJvbSBETUEKIAkJICovCiAJCWJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKCh1bnNpZ25lZCBsb25nKW5ld19za2ItPmhlYWQsCiAJCQkJCSAodW5zaWduZWQgbG9uZyluZXdfc2tiLT5lbmQpOwpAQCAtMTIwNSw3ICsxMjA1LDcgQEAKIAl9CiAJLyogcmVzZXJ2ZSAyIGJ5dGVzIGZvciBSWERXQSBwYWRkaW5nICovCiAJc2tiX3Jlc2VydmUobmV3X3NrYiwgTkVUX0lQX0FMSUdOKTsKLQkvKiBJbnZpZGF0ZSB0aGUgZGF0YSBjYWNoZSBvZiBza2ItPmRhdGEgcmFuZ2Ugd2hlbiBpdCBpcyB3cml0ZSBiYWNrCisJLyogSW52YWxpZGF0ZSB0aGUgZGF0YSBjYWNoZSBvZiBza2ItPmRhdGEgcmFuZ2Ugd2hlbiBpdCBpcyB3cml0ZSBiYWNrCiAJICogY2FjaGUuIEl0IHdpbGwgcHJldmVudCBvdmVyd3JpdHRpbmcgdGhlIG5ldyBkYXRhIGZyb20gRE1BCiAJICovCiAJYmxhY2tmaW5fZGNhY2hlX2ludmFsaWRhdGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpbmV3X3NrYi0+aGVhZCwKQEAgLTE1OTksNyArMTU5OSw3IEBACiAJKihfX2xlMTYgKikgKCYobmRldi0+ZGV2X2FkZHJbNF0pKSA9IGNwdV90b19sZTE2KCh1MTYpIGJmaW5fcmVhZF9FTUFDX0FERFJISSgpKTsKIAogCS8qIHByb2JlIG1hYyAqLwotCS8qdG9kbzogaG93IHRvIHByb2JsZT8gd2hpY2ggaXMgcmV2aXNpb25fcmVnaXN0ZXIgKi8KKwkvKnRvZG86IGhvdyB0byBwcm9iZT8gd2hpY2ggaXMgcmV2aXNpb25fcmVnaXN0ZXIgKi8KIAliZmluX3dyaXRlX0VNQUNfQUREUkxPKDB4MTIzNDU2NzgpOwogCWlmIChiZmluX3JlYWRfRU1BQ19BRERSTE8oKSAhPSAweDEyMzQ1Njc4KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBkZXRlY3QgQmxhY2tmaW4gb24tY2hpcCBldGhlcm5ldCBNQUMgY29udHJvbGxlciFcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWVyb2ZsZXgvZ3JldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Flcm9mbGV4L2dyZXRoLmMKaW5kZXggYmNhMDdjNS4uZjhkZjgyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWVyb2ZsZXgvZ3JldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZXJvZmxleC9ncmV0aC5jCkBAIC0xMTA1LDI3ICsxMTA1LDYgQEAKIAlzdHJ1Y3QgZ3JldGhfcHJpdmF0ZSAqZ3JldGggPSBuZXRkZXZfcHJpdihkZXYpOwogCWdyZXRoLT5tc2dfZW5hYmxlID0gdmFsdWU7CiB9Ci1zdGF0aWMgaW50IGdyZXRoX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3QgZ3JldGhfcHJpdmF0ZSAqZ3JldGggPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHkgPSBncmV0aC0+cGh5OwotCi0JaWYgKCFwaHkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIHBoeV9ldGh0b29sX2dzZXQocGh5LCBjbWQpOwotfQotCi1zdGF0aWMgaW50IGdyZXRoX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3QgZ3JldGhfcHJpdmF0ZSAqZ3JldGggPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHkgPSBncmV0aC0+cGh5OwotCi0JaWYgKCFwaHkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocGh5LCBjbWQpOwotfQogCiBzdGF0aWMgaW50IGdyZXRoX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtMTE1NywxMiArMTEzNiwxMiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBncmV0aF9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X21zZ2xldmVsCQk9IGdyZXRoX2dldF9tc2dsZXZlbCwKIAkuc2V0X21zZ2xldmVsCQk9IGdyZXRoX3NldF9tc2dsZXZlbCwKLQkuZ2V0X3NldHRpbmdzCQk9IGdyZXRoX2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzCQk9IGdyZXRoX3NldF9zZXR0aW5ncywKIAkuZ2V0X2RydmluZm8JCT0gZ3JldGhfZ2V0X2RydmluZm8sCiAJLmdldF9yZWdzX2xlbiAgICAgICAgICAgPSBncmV0aF9nZXRfcmVnc19sZW4sCiAJLmdldF9yZWdzICAgICAgICAgICAgICAgPSBncmV0aF9nZXRfcmVncywKIAkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X2xpbmtfa3NldHRpbmdzCT0gcGh5X2V0aHRvb2xfZ2V0X2xpbmtfa3NldHRpbmdzLAorCS5zZXRfbGlua19rc2V0dGluZ3MJPSBwaHlfZXRodG9vbF9zZXRfbGlua19rc2V0dGluZ3MsCiB9OwogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGdyZXRoX25ldGRldl9vcHMgPSB7CkBAIC0xMjI0LDcgKzEyMDMsNyBAQAogc3RhdGljIHZvaWQgZ3JldGhfbGlua19jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZ3JldGhfcHJpdmF0ZSAqZ3JldGggPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBncmV0aC0+cGh5OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBkZXYtPnBoeWRldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzdGF0dXNfY2hhbmdlID0gMDsKIAl1MzIgY3RybDsKQEAgLTEzMDcsNyArMTI4Niw2IEBACiAJZ3JldGgtPmxpbmsgPSAwOwogCWdyZXRoLT5zcGVlZCA9IDA7CiAJZ3JldGgtPmR1cGxleCA9IC0xOwotCWdyZXRoLT5waHkgPSBwaHk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEzMjUsNiArMTMwMyw3IEBACiB7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBncmV0aC0+bmV0ZGV2OwogCiAJZ3JldGgtPm1kaW8gPSBtZGlvYnVzX2FsbG9jKCk7CiAJaWYgKCFncmV0aC0+bWRpbykgewpAQCAtMTM0OSwxNSArMTMyOCwxNiBAQAogCQlnb3RvIHVucmVnX21kaW87CiAJfQogCi0JcGh5X3N0YXJ0KGdyZXRoLT5waHkpOworCXBoeV9zdGFydChuZGV2LT5waHlkZXYpOwogCiAJLyogSWYgRXRoZXJuZXQgZGVidWcgbGluayBpcyB1c2VkIG1ha2UgYXV0b25lZyBoYXBwZW4gcmlnaHQgYXdheSAqLwogCWlmIChncmV0aC0+ZWRjbCAmJiBncmV0aF9lZGNsID09IDEpIHsKLQkJcGh5X3N0YXJ0X2FuZWcoZ3JldGgtPnBoeSk7CisJCXBoeV9zdGFydF9hbmVnKG5kZXYtPnBoeWRldik7CiAJCXRpbWVvdXQgPSBqaWZmaWVzICsgNipIWjsKLQkJd2hpbGUgKCFwaHlfYW5lZ19kb25lKGdyZXRoLT5waHkpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCXdoaWxlICghcGh5X2FuZWdfZG9uZShuZGV2LT5waHlkZXYpICYmCisJCSAgICAgICB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewogCQl9Ci0JCXBoeV9yZWFkX3N0YXR1cyhncmV0aC0+cGh5KTsKKwkJcGh5X3JlYWRfc3RhdHVzKG5kZXYtPnBoeWRldik7CiAJCWdyZXRoX2xpbmtfY2hhbmdlKGdyZXRoLT5uZXRkZXYpOwogCX0KIApAQCAtMTU2OSw4ICsxNTQ5LDggQEAKIAogCWRtYV9mcmVlX2NvaGVyZW50KCZvZl9kZXYtPmRldiwgMTAyNCwgZ3JldGgtPnR4X2JkX2Jhc2UsIGdyZXRoLT50eF9iZF9iYXNlX3BoeXMpOwogCi0JaWYgKGdyZXRoLT5waHkpCi0JCXBoeV9zdG9wKGdyZXRoLT5waHkpOworCWlmIChuZGV2LT5waHlkZXYpCisJCXBoeV9zdG9wKG5kZXYtPnBoeWRldik7CiAJbWRpb2J1c191bnJlZ2lzdGVyKGdyZXRoLT5tZGlvKTsKIAogCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWVyb2ZsZXgvZ3JldGguaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Flcm9mbGV4L2dyZXRoLmgKaW5kZXggOTJkZDkxOC4uOWMwNzE0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWVyb2ZsZXgvZ3JldGguaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZXJvZmxleC9ncmV0aC5oCkBAIC0xMjMsNyArMTIzLDYgQEAKIAlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaTsKIAlzcGlubG9ja190IGRldmxvY2s7CiAKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5OwogCXN0cnVjdCBtaWlfYnVzICptZGlvOwogCXVuc2lnbmVkIGludCBsaW5rOwogCXVuc2lnbmVkIGludCBzcGVlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FnZXJlL2V0MTMxeC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWdlcmUvZXQxMzF4LmMKaW5kZXggYzgzZWJhZS4uOTA2NjgzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWdlcmUvZXQxMzF4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWdlcmUvZXQxMzF4LmMKQEAgLTI5NjEsNyArMjk2MSw3IEBACiAJCXNpemVvZihpbmZvLT5idXNfaW5mbykpOwogfQogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0MTMxeF9ldGh0b29sX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgZXQxMzF4X2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbwk9IGV0MTMxeF9nZXRfZHJ2aW5mbywKIAkuZ2V0X3JlZ3NfbGVuCT0gZXQxMzF4X2dldF9yZWdzX2xlbiwKIAkuZ2V0X3JlZ3MJPSBldDEzMXhfZ2V0X3JlZ3MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YjMwMzUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL0tjb25maWcKQEAgLTAsMCArMSwyNyBAQAorIworIyBBbWF6b24gbmV0d29yayBkZXZpY2UgY29uZmlndXJhdGlvbgorIworCitjb25maWcgTkVUX1ZFTkRPUl9BTUFaT04KKwlib29sICJBbWF6b24gRGV2aWNlcyIKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBkZXZpY2UgYmVsb25naW5nIHRvIHRoaXMgY2xhc3MsIHNheSBZLgorCisJICBOb3RlIHRoYXQgdGhlIGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIGRvZXNuJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBBbWF6b24gZGV2aWNlcy4gSWYgeW91IHNheSBZLCB5b3Ugd2lsbCBiZSBhc2tlZAorCSAgZm9yIHlvdXIgc3BlY2lmaWMgZGV2aWNlIGluIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zLgorCitpZiBORVRfVkVORE9SX0FNQVpPTgorCitjb25maWcgRU5BX0VUSEVSTkVUCisJdHJpc3RhdGUgIkVsYXN0aWMgTmV0d29yayBBZGFwdGVyIChFTkEpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiAoUENJX01TSSAmJiBYODYpCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgRWxhc3RpYyBOZXR3b3JrIEFkYXB0ZXIgKEVOQSkiCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuCisJICBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGVuYS4KKworZW5kaWYgI05FVF9WRU5ET1JfQU1BWk9OCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwYjczZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBBbWF6b24gbmV0d29yayBkZXZpY2UgZHJpdmVycy4KKyMKKworb2JqLSQoQ09ORklHX0VOQV9FVEhFUk5FVCkgKz0gZW5hLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlZWFlMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIEVsYXN0aWMgTmV0d29yayBBZGFwdGVyIChFTkEpIGRldmljZSBkcml2ZXJzLgorIworCitvYmotJChDT05GSUdfRU5BX0VUSEVSTkVUKSArPSBlbmEubworCitlbmEteSA6PSBlbmFfbmV0ZGV2Lm8gZW5hX2NvbS5vIGVuYV9ldGhfY29tLm8gZW5hX2V0aHRvb2wubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfYWRtaW5fZGVmcy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfYWRtaW5fZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NmU3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9hZG1pbl9kZWZzLmgKQEAgLTAsMCArMSw5NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSAtIDIwMTYgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBfRU5BX0FETUlOX0hfCisjZGVmaW5lIF9FTkFfQURNSU5fSF8KKworZW51bSBlbmFfYWRtaW5fYXFfb3Bjb2RlIHsKKwlFTkFfQURNSU5fQ1JFQVRFX1NRCT0gMSwKKworCUVOQV9BRE1JTl9ERVNUUk9ZX1NRCT0gMiwKKworCUVOQV9BRE1JTl9DUkVBVEVfQ1EJPSAzLAorCisJRU5BX0FETUlOX0RFU1RST1lfQ1EJPSA0LAorCisJRU5BX0FETUlOX0dFVF9GRUFUVVJFCT0gOCwKKworCUVOQV9BRE1JTl9TRVRfRkVBVFVSRQk9IDksCisKKwlFTkFfQURNSU5fR0VUX1NUQVRTCT0gMTEsCit9OworCitlbnVtIGVuYV9hZG1pbl9hcV9jb21wbGV0aW9uX3N0YXR1cyB7CisJRU5BX0FETUlOX1NVQ0NFU1MJCQk9IDAsCisKKwlFTkFfQURNSU5fUkVTT1VSQ0VfQUxMT0NBVElPTl9GQUlMVVJFCT0gMSwKKworCUVOQV9BRE1JTl9CQURfT1BDT0RFCQkJPSAyLAorCisJRU5BX0FETUlOX1VOU1VQUE9SVEVEX09QQ09ERQkJPSAzLAorCisJRU5BX0FETUlOX01BTEZPUk1FRF9SRVFVRVNUCQk9IDQsCisKKwkvKiBBZGRpdGlvbmFsIHN0YXR1cyBpcyBwcm92aWRlZCBpbiBBQ1EgZW50cnkgZXh0ZW5kZWRfc3RhdHVzICovCisJRU5BX0FETUlOX0lMTEVHQUxfUEFSQU1FVEVSCQk9IDUsCisKKwlFTkFfQURNSU5fVU5LTk9XTl9FUlJPUgkJCT0gNiwKK307CisKK2VudW0gZW5hX2FkbWluX2FxX2ZlYXR1cmVfaWQgeworCUVOQV9BRE1JTl9ERVZJQ0VfQVRUUklCVVRFUwkJPSAxLAorCisJRU5BX0FETUlOX01BWF9RVUVVRVNfTlVNCQk9IDIsCisKKwlFTkFfQURNSU5fUlNTX0hBU0hfRlVOQ1RJT04JCT0gMTAsCisKKwlFTkFfQURNSU5fU1RBVEVMRVNTX09GRkxPQURfQ09ORklHCT0gMTEsCisKKwlFTkFfQURNSU5fUlNTX1JFRElSRUNUSU9OX1RBQkxFX0NPTkZJRwk9IDEyLAorCisJRU5BX0FETUlOX01UVQkJCQk9IDE0LAorCisJRU5BX0FETUlOX1JTU19IQVNIX0lOUFVUCQk9IDE4LAorCisJRU5BX0FETUlOX0lOVEVSUlVQVF9NT0RFUkFUSU9OCQk9IDIwLAorCisJRU5BX0FETUlOX0FFTlFfQ09ORklHCQkJPSAyNiwKKworCUVOQV9BRE1JTl9MSU5LX0NPTkZJRwkJCT0gMjcsCisKKwlFTkFfQURNSU5fSE9TVF9BVFRSX0NPTkZJRwkJPSAyOCwKKworCUVOQV9BRE1JTl9GRUFUVVJFU19PUENPREVfTlVNCQk9IDMyLAorfTsKKworZW51bSBlbmFfYWRtaW5fcGxhY2VtZW50X3BvbGljeV90eXBlIHsKKwkvKiBkZXNjcmlwdG9ycyBhbmQgaGVhZGVycyBhcmUgaW4gaG9zdCBtZW1vcnkgKi8KKwlFTkFfQURNSU5fUExBQ0VNRU5UX1BPTElDWV9IT1NUCT0gMSwKKworCS8qIGRlc2NyaXB0b3JzIGFuZCBoZWFkZXJzIGFyZSBpbiBkZXZpY2UgbWVtb3J5IChhLmsuYSBMb3cgTGF0ZW5jeQorCSAqIFF1ZXVlKQorCSAqLworCUVOQV9BRE1JTl9QTEFDRU1FTlRfUE9MSUNZX0RFVgk9IDMsCit9OworCitlbnVtIGVuYV9hZG1pbl9saW5rX3R5cGVzIHsKKwlFTkFfQURNSU5fTElOS19TUEVFRF8xRwkJPSAweDEsCisKKwlFTkFfQURNSU5fTElOS19TUEVFRF8yX0hBTEZfRwk9IDB4MiwKKworCUVOQV9BRE1JTl9MSU5LX1NQRUVEXzVHCQk9IDB4NCwKKworCUVOQV9BRE1JTl9MSU5LX1NQRUVEXzEwRwk9IDB4OCwKKworCUVOQV9BRE1JTl9MSU5LX1NQRUVEXzI1Rwk9IDB4MTAsCisKKwlFTkFfQURNSU5fTElOS19TUEVFRF80MEcJPSAweDIwLAorCisJRU5BX0FETUlOX0xJTktfU1BFRURfNTBHCT0gMHg0MCwKKworCUVOQV9BRE1JTl9MSU5LX1NQRUVEXzEwMEcJPSAweDgwLAorCisJRU5BX0FETUlOX0xJTktfU1BFRURfMjAwRwk9IDB4MTAwLAorCisJRU5BX0FETUlOX0xJTktfU1BFRURfNDAwRwk9IDB4MjAwLAorfTsKKworZW51bSBlbmFfYWRtaW5fY29tcGxldGlvbl9wb2xpY3lfdHlwZSB7CisJLyogY29tcGxldGlvbiBxdWV1ZSBlbnRyeSBmb3IgZWFjaCBzcSBkZXNjcmlwdG9yICovCisJRU5BX0FETUlOX0NPTVBMRVRJT05fUE9MSUNZX0RFU0MJCT0gMCwKKworCS8qIGNvbXBsZXRpb24gcXVldWUgZW50cnkgdXBvbiByZXF1ZXN0IGluIHNxIGRlc2NyaXB0b3IgKi8KKwlFTkFfQURNSU5fQ09NUExFVElPTl9QT0xJQ1lfREVTQ19PTl9ERU1BTkQJPSAxLAorCisJLyogY3VycmVudCBxdWV1ZSBoZWFkIHBvaW50ZXIgaXMgdXBkYXRlZCBpbiBPUyBtZW1vcnkgdXBvbiBzcQorCSAqIGRlc2NyaXB0b3IgcmVxdWVzdAorCSAqLworCUVOQV9BRE1JTl9DT01QTEVUSU9OX1BPTElDWV9IRUFEX09OX0RFTUFORAk9IDIsCisKKwkvKiBjdXJyZW50IHF1ZXVlIGhlYWQgcG9pbnRlciBpcyB1cGRhdGVkIGluIE9TIG1lbW9yeSBmb3IgZWFjaCBzcQorCSAqIGRlc2NyaXB0b3IKKwkgKi8KKwlFTkFfQURNSU5fQ09NUExFVElPTl9QT0xJQ1lfSEVBRAkJPSAzLAorfTsKKworLyogYmFzaWMgc3RhdHMgcmV0dXJuIGVuYV9hZG1pbl9iYXNpY19zdGF0cyB3aGlsZSBleHRhbmRlZCBzdGF0cyByZXR1cm4gYQorICogYnVmZmVyIChzdHJpbmcgZm9ybWF0KSB3aXRoIGFkZGl0aW9uYWwgc3RhdGlzdGljcyBwZXIgcXVldWUgYW5kIHBlcgorICogZGV2aWNlIGlkCisgKi8KK2VudW0gZW5hX2FkbWluX2dldF9zdGF0c190eXBlIHsKKwlFTkFfQURNSU5fR0VUX1NUQVRTX1RZUEVfQkFTSUMJCT0gMCwKKworCUVOQV9BRE1JTl9HRVRfU1RBVFNfVFlQRV9FWFRFTkRFRAk9IDEsCit9OworCitlbnVtIGVuYV9hZG1pbl9nZXRfc3RhdHNfc2NvcGUgeworCUVOQV9BRE1JTl9TUEVDSUZJQ19RVUVVRQk9IDAsCisKKwlFTkFfQURNSU5fRVRIX1RSQUZGSUMJCT0gMSwKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fYXFfY29tbW9uX2Rlc2MgeworCS8qIDExOjAgOiBjb21tYW5kX2lkCisJICogMTU6MTIgOiByZXNlcnZlZDEyCisJICovCisJdTE2IGNvbW1hbmRfaWQ7CisKKwkvKiBhcyBhcHBlYXJzIGluIGVuYV9hZG1pbl9hcV9vcGNvZGUgKi8KKwl1OCBvcGNvZGU7CisKKwkvKiAwIDogcGhhc2UKKwkgKiAxIDogY3RybF9kYXRhIC0gY29udHJvbCBidWZmZXIgYWRkcmVzcyB2YWxpZAorCSAqIDIgOiBjdHJsX2RhdGFfaW5kaXJlY3QgLSBjb250cm9sIGJ1ZmZlciBhZGRyZXNzCisJICogICAgcG9pbnRzIHRvIGxpc3Qgb2YgcGFnZXMgd2l0aCBhZGRyZXNzZXMgb2YgY29udHJvbAorCSAqICAgIGJ1ZmZlcnMKKwkgKiA3OjMgOiByZXNlcnZlZDMKKwkgKi8KKwl1OCBmbGFnczsKK307CisKKy8qIHVzZWQgaW4gZW5hX2FkbWluX2FxX2VudHJ5LiBDYW4gcG9pbnQgZGlyZWN0bHkgdG8gY29udHJvbCBkYXRhLCBvciB0byBhCisgKiBwYWdlIGxpc3QgY2h1bmsuIFVzZWQgYWxzbyBhdCB0aGUgZW5kIG9mIGluZGlyZWN0IG1vZGUgcGFnZSBsaXN0IGNodW5rcywKKyAqIGZvciBjaGFpbmluZy4KKyAqLworc3RydWN0IGVuYV9hZG1pbl9jdHJsX2J1ZmZfaW5mbyB7CisJdTMyIGxlbmd0aDsKKworCXN0cnVjdCBlbmFfY29tbW9uX21lbV9hZGRyIGFkZHJlc3M7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX3NxIHsKKwl1MTYgc3FfaWR4OworCisJLyogNDowIDogcmVzZXJ2ZWQKKwkgKiA3OjUgOiBzcV9kaXJlY3Rpb24gLSAweDEgLSBUeDsgMHgyIC0gUngKKwkgKi8KKwl1OCBzcV9pZGVudGl0eTsKKworCXU4IHJlc2VydmVkMTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgeworCXN0cnVjdCBlbmFfYWRtaW5fYXFfY29tbW9uX2Rlc2MgYXFfY29tbW9uX2Rlc2NyaXB0b3I7CisKKwl1bmlvbiB7CisJCXUzMiBpbmxpbmVfZGF0YV93MVszXTsKKworCQlzdHJ1Y3QgZW5hX2FkbWluX2N0cmxfYnVmZl9pbmZvIGNvbnRyb2xfYnVmZmVyOworCX0gdTsKKworCXUzMiBpbmxpbmVfZGF0YV93NFsxMl07Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2FjcV9jb21tb25fZGVzYyB7CisJLyogY29tbWFuZCBpZGVudGlmaWVyIHRvIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBhcSBkZXNjcmlwdG9yCisJICogMTE6MCA6IGNvbW1hbmRfaWQKKwkgKiAxNToxMiA6IHJlc2VydmVkMTIKKwkgKi8KKwl1MTYgY29tbWFuZDsKKworCXU4IHN0YXR1czsKKworCS8qIDAgOiBwaGFzZQorCSAqIDc6MSA6IHJlc2VydmVkMQorCSAqLworCXU4IGZsYWdzOworCisJdTE2IGV4dGVuZGVkX3N0YXR1czsKKworCS8qIHNlcnZlcyBhcyBhIGhpbnQgd2hhdCBBUSBlbnRyaWVzIGNhbiBiZSByZXZva2VkICovCisJdTE2IHNxX2hlYWRfaW5keDsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5IHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FjcV9jb21tb25fZGVzYyBhY3FfY29tbW9uX2Rlc2NyaXB0b3I7CisKKwl1MzIgcmVzcG9uc2Vfc3BlY2lmaWNfZGF0YVsxNF07Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2FxX2NyZWF0ZV9zcV9jbWQgeworCXN0cnVjdCBlbmFfYWRtaW5fYXFfY29tbW9uX2Rlc2MgYXFfY29tbW9uX2Rlc2NyaXB0b3I7CisKKwkvKiA0OjAgOiByZXNlcnZlZDBfdzEKKwkgKiA3OjUgOiBzcV9kaXJlY3Rpb24gLSAweDEgLSBUeCwgMHgyIC0gUngKKwkgKi8KKwl1OCBzcV9pZGVudGl0eTsKKworCXU4IHJlc2VydmVkOF93MTsKKworCS8qIDM6MCA6IHBsYWNlbWVudF9wb2xpY3kgLSBEZXNjcmliaW5nIHdoZXJlIHRoZSBTUQorCSAqICAgIGRlc2NyaXB0b3IgcmluZyBhbmQgdGhlIFNRIHBhY2tldCBoZWFkZXJzIHJlc2lkZToKKwkgKiAgICAweDEgLSBkZXNjcmlwdG9ycyBhbmQgaGVhZGVycyBhcmUgaW4gT1MgbWVtb3J5LAorCSAqICAgIDB4MyAtIGRlc2NyaXB0b3JzIGFuZCBoZWFkZXJzIGluIGRldmljZSBtZW1vcnkKKwkgKiAgICAoYS5rLmEgTG93IExhdGVuY3kgUXVldWUpCisJICogNjo0IDogY29tcGxldGlvbl9wb2xpY3kgLSBEZXNjcmliaW5nIHdoYXQgcG9saWN5CisJICogICAgdG8gdXNlIGZvciBnZW5lcmF0aW9uIGNvbXBsZXRpb24gZW50cnkgKGNxZSkgaW4KKwkgKiAgICB0aGUgQ1EgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU1E6IDB4MCAtIGNxZSBmb3IgZWFjaAorCSAqICAgIHNxIGRlc2NyaXB0b3IsIDB4MSAtIGNxZSB1cG9uIHJlcXVlc3QgaW4gc3EKKwkgKiAgICBkZXNjcmlwdG9yLCAweDIgLSBjdXJyZW50IHF1ZXVlIGhlYWQgcG9pbnRlciBpcworCSAqICAgIHVwZGF0ZWQgaW4gT1MgbWVtb3J5IHVwb24gc3EgZGVzY3JpcHRvciByZXF1ZXN0CisJICogICAgMHgzIC0gY3VycmVudCBxdWV1ZSBoZWFkIHBvaW50ZXIgaXMgdXBkYXRlZCBpbiBPUworCSAqICAgIG1lbW9yeSBmb3IgZWFjaCBzcSBkZXNjcmlwdG9yCisJICogNyA6IHJlc2VydmVkMTVfdzEKKwkgKi8KKwl1OCBzcV9jYXBzXzI7CisKKwkvKiAwIDogaXNfcGh5c2ljYWxseV9jb250aWd1b3VzIC0gRGVzY3JpYmVkIGlmIHRoZQorCSAqICAgIHF1ZXVlIHJpbmcgbWVtb3J5IGlzIGFsbG9jYXRlZCBpbiBwaHlzaWNhbAorCSAqICAgIGNvbnRpZ3VvdXMgcGFnZXMgb3Igc3BsaXQuCisJICogNzoxIDogcmVzZXJ2ZWQxN193MQorCSAqLworCXU4IHNxX2NhcHNfMzsKKworCS8qIGFzc29jaWF0ZWQgY29tcGxldGlvbiBxdWV1ZSBpZC4gVGhpcyBDUSBtdXN0IGJlIGNyZWF0ZWQgcHJpb3IgdG8KKwkgKiAgICBTUSBjcmVhdGlvbgorCSAqLworCXUxNiBjcV9pZHg7CisKKwkvKiBzdWJtaXNzaW9uIHF1ZXVlIGRlcHRoIGluIGVudHJpZXMgKi8KKwl1MTYgc3FfZGVwdGg7CisKKwkvKiBTUSBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgaW4gT1MgbWVtb3J5LiBUaGlzIGZpZWxkIHNob3VsZCBub3QgYmUKKwkgKiB1c2VkIGZvciBMb3cgTGF0ZW5jeSBxdWV1ZXMuIEhhcyB0byBiZSBwYWdlIGFsaWduZWQuCisJICovCisJc3RydWN0IGVuYV9jb21tb25fbWVtX2FkZHIgc3FfYmE7CisKKwkvKiBzcGVjaWZpZXMgcXVldWUgaGVhZCB3cml0ZWJhY2sgbG9jYXRpb24gaW4gT1MgbWVtb3J5LiBWYWxpZCBpZgorCSAqIGNvbXBsZXRpb25fcG9saWN5IGlzIHNldCB0byBjb21wbGV0aW9uX3BvbGljeV9oZWFkX29uX2RlbWFuZCBvcgorCSAqIGNvbXBsZXRpb25fcG9saWN5X2hlYWQuIEhhcyB0byBiZSBjYWNoZSBhbGlnbmVkCisJICovCisJc3RydWN0IGVuYV9jb21tb25fbWVtX2FkZHIgc3FfaGVhZF93cml0ZWJhY2s7CisKKwl1MzIgcmVzZXJ2ZWQwX3c3OworCisJdTMyIHJlc2VydmVkMF93ODsKK307CisKK2VudW0gZW5hX2FkbWluX3NxX2RpcmVjdGlvbiB7CisJRU5BX0FETUlOX1NRX0RJUkVDVElPTl9UWAk9IDEsCisKKwlFTkFfQURNSU5fU1FfRElSRUNUSU9OX1JYCT0gMiwKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fYWNxX2NyZWF0ZV9zcV9yZXNwX2Rlc2MgeworCXN0cnVjdCBlbmFfYWRtaW5fYWNxX2NvbW1vbl9kZXNjIGFjcV9jb21tb25fZGVzYzsKKworCXUxNiBzcV9pZHg7CisKKwl1MTYgcmVzZXJ2ZWQ7CisKKwkvKiBxdWV1ZSBkb29yYmVsbCBhZGRyZXNzIGFzIGFuIG9mZnNldCB0byBQQ0llIE1NSU8gUkVHIEJBUiAqLworCXUzMiBzcV9kb29yYmVsbF9vZmZzZXQ7CisKKwkvKiBsb3cgbGF0ZW5jeSBxdWV1ZSByaW5nIGJhc2UgYWRkcmVzcyBhcyBhbiBvZmZzZXQgdG8gUENJZSBNTUlPCisJICogTExRX01FTSBCQVIKKwkgKi8KKwl1MzIgbGxxX2Rlc2NyaXB0b3JzX29mZnNldDsKKworCS8qIGxvdyBsYXRlbmN5IHF1ZXVlIGhlYWRlcnMnIG1lbW9yeSBhcyBhbiBvZmZzZXQgdG8gUENJZSBNTUlPCisJICogTExRX01FTSBCQVIKKwkgKi8KKwl1MzIgbGxxX2hlYWRlcnNfb2Zmc2V0OworfTsKKworc3RydWN0IGVuYV9hZG1pbl9hcV9kZXN0cm95X3NxX2NtZCB7CisJc3RydWN0IGVuYV9hZG1pbl9hcV9jb21tb25fZGVzYyBhcV9jb21tb25fZGVzY3JpcHRvcjsKKworCXN0cnVjdCBlbmFfYWRtaW5fc3Egc3E7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2FjcV9kZXN0cm95X3NxX3Jlc3BfZGVzYyB7CisJc3RydWN0IGVuYV9hZG1pbl9hY3FfY29tbW9uX2Rlc2MgYWNxX2NvbW1vbl9kZXNjOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9hcV9jcmVhdGVfY3FfY21kIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FxX2NvbW1vbl9kZXNjIGFxX2NvbW1vbl9kZXNjcmlwdG9yOworCisJLyogNDowIDogcmVzZXJ2ZWQ1CisJICogNSA6IGludGVycnVwdF9tb2RlX2VuYWJsZWQgLSBpZiBzZXQsIGNxIG9wZXJhdGVzCisJICogICAgaW4gaW50ZXJydXB0IG1vZGUsIG90aGVyd2lzZSAtIHBvbGxpbmcKKwkgKiA3OjYgOiByZXNlcnZlZDYKKwkgKi8KKwl1OCBjcV9jYXBzXzE7CisKKwkvKiA0OjAgOiBjcV9lbnRyeV9zaXplX3dvcmRzIC0gc2l6ZSBvZiBDUSBlbnRyeSBpbgorCSAqICAgIDMyLWJpdCB3b3JkcywgdmFsaWQgdmFsdWVzOiA0LCA4LgorCSAqIDc6NSA6IHJlc2VydmVkNworCSAqLworCXU4IGNxX2NhcHNfMjsKKworCS8qIGNvbXBsZXRpb24gcXVldWUgZGVwdGggaW4gIyBvZiBlbnRyaWVzLiBtdXN0IGJlIHBvd2VyIG9mIDIgKi8KKwl1MTYgY3FfZGVwdGg7CisKKwkvKiBtc2l4IHZlY3RvciBhc3NpZ25lZCB0byB0aGlzIGNxICovCisJdTMyIG1zaXhfdmVjdG9yOworCisJLyogY3EgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIGluIE9TIG1lbW9yeS4gQ1EgbXVzdCBiZSBwaHlzaWNhbGx5CisJICogY29udGlndW91cworCSAqLworCXN0cnVjdCBlbmFfY29tbW9uX21lbV9hZGRyIGNxX2JhOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9hY3FfY3JlYXRlX2NxX3Jlc3BfZGVzYyB7CisJc3RydWN0IGVuYV9hZG1pbl9hY3FfY29tbW9uX2Rlc2MgYWNxX2NvbW1vbl9kZXNjOworCisJdTE2IGNxX2lkeDsKKworCS8qIGFjdHVhbCBjcSBkZXB0aCBpbiBudW1iZXIgb2YgZW50cmllcyAqLworCXUxNiBjcV9hY3R1YWxfZGVwdGg7CisKKwl1MzIgbnVtYV9ub2RlX3JlZ2lzdGVyX29mZnNldDsKKworCXUzMiBjcV9oZWFkX2RiX3JlZ2lzdGVyX29mZnNldDsKKworCXUzMiBjcV9pbnRlcnJ1cHRfdW5tYXNrX3JlZ2lzdGVyX29mZnNldDsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fYXFfZGVzdHJveV9jcV9jbWQgeworCXN0cnVjdCBlbmFfYWRtaW5fYXFfY29tbW9uX2Rlc2MgYXFfY29tbW9uX2Rlc2NyaXB0b3I7CisKKwl1MTYgY3FfaWR4OworCisJdTE2IHJlc2VydmVkMTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fYWNxX2Rlc3Ryb3lfY3FfcmVzcF9kZXNjIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FjcV9jb21tb25fZGVzYyBhY3FfY29tbW9uX2Rlc2M7Cit9OworCisvKiBFTkEgQVEgR2V0IFN0YXRpc3RpY3MgY29tbWFuZC4gRXh0ZW5kZWQgc3RhdGlzdGljcyBhcmUgcGxhY2VkIGluIGNvbnRyb2wKKyAqIGJ1ZmZlciBwb2ludGVkIGJ5IEFRIGVudHJ5CisgKi8KK3N0cnVjdCBlbmFfYWRtaW5fYXFfZ2V0X3N0YXRzX2NtZCB7CisJc3RydWN0IGVuYV9hZG1pbl9hcV9jb21tb25fZGVzYyBhcV9jb21tb25fZGVzY3JpcHRvcjsKKworCXVuaW9uIHsKKwkJLyogY29tbWFuZCBzcGVjaWZpYyBpbmxpbmUgZGF0YSAqLworCQl1MzIgaW5saW5lX2RhdGFfdzFbM107CisKKwkJc3RydWN0IGVuYV9hZG1pbl9jdHJsX2J1ZmZfaW5mbyBjb250cm9sX2J1ZmZlcjsKKwl9IHU7CisKKwkvKiBzdGF0cyB0eXBlIGFzIGRlZmluZWQgaW4gZW51bSBlbmFfYWRtaW5fZ2V0X3N0YXRzX3R5cGUgKi8KKwl1OCB0eXBlOworCisJLyogc3RhdHMgc2NvcGUgZGVmaW5lZCBpbiBlbnVtIGVuYV9hZG1pbl9nZXRfc3RhdHNfc2NvcGUgKi8KKwl1OCBzY29wZTsKKworCXUxNiByZXNlcnZlZDM7CisKKwkvKiBxdWV1ZSBpZC4gdXNlZCB3aGVuIHNjb3BlIGlzIHNwZWNpZmljX3F1ZXVlICovCisJdTE2IHF1ZXVlX2lkeDsKKworCS8qIGRldmljZSBpZCwgdmFsdWUgMHhGRkZGIG1lYW5zIG1pbmUuIG9ubHkgcHJpdmlsZWdlZCBkZXZpY2UgY2FuIGdldAorCSAqICAgIHN0YXRzIG9mIG90aGVyIGRldmljZQorCSAqLworCXUxNiBkZXZpY2VfaWQ7Cit9OworCisvKiBCYXNpYyBTdGF0aXN0aWNzIENvbW1hbmQuICovCitzdHJ1Y3QgZW5hX2FkbWluX2Jhc2ljX3N0YXRzIHsKKwl1MzIgdHhfYnl0ZXNfbG93OworCisJdTMyIHR4X2J5dGVzX2hpZ2g7CisKKwl1MzIgdHhfcGt0c19sb3c7CisKKwl1MzIgdHhfcGt0c19oaWdoOworCisJdTMyIHJ4X2J5dGVzX2xvdzsKKworCXUzMiByeF9ieXRlc19oaWdoOworCisJdTMyIHJ4X3BrdHNfbG93OworCisJdTMyIHJ4X3BrdHNfaGlnaDsKKworCXUzMiByeF9kcm9wc19sb3c7CisKKwl1MzIgcnhfZHJvcHNfaGlnaDsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fYWNxX2dldF9zdGF0c19yZXNwIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FjcV9jb21tb25fZGVzYyBhY3FfY29tbW9uX2Rlc2M7CisKKwlzdHJ1Y3QgZW5hX2FkbWluX2Jhc2ljX3N0YXRzIGJhc2ljX3N0YXRzOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9nZXRfc2V0X2ZlYXR1cmVfY29tbW9uX2Rlc2MgeworCS8qIDE6MCA6IHNlbGVjdCAtIDB4MSAtIGN1cnJlbnQgdmFsdWU7IDB4MyAtIGRlZmF1bHQKKwkgKiAgICB2YWx1ZQorCSAqIDc6MyA6IHJlc2VydmVkMworCSAqLworCXU4IGZsYWdzOworCisJLyogYXMgYXBwZWFycyBpbiBlbmFfYWRtaW5fYXFfZmVhdHVyZV9pZCAqLworCXU4IGZlYXR1cmVfaWQ7CisKKwl1MTYgcmVzZXJ2ZWQxNjsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fZGV2aWNlX2F0dHJfZmVhdHVyZV9kZXNjIHsKKwl1MzIgaW1wbF9pZDsKKworCXUzMiBkZXZpY2VfdmVyc2lvbjsKKworCS8qIGJpdG1hcCBvZiBlbmFfYWRtaW5fYXFfZmVhdHVyZV9pZCAqLworCXUzMiBzdXBwb3J0ZWRfZmVhdHVyZXM7CisKKwl1MzIgcmVzZXJ2ZWQzOworCisJLyogSW5kaWNhdGVzIGhvdyBtYW55IGJpdHMgYXJlIHVzZWQgcGh5c2ljYWwgYWRkcmVzcyBhY2Nlc3MuICovCisJdTMyIHBoeXNfYWRkcl93aWR0aDsKKworCS8qIEluZGljYXRlcyBob3cgbWFueSBiaXRzIGFyZSB1c2VkIHZpcnR1YWwgYWRkcmVzcyBhY2Nlc3MuICovCisJdTMyIHZpcnRfYWRkcl93aWR0aDsKKworCS8qIHVuaWNhc3QgTUFDIGFkZHJlc3MgKGluIE5ldHdvcmsgYnl0ZSBvcmRlcikgKi8KKwl1OCBtYWNfYWRkcls2XTsKKworCXU4IHJlc2VydmVkN1syXTsKKworCXUzMiBtYXhfbXR1OworfTsKKworc3RydWN0IGVuYV9hZG1pbl9xdWV1ZV9mZWF0dXJlX2Rlc2MgeworCS8qIGluY2x1ZGluZyBMTFFzICovCisJdTMyIG1heF9zcV9udW07CisKKwl1MzIgbWF4X3NxX2RlcHRoOworCisJdTMyIG1heF9jcV9udW07CisKKwl1MzIgbWF4X2NxX2RlcHRoOworCisJdTMyIG1heF9sbHFfbnVtOworCisJdTMyIG1heF9sbHFfZGVwdGg7CisKKwl1MzIgbWF4X2hlYWRlcl9zaXplOworCisJLyogTWF4aW11bSBEZXNjcmlwdG9ycyBudW1iZXIsIGluY2x1ZGluZyBtZXRhIGRlc2NyaXB0b3IsIGFsbG93ZWQgZm9yCisJICogICAgYSBzaW5nbGUgVHggcGFja2V0CisJICovCisJdTE2IG1heF9wYWNrZXRfdHhfZGVzY3M7CisKKwkvKiBNYXhpbXVtIERlc2NyaXB0b3JzIG51bWJlciBhbGxvd2VkIGZvciBhIHNpbmdsZSBSeCBwYWNrZXQgKi8KKwl1MTYgbWF4X3BhY2tldF9yeF9kZXNjczsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXR1cmVfbXR1X2Rlc2MgeworCS8qIGV4Y2x1ZGUgTDIgKi8KKwl1MzIgbXR1OworfTsKKworc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdHVyZV9ob3N0X2F0dHJfZGVzYyB7CisJLyogaG9zdCBPUyBpbmZvIGJhc2UgYWRkcmVzcyBpbiBPUyBtZW1vcnkuIGhvc3QgaW5mbyBpcyA0S0Igb2YKKwkgKiBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMKKwkgKi8KKwlzdHJ1Y3QgZW5hX2NvbW1vbl9tZW1fYWRkciBvc19pbmZvX2JhOworCisJLyogaG9zdCBkZWJ1ZyBhcmVhIGJhc2UgYWRkcmVzcyBpbiBPUyBtZW1vcnkuIGRlYnVnIGFyZWEgbXVzdCBiZQorCSAqIHBoeXNpY2FsbHkgY29udGlndW91cworCSAqLworCXN0cnVjdCBlbmFfY29tbW9uX21lbV9hZGRyIGRlYnVnX2JhOworCisJLyogZGVidWcgYXJlYSBzaXplICovCisJdTMyIGRlYnVnX2FyZWFfc2l6ZTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9pbnRyX21vZGVyX2Rlc2MgeworCS8qIGludGVycnVwdCBkZWxheSBncmFudWxhcml0eSBpbiB1c2VjICovCisJdTE2IGludHJfZGVsYXlfcmVzb2x1dGlvbjsKKworCXUxNiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXR1cmVfbGlua19kZXNjIHsKKwkvKiBMaW5rIHNwZWVkIGluIE1iICovCisJdTMyIHNwZWVkOworCisJLyogYml0IGZpZWxkIG9mIGVudW0gZW5hX2FkbWluX2xpbmsgdHlwZXMgKi8KKwl1MzIgc3VwcG9ydGVkOworCisJLyogMCA6IGF1dG9uZWcKKwkgKiAxIDogZHVwbGV4IC0gRnVsbCBEdXBsZXgKKwkgKiAzMToyIDogcmVzZXJ2ZWQyCisJICovCisJdTMyIGZsYWdzOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX2FlbnFfZGVzYyB7CisJLyogYml0bWFzayBmb3IgQUVOUSBncm91cHMgdGhlIGRldmljZSBjYW4gcmVwb3J0ICovCisJdTMyIHN1cHBvcnRlZF9ncm91cHM7CisKKwkvKiBiaXRtYXNrIGZvciBBRU5RIGdyb3VwcyB0byByZXBvcnQgKi8KKwl1MzIgZW5hYmxlZF9ncm91cHM7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfb2ZmbG9hZF9kZXNjIHsKKwkvKiAwIDogVFhfTDNfY3N1bV9pcHY0CisJICogMSA6IFRYX0w0X2lwdjRfY3N1bV9wYXJ0IC0gVGhlIGNoZWNrc3VtIGZpZWxkCisJICogICAgc2hvdWxkIGJlIGluaXRpYWxpemVkIHdpdGggcHNldWRvIGhlYWRlciBjaGVja3N1bQorCSAqIDIgOiBUWF9MNF9pcHY0X2NzdW1fZnVsbAorCSAqIDMgOiBUWF9MNF9pcHY2X2NzdW1fcGFydCAtIFRoZSBjaGVja3N1bSBmaWVsZAorCSAqICAgIHNob3VsZCBiZSBpbml0aWFsaXplZCB3aXRoIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0KKwkgKiA0IDogVFhfTDRfaXB2Nl9jc3VtX2Z1bGwKKwkgKiA1IDogdHNvX2lwdjQKKwkgKiA2IDogdHNvX2lwdjYKKwkgKiA3IDogdHNvX2VjbgorCSAqLworCXUzMiB0eDsKKworCS8qIFJlY2VpdmUgc2lkZSBzdXBwb3J0ZWQgc3RhdGVsZXNzIG9mZmxvYWQKKwkgKiAwIDogUlhfTDNfY3N1bV9pcHY0IC0gSVB2NCBjaGVja3N1bQorCSAqIDEgOiBSWF9MNF9pcHY0X2NzdW0gLSBUQ1AvVURQL0lQdjQgY2hlY2tzdW0KKwkgKiAyIDogUlhfTDRfaXB2Nl9jc3VtIC0gVENQL1VEUC9JUHY2IGNoZWNrc3VtCisJICogMyA6IFJYX2hhc2ggLSBIYXNoIGNhbGN1bGF0aW9uCisJICovCisJdTMyIHJ4X3N1cHBvcnRlZDsKKworCXUzMiByeF9lbmFibGVkOworfTsKKworZW51bSBlbmFfYWRtaW5faGFzaF9mdW5jdGlvbnMgeworCUVOQV9BRE1JTl9UT0VQTElUWgk9IDEsCisKKwlFTkFfQURNSU5fQ1JDMzIJCT0gMiwKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfZmxvd19oYXNoX2NvbnRyb2wgeworCXUzMiBrZXlzX251bTsKKworCXUzMiByZXNlcnZlZDsKKworCXUzMiBrZXlbMTBdOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19mbG93X2hhc2hfZnVuY3Rpb24geworCS8qIDc6MCA6IGZ1bmNzIC0gYml0bWFzayBvZiBlbmFfYWRtaW5faGFzaF9mdW5jdGlvbnMgKi8KKwl1MzIgc3VwcG9ydGVkX2Z1bmM7CisKKwkvKiA3OjAgOiBzZWxlY3RlZF9mdW5jIC0gYml0bWFzayBvZgorCSAqICAgIGVuYV9hZG1pbl9oYXNoX2Z1bmN0aW9ucworCSAqLworCXUzMiBzZWxlY3RlZF9mdW5jOworCisJLyogaW5pdGlhbCB2YWx1ZSAqLworCXUzMiBpbml0X3ZhbDsKK307CisKKy8qIFJTUyBmbG93IGhhc2ggcHJvdG9jb2xzICovCitlbnVtIGVuYV9hZG1pbl9mbG93X2hhc2hfcHJvdG8geworCUVOQV9BRE1JTl9SU1NfVENQNAk9IDAsCisKKwlFTkFfQURNSU5fUlNTX1VEUDQJPSAxLAorCisJRU5BX0FETUlOX1JTU19UQ1A2CT0gMiwKKworCUVOQV9BRE1JTl9SU1NfVURQNgk9IDMsCisKKwlFTkFfQURNSU5fUlNTX0lQNAk9IDQsCisKKwlFTkFfQURNSU5fUlNTX0lQNgk9IDUsCisKKwlFTkFfQURNSU5fUlNTX0lQNF9GUkFHCT0gNiwKKworCUVOQV9BRE1JTl9SU1NfTk9UX0lQCT0gNywKKworCUVOQV9BRE1JTl9SU1NfUFJPVE9fTlVNCT0gMTYsCit9OworCisvKiBSU1MgZmxvdyBoYXNoIGZpZWxkcyAqLworZW51bSBlbmFfYWRtaW5fZmxvd19oYXNoX2ZpZWxkcyB7CisJLyogRXRoZXJuZXQgRGVzdCBBZGRyICovCisJRU5BX0FETUlOX1JTU19MMl9EQQk9IDAsCisKKwkvKiBFdGhlcm5ldCBTcmMgQWRkciAqLworCUVOQV9BRE1JTl9SU1NfTDJfU0EJPSAxLAorCisJLyogaXB2NC82IERlc3QgQWRkciAqLworCUVOQV9BRE1JTl9SU1NfTDNfREEJPSAyLAorCisJLyogaXB2NC82IFNyYyBBZGRyICovCisJRU5BX0FETUlOX1JTU19MM19TQQk9IDUsCisKKwkvKiB0Y3AvdWRwIERlc3QgUG9ydCAqLworCUVOQV9BRE1JTl9SU1NfTDRfRFAJPSA2LAorCisJLyogdGNwL3VkcCBTcmMgUG9ydCAqLworCUVOQV9BRE1JTl9SU1NfTDRfU1AJPSA3LAorfTsKKworc3RydWN0IGVuYV9hZG1pbl9wcm90b19pbnB1dCB7CisJLyogZmxvdyBoYXNoIGZpZWxkcyAoYml0d2lzZSBhY2NvcmRpbmcgdG8gZW5hX2FkbWluX2Zsb3dfaGFzaF9maWVsZHMpICovCisJdTE2IGZpZWxkczsKKworCXUxNiByZXNlcnZlZDI7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2hhc2hfY29udHJvbCB7CisJc3RydWN0IGVuYV9hZG1pbl9wcm90b19pbnB1dCBzdXBwb3J0ZWRfZmllbGRzW0VOQV9BRE1JTl9SU1NfUFJPVE9fTlVNXTsKKworCXN0cnVjdCBlbmFfYWRtaW5fcHJvdG9faW5wdXQgc2VsZWN0ZWRfZmllbGRzW0VOQV9BRE1JTl9SU1NfUFJPVE9fTlVNXTsKKworCXN0cnVjdCBlbmFfYWRtaW5fcHJvdG9faW5wdXQgcmVzZXJ2ZWQyW0VOQV9BRE1JTl9SU1NfUFJPVE9fTlVNXTsKKworCXN0cnVjdCBlbmFfYWRtaW5fcHJvdG9faW5wdXQgcmVzZXJ2ZWQzW0VOQV9BRE1JTl9SU1NfUFJPVE9fTlVNXTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfZmxvd19oYXNoX2lucHV0IHsKKwkvKiBzdXBwb3J0ZWQgaGFzaCBpbnB1dCBzb3J0aW5nCisJICogMSA6IEwzX3NvcnQgLSBzdXBwb3J0IHN3YXAgTDMgYWRkcmVzc2VzIGlmIERBIGlzCisJICogICAgc21hbGxlciB0aGFuIFNBCisJICogMiA6IEw0X3NvcnQgLSBzdXBwb3J0IHN3YXAgTDQgcG9ydHMgaWYgRFAgc21hbGxlcgorCSAqICAgIFNQCisJICovCisJdTE2IHN1cHBvcnRlZF9pbnB1dF9zb3J0OworCisJLyogZW5hYmxlZCBoYXNoIGlucHV0IHNvcnRpbmcKKwkgKiAxIDogZW5hYmxlX0wzX3NvcnQgLSBlbmFibGUgc3dhcCBMMyBhZGRyZXNzZXMgaWYKKwkgKiAgICBEQSBzbWFsbGVyIHRoYW4gU0EKKwkgKiAyIDogZW5hYmxlX0w0X3NvcnQgLSBlbmFibGUgc3dhcCBMNCBwb3J0cyBpZiBEUAorCSAqICAgIHNtYWxsZXIgdGhhbiBTUAorCSAqLworCXUxNiBlbmFibGVkX2lucHV0X3NvcnQ7Cit9OworCitlbnVtIGVuYV9hZG1pbl9vc190eXBlIHsKKwlFTkFfQURNSU5fT1NfTElOVVgJPSAxLAorCisJRU5BX0FETUlOX09TX1dJTgk9IDIsCisKKwlFTkFfQURNSU5fT1NfRFBESwk9IDMsCisKKwlFTkFfQURNSU5fT1NfRlJFRUJTRAk9IDQsCisKKwlFTkFfQURNSU5fT1NfSVBYRQk9IDUsCit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2hvc3RfaW5mbyB7CisJLyogZGVmaW5lZCBpbiBlbnVtIGVuYV9hZG1pbl9vc190eXBlICovCisJdTMyIG9zX3R5cGU7CisKKwkvKiBvcyBkaXN0cmlidXRpb24gc3RyaW5nIGZvcm1hdCAqLworCXU4IG9zX2Rpc3Rfc3RyWzEyOF07CisKKwkvKiBPUyBkaXN0cmlidXRpb24gbnVtZXJpYyBmb3JtYXQgKi8KKwl1MzIgb3NfZGlzdDsKKworCS8qIGtlcm5lbCB2ZXJzaW9uIHN0cmluZyBmb3JtYXQgKi8KKwl1OCBrZXJuZWxfdmVyX3N0clszMl07CisKKwkvKiBLZXJuZWwgdmVyc2lvbiBudW1lcmljIGZvcm1hdCAqLworCXUzMiBrZXJuZWxfdmVyOworCisJLyogNzowIDogbWFqb3IKKwkgKiAxNTo4IDogbWlub3IKKwkgKiAyMzoxNiA6IHN1Yl9taW5vcgorCSAqLworCXUzMiBkcml2ZXJfdmVyc2lvbjsKKworCS8qIGZlYXR1cmVzIGJpdG1hcCAqLworCXUzMiBzdXBwb3J0ZWRfbmV0d29ya19mZWF0dXJlc1s0XTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fcnNzX2luZF90YWJsZV9lbnRyeSB7CisJdTE2IGNxX2lkeDsKKworCXUxNiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfaW5kX3RhYmxlIHsKKwkvKiBtaW4gc3VwcG9ydGVkIHRhYmxlIHNpemUgKDJebWluX3NpemUpICovCisJdTE2IG1pbl9zaXplOworCisJLyogbWF4IHN1cHBvcnRlZCB0YWJsZSBzaXplICgyXm1heF9zaXplKSAqLworCXUxNiBtYXhfc2l6ZTsKKworCS8qIHRhYmxlIHNpemUgKDJec2l6ZSkgKi8KKwl1MTYgc2l6ZTsKKworCXUxNiByZXNlcnZlZDsKKworCS8qIGluZGV4IG9mIHRoZSBpbmxpbmUgZW50cnkuIDB4RkZGRkZGRkYgbWVhbnMgaW52YWxpZCAqLworCXUzMiBpbmxpbmVfaW5kZXg7CisKKwkvKiB1c2VkIGZvciB1cGRhdGluZyBzaW5nbGUgZW50cnksIGlnbm9yZWQgd2hlbiBzZXR0aW5nIHRoZSBlbnRpcmUKKwkgKiB0YWJsZSB0aHJvdWdoIHRoZSBjb250cm9sIGJ1ZmZlci4KKwkgKi8KKwlzdHJ1Y3QgZW5hX2FkbWluX3Jzc19pbmRfdGFibGVfZW50cnkgaW5saW5lX2VudHJ5OworfTsKKworc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9jbWQgeworCXN0cnVjdCBlbmFfYWRtaW5fYXFfY29tbW9uX2Rlc2MgYXFfY29tbW9uX2Rlc2NyaXB0b3I7CisKKwlzdHJ1Y3QgZW5hX2FkbWluX2N0cmxfYnVmZl9pbmZvIGNvbnRyb2xfYnVmZmVyOworCisJc3RydWN0IGVuYV9hZG1pbl9nZXRfc2V0X2ZlYXR1cmVfY29tbW9uX2Rlc2MgZmVhdF9jb21tb247CisKKwl1MzIgcmF3WzExXTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfcmVzcCB7CisJc3RydWN0IGVuYV9hZG1pbl9hY3FfY29tbW9uX2Rlc2MgYWNxX2NvbW1vbl9kZXNjOworCisJdW5pb24geworCQl1MzIgcmF3WzE0XTsKKworCQlzdHJ1Y3QgZW5hX2FkbWluX2RldmljZV9hdHRyX2ZlYXR1cmVfZGVzYyBkZXZfYXR0cjsKKworCQlzdHJ1Y3QgZW5hX2FkbWluX3F1ZXVlX2ZlYXR1cmVfZGVzYyBtYXhfcXVldWU7CisKKwkJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX2FlbnFfZGVzYyBhZW5xOworCisJCXN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXR1cmVfbGlua19kZXNjIGxpbms7CisKKwkJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX29mZmxvYWRfZGVzYyBvZmZsb2FkOworCisJCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfZmxvd19oYXNoX2Z1bmN0aW9uIGZsb3dfaGFzaF9mdW5jOworCisJCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfZmxvd19oYXNoX2lucHV0IGZsb3dfaGFzaF9pbnB1dDsKKworCQlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2luZF90YWJsZSBpbmRfdGFibGU7CisKKwkJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX2ludHJfbW9kZXJfZGVzYyBpbnRyX21vZGVyYXRpb247CisJfSB1OworfTsKKworc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdF9jbWQgeworCXN0cnVjdCBlbmFfYWRtaW5fYXFfY29tbW9uX2Rlc2MgYXFfY29tbW9uX2Rlc2NyaXB0b3I7CisKKwlzdHJ1Y3QgZW5hX2FkbWluX2N0cmxfYnVmZl9pbmZvIGNvbnRyb2xfYnVmZmVyOworCisJc3RydWN0IGVuYV9hZG1pbl9nZXRfc2V0X2ZlYXR1cmVfY29tbW9uX2Rlc2MgZmVhdF9jb21tb247CisKKwl1bmlvbiB7CisJCXUzMiByYXdbMTFdOworCisJCS8qIG10dSBzaXplICovCisJCXN0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXR1cmVfbXR1X2Rlc2MgbXR1OworCisJCS8qIGhvc3QgYXR0cmlidXRlcyAqLworCQlzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0dXJlX2hvc3RfYXR0cl9kZXNjIGhvc3RfYXR0cjsKKworCQkvKiBBRU5RIGNvbmZpZ3VyYXRpb24gKi8KKwkJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX2FlbnFfZGVzYyBhZW5xOworCisJCS8qIHJzcyBmbG93IGhhc2ggZnVuY3Rpb24gKi8KKwkJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19mbG93X2hhc2hfZnVuY3Rpb24gZmxvd19oYXNoX2Z1bmM7CisKKwkJLyogcnNzIGZsb3cgaGFzaCBpbnB1dCAqLworCQlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2Zsb3dfaGFzaF9pbnB1dCBmbG93X2hhc2hfaW5wdXQ7CisKKwkJLyogcnNzIGluZGlyZWN0aW9uIHRhYmxlICovCisJCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfaW5kX3RhYmxlIGluZF90YWJsZTsKKwl9IHU7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0X3Jlc3AgeworCXN0cnVjdCBlbmFfYWRtaW5fYWNxX2NvbW1vbl9kZXNjIGFjcV9jb21tb25fZGVzYzsKKworCXVuaW9uIHsKKwkJdTMyIHJhd1sxNF07CisJfSB1OworfTsKKworc3RydWN0IGVuYV9hZG1pbl9hZW5xX2NvbW1vbl9kZXNjIHsKKwl1MTYgZ3JvdXA7CisKKwl1MTYgc3luZHJvbTsKKworCS8qIDAgOiBwaGFzZSAqLworCXU4IGZsYWdzOworCisJdTggcmVzZXJ2ZWQxWzNdOworCisJdTMyIHRpbWVzdGFtcF9sb3c7CisKKwl1MzIgdGltZXN0YW1wX2hpZ2g7Cit9OworCisvKiBhc3luY2hyb25vdXMgZXZlbnQgbm90aWZpY2F0aW9uIGdyb3VwcyAqLworZW51bSBlbmFfYWRtaW5fYWVucV9ncm91cCB7CisJRU5BX0FETUlOX0xJTktfQ0hBTkdFCQk9IDAsCisKKwlFTkFfQURNSU5fRkFUQUxfRVJST1IJCT0gMSwKKworCUVOQV9BRE1JTl9XQVJOSU5HCQk9IDIsCisKKwlFTkFfQURNSU5fTk9USUZJQ0FUSU9OCQk9IDMsCisKKwlFTkFfQURNSU5fS0VFUF9BTElWRQkJPSA0LAorCisJRU5BX0FETUlOX0FFTlFfR1JPVVBTX05VTQk9IDUsCit9OworCitlbnVtIGVuYV9hZG1pbl9hZW5xX25vdGlmaWNhdGlvbl9zeW5kcm9tIHsKKwlFTkFfQURNSU5fU1VTUEVORAk9IDAsCisKKwlFTkFfQURNSU5fUkVTVU1FCT0gMSwKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fYWVucV9lbnRyeSB7CisJc3RydWN0IGVuYV9hZG1pbl9hZW5xX2NvbW1vbl9kZXNjIGFlbnFfY29tbW9uX2Rlc2M7CisKKwkvKiBjb21tYW5kIHNwZWNpZmljIGlubGluZSBkYXRhICovCisJdTMyIGlubGluZV9kYXRhX3c0WzEyXTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fYWVucV9saW5rX2NoYW5nZV9kZXNjIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FlbnFfY29tbW9uX2Rlc2MgYWVucV9jb21tb25fZGVzYzsKKworCS8qIDAgOiBsaW5rX3N0YXR1cyAqLworCXUzMiBmbGFnczsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fZW5hX21taW9fcmVxX3JlYWRfbGVzc19yZXNwIHsKKwl1MTYgcmVxX2lkOworCisJdTE2IHJlZ19vZmY7CisKKwkvKiB2YWx1ZSBpcyB2YWxpZCB3aGVuIHBvbGwgaXMgY2xlYXJlZCAqLworCXUzMiByZWdfdmFsOworfTsKKworLyogYXFfY29tbW9uX2Rlc2MgKi8KKyNkZWZpbmUgRU5BX0FETUlOX0FRX0NPTU1PTl9ERVNDX0NPTU1BTkRfSURfTUFTSyBHRU5NQVNLKDExLCAwKQorI2RlZmluZSBFTkFfQURNSU5fQVFfQ09NTU9OX0RFU0NfUEhBU0VfTUFTSyBCSVQoMCkKKyNkZWZpbmUgRU5BX0FETUlOX0FRX0NPTU1PTl9ERVNDX0NUUkxfREFUQV9TSElGVCAxCisjZGVmaW5lIEVOQV9BRE1JTl9BUV9DT01NT05fREVTQ19DVFJMX0RBVEFfTUFTSyBCSVQoMSkKKyNkZWZpbmUgRU5BX0FETUlOX0FRX0NPTU1PTl9ERVNDX0NUUkxfREFUQV9JTkRJUkVDVF9TSElGVCAyCisjZGVmaW5lIEVOQV9BRE1JTl9BUV9DT01NT05fREVTQ19DVFJMX0RBVEFfSU5ESVJFQ1RfTUFTSyBCSVQoMikKKworLyogc3EgKi8KKyNkZWZpbmUgRU5BX0FETUlOX1NRX1NRX0RJUkVDVElPTl9TSElGVCA1CisjZGVmaW5lIEVOQV9BRE1JTl9TUV9TUV9ESVJFQ1RJT05fTUFTSyBHRU5NQVNLKDcsIDUpCisKKy8qIGFjcV9jb21tb25fZGVzYyAqLworI2RlZmluZSBFTkFfQURNSU5fQUNRX0NPTU1PTl9ERVNDX0NPTU1BTkRfSURfTUFTSyBHRU5NQVNLKDExLCAwKQorI2RlZmluZSBFTkFfQURNSU5fQUNRX0NPTU1PTl9ERVNDX1BIQVNFX01BU0sgQklUKDApCisKKy8qIGFxX2NyZWF0ZV9zcV9jbWQgKi8KKyNkZWZpbmUgRU5BX0FETUlOX0FRX0NSRUFURV9TUV9DTURfU1FfRElSRUNUSU9OX1NISUZUIDUKKyNkZWZpbmUgRU5BX0FETUlOX0FRX0NSRUFURV9TUV9DTURfU1FfRElSRUNUSU9OX01BU0sgR0VOTUFTSyg3LCA1KQorI2RlZmluZSBFTkFfQURNSU5fQVFfQ1JFQVRFX1NRX0NNRF9QTEFDRU1FTlRfUE9MSUNZX01BU0sgR0VOTUFTSygzLCAwKQorI2RlZmluZSBFTkFfQURNSU5fQVFfQ1JFQVRFX1NRX0NNRF9DT01QTEVUSU9OX1BPTElDWV9TSElGVCA0CisjZGVmaW5lIEVOQV9BRE1JTl9BUV9DUkVBVEVfU1FfQ01EX0NPTVBMRVRJT05fUE9MSUNZX01BU0sgR0VOTUFTSyg2LCA0KQorI2RlZmluZSBFTkFfQURNSU5fQVFfQ1JFQVRFX1NRX0NNRF9JU19QSFlTSUNBTExZX0NPTlRJR1VPVVNfTUFTSyBCSVQoMCkKKworLyogYXFfY3JlYXRlX2NxX2NtZCAqLworI2RlZmluZSBFTkFfQURNSU5fQVFfQ1JFQVRFX0NRX0NNRF9JTlRFUlJVUFRfTU9ERV9FTkFCTEVEX1NISUZUIDUKKyNkZWZpbmUgRU5BX0FETUlOX0FRX0NSRUFURV9DUV9DTURfSU5URVJSVVBUX01PREVfRU5BQkxFRF9NQVNLIEJJVCg1KQorI2RlZmluZSBFTkFfQURNSU5fQVFfQ1JFQVRFX0NRX0NNRF9DUV9FTlRSWV9TSVpFX1dPUkRTX01BU0sgR0VOTUFTSyg0LCAwKQorCisvKiBnZXRfc2V0X2ZlYXR1cmVfY29tbW9uX2Rlc2MgKi8KKyNkZWZpbmUgRU5BX0FETUlOX0dFVF9TRVRfRkVBVFVSRV9DT01NT05fREVTQ19TRUxFQ1RfTUFTSyBHRU5NQVNLKDEsIDApCisKKy8qIGdldF9mZWF0dXJlX2xpbmtfZGVzYyAqLworI2RlZmluZSBFTkFfQURNSU5fR0VUX0ZFQVRVUkVfTElOS19ERVNDX0FVVE9ORUdfTUFTSyBCSVQoMCkKKyNkZWZpbmUgRU5BX0FETUlOX0dFVF9GRUFUVVJFX0xJTktfREVTQ19EVVBMRVhfU0hJRlQgMQorI2RlZmluZSBFTkFfQURNSU5fR0VUX0ZFQVRVUkVfTElOS19ERVNDX0RVUExFWF9NQVNLIEJJVCgxKQorCisvKiBmZWF0dXJlX29mZmxvYWRfZGVzYyAqLworI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFhfTDNfQ1NVTV9JUFY0X01BU0sgQklUKDApCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UWF9MNF9JUFY0X0NTVU1fUEFSVF9TSElGVCAxCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UWF9MNF9JUFY0X0NTVU1fUEFSVF9NQVNLIEJJVCgxKQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFhfTDRfSVBWNF9DU1VNX0ZVTExfU0hJRlQgMgorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFhfTDRfSVBWNF9DU1VNX0ZVTExfTUFTSyBCSVQoMikKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RYX0w0X0lQVjZfQ1NVTV9QQVJUX1NISUZUIDMKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RYX0w0X0lQVjZfQ1NVTV9QQVJUX01BU0sgQklUKDMpCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UWF9MNF9JUFY2X0NTVU1fRlVMTF9TSElGVCA0CisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UWF9MNF9JUFY2X0NTVU1fRlVMTF9NQVNLIEJJVCg0KQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFNPX0lQVjRfU0hJRlQgNQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFNPX0lQVjRfTUFTSyBCSVQoNSkKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RTT19JUFY2X1NISUZUIDYKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RTT19JUFY2X01BU0sgQklUKDYpCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UU09fRUNOX1NISUZUIDcKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RTT19FQ05fTUFTSyBCSVQoNykKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1JYX0wzX0NTVU1fSVBWNF9NQVNLIEJJVCgwKQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfUlhfTDRfSVBWNF9DU1VNX1NISUZUIDEKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1JYX0w0X0lQVjRfQ1NVTV9NQVNLIEJJVCgxKQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfUlhfTDRfSVBWNl9DU1VNX1NISUZUIDIKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1JYX0w0X0lQVjZfQ1NVTV9NQVNLIEJJVCgyKQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfUlhfSEFTSF9TSElGVCAzCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19SWF9IQVNIX01BU0sgQklUKDMpCisKKy8qIGZlYXR1cmVfcnNzX2Zsb3dfaGFzaF9mdW5jdGlvbiAqLworI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9SU1NfRkxPV19IQVNIX0ZVTkNUSU9OX0ZVTkNTX01BU0sgR0VOTUFTSyg3LCAwKQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9SU1NfRkxPV19IQVNIX0ZVTkNUSU9OX1NFTEVDVEVEX0ZVTkNfTUFTSyBHRU5NQVNLKDcsIDApCisKKy8qIGZlYXR1cmVfcnNzX2Zsb3dfaGFzaF9pbnB1dCAqLworI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9SU1NfRkxPV19IQVNIX0lOUFVUX0wzX1NPUlRfU0hJRlQgMQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9SU1NfRkxPV19IQVNIX0lOUFVUX0wzX1NPUlRfTUFTSyBCSVQoMSkKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfUlNTX0ZMT1dfSEFTSF9JTlBVVF9MNF9TT1JUX1NISUZUIDIKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfUlNTX0ZMT1dfSEFTSF9JTlBVVF9MNF9TT1JUX01BU0sgQklUKDIpCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX1JTU19GTE9XX0hBU0hfSU5QVVRfRU5BQkxFX0wzX1NPUlRfU0hJRlQgMQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9SU1NfRkxPV19IQVNIX0lOUFVUX0VOQUJMRV9MM19TT1JUX01BU0sgQklUKDEpCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX1JTU19GTE9XX0hBU0hfSU5QVVRfRU5BQkxFX0w0X1NPUlRfU0hJRlQgMgorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9SU1NfRkxPV19IQVNIX0lOUFVUX0VOQUJMRV9MNF9TT1JUX01BU0sgQklUKDIpCisKKy8qIGhvc3RfaW5mbyAqLworI2RlZmluZSBFTkFfQURNSU5fSE9TVF9JTkZPX01BSk9SX01BU0sgR0VOTUFTSyg3LCAwKQorI2RlZmluZSBFTkFfQURNSU5fSE9TVF9JTkZPX01JTk9SX1NISUZUIDgKKyNkZWZpbmUgRU5BX0FETUlOX0hPU1RfSU5GT19NSU5PUl9NQVNLIEdFTk1BU0soMTUsIDgpCisjZGVmaW5lIEVOQV9BRE1JTl9IT1NUX0lORk9fU1VCX01JTk9SX1NISUZUIDE2CisjZGVmaW5lIEVOQV9BRE1JTl9IT1NUX0lORk9fU1VCX01JTk9SX01BU0sgR0VOTUFTSygyMywgMTYpCisKKy8qIGFlbnFfY29tbW9uX2Rlc2MgKi8KKyNkZWZpbmUgRU5BX0FETUlOX0FFTlFfQ09NTU9OX0RFU0NfUEhBU0VfTUFTSyBCSVQoMCkKKworLyogYWVucV9saW5rX2NoYW5nZV9kZXNjICovCisjZGVmaW5lIEVOQV9BRE1JTl9BRU5RX0xJTktfQ0hBTkdFX0RFU0NfTElOS19TVEFUVVNfTUFTSyBCSVQoMCkKKworI2VuZGlmIC8qX0VOQV9BRE1JTl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfY29tLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9jb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDY2ZDljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfY29tLmMKQEAgLTAsMCArMSwyNjY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZW5hX2NvbS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRpbWVvdXQgaW4gbWljcm8tc2VjICovCisjZGVmaW5lIEFETUlOX0NNRF9USU1FT1VUX1VTICgxMDAwMDAwKQorCisjZGVmaW5lIEVOQV9BU1lOQ19RVUVVRV9ERVBUSCA0CisjZGVmaW5lIEVOQV9BRE1JTl9RVUVVRV9ERVBUSCAzMgorCisjZGVmaW5lIE1JTl9FTkFfVkVSICgoKEVOQV9DT01NT05fU1BFQ19WRVJTSU9OX01BSk9SKSA8PCBcCisJCUVOQV9SRUdTX1ZFUlNJT05fTUFKT1JfVkVSU0lPTl9TSElGVCkgXAorCQl8IChFTkFfQ09NTU9OX1NQRUNfVkVSU0lPTl9NSU5PUikpCisKKyNkZWZpbmUgRU5BX0NUUkxfTUFKT1IJCTAKKyNkZWZpbmUgRU5BX0NUUkxfTUlOT1IJCTAKKyNkZWZpbmUgRU5BX0NUUkxfU1VCX01JTk9SCTEKKworI2RlZmluZSBNSU5fRU5BX0NUUkxfVkVSIFwKKwkoKChFTkFfQ1RSTF9NQUpPUikgPDwgXAorCShFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fTUFKT1JfVkVSU0lPTl9TSElGVCkpIHwgXAorCSgoRU5BX0NUUkxfTUlOT1IpIDw8IFwKKwkoRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX01JTk9SX1ZFUlNJT05fU0hJRlQpKSB8IFwKKwkoRU5BX0NUUkxfU1VCX01JTk9SKSkKKworI2RlZmluZSBFTkFfRE1BX0FERFJfVE9fVUlOVDMyX0xPVyh4KQkoKHUzMikoKHU2NCkoeCkpKQorI2RlZmluZSBFTkFfRE1BX0FERFJfVE9fVUlOVDMyX0hJR0goeCkJKCh1MzIpKCgodTY0KSh4KSkgPj4gMzIpKQorCisjZGVmaW5lIEVOQV9NTUlPX1JFQURfVElNRU9VVCAweEZGRkZGRkZGCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZW51bSBlbmFfY21kX3N0YXR1cyB7CisJRU5BX0NNRF9TVUJNSVRURUQsCisJRU5BX0NNRF9DT01QTEVURUQsCisJLyogQWJvcnQgLSBjYW5jZWxlZCBieSB0aGUgZHJpdmVyICovCisJRU5BX0NNRF9BQk9SVEVELAorfTsKKworc3RydWN0IGVuYV9jb21wX2N0eCB7CisJc3RydWN0IGNvbXBsZXRpb24gd2FpdF9ldmVudDsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqdXNlcl9jcWU7CisJdTMyIGNvbXBfc2l6ZTsKKwllbnVtIGVuYV9jbWRfc3RhdHVzIHN0YXR1czsKKwkvKiBzdGF0dXMgZnJvbSB0aGUgZGV2aWNlICovCisJdTggY29tcF9zdGF0dXM7CisJdTggY21kX29wY29kZTsKKwlib29sIG9jY3VwaWVkOworfTsKKworc3RydWN0IGVuYV9jb21fc3RhdHNfY3R4IHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FxX2dldF9zdGF0c19jbWQgZ2V0X2NtZDsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FjcV9nZXRfc3RhdHNfcmVzcCBnZXRfcmVzcDsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGVuYV9jb21fbWVtX2FkZHJfc2V0KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkgICAgICAgc3RydWN0IGVuYV9jb21tb25fbWVtX2FkZHIgKmVuYV9hZGRyLAorCQkJCSAgICAgICBkbWFfYWRkcl90IGFkZHIpCit7CisJaWYgKChhZGRyICYgR0VOTUFTS19VTEwoZW5hX2Rldi0+ZG1hX2FkZHJfYml0cyAtIDEsIDApKSAhPSBhZGRyKSB7CisJCXByX2VycigiZG1hIGFkZHJlc3MgaGFzIG1vcmUgYml0cyB0aGF0IHRoZSBkZXZpY2Ugc3VwcG9ydHNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllbmFfYWRkci0+bWVtX2FkZHJfbG93ID0gKHUzMilhZGRyOworCWVuYV9hZGRyLT5tZW1fYWRkcl9oaWdoID0gKHU2NClhZGRyID4+IDMyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV9hZG1pbl9pbml0X3NxKHN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICpxdWV1ZSkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9zcSAqc3EgPSAmcXVldWUtPnNxOworCXUxNiBzaXplID0gQURNSU5fU1FfU0laRShxdWV1ZS0+cV9kZXB0aCk7CisKKwlzcS0+ZW50cmllcyA9IGRtYV96YWxsb2NfY29oZXJlbnQocXVldWUtPnFfZG1hZGV2LCBzaXplLCAmc3EtPmRtYV9hZGRyLAorCQkJCQkgIEdGUF9LRVJORUwpOworCisJaWYgKCFzcS0+ZW50cmllcykgeworCQlwcl9lcnIoIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcS0+aGVhZCA9IDA7CisJc3EtPnRhaWwgPSAwOworCXNxLT5waGFzZSA9IDE7CisKKwlzcS0+ZGJfYWRkciA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmFfY29tX2FkbWluX2luaXRfY3Eoc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKnF1ZXVlKQoreworCXN0cnVjdCBlbmFfY29tX2FkbWluX2NxICpjcSA9ICZxdWV1ZS0+Y3E7CisJdTE2IHNpemUgPSBBRE1JTl9DUV9TSVpFKHF1ZXVlLT5xX2RlcHRoKTsKKworCWNxLT5lbnRyaWVzID0gZG1hX3phbGxvY19jb2hlcmVudChxdWV1ZS0+cV9kbWFkZXYsIHNpemUsICZjcS0+ZG1hX2FkZHIsCisJCQkJCSAgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWNxLT5lbnRyaWVzKSB7CisJCXByX2VycigibWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNxLT5oZWFkID0gMDsKKwljcS0+cGhhc2UgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV9hZG1pbl9pbml0X2FlbnEoc3RydWN0IGVuYV9jb21fZGV2ICpkZXYsCisJCQkJICAgc3RydWN0IGVuYV9hZW5xX2hhbmRsZXJzICphZW5xX2hhbmRsZXJzKQoreworCXN0cnVjdCBlbmFfY29tX2FlbnEgKmFlbnEgPSAmZGV2LT5hZW5xOworCXUzMiBhZGRyX2xvdywgYWRkcl9oaWdoLCBhZW5xX2NhcHM7CisJdTE2IHNpemU7CisKKwlkZXYtPmFlbnEucV9kZXB0aCA9IEVOQV9BU1lOQ19RVUVVRV9ERVBUSDsKKwlzaXplID0gQURNSU5fQUVOUV9TSVpFKEVOQV9BU1lOQ19RVUVVRV9ERVBUSCk7CisJYWVucS0+ZW50cmllcyA9IGRtYV96YWxsb2NfY29oZXJlbnQoZGV2LT5kbWFkZXYsIHNpemUsICZhZW5xLT5kbWFfYWRkciwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCisJaWYgKCFhZW5xLT5lbnRyaWVzKSB7CisJCXByX2VycigibWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWFlbnEtPmhlYWQgPSBhZW5xLT5xX2RlcHRoOworCWFlbnEtPnBoYXNlID0gMTsKKworCWFkZHJfbG93ID0gRU5BX0RNQV9BRERSX1RPX1VJTlQzMl9MT1coYWVucS0+ZG1hX2FkZHIpOworCWFkZHJfaGlnaCA9IEVOQV9ETUFfQUREUl9UT19VSU5UMzJfSElHSChhZW5xLT5kbWFfYWRkcik7CisKKwl3cml0ZWwoYWRkcl9sb3csIGRldi0+cmVnX2JhciArIEVOQV9SRUdTX0FFTlFfQkFTRV9MT19PRkYpOworCXdyaXRlbChhZGRyX2hpZ2gsIGRldi0+cmVnX2JhciArIEVOQV9SRUdTX0FFTlFfQkFTRV9ISV9PRkYpOworCisJYWVucV9jYXBzID0gMDsKKwlhZW5xX2NhcHMgfD0gZGV2LT5hZW5xLnFfZGVwdGggJiBFTkFfUkVHU19BRU5RX0NBUFNfQUVOUV9ERVBUSF9NQVNLOworCWFlbnFfY2FwcyB8PSAoc2l6ZW9mKHN0cnVjdCBlbmFfYWRtaW5fYWVucV9lbnRyeSkKKwkJICAgICAgPDwgRU5BX1JFR1NfQUVOUV9DQVBTX0FFTlFfRU5UUllfU0laRV9TSElGVCkgJgorCQkgICAgIEVOQV9SRUdTX0FFTlFfQ0FQU19BRU5RX0VOVFJZX1NJWkVfTUFTSzsKKwl3cml0ZWwoYWVucV9jYXBzLCBkZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19BRU5RX0NBUFNfT0ZGKTsKKworCWlmICh1bmxpa2VseSghYWVucV9oYW5kbGVycykpIHsKKwkJcHJfZXJyKCJhZW5xIGhhbmRsZXJzIHBvaW50ZXIgaXMgTlVMTFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFlbnEtPmFlbnFfaGFuZGxlcnMgPSBhZW5xX2hhbmRsZXJzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21wX2N0eHRfcmVsZWFzZShzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqcXVldWUsCisJCQkJICAgICBzdHJ1Y3QgZW5hX2NvbXBfY3R4ICpjb21wX2N0eCkKK3sKKwljb21wX2N0eC0+b2NjdXBpZWQgPSBmYWxzZTsKKwlhdG9taWNfZGVjKCZxdWV1ZS0+b3V0c3RhbmRpbmdfY21kcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZW5hX2NvbXBfY3R4ICpnZXRfY29tcF9jdHh0KHN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICpxdWV1ZSwKKwkJCQkJICB1MTYgY29tbWFuZF9pZCwgYm9vbCBjYXB0dXJlKQoreworCWlmICh1bmxpa2VseShjb21tYW5kX2lkID49IHF1ZXVlLT5xX2RlcHRoKSkgeworCQlwcl9lcnIoImNvbW1hbmQgaWQgaXMgbGFyZ2VyIHRoYW4gdGhlIHF1ZXVlIHNpemUuIGNtZF9pZDogJXUgcXVldWUgc2l6ZSAlZFxuIiwKKwkJICAgICAgIGNvbW1hbmRfaWQsIHF1ZXVlLT5xX2RlcHRoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHVubGlrZWx5KHF1ZXVlLT5jb21wX2N0eFtjb21tYW5kX2lkXS5vY2N1cGllZCAmJiBjYXB0dXJlKSkgeworCQlwcl9lcnIoIkNvbXBsZXRpb24gY29udGV4dCBpcyBvY2N1cGllZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChjYXB0dXJlKSB7CisJCWF0b21pY19pbmMoJnF1ZXVlLT5vdXRzdGFuZGluZ19jbWRzKTsKKwkJcXVldWUtPmNvbXBfY3R4W2NvbW1hbmRfaWRdLm9jY3VwaWVkID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gJnF1ZXVlLT5jb21wX2N0eFtjb21tYW5kX2lkXTsKK30KKworc3RhdGljIHN0cnVjdCBlbmFfY29tcF9jdHggKl9fZW5hX2NvbV9zdWJtaXRfYWRtaW5fY21kKHN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSwKKwkJCQkJCSAgICAgICBzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5ICpjbWQsCisJCQkJCQkgICAgICAgc2l6ZV90IGNtZF9zaXplX2luX2J5dGVzLAorCQkJCQkJICAgICAgIHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICpjb21wLAorCQkJCQkJICAgICAgIHNpemVfdCBjb21wX3NpemVfaW5fYnl0ZXMpCit7CisJc3RydWN0IGVuYV9jb21wX2N0eCAqY29tcF9jdHg7CisJdTE2IHRhaWxfbWFza2VkLCBjbWRfaWQ7CisJdTE2IHF1ZXVlX3NpemVfbWFzazsKKwl1MTYgY250OworCisJcXVldWVfc2l6ZV9tYXNrID0gYWRtaW5fcXVldWUtPnFfZGVwdGggLSAxOworCisJdGFpbF9tYXNrZWQgPSBhZG1pbl9xdWV1ZS0+c3EudGFpbCAmIHF1ZXVlX3NpemVfbWFzazsKKworCS8qIEluIGNhc2Ugb2YgcXVldWUgRlVMTCAqLworCWNudCA9IGFkbWluX3F1ZXVlLT5zcS50YWlsIC0gYWRtaW5fcXVldWUtPnNxLmhlYWQ7CisJaWYgKGNudCA+PSBhZG1pbl9xdWV1ZS0+cV9kZXB0aCkgeworCQlwcl9kZWJ1ZygiYWRtaW4gcXVldWUgaXMgRlVMTCAodGFpbCAlZCBoZWFkICVkIGRlcHRoOiAlZClcbiIsCisJCQkgYWRtaW5fcXVldWUtPnNxLnRhaWwsIGFkbWluX3F1ZXVlLT5zcS5oZWFkLAorCQkJIGFkbWluX3F1ZXVlLT5xX2RlcHRoKTsKKwkJYWRtaW5fcXVldWUtPnN0YXRzLm91dF9vZl9zcGFjZSsrOworCQlyZXR1cm4gRVJSX1BUUigtRU5PU1BDKTsKKwl9CisKKwljbWRfaWQgPSBhZG1pbl9xdWV1ZS0+Y3Vycl9jbWRfaWQ7CisKKwljbWQtPmFxX2NvbW1vbl9kZXNjcmlwdG9yLmZsYWdzIHw9IGFkbWluX3F1ZXVlLT5zcS5waGFzZSAmCisJCUVOQV9BRE1JTl9BUV9DT01NT05fREVTQ19QSEFTRV9NQVNLOworCisJY21kLT5hcV9jb21tb25fZGVzY3JpcHRvci5jb21tYW5kX2lkIHw9IGNtZF9pZCAmCisJCUVOQV9BRE1JTl9BUV9DT01NT05fREVTQ19DT01NQU5EX0lEX01BU0s7CisKKwljb21wX2N0eCA9IGdldF9jb21wX2N0eHQoYWRtaW5fcXVldWUsIGNtZF9pZCwgdHJ1ZSk7CisJaWYgKHVubGlrZWx5KCFjb21wX2N0eCkpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJY29tcF9jdHgtPnN0YXR1cyA9IEVOQV9DTURfU1VCTUlUVEVEOworCWNvbXBfY3R4LT5jb21wX3NpemUgPSAodTMyKWNvbXBfc2l6ZV9pbl9ieXRlczsKKwljb21wX2N0eC0+dXNlcl9jcWUgPSBjb21wOworCWNvbXBfY3R4LT5jbWRfb3Bjb2RlID0gY21kLT5hcV9jb21tb25fZGVzY3JpcHRvci5vcGNvZGU7CisKKwlyZWluaXRfY29tcGxldGlvbigmY29tcF9jdHgtPndhaXRfZXZlbnQpOworCisJbWVtY3B5KCZhZG1pbl9xdWV1ZS0+c3EuZW50cmllc1t0YWlsX21hc2tlZF0sIGNtZCwgY21kX3NpemVfaW5fYnl0ZXMpOworCisJYWRtaW5fcXVldWUtPmN1cnJfY21kX2lkID0gKGFkbWluX3F1ZXVlLT5jdXJyX2NtZF9pZCArIDEpICYKKwkJcXVldWVfc2l6ZV9tYXNrOworCisJYWRtaW5fcXVldWUtPnNxLnRhaWwrKzsKKwlhZG1pbl9xdWV1ZS0+c3RhdHMuc3VibWl0dGVkX2NtZCsrOworCisJaWYgKHVubGlrZWx5KChhZG1pbl9xdWV1ZS0+c3EudGFpbCAmIHF1ZXVlX3NpemVfbWFzaykgPT0gMCkpCisJCWFkbWluX3F1ZXVlLT5zcS5waGFzZSA9ICFhZG1pbl9xdWV1ZS0+c3EucGhhc2U7CisKKwl3cml0ZWwoYWRtaW5fcXVldWUtPnNxLnRhaWwsIGFkbWluX3F1ZXVlLT5zcS5kYl9hZGRyKTsKKworCXJldHVybiBjb21wX2N0eDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZW5hX2NvbV9pbml0X2NvbXBfY3R4dChzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqcXVldWUpCit7CisJc2l6ZV90IHNpemUgPSBxdWV1ZS0+cV9kZXB0aCAqIHNpemVvZihzdHJ1Y3QgZW5hX2NvbXBfY3R4KTsKKwlzdHJ1Y3QgZW5hX2NvbXBfY3R4ICpjb21wX2N0eDsKKwl1MTYgaTsKKworCXF1ZXVlLT5jb21wX2N0eCA9IGRldm1fa3phbGxvYyhxdWV1ZS0+cV9kbWFkZXYsIHNpemUsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghcXVldWUtPmNvbXBfY3R4KSkgeworCQlwcl9lcnIoIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcXVldWUtPnFfZGVwdGg7IGkrKykgeworCQljb21wX2N0eCA9IGdldF9jb21wX2N0eHQocXVldWUsIGksIGZhbHNlKTsKKwkJaWYgKGNvbXBfY3R4KQorCQkJaW5pdF9jb21wbGV0aW9uKCZjb21wX2N0eC0+d2FpdF9ldmVudCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZW5hX2NvbXBfY3R4ICplbmFfY29tX3N1Ym1pdF9hZG1pbl9jbWQoc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlLAorCQkJCQkJICAgICBzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5ICpjbWQsCisJCQkJCQkgICAgIHNpemVfdCBjbWRfc2l6ZV9pbl9ieXRlcywKKwkJCQkJCSAgICAgc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKmNvbXAsCisJCQkJCQkgICAgIHNpemVfdCBjb21wX3NpemVfaW5fYnl0ZXMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZW5hX2NvbXBfY3R4ICpjb21wX2N0eDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZG1pbl9xdWV1ZS0+cV9sb2NrLCBmbGFncyk7CisJaWYgKHVubGlrZWx5KCFhZG1pbl9xdWV1ZS0+cnVubmluZ19zdGF0ZSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRtaW5fcXVldWUtPnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwl9CisJY29tcF9jdHggPSBfX2VuYV9jb21fc3VibWl0X2FkbWluX2NtZChhZG1pbl9xdWV1ZSwgY21kLAorCQkJCQkgICAgICBjbWRfc2l6ZV9pbl9ieXRlcywKKwkJCQkJICAgICAgY29tcCwKKwkJCQkJICAgICAgY29tcF9zaXplX2luX2J5dGVzKTsKKwlpZiAodW5saWtlbHkoSVNfRVJSKGNvbXBfY3R4KSkpCisJCWFkbWluX3F1ZXVlLT5ydW5uaW5nX3N0YXRlID0gZmFsc2U7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRtaW5fcXVldWUtPnFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGNvbXBfY3R4OworfQorCitzdGF0aWMgaW50IGVuYV9jb21faW5pdF9pb19zcShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgICBzdHJ1Y3QgZW5hX2NvbV9jcmVhdGVfaW9fY3R4ICpjdHgsCisJCQkgICAgICBzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EpCit7CisJc2l6ZV90IHNpemU7CisJaW50IGRldl9ub2RlID0gMDsKKworCW1lbXNldCgmaW9fc3EtPmRlc2NfYWRkciwgMHgwLCBzaXplb2Yoc3RydWN0IGVuYV9jb21faW9fZGVzY19hZGRyKSk7CisKKwlpb19zcS0+ZGVzY19lbnRyeV9zaXplID0KKwkJKGlvX3NxLT5kaXJlY3Rpb24gPT0gRU5BX0NPTV9JT19RVUVVRV9ESVJFQ1RJT05fVFgpID8KKwkJc2l6ZW9mKHN0cnVjdCBlbmFfZXRoX2lvX3R4X2Rlc2MpIDoKKwkJc2l6ZW9mKHN0cnVjdCBlbmFfZXRoX2lvX3J4X2Rlc2MpOworCisJc2l6ZSA9IGlvX3NxLT5kZXNjX2VudHJ5X3NpemUgKiBpb19zcS0+cV9kZXB0aDsKKworCWlmIChpb19zcS0+bWVtX3F1ZXVlX3R5cGUgPT0gRU5BX0FETUlOX1BMQUNFTUVOVF9QT0xJQ1lfSE9TVCkgeworCQlkZXZfbm9kZSA9IGRldl90b19ub2RlKGVuYV9kZXYtPmRtYWRldik7CisJCXNldF9kZXZfbm9kZShlbmFfZGV2LT5kbWFkZXYsIGN0eC0+bnVtYV9ub2RlKTsKKwkJaW9fc3EtPmRlc2NfYWRkci52aXJ0X2FkZHIgPQorCQkJZG1hX3phbGxvY19jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIHNpemUsCisJCQkJCSAgICAmaW9fc3EtPmRlc2NfYWRkci5waHlzX2FkZHIsCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJc2V0X2Rldl9ub2RlKGVuYV9kZXYtPmRtYWRldiwgZGV2X25vZGUpOworCQlpZiAoIWlvX3NxLT5kZXNjX2FkZHIudmlydF9hZGRyKSB7CisJCQlpb19zcS0+ZGVzY19hZGRyLnZpcnRfYWRkciA9CisJCQkJZG1hX3phbGxvY19jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIHNpemUsCisJCQkJCQkgICAgJmlvX3NxLT5kZXNjX2FkZHIucGh5c19hZGRyLAorCQkJCQkJICAgIEdGUF9LRVJORUwpOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X25vZGUgPSBkZXZfdG9fbm9kZShlbmFfZGV2LT5kbWFkZXYpOworCQlzZXRfZGV2X25vZGUoZW5hX2Rldi0+ZG1hZGV2LCBjdHgtPm51bWFfbm9kZSk7CisJCWlvX3NxLT5kZXNjX2FkZHIudmlydF9hZGRyID0KKwkJCWRldm1fa3phbGxvYyhlbmFfZGV2LT5kbWFkZXYsIHNpemUsIEdGUF9LRVJORUwpOworCQlzZXRfZGV2X25vZGUoZW5hX2Rldi0+ZG1hZGV2LCBkZXZfbm9kZSk7CisJCWlmICghaW9fc3EtPmRlc2NfYWRkci52aXJ0X2FkZHIpIHsKKwkJCWlvX3NxLT5kZXNjX2FkZHIudmlydF9hZGRyID0KKwkJCQlkZXZtX2t6YWxsb2MoZW5hX2Rldi0+ZG1hZGV2LCBzaXplLCBHRlBfS0VSTkVMKTsKKwkJfQorCX0KKworCWlmICghaW9fc3EtPmRlc2NfYWRkci52aXJ0X2FkZHIpIHsKKwkJcHJfZXJyKCJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW9fc3EtPnRhaWwgPSAwOworCWlvX3NxLT5uZXh0X3RvX2NvbXAgPSAwOworCWlvX3NxLT5waGFzZSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmFfY29tX2luaXRfaW9fY3Eoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgICAgc3RydWN0IGVuYV9jb21fY3JlYXRlX2lvX2N0eCAqY3R4LAorCQkJICAgICAgc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxKQoreworCXNpemVfdCBzaXplOworCWludCBwcmV2X25vZGUgPSAwOworCisJbWVtc2V0KCZpb19jcS0+Y2Rlc2NfYWRkciwgMHgwLCBzaXplb2Yoc3RydWN0IGVuYV9jb21faW9fZGVzY19hZGRyKSk7CisKKwkvKiBVc2UgdGhlIGJhc2ljIGNvbXBsZXRpb24gZGVzY3JpcHRvciBmb3IgUnggKi8KKwlpb19jcS0+Y2Rlc2NfZW50cnlfc2l6ZV9pbl9ieXRlcyA9CisJCShpb19jcS0+ZGlyZWN0aW9uID09IEVOQV9DT01fSU9fUVVFVUVfRElSRUNUSU9OX1RYKSA/CisJCXNpemVvZihzdHJ1Y3QgZW5hX2V0aF9pb190eF9jZGVzYykgOgorCQlzaXplb2Yoc3RydWN0IGVuYV9ldGhfaW9fcnhfY2Rlc2NfYmFzZSk7CisKKwlzaXplID0gaW9fY3EtPmNkZXNjX2VudHJ5X3NpemVfaW5fYnl0ZXMgKiBpb19jcS0+cV9kZXB0aDsKKworCXByZXZfbm9kZSA9IGRldl90b19ub2RlKGVuYV9kZXYtPmRtYWRldik7CisJc2V0X2Rldl9ub2RlKGVuYV9kZXYtPmRtYWRldiwgY3R4LT5udW1hX25vZGUpOworCWlvX2NxLT5jZGVzY19hZGRyLnZpcnRfYWRkciA9CisJCWRtYV96YWxsb2NfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBzaXplLAorCQkJCSAgICAmaW9fY3EtPmNkZXNjX2FkZHIucGh5c19hZGRyLCBHRlBfS0VSTkVMKTsKKwlzZXRfZGV2X25vZGUoZW5hX2Rldi0+ZG1hZGV2LCBwcmV2X25vZGUpOworCWlmICghaW9fY3EtPmNkZXNjX2FkZHIudmlydF9hZGRyKSB7CisJCWlvX2NxLT5jZGVzY19hZGRyLnZpcnRfYWRkciA9CisJCQlkbWFfemFsbG9jX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgc2l6ZSwKKwkJCQkJICAgICZpb19jcS0+Y2Rlc2NfYWRkci5waHlzX2FkZHIsCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwl9CisKKwlpZiAoIWlvX2NxLT5jZGVzY19hZGRyLnZpcnRfYWRkcikgeworCQlwcl9lcnIoIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpb19jcS0+cGhhc2UgPSAxOworCWlvX2NxLT5oZWFkID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbmFfY29tX2hhbmRsZV9zaW5nbGVfYWRtaW5fY29tcGxldGlvbihzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUsCisJCQkJCQkgICBzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqY3FlKQoreworCXN0cnVjdCBlbmFfY29tcF9jdHggKmNvbXBfY3R4OworCXUxNiBjbWRfaWQ7CisKKwljbWRfaWQgPSBjcWUtPmFjcV9jb21tb25fZGVzY3JpcHRvci5jb21tYW5kICYKKwkJRU5BX0FETUlOX0FDUV9DT01NT05fREVTQ19DT01NQU5EX0lEX01BU0s7CisKKwljb21wX2N0eCA9IGdldF9jb21wX2N0eHQoYWRtaW5fcXVldWUsIGNtZF9pZCwgZmFsc2UpOworCWlmICh1bmxpa2VseSghY29tcF9jdHgpKSB7CisJCXByX2VycigiY29tcF9jdHggaXMgTlVMTC4gQ2hhbmdpbmcgdGhlIGFkbWluIHF1ZXVlIHJ1bm5pbmcgc3RhdGVcbiIpOworCQlhZG1pbl9xdWV1ZS0+cnVubmluZ19zdGF0ZSA9IGZhbHNlOworCQlyZXR1cm47CisJfQorCisJY29tcF9jdHgtPnN0YXR1cyA9IEVOQV9DTURfQ09NUExFVEVEOworCWNvbXBfY3R4LT5jb21wX3N0YXR1cyA9IGNxZS0+YWNxX2NvbW1vbl9kZXNjcmlwdG9yLnN0YXR1czsKKworCWlmIChjb21wX2N0eC0+dXNlcl9jcWUpCisJCW1lbWNweShjb21wX2N0eC0+dXNlcl9jcWUsICh2b2lkICopY3FlLCBjb21wX2N0eC0+Y29tcF9zaXplKTsKKworCWlmICghYWRtaW5fcXVldWUtPnBvbGxpbmcpCisJCWNvbXBsZXRlKCZjb21wX2N0eC0+d2FpdF9ldmVudCk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9jb21faGFuZGxlX2FkbWluX2NvbXBsZXRpb24oc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlKQoreworCXN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICpjcWUgPSBOVUxMOworCXUxNiBjb21wX251bSA9IDA7CisJdTE2IGhlYWRfbWFza2VkOworCXU4IHBoYXNlOworCisJaGVhZF9tYXNrZWQgPSBhZG1pbl9xdWV1ZS0+Y3EuaGVhZCAmIChhZG1pbl9xdWV1ZS0+cV9kZXB0aCAtIDEpOworCXBoYXNlID0gYWRtaW5fcXVldWUtPmNxLnBoYXNlOworCisJY3FlID0gJmFkbWluX3F1ZXVlLT5jcS5lbnRyaWVzW2hlYWRfbWFza2VkXTsKKworCS8qIEdvIG92ZXIgYWxsIHRoZSBjb21wbGV0aW9ucyAqLworCXdoaWxlICgoY3FlLT5hY3FfY29tbW9uX2Rlc2NyaXB0b3IuZmxhZ3MgJgorCQkJRU5BX0FETUlOX0FDUV9DT01NT05fREVTQ19QSEFTRV9NQVNLKSA9PSBwaGFzZSkgeworCQkvKiBEbyBub3QgcmVhZCB0aGUgcmVzdCBvZiB0aGUgY29tcGxldGlvbiBlbnRyeSBiZWZvcmUgdGhlCisJCSAqIHBoYXNlIGJpdCB3YXMgdmFsaWRhdGVkCisJCSAqLworCQlybWIoKTsKKwkJZW5hX2NvbV9oYW5kbGVfc2luZ2xlX2FkbWluX2NvbXBsZXRpb24oYWRtaW5fcXVldWUsIGNxZSk7CisKKwkJaGVhZF9tYXNrZWQrKzsKKwkJY29tcF9udW0rKzsKKwkJaWYgKHVubGlrZWx5KGhlYWRfbWFza2VkID09IGFkbWluX3F1ZXVlLT5xX2RlcHRoKSkgeworCQkJaGVhZF9tYXNrZWQgPSAwOworCQkJcGhhc2UgPSAhcGhhc2U7CisJCX0KKworCQljcWUgPSAmYWRtaW5fcXVldWUtPmNxLmVudHJpZXNbaGVhZF9tYXNrZWRdOworCX0KKworCWFkbWluX3F1ZXVlLT5jcS5oZWFkICs9IGNvbXBfbnVtOworCWFkbWluX3F1ZXVlLT5jcS5waGFzZSA9IHBoYXNlOworCWFkbWluX3F1ZXVlLT5zcS5oZWFkICs9IGNvbXBfbnVtOworCWFkbWluX3F1ZXVlLT5zdGF0cy5jb21wbGV0ZWRfY21kICs9IGNvbXBfbnVtOworfQorCitzdGF0aWMgaW50IGVuYV9jb21fY29tcF9zdGF0dXNfdG9fZXJybm8odTggY29tcF9zdGF0dXMpCit7CisJaWYgKHVubGlrZWx5KGNvbXBfc3RhdHVzICE9IDApKQorCQlwcl9lcnIoImFkbWluIGNvbW1hbmQgZmFpbGVkWyV1XVxuIiwgY29tcF9zdGF0dXMpOworCisJaWYgKHVubGlrZWx5KGNvbXBfc3RhdHVzID4gRU5BX0FETUlOX1VOS05PV05fRVJST1IpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoY29tcF9zdGF0dXMpIHsKKwljYXNlIEVOQV9BRE1JTl9TVUNDRVNTOgorCQlyZXR1cm4gMDsKKwljYXNlIEVOQV9BRE1JTl9SRVNPVVJDRV9BTExPQ0FUSU9OX0ZBSUxVUkU6CisJCXJldHVybiAtRU5PTUVNOworCWNhc2UgRU5BX0FETUlOX1VOU1VQUE9SVEVEX09QQ09ERToKKwkJcmV0dXJuIC1FUEVSTTsKKwljYXNlIEVOQV9BRE1JTl9CQURfT1BDT0RFOgorCWNhc2UgRU5BX0FETUlOX01BTEZPUk1FRF9SRVFVRVNUOgorCWNhc2UgRU5BX0FETUlOX0lMTEVHQUxfUEFSQU1FVEVSOgorCWNhc2UgRU5BX0FETUlOX1VOS05PV05fRVJST1I6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuYV9jb21fd2FpdF9hbmRfcHJvY2Vzc19hZG1pbl9jcV9wb2xsaW5nKHN0cnVjdCBlbmFfY29tcF9jdHggKmNvbXBfY3R4LAorCQkJCQkJICAgICBzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgc3RhcnRfdGltZTsKKwlpbnQgcmV0OworCisJc3RhcnRfdGltZSA9ICgodTMyKWppZmZpZXNfdG9fdXNlY3MoamlmZmllcykpOworCisJd2hpbGUgKGNvbXBfY3R4LT5zdGF0dXMgPT0gRU5BX0NNRF9TVUJNSVRURUQpIHsKKwkJaWYgKCgoKHUzMilqaWZmaWVzX3RvX3VzZWNzKGppZmZpZXMpKSAtIHN0YXJ0X3RpbWUpID4KKwkJICAgIEFETUlOX0NNRF9USU1FT1VUX1VTKSB7CisJCQlwcl9lcnIoIldhaXQgZm9yIGNvbXBsZXRpb24gKHBvbGxpbmcpIHRpbWVvdXRcbiIpOworCQkJLyogRU5BIGRpZG4ndCBoYXZlIGFueSBjb21wbGV0aW9uICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRtaW5fcXVldWUtPnFfbG9jaywgZmxhZ3MpOworCQkJYWRtaW5fcXVldWUtPnN0YXRzLm5vX2NvbXBsZXRpb24rKzsKKwkJCWFkbWluX3F1ZXVlLT5ydW5uaW5nX3N0YXRlID0gZmFsc2U7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZG1pbl9xdWV1ZS0+cV9sb2NrLCBmbGFncyk7CisKKwkJCXJldCA9IC1FVElNRTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkbWluX3F1ZXVlLT5xX2xvY2ssIGZsYWdzKTsKKwkJZW5hX2NvbV9oYW5kbGVfYWRtaW5fY29tcGxldGlvbihhZG1pbl9xdWV1ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkbWluX3F1ZXVlLT5xX2xvY2ssIGZsYWdzKTsKKworCQltc2xlZXAoMTAwKTsKKwl9CisKKwlpZiAodW5saWtlbHkoY29tcF9jdHgtPnN0YXR1cyA9PSBFTkFfQ01EX0FCT1JURUQpKSB7CisJCXByX2VycigiQ29tbWFuZCB3YXMgYWJvcnRlZFxuIik7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZG1pbl9xdWV1ZS0+cV9sb2NrLCBmbGFncyk7CisJCWFkbWluX3F1ZXVlLT5zdGF0cy5hYm9ydGVkX2NtZCsrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZG1pbl9xdWV1ZS0+cV9sb2NrLCBmbGFncyk7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOworCX0KKworCVdBUk4oY29tcF9jdHgtPnN0YXR1cyAhPSBFTkFfQ01EX0NPTVBMRVRFRCwgIkludmFsaWQgY29tcCBzdGF0dXMgJWRcbiIsCisJICAgICBjb21wX2N0eC0+c3RhdHVzKTsKKworCXJldCA9IGVuYV9jb21fY29tcF9zdGF0dXNfdG9fZXJybm8oY29tcF9jdHgtPmNvbXBfc3RhdHVzKTsKK2VycjoKKwljb21wX2N0eHRfcmVsZWFzZShhZG1pbl9xdWV1ZSwgY29tcF9jdHgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV93YWl0X2FuZF9wcm9jZXNzX2FkbWluX2NxX2ludGVycnVwdHMoc3RydWN0IGVuYV9jb21wX2N0eCAqY29tcF9jdHgsCisJCQkJCQkJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY29tcF9jdHgtPndhaXRfZXZlbnQsCisJCQkJICAgIHVzZWNzX3RvX2ppZmZpZXMoQURNSU5fQ01EX1RJTUVPVVRfVVMpKTsKKworCS8qIEluIGNhc2UgdGhlIGNvbW1hbmQgd2Fzbid0IGNvbXBsZXRlZCBmaW5kIG91dCB0aGUgcm9vdCBjYXVzZS4KKwkgKiBUaGVyZSBtaWdodCBiZSAyIGtpbmRzIG9mIGVycm9ycworCSAqIDEpIE5vIGNvbXBsZXRpb24gKHRpbWVvdXQgcmVhY2hlZCkKKwkgKiAyKSBUaGVyZSBpcyBjb21wbGV0aW9uIGJ1dCB0aGUgZGV2aWNlIGRpZG4ndCBnZXQgYW55IG1zaS14IGludGVycnVwdC4KKwkgKi8KKwlpZiAodW5saWtlbHkoY29tcF9jdHgtPnN0YXR1cyA9PSBFTkFfQ01EX1NVQk1JVFRFRCkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkbWluX3F1ZXVlLT5xX2xvY2ssIGZsYWdzKTsKKwkJZW5hX2NvbV9oYW5kbGVfYWRtaW5fY29tcGxldGlvbihhZG1pbl9xdWV1ZSk7CisJCWFkbWluX3F1ZXVlLT5zdGF0cy5ub19jb21wbGV0aW9uKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkbWluX3F1ZXVlLT5xX2xvY2ssIGZsYWdzKTsKKworCQlpZiAoY29tcF9jdHgtPnN0YXR1cyA9PSBFTkFfQ01EX0NPTVBMRVRFRCkKKwkJCXByX2VycigiVGhlIGVuYSBkZXZpY2UgaGF2ZSBjb21wbGV0aW9uIGJ1dCB0aGUgZHJpdmVyIGRpZG4ndCByZWNlaXZlIGFueSBNU0ktWCBpbnRlcnJ1cHQgKGNtZCAlZClcbiIsCisJCQkgICAgICAgY29tcF9jdHgtPmNtZF9vcGNvZGUpOworCQllbHNlCisJCQlwcl9lcnIoIlRoZSBlbmEgZGV2aWNlIGRvZXNuJ3Qgc2VuZCBhbnkgY29tcGxldGlvbiBmb3IgdGhlIGFkbWluIGNtZCAlZCBzdGF0dXMgJWRcbiIsCisJCQkgICAgICAgY29tcF9jdHgtPmNtZF9vcGNvZGUsIGNvbXBfY3R4LT5zdGF0dXMpOworCisJCWFkbWluX3F1ZXVlLT5ydW5uaW5nX3N0YXRlID0gZmFsc2U7CisJCXJldCA9IC1FVElNRTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gZW5hX2NvbV9jb21wX3N0YXR1c190b19lcnJubyhjb21wX2N0eC0+Y29tcF9zdGF0dXMpOworZXJyOgorCWNvbXBfY3R4dF9yZWxlYXNlKGFkbWluX3F1ZXVlLCBjb21wX2N0eCk7CisJcmV0dXJuIHJldDsKK30KKworLyogVGhpcyBtZXRob2QgcmVhZCB0aGUgaGFyZHdhcmUgZGV2aWNlIHJlZ2lzdGVyIHRocm91Z2ggcG9zdGluZyB3cml0ZXMKKyAqIGFuZCB3YWl0aW5nIGZvciByZXNwb25zZQorICogT24gdGltZW91dCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gRU5BX01NSU9fUkVBRF9USU1FT1VUCisgKi8KK3N0YXRpYyB1MzIgZW5hX2NvbV9yZWdfYmFyX3JlYWQzMihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIHUxNiBvZmZzZXQpCit7CisJc3RydWN0IGVuYV9jb21fbW1pb19yZWFkICptbWlvX3JlYWQgPSAmZW5hX2Rldi0+bW1pb19yZWFkOworCXZvbGF0aWxlIHN0cnVjdCBlbmFfYWRtaW5fZW5hX21taW9fcmVxX3JlYWRfbGVzc19yZXNwICpyZWFkX3Jlc3AgPQorCQltbWlvX3JlYWQtPnJlYWRfcmVzcDsKKwl1MzIgbW1pb19yZWFkX3JlZywgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwltaWdodF9zbGVlcCgpOworCisJLyogSWYgcmVhZGxlc3MgaXMgZGlzYWJsZWQsIHBlcmZvcm0gcmVndWxhciByZWFkICovCisJaWYgKCFtbWlvX3JlYWQtPnJlYWRsZXNzX3N1cHBvcnRlZCkKKwkJcmV0dXJuIHJlYWRsKGVuYV9kZXYtPnJlZ19iYXIgKyBvZmZzZXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1taW9fcmVhZC0+bG9jaywgZmxhZ3MpOworCW1taW9fcmVhZC0+c2VxX251bSsrOworCisJcmVhZF9yZXNwLT5yZXFfaWQgPSBtbWlvX3JlYWQtPnNlcV9udW0gKyAweERFQUQ7CisJbW1pb19yZWFkX3JlZyA9IChvZmZzZXQgPDwgRU5BX1JFR1NfTU1JT19SRUdfUkVBRF9SRUdfT0ZGX1NISUZUKSAmCisJCQlFTkFfUkVHU19NTUlPX1JFR19SRUFEX1JFR19PRkZfTUFTSzsKKwltbWlvX3JlYWRfcmVnIHw9IG1taW9fcmVhZC0+c2VxX251bSAmCisJCQlFTkFfUkVHU19NTUlPX1JFR19SRUFEX1JFUV9JRF9NQVNLOworCisJLyogbWFrZSBzdXJlIHJlYWRfcmVzcC0+cmVxX2lkIGdldCB1cGRhdGVkIGJlZm9yZSB0aGUgaHcgY2FuIHdyaXRlCisJICogdGhlcmUKKwkgKi8KKwl3bWIoKTsKKworCXdyaXRlbChtbWlvX3JlYWRfcmVnLCBlbmFfZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfTU1JT19SRUdfUkVBRF9PRkYpOworCisJZm9yIChpID0gMDsgaSA8IEVOQV9SRUdfUkVBRF9USU1FT1VUOyBpKyspIHsKKwkJaWYgKHJlYWRfcmVzcC0+cmVxX2lkID09IG1taW9fcmVhZC0+c2VxX251bSkKKwkJCWJyZWFrOworCisJCXVkZWxheSgxKTsKKwl9CisKKwlpZiAodW5saWtlbHkoaSA9PSBFTkFfUkVHX1JFQURfVElNRU9VVCkpIHsKKwkJcHJfZXJyKCJyZWFkaW5nIHJlZyBmYWlsZWQgZm9yIHRpbWVvdXQuIGV4cGVjdGVkOiByZXEgaWRbJWh1XSBvZmZzZXRbJWh1XSBhY3R1YWw6IHJlcSBpZFslaHVdIG9mZnNldFslaHVdXG4iLAorCQkgICAgICAgbW1pb19yZWFkLT5zZXFfbnVtLCBvZmZzZXQsIHJlYWRfcmVzcC0+cmVxX2lkLAorCQkgICAgICAgcmVhZF9yZXNwLT5yZWdfb2ZmKTsKKwkJcmV0ID0gRU5BX01NSU9fUkVBRF9USU1FT1VUOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAocmVhZF9yZXNwLT5yZWdfb2ZmICE9IG9mZnNldCkgeworCQlwcl9lcnIoIlJlYWQgZmFpbHVyZTogd3Jvbmcgb2Zmc2V0IHByb3ZpZGVkIik7CisJCXJldCA9IEVOQV9NTUlPX1JFQURfVElNRU9VVDsKKwl9IGVsc2UgeworCQlyZXQgPSByZWFkX3Jlc3AtPnJlZ192YWw7CisJfQorZXJyOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1taW9fcmVhZC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyogVGhlcmUgYXJlIHR3byB0eXBlcyB0byB3YWl0IGZvciBjb21wbGV0aW9uLgorICogUG9sbGluZyBtb2RlIC0gd2FpdCB1bnRpbCB0aGUgY29tcGxldGlvbiBpcyBhdmFpbGFibGUuCisgKiBBc3luYyBtb2RlIC0gd2FpdCBvbiB3YWl0IHF1ZXVlIHVudGlsIHRoZSBjb21wbGV0aW9uIGlzIHJlYWR5CisgKiAob3IgdGhlIHRpbWVvdXQgZXhwaXJlZCkuCisgKiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBJUlEgY2FsbGVkIGVuYV9jb21faGFuZGxlX2FkbWluX2NvbXBsZXRpb24KKyAqIHRvIG1hcmsgdGhlIGNvbXBsZXRpb25zLgorICovCitzdGF0aWMgaW50IGVuYV9jb21fd2FpdF9hbmRfcHJvY2Vzc19hZG1pbl9jcShzdHJ1Y3QgZW5hX2NvbXBfY3R4ICpjb21wX2N0eCwKKwkJCQkJICAgICBzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUpCit7CisJaWYgKGFkbWluX3F1ZXVlLT5wb2xsaW5nKQorCQlyZXR1cm4gZW5hX2NvbV93YWl0X2FuZF9wcm9jZXNzX2FkbWluX2NxX3BvbGxpbmcoY29tcF9jdHgsCisJCQkJCQkJCSBhZG1pbl9xdWV1ZSk7CisKKwlyZXR1cm4gZW5hX2NvbV93YWl0X2FuZF9wcm9jZXNzX2FkbWluX2NxX2ludGVycnVwdHMoY29tcF9jdHgsCisJCQkJCQkJICAgIGFkbWluX3F1ZXVlKTsKK30KKworc3RhdGljIGludCBlbmFfY29tX2Rlc3Ryb3lfaW9fc3Eoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCSBzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EpCit7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlID0gJmVuYV9kZXYtPmFkbWluX3F1ZXVlOworCXN0cnVjdCBlbmFfYWRtaW5fYXFfZGVzdHJveV9zcV9jbWQgZGVzdHJveV9jbWQ7CisJc3RydWN0IGVuYV9hZG1pbl9hY3FfZGVzdHJveV9zcV9yZXNwX2Rlc2MgZGVzdHJveV9yZXNwOworCXU4IGRpcmVjdGlvbjsKKwlpbnQgcmV0OworCisJbWVtc2V0KCZkZXN0cm95X2NtZCwgMHgwLCBzaXplb2Yoc3RydWN0IGVuYV9hZG1pbl9hcV9kZXN0cm95X3NxX2NtZCkpOworCisJaWYgKGlvX3NxLT5kaXJlY3Rpb24gPT0gRU5BX0NPTV9JT19RVUVVRV9ESVJFQ1RJT05fVFgpCisJCWRpcmVjdGlvbiA9IEVOQV9BRE1JTl9TUV9ESVJFQ1RJT05fVFg7CisJZWxzZQorCQlkaXJlY3Rpb24gPSBFTkFfQURNSU5fU1FfRElSRUNUSU9OX1JYOworCisJZGVzdHJveV9jbWQuc3Euc3FfaWRlbnRpdHkgfD0gKGRpcmVjdGlvbiA8PAorCQlFTkFfQURNSU5fU1FfU1FfRElSRUNUSU9OX1NISUZUKSAmCisJCUVOQV9BRE1JTl9TUV9TUV9ESVJFQ1RJT05fTUFTSzsKKworCWRlc3Ryb3lfY21kLnNxLnNxX2lkeCA9IGlvX3NxLT5pZHg7CisJZGVzdHJveV9jbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3Iub3Bjb2RlID0gRU5BX0FETUlOX0RFU1RST1lfU1E7CisKKwlyZXQgPSBlbmFfY29tX2V4ZWN1dGVfYWRtaW5fY29tbWFuZChhZG1pbl9xdWV1ZSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5ICopJmRlc3Ryb3lfY21kLAorCQkJCQkgICAgc2l6ZW9mKGRlc3Ryb3lfY21kKSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqKSZkZXN0cm95X3Jlc3AsCisJCQkJCSAgICBzaXplb2YoZGVzdHJveV9yZXNwKSk7CisKKwlpZiAodW5saWtlbHkocmV0ICYmIChyZXQgIT0gLUVOT0RFVikpKQorCQlwcl9lcnIoImZhaWxlZCB0byBkZXN0cm95IGlvIHNxIGVycm9yOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9jb21faW9fcXVldWVfZnJlZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJICBzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EsCisJCQkJICBzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3EpCit7CisJc2l6ZV90IHNpemU7CisKKwlpZiAoaW9fY3EtPmNkZXNjX2FkZHIudmlydF9hZGRyKSB7CisJCXNpemUgPSBpb19jcS0+Y2Rlc2NfZW50cnlfc2l6ZV9pbl9ieXRlcyAqIGlvX2NxLT5xX2RlcHRoOworCisJCWRtYV9mcmVlX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgc2l6ZSwKKwkJCQkgIGlvX2NxLT5jZGVzY19hZGRyLnZpcnRfYWRkciwKKwkJCQkgIGlvX2NxLT5jZGVzY19hZGRyLnBoeXNfYWRkcik7CisKKwkJaW9fY3EtPmNkZXNjX2FkZHIudmlydF9hZGRyID0gTlVMTDsKKwl9CisKKwlpZiAoaW9fc3EtPmRlc2NfYWRkci52aXJ0X2FkZHIpIHsKKwkJc2l6ZSA9IGlvX3NxLT5kZXNjX2VudHJ5X3NpemUgKiBpb19zcS0+cV9kZXB0aDsKKworCQlpZiAoaW9fc3EtPm1lbV9xdWV1ZV90eXBlID09IEVOQV9BRE1JTl9QTEFDRU1FTlRfUE9MSUNZX0hPU1QpCisJCQlkbWFfZnJlZV9jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIHNpemUsCisJCQkJCSAgaW9fc3EtPmRlc2NfYWRkci52aXJ0X2FkZHIsCisJCQkJCSAgaW9fc3EtPmRlc2NfYWRkci5waHlzX2FkZHIpOworCQllbHNlCisJCQlkZXZtX2tmcmVlKGVuYV9kZXYtPmRtYWRldiwgaW9fc3EtPmRlc2NfYWRkci52aXJ0X2FkZHIpOworCisJCWlvX3NxLT5kZXNjX2FkZHIudmlydF9hZGRyID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9mb3JfcmVzZXRfc3RhdGUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCB1MzIgdGltZW91dCwKKwkJCQl1MTYgZXhwX3N0YXRlKQoreworCXUzMiB2YWwsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7CisJCXZhbCA9IGVuYV9jb21fcmVnX2Jhcl9yZWFkMzIoZW5hX2RldiwgRU5BX1JFR1NfREVWX1NUU19PRkYpOworCisJCWlmICh1bmxpa2VseSh2YWwgPT0gRU5BX01NSU9fUkVBRF9USU1FT1VUKSkgeworCQkJcHJfZXJyKCJSZWcgcmVhZCB0aW1lb3V0IG9jY3VycmVkXG4iKTsKKwkJCXJldHVybiAtRVRJTUU7CisJCX0KKworCQlpZiAoKHZhbCAmIEVOQV9SRUdTX0RFVl9TVFNfUkVTRVRfSU5fUFJPR1JFU1NfTUFTSykgPT0KKwkJCWV4cF9zdGF0ZSkKKwkJCXJldHVybiAwOworCisJCS8qIFRoZSByZXNvbHV0aW9uIG9mIHRoZSB0aW1lb3V0IGlzIDEwMG1zICovCisJCW1zbGVlcCgxMDApOworCX0KKworCXJldHVybiAtRVRJTUU7Cit9CisKK3N0YXRpYyBib29sIGVuYV9jb21fY2hlY2tfc3VwcG9ydGVkX2ZlYXR1cmVfaWQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCQkgICAgICAgZW51bSBlbmFfYWRtaW5fYXFfZmVhdHVyZV9pZCBmZWF0dXJlX2lkKQoreworCXUzMiBmZWF0dXJlX21hc2sgPSAxIDw8IGZlYXR1cmVfaWQ7CisKKwkvKiBEZXZpY2UgYXR0cmlidXRlcyBpcyBhbHdheXMgc3VwcG9ydGVkICovCisJaWYgKChmZWF0dXJlX2lkICE9IEVOQV9BRE1JTl9ERVZJQ0VfQVRUUklCVVRFUykgJiYKKwkgICAgIShlbmFfZGV2LT5zdXBwb3J0ZWRfZmVhdHVyZXMgJiBmZWF0dXJlX21hc2spKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBlbmFfY29tX2dldF9mZWF0dXJlX2V4KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkgIHN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfcmVzcCAqZ2V0X3Jlc3AsCisJCQkJICBlbnVtIGVuYV9hZG1pbl9hcV9mZWF0dXJlX2lkIGZlYXR1cmVfaWQsCisJCQkJICBkbWFfYWRkcl90IGNvbnRyb2xfYnVmX2RtYV9hZGRyLAorCQkJCSAgdTMyIGNvbnRyb2xfYnVmZl9zaXplKQoreworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZTsKKwlzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X2NtZCBnZXRfY21kOworCWludCByZXQ7CisKKwlpZiAoIWVuYV9jb21fY2hlY2tfc3VwcG9ydGVkX2ZlYXR1cmVfaWQoZW5hX2RldiwgZmVhdHVyZV9pZCkpIHsKKwkJcHJfaW5mbygiRmVhdHVyZSAlZCBpc24ndCBzdXBwb3J0ZWRcbiIsIGZlYXR1cmVfaWQpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCW1lbXNldCgmZ2V0X2NtZCwgMHgwLCBzaXplb2YoZ2V0X2NtZCkpOworCWFkbWluX3F1ZXVlID0gJmVuYV9kZXYtPmFkbWluX3F1ZXVlOworCisJZ2V0X2NtZC5hcV9jb21tb25fZGVzY3JpcHRvci5vcGNvZGUgPSBFTkFfQURNSU5fR0VUX0ZFQVRVUkU7CisKKwlpZiAoY29udHJvbF9idWZmX3NpemUpCisJCWdldF9jbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3IuZmxhZ3MgPQorCQkJRU5BX0FETUlOX0FRX0NPTU1PTl9ERVNDX0NUUkxfREFUQV9JTkRJUkVDVF9NQVNLOworCWVsc2UKKwkJZ2V0X2NtZC5hcV9jb21tb25fZGVzY3JpcHRvci5mbGFncyA9IDA7CisKKwlyZXQgPSBlbmFfY29tX21lbV9hZGRyX3NldChlbmFfZGV2LAorCQkJCSAgICZnZXRfY21kLmNvbnRyb2xfYnVmZmVyLmFkZHJlc3MsCisJCQkJICAgY29udHJvbF9idWZfZG1hX2FkZHIpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCXByX2VycigibWVtb3J5IGFkZHJlc3Mgc2V0IGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZ2V0X2NtZC5jb250cm9sX2J1ZmZlci5sZW5ndGggPSBjb250cm9sX2J1ZmZfc2l6ZTsKKworCWdldF9jbWQuZmVhdF9jb21tb24uZmVhdHVyZV9pZCA9IGZlYXR1cmVfaWQ7CisKKwlyZXQgPSBlbmFfY29tX2V4ZWN1dGVfYWRtaW5fY29tbWFuZChhZG1pbl9xdWV1ZSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5ICopCisJCQkJCSAgICAmZ2V0X2NtZCwKKwkJCQkJICAgIHNpemVvZihnZXRfY21kKSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqKQorCQkJCQkgICAgZ2V0X3Jlc3AsCisJCQkJCSAgICBzaXplb2YoKmdldF9yZXNwKSk7CisKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gc3VibWl0IGdldF9mZWF0dXJlIGNvbW1hbmQgJWQgZXJyb3I6ICVkXG4iLAorCQkgICAgICAgZmVhdHVyZV9pZCwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV9nZXRfZmVhdHVyZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgICAgc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9yZXNwICpnZXRfcmVzcCwKKwkJCSAgICAgICBlbnVtIGVuYV9hZG1pbl9hcV9mZWF0dXJlX2lkIGZlYXR1cmVfaWQpCit7CisJcmV0dXJuIGVuYV9jb21fZ2V0X2ZlYXR1cmVfZXgoZW5hX2RldiwKKwkJCQkgICAgICBnZXRfcmVzcCwKKwkJCQkgICAgICBmZWF0dXJlX2lkLAorCQkJCSAgICAgIDAsCisJCQkJICAgICAgMCk7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV9oYXNoX2tleV9hbGxvY2F0ZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisKKwlyc3MtPmhhc2hfa2V5ID0KKwkJZG1hX3phbGxvY19jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIHNpemVvZigqcnNzLT5oYXNoX2tleSksCisJCQkJICAgICZyc3MtPmhhc2hfa2V5X2RtYV9hZGRyLCBHRlBfS0VSTkVMKTsKKworCWlmICh1bmxpa2VseSghcnNzLT5oYXNoX2tleSkpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9jb21faGFzaF9rZXlfZGVzdHJveShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisKKwlpZiAocnNzLT5oYXNoX2tleSkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBzaXplb2YoKnJzcy0+aGFzaF9rZXkpLAorCQkJCSAgcnNzLT5oYXNoX2tleSwgcnNzLT5oYXNoX2tleV9kbWFfYWRkcik7CisJcnNzLT5oYXNoX2tleSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV9oYXNoX2N0cmxfaW5pdChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisKKwlyc3MtPmhhc2hfY3RybCA9CisJCWRtYV96YWxsb2NfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBzaXplb2YoKnJzcy0+aGFzaF9jdHJsKSwKKwkJCQkgICAgJnJzcy0+aGFzaF9jdHJsX2RtYV9hZGRyLCBHRlBfS0VSTkVMKTsKKworCWlmICh1bmxpa2VseSghcnNzLT5oYXNoX2N0cmwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbmFfY29tX2hhc2hfY3RybF9kZXN0cm95KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKworCWlmIChyc3MtPmhhc2hfY3RybCkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBzaXplb2YoKnJzcy0+aGFzaF9jdHJsKSwKKwkJCQkgIHJzcy0+aGFzaF9jdHJsLCByc3MtPmhhc2hfY3RybF9kbWFfYWRkcik7CisJcnNzLT5oYXNoX2N0cmwgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGVuYV9jb21faW5kaXJlY3RfdGFibGVfYWxsb2NhdGUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCQkgICB1MTYgbG9nX3NpemUpCit7CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisJc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9yZXNwIGdldF9yZXNwOworCXNpemVfdCB0Ymxfc2l6ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gZW5hX2NvbV9nZXRfZmVhdHVyZShlbmFfZGV2LCAmZ2V0X3Jlc3AsCisJCQkJICBFTkFfQURNSU5fUlNTX1JFRElSRUNUSU9OX1RBQkxFX0NPTkZJRyk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCXJldHVybiByZXQ7CisKKwlpZiAoKGdldF9yZXNwLnUuaW5kX3RhYmxlLm1pbl9zaXplID4gbG9nX3NpemUpIHx8CisJICAgIChnZXRfcmVzcC51LmluZF90YWJsZS5tYXhfc2l6ZSA8IGxvZ19zaXplKSkgeworCQlwcl9lcnIoImluZGlyZWN0IHRhYmxlIHNpemUgZG9lc24ndCBmaXQuIHJlcXVlc3RlZCBzaXplOiAlZCB3aGlsZSBtaW4gaXM6JWQgYW5kIG1heCAlZFxuIiwKKwkJICAgICAgIDEgPDwgbG9nX3NpemUsIDEgPDwgZ2V0X3Jlc3AudS5pbmRfdGFibGUubWluX3NpemUsCisJCSAgICAgICAxIDw8IGdldF9yZXNwLnUuaW5kX3RhYmxlLm1heF9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdGJsX3NpemUgPSAoMVVMTCA8PCBsb2dfc2l6ZSkgKgorCQlzaXplb2Yoc3RydWN0IGVuYV9hZG1pbl9yc3NfaW5kX3RhYmxlX2VudHJ5KTsKKworCXJzcy0+cnNzX2luZF90YmwgPQorCQlkbWFfemFsbG9jX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgdGJsX3NpemUsCisJCQkJICAgICZyc3MtPnJzc19pbmRfdGJsX2RtYV9hZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIXJzcy0+cnNzX2luZF90YmwpKQorCQlnb3RvIG1lbV9lcnIxOworCisJdGJsX3NpemUgPSAoMVVMTCA8PCBsb2dfc2l6ZSkgKiBzaXplb2YodTE2KTsKKwlyc3MtPmhvc3RfcnNzX2luZF90YmwgPQorCQlkZXZtX2t6YWxsb2MoZW5hX2Rldi0+ZG1hZGV2LCB0Ymxfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFyc3MtPmhvc3RfcnNzX2luZF90YmwpKQorCQlnb3RvIG1lbV9lcnIyOworCisJcnNzLT50YmxfbG9nX3NpemUgPSBsb2dfc2l6ZTsKKworCXJldHVybiAwOworCittZW1fZXJyMjoKKwl0Ymxfc2l6ZSA9ICgxVUxMIDw8IGxvZ19zaXplKSAqCisJCXNpemVvZihzdHJ1Y3QgZW5hX2FkbWluX3Jzc19pbmRfdGFibGVfZW50cnkpOworCisJZG1hX2ZyZWVfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCB0Ymxfc2l6ZSwgcnNzLT5yc3NfaW5kX3RibCwKKwkJCSAgcnNzLT5yc3NfaW5kX3RibF9kbWFfYWRkcik7CisJcnNzLT5yc3NfaW5kX3RibCA9IE5VTEw7CittZW1fZXJyMToKKwlyc3MtPnRibF9sb2dfc2l6ZSA9IDA7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9jb21faW5kaXJlY3RfdGFibGVfZGVzdHJveShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisJc2l6ZV90IHRibF9zaXplID0gKDFVTEwgPDwgcnNzLT50YmxfbG9nX3NpemUpICoKKwkJc2l6ZW9mKHN0cnVjdCBlbmFfYWRtaW5fcnNzX2luZF90YWJsZV9lbnRyeSk7CisKKwlpZiAocnNzLT5yc3NfaW5kX3RibCkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCB0Ymxfc2l6ZSwgcnNzLT5yc3NfaW5kX3RibCwKKwkJCQkgIHJzcy0+cnNzX2luZF90YmxfZG1hX2FkZHIpOworCXJzcy0+cnNzX2luZF90YmwgPSBOVUxMOworCisJaWYgKHJzcy0+aG9zdF9yc3NfaW5kX3RibCkKKwkJZGV2bV9rZnJlZShlbmFfZGV2LT5kbWFkZXYsIHJzcy0+aG9zdF9yc3NfaW5kX3RibCk7CisJcnNzLT5ob3N0X3Jzc19pbmRfdGJsID0gTlVMTDsKK30KKworc3RhdGljIGludCBlbmFfY29tX2NyZWF0ZV9pb19zcShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxLCB1MTYgY3FfaWR4KQoreworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSA9ICZlbmFfZGV2LT5hZG1pbl9xdWV1ZTsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FxX2NyZWF0ZV9zcV9jbWQgY3JlYXRlX2NtZDsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FjcV9jcmVhdGVfc3FfcmVzcF9kZXNjIGNtZF9jb21wbGV0aW9uOworCXU4IGRpcmVjdGlvbjsKKwlpbnQgcmV0OworCisJbWVtc2V0KCZjcmVhdGVfY21kLCAweDAsIHNpemVvZihzdHJ1Y3QgZW5hX2FkbWluX2FxX2NyZWF0ZV9zcV9jbWQpKTsKKworCWNyZWF0ZV9jbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3Iub3Bjb2RlID0gRU5BX0FETUlOX0NSRUFURV9TUTsKKworCWlmIChpb19zcS0+ZGlyZWN0aW9uID09IEVOQV9DT01fSU9fUVVFVUVfRElSRUNUSU9OX1RYKQorCQlkaXJlY3Rpb24gPSBFTkFfQURNSU5fU1FfRElSRUNUSU9OX1RYOworCWVsc2UKKwkJZGlyZWN0aW9uID0gRU5BX0FETUlOX1NRX0RJUkVDVElPTl9SWDsKKworCWNyZWF0ZV9jbWQuc3FfaWRlbnRpdHkgfD0gKGRpcmVjdGlvbiA8PAorCQlFTkFfQURNSU5fQVFfQ1JFQVRFX1NRX0NNRF9TUV9ESVJFQ1RJT05fU0hJRlQpICYKKwkJRU5BX0FETUlOX0FRX0NSRUFURV9TUV9DTURfU1FfRElSRUNUSU9OX01BU0s7CisKKwljcmVhdGVfY21kLnNxX2NhcHNfMiB8PSBpb19zcS0+bWVtX3F1ZXVlX3R5cGUgJgorCQlFTkFfQURNSU5fQVFfQ1JFQVRFX1NRX0NNRF9QTEFDRU1FTlRfUE9MSUNZX01BU0s7CisKKwljcmVhdGVfY21kLnNxX2NhcHNfMiB8PSAoRU5BX0FETUlOX0NPTVBMRVRJT05fUE9MSUNZX0RFU0MgPDwKKwkJRU5BX0FETUlOX0FRX0NSRUFURV9TUV9DTURfQ09NUExFVElPTl9QT0xJQ1lfU0hJRlQpICYKKwkJRU5BX0FETUlOX0FRX0NSRUFURV9TUV9DTURfQ09NUExFVElPTl9QT0xJQ1lfTUFTSzsKKworCWNyZWF0ZV9jbWQuc3FfY2Fwc18zIHw9CisJCUVOQV9BRE1JTl9BUV9DUkVBVEVfU1FfQ01EX0lTX1BIWVNJQ0FMTFlfQ09OVElHVU9VU19NQVNLOworCisJY3JlYXRlX2NtZC5jcV9pZHggPSBjcV9pZHg7CisJY3JlYXRlX2NtZC5zcV9kZXB0aCA9IGlvX3NxLT5xX2RlcHRoOworCisJaWYgKGlvX3NxLT5tZW1fcXVldWVfdHlwZSA9PSBFTkFfQURNSU5fUExBQ0VNRU5UX1BPTElDWV9IT1NUKSB7CisJCXJldCA9IGVuYV9jb21fbWVtX2FkZHJfc2V0KGVuYV9kZXYsCisJCQkJCSAgICZjcmVhdGVfY21kLnNxX2JhLAorCQkJCQkgICBpb19zcS0+ZGVzY19hZGRyLnBoeXNfYWRkcik7CisJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQlwcl9lcnIoIm1lbW9yeSBhZGRyZXNzIHNldCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldCA9IGVuYV9jb21fZXhlY3V0ZV9hZG1pbl9jb21tYW5kKGFkbWluX3F1ZXVlLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgKikmY3JlYXRlX2NtZCwKKwkJCQkJICAgIHNpemVvZihjcmVhdGVfY21kKSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqKSZjbWRfY29tcGxldGlvbiwKKwkJCQkJICAgIHNpemVvZihjbWRfY29tcGxldGlvbikpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCXByX2VycigiRmFpbGVkIHRvIGNyZWF0ZSBJTyBTUS4gZXJyb3I6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlvX3NxLT5pZHggPSBjbWRfY29tcGxldGlvbi5zcV9pZHg7CisKKwlpb19zcS0+ZGJfYWRkciA9ICh1MzIgX19pb21lbSAqKSgodWludHB0cl90KWVuYV9kZXYtPnJlZ19iYXIgKworCQkodWludHB0cl90KWNtZF9jb21wbGV0aW9uLnNxX2Rvb3JiZWxsX29mZnNldCk7CisKKwlpZiAoaW9fc3EtPm1lbV9xdWV1ZV90eXBlID09IEVOQV9BRE1JTl9QTEFDRU1FTlRfUE9MSUNZX0RFVikgeworCQlpb19zcS0+aGVhZGVyX2FkZHIgPSAodTggX19pb21lbSAqKSgodWludHB0cl90KWVuYV9kZXYtPm1lbV9iYXIKKwkJCQkrIGNtZF9jb21wbGV0aW9uLmxscV9oZWFkZXJzX29mZnNldCk7CisKKwkJaW9fc3EtPmRlc2NfYWRkci5wYnVmX2Rldl9hZGRyID0KKwkJCSh1OCBfX2lvbWVtICopKCh1aW50cHRyX3QpZW5hX2Rldi0+bWVtX2JhciArCisJCQljbWRfY29tcGxldGlvbi5sbHFfZGVzY3JpcHRvcnNfb2Zmc2V0KTsKKwl9CisKKwlwcl9kZWJ1ZygiY3JlYXRlZCBzcVsldV0sIGRlcHRoWyV1XVxuIiwgaW9fc3EtPmlkeCwgaW9fc3EtPnFfZGVwdGgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlbmFfY29tX2luZF90YmxfY29udmVydF90b19kZXZpY2Uoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCXN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcTsKKwl1MTYgcWlkOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDEgPDwgcnNzLT50YmxfbG9nX3NpemU7IGkrKykgeworCQlxaWQgPSByc3MtPmhvc3RfcnNzX2luZF90YmxbaV07CisJCWlmIChxaWQgPj0gRU5BX1RPVEFMX05VTV9RVUVVRVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpb19zcSA9ICZlbmFfZGV2LT5pb19zcV9xdWV1ZXNbcWlkXTsKKworCQlpZiAoaW9fc3EtPmRpcmVjdGlvbiAhPSBFTkFfQ09NX0lPX1FVRVVFX0RJUkVDVElPTl9SWCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJzcy0+cnNzX2luZF90YmxbaV0uY3FfaWR4ID0gaW9fc3EtPmlkeDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmFfY29tX2luZF90YmxfY29udmVydF9mcm9tX2RldmljZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJdTE2IGRldl9pZHhfdG9faG9zdF90YmxbRU5BX1RPVEFMX05VTV9RVUVVRVNdID0geyAodTE2KS0xIH07CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisJdTggaWR4OworCXUxNiBpOworCisJZm9yIChpID0gMDsgaSA8IEVOQV9UT1RBTF9OVU1fUVVFVUVTOyBpKyspCisJCWRldl9pZHhfdG9faG9zdF90YmxbZW5hX2Rldi0+aW9fc3FfcXVldWVzW2ldLmlkeF0gPSBpOworCisJZm9yIChpID0gMDsgaSA8IDEgPDwgcnNzLT50YmxfbG9nX3NpemU7IGkrKykgeworCQlpZiAocnNzLT5yc3NfaW5kX3RibFtpXS5jcV9pZHggPiBFTkFfVE9UQUxfTlVNX1FVRVVFUykKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZHggPSAodTgpcnNzLT5yc3NfaW5kX3RibFtpXS5jcV9pZHg7CisKKwkJaWYgKGRldl9pZHhfdG9faG9zdF90YmxbaWR4XSA+IEVOQV9UT1RBTF9OVU1fUVVFVUVTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcnNzLT5ob3N0X3Jzc19pbmRfdGJsW2ldID0gZGV2X2lkeF90b19ob3N0X3RibFtpZHhdOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuYV9jb21faW5pdF9pbnRlcnJ1cHRfbW9kZXJhdGlvbl90YWJsZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc2l6ZV90IHNpemU7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSkgKiBFTkFfSU5UUl9NQVhfTlVNX09GX0xFVkVMUzsKKworCWVuYV9kZXYtPmludHJfbW9kZXJfdGJsID0KKwkJZGV2bV9remFsbG9jKGVuYV9kZXYtPmRtYWRldiwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbmFfZGV2LT5pbnRyX21vZGVyX3RibCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbmFfY29tX2NvbmZpZ19kZWZhdWx0X2ludGVycnVwdF9tb2RlcmF0aW9uX3RhYmxlKGVuYV9kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9jb21fdXBkYXRlX2ludHJfZGVsYXlfcmVzb2x1dGlvbihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJCQkgdTE2IGludHJfZGVsYXlfcmVzb2x1dGlvbikKK3sKKwlzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkgKmludHJfbW9kZXJfdGJsID0gZW5hX2Rldi0+aW50cl9tb2Rlcl90Ymw7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoIWludHJfZGVsYXlfcmVzb2x1dGlvbikgeworCQlwcl9lcnIoIklsbGVnYWwgaW50cl9kZWxheV9yZXNvbHV0aW9uIHByb3ZpZGVkLiBHb2luZyB0byB1c2UgZGVmYXVsdCAxIHVzZWMgcmVzb2x1dGlvblxuIik7CisJCWludHJfZGVsYXlfcmVzb2x1dGlvbiA9IDE7CisJfQorCWVuYV9kZXYtPmludHJfZGVsYXlfcmVzb2x1dGlvbiA9IGludHJfZGVsYXlfcmVzb2x1dGlvbjsKKworCS8qIHVwZGF0ZSBSeCAqLworCWZvciAoaSA9IDA7IGkgPCBFTkFfSU5UUl9NQVhfTlVNX09GX0xFVkVMUzsgaSsrKQorCQlpbnRyX21vZGVyX3RibFtpXS5pbnRyX21vZGVyX2ludGVydmFsIC89IGludHJfZGVsYXlfcmVzb2x1dGlvbjsKKworCS8qIHVwZGF0ZSBUeCAqLworCWVuYV9kZXYtPmludHJfbW9kZXJfdHhfaW50ZXJ2YWwgLz0gaW50cl9kZWxheV9yZXNvbHV0aW9uOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgIEFQSSAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBlbmFfY29tX2V4ZWN1dGVfYWRtaW5fY29tbWFuZChzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUsCisJCQkJICBzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5ICpjbWQsCisJCQkJICBzaXplX3QgY21kX3NpemUsCisJCQkJICBzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqY29tcCwKKwkJCQkgIHNpemVfdCBjb21wX3NpemUpCit7CisJc3RydWN0IGVuYV9jb21wX2N0eCAqY29tcF9jdHg7CisJaW50IHJldDsKKworCWNvbXBfY3R4ID0gZW5hX2NvbV9zdWJtaXRfYWRtaW5fY21kKGFkbWluX3F1ZXVlLCBjbWQsIGNtZF9zaXplLAorCQkJCQkgICAgY29tcCwgY29tcF9zaXplKTsKKwlpZiAodW5saWtlbHkoSVNfRVJSKGNvbXBfY3R4KSkpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gc3VibWl0IGNvbW1hbmQgWyVsZF1cbiIsIFBUUl9FUlIoY29tcF9jdHgpKTsKKwkJcmV0dXJuIFBUUl9FUlIoY29tcF9jdHgpOworCX0KKworCXJldCA9IGVuYV9jb21fd2FpdF9hbmRfcHJvY2Vzc19hZG1pbl9jcShjb21wX2N0eCwgYWRtaW5fcXVldWUpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCWlmIChhZG1pbl9xdWV1ZS0+cnVubmluZ19zdGF0ZSkKKwkJCXByX2VycigiRmFpbGVkIHRvIHByb2Nlc3MgY29tbWFuZC4gcmV0ID0gJWRcbiIsIHJldCk7CisJCWVsc2UKKwkJCXByX2RlYnVnKCJGYWlsZWQgdG8gcHJvY2VzcyBjb21tYW5kLiByZXQgPSAlZFxuIiwgcmV0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IGVuYV9jb21fY3JlYXRlX2lvX2NxKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSBzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3EpCit7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlID0gJmVuYV9kZXYtPmFkbWluX3F1ZXVlOworCXN0cnVjdCBlbmFfYWRtaW5fYXFfY3JlYXRlX2NxX2NtZCBjcmVhdGVfY21kOworCXN0cnVjdCBlbmFfYWRtaW5fYWNxX2NyZWF0ZV9jcV9yZXNwX2Rlc2MgY21kX2NvbXBsZXRpb247CisJaW50IHJldDsKKworCW1lbXNldCgmY3JlYXRlX2NtZCwgMHgwLCBzaXplb2Yoc3RydWN0IGVuYV9hZG1pbl9hcV9jcmVhdGVfY3FfY21kKSk7CisKKwljcmVhdGVfY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLm9wY29kZSA9IEVOQV9BRE1JTl9DUkVBVEVfQ1E7CisKKwljcmVhdGVfY21kLmNxX2NhcHNfMiB8PSAoaW9fY3EtPmNkZXNjX2VudHJ5X3NpemVfaW5fYnl0ZXMgLyA0KSAmCisJCUVOQV9BRE1JTl9BUV9DUkVBVEVfQ1FfQ01EX0NRX0VOVFJZX1NJWkVfV09SRFNfTUFTSzsKKwljcmVhdGVfY21kLmNxX2NhcHNfMSB8PQorCQlFTkFfQURNSU5fQVFfQ1JFQVRFX0NRX0NNRF9JTlRFUlJVUFRfTU9ERV9FTkFCTEVEX01BU0s7CisKKwljcmVhdGVfY21kLm1zaXhfdmVjdG9yID0gaW9fY3EtPm1zaXhfdmVjdG9yOworCWNyZWF0ZV9jbWQuY3FfZGVwdGggPSBpb19jcS0+cV9kZXB0aDsKKworCXJldCA9IGVuYV9jb21fbWVtX2FkZHJfc2V0KGVuYV9kZXYsCisJCQkJICAgJmNyZWF0ZV9jbWQuY3FfYmEsCisJCQkJICAgaW9fY3EtPmNkZXNjX2FkZHIucGh5c19hZGRyKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlwcl9lcnIoIm1lbW9yeSBhZGRyZXNzIHNldCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGVuYV9jb21fZXhlY3V0ZV9hZG1pbl9jb21tYW5kKGFkbWluX3F1ZXVlLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgKikmY3JlYXRlX2NtZCwKKwkJCQkJICAgIHNpemVvZihjcmVhdGVfY21kKSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqKSZjbWRfY29tcGxldGlvbiwKKwkJCQkJICAgIHNpemVvZihjbWRfY29tcGxldGlvbikpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCXByX2VycigiRmFpbGVkIHRvIGNyZWF0ZSBJTyBDUS4gZXJyb3I6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlvX2NxLT5pZHggPSBjbWRfY29tcGxldGlvbi5jcV9pZHg7CisKKwlpb19jcS0+dW5tYXNrX3JlZyA9ICh1MzIgX19pb21lbSAqKSgodWludHB0cl90KWVuYV9kZXYtPnJlZ19iYXIgKworCQljbWRfY29tcGxldGlvbi5jcV9pbnRlcnJ1cHRfdW5tYXNrX3JlZ2lzdGVyX29mZnNldCk7CisKKwlpZiAoY21kX2NvbXBsZXRpb24uY3FfaGVhZF9kYl9yZWdpc3Rlcl9vZmZzZXQpCisJCWlvX2NxLT5jcV9oZWFkX2RiX3JlZyA9CisJCQkodTMyIF9faW9tZW0gKikoKHVpbnRwdHJfdCllbmFfZGV2LT5yZWdfYmFyICsKKwkJCWNtZF9jb21wbGV0aW9uLmNxX2hlYWRfZGJfcmVnaXN0ZXJfb2Zmc2V0KTsKKworCWlmIChjbWRfY29tcGxldGlvbi5udW1hX25vZGVfcmVnaXN0ZXJfb2Zmc2V0KQorCQlpb19jcS0+bnVtYV9ub2RlX2NmZ19yZWcgPQorCQkJKHUzMiBfX2lvbWVtICopKCh1aW50cHRyX3QpZW5hX2Rldi0+cmVnX2JhciArCisJCQljbWRfY29tcGxldGlvbi5udW1hX25vZGVfcmVnaXN0ZXJfb2Zmc2V0KTsKKworCXByX2RlYnVnKCJjcmVhdGVkIGNxWyV1XSwgZGVwdGhbJXVdXG4iLCBpb19jcS0+aWR4LCBpb19jcS0+cV9kZXB0aCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZW5hX2NvbV9nZXRfaW9faGFuZGxlcnMoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCB1MTYgcWlkLAorCQkJICAgIHN0cnVjdCBlbmFfY29tX2lvX3NxICoqaW9fc3EsCisJCQkgICAgc3RydWN0IGVuYV9jb21faW9fY3EgKippb19jcSkKK3sKKwlpZiAocWlkID49IEVOQV9UT1RBTF9OVU1fUVVFVUVTKSB7CisJCXByX2VycigiSW52YWxpZCBxdWV1ZSBudW1iZXIgJWQgYnV0IHRoZSBtYXggaXMgJWRcbiIsIHFpZCwKKwkJICAgICAgIEVOQV9UT1RBTF9OVU1fUVVFVUVTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJKmlvX3NxID0gJmVuYV9kZXYtPmlvX3NxX3F1ZXVlc1txaWRdOworCSppb19jcSA9ICZlbmFfZGV2LT5pb19jcV9xdWV1ZXNbcWlkXTsKKworCXJldHVybiAwOworfQorCit2b2lkIGVuYV9jb21fYWJvcnRfYWRtaW5fY29tbWFuZHMoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSA9ICZlbmFfZGV2LT5hZG1pbl9xdWV1ZTsKKwlzdHJ1Y3QgZW5hX2NvbXBfY3R4ICpjb21wX2N0eDsKKwl1MTYgaTsKKworCWlmICghYWRtaW5fcXVldWUtPmNvbXBfY3R4KQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRtaW5fcXVldWUtPnFfZGVwdGg7IGkrKykgeworCQljb21wX2N0eCA9IGdldF9jb21wX2N0eHQoYWRtaW5fcXVldWUsIGksIGZhbHNlKTsKKwkJaWYgKHVubGlrZWx5KCFjb21wX2N0eCkpCisJCQlicmVhazsKKworCQljb21wX2N0eC0+c3RhdHVzID0gRU5BX0NNRF9BQk9SVEVEOworCisJCWNvbXBsZXRlKCZjb21wX2N0eC0+d2FpdF9ldmVudCk7CisJfQorfQorCit2b2lkIGVuYV9jb21fd2FpdF9mb3JfYWJvcnRfY29tcGxldGlvbihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlID0gJmVuYV9kZXYtPmFkbWluX3F1ZXVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRtaW5fcXVldWUtPnFfbG9jaywgZmxhZ3MpOworCXdoaWxlIChhdG9taWNfcmVhZCgmYWRtaW5fcXVldWUtPm91dHN0YW5kaW5nX2NtZHMpICE9IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRtaW5fcXVldWUtPnFfbG9jaywgZmxhZ3MpOworCQltc2xlZXAoMjApOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRtaW5fcXVldWUtPnFfbG9jaywgZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZG1pbl9xdWV1ZS0+cV9sb2NrLCBmbGFncyk7Cit9CisKK2ludCBlbmFfY29tX2Rlc3Ryb3lfaW9fY3Eoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICBzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3EpCit7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlID0gJmVuYV9kZXYtPmFkbWluX3F1ZXVlOworCXN0cnVjdCBlbmFfYWRtaW5fYXFfZGVzdHJveV9jcV9jbWQgZGVzdHJveV9jbWQ7CisJc3RydWN0IGVuYV9hZG1pbl9hY3FfZGVzdHJveV9jcV9yZXNwX2Rlc2MgZGVzdHJveV9yZXNwOworCWludCByZXQ7CisKKwltZW1zZXQoJmRlc3Ryb3lfY21kLCAweDAsIHNpemVvZihzdHJ1Y3QgZW5hX2FkbWluX2FxX2Rlc3Ryb3lfc3FfY21kKSk7CisKKwlkZXN0cm95X2NtZC5jcV9pZHggPSBpb19jcS0+aWR4OworCWRlc3Ryb3lfY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLm9wY29kZSA9IEVOQV9BRE1JTl9ERVNUUk9ZX0NROworCisJcmV0ID0gZW5hX2NvbV9leGVjdXRlX2FkbWluX2NvbW1hbmQoYWRtaW5fcXVldWUsCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSAqKSZkZXN0cm95X2NtZCwKKwkJCQkJICAgIHNpemVvZihkZXN0cm95X2NtZCksCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKikmZGVzdHJveV9yZXNwLAorCQkJCQkgICAgc2l6ZW9mKGRlc3Ryb3lfcmVzcCkpOworCisJaWYgKHVubGlrZWx5KHJldCAmJiAocmV0ICE9IC1FTk9ERVYpKSkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gZGVzdHJveSBJTyBDUS4gZXJyb3I6ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworYm9vbCBlbmFfY29tX2dldF9hZG1pbl9ydW5uaW5nX3N0YXRlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlyZXR1cm4gZW5hX2Rldi0+YWRtaW5fcXVldWUucnVubmluZ19zdGF0ZTsKK30KKwordm9pZCBlbmFfY29tX3NldF9hZG1pbl9ydW5uaW5nX3N0YXRlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgYm9vbCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUgPSAmZW5hX2Rldi0+YWRtaW5fcXVldWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZG1pbl9xdWV1ZS0+cV9sb2NrLCBmbGFncyk7CisJZW5hX2Rldi0+YWRtaW5fcXVldWUucnVubmluZ19zdGF0ZSA9IHN0YXRlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkbWluX3F1ZXVlLT5xX2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBlbmFfY29tX2FkbWluX2FlbnFfZW5hYmxlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwl1MTYgZGVwdGggPSBlbmFfZGV2LT5hZW5xLnFfZGVwdGg7CisKKwlXQVJOKGVuYV9kZXYtPmFlbnEuaGVhZCAhPSBkZXB0aCwgIkludmFsaWQgQUVOUSBzdGF0ZVxuIik7CisKKwkvKiBJbml0IGhlYWRfZGIgdG8gbWFyayB0aGF0IGFsbCBlbnRyaWVzIGluIHRoZSBxdWV1ZQorCSAqIGFyZSBpbml0aWFsbHkgYXZhaWxhYmxlCisJICovCisJd3JpdGVsKGRlcHRoLCBlbmFfZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfQUVOUV9IRUFEX0RCX09GRik7Cit9CisKK2ludCBlbmFfY29tX3NldF9hZW5xX2NvbmZpZyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIHUzMiBncm91cHNfZmxhZykKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWU7CisJc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdF9jbWQgY21kOworCXN0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXRfcmVzcCByZXNwOworCXN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfcmVzcCBnZXRfcmVzcDsKKwlpbnQgcmV0OworCisJcmV0ID0gZW5hX2NvbV9nZXRfZmVhdHVyZShlbmFfZGV2LCAmZ2V0X3Jlc3AsIEVOQV9BRE1JTl9BRU5RX0NPTkZJRyk7CisJaWYgKHJldCkgeworCQlwcl9pbmZvKCJDYW4ndCBnZXQgYWVucSBjb25maWd1cmF0aW9uXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoKGdldF9yZXNwLnUuYWVucS5zdXBwb3J0ZWRfZ3JvdXBzICYgZ3JvdXBzX2ZsYWcpICE9IGdyb3Vwc19mbGFnKSB7CisJCXByX3dhcm4oIlRyeWluZyB0byBzZXQgdW5zdXBwb3J0ZWQgYWVucSBldmVudHMuIHN1cHBvcnRlZCBmbGFnOiAleCBhc2tlZCBmbGFnOiAleFxuIiwKKwkJCWdldF9yZXNwLnUuYWVucS5zdXBwb3J0ZWRfZ3JvdXBzLCBncm91cHNfZmxhZyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJbWVtc2V0KCZjbWQsIDB4MCwgc2l6ZW9mKGNtZCkpOworCWFkbWluX3F1ZXVlID0gJmVuYV9kZXYtPmFkbWluX3F1ZXVlOworCisJY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLm9wY29kZSA9IEVOQV9BRE1JTl9TRVRfRkVBVFVSRTsKKwljbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3IuZmxhZ3MgPSAwOworCWNtZC5mZWF0X2NvbW1vbi5mZWF0dXJlX2lkID0gRU5BX0FETUlOX0FFTlFfQ09ORklHOworCWNtZC51LmFlbnEuZW5hYmxlZF9ncm91cHMgPSBncm91cHNfZmxhZzsKKworCXJldCA9IGVuYV9jb21fZXhlY3V0ZV9hZG1pbl9jb21tYW5kKGFkbWluX3F1ZXVlLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgKikmY21kLAorCQkJCQkgICAgc2l6ZW9mKGNtZCksCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKikmcmVzcCwKKwkJCQkJICAgIHNpemVvZihyZXNwKSk7CisKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gY29uZmlnIEFFTlEgcmV0OiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBlbmFfY29tX2dldF9kbWFfd2lkdGgoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXUzMiBjYXBzID0gZW5hX2NvbV9yZWdfYmFyX3JlYWQzMihlbmFfZGV2LCBFTkFfUkVHU19DQVBTX09GRik7CisJaW50IHdpZHRoOworCisJaWYgKHVubGlrZWx5KGNhcHMgPT0gRU5BX01NSU9fUkVBRF9USU1FT1VUKSkgeworCQlwcl9lcnIoIlJlZyByZWFkIHRpbWVvdXQgb2NjdXJyZWRcbiIpOworCQlyZXR1cm4gLUVUSU1FOworCX0KKworCXdpZHRoID0gKGNhcHMgJiBFTkFfUkVHU19DQVBTX0RNQV9BRERSX1dJRFRIX01BU0spID4+CisJCUVOQV9SRUdTX0NBUFNfRE1BX0FERFJfV0lEVEhfU0hJRlQ7CisKKwlwcl9kZWJ1ZygiRU5BIGRtYSB3aWR0aDogJWRcbiIsIHdpZHRoKTsKKworCWlmICgod2lkdGggPCAzMikgfHwgd2lkdGggPiBFTkFfTUFYX1BIWVNfQUREUl9TSVpFX0JJVFMpIHsKKwkJcHJfZXJyKCJETUEgd2lkdGggaWxsZWdhbCB2YWx1ZTogJWRcbiIsIHdpZHRoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZW5hX2Rldi0+ZG1hX2FkZHJfYml0cyA9IHdpZHRoOworCisJcmV0dXJuIHdpZHRoOworfQorCitpbnQgZW5hX2NvbV92YWxpZGF0ZV92ZXJzaW9uKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwl1MzIgdmVyOworCXUzMiBjdHJsX3ZlcjsKKwl1MzIgY3RybF92ZXJfbWFza2VkOworCisJLyogTWFrZSBzdXJlIHRoZSBFTkEgdmVyc2lvbiBhbmQgdGhlIGNvbnRyb2xsZXIgdmVyc2lvbiBhcmUgYXQgbGVhc3QKKwkgKiBhcyB0aGUgZHJpdmVyIGV4cGVjdHMKKwkgKi8KKwl2ZXIgPSBlbmFfY29tX3JlZ19iYXJfcmVhZDMyKGVuYV9kZXYsIEVOQV9SRUdTX1ZFUlNJT05fT0ZGKTsKKwljdHJsX3ZlciA9IGVuYV9jb21fcmVnX2Jhcl9yZWFkMzIoZW5hX2RldiwKKwkJCQkJICBFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fT0ZGKTsKKworCWlmICh1bmxpa2VseSgodmVyID09IEVOQV9NTUlPX1JFQURfVElNRU9VVCkgfHwKKwkJICAgICAoY3RybF92ZXIgPT0gRU5BX01NSU9fUkVBRF9USU1FT1VUKSkpIHsKKwkJcHJfZXJyKCJSZWcgcmVhZCB0aW1lb3V0IG9jY3VycmVkXG4iKTsKKwkJcmV0dXJuIC1FVElNRTsKKwl9CisKKwlwcl9pbmZvKCJlbmEgZGV2aWNlIHZlcnNpb246ICVkLiVkXG4iLAorCQkodmVyICYgRU5BX1JFR1NfVkVSU0lPTl9NQUpPUl9WRVJTSU9OX01BU0spID4+CisJCQlFTkFfUkVHU19WRVJTSU9OX01BSk9SX1ZFUlNJT05fU0hJRlQsCisJCXZlciAmIEVOQV9SRUdTX1ZFUlNJT05fTUlOT1JfVkVSU0lPTl9NQVNLKTsKKworCWlmICh2ZXIgPCBNSU5fRU5BX1ZFUikgeworCQlwcl9lcnIoIkVOQSB2ZXJzaW9uIGlzIGxvd2VyIHRoYW4gdGhlIG1pbmltYWwgdmVyc2lvbiB0aGUgZHJpdmVyIHN1cHBvcnRzXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXByX2luZm8oImVuYSBjb250cm9sbGVyIHZlcnNpb246ICVkLiVkLiVkIGltcGxlbWVudGF0aW9uIHZlcnNpb24gJWRcbiIsCisJCShjdHJsX3ZlciAmIEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9NQUpPUl9WRVJTSU9OX01BU0spID4+CisJCQlFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fTUFKT1JfVkVSU0lPTl9TSElGVCwKKwkJKGN0cmxfdmVyICYgRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX01JTk9SX1ZFUlNJT05fTUFTSykgPj4KKwkJCUVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9NSU5PUl9WRVJTSU9OX1NISUZULAorCQkoY3RybF92ZXIgJiBFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fU1VCTUlOT1JfVkVSU0lPTl9NQVNLKSwKKwkJKGN0cmxfdmVyICYgRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX0lNUExfSURfTUFTSykgPj4KKwkJCUVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9JTVBMX0lEX1NISUZUKTsKKworCWN0cmxfdmVyX21hc2tlZCA9CisJCShjdHJsX3ZlciAmIEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9NQUpPUl9WRVJTSU9OX01BU0spIHwKKwkJKGN0cmxfdmVyICYgRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX01JTk9SX1ZFUlNJT05fTUFTSykgfAorCQkoY3RybF92ZXIgJiBFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fU1VCTUlOT1JfVkVSU0lPTl9NQVNLKTsKKworCS8qIFZhbGlkYXRlIHRoZSBjdHJsIHZlcnNpb24gd2l0aG91dCB0aGUgaW1wbGVtZW50YXRpb24gSUQgKi8KKwlpZiAoY3RybF92ZXJfbWFza2VkIDwgTUlOX0VOQV9DVFJMX1ZFUikgeworCQlwcl9lcnIoIkVOQSBjdHJsIHZlcnNpb24gaXMgbG93ZXIgdGhhbiB0aGUgbWluaW1hbCBjdHJsIHZlcnNpb24gdGhlIGRyaXZlciBzdXBwb3J0c1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlbmFfY29tX2FkbWluX2Rlc3Ryb3koc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSA9ICZlbmFfZGV2LT5hZG1pbl9xdWV1ZTsKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9jcSAqY3EgPSAmYWRtaW5fcXVldWUtPmNxOworCXN0cnVjdCBlbmFfY29tX2FkbWluX3NxICpzcSA9ICZhZG1pbl9xdWV1ZS0+c3E7CisJc3RydWN0IGVuYV9jb21fYWVucSAqYWVucSA9ICZlbmFfZGV2LT5hZW5xOworCXUxNiBzaXplOworCisJaWYgKGFkbWluX3F1ZXVlLT5jb21wX2N0eCkKKwkJZGV2bV9rZnJlZShlbmFfZGV2LT5kbWFkZXYsIGFkbWluX3F1ZXVlLT5jb21wX2N0eCk7CisJYWRtaW5fcXVldWUtPmNvbXBfY3R4ID0gTlVMTDsKKwlzaXplID0gQURNSU5fU1FfU0laRShhZG1pbl9xdWV1ZS0+cV9kZXB0aCk7CisJaWYgKHNxLT5lbnRyaWVzKQorCQlkbWFfZnJlZV9jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIHNpemUsIHNxLT5lbnRyaWVzLAorCQkJCSAgc3EtPmRtYV9hZGRyKTsKKwlzcS0+ZW50cmllcyA9IE5VTEw7CisKKwlzaXplID0gQURNSU5fQ1FfU0laRShhZG1pbl9xdWV1ZS0+cV9kZXB0aCk7CisJaWYgKGNxLT5lbnRyaWVzKQorCQlkbWFfZnJlZV9jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIHNpemUsIGNxLT5lbnRyaWVzLAorCQkJCSAgY3EtPmRtYV9hZGRyKTsKKwljcS0+ZW50cmllcyA9IE5VTEw7CisKKwlzaXplID0gQURNSU5fQUVOUV9TSVpFKGFlbnEtPnFfZGVwdGgpOworCWlmIChlbmFfZGV2LT5hZW5xLmVudHJpZXMpCisJCWRtYV9mcmVlX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgc2l6ZSwgYWVucS0+ZW50cmllcywKKwkJCQkgIGFlbnEtPmRtYV9hZGRyKTsKKwlhZW5xLT5lbnRyaWVzID0gTlVMTDsKK30KKwordm9pZCBlbmFfY29tX3NldF9hZG1pbl9wb2xsaW5nX21vZGUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCBib29sIHBvbGxpbmcpCit7CisJZW5hX2Rldi0+YWRtaW5fcXVldWUucG9sbGluZyA9IHBvbGxpbmc7Cit9CisKK2ludCBlbmFfY29tX21taW9fcmVnX3JlYWRfcmVxdWVzdF9pbml0KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9tbWlvX3JlYWQgKm1taW9fcmVhZCA9ICZlbmFfZGV2LT5tbWlvX3JlYWQ7CisKKwlzcGluX2xvY2tfaW5pdCgmbW1pb19yZWFkLT5sb2NrKTsKKwltbWlvX3JlYWQtPnJlYWRfcmVzcCA9CisJCWRtYV96YWxsb2NfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LAorCQkJCSAgICBzaXplb2YoKm1taW9fcmVhZC0+cmVhZF9yZXNwKSwKKwkJCQkgICAgJm1taW9fcmVhZC0+cmVhZF9yZXNwX2RtYV9hZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIW1taW9fcmVhZC0+cmVhZF9yZXNwKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbmFfY29tX21taW9fcmVnX3JlYWRfcmVxdWVzdF93cml0ZV9kZXZfYWRkcihlbmFfZGV2KTsKKworCW1taW9fcmVhZC0+cmVhZF9yZXNwLT5yZXFfaWQgPSAweDA7CisJbW1pb19yZWFkLT5zZXFfbnVtID0gMHgwOworCW1taW9fcmVhZC0+cmVhZGxlc3Nfc3VwcG9ydGVkID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCit2b2lkIGVuYV9jb21fc2V0X21taW9fcmVhZF9tb2RlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgYm9vbCByZWFkbGVzc19zdXBwb3J0ZWQpCit7CisJc3RydWN0IGVuYV9jb21fbW1pb19yZWFkICptbWlvX3JlYWQgPSAmZW5hX2Rldi0+bW1pb19yZWFkOworCisJbW1pb19yZWFkLT5yZWFkbGVzc19zdXBwb3J0ZWQgPSByZWFkbGVzc19zdXBwb3J0ZWQ7Cit9CisKK3ZvaWQgZW5hX2NvbV9tbWlvX3JlZ19yZWFkX3JlcXVlc3RfZGVzdHJveShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9jb21fbW1pb19yZWFkICptbWlvX3JlYWQgPSAmZW5hX2Rldi0+bW1pb19yZWFkOworCisJd3JpdGVsKDB4MCwgZW5hX2Rldi0+cmVnX2JhciArIEVOQV9SRUdTX01NSU9fUkVTUF9MT19PRkYpOworCXdyaXRlbCgweDAsIGVuYV9kZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19NTUlPX1JFU1BfSElfT0ZGKTsKKworCWRtYV9mcmVlX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgc2l6ZW9mKCptbWlvX3JlYWQtPnJlYWRfcmVzcCksCisJCQkgIG1taW9fcmVhZC0+cmVhZF9yZXNwLCBtbWlvX3JlYWQtPnJlYWRfcmVzcF9kbWFfYWRkcik7CisKKwltbWlvX3JlYWQtPnJlYWRfcmVzcCA9IE5VTEw7Cit9CisKK3ZvaWQgZW5hX2NvbV9tbWlvX3JlZ19yZWFkX3JlcXVlc3Rfd3JpdGVfZGV2X2FkZHIoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfY29tX21taW9fcmVhZCAqbW1pb19yZWFkID0gJmVuYV9kZXYtPm1taW9fcmVhZDsKKwl1MzIgYWRkcl9sb3csIGFkZHJfaGlnaDsKKworCWFkZHJfbG93ID0gRU5BX0RNQV9BRERSX1RPX1VJTlQzMl9MT1cobW1pb19yZWFkLT5yZWFkX3Jlc3BfZG1hX2FkZHIpOworCWFkZHJfaGlnaCA9IEVOQV9ETUFfQUREUl9UT19VSU5UMzJfSElHSChtbWlvX3JlYWQtPnJlYWRfcmVzcF9kbWFfYWRkcik7CisKKwl3cml0ZWwoYWRkcl9sb3csIGVuYV9kZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19NTUlPX1JFU1BfTE9fT0ZGKTsKKwl3cml0ZWwoYWRkcl9oaWdoLCBlbmFfZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfTU1JT19SRVNQX0hJX09GRik7Cit9CisKK2ludCBlbmFfY29tX2FkbWluX2luaXQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkgICAgICAgc3RydWN0IGVuYV9hZW5xX2hhbmRsZXJzICphZW5xX2hhbmRsZXJzLAorCQkgICAgICAgYm9vbCBpbml0X3NwaW5sb2NrKQoreworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSA9ICZlbmFfZGV2LT5hZG1pbl9xdWV1ZTsKKwl1MzIgYXFfY2FwcywgYWNxX2NhcHMsIGRldl9zdHMsIGFkZHJfbG93LCBhZGRyX2hpZ2g7CisJaW50IHJldDsKKworCWRldl9zdHMgPSBlbmFfY29tX3JlZ19iYXJfcmVhZDMyKGVuYV9kZXYsIEVOQV9SRUdTX0RFVl9TVFNfT0ZGKTsKKworCWlmICh1bmxpa2VseShkZXZfc3RzID09IEVOQV9NTUlPX1JFQURfVElNRU9VVCkpIHsKKwkJcHJfZXJyKCJSZWcgcmVhZCB0aW1lb3V0IG9jY3VycmVkXG4iKTsKKwkJcmV0dXJuIC1FVElNRTsKKwl9CisKKwlpZiAoIShkZXZfc3RzICYgRU5BX1JFR1NfREVWX1NUU19SRUFEWV9NQVNLKSkgeworCQlwcl9lcnIoIkRldmljZSBpc24ndCByZWFkeSwgYWJvcnQgY29tIGluaXRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlhZG1pbl9xdWV1ZS0+cV9kZXB0aCA9IEVOQV9BRE1JTl9RVUVVRV9ERVBUSDsKKworCWFkbWluX3F1ZXVlLT5xX2RtYWRldiA9IGVuYV9kZXYtPmRtYWRldjsKKwlhZG1pbl9xdWV1ZS0+cG9sbGluZyA9IGZhbHNlOworCWFkbWluX3F1ZXVlLT5jdXJyX2NtZF9pZCA9IDA7CisKKwlhdG9taWNfc2V0KCZhZG1pbl9xdWV1ZS0+b3V0c3RhbmRpbmdfY21kcywgMCk7CisKKwlpZiAoaW5pdF9zcGlubG9jaykKKwkJc3Bpbl9sb2NrX2luaXQoJmFkbWluX3F1ZXVlLT5xX2xvY2spOworCisJcmV0ID0gZW5hX2NvbV9pbml0X2NvbXBfY3R4dChhZG1pbl9xdWV1ZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IGVuYV9jb21fYWRtaW5faW5pdF9zcShhZG1pbl9xdWV1ZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IGVuYV9jb21fYWRtaW5faW5pdF9jcShhZG1pbl9xdWV1ZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCWFkbWluX3F1ZXVlLT5zcS5kYl9hZGRyID0gKHUzMiBfX2lvbWVtICopKCh1aW50cHRyX3QpZW5hX2Rldi0+cmVnX2JhciArCisJCUVOQV9SRUdTX0FRX0RCX09GRik7CisKKwlhZGRyX2xvdyA9IEVOQV9ETUFfQUREUl9UT19VSU5UMzJfTE9XKGFkbWluX3F1ZXVlLT5zcS5kbWFfYWRkcik7CisJYWRkcl9oaWdoID0gRU5BX0RNQV9BRERSX1RPX1VJTlQzMl9ISUdIKGFkbWluX3F1ZXVlLT5zcS5kbWFfYWRkcik7CisKKwl3cml0ZWwoYWRkcl9sb3csIGVuYV9kZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19BUV9CQVNFX0xPX09GRik7CisJd3JpdGVsKGFkZHJfaGlnaCwgZW5hX2Rldi0+cmVnX2JhciArIEVOQV9SRUdTX0FRX0JBU0VfSElfT0ZGKTsKKworCWFkZHJfbG93ID0gRU5BX0RNQV9BRERSX1RPX1VJTlQzMl9MT1coYWRtaW5fcXVldWUtPmNxLmRtYV9hZGRyKTsKKwlhZGRyX2hpZ2ggPSBFTkFfRE1BX0FERFJfVE9fVUlOVDMyX0hJR0goYWRtaW5fcXVldWUtPmNxLmRtYV9hZGRyKTsKKworCXdyaXRlbChhZGRyX2xvdywgZW5hX2Rldi0+cmVnX2JhciArIEVOQV9SRUdTX0FDUV9CQVNFX0xPX09GRik7CisJd3JpdGVsKGFkZHJfaGlnaCwgZW5hX2Rldi0+cmVnX2JhciArIEVOQV9SRUdTX0FDUV9CQVNFX0hJX09GRik7CisKKwlhcV9jYXBzID0gMDsKKwlhcV9jYXBzIHw9IGFkbWluX3F1ZXVlLT5xX2RlcHRoICYgRU5BX1JFR1NfQVFfQ0FQU19BUV9ERVBUSF9NQVNLOworCWFxX2NhcHMgfD0gKHNpemVvZihzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5KSA8PAorCQkJRU5BX1JFR1NfQVFfQ0FQU19BUV9FTlRSWV9TSVpFX1NISUZUKSAmCisJCQlFTkFfUkVHU19BUV9DQVBTX0FRX0VOVFJZX1NJWkVfTUFTSzsKKworCWFjcV9jYXBzID0gMDsKKwlhY3FfY2FwcyB8PSBhZG1pbl9xdWV1ZS0+cV9kZXB0aCAmIEVOQV9SRUdTX0FDUV9DQVBTX0FDUV9ERVBUSF9NQVNLOworCWFjcV9jYXBzIHw9IChzaXplb2Yoc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkpIDw8CisJCUVOQV9SRUdTX0FDUV9DQVBTX0FDUV9FTlRSWV9TSVpFX1NISUZUKSAmCisJCUVOQV9SRUdTX0FDUV9DQVBTX0FDUV9FTlRSWV9TSVpFX01BU0s7CisKKwl3cml0ZWwoYXFfY2FwcywgZW5hX2Rldi0+cmVnX2JhciArIEVOQV9SRUdTX0FRX0NBUFNfT0ZGKTsKKwl3cml0ZWwoYWNxX2NhcHMsIGVuYV9kZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19BQ1FfQ0FQU19PRkYpOworCXJldCA9IGVuYV9jb21fYWRtaW5faW5pdF9hZW5xKGVuYV9kZXYsIGFlbnFfaGFuZGxlcnMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlhZG1pbl9xdWV1ZS0+cnVubmluZ19zdGF0ZSA9IHRydWU7CisKKwlyZXR1cm4gMDsKK2Vycm9yOgorCWVuYV9jb21fYWRtaW5fZGVzdHJveShlbmFfZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBlbmFfY29tX2NyZWF0ZV9pb19xdWV1ZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgc3RydWN0IGVuYV9jb21fY3JlYXRlX2lvX2N0eCAqY3R4KQoreworCXN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcTsKKwlzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3E7CisJaW50IHJldDsKKworCWlmIChjdHgtPnFpZCA+PSBFTkFfVE9UQUxfTlVNX1FVRVVFUykgeworCQlwcl9lcnIoIlFpZCAoJWQpIGlzIGJpZ2dlciB0aGFuIG1heCBudW0gb2YgcXVldWVzICglZClcbiIsCisJCSAgICAgICBjdHgtPnFpZCwgRU5BX1RPVEFMX05VTV9RVUVVRVMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpb19zcSA9ICZlbmFfZGV2LT5pb19zcV9xdWV1ZXNbY3R4LT5xaWRdOworCWlvX2NxID0gJmVuYV9kZXYtPmlvX2NxX3F1ZXVlc1tjdHgtPnFpZF07CisKKwltZW1zZXQoaW9fc3EsIDB4MCwgc2l6ZW9mKHN0cnVjdCBlbmFfY29tX2lvX3NxKSk7CisJbWVtc2V0KGlvX2NxLCAweDAsIHNpemVvZihzdHJ1Y3QgZW5hX2NvbV9pb19jcSkpOworCisJLyogSW5pdCBDUSAqLworCWlvX2NxLT5xX2RlcHRoID0gY3R4LT5xdWV1ZV9zaXplOworCWlvX2NxLT5kaXJlY3Rpb24gPSBjdHgtPmRpcmVjdGlvbjsKKwlpb19jcS0+cWlkID0gY3R4LT5xaWQ7CisKKwlpb19jcS0+bXNpeF92ZWN0b3IgPSBjdHgtPm1zaXhfdmVjdG9yOworCisJaW9fc3EtPnFfZGVwdGggPSBjdHgtPnF1ZXVlX3NpemU7CisJaW9fc3EtPmRpcmVjdGlvbiA9IGN0eC0+ZGlyZWN0aW9uOworCWlvX3NxLT5xaWQgPSBjdHgtPnFpZDsKKworCWlvX3NxLT5tZW1fcXVldWVfdHlwZSA9IGN0eC0+bWVtX3F1ZXVlX3R5cGU7CisKKwlpZiAoY3R4LT5kaXJlY3Rpb24gPT0gRU5BX0NPTV9JT19RVUVVRV9ESVJFQ1RJT05fVFgpCisJCS8qIGhlYWRlciBsZW5ndGggaXMgbGltaXRlZCB0byA4IGJpdHMgKi8KKwkJaW9fc3EtPnR4X21heF9oZWFkZXJfc2l6ZSA9CisJCQltaW5fdCh1MzIsIGVuYV9kZXYtPnR4X21heF9oZWFkZXJfc2l6ZSwgU1pfMjU2KTsKKworCXJldCA9IGVuYV9jb21faW5pdF9pb19zcShlbmFfZGV2LCBjdHgsIGlvX3NxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCXJldCA9IGVuYV9jb21faW5pdF9pb19jcShlbmFfZGV2LCBjdHgsIGlvX2NxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gZW5hX2NvbV9jcmVhdGVfaW9fY3EoZW5hX2RldiwgaW9fY3EpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBlbmFfY29tX2NyZWF0ZV9pb19zcShlbmFfZGV2LCBpb19zcSwgaW9fY3EtPmlkeCk7CisJaWYgKHJldCkKKwkJZ290byBkZXN0cm95X2lvX2NxOworCisJcmV0dXJuIDA7CisKK2Rlc3Ryb3lfaW9fY3E6CisJZW5hX2NvbV9kZXN0cm95X2lvX2NxKGVuYV9kZXYsIGlvX2NxKTsKK2Vycm9yOgorCWVuYV9jb21faW9fcXVldWVfZnJlZShlbmFfZGV2LCBpb19zcSwgaW9fY3EpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgZW5hX2NvbV9kZXN0cm95X2lvX3F1ZXVlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgdTE2IHFpZCkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3E7CisJc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxOworCisJaWYgKHFpZCA+PSBFTkFfVE9UQUxfTlVNX1FVRVVFUykgeworCQlwcl9lcnIoIlFpZCAoJWQpIGlzIGJpZ2dlciB0aGFuIG1heCBudW0gb2YgcXVldWVzICglZClcbiIsIHFpZCwKKwkJICAgICAgIEVOQV9UT1RBTF9OVU1fUVVFVUVTKTsKKwkJcmV0dXJuOworCX0KKworCWlvX3NxID0gJmVuYV9kZXYtPmlvX3NxX3F1ZXVlc1txaWRdOworCWlvX2NxID0gJmVuYV9kZXYtPmlvX2NxX3F1ZXVlc1txaWRdOworCisJZW5hX2NvbV9kZXN0cm95X2lvX3NxKGVuYV9kZXYsIGlvX3NxKTsKKwllbmFfY29tX2Rlc3Ryb3lfaW9fY3EoZW5hX2RldiwgaW9fY3EpOworCisJZW5hX2NvbV9pb19xdWV1ZV9mcmVlKGVuYV9kZXYsIGlvX3NxLCBpb19jcSk7Cit9CisKK2ludCBlbmFfY29tX2dldF9saW5rX3BhcmFtcyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9yZXNwICpyZXNwKQoreworCXJldHVybiBlbmFfY29tX2dldF9mZWF0dXJlKGVuYV9kZXYsIHJlc3AsIEVOQV9BRE1JTl9MSU5LX0NPTkZJRyk7Cit9CisKK2ludCBlbmFfY29tX2dldF9kZXZfYXR0cl9mZWF0KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICAgIHN0cnVjdCBlbmFfY29tX2Rldl9nZXRfZmVhdHVyZXNfY3R4ICpnZXRfZmVhdF9jdHgpCit7CisJc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9yZXNwIGdldF9yZXNwOworCWludCByYzsKKworCXJjID0gZW5hX2NvbV9nZXRfZmVhdHVyZShlbmFfZGV2LCAmZ2V0X3Jlc3AsCisJCQkJIEVOQV9BRE1JTl9ERVZJQ0VfQVRUUklCVVRFUyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwltZW1jcHkoJmdldF9mZWF0X2N0eC0+ZGV2X2F0dHIsICZnZXRfcmVzcC51LmRldl9hdHRyLAorCSAgICAgICBzaXplb2YoZ2V0X3Jlc3AudS5kZXZfYXR0cikpOworCWVuYV9kZXYtPnN1cHBvcnRlZF9mZWF0dXJlcyA9IGdldF9yZXNwLnUuZGV2X2F0dHIuc3VwcG9ydGVkX2ZlYXR1cmVzOworCisJcmMgPSBlbmFfY29tX2dldF9mZWF0dXJlKGVuYV9kZXYsICZnZXRfcmVzcCwKKwkJCQkgRU5BX0FETUlOX01BWF9RVUVVRVNfTlVNKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCW1lbWNweSgmZ2V0X2ZlYXRfY3R4LT5tYXhfcXVldWVzLCAmZ2V0X3Jlc3AudS5tYXhfcXVldWUsCisJICAgICAgIHNpemVvZihnZXRfcmVzcC51Lm1heF9xdWV1ZSkpOworCWVuYV9kZXYtPnR4X21heF9oZWFkZXJfc2l6ZSA9IGdldF9yZXNwLnUubWF4X3F1ZXVlLm1heF9oZWFkZXJfc2l6ZTsKKworCXJjID0gZW5hX2NvbV9nZXRfZmVhdHVyZShlbmFfZGV2LCAmZ2V0X3Jlc3AsCisJCQkJIEVOQV9BRE1JTl9BRU5RX0NPTkZJRyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwltZW1jcHkoJmdldF9mZWF0X2N0eC0+YWVucSwgJmdldF9yZXNwLnUuYWVucSwKKwkgICAgICAgc2l6ZW9mKGdldF9yZXNwLnUuYWVucSkpOworCisJcmMgPSBlbmFfY29tX2dldF9mZWF0dXJlKGVuYV9kZXYsICZnZXRfcmVzcCwKKwkJCQkgRU5BX0FETUlOX1NUQVRFTEVTU19PRkZMT0FEX0NPTkZJRyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwltZW1jcHkoJmdldF9mZWF0X2N0eC0+b2ZmbG9hZCwgJmdldF9yZXNwLnUub2ZmbG9hZCwKKwkgICAgICAgc2l6ZW9mKGdldF9yZXNwLnUub2ZmbG9hZCkpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZW5hX2NvbV9hZG1pbl9xX2NvbXBfaW50cl9oYW5kbGVyKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwllbmFfY29tX2hhbmRsZV9hZG1pbl9jb21wbGV0aW9uKCZlbmFfZGV2LT5hZG1pbl9xdWV1ZSk7Cit9CisKKy8qIGVuYV9oYW5kbGVfc3BlY2lmaWNfYWVucV9ldmVudDoKKyAqIHJldHVybiB0aGUgaGFuZGxlciB0aGF0IGlzIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpYyBldmVudCBncm91cAorICovCitzdGF0aWMgZW5hX2FlbnFfaGFuZGxlciBlbmFfY29tX2dldF9zcGVjaWZpY19hZW5xX2NiKHN0cnVjdCBlbmFfY29tX2RldiAqZGV2LAorCQkJCQkJICAgICB1MTYgZ3JvdXApCit7CisJc3RydWN0IGVuYV9hZW5xX2hhbmRsZXJzICphZW5xX2hhbmRsZXJzID0gZGV2LT5hZW5xLmFlbnFfaGFuZGxlcnM7CisKKwlpZiAoKGdyb3VwIDwgRU5BX01BWF9IQU5ETEVSUykgJiYgYWVucV9oYW5kbGVycy0+aGFuZGxlcnNbZ3JvdXBdKQorCQlyZXR1cm4gYWVucV9oYW5kbGVycy0+aGFuZGxlcnNbZ3JvdXBdOworCisJcmV0dXJuIGFlbnFfaGFuZGxlcnMtPnVuaW1wbGVtZW50ZWRfaGFuZGxlcjsKK30KKworLyogZW5hX2FlbnFfaW50cl9oYW5kbGVyOgorICogaGFuZGxlcyB0aGUgYWVucSBpbmNvbWluZyBldmVudHMuCisgKiBwb3AgZXZlbnRzIGZyb20gdGhlIHF1ZXVlIGFuZCBhcHBseSB0aGUgc3BlY2lmaWMgaGFuZGxlcgorICovCit2b2lkIGVuYV9jb21fYWVucV9pbnRyX2hhbmRsZXIoc3RydWN0IGVuYV9jb21fZGV2ICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGVuYV9hZG1pbl9hZW5xX2VudHJ5ICphZW5xX2U7CisJc3RydWN0IGVuYV9hZG1pbl9hZW5xX2NvbW1vbl9kZXNjICphZW5xX2NvbW1vbjsKKwlzdHJ1Y3QgZW5hX2NvbV9hZW5xICphZW5xICA9ICZkZXYtPmFlbnE7CisJZW5hX2FlbnFfaGFuZGxlciBoYW5kbGVyX2NiOworCXUxNiBtYXNrZWRfaGVhZCwgcHJvY2Vzc2VkID0gMDsKKwl1OCBwaGFzZTsKKworCW1hc2tlZF9oZWFkID0gYWVucS0+aGVhZCAmIChhZW5xLT5xX2RlcHRoIC0gMSk7CisJcGhhc2UgPSBhZW5xLT5waGFzZTsKKwlhZW5xX2UgPSAmYWVucS0+ZW50cmllc1ttYXNrZWRfaGVhZF07IC8qIEdldCBmaXJzdCBlbnRyeSAqLworCWFlbnFfY29tbW9uID0gJmFlbnFfZS0+YWVucV9jb21tb25fZGVzYzsKKworCS8qIEdvIG92ZXIgYWxsIHRoZSBldmVudHMgKi8KKwl3aGlsZSAoKGFlbnFfY29tbW9uLT5mbGFncyAmIEVOQV9BRE1JTl9BRU5RX0NPTU1PTl9ERVNDX1BIQVNFX01BU0spID09CisJICAgICAgIHBoYXNlKSB7CisJCXByX2RlYnVnKCJBRU5RISBHcm91cFsleF0gU3luZHJvbVsleF0gdGltZXN0YW1wOiBbJWxsdXNdXG4iLAorCQkJIGFlbnFfY29tbW9uLT5ncm91cCwgYWVucV9jb21tb24tPnN5bmRyb20sCisJCQkgKHU2NClhZW5xX2NvbW1vbi0+dGltZXN0YW1wX2xvdyArCisJCQkJICgodTY0KWFlbnFfY29tbW9uLT50aW1lc3RhbXBfaGlnaCA8PCAzMikpOworCisJCS8qIEhhbmRsZSBzcGVjaWZpYyBldmVudCovCisJCWhhbmRsZXJfY2IgPSBlbmFfY29tX2dldF9zcGVjaWZpY19hZW5xX2NiKGRldiwKKwkJCQkJCQkgIGFlbnFfY29tbW9uLT5ncm91cCk7CisJCWhhbmRsZXJfY2IoZGF0YSwgYWVucV9lKTsgLyogY2FsbCB0aGUgYWN0dWFsIGV2ZW50IGhhbmRsZXIqLworCisJCS8qIEdldCBuZXh0IGV2ZW50IGVudHJ5ICovCisJCW1hc2tlZF9oZWFkKys7CisJCXByb2Nlc3NlZCsrOworCisJCWlmICh1bmxpa2VseShtYXNrZWRfaGVhZCA9PSBhZW5xLT5xX2RlcHRoKSkgeworCQkJbWFza2VkX2hlYWQgPSAwOworCQkJcGhhc2UgPSAhcGhhc2U7CisJCX0KKwkJYWVucV9lID0gJmFlbnEtPmVudHJpZXNbbWFza2VkX2hlYWRdOworCQlhZW5xX2NvbW1vbiA9ICZhZW5xX2UtPmFlbnFfY29tbW9uX2Rlc2M7CisJfQorCisJYWVucS0+aGVhZCArPSBwcm9jZXNzZWQ7CisJYWVucS0+cGhhc2UgPSBwaGFzZTsKKworCS8qIERvbid0IHVwZGF0ZSBhZW5xIGRvb3JiZWxsIGlmIHRoZXJlIHdlcmVuJ3QgYW55IHByb2Nlc3NlZCBldmVudHMgKi8KKwlpZiAoIXByb2Nlc3NlZCkKKwkJcmV0dXJuOworCisJLyogd3JpdGUgdGhlIGFlbnEgZG9vcmJlbGwgYWZ0ZXIgYWxsIEFFTlEgZGVzY3JpcHRvcnMgd2VyZSByZWFkICovCisJbWIoKTsKKwl3cml0ZWwoKHUzMilhZW5xLT5oZWFkLCBkZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19BRU5RX0hFQURfREJfT0ZGKTsKK30KKworaW50IGVuYV9jb21fZGV2X3Jlc2V0KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwl1MzIgc3RhdCwgdGltZW91dCwgY2FwLCByZXNldF92YWw7CisJaW50IHJjOworCisJc3RhdCA9IGVuYV9jb21fcmVnX2Jhcl9yZWFkMzIoZW5hX2RldiwgRU5BX1JFR1NfREVWX1NUU19PRkYpOworCWNhcCA9IGVuYV9jb21fcmVnX2Jhcl9yZWFkMzIoZW5hX2RldiwgRU5BX1JFR1NfQ0FQU19PRkYpOworCisJaWYgKHVubGlrZWx5KChzdGF0ID09IEVOQV9NTUlPX1JFQURfVElNRU9VVCkgfHwKKwkJICAgICAoY2FwID09IEVOQV9NTUlPX1JFQURfVElNRU9VVCkpKSB7CisJCXByX2VycigiUmVnIHJlYWQzMiB0aW1lb3V0IG9jY3VycmVkXG4iKTsKKwkJcmV0dXJuIC1FVElNRTsKKwl9CisKKwlpZiAoKHN0YXQgJiBFTkFfUkVHU19ERVZfU1RTX1JFQURZX01BU0spID09IDApIHsKKwkJcHJfZXJyKCJEZXZpY2UgaXNuJ3QgcmVhZHksIGNhbid0IHJlc2V0IGRldmljZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRpbWVvdXQgPSAoY2FwICYgRU5BX1JFR1NfQ0FQU19SRVNFVF9USU1FT1VUX01BU0spID4+CisJCQlFTkFfUkVHU19DQVBTX1JFU0VUX1RJTUVPVVRfU0hJRlQ7CisJaWYgKHRpbWVvdXQgPT0gMCkgeworCQlwcl9lcnIoIkludmFsaWQgdGltZW91dCB2YWx1ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHN0YXJ0IHJlc2V0ICovCisJcmVzZXRfdmFsID0gRU5BX1JFR1NfREVWX0NUTF9ERVZfUkVTRVRfTUFTSzsKKwl3cml0ZWwocmVzZXRfdmFsLCBlbmFfZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfREVWX0NUTF9PRkYpOworCisJLyogV3JpdGUgYWdhaW4gdGhlIE1NSU8gcmVhZCByZXF1ZXN0IGFkZHJlc3MgKi8KKwllbmFfY29tX21taW9fcmVnX3JlYWRfcmVxdWVzdF93cml0ZV9kZXZfYWRkcihlbmFfZGV2KTsKKworCXJjID0gd2FpdF9mb3JfcmVzZXRfc3RhdGUoZW5hX2RldiwgdGltZW91dCwKKwkJCQkgIEVOQV9SRUdTX0RFVl9TVFNfUkVTRVRfSU5fUFJPR1JFU1NfTUFTSyk7CisJaWYgKHJjICE9IDApIHsKKwkJcHJfZXJyKCJSZXNldCBpbmRpY2F0aW9uIGRpZG4ndCB0dXJuIG9uXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIHJlc2V0IGRvbmUgKi8KKwl3cml0ZWwoMCwgZW5hX2Rldi0+cmVnX2JhciArIEVOQV9SRUdTX0RFVl9DVExfT0ZGKTsKKwlyYyA9IHdhaXRfZm9yX3Jlc2V0X3N0YXRlKGVuYV9kZXYsIHRpbWVvdXQsIDApOworCWlmIChyYyAhPSAwKSB7CisJCXByX2VycigiUmVzZXQgaW5kaWNhdGlvbiBkaWRuJ3QgdHVybiBvZmZcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2dldF9kZXZfc3RhdHMoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgICBzdHJ1Y3QgZW5hX2NvbV9zdGF0c19jdHggKmN0eCwKKwkJCSAgICAgZW51bSBlbmFfYWRtaW5fZ2V0X3N0YXRzX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgZW5hX2FkbWluX2FxX2dldF9zdGF0c19jbWQgKmdldF9jbWQgPSAmY3R4LT5nZXRfY21kOworCXN0cnVjdCBlbmFfYWRtaW5fYWNxX2dldF9zdGF0c19yZXNwICpnZXRfcmVzcCA9ICZjdHgtPmdldF9yZXNwOworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZTsKKwlpbnQgcmV0OworCisJYWRtaW5fcXVldWUgPSAmZW5hX2Rldi0+YWRtaW5fcXVldWU7CisKKwlnZXRfY21kLT5hcV9jb21tb25fZGVzY3JpcHRvci5vcGNvZGUgPSBFTkFfQURNSU5fR0VUX1NUQVRTOworCWdldF9jbWQtPmFxX2NvbW1vbl9kZXNjcmlwdG9yLmZsYWdzID0gMDsKKwlnZXRfY21kLT50eXBlID0gdHlwZTsKKworCXJldCA9ICBlbmFfY29tX2V4ZWN1dGVfYWRtaW5fY29tbWFuZChhZG1pbl9xdWV1ZSwKKwkJCQkJICAgICAoc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSAqKWdldF9jbWQsCisJCQkJCSAgICAgc2l6ZW9mKCpnZXRfY21kKSwKKwkJCQkJICAgICAoc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKilnZXRfcmVzcCwKKwkJCQkJICAgICBzaXplb2YoKmdldF9yZXNwKSk7CisKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gZ2V0IHN0YXRzLiBlcnJvcjogJWRcbiIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZW5hX2NvbV9nZXRfZGV2X2Jhc2ljX3N0YXRzKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQlzdHJ1Y3QgZW5hX2FkbWluX2Jhc2ljX3N0YXRzICpzdGF0cykKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9zdGF0c19jdHggY3R4OworCWludCByZXQ7CisKKwltZW1zZXQoJmN0eCwgMHgwLCBzaXplb2YoY3R4KSk7CisJcmV0ID0gZW5hX2dldF9kZXZfc3RhdHMoZW5hX2RldiwgJmN0eCwgRU5BX0FETUlOX0dFVF9TVEFUU19UWVBFX0JBU0lDKTsKKwlpZiAobGlrZWx5KHJldCA9PSAwKSkKKwkJbWVtY3B5KHN0YXRzLCAmY3R4LmdldF9yZXNwLmJhc2ljX3N0YXRzLAorCQkgICAgICAgc2l6ZW9mKGN0eC5nZXRfcmVzcC5iYXNpY19zdGF0cykpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGVuYV9jb21fc2V0X2Rldl9tdHUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCBpbnQgbXR1KQoreworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZTsKKwlzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0X2NtZCBjbWQ7CisJc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdF9yZXNwIHJlc3A7CisJaW50IHJldDsKKworCWlmICghZW5hX2NvbV9jaGVja19zdXBwb3J0ZWRfZmVhdHVyZV9pZChlbmFfZGV2LCBFTkFfQURNSU5fTVRVKSkgeworCQlwcl9pbmZvKCJGZWF0dXJlICVkIGlzbid0IHN1cHBvcnRlZFxuIiwgRU5BX0FETUlOX01UVSk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJbWVtc2V0KCZjbWQsIDB4MCwgc2l6ZW9mKGNtZCkpOworCWFkbWluX3F1ZXVlID0gJmVuYV9kZXYtPmFkbWluX3F1ZXVlOworCisJY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLm9wY29kZSA9IEVOQV9BRE1JTl9TRVRfRkVBVFVSRTsKKwljbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3IuZmxhZ3MgPSAwOworCWNtZC5mZWF0X2NvbW1vbi5mZWF0dXJlX2lkID0gRU5BX0FETUlOX01UVTsKKwljbWQudS5tdHUubXR1ID0gbXR1OworCisJcmV0ID0gZW5hX2NvbV9leGVjdXRlX2FkbWluX2NvbW1hbmQoYWRtaW5fcXVldWUsCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSAqKSZjbWQsCisJCQkJCSAgICBzaXplb2YoY21kKSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqKSZyZXNwLAorCQkJCQkgICAgc2l6ZW9mKHJlc3ApKTsKKworCWlmICh1bmxpa2VseShyZXQpKQorCQlwcl9lcnIoIkZhaWxlZCB0byBzZXQgbXR1ICVkLiBlcnJvcjogJWRcbiIsIG10dSwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBlbmFfY29tX2dldF9vZmZsb2FkX3NldHRpbmdzKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkgc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX29mZmxvYWRfZGVzYyAqb2ZmbG9hZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfcmVzcCByZXNwOworCisJcmV0ID0gZW5hX2NvbV9nZXRfZmVhdHVyZShlbmFfZGV2LCAmcmVzcCwKKwkJCQkgIEVOQV9BRE1JTl9TVEFURUxFU1NfT0ZGTE9BRF9DT05GSUcpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCXByX2VycigiRmFpbGVkIHRvIGdldCBvZmZsb2FkIGNhcGFiaWxpdGllcyAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltZW1jcHkob2ZmbG9hZCwgJnJlc3AudS5vZmZsb2FkLCBzaXplb2YocmVzcC51Lm9mZmxvYWQpKTsKKworCXJldHVybiAwOworfQorCitpbnQgZW5hX2NvbV9zZXRfaGFzaF9mdW5jdGlvbihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlID0gJmVuYV9kZXYtPmFkbWluX3F1ZXVlOworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCXN0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXRfY21kIGNtZDsKKwlzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0X3Jlc3AgcmVzcDsKKwlzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X3Jlc3AgZ2V0X3Jlc3A7CisJaW50IHJldDsKKworCWlmICghZW5hX2NvbV9jaGVja19zdXBwb3J0ZWRfZmVhdHVyZV9pZChlbmFfZGV2LAorCQkJCQkJRU5BX0FETUlOX1JTU19IQVNIX0ZVTkNUSU9OKSkgeworCQlwcl9pbmZvKCJGZWF0dXJlICVkIGlzbid0IHN1cHBvcnRlZFxuIiwKKwkJCUVOQV9BRE1JTl9SU1NfSEFTSF9GVU5DVElPTik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJLyogVmFsaWRhdGUgaGFzaCBmdW5jdGlvbiBpcyBzdXBwb3J0ZWQgKi8KKwlyZXQgPSBlbmFfY29tX2dldF9mZWF0dXJlKGVuYV9kZXYsICZnZXRfcmVzcCwKKwkJCQkgIEVOQV9BRE1JTl9SU1NfSEFTSF9GVU5DVElPTik7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCXJldHVybiByZXQ7CisKKwlpZiAoZ2V0X3Jlc3AudS5mbG93X2hhc2hfZnVuYy5zdXBwb3J0ZWRfZnVuYyAmICgxIDw8IHJzcy0+aGFzaF9mdW5jKSkgeworCQlwcl9lcnIoIkZ1bmMgaGFzaCAlZCBpc24ndCBzdXBwb3J0ZWQgYnkgZGV2aWNlLCBhYm9ydFxuIiwKKwkJICAgICAgIHJzcy0+aGFzaF9mdW5jKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwltZW1zZXQoJmNtZCwgMHgwLCBzaXplb2YoY21kKSk7CisKKwljbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3Iub3Bjb2RlID0gRU5BX0FETUlOX1NFVF9GRUFUVVJFOworCWNtZC5hcV9jb21tb25fZGVzY3JpcHRvci5mbGFncyA9CisJCUVOQV9BRE1JTl9BUV9DT01NT05fREVTQ19DVFJMX0RBVEFfSU5ESVJFQ1RfTUFTSzsKKwljbWQuZmVhdF9jb21tb24uZmVhdHVyZV9pZCA9IEVOQV9BRE1JTl9SU1NfSEFTSF9GVU5DVElPTjsKKwljbWQudS5mbG93X2hhc2hfZnVuYy5pbml0X3ZhbCA9IHJzcy0+aGFzaF9pbml0X3ZhbDsKKwljbWQudS5mbG93X2hhc2hfZnVuYy5zZWxlY3RlZF9mdW5jID0gMSA8PCByc3MtPmhhc2hfZnVuYzsKKworCXJldCA9IGVuYV9jb21fbWVtX2FkZHJfc2V0KGVuYV9kZXYsCisJCQkJICAgJmNtZC5jb250cm9sX2J1ZmZlci5hZGRyZXNzLAorCQkJCSAgIHJzcy0+aGFzaF9rZXlfZG1hX2FkZHIpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCXByX2VycigibWVtb3J5IGFkZHJlc3Mgc2V0IGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJY21kLmNvbnRyb2xfYnVmZmVyLmxlbmd0aCA9IHNpemVvZigqcnNzLT5oYXNoX2tleSk7CisKKwlyZXQgPSBlbmFfY29tX2V4ZWN1dGVfYWRtaW5fY29tbWFuZChhZG1pbl9xdWV1ZSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5ICopJmNtZCwKKwkJCQkJICAgIHNpemVvZihjbWQpLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICopJnJlc3AsCisJCQkJCSAgICBzaXplb2YocmVzcCkpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCXByX2VycigiRmFpbGVkIHRvIHNldCBoYXNoIGZ1bmN0aW9uICVkLiBlcnJvcjogJWRcbiIsCisJCSAgICAgICByc3MtPmhhc2hfZnVuYywgcmV0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBlbmFfY29tX2ZpbGxfaGFzaF9mdW5jdGlvbihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgICAgZW51bSBlbmFfYWRtaW5faGFzaF9mdW5jdGlvbnMgZnVuYywKKwkJCSAgICAgICBjb25zdCB1OCAqa2V5LCB1MTYga2V5X2xlbiwgdTMyIGluaXRfdmFsKQoreworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCXN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfcmVzcCBnZXRfcmVzcDsKKwlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2Zsb3dfaGFzaF9jb250cm9sICpoYXNoX2tleSA9CisJCXJzcy0+aGFzaF9rZXk7CisJaW50IHJjOworCisJLyogTWFrZSBzdXJlIHNpemUgaXMgYSBtdWx0IG9mIERXcyAqLworCWlmICh1bmxpa2VseShrZXlfbGVuICYgMHgzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyYyA9IGVuYV9jb21fZ2V0X2ZlYXR1cmVfZXgoZW5hX2RldiwgJmdldF9yZXNwLAorCQkJCSAgICBFTkFfQURNSU5fUlNTX0hBU0hfRlVOQ1RJT04sCisJCQkJICAgIHJzcy0+aGFzaF9rZXlfZG1hX2FkZHIsCisJCQkJICAgIHNpemVvZigqcnNzLT5oYXNoX2tleSkpOworCWlmICh1bmxpa2VseShyYykpCisJCXJldHVybiByYzsKKworCWlmICghKCgxIDw8IGZ1bmMpICYgZ2V0X3Jlc3AudS5mbG93X2hhc2hfZnVuYy5zdXBwb3J0ZWRfZnVuYykpIHsKKwkJcHJfZXJyKCJGbG93IGhhc2ggZnVuY3Rpb24gJWQgaXNuJ3Qgc3VwcG9ydGVkXG4iLCBmdW5jKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlzd2l0Y2ggKGZ1bmMpIHsKKwljYXNlIEVOQV9BRE1JTl9UT0VQTElUWjoKKwkJaWYgKGtleV9sZW4gPiBzaXplb2YoaGFzaF9rZXktPmtleSkpIHsKKwkJCXByX2Vycigia2V5IGxlbiAoJWh1KSBpcyBiaWdnZXIgdGhhbiB0aGUgbWF4IHN1cHBvcnRlZCAoJXp1KVxuIiwKKwkJCSAgICAgICBrZXlfbGVuLCBzaXplb2YoaGFzaF9rZXktPmtleSkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQltZW1jcHkoaGFzaF9rZXktPmtleSwga2V5LCBrZXlfbGVuKTsKKwkJcnNzLT5oYXNoX2luaXRfdmFsID0gaW5pdF92YWw7CisJCWhhc2hfa2V5LT5rZXlzX251bSA9IGtleV9sZW4gPj4gMjsKKwkJYnJlYWs7CisJY2FzZSBFTkFfQURNSU5fQ1JDMzI6CisJCXJzcy0+aGFzaF9pbml0X3ZhbCA9IGluaXRfdmFsOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIkludmFsaWQgaGFzaCBmdW5jdGlvbiAoJWQpXG4iLCBmdW5jKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBlbmFfY29tX3NldF9oYXNoX2Z1bmN0aW9uKGVuYV9kZXYpOworCisJLyogUmVzdG9yZSB0aGUgb2xkIGZ1bmN0aW9uICovCisJaWYgKHVubGlrZWx5KHJjKSkKKwkJZW5hX2NvbV9nZXRfaGFzaF9mdW5jdGlvbihlbmFfZGV2LCBOVUxMLCBOVUxMKTsKKworCXJldHVybiByYzsKK30KKworaW50IGVuYV9jb21fZ2V0X2hhc2hfZnVuY3Rpb24oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgICAgZW51bSBlbmFfYWRtaW5faGFzaF9mdW5jdGlvbnMgKmZ1bmMsCisJCQkgICAgICB1OCAqa2V5KQoreworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCXN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfcmVzcCBnZXRfcmVzcDsKKwlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2Zsb3dfaGFzaF9jb250cm9sICpoYXNoX2tleSA9CisJCXJzcy0+aGFzaF9rZXk7CisJaW50IHJjOworCisJcmMgPSBlbmFfY29tX2dldF9mZWF0dXJlX2V4KGVuYV9kZXYsICZnZXRfcmVzcCwKKwkJCQkgICAgRU5BX0FETUlOX1JTU19IQVNIX0ZVTkNUSU9OLAorCQkJCSAgICByc3MtPmhhc2hfa2V5X2RtYV9hZGRyLAorCQkJCSAgICBzaXplb2YoKnJzcy0+aGFzaF9rZXkpKTsKKwlpZiAodW5saWtlbHkocmMpKQorCQlyZXR1cm4gcmM7CisKKwlyc3MtPmhhc2hfZnVuYyA9IGdldF9yZXNwLnUuZmxvd19oYXNoX2Z1bmMuc2VsZWN0ZWRfZnVuYzsKKwlpZiAoZnVuYykKKwkJKmZ1bmMgPSByc3MtPmhhc2hfZnVuYzsKKworCWlmIChrZXkpCisJCW1lbWNweShrZXksIGhhc2hfa2V5LT5rZXksIChzaXplX3QpKGhhc2hfa2V5LT5rZXlzX251bSkgPDwgMik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGVuYV9jb21fZ2V0X2hhc2hfY3RybChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgIGVudW0gZW5hX2FkbWluX2Zsb3dfaGFzaF9wcm90byBwcm90bywKKwkJCSAgdTE2ICpmaWVsZHMpCit7CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisJc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9yZXNwIGdldF9yZXNwOworCWludCByYzsKKworCXJjID0gZW5hX2NvbV9nZXRfZmVhdHVyZV9leChlbmFfZGV2LCAmZ2V0X3Jlc3AsCisJCQkJICAgIEVOQV9BRE1JTl9SU1NfSEFTSF9JTlBVVCwKKwkJCQkgICAgcnNzLT5oYXNoX2N0cmxfZG1hX2FkZHIsCisJCQkJICAgIHNpemVvZigqcnNzLT5oYXNoX2N0cmwpKTsKKwlpZiAodW5saWtlbHkocmMpKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoZmllbGRzKQorCQkqZmllbGRzID0gcnNzLT5oYXNoX2N0cmwtPnNlbGVjdGVkX2ZpZWxkc1twcm90b10uZmllbGRzOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlbmFfY29tX3NldF9oYXNoX2N0cmwoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSA9ICZlbmFfZGV2LT5hZG1pbl9xdWV1ZTsKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKwlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2hhc2hfY29udHJvbCAqaGFzaF9jdHJsID0gcnNzLT5oYXNoX2N0cmw7CisJc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdF9jbWQgY21kOworCXN0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXRfcmVzcCByZXNwOworCWludCByZXQ7CisKKwlpZiAoIWVuYV9jb21fY2hlY2tfc3VwcG9ydGVkX2ZlYXR1cmVfaWQoZW5hX2RldiwKKwkJCQkJCUVOQV9BRE1JTl9SU1NfSEFTSF9JTlBVVCkpIHsKKwkJcHJfaW5mbygiRmVhdHVyZSAlZCBpc24ndCBzdXBwb3J0ZWRcbiIsIEVOQV9BRE1JTl9SU1NfSEFTSF9JTlBVVCk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJbWVtc2V0KCZjbWQsIDB4MCwgc2l6ZW9mKGNtZCkpOworCisJY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLm9wY29kZSA9IEVOQV9BRE1JTl9TRVRfRkVBVFVSRTsKKwljbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3IuZmxhZ3MgPQorCQlFTkFfQURNSU5fQVFfQ09NTU9OX0RFU0NfQ1RSTF9EQVRBX0lORElSRUNUX01BU0s7CisJY21kLmZlYXRfY29tbW9uLmZlYXR1cmVfaWQgPSBFTkFfQURNSU5fUlNTX0hBU0hfSU5QVVQ7CisJY21kLnUuZmxvd19oYXNoX2lucHV0LmVuYWJsZWRfaW5wdXRfc29ydCA9CisJCUVOQV9BRE1JTl9GRUFUVVJFX1JTU19GTE9XX0hBU0hfSU5QVVRfTDNfU09SVF9NQVNLIHwKKwkJRU5BX0FETUlOX0ZFQVRVUkVfUlNTX0ZMT1dfSEFTSF9JTlBVVF9MNF9TT1JUX01BU0s7CisKKwlyZXQgPSBlbmFfY29tX21lbV9hZGRyX3NldChlbmFfZGV2LAorCQkJCSAgICZjbWQuY29udHJvbF9idWZmZXIuYWRkcmVzcywKKwkJCQkgICByc3MtPmhhc2hfY3RybF9kbWFfYWRkcik7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJcHJfZXJyKCJtZW1vcnkgYWRkcmVzcyBzZXQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJY21kLmNvbnRyb2xfYnVmZmVyLmxlbmd0aCA9IHNpemVvZigqaGFzaF9jdHJsKTsKKworCXJldCA9IGVuYV9jb21fZXhlY3V0ZV9hZG1pbl9jb21tYW5kKGFkbWluX3F1ZXVlLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgKikmY21kLAorCQkJCQkgICAgc2l6ZW9mKGNtZCksCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKikmcmVzcCwKKwkJCQkJICAgIHNpemVvZihyZXNwKSk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCXByX2VycigiRmFpbGVkIHRvIHNldCBoYXNoIGlucHV0LiBlcnJvcjogJWRcbiIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZW5hX2NvbV9zZXRfZGVmYXVsdF9oYXNoX2N0cmwoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfaGFzaF9jb250cm9sICpoYXNoX2N0cmwgPQorCQlyc3MtPmhhc2hfY3RybDsKKwl1MTYgYXZhaWxhYmxlX2ZpZWxkcyA9IDA7CisJaW50IHJjLCBpOworCisJLyogR2V0IHRoZSBzdXBwb3J0ZWQgaGFzaCBpbnB1dCAqLworCXJjID0gZW5hX2NvbV9nZXRfaGFzaF9jdHJsKGVuYV9kZXYsIDAsIE5VTEwpOworCWlmICh1bmxpa2VseShyYykpCisJCXJldHVybiByYzsKKworCWhhc2hfY3RybC0+c2VsZWN0ZWRfZmllbGRzW0VOQV9BRE1JTl9SU1NfVENQNF0uZmllbGRzID0KKwkJRU5BX0FETUlOX1JTU19MM19TQSB8IEVOQV9BRE1JTl9SU1NfTDNfREEgfAorCQlFTkFfQURNSU5fUlNTX0w0X0RQIHwgRU5BX0FETUlOX1JTU19MNF9TUDsKKworCWhhc2hfY3RybC0+c2VsZWN0ZWRfZmllbGRzW0VOQV9BRE1JTl9SU1NfVURQNF0uZmllbGRzID0KKwkJRU5BX0FETUlOX1JTU19MM19TQSB8IEVOQV9BRE1JTl9SU1NfTDNfREEgfAorCQlFTkFfQURNSU5fUlNTX0w0X0RQIHwgRU5BX0FETUlOX1JTU19MNF9TUDsKKworCWhhc2hfY3RybC0+c2VsZWN0ZWRfZmllbGRzW0VOQV9BRE1JTl9SU1NfVENQNl0uZmllbGRzID0KKwkJRU5BX0FETUlOX1JTU19MM19TQSB8IEVOQV9BRE1JTl9SU1NfTDNfREEgfAorCQlFTkFfQURNSU5fUlNTX0w0X0RQIHwgRU5BX0FETUlOX1JTU19MNF9TUDsKKworCWhhc2hfY3RybC0+c2VsZWN0ZWRfZmllbGRzW0VOQV9BRE1JTl9SU1NfVURQNl0uZmllbGRzID0KKwkJRU5BX0FETUlOX1JTU19MM19TQSB8IEVOQV9BRE1JTl9SU1NfTDNfREEgfAorCQlFTkFfQURNSU5fUlNTX0w0X0RQIHwgRU5BX0FETUlOX1JTU19MNF9TUDsKKworCWhhc2hfY3RybC0+c2VsZWN0ZWRfZmllbGRzW0VOQV9BRE1JTl9SU1NfSVA0XS5maWVsZHMgPQorCQlFTkFfQURNSU5fUlNTX0wzX1NBIHwgRU5BX0FETUlOX1JTU19MM19EQTsKKworCWhhc2hfY3RybC0+c2VsZWN0ZWRfZmllbGRzW0VOQV9BRE1JTl9SU1NfSVA2XS5maWVsZHMgPQorCQlFTkFfQURNSU5fUlNTX0wzX1NBIHwgRU5BX0FETUlOX1JTU19MM19EQTsKKworCWhhc2hfY3RybC0+c2VsZWN0ZWRfZmllbGRzW0VOQV9BRE1JTl9SU1NfSVA0X0ZSQUddLmZpZWxkcyA9CisJCUVOQV9BRE1JTl9SU1NfTDNfU0EgfCBFTkFfQURNSU5fUlNTX0wzX0RBOworCisJaGFzaF9jdHJsLT5zZWxlY3RlZF9maWVsZHNbRU5BX0FETUlOX1JTU19JUDRfRlJBR10uZmllbGRzID0KKwkJRU5BX0FETUlOX1JTU19MMl9EQSB8IEVOQV9BRE1JTl9SU1NfTDJfU0E7CisKKwlmb3IgKGkgPSAwOyBpIDwgRU5BX0FETUlOX1JTU19QUk9UT19OVU07IGkrKykgeworCQlhdmFpbGFibGVfZmllbGRzID0gaGFzaF9jdHJsLT5zZWxlY3RlZF9maWVsZHNbaV0uZmllbGRzICYKKwkJCQloYXNoX2N0cmwtPnN1cHBvcnRlZF9maWVsZHNbaV0uZmllbGRzOworCQlpZiAoYXZhaWxhYmxlX2ZpZWxkcyAhPSBoYXNoX2N0cmwtPnNlbGVjdGVkX2ZpZWxkc1tpXS5maWVsZHMpIHsKKwkJCXByX2VycigiaGFzaCBjb250cm9sIGRvZXNuJ3Qgc3VwcG9ydCBhbGwgdGhlIGRlc2lyZSBjb25maWd1cmF0aW9uLiBwcm90byAleCBzdXBwb3J0ZWQgJXggc2VsZWN0ZWQgJXhcbiIsCisJCQkgICAgICAgaSwgaGFzaF9jdHJsLT5zdXBwb3J0ZWRfZmllbGRzW2ldLmZpZWxkcywKKwkJCSAgICAgICBoYXNoX2N0cmwtPnNlbGVjdGVkX2ZpZWxkc1tpXS5maWVsZHMpOworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCX0KKworCXJjID0gZW5hX2NvbV9zZXRfaGFzaF9jdHJsKGVuYV9kZXYpOworCisJLyogSW4gY2FzZSBvZiBmYWlsdXJlLCByZXN0b3JlIHRoZSBvbGQgaGFzaCBjdHJsICovCisJaWYgKHVubGlrZWx5KHJjKSkKKwkJZW5hX2NvbV9nZXRfaGFzaF9jdHJsKGVuYV9kZXYsIDAsIE5VTEwpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgZW5hX2NvbV9maWxsX2hhc2hfY3RybChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICBlbnVtIGVuYV9hZG1pbl9mbG93X2hhc2hfcHJvdG8gcHJvdG8sCisJCQkgICB1MTYgaGFzaF9maWVsZHMpCit7CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19oYXNoX2NvbnRyb2wgKmhhc2hfY3RybCA9IHJzcy0+aGFzaF9jdHJsOworCXUxNiBzdXBwb3J0ZWRfZmllbGRzOworCWludCByYzsKKworCWlmIChwcm90byA+PSBFTkFfQURNSU5fUlNTX1BST1RPX05VTSkgeworCQlwcl9lcnIoIkludmFsaWQgcHJvdG8gbnVtICgldSlcbiIsIHByb3RvKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogR2V0IHRoZSBjdHJsIHRhYmxlICovCisJcmMgPSBlbmFfY29tX2dldF9oYXNoX2N0cmwoZW5hX2RldiwgcHJvdG8sIE5VTEwpOworCWlmICh1bmxpa2VseShyYykpCisJCXJldHVybiByYzsKKworCS8qIE1ha2Ugc3VyZSBhbGwgdGhlIGZpZWxkcyBhcmUgc3VwcG9ydGVkICovCisJc3VwcG9ydGVkX2ZpZWxkcyA9IGhhc2hfY3RybC0+c3VwcG9ydGVkX2ZpZWxkc1twcm90b10uZmllbGRzOworCWlmICgoaGFzaF9maWVsZHMgJiBzdXBwb3J0ZWRfZmllbGRzKSAhPSBoYXNoX2ZpZWxkcykgeworCQlwcl9lcnIoInByb3RvICVkIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVxdWlyZWQgZmllbGRzICV4LiBzdXBwb3J0cyBvbmx5OiAleFxuIiwKKwkJICAgICAgIHByb3RvLCBoYXNoX2ZpZWxkcywgc3VwcG9ydGVkX2ZpZWxkcyk7CisJfQorCisJaGFzaF9jdHJsLT5zZWxlY3RlZF9maWVsZHNbcHJvdG9dLmZpZWxkcyA9IGhhc2hfZmllbGRzOworCisJcmMgPSBlbmFfY29tX3NldF9oYXNoX2N0cmwoZW5hX2Rldik7CisKKwkvKiBJbiBjYXNlIG9mIGZhaWx1cmUsIHJlc3RvcmUgdGhlIG9sZCBoYXNoIGN0cmwgKi8KKwlpZiAodW5saWtlbHkocmMpKQorCQllbmFfY29tX2dldF9oYXNoX2N0cmwoZW5hX2RldiwgMCwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGVuYV9jb21faW5kaXJlY3RfdGFibGVfZmlsbF9lbnRyeShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJICAgICAgdTE2IGVudHJ5X2lkeCwgdTE2IGVudHJ5X3ZhbHVlKQoreworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCisJaWYgKHVubGlrZWx5KGVudHJ5X2lkeCA+PSAoMSA8PCByc3MtPnRibF9sb2dfc2l6ZSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh1bmxpa2VseSgoZW50cnlfdmFsdWUgPiBFTkFfVE9UQUxfTlVNX1FVRVVFUykpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJzcy0+aG9zdF9yc3NfaW5kX3RibFtlbnRyeV9pZHhdID0gZW50cnlfdmFsdWU7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGVuYV9jb21faW5kaXJlY3RfdGFibGVfc2V0KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUgPSAmZW5hX2Rldi0+YWRtaW5fcXVldWU7CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisJc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdF9jbWQgY21kOworCXN0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXRfcmVzcCByZXNwOworCWludCByZXQ7CisKKwlpZiAoIWVuYV9jb21fY2hlY2tfc3VwcG9ydGVkX2ZlYXR1cmVfaWQoCisJCSAgICBlbmFfZGV2LCBFTkFfQURNSU5fUlNTX1JFRElSRUNUSU9OX1RBQkxFX0NPTkZJRykpIHsKKwkJcHJfaW5mbygiRmVhdHVyZSAlZCBpc24ndCBzdXBwb3J0ZWRcbiIsCisJCQlFTkFfQURNSU5fUlNTX1JFRElSRUNUSU9OX1RBQkxFX0NPTkZJRyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJcmV0ID0gZW5hX2NvbV9pbmRfdGJsX2NvbnZlcnRfdG9fZGV2aWNlKGVuYV9kZXYpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gY29udmVydCBob3N0IGluZGlyZWN0aW9uIHRhYmxlIHRvIGRldmljZSB0YWJsZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJbWVtc2V0KCZjbWQsIDB4MCwgc2l6ZW9mKGNtZCkpOworCisJY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLm9wY29kZSA9IEVOQV9BRE1JTl9TRVRfRkVBVFVSRTsKKwljbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3IuZmxhZ3MgPQorCQlFTkFfQURNSU5fQVFfQ09NTU9OX0RFU0NfQ1RSTF9EQVRBX0lORElSRUNUX01BU0s7CisJY21kLmZlYXRfY29tbW9uLmZlYXR1cmVfaWQgPSBFTkFfQURNSU5fUlNTX1JFRElSRUNUSU9OX1RBQkxFX0NPTkZJRzsKKwljbWQudS5pbmRfdGFibGUuc2l6ZSA9IHJzcy0+dGJsX2xvZ19zaXplOworCWNtZC51LmluZF90YWJsZS5pbmxpbmVfaW5kZXggPSAweEZGRkZGRkZGOworCisJcmV0ID0gZW5hX2NvbV9tZW1fYWRkcl9zZXQoZW5hX2RldiwKKwkJCQkgICAmY21kLmNvbnRyb2xfYnVmZmVyLmFkZHJlc3MsCisJCQkJICAgcnNzLT5yc3NfaW5kX3RibF9kbWFfYWRkcik7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJcHJfZXJyKCJtZW1vcnkgYWRkcmVzcyBzZXQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljbWQuY29udHJvbF9idWZmZXIubGVuZ3RoID0gKDFVTEwgPDwgcnNzLT50YmxfbG9nX3NpemUpICoKKwkJc2l6ZW9mKHN0cnVjdCBlbmFfYWRtaW5fcnNzX2luZF90YWJsZV9lbnRyeSk7CisKKwlyZXQgPSBlbmFfY29tX2V4ZWN1dGVfYWRtaW5fY29tbWFuZChhZG1pbl9xdWV1ZSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5ICopJmNtZCwKKwkJCQkJICAgIHNpemVvZihjbWQpLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICopJnJlc3AsCisJCQkJCSAgICBzaXplb2YocmVzcCkpOworCisJaWYgKHVubGlrZWx5KHJldCkpCisJCXByX2VycigiRmFpbGVkIHRvIHNldCBpbmRpcmVjdCB0YWJsZS4gZXJyb3I6ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGVuYV9jb21faW5kaXJlY3RfdGFibGVfZ2V0KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgdTMyICppbmRfdGJsKQoreworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCXN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfcmVzcCBnZXRfcmVzcDsKKwl1MzIgdGJsX3NpemU7CisJaW50IGksIHJjOworCisJdGJsX3NpemUgPSAoMVVMTCA8PCByc3MtPnRibF9sb2dfc2l6ZSkgKgorCQlzaXplb2Yoc3RydWN0IGVuYV9hZG1pbl9yc3NfaW5kX3RhYmxlX2VudHJ5KTsKKworCXJjID0gZW5hX2NvbV9nZXRfZmVhdHVyZV9leChlbmFfZGV2LCAmZ2V0X3Jlc3AsCisJCQkJICAgIEVOQV9BRE1JTl9SU1NfUkVESVJFQ1RJT05fVEFCTEVfQ09ORklHLAorCQkJCSAgICByc3MtPnJzc19pbmRfdGJsX2RtYV9hZGRyLAorCQkJCSAgICB0Ymxfc2l6ZSk7CisJaWYgKHVubGlrZWx5KHJjKSkKKwkJcmV0dXJuIHJjOworCisJaWYgKCFpbmRfdGJsKQorCQlyZXR1cm4gMDsKKworCXJjID0gZW5hX2NvbV9pbmRfdGJsX2NvbnZlcnRfZnJvbV9kZXZpY2UoZW5hX2Rldik7CisJaWYgKHVubGlrZWx5KHJjKSkKKwkJcmV0dXJuIHJjOworCisJZm9yIChpID0gMDsgaSA8ICgxIDw8IHJzcy0+dGJsX2xvZ19zaXplKTsgaSsrKQorCQlpbmRfdGJsW2ldID0gcnNzLT5ob3N0X3Jzc19pbmRfdGJsW2ldOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlbmFfY29tX3Jzc19pbml0KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgdTE2IGluZHJfdGJsX2xvZ19zaXplKQoreworCWludCByYzsKKworCW1lbXNldCgmZW5hX2Rldi0+cnNzLCAweDAsIHNpemVvZihlbmFfZGV2LT5yc3MpKTsKKworCXJjID0gZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9hbGxvY2F0ZShlbmFfZGV2LCBpbmRyX3RibF9sb2dfc2l6ZSk7CisJaWYgKHVubGlrZWx5KHJjKSkKKwkJZ290byBlcnJfaW5kcl90Ymw7CisKKwlyYyA9IGVuYV9jb21faGFzaF9rZXlfYWxsb2NhdGUoZW5hX2Rldik7CisJaWYgKHVubGlrZWx5KHJjKSkKKwkJZ290byBlcnJfaGFzaF9rZXk7CisKKwlyYyA9IGVuYV9jb21faGFzaF9jdHJsX2luaXQoZW5hX2Rldik7CisJaWYgKHVubGlrZWx5KHJjKSkKKwkJZ290byBlcnJfaGFzaF9jdHJsOworCisJcmV0dXJuIDA7CisKK2Vycl9oYXNoX2N0cmw6CisJZW5hX2NvbV9oYXNoX2tleV9kZXN0cm95KGVuYV9kZXYpOworZXJyX2hhc2hfa2V5OgorCWVuYV9jb21faW5kaXJlY3RfdGFibGVfZGVzdHJveShlbmFfZGV2KTsKK2Vycl9pbmRyX3RibDoKKworCXJldHVybiByYzsKK30KKwordm9pZCBlbmFfY29tX3Jzc19kZXN0cm95KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwllbmFfY29tX2luZGlyZWN0X3RhYmxlX2Rlc3Ryb3koZW5hX2Rldik7CisJZW5hX2NvbV9oYXNoX2tleV9kZXN0cm95KGVuYV9kZXYpOworCWVuYV9jb21faGFzaF9jdHJsX2Rlc3Ryb3koZW5hX2Rldik7CisKKwltZW1zZXQoJmVuYV9kZXYtPnJzcywgMHgwLCBzaXplb2YoZW5hX2Rldi0+cnNzKSk7Cit9CisKK2ludCBlbmFfY29tX2FsbG9jYXRlX2hvc3RfaW5mbyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9ob3N0X2F0dHJpYnV0ZSAqaG9zdF9hdHRyID0gJmVuYV9kZXYtPmhvc3RfYXR0cjsKKworCWhvc3RfYXR0ci0+aG9zdF9pbmZvID0KKwkJZG1hX3phbGxvY19jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIFNaXzRLLAorCQkJCSAgICAmaG9zdF9hdHRyLT5ob3N0X2luZm9fZG1hX2FkZHIsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghaG9zdF9hdHRyLT5ob3N0X2luZm8pKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCitpbnQgZW5hX2NvbV9hbGxvY2F0ZV9kZWJ1Z19hcmVhKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQl1MzIgZGVidWdfYXJlYV9zaXplKQoreworCXN0cnVjdCBlbmFfaG9zdF9hdHRyaWJ1dGUgKmhvc3RfYXR0ciA9ICZlbmFfZGV2LT5ob3N0X2F0dHI7CisKKwlob3N0X2F0dHItPmRlYnVnX2FyZWFfdmlydF9hZGRyID0KKwkJZG1hX3phbGxvY19jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIGRlYnVnX2FyZWFfc2l6ZSwKKwkJCQkgICAgJmhvc3RfYXR0ci0+ZGVidWdfYXJlYV9kbWFfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFob3N0X2F0dHItPmRlYnVnX2FyZWFfdmlydF9hZGRyKSkgeworCQlob3N0X2F0dHItPmRlYnVnX2FyZWFfc2l6ZSA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWhvc3RfYXR0ci0+ZGVidWdfYXJlYV9zaXplID0gZGVidWdfYXJlYV9zaXplOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZW5hX2NvbV9kZWxldGVfaG9zdF9pbmZvKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX2hvc3RfYXR0cmlidXRlICpob3N0X2F0dHIgPSAmZW5hX2Rldi0+aG9zdF9hdHRyOworCisJaWYgKGhvc3RfYXR0ci0+aG9zdF9pbmZvKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgU1pfNEssIGhvc3RfYXR0ci0+aG9zdF9pbmZvLAorCQkJCSAgaG9zdF9hdHRyLT5ob3N0X2luZm9fZG1hX2FkZHIpOworCQlob3N0X2F0dHItPmhvc3RfaW5mbyA9IE5VTEw7CisJfQorfQorCit2b2lkIGVuYV9jb21fZGVsZXRlX2RlYnVnX2FyZWEoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfaG9zdF9hdHRyaWJ1dGUgKmhvc3RfYXR0ciA9ICZlbmFfZGV2LT5ob3N0X2F0dHI7CisKKwlpZiAoaG9zdF9hdHRyLT5kZWJ1Z19hcmVhX3ZpcnRfYWRkcikgeworCQlkbWFfZnJlZV9jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIGhvc3RfYXR0ci0+ZGVidWdfYXJlYV9zaXplLAorCQkJCSAgaG9zdF9hdHRyLT5kZWJ1Z19hcmVhX3ZpcnRfYWRkciwKKwkJCQkgIGhvc3RfYXR0ci0+ZGVidWdfYXJlYV9kbWFfYWRkcik7CisJCWhvc3RfYXR0ci0+ZGVidWdfYXJlYV92aXJ0X2FkZHIgPSBOVUxMOworCX0KK30KKworaW50IGVuYV9jb21fc2V0X2hvc3RfYXR0cmlidXRlcyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9ob3N0X2F0dHJpYnV0ZSAqaG9zdF9hdHRyID0gJmVuYV9kZXYtPmhvc3RfYXR0cjsKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWU7CisJc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdF9jbWQgY21kOworCXN0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXRfcmVzcCByZXNwOworCisJaW50IHJldDsKKworCWlmICghZW5hX2NvbV9jaGVja19zdXBwb3J0ZWRfZmVhdHVyZV9pZChlbmFfZGV2LAorCQkJCQkJRU5BX0FETUlOX0hPU1RfQVRUUl9DT05GSUcpKSB7CisJCXByX3dhcm4oIlNldCBob3N0IGF0dHJpYnV0ZSBpc24ndCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCW1lbXNldCgmY21kLCAweDAsIHNpemVvZihjbWQpKTsKKwlhZG1pbl9xdWV1ZSA9ICZlbmFfZGV2LT5hZG1pbl9xdWV1ZTsKKworCWNtZC5hcV9jb21tb25fZGVzY3JpcHRvci5vcGNvZGUgPSBFTkFfQURNSU5fU0VUX0ZFQVRVUkU7CisJY21kLmZlYXRfY29tbW9uLmZlYXR1cmVfaWQgPSBFTkFfQURNSU5fSE9TVF9BVFRSX0NPTkZJRzsKKworCXJldCA9IGVuYV9jb21fbWVtX2FkZHJfc2V0KGVuYV9kZXYsCisJCQkJICAgJmNtZC51Lmhvc3RfYXR0ci5kZWJ1Z19iYSwKKwkJCQkgICBob3N0X2F0dHItPmRlYnVnX2FyZWFfZG1hX2FkZHIpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCXByX2VycigibWVtb3J5IGFkZHJlc3Mgc2V0IGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZW5hX2NvbV9tZW1fYWRkcl9zZXQoZW5hX2RldiwKKwkJCQkgICAmY21kLnUuaG9zdF9hdHRyLm9zX2luZm9fYmEsCisJCQkJICAgaG9zdF9hdHRyLT5ob3N0X2luZm9fZG1hX2FkZHIpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCXByX2VycigibWVtb3J5IGFkZHJlc3Mgc2V0IGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJY21kLnUuaG9zdF9hdHRyLmRlYnVnX2FyZWFfc2l6ZSA9IGhvc3RfYXR0ci0+ZGVidWdfYXJlYV9zaXplOworCisJcmV0ID0gZW5hX2NvbV9leGVjdXRlX2FkbWluX2NvbW1hbmQoYWRtaW5fcXVldWUsCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSAqKSZjbWQsCisJCQkJCSAgICBzaXplb2YoY21kKSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqKSZyZXNwLAorCQkJCQkgICAgc2l6ZW9mKHJlc3ApKTsKKworCWlmICh1bmxpa2VseShyZXQpKQorCQlwcl9lcnIoIkZhaWxlZCB0byBzZXQgaG9zdCBhdHRyaWJ1dGVzOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIEludGVycnVwdCBtb2RlcmF0aW9uICovCitib29sIGVuYV9jb21faW50ZXJydXB0X21vZGVyYXRpb25fc3VwcG9ydGVkKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlyZXR1cm4gZW5hX2NvbV9jaGVja19zdXBwb3J0ZWRfZmVhdHVyZV9pZChlbmFfZGV2LAorCQkJCQkJICBFTkFfQURNSU5fSU5URVJSVVBUX01PREVSQVRJT04pOworfQorCitpbnQgZW5hX2NvbV91cGRhdGVfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF90eChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJCQkgICAgICB1MzIgdHhfY29hbGVzY2VfdXNlY3MpCit7CisJaWYgKCFlbmFfZGV2LT5pbnRyX2RlbGF5X3Jlc29sdXRpb24pIHsKKwkJcHJfZXJyKCJJbGxlZ2FsIGludGVycnVwdCBkZWxheSBncmFudWxhcml0eSB2YWx1ZVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWVuYV9kZXYtPmludHJfbW9kZXJfdHhfaW50ZXJ2YWwgPSB0eF9jb2FsZXNjZV91c2VjcyAvCisJCWVuYV9kZXYtPmludHJfZGVsYXlfcmVzb2x1dGlvbjsKKworCXJldHVybiAwOworfQorCitpbnQgZW5hX2NvbV91cGRhdGVfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF9yeChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJCQkgICAgICB1MzIgcnhfY29hbGVzY2VfdXNlY3MpCit7CisJaWYgKCFlbmFfZGV2LT5pbnRyX2RlbGF5X3Jlc29sdXRpb24pIHsKKwkJcHJfZXJyKCJJbGxlZ2FsIGludGVycnVwdCBkZWxheSBncmFudWxhcml0eSB2YWx1ZVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIFdlIHVzZSBMT1dFU1QgZW50cnkgb2YgbW9kZXJhdGlvbiB0YWJsZSBmb3Igc3RvcmluZworCSAqIG5vbmFkYXB0aXZlIGludGVycnVwdCBjb2FsZXNjaW5nIHZhbHVlcworCSAqLworCWVuYV9kZXYtPmludHJfbW9kZXJfdGJsW0VOQV9JTlRSX01PREVSX0xPV0VTVF0uaW50cl9tb2Rlcl9pbnRlcnZhbCA9CisJCXJ4X2NvYWxlc2NlX3VzZWNzIC8gZW5hX2Rldi0+aW50cl9kZWxheV9yZXNvbHV0aW9uOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZW5hX2NvbV9kZXN0cm95X2ludGVycnVwdF9tb2RlcmF0aW9uKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlpZiAoZW5hX2Rldi0+aW50cl9tb2Rlcl90YmwpCisJCWRldm1fa2ZyZWUoZW5hX2Rldi0+ZG1hZGV2LCBlbmFfZGV2LT5pbnRyX21vZGVyX3RibCk7CisJZW5hX2Rldi0+aW50cl9tb2Rlcl90YmwgPSBOVUxMOworfQorCitpbnQgZW5hX2NvbV9pbml0X2ludGVycnVwdF9tb2RlcmF0aW9uKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X3Jlc3AgZ2V0X3Jlc3A7CisJdTE2IGRlbGF5X3Jlc29sdXRpb247CisJaW50IHJjOworCisJcmMgPSBlbmFfY29tX2dldF9mZWF0dXJlKGVuYV9kZXYsICZnZXRfcmVzcCwKKwkJCQkgRU5BX0FETUlOX0lOVEVSUlVQVF9NT0RFUkFUSU9OKTsKKworCWlmIChyYykgeworCQlpZiAocmMgPT0gLUVQRVJNKSB7CisJCQlwcl9pbmZvKCJGZWF0dXJlICVkIGlzbid0IHN1cHBvcnRlZFxuIiwKKwkJCQlFTkFfQURNSU5fSU5URVJSVVBUX01PREVSQVRJT04pOworCQkJcmMgPSAwOworCQl9IGVsc2UgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gZ2V0IGludGVycnVwdCBtb2RlcmF0aW9uIGFkbWluIGNtZC4gcmM6ICVkXG4iLAorCQkJICAgICAgIHJjKTsKKwkJfQorCisJCS8qIG5vIG1vZGVyYXRpb24gc3VwcG9ydGVkLCBkaXNhYmxlIGFkYXB0aXZlIHN1cHBvcnQgKi8KKwkJZW5hX2NvbV9kaXNhYmxlX2FkYXB0aXZlX21vZGVyYXRpb24oZW5hX2Rldik7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IGVuYV9jb21faW5pdF9pbnRlcnJ1cHRfbW9kZXJhdGlvbl90YWJsZShlbmFfZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJLyogaWYgbW9kZXJhdGlvbiBpcyBzdXBwb3J0ZWQgYnkgZGV2aWNlIHdlIHNldCBhZGFwdGl2ZSBtb2RlcmF0aW9uICovCisJZGVsYXlfcmVzb2x1dGlvbiA9IGdldF9yZXNwLnUuaW50cl9tb2RlcmF0aW9uLmludHJfZGVsYXlfcmVzb2x1dGlvbjsKKwllbmFfY29tX3VwZGF0ZV9pbnRyX2RlbGF5X3Jlc29sdXRpb24oZW5hX2RldiwgZGVsYXlfcmVzb2x1dGlvbik7CisJZW5hX2NvbV9lbmFibGVfYWRhcHRpdmVfbW9kZXJhdGlvbihlbmFfZGV2KTsKKworCXJldHVybiAwOworZXJyOgorCWVuYV9jb21fZGVzdHJveV9pbnRlcnJ1cHRfbW9kZXJhdGlvbihlbmFfZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgZW5hX2NvbV9jb25maWdfZGVmYXVsdF9pbnRlcnJ1cHRfbW9kZXJhdGlvbl90YWJsZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5ICppbnRyX21vZGVyX3RibCA9IGVuYV9kZXYtPmludHJfbW9kZXJfdGJsOworCisJaWYgKCFpbnRyX21vZGVyX3RibCkKKwkJcmV0dXJuOworCisJaW50cl9tb2Rlcl90YmxbRU5BX0lOVFJfTU9ERVJfTE9XRVNUXS5pbnRyX21vZGVyX2ludGVydmFsID0KKwkJRU5BX0lOVFJfTE9XRVNUX1VTRUNTOworCWludHJfbW9kZXJfdGJsW0VOQV9JTlRSX01PREVSX0xPV0VTVF0ucGt0c19wZXJfaW50ZXJ2YWwgPQorCQlFTkFfSU5UUl9MT1dFU1RfUEtUUzsKKwlpbnRyX21vZGVyX3RibFtFTkFfSU5UUl9NT0RFUl9MT1dFU1RdLmJ5dGVzX3Blcl9pbnRlcnZhbCA9CisJCUVOQV9JTlRSX0xPV0VTVF9CWVRFUzsKKworCWludHJfbW9kZXJfdGJsW0VOQV9JTlRSX01PREVSX0xPV10uaW50cl9tb2Rlcl9pbnRlcnZhbCA9CisJCUVOQV9JTlRSX0xPV19VU0VDUzsKKwlpbnRyX21vZGVyX3RibFtFTkFfSU5UUl9NT0RFUl9MT1ddLnBrdHNfcGVyX2ludGVydmFsID0KKwkJRU5BX0lOVFJfTE9XX1BLVFM7CisJaW50cl9tb2Rlcl90YmxbRU5BX0lOVFJfTU9ERVJfTE9XXS5ieXRlc19wZXJfaW50ZXJ2YWwgPQorCQlFTkFfSU5UUl9MT1dfQllURVM7CisKKwlpbnRyX21vZGVyX3RibFtFTkFfSU5UUl9NT0RFUl9NSURdLmludHJfbW9kZXJfaW50ZXJ2YWwgPQorCQlFTkFfSU5UUl9NSURfVVNFQ1M7CisJaW50cl9tb2Rlcl90YmxbRU5BX0lOVFJfTU9ERVJfTUlEXS5wa3RzX3Blcl9pbnRlcnZhbCA9CisJCUVOQV9JTlRSX01JRF9QS1RTOworCWludHJfbW9kZXJfdGJsW0VOQV9JTlRSX01PREVSX01JRF0uYnl0ZXNfcGVyX2ludGVydmFsID0KKwkJRU5BX0lOVFJfTUlEX0JZVEVTOworCisJaW50cl9tb2Rlcl90YmxbRU5BX0lOVFJfTU9ERVJfSElHSF0uaW50cl9tb2Rlcl9pbnRlcnZhbCA9CisJCUVOQV9JTlRSX0hJR0hfVVNFQ1M7CisJaW50cl9tb2Rlcl90YmxbRU5BX0lOVFJfTU9ERVJfSElHSF0ucGt0c19wZXJfaW50ZXJ2YWwgPQorCQlFTkFfSU5UUl9ISUdIX1BLVFM7CisJaW50cl9tb2Rlcl90YmxbRU5BX0lOVFJfTU9ERVJfSElHSF0uYnl0ZXNfcGVyX2ludGVydmFsID0KKwkJRU5BX0lOVFJfSElHSF9CWVRFUzsKKworCWludHJfbW9kZXJfdGJsW0VOQV9JTlRSX01PREVSX0hJR0hFU1RdLmludHJfbW9kZXJfaW50ZXJ2YWwgPQorCQlFTkFfSU5UUl9ISUdIRVNUX1VTRUNTOworCWludHJfbW9kZXJfdGJsW0VOQV9JTlRSX01PREVSX0hJR0hFU1RdLnBrdHNfcGVyX2ludGVydmFsID0KKwkJRU5BX0lOVFJfSElHSEVTVF9QS1RTOworCWludHJfbW9kZXJfdGJsW0VOQV9JTlRSX01PREVSX0hJR0hFU1RdLmJ5dGVzX3Blcl9pbnRlcnZhbCA9CisJCUVOQV9JTlRSX0hJR0hFU1RfQllURVM7Cit9CisKK3Vuc2lnbmVkIGludCBlbmFfY29tX2dldF9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3R4KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlyZXR1cm4gZW5hX2Rldi0+aW50cl9tb2Rlcl90eF9pbnRlcnZhbDsKK30KKwordW5zaWduZWQgaW50IGVuYV9jb21fZ2V0X25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfcngoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSAqaW50cl9tb2Rlcl90YmwgPSBlbmFfZGV2LT5pbnRyX21vZGVyX3RibDsKKworCWlmIChpbnRyX21vZGVyX3RibCkKKwkJcmV0dXJuIGludHJfbW9kZXJfdGJsW0VOQV9JTlRSX01PREVSX0xPV0VTVF0uaW50cl9tb2Rlcl9pbnRlcnZhbDsKKworCXJldHVybiAwOworfQorCit2b2lkIGVuYV9jb21faW5pdF9pbnRyX21vZGVyYXRpb25fZW50cnkoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCQllbnVtIGVuYV9pbnRyX21vZGVyX2xldmVsIGxldmVsLAorCQkJCQlzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkgKmVudHJ5KQoreworCXN0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSAqaW50cl9tb2Rlcl90YmwgPSBlbmFfZGV2LT5pbnRyX21vZGVyX3RibDsKKworCWlmIChsZXZlbCA+PSBFTkFfSU5UUl9NQVhfTlVNX09GX0xFVkVMUykKKwkJcmV0dXJuOworCisJaW50cl9tb2Rlcl90YmxbbGV2ZWxdLmludHJfbW9kZXJfaW50ZXJ2YWwgPSBlbnRyeS0+aW50cl9tb2Rlcl9pbnRlcnZhbDsKKwlpZiAoZW5hX2Rldi0+aW50cl9kZWxheV9yZXNvbHV0aW9uKQorCQlpbnRyX21vZGVyX3RibFtsZXZlbF0uaW50cl9tb2Rlcl9pbnRlcnZhbCAvPQorCQkJZW5hX2Rldi0+aW50cl9kZWxheV9yZXNvbHV0aW9uOworCWludHJfbW9kZXJfdGJsW2xldmVsXS5wa3RzX3Blcl9pbnRlcnZhbCA9IGVudHJ5LT5wa3RzX3Blcl9pbnRlcnZhbDsKKworCS8qIHVzZSBoYXJkY29kZWQgdmFsdWUgdW50aWwgZXRodG9vbCBzdXBwb3J0cyBieXRlY291bnQgcGFyYW1ldGVyICovCisJaWYgKGVudHJ5LT5ieXRlc19wZXJfaW50ZXJ2YWwgIT0gRU5BX0lOVFJfQllURV9DT1VOVF9OT1RfU1VQUE9SVEVEKQorCQlpbnRyX21vZGVyX3RibFtsZXZlbF0uYnl0ZXNfcGVyX2ludGVydmFsID0gZW50cnktPmJ5dGVzX3Blcl9pbnRlcnZhbDsKK30KKwordm9pZCBlbmFfY29tX2dldF9pbnRyX21vZGVyYXRpb25fZW50cnkoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCSAgICAgICBlbnVtIGVuYV9pbnRyX21vZGVyX2xldmVsIGxldmVsLAorCQkJCSAgICAgICBzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkgKmVudHJ5KQoreworCXN0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSAqaW50cl9tb2Rlcl90YmwgPSBlbmFfZGV2LT5pbnRyX21vZGVyX3RibDsKKworCWlmIChsZXZlbCA+PSBFTkFfSU5UUl9NQVhfTlVNX09GX0xFVkVMUykKKwkJcmV0dXJuOworCisJZW50cnktPmludHJfbW9kZXJfaW50ZXJ2YWwgPSBpbnRyX21vZGVyX3RibFtsZXZlbF0uaW50cl9tb2Rlcl9pbnRlcnZhbDsKKwlpZiAoZW5hX2Rldi0+aW50cl9kZWxheV9yZXNvbHV0aW9uKQorCQllbnRyeS0+aW50cl9tb2Rlcl9pbnRlcnZhbCAqPSBlbmFfZGV2LT5pbnRyX2RlbGF5X3Jlc29sdXRpb247CisJZW50cnktPnBrdHNfcGVyX2ludGVydmFsID0KKwlpbnRyX21vZGVyX3RibFtsZXZlbF0ucGt0c19wZXJfaW50ZXJ2YWw7CisJZW50cnktPmJ5dGVzX3Blcl9pbnRlcnZhbCA9IGludHJfbW9kZXJfdGJsW2xldmVsXS5ieXRlc19wZXJfaW50ZXJ2YWw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9jb20uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2NvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOWQ3YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9jb20uaApAQCAtMCwwICsxLDEwMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgRU5BX0NPTQorI2RlZmluZSBFTkFfQ09NCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zaXplcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlICJlbmFfY29tbW9uX2RlZnMuaCIKKyNpbmNsdWRlICJlbmFfYWRtaW5fZGVmcy5oIgorI2luY2x1ZGUgImVuYV9ldGhfaW9fZGVmcy5oIgorI2luY2x1ZGUgImVuYV9yZWdzX2RlZnMuaCIKKworI3VuZGVmIHByX2ZtdAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjZGVmaW5lIEVOQV9NQVhfTlVNX0lPX1FVRVVFUwkJMTI4VQorLyogV2UgbmVlZCB0byBxdWV1ZXMgZm9yIGVhY2ggSU8gKG9uIGZvciBUeCBhbmQgb25lIGZvciBSeCkgKi8KKyNkZWZpbmUgRU5BX1RPVEFMX05VTV9RVUVVRVMJCSgyICogKEVOQV9NQVhfTlVNX0lPX1FVRVVFUykpCisKKyNkZWZpbmUgRU5BX01BWF9IQU5ETEVSUyAyNTYKKworI2RlZmluZSBFTkFfTUFYX1BIWVNfQUREUl9TSVpFX0JJVFMgNDgKKworLyogVW5pdCBpbiB1c2VjICovCisjZGVmaW5lIEVOQV9SRUdfUkVBRF9USU1FT1VUIDIwMDAwMAorCisjZGVmaW5lIEFETUlOX1NRX1NJWkUoZGVwdGgpCSgoZGVwdGgpICogc2l6ZW9mKHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkpKQorI2RlZmluZSBBRE1JTl9DUV9TSVpFKGRlcHRoKQkoKGRlcHRoKSAqIHNpemVvZihzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSkpCisjZGVmaW5lIEFETUlOX0FFTlFfU0laRShkZXB0aCkJKChkZXB0aCkgKiBzaXplb2Yoc3RydWN0IGVuYV9hZG1pbl9hZW5xX2VudHJ5KSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRU5BIGFkYXB0aXZlIGludGVycnVwdCBtb2RlcmF0aW9uIHNldHRpbmdzICovCisKKyNkZWZpbmUgRU5BX0lOVFJfTE9XRVNUX1VTRUNTICAgICAgICAgICAoMCkKKyNkZWZpbmUgRU5BX0lOVFJfTE9XRVNUX1BLVFMgICAgICAgICAgICAoMykKKyNkZWZpbmUgRU5BX0lOVFJfTE9XRVNUX0JZVEVTICAgICAgICAgICAoMiAqIDE1MjQpCisKKyNkZWZpbmUgRU5BX0lOVFJfTE9XX1VTRUNTICAgICAgICAgICAgICAoMzIpCisjZGVmaW5lIEVOQV9JTlRSX0xPV19QS1RTICAgICAgICAgICAgICAgKDEyKQorI2RlZmluZSBFTkFfSU5UUl9MT1dfQllURVMgICAgICAgICAgICAgICgxNiAqIDEwMjQpCisKKyNkZWZpbmUgRU5BX0lOVFJfTUlEX1VTRUNTICAgICAgICAgICAgICAoODApCisjZGVmaW5lIEVOQV9JTlRSX01JRF9QS1RTICAgICAgICAgICAgICAgKDQ4KQorI2RlZmluZSBFTkFfSU5UUl9NSURfQllURVMgICAgICAgICAgICAgICg2NCAqIDEwMjQpCisKKyNkZWZpbmUgRU5BX0lOVFJfSElHSF9VU0VDUyAgICAgICAgICAgICAoMTI4KQorI2RlZmluZSBFTkFfSU5UUl9ISUdIX1BLVFMgICAgICAgICAgICAgICg5NikKKyNkZWZpbmUgRU5BX0lOVFJfSElHSF9CWVRFUyAgICAgICAgICAgICAoMTI4ICogMTAyNCkKKworI2RlZmluZSBFTkFfSU5UUl9ISUdIRVNUX1VTRUNTICAgICAgICAgICgxOTIpCisjZGVmaW5lIEVOQV9JTlRSX0hJR0hFU1RfUEtUUyAgICAgICAgICAgKDEyOCkKKyNkZWZpbmUgRU5BX0lOVFJfSElHSEVTVF9CWVRFUyAgICAgICAgICAoMTkyICogMTAyNCkKKworI2RlZmluZSBFTkFfSU5UUl9JTklUSUFMX1RYX0lOVEVSVkFMX1VTRUNTCQkxOTYKKyNkZWZpbmUgRU5BX0lOVFJfSU5JVElBTF9SWF9JTlRFUlZBTF9VU0VDUwkJNAorI2RlZmluZSBFTkFfSU5UUl9ERUxBWV9PTERfVkFMVUVfV0VJR0hUCQkJNgorI2RlZmluZSBFTkFfSU5UUl9ERUxBWV9ORVdfVkFMVUVfV0VJR0hUCQkJNAorI2RlZmluZSBFTkFfSU5UUl9NT0RFUl9MRVZFTF9TVFJJREUJCQkyCisjZGVmaW5lIEVOQV9JTlRSX0JZVEVfQ09VTlRfTk9UX1NVUFBPUlRFRAkJMHhGRkZGRkYKKworZW51bSBlbmFfaW50cl9tb2Rlcl9sZXZlbCB7CisJRU5BX0lOVFJfTU9ERVJfTE9XRVNUID0gMCwKKwlFTkFfSU5UUl9NT0RFUl9MT1csCisJRU5BX0lOVFJfTU9ERVJfTUlELAorCUVOQV9JTlRSX01PREVSX0hJR0gsCisJRU5BX0lOVFJfTU9ERVJfSElHSEVTVCwKKwlFTkFfSU5UUl9NQVhfTlVNX09GX0xFVkVMUywKK307CisKK3N0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSB7CisJdW5zaWduZWQgaW50IGludHJfbW9kZXJfaW50ZXJ2YWw7CisJdW5zaWduZWQgaW50IHBrdHNfcGVyX2ludGVydmFsOworCXVuc2lnbmVkIGludCBieXRlc19wZXJfaW50ZXJ2YWw7Cit9OworCitlbnVtIHF1ZXVlX2RpcmVjdGlvbiB7CisJRU5BX0NPTV9JT19RVUVVRV9ESVJFQ1RJT05fVFgsCisJRU5BX0NPTV9JT19RVUVVRV9ESVJFQ1RJT05fUlgKK307CisKK3N0cnVjdCBlbmFfY29tX2J1ZiB7CisJZG1hX2FkZHJfdCBwYWRkcjsgLyoqPCBCdWZmZXIgcGh5c2ljYWwgYWRkcmVzcyAqLworCXUxNiBsZW47IC8qKjwgQnVmZmVyIGxlbmd0aCBpbiBieXRlcyAqLworfTsKKworc3RydWN0IGVuYV9jb21fcnhfYnVmX2luZm8geworCXUxNiBsZW47CisJdTE2IHJlcV9pZDsKK307CisKK3N0cnVjdCBlbmFfY29tX2lvX2Rlc2NfYWRkciB7CisJdTggX19pb21lbSAqcGJ1Zl9kZXZfYWRkcjsgLyogTExRIGFkZHJlc3MgKi8KKwl1OCAqdmlydF9hZGRyOworCWRtYV9hZGRyX3QgcGh5c19hZGRyOworfTsKKworc3RydWN0IGVuYV9jb21fdHhfbWV0YSB7CisJdTE2IG1zczsKKwl1MTYgbDNfaGRyX2xlbjsKKwl1MTYgbDNfaGRyX29mZnNldDsKKwl1MTYgbDRfaGRyX2xlbjsgLyogSW4gd29yZHMgKi8KK307CisKK3N0cnVjdCBlbmFfY29tX2lvX2NxIHsKKwlzdHJ1Y3QgZW5hX2NvbV9pb19kZXNjX2FkZHIgY2Rlc2NfYWRkcjsKKworCS8qIEludGVycnVwdCB1bm1hc2sgcmVnaXN0ZXIgKi8KKwl1MzIgX19pb21lbSAqdW5tYXNrX3JlZzsKKworCS8qIFRoZSBjb21wbGV0aW9uIHF1ZXVlIGhlYWQgZG9vcmJlbGwgcmVnaXN0ZXIgKi8KKwl1MzIgX19pb21lbSAqY3FfaGVhZF9kYl9yZWc7CisKKwkvKiBudW1hIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKGZvciBUUEgpICovCisJdTMyIF9faW9tZW0gKm51bWFfbm9kZV9jZmdfcmVnOworCisJLyogVGhlIHZhbHVlIHRvIHdyaXRlIHRvIHRoZSBhYm92ZSByZWdpc3RlciB0byB1bm1hc2sKKwkgKiB0aGUgaW50ZXJydXB0IG9mIHRoaXMgcXVldWUKKwkgKi8KKwl1MzIgbXNpeF92ZWN0b3I7CisKKwllbnVtIHF1ZXVlX2RpcmVjdGlvbiBkaXJlY3Rpb247CisKKwkvKiBob2xkcyB0aGUgbnVtYmVyIG9mIGNkZXNjIG9mIHRoZSBjdXJyZW50IHBhY2tldCAqLworCXUxNiBjdXJfcnhfcGt0X2NkZXNjX2NvdW50OworCS8qIHNhdmUgdGhlIGZpcnQgY2Rlc2MgaWR4IG9mIHRoZSBjdXJyZW50IHBhY2tldCAqLworCXUxNiBjdXJfcnhfcGt0X2NkZXNjX3N0YXJ0X2lkeDsKKworCXUxNiBxX2RlcHRoOworCS8qIENhbGxlciBxaWQgKi8KKwl1MTYgcWlkOworCisJLyogRGV2aWNlIHF1ZXVlIGluZGV4ICovCisJdTE2IGlkeDsKKwl1MTYgaGVhZDsKKwl1MTYgbGFzdF9oZWFkX3VwZGF0ZTsKKwl1OCBwaGFzZTsKKwl1OCBjZGVzY19lbnRyeV9zaXplX2luX2J5dGVzOworCit9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKworc3RydWN0IGVuYV9jb21faW9fc3EgeworCXN0cnVjdCBlbmFfY29tX2lvX2Rlc2NfYWRkciBkZXNjX2FkZHI7CisKKwl1MzIgX19pb21lbSAqZGJfYWRkcjsKKwl1OCBfX2lvbWVtICpoZWFkZXJfYWRkcjsKKworCWVudW0gcXVldWVfZGlyZWN0aW9uIGRpcmVjdGlvbjsKKwllbnVtIGVuYV9hZG1pbl9wbGFjZW1lbnRfcG9saWN5X3R5cGUgbWVtX3F1ZXVlX3R5cGU7CisKKwl1MzIgbXNpeF92ZWN0b3I7CisJc3RydWN0IGVuYV9jb21fdHhfbWV0YSBjYWNoZWRfdHhfbWV0YTsKKworCXUxNiBxX2RlcHRoOworCXUxNiBxaWQ7CisKKwl1MTYgaWR4OworCXUxNiB0YWlsOworCXUxNiBuZXh0X3RvX2NvbXA7CisJdTMyIHR4X21heF9oZWFkZXJfc2l6ZTsKKwl1OCBwaGFzZTsKKwl1OCBkZXNjX2VudHJ5X3NpemU7CisJdTggZG1hX2FkZHJfYml0czsKK30gX19fX2NhY2hlbGluZV9hbGlnbmVkOworCitzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9jcSB7CisJc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKmVudHJpZXM7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCXUxNiBoZWFkOworCXU4IHBoYXNlOworfTsKKworc3RydWN0IGVuYV9jb21fYWRtaW5fc3EgeworCXN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgKmVudHJpZXM7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCXUzMiBfX2lvbWVtICpkYl9hZGRyOworCisJdTE2IGhlYWQ7CisJdTE2IHRhaWw7CisJdTggcGhhc2U7CisKK307CisKK3N0cnVjdCBlbmFfY29tX3N0YXRzX2FkbWluIHsKKwl1MzIgYWJvcnRlZF9jbWQ7CisJdTMyIHN1Ym1pdHRlZF9jbWQ7CisJdTMyIGNvbXBsZXRlZF9jbWQ7CisJdTMyIG91dF9vZl9zcGFjZTsKKwl1MzIgbm9fY29tcGxldGlvbjsKK307CisKK3N0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlIHsKKwl2b2lkICpxX2RtYWRldjsKKwlzcGlubG9ja190IHFfbG9jazsgLyogc3BpbmxvY2sgZm9yIHRoZSBhZG1pbiBxdWV1ZSAqLworCXN0cnVjdCBlbmFfY29tcF9jdHggKmNvbXBfY3R4OworCXUxNiBxX2RlcHRoOworCXN0cnVjdCBlbmFfY29tX2FkbWluX2NxIGNxOworCXN0cnVjdCBlbmFfY29tX2FkbWluX3NxIHNxOworCisJLyogSW5kaWNhdGUgaWYgdGhlIGFkbWluIHF1ZXVlIHNob3VsZCBwb2xsIGZvciBjb21wbGV0aW9uICovCisJYm9vbCBwb2xsaW5nOworCisJdTE2IGN1cnJfY21kX2lkOworCisJLyogSW5kaWNhdGUgdGhhdCB0aGUgZW5hIHdhcyBpbml0aWFsaXplZCBhbmQgY2FuCisJICogcHJvY2VzcyBuZXcgYWRtaW4gY29tbWFuZHMKKwkgKi8KKwlib29sIHJ1bm5pbmdfc3RhdGU7CisKKwkvKiBDb3VudCB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGFkbWluIGNvbW1hbmRzICovCisJYXRvbWljX3Qgb3V0c3RhbmRpbmdfY21kczsKKworCXN0cnVjdCBlbmFfY29tX3N0YXRzX2FkbWluIHN0YXRzOworfTsKKworc3RydWN0IGVuYV9hZW5xX2hhbmRsZXJzOworCitzdHJ1Y3QgZW5hX2NvbV9hZW5xIHsKKwl1MTYgaGVhZDsKKwl1OCBwaGFzZTsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FlbnFfZW50cnkgKmVudHJpZXM7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwl1MTYgcV9kZXB0aDsKKwlzdHJ1Y3QgZW5hX2FlbnFfaGFuZGxlcnMgKmFlbnFfaGFuZGxlcnM7Cit9OworCitzdHJ1Y3QgZW5hX2NvbV9tbWlvX3JlYWQgeworCXN0cnVjdCBlbmFfYWRtaW5fZW5hX21taW9fcmVxX3JlYWRfbGVzc19yZXNwICpyZWFkX3Jlc3A7CisJZG1hX2FkZHJfdCByZWFkX3Jlc3BfZG1hX2FkZHI7CisJdTE2IHNlcV9udW07CisJYm9vbCByZWFkbGVzc19zdXBwb3J0ZWQ7CisJLyogc3BpbiBsb2NrIHRvIGVuc3VyZSBhIHNpbmdsZSBvdXRzdGFuZGluZyByZWFkICovCisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworc3RydWN0IGVuYV9yc3MgeworCS8qIEluZGlyZWN0IHRhYmxlICovCisJdTE2ICpob3N0X3Jzc19pbmRfdGJsOworCXN0cnVjdCBlbmFfYWRtaW5fcnNzX2luZF90YWJsZV9lbnRyeSAqcnNzX2luZF90Ymw7CisJZG1hX2FkZHJfdCByc3NfaW5kX3RibF9kbWFfYWRkcjsKKwl1MTYgdGJsX2xvZ19zaXplOworCisJLyogSGFzaCBrZXkgKi8KKwllbnVtIGVuYV9hZG1pbl9oYXNoX2Z1bmN0aW9ucyBoYXNoX2Z1bmM7CisJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19mbG93X2hhc2hfY29udHJvbCAqaGFzaF9rZXk7CisJZG1hX2FkZHJfdCBoYXNoX2tleV9kbWFfYWRkcjsKKwl1MzIgaGFzaF9pbml0X3ZhbDsKKworCS8qIEZsb3cgQ29udHJvbCAqLworCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfaGFzaF9jb250cm9sICpoYXNoX2N0cmw7CisJZG1hX2FkZHJfdCBoYXNoX2N0cmxfZG1hX2FkZHI7CisKK307CisKK3N0cnVjdCBlbmFfaG9zdF9hdHRyaWJ1dGUgeworCS8qIERlYnVnIGFyZWEgKi8KKwl1OCAqZGVidWdfYXJlYV92aXJ0X2FkZHI7CisJZG1hX2FkZHJfdCBkZWJ1Z19hcmVhX2RtYV9hZGRyOworCXUzMiBkZWJ1Z19hcmVhX3NpemU7CisKKwkvKiBIb3N0IGluZm9ybWF0aW9uICovCisJc3RydWN0IGVuYV9hZG1pbl9ob3N0X2luZm8gKmhvc3RfaW5mbzsKKwlkbWFfYWRkcl90IGhvc3RfaW5mb19kbWFfYWRkcjsKK307CisKKy8qIEVhY2ggZW5hX2RldiBpcyBhIFBDSSBmdW5jdGlvbi4gKi8KK3N0cnVjdCBlbmFfY29tX2RldiB7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgYWRtaW5fcXVldWU7CisJc3RydWN0IGVuYV9jb21fYWVucSBhZW5xOworCXN0cnVjdCBlbmFfY29tX2lvX2NxIGlvX2NxX3F1ZXVlc1tFTkFfVE9UQUxfTlVNX1FVRVVFU107CisJc3RydWN0IGVuYV9jb21faW9fc3EgaW9fc3FfcXVldWVzW0VOQV9UT1RBTF9OVU1fUVVFVUVTXTsKKwl1OCBfX2lvbWVtICpyZWdfYmFyOworCXZvaWQgX19pb21lbSAqbWVtX2JhcjsKKwl2b2lkICpkbWFkZXY7CisKKwllbnVtIGVuYV9hZG1pbl9wbGFjZW1lbnRfcG9saWN5X3R5cGUgdHhfbWVtX3F1ZXVlX3R5cGU7CisJdTMyIHR4X21heF9oZWFkZXJfc2l6ZTsKKwl1MTYgc3RhdHNfZnVuYzsgLyogU2VsZWN0ZWQgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHN0YXRpc3RpYyBkdW1wICovCisJdTE2IHN0YXRzX3F1ZXVlOyAvKiBTZWxlY3RlZCBxdWV1ZSBmb3IgZXh0ZW5kZWQgc3RhdGlzdGljIGR1bXAgKi8KKworCXN0cnVjdCBlbmFfY29tX21taW9fcmVhZCBtbWlvX3JlYWQ7CisKKwlzdHJ1Y3QgZW5hX3JzcyByc3M7CisJdTMyIHN1cHBvcnRlZF9mZWF0dXJlczsKKwl1MzIgZG1hX2FkZHJfYml0czsKKworCXN0cnVjdCBlbmFfaG9zdF9hdHRyaWJ1dGUgaG9zdF9hdHRyOworCWJvb2wgYWRhcHRpdmVfY29hbGVzY2luZzsKKwl1MTYgaW50cl9kZWxheV9yZXNvbHV0aW9uOworCXUzMiBpbnRyX21vZGVyX3R4X2ludGVydmFsOworCXN0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSAqaW50cl9tb2Rlcl90Ymw7Cit9OworCitzdHJ1Y3QgZW5hX2NvbV9kZXZfZ2V0X2ZlYXR1cmVzX2N0eCB7CisJc3RydWN0IGVuYV9hZG1pbl9xdWV1ZV9mZWF0dXJlX2Rlc2MgbWF4X3F1ZXVlczsKKwlzdHJ1Y3QgZW5hX2FkbWluX2RldmljZV9hdHRyX2ZlYXR1cmVfZGVzYyBkZXZfYXR0cjsKKwlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfYWVucV9kZXNjIGFlbnE7CisJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX29mZmxvYWRfZGVzYyBvZmZsb2FkOworfTsKKworc3RydWN0IGVuYV9jb21fY3JlYXRlX2lvX2N0eCB7CisJZW51bSBlbmFfYWRtaW5fcGxhY2VtZW50X3BvbGljeV90eXBlIG1lbV9xdWV1ZV90eXBlOworCWVudW0gcXVldWVfZGlyZWN0aW9uIGRpcmVjdGlvbjsKKwlpbnQgbnVtYV9ub2RlOworCXUzMiBtc2l4X3ZlY3RvcjsKKwl1MTYgcXVldWVfc2l6ZTsKKwl1MTYgcWlkOworfTsKKwordHlwZWRlZiB2b2lkICgqZW5hX2FlbnFfaGFuZGxlcikodm9pZCAqZGF0YSwKKwlzdHJ1Y3QgZW5hX2FkbWluX2FlbnFfZW50cnkgKmFlbnFfZSk7CisKKy8qIEhvbGRzIGFlbnEgaGFuZGxlcnMuIEluZGV4ZWQgYnkgQUVOUSBldmVudCBncm91cCAqLworc3RydWN0IGVuYV9hZW5xX2hhbmRsZXJzIHsKKwllbmFfYWVucV9oYW5kbGVyIGhhbmRsZXJzW0VOQV9NQVhfSEFORExFUlNdOworCWVuYV9hZW5xX2hhbmRsZXIgdW5pbXBsZW1lbnRlZF9oYW5kbGVyOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBlbmFfY29tX21taW9fcmVnX3JlYWRfcmVxdWVzdF9pbml0IC0gSW5pdCB0aGUgbW1pbyByZWcgcmVhZCBtZWNoYW5pc20KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBJbml0aWFsaXplIHRoZSByZWdpc3RlciByZWFkIG1lY2hhbmlzbS4KKyAqCisgKiBAbm90ZTogVGhpcyBtZXRob2QgbXVzdCBiZSB0aGUgZmlyc3Qgc3RhZ2UgaW4gdGhlIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLgorICoKKyAqIEByZXR1cm4gLSAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBlbmFfY29tX21taW9fcmVnX3JlYWRfcmVxdWVzdF9pbml0KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fc2V0X21taW9fcmVhZF9tb2RlIC0gRW5hYmxlL2Rpc2FibGUgdGhlIG1taW8gcmVnIHJlYWQgbWVjaGFuaXNtCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAcmVhZGxlc3Nfc3VwcG9ydGVkOiByZWFkbGVzcyBtb2RlIChlbmFibGUvZGlzYWJsZSkKKyAqLwordm9pZCBlbmFfY29tX3NldF9tbWlvX3JlYWRfbW9kZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJYm9vbCByZWFkbGVzc19zdXBwb3J0ZWQpOworCisvKiBlbmFfY29tX21taW9fcmVnX3JlYWRfcmVxdWVzdF93cml0ZV9kZXZfYWRkciAtIFdyaXRlIHRoZSBtbWlvIHJlZyByZWFkIHJldHVybgorICogdmFsdWUgcGh5c2ljYWwgYWRkcmVzcy4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqLwordm9pZCBlbmFfY29tX21taW9fcmVnX3JlYWRfcmVxdWVzdF93cml0ZV9kZXZfYWRkcihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX21taW9fcmVnX3JlYWRfcmVxdWVzdF9kZXN0cm95IC0gRGVzdHJveSB0aGUgbW1pbyByZWcgcmVhZCBtZWNoYW5pc20KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqLwordm9pZCBlbmFfY29tX21taW9fcmVnX3JlYWRfcmVxdWVzdF9kZXN0cm95KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fYWRtaW5faW5pdCAtIEluaXQgdGhlIGFkbWluIGFuZCB0aGUgYXN5bmMgcXVldWVzCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAYWVucV9oYW5kbGVyczogVGhvc2UgaGFuZGxlcnMgdG8gYmUgY2FsbGVkIHVwb24gZXZlbnQuCisgKiBAaW5pdF9zcGlubG9jazogSW5kaWNhdGUgaWYgdGhpcyBtZXRob2Qgc2hvdWxkIGluaXQgdGhlIGFkbWluIHNwaW5sb2NrIG9yCisgKiB0aGUgc3BpbmxvY2sgd2FzIGluaXQgYmVmb3JlIChmb3IgZXhhbXBsZSwgaW4gYSBjYXNlIG9mIEZMUikuCisgKgorICogSW5pdGlhbGl6ZSB0aGUgYWRtaW4gc3VibWlzc2lvbiBhbmQgY29tcGxldGlvbiBxdWV1ZXMuCisgKiBJbml0aWFsaXplIHRoZSBhc3luY2hyb25vdXMgZXZlbnRzIG5vdGlmaWNhdGlvbiBxdWV1ZXMuCisgKgorICogQHJldHVybiAtIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworaW50IGVuYV9jb21fYWRtaW5faW5pdChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCSAgICAgICBzdHJ1Y3QgZW5hX2FlbnFfaGFuZGxlcnMgKmFlbnFfaGFuZGxlcnMsCisJCSAgICAgICBib29sIGluaXRfc3BpbmxvY2spOworCisvKiBlbmFfY29tX2FkbWluX2Rlc3Ryb3kgLSBEZXN0cm95IHRoZSBhZG1pbiBhbmQgdGhlIGFzeW5jIGV2ZW50cyBxdWV1ZXMuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogQG5vdGU6IEJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLCB0aGUgY2FsbGVyIG11c3QgdmFsaWRhdGUgdGhhdCB0aGUgZGV2aWNlCisgKiB3b24ndCBzZW5kIGFueSBhZGRpdGlvbmFsIGFkbWluIGNvbXBsZXRpb25zL2FlbnEuCisgKiBUbyBhY2hpZXZlIHRoYXQsIGEgRkxSIGlzIHJlY29tbWVuZGVkLgorICovCit2b2lkIGVuYV9jb21fYWRtaW5fZGVzdHJveShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2Rldl9yZXNldCAtIFBlcmZvcm0gZGV2aWNlIEZMUiB0byB0aGUgZGV2aWNlLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIEByZXR1cm4gLSAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBlbmFfY29tX2Rldl9yZXNldChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2NyZWF0ZV9pb19xdWV1ZSAtIENyZWF0ZSBpbyBxdWV1ZS4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBjdHggLSBjcmVhdGUgY29udGV4dCBzdHJ1Y3R1cmUKKyAqCisgKiBDcmVhdGUgdGhlIHN1Ym1pc3Npb24gYW5kIHRoZSBjb21wbGV0aW9uIHF1ZXVlcy4KKyAqCisgKiBAcmV0dXJuIC0gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICovCitpbnQgZW5hX2NvbV9jcmVhdGVfaW9fcXVldWUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgIHN0cnVjdCBlbmFfY29tX2NyZWF0ZV9pb19jdHggKmN0eCk7CisKKy8qIGVuYV9jb21fZGVzdHJveV9pb19xdWV1ZSAtIERlc3Ryb3kgSU8gcXVldWUgd2l0aCB0aGUgcXVldWUgaWQgLSBxaWQuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAcWlkIC0gdGhlIGNhbGxlciB2aXJ0dWFsIHF1ZXVlIGlkLgorICovCit2b2lkIGVuYV9jb21fZGVzdHJveV9pb19xdWV1ZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIHUxNiBxaWQpOworCisvKiBlbmFfY29tX2dldF9pb19oYW5kbGVycyAtIFJldHVybiB0aGUgaW8gcXVldWUgaGFuZGxlcnMKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBxaWQgLSB0aGUgY2FsbGVyIHZpcnR1YWwgcXVldWUgaWQuCisgKiBAaW9fc3EgLSBJTyBzdWJtaXNzaW9uIHF1ZXVlIGhhbmRsZXIKKyAqIEBpb19jcSAtIElPIGNvbXBsZXRpb24gcXVldWUgaGFuZGxlci4KKyAqCisgKiBAcmV0dXJuIC0gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICovCitpbnQgZW5hX2NvbV9nZXRfaW9faGFuZGxlcnMoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCB1MTYgcWlkLAorCQkJICAgIHN0cnVjdCBlbmFfY29tX2lvX3NxICoqaW9fc3EsCisJCQkgICAgc3RydWN0IGVuYV9jb21faW9fY3EgKippb19jcSk7CisKKy8qIGVuYV9jb21fYWRtaW5fYWVucV9lbmFibGUgLSBFTkFibGUgYXN5bmNocm9ub3VzIGV2ZW50IG5vdGlmaWNhdGlvbnMKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBBZnRlciB0aGlzIG1ldGhvZCwgYWVucSBldmVudCBjYW4gYmUgcmVjZWl2ZWQgdmlhIEFFTlEuCisgKi8KK3ZvaWQgZW5hX2NvbV9hZG1pbl9hZW5xX2VuYWJsZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX3NldF9hZG1pbl9ydW5uaW5nX3N0YXRlIC0gU2V0IHRoZSBzdGF0ZSBvZiB0aGUgYWRtaW4gcXVldWUKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBhZG1pbiBxdWV1ZSAoZW5hYmxlL2Rpc2FibGUpCisgKi8KK3ZvaWQgZW5hX2NvbV9zZXRfYWRtaW5fcnVubmluZ19zdGF0ZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIGJvb2wgc3RhdGUpOworCisvKiBlbmFfY29tX2dldF9hZG1pbl9ydW5uaW5nX3N0YXRlIC0gR2V0IHRoZSBhZG1pbiBxdWV1ZSBzdGF0ZQorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIFJldHJpZXZlIHRoZSBzdGF0ZSBvZiB0aGUgYWRtaW4gcXVldWUgKGVuYWJsZS9kaXNhYmxlKQorICoKKyAqIEByZXR1cm4gLSBjdXJyZW50IHBvbGxpbmcgbW9kZSAoZW5hYmxlL2Rpc2FibGUpCisgKi8KK2Jvb2wgZW5hX2NvbV9nZXRfYWRtaW5fcnVubmluZ19zdGF0ZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX3NldF9hZG1pbl9wb2xsaW5nX21vZGUgLSBTZXQgdGhlIGFkbWluIGNvbXBsZXRpb24gcXVldWUgcG9sbGluZyBtb2RlCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAcG9sbGluZzogRU5BYmxlL0Rpc2FibGUgcG9sbGluZyBtb2RlCisgKgorICogU2V0IHRoZSBhZG1pbiBjb21wbGV0aW9uIG1vZGUuCisgKi8KK3ZvaWQgZW5hX2NvbV9zZXRfYWRtaW5fcG9sbGluZ19tb2RlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgYm9vbCBwb2xsaW5nKTsKKworLyogZW5hX2NvbV9zZXRfYWRtaW5fcG9sbGluZ19tb2RlIC0gR2V0IHRoZSBhZG1pbiBjb21wbGV0aW9uIHF1ZXVlIHBvbGxpbmcgbW9kZQorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIEdldCB0aGUgYWRtaW4gY29tcGxldGlvbiBtb2RlLgorICogSWYgcG9sbGluZyBtb2RlIGlzIG9uLCBlbmFfY29tX2V4ZWN1dGVfYWRtaW5fY29tbWFuZCB3aWxsIHBlcmZvcm0gYQorICogcG9sbGluZyBvbiB0aGUgYWRtaW4gY29tcGxldGlvbiBxdWV1ZSBmb3IgdGhlIGNvbW1hbmRzIGNvbXBsZXRpb24sCisgKiBvdGhlcndpc2UgaXQgd2lsbCB3YWl0IG9uIHdhaXQgZXZlbnQuCisgKgorICogQHJldHVybiBzdGF0ZQorICovCitib29sIGVuYV9jb21fZ2V0X2VuYV9hZG1pbl9wb2xsaW5nX21vZGUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9hZG1pbl9xX2NvbXBfaW50cl9oYW5kbGVyIC0gYWRtaW4gcXVldWUgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBUaGlzIG1ldGhvZCBnbyBvdmVyIHRoZSBhZG1pbiBjb21wbGV0aW9uIHF1ZXVlIGFuZCB3YWtlIHVwIGFsbCB0aGUgcGVuZGluZworICogdGhyZWFkcyB0aGF0IHdhaXQgb24gdGhlIGNvbW1hbmRzIHdhaXQgZXZlbnQuCisgKgorICogQG5vdGU6IFNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgTVNJLVggaW50ZXJydXB0LgorICovCit2b2lkIGVuYV9jb21fYWRtaW5fcV9jb21wX2ludHJfaGFuZGxlcihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2FlbnFfaW50cl9oYW5kbGVyIC0gQUVOUSBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIFRoaXMgbWV0aG9kIGdvIG92ZXIgdGhlIGFzeW5jIGV2ZW50IG5vdGlmaWNhdGlvbiBxdWV1ZSBhbmQgY2FsbCB0aGUgcHJvcGVyCisgKiBhZW5xIGhhbmRsZXIuCisgKi8KK3ZvaWQgZW5hX2NvbV9hZW5xX2ludHJfaGFuZGxlcihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmRldiwgdm9pZCAqZGF0YSk7CisKKy8qIGVuYV9jb21fYWJvcnRfYWRtaW5fY29tbWFuZHMgLSBBYm9ydCBhbGwgdGhlIG91dHN0YW5kaW5nIGFkbWluIGNvbW1hbmRzLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIFRoaXMgbWV0aG9kIGFib3J0cyBhbGwgdGhlIG91dHN0YW5kaW5nIGFkbWluIGNvbW1hbmRzLgorICogVGhlIGNhbGxlciBzaG91bGQgdGhlbiBjYWxsIGVuYV9jb21fd2FpdF9mb3JfYWJvcnRfY29tcGxldGlvbiB0byBtYWtlIHN1cmUKKyAqIGFsbCB0aGUgY29tbWFuZHMgd2VyZSBjb21wbGV0ZWQuCisgKi8KK3ZvaWQgZW5hX2NvbV9hYm9ydF9hZG1pbl9jb21tYW5kcyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX3dhaXRfZm9yX2Fib3J0X2NvbXBsZXRpb24gLSBXYWl0IGZvciBhZG1pbiBjb21tYW5kcyBhYm9ydC4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBUaGlzIG1ldGhvZCB3YWl0IHVudGlsIGFsbCB0aGUgb3V0c3RhbmRpbmcgYWRtaW4gY29tbWFuZHMgd2lsbCBiZSBjb21wbGV0ZWQuCisgKi8KK3ZvaWQgZW5hX2NvbV93YWl0X2Zvcl9hYm9ydF9jb21wbGV0aW9uKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fdmFsaWRhdGVfdmVyc2lvbiAtIFZhbGlkYXRlIHRoZSBkZXZpY2UgcGFyYW1ldGVycworICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIFRoaXMgbWV0aG9kIHZhbGlkYXRlIHRoZSBkZXZpY2UgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgYXMgdGhlIHNhdmVkCisgKiBwYXJhbWV0ZXJzIGluIGVuYV9kZXYuCisgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgYWZ0ZXIgZGV2aWNlIHJlc2V0LCB0byB2YWxpZGF0ZSB0aGUgZGV2aWNlIG1hYyBhZGRyZXNzCisgKiBhbmQgdGhlIGRldmljZSBvZmZsb2FkcyBhcmUgdGhlIHNhbWUgYXMgYmVmb3JlIHRoZSByZXNldC4KKyAqCisgKiBAcmV0dXJuIC0gMCBvbiBzdWNjZXNzIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fdmFsaWRhdGVfdmVyc2lvbihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2dldF9saW5rX3BhcmFtcyAtIFJldHJpZXZlIHBoeXNpY2FsIGxpbmsgcGFyYW1ldGVycy4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEByZXNwOiBMaW5rIHBhcmFtZXRlcnMKKyAqCisgKiBSZXRyaWV2ZSB0aGUgcGh5c2ljYWwgbGluayBwYXJhbWV0ZXJzLAorICogbGlrZSBzcGVlZCwgYXV0by1uZWdvdGlhdGlvbiBhbmQgZnVsbCBkdXBsZXggc3VwcG9ydC4KKyAqCisgKiBAcmV0dXJuIC0gMCBvbiBTdWNjZXNzIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fZ2V0X2xpbmtfcGFyYW1zKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICBzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X3Jlc3AgKnJlc3ApOworCisvKiBlbmFfY29tX2dldF9kbWFfd2lkdGggLSBSZXRyaWV2ZSBwaHlzaWNhbCBkbWEgYWRkcmVzcyB3aWR0aCB0aGUgZGV2aWNlCisgKiBzdXBwb3J0cy4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBSZXRyaWV2ZSB0aGUgbWF4aW11bSBwaHlzaWNhbCBhZGRyZXNzIGJpdHMgdGhlIGRldmljZSBjYW4gaGFuZGxlLgorICoKKyAqIEByZXR1cm46ID4gMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX2dldF9kbWFfd2lkdGgoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9zZXRfYWVucV9jb25maWcgLSBTZXQgYWVucSBncm91cHMgY29uZmlndXJhdGlvbnMKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBncm91cHMgZmxhZzogYml0IGZpZWxkcyBmbGFncyBvZiBlbnVtIGVuYV9hZG1pbl9hZW5xX2dyb3VwLgorICoKKyAqIENvbmZpZ3VyZSB3aGljaCBhZW5xIGV2ZW50IGdyb3VwIHRoZSBkcml2ZXIgd291bGQgbGlrZSB0byByZWNlaXZlLgorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9zZXRfYWVucV9jb25maWcoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCB1MzIgZ3JvdXBzX2ZsYWcpOworCisvKiBlbmFfY29tX2dldF9kZXZfYXR0cl9mZWF0IC0gR2V0IGRldmljZSBmZWF0dXJlcworICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQGdldF9mZWF0X2N0eDogcmV0dXJuZWQgY29udGV4dCB0aGF0IGNvbnRhaW4gdGhlIGdldCBmZWF0dXJlcy4KKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fZ2V0X2Rldl9hdHRyX2ZlYXQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgICAgc3RydWN0IGVuYV9jb21fZGV2X2dldF9mZWF0dXJlc19jdHggKmdldF9mZWF0X2N0eCk7CisKKy8qIGVuYV9jb21fZ2V0X2Rldl9iYXNpY19zdGF0cyAtIEdldCBkZXZpY2UgYmFzaWMgc3RhdGlzdGljcworICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQHN0YXRzOiBzdGF0cyByZXR1cm4gdmFsdWUKKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fZ2V0X2Rldl9iYXNpY19zdGF0cyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJc3RydWN0IGVuYV9hZG1pbl9iYXNpY19zdGF0cyAqc3RhdHMpOworCisvKiBlbmFfY29tX3NldF9kZXZfbXR1IC0gQ29uZmlndXJlIHRoZSBkZXZpY2UgbXR1LgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQG10dTogbXR1IHZhbHVlCisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX3NldF9kZXZfbXR1KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgaW50IG10dSk7CisKKy8qIGVuYV9jb21fZ2V0X29mZmxvYWRfc2V0dGluZ3MgLSBSZXRyaWV2ZSB0aGUgZGV2aWNlIG9mZmxvYWRzIGNhcGFiaWxpdGllcworICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQG9mZmxhZDogb2ZmbG9hZCByZXR1cm4gdmFsdWUKKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fZ2V0X29mZmxvYWRfc2V0dGluZ3Moc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCSBzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfb2ZmbG9hZF9kZXNjICpvZmZsb2FkKTsKKworLyogZW5hX2NvbV9yc3NfaW5pdCAtIEluaXQgUlNTCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAbG9nX3NpemU6IGluZGlyZWN0aW9uIGxvZyBzaXplCisgKgorICogQWxsb2NhdGUgUlNTL1JGUyByZXNvdXJjZXMuCisgKiBUaGUgY2FsbGVyIHRoZW4gY2FuIGNvbmZpZ3VyZSByc3MgdXNpbmcgZW5hX2NvbV9zZXRfaGFzaF9mdW5jdGlvbiwKKyAqIGVuYV9jb21fc2V0X2hhc2hfY3RybCBhbmQgZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9zZXQuCisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX3Jzc19pbml0KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgdTE2IGxvZ19zaXplKTsKKworLyogZW5hX2NvbV9yc3NfZGVzdHJveSAtIERlc3Ryb3kgcnNzCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogRnJlZSBhbGwgdGhlIFJTUy9SRlMgcmVzb3VyY2VzLgorICovCit2b2lkIGVuYV9jb21fcnNzX2Rlc3Ryb3koc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9maWxsX2hhc2hfZnVuY3Rpb24gLSBGaWxsIFJTUyBoYXNoIGZ1bmN0aW9uCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAZnVuYzogVGhlIGhhc2ggZnVuY3Rpb24gKFRvZXBsaXR6IG9yIGNyYykKKyAqIEBrZXk6IEhhc2gga2V5IChmb3IgdG9lcGxpdHogaGFzaCkKKyAqIEBrZXlfbGVuOiBrZXkgbGVuZ3RoIChtYXggbGVuZ3RoIDEwIERXKQorICogQGluaXRfdmFsOiBpbml0aWFsIHZhbHVlIGZvciB0aGUgaGFzaCBmdW5jdGlvbgorICoKKyAqIEZpbGwgdGhlIGVuYV9kZXYgcmVzb3VyY2VzIHdpdGggdGhlIGRlc2lyZSBoYXNoIGZ1bmN0aW9uLCBoYXNoIGtleSwga2V5X2xlbgorICogYW5kIGtleSBpbml0aWFsIHZhbHVlIChpZiBuZWVkZWQgYnkgdGhlIGhhc2ggZnVuY3Rpb24pLgorICogVG8gZmx1c2ggdGhlIGtleSBpbnRvIHRoZSBkZXZpY2UgdGhlIGNhbGxlciBzaG91bGQgY2FsbAorICogZW5hX2NvbV9zZXRfaGFzaF9mdW5jdGlvbi4KKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fZmlsbF9oYXNoX2Z1bmN0aW9uKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICAgICBlbnVtIGVuYV9hZG1pbl9oYXNoX2Z1bmN0aW9ucyBmdW5jLAorCQkJICAgICAgIGNvbnN0IHU4ICprZXksIHUxNiBrZXlfbGVuLCB1MzIgaW5pdF92YWwpOworCisvKiBlbmFfY29tX3NldF9oYXNoX2Z1bmN0aW9uIC0gRmx1c2ggdGhlIGhhc2ggZnVuY3Rpb24gYW5kIGl0IGRlcGVuZGVuY2llcyB0bworICogdGhlIGRldmljZS4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBGbHVzaCB0aGUgaGFzaCBmdW5jdGlvbiBhbmQgaXQgZGVwZW5kZW5jaWVzIChrZXksIGtleSBsZW5ndGggYW5kCisgKiBpbml0aWFsIHZhbHVlKSBpZiBuZWVkZWQuCisgKgorICogQG5vdGU6IFByaW9yIHRvIHRoaXMgbWV0aG9kIHRoZSBjYWxsZXIgc2hvdWxkIGNhbGwgZW5hX2NvbV9maWxsX2hhc2hfZnVuY3Rpb24KKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fc2V0X2hhc2hfZnVuY3Rpb24oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9nZXRfaGFzaF9mdW5jdGlvbiAtIFJldHJpZXZlIHRoZSBoYXNoIGZ1bmN0aW9uIGFuZCB0aGUgaGFzaCBrZXkKKyAqIGZyb20gdGhlIGRldmljZS4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBmdW5jOiBoYXNoIGZ1bmN0aW9uCisgKiBAa2V5OiBoYXNoIGtleQorICoKKyAqIFJldHJpZXZlIHRoZSBoYXNoIGZ1bmN0aW9uIGFuZCB0aGUgaGFzaCBrZXkgZnJvbSB0aGUgZGV2aWNlLgorICoKKyAqIEBub3RlOiBJZiB0aGUgY2FsbGVyIGNhbGxlZCBlbmFfY29tX2ZpbGxfaGFzaF9mdW5jdGlvbiBidXQgZGlkbid0IGZsYXNoCisgKiBpdCB0byB0aGUgZGV2aWNlLCB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBsb3N0LgorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9nZXRfaGFzaF9mdW5jdGlvbihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgICBlbnVtIGVuYV9hZG1pbl9oYXNoX2Z1bmN0aW9ucyAqZnVuYywKKwkJCSAgICAgIHU4ICprZXkpOworCisvKiBlbmFfY29tX2ZpbGxfaGFzaF9jdHJsIC0gRmlsbCBSU1MgaGFzaCBjb250cm9sCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0LgorICogQHByb3RvOiBUaGUgcHJvdG9jb2wgdG8gY29uZmlndXJlLgorICogQGhhc2hfZmllbGRzOiBiaXQgbWFzayBvZiBlbmFfYWRtaW5fZmxvd19oYXNoX2ZpZWxkcworICoKKyAqIEZpbGwgdGhlIGVuYV9kZXYgcmVzb3VyY2VzIHdpdGggdGhlIGRlc2lyZSBoYXNoIGNvbnRyb2wgKHRoZSBldGhlcm5ldAorICogZmllbGRzIHRoYXQgdGFrZSBwYXJ0IG9mIHRoZSBoYXNoKSBmb3IgYSBzcGVjaWZpYyBwcm90b2NvbC4KKyAqIFRvIGZsdXNoIHRoZSBoYXNoIGNvbnRyb2wgdG8gdGhlIGRldmljZSwgdGhlIGNhbGxlciBzaG91bGQgY2FsbAorICogZW5hX2NvbV9zZXRfaGFzaF9jdHJsLgorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9maWxsX2hhc2hfY3RybChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICBlbnVtIGVuYV9hZG1pbl9mbG93X2hhc2hfcHJvdG8gcHJvdG8sCisJCQkgICB1MTYgaGFzaF9maWVsZHMpOworCisvKiBlbmFfY29tX3NldF9oYXNoX2N0cmwgLSBGbHVzaCB0aGUgaGFzaCBjb250cm9sIHJlc291cmNlcyB0byB0aGUgZGV2aWNlLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIEZsdXNoIHRoZSBoYXNoIGNvbnRyb2wgKHRoZSBldGhlcm5ldCBmaWVsZHMgdGhhdCB0YWtlIHBhcnQgb2YgdGhlIGhhc2gpCisgKgorICogQG5vdGU6IFByaW9yIHRvIHRoaXMgbWV0aG9kIHRoZSBjYWxsZXIgc2hvdWxkIGNhbGwgZW5hX2NvbV9maWxsX2hhc2hfY3RybC4KKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fc2V0X2hhc2hfY3RybChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2dldF9oYXNoX2N0cmwgLSBSZXRyaWV2ZSB0aGUgaGFzaCBjb250cm9sIGZyb20gdGhlIGRldmljZS4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBwcm90bzogVGhlIHByb3RvY29sIHRvIHJldHJpZXZlLgorICogQGZpZWxkczogYml0IG1hc2sgb2YgZW5hX2FkbWluX2Zsb3dfaGFzaF9maWVsZHMuCisgKgorICogUmV0cmlldmUgdGhlIGhhc2ggY29udHJvbCBmcm9tIHRoZSBkZXZpY2UuCisgKgorICogQG5vdGUsIElmIHRoZSBjYWxsZXIgY2FsbGVkIGVuYV9jb21fZmlsbF9oYXNoX2N0cmwgYnV0IGRpZG4ndCBmbGFzaAorICogaXQgdG8gdGhlIGRldmljZSwgdGhlIG5ldyBjb25maWd1cmF0aW9uIHdpbGwgYmUgbG9zdC4KKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fZ2V0X2hhc2hfY3RybChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgIGVudW0gZW5hX2FkbWluX2Zsb3dfaGFzaF9wcm90byBwcm90bywKKwkJCSAgdTE2ICpmaWVsZHMpOworCisvKiBlbmFfY29tX3NldF9kZWZhdWx0X2hhc2hfY3RybCAtIFNldCB0aGUgaGFzaCBjb250cm9sIHRvIGEgZGVmYXVsdAorICogY29uZmlndXJhdGlvbi4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBGaWxsIHRoZSBlbmFfZGV2IHJlc291cmNlcyB3aXRoIHRoZSBkZWZhdWx0IGhhc2ggY29udHJvbCBjb25maWd1cmF0aW9uLgorICogVG8gZmx1c2ggdGhlIGhhc2ggY29udHJvbCB0byB0aGUgZGV2aWNlLCB0aGUgY2FsbGVyIHNob3VsZCBjYWxsCisgKiBlbmFfY29tX3NldF9oYXNoX2N0cmwuCisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX3NldF9kZWZhdWx0X2hhc2hfY3RybChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2luZGlyZWN0X3RhYmxlX2ZpbGxfZW50cnkgLSBGaWxsIGEgc2luZ2xlIGVudHJ5IGluIHRoZSBSU1MKKyAqIGluZGlyZWN0aW9uIHRhYmxlCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0LgorICogQGVudHJ5X2lkeCAtIGluZGlyZWN0aW9uIHRhYmxlIGVudHJ5LgorICogQGVudHJ5X3ZhbHVlIC0gcmVkaXJlY3Rpb24gdmFsdWUKKyAqCisgKiBGaWxsIGEgc2luZ2xlIGVudHJ5IG9mIHRoZSBSU1MgaW5kaXJlY3Rpb24gdGFibGUgaW4gdGhlIGVuYV9kZXYgcmVzb3VyY2VzLgorICogVG8gZmx1c2ggdGhlIGluZGlyZWN0aW9uIHRhYmxlIHRvIHRoZSBkZXZpY2UsIHRoZSBjYWxsZWQgc2hvdWxkIGNhbGwKKyAqIGVuYV9jb21faW5kaXJlY3RfdGFibGVfc2V0LgorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9maWxsX2VudHJ5KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkgICAgICB1MTYgZW50cnlfaWR4LCB1MTYgZW50cnlfdmFsdWUpOworCisvKiBlbmFfY29tX2luZGlyZWN0X3RhYmxlX3NldCAtIEZsdXNoIHRoZSBpbmRpcmVjdGlvbiB0YWJsZSB0byB0aGUgZGV2aWNlLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIEZsdXNoIHRoZSBpbmRpcmVjdGlvbiBoYXNoIGNvbnRyb2wgdG8gdGhlIGRldmljZS4KKyAqIFByaW9yIHRvIHRoaXMgbWV0aG9kIHRoZSBjYWxsZXIgc2hvdWxkIGNhbGwgZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9maWxsX2VudHJ5CisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX2luZGlyZWN0X3RhYmxlX3NldChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2luZGlyZWN0X3RhYmxlX2dldCAtIFJldHJpZXZlIHRoZSBpbmRpcmVjdGlvbiB0YWJsZSBmcm9tIHRoZSBkZXZpY2UuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAaW5kX3RibDogaW5kaXJlY3Rpb24gdGFibGUKKyAqCisgKiBSZXRyaWV2ZSB0aGUgUlNTIGluZGlyZWN0aW9uIHRhYmxlIGZyb20gdGhlIGRldmljZS4KKyAqCisgKiBAbm90ZTogSWYgdGhlIGNhbGxlciBjYWxsZWQgZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9maWxsX2VudHJ5IGJ1dCBkaWRuJ3QgZmxhc2gKKyAqIGl0IHRvIHRoZSBkZXZpY2UsIHRoZSBuZXcgY29uZmlndXJhdGlvbiB3aWxsIGJlIGxvc3QuCisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX2luZGlyZWN0X3RhYmxlX2dldChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIHUzMiAqaW5kX3RibCk7CisKKy8qIGVuYV9jb21fYWxsb2NhdGVfaG9zdF9pbmZvIC0gQWxsb2NhdGUgaG9zdCBpbmZvIHJlc291cmNlcy4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fYWxsb2NhdGVfaG9zdF9pbmZvKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fYWxsb2NhdGVfZGVidWdfYXJlYSAtIEFsbG9jYXRlIGRlYnVnIGFyZWEuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAZGVidWdfYXJlYV9zaXplIC0gZGVidWcgYXJlYSBzaXplLgorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9hbGxvY2F0ZV9kZWJ1Z19hcmVhKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQl1MzIgZGVidWdfYXJlYV9zaXplKTsKKworLyogZW5hX2NvbV9kZWxldGVfZGVidWdfYXJlYSAtIEZyZWUgdGhlIGRlYnVnIGFyZWEgcmVzb3VyY2VzLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIEZyZWUgdGhlIGFsbG9jYXRlIGRlYnVnIGFyZWEuCisgKi8KK3ZvaWQgZW5hX2NvbV9kZWxldGVfZGVidWdfYXJlYShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2RlbGV0ZV9ob3N0X2luZm8gLSBGcmVlIHRoZSBob3N0IGluZm8gcmVzb3VyY2VzLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIEZyZWUgdGhlIGFsbG9jYXRlIGhvc3QgaW5mby4KKyAqLwordm9pZCBlbmFfY29tX2RlbGV0ZV9ob3N0X2luZm8oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9zZXRfaG9zdF9hdHRyaWJ1dGVzIC0gVXBkYXRlIHRoZSBkZXZpY2Ugd2l0aCB0aGUgaG9zdAorICogYXR0cmlidXRlcyAoZGVidWcgYXJlYSBhbmQgaG9zdCBpbmZvKSBiYXNlIGFkZHJlc3MuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX3NldF9ob3N0X2F0dHJpYnV0ZXMoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9jcmVhdGVfaW9fY3EgLSBDcmVhdGUgaW8gY29tcGxldGlvbiBxdWV1ZS4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBpb19jcSAtIGlvIGNvbXBsZXRpb24gcXVldWUgaGFuZGxlcgorCisgKiBDcmVhdGUgSU8gY29tcGxldGlvbiBxdWV1ZS4KKyAqCisgKiBAcmV0dXJuIC0gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICovCitpbnQgZW5hX2NvbV9jcmVhdGVfaW9fY3Eoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJIHN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcSk7CisKKy8qIGVuYV9jb21fZGVzdHJveV9pb19jcSAtIERlc3Ryb3kgaW8gY29tcGxldGlvbiBxdWV1ZS4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBpb19jcSAtIGlvIGNvbXBsZXRpb24gcXVldWUgaGFuZGxlcgorCisgKiBEZXN0cm95IElPIGNvbXBsZXRpb24gcXVldWUuCisgKgorICogQHJldHVybiAtIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworaW50IGVuYV9jb21fZGVzdHJveV9pb19jcShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgIHN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcSk7CisKKy8qIGVuYV9jb21fZXhlY3V0ZV9hZG1pbl9jb21tYW5kIC0gRXhlY3V0ZSBhZG1pbiBjb21tYW5kCisgKiBAYWRtaW5fcXVldWU6IGFkbWluIHF1ZXVlLgorICogQGNtZDogdGhlIGFkbWluIGNvbW1hbmQgdG8gZXhlY3V0ZS4KKyAqIEBjbWRfc2l6ZTogdGhlIGNvbW1hbmQgc2l6ZS4KKyAqIEBjbWRfY29tcGxldGlvbjogY29tbWFuZCBjb21wbGV0aW9uIHJldHVybiB2YWx1ZS4KKyAqIEBjbWRfY29tcF9zaXplOiBjb21tYW5kIGNvbXBsZXRpb24gc2l6ZS4KKworICogU3VibWl0IGFuIGFkbWluIGNvbW1hbmQgYW5kIHRoZW4gd2FpdCB1bnRpbCB0aGUgZGV2aWNlIHdpbGwgcmV0dXJuIGEKKyAqIGNvbXBsZXRpb24uCisgKiBUaGUgY29tcGxldGlvbiB3aWxsIGJlIGNvcHllZCBpbnRvIGNtZF9jb21wLgorICoKKyAqIEByZXR1cm4gLSAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBlbmFfY29tX2V4ZWN1dGVfYWRtaW5fY29tbWFuZChzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUsCisJCQkJICBzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5ICpjbWQsCisJCQkJICBzaXplX3QgY21kX3NpemUsCisJCQkJICBzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqY21kX2NvbXAsCisJCQkJICBzaXplX3QgY21kX2NvbXBfc2l6ZSk7CisKKy8qIGVuYV9jb21faW5pdF9pbnRlcnJ1cHRfbW9kZXJhdGlvbiAtIEluaXQgaW50ZXJydXB0IG1vZGVyYXRpb24KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBAcmV0dXJuIC0gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICovCitpbnQgZW5hX2NvbV9pbml0X2ludGVycnVwdF9tb2RlcmF0aW9uKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fZGVzdHJveV9pbnRlcnJ1cHRfbW9kZXJhdGlvbiAtIERlc3Ryb3kgaW50ZXJydXB0IG1vZGVyYXRpb24gcmVzb3VyY2VzCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKi8KK3ZvaWQgZW5hX2NvbV9kZXN0cm95X2ludGVycnVwdF9tb2RlcmF0aW9uKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21faW50ZXJydXB0X21vZGVyYXRpb25fc3VwcG9ydGVkIC0gUmV0dXJuIGlmIGludGVycnVwdCBtb2RlcmF0aW9uCisgKiBjYXBhYmlsaXR5IGlzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLgorICoKKyAqIEByZXR1cm4gLSBzdXBwb3J0ZWQgb3Igbm90LgorICovCitib29sIGVuYV9jb21faW50ZXJydXB0X21vZGVyYXRpb25fc3VwcG9ydGVkKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fY29uZmlnX2RlZmF1bHRfaW50ZXJydXB0X21vZGVyYXRpb25fdGFibGUgLSBSZXN0b3JlIHRoZSBpbnRlcnJ1cHQKKyAqIG1vZGVyYXRpb24gdGFibGUgYmFjayB0byB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICovCit2b2lkIGVuYV9jb21fY29uZmlnX2RlZmF1bHRfaW50ZXJydXB0X21vZGVyYXRpb25fdGFibGUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV91cGRhdGVfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF90eCAtIFVwZGF0ZSB0aGUKKyAqIG5vbi1hZGFwdGl2ZSBpbnRlcnZhbCBpbiBUeCBkaXJlY3Rpb24uCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAdHhfY29hbGVzY2VfdXNlY3M6IEludGVydmFsIGluIHVzZWMuCisgKgorICogQHJldHVybiAtIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworaW50IGVuYV9jb21fdXBkYXRlX25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfdHgoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCQkJICAgICAgdTMyIHR4X2NvYWxlc2NlX3VzZWNzKTsKKworLyogZW5hX2NvbV91cGRhdGVfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF9yeCAtIFVwZGF0ZSB0aGUKKyAqIG5vbi1hZGFwdGl2ZSBpbnRlcnZhbCBpbiBSeCBkaXJlY3Rpb24uCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAcnhfY29hbGVzY2VfdXNlY3M6IEludGVydmFsIGluIHVzZWMuCisgKgorICogQHJldHVybiAtIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworaW50IGVuYV9jb21fdXBkYXRlX25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfcngoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCQkJICAgICAgdTMyIHJ4X2NvYWxlc2NlX3VzZWNzKTsKKworLyogZW5hX2NvbV9nZXRfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF90eCAtIFJldHJpZXZlIHRoZQorICogbm9uLWFkYXB0aXZlIGludGVydmFsIGluIFR4IGRpcmVjdGlvbi4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBAcmV0dXJuIC0gaW50ZXJ2YWwgaW4gdXNlYworICovCit1bnNpZ25lZCBpbnQgZW5hX2NvbV9nZXRfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF90eChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2dldF9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3J4IC0gUmV0cmlldmUgdGhlCisgKiBub24tYWRhcHRpdmUgaW50ZXJ2YWwgaW4gUnggZGlyZWN0aW9uLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIEByZXR1cm4gLSBpbnRlcnZhbCBpbiB1c2VjCisgKi8KK3Vuc2lnbmVkIGludCBlbmFfY29tX2dldF9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3J4KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21faW5pdF9pbnRyX21vZGVyYXRpb25fZW50cnkgLSBVcGRhdGUgYSBzaW5nbGUgZW50cnkgaW4gdGhlIGludGVycnVwdAorICogbW9kZXJhdGlvbiB0YWJsZS4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBsZXZlbDogSW50ZXJydXB0IG1vZGVyYXRpb24gdGFibGUgbGV2ZWwKKyAqIEBlbnRyeTogRW50cnkgdmFsdWUKKyAqCisgKiBVcGRhdGUgYSBzaW5nbGUgZW50cnkgaW4gdGhlIGludGVycnVwdCBtb2RlcmF0aW9uIHRhYmxlLgorICovCit2b2lkIGVuYV9jb21faW5pdF9pbnRyX21vZGVyYXRpb25fZW50cnkoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCQllbnVtIGVuYV9pbnRyX21vZGVyX2xldmVsIGxldmVsLAorCQkJCQlzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkgKmVudHJ5KTsKKworLyogZW5hX2NvbV9nZXRfaW50cl9tb2RlcmF0aW9uX2VudHJ5IC0gSW5pdCBlbmFfaW50cl9tb2Rlcl9lbnRyeS4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBsZXZlbDogSW50ZXJydXB0IG1vZGVyYXRpb24gdGFibGUgbGV2ZWwKKyAqIEBlbnRyeTogRW50cnkgdG8gZmlsbC4KKyAqCisgKiBJbml0aWFsaXplIHRoZSBlbnRyeSBhY2NvcmRpbmcgdG8gdGhlIGFkYXB0aXZlIGludGVycnVwdCBtb2RlcmF0aW9uIHRhYmxlLgorICovCit2b2lkIGVuYV9jb21fZ2V0X2ludHJfbW9kZXJhdGlvbl9lbnRyeShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJICAgICAgIGVudW0gZW5hX2ludHJfbW9kZXJfbGV2ZWwgbGV2ZWwsCisJCQkJICAgICAgIHN0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSAqZW50cnkpOworCitzdGF0aWMgaW5saW5lIGJvb2wgZW5hX2NvbV9nZXRfYWRhcHRpdmVfbW9kZXJhdGlvbl9lbmFibGVkKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlyZXR1cm4gZW5hX2Rldi0+YWRhcHRpdmVfY29hbGVzY2luZzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYV9jb21fZW5hYmxlX2FkYXB0aXZlX21vZGVyYXRpb24oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCWVuYV9kZXYtPmFkYXB0aXZlX2NvYWxlc2NpbmcgPSB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hX2NvbV9kaXNhYmxlX2FkYXB0aXZlX21vZGVyYXRpb24oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCWVuYV9kZXYtPmFkYXB0aXZlX2NvYWxlc2NpbmcgPSBmYWxzZTsKK30KKworLyogZW5hX2NvbV9jYWxjdWxhdGVfaW50ZXJydXB0X2RlbGF5IC0gQ2FsY3VsYXRlIG5ldyBpbnRlcnJ1cHQgZGVsYXkKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBwa3RzOiBOdW1iZXIgb2YgcGFja2V0cyBzaW5jZSB0aGUgbGFzdCB1cGRhdGUKKyAqIEBieXRlczogTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZS4KKyAqIEBzbW9vdGhlZF9pbnRlcnZhbDogUmV0dXJuZWQgaW50ZXJ2YWwKKyAqIEBtb2Rlcl90YmxfaWR4OiBDdXJyZW50IHRhYmxlIGxldmVsIGFzIGlucHV0IHVwZGF0ZSBuZXcgbGV2ZWwgYXMgcmV0dXJuCisgKiB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGVuYV9jb21fY2FsY3VsYXRlX2ludGVycnVwdF9kZWxheShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCBwa3RzLAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCAqc21vb3RoZWRfaW50ZXJ2YWwsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCAqbW9kZXJfdGJsX2lkeCkKK3sKKwllbnVtIGVuYV9pbnRyX21vZGVyX2xldmVsIGN1cnJfbW9kZXJfaWR4LCBuZXdfbW9kZXJfaWR4OworCXN0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSAqY3Vycl9tb2Rlcl9lbnRyeTsKKwlzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkgKnByZWRfbW9kZXJfZW50cnk7CisJc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5ICpuZXdfbW9kZXJfZW50cnk7CisJc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5ICppbnRyX21vZGVyX3RibCA9IGVuYV9kZXYtPmludHJfbW9kZXJfdGJsOworCXVuc2lnbmVkIGludCBpbnRlcnZhbDsKKworCS8qIFdlIGFwcGx5IGFkYXB0aXZlIG1vZGVyYXRpb24gb24gUnggcGF0aCBvbmx5LgorCSAqIFR4IHVzZXMgc3RhdGljIGludGVycnVwdCBtb2RlcmF0aW9uLgorCSAqLworCWlmICghcGt0cyB8fCAhYnl0ZXMpCisJCS8qIFR4IGludGVycnVwdCwgb3Igc3B1cmlvdXMgaW50ZXJydXB0LAorCQkgKiBpbiBib3RoIGNhc2VzIHdlIGp1c3QgdXNlIHNhbWUgZGVsYXkgdmFsdWVzCisJCSAqLworCQlyZXR1cm47CisKKwljdXJyX21vZGVyX2lkeCA9IChlbnVtIGVuYV9pbnRyX21vZGVyX2xldmVsKSgqbW9kZXJfdGJsX2lkeCk7CisJaWYgKHVubGlrZWx5KGN1cnJfbW9kZXJfaWR4ID49IEVOQV9JTlRSX01BWF9OVU1fT0ZfTEVWRUxTKSkgeworCQlwcl9lcnIoIldyb25nIG1vZGVyYXRpb24gaW5kZXggJXVcbiIsIGN1cnJfbW9kZXJfaWR4KTsKKwkJcmV0dXJuOworCX0KKworCWN1cnJfbW9kZXJfZW50cnkgPSAmaW50cl9tb2Rlcl90YmxbY3Vycl9tb2Rlcl9pZHhdOworCW5ld19tb2Rlcl9pZHggPSBjdXJyX21vZGVyX2lkeDsKKworCWlmIChjdXJyX21vZGVyX2lkeCA9PSBFTkFfSU5UUl9NT0RFUl9MT1dFU1QpIHsKKwkJaWYgKChwa3RzID4gY3Vycl9tb2Rlcl9lbnRyeS0+cGt0c19wZXJfaW50ZXJ2YWwpIHx8CisJCSAgICAoYnl0ZXMgPiBjdXJyX21vZGVyX2VudHJ5LT5ieXRlc19wZXJfaW50ZXJ2YWwpKQorCQkJbmV3X21vZGVyX2lkeCA9CisJCQkJKGVudW0gZW5hX2ludHJfbW9kZXJfbGV2ZWwpKGN1cnJfbW9kZXJfaWR4ICsgRU5BX0lOVFJfTU9ERVJfTEVWRUxfU1RSSURFKTsKKwl9IGVsc2UgeworCQlwcmVkX21vZGVyX2VudHJ5ID0gJmludHJfbW9kZXJfdGJsW2N1cnJfbW9kZXJfaWR4IC0gRU5BX0lOVFJfTU9ERVJfTEVWRUxfU1RSSURFXTsKKworCQlpZiAoKHBrdHMgPD0gcHJlZF9tb2Rlcl9lbnRyeS0+cGt0c19wZXJfaW50ZXJ2YWwpIHx8CisJCSAgICAoYnl0ZXMgPD0gcHJlZF9tb2Rlcl9lbnRyeS0+Ynl0ZXNfcGVyX2ludGVydmFsKSkKKwkJCW5ld19tb2Rlcl9pZHggPQorCQkJCShlbnVtIGVuYV9pbnRyX21vZGVyX2xldmVsKShjdXJyX21vZGVyX2lkeCAtIEVOQV9JTlRSX01PREVSX0xFVkVMX1NUUklERSk7CisJCWVsc2UgaWYgKChwa3RzID4gY3Vycl9tb2Rlcl9lbnRyeS0+cGt0c19wZXJfaW50ZXJ2YWwpIHx8CisJCQkgKGJ5dGVzID4gY3Vycl9tb2Rlcl9lbnRyeS0+Ynl0ZXNfcGVyX2ludGVydmFsKSkgeworCQkJaWYgKGN1cnJfbW9kZXJfaWR4ICE9IEVOQV9JTlRSX01PREVSX0hJR0hFU1QpCisJCQkJbmV3X21vZGVyX2lkeCA9CisJCQkJCShlbnVtIGVuYV9pbnRyX21vZGVyX2xldmVsKShjdXJyX21vZGVyX2lkeCArIEVOQV9JTlRSX01PREVSX0xFVkVMX1NUUklERSk7CisJCX0KKwl9CisJbmV3X21vZGVyX2VudHJ5ID0gJmludHJfbW9kZXJfdGJsW25ld19tb2Rlcl9pZHhdOworCisJaW50ZXJ2YWwgPSBuZXdfbW9kZXJfZW50cnktPmludHJfbW9kZXJfaW50ZXJ2YWw7CisJKnNtb290aGVkX2ludGVydmFsID0gKAorCQkoaW50ZXJ2YWwgKiBFTkFfSU5UUl9ERUxBWV9ORVdfVkFMVUVfV0VJR0hUICsKKwkJRU5BX0lOVFJfREVMQVlfT0xEX1ZBTFVFX1dFSUdIVCAqICgqc21vb3RoZWRfaW50ZXJ2YWwpKSArIDUpIC8KKwkJMTA7CisKKwkqbW9kZXJfdGJsX2lkeCA9IG5ld19tb2Rlcl9pZHg7Cit9CisKKy8qIGVuYV9jb21fdXBkYXRlX2ludHJfcmVnIC0gUHJlcGFyZSBpbnRlcnJ1cHQgcmVnaXN0ZXIKKyAqIEBpbnRyX3JlZzogaW50ZXJydXB0IHJlZ2lzdGVyIHRvIHVwZGF0ZS4KKyAqIEByeF9kZWxheV9pbnRlcnZhbDogUnggaW50ZXJ2YWwgaW4gdXNlY3MKKyAqIEB0eF9kZWxheV9pbnRlcnZhbDogVHggaW50ZXJ2YWwgaW4gdXNlY3MKKyAqIEB1bm1hc2s6IHVuYXNrIGVuYWJsZS9kaXNhYmxlCisgKgorICogUHJlcGFyZSBpbnRlcnJ1cHQgdXBkYXRlIHJlZ2lzdGVyIHdpdGggdGhlIHN1cHBsaWVkIHBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFfY29tX3VwZGF0ZV9pbnRyX3JlZyhzdHJ1Y3QgZW5hX2V0aF9pb19pbnRyX3JlZyAqaW50cl9yZWcsCisJCQkJCSAgIHUzMiByeF9kZWxheV9pbnRlcnZhbCwKKwkJCQkJICAgdTMyIHR4X2RlbGF5X2ludGVydmFsLAorCQkJCQkgICBib29sIHVubWFzaykKK3sKKwlpbnRyX3JlZy0+aW50cl9jb250cm9sID0gMDsKKwlpbnRyX3JlZy0+aW50cl9jb250cm9sIHw9IHJ4X2RlbGF5X2ludGVydmFsICYKKwkJRU5BX0VUSF9JT19JTlRSX1JFR19SWF9JTlRSX0RFTEFZX01BU0s7CisKKwlpbnRyX3JlZy0+aW50cl9jb250cm9sIHw9CisJCSh0eF9kZWxheV9pbnRlcnZhbCA8PCBFTkFfRVRIX0lPX0lOVFJfUkVHX1RYX0lOVFJfREVMQVlfU0hJRlQpCisJCSYgRU5BX0VUSF9JT19JTlRSX1JFR19UWF9JTlRSX0RFTEFZX01BU0s7CisKKwlpZiAodW5tYXNrKQorCQlpbnRyX3JlZy0+aW50cl9jb250cm9sIHw9IEVOQV9FVEhfSU9fSU5UUl9SRUdfSU5UUl9VTk1BU0tfTUFTSzsKK30KKworI2VuZGlmIC8qICEoRU5BX0NPTSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2NvbW1vbl9kZWZzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9jb21tb25fZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOGQ3MzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9jb21tb25fZGVmcy5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSAtIDIwMTYgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBfRU5BX0NPTU1PTl9IXworI2RlZmluZSBfRU5BX0NPTU1PTl9IXworCisjZGVmaW5lIEVOQV9DT01NT05fU1BFQ19WRVJTSU9OX01BSk9SCTAgLyogICovCisjZGVmaW5lIEVOQV9DT01NT05fU1BFQ19WRVJTSU9OX01JTk9SCTEwIC8qICAqLworCisvKiBFTkEgb3BlcmF0ZXMgd2l0aCA0OC1iaXQgbWVtb3J5IGFkZHJlc3Nlcy4gZW5hX21lbV9hZGRyX3QgKi8KK3N0cnVjdCBlbmFfY29tbW9uX21lbV9hZGRyIHsKKwl1MzIgbWVtX2FkZHJfbG93OworCisJdTE2IG1lbV9hZGRyX2hpZ2g7CisKKwkvKiBNQlogKi8KKwl1MTYgcmVzZXJ2ZWQxNjsKK307CisKKyNlbmRpZiAvKl9FTkFfQ09NTU9OX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9ldGhfY29tLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9ldGhfY29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5YzUzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2V0aF9jb20uYwpAQCAtMCwwICsxLDUwMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImVuYV9ldGhfY29tLmgiCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGVuYV9ldGhfaW9fcnhfY2Rlc2NfYmFzZSAqZW5hX2NvbV9nZXRfbmV4dF9yeF9jZGVzYygKKwlzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3EpCit7CisJc3RydWN0IGVuYV9ldGhfaW9fcnhfY2Rlc2NfYmFzZSAqY2Rlc2M7CisJdTE2IGV4cGVjdGVkX3BoYXNlLCBoZWFkX21hc2tlZDsKKwl1MTYgZGVzY19waGFzZTsKKworCWhlYWRfbWFza2VkID0gaW9fY3EtPmhlYWQgJiAoaW9fY3EtPnFfZGVwdGggLSAxKTsKKwlleHBlY3RlZF9waGFzZSA9IGlvX2NxLT5waGFzZTsKKworCWNkZXNjID0gKHN0cnVjdCBlbmFfZXRoX2lvX3J4X2NkZXNjX2Jhc2UgKikoaW9fY3EtPmNkZXNjX2FkZHIudmlydF9hZGRyCisJCQkrIChoZWFkX21hc2tlZCAqIGlvX2NxLT5jZGVzY19lbnRyeV9zaXplX2luX2J5dGVzKSk7CisKKwlkZXNjX3BoYXNlID0gKGNkZXNjLT5zdGF0dXMgJiBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfUEhBU0VfTUFTSykgPj4KKwkJCUVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9QSEFTRV9TSElGVDsKKworCWlmIChkZXNjX3BoYXNlICE9IGV4cGVjdGVkX3BoYXNlKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBjZGVzYzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYV9jb21fY3FfaW5jX2hlYWQoc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxKQoreworCWlvX2NxLT5oZWFkKys7CisKKwkvKiBTd2l0Y2ggcGhhc2UgYml0IGluIGNhc2Ugb2Ygd3JhcCBhcm91bmQgKi8KKwlpZiAodW5saWtlbHkoKGlvX2NxLT5oZWFkICYgKGlvX2NxLT5xX2RlcHRoIC0gMSkpID09IDApKQorCQlpb19jcS0+cGhhc2UgXj0gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpnZXRfc3FfZGVzYyhzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EpCit7CisJdTE2IHRhaWxfbWFza2VkOworCXUzMiBvZmZzZXQ7CisKKwl0YWlsX21hc2tlZCA9IGlvX3NxLT50YWlsICYgKGlvX3NxLT5xX2RlcHRoIC0gMSk7CisKKwlvZmZzZXQgPSB0YWlsX21hc2tlZCAqIGlvX3NxLT5kZXNjX2VudHJ5X3NpemU7CisKKwlyZXR1cm4gKHZvaWQgKikoKHVpbnRwdHJfdClpb19zcS0+ZGVzY19hZGRyLnZpcnRfYWRkciArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFfY29tX2NvcHlfY3Vycl9zcV9kZXNjX3RvX2RldihzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EpCit7CisJdTE2IHRhaWxfbWFza2VkID0gaW9fc3EtPnRhaWwgJiAoaW9fc3EtPnFfZGVwdGggLSAxKTsKKwl1MzIgb2Zmc2V0ID0gdGFpbF9tYXNrZWQgKiBpb19zcS0+ZGVzY19lbnRyeV9zaXplOworCisJLyogSW4gY2FzZSB0aGlzIHF1ZXVlIGlzbid0IGEgTExRICovCisJaWYgKGlvX3NxLT5tZW1fcXVldWVfdHlwZSA9PSBFTkFfQURNSU5fUExBQ0VNRU5UX1BPTElDWV9IT1NUKQorCQlyZXR1cm47CisKKwltZW1jcHlfdG9pbyhpb19zcS0+ZGVzY19hZGRyLnBidWZfZGV2X2FkZHIgKyBvZmZzZXQsCisJCSAgICBpb19zcS0+ZGVzY19hZGRyLnZpcnRfYWRkciArIG9mZnNldCwKKwkJICAgIGlvX3NxLT5kZXNjX2VudHJ5X3NpemUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hX2NvbV9zcV91cGRhdGVfdGFpbChzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EpCit7CisJaW9fc3EtPnRhaWwrKzsKKworCS8qIFN3aXRjaCBwaGFzZSBiaXQgaW4gY2FzZSBvZiB3cmFwIGFyb3VuZCAqLworCWlmICh1bmxpa2VseSgoaW9fc3EtPnRhaWwgJiAoaW9fc3EtPnFfZGVwdGggLSAxKSkgPT0gMCkpCisJCWlvX3NxLT5waGFzZSBePSAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBlbmFfY29tX3dyaXRlX2hlYWRlcihzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EsCisJCQkJICAgICAgIHU4ICpoZWFkX3NyYywgdTE2IGhlYWRlcl9sZW4pCit7CisJdTE2IHRhaWxfbWFza2VkID0gaW9fc3EtPnRhaWwgJiAoaW9fc3EtPnFfZGVwdGggLSAxKTsKKwl1OCBfX2lvbWVtICpkZXZfaGVhZF9hZGRyID0KKwkJaW9fc3EtPmhlYWRlcl9hZGRyICsgKHRhaWxfbWFza2VkICogaW9fc3EtPnR4X21heF9oZWFkZXJfc2l6ZSk7CisKKwlpZiAoaW9fc3EtPm1lbV9xdWV1ZV90eXBlID09IEVOQV9BRE1JTl9QTEFDRU1FTlRfUE9MSUNZX0hPU1QpCisJCXJldHVybiAwOworCisJaWYgKHVubGlrZWx5KCFpb19zcS0+aGVhZGVyX2FkZHIpKSB7CisJCXByX2VycigiUHVzaCBidWZmZXIgaGVhZGVyIHB0ciBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtY3B5X3RvaW8oZGV2X2hlYWRfYWRkciwgaGVhZF9zcmMsIGhlYWRlcl9sZW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGVuYV9ldGhfaW9fcnhfY2Rlc2NfYmFzZSAqCisJZW5hX2NvbV9yeF9jZGVzY19pZHhfdG9fcHRyKHN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcSwgdTE2IGlkeCkKK3sKKwlpZHggJj0gKGlvX2NxLT5xX2RlcHRoIC0gMSk7CisJcmV0dXJuIChzdHJ1Y3QgZW5hX2V0aF9pb19yeF9jZGVzY19iYXNlICopCisJCSgodWludHB0cl90KWlvX2NxLT5jZGVzY19hZGRyLnZpcnRfYWRkciArCisJCWlkeCAqIGlvX2NxLT5jZGVzY19lbnRyeV9zaXplX2luX2J5dGVzKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgZW5hX2NvbV9jZGVzY19yeF9wa3RfZ2V0KHN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcSwKKwkJCQkJICAgdTE2ICpmaXJzdF9jZGVzY19pZHgpCit7CisJc3RydWN0IGVuYV9ldGhfaW9fcnhfY2Rlc2NfYmFzZSAqY2Rlc2M7CisJdTE2IGNvdW50ID0gMCwgaGVhZF9tYXNrZWQ7CisJdTMyIGxhc3QgPSAwOworCisJZG8geworCQljZGVzYyA9IGVuYV9jb21fZ2V0X25leHRfcnhfY2Rlc2MoaW9fY3EpOworCQlpZiAoIWNkZXNjKQorCQkJYnJlYWs7CisKKwkJZW5hX2NvbV9jcV9pbmNfaGVhZChpb19jcSk7CisJCWNvdW50Kys7CisJCWxhc3QgPSAoY2Rlc2MtPnN0YXR1cyAmIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MQVNUX01BU0spID4+CisJCQlFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTEFTVF9TSElGVDsKKwl9IHdoaWxlICghbGFzdCk7CisKKwlpZiAobGFzdCkgeworCQkqZmlyc3RfY2Rlc2NfaWR4ID0gaW9fY3EtPmN1cl9yeF9wa3RfY2Rlc2Nfc3RhcnRfaWR4OworCQljb3VudCArPSBpb19jcS0+Y3VyX3J4X3BrdF9jZGVzY19jb3VudDsKKworCQloZWFkX21hc2tlZCA9IGlvX2NxLT5oZWFkICYgKGlvX2NxLT5xX2RlcHRoIC0gMSk7CisKKwkJaW9fY3EtPmN1cl9yeF9wa3RfY2Rlc2NfY291bnQgPSAwOworCQlpb19jcS0+Y3VyX3J4X3BrdF9jZGVzY19zdGFydF9pZHggPSBoZWFkX21hc2tlZDsKKworCQlwcl9kZWJ1ZygiZW5hIHFfaWQ6ICVkIHBhY2tldHMgd2VyZSBjb21wbGV0ZWQuIGZpcnN0IGRlc2MgaWR4ICV1IGRlc2NzIyAlZFxuIiwKKwkJCSBpb19jcS0+cWlkLCAqZmlyc3RfY2Rlc2NfaWR4LCBjb3VudCk7CisJfSBlbHNlIHsKKwkJaW9fY3EtPmN1cl9yeF9wa3RfY2Rlc2NfY291bnQgKz0gY291bnQ7CisJCWNvdW50ID0gMDsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBlbmFfY29tX21ldGFfZGVzY19jaGFuZ2VkKHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSwKKwkJCQkJICAgICBzdHJ1Y3QgZW5hX2NvbV90eF9jdHggKmVuYV90eF9jdHgpCit7CisJaW50IHJjOworCisJaWYgKGVuYV90eF9jdHgtPm1ldGFfdmFsaWQpIHsKKwkJcmMgPSBtZW1jbXAoJmlvX3NxLT5jYWNoZWRfdHhfbWV0YSwKKwkJCSAgICAmZW5hX3R4X2N0eC0+ZW5hX21ldGEsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBlbmFfY29tX3R4X21ldGEpKTsKKworCQlpZiAodW5saWtlbHkocmMgIT0gMCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFfY29tX2NyZWF0ZV9hbmRfc3RvcmVfdHhfbWV0YV9kZXNjKHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSwKKwkJCQkJCQkgc3RydWN0IGVuYV9jb21fdHhfY3R4ICplbmFfdHhfY3R4KQoreworCXN0cnVjdCBlbmFfZXRoX2lvX3R4X21ldGFfZGVzYyAqbWV0YV9kZXNjID0gTlVMTDsKKwlzdHJ1Y3QgZW5hX2NvbV90eF9tZXRhICplbmFfbWV0YSA9ICZlbmFfdHhfY3R4LT5lbmFfbWV0YTsKKworCW1ldGFfZGVzYyA9IGdldF9zcV9kZXNjKGlvX3NxKTsKKwltZW1zZXQobWV0YV9kZXNjLCAweDAsIHNpemVvZihzdHJ1Y3QgZW5hX2V0aF9pb190eF9tZXRhX2Rlc2MpKTsKKworCW1ldGFfZGVzYy0+bGVuX2N0cmwgfD0gRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTUVUQV9ERVNDX01BU0s7CisKKwltZXRhX2Rlc2MtPmxlbl9jdHJsIHw9IEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0VYVF9WQUxJRF9NQVNLOworCisJLyogYml0cyAwLTkgb2YgdGhlIG1zcyAqLworCW1ldGFfZGVzYy0+d29yZDIgfD0gKGVuYV9tZXRhLT5tc3MgPDwKKwkJRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTVNTX0xPX1NISUZUKSAmCisJCUVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX01TU19MT19NQVNLOworCS8qIGJpdHMgMTAtMTMgb2YgdGhlIG1zcyAqLworCW1ldGFfZGVzYy0+bGVuX2N0cmwgfD0gKChlbmFfbWV0YS0+bXNzID4+IDEwKSA8PAorCQlFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19NU1NfSElfU0hJRlQpICYKKwkJRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTVNTX0hJX01BU0s7CisKKwkvKiBFeHRlbmRlZCBtZXRhIGRlc2MgKi8KKwltZXRhX2Rlc2MtPmxlbl9jdHJsIHw9IEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0VUSF9NRVRBX1RZUEVfTUFTSzsKKwltZXRhX2Rlc2MtPmxlbl9jdHJsIHw9IEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX01FVEFfU1RPUkVfTUFTSzsKKwltZXRhX2Rlc2MtPmxlbl9jdHJsIHw9IChpb19zcS0+cGhhc2UgPDwKKwkJRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfUEhBU0VfU0hJRlQpICYKKwkJRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfUEhBU0VfTUFTSzsKKworCW1ldGFfZGVzYy0+bGVuX2N0cmwgfD0gRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfRklSU1RfTUFTSzsKKwltZXRhX2Rlc2MtPndvcmQyIHw9IGVuYV9tZXRhLT5sM19oZHJfbGVuICYKKwkJRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTDNfSERSX0xFTl9NQVNLOworCW1ldGFfZGVzYy0+d29yZDIgfD0gKGVuYV9tZXRhLT5sM19oZHJfb2Zmc2V0IDw8CisJCUVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0wzX0hEUl9PRkZfU0hJRlQpICYKKwkJRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTDNfSERSX09GRl9NQVNLOworCisJbWV0YV9kZXNjLT53b3JkMiB8PSAoZW5hX21ldGEtPmw0X2hkcl9sZW4gPDwKKwkJRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTDRfSERSX0xFTl9JTl9XT1JEU19TSElGVCkgJgorCQlFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19MNF9IRFJfTEVOX0lOX1dPUkRTX01BU0s7CisKKwltZXRhX2Rlc2MtPmxlbl9jdHJsIHw9IEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX01FVEFfU1RPUkVfTUFTSzsKKworCS8qIENhY2hlZCB0aGUgbWV0YSBkZXNjICovCisJbWVtY3B5KCZpb19zcS0+Y2FjaGVkX3R4X21ldGEsIGVuYV9tZXRhLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGVuYV9jb21fdHhfbWV0YSkpOworCisJZW5hX2NvbV9jb3B5X2N1cnJfc3FfZGVzY190b19kZXYoaW9fc3EpOworCWVuYV9jb21fc3FfdXBkYXRlX3RhaWwoaW9fc3EpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hX2NvbV9yeF9zZXRfZmxhZ3Moc3RydWN0IGVuYV9jb21fcnhfY3R4ICplbmFfcnhfY3R4LAorCQkJCQlzdHJ1Y3QgZW5hX2V0aF9pb19yeF9jZGVzY19iYXNlICpjZGVzYykKK3sKKwllbmFfcnhfY3R4LT5sM19wcm90byA9IGNkZXNjLT5zdGF0dXMgJgorCQlFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTDNfUFJPVE9fSURYX01BU0s7CisJZW5hX3J4X2N0eC0+bDRfcHJvdG8gPQorCQkoY2Rlc2MtPnN0YXR1cyAmIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MNF9QUk9UT19JRFhfTUFTSykgPj4KKwkJRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0w0X1BST1RPX0lEWF9TSElGVDsKKwllbmFfcnhfY3R4LT5sM19jc3VtX2VyciA9CisJCShjZGVzYy0+c3RhdHVzICYgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0wzX0NTVU1fRVJSX01BU0spID4+CisJCUVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MM19DU1VNX0VSUl9TSElGVDsKKwllbmFfcnhfY3R4LT5sNF9jc3VtX2VyciA9CisJCShjZGVzYy0+c3RhdHVzICYgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0w0X0NTVU1fRVJSX01BU0spID4+CisJCUVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MNF9DU1VNX0VSUl9TSElGVDsKKwllbmFfcnhfY3R4LT5oYXNoID0gY2Rlc2MtPmhhc2g7CisJZW5hX3J4X2N0eC0+ZnJhZyA9CisJCShjZGVzYy0+c3RhdHVzICYgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0lQVjRfRlJBR19NQVNLKSA+PgorCQlFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfSVBWNF9GUkFHX1NISUZUOworCisJcHJfZGVidWcoImVuYV9yeF9jdHgtPmwzX3Byb3RvICVkIGVuYV9yeF9jdHgtPmw0X3Byb3RvICVkXG5lbmFfcnhfY3R4LT5sM19jc3VtX2VyciAlZCBlbmFfcnhfY3R4LT5sNF9jc3VtX2VyciAlZFxuaGFzaCBmcmFnICVkIGZyYWc6ICVkIGNkZXNjX3N0YXR1czogJXhcbiIsCisJCSBlbmFfcnhfY3R4LT5sM19wcm90bywgZW5hX3J4X2N0eC0+bDRfcHJvdG8sCisJCSBlbmFfcnhfY3R4LT5sM19jc3VtX2VyciwgZW5hX3J4X2N0eC0+bDRfY3N1bV9lcnIsCisJCSBlbmFfcnhfY3R4LT5oYXNoLCBlbmFfcnhfY3R4LT5mcmFnLCBjZGVzYy0+c3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICBBUEkgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgZW5hX2NvbV9wcmVwYXJlX3R4KHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSwKKwkJICAgICAgIHN0cnVjdCBlbmFfY29tX3R4X2N0eCAqZW5hX3R4X2N0eCwKKwkJICAgICAgIGludCAqbmJfaHdfZGVzYykKK3sKKwlzdHJ1Y3QgZW5hX2V0aF9pb190eF9kZXNjICpkZXNjID0gTlVMTDsKKwlzdHJ1Y3QgZW5hX2NvbV9idWYgKmVuYV9idWZzID0gZW5hX3R4X2N0eC0+ZW5hX2J1ZnM7CisJdm9pZCAqcHVzaF9oZWFkZXIgPSBlbmFfdHhfY3R4LT5wdXNoX2hlYWRlcjsKKwl1MTYgaGVhZGVyX2xlbiA9IGVuYV90eF9jdHgtPmhlYWRlcl9sZW47CisJdTE2IG51bV9idWZzID0gZW5hX3R4X2N0eC0+bnVtX2J1ZnM7CisJaW50IHRvdGFsX2Rlc2MsIGksIHJjOworCWJvb2wgaGF2ZV9tZXRhOworCXU2NCBhZGRyX2hpOworCisJV0FSTihpb19zcS0+ZGlyZWN0aW9uICE9IEVOQV9DT01fSU9fUVVFVUVfRElSRUNUSU9OX1RYLCAid3JvbmcgUSB0eXBlIik7CisKKwkvKiBudW1fYnVmcyArMSBmb3IgcG90ZW50aWFsIG1ldGEgZGVzYyAqLworCWlmIChlbmFfY29tX3NxX2VtcHR5X3NwYWNlKGlvX3NxKSA8IChudW1fYnVmcyArIDEpKSB7CisJCXByX2VycigiTm90IGVub3VnaCBzcGFjZSBpbiB0aGUgdHggcXVldWVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAodW5saWtlbHkoaGVhZGVyX2xlbiA+IGlvX3NxLT50eF9tYXhfaGVhZGVyX3NpemUpKSB7CisJCXByX2VycigiaGVhZGVyIHNpemUgaXMgdG9vIGxhcmdlICVkIG1heCBoZWFkZXI6ICVkXG4iLAorCQkgICAgICAgaGVhZGVyX2xlbiwgaW9fc3EtPnR4X21heF9oZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHN0YXJ0IHdpdGggcHVzaGluZyB0aGUgaGVhZGVyIChpZiBuZWVkZWQpICovCisJcmMgPSBlbmFfY29tX3dyaXRlX2hlYWRlcihpb19zcSwgcHVzaF9oZWFkZXIsIGhlYWRlcl9sZW4pOworCWlmICh1bmxpa2VseShyYykpCisJCXJldHVybiByYzsKKworCWhhdmVfbWV0YSA9IGVuYV90eF9jdHgtPm1ldGFfdmFsaWQgJiYgZW5hX2NvbV9tZXRhX2Rlc2NfY2hhbmdlZChpb19zcSwKKwkJCWVuYV90eF9jdHgpOworCWlmIChoYXZlX21ldGEpCisJCWVuYV9jb21fY3JlYXRlX2FuZF9zdG9yZV90eF9tZXRhX2Rlc2MoaW9fc3EsIGVuYV90eF9jdHgpOworCisJLyogSWYgdGhlIGNhbGxlciBkb2Vzbid0IHdhbnQgc2VuZCBwYWNrZXRzICovCisJaWYgKHVubGlrZWx5KCFudW1fYnVmcyAmJiAhaGVhZGVyX2xlbikpIHsKKwkJKm5iX2h3X2Rlc2MgPSBoYXZlX21ldGEgPyAwIDogMTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGVzYyA9IGdldF9zcV9kZXNjKGlvX3NxKTsKKwltZW1zZXQoZGVzYywgMHgwLCBzaXplb2Yoc3RydWN0IGVuYV9ldGhfaW9fdHhfZGVzYykpOworCisJLyogU2V0IGZpcnN0IGRlc2Mgd2hlbiB3ZSBkb24ndCBoYXZlIG1ldGEgZGVzY3JpcHRvciAqLworCWlmICghaGF2ZV9tZXRhKQorCQlkZXNjLT5sZW5fY3RybCB8PSBFTkFfRVRIX0lPX1RYX0RFU0NfRklSU1RfTUFTSzsKKworCWRlc2MtPmJ1ZmZfYWRkcl9oaV9oZHJfc3ogfD0gKGhlYWRlcl9sZW4gPDwKKwkJRU5BX0VUSF9JT19UWF9ERVNDX0hFQURFUl9MRU5HVEhfU0hJRlQpICYKKwkJRU5BX0VUSF9JT19UWF9ERVNDX0hFQURFUl9MRU5HVEhfTUFTSzsKKwlkZXNjLT5sZW5fY3RybCB8PSAoaW9fc3EtPnBoYXNlIDw8IEVOQV9FVEhfSU9fVFhfREVTQ19QSEFTRV9TSElGVCkgJgorCQlFTkFfRVRIX0lPX1RYX0RFU0NfUEhBU0VfTUFTSzsKKworCWRlc2MtPmxlbl9jdHJsIHw9IEVOQV9FVEhfSU9fVFhfREVTQ19DT01QX1JFUV9NQVNLOworCisJLyogQml0cyAwLTkgKi8KKwlkZXNjLT5tZXRhX2N0cmwgfD0gKGVuYV90eF9jdHgtPnJlcV9pZCA8PAorCQlFTkFfRVRIX0lPX1RYX0RFU0NfUkVRX0lEX0xPX1NISUZUKSAmCisJCUVOQV9FVEhfSU9fVFhfREVTQ19SRVFfSURfTE9fTUFTSzsKKworCWRlc2MtPm1ldGFfY3RybCB8PSAoZW5hX3R4X2N0eC0+ZGYgPDwKKwkJRU5BX0VUSF9JT19UWF9ERVNDX0RGX1NISUZUKSAmCisJCUVOQV9FVEhfSU9fVFhfREVTQ19ERl9NQVNLOworCisJLyogQml0cyAxMC0xNSAqLworCWRlc2MtPmxlbl9jdHJsIHw9ICgoZW5hX3R4X2N0eC0+cmVxX2lkID4+IDEwKSA8PAorCQlFTkFfRVRIX0lPX1RYX0RFU0NfUkVRX0lEX0hJX1NISUZUKSAmCisJCUVOQV9FVEhfSU9fVFhfREVTQ19SRVFfSURfSElfTUFTSzsKKworCWlmIChlbmFfdHhfY3R4LT5tZXRhX3ZhbGlkKSB7CisJCWRlc2MtPm1ldGFfY3RybCB8PSAoZW5hX3R4X2N0eC0+dHNvX2VuYWJsZSA8PAorCQkJRU5BX0VUSF9JT19UWF9ERVNDX1RTT19FTl9TSElGVCkgJgorCQkJRU5BX0VUSF9JT19UWF9ERVNDX1RTT19FTl9NQVNLOworCQlkZXNjLT5tZXRhX2N0cmwgfD0gZW5hX3R4X2N0eC0+bDNfcHJvdG8gJgorCQkJRU5BX0VUSF9JT19UWF9ERVNDX0wzX1BST1RPX0lEWF9NQVNLOworCQlkZXNjLT5tZXRhX2N0cmwgfD0gKGVuYV90eF9jdHgtPmw0X3Byb3RvIDw8CisJCQlFTkFfRVRIX0lPX1RYX0RFU0NfTDRfUFJPVE9fSURYX1NISUZUKSAmCisJCQlFTkFfRVRIX0lPX1RYX0RFU0NfTDRfUFJPVE9fSURYX01BU0s7CisJCWRlc2MtPm1ldGFfY3RybCB8PSAoZW5hX3R4X2N0eC0+bDNfY3N1bV9lbmFibGUgPDwKKwkJCUVOQV9FVEhfSU9fVFhfREVTQ19MM19DU1VNX0VOX1NISUZUKSAmCisJCQlFTkFfRVRIX0lPX1RYX0RFU0NfTDNfQ1NVTV9FTl9NQVNLOworCQlkZXNjLT5tZXRhX2N0cmwgfD0gKGVuYV90eF9jdHgtPmw0X2NzdW1fZW5hYmxlIDw8CisJCQlFTkFfRVRIX0lPX1RYX0RFU0NfTDRfQ1NVTV9FTl9TSElGVCkgJgorCQkJRU5BX0VUSF9JT19UWF9ERVNDX0w0X0NTVU1fRU5fTUFTSzsKKwkJZGVzYy0+bWV0YV9jdHJsIHw9IChlbmFfdHhfY3R4LT5sNF9jc3VtX3BhcnRpYWwgPDwKKwkJCUVOQV9FVEhfSU9fVFhfREVTQ19MNF9DU1VNX1BBUlRJQUxfU0hJRlQpICYKKwkJCUVOQV9FVEhfSU9fVFhfREVTQ19MNF9DU1VNX1BBUlRJQUxfTUFTSzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2J1ZnM7IGkrKykgeworCQkvKiBUaGUgZmlyc3QgZGVzYyBzaGFyZSB0aGUgc2FtZSBkZXNjIGFzIHRoZSBoZWFkZXIgKi8KKwkJaWYgKGxpa2VseShpICE9IDApKSB7CisJCQllbmFfY29tX2NvcHlfY3Vycl9zcV9kZXNjX3RvX2Rldihpb19zcSk7CisJCQllbmFfY29tX3NxX3VwZGF0ZV90YWlsKGlvX3NxKTsKKworCQkJZGVzYyA9IGdldF9zcV9kZXNjKGlvX3NxKTsKKwkJCW1lbXNldChkZXNjLCAweDAsIHNpemVvZihzdHJ1Y3QgZW5hX2V0aF9pb190eF9kZXNjKSk7CisKKwkJCWRlc2MtPmxlbl9jdHJsIHw9IChpb19zcS0+cGhhc2UgPDwKKwkJCQlFTkFfRVRIX0lPX1RYX0RFU0NfUEhBU0VfU0hJRlQpICYKKwkJCQlFTkFfRVRIX0lPX1RYX0RFU0NfUEhBU0VfTUFTSzsKKwkJfQorCisJCWRlc2MtPmxlbl9jdHJsIHw9IGVuYV9idWZzLT5sZW4gJgorCQkJRU5BX0VUSF9JT19UWF9ERVNDX0xFTkdUSF9NQVNLOworCisJCWFkZHJfaGkgPSAoKGVuYV9idWZzLT5wYWRkciAmCisJCQlHRU5NQVNLX1VMTChpb19zcS0+ZG1hX2FkZHJfYml0cyAtIDEsIDMyKSkgPj4gMzIpOworCisJCWRlc2MtPmJ1ZmZfYWRkcl9sbyA9ICh1MzIpZW5hX2J1ZnMtPnBhZGRyOworCQlkZXNjLT5idWZmX2FkZHJfaGlfaGRyX3N6IHw9IGFkZHJfaGkgJgorCQkJRU5BX0VUSF9JT19UWF9ERVNDX0FERFJfSElfTUFTSzsKKwkJZW5hX2J1ZnMrKzsKKwl9CisKKwkvKiBzZXQgdGhlIGxhc3QgZGVzYyBpbmRpY2F0b3IgKi8KKwlkZXNjLT5sZW5fY3RybCB8PSBFTkFfRVRIX0lPX1RYX0RFU0NfTEFTVF9NQVNLOworCisJZW5hX2NvbV9jb3B5X2N1cnJfc3FfZGVzY190b19kZXYoaW9fc3EpOworCisJZW5hX2NvbV9zcV91cGRhdGVfdGFpbChpb19zcSk7CisKKwl0b3RhbF9kZXNjID0gbWF4X3QodTE2LCBudW1fYnVmcywgMSk7CisJdG90YWxfZGVzYyArPSBoYXZlX21ldGEgPyAxIDogMDsKKworCSpuYl9od19kZXNjID0gdG90YWxfZGVzYzsKKwlyZXR1cm4gMDsKK30KKworaW50IGVuYV9jb21fcnhfcGt0KHN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcSwKKwkJICAgc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxLAorCQkgICBzdHJ1Y3QgZW5hX2NvbV9yeF9jdHggKmVuYV9yeF9jdHgpCit7CisJc3RydWN0IGVuYV9jb21fcnhfYnVmX2luZm8gKmVuYV9idWYgPSAmZW5hX3J4X2N0eC0+ZW5hX2J1ZnNbMF07CisJc3RydWN0IGVuYV9ldGhfaW9fcnhfY2Rlc2NfYmFzZSAqY2Rlc2MgPSBOVUxMOworCXUxNiBjZGVzY19pZHggPSAwOworCXUxNiBuYl9od19kZXNjOworCXUxNiBpOworCisJV0FSTihpb19jcS0+ZGlyZWN0aW9uICE9IEVOQV9DT01fSU9fUVVFVUVfRElSRUNUSU9OX1JYLCAid3JvbmcgUSB0eXBlIik7CisKKwluYl9od19kZXNjID0gZW5hX2NvbV9jZGVzY19yeF9wa3RfZ2V0KGlvX2NxLCAmY2Rlc2NfaWR4KTsKKwlpZiAobmJfaHdfZGVzYyA9PSAwKSB7CisJCWVuYV9yeF9jdHgtPmRlc2NzID0gbmJfaHdfZGVzYzsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJfZGVidWcoImZldGNoIHJ4IHBhY2tldDogcXVldWUgJWQgY29tcGxldGVkIGRlc2M6ICVkXG4iLCBpb19jcS0+cWlkLAorCQkgbmJfaHdfZGVzYyk7CisKKwlpZiAodW5saWtlbHkobmJfaHdfZGVzYyA+IGVuYV9yeF9jdHgtPm1heF9idWZzKSkgeworCQlwcl9lcnIoIlRvbyBtYW55IFJYIGNkZXNjcyAoJWQpID4gTUFYKCVkKVxuIiwgbmJfaHdfZGVzYywKKwkJICAgICAgIGVuYV9yeF9jdHgtPm1heF9idWZzKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5iX2h3X2Rlc2M7IGkrKykgeworCQljZGVzYyA9IGVuYV9jb21fcnhfY2Rlc2NfaWR4X3RvX3B0cihpb19jcSwgY2Rlc2NfaWR4ICsgaSk7CisKKwkJZW5hX2J1Zi0+bGVuID0gY2Rlc2MtPmxlbmd0aDsKKwkJZW5hX2J1Zi0+cmVxX2lkID0gY2Rlc2MtPnJlcV9pZDsKKwkJZW5hX2J1ZisrOworCX0KKworCS8qIFVwZGF0ZSBTUSBoZWFkIHB0ciAqLworCWlvX3NxLT5uZXh0X3RvX2NvbXAgKz0gbmJfaHdfZGVzYzsKKworCXByX2RlYnVnKCJbJXNdW1FJRCMlZF0gVXBkYXRpbmcgU1EgaGVhZCB0bzogJWRcbiIsIF9fZnVuY19fLCBpb19zcS0+cWlkLAorCQkgaW9fc3EtPm5leHRfdG9fY29tcCk7CisKKwkvKiBHZXQgcnggZmxhZ3MgZnJvbSB0aGUgbGFzdCBwa3QgKi8KKwllbmFfY29tX3J4X3NldF9mbGFncyhlbmFfcnhfY3R4LCBjZGVzYyk7CisKKwllbmFfcnhfY3R4LT5kZXNjcyA9IG5iX2h3X2Rlc2M7CisJcmV0dXJuIDA7Cit9CisKK2ludCBlbmFfY29tX2FkZF9zaW5nbGVfcnhfZGVzYyhzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EsCisJCQkgICAgICAgc3RydWN0IGVuYV9jb21fYnVmICplbmFfYnVmLAorCQkJICAgICAgIHUxNiByZXFfaWQpCit7CisJc3RydWN0IGVuYV9ldGhfaW9fcnhfZGVzYyAqZGVzYzsKKworCVdBUk4oaW9fc3EtPmRpcmVjdGlvbiAhPSBFTkFfQ09NX0lPX1FVRVVFX0RJUkVDVElPTl9SWCwgIndyb25nIFEgdHlwZSIpOworCisJaWYgKHVubGlrZWx5KGVuYV9jb21fc3FfZW1wdHlfc3BhY2UoaW9fc3EpID09IDApKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWRlc2MgPSBnZXRfc3FfZGVzYyhpb19zcSk7CisJbWVtc2V0KGRlc2MsIDB4MCwgc2l6ZW9mKHN0cnVjdCBlbmFfZXRoX2lvX3J4X2Rlc2MpKTsKKworCWRlc2MtPmxlbmd0aCA9IGVuYV9idWYtPmxlbjsKKworCWRlc2MtPmN0cmwgfD0gRU5BX0VUSF9JT19SWF9ERVNDX0ZJUlNUX01BU0s7CisJZGVzYy0+Y3RybCB8PSBFTkFfRVRIX0lPX1JYX0RFU0NfTEFTVF9NQVNLOworCWRlc2MtPmN0cmwgfD0gaW9fc3EtPnBoYXNlICYgRU5BX0VUSF9JT19SWF9ERVNDX1BIQVNFX01BU0s7CisJZGVzYy0+Y3RybCB8PSBFTkFfRVRIX0lPX1JYX0RFU0NfQ09NUF9SRVFfTUFTSzsKKworCWRlc2MtPnJlcV9pZCA9IHJlcV9pZDsKKworCWRlc2MtPmJ1ZmZfYWRkcl9sbyA9ICh1MzIpZW5hX2J1Zi0+cGFkZHI7CisJZGVzYy0+YnVmZl9hZGRyX2hpID0KKwkJKChlbmFfYnVmLT5wYWRkciAmIEdFTk1BU0tfVUxMKGlvX3NxLT5kbWFfYWRkcl9iaXRzIC0gMSwgMzIpKSA+PiAzMik7CisKKwllbmFfY29tX3NxX3VwZGF0ZV90YWlsKGlvX3NxKTsKKworCXJldHVybiAwOworfQorCitpbnQgZW5hX2NvbV90eF9jb21wX3JlcV9pZF9nZXQoc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxLCB1MTYgKnJlcV9pZCkKK3sKKwl1OCBleHBlY3RlZF9waGFzZSwgY2Rlc2NfcGhhc2U7CisJc3RydWN0IGVuYV9ldGhfaW9fdHhfY2Rlc2MgKmNkZXNjOworCXUxNiBtYXNrZWRfaGVhZDsKKworCW1hc2tlZF9oZWFkID0gaW9fY3EtPmhlYWQgJiAoaW9fY3EtPnFfZGVwdGggLSAxKTsKKwlleHBlY3RlZF9waGFzZSA9IGlvX2NxLT5waGFzZTsKKworCWNkZXNjID0gKHN0cnVjdCBlbmFfZXRoX2lvX3R4X2NkZXNjICopCisJCSgodWludHB0cl90KWlvX2NxLT5jZGVzY19hZGRyLnZpcnRfYWRkciArCisJCShtYXNrZWRfaGVhZCAqIGlvX2NxLT5jZGVzY19lbnRyeV9zaXplX2luX2J5dGVzKSk7CisKKwkvKiBXaGVuIHRoZSBjdXJyZW50IGNvbXBsZXRpb24gZGVzY3JpcHRvciBwaGFzZSBpc24ndCB0aGUgc2FtZSBhcyB0aGUKKwkgKiBleHBlY3RlZCwgaXQgbWVhbiB0aGF0IHRoZSBkZXZpY2Ugc3RpbGwgZGlkbid0IHVwZGF0ZQorCSAqIHRoaXMgY29tcGxldGlvbi4KKwkgKi8KKwljZGVzY19waGFzZSA9IGNkZXNjLT5mbGFncyAmIEVOQV9FVEhfSU9fVFhfQ0RFU0NfUEhBU0VfTUFTSzsKKwlpZiAoY2Rlc2NfcGhhc2UgIT0gZXhwZWN0ZWRfcGhhc2UpCisJCXJldHVybiAtRUFHQUlOOworCisJZW5hX2NvbV9jcV9pbmNfaGVhZChpb19jcSk7CisKKwkqcmVxX2lkID0gY2Rlc2MtPnJlcV9pZDsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfZXRoX2NvbS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfZXRoX2NvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNTNjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9ldGhfY29tLmgKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgRU5BX0VUSF9DT01fSF8KKyNkZWZpbmUgRU5BX0VUSF9DT01fSF8KKworI2luY2x1ZGUgImVuYV9jb20uaCIKKworLyogaGVhZCB1cGRhdGUgdGhyZXNob2xkIGluIHVuaXRzIG9mIChxdWV1ZSBzaXplIC8gRU5BX0NPTVBfSEVBRF9USFJFU0gpICovCisjZGVmaW5lIEVOQV9DT01QX0hFQURfVEhSRVNIIDQKKworc3RydWN0IGVuYV9jb21fdHhfY3R4IHsKKwlzdHJ1Y3QgZW5hX2NvbV90eF9tZXRhIGVuYV9tZXRhOworCXN0cnVjdCBlbmFfY29tX2J1ZiAqZW5hX2J1ZnM7CisJLyogRm9yIExMUSwgaGVhZGVyIGJ1ZmZlciAtIHB1c2hlZCB0byB0aGUgZGV2aWNlIG1lbSBzcGFjZSAqLworCXZvaWQgKnB1c2hfaGVhZGVyOworCisJZW51bSBlbmFfZXRoX2lvX2wzX3Byb3RvX2luZGV4IGwzX3Byb3RvOworCWVudW0gZW5hX2V0aF9pb19sNF9wcm90b19pbmRleCBsNF9wcm90bzsKKwl1MTYgbnVtX2J1ZnM7CisJdTE2IHJlcV9pZDsKKwkvKiBGb3IgcmVndWxhciBxdWV1ZSwgaW5kaWNhdGUgdGhlIHNpemUgb2YgdGhlIGhlYWRlcgorCSAqIEZvciBMTFEsIGluZGljYXRlIHRoZSBzaXplIG9mIHRoZSBwdXNoZWQgYnVmZmVyCisJICovCisJdTE2IGhlYWRlcl9sZW47CisKKwl1OCBtZXRhX3ZhbGlkOworCXU4IHRzb19lbmFibGU7CisJdTggbDNfY3N1bV9lbmFibGU7CisJdTggbDRfY3N1bV9lbmFibGU7CisJdTggbDRfY3N1bV9wYXJ0aWFsOworCXU4IGRmOyAvKiBEb24ndCBmcmFnbWVudCAqLworfTsKKworc3RydWN0IGVuYV9jb21fcnhfY3R4IHsKKwlzdHJ1Y3QgZW5hX2NvbV9yeF9idWZfaW5mbyAqZW5hX2J1ZnM7CisJZW51bSBlbmFfZXRoX2lvX2wzX3Byb3RvX2luZGV4IGwzX3Byb3RvOworCWVudW0gZW5hX2V0aF9pb19sNF9wcm90b19pbmRleCBsNF9wcm90bzsKKwlib29sIGwzX2NzdW1fZXJyOworCWJvb2wgbDRfY3N1bV9lcnI7CisJLyogZnJhZ21lbnRlZCBwYWNrZXQgKi8KKwlib29sIGZyYWc7CisJdTMyIGhhc2g7CisJdTE2IGRlc2NzOworCWludCBtYXhfYnVmczsKK307CisKK2ludCBlbmFfY29tX3ByZXBhcmVfdHgoc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxLAorCQkgICAgICAgc3RydWN0IGVuYV9jb21fdHhfY3R4ICplbmFfdHhfY3R4LAorCQkgICAgICAgaW50ICpuYl9od19kZXNjKTsKKworaW50IGVuYV9jb21fcnhfcGt0KHN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcSwKKwkJICAgc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxLAorCQkgICBzdHJ1Y3QgZW5hX2NvbV9yeF9jdHggKmVuYV9yeF9jdHgpOworCitpbnQgZW5hX2NvbV9hZGRfc2luZ2xlX3J4X2Rlc2Moc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxLAorCQkJICAgICAgIHN0cnVjdCBlbmFfY29tX2J1ZiAqZW5hX2J1ZiwKKwkJCSAgICAgICB1MTYgcmVxX2lkKTsKKworaW50IGVuYV9jb21fdHhfY29tcF9yZXFfaWRfZ2V0KHN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcSwgdTE2ICpyZXFfaWQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hX2NvbV91bm1hc2tfaW50cihzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3EsCisJCQkJICAgICAgIHN0cnVjdCBlbmFfZXRoX2lvX2ludHJfcmVnICppbnRyX3JlZykKK3sKKwl3cml0ZWwoaW50cl9yZWctPmludHJfY29udHJvbCwgaW9fY3EtPnVubWFza19yZWcpOworfQorCitzdGF0aWMgaW5saW5lIGludCBlbmFfY29tX3NxX2VtcHR5X3NwYWNlKHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSkKK3sKKwl1MTYgdGFpbCwgbmV4dF90b19jb21wLCBjbnQ7CisKKwluZXh0X3RvX2NvbXAgPSBpb19zcS0+bmV4dF90b19jb21wOworCXRhaWwgPSBpb19zcS0+dGFpbDsKKwljbnQgPSB0YWlsIC0gbmV4dF90b19jb21wOworCisJcmV0dXJuIGlvX3NxLT5xX2RlcHRoIC0gMSAtIGNudDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZW5hX2NvbV93cml0ZV9zcV9kb29yYmVsbChzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EpCit7CisJdTE2IHRhaWw7CisKKwl0YWlsID0gaW9fc3EtPnRhaWw7CisKKwlwcl9kZWJ1Zygid3JpdGUgc3VibWlzc2lvbiBxdWV1ZSBkb29yYmVsbCBmb3IgcXVldWU6ICVkIHRhaWw6ICVkXG4iLAorCQkgaW9fc3EtPnFpZCwgdGFpbCk7CisKKwl3cml0ZWwodGFpbCwgaW9fc3EtPmRiX2FkZHIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGVuYV9jb21fdXBkYXRlX2Rldl9jb21wX2hlYWQoc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxKQoreworCXUxNiB1bnJlcG9ydGVkX2NvbXAsIGhlYWQ7CisJYm9vbCBuZWVkX3VwZGF0ZTsKKworCWhlYWQgPSBpb19jcS0+aGVhZDsKKwl1bnJlcG9ydGVkX2NvbXAgPSBoZWFkIC0gaW9fY3EtPmxhc3RfaGVhZF91cGRhdGU7CisJbmVlZF91cGRhdGUgPSB1bnJlcG9ydGVkX2NvbXAgPiAoaW9fY3EtPnFfZGVwdGggLyBFTkFfQ09NUF9IRUFEX1RIUkVTSCk7CisKKwlpZiAoaW9fY3EtPmNxX2hlYWRfZGJfcmVnICYmIG5lZWRfdXBkYXRlKSB7CisJCXByX2RlYnVnKCJXcml0ZSBjb21wbGV0aW9uIHF1ZXVlIGRvb3JiZWxsIGZvciBxdWV1ZSAlZDogaGVhZDogJWRcbiIsCisJCQkgaW9fY3EtPnFpZCwgaGVhZCk7CisJCXdyaXRlbChoZWFkLCBpb19jcS0+Y3FfaGVhZF9kYl9yZWcpOworCQlpb19jcS0+bGFzdF9oZWFkX3VwZGF0ZSA9IGhlYWQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFfY29tX3VwZGF0ZV9udW1hX25vZGUoc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxLAorCQkJCQkgICAgdTggbnVtYV9ub2RlKQoreworCXN0cnVjdCBlbmFfZXRoX2lvX251bWFfbm9kZV9jZmdfcmVnIG51bWFfY2ZnOworCisJaWYgKCFpb19jcS0+bnVtYV9ub2RlX2NmZ19yZWcpCisJCXJldHVybjsKKworCW51bWFfY2ZnLm51bWFfY2ZnID0gKG51bWFfbm9kZSAmIEVOQV9FVEhfSU9fTlVNQV9OT0RFX0NGR19SRUdfTlVNQV9NQVNLKQorCQl8IEVOQV9FVEhfSU9fTlVNQV9OT0RFX0NGR19SRUdfRU5BQkxFRF9NQVNLOworCisJd3JpdGVsKG51bWFfY2ZnLm51bWFfY2ZnLCBpb19jcS0+bnVtYV9ub2RlX2NmZ19yZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hX2NvbV9jb21wX2FjayhzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EsIHUxNiBlbGVtKQoreworCWlvX3NxLT5uZXh0X3RvX2NvbXAgKz0gZWxlbTsKK30KKworI2VuZGlmIC8qIEVOQV9FVEhfQ09NX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9ldGhfaW9fZGVmcy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfZXRoX2lvX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzIwYzU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfZXRoX2lvX2RlZnMuaApAQCAtMCwwICsxLDQxNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IC0gMjAxNiBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9FTkFfRVRIX0lPX0hfCisjZGVmaW5lIF9FTkFfRVRIX0lPX0hfCisKK2VudW0gZW5hX2V0aF9pb19sM19wcm90b19pbmRleCB7CisJRU5BX0VUSF9JT19MM19QUk9UT19VTktOT1dOCT0gMCwKKworCUVOQV9FVEhfSU9fTDNfUFJPVE9fSVBWNAk9IDgsCisKKwlFTkFfRVRIX0lPX0wzX1BST1RPX0lQVjYJPSAxMSwKKworCUVOQV9FVEhfSU9fTDNfUFJPVE9fRkNPRQk9IDIxLAorCisJRU5BX0VUSF9JT19MM19QUk9UT19ST0NFCT0gMjIsCit9OworCitlbnVtIGVuYV9ldGhfaW9fbDRfcHJvdG9faW5kZXggeworCUVOQV9FVEhfSU9fTDRfUFJPVE9fVU5LTk9XTgkJPSAwLAorCisJRU5BX0VUSF9JT19MNF9QUk9UT19UQ1AJCQk9IDEyLAorCisJRU5BX0VUSF9JT19MNF9QUk9UT19VRFAJCQk9IDEzLAorCisJRU5BX0VUSF9JT19MNF9QUk9UT19ST1VURUFCTEVfUk9DRQk9IDIzLAorfTsKKworc3RydWN0IGVuYV9ldGhfaW9fdHhfZGVzYyB7CisJLyogMTU6MCA6IGxlbmd0aCAtIEJ1ZmZlciBsZW5ndGggaW4gYnl0ZXMsIG11c3QKKwkgKiAgICBpbmNsdWRlIGFueSBwYWNrZXQgdHJhaWxlcnMgdGhhdCB0aGUgRU5BIHN1cHBvc2VkCisJICogICAgdG8gdXBkYXRlIGxpa2UgRW5kLXRvLUVuZCBDUkMsIEF1dGhlbnRpY2F0aW9uIEdNQUMKKwkgKiAgICBldGMuIFRoaXMgbGVuZ3RoIG11c3Qgbm90IGluY2x1ZGUgdGhlCisJICogICAgJ1B1c2hfQnVmZmVyJyBsZW5ndGguIFRoaXMgbGVuZ3RoIG11c3Qgbm90IGluY2x1ZGUKKwkgKiAgICB0aGUgNC1ieXRlIGFkZGVkIGluIHRoZSBlbmQgZm9yIDgwMi4zIEV0aGVybmV0IEZDUworCSAqIDIxOjE2IDogcmVxX2lkX2hpIC0gUmVxdWVzdCBJRFsxNToxMF0KKwkgKiAyMiA6IHJlc2VydmVkMjIgLSBNQloKKwkgKiAyMyA6IG1ldGFfZGVzYyAtIE1CWgorCSAqIDI0IDogcGhhc2UKKwkgKiAyNSA6IHJlc2VydmVkMSAtIE1CWgorCSAqIDI2IDogZmlyc3QgLSBJbmRpY2F0ZXMgZmlyc3QgZGVzY3JpcHRvciBpbgorCSAqICAgIHRyYW5zYWN0aW9uCisJICogMjcgOiBsYXN0IC0gSW5kaWNhdGVzIGxhc3QgZGVzY3JpcHRvciBpbgorCSAqICAgIHRyYW5zYWN0aW9uCisJICogMjggOiBjb21wX3JlcSAtIEluZGljYXRlcyB3aGV0aGVyIGNvbXBsZXRpb24KKwkgKiAgICBzaG91bGQgYmUgcG9zdGVkLCBhZnRlciBwYWNrZXQgaXMgdHJhbnNtaXR0ZWQuCisJICogICAgVmFsaWQgb25seSBmb3IgZmlyc3QgZGVzY3JpcHRvcgorCSAqIDMwOjI5IDogcmVzZXJ2ZWQyOSAtIE1CWgorCSAqIDMxIDogcmVzZXJ2ZWQzMSAtIE1CWgorCSAqLworCXUzMiBsZW5fY3RybDsKKworCS8qIDM6MCA6IGwzX3Byb3RvX2lkeCAtIEwzIHByb3RvY29sLiBUaGlzIGZpZWxkCisJICogICAgcmVxdWlyZWQgd2hlbiBsM19jc3VtX2VuLGwzX2NzdW0gb3IgdHNvX2VuIGFyZSBzZXQuCisJICogNCA6IERGIC0gSVB2NCBERiwgbXVzdCBiZSAwIGlmIHBhY2tldCBpcyBJUHY0IGFuZAorCSAqICAgIERGIGZsYWdzIG9mIHRoZSBJUHY0IGhlYWRlciBpcyAwLiBPdGhlcndpc2UgbXVzdAorCSAqICAgIGJlIHNldCB0byAxCisJICogNjo1IDogcmVzZXJ2ZWQ1CisJICogNyA6IHRzb19lbiAtIEVuYWJsZSBUU08sIEZvciBUQ1Agb25seS4KKwkgKiAxMjo4IDogbDRfcHJvdG9faWR4IC0gTDQgcHJvdG9jb2wuIFRoaXMgZmllbGQgbmVlZAorCSAqICAgIHRvIGJlIHNldCB3aGVuIGw0X2NzdW1fZW4gb3IgdHNvX2VuIGFyZSBzZXQuCisJICogMTMgOiBsM19jc3VtX2VuIC0gZW5hYmxlIElQdjQgaGVhZGVyIGNoZWNrc3VtLgorCSAqIDE0IDogbDRfY3N1bV9lbiAtIGVuYWJsZSBUQ1AvVURQIGNoZWNrc3VtLgorCSAqIDE1IDogZXRoZXJuZXRfZmNzX2RpcyAtIHdoZW4gc2V0LCB0aGUgY29udHJvbGxlcgorCSAqICAgIHdpbGwgbm90IGFwcGVuZCB0aGUgODAyLjMgRXRoZXJuZXQgRnJhbWUgQ2hlY2sKKwkgKiAgICBTZXF1ZW5jZSB0byB0aGUgcGFja2V0CisJICogMTYgOiByZXNlcnZlZDE2CisJICogMTcgOiBsNF9jc3VtX3BhcnRpYWwgLSBMNCBwYXJ0aWFsIGNoZWNrc3VtLiB3aGVuCisJICogICAgc2V0IHRvIDAsIHRoZSBFTkEgY2FsY3VsYXRlcyB0aGUgTDQgY2hlY2tzdW0sCisJICogICAgd2hlcmUgdGhlIERlc3RpbmF0aW9uIEFkZHJlc3MgcmVxdWlyZWQgZm9yIHRoZQorCSAqICAgIFRDUC9VRFAgcHNldWRvLWhlYWRlciBpcyB0YWtlbiBmcm9tIHRoZSBhY3R1YWwKKwkgKiAgICBwYWNrZXQgTDMgaGVhZGVyLiB3aGVuIHNldCB0byAxLCB0aGUgRU5BIGRvZXNuJ3QKKwkgKiAgICBjYWxjdWxhdGUgdGhlIHN1bSBvZiB0aGUgcHNldWRvLWhlYWRlciwgaW5zdGVhZCwKKwkgKiAgICB0aGUgY2hlY2tzdW0gZmllbGQgb2YgdGhlIEw0IGlzIHVzZWQgaW5zdGVhZC4gV2hlbgorCSAqICAgIFRTTyBlbmFibGVkLCB0aGUgY2hlY2tzdW0gb2YgdGhlIHBzZXVkby1oZWFkZXIKKwkgKiAgICBtdXN0IG5vdCBpbmNsdWRlIHRoZSB0Y3AgbGVuZ3RoIGZpZWxkLiBMNCBwYXJ0aWFsCisJICogICAgY2hlY2tzdW0gc2hvdWxkIGJlIHVzZWQgZm9yIElQdjYgcGFja2V0IHRoYXQKKwkgKiAgICBjb250YWlucyBSb3V0aW5nIEhlYWRlcnMuCisJICogMjA6MTggOiByZXNlcnZlZDE4IC0gTUJaCisJICogMjEgOiByZXNlcnZlZDIxIC0gTUJaCisJICogMzE6MjIgOiByZXFfaWRfbG8gLSBSZXF1ZXN0IElEWzk6MF0KKwkgKi8KKwl1MzIgbWV0YV9jdHJsOworCisJdTMyIGJ1ZmZfYWRkcl9sbzsKKworCS8qIGFkZHJlc3MgaGlnaCBhbmQgaGVhZGVyIHNpemUKKwkgKiAxNTowIDogYWRkcl9oaSAtIEJ1ZmZlciBQb2ludGVyWzQ3OjMyXQorCSAqIDIzOjE2IDogcmVzZXJ2ZWQxNl93MgorCSAqIDMxOjI0IDogaGVhZGVyX2xlbmd0aCAtIEhlYWRlciBsZW5ndGguIEZvciBMb3cKKwkgKiAgICBMYXRlbmN5IFF1ZXVlcywgdGhpcyBmaWVsZHMgaW5kaWNhdGVzIHRoZSBudW1iZXIKKwkgKiAgICBvZiBieXRlcyB3cml0dGVuIHRvIHRoZSBoZWFkZXJzJyBtZW1vcnkuIEZvcgorCSAqICAgIG5vcm1hbCBxdWV1ZXMsIGlmIHBhY2tldCBpcyBUQ1Agb3IgVURQLCBhbmQgbG9uZ2VyCisJICogICAgdGhhbiBtYXhfaGVhZGVyX3NpemUsIHRoZW4gdGhpcyBmaWVsZCBzaG91bGQgYmUKKwkgKiAgICBzZXQgdG8gdGhlIHN1bSBvZiBMNCBoZWFkZXIgb2Zmc2V0IGFuZCBMNCBoZWFkZXIKKwkgKiAgICBzaXplKHdpdGhvdXQgb3B0aW9ucyksIG90aGVyd2lzZSwgdGhpcyBmaWVsZAorCSAqICAgIHNob3VsZCBiZSBzZXQgdG8gMC4gRm9yIGJvdGggbW9kZXMsIHRoaXMgZmllbGQKKwkgKiAgICBtdXN0IG5vdCBleGNlZWQgdGhlIG1heF9oZWFkZXJfc2l6ZS4KKwkgKiAgICBtYXhfaGVhZGVyX3NpemUgdmFsdWUgaXMgcmVwb3J0ZWQgYnkgdGhlIE1heAorCSAqICAgIFF1ZXVlcyBGZWF0dXJlIGRlc2NyaXB0b3IKKwkgKi8KKwl1MzIgYnVmZl9hZGRyX2hpX2hkcl9zejsKK307CisKK3N0cnVjdCBlbmFfZXRoX2lvX3R4X21ldGFfZGVzYyB7CisJLyogOTowIDogcmVxX2lkX2xvIC0gUmVxdWVzdCBJRFs5OjBdCisJICogMTE6MTAgOiByZXNlcnZlZDEwIC0gTUJaCisJICogMTIgOiByZXNlcnZlZDEyIC0gTUJaCisJICogMTMgOiByZXNlcnZlZDEzIC0gTUJaCisJICogMTQgOiBleHRfdmFsaWQgLSBpZiBzZXQsIG9mZnNldCBmaWVsZHMgaW4gV29yZDIKKwkgKiAgICBhcmUgdmFsaWQgQWxzbyBNU1MgSGlnaCBpbiBXb3JkIDAgYW5kIGJpdHMgWzMxOjI0XQorCSAqICAgIGluIFdvcmQgMworCSAqIDE1IDogcmVzZXJ2ZWQxNQorCSAqIDE5OjE2IDogbXNzX2hpCisJICogMjAgOiBldGhfbWV0YV90eXBlIC0gMDogVHggTWV0YWRhdGEgRGVzY3JpcHRvciwgMToKKwkgKiAgICBFeHRlbmRlZCBNZXRhZGF0YSBEZXNjcmlwdG9yCisJICogMjEgOiBtZXRhX3N0b3JlIC0gU3RvcmUgZXh0ZW5kZWQgbWV0YWRhdGEgaW4gcXVldWUKKwkgKiAgICBjYWNoZQorCSAqIDIyIDogcmVzZXJ2ZWQyMiAtIE1CWgorCSAqIDIzIDogbWV0YV9kZXNjIC0gTUJPCisJICogMjQgOiBwaGFzZQorCSAqIDI1IDogcmVzZXJ2ZWQyNSAtIE1CWgorCSAqIDI2IDogZmlyc3QgLSBJbmRpY2F0ZXMgZmlyc3QgZGVzY3JpcHRvciBpbgorCSAqICAgIHRyYW5zYWN0aW9uCisJICogMjcgOiBsYXN0IC0gSW5kaWNhdGVzIGxhc3QgZGVzY3JpcHRvciBpbgorCSAqICAgIHRyYW5zYWN0aW9uCisJICogMjggOiBjb21wX3JlcSAtIEluZGljYXRlcyB3aGV0aGVyIGNvbXBsZXRpb24KKwkgKiAgICBzaG91bGQgYmUgcG9zdGVkLCBhZnRlciBwYWNrZXQgaXMgdHJhbnNtaXR0ZWQuCisJICogICAgVmFsaWQgb25seSBmb3IgZmlyc3QgZGVzY3JpcHRvcgorCSAqIDMwOjI5IDogcmVzZXJ2ZWQyOSAtIE1CWgorCSAqIDMxIDogcmVzZXJ2ZWQzMSAtIE1CWgorCSAqLworCXUzMiBsZW5fY3RybDsKKworCS8qIDU6MCA6IHJlcV9pZF9oaQorCSAqIDMxOjYgOiByZXNlcnZlZDYgLSBNQloKKwkgKi8KKwl1MzIgd29yZDE7CisKKwkvKiA3OjAgOiBsM19oZHJfbGVuCisJICogMTU6OCA6IGwzX2hkcl9vZmYKKwkgKiAyMToxNiA6IGw0X2hkcl9sZW5faW5fd29yZHMgLSBjb3VudHMgdGhlIEw0IGhlYWRlcgorCSAqICAgIGxlbmd0aCBpbiB3b3Jkcy4gdGhlcmUgaXMgYW4gZXhwbGljaXQgYXNzdW1wdGlvbgorCSAqICAgIHRoYXQgTDQgaGVhZGVyIGFwcGVhcnMgcmlnaHQgYWZ0ZXIgTDMgaGVhZGVyIGFuZAorCSAqICAgIEw0IG9mZnNldCBpcyBiYXNlZCBvbiBsM19oZHJfb2ZmK2wzX2hkcl9sZW4KKwkgKiAzMToyMiA6IG1zc19sbworCSAqLworCXUzMiB3b3JkMjsKKworCXUzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBlbmFfZXRoX2lvX3R4X2NkZXNjIHsKKwkvKiBSZXF1ZXN0IElEWzE1OjBdICovCisJdTE2IHJlcV9pZDsKKworCXU4IHN0YXR1czsKKworCS8qIGZsYWdzCisJICogMCA6IHBoYXNlCisJICogNzoxIDogcmVzZXJ2ZWQxCisJICovCisJdTggZmxhZ3M7CisKKwl1MTYgc3ViX3FpZDsKKworCXUxNiBzcV9oZWFkX2lkeDsKK307CisKK3N0cnVjdCBlbmFfZXRoX2lvX3J4X2Rlc2MgeworCS8qIEluIGJ5dGVzLiAwIG1lYW5zIDY0S0IgKi8KKwl1MTYgbGVuZ3RoOworCisJLyogTUJaICovCisJdTggcmVzZXJ2ZWQyOworCisJLyogMCA6IHBoYXNlCisJICogMSA6IHJlc2VydmVkMSAtIE1CWgorCSAqIDIgOiBmaXJzdCAtIEluZGljYXRlcyBmaXJzdCBkZXNjcmlwdG9yIGluCisJICogICAgdHJhbnNhY3Rpb24KKwkgKiAzIDogbGFzdCAtIEluZGljYXRlcyBsYXN0IGRlc2NyaXB0b3IgaW4gdHJhbnNhY3Rpb24KKwkgKiA0IDogY29tcF9yZXEKKwkgKiA1IDogcmVzZXJ2ZWQ1IC0gTUJPCisJICogNzo2IDogcmVzZXJ2ZWQ2IC0gTUJaCisJICovCisJdTggY3RybDsKKworCXUxNiByZXFfaWQ7CisKKwkvKiBNQlogKi8KKwl1MTYgcmVzZXJ2ZWQ2OworCisJdTMyIGJ1ZmZfYWRkcl9sbzsKKworCXUxNiBidWZmX2FkZHJfaGk7CisKKwkvKiBNQlogKi8KKwl1MTYgcmVzZXJ2ZWQxNl93MzsKK307CisKKy8qIDQtd29yZCBmb3JtYXQgTm90ZTogYWxsIGV0aGVybmV0IHBhcnNpbmcgaW5mb3JtYXRpb24gYXJlIHZhbGlkIG9ubHkgd2hlbgorICogbGFzdD0xCisgKi8KK3N0cnVjdCBlbmFfZXRoX2lvX3J4X2NkZXNjX2Jhc2UgeworCS8qIDQ6MCA6IGwzX3Byb3RvX2lkeAorCSAqIDY6NSA6IHNyY192bGFuX2NudAorCSAqIDcgOiByZXNlcnZlZDcgLSBNQloKKwkgKiAxMjo4IDogbDRfcHJvdG9faWR4CisJICogMTMgOiBsM19jc3VtX2VyciAtIHdoZW4gc2V0LCBlaXRoZXIgdGhlIEwzCisJICogICAgY2hlY2tzdW0gZXJyb3IgZGV0ZWN0ZWQsIG9yLCB0aGUgY29udHJvbGxlciBkaWRuJ3QKKwkgKiAgICB2YWxpZGF0ZSB0aGUgY2hlY2tzdW0uIFRoaXMgYml0IGlzIHZhbGlkIG9ubHkgd2hlbgorCSAqICAgIGwzX3Byb3RvX2lkeCBpbmRpY2F0ZXMgSVB2NCBwYWNrZXQKKwkgKiAxNCA6IGw0X2NzdW1fZXJyIC0gd2hlbiBzZXQsIGVpdGhlciB0aGUgTDQKKwkgKiAgICBjaGVja3N1bSBlcnJvciBkZXRlY3RlZCwgb3IsIHRoZSBjb250cm9sbGVyIGRpZG4ndAorCSAqICAgIHZhbGlkYXRlIHRoZSBjaGVja3N1bS4gVGhpcyBiaXQgaXMgdmFsaWQgb25seSB3aGVuCisJICogICAgbDRfcHJvdG9faWR4IGluZGljYXRlcyBUQ1AvVURQIHBhY2tldCwgYW5kLAorCSAqICAgIGlwdjRfZnJhZyBpcyBub3Qgc2V0CisJICogMTUgOiBpcHY0X2ZyYWcgLSBJbmRpY2F0ZXMgSVB2NCBmcmFnbWVudGVkIHBhY2tldAorCSAqIDIzOjE2IDogcmVzZXJ2ZWQxNgorCSAqIDI0IDogcGhhc2UKKwkgKiAyNSA6IGwzX2NzdW0yIC0gc2Vjb25kIGNoZWNrc3VtIGVuZ2luZSByZXN1bHQKKwkgKiAyNiA6IGZpcnN0IC0gSW5kaWNhdGVzIGZpcnN0IGRlc2NyaXB0b3IgaW4KKwkgKiAgICB0cmFuc2FjdGlvbgorCSAqIDI3IDogbGFzdCAtIEluZGljYXRlcyBsYXN0IGRlc2NyaXB0b3IgaW4KKwkgKiAgICB0cmFuc2FjdGlvbgorCSAqIDI5OjI4IDogcmVzZXJ2ZWQyOAorCSAqIDMwIDogYnVmZmVyIC0gMDogTWV0YWRhdGEgZGVzY3JpcHRvci4gMTogQnVmZmVyCisJICogICAgRGVzY3JpcHRvciB3YXMgdXNlZAorCSAqIDMxIDogcmVzZXJ2ZWQzMQorCSAqLworCXUzMiBzdGF0dXM7CisKKwl1MTYgbGVuZ3RoOworCisJdTE2IHJlcV9pZDsKKworCS8qIDMyLWJpdCBoYXNoIHJlc3VsdCAqLworCXUzMiBoYXNoOworCisJdTE2IHN1Yl9xaWQ7CisKKwl1MTYgcmVzZXJ2ZWQ7Cit9OworCisvKiA4LXdvcmQgZm9ybWF0ICovCitzdHJ1Y3QgZW5hX2V0aF9pb19yeF9jZGVzY19leHQgeworCXN0cnVjdCBlbmFfZXRoX2lvX3J4X2NkZXNjX2Jhc2UgYmFzZTsKKworCXUzMiBidWZmX2FkZHJfbG87CisKKwl1MTYgYnVmZl9hZGRyX2hpOworCisJdTE2IHJlc2VydmVkMTY7CisKKwl1MzIgcmVzZXJ2ZWRfdzY7CisKKwl1MzIgcmVzZXJ2ZWRfdzc7Cit9OworCitzdHJ1Y3QgZW5hX2V0aF9pb19pbnRyX3JlZyB7CisJLyogMTQ6MCA6IHJ4X2ludHJfZGVsYXkKKwkgKiAyOToxNSA6IHR4X2ludHJfZGVsYXkKKwkgKiAzMCA6IGludHJfdW5tYXNrCisJICogMzEgOiByZXNlcnZlZAorCSAqLworCXUzMiBpbnRyX2NvbnRyb2w7Cit9OworCitzdHJ1Y3QgZW5hX2V0aF9pb19udW1hX25vZGVfY2ZnX3JlZyB7CisJLyogNzowIDogbnVtYQorCSAqIDMwOjggOiByZXNlcnZlZAorCSAqIDMxIDogZW5hYmxlZAorCSAqLworCXUzMiBudW1hX2NmZzsKK307CisKKy8qIHR4X2Rlc2MgKi8KKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0xFTkdUSF9NQVNLIEdFTk1BU0soMTUsIDApCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19SRVFfSURfSElfU0hJRlQgMTYKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX1JFUV9JRF9ISV9NQVNLIEdFTk1BU0soMjEsIDE2KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfTUVUQV9ERVNDX1NISUZUIDIzCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19NRVRBX0RFU0NfTUFTSyBCSVQoMjMpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19QSEFTRV9TSElGVCAyNAorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfUEhBU0VfTUFTSyBCSVQoMjQpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19GSVJTVF9TSElGVCAyNgorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfRklSU1RfTUFTSyBCSVQoMjYpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19MQVNUX1NISUZUIDI3CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19MQVNUX01BU0sgQklUKDI3KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfQ09NUF9SRVFfU0hJRlQgMjgKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0NPTVBfUkVRX01BU0sgQklUKDI4KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfTDNfUFJPVE9fSURYX01BU0sgR0VOTUFTSygzLCAwKQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfREZfU0hJRlQgNAorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfREZfTUFTSyBCSVQoNCkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX1RTT19FTl9TSElGVCA3CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19UU09fRU5fTUFTSyBCSVQoNykKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0w0X1BST1RPX0lEWF9TSElGVCA4CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19MNF9QUk9UT19JRFhfTUFTSyBHRU5NQVNLKDEyLCA4KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfTDNfQ1NVTV9FTl9TSElGVCAxMworI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfTDNfQ1NVTV9FTl9NQVNLIEJJVCgxMykKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0w0X0NTVU1fRU5fU0hJRlQgMTQKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0w0X0NTVU1fRU5fTUFTSyBCSVQoMTQpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19FVEhFUk5FVF9GQ1NfRElTX1NISUZUIDE1CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19FVEhFUk5FVF9GQ1NfRElTX01BU0sgQklUKDE1KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfTDRfQ1NVTV9QQVJUSUFMX1NISUZUIDE3CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19MNF9DU1VNX1BBUlRJQUxfTUFTSyBCSVQoMTcpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19SRVFfSURfTE9fU0hJRlQgMjIKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX1JFUV9JRF9MT19NQVNLIEdFTk1BU0soMzEsIDIyKQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfQUREUl9ISV9NQVNLIEdFTk1BU0soMTUsIDApCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19IRUFERVJfTEVOR1RIX1NISUZUIDI0CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19IRUFERVJfTEVOR1RIX01BU0sgR0VOTUFTSygzMSwgMjQpCisKKy8qIHR4X21ldGFfZGVzYyAqLworI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19SRVFfSURfTE9fTUFTSyBHRU5NQVNLKDksIDApCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0VYVF9WQUxJRF9TSElGVCAxNAorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19FWFRfVkFMSURfTUFTSyBCSVQoMTQpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX01TU19ISV9TSElGVCAxNgorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19NU1NfSElfTUFTSyBHRU5NQVNLKDE5LCAxNikKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfRVRIX01FVEFfVFlQRV9TSElGVCAyMAorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19FVEhfTUVUQV9UWVBFX01BU0sgQklUKDIwKQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19NRVRBX1NUT1JFX1NISUZUIDIxCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX01FVEFfU1RPUkVfTUFTSyBCSVQoMjEpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX01FVEFfREVTQ19TSElGVCAyMworI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19NRVRBX0RFU0NfTUFTSyBCSVQoMjMpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX1BIQVNFX1NISUZUIDI0CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX1BIQVNFX01BU0sgQklUKDI0KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19GSVJTVF9TSElGVCAyNgorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19GSVJTVF9NQVNLIEJJVCgyNikKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTEFTVF9TSElGVCAyNworI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19MQVNUX01BU0sgQklUKDI3KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19DT01QX1JFUV9TSElGVCAyOAorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19DT01QX1JFUV9NQVNLIEJJVCgyOCkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfUkVRX0lEX0hJX01BU0sgR0VOTUFTSyg1LCAwKQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19MM19IRFJfTEVOX01BU0sgR0VOTUFTSyg3LCAwKQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19MM19IRFJfT0ZGX1NISUZUIDgKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTDNfSERSX09GRl9NQVNLIEdFTk1BU0soMTUsIDgpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0w0X0hEUl9MRU5fSU5fV09SRFNfU0hJRlQgMTYKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTDRfSERSX0xFTl9JTl9XT1JEU19NQVNLIEdFTk1BU0soMjEsIDE2KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19NU1NfTE9fU0hJRlQgMjIKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTVNTX0xPX01BU0sgR0VOTUFTSygzMSwgMjIpCisKKy8qIHR4X2NkZXNjICovCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfQ0RFU0NfUEhBU0VfTUFTSyBCSVQoMCkKKworLyogcnhfZGVzYyAqLworI2RlZmluZSBFTkFfRVRIX0lPX1JYX0RFU0NfUEhBU0VfTUFTSyBCSVQoMCkKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9ERVNDX0ZJUlNUX1NISUZUIDIKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9ERVNDX0ZJUlNUX01BU0sgQklUKDIpCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfREVTQ19MQVNUX1NISUZUIDMKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9ERVNDX0xBU1RfTUFTSyBCSVQoMykKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9ERVNDX0NPTVBfUkVRX1NISUZUIDQKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9ERVNDX0NPTVBfUkVRX01BU0sgQklUKDQpCisKKy8qIHJ4X2NkZXNjX2Jhc2UgKi8KKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0wzX1BST1RPX0lEWF9NQVNLIEdFTk1BU0soNCwgMCkKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX1NSQ19WTEFOX0NOVF9TSElGVCA1CisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9TUkNfVkxBTl9DTlRfTUFTSyBHRU5NQVNLKDYsIDUpCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MNF9QUk9UT19JRFhfU0hJRlQgOAorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTDRfUFJPVE9fSURYX01BU0sgR0VOTUFTSygxMiwgOCkKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0wzX0NTVU1fRVJSX1NISUZUIDEzCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MM19DU1VNX0VSUl9NQVNLIEJJVCgxMykKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0w0X0NTVU1fRVJSX1NISUZUIDE0CisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MNF9DU1VNX0VSUl9NQVNLIEJJVCgxNCkKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0lQVjRfRlJBR19TSElGVCAxNQorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfSVBWNF9GUkFHX01BU0sgQklUKDE1KQorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfUEhBU0VfU0hJRlQgMjQKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX1BIQVNFX01BU0sgQklUKDI0KQorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTDNfQ1NVTTJfU0hJRlQgMjUKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0wzX0NTVU0yX01BU0sgQklUKDI1KQorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfRklSU1RfU0hJRlQgMjYKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0ZJUlNUX01BU0sgQklUKDI2KQorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTEFTVF9TSElGVCAyNworI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTEFTVF9NQVNLIEJJVCgyNykKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0JVRkZFUl9TSElGVCAzMAorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfQlVGRkVSX01BU0sgQklUKDMwKQorCisvKiBpbnRyX3JlZyAqLworI2RlZmluZSBFTkFfRVRIX0lPX0lOVFJfUkVHX1JYX0lOVFJfREVMQVlfTUFTSyBHRU5NQVNLKDE0LCAwKQorI2RlZmluZSBFTkFfRVRIX0lPX0lOVFJfUkVHX1RYX0lOVFJfREVMQVlfU0hJRlQgMTUKKyNkZWZpbmUgRU5BX0VUSF9JT19JTlRSX1JFR19UWF9JTlRSX0RFTEFZX01BU0sgR0VOTUFTSygyOSwgMTUpCisjZGVmaW5lIEVOQV9FVEhfSU9fSU5UUl9SRUdfSU5UUl9VTk1BU0tfU0hJRlQgMzAKKyNkZWZpbmUgRU5BX0VUSF9JT19JTlRSX1JFR19JTlRSX1VOTUFTS19NQVNLIEJJVCgzMCkKKworLyogbnVtYV9ub2RlX2NmZ19yZWcgKi8KKyNkZWZpbmUgRU5BX0VUSF9JT19OVU1BX05PREVfQ0ZHX1JFR19OVU1BX01BU0sgR0VOTUFTSyg3LCAwKQorI2RlZmluZSBFTkFfRVRIX0lPX05VTUFfTk9ERV9DRkdfUkVHX0VOQUJMRURfU0hJRlQgMzEKKyNkZWZpbmUgRU5BX0VUSF9JT19OVU1BX05PREVfQ0ZHX1JFR19FTkFCTEVEX01BU0sgQklUKDMxKQorCisjZW5kaWYgLypfRU5BX0VUSF9JT19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfZXRodG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YjIzMzhmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfZXRodG9vbC5jCkBAIC0wLDAgKzEsODk1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlICJlbmFfbmV0ZGV2LmgiCisKK3N0cnVjdCBlbmFfc3RhdHMgeworCWNoYXIgbmFtZVtFVEhfR1NUUklOR19MRU5dOworCWludCBzdGF0X29mZnNldDsKK307CisKKyNkZWZpbmUgRU5BX1NUQVRfRU5BX0NPTV9FTlRSWShzdGF0KSB7IFwKKwkubmFtZSA9ICNzdGF0LCBcCisJLnN0YXRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGVuYV9jb21fc3RhdHNfYWRtaW4sIHN0YXQpIFwKK30KKworI2RlZmluZSBFTkFfU1RBVF9FTlRSWShzdGF0LCBzdGF0X3R5cGUpIHsgXAorCS5uYW1lID0gI3N0YXQsIFwKKwkuc3RhdF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgZW5hX3N0YXRzXyMjc3RhdF90eXBlLCBzdGF0KSBcCit9CisKKyNkZWZpbmUgRU5BX1NUQVRfUlhfRU5UUlkoc3RhdCkgXAorCUVOQV9TVEFUX0VOVFJZKHN0YXQsIHJ4KQorCisjZGVmaW5lIEVOQV9TVEFUX1RYX0VOVFJZKHN0YXQpIFwKKwlFTkFfU1RBVF9FTlRSWShzdGF0LCB0eCkKKworI2RlZmluZSBFTkFfU1RBVF9HTE9CQUxfRU5UUlkoc3RhdCkgXAorCUVOQV9TVEFUX0VOVFJZKHN0YXQsIGRldikKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbmFfc3RhdHMgZW5hX3N0YXRzX2dsb2JhbF9zdHJpbmdzW10gPSB7CisJRU5BX1NUQVRfR0xPQkFMX0VOVFJZKHR4X3RpbWVvdXQpLAorCUVOQV9TVEFUX0dMT0JBTF9FTlRSWShpb19zdXNwZW5kKSwKKwlFTkFfU1RBVF9HTE9CQUxfRU5UUlkoaW9fcmVzdW1lKSwKKwlFTkFfU1RBVF9HTE9CQUxfRU5UUlkod2RfZXhwaXJlZCksCisJRU5BX1NUQVRfR0xPQkFMX0VOVFJZKGludGVyZmFjZV91cCksCisJRU5BX1NUQVRfR0xPQkFMX0VOVFJZKGludGVyZmFjZV9kb3duKSwKKwlFTkFfU1RBVF9HTE9CQUxfRU5UUlkoYWRtaW5fcV9wYXVzZSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVuYV9zdGF0cyBlbmFfc3RhdHNfdHhfc3RyaW5nc1tdID0geworCUVOQV9TVEFUX1RYX0VOVFJZKGNudCksCisJRU5BX1NUQVRfVFhfRU5UUlkoYnl0ZXMpLAorCUVOQV9TVEFUX1RYX0VOVFJZKHF1ZXVlX3N0b3ApLAorCUVOQV9TVEFUX1RYX0VOVFJZKHF1ZXVlX3dha2V1cCksCisJRU5BX1NUQVRfVFhfRU5UUlkoZG1hX21hcHBpbmdfZXJyKSwKKwlFTkFfU1RBVF9UWF9FTlRSWShsaW5lYXJpemUpLAorCUVOQV9TVEFUX1RYX0VOVFJZKGxpbmVhcml6ZV9mYWlsZWQpLAorCUVOQV9TVEFUX1RYX0VOVFJZKG5hcGlfY29tcCksCisJRU5BX1NUQVRfVFhfRU5UUlkodHhfcG9sbCksCisJRU5BX1NUQVRfVFhfRU5UUlkoZG9vcmJlbGxzKSwKKwlFTkFfU1RBVF9UWF9FTlRSWShwcmVwYXJlX2N0eF9lcnIpLAorCUVOQV9TVEFUX1RYX0VOVFJZKG1pc3NpbmdfdHhfY29tcCksCisJRU5BX1NUQVRfVFhfRU5UUlkoYmFkX3JlcV9pZCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVuYV9zdGF0cyBlbmFfc3RhdHNfcnhfc3RyaW5nc1tdID0geworCUVOQV9TVEFUX1JYX0VOVFJZKGNudCksCisJRU5BX1NUQVRfUlhfRU5UUlkoYnl0ZXMpLAorCUVOQV9TVEFUX1JYX0VOVFJZKHJlZmlsX3BhcnRpYWwpLAorCUVOQV9TVEFUX1JYX0VOVFJZKGJhZF9jc3VtKSwKKwlFTkFfU1RBVF9SWF9FTlRSWShwYWdlX2FsbG9jX2ZhaWwpLAorCUVOQV9TVEFUX1JYX0VOVFJZKHNrYl9hbGxvY19mYWlsKSwKKwlFTkFfU1RBVF9SWF9FTlRSWShkbWFfbWFwcGluZ19lcnIpLAorCUVOQV9TVEFUX1JYX0VOVFJZKGJhZF9kZXNjX251bSksCisJRU5BX1NUQVRfUlhfRU5UUlkocnhfY29weWJyZWFrX3BrdCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVuYV9zdGF0cyBlbmFfc3RhdHNfZW5hX2NvbV9zdHJpbmdzW10gPSB7CisJRU5BX1NUQVRfRU5BX0NPTV9FTlRSWShhYm9ydGVkX2NtZCksCisJRU5BX1NUQVRfRU5BX0NPTV9FTlRSWShzdWJtaXR0ZWRfY21kKSwKKwlFTkFfU1RBVF9FTkFfQ09NX0VOVFJZKGNvbXBsZXRlZF9jbWQpLAorCUVOQV9TVEFUX0VOQV9DT01fRU5UUlkob3V0X29mX3NwYWNlKSwKKwlFTkFfU1RBVF9FTkFfQ09NX0VOVFJZKG5vX2NvbXBsZXRpb24pLAorfTsKKworI2RlZmluZSBFTkFfU1RBVFNfQVJSQVlfR0xPQkFMCUFSUkFZX1NJWkUoZW5hX3N0YXRzX2dsb2JhbF9zdHJpbmdzKQorI2RlZmluZSBFTkFfU1RBVFNfQVJSQVlfVFgJQVJSQVlfU0laRShlbmFfc3RhdHNfdHhfc3RyaW5ncykKKyNkZWZpbmUgRU5BX1NUQVRTX0FSUkFZX1JYCUFSUkFZX1NJWkUoZW5hX3N0YXRzX3J4X3N0cmluZ3MpCisjZGVmaW5lIEVOQV9TVEFUU19BUlJBWV9FTkFfQ09NCUFSUkFZX1NJWkUoZW5hX3N0YXRzX2VuYV9jb21fc3RyaW5ncykKKworc3RhdGljIHZvaWQgZW5hX3NhZmVfdXBkYXRlX3N0YXQodTY0ICpzcmMsIHU2NCAqZHN0LAorCQkJCSBzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKnN5bmNwKQoreworCXVuc2lnbmVkIGludCBzdGFydDsKKworCWRvIHsKKwkJc3RhcnQgPSB1NjRfc3RhdHNfZmV0Y2hfYmVnaW5faXJxKHN5bmNwKTsKKwkJKihkc3QpID0gKnNyYzsKKwl9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnlfaXJxKHN5bmNwLCBzdGFydCkpOworfQorCitzdGF0aWMgdm9pZCBlbmFfcXVldWVfc3RhdHMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLCB1NjQgKipkYXRhKQoreworCWNvbnN0IHN0cnVjdCBlbmFfc3RhdHMgKmVuYV9zdGF0czsKKwlzdHJ1Y3QgZW5hX3JpbmcgKnJpbmc7CisKKwl1NjQgKnB0cjsKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspIHsKKwkJLyogVHggc3RhdHMgKi8KKwkJcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nW2ldOworCisJCWZvciAoaiA9IDA7IGogPCBFTkFfU1RBVFNfQVJSQVlfVFg7IGorKykgeworCQkJZW5hX3N0YXRzID0gJmVuYV9zdGF0c190eF9zdHJpbmdzW2pdOworCisJCQlwdHIgPSAodTY0ICopKCh1aW50cHRyX3QpJnJpbmctPnR4X3N0YXRzICsKKwkJCQkodWludHB0cl90KWVuYV9zdGF0cy0+c3RhdF9vZmZzZXQpOworCisJCQllbmFfc2FmZV91cGRhdGVfc3RhdChwdHIsICgqZGF0YSkrKywgJnJpbmctPnN5bmNwKTsKKwkJfQorCisJCS8qIFJ4IHN0YXRzICovCisJCXJpbmcgPSAmYWRhcHRlci0+cnhfcmluZ1tpXTsKKworCQlmb3IgKGogPSAwOyBqIDwgRU5BX1NUQVRTX0FSUkFZX1JYOyBqKyspIHsKKwkJCWVuYV9zdGF0cyA9ICZlbmFfc3RhdHNfcnhfc3RyaW5nc1tqXTsKKworCQkJcHRyID0gKHU2NCAqKSgodWludHB0cl90KSZyaW5nLT5yeF9zdGF0cyArCisJCQkJKHVpbnRwdHJfdCllbmFfc3RhdHMtPnN0YXRfb2Zmc2V0KTsKKworCQkJZW5hX3NhZmVfdXBkYXRlX3N0YXQocHRyLCAoKmRhdGEpKyssICZyaW5nLT5zeW5jcCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9kZXZfYWRtaW5fcXVldWVfc3RhdHMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLCB1NjQgKipkYXRhKQoreworCWNvbnN0IHN0cnVjdCBlbmFfc3RhdHMgKmVuYV9zdGF0czsKKwl1MzIgKnB0cjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBFTkFfU1RBVFNfQVJSQVlfRU5BX0NPTTsgaSsrKSB7CisJCWVuYV9zdGF0cyA9ICZlbmFfc3RhdHNfZW5hX2NvbV9zdHJpbmdzW2ldOworCisJCXB0ciA9ICh1MzIgKikoKHVpbnRwdHJfdCkmYWRhcHRlci0+ZW5hX2Rldi0+YWRtaW5fcXVldWUuc3RhdHMgKworCQkJKHVpbnRwdHJfdCllbmFfc3RhdHMtPnN0YXRfb2Zmc2V0KTsKKworCQkqKCpkYXRhKSsrID0gKnB0cjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCSAgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLAorCQkJCSAgdTY0ICpkYXRhKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJY29uc3Qgc3RydWN0IGVuYV9zdGF0cyAqZW5hX3N0YXRzOworCXU2NCAqcHRyOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEVOQV9TVEFUU19BUlJBWV9HTE9CQUw7IGkrKykgeworCQllbmFfc3RhdHMgPSAmZW5hX3N0YXRzX2dsb2JhbF9zdHJpbmdzW2ldOworCisJCXB0ciA9ICh1NjQgKikoKHVpbnRwdHJfdCkmYWRhcHRlci0+ZGV2X3N0YXRzICsKKwkJCSh1aW50cHRyX3QpZW5hX3N0YXRzLT5zdGF0X29mZnNldCk7CisKKwkJZW5hX3NhZmVfdXBkYXRlX3N0YXQocHRyLCBkYXRhKyssICZhZGFwdGVyLT5zeW5jcCk7CisJfQorCisJZW5hX3F1ZXVlX3N0YXRzKGFkYXB0ZXIsICZkYXRhKTsKKwllbmFfZGV2X2FkbWluX3F1ZXVlX3N0YXRzKGFkYXB0ZXIsICZkYXRhKTsKK30KKworaW50IGVuYV9nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgc3NldCkKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKHNzZXQgIT0gRVRIX1NTX1NUQVRTKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gIGFkYXB0ZXItPm51bV9xdWV1ZXMgKiAoRU5BX1NUQVRTX0FSUkFZX1RYICsgRU5BX1NUQVRTX0FSUkFZX1JYKQorCQkrIEVOQV9TVEFUU19BUlJBWV9HTE9CQUwgKyBFTkFfU1RBVFNfQVJSQVlfRU5BX0NPTTsKK30KKworc3RhdGljIHZvaWQgZW5hX3F1ZXVlX3N0cmluZ3Moc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLCB1OCAqKmRhdGEpCit7CisJY29uc3Qgc3RydWN0IGVuYV9zdGF0cyAqZW5hX3N0YXRzOworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykgeworCQkvKiBUeCBzdGF0cyAqLworCQlmb3IgKGogPSAwOyBqIDwgRU5BX1NUQVRTX0FSUkFZX1RYOyBqKyspIHsKKwkJCWVuYV9zdGF0cyA9ICZlbmFfc3RhdHNfdHhfc3RyaW5nc1tqXTsKKworCQkJc25wcmludGYoKmRhdGEsIEVUSF9HU1RSSU5HX0xFTiwKKwkJCQkgInF1ZXVlXyV1X3R4XyVzIiwgaSwgZW5hX3N0YXRzLT5uYW1lKTsKKwkJCSAoKmRhdGEpICs9IEVUSF9HU1RSSU5HX0xFTjsKKwkJfQorCQkvKiBSeCBzdGF0cyAqLworCQlmb3IgKGogPSAwOyBqIDwgRU5BX1NUQVRTX0FSUkFZX1JYOyBqKyspIHsKKwkJCWVuYV9zdGF0cyA9ICZlbmFfc3RhdHNfcnhfc3RyaW5nc1tqXTsKKworCQkJc25wcmludGYoKmRhdGEsIEVUSF9HU1RSSU5HX0xFTiwKKwkJCQkgInF1ZXVlXyV1X3J4XyVzIiwgaSwgZW5hX3N0YXRzLT5uYW1lKTsKKwkJCSgqZGF0YSkgKz0gRVRIX0dTVFJJTkdfTEVOOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmFfY29tX2Rldl9zdHJpbmdzKHU4ICoqZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3QgZW5hX3N0YXRzICplbmFfc3RhdHM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRU5BX1NUQVRTX0FSUkFZX0VOQV9DT007IGkrKykgeworCQllbmFfc3RhdHMgPSAmZW5hX3N0YXRzX2VuYV9jb21fc3RyaW5nc1tpXTsKKworCQlzbnByaW50ZigqZGF0YSwgRVRIX0dTVFJJTkdfTEVOLAorCQkJICJlbmFfYWRtaW5fcV8lcyIsIGVuYV9zdGF0cy0+bmFtZSk7CisJCSgqZGF0YSkgKz0gRVRIX0dTVFJJTkdfTEVOOworCX0KK30KKworc3RhdGljIHZvaWQgZW5hX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBzc2V0LCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWNvbnN0IHN0cnVjdCBlbmFfc3RhdHMgKmVuYV9zdGF0czsKKwlpbnQgaTsKKworCWlmIChzc2V0ICE9IEVUSF9TU19TVEFUUykKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IEVOQV9TVEFUU19BUlJBWV9HTE9CQUw7IGkrKykgeworCQllbmFfc3RhdHMgPSAmZW5hX3N0YXRzX2dsb2JhbF9zdHJpbmdzW2ldOworCisJCW1lbWNweShkYXRhLCBlbmFfc3RhdHMtPm5hbWUsIEVUSF9HU1RSSU5HX0xFTik7CisJCWRhdGEgKz0gRVRIX0dTVFJJTkdfTEVOOworCX0KKworCWVuYV9xdWV1ZV9zdHJpbmdzKGFkYXB0ZXIsICZkYXRhKTsKKwllbmFfY29tX2Rldl9zdHJpbmdzKCZkYXRhKTsKK30KKworc3RhdGljIGludCBlbmFfZ2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqbGlua19rc2V0dGluZ3MpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYgPSBhZGFwdGVyLT5lbmFfZGV2OworCXN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXR1cmVfbGlua19kZXNjICpsaW5rOworCXN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfcmVzcCBmZWF0X3Jlc3A7CisJaW50IHJjOworCisJcmMgPSBlbmFfY29tX2dldF9saW5rX3BhcmFtcyhlbmFfZGV2LCAmZmVhdF9yZXNwKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWxpbmsgPSAmZmVhdF9yZXNwLnUubGluazsKKwlsaW5rX2tzZXR0aW5ncy0+YmFzZS5zcGVlZCA9IGxpbmstPnNwZWVkOworCisJaWYgKGxpbmstPmZsYWdzICYgRU5BX0FETUlOX0dFVF9GRUFUVVJFX0xJTktfREVTQ19BVVRPTkVHX01BU0spIHsKKwkJZXRodG9vbF9saW5rX2tzZXR0aW5nc19hZGRfbGlua19tb2RlKGxpbmtfa3NldHRpbmdzLAorCQkJCQkJICAgICBzdXBwb3J0ZWQsIEF1dG9uZWcpOworCQlldGh0b29sX2xpbmtfa3NldHRpbmdzX2FkZF9saW5rX21vZGUobGlua19rc2V0dGluZ3MsCisJCQkJCQkgICAgIHN1cHBvcnRlZCwgQXV0b25lZyk7CisJfQorCisJbGlua19rc2V0dGluZ3MtPmJhc2UuYXV0b25lZyA9CisJCShsaW5rLT5mbGFncyAmIEVOQV9BRE1JTl9HRVRfRkVBVFVSRV9MSU5LX0RFU0NfQVVUT05FR19NQVNLKSA/CisJCUFVVE9ORUdfRU5BQkxFIDogQVVUT05FR19ESVNBQkxFOworCisJbGlua19rc2V0dGluZ3MtPmJhc2UuZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmFfZ2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAorCQkJICAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjb2FsZXNjZSkKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKKwlzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYgPSBhZGFwdGVyLT5lbmFfZGV2OworCXN0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSBpbnRyX21vZGVyX2VudHJ5OworCisJaWYgKCFlbmFfY29tX2ludGVycnVwdF9tb2RlcmF0aW9uX3N1cHBvcnRlZChlbmFfZGV2KSkgeworCQkvKiB0aGUgZGV2aWUgZG9lc24ndCBzdXBwb3J0IGludGVycnVwdCBtb2RlcmF0aW9uICovCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJY29hbGVzY2UtPnR4X2NvYWxlc2NlX3VzZWNzID0KKwkJZW5hX2NvbV9nZXRfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF90eChlbmFfZGV2KSAvCisJCQllbmFfZGV2LT5pbnRyX2RlbGF5X3Jlc29sdXRpb247CisJaWYgKCFlbmFfY29tX2dldF9hZGFwdGl2ZV9tb2RlcmF0aW9uX2VuYWJsZWQoZW5hX2RldikpIHsKKwkJY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzID0KKwkJCWVuYV9jb21fZ2V0X25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfcngoZW5hX2RldikKKwkJCS8gZW5hX2Rldi0+aW50cl9kZWxheV9yZXNvbHV0aW9uOworCX0gZWxzZSB7CisJCWVuYV9jb21fZ2V0X2ludHJfbW9kZXJhdGlvbl9lbnRyeShhZGFwdGVyLT5lbmFfZGV2LCBFTkFfSU5UUl9NT0RFUl9MT1dFU1QsICZpbnRyX21vZGVyX2VudHJ5KTsKKwkJY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzX2xvdyA9IGludHJfbW9kZXJfZW50cnkuaW50cl9tb2Rlcl9pbnRlcnZhbDsKKwkJY29hbGVzY2UtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2xvdyA9IGludHJfbW9kZXJfZW50cnkucGt0c19wZXJfaW50ZXJ2YWw7CisKKwkJZW5hX2NvbV9nZXRfaW50cl9tb2RlcmF0aW9uX2VudHJ5KGFkYXB0ZXItPmVuYV9kZXYsIEVOQV9JTlRSX01PREVSX01JRCwgJmludHJfbW9kZXJfZW50cnkpOworCQljb2FsZXNjZS0+cnhfY29hbGVzY2VfdXNlY3MgPSBpbnRyX21vZGVyX2VudHJ5LmludHJfbW9kZXJfaW50ZXJ2YWw7CisJCWNvYWxlc2NlLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9IGludHJfbW9kZXJfZW50cnkucGt0c19wZXJfaW50ZXJ2YWw7CisKKwkJZW5hX2NvbV9nZXRfaW50cl9tb2RlcmF0aW9uX2VudHJ5KGFkYXB0ZXItPmVuYV9kZXYsIEVOQV9JTlRSX01PREVSX0hJR0hFU1QsICZpbnRyX21vZGVyX2VudHJ5KTsKKwkJY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzX2hpZ2ggPSBpbnRyX21vZGVyX2VudHJ5LmludHJfbW9kZXJfaW50ZXJ2YWw7CisJCWNvYWxlc2NlLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19oaWdoID0gaW50cl9tb2Rlcl9lbnRyeS5wa3RzX3Blcl9pbnRlcnZhbDsKKwl9CisJY29hbGVzY2UtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSA9CisJCWVuYV9jb21fZ2V0X2FkYXB0aXZlX21vZGVyYXRpb25fZW5hYmxlZChlbmFfZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbmFfdXBkYXRlX3R4X3JpbmdzX2ludHJfbW9kZXJhdGlvbihzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgaTsKKworCXZhbCA9IGVuYV9jb21fZ2V0X25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfdHgoYWRhcHRlci0+ZW5hX2Rldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKQorCQlhZGFwdGVyLT50eF9yaW5nW2ldLnNtb290aGVkX2ludGVydmFsID0gdmFsOworfQorCitzdGF0aWMgaW50IGVuYV9zZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCisJCQkgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmNvYWxlc2NlKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldF9kZXYpOworCXN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiA9IGFkYXB0ZXItPmVuYV9kZXY7CisJc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5IGludHJfbW9kZXJfZW50cnk7CisJaW50IHJjOworCisJaWYgKCFlbmFfY29tX2ludGVycnVwdF9tb2RlcmF0aW9uX3N1cHBvcnRlZChlbmFfZGV2KSkgeworCQkvKiB0aGUgZGV2aWUgZG9lc24ndCBzdXBwb3J0IGludGVycnVwdCBtb2RlcmF0aW9uICovCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlpZiAoY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzX2lycSB8fAorCSAgICBjb2FsZXNjZS0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxIHx8CisJICAgIGNvYWxlc2NlLT50eF9jb2FsZXNjZV91c2Vjc19pcnEgfHwKKwkgICAgY29hbGVzY2UtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzIHx8CisJICAgIGNvYWxlc2NlLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnEgfHwKKwkgICAgY29hbGVzY2UtPnN0YXRzX2Jsb2NrX2NvYWxlc2NlX3VzZWNzIHx8CisJICAgIGNvYWxlc2NlLT51c2VfYWRhcHRpdmVfdHhfY29hbGVzY2UgfHwKKwkgICAgY29hbGVzY2UtPnBrdF9yYXRlX2xvdyB8fAorCSAgICBjb2FsZXNjZS0+dHhfY29hbGVzY2VfdXNlY3NfbG93IHx8CisJICAgIGNvYWxlc2NlLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19sb3cgfHwKKwkgICAgY29hbGVzY2UtPnBrdF9yYXRlX2hpZ2ggfHwKKwkgICAgY29hbGVzY2UtPnR4X2NvYWxlc2NlX3VzZWNzX2hpZ2ggfHwKKwkgICAgY29hbGVzY2UtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2hpZ2ggfHwKKwkgICAgY29hbGVzY2UtPnJhdGVfc2FtcGxlX2ludGVydmFsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJjID0gZW5hX2NvbV91cGRhdGVfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF90eChlbmFfZGV2LAorCQkJCQkJCSAgICAgICBjb2FsZXNjZS0+dHhfY29hbGVzY2VfdXNlY3MpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJZW5hX3VwZGF0ZV90eF9yaW5nc19pbnRyX21vZGVyYXRpb24oYWRhcHRlcik7CisKKwlpZiAoZW5hX2NvbV9nZXRfYWRhcHRpdmVfbW9kZXJhdGlvbl9lbmFibGVkKGVuYV9kZXYpKSB7CisJCWlmICghY29hbGVzY2UtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSkgeworCQkJZW5hX2NvbV9kaXNhYmxlX2FkYXB0aXZlX21vZGVyYXRpb24oZW5hX2Rldik7CisJCQlyYyA9IGVuYV9jb21fdXBkYXRlX25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfcngoZW5hX2RldiwKKwkJCQkJCQkJCSAgICAgICBjb2FsZXNjZS0+cnhfY29hbGVzY2VfdXNlY3MpOworCQkJcmV0dXJuIHJjOworCQl9CisJfSBlbHNlIHsgLyogd2FzIGluIG5vbi1hZGFwdGl2ZSBtb2RlICovCisJCWlmIChjb2FsZXNjZS0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlKSB7CisJCQllbmFfY29tX2VuYWJsZV9hZGFwdGl2ZV9tb2RlcmF0aW9uKGVuYV9kZXYpOworCQl9IGVsc2UgeworCQkJcmMgPSBlbmFfY29tX3VwZGF0ZV9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3J4KGVuYV9kZXYsCisJCQkJCQkJCQkgICAgICAgY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCWludHJfbW9kZXJfZW50cnkuaW50cl9tb2Rlcl9pbnRlcnZhbCA9IGNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2Vjc19sb3c7CisJaW50cl9tb2Rlcl9lbnRyeS5wa3RzX3Blcl9pbnRlcnZhbCA9IGNvYWxlc2NlLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19sb3c7CisJaW50cl9tb2Rlcl9lbnRyeS5ieXRlc19wZXJfaW50ZXJ2YWwgPSBFTkFfSU5UUl9CWVRFX0NPVU5UX05PVF9TVVBQT1JURUQ7CisJZW5hX2NvbV9pbml0X2ludHJfbW9kZXJhdGlvbl9lbnRyeShhZGFwdGVyLT5lbmFfZGV2LCBFTkFfSU5UUl9NT0RFUl9MT1dFU1QsICZpbnRyX21vZGVyX2VudHJ5KTsKKworCWludHJfbW9kZXJfZW50cnkuaW50cl9tb2Rlcl9pbnRlcnZhbCA9IGNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2VjczsKKwlpbnRyX21vZGVyX2VudHJ5LnBrdHNfcGVyX2ludGVydmFsID0gY29hbGVzY2UtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCWludHJfbW9kZXJfZW50cnkuYnl0ZXNfcGVyX2ludGVydmFsID0gRU5BX0lOVFJfQllURV9DT1VOVF9OT1RfU1VQUE9SVEVEOworCWVuYV9jb21faW5pdF9pbnRyX21vZGVyYXRpb25fZW50cnkoYWRhcHRlci0+ZW5hX2RldiwgRU5BX0lOVFJfTU9ERVJfTUlELCAmaW50cl9tb2Rlcl9lbnRyeSk7CisKKwlpbnRyX21vZGVyX2VudHJ5LmludHJfbW9kZXJfaW50ZXJ2YWwgPSBjb2FsZXNjZS0+cnhfY29hbGVzY2VfdXNlY3NfaGlnaDsKKwlpbnRyX21vZGVyX2VudHJ5LnBrdHNfcGVyX2ludGVydmFsID0gY29hbGVzY2UtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2hpZ2g7CisJaW50cl9tb2Rlcl9lbnRyeS5ieXRlc19wZXJfaW50ZXJ2YWwgPSBFTkFfSU5UUl9CWVRFX0NPVU5UX05PVF9TVVBQT1JURUQ7CisJZW5hX2NvbV9pbml0X2ludHJfbW9kZXJhdGlvbl9lbnRyeShhZGFwdGVyLT5lbmFfZGV2LCBFTkFfSU5UUl9NT0RFUl9ISUdIRVNULCAmaW50cl9tb2Rlcl9lbnRyeSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBlbmFfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXJldHVybiBhZGFwdGVyLT5tc2dfZW5hYmxlOworfQorCitzdGF0aWMgdm9pZCBlbmFfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJYWRhcHRlci0+bXNnX2VuYWJsZSA9IHZhbHVlOworfQorCitzdGF0aWMgdm9pZCBlbmFfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX01PRFVMRV9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfTU9EVUxFX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldiksCisJCXNpemVvZihpbmZvLT5idXNfaW5mbykpOworfQorCitzdGF0aWMgdm9pZCBlbmFfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpyaW5nKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGVuYV9yaW5nICp0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3JpbmdbMF07CisJc3RydWN0IGVuYV9yaW5nICpyeF9yaW5nID0gJmFkYXB0ZXItPnJ4X3JpbmdbMF07CisKKwlyaW5nLT5yeF9tYXhfcGVuZGluZyA9IHJ4X3JpbmctPnJpbmdfc2l6ZTsKKwlyaW5nLT50eF9tYXhfcGVuZGluZyA9IHR4X3JpbmctPnJpbmdfc2l6ZTsKKwlyaW5nLT5yeF9wZW5kaW5nID0gcnhfcmluZy0+cmluZ19zaXplOworCXJpbmctPnR4X3BlbmRpbmcgPSB0eF9yaW5nLT5yaW5nX3NpemU7Cit9CisKK3N0YXRpYyB1MzIgZW5hX2Zsb3dfaGFzaF90b19mbG93X3R5cGUodTE2IGhhc2hfZmllbGRzKQoreworCXUzMiBkYXRhID0gMDsKKworCWlmIChoYXNoX2ZpZWxkcyAmIEVOQV9BRE1JTl9SU1NfTDJfREEpCisJCWRhdGEgfD0gUlhIX0wyREE7CisKKwlpZiAoaGFzaF9maWVsZHMgJiBFTkFfQURNSU5fUlNTX0wzX0RBKQorCQlkYXRhIHw9IFJYSF9JUF9EU1Q7CisKKwlpZiAoaGFzaF9maWVsZHMgJiBFTkFfQURNSU5fUlNTX0wzX1NBKQorCQlkYXRhIHw9IFJYSF9JUF9TUkM7CisKKwlpZiAoaGFzaF9maWVsZHMgJiBFTkFfQURNSU5fUlNTX0w0X0RQKQorCQlkYXRhIHw9IFJYSF9MNF9CXzJfMzsKKworCWlmIChoYXNoX2ZpZWxkcyAmIEVOQV9BRE1JTl9SU1NfTDRfU1ApCisJCWRhdGEgfD0gUlhIX0w0X0JfMF8xOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB1MTYgZW5hX2Zsb3dfZGF0YV90b19mbG93X2hhc2godTMyIGhhc2hfZmllbGRzKQoreworCXUxNiBkYXRhID0gMDsKKworCWlmIChoYXNoX2ZpZWxkcyAmIFJYSF9MMkRBKQorCQlkYXRhIHw9IEVOQV9BRE1JTl9SU1NfTDJfREE7CisKKwlpZiAoaGFzaF9maWVsZHMgJiBSWEhfSVBfRFNUKQorCQlkYXRhIHw9IEVOQV9BRE1JTl9SU1NfTDNfREE7CisKKwlpZiAoaGFzaF9maWVsZHMgJiBSWEhfSVBfU1JDKQorCQlkYXRhIHw9IEVOQV9BRE1JTl9SU1NfTDNfU0E7CisKKwlpZiAoaGFzaF9maWVsZHMgJiBSWEhfTDRfQl8yXzMpCisJCWRhdGEgfD0gRU5BX0FETUlOX1JTU19MNF9EUDsKKworCWlmIChoYXNoX2ZpZWxkcyAmIFJYSF9MNF9CXzBfMSkKKwkJZGF0YSB8PSBFTkFfQURNSU5fUlNTX0w0X1NQOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2dldF9yc3NfaGFzaChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCkKK3sKKwllbnVtIGVuYV9hZG1pbl9mbG93X2hhc2hfcHJvdG8gcHJvdG87CisJdTE2IGhhc2hfZmllbGRzOworCWludCByYzsKKworCWNtZC0+ZGF0YSA9IDA7CisKKwlzd2l0Y2ggKGNtZC0+Zmxvd190eXBlKSB7CisJY2FzZSBUQ1BfVjRfRkxPVzoKKwkJcHJvdG8gPSBFTkFfQURNSU5fUlNTX1RDUDQ7CisJCWJyZWFrOworCWNhc2UgVURQX1Y0X0ZMT1c6CisJCXByb3RvID0gRU5BX0FETUlOX1JTU19VRFA0OworCQlicmVhazsKKwljYXNlIFRDUF9WNl9GTE9XOgorCQlwcm90byA9IEVOQV9BRE1JTl9SU1NfVENQNjsKKwkJYnJlYWs7CisJY2FzZSBVRFBfVjZfRkxPVzoKKwkJcHJvdG8gPSBFTkFfQURNSU5fUlNTX1VEUDY7CisJCWJyZWFrOworCWNhc2UgSVBWNF9GTE9XOgorCQlwcm90byA9IEVOQV9BRE1JTl9SU1NfSVA0OworCQlicmVhazsKKwljYXNlIElQVjZfRkxPVzoKKwkJcHJvdG8gPSBFTkFfQURNSU5fUlNTX0lQNjsKKwkJYnJlYWs7CisJY2FzZSBFVEhFUl9GTE9XOgorCQlwcm90byA9IEVOQV9BRE1JTl9SU1NfTk9UX0lQOworCQlicmVhazsKKwljYXNlIEFIX1Y0X0ZMT1c6CisJY2FzZSBFU1BfVjRfRkxPVzoKKwljYXNlIEFIX1Y2X0ZMT1c6CisJY2FzZSBFU1BfVjZfRkxPVzoKKwljYXNlIFNDVFBfVjRfRkxPVzoKKwljYXNlIEFIX0VTUF9WNF9GTE9XOgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBlbmFfY29tX2dldF9oYXNoX2N0cmwoZW5hX2RldiwgcHJvdG8sICZoYXNoX2ZpZWxkcyk7CisJaWYgKHJjKSB7CisJCS8qIElmIGRldmljZSBkb24ndCBoYXZlIHBlcm1pc3Npb24sIHJldHVybiB1bnN1cHBvcnRlZCAqLworCQlpZiAocmMgPT0gLUVQRVJNKQorCQkJcmMgPSAtRU9QTk9UU1VQUDsKKwkJcmV0dXJuIHJjOworCX0KKworCWNtZC0+ZGF0YSA9IGVuYV9mbG93X2hhc2hfdG9fZmxvd190eXBlKGhhc2hfZmllbGRzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuYV9zZXRfcnNzX2hhc2goc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQpCit7CisJZW51bSBlbmFfYWRtaW5fZmxvd19oYXNoX3Byb3RvIHByb3RvOworCXUxNiBoYXNoX2ZpZWxkczsKKworCXN3aXRjaCAoY21kLT5mbG93X3R5cGUpIHsKKwljYXNlIFRDUF9WNF9GTE9XOgorCQlwcm90byA9IEVOQV9BRE1JTl9SU1NfVENQNDsKKwkJYnJlYWs7CisJY2FzZSBVRFBfVjRfRkxPVzoKKwkJcHJvdG8gPSBFTkFfQURNSU5fUlNTX1VEUDQ7CisJCWJyZWFrOworCWNhc2UgVENQX1Y2X0ZMT1c6CisJCXByb3RvID0gRU5BX0FETUlOX1JTU19UQ1A2OworCQlicmVhazsKKwljYXNlIFVEUF9WNl9GTE9XOgorCQlwcm90byA9IEVOQV9BRE1JTl9SU1NfVURQNjsKKwkJYnJlYWs7CisJY2FzZSBJUFY0X0ZMT1c6CisJCXByb3RvID0gRU5BX0FETUlOX1JTU19JUDQ7CisJCWJyZWFrOworCWNhc2UgSVBWNl9GTE9XOgorCQlwcm90byA9IEVOQV9BRE1JTl9SU1NfSVA2OworCQlicmVhazsKKwljYXNlIEVUSEVSX0ZMT1c6CisJCXByb3RvID0gRU5BX0FETUlOX1JTU19OT1RfSVA7CisJCWJyZWFrOworCWNhc2UgQUhfVjRfRkxPVzoKKwljYXNlIEVTUF9WNF9GTE9XOgorCWNhc2UgQUhfVjZfRkxPVzoKKwljYXNlIEVTUF9WNl9GTE9XOgorCWNhc2UgU0NUUF9WNF9GTE9XOgorCWNhc2UgQUhfRVNQX1Y0X0ZMT1c6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloYXNoX2ZpZWxkcyA9IGVuYV9mbG93X2RhdGFfdG9fZmxvd19oYXNoKGNtZC0+ZGF0YSk7CisKKwlyZXR1cm4gZW5hX2NvbV9maWxsX2hhc2hfY3RybChlbmFfZGV2LCBwcm90bywgaGFzaF9maWVsZHMpOworfQorCitzdGF0aWMgaW50IGVuYV9zZXRfcnhuZmMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmluZm8pCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChpbmZvLT5jbWQpIHsKKwljYXNlIEVUSFRPT0xfU1JYRkg6CisJCXJjID0gZW5hX3NldF9yc3NfaGFzaChhZGFwdGVyLT5lbmFfZGV2LCBpbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX1NSWENMU1JMREVMOgorCWNhc2UgRVRIVE9PTF9TUlhDTFNSTElOUzoKKwlkZWZhdWx0OgorCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBuZXRkZXYsCisJCQkgICJDb21tYW5kIHBhcmFtZXRlciAlZCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBpbmZvLT5jbWQpOworCQlyYyA9IC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiAocmMgPT0gLUVQRVJNKSA/IC1FT1BOT1RTVVBQIDogcmM7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2dldF9yeG5mYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqaW5mbywKKwkJCSB1MzIgKnJ1bGVzKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoaW5mby0+Y21kKSB7CisJY2FzZSBFVEhUT09MX0dSWFJJTkdTOgorCQlpbmZvLT5kYXRhID0gYWRhcHRlci0+bnVtX3F1ZXVlczsKKwkJcmMgPSAwOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1JYRkg6CisJCXJjID0gZW5hX2dldF9yc3NfaGFzaChhZGFwdGVyLT5lbmFfZGV2LCBpbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX0dSWENMU1JMQ05UOgorCWNhc2UgRVRIVE9PTF9HUlhDTFNSVUxFOgorCWNhc2UgRVRIVE9PTF9HUlhDTFNSTEFMTDoKKwlkZWZhdWx0OgorCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBuZXRkZXYsCisJCQkgICJDb21tYW5kIHBhcmFtZXRlciAlZCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBpbmZvLT5jbWQpOworCQlyYyA9IC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiAocmMgPT0gLUVQRVJNKSA/IC1FT1BOT1RTVVBQIDogcmM7Cit9CisKK3N0YXRpYyB1MzIgZW5hX2dldF9yeGZoX2luZGlyX3NpemUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gRU5BX1JYX1JTU19UQUJMRV9TSVpFOworfQorCitzdGF0aWMgdTMyIGVuYV9nZXRfcnhmaF9rZXlfc2l6ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXJldHVybiBFTkFfSEFTSF9LRVlfU0laRTsKK30KKworc3RhdGljIGludCBlbmFfZ2V0X3J4Zmgoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyICppbmRpciwgdTggKmtleSwKKwkJCXU4ICpoZnVuYykKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWVudW0gZW5hX2FkbWluX2hhc2hfZnVuY3Rpb25zIGVuYV9mdW5jOworCXU4IGZ1bmM7CisJaW50IHJjOworCisJcmMgPSBlbmFfY29tX2luZGlyZWN0X3RhYmxlX2dldChhZGFwdGVyLT5lbmFfZGV2LCBpbmRpcik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IGVuYV9jb21fZ2V0X2hhc2hfZnVuY3Rpb24oYWRhcHRlci0+ZW5hX2RldiwgJmVuYV9mdW5jLCBrZXkpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJc3dpdGNoIChlbmFfZnVuYykgeworCWNhc2UgRU5BX0FETUlOX1RPRVBMSVRaOgorCQlmdW5jID0gRVRIX1JTU19IQVNIX1RPUDsKKwkJYnJlYWs7CisJY2FzZSBFTkFfQURNSU5fQ1JDMzI6CisJCWZ1bmMgPSBFVEhfUlNTX0hBU0hfWE9SOworCQlicmVhazsKKwlkZWZhdWx0OgorCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBuZXRkZXYsCisJCQkgICJDb21tYW5kIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCWlmIChoZnVuYykKKwkJKmhmdW5jID0gZnVuYzsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBlbmFfc2V0X3J4Zmgoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgY29uc3QgdTMyICppbmRpciwKKwkJCWNvbnN0IHU4ICprZXksIGNvbnN0IHU4IGhmdW5jKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2ID0gYWRhcHRlci0+ZW5hX2RldjsKKwllbnVtIGVuYV9hZG1pbl9oYXNoX2Z1bmN0aW9ucyBmdW5jOworCWludCByYywgaTsKKworCWlmIChpbmRpcikgeworCQlmb3IgKGkgPSAwOyBpIDwgRU5BX1JYX1JTU19UQUJMRV9TSVpFOyBpKyspIHsKKwkJCXJjID0gZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9maWxsX2VudHJ5KGVuYV9kZXYsCisJCQkJCQkJICAgICAgIEVOQV9JT19SWFFfSURYKGluZGlyW2ldKSwKKwkJCQkJCQkgICAgICAgaSk7CisJCQlpZiAodW5saWtlbHkocmMpKSB7CisJCQkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgbmV0ZGV2LAorCQkJCQkgICJDYW5ub3QgZmlsbCBpbmRpcmVjdCB0YWJsZSAoaW5kZXggaXMgdG9vIGxhcmdlKVxuIik7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9CisKKwkJcmMgPSBlbmFfY29tX2luZGlyZWN0X3RhYmxlX3NldChlbmFfZGV2KTsKKwkJaWYgKHJjKSB7CisJCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBuZXRkZXYsCisJCQkJICAiQ2Fubm90IHNldCBpbmRpcmVjdCB0YWJsZVxuIik7CisJCQlyZXR1cm4gcmMgPT0gLUVQRVJNID8gLUVPUE5PVFNVUFAgOiByYzsKKwkJfQorCX0KKworCXN3aXRjaCAoaGZ1bmMpIHsKKwljYXNlIEVUSF9SU1NfSEFTSF9UT1A6CisJCWZ1bmMgPSBFTkFfQURNSU5fVE9FUExJVFo7CisJCWJyZWFrOworCWNhc2UgRVRIX1JTU19IQVNIX1hPUjoKKwkJZnVuYyA9IEVOQV9BRE1JTl9DUkMzMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgbmV0ZGV2LCAiVW5zdXBwb3J0ZWQgaGZ1bmMgJWRcbiIsCisJCQkgIGhmdW5jKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCWlmIChrZXkpIHsKKwkJcmMgPSBlbmFfY29tX2ZpbGxfaGFzaF9mdW5jdGlvbihlbmFfZGV2LCBmdW5jLCBrZXksCisJCQkJCQlFTkFfSEFTSF9LRVlfU0laRSwKKwkJCQkJCTB4RkZGRkZGRkYpOworCQlpZiAodW5saWtlbHkocmMpKSB7CisJCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBuZXRkZXYsICJDYW5ub3QgZmlsbCBrZXlcbiIpOworCQkJcmV0dXJuIHJjID09IC1FUEVSTSA/IC1FT1BOT1RTVVBQIDogcmM7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5hX2dldF9jaGFubmVscyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9jaGFubmVscyAqY2hhbm5lbHMpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWNoYW5uZWxzLT5tYXhfcnggPSBFTkFfTUFYX05VTV9JT19RVUVVRVM7CisJY2hhbm5lbHMtPm1heF90eCA9IEVOQV9NQVhfTlVNX0lPX1FVRVVFUzsKKwljaGFubmVscy0+bWF4X290aGVyID0gMDsKKwljaGFubmVscy0+bWF4X2NvbWJpbmVkID0gMDsKKwljaGFubmVscy0+cnhfY291bnQgPSBhZGFwdGVyLT5udW1fcXVldWVzOworCWNoYW5uZWxzLT50eF9jb3VudCA9IGFkYXB0ZXItPm51bV9xdWV1ZXM7CisJY2hhbm5lbHMtPm90aGVyX2NvdW50ID0gMDsKKwljaGFubmVscy0+Y29tYmluZWRfY291bnQgPSAwOworfQorCitzdGF0aWMgaW50IGVuYV9nZXRfdHVuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgY29uc3Qgc3RydWN0IGV0aHRvb2xfdHVuYWJsZSAqdHVuYSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCByZXQgPSAwOworCisJc3dpdGNoICh0dW5hLT5pZCkgeworCWNhc2UgRVRIVE9PTF9SWF9DT1BZQlJFQUs6CisJCSoodTMyICopZGF0YSA9IGFkYXB0ZXItPnJ4X2NvcHlicmVhazsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlbmFfc2V0X3R1bmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBldGh0b29sX3R1bmFibGUgKnR1bmEsCisJCQkgICBjb25zdCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IHJldCA9IDA7CisJdTMyIGxlbjsKKworCXN3aXRjaCAodHVuYS0+aWQpIHsKKwljYXNlIEVUSFRPT0xfUlhfQ09QWUJSRUFLOgorCQlsZW4gPSAqKHUzMiAqKWRhdGE7CisJCWlmIChsZW4gPiBhZGFwdGVyLT5uZXRkZXYtPm10dSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWFkYXB0ZXItPnJ4X2NvcHlicmVhayA9IGxlbjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBlbmFfZXRodG9vbF9vcHMgPSB7CisJLmdldF9saW5rX2tzZXR0aW5ncwk9IGVuYV9nZXRfbGlua19rc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvCQk9IGVuYV9nZXRfZHJ2aW5mbywKKwkuZ2V0X21zZ2xldmVsCQk9IGVuYV9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBlbmFfc2V0X21zZ2xldmVsLAorCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfY29hbGVzY2UJCT0gZW5hX2dldF9jb2FsZXNjZSwKKwkuc2V0X2NvYWxlc2NlCQk9IGVuYV9zZXRfY29hbGVzY2UsCisJLmdldF9yaW5ncGFyYW0JCT0gZW5hX2dldF9yaW5ncGFyYW0sCisJLmdldF9zc2V0X2NvdW50ICAgICAgICAgPSBlbmFfZ2V0X3NzZXRfY291bnQsCisJLmdldF9zdHJpbmdzCQk9IGVuYV9nZXRfc3RyaW5ncywKKwkuZ2V0X2V0aHRvb2xfc3RhdHMgICAgICA9IGVuYV9nZXRfZXRodG9vbF9zdGF0cywKKwkuZ2V0X3J4bmZjCQk9IGVuYV9nZXRfcnhuZmMsCisJLnNldF9yeG5mYwkJPSBlbmFfc2V0X3J4bmZjLAorCS5nZXRfcnhmaF9pbmRpcl9zaXplICAgID0gZW5hX2dldF9yeGZoX2luZGlyX3NpemUsCisJLmdldF9yeGZoX2tleV9zaXplCT0gZW5hX2dldF9yeGZoX2tleV9zaXplLAorCS5nZXRfcnhmaAkJPSBlbmFfZ2V0X3J4ZmgsCisJLnNldF9yeGZoCQk9IGVuYV9zZXRfcnhmaCwKKwkuZ2V0X2NoYW5uZWxzCQk9IGVuYV9nZXRfY2hhbm5lbHMsCisJLmdldF90dW5hYmxlCQk9IGVuYV9nZXRfdHVuYWJsZSwKKwkuc2V0X3R1bmFibGUJCT0gZW5hX3NldF90dW5hYmxlLAorfTsKKwordm9pZCBlbmFfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZlbmFfZXRodG9vbF9vcHM7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9kdW1wX3N0YXRzX2V4KHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwgdTggKmJ1ZikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXU4ICpzdHJpbmdzX2J1ZjsKKwl1NjQgKmRhdGFfYnVmOworCWludCBzdHJpbmdzX251bTsKKwlpbnQgaSwgcmM7CisKKwlzdHJpbmdzX251bSA9IGVuYV9nZXRfc3NldF9jb3VudChuZXRkZXYsIEVUSF9TU19TVEFUUyk7CisJaWYgKHN0cmluZ3NfbnVtIDw9IDApIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgbmV0ZGV2LCAiQ2FuJ3QgZ2V0IHN0YXRzIG51bVxuIik7CisJCXJldHVybjsKKwl9CisKKwlzdHJpbmdzX2J1ZiA9IGRldm1fa3phbGxvYygmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCSAgIHN0cmluZ3NfbnVtICogRVRIX0dTVFJJTkdfTEVOLAorCQkJCSAgIEdGUF9BVE9NSUMpOworCWlmICghc3RyaW5nc19idWYpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgbmV0ZGV2LAorCQkJICAiZmFpbGVkIHRvIGFsbG9jIHN0cmluZ3NfYnVmXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWRhdGFfYnVmID0gZGV2bV9remFsbG9jKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJc3RyaW5nc19udW0gKiBzaXplb2YodTY0KSwKKwkJCQlHRlBfQVRPTUlDKTsKKwlpZiAoIWRhdGFfYnVmKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIG5ldGRldiwKKwkJCSAgImZhaWxlZCB0byBhbGxvY2F0ZSBkYXRhIGJ1ZlxuIik7CisJCWRldm1fa2ZyZWUoJmFkYXB0ZXItPnBkZXYtPmRldiwgc3RyaW5nc19idWYpOworCQlyZXR1cm47CisJfQorCisJZW5hX2dldF9zdHJpbmdzKG5ldGRldiwgRVRIX1NTX1NUQVRTLCBzdHJpbmdzX2J1Zik7CisJZW5hX2dldF9ldGh0b29sX3N0YXRzKG5ldGRldiwgTlVMTCwgZGF0YV9idWYpOworCisJLyogSWYgdGhlcmUgaXMgYSBidWZmZXIsIGR1bXAgc3RhdHMsIG90aGVyd2lzZSBwcmludCB0aGVtIHRvIGRtZXNnICovCisJaWYgKGJ1ZikKKwkJZm9yIChpID0gMDsgaSA8IHN0cmluZ3NfbnVtOyBpKyspIHsKKwkJCXJjID0gc25wcmludGYoYnVmLCBFVEhfR1NUUklOR19MRU4gKyBzaXplb2YodTY0KSwKKwkJCQkgICAgICAiJXMgJWxsdVxuIiwKKwkJCQkgICAgICBzdHJpbmdzX2J1ZiArIGkgKiBFVEhfR1NUUklOR19MRU4sCisJCQkJICAgICAgZGF0YV9idWZbaV0pOworCQkJYnVmICs9IHJjOworCQl9CisJZWxzZQorCQlmb3IgKGkgPSAwOyBpIDwgc3RyaW5nc19udW07IGkrKykKKwkJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIG5ldGRldiwgIiVzOiAlbGx1XG4iLAorCQkJCSAgc3RyaW5nc19idWYgKyBpICogRVRIX0dTVFJJTkdfTEVOLAorCQkJCSAgZGF0YV9idWZbaV0pOworCisJZGV2bV9rZnJlZSgmYWRhcHRlci0+cGRldi0+ZGV2LCBzdHJpbmdzX2J1Zik7CisJZGV2bV9rZnJlZSgmYWRhcHRlci0+cGRldi0+ZGV2LCBkYXRhX2J1Zik7Cit9CisKK3ZvaWQgZW5hX2R1bXBfc3RhdHNfdG9fYnVmKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwgdTggKmJ1ZikKK3sKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCisJZW5hX2R1bXBfc3RhdHNfZXgoYWRhcHRlciwgYnVmKTsKK30KKwordm9pZCBlbmFfZHVtcF9zdGF0c190b19kbWVzZyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJZW5hX2R1bXBfc3RhdHNfZXgoYWRhcHRlciwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9uZXRkZXYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX25ldGRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZWFlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9uZXRkZXYuYwpAQCAtMCwwICsxLDMyNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2lmZGVmIENPTkZJR19SRlNfQUNDRUwKKyNpbmNsdWRlIDxsaW51eC9jcHVfcm1hcC5oPgorI2VuZGlmIC8qIENPTkZJR19SRlNfQUNDRUwgKi8KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbnVtYS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorCisjaW5jbHVkZSAiZW5hX25ldGRldi5oIgorI2luY2x1ZGUgImVuYV9wY2lfaWRfdGJsLmgiCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSA9IERFVklDRV9OQU1FICIgdiIgRFJWX01PRFVMRV9WRVJTSU9OICJcbiI7CisKK01PRFVMRV9BVVRIT1IoIkFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMiKTsKK01PRFVMRV9ERVNDUklQVElPTihERVZJQ0VfTkFNRSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfTU9EVUxFX1ZFUlNJT04pOworCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQgICg1ICogSFopCisKKyNkZWZpbmUgRU5BX05BUElfQlVER0VUIDY0CisKKyNkZWZpbmUgREVGQVVMVF9NU0dfRU5BQkxFIChORVRJRl9NU0dfRFJWIHwgTkVUSUZfTVNHX1BST0JFIHwgTkVUSUZfTVNHX0lGVVAgfCBcCisJCU5FVElGX01TR19UWF9ET05FIHwgTkVUSUZfTVNHX1RYX0VSUiB8IE5FVElGX01TR19SWF9FUlIpCitzdGF0aWMgaW50IGRlYnVnID0gLTE7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDA9bm9uZSwuLi4sMTY9YWxsKSIpOworCitzdGF0aWMgc3RydWN0IGVuYV9hZW5xX2hhbmRsZXJzIGFlbnFfaGFuZGxlcnM7CisKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZW5hX3dxOworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZW5hX3BjaV90YmwpOworCitzdGF0aWMgaW50IGVuYV9yc3NfaW5pdF9kZWZhdWx0KHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcik7CisKK3N0YXRpYyB2b2lkIGVuYV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJmFkYXB0ZXItPnN5bmNwKTsKKwlhZGFwdGVyLT5kZXZfc3RhdHMudHhfdGltZW91dCsrOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZhZGFwdGVyLT5zeW5jcCk7CisKKwluZXRpZl9lcnIoYWRhcHRlciwgdHhfZXJyLCBkZXYsICJUcmFuc21pdCB0aW1lIG91dFxuIik7CisKKwkvKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBkZXZpY2UgdG8gdHJpZ2dlciByZXNldCAqLworCXNldF9iaXQoRU5BX0ZMQUdfVFJJR0dFUl9SRVNFVCwgJmFkYXB0ZXItPmZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3J4X3JpbmdfbXR1KHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwgaW50IG10dSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspCisJCWFkYXB0ZXItPnJ4X3JpbmdbaV0ubXR1ID0gbXR1OworfQorCitzdGF0aWMgaW50IGVuYV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldDsKKworCWlmICgobmV3X210dSA+IGFkYXB0ZXItPm1heF9tdHUpIHx8IChuZXdfbXR1IDwgRU5BX01JTl9NVFUpKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIGRldiwKKwkJCSAgIkludmFsaWQgTVRVIHNldHRpbmcuIG5ld19tdHU6ICVkXG4iLCBuZXdfbXR1KTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBlbmFfY29tX3NldF9kZXZfbXR1KGFkYXB0ZXItPmVuYV9kZXYsIG5ld19tdHUpOworCWlmICghcmV0KSB7CisJCW5ldGlmX2RiZyhhZGFwdGVyLCBkcnYsIGRldiwgInNldCBNVFUgdG8gJWRcbiIsIG5ld19tdHUpOworCQl1cGRhdGVfcnhfcmluZ19tdHUoYWRhcHRlciwgbmV3X210dSk7CisJCWRldi0+bXR1ID0gbmV3X210dTsKKwl9IGVsc2UgeworCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBkZXYsICJGYWlsZWQgdG8gc2V0IE1UVSB0byAlZFxuIiwKKwkJCSAgbmV3X210dSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlbmFfaW5pdF9yeF9jcHVfcm1hcChzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisjaWZkZWYgQ09ORklHX1JGU19BQ0NFTAorCXUzMiBpOworCWludCByYzsKKworCWFkYXB0ZXItPm5ldGRldi0+cnhfY3B1X3JtYXAgPSBhbGxvY19pcnFfY3B1X3JtYXAoYWRhcHRlci0+bnVtX3F1ZXVlcyk7CisJaWYgKCFhZGFwdGVyLT5uZXRkZXYtPnJ4X2NwdV9ybWFwKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7CisJCWludCBpcnFfaWR4ID0gRU5BX0lPX0lSUV9JRFgoaSk7CisKKwkJcmMgPSBpcnFfY3B1X3JtYXBfYWRkKGFkYXB0ZXItPm5ldGRldi0+cnhfY3B1X3JtYXAsCisJCQkJICAgICAgYWRhcHRlci0+bXNpeF9lbnRyaWVzW2lycV9pZHhdLnZlY3Rvcik7CisJCWlmIChyYykgeworCQkJZnJlZV9pcnFfY3B1X3JtYXAoYWRhcHRlci0+bmV0ZGV2LT5yeF9jcHVfcm1hcCk7CisJCQlhZGFwdGVyLT5uZXRkZXYtPnJ4X2NwdV9ybWFwID0gTlVMTDsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKyNlbmRpZiAvKiBDT05GSUdfUkZTX0FDQ0VMICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9pbml0X2lvX3JpbmdzX2NvbW1vbihzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICAgICBzdHJ1Y3QgZW5hX3JpbmcgKnJpbmcsIHUxNiBxaWQpCit7CisJcmluZy0+cWlkID0gcWlkOworCXJpbmctPnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCXJpbmctPmRldiA9ICZhZGFwdGVyLT5wZGV2LT5kZXY7CisJcmluZy0+bmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXJpbmctPm5hcGkgPSAmYWRhcHRlci0+ZW5hX25hcGlbcWlkXS5uYXBpOworCXJpbmctPmFkYXB0ZXIgPSBhZGFwdGVyOworCXJpbmctPmVuYV9kZXYgPSBhZGFwdGVyLT5lbmFfZGV2OworCXJpbmctPnBlcl9uYXBpX3BhY2tldHMgPSAwOworCXJpbmctPnBlcl9uYXBpX2J5dGVzID0gMDsKKwlyaW5nLT5jcHUgPSAwOworCXU2NF9zdGF0c19pbml0KCZyaW5nLT5zeW5jcCk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9pbml0X2lvX3JpbmdzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXY7CisJc3RydWN0IGVuYV9yaW5nICp0eHIsICpyeHI7CisJaW50IGk7CisKKwllbmFfZGV2ID0gYWRhcHRlci0+ZW5hX2RldjsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspIHsKKwkJdHhyID0gJmFkYXB0ZXItPnR4X3JpbmdbaV07CisJCXJ4ciA9ICZhZGFwdGVyLT5yeF9yaW5nW2ldOworCisJCS8qIFRYL1JYIGNvbW1vbiByaW5nIHN0YXRlICovCisJCWVuYV9pbml0X2lvX3JpbmdzX2NvbW1vbihhZGFwdGVyLCB0eHIsIGkpOworCQllbmFfaW5pdF9pb19yaW5nc19jb21tb24oYWRhcHRlciwgcnhyLCBpKTsKKworCQkvKiBUWCBzcGVjaWZpYyByaW5nIHN0YXRlICovCisJCXR4ci0+cmluZ19zaXplID0gYWRhcHRlci0+dHhfcmluZ19zaXplOworCQl0eHItPnR4X21heF9oZWFkZXJfc2l6ZSA9IGVuYV9kZXYtPnR4X21heF9oZWFkZXJfc2l6ZTsKKwkJdHhyLT50eF9tZW1fcXVldWVfdHlwZSA9IGVuYV9kZXYtPnR4X21lbV9xdWV1ZV90eXBlOworCQl0eHItPnNnbF9zaXplID0gYWRhcHRlci0+bWF4X3R4X3NnbF9zaXplOworCQl0eHItPnNtb290aGVkX2ludGVydmFsID0KKwkJCWVuYV9jb21fZ2V0X25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfdHgoZW5hX2Rldik7CisKKwkJLyogUlggc3BlY2lmaWMgcmluZyBzdGF0ZSAqLworCQlyeHItPnJpbmdfc2l6ZSA9IGFkYXB0ZXItPnJ4X3Jpbmdfc2l6ZTsKKwkJcnhyLT5yeF9jb3B5YnJlYWsgPSBhZGFwdGVyLT5yeF9jb3B5YnJlYWs7CisJCXJ4ci0+c2dsX3NpemUgPSBhZGFwdGVyLT5tYXhfcnhfc2dsX3NpemU7CisJCXJ4ci0+c21vb3RoZWRfaW50ZXJ2YWwgPQorCQkJZW5hX2NvbV9nZXRfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF9yeChlbmFfZGV2KTsKKwl9Cit9CisKKy8qIGVuYV9zZXR1cF90eF9yZXNvdXJjZXMgLSBhbGxvY2F0ZSBJL08gVHggcmVzb3VyY2VzIChEZXNjcmlwdG9ycykKKyAqIEBhZGFwdGVyOiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcWlkOiBxdWV1ZSBpbmRleAorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBlbmFfc2V0dXBfdHhfcmVzb3VyY2VzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwgaW50IHFpZCkKK3sKKwlzdHJ1Y3QgZW5hX3JpbmcgKnR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZ1txaWRdOworCXN0cnVjdCBlbmFfaXJxICplbmFfaXJxID0gJmFkYXB0ZXItPmlycV90YmxbRU5BX0lPX0lSUV9JRFgocWlkKV07CisJaW50IHNpemUsIGksIG5vZGU7CisKKwlpZiAodHhfcmluZy0+dHhfYnVmZmVyX2luZm8pIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGlmdXAsCisJCQkgIGFkYXB0ZXItPm5ldGRldiwgInR4X2J1ZmZlcl9pbmZvIGluZm8gaXMgbm90IE5VTEwiKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZW5hX3R4X2J1ZmZlcikgKiB0eF9yaW5nLT5yaW5nX3NpemU7CisJbm9kZSA9IGNwdV90b19ub2RlKGVuYV9pcnEtPmNwdSk7CisKKwl0eF9yaW5nLT50eF9idWZmZXJfaW5mbyA9IHZ6YWxsb2Nfbm9kZShzaXplLCBub2RlKTsKKwlpZiAoIXR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvKSB7CisJCXR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvID0gdnphbGxvYyhzaXplKTsKKwkJaWYgKCF0eF9yaW5nLT50eF9idWZmZXJfaW5mbykKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNpemUgPSBzaXplb2YodTE2KSAqIHR4X3JpbmctPnJpbmdfc2l6ZTsKKwl0eF9yaW5nLT5mcmVlX3R4X2lkcyA9IHZ6YWxsb2Nfbm9kZShzaXplLCBub2RlKTsKKwlpZiAoIXR4X3JpbmctPmZyZWVfdHhfaWRzKSB7CisJCXR4X3JpbmctPmZyZWVfdHhfaWRzID0gdnphbGxvYyhzaXplKTsKKwkJaWYgKCF0eF9yaW5nLT5mcmVlX3R4X2lkcykgeworCQkJdmZyZWUodHhfcmluZy0+dHhfYnVmZmVyX2luZm8pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwkvKiBSZXEgaWQgcmluZyBmb3IgVFggb3V0IG9mIG9yZGVyIGNvbXBsZXRpb25zICovCisJZm9yIChpID0gMDsgaSA8IHR4X3JpbmctPnJpbmdfc2l6ZTsgaSsrKQorCQl0eF9yaW5nLT5mcmVlX3R4X2lkc1tpXSA9IGk7CisKKwkvKiBSZXNldCB0eCBzdGF0aXN0aWNzICovCisJbWVtc2V0KCZ0eF9yaW5nLT50eF9zdGF0cywgMHgwLCBzaXplb2YodHhfcmluZy0+dHhfc3RhdHMpKTsKKworCXR4X3JpbmctPm5leHRfdG9fdXNlID0gMDsKKwl0eF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gMDsKKwl0eF9yaW5nLT5jcHUgPSBlbmFfaXJxLT5jcHU7CisJcmV0dXJuIDA7Cit9CisKKy8qIGVuYV9mcmVlX3R4X3Jlc291cmNlcyAtIEZyZWUgSS9PIFR4IFJlc291cmNlcyBwZXIgUXVldWUKKyAqIEBhZGFwdGVyOiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcWlkOiBxdWV1ZSBpbmRleAorICoKKyAqIEZyZWUgYWxsIHRyYW5zbWl0IHNvZnR3YXJlIHJlc291cmNlcworICovCitzdGF0aWMgdm9pZCBlbmFfZnJlZV90eF9yZXNvdXJjZXMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLCBpbnQgcWlkKQoreworCXN0cnVjdCBlbmFfcmluZyAqdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nW3FpZF07CisKKwl2ZnJlZSh0eF9yaW5nLT50eF9idWZmZXJfaW5mbyk7CisJdHhfcmluZy0+dHhfYnVmZmVyX2luZm8gPSBOVUxMOworCisJdmZyZWUodHhfcmluZy0+ZnJlZV90eF9pZHMpOworCXR4X3JpbmctPmZyZWVfdHhfaWRzID0gTlVMTDsKK30KKworLyogZW5hX3NldHVwX2FsbF90eF9yZXNvdXJjZXMgLSBhbGxvY2F0ZSBJL08gVHggcXVldWVzIHJlc291cmNlcyBmb3IgQWxsIHF1ZXVlcworICogQGFkYXB0ZXI6IHByaXZhdGUgc3RydWN0dXJlCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGVuYV9zZXR1cF9hbGxfdHhfcmVzb3VyY2VzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgaSwgcmMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykgeworCQlyYyA9IGVuYV9zZXR1cF90eF9yZXNvdXJjZXMoYWRhcHRlciwgaSk7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyX3NldHVwX3R4OworCX0KKworCXJldHVybiAwOworCitlcnJfc2V0dXBfdHg6CisKKwluZXRpZl9lcnIoYWRhcHRlciwgaWZ1cCwgYWRhcHRlci0+bmV0ZGV2LAorCQkgICJUeCBxdWV1ZSAlZDogYWxsb2NhdGlvbiBmYWlsZWRcbiIsIGkpOworCisJLyogcmV3aW5kIHRoZSBpbmRleCBmcmVlaW5nIHRoZSByaW5ncyBhcyB3ZSBnbyAqLworCXdoaWxlIChpLS0pCisJCWVuYV9mcmVlX3R4X3Jlc291cmNlcyhhZGFwdGVyLCBpKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGVuYV9mcmVlX2FsbF9pb190eF9yZXNvdXJjZXMgLSBGcmVlIEkvTyBUeCBSZXNvdXJjZXMgZm9yIEFsbCBRdWV1ZXMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIEZyZWUgYWxsIHRyYW5zbWl0IHNvZnR3YXJlIHJlc291cmNlcworICovCitzdGF0aWMgdm9pZCBlbmFfZnJlZV9hbGxfaW9fdHhfcmVzb3VyY2VzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspCisJCWVuYV9mcmVlX3R4X3Jlc291cmNlcyhhZGFwdGVyLCBpKTsKK30KKworLyogZW5hX3NldHVwX3J4X3Jlc291cmNlcyAtIGFsbG9jYXRlIEkvTyBSeCByZXNvdXJjZXMgKERlc2NyaXB0b3JzKQorICogQGFkYXB0ZXI6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBxaWQ6IHF1ZXVlIGluZGV4CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBlbmFfc2V0dXBfcnhfcmVzb3VyY2VzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgIHUzMiBxaWQpCit7CisJc3RydWN0IGVuYV9yaW5nICpyeF9yaW5nID0gJmFkYXB0ZXItPnJ4X3JpbmdbcWlkXTsKKwlzdHJ1Y3QgZW5hX2lycSAqZW5hX2lycSA9ICZhZGFwdGVyLT5pcnFfdGJsW0VOQV9JT19JUlFfSURYKHFpZCldOworCWludCBzaXplLCBub2RlOworCisJaWYgKHJ4X3JpbmctPnJ4X2J1ZmZlcl9pbmZvKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBpZnVwLCBhZGFwdGVyLT5uZXRkZXYsCisJCQkgICJyeF9idWZmZXJfaW5mbyBpcyBub3QgTlVMTCIpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwkvKiBhbGxvYyBleHRyYSBlbGVtZW50IHNvIGluIHJ4IHBhdGgKKwkgKiB3ZSBjYW4gYWx3YXlzIHByZWZldGNoIHJ4X2luZm8gKyAxCisJICovCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZW5hX3J4X2J1ZmZlcikgKiAocnhfcmluZy0+cmluZ19zaXplICsgMSk7CisJbm9kZSA9IGNwdV90b19ub2RlKGVuYV9pcnEtPmNwdSk7CisKKwlyeF9yaW5nLT5yeF9idWZmZXJfaW5mbyA9IHZ6YWxsb2Nfbm9kZShzaXplLCBub2RlKTsKKwlpZiAoIXJ4X3JpbmctPnJ4X2J1ZmZlcl9pbmZvKSB7CisJCXJ4X3JpbmctPnJ4X2J1ZmZlcl9pbmZvID0gdnphbGxvYyhzaXplKTsKKwkJaWYgKCFyeF9yaW5nLT5yeF9idWZmZXJfaW5mbykKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFJlc2V0IHJ4IHN0YXRpc3RpY3MgKi8KKwltZW1zZXQoJnJ4X3JpbmctPnJ4X3N0YXRzLCAweDAsIHNpemVvZihyeF9yaW5nLT5yeF9zdGF0cykpOworCisJcnhfcmluZy0+bmV4dF90b19jbGVhbiA9IDA7CisJcnhfcmluZy0+bmV4dF90b191c2UgPSAwOworCXJ4X3JpbmctPmNwdSA9IGVuYV9pcnEtPmNwdTsKKworCXJldHVybiAwOworfQorCisvKiBlbmFfZnJlZV9yeF9yZXNvdXJjZXMgLSBGcmVlIEkvTyBSeCBSZXNvdXJjZXMKKyAqIEBhZGFwdGVyOiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcWlkOiBxdWV1ZSBpbmRleAorICoKKyAqIEZyZWUgYWxsIHJlY2VpdmUgc29mdHdhcmUgcmVzb3VyY2VzCisgKi8KK3N0YXRpYyB2b2lkIGVuYV9mcmVlX3J4X3Jlc291cmNlcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICB1MzIgcWlkKQoreworCXN0cnVjdCBlbmFfcmluZyAqcnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nW3FpZF07CisKKwl2ZnJlZShyeF9yaW5nLT5yeF9idWZmZXJfaW5mbyk7CisJcnhfcmluZy0+cnhfYnVmZmVyX2luZm8gPSBOVUxMOworfQorCisvKiBlbmFfc2V0dXBfYWxsX3J4X3Jlc291cmNlcyAtIGFsbG9jYXRlIEkvTyBSeCBxdWV1ZXMgcmVzb3VyY2VzIGZvciBhbGwgcXVldWVzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgZW5hX3NldHVwX2FsbF9yeF9yZXNvdXJjZXMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpLCByYyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7CisJCXJjID0gZW5hX3NldHVwX3J4X3Jlc291cmNlcyhhZGFwdGVyLCBpKTsKKwkJaWYgKHJjKQorCQkJZ290byBlcnJfc2V0dXBfcng7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9zZXR1cF9yeDoKKworCW5ldGlmX2VycihhZGFwdGVyLCBpZnVwLCBhZGFwdGVyLT5uZXRkZXYsCisJCSAgIlJ4IHF1ZXVlICVkOiBhbGxvY2F0aW9uIGZhaWxlZFxuIiwgaSk7CisKKwkvKiByZXdpbmQgdGhlIGluZGV4IGZyZWVpbmcgdGhlIHJpbmdzIGFzIHdlIGdvICovCisJd2hpbGUgKGktLSkKKwkJZW5hX2ZyZWVfcnhfcmVzb3VyY2VzKGFkYXB0ZXIsIGkpOworCXJldHVybiByYzsKK30KKworLyogZW5hX2ZyZWVfYWxsX2lvX3J4X3Jlc291cmNlcyAtIEZyZWUgSS9PIFJ4IFJlc291cmNlcyBmb3IgQWxsIFF1ZXVlcworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogRnJlZSBhbGwgcmVjZWl2ZSBzb2Z0d2FyZSByZXNvdXJjZXMKKyAqLworc3RhdGljIHZvaWQgZW5hX2ZyZWVfYWxsX2lvX3J4X3Jlc291cmNlcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKQorCQllbmFfZnJlZV9yeF9yZXNvdXJjZXMoYWRhcHRlciwgaSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGVuYV9hbGxvY19yeF9wYWdlKHN0cnVjdCBlbmFfcmluZyAqcnhfcmluZywKKwkJCQkgICAgc3RydWN0IGVuYV9yeF9idWZmZXIgKnJ4X2luZm8sIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9idWYgKmVuYV9idWY7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJZG1hX2FkZHJfdCBkbWE7CisKKwkvKiBpZiBwcmV2aW91cyBhbGxvY2F0ZWQgcGFnZSBpcyBub3QgdXNlZCAqLworCWlmICh1bmxpa2VseShyeF9pbmZvLT5wYWdlKSkKKwkJcmV0dXJuIDA7CisKKwlwYWdlID0gYWxsb2NfcGFnZShnZnApOworCWlmICh1bmxpa2VseSghcGFnZSkpIHsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcnhfcmluZy0+c3luY3ApOworCQlyeF9yaW5nLT5yeF9zdGF0cy5wYWdlX2FsbG9jX2ZhaWwrKzsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnJ4X3JpbmctPnN5bmNwKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZG1hID0gZG1hX21hcF9wYWdlKHJ4X3JpbmctPmRldiwgcGFnZSwgMCwgUEFHRV9TSVpFLAorCQkJICAgRE1BX0ZST01fREVWSUNFKTsKKwlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IocnhfcmluZy0+ZGV2LCBkbWEpKSkgeworCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9yaW5nLT5zeW5jcCk7CisJCXJ4X3JpbmctPnJ4X3N0YXRzLmRtYV9tYXBwaW5nX2VycisrOworCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcnhfcmluZy0+c3luY3ApOworCisJCV9fZnJlZV9wYWdlKHBhZ2UpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbmV0aWZfZGJnKHJ4X3JpbmctPmFkYXB0ZXIsIHJ4X3N0YXR1cywgcnhfcmluZy0+bmV0ZGV2LAorCQkgICJhbGxvYyBwYWdlICVwLCByeF9pbmZvICVwXG4iLCBwYWdlLCByeF9pbmZvKTsKKworCXJ4X2luZm8tPnBhZ2UgPSBwYWdlOworCXJ4X2luZm8tPnBhZ2Vfb2Zmc2V0ID0gMDsKKwllbmFfYnVmID0gJnJ4X2luZm8tPmVuYV9idWY7CisJZW5hX2J1Zi0+cGFkZHIgPSBkbWE7CisJZW5hX2J1Zi0+bGVuID0gUEFHRV9TSVpFOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9mcmVlX3J4X3BhZ2Uoc3RydWN0IGVuYV9yaW5nICpyeF9yaW5nLAorCQkJICAgICBzdHJ1Y3QgZW5hX3J4X2J1ZmZlciAqcnhfaW5mbykKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJ4X2luZm8tPnBhZ2U7CisJc3RydWN0IGVuYV9jb21fYnVmICplbmFfYnVmID0gJnJ4X2luZm8tPmVuYV9idWY7CisKKwlpZiAodW5saWtlbHkoIXBhZ2UpKSB7CisJCW5ldGlmX3dhcm4ocnhfcmluZy0+YWRhcHRlciwgcnhfZXJyLCByeF9yaW5nLT5uZXRkZXYsCisJCQkgICAiVHJ5aW5nIHRvIGZyZWUgdW5hbGxvY2F0ZWQgYnVmZmVyXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWRtYV91bm1hcF9wYWdlKHJ4X3JpbmctPmRldiwgZW5hX2J1Zi0+cGFkZHIsIFBBR0VfU0laRSwKKwkJICAgICAgIERNQV9GUk9NX0RFVklDRSk7CisKKwlfX2ZyZWVfcGFnZShwYWdlKTsKKwlyeF9pbmZvLT5wYWdlID0gTlVMTDsKK30KKworc3RhdGljIGludCBlbmFfcmVmaWxsX3J4X2J1ZnMoc3RydWN0IGVuYV9yaW5nICpyeF9yaW5nLCB1MzIgbnVtKQoreworCXUxNiBuZXh0X3RvX3VzZTsKKwl1MzIgaTsKKwlpbnQgcmM7CisKKwluZXh0X3RvX3VzZSA9IHJ4X3JpbmctPm5leHRfdG9fdXNlOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXN0cnVjdCBlbmFfcnhfYnVmZmVyICpyeF9pbmZvID0KKwkJCSZyeF9yaW5nLT5yeF9idWZmZXJfaW5mb1tuZXh0X3RvX3VzZV07CisKKwkJcmMgPSBlbmFfYWxsb2NfcnhfcGFnZShyeF9yaW5nLCByeF9pbmZvLAorCQkJCSAgICAgICBfX0dGUF9DT0xEIHwgR0ZQX0FUT01JQyB8IF9fR0ZQX0NPTVApOworCQlpZiAodW5saWtlbHkocmMgPCAwKSkgeworCQkJbmV0aWZfd2FybihyeF9yaW5nLT5hZGFwdGVyLCByeF9lcnIsIHJ4X3JpbmctPm5ldGRldiwKKwkJCQkgICAiZmFpbGVkIHRvIGFsbG9jIGJ1ZmZlciBmb3IgcnggcXVldWUgJWRcbiIsCisJCQkJICAgcnhfcmluZy0+cWlkKTsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gZW5hX2NvbV9hZGRfc2luZ2xlX3J4X2Rlc2MocnhfcmluZy0+ZW5hX2NvbV9pb19zcSwKKwkJCQkJCSZyeF9pbmZvLT5lbmFfYnVmLAorCQkJCQkJbmV4dF90b191c2UpOworCQlpZiAodW5saWtlbHkocmMpKSB7CisJCQluZXRpZl93YXJuKHJ4X3JpbmctPmFkYXB0ZXIsIHJ4X3N0YXR1cywgcnhfcmluZy0+bmV0ZGV2LAorCQkJCSAgICJmYWlsZWQgdG8gYWRkIGJ1ZmZlciBmb3IgcnggcXVldWUgJWRcbiIsCisJCQkJICAgcnhfcmluZy0+cWlkKTsKKwkJCWJyZWFrOworCQl9CisJCW5leHRfdG9fdXNlID0gRU5BX1JYX1JJTkdfSURYX05FWFQobmV4dF90b191c2UsCisJCQkJCQkgICByeF9yaW5nLT5yaW5nX3NpemUpOworCX0KKworCWlmICh1bmxpa2VseShpIDwgbnVtKSkgeworCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9yaW5nLT5zeW5jcCk7CisJCXJ4X3JpbmctPnJ4X3N0YXRzLnJlZmlsX3BhcnRpYWwrKzsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnJ4X3JpbmctPnN5bmNwKTsKKwkJbmV0ZGV2X3dhcm4ocnhfcmluZy0+bmV0ZGV2LAorCQkJICAgICJyZWZpbGxlZCByeCBxaWQgJWQgd2l0aCBvbmx5ICVkIGJ1ZmZlcnMgKGZyb20gJWQpXG4iLAorCQkJICAgIHJ4X3JpbmctPnFpZCwgaSwgbnVtKTsKKwl9CisKKwlpZiAobGlrZWx5KGkpKSB7CisJCS8qIEFkZCBtZW1vcnkgYmFycmllciB0byBtYWtlIHN1cmUgdGhlIGRlc2Mgd2VyZSB3cml0dGVuIGJlZm9yZQorCQkgKiBpc3N1ZSBhIGRvb3JiZWxsCisJCSAqLworCQl3bWIoKTsKKwkJZW5hX2NvbV93cml0ZV9zcV9kb29yYmVsbChyeF9yaW5nLT5lbmFfY29tX2lvX3NxKTsKKwl9CisKKwlyeF9yaW5nLT5uZXh0X3RvX3VzZSA9IG5leHRfdG9fdXNlOworCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9mcmVlX3J4X2J1ZnMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLAorCQkJICAgICB1MzIgcWlkKQoreworCXN0cnVjdCBlbmFfcmluZyAqcnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nW3FpZF07CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcnhfcmluZy0+cmluZ19zaXplOyBpKyspIHsKKwkJc3RydWN0IGVuYV9yeF9idWZmZXIgKnJ4X2luZm8gPSAmcnhfcmluZy0+cnhfYnVmZmVyX2luZm9baV07CisKKwkJaWYgKHJ4X2luZm8tPnBhZ2UpCisJCQllbmFfZnJlZV9yeF9wYWdlKHJ4X3JpbmcsIHJ4X2luZm8pOworCX0KK30KKworLyogZW5hX3JlZmlsbF9hbGxfcnhfYnVmcyAtIGFsbG9jYXRlIGFsbCBxdWV1ZXMgUnggYnVmZmVycworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICovCitzdGF0aWMgdm9pZCBlbmFfcmVmaWxsX2FsbF9yeF9idWZzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZW5hX3JpbmcgKnJ4X3Jpbmc7CisJaW50IGksIHJjLCBidWZzX251bTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspIHsKKwkJcnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nW2ldOworCQlidWZzX251bSA9IHJ4X3JpbmctPnJpbmdfc2l6ZSAtIDE7CisJCXJjID0gZW5hX3JlZmlsbF9yeF9idWZzKHJ4X3JpbmcsIGJ1ZnNfbnVtKTsKKworCQlpZiAodW5saWtlbHkocmMgIT0gYnVmc19udW0pKQorCQkJbmV0aWZfd2FybihyeF9yaW5nLT5hZGFwdGVyLCByeF9zdGF0dXMsIHJ4X3JpbmctPm5ldGRldiwKKwkJCQkgICAicmVmaWxsaW5nIFF1ZXVlICVkIGZhaWxlZC4gYWxsb2NhdGVkICVkIGJ1ZmZlcnMgZnJvbTogJWRcbiIsCisJCQkJICAgaSwgcmMsIGJ1ZnNfbnVtKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9mcmVlX2FsbF9yeF9idWZzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspCisJCWVuYV9mcmVlX3J4X2J1ZnMoYWRhcHRlciwgaSk7Cit9CisKKy8qIGVuYV9mcmVlX3R4X2J1ZnMgLSBGcmVlIFR4IEJ1ZmZlcnMgcGVyIFF1ZXVlCisgKiBAdHhfcmluZzogVFggcmluZyBmb3Igd2hpY2ggYnVmZmVycyBiZSBmcmVlZAorICovCitzdGF0aWMgdm9pZCBlbmFfZnJlZV90eF9idWZzKHN0cnVjdCBlbmFfcmluZyAqdHhfcmluZykKK3sKKwl1MzIgaTsKKworCWZvciAoaSA9IDA7IGkgPCB0eF9yaW5nLT5yaW5nX3NpemU7IGkrKykgeworCQlzdHJ1Y3QgZW5hX3R4X2J1ZmZlciAqdHhfaW5mbyA9ICZ0eF9yaW5nLT50eF9idWZmZXJfaW5mb1tpXTsKKwkJc3RydWN0IGVuYV9jb21fYnVmICplbmFfYnVmOworCQlpbnQgbnJfZnJhZ3M7CisJCWludCBqOworCisJCWlmICghdHhfaW5mby0+c2tiKQorCQkJY29udGludWU7CisKKwkJbmV0ZGV2X25vdGljZSh0eF9yaW5nLT5uZXRkZXYsCisJCQkgICAgICAiZnJlZSB1bmNvbXBsZXRlZCB0eCBza2IgcWlkICVkIGlkeCAweCV4XG4iLAorCQkJICAgICAgdHhfcmluZy0+cWlkLCBpKTsKKworCQllbmFfYnVmID0gdHhfaW5mby0+YnVmczsKKwkJZG1hX3VubWFwX3NpbmdsZSh0eF9yaW5nLT5kZXYsCisJCQkJIGVuYV9idWYtPnBhZGRyLAorCQkJCSBlbmFfYnVmLT5sZW4sCisJCQkJIERNQV9UT19ERVZJQ0UpOworCisJCS8qIHVubWFwIHJlbWFpbmluZyBtYXBwZWQgcGFnZXMgKi8KKwkJbnJfZnJhZ3MgPSB0eF9pbmZvLT5udW1fb2ZfYnVmcyAtIDE7CisJCWZvciAoaiA9IDA7IGogPCBucl9mcmFnczsgaisrKSB7CisJCQllbmFfYnVmKys7CisJCQlkbWFfdW5tYXBfcGFnZSh0eF9yaW5nLT5kZXYsCisJCQkJICAgICAgIGVuYV9idWYtPnBhZGRyLAorCQkJCSAgICAgICBlbmFfYnVmLT5sZW4sCisJCQkJICAgICAgIERNQV9UT19ERVZJQ0UpOworCQl9CisKKwkJZGV2X2tmcmVlX3NrYl9hbnkodHhfaW5mby0+c2tiKTsKKwl9CisJbmV0ZGV2X3R4X3Jlc2V0X3F1ZXVlKG5ldGRldl9nZXRfdHhfcXVldWUodHhfcmluZy0+bmV0ZGV2LAorCQkJCQkJICB0eF9yaW5nLT5xaWQpKTsKK30KKworc3RhdGljIHZvaWQgZW5hX2ZyZWVfYWxsX3R4X2J1ZnMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlbmFfcmluZyAqdHhfcmluZzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspIHsKKwkJdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nW2ldOworCQllbmFfZnJlZV90eF9idWZzKHR4X3JpbmcpOworCX0KK30KKworc3RhdGljIHZvaWQgZW5hX2Rlc3Ryb3lfYWxsX3R4X3F1ZXVlcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTE2IGVuYV9xaWQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7CisJCWVuYV9xaWQgPSBFTkFfSU9fVFhRX0lEWChpKTsKKwkJZW5hX2NvbV9kZXN0cm95X2lvX3F1ZXVlKGFkYXB0ZXItPmVuYV9kZXYsIGVuYV9xaWQpOworCX0KK30KKworc3RhdGljIHZvaWQgZW5hX2Rlc3Ryb3lfYWxsX3J4X3F1ZXVlcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTE2IGVuYV9xaWQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7CisJCWVuYV9xaWQgPSBFTkFfSU9fUlhRX0lEWChpKTsKKwkJZW5hX2NvbV9kZXN0cm95X2lvX3F1ZXVlKGFkYXB0ZXItPmVuYV9kZXYsIGVuYV9xaWQpOworCX0KK30KKworc3RhdGljIHZvaWQgZW5hX2Rlc3Ryb3lfYWxsX2lvX3F1ZXVlcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJZW5hX2Rlc3Ryb3lfYWxsX3R4X3F1ZXVlcyhhZGFwdGVyKTsKKwllbmFfZGVzdHJveV9hbGxfcnhfcXVldWVzKGFkYXB0ZXIpOworfQorCitzdGF0aWMgaW50IHZhbGlkYXRlX3R4X3JlcV9pZChzdHJ1Y3QgZW5hX3JpbmcgKnR4X3JpbmcsIHUxNiByZXFfaWQpCit7CisJc3RydWN0IGVuYV90eF9idWZmZXIgKnR4X2luZm8gPSBOVUxMOworCisJaWYgKGxpa2VseShyZXFfaWQgPCB0eF9yaW5nLT5yaW5nX3NpemUpKSB7CisJCXR4X2luZm8gPSAmdHhfcmluZy0+dHhfYnVmZmVyX2luZm9bcmVxX2lkXTsKKwkJaWYgKGxpa2VseSh0eF9pbmZvLT5za2IpKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKHR4X2luZm8pCisJCW5ldGlmX2Vycih0eF9yaW5nLT5hZGFwdGVyLCB0eF9kb25lLCB0eF9yaW5nLT5uZXRkZXYsCisJCQkgICJ0eF9pbmZvIGRvZXNuJ3QgaGF2ZSB2YWxpZCBza2JcbiIpOworCWVsc2UKKwkJbmV0aWZfZXJyKHR4X3JpbmctPmFkYXB0ZXIsIHR4X2RvbmUsIHR4X3JpbmctPm5ldGRldiwKKwkJCSAgIkludmFsaWQgcmVxX2lkOiAlaHVcbiIsIHJlcV9pZCk7CisKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZ0eF9yaW5nLT5zeW5jcCk7CisJdHhfcmluZy0+dHhfc3RhdHMuYmFkX3JlcV9pZCsrOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZ0eF9yaW5nLT5zeW5jcCk7CisKKwkvKiBUcmlnZ2VyIGRldmljZSByZXNldCAqLworCXNldF9iaXQoRU5BX0ZMQUdfVFJJR0dFUl9SRVNFVCwgJnR4X3JpbmctPmFkYXB0ZXItPmZsYWdzKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworc3RhdGljIGludCBlbmFfY2xlYW5fdHhfaXJxKHN0cnVjdCBlbmFfcmluZyAqdHhfcmluZywgdTMyIGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHE7CisJYm9vbCBhYm92ZV90aHJlc2g7CisJdTMyIHR4X2J5dGVzID0gMDsKKwl1MzIgdG90YWxfZG9uZSA9IDA7CisJdTE2IG5leHRfdG9fY2xlYW47CisJdTE2IHJlcV9pZDsKKwlpbnQgdHhfcGt0cyA9IDA7CisJaW50IHJjOworCisJbmV4dF90b19jbGVhbiA9IHR4X3JpbmctPm5leHRfdG9fY2xlYW47CisJdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZSh0eF9yaW5nLT5uZXRkZXYsIHR4X3JpbmctPnFpZCk7CisKKwl3aGlsZSAodHhfcGt0cyA8IGJ1ZGdldCkgeworCQlzdHJ1Y3QgZW5hX3R4X2J1ZmZlciAqdHhfaW5mbzsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJc3RydWN0IGVuYV9jb21fYnVmICplbmFfYnVmOworCQlpbnQgaSwgbnJfZnJhZ3M7CisKKwkJcmMgPSBlbmFfY29tX3R4X2NvbXBfcmVxX2lkX2dldCh0eF9yaW5nLT5lbmFfY29tX2lvX2NxLAorCQkJCQkJJnJlcV9pZCk7CisJCWlmIChyYykKKwkJCWJyZWFrOworCisJCXJjID0gdmFsaWRhdGVfdHhfcmVxX2lkKHR4X3JpbmcsIHJlcV9pZCk7CisJCWlmIChyYykKKwkJCWJyZWFrOworCisJCXR4X2luZm8gPSAmdHhfcmluZy0+dHhfYnVmZmVyX2luZm9bcmVxX2lkXTsKKwkJc2tiID0gdHhfaW5mby0+c2tiOworCisJCS8qIHByZWZldGNoIHNrYl9lbmRfcG9pbnRlcigpIHRvIHNwZWVkdXAgc2tiX3NoaW5mbyhza2IpICovCisJCXByZWZldGNoKCZza2ItPmVuZCk7CisKKwkJdHhfaW5mby0+c2tiID0gTlVMTDsKKwkJdHhfaW5mby0+bGFzdF9qaWZmaWVzID0gMDsKKworCQlpZiAobGlrZWx5KHR4X2luZm8tPm51bV9vZl9idWZzICE9IDApKSB7CisJCQllbmFfYnVmID0gdHhfaW5mby0+YnVmczsKKworCQkJZG1hX3VubWFwX3NpbmdsZSh0eF9yaW5nLT5kZXYsCisJCQkJCSBkbWFfdW5tYXBfYWRkcihlbmFfYnVmLCBwYWRkciksCisJCQkJCSBkbWFfdW5tYXBfbGVuKGVuYV9idWYsIGxlbiksCisJCQkJCSBETUFfVE9fREVWSUNFKTsKKworCQkJLyogdW5tYXAgcmVtYWluaW5nIG1hcHBlZCBwYWdlcyAqLworCQkJbnJfZnJhZ3MgPSB0eF9pbmZvLT5udW1fb2ZfYnVmcyAtIDE7CisJCQlmb3IgKGkgPSAwOyBpIDwgbnJfZnJhZ3M7IGkrKykgeworCQkJCWVuYV9idWYrKzsKKwkJCQlkbWFfdW5tYXBfcGFnZSh0eF9yaW5nLT5kZXYsCisJCQkJCSAgICAgICBkbWFfdW5tYXBfYWRkcihlbmFfYnVmLCBwYWRkciksCisJCQkJCSAgICAgICBkbWFfdW5tYXBfbGVuKGVuYV9idWYsIGxlbiksCisJCQkJCSAgICAgICBETUFfVE9fREVWSUNFKTsKKwkJCX0KKwkJfQorCisJCW5ldGlmX2RiZyh0eF9yaW5nLT5hZGFwdGVyLCB0eF9kb25lLCB0eF9yaW5nLT5uZXRkZXYsCisJCQkgICJ0eF9wb2xsOiBxICVkIHNrYiAlcCBjb21wbGV0ZWRcbiIsIHR4X3JpbmctPnFpZCwKKwkJCSAgc2tiKTsKKworCQl0eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQl0eF9wa3RzKys7CisJCXRvdGFsX2RvbmUgKz0gdHhfaW5mby0+dHhfZGVzY3M7CisKKwkJdHhfcmluZy0+ZnJlZV90eF9pZHNbbmV4dF90b19jbGVhbl0gPSByZXFfaWQ7CisJCW5leHRfdG9fY2xlYW4gPSBFTkFfVFhfUklOR19JRFhfTkVYVChuZXh0X3RvX2NsZWFuLAorCQkJCQkJICAgICB0eF9yaW5nLT5yaW5nX3NpemUpOworCX0KKworCXR4X3JpbmctPm5leHRfdG9fY2xlYW4gPSBuZXh0X3RvX2NsZWFuOworCWVuYV9jb21fY29tcF9hY2sodHhfcmluZy0+ZW5hX2NvbV9pb19zcSwgdG90YWxfZG9uZSk7CisJZW5hX2NvbV91cGRhdGVfZGV2X2NvbXBfaGVhZCh0eF9yaW5nLT5lbmFfY29tX2lvX2NxKTsKKworCW5ldGRldl90eF9jb21wbGV0ZWRfcXVldWUodHhxLCB0eF9wa3RzLCB0eF9ieXRlcyk7CisKKwluZXRpZl9kYmcodHhfcmluZy0+YWRhcHRlciwgdHhfZG9uZSwgdHhfcmluZy0+bmV0ZGV2LAorCQkgICJ0eF9wb2xsOiBxICVkIGRvbmUuIHRvdGFsIHBrdHM6ICVkXG4iLAorCQkgIHR4X3JpbmctPnFpZCwgdHhfcGt0cyk7CisKKwkvKiBuZWVkIHRvIG1ha2UgdGhlIHJpbmdzIGNpcmN1bGFyIHVwZGF0ZSB2aXNpYmxlIHRvCisJICogZW5hX3N0YXJ0X3htaXQoKSBiZWZvcmUgY2hlY2tpbmcgZm9yIG5ldGlmX3F1ZXVlX3N0b3BwZWQoKS4KKwkgKi8KKwlzbXBfbWIoKTsKKworCWFib3ZlX3RocmVzaCA9IGVuYV9jb21fc3FfZW1wdHlfc3BhY2UodHhfcmluZy0+ZW5hX2NvbV9pb19zcSkgPgorCQlFTkFfVFhfV0FLRVVQX1RIUkVTSDsKKwlpZiAodW5saWtlbHkobmV0aWZfdHhfcXVldWVfc3RvcHBlZCh0eHEpICYmIGFib3ZlX3RocmVzaCkpIHsKKwkJX19uZXRpZl90eF9sb2NrKHR4cSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwkJYWJvdmVfdGhyZXNoID0gZW5hX2NvbV9zcV9lbXB0eV9zcGFjZSh0eF9yaW5nLT5lbmFfY29tX2lvX3NxKSA+CisJCQlFTkFfVFhfV0FLRVVQX1RIUkVTSDsKKwkJaWYgKG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQodHhxKSAmJiBhYm92ZV90aHJlc2gpIHsKKwkJCW5ldGlmX3R4X3dha2VfcXVldWUodHhxKTsKKwkJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnR4X3JpbmctPnN5bmNwKTsKKwkJCXR4X3JpbmctPnR4X3N0YXRzLnF1ZXVlX3dha2V1cCsrOworCQkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnR4X3JpbmctPnN5bmNwKTsKKwkJfQorCQlfX25ldGlmX3R4X3VubG9jayh0eHEpOworCX0KKworCXR4X3JpbmctPnBlcl9uYXBpX2J5dGVzICs9IHR4X2J5dGVzOworCXR4X3JpbmctPnBlcl9uYXBpX3BhY2tldHMgKz0gdHhfcGt0czsKKworCXJldHVybiB0eF9wa3RzOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmVuYV9yeF9za2Ioc3RydWN0IGVuYV9yaW5nICpyeF9yaW5nLAorCQkJCSAgc3RydWN0IGVuYV9jb21fcnhfYnVmX2luZm8gKmVuYV9idWZzLAorCQkJCSAgdTMyIGRlc2NzLAorCQkJCSAgdTE2ICpuZXh0X3RvX2NsZWFuKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGVuYV9yeF9idWZmZXIgKnJ4X2luZm8gPQorCQkmcnhfcmluZy0+cnhfYnVmZmVyX2luZm9bKm5leHRfdG9fY2xlYW5dOworCXUzMiBsZW47CisJdTMyIGJ1ZiA9IDA7CisJdm9pZCAqdmE7CisKKwlsZW4gPSBlbmFfYnVmc1swXS5sZW47CisJaWYgKHVubGlrZWx5KCFyeF9pbmZvLT5wYWdlKSkgeworCQluZXRpZl9lcnIocnhfcmluZy0+YWRhcHRlciwgcnhfZXJyLCByeF9yaW5nLT5uZXRkZXYsCisJCQkgICJQYWdlIGlzIE5VTExcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwluZXRpZl9kYmcocnhfcmluZy0+YWRhcHRlciwgcnhfc3RhdHVzLCByeF9yaW5nLT5uZXRkZXYsCisJCSAgInJ4X2luZm8gJXAgcGFnZSAlcFxuIiwKKwkJICByeF9pbmZvLCByeF9pbmZvLT5wYWdlKTsKKworCS8qIHNhdmUgdmlydCBhZGRyZXNzIG9mIGZpcnN0IGJ1ZmZlciAqLworCXZhID0gcGFnZV9hZGRyZXNzKHJ4X2luZm8tPnBhZ2UpICsgcnhfaW5mby0+cGFnZV9vZmZzZXQ7CisJcHJlZmV0Y2godmEgKyBORVRfSVBfQUxJR04pOworCisJaWYgKGxlbiA8PSByeF9yaW5nLT5yeF9jb3B5YnJlYWspIHsKKwkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbihyeF9yaW5nLT5uZXRkZXYsCisJCQkJCQlyeF9yaW5nLT5yeF9jb3B5YnJlYWspOworCQlpZiAodW5saWtlbHkoIXNrYikpIHsKKwkJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnJ4X3JpbmctPnN5bmNwKTsKKwkJCXJ4X3JpbmctPnJ4X3N0YXRzLnNrYl9hbGxvY19mYWlsKys7CisJCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcnhfcmluZy0+c3luY3ApOworCQkJbmV0aWZfZXJyKHJ4X3JpbmctPmFkYXB0ZXIsIHJ4X2VyciwgcnhfcmluZy0+bmV0ZGV2LAorCQkJCSAgIkZhaWxlZCB0byBhbGxvY2F0ZSBza2JcbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQluZXRpZl9kYmcocnhfcmluZy0+YWRhcHRlciwgcnhfc3RhdHVzLCByeF9yaW5nLT5uZXRkZXYsCisJCQkgICJyeCBhbGxvY2F0ZWQgc21hbGwgcGFja2V0LiBsZW4gJWQuIGRhdGFfbGVuICVkXG4iLAorCQkJICBza2ItPmxlbiwgc2tiLT5kYXRhX2xlbik7CisKKwkJLyogc3luYyB0aGlzIGJ1ZmZlciBmb3IgQ1BVIHVzZSAqLworCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShyeF9yaW5nLT5kZXYsCisJCQkJCWRtYV91bm1hcF9hZGRyKCZyeF9pbmZvLT5lbmFfYnVmLCBwYWRkciksCisJCQkJCWxlbiwKKwkJCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCB2YSwgbGVuKTsKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UocnhfcmluZy0+ZGV2LAorCQkJCQkgICBkbWFfdW5tYXBfYWRkcigmcnhfaW5mby0+ZW5hX2J1ZiwgcGFkZHIpLAorCQkJCQkgICBsZW4sCisJCQkJCSAgIERNQV9GUk9NX0RFVklDRSk7CisKKwkJc2tiX3B1dChza2IsIGxlbik7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHJ4X3JpbmctPm5ldGRldik7CisJCSpuZXh0X3RvX2NsZWFuID0gRU5BX1JYX1JJTkdfSURYX0FERCgqbmV4dF90b19jbGVhbiwgZGVzY3MsCisJCQkJCQkgICAgIHJ4X3JpbmctPnJpbmdfc2l6ZSk7CisJCXJldHVybiBza2I7CisJfQorCisJc2tiID0gbmFwaV9nZXRfZnJhZ3MocnhfcmluZy0+bmFwaSk7CisJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCW5ldGlmX2RiZyhyeF9yaW5nLT5hZGFwdGVyLCByeF9zdGF0dXMsIHJ4X3JpbmctPm5ldGRldiwKKwkJCSAgIkZhaWxlZCBhbGxvY2F0aW5nIHNrYlxuIik7CisJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnJ4X3JpbmctPnN5bmNwKTsKKwkJcnhfcmluZy0+cnhfc3RhdHMuc2tiX2FsbG9jX2ZhaWwrKzsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnJ4X3JpbmctPnN5bmNwKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZG8geworCQlkbWFfdW5tYXBfcGFnZShyeF9yaW5nLT5kZXYsCisJCQkgICAgICAgZG1hX3VubWFwX2FkZHIoJnJ4X2luZm8tPmVuYV9idWYsIHBhZGRyKSwKKwkJCSAgICAgICBQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisKKwkJc2tiX2FkZF9yeF9mcmFnKHNrYiwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncywgcnhfaW5mby0+cGFnZSwKKwkJCQlyeF9pbmZvLT5wYWdlX29mZnNldCwgbGVuLCBQQUdFX1NJWkUpOworCisJCW5ldGlmX2RiZyhyeF9yaW5nLT5hZGFwdGVyLCByeF9zdGF0dXMsIHJ4X3JpbmctPm5ldGRldiwKKwkJCSAgInJ4IHNrYiB1cGRhdGVkLiBsZW4gJWQuIGRhdGFfbGVuICVkXG4iLAorCQkJICBza2ItPmxlbiwgc2tiLT5kYXRhX2xlbik7CisKKwkJcnhfaW5mby0+cGFnZSA9IE5VTEw7CisJCSpuZXh0X3RvX2NsZWFuID0KKwkJCUVOQV9SWF9SSU5HX0lEWF9ORVhUKCpuZXh0X3RvX2NsZWFuLAorCQkJCQkgICAgIHJ4X3JpbmctPnJpbmdfc2l6ZSk7CisJCWlmIChsaWtlbHkoLS1kZXNjcyA9PSAwKSkKKwkJCWJyZWFrOworCQlyeF9pbmZvID0gJnJ4X3JpbmctPnJ4X2J1ZmZlcl9pbmZvWypuZXh0X3RvX2NsZWFuXTsKKwkJbGVuID0gZW5hX2J1ZnNbKytidWZdLmxlbjsKKwl9IHdoaWxlICgxKTsKKworCXJldHVybiBza2I7Cit9CisKKy8qIGVuYV9yeF9jaGVja3N1bSAtIGluZGljYXRlIGluIHNrYiBpZiBodyBpbmRpY2F0ZWQgYSBnb29kIGNrc3VtCisgKiBAYWRhcHRlcjogc3RydWN0dXJlIGNvbnRhaW5pbmcgYWRhcHRlciBzcGVjaWZpYyBkYXRhCisgKiBAZW5hX3J4X2N0eDogcmVjZWl2ZWQgcGFja2V0IGNvbnRleHQvbWV0YWRhdGEKKyAqIEBza2I6IHNrYiBjdXJyZW50bHkgYmVpbmcgcmVjZWl2ZWQgYW5kIG1vZGlmaWVkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFfcnhfY2hlY2tzdW0oc3RydWN0IGVuYV9yaW5nICpyeF9yaW5nLAorCQkJCSAgIHN0cnVjdCBlbmFfY29tX3J4X2N0eCAqZW5hX3J4X2N0eCwKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIFJ4IGNzdW0gZGlzYWJsZWQgKi8KKwlpZiAodW5saWtlbHkoIShyeF9yaW5nLT5uZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU0pKSkgeworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCXJldHVybjsKKwl9CisKKwkvKiBGb3IgZnJhZ21lbnRlZCBwYWNrZXRzIHRoZSBjaGVja3N1bSBpc24ndCB2YWxpZCAqLworCWlmIChlbmFfcnhfY3R4LT5mcmFnKSB7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJcmV0dXJuOworCX0KKworCS8qIGlmIElQIGFuZCBlcnJvciAqLworCWlmICh1bmxpa2VseSgoZW5hX3J4X2N0eC0+bDNfcHJvdG8gPT0gRU5BX0VUSF9JT19MM19QUk9UT19JUFY0KSAmJgorCQkgICAgIChlbmFfcnhfY3R4LT5sM19jc3VtX2VycikpKSB7CisJCS8qIGlwdjQgY2hlY2tzdW0gZXJyb3IgKi8KKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9yaW5nLT5zeW5jcCk7CisJCXJ4X3JpbmctPnJ4X3N0YXRzLmJhZF9jc3VtKys7CisJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZyeF9yaW5nLT5zeW5jcCk7CisJCW5ldGlmX2VycihyeF9yaW5nLT5hZGFwdGVyLCByeF9lcnIsIHJ4X3JpbmctPm5ldGRldiwKKwkJCSAgIlJYIElQdjQgaGVhZGVyIGNoZWNrc3VtIGVycm9yXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGlmIFRDUC9VRFAgKi8KKwlpZiAobGlrZWx5KChlbmFfcnhfY3R4LT5sNF9wcm90byA9PSBFTkFfRVRIX0lPX0w0X1BST1RPX1RDUCkgfHwKKwkJICAgKGVuYV9yeF9jdHgtPmw0X3Byb3RvID09IEVOQV9FVEhfSU9fTDRfUFJPVE9fVURQKSkpIHsKKwkJaWYgKHVubGlrZWx5KGVuYV9yeF9jdHgtPmw0X2NzdW1fZXJyKSkgeworCQkJLyogVENQL1VEUCBjaGVja3N1bSBlcnJvciAqLworCQkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcnhfcmluZy0+c3luY3ApOworCQkJcnhfcmluZy0+cnhfc3RhdHMuYmFkX2NzdW0rKzsKKwkJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZyeF9yaW5nLT5zeW5jcCk7CisJCQluZXRpZl9lcnIocnhfcmluZy0+YWRhcHRlciwgcnhfZXJyLCByeF9yaW5nLT5uZXRkZXYsCisJCQkJICAiUlggTDQgY2hlY2tzdW0gZXJyb3JcbiIpOworCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQkJcmV0dXJuOworCQl9CisKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9zZXRfcnhfaGFzaChzdHJ1Y3QgZW5hX3JpbmcgKnJ4X3JpbmcsCisJCQkgICAgc3RydWN0IGVuYV9jb21fcnhfY3R4ICplbmFfcnhfY3R4LAorCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJZW51bSBwa3RfaGFzaF90eXBlcyBoYXNoX3R5cGU7CisKKwlpZiAobGlrZWx5KHJ4X3JpbmctPm5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1JYSEFTSCkpIHsKKwkJaWYgKGxpa2VseSgoZW5hX3J4X2N0eC0+bDRfcHJvdG8gPT0gRU5BX0VUSF9JT19MNF9QUk9UT19UQ1ApIHx8CisJCQkgICAoZW5hX3J4X2N0eC0+bDRfcHJvdG8gPT0gRU5BX0VUSF9JT19MNF9QUk9UT19VRFApKSkKKworCQkJaGFzaF90eXBlID0gUEtUX0hBU0hfVFlQRV9MNDsKKwkJZWxzZQorCQkJaGFzaF90eXBlID0gUEtUX0hBU0hfVFlQRV9OT05FOworCisJCS8qIE92ZXJyaWRlIGhhc2ggdHlwZSBpZiB0aGUgcGFja2V0IGlzIGZyYWdtZW50ZWQgKi8KKwkJaWYgKGVuYV9yeF9jdHgtPmZyYWcpCisJCQloYXNoX3R5cGUgPSBQS1RfSEFTSF9UWVBFX05PTkU7CisKKwkJc2tiX3NldF9oYXNoKHNrYiwgZW5hX3J4X2N0eC0+aGFzaCwgaGFzaF90eXBlKTsKKwl9Cit9CisKKy8qIGVuYV9jbGVhbl9yeF9pcnEgLSBDbGVhbnVwIFJYIGlycQorICogQHJ4X3Jpbmc6IFJYIHJpbmcgdG8gY2xlYW4KKyAqIEBuYXBpOiBuYXBpIGhhbmRsZXIKKyAqIEBidWRnZXQ6IGhvdyBtYW55IHBhY2tldHMgZHJpdmVyIGlzIGFsbG93ZWQgdG8gY2xlYW4KKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2xlYW5lZCBidWZmZXJzLgorICovCitzdGF0aWMgaW50IGVuYV9jbGVhbl9yeF9pcnEoc3RydWN0IGVuYV9yaW5nICpyeF9yaW5nLCBzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksCisJCQkgICAgdTMyIGJ1ZGdldCkKK3sKKwl1MTYgbmV4dF90b19jbGVhbiA9IHJ4X3JpbmctPm5leHRfdG9fY2xlYW47CisJdTMyIHJlc19idWRnZXQsIHdvcmtfZG9uZTsKKworCXN0cnVjdCBlbmFfY29tX3J4X2N0eCBlbmFfcnhfY3R4OworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCByZWZpbGxfcmVxdWlyZWQ7CisJaW50IHJlZmlsbF90aHJlc2hvbGQ7CisJaW50IHJjID0gMDsKKwlpbnQgdG90YWxfbGVuID0gMDsKKwlpbnQgcnhfY29weWJyZWFrX3BrdCA9IDA7CisKKwluZXRpZl9kYmcocnhfcmluZy0+YWRhcHRlciwgcnhfc3RhdHVzLCByeF9yaW5nLT5uZXRkZXYsCisJCSAgIiVzIHFpZCAlZFxuIiwgX19mdW5jX18sIHJ4X3JpbmctPnFpZCk7CisJcmVzX2J1ZGdldCA9IGJ1ZGdldDsKKworCWRvIHsKKwkJZW5hX3J4X2N0eC5lbmFfYnVmcyA9IHJ4X3JpbmctPmVuYV9idWZzOworCQllbmFfcnhfY3R4Lm1heF9idWZzID0gcnhfcmluZy0+c2dsX3NpemU7CisJCWVuYV9yeF9jdHguZGVzY3MgPSAwOworCQlyYyA9IGVuYV9jb21fcnhfcGt0KHJ4X3JpbmctPmVuYV9jb21faW9fY3EsCisJCQkJICAgIHJ4X3JpbmctPmVuYV9jb21faW9fc3EsCisJCQkJICAgICZlbmFfcnhfY3R4KTsKKwkJaWYgKHVubGlrZWx5KHJjKSkKKwkJCWdvdG8gZXJyb3I7CisKKwkJaWYgKHVubGlrZWx5KGVuYV9yeF9jdHguZGVzY3MgPT0gMCkpCisJCQlicmVhazsKKworCQluZXRpZl9kYmcocnhfcmluZy0+YWRhcHRlciwgcnhfc3RhdHVzLCByeF9yaW5nLT5uZXRkZXYsCisJCQkgICJyeF9wb2xsOiBxICVkIGdvdCBwYWNrZXQgZnJvbSBlbmEuIGRlc2NzICM6ICVkIGwzIHByb3RvICVkIGw0IHByb3RvICVkIGhhc2g6ICV4XG4iLAorCQkJICByeF9yaW5nLT5xaWQsIGVuYV9yeF9jdHguZGVzY3MsIGVuYV9yeF9jdHgubDNfcHJvdG8sCisJCQkgIGVuYV9yeF9jdHgubDRfcHJvdG8sIGVuYV9yeF9jdHguaGFzaCk7CisKKwkJLyogYWxsb2NhdGUgc2tiIGFuZCBmaWxsIGl0ICovCisJCXNrYiA9IGVuYV9yeF9za2IocnhfcmluZywgcnhfcmluZy0+ZW5hX2J1ZnMsIGVuYV9yeF9jdHguZGVzY3MsCisJCQkJICZuZXh0X3RvX2NsZWFuKTsKKworCQkvKiBleGl0IGlmIHdlIGZhaWxlZCB0byByZXRyaWV2ZSBhIGJ1ZmZlciAqLworCQlpZiAodW5saWtlbHkoIXNrYikpIHsKKwkJCW5leHRfdG9fY2xlYW4gPSBFTkFfUlhfUklOR19JRFhfQUREKG5leHRfdG9fY2xlYW4sCisJCQkJCQkJICAgIGVuYV9yeF9jdHguZGVzY3MsCisJCQkJCQkJICAgIHJ4X3JpbmctPnJpbmdfc2l6ZSk7CisJCQlicmVhazsKKwkJfQorCisJCWVuYV9yeF9jaGVja3N1bShyeF9yaW5nLCAmZW5hX3J4X2N0eCwgc2tiKTsKKworCQllbmFfc2V0X3J4X2hhc2gocnhfcmluZywgJmVuYV9yeF9jdHgsIHNrYik7CisKKwkJc2tiX3JlY29yZF9yeF9xdWV1ZShza2IsIHJ4X3JpbmctPnFpZCk7CisKKwkJaWYgKHJ4X3JpbmctPmVuYV9idWZzWzBdLmxlbiA8PSByeF9yaW5nLT5yeF9jb3B5YnJlYWspIHsKKwkJCXRvdGFsX2xlbiArPSByeF9yaW5nLT5lbmFfYnVmc1swXS5sZW47CisJCQlyeF9jb3B5YnJlYWtfcGt0Kys7CisJCQluYXBpX2dyb19yZWNlaXZlKG5hcGksIHNrYik7CisJCX0gZWxzZSB7CisJCQl0b3RhbF9sZW4gKz0gc2tiLT5sZW47CisJCQluYXBpX2dyb19mcmFncyhuYXBpKTsKKwkJfQorCisJCXJlc19idWRnZXQtLTsKKwl9IHdoaWxlIChsaWtlbHkocmVzX2J1ZGdldCkpOworCisJd29ya19kb25lID0gYnVkZ2V0IC0gcmVzX2J1ZGdldDsKKwlyeF9yaW5nLT5wZXJfbmFwaV9ieXRlcyArPSB0b3RhbF9sZW47CisJcnhfcmluZy0+cGVyX25hcGlfcGFja2V0cyArPSB3b3JrX2RvbmU7CisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcnhfcmluZy0+c3luY3ApOworCXJ4X3JpbmctPnJ4X3N0YXRzLmJ5dGVzICs9IHRvdGFsX2xlbjsKKwlyeF9yaW5nLT5yeF9zdGF0cy5jbnQgKz0gd29ya19kb25lOworCXJ4X3JpbmctPnJ4X3N0YXRzLnJ4X2NvcHlicmVha19wa3QgKz0gcnhfY29weWJyZWFrX3BrdDsKKwl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcnhfcmluZy0+c3luY3ApOworCisJcnhfcmluZy0+bmV4dF90b19jbGVhbiA9IG5leHRfdG9fY2xlYW47CisKKwlyZWZpbGxfcmVxdWlyZWQgPSBlbmFfY29tX3NxX2VtcHR5X3NwYWNlKHJ4X3JpbmctPmVuYV9jb21faW9fc3EpOworCXJlZmlsbF90aHJlc2hvbGQgPSByeF9yaW5nLT5yaW5nX3NpemUgLyBFTkFfUlhfUkVGSUxMX1RIUkVTSF9ESVZJREVSOworCisJLyogT3B0aW1pemF0aW9uLCB0cnkgdG8gYmF0Y2ggbmV3IHJ4IGJ1ZmZlcnMgKi8KKwlpZiAocmVmaWxsX3JlcXVpcmVkID4gcmVmaWxsX3RocmVzaG9sZCkgeworCQllbmFfY29tX3VwZGF0ZV9kZXZfY29tcF9oZWFkKHJ4X3JpbmctPmVuYV9jb21faW9fY3EpOworCQllbmFfcmVmaWxsX3J4X2J1ZnMocnhfcmluZywgcmVmaWxsX3JlcXVpcmVkKTsKKwl9CisKKwlyZXR1cm4gd29ya19kb25lOworCitlcnJvcjoKKwlhZGFwdGVyID0gbmV0ZGV2X3ByaXYocnhfcmluZy0+bmV0ZGV2KTsKKworCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnJ4X3JpbmctPnN5bmNwKTsKKwlyeF9yaW5nLT5yeF9zdGF0cy5iYWRfZGVzY19udW0rKzsKKwl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcnhfcmluZy0+c3luY3ApOworCisJLyogVG9vIG1hbnkgZGVzYyBmcm9tIHRoZSBkZXZpY2UuIFRyaWdnZXIgcmVzZXQgKi8KKwlzZXRfYml0KEVOQV9GTEFHX1RSSUdHRVJfUkVTRVQsICZhZGFwdGVyLT5mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworaW5saW5lIHZvaWQgZW5hX2FkanVzdF9pbnRyX21vZGVyYXRpb24oc3RydWN0IGVuYV9yaW5nICpyeF9yaW5nLAorCQkJCSAgICAgICBzdHJ1Y3QgZW5hX3JpbmcgKnR4X3JpbmcpCit7CisJLyogV2UgYXBwbHkgYWRhcHRpdmUgbW9kZXJhdGlvbiBvbiBSeCBwYXRoIG9ubHkuCisJICogVHggdXNlcyBzdGF0aWMgaW50ZXJydXB0IG1vZGVyYXRpb24uCisJICovCisJZW5hX2NvbV9jYWxjdWxhdGVfaW50ZXJydXB0X2RlbGF5KHJ4X3JpbmctPmVuYV9kZXYsCisJCQkJCSAgcnhfcmluZy0+cGVyX25hcGlfcGFja2V0cywKKwkJCQkJICByeF9yaW5nLT5wZXJfbmFwaV9ieXRlcywKKwkJCQkJICAmcnhfcmluZy0+c21vb3RoZWRfaW50ZXJ2YWwsCisJCQkJCSAgJnJ4X3JpbmctPm1vZGVyX3RibF9pZHgpOworCisJLyogUmVzZXQgcGVyIG5hcGkgcGFja2V0cy9ieXRlcyAqLworCXR4X3JpbmctPnBlcl9uYXBpX3BhY2tldHMgPSAwOworCXR4X3JpbmctPnBlcl9uYXBpX2J5dGVzID0gMDsKKwlyeF9yaW5nLT5wZXJfbmFwaV9wYWNrZXRzID0gMDsKKwlyeF9yaW5nLT5wZXJfbmFwaV9ieXRlcyA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFfdXBkYXRlX3JpbmdfbnVtYV9ub2RlKHN0cnVjdCBlbmFfcmluZyAqdHhfcmluZywKKwkJCQkJICAgICBzdHJ1Y3QgZW5hX3JpbmcgKnJ4X3JpbmcpCit7CisJaW50IGNwdSA9IGdldF9jcHUoKTsKKwlpbnQgbnVtYV9ub2RlOworCisJLyogQ2hlY2sgb25seSBvbmUgcmluZyBzaW5jZSB0aGUgMiByaW5ncyBhcmUgcnVubmluZyBvbiB0aGUgc2FtZSBjcHUgKi8KKwlpZiAobGlrZWx5KHR4X3JpbmctPmNwdSA9PSBjcHUpKQorCQlnb3RvIG91dDsKKworCW51bWFfbm9kZSA9IGNwdV90b19ub2RlKGNwdSk7CisJcHV0X2NwdSgpOworCisJaWYgKG51bWFfbm9kZSAhPSBOVU1BX05PX05PREUpIHsKKwkJZW5hX2NvbV91cGRhdGVfbnVtYV9ub2RlKHR4X3JpbmctPmVuYV9jb21faW9fY3EsIG51bWFfbm9kZSk7CisJCWVuYV9jb21fdXBkYXRlX251bWFfbm9kZShyeF9yaW5nLT5lbmFfY29tX2lvX2NxLCBudW1hX25vZGUpOworCX0KKworCXR4X3JpbmctPmNwdSA9IGNwdTsKKwlyeF9yaW5nLT5jcHUgPSBjcHU7CisKKwlyZXR1cm47CitvdXQ6CisJcHV0X2NwdSgpOworfQorCitzdGF0aWMgaW50IGVuYV9pb19wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgZW5hX25hcGkgKmVuYV9uYXBpID0gY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBlbmFfbmFwaSwgbmFwaSk7CisJc3RydWN0IGVuYV9yaW5nICp0eF9yaW5nLCAqcnhfcmluZzsKKwlzdHJ1Y3QgZW5hX2V0aF9pb19pbnRyX3JlZyBpbnRyX3JlZzsKKworCXUzMiB0eF93b3JrX2RvbmU7CisJdTMyIHJ4X3dvcmtfZG9uZTsKKwlpbnQgdHhfYnVkZ2V0OworCWludCBuYXBpX2NvbXBfY2FsbCA9IDA7CisJaW50IHJldDsKKworCXR4X3JpbmcgPSBlbmFfbmFwaS0+dHhfcmluZzsKKwlyeF9yaW5nID0gZW5hX25hcGktPnJ4X3Jpbmc7CisKKwl0eF9idWRnZXQgPSB0eF9yaW5nLT5yaW5nX3NpemUgLyBFTkFfVFhfUE9MTF9CVURHRVRfRElWSURFUjsKKworCWlmICghdGVzdF9iaXQoRU5BX0ZMQUdfREVWX1VQLCAmdHhfcmluZy0+YWRhcHRlci0+ZmxhZ3MpKSB7CisJCW5hcGlfY29tcGxldGVfZG9uZShuYXBpLCAwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdHhfd29ya19kb25lID0gZW5hX2NsZWFuX3R4X2lycSh0eF9yaW5nLCB0eF9idWRnZXQpOworCXJ4X3dvcmtfZG9uZSA9IGVuYV9jbGVhbl9yeF9pcnEocnhfcmluZywgbmFwaSwgYnVkZ2V0KTsKKworCWlmICgoYnVkZ2V0ID4gcnhfd29ya19kb25lKSAmJiAodHhfYnVkZ2V0ID4gdHhfd29ya19kb25lKSkgeworCQluYXBpX2NvbXBsZXRlX2RvbmUobmFwaSwgcnhfd29ya19kb25lKTsKKworCQluYXBpX2NvbXBfY2FsbCA9IDE7CisJCS8qIFR4IGFuZCBSeCBzaGFyZSB0aGUgc2FtZSBpbnRlcnJ1cHQgdmVjdG9yICovCisJCWlmIChlbmFfY29tX2dldF9hZGFwdGl2ZV9tb2RlcmF0aW9uX2VuYWJsZWQocnhfcmluZy0+ZW5hX2RldikpCisJCQllbmFfYWRqdXN0X2ludHJfbW9kZXJhdGlvbihyeF9yaW5nLCB0eF9yaW5nKTsKKworCQkvKiBVcGRhdGUgaW50ciByZWdpc3RlcjogcnggaW50ciBkZWxheSwgdHggaW50ciBkZWxheSBhbmQKKwkJICogaW50ZXJydXB0IHVubWFzaworCQkgKi8KKwkJZW5hX2NvbV91cGRhdGVfaW50cl9yZWcoJmludHJfcmVnLAorCQkJCQlyeF9yaW5nLT5zbW9vdGhlZF9pbnRlcnZhbCwKKwkJCQkJdHhfcmluZy0+c21vb3RoZWRfaW50ZXJ2YWwsCisJCQkJCXRydWUpOworCisJCS8qIEl0IGlzIGEgc2hhcmVkIE1TSS1YLiBUeCBhbmQgUnggQ1EgaGF2ZSBwb2ludGVyIHRvIGl0LgorCQkgKiBTbyB3ZSB1c2Ugb25lIG9mIHRoZW0gdG8gcmVhY2ggdGhlIGludHIgcmVnCisJCSAqLworCQllbmFfY29tX3VubWFza19pbnRyKHJ4X3JpbmctPmVuYV9jb21faW9fY3EsICZpbnRyX3JlZyk7CisKKwkJZW5hX3VwZGF0ZV9yaW5nX251bWFfbm9kZSh0eF9yaW5nLCByeF9yaW5nKTsKKworCQlyZXQgPSByeF93b3JrX2RvbmU7CisJfSBlbHNlIHsKKwkJcmV0ID0gYnVkZ2V0OworCX0KKworCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnR4X3JpbmctPnN5bmNwKTsKKwl0eF9yaW5nLT50eF9zdGF0cy5uYXBpX2NvbXAgKz0gbmFwaV9jb21wX2NhbGw7CisJdHhfcmluZy0+dHhfc3RhdHMudHhfcG9sbCsrOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZ0eF9yaW5nLT5zeW5jcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZW5hX2ludHJfbXNpeF9tZ21udChpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgZW5hX2FkYXB0ZXIgKilkYXRhOworCisJZW5hX2NvbV9hZG1pbl9xX2NvbXBfaW50cl9oYW5kbGVyKGFkYXB0ZXItPmVuYV9kZXYpOworCisJLyogRG9uJ3QgY2FsbCB0aGUgYWVucSBoYW5kbGVyIGJlZm9yZSBwcm9iZSBpcyBkb25lICovCisJaWYgKGxpa2VseSh0ZXN0X2JpdChFTkFfRkxBR19ERVZJQ0VfUlVOTklORywgJmFkYXB0ZXItPmZsYWdzKSkpCisJCWVuYV9jb21fYWVucV9pbnRyX2hhbmRsZXIoYWRhcHRlci0+ZW5hX2RldiwgZGF0YSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIGVuYV9pbnRyX21zaXhfaW8gLSBNU0ktWCBJbnRlcnJ1cHQgSGFuZGxlciBmb3IgVHgvUngKKyAqIEBpcnE6IGludGVycnVwdCBudW1iZXIKKyAqIEBkYXRhOiBwb2ludGVyIHRvIGEgbmV0d29yayBpbnRlcmZhY2UgcHJpdmF0ZSBuYXBpIGRldmljZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIGlycXJldHVybl90IGVuYV9pbnRyX21zaXhfaW8oaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZW5hX25hcGkgKmVuYV9uYXBpID0gZGF0YTsKKworCW5hcGlfc2NoZWR1bGUoJmVuYV9uYXBpLT5uYXBpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBlbmFfZW5hYmxlX21zaXgoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLCBpbnQgbnVtX3F1ZXVlcykKK3sKKwlpbnQgaSwgbXNpeF92ZWNzLCByYzsKKworCWlmICh0ZXN0X2JpdChFTkFfRkxBR19NU0lYX0VOQUJMRUQsICZhZGFwdGVyLT5mbGFncykpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIHByb2JlLCBhZGFwdGVyLT5uZXRkZXYsCisJCQkgICJFcnJvciwgTVNJLVggaXMgYWxyZWFkeSBlbmFibGVkXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwkvKiBSZXNlcnZlZCB0aGUgbWF4IG1zaXggdmVjdG9ycyB3ZSBtaWdodCBuZWVkICovCisJbXNpeF92ZWNzID0gRU5BX01BWF9NU0lYX1ZFQyhudW1fcXVldWVzKTsKKworCW5ldGlmX2RiZyhhZGFwdGVyLCBwcm9iZSwgYWRhcHRlci0+bmV0ZGV2LAorCQkgICJ0cnlpbmcgdG8gZW5hYmxlIE1TSS1YLCB2ZWN0b3JzICVkXG4iLCBtc2l4X3ZlY3MpOworCisJYWRhcHRlci0+bXNpeF9lbnRyaWVzID0gdnphbGxvYyhtc2l4X3ZlY3MgKiBzaXplb2Yoc3RydWN0IG1zaXhfZW50cnkpKTsKKworCWlmICghYWRhcHRlci0+bXNpeF9lbnRyaWVzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBtc2l4X3ZlY3M7IGkrKykKKwkJYWRhcHRlci0+bXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKKworCXJjID0gcGNpX2VuYWJsZV9tc2l4KGFkYXB0ZXItPnBkZXYsIGFkYXB0ZXItPm1zaXhfZW50cmllcywgbXNpeF92ZWNzKTsKKwlpZiAocmMgIT0gMCkgeworCQluZXRpZl9lcnIoYWRhcHRlciwgcHJvYmUsIGFkYXB0ZXItPm5ldGRldiwKKwkJCSAgIkZhaWxlZCB0byBlbmFibGUgTVNJLVgsIHZlY3RvcnMgJWQgcmMgJWRcbiIsCisJCQkgIG1zaXhfdmVjcywgcmMpOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwluZXRpZl9kYmcoYWRhcHRlciwgcHJvYmUsIGFkYXB0ZXItPm5ldGRldiwgImVuYWJsZSBNU0ktWCwgdmVjdG9ycyAlZFxuIiwKKwkJICBtc2l4X3ZlY3MpOworCisJaWYgKG1zaXhfdmVjcyA+PSAxKSB7CisJCWlmIChlbmFfaW5pdF9yeF9jcHVfcm1hcChhZGFwdGVyKSkKKwkJCW5ldGlmX3dhcm4oYWRhcHRlciwgcHJvYmUsIGFkYXB0ZXItPm5ldGRldiwKKwkJCQkgICAiRmFpbGVkIHRvIG1hcCBJUlFzIHRvIENQVXNcbiIpOworCX0KKworCWFkYXB0ZXItPm1zaXhfdmVjcyA9IG1zaXhfdmVjczsKKwlzZXRfYml0KEVOQV9GTEFHX01TSVhfRU5BQkxFRCwgJmFkYXB0ZXItPmZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbmFfc2V0dXBfbWdtbnRfaW50cihzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIGNwdTsKKworCXNucHJpbnRmKGFkYXB0ZXItPmlycV90YmxbRU5BX01HTU5UX0lSUV9JRFhdLm5hbWUsCisJCSBFTkFfSVJRTkFNRV9TSVpFLCAiZW5hLW1nbW50QHBjaTolcyIsCisJCSBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSk7CisJYWRhcHRlci0+aXJxX3RibFtFTkFfTUdNTlRfSVJRX0lEWF0uaGFuZGxlciA9CisJCWVuYV9pbnRyX21zaXhfbWdtbnQ7CisJYWRhcHRlci0+aXJxX3RibFtFTkFfTUdNTlRfSVJRX0lEWF0uZGF0YSA9IGFkYXB0ZXI7CisJYWRhcHRlci0+aXJxX3RibFtFTkFfTUdNTlRfSVJRX0lEWF0udmVjdG9yID0KKwkJYWRhcHRlci0+bXNpeF9lbnRyaWVzW0VOQV9NR01OVF9JUlFfSURYXS52ZWN0b3I7CisJY3B1ID0gY3B1bWFza19maXJzdChjcHVfb25saW5lX21hc2spOworCWFkYXB0ZXItPmlycV90YmxbRU5BX01HTU5UX0lSUV9JRFhdLmNwdSA9IGNwdTsKKwljcHVtYXNrX3NldF9jcHUoY3B1LAorCQkJJmFkYXB0ZXItPmlycV90YmxbRU5BX01HTU5UX0lSUV9JRFhdLmFmZmluaXR5X2hpbnRfbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9zZXR1cF9pb19pbnRyKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCWludCBpcnFfaWR4LCBpLCBjcHU7CisKKwluZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7CisJCWlycV9pZHggPSBFTkFfSU9fSVJRX0lEWChpKTsKKwkJY3B1ID0gaSAlIG51bV9vbmxpbmVfY3B1cygpOworCisJCXNucHJpbnRmKGFkYXB0ZXItPmlycV90YmxbaXJxX2lkeF0ubmFtZSwgRU5BX0lSUU5BTUVfU0laRSwKKwkJCSAiJXMtVHgtUngtJWQiLCBuZXRkZXYtPm5hbWUsIGkpOworCQlhZGFwdGVyLT5pcnFfdGJsW2lycV9pZHhdLmhhbmRsZXIgPSBlbmFfaW50cl9tc2l4X2lvOworCQlhZGFwdGVyLT5pcnFfdGJsW2lycV9pZHhdLmRhdGEgPSAmYWRhcHRlci0+ZW5hX25hcGlbaV07CisJCWFkYXB0ZXItPmlycV90YmxbaXJxX2lkeF0udmVjdG9yID0KKwkJCWFkYXB0ZXItPm1zaXhfZW50cmllc1tpcnFfaWR4XS52ZWN0b3I7CisJCWFkYXB0ZXItPmlycV90YmxbaXJxX2lkeF0uY3B1ID0gY3B1OworCisJCWNwdW1hc2tfc2V0X2NwdShjcHUsCisJCQkJJmFkYXB0ZXItPmlycV90YmxbaXJxX2lkeF0uYWZmaW5pdHlfaGludF9tYXNrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZW5hX3JlcXVlc3RfbWdtbnRfaXJxKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlzdHJ1Y3QgZW5hX2lycSAqaXJxOworCWludCByYzsKKworCWlycSA9ICZhZGFwdGVyLT5pcnFfdGJsW0VOQV9NR01OVF9JUlFfSURYXTsKKwlyYyA9IHJlcXVlc3RfaXJxKGlycS0+dmVjdG9yLCBpcnEtPmhhbmRsZXIsIGZsYWdzLCBpcnEtPm5hbWUsCisJCQkgaXJxLT5kYXRhKTsKKwlpZiAocmMpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIHByb2JlLCBhZGFwdGVyLT5uZXRkZXYsCisJCQkgICJmYWlsZWQgdG8gcmVxdWVzdCBhZG1pbiBpcnFcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJbmV0aWZfZGJnKGFkYXB0ZXIsIHByb2JlLCBhZGFwdGVyLT5uZXRkZXYsCisJCSAgInNldCBhZmZpbml0eSBoaW50IG9mIG1nbW50IGlycS50byAweCVseCAoaXJxIHZlY3RvcjogJWQpXG4iLAorCQkgIGlycS0+YWZmaW5pdHlfaGludF9tYXNrLmJpdHNbMF0sIGlycS0+dmVjdG9yKTsKKworCWlycV9zZXRfYWZmaW5pdHlfaGludChpcnEtPnZlY3RvciwgJmlycS0+YWZmaW5pdHlfaGludF9tYXNrKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBlbmFfcmVxdWVzdF9pb19pcnEoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXN0cnVjdCBlbmFfaXJxICppcnE7CisJaW50IHJjID0gMCwgaSwgazsKKworCWlmICghdGVzdF9iaXQoRU5BX0ZMQUdfTVNJWF9FTkFCTEVELCAmYWRhcHRlci0+ZmxhZ3MpKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBpZnVwLCBhZGFwdGVyLT5uZXRkZXYsCisJCQkgICJGYWlsZWQgdG8gcmVxdWVzdCBJL08gSVJROiBNU0ktWCBpcyBub3QgZW5hYmxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IEVOQV9JT19JUlFfRklSU1RfSURYOyBpIDwgYWRhcHRlci0+bXNpeF92ZWNzOyBpKyspIHsKKwkJaXJxID0gJmFkYXB0ZXItPmlycV90YmxbaV07CisJCXJjID0gcmVxdWVzdF9pcnEoaXJxLT52ZWN0b3IsIGlycS0+aGFuZGxlciwgZmxhZ3MsIGlycS0+bmFtZSwKKwkJCQkgaXJxLT5kYXRhKTsKKwkJaWYgKHJjKSB7CisJCQluZXRpZl9lcnIoYWRhcHRlciwgaWZ1cCwgYWRhcHRlci0+bmV0ZGV2LAorCQkJCSAgIkZhaWxlZCB0byByZXF1ZXN0IEkvTyBJUlEuIGluZGV4ICVkIHJjICVkXG4iLAorCQkJCSAgIGksIHJjKTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJbmV0aWZfZGJnKGFkYXB0ZXIsIGlmdXAsIGFkYXB0ZXItPm5ldGRldiwKKwkJCSAgInNldCBhZmZpbml0eSBoaW50IG9mIGlycS4gaW5kZXggJWQgdG8gMHglbHggKGlycSB2ZWN0b3I6ICVkKVxuIiwKKwkJCSAgaSwgaXJxLT5hZmZpbml0eV9oaW50X21hc2suYml0c1swXSwgaXJxLT52ZWN0b3IpOworCisJCWlycV9zZXRfYWZmaW5pdHlfaGludChpcnEtPnZlY3RvciwgJmlycS0+YWZmaW5pdHlfaGludF9tYXNrKTsKKwl9CisKKwlyZXR1cm4gcmM7CisKK2VycjoKKwlmb3IgKGsgPSBFTkFfSU9fSVJRX0ZJUlNUX0lEWDsgayA8IGk7IGsrKykgeworCQlpcnEgPSAmYWRhcHRlci0+aXJxX3RibFtrXTsKKwkJZnJlZV9pcnEoaXJxLT52ZWN0b3IsIGlycS0+ZGF0YSk7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBlbmFfZnJlZV9tZ21udF9pcnEoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlbmFfaXJxICppcnE7CisKKwlpcnEgPSAmYWRhcHRlci0+aXJxX3RibFtFTkFfTUdNTlRfSVJRX0lEWF07CisJc3luY2hyb25pemVfaXJxKGlycS0+dmVjdG9yKTsKKwlpcnFfc2V0X2FmZmluaXR5X2hpbnQoaXJxLT52ZWN0b3IsIE5VTEwpOworCWZyZWVfaXJxKGlycS0+dmVjdG9yLCBpcnEtPmRhdGEpOworfQorCitzdGF0aWMgdm9pZCBlbmFfZnJlZV9pb19pcnEoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlbmFfaXJxICppcnE7CisJaW50IGk7CisKKyNpZmRlZiBDT05GSUdfUkZTX0FDQ0VMCisJaWYgKGFkYXB0ZXItPm1zaXhfdmVjcyA+PSAxKSB7CisJCWZyZWVfaXJxX2NwdV9ybWFwKGFkYXB0ZXItPm5ldGRldi0+cnhfY3B1X3JtYXApOworCQlhZGFwdGVyLT5uZXRkZXYtPnJ4X2NwdV9ybWFwID0gTlVMTDsKKwl9CisjZW5kaWYgLyogQ09ORklHX1JGU19BQ0NFTCAqLworCisJZm9yIChpID0gRU5BX0lPX0lSUV9GSVJTVF9JRFg7IGkgPCBhZGFwdGVyLT5tc2l4X3ZlY3M7IGkrKykgeworCQlpcnEgPSAmYWRhcHRlci0+aXJxX3RibFtpXTsKKwkJaXJxX3NldF9hZmZpbml0eV9oaW50KGlycS0+dmVjdG9yLCBOVUxMKTsKKwkJZnJlZV9pcnEoaXJxLT52ZWN0b3IsIGlycS0+ZGF0YSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmFfZGlzYWJsZV9tc2l4KHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEVOQV9GTEFHX01TSVhfRU5BQkxFRCwgJmFkYXB0ZXItPmZsYWdzKSkKKwkJcGNpX2Rpc2FibGVfbXNpeChhZGFwdGVyLT5wZGV2KTsKKworCWlmIChhZGFwdGVyLT5tc2l4X2VudHJpZXMpCisJCXZmcmVlKGFkYXB0ZXItPm1zaXhfZW50cmllcyk7CisJYWRhcHRlci0+bXNpeF9lbnRyaWVzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZW5hX2Rpc2FibGVfaW9faW50cl9zeW5jKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgaTsKKworCWlmICghbmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSBFTkFfSU9fSVJRX0ZJUlNUX0lEWDsgaSA8IGFkYXB0ZXItPm1zaXhfdmVjczsgaSsrKQorCQlzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci0+aXJxX3RibFtpXS52ZWN0b3IpOworfQorCitzdGF0aWMgdm9pZCBlbmFfZGVsX25hcGkoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykKKwkJbmV0aWZfbmFwaV9kZWwoJmFkYXB0ZXItPmVuYV9uYXBpW2ldLm5hcGkpOworfQorCitzdGF0aWMgdm9pZCBlbmFfaW5pdF9uYXBpKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZW5hX25hcGkgKm5hcGk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7CisJCW5hcGkgPSAmYWRhcHRlci0+ZW5hX25hcGlbaV07CisKKwkJbmV0aWZfbmFwaV9hZGQoYWRhcHRlci0+bmV0ZGV2LAorCQkJICAgICAgICZhZGFwdGVyLT5lbmFfbmFwaVtpXS5uYXBpLAorCQkJICAgICAgIGVuYV9pb19wb2xsLAorCQkJICAgICAgIEVOQV9OQVBJX0JVREdFVCk7CisJCW5hcGktPnJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZ1tpXTsKKwkJbmFwaS0+dHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nW2ldOworCQluYXBpLT5xaWQgPSBpOworCX0KK30KKworc3RhdGljIHZvaWQgZW5hX25hcGlfZGlzYWJsZV9hbGwoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykKKwkJbmFwaV9kaXNhYmxlKCZhZGFwdGVyLT5lbmFfbmFwaVtpXS5uYXBpKTsKK30KKworc3RhdGljIHZvaWQgZW5hX25hcGlfZW5hYmxlX2FsbChzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKQorCQluYXBpX2VuYWJsZSgmYWRhcHRlci0+ZW5hX25hcGlbaV0ubmFwaSk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9yZXN0b3JlX2V0aHRvb2xfcGFyYW1zKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlhZGFwdGVyLT50eF91c2VjcyA9IDA7CisJYWRhcHRlci0+cnhfdXNlY3MgPSAwOworCWFkYXB0ZXItPnR4X2ZyYW1lcyA9IDE7CisJYWRhcHRlci0+cnhfZnJhbWVzID0gMTsKK30KKworLyogQ29uZmlndXJlIHRoZSBSeCBmb3J3YXJkaW5nICovCitzdGF0aWMgaW50IGVuYV9yc3NfY29uZmlndXJlKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYgPSBhZGFwdGVyLT5lbmFfZGV2OworCWludCByYzsKKworCS8qIEluIGNhc2UgdGhlIFJTUyB0YWJsZSB3YXNuJ3QgaW5pdGlhbGl6ZWQgYnkgcHJvYmUgKi8KKwlpZiAoIWVuYV9kZXYtPnJzcy50YmxfbG9nX3NpemUpIHsKKwkJcmMgPSBlbmFfcnNzX2luaXRfZGVmYXVsdChhZGFwdGVyKTsKKwkJaWYgKHJjICYmIChyYyAhPSAtRVBFUk0pKSB7CisJCQluZXRpZl9lcnIoYWRhcHRlciwgaWZ1cCwgYWRhcHRlci0+bmV0ZGV2LAorCQkJCSAgIkZhaWxlZCB0byBpbml0IFJTUyByYzogJWRcbiIsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCS8qIFNldCBpbmRpcmVjdCB0YWJsZSAqLworCXJjID0gZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9zZXQoZW5hX2Rldik7CisJaWYgKHVubGlrZWx5KHJjICYmIHJjICE9IC1FUEVSTSkpCisJCXJldHVybiByYzsKKworCS8qIENvbmZpZ3VyZSBoYXNoIGZ1bmN0aW9uIChpZiBzdXBwb3J0ZWQpICovCisJcmMgPSBlbmFfY29tX3NldF9oYXNoX2Z1bmN0aW9uKGVuYV9kZXYpOworCWlmICh1bmxpa2VseShyYyAmJiAocmMgIT0gLUVQRVJNKSkpCisJCXJldHVybiByYzsKKworCS8qIENvbmZpZ3VyZSBoYXNoIGlucHV0cyAoaWYgc3VwcG9ydGVkKSAqLworCXJjID0gZW5hX2NvbV9zZXRfaGFzaF9jdHJsKGVuYV9kZXYpOworCWlmICh1bmxpa2VseShyYyAmJiAocmMgIT0gLUVQRVJNKSkpCisJCXJldHVybiByYzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuYV91cF9jb21wbGV0ZShzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHJjLCBpOworCisJcmMgPSBlbmFfcnNzX2NvbmZpZ3VyZShhZGFwdGVyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWVuYV9pbml0X25hcGkoYWRhcHRlcik7CisKKwllbmFfY2hhbmdlX210dShhZGFwdGVyLT5uZXRkZXYsIGFkYXB0ZXItPm5ldGRldi0+bXR1KTsKKworCWVuYV9yZWZpbGxfYWxsX3J4X2J1ZnMoYWRhcHRlcik7CisKKwkvKiBlbmFibGUgdHJhbnNtaXRzICovCisJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhhZGFwdGVyLT5uZXRkZXYpOworCisJZW5hX3Jlc3RvcmVfZXRodG9vbF9wYXJhbXMoYWRhcHRlcik7CisKKwllbmFfbmFwaV9lbmFibGVfYWxsKGFkYXB0ZXIpOworCisJLyogc2NoZWR1bGUgbmFwaSBpbiBjYXNlIHdlIGhhZCBwZW5kaW5nIHBhY2tldHMKKwkgKiBmcm9tIHRoZSBsYXN0IHRpbWUgd2UgZGlzYWJsZSBuYXBpCisJICovCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykKKwkJbmFwaV9zY2hlZHVsZSgmYWRhcHRlci0+ZW5hX25hcGlbaV0ubmFwaSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmFfY3JlYXRlX2lvX3R4X3F1ZXVlKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwgaW50IHFpZCkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9jcmVhdGVfaW9fY3R4IGN0eCA9IHsgMCB9OworCXN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldjsKKwlzdHJ1Y3QgZW5hX3JpbmcgKnR4X3Jpbmc7CisJdTMyIG1zaXhfdmVjdG9yOworCXUxNiBlbmFfcWlkOworCWludCByYzsKKworCWVuYV9kZXYgPSBhZGFwdGVyLT5lbmFfZGV2OworCisJdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nW3FpZF07CisJbXNpeF92ZWN0b3IgPSBFTkFfSU9fSVJRX0lEWChxaWQpOworCWVuYV9xaWQgPSBFTkFfSU9fVFhRX0lEWChxaWQpOworCisJY3R4LmRpcmVjdGlvbiA9IEVOQV9DT01fSU9fUVVFVUVfRElSRUNUSU9OX1RYOworCWN0eC5xaWQgPSBlbmFfcWlkOworCWN0eC5tZW1fcXVldWVfdHlwZSA9IGVuYV9kZXYtPnR4X21lbV9xdWV1ZV90eXBlOworCWN0eC5tc2l4X3ZlY3RvciA9IG1zaXhfdmVjdG9yOworCWN0eC5xdWV1ZV9zaXplID0gYWRhcHRlci0+dHhfcmluZ19zaXplOworCWN0eC5udW1hX25vZGUgPSBjcHVfdG9fbm9kZSh0eF9yaW5nLT5jcHUpOworCisJcmMgPSBlbmFfY29tX2NyZWF0ZV9pb19xdWV1ZShlbmFfZGV2LCAmY3R4KTsKKwlpZiAocmMpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGlmdXAsIGFkYXB0ZXItPm5ldGRldiwKKwkJCSAgIkZhaWxlZCB0byBjcmVhdGUgSS9PIFRYIHF1ZXVlIG51bSAlZCByYzogJWRcbiIsCisJCQkgIHFpZCwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBlbmFfY29tX2dldF9pb19oYW5kbGVycyhlbmFfZGV2LCBlbmFfcWlkLAorCQkJCSAgICAgJnR4X3JpbmctPmVuYV9jb21faW9fc3EsCisJCQkJICAgICAmdHhfcmluZy0+ZW5hX2NvbV9pb19jcSk7CisJaWYgKHJjKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBpZnVwLCBhZGFwdGVyLT5uZXRkZXYsCisJCQkgICJGYWlsZWQgdG8gZ2V0IFRYIHF1ZXVlIGhhbmRsZXJzLiBUWCBxdWV1ZSBudW0gJWQgcmM6ICVkXG4iLAorCQkJICBxaWQsIHJjKTsKKwkJZW5hX2NvbV9kZXN0cm95X2lvX3F1ZXVlKGVuYV9kZXYsIGVuYV9xaWQpOworCX0KKworCWVuYV9jb21fdXBkYXRlX251bWFfbm9kZSh0eF9yaW5nLT5lbmFfY29tX2lvX2NxLCBjdHgubnVtYV9ub2RlKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NyZWF0ZV9hbGxfaW9fdHhfcXVldWVzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYgPSBhZGFwdGVyLT5lbmFfZGV2OworCWludCByYywgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspIHsKKwkJcmMgPSBlbmFfY3JlYXRlX2lvX3R4X3F1ZXVlKGFkYXB0ZXIsIGkpOworCQlpZiAocmMpCisJCQlnb3RvIGNyZWF0ZV9lcnI7CisJfQorCisJcmV0dXJuIDA7CisKK2NyZWF0ZV9lcnI6CisJd2hpbGUgKGktLSkKKwkJZW5hX2NvbV9kZXN0cm95X2lvX3F1ZXVlKGVuYV9kZXYsIEVOQV9JT19UWFFfSURYKGkpKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBlbmFfY3JlYXRlX2lvX3J4X3F1ZXVlKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwgaW50IHFpZCkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXY7CisJc3RydWN0IGVuYV9jb21fY3JlYXRlX2lvX2N0eCBjdHggPSB7IDAgfTsKKwlzdHJ1Y3QgZW5hX3JpbmcgKnJ4X3Jpbmc7CisJdTMyIG1zaXhfdmVjdG9yOworCXUxNiBlbmFfcWlkOworCWludCByYzsKKworCWVuYV9kZXYgPSBhZGFwdGVyLT5lbmFfZGV2OworCisJcnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nW3FpZF07CisJbXNpeF92ZWN0b3IgPSBFTkFfSU9fSVJRX0lEWChxaWQpOworCWVuYV9xaWQgPSBFTkFfSU9fUlhRX0lEWChxaWQpOworCisJY3R4LnFpZCA9IGVuYV9xaWQ7CisJY3R4LmRpcmVjdGlvbiA9IEVOQV9DT01fSU9fUVVFVUVfRElSRUNUSU9OX1JYOworCWN0eC5tZW1fcXVldWVfdHlwZSA9IEVOQV9BRE1JTl9QTEFDRU1FTlRfUE9MSUNZX0hPU1Q7CisJY3R4Lm1zaXhfdmVjdG9yID0gbXNpeF92ZWN0b3I7CisJY3R4LnF1ZXVlX3NpemUgPSBhZGFwdGVyLT5yeF9yaW5nX3NpemU7CisJY3R4Lm51bWFfbm9kZSA9IGNwdV90b19ub2RlKHJ4X3JpbmctPmNwdSk7CisKKwlyYyA9IGVuYV9jb21fY3JlYXRlX2lvX3F1ZXVlKGVuYV9kZXYsICZjdHgpOworCWlmIChyYykgeworCQluZXRpZl9lcnIoYWRhcHRlciwgaWZ1cCwgYWRhcHRlci0+bmV0ZGV2LAorCQkJICAiRmFpbGVkIHRvIGNyZWF0ZSBJL08gUlggcXVldWUgbnVtICVkIHJjOiAlZFxuIiwKKwkJCSAgcWlkLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IGVuYV9jb21fZ2V0X2lvX2hhbmRsZXJzKGVuYV9kZXYsIGVuYV9xaWQsCisJCQkJICAgICAmcnhfcmluZy0+ZW5hX2NvbV9pb19zcSwKKwkJCQkgICAgICZyeF9yaW5nLT5lbmFfY29tX2lvX2NxKTsKKwlpZiAocmMpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGlmdXAsIGFkYXB0ZXItPm5ldGRldiwKKwkJCSAgIkZhaWxlZCB0byBnZXQgUlggcXVldWUgaGFuZGxlcnMuIFJYIHF1ZXVlIG51bSAlZCByYzogJWRcbiIsCisJCQkgIHFpZCwgcmMpOworCQllbmFfY29tX2Rlc3Ryb3lfaW9fcXVldWUoZW5hX2RldiwgZW5hX3FpZCk7CisJfQorCisJZW5hX2NvbV91cGRhdGVfbnVtYV9ub2RlKHJ4X3JpbmctPmVuYV9jb21faW9fY3EsIGN0eC5udW1hX25vZGUpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGVuYV9jcmVhdGVfYWxsX2lvX3J4X3F1ZXVlcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2ID0gYWRhcHRlci0+ZW5hX2RldjsKKwlpbnQgcmMsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7CisJCXJjID0gZW5hX2NyZWF0ZV9pb19yeF9xdWV1ZShhZGFwdGVyLCBpKTsKKwkJaWYgKHJjKQorCQkJZ290byBjcmVhdGVfZXJyOworCX0KKworCXJldHVybiAwOworCitjcmVhdGVfZXJyOgorCXdoaWxlIChpLS0pCisJCWVuYV9jb21fZGVzdHJveV9pb19xdWV1ZShlbmFfZGV2LCBFTkFfSU9fUlhRX0lEWChpKSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZW5hX3VwKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgcmM7CisKKwluZXRkZXZfZGJnKGFkYXB0ZXItPm5ldGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwllbmFfc2V0dXBfaW9faW50cihhZGFwdGVyKTsKKworCXJjID0gZW5hX3JlcXVlc3RfaW9faXJxKGFkYXB0ZXIpOworCWlmIChyYykKKwkJZ290byBlcnJfcmVxX2lycTsKKworCS8qIGFsbG9jYXRlIHRyYW5zbWl0IGRlc2NyaXB0b3JzICovCisJcmMgPSBlbmFfc2V0dXBfYWxsX3R4X3Jlc291cmNlcyhhZGFwdGVyKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX3NldHVwX3R4OworCisJLyogYWxsb2NhdGUgcmVjZWl2ZSBkZXNjcmlwdG9ycyAqLworCXJjID0gZW5hX3NldHVwX2FsbF9yeF9yZXNvdXJjZXMoYWRhcHRlcik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9zZXR1cF9yeDsKKworCS8qIENyZWF0ZSBUWCBxdWV1ZXMgKi8KKwlyYyA9IGVuYV9jcmVhdGVfYWxsX2lvX3R4X3F1ZXVlcyhhZGFwdGVyKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX2NyZWF0ZV90eF9xdWV1ZXM7CisKKwkvKiBDcmVhdGUgUlggcXVldWVzICovCisJcmMgPSBlbmFfY3JlYXRlX2FsbF9pb19yeF9xdWV1ZXMoYWRhcHRlcik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9jcmVhdGVfcnhfcXVldWVzOworCisJcmMgPSBlbmFfdXBfY29tcGxldGUoYWRhcHRlcik7CisJaWYgKHJjKQorCQlnb3RvIGVycl91cDsKKworCWlmICh0ZXN0X2JpdChFTkFfRkxBR19MSU5LX1VQLCAmYWRhcHRlci0+ZmxhZ3MpKQorCQluZXRpZl9jYXJyaWVyX29uKGFkYXB0ZXItPm5ldGRldik7CisKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZhZGFwdGVyLT5zeW5jcCk7CisJYWRhcHRlci0+ZGV2X3N0YXRzLmludGVyZmFjZV91cCsrOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZhZGFwdGVyLT5zeW5jcCk7CisKKwlzZXRfYml0KEVOQV9GTEFHX0RFVl9VUCwgJmFkYXB0ZXItPmZsYWdzKTsKKworCXJldHVybiByYzsKKworZXJyX3VwOgorCWVuYV9kZXN0cm95X2FsbF9yeF9xdWV1ZXMoYWRhcHRlcik7CitlcnJfY3JlYXRlX3J4X3F1ZXVlczoKKwllbmFfZGVzdHJveV9hbGxfdHhfcXVldWVzKGFkYXB0ZXIpOworZXJyX2NyZWF0ZV90eF9xdWV1ZXM6CisJZW5hX2ZyZWVfYWxsX2lvX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKK2Vycl9zZXR1cF9yeDoKKwllbmFfZnJlZV9hbGxfaW9fdHhfcmVzb3VyY2VzKGFkYXB0ZXIpOworZXJyX3NldHVwX3R4OgorCWVuYV9mcmVlX2lvX2lycShhZGFwdGVyKTsKK2Vycl9yZXFfaXJxOgorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBlbmFfZG93bihzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJbmV0aWZfaW5mbyhhZGFwdGVyLCBpZmRvd24sIGFkYXB0ZXItPm5ldGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwljbGVhcl9iaXQoRU5BX0ZMQUdfREVWX1VQLCAmYWRhcHRlci0+ZmxhZ3MpOworCisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmYWRhcHRlci0+c3luY3ApOworCWFkYXB0ZXItPmRldl9zdGF0cy5pbnRlcmZhY2VfZG93bisrOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZhZGFwdGVyLT5zeW5jcCk7CisKKwkvKiBBZnRlciB0aGlzIHBvaW50IHRoZSBuYXBpIGhhbmRsZXIgd29uJ3QgZW5hYmxlIHRoZSB0eCBxdWV1ZSAqLworCWVuYV9uYXBpX2Rpc2FibGVfYWxsKGFkYXB0ZXIpOworCW5ldGlmX2NhcnJpZXJfb2ZmKGFkYXB0ZXItPm5ldGRldik7CisJbmV0aWZfdHhfZGlzYWJsZShhZGFwdGVyLT5uZXRkZXYpOworCisJLyogQWZ0ZXIgZGVzdHJveSB0aGUgcXVldWUgdGhlcmUgd29uJ3QgYmUgYW55IG5ldyBpbnRlcnJ1cHRzICovCisJZW5hX2Rlc3Ryb3lfYWxsX2lvX3F1ZXVlcyhhZGFwdGVyKTsKKworCWVuYV9kaXNhYmxlX2lvX2ludHJfc3luYyhhZGFwdGVyKTsKKwllbmFfZnJlZV9pb19pcnEoYWRhcHRlcik7CisJZW5hX2RlbF9uYXBpKGFkYXB0ZXIpOworCisJZW5hX2ZyZWVfYWxsX3R4X2J1ZnMoYWRhcHRlcik7CisJZW5hX2ZyZWVfYWxsX3J4X2J1ZnMoYWRhcHRlcik7CisJZW5hX2ZyZWVfYWxsX2lvX3R4X3Jlc291cmNlcyhhZGFwdGVyKTsKKwllbmFfZnJlZV9hbGxfaW9fcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOworfQorCisvKiBlbmFfb3BlbiAtIENhbGxlZCB3aGVuIGEgbmV0d29yayBpbnRlcmZhY2UgaXMgbWFkZSBhY3RpdmUKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZQorICoKKyAqIFRoZSBvcGVuIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuIGEgbmV0d29yayBpbnRlcmZhY2UgaXMgbWFkZQorICogYWN0aXZlIGJ5IHRoZSBzeXN0ZW0gKElGRl9VUCkuICBBdCB0aGlzIHBvaW50IGFsbCByZXNvdXJjZXMgbmVlZGVkCisgKiBmb3IgdHJhbnNtaXQgYW5kIHJlY2VpdmUgb3BlcmF0aW9ucyBhcmUgYWxsb2NhdGVkLCB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgT1MsIHRoZSB3YXRjaGRvZyB0aW1lciBpcyBzdGFydGVkLAorICogYW5kIHRoZSBzdGFjayBpcyBub3RpZmllZCB0aGF0IHRoZSBpbnRlcmZhY2UgaXMgcmVhZHkuCisgKi8KK3N0YXRpYyBpbnQgZW5hX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCByYzsKKworCS8qIE5vdGlmeSB0aGUgc3RhY2sgb2YgdGhlIGFjdHVhbCBxdWV1ZSBjb3VudHMuICovCisJcmMgPSBuZXRpZl9zZXRfcmVhbF9udW1fdHhfcXVldWVzKG5ldGRldiwgYWRhcHRlci0+bnVtX3F1ZXVlcyk7CisJaWYgKHJjKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBpZnVwLCBuZXRkZXYsICJDYW4ndCBzZXQgbnVtIHR4IHF1ZXVlc1xuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IG5ldGlmX3NldF9yZWFsX251bV9yeF9xdWV1ZXMobmV0ZGV2LCBhZGFwdGVyLT5udW1fcXVldWVzKTsKKwlpZiAocmMpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGlmdXAsIG5ldGRldiwgIkNhbid0IHNldCBudW0gcnggcXVldWVzXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gZW5hX3VwKGFkYXB0ZXIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIHJjOworfQorCisvKiBlbmFfY2xvc2UgLSBEaXNhYmxlcyBhIG5ldHdvcmsgaW50ZXJmYWNlCisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwLCB0aGlzIGlzIG5vdCBhbGxvd2VkIHRvIGZhaWwKKyAqCisgKiBUaGUgY2xvc2UgZW50cnkgcG9pbnQgaXMgY2FsbGVkIHdoZW4gYW4gaW50ZXJmYWNlIGlzIGRlLWFjdGl2YXRlZAorICogYnkgdGhlIE9TLiAgVGhlIGhhcmR3YXJlIGlzIHN0aWxsIHVuZGVyIHRoZSBkcml2ZXJzIGNvbnRyb2wsIGJ1dAorICogbmVlZHMgdG8gYmUgZGlzYWJsZWQuICBBIGdsb2JhbCBNQUMgcmVzZXQgaXMgaXNzdWVkIHRvIHN0b3AgdGhlCisgKiBoYXJkd2FyZSwgYW5kIGFsbCB0cmFuc21pdCBhbmQgcmVjZWl2ZSByZXNvdXJjZXMgYXJlIGZyZWVkLgorICovCitzdGF0aWMgaW50IGVuYV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwluZXRpZl9kYmcoYWRhcHRlciwgaWZkb3duLCBuZXRkZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKHRlc3RfYml0KEVOQV9GTEFHX0RFVl9VUCwgJmFkYXB0ZXItPmZsYWdzKSkKKwkJZW5hX2Rvd24oYWRhcHRlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5hX3R4X2NzdW0oc3RydWN0IGVuYV9jb21fdHhfY3R4ICplbmFfdHhfY3R4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXUzMiBtc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOworCXN0cnVjdCBlbmFfY29tX3R4X21ldGEgKmVuYV9tZXRhID0gJmVuYV90eF9jdHgtPmVuYV9tZXRhOworCXU4IGw0X3Byb3RvY29sID0gMDsKKworCWlmICgoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgfHwgbXNzKSB7CisJCWVuYV90eF9jdHgtPmw0X2NzdW1fZW5hYmxlID0gMTsKKwkJaWYgKG1zcykgeworCQkJZW5hX3R4X2N0eC0+dHNvX2VuYWJsZSA9IDE7CisJCQllbmFfbWV0YS0+bDRfaGRyX2xlbiA9IHRjcF9oZHIoc2tiKS0+ZG9mZjsKKwkJCWVuYV90eF9jdHgtPmw0X2NzdW1fcGFydGlhbCA9IDA7CisJCX0gZWxzZSB7CisJCQllbmFfdHhfY3R4LT50c29fZW5hYmxlID0gMDsKKwkJCWVuYV9tZXRhLT5sNF9oZHJfbGVuID0gMDsKKwkJCWVuYV90eF9jdHgtPmw0X2NzdW1fcGFydGlhbCA9IDE7CisJCX0KKworCQlzd2l0Y2ggKGlwX2hkcihza2IpLT52ZXJzaW9uKSB7CisJCWNhc2UgSVBWRVJTSU9OOgorCQkJZW5hX3R4X2N0eC0+bDNfcHJvdG8gPSBFTkFfRVRIX0lPX0wzX1BST1RPX0lQVjQ7CisJCQlpZiAoaXBfaGRyKHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKQorCQkJCWVuYV90eF9jdHgtPmRmID0gMTsKKwkJCWlmIChtc3MpCisJCQkJZW5hX3R4X2N0eC0+bDNfY3N1bV9lbmFibGUgPSAxOworCQkJbDRfcHJvdG9jb2wgPSBpcF9oZHIoc2tiKS0+cHJvdG9jb2w7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJZW5hX3R4X2N0eC0+bDNfcHJvdG8gPSBFTkFfRVRIX0lPX0wzX1BST1RPX0lQVjY7CisJCQlsNF9wcm90b2NvbCA9IGlwdjZfaGRyKHNrYiktPm5leHRoZHI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGw0X3Byb3RvY29sID09IElQUFJPVE9fVENQKQorCQkJZW5hX3R4X2N0eC0+bDRfcHJvdG8gPSBFTkFfRVRIX0lPX0w0X1BST1RPX1RDUDsKKwkJZWxzZQorCQkJZW5hX3R4X2N0eC0+bDRfcHJvdG8gPSBFTkFfRVRIX0lPX0w0X1BST1RPX1VEUDsKKworCQllbmFfbWV0YS0+bXNzID0gbXNzOworCQllbmFfbWV0YS0+bDNfaGRyX2xlbiA9IHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKTsKKwkJZW5hX21ldGEtPmwzX2hkcl9vZmZzZXQgPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKKwkJZW5hX3R4X2N0eC0+bWV0YV92YWxpZCA9IDE7CisKKwl9IGVsc2UgeworCQllbmFfdHhfY3R4LT5tZXRhX3ZhbGlkID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NoZWNrX2FuZF9saW5lYXJpemVfc2tiKHN0cnVjdCBlbmFfcmluZyAqdHhfcmluZywKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgbnVtX2ZyYWdzLCBoZWFkZXJfbGVuLCByYzsKKworCW51bV9mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJaGVhZGVyX2xlbiA9IHNrYl9oZWFkbGVuKHNrYik7CisKKwlpZiAobnVtX2ZyYWdzIDwgdHhfcmluZy0+c2dsX3NpemUpCisJCXJldHVybiAwOworCisJaWYgKChudW1fZnJhZ3MgPT0gdHhfcmluZy0+c2dsX3NpemUpICYmCisJICAgIChoZWFkZXJfbGVuIDwgdHhfcmluZy0+dHhfbWF4X2hlYWRlcl9zaXplKSkKKwkJcmV0dXJuIDA7CisKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZ0eF9yaW5nLT5zeW5jcCk7CisJdHhfcmluZy0+dHhfc3RhdHMubGluZWFyaXplKys7CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnR4X3JpbmctPnN5bmNwKTsKKworCXJjID0gc2tiX2xpbmVhcml6ZShza2IpOworCWlmICh1bmxpa2VseShyYykpIHsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmdHhfcmluZy0+c3luY3ApOworCQl0eF9yaW5nLT50eF9zdGF0cy5saW5lYXJpemVfZmFpbGVkKys7CisJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZ0eF9yaW5nLT5zeW5jcCk7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBDYWxsZWQgd2l0aCBuZXRpZl90eF9sb2NrLiAqLworc3RhdGljIG5ldGRldl90eF90IGVuYV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZW5hX3R4X2J1ZmZlciAqdHhfaW5mbzsKKwlzdHJ1Y3QgZW5hX2NvbV90eF9jdHggZW5hX3R4X2N0eDsKKwlzdHJ1Y3QgZW5hX3JpbmcgKnR4X3Jpbmc7CisJc3RydWN0IG5ldGRldl9xdWV1ZSAqdHhxOworCXN0cnVjdCBlbmFfY29tX2J1ZiAqZW5hX2J1ZjsKKwl2b2lkICpwdXNoX2hkcjsKKwl1MzIgbGVuLCBsYXN0X2ZyYWc7CisJdTE2IG5leHRfdG9fdXNlOworCXUxNiByZXFfaWQ7CisJdTE2IHB1c2hfbGVuOworCXUxNiBoZWFkZXJfbGVuOworCWRtYV9hZGRyX3QgZG1hOworCWludCBxaWQsIHJjLCBuYl9od19kZXNjOworCWludCBpID0gLTE7CisKKwluZXRpZl9kYmcoYWRhcHRlciwgdHhfcXVldWVkLCBkZXYsICIlcyBza2IgJXBcbiIsIF9fZnVuY19fLCBza2IpOworCS8qICBEZXRlcm1pbmUgd2hpY2ggdHggcmluZyB3ZSB3aWxsIGJlIHBsYWNlZCBvbiAqLworCXFpZCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOworCXR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZ1txaWRdOworCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUoZGV2LCBxaWQpOworCisJcmMgPSBlbmFfY2hlY2tfYW5kX2xpbmVhcml6ZV9za2IodHhfcmluZywgc2tiKTsKKwlpZiAodW5saWtlbHkocmMpKQorCQlnb3RvIGVycm9yX2Ryb3BfcGFja2V0OworCisJc2tiX3R4X3RpbWVzdGFtcChza2IpOworCWxlbiA9IHNrYl9oZWFkbGVuKHNrYik7CisKKwluZXh0X3RvX3VzZSA9IHR4X3JpbmctPm5leHRfdG9fdXNlOworCXJlcV9pZCA9IHR4X3JpbmctPmZyZWVfdHhfaWRzW25leHRfdG9fdXNlXTsKKwl0eF9pbmZvID0gJnR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvW3JlcV9pZF07CisJdHhfaW5mby0+bnVtX29mX2J1ZnMgPSAwOworCisJV0FSTih0eF9pbmZvLT5za2IsICJTS0IgaXNuJ3QgTlVMTCByZXFfaWQgJWRcbiIsIHJlcV9pZCk7CisJZW5hX2J1ZiA9IHR4X2luZm8tPmJ1ZnM7CisJdHhfaW5mby0+c2tiID0gc2tiOworCisJaWYgKHR4X3JpbmctPnR4X21lbV9xdWV1ZV90eXBlID09IEVOQV9BRE1JTl9QTEFDRU1FTlRfUE9MSUNZX0RFVikgeworCQkvKiBwcmVwYXJlZCB0aGUgcHVzaCBidWZmZXIgKi8KKwkJcHVzaF9sZW4gPSBtaW5fdCh1MzIsIGxlbiwgdHhfcmluZy0+dHhfbWF4X2hlYWRlcl9zaXplKTsKKwkJaGVhZGVyX2xlbiA9IHB1c2hfbGVuOworCQlwdXNoX2hkciA9IHNrYi0+ZGF0YTsKKwl9IGVsc2UgeworCQlwdXNoX2xlbiA9IDA7CisJCWhlYWRlcl9sZW4gPSBtaW5fdCh1MzIsIGxlbiwgdHhfcmluZy0+dHhfbWF4X2hlYWRlcl9zaXplKTsKKwkJcHVzaF9oZHIgPSBOVUxMOworCX0KKworCW5ldGlmX2RiZyhhZGFwdGVyLCB0eF9xdWV1ZWQsIGRldiwKKwkJICAic2tiOiAlcCBoZWFkZXJfYnVmLT52YWRkcjogJXAgcHVzaF9sZW46ICVkXG4iLCBza2IsCisJCSAgcHVzaF9oZHIsIHB1c2hfbGVuKTsKKworCWlmIChsZW4gPiBwdXNoX2xlbikgeworCQlkbWEgPSBkbWFfbWFwX3NpbmdsZSh0eF9yaW5nLT5kZXYsIHNrYi0+ZGF0YSArIHB1c2hfbGVuLAorCQkJCSAgICAgbGVuIC0gcHVzaF9sZW4sIERNQV9UT19ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IodHhfcmluZy0+ZGV2LCBkbWEpKQorCQkJZ290byBlcnJvcl9yZXBvcnRfZG1hX2Vycm9yOworCisJCWVuYV9idWYtPnBhZGRyID0gZG1hOworCQllbmFfYnVmLT5sZW4gPSBsZW4gLSBwdXNoX2xlbjsKKworCQllbmFfYnVmKys7CisJCXR4X2luZm8tPm51bV9vZl9idWZzKys7CisJfQorCisJbGFzdF9mcmFnID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKworCWZvciAoaSA9IDA7IGkgPCBsYXN0X2ZyYWc7IGkrKykgeworCQljb25zdCBza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisKKwkJbGVuID0gc2tiX2ZyYWdfc2l6ZShmcmFnKTsKKwkJZG1hID0gc2tiX2ZyYWdfZG1hX21hcCh0eF9yaW5nLT5kZXYsIGZyYWcsIDAsIGxlbiwKKwkJCQkgICAgICAgRE1BX1RPX0RFVklDRSk7CisJCWlmIChkbWFfbWFwcGluZ19lcnJvcih0eF9yaW5nLT5kZXYsIGRtYSkpCisJCQlnb3RvIGVycm9yX3JlcG9ydF9kbWFfZXJyb3I7CisKKwkJZW5hX2J1Zi0+cGFkZHIgPSBkbWE7CisJCWVuYV9idWYtPmxlbiA9IGxlbjsKKwkJZW5hX2J1ZisrOworCX0KKworCXR4X2luZm8tPm51bV9vZl9idWZzICs9IGxhc3RfZnJhZzsKKworCW1lbXNldCgmZW5hX3R4X2N0eCwgMHgwLCBzaXplb2Yoc3RydWN0IGVuYV9jb21fdHhfY3R4KSk7CisJZW5hX3R4X2N0eC5lbmFfYnVmcyA9IHR4X2luZm8tPmJ1ZnM7CisJZW5hX3R4X2N0eC5wdXNoX2hlYWRlciA9IHB1c2hfaGRyOworCWVuYV90eF9jdHgubnVtX2J1ZnMgPSB0eF9pbmZvLT5udW1fb2ZfYnVmczsKKwllbmFfdHhfY3R4LnJlcV9pZCA9IHJlcV9pZDsKKwllbmFfdHhfY3R4LmhlYWRlcl9sZW4gPSBoZWFkZXJfbGVuOworCisJLyogc2V0IGZsYWdzIGFuZCBtZXRhIGRhdGEgKi8KKwllbmFfdHhfY3N1bSgmZW5hX3R4X2N0eCwgc2tiKTsKKworCS8qIHByZXBhcmUgdGhlIHBhY2tldCdzIGRlc2NyaXB0b3JzIHRvIGRtYSBlbmdpbmUgKi8KKwlyYyA9IGVuYV9jb21fcHJlcGFyZV90eCh0eF9yaW5nLT5lbmFfY29tX2lvX3NxLCAmZW5hX3R4X2N0eCwKKwkJCQkmbmJfaHdfZGVzYyk7CisKKwlpZiAodW5saWtlbHkocmMpKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCB0eF9xdWV1ZWQsIGRldiwKKwkJCSAgImZhaWxlZCB0byBwcmVwYXJlIHR4IGJ1ZnNcbiIpOworCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZ0eF9yaW5nLT5zeW5jcCk7CisJCXR4X3JpbmctPnR4X3N0YXRzLnF1ZXVlX3N0b3ArKzsKKwkJdHhfcmluZy0+dHhfc3RhdHMucHJlcGFyZV9jdHhfZXJyKys7CisJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZ0eF9yaW5nLT5zeW5jcCk7CisJCW5ldGlmX3R4X3N0b3BfcXVldWUodHhxKTsKKwkJZ290byBlcnJvcl91bm1hcF9kbWE7CisJfQorCisJbmV0ZGV2X3R4X3NlbnRfcXVldWUodHhxLCBza2ItPmxlbik7CisKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZ0eF9yaW5nLT5zeW5jcCk7CisJdHhfcmluZy0+dHhfc3RhdHMuY250Kys7CisJdHhfcmluZy0+dHhfc3RhdHMuYnl0ZXMgKz0gc2tiLT5sZW47CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnR4X3JpbmctPnN5bmNwKTsKKworCXR4X2luZm8tPnR4X2Rlc2NzID0gbmJfaHdfZGVzYzsKKwl0eF9pbmZvLT5sYXN0X2ppZmZpZXMgPSBqaWZmaWVzOworCisJdHhfcmluZy0+bmV4dF90b191c2UgPSBFTkFfVFhfUklOR19JRFhfTkVYVChuZXh0X3RvX3VzZSwKKwkJdHhfcmluZy0+cmluZ19zaXplKTsKKworCS8qIFRoaXMgV01CIGlzIGFpbWVkIHRvOgorCSAqIDEgLSBwZXJmb3JtIHNtcCBiYXJyaWVyIGJlZm9yZSByZWFkaW5nIG5leHRfdG9fY29tcGxldGlvbgorCSAqIDIgLSBtYWtlIHN1cmUgdGhlIGRlc2Mgd2VyZSB3cml0dGVuIGJlZm9yZSB0cmlnZ2VyIERCCisJICovCisJd21iKCk7CisKKwkvKiBzdG9wIHRoZSBxdWV1ZSB3aGVuIG5vIG1vcmUgc3BhY2UgYXZhaWxhYmxlLCB0aGUgcGFja2V0IGNhbiBoYXZlIHVwCisJICogdG8gc2dsX3NpemUgKyAyLiBvbmUgZm9yIHRoZSBtZXRhIGRlc2NyaXB0b3IgYW5kIG9uZSBmb3IgaGVhZGVyCisJICogKGlmIHRoZSBoZWFkZXIgaXMgbGFyZ2VyIHRoYW4gdHhfbWF4X2hlYWRlcl9zaXplKS4KKwkgKi8KKwlpZiAodW5saWtlbHkoZW5hX2NvbV9zcV9lbXB0eV9zcGFjZSh0eF9yaW5nLT5lbmFfY29tX2lvX3NxKSA8CisJCSAgICAgKHR4X3JpbmctPnNnbF9zaXplICsgMikpKSB7CisJCW5ldGlmX2RiZyhhZGFwdGVyLCB0eF9xdWV1ZWQsIGRldiwgIiVzIHN0b3AgcXVldWUgJWRcbiIsCisJCQkgIF9fZnVuY19fLCBxaWQpOworCisJCW5ldGlmX3R4X3N0b3BfcXVldWUodHhxKTsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmdHhfcmluZy0+c3luY3ApOworCQl0eF9yaW5nLT50eF9zdGF0cy5xdWV1ZV9zdG9wKys7CisJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZ0eF9yaW5nLT5zeW5jcCk7CisKKwkJLyogVGhlcmUgaXMgYSByYXJlIGNvbmRpdGlvbiB3aGVyZSB0aGlzIGZ1bmN0aW9uIGRlY2lkZSB0bworCQkgKiBzdG9wIHRoZSBxdWV1ZSBidXQgbWVhbndoaWxlIGNsZWFuX3R4X2lycSB1cGRhdGVzCisJCSAqIG5leHRfdG9fY29tcGxldGlvbiBhbmQgdGVybWluYXRlcy4KKwkJICogVGhlIHF1ZXVlIHdpbGwgcmVtYWluIHN0b3BwZWQgZm9yZXZlci4KKwkJICogVG8gc29sdmUgdGhpcyBpc3N1ZSB0aGlzIGZ1bmN0aW9uIHBlcmZvcm0gcm1iLCBjaGVjaworCQkgKiB0aGUgd2FrZXVwIGNvbmRpdGlvbiBhbmQgd2FrZSB1cCB0aGUgcXVldWUgaWYgbmVlZGVkLgorCQkgKi8KKwkJc21wX3JtYigpOworCisJCWlmIChlbmFfY29tX3NxX2VtcHR5X3NwYWNlKHR4X3JpbmctPmVuYV9jb21faW9fc3EpCisJCQkJPiBFTkFfVFhfV0FLRVVQX1RIUkVTSCkgeworCQkJbmV0aWZfdHhfd2FrZV9xdWV1ZSh0eHEpOworCQkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmdHhfcmluZy0+c3luY3ApOworCQkJdHhfcmluZy0+dHhfc3RhdHMucXVldWVfd2FrZXVwKys7CisJCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmdHhfcmluZy0+c3luY3ApOworCQl9CisJfQorCisJaWYgKG5ldGlmX3htaXRfc3RvcHBlZCh0eHEpIHx8ICFza2ItPnhtaXRfbW9yZSkgeworCQkvKiB0cmlnZ2VyIHRoZSBkbWEgZW5naW5lICovCisJCWVuYV9jb21fd3JpdGVfc3FfZG9vcmJlbGwodHhfcmluZy0+ZW5hX2NvbV9pb19zcSk7CisJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnR4X3JpbmctPnN5bmNwKTsKKwkJdHhfcmluZy0+dHhfc3RhdHMuZG9vcmJlbGxzKys7CisJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZ0eF9yaW5nLT5zeW5jcCk7CisJfQorCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKKworZXJyb3JfcmVwb3J0X2RtYV9lcnJvcjoKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZ0eF9yaW5nLT5zeW5jcCk7CisJdHhfcmluZy0+dHhfc3RhdHMuZG1hX21hcHBpbmdfZXJyKys7CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnR4X3JpbmctPnN5bmNwKTsKKwluZXRkZXZfd2FybihhZGFwdGVyLT5uZXRkZXYsICJmYWlsZWQgdG8gbWFwIHNrYlxuIik7CisKKwl0eF9pbmZvLT5za2IgPSBOVUxMOworCitlcnJvcl91bm1hcF9kbWE6CisJaWYgKGkgPj0gMCkgeworCQkvKiBzYXZlIHZhbHVlIG9mIGZyYWcgdGhhdCBmYWlsZWQgKi8KKwkJbGFzdF9mcmFnID0gaTsKKworCQkvKiBzdGFydCBiYWNrIGF0IGJlZ2lubmluZyBhbmQgdW5tYXAgc2tiICovCisJCXR4X2luZm8tPnNrYiA9IE5VTEw7CisJCWVuYV9idWYgPSB0eF9pbmZvLT5idWZzOworCQlkbWFfdW5tYXBfc2luZ2xlKHR4X3JpbmctPmRldiwgZG1hX3VubWFwX2FkZHIoZW5hX2J1ZiwgcGFkZHIpLAorCQkJCSBkbWFfdW5tYXBfbGVuKGVuYV9idWYsIGxlbiksIERNQV9UT19ERVZJQ0UpOworCisJCS8qIHVubWFwIHJlbWFpbmluZyBtYXBwZWQgcGFnZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGxhc3RfZnJhZzsgaSsrKSB7CisJCQllbmFfYnVmKys7CisJCQlkbWFfdW5tYXBfcGFnZSh0eF9yaW5nLT5kZXYsIGRtYV91bm1hcF9hZGRyKGVuYV9idWYsIHBhZGRyKSwKKwkJCQkgICAgICAgZG1hX3VubWFwX2xlbihlbmFfYnVmLCBsZW4pLCBETUFfVE9fREVWSUNFKTsKKwkJfQorCX0KKworZXJyb3JfZHJvcF9wYWNrZXQ6CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBlbmFfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKQorCQluYXBpX3NjaGVkdWxlKCZhZGFwdGVyLT5lbmFfbmFwaVtpXS5uYXBpKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiAqLworCitzdGF0aWMgdTE2IGVuYV9zZWxlY3RfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICB2b2lkICphY2NlbF9wcml2LCBzZWxlY3RfcXVldWVfZmFsbGJhY2tfdCBmYWxsYmFjaykKK3sKKwl1MTYgcWlkOworCS8qIHdlIHN1c3BlY3QgdGhhdCB0aGlzIGlzIGdvb2QgZm9yIGluLS1rZXJuZWwgbmV0d29yayBzZXJ2aWNlcyB0aGF0CisJICogd2FudCB0byBsb29wIGluY29taW5nIHNrYiByeCB0byB0eCBpbiBub3JtYWwgdXNlciBnZW5lcmF0ZWQgdHJhZmZpYywKKwkgKiBtb3N0IHByb2JhYmx5IHdlIHdpbGwgbm90IGdldCB0byB0aGlzCisJICovCisJaWYgKHNrYl9yeF9xdWV1ZV9yZWNvcmRlZChza2IpKQorCQlxaWQgPSBza2JfZ2V0X3J4X3F1ZXVlKHNrYik7CisJZWxzZQorCQlxaWQgPSBmYWxsYmFjayhkZXYsIHNrYik7CisKKwlyZXR1cm4gcWlkOworfQorCitzdGF0aWMgdm9pZCBlbmFfY29uZmlnX2hvc3RfaW5mbyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9hZG1pbl9ob3N0X2luZm8gKmhvc3RfaW5mbzsKKwlpbnQgcmM7CisKKwkvKiBBbGxvY2F0ZSBvbmx5IHRoZSBob3N0IGluZm8gKi8KKwlyYyA9IGVuYV9jb21fYWxsb2NhdGVfaG9zdF9pbmZvKGVuYV9kZXYpOworCWlmIChyYykgeworCQlwcl9lcnIoIkNhbm5vdCBhbGxvY2F0ZSBob3N0IGluZm9cbiIpOworCQlyZXR1cm47CisJfQorCisJaG9zdF9pbmZvID0gZW5hX2Rldi0+aG9zdF9hdHRyLmhvc3RfaW5mbzsKKworCWhvc3RfaW5mby0+b3NfdHlwZSA9IEVOQV9BRE1JTl9PU19MSU5VWDsKKwlob3N0X2luZm8tPmtlcm5lbF92ZXIgPSBMSU5VWF9WRVJTSU9OX0NPREU7CisJc3RybmNweShob3N0X2luZm8tPmtlcm5lbF92ZXJfc3RyLCB1dHNuYW1lKCktPnZlcnNpb24sCisJCXNpemVvZihob3N0X2luZm8tPmtlcm5lbF92ZXJfc3RyKSAtIDEpOworCWhvc3RfaW5mby0+b3NfZGlzdCA9IDA7CisJc3RybmNweShob3N0X2luZm8tPm9zX2Rpc3Rfc3RyLCB1dHNuYW1lKCktPnJlbGVhc2UsCisJCXNpemVvZihob3N0X2luZm8tPm9zX2Rpc3Rfc3RyKSAtIDEpOworCWhvc3RfaW5mby0+ZHJpdmVyX3ZlcnNpb24gPQorCQkoRFJWX01PRFVMRV9WRVJfTUFKT1IpIHwKKwkJKERSVl9NT0RVTEVfVkVSX01JTk9SIDw8IEVOQV9BRE1JTl9IT1NUX0lORk9fTUlOT1JfU0hJRlQpIHwKKwkJKERSVl9NT0RVTEVfVkVSX1NVQk1JTk9SIDw8IEVOQV9BRE1JTl9IT1NUX0lORk9fU1VCX01JTk9SX1NISUZUKTsKKworCXJjID0gZW5hX2NvbV9zZXRfaG9zdF9hdHRyaWJ1dGVzKGVuYV9kZXYpOworCWlmIChyYykgeworCQlpZiAocmMgPT0gLUVQRVJNKQorCQkJcHJfd2FybigiQ2Fubm90IHNldCBob3N0IGF0dHJpYnV0ZXNcbiIpOworCQllbHNlCisJCQlwcl9lcnIoIkNhbm5vdCBzZXQgaG9zdCBhdHRyaWJ1dGVzXG4iKTsKKworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm47CisKK2VycjoKKwllbmFfY29tX2RlbGV0ZV9ob3N0X2luZm8oZW5hX2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9jb25maWdfZGVidWdfYXJlYShzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIGRlYnVnX2FyZWFfc2l6ZTsKKwlpbnQgcmMsIHNzX2NvdW50OworCisJc3NfY291bnQgPSBlbmFfZ2V0X3NzZXRfY291bnQoYWRhcHRlci0+bmV0ZGV2LCBFVEhfU1NfU1RBVFMpOworCWlmIChzc19jb3VudCA8PSAwKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIGFkYXB0ZXItPm5ldGRldiwKKwkJCSAgIlNTIGNvdW50IGlzIG5lZ2F0aXZlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGFsbG9jYXRlIDMyIGJ5dGVzIGZvciBlYWNoIHN0cmluZyBhbmQgNjRiaXQgZm9yIHRoZSB2YWx1ZSAqLworCWRlYnVnX2FyZWFfc2l6ZSA9IHNzX2NvdW50ICogRVRIX0dTVFJJTkdfTEVOICsgc2l6ZW9mKHU2NCkgKiBzc19jb3VudDsKKworCXJjID0gZW5hX2NvbV9hbGxvY2F0ZV9kZWJ1Z19hcmVhKGFkYXB0ZXItPmVuYV9kZXYsIGRlYnVnX2FyZWFfc2l6ZSk7CisJaWYgKHJjKSB7CisJCXByX2VycigiQ2Fubm90IGFsbG9jYXRlIGRlYnVnIGFyZWFcbiIpOworCQlyZXR1cm47CisJfQorCisJcmMgPSBlbmFfY29tX3NldF9ob3N0X2F0dHJpYnV0ZXMoYWRhcHRlci0+ZW5hX2Rldik7CisJaWYgKHJjKSB7CisJCWlmIChyYyA9PSAtRVBFUk0pCisJCQluZXRpZl93YXJuKGFkYXB0ZXIsIGRydiwgYWRhcHRlci0+bmV0ZGV2LAorCQkJCSAgICJDYW5ub3Qgc2V0IGhvc3QgYXR0cmlidXRlc1xuIik7CisJCWVsc2UKKwkJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIGFkYXB0ZXItPm5ldGRldiwKKwkJCQkgICJDYW5ub3Qgc2V0IGhvc3QgYXR0cmlidXRlc1xuIik7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybjsKK2VycjoKKwllbmFfY29tX2RlbGV0ZV9kZWJ1Z19hcmVhKGFkYXB0ZXItPmVuYV9kZXYpOworfQorCitzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICplbmFfZ2V0X3N0YXRzNjQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkJCSBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGVuYV9hZG1pbl9iYXNpY19zdGF0cyBlbmFfc3RhdHM7CisJaW50IHJjOworCisJaWYgKCF0ZXN0X2JpdChFTkFfRkxBR19ERVZfVVAsICZhZGFwdGVyLT5mbGFncykpCisJCXJldHVybiBOVUxMOworCisJcmMgPSBlbmFfY29tX2dldF9kZXZfYmFzaWNfc3RhdHMoYWRhcHRlci0+ZW5hX2RldiwgJmVuYV9zdGF0cyk7CisJaWYgKHJjKQorCQlyZXR1cm4gTlVMTDsKKworCXN0YXRzLT50eF9ieXRlcyA9ICgodTY0KWVuYV9zdGF0cy50eF9ieXRlc19oaWdoIDw8IDMyKSB8CisJCWVuYV9zdGF0cy50eF9ieXRlc19sb3c7CisJc3RhdHMtPnJ4X2J5dGVzID0gKCh1NjQpZW5hX3N0YXRzLnJ4X2J5dGVzX2hpZ2ggPDwgMzIpIHwKKwkJZW5hX3N0YXRzLnJ4X2J5dGVzX2xvdzsKKworCXN0YXRzLT5yeF9wYWNrZXRzID0gKCh1NjQpZW5hX3N0YXRzLnJ4X3BrdHNfaGlnaCA8PCAzMikgfAorCQllbmFfc3RhdHMucnhfcGt0c19sb3c7CisJc3RhdHMtPnR4X3BhY2tldHMgPSAoKHU2NCllbmFfc3RhdHMudHhfcGt0c19oaWdoIDw8IDMyKSB8CisJCWVuYV9zdGF0cy50eF9wa3RzX2xvdzsKKworCXN0YXRzLT5yeF9kcm9wcGVkID0gKCh1NjQpZW5hX3N0YXRzLnJ4X2Ryb3BzX2hpZ2ggPDwgMzIpIHwKKwkJZW5hX3N0YXRzLnJ4X2Ryb3BzX2xvdzsKKworCXN0YXRzLT5tdWx0aWNhc3QgPSAwOworCXN0YXRzLT5jb2xsaXNpb25zID0gMDsKKworCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzID0gMDsKKwlzdGF0cy0+cnhfY3JjX2Vycm9ycyA9IDA7CisJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyA9IDA7CisJc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzID0gMDsKKwlzdGF0cy0+cnhfbWlzc2VkX2Vycm9ycyA9IDA7CisJc3RhdHMtPnR4X3dpbmRvd19lcnJvcnMgPSAwOworCisJc3RhdHMtPnJ4X2Vycm9ycyA9IDA7CisJc3RhdHMtPnR4X2Vycm9ycyA9IDA7CisKKwlyZXR1cm4gc3RhdHM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZW5hX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IGVuYV9vcGVuLAorCS5uZG9fc3RvcAkJPSBlbmFfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IGVuYV9zdGFydF94bWl0LAorCS5uZG9fc2VsZWN0X3F1ZXVlCT0gZW5hX3NlbGVjdF9xdWV1ZSwKKwkubmRvX2dldF9zdGF0czY0CT0gZW5hX2dldF9zdGF0czY0LAorCS5uZG9fdHhfdGltZW91dAkJPSBlbmFfdHhfdGltZW91dCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZW5hX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBOVUxMLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBlbmFfbmV0cG9sbCwKKyNlbmRpZiAvKiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiAqLworfTsKKworc3RhdGljIHZvaWQgZW5hX2RldmljZV9pb19zdXNwZW5kKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGVuYV9hZGFwdGVyLCBzdXNwZW5kX2lvX3Rhc2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisKKwkvKiBlbmFfbmFwaV9kaXNhYmxlX2FsbCBkaXNhYmxlcyBvbmx5IHRoZSBJTyBoYW5kbGluZy4KKwkgKiBXZSBhcmUgc3RpbGwgc3ViamVjdCB0byBBRU5RIGtlZXAgYWxpdmUgd2F0Y2hkb2cuCisJICovCisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmYWRhcHRlci0+c3luY3ApOworCWFkYXB0ZXItPmRldl9zdGF0cy5pb19zdXNwZW5kKys7CisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmYWRhcHRlci0+c3luY3ApOworCWVuYV9uYXBpX2Rpc2FibGVfYWxsKGFkYXB0ZXIpOworCW5ldGlmX3R4X2xvY2sobmV0ZGV2KTsKKwluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CisJbmV0aWZfdHhfdW5sb2NrKG5ldGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9kZXZpY2VfaW9fcmVzdW1lKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGVuYV9hZGFwdGVyLCByZXN1bWVfaW9fdGFzayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKworCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJmFkYXB0ZXItPnN5bmNwKTsKKwlhZGFwdGVyLT5kZXZfc3RhdHMuaW9fcmVzdW1lKys7CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJmFkYXB0ZXItPnN5bmNwKTsKKworCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKKwllbmFfbmFwaV9lbmFibGVfYWxsKGFkYXB0ZXIpOworfQorCitzdGF0aWMgaW50IGVuYV9kZXZpY2VfdmFsaWRhdGVfcGFyYW1zKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgICAgICBzdHJ1Y3QgZW5hX2NvbV9kZXZfZ2V0X2ZlYXR1cmVzX2N0eCAqZ2V0X2ZlYXRfY3R4KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJaW50IHJjOworCisJcmMgPSBldGhlcl9hZGRyX2VxdWFsKGdldF9mZWF0X2N0eC0+ZGV2X2F0dHIubWFjX2FkZHIsCisJCQkgICAgICBhZGFwdGVyLT5tYWNfYWRkcik7CisJaWYgKCFyYykgeworCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBuZXRkZXYsCisJCQkgICJFcnJvciwgbWFjIGFkZHJlc3MgYXJlIGRpZmZlcmVudFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgoZ2V0X2ZlYXRfY3R4LT5tYXhfcXVldWVzLm1heF9jcV9udW0gPCBhZGFwdGVyLT5udW1fcXVldWVzKSB8fAorCSAgICAoZ2V0X2ZlYXRfY3R4LT5tYXhfcXVldWVzLm1heF9zcV9udW0gPCBhZGFwdGVyLT5udW1fcXVldWVzKSkgeworCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBuZXRkZXYsCisJCQkgICJFcnJvciwgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBlbm91Z2ggcXVldWVzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGdldF9mZWF0X2N0eC0+ZGV2X2F0dHIubWF4X210dSA8IG5ldGRldi0+bXR1KSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIG5ldGRldiwKKwkJCSAgIkVycm9yLCBkZXZpY2UgbWF4IG10dSBpcyBzbWFsbGVyIHRoYW4gbmV0ZGV2IE1UVVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuYV9kZXZpY2VfaW5pdChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJICAgc3RydWN0IGVuYV9jb21fZGV2X2dldF9mZWF0dXJlc19jdHggKmdldF9mZWF0X2N0eCwKKwkJCSAgIGJvb2wgKndkX3N0YXRlKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJYm9vbCByZWFkbGVzc19zdXBwb3J0ZWQ7CisJdTMyIGFlbnFfZ3JvdXBzOworCWludCBkbWFfd2lkdGg7CisJaW50IHJjOworCisJcmMgPSBlbmFfY29tX21taW9fcmVnX3JlYWRfcmVxdWVzdF9pbml0KGVuYV9kZXYpOworCWlmIChyYykgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBpbml0IG1taW8gcmVhZCBsZXNzXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIFRoZSBQQ0llIGNvbmZpZ3VyYXRpb24gc3BhY2UgcmV2aXNpb24gaWQgaW5kaWNhdGUgaWYgbW1pbyByZWcKKwkgKiByZWFkIGlzIGRpc2FibGVkCisJICovCisJcmVhZGxlc3Nfc3VwcG9ydGVkID0gIShwZGV2LT5yZXZpc2lvbiAmIEVOQV9NTUlPX0RJU0FCTEVfUkVHX1JFQUQpOworCWVuYV9jb21fc2V0X21taW9fcmVhZF9tb2RlKGVuYV9kZXYsIHJlYWRsZXNzX3N1cHBvcnRlZCk7CisKKwlyYyA9IGVuYV9jb21fZGV2X3Jlc2V0KGVuYV9kZXYpOworCWlmIChyYykgeworCQlkZXZfZXJyKGRldiwgIkNhbiBub3QgcmVzZXQgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfbW1pb19yZWFkX2xlc3M7CisJfQorCisJcmMgPSBlbmFfY29tX3ZhbGlkYXRlX3ZlcnNpb24oZW5hX2Rldik7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoZGV2LCAiZGV2aWNlIHZlcnNpb24gaXMgdG9vIGxvd1xuIik7CisJCWdvdG8gZXJyX21taW9fcmVhZF9sZXNzOworCX0KKworCWRtYV93aWR0aCA9IGVuYV9jb21fZ2V0X2RtYV93aWR0aChlbmFfZGV2KTsKKwlpZiAoZG1hX3dpZHRoIDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkludmFsaWQgZG1hIHdpZHRoIHZhbHVlICVkIiwgZG1hX3dpZHRoKTsKKwkJcmMgPSBkbWFfd2lkdGg7CisJCWdvdG8gZXJyX21taW9fcmVhZF9sZXNzOworCX0KKworCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soZG1hX3dpZHRoKSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoZGV2LCAicGNpX3NldF9kbWFfbWFzayBmYWlsZWQgMHgleFxuIiwgcmMpOworCQlnb3RvIGVycl9tbWlvX3JlYWRfbGVzczsKKwl9CisKKwlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soZG1hX3dpZHRoKSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoZGV2LCAiZXJyX3BjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayBmYWlsZWQgMHgleFxuIiwKKwkJCXJjKTsKKwkJZ290byBlcnJfbW1pb19yZWFkX2xlc3M7CisJfQorCisJLyogRU5BIGFkbWluIGxldmVsIGluaXQgKi8KKwlyYyA9IGVuYV9jb21fYWRtaW5faW5pdChlbmFfZGV2LCAmYWVucV9oYW5kbGVycywgdHJ1ZSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoZGV2LAorCQkJIkNhbiBub3QgaW5pdGlhbGl6ZSBlbmEgYWRtaW4gcXVldWUgd2l0aCBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9tbWlvX3JlYWRfbGVzczsKKwl9CisKKwkvKiBUbyBlbmFibGUgdGhlIG1zaXggaW50ZXJydXB0cyB0aGUgZHJpdmVyIG5lZWRzIHRvIGtub3cgdGhlIG51bWJlcgorCSAqIG9mIHF1ZXVlcy4gU28gdGhlIGRyaXZlciB1c2VzIHBvbGxpbmcgbW9kZSB0byByZXRyaWV2ZSB0aGlzCisJICogaW5mb3JtYXRpb24KKwkgKi8KKwllbmFfY29tX3NldF9hZG1pbl9wb2xsaW5nX21vZGUoZW5hX2RldiwgdHJ1ZSk7CisKKwkvKiBHZXQgRGV2aWNlIEF0dHJpYnV0ZXMqLworCXJjID0gZW5hX2NvbV9nZXRfZGV2X2F0dHJfZmVhdChlbmFfZGV2LCBnZXRfZmVhdF9jdHgpOworCWlmIChyYykgeworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBnZXQgYXR0cmlidXRlIGZvciBlbmEgZGV2aWNlIHJjPSVkXG4iLCByYyk7CisJCWdvdG8gZXJyX2FkbWluX2luaXQ7CisJfQorCisJLyogVHJ5IHRvIHR1cm4gYWxsIHRoZSBhdmFpbGFibGUgYWVucSBncm91cHMgKi8KKwlhZW5xX2dyb3VwcyA9IEJJVChFTkFfQURNSU5fTElOS19DSEFOR0UpIHwKKwkJQklUKEVOQV9BRE1JTl9GQVRBTF9FUlJPUikgfAorCQlCSVQoRU5BX0FETUlOX1dBUk5JTkcpIHwKKwkJQklUKEVOQV9BRE1JTl9OT1RJRklDQVRJT04pIHwKKwkJQklUKEVOQV9BRE1JTl9LRUVQX0FMSVZFKTsKKworCWFlbnFfZ3JvdXBzICY9IGdldF9mZWF0X2N0eC0+YWVucS5zdXBwb3J0ZWRfZ3JvdXBzOworCisJcmMgPSBlbmFfY29tX3NldF9hZW5xX2NvbmZpZyhlbmFfZGV2LCBhZW5xX2dyb3Vwcyk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGNvbmZpZ3VyZSBhZW5xIGdyb3VwcyByYz0gJWRcbiIsIHJjKTsKKwkJZ290byBlcnJfYWRtaW5faW5pdDsKKwl9CisKKwkqd2Rfc3RhdGUgPSAhIShhZW5xX2dyb3VwcyAmIEJJVChFTkFfQURNSU5fS0VFUF9BTElWRSkpOworCisJZW5hX2NvbmZpZ19ob3N0X2luZm8oZW5hX2Rldik7CisKKwlyZXR1cm4gMDsKKworZXJyX2FkbWluX2luaXQ6CisJZW5hX2NvbV9hZG1pbl9kZXN0cm95KGVuYV9kZXYpOworZXJyX21taW9fcmVhZF9sZXNzOgorCWVuYV9jb21fbW1pb19yZWdfcmVhZF9yZXF1ZXN0X2Rlc3Ryb3koZW5hX2Rldik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2VuYWJsZV9tc2l4X2FuZF9zZXRfYWRtaW5faW50ZXJydXB0cyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCQkgICAgaW50IGlvX3ZlY3RvcnMpCit7CisJc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2ID0gYWRhcHRlci0+ZW5hX2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OworCWludCByYzsKKworCXJjID0gZW5hX2VuYWJsZV9tc2l4KGFkYXB0ZXIsIGlvX3ZlY3RvcnMpOworCWlmIChyYykgeworCQlkZXZfZXJyKGRldiwgIkNhbiBub3QgcmVzZXJ2ZSBtc2l4IHZlY3RvcnNcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJZW5hX3NldHVwX21nbW50X2ludHIoYWRhcHRlcik7CisKKwlyYyA9IGVuYV9yZXF1ZXN0X21nbW50X2lycShhZGFwdGVyKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihkZXYsICJDYW4gbm90IHNldHVwIG1hbmFnZW1lbnQgaW50ZXJydXB0c1xuIik7CisJCWdvdG8gZXJyX2Rpc2FibGVfbXNpeDsKKwl9CisKKwllbmFfY29tX3NldF9hZG1pbl9wb2xsaW5nX21vZGUoZW5hX2RldiwgZmFsc2UpOworCisJZW5hX2NvbV9hZG1pbl9hZW5xX2VuYWJsZShlbmFfZGV2KTsKKworCXJldHVybiAwOworCitlcnJfZGlzYWJsZV9tc2l4OgorCWVuYV9kaXNhYmxlX21zaXgoYWRhcHRlcik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9md19yZXNldF9kZXZpY2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBlbmFfY29tX2Rldl9nZXRfZmVhdHVyZXNfY3R4IGdldF9mZWF0X2N0eDsKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGVuYV9hZGFwdGVyLCByZXNldF90YXNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiA9IGFkYXB0ZXItPmVuYV9kZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCWJvb2wgZGV2X3VwLCB3ZF9zdGF0ZTsKKwlpbnQgcmM7CisKKwlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+dGltZXJfc2VydmljZSk7CisKKwlydG5sX2xvY2soKTsKKworCWRldl91cCA9IHRlc3RfYml0KEVOQV9GTEFHX0RFVl9VUCwgJmFkYXB0ZXItPmZsYWdzKTsKKwllbmFfY29tX3NldF9hZG1pbl9ydW5uaW5nX3N0YXRlKGVuYV9kZXYsIGZhbHNlKTsKKworCS8qIEFmdGVyIGNhbGxpbmcgZW5hX2Nsb3NlIHRoZSB0eCBxdWV1ZXMgYW5kIHRoZSBuYXBpCisJICogYXJlIGRpc2FibGVkIHNvIG5vIG9uZSBjYW4gaW50ZXJmZXJlIG9yIHRvdWNoIHRoZQorCSAqIGRhdGEgc3RydWN0dXJlcworCSAqLworCWVuYV9jbG9zZShuZXRkZXYpOworCisJcmMgPSBlbmFfY29tX2Rldl9yZXNldChlbmFfZGV2KTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRGV2aWNlIHJlc2V0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCWVuYV9mcmVlX21nbW50X2lycShhZGFwdGVyKTsKKworCWVuYV9kaXNhYmxlX21zaXgoYWRhcHRlcik7CisKKwllbmFfY29tX2Fib3J0X2FkbWluX2NvbW1hbmRzKGVuYV9kZXYpOworCisJZW5hX2NvbV93YWl0X2Zvcl9hYm9ydF9jb21wbGV0aW9uKGVuYV9kZXYpOworCisJZW5hX2NvbV9hZG1pbl9kZXN0cm95KGVuYV9kZXYpOworCisJZW5hX2NvbV9tbWlvX3JlZ19yZWFkX3JlcXVlc3RfZGVzdHJveShlbmFfZGV2KTsKKworCS8qIEZpbmlzaCB3aXRoIHRoZSBkZXN0cm95IHBhcnQuIFN0YXJ0IHRoZSBpbml0IHBhcnQgKi8KKworCXJjID0gZW5hX2RldmljZV9pbml0KGVuYV9kZXYsIGFkYXB0ZXItPnBkZXYsICZnZXRfZmVhdF9jdHgsICZ3ZF9zdGF0ZSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbiBub3QgaW5pdGlhbGl6ZSBkZXZpY2VcbiIpOworCQlnb3RvIGVycjsKKwl9CisJYWRhcHRlci0+d2Rfc3RhdGUgPSB3ZF9zdGF0ZTsKKworCXJjID0gZW5hX2RldmljZV92YWxpZGF0ZV9wYXJhbXMoYWRhcHRlciwgJmdldF9mZWF0X2N0eCk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlZhbGlkYXRpb24gb2YgZGV2aWNlIHBhcmFtZXRlcnMgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZGV2aWNlX2Rlc3Ryb3k7CisJfQorCisJcmMgPSBlbmFfZW5hYmxlX21zaXhfYW5kX3NldF9hZG1pbl9pbnRlcnJ1cHRzKGFkYXB0ZXIsCisJCQkJCQkgICAgICBhZGFwdGVyLT5udW1fcXVldWVzKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRW5hYmxlIE1TSS1YIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2RldmljZV9kZXN0cm95OworCX0KKwkvKiBJZiB0aGUgaW50ZXJmYWNlIHdhcyB1cCBiZWZvcmUgdGhlIHJlc2V0IGJyaW5nIGl0IHVwICovCisJaWYgKGRldl91cCkgeworCQlyYyA9IGVuYV91cChhZGFwdGVyKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gY3JlYXRlIEkvTyBxdWV1ZXNcbiIpOworCQkJZ290byBlcnJfZGlzYWJsZV9tc2l4OworCQl9CisJfQorCisJbW9kX3RpbWVyKCZhZGFwdGVyLT50aW1lcl9zZXJ2aWNlLCByb3VuZF9qaWZmaWVzKGppZmZpZXMgKyBIWikpOworCisJcnRubF91bmxvY2soKTsKKworCWRldl9lcnIoJnBkZXYtPmRldiwgIkRldmljZSByZXNldCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKKworCXJldHVybjsKK2Vycl9kaXNhYmxlX21zaXg6CisJZW5hX2ZyZWVfbWdtbnRfaXJxKGFkYXB0ZXIpOworCWVuYV9kaXNhYmxlX21zaXgoYWRhcHRlcik7CitlcnJfZGV2aWNlX2Rlc3Ryb3k6CisJZW5hX2NvbV9hZG1pbl9kZXN0cm95KGVuYV9kZXYpOworZXJyOgorCXJ0bmxfdW5sb2NrKCk7CisKKwlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCSJSZXNldCBhdHRlbXB0IGZhaWxlZC4gQ2FuIG5vdCByZXNldCB0aGUgZGV2aWNlXG4iKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfZm9yX21pc3NpbmdfdHhfY29tcGxldGlvbnMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlbmFfdHhfYnVmZmVyICp0eF9idWY7CisJdW5zaWduZWQgbG9uZyBsYXN0X2ppZmZpZXM7CisJc3RydWN0IGVuYV9yaW5nICp0eF9yaW5nOworCWludCBpLCBqLCBidWRnZXQ7CisJdTMyIG1pc3NlZF90eDsKKworCS8qIE1ha2Ugc3VyZSB0aGUgZHJpdmVyIGRvZXNuJ3QgdHVybiB0aGUgZGV2aWNlIGluIG90aGVyIHByb2Nlc3MgKi8KKwlzbXBfcm1iKCk7CisKKwlpZiAoIXRlc3RfYml0KEVOQV9GTEFHX0RFVl9VUCwgJmFkYXB0ZXItPmZsYWdzKSkKKwkJcmV0dXJuOworCisJYnVkZ2V0ID0gRU5BX01PTklUT1JFRF9UWF9RVUVVRVM7CisKKwlmb3IgKGkgPSBhZGFwdGVyLT5sYXN0X21vbml0b3JlZF90eF9xaWQ7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspIHsKKwkJdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nW2ldOworCisJCWZvciAoaiA9IDA7IGogPCB0eF9yaW5nLT5yaW5nX3NpemU7IGorKykgeworCQkJdHhfYnVmID0gJnR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvW2pdOworCQkJbGFzdF9qaWZmaWVzID0gdHhfYnVmLT5sYXN0X2ppZmZpZXM7CisJCQlpZiAodW5saWtlbHkobGFzdF9qaWZmaWVzICYmIHRpbWVfaXNfYmVmb3JlX2ppZmZpZXMobGFzdF9qaWZmaWVzICsgVFhfVElNRU9VVCkpKSB7CisJCQkJbmV0aWZfbm90aWNlKGFkYXB0ZXIsIHR4X2VyciwgYWRhcHRlci0+bmV0ZGV2LAorCQkJCQkgICAgICJGb3VuZCBhIFR4IHRoYXQgd2Fzbid0IGNvbXBsZXRlZCBvbiB0aW1lLCBxaWQgJWQsIGluZGV4ICVkLlxuIiwKKwkJCQkJICAgICB0eF9yaW5nLT5xaWQsIGopOworCisJCQkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmdHhfcmluZy0+c3luY3ApOworCQkJCW1pc3NlZF90eCA9IHR4X3JpbmctPnR4X3N0YXRzLm1pc3NpbmdfdHhfY29tcCsrOworCQkJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZ0eF9yaW5nLT5zeW5jcCk7CisKKwkJCQkvKiBDbGVhciBsYXN0IGppZmZpZXMgc28gdGhlIGxvc3QgYnVmZmVyIHdvbid0CisJCQkJICogYmUgY291bnRlZCB0d2ljZS4KKwkJCQkgKi8KKwkJCQl0eF9idWYtPmxhc3RfamlmZmllcyA9IDA7CisKKwkJCQlpZiAodW5saWtlbHkobWlzc2VkX3R4ID4gTUFYX05VTV9PRl9USU1FT1VURURfUEFDS0VUUykpIHsKKwkJCQkJbmV0aWZfZXJyKGFkYXB0ZXIsIHR4X2VyciwgYWRhcHRlci0+bmV0ZGV2LAorCQkJCQkJICAiVGhlIG51bWJlciBvZiBsb3N0IHR4IGNvbXBsZXRpb24gaXMgYWJvdmUgdGhlIHRocmVzaG9sZCAoJWQgPiAlZCkuIFJlc2V0IHRoZSBkZXZpY2VcbiIsCisJCQkJCQkgIG1pc3NlZF90eCwgTUFYX05VTV9PRl9USU1FT1VURURfUEFDS0VUUyk7CisJCQkJCXNldF9iaXQoRU5BX0ZMQUdfVFJJR0dFUl9SRVNFVCwgJmFkYXB0ZXItPmZsYWdzKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlidWRnZXQtLTsKKwkJaWYgKCFidWRnZXQpCisJCQlicmVhazsKKwl9CisKKwlhZGFwdGVyLT5sYXN0X21vbml0b3JlZF90eF9xaWQgPSBpICUgYWRhcHRlci0+bnVtX3F1ZXVlczsKK30KKworLyogQ2hlY2sgZm9yIGtlZXAgYWxpdmUgZXhwaXJhdGlvbiAqLworc3RhdGljIHZvaWQgY2hlY2tfZm9yX21pc3Npbmdfa2VlcF9hbGl2ZShzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgbG9uZyBrZWVwX2FsaXZlX2V4cGlyZWQ7CisKKwlpZiAoIWFkYXB0ZXItPndkX3N0YXRlKQorCQlyZXR1cm47CisKKwlrZWVwX2FsaXZlX2V4cGlyZWQgPSByb3VuZF9qaWZmaWVzKGFkYXB0ZXItPmxhc3Rfa2VlcF9hbGl2ZV9qaWZmaWVzCisJCQkJCSAgICsgRU5BX0RFVklDRV9LQUxJVkVfVElNRU9VVCk7CisJaWYgKHVubGlrZWx5KHRpbWVfaXNfYmVmb3JlX2ppZmZpZXMoa2VlcF9hbGl2ZV9leHBpcmVkKSkpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgYWRhcHRlci0+bmV0ZGV2LAorCQkJICAiS2VlcCBhbGl2ZSB3YXRjaGRvZyB0aW1lb3V0LlxuIik7CisJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJmFkYXB0ZXItPnN5bmNwKTsKKwkJYWRhcHRlci0+ZGV2X3N0YXRzLndkX2V4cGlyZWQrKzsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJmFkYXB0ZXItPnN5bmNwKTsKKwkJc2V0X2JpdChFTkFfRkxBR19UUklHR0VSX1JFU0VULCAmYWRhcHRlci0+ZmxhZ3MpOworCX0KK30KKworc3RhdGljIHZvaWQgY2hlY2tfZm9yX2FkbWluX2NvbV9zdGF0ZShzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKHVubGlrZWx5KCFlbmFfY29tX2dldF9hZG1pbl9ydW5uaW5nX3N0YXRlKGFkYXB0ZXItPmVuYV9kZXYpKSkgeworCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBhZGFwdGVyLT5uZXRkZXYsCisJCQkgICJFTkEgYWRtaW4gcXVldWUgaXMgbm90IGluIHJ1bm5pbmcgc3RhdGUhXG4iKTsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmYWRhcHRlci0+c3luY3ApOworCQlhZGFwdGVyLT5kZXZfc3RhdHMuYWRtaW5fcV9wYXVzZSsrOworCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmYWRhcHRlci0+c3luY3ApOworCQlzZXRfYml0KEVOQV9GTEFHX1RSSUdHRVJfUkVTRVQsICZhZGFwdGVyLT5mbGFncyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmFfdXBkYXRlX2hvc3RfaW5mbyhzdHJ1Y3QgZW5hX2FkbWluX2hvc3RfaW5mbyAqaG9zdF9pbmZvLAorCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCWhvc3RfaW5mby0+c3VwcG9ydGVkX25ldHdvcmtfZmVhdHVyZXNbMF0gPQorCQluZXRkZXYtPmZlYXR1cmVzICYgR0VOTUFTS19VTEwoMzEsIDApOworCWhvc3RfaW5mby0+c3VwcG9ydGVkX25ldHdvcmtfZmVhdHVyZXNbMV0gPQorCQkobmV0ZGV2LT5mZWF0dXJlcyAmIEdFTk1BU0tfVUxMKDYzLCAzMikpID4+IDMyOworfQorCitzdGF0aWMgdm9pZCBlbmFfdGltZXJfc2VydmljZSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBlbmFfYWRhcHRlciAqKWRhdGE7CisJdTggKmRlYnVnX2FyZWEgPSBhZGFwdGVyLT5lbmFfZGV2LT5ob3N0X2F0dHIuZGVidWdfYXJlYV92aXJ0X2FkZHI7CisJc3RydWN0IGVuYV9hZG1pbl9ob3N0X2luZm8gKmhvc3RfaW5mbyA9CisJCWFkYXB0ZXItPmVuYV9kZXYtPmhvc3RfYXR0ci5ob3N0X2luZm87CisKKwljaGVja19mb3JfbWlzc2luZ19rZWVwX2FsaXZlKGFkYXB0ZXIpOworCisJY2hlY2tfZm9yX2FkbWluX2NvbV9zdGF0ZShhZGFwdGVyKTsKKworCWNoZWNrX2Zvcl9taXNzaW5nX3R4X2NvbXBsZXRpb25zKGFkYXB0ZXIpOworCisJaWYgKGRlYnVnX2FyZWEpCisJCWVuYV9kdW1wX3N0YXRzX3RvX2J1ZihhZGFwdGVyLCBkZWJ1Z19hcmVhKTsKKworCWlmIChob3N0X2luZm8pCisJCWVuYV91cGRhdGVfaG9zdF9pbmZvKGhvc3RfaW5mbywgYWRhcHRlci0+bmV0ZGV2KTsKKworCWlmICh1bmxpa2VseSh0ZXN0X2FuZF9jbGVhcl9iaXQoRU5BX0ZMQUdfVFJJR0dFUl9SRVNFVCwgJmFkYXB0ZXItPmZsYWdzKSkpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgYWRhcHRlci0+bmV0ZGV2LAorCQkJICAiVHJpZ2dlciByZXNldCBpcyBvblxuIik7CisJCWVuYV9kdW1wX3N0YXRzX3RvX2RtZXNnKGFkYXB0ZXIpOworCQlxdWV1ZV93b3JrKGVuYV93cSwgJmFkYXB0ZXItPnJlc2V0X3Rhc2spOworCQlyZXR1cm47CisJfQorCisJLyogUmVzZXQgdGhlIHRpbWVyICovCisJbW9kX3RpbWVyKCZhZGFwdGVyLT50aW1lcl9zZXJ2aWNlLCBqaWZmaWVzICsgSFopOworfQorCitzdGF0aWMgaW50IGVuYV9jYWxjX2lvX3F1ZXVlX251bShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCSBzdHJ1Y3QgZW5hX2NvbV9kZXZfZ2V0X2ZlYXR1cmVzX2N0eCAqZ2V0X2ZlYXRfY3R4KQoreworCWludCBpb19zcV9udW0sIGlvX3F1ZXVlX251bTsKKworCS8qIEluIGNhc2Ugb2YgTExRIHVzZSB0aGUgbGxxIG51bWJlciBpbiB0aGUgZ2V0IGZlYXR1cmUgY21kICovCisJaWYgKGVuYV9kZXYtPnR4X21lbV9xdWV1ZV90eXBlID09IEVOQV9BRE1JTl9QTEFDRU1FTlRfUE9MSUNZX0RFVikgeworCQlpb19zcV9udW0gPSBnZXRfZmVhdF9jdHgtPm1heF9xdWV1ZXMubWF4X2xscV9udW07CisKKwkJaWYgKGlvX3NxX251bSA9PSAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIlRyeWluZyB0byB1c2UgTExRIGJ1dCBsbHFfbnVtIGlzIDAuIEZhbGwgYmFjayBpbnRvIHJlZ3VsYXIgcXVldWVzXG4iKTsKKworCQkJZW5hX2Rldi0+dHhfbWVtX3F1ZXVlX3R5cGUgPQorCQkJCUVOQV9BRE1JTl9QTEFDRU1FTlRfUE9MSUNZX0hPU1Q7CisJCQlpb19zcV9udW0gPSBnZXRfZmVhdF9jdHgtPm1heF9xdWV1ZXMubWF4X3NxX251bTsKKwkJfQorCX0gZWxzZSB7CisJCWlvX3NxX251bSA9IGdldF9mZWF0X2N0eC0+bWF4X3F1ZXVlcy5tYXhfc3FfbnVtOworCX0KKworCWlvX3F1ZXVlX251bSA9IG1pbl90KGludCwgbnVtX3Bvc3NpYmxlX2NwdXMoKSwgRU5BX01BWF9OVU1fSU9fUVVFVUVTKTsKKwlpb19xdWV1ZV9udW0gPSBtaW5fdChpbnQsIGlvX3F1ZXVlX251bSwgaW9fc3FfbnVtKTsKKwlpb19xdWV1ZV9udW0gPSBtaW5fdChpbnQsIGlvX3F1ZXVlX251bSwKKwkJCSAgICAgZ2V0X2ZlYXRfY3R4LT5tYXhfcXVldWVzLm1heF9jcV9udW0pOworCS8qIDEgSVJRIGZvciBmb3IgbWdtbnQgYW5kIDEgSVJRcyBmb3IgZWFjaCBJTyBkaXJlY3Rpb24gKi8KKwlpb19xdWV1ZV9udW0gPSBtaW5fdChpbnQsIGlvX3F1ZXVlX251bSwgcGNpX21zaXhfdmVjX2NvdW50KHBkZXYpIC0gMSk7CisJaWYgKHVubGlrZWx5KCFpb19xdWV1ZV9udW0pKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlRoZSBkZXZpY2UgZG9lc24ndCBoYXZlIGlvIHF1ZXVlc1xuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiBpb19xdWV1ZV9udW07Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9zZXRfcHVzaF9tb2RlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgICBzdHJ1Y3QgZW5hX2NvbV9kZXZfZ2V0X2ZlYXR1cmVzX2N0eCAqZ2V0X2ZlYXRfY3R4KQoreworCWJvb2wgaGFzX21lbV9iYXI7CisKKwloYXNfbWVtX2JhciA9IHBjaV9zZWxlY3RfYmFycyhwZGV2LCBJT1JFU09VUkNFX01FTSkgJiBCSVQoRU5BX01FTV9CQVIpOworCisJLyogRW5hYmxlIHB1c2ggbW9kZSBpZiBkZXZpY2Ugc3VwcG9ydHMgTExRICovCisJaWYgKGhhc19tZW1fYmFyICYmIChnZXRfZmVhdF9jdHgtPm1heF9xdWV1ZXMubWF4X2xscV9udW0gPiAwKSkKKwkJZW5hX2Rldi0+dHhfbWVtX3F1ZXVlX3R5cGUgPSBFTkFfQURNSU5fUExBQ0VNRU5UX1BPTElDWV9ERVY7CisJZWxzZQorCQllbmFfZGV2LT50eF9tZW1fcXVldWVfdHlwZSA9IEVOQV9BRE1JTl9QTEFDRU1FTlRfUE9MSUNZX0hPU1Q7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9zZXRfZGV2X29mZmxvYWRzKHN0cnVjdCBlbmFfY29tX2Rldl9nZXRfZmVhdHVyZXNfY3R4ICpmZWF0LAorCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCW5ldGRldl9mZWF0dXJlc190IGRldl9mZWF0dXJlcyA9IDA7CisKKwkvKiBTZXQgb2ZmbG9hZCBmZWF0dXJlcyAqLworCWlmIChmZWF0LT5vZmZsb2FkLnR4ICYKKwkJRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RYX0w0X0lQVjRfQ1NVTV9QQVJUX01BU0spCisJCWRldl9mZWF0dXJlcyB8PSBORVRJRl9GX0lQX0NTVU07CisKKwlpZiAoZmVhdC0+b2ZmbG9hZC50eCAmCisJCUVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UWF9MNF9JUFY2X0NTVU1fUEFSVF9NQVNLKQorCQlkZXZfZmVhdHVyZXMgfD0gTkVUSUZfRl9JUFY2X0NTVU07CisKKwlpZiAoZmVhdC0+b2ZmbG9hZC50eCAmIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UU09fSVBWNF9NQVNLKQorCQlkZXZfZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CisKKwlpZiAoZmVhdC0+b2ZmbG9hZC50eCAmIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UU09fSVBWNl9NQVNLKQorCQlkZXZfZmVhdHVyZXMgfD0gTkVUSUZfRl9UU082OworCisJaWYgKGZlYXQtPm9mZmxvYWQudHggJiBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFNPX0VDTl9NQVNLKQorCQlkZXZfZmVhdHVyZXMgfD0gTkVUSUZfRl9UU09fRUNOOworCisJaWYgKGZlYXQtPm9mZmxvYWQucnhfc3VwcG9ydGVkICYKKwkJRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1JYX0w0X0lQVjRfQ1NVTV9NQVNLKQorCQlkZXZfZmVhdHVyZXMgfD0gTkVUSUZfRl9SWENTVU07CisKKwlpZiAoZmVhdC0+b2ZmbG9hZC5yeF9zdXBwb3J0ZWQgJgorCQlFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfUlhfTDRfSVBWNl9DU1VNX01BU0spCisJCWRldl9mZWF0dXJlcyB8PSBORVRJRl9GX1JYQ1NVTTsKKworCW5ldGRldi0+ZmVhdHVyZXMgPQorCQlkZXZfZmVhdHVyZXMgfAorCQlORVRJRl9GX1NHIHwKKwkJTkVUSUZfRl9OVFVQTEUgfAorCQlORVRJRl9GX1JYSEFTSCB8CisJCU5FVElGX0ZfSElHSERNQTsKKworCW5ldGRldi0+aHdfZmVhdHVyZXMgfD0gbmV0ZGV2LT5mZWF0dXJlczsKKwluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gbmV0ZGV2LT5mZWF0dXJlczsKK30KKworc3RhdGljIHZvaWQgZW5hX3NldF9jb25mX2ZlYXRfcGFyYW1zKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgICAgIHN0cnVjdCBlbmFfY29tX2Rldl9nZXRfZmVhdHVyZXNfY3R4ICpmZWF0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisKKwkvKiBDb3B5IG1hYyBhZGRyZXNzICovCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGZlYXQtPmRldl9hdHRyLm1hY19hZGRyKSkgeworCQlldGhfaHdfYWRkcl9yYW5kb20obmV0ZGV2KTsKKwkJZXRoZXJfYWRkcl9jb3B5KGFkYXB0ZXItPm1hY19hZGRyLCBuZXRkZXYtPmRldl9hZGRyKTsKKwl9IGVsc2UgeworCQlldGhlcl9hZGRyX2NvcHkoYWRhcHRlci0+bWFjX2FkZHIsIGZlYXQtPmRldl9hdHRyLm1hY19hZGRyKTsKKwkJZXRoZXJfYWRkcl9jb3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkYXB0ZXItPm1hY19hZGRyKTsKKwl9CisKKwkvKiBTZXQgb2ZmbG9hZCBmZWF0dXJlcyAqLworCWVuYV9zZXRfZGV2X29mZmxvYWRzKGZlYXQsIG5ldGRldik7CisKKwlhZGFwdGVyLT5tYXhfbXR1ID0gZmVhdC0+ZGV2X2F0dHIubWF4X210dTsKK30KKworc3RhdGljIGludCBlbmFfcnNzX2luaXRfZGVmYXVsdChzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2ID0gYWRhcHRlci0+ZW5hX2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OworCWludCByYywgaTsKKwl1MzIgdmFsOworCisJcmMgPSBlbmFfY29tX3Jzc19pbml0KGVuYV9kZXYsIEVOQV9SWF9SU1NfVEFCTEVfTE9HX1NJWkUpOworCWlmICh1bmxpa2VseShyYykpIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgaW5pdCBpbmRpcmVjdCB0YWJsZVxuIik7CisJCWdvdG8gZXJyX3Jzc19pbml0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBFTkFfUlhfUlNTX1RBQkxFX1NJWkU7IGkrKykgeworCQl2YWwgPSBldGh0b29sX3J4ZmhfaW5kaXJfZGVmYXVsdChpLCBhZGFwdGVyLT5udW1fcXVldWVzKTsKKwkJcmMgPSBlbmFfY29tX2luZGlyZWN0X3RhYmxlX2ZpbGxfZW50cnkoZW5hX2RldiwgaSwKKwkJCQkJCSAgICAgICBFTkFfSU9fUlhRX0lEWCh2YWwpKTsKKwkJaWYgKHVubGlrZWx5KHJjICYmIChyYyAhPSAtRVBFUk0pKSkgeworCQkJZGV2X2VycihkZXYsICJDYW5ub3QgZmlsbCBpbmRpcmVjdCB0YWJsZVxuIik7CisJCQlnb3RvIGVycl9maWxsX2luZGlyOworCQl9CisJfQorCisJcmMgPSBlbmFfY29tX2ZpbGxfaGFzaF9mdW5jdGlvbihlbmFfZGV2LCBFTkFfQURNSU5fQ1JDMzIsIE5VTEwsCisJCQkJCUVOQV9IQVNIX0tFWV9TSVpFLCAweEZGRkZGRkZGKTsKKwlpZiAodW5saWtlbHkocmMgJiYgKHJjICE9IC1FUEVSTSkpKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGZpbGwgaGFzaCBmdW5jdGlvblxuIik7CisJCWdvdG8gZXJyX2ZpbGxfaW5kaXI7CisJfQorCisJcmMgPSBlbmFfY29tX3NldF9kZWZhdWx0X2hhc2hfY3RybChlbmFfZGV2KTsKKwlpZiAodW5saWtlbHkocmMgJiYgKHJjICE9IC1FUEVSTSkpKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGZpbGwgaGFzaCBjb250cm9sXG4iKTsKKwkJZ290byBlcnJfZmlsbF9pbmRpcjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2ZpbGxfaW5kaXI6CisJZW5hX2NvbV9yc3NfZGVzdHJveShlbmFfZGV2KTsKK2Vycl9yc3NfaW5pdDoKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgZW5hX3JlbGVhc2VfYmFycyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCByZWxlYXNlX2JhcnM7CisKKwlyZWxlYXNlX2JhcnMgPSBwY2lfc2VsZWN0X2JhcnMocGRldiwgSU9SRVNPVVJDRV9NRU0pICYgRU5BX0JBUl9NQVNLOworCXBjaV9yZWxlYXNlX3NlbGVjdGVkX3JlZ2lvbnMocGRldiwgcmVsZWFzZV9iYXJzKTsKK30KKworc3RhdGljIGludCBlbmFfY2FsY19xdWV1ZV9zaXplKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJICAgICAgIHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICAgICB1MTYgKm1heF90eF9zZ2xfc2l6ZSwKKwkJCSAgICAgICB1MTYgKm1heF9yeF9zZ2xfc2l6ZSwKKwkJCSAgICAgICBzdHJ1Y3QgZW5hX2NvbV9kZXZfZ2V0X2ZlYXR1cmVzX2N0eCAqZ2V0X2ZlYXRfY3R4KQoreworCXUzMiBxdWV1ZV9zaXplID0gRU5BX0RFRkFVTFRfUklOR19TSVpFOworCisJcXVldWVfc2l6ZSA9IG1pbl90KHUzMiwgcXVldWVfc2l6ZSwKKwkJCSAgIGdldF9mZWF0X2N0eC0+bWF4X3F1ZXVlcy5tYXhfY3FfZGVwdGgpOworCXF1ZXVlX3NpemUgPSBtaW5fdCh1MzIsIHF1ZXVlX3NpemUsCisJCQkgICBnZXRfZmVhdF9jdHgtPm1heF9xdWV1ZXMubWF4X3NxX2RlcHRoKTsKKworCWlmIChlbmFfZGV2LT50eF9tZW1fcXVldWVfdHlwZSA9PSBFTkFfQURNSU5fUExBQ0VNRU5UX1BPTElDWV9ERVYpCisJCXF1ZXVlX3NpemUgPSBtaW5fdCh1MzIsIHF1ZXVlX3NpemUsCisJCQkJICAgZ2V0X2ZlYXRfY3R4LT5tYXhfcXVldWVzLm1heF9sbHFfZGVwdGgpOworCisJcXVldWVfc2l6ZSA9IHJvdW5kZG93bl9wb3dfb2ZfdHdvKHF1ZXVlX3NpemUpOworCisJaWYgKHVubGlrZWx5KCFxdWV1ZV9zaXplKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJbnZhbGlkIHF1ZXVlIHNpemVcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkqbWF4X3R4X3NnbF9zaXplID0gbWluX3QodTE2LCBFTkFfUEtUX01BWF9CVUZTLAorCQkJCSBnZXRfZmVhdF9jdHgtPm1heF9xdWV1ZXMubWF4X3BhY2tldF90eF9kZXNjcyk7CisJKm1heF9yeF9zZ2xfc2l6ZSA9IG1pbl90KHUxNiwgRU5BX1BLVF9NQVhfQlVGUywKKwkJCQkgZ2V0X2ZlYXRfY3R4LT5tYXhfcXVldWVzLm1heF9wYWNrZXRfcnhfZGVzY3MpOworCisJcmV0dXJuIHF1ZXVlX3NpemU7Cit9CisKKy8qIGVuYV9wcm9iZSAtIERldmljZSBJbml0aWFsaXphdGlvbiBSb3V0aW5lCisgKiBAcGRldjogUENJIGRldmljZSBpbmZvcm1hdGlvbiBzdHJ1Y3QKKyAqIEBlbnQ6IGVudHJ5IGluIGVuYV9wY2lfdGJsCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqCisgKiBlbmFfcHJvYmUgaW5pdGlhbGl6ZXMgYW4gYWRhcHRlciBpZGVudGlmaWVkIGJ5IGEgcGNpX2RldiBzdHJ1Y3R1cmUuCisgKiBUaGUgT1MgaW5pdGlhbGl6YXRpb24sIGNvbmZpZ3VyaW5nIG9mIHRoZSBhZGFwdGVyIHByaXZhdGUgc3RydWN0dXJlLAorICogYW5kIGEgaGFyZHdhcmUgcmVzZXQgb2NjdXIuCisgKi8KK3N0YXRpYyBpbnQgZW5hX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBlbmFfY29tX2Rldl9nZXRfZmVhdHVyZXNfY3R4IGdldF9mZWF0X2N0eDsKKwlzdGF0aWMgaW50IHZlcnNpb25fcHJpbnRlZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYgPSBOVUxMOworCXN0YXRpYyBpbnQgYWRhcHRlcnNfZm91bmQ7CisJaW50IGlvX3F1ZXVlX251bSwgYmFycywgcmM7CisJaW50IHF1ZXVlX3NpemU7CisJdTE2IHR4X3NnbF9zaXplID0gMDsKKwl1MTYgcnhfc2dsX3NpemUgPSAwOworCWJvb2wgd2Rfc3RhdGU7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlcyIsIHZlcnNpb24pOworCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZV9tZW0ocGRldik7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBjaV9lbmFibGVfZGV2aWNlX21lbSgpIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwllbmFfZGV2ID0gdnphbGxvYyhzaXplb2YoKmVuYV9kZXYpKTsKKwlpZiAoIWVuYV9kZXYpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kaXNhYmxlX2RldmljZTsKKwl9CisKKwliYXJzID0gcGNpX3NlbGVjdF9iYXJzKHBkZXYsIElPUkVTT1VSQ0VfTUVNKSAmIEVOQV9CQVJfTUFTSzsKKwlyYyA9IHBjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMocGRldiwgYmFycywgRFJWX01PRFVMRV9OQU1FKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyBmYWlsZWQgJWRcbiIsCisJCQlyYyk7CisJCWdvdG8gZXJyX2ZyZWVfZW5hX2RldjsKKwl9CisKKwllbmFfZGV2LT5yZWdfYmFyID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgRU5BX1JFR19CQVIpLAorCQkJCSAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgRU5BX1JFR19CQVIpKTsKKwlpZiAoIWVuYV9kZXYtPnJlZ19iYXIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlbWFwIHJlZ3MgYmFyXG4iKTsKKwkJcmMgPSAtRUZBVUxUOworCQlnb3RvIGVycl9mcmVlX3JlZ2lvbjsKKwl9CisKKwllbmFfZGV2LT5kbWFkZXYgPSAmcGRldi0+ZGV2OworCisJcmMgPSBlbmFfZGV2aWNlX2luaXQoZW5hX2RldiwgcGRldiwgJmdldF9mZWF0X2N0eCwgJndkX3N0YXRlKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZW5hIGRldmljZSBpbml0IGZhaWxlZFxuIik7CisJCWlmIChyYyA9PSAtRVRJTUUpCisJCQlyYyA9IC1FUFJPQkVfREVGRVI7CisJCWdvdG8gZXJyX2ZyZWVfcmVnaW9uOworCX0KKworCWVuYV9zZXRfcHVzaF9tb2RlKHBkZXYsIGVuYV9kZXYsICZnZXRfZmVhdF9jdHgpOworCisJaWYgKGVuYV9kZXYtPnR4X21lbV9xdWV1ZV90eXBlID09IEVOQV9BRE1JTl9QTEFDRU1FTlRfUE9MSUNZX0RFVikgeworCQllbmFfZGV2LT5tZW1fYmFyID0gaW9yZW1hcF93YyhwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgRU5BX01FTV9CQVIpLAorCQkJCQkgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIEVOQV9NRU1fQkFSKSk7CisJCWlmICghZW5hX2Rldi0+bWVtX2JhcikgeworCQkJcmMgPSAtRUZBVUxUOworCQkJZ290byBlcnJfZGV2aWNlX2Rlc3Ryb3k7CisJCX0KKwl9CisKKwkvKiBpbml0aWFsIFR4IGludGVycnVwdCBkZWxheSwgQXNzdW1lcyAxIHVzZWMgZ3JhbnVsYXJpdHkuCisJKiBVcGRhdGVkIGR1cmluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24gd2l0aCB0aGUgcmVhbCBncmFudWxhcml0eQorCSovCisJZW5hX2Rldi0+aW50cl9tb2Rlcl90eF9pbnRlcnZhbCA9IEVOQV9JTlRSX0lOSVRJQUxfVFhfSU5URVJWQUxfVVNFQ1M7CisJaW9fcXVldWVfbnVtID0gZW5hX2NhbGNfaW9fcXVldWVfbnVtKHBkZXYsIGVuYV9kZXYsICZnZXRfZmVhdF9jdHgpOworCXF1ZXVlX3NpemUgPSBlbmFfY2FsY19xdWV1ZV9zaXplKHBkZXYsIGVuYV9kZXYsICZ0eF9zZ2xfc2l6ZSwKKwkJCQkJICZyeF9zZ2xfc2l6ZSwgJmdldF9mZWF0X2N0eCk7CisJaWYgKChxdWV1ZV9zaXplIDw9IDApIHx8IChpb19xdWV1ZV9udW0gPD0gMCkpIHsKKwkJcmMgPSAtRUZBVUxUOworCQlnb3RvIGVycl9kZXZpY2VfZGVzdHJveTsKKwl9CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiY3JlYXRpbmcgJWQgaW8gcXVldWVzLiBxdWV1ZSBzaXplOiAlZFxuIiwKKwkJIGlvX3F1ZXVlX251bSwgcXVldWVfc2l6ZSk7CisKKwkvKiBkZXYgemVyb2VkIGluIGluaXRfZXRoZXJkZXYgKi8KKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldl9tcShzaXplb2Yoc3RydWN0IGVuYV9hZGFwdGVyKSwgaW9fcXVldWVfbnVtKTsKKwlpZiAoIW5ldGRldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJhbGxvY19ldGhlcmRldl9tcSBmYWlsZWRcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2RldmljZV9kZXN0cm95OworCX0KKworCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBkZXYtPmRldik7CisKKwlhZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgYWRhcHRlcik7CisKKwlhZGFwdGVyLT5lbmFfZGV2ID0gZW5hX2RldjsKKwlhZGFwdGVyLT5uZXRkZXYgPSBuZXRkZXY7CisJYWRhcHRlci0+cGRldiA9IHBkZXY7CisKKwllbmFfc2V0X2NvbmZfZmVhdF9wYXJhbXMoYWRhcHRlciwgJmdldF9mZWF0X2N0eCk7CisKKwlhZGFwdGVyLT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQoZGVidWcsIERFRkFVTFRfTVNHX0VOQUJMRSk7CisKKwlhZGFwdGVyLT50eF9yaW5nX3NpemUgPSBxdWV1ZV9zaXplOworCWFkYXB0ZXItPnJ4X3Jpbmdfc2l6ZSA9IHF1ZXVlX3NpemU7CisKKwlhZGFwdGVyLT5tYXhfdHhfc2dsX3NpemUgPSB0eF9zZ2xfc2l6ZTsKKwlhZGFwdGVyLT5tYXhfcnhfc2dsX3NpemUgPSByeF9zZ2xfc2l6ZTsKKworCWFkYXB0ZXItPm51bV9xdWV1ZXMgPSBpb19xdWV1ZV9udW07CisJYWRhcHRlci0+bGFzdF9tb25pdG9yZWRfdHhfcWlkID0gMDsKKworCWFkYXB0ZXItPnJ4X2NvcHlicmVhayA9IEVOQV9ERUZBVUxUX1JYX0NPUFlCUkVBSzsKKwlhZGFwdGVyLT53ZF9zdGF0ZSA9IHdkX3N0YXRlOworCisJc25wcmludGYoYWRhcHRlci0+bmFtZSwgRU5BX05BTUVfTUFYX0xFTiwgImVuYV8lZCIsIGFkYXB0ZXJzX2ZvdW5kKTsKKworCXJjID0gZW5hX2NvbV9pbml0X2ludGVycnVwdF9tb2RlcmF0aW9uKGFkYXB0ZXItPmVuYV9kZXYpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIHF1ZXJ5IGludGVycnVwdCBtb2RlcmF0aW9uIGZlYXR1cmVcbiIpOworCQlnb3RvIGVycl9uZXRkZXZfZGVzdHJveTsKKwl9CisJZW5hX2luaXRfaW9fcmluZ3MoYWRhcHRlcik7CisKKwluZXRkZXYtPm5ldGRldl9vcHMgPSAmZW5hX25ldGRldl9vcHM7CisJbmV0ZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisJZW5hX3NldF9ldGh0b29sX29wcyhuZXRkZXYpOworCisJbmV0ZGV2LT5wcml2X2ZsYWdzIHw9IElGRl9VTklDQVNUX0ZMVDsKKworCXU2NF9zdGF0c19pbml0KCZhZGFwdGVyLT5zeW5jcCk7CisKKwlyYyA9IGVuYV9lbmFibGVfbXNpeF9hbmRfc2V0X2FkbWluX2ludGVycnVwdHMoYWRhcHRlciwgaW9fcXVldWVfbnVtKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIkZhaWxlZCB0byBlbmFibGUgYW5kIHNldCB0aGUgYWRtaW4gaW50ZXJydXB0c1xuIik7CisJCWdvdG8gZXJyX3dvcmtlcl9kZXN0cm95OworCX0KKwlyYyA9IGVuYV9yc3NfaW5pdF9kZWZhdWx0KGFkYXB0ZXIpOworCWlmIChyYyAmJiAocmMgIT0gLUVQRVJNKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgaW5pdCBSU1MgcmM6ICVkXG4iLCByYyk7CisJCWdvdG8gZXJyX2ZyZWVfbXNpeDsKKwl9CisKKwllbmFfY29uZmlnX2RlYnVnX2FyZWEoYWRhcHRlcik7CisKKwltZW1jcHkoYWRhcHRlci0+bmV0ZGV2LT5wZXJtX2FkZHIsIGFkYXB0ZXItPm1hY19hZGRyLCBuZXRkZXYtPmFkZHJfbGVuKTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisKKwlyYyA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZVxuIik7CisJCWdvdG8gZXJyX3JzczsKKwl9CisKKwlJTklUX1dPUksoJmFkYXB0ZXItPnN1c3BlbmRfaW9fdGFzaywgZW5hX2RldmljZV9pb19zdXNwZW5kKTsKKwlJTklUX1dPUksoJmFkYXB0ZXItPnJlc3VtZV9pb190YXNrLCBlbmFfZGV2aWNlX2lvX3Jlc3VtZSk7CisJSU5JVF9XT1JLKCZhZGFwdGVyLT5yZXNldF90YXNrLCBlbmFfZndfcmVzZXRfZGV2aWNlKTsKKworCWFkYXB0ZXItPmxhc3Rfa2VlcF9hbGl2ZV9qaWZmaWVzID0gamlmZmllczsKKworCWluaXRfdGltZXIoJmFkYXB0ZXItPnRpbWVyX3NlcnZpY2UpOworCWFkYXB0ZXItPnRpbWVyX3NlcnZpY2UuZXhwaXJlcyA9IHJvdW5kX2ppZmZpZXMoamlmZmllcyArIEhaKTsKKwlhZGFwdGVyLT50aW1lcl9zZXJ2aWNlLmZ1bmN0aW9uID0gZW5hX3RpbWVyX3NlcnZpY2U7CisJYWRhcHRlci0+dGltZXJfc2VydmljZS5kYXRhID0gKHVuc2lnbmVkIGxvbmcpYWRhcHRlcjsKKworCWFkZF90aW1lcigmYWRhcHRlci0+dGltZXJfc2VydmljZSk7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXMgZm91bmQgYXQgbWVtICVseCwgbWFjIGFkZHIgJXBNIFF1ZXVlcyAlZFxuIiwKKwkJIERFVklDRV9OQU1FLCAobG9uZylwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCisJCSBuZXRkZXYtPmRldl9hZGRyLCBpb19xdWV1ZV9udW0pOworCisJc2V0X2JpdChFTkFfRkxBR19ERVZJQ0VfUlVOTklORywgJmFkYXB0ZXItPmZsYWdzKTsKKworCWFkYXB0ZXJzX2ZvdW5kKys7CisKKwlyZXR1cm4gMDsKKworZXJyX3JzczoKKwllbmFfY29tX2RlbGV0ZV9kZWJ1Z19hcmVhKGVuYV9kZXYpOworCWVuYV9jb21fcnNzX2Rlc3Ryb3koZW5hX2Rldik7CitlcnJfZnJlZV9tc2l4OgorCWVuYV9jb21fZGV2X3Jlc2V0KGVuYV9kZXYpOworCWVuYV9mcmVlX21nbW50X2lycShhZGFwdGVyKTsKKwllbmFfZGlzYWJsZV9tc2l4KGFkYXB0ZXIpOworZXJyX3dvcmtlcl9kZXN0cm95OgorCWVuYV9jb21fZGVzdHJveV9pbnRlcnJ1cHRfbW9kZXJhdGlvbihlbmFfZGV2KTsKKwlkZWxfdGltZXIoJmFkYXB0ZXItPnRpbWVyX3NlcnZpY2UpOworCWNhbmNlbF93b3JrX3N5bmMoJmFkYXB0ZXItPnN1c3BlbmRfaW9fdGFzayk7CisJY2FuY2VsX3dvcmtfc3luYygmYWRhcHRlci0+cmVzdW1lX2lvX3Rhc2spOworZXJyX25ldGRldl9kZXN0cm95OgorCWZyZWVfbmV0ZGV2KG5ldGRldik7CitlcnJfZGV2aWNlX2Rlc3Ryb3k6CisJZW5hX2NvbV9kZWxldGVfaG9zdF9pbmZvKGVuYV9kZXYpOworCWVuYV9jb21fYWRtaW5fZGVzdHJveShlbmFfZGV2KTsKK2Vycl9mcmVlX3JlZ2lvbjoKKwllbmFfcmVsZWFzZV9iYXJzKGVuYV9kZXYsIHBkZXYpOworZXJyX2ZyZWVfZW5hX2RldjoKKwl2ZnJlZShlbmFfZGV2KTsKK2Vycl9kaXNhYmxlX2RldmljZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGVuYV9zcmlvdl9jb25maWd1cmUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG51bXZmcykKK3sKKwlpbnQgcmM7CisKKwlpZiAobnVtdmZzID4gMCkgeworCQlyYyA9IHBjaV9lbmFibGVfc3Jpb3YoZGV2LCBudW12ZnMpOworCQlpZiAocmMgIT0gMCkgeworCQkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkJInBjaV9lbmFibGVfc3Jpb3YgZmFpbGVkIHRvIGVuYWJsZTogJWQgdmZzIHdpdGggdGhlIGVycm9yOiAlZFxuIiwKKwkJCQludW12ZnMsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCXJldHVybiBudW12ZnM7CisJfQorCisJaWYgKG51bXZmcyA9PSAwKSB7CisJCXBjaV9kaXNhYmxlX3NyaW92KGRldik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGVuYV9yZW1vdmUgLSBEZXZpY2UgUmVtb3ZhbCBSb3V0aW5lCisgKiBAcGRldjogUENJIGRldmljZSBpbmZvcm1hdGlvbiBzdHJ1Y3QKKyAqCisgKiBlbmFfcmVtb3ZlIGlzIGNhbGxlZCBieSB0aGUgUENJIHN1YnN5c3RlbSB0byBhbGVydCB0aGUgZHJpdmVyCisgKiB0aGF0IGl0IHNob3VsZCByZWxlYXNlIGEgUENJIGRldmljZS4KKyAqLworc3RhdGljIHZvaWQgZW5hX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisKKwlpZiAoIWFkYXB0ZXIpCisJCS8qIFRoaXMgZGV2aWNlIGRpZG4ndCBsb2FkIHByb3Blcmx5IGFuZCBpdCdzIHJlc291cmNlcworCQkgKiBhbHJlYWR5IHJlbGVhc2VkLCBub3RoaW5nIHRvIGRvCisJCSAqLworCQlyZXR1cm47CisKKwllbmFfZGV2ID0gYWRhcHRlci0+ZW5hX2RldjsKKwluZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisKKyNpZmRlZiBDT05GSUdfUkZTX0FDQ0VMCisJaWYgKChhZGFwdGVyLT5tc2l4X3ZlY3MgPj0gMSkgJiYgKG5ldGRldi0+cnhfY3B1X3JtYXApKSB7CisJCWZyZWVfaXJxX2NwdV9ybWFwKG5ldGRldi0+cnhfY3B1X3JtYXApOworCQluZXRkZXYtPnJ4X2NwdV9ybWFwID0gTlVMTDsKKwl9CisjZW5kaWYgLyogQ09ORklHX1JGU19BQ0NFTCAqLworCisJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKwlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+dGltZXJfc2VydmljZSk7CisKKwljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT5yZXNldF90YXNrKTsKKworCWNhbmNlbF93b3JrX3N5bmMoJmFkYXB0ZXItPnN1c3BlbmRfaW9fdGFzayk7CisKKwljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT5yZXN1bWVfaW9fdGFzayk7CisKKwllbmFfY29tX2Rldl9yZXNldChlbmFfZGV2KTsKKworCWVuYV9mcmVlX21nbW50X2lycShhZGFwdGVyKTsKKworCWVuYV9kaXNhYmxlX21zaXgoYWRhcHRlcik7CisKKwlmcmVlX25ldGRldihuZXRkZXYpOworCisJZW5hX2NvbV9tbWlvX3JlZ19yZWFkX3JlcXVlc3RfZGVzdHJveShlbmFfZGV2KTsKKworCWVuYV9jb21fYWJvcnRfYWRtaW5fY29tbWFuZHMoZW5hX2Rldik7CisKKwllbmFfY29tX3dhaXRfZm9yX2Fib3J0X2NvbXBsZXRpb24oZW5hX2Rldik7CisKKwllbmFfY29tX2FkbWluX2Rlc3Ryb3koZW5hX2Rldik7CisKKwllbmFfY29tX3Jzc19kZXN0cm95KGVuYV9kZXYpOworCisJZW5hX2NvbV9kZWxldGVfZGVidWdfYXJlYShlbmFfZGV2KTsKKworCWVuYV9jb21fZGVsZXRlX2hvc3RfaW5mbyhlbmFfZGV2KTsKKworCWVuYV9yZWxlYXNlX2JhcnMoZW5hX2RldiwgcGRldik7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwllbmFfY29tX2Rlc3Ryb3lfaW50ZXJydXB0X21vZGVyYXRpb24oZW5hX2Rldik7CisKKwl2ZnJlZShlbmFfZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGVuYV9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9NT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUJPSBlbmFfcGNpX3RibCwKKwkucHJvYmUJCT0gZW5hX3Byb2JlLAorCS5yZW1vdmUJCT0gZW5hX3JlbW92ZSwKKwkuc3Jpb3ZfY29uZmlndXJlID0gZW5hX3NyaW92X2NvbmZpZ3VyZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGVuYV9pbml0KHZvaWQpCit7CisJcHJfaW5mbygiJXMiLCB2ZXJzaW9uKTsKKworCWVuYV93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKERSVl9NT0RVTEVfTkFNRSk7CisJaWYgKCFlbmFfd3EpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIHdvcmtxdWV1ZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZlbmFfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlbmFfY2xlYW51cCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZW5hX3BjaV9kcml2ZXIpOworCisJaWYgKGVuYV93cSkgeworCQlkZXN0cm95X3dvcmtxdWV1ZShlbmFfd3EpOworCQllbmFfd3EgPSBOVUxMOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFFTlEgSGFuZGxlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZW5hX3VwZGF0ZV9vbl9saW5rX2NoYW5nZToKKyAqIE5vdGlmeSB0aGUgbmV0d29yayBpbnRlcmZhY2UgYWJvdXQgdGhlIGNoYW5nZSBpbiBsaW5rIHN0YXR1cworICovCitzdGF0aWMgdm9pZCBlbmFfdXBkYXRlX29uX2xpbmtfY2hhbmdlKHZvaWQgKmFkYXB0ZXJfZGF0YSwKKwkJCQkgICAgICBzdHJ1Y3QgZW5hX2FkbWluX2FlbnFfZW50cnkgKmFlbnFfZSkKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGVuYV9hZGFwdGVyICopYWRhcHRlcl9kYXRhOworCXN0cnVjdCBlbmFfYWRtaW5fYWVucV9saW5rX2NoYW5nZV9kZXNjICphZW5xX2Rlc2MgPQorCQkoc3RydWN0IGVuYV9hZG1pbl9hZW5xX2xpbmtfY2hhbmdlX2Rlc2MgKilhZW5xX2U7CisJaW50IHN0YXR1cyA9IGFlbnFfZGVzYy0+ZmxhZ3MgJgorCQlFTkFfQURNSU5fQUVOUV9MSU5LX0NIQU5HRV9ERVNDX0xJTktfU1RBVFVTX01BU0s7CisKKwlpZiAoc3RhdHVzKSB7CisJCW5ldGRldl9kYmcoYWRhcHRlci0+bmV0ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwkJc2V0X2JpdChFTkFfRkxBR19MSU5LX1VQLCAmYWRhcHRlci0+ZmxhZ3MpOworCQluZXRpZl9jYXJyaWVyX29uKGFkYXB0ZXItPm5ldGRldik7CisJfSBlbHNlIHsKKwkJY2xlYXJfYml0KEVOQV9GTEFHX0xJTktfVVAsICZhZGFwdGVyLT5mbGFncyk7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGFkYXB0ZXItPm5ldGRldik7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmFfa2VlcF9hbGl2ZV93ZCh2b2lkICphZGFwdGVyX2RhdGEsCisJCQkgICAgICBzdHJ1Y3QgZW5hX2FkbWluX2FlbnFfZW50cnkgKmFlbnFfZSkKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGVuYV9hZGFwdGVyICopYWRhcHRlcl9kYXRhOworCisJYWRhcHRlci0+bGFzdF9rZWVwX2FsaXZlX2ppZmZpZXMgPSBqaWZmaWVzOworfQorCitzdGF0aWMgdm9pZCBlbmFfbm90aWZpY2F0aW9uKHZvaWQgKmFkYXB0ZXJfZGF0YSwKKwkJCSAgICAgc3RydWN0IGVuYV9hZG1pbl9hZW5xX2VudHJ5ICphZW5xX2UpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBlbmFfYWRhcHRlciAqKWFkYXB0ZXJfZGF0YTsKKworCVdBUk4oYWVucV9lLT5hZW5xX2NvbW1vbl9kZXNjLmdyb3VwICE9IEVOQV9BRE1JTl9OT1RJRklDQVRJT04sCisJICAgICAiSW52YWxpZCBncm91cCgleCkgZXhwZWN0ZWQgJXhcbiIsCisJICAgICBhZW5xX2UtPmFlbnFfY29tbW9uX2Rlc2MuZ3JvdXAsCisJICAgICBFTkFfQURNSU5fTk9USUZJQ0FUSU9OKTsKKworCXN3aXRjaCAoYWVucV9lLT5hZW5xX2NvbW1vbl9kZXNjLnN5bmRyb20pIHsKKwljYXNlIEVOQV9BRE1JTl9TVVNQRU5EOgorCQkvKiBTdXNwZW5kIGp1c3QgdGhlIElPIHF1ZXVlcy4KKwkJICogV2UgZGVsaWJlcmF0ZWx5IGRvbid0IHN1c3BlbmQgYWRtaW4gc28gdGhlIHRpbWVyIGFuZAorCQkgKiB0aGUga2VlcF9hbGl2ZSBldmVudHMgc2hvdWxkIHJlbWFpbi4KKwkJICovCisJCXF1ZXVlX3dvcmsoZW5hX3dxLCAmYWRhcHRlci0+c3VzcGVuZF9pb190YXNrKTsKKwkJYnJlYWs7CisJY2FzZSBFTkFfQURNSU5fUkVTVU1FOgorCQlxdWV1ZV93b3JrKGVuYV93cSwgJmFkYXB0ZXItPnJlc3VtZV9pb190YXNrKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgYWRhcHRlci0+bmV0ZGV2LAorCQkJICAiSW52YWxpZCBhZW5xIG5vdGlmaWNhdGlvbiBsaW5rIHN0YXRlICVkXG4iLAorCQkJICBhZW5xX2UtPmFlbnFfY29tbW9uX2Rlc2Muc3luZHJvbSk7CisJfQorfQorCisvKiBUaGlzIGhhbmRsZXIgd2lsbCBjYWxsZWQgZm9yIHVua25vd24gZXZlbnQgZ3JvdXAgb3IgdW5pbXBsZW1lbnRlZCBoYW5kbGVycyovCitzdGF0aWMgdm9pZCB1bmltcGxlbWVudGVkX2FlbnFfaGFuZGxlcih2b2lkICpkYXRhLAorCQkJCSAgICAgICBzdHJ1Y3QgZW5hX2FkbWluX2FlbnFfZW50cnkgKmFlbnFfZSkKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGVuYV9hZGFwdGVyICopZGF0YTsKKworCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIGFkYXB0ZXItPm5ldGRldiwKKwkJICAiVW5rbm93biBldmVudCB3YXMgcmVjZWl2ZWQgb3IgZXZlbnQgd2l0aCB1bmltcGxlbWVudGVkIGhhbmRsZXJcbiIpOworfQorCitzdGF0aWMgc3RydWN0IGVuYV9hZW5xX2hhbmRsZXJzIGFlbnFfaGFuZGxlcnMgPSB7CisJLmhhbmRsZXJzID0geworCQlbRU5BX0FETUlOX0xJTktfQ0hBTkdFXSA9IGVuYV91cGRhdGVfb25fbGlua19jaGFuZ2UsCisJCVtFTkFfQURNSU5fTk9USUZJQ0FUSU9OXSA9IGVuYV9ub3RpZmljYXRpb24sCisJCVtFTkFfQURNSU5fS0VFUF9BTElWRV0gPSBlbmFfa2VlcF9hbGl2ZV93ZCwKKwl9LAorCS51bmltcGxlbWVudGVkX2hhbmRsZXIgPSB1bmltcGxlbWVudGVkX2FlbnFfaGFuZGxlcgorfTsKKworbW9kdWxlX2luaXQoZW5hX2luaXQpOworbW9kdWxlX2V4aXQoZW5hX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfbmV0ZGV2LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9uZXRkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWQ3ZTllCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfbmV0ZGV2LmgKQEAgLTAsMCArMSwzMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgRU5BX0gKKyNkZWZpbmUgRU5BX0gKKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSAiZW5hX2NvbS5oIgorI2luY2x1ZGUgImVuYV9ldGhfY29tLmgiCisKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJfTUFKT1IJMQorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUl9NSU5PUgkwCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSX1NVQk1JTk9SIDIKKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJlbmEiCisjaWZuZGVmIERSVl9NT0RVTEVfVkVSU0lPTgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04gXAorCV9fc3RyaW5naWZ5KERSVl9NT0RVTEVfVkVSX01BSk9SKSAiLiIJXAorCV9fc3RyaW5naWZ5KERSVl9NT0RVTEVfVkVSX01JTk9SKSAiLiIJXAorCV9fc3RyaW5naWZ5KERSVl9NT0RVTEVfVkVSX1NVQk1JTk9SKQorI2VuZGlmCisKKyNkZWZpbmUgREVWSUNFX05BTUUJIkVsYXN0aWMgTmV0d29yayBBZGFwdGVyIChFTkEpIgorCisvKiAxIGZvciBBRU5RICsgQURNSU4gKi8KKyNkZWZpbmUgRU5BX01BWF9NU0lYX1ZFQyhpb19xdWV1ZXMpCSgxICsgKGlvX3F1ZXVlcykpCisKKyNkZWZpbmUgRU5BX1JFR19CQVIJCQkwCisjZGVmaW5lIEVOQV9NRU1fQkFSCQkJMgorI2RlZmluZSBFTkFfQkFSX01BU0sgKEJJVChFTkFfUkVHX0JBUikgfCBCSVQoRU5BX01FTV9CQVIpKQorCisjZGVmaW5lIEVOQV9ERUZBVUxUX1JJTkdfU0laRQkoMTAyNCkKKworI2RlZmluZSBFTkFfVFhfV0FLRVVQX1RIUkVTSAkJKE1BWF9TS0JfRlJBR1MgKyAyKQorI2RlZmluZSBFTkFfREVGQVVMVF9SWF9DT1BZQlJFQUsJKDEyOCAtIE5FVF9JUF9BTElHTikKKworLyogbGltaXQgdGhlIGJ1ZmZlciBzaXplIHRvIDYwMCBieXRlcyB0byBoYW5kbGUgTVRVIGNoYW5nZXMgZnJvbSB2ZXJ5CisgKiBzbWFsbCB0byB2ZXJ5IGxhcmdlLCBpbiB3aGljaCBjYXNlIHRoZSBudW1iZXIgb2YgYnVmZmVycyBwZXIgcGFja2V0CisgKiBjb3VsZCBleGNlZWQgRU5BX1BLVF9NQVhfQlVGUworICovCisjZGVmaW5lIEVOQV9ERUZBVUxUX01JTl9SWF9CVUZGX0FMTE9DX1NJWkUgNjAwCisKKyNkZWZpbmUgRU5BX01JTl9NVFUJCTEyOAorCisjZGVmaW5lIEVOQV9OQU1FX01BWF9MRU4JMjAKKyNkZWZpbmUgRU5BX0lSUU5BTUVfU0laRQk0MAorCisjZGVmaW5lIEVOQV9QS1RfTUFYX0JVRlMJMTkKKworI2RlZmluZSBFTkFfUlhfUlNTX1RBQkxFX0xPR19TSVpFICA3CisjZGVmaW5lIEVOQV9SWF9SU1NfVEFCTEVfU0laRQkoMSA8PCBFTkFfUlhfUlNTX1RBQkxFX0xPR19TSVpFKQorCisjZGVmaW5lIEVOQV9IQVNIX0tFWV9TSVpFCTQwCisKKy8qIFRoZSBudW1iZXIgb2YgdHggcGFja2V0IGNvbXBsZXRpb25zIHRoYXQgd2lsbCBiZSBoYW5kbGVkIGVhY2ggTkFQSSBwb2xsCisgKiBjeWNsZSBpcyByaW5nX3NpemUgLyBFTkFfVFhfUE9MTF9CVURHRVRfRElWSURFUi4KKyAqLworI2RlZmluZSBFTkFfVFhfUE9MTF9CVURHRVRfRElWSURFUgk0CisKKy8qIFJlZmlsbCBSeCBxdWV1ZSB3aGVuIG51bWJlciBvZiBhdmFpbGFibGUgZGVzY3JpcHRvcnMgaXMgYmVsb3cKKyAqIFFVRVVFX1NJWkUgLyBFTkFfUlhfUkVGSUxMX1RIUkVTSF9ESVZJREVSCisgKi8KKyNkZWZpbmUgRU5BX1JYX1JFRklMTF9USFJFU0hfRElWSURFUgk4CisKKy8qIE51bWJlciBvZiBxdWV1ZXMgdG8gY2hlY2sgZm9yIG1pc3NpbmcgcXVldWVzIHBlciB0aW1lciBzZXJ2aWNlICovCisjZGVmaW5lIEVOQV9NT05JVE9SRURfVFhfUVVFVUVTCTQKKy8qIE1heCB0aW1lb3V0IHBhY2tldHMgYmVmb3JlIGRldmljZSByZXNldCAqLworI2RlZmluZSBNQVhfTlVNX09GX1RJTUVPVVRFRF9QQUNLRVRTIDMyCisKKyNkZWZpbmUgRU5BX1RYX1JJTkdfSURYX05FWFQoaWR4LCByaW5nX3NpemUpICgoKGlkeCkgKyAxKSAmICgocmluZ19zaXplKSAtIDEpKQorCisjZGVmaW5lIEVOQV9SWF9SSU5HX0lEWF9ORVhUKGlkeCwgcmluZ19zaXplKSAoKChpZHgpICsgMSkgJiAoKHJpbmdfc2l6ZSkgLSAxKSkKKyNkZWZpbmUgRU5BX1JYX1JJTkdfSURYX0FERChpZHgsIG4sIHJpbmdfc2l6ZSkgXAorCSgoKGlkeCkgKyAobikpICYgKChyaW5nX3NpemUpIC0gMSkpCisKKyNkZWZpbmUgRU5BX0lPX1RYUV9JRFgocSkJKDIgKiAocSkpCisjZGVmaW5lIEVOQV9JT19SWFFfSURYKHEpCSgyICogKHEpICsgMSkKKworI2RlZmluZSBFTkFfTUdNTlRfSVJRX0lEWAkJMAorI2RlZmluZSBFTkFfSU9fSVJRX0ZJUlNUX0lEWAkJMQorI2RlZmluZSBFTkFfSU9fSVJRX0lEWChxKQkJKEVOQV9JT19JUlFfRklSU1RfSURYICsgKHEpKQorCisvKiBFTkEgZGV2aWNlIHNob3VsZCBzZW5kIGtlZXAgYWxpdmUgbXNnIGV2ZXJ5IDEgc2VjLgorICogV2Ugd2FpdCBmb3IgMyBzZWMganVzdCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlLgorICovCisjZGVmaW5lIEVOQV9ERVZJQ0VfS0FMSVZFX1RJTUVPVVQJKDMgKiBIWikKKworI2RlZmluZSBFTkFfTU1JT19ESVNBQkxFX1JFR19SRUFECUJJVCgwKQorCitzdHJ1Y3QgZW5hX2lycSB7CisJaXJxX2hhbmRsZXJfdCBoYW5kbGVyOworCXZvaWQgKmRhdGE7CisJaW50IGNwdTsKKwl1MzIgdmVjdG9yOworCWNwdW1hc2tfdCBhZmZpbml0eV9oaW50X21hc2s7CisJY2hhciBuYW1lW0VOQV9JUlFOQU1FX1NJWkVdOworfTsKKworc3RydWN0IGVuYV9uYXBpIHsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJc3RydWN0IGVuYV9yaW5nICp0eF9yaW5nOworCXN0cnVjdCBlbmFfcmluZyAqcnhfcmluZzsKKwl1MzIgcWlkOworfTsKKworc3RydWN0IGVuYV90eF9idWZmZXIgeworCXN0cnVjdCBza19idWZmICpza2I7CisJLyogbnVtIG9mIGVuYSBkZXNjIGZvciB0aGlzIHNwZWNpZmljIHNrYgorCSAqIChpbmNsdWRlcyBkYXRhIGRlc2MgYW5kIG1ldGFkYXRhIGRlc2MpCisJICovCisJdTMyIHR4X2Rlc2NzOworCS8qIG51bSBvZiBidWZmZXJzIHVzZWQgYnkgdGhpcyBza2IgKi8KKwl1MzIgbnVtX29mX2J1ZnM7CisJLyogU2F2ZSB0aGUgbGFzdCBqaWZmaWVzIHRvIGRldGVjdCBtaXNzaW5nIHR4IHBhY2tldHMgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfamlmZmllczsKKwlzdHJ1Y3QgZW5hX2NvbV9idWYgYnVmc1tFTkFfUEtUX01BWF9CVUZTXTsKK30gX19fX2NhY2hlbGluZV9hbGlnbmVkOworCitzdHJ1Y3QgZW5hX3J4X2J1ZmZlciB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1MzIgcGFnZV9vZmZzZXQ7CisJc3RydWN0IGVuYV9jb21fYnVmIGVuYV9idWY7Cit9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKworc3RydWN0IGVuYV9zdGF0c190eCB7CisJdTY0IGNudDsKKwl1NjQgYnl0ZXM7CisJdTY0IHF1ZXVlX3N0b3A7CisJdTY0IHByZXBhcmVfY3R4X2VycjsKKwl1NjQgcXVldWVfd2FrZXVwOworCXU2NCBkbWFfbWFwcGluZ19lcnI7CisJdTY0IGxpbmVhcml6ZTsKKwl1NjQgbGluZWFyaXplX2ZhaWxlZDsKKwl1NjQgbmFwaV9jb21wOworCXU2NCB0eF9wb2xsOworCXU2NCBkb29yYmVsbHM7CisJdTY0IG1pc3NpbmdfdHhfY29tcDsKKwl1NjQgYmFkX3JlcV9pZDsKK307CisKK3N0cnVjdCBlbmFfc3RhdHNfcnggeworCXU2NCBjbnQ7CisJdTY0IGJ5dGVzOworCXU2NCByZWZpbF9wYXJ0aWFsOworCXU2NCBiYWRfY3N1bTsKKwl1NjQgcGFnZV9hbGxvY19mYWlsOworCXU2NCBza2JfYWxsb2NfZmFpbDsKKwl1NjQgZG1hX21hcHBpbmdfZXJyOworCXU2NCBiYWRfZGVzY19udW07CisJdTY0IHJ4X2NvcHlicmVha19wa3Q7Cit9OworCitzdHJ1Y3QgZW5hX3JpbmcgeworCS8qIEhvbGRzIHRoZSBlbXB0eSByZXF1ZXN0cyBmb3IgVFggb3V0IG9mIG9yZGVyIGNvbXBsZXRpb25zICovCisJdTE2ICpmcmVlX3R4X2lkczsKKwl1bmlvbiB7CisJCXN0cnVjdCBlbmFfdHhfYnVmZmVyICp0eF9idWZmZXJfaW5mbzsKKwkJc3RydWN0IGVuYV9yeF9idWZmZXIgKnJ4X2J1ZmZlcl9pbmZvOworCX07CisKKwkvKiBjYWNoZSBwdHIgdG8gYXZvaWQgdXNpbmcgdGhlIGFkYXB0ZXIgKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2OworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqZW5hX2NvbV9pb19jcTsKKwlzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqZW5hX2NvbV9pb19zcTsKKworCXUxNiBuZXh0X3RvX3VzZTsKKwl1MTYgbmV4dF90b19jbGVhbjsKKwl1MTYgcnhfY29weWJyZWFrOworCXUxNiBxaWQ7CisJdTE2IG10dTsKKwl1MTYgc2dsX3NpemU7CisKKwkvKiBUaGUgbWF4aW11bSBoZWFkZXIgbGVuZ3RoIHRoZSBkZXZpY2UgY2FuIGhhbmRsZSAqLworCXU4IHR4X21heF9oZWFkZXJfc2l6ZTsKKworCS8qIGNwdSBmb3IgVFBIICovCisJaW50IGNwdTsKKwkgLyogbnVtYmVyIG9mIHR4L3J4X2J1ZmZlcl9pbmZvJ3MgZW50cmllcyAqLworCWludCByaW5nX3NpemU7CisKKwllbnVtIGVuYV9hZG1pbl9wbGFjZW1lbnRfcG9saWN5X3R5cGUgdHhfbWVtX3F1ZXVlX3R5cGU7CisKKwlzdHJ1Y3QgZW5hX2NvbV9yeF9idWZfaW5mbyBlbmFfYnVmc1tFTkFfUEtUX01BWF9CVUZTXTsKKwl1MzIgIHNtb290aGVkX2ludGVydmFsOworCXUzMiAgcGVyX25hcGlfcGFja2V0czsKKwl1MzIgIHBlcl9uYXBpX2J5dGVzOworCWVudW0gZW5hX2ludHJfbW9kZXJfbGV2ZWwgbW9kZXJfdGJsX2lkeDsKKwlzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgc3luY3A7CisJdW5pb24geworCQlzdHJ1Y3QgZW5hX3N0YXRzX3R4IHR4X3N0YXRzOworCQlzdHJ1Y3QgZW5hX3N0YXRzX3J4IHJ4X3N0YXRzOworCX07Cit9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKworc3RydWN0IGVuYV9zdGF0c19kZXYgeworCXU2NCB0eF90aW1lb3V0OworCXU2NCBpb19zdXNwZW5kOworCXU2NCBpb19yZXN1bWU7CisJdTY0IHdkX2V4cGlyZWQ7CisJdTY0IGludGVyZmFjZV91cDsKKwl1NjQgaW50ZXJmYWNlX2Rvd247CisJdTY0IGFkbWluX3FfcGF1c2U7Cit9OworCitlbnVtIGVuYV9mbGFnc190IHsKKwlFTkFfRkxBR19ERVZJQ0VfUlVOTklORywKKwlFTkFfRkxBR19ERVZfVVAsCisJRU5BX0ZMQUdfTElOS19VUCwKKwlFTkFfRkxBR19NU0lYX0VOQUJMRUQsCisJRU5BX0ZMQUdfVFJJR0dFUl9SRVNFVAorfTsKKworLyogYWRhcHRlciBzcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgZW5hX2FkYXB0ZXIgeworCXN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldjsKKwkvKiBPUyBkZWZpbmVkIHN0cnVjdHMgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJLyogcnggcGFja2V0cyB0aGF0IHNob3J0ZXIgdGhhdCB0aGlzIGxlbiB3aWxsIGJlIGNvcGllZCB0byB0aGUgc2tiCisJICogaGVhZGVyCisJICovCisJdTMyIHJ4X2NvcHlicmVhazsKKwl1MzIgbWF4X210dTsKKworCWludCBudW1fcXVldWVzOworCisJc3RydWN0IG1zaXhfZW50cnkgKm1zaXhfZW50cmllczsKKwlpbnQgbXNpeF92ZWNzOworCisJdTMyIHR4X3VzZWNzLCByeF91c2VjczsgLyogaW50ZXJydXB0IG1vZGVyYXRpb24gKi8KKwl1MzIgdHhfZnJhbWVzLCByeF9mcmFtZXM7IC8qIGludGVycnVwdCBtb2RlcmF0aW9uICovCisKKwl1MzIgdHhfcmluZ19zaXplOworCXUzMiByeF9yaW5nX3NpemU7CisKKwl1MzIgbXNnX2VuYWJsZTsKKworCXUxNiBtYXhfdHhfc2dsX3NpemU7CisJdTE2IG1heF9yeF9zZ2xfc2l6ZTsKKworCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKKworCWNoYXIgbmFtZVtFTkFfTkFNRV9NQVhfTEVOXTsKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLyogVFggKi8KKwlzdHJ1Y3QgZW5hX3JpbmcgdHhfcmluZ1tFTkFfTUFYX05VTV9JT19RVUVVRVNdCisJCV9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisKKwkvKiBSWCAqLworCXN0cnVjdCBlbmFfcmluZyByeF9yaW5nW0VOQV9NQVhfTlVNX0lPX1FVRVVFU10KKwkJX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKKworCXN0cnVjdCBlbmFfbmFwaSBlbmFfbmFwaVtFTkFfTUFYX05VTV9JT19RVUVVRVNdOworCisJc3RydWN0IGVuYV9pcnEgaXJxX3RibFtFTkFfTUFYX01TSVhfVkVDKEVOQV9NQVhfTlVNX0lPX1FVRVVFUyldOworCisJLyogdGltZXIgc2VydmljZSAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCByZXNldF90YXNrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBzdXNwZW5kX2lvX3Rhc2s7CisJc3RydWN0IHdvcmtfc3RydWN0IHJlc3VtZV9pb190YXNrOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyX3NlcnZpY2U7CisKKwlib29sIHdkX3N0YXRlOworCXVuc2lnbmVkIGxvbmcgbGFzdF9rZWVwX2FsaXZlX2ppZmZpZXM7CisKKwlzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgc3luY3A7CisJc3RydWN0IGVuYV9zdGF0c19kZXYgZGV2X3N0YXRzOworCisJLyogbGFzdCBxdWV1ZSBpbmRleCB0aGF0IHdhcyBjaGVja2VkIGZvciB1bmNvbXBsZXRlZCB0eCBwYWNrZXRzICovCisJdTMyIGxhc3RfbW9uaXRvcmVkX3R4X3FpZDsKK307CisKK3ZvaWQgZW5hX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKKwordm9pZCBlbmFfZHVtcF9zdGF0c190b19kbWVzZyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpOworCit2b2lkIGVuYV9kdW1wX3N0YXRzX3RvX2J1ZihzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpidWYpOworCitpbnQgZW5hX2dldF9zc2V0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBzc2V0KTsKKworI2VuZGlmIC8qICEoRU5BX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9wY2lfaWRfdGJsLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9wY2lfaWRfdGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwZDJhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX3BjaV9pZF90YmwuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIEVOQV9QQ0lfSURfVEJMX0hfCisjZGVmaW5lIEVOQV9QQ0lfSURfVEJMX0hfCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9BTUFaT04KKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BTUFaT04gMHgxZDBmCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWX0lEX0VOQV9QRgorI2RlZmluZSBQQ0lfREVWX0lEX0VOQV9QRgkweDBlYzIKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZfSURfRU5BX0xMUV9QRgorI2RlZmluZSBQQ0lfREVWX0lEX0VOQV9MTFFfUEYJMHgxZWMyCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWX0lEX0VOQV9WRgorI2RlZmluZSBQQ0lfREVWX0lEX0VOQV9WRgkweGVjMjAKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZfSURfRU5BX0xMUV9WRgorI2RlZmluZSBQQ0lfREVWX0lEX0VOQV9MTFFfVkYJMHhlYzIxCisjZW5kaWYKKworI2RlZmluZSBFTkFfUENJX0lEX1RBQkxFX0VOVFJZKGRldmlkKSBcCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUFaT04sIGRldmlkKX0sCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBlbmFfcGNpX3RibFtdID0geworCUVOQV9QQ0lfSURfVEFCTEVfRU5UUlkoUENJX0RFVl9JRF9FTkFfUEYpCisJRU5BX1BDSV9JRF9UQUJMRV9FTlRSWShQQ0lfREVWX0lEX0VOQV9MTFFfUEYpCisJRU5BX1BDSV9JRF9UQUJMRV9FTlRSWShQQ0lfREVWX0lEX0VOQV9WRikKKwlFTkFfUENJX0lEX1RBQkxFX0VOVFJZKFBDSV9ERVZfSURfRU5BX0xMUV9WRikKKwl7IH0KK307CisKKyNlbmRpZiAvKiBFTkFfUENJX0lEX1RCTF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfcmVnc19kZWZzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9yZWdzX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjA5N2EyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfcmVnc19kZWZzLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSAtIDIwMTYgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBfRU5BX1JFR1NfSF8KKyNkZWZpbmUgX0VOQV9SRUdTX0hfCisKKy8qIGVuYV9yZWdpc3RlcnMgb2Zmc2V0cyAqLworI2RlZmluZSBFTkFfUkVHU19WRVJTSU9OX09GRgkJMHgwCisjZGVmaW5lIEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9PRkYJCTB4NAorI2RlZmluZSBFTkFfUkVHU19DQVBTX09GRgkJMHg4CisjZGVmaW5lIEVOQV9SRUdTX0NBUFNfRVhUX09GRgkJMHhjCisjZGVmaW5lIEVOQV9SRUdTX0FRX0JBU0VfTE9fT0ZGCQkweDEwCisjZGVmaW5lIEVOQV9SRUdTX0FRX0JBU0VfSElfT0ZGCQkweDE0CisjZGVmaW5lIEVOQV9SRUdTX0FRX0NBUFNfT0ZGCQkweDE4CisjZGVmaW5lIEVOQV9SRUdTX0FDUV9CQVNFX0xPX09GRgkJMHgyMAorI2RlZmluZSBFTkFfUkVHU19BQ1FfQkFTRV9ISV9PRkYJCTB4MjQKKyNkZWZpbmUgRU5BX1JFR1NfQUNRX0NBUFNfT0ZGCQkweDI4CisjZGVmaW5lIEVOQV9SRUdTX0FRX0RCX09GRgkJMHgyYworI2RlZmluZSBFTkFfUkVHU19BQ1FfVEFJTF9PRkYJCTB4MzAKKyNkZWZpbmUgRU5BX1JFR1NfQUVOUV9DQVBTX09GRgkJMHgzNAorI2RlZmluZSBFTkFfUkVHU19BRU5RX0JBU0VfTE9fT0ZGCQkweDM4CisjZGVmaW5lIEVOQV9SRUdTX0FFTlFfQkFTRV9ISV9PRkYJCTB4M2MKKyNkZWZpbmUgRU5BX1JFR1NfQUVOUV9IRUFEX0RCX09GRgkJMHg0MAorI2RlZmluZSBFTkFfUkVHU19BRU5RX1RBSUxfT0ZGCQkweDQ0CisjZGVmaW5lIEVOQV9SRUdTX0lOVFJfTUFTS19PRkYJCTB4NGMKKyNkZWZpbmUgRU5BX1JFR1NfREVWX0NUTF9PRkYJCTB4NTQKKyNkZWZpbmUgRU5BX1JFR1NfREVWX1NUU19PRkYJCTB4NTgKKyNkZWZpbmUgRU5BX1JFR1NfTU1JT19SRUdfUkVBRF9PRkYJCTB4NWMKKyNkZWZpbmUgRU5BX1JFR1NfTU1JT19SRVNQX0xPX09GRgkJMHg2MAorI2RlZmluZSBFTkFfUkVHU19NTUlPX1JFU1BfSElfT0ZGCQkweDY0CisjZGVmaW5lIEVOQV9SRUdTX1JTU19JTkRfRU5UUllfVVBEQVRFX09GRgkJMHg2OAorCisvKiB2ZXJzaW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIEVOQV9SRUdTX1ZFUlNJT05fTUlOT1JfVkVSU0lPTl9NQVNLCQkweGZmCisjZGVmaW5lIEVOQV9SRUdTX1ZFUlNJT05fTUFKT1JfVkVSU0lPTl9TSElGVAkJOAorI2RlZmluZSBFTkFfUkVHU19WRVJTSU9OX01BSk9SX1ZFUlNJT05fTUFTSwkJMHhmZjAwCisKKy8qIGNvbnRyb2xsZXJfdmVyc2lvbiByZWdpc3RlciAqLworI2RlZmluZSBFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fU1VCTUlOT1JfVkVSU0lPTl9NQVNLCQkweGZmCisjZGVmaW5lIEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9NSU5PUl9WRVJTSU9OX1NISUZUCQk4CisjZGVmaW5lIEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9NSU5PUl9WRVJTSU9OX01BU0sJCTB4ZmYwMAorI2RlZmluZSBFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fTUFKT1JfVkVSU0lPTl9TSElGVAkJMTYKKyNkZWZpbmUgRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX01BSk9SX1ZFUlNJT05fTUFTSwkJMHhmZjAwMDAKKyNkZWZpbmUgRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX0lNUExfSURfU0hJRlQJCTI0CisjZGVmaW5lIEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9JTVBMX0lEX01BU0sJCTB4ZmYwMDAwMDAKKworLyogY2FwcyByZWdpc3RlciAqLworI2RlZmluZSBFTkFfUkVHU19DQVBTX0NPTlRJR1VPVVNfUVVFVUVfUkVRVUlSRURfTUFTSwkJMHgxCisjZGVmaW5lIEVOQV9SRUdTX0NBUFNfUkVTRVRfVElNRU9VVF9TSElGVAkJMQorI2RlZmluZSBFTkFfUkVHU19DQVBTX1JFU0VUX1RJTUVPVVRfTUFTSwkJMHgzZQorI2RlZmluZSBFTkFfUkVHU19DQVBTX0RNQV9BRERSX1dJRFRIX1NISUZUCQk4CisjZGVmaW5lIEVOQV9SRUdTX0NBUFNfRE1BX0FERFJfV0lEVEhfTUFTSwkJMHhmZjAwCisKKy8qIGFxX2NhcHMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU5BX1JFR1NfQVFfQ0FQU19BUV9ERVBUSF9NQVNLCQkweGZmZmYKKyNkZWZpbmUgRU5BX1JFR1NfQVFfQ0FQU19BUV9FTlRSWV9TSVpFX1NISUZUCQkxNgorI2RlZmluZSBFTkFfUkVHU19BUV9DQVBTX0FRX0VOVFJZX1NJWkVfTUFTSwkJMHhmZmZmMDAwMAorCisvKiBhY3FfY2FwcyByZWdpc3RlciAqLworI2RlZmluZSBFTkFfUkVHU19BQ1FfQ0FQU19BQ1FfREVQVEhfTUFTSwkJMHhmZmZmCisjZGVmaW5lIEVOQV9SRUdTX0FDUV9DQVBTX0FDUV9FTlRSWV9TSVpFX1NISUZUCQkxNgorI2RlZmluZSBFTkFfUkVHU19BQ1FfQ0FQU19BQ1FfRU5UUllfU0laRV9NQVNLCQkweGZmZmYwMDAwCisKKy8qIGFlbnFfY2FwcyByZWdpc3RlciAqLworI2RlZmluZSBFTkFfUkVHU19BRU5RX0NBUFNfQUVOUV9ERVBUSF9NQVNLCQkweGZmZmYKKyNkZWZpbmUgRU5BX1JFR1NfQUVOUV9DQVBTX0FFTlFfRU5UUllfU0laRV9TSElGVAkJMTYKKyNkZWZpbmUgRU5BX1JFR1NfQUVOUV9DQVBTX0FFTlFfRU5UUllfU0laRV9NQVNLCQkweGZmZmYwMDAwCisKKy8qIGRldl9jdGwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU5BX1JFR1NfREVWX0NUTF9ERVZfUkVTRVRfTUFTSwkJMHgxCisjZGVmaW5lIEVOQV9SRUdTX0RFVl9DVExfQVFfUkVTVEFSVF9TSElGVAkJMQorI2RlZmluZSBFTkFfUkVHU19ERVZfQ1RMX0FRX1JFU1RBUlRfTUFTSwkJMHgyCisjZGVmaW5lIEVOQV9SRUdTX0RFVl9DVExfUVVJRVNDRU5UX1NISUZUCQkyCisjZGVmaW5lIEVOQV9SRUdTX0RFVl9DVExfUVVJRVNDRU5UX01BU0sJCTB4NAorI2RlZmluZSBFTkFfUkVHU19ERVZfQ1RMX0lPX1JFU1VNRV9TSElGVAkJMworI2RlZmluZSBFTkFfUkVHU19ERVZfQ1RMX0lPX1JFU1VNRV9NQVNLCQkweDgKKworLyogZGV2X3N0cyByZWdpc3RlciAqLworI2RlZmluZSBFTkFfUkVHU19ERVZfU1RTX1JFQURZX01BU0sJCTB4MQorI2RlZmluZSBFTkFfUkVHU19ERVZfU1RTX0FRX1JFU1RBUlRfSU5fUFJPR1JFU1NfU0hJRlQJCTEKKyNkZWZpbmUgRU5BX1JFR1NfREVWX1NUU19BUV9SRVNUQVJUX0lOX1BST0dSRVNTX01BU0sJCTB4MgorI2RlZmluZSBFTkFfUkVHU19ERVZfU1RTX0FRX1JFU1RBUlRfRklOSVNIRURfU0hJRlQJCTIKKyNkZWZpbmUgRU5BX1JFR1NfREVWX1NUU19BUV9SRVNUQVJUX0ZJTklTSEVEX01BU0sJCTB4NAorI2RlZmluZSBFTkFfUkVHU19ERVZfU1RTX1JFU0VUX0lOX1BST0dSRVNTX1NISUZUCQkzCisjZGVmaW5lIEVOQV9SRUdTX0RFVl9TVFNfUkVTRVRfSU5fUFJPR1JFU1NfTUFTSwkJMHg4CisjZGVmaW5lIEVOQV9SRUdTX0RFVl9TVFNfUkVTRVRfRklOSVNIRURfU0hJRlQJCTQKKyNkZWZpbmUgRU5BX1JFR1NfREVWX1NUU19SRVNFVF9GSU5JU0hFRF9NQVNLCQkweDEwCisjZGVmaW5lIEVOQV9SRUdTX0RFVl9TVFNfRkFUQUxfRVJST1JfU0hJRlQJCTUKKyNkZWZpbmUgRU5BX1JFR1NfREVWX1NUU19GQVRBTF9FUlJPUl9NQVNLCQkweDIwCisjZGVmaW5lIEVOQV9SRUdTX0RFVl9TVFNfUVVJRVNDRU5UX1NUQVRFX0lOX1BST0dSRVNTX1NISUZUCQk2CisjZGVmaW5lIEVOQV9SRUdTX0RFVl9TVFNfUVVJRVNDRU5UX1NUQVRFX0lOX1BST0dSRVNTX01BU0sJCTB4NDAKKyNkZWZpbmUgRU5BX1JFR1NfREVWX1NUU19RVUlFU0NFTlRfU1RBVEVfQUNISUVWRURfU0hJRlQJCTcKKyNkZWZpbmUgRU5BX1JFR1NfREVWX1NUU19RVUlFU0NFTlRfU1RBVEVfQUNISUVWRURfTUFTSwkJMHg4MAorCisvKiBtbWlvX3JlZ19yZWFkIHJlZ2lzdGVyICovCisjZGVmaW5lIEVOQV9SRUdTX01NSU9fUkVHX1JFQURfUkVRX0lEX01BU0sJCTB4ZmZmZgorI2RlZmluZSBFTkFfUkVHU19NTUlPX1JFR19SRUFEX1JFR19PRkZfU0hJRlQJCTE2CisjZGVmaW5lIEVOQV9SRUdTX01NSU9fUkVHX1JFQURfUkVHX09GRl9NQVNLCQkweGZmZmYwMDAwCisKKy8qIHJzc19pbmRfZW50cnlfdXBkYXRlIHJlZ2lzdGVyICovCisjZGVmaW5lIEVOQV9SRUdTX1JTU19JTkRfRU5UUllfVVBEQVRFX0lOREVYX01BU0sJCTB4ZmZmZgorI2RlZmluZSBFTkFfUkVHU19SU1NfSU5EX0VOVFJZX1VQREFURV9DUV9JRFhfU0hJRlQJCTE2CisjZGVmaW5lIEVOQV9SRUdTX1JTU19JTkRfRU5UUllfVVBEQVRFX0NRX0lEWF9NQVNLCQkweGZmZmYwMDAwCisKKyNlbmRpZiAvKl9FTkFfUkVHU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kLzc5OTAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC83OTkwLmMKaW5kZXggZGNmMmExZi4uZGM1N2YyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kLzc5OTAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvNzk5MC5jCkBAIC00NSwxNCArNDUsMTQgQEAKICNkZWZpbmUgV1JJVEVSRFAobHAsIHgpCW91dF9iZTE2KGxwLT5iYXNlICsgTEFOQ0VfUkRQLCAoeCkpCiAjZGVmaW5lIFJFQURSRFAobHApCWluX2JlMTYobHAtPmJhc2UgKyBMQU5DRV9SRFApCiAKLSNpZiBkZWZpbmVkKENPTkZJR19IUExBTkNFKSB8fCBkZWZpbmVkKENPTkZJR19IUExBTkNFX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19IUExBTkNFKQogI2luY2x1ZGUgImhwbGFuY2UuaCIKIAogI3VuZGVmIFdSSVRFUkFQCiAjdW5kZWYgV1JJVEVSRFAKICN1bmRlZiBSRUFEUkRQCiAKLSNpZiBkZWZpbmVkKENPTkZJR19NVk1FMTQ3X05FVCkgfHwgZGVmaW5lZChDT05GSUdfTVZNRTE0N19ORVRfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX01WTUUxNDdfTkVUKQogCiAvKiBMb3NzYWdlIEZhY3RvciBOaW5lLCBNciBTdWx1LiAqLwogI2RlZmluZSBXUklURVJBUChscCwgeCkJKGxwLT53cml0ZXJhcChscCwgeCkpCkBAIC04Niw3ICs4Niw3IEBACiB9CiAKICNlbmRpZgotI2VuZGlmIC8qIENPTkZJR19IUExBTkNFIHx8IENPTkZJR19IUExBTkNFX01PRFVMRSAqLworI2VuZGlmIC8qIElTX0VOQUJMRUQoQ09ORklHX0hQTEFOQ0UpICovCiAKIC8qIGRlYnVnZ2luZyBvdXRwdXQgbWFjcm9zLCB2YXJpb3VzIGZsYXZvdXJzICovCiAvKiAjZGVmaW5lIFRFU1RfSElUUyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2FtZDgxMTFlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYW1kODExMWUuYwppbmRleCA5NDk2MDA1Li5mOTJjYzk3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2FtZDgxMTFlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2FtZDgxMTFlLmMKQEAgLTg5LDcgKzg5LDcgQEAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1ZMQU5fODAyMVEpCiAjZGVmaW5lIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQgMQogI2Vsc2UKICNkZWZpbmUgQU1EODExMUVfVkxBTl9UQUdfVVNFRCAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWRydi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1kcnYuYwppbmRleCBhOWIyNzA5Li43ZjkyMTZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWRydi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZHJ2LmMKQEAgLTE3MDgsOSArMTcwOCw5IEBACiAJLm5kb19zZXRfZmVhdHVyZXMJPSB4Z2JlX3NldF9mZWF0dXJlcywKIH07CiAKLXN0cnVjdCBuZXRfZGV2aWNlX29wcyAqeGdiZV9nZXRfbmV0ZGV2X29wcyh2b2lkKQorY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICp4Z2JlX2dldF9uZXRkZXZfb3BzKHZvaWQpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKikmeGdiZV9uZXRkZXZfb3BzOworCXJldHVybiAmeGdiZV9uZXRkZXZfb3BzOwogfQogCiBzdGF0aWMgdm9pZCB4Z2JlX3J4X3JlZnJlc2goc3RydWN0IHhnYmVfY2hhbm5lbCAqY2hhbm5lbCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1ldGh0b29sLmMKaW5kZXggMTFkOWYwYy4uNDAwN2I0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1ldGh0b29sLmMKQEAgLTYyMyw3ICs2MjMsNyBAQAogCS5nZXRfdHNfaW5mbyA9IHhnYmVfZ2V0X3RzX2luZm8sCiB9OwogCi1zdHJ1Y3QgZXRodG9vbF9vcHMgKnhnYmVfZ2V0X2V0aHRvb2xfb3BzKHZvaWQpCitjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgKnhnYmVfZ2V0X2V0aHRvb2xfb3BzKHZvaWQpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgZXRodG9vbF9vcHMgKikmeGdiZV9ldGh0b29sX29wczsKKwlyZXR1cm4gJnhnYmVfZXRodG9vbF9vcHM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLW1haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtbWFpbi5jCmluZGV4IDNlZWUzMjAuLjlkZTA3ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtbWFpbi5jCkBAIC04NjEsOSArODYxLDE1IEBACiAJcGRhdGEtPmxwbV9jdHJsICY9IH5NRElPX0NUUkwxX0xQT1dFUjsKIAlYTURJT19XUklURShwZGF0YSwgTURJT19NTURfUENTLCBNRElPX0NUUkwxLCBwZGF0YS0+bHBtX2N0cmwpOwogCi0JaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CiAJCXJldCA9IHhnYmVfcG93ZXJ1cChuZXRkZXYsIFhHTUFDX0RSSVZFUl9DT05URVhUKTsKIAorCQkvKiBTY2hlZHVsZSBhIHJlc3RhcnQgaW4gY2FzZSB0aGUgbGluayBvciBwaHkgc3RhdGUgY2hhbmdlZAorCQkgKiB3aGlsZSB3ZSB3ZXJlIHBvd2VyZWQgZG93bi4KKwkJICovCisJCXNjaGVkdWxlX3dvcmsoJnBkYXRhLT5yZXN0YXJ0X3dvcmspOworCX0KKwogCURCR1BSKCI8LS14Z2JlX3Jlc3VtZVxuIik7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS5oCmluZGV4IDk4ZDlkNjMuLjVkZDE3ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLmgKQEAgLTk1Niw4ICs5NTYsOSBAQAogdm9pZCB4Z2JlX2luaXRfZnVuY3Rpb25fcHRyc19kZXYoc3RydWN0IHhnYmVfaHdfaWYgKik7CiB2b2lkIHhnYmVfaW5pdF9mdW5jdGlvbl9wdHJzX3BoeShzdHJ1Y3QgeGdiZV9waHlfaWYgKik7CiB2b2lkIHhnYmVfaW5pdF9mdW5jdGlvbl9wdHJzX2Rlc2Moc3RydWN0IHhnYmVfZGVzY19pZiAqKTsKLXN0cnVjdCBuZXRfZGV2aWNlX29wcyAqeGdiZV9nZXRfbmV0ZGV2X29wcyh2b2lkKTsKLXN0cnVjdCBldGh0b29sX29wcyAqeGdiZV9nZXRfZXRodG9vbF9vcHModm9pZCk7Citjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKnhnYmVfZ2V0X25ldGRldl9vcHModm9pZCk7Citjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgKnhnYmVfZ2V0X2V0aHRvb2xfb3BzKHZvaWQpOworCiAjaWZkZWYgQ09ORklHX0FNRF9YR0JFX0RDQgogY29uc3Qgc3RydWN0IGRjYm5sX3J0bmxfb3BzICp4Z2JlX2dldF9kY2JubF9vcHModm9pZCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL0tjb25maWcKaW5kZXggMzAwZTNiNS4uYWZjY2IwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL0tjb25maWcKQEAgLTQsNiArNCw3IEBACiAJZGVwZW5kcyBvbiBBUkNIX1hHRU5FIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBQSFlMSUIKIAlzZWxlY3QgTURJT19YR0VORQorCXNlbGVjdCBHUElPTElCCiAJaGVscAogCSAgVGhpcyBpcyB0aGUgRXRoZXJuZXQgZHJpdmVyIGZvciB0aGUgb24tY2hpcCBldGhlcm5ldCBpbnRlcmZhY2Ugb24gdGhlCiAJICBBUE0gWC1HZW5lIFNvQy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2NsZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfY2xlLmMKaW5kZXggNDcyYzBmYi4uMjNkNzJhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfY2xlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfY2xlLmMKQEAgLTMyLDEyICszMiwxOSBAQAogCQlTRVRfVkFMKFNCX0hEUkxFTiwgbGVuKTsKIH0KIAotc3RhdGljIHZvaWQgeGdlbmVfY2xlX2lkdF90b19odyh1MzIgZHN0cWlkLCB1MzIgZnBzZWwsCitzdGF0aWMgdm9pZCB4Z2VuZV9jbGVfaWR0X3RvX2h3KHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSwKKwkJCQl1MzIgZHN0cWlkLCB1MzIgZnBzZWwsCiAJCQkJdTMyIG5mcHNlbCwgdTMyICppZHRfcmVnKQogewotCSppZHRfcmVnID0gIFNFVF9WQUwoSURUX0RTVFFJRCwgZHN0cWlkKSB8Ci0JCSAgICBTRVRfVkFMKElEVF9GUFNFTCwgZnBzZWwpIHwKLQkJICAgIFNFVF9WQUwoSURUX05GUFNFTCwgbmZwc2VsKTsKKwlpZiAocGRhdGEtPmVuZXRfaWQgPT0gWEdFTkVfRU5FVDEpIHsKKwkJKmlkdF9yZWcgPSBTRVRfVkFMKElEVF9EU1RRSUQsIGRzdHFpZCkgfAorCQkJICAgU0VUX1ZBTChJRFRfRlBTRUwxLCBmcHNlbCkgIHwKKwkJCSAgIFNFVF9WQUwoSURUX05GUFNFTDEsIG5mcHNlbCk7CisJfSBlbHNlIHsKKwkJKmlkdF9yZWcgPSBTRVRfVkFMKElEVF9EU1RRSUQsIGRzdHFpZCkgfAorCQkJICAgU0VUX1ZBTChJRFRfRlBTRUwsIGZwc2VsKSAgIHwKKwkJCSAgIFNFVF9WQUwoSURUX05GUFNFTCwgbmZwc2VsKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHhnZW5lX2NsZV9kYnB0cl90b19odyhzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEsCkBAIC0zNDQsNyArMzUxLDcgQEAKIAkJbmZwc2VsID0gMDsKIAkJaWR0X3JlZyA9IDA7CiAKLQkJeGdlbmVfY2xlX2lkdF90b19odyhkc3RxaWQsIGZwc2VsLCBuZnBzZWwsICZpZHRfcmVnKTsKKwkJeGdlbmVfY2xlX2lkdF90b19odyhwZGF0YSwgZHN0cWlkLCBmcHNlbCwgbmZwc2VsLCAmaWR0X3JlZyk7CiAJCXJldCA9IHhnZW5lX2NsZV9kcmFtX3dyKCZwZGF0YS0+Y2xlLCAmaWR0X3JlZywgMSwgaSwKIAkJCQkJUlNTX0lEVCwgQ0xFX0NNRF9XUik7CiAJCWlmIChyZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9jbGUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2NsZS5oCmluZGV4IDMzYzVmNmIuLjlhYzlmOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2NsZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2NsZS5oCkBAIC0xOTYsOSArMTk2LDEzIEBACiAjZGVmaW5lIElEVF9EU1RRSURfUE9TCQkwCiAjZGVmaW5lIElEVF9EU1RRSURfTEVOCQkxMgogI2RlZmluZSBJRFRfRlBTRUxfUE9TCQkxMgotI2RlZmluZSBJRFRfRlBTRUxfTEVOCQk0Ci0jZGVmaW5lIElEVF9ORlBTRUxfUE9TCQkxNgotI2RlZmluZSBJRFRfTkZQU0VMX0xFTgkJNAorI2RlZmluZSBJRFRfRlBTRUxfTEVOCQk1CisjZGVmaW5lIElEVF9ORlBTRUxfUE9TCQkxNworI2RlZmluZSBJRFRfTkZQU0VMX0xFTgkJNQorI2RlZmluZSBJRFRfRlBTRUwxX1BPUwkJMTIKKyNkZWZpbmUgSURUX0ZQU0VMMV9MRU4JCTQKKyNkZWZpbmUgSURUX05GUFNFTDFfUE9TCQkxNgorI2RlZmluZSBJRFRfTkZQU0VMMV9MRU4JCTQKIAogc3RydWN0IHhnZW5lX2NsZV9wdHJlZV9icmFuY2ggewogCWJvb2wgdmFsaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9ldGh0b29sLmMKaW5kZXggMjJhN2IyNi4uZDM3MmQ0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2V0aHRvb2wuYwpAQCAtNTQsNTUgKzU0LDY4IEBACiAJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIiVzIiwgcGRldi0+bmFtZSk7CiB9CiAKLXN0YXRpYyBpbnQgeGdlbmVfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgeGdlbmVfZ2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCXN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KG5kZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBwZGF0YS0+cGh5X2RldjsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gbmRldi0+cGh5ZGV2OworCXUzMiBzdXBwb3J0ZWQ7CiAKIAlpZiAocGRhdGEtPnBoeV9tb2RlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSSkgewogCQlpZiAocGh5ZGV2ID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAotCQlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChwaHlkZXYsIGNtZCk7CisJCXJldHVybiBwaHlfZXRodG9vbF9rc2V0dGluZ3NfZ2V0KHBoeWRldiwgY21kKTsKIAl9IGVsc2UgaWYgKHBkYXRhLT5waHlfbW9kZSA9PSBQSFlfSU5URVJGQUNFX01PREVfU0dNSUkpIHsKIAkJaWYgKHBkYXRhLT5tZGlvX2RyaXZlcikgewogCQkJaWYgKCFwaHlkZXYpCiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAKLQkJCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KHBoeWRldiwgY21kKTsKKwkJCXJldHVybiBwaHlfZXRodG9vbF9rc2V0dGluZ3NfZ2V0KHBoeWRldiwgY21kKTsKIAkJfQogCi0JCWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEX0F1dG9uZWcgfAotCQkJCSBTVVBQT1JURURfTUlJOwotCQljbWQtPmFkdmVydGlzaW5nID0gY21kLT5zdXBwb3J0ZWQ7Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsIFNQRUVEXzEwMDApOwotCQljbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOwotCQljbWQtPnBvcnQgPSBQT1JUX01JSTsKLQkJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7Ci0JCWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOworCQlzdXBwb3J0ZWQgPSBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfQXV0b25lZyB8CisJCQlTVVBQT1JURURfTUlJOworCQlldGh0b29sX2NvbnZlcnRfbGVnYWN5X3UzMl90b19saW5rX21vZGUoCisJCQljbWQtPmxpbmtfbW9kZXMuc3VwcG9ydGVkLAorCQkJc3VwcG9ydGVkKTsKKwkJZXRodG9vbF9jb252ZXJ0X2xlZ2FjeV91MzJfdG9fbGlua19tb2RlKAorCQkJY21kLT5saW5rX21vZGVzLmFkdmVydGlzaW5nLAorCQkJc3VwcG9ydGVkKTsKKworCQljbWQtPmJhc2Uuc3BlZWQgPSBTUEVFRF8xMDAwOworCQljbWQtPmJhc2UuZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCWNtZC0+YmFzZS5wb3J0ID0gUE9SVF9NSUk7CisJCWNtZC0+YmFzZS5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CiAJfSBlbHNlIHsKLQkJY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEX0ZJQlJFOwotCQljbWQtPmFkdmVydGlzaW5nID0gY21kLT5zdXBwb3J0ZWQ7Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsIFNQRUVEXzEwMDAwKTsKLQkJY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKLQkJY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKLQkJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7Ci0JCWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKwkJc3VwcG9ydGVkID0gU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9GSUJSRTsKKwkJZXRodG9vbF9jb252ZXJ0X2xlZ2FjeV91MzJfdG9fbGlua19tb2RlKAorCQkJY21kLT5saW5rX21vZGVzLnN1cHBvcnRlZCwKKwkJCXN1cHBvcnRlZCk7CisJCWV0aHRvb2xfY29udmVydF9sZWdhY3lfdTMyX3RvX2xpbmtfbW9kZSgKKwkJCWNtZC0+bGlua19tb2Rlcy5hZHZlcnRpc2luZywKKwkJCXN1cHBvcnRlZCk7CisKKwkJY21kLT5iYXNlLnNwZWVkID0gU1BFRURfMTAwMDA7CisJCWNtZC0+YmFzZS5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJY21kLT5iYXNlLnBvcnQgPSBQT1JUX0ZJQlJFOworCQljbWQtPmJhc2UuYXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB4Z2VuZV9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIGludCB4Z2VuZV9zZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhID0gbmV0ZGV2X3ByaXYobmRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHBkYXRhLT5waHlfZGV2OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBuZGV2LT5waHlkZXY7CiAKIAlpZiAocGRhdGEtPnBoeV9tb2RlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSSkgewogCQlpZiAoIXBoeWRldikKIAkJCXJldHVybiAtRU5PREVWOwogCi0JCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KHBoeWRldiwgY21kKTsKKwkJcmV0dXJuIHBoeV9ldGh0b29sX2tzZXR0aW5nc19zZXQocGh5ZGV2LCBjbWQpOwogCX0KIAogCWlmIChwZGF0YS0+cGh5X21vZGUgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJKSB7CkBAIC0xMTAsNyArMTIzLDcgQEAKIAkJCWlmICghcGh5ZGV2KQogCQkJCXJldHVybiAtRU5PREVWOwogCi0JCQlyZXR1cm4gcGh5X2V0aHRvb2xfc3NldChwaHlkZXYsIGNtZCk7CisJCQlyZXR1cm4gcGh5X2V0aHRvb2xfa3NldHRpbmdzX3NldChwaHlkZXYsIGNtZCk7CiAJCX0KIAl9CiAKQEAgLTE1MiwxMiArMTY1LDEyIEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgeGdlbmVfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvID0geGdlbmVfZ2V0X2RydmluZm8sCi0JLmdldF9zZXR0aW5ncyA9IHhnZW5lX2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzID0geGdlbmVfc2V0X3NldHRpbmdzLAogCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCiAJLmdldF9zdHJpbmdzID0geGdlbmVfZ2V0X3N0cmluZ3MsCiAJLmdldF9zc2V0X2NvdW50ID0geGdlbmVfZ2V0X3NzZXRfY291bnQsCi0JLmdldF9ldGh0b29sX3N0YXRzID0geGdlbmVfZ2V0X2V0aHRvb2xfc3RhdHMKKwkuZ2V0X2V0aHRvb2xfc3RhdHMgPSB4Z2VuZV9nZXRfZXRodG9vbF9zdGF0cywKKwkuZ2V0X2xpbmtfa3NldHRpbmdzID0geGdlbmVfZ2V0X2xpbmtfa3NldHRpbmdzLAorCS5zZXRfbGlua19rc2V0dGluZ3MgPSB4Z2VuZV9zZXRfbGlua19rc2V0dGluZ3MsCiB9OwogCiB2b2lkIHhnZW5lX2VuZXRfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfaHcuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2h3LmMKaW5kZXggMzdhMGY0Ni4uYzQ4MWYxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfaHcuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9ody5jCkBAIC03MTMsNyArNzEzLDcgQEAKIHsKIAlzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAljb25zdCBzdHJ1Y3QgeGdlbmVfbWFjX29wcyAqbWFjX29wcyA9IHBkYXRhLT5tYWNfb3BzOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBwZGF0YS0+cGh5X2RldjsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gbmRldi0+cGh5ZGV2OwogCiAJaWYgKHBoeWRldi0+bGluaykgewogCQlpZiAocGRhdGEtPnBoeV9zcGVlZCAhPSBwaHlkZXYtPnNwZWVkKSB7CkBAIC03NjEsMzEgKzc2MSwyNSBAQAogCWlmIChkZXYtPm9mX25vZGUpIHsKIAkJZm9yIChpID0gMCA7IGkgPCAyOyBpKyspIHsKIAkJCW5wID0gb2ZfcGFyc2VfcGhhbmRsZShkZXYtPm9mX25vZGUsICJwaHktaGFuZGxlIiwgaSk7Ci0JCQlpZiAobnApCisJCQlwaHlfZGV2ID0gb2ZfcGh5X2Nvbm5lY3QobmRldiwgbnAsCisJCQkJCQkgJnhnZW5lX2VuZXRfYWRqdXN0X2xpbmssCisJCQkJCQkgMCwgcGRhdGEtPnBoeV9tb2RlKTsKKwkJCW9mX25vZGVfcHV0KG5wKTsKKwkJCWlmIChwaHlfZGV2KQogCQkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKCFucCkgewotCQkJbmV0ZGV2X2RiZyhuZGV2LCAiTm8gcGh5LWhhbmRsZSBmb3VuZCBpbiBEVFxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCi0JCXBoeV9kZXYgPSBvZl9waHlfY29ubmVjdChuZGV2LCBucCwgJnhnZW5lX2VuZXRfYWRqdXN0X2xpbmssCi0JCQkJCSAwLCBwZGF0YS0+cGh5X21vZGUpOwotCQlvZl9ub2RlX3B1dChucCk7CiAJCWlmICghcGh5X2RldikgewogCQkJbmV0ZGV2X2VycihuZGV2LCAiQ291bGQgbm90IGNvbm5lY3QgdG8gUEhZXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9Ci0KLQkJcGRhdGEtPnBoeV9kZXYgPSBwaHlfZGV2OwogCX0gZWxzZSB7CiAjaWZkZWYgQ09ORklHX0FDUEkKIAkJc3RydWN0IGFjcGlfZGV2aWNlICphZGV2ID0gYWNwaV9waHlfZmluZF9kZXZpY2UoZGV2KTsKIAkJaWYgKGFkZXYpCi0JCQlwZGF0YS0+cGh5X2RldiA9ICBhZGV2LT5kcml2ZXJfZGF0YTsKLQotCQlwaHlfZGV2ID0gcGRhdGEtPnBoeV9kZXY7CisJCQlwaHlfZGV2ID0gYWRldi0+ZHJpdmVyX2RhdGE7CisJCWVsc2UKKwkJCXBoeV9kZXYgPSBOVUxMOwogCiAJCWlmICghcGh5X2RldiB8fAogCQkgICAgcGh5X2Nvbm5lY3RfZGlyZWN0KG5kZXYsIHBoeV9kZXYsICZ4Z2VuZV9lbmV0X2FkanVzdF9saW5rLApAQCAtNzkzLDYgKzc4Nyw4IEBACiAJCQluZXRkZXZfZXJyKG5kZXYsICJDb3VsZCBub3QgY29ubmVjdCB0byBQSFlcbiIpOwogCQkJcmV0dXJuICAtRU5PREVWOwogCQl9CisjZWxzZQorCQlyZXR1cm4gLUVOT0RFVjsKICNlbmRpZgogCX0KIApAQCAtODUxLDggKzg0Nyw2IEBACiAJaWYgKCFwaHkpCiAJCXJldHVybiAtRUlPOwogCi0JcGRhdGEtPnBoeV9kZXYgPSBwaHk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC04OTIsMTQgKzg4NiwxOCBAQAogCiB2b2lkIHhnZW5lX2VuZXRfcGh5X2Rpc2Nvbm5lY3Qoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhKQogewotCWlmIChwZGF0YS0+cGh5X2RldikKLQkJcGh5X2Rpc2Nvbm5lY3QocGRhdGEtPnBoeV9kZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGRhdGEtPm5kZXY7CisKKwlpZiAobmRldi0+cGh5ZGV2KQorCQlwaHlfZGlzY29ubmVjdChuZGV2LT5waHlkZXYpOwogfQogCiB2b2lkIHhnZW5lX2VuZXRfbWRpb19yZW1vdmUoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhKQogewotCWlmIChwZGF0YS0+cGh5X2RldikKLQkJcGh5X2Rpc2Nvbm5lY3QocGRhdGEtPnBoeV9kZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGRhdGEtPm5kZXY7CisKKwlpZiAobmRldi0+cGh5ZGV2KQorCQlwaHlfZGlzY29ubmVjdChuZGV2LT5waHlkZXYpOwogCiAJbWRpb2J1c191bnJlZ2lzdGVyKHBkYXRhLT5tZGlvX2J1cyk7CiAJbWRpb2J1c19mcmVlKHBkYXRhLT5tZGlvX2J1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9ody5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfaHcuaAppbmRleCAxNzlhNDRkLi44NDU2MzM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9ody5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2h3LmgKQEAgLTEyNCw2ICsxMjQsMTIgQEAKICNkZWZpbmUgTUFDX1JFQURfUkVHX09GRlNFVAkJMHgwYwogI2RlZmluZSBNQUNfQ09NTUFORF9ET05FX1JFR19PRkZTRVQJMHgxMAogCisjZGVmaW5lIFBDU19BRERSX1JFR19PRkZTRVQJCTB4MDAKKyNkZWZpbmUgUENTX0NPTU1BTkRfUkVHX09GRlNFVAkJMHgwNAorI2RlZmluZSBQQ1NfV1JJVEVfUkVHX09GRlNFVAkJMHgwOAorI2RlZmluZSBQQ1NfUkVBRF9SRUdfT0ZGU0VUCQkweDBjCisjZGVmaW5lIFBDU19DT01NQU5EX0RPTkVfUkVHX09GRlNFVAkweDEwCisKICNkZWZpbmUgTUlJX01HTVRfQ09ORklHX0FERFIJCTB4MjAKICNkZWZpbmUgTUlJX01HTVRfQ09NTUFORF9BRERSCQkweDI0CiAjZGVmaW5lIE1JSV9NR01UX0FERFJFU1NfQUREUgkJMHgyOApAQCAtMjMxLDYgKzIzNyw4IEBACiAjZGVmaW5lIFRDUEhEUl9MRU4JCQk2CiAjZGVmaW5lIElQSERSX1BPUwkJCTYKICNkZWZpbmUgSVBIRFJfTEVOCQkJNgorI2RlZmluZSBNU1NfUE9TCQkJCTIwCisjZGVmaW5lIE1TU19MRU4JCQkJMgogI2RlZmluZSBFQ19QT1MJCQkJMjIJLyogRW5hYmxlIGNoZWNrc3VtICovCiAjZGVmaW5lIEVDX0xFTgkJCQkxCiAjZGVmaW5lIEVUX1BPUwkJCQkyMwkvKiBFbmFibGUgVFNPICovCkBAIC0yNDcsNiArMjU1LDExIEBACiAKICNkZWZpbmUgTEFTVF9CVUZGRVIJCQkoMHg3ODAwVUxMIDw8IEJVRkRBVEFMRU5fUE9TKQogCisjZGVmaW5lIFRTT19NU1MwX1BPUwkJCTAKKyNkZWZpbmUgVFNPX01TUzBfTEVOCQkJMTQKKyNkZWZpbmUgVFNPX01TUzFfUE9TCQkJMTYKKyNkZWZpbmUgVFNPX01TUzFfTEVOCQkJMTQKKwogc3RydWN0IHhnZW5lX2VuZXRfcmF3X2Rlc2MgewogCV9fbGU2NCBtMDsKIAlfX2xlNjQgbTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9tYWluLmMKaW5kZXggZDFkNmI1ZS4uNDI5ZjE4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X21haW4uYwpAQCAtMTksNiArMTksNyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlICJ4Z2VuZV9lbmV0X21haW4uaCIKICNpbmNsdWRlICJ4Z2VuZV9lbmV0X2h3LmgiCiAjaW5jbHVkZSAieGdlbmVfZW5ldF9zZ21hYy5oIgpAQCAtNzIsNyArNzMsNiBAQAogCQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKG5kZXYsIGxlbik7CiAJCWlmICh1bmxpa2VseSghc2tiKSkKIAkJCXJldHVybiAtRU5PTUVNOwotCQlidWZfcG9vbC0+cnhfc2tiW3RhaWxdID0gc2tiOwogCiAJCWRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUoZGV2LCBza2ItPmRhdGEsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKIAkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgZG1hX2FkZHIpKSB7CkBAIC04MSw2ICs4MSw4IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCisJCWJ1Zl9wb29sLT5yeF9za2JbdGFpbF0gPSBza2I7CisKIAkJcmF3X2Rlc2MtPm0xID0gY3B1X3RvX2xlNjQoU0VUX1ZBTChEQVRBQUREUiwgZG1hX2FkZHIpIHwKIAkJCQkJICAgU0VUX1ZBTChCVUZEQVRBTEVOLCBidWZkYXRhbGVuKSB8CiAJCQkJCSAgIFNFVF9CSVQoQ09IRVJFTlQpKTsKQEAgLTEwMiwxMiArMTA0LDIxIEBACiAKIHN0YXRpYyB2b2lkIHhnZW5lX2VuZXRfZGVsZXRlX2J1ZnBvb2woc3RydWN0IHhnZW5lX2VuZXRfZGVzY19yaW5nICpidWZfcG9vbCkKIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBuZGV2X3RvX2RldihidWZfcG9vbC0+bmRldik7CisJc3RydWN0IHhnZW5lX2VuZXRfcmF3X2Rlc2MxNiAqcmF3X2Rlc2M7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKIAlpbnQgaTsKIAogCS8qIEZyZWUgdXAgdGhlIGJ1ZmZlcnMgaGVsZCBieSBoYXJkd2FyZSAqLwogCWZvciAoaSA9IDA7IGkgPCBidWZfcG9vbC0+c2xvdHM7IGkrKykgewotCQlpZiAoYnVmX3Bvb2wtPnJ4X3NrYltpXSkKKwkJaWYgKGJ1Zl9wb29sLT5yeF9za2JbaV0pIHsKIAkJCWRldl9rZnJlZV9za2JfYW55KGJ1Zl9wb29sLT5yeF9za2JbaV0pOworCisJCQlyYXdfZGVzYyA9ICZidWZfcG9vbC0+cmF3X2Rlc2MxNltpXTsKKwkJCWRtYV9hZGRyID0gR0VUX1ZBTChEQVRBQUREUiwgbGU2NF90b19jcHUocmF3X2Rlc2MtPm0xKSk7CisJCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgZG1hX2FkZHIsIFhHRU5FX0VORVRfTUFYX01UVSwKKwkJCQkJIERNQV9GUk9NX0RFVklDRSk7CisJCX0KIAl9CiB9CiAKQEAgLTEyNiw2ICsxMzcsNyBAQAogc3RhdGljIGludCB4Z2VuZV9lbmV0X3R4X2NvbXBsZXRpb24oc3RydWN0IHhnZW5lX2VuZXRfZGVzY19yaW5nICpjcF9yaW5nLAogCQkJCSAgICBzdHJ1Y3QgeGdlbmVfZW5ldF9yYXdfZGVzYyAqcmF3X2Rlc2MpCiB7CisJc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhID0gbmV0ZGV2X3ByaXYoY3BfcmluZy0+bmRldik7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc2tiX2ZyYWdfdCAqZnJhZzsKQEAgLTEzMyw2ICsxNDUsNyBAQAogCXUxNiBza2JfaW5kZXg7CiAJdTggc3RhdHVzOwogCWludCBpLCByZXQgPSAwOworCXU4IG1zc19pbmRleDsKIAogCXNrYl9pbmRleCA9IEdFVF9WQUwoVVNFUklORk8sIGxlNjRfdG9fY3B1KHJhd19kZXNjLT5tMCkpOwogCXNrYiA9IGNwX3JpbmctPmNwX3NrYltza2JfaW5kZXhdOwpAQCAtMTQ5LDYgKzE2MiwxMyBAQAogCQkJICAgICAgIERNQV9UT19ERVZJQ0UpOwogCX0KIAorCWlmIChHRVRfQklUKEVULCBsZTY0X3RvX2NwdShyYXdfZGVzYy0+bTMpKSkgeworCQltc3NfaW5kZXggPSBHRVRfVkFMKE1TUywgbGU2NF90b19jcHUocmF3X2Rlc2MtPm0zKSk7CisJCXNwaW5fbG9jaygmcGRhdGEtPm1zc19sb2NrKTsKKwkJcGRhdGEtPm1zc19yZWZjbnRbbXNzX2luZGV4XS0tOworCQlzcGluX3VubG9jaygmcGRhdGEtPm1zc19sb2NrKTsKKwl9CisKIAkvKiBDaGVja2luZyBmb3IgZXJyb3IgKi8KIAlzdGF0dXMgPSBHRVRfVkFMKExFUlIsIGxlNjRfdG9fY3B1KHJhd19kZXNjLT5tMCkpOwogCWlmICh1bmxpa2VseShzdGF0dXMgPiAyKSkgewpAQCAtMTY3LDE1ICsxODcsNTMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdTY0IHhnZW5lX2VuZXRfd29ya19tc2coc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgeGdlbmVfZW5ldF9zZXR1cF9tc3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHUzMiBtc3MpCit7CisJc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhID0gbmV0ZGV2X3ByaXYobmRldik7CisJYm9vbCBtc3NfaW5kZXhfZm91bmQgPSBmYWxzZTsKKwlpbnQgbXNzX2luZGV4OworCWludCBpOworCisJc3Bpbl9sb2NrKCZwZGF0YS0+bXNzX2xvY2spOworCisJLyogUmV1c2UgdGhlIHNsb3QgaWYgTVNTIG1hdGNoZXMgKi8KKwlmb3IgKGkgPSAwOyAhbXNzX2luZGV4X2ZvdW5kICYmIGkgPCBOVU1fTVNTX1JFRzsgaSsrKSB7CisJCWlmIChwZGF0YS0+bXNzW2ldID09IG1zcykgeworCQkJcGRhdGEtPm1zc19yZWZjbnRbaV0rKzsKKwkJCW1zc19pbmRleCA9IGk7CisJCQltc3NfaW5kZXhfZm91bmQgPSB0cnVlOworCQl9CisJfQorCisJLyogT3ZlcndyaXRlIHRoZSBzbG90IHdpdGggcmVmX2NvdW50ID0gMCAqLworCWZvciAoaSA9IDA7ICFtc3NfaW5kZXhfZm91bmQgJiYgaSA8IE5VTV9NU1NfUkVHOyBpKyspIHsKKwkJaWYgKCFwZGF0YS0+bXNzX3JlZmNudFtpXSkgeworCQkJcGRhdGEtPm1zc19yZWZjbnRbaV0rKzsKKwkJCXBkYXRhLT5tYWNfb3BzLT5zZXRfbXNzKHBkYXRhLCBtc3MsIGkpOworCQkJcGRhdGEtPm1zc1tpXSA9IG1zczsKKwkJCW1zc19pbmRleCA9IGk7CisJCQltc3NfaW5kZXhfZm91bmQgPSB0cnVlOworCQl9CisJfQorCisJc3Bpbl91bmxvY2soJnBkYXRhLT5tc3NfbG9jayk7CisKKwkvKiBObyBzbG90cyB3aXRoIHJlZl9jb3VudCA9IDAgYXZhaWxhYmxlLCByZXR1cm4gYnVzeSAqLworCWlmICghbXNzX2luZGV4X2ZvdW5kKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIG1zc19pbmRleDsKK30KKworc3RhdGljIGludCB4Z2VuZV9lbmV0X3dvcmtfbXNnKHN0cnVjdCBza19idWZmICpza2IsIHU2NCAqaG9waW5mbykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHNrYi0+ZGV2OwogCXN0cnVjdCBpcGhkciAqaXBoOwogCXU4IGwzaGxlbiA9IDAsIGw0aGxlbiA9IDA7CiAJdTggZXRoaGRyLCBwcm90byA9IDAsIGNzdW1fZW5hYmxlID0gMDsKLQl1NjQgaG9waW5mbyA9IDA7CiAJdTMyIGhkcl9sZW4sIG1zcyA9IDA7CiAJdTMyIGksIGxlbiwgbnJfZnJhZ3M7CisJaW50IG1zc19pbmRleDsKIAogCWV0aGhkciA9IHhnZW5lX2VuZXRfaGRyX2xlbihza2ItPmRhdGEpOwogCkBAIC0yMTUsNyArMjczLDExIEBACiAJCQlpZiAoIW1zcyB8fCAoKHNrYi0+bGVuIC0gaGRyX2xlbikgPD0gbXNzKSkKIAkJCQlnb3RvIG91dDsKIAotCQkJaG9waW5mbyB8PSBTRVRfQklUKEVUKTsKKwkJCW1zc19pbmRleCA9IHhnZW5lX2VuZXRfc2V0dXBfbXNzKG5kZXYsIG1zcyk7CisJCQlpZiAodW5saWtlbHkobXNzX2luZGV4IDwgMCkpCisJCQkJcmV0dXJuIC1FQlVTWTsKKworCQkJKmhvcGluZm8gfD0gU0VUX0JJVChFVCkgfCBTRVRfVkFMKE1TUywgbXNzX2luZGV4KTsKIAkJfQogCX0gZWxzZSBpZiAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgewogCQlsNGhsZW4gPSBVRFBfSERSX1NJWkU7CkBAIC0yMjMsMTUgKzI4NSwxNSBAQAogCX0KIG91dDoKIAlsM2hsZW4gPSBpcF9oZHJsZW4oc2tiKSA+PiAyOwotCWhvcGluZm8gfD0gU0VUX1ZBTChUQ1BIRFIsIGw0aGxlbikgfAotCQkgIFNFVF9WQUwoSVBIRFIsIGwzaGxlbikgfAotCQkgIFNFVF9WQUwoRVRISERSLCBldGhoZHIpIHwKLQkJICBTRVRfVkFMKEVDLCBjc3VtX2VuYWJsZSkgfAotCQkgIFNFVF9WQUwoSVMsIHByb3RvKSB8Ci0JCSAgU0VUX0JJVChJQykgfAotCQkgIFNFVF9CSVQoVFlQRV9FVEhfV09SS19NRVNTQUdFKTsKKwkqaG9waW5mbyB8PSBTRVRfVkFMKFRDUEhEUiwgbDRobGVuKSB8CisJCSAgICBTRVRfVkFMKElQSERSLCBsM2hsZW4pIHwKKwkJICAgIFNFVF9WQUwoRVRISERSLCBldGhoZHIpIHwKKwkJICAgIFNFVF9WQUwoRUMsIGNzdW1fZW5hYmxlKSB8CisJCSAgICBTRVRfVkFMKElTLCBwcm90bykgfAorCQkgICAgU0VUX0JJVChJQykgfAorCQkgICAgU0VUX0JJVChUWVBFX0VUSF9XT1JLX01FU1NBR0UpOwogCi0JcmV0dXJuIGhvcGluZm87CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB1MTYgeGdlbmVfZW5ldF9lbmNvZGVfbGVuKHUxNiBsZW4pCkBAIC0yNzEsMjAgKzMzMywyMiBAQAogCWRtYV9hZGRyX3QgZG1hX2FkZHIsIHBidWZfYWRkciwgKmZyYWdfZG1hX2FkZHI7CiAJc2tiX2ZyYWdfdCAqZnJhZzsKIAl1MTYgdGFpbCA9IHR4X3JpbmctPnRhaWw7Ci0JdTY0IGhvcGluZm87CisJdTY0IGhvcGluZm8gPSAwOwogCXUzMiBsZW4sIGh3X2xlbjsKIAl1OCBsbCA9IDAsIG52ID0gMCwgaWR4ID0gMDsKIAlib29sIHNwbGl0ID0gZmFsc2U7CiAJdTMyIHNpemUsIG9mZnNldCwgZWxsX2J5dGVzID0gMDsKIAl1MzIgaSwgZmlkeCwgbnJfZnJhZ3MsIGNvdW50ID0gMTsKKwlpbnQgcmV0OwogCiAJcmF3X2Rlc2MgPSAmdHhfcmluZy0+cmF3X2Rlc2NbdGFpbF07CiAJdGFpbCA9ICh0YWlsICsgMSkgJiAodHhfcmluZy0+c2xvdHMgLSAxKTsKIAltZW1zZXQocmF3X2Rlc2MsIDAsIHNpemVvZihzdHJ1Y3QgeGdlbmVfZW5ldF9yYXdfZGVzYykpOwogCi0JaG9waW5mbyA9IHhnZW5lX2VuZXRfd29ya19tc2coc2tiKTsKLQlpZiAoIWhvcGluZm8pCi0JCXJldHVybiAtRUlOVkFMOworCXJldCA9IHhnZW5lX2VuZXRfd29ya19tc2coc2tiLCAmaG9waW5mbyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCXJhd19kZXNjLT5tMyA9IGNwdV90b19sZTY0KFNFVF9WQUwoSEVOUU5VTSwgdHhfcmluZy0+ZHN0X3JpbmdfbnVtKSB8CiAJCQkJICAgaG9waW5mbyk7CiAKQEAgLTQyNCw2ICs0ODgsOSBAQAogCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCiAJY291bnQgPSB4Z2VuZV9lbmV0X3NldHVwX3R4X2Rlc2ModHhfcmluZywgc2tiKTsKKwlpZiAoY291bnQgPT0gLUVCVVNZKQorCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisKIAlpZiAoY291bnQgPD0gMCkgewogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQlyZXR1cm4gTkVUREVWX1RYX09LOwpAQCAtNDUyLDcgKzUxOSw2IEBACiAJCQkgICAgICAgc3RydWN0IHhnZW5lX2VuZXRfcmF3X2Rlc2MgKnJhd19kZXNjKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwotCXN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IHhnZW5lX2VuZXRfZGVzY19yaW5nICpidWZfcG9vbDsKIAl1MzIgZGF0YWxlbiwgc2tiX2luZGV4OwpAQCAtNDYxLDcgKzUyNyw2IEBACiAJaW50IHJldCA9IDA7CiAKIAluZGV2ID0gcnhfcmluZy0+bmRldjsKLQlwZGF0YSA9IG5ldGRldl9wcml2KG5kZXYpOwogCWRldiA9IG5kZXZfdG9fZGV2KHJ4X3JpbmctPm5kZXYpOwogCWJ1Zl9wb29sID0gcnhfcmluZy0+YnVmX3Bvb2w7CiAKQEAgLTczOSw4ICs4MDQsOCBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAocGRhdGEtPnBoeV9kZXYpIHsKLQkJcGh5X3N0YXJ0KHBkYXRhLT5waHlfZGV2KTsKKwlpZiAobmRldi0+cGh5ZGV2KSB7CisJCXBoeV9zdGFydChuZGV2LT5waHlkZXYpOwogCX0gZWxzZSB7CiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcGRhdGEtPmxpbmtfd29yaywgUEhZX1BPTExfTElOS19PRkYpOwogCQluZXRpZl9jYXJyaWVyX29mZihuZGV2KTsKQEAgLTc2Myw4ICs4MjgsOCBAQAogCW1hY19vcHMtPnR4X2Rpc2FibGUocGRhdGEpOwogCW1hY19vcHMtPnJ4X2Rpc2FibGUocGRhdGEpOwogCi0JaWYgKHBkYXRhLT5waHlfZGV2KQotCQlwaHlfc3RvcChwZGF0YS0+cGh5X2Rldik7CisJaWYgKG5kZXYtPnBoeWRldikKKwkJcGh5X3N0b3AobmRldi0+cGh5ZGV2KTsKIAllbHNlCiAJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcGRhdGEtPmxpbmtfd29yayk7CiAKQEAgLTEzMTIsNiArMTM3NywxOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCB4Z2VuZV9lbmV0X2dwaW9kX2dldChzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkYXRhLT5wZGV2LT5kZXY7CisKKwlpZiAocGRhdGEtPnBoeV9tb2RlICE9IFBIWV9JTlRFUkZBQ0VfTU9ERV9YR01JSSkKKwkJcmV0dXJuOworCisJcGRhdGEtPnNmcF9yZHkgPSBncGlvZF9nZXQoZGV2LCAicnhsb3MiLCBHUElPRF9JTik7CisJaWYgKElTX0VSUihwZGF0YS0+c2ZwX3JkeSkpCisJCXBkYXRhLT5zZnBfcmR5ID0gZ3Bpb2RfZ2V0KGRldiwgInNmcCIsIEdQSU9EX0lOKTsKK30KKwogc3RhdGljIGludCB4Z2VuZV9lbmV0X2dldF9yZXNvdXJjZXMoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhKQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CkBAIC0xNDAxLDYgKzE0NzgsOCBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwl4Z2VuZV9lbmV0X2dwaW9kX2dldChwZGF0YSk7CisKIAlwZGF0YS0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOwogCWlmIChJU19FUlIocGRhdGEtPmNsaykpIHsKIAkJLyogRmlybXdhcmUgbWF5IGhhdmUgc2V0IHVwIHRoZSBjbG9jayBhbHJlYWR5LiAqLwpAQCAtMTQyNSw2ICsxNTA0LDcgQEAKIAl9IGVsc2UgewogCQlwZGF0YS0+bWN4X21hY19hZGRyID0gYmFzZV9hZGRyICsgQkxPQ0tfQVhHX01BQ19PRkZTRVQ7CiAJCXBkYXRhLT5tY3hfbWFjX2Nzcl9hZGRyID0gYmFzZV9hZGRyICsgQkxPQ0tfQVhHX01BQ19DU1JfT0ZGU0VUOworCQlwZGF0YS0+cGNzX2FkZHIgPSBiYXNlX2FkZHIgKyBCTE9DS19QQ1NfT0ZGU0VUOwogCX0KIAlwZGF0YS0+cnhfYnVmZl9jbnQgPSBOVU1fUEtUX0JVRjsKIApAQCAtMTQ1NCwxMCArMTUzNCw4IEBACiAJCWJ1Zl9wb29sID0gcGRhdGEtPnJ4X3JpbmdbaV0tPmJ1Zl9wb29sOwogCQl4Z2VuZV9lbmV0X2luaXRfYnVmcG9vbChidWZfcG9vbCk7CiAJCXJldCA9IHhnZW5lX2VuZXRfcmVmaWxsX2J1ZnBvb2woYnVmX3Bvb2wsIHBkYXRhLT5yeF9idWZmX2NudCk7Ci0JCWlmIChyZXQpIHsKLQkJCXhnZW5lX2VuZXRfZGVsZXRlX2Rlc2NfcmluZ3MocGRhdGEpOwotCQkJcmV0dXJuIHJldDsKLQkJfQorCQlpZiAocmV0KQorCQkJZ290byBlcnI7CiAJfQogCiAJZHN0X3JpbmdfbnVtID0geGdlbmVfZW5ldF9kc3RfcmluZ19udW0ocGRhdGEtPnJ4X3JpbmdbMF0pOwpAQCAtMTQ3NCw3ICsxNTUyLDcgQEAKIAkJcmV0ID0gcGRhdGEtPmNsZV9vcHMtPmNsZV9pbml0KHBkYXRhKTsKIAkJaWYgKHJldCkgewogCQkJbmV0ZGV2X2VycihuZGV2LCAiUHJlY2xhc3MgVHJlZSBpbml0IGVycm9yXG4iKTsKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIGVycjsKIAkJfQogCX0gZWxzZSB7CiAJCXBkYXRhLT5wb3J0X29wcy0+Y2xlX2J5cGFzcyhwZGF0YSwgZHN0X3JpbmdfbnVtLCBidWZfcG9vbC0+aWQpOwpAQCAtMTQ4NCw2ICsxNTYyLDEwIEBACiAJcGRhdGEtPm1hY19vcHMtPmluaXQocGRhdGEpOwogCiAJcmV0dXJuIHJldDsKKworZXJyOgorCXhnZW5lX2VuZXRfZGVsZXRlX2Rlc2NfcmluZ3MocGRhdGEpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIHhnZW5lX2VuZXRfc2V0dXBfb3BzKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSkKQEAgLTE2MzEsOCArMTcxMyw4IEBACiAJfQogI2VuZGlmCiAJaWYgKCFwZGF0YS0+ZW5ldF9pZCkgewotCQlmcmVlX25ldGRldihuZGV2KTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOwogCX0KIAogCXJldCA9IHhnZW5lX2VuZXRfZ2V0X3Jlc291cmNlcyhwZGF0YSk7CkBAIC0xNjQzLDcgKzE3MjUsNyBAQAogCiAJaWYgKHBkYXRhLT5waHlfbW9kZSA9PSBQSFlfSU5URVJGQUNFX01PREVfWEdNSUkpIHsKIAkJbmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087Ci0JCXBkYXRhLT5tc3MgPSBYR0VORV9FTkVUX01TUzsKKwkJc3Bpbl9sb2NrX2luaXQoJnBkYXRhLT5tc3NfbG9jayk7CiAJfQogCW5kZXYtPmh3X2ZlYXR1cmVzID0gbmRldi0+ZmVhdHVyZXM7CiAKQEAgLTE2NTUsNyArMTczNyw3IEBACiAKIAlyZXQgPSB4Z2VuZV9lbmV0X2luaXRfaHcocGRhdGEpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyX25ldGRldjsKKwkJZ290byBlcnI7CiAKIAlsaW5rX3N0YXRlID0gcGRhdGEtPm1hY19vcHMtPmxpbmtfc3RhdGU7CiAJaWYgKHBkYXRhLT5waHlfbW9kZSA9PSBQSFlfSU5URVJGQUNFX01PREVfWEdNSUkpIHsKQEAgLTE2NjUsMjEgKzE3NDcsMzIgQEAKIAkJCXJldCA9IHhnZW5lX2VuZXRfbWRpb19jb25maWcocGRhdGEpOwogCQllbHNlCiAJCQlJTklUX0RFTEFZRURfV09SSygmcGRhdGEtPmxpbmtfd29yaywgbGlua19zdGF0ZSk7CisKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyMTsKIAl9Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7CiAKIAl4Z2VuZV9lbmV0X25hcGlfYWRkKHBkYXRhKTsKIAlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobmRldik7CiAJaWYgKHJldCkgewogCQluZXRkZXZfZXJyKG5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgbmV0ZGV2XG4iKTsKLQkJZ290byBlcnI7CisJCWdvdG8gZXJyMjsKIAl9CiAKIAlyZXR1cm4gMDsKIAotZXJyX25ldGRldjoKLQl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKK2VycjI6CisJLyoKKwkgKiBJZiBuZWNlc3NhcnksIGZyZWVfbmV0ZGV2KCkgd2lsbCBjYWxsIG5ldGlmX25hcGlfZGVsKCkgYW5kIHVuZG8KKwkgKiB0aGUgZWZmZWN0cyBvZiB4Z2VuZV9lbmV0X25hcGlfYWRkKCkncyBjYWxscyB0byBuZXRpZl9uYXBpX2FkZCgpLgorCSAqLworCisJaWYgKHBkYXRhLT5tZGlvX2RyaXZlcikKKwkJeGdlbmVfZW5ldF9waHlfZGlzY29ubmVjdChwZGF0YSk7CisJZWxzZSBpZiAocGRhdGEtPnBoeV9tb2RlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSSkKKwkJeGdlbmVfZW5ldF9tZGlvX3JlbW92ZShwZGF0YSk7CitlcnIxOgorCXhnZW5lX2VuZXRfZGVsZXRlX2Rlc2NfcmluZ3MocGRhdGEpOwogZXJyOgogCWZyZWVfbmV0ZGV2KG5kZXYpOwogCXJldHVybiByZXQ7CkBAIC0xNjg4LDExICsxNzgxLDkgQEAKIHN0YXRpYyBpbnQgeGdlbmVfZW5ldF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGE7Ci0JY29uc3Qgc3RydWN0IHhnZW5lX21hY19vcHMgKm1hY19vcHM7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAKIAlwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCW1hY19vcHMgPSBwZGF0YS0+bWFjX29wczsKIAluZGV2ID0gcGRhdGEtPm5kZXY7CiAKIAlydG5sX2xvY2soKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X21haW4uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X21haW4uaAppbmRleCAyMTc1NDZlLi4wY2RhNThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9tYWluLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfbWFpbi5oCkBAIC00Nyw3ICs0Nyw3IEBACiAjZGVmaW5lIE5VTV9QS1RfQlVGCTY0CiAjZGVmaW5lIE5VTV9CVUZQT09MCTMyCiAjZGVmaW5lIE1BWF9FWFBfQlVGRlMJMjU2Ci0jZGVmaW5lIFhHRU5FX0VORVRfTVNTCTE0NDgKKyNkZWZpbmUgTlVNX01TU19SRUcJNAogI2RlZmluZSBYR0VORV9NSU5fRU5FVF9GUkFNRV9TSVpFCTYwCiAKICNkZWZpbmUgWEdFTkVfTUFYX0VORVRfSVJRCTE2CkBAIC0xNDMsNyArMTQzLDcgQEAKIAl2b2lkICgqcnhfZGlzYWJsZSkoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhKTsKIAl2b2lkICgqc2V0X3NwZWVkKShzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEpOwogCXZvaWQgKCpzZXRfbWFjX2FkZHIpKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSk7Ci0Jdm9pZCAoKnNldF9tc3MpKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSk7CisJdm9pZCAoKnNldF9tc3MpKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSwgdTE2IG1zcywgdTggaW5kZXgpOwogCXZvaWQgKCpsaW5rX3N0YXRlKShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogfTsKIApAQCAtMTc0LDcgKzE3NCw2IEBACiBzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAJc3RydWN0IG1paV9idXMgKm1kaW9fYnVzOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlfZGV2OwogCWludCBwaHlfc3BlZWQ7CiAJc3RydWN0IGNsayAqY2xrOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CkBAIC0xOTYsNiArMTk1LDcgQEAKIAl2b2lkIF9faW9tZW0gKm1jeF9tYWNfYWRkcjsKIAl2b2lkIF9faW9tZW0gKm1jeF9tYWNfY3NyX2FkZHI7CiAJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7CisJdm9pZCBfX2lvbWVtICpwY3NfYWRkcjsKIAl2b2lkIF9faW9tZW0gKnJpbmdfY3NyX2FkZHI7CiAJdm9pZCBfX2lvbWVtICpyaW5nX2NtZF9hZGRyOwogCWludCBwaHlfbW9kZTsKQEAgLTIxMiwxMCArMjEyLDEzIEBACiAJdTggZXRoX2J1Zm51bTsKIAl1OCBicF9idWZudW07CiAJdTE2IHJpbmdfbnVtOwotCXUzMiBtc3M7CisJdTMyIG1zc1tOVU1fTVNTX1JFR107CisJdTMyIG1zc19yZWZjbnRbTlVNX01TU19SRUddOworCXNwaW5sb2NrX3QgbXNzX2xvY2s7ICAvKiBtc3MgbG9jayAqLwogCXU4IHR4X2RlbGF5OwogCXU4IHJ4X2RlbGF5OwogCWJvb2wgbWRpb19kcml2ZXI7CisJc3RydWN0IGdwaW9fZGVzYyAqc2ZwX3JkeTsKIH07CiAKIHN0cnVjdCB4Z2VuZV9pbmRpcmVjdF9jdGwgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfeGdtYWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X3hnbWFjLmMKaW5kZXggOWM2YWQwZC4uNjQ3NWYzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfeGdtYWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF94Z21hYy5jCkBAIC0xOCw2ICsxOCw4IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlICJ4Z2VuZV9lbmV0X21haW4uaCIKICNpbmNsdWRlICJ4Z2VuZV9lbmV0X2h3LmgiCiAjaW5jbHVkZSAieGdlbmVfZW5ldF94Z21hYy5oIgpAQCAtODQsNiArODYsMjEgQEAKIAkJCSAgIHdyX2FkZHIpOwogfQogCitzdGF0aWMgdm9pZCB4Z2VuZV9lbmV0X3dyX3BjcyhzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEsCisJCQkgICAgICB1MzIgd3JfYWRkciwgdTMyIHdyX2RhdGEpCit7CisJdm9pZCBfX2lvbWVtICphZGRyLCAqd3IsICpjbWQsICpjbWRfZG9uZTsKKworCWFkZHIgPSBwZGF0YS0+cGNzX2FkZHIgKyBQQ1NfQUREUl9SRUdfT0ZGU0VUOworCXdyID0gcGRhdGEtPnBjc19hZGRyICsgUENTX1dSSVRFX1JFR19PRkZTRVQ7CisJY21kID0gcGRhdGEtPnBjc19hZGRyICsgUENTX0NPTU1BTkRfUkVHX09GRlNFVDsKKwljbWRfZG9uZSA9IHBkYXRhLT5wY3NfYWRkciArIFBDU19DT01NQU5EX0RPTkVfUkVHX09GRlNFVDsKKworCWlmICgheGdlbmVfZW5ldF93cl9pbmRpcmVjdChhZGRyLCB3ciwgY21kLCBjbWRfZG9uZSwgd3JfYWRkciwgd3JfZGF0YSkpCisJCW5ldGRldl9lcnIocGRhdGEtPm5kZXYsICJQQ1Mgd3JpdGUgZmFpbGVkLCBhZGRyOiAlMDR4XG4iLAorCQkJICAgd3JfYWRkcik7Cit9CisKIHN0YXRpYyB2b2lkIHhnZW5lX2VuZXRfcmRfY3NyKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSwKIAkJCSAgICAgIHUzMiBvZmZzZXQsIHUzMiAqdmFsKQogewpAQCAtMTIyLDYgKzEzOSw3IEBACiAKIAlyZXR1cm4gdHJ1ZTsKIH0KKwogc3RhdGljIHZvaWQgeGdlbmVfZW5ldF9yZF9tYWMoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhLAogCQkJICAgICAgdTMyIHJkX2FkZHIsIHUzMiAqcmRfZGF0YSkKIHsKQEAgLTEzNyw2ICsxNTUsMjUgQEAKIAkJCSAgIHJkX2FkZHIpOwogfQogCitzdGF0aWMgYm9vbCB4Z2VuZV9lbmV0X3JkX3BjcyhzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEsCisJCQkgICAgICB1MzIgcmRfYWRkciwgdTMyICpyZF9kYXRhKQoreworCXZvaWQgX19pb21lbSAqYWRkciwgKnJkLCAqY21kLCAqY21kX2RvbmU7CisJYm9vbCBzdWNjZXNzOworCisJYWRkciA9IHBkYXRhLT5wY3NfYWRkciArIFBDU19BRERSX1JFR19PRkZTRVQ7CisJcmQgPSBwZGF0YS0+cGNzX2FkZHIgKyBQQ1NfUkVBRF9SRUdfT0ZGU0VUOworCWNtZCA9IHBkYXRhLT5wY3NfYWRkciArIFBDU19DT01NQU5EX1JFR19PRkZTRVQ7CisJY21kX2RvbmUgPSBwZGF0YS0+cGNzX2FkZHIgKyBQQ1NfQ09NTUFORF9ET05FX1JFR19PRkZTRVQ7CisKKwlzdWNjZXNzID0geGdlbmVfZW5ldF9yZF9pbmRpcmVjdChhZGRyLCByZCwgY21kLCBjbWRfZG9uZSwgcmRfYWRkciwgcmRfZGF0YSk7CisJaWYgKCFzdWNjZXNzKQorCQluZXRkZXZfZXJyKHBkYXRhLT5uZGV2LCAiUENTIHJlYWQgZmFpbGVkLCBhZGRyOiAlMDR4XG4iLAorCQkJICAgcmRfYWRkcik7CisKKwlyZXR1cm4gc3VjY2VzczsKK30KKwogc3RhdGljIGludCB4Z2VuZV9lbmV0X2VjY19pbml0KHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBkYXRhLT5uZGV2OwpAQCAtMTcxLDYgKzIwOCwxNyBAQAogCXhnZW5lX2VuZXRfd3JfbWFjKHBkYXRhLCBBWEdNQUNfQ09ORklHXzAsIDApOwogfQogCitzdGF0aWMgdm9pZCB4Z2VuZV9wY3NfcmVzZXQoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhKQoreworCXUzMiBkYXRhOworCisJaWYgKCF4Z2VuZV9lbmV0X3JkX3BjcyhwZGF0YSwgUENTX0NPTlRST0xfMSwgJmRhdGEpKQorCQlyZXR1cm47CisKKwl4Z2VuZV9lbmV0X3dyX3BjcyhwZGF0YSwgUENTX0NPTlRST0xfMSwgZGF0YSB8IFBDU19DVFJMX1BDU19SU1QpOworCXhnZW5lX2VuZXRfd3JfcGNzKHBkYXRhLCBQQ1NfQ09OVFJPTF8xLCBkYXRhICYgflBDU19DVFJMX1BDU19SU1QpOworfQorCiBzdGF0aWMgdm9pZCB4Z2VuZV94Z21hY19zZXRfbWFjX2FkZHIoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhKQogewogCXUzMiBhZGRyMCwgYWRkcjE7CkBAIC0xODQsOSArMjMyLDIyIEBACiAJeGdlbmVfZW5ldF93cl9tYWMocGRhdGEsIEhTVE1BQ0FEUl9NU1dfQUREUiwgYWRkcjEpOwogfQogCi1zdGF0aWMgdm9pZCB4Z2VuZV94Z21hY19zZXRfbXNzKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSkKK3N0YXRpYyB2b2lkIHhnZW5lX3hnbWFjX3NldF9tc3Moc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhLAorCQkJCXUxNiBtc3MsIHU4IGluZGV4KQogewotCXhnZW5lX2VuZXRfd3JfY3NyKHBkYXRhLCBYR19UU0lGX01TU19SRUcwX0FERFIsIHBkYXRhLT5tc3MpOworCXU4IG9mZnNldDsKKwl1MzIgZGF0YTsKKworCW9mZnNldCA9IChpbmRleCA8IDIpID8gMCA6IDQ7CisJeGdlbmVfZW5ldF9yZF9jc3IocGRhdGEsIFhHX1RTSUZfTVNTX1JFRzBfQUREUiArIG9mZnNldCwgJmRhdGEpOworCisJaWYgKCEoaW5kZXggJiAweDEpKQorCQlkYXRhID0gU0VUX1ZBTChUU09fTVNTMSwgZGF0YSA+PiBUU09fTVNTMV9QT1MpIHwKKwkJCVNFVF9WQUwoVFNPX01TUzAsIG1zcyk7CisJZWxzZQorCQlkYXRhID0gU0VUX1ZBTChUU09fTVNTMSwgbXNzKSB8IFNFVF9WQUwoVFNPX01TUzAsIGRhdGEpOworCisJeGdlbmVfZW5ldF93cl9jc3IocGRhdGEsIFhHX1RTSUZfTVNTX1JFRzBfQUREUiArIG9mZnNldCwgZGF0YSk7CiB9CiAKIHN0YXRpYyB1MzIgeGdlbmVfZW5ldF9saW5rX3N0YXR1cyhzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEpCkBAIC0yMTAsMTggKzI3MSwxNyBAQAogCXhnZW5lX2VuZXRfd3JfbWFjKHBkYXRhLCBBWEdNQUNfQ09ORklHXzEsIGRhdGEpOwogCiAJeGdlbmVfeGdtYWNfc2V0X21hY19hZGRyKHBkYXRhKTsKLQl4Z2VuZV94Z21hY19zZXRfbXNzKHBkYXRhKTsKIAogCXhnZW5lX2VuZXRfcmRfY3NyKHBkYXRhLCBYR19SU0lGX0NPTkZJR19SRUdfQUREUiwgJmRhdGEpOwogCWRhdGEgfD0gQ0ZHX1JTSUZfRlBCVUZGX1RJTUVPVVRfRU47CiAJeGdlbmVfZW5ldF93cl9jc3IocGRhdGEsIFhHX1JTSUZfQ09ORklHX1JFR19BRERSLCBkYXRhKTsKIAotCXhnZW5lX2VuZXRfd3JfY3NyKHBkYXRhLCBYR19DRkdfQllQQVNTX0FERFIsIFJFU1VNRV9UWCk7Ci0JeGdlbmVfZW5ldF93cl9jc3IocGRhdGEsIFhHRU5FVF9SWF9EVl9HQVRFX1JFR18wX0FERFIsIDApOwogCXhnZW5lX2VuZXRfcmRfY3NyKHBkYXRhLCBYR19FTkVUX1NQQVJFX0NGR19SRUdfQUREUiwgJmRhdGEpOwogCWRhdGEgfD0gQklUKDEyKTsKIAl4Z2VuZV9lbmV0X3dyX2NzcihwZGF0YSwgWEdfRU5FVF9TUEFSRV9DRkdfUkVHX0FERFIsIGRhdGEpOwogCXhnZW5lX2VuZXRfd3JfY3NyKHBkYXRhLCBYR19FTkVUX1NQQVJFX0NGR19SRUdfMV9BRERSLCAweDgyKTsKKwl4Z2VuZV9lbmV0X3dyX2NzcihwZGF0YSwgWEdFTkVUX1JYX0RWX0dBVEVfUkVHXzBfQUREUiwgMCk7CisJeGdlbmVfZW5ldF93cl9jc3IocGRhdGEsIFhHX0NGR19CWVBBU1NfQUREUiwgUkVTVU1FX1RYKTsKIH0KIAogc3RhdGljIHZvaWQgeGdlbmVfeGdtYWNfcnhfZW5hYmxlKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSkKQEAgLTM1OSwxNCArNDE5LDE3IEBACiB7CiAJc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhID0gY29udGFpbmVyX29mKHRvX2RlbGF5ZWRfd29yayh3b3JrKSwKIAkJCQkJIHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhLCBsaW5rX3dvcmspOworCXN0cnVjdCBncGlvX2Rlc2MgKnNmcF9yZHkgPSBwZGF0YS0+c2ZwX3JkeTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBkYXRhLT5uZGV2OwogCXUzMiBsaW5rX3N0YXR1cywgcG9sbF9pbnRlcnZhbDsKIAogCWxpbmtfc3RhdHVzID0geGdlbmVfZW5ldF9saW5rX3N0YXR1cyhwZGF0YSk7CisJaWYgKGxpbmtfc3RhdHVzICYmICFJU19FUlIoc2ZwX3JkeSkgJiYgIWdwaW9kX2dldF92YWx1ZShzZnBfcmR5KSkKKwkJbGlua19zdGF0dXMgPSAwOworCiAJaWYgKGxpbmtfc3RhdHVzKSB7CiAJCWlmICghbmV0aWZfY2Fycmllcl9vayhuZGV2KSkgewogCQkJbmV0aWZfY2Fycmllcl9vbihuZGV2KTsKLQkJCXhnZW5lX3hnbWFjX2luaXQocGRhdGEpOwogCQkJeGdlbmVfeGdtYWNfcnhfZW5hYmxlKHBkYXRhKTsKIAkJCXhnZW5lX3hnbWFjX3R4X2VuYWJsZShwZGF0YSk7CiAJCQluZXRkZXZfaW5mbyhuZGV2LCAiTGluayBpcyBVcCAtIDEwR2Jwc1xuIik7CkBAIC0zODAsNiArNDQzLDggQEAKIAkJCW5ldGRldl9pbmZvKG5kZXYsICJMaW5rIGlzIERvd25cbiIpOwogCQl9CiAJCXBvbGxfaW50ZXJ2YWwgPSBQSFlfUE9MTF9MSU5LX09GRjsKKworCQl4Z2VuZV9wY3NfcmVzZXQocGRhdGEpOwogCX0KIAogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcGRhdGEtPmxpbmtfd29yaywgcG9sbF9pbnRlcnZhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF94Z21hYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfeGdtYWMuaAppbmRleCBmMWVhNDg1Li4zNjBjY2JkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF94Z21hYy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X3hnbWFjLmgKQEAgLTI0LDYgKzI0LDcgQEAKICNkZWZpbmUgWDJfQkxPQ0tfRVRIX01BQ19DU1JfT0ZGU0VUCTB4MzAwMAogI2RlZmluZSBCTE9DS19BWEdfTUFDX09GRlNFVAkJMHgwODAwCiAjZGVmaW5lIEJMT0NLX0FYR19NQUNfQ1NSX09GRlNFVAkweDIwMDAKKyNkZWZpbmUgQkxPQ0tfUENTX09GRlNFVAkJMHgzODAwCiAKICNkZWZpbmUgWEdFTkVUX0NPTkZJR19SRUdfQUREUgkJMHgyMAogI2RlZmluZSBYR0VORVRfU1JTVF9BRERSCQkweDAwCkBAIC03Miw2ICs3Myw5IEBACiAjZGVmaW5lIFhHX01DWF9JQ01fQ09ORklHMF9SRUdfMF9BRERSCTB4MDBlMAogI2RlZmluZSBYR19NQ1hfSUNNX0NPTkZJRzJfUkVHXzBfQUREUgkweDAwZTgKIAorI2RlZmluZSBQQ1NfQ09OVFJPTF8xCQkJMHgwMDAwCisjZGVmaW5lIFBDU19DVFJMX1BDU19SU1QJCUJJVCgxNSkKKwogZXh0ZXJuIGNvbnN0IHN0cnVjdCB4Z2VuZV9tYWNfb3BzIHhnZW5lX3hnbWFjX29wczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgeGdlbmVfcG9ydF9vcHMgeGdlbmVfeGdwb3J0X29wczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXJjL2VtYWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXJjL2VtYWNfbWFpbi5jCmluZGV4IDRiZmYwZjMuLmIwZGE5NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FyYy9lbWFjX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcmMvZW1hY19tYWluLmMKQEAgLTc3MSw4ICs3NzEsMTAgQEAKIAlwcml2LT5kZXYgPSBkZXY7CiAKIAlwcml2LT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgJnJlc19yZWdzKTsKLQlpZiAoSVNfRVJSKHByaXYtPnJlZ3MpKQotCQlyZXR1cm4gUFRSX0VSUihwcml2LT5yZWdzKTsKKwlpZiAoSVNfRVJSKHByaXYtPnJlZ3MpKSB7CisJCWVyciA9IFBUUl9FUlIocHJpdi0+cmVncyk7CisJCWdvdG8gb3V0X3B1dF9ub2RlOworCX0KIAogCWRldl9kYmcoZGV2LCAiUmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyBpcyAweCVwXG4iLCBwcml2LT5yZWdzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXJjL2VtYWNfbWRpby5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXJjL2VtYWNfbWRpby5jCmluZGV4IDA1ODQ2MGIuLmEyMjQwM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FyYy9lbWFjX21kaW8uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcmMvZW1hY19tZGlvLmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogICogQGJ1czogcG9pbnRzIHRvIHRoZSBtaWlfYnVzIHN0cnVjdHVyZQogICogRGVzY3JpcHRpb246IHJlc2V0IHRoZSBNSUkgYnVzCiAgKi8KLWludCBhcmNfbWRpb19yZXNldChzdHJ1Y3QgbWlpX2J1cyAqYnVzKQorc3RhdGljIGludCBhcmNfbWRpb19yZXNldChzdHJ1Y3QgbWlpX2J1cyAqYnVzKQogewogCXN0cnVjdCBhcmNfZW1hY19wcml2ICpwcml2ID0gYnVzLT5wcml2OwogCXN0cnVjdCBhcmNfZW1hY19tZGlvX2J1c19kYXRhICpkYXRhID0gJnByaXYtPmJ1c19kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvYWx4LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9hbHguaAppbmRleCA4ZmM5M2M1Li42Y2FjOTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9hbHguaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9hbHguaApAQCAtNzYsMTEgKzc2LDE5IEBACiAJQUxYX0RFVl9RVUlSS19NU0lfSU5UWF9ESVNBQkxFX0JVRyA9IEJJVCgwKSwKIH07CiAKKyNkZWZpbmUgQUxYX0ZMQUdfVVNJTkdfTVNJWAlCSVQoMCkKKyNkZWZpbmUgQUxYX0ZMQUdfVVNJTkdfTVNJCUJJVCgxKQorCiBzdHJ1Y3QgYWx4X3ByaXYgewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAKIAlzdHJ1Y3QgYWx4X2h3IGh3OwogCisJLyogbXNpLXggdmVjdG9ycyAqLworCWludCBudW1fdmVjOworCXN0cnVjdCBtc2l4X2VudHJ5ICptc2l4X2VudHJpZXM7CisJY2hhciBpcnFfbGJsW0lGTkFNU0laICsgOF07CisKIAkvKiBhbGwgZGVzY3JpcHRvciBtZW1vcnkgKi8KIAlzdHJ1Y3QgewogCQlkbWFfYWRkcl90IGRtYTsKQEAgLTEwNSw3ICsxMTMsNyBAQAogCiAJdTE2IG1zZ19lbmFibGU7CiAKLQlib29sIG1zaTsKKwlpbnQgZmxhZ3M7CiAKIAkvKiBwcm90ZWN0cyBody5zdGF0cyAqLwogCXNwaW5sb2NrX3Qgc3RhdHNfbG9jazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L2h3LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9ody5jCmluZGV4IDFmZTM1ZTQuLjZhYzQwYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L2h3LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvaHcuYwpAQCAtMTAzMSw2ICsxMDMxLDIwIEBACiAJYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfV1JSLCB2YWwpOwogfQogCit2b2lkIGFseF9tYXNrX21zaXgoc3RydWN0IGFseF9odyAqaHcsIGludCBpbmRleCwgYm9vbCBtYXNrKQoreworCXUzMiByZWcsIHZhbDsKKworCXJlZyA9IEFMWF9NU0lYX0VOVFJZX0JBU0UgKyBpbmRleCAqIFBDSV9NU0lYX0VOVFJZX1NJWkUgKworCQlQQ0lfTVNJWF9FTlRSWV9WRUNUT1JfQ1RSTDsKKworCXZhbCA9IG1hc2sgPyBQQ0lfTVNJWF9FTlRSWV9DVFJMX01BU0tCSVQgOiAwOworCisJYWx4X3dyaXRlX21lbTMyKGh3LCByZWcsIHZhbCk7CisJYWx4X3Bvc3Rfd3JpdGUoaHcpOworfQorCisKIGJvb2wgYWx4X2dldF9waHlfaW5mbyhzdHJ1Y3QgYWx4X2h3ICpodykKIHsKIAl1MTYgIGRldnMxLCBkZXZzMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L2h3LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9ody5oCmluZGV4IGYyODljMDUuLjAxOTE0NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L2h3LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvaHcuaApAQCAtNTYyLDYgKzU2Miw3IEBACiB2b2lkIGFseF9zZXRfbWFjYWRkcihzdHJ1Y3QgYWx4X2h3ICpodywgY29uc3QgdTggKmFkZHIpOwogYm9vbCBhbHhfcGh5X2NvbmZpZ3VyZWQoc3RydWN0IGFseF9odyAqaHcpOwogdm9pZCBhbHhfY29uZmlndXJlX2Jhc2ljKHN0cnVjdCBhbHhfaHcgKmh3KTsKK3ZvaWQgYWx4X21hc2tfbXNpeChzdHJ1Y3QgYWx4X2h3ICpodywgaW50IGluZGV4LCBib29sIG1hc2spOwogdm9pZCBhbHhfZGlzYWJsZV9yc3Moc3RydWN0IGFseF9odyAqaHcpOwogYm9vbCBhbHhfZ2V0X3BoeV9pbmZvKHN0cnVjdCBhbHhfaHcgKmh3KTsKIHZvaWQgYWx4X3VwZGF0ZV9od19zdGF0cyhzdHJ1Y3QgYWx4X2h3ICpodyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9tYWluLmMKaW5kZXggNjQ1MzE0OC4uYzBmODRiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L21haW4uYwpAQCAtNTEsNiArNTEsOSBAQAogCiBjb25zdCBjaGFyIGFseF9kcnZfbmFtZVtdID0gImFseCI7CiAKK3N0YXRpYyBib29sIG1zaXggPSBmYWxzZTsKK21vZHVsZV9wYXJhbShtc2l4LCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXNpeCwgIkVuYWJsZSBtc2kteCBpbnRlcnJ1cHQgc3VwcG9ydCIpOwogCiBzdGF0aWMgdm9pZCBhbHhfZnJlZV90eGJ1ZihzdHJ1Y3QgYWx4X3ByaXYgKmFseCwgaW50IGVudHJ5KQogewpAQCAtMjkyLDMyICsyOTUsMjkgQEAKIAluYXBpX2NvbXBsZXRlKCZhbHgtPm5hcGkpOwogCiAJLyogZW5hYmxlIGludGVycnVwdCAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZhbHgtPmlycV9sb2NrLCBmbGFncyk7Ci0JYWx4LT5pbnRfbWFzayB8PSBBTFhfSVNSX1RYX1EwIHwgQUxYX0lTUl9SWF9RMDsKLQlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9JTVIsIGFseC0+aW50X21hc2spOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFseC0+aXJxX2xvY2ssIGZsYWdzKTsKKwlpZiAoYWx4LT5mbGFncyAmIEFMWF9GTEFHX1VTSU5HX01TSVgpIHsKKwkJYWx4X21hc2tfbXNpeChodywgMSwgZmFsc2UpOworCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhbHgtPmlycV9sb2NrLCBmbGFncyk7CisJCWFseC0+aW50X21hc2sgfD0gQUxYX0lTUl9UWF9RMCB8IEFMWF9JU1JfUlhfUTA7CisJCWFseF93cml0ZV9tZW0zMihodywgQUxYX0lNUiwgYWx4LT5pbnRfbWFzayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFseC0+aXJxX2xvY2ssIGZsYWdzKTsKKwl9CiAKIAlhbHhfcG9zdF93cml0ZShodyk7CiAKIAlyZXR1cm4gd29yazsKIH0KIAotc3RhdGljIGlycXJldHVybl90IGFseF9pbnRyX2hhbmRsZShzdHJ1Y3QgYWx4X3ByaXYgKmFseCwgdTMyIGludHIpCitzdGF0aWMgYm9vbCBhbHhfaW50cl9oYW5kbGVfbWlzYyhzdHJ1Y3QgYWx4X3ByaXYgKmFseCwgdTMyIGludHIpCiB7CiAJc3RydWN0IGFseF9odyAqaHcgPSAmYWx4LT5odzsKLQlib29sIHdyaXRlX2ludF9tYXNrID0gZmFsc2U7Ci0KLQlzcGluX2xvY2soJmFseC0+aXJxX2xvY2spOwotCi0JLyogQUNLIGludGVycnVwdCAqLwotCWFseF93cml0ZV9tZW0zMihodywgQUxYX0lTUiwgaW50ciB8IEFMWF9JU1JfRElTKTsKLQlpbnRyICY9IGFseC0+aW50X21hc2s7CiAKIAlpZiAoaW50ciAmIEFMWF9JU1JfRkFUQUwpIHsKIAkJbmV0aWZfd2FybihhbHgsIGh3LCBhbHgtPmRldiwKIAkJCSAgICJmYXRhbCBpbnRlcnJ1cHQgMHgleCwgcmVzZXR0aW5nXG4iLCBpbnRyKTsKIAkJYWx4X3NjaGVkdWxlX3Jlc2V0KGFseCk7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKIAlpZiAoaW50ciAmIEFMWF9JU1JfQUxFUlQpCkBAIC0zMjksMTkgKzMyOSwzMiBAQAogCQkgKiBpcyBjbGVhcmVkLCB0aGUgaW50ZXJydXB0IHN0YXR1cyBjb3VsZCBiZSBjbGVhcmVkLgogCQkgKi8KIAkJYWx4LT5pbnRfbWFzayAmPSB+QUxYX0lTUl9QSFk7Ci0JCXdyaXRlX2ludF9tYXNrID0gdHJ1ZTsKKwkJYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfSU1SLCBhbHgtPmludF9tYXNrKTsKIAkJYWx4X3NjaGVkdWxlX2xpbmtfY2hlY2soYWx4KTsKIAl9CiAKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhbHhfaW50cl9oYW5kbGUoc3RydWN0IGFseF9wcml2ICphbHgsIHUzMiBpbnRyKQoreworCXN0cnVjdCBhbHhfaHcgKmh3ID0gJmFseC0+aHc7CisKKwlzcGluX2xvY2soJmFseC0+aXJxX2xvY2spOworCisJLyogQUNLIGludGVycnVwdCAqLworCWFseF93cml0ZV9tZW0zMihodywgQUxYX0lTUiwgaW50ciB8IEFMWF9JU1JfRElTKTsKKwlpbnRyICY9IGFseC0+aW50X21hc2s7CisKKwlpZiAoYWx4X2ludHJfaGFuZGxlX21pc2MoYWx4LCBpbnRyKSkKKwkJZ290byBvdXQ7CisKIAlpZiAoaW50ciAmIChBTFhfSVNSX1RYX1EwIHwgQUxYX0lTUl9SWF9RMCkpIHsKIAkJbmFwaV9zY2hlZHVsZSgmYWx4LT5uYXBpKTsKIAkJLyogbWFzayByeC90eCBpbnRlcnJ1cHQsIGVuYWJsZSB0aGVtIHdoZW4gbmFwaSBjb21wbGV0ZSAqLwogCQlhbHgtPmludF9tYXNrICY9IH5BTFhfSVNSX0FMTF9RVUVVRVM7Ci0JCXdyaXRlX2ludF9tYXNrID0gdHJ1ZTsKLQl9Ci0KLQlpZiAod3JpdGVfaW50X21hc2spCiAJCWFseF93cml0ZV9tZW0zMihodywgQUxYX0lNUiwgYWx4LT5pbnRfbWFzayk7CisJfQogCiAJYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfSVNSLCAwKTsKIApAQCAtMzUwLDYgKzM2Myw0NiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorc3RhdGljIGlycXJldHVybl90IGFseF9pbnRyX21zaXhfcmluZyhpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhbHhfcHJpdiAqYWx4ID0gZGF0YTsKKwlzdHJ1Y3QgYWx4X2h3ICpodyA9ICZhbHgtPmh3OworCisJLyogbWFzayBpbnRlcnJ1cHQgdG8gQUNLIGNoaXAgKi8KKwlhbHhfbWFza19tc2l4KGh3LCAxLCB0cnVlKTsKKwkvKiBjbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCisJYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfSVNSLCAoQUxYX0lTUl9UWF9RMCB8IEFMWF9JU1JfUlhfUTApKTsKKworCW5hcGlfc2NoZWR1bGUoJmFseC0+bmFwaSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhbHhfaW50cl9tc2l4X21pc2MoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYWx4X3ByaXYgKmFseCA9IGRhdGE7CisJc3RydWN0IGFseF9odyAqaHcgPSAmYWx4LT5odzsKKwl1MzIgaW50cjsKKworCS8qIG1hc2sgaW50ZXJydXB0IHRvIEFDSyBjaGlwICovCisJYWx4X21hc2tfbXNpeChodywgMCwgdHJ1ZSk7CisKKwkvKiByZWFkIGludGVycnVwdCBzdGF0dXMgKi8KKwlpbnRyID0gYWx4X3JlYWRfbWVtMzIoaHcsIEFMWF9JU1IpOworCWludHIgJj0gKGFseC0+aW50X21hc2sgJiB+QUxYX0lTUl9BTExfUVVFVUVTKTsKKworCWlmIChhbHhfaW50cl9oYW5kbGVfbWlzYyhhbHgsIGludHIpKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCisJYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfSVNSLCBpbnRyKTsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHQgYWdhaW4gKi8KKwlhbHhfbWFza19tc2l4KGh3LCAwLCBmYWxzZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKIHN0YXRpYyBpcnFyZXR1cm5fdCBhbHhfaW50cl9tc2koaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWx4X3ByaXYgKmFseCA9IGRhdGE7CkBAIC02MTQsMzEgKzY2NywxMzYgQEAKIHN0YXRpYyB2b2lkIGFseF9jb25maWdfdmVjdG9yX21hcHBpbmcoc3RydWN0IGFseF9wcml2ICphbHgpCiB7CiAJc3RydWN0IGFseF9odyAqaHcgPSAmYWx4LT5odzsKKwl1MzIgdGJsID0gMDsKIAotCWFseF93cml0ZV9tZW0zMihodywgQUxYX01TSV9NQVBfVEJMMSwgMCk7CisJaWYgKGFseC0+ZmxhZ3MgJiBBTFhfRkxBR19VU0lOR19NU0lYKSB7CisJCXRibCB8PSAxIDw8IEFMWF9NU0lfTUFQX1RCTDFfVFhRMF9TSElGVDsKKwkJdGJsIHw9IDEgPDwgQUxYX01TSV9NQVBfVEJMMV9SWFEwX1NISUZUOworCX0KKworCWFseF93cml0ZV9tZW0zMihodywgQUxYX01TSV9NQVBfVEJMMSwgdGJsKTsKIAlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9NU0lfTUFQX1RCTDIsIDApOwogCWFseF93cml0ZV9tZW0zMihodywgQUxYX01TSV9JRF9NQVAsIDApOwogfQogCitzdGF0aWMgYm9vbCBhbHhfZW5hYmxlX21zaXgoc3RydWN0IGFseF9wcml2ICphbHgpCit7CisJaW50IGksIGVyciwgbnVtX3ZlYyA9IDI7CisKKwlhbHgtPm1zaXhfZW50cmllcyA9IGtjYWxsb2MobnVtX3ZlYywgc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFhbHgtPm1zaXhfZW50cmllcykgeworCQluZXRkZXZfd2FybihhbHgtPmRldiwgIkFsbG9jYXRpb24gb2YgbXNpeCBlbnRyaWVzIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV92ZWM7IGkrKykKKwkJYWx4LT5tc2l4X2VudHJpZXNbaV0uZW50cnkgPSBpOworCisJZXJyID0gcGNpX2VuYWJsZV9tc2l4KGFseC0+aHcucGRldiwgYWx4LT5tc2l4X2VudHJpZXMsIG51bV92ZWMpOworCWlmIChlcnIpIHsKKwkJa2ZyZWUoYWx4LT5tc2l4X2VudHJpZXMpOworCQluZXRkZXZfd2FybihhbHgtPmRldiwgIkVuYWJsaW5nIE1TSS1YIGludGVycnVwdHMgZmFpbGVkIVxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlhbHgtPm51bV92ZWMgPSBudW1fdmVjOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGFseF9yZXF1ZXN0X21zaXgoc3RydWN0IGFseF9wcml2ICphbHgpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFseC0+ZGV2OworCWludCBpLCBlcnIsIHZlY3RvciA9IDAsIGZyZWVfdmVjdG9yID0gMDsKKworCWVyciA9IHJlcXVlc3RfaXJxKGFseC0+bXNpeF9lbnRyaWVzWzBdLnZlY3RvciwgYWx4X2ludHJfbXNpeF9taXNjLAorCQkJICAwLCBuZXRkZXYtPm5hbWUsIGFseCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZXJyOworCisJdmVjdG9yKys7CisJc3ByaW50ZihhbHgtPmlycV9sYmwsICIlcy1UeFJ4LTAiLCBuZXRkZXYtPm5hbWUpOworCisJZXJyID0gcmVxdWVzdF9pcnEoYWx4LT5tc2l4X2VudHJpZXNbdmVjdG9yXS52ZWN0b3IsCisJCQkgIGFseF9pbnRyX21zaXhfcmluZywgMCwgYWx4LT5pcnFfbGJsLCBhbHgpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfZnJlZTsKKworCXJldHVybiAwOworCitvdXRfZnJlZToKKwlmcmVlX2lycShhbHgtPm1zaXhfZW50cmllc1tmcmVlX3ZlY3RvcisrXS52ZWN0b3IsIGFseCk7CisKKwl2ZWN0b3ItLTsKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yOyBpKyspCisJCWZyZWVfaXJxKGFseC0+bXNpeF9lbnRyaWVzW2ZyZWVfdmVjdG9yKytdLnZlY3RvciwgYWx4KTsKKworb3V0X2VycjoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBhbHhfaW5pdF9pbnRyKHN0cnVjdCBhbHhfcHJpdiAqYWx4LCBib29sIG1zaXgpCit7CisJaWYgKG1zaXgpIHsKKwkJaWYgKGFseF9lbmFibGVfbXNpeChhbHgpKQorCQkJYWx4LT5mbGFncyB8PSBBTFhfRkxBR19VU0lOR19NU0lYOworCX0KKworCWlmICghKGFseC0+ZmxhZ3MgJiBBTFhfRkxBR19VU0lOR19NU0lYKSkgeworCQlhbHgtPm51bV92ZWMgPSAxOworCisJCWlmICghcGNpX2VuYWJsZV9tc2koYWx4LT5ody5wZGV2KSkKKwkJCWFseC0+ZmxhZ3MgfD0gQUxYX0ZMQUdfVVNJTkdfTVNJOworCX0KK30KKworc3RhdGljIHZvaWQgYWx4X2Rpc2FibGVfYWR2YW5jZWRfaW50cihzdHJ1Y3QgYWx4X3ByaXYgKmFseCkKK3sKKwlpZiAoYWx4LT5mbGFncyAmIEFMWF9GTEFHX1VTSU5HX01TSVgpIHsKKwkJa2ZyZWUoYWx4LT5tc2l4X2VudHJpZXMpOworCQlwY2lfZGlzYWJsZV9tc2l4KGFseC0+aHcucGRldik7CisJCWFseC0+ZmxhZ3MgJj0gfkFMWF9GTEFHX1VTSU5HX01TSVg7CisJfQorCisJaWYgKGFseC0+ZmxhZ3MgJiBBTFhfRkxBR19VU0lOR19NU0kpIHsKKwkJcGNpX2Rpc2FibGVfbXNpKGFseC0+aHcucGRldik7CisJCWFseC0+ZmxhZ3MgJj0gfkFMWF9GTEFHX1VTSU5HX01TSTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGFseF9pcnFfZW5hYmxlKHN0cnVjdCBhbHhfcHJpdiAqYWx4KQogewogCXN0cnVjdCBhbHhfaHcgKmh3ID0gJmFseC0+aHc7CisJaW50IGk7CiAKIAkvKiBsZXZlbC0xIGludGVycnVwdCBzd2l0Y2ggKi8KIAlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9JU1IsIDApOwogCWFseF93cml0ZV9tZW0zMihodywgQUxYX0lNUiwgYWx4LT5pbnRfbWFzayk7CiAJYWx4X3Bvc3Rfd3JpdGUoaHcpOworCisJaWYgKGFseC0+ZmxhZ3MgJiBBTFhfRkxBR19VU0lOR19NU0lYKQorCQkvKiBlbmFibGUgYWxsIG1zaXggaXJxcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgYWx4LT5udW1fdmVjOyBpKyspCisJCQlhbHhfbWFza19tc2l4KGh3LCBpLCBmYWxzZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGFseF9pcnFfZGlzYWJsZShzdHJ1Y3QgYWx4X3ByaXYgKmFseCkKIHsKIAlzdHJ1Y3QgYWx4X2h3ICpodyA9ICZhbHgtPmh3OworCWludCBpOwogCiAJYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfSVNSLCBBTFhfSVNSX0RJUyk7CiAJYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfSU1SLCAwKTsKIAlhbHhfcG9zdF93cml0ZShodyk7CiAKLQlzeW5jaHJvbml6ZV9pcnEoYWx4LT5ody5wZGV2LT5pcnEpOworCWlmIChhbHgtPmZsYWdzICYgQUxYX0ZMQUdfVVNJTkdfTVNJWCkgeworCQlmb3IgKGkgPSAwOyBpIDwgYWx4LT5udW1fdmVjOyBpKyspIHsKKwkJCWFseF9tYXNrX21zaXgoaHcsIGksIHRydWUpOworCQkJc3luY2hyb25pemVfaXJxKGFseC0+bXNpeF9lbnRyaWVzW2ldLnZlY3Rvcik7CisJCX0KKwl9IGVsc2UgeworCQlzeW5jaHJvbml6ZV9pcnEoYWx4LT5ody5wZGV2LT5pcnEpOworCX0KIH0KIAogc3RhdGljIGludCBhbHhfcmVxdWVzdF9pcnEoc3RydWN0IGFseF9wcml2ICphbHgpCkBAIC02NTAsOSArODA4LDE4IEBACiAKIAltc2lfY3RybCA9IChody0+aW10ID4+IDEpIDw8IEFMWF9NU0lfUkVUUkFOU19UTV9TSElGVDsKIAotCWlmICghcGNpX2VuYWJsZV9tc2koYWx4LT5ody5wZGV2KSkgewotCQlhbHgtPm1zaSA9IHRydWU7CisJaWYgKGFseC0+ZmxhZ3MgJiBBTFhfRkxBR19VU0lOR19NU0lYKSB7CisJCWFseF93cml0ZV9tZW0zMihodywgQUxYX01TSV9SRVRSQU5TX1RJTUVSLCBtc2lfY3RybCk7CisJCWVyciA9IGFseF9yZXF1ZXN0X21zaXgoYWx4KTsKKwkJaWYgKCFlcnIpCisJCQlnb3RvIG91dDsKIAorCQkvKiBtc2l4IHJlcXVlc3QgZmFpbGVkLCByZWFsbG9jIHJlc291cmNlcyAqLworCQlhbHhfZGlzYWJsZV9hZHZhbmNlZF9pbnRyKGFseCk7CisJCWFseF9pbml0X2ludHIoYWx4LCBmYWxzZSk7CisJfQorCisJaWYgKGFseC0+ZmxhZ3MgJiBBTFhfRkxBR19VU0lOR19NU0kpIHsKIAkJYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfTVNJX1JFVFJBTlNfVElNRVIsCiAJCQkJbXNpX2N0cmwgfCBBTFhfTVNJX01BU0tfU0VMX0xJTkUpOwogCQllcnIgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIGFseF9pbnRyX21zaSwgMCwKQEAgLTY2MCw2ICs4MjcsNyBAQAogCQlpZiAoIWVycikKIAkJCWdvdG8gb3V0OwogCQkvKiBmYWxsIGJhY2sgdG8gbGVnYWN5IGludGVycnVwdCAqLworCQlhbHgtPmZsYWdzICY9IH5BTFhfRkxBR19VU0lOR19NU0k7CiAJCXBjaV9kaXNhYmxlX21zaShhbHgtPmh3LnBkZXYpOwogCX0KIApAQCAtNjY5LDE5ICs4MzcsMjUgQEAKIG91dDoKIAlpZiAoIWVycikKIAkJYWx4X2NvbmZpZ192ZWN0b3JfbWFwcGluZyhhbHgpOworCWVsc2UKKwkJbmV0ZGV2X2VycihhbHgtPmRldiwgIklSUSByZWdpc3RyYXRpb24gZmFpbGVkIVxuIik7CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgYWx4X2ZyZWVfaXJxKHN0cnVjdCBhbHhfcHJpdiAqYWx4KQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWx4LT5ody5wZGV2OworCWludCBpOwogCi0JZnJlZV9pcnEocGRldi0+aXJxLCBhbHgpOwotCi0JaWYgKGFseC0+bXNpKSB7Ci0JCXBjaV9kaXNhYmxlX21zaShhbHgtPmh3LnBkZXYpOwotCQlhbHgtPm1zaSA9IGZhbHNlOworCWlmIChhbHgtPmZsYWdzICYgQUxYX0ZMQUdfVVNJTkdfTVNJWCkgeworCQkvKiB3ZSBoYXZlIG9ubHkgMiB2ZWN0b3JzIHdpdGhvdXQgbXVsdGkgcXVldWUgc3VwcG9ydCAqLworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQkJZnJlZV9pcnEoYWx4LT5tc2l4X2VudHJpZXNbaV0udmVjdG9yLCBhbHgpOworCX0gZWxzZSB7CisJCWZyZWVfaXJxKHBkZXYtPmlycSwgYWx4KTsKIAl9CisKKwlhbHhfZGlzYWJsZV9hZHZhbmNlZF9pbnRyKGFseCk7CiB9CiAKIHN0YXRpYyBpbnQgYWx4X2lkZW50aWZ5X2h3KHN0cnVjdCBhbHhfcHJpdiAqYWx4KQpAQCAtODQ3LDEyICsxMDIxLDE0IEBACiB7CiAJaW50IGVycjsKIAorCWFseF9pbml0X2ludHIoYWx4LCBtc2l4KTsKKwogCWlmICghcmVzdW1lKQogCQluZXRpZl9jYXJyaWVyX29mZihhbHgtPmRldik7CiAKIAllcnIgPSBhbHhfYWxsb2NfcmluZ3MoYWx4KTsKIAlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCQlnb3RvIG91dF9kaXNhYmxlX2Fkdl9pbnRyOwogCiAJYWx4X2NvbmZpZ3VyZShhbHgpOwogCkBAIC04NzMsNiArMTA0OSw4IEBACiAKIG91dF9mcmVlX3JpbmdzOgogCWFseF9mcmVlX3JpbmdzKGFseCk7CitvdXRfZGlzYWJsZV9hZHZfaW50cjoKKwlhbHhfZGlzYWJsZV9hZHZhbmNlZF9pbnRyKGFseCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtOTkzLDYgKzExNzEsMTggQEAKIAlydG5sX3VubG9jaygpOwogfQogCitzdGF0aWMgaW50IGFseF90cGRfcmVxKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IG51bTsKKworCW51bSA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxOworCS8qIHdlIG5lZWQgb25lIGV4dHJhIGRlc2NyaXB0b3IgZm9yIExTT3YyICovCisJaWYgKHNrYl9pc19nc28oc2tiKSAmJiBza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlICYgU0tCX0dTT19UQ1BWNikKKwkJbnVtKys7CisKKwlyZXR1cm4gbnVtOworfQorCiBzdGF0aWMgaW50IGFseF90eF9jc3VtKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBhbHhfdHhkICpmaXJzdCkKIHsKIAl1OCBjc28sIGNzczsKQEAgLTEwMTIsNiArMTIwMiw0NSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGFseF90c28oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGFseF90eGQgKmZpcnN0KQoreworCWludCBlcnI7CisKKwlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXNrYl9pc19nc28oc2tiKSkKKwkJcmV0dXJuIDA7CisKKwllcnIgPSBza2JfY293X2hlYWQoc2tiLCAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgeworCQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOworCisJCWlwaC0+Y2hlY2sgPSAwOworCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsCisJCQkJCQkJIDAsIElQUFJPVE9fVENQLCAwKTsKKwkJZmlyc3QtPndvcmQxIHw9IDEgPDwgVFBEX0lQVjRfU0hJRlQ7CisJfSBlbHNlIGlmIChza2JfaXNfZ3NvX3Y2KHNrYikpIHsKKwkJaXB2Nl9oZHIoc2tiKS0+cGF5bG9hZF9sZW4gPSAwOworCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0gfmNzdW1faXB2Nl9tYWdpYygmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCisJCQkJCQkgICAgICAgJmlwdjZfaGRyKHNrYiktPmRhZGRyLAorCQkJCQkJICAgICAgIDAsIElQUFJPVE9fVENQLCAwKTsKKwkJLyogTFNPdjI6IHRoZSBmaXJzdCBUUEQgb25seSBwcm92aWRlcyB0aGUgcGFja2V0IGxlbmd0aCAqLworCQlmaXJzdC0+YWRybC5sLnBrdF9sZW4gPSBza2ItPmxlbjsKKwkJZmlyc3QtPndvcmQxIHw9IDEgPDwgVFBEX0xTT19WMl9TSElGVDsKKwl9CisKKwlmaXJzdC0+d29yZDEgfD0gMSA8PCBUUERfTFNPX0VOX1NISUZUOworCWZpcnN0LT53b3JkMSB8PSAoc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSAmCisJCQkgVFBEX0w0SERST0ZGU0VUX01BU0spIDw8IFRQRF9MNEhEUk9GRlNFVF9TSElGVDsKKwlmaXJzdC0+d29yZDEgfD0gKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgJgorCQkJIFRQRF9NU1NfTUFTSykgPDwgVFBEX01TU19TSElGVDsKKwlyZXR1cm4gMTsKK30KKwogc3RhdGljIGludCBhbHhfbWFwX3R4X3NrYihzdHJ1Y3QgYWx4X3ByaXYgKmFseCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgYWx4X3R4X3F1ZXVlICp0eHEgPSAmYWx4LT50eHE7CkBAIC0xMDIyLDYgKzEyNTEsMTYgQEAKIAlmaXJzdF90cGQgPSAmdHhxLT50cGRbdHhxLT53cml0ZV9pZHhdOwogCXRwZCA9IGZpcnN0X3RwZDsKIAorCWlmICh0cGQtPndvcmQxICYgKDEgPDwgVFBEX0xTT19WMl9TSElGVCkpIHsKKwkJaWYgKCsrdHhxLT53cml0ZV9pZHggPT0gYWx4LT50eF9yaW5nc3opCisJCQl0eHEtPndyaXRlX2lkeCA9IDA7CisKKwkJdHBkID0gJnR4cS0+dHBkW3R4cS0+d3JpdGVfaWR4XTsKKwkJdHBkLT5sZW4gPSBmaXJzdF90cGQtPmxlbjsKKwkJdHBkLT52bGFuX3RhZyA9IGZpcnN0X3RwZC0+dmxhbl90YWc7CisJCXRwZC0+d29yZDEgPSBmaXJzdF90cGQtPndvcmQxOworCX0KKwogCW1hcGxlbiA9IHNrYl9oZWFkbGVuKHNrYik7CiAJZG1hID0gZG1hX21hcF9zaW5nbGUoJmFseC0+aHcucGRldi0+ZGV2LCBza2ItPmRhdGEsIG1hcGxlbiwKIAkJCSAgICAgRE1BX1RPX0RFVklDRSk7CkBAIC0xMDgyLDkgKzEzMjEsOSBAQAogCXN0cnVjdCBhbHhfcHJpdiAqYWx4ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgYWx4X3R4X3F1ZXVlICp0eHEgPSAmYWx4LT50eHE7CiAJc3RydWN0IGFseF90eGQgKmZpcnN0OwotCWludCB0cGRyZXEgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMTsKKwlpbnQgdHNvOwogCi0JaWYgKGFseF90cGRfYXZhaWwoYWx4KSA8IHRwZHJlcSkgeworCWlmIChhbHhfdHBkX2F2YWlsKGFseCkgPCBhbHhfdHBkX3JlcShza2IpKSB7CiAJCW5ldGlmX3N0b3BfcXVldWUoYWx4LT5kZXYpOwogCQlnb3RvIGRyb3A7CiAJfQpAQCAtMTA5Miw3ICsxMzMxLDEwIEBACiAJZmlyc3QgPSAmdHhxLT50cGRbdHhxLT53cml0ZV9pZHhdOwogCW1lbXNldChmaXJzdCwgMCwgc2l6ZW9mKCpmaXJzdCkpOwogCi0JaWYgKGFseF90eF9jc3VtKHNrYiwgZmlyc3QpKQorCXRzbyA9IGFseF90c28oc2tiLCBmaXJzdCk7CisJaWYgKHRzbyA8IDApCisJCWdvdG8gZHJvcDsKKwllbHNlIGlmICghdHNvICYmIGFseF90eF9jc3VtKHNrYiwgZmlyc3QpKQogCQlnb3RvIGRyb3A7CiAKIAlpZiAoYWx4X21hcF90eF9za2IoYWx4LCBza2IpIDwgMCkKQEAgLTExNzIsNyArMTQxNCwxMCBAQAogewogCXN0cnVjdCBhbHhfcHJpdiAqYWx4ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAotCWlmIChhbHgtPm1zaSkKKwlpZiAoYWx4LT5mbGFncyAmIEFMWF9GTEFHX1VTSU5HX01TSVgpIHsKKwkJYWx4X2ludHJfbXNpeF9taXNjKDAsIGFseCk7CisJCWFseF9pbnRyX21zaXhfcmluZygwLCBhbHgpOworCX0gZWxzZSBpZiAoYWx4LT5mbGFncyAmIEFMWF9GTEFHX1VTSU5HX01TSSkKIAkJYWx4X2ludHJfbXNpKDAsIGFseCk7CiAJZWxzZQogCQlhbHhfaW50cl9sZWdhY3koMCwgYWx4KTsKQEAgLTEzNTEsNyArMTU5NiwxMCBAQAogCQl9CiAJfQogCi0JbmV0ZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0hXX0NTVU07CisJbmV0ZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfAorCQkJICAgICAgTkVUSUZfRl9IV19DU1VNIHwKKwkJCSAgICAgIE5FVElGX0ZfVFNPIHwKKwkJCSAgICAgIE5FVElGX0ZfVFNPNjsKIAogCWlmIChhbHhfZ2V0X3Blcm1fbWFjYWRkcihodywgaHctPnBlcm1fYWRkcikpIHsKIAkJZGV2X3dhcm4oJnBkZXYtPmRldiwKQEAgLTE1NDUsNiArMTc5Myw4IEBACiAJICAuZHJpdmVyX2RhdGEgPSBBTFhfREVWX1FVSVJLX01TSV9JTlRYX0RJU0FCTEVfQlVHIH0sCiAJeyBQQ0lfVkRFVklDRShBVFRBTlNJQywgQUxYX0RFVl9JRF9FMjQwMCksCiAJICAuZHJpdmVyX2RhdGEgPSBBTFhfREVWX1FVSVJLX01TSV9JTlRYX0RJU0FCTEVfQlVHIH0sCisJeyBQQ0lfVkRFVklDRShBVFRBTlNJQywgQUxYX0RFVl9JRF9FMjUwMCksCisJICAuZHJpdmVyX2RhdGEgPSBBTFhfREVWX1FVSVJLX01TSV9JTlRYX0RJU0FCTEVfQlVHIH0sCiAJeyBQQ0lfVkRFVklDRShBVFRBTlNJQywgQUxYX0RFVl9JRF9BUjgxNjIpLAogCSAgLmRyaXZlcl9kYXRhID0gQUxYX0RFVl9RVUlSS19NU0lfSU5UWF9ESVNBQkxFX0JVRyB9LAogCXsgUENJX1ZERVZJQ0UoQVRUQU5TSUMsIEFMWF9ERVZfSURfQVI4MTcxKSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvcmVnLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9yZWcuaAppbmRleCAwOTU5ZTY4Li4xZmMyZDg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9yZWcuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9yZWcuaApAQCAtMzgsNiArMzgsNyBAQAogI2RlZmluZSBBTFhfREVWX0lEX0FSODE2MQkJCQkweDEwOTEKICNkZWZpbmUgQUxYX0RFVl9JRF9FMjIwMAkJCQkweGUwOTEKICNkZWZpbmUgQUxYX0RFVl9JRF9FMjQwMAkJCQkweGUwYTEKKyNkZWZpbmUgQUxYX0RFVl9JRF9FMjUwMAkJCQkweGUwYjEKICNkZWZpbmUgQUxYX0RFVl9JRF9BUjgxNjIJCQkJMHgxMDkwCiAjZGVmaW5lIEFMWF9ERVZfSURfQVI4MTcxCQkJCTB4MTBBMQogI2RlZmluZSBBTFhfREVWX0lEX0FSODE3MgkJCQkweDEwQTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2I0NC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYjQ0LmMKaW5kZXggNzRmMGEzNy4uMTdhYTMzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYjQ0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYjQ0LmMKQEAgLTE0ODYsNyArMTQ4Niw3IEBACiAJYjQ0X2VuYWJsZV9pbnRzKGJwKTsKIAogCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19FWFRFUk5BTF9QSFkpCi0JCXBoeV9zdGFydChicC0+cGh5ZGV2KTsKKwkJcGh5X3N0YXJ0KGRldi0+cGh5ZGV2KTsKIAogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiBvdXQ6CkBAIC0xNjUxLDcgKzE2NTEsNyBAQAogCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAogCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19FWFRFUk5BTF9QSFkpCi0JCXBoeV9zdG9wKGJwLT5waHlkZXYpOworCQlwaHlfc3RvcChkZXYtPnBoeWRldik7CiAKIAluYXBpX2Rpc2FibGUoJmJwLT5uYXBpKTsKIApAQCAtMTgzMiw5MCArMTgzMiwxMDAgQEAKIAlyZXR1cm4gcjsKIH0KIAotc3RhdGljIGludCBiNDRfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIGludCBiNDRfZ2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgc3VwcG9ydGVkLCBhZHZlcnRpc2luZzsKIAogCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19FWFRFUk5BTF9QSFkpIHsKLQkJQlVHX09OKCFicC0+cGh5ZGV2KTsKLQkJcmV0dXJuIHBoeV9ldGh0b29sX2dzZXQoYnAtPnBoeWRldiwgY21kKTsKKwkJQlVHX09OKCFkZXYtPnBoeWRldik7CisJCXJldHVybiBwaHlfZXRodG9vbF9rc2V0dGluZ3NfZ2V0KGRldi0+cGh5ZGV2LCBjbWQpOwogCX0KIAotCWNtZC0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF9BdXRvbmVnKTsKLQljbWQtPnN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAotCQkJICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8Ci0JCQkgIFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAotCQkJICBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKLQkJCSAgU1VQUE9SVEVEX01JSSk7CisJc3VwcG9ydGVkID0gKFNVUFBPUlRFRF9BdXRvbmVnKTsKKwlzdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwKKwkJICAgICAgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAorCQkgICAgICBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJICAgICAgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCSAgICAgIFNVUFBPUlRFRF9NSUkpOwogCi0JY21kLT5hZHZlcnRpc2luZyA9IDA7CisJYWR2ZXJ0aXNpbmcgPSAwOwogCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19BRFZfMTBIQUxGKQotCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmOworCQlhZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZjsKIAlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfQURWXzEwRlVMTCkKLQkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbDsKKwkJYWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGw7CiAJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX0FEVl8xMDBIQUxGKQotCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZjsKKwkJYWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmOwogCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19BRFZfMTAwRlVMTCkKLQkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7Ci0JY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX1BhdXNlIHwgQURWRVJUSVNFRF9Bc3ltX1BhdXNlOwotCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsICgoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfMTAwX0JBU0VfVCkgPwotCQkJCSAgICBTUEVFRF8xMDAgOiBTUEVFRF8xMCkpOwotCWNtZC0+ZHVwbGV4ID0gKGJwLT5mbGFncyAmIEI0NF9GTEFHX0ZVTExfRFVQTEVYKSA/CisJCWFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbDsKKwlhZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX1BhdXNlIHwgQURWRVJUSVNFRF9Bc3ltX1BhdXNlOworCWNtZC0+YmFzZS5zcGVlZCA9IChicC0+ZmxhZ3MgJiBCNDRfRkxBR18xMDBfQkFTRV9UKSA/CisJCVNQRUVEXzEwMCA6IFNQRUVEXzEwOworCWNtZC0+YmFzZS5kdXBsZXggPSAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRlVMTF9EVVBMRVgpID8KIAkJRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKLQljbWQtPnBvcnQgPSAwOwotCWNtZC0+cGh5X2FkZHJlc3MgPSBicC0+cGh5X2FkZHI7Ci0JY21kLT50cmFuc2NlaXZlciA9IChicC0+ZmxhZ3MgJiBCNDRfRkxBR19FWFRFUk5BTF9QSFkpID8KLQkJWENWUl9FWFRFUk5BTCA6IFhDVlJfSU5URVJOQUw7Ci0JY21kLT5hdXRvbmVnID0gKGJwLT5mbGFncyAmIEI0NF9GTEFHX0ZPUkNFX0xJTkspID8KKwljbWQtPmJhc2UucG9ydCA9IDA7CisJY21kLT5iYXNlLnBoeV9hZGRyZXNzID0gYnAtPnBoeV9hZGRyOworCWNtZC0+YmFzZS5hdXRvbmVnID0gKGJwLT5mbGFncyAmIEI0NF9GTEFHX0ZPUkNFX0xJTkspID8KIAkJQVVUT05FR19ESVNBQkxFIDogQVVUT05FR19FTkFCTEU7Ci0JaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkKLQkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0F1dG9uZWc7CisJaWYgKGNtZC0+YmFzZS5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKQorCQlhZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0F1dG9uZWc7CisKKwlldGh0b29sX2NvbnZlcnRfbGVnYWN5X3UzMl90b19saW5rX21vZGUoY21kLT5saW5rX21vZGVzLnN1cHBvcnRlZCwKKwkJCQkJCXN1cHBvcnRlZCk7CisJZXRodG9vbF9jb252ZXJ0X2xlZ2FjeV91MzJfdG9fbGlua19tb2RlKGNtZC0+bGlua19tb2Rlcy5hZHZlcnRpc2luZywKKwkJCQkJCWFkdmVydGlzaW5nKTsKKwogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKXsKLQkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgMCk7Ci0JCWNtZC0+ZHVwbGV4ID0gMHhmZjsKKwkJY21kLT5iYXNlLnNwZWVkID0gMDsKKwkJY21kLT5iYXNlLmR1cGxleCA9IDB4ZmY7CiAJfQotCWNtZC0+bWF4dHhwa3QgPSAwOwotCWNtZC0+bWF4cnhwa3QgPSAwOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYjQ0X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgYjQ0X3NldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CiAJdTMyIHNwZWVkOwogCWludCByZXQ7CisJdTMyIGFkdmVydGlzaW5nOwogCiAJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX0VYVEVSTkFMX1BIWSkgewotCQlCVUdfT04oIWJwLT5waHlkZXYpOworCQlCVUdfT04oIWRldi0+cGh5ZGV2KTsKIAkJc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOwogCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKQogCQkJYjQ0X3NldHVwX3BoeShicCk7CiAKLQkJcmV0ID0gcGh5X2V0aHRvb2xfc3NldChicC0+cGh5ZGV2LCBjbWQpOworCQlyZXQgPSBwaHlfZXRodG9vbF9rc2V0dGluZ3Nfc2V0KGRldi0+cGh5ZGV2LCBjbWQpOwogCiAJCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOwogCiAJCXJldHVybiByZXQ7CiAJfQogCi0Jc3BlZWQgPSBldGh0b29sX2NtZF9zcGVlZChjbWQpOworCXNwZWVkID0gY21kLT5iYXNlLnNwZWVkOworCisJZXRodG9vbF9jb252ZXJ0X2xpbmtfbW9kZV90b19sZWdhY3lfdTMyKCZhZHZlcnRpc2luZywKKwkJCQkJCWNtZC0+bGlua19tb2Rlcy5hZHZlcnRpc2luZyk7CiAKIAkvKiBXZSBkbyBub3Qgc3VwcG9ydCBnaWdhYml0LiAqLwotCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKLQkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgJgorCWlmIChjbWQtPmJhc2UuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQlpZiAoYWR2ZXJ0aXNpbmcgJgogCQkgICAgKEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYgfAogCQkgICAgIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIGlmICgoc3BlZWQgIT0gU1BFRURfMTAwICYmCiAJCSAgICBzcGVlZCAhPSBTUEVFRF8xMCkgfHwKLQkJICAgKGNtZC0+ZHVwbGV4ICE9IERVUExFWF9IQUxGICYmCi0JCSAgICBjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkpIHsKKwkJICAgKGNtZC0+YmFzZS5kdXBsZXggIT0gRFVQTEVYX0hBTEYgJiYKKwkJICAgIGNtZC0+YmFzZS5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpKSB7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CiAKLQlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJaWYgKGNtZC0+YmFzZS5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CiAJCWJwLT5mbGFncyAmPSB+KEI0NF9GTEFHX0ZPUkNFX0xJTksgfAogCQkJICAgICAgIEI0NF9GTEFHXzEwMF9CQVNFX1QgfAogCQkJICAgICAgIEI0NF9GTEFHX0ZVTExfRFVQTEVYIHwKQEAgLTE5MjMsMTkgKzE5MzMsMTkgQEAKIAkJCSAgICAgICBCNDRfRkxBR19BRFZfMTBGVUxMIHwKIAkJCSAgICAgICBCNDRfRkxBR19BRFZfMTAwSEFMRiB8CiAJCQkgICAgICAgQjQ0X0ZMQUdfQURWXzEwMEZVTEwpOwotCQlpZiAoY21kLT5hZHZlcnRpc2luZyA9PSAwKSB7CisJCWlmIChhZHZlcnRpc2luZyA9PSAwKSB7CiAJCQlicC0+ZmxhZ3MgfD0gKEI0NF9GTEFHX0FEVl8xMEhBTEYgfAogCQkJCSAgICAgIEI0NF9GTEFHX0FEVl8xMEZVTEwgfAogCQkJCSAgICAgIEI0NF9GTEFHX0FEVl8xMDBIQUxGIHwKIAkJCQkgICAgICBCNDRfRkxBR19BRFZfMTAwRlVMTCk7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKQorCQkJaWYgKGFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCiAJCQkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHX0FEVl8xMEhBTEY7Ci0JCQlpZiAoY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKQorCQkJaWYgKGFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpCiAJCQkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHX0FEVl8xMEZVTEw7Ci0JCQlpZiAoY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikKKwkJCWlmIChhZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikKIAkJCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfQURWXzEwMEhBTEY7Ci0JCQlpZiAoY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKKwkJCWlmIChhZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKIAkJCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfQURWXzEwMEZVTEw7CiAJCX0KIAl9IGVsc2UgewpAQCAtMTk0Myw3ICsxOTUzLDcgQEAKIAkJYnAtPmZsYWdzICY9IH4oQjQ0X0ZMQUdfMTAwX0JBU0VfVCB8IEI0NF9GTEFHX0ZVTExfRFVQTEVYKTsKIAkJaWYgKHNwZWVkID09IFNQRUVEXzEwMCkKIAkJCWJwLT5mbGFncyB8PSBCNDRfRkxBR18xMDBfQkFTRV9UOwotCQlpZiAoY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCWlmIChjbWQtPmJhc2UuZHVwbGV4ID09IERVUExFWF9GVUxMKQogCQkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHX0ZVTExfRFVQTEVYOwogCX0KIApAQCAtMjExMCw4ICsyMTIwLDYgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBiNDRfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvCQk9IGI0NF9nZXRfZHJ2aW5mbywKLQkuZ2V0X3NldHRpbmdzCQk9IGI0NF9nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncwkJPSBiNDRfc2V0X3NldHRpbmdzLAogCS5ud2F5X3Jlc2V0CQk9IGI0NF9ud2F5X3Jlc2V0LAogCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAogCS5nZXRfd29sCQk9IGI0NF9nZXRfd29sLApAQCAtMjEyNSw2ICsyMTMzLDggQEAKIAkuZ2V0X3N0cmluZ3MJCT0gYjQ0X2dldF9zdHJpbmdzLAogCS5nZXRfc3NldF9jb3VudAkJPSBiNDRfZ2V0X3NzZXRfY291bnQsCiAJLmdldF9ldGh0b29sX3N0YXRzCT0gYjQ0X2dldF9ldGh0b29sX3N0YXRzLAorCS5nZXRfbGlua19rc2V0dGluZ3MJPSBiNDRfZ2V0X2xpbmtfa3NldHRpbmdzLAorCS5zZXRfbGlua19rc2V0dGluZ3MJPSBiNDRfc2V0X2xpbmtfa3NldHRpbmdzLAogfTsKIAogc3RhdGljIGludCBiNDRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCkBAIC0yMTM3LDggKzIxNDcsOCBAQAogCiAJc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOwogCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19FWFRFUk5BTF9QSFkpIHsKLQkJQlVHX09OKCFicC0+cGh5ZGV2KTsKLQkJZXJyID0gcGh5X21paV9pb2N0bChicC0+cGh5ZGV2LCBpZnIsIGNtZCk7CisJCUJVR19PTighZGV2LT5waHlkZXYpOworCQllcnIgPSBwaHlfbWlpX2lvY3RsKGRldi0+cGh5ZGV2LCBpZnIsIGNtZCk7CiAJfSBlbHNlIHsKIAkJZXJyID0gZ2VuZXJpY19taWlfaW9jdGwoJmJwLT5taWlfaWYsIGlmX21paShpZnIpLCBjbWQsIE5VTEwpOwogCX0KQEAgLTIyMDYsNyArMjIxNiw3IEBACiBzdGF0aWMgdm9pZCBiNDRfYWRqdXN0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGJwLT5waHlkZXY7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGRldi0+cGh5ZGV2OwogCWJvb2wgc3RhdHVzX2NoYW5nZWQgPSAwOwogCiAJQlVHX09OKCFwaHlkZXYpOwpAQCAtMjMwMyw3ICsyMzEzLDYgQEAKIAkJCSAgICAgIFNVUFBPUlRFRF9NSUkpOwogCXBoeWRldi0+YWR2ZXJ0aXNpbmcgPSBwaHlkZXYtPnN1cHBvcnRlZDsKIAotCWJwLT5waHlkZXYgPSBwaHlkZXY7CiAJYnAtPm9sZF9saW5rID0gMDsKIAlicC0+cGh5X2FkZHIgPSBwaHlkZXYtPm1kaW8uYWRkcjsKIApAQCAtMjMyMyw5ICsyMzMyLDEwIEBACiAKIHN0YXRpYyB2b2lkIGI0NF91bnJlZ2lzdGVyX3BoeV9vbmUoc3RydWN0IGI0NCAqYnApCiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGJwLT5kZXY7CiAJc3RydWN0IG1paV9idXMgKm1paV9idXMgPSBicC0+bWlpX2J1czsKIAotCXBoeV9kaXNjb25uZWN0KGJwLT5waHlkZXYpOworCXBoeV9kaXNjb25uZWN0KGRldi0+cGh5ZGV2KTsKIAltZGlvYnVzX3VucmVnaXN0ZXIobWlpX2J1cyk7CiAJbWRpb2J1c19mcmVlKG1paV9idXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYjQ0LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iNDQuaAppbmRleCA2NWQ4OGQ3Li44OWQyY2YzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iNDQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iNDQuaApAQCAtNDA0LDcgKzQwNCw2IEBACiAJdTMyCQkJdHhfcGVuZGluZzsKIAl1OAkJCXBoeV9hZGRyOwogCXU4CQkJZm9yY2VfY29weWJyZWFrOwotCXN0cnVjdCBwaHlfZGV2aWNlCSpwaHlkZXY7CiAJc3RydWN0IG1paV9idXMJCSptaWlfYnVzOwogCWludAkJCW9sZF9saW5rOwogCXN0cnVjdCBtaWlfaWZfaW5mbwltaWlfaWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iY202M3h4X2VuZXQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JjbTYzeHhfZW5ldC5jCmluZGV4IDZjOGJjNWYuLmFlMzY0YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JjbTYzeHhfZW5ldC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JjbTYzeHhfZW5ldC5jCkBAIC03OTEsNyArNzkxLDcgQEAKIAlpbnQgc3RhdHVzX2NoYW5nZWQ7CiAKIAlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlwaHlkZXYgPSBwcml2LT5waHlkZXY7CisJcGh5ZGV2ID0gZGV2LT5waHlkZXY7CiAJc3RhdHVzX2NoYW5nZWQgPSAwOwogCiAJaWYgKHByaXYtPm9sZF9saW5rICE9IHBoeWRldi0+bGluaykgewpAQCAtOTEzLDcgKzkxMyw2IEBACiAJCXByaXYtPm9sZF9saW5rID0gMDsKIAkJcHJpdi0+b2xkX2R1cGxleCA9IC0xOwogCQlwcml2LT5vbGRfcGF1c2UgPSAtMTsKLQkJcHJpdi0+cGh5ZGV2ID0gcGh5ZGV2OwogCX0KIAogCS8qIG1hc2sgYWxsIGludGVycnVwdHMgYW5kIHJlcXVlc3QgdGhlbSAqLwpAQCAtMTA4NSw3ICsxMDg0LDcgQEAKIAkJCSBFTkVURE1BQ19JUk1BU0ssIHByaXYtPnR4X2NoYW4pOwogCiAJaWYgKHByaXYtPmhhc19waHkpCi0JCXBoeV9zdGFydChwcml2LT5waHlkZXYpOworCQlwaHlfc3RhcnQocGh5ZGV2KTsKIAllbHNlCiAJCWJjbV9lbmV0X2FkanVzdF9saW5rKGRldik7CiAKQEAgLTExMjcsNyArMTEyNiw3IEBACiAJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiAKIG91dF9waHlfZGlzY29ubmVjdDoKLQlwaHlfZGlzY29ubmVjdChwcml2LT5waHlkZXYpOworCXBoeV9kaXNjb25uZWN0KHBoeWRldik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTE5MCw3ICsxMTg5LDcgQEAKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAJbmFwaV9kaXNhYmxlKCZwcml2LT5uYXBpKTsKIAlpZiAocHJpdi0+aGFzX3BoeSkKLQkJcGh5X3N0b3AocHJpdi0+cGh5ZGV2KTsKKwkJcGh5X3N0b3AoZGV2LT5waHlkZXYpOwogCWRlbF90aW1lcl9zeW5jKCZwcml2LT5yeF90aW1lb3V0KTsKIAogCS8qIG1hc2sgYWxsIGludGVycnVwdHMgKi8KQEAgLTEyMzQsMTAgKzEyMzMsOCBAQAogCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogCiAJLyogcmVsZWFzZSBwaHkgKi8KLQlpZiAocHJpdi0+aGFzX3BoeSkgewotCQlwaHlfZGlzY29ubmVjdChwcml2LT5waHlkZXYpOwotCQlwcml2LT5waHlkZXYgPSBOVUxMOwotCX0KKwlpZiAocHJpdi0+aGFzX3BoeSkKKwkJcGh5X2Rpc2Nvbm5lY3QoZGV2LT5waHlkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNDM3LDY0ICsxNDM0LDY4IEBACiAKIAlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpZiAocHJpdi0+aGFzX3BoeSkgewotCQlpZiAoIXByaXYtPnBoeWRldikKKwkJaWYgKCFkZXYtPnBoeWRldikKIAkJCXJldHVybiAtRU5PREVWOwotCQlyZXR1cm4gZ2VucGh5X3Jlc3RhcnRfYW5lZyhwcml2LT5waHlkZXYpOworCQlyZXR1cm4gZ2VucGh5X3Jlc3RhcnRfYW5lZyhkZXYtPnBoeWRldik7CiAJfQogCiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCi1zdGF0aWMgaW50IGJjbV9lbmV0X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgYmNtX2VuZXRfZ2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJc3RydWN0IGJjbV9lbmV0X3ByaXYgKnByaXY7CisJdTMyIHN1cHBvcnRlZCwgYWR2ZXJ0aXNpbmc7CiAKIAlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWNtZC0+bWF4cnhwa3QgPSAwOwotCWNtZC0+bWF4dHhwa3QgPSAwOwotCiAJaWYgKHByaXYtPmhhc19waHkpIHsKLQkJaWYgKCFwcml2LT5waHlkZXYpCisJCWlmICghZGV2LT5waHlkZXYpCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJcmV0dXJuIHBoeV9ldGh0b29sX2dzZXQocHJpdi0+cGh5ZGV2LCBjbWQpOworCQlyZXR1cm4gcGh5X2V0aHRvb2xfa3NldHRpbmdzX2dldChkZXYtPnBoeWRldiwgY21kKTsKIAl9IGVsc2UgewotCQljbWQtPmF1dG9uZWcgPSAwOwotCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCAoKHByaXYtPmZvcmNlX3NwZWVkXzEwMCkKLQkJCQkJICAgID8gU1BFRURfMTAwIDogU1BFRURfMTApKTsKLQkJY21kLT5kdXBsZXggPSAocHJpdi0+Zm9yY2VfZHVwbGV4X2Z1bGwpID8KKwkJY21kLT5iYXNlLmF1dG9uZWcgPSAwOworCQljbWQtPmJhc2Uuc3BlZWQgPSAocHJpdi0+Zm9yY2Vfc3BlZWRfMTAwKSA/CisJCQlTUEVFRF8xMDAgOiBTUEVFRF8xMDsKKwkJY21kLT5iYXNlLmR1cGxleCA9IChwcml2LT5mb3JjZV9kdXBsZXhfZnVsbCkgPwogCQkJRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKLQkJY21kLT5zdXBwb3J0ZWQgPSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiAgfAorCQlzdXBwb3J0ZWQgPSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8CiAJCQlBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8CiAJCQlBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfAogCQkJQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsOwotCQljbWQtPmFkdmVydGlzaW5nID0gMDsKLQkJY21kLT5wb3J0ID0gUE9SVF9NSUk7Ci0JCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0VYVEVSTkFMOworCQlhZHZlcnRpc2luZyA9IDA7CisJCWV0aHRvb2xfY29udmVydF9sZWdhY3lfdTMyX3RvX2xpbmtfbW9kZSgKKwkJCWNtZC0+bGlua19tb2Rlcy5zdXBwb3J0ZWQsIHN1cHBvcnRlZCk7CisJCWV0aHRvb2xfY29udmVydF9sZWdhY3lfdTMyX3RvX2xpbmtfbW9kZSgKKwkJCWNtZC0+bGlua19tb2Rlcy5hZHZlcnRpc2luZywgYWR2ZXJ0aXNpbmcpOworCQljbWQtPmJhc2UucG9ydCA9IFBPUlRfTUlJOwogCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBiY21fZW5ldF9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCitzdGF0aWMgaW50IGJjbV9lbmV0X3NldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCXN0cnVjdCBiY21fZW5ldF9wcml2ICpwcml2OwogCiAJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaWYgKHByaXYtPmhhc19waHkpIHsKLQkJaWYgKCFwcml2LT5waHlkZXYpCisJCWlmICghZGV2LT5waHlkZXYpCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocHJpdi0+cGh5ZGV2LCBjbWQpOworCQlyZXR1cm4gcGh5X2V0aHRvb2xfa3NldHRpbmdzX3NldChkZXYtPnBoeWRldiwgY21kKTsKIAl9IGVsc2UgewogCi0JCWlmIChjbWQtPmF1dG9uZWcgfHwKLQkJICAgIChjbWQtPnNwZWVkICE9IFNQRUVEXzEwMCAmJiBjbWQtPnNwZWVkICE9IFNQRUVEXzEwKSB8fAotCQkgICAgY21kLT5wb3J0ICE9IFBPUlRfTUlJKQorCQlpZiAoY21kLT5iYXNlLmF1dG9uZWcgfHwKKwkJICAgIChjbWQtPmJhc2Uuc3BlZWQgIT0gU1BFRURfMTAwICYmCisJCSAgICAgY21kLT5iYXNlLnNwZWVkICE9IFNQRUVEXzEwKSB8fAorCQkgICAgY21kLT5iYXNlLnBvcnQgIT0gUE9SVF9NSUkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlwcml2LT5mb3JjZV9zcGVlZF8xMDAgPSAoY21kLT5zcGVlZCA9PSBTUEVFRF8xMDApID8gMSA6IDA7Ci0JCXByaXYtPmZvcmNlX2R1cGxleF9mdWxsID0gKGNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKSA/IDEgOiAwOworCQlwcml2LT5mb3JjZV9zcGVlZF8xMDAgPQorCQkJKGNtZC0+YmFzZS5zcGVlZCA9PSBTUEVFRF8xMDApID8gMSA6IDA7CisJCXByaXYtPmZvcmNlX2R1cGxleF9mdWxsID0KKwkJCShjbWQtPmJhc2UuZHVwbGV4ID09IERVUExFWF9GVUxMKSA/IDEgOiAwOwogCiAJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCiAJCQliY21fZW5ldF9hZGp1c3RfbGluayhkZXYpOwpAQCAtMTU4OCwxNCArMTU4OSwxNCBAQAogCS5nZXRfc3NldF9jb3VudAkJPSBiY21fZW5ldF9nZXRfc3NldF9jb3VudCwKIAkuZ2V0X2V0aHRvb2xfc3RhdHMgICAgICA9IGJjbV9lbmV0X2dldF9ldGh0b29sX3N0YXRzLAogCS5ud2F5X3Jlc2V0CQk9IGJjbV9lbmV0X253YXlfcmVzZXQsCi0JLmdldF9zZXR0aW5ncwkJPSBiY21fZW5ldF9nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncwkJPSBiY21fZW5ldF9zZXRfc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvCQk9IGJjbV9lbmV0X2dldF9kcnZpbmZvLAogCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAogCS5nZXRfcmluZ3BhcmFtCQk9IGJjbV9lbmV0X2dldF9yaW5ncGFyYW0sCiAJLnNldF9yaW5ncGFyYW0JCT0gYmNtX2VuZXRfc2V0X3JpbmdwYXJhbSwKIAkuZ2V0X3BhdXNlcGFyYW0JCT0gYmNtX2VuZXRfZ2V0X3BhdXNlcGFyYW0sCiAJLnNldF9wYXVzZXBhcmFtCQk9IGJjbV9lbmV0X3NldF9wYXVzZXBhcmFtLAorCS5nZXRfbGlua19rc2V0dGluZ3MJPSBiY21fZW5ldF9nZXRfbGlua19rc2V0dGluZ3MsCisJLnNldF9saW5rX2tzZXR0aW5ncwk9IGJjbV9lbmV0X3NldF9saW5rX2tzZXR0aW5ncywKIH07CiAKIHN0YXRpYyBpbnQgYmNtX2VuZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKQEAgLTE2MDQsOSArMTYwNSw5IEBACiAKIAlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpZiAocHJpdi0+aGFzX3BoeSkgewotCQlpZiAoIXByaXYtPnBoeWRldikKKwkJaWYgKCFkZXYtPnBoeWRldikKIAkJCXJldHVybiAtRU5PREVWOwotCQlyZXR1cm4gcGh5X21paV9pb2N0bChwcml2LT5waHlkZXYsIHJxLCBjbWQpOworCQlyZXR1cm4gcGh5X21paV9pb2N0bChkZXYtPnBoeWRldiwgcnEsIGNtZCk7CiAJfSBlbHNlIHsKIAkJc3RydWN0IG1paV9pZl9pbmZvIG1paTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmNtNjN4eF9lbmV0LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iY202M3h4X2VuZXQuaAppbmRleCBmNTVhZjQzLi4wYTFiN2IyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iY202M3h4X2VuZXQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iY202M3h4X2VuZXQuaApAQCAtMjkwLDcgKzI5MCw2IEBACiAKIAkvKiB1c2VkIHdoZW4gYSBwaHkgaXMgY29ubmVjdGVkIChwaHlsaWIgdXNlZCkgKi8KIAlzdHJ1Y3QgbWlpX2J1cyAqbWlpX2J1czsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OwogCWludCBvbGRfbGluazsKIAlpbnQgb2xkX2R1cGxleDsKIAlpbnQgb2xkX3BhdXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmNtc3lzcG9ydC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmNtc3lzcG9ydC5jCmluZGV4IGIyZDMwODYuLmMzMzU0YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JjbXN5c3BvcnQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iY21zeXNwb3J0LmMKQEAgLTU4LDggKzU4LDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbnRybDJfIyN3aGljaCMjX21hc2tfY2xlYXIoc3RydWN0IGJjbV9zeXNwb3J0X3ByaXYgKnByaXYsIFwKIAkJCQkJCXUzMiBtYXNrKQkJXAogewkJCQkJCQkJCVwKLQlpbnRybDJfIyN3aGljaCMjX3dyaXRlbChwcml2LCBtYXNrLCBJTlRSTDJfQ1BVX01BU0tfQ0xFQVIpOwlcCiAJcHJpdi0+aXJxIyN3aGljaCMjX21hc2sgJj0gfihtYXNrKTsJCQkJXAorCWludHJsMl8jI3doaWNoIyNfd3JpdGVsKHByaXYsIG1hc2ssIElOVFJMMl9DUFVfTUFTS19DTEVBUik7CVwKIH0JCQkJCQkJCQlcCiBzdGF0aWMgaW5saW5lIHZvaWQgaW50cmwyXyMjd2hpY2gjI19tYXNrX3NldChzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdiwgXAogCQkJCQkJdTMyIG1hc2spCQlcCkBAIC0xNjkyLDcgKzE2OTIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGJjbV9zeXNwb3J0X2V0aHRvb2xfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBiY21fc3lzcG9ydF9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2RydmluZm8JCT0gYmNtX3N5c3BvcnRfZ2V0X2RydmluZm8sCiAJLmdldF9tc2dsZXZlbAkJPSBiY21fc3lzcG9ydF9nZXRfbXNnbHZsLAogCS5zZXRfbXNnbGV2ZWwJCT0gYmNtX3N5c3BvcnRfc2V0X21zZ2x2bCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JnbWFjLWJjbWEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JnbWFjLWJjbWEuYwppbmRleCA5YTk3NDVjNC4uYzE2ZWMzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmdtYWMtYmNtYS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JnbWFjLWJjbWEuYwpAQCAtOTIsNiArOTIsNyBAQAogLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0L21hYy1nYml0L2dtYWMvY2hpcGF0dGFjaCAqLwogc3RhdGljIGludCBiZ21hY19wcm9iZShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUpCiB7CisJc3RydWN0IGJjbWFfY2hpcGluZm8gKmNpID0gJmNvcmUtPmJ1cy0+Y2hpcGluZm87CiAJc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSAmY29yZS0+YnVzLT5zcHJvbTsKIAlzdHJ1Y3QgbWlpX2J1cyAqbWlpX2J1czsKIAlzdHJ1Y3QgYmdtYWMgKmJnbWFjOwpAQCAtMTU3LDkgKzE1OCwxMCBAQAogCWRldl9pbmZvKGJnbWFjLT5kZXYsICJGb3VuZCBQSFkgYWRkcjogJWQlc1xuIiwgYmdtYWMtPnBoeWFkZHIsCiAJCSBiZ21hYy0+cGh5YWRkciA9PSBCR01BQ19QSFlfTk9SRUdTID8gIiAoTk9SRUdTKSIgOiAiIik7CiAKLQlpZiAoIWJnbWFjX2lzX2JjbTQ3MDdfZmFtaWx5KGNvcmUpKSB7CisJaWYgKCFiZ21hY19pc19iY200NzA3X2ZhbWlseShjb3JlKSAmJgorCSAgICAhKGNpLT5pZCA9PSBCQ01BX0NISVBfSURfQkNNNTM1NzMgJiYgY29yZS0+Y29yZV91bml0ID09IDEpKSB7CiAJCW1paV9idXMgPSBiY21hX21kaW9fbWlpX3JlZ2lzdGVyKGNvcmUsIGJnbWFjLT5waHlhZGRyKTsKLQkJaWYgKCFJU19FUlIobWlpX2J1cykpIHsKKwkJaWYgKElTX0VSUihtaWlfYnVzKSkgewogCQkJZXJyID0gUFRSX0VSUihtaWlfYnVzKTsKIAkJCWdvdG8gZXJyOwogCQl9CkBAIC0yMzAsNiArMjMyLDIxIEBACiAJCWJnbWFjLT5mZWF0dXJlX2ZsYWdzIHw9IEJHTUFDX0ZFQVRfTk9fUkVTRVQ7CiAJCWJnbWFjLT5mZWF0dXJlX2ZsYWdzIHw9IEJHTUFDX0ZFQVRfRk9SQ0VfU1BFRURfMjUwMDsKIAkJYnJlYWs7CisJY2FzZSBCQ01BX0NISVBfSURfQkNNNTM1NzM6CisJCWJnbWFjLT5mZWF0dXJlX2ZsYWdzIHw9IEJHTUFDX0ZFQVRfQ0xLQ1RMU1Q7CisJCWJnbWFjLT5mZWF0dXJlX2ZsYWdzIHw9IEJHTUFDX0ZFQVRfU0VUX1JYUV9DTEs7CisJCWlmIChjaS0+cGtnID09IEJDTUFfUEtHX0lEX0JDTTQ3MTg5KQorCQkJYmdtYWMtPmZlYXR1cmVfZmxhZ3MgfD0gQkdNQUNfRkVBVF9JT1NUX0FUVEFDSEVEOworCQlpZiAoY29yZS0+Y29yZV91bml0ID09IDApIHsKKwkJCWJnbWFjLT5mZWF0dXJlX2ZsYWdzIHw9IEJHTUFDX0ZFQVRfQ0M0X0lGX1NXX1RZUEU7CisJCQlpZiAoY2ktPnBrZyA9PSBCQ01BX1BLR19JRF9CQ000NzE4OSkKKwkJCQliZ21hYy0+ZmVhdHVyZV9mbGFncyB8PQorCQkJCQlCR01BQ19GRUFUX0NDNF9JRl9TV19UWVBFX1JHTUlJOworCQl9IGVsc2UgaWYgKGNvcmUtPmNvcmVfdW5pdCA9PSAxKSB7CisJCQliZ21hYy0+ZmVhdHVyZV9mbGFncyB8PSBCR01BQ19GRUFUX0lSUV9JRF9PT0JfNjsKKwkJCWJnbWFjLT5mZWF0dXJlX2ZsYWdzIHw9IEJHTUFDX0ZFQVRfQ0M3X0lGX1RZUEVfUkdNSUk7CisJCX0KKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYmdtYWMtPmZlYXR1cmVfZmxhZ3MgfD0gQkdNQUNfRkVBVF9DTEtDVExTVDsKIAkJYmdtYWMtPmZlYXR1cmVfZmxhZ3MgfD0gQkdNQUNfRkVBVF9TRVRfUlhRX0NMSzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JnbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iZ21hYy5jCmluZGV4IGM0NzUxZWMuLjZlYTBlNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JnbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmdtYWMuYwpAQCAtOTMyLDcgKzkzMiw4IEBACiAJCQlldF9zd3R5cGUgPDw9IDQ7CiAJCQlzd190eXBlID0gZXRfc3d0eXBlOwogCQl9IGVsc2UgaWYgKGJnbWFjLT5mZWF0dXJlX2ZsYWdzICYgQkdNQUNfRkVBVF9TV19UWVBFX0VQSFlSTUlJKSB7Ci0JCQlzd190eXBlID0gQkdNQUNfQ0hJUENUTF8xX1NXX1RZUEVfRVBIWVJNSUk7CisJCQlzd190eXBlID0gQkdNQUNfQ0hJUENUTF8xX0lGX1RZUEVfUk1JSSB8CisJCQkJICBCR01BQ19DSElQQ1RMXzFfU1dfVFlQRV9FUEhZUk1JSTsKIAkJfSBlbHNlIGlmIChiZ21hYy0+ZmVhdHVyZV9mbGFncyAmIEJHTUFDX0ZFQVRfU1dfVFlQRV9SR01JSSkgewogCQkJc3dfdHlwZSA9IEJHTUFDX0NISVBDVExfMV9JRl9UWVBFX1JHTUlJIHwKIAkJCQkgIEJHTUFDX0NISVBDVExfMV9TV19UWVBFX1JHTUlJOwpAQCAtOTQwLDYgKzk0MSwyNyBAQAogCQliZ21hY19jY29fY3RsX21hc2tzZXQoYmdtYWMsIDEsIH4oQkdNQUNfQ0hJUENUTF8xX0lGX1RZUEVfTUFTSyB8CiAJCQkJCQkgIEJHTUFDX0NISVBDVExfMV9TV19UWVBFX01BU0spLAogCQkJCSAgICAgIHN3X3R5cGUpOworCX0gZWxzZSBpZiAoYmdtYWMtPmZlYXR1cmVfZmxhZ3MgJiBCR01BQ19GRUFUX0NDNF9JRl9TV19UWVBFKSB7CisJCXUzMiBzd190eXBlID0gQkdNQUNfQ0hJUENUTF80X0lGX1RZUEVfTUlJIHwKKwkJCSAgICAgIEJHTUFDX0NISVBDVExfNF9TV19UWVBFX0VQSFk7CisJCXU4IGV0X3N3dHlwZSA9IDA7CisJCWNoYXIgYnVmWzRdOworCisJCWlmIChiY200N3h4X252cmFtX2dldGVudigiZXRfc3d0eXBlIiwgYnVmLCBzaXplb2YoYnVmKSkgPiAwKSB7CisJCQlpZiAoa3N0cnRvdTgoYnVmLCAwLCAmZXRfc3d0eXBlKSkKKwkJCQlkZXZfZXJyKGJnbWFjLT5kZXYsICJGYWlsZWQgdG8gcGFyc2UgZXRfc3d0eXBlICglcylcbiIsCisJCQkJCWJ1Zik7CisJCQlzd190eXBlID0gKGV0X3N3dHlwZSAmIDB4MGYpIDw8IDEyOworCQl9IGVsc2UgaWYgKGJnbWFjLT5mZWF0dXJlX2ZsYWdzICYgQkdNQUNfRkVBVF9DQzRfSUZfU1dfVFlQRV9SR01JSSkgeworCQkJc3dfdHlwZSA9IEJHTUFDX0NISVBDVExfNF9JRl9UWVBFX1JHTUlJIHwKKwkJCQkgIEJHTUFDX0NISVBDVExfNF9TV19UWVBFX1JHTUlJOworCQl9CisJCWJnbWFjX2Njb19jdGxfbWFza3NldChiZ21hYywgNCwgfihCR01BQ19DSElQQ1RMXzRfSUZfVFlQRV9NQVNLIHwKKwkJCQkJCSAgQkdNQUNfQ0hJUENUTF80X1NXX1RZUEVfTUFTSyksCisJCQkJICAgICAgc3dfdHlwZSk7CisJfSBlbHNlIGlmIChiZ21hYy0+ZmVhdHVyZV9mbGFncyAmIEJHTUFDX0ZFQVRfQ0M3X0lGX1RZUEVfUkdNSUkpIHsKKwkJYmdtYWNfY2NvX2N0bF9tYXNrc2V0KGJnbWFjLCA3LCB+QkdNQUNfQ0hJUENUTF83X0lGX1RZUEVfTUFTSywKKwkJCQkgICAgICBCR01BQ19DSElQQ1RMXzdfSUZfVFlQRV9SR01JSSk7CiAJfQogCiAJaWYgKGlvc3QgJiBCR01BQ19CQ01BX0lPU1RfQVRUQUNIRUQgJiYgIWJnbWFjLT5oYXNfcm9ib3N3KQpAQCAtMTQ2Nyw2ICsxNDg5LDEwIEBACiAJICovCiAJYmdtYWNfY2xrX2VuYWJsZShiZ21hYywgMCk7CiAKKwkvKiBUaGlzIHNlZW1zIHRvIGJlIGZpeGluZyBJUlEgYnkgYXNzaWduaW5nIE9PQiAjNiB0byB0aGUgY29yZSAqLworCWlmIChiZ21hYy0+ZmVhdHVyZV9mbGFncyAmIEJHTUFDX0ZFQVRfSVJRX0lEX09PQl82KQorCQliZ21hY19pZG1fd3JpdGUoYmdtYWMsIEJDTUFfT09CX1NFTF9PVVRfQTMwLCAweDg2KTsKKwogCWJnbWFjX2NoaXBfcmVzZXQoYmdtYWMpOwogCiAJZXJyID0gYmdtYWNfZG1hX2FsbG9jKGJnbWFjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JnbWFjLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iZ21hYy5oCmluZGV4IDI0YTI1MDIuLjgwODM2YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JnbWFjLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmdtYWMuaApAQCAtMzY5LDYgKzM2OSwyMSBAQAogI2RlZmluZSBCR01BQ19DSElQQ1RMXzFfU1dfVFlQRV9SR01JSQkJMHgwMDAwMDBDMAogI2RlZmluZSBCR01BQ19DSElQQ1RMXzFfUlhDX0RMTF9CWVBBU1MJCTB4MDAwMTAwMDAKIAorI2RlZmluZSBCR01BQ19DSElQQ1RMXzRfSUZfVFlQRV9NQVNLCQkweDAwMDAzMDAwCisjZGVmaW5lIEJHTUFDX0NISVBDVExfNF9JRl9UWVBFX1JNSUkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQkdNQUNfQ0hJUENUTF80X0lGX1RZUEVfTUlJCQkweDAwMDAxMDAwCisjZGVmaW5lIEJHTUFDX0NISVBDVExfNF9JRl9UWVBFX1JHTUlJCQkweDAwMDAyMDAwCisjZGVmaW5lIEJHTUFDX0NISVBDVExfNF9TV19UWVBFX01BU0sJCTB4MDAwMEMwMDAKKyNkZWZpbmUgQkdNQUNfQ0hJUENUTF80X1NXX1RZUEVfRVBIWQkJMHgwMDAwMDAwMAorI2RlZmluZSBCR01BQ19DSElQQ1RMXzRfU1dfVFlQRV9FUEhZTUlJCQkweDAwMDA0MDAwCisjZGVmaW5lIEJHTUFDX0NISVBDVExfNF9TV19UWVBFX0VQSFlSTUlJCTB4MDAwMDgwMDAKKyNkZWZpbmUgQkdNQUNfQ0hJUENUTF80X1NXX1RZUEVfUkdNSUkJCTB4MDAwMEMwMDAKKworI2RlZmluZSBCR01BQ19DSElQQ1RMXzdfSUZfVFlQRV9NQVNLCQkweDAwMDAwMEMwCisjZGVmaW5lIEJHTUFDX0NISVBDVExfN19JRl9UWVBFX1JNSUkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQkdNQUNfQ0hJUENUTF83X0lGX1RZUEVfTUlJCQkweDAwMDAwMDQwCisjZGVmaW5lIEJHTUFDX0NISVBDVExfN19JRl9UWVBFX1JHTUlJCQkweDAwMDAwMDgwCisKICNkZWZpbmUgQkdNQUNfV0VJR0hUCTY0CiAKICNkZWZpbmUgRVRIRVJfTUFYX0xFTiAgIDE1MTgKQEAgLTM5MCw2ICs0MDUsMTAgQEAKICNkZWZpbmUgQkdNQUNfRkVBVF9OT19DTFJfTUlCCQlCSVQoMTMpCiAjZGVmaW5lIEJHTUFDX0ZFQVRfRk9SQ0VfU1BFRURfMjUwMAlCSVQoMTQpCiAjZGVmaW5lIEJHTUFDX0ZFQVRfQ01EQ0ZHX1NSX1JFVjQJQklUKDE1KQorI2RlZmluZSBCR01BQ19GRUFUX0lSUV9JRF9PT0JfNgkJQklUKDE2KQorI2RlZmluZSBCR01BQ19GRUFUX0NDNF9JRl9TV19UWVBFCUJJVCgxNykKKyNkZWZpbmUgQkdNQUNfRkVBVF9DQzRfSUZfU1dfVFlQRV9SR01JSQlCSVQoMTgpCisjZGVmaW5lIEJHTUFDX0ZFQVRfQ0M3X0lGX1RZUEVfUkdNSUkJQklUKDE5KQogCiBzdHJ1Y3QgYmdtYWNfc2xvdF9pbmZvIHsKIAl1bmlvbiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyLmMKaW5kZXggOGZjM2YzYy4uMjdmMTFhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54Mi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDIuYwpAQCAtNTAsNyArNTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KICNpbmNsdWRlIDxsaW51eC9hZXIuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX0NOSUMpIHx8IGRlZmluZWQoQ09ORklHX0NOSUNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0NOSUMpCiAjZGVmaW5lIEJDTV9DTklDIDEKICNpbmNsdWRlICJjbmljX2lmLmgiCiAjZW5kaWYKQEAgLTYzNTYsMTAgKzYzNTYsNiBAQAogCXN0cnVjdCBibngyICpicCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHJjOwogCi0JcmMgPSBibngyX3JlcXVlc3RfZmlybXdhcmUoYnApOwotCWlmIChyYyA8IDApCi0JCWdvdG8gb3V0OwotCiAJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAogCWJueDJfZGlzYWJsZV9pbnQoYnApOwpAQCAtNjQyOCw3ICs2NDI0LDYgQEAKIAlibngyX2ZyZWVfaXJxKGJwKTsKIAlibngyX2ZyZWVfbWVtKGJwKTsKIAlibngyX2RlbF9uYXBpKGJwKTsKLQlibngyX3JlbGVhc2VfZmlybXdhcmUoYnApOwogCWdvdG8gb3V0OwogfQogCkBAIC04NTc1LDYgKzg1NzAsMTIgQEAKIAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCisJcmMgPSBibngyX3JlcXVlc3RfZmlybXdhcmUoYnApOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworCWJueDJfcmVzZXRfY2hpcChicCwgQk5YMl9EUlZfTVNHX0NPREVfUkVTRVQpOwogCW1lbWNweShkZXYtPmRldl9hZGRyLCBicC0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKIAogCWRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX1NHIHwKQEAgLTg2MDcsNiArODYwOCw3IEBACiAJcmV0dXJuIDA7CiAKIGVycm9yOgorCWJueDJfcmVsZWFzZV9maXJtd2FyZShicCk7CiAJcGNpX2lvdW5tYXAocGRldiwgYnAtPnJlZ3ZpZXcpOwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfY21uLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9jbW4uaAppbmRleCAwZTY4ZmFkLi4yNDNjYjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9jbW4uaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9jbW4uaApAQCAtNDkyLDcgKzQ5Miw4IEBACiBpbnQgYm54MnhfZ2V0X3ZmX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmYsCiAJCQlzdHJ1Y3QgaWZsYV92Zl9pbmZvICppdmkpOwogaW50IGJueDJ4X3NldF92Zl9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHF1ZXVlLCB1OCAqbWFjKTsKLWludCBibngyeF9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MpOworaW50IGJueDJ4X3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcywKKwkJICAgICAgX19iZTE2IHZsYW5fcHJvdG8pOwogCiAvKiBzZWxlY3RfcXVldWUgY2FsbGJhY2sgKi8KIHUxNiBibngyeF9zZWxlY3RfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X21haW4uYwppbmRleCA5N2U4OTI1Li4yMGZlNmE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfbWFpbi5jCkBAIC03NzIsNiArNzcyLDExIEBACiAJCShicC0+Y29tbW9uLmJjX3ZlciAmIDB4ZmYwMCkgPj4gOCwKIAkJKGJwLT5jb21tb24uYmNfdmVyICYgMHhmZikpOwogCisJaWYgKHBjaV9jaGFubmVsX29mZmxpbmUoYnAtPnBkZXYpKSB7CisJCUJOWDJYX0VSUigiQ2Fubm90IGR1bXAgTUNQIGluZm8gd2hpbGUgaW4gUENJIGVycm9yXG4iKTsKKwkJcmV0dXJuOworCX0KKwogCXZhbCA9IFJFR19SRChicCwgTUNQX1JFR19NQ1BSX0NQVV9QUk9HUkFNX0NPVU5URVIpOwogCWlmICh2YWwgPT0gUkVHX1JEKGJwLCBNQ1BfUkVHX01DUFJfQ1BVX1BST0dSQU1fQ09VTlRFUikpCiAJCUJOWDJYX0VSUigiJXMiICJNQ1AgUEMgYXQgMHgleFxuIiwgbHZsLCB2YWwpOwpAQCAtOTQxNSwxMCArOTQyMCwxNiBAQAogCS8qIFJlbGVhc2UgSVJRcyAqLwogCWJueDJ4X2ZyZWVfaXJxKGJwKTsKIAotCS8qIFJlc2V0IHRoZSBjaGlwICovCi0JcmMgPSBibngyeF9yZXNldF9odyhicCwgcmVzZXRfY29kZSk7Ci0JaWYgKHJjKQotCQlCTlgyWF9FUlIoIkhXX1JFU0VUIGZhaWxlZFxuIik7CisJLyogUmVzZXQgdGhlIGNoaXAsIHVubGVzcyBQQ0kgZnVuY3Rpb24gaXMgb2ZmbGluZS4gSWYgd2UgcmVhY2ggdGhpcworCSAqIHBvaW50IGZvbGxvd2luZyBhIFBDSSBlcnJvciBoYW5kbGluZywgaXQgbWVhbnMgZGV2aWNlIGlzIHJlYWxseQorCSAqIGluIGEgYmFkIHN0YXRlIGFuZCB3ZSdyZSBhYm91dCB0byByZW1vdmUgaXQsIHNvIHJlc2V0IHRoZSBjaGlwCisJICogaXMgbm90IGEgZ29vZCBpZGVhLgorCSAqLworCWlmICghcGNpX2NoYW5uZWxfb2ZmbGluZShicC0+cGRldikpIHsKKwkJcmMgPSBibngyeF9yZXNldF9odyhicCwgcmVzZXRfY29kZSk7CisJCWlmIChyYykKKwkJCUJOWDJYX0VSUigiSFdfUkVTRVQgZmFpbGVkXG4iKTsKKwl9CiAKIAkvKiBSZXBvcnQgVU5MT0FEX0RPTkUgdG8gTUNQICovCiAJYm54Mnhfc2VuZF91bmxvYWRfZG9uZShicCwga2VlcF9saW5rKTsKQEAgLTEyNTUyLDM5ICsxMjU2Myw2MiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJueDJ4X2luaXRfbWNhc3RfbWFjc19saXN0KHN0cnVjdCBibngyeCAqYnAsCi0JCQkJICAgICAgc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgKnApCitzdHJ1Y3QgYm54MnhfbWNhc3RfbGlzdF9lbGVtX2dyb3VwCiB7Ci0JaW50IG1jX2NvdW50ID0gbmV0ZGV2X21jX2NvdW50KGJwLT5kZXYpOwotCXN0cnVjdCBibngyeF9tY2FzdF9saXN0X2VsZW0gKm1jX21hYyA9Ci0JCWtjYWxsb2MobWNfY291bnQsIHNpemVvZigqbWNfbWFjKSwgR0ZQX0FUT01JQyk7Ci0Jc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1jYXN0X2dyb3VwX2xpbms7CisJc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbSBtY2FzdF9lbGVtc1tdOworfTsKIAotCWlmICghbWNfbWFjKQotCQlyZXR1cm4gLUVOT01FTTsKKyNkZWZpbmUgTUNBU1RfRUxFTVNfUEVSX1BHIFwKKwkoKFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3QgYm54MnhfbWNhc3RfbGlzdF9lbGVtX2dyb3VwKSkgLyBcCisJc2l6ZW9mKHN0cnVjdCBibngyeF9tY2FzdF9saXN0X2VsZW0pKQogCi0JSU5JVF9MSVNUX0hFQUQoJnAtPm1jYXN0X2xpc3QpOworc3RhdGljIHZvaWQgYm54MnhfZnJlZV9tY2FzdF9tYWNzX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbWNhc3RfZ3JvdXBfbGlzdCkKK3sKKwlzdHJ1Y3QgYm54MnhfbWNhc3RfbGlzdF9lbGVtX2dyb3VwICpjdXJyZW50X21jYXN0X2dyb3VwOwogCi0JbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGJwLT5kZXYpIHsKLQkJbWNfbWFjLT5tYWMgPSBibngyeF9tY19hZGRyKGhhKTsKLQkJbGlzdF9hZGRfdGFpbCgmbWNfbWFjLT5saW5rLCAmcC0+bWNhc3RfbGlzdCk7Ci0JCW1jX21hYysrOworCXdoaWxlICghbGlzdF9lbXB0eShtY2FzdF9ncm91cF9saXN0KSkgeworCQljdXJyZW50X21jYXN0X2dyb3VwID0gbGlzdF9maXJzdF9lbnRyeShtY2FzdF9ncm91cF9saXN0LAorCQkJCSAgICAgIHN0cnVjdCBibngyeF9tY2FzdF9saXN0X2VsZW1fZ3JvdXAsCisJCQkJICAgICAgbWNhc3RfZ3JvdXBfbGluayk7CisJCWxpc3RfZGVsKCZjdXJyZW50X21jYXN0X2dyb3VwLT5tY2FzdF9ncm91cF9saW5rKTsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWN1cnJlbnRfbWNhc3RfZ3JvdXApOwogCX0KLQotCXAtPm1jYXN0X2xpc3RfbGVuID0gbWNfY291bnQ7Ci0KLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYm54MnhfZnJlZV9tY2FzdF9tYWNzX2xpc3QoCi0Jc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgKnApCitzdGF0aWMgaW50IGJueDJ4X2luaXRfbWNhc3RfbWFjc19saXN0KHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICAgc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgKnAsCisJCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbWNhc3RfZ3JvdXBfbGlzdCkKIHsKLQlzdHJ1Y3QgYm54MnhfbWNhc3RfbGlzdF9lbGVtICptY19tYWMgPQotCQlsaXN0X2ZpcnN0X2VudHJ5KCZwLT5tY2FzdF9saXN0LCBzdHJ1Y3QgYm54MnhfbWNhc3RfbGlzdF9lbGVtLAotCQkJCSBsaW5rKTsKKwlzdHJ1Y3QgYm54MnhfbWNhc3RfbGlzdF9lbGVtICptY19tYWM7CisJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKKwlzdHJ1Y3QgYm54MnhfbWNhc3RfbGlzdF9lbGVtX2dyb3VwICpjdXJyZW50X21jYXN0X2dyb3VwID0gTlVMTDsKKwlpbnQgbWNfY291bnQgPSBuZXRkZXZfbWNfY291bnQoYnAtPmRldik7CisJaW50IG9mZnNldCA9IDA7CiAKLQlXQVJOX09OKCFtY19tYWMpOwotCWtmcmVlKG1jX21hYyk7CisJSU5JVF9MSVNUX0hFQUQoJnAtPm1jYXN0X2xpc3QpOworCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBicC0+ZGV2KSB7CisJCWlmICghb2Zmc2V0KSB7CisJCQljdXJyZW50X21jYXN0X2dyb3VwID0KKwkJCQkoc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbV9ncm91cCAqKQorCQkJCV9fZ2V0X2ZyZWVfcGFnZShHRlBfQVRPTUlDKTsKKwkJCWlmICghY3VycmVudF9tY2FzdF9ncm91cCkgeworCQkJCWJueDJ4X2ZyZWVfbWNhc3RfbWFjc19saXN0KG1jYXN0X2dyb3VwX2xpc3QpOworCQkJCUJOWDJYX0VSUigiRmFpbGVkIHRvIGFsbG9jYXRlIG1jIE1BQyBsaXN0XG4iKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWxpc3RfYWRkKCZjdXJyZW50X21jYXN0X2dyb3VwLT5tY2FzdF9ncm91cF9saW5rLAorCQkJCSBtY2FzdF9ncm91cF9saXN0KTsKKwkJfQorCQltY19tYWMgPSAmY3VycmVudF9tY2FzdF9ncm91cC0+bWNhc3RfZWxlbXNbb2Zmc2V0XTsKKwkJbWNfbWFjLT5tYWMgPSBibngyeF9tY19hZGRyKGhhKTsKKwkJbGlzdF9hZGRfdGFpbCgmbWNfbWFjLT5saW5rLCAmcC0+bWNhc3RfbGlzdCk7CisJCW9mZnNldCsrOworCQlpZiAob2Zmc2V0ID09IE1DQVNUX0VMRU1TX1BFUl9QRykKKwkJCW9mZnNldCA9IDA7CisJfQorCXAtPm1jYXN0X2xpc3RfbGVuID0gbWNfY291bnQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMTI2MzIsOCArMTI2NjYsOSBAQAogCQkJCSBCTlgyWF9VQ19MSVNUX01BQywgJnJhbXJvZF9mbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgYm54Mnhfc2V0X21jX2xpc3Qoc3RydWN0IGJueDJ4ICpicCkKK3N0YXRpYyBpbnQgYm54Mnhfc2V0X21jX2xpc3RfZTF4KHN0cnVjdCBibngyeCAqYnApCiB7CisJTElTVF9IRUFEKG1jYXN0X2dyb3VwX2xpc3QpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBicC0+ZGV2OwogCXN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zIHJwYXJhbSA9IHtOVUxMfTsKIAlpbnQgcmMgPSAwOwpAQCAtMTI2NDksMTIgKzEyNjg0LDkgQEAKIAogCS8qIHRoZW4sIGNvbmZpZ3VyZSBhIG5ldyBNQUNzIGxpc3QgKi8KIAlpZiAobmV0ZGV2X21jX2NvdW50KGRldikpIHsKLQkJcmMgPSBibngyeF9pbml0X21jYXN0X21hY3NfbGlzdChicCwgJnJwYXJhbSk7Ci0JCWlmIChyYykgewotCQkJQk5YMlhfRVJSKCJGYWlsZWQgdG8gY3JlYXRlIG11bHRpY2FzdCBNQUNzIGxpc3Q6ICVkXG4iLAotCQkJCSAgcmMpOworCQlyYyA9IGJueDJ4X2luaXRfbWNhc3RfbWFjc19saXN0KGJwLCAmcnBhcmFtLCAmbWNhc3RfZ3JvdXBfbGlzdCk7CisJCWlmIChyYykKIAkJCXJldHVybiByYzsKLQkJfQogCiAJCS8qIE5vdyBhZGQgdGhlIG5ldyBNQUNzICovCiAJCXJjID0gYm54MnhfY29uZmlnX21jYXN0KGJwLCAmcnBhcmFtLApAQCAtMTI2NjMsNyArMTI2OTUsNDQgQEAKIAkJCUJOWDJYX0VSUigiRmFpbGVkIHRvIHNldCBhIG5ldyBtdWx0aWNhc3QgY29uZmlndXJhdGlvbjogJWRcbiIsCiAJCQkJICByYyk7CiAKLQkJYm54MnhfZnJlZV9tY2FzdF9tYWNzX2xpc3QoJnJwYXJhbSk7CisJCWJueDJ4X2ZyZWVfbWNhc3RfbWFjc19saXN0KCZtY2FzdF9ncm91cF9saXN0KTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYm54Mnhfc2V0X21jX2xpc3Qoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlMSVNUX0hFQUQobWNhc3RfZ3JvdXBfbGlzdCk7CisJc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgcnBhcmFtID0ge05VTEx9OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBicC0+ZGV2OworCWludCByYyA9IDA7CisKKwkvKiBPbiBvbGRlciBhZGFwdGVycywgd2UgbmVlZCB0byBmbHVzaCBhbmQgcmUtYWRkIGZpbHRlcnMgKi8KKwlpZiAoQ0hJUF9JU19FMXgoYnApKQorCQlyZXR1cm4gYm54Mnhfc2V0X21jX2xpc3RfZTF4KGJwKTsKKworCXJwYXJhbS5tY2FzdF9vYmogPSAmYnAtPm1jYXN0X29iajsKKworCWlmIChuZXRkZXZfbWNfY291bnQoZGV2KSkgeworCQlyYyA9IGJueDJ4X2luaXRfbWNhc3RfbWFjc19saXN0KGJwLCAmcnBhcmFtLCAmbWNhc3RfZ3JvdXBfbGlzdCk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQkvKiBPdmVycmlkZSB0aGUgY3VyZW50bHkgY29uZmlndXJlZCBzZXQgb2YgbWMgZmlsdGVycyAqLworCQlyYyA9IGJueDJ4X2NvbmZpZ19tY2FzdChicCwgJnJwYXJhbSwKKwkJCQkJQk5YMlhfTUNBU1RfQ01EX1NFVCk7CisJCWlmIChyYyA8IDApCisJCQlCTlgyWF9FUlIoIkZhaWxlZCB0byBzZXQgYSBuZXcgbXVsdGljYXN0IGNvbmZpZ3VyYXRpb246ICVkXG4iLAorCQkJCSAgcmMpOworCisJCWJueDJ4X2ZyZWVfbWNhc3RfbWFjc19saXN0KCZtY2FzdF9ncm91cF9saXN0KTsKKwl9IGVsc2UgeworCQkvKiBJZiBubyBtYyBhZGRyZXNzZXMgYXJlIHJlcXVpcmVkLCBmbHVzaCB0aGUgY29uZmlndXJhdGlvbiAqLworCQlyYyA9IGJueDJ4X2NvbmZpZ19tY2FzdChicCwgJnJwYXJhbSwgQk5YMlhfTUNBU1RfQ01EX0RFTCk7CisJCWlmIChyYykKKwkJCUJOWDJYX0VSUigiRmFpbGVkIHRvIGNsZWFyIG11bHRpY2FzdCBjb25maWd1cmF0aW9uICVkXG4iLAorCQkJCSAgcmMpOwogCX0KIAogCXJldHVybiByYzsKQEAgLTEzMjAzLDEzICsxMzI3MiwyMiBAQAogCQlORVRJRl9GX1JYQ1NVTSB8IE5FVElGX0ZfTFJPIHwgTkVUSUZfRl9HUk8gfAogCQlORVRJRl9GX1JYSEFTSCB8IE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYOwogCWlmICghY2hpcF9pc19lMXgpIHsKLQkJZGV2LT5od19mZWF0dXJlcyB8PSBORVRJRl9GX0dTT19HUkUgfCBORVRJRl9GX0dTT19VRFBfVFVOTkVMIHwKLQkJCQkgICAgTkVUSUZfRl9HU09fSVBYSVA0OworCQlkZXYtPmh3X2ZlYXR1cmVzIHw9IE5FVElGX0ZfR1NPX0dSRSB8IE5FVElGX0ZfR1NPX0dSRV9DU1VNIHwKKwkJCQkgICAgTkVUSUZfRl9HU09fSVBYSVA0IHwKKwkJCQkgICAgTkVUSUZfRl9HU09fVURQX1RVTk5FTCB8CisJCQkJICAgIE5FVElGX0ZfR1NPX1VEUF9UVU5ORUxfQ1NVTSB8CisJCQkJICAgIE5FVElGX0ZfR1NPX1BBUlRJQUw7CisKIAkJZGV2LT5od19lbmNfZmVhdHVyZXMgPQogCQkJTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU0gfCBORVRJRl9GX1NHIHwKIAkJCU5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU09fRUNOIHwgTkVUSUZfRl9UU082IHwKIAkJCU5FVElGX0ZfR1NPX0lQWElQNCB8Ci0JCQlORVRJRl9GX0dTT19HUkUgfCBORVRJRl9GX0dTT19VRFBfVFVOTkVMOworCQkJTkVUSUZfRl9HU09fR1JFIHwgTkVUSUZfRl9HU09fR1JFX0NTVU0gfAorCQkJTkVUSUZfRl9HU09fVURQX1RVTk5FTCB8IE5FVElGX0ZfR1NPX1VEUF9UVU5ORUxfQ1NVTSB8CisJCQlORVRJRl9GX0dTT19QQVJUSUFMOworCisJCWRldi0+Z3NvX3BhcnRpYWxfZmVhdHVyZXMgPSBORVRJRl9GX0dTT19HUkVfQ1NVTSB8CisJCQkJCSAgICBORVRJRl9GX0dTT19VRFBfVFVOTkVMX0NTVU07CiAJfQogCiAJZGV2LT52bGFuX2ZlYXR1cmVzID0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfSVBWNl9DU1VNIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcC5jCmluZGV4IGZmNzAyYTcuLmNlYTZiZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3AuYwpAQCAtMjYwMCw4ICsyNjAwLDI5IEBACiAJdTggcGFkWzJdOyAvKiBGb3IgYSBuYXR1cmFsIGFsaWdubWVudCBvZiB0aGUgZm9sbG93aW5nIGJ1ZmZlciAqLwogfTsKIAorc3RydWN0IGJueDJ4X21jYXN0X2Jpbl9lbGVtIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CisJaW50IGJpbjsKKwlpbnQgdHlwZTsgLyogQk5YMlhfTUNBU1RfQ01EX1NFVF97QURELCBERUx9ICovCit9OworCit1bmlvbiBibngyeF9tY2FzdF9lbGVtIHsKKwlzdHJ1Y3QgYm54MnhfbWNhc3RfYmluX2VsZW0gYmluX2VsZW07CisJc3RydWN0IGJueDJ4X21jYXN0X21hY19lbGVtIG1hY19lbGVtOworfTsKKworc3RydWN0IGJueDJ4X21jYXN0X2VsZW1fZ3JvdXAgeworCXN0cnVjdCBsaXN0X2hlYWQgbWNhc3RfZ3JvdXBfbGluazsKKwl1bmlvbiBibngyeF9tY2FzdF9lbGVtIG1jYXN0X2VsZW1zW107Cit9OworCisjZGVmaW5lIE1DQVNUX01BQ19FTEVNU19QRVJfUEcgXAorCSgoUEFHRV9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBibngyeF9tY2FzdF9lbGVtX2dyb3VwKSkgLyBcCisJc2l6ZW9mKHVuaW9uIGJueDJ4X21jYXN0X2VsZW0pKQorCiBzdHJ1Y3QgYm54MnhfcGVuZGluZ19tY2FzdF9jbWQgewogCXN0cnVjdCBsaXN0X2hlYWQgbGluazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGdyb3VwX2hlYWQ7CiAJaW50IHR5cGU7IC8qIEJOWDJYX01DQVNUX0NNRF9YICovCiAJdW5pb24gewogCQlzdHJ1Y3QgbGlzdF9oZWFkIG1hY3NfaGVhZDsKQEAgLTI2MDksNiArMjYzMCwxMSBAQAogCQlpbnQgbmV4dF9iaW47IC8qIE5lZWRlZCBmb3IgUkVTVE9SRSBmbG93IHdpdGggYXByb3ggbWF0Y2ggKi8KIAl9IGRhdGE7CiAKKwlib29sIHNldF9jb252ZXJ0OyAvKiBpbiBjYXNlIHR5cGUgPT0gQk5YMlhfTUNBU1RfQ01EX1NFVCwgdGhpcyBpcyBzZXQKKwkJCSAgICogd2hlbiBtYWNzX2hlYWQgaGFkIGJlZW4gY29udmVydGVkIHRvIGEgbGlzdCBvZgorCQkJICAgKiBibngyeF9tY2FzdF9iaW5fZWxlbS4KKwkJCSAgICovCisKIAlib29sIGRvbmU7IC8qIHNldCB0byB0cnVlLCB3aGVuIHRoZSBjb21tYW5kIGhhcyBiZWVuIGhhbmRsZWQsCiAJCSAgICAqIHByYWN0aWNhbGx5IHVzZWQgaW4gNTc3MTIgaGFuZGxpbmcgb25seSwgd2hlcmUgb25lIHBlbmRpbmcKIAkJICAgICogY29tbWFuZCBtYXkgYmUgaGFuZGxlZCBpbiBhIGZldyBvcGVyYXRpb25zLiBBcyBsb25nIGFzIGZvcgpAQCAtMjYyNyw1MyArMjY1Myw5MyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBibngyeF9mcmVlX2dyb3VwcyhzdHJ1Y3QgbGlzdF9oZWFkICptY2FzdF9ncm91cF9saXN0KQoreworCXN0cnVjdCBibngyeF9tY2FzdF9lbGVtX2dyb3VwICpjdXJyZW50X21jYXN0X2dyb3VwOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KG1jYXN0X2dyb3VwX2xpc3QpKSB7CisJCWN1cnJlbnRfbWNhc3RfZ3JvdXAgPSBsaXN0X2ZpcnN0X2VudHJ5KG1jYXN0X2dyb3VwX2xpc3QsCisJCQkJICAgICAgc3RydWN0IGJueDJ4X21jYXN0X2VsZW1fZ3JvdXAsCisJCQkJICAgICAgbWNhc3RfZ3JvdXBfbGluayk7CisJCWxpc3RfZGVsKCZjdXJyZW50X21jYXN0X2dyb3VwLT5tY2FzdF9ncm91cF9saW5rKTsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWN1cnJlbnRfbWNhc3RfZ3JvdXApOworCX0KK30KKwogc3RhdGljIGludCBibngyeF9tY2FzdF9lbnF1ZXVlX2NtZChzdHJ1Y3QgYm54MnggKmJwLAogCQkJCSAgIHN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8sCiAJCQkJICAgc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgKnAsCiAJCQkJICAgZW51bSBibngyeF9tY2FzdF9jbWQgY21kKQogewotCWludCB0b3RhbF9zejsKIAlzdHJ1Y3QgYm54MnhfcGVuZGluZ19tY2FzdF9jbWQgKm5ld19jbWQ7Ci0Jc3RydWN0IGJueDJ4X21jYXN0X21hY19lbGVtICpjdXJfbWFjID0gTlVMTDsKIAlzdHJ1Y3QgYm54MnhfbWNhc3RfbGlzdF9lbGVtICpwb3M7Ci0JaW50IG1hY3NfbGlzdF9sZW4gPSAoKGNtZCA9PSBCTlgyWF9NQ0FTVF9DTURfQUREKSA/Ci0JCQkgICAgIHAtPm1jYXN0X2xpc3RfbGVuIDogMCk7CisJc3RydWN0IGJueDJ4X21jYXN0X2VsZW1fZ3JvdXAgKmVsZW1fZ3JvdXA7CisJc3RydWN0IGJueDJ4X21jYXN0X21hY19lbGVtICptYWNfZWxlbTsKKwlpbnQgdG90YWxfZWxlbXMgPSAwLCBtYWNzX2xpc3RfbGVuID0gMCwgb2Zmc2V0ID0gMDsKKworCS8qIFdoZW4gYWRkaW5nIE1BQ3Mgd2UnbGwgbmVlZCB0byBzdG9yZSB0aGVpciB2YWx1ZXMgKi8KKwlpZiAoY21kID09IEJOWDJYX01DQVNUX0NNRF9BREQgfHwgY21kID09IEJOWDJYX01DQVNUX0NNRF9TRVQpCisJCW1hY3NfbGlzdF9sZW4gPSBwLT5tY2FzdF9saXN0X2xlbjsKIAogCS8qIElmIHRoZSBjb21tYW5kIGlzIGVtcHR5ICgiaGFuZGxlIHBlbmRpbmcgY29tbWFuZHMgb25seSIpLCBicmVhayAqLwogCWlmICghcC0+bWNhc3RfbGlzdF9sZW4pCiAJCXJldHVybiAwOwogCi0JdG90YWxfc3ogPSBzaXplb2YoKm5ld19jbWQpICsKLQkJbWFjc19saXN0X2xlbiAqIHNpemVvZihzdHJ1Y3QgYm54MnhfbWNhc3RfbWFjX2VsZW0pOwotCiAJLyogQWRkIG1jYXN0IGlzIGNhbGxlZCB1bmRlciBzcGluX2xvY2ssIHRodXMgY2FsbGluZyB3aXRoIEdGUF9BVE9NSUMgKi8KLQluZXdfY21kID0ga3phbGxvYyh0b3RhbF9zeiwgR0ZQX0FUT01JQyk7Ci0KKwluZXdfY21kID0ga3phbGxvYyhzaXplb2YoKm5ld19jbWQpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIW5ld19jbWQpCiAJCXJldHVybiAtRU5PTUVNOwogCisJSU5JVF9MSVNUX0hFQUQoJm5ld19jbWQtPmRhdGEubWFjc19oZWFkKTsKKwlJTklUX0xJU1RfSEVBRCgmbmV3X2NtZC0+Z3JvdXBfaGVhZCk7CisJbmV3X2NtZC0+dHlwZSA9IGNtZDsKKwluZXdfY21kLT5kb25lID0gZmFsc2U7CisKIAlEUChCTlgyWF9NU0dfU1AsICJBYm91dCB0byBlbnF1ZXVlIGEgbmV3ICVkIGNvbW1hbmQuIG1hY3NfbGlzdF9sZW49JWRcbiIsCiAJICAgY21kLCBtYWNzX2xpc3RfbGVuKTsKIAotCUlOSVRfTElTVF9IRUFEKCZuZXdfY21kLT5kYXRhLm1hY3NfaGVhZCk7Ci0KLQluZXdfY21kLT50eXBlID0gY21kOwotCW5ld19jbWQtPmRvbmUgPSBmYWxzZTsKLQogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBCTlgyWF9NQ0FTVF9DTURfQUREOgotCQljdXJfbWFjID0gKHN0cnVjdCBibngyeF9tY2FzdF9tYWNfZWxlbSAqKQotCQkJICAoKHU4ICopbmV3X2NtZCArIHNpemVvZigqbmV3X2NtZCkpOwotCi0JCS8qIFB1c2ggdGhlIE1BQ3Mgb2YgdGhlIGN1cnJlbnQgY29tbWFuZCBpbnRvIHRoZSBwZW5kaW5nIGNvbW1hbmQKLQkJICogTUFDcyBsaXN0OiBGSUZPCisJY2FzZSBCTlgyWF9NQ0FTVF9DTURfU0VUOgorCQkvKiBGb3IgYSBzZXQgY29tbWFuZCwgd2UgbmVlZCB0byBhbGxvY2F0ZSBzdWZmaWNpZW50IG1lbW9yeSBmb3IKKwkJICogYWxsIHRoZSBiaW5zLCBzaW5jZSB3ZSBjYW4ndCBhbmFseXplIGF0IHRoaXMgcG9pbnQgaG93IG11Y2gKKwkJICogbWVtb3J5IHdvdWxkIGJlIHJlcXVpcmVkLgogCQkgKi8KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZwLT5tY2FzdF9saXN0LCBsaW5rKSB7Ci0JCQltZW1jcHkoY3VyX21hYy0+bWFjLCBwb3MtPm1hYywgRVRIX0FMRU4pOwotCQkJbGlzdF9hZGRfdGFpbCgmY3VyX21hYy0+bGluaywgJm5ld19jbWQtPmRhdGEubWFjc19oZWFkKTsKLQkJCWN1cl9tYWMrKzsKKwkJdG90YWxfZWxlbXMgPSBtYWNzX2xpc3RfbGVuOworCQlpZiAoY21kID09IEJOWDJYX01DQVNUX0NNRF9TRVQpIHsKKwkJCWlmICh0b3RhbF9lbGVtcyA8IEJOWDJYX01DQVNUX0JJTlNfTlVNKQorCQkJCXRvdGFsX2VsZW1zID0gQk5YMlhfTUNBU1RfQklOU19OVU07CiAJCX0KLQorCQl3aGlsZSAodG90YWxfZWxlbXMgPiAwKSB7CisJCQllbGVtX2dyb3VwID0gKHN0cnVjdCBibngyeF9tY2FzdF9lbGVtX2dyb3VwICopCisJCQkJICAgICBfX2dldF9mcmVlX3BhZ2UoR0ZQX0FUT01JQyB8IF9fR0ZQX1pFUk8pOworCQkJaWYgKCFlbGVtX2dyb3VwKSB7CisJCQkJYm54MnhfZnJlZV9ncm91cHMoJm5ld19jbWQtPmdyb3VwX2hlYWQpOworCQkJCWtmcmVlKG5ld19jbWQpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJdG90YWxfZWxlbXMgLT0gTUNBU1RfTUFDX0VMRU1TX1BFUl9QRzsKKwkJCWxpc3RfYWRkX3RhaWwoJmVsZW1fZ3JvdXAtPm1jYXN0X2dyb3VwX2xpbmssCisJCQkJICAgICAgJm5ld19jbWQtPmdyb3VwX2hlYWQpOworCQl9CisJCWVsZW1fZ3JvdXAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZuZXdfY21kLT5ncm91cF9oZWFkLAorCQkJCQkgICAgICBzdHJ1Y3QgYm54MnhfbWNhc3RfZWxlbV9ncm91cCwKKwkJCQkJICAgICAgbWNhc3RfZ3JvdXBfbGluayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmcC0+bWNhc3RfbGlzdCwgbGluaykgeworCQkJbWFjX2VsZW0gPSAmZWxlbV9ncm91cC0+bWNhc3RfZWxlbXNbb2Zmc2V0XS5tYWNfZWxlbTsKKwkJCW1lbWNweShtYWNfZWxlbS0+bWFjLCBwb3MtPm1hYywgRVRIX0FMRU4pOworCQkJLyogUHVzaCB0aGUgTUFDcyBvZiB0aGUgY3VycmVudCBjb21tYW5kIGludG8gdGhlIHBlbmRpbmcKKwkJCSAqIGNvbW1hbmQgTUFDcyBsaXN0OiBGSUZPCisJCQkgKi8KKwkJCWxpc3RfYWRkX3RhaWwoJm1hY19lbGVtLT5saW5rLAorCQkJCSAgICAgICZuZXdfY21kLT5kYXRhLm1hY3NfaGVhZCk7CisJCQlvZmZzZXQrKzsKKwkJCWlmIChvZmZzZXQgPT0gTUNBU1RfTUFDX0VMRU1TX1BFUl9QRykgeworCQkJCW9mZnNldCA9IDA7CisJCQkJZWxlbV9ncm91cCA9IGxpc3RfbmV4dF9lbnRyeShlbGVtX2dyb3VwLAorCQkJCQkJCSAgICAgbWNhc3RfZ3JvdXBfbGluayk7CisJCQl9CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEJOWDJYX01DQVNUX0NNRF9ERUw6CkBAIC0yNzcxLDcgKzI4MzcsOCBAQAogCXU4IHJ4X3R4X2FkZF9mbGFnID0gYm54MnhfbWNhc3RfZ2V0X3J4X3R4X2ZsYWcobyk7CiAJaW50IGJpbjsKIAotCWlmICgoY21kID09IEJOWDJYX01DQVNUX0NNRF9BREQpIHx8IChjbWQgPT0gQk5YMlhfTUNBU1RfQ01EX1JFU1RPUkUpKQorCWlmICgoY21kID09IEJOWDJYX01DQVNUX0NNRF9BREQpIHx8IChjbWQgPT0gQk5YMlhfTUNBU1RfQ01EX1JFU1RPUkUpIHx8CisJICAgIChjbWQgPT0gQk5YMlhfTUNBU1RfQ01EX1NFVF9BREQpKQogCQlyeF90eF9hZGRfZmxhZyB8PSBFVEhfTVVMVElDQVNUX1JVTEVTX0NNRF9JU19BREQ7CiAKIAlkYXRhLT5ydWxlc1tpZHhdLmNtZF9nZW5lcmFsX2RhdGEgfD0gcnhfdHhfYWRkX2ZsYWc7CkBAIC0yNzk3LDYgKzI4NjQsMTYgQEAKIAkJYmluID0gY2ZnX2RhdGEtPmJpbjsKIAkJYnJlYWs7CiAKKwljYXNlIEJOWDJYX01DQVNUX0NNRF9TRVRfQUREOgorCQliaW4gPSBjZmdfZGF0YS0+YmluOworCQlCSVRfVkVDNjRfU0VUX0JJVChvLT5yZWdpc3RyeS5hcHJveF9tYXRjaC52ZWMsIGJpbik7CisJCWJyZWFrOworCisJY2FzZSBCTlgyWF9NQ0FTVF9DTURfU0VUX0RFTDoKKwkJYmluID0gY2ZnX2RhdGEtPmJpbjsKKwkJQklUX1ZFQzY0X0NMRUFSX0JJVChvLT5yZWdpc3RyeS5hcHJveF9tYXRjaC52ZWMsIGJpbik7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJQk5YMlhfRVJSKCJVbmtub3duIGNvbW1hbmQ6ICVkXG4iLCBjbWQpOwogCQlyZXR1cm47CkBAIC0yOTMyLDYgKzMwMDksMTEwIEBACiAJCWNtZF9wb3MtPmRhdGEubmV4dF9iaW4rKzsKIH0KIAorc3RhdGljIHZvaWQKK2JueDJ4X21jYXN0X2hkbF9wZW5kaW5nX3NldF9lMl9jb252ZXJ0KHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICAgIHN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8sCisJCQkJICAgICAgIHN0cnVjdCBibngyeF9wZW5kaW5nX21jYXN0X2NtZCAqY21kX3BvcykKK3sKKwl1NjQgY3VyW0JOWDJYX01DQVNUX1ZFQ19TWl0sIHJlcVtCTlgyWF9NQ0FTVF9WRUNfU1pdOworCXN0cnVjdCBibngyeF9tY2FzdF9tYWNfZWxlbSAqcG1hY19wb3MsICpwbWFjX3Bvc19uOworCXN0cnVjdCBibngyeF9tY2FzdF9iaW5fZWxlbSAqcF9pdGVtOworCXN0cnVjdCBibngyeF9tY2FzdF9lbGVtX2dyb3VwICplbGVtX2dyb3VwOworCWludCBjbnQgPSAwLCBtYWNfY250ID0gMCwgb2Zmc2V0ID0gMCwgaTsKKworCW1lbXNldChyZXEsIDAsIHNpemVvZih1NjQpICogQk5YMlhfTUNBU1RfVkVDX1NaKTsKKwltZW1jcHkoY3VyLCBvLT5yZWdpc3RyeS5hcHJveF9tYXRjaC52ZWMsCisJICAgICAgIHNpemVvZih1NjQpICogQk5YMlhfTUNBU1RfVkVDX1NaKTsKKworCS8qIEZpbGwgYGN1cnJlbnQnIHdpdGggdGhlIHJlcXVpcmVkIHNldCBvZiBiaW5zIHRvIGNvbmZpZ3VyZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwbWFjX3BvcywgcG1hY19wb3NfbiwgJmNtZF9wb3MtPmRhdGEubWFjc19oZWFkLAorCQkJCSBsaW5rKSB7CisJCWludCBiaW4gPSBibngyeF9tY2FzdF9iaW5fZnJvbV9tYWMocG1hY19wb3MtPm1hYyk7CisKKwkJRFAoQk5YMlhfTVNHX1NQLCAiU2V0IGNvbnRhaW5zICVwTSBtY2FzdCBNQUNcbiIsCisJCSAgIHBtYWNfcG9zLT5tYWMpOworCisJCUJJVF9WRUM2NF9TRVRfQklUKHJlcSwgYmluKTsKKwkJbGlzdF9kZWwoJnBtYWNfcG9zLT5saW5rKTsKKwkJbWFjX2NudCsrOworCX0KKworCS8qIFdlIG5vIGxvbmdlciBoYXZlIHVzZSBmb3IgdGhlIE1BQ3M7IE5lZWQgdG8gcmUtdXNlIG1lbW9yeSBmb3IKKwkgKiBhIGxpc3QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY29uZmlndXJlIGJpbnMuCisJICovCisJY21kX3Bvcy0+c2V0X2NvbnZlcnQgPSB0cnVlOworCUlOSVRfTElTVF9IRUFEKCZjbWRfcG9zLT5kYXRhLm1hY3NfaGVhZCk7CisJZWxlbV9ncm91cCA9IGxpc3RfZmlyc3RfZW50cnkoJmNtZF9wb3MtPmdyb3VwX2hlYWQsCisJCQkJICAgICAgc3RydWN0IGJueDJ4X21jYXN0X2VsZW1fZ3JvdXAsCisJCQkJICAgICAgbWNhc3RfZ3JvdXBfbGluayk7CisJZm9yIChpID0gMDsgaSA8IEJOWDJYX01DQVNUX0JJTlNfTlVNOyBpKyspIHsKKwkJYm9vbCBiX2N1cnJlbnQgPSAhIUJJVF9WRUM2NF9URVNUX0JJVChjdXIsIGkpOworCQlib29sIGJfcmVxdWlyZWQgPSAhIUJJVF9WRUM2NF9URVNUX0JJVChyZXEsIGkpOworCisJCWlmIChiX2N1cnJlbnQgPT0gYl9yZXF1aXJlZCkKKwkJCWNvbnRpbnVlOworCisJCXBfaXRlbSA9ICZlbGVtX2dyb3VwLT5tY2FzdF9lbGVtc1tvZmZzZXRdLmJpbl9lbGVtOworCQlwX2l0ZW0tPmJpbiA9IGk7CisJCXBfaXRlbS0+dHlwZSA9IGJfcmVxdWlyZWQgPyBCTlgyWF9NQ0FTVF9DTURfU0VUX0FERAorCQkJCQkgIDogQk5YMlhfTUNBU1RfQ01EX1NFVF9ERUw7CisJCWxpc3RfYWRkX3RhaWwoJnBfaXRlbS0+bGluayAsICZjbWRfcG9zLT5kYXRhLm1hY3NfaGVhZCk7CisJCWNudCsrOworCQlvZmZzZXQrKzsKKwkJaWYgKG9mZnNldCA9PSBNQ0FTVF9NQUNfRUxFTVNfUEVSX1BHKSB7CisJCQlvZmZzZXQgPSAwOworCQkJZWxlbV9ncm91cCA9IGxpc3RfbmV4dF9lbnRyeShlbGVtX2dyb3VwLAorCQkJCQkJICAgICBtY2FzdF9ncm91cF9saW5rKTsKKwkJfQorCX0KKworCS8qIFdlIG5vdyBkZWZpbml0ZWx5IGtub3cgaG93IG1hbnkgY29tbWFuZHMgYXJlIGhpZGluZyBoZXJlLgorCSAqIEFsc28gbmVlZCB0byBjb3JyZWN0IHRoZSBkaXNydXB0aW9uIHdlJ3ZlIGFkZGVkIHRvIGd1YXJhbnRlZSB0aGlzCisJICogd291bGQgYmUgZW5xdWV1ZWQuCisJICovCisJby0+dG90YWxfcGVuZGluZ19udW0gLT0gKG8tPm1heF9jbWRfbGVuICsgbWFjX2NudCk7CisJby0+dG90YWxfcGVuZGluZ19udW0gKz0gY250OworCisJRFAoQk5YMlhfTVNHX1NQLCAiby0+dG90YWxfcGVuZGluZ19udW09JWRcbiIsIG8tPnRvdGFsX3BlbmRpbmdfbnVtKTsKK30KKworc3RhdGljIHZvaWQKK2JueDJ4X21jYXN0X2hkbF9wZW5kaW5nX3NldF9lMihzdHJ1Y3QgYm54MnggKmJwLAorCQkJICAgICAgIHN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8sCisJCQkgICAgICAgc3RydWN0IGJueDJ4X3BlbmRpbmdfbWNhc3RfY21kICpjbWRfcG9zLAorCQkJICAgICAgIGludCAqY250KQoreworCXVuaW9uIGJueDJ4X21jYXN0X2NvbmZpZ19kYXRhIGNmZ19kYXRhID0ge05VTEx9OworCXN0cnVjdCBibngyeF9tY2FzdF9iaW5fZWxlbSAqcF9pdGVtLCAqcF9pdGVtX247CisKKwkvKiBUaGlzIGlzIGFjdHVhbGx5IGEgMi1wYXJ0IHNjaGVtZSAtIGl0IHN0YXJ0cyBieSBjb252ZXJ0aW5nIHRoZSBNQUNzCisJICogaW50byBhIGxpc3Qgb2YgYmlucyB0byBiZSBhZGRlZC9yZW1vdmVkLCBhbmQgY29ycmVjdGluZyB0aGUgbnVtYmVycworCSAqIG9uIHRoZSBvYmplY3QuIHRoaXMgaXMgbm93IGFsbG93ZWQsIGFzIHdlJ3JlIG5vdyBzdXJlIHRoYXQgYWxsCisJICogcHJldmlvdXMgY29uZmlndXJlZCByZXF1ZXN0cyBoYXZlIGFscmVhZHkgYXBwbGllZC4KKwkgKiBUaGUgc2Vjb25kIHBhcnQgaXMgYWN0dWFsbHkgYWRkaW5nIHJ1bGVzIGZvciB0aGUgbmV3bHkgaW50cm9kdWNlZAorCSAqIGVudHJpZXMgW2xpa2UgYWxsIHRoZSByZXN0IG9mIHRoZSBoZGxfcGVuZGluZyBmdW5jdGlvbnNdLgorCSAqLworCWlmICghY21kX3Bvcy0+c2V0X2NvbnZlcnQpCisJCWJueDJ4X21jYXN0X2hkbF9wZW5kaW5nX3NldF9lMl9jb252ZXJ0KGJwLCBvLCBjbWRfcG9zKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwX2l0ZW0sIHBfaXRlbV9uLCAmY21kX3Bvcy0+ZGF0YS5tYWNzX2hlYWQsCisJCQkJIGxpbmspIHsKKwkJY2ZnX2RhdGEuYmluID0gKHU4KXBfaXRlbS0+YmluOworCQlvLT5zZXRfb25lX3J1bGUoYnAsIG8sICpjbnQsICZjZmdfZGF0YSwgcF9pdGVtLT50eXBlKTsKKwkJKCpjbnQpKys7CisKKwkJbGlzdF9kZWwoJnBfaXRlbS0+bGluayk7CisKKwkJLyogQnJlYWsgaWYgd2UgcmVhY2hlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcnVsZXMuICovCisJCWlmICgqY250ID49IG8tPm1heF9jbWRfbGVuKQorCQkJYnJlYWs7CisJfQorCisJLyogaWYgbm8gbW9yZSBNQUNzIHRvIGNvbmZpZ3VyZSAtIHdlIGFyZSBkb25lICovCisJaWYgKGxpc3RfZW1wdHkoJmNtZF9wb3MtPmRhdGEubWFjc19oZWFkKSkKKwkJY21kX3Bvcy0+ZG9uZSA9IHRydWU7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGJueDJ4X21jYXN0X2hhbmRsZV9wZW5kaW5nX2NtZHNfZTIoc3RydWN0IGJueDJ4ICpicCwKIAkJCQlzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyAqcCkKIHsKQEAgLTI5NTUsNiArMzEzNiwxMCBAQAogCQkJCQkJCSAgICZjbnQpOwogCQkJYnJlYWs7CiAKKwkJY2FzZSBCTlgyWF9NQ0FTVF9DTURfU0VUOgorCQkJYm54MnhfbWNhc3RfaGRsX3BlbmRpbmdfc2V0X2UyKGJwLCBvLCBjbWRfcG9zLCAmY250KTsKKwkJCWJyZWFrOworCiAJCWRlZmF1bHQ6CiAJCQlCTlgyWF9FUlIoIlVua25vd24gY29tbWFuZDogJWRcbiIsIGNtZF9wb3MtPnR5cGUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yOTY1LDYgKzMxNTAsNyBAQAogCQkgKi8KIAkJaWYgKGNtZF9wb3MtPmRvbmUpIHsKIAkJCWxpc3RfZGVsKCZjbWRfcG9zLT5saW5rKTsKKwkJCWJueDJ4X2ZyZWVfZ3JvdXBzKCZjbWRfcG9zLT5ncm91cF9oZWFkKTsKIAkJCWtmcmVlKGNtZF9wb3MpOwogCQl9CiAKQEAgLTMwOTUsNiArMzI4MSwxOSBAQAogCQlvLT5zZXRfcmVnaXN0cnlfc2l6ZShvLCByZWdfc3ogKyBwLT5tY2FzdF9saXN0X2xlbik7CiAJCWJyZWFrOwogCisJY2FzZSBCTlgyWF9NQ0FTVF9DTURfU0VUOgorCQkvKiBXZSBjYW4gb25seSBsZWFybiBob3cgbWFueSBjb21tYW5kcyB3b3VsZCBhY3R1YWxseSBiZSB1c2VkCisJCSAqIHdoZW4gdGhpcyBpcyBiZWluZyBjb25maWd1cmVkLiBTbyBmb3Igbm93LCBzaW1wbHkgZ3VhcmFudGVlCisJCSAqIHRoZSBjb21tYW5kIHdpbGwgYmUgZW5xdWV1ZWQgW3RvIHJlZnJhaW4gZnJvbSBhZGRpbmcgbG9naWMKKwkJICogdGhhdCBoYW5kbGVzIHRoaXMgYW5kIFRIRU4gbGVhcm5zIGl0IG5lZWRzIHNldmVyYWwgcmFtcm9kc10uCisJCSAqIEp1c3QgbGlrZSBmb3IgQUREL0NvbnQsIHRoZSBtY2FzdF9saXN0X2xlbiBtaWdodCBiZSBhbiBvdmVyCisJCSAqIGVzdGltYXRpb247IG9yIGV2ZW4gbW9yZSBzbywgc2luY2Ugd2UgZG9uJ3QgdGFrZSBpbnRvCisJCSAqIGFjY291bnQgdGhlIHBvc3NpYmlsaXR5IG9mIHJlbW92YWwgb2YgZXhpc3RpbmcgYmlucy4KKwkJICovCisJCW8tPnNldF9yZWdpc3RyeV9zaXplKG8sIHJlZ19zeiArIHAtPm1jYXN0X2xpc3RfbGVuKTsKKwkJby0+dG90YWxfcGVuZGluZ19udW0gKz0gby0+bWF4X2NtZF9sZW47CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJQk5YMlhfRVJSKCJVbmtub3duIGNvbW1hbmQ6ICVkXG4iLCBjbWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMxMDgsMTIgKzMzMDcsMTYgQEAKIAogc3RhdGljIHZvaWQgYm54MnhfbWNhc3RfcmV2ZXJ0X2UyKHN0cnVjdCBibngyeCAqYnAsCiAJCQkJICAgICAgc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgKnAsCi0JCQkJICAgICAgaW50IG9sZF9udW1fYmlucykKKwkJCQkgIGludCBvbGRfbnVtX2JpbnMsCisJCQkJICBlbnVtIGJueDJ4X21jYXN0X2NtZCBjbWQpCiB7CiAJc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbyA9IHAtPm1jYXN0X29iajsKIAogCW8tPnNldF9yZWdpc3RyeV9zaXplKG8sIG9sZF9udW1fYmlucyk7CiAJby0+dG90YWxfcGVuZGluZ19udW0gLT0gcC0+bWNhc3RfbGlzdF9sZW47CisKKwlpZiAoY21kID09IEJOWDJYX01DQVNUX0NNRF9TRVQpCisJCW8tPnRvdGFsX3BlbmRpbmdfbnVtIC09IG8tPm1heF9jbWRfbGVuOwogfQogCiAvKioKQEAgLTMyMjMsOSArMzQyNiwxMSBAQAogCQlibngyeF9tY2FzdF9yZWZyZXNoX3JlZ2lzdHJ5X2UyKGJwLCBvKTsKIAogCS8qIElmIENMRUFSX09OTFkgd2FzIHJlcXVlc3RlZCAtIGRvbid0IHNlbmQgYSByYW1yb2QgYW5kIGNsZWFyCi0JICogUkFNUk9EX1BFTkRJTkcgc3RhdHVzIGltbWVkaWF0ZWx5LgorCSAqIFJBTVJPRF9QRU5ESU5HIHN0YXR1cyBpbW1lZGlhdGVseS4gZHVlIHRvIHRoZSBTRVQgb3B0aW9uLCBpdCdzIGFsc28KKwkgKiBwb3NzaWJsZSB0aGF0IGFmdGVyIGV2YWx1YXRpbmcgdGhlIGRpZmZlcmVuY2VzIHRoZXJlJ3Mgbm8gbmVlZCBmb3IKKwkgKiBhIHJhbXJvZC4gSW4gdGhhdCBjYXNlLCB3ZSBjYW4gc2tpcCBpdCBhcyB3ZWxsLgogCSAqLwotCWlmICh0ZXN0X2JpdChSQU1ST0RfRFJWX0NMUl9PTkxZLCAmcC0+cmFtcm9kX2ZsYWdzKSkgeworCWlmICh0ZXN0X2JpdChSQU1ST0RfRFJWX0NMUl9PTkxZLCAmcC0+cmFtcm9kX2ZsYWdzKSB8fCAhY250KSB7CiAJCXJhdy0+Y2xlYXJfcGVuZGluZyhyYXcpOwogCQlyZXR1cm4gMDsKIAl9IGVsc2UgewpAQCAtMzI1Myw2ICszNDU4LDExIEBACiAJCQkJICAgIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAogCQkJCSAgICBlbnVtIGJueDJ4X21jYXN0X2NtZCBjbWQpCiB7CisJaWYgKGNtZCA9PSBCTlgyWF9NQ0FTVF9DTURfU0VUKSB7CisJCUJOWDJYX0VSUigiQ2FuJ3QgdXNlIGBzZXQnIGNvbW1hbmQgb24gZTFoIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCS8qIE1hcmssIHRoYXQgdGhlcmUgaXMgYSB3b3JrIHRvIGRvICovCiAJaWYgKChjbWQgPT0gQk5YMlhfTUNBU1RfQ01EX0RFTCkgfHwgKGNtZCA9PSBCTlgyWF9NQ0FTVF9DTURfUkVTVE9SRSkpCiAJCXAtPm1jYXN0X2xpc3RfbGVuID0gMTsKQEAgLTMyNjIsNyArMzQ3Miw4IEBACiAKIHN0YXRpYyB2b2lkIGJueDJ4X21jYXN0X3JldmVydF9lMWgoc3RydWN0IGJueDJ4ICpicCwKIAkJCQkgICAgICAgc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgKnAsCi0JCQkJICAgICAgIGludCBvbGRfbnVtX2JpbnMpCisJCQkJICAgICAgIGludCBvbGRfbnVtX2JpbnMsCisJCQkJICAgICAgIGVudW0gYm54MnhfbWNhc3RfY21kIGNtZCkKIHsKIAkvKiBEbyBub3RoaW5nICovCiB9CkBAIC0zMzcyLDYgKzM1ODMsMTEgQEAKIAlzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvID0gcC0+bWNhc3Rfb2JqOwogCWludCByZWdfc3ogPSBvLT5nZXRfcmVnaXN0cnlfc2l6ZShvKTsKIAorCWlmIChjbWQgPT0gQk5YMlhfTUNBU1RfQ01EX1NFVCkgeworCQlCTlgyWF9FUlIoIkNhbid0IHVzZSBgc2V0JyBjb21tYW5kIG9uIGUxIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXN3aXRjaCAoY21kKSB7CiAJLyogREVMIGNvbW1hbmQgZGVsZXRlcyBhbGwgY3VycmVudGx5IGNvbmZpZ3VyZWQgTUFDcyAqLwogCWNhc2UgQk5YMlhfTUNBU1RfQ01EX0RFTDoKQEAgLTM0MjIsNyArMzYzOCw4IEBACiAKIHN0YXRpYyB2b2lkIGJueDJ4X21jYXN0X3JldmVydF9lMShzdHJ1Y3QgYm54MnggKmJwLAogCQkJCSAgICAgIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAotCQkJCSAgICAgIGludCBvbGRfbnVtX21hY3MpCisJCQkJICAgaW50IG9sZF9udW1fbWFjcywKKwkJCQkgICBlbnVtIGJueDJ4X21jYXN0X2NtZCBjbWQpCiB7CiAJc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbyA9IHAtPm1jYXN0X29iajsKIApAQCAtMzU3Miw2ICszNzg5LDcgQEAKIAl9CiAKIAlsaXN0X2RlbCgmY21kX3Bvcy0+bGluayk7CisJYm54MnhfZnJlZV9ncm91cHMoJmNtZF9wb3MtPmdyb3VwX2hlYWQpOwogCWtmcmVlKGNtZF9wb3MpOwogCiAJcmV0dXJuIGNudDsKQEAgLTM4MTYsNyArNDAzNCw3IEBACiAJci0+Y2xlYXJfcGVuZGluZyhyKTsKIAogZXJyb3JfZXhpdDE6Ci0Jby0+cmV2ZXJ0KGJwLCBwLCBvbGRfcmVnX3NpemUpOworCW8tPnJldmVydChicCwgcCwgb2xkX3JlZ19zaXplLCBjbWQpOwogCiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3AuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NwLmgKaW5kZXggNDA0OGZjNS4uMGJmMmZkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3AuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcC5oCkBAIC01MzYsNiArNTM2LDE1IEBACiAJQk5YMlhfTUNBU1RfQ01EX0NPTlQsCiAJQk5YMlhfTUNBU1RfQ01EX0RFTCwKIAlCTlgyWF9NQ0FTVF9DTURfUkVTVE9SRSwKKworCS8qIEZvbGxvd2luZyB0aGlzLCBtdWx0aWNhc3QgY29uZmlndXJhdGlvbiBzaG91bGQgZXF1YWwgdG8gYXBwcm94CisJICogdGhlIHNldCBvZiBNQUNzIHByb3ZpZGVkIFtpLmUuLCByZW1vdmUgYWxsIGVsc2VdLgorCSAqIFRoZSB0d28gc3ViLWNvbW1hbmRzIGFyZSB1c2VkIGludGVybmFsbHkgdG8gZGVjaWRlIHdoZXRoZXIgYSBnaXZlbgorCSAqIGJpbiBpcyB0byBiZSBhZGRlZCBvciByZW1vdmVkCisJICovCisJQk5YMlhfTUNBU1RfQ01EX1NFVCwKKwlCTlgyWF9NQ0FTVF9DTURfU0VUX0FERCwKKwlCTlgyWF9NQ0FTVF9DTURfU0VUX0RFTCwKIH07CiAKIHN0cnVjdCBibngyeF9tY2FzdF9vYmogewpAQCAtNjM1LDcgKzY0NCw4IEBACiAJICovCiAJdm9pZCAoKnJldmVydCkoc3RydWN0IGJueDJ4ICpicCwKIAkJICAgICAgIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAotCQkgICAgICAgaW50IG9sZF9udW1fYmlucyk7CisJCSAgICAgICBpbnQgb2xkX251bV9iaW5zLAorCQkgICAgICAgZW51bSBibngyeF9tY2FzdF9jbWQgY21kKTsKIAogCWludCAoKmdldF9yZWdpc3RyeV9zaXplKShzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvKTsKIAl2b2lkICgqc2V0X3JlZ2lzdHJ5X3NpemUpKHN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8sIGludCBuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NyaW92LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcmlvdi5jCmluZGV4IDYzMmRhZmYuLjNmNzdkMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NyaW92LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3Jpb3YuYwpAQCAtNTczLDE3ICs1NzMsNiBAQAogCQl9CiAJfQogCi0JLyogY2xlYXIgZXhpc3RpbmcgbWNhc3RzICovCi0JbWNhc3QubWNhc3RfbGlzdF9sZW4gPSB2Zi0+bWNhc3RfbGlzdF9sZW47Ci0JdmYtPm1jYXN0X2xpc3RfbGVuID0gbWNfbnVtOwotCXJjID0gYm54MnhfY29uZmlnX21jYXN0KGJwLCAmbWNhc3QsIEJOWDJYX01DQVNUX0NNRF9ERUwpOwotCWlmIChyYykgewotCQlCTlgyWF9FUlIoIkZhaWxlZCB0byByZW1vdmUgbXVsdGljYXN0c1xuIik7Ci0JCWtmcmVlKG1jKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIHVwZGF0ZSBtY2FzdCBsaXN0IG9uIHRoZSByYW1yb2QgcGFyYW1zICovCiAJaWYgKG1jX251bSkgewogCQlJTklUX0xJU1RfSEVBRCgmbWNhc3QubWNhc3RfbGlzdCk7CiAJCWZvciAoaSA9IDA7IGkgPCBtY19udW07IGkrKykgewpAQCAtNTk0LDEyICs1ODMsMTggQEAKIAogCQkvKiBhZGQgbmV3IG1jYXN0cyAqLwogCQltY2FzdC5tY2FzdF9saXN0X2xlbiA9IG1jX251bTsKLQkJcmMgPSBibngyeF9jb25maWdfbWNhc3QoYnAsICZtY2FzdCwgQk5YMlhfTUNBU1RfQ01EX0FERCk7CisJCXJjID0gYm54MnhfY29uZmlnX21jYXN0KGJwLCAmbWNhc3QsIEJOWDJYX01DQVNUX0NNRF9TRVQpOwogCQlpZiAocmMpCi0JCQlCTlgyWF9FUlIoIkZhbGVkIHRvIGFkZCBtdWx0aWNhc3RzXG4iKTsKLQkJa2ZyZWUobWMpOworCQkJQk5YMlhfRVJSKCJGYWxlZCB0byBzZXQgbXVsdGljYXN0c1xuIik7CisJfSBlbHNlIHsKKwkJLyogY2xlYXIgZXhpc3RpbmcgbWNhc3RzICovCisJCXJjID0gYm54MnhfY29uZmlnX21jYXN0KGJwLCAmbWNhc3QsIEJOWDJYX01DQVNUX0NNRF9ERUwpOworCQlpZiAocmMpCisJCQlCTlgyWF9FUlIoIkZhaWxlZCB0byByZW1vdmUgbXVsdGljYXN0c1xuIik7CiAJfQogCisJa2ZyZWUobWMpOworCiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNTgzLDcgKzE1NzgsNiBAQAogCQkgKiAgSXQgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgaGVyZSBzbyB0aGF0IGl0IGNhbiBiZSBzYWZlbHkKIAkJICogIGhhbmRsZWQgYnkgYSBzdWJzZXF1ZW50IEZMUiBmbG93LgogCQkgKi8KLQkJdmYtPm1jYXN0X2xpc3RfbGVuID0gMDsKIAkJYm54MnhfaW5pdF9tY2FzdF9vYmooYnAsICZ2Zi0+bWNhc3Rfb2JqLCAweEZGLAogCQkJCSAgICAgMHhGRiwgMHhGRiwgMHhGRiwKIAkJCQkgICAgIGJueDJ4X3ZmX3NwKGJwLCB2ZiwgbWNhc3RfcmRhdGEpLApAQCAtMjUyNyw3ICsyNTIxLDggQEAKIAlmb3JfZWFjaF92ZihicCwgdmZpZHgpIHsKIAkJYnVsbGV0aW4gPSBCUF9WRl9CVUxMRVRJTihicCwgdmZpZHgpOwogCQlpZiAoYnVsbGV0aW4tPnZhbGlkX2JpdG1hcCAmICgxIDw8IFZMQU5fVkFMSUQpKQotCQkJYm54Mnhfc2V0X3ZmX3ZsYW4oYnAtPmRldiwgdmZpZHgsIGJ1bGxldGluLT52bGFuLCAwKTsKKwkJCWJueDJ4X3NldF92Zl92bGFuKGJwLT5kZXYsIHZmaWR4LCBidWxsZXRpbi0+dmxhbiwgMCwKKwkJCQkJICBodG9ucyhFVEhfUF84MDIxUSkpOwogCX0KIH0KIApAQCAtMjc4Nyw3ICsyNzgyLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGJueDJ4X3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2ZmlkeCwgdTE2IHZsYW4sIHU4IHFvcykKK2ludCBibngyeF9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmZpZHgsIHUxNiB2bGFuLCB1OCBxb3MsCisJCSAgICAgIF9fYmUxNiB2bGFuX3Byb3RvKQogewogCXN0cnVjdCBwZl92Zl9idWxsZXRpbl9jb250ZW50ICpidWxsZXRpbiA9IE5VTEw7CiAJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CkBAIC0yODAyLDYgKzI3OTgsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAodmxhbl9wcm90byAhPSBodG9ucyhFVEhfUF84MDIxUSkpCisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCiAJRFAoQk5YMlhfTVNHX0lPViwgImNvbmZpZ3VyaW5nIFZGICVkIHdpdGggVkxBTiAlZCBxb3MgJWRcbiIsCiAJICAgdmZpZHgsIHZsYW4sIDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcmlvdi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3Jpb3YuaAppbmRleCA2NzBhNTgxLi43YTZkNDA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcmlvdi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NyaW92LmgKQEAgLTE5NSw3ICsxOTUsNiBAQAogCWludCBsZWFkaW5nX3JzczsKIAogCS8qIE1DQVNUIG9iamVjdCAqLwotCWludCBtY2FzdF9saXN0X2xlbjsKIAlzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqCQltY2FzdF9vYmo7CiAKIAkvKiBSU1MgY29uZmlndXJhdGlvbiBvYmplY3QgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmMKaW5kZXggMmNmNzkxMC4uYTlmOWYzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9taWkuaD4KICNpbmNsdWRlIDxsaW51eC9pZi5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L3VkcC5oPgpAQCAtOTMsNTAgKzk0LDQ5IEBACiAJQkNNNTc0MDRfTlBBUiwKIAlCQ001NzQwNl9OUEFSLAogCUJDTTU3NDA3X1NGUCwKKwlCQ001NzQwN19OUEFSLAogCUJDTTU3NDE0X05QQVIsCiAJQkNNNTc0MTZfTlBBUiwKLQlCQ001NzMwNF9WRiwKLQlCQ001NzQwNF9WRiwKLQlCQ001NzQxNF9WRiwKLQlCQ001NzMxNF9WRiwKKwlORVRYVFJFTUVfRV9WRiwKKwlORVRYVFJFTUVfQ19WRiwKIH07CiAKIC8qIGluZGV4ZWQgYnkgZW51bSBhYm92ZSAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAJY2hhciAqbmFtZTsKIH0gYm9hcmRfaW5mb1tdID0gewotCXsgIkJyb2FkY29tIEJDTTU3MzAxIE5ldFh0cmVtZS1DIFNpbmdsZS1wb3J0IDEwR2IgRXRoZXJuZXQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTczMDIgTmV0WHRyZW1lLUMgRHVhbC1wb3J0IDEwR2IvMjVHYiBFdGhlcm5ldCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzMwNCBOZXRYdHJlbWUtQyBEdWFsLXBvcnQgMTBHYi8yNUdiLzQwR2IvNTBHYiBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzMwMSBOZXRYdHJlbWUtQyAxMEdiIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3MzAyIE5ldFh0cmVtZS1DIDEwR2IvMjVHYiBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzMwNCBOZXRYdHJlbWUtQyAxMEdiLzI1R2IvNDBHYi81MEdiIEV0aGVybmV0IiB9LAogCXsgIkJyb2FkY29tIEJDTTU3NDE3IE5ldFh0cmVtZS1FIEV0aGVybmV0IFBhcnRpdGlvbiIgfSwKLQl7ICJCcm9hZGNvbSBCQ001ODcwMCBOaXRybyA0LXBvcnQgMUdiLzIuNUdiLzEwR2IgRXRoZXJuZXQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTczMTEgTmV0WHRyZW1lLUMgU2luZ2xlLXBvcnQgMTBHYiBFdGhlcm5ldCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzMxMiBOZXRYdHJlbWUtQyBEdWFsLXBvcnQgMTBHYi8yNUdiIEV0aGVybmV0IiB9LAotCXsgIkJyb2FkY29tIEJDTTU3NDAyIE5ldFh0cmVtZS1FIER1YWwtcG9ydCAxMEdiIEV0aGVybmV0IiB9LAotCXsgIkJyb2FkY29tIEJDTTU3NDA0IE5ldFh0cmVtZS1FIER1YWwtcG9ydCAxMEdiLzI1R2IgRXRoZXJuZXQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTc0MDYgTmV0WHRyZW1lLUUgRHVhbC1wb3J0IDEwR0Jhc2UtVCBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001ODcwMCBOaXRybyAxR2IvMi41R2IvMTBHYiBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzMxMSBOZXRYdHJlbWUtQyAxMEdiIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3MzEyIE5ldFh0cmVtZS1DIDEwR2IvMjVHYiBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzQwMiBOZXRYdHJlbWUtRSAxMEdiIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3NDA0IE5ldFh0cmVtZS1FIDEwR2IvMjVHYiBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzQwNiBOZXRYdHJlbWUtRSAxMEdCYXNlLVQgRXRoZXJuZXQiIH0sCiAJeyAiQnJvYWRjb20gQkNNNTc0MDIgTmV0WHRyZW1lLUUgRXRoZXJuZXQgUGFydGl0aW9uIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3NDA3IE5ldFh0cmVtZS1FIER1YWwtcG9ydCAxMEdCYXNlLVQgRXRoZXJuZXQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTc0MTIgTmV0WHRyZW1lLUUgRHVhbC1wb3J0IDEwR2IgRXRoZXJuZXQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTc0MTQgTmV0WHRyZW1lLUUgRHVhbC1wb3J0IDEwR2IvMjVHYiBFdGhlcm5ldCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzQxNiBOZXRYdHJlbWUtRSBEdWFsLXBvcnQgMTBHQmFzZS1UIEV0aGVybmV0IiB9LAotCXsgIkJyb2FkY29tIEJDTTU3NDE3IE5ldFh0cmVtZS1FIER1YWwtcG9ydCAxMEdCYXNlLVQgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTc0MDcgTmV0WHRyZW1lLUUgMTBHQmFzZS1UIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3NDEyIE5ldFh0cmVtZS1FIDEwR2IgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTc0MTQgTmV0WHRyZW1lLUUgMTBHYi8yNUdiIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3NDE2IE5ldFh0cmVtZS1FIDEwR0Jhc2UtVCBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzQxNyBOZXRYdHJlbWUtRSAxMEdCYXNlLVQgRXRoZXJuZXQiIH0sCiAJeyAiQnJvYWRjb20gQkNNNTc0MTIgTmV0WHRyZW1lLUUgRXRoZXJuZXQgUGFydGl0aW9uIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MzE0IE5ldFh0cmVtZS1DIER1YWwtcG9ydCAxMEdiLzI1R2IvNDBHYi81MEdiIEV0aGVybmV0IiB9LAotCXsgIkJyb2FkY29tIEJDTTU3NDE3IE5ldFh0cmVtZS1FIER1YWwtcG9ydCAxMEdiLzI1R2IgRXRoZXJuZXQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTc0MTYgTmV0WHRyZW1lLUUgRHVhbC1wb3J0IDEwR2IgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTczMTQgTmV0WHRyZW1lLUMgMTBHYi8yNUdiLzQwR2IvNTBHYiBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzQxNyBOZXRYdHJlbWUtRSAxMEdiLzI1R2IgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTc0MTYgTmV0WHRyZW1lLUUgMTBHYiBFdGhlcm5ldCIgfSwKIAl7ICJCcm9hZGNvbSBCQ001NzQwNCBOZXRYdHJlbWUtRSBFdGhlcm5ldCBQYXJ0aXRpb24iIH0sCiAJeyAiQnJvYWRjb20gQkNNNTc0MDYgTmV0WHRyZW1lLUUgRXRoZXJuZXQgUGFydGl0aW9uIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3NDA3IE5ldFh0cmVtZS1FIER1YWwtcG9ydCAyNUdiIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3NDA3IE5ldFh0cmVtZS1FIDI1R2IgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTc0MDcgTmV0WHRyZW1lLUUgRXRoZXJuZXQgUGFydGl0aW9uIiB9LAogCXsgIkJyb2FkY29tIEJDTTU3NDE0IE5ldFh0cmVtZS1FIEV0aGVybmV0IFBhcnRpdGlvbiIgfSwKIAl7ICJCcm9hZGNvbSBCQ001NzQxNiBOZXRYdHJlbWUtRSBFdGhlcm5ldCBQYXJ0aXRpb24iIH0sCi0JeyAiQnJvYWRjb20gQkNNNTczMDQgTmV0WHRyZW1lLUMgRXRoZXJuZXQgVmlydHVhbCBGdW5jdGlvbiIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzQwNCBOZXRYdHJlbWUtRSBFdGhlcm5ldCBWaXJ0dWFsIEZ1bmN0aW9uIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3NDE0IE5ldFh0cmVtZS1FIEV0aGVybmV0IFZpcnR1YWwgRnVuY3Rpb24iIH0sCi0JeyAiQnJvYWRjb20gQkNNNTczMTQgTmV0WHRyZW1lLUUgRXRoZXJuZXQgVmlydHVhbCBGdW5jdGlvbiIgfSwKKwl7ICJCcm9hZGNvbSBOZXRYdHJlbWUtRSBFdGhlcm5ldCBWaXJ0dWFsIEZ1bmN0aW9uIiB9LAorCXsgIkJyb2FkY29tIE5ldFh0cmVtZS1DIEV0aGVybmV0IFZpcnR1YWwgRnVuY3Rpb24iIH0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgYm54dF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmMwKSwgLmRyaXZlcl9kYXRhID0gQkNNNTc0MTdfTlBBUiB9LAogCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZjOCksIC5kcml2ZXJfZGF0YSA9IEJDTTU3MzAxIH0sCiAJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmM5KSwgLmRyaXZlcl9kYXRhID0gQkNNNTczMDIgfSwKIAl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2Y2EpLCAuZHJpdmVyX2RhdGEgPSBCQ001NzMwNCB9LApAQCAtMTYwLDEzICsxNjAsMTkgQEAKIAl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2ZTcpLCAuZHJpdmVyX2RhdGEgPSBCQ001NzQwNF9OUEFSIH0sCiAJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmU4KSwgLmRyaXZlcl9kYXRhID0gQkNNNTc0MDZfTlBBUiB9LAogCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZlOSksIC5kcml2ZXJfZGF0YSA9IEJDTTU3NDA3X1NGUCB9LAorCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZlYSksIC5kcml2ZXJfZGF0YSA9IEJDTTU3NDA3X05QQVIgfSwKKwl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2ZWIpLCAuZHJpdmVyX2RhdGEgPSBCQ001NzQxMl9OUEFSIH0sCiAJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmVjKSwgLmRyaXZlcl9kYXRhID0gQkNNNTc0MTRfTlBBUiB9LAorCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZlZCksIC5kcml2ZXJfZGF0YSA9IEJDTTU3NDE0X05QQVIgfSwKIAl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2ZWUpLCAuZHJpdmVyX2RhdGEgPSBCQ001NzQxNl9OUEFSIH0sCisJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmVmKSwgLmRyaXZlcl9kYXRhID0gQkNNNTc0MTZfTlBBUiB9LAogI2lmZGVmIENPTkZJR19CTlhUX1NSSU9WCi0JeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmNiKSwgLmRyaXZlcl9kYXRhID0gQkNNNTczMDRfVkYgfSwKLQl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2ZDMpLCAuZHJpdmVyX2RhdGEgPSBCQ001NzQwNF9WRiB9LAotCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZkYyksIC5kcml2ZXJfZGF0YSA9IEJDTTU3NDE0X1ZGIH0sCi0JeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmUxKSwgLmRyaXZlcl9kYXRhID0gQkNNNTczMTRfVkYgfSwKKwl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2YzEpLCAuZHJpdmVyX2RhdGEgPSBORVRYVFJFTUVfRV9WRiB9LAorCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZjYiksIC5kcml2ZXJfZGF0YSA9IE5FVFhUUkVNRV9DX1ZGIH0sCisJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmQzKSwgLmRyaXZlcl9kYXRhID0gTkVUWFRSRU1FX0VfVkYgfSwKKwl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2ZGMpLCAuZHJpdmVyX2RhdGEgPSBORVRYVFJFTUVfRV9WRiB9LAorCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZlMSksIC5kcml2ZXJfZGF0YSA9IE5FVFhUUkVNRV9DX1ZGIH0sCisJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmU1KSwgLmRyaXZlcl9kYXRhID0gTkVUWFRSRU1FX0NfVkYgfSwKICNlbmRpZgogCXsgMCB9CiB9OwpAQCAtMTg5LDggKzE5NSw3IEBACiAKIHN0YXRpYyBib29sIGJueHRfdmZfcGNpaWQoZW51bSBib2FyZF9pZHggaWR4KQogewotCXJldHVybiAoaWR4ID09IEJDTTU3MzA0X1ZGIHx8IGlkeCA9PSBCQ001NzQwNF9WRiB8fAotCQlpZHggPT0gQkNNNTczMTRfVkYgfHwgaWR4ID09IEJDTTU3NDE0X1ZGKTsKKwlyZXR1cm4gKGlkeCA9PSBORVRYVFJFTUVfQ19WRiB8fCBpZHggPT0gTkVUWFRSRU1FX0VfVkYpOwogfQogCiAjZGVmaW5lIERCX0NQX1JFQVJNX0ZMQUdTCShEQl9LRVlfQ1AgfCBEQl9JRFhfVkFMSUQpCkBAIC0zNTMsOCArMzU4LDggQEAKIAkJcHVzaF9sZW4gPSAobGVuZ3RoICsgc2l6ZW9mKCp0eF9wdXNoKSArIDcpIC8gODsKIAkJaWYgKHB1c2hfbGVuID4gMTYpIHsKIAkJCV9faW93cml0ZTY0X2NvcHkodHhyLT50eF9kb29yYmVsbCwgdHhfcHVzaF9idWYsIDE2KTsKLQkJCV9faW93cml0ZTY0X2NvcHkodHhyLT50eF9kb29yYmVsbCArIDQsIHR4X3B1c2hfYnVmICsgMSwKLQkJCQkJIHB1c2hfbGVuIC0gMTYpOworCQkJX19pb3dyaXRlMzJfY29weSh0eHItPnR4X2Rvb3JiZWxsICsgNCwgdHhfcHVzaF9idWYgKyAxLAorCQkJCQkgKHB1c2hfbGVuIC0gMTYpIDw8IDEpOwogCQl9IGVsc2UgewogCQkJX19pb3dyaXRlNjRfY29weSh0eHItPnR4X2Rvb3JiZWxsLCB0eF9wdXNoX2J1ZiwKIAkJCQkJIHB1c2hfbGVuKTsKQEAgLTM0MTksMTAgKzM0MjQsMTAgQEAKIAogCWJueHRfaHdybV9jbWRfaGRyX2luaXQoYnAsICZyZXEsIEhXUk1fVk5JQ19SU1NfQ0ZHLCAtMSwgLTEpOwogCWlmIChzZXRfcnNzKSB7Ci0JCXZuaWMtPmhhc2hfdHlwZSA9IEJOWFRfUlNTX0hBU0hfVFlQRV9GTEFHX0lQVjQgfAotCQkJCSBCTlhUX1JTU19IQVNIX1RZUEVfRkxBR19UQ1BfSVBWNCB8Ci0JCQkJIEJOWFRfUlNTX0hBU0hfVFlQRV9GTEFHX0lQVjYgfAotCQkJCSBCTlhUX1JTU19IQVNIX1RZUEVfRkxBR19UQ1BfSVBWNjsKKwkJdm5pYy0+aGFzaF90eXBlID0gVk5JQ19SU1NfQ0ZHX1JFUV9IQVNIX1RZUEVfSVBWNCB8CisJCQkJICBWTklDX1JTU19DRkdfUkVRX0hBU0hfVFlQRV9UQ1BfSVBWNCB8CisJCQkJICBWTklDX1JTU19DRkdfUkVRX0hBU0hfVFlQRV9JUFY2IHwKKwkJCQkgIFZOSUNfUlNTX0NGR19SRVFfSEFTSF9UWVBFX1RDUF9JUFY2OwogCiAJCXJlcS5oYXNoX3R5cGUgPSBjcHVfdG9fbGUzMih2bmljLT5oYXNoX3R5cGUpOwogCkBAIC00MTU2LDYgKzQxNjEsMTEgQEAKIAlpZiAocmMpCiAJCWdvdG8gaHdybV9mdW5jX3FjYXBzX2V4aXQ7CiAKKwlicC0+dHhfcHVzaF90aHJlc2ggPSAwOworCWlmIChyZXNwLT5mbGFncyAmCisJICAgIGNwdV90b19sZTMyKEZVTkNfUUNBUFNfUkVTUF9GTEFHU19QVVNIX01PREVfU1VQUE9SVEVEKSkKKwkJYnAtPnR4X3B1c2hfdGhyZXNoID0gQk5YVF9UWF9QVVNIX1RIUkVTSDsKKwogCWlmIChCTlhUX1BGKGJwKSkgewogCQlzdHJ1Y3QgYm54dF9wZl9pbmZvICpwZiA9ICZicC0+cGY7CiAKQEAgLTQxODcsMTIgKzQxOTcsNiBAQAogCQlzdHJ1Y3QgYm54dF92Zl9pbmZvICp2ZiA9ICZicC0+dmY7CiAKIAkJdmYtPmZ3X2ZpZCA9IGxlMTZfdG9fY3B1KHJlc3AtPmZpZCk7Ci0JCW1lbWNweSh2Zi0+bWFjX2FkZHIsIHJlc3AtPm1hY19hZGRyZXNzLCBFVEhfQUxFTik7Ci0JCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKHZmLT5tYWNfYWRkcikpCi0JCQkvKiBvdmVyd3JpdGUgbmV0ZGV2IGRldl9hZHIgd2l0aCBhZG1pbiBWRiBNQUMgKi8KLQkJCW1lbWNweShicC0+ZGV2LT5kZXZfYWRkciwgdmYtPm1hY19hZGRyLCBFVEhfQUxFTik7Ci0JCWVsc2UKLQkJCXJhbmRvbV9ldGhlcl9hZGRyKGJwLT5kZXYtPmRldl9hZGRyKTsKIAogCQl2Zi0+bWF4X3Jzc2Nvc19jdHhzID0gbGUxNl90b19jcHUocmVzcC0+bWF4X3Jzc2Nvc19jdHgpOwogCQl2Zi0+bWF4X2NwX3JpbmdzID0gbGUxNl90b19jcHUocmVzcC0+bWF4X2NtcGxfcmluZ3MpOwpAQCAtNDIwNCwxNCArNDIwOCwyMSBAQAogCQl2Zi0+bWF4X2wyX2N0eHMgPSBsZTE2X3RvX2NwdShyZXNwLT5tYXhfbDJfY3R4cyk7CiAJCXZmLT5tYXhfdm5pY3MgPSBsZTE2X3RvX2NwdShyZXNwLT5tYXhfdm5pY3MpOwogCQl2Zi0+bWF4X3N0YXRfY3R4cyA9IGxlMTZfdG9fY3B1KHJlc3AtPm1heF9zdGF0X2N0eCk7CisKKwkJbWVtY3B5KHZmLT5tYWNfYWRkciwgcmVzcC0+bWFjX2FkZHJlc3MsIEVUSF9BTEVOKTsKKwkJbXV0ZXhfdW5sb2NrKCZicC0+aHdybV9jbWRfbG9jayk7CisKKwkJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIodmYtPm1hY19hZGRyKSkgeworCQkJLyogb3ZlcndyaXRlIG5ldGRldiBkZXZfYWRyIHdpdGggYWRtaW4gVkYgTUFDICovCisJCQltZW1jcHkoYnAtPmRldi0+ZGV2X2FkZHIsIHZmLT5tYWNfYWRkciwgRVRIX0FMRU4pOworCQl9IGVsc2UgeworCQkJcmFuZG9tX2V0aGVyX2FkZHIoYnAtPmRldi0+ZGV2X2FkZHIpOworCQkJcmMgPSBibnh0X2FwcHJvdmVfbWFjKGJwLCBicC0+ZGV2LT5kZXZfYWRkcik7CisJCX0KKwkJcmV0dXJuIHJjOwogI2VuZGlmCiAJfQogCi0JYnAtPnR4X3B1c2hfdGhyZXNoID0gMDsKLQlpZiAocmVzcC0+ZmxhZ3MgJgotCSAgICBjcHVfdG9fbGUzMihGVU5DX1FDQVBTX1JFU1BfRkxBR1NfUFVTSF9NT0RFX1NVUFBPUlRFRCkpCi0JCWJwLT50eF9wdXNoX3RocmVzaCA9IEJOWFRfVFhfUFVTSF9USFJFU0g7Ci0KIGh3cm1fZnVuY19xY2Fwc19leGl0OgogCW11dGV4X3VubG9jaygmYnAtPmh3cm1fY21kX2xvY2spOwogCXJldHVybiByYzsKQEAgLTQyNDksNiArNDI2MCw5IEBACiAJaWYgKGJwLT5tYXhfdGMgPiBCTlhUX01BWF9RVUVVRSkKIAkJYnAtPm1heF90YyA9IEJOWFRfTUFYX1FVRVVFOwogCisJaWYgKHJlc3AtPnF1ZXVlX2NmZ19pbmZvICYgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9DRkdfSU5GT19BU1lNX0NGRykKKwkJYnAtPm1heF90YyA9IDE7CisKIAlxcHRyID0gJnJlc3AtPnF1ZXVlX2lkMDsKIAlmb3IgKGkgPSAwOyBpIDwgYnAtPm1heF90YzsgaSsrKSB7CiAJCWJwLT5xX2luZm9baV0ucXVldWVfaWQgPSAqcXB0cisrOwpAQCAtNDMwNyw2ICs0MzIxLDMxIEBACiAJcmV0dXJuIHJjOwogfQogCitpbnQgYm54dF9od3JtX2Z3X3NldF90aW1lKHN0cnVjdCBibnh0ICpicCkKK3sKKyNpZiBJU19FTkFCTEVEKENPTkZJR19SVENfTElCKQorCXN0cnVjdCBod3JtX2Z3X3NldF90aW1lX2lucHV0IHJlcSA9IHswfTsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwlpZiAoYnAtPmh3cm1fc3BlY19jb2RlIDwgMHgxMDQwMCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJcnRjX3RpbWVfdG9fdG0odHYudHZfc2VjLCAmdG0pOworCWJueHRfaHdybV9jbWRfaGRyX2luaXQoYnAsICZyZXEsIEhXUk1fRldfU0VUX1RJTUUsIC0xLCAtMSk7CisJcmVxLnllYXIgPSBjcHVfdG9fbGUxNigxOTAwICsgdG0udG1feWVhcik7CisJcmVxLm1vbnRoID0gMSArIHRtLnRtX21vbjsKKwlyZXEuZGF5ID0gdG0udG1fbWRheTsKKwlyZXEuaG91ciA9IHRtLnRtX2hvdXI7CisJcmVxLm1pbnV0ZSA9IHRtLnRtX21pbjsKKwlyZXEuc2Vjb25kID0gdG0udG1fc2VjOworCXJldHVybiBod3JtX3NlbmRfbWVzc2FnZShicCwgJnJlcSwgc2l6ZW9mKHJlcSksIEhXUk1fQ01EX1RJTUVPVVQpOworI2Vsc2UKKwlyZXR1cm4gLUVPUE5PVFNVUFA7CisjZW5kaWYKK30KKwogc3RhdGljIGludCBibnh0X2h3cm1fcG9ydF9xc3RhdHMoc3RydWN0IGJueHQgKmJwKQogewogCWludCByYzsKQEAgLTY4MDQsNiArNjg0Myw4IEBACiAJaWYgKHJjKQogCQlnb3RvIGluaXRfZXJyOwogCisJYm54dF9od3JtX2Z3X3NldF90aW1lKGJwKTsKKwogCWRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX0lQVjZfQ1NVTSB8IE5FVElGX0ZfU0cgfAogCQkJICAgTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzYgfAogCQkJICAgTkVUSUZfRl9HU09fVURQX1RVTk5FTCB8IE5FVElGX0ZfR1NPX0dSRSB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5oCmluZGV4IDIzZTA0YTYuLjUxYjE2NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5oCkBAIC0xMSwxMCArMTEsMTAgQEAKICNkZWZpbmUgQk5YVF9ICiAKICNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkiYm54dF9lbiIKLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIxLjMuMCIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIxLjUuMCIKIAogI2RlZmluZSBEUlZfVkVSX01BSgkxCi0jZGVmaW5lIERSVl9WRVJfTUlOCTMKKyNkZWZpbmUgRFJWX1ZFUl9NSU4JNQogI2RlZmluZSBEUlZfVkVSX1VQRAkwCiAKIHN0cnVjdCB0eF9iZCB7CkBAIC0xMDYsMTEgKzEwNiwxMSBAQAogCSAjZGVmaW5lIENNUF9UWVBFX1JFTU9URV9EUklWRVJfUkVRCQkJIDM0CiAJICNkZWZpbmUgQ01QX1RZUEVfUkVNT1RFX0RSSVZFUl9SRVNQCQkJIDM2CiAJICNkZWZpbmUgQ01QX1RZUEVfRVJST1JfU1RBVFVTCQkJCSA0OAotCSAjZGVmaW5lIENNUExfQkFTRV9UWVBFX1NUQVRfRUpFQ1QJCQkgKDB4MWFVTCA8PCAwKQotCSAjZGVmaW5lIENNUExfQkFTRV9UWVBFX0hXUk1fRE9ORQkJCSAoMHgyMFVMIDw8IDApCi0JICNkZWZpbmUgQ01QTF9CQVNFX1RZUEVfSFdSTV9GV0RfUkVRCQkJICgweDIyVUwgPDwgMCkKLQkgI2RlZmluZSBDTVBMX0JBU0VfVFlQRV9IV1JNX0ZXRF9SRVNQCQkJICgweDI0VUwgPDwgMCkKLQkgI2RlZmluZSBDTVBMX0JBU0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UCQkgKDB4MmVVTCA8PCAwKQorCSAjZGVmaW5lIENNUExfQkFTRV9UWVBFX1NUQVRfRUpFQ1QJCQkgMHgxYVVMCisJICNkZWZpbmUgQ01QTF9CQVNFX1RZUEVfSFdSTV9ET05FCQkJIDB4MjBVTAorCSAjZGVmaW5lIENNUExfQkFTRV9UWVBFX0hXUk1fRldEX1JFUQkJCSAweDIyVUwKKwkgI2RlZmluZSBDTVBMX0JBU0VfVFlQRV9IV1JNX0ZXRF9SRVNQCQkJIDB4MjRVTAorCSAjZGVmaW5lIENNUExfQkFTRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQJCSAweDJlVUwKIAogCSNkZWZpbmUgVFhfQ01QX0ZMQUdTX0VSUk9SCQkJCSgxIDw8IDYpCiAJI2RlZmluZSBUWF9DTVBfRkxBR1NfUFVTSAkJCQkoMSA8PCA3KQpAQCAtMzg5LDExICszODksNiBAQAogCiAjZGVmaW5lIElOVkFMSURfSFdfUklOR19JRAkoKHUxNiktMSkKIAotI2RlZmluZSBCTlhUX1JTU19IQVNIX1RZUEVfRkxBR19JUFY0CQkweDAxCi0jZGVmaW5lIEJOWFRfUlNTX0hBU0hfVFlQRV9GTEFHX1RDUF9JUFY0CTB4MDIKLSNkZWZpbmUgQk5YVF9SU1NfSEFTSF9UWVBFX0ZMQUdfSVBWNgkJMHgwNAotI2RlZmluZSBCTlhUX1JTU19IQVNIX1RZUEVfRkxBR19UQ1BfSVBWNgkweDA4Ci0KIC8qIFRoZSBoYXJkd2FyZSBzdXBwb3J0cyBjZXJ0YWluIHBhZ2Ugc2l6ZXMuICBVc2UgdGhlIHN1cHBvcnRlZCBwYWdlIHNpemVzCiAgKiB0byBhbGxvY2F0ZSB0aGUgcmluZ3MuCiAgKi8KQEAgLTQxOCw3ICs0MTMsNyBAQAogCiAjZGVmaW5lIEJOWFRfUlhfUEFHRV9TSVpFICgxIDw8IEJOWFRfUlhfUEFHRV9TSElGVCkKIAotI2RlZmluZSBCTlhUX01JTl9QS1RfU0laRQk0NQorI2RlZmluZSBCTlhUX01JTl9QS1RfU0laRQk1MgogCiAjZGVmaW5lIEJOWFRfTlVNX1RFU1RTKGJwKQkwCiAKQEAgLTEyMjUsNiArMTIyMCw3IEBACiBpbnQgYm54dF9od3JtX2Z1bmNfcWNhcHMoc3RydWN0IGJueHQgKik7CiBpbnQgYm54dF9od3JtX3NldF9wYXVzZShzdHJ1Y3QgYm54dCAqKTsKIGludCBibnh0X2h3cm1fc2V0X2xpbmtfc2V0dGluZyhzdHJ1Y3QgYm54dCAqLCBib29sLCBib29sKTsKK2ludCBibnh0X2h3cm1fZndfc2V0X3RpbWUoc3RydWN0IGJueHQgKik7CiBpbnQgYm54dF9vcGVuX25pYyhzdHJ1Y3QgYm54dCAqLCBib29sLCBib29sKTsKIGludCBibnh0X2Nsb3NlX25pYyhzdHJ1Y3QgYm54dCAqLCBib29sLCBib29sKTsKIGludCBibnh0X2dldF9tYXhfcmluZ3Moc3RydWN0IGJueHQgKiwgaW50ICosIGludCAqLCBib29sKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZXRodG9vbC5jCmluZGV4IGI4M2UxNzQuLmE3ZTA0ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2V0aHRvb2wuYwpAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgImJueHRfbnZtX2RlZnMuaCIJLyogTlZSQU0gY29udGVudCBjb25zdGFudCBhbmQgc3RydWN0dXJlIGRlZnMgKi8KICNpbmNsdWRlICJibnh0X2Z3X2hkci5oIgkvKiBGaXJtd2FyZSBoZHIgY29uc3RhbnQgYW5kIHN0cnVjdHVyZSBkZWZzICovCiAjZGVmaW5lIEZMQVNIX05WUkFNX1RJTUVPVVQJKChIV1JNX0NNRF9USU1FT1VUKSAqIDEwMCkKKyNkZWZpbmUgRkxBU0hfUEFDS0FHRV9USU1FT1VUCSgoSFdSTV9DTURfVElNRU9VVCkgKiAyMDApCisjZGVmaW5lIElOU1RBTExfUEFDS0FHRV9USU1FT1VUCSgoSFdSTV9DTURfVElNRU9VVCkgKiAyMDApCiAKIHN0YXRpYyBjaGFyICpibnh0X2dldF9wa2d2ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKTsKIApAQCAtMzQ2LDcgKzM0OCw3IEBACiAJaW50IG1heF9yeF9yaW5ncywgbWF4X3R4X3JpbmdzLCB0Y3M7CiAKIAlibnh0X2dldF9tYXhfcmluZ3MoYnAsICZtYXhfcnhfcmluZ3MsICZtYXhfdHhfcmluZ3MsIHRydWUpOwotCWNoYW5uZWwtPm1heF9jb21iaW5lZCA9IG1heF9yeF9yaW5nczsKKwljaGFubmVsLT5tYXhfY29tYmluZWQgPSBtYXhfdChpbnQsIG1heF9yeF9yaW5ncywgbWF4X3R4X3JpbmdzKTsKIAogCWlmIChibnh0X2dldF9tYXhfcmluZ3MoYnAsICZtYXhfcnhfcmluZ3MsICZtYXhfdHhfcmluZ3MsIGZhbHNlKSkgewogCQltYXhfcnhfcmluZ3MgPSAwOwpAQCAtNDA0LDggKzQwNiw4IEBACiAJaWYgKHRjcyA+IDEpCiAJCW1heF90eF9yaW5ncyAvPSB0Y3M7CiAKLQlpZiAoc2ggJiYgKGNoYW5uZWwtPmNvbWJpbmVkX2NvdW50ID4gbWF4X3J4X3JpbmdzIHx8Ci0JCSAgIGNoYW5uZWwtPmNvbWJpbmVkX2NvdW50ID4gbWF4X3R4X3JpbmdzKSkKKwlpZiAoc2ggJiYKKwkgICAgY2hhbm5lbC0+Y29tYmluZWRfY291bnQgPiBtYXhfdChpbnQsIG1heF9yeF9yaW5ncywgbWF4X3R4X3JpbmdzKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAoIXNoICYmIChjaGFubmVsLT5yeF9jb3VudCA+IG1heF9yeF9yaW5ncyB8fApAQCAtNDI4LDggKzQzMCwxMCBAQAogCiAJaWYgKHNoKSB7CiAJCWJwLT5mbGFncyB8PSBCTlhUX0ZMQUdfU0hBUkVEX1JJTkdTOwotCQlicC0+cnhfbnJfcmluZ3MgPSBjaGFubmVsLT5jb21iaW5lZF9jb3VudDsKLQkJYnAtPnR4X25yX3JpbmdzX3Blcl90YyA9IGNoYW5uZWwtPmNvbWJpbmVkX2NvdW50OworCQlicC0+cnhfbnJfcmluZ3MgPSBtaW5fdChpbnQsIGNoYW5uZWwtPmNvbWJpbmVkX2NvdW50LAorCQkJCQltYXhfcnhfcmluZ3MpOworCQlicC0+dHhfbnJfcmluZ3NfcGVyX3RjID0gbWluX3QoaW50LCBjaGFubmVsLT5jb21iaW5lZF9jb3VudCwKKwkJCQkJICAgICAgIG1heF90eF9yaW5ncyk7CiAJfSBlbHNlIHsKIAkJYnAtPmZsYWdzICY9IH5CTlhUX0ZMQUdfU0hBUkVEX1JJTkdTOwogCQlicC0+cnhfbnJfcmluZ3MgPSBjaGFubmVsLT5yeF9jb3VudDsKQEAgLTEwMjgsNiArMTAzMiwxMCBAQAogCXJldHVybiBicC0+bGlua19pbmZvLmxpbmtfdXA7CiB9CiAKK3N0YXRpYyBpbnQgYm54dF9maW5kX252cmFtX2l0ZW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHR5cGUsIHUxNiBvcmRpbmFsLAorCQkJCXUxNiBleHQsIHUxNiAqaW5kZXgsIHUzMiAqaXRlbV9sZW5ndGgsCisJCQkJdTMyICpkYXRhX2xlbmd0aCk7CisKIHN0YXRpYyBpbnQgYm54dF9mbGFzaF9udnJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgIHUxNiBkaXJfdHlwZSwKIAkJCSAgICB1MTYgZGlyX29yZGluYWwsCkBAIC0xMTc5LDcgKzExODcsNiBAQAogCQkJICAgKHVuc2lnbmVkIGxvbmcpY2FsY3VsYXRlZF9jcmMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JLyogVE9ETzogVmFsaWRhdGUgZGlnaXRhbCBzaWduYXR1cmUgKFJTQS1lbmNyeXB0ZWQgU0hBLTI1NiBoYXNoKSBoZXJlICovCiAJcmMgPSBibnh0X2ZsYXNoX252cmFtKGRldiwgZGlyX3R5cGUsIEJOWF9ESVJfT1JESU5BTF9GSVJTVCwKIAkJCSAgICAgIDAsIDAsIGZ3X2RhdGEsIGZ3X3NpemUpOwogCWlmIChyYyA9PSAwKQkvKiBGaXJtd2FyZSB1cGRhdGUgc3VjY2Vzc2Z1bCAqLwpAQCAtMTE4OCw2ICsxMTk1LDU3IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IGJueHRfZmxhc2hfbWljcm9jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJdTE2IGRpcl90eXBlLAorCQkJCWNvbnN0IHU4ICpmd19kYXRhLAorCQkJCXNpemVfdCBmd19zaXplKQoreworCXN0cnVjdCBibnh0X3Vjb2RlX3RyYWlsZXIgKnRyYWlsZXI7CisJdTMyIGNhbGN1bGF0ZWRfY3JjOworCXUzMiBzdG9yZWRfY3JjOworCWludCByYyA9IDA7CisKKwlpZiAoZndfc2l6ZSA8IHNpemVvZihzdHJ1Y3QgYm54dF91Y29kZV90cmFpbGVyKSkgeworCQluZXRkZXZfZXJyKGRldiwgIkludmFsaWQgbWljcm9jb2RlIGZpbGUgc2l6ZTogJXVcbiIsCisJCQkgICAodW5zaWduZWQgaW50KWZ3X3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdHJhaWxlciA9IChzdHJ1Y3QgYm54dF91Y29kZV90cmFpbGVyICopKGZ3X2RhdGEgKyAoZndfc2l6ZSAtCisJCQkJCQlzaXplb2YoKnRyYWlsZXIpKSk7CisJaWYgKHRyYWlsZXItPnNpZyAhPSBjcHVfdG9fbGUzMihCTlhUX1VDT0RFX1RSQUlMRVJfU0lHTkFUVVJFKSkgeworCQluZXRkZXZfZXJyKGRldiwgIkludmFsaWQgbWljcm9jb2RlIHRyYWlsZXIgc2lnbmF0dXJlOiAlMDhYXG4iLAorCQkJICAgbGUzMl90b19jcHUodHJhaWxlci0+c2lnKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobGUxNl90b19jcHUodHJhaWxlci0+ZGlyX3R5cGUpICE9IGRpcl90eXBlKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiRXhwZWN0ZWQgbWljcm9jb2RlIHR5cGU6ICVkLCByZWFkOiAlZFxuIiwKKwkJCSAgIGRpcl90eXBlLCBsZTE2X3RvX2NwdSh0cmFpbGVyLT5kaXJfdHlwZSkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGxlMTZfdG9fY3B1KHRyYWlsZXItPnRyYWlsZXJfbGVuZ3RoKSA8CisJCXNpemVvZihzdHJ1Y3QgYm54dF91Y29kZV90cmFpbGVyKSkgeworCQluZXRkZXZfZXJyKGRldiwgIkludmFsaWQgbWljcm9jb2RlIHRyYWlsZXIgbGVuZ3RoOiAlZFxuIiwKKwkJCSAgIGxlMTZfdG9fY3B1KHRyYWlsZXItPnRyYWlsZXJfbGVuZ3RoKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENvbmZpcm0gdGhlIENSQzMyIGNoZWNrc3VtIG9mIHRoZSBmaWxlOiAqLworCXN0b3JlZF9jcmMgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKShmd19kYXRhICsgZndfc2l6ZSAtCisJCQkJCSAgICAgc2l6ZW9mKHN0b3JlZF9jcmMpKSk7CisJY2FsY3VsYXRlZF9jcmMgPSB+Y3JjMzIofjAsIGZ3X2RhdGEsIGZ3X3NpemUgLSBzaXplb2Yoc3RvcmVkX2NyYykpOworCWlmIChjYWxjdWxhdGVkX2NyYyAhPSBzdG9yZWRfY3JjKSB7CisJCW5ldGRldl9lcnIoZGV2LAorCQkJICAgIkNSQzMyICglMDhsWCkgZG9lcyBub3QgbWF0Y2ggY2FsY3VsYXRlZDogJTA4bFhcbiIsCisJCQkgICAodW5zaWduZWQgbG9uZylzdG9yZWRfY3JjLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpY2FsY3VsYXRlZF9jcmMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmMgPSBibnh0X2ZsYXNoX252cmFtKGRldiwgZGlyX3R5cGUsIEJOWF9ESVJfT1JESU5BTF9GSVJTVCwKKwkJCSAgICAgIDAsIDAsIGZ3X2RhdGEsIGZ3X3NpemUpOworCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgYm9vbCBibnh0X2Rpcl90eXBlX2lzX2FwZV9iaW5fZm9ybWF0KHUxNiBkaXJfdHlwZSkKIHsKIAlzd2l0Y2ggKGRpcl90eXBlKSB7CkBAIC0xMjA2LDcgKzEyNjQsNyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIGJvb2wgYm54dF9kaXJfdHlwZV9pc191bnByb3RlY3RlZF9leGVjX2Zvcm1hdCh1MTYgZGlyX3R5cGUpCitzdGF0aWMgYm9vbCBibnh0X2Rpcl90eXBlX2lzX290aGVyX2V4ZWNfZm9ybWF0KHUxNiBkaXJfdHlwZSkKIHsKIAlzd2l0Y2ggKGRpcl90eXBlKSB7CiAJY2FzZSBCTlhfRElSX1RZUEVfQVZTOgpAQCAtMTIyNyw3ICsxMjg1LDcgQEAKIHN0YXRpYyBib29sIGJueHRfZGlyX3R5cGVfaXNfZXhlY3V0YWJsZSh1MTYgZGlyX3R5cGUpCiB7CiAJcmV0dXJuIGJueHRfZGlyX3R5cGVfaXNfYXBlX2Jpbl9mb3JtYXQoZGlyX3R5cGUpIHx8Ci0JCWJueHRfZGlyX3R5cGVfaXNfdW5wcm90ZWN0ZWRfZXhlY19mb3JtYXQoZGlyX3R5cGUpOworCQlibnh0X2Rpcl90eXBlX2lzX290aGVyX2V4ZWNfZm9ybWF0KGRpcl90eXBlKTsKIH0KIAogc3RhdGljIGludCBibnh0X2ZsYXNoX2Zpcm13YXJlX2Zyb21fZmlsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtMTIzNywxMCArMTI5NSw2IEBACiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICAqZnc7CiAJaW50CQkJcmM7CiAKLQlpZiAoZGlyX3R5cGUgIT0gQk5YX0RJUl9UWVBFX1VQREFURSAmJgotCSAgICBibnh0X2Rpcl90eXBlX2lzX2V4ZWN1dGFibGUoZGlyX3R5cGUpID09IGZhbHNlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXJjID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZpbGVuYW1lLCAmZGV2LT5kZXYpOwogCWlmIChyYyAhPSAwKSB7CiAJCW5ldGRldl9lcnIoZGV2LCAiRXJyb3IgJWQgcmVxdWVzdGluZyBmaXJtd2FyZSBmaWxlOiAlc1xuIiwKQEAgLTEyNDksNiArMTMwMyw4IEBACiAJfQogCWlmIChibnh0X2Rpcl90eXBlX2lzX2FwZV9iaW5fZm9ybWF0KGRpcl90eXBlKSA9PSB0cnVlKQogCQlyYyA9IGJueHRfZmxhc2hfZmlybXdhcmUoZGV2LCBkaXJfdHlwZSwgZnctPmRhdGEsIGZ3LT5zaXplKTsKKwllbHNlIGlmIChibnh0X2Rpcl90eXBlX2lzX290aGVyX2V4ZWNfZm9ybWF0KGRpcl90eXBlKSA9PSB0cnVlKQorCQlyYyA9IGJueHRfZmxhc2hfbWljcm9jb2RlKGRldiwgZGlyX3R5cGUsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CiAJZWxzZQogCQlyYyA9IGJueHRfZmxhc2hfbnZyYW0oZGV2LCBkaXJfdHlwZSwgQk5YX0RJUl9PUkRJTkFMX0ZJUlNULAogCQkJCSAgICAgIDAsIDAsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CkBAIC0xMjU3LDEwICsxMzEzLDgzIEBACiB9CiAKIHN0YXRpYyBpbnQgYm54dF9mbGFzaF9wYWNrYWdlX2Zyb21fZmlsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQljaGFyICpmaWxlbmFtZSkKKwkJCQkJY2hhciAqZmlsZW5hbWUsIHUzMiBpbnN0YWxsX3R5cGUpCiB7Ci0JbmV0ZGV2X2VycihkZXYsICJwYWNrYWdlcyBhcmUgbm90IHlldCBzdXBwb3J0ZWRcbiIpOwotCXJldHVybiAtRUlOVkFMOworCXN0cnVjdCBibnh0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGh3cm1fbnZtX2luc3RhbGxfdXBkYXRlX291dHB1dCAqcmVzcCA9IGJwLT5od3JtX2NtZF9yZXNwX2FkZHI7CisJc3RydWN0IGh3cm1fbnZtX2luc3RhbGxfdXBkYXRlX2lucHV0IGluc3RhbGwgPSB7MH07CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwl1MzIgaXRlbV9sZW47CisJdTE2IGluZGV4OworCWludCByYzsKKworCWJueHRfaHdybV9md19zZXRfdGltZShicCk7CisKKwlpZiAoYm54dF9maW5kX252cmFtX2l0ZW0oZGV2LCBCTlhfRElSX1RZUEVfVVBEQVRFLAorCQkJCSBCTlhfRElSX09SRElOQUxfRklSU1QsIEJOWF9ESVJfRVhUX05PTkUsCisJCQkJICZpbmRleCwgJml0ZW1fbGVuLCBOVUxMKSAhPSAwKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiUEtHIHVwZGF0ZSBhcmVhIG5vdCBjcmVhdGVkIGluIG52cmFtXG4iKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworCXJjID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZpbGVuYW1lLCAmZGV2LT5kZXYpOworCWlmIChyYyAhPSAwKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiUEtHIGVycm9yICVkIHJlcXVlc3RpbmcgZmlsZTogJXNcbiIsCisJCQkgICByYywgZmlsZW5hbWUpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKGZ3LT5zaXplID4gaXRlbV9sZW4pIHsKKwkJbmV0ZGV2X2VycihkZXYsICJQS0cgaW5zdWZmaWNpZW50IHVwZGF0ZSBhcmVhIGluIG52cmFtOiAlbHUiLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpZnctPnNpemUpOworCQlyYyA9IC1FRkJJRzsKKwl9IGVsc2UgeworCQlkbWFfYWRkcl90IGRtYV9oYW5kbGU7CisJCXU4ICprbWVtOworCQlzdHJ1Y3QgaHdybV9udm1fbW9kaWZ5X2lucHV0IG1vZGlmeSA9IHswfTsKKworCQlibnh0X2h3cm1fY21kX2hkcl9pbml0KGJwLCAmbW9kaWZ5LCBIV1JNX05WTV9NT0RJRlksIC0xLCAtMSk7CisKKwkJbW9kaWZ5LmRpcl9pZHggPSBjcHVfdG9fbGUxNihpbmRleCk7CisJCW1vZGlmeS5sZW4gPSBjcHVfdG9fbGUzMihmdy0+c2l6ZSk7CisKKwkJa21lbSA9IGRtYV9hbGxvY19jb2hlcmVudCgmYnAtPnBkZXYtPmRldiwgZnctPnNpemUsCisJCQkJCSAgJmRtYV9oYW5kbGUsIEdGUF9LRVJORUwpOworCQlpZiAoIWttZW0pIHsKKwkJCW5ldGRldl9lcnIoZGV2LAorCQkJCSAgICJkbWFfYWxsb2NfY29oZXJlbnQgZmFpbHVyZSwgbGVuZ3RoID0gJXVcbiIsCisJCQkJICAgKHVuc2lnbmVkIGludClmdy0+c2l6ZSk7CisJCQlyYyA9IC1FTk9NRU07CisJCX0gZWxzZSB7CisJCQltZW1jcHkoa21lbSwgZnctPmRhdGEsIGZ3LT5zaXplKTsKKwkJCW1vZGlmeS5ob3N0X3NyY19hZGRyID0gY3B1X3RvX2xlNjQoZG1hX2hhbmRsZSk7CisKKwkJCXJjID0gaHdybV9zZW5kX21lc3NhZ2UoYnAsICZtb2RpZnksIHNpemVvZihtb2RpZnkpLAorCQkJCQkgICAgICAgRkxBU0hfUEFDS0FHRV9USU1FT1VUKTsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KCZicC0+cGRldi0+ZGV2LCBmdy0+c2l6ZSwga21lbSwKKwkJCQkJICBkbWFfaGFuZGxlKTsKKwkJfQorCX0KKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmICgoaW5zdGFsbF90eXBlICYgMHhmZmZmKSA9PSAwKQorCQlpbnN0YWxsX3R5cGUgPj49IDE2OworCWJueHRfaHdybV9jbWRfaGRyX2luaXQoYnAsICZpbnN0YWxsLCBIV1JNX05WTV9JTlNUQUxMX1VQREFURSwgLTEsIC0xKTsKKwlpbnN0YWxsLmluc3RhbGxfdHlwZSA9IGNwdV90b19sZTMyKGluc3RhbGxfdHlwZSk7CisKKwlyYyA9IGh3cm1fc2VuZF9tZXNzYWdlKGJwLCAmaW5zdGFsbCwgc2l6ZW9mKGluc3RhbGwpLAorCQkJICAgICAgIElOU1RBTExfUEFDS0FHRV9USU1FT1VUKTsKKwlpZiAocmMpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChyZXNwLT5yZXN1bHQpIHsKKwkJbmV0ZGV2X2VycihkZXYsICJQS0cgaW5zdGFsbCBlcnJvciA9ICVkLCBwcm9ibGVtX2l0ZW0gPSAlZFxuIiwKKwkJCSAgIChzOClyZXNwLT5yZXN1bHQsIChpbnQpcmVzcC0+cHJvYmxlbV9pdGVtKTsKKwkJcmV0dXJuIC1FTk9QS0c7CisJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGJueHRfZmxhc2hfZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC0xMjcxLDggKzE0MDAsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGZsYXNoLT5yZWdpb24gPT0gRVRIVE9PTF9GTEFTSF9BTExfUkVHSU9OUykKLQkJcmV0dXJuIGJueHRfZmxhc2hfcGFja2FnZV9mcm9tX2ZpbGUoZGV2LCBmbGFzaC0+ZGF0YSk7CisJaWYgKGZsYXNoLT5yZWdpb24gPT0gRVRIVE9PTF9GTEFTSF9BTExfUkVHSU9OUyB8fAorCSAgICBmbGFzaC0+cmVnaW9uID4gMHhmZmZmKQorCQlyZXR1cm4gYm54dF9mbGFzaF9wYWNrYWdlX2Zyb21fZmlsZShkZXYsIGZsYXNoLT5kYXRhLAorCQkJCQkJICAgIGZsYXNoLT5yZWdpb24pOwogCiAJcmV0dXJuIGJueHRfZmxhc2hfZmlybXdhcmVfZnJvbV9maWxlKGRldiwgZmxhc2gtPnJlZ2lvbiwgZmxhc2gtPmRhdGEpOwogfQpAQCAtMTUxNiw3ICsxNjQ3LDcgQEAKIAogCS8qIENyZWF0ZSBvciByZS13cml0ZSBhbiBOVk0gaXRlbTogKi8KIAlpZiAoYm54dF9kaXJfdHlwZV9pc19leGVjdXRhYmxlKHR5cGUpID09IHRydWUpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJZXh0ID0gZWVwcm9tLT5tYWdpYyAmIDB4ZmZmZjsKIAlvcmRpbmFsID0gZWVwcm9tLT5vZmZzZXQgPj4gMTY7CiAJYXR0ciA9IGVlcHJvbS0+b2Zmc2V0ICYgMHhmZmZmOwpAQCAtMTcxOCw2ICsxODQ5LDI1IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IGJueHRfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByYyA9IDA7CisKKwlzdHJ1Y3QgYm54dCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBibnh0X2xpbmtfaW5mbyAqbGlua19pbmZvID0gJmJwLT5saW5rX2luZm87CisKKwlpZiAoIUJOWFRfU0lOR0xFX1BGKGJwKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCEobGlua19pbmZvLT5hdXRvbmVnICYgQk5YVF9BVVRPTkVHX1NQRUVEKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlyYyA9IGJueHRfaHdybV9zZXRfbGlua19zZXR0aW5nKGJwLCB0cnVlLCBmYWxzZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBibnh0X2V0aHRvb2xfb3BzID0gewogCS5nZXRfbGlua19rc2V0dGluZ3MJPSBibnh0X2dldF9saW5rX2tzZXR0aW5ncywKIAkuc2V0X2xpbmtfa3NldHRpbmdzCT0gYm54dF9zZXRfbGlua19rc2V0dGluZ3MsCkBAIC0xNzUwLDQgKzE5MDAsNSBAQAogCS5zZXRfZWVlCQk9IGJueHRfc2V0X2VlZSwKIAkuZ2V0X21vZHVsZV9pbmZvCT0gYm54dF9nZXRfbW9kdWxlX2luZm8sCiAJLmdldF9tb2R1bGVfZWVwcm9tCT0gYm54dF9nZXRfbW9kdWxlX2VlcHJvbSwKKwkubndheV9yZXNldAkJPSBibnh0X253YXlfcmVzZXQKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZndfaGRyLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZndfaGRyLmgKaW5kZXggODJiZjQ0YS4uY2FkMzBkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2Z3X2hkci5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9md19oZHIuaApAQCAtMTEsNiArMTEsNyBAQAogI2RlZmluZSBfX0JOWFRfRldfSERSX0hfXwogCiAjZGVmaW5lIEJOWFRfRklSTVdBUkVfQklOX1NJR05BVFVSRSAgICAgMHgxYTRkNDM0MgkvKiAiQkNNIisweDFhICovCisjZGVmaW5lIEJOWFRfVUNPREVfVFJBSUxFUl9TSUdOQVRVUkUJMHg3MjZjNzI1NAkvKiAiVHJsciIgKi8KIAogZW51bSBTVVBQT1JURURfRkFNSUxZIHsKIAlERVZJQ0VfNTcwMl8zXzRfRkFNSUxZLAkJLyogMCAgLSBEZW5hbGksIFZpbnNvbiwgSzIgKi8KQEAgLTg1LDcgKzg2LDcgQEAKIAogc3RydWN0IGJueHRfZndfaGVhZGVyIHsKIAlfX2xlMzIgc2lnbmF0dXJlOwkvKiBjb25zdGFpbnMgdGhlIGNvbnN0YW50IHZhbHVlIG9mCi0JCQkJICogQk5YVF9GaXJtd2FyZV9CaW5fU2lnbmF0dXJlcworCQkJCSAqIEJOWFRfRklSTVdBUkVfQklOX1NJR05BVFVSRQogCQkJCSAqLwogCXU4IGZsYWdzOwkJLyogcmVzZXJ2ZWQgZm9yIENoaU1QIHVzZSAqLwogCXU4IGNvZGVfdHlwZTsJCS8qIGVudW0gU1VQUE9SVEVEX0NPREUgKi8KQEAgLTEwMiw0ICsxMDMsMTcgQEAKIAl1OCBtYWpvcl92ZXI7CiB9OwogCisvKiBNaWNyb2NvZGUgYW5kIHByZS1ib290IHNvZnR3YXJlL2Zpcm13YXJlIHRyYWlsZXI6ICovCitzdHJ1Y3QgYm54dF91Y29kZV90cmFpbGVyIHsKKwl1OCByc2Ffc2lnWzI1Nl07CisJX19sZTE2IGZsYWdzOworCXU4IHZlcnNpb25fZm9ybWF0OworCXU4IHZlcnNpb25fbGVuZ3RoOworCXU4IHZlcnNpb25bMTZdOworCV9fbGUxNiBkaXJfdHlwZTsKKwlfX2xlMTYgdHJhaWxlcl9sZW5ndGg7CisJX19sZTMyIHNpZzsJCS8qIEJOWFRfVUNPREVfVFJBSUxFUl9TSUdOQVRVUkUgKi8KKwlfX2xlMzIgY2hrc3VtOwkJLyogQ1JDLTMyICovCit9OworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9oc2kuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9oc2kuaAppbmRleCA1MTc1NjdmLi4wNGE5NmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfaHNpLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2hzaS5oCkBAIC0zOSw3ICszOSw3IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBFSkVDVF9DTVBMX1RZUEVfTUFTSwkJCQkgICAgMHgzZlVMCiAJI2RlZmluZSBFSkVDVF9DTVBMX1RZUEVfU0ZUCQkJCSAgICAwCi0JI2RlZmluZSBFSkVDVF9DTVBMX1RZUEVfU1RBVF9FSkVDVAkJCSAgICgweDFhVUwgPDwgMCkKKwkjZGVmaW5lIEVKRUNUX0NNUExfVFlQRV9TVEFUX0VKRUNUCQkJICAgMHgxYVVMCiAJX19sZTE2IGxlbjsKIAlfX2xlMzIgb3BhcXVlOwogCV9fbGUzMiB2OwpAQCAtNTIsNyArNTIsNyBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9DTVBMX1RZUEVfTUFTSwkJCQkgICAgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0NNUExfVFlQRV9TRlQJCQkJICAgIDAKLQkjZGVmaW5lIEhXUk1fQ01QTF9UWVBFX0hXUk1fRE9ORQkJCSAgICgweDIwVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQ01QTF9UWVBFX0hXUk1fRE9ORQkJCSAgIDB4MjBVTAogCV9fbGUxNiBzZXF1ZW5jZV9pZDsKIAlfX2xlMzIgdW51c2VkXzE7CiAJX19sZTMyIHY7CkBAIC02NSw3ICs2NSw3IEBACiAJX19sZTE2IHJlcV9sZW5fdHlwZTsKIAkjZGVmaW5lIEhXUk1fRldEX1JFUV9DTVBMX1RZUEVfTUFTSwkJCSAgICAweDNmVUwKIAkjZGVmaW5lIEhXUk1fRldEX1JFUV9DTVBMX1RZUEVfU0ZUCQkJICAgIDAKLQkjZGVmaW5lIEhXUk1fRldEX1JFUV9DTVBMX1RZUEVfSFdSTV9GV0RfUkVRCQkgICAoMHgyMlVMIDw8IDApCisJI2RlZmluZSBIV1JNX0ZXRF9SRVFfQ01QTF9UWVBFX0hXUk1fRldEX1JFUQkJICAgMHgyMlVMCiAJI2RlZmluZSBIV1JNX0ZXRF9SRVFfQ01QTF9SRVFfTEVOX01BU0sJCQkgICAgMHhmZmMwVUwKIAkjZGVmaW5lIEhXUk1fRldEX1JFUV9DTVBMX1JFUV9MRU5fU0ZUCQkJICAgIDYKIAlfX2xlMTYgc291cmNlX2lkOwpAQCAtODEsNyArODEsNyBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9GV0RfUkVTUF9DTVBMX1RZUEVfTUFTSwkJCSAgICAweDNmVUwKIAkjZGVmaW5lIEhXUk1fRldEX1JFU1BfQ01QTF9UWVBFX1NGVAkJCSAgICAwCi0JI2RlZmluZSBIV1JNX0ZXRF9SRVNQX0NNUExfVFlQRV9IV1JNX0ZXRF9SRVNQCQkgICAoMHgyNFVMIDw8IDApCisJI2RlZmluZSBIV1JNX0ZXRF9SRVNQX0NNUExfVFlQRV9IV1JNX0ZXRF9SRVNQCQkgICAweDI0VUwKIAlfX2xlMTYgc291cmNlX2lkOwogCV9fbGUxNiByZXNwX2xlbjsKIAlfX2xlMTYgdW51c2VkXzE7CkBAIC05NiwyNSArOTYsMjYgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9UWVBFX01BU0sJCSAgICAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9UWVBFX1NGVAkJCSAgICAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICAgICAgICgweDJlVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgICAgICAgMHgyZVVMCiAJX19sZTE2IGV2ZW50X2lkOwotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0xJTktfU1RBVFVTX0NIQU5HRSAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9MSU5LX01UVV9DSEFOR0UgICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfTElOS19TUEVFRF9DSEFOR0UgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0RDQl9DT05GSUdfQ0hBTkdFICAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9QT1JUX0NPTk5fTk9UX0FMTE9XRUQgKDB4NFVMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfTElOS19TUEVFRF9DRkdfTk9UX0FMTE9XRUQgKDB4NVVMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfTElOS19TUEVFRF9DRkdfQ0hBTkdFICgweDZVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX1BPUlRfUEhZX0NGR19DSEFOR0UgKDB4N1VMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfRlVOQ19EUlZSX1VOTE9BRCAgICgweDEwVUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9GVU5DX0RSVlJfTE9BRCAgICAgKDB4MTFVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX1BGX0RSVlJfVU5MT0FEICAgICAoMHgyMFVMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfUEZfRFJWUl9MT0FEICAgICAgICgweDIxVUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9WRl9GTFIJCSAgICgweDMwVUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9WRl9NQUNfQUREUl9DSEFOR0UgKDB4MzFVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX1BGX1ZGX0NPTU1fU1RBVFVTX0NIQU5HRSAoMHgzMlVMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfVkZfQ0ZHX0NIQU5HRSAgICAgICgweDMzVUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9IV1JNX0VSUk9SCSAgICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9MSU5LX1NUQVRVU19DSEFOR0UgMHgwVUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9MSU5LX01UVV9DSEFOR0UgICAgMHgxVUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9MSU5LX1NQRUVEX0NIQU5HRSAgMHgyVUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9EQ0JfQ09ORklHX0NIQU5HRSAgMHgzVUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9QT1JUX0NPTk5fTk9UX0FMTE9XRUQgMHg0VUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9MSU5LX1NQRUVEX0NGR19OT1RfQUxMT1dFRCAweDVVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0xJTktfU1BFRURfQ0ZHX0NIQU5HRSAweDZVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX1BPUlRfUEhZX0NGR19DSEFOR0UgMHg3VUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9GVU5DX0RSVlJfVU5MT0FEICAgMHgxMFVMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfRlVOQ19EUlZSX0xPQUQgICAgIDB4MTFVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0ZVTkNfRkxSX1BST0NfQ01QTFQgMHgxMlVMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfUEZfRFJWUl9VTkxPQUQgICAgIDB4MjBVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX1BGX0RSVlJfTE9BRCAgICAgICAweDIxVUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9WRl9GTFIJCSAgIDB4MzBVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX1ZGX01BQ19BRERSX0NIQU5HRSAweDMxVUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9QRl9WRl9DT01NX1NUQVRVU19DSEFOR0UgMHgzMlVMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfVkZfQ0ZHX0NIQU5HRSAgICAgIDB4MzNVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0hXUk1fRVJST1IJICAgMHhmZlVMCiAJX19sZTMyIGV2ZW50X2RhdGEyOwogCXU4IG9wYXF1ZV92OwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1YJCQkgICAgMHgxVUwKQEAgLTEzMCw5ICsxMzEsOSBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1RBVFVTX0NIQU5HRV9UWVBFX01BU0sgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TVEFUVVNfQ0hBTkdFX1RZUEVfU0ZUICAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TVEFUVVNfQ0hBTkdFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAoMHgyZVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TVEFUVVNfQ0hBTkdFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAweDJlVUwKIAlfX2xlMTYgZXZlbnRfaWQ7Ci0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TVEFUVVNfQ0hBTkdFX0VWRU5UX0lEX0xJTktfU1RBVFVTX0NIQU5HRSAoMHgwVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NUQVRVU19DSEFOR0VfRVZFTlRfSURfTElOS19TVEFUVVNfQ0hBTkdFIDB4MFVMCiAJX19sZTMyIGV2ZW50X2RhdGEyOwogCXU4IG9wYXF1ZV92OwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1RBVFVTX0NIQU5HRV9WCSAgICAweDFVTApAQCAtMTU2LDkgKzE1Nyw5IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19NVFVfQ0hBTkdFX1RZUEVfTUFTSyAgICAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX01UVV9DSEFOR0VfVFlQRV9TRlQgICAgIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX01UVV9DSEFOR0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICgweDJlVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX01UVV9DSEFOR0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UIDB4MmVVTAogCV9fbGUxNiBldmVudF9pZDsKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX01UVV9DSEFOR0VfRVZFTlRfSURfTElOS19NVFVfQ0hBTkdFICgweDFVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfTVRVX0NIQU5HRV9FVkVOVF9JRF9MSU5LX01UVV9DSEFOR0UgMHgxVUwKIAlfX2xlMzIgZXZlbnRfZGF0YTI7CiAJdTggb3BhcXVlX3Y7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19NVFVfQ0hBTkdFX1YJICAgIDB4MVVMCkBAIC0xNzYsOSArMTc3LDkgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NIQU5HRV9UWVBFX01BU0sgIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0hBTkdFX1RZUEVfU0ZUICAgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0hBTkdFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAoMHgyZVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DSEFOR0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UIDB4MmVVTAogCV9fbGUxNiBldmVudF9pZDsKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NIQU5HRV9FVkVOVF9JRF9MSU5LX1NQRUVEX0NIQU5HRSAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NIQU5HRV9FVkVOVF9JRF9MSU5LX1NQRUVEX0NIQU5HRSAweDJVTAogCV9fbGUzMiBldmVudF9kYXRhMjsKIAl1OCBvcGFxdWVfdjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NIQU5HRV9WCSAgICAweDFVTApAQCAtMjAwLDggKzIwMSw3IEBACiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DSEFOR0VfRVZFTlRfREFUQTFfTkVXX0xJTktfU1BFRURfMTAwTUJQU180MEdCICgweDE5MFVMIDw8IDEpCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DSEFOR0VfRVZFTlRfREFUQTFfTkVXX0xJTktfU1BFRURfMTAwTUJQU181MEdCICgweDFmNFVMIDw8IDEpCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DSEFOR0VfRVZFTlRfREFUQTFfTkVXX0xJTktfU1BFRURfMTAwTUJQU18xMDBHQiAoMHgzZThVTCA8PCAxKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0hBTkdFX0VWRU5UX0RBVEExX05FV19MSU5LX1NQRUVEXzEwME1CUFNfMTBNQiAoMHhmZmZmVUwgPDwgMSkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NIQU5HRV9FVkVOVF9EQVRBMV9ORVdfTElOS19TUEVFRF8xMDBNQlBTX0xBU1QgICAgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0hBTkdFX0VWRU5UX0RBVEExX05FV19MSU5LX1NQRUVEXzEwME1CUFNfMTBNQgorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0hBTkdFX0VWRU5UX0RBVEExX05FV19MSU5LX1NQRUVEXzEwME1CUFNfTEFTVCAgICBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DSEFOR0VfRVZFTlRfREFUQTFfTkVXX0xJTktfU1BFRURfMTAwTUJQU18xMDBHQgogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0hBTkdFX0VWRU5UX0RBVEExX1BPUlRfSURfTUFTSyAweGZmZmYwMDAwVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NIQU5HRV9FVkVOVF9EQVRBMV9QT1JUX0lEX1NGVCAxNgogfTsKQEAgLTIxMSw5ICsyMTEsOSBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0RDQl9DT05GSUdfQ0hBTkdFX1RZUEVfTUFTSyAgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRENCX0NPTkZJR19DSEFOR0VfVFlQRV9TRlQgICAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRENCX0NPTkZJR19DSEFOR0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICgweDJlVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9EQ0JfQ09ORklHX0NIQU5HRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgMHgyZVVMCiAJX19sZTE2IGV2ZW50X2lkOwotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0RDQl9DT05GSUdfQ0hBTkdFX0VWRU5UX0lEX0RDQl9DT05GSUdfQ0hBTkdFICgweDNVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0RDQl9DT05GSUdfQ0hBTkdFX0VWRU5UX0lEX0RDQl9DT05GSUdfQ0hBTkdFIDB4M1VMCiAJX19sZTMyIGV2ZW50X2RhdGEyOwogCXU4IG9wYXF1ZV92OwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0RDQl9DT05GSUdfQ0hBTkdFX1YJICAgIDB4MVVMCkBAIC0yMzEsOSArMjMxLDkgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QT1JUX0NPTk5fTk9UX0FMTE9XRURfVFlQRV9NQVNLIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BPUlRfQ09OTl9OT1RfQUxMT1dFRF9UWVBFX1NGVCAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUE9SVF9DT05OX05PVF9BTExPV0VEX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAoMHgyZVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUE9SVF9DT05OX05PVF9BTExPV0VEX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAweDJlVUwKIAlfX2xlMTYgZXZlbnRfaWQ7Ci0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUE9SVF9DT05OX05PVF9BTExPV0VEX0VWRU5UX0lEX1BPUlRfQ09OTl9OT1RfQUxMT1dFRCAoMHg0VUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QT1JUX0NPTk5fTk9UX0FMTE9XRURfRVZFTlRfSURfUE9SVF9DT05OX05PVF9BTExPV0VEIDB4NFVMCiAJX19sZTMyIGV2ZW50X2RhdGEyOwogCXU4IG9wYXF1ZV92OwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BPUlRfQ09OTl9OT1RfQUxMT1dFRF9WICAgICAgMHgxVUwKQEAgLTI1OCw5ICsyNTgsOSBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0ZHX05PVF9BTExPV0VEX1RZUEVfTUFTSyAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NGR19OT1RfQUxMT1dFRF9UWVBFX1NGVCAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DRkdfTk9UX0FMTE9XRURfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICgweDJlVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NGR19OT1RfQUxMT1dFRF9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgMHgyZVVMCiAJX19sZTE2IGV2ZW50X2lkOwotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0ZHX05PVF9BTExPV0VEX0VWRU5UX0lEX0xJTktfU1BFRURfQ0ZHX05PVF9BTExPV0VEICgweDVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0ZHX05PVF9BTExPV0VEX0VWRU5UX0lEX0xJTktfU1BFRURfQ0ZHX05PVF9BTExPV0VEIDB4NVVMCiAJX19sZTMyIGV2ZW50X2RhdGEyOwogCXU4IG9wYXF1ZV92OwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0ZHX05PVF9BTExPV0VEX1YgMHgxVUwKQEAgLTI3OCw5ICsyNzgsOSBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0ZHX0NIQU5HRV9UWVBFX01BU0sgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DRkdfQ0hBTkdFX1RZUEVfU0ZUIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NGR19DSEFOR0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICgweDJlVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NGR19DSEFOR0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UIDB4MmVVTAogCV9fbGUxNiBldmVudF9pZDsKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NGR19DSEFOR0VfRVZFTlRfSURfTElOS19TUEVFRF9DRkdfQ0hBTkdFICgweDZVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0ZHX0NIQU5HRV9FVkVOVF9JRF9MSU5LX1NQRUVEX0NGR19DSEFOR0UgMHg2VUwKIAlfX2xlMzIgZXZlbnRfZGF0YTI7CiAJdTggb3BhcXVlX3Y7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DRkdfQ0hBTkdFX1YgICAgICAweDFVTApAQCAtMzAwLDkgKzMwMCw5IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRlVOQ19EUlZSX1VOTE9BRF9UWVBFX01BU0sgICAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9GVU5DX0RSVlJfVU5MT0FEX1RZUEVfU0ZUICAgIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9GVU5DX0RSVlJfVU5MT0FEX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAoMHgyZVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRlVOQ19EUlZSX1VOTE9BRF9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgMHgyZVVMCiAJX19sZTE2IGV2ZW50X2lkOwotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0ZVTkNfRFJWUl9VTkxPQURfRVZFTlRfSURfRlVOQ19EUlZSX1VOTE9BRCAoMHgxMFVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRlVOQ19EUlZSX1VOTE9BRF9FVkVOVF9JRF9GVU5DX0RSVlJfVU5MT0FEIDB4MTBVTAogCV9fbGUzMiBldmVudF9kYXRhMjsKIAl1OCBvcGFxdWVfdjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9GVU5DX0RSVlJfVU5MT0FEX1YJICAgIDB4MVVMCkBAIC0zMjAsOSArMzIwLDkgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9GVU5DX0RSVlJfTE9BRF9UWVBFX01BU0sgICAgIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0ZVTkNfRFJWUl9MT0FEX1RZUEVfU0ZUICAgICAgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0ZVTkNfRFJWUl9MT0FEX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAoMHgyZVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRlVOQ19EUlZSX0xPQURfVFlQRV9IV1JNX0FTWU5DX0VWRU5UIDB4MmVVTAogCV9fbGUxNiBldmVudF9pZDsKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9GVU5DX0RSVlJfTE9BRF9FVkVOVF9JRF9GVU5DX0RSVlJfTE9BRCAoMHgxMVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRlVOQ19EUlZSX0xPQURfRVZFTlRfSURfRlVOQ19EUlZSX0xPQUQgMHgxMVVMCiAJX19sZTMyIGV2ZW50X2RhdGEyOwogCXU4IG9wYXF1ZV92OwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0ZVTkNfRFJWUl9MT0FEX1YJCSAgICAweDFVTApAQCAtMzQwLDkgKzM0MCw5IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfRFJWUl9VTkxPQURfVFlQRV9NQVNLICAgICAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9EUlZSX1VOTE9BRF9UWVBFX1NGVCAgICAgIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9EUlZSX1VOTE9BRF9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgKDB4MmVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX0RSVlJfVU5MT0FEX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAweDJlVUwKIAlfX2xlMTYgZXZlbnRfaWQ7Ci0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfRFJWUl9VTkxPQURfRVZFTlRfSURfUEZfRFJWUl9VTkxPQUQgKDB4MjBVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX0RSVlJfVU5MT0FEX0VWRU5UX0lEX1BGX0RSVlJfVU5MT0FEIDB4MjBVTAogCV9fbGUzMiBldmVudF9kYXRhMjsKIAl1OCBvcGFxdWVfdjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9EUlZSX1VOTE9BRF9WCQkgICAgMHgxVUwKQEAgLTM2Miw5ICszNjIsOSBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX0RSVlJfTE9BRF9UWVBFX01BU0sgICAgICAgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfRFJWUl9MT0FEX1RZUEVfU0ZUCSAgICAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfRFJWUl9MT0FEX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAoMHgyZVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfRFJWUl9MT0FEX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAweDJlVUwKIAlfX2xlMTYgZXZlbnRfaWQ7Ci0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfRFJWUl9MT0FEX0VWRU5UX0lEX1BGX0RSVlJfTE9BRCAoMHgyMVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfRFJWUl9MT0FEX0VWRU5UX0lEX1BGX0RSVlJfTE9BRCAweDIxVUwKIAlfX2xlMzIgZXZlbnRfZGF0YTI7CiAJdTggb3BhcXVlX3Y7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfRFJWUl9MT0FEX1YJCSAgICAweDFVTApAQCAtMzg0LDkgKzM4NCw5IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfRkxSX1RZUEVfTUFTSwkJICAgIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX0ZMUl9UWVBFX1NGVAkJICAgIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9GTFJfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICgweDJlVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9GTFJfVFlQRV9IV1JNX0FTWU5DX0VWRU5UIDB4MmVVTAogCV9fbGUxNiBldmVudF9pZDsKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9GTFJfRVZFTlRfSURfVkZfRkxSICAgICAgKDB4MzBVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX0ZMUl9FVkVOVF9JRF9WRl9GTFIgICAgICAweDMwVUwKIAlfX2xlMzIgZXZlbnRfZGF0YTI7CiAJdTggb3BhcXVlX3Y7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfRkxSX1YJCQkgICAgMHgxVUwKQEAgLTQwNCw5ICs0MDQsOSBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX01BQ19BRERSX0NIQU5HRV9UWVBFX01BU0sgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfTUFDX0FERFJfQ0hBTkdFX1RZUEVfU0ZUICAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfTUFDX0FERFJfQ0hBTkdFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAoMHgyZVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfTUFDX0FERFJfQ0hBTkdFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAweDJlVUwKIAlfX2xlMTYgZXZlbnRfaWQ7Ci0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfTUFDX0FERFJfQ0hBTkdFX0VWRU5UX0lEX1ZGX01BQ19BRERSX0NIQU5HRSAoMHgzMVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfTUFDX0FERFJfQ0hBTkdFX0VWRU5UX0lEX1ZGX01BQ19BRERSX0NIQU5HRSAweDMxVUwKIAlfX2xlMzIgZXZlbnRfZGF0YTI7CiAJdTggb3BhcXVlX3Y7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfTUFDX0FERFJfQ0hBTkdFX1YJICAgIDB4MVVMCkBAIC00MjQsOSArNDI0LDkgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9WRl9DT01NX1NUQVRVU19DSEFOR0VfVFlQRV9NQVNLIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX1ZGX0NPTU1fU1RBVFVTX0NIQU5HRV9UWVBFX1NGVCAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfVkZfQ09NTV9TVEFUVVNfQ0hBTkdFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAoMHgyZVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfVkZfQ09NTV9TVEFUVVNfQ0hBTkdFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAweDJlVUwKIAlfX2xlMTYgZXZlbnRfaWQ7Ci0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfVkZfQ09NTV9TVEFUVVNfQ0hBTkdFX0VWRU5UX0lEX1BGX1ZGX0NPTU1fU1RBVFVTX0NIQU5HRSAoMHgzMlVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfVkZfQ09NTV9TVEFUVVNfQ0hBTkdFX0VWRU5UX0lEX1BGX1ZGX0NPTU1fU1RBVFVTX0NIQU5HRSAweDMyVUwKIAlfX2xlMzIgZXZlbnRfZGF0YTI7CiAJdTggb3BhcXVlX3Y7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfVkZfQ09NTV9TVEFUVVNfQ0hBTkdFX1YgICAweDFVTApAQCAtNDQzLDkgKzQ0Myw5IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfQ0ZHX0NIQU5HRV9UWVBFX01BU0sgICAgICAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9DRkdfQ0hBTkdFX1RZUEVfU0ZUICAgICAgIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9DRkdfQ0hBTkdFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAoMHgyZVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfQ0ZHX0NIQU5HRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgMHgyZVVMCiAJX19sZTE2IGV2ZW50X2lkOwotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX0NGR19DSEFOR0VfRVZFTlRfSURfVkZfQ0ZHX0NIQU5HRSAoMHgzM1VMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfQ0ZHX0NIQU5HRV9FVkVOVF9JRF9WRl9DRkdfQ0hBTkdFIDB4MzNVTAogCV9fbGUzMiBldmVudF9kYXRhMjsKIAl1OCBvcGFxdWVfdjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9DRkdfQ0hBTkdFX1YJCSAgICAweDFVTApAQCAtNDY1LDE1ICs0NjUsMTUgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX1RZUEVfTUFTSwkgICAgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9UWVBFX1NGVAkgICAgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICgweDJlVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAweDJlVUwKIAlfX2xlMTYgZXZlbnRfaWQ7Ci0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9FVkVOVF9JRF9IV1JNX0VSUk9SICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX0VWRU5UX0lEX0hXUk1fRVJST1IgMHhmZlVMCiAJX19sZTMyIGV2ZW50X2RhdGEyOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfRVZFTlRfREFUQTJfU0VWRVJJVFlfTUFTSyAweGZmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX0VWRU5UX0RBVEEyX1NFVkVSSVRZX1NGVCAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9FVkVOVF9EQVRBMl9TRVZFUklUWV9XQVJOSU5HICgweDBVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfRVZFTlRfREFUQTJfU0VWRVJJVFlfTk9ORkFUQUwgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9FVkVOVF9EQVRBMl9TRVZFUklUWV9GQVRBTCAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX0VWRU5UX0RBVEEyX1NFVkVSSVRZX1dBUk5JTkcgMHgwVUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX0VWRU5UX0RBVEEyX1NFVkVSSVRZX05PTkZBVEFMIDB4MVVMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9FVkVOVF9EQVRBMl9TRVZFUklUWV9GQVRBTCAweDJVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfRVZFTlRfREFUQTJfU0VWRVJJVFlfTEFTVCAgICBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9FVkVOVF9EQVRBMl9TRVZFUklUWV9GQVRBTAogCXU4IG9wYXF1ZV92OwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfVgkJICAgIDB4MVVMCkBAIC00ODUsMTIgKzQ4NSwxMiBAQAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfRVZFTlRfREFUQTFfVElNRVNUQU1QIDB4MVVMCiB9OwogCi0vKiBIVyBSZXNvdXJjZSBNYW5hZ2VyIFNwZWNpZmljYXRpb24gMS4zLjAgKi8KKy8qIEhXIFJlc291cmNlIE1hbmFnZXIgU3BlY2lmaWNhdGlvbiAxLjUuMSAqLwogI2RlZmluZSBIV1JNX1ZFUlNJT05fTUFKT1IJMQotI2RlZmluZSBIV1JNX1ZFUlNJT05fTUlOT1IJMwotI2RlZmluZSBIV1JNX1ZFUlNJT05fVVBEQVRFCTAKKyNkZWZpbmUgSFdSTV9WRVJTSU9OX01JTk9SCTUKKyNkZWZpbmUgSFdSTV9WRVJTSU9OX1VQREFURQkxCiAKLSNkZWZpbmUgSFdSTV9WRVJTSU9OX1NUUgkiMS4zLjAiCisjZGVmaW5lIEhXUk1fVkVSU0lPTl9TVFIJIjEuNS4xIgogLyoKICAqIEZvbGxvd2luZyBpcyB0aGUgc2lnbmF0dXJlIGZvciBIV1JNIG1lc3NhZ2UgZmllbGQgdGhhdCBpbmRpY2F0ZXMgbm90CiAgKiBhcHBsaWNhYmxlIChBbGwgRidzKS4gTmVlZCB0byBjYXN0IGl0IHRoZSBzaXplIG9mIHRoZSBmaWVsZCBpZiBuZWVkZWQuCkBAIC01NTYsOCArNTU2LDggQEAKIAkjZGVmaW5lIEhXUk1fUVVFVUVfUVBPUlRDRkcJCQkJICAgKDB4MzBVTCkKIAkjZGVmaW5lIEhXUk1fUVVFVUVfUUNGRwkJCQkgICAoMHgzMVVMKQogCSNkZWZpbmUgSFdSTV9RVUVVRV9DRkcJCQkJCSAgICgweDMyVUwpCi0JI2RlZmluZSBIV1JNX1FVRVVFX0JVRkZFUlNfUUNGRwkJCSAgICgweDMzVUwpCi0JI2RlZmluZSBIV1JNX1FVRVVFX0JVRkZFUlNfQ0ZHCQkJCSAgICgweDM0VUwpCisJI2RlZmluZSBSRVNFUlZFRDIJCQkJCSAgICgweDMzVUwpCisJI2RlZmluZSBSRVNFUlZFRDMJCQkJCSAgICgweDM0VUwpCiAJI2RlZmluZSBIV1JNX1FVRVVFX1BGQ0VOQUJMRV9RQ0ZHCQkJICAgKDB4MzVVTCkKIAkjZGVmaW5lIEhXUk1fUVVFVUVfUEZDRU5BQkxFX0NGRwkJCSAgICgweDM2VUwpCiAJI2RlZmluZSBIV1JNX1FVRVVFX1BSSTJDT1NfUUNGRwkJCSAgICgweDM3VUwpCkBAIC01NzQsNiArNTc0LDcgQEAKIAkjZGVmaW5lIEhXUk1fVk5JQ19SU1NfUUNGRwkJCQkgICAoMHg0N1VMKQogCSNkZWZpbmUgSFdSTV9WTklDX1BMQ01PREVTX0NGRwkJCQkgICAoMHg0OFVMKQogCSNkZWZpbmUgSFdSTV9WTklDX1BMQ01PREVTX1FDRkcJCQkgICAoMHg0OVVMKQorCSNkZWZpbmUgSFdSTV9WTklDX1FDQVBTCQkJCSAgICgweDRhVUwpCiAJI2RlZmluZSBIV1JNX1JJTkdfQUxMT0MJCQkJICAgKDB4NTBVTCkKIAkjZGVmaW5lIEhXUk1fUklOR19GUkVFCQkJCQkgICAoMHg1MVVMKQogCSNkZWZpbmUgSFdSTV9SSU5HX0NNUExfUklOR19RQUdHSU5UX1BBUkFNUwkJICAgKDB4NTJVTCkKQEAgLTU4MSwxMyArNTgyLDE1IEBACiAJI2RlZmluZSBIV1JNX1JJTkdfUkVTRVQJCQkJICAgKDB4NWVVTCkKIAkjZGVmaW5lIEhXUk1fUklOR19HUlBfQUxMT0MJCQkJICAgKDB4NjBVTCkKIAkjZGVmaW5lIEhXUk1fUklOR19HUlBfRlJFRQkJCQkgICAoMHg2MVVMKQorCSNkZWZpbmUgUkVTRVJWRUQ1CQkJCQkgICAoMHg2NFVMKQorCSNkZWZpbmUgUkVTRVJWRUQ2CQkJCQkgICAoMHg2NVVMKQogCSNkZWZpbmUgSFdSTV9WTklDX1JTU19DT1NfTEJfQ1RYX0FMTE9DCQkJICAgKDB4NzBVTCkKIAkjZGVmaW5lIEhXUk1fVk5JQ19SU1NfQ09TX0xCX0NUWF9GUkVFCQkJICAgKDB4NzFVTCkKIAkjZGVmaW5lIEhXUk1fQ0ZBX0wyX0ZJTFRFUl9BTExPQwkJCSAgICgweDkwVUwpCiAJI2RlZmluZSBIV1JNX0NGQV9MMl9GSUxURVJfRlJFRQkJCSAgICgweDkxVUwpCiAJI2RlZmluZSBIV1JNX0NGQV9MMl9GSUxURVJfQ0ZHCQkJCSAgICgweDkyVUwpCiAJI2RlZmluZSBIV1JNX0NGQV9MMl9TRVRfUlhfTUFTSwkJCSAgICgweDkzVUwpCi0JI2RlZmluZSBSRVNFUlZFRDMJCQkJCSAgICgweDk0VUwpCisJI2RlZmluZSBSRVNFUlZFRDQJCQkJCSAgICgweDk0VUwpCiAJI2RlZmluZSBIV1JNX0NGQV9UVU5ORUxfRklMVEVSX0FMTE9DCQkJICAgKDB4OTVVTCkKIAkjZGVmaW5lIEhXUk1fQ0ZBX1RVTk5FTF9GSUxURVJfRlJFRQkJCSAgICgweDk2VUwpCiAJI2RlZmluZSBIV1JNX0NGQV9FTkNBUF9SRUNPUkRfQUxMT0MJCQkgICAoMHg5N1VMKQpAQCAtNjA3LDYgKzYxMCw4IEBACiAJI2RlZmluZSBIV1JNX1NUQVRfQ1RYX0NMUl9TVEFUUwkJCSAgICgweGIzVUwpCiAJI2RlZmluZSBIV1JNX0ZXX1JFU0VUCQkJCQkgICAoMHhjMFVMKQogCSNkZWZpbmUgSFdSTV9GV19RU1RBVFVTCQkJCSAgICgweGMxVUwpCisJI2RlZmluZSBIV1JNX0ZXX1NFVF9USU1FCQkJCSAgICgweGM4VUwpCisJI2RlZmluZSBIV1JNX0ZXX0dFVF9USU1FCQkJCSAgICgweGM5VUwpCiAJI2RlZmluZSBIV1JNX0VYRUNfRldEX1JFU1AJCQkJICAgKDB4ZDBVTCkKIAkjZGVmaW5lIEhXUk1fUkVKRUNUX0ZXRF9SRVNQCQkJCSAgICgweGQxVUwpCiAJI2RlZmluZSBIV1JNX0ZXRF9SRVNQCQkJCQkgICAoMHhkMlVMKQpAQCAtNjE1LDExICs2MjAsMTMgQEAKIAkjZGVmaW5lIEhXUk1fV09MX0ZJTFRFUl9BTExPQwkJCQkgICAoMHhmMFVMKQogCSNkZWZpbmUgSFdSTV9XT0xfRklMVEVSX0ZSRUUJCQkJICAgKDB4ZjFVTCkKIAkjZGVmaW5lIEhXUk1fV09MX0ZJTFRFUl9RQ0ZHCQkJCSAgICgweGYyVUwpCisJI2RlZmluZSBIV1JNX1dPTF9SRUFTT05fUUNGRwkJCQkgICAoMHhmM1VMKQogCSNkZWZpbmUgSFdSTV9EQkdfUkVBRF9ESVJFQ1QJCQkJICAgKDB4ZmYxMFVMKQogCSNkZWZpbmUgSFdSTV9EQkdfUkVBRF9JTkRJUkVDVAkJCQkgICAoMHhmZjExVUwpCiAJI2RlZmluZSBIV1JNX0RCR19XUklURV9ESVJFQ1QJCQkJICAgKDB4ZmYxMlVMKQogCSNkZWZpbmUgSFdSTV9EQkdfV1JJVEVfSU5ESVJFQ1QJCQkgICAoMHhmZjEzVUwpCiAJI2RlZmluZSBIV1JNX0RCR19EVU1QCQkJCQkgICAoMHhmZjE0VUwpCisJI2RlZmluZSBIV1JNX05WTV9JTlNUQUxMX1VQREFURQkJCSAgICgweGZmZjNVTCkKIAkjZGVmaW5lIEhXUk1fTlZNX01PRElGWQkJCQkgICAoMHhmZmY0VUwpCiAJI2RlZmluZSBIV1JNX05WTV9WRVJJRllfVVBEQVRFCQkJCSAgICgweGZmZjVVTCkKIAkjZGVmaW5lIEhXUk1fTlZNX0dFVF9ERVZfSU5GTwkJCQkgICAoMHhmZmY2VUwpCkBAIC04MjQsNyArODMxLDkgQEAKIAl1OCBuZXRjdHJsX2Z3X21pbjsKIAl1OCBuZXRjdHJsX2Z3X2JsZDsKIAl1OCBuZXRjdHJsX2Z3X3JzdmQ7Ci0JX19sZTMyIHJlc2VydmVkMTsKKwlfX2xlMzIgZGV2X2NhcHNfY2ZnOworCSNkZWZpbmUgVkVSX0dFVF9SRVNQX0RFVl9DQVBTX0NGR19TRUNVUkVfRldfVVBEX1NVUFBPUlRFRCAgMHgxVUwKKwkjZGVmaW5lIFZFUl9HRVRfUkVTUF9ERVZfQ0FQU19DRkdfRldfRENCWF9BR0VOVF9TVVBQT1JURUQgIDB4MlVMCiAJdTggcm9jZV9md19tYWo7CiAJdTggcm9jZV9md19taW47CiAJdTggcm9jZV9md19ibGQ7CkBAIC04MzksOSArODQ4LDkgQEAKIAl1OCBjaGlwX21ldGFsOwogCXU4IGNoaXBfYm9uZF9pZDsKIAl1OCBjaGlwX3BsYXRmb3JtX3R5cGU7Ci0JI2RlZmluZSBWRVJfR0VUX1JFU1BfQ0hJUF9QTEFURk9STV9UWVBFX0FTSUMJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgVkVSX0dFVF9SRVNQX0NISVBfUExBVEZPUk1fVFlQRV9GUEdBCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFZFUl9HRVRfUkVTUF9DSElQX1BMQVRGT1JNX1RZUEVfUEFMTEFESVVNCSAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgVkVSX0dFVF9SRVNQX0NISVBfUExBVEZPUk1fVFlQRV9BU0lDCQkgICAweDBVTAorCSNkZWZpbmUgVkVSX0dFVF9SRVNQX0NISVBfUExBVEZPUk1fVFlQRV9GUEdBCQkgICAweDFVTAorCSNkZWZpbmUgVkVSX0dFVF9SRVNQX0NISVBfUExBVEZPUk1fVFlQRV9QQUxMQURJVU0JICAgMHgyVUwKIAlfX2xlMTYgbWF4X3JlcV93aW5fbGVuOwogCV9fbGUxNiBtYXhfcmVzcF9sZW47CiAJX19sZTE2IGRlZl9yZXFfdGltZW91dDsKQEAgLTg2MywxMCArODcyLDEwIEBACiAJI2RlZmluZSBGVU5DX1JFU0VUX1JFUV9FTkFCTEVTX1ZGX0lEX1ZBTElECQkgICAgMHgxVUwKIAlfX2xlMTYgdmZfaWQ7CiAJdTggZnVuY19yZXNldF9sZXZlbDsKLQkjZGVmaW5lIEZVTkNfUkVTRVRfUkVRX0ZVTkNfUkVTRVRfTEVWRUxfUkVTRVRBTEwJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBGVU5DX1JFU0VUX1JFUV9GVU5DX1JFU0VUX0xFVkVMX1JFU0VUTUUJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBGVU5DX1JFU0VUX1JFUV9GVU5DX1JFU0VUX0xFVkVMX1JFU0VUQ0hJTERSRU4gICAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19SRVNFVF9SRVFfRlVOQ19SRVNFVF9MRVZFTF9SRVNFVFZGCSAgICgweDNVTCA8PCAwKQorCSNkZWZpbmUgRlVOQ19SRVNFVF9SRVFfRlVOQ19SRVNFVF9MRVZFTF9SRVNFVEFMTAkgICAweDBVTAorCSNkZWZpbmUgRlVOQ19SRVNFVF9SRVFfRlVOQ19SRVNFVF9MRVZFTF9SRVNFVE1FCSAgIDB4MVVMCisJI2RlZmluZSBGVU5DX1JFU0VUX1JFUV9GVU5DX1JFU0VUX0xFVkVMX1JFU0VUQ0hJTERSRU4gICAgIDB4MlVMCisJI2RlZmluZSBGVU5DX1JFU0VUX1JFUV9GVU5DX1JFU0VUX0xFVkVMX1JFU0VUVkYJICAgMHgzVUwKIAl1OCB1bnVzZWRfMDsKIH07CiAKQEAgLTEwMjgsNiArMTAzNywxMCBAQAogCSNkZWZpbmUgRlVOQ19RQ0FQU19SRVNQX0ZMQUdTX1JPQ0VfVjJfU1VQUE9SVEVECSAgICAweDEwVUwKIAkjZGVmaW5lIEZVTkNfUUNBUFNfUkVTUF9GTEFHU19XT0xfTUFHSUNQS1RfU1VQUE9SVEVEICAgICAgIDB4MjBVTAogCSNkZWZpbmUgRlVOQ19RQ0FQU19SRVNQX0ZMQUdTX1dPTF9CTVBfU1VQUE9SVEVECSAgICAweDQwVUwKKwkjZGVmaW5lIEZVTkNfUUNBUFNfUkVTUF9GTEFHU19UWF9SSU5HX1JMX1NVUFBPUlRFRAkgICAgMHg4MFVMCisJI2RlZmluZSBGVU5DX1FDQVBTX1JFU1BfRkxBR1NfVFhfQldfQ0ZHX1NVUFBPUlRFRAkgICAgMHgxMDBVTAorCSNkZWZpbmUgRlVOQ19RQ0FQU19SRVNQX0ZMQUdTX1ZGX1RYX1JJTkdfUkxfU1VQUE9SVEVEICAgICAgMHgyMDBVTAorCSNkZWZpbmUgRlVOQ19RQ0FQU19SRVNQX0ZMQUdTX1ZGX0JXX0NGR19TVVBQT1JURUQJICAgIDB4NDAwVUwKIAl1OCBtYWNfYWRkcmVzc1s2XTsKIAlfX2xlMTYgbWF4X3Jzc2Nvc19jdHg7CiAJX19sZTE2IG1heF9jbXBsX3JpbmdzOwpAQCAtMTA0Nyw5ICsxMDYwLDggQEAKIAlfX2xlMzIgbWF4X21jYXN0X2ZpbHRlcnM7CiAJX19sZTMyIG1heF9mbG93X2lkOwogCV9fbGUzMiBtYXhfaHdfcmluZ19ncnBzOworCV9fbGUxNiBtYXhfc3BfdHhfcmluZ3M7CiAJdTggdW51c2VkXzA7Ci0JdTggdW51c2VkXzE7Ci0JdTggdW51c2VkXzI7CiAJdTggdmFsaWQ7CiB9OwogCkBAIC0xMDc3LDYgKzEwODksNyBAQAogCV9fbGUxNiBmbGFnczsKIAkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX0ZMQUdTX09PQl9XT0xfTUFHSUNQS1RfRU5BQkxFRCAgICAgIDB4MVVMCiAJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9GTEFHU19PT0JfV09MX0JNUF9FTkFCTEVECSAgICAweDJVTAorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfRkxBR1NfRldfRENCWF9BR0VOVF9FTkFCTEVECSAgICAweDRVTAogCXU4IG1hY19hZGRyZXNzWzZdOwogCV9fbGUxNiBwY2lfaWQ7CiAJX19sZTE2IGFsbG9jX3Jzc2Nvc19jdHg7CkBAIC0xMDg5LDI5ICsxMTAyLDQ2IEBACiAJX19sZTE2IG1ydTsKIAlfX2xlMTYgc3RhdF9jdHhfaWQ7CiAJdTggcG9ydF9wYXJ0aXRpb25fdHlwZTsKLQkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX1BPUlRfUEFSVElUSU9OX1RZUEVfU1BGCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX1BPUlRfUEFSVElUSU9OX1RZUEVfTVBGUwkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX1BPUlRfUEFSVElUSU9OX1RZUEVfTlBBUjFfMAkgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX1BPUlRfUEFSVElUSU9OX1RZUEVfTlBBUjFfNQkgICAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX1BPUlRfUEFSVElUSU9OX1RZUEVfTlBBUjJfMAkgICAoMHg0VUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX1BPUlRfUEFSVElUSU9OX1RZUEVfVU5LTk9XTgkgICAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9QT1JUX1BBUlRJVElPTl9UWVBFX1NQRgkJICAgMHgwVUwKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX1BPUlRfUEFSVElUSU9OX1RZUEVfTVBGUwkgICAweDFVTAorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfUE9SVF9QQVJUSVRJT05fVFlQRV9OUEFSMV8wCSAgIDB4MlVMCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9QT1JUX1BBUlRJVElPTl9UWVBFX05QQVIxXzUJICAgMHgzVUwKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX1BPUlRfUEFSVElUSU9OX1RZUEVfTlBBUjJfMAkgICAweDRVTAorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfUE9SVF9QQVJUSVRJT05fVFlQRV9VTktOT1dOCSAgIDB4ZmZVTAogCXU4IHVudXNlZF8wOwogCV9fbGUxNiBkZmx0X3ZuaWNfaWQ7CiAJdTggdW51c2VkXzE7CiAJdTggdW51c2VkXzI7CiAJX19sZTMyIG1pbl9idzsKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01JTl9CV19CV19WQUxVRV9NQVNLCQkgICAgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01JTl9CV19CV19WQUxVRV9TRlQJCSAgICAwCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NSU5fQldfUlNWRAkJCSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01JTl9CV19CV19WQUxVRV9VTklUX01BU0sJICAgIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUCSAgICAyOQorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUwkgICAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NSU5fQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgICAgICAgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBGVU5DX1FDRkdfUkVTUF9NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJX19sZTMyIG1heF9idzsKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01BWF9CV19CV19WQUxVRV9NQVNLCQkgICAgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01BWF9CV19CV19WQUxVRV9TRlQJCSAgICAwCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NQVhfQldfUlNWRAkJCSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01BWF9CV19CV19WQUxVRV9VTklUX01BU0sJICAgIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUCSAgICAyOQorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUwkgICAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NQVhfQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgICAgICAgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBGVU5DX1FDRkdfUkVTUF9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJdTggZXZiX21vZGU7Ci0JI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9FVkJfTU9ERV9OT19FVkIJCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX0VWQl9NT0RFX1ZFQgkJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfRVZCX01PREVfVkVQQQkJCSAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfRVZCX01PREVfTk9fRVZCCQkJICAgMHgwVUwKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX0VWQl9NT0RFX1ZFQgkJCSAgIDB4MVVMCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9FVkJfTU9ERV9WRVBBCQkJICAgMHgyVUwKIAl1OCB1bnVzZWRfMzsKLQlfX2xlMTYgdW51c2VkXzQ7CisJX19sZTE2IGFsbG9jX3ZmczsKIAlfX2xlMzIgYWxsb2NfbWNhc3RfZmlsdGVyczsKIAlfX2xlMzIgYWxsb2NfaHdfcmluZ19ncnBzOwotCXU4IHVudXNlZF81OwotCXU4IHVudXNlZF82OwotCXU4IHVudXNlZF83OworCV9fbGUxNiBhbGxvY19zcF90eF9yaW5nczsKKwl1OCB1bnVzZWRfNDsKIAl1OCB2YWxpZDsKIH07CiAKQEAgLTExNzEsMTggKzEyMDEsMzYgQEAKIAlfX2xlMTYgZGZsdF92bGFuOwogCV9fYmUzMiBkZmx0X2lwX2FkZHJbNF07CiAJX19sZTMyIG1pbl9idzsKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NSU5fQldfQldfVkFMVUVfTUFTSwkJICAgIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUlOX0JXX0JXX1ZBTFVFX1NGVAkJICAgIDAKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NSU5fQldfUlNWRAkJCSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NSU5fQldfQldfVkFMVUVfVU5JVF9NQVNLCQkgICAgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUCQkgICAgMjkKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NSU5fQldfQldfVkFMVUVfVU5JVF9NQlBTCQkgICAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICAgICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElECSAgICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NSU5fQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIEZVTkNfQ0ZHX1JFUV9NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJX19sZTMyIG1heF9idzsKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NQVhfQldfQldfVkFMVUVfTUFTSwkJICAgIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUFYX0JXX0JXX1ZBTFVFX1NGVAkJICAgIDAKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NQVhfQldfUlNWRAkJCSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NQVhfQldfQldfVkFMVUVfVU5JVF9NQVNLCQkgICAgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUCQkgICAgMjkKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NQVhfQldfQldfVkFMVUVfVU5JVF9NQlBTCQkgICAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICAgICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElECSAgICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NQVhfQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIEZVTkNfQ0ZHX1JFUV9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJX19sZTE2IGFzeW5jX2V2ZW50X2NyOwogCXU4IHZsYW5fYW50aXNwb29mX21vZGU7Ci0JI2RlZmluZSBGVU5DX0NGR19SRVFfVkxBTl9BTlRJU1BPT0ZfTU9ERV9OT0NIRUNLCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19DRkdfUkVRX1ZMQU5fQU5USVNQT09GX01PREVfVkFMSURBVEVfVkxBTiAgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9WTEFOX0FOVElTUE9PRl9NT0RFX0lOU0VSVF9JRl9WTEFORE5FICgweDJVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19DRkdfUkVRX1ZMQU5fQU5USVNQT09GX01PREVfSU5TRVJUX09SX09WRVJSSURFX1ZMQU4gKDB4M1VMIDw8IDApCisJI2RlZmluZSBGVU5DX0NGR19SRVFfVkxBTl9BTlRJU1BPT0ZfTU9ERV9OT0NIRUNLCSAgIDB4MFVMCisJI2RlZmluZSBGVU5DX0NGR19SRVFfVkxBTl9BTlRJU1BPT0ZfTU9ERV9WQUxJREFURV9WTEFOICAgIDB4MVVMCisJI2RlZmluZSBGVU5DX0NGR19SRVFfVkxBTl9BTlRJU1BPT0ZfTU9ERV9JTlNFUlRfSUZfVkxBTkRORSAweDJVTAorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX1ZMQU5fQU5USVNQT09GX01PREVfSU5TRVJUX09SX09WRVJSSURFX1ZMQU4gMHgzVUwKIAl1OCBhbGxvd2VkX3ZsYW5fcHJpczsKIAl1OCBldmJfbW9kZTsKLQkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9FVkJfTU9ERV9OT19FVkIJCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9FVkJfTU9ERV9WRUIJCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9FVkJfTU9ERV9WRVBBCQkJICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBGVU5DX0NGR19SRVFfRVZCX01PREVfTk9fRVZCCQkJICAgMHgwVUwKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9FVkJfTU9ERV9WRUIJCQkgICAweDFVTAorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX0VWQl9NT0RFX1ZFUEEJCQkgICAweDJVTAogCXU4IHVudXNlZF8yOwogCV9fbGUxNiBudW1fbWNhc3RfZmlsdGVyczsKIH07CkBAIC0xMzQxLDE2ICsxMzg5LDE2IEBACiAJI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9FTkFCTEVTX1ZGX1JFUV9GV0QJCSAgICAweDhVTAogCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfRU5BQkxFU19BU1lOQ19FVkVOVF9GV0QJICAgIDB4MTBVTAogCV9fbGUxNiBvc190eXBlOwotCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9VTktOT1dOCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfT1RIRVIJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9NU0RPUwkJICAgKDB4ZVVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX1dJTkRPV1MJCSAgICgweDEyVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfU09MQVJJUwkJICAgKDB4MWRVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9MSU5VWAkJICAgKDB4MjRVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9GUkVFQlNECQkgICAoMHgyYVVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX0VTWEkJCQkgICAoMHg2OFVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX1dJTjg2NAkJICAgKDB4NzNVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9XSU4yMDEyUjIJCSAgICgweDc0VUwgPDwgMCkKKwkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfVU5LTk9XTgkJICAgMHgwVUwKKwkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfT1RIRVIJCSAgIDB4MVVMCisJI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX01TRE9TCQkgICAweGVVTAorCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9XSU5ET1dTCQkgICAweDEyVUwKKwkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfU09MQVJJUwkJICAgMHgxZFVMCisJI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX0xJTlVYCQkgICAweDI0VUwKKwkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfRlJFRUJTRAkJICAgMHgyYVVMCisJI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX0VTWEkJCQkgICAweDY4VUwKKwkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfV0lOODY0CQkgICAweDczVUwKKwkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfV0lOMjAxMlIyCQkgICAweDc0VUwKIAl1OCB2ZXJfbWFqOwogCXU4IHZlcl9taW47CiAJdTggdmVyX3VwZDsKQEAgLTE0MTUsMTMgKzE0NjMsMTMgQEAKIAlfX2xlMTYgdmZfaWQ7CiAJX19sZTE2IHJlcV9idWZfbnVtX3BhZ2VzOwogCV9fbGUxNiByZXFfYnVmX3BhZ2Vfc2l6ZTsKLQkjZGVmaW5lIEZVTkNfQlVGX1JHVFJfUkVRX1JFUV9CVUZfUEFHRV9TSVpFXzE2QgkgICAoMHg0VUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfQlVGX1JHVFJfUkVRX1JFUV9CVUZfUEFHRV9TSVpFXzRLCQkgICAoMHhjVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfQlVGX1JHVFJfUkVRX1JFUV9CVUZfUEFHRV9TSVpFXzhLCQkgICAoMHhkVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfQlVGX1JHVFJfUkVRX1JFUV9CVUZfUEFHRV9TSVpFXzY0SwkgICAoMHgxMFVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0JVRl9SR1RSX1JFUV9SRVFfQlVGX1BBR0VfU0laRV8yTQkJICAgKDB4MTVVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19CVUZfUkdUUl9SRVFfUkVRX0JVRl9QQUdFX1NJWkVfNE0JCSAgICgweDE2VUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfQlVGX1JHVFJfUkVRX1JFUV9CVUZfUEFHRV9TSVpFXzFHCQkgICAoMHgxZVVMIDw8IDApCisJI2RlZmluZSBGVU5DX0JVRl9SR1RSX1JFUV9SRVFfQlVGX1BBR0VfU0laRV8xNkIJICAgMHg0VUwKKwkjZGVmaW5lIEZVTkNfQlVGX1JHVFJfUkVRX1JFUV9CVUZfUEFHRV9TSVpFXzRLCQkgICAweGNVTAorCSNkZWZpbmUgRlVOQ19CVUZfUkdUUl9SRVFfUkVRX0JVRl9QQUdFX1NJWkVfOEsJCSAgIDB4ZFVMCisJI2RlZmluZSBGVU5DX0JVRl9SR1RSX1JFUV9SRVFfQlVGX1BBR0VfU0laRV82NEsJICAgMHgxMFVMCisJI2RlZmluZSBGVU5DX0JVRl9SR1RSX1JFUV9SRVFfQlVGX1BBR0VfU0laRV8yTQkJICAgMHgxNVVMCisJI2RlZmluZSBGVU5DX0JVRl9SR1RSX1JFUV9SRVFfQlVGX1BBR0VfU0laRV80TQkJICAgMHgxNlVMCisJI2RlZmluZSBGVU5DX0JVRl9SR1RSX1JFUV9SRVFfQlVGX1BBR0VfU0laRV8xRwkJICAgMHgxZVVMCiAJX19sZTE2IHJlcV9idWZfbGVuOwogCV9fbGUxNiByZXNwX2J1Zl9sZW47CiAJdTggdW51c2VkXzA7CkBAIC0xNDczLDE2ICsxNTIxLDE2IEBACiAJX19sZTE2IHNlcV9pZDsKIAlfX2xlMTYgcmVzcF9sZW47CiAJX19sZTE2IG9zX3R5cGU7Ci0JI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9VTktOT1dOCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX09USEVSCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX01TRE9TCQkgICAoMHhlVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX1dJTkRPV1MJCSAgICgweDEyVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX1NPTEFSSVMJCSAgICgweDFkVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX0xJTlVYCQkgICAoMHgyNFVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9GUkVFQlNECQkgICAoMHgyYVVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9FU1hJCQkgICAoMHg2OFVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9XSU44NjQJCSAgICgweDczVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX1dJTjIwMTJSMgkJICAgKDB4NzRVTCA8PCAwKQorCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfVU5LTk9XTgkJICAgMHgwVUwKKwkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX09USEVSCQkgICAweDFVTAorCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfTVNET1MJCSAgIDB4ZVVMCisJI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9XSU5ET1dTCQkgICAweDEyVUwKKwkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX1NPTEFSSVMJCSAgIDB4MWRVTAorCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfTElOVVgJCSAgIDB4MjRVTAorCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfRlJFRUJTRAkJICAgMHgyYVVMCisJI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9FU1hJCQkgICAweDY4VUwKKwkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX1dJTjg2NAkJICAgMHg3M1VMCisJI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9XSU4yMDEyUjIJCSAgIDB4NzRVTAogCXU4IHZlcl9tYWo7CiAJdTggdmVyX21pbjsKIAl1OCB2ZXJfdXBkOwpAQCAtMTUyOCw0NCArMTU3Niw0NCBAQAogCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9FTkFCTEVTX1RYX0xQSV9USU1FUgkJICAgIDB4NDAwVUwKIAlfX2xlMTYgcG9ydF9pZDsKIAlfX2xlMTYgZm9yY2VfbGlua19zcGVlZDsKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8xMDBNQgkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8xR0IJCSAgICgweGFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzJHQgkJICAgKDB4MTRVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzJfNUdCCSAgICgweDE5VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8xMEdCCQkgICAoMHg2NFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMjBHQgkJICAgKDB4YzhVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzI1R0IJCSAgICgweGZhVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF80MEdCCQkgICAoMHgxOTBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzUwR0IJCSAgICgweDFmNFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMTAwR0IJICAgKDB4M2U4VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8xME1CCQkgICAoMHhmZmZmVUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8xMDBNQgkgICAweDFVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzFHQgkJICAgMHhhVUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8yR0IJCSAgIDB4MTRVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzJfNUdCCSAgIDB4MTlVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzEwR0IJCSAgIDB4NjRVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzIwR0IJCSAgIDB4YzhVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzI1R0IJCSAgIDB4ZmFVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzQwR0IJCSAgIDB4MTkwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF81MEdCCQkgICAweDFmNFVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMTAwR0IJICAgMHgzZThVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzEwTUIJCSAgIDB4ZmZmZlVMCiAJdTggYXV0b19tb2RlOwotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX01PREVfTk9ORQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTU9ERV9BTExfU1BFRURTCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19NT0RFX09ORV9TUEVFRAkJICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTU9ERV9PTkVfT1JfQkVMT1cJICAgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTU9ERV9TUEVFRF9NQVNLCQkgICAoMHg0VUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19NT0RFX05PTkUJCSAgIDB4MFVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTU9ERV9BTExfU1BFRURTCQkgICAweDFVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX01PREVfT05FX1NQRUVECQkgICAweDJVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX01PREVfT05FX09SX0JFTE9XCSAgIDB4M1VMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTU9ERV9TUEVFRF9NQVNLCQkgICAweDRVTAogCXU4IGF1dG9fZHVwbGV4OwotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0RVUExFWF9IQUxGCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19EVVBMRVhfRlVMTAkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fRFVQTEVYX0JPVEgJCSAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0RVUExFWF9IQUxGCQkgICAweDBVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0RVUExFWF9GVUxMCQkgICAweDFVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0RVUExFWF9CT1RICQkgICAweDJVTAogCXU4IGF1dG9fcGF1c2U7CiAJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fUEFVU0VfVFgJCQkgICAgMHgxVUwKIAkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19QQVVTRV9SWAkJCSAgICAweDJVTAogCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX1BBVVNFX0FVVE9ORUdfUEFVU0UJICAgIDB4NFVMCiAJdTggdW51c2VkXzA7CiAJX19sZTE2IGF1dG9fbGlua19zcGVlZDsKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzEwME1CCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzFHQgkJICAgKDB4YVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8yR0IJCSAgICgweDE0VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzJfNUdCCQkgICAoMHgxOVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8xMEdCCQkgICAoMHg2NFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8yMEdCCQkgICAoMHhjOFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8yNUdCCQkgICAoMHhmYVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF80MEdCCQkgICAoMHgxOTBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfNTBHQgkJICAgKDB4MWY0VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzEwMEdCCQkgICAoMHgzZThVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMTBNQgkJICAgKDB4ZmZmZlVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8xMDBNQgkJICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzFHQgkJICAgMHhhVUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzJHQgkJICAgMHgxNFVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8yXzVHQgkJICAgMHgxOVVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8xMEdCCQkgICAweDY0VUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzIwR0IJCSAgIDB4YzhVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMjVHQgkJICAgMHhmYVVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF80MEdCCQkgICAweDE5MFVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF81MEdCCQkgICAweDFmNFVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8xMDBHQgkJICAgMHgzZThVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMTBNQgkJICAgMHhmZmZmVUwKIAlfX2xlMTYgYXV0b19saW5rX3NwZWVkX21hc2s7CiAJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF9NQVNLXzEwME1CSEQgICAgICAweDFVTAogCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfTUFTS18xMDBNQgkgICAgMHgyVUwKQEAgLTE1ODIsMTIgKzE2MzAsMTIgQEAKIAkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEX01BU0tfMTBNQkhEICAgICAgIDB4MTAwMFVMCiAJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF9NQVNLXzEwTUIJICAgIDB4MjAwMFVMCiAJdTggd2lyZXNwZWVkOwotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9XSVJFU1BFRURfT0ZGCQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX1dJUkVTUEVFRF9PTgkJCSAgICgweDFVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9XSVJFU1BFRURfT0ZGCQkJICAgMHgwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfV0lSRVNQRUVEX09OCQkJICAgMHgxVUwKIAl1OCBscGJrOwotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9MUEJLX05PTkUJCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfTFBCS19MT0NBTAkJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9MUEJLX1JFTU9URQkJCSAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9MUEJLX05PTkUJCQkgICAweDBVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9MUEJLX0xPQ0FMCQkJICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfTFBCS19SRU1PVEUJCQkgICAweDJVTAogCXU4IGZvcmNlX3BhdXNlOwogCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9QQVVTRV9UWAkJICAgIDB4MVVMCiAJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX1BBVVNFX1JYCQkgICAgMHgyVUwKQEAgLTE2NDEsMjUgKzE2ODksMjUgQEAKIAlfX2xlMTYgc2VxX2lkOwogCV9fbGUxNiByZXNwX2xlbjsKIAl1OCBsaW5rOwotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfTk9fTElOSwkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TSUdOQUwJCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX0xJTksJCQkgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX05PX0xJTksJCSAgIDB4MFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TSUdOQUwJCQkgICAweDFVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfTElOSwkJCSAgIDB4MlVMCiAJdTggdW51c2VkXzA7CiAJX19sZTE2IGxpbmtfc3BlZWQ7Ci0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8xMDBNQgkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8xR0IJCSAgICgweGFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMkdCCQkgICAoMHgxNFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8yXzVHQgkJICAgKDB4MTlVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMTBHQgkJICAgKDB4NjRVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMjBHQgkJICAgKDB4YzhVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMjVHQgkJICAgKDB4ZmFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfNDBHQgkJICAgKDB4MTkwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzUwR0IJCSAgICgweDFmNFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8xMDBHQgkJICAgKDB4M2U4VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzEwTUIJCSAgICgweGZmZmZVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMTAwTUIJCSAgIDB4MVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8xR0IJCSAgIDB4YVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8yR0IJCSAgIDB4MTRVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMl81R0IJCSAgIDB4MTlVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMTBHQgkJICAgMHg2NFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8yMEdCCQkgICAweGM4VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzI1R0IJCSAgIDB4ZmFVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfNDBHQgkJICAgMHgxOTBVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfNTBHQgkJICAgMHgxZjRVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMTAwR0IJCSAgIDB4M2U4VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzEwTUIJCSAgIDB4ZmZmZlVMCiAJdTggZHVwbGV4OwotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0RVUExFWF9IQUxGCQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRFVQTEVYX0ZVTEwJCQkgICAoMHgxVUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9EVVBMRVhfSEFMRgkJCSAgIDB4MFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRFVQTEVYX0ZVTEwJCQkgICAweDFVTAogCXU4IHBhdXNlOwogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BBVVNFX1RYCQkJICAgIDB4MVVMCiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEFVU0VfUlgJCQkgICAgMHgyVUwKQEAgLTE2NzksMzkgKzE3MjcsMzkgQEAKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9TVVBQT1JUX1NQRUVEU18xME1CSEQJICAgIDB4MTAwMFVMCiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfU1VQUE9SVF9TUEVFRFNfMTBNQgkJICAgIDB4MjAwMFVMCiAJX19sZTE2IGZvcmNlX2xpbmtfc3BlZWQ7Ci0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8xMDBNQgkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzFHQgkgICAoMHhhVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzJHQgkgICAoMHgxNFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8yXzVHQgkgICAoMHgxOVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8xMEdCCSAgICgweDY0VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzIwR0IJICAgKDB4YzhVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMjVHQgkgICAoMHhmYVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF80MEdCCSAgICgweDE5MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF81MEdCCSAgICgweDFmNFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8xMDBHQgkgICAoMHgzZThVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMTBNQgkgICAoMHhmZmZmVUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzEwME1CCSAgIDB4MVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8xR0IJICAgMHhhVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzJHQgkgICAweDE0VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzJfNUdCCSAgIDB4MTlVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMTBHQgkgICAweDY0VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzIwR0IJICAgMHhjOFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8yNUdCCSAgIDB4ZmFVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfNDBHQgkgICAweDE5MFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF81MEdCCSAgIDB4MWY0VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzEwMEdCCSAgIDB4M2U4VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzEwTUIJICAgMHhmZmZmVUwKIAl1OCBhdXRvX21vZGU7Ci0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19NT0RFX05PTkUJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTU9ERV9BTExfU1BFRURTCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTU9ERV9PTkVfU1BFRUQJCSAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTU9ERV9PTkVfT1JfQkVMT1cJICAgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19NT0RFX1NQRUVEX01BU0sJICAgKDB4NFVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19NT0RFX05PTkUJCSAgIDB4MFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19NT0RFX0FMTF9TUEVFRFMJICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX01PREVfT05FX1NQRUVECQkgICAweDJVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTU9ERV9PTkVfT1JfQkVMT1cJICAgMHgzVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX01PREVfU1BFRURfTUFTSwkgICAweDRVTAogCXU4IGF1dG9fcGF1c2U7CiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19QQVVTRV9UWAkJICAgIDB4MVVMCiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19QQVVTRV9SWAkJICAgIDB4MlVMCiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19QQVVTRV9BVVRPTkVHX1BBVVNFCSAgICAweDRVTAogCV9fbGUxNiBhdXRvX2xpbmtfc3BlZWQ7Ci0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzEwME1CCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8xR0IJCSAgICgweGFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8yR0IJCSAgICgweDE0VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMl81R0IJICAgKDB4MTlVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8xMEdCCSAgICgweDY0VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMjBHQgkgICAoMHhjOFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzI1R0IJICAgKDB4ZmFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF80MEdCCSAgICgweDE5MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzUwR0IJICAgKDB4MWY0VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMTAwR0IJICAgKDB4M2U4VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMTBNQgkgICAoMHhmZmZmVUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMTAwTUIJICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMUdCCQkgICAweGFVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8yR0IJCSAgIDB4MTRVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8yXzVHQgkgICAweDE5VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMTBHQgkgICAweDY0VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMjBHQgkgICAweGM4VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMjVHQgkgICAweGZhVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfNDBHQgkgICAweDE5MFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzUwR0IJICAgMHgxZjRVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8xMDBHQgkgICAweDNlOFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzEwTUIJICAgMHhmZmZmVUwKIAlfX2xlMTYgYXV0b19saW5rX3NwZWVkX21hc2s7CiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEX01BU0tfMTAwTUJIRCAgICAweDFVTAogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF9NQVNLXzEwME1CICAgICAgMHgyVUwKQEAgLTE3MjgsNDYgKzE3NzYsNDYgQEAKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfTUFTS18xME1CSEQgICAgIDB4MTAwMFVMCiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEX01BU0tfMTBNQiAgICAgICAweDIwMDBVTAogCXU4IHdpcmVzcGVlZDsKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9XSVJFU1BFRURfT0ZGCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9XSVJFU1BFRURfT04JCSAgICgweDFVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1dJUkVTUEVFRF9PRkYJCSAgIDB4MFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfV0lSRVNQRUVEX09OCQkgICAweDFVTAogCXU4IGxwYms7Ci0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTFBCS19OT05FCQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTFBCS19MT0NBTAkJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xQQktfUkVNT1RFCQkJICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTFBCS19OT05FCQkJICAgMHgwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MUEJLX0xPQ0FMCQkJICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MUEJLX1JFTU9URQkJCSAgIDB4MlVMCiAJdTggZm9yY2VfcGF1c2U7CiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfUEFVU0VfVFgJCSAgICAweDFVTAogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX1BBVVNFX1JYCQkgICAgMHgyVUwKIAl1OCBtb2R1bGVfc3RhdHVzOwotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01PRFVMRV9TVEFUVVNfTk9ORQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTU9EVUxFX1NUQVRVU19ESVNBQkxFVFgJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTU9EVUxFX1NUQVRVU19XQVJOSU5HTVNHICAgICAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01PRFVMRV9TVEFUVVNfUFdSRE9XTgkgICAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NT0RVTEVfU1RBVFVTX05PVElOU0VSVEVEICAgICAgKDB4NFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTU9EVUxFX1NUQVRVU19OT1RBUFBMSUNBQkxFICAgICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NT0RVTEVfU1RBVFVTX05PTkUJCSAgIDB4MFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTU9EVUxFX1NUQVRVU19ESVNBQkxFVFgJICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NT0RVTEVfU1RBVFVTX1dBUk5JTkdNU0cgICAgICAgMHgyVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NT0RVTEVfU1RBVFVTX1BXUkRPV04JICAgMHgzVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NT0RVTEVfU1RBVFVTX05PVElOU0VSVEVEICAgICAgMHg0VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NT0RVTEVfU1RBVFVTX05PVEFQUExJQ0FCTEUgICAgMHhmZlVMCiAJX19sZTMyIHByZWVtcGhhc2lzOwogCXU4IHBoeV9tYWo7CiAJdTggcGh5X21pbjsKIAl1OCBwaHlfYmxkOwogCXU4IHBoeV90eXBlOwotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX1VOS05PV04JCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VDUgkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRUtSNAkJICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRUxSCQkgICAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFU1IJCSAgICgweDRVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VLUjIJCSAgICgweDVVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VLWAkJICAgKDB4NlVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRUtSCQkgICAoMHg3VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFVAkJICAgKDB4OFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRVRFCQkgICAoMHg5VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9TR01JSUVYVFBIWQkgICAoMHhhVUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9VTktOT1dOCQkgICAweDBVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VDUgkJICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFS1I0CQkgICAweDJVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VMUgkJICAgMHgzVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFU1IJCSAgIDB4NFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRUtSMgkJICAgMHg1VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFS1gJCSAgIDB4NlVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRUtSCQkgICAweDdVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VUCQkgICAweDhVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VURQkJICAgMHg5VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9TR01JSUVYVFBIWQkgICAweGFVTAogCXU4IG1lZGlhX3R5cGU7Ci0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTUVESUFfVFlQRV9VTktOT1dOCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NRURJQV9UWVBFX1RQCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NRURJQV9UWVBFX0RBQwkJICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTUVESUFfVFlQRV9GSUJSRQkJICAgKDB4M1VMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTUVESUFfVFlQRV9VTktOT1dOCQkgICAweDBVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01FRElBX1RZUEVfVFAJCSAgIDB4MVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTUVESUFfVFlQRV9EQUMJCSAgIDB4MlVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTUVESUFfVFlQRV9GSUJSRQkJICAgMHgzVUwKIAl1OCB4Y3ZyX3BrZ190eXBlOwotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1hDVlJfUEtHX1RZUEVfWENWUl9JTlRFUk5BTCAgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9YQ1ZSX1BLR19UWVBFX1hDVlJfRVhURVJOQUwgICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfWENWUl9QS0dfVFlQRV9YQ1ZSX0lOVEVSTkFMICAgIDB4MVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfWENWUl9QS0dfVFlQRV9YQ1ZSX0VYVEVSTkFMICAgIDB4MlVMCiAJdTggZWVlX2NvbmZpZ19waHlfYWRkcjsKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfQUREUl9NQVNLCQkgICAgMHgxZlVMCiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX0FERFJfU0ZUCQkgICAgMApAQCAtMTc5NiwxMSArMTg0NCwxMSBAQAogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfUEFSVE5FUl9BRFZfU1BFRURTXzEwTUJIRCAgMHgxMDAwVUwKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1BBUlRORVJfQURWX1NQRUVEU18xME1CICAgIDB4MjAwMFVMCiAJdTggbGlua19wYXJ0bmVyX2Fkdl9hdXRvX21vZGU7Ci0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19QQVJUTkVSX0FEVl9BVVRPX01PREVfTk9ORSAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1BBUlRORVJfQURWX0FVVE9fTU9ERV9BTExfU1BFRURTICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfUEFSVE5FUl9BRFZfQVVUT19NT0RFX09ORV9TUEVFRCAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1BBUlRORVJfQURWX0FVVE9fTU9ERV9PTkVfT1JfQkVMT1cgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19QQVJUTkVSX0FEVl9BVVRPX01PREVfU1BFRURfTUFTSyAoMHg0VUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1BBUlRORVJfQURWX0FVVE9fTU9ERV9OT05FIDB4MFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19QQVJUTkVSX0FEVl9BVVRPX01PREVfQUxMX1NQRUVEUyAweDFVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfUEFSVE5FUl9BRFZfQVVUT19NT0RFX09ORV9TUEVFRCAweDJVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfUEFSVE5FUl9BRFZfQVVUT19NT0RFX09ORV9PUl9CRUxPVyAweDNVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfUEFSVE5FUl9BRFZfQVVUT19NT0RFX1NQRUVEX01BU0sgMHg0VUwKIAl1OCBsaW5rX3BhcnRuZXJfYWR2X3BhdXNlOwogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfUEFSVE5FUl9BRFZfUEFVU0VfVFggICAgICAgMHgxVUwKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1BBUlRORVJfQURWX1BBVVNFX1JYICAgICAgIDB4MlVMCkBAIC0xODU5LDcgKzE5MDcsNyBAQAogCV9fbGU2NCByZXNwX2FkZHI7CiAJX19sZTMyIGZsYWdzOwogCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9GTEFHU19NQVRDSF9MSU5LCQkgICAgMHgxVUwKLQkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRkxBR1NfQ09TX0FTU0lHTk1FTlRfRU5BQkxFICAgICAgIDB4MlVMCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0ZMQUdTX1ZMQU5fUFJJMkNPU19FTkFCTEUJICAgIDB4MlVMCiAJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0ZMQUdTX1RVTk5FTF9QUkkyQ09TX0VOQUJMRSAgICAgICAweDRVTAogCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9GTEFHU19JUF9EU0NQMkNPU19FTkFCTEUJICAgIDB4OFVMCiAJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0ZMQUdTX1BUUF9SWF9UU19DQVBUVVJFX0VOQUJMRSAgICAweDEwVUwKQEAgLTE4NjgsMjggKzE5MTYsNTAgQEAKIAkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRkxBR1NfUFRQX1RYX1RTX0NBUFRVUkVfRElTQUJMRSAgIDB4ODBVTAogCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9GTEFHU19PT0JfV09MX0VOQUJMRQkJICAgIDB4MTAwVUwKIAkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRkxBR1NfT09CX1dPTF9ESVNBQkxFCQkgICAgMHgyMDBVTAorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9GTEFHU19WTEFOX1BSSTJDT1NfRElTQUJMRQkgICAgMHg0MDBVTAorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9GTEFHU19UVU5ORUxfUFJJMkNPU19ESVNBQkxFICAgICAgMHg4MDBVTAorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9GTEFHU19JUF9EU0NQMkNPU19ESVNBQkxFCSAgICAweDEwMDBVTAogCV9fbGUzMiBlbmFibGVzOwogCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9FTkFCTEVTX0lQRwkJCSAgICAweDFVTAogCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9FTkFCTEVTX0xQQksJCQkgICAgMHgyVUwKLQkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRU5BQkxFU19JVkxBTl9QUkkyQ09TX01BUF9QUkkgICAgIDB4NFVMCi0JI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0VOQUJMRVNfTENPU19NQVBfUFJJCQkgICAgMHg4VUwKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRU5BQkxFU19WTEFOX1BSSTJDT1NfTUFQX1BSSSAgICAgIDB4NFVMCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0VOQUJMRVNfUkVTRVJWRUQxCQkgICAgMHg4VUwKIAkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRU5BQkxFU19UVU5ORUxfUFJJMkNPU19NQVBfUFJJICAgIDB4MTBVTAogCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9FTkFCTEVTX0RTQ1AyQ09TX01BUF9QUkkJICAgIDB4MjBVTAogCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9FTkFCTEVTX1JYX1RTX0NBUFRVUkVfUFRQX01TR19UWVBFIDB4NDBVTAogCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9FTkFCTEVTX1RYX1RTX0NBUFRVUkVfUFRQX01TR19UWVBFIDB4ODBVTAorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9FTkFCTEVTX0NPU19GSUVMRF9DRkcJCSAgICAweDEwMFVMCiAJX19sZTE2IHBvcnRfaWQ7CiAJdTggaXBnOwogCXU4IGxwYms7Ci0JI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0xQQktfTk9ORQkJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9MUEJLX0xPQ0FMCQkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0xQQktfUkVNT1RFCQkJICAgKDB4MlVMIDw8IDApCi0JdTggaXZsYW5fcHJpMmNvc19tYXBfcHJpOwotCXU4IGxjb3NfbWFwX3ByaTsKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfTFBCS19OT05FCQkJICAgMHgwVUwKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfTFBCS19MT0NBTAkJCSAgIDB4MVVMCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0xQQktfUkVNT1RFCQkJICAgMHgyVUwKKwl1OCB2bGFuX3ByaTJjb3NfbWFwX3ByaTsKKwl1OCByZXNlcnZlZDE7CiAJdTggdHVubmVsX3ByaTJjb3NfbWFwX3ByaTsKIAl1OCBkc2NwMnByaV9tYXBfcHJpOwogCV9fbGUxNiByeF90c19jYXB0dXJlX3B0cF9tc2dfdHlwZTsKIAlfX2xlMTYgdHhfdHNfY2FwdHVyZV9wdHBfbXNnX3R5cGU7Ci0JX19sZTMyIHVudXNlZF8wOworCXU4IGNvc19maWVsZF9jZmc7CisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfUlNWRDEJCSAgICAweDFVTAorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX1ZMQU5fUFJJX1NFTF9NQVNLICAgMHg2VUwKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19WTEFOX1BSSV9TRUxfU0ZUICAgIDEKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19WTEFOX1BSSV9TRUxfSU5ORVJNT1NUICgweDBVTCA8PCAxKQorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX1ZMQU5fUFJJX1NFTF9PVVRFUiAoMHgxVUwgPDwgMSkKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19WTEFOX1BSSV9TRUxfT1VURVJNT1NUICgweDJVTCA8PCAxKQorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX1ZMQU5fUFJJX1NFTF9VTlNQRUNJRklFRCAoMHgzVUwgPDwgMSkKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19WTEFOX1BSSV9TRUxfTEFTVCAgICBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfVkxBTl9QUklfU0VMX1VOU1BFQ0lGSUVECisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfVF9WTEFOX1BSSV9TRUxfTUFTSyAweDE4VUwKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19UX1ZMQU5fUFJJX1NFTF9TRlQgIDMKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19UX1ZMQU5fUFJJX1NFTF9JTk5FUk1PU1QgKDB4MFVMIDw8IDMpCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfVF9WTEFOX1BSSV9TRUxfT1VURVIgKDB4MVVMIDw8IDMpCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfVF9WTEFOX1BSSV9TRUxfT1VURVJNT1NUICgweDJVTCA8PCAzKQorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX1RfVkxBTl9QUklfU0VMX1VOU1BFQ0lGSUVEICgweDNVTCA8PCAzKQorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX1RfVkxBTl9QUklfU0VMX0xBU1QgICAgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX1RfVkxBTl9QUklfU0VMX1VOU1BFQ0lGSUVECisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfREVGQVVMVF9DT1NfTUFTSyAgICAweGUwVUwKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19ERUZBVUxUX0NPU19TRlQgICAgIDUKKwl1OCB1bnVzZWRfMFszXTsKIH07CiAKIC8qIE91dHB1dCAoMTYgYnl0ZXMpICovCkBAIC0xOTAyLDkgKzE5NzIsOSBAQAogCV9fbGUxNiBtdHU7CiAJdTggaXBnOwogCXU4IGxwYms7Ci0JI2RlZmluZSBQT1JUX01BQ19DRkdfUkVTUF9MUEJLX05PTkUJCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVNQX0xQQktfTE9DQUwJCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVNQX0xQQktfUkVNT1RFCQkJICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVTUF9MUEJLX05PTkUJCQkgICAweDBVTAorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFU1BfTFBCS19MT0NBTAkJCSAgIDB4MVVMCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVTUF9MUEJLX1JFTU9URQkJCSAgIDB4MlVMCiAJdTggdW51c2VkXzA7CiAJdTggdmFsaWQ7CiB9OwpAQCAtMjE2Myw4ICsyMjMzLDggQEAKIAlfX2xlNjQgcmVzcF9hZGRyOwogCV9fbGUzMiBmbGFnczsKIAkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFUV9GTEFHU19QQVRICQkJICAgIDB4MVVMCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVFfRkxBR1NfUEFUSF9UWAkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVFfRkxBR1NfUEFUSF9SWAkJICAgKDB4MVVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVFfRkxBR1NfUEFUSF9UWAkJICAgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFUV9GTEFHU19QQVRIX1JYCQkgICAweDFVTAogCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVRX0ZMQUdTX1BBVEhfTEFTVCAgICBRVUVVRV9RUE9SVENGR19SRVFfRkxBR1NfUEFUSF9SWAogCV9fbGUxNiBwb3J0X2lkOwogCV9fbGUxNiB1bnVzZWRfMDsKQEAgLTIxNzksNTAgKzIyNDksNTEgQEAKIAl1OCBtYXhfY29uZmlndXJhYmxlX3F1ZXVlczsKIAl1OCBtYXhfY29uZmlndXJhYmxlX2xvc3NsZXNzX3F1ZXVlczsKIAl1OCBxdWV1ZV9jZmdfYWxsb3dlZDsKLQl1OCBxdWV1ZV9idWZmZXJzX2NmZ19hbGxvd2VkOworCXU4IHF1ZXVlX2NmZ19pbmZvOworCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9DRkdfSU5GT19BU1lNX0NGRwkgICAgMHgxVUwKIAl1OCBxdWV1ZV9wZmNlbmFibGVfY2ZnX2FsbG93ZWQ7CiAJdTggcXVldWVfcHJpMmNvc19jZmdfYWxsb3dlZDsKIAl1OCBxdWV1ZV9jb3MyYndfY2ZnX2FsbG93ZWQ7CiAJdTggcXVldWVfaWQwOwogCXU4IHF1ZXVlX2lkMF9zZXJ2aWNlX3Byb2ZpbGU7Ci0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMF9TRVJWSUNFX1BST0ZJTEVfTE9TU1kgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMF9TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMF9TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTiAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMF9TRVJWSUNFX1BST0ZJTEVfTE9TU1kgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQwX1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUyAweDFVTAorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDBfU0VSVklDRV9QUk9GSUxFX1VOS05PV04gMHhmZlVMCiAJdTggcXVldWVfaWQxOwogCXU4IHF1ZXVlX2lkMV9zZXJ2aWNlX3Byb2ZpbGU7Ci0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMV9TRVJWSUNFX1BST0ZJTEVfTE9TU1kgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMV9TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMV9TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTiAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMV9TRVJWSUNFX1BST0ZJTEVfTE9TU1kgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQxX1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUyAweDFVTAorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDFfU0VSVklDRV9QUk9GSUxFX1VOS05PV04gMHhmZlVMCiAJdTggcXVldWVfaWQyOwogCXU4IHF1ZXVlX2lkMl9zZXJ2aWNlX3Byb2ZpbGU7Ci0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMl9TRVJWSUNFX1BST0ZJTEVfTE9TU1kgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMl9TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMl9TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTiAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMl9TRVJWSUNFX1BST0ZJTEVfTE9TU1kgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQyX1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUyAweDFVTAorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDJfU0VSVklDRV9QUk9GSUxFX1VOS05PV04gMHhmZlVMCiAJdTggcXVldWVfaWQzOwogCXU4IHF1ZXVlX2lkM19zZXJ2aWNlX3Byb2ZpbGU7Ci0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEM19TRVJWSUNFX1BST0ZJTEVfTE9TU1kgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEM19TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEM19TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTiAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEM19TRVJWSUNFX1BST0ZJTEVfTE9TU1kgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQzX1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUyAweDFVTAorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDNfU0VSVklDRV9QUk9GSUxFX1VOS05PV04gMHhmZlVMCiAJdTggcXVldWVfaWQ0OwogCXU4IHF1ZXVlX2lkNF9zZXJ2aWNlX3Byb2ZpbGU7Ci0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENF9TRVJWSUNFX1BST0ZJTEVfTE9TU1kgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENF9TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENF9TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTiAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENF9TRVJWSUNFX1BST0ZJTEVfTE9TU1kgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ0X1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUyAweDFVTAorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDRfU0VSVklDRV9QUk9GSUxFX1VOS05PV04gMHhmZlVMCiAJdTggcXVldWVfaWQ1OwogCXU4IHF1ZXVlX2lkNV9zZXJ2aWNlX3Byb2ZpbGU7Ci0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENV9TRVJWSUNFX1BST0ZJTEVfTE9TU1kgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENV9TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENV9TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTiAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENV9TRVJWSUNFX1BST0ZJTEVfTE9TU1kgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ1X1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUyAweDFVTAorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDVfU0VSVklDRV9QUk9GSUxFX1VOS05PV04gMHhmZlVMCiAJdTggcXVldWVfaWQ2OwogCXU4IHF1ZXVlX2lkNl9zZXJ2aWNlX3Byb2ZpbGU7Ci0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENl9TRVJWSUNFX1BST0ZJTEVfTE9TU1kgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENl9TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENl9TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTiAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENl9TRVJWSUNFX1BST0ZJTEVfTE9TU1kgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ2X1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUyAweDFVTAorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDZfU0VSVklDRV9QUk9GSUxFX1VOS05PV04gMHhmZlVMCiAJdTggcXVldWVfaWQ3OwogCXU4IHF1ZXVlX2lkN19zZXJ2aWNlX3Byb2ZpbGU7Ci0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEN19TRVJWSUNFX1BST0ZJTEVfTE9TU1kgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEN19TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEN19TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTiAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEN19TRVJWSUNFX1BST0ZJTEVfTE9TU1kgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ3X1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUyAweDFVTAorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDdfU0VSVklDRV9QUk9GSUxFX1VOS05PV04gMHhmZlVMCiAJdTggdmFsaWQ7CiB9OwogCkBAIC0yMjM1LDE5ICsyMzA2LDIxIEBACiAJX19sZTE2IHRhcmdldF9pZDsKIAlfX2xlNjQgcmVzcF9hZGRyOwogCV9fbGUzMiBmbGFnczsKLQkjZGVmaW5lIFFVRVVFX0NGR19SRVFfRkxBR1NfUEFUSAkJCSAgICAweDFVTAotCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9GTEFHU19QQVRIX1RYCQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DRkdfUkVRX0ZMQUdTX1BBVEhfUlgJCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NGR19SRVFfRkxBR1NfUEFUSF9MQVNUICAgIFFVRVVFX0NGR19SRVFfRkxBR1NfUEFUSF9SWAorCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9GTEFHU19QQVRIX01BU0sJCQkgICAgMHgzVUwKKwkjZGVmaW5lIFFVRVVFX0NGR19SRVFfRkxBR1NfUEFUSF9TRlQJCQkgICAgMAorCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9GTEFHU19QQVRIX1RYCQkJICAgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX0NGR19SRVFfRkxBR1NfUEFUSF9SWAkJCSAgIDB4MVVMCisJI2RlZmluZSBRVUVVRV9DRkdfUkVRX0ZMQUdTX1BBVEhfQklESVIJCQkgICAweDJVTAorCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9GTEFHU19QQVRIX0xBU1QgICAgUVVFVUVfQ0ZHX1JFUV9GTEFHU19QQVRIX0JJRElSCiAJX19sZTMyIGVuYWJsZXM7CiAJI2RlZmluZSBRVUVVRV9DRkdfUkVRX0VOQUJMRVNfREZMVF9MRU4JCQkgICAgMHgxVUwKIAkjZGVmaW5lIFFVRVVFX0NGR19SRVFfRU5BQkxFU19TRVJWSUNFX1BST0ZJTEUJCSAgICAweDJVTAogCV9fbGUzMiBxdWV1ZV9pZDsKIAlfX2xlMzIgZGZsdF9sZW47CiAJdTggc2VydmljZV9wcm9maWxlOwotCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9TRVJWSUNFX1BST0ZJTEVfTE9TU1kJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTgkJICAgKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9TRVJWSUNFX1BST0ZJTEVfTE9TU1kJCSAgIDB4MFVMCisJI2RlZmluZSBRVUVVRV9DRkdfUkVRX1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUwkJICAgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX0NGR19SRVFfU0VSVklDRV9QUk9GSUxFX1VOS05PV04JCSAgIDB4ZmZVTAogCXU4IHVudXNlZF8wWzddOwogfTsKIApAQCAtMjI2NCw1MCArMjMzNyw2IEBACiAJdTggdmFsaWQ7CiB9OwogCi0vKiBod3JtX3F1ZXVlX2J1ZmZlcnNfY2ZnICovCi0vKiBJbnB1dCAoNTYgYnl0ZXMpICovCi1zdHJ1Y3QgaHdybV9xdWV1ZV9idWZmZXJzX2NmZ19pbnB1dCB7Ci0JX19sZTE2IHJlcV90eXBlOwotCV9fbGUxNiBjbXBsX3Jpbmc7Ci0JX19sZTE2IHNlcV9pZDsKLQlfX2xlMTYgdGFyZ2V0X2lkOwotCV9fbGU2NCByZXNwX2FkZHI7Ci0JX19sZTMyIGZsYWdzOwotCSNkZWZpbmUgUVVFVUVfQlVGRkVSU19DRkdfUkVRX0ZMQUdTX1BBVEgJCSAgICAweDFVTAotCSNkZWZpbmUgUVVFVUVfQlVGRkVSU19DRkdfUkVRX0ZMQUdTX1BBVEhfVFgJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQlVGRkVSU19DRkdfUkVRX0ZMQUdTX1BBVEhfUlgJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQlVGRkVSU19DRkdfUkVRX0ZMQUdTX1BBVEhfTEFTVCAgICBRVUVVRV9CVUZGRVJTX0NGR19SRVFfRkxBR1NfUEFUSF9SWAotCV9fbGUzMiBlbmFibGVzOwotCSNkZWZpbmUgUVVFVUVfQlVGRkVSU19DRkdfUkVRX0VOQUJMRVNfUkVTRVJWRUQJCSAgICAweDFVTAotCSNkZWZpbmUgUVVFVUVfQlVGRkVSU19DRkdfUkVRX0VOQUJMRVNfU0hBUkVECQkgICAgMHgyVUwKLQkjZGVmaW5lIFFVRVVFX0JVRkZFUlNfQ0ZHX1JFUV9FTkFCTEVTX1hPRkYJCSAgICAweDRVTAotCSNkZWZpbmUgUVVFVUVfQlVGRkVSU19DRkdfUkVRX0VOQUJMRVNfWE9OCQkgICAgMHg4VUwKLQkjZGVmaW5lIFFVRVVFX0JVRkZFUlNfQ0ZHX1JFUV9FTkFCTEVTX0ZVTEwJCSAgICAweDEwVUwKLQkjZGVmaW5lIFFVRVVFX0JVRkZFUlNfQ0ZHX1JFUV9FTkFCTEVTX05PVEZVTEwJCSAgICAweDIwVUwKLQkjZGVmaW5lIFFVRVVFX0JVRkZFUlNfQ0ZHX1JFUV9FTkFCTEVTX01BWAkJICAgIDB4NDBVTAotCV9fbGUzMiBxdWV1ZV9pZDsKLQlfX2xlMzIgcmVzZXJ2ZWQ7Ci0JX19sZTMyIHNoYXJlZDsKLQlfX2xlMzIgeG9mZjsKLQlfX2xlMzIgeG9uOwotCV9fbGUzMiBmdWxsOwotCV9fbGUzMiBub3RmdWxsOwotCV9fbGUzMiBtYXg7Ci19OwotCi0vKiBPdXRwdXQgKDE2IGJ5dGVzKSAqLwotc3RydWN0IGh3cm1fcXVldWVfYnVmZmVyc19jZmdfb3V0cHV0IHsKLQlfX2xlMTYgZXJyb3JfY29kZTsKLQlfX2xlMTYgcmVxX3R5cGU7Ci0JX19sZTE2IHNlcV9pZDsKLQlfX2xlMTYgcmVzcF9sZW47Ci0JX19sZTMyIHVudXNlZF8wOwotCXU4IHVudXNlZF8xOwotCXU4IHVudXNlZF8yOwotCXU4IHVudXNlZF8zOwotCXU4IHZhbGlkOwotfTsKLQogLyogaHdybV9xdWV1ZV9wZmNlbmFibGVfY2ZnICovCiAvKiBJbnB1dCAoMjQgYnl0ZXMpICovCiBzdHJ1Y3QgaHdybV9xdWV1ZV9wZmNlbmFibGVfY2ZnX2lucHV0IHsKQEAgLTIzNTEsMTIgKzIzODAsMjIgQEAKIAlfX2xlMTYgdGFyZ2V0X2lkOwogCV9fbGU2NCByZXNwX2FkZHI7CiAJX19sZTMyIGZsYWdzOwotCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0ZMQUdTX1BBVEgJCSAgICAweDFVTAorCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0ZMQUdTX1BBVEhfTUFTSwkJICAgIDB4M1VMCisJI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRkxBR1NfUEFUSF9TRlQJCSAgICAwCiAJI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRkxBR1NfUEFUSF9UWAkJICAgKDB4MFVMIDw8IDApCiAJI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRkxBR1NfUEFUSF9SWAkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRkxBR1NfUEFUSF9MQVNUICAgIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9GTEFHU19QQVRIX1JYCi0JI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRkxBR1NfSVZMQU4JCSAgICAweDJVTAorCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0ZMQUdTX1BBVEhfQklESVIJCSAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0ZMQUdTX1BBVEhfTEFTVCAgICBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRkxBR1NfUEFUSF9CSURJUgorCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0ZMQUdTX0lWTEFOCQkgICAgMHg0VUwKIAlfX2xlMzIgZW5hYmxlczsKKwkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9FTkFCTEVTX1BSSTBfQ09TX1FVRVVFX0lEICAgIDB4MVVMCisJI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRU5BQkxFU19QUkkxX0NPU19RVUVVRV9JRCAgICAweDJVTAorCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0VOQUJMRVNfUFJJMl9DT1NfUVVFVUVfSUQgICAgMHg0VUwKKwkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9FTkFCTEVTX1BSSTNfQ09TX1FVRVVFX0lEICAgIDB4OFVMCisJI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRU5BQkxFU19QUkk0X0NPU19RVUVVRV9JRCAgICAweDEwVUwKKwkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9FTkFCTEVTX1BSSTVfQ09TX1FVRVVFX0lEICAgIDB4MjBVTAorCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0VOQUJMRVNfUFJJNl9DT1NfUVVFVUVfSUQgICAgMHg0MFVMCisJI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRU5BQkxFU19QUkk3X0NPU19RVUVVRV9JRCAgICAweDgwVUwKIAl1OCBwb3J0X2lkOwogCXU4IHByaTBfY29zX3F1ZXVlX2lkOwogCXU4IHByaTFfY29zX3F1ZXVlX2lkOwpAQCAtMjQwNCw4MiArMjQ0MywyMjYgQEAKIAl1OCBxdWV1ZV9pZDA7CiAJdTggdW51c2VkXzA7CiAJX19sZTMyIHF1ZXVlX2lkMF9taW5fYnc7CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUlOX0JXX0JXX1ZBTFVFX01BU0sgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NSU5fQldfQldfVkFMVUVfU0ZUIDAKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NSU5fQldfUlNWRAkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSyAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NSU5fQldfQldfVkFMVUVfVU5JVF9TRlQgMjkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NSU5fQldfQldfVkFMVUVfVU5JVF9NQlBTICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NSU5fQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01JTl9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAlfX2xlMzIgcXVldWVfaWQwX21heF9idzsKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NQVhfQldfQldfVkFMVUVfTUFTSyAweGZmZmZmZmZVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01BWF9CV19CV19WQUxVRV9TRlQgMAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01BWF9CV19SU1ZECSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NQVhfQldfQldfVkFMVUVfVU5JVF9NQVNLIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01BWF9CV19CV19WQUxVRV9VTklUX1NGVCAyOQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01BWF9CV19CV19WQUxVRV9VTklUX01CUFMgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01BWF9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCXU4IHF1ZXVlX2lkMF90c2FfYXNzaWduOwotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX1RTQV9BU1NJR05fU1AgICAgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9UU0FfQVNTSUdOX0VUUyAgICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfVFNBX0FTU0lHTl9SRVNFUlZFRF9GSVJTVCAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9UU0FfQVNTSUdOX1JFU0VSVkVEX0xBU1QgKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX1RTQV9BU1NJR05fU1AgICAgICAweDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX1RTQV9BU1NJR05fRVRTICAgICAweDFVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX1RTQV9BU1NJR05fUkVTRVJWRURfRklSU1QgMHgyVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9UU0FfQVNTSUdOX1JFU0VSVkVEX0xBU1QgMHhmZlVMCiAJdTggcXVldWVfaWQwX3ByaV9sdmw7CiAJdTggcXVldWVfaWQwX2J3X3dlaWdodDsKIAl1OCBxdWV1ZV9pZDE7CiAJX19sZTMyIHF1ZXVlX2lkMV9taW5fYnc7CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUlOX0JXX0JXX1ZBTFVFX01BU0sgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NSU5fQldfQldfVkFMVUVfU0ZUIDAKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NSU5fQldfUlNWRAkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSyAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NSU5fQldfQldfVkFMVUVfVU5JVF9TRlQgMjkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NSU5fQldfQldfVkFMVUVfVU5JVF9NQlBTICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NSU5fQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01JTl9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAlfX2xlMzIgcXVldWVfaWQxX21heF9idzsKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NQVhfQldfQldfVkFMVUVfTUFTSyAweGZmZmZmZmZVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01BWF9CV19CV19WQUxVRV9TRlQgMAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01BWF9CV19SU1ZECSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NQVhfQldfQldfVkFMVUVfVU5JVF9NQVNLIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01BWF9CV19CV19WQUxVRV9VTklUX1NGVCAyOQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01BWF9CV19CV19WQUxVRV9VTklUX01CUFMgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01BWF9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCXU4IHF1ZXVlX2lkMV90c2FfYXNzaWduOwotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX1RTQV9BU1NJR05fU1AgICAgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9UU0FfQVNTSUdOX0VUUyAgICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfVFNBX0FTU0lHTl9SRVNFUlZFRF9GSVJTVCAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9UU0FfQVNTSUdOX1JFU0VSVkVEX0xBU1QgKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX1RTQV9BU1NJR05fU1AgICAgICAweDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX1RTQV9BU1NJR05fRVRTICAgICAweDFVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX1RTQV9BU1NJR05fUkVTRVJWRURfRklSU1QgMHgyVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9UU0FfQVNTSUdOX1JFU0VSVkVEX0xBU1QgMHhmZlVMCiAJdTggcXVldWVfaWQxX3ByaV9sdmw7CiAJdTggcXVldWVfaWQxX2J3X3dlaWdodDsKIAl1OCBxdWV1ZV9pZDI7CiAJX19sZTMyIHF1ZXVlX2lkMl9taW5fYnc7CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUlOX0JXX0JXX1ZBTFVFX01BU0sgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NSU5fQldfQldfVkFMVUVfU0ZUIDAKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NSU5fQldfUlNWRAkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSyAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NSU5fQldfQldfVkFMVUVfVU5JVF9TRlQgMjkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NSU5fQldfQldfVkFMVUVfVU5JVF9NQlBTICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NSU5fQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01JTl9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAlfX2xlMzIgcXVldWVfaWQyX21heF9idzsKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NQVhfQldfQldfVkFMVUVfTUFTSyAweGZmZmZmZmZVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01BWF9CV19CV19WQUxVRV9TRlQgMAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01BWF9CV19SU1ZECSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NQVhfQldfQldfVkFMVUVfVU5JVF9NQVNLIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01BWF9CV19CV19WQUxVRV9VTklUX1NGVCAyOQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01BWF9CV19CV19WQUxVRV9VTklUX01CUFMgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01BWF9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCXU4IHF1ZXVlX2lkMl90c2FfYXNzaWduOwotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX1RTQV9BU1NJR05fU1AgICAgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9UU0FfQVNTSUdOX0VUUyAgICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfVFNBX0FTU0lHTl9SRVNFUlZFRF9GSVJTVCAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9UU0FfQVNTSUdOX1JFU0VSVkVEX0xBU1QgKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX1RTQV9BU1NJR05fU1AgICAgICAweDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX1RTQV9BU1NJR05fRVRTICAgICAweDFVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX1RTQV9BU1NJR05fUkVTRVJWRURfRklSU1QgMHgyVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9UU0FfQVNTSUdOX1JFU0VSVkVEX0xBU1QgMHhmZlVMCiAJdTggcXVldWVfaWQyX3ByaV9sdmw7CiAJdTggcXVldWVfaWQyX2J3X3dlaWdodDsKIAl1OCBxdWV1ZV9pZDM7CiAJX19sZTMyIHF1ZXVlX2lkM19taW5fYnc7CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUlOX0JXX0JXX1ZBTFVFX01BU0sgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NSU5fQldfQldfVkFMVUVfU0ZUIDAKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NSU5fQldfUlNWRAkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSyAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NSU5fQldfQldfVkFMVUVfVU5JVF9TRlQgMjkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NSU5fQldfQldfVkFMVUVfVU5JVF9NQlBTICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NSU5fQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01JTl9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAlfX2xlMzIgcXVldWVfaWQzX21heF9idzsKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NQVhfQldfQldfVkFMVUVfTUFTSyAweGZmZmZmZmZVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01BWF9CV19CV19WQUxVRV9TRlQgMAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01BWF9CV19SU1ZECSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NQVhfQldfQldfVkFMVUVfVU5JVF9NQVNLIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01BWF9CV19CV19WQUxVRV9VTklUX1NGVCAyOQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01BWF9CV19CV19WQUxVRV9VTklUX01CUFMgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01BWF9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCXU4IHF1ZXVlX2lkM190c2FfYXNzaWduOwotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX1RTQV9BU1NJR05fU1AgICAgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19UU0FfQVNTSUdOX0VUUyAgICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfVFNBX0FTU0lHTl9SRVNFUlZFRF9GSVJTVCAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19UU0FfQVNTSUdOX1JFU0VSVkVEX0xBU1QgKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX1RTQV9BU1NJR05fU1AgICAgICAweDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX1RTQV9BU1NJR05fRVRTICAgICAweDFVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX1RTQV9BU1NJR05fUkVTRVJWRURfRklSU1QgMHgyVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19UU0FfQVNTSUdOX1JFU0VSVkVEX0xBU1QgMHhmZlVMCiAJdTggcXVldWVfaWQzX3ByaV9sdmw7CiAJdTggcXVldWVfaWQzX2J3X3dlaWdodDsKIAl1OCBxdWV1ZV9pZDQ7CiAJX19sZTMyIHF1ZXVlX2lkNF9taW5fYnc7CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUlOX0JXX0JXX1ZBTFVFX01BU0sgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NSU5fQldfQldfVkFMVUVfU0ZUIDAKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NSU5fQldfUlNWRAkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSyAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NSU5fQldfQldfVkFMVUVfVU5JVF9TRlQgMjkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NSU5fQldfQldfVkFMVUVfVU5JVF9NQlBTICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NSU5fQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01JTl9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAlfX2xlMzIgcXVldWVfaWQ0X21heF9idzsKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NQVhfQldfQldfVkFMVUVfTUFTSyAweGZmZmZmZmZVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01BWF9CV19CV19WQUxVRV9TRlQgMAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01BWF9CV19SU1ZECSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NQVhfQldfQldfVkFMVUVfVU5JVF9NQVNLIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01BWF9CV19CV19WQUxVRV9VTklUX1NGVCAyOQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01BWF9CV19CV19WQUxVRV9VTklUX01CUFMgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01BWF9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCXU4IHF1ZXVlX2lkNF90c2FfYXNzaWduOwotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X1RTQV9BU1NJR05fU1AgICAgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9UU0FfQVNTSUdOX0VUUyAgICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfVFNBX0FTU0lHTl9SRVNFUlZFRF9GSVJTVCAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9UU0FfQVNTSUdOX1JFU0VSVkVEX0xBU1QgKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X1RTQV9BU1NJR05fU1AgICAgICAweDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X1RTQV9BU1NJR05fRVRTICAgICAweDFVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X1RTQV9BU1NJR05fUkVTRVJWRURfRklSU1QgMHgyVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9UU0FfQVNTSUdOX1JFU0VSVkVEX0xBU1QgMHhmZlVMCiAJdTggcXVldWVfaWQ0X3ByaV9sdmw7CiAJdTggcXVldWVfaWQ0X2J3X3dlaWdodDsKIAl1OCBxdWV1ZV9pZDU7CiAJX19sZTMyIHF1ZXVlX2lkNV9taW5fYnc7CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUlOX0JXX0JXX1ZBTFVFX01BU0sgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NSU5fQldfQldfVkFMVUVfU0ZUIDAKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NSU5fQldfUlNWRAkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSyAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NSU5fQldfQldfVkFMVUVfVU5JVF9TRlQgMjkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NSU5fQldfQldfVkFMVUVfVU5JVF9NQlBTICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NSU5fQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01JTl9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAlfX2xlMzIgcXVldWVfaWQ1X21heF9idzsKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NQVhfQldfQldfVkFMVUVfTUFTSyAweGZmZmZmZmZVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01BWF9CV19CV19WQUxVRV9TRlQgMAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01BWF9CV19SU1ZECSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NQVhfQldfQldfVkFMVUVfVU5JVF9NQVNLIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01BWF9CV19CV19WQUxVRV9VTklUX1NGVCAyOQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01BWF9CV19CV19WQUxVRV9VTklUX01CUFMgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01BWF9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCXU4IHF1ZXVlX2lkNV90c2FfYXNzaWduOwotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X1RTQV9BU1NJR05fU1AgICAgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9UU0FfQVNTSUdOX0VUUyAgICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfVFNBX0FTU0lHTl9SRVNFUlZFRF9GSVJTVCAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9UU0FfQVNTSUdOX1JFU0VSVkVEX0xBU1QgKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X1RTQV9BU1NJR05fU1AgICAgICAweDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X1RTQV9BU1NJR05fRVRTICAgICAweDFVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X1RTQV9BU1NJR05fUkVTRVJWRURfRklSU1QgMHgyVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9UU0FfQVNTSUdOX1JFU0VSVkVEX0xBU1QgMHhmZlVMCiAJdTggcXVldWVfaWQ1X3ByaV9sdmw7CiAJdTggcXVldWVfaWQ1X2J3X3dlaWdodDsKIAl1OCBxdWV1ZV9pZDY7CiAJX19sZTMyIHF1ZXVlX2lkNl9taW5fYnc7CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUlOX0JXX0JXX1ZBTFVFX01BU0sgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NSU5fQldfQldfVkFMVUVfU0ZUIDAKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NSU5fQldfUlNWRAkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSyAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NSU5fQldfQldfVkFMVUVfVU5JVF9TRlQgMjkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NSU5fQldfQldfVkFMVUVfVU5JVF9NQlBTICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NSU5fQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01JTl9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAlfX2xlMzIgcXVldWVfaWQ2X21heF9idzsKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NQVhfQldfQldfVkFMVUVfTUFTSyAweGZmZmZmZmZVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01BWF9CV19CV19WQUxVRV9TRlQgMAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01BWF9CV19SU1ZECSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NQVhfQldfQldfVkFMVUVfVU5JVF9NQVNLIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01BWF9CV19CV19WQUxVRV9VTklUX1NGVCAyOQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01BWF9CV19CV19WQUxVRV9VTklUX01CUFMgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01BWF9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCXU4IHF1ZXVlX2lkNl90c2FfYXNzaWduOwotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X1RTQV9BU1NJR05fU1AgICAgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9UU0FfQVNTSUdOX0VUUyAgICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfVFNBX0FTU0lHTl9SRVNFUlZFRF9GSVJTVCAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9UU0FfQVNTSUdOX1JFU0VSVkVEX0xBU1QgKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X1RTQV9BU1NJR05fU1AgICAgICAweDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X1RTQV9BU1NJR05fRVRTICAgICAweDFVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X1RTQV9BU1NJR05fUkVTRVJWRURfRklSU1QgMHgyVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9UU0FfQVNTSUdOX1JFU0VSVkVEX0xBU1QgMHhmZlVMCiAJdTggcXVldWVfaWQ2X3ByaV9sdmw7CiAJdTggcXVldWVfaWQ2X2J3X3dlaWdodDsKIAl1OCBxdWV1ZV9pZDc7CiAJX19sZTMyIHF1ZXVlX2lkN19taW5fYnc7CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUlOX0JXX0JXX1ZBTFVFX01BU0sgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NSU5fQldfQldfVkFMVUVfU0ZUIDAKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NSU5fQldfUlNWRAkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSyAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NSU5fQldfQldfVkFMVUVfVU5JVF9TRlQgMjkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NSU5fQldfQldfVkFMVUVfVU5JVF9NQlBTICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NSU5fQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01JTl9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAlfX2xlMzIgcXVldWVfaWQ3X21heF9idzsKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NQVhfQldfQldfVkFMVUVfTUFTSyAweGZmZmZmZmZVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01BWF9CV19CV19WQUxVRV9TRlQgMAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01BWF9CV19SU1ZECSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NQVhfQldfQldfVkFMVUVfVU5JVF9NQVNLIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01BWF9CV19CV19WQUxVRV9VTklUX1NGVCAyOQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01BWF9CV19CV19WQUxVRV9VTklUX01CUFMgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01BWF9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCXU4IHF1ZXVlX2lkN190c2FfYXNzaWduOwotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X1RTQV9BU1NJR05fU1AgICAgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19UU0FfQVNTSUdOX0VUUyAgICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfVFNBX0FTU0lHTl9SRVNFUlZFRF9GSVJTVCAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19UU0FfQVNTSUdOX1JFU0VSVkVEX0xBU1QgKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X1RTQV9BU1NJR05fU1AgICAgICAweDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X1RTQV9BU1NJR05fRVRTICAgICAweDFVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X1RTQV9BU1NJR05fUkVTRVJWRURfRklSU1QgMHgyVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19UU0FfQVNTSUdOX1JFU0VSVkVEX0xBU1QgMHhmZlVMCiAJdTggcXVldWVfaWQ3X3ByaV9sdmw7CiAJdTggcXVldWVfaWQ3X2J3X3dlaWdodDsKIAl1OCB1bnVzZWRfMVs1XTsKQEAgLTI1NjMsNiArMjc0Niw3IEBACiAJI2RlZmluZSBWTklDX0NGR19SRVFfRkxBR1NfQkRfU1RBTExfTU9ERQkJICAgIDB4NFVMCiAJI2RlZmluZSBWTklDX0NGR19SRVFfRkxBR1NfUk9DRV9EVUFMX1ZOSUNfTU9ERQkJICAgIDB4OFVMCiAJI2RlZmluZSBWTklDX0NGR19SRVFfRkxBR1NfUk9DRV9PTkxZX1ZOSUNfTU9ERQkJICAgIDB4MTBVTAorCSNkZWZpbmUgVk5JQ19DRkdfUkVRX0ZMQUdTX1JTU19ERkxUX0NSX01PREUJCSAgICAweDIwVUwKIAlfX2xlMzIgZW5hYmxlczsKIAkjZGVmaW5lIFZOSUNfQ0ZHX1JFUV9FTkFCTEVTX0RGTFRfUklOR19HUlAJCSAgICAweDFVTAogCSNkZWZpbmUgVk5JQ19DRkdfUkVRX0VOQUJMRVNfUlNTX1JVTEUJCQkgICAgMHgyVUwKQEAgLTI2MTUsMTggKzI3OTksMTggQEAKIAkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfRU5BQkxFU19NSU5fQUdHX0xFTgkJICAgIDB4OFVMCiAJX19sZTE2IHZuaWNfaWQ7CiAJX19sZTE2IG1heF9hZ2dfc2VnczsKLQkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR19TRUdTXzEJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHX1NFR1NfMgkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dfU0VHU180CQkgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR19TRUdTXzgJCSAgICgweDNVTCA8PCAwKQotCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHX1NFR1NfTUFYCQkgICAoMHgxZlVMIDw8IDApCisJI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dfU0VHU18xCQkgICAweDBVTAorCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHX1NFR1NfMgkJICAgMHgxVUwKKwkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR19TRUdTXzQJCSAgIDB4MlVMCisJI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dfU0VHU184CQkgICAweDNVTAorCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHX1NFR1NfTUFYCQkgICAweDFmVUwKIAlfX2xlMTYgbWF4X2FnZ3M7Ci0JI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dTXzEJCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR1NfMgkJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHU180CQkJICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dTXzgJCQkgICAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR1NfMTYJCQkgICAoMHg0VUwgPDwgMCkKLQkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR1NfTUFYCQkJICAgKDB4N1VMIDw8IDApCisJI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dTXzEJCQkgICAweDBVTAorCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHU18yCQkJICAgMHgxVUwKKwkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR1NfNAkJCSAgIDB4MlVMCisJI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dTXzgJCQkgICAweDNVTAorCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHU18xNgkJCSAgIDB4NFVMCisJI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dTX01BWAkJCSAgIDB4N1VMCiAJdTggdW51c2VkXzA7CiAJdTggdW51c2VkXzE7CiAJX19sZTMyIG1heF9hZ2dfdGltZXI7CkBAIC0yNzgwLDE1ICsyOTY0LDE1IEBACiAJX19sZTY0IHJlc3BfYWRkcjsKIAlfX2xlMzIgZW5hYmxlczsKIAkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX0VOQUJMRVNfUkVTRVJWRUQxCQkgICAgMHgxVUwKLQkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX0VOQUJMRVNfUkVTRVJWRUQyCQkgICAgMHgyVUwKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX0VOQUJMRVNfUklOR19BUkJfQ0ZHCQkgICAgMHgyVUwKIAkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX0VOQUJMRVNfUkVTRVJWRUQzCQkgICAgMHg0VUwKIAkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX0VOQUJMRVNfU1RBVF9DVFhfSURfVkFMSUQJICAgIDB4OFVMCiAJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9FTkFCTEVTX1JFU0VSVkVENAkJICAgIDB4MTBVTAogCSNkZWZpbmUgUklOR19BTExPQ19SRVFfRU5BQkxFU19NQVhfQldfVkFMSUQJCSAgICAweDIwVUwKIAl1OCByaW5nX3R5cGU7Ci0JI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9SSU5HX1RZUEVfQ01QTAkJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUklOR19BTExPQ19SRVFfUklOR19UWVBFX1RYCQkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9SSU5HX1RZUEVfUlgJCQkgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX1JJTkdfVFlQRV9DTVBMCQkJICAgMHgwVUwKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX1JJTkdfVFlQRV9UWAkJCSAgIDB4MVVMCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9SSU5HX1RZUEVfUlgJCQkgICAweDJVTAogCXU4IHVudXNlZF8wOwogCV9fbGUxNiB1bnVzZWRfMTsKIAlfX2xlNjQgcGFnZV90YmxfYWRkcjsKQEAgLTI4MDQsMTggKzI5ODgsMzYgQEAKIAl1OCB1bnVzZWRfNDsKIAl1OCB1bnVzZWRfNTsKIAlfX2xlMzIgcmVzZXJ2ZWQxOwotCV9fbGUxNiByZXNlcnZlZDI7CisJX19sZTE2IHJpbmdfYXJiX2NmZzsKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX1JJTkdfQVJCX0NGR19BUkJfUE9MSUNZX01BU0sJICAgIDB4ZlVMCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9SSU5HX0FSQl9DRkdfQVJCX1BPTElDWV9TRlQJICAgIDAKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX1JJTkdfQVJCX0NGR19BUkJfUE9MSUNZX1NQCSAgICgweDFVTCA8PCAwKQorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfUklOR19BUkJfQ0ZHX0FSQl9QT0xJQ1lfV0ZRCSAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfUklOR19BUkJfQ0ZHX0FSQl9QT0xJQ1lfTEFTVCAgICBSSU5HX0FMTE9DX1JFUV9SSU5HX0FSQl9DRkdfQVJCX1BPTElDWV9XRlEKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX1JJTkdfQVJCX0NGR19SU1ZEX01BU0sJCSAgICAweGYwVUwKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX1JJTkdfQVJCX0NGR19SU1ZEX1NGVAkJICAgIDQKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX1JJTkdfQVJCX0NGR19BUkJfUE9MSUNZX1BBUkFNX01BU0sgIDB4ZmYwMFVMCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9SSU5HX0FSQl9DRkdfQVJCX1BPTElDWV9QQVJBTV9TRlQgICA4CiAJdTggdW51c2VkXzY7CiAJdTggdW51c2VkXzc7CiAJX19sZTMyIHJlc2VydmVkMzsKIAlfX2xlMzIgc3RhdF9jdHhfaWQ7CiAJX19sZTMyIHJlc2VydmVkNDsKIAlfX2xlMzIgbWF4X2J3OworCSNkZWZpbmUgUklOR19BTExPQ19SRVFfTUFYX0JXX0JXX1ZBTFVFX01BU0sJCSAgICAweGZmZmZmZmZVTAorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfTUFYX0JXX0JXX1ZBTFVFX1NGVAkJICAgIDAKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX01BWF9CV19SU1ZECQkJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSwkgICAgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9NQVhfQldfQldfVkFMVUVfVU5JVF9TRlQJICAgIDI5CisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9NQVhfQldfQldfVkFMVUVfVU5JVF9NQlBTCSAgICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX01BWF9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAgICAgICAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9NQVhfQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIFJJTkdfQUxMT0NfUkVRX01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAl1OCBpbnRfbW9kZTsKLQkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX0lOVF9NT0RFX0xFR0FDWQkJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUklOR19BTExPQ19SRVFfSU5UX01PREVfUlNWRAkJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUklOR19BTExPQ19SRVFfSU5UX01PREVfTVNJWAkJCSAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgUklOR19BTExPQ19SRVFfSU5UX01PREVfUE9MTAkJCSAgICgweDNVTCA8PCAwKQorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfSU5UX01PREVfTEVHQUNZCQkJICAgMHgwVUwKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX0lOVF9NT0RFX1JTVkQJCQkgICAweDFVTAorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfSU5UX01PREVfTVNJWAkJCSAgIDB4MlVMCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9JTlRfTU9ERV9QT0xMCQkJICAgMHgzVUwKIAl1OCB1bnVzZWRfOFszXTsKIH07CiAKQEAgLTI4NDIsOSArMzA0NCw5IEBACiAJX19sZTE2IHRhcmdldF9pZDsKIAlfX2xlNjQgcmVzcF9hZGRyOwogCXU4IHJpbmdfdHlwZTsKLQkjZGVmaW5lIFJJTkdfRlJFRV9SRVFfUklOR19UWVBFX0NNUEwJCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFJJTkdfRlJFRV9SRVFfUklOR19UWVBFX1RYCQkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBSSU5HX0ZSRUVfUkVRX1JJTkdfVFlQRV9SWAkJCSAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgUklOR19GUkVFX1JFUV9SSU5HX1RZUEVfQ01QTAkJCSAgIDB4MFVMCisJI2RlZmluZSBSSU5HX0ZSRUVfUkVRX1JJTkdfVFlQRV9UWAkJCSAgIDB4MVVMCisJI2RlZmluZSBSSU5HX0ZSRUVfUkVRX1JJTkdfVFlQRV9SWAkJCSAgIDB4MlVMCiAJdTggdW51c2VkXzA7CiAJX19sZTE2IHJpbmdfaWQ7CiAJX19sZTMyIHVudXNlZF8xOwpAQCAtMjk0Miw5ICszMTQ0LDkgQEAKIAlfX2xlMTYgdGFyZ2V0X2lkOwogCV9fbGU2NCByZXNwX2FkZHI7CiAJdTggcmluZ190eXBlOwotCSNkZWZpbmUgUklOR19SRVNFVF9SRVFfUklOR19UWVBFX0NNUEwJCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFJJTkdfUkVTRVRfUkVRX1JJTkdfVFlQRV9UWAkJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUklOR19SRVNFVF9SRVFfUklOR19UWVBFX1JYCQkJICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBSSU5HX1JFU0VUX1JFUV9SSU5HX1RZUEVfQ01QTAkJCSAgIDB4MFVMCisJI2RlZmluZSBSSU5HX1JFU0VUX1JFUV9SSU5HX1RZUEVfVFgJCQkgICAweDFVTAorCSNkZWZpbmUgUklOR19SRVNFVF9SRVFfUklOR19UWVBFX1JYCQkJICAgMHgyVUwKIAl1OCB1bnVzZWRfMDsKIAlfX2xlMTYgcmluZ19pZDsKIAlfX2xlMzIgdW51c2VkXzE7CkBAIC0zMDY4LDM2ICszMjcwLDM2IEBACiAJX19sZTE2IHRfbDJfaXZsYW47CiAJX19sZTE2IHRfbDJfaXZsYW5fbWFzazsKIAl1OCBzcmNfdHlwZTsKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1NSQ19UWVBFX05QT1JUCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1NSQ19UWVBFX1BGCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1NSQ19UWVBFX1ZGCQkgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1NSQ19UWVBFX1ZOSUMJCSAgICgweDNVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfU1JDX1RZUEVfS09ORwkJICAgKDB4NFVMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9TUkNfVFlQRV9BUEUJCSAgICgweDVVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfU1JDX1RZUEVfQk9OTwkJICAgKDB4NlVMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9TUkNfVFlQRV9UQU5HCQkgICAoMHg3VUwgPDwgMCkKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1NSQ19UWVBFX05QT1JUCQkgICAweDBVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfU1JDX1RZUEVfUEYJCSAgIDB4MVVMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9TUkNfVFlQRV9WRgkJICAgMHgyVUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1NSQ19UWVBFX1ZOSUMJCSAgIDB4M1VMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9TUkNfVFlQRV9LT05HCQkgICAweDRVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfU1JDX1RZUEVfQVBFCQkgICAweDVVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfU1JDX1RZUEVfQk9OTwkJICAgMHg2VUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1NSQ19UWVBFX1RBTkcJCSAgIDB4N1VMCiAJdTggdW51c2VkXzY7CiAJX19sZTMyIHNyY19pZDsKIAl1OCB0dW5uZWxfdHlwZTsKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX05PTlRVTk5FTCAgICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9WWExBTgkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX05WR1JFCSAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTDJHUkUJICAgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9JUElQCSAgICgweDRVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfR0VORVZFCSAgICgweDVVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTVBMUwkgICAoMHg2VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX1NUVAkgICAoMHg3VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0lQR1JFCSAgICgweDhVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfQU5ZVFVOTkVMICAgICAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9OT05UVU5ORUwgICAgIDB4MFVMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9WWExBTgkgICAweDFVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTlZHUkUJICAgMHgyVUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0wyR1JFCSAgIDB4M1VMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9JUElQCSAgIDB4NFVMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9HRU5FVkUJICAgMHg1VUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX01QTFMJICAgMHg2VUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX1NUVAkgICAweDdVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfSVBHUkUJICAgMHg4VUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0FOWVRVTk5FTCAgICAgMHhmZlVMCiAJdTggdW51c2VkXzc7CiAJX19sZTE2IGRzdF9pZDsKIAlfX2xlMTYgbWlycm9yX3ZuaWNfaWQ7CiAJdTggcHJpX2hpbnQ7Ci0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9OT19QUkVGRVIJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9BQk9WRV9GSUxURVIgICAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfQkVMT1dfRklMVEVSICAgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX01BWAkJICAgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9NSU4JCSAgICgweDRVTCA8PCAwKQorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfTk9fUFJFRkVSCSAgIDB4MFVMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9BQk9WRV9GSUxURVIgICAgIDB4MVVMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9CRUxPV19GSUxURVIgICAgIDB4MlVMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9NQVgJCSAgIDB4M1VMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9NSU4JCSAgIDB4NFVMCiAJdTggdW51c2VkXzg7CiAJX19sZTMyIHVudXNlZF85OwogCV9fbGU2NCBsMl9maWx0ZXJfaWRfaGludDsKQEAgLTMyNDYsMTYgKzM0NDgsMTYgQEAKIAl1OCBsM19hZGRyX3R5cGU7CiAJdTggdF9sM19hZGRyX3R5cGU7CiAJdTggdHVubmVsX3R5cGU7Ci0JI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTk9OVFVOTkVMICgweDBVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX1ZYTEFOICAgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9OVkdSRSAgICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTDJHUkUgICAgICgweDNVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0lQSVAgICAgICAoMHg0VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9HRU5FVkUgICAgKDB4NVVMIDw8IDApCi0JI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTVBMUyAgICAgICgweDZVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX1NUVCAgICAgICAoMHg3VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9JUEdSRSAgICAgKDB4OFVMIDw8IDApCi0JI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfQU5ZVFVOTkVMICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9OT05UVU5ORUwgMHgwVUwKKwkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9WWExBTiAgICAgMHgxVUwKKwkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9OVkdSRSAgICAgMHgyVUwKKwkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9MMkdSRSAgICAgMHgzVUwKKwkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9JUElQICAgICAgMHg0VUwKKwkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9HRU5FVkUgICAgMHg1VUwKKwkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9NUExTICAgICAgMHg2VUwKKwkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9TVFQgICAgICAgMHg3VUwKKwkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9JUEdSRSAgICAgMHg4VUwKKwkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9BTllUVU5ORUwgMHhmZlVMCiAJdTggdW51c2VkXzA7CiAJX19sZTMyIHZuaTsKIAlfX2xlMzIgZHN0X3ZuaWNfaWQ7CkBAIC0zMzExLDE0ICszNTEzLDE0IEBACiAJX19sZTMyIGZsYWdzOwogCSNkZWZpbmUgQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQ19SRVFfRkxBR1NfTE9PUEJBQ0sJICAgIDB4MVVMCiAJdTggZW5jYXBfdHlwZTsKLQkjZGVmaW5lIENGQV9FTkNBUF9SRUNPUkRfQUxMT0NfUkVRX0VOQ0FQX1RZUEVfVlhMQU4gICAgICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBDRkFfRU5DQVBfUkVDT1JEX0FMTE9DX1JFUV9FTkNBUF9UWVBFX05WR1JFICAgICAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQ19SRVFfRU5DQVBfVFlQRV9MMkdSRSAgICAgICAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9FTkNBUF9SRUNPUkRfQUxMT0NfUkVRX0VOQ0FQX1RZUEVfSVBJUAkgICAoMHg0VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9FTkNBUF9SRUNPUkRfQUxMT0NfUkVRX0VOQ0FQX1RZUEVfR0VORVZFICAgICAgKDB4NVVMIDw8IDApCi0JI2RlZmluZSBDRkFfRU5DQVBfUkVDT1JEX0FMTE9DX1JFUV9FTkNBUF9UWVBFX01QTFMJICAgKDB4NlVMIDw8IDApCi0JI2RlZmluZSBDRkFfRU5DQVBfUkVDT1JEX0FMTE9DX1JFUV9FTkNBUF9UWVBFX1ZMQU4JICAgKDB4N1VMIDw8IDApCi0JI2RlZmluZSBDRkFfRU5DQVBfUkVDT1JEX0FMTE9DX1JFUV9FTkNBUF9UWVBFX0lQR1JFICAgICAgICgweDhVTCA8PCAwKQorCSNkZWZpbmUgQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQ19SRVFfRU5DQVBfVFlQRV9WWExBTiAgICAgICAweDFVTAorCSNkZWZpbmUgQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQ19SRVFfRU5DQVBfVFlQRV9OVkdSRSAgICAgICAweDJVTAorCSNkZWZpbmUgQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQ19SRVFfRU5DQVBfVFlQRV9MMkdSRSAgICAgICAweDNVTAorCSNkZWZpbmUgQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQ19SRVFfRU5DQVBfVFlQRV9JUElQCSAgIDB4NFVMCisJI2RlZmluZSBDRkFfRU5DQVBfUkVDT1JEX0FMTE9DX1JFUV9FTkNBUF9UWVBFX0dFTkVWRSAgICAgIDB4NVVMCisJI2RlZmluZSBDRkFfRU5DQVBfUkVDT1JEX0FMTE9DX1JFUV9FTkNBUF9UWVBFX01QTFMJICAgMHg2VUwKKwkjZGVmaW5lIENGQV9FTkNBUF9SRUNPUkRfQUxMT0NfUkVRX0VOQ0FQX1RZUEVfVkxBTgkgICAweDdVTAorCSNkZWZpbmUgQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQ19SRVFfRU5DQVBfVFlQRV9JUEdSRSAgICAgICAweDhVTAogCXU4IHVudXNlZF8wOwogCV9fbGUxNiB1bnVzZWRfMTsKIAlfX2xlMzIgZW5jYXBfZGF0YVsxNl07CkBAIC0zMzk3LDMyICszNTk5LDMyIEBACiAJdTggc3JjX21hY2FkZHJbNl07CiAJX19iZTE2IGV0aGVydHlwZTsKIAl1OCBpcF9hZGRyX3R5cGU7Ci0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfSVBfQUREUl9UWVBFX1VOS05PV04gICgweDBVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX0lQX0FERFJfVFlQRV9JUFY0ICAgICAoMHg0VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9JUF9BRERSX1RZUEVfSVBWNiAgICAgKDB4NlVMIDw8IDApCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfSVBfQUREUl9UWVBFX1VOS05PV04gIDB4MFVMCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfSVBfQUREUl9UWVBFX0lQVjQgICAgIDB4NFVMCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfSVBfQUREUl9UWVBFX0lQVjYgICAgIDB4NlVMCiAJdTggaXBfcHJvdG9jb2w7Ci0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfSVBfUFJPVE9DT0xfVU5LTk9XTiAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX0lQX1BST1RPQ09MX1VEUCAgICAgICAoMHg2VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9JUF9QUk9UT0NPTF9UQ1AgICAgICAgKDB4MTFVTCA8PCAwKQorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX0lQX1BST1RPQ09MX1VOS05PV04gICAweDBVTAorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX0lQX1BST1RPQ09MX1VEUCAgICAgICAweDZVTAorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX0lQX1BST1RPQ09MX1RDUCAgICAgICAweDExVUwKIAlfX2xlMTYgZHN0X2lkOwogCV9fbGUxNiBtaXJyb3Jfdm5pY19pZDsKIAl1OCB0dW5uZWxfdHlwZTsKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9OT05UVU5ORUwgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfVlhMQU4gICAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX05WR1JFICAgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9MMkdSRSAgICAgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfSVBJUCAgICAgICgweDRVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0dFTkVWRSAgICAoMHg1VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9NUExTICAgICAgKDB4NlVMIDw8IDApCi0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfU1RUICAgICAgICgweDdVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0lQR1JFICAgICAoMHg4VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9BTllUVU5ORUwgKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX05PTlRVTk5FTCAweDBVTAorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX1ZYTEFOICAgICAweDFVTAorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX05WR1JFICAgICAweDJVTAorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0wyR1JFICAgICAweDNVTAorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0lQSVAgICAgICAweDRVTAorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0dFTkVWRSAgICAweDVVTAorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX01QTFMgICAgICAweDZVTAorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX1NUVCAgICAgICAweDdVTAorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0lQR1JFICAgICAweDhVTAorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0FOWVRVTk5FTCAweGZmVUwKIAl1OCBwcmlfaGludDsKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9OT19QUkVGRVIgICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfQUJPVkUJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfQkVMT1cJICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfSElHSEVTVCAgICAgICgweDNVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX0xPV0VTVCAgICAgICAoMHg0VUwgPDwgMCkKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9OT19QUkVGRVIgICAgMHgwVUwKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9BQk9WRQkgICAweDFVTAorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX0JFTE9XCSAgIDB4MlVMCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfSElHSEVTVCAgICAgIDB4M1VMCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfTE9XRVNUICAgICAgIDB4NFVMCiAJX19iZTMyIHNyY19pcGFkZHJbNF07CiAJX19iZTMyIHNyY19pcGFkZHJfbWFza1s0XTsKIAlfX2JlMzIgZHN0X2lwYWRkcls0XTsKQEAgLTM1MTEsOCArMzcxMyw4IEBACiAJX19sZTE2IHRhcmdldF9pZDsKIAlfX2xlNjQgcmVzcF9hZGRyOwogCXU4IHR1bm5lbF90eXBlOwotCSNkZWZpbmUgVFVOTkVMX0RTVF9QT1JUX1FVRVJZX1JFUV9UVU5ORUxfVFlQRV9WWExBTiAgICAgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFRVTk5FTF9EU1RfUE9SVF9RVUVSWV9SRVFfVFVOTkVMX1RZUEVfR0VORVZFICAgICAgKDB4NVVMIDw8IDApCisJI2RlZmluZSBUVU5ORUxfRFNUX1BPUlRfUVVFUllfUkVRX1RVTk5FTF9UWVBFX1ZYTEFOICAgICAgIDB4MVVMCisJI2RlZmluZSBUVU5ORUxfRFNUX1BPUlRfUVVFUllfUkVRX1RVTk5FTF9UWVBFX0dFTkVWRSAgICAgIDB4NVVMCiAJdTggdW51c2VkXzBbN107CiB9OwogCkBAIC0zNTM5LDggKzM3NDEsOCBAQAogCV9fbGUxNiB0YXJnZXRfaWQ7CiAJX19sZTY0IHJlc3BfYWRkcjsKIAl1OCB0dW5uZWxfdHlwZTsKLQkjZGVmaW5lIFRVTk5FTF9EU1RfUE9SVF9BTExPQ19SRVFfVFVOTkVMX1RZUEVfVlhMQU4gICAgICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBUVU5ORUxfRFNUX1BPUlRfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0dFTkVWRSAgICAgICgweDVVTCA8PCAwKQorCSNkZWZpbmUgVFVOTkVMX0RTVF9QT1JUX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9WWExBTiAgICAgICAweDFVTAorCSNkZWZpbmUgVFVOTkVMX0RTVF9QT1JUX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9HRU5FVkUgICAgICAweDVVTAogCXU4IHVudXNlZF8wOwogCV9fYmUxNiB0dW5uZWxfZHN0X3BvcnRfdmFsOwogCV9fbGUzMiB1bnVzZWRfMTsKQEAgLTM1NzAsOCArMzc3Miw4IEBACiAJX19sZTE2IHRhcmdldF9pZDsKIAlfX2xlNjQgcmVzcF9hZGRyOwogCXU4IHR1bm5lbF90eXBlOwotCSNkZWZpbmUgVFVOTkVMX0RTVF9QT1JUX0ZSRUVfUkVRX1RVTk5FTF9UWVBFX1ZYTEFOCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgVFVOTkVMX0RTVF9QT1JUX0ZSRUVfUkVRX1RVTk5FTF9UWVBFX0dFTkVWRSAgICAgICAoMHg1VUwgPDwgMCkKKwkjZGVmaW5lIFRVTk5FTF9EU1RfUE9SVF9GUkVFX1JFUV9UVU5ORUxfVFlQRV9WWExBTgkgICAweDFVTAorCSNkZWZpbmUgVFVOTkVMX0RTVF9QT1JUX0ZSRUVfUkVRX1RVTk5FTF9UWVBFX0dFTkVWRSAgICAgICAweDVVTAogCXU4IHVudXNlZF8wOwogCV9fbGUxNiB0dW5uZWxfZHN0X3BvcnRfaWQ7CiAJX19sZTMyIHVudXNlZF8xOwpAQCAtMzcyMCwxNSArMzkyMiwxNSBAQAogCV9fbGUxNiB0YXJnZXRfaWQ7CiAJX19sZTY0IHJlc3BfYWRkcjsKIAl1OCBlbWJlZGRlZF9wcm9jX3R5cGU7Ci0JI2RlZmluZSBGV19SRVNFVF9SRVFfRU1CRURERURfUFJPQ19UWVBFX0JPT1QJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgRldfUkVTRVRfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9NR01UCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIEZXX1JFU0VUX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfTkVUQ1RSTAkgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIEZXX1JFU0VUX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfUk9DRQkJICAgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBGV19SRVNFVF9SRVFfRU1CRURERURfUFJPQ19UWVBFX1JTVkQJCSAgICgweDRVTCA8PCAwKQorCSNkZWZpbmUgRldfUkVTRVRfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9CT09UCQkgICAweDBVTAorCSNkZWZpbmUgRldfUkVTRVRfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9NR01UCQkgICAweDFVTAorCSNkZWZpbmUgRldfUkVTRVRfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9ORVRDVFJMCSAgIDB4MlVMCisJI2RlZmluZSBGV19SRVNFVF9SRVFfRU1CRURERURfUFJPQ19UWVBFX1JPQ0UJCSAgIDB4M1VMCisJI2RlZmluZSBGV19SRVNFVF9SRVFfRU1CRURERURfUFJPQ19UWVBFX1JTVkQJCSAgIDB4NFVMCiAJdTggc2VsZnJzdF9zdGF0dXM7Ci0JI2RlZmluZSBGV19SRVNFVF9SRVFfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVE5PTkUJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBGV19SRVNFVF9SRVFfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVEFTQVAJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBGV19SRVNFVF9SRVFfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVFBDSUVSU1QJICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBGV19SRVNFVF9SRVFfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVE5PTkUJICAgMHgwVUwKKwkjZGVmaW5lIEZXX1JFU0VUX1JFUV9TRUxGUlNUX1NUQVRVU19TRUxGUlNUQVNBUAkgICAweDFVTAorCSNkZWZpbmUgRldfUkVTRVRfUkVRX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1RQQ0lFUlNUCSAgIDB4MlVMCiAJX19sZTE2IHVudXNlZF8wWzNdOwogfTsKIApAQCAtMzczOSw5ICszOTQxLDkgQEAKIAlfX2xlMTYgc2VxX2lkOwogCV9fbGUxNiByZXNwX2xlbjsKIAl1OCBzZWxmcnN0X3N0YXR1czsKLQkjZGVmaW5lIEZXX1JFU0VUX1JFU1BfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVE5PTkUJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBGV19SRVNFVF9SRVNQX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1RBU0FQCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgRldfUkVTRVRfUkVTUF9TRUxGUlNUX1NUQVRVU19TRUxGUlNUUENJRVJTVCAgICAgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIEZXX1JFU0VUX1JFU1BfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVE5PTkUJICAgMHgwVUwKKwkjZGVmaW5lIEZXX1JFU0VUX1JFU1BfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVEFTQVAJICAgMHgxVUwKKwkjZGVmaW5lIEZXX1JFU0VUX1JFU1BfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVFBDSUVSU1QgICAgICAgMHgyVUwKIAl1OCB1bnVzZWRfMDsKIAlfX2xlMTYgdW51c2VkXzE7CiAJdTggdW51c2VkXzI7CkBAIC0zNzU5LDExICszOTYxLDExIEBACiAJX19sZTE2IHRhcmdldF9pZDsKIAlfX2xlNjQgcmVzcF9hZGRyOwogCXU4IGVtYmVkZGVkX3Byb2NfdHlwZTsKLQkjZGVmaW5lIEZXX1FTVEFUVVNfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9CT09UCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIEZXX1FTVEFUVVNfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9NR01UCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIEZXX1FTVEFUVVNfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9ORVRDVFJMCSAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgRldfUVNUQVRVU19SRVFfRU1CRURERURfUFJPQ19UWVBFX1JPQ0UJCSAgICgweDNVTCA8PCAwKQotCSNkZWZpbmUgRldfUVNUQVRVU19SRVFfRU1CRURERURfUFJPQ19UWVBFX1JTVkQJCSAgICgweDRVTCA8PCAwKQorCSNkZWZpbmUgRldfUVNUQVRVU19SRVFfRU1CRURERURfUFJPQ19UWVBFX0JPT1QJCSAgIDB4MFVMCisJI2RlZmluZSBGV19RU1RBVFVTX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfTUdNVAkJICAgMHgxVUwKKwkjZGVmaW5lIEZXX1FTVEFUVVNfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9ORVRDVFJMCSAgIDB4MlVMCisJI2RlZmluZSBGV19RU1RBVFVTX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfUk9DRQkJICAgMHgzVUwKKwkjZGVmaW5lIEZXX1FTVEFUVVNfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9SU1ZECQkgICAweDRVTAogCXU4IHVudXNlZF8wWzddOwogfTsKIApAQCAtMzc3NCw5ICszOTc2LDkgQEAKIAlfX2xlMTYgc2VxX2lkOwogCV9fbGUxNiByZXNwX2xlbjsKIAl1OCBzZWxmcnN0X3N0YXR1czsKLQkjZGVmaW5lIEZXX1FTVEFUVVNfUkVTUF9TRUxGUlNUX1NUQVRVU19TRUxGUlNUTk9ORQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIEZXX1FTVEFUVVNfUkVTUF9TRUxGUlNUX1NUQVRVU19TRUxGUlNUQVNBUAkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIEZXX1FTVEFUVVNfUkVTUF9TRUxGUlNUX1NUQVRVU19TRUxGUlNUUENJRVJTVCAgICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBGV19RU1RBVFVTX1JFU1BfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVE5PTkUJICAgMHgwVUwKKwkjZGVmaW5lIEZXX1FTVEFUVVNfUkVTUF9TRUxGUlNUX1NUQVRVU19TRUxGUlNUQVNBUAkgICAweDFVTAorCSNkZWZpbmUgRldfUVNUQVRVU19SRVNQX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1RQQ0lFUlNUICAgICAweDJVTAogCXU4IHVudXNlZF8wOwogCV9fbGUxNiB1bnVzZWRfMTsKIAl1OCB1bnVzZWRfMjsKQEAgLTM3ODUsNiArMzk4Nyw0MiBAQAogCXU4IHZhbGlkOwogfTsKIAorLyogaHdybV9md19zZXRfdGltZSAqLworLyogSW5wdXQgKDMyIGJ5dGVzKSAqLworc3RydWN0IGh3cm1fZndfc2V0X3RpbWVfaW5wdXQgeworCV9fbGUxNiByZXFfdHlwZTsKKwlfX2xlMTYgY21wbF9yaW5nOworCV9fbGUxNiBzZXFfaWQ7CisJX19sZTE2IHRhcmdldF9pZDsKKwlfX2xlNjQgcmVzcF9hZGRyOworCV9fbGUxNiB5ZWFyOworCSNkZWZpbmUgRldfU0VUX1RJTUVfUkVRX1lFQVJfVU5LTk9XTgkJCSAgIDB4MFVMCisJdTggbW9udGg7CisJdTggZGF5OworCXU4IGhvdXI7CisJdTggbWludXRlOworCXU4IHNlY29uZDsKKwl1OCB1bnVzZWRfMDsKKwlfX2xlMTYgbWlsbGlzZWNvbmQ7CisJX19sZTE2IHpvbmU7CisJI2RlZmluZSBGV19TRVRfVElNRV9SRVFfWk9ORV9VVEMJCQkgICAweDBVTAorCSNkZWZpbmUgRldfU0VUX1RJTUVfUkVRX1pPTkVfVU5LTk9XTgkJCSAgIDB4ZmZmZlVMCisJX19sZTMyIHVudXNlZF8xOworfTsKKworLyogT3V0cHV0ICgxNiBieXRlcykgKi8KK3N0cnVjdCBod3JtX2Z3X3NldF90aW1lX291dHB1dCB7CisJX19sZTE2IGVycm9yX2NvZGU7CisJX19sZTE2IHJlcV90eXBlOworCV9fbGUxNiBzZXFfaWQ7CisJX19sZTE2IHJlc3BfbGVuOworCV9fbGUzMiB1bnVzZWRfMDsKKwl1OCB1bnVzZWRfMTsKKwl1OCB1bnVzZWRfMjsKKwl1OCB1bnVzZWRfMzsKKwl1OCB2YWxpZDsKK307CisKIC8qIGh3cm1fZXhlY19md2RfcmVzcCAqLwogLyogSW5wdXQgKDEyOCBieXRlcykgKi8KIHN0cnVjdCBod3JtX2V4ZWNfZndkX3Jlc3BfaW5wdXQgewpAQCAtMzkyMSwzMiArNDE1OSw2IEBACiAJdTggdmFsaWQ7CiB9OwogCi0vKiBod3JtX252bV9yYXdfd3JpdGVfYmxrICovCi0vKiBJbnB1dCAoMzIgYnl0ZXMpICovCi1zdHJ1Y3QgaHdybV9udm1fcmF3X3dyaXRlX2Jsa19pbnB1dCB7Ci0JX19sZTE2IHJlcV90eXBlOwotCV9fbGUxNiBjbXBsX3Jpbmc7Ci0JX19sZTE2IHNlcV9pZDsKLQlfX2xlMTYgdGFyZ2V0X2lkOwotCV9fbGU2NCByZXNwX2FkZHI7Ci0JX19sZTY0IGhvc3Rfc3JjX2FkZHI7Ci0JX19sZTMyIGRlc3RfYWRkcjsKLQlfX2xlMzIgbGVuOwotfTsKLQotLyogT3V0cHV0ICgxNiBieXRlcykgKi8KLXN0cnVjdCBod3JtX252bV9yYXdfd3JpdGVfYmxrX291dHB1dCB7Ci0JX19sZTE2IGVycm9yX2NvZGU7Ci0JX19sZTE2IHJlcV90eXBlOwotCV9fbGUxNiBzZXFfaWQ7Ci0JX19sZTE2IHJlc3BfbGVuOwotCV9fbGUzMiB1bnVzZWRfMDsKLQl1OCB1bnVzZWRfMTsKLQl1OCB1bnVzZWRfMjsKLQl1OCB1bnVzZWRfMzsKLQl1OCB2YWxpZDsKLX07Ci0KIC8qIGh3cm1fbnZtX3JlYWQgKi8KIC8qIElucHV0ICg0MCBieXRlcykgKi8KIHN0cnVjdCBod3JtX252bV9yZWFkX2lucHV0IHsKQEAgLTQxMzIsOSArNDM0NCw5IEBACiAJdTggb3B0X29yZGluYWw7CiAJI2RlZmluZSBOVk1fRklORF9ESVJfRU5UUllfUkVRX09QVF9PUkRJTkFMX01BU0sJICAgIDB4M1VMCiAJI2RlZmluZSBOVk1fRklORF9ESVJfRU5UUllfUkVRX09QVF9PUkRJTkFMX1NGVAkJICAgIDAKLQkjZGVmaW5lIE5WTV9GSU5EX0RJUl9FTlRSWV9SRVFfT1BUX09SRElOQUxfRVEJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgTlZNX0ZJTkRfRElSX0VOVFJZX1JFUV9PUFRfT1JESU5BTF9HRQkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBOVk1fRklORF9ESVJfRU5UUllfUkVRX09QVF9PUkRJTkFMX0dUCQkgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIE5WTV9GSU5EX0RJUl9FTlRSWV9SRVFfT1BUX09SRElOQUxfRVEJCSAgIDB4MFVMCisJI2RlZmluZSBOVk1fRklORF9ESVJfRU5UUllfUkVRX09QVF9PUkRJTkFMX0dFCQkgICAweDFVTAorCSNkZWZpbmUgTlZNX0ZJTkRfRElSX0VOVFJZX1JFUV9PUFRfT1JESU5BTF9HVAkJICAgMHgyVUwKIAl1OCB1bnVzZWRfMVszXTsKIH07CiAKQEAgLTQyNjYsNCArNDQ3OCw0MSBAQAogCXU4IHZhbGlkOwogfTsKIAorLyogaHdybV9udm1faW5zdGFsbF91cGRhdGUgKi8KKy8qIElucHV0ICgyNCBieXRlcykgKi8KK3N0cnVjdCBod3JtX252bV9pbnN0YWxsX3VwZGF0ZV9pbnB1dCB7CisJX19sZTE2IHJlcV90eXBlOworCV9fbGUxNiBjbXBsX3Jpbmc7CisJX19sZTE2IHNlcV9pZDsKKwlfX2xlMTYgdGFyZ2V0X2lkOworCV9fbGU2NCByZXNwX2FkZHI7CisJX19sZTMyIGluc3RhbGxfdHlwZTsKKwkjZGVmaW5lIE5WTV9JTlNUQUxMX1VQREFURV9SRVFfSU5TVEFMTF9UWVBFX05PUk1BTAkgICAweDBVTAorCSNkZWZpbmUgTlZNX0lOU1RBTExfVVBEQVRFX1JFUV9JTlNUQUxMX1RZUEVfQUxMCSAgIDB4ZmZmZmZmZmZVTAorCV9fbGUzMiB1bnVzZWRfMDsKK307CisKKy8qIE91dHB1dCAoMjQgYnl0ZXMpICovCitzdHJ1Y3QgaHdybV9udm1faW5zdGFsbF91cGRhdGVfb3V0cHV0IHsKKwlfX2xlMTYgZXJyb3JfY29kZTsKKwlfX2xlMTYgcmVxX3R5cGU7CisJX19sZTE2IHNlcV9pZDsKKwlfX2xlMTYgcmVzcF9sZW47CisJX19sZTY0IGluc3RhbGxlZF9pdGVtczsKKwl1OCByZXN1bHQ7CisJI2RlZmluZSBOVk1fSU5TVEFMTF9VUERBVEVfUkVTUF9SRVNVTFRfU1VDQ0VTUwkJICAgMHgwVUwKKwl1OCBwcm9ibGVtX2l0ZW07CisJI2RlZmluZSBOVk1fSU5TVEFMTF9VUERBVEVfUkVTUF9QUk9CTEVNX0lURU1fTk9ORQkgICAweDBVTAorCSNkZWZpbmUgTlZNX0lOU1RBTExfVVBEQVRFX1JFU1BfUFJPQkxFTV9JVEVNX1BBQ0tBR0UgICAgICAweGZmVUwKKwl1OCByZXNldF9yZXF1aXJlZDsKKwkjZGVmaW5lIE5WTV9JTlNUQUxMX1VQREFURV9SRVNQX1JFU0VUX1JFUVVJUkVEX05PTkUgICAgICAgMHgwVUwKKwkjZGVmaW5lIE5WTV9JTlNUQUxMX1VQREFURV9SRVNQX1JFU0VUX1JFUVVJUkVEX1BDSQkgICAweDFVTAorCSNkZWZpbmUgTlZNX0lOU1RBTExfVVBEQVRFX1JFU1BfUkVTRVRfUkVRVUlSRURfUE9XRVIgICAgICAweDJVTAorCXU4IHVudXNlZF8wOworCXU4IHVudXNlZF8xOworCXU4IHVudXNlZF8yOworCXU4IHVudXNlZF8zOworCXU4IHZhbGlkOworfTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfc3Jpb3YuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9zcmlvdi5jCmluZGV4IDUwZDIwMDcuLmVjNmNkMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9zcmlvdi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9zcmlvdi5jCkBAIC0xOSw2ICsxOSw0NSBAQAogI2luY2x1ZGUgImJueHRfZXRodG9vbC5oIgogCiAjaWZkZWYgQ09ORklHX0JOWFRfU1JJT1YKK3N0YXRpYyBpbnQgYm54dF9od3JtX2Z3ZF9hc3luY19ldmVudF9jbXBsKHN0cnVjdCBibnh0ICpicCwKKwkJCQkJICBzdHJ1Y3QgYm54dF92Zl9pbmZvICp2ZiwgdTE2IGV2ZW50X2lkKQoreworCXN0cnVjdCBod3JtX2Z3ZF9hc3luY19ldmVudF9jbXBsX291dHB1dCAqcmVzcCA9IGJwLT5od3JtX2NtZF9yZXNwX2FkZHI7CisJc3RydWN0IGh3cm1fZndkX2FzeW5jX2V2ZW50X2NtcGxfaW5wdXQgcmVxID0gezB9OworCXN0cnVjdCBod3JtX2FzeW5jX2V2ZW50X2NtcGwgKmFzeW5jX2NtcGw7CisJaW50IHJjID0gMDsKKworCWJueHRfaHdybV9jbWRfaGRyX2luaXQoYnAsICZyZXEsIEhXUk1fRldEX0FTWU5DX0VWRU5UX0NNUEwsIC0xLCAtMSk7CisJaWYgKHZmKQorCQlyZXEuZW5jYXBfYXN5bmNfZXZlbnRfdGFyZ2V0X2lkID0gY3B1X3RvX2xlMTYodmYtPmZ3X2ZpZCk7CisJZWxzZQorCQkvKiBicm9hZGNhc3QgdGhpcyBhc3luYyBldmVudCB0byBhbGwgVkZzICovCisJCXJlcS5lbmNhcF9hc3luY19ldmVudF90YXJnZXRfaWQgPSBjcHVfdG9fbGUxNigweGZmZmYpOworCWFzeW5jX2NtcGwgPSAoc3RydWN0IGh3cm1fYXN5bmNfZXZlbnRfY21wbCAqKXJlcS5lbmNhcF9hc3luY19ldmVudF9jbXBsOworCWFzeW5jX2NtcGwtPnR5cGUgPQorCQljcHVfdG9fbGUxNihIV1JNX0FTWU5DX0VWRU5UX0NNUExfVFlQRV9IV1JNX0FTWU5DX0VWRU5UKTsKKwlhc3luY19jbXBsLT5ldmVudF9pZCA9IGNwdV90b19sZTE2KGV2ZW50X2lkKTsKKworCW11dGV4X2xvY2soJmJwLT5od3JtX2NtZF9sb2NrKTsKKwlyYyA9IF9od3JtX3NlbmRfbWVzc2FnZShicCwgJnJlcSwgc2l6ZW9mKHJlcSksIEhXUk1fQ01EX1RJTUVPVVQpOworCisJaWYgKHJjKSB7CisJCW5ldGRldl9lcnIoYnAtPmRldiwgImh3cm1fZndkX2FzeW5jX2V2ZW50X2NtcGwgZmFpbGVkLiByYzolZFxuIiwKKwkJCSAgIHJjKTsKKwkJZ290byBmd2RfYXN5bmNfZXZlbnRfY21wbF9leGl0OworCX0KKworCWlmIChyZXNwLT5lcnJvcl9jb2RlKSB7CisJCW5ldGRldl9lcnIoYnAtPmRldiwgImh3cm1fZndkX2FzeW5jX2V2ZW50X2NtcGwgZXJyb3IgJWRcbiIsCisJCQkgICByZXNwLT5lcnJvcl9jb2RlKTsKKwkJcmMgPSAtMTsKKwl9CisKK2Z3ZF9hc3luY19ldmVudF9jbXBsX2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZicC0+aHdybV9jbWRfbG9jayk7CisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW50IGJueHRfdmZfbmRvX3ByZXAoc3RydWN0IGJueHQgKmJwLCBpbnQgdmZfaWQpCiB7CiAJaWYgKCF0ZXN0X2JpdChCTlhUX1NUQVRFX09QRU4sICZicC0+c3RhdGUpKSB7CkBAIC0xMzUsNyArMTc0LDggQEAKIAlyZXR1cm4gaHdybV9zZW5kX21lc3NhZ2UoYnAsICZyZXEsIHNpemVvZihyZXEpLCBIV1JNX0NNRF9USU1FT1VUKTsKIH0KIAotaW50IGJueHRfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZmX2lkLCB1MTYgdmxhbl9pZCwgdTggcW9zKQoraW50IGJueHRfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZmX2lkLCB1MTYgdmxhbl9pZCwgdTggcW9zLAorCQkgICAgIF9fYmUxNiB2bGFuX3Byb3RvKQogewogCXN0cnVjdCBod3JtX2Z1bmNfY2ZnX2lucHV0IHJlcSA9IHswfTsKIAlzdHJ1Y3QgYm54dCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMTQ2LDYgKzE4Niw5IEBACiAJaWYgKGJwLT5od3JtX3NwZWNfY29kZSA8IDB4MTAyMDEpCiAJCXJldHVybiAtRU5PVFNVUFA7CiAKKwlpZiAodmxhbl9wcm90byAhPSBodG9ucyhFVEhfUF84MDIxUSkpCisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCiAJcmMgPSBibnh0X3ZmX25kb19wcmVwKGJwLCB2Zl9pZCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CkBAIC0yNDMsOCArMjg2LDkgQEAKIAkJcmMgPSAtRUlOVkFMOwogCQlicmVhazsKIAl9Ci0JLyogQ0hJTVAgVE9ETzogc2VuZCBtc2cgdG8gVkYgdG8gdXBkYXRlIG5ldyBsaW5rIHN0YXRlICovCi0KKwlpZiAodmYtPmZsYWdzICYgKEJOWFRfVkZfTElOS19VUCB8IEJOWFRfVkZfTElOS19GT1JDRUQpKQorCQlyYyA9IGJueHRfaHdybV9md2RfYXN5bmNfZXZlbnRfY21wbChicCwgdmYsCisJCQlIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfTElOS19TVEFUVVNfQ0hBTkdFKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTUyNSw0NiArNTY5LDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgYm54dF9od3JtX2Z3ZF9hc3luY19ldmVudF9jbXBsKHN0cnVjdCBibnh0ICpicCwKLQkJCQkJICBzdHJ1Y3QgYm54dF92Zl9pbmZvICp2ZiwKLQkJCQkJICB1MTYgZXZlbnRfaWQpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgaHdybV9md2RfYXN5bmNfZXZlbnRfY21wbF9pbnB1dCByZXEgPSB7MH07Ci0Jc3RydWN0IGh3cm1fZndkX2FzeW5jX2V2ZW50X2NtcGxfb3V0cHV0ICpyZXNwID0gYnAtPmh3cm1fY21kX3Jlc3BfYWRkcjsKLQlzdHJ1Y3QgaHdybV9hc3luY19ldmVudF9jbXBsICphc3luY19jbXBsOwotCi0JYm54dF9od3JtX2NtZF9oZHJfaW5pdChicCwgJnJlcSwgSFdSTV9GV0RfQVNZTkNfRVZFTlRfQ01QTCwgLTEsIC0xKTsKLQlpZiAodmYpCi0JCXJlcS5lbmNhcF9hc3luY19ldmVudF90YXJnZXRfaWQgPSBjcHVfdG9fbGUxNih2Zi0+ZndfZmlkKTsKLQllbHNlCi0JCS8qIGJyb2FkY2FzdCB0aGlzIGFzeW5jIGV2ZW50IHRvIGFsbCBWRnMgKi8KLQkJcmVxLmVuY2FwX2FzeW5jX2V2ZW50X3RhcmdldF9pZCA9IGNwdV90b19sZTE2KDB4ZmZmZik7Ci0JYXN5bmNfY21wbCA9IChzdHJ1Y3QgaHdybV9hc3luY19ldmVudF9jbXBsICopcmVxLmVuY2FwX2FzeW5jX2V2ZW50X2NtcGw7Ci0JYXN5bmNfY21wbC0+dHlwZSA9Ci0JCWNwdV90b19sZTE2KEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9UWVBFX0hXUk1fQVNZTkNfRVZFTlQpOwotCWFzeW5jX2NtcGwtPmV2ZW50X2lkID0gY3B1X3RvX2xlMTYoZXZlbnRfaWQpOwotCi0JbXV0ZXhfbG9jaygmYnAtPmh3cm1fY21kX2xvY2spOwotCXJjID0gX2h3cm1fc2VuZF9tZXNzYWdlKGJwLCAmcmVxLCBzaXplb2YocmVxKSwgSFdSTV9DTURfVElNRU9VVCk7Ci0KLQlpZiAocmMpIHsKLQkJbmV0ZGV2X2VycihicC0+ZGV2LCAiaHdybV9md2RfYXN5bmNfZXZlbnRfY21wbCBmYWlsZWQuIHJjOiVkXG4iLAotCQkJICAgcmMpOwotCQlnb3RvIGZ3ZF9hc3luY19ldmVudF9jbXBsX2V4aXQ7Ci0JfQotCi0JaWYgKHJlc3AtPmVycm9yX2NvZGUpIHsKLQkJbmV0ZGV2X2VycihicC0+ZGV2LCAiaHdybV9md2RfYXN5bmNfZXZlbnRfY21wbCBlcnJvciAlZFxuIiwKLQkJCSAgIHJlc3AtPmVycm9yX2NvZGUpOwotCQlyYyA9IC0xOwotCX0KLQotZndkX2FzeW5jX2V2ZW50X2NtcGxfZXhpdDoKLQltdXRleF91bmxvY2soJmJwLT5od3JtX2NtZF9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KIHZvaWQgYm54dF9zcmlvdl9kaXNhYmxlKHN0cnVjdCBibnh0ICpicCkKIHsKIAl1MTYgbnVtX3ZmcyA9IHBjaV9udW1fdmYoYnAtPnBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3NyaW92LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfc3Jpb3YuaAppbmRleCAwMzkyNjcwLi4xYWI3MmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfc3Jpb3YuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfc3Jpb3YuaApAQCAtMTIsNyArMTIsNyBAQAogCiBpbnQgYm54dF9nZXRfdmZfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgc3RydWN0IGlmbGFfdmZfaW5mbyAqKTsKIGludCBibnh0X3NldF92Zl9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50LCB1OCAqKTsKLWludCBibnh0X3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgdTE2LCB1OCk7CitpbnQgYm54dF9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIHUxNiwgdTgsIF9fYmUxNik7CiBpbnQgYm54dF9zZXRfdmZfYncoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50LCBpbnQsIGludCk7CiBpbnQgYm54dF9zZXRfdmZfbGlua19zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIGludCk7CiBpbnQgYm54dF9zZXRfdmZfc3Bvb2ZjaGsoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50LCBib29sKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbWdlbmV0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9nZW5ldC9iY21nZW5ldC5jCmluZGV4IDhkNGY4NDkuLjQ0NjRiYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbWdlbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtZ2VuZXQuYwpAQCAtNDUwLDI4ICs0NTAsMzIgQEAKIAkJCWdlbmV0X2RtYV9yaW5nX3JlZ3Nbcl0pOwogfQogCi1zdGF0aWMgaW50IGJjbWdlbmV0X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgYmNtZ2VuZXRfZ2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CisJc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFkZXYtPnBoeWRldikKKwlpZiAoIXByaXYtPnBoeWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChkZXYtPnBoeWRldiwgY21kKTsKKwlyZXR1cm4gcGh5X2V0aHRvb2xfa3NldHRpbmdzX2dldChwcml2LT5waHlkZXYsIGNtZCk7CiB9CiAKLXN0YXRpYyBpbnQgYmNtZ2VuZXRfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIGludCBiY21nZW5ldF9zZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKKwlzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIWRldi0+cGh5ZGV2KQorCWlmICghcHJpdi0+cGh5ZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KGRldi0+cGh5ZGV2LCBjbWQpOworCXJldHVybiBwaHlfZXRodG9vbF9rc2V0dGluZ3Nfc2V0KHByaXYtPnBoeWRldiwgY21kKTsKIH0KIAogc3RhdGljIGludCBiY21nZW5ldF9zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtOTM3LDcgKzk0MSw3IEBACiAJZS0+ZWVlX2FjdGl2ZSA9IHAtPmVlZV9hY3RpdmU7CiAJZS0+dHhfbHBpX3RpbWVyID0gYmNtZ2VuZXRfdW1hY19yZWFkbChwcml2LCBVTUFDX0VFRV9MUElfVElNRVIpOwogCi0JcmV0dXJuIHBoeV9ldGh0b29sX2dldF9lZWUoZGV2LT5waHlkZXYsIGUpOworCXJldHVybiBwaHlfZXRodG9vbF9nZXRfZWVlKHByaXYtPnBoeWRldiwgZSk7CiB9CiAKIHN0YXRpYyBpbnQgYmNtZ2VuZXRfc2V0X2VlZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9lZWUgKmUpCkBAIC05NTQsNyArOTU4LDcgQEAKIAlpZiAoIXAtPmVlZV9lbmFibGVkKSB7CiAJCWJjbWdlbmV0X2VlZV9lbmFibGVfc2V0KGRldiwgZmFsc2UpOwogCX0gZWxzZSB7Ci0JCXJldCA9IHBoeV9pbml0X2VlZShkZXYtPnBoeWRldiwgMCk7CisJCXJldCA9IHBoeV9pbml0X2VlZShwcml2LT5waHlkZXYsIDApOwogCQlpZiAocmV0KSB7CiAJCQluZXRpZl9lcnIocHJpdiwgaHcsIGRldiwgIkVFRSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIHJldDsKQEAgLTk2NCwyMSArOTY4LDIxIEBACiAJCWJjbWdlbmV0X2VlZV9lbmFibGVfc2V0KGRldiwgdHJ1ZSk7CiAJfQogCi0JcmV0dXJuIHBoeV9ldGh0b29sX3NldF9lZWUoZGV2LT5waHlkZXYsIGUpOworCXJldHVybiBwaHlfZXRodG9vbF9zZXRfZWVlKHByaXYtPnBoeWRldiwgZSk7CiB9CiAKIHN0YXRpYyBpbnQgYmNtZ2VuZXRfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXJldHVybiBnZW5waHlfcmVzdGFydF9hbmVnKGRldi0+cGh5ZGV2KTsKKwlzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gZ2VucGh5X3Jlc3RhcnRfYW5lZyhwcml2LT5waHlkZXYpOwogfQogCiAvKiBzdGFuZGFyZCBldGh0b29sIHN1cHBvcnQgZnVuY3Rpb25zLiAqLwotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBiY21nZW5ldF9ldGh0b29sX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgYmNtZ2VuZXRfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9zdHJpbmdzCQk9IGJjbWdlbmV0X2dldF9zdHJpbmdzLAogCS5nZXRfc3NldF9jb3VudAkJPSBiY21nZW5ldF9nZXRfc3NldF9jb3VudCwKIAkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBiY21nZW5ldF9nZXRfZXRodG9vbF9zdGF0cywKLQkuZ2V0X3NldHRpbmdzCQk9IGJjbWdlbmV0X2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzCQk9IGJjbWdlbmV0X3NldF9zZXR0aW5ncywKIAkuZ2V0X2RydmluZm8JCT0gYmNtZ2VuZXRfZ2V0X2RydmluZm8sCiAJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCiAJLmdldF9tc2dsZXZlbAkJPSBiY21nZW5ldF9nZXRfbXNnbGV2ZWwsCkBAIC05OTAsMTkgKzk5NCwyMCBAQAogCS5ud2F5X3Jlc2V0CQk9IGJjbWdlbmV0X253YXlfcmVzZXQsCiAJLmdldF9jb2FsZXNjZQkJPSBiY21nZW5ldF9nZXRfY29hbGVzY2UsCiAJLnNldF9jb2FsZXNjZQkJPSBiY21nZW5ldF9zZXRfY29hbGVzY2UsCisJLmdldF9saW5rX2tzZXR0aW5ncwk9IGJjbWdlbmV0X2dldF9saW5rX2tzZXR0aW5ncywKKwkuc2V0X2xpbmtfa3NldHRpbmdzCT0gYmNtZ2VuZXRfc2V0X2xpbmtfa3NldHRpbmdzLAogfTsKIAogLyogUG93ZXIgZG93biB0aGUgdW5pbWFjLCBiYXNlZCBvbiBtb2RlLiAqLwogc3RhdGljIGludCBiY21nZW5ldF9wb3dlcl9kb3duKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2LAogCQkJCWVudW0gYmNtZ2VuZXRfcG93ZXJfbW9kZSBtb2RlKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcHJpdi0+ZGV2OwogCWludCByZXQgPSAwOwogCXUzMiByZWc7CiAKIAlzd2l0Y2ggKG1vZGUpIHsKIAljYXNlIEdFTkVUX1BPV0VSX0NBQkxFX1NFTlNFOgotCQlwaHlfZGV0YWNoKG5kZXYtPnBoeWRldik7CisJCXBoeV9kZXRhY2gocHJpdi0+cGh5ZGV2KTsKIAkJYnJlYWs7CiAKIAljYXNlIEdFTkVUX1BPV0VSX1dPTF9NQUdJQzoKQEAgLTEwNjMsNiArMTA2OCw3IEBACiAvKiBpb2N0bCBoYW5kbGUgc3BlY2lhbCBjb21tYW5kcyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiBldGh0b29sLiAqLwogc3RhdGljIGludCBiY21nZW5ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQogeworCXN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgdmFsID0gMDsKIAogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQpAQCAtMTA3MiwxMCArMTA3OCwxMCBAQAogCWNhc2UgU0lPQ0dNSUlQSFk6CiAJY2FzZSBTSU9DR01JSVJFRzoKIAljYXNlIFNJT0NTTUlJUkVHOgotCQlpZiAoIWRldi0+cGh5ZGV2KQorCQlpZiAoIXByaXYtPnBoeWRldikKIAkJCXZhbCA9IC1FTk9ERVY7CiAJCWVsc2UKLQkJCXZhbCA9IHBoeV9taWlfaW9jdGwoZGV2LT5waHlkZXYsIHJxLCBjbWQpOworCQkJdmFsID0gcGh5X21paV9pb2N0bChwcml2LT5waHlkZXYsIHJxLCBjbWQpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0yNDU4LDcgKzI0NjQsNiBAQAogewogCXN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKAogCQkJd29yaywgc3RydWN0IGJjbWdlbmV0X3ByaXYsIGJjbWdlbmV0X2lycV93b3JrKTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHByaXYtPmRldjsKIAogCW5ldGlmX2RiZyhwcml2LCBpbnRyLCBwcml2LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCkBAIC0yNDcxLDcgKzI0NzYsNyBAQAogCiAJLyogTGluayBVUC9ET1dOIGV2ZW50ICovCiAJaWYgKHByaXYtPmlycTBfc3RhdCAmIFVNQUNfSVJRX0xJTktfRVZFTlQpIHsKLQkJcGh5X21hY19pbnRlcnJ1cHQobmRldi0+cGh5ZGV2LAorCQlwaHlfbWFjX2ludGVycnVwdChwcml2LT5waHlkZXYsCiAJCQkJICAhIShwcml2LT5pcnEwX3N0YXQgJiBVTUFDX0lSUV9MSU5LX1VQKSk7CiAJCXByaXYtPmlycTBfc3RhdCAmPSB+VU1BQ19JUlFfTElOS19FVkVOVDsKIAl9CkBAIC0yNjY0LDEyOCArMjY2OSw2IEBACiAJYmNtZ2VuZXRfdGRtYV93cml0ZWwocHJpdiwgcmVnLCBETUFfQ1RSTCk7CiB9CiAKLXN0YXRpYyBib29sIGJjbWdlbmV0X2hmYl9pc19maWx0ZXJfZW5hYmxlZChzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiwKLQkJCQkJICAgdTMyIGZfaW5kZXgpCi17Ci0JdTMyIG9mZnNldDsKLQl1MzIgcmVnOwotCi0Jb2Zmc2V0ID0gSEZCX0ZMVF9FTkFCTEVfVjNQTFVTICsgKGZfaW5kZXggPCAzMikgKiBzaXplb2YodTMyKTsKLQlyZWcgPSBiY21nZW5ldF9oZmJfcmVnX3JlYWRsKHByaXYsIG9mZnNldCk7Ci0JcmV0dXJuICEhKHJlZyAmICgxIDw8IChmX2luZGV4ICUgMzIpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJjbWdlbmV0X2hmYl9lbmFibGVfZmlsdGVyKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2LCB1MzIgZl9pbmRleCkKLXsKLQl1MzIgb2Zmc2V0OwotCXUzMiByZWc7Ci0KLQlvZmZzZXQgPSBIRkJfRkxUX0VOQUJMRV9WM1BMVVMgKyAoZl9pbmRleCA8IDMyKSAqIHNpemVvZih1MzIpOwotCXJlZyA9IGJjbWdlbmV0X2hmYl9yZWdfcmVhZGwocHJpdiwgb2Zmc2V0KTsKLQlyZWcgfD0gKDEgPDwgKGZfaW5kZXggJSAzMikpOwotCWJjbWdlbmV0X2hmYl9yZWdfd3JpdGVsKHByaXYsIHJlZywgb2Zmc2V0KTsKLX0KLQotc3RhdGljIHZvaWQgYmNtZ2VuZXRfaGZiX3NldF9maWx0ZXJfcnhfcXVldWVfbWFwcGluZyhzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiwKLQkJCQkJCSAgICAgdTMyIGZfaW5kZXgsIHUzMiByeF9xdWV1ZSkKLXsKLQl1MzIgb2Zmc2V0OwotCXUzMiByZWc7Ci0KLQlvZmZzZXQgPSBmX2luZGV4IC8gODsKLQlyZWcgPSBiY21nZW5ldF9yZG1hX3JlYWRsKHByaXYsIERNQV9JTkRFWDJSSU5HXzAgKyBvZmZzZXQpOwotCXJlZyAmPSB+KDB4RiA8PCAoNCAqIChmX2luZGV4ICUgOCkpKTsKLQlyZWcgfD0gKChyeF9xdWV1ZSAmIDB4RikgPDwgKDQgKiAoZl9pbmRleCAlIDgpKSk7Ci0JYmNtZ2VuZXRfcmRtYV93cml0ZWwocHJpdiwgcmVnLCBETUFfSU5ERVgyUklOR18wICsgb2Zmc2V0KTsKLX0KLQotc3RhdGljIHZvaWQgYmNtZ2VuZXRfaGZiX3NldF9maWx0ZXJfbGVuZ3RoKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2LAotCQkJCQkgICB1MzIgZl9pbmRleCwgdTMyIGZfbGVuZ3RoKQotewotCXUzMiBvZmZzZXQ7Ci0JdTMyIHJlZzsKLQotCW9mZnNldCA9IEhGQl9GTFRfTEVOX1YzUExVUyArCi0JCSAoKHByaXYtPmh3X3BhcmFtcy0+aGZiX2ZpbHRlcl9jbnQgLSAxIC0gZl9pbmRleCkgLyA0KSAqCi0JCSBzaXplb2YodTMyKTsKLQlyZWcgPSBiY21nZW5ldF9oZmJfcmVnX3JlYWRsKHByaXYsIG9mZnNldCk7Ci0JcmVnICY9IH4oMHhGRiA8PCAoOCAqIChmX2luZGV4ICUgNCkpKTsKLQlyZWcgfD0gKChmX2xlbmd0aCAmIDB4RkYpIDw8ICg4ICogKGZfaW5kZXggJSA0KSkpOwotCWJjbWdlbmV0X2hmYl9yZWdfd3JpdGVsKHByaXYsIHJlZywgb2Zmc2V0KTsKLX0KLQotc3RhdGljIGludCBiY21nZW5ldF9oZmJfZmluZF91bnVzZWRfZmlsdGVyKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2KQotewotCXUzMiBmX2luZGV4OwotCi0JZm9yIChmX2luZGV4ID0gMDsgZl9pbmRleCA8IHByaXYtPmh3X3BhcmFtcy0+aGZiX2ZpbHRlcl9jbnQ7IGZfaW5kZXgrKykKLQkJaWYgKCFiY21nZW5ldF9oZmJfaXNfZmlsdGVyX2VuYWJsZWQocHJpdiwgZl9pbmRleCkpCi0JCQlyZXR1cm4gZl9pbmRleDsKLQotCXJldHVybiAtRU5PTUVNOwotfQotCi0vKiBiY21nZW5ldF9oZmJfYWRkX2ZpbHRlcgotICoKLSAqIEFkZCBuZXcgZmlsdGVyIHRvIEhhcmR3YXJlIEZpbHRlciBCbG9jayB0byBtYXRjaCBhbmQgZGlyZWN0IFJ4IHRyYWZmaWMgdG8KLSAqIGRlc2lyZWQgUnggcXVldWUuCi0gKgotICogZl9kYXRhIGlzIGFuIGFycmF5IG9mIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VycyB3aGVyZSBlYWNoIDMyLWJpdCBpbnRlZ2VyCi0gKiBwcm92aWRlcyBmaWx0ZXIgZGF0YSBmb3IgMiBieXRlcyAoNCBuaWJibGVzKSBvZiBSeCBmcmFtZToKLSAqCi0gKiBiaXRzIDMxOjIwIC0gdW51c2VkCi0gKiBiaXQgIDE5ICAgIC0gbmliYmxlIDAgbWF0Y2ggZW5hYmxlCi0gKiBiaXQgIDE4ICAgIC0gbmliYmxlIDEgbWF0Y2ggZW5hYmxlCi0gKiBiaXQgIDE3ICAgIC0gbmliYmxlIDIgbWF0Y2ggZW5hYmxlCi0gKiBiaXQgIDE2ICAgIC0gbmliYmxlIDMgbWF0Y2ggZW5hYmxlCi0gKiBiaXRzIDE1OjEyIC0gbmliYmxlIDAgZGF0YQotICogYml0cyAxMTo4ICAtIG5pYmJsZSAxIGRhdGEKLSAqIGJpdHMgNzo0ICAgLSBuaWJibGUgMiBkYXRhCi0gKiBiaXRzIDM6MCAgIC0gbmliYmxlIDMgZGF0YQotICoKLSAqIEV4YW1wbGU6Ci0gKiBJbiBvcmRlciB0byBtYXRjaDoKLSAqIC0gRXRoZXJuZXQgZnJhbWUgdHlwZSA9IDB4MDgwMCAoSVApCi0gKiAtIElQIHZlcnNpb24gZmllbGQgPSA0Ci0gKiAtIElQIHByb3RvY29sIGZpZWxkID0gMHgxMSAoVURQKQotICoKLSAqIFRoZSBmb2xsb3dpbmcgZmlsdGVyIGlzIG5lZWRlZDoKLSAqIHUzMiBoZmJfZmlsdGVyX2lwdjRfdWRwW10gPSB7Ci0gKiAgIFJ4IGZyYW1lIG9mZnNldCAweDAwOiAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotICogICBSeCBmcmFtZSBvZmZzZXQgMHgwODogMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBGMDgwMCwgMHgwMDA4NDAwMCwKLSAqICAgUnggZnJhbWUgb2Zmc2V0IDB4MTA6IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzAwMTEsCi0gKiB9OwotICoKLSAqIFRvIGFkZCB0aGUgZmlsdGVyIHRvIEhGQiBhbmQgZGlyZWN0IHRoZSB0cmFmZmljIHRvIFJ4IHF1ZXVlIDAsIGNhbGw6Ci0gKiBiY21nZW5ldF9oZmJfYWRkX2ZpbHRlcihwcml2LCBoZmJfZmlsdGVyX2lwdjRfdWRwLAotICogICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShoZmJfZmlsdGVyX2lwdjRfdWRwKSwgMCk7Ci0gKi8KLWludCBiY21nZW5ldF9oZmJfYWRkX2ZpbHRlcihzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiwgdTMyICpmX2RhdGEsCi0JCQkgICAgdTMyIGZfbGVuZ3RoLCB1MzIgcnhfcXVldWUpCi17Ci0JaW50IGZfaW5kZXg7Ci0JdTMyIGk7Ci0KLQlmX2luZGV4ID0gYmNtZ2VuZXRfaGZiX2ZpbmRfdW51c2VkX2ZpbHRlcihwcml2KTsKLQlpZiAoZl9pbmRleCA8IDApCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGZfbGVuZ3RoID4gcHJpdi0+aHdfcGFyYW1zLT5oZmJfZmlsdGVyX3NpemUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZm9yIChpID0gMDsgaSA8IGZfbGVuZ3RoOyBpKyspCi0JCWJjbWdlbmV0X2hmYl93cml0ZWwocHJpdiwgZl9kYXRhW2ldLAotCQkJKGZfaW5kZXggKiBwcml2LT5od19wYXJhbXMtPmhmYl9maWx0ZXJfc2l6ZSArIGkpICoKLQkJCXNpemVvZih1MzIpKTsKLQotCWJjbWdlbmV0X2hmYl9zZXRfZmlsdGVyX2xlbmd0aChwcml2LCBmX2luZGV4LCAyICogZl9sZW5ndGgpOwotCWJjbWdlbmV0X2hmYl9zZXRfZmlsdGVyX3J4X3F1ZXVlX21hcHBpbmcocHJpdiwgZl9pbmRleCwgcnhfcXVldWUpOwotCWJjbWdlbmV0X2hmYl9lbmFibGVfZmlsdGVyKHByaXYsIGZfaW5kZXgpOwotCWJjbWdlbmV0X2hmYl9yZWdfd3JpdGVsKHByaXYsIDB4MSwgSEZCX0NUUkwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qIGJjbWdlbmV0X2hmYl9jbGVhcgogICoKICAqIENsZWFyIEhhcmR3YXJlIEZpbHRlciBCbG9jayBhbmQgZGlzYWJsZSBhbGwgZmlsdGVyaW5nLgpAQCAtMjgzMyw3ICsyNzE2LDcgQEAKIAkvKiBNb25pdG9yIGxpbmsgaW50ZXJydXB0cyBub3cgKi8KIAliY21nZW5ldF9saW5rX2ludHJfZW5hYmxlKHByaXYpOwogCi0JcGh5X3N0YXJ0KGRldi0+cGh5ZGV2KTsKKwlwaHlfc3RhcnQocHJpdi0+cGh5ZGV2KTsKIH0KIAogc3RhdGljIGludCBiY21nZW5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0yOTMyLDcgKzI4MTUsNyBAQAogCXN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhkZXYpOwotCXBoeV9zdG9wKGRldi0+cGh5ZGV2KTsKKwlwaHlfc3RvcChwcml2LT5waHlkZXYpOwogCWJjbWdlbmV0X2ludHJfZGlzYWJsZShwcml2KTsKIAliY21nZW5ldF9kaXNhYmxlX3J4X25hcGkocHJpdik7CiAJYmNtZ2VuZXRfZGlzYWJsZV90eF9uYXBpKHByaXYpOwpAQCAtMjk1OCw3ICsyODQxLDcgQEAKIAliY21nZW5ldF9uZXRpZl9zdG9wKGRldik7CiAKIAkvKiBSZWFsbHkga2lsbCB0aGUgUEhZIHN0YXRlIG1hY2hpbmUgYW5kIGRpc2Nvbm5lY3QgZnJvbSBpdCAqLwotCXBoeV9kaXNjb25uZWN0KGRldi0+cGh5ZGV2KTsKKwlwaHlfZGlzY29ubmVjdChwcml2LT5waHlkZXYpOwogCiAJLyogRGlzYWJsZSBNQUMgcmVjZWl2ZSAqLwogCXVtYWNfZW5hYmxlX3NldChwcml2LCBDTURfUlhfRU4sIGZhbHNlKTsKQEAgLTM1MTcsNyArMzQwMCw3IEBACiAKIAliY21nZW5ldF9uZXRpZl9zdG9wKGRldik7CiAKLQlwaHlfc3VzcGVuZChkZXYtPnBoeWRldik7CisJcGh5X3N1c3BlbmQocHJpdi0+cGh5ZGV2KTsKIAogCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKIApAQCAtMzU4MSw3ICszNDY0LDcgQEAKIAlpZiAocHJpdi0+d29sb3B0cykKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmNsa193b2wpOwogCi0JcGh5X2luaXRfaHcoZGV2LT5waHlkZXYpOworCXBoeV9pbml0X2h3KHByaXYtPnBoeWRldik7CiAJLyogU3BlZWQgc2V0dGluZ3MgbXVzdCBiZSByZXN0b3JlZCAqLwogCWJjbWdlbmV0X21paV9jb25maWcocHJpdi0+ZGV2KTsKIApAQCAtMzYxNCw3ICszNDk3LDcgQEAKIAogCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKIAotCXBoeV9yZXN1bWUoZGV2LT5waHlkZXYpOworCXBoeV9yZXN1bWUocHJpdi0+cGh5ZGV2KTsKIAogCWlmIChwcml2LT5lZWUuZWVlX2VuYWJsZWQpCiAJCWJjbWdlbmV0X2VlZV9lbmFibGVfc2V0KGRldiwgdHJ1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9nZW5ldC9iY21nZW5ldC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtZ2VuZXQuaAppbmRleCAwZjA4NjhjLi4xZTJkYzM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9nZW5ldC9iY21nZW5ldC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbWdlbmV0LmgKQEAgLTU5Nyw2ICs1OTcsNyBAQAogCiAJLyogTURJTyBidXMgdmFyaWFibGVzICovCiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKIAlib29sIGludGVybmFsX3BoeTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBoeV9kbjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm1kaW9fZG47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9nZW5ldC9iY21taWkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbW1paS5jCmluZGV4IGU5MDdhY2QuLjQ1N2MzYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbW1paS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbW1paS5jCkBAIC04Niw3ICs4Niw3IEBACiB2b2lkIGJjbWdlbmV0X21paV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gZGV2LT5waHlkZXY7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHByaXYtPnBoeWRldjsKIAl1MzIgcmVnLCBjbWRfYml0cyA9IDA7CiAJYm9vbCBzdGF0dXNfY2hhbmdlZCA9IGZhbHNlOwogCkBAIC0xODMsOSArMTgzLDkgQEAKIAlpZiAoR0VORVRfSVNfVjQocHJpdikpCiAJCXJldHVybjsKIAotCWlmIChkZXYtPnBoeWRldikgewotCQlwaHlfaW5pdF9odyhkZXYtPnBoeWRldik7Ci0JCXBoeV9zdGFydF9hbmVnKGRldi0+cGh5ZGV2KTsKKwlpZiAocHJpdi0+cGh5ZGV2KSB7CisJCXBoeV9pbml0X2h3KHByaXYtPnBoeWRldik7CisJCXBoeV9zdGFydF9hbmVnKHByaXYtPnBoeWRldik7CiAJfQogfQogCkBAIC0yMzYsNyArMjM2LDYgQEAKIAogc3RhdGljIHZvaWQgYmNtZ2VuZXRfbW9jYV9waHlfc2V0dXAoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwcml2LT5kZXY7CiAJdTMyIHJlZzsKIAogCS8qIFNwZWVkIHNldHRpbmdzIGFyZSBzZXQgaW4gYmNtZ2VuZXRfbWlpX3NldHVwKCkgKi8KQEAgLTI0NSwxNCArMjQ0LDE0IEBACiAJYmNtZ2VuZXRfc3lzX3dyaXRlbChwcml2LCByZWcsIFNZU19QT1JUX0NUUkwpOwogCiAJaWYgKHByaXYtPmh3X3BhcmFtcy0+ZmxhZ3MgJiBHRU5FVF9IQVNfTU9DQV9MSU5LX0RFVCkKLQkJZml4ZWRfcGh5X3NldF9saW5rX3VwZGF0ZShuZGV2LT5waHlkZXYsCisJCWZpeGVkX3BoeV9zZXRfbGlua191cGRhdGUocHJpdi0+cGh5ZGV2LAogCQkJCQkgIGJjbWdlbmV0X2ZpeGVkX3BoeV9saW5rX3VwZGF0ZSk7CiB9CiAKIGludCBiY21nZW5ldF9taWlfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBkZXYtPnBoeWRldjsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gcHJpdi0+cGh5ZGV2OwogCXN0cnVjdCBkZXZpY2UgKmtkZXYgPSAmcHJpdi0+cGRldi0+ZGV2OwogCWNvbnN0IGNoYXIgKnBoeV9uYW1lID0gTlVMTDsKIAl1MzIgaWRfbW9kZV9kaXMgPSAwOwpAQCAtMzAzLDcgKzMwMiw3IEBACiAJCSAqIGNhcGFiaWxpdGllcywgdXNlIHRoYXQga25vd2xlZGdlIHRvIGFsc28gY29uZmlndXJlIHRoZQogCQkgKiBSZXZlcnNlIE1JSSBpbnRlcmZhY2UgY29ycmVjdGx5LgogCQkgKi8KLQkJaWYgKChwaHlkZXYtPnN1cHBvcnRlZCAmIFBIWV9CQVNJQ19GRUFUVVJFUykgPT0KKwkJaWYgKChwcml2LT5waHlkZXYtPnN1cHBvcnRlZCAmIFBIWV9CQVNJQ19GRUFUVVJFUykgPT0KIAkJCQlQSFlfQkFTSUNfRkVBVFVSRVMpCiAJCQlwb3J0X2N0cmwgPSBQT1JUX01PREVfRVhUX1JWTUlJXzI1OwogCQllbHNlCkBAIC0zNzIsNyArMzcxLDcgQEAKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfSBlbHNlIHsKLQkJcGh5ZGV2ID0gZGV2LT5waHlkZXY7CisJCXBoeWRldiA9IHByaXYtPnBoeWRldjsKIAkJcGh5ZGV2LT5kZXZfZmxhZ3MgPSBwaHlfZmxhZ3M7CiAKIAkJcmV0ID0gcGh5X2Nvbm5lY3RfZGlyZWN0KGRldiwgcGh5ZGV2LCBiY21nZW5ldF9taWlfc2V0dXAsCkBAIC0zODMsNiArMzgyLDggQEAKIAkJfQogCX0KIAorCXByaXYtPnBoeWRldiA9IHBoeWRldjsKKwogCS8qIENvbmZpZ3VyZSBwb3J0IG11bHRpcGxleGVyIGJhc2VkIG9uIHdoYXQgdGhlIHByb2JlZCBQSFkgZGV2aWNlIHNpbmNlCiAJICogcmVhZGluZyB0aGUgJ21heC1zcGVlZCcgcHJvcGVydHkgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBzdXBwb3J0ZWQKIAkgKiBQSFkgc3BlZWQgd2hpY2ggaXMgbmVlZGVkIGZvciBiY21nZW5ldF9taWlfY29uZmlnKCkgdG8gY29uZmlndXJlCkBAIC0zOTAsNyArMzkxLDcgQEAKIAkgKi8KIAlyZXQgPSBiY21nZW5ldF9taWlfY29uZmlnKGRldik7CiAJaWYgKHJldCkgewotCQlwaHlfZGlzY29ubmVjdChwaHlkZXYpOworCQlwaHlfZGlzY29ubmVjdChwcml2LT5waHlkZXYpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNDAwLDcgKzQwMSw3IEBACiAJICogRXRoZXJuZXQgTUFDIElTUnMKIAkgKi8KIAlpZiAocHJpdi0+aW50ZXJuYWxfcGh5KQotCQlwaHlkZXYtPmlycSA9IFBIWV9JR05PUkVfSU5URVJSVVBUOworCQlwcml2LT5waHlkZXYtPmlycSA9IFBIWV9JR05PUkVfSU5URVJSVVBUOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MDUsNiArNjA2LDcgQEAKIAogCX0KIAorCXByaXYtPnBoeWRldiA9IHBoeWRldjsKIAlwcml2LT5waHlfaW50ZXJmYWNlID0gcGQtPnBoeV9pbnRlcmZhY2U7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMKaW5kZXggZmYzMDBmNy4uYTkyN2E3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMKQEAgLTEyMDc5LDk1ICsxMjA3OSwxMDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHRnM19nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCitzdGF0aWMgaW50IHRnM19nZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBzdXBwb3J0ZWQsIGFkdmVydGlzaW5nOwogCiAJaWYgKHRnM19mbGFnKHRwLCBVU0VfUEhZTElCKSkgewogCQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OwogCQlpZiAoISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19JU19DT05ORUNURUQpKQogCQkJcmV0dXJuIC1FQUdBSU47CiAJCXBoeWRldiA9IG1kaW9idXNfZ2V0X3BoeSh0cC0+bWRpb19idXMsIHRwLT5waHlfYWRkcik7Ci0JCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KHBoeWRldiwgY21kKTsKKwkJcmV0dXJuIHBoeV9ldGh0b29sX2tzZXR0aW5nc19nZXQocGh5ZGV2LCBjbWQpOwogCX0KIAotCWNtZC0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF9BdXRvbmVnKTsKKwlzdXBwb3J0ZWQgPSAoU1VQUE9SVEVEX0F1dG9uZWcpOwogCiAJaWYgKCEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfMTBfMTAwX09OTFkpKQotCQljbWQtPnN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmIHwKLQkJCQkgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpOworCQlzdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8CisJCQkgICAgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpOwogCiAJaWYgKCEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfQU5ZX1NFUkRFUykpIHsKLQkJY21kLT5zdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwKLQkJCQkgIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKLQkJCQkgIFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAotCQkJCSAgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8Ci0JCQkJICBTVVBQT1JURURfVFApOwotCQljbWQtPnBvcnQgPSBQT1JUX1RQOworCQlzdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwKKwkJCSAgICAgIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCSAgICAgIFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAorCQkJICAgICAgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCQkgICAgICBTVVBQT1JURURfVFApOworCQljbWQtPmJhc2UucG9ydCA9IFBPUlRfVFA7CiAJfSBlbHNlIHsKLQkJY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX0ZJQlJFOwotCQljbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOworCQlzdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX0ZJQlJFOworCQljbWQtPmJhc2UucG9ydCA9IFBPUlRfRklCUkU7CiAJfQorCWV0aHRvb2xfY29udmVydF9sZWdhY3lfdTMyX3RvX2xpbmtfbW9kZShjbWQtPmxpbmtfbW9kZXMuc3VwcG9ydGVkLAorCQkJCQkJc3VwcG9ydGVkKTsKIAotCWNtZC0+YWR2ZXJ0aXNpbmcgPSB0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmc7CisJYWR2ZXJ0aXNpbmcgPSB0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmc7CiAJaWYgKHRnM19mbGFnKHRwLCBQQVVTRV9BVVRPTkVHKSkgewogCQlpZiAodHAtPmxpbmtfY29uZmlnLmZsb3djdHJsICYgRkxPV19DVFJMX1JYKSB7CiAJCQlpZiAodHAtPmxpbmtfY29uZmlnLmZsb3djdHJsICYgRkxPV19DVFJMX1RYKSB7Ci0JCQkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX1BhdXNlOworCQkJCWFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfUGF1c2U7CiAJCQl9IGVsc2UgewotCQkJCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9QYXVzZSB8Ci0JCQkJCQkgICAgQURWRVJUSVNFRF9Bc3ltX1BhdXNlOworCQkJCWFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfUGF1c2UgfAorCQkJCQlBRFZFUlRJU0VEX0FzeW1fUGF1c2U7CiAJCQl9CiAJCX0gZWxzZSBpZiAodHAtPmxpbmtfY29uZmlnLmZsb3djdHJsICYgRkxPV19DVFJMX1RYKSB7Ci0JCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXN5bV9QYXVzZTsKKwkJCWFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXN5bV9QYXVzZTsKIAkJfQogCX0KKwlldGh0b29sX2NvbnZlcnRfbGVnYWN5X3UzMl90b19saW5rX21vZGUoY21kLT5saW5rX21vZGVzLmFkdmVydGlzaW5nLAorCQkJCQkJYWR2ZXJ0aXNpbmcpOworCiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSAmJiB0cC0+bGlua191cCkgewotCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkKTsKLQkJY21kLT5kdXBsZXggPSB0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleDsKLQkJY21kLT5scF9hZHZlcnRpc2luZyA9IHRwLT5saW5rX2NvbmZpZy5ybXRfYWR2OworCQljbWQtPmJhc2Uuc3BlZWQgPSB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkOworCQljbWQtPmJhc2UuZHVwbGV4ID0gdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXg7CisJCWV0aHRvb2xfY29udmVydF9sZWdhY3lfdTMyX3RvX2xpbmtfbW9kZSgKKwkJCWNtZC0+bGlua19tb2Rlcy5scF9hZHZlcnRpc2luZywKKwkJCXRwLT5saW5rX2NvbmZpZy5ybXRfYWR2KTsKKwogCQlpZiAoISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19BTllfU0VSREVTKSkgewogCQkJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX01ESVhfU1RBVEUpCi0JCQkJY21kLT5ldGhfdHBfbWRpeCA9IEVUSF9UUF9NRElfWDsKKwkJCQljbWQtPmJhc2UuZXRoX3RwX21kaXggPSBFVEhfVFBfTURJX1g7CiAJCQllbHNlCi0JCQkJY21kLT5ldGhfdHBfbWRpeCA9IEVUSF9UUF9NREk7CisJCQkJY21kLT5iYXNlLmV0aF90cF9tZGl4ID0gRVRIX1RQX01ESTsKIAkJfQogCX0gZWxzZSB7Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsIFNQRUVEX1VOS05PV04pOwotCQljbWQtPmR1cGxleCA9IERVUExFWF9VTktOT1dOOwotCQljbWQtPmV0aF90cF9tZGl4ID0gRVRIX1RQX01ESV9JTlZBTElEOworCQljbWQtPmJhc2Uuc3BlZWQgPSBTUEVFRF9VTktOT1dOOworCQljbWQtPmJhc2UuZHVwbGV4ID0gRFVQTEVYX1VOS05PV047CisJCWNtZC0+YmFzZS5ldGhfdHBfbWRpeCA9IEVUSF9UUF9NRElfSU5WQUxJRDsKIAl9Ci0JY21kLT5waHlfYWRkcmVzcyA9IHRwLT5waHlfYWRkcjsKLQljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKLQljbWQtPmF1dG9uZWcgPSB0cC0+bGlua19jb25maWcuYXV0b25lZzsKLQljbWQtPm1heHR4cGt0ID0gMDsKLQljbWQtPm1heHJ4cGt0ID0gMDsKKwljbWQtPmJhc2UucGh5X2FkZHJlc3MgPSB0cC0+cGh5X2FkZHI7CisJY21kLT5iYXNlLmF1dG9uZWcgPSB0cC0+bGlua19jb25maWcuYXV0b25lZzsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0ZzNfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIGludCB0ZzNfc2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1MzIgc3BlZWQgPSBldGh0b29sX2NtZF9zcGVlZChjbWQpOworCXUzMiBzcGVlZCA9IGNtZC0+YmFzZS5zcGVlZDsKKwl1MzIgYWR2ZXJ0aXNpbmc7CiAKIAlpZiAodGczX2ZsYWcodHAsIFVTRV9QSFlMSUIpKSB7CiAJCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAJCWlmICghKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0lTX0NPTk5FQ1RFRCkpCiAJCQlyZXR1cm4gLUVBR0FJTjsKIAkJcGh5ZGV2ID0gbWRpb2J1c19nZXRfcGh5KHRwLT5tZGlvX2J1cywgdHAtPnBoeV9hZGRyKTsKLQkJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocGh5ZGV2LCBjbWQpOworCQlyZXR1cm4gcGh5X2V0aHRvb2xfa3NldHRpbmdzX3NldChwaHlkZXYsIGNtZCk7CiAJfQogCi0JaWYgKGNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0VOQUJMRSAmJgotCSAgICBjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19ESVNBQkxFKQorCWlmIChjbWQtPmJhc2UuYXV0b25lZyAhPSBBVVRPTkVHX0VOQUJMRSAmJgorCSAgICBjbWQtPmJhc2UuYXV0b25lZyAhPSBBVVRPTkVHX0RJU0FCTEUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUgJiYKLQkgICAgY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwgJiYKLQkgICAgY21kLT5kdXBsZXggIT0gRFVQTEVYX0hBTEYpCisJaWYgKGNtZC0+YmFzZS5hdXRvbmVnID09IEFVVE9ORUdfRElTQUJMRSAmJgorCSAgICBjbWQtPmJhc2UuZHVwbGV4ICE9IERVUExFWF9GVUxMICYmCisJICAgIGNtZC0+YmFzZS5kdXBsZXggIT0gRFVQTEVYX0hBTEYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCWV0aHRvb2xfY29udmVydF9saW5rX21vZGVfdG9fbGVnYWN5X3UzMigmYWR2ZXJ0aXNpbmcsCisJCQkJCQljbWQtPmxpbmtfbW9kZXMuYWR2ZXJ0aXNpbmcpOworCisJaWYgKGNtZC0+YmFzZS5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CiAJCXUzMiBtYXNrID0gQURWRVJUSVNFRF9BdXRvbmVnIHwKIAkJCSAgIEFEVkVSVElTRURfUGF1c2UgfAogCQkJICAgQURWRVJUSVNFRF9Bc3ltX1BhdXNlOwpAQCAtMTIxODUsNyArMTIxOTcsNyBAQAogCQllbHNlCiAJCQltYXNrIHw9IEFEVkVSVElTRURfRklCUkU7CiAKLQkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgJiB+bWFzaykKKwkJaWYgKGFkdmVydGlzaW5nICYgfm1hc2spCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQltYXNrICY9IChBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwKQEAgLTEyMTk1LDEzICsxMjIwNywxMyBAQAogCQkJIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwKIAkJCSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCk7CiAKLQkJY21kLT5hZHZlcnRpc2luZyAmPSBtYXNrOworCQlhZHZlcnRpc2luZyAmPSBtYXNrOwogCX0gZWxzZSB7CiAJCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19BTllfU0VSREVTKSB7CiAJCQlpZiAoc3BlZWQgIT0gU1BFRURfMTAwMCkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJaWYgKGNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKQorCQkJaWYgKGNtZC0+YmFzZS5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0gZWxzZSB7CiAJCQlpZiAoc3BlZWQgIT0gU1BFRURfMTAwICYmCkBAIC0xMjIxMiwxNiArMTIyMjQsMTYgQEAKIAogCXRnM19mdWxsX2xvY2sodHAsIDApOwogCi0JdHAtPmxpbmtfY29uZmlnLmF1dG9uZWcgPSBjbWQtPmF1dG9uZWc7Ci0JaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgewotCQl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgPSAoY21kLT5hZHZlcnRpc2luZyB8CisJdHAtPmxpbmtfY29uZmlnLmF1dG9uZWcgPSBjbWQtPmJhc2UuYXV0b25lZzsKKwlpZiAoY21kLT5iYXNlLmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nID0gKGFkdmVydGlzaW5nIHwKIAkJCQkJICAgICAgQURWRVJUSVNFRF9BdXRvbmVnKTsKIAkJdHAtPmxpbmtfY29uZmlnLnNwZWVkID0gU1BFRURfVU5LTk9XTjsKIAkJdHAtPmxpbmtfY29uZmlnLmR1cGxleCA9IERVUExFWF9VTktOT1dOOwogCX0gZWxzZSB7CiAJCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyA9IDA7CiAJCXRwLT5saW5rX2NvbmZpZy5zcGVlZCA9IHNwZWVkOwotCQl0cC0+bGlua19jb25maWcuZHVwbGV4ID0gY21kLT5kdXBsZXg7CisJCXRwLT5saW5rX2NvbmZpZy5kdXBsZXggPSBjbWQtPmJhc2UuZHVwbGV4OwogCX0KIAogCXRwLT5waHlfZmxhZ3MgfD0gVEczX1BIWUZMR19VU0VSX0NPTkZJR1VSRUQ7CkBAIC0xMjU1MiwxMCArMTI1NjQsNiBAQAogCQkJCWluZm8tPmRhdGEgPSBURzNfUlNTX01BWF9OVU1fUVM7CiAJCX0KIAotCQkvKiBUaGUgZmlyc3QgaW50ZXJydXB0IHZlY3RvciBvbmx5Ci0JCSAqIGhhbmRsZXMgbGluayBpbnRlcnJ1cHRzLgotCQkgKi8KLQkJaW5mby0+ZGF0YSAtPSAxOwogCQlyZXR1cm4gMDsKIAogCWRlZmF1bHQ6CkBAIC0xNDAxNCw3ICsxNDAyMiw5IEBACiAJfQogCiAJaWYgKChlYy0+cnhfY29hbGVzY2VfdXNlY3MgPiBNQVhfUlhDT0xfVElDS1MpIHx8CisJICAgICghZWMtPnJ4X2NvYWxlc2NlX3VzZWNzKSB8fAogCSAgICAoZWMtPnR4X2NvYWxlc2NlX3VzZWNzID4gTUFYX1RYQ09MX1RJQ0tTKSB8fAorCSAgICAoIWVjLT50eF9jb2FsZXNjZV91c2VjcykgfHwKIAkgICAgKGVjLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA+IE1BWF9SWE1BWF9GUkFNRVMpIHx8CiAJICAgIChlYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPiBNQVhfVFhNQVhfRlJBTUVTKSB8fAogCSAgICAoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzX2lycSA+IG1heF9yeGNvYWxfdGlja19pbnQpIHx8CkBAIC0xNDAyNSwxNiArMTQwMzUsNiBAQAogCSAgICAoZWMtPnN0YXRzX2Jsb2NrX2NvYWxlc2NlX3VzZWNzIDwgbWluX3N0YXRfY29hbF90aWNrcykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogTm8gcnggaW50ZXJydXB0cyB3aWxsIGJlIGdlbmVyYXRlZCBpZiBib3RoIGFyZSB6ZXJvICovCi0JaWYgKChlYy0+cnhfY29hbGVzY2VfdXNlY3MgPT0gMCkgJiYKLQkgICAgKGVjLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9PSAwKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBObyB0eCBpbnRlcnJ1cHRzIHdpbGwgYmUgZ2VuZXJhdGVkIGlmIGJvdGggYXJlIHplcm8gKi8KLQlpZiAoKGVjLT50eF9jb2FsZXNjZV91c2VjcyA9PSAwKSAmJgotCSAgICAoZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzID09IDApKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCS8qIE9ubHkgY29weSByZWxldmFudCBwYXJhbWV0ZXJzLCBpZ25vcmUgYWxsIG90aGVycy4gKi8KIAl0cC0+Y29hbC5yeF9jb2FsZXNjZV91c2VjcyA9IGVjLT5yeF9jb2FsZXNjZV91c2VjczsKIAl0cC0+Y29hbC50eF9jb2FsZXNjZV91c2VjcyA9IGVjLT50eF9jb2FsZXNjZV91c2VjczsKQEAgLTE0MTA2LDggKzE0MTA2LDYgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyB0ZzNfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9zZXR0aW5ncwkJPSB0ZzNfZ2V0X3NldHRpbmdzLAotCS5zZXRfc2V0dGluZ3MJCT0gdGczX3NldF9zZXR0aW5ncywKIAkuZ2V0X2RydmluZm8JCT0gdGczX2dldF9kcnZpbmZvLAogCS5nZXRfcmVnc19sZW4JCT0gdGczX2dldF9yZWdzX2xlbiwKIAkuZ2V0X3JlZ3MJCT0gdGczX2dldF9yZWdzLApAQCAtMTQxNDAsNiArMTQxMzgsOCBAQAogCS5nZXRfdHNfaW5mbwkJPSB0ZzNfZ2V0X3RzX2luZm8sCiAJLmdldF9lZWUJCT0gdGczX2dldF9lZWUsCiAJLnNldF9lZWUJCT0gdGczX3NldF9lZWUsCisJLmdldF9saW5rX2tzZXR0aW5ncwk9IHRnM19nZXRfbGlua19rc2V0dGluZ3MsCisJLnNldF9saW5rX2tzZXR0aW5ncwk9IHRnM19zZXRfbGlua19rc2V0dGluZ3MsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICp0ZzNfZ2V0X3N0YXRzNjQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTE4MTM0LDE0ICsxODEzNCwxNCBAQAogCiAJcnRubF9sb2NrKCk7CiAKLQkvKiBXZSBuZWVkbid0IHJlY292ZXIgZnJvbSBwZXJtYW5lbnQgZXJyb3IgKi8KLQlpZiAoc3RhdGUgPT0gcGNpX2NoYW5uZWxfaW9fZnJvemVuKQotCQl0cC0+cGNpZXJyX3JlY292ZXJ5ID0gdHJ1ZTsKLQogCS8qIFdlIHByb2JhYmx5IGRvbid0IGhhdmUgbmV0ZGV2IHlldCAqLwogCWlmICghbmV0ZGV2IHx8ICFuZXRpZl9ydW5uaW5nKG5ldGRldikpCiAJCWdvdG8gZG9uZTsKIAorCS8qIFdlIG5lZWRuJ3QgcmVjb3ZlciBmcm9tIHBlcm1hbmVudCBlcnJvciAqLworCWlmIChzdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19mcm96ZW4pCisJCXRwLT5wY2llcnJfcmVjb3ZlcnkgPSB0cnVlOworCiAJdGczX3BoeV9zdG9wKHRwKTsKIAogCXRnM19uZXRpZl9zdG9wKHRwKTsKQEAgLTE4MjM4LDcgKzE4MjM4LDcgQEAKIAogCXJ0bmxfbG9jaygpOwogCi0JaWYgKCFuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJaWYgKCFuZXRkZXYgfHwgIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKIAkJZ290byBkb25lOwogCiAJdGczX2Z1bGxfbG9jayh0cCwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkLmMKaW5kZXggNzcxY2MyNi4uZjlkZjRiNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkLmMKQEAgLTU0LDkgKzU0LDcgQEAKICAqIEdsb2JhbCB2YXJpYWJsZXMKICAqLwogc3RhdGljIHUzMiBibmFkX3J4cXNfcGVyX2NxID0gMjsKLXN0YXRpYyB1MzIgYm5hX2lkOwotc3RhdGljIHN0cnVjdCBtdXRleCBibmFkX2xpc3RfbXV0ZXg7Ci1zdGF0aWMgTElTVF9IRUFEKGJuYWRfbGlzdCk7CitzdGF0aWMgYXRvbWljX3QgYm5hX2lkOwogc3RhdGljIGNvbnN0IHU4IGJuYWRfYmNhc3RfYWRkcltdIF9fYWxpZ25lZCgyKSA9CiAJeyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07CiAKQEAgLTc2LDIzICs3NCw2IEBACiAJKF9yZXNfaW5mbyktPnJlc191Lm1lbV9pbmZvLmxlbiA9IChfc2l6ZSk7CQlcCiB9IHdoaWxlICgwKQogCi1zdGF0aWMgdm9pZAotYm5hZF9hZGRfdG9fbGlzdChzdHJ1Y3QgYm5hZCAqYm5hZCkKLXsKLQltdXRleF9sb2NrKCZibmFkX2xpc3RfbXV0ZXgpOwotCWxpc3RfYWRkX3RhaWwoJmJuYWQtPmxpc3RfZW50cnksICZibmFkX2xpc3QpOwotCWJuYWQtPmlkID0gYm5hX2lkKys7Ci0JbXV0ZXhfdW5sb2NrKCZibmFkX2xpc3RfbXV0ZXgpOwotfQotCi1zdGF0aWMgdm9pZAotYm5hZF9yZW1vdmVfZnJvbV9saXN0KHN0cnVjdCBibmFkICpibmFkKQotewotCW11dGV4X2xvY2soJmJuYWRfbGlzdF9tdXRleCk7Ci0JbGlzdF9kZWwoJmJuYWQtPmxpc3RfZW50cnkpOwotCW11dGV4X3VubG9jaygmYm5hZF9saXN0X211dGV4KTsKLX0KLQogLyoKICAqIFJlaW5pdGlhbGl6ZSBjb21wbGV0aW9ucyBpbiBDUSwgb25jZSBSeCBpcyB0YWtlbiBkb3duCiAgKi8KQEAgLTM1NzMsMTQgKzM1NTQsMTIgQEAKIHsKIAlzcGluX2xvY2tfaW5pdCgmYm5hZC0+Ym5hX2xvY2spOwogCW11dGV4X2luaXQoJmJuYWQtPmNvbmZfbXV0ZXgpOwotCW11dGV4X2luaXQoJmJuYWRfbGlzdF9tdXRleCk7CiB9CiAKIHN0YXRpYyB2b2lkCiBibmFkX2xvY2tfdW5pbml0KHN0cnVjdCBibmFkICpibmFkKQogewogCW11dGV4X2Rlc3Ryb3koJmJuYWQtPmNvbmZfbXV0ZXgpOwotCW11dGV4X2Rlc3Ryb3koJmJuYWRfbGlzdF9tdXRleCk7CiB9CiAKIC8qIFBDSSBJbml0aWFsaXphdGlvbiAqLwpAQCAtMzY1Myw3ICszNjMyLDcgQEAKIAl9CiAJYm5hZCA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJYm5hZF9sb2NrX2luaXQoYm5hZCk7Ci0JYm5hZF9hZGRfdG9fbGlzdChibmFkKTsKKwlibmFkLT5pZCA9IGF0b21pY19pbmNfcmV0dXJuKCZibmFfaWQpIC0gMTsKIAogCW11dGV4X2xvY2soJmJuYWQtPmNvbmZfbXV0ZXgpOwogCS8qCkBAIC0zODA3LDcgKzM3ODYsNiBAQAogCWJuYWRfcGNpX3VuaW5pdChwZGV2KTsKIHVubG9ja19tdXRleDoKIAltdXRleF91bmxvY2soJmJuYWQtPmNvbmZfbXV0ZXgpOwotCWJuYWRfcmVtb3ZlX2Zyb21fbGlzdChibmFkKTsKIAlibmFkX2xvY2tfdW5pbml0KGJuYWQpOwogCWZyZWVfbmV0ZGV2KG5ldGRldik7CiAJcmV0dXJuIGVycjsKQEAgLTM4NDUsNyArMzgyMyw2IEBACiAJYm5hZF9kaXNhYmxlX21zaXgoYm5hZCk7CiAJYm5hZF9wY2lfdW5pbml0KHBkZXYpOwogCW11dGV4X3VubG9jaygmYm5hZC0+Y29uZl9tdXRleCk7Ci0JYm5hZF9yZW1vdmVfZnJvbV9saXN0KGJuYWQpOwogCWJuYWRfbG9ja191bmluaXQoYm5hZCk7CiAJLyogUmVtb3ZlIHRoZSBkZWJ1Z2ZzIG5vZGUgZm9yIHRoaXMgYm5hZCAqLwogCWtmcmVlKGJuYWQtPnJlZ2RhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZC5oCmluZGV4IGY0ZWQ4MTYuLjQ2ZjdiODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkLmgKQEAgLTI4OCw3ICsyODgsNiBAQAogc3RydWN0IGJuYWQgewogCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRkZXY7CiAJdTMyCQkJaWQ7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0X2VudHJ5OwogCiAJLyogRGF0YSBwYXRoICovCiAJc3RydWN0IGJuYWRfdHhfaW5mbyB0eF9pbmZvW0JOQURfTUFYX1RYXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWRfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZF9ldGh0b29sLmMKaW5kZXggMGU0ZmRjMy4uMzFmNjFhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZF9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZF9ldGh0b29sLmMKQEAgLTMxLDE1ICszMSwxMCBAQAogI2RlZmluZSBCTkFEX05VTV9UWEZfQ09VTlRFUlMgMTIKICNkZWZpbmUgQk5BRF9OVU1fUlhGX0NPVU5URVJTIDEwCiAjZGVmaW5lIEJOQURfTlVNX0NRX0NPVU5URVJTICgzICsgNSkKLSNkZWZpbmUgQk5BRF9OVU1fUlhRX0NPVU5URVJTIDYKKyNkZWZpbmUgQk5BRF9OVU1fUlhRX0NPVU5URVJTIDcKICNkZWZpbmUgQk5BRF9OVU1fVFhRX0NPVU5URVJTIDUKIAotI2RlZmluZSBCTkFEX0VUSFRPT0xfU1RBVFNfTlVNCQkJCQkJXAotCShzaXplb2Yoc3RydWN0IHJ0bmxfbGlua19zdGF0czY0KSAvIHNpemVvZih1NjQpICsJXAotCXNpemVvZihzdHJ1Y3QgYm5hZF9kcnZfc3RhdHMpIC8gc2l6ZW9mKHU2NCkgKwkJXAotCW9mZnNldG9mKHN0cnVjdCBiZmlfZW5ldF9zdGF0cywgcnhmX3N0YXRzWzBdKSAvIHNpemVvZih1NjQpKQotCi1zdGF0aWMgY29uc3QgY2hhciAqYm5hZF9uZXRfc3RhdHNfc3RyaW5nc1tCTkFEX0VUSFRPT0xfU1RBVFNfTlVNXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICpibmFkX25ldF9zdGF0c19zdHJpbmdzW10gPSB7CiAJInJ4X3BhY2tldHMiLAogCSJ0eF9wYWNrZXRzIiwKIAkicnhfYnl0ZXMiLApAQCAtNTAsMjIgKzQ1LDEwIEBACiAJInR4X2Ryb3BwZWQiLAogCSJtdWx0aWNhc3QiLAogCSJjb2xsaXNpb25zIiwKLQogCSJyeF9sZW5ndGhfZXJyb3JzIiwKLQkicnhfb3Zlcl9lcnJvcnMiLAogCSJyeF9jcmNfZXJyb3JzIiwKIAkicnhfZnJhbWVfZXJyb3JzIiwKLQkicnhfZmlmb19lcnJvcnMiLAotCSJyeF9taXNzZWRfZXJyb3JzIiwKLQotCSJ0eF9hYm9ydGVkX2Vycm9ycyIsCi0JInR4X2NhcnJpZXJfZXJyb3JzIiwKIAkidHhfZmlmb19lcnJvcnMiLAotCSJ0eF9oZWFydGJlYXRfZXJyb3JzIiwKLQkidHhfd2luZG93X2Vycm9ycyIsCi0KLQkicnhfY29tcHJlc3NlZCIsCi0JInR4X2NvbXByZXNzZWQiLAogCiAJIm5ldGlmX3F1ZXVlX3N0b3AiLAogCSJuZXRpZl9xdWV1ZV93YWtldXAiLApAQCAtMjU0LDYgKzIzNyw4IEBACiAJImZjX3R4X2ZpZF9wYXJpdHlfZXJyb3JzIiwKIH07CiAKKyNkZWZpbmUgQk5BRF9FVEhUT09MX1NUQVRTX05VTQlBUlJBWV9TSVpFKGJuYWRfbmV0X3N0YXRzX3N0cmluZ3MpCisKIHN0YXRpYyBpbnQKIGJuYWRfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQogewpAQCAtNjU4LDYgKzY0Myw4IEBACiAJCQkJc3RyaW5nICs9IEVUSF9HU1RSSU5HX0xFTjsKIAkJCQlzcHJpbnRmKHN0cmluZywgInJ4cSVkX2FsbG9jYnVmX2ZhaWxlZCIsIHFfbnVtKTsKIAkJCQlzdHJpbmcgKz0gRVRIX0dTVFJJTkdfTEVOOworCQkJCXNwcmludGYoc3RyaW5nLCAicnhxJWRfbWFwYnVmX2ZhaWxlZCIsIHFfbnVtKTsKKwkJCQlzdHJpbmcgKz0gRVRIX0dTVFJJTkdfTEVOOwogCQkJCXNwcmludGYoc3RyaW5nLCAicnhxJWRfcHJvZHVjZXJfaW5kZXgiLCBxX251bSk7CiAJCQkJc3RyaW5nICs9IEVUSF9HU1RSSU5HX0xFTjsKIAkJCQlzcHJpbnRmKHN0cmluZywgInJ4cSVkX2NvbnN1bWVyX2luZGV4IiwgcV9udW0pOwpAQCAtNjc4LDYgKzY2NSw5IEBACiAJCQkJCXNwcmludGYoc3RyaW5nLCAicnhxJWRfYWxsb2NidWZfZmFpbGVkIiwKIAkJCQkJCQkJcV9udW0pOwogCQkJCQlzdHJpbmcgKz0gRVRIX0dTVFJJTkdfTEVOOworCQkJCQlzcHJpbnRmKHN0cmluZywgInJ4cSVkX21hcGJ1Zl9mYWlsZWQiLAorCQkJCQkJcV9udW0pOworCQkJCQlzdHJpbmcgKz0gRVRIX0dTVFJJTkdfTEVOOwogCQkJCQlzcHJpbnRmKHN0cmluZywgInJ4cSVkX3Byb2R1Y2VyX2luZGV4IiwKIAkJCQkJCQkJcV9udW0pOwogCQkJCQlzdHJpbmcgKz0gRVRIX0dTVFJJTkdfTEVOOwpAQCAtODU0LDkgKzg0NCw5IEBACiAJCSAgICAgICB1NjQgKmJ1ZikKIHsKIAlzdHJ1Y3QgYm5hZCAqYm5hZCA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IGksIGosIGJpOworCWludCBpLCBqLCBiaSA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKm5ldF9zdGF0czY0OworCXN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCBuZXRfc3RhdHM2NDsKIAl1NjQgKnN0YXRzNjQ7CiAJdTMyIGJtYXA7CiAKQEAgLTg3MSwxNCArODYxLDI1IEBACiAJICogdW5kZXIgdGhlIHNhbWUgbG9jawogCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZibmFkLT5ibmFfbG9jaywgZmxhZ3MpOwotCWJpID0gMDsKLQltZW1zZXQoYnVmLCAwLCBzdGF0cy0+bl9zdGF0cyAqIHNpemVvZih1NjQpKTsKIAotCW5ldF9zdGF0czY0ID0gKHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqKWJ1ZjsKLQlibmFkX25ldGRldl9xc3RhdHNfZmlsbChibmFkLCBuZXRfc3RhdHM2NCk7Ci0JYm5hZF9uZXRkZXZfaHdzdGF0c19maWxsKGJuYWQsIG5ldF9zdGF0czY0KTsKKwltZW1zZXQoJm5ldF9zdGF0czY0LCAwLCBzaXplb2YobmV0X3N0YXRzNjQpKTsKKwlibmFkX25ldGRldl9xc3RhdHNfZmlsbChibmFkLCAmbmV0X3N0YXRzNjQpOworCWJuYWRfbmV0ZGV2X2h3c3RhdHNfZmlsbChibmFkLCAmbmV0X3N0YXRzNjQpOwogCi0JYmkgPSBzaXplb2YoKm5ldF9zdGF0czY0KSAvIHNpemVvZih1NjQpOworCWJ1ZltiaSsrXSA9IG5ldF9zdGF0czY0LnJ4X3BhY2tldHM7CisJYnVmW2JpKytdID0gbmV0X3N0YXRzNjQudHhfcGFja2V0czsKKwlidWZbYmkrK10gPSBuZXRfc3RhdHM2NC5yeF9ieXRlczsKKwlidWZbYmkrK10gPSBuZXRfc3RhdHM2NC50eF9ieXRlczsKKwlidWZbYmkrK10gPSBuZXRfc3RhdHM2NC5yeF9lcnJvcnM7CisJYnVmW2JpKytdID0gbmV0X3N0YXRzNjQudHhfZXJyb3JzOworCWJ1ZltiaSsrXSA9IG5ldF9zdGF0czY0LnJ4X2Ryb3BwZWQ7CisJYnVmW2JpKytdID0gbmV0X3N0YXRzNjQudHhfZHJvcHBlZDsKKwlidWZbYmkrK10gPSBuZXRfc3RhdHM2NC5tdWx0aWNhc3Q7CisJYnVmW2JpKytdID0gbmV0X3N0YXRzNjQuY29sbGlzaW9uczsKKwlidWZbYmkrK10gPSBuZXRfc3RhdHM2NC5yeF9sZW5ndGhfZXJyb3JzOworCWJ1ZltiaSsrXSA9IG5ldF9zdGF0czY0LnJ4X2NyY19lcnJvcnM7CisJYnVmW2JpKytdID0gbmV0X3N0YXRzNjQucnhfZnJhbWVfZXJyb3JzOworCWJ1ZltiaSsrXSA9IG5ldF9zdGF0czY0LnR4X2ZpZm9fZXJyb3JzOwogCiAJLyogR2V0IG5ldGlmX3F1ZXVlX3N0b3BwZWQgZnJvbSBzdGFjayAqLwogCWJuYWQtPnN0YXRzLmRydl9zdGF0cy5uZXRpZl9xdWV1ZV9zdG9wcGVkID0gbmV0aWZfcXVldWVfc3RvcHBlZChuZXRkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9tYWNiLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWRlbmNlL21hY2IuYwppbmRleCA4OWMwY2ZhLi42MzE0NGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWRlbmNlL21hY2IuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWRlbmNlL21hY2IuYwpAQCAtNTQxLDYgKzU0MSwxNCBAQAogCX0KIH0KIAorc3RhdGljIGlubGluZSB2b2lkIG1hY2Jfc2V0X2FkZHIoc3RydWN0IG1hY2JfZG1hX2Rlc2MgKmRlc2MsIGRtYV9hZGRyX3QgYWRkcikKK3sKKwlkZXNjLT5hZGRyID0gKHUzMilhZGRyOworI2lmZGVmIENPTkZJR19BUkNIX0RNQV9BRERSX1RfNjRCSVQKKwlkZXNjLT5hZGRyaCA9ICh1MzIpKGFkZHIgPj4gMzIpOworI2VuZGlmCit9CisKIHN0YXRpYyB2b2lkIG1hY2JfdHhfZXJyb3JfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IG1hY2JfcXVldWUJKnF1ZXVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtYWNiX3F1ZXVlLApAQCAtNjIxLDE0ICs2MjksMTcgQEAKIAogCS8qIFNldCBlbmQgb2YgVFggcXVldWUgKi8KIAlkZXNjID0gbWFjYl90eF9kZXNjKHF1ZXVlLCAwKTsKLQlkZXNjLT5hZGRyID0gMDsKKwltYWNiX3NldF9hZGRyKGRlc2MsIDApOwogCWRlc2MtPmN0cmwgPSBNQUNCX0JJVChUWF9VU0VEKTsKIAogCS8qIE1ha2UgZGVzY3JpcHRvciB1cGRhdGVzIHZpc2libGUgdG8gaGFyZHdhcmUgKi8KIAl3bWIoKTsKIAogCS8qIFJlaW5pdGlhbGl6ZSB0aGUgVFggZGVzYyBxdWV1ZSAqLwotCXF1ZXVlX3dyaXRlbChxdWV1ZSwgVEJRUCwgcXVldWUtPnR4X3JpbmdfZG1hKTsKKwlxdWV1ZV93cml0ZWwocXVldWUsIFRCUVAsICh1MzIpKHF1ZXVlLT50eF9yaW5nX2RtYSkpOworI2lmZGVmIENPTkZJR19BUkNIX0RNQV9BRERSX1RfNjRCSVQKKwlxdWV1ZV93cml0ZWwocXVldWUsIFRCUVBILCAodTMyKShxdWV1ZS0+dHhfcmluZ19kbWEgPj4gMzIpKTsKKyNlbmRpZgogCS8qIE1ha2UgVFggcmluZyByZWZsZWN0IHN0YXRlIG9mIGhhcmR3YXJlICovCiAJcXVldWUtPnR4X2hlYWQgPSAwOwogCXF1ZXVlLT50eF90YWlsID0gMDsKQEAgLTc1MCw3ICs3NjEsNyBAQAogCiAJCQlpZiAoZW50cnkgPT0gUlhfUklOR19TSVpFIC0gMSkKIAkJCQlwYWRkciB8PSBNQUNCX0JJVChSWF9XUkFQKTsKLQkJCWJwLT5yeF9yaW5nW2VudHJ5XS5hZGRyID0gcGFkZHI7CisJCQltYWNiX3NldF9hZGRyKCYoYnAtPnJ4X3JpbmdbZW50cnldKSwgcGFkZHIpOwogCQkJYnAtPnJ4X3JpbmdbZW50cnldLmN0cmwgPSAwOwogCiAJCQkvKiBwcm9wZXJseSBhbGlnbiBFdGhlcm5ldCBoZWFkZXIgKi8KQEAgLTc5OCw3ICs4MDksOSBAQAogCWludAkJCWNvdW50ID0gMDsKIAogCXdoaWxlIChjb3VudCA8IGJ1ZGdldCkgewotCQl1MzIgYWRkciwgY3RybDsKKwkJdTMyIGN0cmw7CisJCWRtYV9hZGRyX3QgYWRkcjsKKwkJYm9vbCByeHVzZWQ7CiAKIAkJZW50cnkgPSBtYWNiX3J4X3Jpbmdfd3JhcChicC0+cnhfdGFpbCk7CiAJCWRlc2MgPSAmYnAtPnJ4X3JpbmdbZW50cnldOwpAQCAtODA2LDEwICs4MTksMTQgQEAKIAkJLyogTWFrZSBodyBkZXNjcmlwdG9yIHVwZGF0ZXMgdmlzaWJsZSB0byBDUFUgKi8KIAkJcm1iKCk7CiAKLQkJYWRkciA9IGRlc2MtPmFkZHI7CisJCXJ4dXNlZCA9IChkZXNjLT5hZGRyICYgTUFDQl9CSVQoUlhfVVNFRCkpID8gdHJ1ZSA6IGZhbHNlOworCQlhZGRyID0gTUFDQl9CRihSWF9XQUREUiwgTUFDQl9CRkVYVChSWF9XQUREUiwgZGVzYy0+YWRkcikpOworI2lmZGVmIENPTkZJR19BUkNIX0RNQV9BRERSX1RfNjRCSVQKKwkJYWRkciB8PSAoKHU2NCkoZGVzYy0+YWRkcmgpIDw8IDMyKTsKKyNlbmRpZgogCQljdHJsID0gZGVzYy0+Y3RybDsKIAotCQlpZiAoIShhZGRyICYgTUFDQl9CSVQoUlhfVVNFRCkpKQorCQlpZiAoIXJ4dXNlZCkKIAkJCWJyZWFrOwogCiAJCWJwLT5yeF90YWlsKys7CkBAIC04MzUsNyArODUyLDYgQEAKIAkJbmV0ZGV2X3ZkYmcoYnAtPmRldiwgImdlbV9yeCAldSAobGVuICV1KVxuIiwgZW50cnksIGxlbik7CiAKIAkJc2tiX3B1dChza2IsIGxlbik7Ci0JCWFkZHIgPSBNQUNCX0JGKFJYX1dBRERSLCBNQUNCX0JGRVhUKFJYX1dBRERSLCBhZGRyKSk7CiAJCWRtYV91bm1hcF9zaW5nbGUoJmJwLT5wZGV2LT5kZXYsIGFkZHIsCiAJCQkJIGJwLT5yeF9idWZmZXJfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKIApAQCAtMTI5OSw3ICsxMzE1LDcgQEAKIAkJCWN0cmwgfD0gTUFDQl9CSVQoVFhfV1JBUCk7CiAKIAkJLyogU2V0IFRYIGJ1ZmZlciBkZXNjcmlwdG9yICovCi0JCWRlc2MtPmFkZHIgPSB0eF9za2ItPm1hcHBpbmc7CisJCW1hY2Jfc2V0X2FkZHIoZGVzYywgdHhfc2tiLT5tYXBwaW5nKTsKIAkJLyogZGVzYy0+YWRkciBtdXN0IGJlIHZpc2libGUgdG8gaGFyZHdhcmUgYmVmb3JlIGNsZWFyaW5nCiAJCSAqICdUWF9VU0VEJyBiaXQgaW4gZGVzYy0+Y3RybC4KIAkJICovCkBAIC0xMzIzLDYgKzEzMzksMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgbWFjYl9jbGVhcl9jc3VtKHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyogbm8gY2hhbmdlIGZvciBwYWNrZXRzIHdpdGhvdXQgY2hlY2tzdW0gb2ZmbG9hZGluZyAqLworCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKQorCQlyZXR1cm4gMDsKKworCS8qIG1ha2Ugc3VyZSB3ZSBjYW4gbW9kaWZ5IHRoZSBoZWFkZXIgKi8KKwlpZiAodW5saWtlbHkoc2tiX2Nvd19oZWFkKHNrYiwgMCkpKQorCQlyZXR1cm4gLTE7CisKKwkvKiBpbml0aWFsaXplIGNoZWNrc3VtIGZpZWxkCisJICogVGhpcyBpcyByZXF1aXJlZCAtIGF0IGxlYXN0IGZvciBaeW5xLCB3aGljaCBvdGhlcndpc2UgY2FsY3VsYXRlcworCSAqIHdyb25nIFVEUCBoZWFkZXIgY2hlY2tzdW1zIGZvciBVRFAgcGFja2V0cyB3aXRoIFVEUCBkYXRhIGxlbiA8PTIKKwkgKi8KKwkqKF9fc3VtMTYgKikoc2tiX2NoZWNrc3VtX3N0YXJ0KHNrYikgKyBza2ItPmNzdW1fb2Zmc2V0KSA9IDA7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbWFjYl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJdTE2IHF1ZXVlX2luZGV4ID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7CkBAIC0xMzYyLDYgKzEzOTYsMTEgQEAKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KIAorCWlmIChtYWNiX2NsZWFyX2NzdW0oc2tiKSkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlnb3RvIHVubG9jazsKKwl9CisKIAkvKiBNYXAgc29ja2V0IGJ1ZmZlciBmb3IgRE1BIHRyYW5zZmVyICovCiAJaWYgKCFtYWNiX3R4X21hcChicCwgcXVldWUsIHNrYikpIHsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKQEAgLTE0MjIsNiArMTQ2MSw5IEBACiAKIAkJZGVzYyA9ICZicC0+cnhfcmluZ1tpXTsKIAkJYWRkciA9IE1BQ0JfQkYoUlhfV0FERFIsIE1BQ0JfQkZFWFQoUlhfV0FERFIsIGRlc2MtPmFkZHIpKTsKKyNpZmRlZiBDT05GSUdfQVJDSF9ETUFfQUREUl9UXzY0QklUCisJCWFkZHIgfD0gKCh1NjQpKGRlc2MtPmFkZHJoKSA8PCAzMik7CisjZW5kaWYKIAkJZG1hX3VubWFwX3NpbmdsZSgmYnAtPnBkZXYtPmRldiwgYWRkciwgYnAtPnJ4X2J1ZmZlcl9zaXplLAogCQkJCSBETUFfRlJPTV9ERVZJQ0UpOwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwpAQCAtMTU0Nyw3ICsxNTg5LDcgQEAKIAogCWZvciAocSA9IDAsIHF1ZXVlID0gYnAtPnF1ZXVlczsgcSA8IGJwLT5udW1fcXVldWVzOyArK3EsICsrcXVldWUpIHsKIAkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7Ci0JCQlxdWV1ZS0+dHhfcmluZ1tpXS5hZGRyID0gMDsKKwkJCW1hY2Jfc2V0X2FkZHIoJihxdWV1ZS0+dHhfcmluZ1tpXSksIDApOwogCQkJcXVldWUtPnR4X3JpbmdbaV0uY3RybCA9IE1BQ0JfQklUKFRYX1VTRUQpOwogCQl9CiAJCXF1ZXVlLT50eF9yaW5nW1RYX1JJTkdfU0laRSAtIDFdLmN0cmwgfD0gTUFDQl9CSVQoVFhfV1JBUCk7CkBAIC0xNjk0LDYgKzE3MzYsMTAgQEAKIAkJCWRtYWNmZyB8PSBHRU1fQklUKFRYQ09FTik7CiAJCWVsc2UKIAkJCWRtYWNmZyAmPSB+R0VNX0JJVChUWENPRU4pOworCisjaWZkZWYgQ09ORklHX0FSQ0hfRE1BX0FERFJfVF82NEJJVAorCQlkbWFjZmcgfD0gR0VNX0JJVChBRERSNjQpOworI2VuZGlmCiAJCW5ldGRldl9kYmcoYnAtPmRldiwgIkNhZGVuY2UgY29uZmlndXJlIERNQSB3aXRoIDB4JTA4eFxuIiwKIAkJCSAgIGRtYWNmZyk7CiAJCWdlbV93cml0ZWwoYnAsIERNQUNGRywgZG1hY2ZnKTsKQEAgLTE3MzksOSArMTc4NSwxNSBAQAogCW1hY2JfY29uZmlndXJlX2RtYShicCk7CiAKIAkvKiBJbml0aWFsaXplIFRYIGFuZCBSWCBidWZmZXJzICovCi0JbWFjYl93cml0ZWwoYnAsIFJCUVAsIGJwLT5yeF9yaW5nX2RtYSk7CisJbWFjYl93cml0ZWwoYnAsIFJCUVAsICh1MzIpKGJwLT5yeF9yaW5nX2RtYSkpOworI2lmZGVmIENPTkZJR19BUkNIX0RNQV9BRERSX1RfNjRCSVQKKwltYWNiX3dyaXRlbChicCwgUkJRUEgsICh1MzIpKGJwLT5yeF9yaW5nX2RtYSA+PiAzMikpOworI2VuZGlmCiAJZm9yIChxID0gMCwgcXVldWUgPSBicC0+cXVldWVzOyBxIDwgYnAtPm51bV9xdWV1ZXM7ICsrcSwgKytxdWV1ZSkgewotCQlxdWV1ZV93cml0ZWwocXVldWUsIFRCUVAsIHF1ZXVlLT50eF9yaW5nX2RtYSk7CisJCXF1ZXVlX3dyaXRlbChxdWV1ZSwgVEJRUCwgKHUzMikocXVldWUtPnR4X3JpbmdfZG1hKSk7CisjaWZkZWYgQ09ORklHX0FSQ0hfRE1BX0FERFJfVF82NEJJVAorCQlxdWV1ZV93cml0ZWwocXVldWUsIFRCUVBILCAodTMyKShxdWV1ZS0+dHhfcmluZ19kbWEgPj4gMzIpKTsKKyNlbmRpZgogCiAJCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCiAJCXF1ZXVlX3dyaXRlbChxdWV1ZSwgSUVSLApAQCAtMjMwMyw3ICsyMzU1LDggQEAKIH0KIAogc3RhdGljIGludCBtYWNiX2Nsa19pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBjbGsgKipwY2xrLAotCQkJIHN0cnVjdCBjbGsgKipoY2xrLCBzdHJ1Y3QgY2xrICoqdHhfY2xrKQorCQkJIHN0cnVjdCBjbGsgKipoY2xrLCBzdHJ1Y3QgY2xrICoqdHhfY2xrLAorCQkJIHN0cnVjdCBjbGsgKipyeF9jbGspCiB7CiAJaW50IGVycjsKIApAQCAtMjMyNSw2ICsyMzc4LDEwIEBACiAJaWYgKElTX0VSUigqdHhfY2xrKSkKIAkJKnR4X2NsayA9IE5VTEw7CiAKKwkqcnhfY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJyeF9jbGsiKTsKKwlpZiAoSVNfRVJSKCpyeF9jbGspKQorCQkqcnhfY2xrID0gTlVMTDsKKwogCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZSgqcGNsayk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIHBjbGsgKCV1KVxuIiwgZXJyKTsKQEAgLTIzNDMsOCArMjQwMCwxNyBAQAogCQlnb3RvIGVycl9kaXNhYmxlX2hjbGs7CiAJfQogCisJZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxlKCpyeF9jbGspOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSByeF9jbGsgKCV1KVxuIiwgZXJyKTsKKwkJZ290byBlcnJfZGlzYWJsZV90eGNsazsKKwl9CisKIAlyZXR1cm4gMDsKIAorZXJyX2Rpc2FibGVfdHhjbGs6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKCp0eF9jbGspOworCiBlcnJfZGlzYWJsZV9oY2xrOgogCWNsa19kaXNhYmxlX3VucHJlcGFyZSgqaGNsayk7CiAKQEAgLTIzNzksNiArMjQ0NSw5IEBACiAJCQlxdWV1ZS0+SURSICA9IEdFTV9JRFIoaHdfcSAtIDEpOwogCQkJcXVldWUtPklNUiAgPSBHRU1fSU1SKGh3X3EgLSAxKTsKIAkJCXF1ZXVlLT5UQlFQID0gR0VNX1RCUVAoaHdfcSAtIDEpOworI2lmZGVmIENPTkZJR19BUkNIX0RNQV9BRERSX1RfNjRCSVQKKwkJCXF1ZXVlLT5UQlFQSCA9IEdFTV9UQlFQSChod19xIC0xKTsKKyNlbmRpZgogCQl9IGVsc2UgewogCQkJLyogcXVldWUwIHVzZXMgbGVnYWN5IHJlZ2lzdGVycyAqLwogCQkJcXVldWUtPklTUiAgPSBNQUNCX0lTUjsKQEAgLTIzODYsNiArMjQ1NSw5IEBACiAJCQlxdWV1ZS0+SURSICA9IE1BQ0JfSURSOwogCQkJcXVldWUtPklNUiAgPSBNQUNCX0lNUjsKIAkJCXF1ZXVlLT5UQlFQID0gTUFDQl9UQlFQOworI2lmZGVmIENPTkZJR19BUkNIX0RNQV9BRERSX1RfNjRCSVQKKwkJCXF1ZXVlLT5UQlFQSCA9IE1BQ0JfVEJRUEg7CisjZW5kaWYKIAkJfQogCiAJCS8qIGdldCBpcnE6IGhlcmUgd2UgdXNlIHRoZSBsaW51eCBxdWV1ZSBpbmRleCwgbm90IHRoZSBoYXJkd2FyZQpAQCAtMjcyOCwxMiArMjgwMCwxNCBAQAogfTsKIAogc3RhdGljIGludCBhdDkxZXRoZXJfY2xrX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGNsayAqKnBjbGssCi0JCQkgICAgICBzdHJ1Y3QgY2xrICoqaGNsaywgc3RydWN0IGNsayAqKnR4X2NsaykKKwkJCSAgICAgIHN0cnVjdCBjbGsgKipoY2xrLCBzdHJ1Y3QgY2xrICoqdHhfY2xrLAorCQkJICAgICAgc3RydWN0IGNsayAqKnJ4X2NsaykKIHsKIAlpbnQgZXJyOwogCiAJKmhjbGsgPSBOVUxMOwogCSp0eF9jbGsgPSBOVUxMOworCSpyeF9jbGsgPSBOVUxMOwogCiAJKnBjbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImV0aGVyX2NsayIpOwogCWlmIChJU19FUlIoKnBjbGspKQpAQCAtMjg1NywxMyArMjkzMSwxMyBAQAogc3RhdGljIGludCBtYWNiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50ICgqY2xrX2luaXQpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiwgc3RydWN0IGNsayAqKiwKLQkJCXN0cnVjdCBjbGsgKiosIHN0cnVjdCBjbGsgKiopCisJCQlzdHJ1Y3QgY2xrICoqLCBzdHJ1Y3QgY2xrICoqLCAgc3RydWN0IGNsayAqKikKIAkJCQkJICAgICAgPSBtYWNiX2Nsa19pbml0OwogCWludCAoKmluaXQpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKikgPSBtYWNiX2luaXQ7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGh5X25vZGU7CiAJY29uc3Qgc3RydWN0IG1hY2JfY29uZmlnICptYWNiX2NvbmZpZyA9IE5VTEw7Ci0Jc3RydWN0IGNsayAqcGNsaywgKmhjbGsgPSBOVUxMLCAqdHhfY2xrID0gTlVMTDsKKwlzdHJ1Y3QgY2xrICpwY2xrLCAqaGNsayA9IE5VTEwsICp0eF9jbGsgPSBOVUxMLCAqcnhfY2xrID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgcXVldWVfbWFzaywgbnVtX3F1ZXVlczsKIAlzdHJ1Y3QgbWFjYl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlib29sIG5hdGl2ZV9pbzsKQEAgLTI4OTEsNyArMjk2NSw3IEBACiAJCX0KIAl9CiAKLQllcnIgPSBjbGtfaW5pdChwZGV2LCAmcGNsaywgJmhjbGssICZ0eF9jbGspOworCWVyciA9IGNsa19pbml0KHBkZXYsICZwY2xrLCAmaGNsaywgJnR4X2NsaywgJnJ4X2Nsayk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMjkyNyw2ICszMDAxLDcgQEAKIAlicC0+cGNsayA9IHBjbGs7CiAJYnAtPmhjbGsgPSBoY2xrOwogCWJwLT50eF9jbGsgPSB0eF9jbGs7CisJYnAtPnJ4X2NsayA9IHJ4X2NsazsKIAlpZiAobWFjYl9jb25maWcpCiAJCWJwLT5qdW1ib19tYXhfbGVuID0gbWFjYl9jb25maWctPmp1bWJvX21heF9sZW47CiAKQEAgLTI5MzUsNiArMzAxMCwxMSBAQAogCQlicC0+d29sIHw9IE1BQ0JfV09MX0hBU19NQUdJQ19QQUNLRVQ7CiAJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIGJwLT53b2wgJiBNQUNCX1dPTF9IQVNfTUFHSUNfUEFDS0VUKTsKIAorI2lmZGVmIENPTkZJR19BUkNIX0RNQV9BRERSX1RfNjRCSVQKKwlpZiAoR0VNX0JGRVhUKERCV0RFRiwgZ2VtX3JlYWRsKGJwLCBEQ0ZHMSkpID4gR0VNX0RCVzMyKQorCQlkbWFfc2V0X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDQ0KSk7CisjZW5kaWYKKwogCXNwaW5fbG9ja19pbml0KCZicC0+bG9jayk7CiAKIAkvKiBzZXR1cCBjYXBhYmlsaXRpZXMgKi8KQEAgLTI5NDUsNyArMzAyNSw3IEBACiAJZGV2LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCWlmIChkZXYtPmlycSA8IDApIHsKIAkJZXJyID0gZGV2LT5pcnE7Ci0JCWdvdG8gZXJyX2Rpc2FibGVfY2xvY2tzOworCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CiAJfQogCiAJbWFjID0gb2ZfZ2V0X21hY19hZGRyZXNzKG5wKTsKQEAgLTMwMjAsNiArMzEwMCw3IEBACiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHR4X2Nsayk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhjbGspOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShwY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocnhfY2xrKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0zMDQ2LDYgKzMxMjcsNyBAQAogCQljbGtfZGlzYWJsZV91bnByZXBhcmUoYnAtPnR4X2Nsayk7CiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShicC0+aGNsayk7CiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShicC0+cGNsayk7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShicC0+cnhfY2xrKTsKIAkJZnJlZV9uZXRkZXYoZGV2KTsKIAl9CiAKQEAgLTMwNjksNiArMzE1MSw3IEBACiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShicC0+dHhfY2xrKTsKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGJwLT5oY2xrKTsKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGJwLT5wY2xrKTsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGJwLT5yeF9jbGspOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzA4OCw2ICszMTcxLDcgQEAKIAkJY2xrX3ByZXBhcmVfZW5hYmxlKGJwLT5wY2xrKTsKIAkJY2xrX3ByZXBhcmVfZW5hYmxlKGJwLT5oY2xrKTsKIAkJY2xrX3ByZXBhcmVfZW5hYmxlKGJwLT50eF9jbGspOworCQljbGtfcHJlcGFyZV9lbmFibGUoYnAtPnJ4X2Nsayk7CiAJfQogCiAJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9tYWNiLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWRlbmNlL21hY2IuaAppbmRleCAzNjg5M2Q4Li44YmVkNGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWRlbmNlL21hY2IuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWRlbmNlL21hY2IuaApAQCAtNjYsNiArNjYsOCBAQAogI2RlZmluZSBNQUNCX1VTUklPCQkweDAwYzAKICNkZWZpbmUgTUFDQl9XT0wJCTB4MDBjNAogI2RlZmluZSBNQUNCX01JRAkJMHgwMGZjCisjZGVmaW5lIE1BQ0JfVEJRUEgJCTB4MDRDOAorI2RlZmluZSBNQUNCX1JCUVBICQkweDA0RDQKIAogLyogR0VNIHJlZ2lzdGVyIG9mZnNldHMuICovCiAjZGVmaW5lIEdFTV9OQ0ZHUgkJMHgwMDA0IC8qIE5ldHdvcmsgQ29uZmlnICovCkBAIC0xMzksNiArMTQxLDcgQEAKIAogI2RlZmluZSBHRU1fSVNSKGh3X3EpCQkoMHgwNDAwICsgKChod19xKSA8PCAyKSkKICNkZWZpbmUgR0VNX1RCUVAoaHdfcSkJCSgweDA0NDAgKyAoKGh3X3EpIDw8IDIpKQorI2RlZmluZSBHRU1fVEJRUEgoaHdfcSkJCSgweDA0QzgpCiAjZGVmaW5lIEdFTV9SQlFQKGh3X3EpCQkoMHgwNDgwICsgKChod19xKSA8PCAyKSkKICNkZWZpbmUgR0VNX0lFUihod19xKQkJKDB4MDYwMCArICgoaHdfcSkgPDwgMikpCiAjZGVmaW5lIEdFTV9JRFIoaHdfcSkJCSgweDA2MjAgKyAoKGh3X3EpIDw8IDIpKQpAQCAtMjQ5LDYgKzI1Miw4IEBACiAjZGVmaW5lIEdFTV9SWEJTX1NJWkUJCTgKICNkZWZpbmUgR0VNX0REUlBfT0ZGU0VUCQkyNCAvKiBkaXNjX3doZW5fbm9fYWhiICovCiAjZGVmaW5lIEdFTV9ERFJQX1NJWkUJCTEKKyNkZWZpbmUgR0VNX0FERFI2NF9PRkZTRVQJMzAgLyogQWRkcmVzcyBidXMgd2lkdGggLSA2NGIgb3IgMzJiICovCisjZGVmaW5lIEdFTV9BRERSNjRfU0laRQkJMQogCiAKIC8qIEJpdGZpZWxkcyBpbiBOU1IgKi8KQEAgLTQwMywxMSArNDA4LDExIEBACiAjZGVmaW5lIE1BQ0JfQ0FQU19VU1JJT19ERUZBVUxUX0lTX01JSV9HTUlJCTB4MDAwMDAwMDQKICNkZWZpbmUgTUFDQl9DQVBTX05PX0dJR0FCSVRfSEFMRgkJMHgwMDAwMDAwOAogI2RlZmluZSBNQUNCX0NBUFNfVVNSSU9fRElTQUJMRUQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUFDQl9DQVBTX0pVTUJPCQkJCTB4MDAwMDAwMjAKICNkZWZpbmUgTUFDQl9DQVBTX0ZJRk9fTU9ERQkJCTB4MTAwMDAwMDAKICNkZWZpbmUgTUFDQl9DQVBTX0dJR0FCSVRfTU9ERV9BVkFJTEFCTEUJMHgyMDAwMDAwMAogI2RlZmluZSBNQUNCX0NBUFNfU0dfRElTQUJMRUQJCQkweDQwMDAwMDAwCiAjZGVmaW5lIE1BQ0JfQ0FQU19NQUNCX0lTX0dFTQkJCTB4ODAwMDAwMDAKLSNkZWZpbmUgTUFDQl9DQVBTX0pVTUJPCQkJCTB4MDAwMDAwMTAKIAogLyogQml0IG1hbmlwdWxhdGlvbiBtYWNyb3MgKi8KICNkZWZpbmUgTUFDQl9CSVQobmFtZSkJCQkJCVwKQEAgLTQ3NCw2ICs0NzksMTAgQEAKIHN0cnVjdCBtYWNiX2RtYV9kZXNjIHsKIAl1MzIJYWRkcjsKIAl1MzIJY3RybDsKKyNpZmRlZiBDT05GSUdfQVJDSF9ETUFfQUREUl9UXzY0QklUCisJdTMyICAgICBhZGRyaDsKKwl1MzIgICAgIHJlc3ZkOworI2VuZGlmCiB9OwogCiAvKiBETUEgZGVzY3JpcHRvciBiaXRmaWVsZHMgKi8KQEAgLTc2Myw3ICs3NzIsOCBAQAogCXUzMgkJCWNhcHM7CiAJdW5zaWduZWQgaW50CQlkbWFfYnVyc3RfbGVuZ3RoOwogCWludAkoKmNsa19pbml0KShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgY2xrICoqcGNsaywKLQkJCSAgICBzdHJ1Y3QgY2xrICoqaGNsaywgc3RydWN0IGNsayAqKnR4X2Nsayk7CisJCQkgICAgc3RydWN0IGNsayAqKmhjbGssIHN0cnVjdCBjbGsgKip0eF9jbGssCisJCQkgICAgc3RydWN0IGNsayAqKnJ4X2Nsayk7CiAJaW50CSgqaW5pdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CiAJaW50CWp1bWJvX21heF9sZW47CiB9OwpAQCAtNzc3LDYgKzc4Nyw3IEBACiAJdW5zaWduZWQgaW50CQlJRFI7CiAJdW5zaWduZWQgaW50CQlJTVI7CiAJdW5zaWduZWQgaW50CQlUQlFQOworCXVuc2lnbmVkIGludAkJVEJRUEg7CiAKIAl1bnNpZ25lZCBpbnQJCXR4X2hlYWQsIHR4X3RhaWw7CiAJc3RydWN0IG1hY2JfZG1hX2Rlc2MJKnR4X3Jpbmc7CkBAIC04MDksNiArODIwLDcgQEAKIAlzdHJ1Y3QgY2xrCQkqcGNsazsKIAlzdHJ1Y3QgY2xrCQkqaGNsazsKIAlzdHJ1Y3QgY2xrCQkqdHhfY2xrOworCXN0cnVjdCBjbGsJCSpyeF9jbGs7CiAJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKIAlzdHJ1Y3QgbmFwaV9zdHJ1Y3QJbmFwaTsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL0tjb25maWcKaW5kZXggMGVmMjMyZC4uOTJmNDExYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL0tjb25maWcKQEAgLTM2LDEwICszNiwyMCBAQAogCWRlcGVuZHMgb24gNjRCSVQKIAlzZWxlY3QgUEhZTElCCiAJc2VsZWN0IE1ESU9fVEhVTkRFUgorCXNlbGVjdCBUSFVOREVSX05JQ19SR1gKIAktLS1oZWxwLS0tCiAJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBwcm9ncmFtbWluZyBhbmQgY29udHJvbGxpbmcgb2YgTUFDCiAJICBpbnRlcmZhY2UgZnJvbSBOSUMgcGh5c2ljYWwgZnVuY3Rpb24gZHJpdmVyLgogCitjb25maWcJVEhVTkRFUl9OSUNfUkdYCisJdHJpc3RhdGUgIlRodW5kZXIgTUFDIGludGVyZmFjZSBkcml2ZXIgKFJHWCkiCisJZGVwZW5kcyBvbiA2NEJJVAorCXNlbGVjdCBQSFlMSUIKKwlzZWxlY3QgTURJT19USFVOREVSCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgY29uZmlndXJpbmcgWENWIGJsb2NrIG9mIFJHWCBpbnRlcmZhY2UKKwkgIHByZXNlbnQgb24gQ044MVhYIGNoaXAuCisKIGNvbmZpZyBMSVFVSURJTwogCXRyaXN0YXRlICJDYXZpdW0gTGlxdWlkSU8gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIDY0QklUCkBAIC00OCw3ICs1OCw3IEBACiAJc2VsZWN0IExJQkNSQzMyQwogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIENhdml1bSBMaXF1aWRJTyBJbnRlbGxpZ2VudCBTZXJ2ZXIgQWRhcHRlcnMKLQkgIGJhc2VkIG9uIENONjZYWCBhbmQgQ042OFhYIGNoaXBzLgorCSAgYmFzZWQgb24gQ042NlhYLCBDTjY4WFggYW5kIENOMjNYWCBjaGlwcy4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgbGlxdWlkaW8uICBUaGlzIGlzIHJlY29tbWVuZGVkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL01ha2VmaWxlCmluZGV4IDJmMzY2ODAuLjVhMjdiMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vTWFrZWZpbGUKQEAgLTMsMTQgKzMsMTYgQEAKICMKIG9iai0kKENPTkZJR19MSVFVSURJTykgKz0gbGlxdWlkaW8ubwogCi1saXF1aWRpby1vYmpzIDo9IGxpb19tYWluLm8gIFwKLQkgICAgICBsaW9fZXRodG9vbC5vICAgICAgXAotCSAgICAgIHJlcXVlc3RfbWFuYWdlci5vICBcCi0JICAgICAgcmVzcG9uc2VfbWFuYWdlci5vIFwKLQkgICAgICBvY3Rlb25fZGV2aWNlLm8gICAgXAotCSAgICAgIGNuNjZ4eF9kZXZpY2UubyAgICBcCi0JICAgICAgY242OHh4X2RldmljZS5vICAgIFwKLQkgICAgICBvY3Rlb25fbWVtX29wcy5vICAgXAotCSAgICAgIG9jdGVvbl9kcm9xLm8gICAgICBcCi0JICAgICAgb2N0ZW9uX2NvbnNvbGUubyAgIFwKLQkgICAgICBvY3Rlb25fbmljLm8KK2xpcXVpZGlvLSQoQ09ORklHX0xJUVVJRElPKSArPSBsaW9fZXRodG9vbC5vIFwKKwkJCWxpb19jb3JlLm8gICAgICAgICBcCisJCQlyZXF1ZXN0X21hbmFnZXIubyAgXAorCQkJcmVzcG9uc2VfbWFuYWdlci5vIFwKKwkJCW9jdGVvbl9kZXZpY2UubyAgICBcCisJCQljbjY2eHhfZGV2aWNlLm8gICAgXAorCQkJY242OHh4X2RldmljZS5vICAgIFwKKwkJCWNuMjN4eF9wZl9kZXZpY2UubyBcCisJCQlvY3Rlb25fbWVtX29wcy5vICAgXAorCQkJb2N0ZW9uX2Ryb3EubyAgICAgIFwKKwkJCW9jdGVvbl9uaWMubworCitsaXF1aWRpby1vYmpzIDo9IGxpb19tYWluLm8gb2N0ZW9uX2NvbnNvbGUubyAkKGxpcXVpZGlvLXkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY24yM3h4X3BmX2RldmljZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuMjN4eF9wZl9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGRiMTk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuMjN4eF9wZl9kZXZpY2UuYwpAQCAtMCwwICsxLDEyMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEF1dGhvcjogQ2F2aXVtLCBJbmMuCisqCisqIENvbnRhY3Q6IHN1cHBvcnRAY2F2aXVtLmNvbQorKiAgICAgICAgICBQbGVhc2UgaW5jbHVkZSAiTGlxdWlkSU8iIGluIHRoZSBzdWJqZWN0LgorKgorKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDYXZpdW0sIEluYy4KKyoKKyogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLCBhcworKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyoKKyogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorKiBBUy1JUyBhbmQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFLCBvcgorKiBOT05JTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisqIGRldGFpbHMuCisqCisqIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBhdmFpbGFibGUgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSBmcm9tIENhdml1bS4KKyogQ29udGFjdCBDYXZpdW0sIEluYy4gZm9yIG1vcmUgaW5mb3JtYXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSAibGlxdWlkaW9fY29tbW9uLmgiCisjaW5jbHVkZSAib2N0ZW9uX2Ryb3EuaCIKKyNpbmNsdWRlICJvY3Rlb25faXEuaCIKKyNpbmNsdWRlICJyZXNwb25zZV9tYW5hZ2VyLmgiCisjaW5jbHVkZSAib2N0ZW9uX2RldmljZS5oIgorI2luY2x1ZGUgImNuMjN4eF9wZl9kZXZpY2UuaCIKKyNpbmNsdWRlICJvY3Rlb25fbWFpbi5oIgorCisjZGVmaW5lIFJFU0VUX05PVERPTkUgMAorI2RlZmluZSBSRVNFVF9ET05FIDEKKworLyogQ2hhbmdlIHRoZSB2YWx1ZSBvZiBTTEkgUGFja2V0IElucHV0IEphYmJlciBSZWdpc3RlciB0byBhbGxvdworICogVlhMQU4gVFNPIHBhY2tldHMgd2hpY2ggY2FuIGJlIDY0NDI0IGJ5dGVzLCBleGNlZWRpbmcgdGhlCisgKiBNQVhfR1NPX1NJWkUgd2Ugc3VwcGxpZWQgdG8gdGhlIGtlcm5lbAorICovCisjZGVmaW5lIENOMjNYWF9JTlBVVF9KQUJCRVIgNjQ2MDAKKworI2RlZmluZSBMSU9MVVRfUklOR19ESVNUUklCVVRJT04gOQorY29uc3QgaW50IGxpb2x1dF9udW1fdmZzX3RvX3JpbmdzX3Blcl92ZltMSU9MVVRfUklOR19ESVNUUklCVVRJT05dID0geworCTAsIDgsIDQsIDIsIDIsIDIsIDEsIDEsIDEKK307CisKK3ZvaWQgY24yM3h4X2R1bXBfcGZfaW5pdGlhbGl6ZWRfcmVncyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCWludCBpID0gMDsKKwl1MzIgcmVndmFsID0gMDsKKwlzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqY24yM3h4ID0gKHN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICopb2N0LT5jaGlwOworCisJLypJbiBjbjIzeHhfc29mdF9yZXNldCovCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlc1slbGx4XSA6IDB4JWxseFxuIiwKKwkJIkNOMjNYWF9XSU5fV1JfTUFTS19SRUciLCBDVk1fQ0FTVDY0KENOMjNYWF9XSU5fV1JfTUFTS19SRUcpLAorCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgQ04yM1hYX1dJTl9XUl9NQVNLX1JFRykpKTsKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkiQ04yM1hYX1NMSV9TQ1JBVENIMSIsIENWTV9DQVNUNjQoQ04yM1hYX1NMSV9TQ1JBVENIMSksCisJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQob2N0LCBDTjIzWFhfU0xJX1NDUkFUQ0gxKSkpOworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXNbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCSJDTjIzWFhfUlNUX1NPRlRfUlNUIiwgQ04yM1hYX1JTVF9TT0ZUX1JTVCwKKwkJbGlvX3BjaV9yZWFkcShvY3QsIENOMjNYWF9SU1RfU09GVF9SU1QpKTsKKworCS8qSW4gY24yM3h4X3NldF9kcGlfcmVncyovCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlc1slbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJIkNOMjNYWF9EUElfRE1BX0NPTlRST0wiLCBDTjIzWFhfRFBJX0RNQV9DT05UUk9MLAorCQlsaW9fcGNpX3JlYWRxKG9jdCwgQ04yM1hYX0RQSV9ETUFfQ09OVFJPTCkpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzKCVkKVslbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJCSJDTjIzWFhfRFBJX0RNQV9FTkdfRU5CIiwgaSwKKwkJCUNOMjNYWF9EUElfRE1BX0VOR19FTkIoaSksCisJCQlsaW9fcGNpX3JlYWRxKG9jdCwgQ04yM1hYX0RQSV9ETUFfRU5HX0VOQihpKSkpOworCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzKCVkKVslbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJCSJDTjIzWFhfRFBJX0RNQV9FTkdfQlVGIiwgaSwKKwkJCUNOMjNYWF9EUElfRE1BX0VOR19CVUYoaSksCisJCQlsaW9fcGNpX3JlYWRxKG9jdCwgQ04yM1hYX0RQSV9ETUFfRU5HX0JVRihpKSkpOworCX0KKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXNbJWxseF0gOiAweCUwMTZsbHhcbiIsICJDTjIzWFhfRFBJX0NUTCIsCisJCUNOMjNYWF9EUElfQ1RMLCBsaW9fcGNpX3JlYWRxKG9jdCwgQ04yM1hYX0RQSV9DVEwpKTsKKworCS8qSW4gY24yM3h4X3NldHVwX3BjaWVfbXBzIGFuZCBjbjIzeHhfc2V0dXBfcGNpZV9tcnJzICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG9jdC0+cGNpX2RldiwgQ04yM1hYX0NPTkZJR19QQ0lFX0RFVkNUTCwgJnJlZ3ZhbCk7CisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlc1slbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJIkNOMjNYWF9DT05GSUdfUENJRV9ERVZDVEwiLAorCQlDVk1fQ0FTVDY0KENOMjNYWF9DT05GSUdfUENJRV9ERVZDVEwpLCBDVk1fQ0FTVDY0KHJlZ3ZhbCkpOworCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyglZClbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCSJDTjIzWFhfRFBJX1NMSV9QUlRYX0NGRyIsIG9jdC0+cGNpZV9wb3J0LAorCQlDTjIzWFhfRFBJX1NMSV9QUlRYX0NGRyhvY3QtPnBjaWVfcG9ydCksCisJCWxpb19wY2lfcmVhZHEob2N0LCBDTjIzWFhfRFBJX1NMSV9QUlRYX0NGRyhvY3QtPnBjaWVfcG9ydCkpKTsKKworCS8qSW4gY24yM3h4X3NwZWNpZmljX3JlZ3Nfc2V0dXAgKi8KKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzKCVkKVslbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJIkNOMjNYWF9TTElfUzJNX1BPUlRYX0NUTCIsIG9jdC0+cGNpZV9wb3J0LAorCQlDVk1fQ0FTVDY0KENOMjNYWF9TTElfUzJNX1BPUlRYX0NUTChvY3QtPnBjaWVfcG9ydCkpLAorCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJb2N0LCBDTjIzWFhfU0xJX1MyTV9QT1JUWF9DVEwob2N0LT5wY2llX3BvcnQpKSkpOworCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlc1slbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJIkNOMjNYWF9TTElfUklOR19SU1QiLCBDVk1fQ0FTVDY0KENOMjNYWF9TTElfUEtUX0lPUV9SSU5HX1JTVCksCisJCSh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCBDTjIzWFhfU0xJX1BLVF9JT1FfUklOR19SU1QpKTsKKworCS8qSW4gY24yM3h4X3NldHVwX2dsb2JhbF9tYWNfcmVncyovCisJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfTUFDUzsgaSsrKSB7CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMoJWQpWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkJIkNOMjNYWF9TTElfUEtUX01BQ19SSU5GTzY0IiwgaSwKKwkJCUNWTV9DQVNUNjQoQ04yM1hYX1NMSV9QS1RfTUFDX1JJTkZPNjQoaSwgb2N0LT5wZl9udW0pKSwKKwkJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQKKwkJCQkob2N0LCBDTjIzWFhfU0xJX1BLVF9NQUNfUklORk82NAorCQkJCQkoaSwgb2N0LT5wZl9udW0pKSkpOworCX0KKworCS8qSW4gY24yM3h4X3NldHVwX2dsb2JhbF9pbnB1dF9yZWdzKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9JTlBVVF9RVUVVRVM7IGkrKykgeworCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzKCVkKVslbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJCSJDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQiLCBpLAorCQkJQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQoaSkpLAorCQkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NAorCQkJCShvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChpKSkpKTsKKwl9CisKKwkvKkluIGNuMjN4eF9zZXR1cF9nbG9iYWxfb3V0cHV0X3JlZ3MqLworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXNbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCSJDTjIzWFhfU0xJX09RX1dNQVJLIiwgQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX09RX1dNQVJLKSwKKwkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NChvY3QsIENOMjNYWF9TTElfT1FfV01BUkspKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9PVVRQVVRfUVVFVUVTOyBpKyspIHsKKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyglZClbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCQkiQ04yM1hYX1NMSV9PUV9QS1RfQ09OVFJPTCIsIGksCisJCQlDVk1fQ0FTVDY0KENOMjNYWF9TTElfT1FfUEtUX0NPTlRST0woaSkpLAorCQkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3IoCisJCQkJb2N0LCBDTjIzWFhfU0xJX09RX1BLVF9DT05UUk9MKGkpKSkpOworCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzKCVkKVslbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJCSJDTjIzWFhfU0xJX09RX1BLVF9JTlRfTEVWRUxTIiwgaSwKKwkJCUNWTV9DQVNUNjQoQ04yM1hYX1NMSV9PUV9QS1RfSU5UX0xFVkVMUyhpKSksCisJCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJCW9jdCwgQ04yM1hYX1NMSV9PUV9QS1RfSU5UX0xFVkVMUyhpKSkpKTsKKwl9CisKKwkvKkluIGNuMjN4eF9lbmFibGVfaW50ZXJydXB0IGFuZCBjbjIzeHhfZGlzYWJsZV9pbnRlcnJ1cHQqLworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXNbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCSJjbjIzeHgtPmludHJfZW5iX3JlZzY0IiwKKwkJQ1ZNX0NBU1Q2NCgobG9uZykoY24yM3h4LT5pbnRyX2VuYl9yZWc2NCkpLAorCQlDVk1fQ0FTVDY0KHJlYWRxKGNuMjN4eC0+aW50cl9lbmJfcmVnNjQpKSk7CisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkiY24yM3h4LT5pbnRyX3N1bV9yZWc2NCIsCisJCUNWTV9DQVNUNjQoKGxvbmcpKGNuMjN4eC0+aW50cl9zdW1fcmVnNjQpKSwKKwkJQ1ZNX0NBU1Q2NChyZWFkcShjbjIzeHgtPmludHJfc3VtX3JlZzY0KSkpOworCisJLypJbiBjbjIzeHhfc2V0dXBfaXFfcmVncyovCisJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfSU5QVVRfUVVFVUVTOyBpKyspIHsKKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyglZClbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCQkiQ04yM1hYX1NMSV9JUV9CQVNFX0FERFI2NCIsIGksCisJCQlDVk1fQ0FTVDY0KENOMjNYWF9TTElfSVFfQkFTRV9BRERSNjQoaSkpLAorCQkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCQlvY3QsIENOMjNYWF9TTElfSVFfQkFTRV9BRERSNjQoaSkpKSk7CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMoJWQpWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkJIkNOMjNYWF9TTElfSVFfU0laRSIsIGksCisJCQlDVk1fQ0FTVDY0KENOMjNYWF9TTElfSVFfU0laRShpKSksCisJCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcgorCQkJCShvY3QsIENOMjNYWF9TTElfSVFfU0laRShpKSkpKTsKKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyglZClbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCQkiQ04yM1hYX1NMSV9JUV9ET09SQkVMTCIsIGksCisJCQlDVk1fQ0FTVDY0KENOMjNYWF9TTElfSVFfRE9PUkJFTEwoaSkpLAorCQkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCQlvY3QsIENOMjNYWF9TTElfSVFfRE9PUkJFTEwoaSkpKSk7CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMoJWQpWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkJIkNOMjNYWF9TTElfSVFfSU5TVFJfQ09VTlQ2NCIsIGksCisJCQlDVk1fQ0FTVDY0KENOMjNYWF9TTElfSVFfSU5TVFJfQ09VTlQ2NChpKSksCisJCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJCW9jdCwgQ04yM1hYX1NMSV9JUV9JTlNUUl9DT1VOVDY0KGkpKSkpOworCX0KKworCS8qSW4gY24yM3h4X3NldHVwX29xX3JlZ3MqLworCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX09VVFBVVF9RVUVVRVM7IGkrKykgeworCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzKCVkKVslbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJCSJDTjIzWFhfU0xJX09RX0JBU0VfQUREUjY0IiwgaSwKKwkJCUNWTV9DQVNUNjQoQ04yM1hYX1NMSV9PUV9CQVNFX0FERFI2NChpKSksCisJCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJCW9jdCwgQ04yM1hYX1NMSV9PUV9CQVNFX0FERFI2NChpKSkpKTsKKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyglZClbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCQkiQ04yM1hYX1NMSV9PUV9TSVpFIiwgaSwKKwkJCUNWTV9DQVNUNjQoQ04yM1hYX1NMSV9PUV9TSVpFKGkpKSwKKwkJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyCisJCQkJKG9jdCwgQ04yM1hYX1NMSV9PUV9TSVpFKGkpKSkpOworCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzKCVkKVslbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJCSJDTjIzWFhfU0xJX09RX0JVRkZfSU5GT19TSVpFIiwgaSwKKwkJCUNWTV9DQVNUNjQoQ04yM1hYX1NMSV9PUV9CVUZGX0lORk9fU0laRShpKSksCisJCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcigKKwkJCQlvY3QsIENOMjNYWF9TTElfT1FfQlVGRl9JTkZPX1NJWkUoaSkpKSk7CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMoJWQpWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkJIkNOMjNYWF9TTElfT1FfUEtUU19TRU5UIiwgaSwKKwkJCUNWTV9DQVNUNjQoQ04yM1hYX1NMSV9PUV9QS1RTX1NFTlQoaSkpLAorCQkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCQlvY3QsIENOMjNYWF9TTElfT1FfUEtUU19TRU5UKGkpKSkpOworCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzKCVkKVslbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJCSJDTjIzWFhfU0xJX09RX1BLVFNfQ1JFRElUIiwgaSwKKwkJCUNWTV9DQVNUNjQoQ04yM1hYX1NMSV9PUV9QS1RTX0NSRURJVChpKSksCisJCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJCW9jdCwgQ04yM1hYX1NMSV9PUV9QS1RTX0NSRURJVChpKSkpKTsKKwl9CisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkiQ04yM1hYX1NMSV9QS1RfVElNRV9JTlQiLAorCQlDVk1fQ0FTVDY0KENOMjNYWF9TTElfUEtUX1RJTUVfSU5UKSwKKwkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NChvY3QsIENOMjNYWF9TTElfUEtUX1RJTUVfSU5UKSkpOworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXNbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCSJDTjIzWFhfU0xJX1BLVF9DTlRfSU5UIiwKKwkJQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX1BLVF9DTlRfSU5UKSwKKwkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NChvY3QsIENOMjNYWF9TTElfUEtUX0NOVF9JTlQpKSk7Cit9CisKK3N0YXRpYyBpbnQgY24yM3h4X3BmX3NvZnRfcmVzZXQoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LCBDTjIzWFhfV0lOX1dSX01BU0tfUkVHLCAweEZGKTsKKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiT0NURU9OWyVkXTogQklTVCBlbmFibGVkIGZvciBDTjIzWFggc29mdCByZXNldFxuIiwKKwkJb2N0LT5vY3Rlb25faWQpOworCisJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9TQ1JBVENIMSwgMHgxMjM0VUxMKTsKKworCS8qIEluaXRpYXRlIGNoaXAtd2lkZSBzb2Z0IHJlc2V0ICovCisJbGlvX3BjaV9yZWFkcShvY3QsIENOMjNYWF9SU1RfU09GVF9SU1QpOworCWxpb19wY2lfd3JpdGVxKG9jdCwgMSwgQ04yM1hYX1JTVF9TT0ZUX1JTVCk7CisKKwkvKiBXYWl0IGZvciAxMDBtcyBhcyBPY3Rlb24gcmVzZXRzLiAqLworCW1kZWxheSgxMDApOworCisJaWYgKG9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9TQ1JBVENIMSkgPT0gMHgxMjM0VUxMKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiT0NURU9OWyVkXTogU29mdCByZXNldCBmYWlsZWRcbiIsCisJCQlvY3QtPm9jdGVvbl9pZCk7CisJCXJldHVybiAxOworCX0KKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiT0NURU9OWyVkXTogUmVzZXQgY29tcGxldGVkXG4iLAorCQlvY3QtPm9jdGVvbl9pZCk7CisKKwkvKiByZXN0b3JlIHRoZSAgcmVzZXQgdmFsdWUqLworCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsIENOMjNYWF9XSU5fV1JfTUFTS19SRUcsIDB4RkYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNuMjN4eF9lbmFibGVfZXJyb3JfcmVwb3J0aW5nKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJdTMyIHJlZ3ZhbDsKKwl1MzIgdW5jb3JyZWN0YWJsZV9lcnJfbWFzaywgY29ycnRhYmxlX2Vycl9zdGF0dXM7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQob2N0LT5wY2lfZGV2LCBDTjIzWFhfQ09ORklHX1BDSUVfREVWQ1RMLCAmcmVndmFsKTsKKwlpZiAocmVndmFsICYgQ04yM1hYX0NPTkZJR19QQ0lFX0RFVkNUTF9NQVNLKSB7CisJCXVuY29ycmVjdGFibGVfZXJyX21hc2sgPSAwOworCQljb3JydGFibGVfZXJyX3N0YXR1cyA9IDA7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChvY3QtPnBjaV9kZXYsCisJCQkJICAgICAgQ04yM1hYX0NPTkZJR19QQ0lFX1VOQ09SUkVDVF9FUlJfTUFTSywKKwkJCQkgICAgICAmdW5jb3JyZWN0YWJsZV9lcnJfbWFzayk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChvY3QtPnBjaV9kZXYsCisJCQkJICAgICAgQ04yM1hYX0NPTkZJR19QQ0lFX0NPUlJFQ1RfRVJSX1NUQVRVUywKKwkJCQkgICAgICAmY29ycnRhYmxlX2Vycl9zdGF0dXMpOworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIlBDSS1FIEZhdGFsIGVycm9yIGRldGVjdGVkO1xuIgorCQkJCSAiXHRkZXZfY3RsX3N0YXR1c19yZWcgPSAweCUwOHhcbiIKKwkJCQkgIlx0dW5jb3JyZWN0YWJsZV9lcnJvcl9tYXNrX3JlZyA9IDB4JTA4eFxuIgorCQkJCSAiXHRjb3JyZWN0YWJsZV9lcnJvcl9zdGF0dXNfcmVnID0gMHglMDh4XG4iLAorCQkJICAgIHJlZ3ZhbCwgdW5jb3JyZWN0YWJsZV9lcnJfbWFzaywKKwkJCSAgICBjb3JydGFibGVfZXJyX3N0YXR1cyk7CisJfQorCisJcmVndmFsIHw9IDB4ZjsgLyogRW5hYmxlIExpbmsgZXJyb3IgcmVwb3J0aW5nICovCisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIk9DVEVPTlslZF06IEVuYWJsaW5nIFBDSS1FIGVycm9yIHJlcG9ydGluZy4uXG4iLAorCQlvY3QtPm9jdGVvbl9pZCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChvY3QtPnBjaV9kZXYsIENOMjNYWF9DT05GSUdfUENJRV9ERVZDVEwsIHJlZ3ZhbCk7Cit9CisKK3N0YXRpYyB1MzIgY24yM3h4X2NvcHJvY2Vzc29yX2Nsb2NrKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJLyogQml0cyAyOToyNCBvZiBSU1RfQk9PVFtQTlJfTVVMXSBob2xkcyB0aGUgcmVmLmNsb2NrIE1VTFRJUExJRVIKKwkgKiBmb3IgU0xJLgorCSAqLworCisJLyogVEJEOiBnZXQgdGhlIGluZm8gaW4gSGFuZC1zaGFrZSAqLworCXJldHVybiAoKChsaW9fcGNpX3JlYWRxKG9jdCwgQ04yM1hYX1JTVF9CT09UKSA+PiAyNCkgJiAweDNmKSAqIDUwKTsKK30KKwordTMyIGNuMjN4eF9wZl9nZXRfb3FfdGlja3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdTMyIHRpbWVfaW50cl9pbl91cykKK3sKKwkvKiBUaGlzIGdpdmVzIHRoZSBTTEkgY2xvY2sgcGVyIG1pY3Jvc2VjICovCisJdTMyIG9xdGlja3NfcGVyX3VzID0gY24yM3h4X2NvcHJvY2Vzc29yX2Nsb2NrKG9jdCk7CisKKwlvY3QtPnBmdmZfaHN3b3JkLmNvcHJvY190aWNzX3Blcl91cyA9IG9xdGlja3NfcGVyX3VzOworCisJLyogVGhpcyBnaXZlcyB0aGUgY2xvY2sgY3ljbGVzIHBlciBtaWxsaXNlY29uZCAqLworCW9xdGlja3NfcGVyX3VzICo9IDEwMDA7CisKKwkvKiBUaGlzIGdpdmVzIHRoZSBvcSB0aWNrcyAoMTAyNCBjb3JlIGNsb2NrIGN5Y2xlcykgcGVyIG1pbGxpc2Vjb25kICovCisJb3F0aWNrc19wZXJfdXMgLz0gMTAyNDsKKworCS8qIHRpbWVfaW50ciBpcyBpbiBtaWNyb3NlY29uZHMuIFRoZSBuZXh0IDIgc3RlcHMgZ2l2ZXMgdGhlIG9xIHRpY2tzCisJICogIGNvcnJlc3Nwb25kaW5nIHRvIHRpbWVfaW50ci4KKwkgKi8KKwlvcXRpY2tzX3Blcl91cyAqPSB0aW1lX2ludHJfaW5fdXM7CisJb3F0aWNrc19wZXJfdXMgLz0gMTAwMDsKKworCXJldHVybiBvcXRpY2tzX3Blcl91czsKK30KKworc3RhdGljIHZvaWQgY24yM3h4X3NldHVwX2dsb2JhbF9tYWNfcmVncyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCXU2NCByZWdfdmFsOworCXUxNiBtYWNfbm8gPSBvY3QtPnBjaWVfcG9ydDsKKwl1MTYgcGZfbnVtID0gb2N0LT5wZl9udW07CisKKwkvKiBwcm9ncmFtbWluZyBTUk4gYW5kIFRSUyBmb3IgZWFjaCBNQUMoMC4uMykgICovCisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzOlVzaW5nIHBjaWUgcG9ydCAlZFxuIiwKKwkJX19mdW5jX18sIG1hY19ubyk7CisJLyogQnkgZGVmYXVsdCwgbWFwcGluZyBhbGwgNjQgSU9RcyB0byAgYSBzaW5nbGUgTUFDcyAqLworCisJcmVnX3ZhbCA9CisJICAgIG9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9QS1RfTUFDX1JJTkZPNjQobWFjX25vLCBwZl9udW0pKTsKKworCWlmIChvY3QtPnJldl9pZCA9PSBPQ1RFT05fQ04yM1hYX1JFVl8xXzEpIHsKKwkJLyogc2V0dGluZyBTUk4gPDY6MD4gICovCisJCXJlZ192YWwgPSBwZl9udW0gKiBDTjIzWFhfTUFYX1JJTkdTX1BFUl9QRl9QQVNTXzFfMTsKKwl9IGVsc2UgeworCQkvKiBzZXR0aW5nIFNSTiA8NjowPiAgKi8KKwkJcmVnX3ZhbCA9IHBmX251bSAqIENOMjNYWF9NQVhfUklOR1NfUEVSX1BGOworCX0KKworCS8qIHNldHRpbmcgVFJTIDwyMzoxNj4gKi8KKwlyZWdfdmFsID0gcmVnX3ZhbCB8CisJCSAgKG9jdC0+c3Jpb3ZfaW5mby50cnMgPDwgQ04yM1hYX1BLVF9NQUNfQ1RMX1JJTkZPX1RSU19CSVRfUE9TKTsKKwkvKiB3cml0ZSB0aGVzZSBzZXR0aW5ncyB0byBNQUMgcmVnaXN0ZXIgKi8KKwlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LCBDTjIzWFhfU0xJX1BLVF9NQUNfUklORk82NChtYWNfbm8sIHBmX251bSksCisJCQkgICByZWdfdmFsKTsKKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiU0xJX1BLVF9NQUMoJWQpX1BGKCVkKV9SSU5GTyA6IDB4JTAxNmxseFxuIiwKKwkJbWFjX25vLCBwZl9udW0sICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQKKwkJKG9jdCwgQ04yM1hYX1NMSV9QS1RfTUFDX1JJTkZPNjQobWFjX25vLCBwZl9udW0pKSk7Cit9CisKK3N0YXRpYyBpbnQgY24yM3h4X3Jlc2V0X2lvX3F1ZXVlcyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCWludCByZXRfdmFsID0gMDsKKwl1NjQgZDY0OworCXUzMiBxX25vLCBzcm4sIGVybjsKKwl1MzIgbG9vcCA9IDEwMDA7CisKKwlzcm4gPSBvY3QtPnNyaW92X2luZm8ucGZfc3JuOworCWVybiA9IHNybiArIG9jdC0+c3Jpb3ZfaW5mby5udW1fcGZfcmluZ3M7CisKKwkvKkFzIHBlciBIUk0gcmVnIGRlc2NyaXB0aW9uLCBzL3cgY2FudCB3cml0ZSAwIHRvIEVOQi4gKi8KKwkvKnRvIG1ha2UgdGhlIHF1ZXVlIG9mZiwgbmVlZCB0byBzZXQgdGhlIFJTVCBiaXQuICovCisKKwkvKiBSZXNldCB0aGUgRW5hYmxlIGJpdCBmb3IgYWxsIHRoZSA2NCBJUXMuICAqLworCWZvciAocV9ubyA9IHNybjsgcV9ubyA8IGVybjsgcV9ubysrKSB7CisJCS8qIHNldCBSU1QgYml0IHRvIDEuIFRoaXMgYml0IGFwcGxpZXMgdG8gYm90aCBJUSBhbmQgT1EgKi8KKwkJZDY0ID0gb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubykpOworCQlkNjQgPSBkNjQgfCBDTjIzWFhfUEtUX0lOUFVUX0NUTF9SU1Q7CisJCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSwgZDY0KTsKKwl9CisKKwkvKndhaXQgdW50aWwgdGhlIFJTVCBiaXQgaXMgY2xlYXIgb3IgdGhlIFJTVCBhbmQgcXVpdGUgYml0cyBhcmUgc2V0Ki8KKwlmb3IgKHFfbm8gPSBzcm47IHFfbm8gPCBlcm47IHFfbm8rKykgeworCQl1NjQgcmVnX3ZhbCA9IG9jdGVvbl9yZWFkX2NzcjY0KG9jdCwKKwkJCQkJQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pKTsKKwkJd2hpbGUgKChSRUFEX09OQ0UocmVnX3ZhbCkgJiBDTjIzWFhfUEtUX0lOUFVUX0NUTF9SU1QpICYmCisJCSAgICAgICAhKFJFQURfT05DRShyZWdfdmFsKSAmIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1FVSUVUKSAmJgorCQkgICAgICAgbG9vcC0tKSB7CisJCQlXUklURV9PTkNFKHJlZ192YWwsIG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJICAgIG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pKSk7CisJCX0KKwkJaWYgKCFsb29wKSB7CisJCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwKKwkJCQkiY2xlYXJpbmcgdGhlIHJlc2V0IHJlZyBmYWlsZWQgb3Igc2V0dGluZyB0aGUgcXVpZXQgcmVnIGZhaWxlZCBmb3IgcW5vOiAldVxuIiwKKwkJCQlxX25vKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlXUklURV9PTkNFKHJlZ192YWwsIFJFQURfT05DRShyZWdfdmFsKSAmCisJCQl+Q04yM1hYX1BLVF9JTlBVVF9DVExfUlNUKTsKKwkJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pLAorCQkJCSAgIFJFQURfT05DRShyZWdfdmFsKSk7CisKKwkJV1JJVEVfT05DRShyZWdfdmFsLCBvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCSAgIG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pKSk7CisJCWlmIChSRUFEX09OQ0UocmVnX3ZhbCkgJiBDTjIzWFhfUEtUX0lOUFVUX0NUTF9SU1QpIHsKKwkJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LAorCQkJCSJjbGVhcmluZyB0aGUgcmVzZXQgZmFpbGVkIGZvciBxbm86ICV1XG4iLAorCQkJCXFfbm8pOworCQkJcmV0X3ZhbCA9IC0xOworCQl9CisJfQorCisJcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyBpbnQgY24yM3h4X3BmX3NldHVwX2dsb2JhbF9pbnB1dF9yZWdzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJdTMyIHFfbm8sIGVybiwgc3JuOworCXU2NCBwZl9udW07CisJdTY0IGludHJfdGhyZXNob2xkLCByZWdfdmFsOworCXN0cnVjdCBvY3Rlb25faW5zdHJfcXVldWUgKmlxOworCXN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICpjbjIzeHggPSAoc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKilvY3QtPmNoaXA7CisKKwlwZl9udW0gPSBvY3QtPnBmX251bTsKKworCXNybiA9IG9jdC0+c3Jpb3ZfaW5mby5wZl9zcm47CisJZXJuID0gc3JuICsgb2N0LT5zcmlvdl9pbmZvLm51bV9wZl9yaW5nczsKKworCWlmIChjbjIzeHhfcmVzZXRfaW9fcXVldWVzKG9jdCkpCisJCXJldHVybiAtMTsKKworCS8qKiBTZXQgdGhlIE1BQ19OVU0gYW5kIFBWRl9OVU0gaW4gSVFfUEtUX0NPTlRST0wgcmVnCisJKiBmb3IgYWxsIHF1ZXVlcy5Pbmx5IFBGIGNhbiBzZXQgdGhlc2UgYml0cy4KKwkqIGJpdHMgMjk6MzAgaW5kaWNhdGUgdGhlIE1BQyBudW0uCisJKiBiaXRzIDMyOjQ3IGluZGljYXRlIHRoZSBQVkYgbnVtLgorCSovCisJZm9yIChxX25vID0gMDsgcV9ubyA8IGVybjsgcV9ubysrKSB7CisJCXJlZ192YWwgPSBvY3QtPnBjaWVfcG9ydCA8PCBDTjIzWFhfUEtUX0lOUFVUX0NUTF9NQUNfTlVNX1BPUzsKKwkJcmVnX3ZhbCB8PSBwZl9udW0gPDwgQ04yM1hYX1BLVF9JTlBVVF9DVExfUEZfTlVNX1BPUzsKKworCQlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubyksCisJCQkJICAgcmVnX3ZhbCk7CisJfQorCisJLyogU2VsZWN0IEVTLCBSTywgTlMsIFJEU0laRSxEUFRSIEZvbWF0IzAgZm9yCisJICogcGYgcXVldWVzCisJICovCisJZm9yIChxX25vID0gc3JuOyBxX25vIDwgZXJuOyBxX25vKyspIHsKKwkJdm9pZCBfX2lvbWVtICppbnN0X2NudF9yZWc7CisKKwkJaXEgPSBvY3QtPmluc3RyX3F1ZXVlW3Ffbm9dOworCQlpZiAoaXEpCisJCQlpbnN0X2NudF9yZWcgPSBpcS0+aW5zdF9jbnRfcmVnOworCQllbHNlCisJCQlpbnN0X2NudF9yZWcgPSAodTggKilvY3QtPm1taW9bMF0uaHdfYWRkciArCisJCQkJICAgICAgIENOMjNYWF9TTElfSVFfSU5TVFJfQ09VTlQ2NChxX25vKTsKKworCQlyZWdfdmFsID0KKwkJICAgIG9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pKTsKKworCQlyZWdfdmFsIHw9IENOMjNYWF9QS1RfSU5QVVRfQ1RMX01BU0s7CisKKwkJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pLAorCQkJCSAgIHJlZ192YWwpOworCisJCS8qIFNldCBXTUFSSyBsZXZlbCBmb3IgdHJpZ2dlcmluZyBQSV9JTlQgKi8KKwkJLyogaW50cl90aHJlc2hvbGQgPSBDTjIzWFhfREVGX0lRX0lOVFJfVEhSRVNIT0xEICYgKi8KKwkJaW50cl90aHJlc2hvbGQgPSBDRkdfR0VUX0lRX0lOVFJfUEtUKGNuMjN4eC0+Y29uZikgJgorCQkJCSBDTjIzWFhfUEtUX0lOX0RPTkVfV01BUktfTUFTSzsKKworCQl3cml0ZXEoKHJlYWRxKGluc3RfY250X3JlZykgJgorCQkJfihDTjIzWFhfUEtUX0lOX0RPTkVfV01BUktfTUFTSyA8PAorCQkJICBDTjIzWFhfUEtUX0lOX0RPTkVfV01BUktfQklUX1BPUykpIHwKKwkJICAgICAgIChpbnRyX3RocmVzaG9sZCA8PCBDTjIzWFhfUEtUX0lOX0RPTkVfV01BUktfQklUX1BPUyksCisJCSAgICAgICBpbnN0X2NudF9yZWcpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY24yM3h4X3BmX3NldHVwX2dsb2JhbF9vdXRwdXRfcmVncyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCXUzMiByZWdfdmFsOworCXUzMiBxX25vLCBlcm4sIHNybjsKKwl1NjQgdGltZV90aHJlc2hvbGQ7CisKKwlzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqY24yM3h4ID0gKHN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICopb2N0LT5jaGlwOworCisJc3JuID0gb2N0LT5zcmlvdl9pbmZvLnBmX3NybjsKKwllcm4gPSBzcm4gKyBvY3QtPnNyaW92X2luZm8ubnVtX3BmX3JpbmdzOworCisJaWYgKENGR19HRVRfSVNfU0xJX0JQX09OKGNuMjN4eC0+Y29uZikpIHsKKwkJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9PUV9XTUFSSywgMzIpOworCX0gZWxzZSB7CisJCS8qKiBTZXQgT3V0cHV0IHF1ZXVlIHdhdGVybWFyayB0byAwIHRvIGRpc2FibGUgYmFja3ByZXNzdXJlICovCisJCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsIENOMjNYWF9TTElfT1FfV01BUkssIDApOworCX0KKworCWZvciAocV9ubyA9IHNybjsgcV9ubyA8IGVybjsgcV9ubysrKSB7CisJCXJlZ192YWwgPSBvY3Rlb25fcmVhZF9jc3Iob2N0LCBDTjIzWFhfU0xJX09RX1BLVF9DT05UUk9MKHFfbm8pKTsKKworCQkvKiBzZXQgSVBUUiAmIERQVFIgKi8KKwkJcmVnX3ZhbCB8PQorCQkgICAgKENOMjNYWF9QS1RfT1VUUFVUX0NUTF9JUFRSIHwgQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX0RQVFIpOworCisJCS8qIHJlc2V0IEJNT0RFICovCisJCXJlZ192YWwgJj0gfihDTjIzWFhfUEtUX09VVFBVVF9DVExfQk1PREUpOworCisJCS8qIE5vIFJlbGF4ZWQgT3JkZXJpbmcsIE5vIFNub29wLCA2NC1iaXQgQnl0ZSBzd2FwCisJCSAqIGZvciBPdXRwdXQgUXVldWUgU2NhdHRlckxpc3QKKwkJICogcmVzZXQgUk9SX1AsIE5TUl9QCisJCSAqLworCQlyZWdfdmFsICY9IH4oQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX1JPUl9QKTsKKwkJcmVnX3ZhbCAmPSB+KENOMjNYWF9QS1RfT1VUUFVUX0NUTF9OU1JfUCk7CisKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKwkJcmVnX3ZhbCAmPSB+KENOMjNYWF9QS1RfT1VUUFVUX0NUTF9FU19QKTsKKyNlbHNlCisJCXJlZ192YWwgfD0gKENOMjNYWF9QS1RfT1VUUFVUX0NUTF9FU19QKTsKKyNlbmRpZgorCQkvKiBObyBSZWxheGVkIE9yZGVyaW5nLCBObyBTbm9vcCwgNjQtYml0IEJ5dGUgc3dhcAorCQkgKiBmb3IgT3V0cHV0IFF1ZXVlIERhdGEKKwkJICogcmVzZXQgUk9SLCBOU1IKKwkJICovCisJCXJlZ192YWwgJj0gfihDTjIzWFhfUEtUX09VVFBVVF9DVExfUk9SKTsKKwkJcmVnX3ZhbCAmPSB+KENOMjNYWF9QS1RfT1VUUFVUX0NUTF9OU1IpOworCQkvKiBzZXQgdGhlIEVTIGJpdCAqLworCQlyZWdfdmFsIHw9IChDTjIzWFhfUEtUX09VVFBVVF9DVExfRVMpOworCisJCS8qIHdyaXRlIGFsbCB0aGUgc2VsZWN0ZWQgc2V0dGluZ3MgKi8KKwkJb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENOMjNYWF9TTElfT1FfUEtUX0NPTlRST0wocV9ubyksIHJlZ192YWwpOworCisJCS8qIEVuYWJsaW5nIHRoZXNlIGludGVycnVwdCBpbiBvY3QtPmZuX2xpc3QuZW5hYmxlX2ludGVycnVwdCgpCisJCSAqIHJvdXRpbmUgd2hpY2ggY2FsbGVkIGFmdGVyIElPUSBpbml0LgorCQkgKiBTZXQgdXAgaW50ZXJydXB0IHBhY2tldCBhbmQgdGltZSB0aHJlc2hvbGRzCisJCSAqIGZvciBhbGwgdGhlIE9RcworCQkgKi8KKwkJdGltZV90aHJlc2hvbGQgPSBjbjIzeHhfcGZfZ2V0X29xX3RpY2tzKAorCQkgICAgb2N0LCAodTMyKUNGR19HRVRfT1FfSU5UUl9USU1FKGNuMjN4eC0+Y29uZikpOworCisJCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsIENOMjNYWF9TTElfT1FfUEtUX0lOVF9MRVZFTFMocV9ubyksCisJCQkJICAgKENGR19HRVRfT1FfSU5UUl9QS1QoY24yM3h4LT5jb25mKSB8CisJCQkJICAgICh0aW1lX3RocmVzaG9sZCA8PCAzMikpKTsKKwl9CisKKwkvKiogU2V0dGluZyB0aGUgd2F0ZXIgbWFyayBsZXZlbCBmb3IgcGtvIGJhY2sgcHJlc3N1cmUgKiovCisJd3JpdGVxKDB4NDAsICh1OCAqKW9jdC0+bW1pb1swXS5od19hZGRyICsgQ04yM1hYX1NMSV9PUV9XTUFSSyk7CisKKwkvKiogRGlzYWJsaW5nIHNldHRpbmcgT1FzIGluIHJlc2V0IHdoZW4gcmluZyBoYXMgbm8gZG9yZWJlbGxzCisJICAqIGVuYWJsaW5nIHRoaXMgd2lsbCBjYXVzZSBvZiBoZWFkIG9mIGxpbmUgYmxvY2tpbmcKKwkgICovCisJLyogRG8gaXQgb25seSBmb3IgcGFzczEuMS4gYW5kIHBhc3MxLjIgKi8KKwlpZiAoKG9jdC0+cmV2X2lkID09IE9DVEVPTl9DTjIzWFhfUkVWXzFfMCkgfHwKKwkgICAgKG9jdC0+cmV2X2lkID09IE9DVEVPTl9DTjIzWFhfUkVWXzFfMSkpCisJCXdyaXRlcShyZWFkcSgodTggKilvY3QtPm1taW9bMF0uaHdfYWRkciArCisJCQkJICAgICBDTjIzWFhfU0xJX0dCTF9DT05UUk9MKSB8IDB4MiwKKwkJICAgICAgICh1OCAqKW9jdC0+bW1pb1swXS5od19hZGRyICsgQ04yM1hYX1NMSV9HQkxfQ09OVFJPTCk7CisKKwkvKiogRW5hYmxlIGNoYW5uZWwtbGV2ZWwgYmFja3ByZXNzdXJlICovCisJaWYgKG9jdC0+cGZfbnVtKQorCQl3cml0ZXEoMHhmZmZmZmZmZmZmZmZmZmZmVUxMLAorCQkgICAgICAgKHU4ICopb2N0LT5tbWlvWzBdLmh3X2FkZHIgKyBDTjIzWFhfU0xJX09VVF9CUF9FTjJfVzFTKTsKKwllbHNlCisJCXdyaXRlcSgweGZmZmZmZmZmZmZmZmZmZmZVTEwsCisJCSAgICAgICAodTggKilvY3QtPm1taW9bMF0uaHdfYWRkciArIENOMjNYWF9TTElfT1VUX0JQX0VOX1cxUyk7Cit9CisKK3N0YXRpYyBpbnQgY24yM3h4X3NldHVwX3BmX2RldmljZV9yZWdzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJY24yM3h4X2VuYWJsZV9lcnJvcl9yZXBvcnRpbmcob2N0KTsKKworCS8qIHByb2dyYW0gdGhlIE1BQygwLi4zKV9SSU5GTyBiZWZvcmUgc2V0dGluZyB1cCBpbnB1dC9vdXRwdXQgcmVncyAqLworCWNuMjN4eF9zZXR1cF9nbG9iYWxfbWFjX3JlZ3Mob2N0KTsKKworCWlmIChjbjIzeHhfcGZfc2V0dXBfZ2xvYmFsX2lucHV0X3JlZ3Mob2N0KSkKKwkJcmV0dXJuIC0xOworCisJY24yM3h4X3BmX3NldHVwX2dsb2JhbF9vdXRwdXRfcmVncyhvY3QpOworCisJLyogRGVmYXVsdCBlcnJvciB0aW1lb3V0IHZhbHVlIHNob3VsZCBiZSAweDIwMDAwMCB0byBhdm9pZCBob3N0IGhhbmcKKwkgKiB3aGVuIHJlYWRzIGludmFsaWQgcmVnaXN0ZXIKKwkgKi8KKwlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LCBDTjIzWFhfU0xJX1dJTkRPV19DVEwsCisJCQkgICBDTjIzWFhfU0xJX1dJTkRPV19DVExfREVGQVVMVCk7CisKKwkvKiBzZXQgU0xJX1BLVF9JTl9KQUJCRVIgdG8gaGFuZGxlIGxhcmdlIFZYTEFOIHBhY2tldHMgKi8KKwlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LCBDTjIzWFhfU0xJX1BLVF9JTl9KQUJCRVIsIENOMjNYWF9JTlBVVF9KQUJCRVIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbjIzeHhfc2V0dXBfaXFfcmVncyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB1MzIgaXFfbm8pCit7CisJc3RydWN0IG9jdGVvbl9pbnN0cl9xdWV1ZSAqaXEgPSBvY3QtPmluc3RyX3F1ZXVlW2lxX25vXTsKKwl1NjQgcGt0X2luX2RvbmU7CisKKwlpcV9ubyArPSBvY3QtPnNyaW92X2luZm8ucGZfc3JuOworCisJLyogV3JpdGUgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBxdWV1ZSdzIHJpbmcgYW5kIGl0cyBzaXplICAqLworCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsIENOMjNYWF9TTElfSVFfQkFTRV9BRERSNjQoaXFfbm8pLAorCQkJICAgaXEtPmJhc2VfYWRkcl9kbWEpOworCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjIzWFhfU0xJX0lRX1NJWkUoaXFfbm8pLCBpcS0+bWF4X2NvdW50KTsKKworCS8qIFJlbWVtYmVyIHRoZSBkb29yYmVsbCAmIGluc3RydWN0aW9uIGNvdW50IHJlZ2lzdGVyIGFkZHIKKwkgKiBmb3IgdGhpcyBxdWV1ZQorCSAqLworCWlxLT5kb29yYmVsbF9yZWcgPQorCSAgICAodTggKilvY3QtPm1taW9bMF0uaHdfYWRkciArIENOMjNYWF9TTElfSVFfRE9PUkJFTEwoaXFfbm8pOworCWlxLT5pbnN0X2NudF9yZWcgPQorCSAgICAodTggKilvY3QtPm1taW9bMF0uaHdfYWRkciArIENOMjNYWF9TTElfSVFfSU5TVFJfQ09VTlQ2NChpcV9ubyk7CisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJJbnN0UVslZF06ZGJlbGwgcmVnIEAgMHglcCBpbnN0Y250X3JlZyBAIDB4JXBcbiIsCisJCWlxX25vLCBpcS0+ZG9vcmJlbGxfcmVnLCBpcS0+aW5zdF9jbnRfcmVnKTsKKworCS8qIFN0b3JlIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIGNvdW50ZXIgKHVzZWQgaW4gZmx1c2hfaXEKKwkgKiBjYWxjdWxhdGlvbikKKwkgKi8KKwlwa3RfaW5fZG9uZSA9IHJlYWRxKGlxLT5pbnN0X2NudF9yZWcpOworCisJaWYgKG9jdC0+bXNpeF9vbikgeworCQkvKiBTZXQgQ0lOVF9FTkIgdG8gZW5hYmxlIElRIGludGVycnVwdCAgICovCisJCXdyaXRlcSgocGt0X2luX2RvbmUgfCBDTjIzWFhfSU5UUl9DSU5UX0VOQiksCisJCSAgICAgICBpcS0+aW5zdF9jbnRfcmVnKTsKKwl9IGVsc2UgeworCQkvKiBDbGVhciB0aGUgY291bnQgYnkgd3JpdGluZyBiYWNrIHdoYXQgd2UgcmVhZCwgYnV0IGRvbid0CisJCSAqIGVuYWJsZSBpbnRlcnJ1cHRzCisJCSAqLworCQl3cml0ZXEocGt0X2luX2RvbmUsIGlxLT5pbnN0X2NudF9yZWcpOworCX0KKworCWlxLT5yZXNldF9pbnN0cl9jbnQgPSAwOworfQorCitzdGF0aWMgdm9pZCBjbjIzeHhfc2V0dXBfb3FfcmVncyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB1MzIgb3Ffbm8pCit7CisJdTMyIHJlZ192YWw7CisJc3RydWN0IG9jdGVvbl9kcm9xICpkcm9xID0gb2N0LT5kcm9xW29xX25vXTsKKwlzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqY24yM3h4ID0gKHN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICopb2N0LT5jaGlwOworCXU2NCB0aW1lX3RocmVzaG9sZDsKKwl1NjQgY250X3RocmVzaG9sZDsKKworCW9xX25vICs9IG9jdC0+c3Jpb3ZfaW5mby5wZl9zcm47CisKKwlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LCBDTjIzWFhfU0xJX09RX0JBU0VfQUREUjY0KG9xX25vKSwKKwkJCSAgIGRyb3EtPmRlc2NfcmluZ19kbWEpOworCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjIzWFhfU0xJX09RX1NJWkUob3Ffbm8pLCBkcm9xLT5tYXhfY291bnQpOworCisJb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENOMjNYWF9TTElfT1FfQlVGRl9JTkZPX1NJWkUob3Ffbm8pLAorCQkJIChkcm9xLT5idWZmZXJfc2l6ZSB8IChPQ1RfUkhfU0laRSA8PCAxNikpKTsKKworCS8qIEdldCB0aGUgbWFwcGVkIGFkZHJlc3Mgb2YgdGhlIHBrdF9zZW50IGFuZCBwa3RzX2NyZWRpdCByZWdzICovCisJZHJvcS0+cGt0c19zZW50X3JlZyA9CisJICAgICh1OCAqKW9jdC0+bW1pb1swXS5od19hZGRyICsgQ04yM1hYX1NMSV9PUV9QS1RTX1NFTlQob3Ffbm8pOworCWRyb3EtPnBrdHNfY3JlZGl0X3JlZyA9CisJICAgICh1OCAqKW9jdC0+bW1pb1swXS5od19hZGRyICsgQ04yM1hYX1NMSV9PUV9QS1RTX0NSRURJVChvcV9ubyk7CisKKwlpZiAoIW9jdC0+bXNpeF9vbikgeworCQkvKiBFbmFibGUgdGhpcyBvdXRwdXQgcXVldWUgdG8gZ2VuZXJhdGUgUGFja2V0IFRpbWVyIEludGVycnVwdAorCQkgKi8KKwkJcmVnX3ZhbCA9CisJCSAgICBvY3Rlb25fcmVhZF9jc3Iob2N0LCBDTjIzWFhfU0xJX09RX1BLVF9DT05UUk9MKG9xX25vKSk7CisJCXJlZ192YWwgfD0gQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX1RFTkI7CisJCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjIzWFhfU0xJX09RX1BLVF9DT05UUk9MKG9xX25vKSwKKwkJCQkgcmVnX3ZhbCk7CisKKwkJLyogRW5hYmxlIHRoaXMgb3V0cHV0IHF1ZXVlIHRvIGdlbmVyYXRlIFBhY2tldCBDb3VudCBJbnRlcnJ1cHQKKwkJICovCisJCXJlZ192YWwgPQorCQkgICAgb2N0ZW9uX3JlYWRfY3NyKG9jdCwgQ04yM1hYX1NMSV9PUV9QS1RfQ09OVFJPTChvcV9ubykpOworCQlyZWdfdmFsIHw9IENOMjNYWF9QS1RfT1VUUFVUX0NUTF9DRU5COworCQlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ04yM1hYX1NMSV9PUV9QS1RfQ09OVFJPTChvcV9ubyksCisJCQkJIHJlZ192YWwpOworCX0gZWxzZSB7CisJCXRpbWVfdGhyZXNob2xkID0gY24yM3h4X3BmX2dldF9vcV90aWNrcygKKwkJICAgIG9jdCwgKHUzMilDRkdfR0VUX09RX0lOVFJfVElNRShjbjIzeHgtPmNvbmYpKTsKKwkJY250X3RocmVzaG9sZCA9ICh1MzIpQ0ZHX0dFVF9PUV9JTlRSX1BLVChjbjIzeHgtPmNvbmYpOworCisJCW9jdGVvbl93cml0ZV9jc3I2NCgKKwkJICAgIG9jdCwgQ04yM1hYX1NMSV9PUV9QS1RfSU5UX0xFVkVMUyhvcV9ubyksCisJCSAgICAoKHRpbWVfdGhyZXNob2xkIDw8IDMyIHwgY250X3RocmVzaG9sZCkpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY24yM3h4X2VuYWJsZV9pb19xdWV1ZXMoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwl1NjQgcmVnX3ZhbDsKKwl1MzIgc3JuLCBlcm4sIHFfbm87CisJdTMyIGxvb3AgPSAxMDAwOworCisJc3JuID0gb2N0LT5zcmlvdl9pbmZvLnBmX3NybjsKKwllcm4gPSBzcm4gKyBvY3QtPm51bV9pcXM7CisKKwlmb3IgKHFfbm8gPSBzcm47IHFfbm8gPCBlcm47IHFfbm8rKykgeworCQkvKiBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgSVEgSVNfNjRCIGJpdCAqLworCQlpZiAob2N0LT5pb19xbWFzay5pcTY0QiAmIEJJVF9VTEwocV9ubyAtIHNybikpIHsKKwkJCXJlZ192YWwgPSBvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCSAgICBvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSk7CisJCQlyZWdfdmFsID0gcmVnX3ZhbCB8IENOMjNYWF9QS1RfSU5QVVRfQ1RMX0lTXzY0QjsKKwkJCW9jdGVvbl93cml0ZV9jc3I2NCgKKwkJCSAgICBvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSwgcmVnX3ZhbCk7CisJCX0KKworCQkvKiBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgSVEgRU5CIGJpdCAqLworCQlpZiAob2N0LT5pb19xbWFzay5pcSAmIEJJVF9VTEwocV9ubyAtIHNybikpIHsKKwkJCS8qIElPUXMgYXJlIGluIHJlc2V0IGJ5IGRlZmF1bHQgaW4gUEVNMiBtb2RlLAorCQkJICogY2xlYXJpbmcgcmVzZXQgYml0CisJCQkgKi8KKwkJCXJlZ192YWwgPSBvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCSAgICBvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSk7CisKKwkJCWlmIChyZWdfdmFsICYgQ04yM1hYX1BLVF9JTlBVVF9DVExfUlNUKSB7CisJCQkJd2hpbGUgKChyZWdfdmFsICYgQ04yM1hYX1BLVF9JTlBVVF9DVExfUlNUKSAmJgorCQkJCSAgICAgICAhKHJlZ192YWwgJgorCQkJCQkgQ04yM1hYX1BLVF9JTlBVVF9DVExfUVVJRVQpICYmCisJCQkJICAgICAgIGxvb3AtLSkgeworCQkJCQlyZWdfdmFsID0gb2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkJCSAgICBvY3QsCisJCQkJCSAgICBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubykpOworCQkJCX0KKwkJCQlpZiAoIWxvb3ApIHsKKwkJCQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsCisJCQkJCQkiY2xlYXJpbmcgdGhlIHJlc2V0IHJlZyBmYWlsZWQgb3Igc2V0dGluZyB0aGUgcXVpZXQgcmVnIGZhaWxlZCBmb3IgcW5vOiAldVxuIiwKKwkJCQkJCXFfbm8pOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXJlZ192YWwgPSByZWdfdmFsICYgfkNOMjNYWF9QS1RfSU5QVVRfQ1RMX1JTVDsKKwkJCQlvY3Rlb25fd3JpdGVfY3NyNjQoCisJCQkJICAgIG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pLAorCQkJCSAgICByZWdfdmFsKTsKKworCQkJCXJlZ192YWwgPSBvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCQkgICAgb2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubykpOworCQkJCWlmIChyZWdfdmFsICYgQ04yM1hYX1BLVF9JTlBVVF9DVExfUlNUKSB7CisJCQkJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LAorCQkJCQkJImNsZWFyaW5nIHRoZSByZXNldCBmYWlsZWQgZm9yIHFubzogJXVcbiIsCisJCQkJCQlxX25vKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0KKwkJCXJlZ192YWwgPSBvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCSAgICBvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSk7CisJCQlyZWdfdmFsID0gcmVnX3ZhbCB8IENOMjNYWF9QS1RfSU5QVVRfQ1RMX1JJTkdfRU5COworCQkJb2N0ZW9uX3dyaXRlX2NzcjY0KAorCQkJICAgIG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pLCByZWdfdmFsKTsKKwkJfQorCX0KKwlmb3IgKHFfbm8gPSBzcm47IHFfbm8gPCBlcm47IHFfbm8rKykgeworCQl1MzIgcmVnX3ZhbDsKKwkJLyogc2V0IHRoZSBjb3JyZXNwb25kaW5nIE9RIEVOQiBiaXQgKi8KKwkJaWYgKG9jdC0+aW9fcW1hc2sub3EgJiBCSVRfVUxMKHFfbm8gLSBzcm4pKSB7CisJCQlyZWdfdmFsID0gb2N0ZW9uX3JlYWRfY3NyKAorCQkJICAgIG9jdCwgQ04yM1hYX1NMSV9PUV9QS1RfQ09OVFJPTChxX25vKSk7CisJCQlyZWdfdmFsID0gcmVnX3ZhbCB8IENOMjNYWF9QS1RfT1VUUFVUX0NUTF9SSU5HX0VOQjsKKwkJCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjIzWFhfU0xJX09RX1BLVF9DT05UUk9MKHFfbm8pLAorCQkJCQkgcmVnX3ZhbCk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNuMjN4eF9kaXNhYmxlX2lvX3F1ZXVlcyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCWludCBxX25vLCBsb29wOworCXU2NCBkNjQ7CisJdTMyIGQzMjsKKwl1MzIgc3JuLCBlcm47CisKKwlzcm4gPSBvY3QtPnNyaW92X2luZm8ucGZfc3JuOworCWVybiA9IHNybiArIG9jdC0+bnVtX2lxczsKKworCS8qKiogRGlzYWJsZSBJbnB1dCBRdWV1ZXMuICoqKi8KKwlmb3IgKHFfbm8gPSBzcm47IHFfbm8gPCBlcm47IHFfbm8rKykgeworCQlsb29wID0gSFo7CisKKwkJLyogc3RhcnQgdGhlIFJlc2V0IGZvciBhIHBhcnRpY3VsYXIgcmluZyAqLworCQlXUklURV9PTkNFKGQ2NCwgb2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkgICBvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSkpOworCQlXUklURV9PTkNFKGQ2NCwgUkVBRF9PTkNFKGQ2NCkgJgorCQkJCQkofihDTjIzWFhfUEtUX0lOUFVUX0NUTF9SSU5HX0VOQikpKTsKKwkJV1JJVEVfT05DRShkNjQsIFJFQURfT05DRShkNjQpIHwgQ04yM1hYX1BLVF9JTlBVVF9DVExfUlNUKTsKKwkJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pLAorCQkJCSAgIFJFQURfT05DRShkNjQpKTsKKworCQkvKiBXYWl0IHVudGlsIGhhcmR3YXJlIGluZGljYXRlcyB0aGF0IHRoZSBwYXJ0aWN1bGFyIElRCisJCSAqIGlzIG91dCBvZiByZXNldC4KKwkJICovCisJCVdSSVRFX09OQ0UoZDY0LCBvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCQkJb2N0LCBDTjIzWFhfU0xJX1BLVF9JT1FfUklOR19SU1QpKTsKKwkJd2hpbGUgKCEoUkVBRF9PTkNFKGQ2NCkgJiBCSVRfVUxMKHFfbm8pKSAmJiBsb29wLS0pIHsKKwkJCVdSSVRFX09OQ0UoZDY0LCBvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCQkJb2N0LCBDTjIzWFhfU0xJX1BLVF9JT1FfUklOR19SU1QpKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOworCQl9CisKKwkJLyogUmVzZXQgdGhlIGRvb3JiZWxsIHJlZ2lzdGVyIGZvciB0aGlzIElucHV0IFF1ZXVlLiAqLworCQlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ04yM1hYX1NMSV9JUV9ET09SQkVMTChxX25vKSwgMHhGRkZGRkZGRik7CisJCXdoaWxlIChvY3Rlb25fcmVhZF9jc3I2NChvY3QsIENOMjNYWF9TTElfSVFfRE9PUkJFTEwocV9ubykpICYmCisJCSAgICAgICBsb29wLS0pIHsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOworCQl9CisJfQorCisJLyoqKiBEaXNhYmxlIE91dHB1dCBRdWV1ZXMuICoqKi8KKwlmb3IgKHFfbm8gPSBzcm47IHFfbm8gPCBlcm47IHFfbm8rKykgeworCQlsb29wID0gSFo7CisKKwkJLyogV2FpdCB1bnRpbCBoYXJkd2FyZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFydGljdWxhciBJUQorCQkgKiBpcyBvdXQgb2YgcmVzZXQuSXQgZ2l2ZW4gdGhhdCBTTElfUEtUX1JJTkdfUlNUIGlzCisJCSAqIGNvbW1vbiBmb3IgYm90aCBJUXMgYW5kIE9RcworCQkgKi8KKwkJV1JJVEVfT05DRShkNjQsIG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJCQlvY3QsIENOMjNYWF9TTElfUEtUX0lPUV9SSU5HX1JTVCkpOworCQl3aGlsZSAoIShSRUFEX09OQ0UoZDY0KSAmIEJJVF9VTEwocV9ubykpICYmIGxvb3AtLSkgeworCQkJV1JJVEVfT05DRShkNjQsIG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJCQlvY3QsIENOMjNYWF9TTElfUEtUX0lPUV9SSU5HX1JTVCkpOworCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJCX0KKworCQkvKiBSZXNldCB0aGUgZG9vcmJlbGwgcmVnaXN0ZXIgZm9yIHRoaXMgT3V0cHV0IFF1ZXVlLiAqLworCQlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ04yM1hYX1NMSV9PUV9QS1RTX0NSRURJVChxX25vKSwKKwkJCQkgMHhGRkZGRkZGRik7CisJCXdoaWxlIChvY3Rlb25fcmVhZF9jc3I2NChvY3QsCisJCQkJCSBDTjIzWFhfU0xJX09RX1BLVFNfQ1JFRElUKHFfbm8pKSAmJgorCQkgICAgICAgbG9vcC0tKSB7CisJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKwkJfQorCisJCS8qIGNsZWFyIHRoZSBTTElfUEtUKDAuLjYzKV9DTlRTW0NOVF0gcmVnIHZhbHVlICovCisJCVdSSVRFX09OQ0UoZDMyLCBvY3Rlb25fcmVhZF9jc3IoCisJCQkJCW9jdCwgQ04yM1hYX1NMSV9PUV9QS1RTX1NFTlQocV9ubykpKTsKKwkJb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENOMjNYWF9TTElfT1FfUEtUU19TRU5UKHFfbm8pLAorCQkJCSBSRUFEX09OQ0UoZDMyKSk7CisJfQorfQorCitzdGF0aWMgdTY0IGNuMjN4eF9wZl9tc2l4X2ludGVycnVwdF9oYW5kbGVyKHZvaWQgKmRldikKK3sKKwlzdHJ1Y3Qgb2N0ZW9uX2lvcV92ZWN0b3IgKmlvcV92ZWN0b3IgPSAoc3RydWN0IG9jdGVvbl9pb3FfdmVjdG9yICopZGV2OworCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSBpb3FfdmVjdG9yLT5vY3RfZGV2OworCXU2NCBwa3RzX3NlbnQ7CisJdTY0IHJldCA9IDA7CisJc3RydWN0IG9jdGVvbl9kcm9xICpkcm9xID0gb2N0LT5kcm9xW2lvcV92ZWN0b3ItPmRyb3FfaW5kZXhdOworCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJJbiAlcyBvY3Rlb25fZGV2IEAgJXBcbiIsIF9fZnVuY19fLCBvY3QpOworCisJaWYgKCFkcm9xKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiMjNYWCBicmluZ3VwIEZJWE1FOiBvY3QgcGZudW06JWQgaW9xX3ZlY3Rvci0+aW9xX251bSA6JWQgZHJvcSBpcyBOVUxMXG4iLAorCQkJb2N0LT5wZl9udW0sIGlvcV92ZWN0b3ItPmlvcV9udW0pOworCQlyZXR1cm4gMDsKKwl9CisKKwlwa3RzX3NlbnQgPSByZWFkcShkcm9xLT5wa3RzX3NlbnRfcmVnKTsKKworCS8qIElmIG91ciBkZXZpY2UgaGFzIGludGVycnVwdGVkLCB0aGVuIHByb2NlZWQuIEFsc28gY2hlY2sKKwkgKiBmb3IgYWxsIGYncyBpZiBpbnRlcnJ1cHQgd2FzIHRyaWdnZXJlZCBvbiBhbiBlcnJvcgorCSAqIGFuZCB0aGUgUENJIHJlYWQgZmFpbHMuCisJICovCisJaWYgKCFwa3RzX3NlbnQgfHwgKHBrdHNfc2VudCA9PSAweEZGRkZGRkZGRkZGRkZGRkZVTEwpKQorCQlyZXR1cm4gcmV0OworCisJLyogV3JpdGUgY291bnQgcmVnIGluIHNsaV9wa3RfY250cyB0byBjbGVhciB0aGVzZSBpbnQuKi8KKwlpZiAoKHBrdHNfc2VudCAmIENOMjNYWF9JTlRSX1BPX0lOVCkgfHwKKwkgICAgKHBrdHNfc2VudCAmIENOMjNYWF9JTlRSX1BJX0lOVCkpIHsKKwkJaWYgKHBrdHNfc2VudCAmIENOMjNYWF9JTlRSX1BPX0lOVCkKKwkJCXJldCB8PSBNU0lYX1BPX0lOVDsKKwl9CisKKwlpZiAocGt0c19zZW50ICYgQ04yM1hYX0lOVFJfUElfSU5UKQorCQkvKiBXZSB3aWxsIGNsZWFyIHRoZSBjb3VudCB3aGVuIHdlIHVwZGF0ZSB0aGUgcmVhZF9pbmRleC4gKi8KKwkJcmV0IHw9IE1TSVhfUElfSU5UOworCisJLyogTmV2ZXIgbmVlZCB0byBoYW5kbGUgbXNpeCBtYm94IGludHIgZm9yIHBmLiBUaGV5IGFycml2ZSBvbiB0aGUgbGFzdAorCSAqIG1zaXgKKwkgKi8KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgY24yM3h4X2ludGVycnVwdF9oYW5kbGVyKHZvaWQgKmRldikKK3sKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gKHN0cnVjdCBvY3Rlb25fZGV2aWNlICopZGV2OworCXN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICpjbjIzeHggPSAoc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKilvY3QtPmNoaXA7CisJdTY0IGludHI2NDsKKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiSW4gJXMgb2N0ZW9uX2RldiBAICVwXG4iLCBfX2Z1bmNfXywgb2N0KTsKKwlpbnRyNjQgPSByZWFkcShjbjIzeHgtPmludHJfc3VtX3JlZzY0KTsKKworCW9jdC0+aW50X3N0YXR1cyA9IDA7CisKKwlpZiAoaW50cjY0ICYgQ04yM1hYX0lOVFJfRVJSKQorCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIk9DVEVPTlslZF06IEVycm9yIEludHI6IDB4JTAxNmxseFxuIiwKKwkJCW9jdC0+b2N0ZW9uX2lkLCBDVk1fQ0FTVDY0KGludHI2NCkpOworCisJaWYgKG9jdC0+bXNpeF9vbiAhPSBMSU9fRkxBR19NU0lYX0VOQUJMRUQpIHsKKwkJaWYgKGludHI2NCAmIENOMjNYWF9JTlRSX1BLVF9EQVRBKQorCQkJb2N0LT5pbnRfc3RhdHVzIHw9IE9DVF9ERVZfSU5UUl9QS1RfREFUQTsKKwl9CisKKwlpZiAoaW50cjY0ICYgKENOMjNYWF9JTlRSX0RNQTBfRk9SQ0UpKQorCQlvY3QtPmludF9zdGF0dXMgfD0gT0NUX0RFVl9JTlRSX0RNQTBfRk9SQ0U7CisJaWYgKGludHI2NCAmIChDTjIzWFhfSU5UUl9ETUExX0ZPUkNFKSkKKwkJb2N0LT5pbnRfc3RhdHVzIHw9IE9DVF9ERVZfSU5UUl9ETUExX0ZPUkNFOworCisJLyogQ2xlYXIgdGhlIGN1cnJlbnQgaW50ZXJydXB0cyAqLworCXdyaXRlcShpbnRyNjQsIGNuMjN4eC0+aW50cl9zdW1fcmVnNjQpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBjbjIzeHhfYmFyMV9pZHhfc2V0dXAoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdTY0IGNvcmVfYWRkciwKKwkJCQkgIHUzMiBpZHgsIGludCB2YWxpZCkKK3sKKwl1NjQgYmFyMTsKKwl1NjQgcmVnX2FkcjsKKworCWlmICghdmFsaWQpIHsKKwkJcmVnX2FkciA9IGxpb19wY2lfcmVhZHEoCisJCQlvY3QsIENOMjNYWF9QRU1fQkFSMV9JTkRFWF9SRUcob2N0LT5wY2llX3BvcnQsIGlkeCkpOworCQlXUklURV9PTkNFKGJhcjEsIHJlZ19hZHIpOworCQlsaW9fcGNpX3dyaXRlcShvY3QsIChSRUFEX09OQ0UoYmFyMSkgJiAweEZGRkZGRkZFVUxMKSwKKwkJCSAgICAgICBDTjIzWFhfUEVNX0JBUjFfSU5ERVhfUkVHKG9jdC0+cGNpZV9wb3J0LCBpZHgpKTsKKwkJcmVnX2FkciA9IGxpb19wY2lfcmVhZHEoCisJCQlvY3QsIENOMjNYWF9QRU1fQkFSMV9JTkRFWF9SRUcob2N0LT5wY2llX3BvcnQsIGlkeCkpOworCQlXUklURV9PTkNFKGJhcjEsIHJlZ19hZHIpOworCQlyZXR1cm47CisJfQorCisJLyogIFRoZSBQRU0oMC4uMylfQkFSMV9JTkRFWCgwLi4xNSlbQUREUl9JRFhdPDIzOjQ+IHN0b3JlcworCSAqICBiaXRzIDw0MToyMj4gb2YgdGhlIENvcmUgQWRkcgorCSAqLworCWxpb19wY2lfd3JpdGVxKG9jdCwgKCgoY29yZV9hZGRyID4+IDIyKSA8PCA0KSB8IFBDSV9CQVIxX01BU0spLAorCQkgICAgICAgQ04yM1hYX1BFTV9CQVIxX0lOREVYX1JFRyhvY3QtPnBjaWVfcG9ydCwgaWR4KSk7CisKKwlXUklURV9PTkNFKGJhcjEsIGxpb19wY2lfcmVhZHEoCisJCSAgIG9jdCwgQ04yM1hYX1BFTV9CQVIxX0lOREVYX1JFRyhvY3QtPnBjaWVfcG9ydCwgaWR4KSkpOworfQorCitzdGF0aWMgdm9pZCBjbjIzeHhfYmFyMV9pZHhfd3JpdGUoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdTMyIGlkeCwgdTMyIG1hc2spCit7CisJbGlvX3BjaV93cml0ZXEob2N0LCBtYXNrLAorCQkgICAgICAgQ04yM1hYX1BFTV9CQVIxX0lOREVYX1JFRyhvY3QtPnBjaWVfcG9ydCwgaWR4KSk7Cit9CisKK3N0YXRpYyB1MzIgY24yM3h4X2JhcjFfaWR4X3JlYWQoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdTMyIGlkeCkKK3sKKwlyZXR1cm4gKHUzMilsaW9fcGNpX3JlYWRxKAorCSAgICBvY3QsIENOMjNYWF9QRU1fQkFSMV9JTkRFWF9SRUcob2N0LT5wY2llX3BvcnQsIGlkeCkpOworfQorCisvKiBhbHdheXMgY2FsbCB3aXRoIGxvY2sgaGVsZCAqLworc3RhdGljIHUzMiBjbjIzeHhfdXBkYXRlX3JlYWRfaW5kZXgoc3RydWN0IG9jdGVvbl9pbnN0cl9xdWV1ZSAqaXEpCit7CisJdTMyIG5ld19pZHg7CisJdTMyIGxhc3RfZG9uZTsKKwl1MzIgcGt0X2luX2RvbmUgPSByZWFkbChpcS0+aW5zdF9jbnRfcmVnKTsKKworCWxhc3RfZG9uZSA9IHBrdF9pbl9kb25lIC0gaXEtPnBrdF9pbl9kb25lOworCWlxLT5wa3RfaW5fZG9uZSA9IHBrdF9pbl9kb25lOworCisJLyogTW9kdWxvIG9mIHRoZSBuZXcgaW5kZXggd2l0aCB0aGUgSVEgc2l6ZSB3aWxsIGdpdmUgdXMKKwkgKiB0aGUgbmV3IGluZGV4LiAgVGhlIGlxLT5yZXNldF9pbnN0cl9jbnQgaXMgYWx3YXlzIHplcm8gZm9yCisJICogY24yM3h4LCBzbyBubyBleHRyYSBhZGp1c3RtZW50cyBhcmUgbmVlZGVkLgorCSAqLworCW5ld19pZHggPSAoaXEtPm9jdGVvbl9yZWFkX2luZGV4ICsKKwkJICAgKHUzMikobGFzdF9kb25lICYgQ04yM1hYX1BLVF9JTl9ET05FX0NOVF9NQVNLKSkgJQorCQkgIGlxLT5tYXhfY291bnQ7CisKKwlyZXR1cm4gbmV3X2lkeDsKK30KKworc3RhdGljIHZvaWQgY24yM3h4X2VuYWJsZV9wZl9pbnRlcnJ1cHQoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdTggaW50cl9mbGFnKQoreworCXN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICpjbjIzeHggPSAoc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKilvY3QtPmNoaXA7CisJdTY0IGludHJfdmFsID0gMDsKKworCS8qICBEaXZpZGUgdGhlIHNpbmdsZSB3cml0ZSB0byBtdWx0aXBsZSB3cml0ZXMgYmFzZWQgb24gdGhlIGZsYWcuICovCisJLyogRW5hYmxlIEludGVycnVwdCAqLworCWlmIChpbnRyX2ZsYWcgPT0gT0NURU9OX0FMTF9JTlRSKSB7CisJCXdyaXRlcShjbjIzeHgtPmludHJfbWFzazY0LCBjbjIzeHgtPmludHJfZW5iX3JlZzY0KTsKKwl9IGVsc2UgaWYgKGludHJfZmxhZyAmIE9DVEVPTl9PVVRQVVRfSU5UUikgeworCQlpbnRyX3ZhbCA9IHJlYWRxKGNuMjN4eC0+aW50cl9lbmJfcmVnNjQpOworCQlpbnRyX3ZhbCB8PSBDTjIzWFhfSU5UUl9QS1RfREFUQTsKKwkJd3JpdGVxKGludHJfdmFsLCBjbjIzeHgtPmludHJfZW5iX3JlZzY0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNuMjN4eF9kaXNhYmxlX3BmX2ludGVycnVwdChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB1OCBpbnRyX2ZsYWcpCit7CisJc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKmNuMjN4eCA9IChzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqKW9jdC0+Y2hpcDsKKwl1NjQgaW50cl92YWwgPSAwOworCisJLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCisJaWYgKGludHJfZmxhZyA9PSBPQ1RFT05fQUxMX0lOVFIpIHsKKwkJd3JpdGVxKDAsIGNuMjN4eC0+aW50cl9lbmJfcmVnNjQpOworCX0gZWxzZSBpZiAoaW50cl9mbGFnICYgT0NURU9OX09VVFBVVF9JTlRSKSB7CisJCWludHJfdmFsID0gcmVhZHEoY24yM3h4LT5pbnRyX2VuYl9yZWc2NCk7CisJCWludHJfdmFsICY9IH5DTjIzWFhfSU5UUl9QS1RfREFUQTsKKwkJd3JpdGVxKGludHJfdmFsLCBjbjIzeHgtPmludHJfZW5iX3JlZzY0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNuMjN4eF9nZXRfcGNpZV9xbG1wb3J0KHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJb2N0LT5wY2llX3BvcnQgPSAob2N0ZW9uX3JlYWRfY3NyKG9jdCwgQ04yM1hYX1NMSV9NQUNfTlVNQkVSKSkgJiAweGZmOworCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJPQ1RFT046IENOMjN4eCB1c2VzIFBDSUUgUG9ydCAlZFxuIiwKKwkJb2N0LT5wY2llX3BvcnQpOworfQorCitzdGF0aWMgdm9pZCBjbjIzeHhfZ2V0X3BmX251bShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCXUzMiBmZGxfYml0ID0gMDsKKworCS8qKiBSZWFkIEZ1bmN0aW9uIERlcGVuZGVuY3kgTGluayByZWcgdG8gZ2V0IHRoZSBmdW5jdGlvbiBudW1iZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQob2N0LT5wY2lfZGV2LCBDTjIzWFhfUENJRV9TUklPVl9GREwsICZmZGxfYml0KTsKKwlvY3QtPnBmX251bSA9ICgoZmRsX2JpdCA+PiBDTjIzWFhfUENJRV9TUklPVl9GRExfQklUX1BPUykgJgorCQkgICAgICAgQ04yM1hYX1BDSUVfU1JJT1ZfRkRMX01BU0spOworfQorCitzdGF0aWMgdm9pZCBjbjIzeHhfc2V0dXBfcmVnX2FkZHJlc3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwl1OCBfX2lvbWVtICpiYXIwX3BjaWFkZHIgPSBvY3QtPm1taW9bMF0uaHdfYWRkcjsKKwlzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqY24yM3h4ID0gKHN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICopb2N0LT5jaGlwOworCisJb2N0LT5yZWdfbGlzdC5wY2lfd2luX3dyX2FkZHJfaGkgPQorCSAgICAodTMyIF9faW9tZW0gKikoYmFyMF9wY2lhZGRyICsgQ04yM1hYX1dJTl9XUl9BRERSX0hJKTsKKwlvY3QtPnJlZ19saXN0LnBjaV93aW5fd3JfYWRkcl9sbyA9CisJICAgICh1MzIgX19pb21lbSAqKShiYXIwX3BjaWFkZHIgKyBDTjIzWFhfV0lOX1dSX0FERFJfTE8pOworCW9jdC0+cmVnX2xpc3QucGNpX3dpbl93cl9hZGRyID0KKwkgICAgKHU2NCBfX2lvbWVtICopKGJhcjBfcGNpYWRkciArIENOMjNYWF9XSU5fV1JfQUREUjY0KTsKKworCW9jdC0+cmVnX2xpc3QucGNpX3dpbl9yZF9hZGRyX2hpID0KKwkgICAgKHUzMiBfX2lvbWVtICopKGJhcjBfcGNpYWRkciArIENOMjNYWF9XSU5fUkRfQUREUl9ISSk7CisJb2N0LT5yZWdfbGlzdC5wY2lfd2luX3JkX2FkZHJfbG8gPQorCSAgICAodTMyIF9faW9tZW0gKikoYmFyMF9wY2lhZGRyICsgQ04yM1hYX1dJTl9SRF9BRERSX0xPKTsKKwlvY3QtPnJlZ19saXN0LnBjaV93aW5fcmRfYWRkciA9CisJICAgICh1NjQgX19pb21lbSAqKShiYXIwX3BjaWFkZHIgKyBDTjIzWFhfV0lOX1JEX0FERFI2NCk7CisKKwlvY3QtPnJlZ19saXN0LnBjaV93aW5fd3JfZGF0YV9oaSA9CisJICAgICh1MzIgX19pb21lbSAqKShiYXIwX3BjaWFkZHIgKyBDTjIzWFhfV0lOX1dSX0RBVEFfSEkpOworCW9jdC0+cmVnX2xpc3QucGNpX3dpbl93cl9kYXRhX2xvID0KKwkgICAgKHUzMiBfX2lvbWVtICopKGJhcjBfcGNpYWRkciArIENOMjNYWF9XSU5fV1JfREFUQV9MTyk7CisJb2N0LT5yZWdfbGlzdC5wY2lfd2luX3dyX2RhdGEgPQorCSAgICAodTY0IF9faW9tZW0gKikoYmFyMF9wY2lhZGRyICsgQ04yM1hYX1dJTl9XUl9EQVRBNjQpOworCisJb2N0LT5yZWdfbGlzdC5wY2lfd2luX3JkX2RhdGFfaGkgPQorCSAgICAodTMyIF9faW9tZW0gKikoYmFyMF9wY2lhZGRyICsgQ04yM1hYX1dJTl9SRF9EQVRBX0hJKTsKKwlvY3QtPnJlZ19saXN0LnBjaV93aW5fcmRfZGF0YV9sbyA9CisJICAgICh1MzIgX19pb21lbSAqKShiYXIwX3BjaWFkZHIgKyBDTjIzWFhfV0lOX1JEX0RBVEFfTE8pOworCW9jdC0+cmVnX2xpc3QucGNpX3dpbl9yZF9kYXRhID0KKwkgICAgKHU2NCBfX2lvbWVtICopKGJhcjBfcGNpYWRkciArIENOMjNYWF9XSU5fUkRfREFUQTY0KTsKKworCWNuMjN4eF9nZXRfcGNpZV9xbG1wb3J0KG9jdCk7CisKKwljbjIzeHgtPmludHJfbWFzazY0ID0gQ04yM1hYX0lOVFJfTUFTSzsKKwlpZiAoIW9jdC0+bXNpeF9vbikKKwkJY24yM3h4LT5pbnRyX21hc2s2NCB8PSBDTjIzWFhfSU5UUl9QS1RfVElNRTsKKwlpZiAob2N0LT5yZXZfaWQgPj0gT0NURU9OX0NOMjNYWF9SRVZfMV8xKQorCQljbjIzeHgtPmludHJfbWFzazY0IHw9IENOMjNYWF9JTlRSX1ZGX01CT1g7CisKKwljbjIzeHgtPmludHJfc3VtX3JlZzY0ID0KKwkgICAgYmFyMF9wY2lhZGRyICsKKwkgICAgQ04yM1hYX1NMSV9NQUNfUEZfSU5UX1NVTTY0KG9jdC0+cGNpZV9wb3J0LCBvY3QtPnBmX251bSk7CisJY24yM3h4LT5pbnRyX2VuYl9yZWc2NCA9CisJICAgIGJhcjBfcGNpYWRkciArCisJICAgIENOMjNYWF9TTElfTUFDX1BGX0lOVF9FTkI2NChvY3QtPnBjaWVfcG9ydCwgb2N0LT5wZl9udW0pOworfQorCitzdGF0aWMgaW50IGNuMjN4eF9zcmlvdl9jb25maWcoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwl1MzIgdG90YWxfcmluZ3M7CisJc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKmNuMjN4eCA9IChzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqKW9jdC0+Y2hpcDsKKwkvKiBudW1fdmZzIGlzIGFscmVhZHkgZmlsbGVkIGZvciB1cyAqLworCXUzMiBwZl9zcm4sIG51bV9wZl9yaW5nczsKKworCWNuMjN4eC0+Y29uZiA9CisJICAgIChzdHJ1Y3Qgb2N0ZW9uX2NvbmZpZyAqKW9jdF9nZXRfY29uZmlnX2luZm8ob2N0LCBMSU9fMjNYWCk7CisJc3dpdGNoIChvY3QtPnJldl9pZCkgeworCWNhc2UgT0NURU9OX0NOMjNYWF9SRVZfMV8wOgorCQl0b3RhbF9yaW5ncyA9IENOMjNYWF9NQVhfUklOR1NfUEVSX1BGX1BBU1NfMV8wOworCQlicmVhazsKKwljYXNlIE9DVEVPTl9DTjIzWFhfUkVWXzFfMToKKwkJdG90YWxfcmluZ3MgPSBDTjIzWFhfTUFYX1JJTkdTX1BFUl9QRl9QQVNTXzFfMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdG90YWxfcmluZ3MgPSBDTjIzWFhfTUFYX1JJTkdTX1BFUl9QRjsKKwkJYnJlYWs7CisJfQorCWlmICghb2N0LT5zcmlvdl9pbmZvLm51bV9wZl9yaW5ncykgeworCQlpZiAodG90YWxfcmluZ3MgPiBudW1fcHJlc2VudF9jcHVzKCkpCisJCQludW1fcGZfcmluZ3MgPSBudW1fcHJlc2VudF9jcHVzKCk7CisJCWVsc2UKKwkJCW51bV9wZl9yaW5ncyA9IHRvdGFsX3JpbmdzOworCX0gZWxzZSB7CisJCW51bV9wZl9yaW5ncyA9IG9jdC0+c3Jpb3ZfaW5mby5udW1fcGZfcmluZ3M7CisKKwkJaWYgKG51bV9wZl9yaW5ncyA+IHRvdGFsX3JpbmdzKSB7CisJCQlkZXZfd2Fybigmb2N0LT5wY2lfZGV2LT5kZXYsCisJCQkJICJudW1fcXVldWVzX3Blcl9wZiByZXF1ZXN0ZWQgJXUgaXMgbW9yZSB0aGFuIGF2YWlsYWJsZSByaW5ncy4gUmVkdWNpbmcgdG8gJXVcbiIsCisJCQkJIG51bV9wZl9yaW5ncywgdG90YWxfcmluZ3MpOworCQkJbnVtX3BmX3JpbmdzID0gdG90YWxfcmluZ3M7CisJCX0KKwl9CisKKwl0b3RhbF9yaW5ncyA9IG51bV9wZl9yaW5nczsKKwkvKiB0aGUgZmlyc3QgcmluZyBvZiB0aGUgcGYgKi8KKwlwZl9zcm4gPSB0b3RhbF9yaW5ncyAtIG51bV9wZl9yaW5nczsKKworCW9jdC0+c3Jpb3ZfaW5mby50cnMgPSB0b3RhbF9yaW5nczsKKwlvY3QtPnNyaW92X2luZm8ucGZfc3JuID0gcGZfc3JuOworCW9jdC0+c3Jpb3ZfaW5mby5udW1fcGZfcmluZ3MgPSBudW1fcGZfcmluZ3M7CisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJ0cnM6JWQgcGZfc3JuOiVkIG51bV9wZl9yaW5nczolZFxuIiwKKwkJb2N0LT5zcmlvdl9pbmZvLnRycywgb2N0LT5zcmlvdl9pbmZvLnBmX3NybiwKKwkJb2N0LT5zcmlvdl9pbmZvLm51bV9wZl9yaW5ncyk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzZXR1cF9jbjIzeHhfb2N0ZW9uX3BmX2RldmljZShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCWlmIChvY3Rlb25fbWFwX3BjaV9iYXJ4KG9jdCwgMCwgMCkpCisJCXJldHVybiAxOworCisJaWYgKG9jdGVvbl9tYXBfcGNpX2Jhcngob2N0LCAxLCBNQVhfQkFSMV9JT1JFTUFQX1NJWkUpKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgQ04yM1hYIEJBUjEgbWFwIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJb2N0ZW9uX3VubWFwX3BjaV9iYXJ4KG9jdCwgMCk7CisJCXJldHVybiAxOworCX0KKworCWNuMjN4eF9nZXRfcGZfbnVtKG9jdCk7CisKKwlpZiAoY24yM3h4X3NyaW92X2NvbmZpZyhvY3QpKSB7CisJCW9jdGVvbl91bm1hcF9wY2lfYmFyeChvY3QsIDApOworCQlvY3Rlb25fdW5tYXBfcGNpX2Jhcngob2N0LCAxKTsKKwkJcmV0dXJuIDE7CisJfQorCisJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9NQUNfQ1JFRElUX0NOVCwgMHgzRjgwMjA4MDgwMjA4MFVMTCk7CisKKwlvY3QtPmZuX2xpc3Quc2V0dXBfaXFfcmVncyA9IGNuMjN4eF9zZXR1cF9pcV9yZWdzOworCW9jdC0+Zm5fbGlzdC5zZXR1cF9vcV9yZWdzID0gY24yM3h4X3NldHVwX29xX3JlZ3M7CisJb2N0LT5mbl9saXN0LnByb2Nlc3NfaW50ZXJydXB0X3JlZ3MgPSBjbjIzeHhfaW50ZXJydXB0X2hhbmRsZXI7CisJb2N0LT5mbl9saXN0Lm1zaXhfaW50ZXJydXB0X2hhbmRsZXIgPSBjbjIzeHhfcGZfbXNpeF9pbnRlcnJ1cHRfaGFuZGxlcjsKKworCW9jdC0+Zm5fbGlzdC5zb2Z0X3Jlc2V0ID0gY24yM3h4X3BmX3NvZnRfcmVzZXQ7CisJb2N0LT5mbl9saXN0LnNldHVwX2RldmljZV9yZWdzID0gY24yM3h4X3NldHVwX3BmX2RldmljZV9yZWdzOworCW9jdC0+Zm5fbGlzdC51cGRhdGVfaXFfcmVhZF9pZHggPSBjbjIzeHhfdXBkYXRlX3JlYWRfaW5kZXg7CisKKwlvY3QtPmZuX2xpc3QuYmFyMV9pZHhfc2V0dXAgPSBjbjIzeHhfYmFyMV9pZHhfc2V0dXA7CisJb2N0LT5mbl9saXN0LmJhcjFfaWR4X3dyaXRlID0gY24yM3h4X2JhcjFfaWR4X3dyaXRlOworCW9jdC0+Zm5fbGlzdC5iYXIxX2lkeF9yZWFkID0gY24yM3h4X2JhcjFfaWR4X3JlYWQ7CisKKwlvY3QtPmZuX2xpc3QuZW5hYmxlX2ludGVycnVwdCA9IGNuMjN4eF9lbmFibGVfcGZfaW50ZXJydXB0OworCW9jdC0+Zm5fbGlzdC5kaXNhYmxlX2ludGVycnVwdCA9IGNuMjN4eF9kaXNhYmxlX3BmX2ludGVycnVwdDsKKworCW9jdC0+Zm5fbGlzdC5lbmFibGVfaW9fcXVldWVzID0gY24yM3h4X2VuYWJsZV9pb19xdWV1ZXM7CisJb2N0LT5mbl9saXN0LmRpc2FibGVfaW9fcXVldWVzID0gY24yM3h4X2Rpc2FibGVfaW9fcXVldWVzOworCisJY24yM3h4X3NldHVwX3JlZ19hZGRyZXNzKG9jdCk7CisKKwlvY3QtPmNvcHJvY19jbG9ja19yYXRlID0gMTAwMDAwMFVMTCAqIGNuMjN4eF9jb3Byb2Nlc3Nvcl9jbG9jayhvY3QpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB2YWxpZGF0ZV9jbjIzeHhfcGZfY29uZmlnX2luZm8oc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwKKwkJCQkgICBzdHJ1Y3Qgb2N0ZW9uX2NvbmZpZyAqY29uZjIzeHgpCit7CisJaWYgKENGR19HRVRfSVFfTUFYX1EoY29uZjIzeHgpID4gQ04yM1hYX01BWF9JTlBVVF9RVUVVRVMpIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICIlczogTnVtIElRICglZCkgZXhjZWVkcyBNYXggKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBDRkdfR0VUX0lRX01BWF9RKGNvbmYyM3h4KSwKKwkJCUNOMjNYWF9NQVhfSU5QVVRfUVVFVUVTKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKENGR19HRVRfT1FfTUFYX1EoY29uZjIzeHgpID4gQ04yM1hYX01BWF9PVVRQVVRfUVVFVUVTKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXM6IE51bSBPUSAoJWQpIGV4Y2VlZHMgTWF4ICglZClcbiIsCisJCQlfX2Z1bmNfXywgQ0ZHX0dFVF9PUV9NQVhfUShjb25mMjN4eCksCisJCQlDTjIzWFhfTUFYX09VVFBVVF9RVUVVRVMpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoQ0ZHX0dFVF9JUV9JTlNUUl9UWVBFKGNvbmYyM3h4KSAhPSBPQ1RFT05fMzJCWVRFX0lOU1RSICYmCisJICAgIENGR19HRVRfSVFfSU5TVFJfVFlQRShjb25mMjN4eCkgIT0gT0NURU9OXzY0QllURV9JTlNUUikgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzOiBJbnZhbGlkIGluc3RyIHR5cGUgZm9yIElRXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIShDRkdfR0VUX09RX0lORk9fUFRSKGNvbmYyM3h4KSkgfHwKKwkgICAgIShDRkdfR0VUX09RX1JFRklMTF9USFJFU0hPTEQoY29uZjIzeHgpKSkgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzOiBJbnZhbGlkIHBhcmFtZXRlciBmb3IgT1FcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAxOworCX0KKworCWlmICghKENGR19HRVRfT1FfSU5UUl9USU1FKGNvbmYyM3h4KSkpIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICIlczogSW52YWxpZCBwYXJhbWV0ZXIgZm9yIE9RXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjbjIzeHhfZHVtcF9pcV9yZWdzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJdTMyIHJlZ3ZhbCwgcV9ubzsKKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiU0xJX0lRX0RPT1JCRUxMXzAgWzB4JXhdOiAweCUwMTZsbHhcbiIsCisJCUNOMjNYWF9TTElfSVFfRE9PUkJFTEwoMCksCisJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQKKwkJCShvY3QsIENOMjNYWF9TTElfSVFfRE9PUkJFTEwoMCkpKSk7CisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIlNMSV9JUV9CQVNFQUREUl8wIFsweCV4XTogMHglMDE2bGx4XG4iLAorCQlDTjIzWFhfU0xJX0lRX0JBU0VfQUREUjY0KDApLAorCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0CisJCQkob2N0LCBDTjIzWFhfU0xJX0lRX0JBU0VfQUREUjY0KDApKSkpOworCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJTTElfSVFfRklGT19SU0laRV8wIFsweCV4XTogMHglMDE2bGx4XG4iLAorCQlDTjIzWFhfU0xJX0lRX1NJWkUoMCksCisJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQob2N0LCBDTjIzWFhfU0xJX0lRX1NJWkUoMCkpKSk7CisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIlNMSV9DVExfU1RBVFVTIFsweCV4XTogMHglMDE2bGx4XG4iLAorCQlDTjIzWFhfU0xJX0NUTF9TVEFUVVMsCisJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQob2N0LCBDTjIzWFhfU0xJX0NUTF9TVEFUVVMpKSk7CisKKwlmb3IgKHFfbm8gPSAwOyBxX25vIDwgQ04yM1hYX01BWF9JTlBVVF9RVUVVRVM7IHFfbm8rKykgeworCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIlNMSV9QS1RbJWRdX0lOUFVUX0NUTCBbMHgleF06IDB4JTAxNmxseFxuIiwKKwkJCXFfbm8sIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSwKKwkJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQKKwkJCQkob2N0LAorCQkJCQlDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubykpKSk7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG9jdC0+cGNpX2RldiwgQ04yM1hYX0NPTkZJR19QQ0lFX0RFVkNUTCwgJnJlZ3ZhbCk7CisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJDb25maWcgRGV2Q3RsIFsweCV4XTogMHglMDh4XG4iLAorCQlDTjIzWFhfQ09ORklHX1BDSUVfREVWQ1RMLCByZWd2YWwpOworCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJTTElfUFJUWyVkXV9DRkcgWzB4JWxseF06IDB4JTAxNmxseFxuIiwKKwkJb2N0LT5wY2llX3BvcnQsIENOMjNYWF9EUElfU0xJX1BSVFhfQ0ZHKG9jdC0+cGNpZV9wb3J0KSwKKwkJQ1ZNX0NBU1Q2NChsaW9fcGNpX3JlYWRxKAorCQkJb2N0LCBDTjIzWFhfRFBJX1NMSV9QUlRYX0NGRyhvY3QtPnBjaWVfcG9ydCkpKSk7CisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIlNMSV9TMk1fUE9SVFslZF1fQ1RMIFsweCV4XTogMHglMDE2bGx4XG4iLAorCQlvY3QtPnBjaWVfcG9ydCwgQ04yM1hYX1NMSV9TMk1fUE9SVFhfQ1RMKG9jdC0+cGNpZV9wb3J0KSwKKwkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCW9jdCwgQ04yM1hYX1NMSV9TMk1fUE9SVFhfQ1RMKG9jdC0+cGNpZV9wb3J0KSkpKTsKK30KKworaW50IGNuMjN4eF9md19sb2FkZWQoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwl1NjQgdmFsOworCisJdmFsID0gb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCBDTjIzWFhfU0xJX1NDUkFUQ0gxKTsKKwlyZXR1cm4gKHZhbCA+PiAxKSAmIDFVTEw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY24yM3h4X3BmX2RldmljZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuMjN4eF9wZl9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWI1YzkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuMjN4eF9wZl9kZXZpY2UuaApAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBBdXRob3I6IENhdml1bSwgSW5jLgorKgorKiBDb250YWN0OiBzdXBwb3J0QGNhdml1bS5jb20KKyogICAgICAgICAgUGxlYXNlIGluY2x1ZGUgIkxpcXVpZElPIiBpbiB0aGUgc3ViamVjdC4KKyoKKyogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2F2aXVtLCBJbmMuCisqCisqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMiwgYXMKKyogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqCisqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyogQVMtSVMgYW5kIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSwgb3IKKyogTk9OSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorKiBkZXRhaWxzLgorKgorKiBUaGlzIGZpbGUgbWF5IGFsc28gYmUgYXZhaWxhYmxlIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UgZnJvbSBDYXZpdW0uCisqIENvbnRhY3QgQ2F2aXVtLCBJbmMuIGZvciBtb3JlIGluZm9ybWF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiEgXGZpbGUgIGNuMjN4eF9kZXZpY2UuaAorICogXGJyaWVmIEhvc3QgRHJpdmVyOiBSb3V0aW5lcyB0aGF0IHBlcmZvcm0gQ04yM1hYIHNwZWNpZmljIG9wZXJhdGlvbnMuCisqLworCisjaWZuZGVmIF9fQ04yM1hYX1BGX0RFVklDRV9IX18KKyNkZWZpbmUgX19DTjIzWFhfUEZfREVWSUNFX0hfXworCisjaW5jbHVkZSAiY24yM3h4X3BmX3JlZ3MuaCIKKworLyogUmVnaXN0ZXIgYWRkcmVzcyBhbmQgY29uZmlndXJhdGlvbiBmb3IgYSBDTjIzWFggZGV2aWNlcy4KKyAqIElmIGRldmljZSBzcGVjaWZpYyBjaGFuZ2VzIG5lZWQgdG8gYmUgbWFkZSB0aGVuIGFkZCBhIHN0cnVjdCB0byBpbmNsdWRlCisgKiBkZXZpY2Ugc3BlY2lmaWMgZmllbGRzIGFzIHNob3duIGluIHRoZSBjb21tZW50ZWQgc2VjdGlvbgorICovCitzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiB7CisJLyoqIFBDSSBpbnRlcnJ1cHQgc3VtbWFyeSByZWdpc3RlciAqLworCXU4IF9faW9tZW0gKmludHJfc3VtX3JlZzY0OworCisJLyoqIFBDSSBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovCisJdTggX19pb21lbSAqaW50cl9lbmJfcmVnNjQ7CisKKwkvKiogVGhlIFBDSSBpbnRlcnJ1cHQgbWFzayB1c2VkIGJ5IGludGVycnVwdCBoYW5kbGVyICovCisJdTY0IGludHJfbWFzazY0OworCisJc3RydWN0IG9jdGVvbl9jb25maWcgKmNvbmY7Cit9OworCitpbnQgc2V0dXBfY24yM3h4X29jdGVvbl9wZl9kZXZpY2Uoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCk7CisKK2ludCB2YWxpZGF0ZV9jbjIzeHhfcGZfY29uZmlnX2luZm8oc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwKKwkJCQkgICBzdHJ1Y3Qgb2N0ZW9uX2NvbmZpZyAqY29uZjIzeHgpOworCit1MzIgY24yM3h4X3BmX2dldF9vcV90aWNrcyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB1MzIgdGltZV9pbnRyX2luX3VzKTsKKwordm9pZCBjbjIzeHhfZHVtcF9wZl9pbml0aWFsaXplZF9yZWdzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpOworCitpbnQgY24yM3h4X2Z3X2xvYWRlZChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuMjN4eF9wZl9yZWdzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY24yM3h4X3BmX3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Q3OWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuMjN4eF9wZl9yZWdzLmgKQEAgLTAsMCArMSw2MDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEF1dGhvcjogQ2F2aXVtLCBJbmMuCisqCisqIENvbnRhY3Q6IHN1cHBvcnRAY2F2aXVtLmNvbQorKiAgICAgICAgICBQbGVhc2UgaW5jbHVkZSAiTGlxdWlkSU8iIGluIHRoZSBzdWJqZWN0LgorKgorKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDYXZpdW0sIEluYy4KKyoKKyogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLCBhcworKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyoKKyogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorKiBBUy1JUyBhbmQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFLCBvcgorKiBOT05JTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisqIGRldGFpbHMuCisqCisqIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBhdmFpbGFibGUgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSBmcm9tIENhdml1bS4KKyogQ29udGFjdCBDYXZpdW0sIEluYy4gZm9yIG1vcmUgaW5mb3JtYXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qISBcZmlsZSBjbjIzeHhfcmVncy5oCisgKiBcYnJpZWYgSG9zdCBEcml2ZXI6IFJlZ2lzdGVyIEFkZHJlc3MgYW5kIFJlZ2lzdGVyIE1hc2sgdmFsdWVzIGZvcgorICogT2N0ZW9uIENOMjNYWCBkZXZpY2VzLgorKi8KKworI2lmbmRlZiBfX0NOMjNYWF9QRl9SRUdTX0hfXworI2RlZmluZSBfX0NOMjNYWF9QRl9SRUdTX0hfXworCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1ZFTkRPUl9JRAkweDAwCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX0RFVklDRV9JRAkweDAyCisKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfWFBBTlNJT05fQkFSICAgICAgICAgICAgIDB4MzgKKworI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19NU0lYX0NBUAkJICAgMHg1MAorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19NU0lYX0xNU0kJCSAgIDB4NTQKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfTVNJWF9VTVNJCQkgICAweDU4CisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX01TSVhfTVNJTUQJCSAgIDB4NUMKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfTVNJWF9NU0lNTQkJICAgMHg2MAorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19NU0lYX01TSU1QCQkgICAweDY0CisKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfUENJRV9DQVAgICAgICAgICAgICAgICAgIDB4NzAKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfUENJRV9ERVZDQVAgICAgICAgICAgICAgIDB4NzQKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfUENJRV9ERVZDVEwgICAgICAgICAgICAgIDB4NzgKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfUENJRV9MSU5LQ0FQICAgICAgICAgICAgIDB4N0MKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfUENJRV9MSU5LQ1RMICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfUENJRV9TTE9UQ0FQICAgICAgICAgICAgIDB4ODQKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfUENJRV9TTE9UQ1RMICAgICAgICAgICAgIDB4ODgKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfUENJRV9ERVZDVEwyICAgICAgICAgICAgIDB4OTgKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfUENJRV9MSU5LQ1RMMiAgICAgICAgICAgIDB4QTAKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfUENJRV9VTkNPUlJFQ1RfRVJSX01BU0sgIDB4MTA4CisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1BDSUVfQ09SUkVDVF9FUlJfU1RBVFVTICAweDExMAorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19QQ0lFX0RFVkNUTF9NQVNLICAgICAgICAgMHgwMDA0MDAwMAorCisjZGVmaW5lICAgICBDTjIzWFhfUENJRV9TUklPVl9GREwJCSAgIDB4MTg4CisjZGVmaW5lICAgICBDTjIzWFhfUENJRV9TUklPVl9GRExfQklUX1BPUwkgICAweDEwCisjZGVmaW5lICAgICBDTjIzWFhfUENJRV9TUklPVl9GRExfTUFTSwkJICAgMHhGRgorCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1BDSUVfRkxUTVNLICAgICAgICAgICAgICAweDcyMAorCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1NSSU9WX1ZGREVWSUQgICAgICAgICAgICAweDE5MAorCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1NSSU9WX0JBUl9TVEFSVAkgICAweDE5QworI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19TUklPVl9CQVJYKGkpCQlcCisJCShDTjIzWFhfQ09ORklHX1NSSU9WX0JBUl9TVEFSVCArIChpICogNCkpCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1NSSU9WX0JBUl9QRgkJICAgMHgwOAorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19TUklPVl9CQVJfNjRCSVQJICAgMHgwNAorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19TUklPVl9CQVJfSU8JCSAgIDB4MDEKKworLyogIyMjIyMjIyMjIyMjIyMgIEJBUjAgUmVnaXN0ZXJzICMjIyMjIyMjIyMjIyMjIyMgKi8KKworI2RlZmluZSAgICBDTjIzWFhfU0xJX0NUTF9QT1JUX1NUQVJUICAgICAgICAgICAgICAgMHgyODZFMAorI2RlZmluZSAgICBDTjIzWFhfUE9SVF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgMHgxMAorCisjZGVmaW5lICAgIENOMjNYWF9TTElfQ1RMX1BPUlQocCkgICAgICAgICAgICAgICAgICBcCisJCShDTjIzWFhfU0xJX0NUTF9QT1JUX1NUQVJUICsgKChwKSAqIENOMjNYWF9QT1JUX09GRlNFVCkpCisKKy8qIDIgc2NhdGNoIHJlZ2lzdGVycyAoNjQtYml0KSAgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9XSU5ET1dfQ1RMICAgICAgICAgICAgICAgICAgIDB4MjgyRTAKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9TQ1JBVENIMSAgICAgICAgICAgICAgICAgICAgIDB4MjgzQzAKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9TQ1JBVENIMiAgICAgICAgICAgICAgICAgICAgIDB4MjgzRDAKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9XSU5ET1dfQ1RMX0RFRkFVTFQgICAgICAgICAgIDB4MjAwMDAwVUxMCisKKy8qIDEgcmVnaXN0ZXJzICg2NC1iaXQpICAtIFNMSV9DVExfU1RBVFVTICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfQ1RMX1NUQVRVUyAgICAgICAgICAgICAgICAgICAweDI4NTcwCisKKy8qIFNMSSBQYWNrZXQgSW5wdXQgSmFiYmVyIFJlZ2lzdGVyICg2NCBiaXQgcmVnaXN0ZXIpCisgKiA8MzE6MD4gZm9yIEJ5dGUgY291bnQgZm9yIGxpbWl0aW5nIHNpemVzIG9mIHBhY2tldCBzaXplcworICogdGhhdCBhcmUgYWxsb3dlZCBmb3Igc2xpIHBhY2tldCBpbmJvdW5kIHBhY2tldHMuCisgKiB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAweEZBMDAoPTY0MDAwKS4KKyAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX1BLVF9JTl9KQUJCRVIgICAgICAgICAgICAgICAgMHgyOTE3MAorLyogVGhlIGlucHV0IGphYmJlciBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgVFNPIG1heCBzaXplLgorICogRHVlIHRvIEgvVyBsaW1pdGF0aW9uLCB0aGlzIG5lZWQgdG8gYmUgcmVkdWNlZCB0byA2MDAwMAorICogaW4gb3JkZXIgdG8gdG8gSC9XIFRTTyBhbmQgYXZvaWQgdGhlIFdRRSBtYWxmYXJtYXRpb24KKyAqIFBLT19CVUdfMjQ5ODlfV1FFX0xFTgorICovCisjZGVmaW5lICAgIENOMjNYWF9ERUZBVUxUX0lOUFVUX0pBQkJFUiAgICAgICAgICAgICAweEVBNjAgLyo2MDAwMCovCisKKyNkZWZpbmUgICAgQ04yM1hYX1dJTl9XUl9BRERSX0xPICAgICAgICAgICAgICAgICAgIDB4MjAwMDAKKyNkZWZpbmUgICAgQ04yM1hYX1dJTl9XUl9BRERSX0hJICAgICAgICAgICAgICAgICAgIDB4MjAwMDQKKyNkZWZpbmUgICAgQ04yM1hYX1dJTl9XUl9BRERSNjQgICAgICAgICAgICAgICAgICAgIENOMjNYWF9XSU5fV1JfQUREUl9MTworCisjZGVmaW5lICAgIENOMjNYWF9XSU5fUkRfQUREUl9MTyAgICAgICAgICAgICAgICAgICAweDIwMDEwCisjZGVmaW5lICAgIENOMjNYWF9XSU5fUkRfQUREUl9ISSAgICAgICAgICAgICAgICAgICAweDIwMDE0CisjZGVmaW5lICAgIENOMjNYWF9XSU5fUkRfQUREUjY0ICAgICAgICAgICAgICAgICAgICBDTjIzWFhfV0lOX1JEX0FERFJfTE8KKworI2RlZmluZSAgICBDTjIzWFhfV0lOX1dSX0RBVEFfTE8gICAgICAgICAgICAgICAgICAgMHgyMDAyMAorI2RlZmluZSAgICBDTjIzWFhfV0lOX1dSX0RBVEFfSEkgICAgICAgICAgICAgICAgICAgMHgyMDAyNAorI2RlZmluZSAgICBDTjIzWFhfV0lOX1dSX0RBVEE2NCAgICAgICAgICAgICAgICAgICAgQ04yM1hYX1dJTl9XUl9EQVRBX0xPCisKKyNkZWZpbmUgICAgQ04yM1hYX1dJTl9SRF9EQVRBX0xPICAgICAgICAgICAgICAgICAgIDB4MjAwNDAKKyNkZWZpbmUgICAgQ04yM1hYX1dJTl9SRF9EQVRBX0hJICAgICAgICAgICAgICAgICAgIDB4MjAwNDQKKyNkZWZpbmUgICAgQ04yM1hYX1dJTl9SRF9EQVRBNjQgICAgICAgICAgICAgICAgICAgIENOMjNYWF9XSU5fUkRfREFUQV9MTworCisjZGVmaW5lICAgIENOMjNYWF9XSU5fV1JfTUFTS19MTyAgICAgICAgICAgICAgICAgICAweDIwMDMwCisjZGVmaW5lICAgIENOMjNYWF9XSU5fV1JfTUFTS19ISSAgICAgICAgICAgICAgICAgICAweDIwMDM0CisjZGVmaW5lICAgIENOMjNYWF9XSU5fV1JfTUFTS19SRUcgICAgICAgICAgICAgICAgICBDTjIzWFhfV0lOX1dSX01BU0tfTE8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9NQUNfQ1JFRElUX0NOVCAgICAgICAgICAgICAgIDB4MjNENzAKKworLyogNCByZWdpc3RlcnMgKDY0LWJpdCkgZm9yIG1hcHBpbmcgSU9RcyB0byBNQUNzKFBFTXMpLQorICogU0xJX1BLVF9NQUMoMC4uMylfUEYoMC4uMSlfUklORk8KKyAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX1BLVF9NQUNfUklORk9fU1RBUlQ2NCAgICAgICAweDI5MDMwCisKKy8qMSByZWdpc3RlciAoNjQtYml0KSB0byBkZXRlcm1pbmUgd2hldGhlciBJT1FzIGFyZSBpbiByZXNldC4gKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9QS1RfSU9RX1JJTkdfUlNUICAgICAgICAgICAgMHgyOTFFMAorCisvKiBFYWNoIElucHV0IFF1ZXVlIHJlZ2lzdGVyIGlzIGF0IGEgMTYtYnl0ZSBPZmZzZXQgaW4gQkFSMCAqLworI2RlZmluZSAgICBDTjIzWFhfSVFfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwCisKKyNkZWZpbmUgICAgQ04yM1hYX01BQ19SSU5GT19PRkZTRVQgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSAgICBDTjIzWFhfUEZfUklORk9fT0ZGU0VUICAgICAgICAgICAgICAgICAweDEwCisKKyNkZWZpbmUgQ04yM1hYX1NMSV9QS1RfTUFDX1JJTkZPNjQobWFjLCBwZikJCVwKKwkJKENOMjNYWF9TTElfUEtUX01BQ19SSU5GT19TVEFSVDY0ICsgICAgIFwKKwkJICgobWFjKSAqIENOMjNYWF9NQUNfUklORk9fT0ZGU0VUKSArCVwKKwkJICgocGYpICogQ04yM1hYX1BGX1JJTkZPX09GRlNFVCkpCisKKy8qKiBtYXNrIGZvciB0b3RhbCByaW5ncywgc2V0dGluZyBUUlMgdG8gYmFzZSAqLworI2RlZmluZSAgICBDTjIzWFhfUEtUX01BQ19DVExfUklORk9fVFJTICAgICAgICAgICAgICAgQklUX1VMTCgxNikKKy8qKiBtYXNrIGZvciBzdGFydGluZyByaW5nIG51bWJlcjogc2V0dGluZyBTUk4gPDY6MD4gPSAweDdGICovCisjZGVmaW5lICAgIENOMjNYWF9QS1RfTUFDX0NUTF9SSU5GT19TUk4gICAgICAgICAgICAgICAoMHg3RikKKworLyogU3RhcnRpbmcgYml0IG9mIHRoZSBUUlMgZmllbGQgaW4gQ04yM1hYX1NMSV9QS1RfTUFDX1JJTkZPNjQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9NQUNfQ1RMX1JJTkZPX1RSU19CSVRfUE9TICAgICAxNgorLyogU3RhcnRpbmcgYml0IG9mIFNSTiBmaWVsZCBpbiBDTjIzWFhfU0xJX1BLVF9NQUNfUklORk82NCByZWdpc3RlciAqLworI2RlZmluZSAgICBDTjIzWFhfUEtUX01BQ19DVExfUklORk9fU1JOX0JJVF9QT1MgICAgIDAKKy8qIFN0YXJ0aW5nIGJpdCBvZiBSUFZGIGZpZWxkIGluIENOMjNYWF9TTElfUEtUX01BQ19SSU5GTzY0IHJlZ2lzdGVyICovCisjZGVmaW5lICAgIENOMjNYWF9QS1RfTUFDX0NUTF9SSU5GT19SUFZGX0JJVF9QT1MgICAgIDMyCisvKiBTdGFydGluZyBiaXQgb2YgTlZGUyBmaWVsZCBpbiBDTjIzWFhfU0xJX1BLVF9NQUNfUklORk82NCByZWdpc3RlciAqLworI2RlZmluZSAgICBDTjIzWFhfUEtUX01BQ19DVExfUklORk9fTlZGU19CSVRfUE9TICAgICA0OAorCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUkVRVUVTVCBRVUVVRSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKworLyogNjQgcmVnaXN0ZXJzIGZvciBJbnB1dCBRdWV1ZSBJbnN0ciBDb3VudCAtIFNMSV9QS1RfSU5fRE9ORTBfQ05UUyAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX0lRX0lOU1RSX0NPVU5UX1NUQVJUNjQgICAgIDB4MTAwNDAKKworLyogNjQgcmVnaXN0ZXJzIGZvciBJbnB1dCBRdWV1ZXMgU3RhcnQgQWRkciAtIFNMSV9QS1QwX0lOU1RSX0JBRERSICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfSVFfQkFTRV9BRERSX1NUQVJUNjQgICAgICAgMHgxMDAxMAorCisvKiA2NCByZWdpc3RlcnMgZm9yIElucHV0IERvb3JiZWxsIC0gU0xJX1BLVDBfSU5TVFJfQkFPRkZfREJFTEwgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9JUV9ET09SQkVMTF9TVEFSVCAgICAgICAgICAweDEwMDIwCisKKy8qIDY0IHJlZ2lzdGVycyBmb3IgSW5wdXQgUXVldWUgc2l6ZSAtIFNMSV9QS1QwX0lOU1RSX0ZJRk9fUlNJWkUgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9JUV9TSVpFX1NUQVJUICAgICAgICAgICAgICAweDEwMDMwCisKKy8qIDY0IHJlZ2lzdGVycyAoNjQtYml0KSAtIEVTLCBSTywgTlMsIEFyYml0cmF0aW9uIGZvciBJbnB1dCBRdWV1ZSBEYXRhICYKKyAqIGdhdGhlciBsaXN0IGZldGNoZXMuIFNMSV9QS1QoMC4uNjMpX0lOUFVUX0NPTlRST0wuCisgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTF9TVEFSVDY0ICAgIDB4MTAwMDAKKworLyotLS0tLS0tIFJlcXVlc3QgUXVldWUgTWFjcm9zIC0tLS0tLS0tLSovCisjZGVmaW5lICAgIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChpcSkgICAgICAgICAgXAorCQkoQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTF9TVEFSVDY0ICsgKChpcSkgKiBDTjIzWFhfSVFfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX0lRX0JBU0VfQUREUjY0KGlxKSAgICAgICAgICBcCisJCShDTjIzWFhfU0xJX0lRX0JBU0VfQUREUl9TVEFSVDY0ICsgKChpcSkgKiBDTjIzWFhfSVFfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX0lRX1NJWkUoaXEpICAgICAgICAgICAgICAgICBcCisJCShDTjIzWFhfU0xJX0lRX1NJWkVfU1RBUlQgKyAoKGlxKSAqIENOMjNYWF9JUV9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9TTElfSVFfRE9PUkJFTEwoaXEpICAgICAgICAgICAgIFwKKwkJKENOMjNYWF9TTElfSVFfRE9PUkJFTExfU1RBUlQgKyAoKGlxKSAqIENOMjNYWF9JUV9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9TTElfSVFfSU5TVFJfQ09VTlQ2NChpcSkgICAgICAgICAgXAorCQkoQ04yM1hYX1NMSV9JUV9JTlNUUl9DT1VOVF9TVEFSVDY0ICsgKChpcSkgKiBDTjIzWFhfSVFfT0ZGU0VUKSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0gTWFza3MgLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1ZGX05VTSAgICAgICAgICAgICAgICAgIEJJVF9VTEwoMzIpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX01BQ19OVU0gICAgICAgICAgICAgICAgIEJJVCgyOSkKKy8qIE51bWJlciBvZiBpbnN0cnVjdGlvbnMgdG8gYmUgcmVhZCBpbiBvbmUgTUFDIHJlYWQgcmVxdWVzdC4KKyAqIHNldHRpbmcgdG8gTWF4IHZhbHVlKDQpCisgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfUkRTSVpFICAgICAgICAgICAgICAgICAgKDMgPDwgMjUpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX0lTXzY0QiAgICAgICAgICAgICAgICAgIEJJVCgyNCkKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfUlNUICAgICAgICAgICAgICAgICAgICAgQklUKDIzKQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9RVUlFVCAgICAgICAgICAgICAgICAgICBCSVQoMjgpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1JJTkdfRU5CICAgICAgICAgICAgICAgIEJJVCgyMikKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfREFUQV9OUyAgICAgICAgICAgICAgICAgQklUKDgpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX0RBVEFfRVNfNjRCX1NXQVAgICAgICAgIEJJVCg2KQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9EQVRBX1JPICAgICAgICAgICAgICAgICBCSVQoNSkKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfVVNFX0NTUiAgICAgICAgICAgICAgICAgQklUKDQpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX0dBVEhFUl9OUyAgICAgICAgICAgICAgIEJJVCgzKQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9HQVRIRVJfRVNfNjRCX1NXQVAgICAgICAoMikKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfR0FUSEVSX1JPICAgICAgICAgICAgICAgKDEpCisKKy8qKiBSaW5ncyBwZXIgVmlydHVhbCBGdW5jdGlvbiAqKi8KKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfUlBWRl9NQVNLICAgICAgICAgICAgICAgKDB4M0YpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1JQVkZfUE9TICAgICAgICAgICAgICAgICg0OCkKKy8qKiBUaGVzZSBiaXRzWzQ3OjQ0XSBzZWxlY3QgdGhlIFBoeXNpY2FsIGZ1bmN0aW9uIG51bWJlciB3aXRoaW4gdGhlIE1BQyAqLworI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9QRl9OVU1fTUFTSyAgICAgICAgICAgICAoMHg3KQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9QRl9OVU1fUE9TICAgICAgICAgICAgICAoNDUpCisvKiogVGhlc2UgYml0c1s0MzozMl0gc2VsZWN0IHRoZSBmdW5jdGlvbiBudW1iZXIgd2l0aGluIHRoZSBQRiAqLworI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9WRl9OVU1fTUFTSyAgICAgICAgICAgICAoMHgxRkZGKQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9WRl9OVU1fUE9TICAgICAgICAgICAgICAoMzIpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX01BQ19OVU1fTUFTSyAgICAgICAgICAgICgweDMpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX01BQ19OVU1fUE9TICAgICAgICAgICAgICgyOSkKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTl9ET05FX1dNQVJLX01BU0sgICAgICAgICAgICAgICAgKDB4RkZGRlVMTCkKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTl9ET05FX1dNQVJLX0JJVF9QT1MgICAgICAgICAgICAgKDMyKQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOX0RPTkVfQ05UX01BU0sgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMEZGRkZGRkZGVUxMKQorCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxECisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX01BU0sJCQkJXAorCQkoQ04yM1hYX1BLVF9JTlBVVF9DVExfUkRTSVpFCQl8CVwKKwkJIENOMjNYWF9QS1RfSU5QVVRfQ1RMX0RBVEFfRVNfNjRCX1NXQVAJfAlcCisJCSBDTjIzWFhfUEtUX0lOUFVUX0NUTF9VU0VfQ1NSKQorI2Vsc2UKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfTUFTSwkJCQlcCisJCShDTjIzWFhfUEtUX0lOUFVUX0NUTF9SRFNJWkUJCXwJXAorCQkgQ04yM1hYX1BLVF9JTlBVVF9DVExfREFUQV9FU182NEJfU1dBUAl8CVwKKwkJIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1VTRV9DU1IJCXwJXAorCQkgQ04yM1hYX1BLVF9JTlBVVF9DVExfR0FUSEVSX0VTXzY0Ql9TV0FQKQorI2VuZGlmCisKKy8qKiBNYXNrcyBmb3IgU0xJX1BLVF9JTl9ET05FKDAuLjYzKV9DTlRTIFJlZ2lzdGVyICovCisjZGVmaW5lICAgIENOMjNYWF9JTl9ET05FX0NOVFNfUElfSU5UICAgICAgICAgICAgICAgQklUX1VMTCg2MikKKyNkZWZpbmUgICAgQ04yM1hYX0lOX0RPTkVfQ05UU19DSU5UX0VOQiAgICAgICAgICAgICBCSVRfVUxMKDQ4KQorCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgT1VUUFVUIFFVRVVFICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworCisvKiA2NCByZWdpc3RlcnMgZm9yIE91dHB1dCBxdWV1ZSBjb250cm9sIC0gU0xJX1BLVCgwLi42MylfT1VUUFVUX0NPTlRST0wgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PUV9QS1RfQ09OVFJPTF9TVEFSVCAgICAgICAweDEwMDUwCisKKy8qIDY0IHJlZ2lzdGVycyBmb3IgT3V0cHV0IHF1ZXVlIGJ1ZmZlciBhbmQgaW5mbyBzaXplIC0gU0xJX1BLVDBfT1VUX1NJWkUgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PUTBfQlVGRl9JTkZPX1NJWkUgICAgICAgICAweDEwMDYwCisKKy8qIDY0IHJlZ2lzdGVycyBmb3IgT3V0cHV0IFF1ZXVlIFN0YXJ0IEFkZHIgLSBTTElfUEtUMF9TTElTVF9CQUREUiAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX09RX0JBU0VfQUREUl9TVEFSVDY0ICAgICAgIDB4MTAwNzAKKworLyogNjQgcmVnaXN0ZXJzIGZvciBPdXRwdXQgUXVldWUgUGFja2V0IENyZWRpdHMgLSBTTElfUEtUMF9TTElTVF9CQU9GRl9EQkVMTCAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX09RX1BLVF9DUkVESVRTX1NUQVJUICAgICAgIDB4MTAwODAKKworLyogNjQgcmVnaXN0ZXJzIGZvciBPdXRwdXQgUXVldWUgc2l6ZSAtIFNMSV9QS1QwX1NMSVNUX0ZJRk9fUlNJWkUgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PUV9TSVpFX1NUQVJUICAgICAgICAgICAgICAweDEwMDkwCisKKy8qIDY0IHJlZ2lzdGVycyBmb3IgT3V0cHV0IFF1ZXVlIFBhY2tldCBDb3VudCAtIFNMSV9QS1QwX0NOVFMgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PUV9QS1RfU0VOVF9TVEFSVCAgICAgICAgICAweDEwMEIwCisKKy8qIDY0IHJlZ2lzdGVycyBmb3IgT3V0cHV0IFF1ZXVlIElOVCBMZXZlbHMgLSBTTElfUEtUMF9JTlRfTEVWRUxTICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1FfUEtUX0lOVF9MRVZFTFNfU1RBUlQ2NCAgIDB4MTAwQTAKKworLyogRWFjaCBPdXRwdXQgUXVldWUgcmVnaXN0ZXIgaXMgYXQgYSAxNi1ieXRlIE9mZnNldCBpbiBCQVIwICovCisjZGVmaW5lICAgIENOMjNYWF9PUV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMAorCisvKiAxICg2NC1iaXQgcmVnaXN0ZXIpIGZvciBPdXRwdXQgUXVldWUgYmFja3ByZXNzdXJlIGFjcm9zcyBhbGwgcmluZ3MuICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1FfV01BUksgICAgICAgICAgICAgICAgICAgMHgyOTE4MAorCisvKiBHbG9iYWwgcGt0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9HQkxfQ09OVFJPTCAgICAgICAgICAgICAgICAweDI5MjEwCisKKy8qIEJhY2twcmVzc3VyZSBlbmFibGUgcmVnaXN0ZXIgZm9yIFBGMCAgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PVVRfQlBfRU5fVzFTICAgICAgICAgICAgICAweDI5MjYwCisKKy8qIEJhY2twcmVzc3VyZSBlbmFibGUgcmVnaXN0ZXIgZm9yIFBGMSAgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PVVRfQlBfRU4yX1cxUyAgICAgICAgICAgICAweDI5MjcwCisKKy8qIEJhY2twcmVzc3VyZSBkaXNhYmxlIHJlZ2lzdGVyIGZvciBQRjAgICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1VUX0JQX0VOX1cxQyAgICAgICAgICAgICAgMHgyOTI4MAorCisvKiBCYWNrcHJlc3N1cmUgZGlzYWJsZSByZWdpc3RlciBmb3IgUEYxICAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX09VVF9CUF9FTjJfVzFDICAgICAgICAgICAgIDB4MjkyOTAKKworLyotLS0tLS0tIE91dHB1dCBRdWV1ZSBNYWNyb3MgLS0tLS0tLS0tKi8KKworI2RlZmluZSAgICBDTjIzWFhfU0xJX09RX1BLVF9DT05UUk9MKG9xKSAgICAgICAgICBcCisJCShDTjIzWFhfU0xJX09RX1BLVF9DT05UUk9MX1NUQVJUICsgKChvcSkgKiBDTjIzWFhfT1FfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX09RX0JBU0VfQUREUjY0KG9xKSAgICAgICAgICBcCisJCShDTjIzWFhfU0xJX09RX0JBU0VfQUREUl9TVEFSVDY0ICsgKChvcSkgKiBDTjIzWFhfT1FfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX09RX1NJWkUob3EpICAgICAgICAgICAgICAgICBcCisJCShDTjIzWFhfU0xJX09RX1NJWkVfU1RBUlQgKyAoKG9xKSAqIENOMjNYWF9PUV9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1FfQlVGRl9JTkZPX1NJWkUob3EpICAgICAgICAgICAgICAgICBcCisJCShDTjIzWFhfU0xJX09RMF9CVUZGX0lORk9fU0laRSArICgob3EpICogQ04yM1hYX09RX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PUV9QS1RTX1NFTlQob3EpICAgICAgICAgICAgXAorCQkoQ04yM1hYX1NMSV9PUV9QS1RfU0VOVF9TVEFSVCArICgob3EpICogQ04yM1hYX09RX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PUV9QS1RTX0NSRURJVChvcSkgICAgICAgICAgXAorCQkoQ04yM1hYX1NMSV9PUV9QS1RfQ1JFRElUU19TVEFSVCArICgob3EpICogQ04yM1hYX09RX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PUV9QS1RfSU5UX0xFVkVMUyhvcSkJCVwKKwkJKENOMjNYWF9TTElfT1FfUEtUX0lOVF9MRVZFTFNfU1RBUlQ2NCArCVwKKwkJICgob3EpICogQ04yM1hYX09RX09GRlNFVCkpCisKKy8qTWFjcm8ncyBmb3IgYWNjZXNzaW5nIENOVCBhbmQgVElNRSBzZXBhcmF0ZWx5IGZyb20gSU5UX0xFVkVMUyovCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1FfUEtUX0lOVF9MRVZFTFNfQ05UKG9xKQkJXAorCQkoQ04yM1hYX1NMSV9PUV9QS1RfSU5UX0xFVkVMU19TVEFSVDY0ICsgXAorCQkgKChvcSkgKiBDTjIzWFhfT1FfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX09RX1BLVF9JTlRfTEVWRUxTX1RJTUUob3EpCVwKKwkJKENOMjNYWF9TTElfT1FfUEtUX0lOVF9MRVZFTFNfU1RBUlQ2NCArCVwKKwkJICgob3EpICogQ04yM1hYX09RX09GRlNFVCkgKyA0KQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLSBNYXNrcyAtLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX1RFTkIgICAgICAgICAgICAgICAgICBCSVQoMTMpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfT1VUUFVUX0NUTF9DRU5CICAgICAgICAgICAgICAgICAgQklUKDEyKQorI2RlZmluZSAgICBDTjIzWFhfUEtUX09VVFBVVF9DVExfSVBUUiAgICAgICAgICAgICAgICAgIEJJVCgxMSkKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX0VTICAgICAgICAgICAgICAgICAgICBCSVQoOSkKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX05TUiAgICAgICAgICAgICAgICAgICBCSVQoOCkKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX1JPUiAgICAgICAgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX0RQVFIgICAgICAgICAgICAgICAgICBCSVQoNikKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX0JNT0RFICAgICAgICAgICAgICAgICBCSVQoNSkKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX0VTX1AgICAgICAgICAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX05TUl9QICAgICAgICAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX1JPUl9QICAgICAgICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX1JJTkdfRU5CICAgICAgICAgICAgICBCSVQoMCkKKworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE1haWxib3ggUmVnIE1hY3JvcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX1BLVF9NQk9YX0lOVF9TVEFSVCAgICAgICAgICAgICAweDEwMjEwCisjZGVmaW5lICAgIENOMjNYWF9TTElfUEtUX1BGX1ZGX01CT1hfU0lHX1NUQVJUICAgICAgIDB4MTAyMDAKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9NQUNfUEZfTUJPWF9JTlRfU1RBUlQgICAgICAgICAgMHgyNzM4MAorCisjZGVmaW5lICAgIENOMjNYWF9TTElfTUJPWF9PRkZTRVQJCSAgICAgMHgyMDAwMAorI2RlZmluZSAgICBDTjIzWFhfU0xJX01CT1hfU0lHX0lEWF9PRkZTRVQJICAgICAweDgKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX1BLVF9NQk9YX0lOVChxKSAgICAgICAgICBcCisJCShDTjIzWFhfU0xJX1BLVF9NQk9YX0lOVF9TVEFSVCArICgocSkgKiBDTjIzWFhfU0xJX01CT1hfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX1BLVF9QRl9WRl9NQk9YX1NJRyhxLCBpZHgpCQlcCisJCShDTjIzWFhfU0xJX1BLVF9QRl9WRl9NQk9YX1NJR19TVEFSVCArCQlcCisJCSAoKHEpICogQ04yM1hYX1NMSV9NQk9YX09GRlNFVCArCQlcCisJCSAgKGlkeCkgKiBDTjIzWFhfU0xJX01CT1hfU0lHX0lEWF9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9TTElfTUFDX1BGX01CT1hfSU5UKG1hYywgcGYpCQlcCisJCShDTjIzWFhfU0xJX01BQ19QRl9NQk9YX0lOVF9TVEFSVCArCVwKKwkJICgobWFjKSAqIENOMjNYWF9NQUNfSU5UX09GRlNFVCArCVwKKwkJICAocGYpICogQ04yM1hYX1BGX0lOVF9PRkZTRVQpKQorCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRE1BIENvdW50ZXJzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworCisvKiAyIHJlZ2lzdGVycyAoNjQtYml0KSAtIERNQSBDb3VudCAtIDEgZm9yIGVhY2ggRE1BIGNvdW50ZXIgMC8xLiAqLworI2RlZmluZSAgICBDTjIzWFhfRE1BX0NOVF9TVEFSVCAgICAgICAgICAgICAgICAgICAweDI4NDAwCisKKy8qIDIgcmVnaXN0ZXJzICg2NC1iaXQpIC0gRE1BIFRpbWVyIDAvMSwgY29udGFpbnMgRE1BIHRpbWVyIHZhbHVlcyAqLworLyogU0xJX0RNQV8wX1RJTSAqLworI2RlZmluZSAgICBDTjIzWFhfRE1BX1RJTV9TVEFSVCAgICAgICAgICAgICAgICAgICAweDI4NDIwCisKKy8qIDIgcmVnaXN0ZXJzICg2NC1iaXQpIC0gRE1BIGNvdW50ICYgVGltZSBJbnRlcnJ1cHQgdGhyZXNob2xkIC0KKyAqIFNMSV9ETUFfMF9JTlRfTEVWRUwKKyAqLworI2RlZmluZSAgICBDTjIzWFhfRE1BX0lOVF9MRVZFTF9TVEFSVCAgICAgICAgICAgICAweDI4M0UwCisKKy8qIEVhY2ggRE1BIHJlZ2lzdGVyIGlzIGF0IGEgMTYtYnl0ZSBPZmZzZXQgaW4gQkFSMCAqLworI2RlZmluZSAgICBDTjIzWFhfRE1BX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAweDEwCisKKy8qLS0tLS0tLS0tLSBETUEgQ291bnRlciBNYWNyb3MgLS0tLS0tLS0tKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RNQV9DTlQoZHEpICAgICAgICAgICAgICAgICAgICAgIFwKKwkJKENOMjNYWF9ETUFfQ05UX1NUQVJUICsgKChkcSkgKiBDTjIzWFhfRE1BX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX0RNQV9JTlRfTEVWRUwoZHEpICAgICAgICAgICAgICAgIFwKKwkJKENOMjNYWF9ETUFfSU5UX0xFVkVMX1NUQVJUICsgKChkcSkgKiBDTjIzWFhfRE1BX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX0RNQV9QS1RfSU5UX0xFVkVMKGRxKSAgICAgICAgICAgIFwKKwkJKENOMjNYWF9ETUFfSU5UX0xFVkVMX1NUQVJUICsgKChkcSkgKiBDTjIzWFhfRE1BX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX0RNQV9USU1FX0lOVF9MRVZFTChkcSkgICAgICAgICAgIFwKKwkJKENOMjNYWF9ETUFfSU5UX0xFVkVMX1NUQVJUICsgNCArICgoZHEpICogQ04yM1hYX0RNQV9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9ETUFfVElNKGRxKSAgICAgICAgICAgICAgICAgICAgIFwKKwkJKENOMjNYWF9ETUFfVElNX1NUQVJUICsgKChkcSkgKiBDTjIzWFhfRE1BX09GRlNFVCkpCisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE1TSVggVEFCTEUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisKKyNkZWZpbmUJQ04yM1hYX01TSVhfVEFCTEVfQUREUl9TVEFSVAkJMHgwCisjZGVmaW5lCUNOMjNYWF9NU0lYX1RBQkxFX0RBVEFfU1RBUlQJCTB4OAorCisjZGVmaW5lCUNOMjNYWF9NU0lYX1RBQkxFX1NJWkUJCQkweDEwCisjZGVmaW5lCUNOMjNYWF9NU0lYX1RBQkxFX0VOVFJJRVMJCTB4NDEKKworI2RlZmluZSBDTjIzWFhfTVNJWF9FTlRSWV9WRUNUT1JfQ1RMCUJJVF9VTEwoMzIpCisKKyNkZWZpbmUJQ04yM1hYX01TSVhfVEFCTEVfQUREUihpZHgpCQlcCisJKENOMjNYWF9NU0lYX1RBQkxFX0FERFJfU1RBUlQgKyAoKGlkeCkgKiBDTjIzWFhfTVNJWF9UQUJMRV9TSVpFKSkKKworI2RlZmluZQlDTjIzWFhfTVNJWF9UQUJMRV9EQVRBKGlkeCkJCVwKKwkoQ04yM1hYX01TSVhfVEFCTEVfREFUQV9TVEFSVCArICgoaWR4KSAqIENOMjNYWF9NU0lYX1RBQkxFX1NJWkUpKQorCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlRFUlJVUFRTICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworI2RlZmluZSBDTjIzWFhfTUFDX0lOVF9PRkZTRVQgICAweDIwCisjZGVmaW5lIENOMjNYWF9QRl9JTlRfT0ZGU0VUICAgIDB4MTAKKworLyogMSByZWdpc3RlciAoNjQtYml0KSBmb3IgSW50ZXJydXB0IFN1bW1hcnkgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9JTlRfU1VNNjQgICAgICAgICAgICAweDI3MDAwCisKKy8qIDQgcmVnaXN0ZXJzICg2NC1iaXQpIGZvciBJbnRlcnJ1cHQgRW5hYmxlIGZvciBlYWNoIFBvcnQgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9JTlRfRU5CNjQgICAgICAgICAgICAweDI3MDgwCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9NQUNfUEZfSU5UX1NVTTY0KG1hYywgcGYpCQkJXAorCQkoQ04yM1hYX1NMSV9JTlRfU1VNNjQgKwkJCQlcCisJCSAoKG1hYykgKiBDTjIzWFhfTUFDX0lOVF9PRkZTRVQpICsJCVwKKwkJICgocGYpICogQ04yM1hYX1BGX0lOVF9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9TTElfTUFDX1BGX0lOVF9FTkI2NChtYWMsIHBmKQkJXAorCQkoQ04yM1hYX1NMSV9JTlRfRU5CNjQgKwkJCVwKKwkJICgobWFjKSAqIENOMjNYWF9NQUNfSU5UX09GRlNFVCkgKwlcCisJCSAoKHBmKSAqIENOMjNYWF9QRl9JTlRfT0ZGU0VUKSkKKworLyogMSByZWdpc3RlciAoNjQtYml0KSB0byBpbmRpY2F0ZSB3aGljaCBPdXRwdXQgUXVldWUgcmVhY2hlZCBwa3QgdGhyZXNob2xkICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfUEtUX0NOVF9JTlQgICAgICAgICAgICAgICAgMHgyOTEzMAorCisvKiAxIHJlZ2lzdGVyICg2NC1iaXQpIHRvIGluZGljYXRlIHdoaWNoIE91dHB1dCBRdWV1ZSByZWFjaGVkIHRpbWUgdGhyZXNob2xkICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfUEtUX1RJTUVfSU5UICAgICAgICAgICAgICAgMHgyOTE0MAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLSBJbnRlcnJ1cHQgTWFza3MgLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfUE9fSU5UCQkJQklUX1VMTCg2MykKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfUElfSU5UCQkJQklUX1VMTCg2MikKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfTUJPWF9JTlQJCQlCSVRfVUxMKDYxKQorI2RlZmluZSAgICBDTjIzWFhfSU5UUl9SRVNFTkQJCQlCSVRfVUxMKDYwKQorCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX0NJTlRfRU5CICAgICAgICAgICAgICAgICBCSVRfVUxMKDQ4KQorI2RlZmluZSAgICBDTjIzWFhfSU5UUl9NQk9YX0VOQiAgICAgICAgICAgICAgICAgQklUKDApCisKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfUk1MX1RJTUVPVVRfRVJSICAgICAgICAgICAoMSkKKworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9NSU9fSU5UICAgICAgICAgICAgICAgICAgIEJJVCgxKQorCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX1JFU0VSVkVEMSAgICAgICAgICAgICAgICAgKDMgPDwgMikKKworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9QS1RfQ09VTlQgICAgICAgICAgICAgICAgIEJJVCg0KQorI2RlZmluZSAgICBDTjIzWFhfSU5UUl9QS1RfVElNRSAgICAgICAgICAgICAgICAgIEJJVCg1KQorCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX1JFU0VSVkVEMiAgICAgICAgICAgICAgICAgKDMgPDwgNikKKworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9NMFVQQjBfRVJSICAgICAgICAgICAgICAgIEJJVCg4KQorI2RlZmluZSAgICBDTjIzWFhfSU5UUl9NMFVQV0lfRVJSICAgICAgICAgICAgICAgIEJJVCg5KQorI2RlZmluZSAgICBDTjIzWFhfSU5UUl9NMFVOQjBfRVJSICAgICAgICAgICAgICAgIEJJVCgxMCkKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfTTBVTldJX0VSUiAgICAgICAgICAgICAgICBCSVQoMTEpCisKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfUkVTRVJWRUQzICAgICAgICAgICAgICAgICAoMHhGRkZGRlVMTCA8PCAxMikKKworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9ETUEwX0ZPUkNFICAgICAgICAgICAgICAgIEJJVF9VTEwoMzIpCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX0RNQTFfRk9SQ0UgICAgICAgICAgICAgICAgQklUX1VMTCgzMykKKworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9ETUEwX0NPVU5UICAgICAgICAgICAgICAgIEJJVF9VTEwoMzQpCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX0RNQTFfQ09VTlQgICAgICAgICAgICAgICAgQklUX1VMTCgzNSkKKworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9ETUEwX1RJTUUgICAgICAgICAgICAgICAgIEJJVF9VTEwoMzYpCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX0RNQTFfVElNRSAgICAgICAgICAgICAgICAgQklUX1VMTCgzNykKKworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9SRVNFUlZFRDQgICAgICAgICAgICAgICAgICgweDdGRkZGVUxMIDw8IDM4KQorCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX1ZGX01CT1ggICAgICAgICAgICAgICAgICAgQklUX1VMTCg1NykKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfRE1BVkZfRVJSICAgICAgICAgICAgICAgICBCSVRfVUxMKDU4KQorI2RlZmluZSAgICBDTjIzWFhfSU5UUl9ETUFQRl9FUlIgICAgICAgICAgICAgICAgIEJJVF9VTEwoNTkpCisKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfUEtUVkZfRVJSICAgICAgICAgICAgICAgICBCSVRfVUxMKDYwKQorI2RlZmluZSAgICBDTjIzWFhfSU5UUl9QS1RQRl9FUlIgICAgICAgICAgICAgICAgIEJJVF9VTEwoNjEpCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX1BQVkZfRVJSICAgICAgICAgICAgICAgICAgQklUX1VMTCg2MikKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfUFBQRl9FUlIgICAgICAgICAgICAgICAgICBCSVRfVUxMKDYzKQorCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX0RNQTBfREFUQSAgICAgICAgICAgICAgICAgKENOMjNYWF9JTlRSX0RNQTBfVElNRSkKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfRE1BMV9EQVRBICAgICAgICAgICAgICAgICAoQ04yM1hYX0lOVFJfRE1BMV9USU1FKQorCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX0RNQV9EQVRBICAgICAgICAgICAgICAgICAgXAorCQkoQ04yM1hYX0lOVFJfRE1BMF9EQVRBIHwgQ04yM1hYX0lOVFJfRE1BMV9EQVRBKQorCisvKiBCeSBmYXVsdCBvbmx5IFRJTUUgYmFzZWQgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfUEtUX0RBVEEgICAgICAgICAgICAgICAgICAoQ04yM1hYX0lOVFJfUEtUX1RJTUUpCisvKiBGb3IgYm90aCBDT1VOVCBhbmQgVElNRSBiYXNlZCAqLworLyogI2RlZmluZSAgICBDTjIzWFhfSU5UUl9QS1RfREFUQSAgICAgICAgICAgICAgICAgIFwKKyAqIChDTjIzWFhfSU5UUl9QS1RfQ09VTlQgfCBDTjIzWFhfSU5UUl9QS1RfVElNRSkKKyAqLworCisvKiBTdW0gb2YgaW50ZXJydXB0cyBmb3IgYWxsIFBDSS1FeHByZXNzIERhdGEgSW50ZXJydXB0cyAqLworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9QQ0lFX0RBVEEgICAgICAgICAgICAgICAgIFwKKwkJKENOMjNYWF9JTlRSX0RNQV9EQVRBIHwgQ04yM1hYX0lOVFJfUEtUX0RBVCkKKworLyogU3VtIG9mIGludGVycnVwdHMgZm9yIGVycm9yIGV2ZW50cyAqLworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9FUlIJCQlcCisJCShDTjIzWFhfSU5UUl9NMFVQQjBfRVJSCXwJXAorCQkgQ04yM1hYX0lOVFJfTTBVUFdJX0VSUgl8CVwKKwkJIENOMjNYWF9JTlRSX00wVU5CMF9FUlIJfAlcCisJCSBDTjIzWFhfSU5UUl9NMFVOV0lfRVJSCXwJXAorCQkgQ04yM1hYX0lOVFJfRE1BVkZfRVJSCXwJXAorCQkgQ04yM1hYX0lOVFJfRE1BUEZfRVJSCXwJXAorCQkgQ04yM1hYX0lOVFJfUEtUUEZfRVJSCXwJXAorCQkgQ04yM1hYX0lOVFJfUFBQRl9FUlIJfAlcCisJCSBDTjIzWFhfSU5UUl9QUFZGX0VSUikKKworLyogUHJvZ3JhbW1lZCBNYXNrIGZvciBJbnRlcnJ1cHQgU3VtICovCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX01BU0sJCQlcCisJCShDTjIzWFhfSU5UUl9ETUFfREFUQQl8CVwKKwkJIENOMjNYWF9JTlRSX0RNQTBfRk9SQ0UJfAlcCisJCSBDTjIzWFhfSU5UUl9ETUExX0ZPUkNFCXwJXAorCQkgQ04yM1hYX0lOVFJfTUlPX0lOVAl8CVwKKwkJIENOMjNYWF9JTlRSX0VSUikKKworLyogNCBSZWdpc3RlcnMgKDY0IC0gYml0KSAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX1MyTV9QT1JUX0NUTF9TVEFSVCAgICAgICAgIDB4MjNEODAKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9TMk1fUE9SVFhfQ1RMKHBvcnQpCVwKKwkJKENOMjNYWF9TTElfUzJNX1BPUlRfQ1RMX1NUQVJUICsgKHBvcnQgKiAweDEwKSkKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX01BQ19OVU1CRVIgICAgICAgICAgICAgICAgIDB4MjAwNTAKKworLyoqIFBFTSgwLi4zKV9CQVIxX0lOREVYKDAuLjE1KWFkZHJlc3MgaXMgZGVmaW5lZCBhcworICogIGFkZHIgPSAoMHgwMDAxMTgwMEMwMDAwMTAwICB8cG9ydCA8PDI0IHxpZHggPDwzICkKKyAqICBIZXJlLCBwb3J0IGlzIFBFTSgwLi4zKSAmIGlkeCBpcyBJTkRFWCgwLi4xNSkKKyAqLworI2RlZmluZSAgICBDTjIzWFhfUEVNX0JBUjFfSU5ERVhfU1RBUlQgICAgICAgICAgICAgMHgwMDAxMTgwMEMwMDAwMTAwVUxMCisjZGVmaW5lICAgIENOMjNYWF9QRU1fT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSAgICBDTjIzWFhfQkFSMV9JTkRFWF9PRkZTRVQgICAgICAgICAgICAgICAgMworCisjZGVmaW5lICAgIENOMjNYWF9QRU1fQkFSMV9JTkRFWF9SRUcocG9ydCwgaWR4KQkJXAorCQkoQ04yM1hYX1BFTV9CQVIxX0lOREVYX1NUQVJUICsgKChwb3J0KSA8PCBDTjIzWFhfUEVNX09GRlNFVCkgKyBcCisJCSAoKGlkeCkgPDwgQ04yM1hYX0JBUjFfSU5ERVhfT0ZGU0VUKSkKKworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIERQSSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKworLyogMSByZWdpc3RlciAoNjQtYml0KSAtIHByb3ZpZGVzIERNQSBFbmFibGUgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9DVEwgICAgICAgICAgICAgICAgIDB4MDAwMWRmMDAwMDAwMDA0MFVMTAorCisvKiAxIHJlZ2lzdGVyICg2NC1iaXQpIC0gQ29udHJvbHMgdGhlIERNQSBJTyBPcGVyYXRpb24gKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9ETUFfQ09OVFJPTCAgICAgICAgIDB4MDAwMWRmMDAwMDAwMDA0OFVMTAorCisvKiAxIHJlZ2lzdGVyICg2NC1iaXQpIC0gUHJvdmlkZXMgRE1BIEluc3RyJ24gUXVldWUgRW5hYmxlICAqLworI2RlZmluZSAgICBDTjIzWFhfRFBJX1JFUV9HQkxfRU5CICAgICAgICAgMHgwMDAxZGYwMDAwMDAwMDUwVUxMCisKKy8qIDEgcmVnaXN0ZXIgKDY0LWJpdCkgLSBEUElfUkVRX0VSUl9SU1AKKyAqIEluZGljYXRlcyB3aGljaCBJbnN0ciduIFF1ZXVlIHJlY2VpdmVkIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIElPIHN1Yi1zeXN0ZW0KKyAqLworI2RlZmluZSAgICBDTjIzWFhfRFBJX1JFUV9FUlJfUlNQICAgICAgICAgMHgwMDAxZGYwMDAwMDAwMDU4VUxMCisKKy8qIDEgcmVnaXN0ZXIgKDY0LWJpdCkgLSBEUElfUkVRX0VSUl9SU1QKKyAqIEluZGljYXRlcyB3aGljaCBJbnN0ciduIFF1ZXVlIGRyb3BwZWQgYW4gSW5zdHInbgorICovCisjZGVmaW5lICAgIENOMjNYWF9EUElfUkVRX0VSUl9SU1QgICAgICAgICAweDAwMDFkZjAwMDAwMDAwNjBVTEwKKworLyogNiByZWdpc3RlciAoNjQtYml0KSAtIERQSV9ETUFfRU5HKDAuLjUpX0VOCisgKiBQcm92aWRlcyBETUEgRW5naW5lIFF1ZXVlIEVuYWJsZQorICovCisjZGVmaW5lICAgIENOMjNYWF9EUElfRE1BX0VORzBfRU5CICAgICAgICAweDAwMDFkZjAwMDAwMDAwODBVTEwKKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9ETUFfRU5HX0VOQihlbmcpIChDTjIzWFhfRFBJX0RNQV9FTkcwX0VOQiArIChlbmcgKiA4KSkKKworLyogOCByZWdpc3RlciAoNjQtYml0KSAtIERQSV9ETUEoMC4uNylfUkVRUV9DVEwKKyAqIFByb3ZpZGVzIGNvbnRyb2wgYml0cyBmb3IgdHJhbnNhY3Rpb24gb24gOCBRdWV1ZXMKKyAqLworI2RlZmluZSAgICBDTjIzWFhfRFBJX0RNQV9SRVFRMF9DVEwgICAgICAgMHgwMDAxZGYwMDAwMDAwMTgwVUxMCisjZGVmaW5lICAgIENOMjNYWF9EUElfRE1BX1JFUVFfQ1RMKHFfbm8pCVwKKwkJKENOMjNYWF9EUElfRE1BX1JFUVEwX0NUTCArIChxX25vICogOCkpCisKKy8qIDYgcmVnaXN0ZXIgKDY0LWJpdCkgLSBEUElfRU5HKDAuLjUpX0JVRgorICogUHJvdmlkZXMgRE1BIEVuZ2luZSBGSUZPIChRdWV1ZSkgU2l6ZQorICovCisjZGVmaW5lICAgIENOMjNYWF9EUElfRE1BX0VORzBfQlVGICAgICAgICAweDAwMDFkZjAwMDAwMDA4ODBVTEwKKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9ETUFfRU5HX0JVRihlbmcpICAgXAorCQkoQ04yM1hYX0RQSV9ETUFfRU5HMF9CVUYgKyAoZW5nICogOCkpCisKKy8qIDQgUmVnaXN0ZXJzICg2NC1iaXQpICovCisjZGVmaW5lICAgIENOMjNYWF9EUElfU0xJX1BSVF9DRkdfU1RBUlQgICAweDAwMDFkZjAwMDAwMDA5MDBVTEwKKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9TTElfUFJUWF9DRkcocG9ydCkgICAgICAgIFwKKwkJKENOMjNYWF9EUElfU0xJX1BSVF9DRkdfU1RBUlQgKyAocG9ydCAqIDB4OCkpCisKKy8qIE1hc2tzIGZvciBEUElfRE1BX0NPTlRST0wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9ETUFfQ09NTUlUX01PREUgICAgIEJJVF9VTEwoNTgpCisjZGVmaW5lICAgIENOMjNYWF9EUElfRE1BX1BLVF9FTiAgICAgICAgICBCSVRfVUxMKDU2KQorI2RlZmluZSAgICBDTjIzWFhfRFBJX0RNQV9FTkIgICAgICAgICAgICAgKDB4MEZVTEwgPDwgNDgpCisvKiBTZXQgdGhlIERNQSBDb250cm9sLCB0byB1cGRhdGUgcGFja2V0IGNvdW50IG5vdCBieXRlIGNvdW50IHNlbnQgYnkgRE1BLAorICogd2hlbiB3ZSB1c2UgSW50ZXJydXB0IENvYWxlc2NpbmcgKENBIG1vZGUpCisgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9ETUFfT19BREQxICAgICAgICAgIEJJVCgxOSkKKy8qc2VsZWN0aW5nIDY0LWJpdCBCeXRlIFN3YXAgTW9kZSAqLworI2RlZmluZSAgICBDTjIzWFhfRFBJX0RNQV9PX0VTICAgICAgICAgICAgQklUKDE1KQorI2RlZmluZSAgICBDTjIzWFhfRFBJX0RNQV9PX01PREUgICAgICAgICAgQklUKDE0KQorCisjZGVmaW5lICAgIENOMjNYWF9EUElfRE1BX0NUTF9NQVNLCQkJXAorCQkoQ04yM1hYX0RQSV9ETUFfQ09NTUlUX01PREUJfAlcCisJCSBDTjIzWFhfRFBJX0RNQV9QS1RfRU4JCXwJXAorCQkgQ04yM1hYX0RQSV9ETUFfT19FUwkJfAlcCisJCSBDTjIzWFhfRFBJX0RNQV9PX01PREUpCisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBSU1QgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisKKyNkZWZpbmUgICAgQ04yM1hYX1JTVF9CT09UICAgICAgICAgICAgMHgwMDAxMTgwMDA2MDAxNjAwVUxMCisjZGVmaW5lICAgIENOMjNYWF9SU1RfU09GVF9SU1QgICAgICAgIDB4MDAwMTE4MDAwNjAwMTY4MFVMTAorCisjZGVmaW5lICAgIENOMjNYWF9MTUMwX1JFU0VUX0NUTCAgICAgICAgICAgICAgIDB4MDAwMTE4MDA4ODAwMDE4MFVMTAorI2RlZmluZSAgICBDTjIzWFhfTE1DMF9SRVNFVF9DVExfRERSM1JTVF9NQVNLICAweDAwMDAwMDAwMDAwMDAwMDFVTEwKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY242Nnh4X2RldmljZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuNjZ4eF9kZXZpY2UuYwppbmRleCBjMDNkMzcwLi5lNzc5YWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY242Nnh4X2RldmljZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjY2eHhfZGV2aWNlLmMKQEAgLTMzOCw3ICszMzgsNyBAQAogCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjZYWFhfU0xJX1BLVF9DTlRfSU5UX0VOQiwgaW50cik7CiB9CiAKLXZvaWQgbGlvX2NuNnh4eF9lbmFibGVfaW9fcXVldWVzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCitpbnQgbGlvX2NuNnh4eF9lbmFibGVfaW9fcXVldWVzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCiB7CiAJdTMyIG1hc2s7CiAKQEAgLTM1Myw2ICszNTMsOCBAQAogCW1hc2sgPSBvY3Rlb25fcmVhZF9jc3Iob2N0LCBDTjZYWFhfU0xJX1BLVF9PVVRfRU5CKTsKIAltYXNrIHw9IG9jdC0+aW9fcW1hc2sub3E7CiAJb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENONlhYWF9TTElfUEtUX09VVF9FTkIsIG1hc2spOworCisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgbGlvX2NuNnh4eF9kaXNhYmxlX2lvX3F1ZXVlcyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQpAQCAtNDE4LDM2ICs0MjAsNiBAQAogCQlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ042WFhYX1NMSV9QS1RfVElNRV9JTlQsIGQzMik7CiB9CiAKLXZvaWQgbGlvX2NuNnh4eF9yZWluaXRfcmVncyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9PQ1RFT05fSU5TVFJfUVVFVUVTKG9jdCk7IGkrKykgewotCQlpZiAoIShvY3QtPmlvX3FtYXNrLmlxICYgKDFVTEwgPDwgaSkpKQotCQkJY29udGludWU7Ci0JCW9jdC0+Zm5fbGlzdC5zZXR1cF9pcV9yZWdzKG9jdCwgaSk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9PQ1RFT05fT1VUUFVUX1FVRVVFUyhvY3QpOyBpKyspIHsKLQkJaWYgKCEob2N0LT5pb19xbWFzay5vcSAmICgxVUxMIDw8IGkpKSkKLQkJCWNvbnRpbnVlOwotCQlvY3QtPmZuX2xpc3Quc2V0dXBfb3FfcmVncyhvY3QsIGkpOwotCX0KLQotCW9jdC0+Zm5fbGlzdC5zZXR1cF9kZXZpY2VfcmVncyhvY3QpOwotCi0Jb2N0LT5mbl9saXN0LmVuYWJsZV9pbnRlcnJ1cHQob2N0LT5jaGlwKTsKLQotCW9jdC0+Zm5fbGlzdC5lbmFibGVfaW9fcXVldWVzKG9jdCk7Ci0KLQkvKiBmb3IgKGkgPSAwOyBpIDwgb2N0LT5udW1fb3FzOyBpKyspIHsgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX09DVEVPTl9PVVRQVVRfUVVFVUVTKG9jdCk7IGkrKykgewotCQlpZiAoIShvY3QtPmlvX3FtYXNrLm9xICYgKDFVTEwgPDwgaSkpKQotCQkJY29udGludWU7Ci0JCXdyaXRlbChvY3QtPmRyb3FbaV0tPm1heF9jb3VudCwgb2N0LT5kcm9xW2ldLT5wa3RzX2NyZWRpdF9yZWcpOwotCX0KLX0KLQogdm9pZAogbGlvX2NuNnh4eF9iYXIxX2lkeF9zZXR1cChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LAogCQkJICB1NjQgY29yZV9hZGRyLApAQCAtNTA3LDE4ICs0NzksMjAgQEAKIAlyZXR1cm4gbmV3X2lkeDsKIH0KIAotdm9pZCBsaW9fY242eHh4X2VuYWJsZV9pbnRlcnJ1cHQodm9pZCAqY2hpcCkKK3ZvaWQgbGlvX2NuNnh4eF9lbmFibGVfaW50ZXJydXB0KHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsCisJCQkJIHU4IHVudXNlZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKIHsKLQlzdHJ1Y3Qgb2N0ZW9uX2NuNnh4eCAqY242eHh4ID0gKHN0cnVjdCBvY3Rlb25fY242eHh4ICopY2hpcDsKKwlzdHJ1Y3Qgb2N0ZW9uX2NuNnh4eCAqY242eHh4ID0gKHN0cnVjdCBvY3Rlb25fY242eHh4ICopb2N0LT5jaGlwOwogCXU2NCBtYXNrID0gY242eHh4LT5pbnRyX21hc2s2NCB8IENONlhYWF9JTlRSX0RNQTBfRk9SQ0U7CiAKIAkvKiBFbmFibGUgSW50ZXJydXB0ICovCiAJd3JpdGVxKG1hc2ssIGNuNnh4eC0+aW50cl9lbmJfcmVnNjQpOwogfQogCi12b2lkIGxpb19jbjZ4eHhfZGlzYWJsZV9pbnRlcnJ1cHQodm9pZCAqY2hpcCkKK3ZvaWQgbGlvX2NuNnh4eF9kaXNhYmxlX2ludGVycnVwdChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LAorCQkJCSAgdTggdW51c2VkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQogewotCXN0cnVjdCBvY3Rlb25fY242eHh4ICpjbjZ4eHggPSAoc3RydWN0IG9jdGVvbl9jbjZ4eHggKiljaGlwOworCXN0cnVjdCBvY3Rlb25fY242eHh4ICpjbjZ4eHggPSAoc3RydWN0IG9jdGVvbl9jbjZ4eHggKilvY3QtPmNoaXA7CiAKIAkvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KIAl3cml0ZXEoMCwgY242eHh4LT5pbnRyX2VuYl9yZWc2NCk7CkBAIC03MTQsNyArNjg4LDYgQEAKIAogCW9jdC0+Zm5fbGlzdC5zb2Z0X3Jlc2V0ID0gbGlvX2NuNnh4eF9zb2Z0X3Jlc2V0OwogCW9jdC0+Zm5fbGlzdC5zZXR1cF9kZXZpY2VfcmVncyA9IGxpb19jbjZ4eHhfc2V0dXBfZGV2aWNlX3JlZ3M7Ci0Jb2N0LT5mbl9saXN0LnJlaW5pdF9yZWdzID0gbGlvX2NuNnh4eF9yZWluaXRfcmVnczsKIAlvY3QtPmZuX2xpc3QudXBkYXRlX2lxX3JlYWRfaWR4ID0gbGlvX2NuNnh4eF91cGRhdGVfcmVhZF9pbmRleDsKIAogCW9jdC0+Zm5fbGlzdC5iYXIxX2lkeF9zZXR1cCA9IGxpb19jbjZ4eHhfYmFyMV9pZHhfc2V0dXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY242Nnh4X2RldmljZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuNjZ4eF9kZXZpY2UuaAppbmRleCAyOGM0NzIyLi5hNDBhOTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY242Nnh4X2RldmljZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjY2eHhfZGV2aWNlLmgKQEAgLTgwLDE4ICs4MCwxNyBAQAogdm9pZCBsaW9fY242eHh4X3NldHVwX2dsb2JhbF9vdXRwdXRfcmVncyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KTsKIHZvaWQgbGlvX2NuNnh4eF9zZXR1cF9pcV9yZWdzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHUzMiBpcV9ubyk7CiB2b2lkIGxpb19jbjZ4eHhfc2V0dXBfb3FfcmVncyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB1MzIgb3Ffbm8pOwotdm9pZCBsaW9fY242eHh4X2VuYWJsZV9pb19xdWV1ZXMoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCk7CitpbnQgbGlvX2NuNnh4eF9lbmFibGVfaW9fcXVldWVzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpOwogdm9pZCBsaW9fY242eHh4X2Rpc2FibGVfaW9fcXVldWVzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpOwogaXJxcmV0dXJuX3QgbGlvX2NuNnh4eF9wcm9jZXNzX2ludGVycnVwdF9yZWdzKHZvaWQgKmRldik7Ci12b2lkIGxpb19jbjZ4eHhfcmVpbml0X3JlZ3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCk7CiB2b2lkIGxpb19jbjZ4eHhfYmFyMV9pZHhfc2V0dXAoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdTY0IGNvcmVfYWRkciwKIAkJCSAgICAgICB1MzIgaWR4LCBpbnQgdmFsaWQpOwogdm9pZCBsaW9fY242eHh4X2JhcjFfaWR4X3dyaXRlKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHUzMiBpZHgsIHUzMiBtYXNrKTsKIHUzMiBsaW9fY242eHh4X2JhcjFfaWR4X3JlYWQoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdTMyIGlkeCk7CiB1MzIKIGxpb19jbjZ4eHhfdXBkYXRlX3JlYWRfaW5kZXgoc3RydWN0IG9jdGVvbl9pbnN0cl9xdWV1ZSAqaXEpOwotdm9pZCBsaW9fY242eHh4X2VuYWJsZV9pbnRlcnJ1cHQodm9pZCAqY2hpcCk7Ci12b2lkIGxpb19jbjZ4eHhfZGlzYWJsZV9pbnRlcnJ1cHQodm9pZCAqY2hpcCk7Cit2b2lkIGxpb19jbjZ4eHhfZW5hYmxlX2ludGVycnVwdChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB1OCB1bnVzZWQpOwordm9pZCBsaW9fY242eHh4X2Rpc2FibGVfaW50ZXJydXB0KHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHU4IHVudXNlZCk7CiB2b2lkIGNuNnh4eF9nZXRfcGNpZV9xbG1wb3J0KHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpOwogdm9pZCBsaW9fY242eHh4X3NldHVwX3JlZ19hZGRyZXNzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHZvaWQgKmNoaXAsCiAJCQkJICBzdHJ1Y3Qgb2N0ZW9uX3JlZ19saXN0ICpyZWdfbGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY242OHh4X2RldmljZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuNjh4eF9kZXZpY2UuYwppbmRleCAyOTc1NWJjNi4uZGJmMzU2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuNjh4eF9kZXZpY2UuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY242OHh4X2RldmljZS5jCkBAIC0xNDgsNyArMTQ4LDYgQEAKIAlvY3QtPmZuX2xpc3QucHJvY2Vzc19pbnRlcnJ1cHRfcmVncyA9IGxpb19jbjZ4eHhfcHJvY2Vzc19pbnRlcnJ1cHRfcmVnczsKIAlvY3QtPmZuX2xpc3Quc29mdF9yZXNldCA9IGxpb19jbjY4eHhfc29mdF9yZXNldDsKIAlvY3QtPmZuX2xpc3Quc2V0dXBfZGV2aWNlX3JlZ3MgPSBsaW9fY242OHh4X3NldHVwX2RldmljZV9yZWdzOwotCW9jdC0+Zm5fbGlzdC5yZWluaXRfcmVncyA9IGxpb19jbjZ4eHhfcmVpbml0X3JlZ3M7CiAJb2N0LT5mbl9saXN0LnVwZGF0ZV9pcV9yZWFkX2lkeCA9IGxpb19jbjZ4eHhfdXBkYXRlX3JlYWRfaW5kZXg7CiAKIAlvY3QtPmZuX2xpc3QuYmFyMV9pZHhfc2V0dXAgPSBsaW9fY242eHh4X2JhcjFfaWR4X3NldHVwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2xpb19jb3JlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vbGlvX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDFlZGRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2xpb19jb3JlLmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEF1dGhvcjogQ2F2aXVtLCBJbmMuCisqCisqIENvbnRhY3Q6IHN1cHBvcnRAY2F2aXVtLmNvbQorKiAgICAgICAgICBQbGVhc2UgaW5jbHVkZSAiTGlxdWlkSU8iIGluIHRoZSBzdWJqZWN0LgorKgorKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDYXZpdW0sIEluYy4KKyoKKyogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLCBhcworKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyoKKyogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorKiBBUy1JUyBhbmQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFLCBvcgorKiBOT05JTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisqIGRldGFpbHMuCisqCisqIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBhdmFpbGFibGUgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSBmcm9tIENhdml1bS4KKyogQ29udGFjdCBDYXZpdW0sIEluYy4gZm9yIG1vcmUgaW5mb3JtYXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgImxpcXVpZGlvX2NvbW1vbi5oIgorI2luY2x1ZGUgIm9jdGVvbl9kcm9xLmgiCisjaW5jbHVkZSAib2N0ZW9uX2lxLmgiCisjaW5jbHVkZSAicmVzcG9uc2VfbWFuYWdlci5oIgorI2luY2x1ZGUgIm9jdGVvbl9kZXZpY2UuaCIKKyNpbmNsdWRlICJvY3Rlb25fbmljLmgiCisjaW5jbHVkZSAib2N0ZW9uX21haW4uaCIKKyNpbmNsdWRlICJvY3Rlb25fbmV0d29yay5oIgorCitpbnQgbGlxdWlkaW9fc2V0X2ZlYXR1cmUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IGNtZCwgdTE2IHBhcmFtMSkKK3sKKwlzdHJ1Y3QgbGlvICpsaW8gPSBHRVRfTElPKG5ldGRldik7CisJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IGxpby0+b2N0X2RldjsKKwlzdHJ1Y3Qgb2N0bmljX2N0cmxfcGt0IG5jdHJsOworCWludCByZXQgPSAwOworCisJbWVtc2V0KCZuY3RybCwgMCwgc2l6ZW9mKHN0cnVjdCBvY3RuaWNfY3RybF9wa3QpKTsKKworCW5jdHJsLm5jbWQudTY0ID0gMDsKKwluY3RybC5uY21kLnMuY21kID0gY21kOworCW5jdHJsLm5jbWQucy5wYXJhbTEgPSBwYXJhbTE7CisJbmN0cmwuaXFfbm8gPSBsaW8tPmxpbmZvLnR4cGNpcVswXS5zLnFfbm87CisJbmN0cmwud2FpdF90aW1lID0gMTAwOworCW5jdHJsLm5ldHBuZGV2ID0gKHU2NCluZXRkZXY7CisJbmN0cmwuY2JfZm4gPSBsaXF1aWRpb19saW5rX2N0cmxfY21kX2NvbXBsZXRpb247CisKKwlyZXQgPSBvY3RuZXRfc2VuZF9uaWNfY3RybF9wa3QobGlvLT5vY3RfZGV2LCAmbmN0cmwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiRmVhdHVyZSBjaGFuZ2UgZmFpbGVkIGluIGNvcmUgKHJldDogMHgleClcbiIsCisJCQlyZXQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG9jdGVvbl9yZXBvcnRfdHhfY29tcGxldGlvbl90b19icWwodm9pZCAqdHhxLCB1bnNpZ25lZCBpbnQgcGt0c19jb21wbCwKKwkJCQkJdW5zaWduZWQgaW50IGJ5dGVzX2NvbXBsKQoreworCXN0cnVjdCBuZXRkZXZfcXVldWUgKm5ldGRldl9xdWV1ZSA9IHR4cTsKKworCW5ldGRldl90eF9jb21wbGV0ZWRfcXVldWUobmV0ZGV2X3F1ZXVlLCBwa3RzX2NvbXBsLCBieXRlc19jb21wbCk7Cit9CisKK3ZvaWQgb2N0ZW9uX3VwZGF0ZV90eF9jb21wbGV0aW9uX2NvdW50ZXJzKHZvaWQgKmJ1ZiwgaW50IHJlcXR5cGUsCisJCQkJCSAgdW5zaWduZWQgaW50ICpwa3RzX2NvbXBsLAorCQkJCQkgIHVuc2lnbmVkIGludCAqYnl0ZXNfY29tcGwpCit7CisJc3RydWN0IG9jdG5ldF9idWZfZnJlZV9pbmZvICpmaW5mbzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAqc2M7CisKKwlzd2l0Y2ggKHJlcXR5cGUpIHsKKwljYXNlIFJFUVRZUEVfTk9SRVNQX05FVDoKKwljYXNlIFJFUVRZUEVfTk9SRVNQX05FVF9TRzoKKwkJZmluZm8gPSBidWY7CisJCXNrYiA9IGZpbmZvLT5za2I7CisJCWJyZWFrOworCisJY2FzZSBSRVFUWVBFX1JFU1BfTkVUX1NHOgorCWNhc2UgUkVRVFlQRV9SRVNQX05FVDoKKwkJc2MgPSBidWY7CisJCXNrYiA9IHNjLT5jYWxsYmFja19hcmc7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCSgqcGt0c19jb21wbCkrKzsKKy8qVE9ETywgVXNlIHNvbWUgb3RoZXIgcG91bmQgZGVmaW5lIHRvIHN1Z2dlc3QKKyAqIHRoZSBmYWN0IHRoYXQgaXFzIGFyZSBub3QgdGllZCB0byBuZXRkZXZzCisgKiBhbmQgY2FuIHRha2UgdHJhZmZpYyBmcm9tIGRpZmZlcmVudCBuZXRkZXZzCisgKiBoZW5jZSBicWwgcmVwb3J0aW5nIGlzIGRvbmUgcGVyIHBhY2tldAorICogdGhhbiBpbiBidWxrLiBVc2FnZSBvZiBOT19OQVBJIGluIHR4cSBjb21wbGV0aW9uIGlzCisgKiBhIGxpdHRsZSBjb25mdXNpbmcKKyAqLworCSpieXRlc19jb21wbCArPSBza2ItPmxlbjsKK30KKwordm9pZCBvY3Rlb25fcmVwb3J0X3NlbnRfYnl0ZXNfdG9fYnFsKHZvaWQgKmJ1ZiwgaW50IHJlcXR5cGUpCit7CisJc3RydWN0IG9jdG5ldF9idWZfZnJlZV9pbmZvICpmaW5mbzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICpzYzsKKwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHE7CisKKwlzd2l0Y2ggKHJlcXR5cGUpIHsKKwljYXNlIFJFUVRZUEVfTk9SRVNQX05FVDoKKwljYXNlIFJFUVRZUEVfTk9SRVNQX05FVF9TRzoKKwkJZmluZm8gPSBidWY7CisJCXNrYiA9IGZpbmZvLT5za2I7CisJCWJyZWFrOworCisJY2FzZSBSRVFUWVBFX1JFU1BfTkVUX1NHOgorCWNhc2UgUkVRVFlQRV9SRVNQX05FVDoKKwkJc2MgPSBidWY7CisJCXNrYiA9IHNjLT5jYWxsYmFja19hcmc7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUoc2tiLT5kZXYsIHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpKTsKKwluZXRkZXZfdHhfc2VudF9xdWV1ZSh0eHEsIHNrYi0+bGVuKTsKK30KKwordm9pZCBsaXF1aWRpb19saW5rX2N0cmxfY21kX2NvbXBsZXRpb24odm9pZCAqbmN0cmxfcHRyKQoreworCXN0cnVjdCBvY3RuaWNfY3RybF9wa3QgKm5jdHJsID0gKHN0cnVjdCBvY3RuaWNfY3RybF9wa3QgKiluY3RybF9wdHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKW5jdHJsLT5uZXRwbmRldjsKKwlzdHJ1Y3QgbGlvICpsaW8gPSBHRVRfTElPKG5ldGRldik7CisJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IGxpby0+b2N0X2RldjsKKwl1OCAqbWFjOworCisJc3dpdGNoIChuY3RybC0+bmNtZC5zLmNtZCkgeworCWNhc2UgT0NUTkVUX0NNRF9DSEFOR0VfREVWRkxBR1M6CisJY2FzZSBPQ1RORVRfQ01EX1NFVF9NVUxUSV9MSVNUOgorCQlicmVhazsKKworCWNhc2UgT0NUTkVUX0NNRF9DSEFOR0VfTUFDQUREUjoKKwkJbWFjID0gKCh1OCAqKSZuY3RybC0+dWRkWzBdKSArIDI7CisJCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsCisJCQkgICAiTUFDQWRkciBjaGFuZ2VkIHRvICUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4XG4iLAorCQkJICAgbWFjWzBdLCBtYWNbMV0sCisJCQkgICBtYWNbMl0sIG1hY1szXSwKKwkJCSAgIG1hY1s0XSwgbWFjWzVdKTsKKwkJYnJlYWs7CisKKwljYXNlIE9DVE5FVF9DTURfQ0hBTkdFX01UVToKKwkJLyogSWYgY29tbWFuZCBpcyBzdWNjZXNzZnVsLCBjaGFuZ2UgdGhlIE1UVS4gKi8KKwkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwgIk1UVSBDaGFuZ2VkIGZyb20gJWQgdG8gJWRcbiIsCisJCQkgICBuZXRkZXYtPm10dSwgbmN0cmwtPm5jbWQucy5wYXJhbTEpOworCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBNVFUgQ2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLAorCQkJIG5ldGRldi0+bmFtZSwgbmV0ZGV2LT5tdHUsCisJCQkgbmN0cmwtPm5jbWQucy5wYXJhbTEpOworCQluZXRkZXYtPm10dSA9IG5jdHJsLT5uY21kLnMucGFyYW0xOworCQlxdWV1ZV9kZWxheWVkX3dvcmsobGlvLT5saW5rX3N0YXR1c193cS53cSwKKwkJCQkgICAmbGlvLT5saW5rX3N0YXR1c193cS53ay53b3JrLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIE9DVE5FVF9DTURfR1BJT19BQ0NFU1M6CisJCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsICJMRUQgRmxhc2hpbmcgdmlzdWFsIGlkZW50aWZpY2F0aW9uXG4iKTsKKworCQlicmVhazsKKworCWNhc2UgT0NUTkVUX0NNRF9JRF9BQ1RJVkU6CisJCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsICJMRUQgRmxhc2hpbmcgdmlzdWFsIGlkZW50aWZpY2F0aW9uXG4iKTsKKworCQlicmVhazsKKworCWNhc2UgT0NUTkVUX0NNRF9MUk9fRU5BQkxFOgorCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBMUk8gRW5hYmxlZFxuIiwgbmV0ZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisKKwljYXNlIE9DVE5FVF9DTURfTFJPX0RJU0FCTEU6CisJCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIExSTyBEaXNhYmxlZFxuIiwKKwkJCSBuZXRkZXYtPm5hbWUpOworCQlicmVhazsKKworCWNhc2UgT0NUTkVUX0NNRF9WRVJCT1NFX0VOQUJMRToKKwkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgRmlybXdhcmUgZGVidWcgZW5hYmxlZFxuIiwKKwkJCSBuZXRkZXYtPm5hbWUpOworCQlicmVhazsKKworCWNhc2UgT0NUTkVUX0NNRF9WRVJCT1NFX0RJU0FCTEU6CisJCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIEZpcm13YXJlIGRlYnVnIGRpc2FibGVkXG4iLAorCQkJIG5ldGRldi0+bmFtZSk7CisJCWJyZWFrOworCisJY2FzZSBPQ1RORVRfQ01EX0VOQUJMRV9WTEFOX0ZJTFRFUjoKKwkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgVkxBTiBmaWx0ZXIgZW5hYmxlZFxuIiwKKwkJCSBuZXRkZXYtPm5hbWUpOworCQlicmVhazsKKworCWNhc2UgT0NUTkVUX0NNRF9BRERfVkxBTl9GSUxURVI6CisJCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIFZMQU4gZmlsdGVyICVkIGFkZGVkXG4iLAorCQkJIG5ldGRldi0+bmFtZSwgbmN0cmwtPm5jbWQucy5wYXJhbTEpOworCQlicmVhazsKKworCWNhc2UgT0NUTkVUX0NNRF9ERUxfVkxBTl9GSUxURVI6CisJCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIFZMQU4gZmlsdGVyICVkIHJlbW92ZWRcbiIsCisJCQkgbmV0ZGV2LT5uYW1lLCBuY3RybC0+bmNtZC5zLnBhcmFtMSk7CisJCWJyZWFrOworCisJY2FzZSBPQ1RORVRfQ01EX1NFVF9TRVRUSU5HUzoKKwkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgc2V0dGluZ3MgY2hhbmdlZFxuIiwKKwkJCSBuZXRkZXYtPm5hbWUpOworCisJCWJyZWFrOworCisJLyogQ2FzZSB0byBoYW5kbGUgIk9DVE5FVF9DTURfVE5MX1JYX0NTVU1fQ1RMIgorCSAqIENvbW1hbmQgcGFzc2VkIGJ5IE5JQyBkcml2ZXIKKwkgKi8KKwljYXNlIE9DVE5FVF9DTURfVE5MX1JYX0NTVU1fQ1RMOgorCQlpZiAobmN0cmwtPm5jbWQucy5wYXJhbTEgPT0gT0NUTkVUX0NNRF9SWENTVU1fRU5BQkxFKSB7CisJCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LAorCQkJCSAgICJSWCBDaGVja3N1bSBPZmZsb2FkIEVuYWJsZWRcbiIpOworCQl9IGVsc2UgaWYgKG5jdHJsLT5uY21kLnMucGFyYW0xID09CisJCQkgICBPQ1RORVRfQ01EX1JYQ1NVTV9ESVNBQkxFKSB7CisJCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LAorCQkJCSAgICJSWCBDaGVja3N1bSBPZmZsb2FkIERpc2FibGVkXG4iKTsKKwkJfQorCQlicmVhazsKKworCQkvKiBDYXNlIHRvIGhhbmRsZSAiT0NUTkVUX0NNRF9UTkxfVFhfQ1NVTV9DVEwiCisJCSAqIENvbW1hbmQgcGFzc2VkIGJ5IE5JQyBkcml2ZXIKKwkJICovCisJY2FzZSBPQ1RORVRfQ01EX1ROTF9UWF9DU1VNX0NUTDoKKwkJaWYgKG5jdHJsLT5uY21kLnMucGFyYW0xID09IE9DVE5FVF9DTURfVFhDU1VNX0VOQUJMRSkgeworCQkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwKKwkJCQkgICAiVFggQ2hlY2tzdW0gT2ZmbG9hZCBFbmFibGVkXG4iKTsKKwkJfSBlbHNlIGlmIChuY3RybC0+bmNtZC5zLnBhcmFtMSA9PQorCQkJICAgT0NUTkVUX0NNRF9UWENTVU1fRElTQUJMRSkgeworCQkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwKKwkJCQkgICAiVFggQ2hlY2tzdW0gT2ZmbG9hZCBEaXNhYmxlZFxuIik7CisJCX0KKwkJYnJlYWs7CisKKwkJLyogQ2FzZSB0byBoYW5kbGUgIk9DVE5FVF9DTURfVlhMQU5fUE9SVF9DT05GSUciCisJCSAqIENvbW1hbmQgcGFzc2VkIGJ5IE5JQyBkcml2ZXIKKwkJICovCisJY2FzZSBPQ1RORVRfQ01EX1ZYTEFOX1BPUlRfQ09ORklHOgorCQlpZiAobmN0cmwtPm5jbWQucy5tb3JlID09IE9DVE5FVF9DTURfVlhMQU5fUE9SVF9BREQpIHsKKwkJCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsCisJCQkJICAgIlZ4TEFOIERlc3RpbmF0aW9uIFVEUCBQT1JUOiVkIEFEREVEXG4iLAorCQkJCSAgIG5jdHJsLT5uY21kLnMucGFyYW0xKTsKKwkJfSBlbHNlIGlmIChuY3RybC0+bmNtZC5zLm1vcmUgPT0KKwkJCSAgIE9DVE5FVF9DTURfVlhMQU5fUE9SVF9ERUwpIHsKKwkJCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsCisJCQkJICAgIlZ4TEFOIERlc3RpbmF0aW9uIFVEUCBQT1JUOiVkIERFTEVURURcbiIsCisJCQkJICAgbmN0cmwtPm5jbWQucy5wYXJhbTEpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPQ1RORVRfQ01EX1NFVF9GTE9XX0NUTDoKKwkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwgIlNldCBSWC9UWCBmbG93IGNvbnRyb2wgcGFyYW1ldGVyc1xuIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBVbmtub3duIGNtZCAlZFxuIiwgX19mdW5jX18sCisJCQluY3RybC0+bmNtZC5zLmNtZCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2xpb19ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vbGlvX2V0aHRvb2wuYwppbmRleCAyODllYjg5Li5mMTYzZTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vbGlvX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vbGlvX2V0aHRvb2wuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgIm9jdGVvbl9uZXR3b3JrLmgiCiAjaW5jbHVkZSAiY242Nnh4X3JlZ3MuaCIKICNpbmNsdWRlICJjbjY2eHhfZGV2aWNlLmgiCisjaW5jbHVkZSAiY24yM3h4X3BmX2RldmljZS5oIgogCiBzdGF0aWMgaW50IG9jdG5ldF9nZXRfbGlua19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIApAQCAtNzUsNiArNzYsNyBAQAogCiAjZGVmaW5lIEFSUkFZX0xFTkdUSChhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCiAjZGVmaW5lIE9DVF9FVEhUT09MX1JFR0RVTVBfTEVOICA0MDk2CisjZGVmaW5lIE9DVF9FVEhUT09MX1JFR0RVTVBfTEVOXzIzWFggICg0MDk2ICogMTEpCiAjZGVmaW5lIE9DVF9FVEhUT09MX1JFR1NWRVIgIDEKIAogLyogc3RhdGlzdGljcyBvZiBQRiAqLwpAQCAtMTg4LDYgKzE5MCwxMCBAQAogCSJidWZmZXJfYWxsb2NfZmFpbHVyZSIsCiB9OwogCisvKiBMaXF1aWRJTyBkcml2ZXIgcHJpdmF0ZSBmbGFncyAqLworc3RhdGljIGNvbnN0IGNoYXIgb2N0X3ByaXZfZmxhZ3Nfc3RyaW5nc1tdW0VUSF9HU1RSSU5HX0xFTl0gPSB7Cit9OworCiAjZGVmaW5lIE9DVE5JQ19OQ01EX0FVVE9ORUdfT04gIDB4MQogI2RlZmluZSBPQ1ROSUNfTkNNRF9QSFlfT04gICAgICAweDIKIApAQCAtMjU5LDYgKzI2NSwxMyBAQAogCQltYXhfdHggPSBDRkdfR0VUX0lRX01BWF9RKGNvbmY2eCk7CiAJCXJ4X2NvdW50ID0gQ0ZHX0dFVF9OVU1fUlhRU19OSUNfSUYoY29uZjZ4LCBsaW8tPmlmaWR4KTsKIAkJdHhfY291bnQgPSBDRkdfR0VUX05VTV9UWFFTX05JQ19JRihjb25mNngsIGxpby0+aWZpZHgpOworCX0gZWxzZSBpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKSB7CisJCXN0cnVjdCBvY3Rlb25fY29uZmlnICpjb25mMjMgPSBDSElQX0ZJRUxEKG9jdCwgY24yM3h4X3BmLCBjb25mKTsKKworCQltYXhfcnggPSBDRkdfR0VUX09RX01BWF9RKGNvbmYyMyk7CisJCW1heF90eCA9IENGR19HRVRfSVFfTUFYX1EoY29uZjIzKTsKKwkJcnhfY291bnQgPSBDRkdfR0VUX05VTV9SWFFTX05JQ19JRihjb25mMjMsIGxpby0+aWZpZHgpOworCQl0eF9jb3VudCA9IENGR19HRVRfTlVNX1RYUVNfTklDX0lGKGNvbmYyMywgbGlvLT5pZmlkeCk7CiAJfQogCiAJY2hhbm5lbC0+bWF4X3J4ID0gbWF4X3J4OwpAQCAtMjkwLDE4ICszMDMsMTYgQEAKIAlzdHJ1Y3QgbGlvICpsaW8gPSBHRVRfTElPKG5ldGRldik7CiAJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdF9kZXYgPSBsaW8tPm9jdF9kZXY7CiAJc3RydWN0IG9jdGVvbl9ib2FyZF9pbmZvICpib2FyZF9pbmZvOwotCWludCBsZW47CiAKLQlpZiAoZWVwcm9tLT5vZmZzZXQgIT0gMCkKKwlpZiAoZWVwcm9tLT5vZmZzZXQpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZWVwcm9tLT5tYWdpYyA9IG9jdF9kZXYtPnBjaV9kZXYtPnZlbmRvcjsKIAlib2FyZF9pbmZvID0gKHN0cnVjdCBvY3Rlb25fYm9hcmRfaW5mbyAqKSgmb2N0X2Rldi0+Ym9hcmRpbmZvKTsKLQlsZW4gPQotCQlzcHJpbnRmKChjaGFyICopYnl0ZXMsCi0JCQkiYm9hcmRuYW1lOiVzIHNlcmlhbG51bTolcyBtYWo6JWxsZCBtaW46JWxsZFxuIiwKLQkJCWJvYXJkX2luZm8tPm5hbWUsIGJvYXJkX2luZm8tPnNlcmlhbF9udW1iZXIsCi0JCQlib2FyZF9pbmZvLT5tYWpvciwgYm9hcmRfaW5mby0+bWlub3IpOworCXNwcmludGYoKGNoYXIgKilieXRlcywKKwkJImJvYXJkbmFtZTolcyBzZXJpYWxudW06JXMgbWFqOiVsbGQgbWluOiVsbGRcbiIsCisJCWJvYXJkX2luZm8tPm5hbWUsIGJvYXJkX2luZm8tPnNlcmlhbF9udW1iZXIsCisJCWJvYXJkX2luZm8tPm1ham9yLCBib2FyZF9pbmZvLT5taW5vcik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMzMyw2ICszNDQsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvY3RuZXRfaWRfYWN0aXZlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2YWwpCit7CisJc3RydWN0IGxpbyAqbGlvID0gR0VUX0xJTyhuZXRkZXYpOworCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSBsaW8tPm9jdF9kZXY7CisJc3RydWN0IG9jdG5pY19jdHJsX3BrdCBuY3RybDsKKwlpbnQgcmV0ID0gMDsKKworCW1lbXNldCgmbmN0cmwsIDAsIHNpemVvZihzdHJ1Y3Qgb2N0bmljX2N0cmxfcGt0KSk7CisKKwluY3RybC5uY21kLnU2NCA9IDA7CisJbmN0cmwubmNtZC5zLmNtZCA9IE9DVE5FVF9DTURfSURfQUNUSVZFOworCW5jdHJsLm5jbWQucy5wYXJhbTEgPSB2YWw7CisJbmN0cmwuaXFfbm8gPSBsaW8tPmxpbmZvLnR4cGNpcVswXS5zLnFfbm87CisJbmN0cmwud2FpdF90aW1lID0gMTAwOworCW5jdHJsLm5ldHBuZGV2ID0gKHU2NCluZXRkZXY7CisJbmN0cmwuY2JfZm4gPSBsaXF1aWRpb19saW5rX2N0cmxfY21kX2NvbXBsZXRpb247CisKKwlyZXQgPSBvY3RuZXRfc2VuZF9uaWNfY3RybF9wa3QobGlvLT5vY3RfZGV2LCAmbmN0cmwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBncGlvIHZhbHVlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qIENhbGxiYWNrIGZvciB3aGVuIG1kaW8gY29tbWFuZCByZXNwb25zZSBhcnJpdmVzCiAgKi8KIHN0YXRpYyB2b2lkIG9jdG5ldF9tZGlvX3Jlc3BfY2FsbGJhY2soc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwKQEAgLTQwNiw3ICs0NDMsNyBAQAogCQlkZXZfZXJyKCZvY3RfZGV2LT5wY2lfZGV2LT5kZXYsCiAJCQkib2N0bmV0X21kaW80NV9hY2Nlc3MgaW5zdHJ1Y3Rpb24gZmFpbGVkIHN0YXR1czogJXhcbiIsCiAJCQlyZXR2YWwpOwotCQlyZXR2YWwgPSAgLUVCVVNZOworCQlyZXR2YWwgPSAtRUJVU1k7CiAJfSBlbHNlIHsKIAkJLyogU2xlZXAgb24gYSB3YWl0IHF1ZXVlIHRpbGwgdGhlIGNvbmQgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUKIAkJICogcmVzcG9uc2UgYXJyaXZlZApAQCAtNDc2LDYgKzUxMywxMSBAQAogCQkJCQkJICAgJnZhbHVlKTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIGlmIChvY3QtPmNoaXBfaWQgPT0gT0NURU9OX0NOMjNYWF9QRl9WSUQpIHsKKwkJCW9jdG5ldF9pZF9hY3RpdmUobmV0ZGV2LCBMRURfSURFTlRJRklDQVRJT05fT04pOworCisJCQkvKiByZXR1cm5zIDAgc2luY2UgdXBkYXRlcyBhcmUgYXN5bmNocm9ub3VzICovCisJCQlyZXR1cm4gMDsKIAkJfSBlbHNlIHsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC01MjEsNyArNTYzLDEwIEBACiAJCQkJCQkgICAmbGlvLT5waHlfYmVhY29uX3ZhbCk7CiAJCQlpZiAocmV0KQogCQkJCXJldHVybiByZXQ7CisJCX0gZWxzZSBpZiAob2N0LT5jaGlwX2lkID09IE9DVEVPTl9DTjIzWFhfUEZfVklEKSB7CisJCQlvY3RuZXRfaWRfYWN0aXZlKG5ldGRldiwgTEVEX0lERU5USUZJQ0FUSU9OX09GRik7CiAKKwkJCXJldHVybiAwOwogCQl9IGVsc2UgewogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTU1MCw2ICs1OTUsMTMgQEAKIAkJcnhfbWF4X3BlbmRpbmcgPSBDTjZYWFhfTUFYX09RX0RFU0NSSVBUT1JTOwogCQlyeF9wZW5kaW5nID0gQ0ZHX0dFVF9OVU1fUlhfREVTQ1NfTklDX0lGKGNvbmY2eCwgbGlvLT5pZmlkeCk7CiAJCXR4X3BlbmRpbmcgPSBDRkdfR0VUX05VTV9UWF9ERVNDU19OSUNfSUYoY29uZjZ4LCBsaW8tPmlmaWR4KTsKKwl9IGVsc2UgaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkgeworCQlzdHJ1Y3Qgb2N0ZW9uX2NvbmZpZyAqY29uZjIzID0gQ0hJUF9GSUVMRChvY3QsIGNuMjN4eF9wZiwgY29uZik7CisKKwkJdHhfbWF4X3BlbmRpbmcgPSBDTjIzWFhfTUFYX0lRX0RFU0NSSVBUT1JTOworCQlyeF9tYXhfcGVuZGluZyA9IENOMjNYWF9NQVhfT1FfREVTQ1JJUFRPUlM7CisJCXJ4X3BlbmRpbmcgPSBDRkdfR0VUX05VTV9SWF9ERVNDU19OSUNfSUYoY29uZjIzLCBsaW8tPmlmaWR4KTsKKwkJdHhfcGVuZGluZyA9IENGR19HRVRfTlVNX1RYX0RFU0NTX05JQ19JRihjb25mMjMsIGxpby0+aWZpZHgpOwogCX0KIAogCWlmIChsaW8tPm10dSA+IE9DVE5FVF9ERUZBVUxUX0ZSTV9TSVpFIC0gT0NUTkVUX0ZSTV9IRUFERVJfU0laRSkgewpAQCAtNjEwLDYgKzY2Miw2OSBAQAogCXBhdXNlLT5yeF9wYXVzZSA9IG9jdC0+cnhfcGF1c2U7CiB9CiAKK3N0YXRpYyBpbnQKK2xpb19zZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICpwYXVzZSkKK3sKKwkvKiBOb3RlczogTm90IHN1cHBvcnRpbmcgYW55IGF1dG8gbmVnb3RpYXRpb24gaW4gdGhlc2UKKwkgKiBkcml2ZXJzLgorCSAqLworCXN0cnVjdCBsaW8gKmxpbyA9IEdFVF9MSU8obmV0ZGV2KTsKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gbGlvLT5vY3RfZGV2OworCXN0cnVjdCBvY3RuaWNfY3RybF9wa3QgbmN0cmw7CisJc3RydWN0IG9jdF9saW5rX2luZm8gKmxpbmZvID0gJmxpby0+bGluZm87CisKKwlpbnQgcmV0ID0gMDsKKworCWlmIChvY3QtPmNoaXBfaWQgIT0gT0NURU9OX0NOMjNYWF9QRl9WSUQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGxpbmZvLT5saW5rLnMuZHVwbGV4ID09IDApIHsKKwkJLypubyBmbG93IGNvbnRyb2wgZm9yIGhhbGYgZHVwbGV4Ki8KKwkJaWYgKHBhdXNlLT5yeF9wYXVzZSB8fCBwYXVzZS0+dHhfcGF1c2UpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKmRvIG5vdCBzdXBwb3J0IGF1dG9uZWcgb2YgbGluayBmbG93IGNvbnRyb2wqLworCWlmIChwYXVzZS0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoJm5jdHJsLCAwLCBzaXplb2Yoc3RydWN0IG9jdG5pY19jdHJsX3BrdCkpOworCisJbmN0cmwubmNtZC51NjQgPSAwOworCW5jdHJsLm5jbWQucy5jbWQgPSBPQ1RORVRfQ01EX1NFVF9GTE9XX0NUTDsKKwluY3RybC5pcV9ubyA9IGxpby0+bGluZm8udHhwY2lxWzBdLnMucV9ubzsKKwluY3RybC53YWl0X3RpbWUgPSAxMDA7CisJbmN0cmwubmV0cG5kZXYgPSAodTY0KW5ldGRldjsKKwluY3RybC5jYl9mbiA9IGxpcXVpZGlvX2xpbmtfY3RybF9jbWRfY29tcGxldGlvbjsKKworCWlmIChwYXVzZS0+cnhfcGF1c2UpIHsKKwkJLyplbmFibGUgcnggcGF1c2UqLworCQluY3RybC5uY21kLnMucGFyYW0xID0gMTsKKwl9IGVsc2UgeworCQkvKmRpc2FibGUgcnggcGF1c2UqLworCQluY3RybC5uY21kLnMucGFyYW0xID0gMDsKKwl9CisKKwlpZiAocGF1c2UtPnR4X3BhdXNlKSB7CisJCS8qZW5hYmxlIHR4IHBhdXNlKi8KKwkJbmN0cmwubmNtZC5zLnBhcmFtMiA9IDE7CisJfSBlbHNlIHsKKwkJLypkaXNhYmxlIHR4IHBhdXNlKi8KKwkJbmN0cmwubmNtZC5zLnBhcmFtMiA9IDA7CisJfQorCisJcmV0ID0gb2N0bmV0X3NlbmRfbmljX2N0cmxfcGt0KGxpby0+b2N0X2RldiwgJm5jdHJsKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIkZhaWxlZCB0byBzZXQgcGF1c2UgcGFyYW1ldGVyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb2N0LT5yeF9wYXVzZSA9IHBhdXNlLT5yeF9wYXVzZTsKKwlvY3QtPnR4X3BhdXNlID0gcGF1c2UtPnR4X3BhdXNlOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkCiBsaW9fZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkJICAgICAgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzICBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKQEAgLTg3Nyw2ICs5OTIsMjcgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGxpb19nZXRfcHJpdl9mbGFnc19zdHJpbmdzKHN0cnVjdCBsaW8gKmxpbywgdTggKmRhdGEpCit7CisJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdF9kZXYgPSBsaW8tPm9jdF9kZXY7CisJaW50IGk7CisKKwlzd2l0Y2ggKG9jdF9kZXYtPmNoaXBfaWQpIHsKKwljYXNlIE9DVEVPTl9DTjIzWFhfUEZfVklEOgorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvY3RfcHJpdl9mbGFnc19zdHJpbmdzKTsgaSsrKSB7CisJCQlzcHJpbnRmKGRhdGEsICIlcyIsIG9jdF9wcml2X2ZsYWdzX3N0cmluZ3NbaV0pOworCQkJZGF0YSArPSBFVEhfR1NUUklOR19MRU47CisJCX0KKwkJYnJlYWs7CisJY2FzZSBPQ1RFT05fQ042OFhYOgorCWNhc2UgT0NURU9OX0NONjZYWDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbmV0aWZfaW5mbyhsaW8sIGRydiwgbGlvLT5uZXRkZXYsICJVbmtub3duIENoaXAgISFcbiIpOworCQlicmVhazsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGxpb19nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqZGF0YSkKIHsKIAlzdHJ1Y3QgbGlvICpsaW8gPSBHRVRfTElPKG5ldGRldik7CkBAIC05MTYsMTIgKzEwNTIsMzEgQEAKIAkJfQogCQlicmVhazsKIAorCWNhc2UgRVRIX1NTX1BSSVZfRkxBR1M6CisJCWxpb19nZXRfcHJpdl9mbGFnc19zdHJpbmdzKGxpbywgZGF0YSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCW5ldGlmX2luZm8obGlvLCBkcnYsIGxpby0+bmV0ZGV2LCAiVW5rbm93biBTdHJpbmdzZXQgISFcbiIpOwogCQlicmVhazsKIAl9CiB9CiAKK3N0YXRpYyBpbnQgbGlvX2dldF9wcml2X2ZsYWdzX3NzX2NvdW50KHN0cnVjdCBsaW8gKmxpbykKK3sKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0X2RldiA9IGxpby0+b2N0X2RldjsKKworCXN3aXRjaCAob2N0X2Rldi0+Y2hpcF9pZCkgeworCWNhc2UgT0NURU9OX0NOMjNYWF9QRl9WSUQ6CisJCXJldHVybiBBUlJBWV9TSVpFKG9jdF9wcml2X2ZsYWdzX3N0cmluZ3MpOworCWNhc2UgT0NURU9OX0NONjhYWDoKKwljYXNlIE9DVEVPTl9DTjY2WFg6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlkZWZhdWx0OgorCQluZXRpZl9pbmZvKGxpbywgZHJ2LCBsaW8tPm5ldGRldiwgIlVua25vd24gQ2hpcCAhIVxuIik7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKIHN0YXRpYyBpbnQgbGlvX2dldF9zc2V0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBzc2V0KQogewogCXN0cnVjdCBsaW8gKmxpbyA9IEdFVF9MSU8obmV0ZGV2KTsKQEAgLTkzMiw2ICsxMDg3LDggQEAKIAkJcmV0dXJuIChBUlJBWV9TSVpFKG9jdF9zdGF0c19zdHJpbmdzKSArCiAJCQlBUlJBWV9TSVpFKG9jdF9pcV9zdGF0c19zdHJpbmdzKSAqIG9jdF9kZXYtPm51bV9pcXMgKwogCQkJQVJSQVlfU0laRShvY3RfZHJvcV9zdGF0c19zdHJpbmdzKSAqIG9jdF9kZXYtPm51bV9vcXMpOworCWNhc2UgRVRIX1NTX1BSSVZfRkxBR1M6CisJCXJldHVybiBsaW9fZ2V0X3ByaXZfZmxhZ3Nfc3NfY291bnQobGlvKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQpAQCAtOTQ4LDYgKzExMDUsMTYgQEAKIAlpbnRybW9kX2NmZyA9ICZvY3QtPmludHJtb2Q7CiAKIAlzd2l0Y2ggKG9jdC0+Y2hpcF9pZCkgeworCWNhc2UgT0NURU9OX0NOMjNYWF9QRl9WSUQ6CisJCWlmICghaW50cm1vZF9jZmctPnJ4X2VuYWJsZSkgeworCQkJaW50cl9jb2FsLT5yeF9jb2FsZXNjZV91c2VjcyA9IGludHJtb2RfY2ZnLT5yeF91c2VjczsKKwkJCWludHJfY29hbC0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPQorCQkJCWludHJtb2RfY2ZnLT5yeF9mcmFtZXM7CisJCX0KKwkJaWYgKCFpbnRybW9kX2NmZy0+dHhfZW5hYmxlKQorCQkJaW50cl9jb2FsLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9CisJCQkJaW50cm1vZF9jZmctPnR4X2ZyYW1lczsKKwkJYnJlYWs7CiAJY2FzZSBPQ1RFT05fQ042OFhYOgogCWNhc2UgT0NURU9OX0NONjZYWDogewogCQlzdHJ1Y3Qgb2N0ZW9uX2NuNnh4eCAqY242eHh4ID0KQEAgLTk4Myw3ICsxMTUwLDE1IEBACiAJCWludHJfY29hbC0+cnhfY29hbGVzY2VfdXNlY3NfbG93ID0KIAkJCWludHJtb2RfY2ZnLT5yeF9taW50bXJfdHJpZ2dlcjsKIAkJaW50cl9jb2FsLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19sb3cgPQotCQkJaW50cm1vZF9jZmctPnJ4X21pbmNudF90cmlnZ2VyOworCQkgICAgaW50cm1vZF9jZmctPnJ4X21pbmNudF90cmlnZ2VyOworCX0KKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpICYmCisJICAgIChpbnRybW9kX2NmZy0+dHhfZW5hYmxlKSkgeworCQlpbnRyX2NvYWwtPnVzZV9hZGFwdGl2ZV90eF9jb2FsZXNjZSA9IGludHJtb2RfY2ZnLT50eF9lbmFibGU7CisJCWludHJfY29hbC0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaGlnaCA9CisJCSAgICBpbnRybW9kX2NmZy0+dHhfbWF4Y250X3RyaWdnZXI7CisJCWludHJfY29hbC0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfbG93ID0KKwkJICAgIGludHJtb2RfY2ZnLT50eF9taW5jbnRfdHJpZ2dlcjsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xMDYwLDExICsxMjM1LDExIEBACiBvY3RuZXRfbmljX3N0YXRzX2NhbGxiYWNrKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3RfZGV2LAogCQkJICB1MzIgc3RhdHVzLCB2b2lkICpwdHIpCiB7Ci0Jc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgICpzYyA9IChzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAgKilwdHI7Ci0Jc3RydWN0IG9jdF9uaWNfc3RhdHNfcmVzcCAqcmVzcCA9IChzdHJ1Y3Qgb2N0X25pY19zdGF0c19yZXNwICopCi0JCXNjLT52aXJ0cnB0cjsKLQlzdHJ1Y3Qgb2N0X25pY19zdGF0c19jdHJsICpjdHJsID0gKHN0cnVjdCBvY3RfbmljX3N0YXRzX2N0cmwgKikKLQkJc2MtPmN0eHB0cjsKKwlzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAqc2MgPSAoc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgKilwdHI7CisJc3RydWN0IG9jdF9uaWNfc3RhdHNfcmVzcCAqcmVzcCA9CisJICAgIChzdHJ1Y3Qgb2N0X25pY19zdGF0c19yZXNwICopc2MtPnZpcnRycHRyOworCXN0cnVjdCBvY3RfbmljX3N0YXRzX2N0cmwgKmN0cmwgPQorCSAgICAoc3RydWN0IG9jdF9uaWNfc3RhdHNfY3RybCAqKXNjLT5jdHhwdHI7CiAJc3RydWN0IG5pY19yeF9zdGF0cyAqcnNwX3JzdGF0cyA9ICZyZXNwLT5zdGF0cy5mcm9td2lyZTsKIAlzdHJ1Y3QgbmljX3R4X3N0YXRzICpyc3BfdHN0YXRzID0gJnJlc3AtPnN0YXRzLmZyb21ob3N0OwogCkBAIC0xMzE0LDE0ICsxNDg5LDM1IEBACiAJCUNGR19TRVRfT1FfSU5UUl9QS1QoY242eHh4LT5jb25mLCByeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyk7CiAJCWJyZWFrOwogCX0KKwljYXNlIE9DVEVPTl9DTjIzWFhfUEZfVklEOiB7CisJCWludCBxX25vOworCisJCWlmICghaW50cl9jb2FsLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcykKKwkJCXJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gb2N0LT5pbnRybW9kLnJ4X2ZyYW1lczsKKwkJZWxzZQorCQkJcnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPQorCQkJICAgIGludHJfY29hbC0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXM7CisJCWZvciAocV9ubyA9IDA7IHFfbm8gPCBvY3QtPm51bV9vcXM7IHFfbm8rKykgeworCQkJcV9ubyArPSBvY3QtPnNyaW92X2luZm8ucGZfc3JuOworCQkJb2N0ZW9uX3dyaXRlX2NzcjY0KAorCQkJICAgIG9jdCwgQ04yM1hYX1NMSV9PUV9QS1RfSU5UX0xFVkVMUyhxX25vKSwKKwkJCSAgICAob2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkJIG9jdCwgQ04yM1hYX1NMSV9PUV9QS1RfSU5UX0xFVkVMUyhxX25vKSkgJgorCQkJICAgICAoMHgzZmZmZmYwMDAwMDAwMFVMKSkgfAorCQkJCXJ4X21heF9jb2FsZXNjZWRfZnJhbWVzKTsKKwkJCS8qY29uc2lkZXIgc2V0dGluZyByZXNlbmQgYml0Ki8KKwkJfQorCQlvY3QtPmludHJtb2QucnhfZnJhbWVzID0gcnhfbWF4X2NvYWxlc2NlZF9mcmFtZXM7CisJCWJyZWFrOworCX0KIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb2N0X2NmZ19yeF9pbnRydGltZShzdHJ1Y3QgbGlvICpsaW8sIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlCi0JCQkgICAgICAgKmludHJfY29hbCkKK3N0YXRpYyBpbnQgb2N0X2NmZ19yeF9pbnRydGltZShzdHJ1Y3QgbGlvICpsaW8sCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmludHJfY29hbCkKIHsKIAlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gbGlvLT5vY3RfZGV2OwogCXUzMiB0aW1lX3RocmVzaG9sZCwgcnhfY29hbGVzY2VfdXNlY3M7CkBAIC0xMzQ2LDYgKzE1NDIsMjcgQEAKIAkJQ0ZHX1NFVF9PUV9JTlRSX1RJTUUoY242eHh4LT5jb25mLCByeF9jb2FsZXNjZV91c2Vjcyk7CiAJCWJyZWFrOwogCX0KKwljYXNlIE9DVEVPTl9DTjIzWFhfUEZfVklEOiB7CisJCXU2NCB0aW1lX3RocmVzaG9sZDsKKwkJaW50IHFfbm87CisKKwkJaWYgKCFpbnRyX2NvYWwtPnJ4X2NvYWxlc2NlX3VzZWNzKQorCQkJcnhfY29hbGVzY2VfdXNlY3MgPSBvY3QtPmludHJtb2QucnhfdXNlY3M7CisJCWVsc2UKKwkJCXJ4X2NvYWxlc2NlX3VzZWNzID0gaW50cl9jb2FsLT5yeF9jb2FsZXNjZV91c2VjczsKKwkJdGltZV90aHJlc2hvbGQgPQorCQkgICAgY24yM3h4X3BmX2dldF9vcV90aWNrcyhvY3QsICh1MzIpcnhfY29hbGVzY2VfdXNlY3MpOworCQlmb3IgKHFfbm8gPSAwOyBxX25vIDwgb2N0LT5udW1fb3FzOyBxX25vKyspIHsKKwkJCXFfbm8gKz0gb2N0LT5zcmlvdl9pbmZvLnBmX3NybjsKKwkJCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsCisJCQkJCSAgIENOMjNYWF9TTElfT1FfUEtUX0lOVF9MRVZFTFMocV9ubyksCisJCQkJCSAgIChvY3QtPmludHJtb2QucnhfZnJhbWVzIHwKKwkJCQkJICAgICh0aW1lX3RocmVzaG9sZCA8PCAzMikpKTsKKwkJCS8qY29uc2lkZXIgd3JpdGluZyB0byByZXNlbmQgYml0IGhlcmUqLworCQl9CisJCW9jdC0+aW50cm1vZC5yeF91c2VjcyA9IHJ4X2NvYWxlc2NlX3VzZWNzOworCQlicmVhazsKKwl9CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTM1OCwxMiArMTU3NSwzNyBAQAogCQkgICBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKIHsKIAlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gbGlvLT5vY3RfZGV2OworCXUzMiBpcV9pbnRyX3BrdDsKKwl2b2lkIF9faW9tZW0gKmluc3RfY250X3JlZzsKKwl1NjQgdmFsOwogCiAJLyogQ29uZmlnIENudCBiYXNlZCBpbnRlcnJ1cHQgdmFsdWVzICovCiAJc3dpdGNoIChvY3QtPmNoaXBfaWQpIHsKIAljYXNlIE9DVEVPTl9DTjY4WFg6CiAJY2FzZSBPQ1RFT05fQ042NlhYOgogCQlicmVhazsKKwljYXNlIE9DVEVPTl9DTjIzWFhfUEZfVklEOiB7CisJCWludCBxX25vOworCisJCWlmICghaW50cl9jb2FsLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcykKKwkJCWlxX2ludHJfcGt0ID0gQ04yM1hYX0RFRl9JUV9JTlRSX1RIUkVTSE9MRCAmCisJCQkJICAgICAgQ04yM1hYX1BLVF9JTl9ET05FX1dNQVJLX01BU0s7CisJCWVsc2UKKwkJCWlxX2ludHJfcGt0ID0gaW50cl9jb2FsLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcyAmCisJCQkJICAgICAgQ04yM1hYX1BLVF9JTl9ET05FX1dNQVJLX01BU0s7CisJCWZvciAocV9ubyA9IDA7IHFfbm8gPCBvY3QtPm51bV9pcXM7IHFfbm8rKykgeworCQkJaW5zdF9jbnRfcmVnID0gKG9jdC0+aW5zdHJfcXVldWVbcV9ub10pLT5pbnN0X2NudF9yZWc7CisJCQl2YWwgPSByZWFkcShpbnN0X2NudF9yZWcpOworCQkJLypjbGVhciB3bWFyayBhbmQgY291bnQuZG9udCB3YW50IHRvIHdyaXRlIGNvdW50IGJhY2sqLworCQkJdmFsID0gKHZhbCAmIDB4RkZGRjAwMDAwMDAwMDAwMFVMTCkgfAorCQkJICAgICAgKCh1NjQpaXFfaW50cl9wa3QKKwkJCSAgICAgICA8PCBDTjIzWFhfUEtUX0lOX0RPTkVfV01BUktfQklUX1BPUyk7CisJCQl3cml0ZXEodmFsLCBpbnN0X2NudF9yZWcpOworCQkJLypjb25zaWRlciBzZXR0aW5nIHJlc2VuZCBiaXQqLworCQl9CisJCW9jdC0+aW50cm1vZC50eF9mcmFtZXMgPSBpcV9pbnRyX3BrdDsKKwkJYnJlYWs7CisJfQogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEzOTksNiArMTY0MSw4IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlicmVhazsKKwljYXNlIE9DVEVPTl9DTjIzWFhfUEZfVklEOgorCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNTQxLDkgKzE3ODUsMjM3IEBACiB9CiAKIC8qIFJldHVybiByZWdpc3RlciBkdW1wIGxlbi4gKi8KLXN0YXRpYyBpbnQgbGlvX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2IF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQorc3RhdGljIGludCBsaW9fZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIE9DVF9FVEhUT09MX1JFR0RVTVBfTEVOOworCXN0cnVjdCBsaW8gKmxpbyA9IEdFVF9MSU8oZGV2KTsKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gbGlvLT5vY3RfZGV2OworCisJc3dpdGNoIChvY3QtPmNoaXBfaWQpIHsKKwljYXNlIE9DVEVPTl9DTjIzWFhfUEZfVklEOgorCQlyZXR1cm4gT0NUX0VUSFRPT0xfUkVHRFVNUF9MRU5fMjNYWDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gT0NUX0VUSFRPT0xfUkVHRFVNUF9MRU47CisJfQorfQorCitzdGF0aWMgaW50IGNuMjN4eF9yZWFkX2Nzcl9yZWcoY2hhciAqcywgc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwl1MzIgcmVnOworCXU4IHBmX251bSA9IG9jdC0+cGZfbnVtOworCWludCBsZW4gPSAwOworCWludCBpOworCisJLyogUENJICBXaW5kb3cgUmVnaXN0ZXJzICovCisKKwlsZW4gKz0gc3ByaW50ZihzICsgbGVuLCAiXG5cdCBPY3Rlb24gQ1NSIFJlZ2lzdGVyc1xuXG4iKTsKKworCS8qMHgyOTAzMCBvciAweDI5MDQwKi8KKwlyZWcgPSBDTjIzWFhfU0xJX1BLVF9NQUNfUklORk82NChvY3QtPnBjaWVfcG9ydCwgb2N0LT5wZl9udW0pOworCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sCisJCSAgICAgICAiXG5bJTA4eF0gKFNMSV9QS1RfTUFDJWRfUEYlZF9SSU5GTyk6ICUwMTZsbHhcbiIsCisJCSAgICAgICByZWcsIG9jdC0+cGNpZV9wb3J0LCBvY3QtPnBmX251bSwKKwkJICAgICAgICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKworCS8qMHgyNzA4MCBvciAweDI3MDkwKi8KKwlyZWcgPSBDTjIzWFhfU0xJX01BQ19QRl9JTlRfRU5CNjQob2N0LT5wY2llX3BvcnQsIG9jdC0+cGZfbnVtKTsKKwlsZW4gKz0KKwkgICAgc3ByaW50ZihzICsgbGVuLCAiXG5bJTA4eF0gKFNMSV9NQUMlZF9QRiVkX0lOVF9FTkIpOiAlMDE2bGx4XG4iLAorCQkgICAgcmVnLCBvY3QtPnBjaWVfcG9ydCwgb2N0LT5wZl9udW0sCisJCSAgICAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisKKwkvKjB4MjcwMDAgb3IgMHgyNzAxMCovCisJcmVnID0gQ04yM1hYX1NMSV9NQUNfUEZfSU5UX1NVTTY0KG9jdC0+cGNpZV9wb3J0LCBvY3QtPnBmX251bSk7CisJbGVuICs9CisJICAgIHNwcmludGYocyArIGxlbiwgIlxuWyUwOHhdIChTTElfTUFDJWRfUEYlZF9JTlRfU1VNKTogJTAxNmxseFxuIiwKKwkJICAgIHJlZywgb2N0LT5wY2llX3BvcnQsIG9jdC0+cGZfbnVtLAorCQkgICAgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCisJLyoweDI5MTIwKi8KKwlyZWcgPSAweDI5MTIwOworCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sICJcblslMDh4XSAoU0xJX1BLVF9NRU1fQ1RMKTogJTAxNmxseFxuIiwgcmVnLAorCQkgICAgICAgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCisJLyoweDI3MzAwKi8KKwlyZWcgPSAweDI3MzAwICsgb2N0LT5wY2llX3BvcnQgKiBDTjIzWFhfTUFDX0lOVF9PRkZTRVQgKworCSAgICAgIChvY3QtPnBmX251bSkgKiBDTjIzWFhfUEZfSU5UX09GRlNFVDsKKwlsZW4gKz0gc3ByaW50ZigKKwkgICAgcyArIGxlbiwgIlxuWyUwOHhdIChTTElfTUFDJWRfUEYlZF9QS1RfVkZfSU5UKTogJTAxNmxseFxuIiwgcmVnLAorCSAgICBvY3QtPnBjaWVfcG9ydCwgb2N0LT5wZl9udW0sICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKworCS8qMHgyNzIwMCovCisJcmVnID0gMHgyNzIwMCArIG9jdC0+cGNpZV9wb3J0ICogQ04yM1hYX01BQ19JTlRfT0ZGU0VUICsKKwkgICAgICAob2N0LT5wZl9udW0pICogQ04yM1hYX1BGX0lOVF9PRkZTRVQ7CisJbGVuICs9IHNwcmludGYocyArIGxlbiwKKwkJICAgICAgICJcblslMDh4XSAoU0xJX01BQyVkX1BGJWRfUFBfVkZfSU5UKTogJTAxNmxseFxuIiwKKwkJICAgICAgIHJlZywgb2N0LT5wY2llX3BvcnQsIG9jdC0+cGZfbnVtLAorCQkgICAgICAgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCisJLyoyOTEzMCovCisJcmVnID0gQ04yM1hYX1NMSV9QS1RfQ05UX0lOVDsKKwlsZW4gKz0gc3ByaW50ZihzICsgbGVuLCAiXG5bJTA4eF0gKFNMSV9QS1RfQ05UX0lOVCk6ICUwMTZsbHhcbiIsIHJlZywKKwkJICAgICAgICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKworCS8qMHgyOTE0MCovCisJcmVnID0gQ04yM1hYX1NMSV9QS1RfVElNRV9JTlQ7CisJbGVuICs9IHNwcmludGYocyArIGxlbiwgIlxuWyUwOHhdIChTTElfUEtUX1RJTUVfSU5UKTogJTAxNmxseFxuIiwgcmVnLAorCQkgICAgICAgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCisJLyoweDI5MTYwKi8KKwlyZWcgPSAweDI5MTYwOworCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sICJcblslMDh4XSAoU0xJX1BLVF9JTlQpOiAlMDE2bGx4XG4iLCByZWcsCisJCSAgICAgICAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisKKwkvKjB4MjkxODAqLworCXJlZyA9IENOMjNYWF9TTElfT1FfV01BUks7CisJbGVuICs9IHNwcmludGYocyArIGxlbiwgIlxuWyUwOHhdIChTTElfUEtUX09VVFBVVF9XTUFSSyk6ICUwMTZsbHhcbiIsCisJCSAgICAgICByZWcsICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKworCS8qMHgyOTFFMCovCisJcmVnID0gQ04yM1hYX1NMSV9QS1RfSU9RX1JJTkdfUlNUOworCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sICJcblslMDh4XSAoU0xJX1BLVF9SSU5HX1JTVCk6ICUwMTZsbHhcbiIsIHJlZywKKwkJICAgICAgICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKworCS8qMHgyOTIxMCovCisJcmVnID0gQ04yM1hYX1NMSV9HQkxfQ09OVFJPTDsKKwlsZW4gKz0gc3ByaW50ZihzICsgbGVuLAorCQkgICAgICAgIlxuWyUwOHhdIChTTElfUEtUX0dCTF9DT05UUk9MKTogJTAxNmxseFxuIiwgcmVnLAorCQkgICAgICAgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCisJLyoweDI5MjIwKi8KKwlyZWcgPSAweDI5MjIwOworCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sICJcblslMDh4XSAoU0xJX1BLVF9CSVNUX1NUQVRVUyk6ICUwMTZsbHhcbiIsCisJCSAgICAgICByZWcsICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKworCS8qUEYgb25seSovCisJaWYgKHBmX251bSA9PSAwKSB7CisJCS8qMHgyOTI2MCovCisJCXJlZyA9IENOMjNYWF9TTElfT1VUX0JQX0VOX1cxUzsKKwkJbGVuICs9IHNwcmludGYocyArIGxlbiwKKwkJCSAgICAgICAiXG5bJTA4eF0gKFNMSV9QS1RfT1VUX0JQX0VOX1cxUyk6ICAlMDE2bGx4XG4iLAorCQkJICAgICAgIHJlZywgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCX0gZWxzZSBpZiAocGZfbnVtID09IDEpIHsKKwkJLyoweDI5MjcwKi8KKwkJcmVnID0gQ04yM1hYX1NMSV9PVVRfQlBfRU4yX1cxUzsKKwkJbGVuICs9IHNwcmludGYocyArIGxlbiwKKwkJCSAgICAgICAiXG5bJTA4eF0gKFNMSV9QS1RfT1VUX0JQX0VOMl9XMVMpOiAlMDE2bGx4XG4iLAorCQkJICAgICAgIHJlZywgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX09VVFBVVF9RVUVVRVM7IGkrKykgeworCQlyZWcgPSBDTjIzWFhfU0xJX09RX0JVRkZfSU5GT19TSVpFKGkpOworCQlsZW4gKz0KKwkJICAgIHNwcmludGYocyArIGxlbiwgIlxuWyUwOHhdIChTTElfUEtUJWRfT1VUX1NJWkUpOiAlMDE2bGx4XG4iLAorCQkJICAgIHJlZywgaSwgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCX0KKworCS8qMHgxMDA0MCovCisJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfSU5QVVRfUVVFVUVTOyBpKyspIHsKKwkJcmVnID0gQ04yM1hYX1NMSV9JUV9JTlNUUl9DT1VOVDY0KGkpOworCQlsZW4gKz0gc3ByaW50ZihzICsgbGVuLAorCQkJICAgICAgICJcblslMDh4XSAoU0xJX1BLVF9JTl9ET05FJWRfQ05UUyk6ICUwMTZsbHhcbiIsCisJCQkgICAgICAgcmVnLCBpLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisJfQorCisJLyoweDEwMDgwKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9PVVRQVVRfUVVFVUVTOyBpKyspIHsKKwkJcmVnID0gQ04yM1hYX1NMSV9PUV9QS1RTX0NSRURJVChpKTsKKwkJbGVuICs9IHNwcmludGYocyArIGxlbiwKKwkJCSAgICAgICAiXG5bJTA4eF0gKFNMSV9QS1QlZF9TTElTVF9CQU9GRl9EQkVMTCk6ICUwMTZsbHhcbiIsCisJCQkgICAgICAgcmVnLCBpLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisJfQorCisJLyoweDEwMDkwKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9PVVRQVVRfUVVFVUVTOyBpKyspIHsKKwkJcmVnID0gQ04yM1hYX1NMSV9PUV9TSVpFKGkpOworCQlsZW4gKz0gc3ByaW50ZigKKwkJICAgIHMgKyBsZW4sICJcblslMDh4XSAoU0xJX1BLVCVkX1NMSVNUX0ZJRk9fUlNJWkUpOiAlMDE2bGx4XG4iLAorCQkgICAgcmVnLCBpLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisJfQorCisJLyoweDEwMDUwKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9PVVRQVVRfUVVFVUVTOyBpKyspIHsKKwkJcmVnID0gQ04yM1hYX1NMSV9PUV9QS1RfQ09OVFJPTChpKTsKKwkJbGVuICs9IHNwcmludGYoCisJCQlzICsgbGVuLAorCQkJIlxuWyUwOHhdIChTTElfUEtUJWRfX09VVFBVVF9DT05UUk9MKTogJTAxNmxseFxuIiwKKwkJCXJlZywgaSwgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCX0KKworCS8qMHgxMDA3MCovCisJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfT1VUUFVUX1FVRVVFUzsgaSsrKSB7CisJCXJlZyA9IENOMjNYWF9TTElfT1FfQkFTRV9BRERSNjQoaSk7CisJCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sCisJCQkgICAgICAgIlxuWyUwOHhdIChTTElfUEtUJWRfU0xJU1RfQkFERFIpOiAlMDE2bGx4XG4iLAorCQkJICAgICAgIHJlZywgaSwgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCX0KKworCS8qMHgxMDBhMCovCisJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfT1VUUFVUX1FVRVVFUzsgaSsrKSB7CisJCXJlZyA9IENOMjNYWF9TTElfT1FfUEtUX0lOVF9MRVZFTFMoaSk7CisJCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sCisJCQkgICAgICAgIlxuWyUwOHhdIChTTElfUEtUJWRfSU5UX0xFVkVMUyk6ICUwMTZsbHhcbiIsCisJCQkgICAgICAgcmVnLCBpLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisJfQorCisJLyoweDEwMGIwKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9PVVRQVVRfUVVFVUVTOyBpKyspIHsKKwkJcmVnID0gQ04yM1hYX1NMSV9PUV9QS1RTX1NFTlQoaSk7CisJCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sICJcblslMDh4XSAoU0xJX1BLVCVkX0NOVFMpOiAlMDE2bGx4XG4iLAorCQkJICAgICAgIHJlZywgaSwgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCX0KKworCS8qMHgxMDBjMCovCisJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfT1VUUFVUX1FVRVVFUzsgaSsrKSB7CisJCXJlZyA9IDB4MTAwYzAgKyBpICogQ04yM1hYX09RX09GRlNFVDsKKwkJbGVuICs9IHNwcmludGYocyArIGxlbiwKKwkJCSAgICAgICAiXG5bJTA4eF0gKFNMSV9QS1QlZF9FUlJPUl9JTkZPKTogJTAxNmxseFxuIiwKKwkJCSAgICAgICByZWcsIGksICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKworCQkvKjB4MTAwMDAqLworCQlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9JTlBVVF9RVUVVRVM7IGkrKykgeworCQkJcmVnID0gQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KGkpOworCQkJbGVuICs9IHNwcmludGYoCisJCQkJcyArIGxlbiwKKwkJCQkiXG5bJTA4eF0gKFNMSV9QS1QlZF9JTlBVVF9DT05UUk9MKTogJTAxNmxseFxuIiwKKwkJCQlyZWcsIGksICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKwkJfQorCisJCS8qMHgxMDAxMCovCisJCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX0lOUFVUX1FVRVVFUzsgaSsrKSB7CisJCQlyZWcgPSBDTjIzWFhfU0xJX0lRX0JBU0VfQUREUjY0KGkpOworCQkJbGVuICs9IHNwcmludGYoCisJCQkgICAgcyArIGxlbiwKKwkJCSAgICAiXG5bJTA4eF0gKFNMSV9QS1QlZF9JTlNUUl9CQUREUik6ICUwMTZsbHhcbiIsIHJlZywKKwkJCSAgICBpLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisJCX0KKworCQkvKjB4MTAwMjAqLworCQlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9JTlBVVF9RVUVVRVM7IGkrKykgeworCQkJcmVnID0gQ04yM1hYX1NMSV9JUV9ET09SQkVMTChpKTsKKwkJCWxlbiArPSBzcHJpbnRmKAorCQkJICAgIHMgKyBsZW4sCisJCQkgICAgIlxuWyUwOHhdIChTTElfUEtUJWRfSU5TVFJfQkFPRkZfREJFTEwpOiAlMDE2bGx4XG4iLAorCQkJICAgIHJlZywgaSwgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCQl9CisKKwkJLyoweDEwMDMwKi8KKwkJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfSU5QVVRfUVVFVUVTOyBpKyspIHsKKwkJCXJlZyA9IENOMjNYWF9TTElfSVFfU0laRShpKTsKKwkJCWxlbiArPSBzcHJpbnRmKAorCQkJICAgIHMgKyBsZW4sCisJCQkgICAgIlxuWyUwOHhdIChTTElfUEtUJWRfSU5TVFJfRklGT19SU0laRSk6ICUwMTZsbHhcbiIsCisJCQkgICAgcmVnLCBpLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisJCX0KKworCQkvKjB4MTAwNDAqLworCQlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9JTlBVVF9RVUVVRVM7IGkrKykKKwkJCXJlZyA9IENOMjNYWF9TTElfSVFfSU5TVFJfQ09VTlQ2NChpKTsKKwkJbGVuICs9IHNwcmludGYocyArIGxlbiwKKwkJCSAgICAgICAiXG5bJTA4eF0gKFNMSV9QS1RfSU5fRE9ORSVkX0NOVFMpOiAlMDE2bGx4XG4iLAorCQkJICAgICAgIHJlZywgaSwgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCX0KKworCXJldHVybiBsZW47CiB9CiAKIHN0YXRpYyBpbnQgY242eHh4X3JlYWRfY3NyX3JlZyhjaGFyICpzLCBzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQpAQCAtMTY4OCw2ICsyMTYwLDEwIEBACiAJcmVncy0+dmVyc2lvbiA9IE9DVF9FVEhUT09MX1JFR1NWRVI7CiAKIAlzd2l0Y2ggKG9jdC0+Y2hpcF9pZCkgeworCWNhc2UgT0NURU9OX0NOMjNYWF9QRl9WSUQ6CisJCW1lbXNldChyZWdidWYsIDAsIE9DVF9FVEhUT09MX1JFR0RVTVBfTEVOXzIzWFgpOworCQlsZW4gKz0gY24yM3h4X3JlYWRfY3NyX3JlZyhyZWdidWYgKyBsZW4sIG9jdCk7CisJCWJyZWFrOwogCWNhc2UgT0NURU9OX0NONjhYWDoKIAljYXNlIE9DVEVPTl9DTjY2WFg6CiAJCW1lbXNldChyZWdidWYsIDAsIE9DVF9FVEhUT09MX1JFR0RVTVBfTEVOKTsKQEAgLTE3MjksNiArMjIwNSw3IEBACiAJLmdldF9zdHJpbmdzCQk9IGxpb19nZXRfc3RyaW5ncywKIAkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBsaW9fZ2V0X2V0aHRvb2xfc3RhdHMsCiAJLmdldF9wYXVzZXBhcmFtCQk9IGxpb19nZXRfcGF1c2VwYXJhbSwKKwkuc2V0X3BhdXNlcGFyYW0JCT0gbGlvX3NldF9wYXVzZXBhcmFtLAogCS5nZXRfcmVnc19sZW4JCT0gbGlvX2dldF9yZWdzX2xlbiwKIAkuZ2V0X3JlZ3MJCT0gbGlvX2dldF9yZWdzLAogCS5nZXRfbXNnbGV2ZWwJCT0gbGlvX2dldF9tc2dsZXZlbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9saW9fbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2xpb19tYWluLmMKaW5kZXggMjBkNjk0Mi4uYWZjNmY5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2xpb19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2xpb19tYWluLmMKQEAgLTIxLDExICsyMSwxMCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0X3RzdGFtcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cF9jbG9ja19rZXJuZWwuaD4KICNpbmNsdWRlIDxuZXQvdnhsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSAibGlxdWlkaW9fY29tbW9uLmgiCiAjaW5jbHVkZSAib2N0ZW9uX2Ryb3EuaCIKICNpbmNsdWRlICJvY3Rlb25faXEuaCIKQEAgLTM3LDYgKzM2LDcgQEAKICNpbmNsdWRlICJjbjY2eHhfcmVncy5oIgogI2luY2x1ZGUgImNuNjZ4eF9kZXZpY2UuaCIKICNpbmNsdWRlICJjbjY4eHhfZGV2aWNlLmgiCisjaW5jbHVkZSAiY24yM3h4X3BmX2RldmljZS5oIgogI2luY2x1ZGUgImxpcXVpZGlvX2ltYWdlLmgiCiAKIE1PRFVMRV9BVVRIT1IoIkNhdml1bSBOZXR3b3JrcywgPHN1cHBvcnRAY2F2aXVtLmNvbT4iKTsKQEAgLTUyLDExICs1Miw2IEBACiBNT0RVTEVfUEFSTV9ERVNDKGRkcl90aW1lb3V0LAogCQkgIk51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgRERSIGluaXRpYWxpemF0aW9uLiAwIHdhaXRzIGZvciBkZHJfdGltZW91dCB0byBiZSBzZXQgdG8gbm9uLXplcm8gdmFsdWUgYmVmb3JlIHN0YXJ0aW5nIHRvIGNoZWNrIik7CiAKLXN0YXRpYyB1MzIgY29uc29sZV9iaXRtYXNrOwotbW9kdWxlX3BhcmFtKGNvbnNvbGVfYml0bWFzaywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoY29uc29sZV9iaXRtYXNrLAotCQkgIkJpdG1hc2sgaW5kaWNhdGluZyB3aGljaCBjb25zb2xlcyBoYXZlIGRlYnVnIG91dHB1dCByZWRpcmVjdGVkIHRvIHN5c2xvZy4iKTsKLQogI2RlZmluZSBERUZBVUxUX01TR19FTkFCTEUgKE5FVElGX01TR19EUlYgfCBORVRJRl9NU0dfUFJPQkUgfCBORVRJRl9NU0dfTElOSykKIAogI2RlZmluZSBJTkNSX0lOU1RSUVVFVUVfUEtUX0NPVU5UKG9jdGVvbl9kZXZfcHRyLCBpcV9ubywgZmllbGQsIGNvdW50KSAgXApAQCAtMTAyLDYgKzk3LDE0IEBACiAJdTY0IHN0YXR1czsKIH07CiAKK3N0cnVjdCBsaXF1aWRpb19yeF9jdGxfY29udGV4dCB7CisJaW50IG9jdGVvbl9pZDsKKworCXdhaXRfcXVldWVfaGVhZF90IHdjOworCisJaW50IGNvbmQ7Cit9OworCiBzdHJ1Y3Qgb2N0X2xpbmtfc3RhdHVzX3Jlc3AgewogCXU2NCByaDsKIAlzdHJ1Y3Qgb2N0X2xpbmtfaW5mbyBsaW5rX2luZm87CkBAIC0xMzksNyArMTQyLDggQEAKICNkZWZpbmUgT0NUTklDX01BWF9TRyAgKE1BWF9TS0JfRlJBR1MpCiAKICNkZWZpbmUgT0NUTklDX0dTT19NQVhfSEVBREVSX1NJWkUgMTI4Ci0jZGVmaW5lIE9DVE5JQ19HU09fTUFYX1NJWkUgKEdTT19NQVhfU0laRSAtIE9DVE5JQ19HU09fTUFYX0hFQURFUl9TSVpFKQorI2RlZmluZSBPQ1ROSUNfR1NPX01BWF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoQ04yM1hYX0RFRkFVTFRfSU5QVVRfSkFCQkVSIC0gT0NUTklDX0dTT19NQVhfSEVBREVSX1NJWkUpCiAKIC8qKiBTdHJ1Y3R1cmUgb2YgYSBub2RlIGluIGxpc3Qgb2YgZ2F0aGVyIGNvbXBvbmVudHMgbWFpbnRhaW5lZCBieQogICogTklDIGRyaXZlciBmb3IgZWFjaCBuZXR3b3JrIGRldmljZS4KQEAgLTE2MiwyNyArMTY2LDYgQEAKIAl1NjQgc2dfZG1hX3B0cjsKIH07CiAKLS8qKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IE5JQyBkcml2ZXIgdG8gc3RvcmUgaW5mb3JtYXRpb24gcmVxdWlyZWQKLSAqIHRvIGZyZWUgdGhlIHNrX2J1ZmYgd2hlbiB0aGUgcGFja2V0IGhhcyBiZWVuIGZldGNoZWQgYnkgT2N0ZW9uLgotICogQnl0ZXMgb2Zmc2V0IGJlbG93IGFzc3VtZSB3b3JzdC1jYXNlIG9mIGEgNjQtYml0IHN5c3RlbS4KLSAqLwotc3RydWN0IG9jdG5ldF9idWZfZnJlZV9pbmZvIHsKLQkvKiogQnl0ZXMgMS04LiAgUG9pbnRlciB0byBuZXR3b3JrIGRldmljZSBwcml2YXRlIHN0cnVjdHVyZS4gKi8KLQlzdHJ1Y3QgbGlvICpsaW87Ci0KLQkvKiogQnl0ZXMgOS0xNi4gIFBvaW50ZXIgdG8gc2tfYnVmZi4gKi8KLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0JLyoqIEJ5dGVzIDE3LTI0LiAgUG9pbnRlciB0byBnYXRoZXIgbGlzdC4gKi8KLQlzdHJ1Y3Qgb2N0bmljX2dhdGhlciAqZzsKLQotCS8qKiBCeXRlcyAyNS0zMi4gUGh5c2ljYWwgYWRkcmVzcyBvZiBza2ItPmRhdGEgb3IgZ2F0aGVyIGxpc3QuICovCi0JdTY0IGRwdHI7Ci0KLQkvKiogQnl0ZXMgMzMtNDcuIFBpZ2d5YmFja2VkIHNvZnQgY29tbWFuZCwgaWYgYW55ICovCi0Jc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgKnNjOwotfTsKLQogc3RydWN0IGhhbmRzaGFrZSB7CiAJc3RydWN0IGNvbXBsZXRpb24gaW5pdDsKIAlzdHJ1Y3QgY29tcGxldGlvbiBzdGFydGVkOwpAQCAtMTk4LDYgKzE4MSw3IEBACiB9OwogCiBzdGF0aWMgaW50IG9jdGVvbl9kZXZpY2VfaW5pdChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqKTsKK3N0YXRpYyBpbnQgbGlxdWlkaW9fc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIHN0YXRpYyB2b2lkIGxpcXVpZGlvX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CiBzdGF0aWMgaW50IGxpcXVpZGlvX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKQEAgLTIxOSw2ICsyMDMsMjAgQEAKIAkJCWNvbnRpbnVlOwogCQlyZXNjaGVkdWxlIHw9IG9jdGVvbl9kcm9xX3Byb2Nlc3NfcGFja2V0cyhvY3QsIG9jdC0+ZHJvcVtxX25vXSwKIAkJCQkJCQkgIE1BWF9QQUNLRVRfQlVER0VUKTsKKwkJbGlvX2VuYWJsZV9pcnEob2N0LT5kcm9xW3Ffbm9dLCBOVUxMKTsKKworCQlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpICYmIG9jdC0+bXNpeF9vbikgeworCQkJLyogc2V0IHRpbWUgYW5kIGNudCBpbnRlcnJ1cHQgdGhyZXNob2xkcyBmb3IgdGhpcyBEUk9RCisJCQkgKiBmb3IgTkFQSQorCQkJICovCisJCQlpbnQgYWRqdXN0ZWRfcV9ubyA9IHFfbm8gKyBvY3QtPnNyaW92X2luZm8ucGZfc3JuOworCisJCQlvY3Rlb25fd3JpdGVfY3NyNjQoCisJCQkgICAgb2N0LCBDTjIzWFhfU0xJX09RX1BLVF9JTlRfTEVWRUxTKGFkanVzdGVkX3Ffbm8pLAorCQkJICAgIDB4NTcwMDAwMDA0MFVMTCk7CisJCQlvY3Rlb25fd3JpdGVfY3NyNjQoCisJCQkgICAgb2N0LCBDTjIzWFhfU0xJX09RX1BLVFNfU0VOVChhZGp1c3RlZF9xX25vKSwgMCk7CisJCX0KIAl9CiAKIAlpZiAocmVzY2hlZHVsZSkKQEAgLTI1Miw3NiArMjUwLDYgQEAKIAlyZXR1cm4gcGt0X2NudDsKIH0KIAotdm9pZCBvY3Rlb25fcmVwb3J0X3R4X2NvbXBsZXRpb25fdG9fYnFsKHZvaWQgKnR4cSwgdW5zaWduZWQgaW50IHBrdHNfY29tcGwsCi0JCQkJCXVuc2lnbmVkIGludCBieXRlc19jb21wbCkKLXsKLQlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpuZXRkZXZfcXVldWUgPSB0eHE7Ci0KLQluZXRkZXZfdHhfY29tcGxldGVkX3F1ZXVlKG5ldGRldl9xdWV1ZSwgcGt0c19jb21wbCwgYnl0ZXNfY29tcGwpOwotfQotCi12b2lkIG9jdGVvbl91cGRhdGVfdHhfY29tcGxldGlvbl9jb3VudGVycyh2b2lkICpidWYsIGludCByZXF0eXBlLAotCQkJCQkgIHVuc2lnbmVkIGludCAqcGt0c19jb21wbCwKLQkJCQkJICB1bnNpZ25lZCBpbnQgKmJ5dGVzX2NvbXBsKQotewotCXN0cnVjdCBvY3RuZXRfYnVmX2ZyZWVfaW5mbyAqZmluZm87Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7Ci0Jc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgKnNjOwotCi0Jc3dpdGNoIChyZXF0eXBlKSB7Ci0JY2FzZSBSRVFUWVBFX05PUkVTUF9ORVQ6Ci0JY2FzZSBSRVFUWVBFX05PUkVTUF9ORVRfU0c6Ci0JCWZpbmZvID0gYnVmOwotCQlza2IgPSBmaW5mby0+c2tiOwotCQlicmVhazsKLQotCWNhc2UgUkVRVFlQRV9SRVNQX05FVF9TRzoKLQljYXNlIFJFUVRZUEVfUkVTUF9ORVQ6Ci0JCXNjID0gYnVmOwotCQlza2IgPSBzYy0+Y2FsbGJhY2tfYXJnOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybjsKLQl9Ci0KLQkoKnBrdHNfY29tcGwpKys7Ci0JKmJ5dGVzX2NvbXBsICs9IHNrYi0+bGVuOwotfQotCi12b2lkIG9jdGVvbl9yZXBvcnRfc2VudF9ieXRlc190b19icWwodm9pZCAqYnVmLCBpbnQgcmVxdHlwZSkKLXsKLQlzdHJ1Y3Qgb2N0bmV0X2J1Zl9mcmVlX2luZm8gKmZpbmZvOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgKnNjOwotCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKLQotCXN3aXRjaCAocmVxdHlwZSkgewotCWNhc2UgUkVRVFlQRV9OT1JFU1BfTkVUOgotCWNhc2UgUkVRVFlQRV9OT1JFU1BfTkVUX1NHOgotCQlmaW5mbyA9IGJ1ZjsKLQkJc2tiID0gZmluZm8tPnNrYjsKLQkJYnJlYWs7Ci0KLQljYXNlIFJFUVRZUEVfUkVTUF9ORVRfU0c6Ci0JY2FzZSBSRVFUWVBFX1JFU1BfTkVUOgotCQlzYyA9IGJ1ZjsKLQkJc2tiID0gc2MtPmNhbGxiYWNrX2FyZzsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm47Ci0JfQotCi0JdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShza2ItPmRldiwgc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYikpOwotCW5ldGRldl90eF9zZW50X3F1ZXVlKHR4cSwgc2tiLT5sZW4pOwotfQotCi1pbnQgb2N0ZW9uX2NvbnNvbGVfZGVidWdfZW5hYmxlZCh1MzIgY29uc29sZSkKLXsKLQlyZXR1cm4gKGNvbnNvbGVfYml0bWFzayA+PiAoY29uc29sZSkpICYgMHgxOwotfQotCiAvKioKICAqIFxicmllZiBGb3JjZXMgYWxsIElPIHF1ZXVlcyBvZmYgb24gYSBnaXZlbiBkZXZpY2UKICAqIEBwYXJhbSBvY3QgUG9pbnRlciB0byBPY3Rlb24gZGV2aWNlCkBAIC00NDEsNyArMzY5LDcgQEAKIAlwY2lfZGlzYWJsZV9kZXZpY2Uob2N0LT5wY2lfZGV2KTsKIAogCS8qIERpc2FibGUgaW50ZXJydXB0cyAgKi8KLQlvY3QtPmZuX2xpc3QuZGlzYWJsZV9pbnRlcnJ1cHQob2N0LT5jaGlwKTsKKwlvY3QtPmZuX2xpc3QuZGlzYWJsZV9pbnRlcnJ1cHQob2N0LCBPQ1RFT05fQUxMX0lOVFIpOwogCiAJcGNpZXJyb3JfcXVpZXNjZV9kZXZpY2Uob2N0KTsKIApAQCAtNTcwLDYgKzQ5OCw5IEBACiAJeyAgICAgICAvKiA2Nnh4ICovCiAJCVBDSV9WRU5ET1JfSURfQ0FWSVVNLCAweDkyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwCiAJfSwKKwl7ICAgICAgIC8qIDIzeHggcGYgKi8KKwkJUENJX1ZFTkRPUl9JRF9DQVZJVU0sIDB4OTcwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMAorCX0sCiAJewogCQkwLCAwLCAwLCAwLCAwLCAwLCAwCiAJfQpAQCAtNTg3LDcgKzUxOCw2IEBACiAJLnN1c3BlbmQJPSBsaXF1aWRpb19zdXNwZW5kLAogCS5yZXN1bWUJCT0gbGlxdWlkaW9fcmVzdW1lLAogI2VuZGlmCi0KIH07CiAKIC8qKgpAQCAtOTM2LDYgKzg2Niw1MiBAQAogfQogCiAvKioKKyAqIFxicmllZiBSb3V0aW5lIHRvIG5vdGlmeSBNVFUgY2hhbmdlCisgKiBAcGFyYW0gd29yayB3b3JrX3N0cnVjdCBkYXRhIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBvY3RuZXRfbGlua19zdGF0dXNfY2hhbmdlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgY2F2aXVtX3drICp3ayA9IChzdHJ1Y3QgY2F2aXVtX3drICopd29yazsKKwlzdHJ1Y3QgbGlvICpsaW8gPSAoc3RydWN0IGxpbyAqKXdrLT5jdHhwdHI7CisKKwlydG5sX2xvY2soKTsKKwljYWxsX25ldGRldmljZV9ub3RpZmllcnMoTkVUREVWX0NIQU5HRU1UVSwgbGlvLT5uZXRkZXYpOworCXJ0bmxfdW5sb2NrKCk7Cit9CisKKy8qKgorICogXGJyaWVmIFNldHMgdXAgdGhlIG10dSBzdGF0dXMgY2hhbmdlIHdvcmsKKyAqIEBwYXJhbSBuZXRkZXYgbmV0d29yayBkZXZpY2UKKyAqLworc3RhdGljIGlubGluZSBpbnQgc2V0dXBfbGlua19zdGF0dXNfY2hhbmdlX3dxKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGxpbyAqbGlvID0gR0VUX0xJTyhuZXRkZXYpOworCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSBsaW8tPm9jdF9kZXY7CisKKwlsaW8tPmxpbmtfc3RhdHVzX3dxLndxID0gYWxsb2Nfd29ya3F1ZXVlKCJsaW5rLXN0YXR1cyIsCisJCQkJCQkgV1FfTUVNX1JFQ0xBSU0sIDApOworCWlmICghbGlvLT5saW5rX3N0YXR1c193cS53cSkgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgInVuYWJsZSB0byBjcmVhdGUgY2F2aXVtIGxpbmsgc3RhdHVzIHdxXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlJTklUX0RFTEFZRURfV09SSygmbGlvLT5saW5rX3N0YXR1c193cS53ay53b3JrLAorCQkJICBvY3RuZXRfbGlua19zdGF0dXNfY2hhbmdlKTsKKwlsaW8tPmxpbmtfc3RhdHVzX3dxLndrLmN0eHB0ciA9IGxpbzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYW51cF9saW5rX3N0YXR1c19jaGFuZ2Vfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbGlvICpsaW8gPSBHRVRfTElPKG5ldGRldik7CisKKwlpZiAobGlvLT5saW5rX3N0YXR1c193cS53cSkgeworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmxpby0+bGlua19zdGF0dXNfd3Eud2sud29yayk7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKGxpby0+bGlua19zdGF0dXNfd3Eud3EpOworCX0KK30KKworLyoqCiAgKiBcYnJpZWYgVXBkYXRlIGxpbmsgc3RhdHVzCiAgKiBAcGFyYW0gbmV0ZGV2IG5ldHdvcmsgZGV2aWNlCiAgKiBAcGFyYW0gbHMgbGluayBzdGF0dXMgc3RydWN0dXJlCkBAIC05NzMsOCArOTQ5LDYgQEAKIAlzdHJ1Y3QgbGlvICpsaW87CiAJc3RydWN0IG9jdGVvbl9pbnN0cl9xdWV1ZSAqaXEgPSBvY3QtPmluc3RyX3F1ZXVlW2lxX251bV07CiAKLQkvKm9jdGVvbl91cGRhdGVfaXFfcmVhZF9pZHgob2N0LCBpcSk7Ki8KLQogCW5ldGRldiA9IG9jdC0+cHJvcHNbaXEtPmlmaWR4XS5uZXRkZXY7CiAKIAkvKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBmaXJzdCBJUSBkb2VzIG5vdCBoYXZlCkBAIC0xMDAyLDEyICs5NzYsMzIgQEAKIAl9CiB9CiAKK3N0YXRpYworaW50IGxpcXVpZGlvX3NjaGVkdWxlX21zaXhfZHJvcV9wa3RfaGFuZGxlcihzdHJ1Y3Qgb2N0ZW9uX2Ryb3EgKmRyb3EsIHU2NCByZXQpCit7CisJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IGRyb3EtPm9jdF9kZXY7CisJc3RydWN0IG9jdGVvbl9kZXZpY2VfcHJpdiAqb2N0X3ByaXYgPQorCSAgICAoc3RydWN0IG9jdGVvbl9kZXZpY2VfcHJpdiAqKW9jdC0+cHJpdjsKKworCWlmIChkcm9xLT5vcHMucG9sbF9tb2RlKSB7CisJCWRyb3EtPm9wcy5uYXBpX2ZuKGRyb3EpOworCX0gZWxzZSB7CisJCWlmIChyZXQgJiBNU0lYX1BPX0lOVCkgeworCQkJdGFza2xldF9zY2hlZHVsZSgmb2N0X3ByaXYtPmRyb3FfdGFza2xldCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQkvKiB0aGlzIHdpbGwgYmUgZmx1c2hlZCBwZXJpb2RpY2FsbHkgYnkgY2hlY2sgaXEgZGIgKi8KKwkJaWYgKHJldCAmIE1TSVhfUElfSU5UKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCiAvKioKICAqIFxicmllZiBEcm9xIHBhY2tldCBwcm9jZXNzb3Igc2NlZHVsZXIKICAqIEBwYXJhbSBvY3Qgb2N0ZW9uIGRldmljZQogICovCi1zdGF0aWMKLXZvaWQgbGlxdWlkaW9fc2NoZWR1bGVfZHJvcV9wa3RfaGFuZGxlcnMoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3N0YXRpYyB2b2lkIGxpcXVpZGlvX3NjaGVkdWxlX2Ryb3FfcGt0X2hhbmRsZXJzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCiB7CiAJc3RydWN0IG9jdGVvbl9kZXZpY2VfcHJpdiAqb2N0X3ByaXYgPQogCQkoc3RydWN0IG9jdGVvbl9kZXZpY2VfcHJpdiAqKW9jdC0+cHJpdjsKQEAgLTEwMzIsMTkgKzEwMjYsMzYgQEAKIAl9CiB9CiAKK3N0YXRpYyBpcnFyZXR1cm5fdAorbGlxdWlkaW9fbXNpeF9pbnRyX2hhbmRsZXIoaW50IGlycSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgdm9pZCAqZGV2KQoreworCXU2NCByZXQ7CisJc3RydWN0IG9jdGVvbl9pb3FfdmVjdG9yICppb3FfdmVjdG9yID0gKHN0cnVjdCBvY3Rlb25faW9xX3ZlY3RvciAqKWRldjsKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gaW9xX3ZlY3Rvci0+b2N0X2RldjsKKwlzdHJ1Y3Qgb2N0ZW9uX2Ryb3EgKmRyb3EgPSBvY3QtPmRyb3FbaW9xX3ZlY3Rvci0+ZHJvcV9pbmRleF07CisKKwlyZXQgPSBvY3QtPmZuX2xpc3QubXNpeF9pbnRlcnJ1cHRfaGFuZGxlcihpb3FfdmVjdG9yKTsKKworCWlmICgocmV0ICYgTVNJWF9QT19JTlQpIHx8IChyZXQgJiBNU0lYX1BJX0lOVCkpCisJCWxpcXVpZGlvX3NjaGVkdWxlX21zaXhfZHJvcV9wa3RfaGFuZGxlcihkcm9xLCByZXQpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCiAvKioKICAqIFxicmllZiBJbnRlcnJ1cHQgaGFuZGxlciBmb3Igb2N0ZW9uCiAgKiBAcGFyYW0gaXJxIHVudXNlZAogICogQHBhcmFtIGRldiBvY3Rlb24gZGV2aWNlCiAgKi8KIHN0YXRpYwotaXJxcmV0dXJuX3QgbGlxdWlkaW9faW50cl9oYW5kbGVyKGludCBpcnEgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIHZvaWQgKmRldikKK2lycXJldHVybl90IGxpcXVpZGlvX2xlZ2FjeV9pbnRyX2hhbmRsZXIoaW50IGlycSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkJIHZvaWQgKmRldikKIHsKIAlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gKHN0cnVjdCBvY3Rlb25fZGV2aWNlICopZGV2OwogCWlycXJldHVybl90IHJldDsKIAogCS8qIERpc2FibGUgb3VyIGludGVycnVwdHMgZm9yIHRoZSBkdXJhdGlvbiBvZiBJU1IgKi8KLQlvY3QtPmZuX2xpc3QuZGlzYWJsZV9pbnRlcnJ1cHQob2N0LT5jaGlwKTsKKwlvY3QtPmZuX2xpc3QuZGlzYWJsZV9pbnRlcnJ1cHQob2N0LCBPQ1RFT05fQUxMX0lOVFIpOwogCiAJcmV0ID0gb2N0LT5mbl9saXN0LnByb2Nlc3NfaW50ZXJydXB0X3JlZ3Mob2N0KTsKIApAQCAtMTA1Myw3ICsxMDY0LDcgQEAKIAogCS8qIFJlLWVuYWJsZSBvdXIgaW50ZXJydXB0cyAgKi8KIAlpZiAoIShhdG9taWNfcmVhZCgmb2N0LT5zdGF0dXMpID09IE9DVF9ERVZfSU5fUkVTRVQpKQotCQlvY3QtPmZuX2xpc3QuZW5hYmxlX2ludGVycnVwdChvY3QtPmNoaXApOworCQlvY3QtPmZuX2xpc3QuZW5hYmxlX2ludGVycnVwdChvY3QsIE9DVEVPTl9BTExfSU5UUik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTA2NywyMiArMTA3OCwyMDQgQEAKIHN0YXRpYyBpbnQgb2N0ZW9uX3NldHVwX2ludGVycnVwdChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQogewogCWludCBpcnFyZXQsIGVycjsKKwlzdHJ1Y3QgbXNpeF9lbnRyeSAqbXNpeF9lbnRyaWVzOworCWludCBpOworCWludCBudW1faW9xX3ZlY3RvcnM7CisJaW50IG51bV9hbGxvY19pb3FfdmVjdG9yczsKIAotCWVyciA9IHBjaV9lbmFibGVfbXNpKG9jdC0+cGNpX2Rldik7Ci0JaWYgKGVycikKLQkJZGV2X3dhcm4oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiUmV2ZXJ0aW5nIHRvIGxlZ2FjeSBpbnRlcnJ1cHRzLiBFcnJvcjogJWRcbiIsCi0JCQkgZXJyKTsKLQllbHNlCi0JCW9jdC0+ZmxhZ3MgfD0gTElPX0ZMQUdfTVNJX0VOQUJMRUQ7CisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSAmJiBvY3QtPm1zaXhfb24pIHsKKwkJb2N0LT5udW1fbXNpeF9pcnFzID0gb2N0LT5zcmlvdl9pbmZvLm51bV9wZl9yaW5nczsKKwkJLyogb25lIG5vbiBpb3EgaW50ZXJydXB0IGZvciBoYW5kbGluZyBzbGlfbWFjX3BmX2ludF9zdW0gKi8KKwkJb2N0LT5udW1fbXNpeF9pcnFzICs9IDE7CiAKLQlpcnFyZXQgPSByZXF1ZXN0X2lycShvY3QtPnBjaV9kZXYtPmlycSwgbGlxdWlkaW9faW50cl9oYW5kbGVyLAotCQkJICAgICBJUlFGX1NIQVJFRCwgIm9jdGVvbiIsIG9jdCk7Ci0JaWYgKGlycXJldCkgewotCQlpZiAob2N0LT5mbGFncyAmIExJT19GTEFHX01TSV9FTkFCTEVEKQotCQkJcGNpX2Rpc2FibGVfbXNpKG9jdC0+cGNpX2Rldik7Ci0JCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiUmVxdWVzdCBJUlEgZmFpbGVkIHdpdGggY29kZTogJWRcbiIsCi0JCQlpcnFyZXQpOwotCQlyZXR1cm4gMTsKKwkJb2N0LT5tc2l4X2VudHJpZXMgPSBrY2FsbG9jKAorCQkgICAgb2N0LT5udW1fbXNpeF9pcnFzLCBzaXplb2Yoc3RydWN0IG1zaXhfZW50cnkpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFvY3QtPm1zaXhfZW50cmllcykKKwkJCXJldHVybiAxOworCisJCW1zaXhfZW50cmllcyA9IChzdHJ1Y3QgbXNpeF9lbnRyeSAqKW9jdC0+bXNpeF9lbnRyaWVzOworCQkvKkFzc3VtcHRpb24gaXMgdGhhdCBwZiBtc2l4IHZlY3RvcnMgc3RhcnQgZnJvbSBwZiBzcm4gdG8gcGYgdG8KKwkJICogdHJzIGFuZCBub3QgZnJvbSAwLiBpZiBub3QgY2hhbmdlIHRoaXMgY29kZQorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IG9jdC0+bnVtX21zaXhfaXJxcyAtIDE7IGkrKykKKwkJCW1zaXhfZW50cmllc1tpXS5lbnRyeSA9IG9jdC0+c3Jpb3ZfaW5mby5wZl9zcm4gKyBpOworCQltc2l4X2VudHJpZXNbb2N0LT5udW1fbXNpeF9pcnFzIC0gMV0uZW50cnkgPQorCQkgICAgb2N0LT5zcmlvdl9pbmZvLnRyczsKKwkJbnVtX2FsbG9jX2lvcV92ZWN0b3JzID0gcGNpX2VuYWJsZV9tc2l4X3JhbmdlKAorCQkJCQkJb2N0LT5wY2lfZGV2LCBtc2l4X2VudHJpZXMsCisJCQkJCQlvY3QtPm51bV9tc2l4X2lycXMsCisJCQkJCQlvY3QtPm51bV9tc2l4X2lycXMpOworCQlpZiAobnVtX2FsbG9jX2lvcV92ZWN0b3JzIDwgMCkgeworCQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJ1bmFibGUgdG8gQWxsb2NhdGUgTVNJLVggaW50ZXJydXB0c1xuIik7CisJCQlrZnJlZShvY3QtPm1zaXhfZW50cmllcyk7CisJCQlvY3QtPm1zaXhfZW50cmllcyA9IE5VTEw7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIk9DVEVPTjogRW5vdWdoIE1TSS1YIGludGVycnVwdHMgYXJlIGFsbG9jYXRlZC4uLlxuIik7CisKKwkJbnVtX2lvcV92ZWN0b3JzID0gb2N0LT5udW1fbXNpeF9pcnFzOworCisJCS8qKiBGb3IgUEYsIHRoZXJlIGlzIG9uZSBub24taW9xIGludGVycnVwdCBoYW5kbGVyICovCisJCW51bV9pb3FfdmVjdG9ycyAtPSAxOworCQlpcnFyZXQgPSByZXF1ZXN0X2lycShtc2l4X2VudHJpZXNbbnVtX2lvcV92ZWN0b3JzXS52ZWN0b3IsCisJCQkJICAgICBsaXF1aWRpb19sZWdhY3lfaW50cl9oYW5kbGVyLCAwLCAib2N0ZW9uIiwKKwkJCQkgICAgIG9jdCk7CisJCWlmIChpcnFyZXQpIHsKKwkJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LAorCQkJCSJPQ1RFT046IFJlcXVlc3RfaXJxIGZhaWxlZCBmb3IgTVNJWCBpbnRlcnJ1cHQgRXJyb3I6ICVkXG4iLAorCQkJCWlycXJldCk7CisJCQlwY2lfZGlzYWJsZV9tc2l4KG9jdC0+cGNpX2Rldik7CisJCQlrZnJlZShvY3QtPm1zaXhfZW50cmllcyk7CisJCQlvY3QtPm1zaXhfZW50cmllcyA9IE5VTEw7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBudW1faW9xX3ZlY3RvcnM7IGkrKykgeworCQkJaXJxcmV0ID0gcmVxdWVzdF9pcnEobXNpeF9lbnRyaWVzW2ldLnZlY3RvciwKKwkJCQkJICAgICBsaXF1aWRpb19tc2l4X2ludHJfaGFuZGxlciwgMCwKKwkJCQkJICAgICAib2N0ZW9uIiwgJm9jdC0+aW9xX3ZlY3RvcltpXSk7CisJCQlpZiAoaXJxcmV0KSB7CisJCQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsCisJCQkJCSJPQ1RFT046IFJlcXVlc3RfaXJxIGZhaWxlZCBmb3IgTVNJWCBpbnRlcnJ1cHQgRXJyb3I6ICVkXG4iLAorCQkJCQlpcnFyZXQpOworCQkJCS8qKiBGcmVlaW5nIHRoZSBub24taW9xIGlycSB2ZWN0b3IgaGVyZSAuICovCisJCQkJZnJlZV9pcnEobXNpeF9lbnRyaWVzW251bV9pb3FfdmVjdG9yc10udmVjdG9yLAorCQkJCQkgb2N0KTsKKworCQkJCXdoaWxlIChpKSB7CisJCQkJCWktLTsKKwkJCQkJLyoqIGNsZWFyaW5nIGFmZmluaXR5IG1hc2suICovCisJCQkJCWlycV9zZXRfYWZmaW5pdHlfaGludCgKKwkJCQkJCW1zaXhfZW50cmllc1tpXS52ZWN0b3IsIE5VTEwpOworCQkJCQlmcmVlX2lycShtc2l4X2VudHJpZXNbaV0udmVjdG9yLAorCQkJCQkJICZvY3QtPmlvcV92ZWN0b3JbaV0pOworCQkJCX0KKwkJCQlwY2lfZGlzYWJsZV9tc2l4KG9jdC0+cGNpX2Rldik7CisJCQkJa2ZyZWUob2N0LT5tc2l4X2VudHJpZXMpOworCQkJCW9jdC0+bXNpeF9lbnRyaWVzID0gTlVMTDsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCW9jdC0+aW9xX3ZlY3RvcltpXS52ZWN0b3IgPSBtc2l4X2VudHJpZXNbaV0udmVjdG9yOworCQkJLyogYXNzaWduIHRoZSBjcHUgbWFzayBmb3IgdGhpcyBtc2l4IGludGVycnVwdCB2ZWN0b3IgKi8KKwkJCWlycV9zZXRfYWZmaW5pdHlfaGludCgKKwkJCQkJbXNpeF9lbnRyaWVzW2ldLnZlY3RvciwKKwkJCQkJKCZvY3QtPmlvcV92ZWN0b3JbaV0uYWZmaW5pdHlfbWFzaykpOworCQl9CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiT0NURU9OWyVkXTogTVNJLVggZW5hYmxlZFxuIiwKKwkJCW9jdC0+b2N0ZW9uX2lkKTsKKwl9IGVsc2UgeworCQllcnIgPSBwY2lfZW5hYmxlX21zaShvY3QtPnBjaV9kZXYpOworCQlpZiAoZXJyKQorCQkJZGV2X3dhcm4oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiUmV2ZXJ0aW5nIHRvIGxlZ2FjeSBpbnRlcnJ1cHRzLiBFcnJvcjogJWRcbiIsCisJCQkJIGVycik7CisJCWVsc2UKKwkJCW9jdC0+ZmxhZ3MgfD0gTElPX0ZMQUdfTVNJX0VOQUJMRUQ7CisKKwkJaXJxcmV0ID0gcmVxdWVzdF9pcnEob2N0LT5wY2lfZGV2LT5pcnEsCisJCQkJICAgICBsaXF1aWRpb19sZWdhY3lfaW50cl9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKKwkJCQkgICAgICJvY3Rlb24iLCBvY3QpOworCQlpZiAoaXJxcmV0KSB7CisJCQlpZiAob2N0LT5mbGFncyAmIExJT19GTEFHX01TSV9FTkFCTEVEKQorCQkJCXBjaV9kaXNhYmxlX21zaShvY3QtPnBjaV9kZXYpOworCQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJSZXF1ZXN0IElSUSBmYWlsZWQgd2l0aCBjb2RlOiAlZFxuIiwKKwkJCQlpcnFyZXQpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGlxdWlkaW9fd2F0Y2hkb2codm9pZCAqcGFyYW0pCit7CisJdTY0IHdkb2c7CisJdTE2IG1hc2tfb2Zfc3R1Y2tfY29yZXMgPSAwOworCXUxNiBtYXNrX29mX2NyYXNoZWRfY29yZXMgPSAwOworCWludCBjb3JlX251bTsKKwl1OCBjb3JlX2lzX3N0dWNrW0xJT19NQVhfQ09SRVNdOworCXU4IGNvcmVfY3Jhc2hlZFtMSU9fTUFYX0NPUkVTXTsKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gcGFyYW07CisKKwltZW1zZXQoY29yZV9pc19zdHVjaywgMCwgc2l6ZW9mKGNvcmVfaXNfc3R1Y2spKTsKKwltZW1zZXQoY29yZV9jcmFzaGVkLCAwLCBzaXplb2YoY29yZV9jcmFzaGVkKSk7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQltYXNrX29mX2NyYXNoZWRfY29yZXMgPQorCQkgICAgKHUxNilvY3Rlb25fcmVhZF9jc3I2NChvY3QsIENOMjNYWF9TTElfU0NSQVRDSDIpOworCisJCWZvciAoY29yZV9udW0gPSAwOyBjb3JlX251bSA8IExJT19NQVhfQ09SRVM7IGNvcmVfbnVtKyspIHsKKwkJCWlmICghY29yZV9pc19zdHVja1tjb3JlX251bV0pIHsKKwkJCQl3ZG9nID0gbGlvX3BjaV9yZWFkcShvY3QsIENJVTNfV0RPRyhjb3JlX251bSkpOworCisJCQkJLyogbG9vayBhdCB3YXRjaGRvZyBzdGF0ZSBmaWVsZCAqLworCQkJCXdkb2cgJj0gQ0lVM19XRE9HX01BU0s7CisJCQkJaWYgKHdkb2cpIHsKKwkJCQkJLyogdGhpcyB3YXRjaGRvZyB0aW1lciBoYXMgZXhwaXJlZCAqLworCQkJCQljb3JlX2lzX3N0dWNrW2NvcmVfbnVtXSA9CisJCQkJCQlMSU9fTU9OSVRPUl9XRE9HX0VYUElSRTsKKwkJCQkJbWFza19vZl9zdHVja19jb3JlcyB8PSAoMSA8PCBjb3JlX251bSk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIWNvcmVfY3Jhc2hlZFtjb3JlX251bV0pCisJCQkJY29yZV9jcmFzaGVkW2NvcmVfbnVtXSA9CisJCQkJICAgIChtYXNrX29mX2NyYXNoZWRfY29yZXMgPj4gY29yZV9udW0pICYgMTsKKwkJfQorCisJCWlmIChtYXNrX29mX3N0dWNrX2NvcmVzKSB7CisJCQlmb3IgKGNvcmVfbnVtID0gMDsgY29yZV9udW0gPCBMSU9fTUFYX0NPUkVTOworCQkJICAgICBjb3JlX251bSsrKSB7CisJCQkJaWYgKGNvcmVfaXNfc3R1Y2tbY29yZV9udW1dID09IDEpIHsKKwkJCQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsCisJCQkJCQkiRVJST1I6IE9jdGVvbiBjb3JlICVkIGlzIHN0dWNrIVxuIiwKKwkJCQkJCWNvcmVfbnVtKTsKKwkJCQkJLyogMiBtZWFucyB3ZSBoYXZlIHByaW50aydkICBhbiBlcnJvcgorCQkJCQkgKiBzbyBubyBuZWVkIHRvIHJlcGVhdCB0aGUgc2FtZSBwcmludGsKKwkJCQkJICovCisJCQkJCWNvcmVfaXNfc3R1Y2tbY29yZV9udW1dID0KKwkJCQkJCUxJT19NT05JVE9SX0NPUkVfU1RVQ0tfTVNHRDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAobWFza19vZl9jcmFzaGVkX2NvcmVzKSB7CisJCQlmb3IgKGNvcmVfbnVtID0gMDsgY29yZV9udW0gPCBMSU9fTUFYX0NPUkVTOworCQkJICAgICBjb3JlX251bSsrKSB7CisJCQkJaWYgKGNvcmVfY3Jhc2hlZFtjb3JlX251bV0gPT0gMSkgeworCQkJCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwKKwkJCQkJCSJFUlJPUjogT2N0ZW9uIGNvcmUgJWQgY3Jhc2hlZCEgIFNlZSBvY3QtZndkdW1wIGZvciBkZXRhaWxzLlxuIiwKKwkJCQkJCWNvcmVfbnVtKTsKKwkJCQkJLyogMiBtZWFucyB3ZSBoYXZlIHByaW50aydkICBhbiBlcnJvcgorCQkJCQkgKiBzbyBubyBuZWVkIHRvIHJlcGVhdCB0aGUgc2FtZSBwcmludGsKKwkJCQkJICovCisJCQkJCWNvcmVfY3Jhc2hlZFtjb3JlX251bV0gPQorCQkJCQkJTElPX01PTklUT1JfQ09SRV9TVFVDS19NU0dEOworCQkJCX0KKwkJCX0KKwkJfQorI2lmZGVmIENPTkZJR19NT0RVTEVfVU5MT0FECisJCWlmIChtYXNrX29mX3N0dWNrX2NvcmVzIHx8IG1hc2tfb2ZfY3Jhc2hlZF9jb3JlcykgeworCQkJLyogbWFrZSBtb2R1bGUgcmVmY291bnQ9MCBzbyB0aGF0IHJtbW9kIHdpbGwgd29yayAqLworCQkJbG9uZyByZWZjb3VudDsKKworCQkJcmVmY291bnQgPSBtb2R1bGVfcmVmY291bnQoVEhJU19NT0RVTEUpOworCisJCQl3aGlsZSAocmVmY291bnQgPiAwKSB7CisJCQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJCQkJcmVmY291bnQgPSBtb2R1bGVfcmVmY291bnQoVEhJU19NT0RVTEUpOworCQkJfQorCisJCQkvKiBjb21wZW5zYXRlIGZvciBhbmQgd2l0aHN0YW5kIGFuIHVubGlrZWx5IChidXQgc3RpbGwKKwkJCSAqIHBvc3NpYmxlKSByYWNlIGNvbmRpdGlvbgorCQkJICovCisJCQl3aGlsZSAocmVmY291bnQgPCAwKSB7CisJCQkJdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCQkJCXJlZmNvdW50ID0gbW9kdWxlX3JlZmNvdW50KFRISVNfTU9EVUxFKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCS8qIHNsZWVwIGZvciB0d28gc2Vjb25kcyAqLworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDIgKiBIWik7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMTA3LDYgKzEzMDAsOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwlpZiAocGRldi0+ZGV2aWNlID09IE9DVEVPTl9DTjIzWFhfUEZfVklEKQorCQlvY3RfZGV2LT5tc2l4X29uID0gTElPX0ZMQUdfTVNJWF9FTkFCTEVEOworCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIkluaXRpYWxpemluZyBkZXZpY2UgJXg6JXguXG4iLAogCQkgKHUzMilwZGV2LT52ZW5kb3IsICh1MzIpcGRldi0+ZGV2aWNlKTsKIApAQCAtMTEzMCw2ICsxMzI2LDMwIEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdF9kZXYpKSB7CisJCXU2NCBzY3JhdGNoMTsKKwkJdTggYnVzLCBkZXZpY2UsIGZ1bmN0aW9uOworCisJCXNjcmF0Y2gxID0gb2N0ZW9uX3JlYWRfY3NyNjQob2N0X2RldiwgQ04yM1hYX1NMSV9TQ1JBVENIMSk7CisJCWlmICghKHNjcmF0Y2gxICYgNFVMTCkpIHsKKwkJCS8qIEJpdCAyIG9mIFNMSV9TQ1JBVENIXzEgaXMgYSBmbGFnIHRoYXQgaW5kaWNhdGVzIHRoYXQKKwkJCSAqIHRoZSBsaW8gd2F0Y2hkb2cga2VybmVsIHRocmVhZCBpcyBydW5uaW5nIGZvciB0aGlzCisJCQkgKiBOSUMuICBFYWNoIE5JQyBnZXRzIG9uZSB3YXRjaGRvZyBrZXJuZWwgdGhyZWFkLgorCQkJICovCisJCQlzY3JhdGNoMSB8PSA0VUxMOworCQkJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdF9kZXYsIENOMjNYWF9TTElfU0NSQVRDSDEsCisJCQkJCSAgIHNjcmF0Y2gxKTsKKworCQkJYnVzID0gcGRldi0+YnVzLT5udW1iZXI7CisJCQlkZXZpY2UgPSBQQ0lfU0xPVChwZGV2LT5kZXZmbik7CisJCQlmdW5jdGlvbiA9IFBDSV9GVU5DKHBkZXYtPmRldmZuKTsKKwkJCW9jdF9kZXYtPndhdGNoZG9nX3Rhc2sgPSBrdGhyZWFkX2NyZWF0ZSgKKwkJCSAgICBsaXF1aWRpb193YXRjaGRvZywgb2N0X2RldiwKKwkJCSAgICAibGlvd2QvJTAyaGh4OiUwMmhoeC4laGh4IiwgYnVzLCBkZXZpY2UsIGZ1bmN0aW9uKTsKKwkJCXdha2VfdXBfcHJvY2VzcyhvY3RfZGV2LT53YXRjaGRvZ190YXNrKTsKKwkJfQorCX0KKwogCW9jdF9kZXYtPnJ4X3BhdXNlID0gMTsKIAlvY3RfZGV2LT50eF9wYXVzZSA9IDE7CiAKQEAgLTExNDYsNiArMTM2Niw3IEBACiBzdGF0aWMgdm9pZCBvY3Rlb25fZGVzdHJveV9yZXNvdXJjZXMoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKIHsKIAlpbnQgaTsKKwlzdHJ1Y3QgbXNpeF9lbnRyeSAqbXNpeF9lbnRyaWVzOwogCXN0cnVjdCBvY3Rlb25fZGV2aWNlX3ByaXYgKm9jdF9wcml2ID0KIAkJKHN0cnVjdCBvY3Rlb25fZGV2aWNlX3ByaXYgKilvY3QtPnByaXY7CiAKQEAgLTExOTAsMjEgKzE0MTEsNDAgQEAKIAkJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiT1EgaGFkIHBlbmRpbmcgcGFja2V0c1xuIik7CiAKIAkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICAqLwotCQlvY3QtPmZuX2xpc3QuZGlzYWJsZV9pbnRlcnJ1cHQob2N0LT5jaGlwKTsKKwkJb2N0LT5mbl9saXN0LmRpc2FibGVfaW50ZXJydXB0KG9jdCwgT0NURU9OX0FMTF9JTlRSKTsKIAotCQkvKiBSZWxlYXNlIHRoZSBpbnRlcnJ1cHQgbGluZSAqLwotCQlmcmVlX2lycShvY3QtPnBjaV9kZXYtPmlycSwgb2N0KTsKKwkJaWYgKG9jdC0+bXNpeF9vbikgeworCQkJbXNpeF9lbnRyaWVzID0gKHN0cnVjdCBtc2l4X2VudHJ5ICopb2N0LT5tc2l4X2VudHJpZXM7CisJCQlmb3IgKGkgPSAwOyBpIDwgb2N0LT5udW1fbXNpeF9pcnFzIC0gMTsgaSsrKSB7CisJCQkJLyogY2xlYXIgdGhlIGFmZmluaXR5X2NwdW1hc2sgKi8KKwkJCQlpcnFfc2V0X2FmZmluaXR5X2hpbnQobXNpeF9lbnRyaWVzW2ldLnZlY3RvciwKKwkJCQkJCSAgICAgIE5VTEwpOworCQkJCWZyZWVfaXJxKG1zaXhfZW50cmllc1tpXS52ZWN0b3IsCisJCQkJCSAmb2N0LT5pb3FfdmVjdG9yW2ldKTsKKwkJCX0KKwkJCS8qIG5vbi1pb3YgdmVjdG9yJ3MgYXJndW1lbnQgaXMgb2N0IHN0cnVjdCAqLworCQkJZnJlZV9pcnEobXNpeF9lbnRyaWVzW2ldLnZlY3Rvciwgb2N0KTsKIAotCQlpZiAob2N0LT5mbGFncyAmIExJT19GTEFHX01TSV9FTkFCTEVEKQotCQkJcGNpX2Rpc2FibGVfbXNpKG9jdC0+cGNpX2Rldik7CisJCQlwY2lfZGlzYWJsZV9tc2l4KG9jdC0+cGNpX2Rldik7CisJCQlrZnJlZShvY3QtPm1zaXhfZW50cmllcyk7CisJCQlvY3QtPm1zaXhfZW50cmllcyA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQkvKiBSZWxlYXNlIHRoZSBpbnRlcnJ1cHQgbGluZSAqLworCQkJZnJlZV9pcnEob2N0LT5wY2lfZGV2LT5pcnEsIG9jdCk7CiAKLQkJLyogZmFsbHRocm91Z2ggKi8KKwkJCWlmIChvY3QtPmZsYWdzICYgTElPX0ZMQUdfTVNJX0VOQUJMRUQpCisJCQkJcGNpX2Rpc2FibGVfbXNpKG9jdC0+cGNpX2Rldik7CisJCX0KKworCQlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKQorCQkJb2N0ZW9uX2ZyZWVfaW9xX3ZlY3RvcihvY3QpOworCS8qIGZhbGx0aHJvdWdoICovCiAJY2FzZSBPQ1RfREVWX0lOX1JFU0VUOgogCWNhc2UgT0NUX0RFVl9EUk9RX0lOSVRfRE9ORToKIAkJLyphdG9taWNfc2V0KCZvY3QtPnN0YXR1cywgT0NUX0RFVl9EUk9RX0lOSVRfRE9ORSk7Ki8KIAkJbWRlbGF5KDEwMCk7CiAJCWZvciAoaSA9IDA7IGkgPCBNQVhfT0NURU9OX09VVFBVVF9RVUVVRVMob2N0KTsgaSsrKSB7Ci0JCQlpZiAoIShvY3QtPmlvX3FtYXNrLm9xICYgKDFVTEwgPDwgaSkpKQorCQkJaWYgKCEob2N0LT5pb19xbWFzay5vcSAmIEJJVF9VTEwoaSkpKQogCQkJCWNvbnRpbnVlOwogCQkJb2N0ZW9uX2RlbGV0ZV9kcm9xKG9jdCwgaSk7CiAJCX0KQEAgLTEyMjYsMTYgKzE0NjYsMTUgQEAKIAkJb2N0ZW9uX2RlbGV0ZV9yZXNwb25zZV9saXN0KG9jdCk7CiAKIAkJLyogZmFsbHRocm91Z2ggKi8KLQljYXNlIE9DVF9ERVZfU0NfQlVGRl9QT09MX0lOSVRfRE9ORToKLQkJb2N0ZW9uX2ZyZWVfc2NfYnVmZmVyX3Bvb2wob2N0KTsKLQotCQkvKiBmYWxsdGhyb3VnaCAqLwogCWNhc2UgT0NUX0RFVl9JTlNUUl9RVUVVRV9JTklUX0RPTkU6CiAJCWZvciAoaSA9IDA7IGkgPCBNQVhfT0NURU9OX0lOU1RSX1FVRVVFUyhvY3QpOyBpKyspIHsKLQkJCWlmICghKG9jdC0+aW9fcW1hc2suaXEgJiAoMVVMTCA8PCBpKSkpCisJCQlpZiAoIShvY3QtPmlvX3FtYXNrLmlxICYgQklUX1VMTChpKSkpCiAJCQkJY29udGludWU7CiAJCQlvY3Rlb25fZGVsZXRlX2luc3RyX3F1ZXVlKG9jdCwgaSk7CiAJCX0KKwkJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIE9DVF9ERVZfU0NfQlVGRl9QT09MX0lOSVRfRE9ORToKKwkJb2N0ZW9uX2ZyZWVfc2NfYnVmZmVyX3Bvb2wob2N0KTsKIAogCQkvKiBmYWxsdGhyb3VnaCAqLwogCWNhc2UgT0NUX0RFVl9ESVNQQVRDSF9JTklUX0RPTkU6CkBAIC0xMjQ0LDkgKzE0ODMsOSBAQAogCiAJCS8qIGZhbGx0aHJvdWdoICovCiAJY2FzZSBPQ1RfREVWX1BDSV9NQVBfRE9ORToKLQogCQkvKiBTb2Z0IHJlc2V0IHRoZSBvY3Rlb24gZGV2aWNlIGJlZm9yZSBleGl0aW5nICovCi0JCW9jdC0+Zm5fbGlzdC5zb2Z0X3Jlc2V0KG9jdCk7CisJCWlmICgoIU9DVEVPTl9DTjIzWFhfUEYob2N0KSkgfHwgIW9jdC0+b2N0ZW9uX2lkKQorCQkJb2N0LT5mbl9saXN0LnNvZnRfcmVzZXQob2N0KTsKIAogCQlvY3Rlb25fdW5tYXBfcGNpX2Jhcngob2N0LCAwKTsKIAkJb2N0ZW9uX3VubWFwX3BjaV9iYXJ4KG9jdCwgMSk7CkBAIC0xMjY0LDIzICsxNTAzLDg5IEBACiB9CiAKIC8qKgorICogXGJyaWVmIENhbGxiYWNrIGZvciByeCBjdHJsCisgKiBAcGFyYW0gc3RhdHVzIHN0YXR1cyBvZiByZXF1ZXN0CisgKiBAcGFyYW0gYnVmIHBvaW50ZXIgdG8gcmVzcCBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgcnhfY3RsX2NhbGxiYWNrKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsCisJCQkgICAgdTMyIHN0YXR1cywKKwkJCSAgICB2b2lkICpidWYpCit7CisJc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgKnNjID0gKHN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICopYnVmOworCXN0cnVjdCBsaXF1aWRpb19yeF9jdGxfY29udGV4dCAqY3R4OworCisJY3R4ICA9IChzdHJ1Y3QgbGlxdWlkaW9fcnhfY3RsX2NvbnRleHQgKilzYy0+Y3R4cHRyOworCisJb2N0ID0gbGlvX2dldF9kZXZpY2UoY3R4LT5vY3Rlb25faWQpOworCWlmIChzdGF0dXMpCisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAicnggY3RsIGluc3RydWN0aW9uIGZhaWxlZC4gU3RhdHVzOiAlbGx4XG4iLAorCQkJQ1ZNX0NBU1Q2NChzdGF0dXMpKTsKKwlXUklURV9PTkNFKGN0eC0+Y29uZCwgMSk7CisKKwkvKiBUaGlzIGJhcnJpZXIgaXMgcmVxdWlyZWQgdG8gYmUgc3VyZSB0aGF0IHRoZSByZXNwb25zZSBoYXMgYmVlbgorCSAqIHdyaXR0ZW4gZnVsbHkgYmVmb3JlIHdha2luZyB1cCB0aGUgaGFuZGxlcgorCSAqLworCXdtYigpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjdHgtPndjKTsKK30KKworLyoqCiAgKiBcYnJpZWYgU2VuZCBSeCBjb250cm9sIGNvbW1hbmQKICAqIEBwYXJhbSBsaW8gcGVyLW5ldHdvcmsgcHJpdmF0ZSBkYXRhCiAgKiBAcGFyYW0gc3RhcnRfc3RvcCB3aGV0aGVyIHRvIHN0YXJ0IG9yIHN0b3AKICAqLwogc3RhdGljIHZvaWQgc2VuZF9yeF9jdHJsX2NtZChzdHJ1Y3QgbGlvICpsaW8sIGludCBzdGFydF9zdG9wKQogewotCXN0cnVjdCBvY3RuaWNfY3RybF9wa3QgbmN0cmw7CisJc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgKnNjOworCXN0cnVjdCBsaXF1aWRpb19yeF9jdGxfY29udGV4dCAqY3R4OworCXVuaW9uIG9jdG5ldF9jbWQgKm5jbWQ7CisJaW50IGN0eF9zaXplID0gc2l6ZW9mKHN0cnVjdCBsaXF1aWRpb19yeF9jdGxfY29udGV4dCk7CisJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqKWxpby0+b2N0X2RldjsKKwlpbnQgcmV0dmFsOwogCi0JbWVtc2V0KCZuY3RybCwgMCwgc2l6ZW9mKHN0cnVjdCBvY3RuaWNfY3RybF9wa3QpKTsKKwlpZiAob2N0LT5wcm9wc1tsaW8tPmlmaWR4XS5yeF9vbiA9PSBzdGFydF9zdG9wKQorCQlyZXR1cm47CiAKLQluY3RybC5uY21kLnMuY21kID0gT0NUTkVUX0NNRF9SWF9DVEw7Ci0JbmN0cmwubmNtZC5zLnBhcmFtMSA9IHN0YXJ0X3N0b3A7Ci0JbmN0cmwuaXFfbm8gPSBsaW8tPmxpbmZvLnR4cGNpcVswXS5zLnFfbm87Ci0JbmN0cmwubmV0cG5kZXYgPSAodTY0KWxpby0+bmV0ZGV2OworCXNjID0gKHN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICopCisJCW9jdGVvbl9hbGxvY19zb2Z0X2NvbW1hbmQob2N0LCBPQ1RORVRfQ01EX1NJWkUsCisJCQkJCSAgMTYsIGN0eF9zaXplKTsKIAotCWlmIChvY3RuZXRfc2VuZF9uaWNfY3RybF9wa3QobGlvLT5vY3RfZGV2LCAmbmN0cmwpIDwgMCkKKwluY21kID0gKHVuaW9uIG9jdG5ldF9jbWQgKilzYy0+dmlydGRwdHI7CisJY3R4ICA9IChzdHJ1Y3QgbGlxdWlkaW9fcnhfY3RsX2NvbnRleHQgKilzYy0+Y3R4cHRyOworCisJV1JJVEVfT05DRShjdHgtPmNvbmQsIDApOworCWN0eC0+b2N0ZW9uX2lkID0gbGlvX2dldF9kZXZpY2VfaWQob2N0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjdHgtPndjKTsKKworCW5jbWQtPnU2NCA9IDA7CisJbmNtZC0+cy5jbWQgPSBPQ1RORVRfQ01EX1JYX0NUTDsKKwluY21kLT5zLnBhcmFtMSA9IHN0YXJ0X3N0b3A7CisKKwlvY3Rlb25fc3dhcF84Ql9kYXRhKCh1NjQgKiluY21kLCAoT0NUTkVUX0NNRF9TSVpFID4+IDMpKTsKKworCXNjLT5pcV9ubyA9IGxpby0+bGluZm8udHhwY2lxWzBdLnMucV9ubzsKKworCW9jdGVvbl9wcmVwYXJlX3NvZnRfY29tbWFuZChvY3QsIHNjLCBPUENPREVfTklDLAorCQkJCSAgICBPUENPREVfTklDX0NNRCwgMCwgMCwgMCk7CisKKwlzYy0+Y2FsbGJhY2sgPSByeF9jdGxfY2FsbGJhY2s7CisJc2MtPmNhbGxiYWNrX2FyZyA9IHNjOworCXNjLT53YWl0X3RpbWUgPSA1MDAwOworCisJcmV0dmFsID0gb2N0ZW9uX3NlbmRfc29mdF9jb21tYW5kKG9jdCwgc2MpOworCWlmIChyZXR2YWwgPT0gSVFfU0VORF9GQUlMRUQpIHsKIAkJbmV0aWZfaW5mbyhsaW8sIHJ4X2VyciwgbGlvLT5uZXRkZXYsICJGYWlsZWQgdG8gc2VuZCBSWCBDb250cm9sIG1lc3NhZ2VcbiIpOworCX0gZWxzZSB7CisJCS8qIFNsZWVwIG9uIGEgd2FpdCBxdWV1ZSB0aWxsIHRoZSBjb25kIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlCisJCSAqIHJlc3BvbnNlIGFycml2ZWQgb3IgdGltZWQtb3V0LgorCQkgKi8KKwkJaWYgKHNsZWVwX2NvbmQoJmN0eC0+d2MsICZjdHgtPmNvbmQpID09IC1FSU5UUikKKwkJCXJldHVybjsKKwkJb2N0LT5wcm9wc1tsaW8tPmlmaWR4XS5yeF9vbiA9IHN0YXJ0X3N0b3A7CisJfQorCisJb2N0ZW9uX2ZyZWVfc29mdF9jb21tYW5kKG9jdCwgc2MpOwogfQogCiAvKioKQEAgLTEzMDcsMjEgKzE2MTIsMjQgQEAKIAogCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiTklDIGRldmljZSBjbGVhbnVwXG4iKTsKIAotCXNlbmRfcnhfY3RybF9jbWQobGlvLCAwKTsKLQogCWlmIChhdG9taWNfcmVhZCgmbGlvLT5pZnN0YXRlKSAmIExJT19JRlNUQVRFX1JVTk5JTkcpCi0JCXR4cXNfc3RvcChuZXRkZXYpOworCQlsaXF1aWRpb19zdG9wKG5ldGRldik7CiAKIAlpZiAob2N0LT5wcm9wc1tsaW8tPmlmaWR4XS5uYXBpX2VuYWJsZWQgPT0gMSkgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobmFwaSwgbiwgJm5ldGRldi0+bmFwaV9saXN0LCBkZXZfbGlzdCkKIAkJCW5hcGlfZGlzYWJsZShuYXBpKTsKIAogCQlvY3QtPnByb3BzW2xpby0+aWZpZHhdLm5hcGlfZW5hYmxlZCA9IDA7CisKKwkJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkKKwkJCW9jdC0+ZHJvcVswXS0+b3BzLnBvbGxfbW9kZSA9IDA7CiAJfQogCiAJaWYgKGF0b21pY19yZWFkKCZsaW8tPmlmc3RhdGUpICYgTElPX0lGU1RBVEVfUkVHSVNURVJFRCkKIAkJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKIAorCWNsZWFudXBfbGlua19zdGF0dXNfY2hhbmdlX3dxKG5ldGRldik7CisKIAlkZWxldGVfZ2xpc3RzKGxpbyk7CiAKIAlmcmVlX25ldGRldihuZXRkZXYpOwpAQCAtMTM3NCw2ICsxNjgyLDkgQEAKIAogCWRldl9kYmcoJm9jdF9kZXYtPnBjaV9kZXYtPmRldiwgIlN0b3BwaW5nIGRldmljZVxuIik7CiAKKwlpZiAob2N0X2Rldi0+d2F0Y2hkb2dfdGFzaykKKwkJa3RocmVhZF9zdG9wKG9jdF9kZXYtPndhdGNoZG9nX3Rhc2spOworCiAJaWYgKG9jdF9kZXYtPmFwcF9tb2RlICYmIChvY3RfZGV2LT5hcHBfbW9kZSA9PSBDVk1fRFJWX05JQ19BUFApKQogCQlsaXF1aWRpb19zdG9wX25pY19tb2R1bGUob2N0X2Rldik7CiAKQEAgLTE0MTcsNiArMTcyOCwxMiBAQAogCQlzID0gIkNONjZYWCI7CiAJCWJyZWFrOwogCisJY2FzZSBPQ1RFT05fQ04yM1hYX1BDSUlEX1BGOgorCQlvY3QtPmNoaXBfaWQgPSBPQ1RFT05fQ04yM1hYX1BGX1ZJRDsKKwkJcmV0ID0gc2V0dXBfY24yM3h4X29jdGVvbl9wZl9kZXZpY2Uob2N0KTsKKwkJcyA9ICJDTjIzWFgiOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCXMgPSAiPyI7CiAJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiVW5rbm93biBkZXZpY2UgZm91bmQgKGRldl9pZDogJXgpXG4iLApAQCAtMTg2Nyw3ICsyMTg0LDcgQEAKIAlzdHJ1Y3QgbGlxdWlkaW9faWZfY2ZnX2NvbnRleHQgKmN0eDsKIAogCXJlc3AgPSAoc3RydWN0IGxpcXVpZGlvX2lmX2NmZ19yZXNwICopc2MtPnZpcnRycHRyOwotCWN0eCAgPSAoc3RydWN0IGxpcXVpZGlvX2lmX2NmZ19jb250ZXh0ICopc2MtPmN0eHB0cjsKKwljdHggPSAoc3RydWN0IGxpcXVpZGlvX2lmX2NmZ19jb250ZXh0ICopc2MtPmN0eHB0cjsKIAogCW9jdCA9IGxpb19nZXRfZGV2aWNlKGN0eC0+b2N0ZW9uX2lkKTsKIAlpZiAocmVzcC0+c3RhdHVzKQpAQCAtMjA2MCwxMSArMjM3NywxNCBAQAogICovCiBzdGF0aWMgdm9pZCBsaXF1aWRpb19uYXBpX2Rydl9jYWxsYmFjayh2b2lkICphcmcpCiB7CisJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdDsKIAlzdHJ1Y3Qgb2N0ZW9uX2Ryb3EgKmRyb3EgPSBhcmc7CiAJaW50IHRoaXNfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCi0JaWYgKGRyb3EtPmNwdV9pZCA9PSB0aGlzX2NwdSkgewotCQluYXBpX3NjaGVkdWxlKCZkcm9xLT5uYXBpKTsKKwlvY3QgPSBkcm9xLT5vY3RfZGV2OworCisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSB8fCBkcm9xLT5jcHVfaWQgPT0gdGhpc19jcHUpIHsKKwkJbmFwaV9zY2hlZHVsZV9pcnFvZmYoJmRyb3EtPm5hcGkpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhICpjc2QgPSAmZHJvcS0+Y3NkOwogCkBAIC0yMTczLDE3ICsyNDkzLDE1IEBACiAJCQkJCQkgICBsaW8tPmlmaWR4KSwgTlVMTCk7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwKLQkJCQkiICVzIDogUnVudGltZSBEUk9RKFJ4USkgY3JlYXRpb24gZmFpbGVkLlxuIiwKKwkJCQkiJXMgOiBSdW50aW1lIERST1EoUnhRKSBjcmVhdGlvbiBmYWlsZWQuXG4iLAogCQkJCV9fZnVuY19fKTsKIAkJCXJldHVybiAxOwogCQl9CiAKIAkJZHJvcSA9IG9jdGVvbl9kZXYtPmRyb3FbcV9ub107CiAJCW5hcGkgPSAmZHJvcS0+bmFwaTsKLQkJZGV2X2RiZygmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LAotCQkJIm5ldGlmX25hcGlfYWRkIG5ldGRldjolbGx4IG9jdDolbGx4XG4iLAotCQkJKHU2NCluZXRkZXYsCi0JCQkodTY0KW9jdGVvbl9kZXYpOworCQlkZXZfZGJnKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJuZXRpZl9uYXBpX2FkZCBuZXRkZXY6JWxseCBvY3Q6JWxseCBwZl9udW06JWRcbiIsCisJCQkodTY0KW5ldGRldiwgKHU2NClvY3Rlb25fZGV2LCBvY3Rlb25fZGV2LT5wZl9udW0pOwogCQluZXRpZl9uYXBpX2FkZChuZXRkZXYsIG5hcGksIGxpcXVpZGlvX25hcGlfcG9sbCwgNjQpOwogCiAJCS8qIGRlc2lnbmF0ZSBhIENQVSBmb3IgdGhpcyBkcm9xICovCkBAIC0yMTk1LDYgKzI1MTMsMTQgQEAKIAkJb2N0ZW9uX3JlZ2lzdGVyX2Ryb3Ffb3BzKG9jdGVvbl9kZXYsIHFfbm8sICZkcm9xX29wcyk7CiAJfQogCisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0ZW9uX2RldikpIHsKKwkJLyogMjNYWCBQRiBjYW4gcmVjZWl2ZSBjb250cm9sIG1lc3NhZ2VzICh2aWEgdGhlIGZpcnN0IFBGLW93bmVkCisJCSAqIGRyb3EpIGZyb20gdGhlIGZpcm13YXJlIGV2ZW4gaWYgdGhlIGV0aFggaW50ZXJmYWNlIGlzIGRvd24sCisJCSAqIHNvIHRoYXQncyB3aHkgcG9sbF9tb2RlIG11c3QgYmUgb2ZmIGZvciB0aGUgZmlyc3QgZHJvcS4KKwkJICovCisJCW9jdGVvbl9kZXYtPmRyb3FbMF0tPm9wcy5wb2xsX21vZGUgPSAwOworCX0KKwogCS8qIHNldCB1cCBJUXMuICovCiAJZm9yIChxID0gMDsgcSA8IGxpby0+bGluZm8ubnVtX3R4cGNpcTsgcSsrKSB7CiAJCW51bV90eF9kZXNjcyA9IENGR19HRVRfTlVNX1RYX0RFU0NTX05JQ19JRihvY3Rlb25fZ2V0X2NvbmYKQEAgLTIyMzUsNyArMjU2MSw3IEBACiAgKiBcYnJpZWYgU2V0cyB1cCB0aGUgdHhxIHBvbGwgY2hlY2sKICAqIEBwYXJhbSBuZXRkZXYgbmV0d29yayBkZXZpY2UKICAqLwotc3RhdGljIGlubGluZSB2b2lkIHNldHVwX3R4X3BvbGxfZm4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3N0YXRpYyBpbmxpbmUgaW50IHNldHVwX3R4X3BvbGxfZm4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgbGlvICpsaW8gPSBHRVRfTElPKG5ldGRldik7CiAJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IGxpby0+b2N0X2RldjsKQEAgLTIyNDQsMjEgKzI1NzAsMjQgQEAKIAkJCQkJCVdRX01FTV9SRUNMQUlNLCAwKTsKIAlpZiAoIWxpby0+dHhxX3N0YXR1c193cS53cSkgewogCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgInVuYWJsZSB0byBjcmVhdGUgY2F2aXVtIHR4cSBzdGF0dXMgd3FcbiIpOwotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAl9CiAJSU5JVF9ERUxBWUVEX1dPUksoJmxpby0+dHhxX3N0YXR1c193cS53ay53b3JrLAogCQkJICBvY3RuZXRfcG9sbF9jaGVja190eHFfc3RhdHVzKTsKIAlsaW8tPnR4cV9zdGF0dXNfd3Eud2suY3R4cHRyID0gbGlvOwogCXF1ZXVlX2RlbGF5ZWRfd29yayhsaW8tPnR4cV9zdGF0dXNfd3Eud3EsCiAJCQkgICAmbGlvLT50eHFfc3RhdHVzX3dxLndrLndvcmssIG1zZWNzX3RvX2ppZmZpZXMoMSkpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYW51cF90eF9wb2xsX2ZuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGxpbyAqbGlvID0gR0VUX0xJTyhuZXRkZXYpOwogCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZsaW8tPnR4cV9zdGF0dXNfd3Eud2sud29yayk7Ci0JZGVzdHJveV93b3JrcXVldWUobGlvLT50eHFfc3RhdHVzX3dxLndxKTsKKwlpZiAobGlvLT50eHFfc3RhdHVzX3dxLndxKSB7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbGlvLT50eHFfc3RhdHVzX3dxLndrLndvcmspOworCQlkZXN0cm95X3dvcmtxdWV1ZShsaW8tPnR4cV9zdGF0dXNfd3Eud3EpOworCX0KIH0KIAogLyoqCkBAIC0yMjc2LDI0ICsyNjA1LDM0IEBACiAJCQluYXBpX2VuYWJsZShuYXBpKTsKIAogCQlvY3QtPnByb3BzW2xpby0+aWZpZHhdLm5hcGlfZW5hYmxlZCA9IDE7CisKKwkJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkKKwkJCW9jdC0+ZHJvcVswXS0+b3BzLnBvbGxfbW9kZSA9IDE7CiAJfQogCiAJb2N0X3B0cF9vcGVuKG5ldGRldik7CiAKIAlpZnN0YXRlX3NldChsaW8sIExJT19JRlNUQVRFX1JVTk5JTkcpOwogCi0Jc2V0dXBfdHhfcG9sbF9mbihuZXRkZXYpOwotCi0Jc3RhcnRfdHhxKG5ldGRldik7CisJLyogUmVhZHkgZm9yIGxpbmsgc3RhdHVzIHVwZGF0ZXMgKi8KKwlsaW8tPmludGZfb3BlbiA9IDE7CiAKIAluZXRpZl9pbmZvKGxpbywgaWZ1cCwgbGlvLT5uZXRkZXYsICJJbnRlcmZhY2UgT3BlbiwgcmVhZHkgZm9yIHRyYWZmaWNcbiIpOwogCisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkgeworCQlpZiAoIW9jdC0+bXNpeF9vbikKKwkJCWlmIChzZXR1cF90eF9wb2xsX2ZuKG5ldGRldikpCisJCQkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCWlmIChzZXR1cF90eF9wb2xsX2ZuKG5ldGRldikpCisJCQlyZXR1cm4gLTE7CisJfQorCisJc3RhcnRfdHhxKG5ldGRldik7CisKIAkvKiB0ZWxsIE9jdGVvbiB0byBzdGFydCBmb3J3YXJkaW5nIHBhY2tldHMgdG8gaG9zdCAqLwogCXNlbmRfcnhfY3RybF9jbWQobGlvLCAxKTsKIAotCS8qIFJlYWR5IGZvciBsaW5rIHN0YXR1cyB1cGRhdGVzICovCi0JbGlvLT5pbnRmX29wZW4gPSAxOwotCiAJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgaW50ZXJmYWNlIGlzIG9wZW5lZFxuIiwKIAkJIG5ldGRldi0+bmFtZSk7CiAKQEAgLTIzMjgsNyArMjY2NywxMiBAQAogCS8qIE5vdyBpdCBzaG91bGQgYmUgc2FmZSB0byB0ZWxsIE9jdGVvbiB0aGF0IG5pYyBpbnRlcmZhY2UgaXMgZG93bi4gKi8KIAlzZW5kX3J4X2N0cmxfY21kKGxpbywgMCk7CiAKLQljbGVhbnVwX3R4X3BvbGxfZm4obmV0ZGV2KTsKKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKSB7CisJCWlmICghb2N0LT5tc2l4X29uKQorCQkJY2xlYW51cF90eF9wb2xsX2ZuKG5ldGRldik7CisJfSBlbHNlIHsKKwkJY2xlYW51cF90eF9wb2xsX2ZuKG5ldGRldik7CisJfQogCiAJaWYgKGxpby0+cHRwX2Nsb2NrKSB7CiAJCXB0cF9jbG9ja191bnJlZ2lzdGVyKGxpby0+cHRwX2Nsb2NrKTsKQEAgLTIzNDAsMTQzICsyNjg0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBsaXF1aWRpb19saW5rX2N0cmxfY21kX2NvbXBsZXRpb24odm9pZCAqbmN0cmxfcHRyKQotewotCXN0cnVjdCBvY3RuaWNfY3RybF9wa3QgKm5jdHJsID0gKHN0cnVjdCBvY3RuaWNfY3RybF9wa3QgKiluY3RybF9wdHI7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKW5jdHJsLT5uZXRwbmRldjsKLQlzdHJ1Y3QgbGlvICpsaW8gPSBHRVRfTElPKG5ldGRldik7Ci0Jc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IGxpby0+b2N0X2RldjsKLQl1OCAqbWFjOwotCi0Jc3dpdGNoIChuY3RybC0+bmNtZC5zLmNtZCkgewotCWNhc2UgT0NUTkVUX0NNRF9DSEFOR0VfREVWRkxBR1M6Ci0JY2FzZSBPQ1RORVRfQ01EX1NFVF9NVUxUSV9MSVNUOgotCQlicmVhazsKLQotCWNhc2UgT0NUTkVUX0NNRF9DSEFOR0VfTUFDQUREUjoKLQkJbWFjID0gKCh1OCAqKSZuY3RybC0+dWRkWzBdKSArIDI7Ci0JCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsCi0JCQkgICAiJXMgJTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMnhcbiIsCi0JCQkgICAiTUFDQWRkciBjaGFuZ2VkIHRvIiwgbWFjWzBdLCBtYWNbMV0sCi0JCQkgICBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0pOwotCQlicmVhazsKLQotCWNhc2UgT0NUTkVUX0NNRF9DSEFOR0VfTVRVOgotCQkvKiBJZiBjb21tYW5kIGlzIHN1Y2Nlc3NmdWwsIGNoYW5nZSB0aGUgTVRVLiAqLwotCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LCAiIE1UVSBDaGFuZ2VkIGZyb20gJWQgdG8gJWRcbiIsCi0JCQkgICBuZXRkZXYtPm10dSwgbmN0cmwtPm5jbWQucy5wYXJhbTEpOwotCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBNVFUgQ2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLAotCQkJIG5ldGRldi0+bmFtZSwgbmV0ZGV2LT5tdHUsCi0JCQkgbmN0cmwtPm5jbWQucy5wYXJhbTEpOwotCQlydG5sX2xvY2soKTsKLQkJbmV0ZGV2LT5tdHUgPSBuY3RybC0+bmNtZC5zLnBhcmFtMTsKLQkJY2FsbF9uZXRkZXZpY2Vfbm90aWZpZXJzKE5FVERFVl9DSEFOR0VNVFUsIG5ldGRldik7Ci0JCXJ0bmxfdW5sb2NrKCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBPQ1RORVRfQ01EX0dQSU9fQUNDRVNTOgotCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LCAiTEVEIEZsYXNoaW5nIHZpc3VhbCBpZGVudGlmaWNhdGlvblxuIik7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIE9DVE5FVF9DTURfTFJPX0VOQUJMRToKLQkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgTFJPIEVuYWJsZWRcbiIsIG5ldGRldi0+bmFtZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBPQ1RORVRfQ01EX0xST19ESVNBQkxFOgotCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBMUk8gRGlzYWJsZWRcbiIsCi0JCQkgbmV0ZGV2LT5uYW1lKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE9DVE5FVF9DTURfVkVSQk9TRV9FTkFCTEU6Ci0JCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIExSTyBFbmFibGVkXG4iLCBuZXRkZXYtPm5hbWUpOwotCQlicmVhazsKLQotCWNhc2UgT0NUTkVUX0NNRF9WRVJCT1NFX0RJU0FCTEU6Ci0JCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIExSTyBEaXNhYmxlZFxuIiwKLQkJCSBuZXRkZXYtPm5hbWUpOwotCQlicmVhazsKLQotCWNhc2UgT0NUTkVUX0NNRF9FTkFCTEVfVkxBTl9GSUxURVI6Ci0JCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIFZMQU4gZmlsdGVyIGVuYWJsZWRcbiIsCi0JCQkgbmV0ZGV2LT5uYW1lKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE9DVE5FVF9DTURfQUREX1ZMQU5fRklMVEVSOgotCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBWTEFOIGZpbHRlciAlZCBhZGRlZFxuIiwKLQkJCSBuZXRkZXYtPm5hbWUsIG5jdHJsLT5uY21kLnMucGFyYW0xKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE9DVE5FVF9DTURfREVMX1ZMQU5fRklMVEVSOgotCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBWTEFOIGZpbHRlciAlZCByZW1vdmVkXG4iLAotCQkJIG5ldGRldi0+bmFtZSwgbmN0cmwtPm5jbWQucy5wYXJhbTEpOwotCQlicmVhazsKLQotCWNhc2UgT0NUTkVUX0NNRF9TRVRfU0VUVElOR1M6Ci0JCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIHNldHRpbmdzIGNoYW5nZWRcbiIsCi0JCQkgbmV0ZGV2LT5uYW1lKTsKLQotCQlicmVhazsKLQkJLyogQ2FzZSB0byBoYW5kbGUgIk9DVE5FVF9DTURfVE5MX1JYX0NTVU1fQ1RMIgotCQkgKiBDb21tYW5kIHBhc3NlZCBieSBOSUMgZHJpdmVyCi0JCSAqLwotCWNhc2UgT0NUTkVUX0NNRF9UTkxfUlhfQ1NVTV9DVEw6Ci0JCWlmIChuY3RybC0+bmNtZC5zLnBhcmFtMSA9PSBPQ1RORVRfQ01EX1JYQ1NVTV9FTkFCTEUpIHsKLQkJCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsCi0JCQkJICAgIiVzIFJYIENoZWNrc3VtIE9mZmxvYWQgRW5hYmxlZFxuIiwKLQkJCQkgICBuZXRkZXYtPm5hbWUpOwotCQl9IGVsc2UgaWYgKG5jdHJsLT5uY21kLnMucGFyYW0xID09Ci0JCQkgICBPQ1RORVRfQ01EX1JYQ1NVTV9ESVNBQkxFKSB7Ci0JCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LAotCQkJCSAgICIlcyBSWCBDaGVja3N1bSBPZmZsb2FkIERpc2FibGVkXG4iLAotCQkJCSAgIG5ldGRldi0+bmFtZSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQkJLyogQ2FzZSB0byBoYW5kbGUgIk9DVE5FVF9DTURfVE5MX1RYX0NTVU1fQ1RMIgotCQkgKiBDb21tYW5kIHBhc3NlZCBieSBOSUMgZHJpdmVyCi0JCSAqLwotCWNhc2UgT0NUTkVUX0NNRF9UTkxfVFhfQ1NVTV9DVEw6Ci0JCWlmIChuY3RybC0+bmNtZC5zLnBhcmFtMSA9PSBPQ1RORVRfQ01EX1RYQ1NVTV9FTkFCTEUpIHsKLQkJCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsCi0JCQkJICAgIiVzIFRYIENoZWNrc3VtIE9mZmxvYWQgRW5hYmxlZFxuIiwKLQkJCQkgICBuZXRkZXYtPm5hbWUpOwotCQl9IGVsc2UgaWYgKG5jdHJsLT5uY21kLnMucGFyYW0xID09Ci0JCQkgICBPQ1RORVRfQ01EX1RYQ1NVTV9ESVNBQkxFKSB7Ci0JCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LAotCQkJCSAgICIlcyBUWCBDaGVja3N1bSBPZmZsb2FkIERpc2FibGVkXG4iLAotCQkJCSAgIG5ldGRldi0+bmFtZSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQkJLyogQ2FzZSB0byBoYW5kbGUgIk9DVE5FVF9DTURfVlhMQU5fUE9SVF9DT05GSUciCi0JCSAqIENvbW1hbmQgcGFzc2VkIGJ5IE5JQyBkcml2ZXIKLQkJICovCi0JY2FzZSBPQ1RORVRfQ01EX1ZYTEFOX1BPUlRfQ09ORklHOgotCQlpZiAobmN0cmwtPm5jbWQucy5tb3JlID09IE9DVE5FVF9DTURfVlhMQU5fUE9SVF9BREQpIHsKLQkJCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsCi0JCQkJICAgIiVzIFZ4TEFOIERlc3RpbmF0aW9uIFVEUCBQT1JUOiVkIEFEREVEXG4iLAotCQkJCSAgIG5ldGRldi0+bmFtZSwKLQkJCQkgICBuY3RybC0+bmNtZC5zLnBhcmFtMSk7Ci0JCX0gZWxzZSBpZiAobmN0cmwtPm5jbWQucy5tb3JlID09Ci0JCQkgICBPQ1RORVRfQ01EX1ZYTEFOX1BPUlRfREVMKSB7Ci0JCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LAotCQkJCSAgICIlcyBWeExBTiBEZXN0aW5hdGlvbiBVRFAgUE9SVDolZCBERUxFVEVEXG4iLAotCQkJCSAgIG5ldGRldi0+bmFtZSwKLQkJCQkgICBuY3RybC0+bmNtZC5zLnBhcmFtMSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIE9DVE5FVF9DTURfU0VUX0ZMT1dfQ1RMOgotCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LCAiU2V0IFJYL1RYIGZsb3cgY29udHJvbCBwYXJhbWV0ZXJzXG4iKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIFVua25vd24gY21kICVkXG4iLCBfX2Z1bmNfXywKLQkJCW5jdHJsLT5uY21kLnMuY21kKTsKLQl9Ci19Ci0KIC8qKgogICogXGJyaWVmIENvbnZlcnRzIGEgbWFzayBiYXNlZCBvbiBuZXQgZGV2aWNlIGZsYWdzCiAgKiBAcGFyYW0gbmV0ZGV2IG5ldHdvcmsgZGV2aWNlCkBAIC0yODE3LDggKzMwMjQsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBzZW5kX25pY190aW1lc3RhbXBfcGt0KHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsCiAJCQkJCSBzdHJ1Y3Qgb2N0bmljX2RhdGFfcGt0ICpuZGF0YSwKLQkJCQkJIHN0cnVjdCBvY3RuZXRfYnVmX2ZyZWVfaW5mbyAqZmluZm8sCi0JCQkJCSBpbnQgeG1pdF9tb3JlKQorCQkJCQkgc3RydWN0IG9jdG5ldF9idWZfZnJlZV9pbmZvICpmaW5mbykKIHsKIAlpbnQgcmV0dmFsOwogCXN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICpzYzsKQEAgLTI4NDYsOSArMzA1MiwxNSBAQAogCXNjLT5jYWxsYmFja19hcmcgPSBmaW5mby0+c2tiOwogCXNjLT5pcV9ubyA9IG5kYXRhLT5xX25vOwogCi0JbGVuID0gKHUzMikoKHN0cnVjdCBvY3Rlb25faW5zdHJfaWgyICopKCZzYy0+Y21kLmNtZDIuaWgyKSktPmRsZW5nc3o7CisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkKKwkJbGVuID0gKHUzMikoKHN0cnVjdCBvY3Rlb25faW5zdHJfaWgzICopCisJCQkgICAgKCZzYy0+Y21kLmNtZDMuaWgzKSktPmRsZW5nc3o7CisJZWxzZQorCQlsZW4gPSAodTMyKSgoc3RydWN0IG9jdGVvbl9pbnN0cl9paDIgKikKKwkJCSAgICAoJnNjLT5jbWQuY21kMi5paDIpKS0+ZGxlbmdzejsKIAotCXJpbmdfZG9vcmJlbGwgPSAheG1pdF9tb3JlOworCXJpbmdfZG9vcmJlbGwgPSAxOworCiAJcmV0dmFsID0gb2N0ZW9uX3NlbmRfY29tbWFuZChvY3QsIHNjLT5pcV9ubywgcmluZ19kb29yYmVsbCwgJnNjLT5jbWQsCiAJCQkJICAgICBzYywgbGVuLCBuZGF0YS0+cmVxdHlwZSk7CiAKQEAgLTI4ODEsNyArMzA5Myw3IEBACiAJdW5pb24gdHhfaW5mbyAqdHhfaW5mbzsKIAlpbnQgc3RhdHVzID0gMDsKIAlpbnQgcV9pZHggPSAwLCBpcV9ubyA9IDA7Ci0JaW50IHhtaXRfbW9yZSwgajsKKwlpbnQgajsKIAl1NjQgZHB0ciA9IDA7CiAJdTMyIHRhZyA9IDA7CiAKQEAgLTI5ODAsNyArMzE5MiwxMCBAQAogCQkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCQl9CiAKLQkJbmRhdGEuY21kLmNtZDIuZHB0ciA9IGRwdHI7CisJCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpCisJCQluZGF0YS5jbWQuY21kMy5kcHRyID0gZHB0cjsKKwkJZWxzZQorCQkJbmRhdGEuY21kLmNtZDIuZHB0ciA9IGRwdHI7CiAJCWZpbmZvLT5kcHRyID0gZHB0cjsKIAkJbmRhdGEucmVxdHlwZSA9IFJFUVRZUEVfTk9SRVNQX05FVDsKIApAQCAtMzA1NSwxNSArMzI3MCwyMyBAQAogCQkJCQkgICBnLT5zZ19zaXplLCBETUFfVE9fREVWSUNFKTsKIAkJZHB0ciA9IGctPnNnX2RtYV9wdHI7CiAKLQkJbmRhdGEuY21kLmNtZDIuZHB0ciA9IGRwdHI7CisJCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpCisJCQluZGF0YS5jbWQuY21kMy5kcHRyID0gZHB0cjsKKwkJZWxzZQorCQkJbmRhdGEuY21kLmNtZDIuZHB0ciA9IGRwdHI7CiAJCWZpbmZvLT5kcHRyID0gZHB0cjsKIAkJZmluZm8tPmcgPSBnOwogCiAJCW5kYXRhLnJlcXR5cGUgPSBSRVFUWVBFX05PUkVTUF9ORVRfU0c7CiAJfQogCi0JaXJoID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICopJm5kYXRhLmNtZC5jbWQyLmlyaDsKLQl0eF9pbmZvID0gKHVuaW9uIHR4X2luZm8gKikmbmRhdGEuY21kLmNtZDIub3NzcFswXTsKKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKSB7CisJCWlyaCA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqKSZuZGF0YS5jbWQuY21kMy5pcmg7CisJCXR4X2luZm8gPSAodW5pb24gdHhfaW5mbyAqKSZuZGF0YS5jbWQuY21kMy5vc3NwWzBdOworCX0gZWxzZSB7CisJCWlyaCA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqKSZuZGF0YS5jbWQuY21kMi5pcmg7CisJCXR4X2luZm8gPSAodW5pb24gdHhfaW5mbyAqKSZuZGF0YS5jbWQuY21kMi5vc3NwWzBdOworCX0KIAogCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKSB7CiAJCXR4X2luZm8tPnMuZ3NvX3NpemUgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwpAQCAtMzA3NywxMiArMzMwMCwxMCBAQAogCQlpcmgtPnZsYW4gPSBza2Jfdmxhbl90YWdfZ2V0KHNrYikgJiAweGZmZjsKIAl9CiAKLQl4bWl0X21vcmUgPSBza2ItPnhtaXRfbW9yZTsKLQogCWlmICh1bmxpa2VseShjbWRzZXR1cC5zLnRpbWVzdGFtcCkpCi0JCXN0YXR1cyA9IHNlbmRfbmljX3RpbWVzdGFtcF9wa3Qob2N0LCAmbmRhdGEsIGZpbmZvLCB4bWl0X21vcmUpOworCQlzdGF0dXMgPSBzZW5kX25pY190aW1lc3RhbXBfcGt0KG9jdCwgJm5kYXRhLCBmaW5mbyk7CiAJZWxzZQotCQlzdGF0dXMgPSBvY3RuZXRfc2VuZF9uaWNfZGF0YV9wa3Qob2N0LCAmbmRhdGEsIHhtaXRfbW9yZSk7CisJCXN0YXR1cyA9IG9jdG5ldF9zZW5kX25pY19kYXRhX3BrdChvY3QsICZuZGF0YSk7CiAJaWYgKHN0YXR1cyA9PSBJUV9TRU5EX0ZBSUxFRCkKIAkJZ290byBsaW9feG1pdF9mYWlsZWQ7CiAKQEAgLTMxOTAsOCArMzQxMSw4IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DVE5FVF9DTURfUlhDU1VNX0RJU0FCTEUKICAqIEByZXR1cm5zICAgICAgICAgICAgICAgICAgICAgU1VDQ0VTUyBvciBGQUlMVVJFCiAgKi8KLWludCBsaXF1aWRpb19zZXRfcnhjc3VtX2NvbW1hbmQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IGNvbW1hbmQsCi0JCQkJdTggcnhfY21kKQorc3RhdGljIGludCBsaXF1aWRpb19zZXRfcnhjc3VtX2NvbW1hbmQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IGNvbW1hbmQsCisJCQkJICAgICAgIHU4IHJ4X2NtZCkKIHsKIAlzdHJ1Y3QgbGlvICpsaW8gPSBHRVRfTElPKG5ldGRldik7CiAJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IGxpby0+b2N0X2RldjsKQEAgLTMyNDksMzEgKzM0NzAsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBsaXF1aWRpb19zZXRfZmVhdHVyZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgY21kLCB1MTYgcGFyYW0xKQotewotCXN0cnVjdCBsaW8gKmxpbyA9IEdFVF9MSU8obmV0ZGV2KTsKLQlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gbGlvLT5vY3RfZGV2OwotCXN0cnVjdCBvY3RuaWNfY3RybF9wa3QgbmN0cmw7Ci0JaW50IHJldCA9IDA7Ci0KLQltZW1zZXQoJm5jdHJsLCAwLCBzaXplb2Yoc3RydWN0IG9jdG5pY19jdHJsX3BrdCkpOwotCi0JbmN0cmwubmNtZC51NjQgPSAwOwotCW5jdHJsLm5jbWQucy5jbWQgPSBjbWQ7Ci0JbmN0cmwubmNtZC5zLnBhcmFtMSA9IHBhcmFtMTsKLQluY3RybC5pcV9ubyA9IGxpby0+bGluZm8udHhwY2lxWzBdLnMucV9ubzsKLQluY3RybC53YWl0X3RpbWUgPSAxMDA7Ci0JbmN0cmwubmV0cG5kZXYgPSAodTY0KW5ldGRldjsKLQluY3RybC5jYl9mbiA9IGxpcXVpZGlvX2xpbmtfY3RybF9jbWRfY29tcGxldGlvbjsKLQotCXJldCA9IG9jdG5ldF9zZW5kX25pY19jdHJsX3BrdChsaW8tPm9jdF9kZXYsICZuY3RybCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJGZWF0dXJlIGNoYW5nZSBmYWlsZWQgaW4gY29yZSAocmV0OiAweCV4KVxuIiwKLQkJCXJldCk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KIC8qKiBcYnJpZWYgTmV0IGRldmljZSBmaXggZmVhdHVyZXMKICAqIEBwYXJhbSBuZXRkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UKICAqIEBwYXJhbSByZXF1ZXN0IGZlYXR1cmVzIHJlcXVlc3RlZApAQCAtMzQ5Miw4ICszNjg4LDkgQEAKIAl1bmlvbiBvY3RfbmljX2lmX2NmZyBpZl9jZmc7CiAJdW5zaWduZWQgaW50IGJhc2VfcXVldWU7CiAJdW5zaWduZWQgaW50IGdteF9wb3J0X2lkOwotCXUzMiByZXNwX3NpemUsIGN0eF9zaXplOworCXUzMiByZXNwX3NpemUsIGN0eF9zaXplLCBkYXRhX3NpemU7CiAJdTMyIGlmaWR4X29yX3BmbnVtOworCXN0cnVjdCBsaW9fdmVyc2lvbiAqdmRhdGE7CiAKIAkvKiBUaGlzIGlzIHRvIGhhbmRsZSBsaW5rIHN0YXR1cyBjaGFuZ2VzICovCiAJb2N0ZW9uX3JlZ2lzdGVyX2Rpc3BhdGNoX2ZuKG9jdGVvbl9kZXYsIE9QQ09ERV9OSUMsCkBAIC0zNTE1LDIxICszNzEyLDM3IEBACiAJZm9yIChpID0gMDsgaSA8IG9jdGVvbl9kZXYtPmlmY291bnQ7IGkrKykgewogCQlyZXNwX3NpemUgPSBzaXplb2Yoc3RydWN0IGxpcXVpZGlvX2lmX2NmZ19yZXNwKTsKIAkJY3R4X3NpemUgPSBzaXplb2Yoc3RydWN0IGxpcXVpZGlvX2lmX2NmZ19jb250ZXh0KTsKKwkJZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBsaW9fdmVyc2lvbik7CiAJCXNjID0gKHN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICopCi0JCQlvY3Rlb25fYWxsb2Nfc29mdF9jb21tYW5kKG9jdGVvbl9kZXYsIDAsCisJCQlvY3Rlb25fYWxsb2Nfc29mdF9jb21tYW5kKG9jdGVvbl9kZXYsIGRhdGFfc2l6ZSwKIAkJCQkJCSAgcmVzcF9zaXplLCBjdHhfc2l6ZSk7CiAJCXJlc3AgPSAoc3RydWN0IGxpcXVpZGlvX2lmX2NmZ19yZXNwICopc2MtPnZpcnRycHRyOwogCQljdHggID0gKHN0cnVjdCBsaXF1aWRpb19pZl9jZmdfY29udGV4dCAqKXNjLT5jdHhwdHI7CisJCXZkYXRhID0gKHN0cnVjdCBsaW9fdmVyc2lvbiAqKXNjLT52aXJ0ZHB0cjsKIAotCQludW1faXF1ZXVlcyA9Ci0JCQlDRkdfR0VUX05VTV9UWFFTX05JQ19JRihvY3Rlb25fZ2V0X2NvbmYob2N0ZW9uX2RldiksIGkpOwotCQludW1fb3F1ZXVlcyA9Ci0JCQlDRkdfR0VUX05VTV9SWFFTX05JQ19JRihvY3Rlb25fZ2V0X2NvbmYob2N0ZW9uX2RldiksIGkpOwotCQliYXNlX3F1ZXVlID0KLQkJCUNGR19HRVRfQkFTRV9RVUVfTklDX0lGKG9jdGVvbl9nZXRfY29uZihvY3Rlb25fZGV2KSwgaSk7Ci0JCWdteF9wb3J0X2lkID0KLQkJCUNGR19HRVRfR01YSURfTklDX0lGKG9jdGVvbl9nZXRfY29uZihvY3Rlb25fZGV2KSwgaSk7Ci0JCWlmaWR4X29yX3BmbnVtID0gaTsKKwkJKigodTY0ICopdmRhdGEpID0gMDsKKwkJdmRhdGEtPm1ham9yID0gY3B1X3RvX2JlMTYoTElRVUlESU9fQkFTRV9NQUpPUl9WRVJTSU9OKTsKKwkJdmRhdGEtPm1pbm9yID0gY3B1X3RvX2JlMTYoTElRVUlESU9fQkFTRV9NSU5PUl9WRVJTSU9OKTsKKwkJdmRhdGEtPm1pY3JvID0gY3B1X3RvX2JlMTYoTElRVUlESU9fQkFTRV9NSUNST19WRVJTSU9OKTsKKworCQlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3Rlb25fZGV2KSkgeworCQkJbnVtX2lxdWV1ZXMgPSBvY3Rlb25fZGV2LT5zcmlvdl9pbmZvLm51bV9wZl9yaW5nczsKKwkJCW51bV9vcXVldWVzID0gb2N0ZW9uX2Rldi0+c3Jpb3ZfaW5mby5udW1fcGZfcmluZ3M7CisJCQliYXNlX3F1ZXVlID0gb2N0ZW9uX2Rldi0+c3Jpb3ZfaW5mby5wZl9zcm47CisKKwkJCWdteF9wb3J0X2lkID0gb2N0ZW9uX2Rldi0+cGZfbnVtOworCQkJaWZpZHhfb3JfcGZudW0gPSBvY3Rlb25fZGV2LT5wZl9udW07CisJCX0gZWxzZSB7CisJCQludW1faXF1ZXVlcyA9IENGR19HRVRfTlVNX1RYUVNfTklDX0lGKAorCQkJCQkJb2N0ZW9uX2dldF9jb25mKG9jdGVvbl9kZXYpLCBpKTsKKwkJCW51bV9vcXVldWVzID0gQ0ZHX0dFVF9OVU1fUlhRU19OSUNfSUYoCisJCQkJCQlvY3Rlb25fZ2V0X2NvbmYob2N0ZW9uX2RldiksIGkpOworCQkJYmFzZV9xdWV1ZSA9IENGR19HRVRfQkFTRV9RVUVfTklDX0lGKAorCQkJCQkJb2N0ZW9uX2dldF9jb25mKG9jdGVvbl9kZXYpLCBpKTsKKwkJCWdteF9wb3J0X2lkID0gQ0ZHX0dFVF9HTVhJRF9OSUNfSUYoCisJCQkJCQlvY3Rlb25fZ2V0X2NvbmYob2N0ZW9uX2RldiksIGkpOworCQkJaWZpZHhfb3JfcGZudW0gPSBpOworCQl9CiAKIAkJZGV2X2RiZygmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LAogCQkJInJlcXVlc3RpbmcgY29uZmlnIGZvciBpbnRlcmZhY2UgJWQsIGlxcyAlZCwgb3FzICVkXG4iLApAQCAtMzU2Niw3ICszNzc5LDExIEBACiAJCS8qIFNsZWVwIG9uIGEgd2FpdCBxdWV1ZSB0aWxsIHRoZSBjb25kIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlCiAJCSAqIHJlc3BvbnNlIGFycml2ZWQgb3IgdGltZWQtb3V0LgogCQkgKi8KLQkJc2xlZXBfY29uZCgmY3R4LT53YywgJmN0eC0+Y29uZCk7CisJCWlmIChzbGVlcF9jb25kKCZjdHgtPndjLCAmY3R4LT5jb25kKSA9PSAtRUlOVFIpIHsKKwkJCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIldhaXQgaW50ZXJydXB0ZWRcbiIpOworCQkJZ290byBzZXR1cF9uaWNfd2FpdF9pbnRyOworCQl9CisKIAkJcmV0dmFsID0gcmVzcC0+c3RhdHVzOwogCQlpZiAocmV0dmFsKSB7CiAJCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJpcS9vcSBjb25maWcgZmFpbGVkXG4iKTsKQEAgLTM2MzMsMTIgKzM4NTAsMTYgQEAKIAogCQlsaW8tPm1zZ19lbmFibGUgPSBuZXRpZl9tc2dfaW5pdChkZWJ1ZywgREVGQVVMVF9NU0dfRU5BQkxFKTsKIAotCQlsaW8tPmRldl9jYXBhYmlsaXR5ID0gTkVUSUZfRl9ISUdIRE1BCi0JCQkJfCBORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX0lQVjZfQ1NVTQotCQkJCXwgTkVUSUZfRl9TRyB8IE5FVElGX0ZfUlhDU1VNCi0JCQkJfCBORVRJRl9GX0dSTwotCQkJCXwgTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzYKLQkJCQl8IE5FVElGX0ZfTFJPOworCQlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3Rlb25fZGV2KSB8fAorCQkgICAgT0NURU9OX0NONlhYWChvY3Rlb25fZGV2KSkgeworCQkJbGlvLT5kZXZfY2FwYWJpbGl0eSA9IE5FVElGX0ZfSElHSERNQQorCQkJCQkgICAgICB8IE5FVElGX0ZfSVBfQ1NVTQorCQkJCQkgICAgICB8IE5FVElGX0ZfSVBWNl9DU1VNCisJCQkJCSAgICAgIHwgTkVUSUZfRl9TRyB8IE5FVElGX0ZfUlhDU1VNCisJCQkJCSAgICAgIHwgTkVUSUZfRl9HUk8KKwkJCQkJICAgICAgfCBORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPNgorCQkJCQkgICAgICB8IE5FVElGX0ZfTFJPOworCQl9CiAJCW5ldGlmX3NldF9nc29fbWF4X3NpemUobmV0ZGV2LCBPQ1ROSUNfR1NPX01BWF9TSVpFKTsKIAogCQkvKiAgQ29weSBvZiB0cmFuc21pdCBlbmNhcHN1bGF0aW9uIGNhcGFiaWxpdGllczoKQEAgLTM3MTMsNyArMzkzNCwxMCBAQAogCiAJCS8qIFJlZ2lzdGVyIGV0aHRvb2wgc3VwcG9ydCAqLwogCQlsaXF1aWRpb19zZXRfZXRodG9vbF9vcHMobmV0ZGV2KTsKLQkJb2N0ZW9uX2Rldi0+cHJpdl9mbGFncyA9IDB4MDsKKwkJaWYgKGxpby0+b2N0X2Rldi0+Y2hpcF9pZCA9PSBPQ1RFT05fQ04yM1hYX1BGX1ZJRCkKKwkJCW9jdGVvbl9kZXYtPnByaXZfZmxhZ3MgPSBPQ1RfUFJJVl9GTEFHX0RFRkFVTFQ7CisJCWVsc2UKKwkJCW9jdGVvbl9kZXYtPnByaXZfZmxhZ3MgPSAweDA7CiAKIAkJaWYgKG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xSTykKIAkJCWxpcXVpZGlvX3NldF9mZWF0dXJlKG5ldGRldiwgT0NUTkVUX0NNRF9MUk9fRU5BQkxFLApAQCAtMzcyNSw2ICszOTQ5LDkgQEAKIAkJCWxpcXVpZGlvX3NldF9mZWF0dXJlKG5ldGRldiwKIAkJCQkJICAgICBPQ1RORVRfQ01EX1ZFUkJPU0VfRU5BQkxFLCAwKTsKIAorCQlpZiAoc2V0dXBfbGlua19zdGF0dXNfY2hhbmdlX3dxKG5ldGRldikpCisJCQlnb3RvIHNldHVwX25pY19kZXZfZmFpbDsKKwogCQkvKiBSZWdpc3RlciB0aGUgbmV0d29yayBkZXZpY2Ugd2l0aCB0aGUgT1MgKi8KIAkJaWYgKHJlZ2lzdGVyX25ldGRldihuZXRkZXYpKSB7CiAJCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJEZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CkBAIC0zNzYwLDYgKzM5ODcsOCBAQAogCiAJb2N0ZW9uX2ZyZWVfc29mdF9jb21tYW5kKG9jdGVvbl9kZXYsIHNjKTsKIAorc2V0dXBfbmljX3dhaXRfaW50cjoKKwogCXdoaWxlIChpLS0pIHsKIAkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LAogCQkJIk5JQyBpZmlkeDolZCBTZXR1cCBmYWlsZWRcbiIsIGkpOwpAQCAtMzc4OSw4ICs0MDE4LDcgQEAKIAkvKiBydW4gcG9ydF9jb25maWcgY29tbWFuZCBmb3IgZWFjaCBwb3J0ICovCiAJb2N0LT5pZmNvdW50ID0gbnVtX25pY19wb3J0czsKIAotCW1lbXNldChvY3QtPnByb3BzLCAwLAotCSAgICAgICBzaXplb2Yoc3RydWN0IG9jdGRldl9wcm9wcykgKiBudW1fbmljX3BvcnRzKTsKKwltZW1zZXQob2N0LT5wcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBvY3RkZXZfcHJvcHMpICogbnVtX25pY19wb3J0cyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX09DVEVPTl9MSU5LUzsgaSsrKQogCQlvY3QtPnByb3BzW2ldLmdteHBvcnQgPSAtMTsKQEAgLTM4MDYsNyArNDAzNCw3IEBACiAJLyogSW5pdGlhbGl6ZSBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBwYXJhbXMgKi8KIAlpbnRybW9kX2NmZyA9ICYoKHN0cnVjdCBvY3Rlb25fZGV2aWNlICopb2N0KS0+aW50cm1vZDsKIAlpbnRybW9kX2NmZy0+cnhfZW5hYmxlID0gMTsKLQlpbnRybW9kX2NmZy0+Y2hlY2tfaW50cnZsID0gICBMSU9fSU5UUk1PRF9DSEVDS19JTlRFUlZBTDsKKwlpbnRybW9kX2NmZy0+Y2hlY2tfaW50cnZsID0gTElPX0lOVFJNT0RfQ0hFQ0tfSU5URVJWQUw7CiAJaW50cm1vZF9jZmctPm1heHBrdF9yYXRldGhyID0gTElPX0lOVFJNT0RfTUFYUEtUX1JBVEVUSFI7CiAJaW50cm1vZF9jZmctPm1pbnBrdF9yYXRldGhyID0gTElPX0lOVFJNT0RfTUlOUEtUX1JBVEVUSFI7CiAJaW50cm1vZF9jZmctPnJ4X21heGNudF90cmlnZ2VyID0gTElPX0lOVFJNT0RfUlhNQVhDTlRfVFJJR0dFUjsKQEAgLTM4MTgsNiArNDA0Niw3IEBACiAJaW50cm1vZF9jZmctPnR4X21pbmNudF90cmlnZ2VyID0gTElPX0lOVFJNT0RfVFhNSU5DTlRfVFJJR0dFUjsKIAlpbnRybW9kX2NmZy0+cnhfZnJhbWVzID0gQ0ZHX0dFVF9PUV9JTlRSX1BLVChvY3Rlb25fZ2V0X2NvbmYob2N0KSk7CiAJaW50cm1vZF9jZmctPnJ4X3VzZWNzID0gQ0ZHX0dFVF9PUV9JTlRSX1RJTUUob2N0ZW9uX2dldF9jb25mKG9jdCkpOworCWludHJtb2RfY2ZnLT50eF9mcmFtZXMgPSBDRkdfR0VUX0lRX0lOVFJfUEtUKG9jdGVvbl9nZXRfY29uZihvY3QpKTsKIAlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIk5ldHdvcmsgaW50ZXJmYWNlcyByZWFkeVxuIik7CiAKIAlyZXR1cm4gcmV0dmFsOwpAQCAtMzg4MCw2ICs0MTA5LDcgQEAKIHN0YXRpYyBpbnQgb2N0ZW9uX2RldmljZV9pbml0KHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3Rlb25fZGV2KQogewogCWludCBqLCByZXQ7CisJaW50IGZ3X2xvYWRlZCA9IDA7CiAJY2hhciBib290Y21kW10gPSAiXG4iOwogCXN0cnVjdCBvY3Rlb25fZGV2aWNlX3ByaXYgKm9jdF9wcml2ID0KIAkJKHN0cnVjdCBvY3Rlb25fZGV2aWNlX3ByaXYgKilvY3Rlb25fZGV2LT5wcml2OwpAQCAtMzkwMSw5ICs0MTMxLDIzIEBACiAKIAlvY3Rlb25fZGV2LT5hcHBfbW9kZSA9IENWTV9EUlZfSU5WQUxJRF9BUFA7CiAKLQkvKiBEbyBhIHNvZnQgcmVzZXQgb2YgdGhlIE9jdGVvbiBkZXZpY2UuICovCi0JaWYgKG9jdGVvbl9kZXYtPmZuX2xpc3Quc29mdF9yZXNldChvY3Rlb25fZGV2KSkKKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3Rlb25fZGV2KSkgeworCQlpZiAoIWNuMjN4eF9md19sb2FkZWQob2N0ZW9uX2RldikpIHsKKwkJCWZ3X2xvYWRlZCA9IDA7CisJCQkvKiBEbyBhIHNvZnQgcmVzZXQgb2YgdGhlIE9jdGVvbiBkZXZpY2UuICovCisJCQlpZiAob2N0ZW9uX2Rldi0+Zm5fbGlzdC5zb2Z0X3Jlc2V0KG9jdGVvbl9kZXYpKQorCQkJCXJldHVybiAxOworCQkJLyogdGhpbmdzIG1pZ2h0IGhhdmUgY2hhbmdlZCAqLworCQkJaWYgKCFjbjIzeHhfZndfbG9hZGVkKG9jdGVvbl9kZXYpKQorCQkJCWZ3X2xvYWRlZCA9IDA7CisJCQllbHNlCisJCQkJZndfbG9hZGVkID0gMTsKKwkJfSBlbHNlIHsKKwkJCWZ3X2xvYWRlZCA9IDE7CisJCX0KKwl9IGVsc2UgaWYgKG9jdGVvbl9kZXYtPmZuX2xpc3Quc29mdF9yZXNldChvY3Rlb25fZGV2KSkgewogCQlyZXR1cm4gMTsKKwl9CiAKIAkvKiBJbml0aWFsaXplIHRoZSBkaXNwYXRjaCBtZWNoYW5pc20gdXNlZCB0byBwdXNoIHBhY2tldHMgYXJyaXZpbmcgb24KIAkgKiBPY3Rlb24gT3V0cHV0IHF1ZXVlcy4KQEAgLTM5MjUsNiArNDE2OSwyMiBAQAogCiAJb2N0ZW9uX3NldF9pb19xdWV1ZXNfb2ZmKG9jdGVvbl9kZXYpOwogCisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0ZW9uX2RldikpIHsKKwkJcmV0ID0gb2N0ZW9uX2Rldi0+Zm5fbGlzdC5zZXR1cF9kZXZpY2VfcmVncyhvY3Rlb25fZGV2KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiT0NURU9OOiBGYWlsZWQgdG8gY29uZmlndXJlIGRldmljZSByZWdpc3RlcnNcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCS8qIEluaXRpYWxpemUgc29mdCBjb21tYW5kIGJ1ZmZlciBwb29sCisJICovCisJaWYgKG9jdGVvbl9zZXR1cF9zY19idWZmZXJfcG9vbChvY3Rlb25fZGV2KSkgeworCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJzYyBidWZmZXIgcG9vbCBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAxOworCX0KKwlhdG9taWNfc2V0KCZvY3Rlb25fZGV2LT5zdGF0dXMsIE9DVF9ERVZfU0NfQlVGRl9QT09MX0lOSVRfRE9ORSk7CisKIAkvKiAgU2V0dXAgdGhlIGRhdGEgc3RydWN0dXJlcyB0aGF0IG1hbmFnZSB0aGlzIE9jdGVvbidzIElucHV0IHF1ZXVlcy4gKi8KIAlpZiAob2N0ZW9uX3NldHVwX2luc3RyX3F1ZXVlcyhvY3Rlb25fZGV2KSkgewogCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsCkBAIC0zOTM2LDE0ICs0MTk2LDYgQEAKIAl9CiAJYXRvbWljX3NldCgmb2N0ZW9uX2Rldi0+c3RhdHVzLCBPQ1RfREVWX0lOU1RSX1FVRVVFX0lOSVRfRE9ORSk7CiAKLQkvKiBJbml0aWFsaXplIHNvZnQgY29tbWFuZCBidWZmZXIgcG9vbAotCSAqLwotCWlmIChvY3Rlb25fc2V0dXBfc2NfYnVmZmVyX3Bvb2wob2N0ZW9uX2RldikpIHsKLQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAic2MgYnVmZmVyIHBvb2wgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JYXRvbWljX3NldCgmb2N0ZW9uX2Rldi0+c3RhdHVzLCBPQ1RfREVWX1NDX0JVRkZfUE9PTF9JTklUX0RPTkUpOwotCiAJLyogSW5pdGlhbGl6ZSBsaXN0cyB0byBtYW5hZ2UgdGhlIHJlcXVlc3RzIG9mIGRpZmZlcmVudCB0eXBlcyB0aGF0CiAJICogYXJyaXZlIGZyb20gdXNlciAmIGtlcm5lbCBhcHBsaWNhdGlvbnMgZm9yIHRoaXMgb2N0ZW9uIGRldmljZS4KIAkgKi8KQEAgLTM5NjMsMTUgKzQyMTUsMjMgQEAKIAogCWF0b21pY19zZXQoJm9jdGVvbl9kZXYtPnN0YXR1cywgT0NUX0RFVl9EUk9RX0lOSVRfRE9ORSk7CiAKLQkvKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBxdWV1ZSByZWdpc3RlcnMgd2VyZSBzZXR1cCBlYXJsaWVyICh0aGUgcXVldWVzCi0JICogd2VyZSBub3QgZW5hYmxlZCkuIEFueSBhZGRpdGlvbmFsIHJlZ2lzdGVycyB0aGF0IG5lZWQgdG8gYmUKLQkgKiBwcm9ncmFtbWVkIHNob3VsZCBiZSBkb25lIG5vdy4KLQkgKi8KLQlyZXQgPSBvY3Rlb25fZGV2LT5mbl9saXN0LnNldHVwX2RldmljZV9yZWdzKG9jdGVvbl9kZXYpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LAotCQkJIkZhaWxlZCB0byBjb25maWd1cmUgZGV2aWNlIHJlZ2lzdGVyc1xuIik7Ci0JCXJldHVybiByZXQ7CisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0ZW9uX2RldikpIHsKKwkJaWYgKG9jdGVvbl9hbGxvY2F0ZV9pb3FfdmVjdG9yKG9jdGVvbl9kZXYpKSB7CisJCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJPQ1RFT046IGlvcSB2ZWN0b3IgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCX0gZWxzZSB7CisJCS8qIFRoZSBpbnB1dCBhbmQgb3V0cHV0IHF1ZXVlIHJlZ2lzdGVycyB3ZXJlIHNldHVwIGVhcmxpZXIgKHRoZQorCQkgKiBxdWV1ZXMgd2VyZSBub3QgZW5hYmxlZCkuIEFueSBhZGRpdGlvbmFsIHJlZ2lzdGVycworCQkgKiB0aGF0IG5lZWQgdG8gYmUgcHJvZ3JhbW1lZCBzaG91bGQgYmUgZG9uZSBub3cuCisJCSAqLworCQlyZXQgPSBvY3Rlb25fZGV2LT5mbl9saXN0LnNldHVwX2RldmljZV9yZWdzKG9jdGVvbl9kZXYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsCisJCQkJIkZhaWxlZCB0byBjb25maWd1cmUgZGV2aWNlIHJlZ2lzdGVyc1xuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfQogCiAJLyogSW5pdGlhbGl6ZSB0aGUgdGFza2xldCB0aGF0IGhhbmRsZXMgb3V0cHV0IHF1ZXVlIHBhY2tldCBwcm9jZXNzaW5nLiovCkBAIC0zOTg1LDYzICs0MjQ1LDc2IEBACiAJCXJldHVybiAxOwogCiAJLyogRW5hYmxlIE9jdGVvbiBkZXZpY2UgaW50ZXJydXB0cyAqLwotCW9jdGVvbl9kZXYtPmZuX2xpc3QuZW5hYmxlX2ludGVycnVwdChvY3Rlb25fZGV2LT5jaGlwKTsKKwlvY3Rlb25fZGV2LT5mbl9saXN0LmVuYWJsZV9pbnRlcnJ1cHQob2N0ZW9uX2RldiwgT0NURU9OX0FMTF9JTlRSKTsKIAogCS8qIEVuYWJsZSB0aGUgaW5wdXQgYW5kIG91dHB1dCBxdWV1ZXMgZm9yIHRoaXMgT2N0ZW9uIGRldmljZSAqLwotCW9jdGVvbl9kZXYtPmZuX2xpc3QuZW5hYmxlX2lvX3F1ZXVlcyhvY3Rlb25fZGV2KTsKKwlyZXQgPSBvY3Rlb25fZGV2LT5mbl9saXN0LmVuYWJsZV9pb19xdWV1ZXMob2N0ZW9uX2Rldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIGlucHV0L291dHB1dCBxdWV1ZXMiKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAlhdG9taWNfc2V0KCZvY3Rlb25fZGV2LT5zdGF0dXMsIE9DVF9ERVZfSU9fUVVFVUVTX0RPTkUpOwogCi0JZGV2X2RiZygmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiV2FpdGluZyBmb3IgRERSIGluaXRpYWxpemF0aW9uLi4uXG4iKTsKKwlpZiAoKCFPQ1RFT05fQ04yM1hYX1BGKG9jdGVvbl9kZXYpKSB8fCAhZndfbG9hZGVkKSB7CisJCWRldl9kYmcoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIldhaXRpbmcgZm9yIEREUiBpbml0aWFsaXphdGlvbi4uLlxuIik7CisJCWlmICghZGRyX3RpbWVvdXQpIHsKKwkJCWRldl9pbmZvKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsCisJCQkJICJXQUlUSU5HLiBTZXQgZGRyX3RpbWVvdXQgdG8gbm9uLXplcm8gdmFsdWUgdG8gcHJvY2VlZCB3aXRoIGluaXRpYWxpemF0aW9uLlxuIik7CisJCX0KIAotCWlmIChkZHJfdGltZW91dCA9PSAwKQotCQlkZXZfaW5mbygmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiV0FJVElORy4gU2V0IGRkcl90aW1lb3V0IHRvIG5vbi16ZXJvIHZhbHVlIHRvIHByb2NlZWQgd2l0aCBpbml0aWFsaXphdGlvbi5cbiIpOworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShIWiAqIExJT19SRVNFVF9TRUNTKTsKIAotCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKEhaICogTElPX1JFU0VUX1NFQ1MpOwotCi0JLyogV2FpdCBmb3IgdGhlIG9jdGVvbiB0byBpbml0aWFsaXplIEREUiBhZnRlciB0aGUgc29mdC1yZXNldC4gKi8KLQl3aGlsZSAoZGRyX3RpbWVvdXQgPT0gMCkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlpZiAoc2NoZWR1bGVfdGltZW91dChIWiAvIDEwKSkgewotCQkJLyogdXNlciBwcm9iYWJseSBwcmVzc2VkIENvbnRyb2wtQyAqLworCQkvKiBXYWl0IGZvciB0aGUgb2N0ZW9uIHRvIGluaXRpYWxpemUgRERSIGFmdGVyIHRoZSBzb2Z0LXJlc2V0LiovCisJCXdoaWxlICghZGRyX3RpbWVvdXQpIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAoc2NoZWR1bGVfdGltZW91dChIWiAvIDEwKSkgeworCQkJCS8qIHVzZXIgcHJvYmFibHkgcHJlc3NlZCBDb250cm9sLUMgKi8KKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCQlyZXQgPSBvY3Rlb25fd2FpdF9mb3JfZGRyX2luaXQob2N0ZW9uX2RldiwgJmRkcl90aW1lb3V0KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LAorCQkJCSJERFIgbm90IGluaXRpYWxpemVkLiBQbGVhc2UgY29uZmlybSB0aGF0IGJvYXJkIGlzIGNvbmZpZ3VyZWQgdG8gYm9vdCBmcm9tIEZsYXNoLCByZXQ6ICVkXG4iLAorCQkJCXJldCk7CiAJCQlyZXR1cm4gMTsKIAkJfQotCX0KLQlyZXQgPSBvY3Rlb25fd2FpdF9mb3JfZGRyX2luaXQob2N0ZW9uX2RldiwgJmRkcl90aW1lb3V0KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwKLQkJCSJERFIgbm90IGluaXRpYWxpemVkLiBQbGVhc2UgY29uZmlybSB0aGF0IGJvYXJkIGlzIGNvbmZpZ3VyZWQgdG8gYm9vdCBmcm9tIEZsYXNoLCByZXQ6ICVkXG4iLAotCQkJcmV0KTsKLQkJcmV0dXJuIDE7Ci0JfQogCi0JaWYgKG9jdGVvbl93YWl0X2Zvcl9ib290bG9hZGVyKG9jdGVvbl9kZXYsIDEwMDApICE9IDApIHsKLQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiQm9hcmQgbm90IHJlc3BvbmRpbmdcbiIpOwotCQlyZXR1cm4gMTsKLQl9CisJCWlmIChvY3Rlb25fd2FpdF9mb3JfYm9vdGxvYWRlcihvY3Rlb25fZGV2LCAxMDAwKSkgeworCQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiQm9hcmQgbm90IHJlc3BvbmRpbmdcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KIAotCS8qIERpdmVydCB1Ym9vdCB0byB0YWtlIGNvbW1hbmRzIGZyb20gaG9zdCBpbnN0ZWFkLiAqLwotCXJldCA9IG9jdGVvbl9jb25zb2xlX3NlbmRfY21kKG9jdGVvbl9kZXYsIGJvb3RjbWQsIDUwKTsKKwkJLyogRGl2ZXJ0IHVib290IHRvIHRha2UgY29tbWFuZHMgZnJvbSBob3N0IGluc3RlYWQuICovCisJCXJldCA9IG9jdGVvbl9jb25zb2xlX3NlbmRfY21kKG9jdGVvbl9kZXYsIGJvb3RjbWQsIDUwKTsKIAotCWRldl9kYmcoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIkluaXRpYWxpemluZyBjb25zb2xlc1xuIik7Ci0JcmV0ID0gb2N0ZW9uX2luaXRfY29uc29sZXMob2N0ZW9uX2Rldik7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJDb3VsZCBub3QgYWNjZXNzIGJvYXJkIGNvbnNvbGVzXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldCA9IG9jdGVvbl9hZGRfY29uc29sZShvY3Rlb25fZGV2LCAwKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIkNvdWxkIG5vdCBhY2Nlc3MgYm9hcmQgY29uc29sZVxuIik7Ci0JCXJldHVybiAxOwotCX0KKwkJZGV2X2RiZygmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiSW5pdGlhbGl6aW5nIGNvbnNvbGVzXG4iKTsKKwkJcmV0ID0gb2N0ZW9uX2luaXRfY29uc29sZXMob2N0ZW9uX2Rldik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIkNvdWxkIG5vdCBhY2Nlc3MgYm9hcmQgY29uc29sZXNcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0ID0gb2N0ZW9uX2FkZF9jb25zb2xlKG9jdGVvbl9kZXYsIDApOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJDb3VsZCBub3QgYWNjZXNzIGJvYXJkIGNvbnNvbGVcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KIAotCWF0b21pY19zZXQoJm9jdGVvbl9kZXYtPnN0YXR1cywgT0NUX0RFVl9DT05TT0xFX0lOSVRfRE9ORSk7CisJCWF0b21pY19zZXQoJm9jdGVvbl9kZXYtPnN0YXR1cywgT0NUX0RFVl9DT05TT0xFX0lOSVRfRE9ORSk7CiAKLQlkZXZfZGJnKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJMb2FkaW5nIGZpcm13YXJlXG4iKTsKLQlyZXQgPSBsb2FkX2Zpcm13YXJlKG9jdGVvbl9kZXYpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiQ291bGQgbm90IGxvYWQgZmlybXdhcmUgdG8gYm9hcmRcbiIpOwotCQlyZXR1cm4gMTsKKwkJZGV2X2RiZygmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiTG9hZGluZyBmaXJtd2FyZVxuIik7CisJCXJldCA9IGxvYWRfZmlybXdhcmUob2N0ZW9uX2Rldik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIkNvdWxkIG5vdCBsb2FkIGZpcm13YXJlIHRvIGJvYXJkXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCS8qIHNldCBiaXQgMSBvZiBTTElfU0NSQVRDSF8xIHRvIGluZGljYXRlIHRoYXQgZmlybXdhcmUgaXMKKwkJICogbG9hZGVkCisJCSAqLworCQlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3Rlb25fZGV2KSkKKwkJCW9jdGVvbl93cml0ZV9jc3I2NChvY3Rlb25fZGV2LCBDTjIzWFhfU0xJX1NDUkFUQ0gxLAorCQkJCQkgICAyVUxMKTsKIAl9CiAKIAloYW5kc2hha2Vbb2N0ZW9uX2Rldi0+b2N0ZW9uX2lkXS5pbml0X29rID0gMTsKQEAgLTQwNTcsNyArNDMzMCw2IEBACiAJCSAgICAgICBvY3Rlb25fZGV2LT5kcm9xW2pdLT5wa3RzX2NyZWRpdF9yZWcpOwogCiAJLyogUGFja2V0cyBjYW4gc3RhcnQgYXJyaXZpbmcgb24gdGhlIG91dHB1dCBxdWV1ZXMgZnJvbSB0aGlzIHBvaW50LiAqLwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9saXF1aWRpb19jb21tb24uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9saXF1aWRpb19jb21tb24uaAppbmRleCAxOTlhOGI5Li4wZDk5MGFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vbGlxdWlkaW9fY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2xpcXVpZGlvX2NvbW1vbi5oCkBAIC0zMCwxMCArMzAsMjQgQEAKIAogI2luY2x1ZGUgIm9jdGVvbl9jb25maWcuaCIKIAotI2RlZmluZSBMSVFVSURJT19CQVNFX1ZFUlNJT04gICAiMS40IgotI2RlZmluZSBMSVFVSURJT19NSUNST19WRVJTSU9OICAiLjEiCiAjZGVmaW5lIExJUVVJRElPX1BBQ0tBR0UgIiIKLSNkZWZpbmUgTElRVUlESU9fVkVSU0lPTiAgIjEuNC4xIgorI2RlZmluZSBMSVFVSURJT19CQVNFX01BSk9SX1ZFUlNJT04gMQorI2RlZmluZSBMSVFVSURJT19CQVNFX01JTk9SX1ZFUlNJT04gNAorI2RlZmluZSBMSVFVSURJT19CQVNFX01JQ1JPX1ZFUlNJT04gMQorI2RlZmluZSBMSVFVSURJT19CQVNFX1ZFUlNJT04gICBfX3N0cmluZ2lmeShMSVFVSURJT19CQVNFX01BSk9SX1ZFUlNJT04pICIuIiBcCisJCQkJX19zdHJpbmdpZnkoTElRVUlESU9fQkFTRV9NSU5PUl9WRVJTSU9OKQorI2RlZmluZSBMSVFVSURJT19NSUNST19WRVJTSU9OICAiLiIgX19zdHJpbmdpZnkoTElRVUlESU9fQkFTRV9NSUNST19WRVJTSU9OKQorI2RlZmluZSBMSVFVSURJT19WRVJTSU9OICAgICAgICBMSVFVSURJT19QQUNLQUdFIFwKKwkJCQlfX3N0cmluZ2lmeShMSVFVSURJT19CQVNFX01BSk9SX1ZFUlNJT04pICIuIiBcCisJCQkJX19zdHJpbmdpZnkoTElRVUlESU9fQkFTRV9NSU5PUl9WRVJTSU9OKSBcCisJCQkJIi4iIF9fc3RyaW5naWZ5KExJUVVJRElPX0JBU0VfTUlDUk9fVkVSU0lPTikKKworc3RydWN0IGxpb192ZXJzaW9uIHsKKwl1MTYgIG1ham9yOworCXUxNiAgbWlub3I7CisJdTE2ICBtaWNybzsKKwl1MTYgIHJlc2VydmVkOworfTsKIAogI2RlZmluZSBDT05UUk9MX0lRIDAKIC8qKiBUYWcgdHlwZXMgdXNlZCBieSBPY3Rlb24gY29yZXMgaW4gaXRzIHdvcmsuICovCkBAIC0yMTgsNiArMjMyLDkgQEAKICNkZWZpbmUgICBPQ1RORVRfQ01EX0FERF9WTEFOX0ZJTFRFUiAgMHgxNwogI2RlZmluZSAgIE9DVE5FVF9DTURfREVMX1ZMQU5fRklMVEVSICAweDE4CiAjZGVmaW5lICAgT0NUTkVUX0NNRF9WWExBTl9QT1JUX0NPTkZJRyAweDE5CisKKyNkZWZpbmUgICBPQ1RORVRfQ01EX0lEX0FDVElWRSAgICAgICAgIDB4MWEKKwogI2RlZmluZSAgIE9DVE5FVF9DTURfVlhMQU5fUE9SVF9BREQgICAgMHgwCiAjZGVmaW5lICAgT0NUTkVUX0NNRF9WWExBTl9QT1JUX0RFTCAgICAweDEKICNkZWZpbmUgICBPQ1RORVRfQ01EX1JYQ1NVTV9FTkFCTEUgICAgIDB4MApAQCAtMjk2LDYgKzMxMywxMyBAQAogCiAjZGVmaW5lICAgT0NUTkVUX0NNRF9TSVpFICAgICAoc2l6ZW9mKHVuaW9uIG9jdG5ldF9jbWQpKQogCisvKnBraWloMyArIGlyaCArIG9zc3BbMF0gKyBvc3NwWzFdICsgcmRwICsgcnB0ciA9IDQwIGJ5dGVzICovCisjZGVmaW5lIExJT19TT0ZUQ01EUkVTUF9JSDIgICAgICAgNDAKKyNkZWZpbmUgTElPX1NPRlRDTURSRVNQX0lIMyAgICAgICAoNDAgKyA4KQorCisjZGVmaW5lIExJT19QQ0lDTURfTzIgICAgICAgICAgICAgMjQKKyNkZWZpbmUgTElPX1BDSUNNRF9PMyAgICAgICAgICAgICAoMjQgKyA4KQorCiAvKiBJbnN0cnVjdGlvbiBIZWFkZXIoRFBJKSAtIGZvciBPQ1RFT04tSUlJIG1vZGVscyAqLwogc3RydWN0ICBvY3Rlb25faW5zdHJfaWgzIHsKICNpZmRlZiBfX0JJR19FTkRJQU5fQklURklFTEQKQEAgLTgxNCw2ICs4MzgsOCBAQAogI2RlZmluZSBWSVRFU1NFX1BIWV9HUElPX0RSSVZFT0ZGIDB4NAogI2RlZmluZSBWSVRFU1NFX1BIWV9HUElPX0hJR0ggICAgIDB4MgogI2RlZmluZSBWSVRFU1NFX1BIWV9HUElPX0xPVyAgICAgIDB4MworI2RlZmluZSBMRURfSURFTlRJRklDQVRJT05fT04gICAgIDB4MQorI2RlZmluZSBMRURfSURFTlRJRklDQVRJT05fT0ZGICAgIDB4MAogCiBzdHJ1Y3Qgb2N0X21kaW9fY21kIHsKIAl1NjQgb3A7CkBAIC04MzIsNyArODU4LDcgQEAKIC8qIGludHJtb2Q6IG1heC4gcGFja2V0cyB0byB0cmlnZ2VyIGludGVycnVwdCAqLwogI2RlZmluZSBMSU9fSU5UUk1PRF9SWE1BWENOVF9UUklHR0VSCTM4NAogLyogaW50cm1vZDogbWluLiBwYWNrZXRzIHRvIHRyaWdnZXIgaW50ZXJydXB0ICovCi0jZGVmaW5lIExJT19JTlRSTU9EX1JYTUlOQ05UX1RSSUdHRVIJMQorI2RlZmluZSBMSU9fSU5UUk1PRF9SWE1JTkNOVF9UUklHR0VSCTAKIC8qIGludHJtb2Q6IG1heC4gdGltZSB0byB0cmlnZ2VyIGludGVycnVwdCAqLwogI2RlZmluZSBMSU9fSU5UUk1PRF9SWE1BWFRNUl9UUklHR0VSCTEyOAogLyogNjZ4eDppbnRybW9kOiBtaW4uIHRpbWUgdG8gdHJpZ2dlciBpbnRlcnJ1cHQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fY29uZmlnLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2NvbmZpZy5oCmluZGV4IGIzMzk2ZTMuLmM3NjU1NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fY29uZmlnLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9jb25maWcuaApAQCAtNjQsNiArNjQsMzQgQEAKICNkZWZpbmUgICBERUZBVUxUX05VTV9OSUNfUE9SVFNfNjhYWCAgIDQKICNkZWZpbmUgICBERUZBVUxUX05VTV9OSUNfUE9SVFNfNjhYWF8yMTBOViAgMgogCisvKiBDTjIzeHggIElRIGNvbmZpZ3VyYXRpb24gbWFjcm9zICovCisjZGVmaW5lICAgQ04yM1hYX01BWF9SSU5HU19QRVJfUEZfUEFTU18xXzAgMTIKKyNkZWZpbmUgICBDTjIzWFhfTUFYX1JJTkdTX1BFUl9QRl9QQVNTXzFfMSAzMgorI2RlZmluZSAgIENOMjNYWF9NQVhfUklOR1NfUEVSX1BGICAgICAgICAgIDY0CisKKyNkZWZpbmUgICBDTjIzWFhfTUFYX0lOUFVUX1FVRVVFUwlDTjIzWFhfTUFYX1JJTkdTX1BFUl9QRgorI2RlZmluZSAgIENOMjNYWF9NQVhfSVFfREVTQ1JJUFRPUlMJMjA0OAorI2RlZmluZSAgIENOMjNYWF9EQl9NSU4gICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICBDTjIzWFhfREJfTUFYICAgICAgICAgICAgICAgICA4CisjZGVmaW5lICAgQ04yM1hYX0RCX1RJTUVPVVQgICAgICAgICAgICAgMQorCisjZGVmaW5lICAgQ04yM1hYX01BWF9PVVRQVVRfUVVFVUVTCUNOMjNYWF9NQVhfUklOR1NfUEVSX1BGCisjZGVmaW5lICAgQ04yM1hYX01BWF9PUV9ERVNDUklQVE9SUwkyMDQ4CisjZGVmaW5lICAgQ04yM1hYX09RX0JVRl9TSVpFCQkxNTM2CisjZGVmaW5lICAgQ04yM1hYX09RX1BLVFNQRVJfSU5UUgkxMjgKKy8qI2RlZmluZSBDQVZJVU1fT05MWV9DTjIzWFhfUlhfUEVSRiovCisjZGVmaW5lICAgQ04yM1hYX09RX1JFRklMX1RIUkVTSE9MRAkxMjgKKworI2RlZmluZSAgIENOMjNYWF9PUV9JTlRSX1BLVAkJNjQKKyNkZWZpbmUgICBDTjIzWFhfT1FfSU5UUl9USU1FCQkxMDAKKyNkZWZpbmUgICBERUZBVUxUX05VTV9OSUNfUE9SVFNfMjNYWAkxCisKKyNkZWZpbmUgICBDTjIzWFhfQ0ZHX0lPX1FVRVVFUwkJQ04yM1hYX01BWF9SSU5HU19QRVJfUEYKKy8qIFBFTXMgY291bnQgKi8KKyNkZWZpbmUgICBDTjIzWFhfTUFYX01BQ1MJCTQKKworI2RlZmluZSAgIENOMjNYWF9ERUZfSVFfSU5UUl9USFJFU0hPTEQJMzIKKyNkZWZpbmUgICBDTjIzWFhfREVGX0lRX0lOVFJfQllURV9USFJFU0hPTEQgICAoNjQgKiAxMDI0KQogLyogY29tbW9uIE9DVEVPTiBjb25maWd1cmF0aW9uIG1hY3JvcyAqLwogI2RlZmluZSAgIENONlhYWF9DRkdfSU9fUVVFVUVTICAgICAgICAgMzIKICNkZWZpbmUgICBPQ1RFT05fMzJCWVRFX0lOU1RSICAgICAgICAgIDMyCkBAIC05Miw2ICsxMjAsOSBAQAogI2RlZmluZSBDRkdfR0VUX0lRX0RCX01JTihjZmcpICAgICAgICAgICAgICAgICAgICgoY2ZnKS0+aXEuZGJfbWluKQogI2RlZmluZSBDRkdfR0VUX0lRX0RCX1RJTUVPVVQoY2ZnKSAgICAgICAgICAgICAgICgoY2ZnKS0+aXEuZGJfdGltZW91dCkKIAorI2RlZmluZSBDRkdfR0VUX0lRX0lOVFJfUEtUKGNmZykgICAgICAgICAgICAgICAgICgoY2ZnKS0+aXEuaXFfaW50cl9wa3QpCisjZGVmaW5lIENGR19TRVRfSVFfSU5UUl9QS1QoY2ZnLCB2YWwpICAgICAgICAgICAgKGNmZyktPmlxLmlxX2ludHJfcGt0ID0gdmFsCisKICNkZWZpbmUgQ0ZHX0dFVF9PUV9NQVhfUShjZmcpICAgICAgICAgICAgICAgICAgICAoKGNmZyktPm9xLm1heF9vcXMpCiAjZGVmaW5lIENGR19HRVRfT1FfSU5GT19QVFIoY2ZnKSAgICAgICAgICAgICAgICAgKChjZmcpLT5vcS5pbmZvX3B0cikKICNkZWZpbmUgQ0ZHX0dFVF9PUV9QS1RTX1BFUl9JTlRSKGNmZykgICAgICAgICAgICAoKGNmZyktPm9xLnBrdHNfcGVyX2ludHIpCkBAIC0xNDAsMTkgKzE3MSwyNCBAQAogZW51bSBsaW9fY2FyZF90eXBlIHsKIAlMSU9fMjEwU1YgPSAwLCAvKiBUd28gcG9ydCwgNjZ4eCAqLwogCUxJT18yMTBOViwgICAgIC8qIFR3byBwb3J0LCA2OHh4ICovCi0JTElPXzQxME5WICAgICAgLyogRm91ciBwb3J0LCA2OHh4ICovCisJTElPXzQxME5WLCAgICAgLyogRm91ciBwb3J0LCA2OHh4ICovCisJTElPXzIzWFggICAgICAgLyogMjN4eCAqLwogfTsKIAogI2RlZmluZSBMSU9fMjEwU1ZfTkFNRSAiMjEwc3YiCiAjZGVmaW5lIExJT18yMTBOVl9OQU1FICIyMTBudiIKICNkZWZpbmUgTElPXzQxME5WX05BTUUgIjQxMG52IgorI2RlZmluZSBMSU9fMjNYWF9OQU1FICAiMjN4eCIKIAogLyoqIFN0cnVjdHVyZSB0byBkZWZpbmUgdGhlIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlcyBmb3IgZWFjaCBJbnB1dCBxdWV1ZS4KICAqICBBcHBsaWNhYmxlIHRvIGFsbCBPY3Rlb24gcHJvY2Vzc29ycwogICoqLwogc3RydWN0IG9jdGVvbl9pcV9jb25maWcgewogI2lmZGVmIF9fQklHX0VORElBTl9CSVRGSUVMRAotCXU2NCByZXNlcnZlZDozMjsKKwl1NjQgcmVzZXJ2ZWQ6MTY7CisKKwkvKiogVHggaW50ZXJydXB0IHBhY2tldHMuIEFwcGxpY2FibGUgdG8gMjN4eCBvbmx5ICovCisJdTY0IGlxX2ludHJfcGt0OjE2OwogCiAJLyoqIE1pbmltdW0gdGlja3MgdG8gd2FpdCBiZWZvcmUgY2hlY2tpbmcgZm9yIHBlbmRpbmcgaW5zdHJ1Y3Rpb25zLiAqLwogCXU2NCBkYl90aW1lb3V0OjE2OwpAQCAtMTkyLDcgKzIyOCwxMCBAQAogCS8qKiBNaW5pbXVtIHRpY2tzIHRvIHdhaXQgYmVmb3JlIGNoZWNraW5nIGZvciBwZW5kaW5nIGluc3RydWN0aW9ucy4gKi8KIAl1NjQgZGJfdGltZW91dDoxNjsKIAotCXU2NCByZXNlcnZlZDozMjsKKwkvKiogVHggaW50ZXJydXB0IHBhY2tldHMuIEFwcGxpY2FibGUgdG8gMjN4eCBvbmx5ICovCisJdTY0IGlxX2ludHJfcGt0OjE2OworCisJdTY0IHJlc2VydmVkOjE2OwogI2VuZGlmCiB9OwogCkBAIC00MTYsMTEgKzQ1NSwxNSBAQAogI2RlZmluZSBESVNQQVRDSF9MSVNUX1NJWkUgICAgICAgICAgICAgICAgICAgICAgQklUKE9QQ09ERV9NQVNLX0JJVFMpCiAKIC8qIE1heGltdW0gbnVtYmVyIG9mIE9jdGVvbiBJbnN0cnVjdGlvbiAoY29tbWFuZCkgcXVldWVzICovCi0jZGVmaW5lIE1BWF9PQ1RFT05fSU5TVFJfUVVFVUVTKG9jdCkgICAgICAgICBDTjZYWFhfTUFYX0lOUFVUX1FVRVVFUwotLyogTWF4aW11bSBudW1iZXIgb2YgT2N0ZW9uIE91dHB1dCBxdWV1ZXMgKi8KLSNkZWZpbmUgTUFYX09DVEVPTl9PVVRQVVRfUVVFVUVTKG9jdCkgICAgICAgICBDTjZYWFhfTUFYX09VVFBVVF9RVUVVRVMKKyNkZWZpbmUgTUFYX09DVEVPTl9JTlNUUl9RVUVVRVMob2N0KQkJXAorCQkoT0NURU9OX0NOMjNYWF9QRihvY3QpID8gQ04yM1hYX01BWF9JTlBVVF9RVUVVRVMgOiBcCisJCQkJCUNONlhYWF9NQVhfSU5QVVRfUVVFVUVTKQogCi0jZGVmaW5lIE1BWF9QT1NTSUJMRV9PQ1RFT05fSU5TVFJfUVVFVUVTICAgICAgIENONlhYWF9NQVhfSU5QVVRfUVVFVUVTCi0jZGVmaW5lIE1BWF9QT1NTSUJMRV9PQ1RFT05fT1VUUFVUX1FVRVVFUyAgICAgIENONlhYWF9NQVhfT1VUUFVUX1FVRVVFUworLyogTWF4aW11bSBudW1iZXIgb2YgT2N0ZW9uIEluc3RydWN0aW9uIChjb21tYW5kKSBxdWV1ZXMgKi8KKyNkZWZpbmUgTUFYX09DVEVPTl9PVVRQVVRfUVVFVUVTKG9jdCkJCVwKKwkJKE9DVEVPTl9DTjIzWFhfUEYob2N0KSA/IENOMjNYWF9NQVhfT1VUUFVUX1FVRVVFUyA6IFwKKwkJCQkJQ042WFhYX01BWF9PVVRQVVRfUVVFVUVTKQogCisjZGVmaW5lIE1BWF9QT1NTSUJMRV9PQ1RFT05fSU5TVFJfUVVFVUVTCUNOMjNYWF9NQVhfSU5QVVRfUVVFVUVTCisjZGVmaW5lIE1BWF9QT1NTSUJMRV9PQ1RFT05fT1VUUFVUX1FVRVVFUwlDTjIzWFhfTUFYX09VVFBVVF9RVUVVRVMKICNlbmRpZiAvKiBfX09DVEVPTl9DT05GSUdfSF9fICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9jb25zb2xlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2NvbnNvbGUuYwppbmRleCBiYmI1MGVhLi4wMWE1MGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2NvbnNvbGUuYwpAQCAtMjUsMTIgKzI1LDEzIEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgImxpcXVpZGlvX2NvbW1vbi5oIgogI2luY2x1ZGUgIm9jdGVvbl9kcm9xLmgiCiAjaW5jbHVkZSAib2N0ZW9uX2lxLmgiCiAjaW5jbHVkZSAicmVzcG9uc2VfbWFuYWdlci5oIgogI2luY2x1ZGUgIm9jdGVvbl9kZXZpY2UuaCIKLSNpbmNsdWRlICJvY3Rlb25fbWFpbi5oIgorI2luY2x1ZGUgImxpcXVpZGlvX2ltYWdlLmgiCiAjaW5jbHVkZSAib2N0ZW9uX21lbV9vcHMuaCIKIAogc3RhdGljIHZvaWQgb2N0ZW9uX3JlbW90ZV9sb2NrKHZvaWQpOwpAQCAtNDAsNiArNDEsMTAgQEAKIAkJCQkJICAgICB1MzIgZmxhZ3MpOwogc3RhdGljIGludCBvY3Rlb25fY29uc29sZV9yZWFkKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHUzMiBjb25zb2xlX251bSwKIAkJCSAgICAgICBjaGFyICpidWZmZXIsIHUzMiBidWZfc2l6ZSk7CitzdGF0aWMgdTMyIGNvbnNvbGVfYml0bWFzazsKK21vZHVsZV9wYXJhbShjb25zb2xlX2JpdG1hc2ssIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNvbnNvbGVfYml0bWFzaywKKwkJICJCaXRtYXNrIGluZGljYXRpbmcgd2hpY2ggY29uc29sZXMgaGF2ZSBkZWJ1ZyBvdXRwdXQgcmVkaXJlY3RlZCB0byBzeXNsb2cuIik7CiAKICNkZWZpbmUgTUlOKGEsIGIpIG1pbigoYSksIChiKSkKICNkZWZpbmUgQ0FTVF9VTEwodikgKCh1NjQpKHYpKQpAQCAtMTc3LDYgKzE4MiwxNSBAQAogCV9fY3ZteF9ib290bWVtX2Rlc2NfZ2V0KG9jdCwgYWRkciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQlvZmZzZXRvZihzdHJ1Y3QgY3ZteF9ib290bWVtX25hbWVkX2Jsb2NrX2Rlc2MsIGZpZWxkKSwgICBcCiAJCVNJWkVPRl9GSUVMRChzdHJ1Y3QgY3ZteF9ib290bWVtX25hbWVkX2Jsb2NrX2Rlc2MsIGZpZWxkKSkKKy8qKgorICogXGJyaWVmIGRldGVybWluZXMgaWYgYSBnaXZlbiBjb25zb2xlIGhhcyBkZWJ1ZyBlbmFibGVkLgorICogQHBhcmFtIGNvbnNvbGUgY29uc29sZSB0byBjaGVjaworICogQHJldHVybnMgIDEgPSBlbmFibGVkLiAwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IG9jdGVvbl9jb25zb2xlX2RlYnVnX2VuYWJsZWQodTMyIGNvbnNvbGUpCit7CisJcmV0dXJuIChjb25zb2xlX2JpdG1hc2sgPj4gKGNvbnNvbGUpKSAmIDB4MTsKK30KIAogLyoqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ2V0IG1hY3JvcyBkZWZpbmVkCkBAIC03MDksMyArNzIzLDEwNCBAQAogCiAJcmV0dXJuIGJ5dGVzX3RvX3JlYWQ7CiB9CisKKyNkZWZpbmUgRkJVRl9TSVpFCSg0ICogMTAyNCAqIDEwMjQpCit1OCBmYnVmW0ZCVUZfU0laRV07CisKK2ludCBvY3Rlb25fZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgY29uc3QgdTggKmRhdGEsCisJCQkgICAgIHNpemVfdCBzaXplKQoreworCWludCByZXQgPSAwOworCXU4ICpwID0gZmJ1ZjsKKwl1MzIgY3JjMzJfcmVzdWx0OworCXU2NCBsb2FkX2FkZHI7CisJdTMyIGltYWdlX2xlbjsKKwlzdHJ1Y3Qgb2N0ZW9uX2Zpcm13YXJlX2ZpbGVfaGVhZGVyICpoOworCXUzMiBpLCByZW07CisKKwlpZiAoc2l6ZSA8IHNpemVvZihzdHJ1Y3Qgb2N0ZW9uX2Zpcm13YXJlX2ZpbGVfaGVhZGVyKSkgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIkZpcm13YXJlIGZpbGUgdG9vIHNtYWxsICglZCA8ICVkKS5cbiIsCisJCQkodTMyKXNpemUsCisJCQkodTMyKXNpemVvZihzdHJ1Y3Qgb2N0ZW9uX2Zpcm13YXJlX2ZpbGVfaGVhZGVyKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWggPSAoc3RydWN0IG9jdGVvbl9maXJtd2FyZV9maWxlX2hlYWRlciAqKWRhdGE7CisKKwlpZiAoYmUzMl90b19jcHUoaC0+bWFnaWMpICE9IExJT19OSUNfTUFHSUMpIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJVbnJlY29nbml6ZWQgZmlybXdhcmUgZmlsZS5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljcmMzMl9yZXN1bHQgPSBjcmMzMigodW5zaWduZWQgaW50KX4wLCBkYXRhLAorCQkJICAgICBzaXplb2Yoc3RydWN0IG9jdGVvbl9maXJtd2FyZV9maWxlX2hlYWRlcikgLQorCQkJICAgICBzaXplb2YodTMyKSkgXiB+MFU7CisJaWYgKGNyYzMyX3Jlc3VsdCAhPSBiZTMyX3RvX2NwdShoLT5jcmMzMikpIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJGaXJtd2FyZSBDUkMgbWlzbWF0Y2ggKDB4JTA4eCAhPSAweCUwOHgpLlxuIiwKKwkJCWNyYzMyX3Jlc3VsdCwgYmUzMl90b19jcHUoaC0+Y3JjMzIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHN0cm5jbXAoTElRVUlESU9fUEFDS0FHRSwgaC0+dmVyc2lvbiwgc3RybGVuKExJUVVJRElPX1BBQ0tBR0UpKSkgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIlVubWF0Y2hlZCBmaXJtd2FyZSBwYWNrYWdlIHR5cGUuIEV4cGVjdGVkICVzLCBnb3QgJXMuXG4iLAorCQkJTElRVUlESU9fUEFDS0FHRSwgaC0+dmVyc2lvbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChtZW1jbXAoTElRVUlESU9fQkFTRV9WRVJTSU9OLCBoLT52ZXJzaW9uICsgc3RybGVuKExJUVVJRElPX1BBQ0tBR0UpLAorCQkgICBzdHJsZW4oTElRVUlESU9fQkFTRV9WRVJTSU9OKSkpIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJVbm1hdGNoZWQgZmlybXdhcmUgdmVyc2lvbi4gRXhwZWN0ZWQgJXMueCwgZ290ICVzLlxuIiwKKwkJCUxJUVVJRElPX0JBU0VfVkVSU0lPTiwKKwkJCWgtPnZlcnNpb24gKyBzdHJsZW4oTElRVUlESU9fUEFDS0FHRSkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYmUzMl90b19jcHUoaC0+bnVtX2ltYWdlcykgPiBMSU9fTUFYX0lNQUdFUykgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIlRvbyBtYW55IGltYWdlcyBpbiBmaXJtd2FyZSBmaWxlICglZCkuXG4iLAorCQkJYmUzMl90b19jcHUoaC0+bnVtX2ltYWdlcykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICJGaXJtd2FyZSB2ZXJzaW9uOiAlc1xuIiwgaC0+dmVyc2lvbik7CisJc25wcmludGYob2N0LT5md19pbmZvLmxpcXVpZGlvX2Zpcm13YXJlX3ZlcnNpb24sIDMyLCAiTElRVUlESU86ICVzIiwKKwkJIGgtPnZlcnNpb24pOworCisJZGF0YSArPSBzaXplb2Yoc3RydWN0IG9jdGVvbl9maXJtd2FyZV9maWxlX2hlYWRlcik7CisKKwlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlczogTG9hZGluZyAlZCBpbWFnZXNcbiIsIF9fZnVuY19fLAorCQkgYmUzMl90b19jcHUoaC0+bnVtX2ltYWdlcykpOworCS8qIGxvYWQgYWxsIGltYWdlcyAqLworCWZvciAoaSA9IDA7IGkgPCBiZTMyX3RvX2NwdShoLT5udW1faW1hZ2VzKTsgaSsrKSB7CisJCWxvYWRfYWRkciA9IGJlNjRfdG9fY3B1KGgtPmRlc2NbaV0uYWRkcik7CisJCWltYWdlX2xlbiA9IGJlMzJfdG9fY3B1KGgtPmRlc2NbaV0ubGVuKTsKKworCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICJMb2FkaW5nIGZpcm13YXJlICVkIGF0ICVsbHhcbiIsCisJCQkgaW1hZ2VfbGVuLCBsb2FkX2FkZHIpOworCisJCS8qIFdyaXRlIGluIDRNQiBjaHVua3MqLworCQlyZW0gPSBpbWFnZV9sZW47CisKKwkJd2hpbGUgKHJlbSkgeworCQkJaWYgKHJlbSA8IEZCVUZfU0laRSkKKwkJCQlzaXplID0gcmVtOworCQkJZWxzZQorCQkJCXNpemUgPSBGQlVGX1NJWkU7CisKKwkJCW1lbWNweShwLCBkYXRhLCBzaXplKTsKKworCQkJLyogZG93bmxvYWQgdGhlIGltYWdlICovCisJCQlvY3Rlb25fcGNpX3dyaXRlX2NvcmVfbWVtKG9jdCwgbG9hZF9hZGRyLCBwLCAodTMyKXNpemUpOworCisJCQlkYXRhICs9IHNpemU7CisJCQlyZW0gLT0gKHUzMilzaXplOworCQkJbG9hZF9hZGRyICs9IHNpemU7CisJCX0KKwl9CisJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiV3JpdGluZyBib290IGNvbW1hbmQ6ICVzXG4iLAorCQkgaC0+Ym9vdGNtZCk7CisKKwkvKiBJbnZva2UgdGhlIGJvb3RjbWQgKi8KKwlyZXQgPSBvY3Rlb25fY29uc29sZV9zZW5kX2NtZChvY3QsIGgtPmJvb3RjbWQsIDUwKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9kZXZpY2UuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fZGV2aWNlLmMKaW5kZXggMGViNTA0YS4uNTg2YjY4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9kZXZpY2UuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2RldmljZS5jCkBAIC0yMCw3ICsyMCw2IEBACiAqIENvbnRhY3QgQ2F2aXVtLCBJbmMuIGZvciBtb3JlIGluZm9ybWF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgImxpcXVpZGlvX2NvbW1vbi5oIgpAQCAtMzIsOCArMzEsNyBAQAogI2luY2x1ZGUgIm9jdGVvbl9uZXR3b3JrLmgiCiAjaW5jbHVkZSAiY242Nnh4X3JlZ3MuaCIKICNpbmNsdWRlICJjbjY2eHhfZGV2aWNlLmgiCi0jaW5jbHVkZSAibGlxdWlkaW9faW1hZ2UuaCIKLSNpbmNsdWRlICJvY3Rlb25fbWVtX29wcy5oIgorI2luY2x1ZGUgImNuMjN4eF9wZl9kZXZpY2UuaCIKIAogLyoqIERlZmF1bHQgY29uZmlndXJhdGlvbgogICogIGZvciBDTjY2WFggT0NURU9OIE1vZGVscy4KQEAgLTQyMCw2ICs0MTgsMTA4IEBACiAJLAogfTsKIAorc3RhdGljIHN0cnVjdCBvY3Rlb25fY29uZmlnIGRlZmF1bHRfY24yM3h4X2NvbmYgPSB7CisJLmNhcmRfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTElPXzIzWFgsCisJLmNhcmRfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTElPXzIzWFhfTkFNRSwKKwkvKiogSVEgYXR0cmlidXRlcyAqLworCS5pcSA9IHsKKwkJLm1heF9pcXMJCT0gQ04yM1hYX0NGR19JT19RVUVVRVMsCisJCS5wZW5kaW5nX2xpc3Rfc2l6ZQk9IChDTjIzWFhfTUFYX0lRX0RFU0NSSVBUT1JTICoKKwkJCQkJICAgQ04yM1hYX0NGR19JT19RVUVVRVMpLAorCQkuaW5zdHJfdHlwZQkJPSBPQ1RFT05fNjRCWVRFX0lOU1RSLAorCQkuZGJfbWluCQkJPSBDTjIzWFhfREJfTUlOLAorCQkuZGJfdGltZW91dAkJPSBDTjIzWFhfREJfVElNRU9VVCwKKwkJLmlxX2ludHJfcGt0CQk9IENOMjNYWF9ERUZfSVFfSU5UUl9USFJFU0hPTEQsCisJfSwKKworCS8qKiBPUSBhdHRyaWJ1dGVzICovCisJLm9xID0geworCQkubWF4X29xcwkJPSBDTjIzWFhfQ0ZHX0lPX1FVRVVFUywKKwkJLmluZm9fcHRyCQk9IE9DVEVPTl9PUV9JTkZPUFRSX01PREUsCisJCS5wa3RzX3Blcl9pbnRyCT0gQ04yM1hYX09RX1BLVFNQRVJfSU5UUiwKKwkJLnJlZmlsbF90aHJlc2hvbGQJPSBDTjIzWFhfT1FfUkVGSUxfVEhSRVNIT0xELAorCQkub3FfaW50cl9wa3QJPSBDTjIzWFhfT1FfSU5UUl9QS1QsCisJCS5vcV9pbnRyX3RpbWUJPSBDTjIzWFhfT1FfSU5UUl9USU1FLAorCX0sCisKKwkubnVtX25pY19wb3J0cwkJCQk9IERFRkFVTFRfTlVNX05JQ19QT1JUU18yM1hYLAorCS5udW1fZGVmX3J4X2Rlc2NzCQkJPSBDTjIzWFhfTUFYX09RX0RFU0NSSVBUT1JTLAorCS5udW1fZGVmX3R4X2Rlc2NzCQkJPSBDTjIzWFhfTUFYX0lRX0RFU0NSSVBUT1JTLAorCS5kZWZfcnhfYnVmX3NpemUJCQk9IENOMjNYWF9PUV9CVUZfU0laRSwKKworCS8qIEZvciBldGhlcm5ldCBpbnRlcmZhY2UgMDogIFBvcnQgY2ZnIEF0dHJpYnV0ZXMgKi8KKwkubmljX2lmX2NmZ1swXSA9IHsKKwkJLyogTWF4IFR4cXM6IEhhbGYgZm9yIGVhY2ggb2YgdGhlIHR3byBwb3J0cyA6bWF4X2lxLzIgKi8KKwkJLm1heF90eHFzCQkJPSBNQVhfVFhRU19QRVJfSU5URiwKKworCQkvKiBBY3R1YWwgY29uZmlndXJlZCB2YWx1ZS4gUmFuZ2UgY291bGQgYmU6IDEuLi5tYXhfdHhxcyAqLworCQkubnVtX3R4cXMJCQk9IERFRl9UWFFTX1BFUl9JTlRGLAorCisJCS8qIE1heCBSeHFzOiBIYWxmIGZvciBlYWNoIG9mIHRoZSB0d28gcG9ydHMgOm1heF9vcS8yICAqLworCQkubWF4X3J4cXMJCQk9IE1BWF9SWFFTX1BFUl9JTlRGLAorCisJCS8qIEFjdHVhbCBjb25maWd1cmVkIHZhbHVlLiBSYW5nZSBjb3VsZCBiZTogMS4uLm1heF9yeHFzICovCisJCS5udW1fcnhxcwkJCT0gREVGX1JYUVNfUEVSX0lOVEYsCisKKwkJLyogTnVtIG9mIGRlc2MgZm9yIHJ4IHJpbmdzICovCisJCS5udW1fcnhfZGVzY3MJCQk9IENOMjNYWF9NQVhfT1FfREVTQ1JJUFRPUlMsCisKKwkJLyogTnVtIG9mIGRlc2MgZm9yIHR4IHJpbmdzICovCisJCS5udW1fdHhfZGVzY3MJCQk9IENOMjNYWF9NQVhfSVFfREVTQ1JJUFRPUlMsCisKKwkJLyogU0tCIHNpemUsIFdlIG5lZWQgbm90IGNoYW5nZSBidWYgc2l6ZSBldmVuIGZvciBKdW1ibyBmcmFtZXMuCisJCSAqIE9jdGVvbiBjYW4gc2VuZCBqdW1ibyBmcmFtZXMgaW4gNCBjb25zZWN1dGl2ZSBkZXNjcmlwdG9ycywKKwkJICovCisJCS5yeF9idWZfc2l6ZQkJCT0gQ04yM1hYX09RX0JVRl9TSVpFLAorCisJCS5iYXNlX3F1ZXVlCQkJPSBCQVNFX1FVRVVFX05PVF9SRVFVRVNURUQsCisKKwkJLmdteF9wb3J0X2lkCQkJPSAwLAorCX0sCisKKwkubmljX2lmX2NmZ1sxXSA9IHsKKwkJLyogTWF4IFR4cXM6IEhhbGYgZm9yIGVhY2ggb2YgdGhlIHR3byBwb3J0cyA6bWF4X2lxLzIgKi8KKwkJLm1heF90eHFzCQkJPSBNQVhfVFhRU19QRVJfSU5URiwKKworCQkvKiBBY3R1YWwgY29uZmlndXJlZCB2YWx1ZS4gUmFuZ2UgY291bGQgYmU6IDEuLi5tYXhfdHhxcyAqLworCQkubnVtX3R4cXMJCQk9IERFRl9UWFFTX1BFUl9JTlRGLAorCisJCS8qIE1heCBSeHFzOiBIYWxmIGZvciBlYWNoIG9mIHRoZSB0d28gcG9ydHMgOm1heF9vcS8yICAqLworCQkubWF4X3J4cXMJCQk9IE1BWF9SWFFTX1BFUl9JTlRGLAorCisJCS8qIEFjdHVhbCBjb25maWd1cmVkIHZhbHVlLiBSYW5nZSBjb3VsZCBiZTogMS4uLm1heF9yeHFzICovCisJCS5udW1fcnhxcwkJCT0gREVGX1JYUVNfUEVSX0lOVEYsCisKKwkJLyogTnVtIG9mIGRlc2MgZm9yIHJ4IHJpbmdzICovCisJCS5udW1fcnhfZGVzY3MJCQk9IENOMjNYWF9NQVhfT1FfREVTQ1JJUFRPUlMsCisKKwkJLyogTnVtIG9mIGRlc2MgZm9yIHR4IHJpbmdzICovCisJCS5udW1fdHhfZGVzY3MJCQk9IENOMjNYWF9NQVhfSVFfREVTQ1JJUFRPUlMsCisKKwkJLyogU0tCIHNpemUsIFdlIG5lZWQgbm90IGNoYW5nZSBidWYgc2l6ZSBldmVuIGZvciBKdW1ibyBmcmFtZXMuCisJCSAqIE9jdGVvbiBjYW4gc2VuZCBqdW1ibyBmcmFtZXMgaW4gNCBjb25zZWN1dGl2ZSBkZXNjcmlwdG9ycywKKwkJICovCisJCS5yeF9idWZfc2l6ZQkJCT0gQ04yM1hYX09RX0JVRl9TSVpFLAorCisJCS5iYXNlX3F1ZXVlCQkJPSBCQVNFX1FVRVVFX05PVF9SRVFVRVNURUQsCisKKwkJLmdteF9wb3J0X2lkCQkJPSAxLAorCX0sCisKKwkubWlzYwkJCQkJPSB7CisJCS8qIEhvc3QgZHJpdmVyIGxpbmsgcXVlcnkgaW50ZXJ2YWwgKi8KKwkJLm9jdF9saW5rX3F1ZXJ5X2ludGVydmFsCT0gMTAwLAorCisJCS8qIE9jdGVvbiBsaW5rIHF1ZXJ5IGludGVydmFsICovCisJCS5ob3N0X2xpbmtfcXVlcnlfaW50ZXJ2YWwJPSA1MDAsCisKKwkJLmVuYWJsZV9zbGlfb3FfYnAJCT0gMCwKKworCQkvKiBDb250cm9sIHF1ZXVlIGdyb3VwICovCisJCS5jdHJscV9ncnAJCQk9IDEsCisJfQorfTsKKwogZW51bSB7CiAJT0NURU9OX0NPTkZJR19UWVBFX0RFRkFVTFQgPSAwLAogCU5VTV9PQ1RFT05fQ09ORlMsCkBAIC00ODcsNiArNTg3LDggQEAKIAkJfSBlbHNlIGlmICgob2N0LT5jaGlwX2lkID09IE9DVEVPTl9DTjY4WFgpICYmCiAJCQkgICAoY2FyZF90eXBlID09IExJT180MTBOVikpIHsKIAkJCXJldCA9ICAodm9pZCAqKSZkZWZhdWx0X2NuNjh4eF9jb25mOworCQl9IGVsc2UgaWYgKG9jdC0+Y2hpcF9pZCA9PSBPQ1RFT05fQ04yM1hYX1BGX1ZJRCkgeworCQkJcmV0ID0gICh2b2lkICopJmRlZmF1bHRfY24yM3h4X2NvbmY7CiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTUwMSw3ICs2MDMsOCBAQAogCWNhc2UgT0NURU9OX0NONjZYWDoKIAljYXNlIE9DVEVPTl9DTjY4WFg6CiAJCXJldHVybiBsaW9fdmFsaWRhdGVfY242eHh4X2NvbmZpZ19pbmZvKG9jdCwgY29uZik7Ci0KKwljYXNlIE9DVEVPTl9DTjIzWFhfUEZfVklEOgorCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC01NDEsMTA3ICs2NDQsNiBAQAogCXJldHVybiBvY3RfZGV2X2FwcF9zdHJbQ1ZNX0RSVl9JTlZBTElEX0FQUCAtIENWTV9EUlZfQVBQX1NUQVJUXTsKIH0KIAotdTggZmJ1Zls0ICogMTAyNCAqIDEwMjRdOwotCi1pbnQgb2N0ZW9uX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIGNvbnN0IHU4ICpkYXRhLAotCQkJICAgICBzaXplX3Qgc2l6ZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQl1OCAqcCA9IGZidWY7Ci0JdTMyIGNyYzMyX3Jlc3VsdDsKLQl1NjQgbG9hZF9hZGRyOwotCXUzMiBpbWFnZV9sZW47Ci0Jc3RydWN0IG9jdGVvbl9maXJtd2FyZV9maWxlX2hlYWRlciAqaDsKLQl1MzIgaSwgcmVtLCBiYXNlX2xlbiA9IHN0cmxlbihMSVFVSURJT19CQVNFX1ZFUlNJT04pOwotCWNoYXIgKmJhc2U7Ci0KLQlpZiAoc2l6ZSA8IHNpemVvZihzdHJ1Y3Qgb2N0ZW9uX2Zpcm13YXJlX2ZpbGVfaGVhZGVyKSkgewotCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIkZpcm13YXJlIGZpbGUgdG9vIHNtYWxsICglZCA8ICVkKS5cbiIsCi0JCQkodTMyKXNpemUsCi0JCQkodTMyKXNpemVvZihzdHJ1Y3Qgb2N0ZW9uX2Zpcm13YXJlX2ZpbGVfaGVhZGVyKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWggPSAoc3RydWN0IG9jdGVvbl9maXJtd2FyZV9maWxlX2hlYWRlciAqKWRhdGE7Ci0KLQlpZiAoYmUzMl90b19jcHUoaC0+bWFnaWMpICE9IExJT19OSUNfTUFHSUMpIHsKLQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJVbnJlY29nbml6ZWQgZmlybXdhcmUgZmlsZS5cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljcmMzMl9yZXN1bHQgPSBjcmMzMigodW5zaWduZWQgaW50KX4wLCBkYXRhLAotCQkJICAgICBzaXplb2Yoc3RydWN0IG9jdGVvbl9maXJtd2FyZV9maWxlX2hlYWRlcikgLQotCQkJICAgICBzaXplb2YodTMyKSkgXiB+MFU7Ci0JaWYgKGNyYzMyX3Jlc3VsdCAhPSBiZTMyX3RvX2NwdShoLT5jcmMzMikpIHsKLQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJGaXJtd2FyZSBDUkMgbWlzbWF0Y2ggKDB4JTA4eCAhPSAweCUwOHgpLlxuIiwKLQkJCWNyYzMyX3Jlc3VsdCwgYmUzMl90b19jcHUoaC0+Y3JjMzIpKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHN0cm5jbXAoTElRVUlESU9fUEFDS0FHRSwgaC0+dmVyc2lvbiwgc3RybGVuKExJUVVJRElPX1BBQ0tBR0UpKSkgewotCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIlVubWF0Y2hlZCBmaXJtd2FyZSBwYWNrYWdlIHR5cGUuIEV4cGVjdGVkICVzLCBnb3QgJXMuXG4iLAotCQkJTElRVUlESU9fUEFDS0FHRSwgaC0+dmVyc2lvbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWJhc2UgPSBoLT52ZXJzaW9uICsgc3RybGVuKExJUVVJRElPX1BBQ0tBR0UpOwotCXJldCA9IG1lbWNtcChMSVFVSURJT19CQVNFX1ZFUlNJT04sIGJhc2UsIGJhc2VfbGVuKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiVW5tYXRjaGVkIGZpcm13YXJlIHZlcnNpb24uIEV4cGVjdGVkICVzLngsIGdvdCAlcy5cbiIsCi0JCQlMSVFVSURJT19CQVNFX1ZFUlNJT04sIGJhc2UpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoYmUzMl90b19jcHUoaC0+bnVtX2ltYWdlcykgPiBMSU9fTUFYX0lNQUdFUykgewotCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIlRvbyBtYW55IGltYWdlcyBpbiBmaXJtd2FyZSBmaWxlICglZCkuXG4iLAotCQkJYmUzMl90b19jcHUoaC0+bnVtX2ltYWdlcykpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICJGaXJtd2FyZSB2ZXJzaW9uOiAlc1xuIiwgaC0+dmVyc2lvbik7Ci0Jc25wcmludGYob2N0LT5md19pbmZvLmxpcXVpZGlvX2Zpcm13YXJlX3ZlcnNpb24sIDMyLCAiTElRVUlESU86ICVzIiwKLQkJIGgtPnZlcnNpb24pOwotCi0JZGF0YSArPSBzaXplb2Yoc3RydWN0IG9jdGVvbl9maXJtd2FyZV9maWxlX2hlYWRlcik7Ci0KLQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlczogTG9hZGluZyAlZCBpbWFnZXNcbiIsIF9fZnVuY19fLAotCQkgYmUzMl90b19jcHUoaC0+bnVtX2ltYWdlcykpOwotCS8qIGxvYWQgYWxsIGltYWdlcyAqLwotCWZvciAoaSA9IDA7IGkgPCBiZTMyX3RvX2NwdShoLT5udW1faW1hZ2VzKTsgaSsrKSB7Ci0JCWxvYWRfYWRkciA9IGJlNjRfdG9fY3B1KGgtPmRlc2NbaV0uYWRkcik7Ci0JCWltYWdlX2xlbiA9IGJlMzJfdG9fY3B1KGgtPmRlc2NbaV0ubGVuKTsKLQotCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICJMb2FkaW5nIGZpcm13YXJlICVkIGF0ICVsbHhcbiIsCi0JCQkgaW1hZ2VfbGVuLCBsb2FkX2FkZHIpOwotCi0JCS8qIFdyaXRlIGluIDRNQiBjaHVua3MqLwotCQlyZW0gPSBpbWFnZV9sZW47Ci0KLQkJd2hpbGUgKHJlbSkgewotCQkJaWYgKHJlbSA8ICg0ICogMTAyNCAqIDEwMjQpKQotCQkJCXNpemUgPSByZW07Ci0JCQllbHNlCi0JCQkJc2l6ZSA9IDQgKiAxMDI0ICogMTAyNDsKLQotCQkJbWVtY3B5KHAsIGRhdGEsIHNpemUpOwotCi0JCQkvKiBkb3dubG9hZCB0aGUgaW1hZ2UgKi8KLQkJCW9jdGVvbl9wY2lfd3JpdGVfY29yZV9tZW0ob2N0LCBsb2FkX2FkZHIsIHAsICh1MzIpc2l6ZSk7Ci0KLQkJCWRhdGEgKz0gc2l6ZTsKLQkJCXJlbSAtPSAodTMyKXNpemU7Ci0JCQlsb2FkX2FkZHIgKz0gc2l6ZTsKLQkJfQotCX0KLQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICJXcml0aW5nIGJvb3QgY29tbWFuZDogJXNcbiIsCi0JCSBoLT5ib290Y21kKTsKLQotCS8qIEludm9rZSB0aGUgYm9vdGNtZCAqLwotCXJldCA9IG9jdGVvbl9jb25zb2xlX3NlbmRfY21kKG9jdCwgaC0+Ym9vdGNtZCwgNTApOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHZvaWQgb2N0ZW9uX2ZyZWVfZGV2aWNlX21lbShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQogewogCWludCBpOwpAQCAtNjc2LDYgKzY3OCw5IEBACiAJCWNvbmZpZ3NpemUgPSBzaXplb2Yoc3RydWN0IG9jdGVvbl9jbjZ4eHgpOwogCQlicmVhazsKIAorCWNhc2UgT0NURU9OX0NOMjNYWF9QRl9WSUQ6CisJCWNvbmZpZ3NpemUgPSBzaXplb2Yoc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcl9lcnIoIiVzOiBVbmtub3duIFBDSSBEZXZpY2U6IDB4JXhcbiIsCiAJCSAgICAgICBfX2Z1bmNfXywKQEAgLTc0MSw2ICs3NDYsNDUgQEAKIAlyZXR1cm4gb2N0OwogfQogCitpbnQKK29jdGVvbl9hbGxvY2F0ZV9pb3FfdmVjdG9yKHN0cnVjdCBvY3Rlb25fZGV2aWNlICAqb2N0KQoreworCWludCBpLCBudW1faW9xcyA9IDA7CisJc3RydWN0IG9jdGVvbl9pb3FfdmVjdG9yICppb3FfdmVjdG9yOworCWludCBjcHVfbnVtOworCWludCBzaXplOworCisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkKKwkJbnVtX2lvcXMgPSBvY3QtPnNyaW92X2luZm8ubnVtX3BmX3JpbmdzOworCXNpemUgPSBzaXplb2Yoc3RydWN0IG9jdGVvbl9pb3FfdmVjdG9yKSAqIG51bV9pb3FzOworCisJb2N0LT5pb3FfdmVjdG9yID0gdm1hbGxvYyhzaXplKTsKKwlpZiAoIW9jdC0+aW9xX3ZlY3RvcikKKwkJcmV0dXJuIDE7CisJbWVtc2V0KG9jdC0+aW9xX3ZlY3RvciwgMCwgc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IG51bV9pb3FzOyBpKyspIHsKKwkJaW9xX3ZlY3RvcgkJPSAmb2N0LT5pb3FfdmVjdG9yW2ldOworCQlpb3FfdmVjdG9yLT5vY3RfZGV2CT0gb2N0OworCQlpb3FfdmVjdG9yLT5pcV9pbmRleAk9IGk7CisJCWlvcV92ZWN0b3ItPmRyb3FfaW5kZXgJPSBpOworCisJCWNwdV9udW0gPSBpICUgbnVtX29ubGluZV9jcHVzKCk7CisJCWNwdW1hc2tfc2V0X2NwdShjcHVfbnVtLCAmaW9xX3ZlY3Rvci0+YWZmaW5pdHlfbWFzayk7CisKKwkJaWYgKG9jdC0+Y2hpcF9pZCA9PSBPQ1RFT05fQ04yM1hYX1BGX1ZJRCkKKwkJCWlvcV92ZWN0b3ItPmlvcV9udW0JPSBpICsgb2N0LT5zcmlvdl9pbmZvLnBmX3NybjsKKwkJZWxzZQorCQkJaW9xX3ZlY3Rvci0+aW9xX251bQk9IGk7CisJfQorCXJldHVybiAwOworfQorCit2b2lkCitvY3Rlb25fZnJlZV9pb3FfdmVjdG9yKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJdmZyZWUob2N0LT5pb3FfdmVjdG9yKTsKK30KKwogLyogdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGZvciBzZXR0aW5nIHVwIHRoZSBmaXJzdCBxdWV1ZSAqLwogaW50IG9jdGVvbl9zZXR1cF9pbnN0cl9xdWV1ZXMoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKIHsKQEAgLTc0OSwxMCArNzkzLDEyIEBACiAJdW5pb24gb2N0X3R4cGNpcSB0eHBjaXE7CiAJaW50IG51bWFfbm9kZSA9IGNwdV90b19ub2RlKGlxX25vICUgbnVtX29ubGluZV9jcHVzKCkpOwogCi0JLyogdGhpcyBjYXVzZXMgcXVldWUgMCB0byBiZSBkZWZhdWx0IHF1ZXVlICovCiAJaWYgKE9DVEVPTl9DTjZYWFgob2N0KSkKIAkJbnVtX2Rlc2NzID0KIAkJCUNGR19HRVRfTlVNX0RFRl9UWF9ERVNDUyhDSElQX0ZJRUxEKG9jdCwgY242eHh4LCBjb25mKSk7CisJZWxzZSBpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKQorCQludW1fZGVzY3MgPSBDRkdfR0VUX05VTV9ERUZfVFhfREVTQ1MoQ0hJUF9GSUVMRChvY3QsIGNuMjN4eF9wZiwKKwkJCQkJCQkJY29uZikpOwogCiAJb2N0LT5udW1faXFzID0gMDsKIApAQCAtNzY5LDYgKzgxNSw3IEBACiAJb2N0LT5pbnN0cl9xdWV1ZVswXS0+aWZpZHggPSAwOwogCXR4cGNpcS51NjQgPSAwOwogCXR4cGNpcS5zLnFfbm8gPSBpcV9ubzsKKwl0eHBjaXEucy5wa2luZCA9IG9jdC0+cGZ2Zl9oc3dvcmQucGtpbmQ7CiAJdHhwY2lxLnMudXNlX3FwZyA9IDA7CiAJdHhwY2lxLnMucXBnID0gMDsKIAlpZiAob2N0ZW9uX2luaXRfaW5zdHJfcXVldWUob2N0LCB0eHBjaXEsIG51bV9kZXNjcykpIHsKQEAgLTc4OCwxNCArODM1LDE3IEBACiAJdTMyIG9xX25vID0gMDsKIAlpbnQgbnVtYV9ub2RlID0gY3B1X3RvX25vZGUob3Ffbm8gJSBudW1fb25saW5lX2NwdXMoKSk7CiAKLQkvKiB0aGlzIGNhdXNlcyBxdWV1ZSAwIHRvIGJlIGRlZmF1bHQgcXVldWUgKi8KIAlpZiAoT0NURU9OX0NONlhYWChvY3QpKSB7CiAJCW51bV9kZXNjcyA9CiAJCQlDRkdfR0VUX05VTV9ERUZfUlhfREVTQ1MoQ0hJUF9GSUVMRChvY3QsIGNuNnh4eCwgY29uZikpOwogCQlkZXNjX3NpemUgPQogCQkJQ0ZHX0dFVF9ERUZfUlhfQlVGX1NJWkUoQ0hJUF9GSUVMRChvY3QsIGNuNnh4eCwgY29uZikpOworCX0gZWxzZSBpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKSB7CisJCW51bV9kZXNjcyA9IENGR19HRVRfTlVNX0RFRl9SWF9ERVNDUyhDSElQX0ZJRUxEKG9jdCwgY24yM3h4X3BmLAorCQkJCQkJCQljb25mKSk7CisJCWRlc2Nfc2l6ZSA9IENGR19HRVRfREVGX1JYX0JVRl9TSVpFKENISVBfRklFTEQob2N0LCBjbjIzeHhfcGYsCisJCQkJCQkJICAgICAgIGNvbmYpKTsKIAl9Ci0KIAlvY3QtPm51bV9vcXMgPSAwOwogCW9jdC0+ZHJvcVswXSA9IHZtYWxsb2Nfbm9kZShzaXplb2YoKm9jdC0+ZHJvcVswXSksIG51bWFfbm9kZSk7CiAJaWYgKCFvY3QtPmRyb3FbMF0pCkBAIC04MTIsMTAgKzg2MiwxMCBAQAogCiB2b2lkIG9jdGVvbl9zZXRfaW9fcXVldWVzX29mZihzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQogewotCS8qIERpc2FibGUgdGhlIGkvcCBhbmQgby9wIHF1ZXVlcyBmb3IgdGhpcyBPY3Rlb24uICovCi0KLQlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ042WFhYX1NMSV9QS1RfSU5TVFJfRU5CLCAwKTsKLQlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ042WFhYX1NMSV9QS1RfT1VUX0VOQiwgMCk7CisJaWYgKE9DVEVPTl9DTjZYWFgob2N0KSkgeworCQlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ042WFhYX1NMSV9QS1RfSU5TVFJfRU5CLCAwKTsKKwkJb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENONlhYWF9TTElfUEtUX09VVF9FTkIsIDApOworCX0KIH0KIAogdm9pZCBvY3Rlb25fc2V0X2Ryb3FfcGt0X29wKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsCkBAIC04MjUsMTQgKzg3NSwxNiBAQAogCXUzMiByZWdfdmFsID0gMDsKIAogCS8qIERpc2FibGUgdGhlIGkvcCBhbmQgby9wIHF1ZXVlcyBmb3IgdGhpcyBPY3Rlb24uICovCi0JcmVnX3ZhbCA9IG9jdGVvbl9yZWFkX2NzcihvY3QsIENONlhYWF9TTElfUEtUX09VVF9FTkIpOworCWlmIChPQ1RFT05fQ042WFhYKG9jdCkpIHsKKwkJcmVnX3ZhbCA9IG9jdGVvbl9yZWFkX2NzcihvY3QsIENONlhYWF9TTElfUEtUX09VVF9FTkIpOwogCi0JaWYgKGVuYWJsZSkKLQkJcmVnX3ZhbCA9IHJlZ192YWwgfCAoMSA8PCBxX25vKTsKLQllbHNlCi0JCXJlZ192YWwgPSByZWdfdmFsICYgKH4oMSA8PCBxX25vKSk7CisJCWlmIChlbmFibGUpCisJCQlyZWdfdmFsID0gcmVnX3ZhbCB8ICgxIDw8IHFfbm8pOworCQllbHNlCisJCQlyZWdfdmFsID0gcmVnX3ZhbCAmICh+KDEgPDwgcV9ubykpOwogCi0Jb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENONlhYWF9TTElfUEtUX09VVF9FTkIsIHJlZ192YWwpOworCQlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ042WFhYX1NMSV9QS1RfT1VUX0VOQiwgcmVnX3ZhbCk7CisJfQogfQogCiBpbnQgb2N0ZW9uX2luaXRfZGlzcGF0Y2hfbGlzdChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQpAQCAtMTAxOSw2ICsxMDcxLDkgQEAKIAlpZiAoT0NURU9OX0NONlhYWChvY3QpKQogCQludW1fbmljX3BvcnRzID0KIAkJCUNGR19HRVRfTlVNX05JQ19QT1JUUyhDSElQX0ZJRUxEKG9jdCwgY242eHh4LCBjb25mKSk7CisJZWxzZSBpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKQorCQludW1fbmljX3BvcnRzID0KKwkJCUNGR19HRVRfTlVNX05JQ19QT1JUUyhDSElQX0ZJRUxEKG9jdCwgY24yM3h4X3BmLCBjb25mKSk7CiAKIAlpZiAoYXRvbWljX3JlYWQoJm9jdC0+c3RhdHVzKSA+PSBPQ1RfREVWX1JVTk5JTkcpIHsKIAkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJSZWNlaXZlZCBDT1JFIE9LIHdoZW4gZGV2aWNlIHN0YXRlIGlzIDB4JXhcbiIsCkBAIC0xMDQ2LDYgKzExMDEsMTIgQEAKIAl9CiAJb2N0LT5md19pbmZvLmFwcF9jYXBfZmxhZ3MgPSByZWN2X3BrdC0+cmgucl9jb3JlX2Rydl9pbml0LmFwcF9jYXBfZmxhZ3M7CiAJb2N0LT5md19pbmZvLmFwcF9tb2RlID0gKHUzMilyZWN2X3BrdC0+cmgucl9jb3JlX2Rydl9pbml0LmFwcF9tb2RlOworCW9jdC0+cGZ2Zl9oc3dvcmQuYXBwX21vZGUgPSAodTMyKXJlY3ZfcGt0LT5yaC5yX2NvcmVfZHJ2X2luaXQuYXBwX21vZGU7CisKKwlvY3QtPnBmdmZfaHN3b3JkLnBraW5kID0gcmVjdl9wa3QtPnJoLnJfY29yZV9kcnZfaW5pdC5wa2luZDsKKworCWZvciAoaSA9IDA7IGkgPCBvY3QtPm51bV9pcXM7IGkrKykKKwkJb2N0LT5pbnN0cl9xdWV1ZVtpXS0+dHhwY2lxLnMucGtpbmQgPSBvY3QtPnBmdmZfaHN3b3JkLnBraW5kOwogCiAJYXRvbWljX3NldCgmb2N0LT5zdGF0dXMsIE9DVF9ERVZfQ09SRV9PSyk7CiAKQEAgLTExMDgsOCArMTE2OSwxMCBAQAogCWlmIChPQ1RFT05fQ042WFhYKG9jdCkpIHsKIAkJZGVmYXVsdF9vY3RfY29uZiA9CiAJCQkoc3RydWN0IG9jdGVvbl9jb25maWcgKikoQ0hJUF9GSUVMRChvY3QsIGNuNnh4eCwgY29uZikpOworCX0gZWxzZSBpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKSB7CisJCWRlZmF1bHRfb2N0X2NvbmYgPSAoc3RydWN0IG9jdGVvbl9jb25maWcgKikKKwkJCShDSElQX0ZJRUxEKG9jdCwgY24yM3h4X3BmLCBjb25mKSk7CiAJfQotCiAJcmV0dXJuIGRlZmF1bHRfb2N0X2NvbmY7CiB9CiAKQEAgLTExNDEsNyArMTIwNCw5IEBACiAJICogU28gd3JpdGUgTVNCIGZpcnN0CiAJICovCiAJYWRkcmhpID0gKGFkZHIgPj4gMzIpOwotCWlmICgob2N0LT5jaGlwX2lkID09IE9DVEVPTl9DTjY2WFgpIHx8IChvY3QtPmNoaXBfaWQgPT0gT0NURU9OX0NONjhYWCkpCisJaWYgKChvY3QtPmNoaXBfaWQgPT0gT0NURU9OX0NONjZYWCkgfHwKKwkgICAgKG9jdC0+Y2hpcF9pZCA9PSBPQ1RFT05fQ042OFhYKSB8fAorCSAgICAob2N0LT5jaGlwX2lkID09IE9DVEVPTl9DTjIzWFhfUEZfVklEKSkKIAkJYWRkcmhpIHw9IDB4MDAwNjAwMDA7CiAJd3JpdGVsKGFkZHJoaSwgb2N0LT5yZWdfbGlzdC5wY2lfd2luX3JkX2FkZHJfaGkpOwogCkBAIC0xMTg1LDggKzEyNTAsMTUgQEAKIAl1NjQgbG1jMF9yZXNldF9jdGw7CiAKIAkvKiBDaGVjayB0byBtYWtlIHN1cmUgYSBERFIgaW50ZXJmYWNlIGlzIGVuYWJsZWQgKi8KLQlsbWMwX3Jlc2V0X2N0bCA9IGxpb19wY2lfcmVhZHEob2N0LCBDTjZYWFhfTE1DMF9SRVNFVF9DVEwpOwotCWFjY2Vzc19va2F5ID0gKGxtYzBfcmVzZXRfY3RsICYgQ042WFhYX0xNQzBfUkVTRVRfQ1RMX0REUjNSU1RfTUFTSyk7CisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkgeworCQlsbWMwX3Jlc2V0X2N0bCA9IGxpb19wY2lfcmVhZHEob2N0LCBDTjIzWFhfTE1DMF9SRVNFVF9DVEwpOworCQlhY2Nlc3Nfb2theSA9CisJCQkobG1jMF9yZXNldF9jdGwgJiBDTjIzWFhfTE1DMF9SRVNFVF9DVExfRERSM1JTVF9NQVNLKTsKKwl9IGVsc2UgeworCQlsbWMwX3Jlc2V0X2N0bCA9IGxpb19wY2lfcmVhZHEob2N0LCBDTjZYWFhfTE1DMF9SRVNFVF9DVEwpOworCQlhY2Nlc3Nfb2theSA9CisJCQkobG1jMF9yZXNldF9jdGwgJiBDTjZYWFhfTE1DMF9SRVNFVF9DVExfRERSM1JTVF9NQVNLKTsKKwl9CiAKIAlyZXR1cm4gYWNjZXNzX29rYXkgPyAwIDogMTsKIH0KQEAgLTEyMjYsMyArMTI5OCwzOSBAQAogCQkJcmV0dXJuIG9jdGVvbl9kZXYtPm9jdGVvbl9pZDsKIAlyZXR1cm4gLTE7CiB9CisKK3ZvaWQgbGlvX2VuYWJsZV9pcnEoc3RydWN0IG9jdGVvbl9kcm9xICpkcm9xLCBzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3F1ZXVlICppcSkKK3sKKwl1NjQgaW5zdHJfY250OworCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSBOVUxMOworCisJLyogdGhlIHdob2xlIHRoaW5nIG5lZWRzIHRvIGJlIGF0b21pYywgaWRlYWxseSAqLworCWlmIChkcm9xKSB7CisJCXNwaW5fbG9ja19iaCgmZHJvcS0+bG9jayk7CisJCXdyaXRlbChkcm9xLT5wa3RfY291bnQsIGRyb3EtPnBrdHNfc2VudF9yZWcpOworCQlkcm9xLT5wa3RfY291bnQgPSAwOworCQlzcGluX3VubG9ja19iaCgmZHJvcS0+bG9jayk7CisJCW9jdCA9IGRyb3EtPm9jdF9kZXY7CisJfQorCWlmIChpcSkgeworCQlzcGluX2xvY2tfYmgoJmlxLT5sb2NrKTsKKwkJd3JpdGVsKGlxLT5wa3RfaW5fZG9uZSwgaXEtPmluc3RfY250X3JlZyk7CisJCWlxLT5wa3RfaW5fZG9uZSA9IDA7CisJCXNwaW5fdW5sb2NrX2JoKCZpcS0+bG9jayk7CisJCW9jdCA9IGlxLT5vY3RfZGV2OworCX0KKwkvKndyaXRlIHJlc2VuZC4gV3JpdGluZyBSRVNFTkQgaW4gU0xJX1BLVFhfQ05UUyBzaG91bGQgYmUgZW5vdWdoCisJICp0byB0cmlnZ2VyIHR4IGludGVycnVwdHMgYXMgd2VsbCwgaWYgdGhleSBhcmUgcGVuZGluZy4KKwkgKi8KKwlpZiAob2N0ICYmIE9DVEVPTl9DTjIzWFhfUEYob2N0KSkgeworCQlpZiAoZHJvcSkKKwkJCXdyaXRlcShDTjIzWFhfSU5UUl9SRVNFTkQsIGRyb3EtPnBrdHNfc2VudF9yZWcpOworCQkvKndlIHJhY2Ugd2l0aCBmaXJtcndhcmUgaGVyZS4gcmVhZCBhbmQgd3JpdGUgdGhlIElOX0RPTkVfQ05UUyovCisJCWVsc2UgaWYgKGlxKSB7CisJCQlpbnN0cl9jbnQgPSAgcmVhZHEoaXEtPmluc3RfY250X3JlZyk7CisJCQl3cml0ZXEoKChpbnN0cl9jbnQgJiAweEZGRkZGRkZGMDAwMDAwMDBVTEwpIHwKKwkJCQlDTjIzWFhfSU5UUl9SRVNFTkQpLAorCQkJICAgICAgIGlxLT5pbnN0X2NudF9yZWcpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9kZXZpY2UuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fZGV2aWNlLmgKaW5kZXggMDFlZGZiNC4uZGExNWMyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9kZXZpY2UuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2RldmljZS5oCkBAIC0zMCwxMyArMzAsMTkgQEAKIC8qKiBQQ0kgVmVuZG9ySWQgRGV2aWNlIElkICovCiAjZGVmaW5lICBPQ1RFT05fQ042OFhYX1BDSUlEICAgICAgICAgIDB4OTExNzdkCiAjZGVmaW5lICBPQ1RFT05fQ042NlhYX1BDSUlEICAgICAgICAgIDB4OTIxNzdkCi0KKyNkZWZpbmUgIE9DVEVPTl9DTjIzWFhfUENJSURfUEYgICAgICAgMHg5NzAyMTc3ZAogLyoqIERyaXZlciBpZGVudGlmaWVzIGNoaXBzIGJ5IHRoZXNlIElkcywgY3JlYXRlZCBieSBjbHViYmluZyB0b2dldGhlcgogICogIERldmljZUlkK1JldmlzaW9uSWQ7IFdoZXJlIFJldmlzaW9uIElkIGlzIG5vdCB1c2VkIHRvIGRpc3Rpbmd1aXNoCiAgKiAgYmV0d2VlbiBjaGlwcywgYSB2YWx1ZSBvZiAwIGlzIHVzZWQgZm9yIHJldmlzaW9uIGlkLgogICovCiAjZGVmaW5lICBPQ1RFT05fQ042OFhYICAgICAgICAgICAgICAgIDB4MDA5MQogI2RlZmluZSAgT0NURU9OX0NONjZYWCAgICAgICAgICAgICAgICAweDAwOTIKKyNkZWZpbmUgIE9DVEVPTl9DTjIzWFhfUEZfVklEICAgICAgICAgMHg5NzAyCisKKy8qKlJldmlzaW9uSWQgZm9yIHRoZSBjaGlwcyAqLworI2RlZmluZSAgT0NURU9OX0NOMjNYWF9SRVZfMV8wICAgICAgICAweDAwCisjZGVmaW5lICBPQ1RFT05fQ04yM1hYX1JFVl8xXzEgICAgICAgIDB4MDEKKyNkZWZpbmUgIE9DVEVPTl9DTjIzWFhfUkVWXzJfMCAgICAgICAgMHg4MAogCiAvKiogRW5kaWFuLXN3YXAgbW9kZXMgc3VwcG9ydGVkIGJ5IE9jdGVvbi4gKi8KIGVudW0gb2N0ZW9uX3BjaV9zd2FwX21vZGUgewpAQCAtNDYsNiArNTIsOSBAQAogCU9DVEVPTl9QQ0lfMzJCSVRfTFdfU1dBUCA9IDMKIH07CiAKKyNkZWZpbmUgIE9DVEVPTl9PVVRQVVRfSU5UUiAgICgyKQorI2RlZmluZSAgT0NURU9OX0FMTF9JTlRSICAgICAgMHhmZgorCiAvKi0tLS0tLS0tLS0tLS0tLSAgIFBDSSBCQVIxIGluZGV4IHJlZ2lzdGVycyAtLS0tLS0tLS0tLS0tKi8KIAogLyogQkFSMSBNYXNrICovCkBAIC0xOTgsOSArMjA3LDkgQEAKIAl2b2lkICgqc2V0dXBfb3FfcmVncykoc3RydWN0IG9jdGVvbl9kZXZpY2UgKiwgdTMyKTsKIAogCWlycXJldHVybl90ICgqcHJvY2Vzc19pbnRlcnJ1cHRfcmVncykodm9pZCAqKTsKKwl1NjQgKCptc2l4X2ludGVycnVwdF9oYW5kbGVyKSh2b2lkICopOwogCWludCAoKnNvZnRfcmVzZXQpKHN0cnVjdCBvY3Rlb25fZGV2aWNlICopOwogCWludCAoKnNldHVwX2RldmljZV9yZWdzKShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqKTsKLQl2b2lkICgqcmVpbml0X3JlZ3MpKHN0cnVjdCBvY3Rlb25fZGV2aWNlICopOwogCXZvaWQgKCpiYXIxX2lkeF9zZXR1cCkoc3RydWN0IG9jdGVvbl9kZXZpY2UgKiwgdTY0LCB1MzIsIGludCk7CiAJdm9pZCAoKmJhcjFfaWR4X3dyaXRlKShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqLCB1MzIsIHUzMik7CiAJdTMyICgqYmFyMV9pZHhfcmVhZCkoc3RydWN0IG9jdGVvbl9kZXZpY2UgKiwgdTMyKTsKQEAgLTIwOSwxMCArMjE4LDEwIEBACiAJdm9pZCAoKmVuYWJsZV9vcV9wa3RfdGltZV9pbnRyKShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqLCB1MzIpOwogCXZvaWQgKCpkaXNhYmxlX29xX3BrdF90aW1lX2ludHIpKHN0cnVjdCBvY3Rlb25fZGV2aWNlICosIHUzMik7CiAKLQl2b2lkICgqZW5hYmxlX2ludGVycnVwdCkodm9pZCAqKTsKLQl2b2lkICgqZGlzYWJsZV9pbnRlcnJ1cHQpKHZvaWQgKik7CisJdm9pZCAoKmVuYWJsZV9pbnRlcnJ1cHQpKHN0cnVjdCBvY3Rlb25fZGV2aWNlICosIHU4KTsKKwl2b2lkICgqZGlzYWJsZV9pbnRlcnJ1cHQpKHN0cnVjdCBvY3Rlb25fZGV2aWNlICosIHU4KTsKIAotCXZvaWQgKCplbmFibGVfaW9fcXVldWVzKShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqKTsKKwlpbnQgKCplbmFibGVfaW9fcXVldWVzKShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqKTsKIAl2b2lkICgqZGlzYWJsZV9pb19xdWV1ZXMpKHN0cnVjdCBvY3Rlb25fZGV2aWNlICopOwogfTsKIApAQCAtMjY2LDExICsyNzUsNzIgQEAKIAkvKiBFYWNoIGludGVyZmFjZSBpbiB0aGUgT2N0ZW9uIGRldmljZSBoYXMgYSBuZXR3b3JrCiAJICogZGV2aWNlIHBvaW50ZXIgKHVzZWQgZm9yIE9TIHNwZWNpZmljIGNhbGxzKS4KIAkgKi8KKwlpbnQgICAgcnhfb247CiAJaW50ICAgIG5hcGlfZW5hYmxlZDsKIAlpbnQgICAgZ214cG9ydDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogfTsKIAorI2RlZmluZSBMSU9fRkxBR19NU0lYX0VOQUJMRUQJMHgxCisjZGVmaW5lIE1TSVhfUE9fSU5UCQkweDEKKyNkZWZpbmUgTVNJWF9QSV9JTlQJCTB4MgorCitzdHJ1Y3Qgb2N0ZW9uX3BmX3ZmX2hzX3dvcmQgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9CSVRGSUVMRAorCS8qKiBQS0lORCB2YWx1ZSBhc3NpZ25lZCBmb3IgdGhlIERQSSBpbnRlcmZhY2UgKi8KKwl1NjQgICAgICAgIHBraW5kIDogODsKKworCS8qKiBPQ1RFT04gY29yZSBjbG9jayBtdWx0aXBsaWVyICAgKi8KKwl1NjQgICAgICAgIGNvcmVfdGljc19wZXJfdXMgOiAxNjsKKworCS8qKiBPQ1RFT04gY29wcm9jZXNzb3IgY2xvY2sgbXVsdGlwbGllciAgKi8KKwl1NjQgICAgICAgIGNvcHJvY190aWNzX3Blcl91cyA6IDE2OworCisJLyoqIGFwcCB0aGF0IGN1cnJlbnRseSBydW5uaW5nIG9uIE9DVEVPTiAgKi8KKwl1NjQgICAgICAgIGFwcF9tb2RlIDogODsKKworCS8qKiBSRVNFUlZFRCAqLworCXU2NCByZXNlcnZlZCA6IDE2OworCisjZWxzZQorCisJLyoqIFJFU0VSVkVEICovCisJdTY0IHJlc2VydmVkIDogMTY7CisKKwkvKiogYXBwIHRoYXQgY3VycmVudGx5IHJ1bm5pbmcgb24gT0NURU9OICAqLworCXU2NCAgICAgICAgYXBwX21vZGUgOiA4OworCisJLyoqIE9DVEVPTiBjb3Byb2Nlc3NvciBjbG9jayBtdWx0aXBsaWVyICAqLworCXU2NCAgICAgICAgY29wcm9jX3RpY3NfcGVyX3VzIDogMTY7CisKKwkvKiogT0NURU9OIGNvcmUgY2xvY2sgbXVsdGlwbGllciAgICovCisJdTY0ICAgICAgICBjb3JlX3RpY3NfcGVyX3VzIDogMTY7CisKKwkvKiogUEtJTkQgdmFsdWUgYXNzaWduZWQgZm9yIHRoZSBEUEkgaW50ZXJmYWNlICovCisJdTY0ICAgICAgICBwa2luZCA6IDg7CisjZW5kaWYKK307CisKK3N0cnVjdCBvY3Rlb25fc3Jpb3ZfaW5mbyB7CisJLyogQWN0dWFsIHJpbmdzIGxlZnQgZm9yIFBGIGRldmljZSAqLworCXUzMgludW1fcGZfcmluZ3M7CisKKwkvKiBTUk4gb2YgUEYgdXNhYmxlIElPIHF1ZXVlcyAgICovCisJdTMyCXBmX3NybjsKKwkvKiB0b3RhbCBwZiByaW5ncyAqLworCXUzMgl0cnM7CisKK307CisKK3N0cnVjdCBvY3Rlb25faW9xX3ZlY3RvciB7CisJc3RydWN0IG9jdGVvbl9kZXZpY2UgICAqb2N0X2RldjsKKwlpbnQJCSAgICAgICAgaXFfaW5kZXg7CisJaW50CQkgICAgICAgIGRyb3FfaW5kZXg7CisJaW50CQkJdmVjdG9yOworCXN0cnVjdCBjcHVtYXNrCQlhZmZpbml0eV9tYXNrOworCXUzMgkJCWlvcV9udW07Cit9OworCiAvKiogVGhlIE9jdGVvbiBkZXZpY2UuCiAgKiAgRWFjaCBPY3Rlb24gZGV2aWNlIGhhcyB0aGlzIHN0cnVjdHVyZSB0byByZXByZXNlbnQgYWxsIGl0cwogICogIGNvbXBvbmVudHMuCkBAIC0yOTYsNyArMzY2LDcgQEAKIAkvKiogT2N0ZW9uIENoaXAgdHlwZS4gKi8KIAl1MTYgY2hpcF9pZDsKIAl1MTYgcmV2X2lkOwotCisJdTE2IHBmX251bTsKIAkvKiogVGhpcyBkZXZpY2UncyBpZCAtIHNldCBieSB0aGUgZHJpdmVyLiAqLwogCXUzMiBvY3Rlb25faWQ7CiAKQEAgLTMwNSw3ICszNzUsNiBAQAogCiAJdTE2IGZsYWdzOwogI2RlZmluZSBMSU9fRkxBR19NU0lfRU5BQkxFRCAgICAgICAgICAgICAgICAgICh1MzIpKDEgPDwgMSkKLSNkZWZpbmUgTElPX0ZMQUdfTVNJWF9FTkFCTEVEICAgICAgICAgICAgICAgICAodTMyKSgxIDw8IDIpCiAKIAkvKiogVGhlIHN0YXRlIG9mIHRoaXMgZGV2aWNlICovCiAJYXRvbWljX3Qgc3RhdHVzOwpAQCAtMzk1LDYgKzQ2NCwxOSBAQAogCiAJdm9pZCAqcHJpdjsKIAorCWludCBudW1fbXNpeF9pcnFzOworCisJdm9pZCAqbXNpeF9lbnRyaWVzOworCisJc3RydWN0IG9jdGVvbl9zcmlvdl9pbmZvIHNyaW92X2luZm87CisKKwlzdHJ1Y3Qgb2N0ZW9uX3BmX3ZmX2hzX3dvcmQgcGZ2Zl9oc3dvcmQ7CisKKwlpbnQgbXNpeF9vbjsKKworCS8qKiBJT3EgaW5mb3JtYXRpb24gb2YgaXQncyBjb3JyZXNwb25kaW5nIE1TSS1YIGludGVycnVwdC4gKi8KKwlzdHJ1Y3Qgb2N0ZW9uX2lvcV92ZWN0b3IgICAgKmlvcV92ZWN0b3I7CisKIAlpbnQgcnhfcGF1c2U7CiAJaW50IHR4X3BhdXNlOwogCkBAIC00MDIsMTIgKzQ4NCwxNSBAQAogCiAJLyogcHJpdmF0ZSBmbGFncyB0byBjb250cm9sIGRyaXZlci1zcGVjaWZpYyBmZWF0dXJlcyB0aHJvdWdoIGV0aHRvb2wgKi8KIAl1MzIgcHJpdl9mbGFnczsKKworCXZvaWQgKndhdGNoZG9nX3Rhc2s7CiB9OwogCiAjZGVmaW5lICBPQ1RfRFJWX09OTElORSAxCiAjZGVmaW5lICBPQ1RfRFJWX09GRkxJTkUgMgogI2RlZmluZSAgT0NURU9OX0NONlhYWChvY3QpICAgICAgICAgICAoKG9jdC0+Y2hpcF9pZCA9PSBPQ1RFT05fQ042NlhYKSB8fCBcCiAJCQkJICAgICAgIChvY3QtPmNoaXBfaWQgPT0gT0NURU9OX0NONjhYWCkpCisjZGVmaW5lICBPQ1RFT05fQ04yM1hYX1BGKG9jdCkgICAgICAgIChvY3QtPmNoaXBfaWQgPT0gT0NURU9OX0NOMjNYWF9QRl9WSUQpCiAjZGVmaW5lIENISVBfRklFTEQob2N0LCBUWVBFLCBmaWVsZCkgICAgICAgICAgICAgXAogCSgoKHN0cnVjdCBvY3Rlb25fICMjIFRZUEUgICopKG9jdC0+Y2hpcCkpLT5maWVsZCkKIApAQCAtNjYxLDEzICs3NDYsMjQgQEAKICAqLwogc3RydWN0IG9jdGVvbl9jb25maWcgKm9jdGVvbl9nZXRfY29uZihzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KTsKIAordm9pZCBvY3Rlb25fZnJlZV9pb3FfdmVjdG9yKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpOworaW50IG9jdGVvbl9hbGxvY2F0ZV9pb3FfdmVjdG9yKHN0cnVjdCBvY3Rlb25fZGV2aWNlICAqb2N0KTsKK3ZvaWQgbGlvX2VuYWJsZV9pcnEoc3RydWN0IG9jdGVvbl9kcm9xICpkcm9xLCBzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3F1ZXVlICppcSk7CisKIC8qIExpcXVpZElPIGRyaXZlciBwaXZhdGUgZmxhZ3MgKi8KIGVudW0gewogCU9DVF9QUklWX0ZMQUdfVFhfQllURVMgPSAwLCAvKiBUeCBpbnRlcnJ1cHRzIGJ5IHBlbmRpbmcgYnl0ZSBjb3VudCAqLwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIGxpb19zZXRfcHJpdl9mbGFnKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3RkZXYsIHUzMiBmbGFnLAotCQkJCSAgICAgdTMyIHZhbCkKKyNkZWZpbmUgT0NUX1BSSVZfRkxBR19ERUZBVUxUIDB4MAorCitzdGF0aWMgaW5saW5lIHUzMiBsaW9fZ2V0X3ByaXZfZmxhZyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ZGV2LCB1MzIgZmxhZykKK3sKKwlyZXR1cm4gISEob2N0ZGV2LT5wcml2X2ZsYWdzICYgKDB4MSA8PCBmbGFnKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsaW9fc2V0X3ByaXZfZmxhZyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ZGV2LAorCQkJCSAgICAgdTMyIGZsYWcsIHUzMiB2YWwpCiB7CiAJaWYgKHZhbCkKIAkJb2N0ZGV2LT5wcml2X2ZsYWdzIHw9ICgweDEgPDwgZmxhZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2Ryb3EuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fZHJvcS5jCmluZGV4IGUwYWZlNGMuLmY2MGU1MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fZHJvcS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fZHJvcS5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAib2N0ZW9uX25ldHdvcmsuaCIKICNpbmNsdWRlICJjbjY2eHhfcmVncy5oIgogI2luY2x1ZGUgImNuNjZ4eF9kZXZpY2UuaCIKKyNpbmNsdWRlICJjbjIzeHhfcGZfZGV2aWNlLmgiCiAKICNkZWZpbmUgICAgIENWTV9NSU4oZDEsIGQyKSAgICAgICAgICAgKCgoZDEpIDwgKGQyKSkgPyAoZDEpIDogKGQyKSkKICNkZWZpbmUgICAgIENWTV9NQVgoZDEsIGQyKSAgICAgICAgICAgKCgoZDEpID4gKGQyKSkgPyAoZDEpIDogKGQyKSkKQEAgLTkyLDIyICs5MywyNSBAQAogCXJldHVybiBmbl9hcmc7CiB9CiAKLS8qKiBDaGVjayBmb3IgcGFja2V0cyBvbiBEcm9xLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aAotICogbG9jayBoZWxkLgorLyoqIENoZWNrIGZvciBwYWNrZXRzIG9uIERyb3EuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aXRoIGxvY2sgaGVsZC4KICAqICBAcGFyYW0gIGRyb3EgLSBEcm9xIG9uIHdoaWNoIGNvdW50IGlzIGNoZWNrZWQuCiAgKiAgQHJldHVybiBSZXR1cm5zIHBhY2tldCBjb3VudC4KICAqLwogdTMyIG9jdGVvbl9kcm9xX2NoZWNrX2h3X2Zvcl9wa3RzKHN0cnVjdCBvY3Rlb25fZHJvcSAqZHJvcSkKIHsKIAl1MzIgcGt0X2NvdW50ID0gMDsKKwl1MzIgbGFzdF9jb3VudDsKIAogCXBrdF9jb3VudCA9IHJlYWRsKGRyb3EtPnBrdHNfc2VudF9yZWcpOwotCWlmIChwa3RfY291bnQpIHsKLQkJYXRvbWljX2FkZChwa3RfY291bnQsICZkcm9xLT5wa3RzX3BlbmRpbmcpOwotCQl3cml0ZWwocGt0X2NvdW50LCBkcm9xLT5wa3RzX3NlbnRfcmVnKTsKLQl9CiAKLQlyZXR1cm4gcGt0X2NvdW50OworCWxhc3RfY291bnQgPSBwa3RfY291bnQgLSBkcm9xLT5wa3RfY291bnQ7CisJZHJvcS0+cGt0X2NvdW50ID0gcGt0X2NvdW50OworCisJLyogd2Ugc2hhbGwgd3JpdGUgdG8gY250cyAgYXQgbmFwaSBpcnEgZW5hYmxlIG9yIGVuZCBvZiBkcm9xIHRhc2tsZXQgKi8KKwlpZiAobGFzdF9jb3VudCkKKwkJYXRvbWljX2FkZChsYXN0X2NvdW50LCAmZHJvcS0+cGt0c19wZW5kaW5nKTsKKworCXJldHVybiBsYXN0X2NvdW50OwogfQogCiBzdGF0aWMgdm9pZCBvY3Rlb25fZHJvcV9jb21wdXRlX21heF9wYWNrZXRfYnVmcyhzdHJ1Y3Qgb2N0ZW9uX2Ryb3EgKmRyb3EpCkBAIC0yNTksNiArMjYzLDExIEBACiAJCWNfcGt0c19wZXJfaW50ciA9ICh1MzIpQ0ZHX0dFVF9PUV9QS1RTX1BFUl9JTlRSKGNvbmY2eCk7CiAJCWNfcmVmaWxsX3RocmVzaG9sZCA9CiAJCQkodTMyKUNGR19HRVRfT1FfUkVGSUxMX1RIUkVTSE9MRChjb25mNngpOworCX0gZWxzZSBpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKSB7CisJCXN0cnVjdCBvY3Rlb25fY29uZmlnICpjb25mMjMgPSBDSElQX0ZJRUxEKG9jdCwgY24yM3h4X3BmLCBjb25mKTsKKworCQljX3BrdHNfcGVyX2ludHIgPSAodTMyKUNGR19HRVRfT1FfUEtUU19QRVJfSU5UUihjb25mMjMpOworCQljX3JlZmlsbF90aHJlc2hvbGQgPSAodTMyKUNGR19HRVRfT1FfUkVGSUxMX1RIUkVTSE9MRChjb25mMjMpOwogCX0gZWxzZSB7CiAJCXJldHVybiAxOwogCX0KQEAgLTU2NCw3ICs1NzMsNyBAQAogCQkJKHVuc2lnbmVkIGludClyaC0+ci5vcGNvZGUsCiAJCQkodW5zaWduZWQgaW50KXJoLT5yLnN1YmNvZGUpOwogCQlkcm9xLT5zdGF0cy5kcm9wcGVkX25vZGlzcGF0Y2grKzsKLQl9ICAgICAgICAgICAgICAgICAgICAgICAvKiBlbHNlIChkaXNwYXRjaF9mbiAuLi4gKi8KKwl9CiAKIAlyZXR1cm4gY250OwogfQpAQCAtNzM1LDE2ICs3NDQsMjAgQEAKIAl1MzIgcGt0X2NvdW50ID0gMCwgcGt0c19wcm9jZXNzZWQgPSAwOwogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKnRtcDI7CiAKKwkvKiBHcmFiIHRoZSBkcm9xIGxvY2sgKi8KKwlzcGluX2xvY2soJmRyb3EtPmxvY2spOworCisJb2N0ZW9uX2Ryb3FfY2hlY2tfaHdfZm9yX3BrdHMoZHJvcSk7CiAJcGt0X2NvdW50ID0gYXRvbWljX3JlYWQoJmRyb3EtPnBrdHNfcGVuZGluZyk7Ci0JaWYgKCFwa3RfY291bnQpCisKKwlpZiAoIXBrdF9jb3VudCkgeworCQlzcGluX3VubG9jaygmZHJvcS0+bG9jayk7CiAJCXJldHVybiAwOworCX0KIAogCWlmIChwa3RfY291bnQgPiBidWRnZXQpCiAJCXBrdF9jb3VudCA9IGJ1ZGdldDsKIAotCS8qIEdyYWIgdGhlIGRyb3EgbG9jayAqLwotCXNwaW5fbG9jaygmZHJvcS0+bG9jayk7Ci0KIAlwa3RzX3Byb2Nlc3NlZCA9IG9jdGVvbl9kcm9xX2Zhc3RfcHJvY2Vzc19wYWNrZXRzKG9jdCwgZHJvcSwgcGt0X2NvdW50KTsKIAogCWF0b21pY19zdWIocGt0c19wcm9jZXNzZWQsICZkcm9xLT5wa3RzX3BlbmRpbmcpOwpAQCAtNzg5LDYgKzgwMiw4IEBACiAJc3Bpbl9sb2NrKCZkcm9xLT5sb2NrKTsKIAogCXdoaWxlICh0b3RhbF9wa3RzX3Byb2Nlc3NlZCA8IGJ1ZGdldCkgeworCQlvY3Rlb25fZHJvcV9jaGVja19od19mb3JfcGt0cyhkcm9xKTsKKwogCQlwa3RzX2F2YWlsYWJsZSA9CiAJCQlDVk1fTUlOKChidWRnZXQgLSB0b3RhbF9wa3RzX3Byb2Nlc3NlZCksCiAJCQkJKHUzMikoYXRvbWljX3JlYWQoJmRyb3EtPnBrdHNfcGVuZGluZykpKTsKQEAgLTgwMyw4ICs4MTgsNiBAQAogCQlhdG9taWNfc3ViKHBrdHNfcHJvY2Vzc2VkLCAmZHJvcS0+cGt0c19wZW5kaW5nKTsKIAogCQl0b3RhbF9wa3RzX3Byb2Nlc3NlZCArPSBwa3RzX3Byb2Nlc3NlZDsKLQotCQlvY3Rlb25fZHJvcV9jaGVja19od19mb3JfcGt0cyhkcm9xKTsKIAl9CiAKIAlzcGluX3VubG9jaygmZHJvcS0+bG9jayk7CkBAIC04NzQsOCArODg3LDExIEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCQlicmVhazsKKwkJY2FzZSBPQ1RFT05fQ04yM1hYX1BGX1ZJRDogeworCQkJbGlvX2VuYWJsZV9pcnEob2N0LT5kcm9xW3Ffbm9dLCBvY3QtPmluc3RyX3F1ZXVlW3Ffbm9dKTsKIAkJfQotCisJCWJyZWFrOworCQl9CiAJCXJldHVybiAwOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9kcm9xLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2Ryb3EuaAppbmRleCA1YTZmYjkxLi41YmUwMDJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2Ryb3EuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2Ryb3EuaApAQCAtMjYxLDYgKzI2MSw4IEBACiAKIAl1MzIgcV9ubzsKIAorCXUzMiBwa3RfY291bnQ7CisKIAlzdHJ1Y3Qgb2N0ZW9uX2Ryb3Ffb3BzIG9wczsKIAogCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3RfZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9pcS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9pcS5oCmluZGV4IGZmNGIxZDYuLmU0ZDQyNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25faXEuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2lxLmgKQEAgLTg4LDYgKzg4LDggQEAKIAkvKiogQSBzcGlubG9jayB0byBwcm90ZWN0IHdoaWxlIHBvc3Rpbmcgb24gdGhlIHJpbmcuICAqLwogCXNwaW5sb2NrX3QgcG9zdF9sb2NrOwogCisJdTMyIHBrdF9pbl9kb25lOworCiAJLyoqIEEgc3BpbmxvY2sgdG8gcHJvdGVjdCBhY2Nlc3MgdG8gdGhlIGlucHV0IHJpbmcuKi8KIAlzcGlubG9ja190IGlxX2ZsdXNoX3J1bm5pbmdfbG9jazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9tYWluLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX21haW4uaAppbmRleCBiYzE0ZTRjLi4zNjYyOThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX21haW4uaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX21haW4uaApAQCAtMzgsMTIgKzM4LDI2IEBACiAKICNkZWZpbmUgRFJWX05BTUUgIkxpcXVpZElPIgogCi0vKioKLSAqIFxicmllZiBkZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gY29uc29sZSBoYXMgZGVidWcgZW5hYmxlZC4KLSAqIEBwYXJhbSBjb25zb2xlIGNvbnNvbGUgdG8gY2hlY2sKLSAqIEByZXR1cm5zICAxID0gZW5hYmxlZC4gMCBvdGhlcndpc2UKKy8qKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IE5JQyBkcml2ZXIgdG8gc3RvcmUgaW5mb3JtYXRpb24gcmVxdWlyZWQKKyAqIHRvIGZyZWUgdGhlIHNrX2J1ZmYgd2hlbiB0aGUgcGFja2V0IGhhcyBiZWVuIGZldGNoZWQgYnkgT2N0ZW9uLgorICogQnl0ZXMgb2Zmc2V0IGJlbG93IGFzc3VtZSB3b3JzdC1jYXNlIG9mIGEgNjQtYml0IHN5c3RlbS4KICAqLwotaW50IG9jdGVvbl9jb25zb2xlX2RlYnVnX2VuYWJsZWQodTMyIGNvbnNvbGUpOworc3RydWN0IG9jdG5ldF9idWZfZnJlZV9pbmZvIHsKKwkvKiogQnl0ZXMgMS04LiAgUG9pbnRlciB0byBuZXR3b3JrIGRldmljZSBwcml2YXRlIHN0cnVjdHVyZS4gKi8KKwlzdHJ1Y3QgbGlvICpsaW87CisKKwkvKiogQnl0ZXMgOS0xNi4gIFBvaW50ZXIgdG8gc2tfYnVmZi4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLyoqIEJ5dGVzIDE3LTI0LiAgUG9pbnRlciB0byBnYXRoZXIgbGlzdC4gKi8KKwlzdHJ1Y3Qgb2N0bmljX2dhdGhlciAqZzsKKworCS8qKiBCeXRlcyAyNS0zMi4gUGh5c2ljYWwgYWRkcmVzcyBvZiBza2ItPmRhdGEgb3IgZ2F0aGVyIGxpc3QuICovCisJdTY0IGRwdHI7CisKKwkvKiogQnl0ZXMgMzMtNDcuIFBpZ2d5YmFja2VkIHNvZnQgY29tbWFuZCwgaWYgYW55ICovCisJc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgKnNjOworfTsKIAogLyogQlFMLXJlbGF0ZWQgZnVuY3Rpb25zICovCiB2b2lkIG9jdGVvbl9yZXBvcnRfc2VudF9ieXRlc190b19icWwodm9pZCAqYnVmLCBpbnQgcmVxdHlwZSk7CkBAIC0xNjcsMjIgKzE4MSwyNiBAQAogI2RlZmluZSBjbm5pY19mcmVlX2FsaWduZWRfZG1hKHBjaV9kZXYsIHB0ciwgc2l6ZSwgb3JpZ19wdHIsIGRtYV9hZGRyKSBcCiAJCWZyZWVfcGFnZXMob3JpZ19wdHIsIGdldF9vcmRlcihzaXplKSkKIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIGludAogc2xlZXBfY29uZCh3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdF9xdWV1ZSwgaW50ICpjb25kaXRpb24pCiB7CisJaW50IGVycm5vID0gMDsKIAl3YWl0X3F1ZXVlX3Qgd2U7CiAKIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2UsIGN1cnJlbnQpOwogCWFkZF93YWl0X3F1ZXVlKHdhaXRfcXVldWUsICZ3ZSk7CiAJd2hpbGUgKCEoUkVBRF9PTkNFKCpjb25kaXRpb24pKSkgewogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJybm8gPSAtRUlOVFI7CiAJCQlnb3RvIG91dDsKKwkJfQogCQlzY2hlZHVsZSgpOwogCX0KIG91dDoKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCXJlbW92ZV93YWl0X3F1ZXVlKHdhaXRfcXVldWUsICZ3ZSk7CisJcmV0dXJuIGVycm5vOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbWVtX29wcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9tZW1fb3BzLmMKaW5kZXggOTVhNGJiZS4uMGRjMDgxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9tZW1fb3BzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9tZW1fb3BzLmMKQEAgLTE5LDcgKzE5LDYgQEAKICAqIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBhdmFpbGFibGUgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSBmcm9tIENhdml1bS4KICAqIENvbnRhY3QgQ2F2aXVtLCBJbmMuIGZvciBtb3JlIGluZm9ybWF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlICJsaXF1aWRpb19jb21tb24uaCIKICNpbmNsdWRlICJvY3Rlb25fZHJvcS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9uZXR3b3JrLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX25ldHdvcmsuaAppbmRleCBmYjgyMGRjLi5lNWQxZGViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX25ldHdvcmsuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX25ldHdvcmsuaApAQCAtMjYsOCArMjYsNiBAQAogCiAjaWZuZGVmIF9fT0NURU9OX05FVFdPUktfSF9fCiAjZGVmaW5lIF9fT0NURU9OX05FVFdPUktfSF9fCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvcHRwX2Nsb2NrX2tlcm5lbC5oPgogCiAjZGVmaW5lIExJT19NQVhfTVRVX1NJWkUgKE9DVE5FVF9NQVhfRlJNX1NJWkUgLSBPQ1RORVRfRlJNX0hFQURFUl9TSVpFKQpAQCAtMTI0LDExICsxMjIsMjEgQEAKIAogCS8qIHdvcmsgcXVldWUgZm9yICB0eHEgc3RhdHVzICovCiAJc3RydWN0IGNhdml1bV93cQl0eHFfc3RhdHVzX3dxOworCisJLyogd29yayBxdWV1ZSBmb3IgIGxpbmsgc3RhdHVzICovCisJc3RydWN0IGNhdml1bV93cQlsaW5rX3N0YXR1c193cTsKKwogfTsKIAogI2RlZmluZSBMSU9fU0laRSAgICAgICAgIChzaXplb2Yoc3RydWN0IGxpbykpCiAjZGVmaW5lIEdFVF9MSU8obmV0ZGV2KSAgKChzdHJ1Y3QgbGlvICopbmV0ZGV2X3ByaXYobmV0ZGV2KSkKIAorI2RlZmluZSBDSVUzX1dET0coYykgICAgICAgICAgICAgICAgICgweDEwMTAwMDAwMjAwMDBVTEwgKyAoYyA8PCAzKSkKKyNkZWZpbmUgQ0lVM19XRE9HX01BU0sgICAgICAgICAgICAgICAxMlVMTAorI2RlZmluZSBMSU9fTU9OSVRPUl9XRE9HX0VYUElSRSAgICAgIDEKKyNkZWZpbmUgTElPX01PTklUT1JfQ09SRV9TVFVDS19NU0dEICAyCisjZGVmaW5lIExJT19NQVhfQ09SRVMgICAgICAgICAgICAgICAgMTIKKwogLyoqCiAgKiBcYnJpZWYgRW5hYmxlIG9yIGRpc2FibGUgZmVhdHVyZQogICogQHBhcmFtIG5ldGRldiAgICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX25pYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9uaWMuYwppbmRleCAxNjY3MjdiLi40MGFjMWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX25pYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbmljLmMKQEAgLTE5LDcgKzE5LDYgQEAKICAqIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBhdmFpbGFibGUgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSBmcm9tIENhdml1bS4KICAqIENvbnRhY3QgQ2F2aXVtLCBJbmMuIGZvciBtb3JlIGluZm9ybWF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlICJsaXF1aWRpb19jb21tb24uaCIKQEAgLTM2LDYgKzM1LDcgQEAKIAkJCSAgICAgICB1MzIJCSAgICAgICByZGF0YXNpemUpCiB7CiAJc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgKnNjOworCXN0cnVjdCBvY3Rlb25faW5zdHJfaWgzICAqaWgzOwogCXN0cnVjdCBvY3Rlb25faW5zdHJfaWgyICAqaWgyOwogCXN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICppcmg7CiAJc3RydWN0IG9jdGVvbl9pbnN0cl9yZHAgKnJkcDsKQEAgLTUyLDEwICs1MiwxOSBAQAogCS8qIEFkZCBpbiB0aGUgcmVzcG9uc2UgcmVsYXRlZCBmaWVsZHMuIE9wY29kZSBhbmQgUGFyYW0gYXJlIGFscmVhZHkKIAkgKiB0aGVyZS4KIAkgKi8KLQlpaDIgICAgICA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMiAqKSZzYy0+Y21kLmNtZDIuaWgyOwotCXJkcCAgICAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9yZHAgKikmc2MtPmNtZC5jbWQyLnJkcDsKLQlpcmggICAgID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICopJnNjLT5jbWQuY21kMi5pcmg7Ci0JaWgyLT5mc3ogPSA0MDsgLyogaXJoICsgb3NzcFswXSArIG9zc3BbMV0gKyByZHAgKyBycHRyID0gNDAgYnl0ZXMgKi8KKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKSB7CisJCWloMyAgICAgID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaWgzICopJnNjLT5jbWQuY21kMy5paDM7CisJCXJkcCAgICAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9yZHAgKikmc2MtPmNtZC5jbWQzLnJkcDsKKwkJaXJoICAgICA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqKSZzYy0+Y21kLmNtZDMuaXJoOworCQkvKnBraWloMyArIGlyaCArIG9zc3BbMF0gKyBvc3NwWzFdICsgcmRwICsgcnB0ciA9IDQwIGJ5dGVzICovCisJCWloMy0+ZnN6ID0gTElPX1NPRlRDTURSRVNQX0lIMzsKKwl9IGVsc2UgeworCQlpaDIgICAgICA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMiAqKSZzYy0+Y21kLmNtZDIuaWgyOworCQlyZHAgICAgID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfcmRwICopJnNjLT5jbWQuY21kMi5yZHA7CisJCWlyaCAgICAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKikmc2MtPmNtZC5jbWQyLmlyaDsKKwkJLyogaXJoICsgb3NzcFswXSArIG9zc3BbMV0gKyByZHAgKyBycHRyID0gNDAgYnl0ZXMgKi8KKwkJaWgyLT5mc3ogPSBMSU9fU09GVENNRFJFU1BfSUgyOworCX0KIAogCWlyaC0+cmZsYWcgPSAxOyAvKiBhIHJlc3BvbnNlIGlzIHJlcXVpcmVkICovCiAKQEAgLTY0LDcgKzczLDEwIEBACiAKIAkqc2MtPnN0YXR1c193b3JkID0gQ09NUExFVElPTl9XT1JEX0lOSVQ7CiAKLQlzYy0+Y21kLmNtZDIucnB0ciA9ICBzYy0+ZG1hcnB0cjsKKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKQorCQlzYy0+Y21kLmNtZDMucnB0ciA9ICBzYy0+ZG1hcnB0cjsKKwllbHNlCisJCXNjLT5jbWQuY21kMi5ycHRyID0gIHNjLT5kbWFycHRyOwogCiAJc2MtPndhaXRfdGltZSA9IDEwMDA7CiAJc2MtPnRpbWVvdXQgPSBqaWZmaWVzICsgc2MtPndhaXRfdGltZTsKQEAgLTczLDEyICs4NSw5IEBACiB9CiAKIGludCBvY3RuZXRfc2VuZF9uaWNfZGF0YV9wa3Qoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwKLQkJCSAgICAgc3RydWN0IG9jdG5pY19kYXRhX3BrdCAqbmRhdGEsCi0JCQkgICAgIHUzMiB4bWl0X21vcmUpCisJCQkgICAgIHN0cnVjdCBvY3RuaWNfZGF0YV9wa3QgKm5kYXRhKQogewotCWludCByaW5nX2Rvb3JiZWxsOwotCi0JcmluZ19kb29yYmVsbCA9ICF4bWl0X21vcmU7CisJaW50IHJpbmdfZG9vcmJlbGwgPSAxOwogCiAJcmV0dXJuIG9jdGVvbl9zZW5kX2NvbW1hbmQob2N0LCBuZGF0YS0+cV9ubywgcmluZ19kb29yYmVsbCwgJm5kYXRhLT5jbWQsCiAJCQkJICAgbmRhdGEtPmJ1ZiwgbmRhdGEtPmRhdGFzaXplLApAQCAtMTgzLDggKzE5Miw4IEBACiAJcmV0dmFsID0gb2N0ZW9uX3NlbmRfc29mdF9jb21tYW5kKG9jdCwgc2MpOwogCWlmIChyZXR2YWwgPT0gSVFfU0VORF9GQUlMRUQpIHsKIAkJb2N0ZW9uX2ZyZWVfc29mdF9jb21tYW5kKG9jdCwgc2MpOwotCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIHNvZnQgY29tbWFuZDolZCBzZW5kIGZhaWxlZCBzdGF0dXM6ICV4XG4iLAotCQkJX19mdW5jX18sIG5jdHJsLT5uY21kLnMuY21kLCByZXR2YWwpOworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIHBmX251bTolZCBzb2Z0IGNvbW1hbmQ6JWQgc2VuZCBmYWlsZWQgc3RhdHVzOiAleFxuIiwKKwkJCV9fZnVuY19fLCBvY3QtPnBmX251bSwgbmN0cmwtPm5jbWQucy5jbWQsIHJldHZhbCk7CiAJCXNwaW5fdW5sb2NrX2JoKCZvY3QtPmNtZF9yZXNwX3dxbG9jayk7CiAJCXJldHVybiAtMTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX25pYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9uaWMuaAppbmRleCBiNzFhMmJiLi40YjhkYTY3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9uaWMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX25pYy5oCkBAIC0xMzgsNyArMTM4LDcgQEAKIAkvKiBhc3N1bWUgdGhhdCByZmxhZyBpcyBjbGVhcmVkIHNvIHRoZXJlZm9yZSBmcm9udCBkYXRhIHdpbGwgb25seSBoYXZlCiAJICogaXJoIGFuZCBvc3NwWzBdLCBvc3NwWzFdIGZvciBhIHRvdGFsIG9mIDMyIGJ5dGVzCiAJICovCi0JaWgyLT5mc3ogPSAyNDsKKwlpaDItPmZzeiA9IExJT19QQ0lDTURfTzI7CiAKIAlpaDItPnRhZ3R5cGUgPSBPUkRFUkVEX1RBRzsKIAlpaDItPmdycCA9IERFRkFVTFRfUE9XX0dSUDsKQEAgLTE5Niw3ICsxOTYsNyBAQAogCSAqLwogCWloMy0+cGtpbmQgICAgICAgPSBvY3QtPmluc3RyX3F1ZXVlW3NldHVwLT5zLmlxX25vXS0+dHhwY2lxLnMucGtpbmQ7CiAJLypQS0kgSUgqLwotCWloMy0+ZnN6ID0gMjQgKyA4OworCWloMy0+ZnN6ID0gTElPX1BDSUNNRF9PMzsKIAogCWlmICghc2V0dXAtPnMuZ2F0aGVyKSB7CiAJCWloMy0+ZGxlbmdzeiA9IHNldHVwLT5zLnUuZGF0YXNpemU7CkBAIC0yNzgsNyArMjc4LDcgQEAKICAqIHF1ZXVlIHNob3VsZCBiZSBzdG9wcGVkLCBhbmQgSVFfU0VORF9PSyBpZiBpdCBzZW50IG9rYXkuCiAgKi8KIGludCBvY3RuZXRfc2VuZF9uaWNfZGF0YV9wa3Qoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwKLQkJCSAgICAgc3RydWN0IG9jdG5pY19kYXRhX3BrdCAqbmRhdGEsIHUzMiB4bWl0X21vcmUpOworCQkJICAgICBzdHJ1Y3Qgb2N0bmljX2RhdGFfcGt0ICpuZGF0YSk7CiAKIC8qKiBTZW5kIGEgTklDIGNvbnRyb2wgcGFja2V0IHRvIHRoZSBkZXZpY2UKICAqIEBwYXJhbSBvY3QgLSBvY3Rlb24gZGV2aWNlIHBvaW50ZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9yZXF1ZXN0X21hbmFnZXIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9yZXF1ZXN0X21hbmFnZXIuYwppbmRleCBkMzI0OTJmMS4uOTA4NjZiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL3JlcXVlc3RfbWFuYWdlci5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9yZXF1ZXN0X21hbmFnZXIuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgIm9jdGVvbl9tYWluLmgiCiAjaW5jbHVkZSAib2N0ZW9uX25ldHdvcmsuaCIKICNpbmNsdWRlICJjbjY2eHhfZGV2aWNlLmgiCisjaW5jbHVkZSAiY24yM3h4X3BmX2RldmljZS5oIgogCiAjZGVmaW5lIElOQ1JfSU5TVFJRVUVVRV9QS1RfQ09VTlQob2N0ZW9uX2Rldl9wdHIsIGlxX25vLCBmaWVsZCwgY291bnQpICBcCiAJKG9jdGVvbl9kZXZfcHRyLT5pbnN0cl9xdWV1ZVtpcV9ub10tPnN0YXRzLmZpZWxkICs9IGNvdW50KQpAQCAtNzEsNyArNzIsOCBAQAogCiAJaWYgKE9DVEVPTl9DTjZYWFgob2N0KSkKIAkJY29uZiA9ICYoQ0ZHX0dFVF9JUV9DRkcoQ0hJUF9GSUVMRChvY3QsIGNuNnh4eCwgY29uZikpKTsKLQorCWVsc2UgaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkKKwkJY29uZiA9ICYoQ0ZHX0dFVF9JUV9DRkcoQ0hJUF9GSUVMRChvY3QsIGNuMjN4eF9wZiwgY29uZikpKTsKIAlpZiAoIWNvbmYpIHsKIAkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJVbnN1cHBvcnRlZCBDaGlwICV4XG4iLAogCQkJb2N0LT5jaGlwX2lkKTsKQEAgLTg4LDYgKzkwLDcgQEAKIAlxX3NpemUgPSAodTMyKWNvbmYtPmluc3RyX3R5cGUgKiBudW1fZGVzY3M7CiAKIAlpcSA9IG9jdC0+aW5zdHJfcXVldWVbaXFfbm9dOworCiAJaXEtPm9jdF9kZXYgPSBvY3Q7CiAKIAlzZXRfZGV2X25vZGUoJm9jdC0+cGNpX2Rldi0+ZGV2LCBudW1hX25vZGUpOwpAQCAtMTgxLDYgKzE4NCw5IEBACiAJaWYgKE9DVEVPTl9DTjZYWFgob2N0KSkKIAkJZGVzY19zaXplID0KIAkJICAgIENGR19HRVRfSVFfSU5TVFJfVFlQRShDSElQX0ZJRUxEKG9jdCwgY242eHh4LCBjb25mKSk7CisJZWxzZSBpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKQorCQlkZXNjX3NpemUgPQorCQkgICAgQ0ZHX0dFVF9JUV9JTlNUUl9UWVBFKENISVBfRklFTEQob2N0LCBjbjIzeHhfcGYsIGNvbmYpKTsKIAogCXZmcmVlKGlxLT5yZXF1ZXN0X2xpc3QpOwogCkBAIC0zODMsNyArMzg5LDEyIEBACiAJCWNhc2UgUkVRVFlQRV9TT0ZUX0NPTU1BTkQ6CiAJCQlzYyA9IGJ1ZjsKIAotCQkJaXJoID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICopJnNjLT5jbWQuY21kMi5pcmg7CisJCQlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKQorCQkJCWlyaCA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqKQorCQkJCQkmc2MtPmNtZC5jbWQzLmlyaDsKKwkJCWVsc2UKKwkJCQlpcmggPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKikKKwkJCQkJJnNjLT5jbWQuY21kMi5pcmg7CiAJCQlpZiAoaXJoLT5yZmxhZykgewogCQkJCS8qIFdlJ3JlIGV4cGVjdGluZyBhIHJlc3BvbnNlIGZyb20gT2N0ZW9uLgogCQkJCSAqIEl0J3MgdXAgdG8gbGlvX3Byb2Nlc3Nfb3JkZXJlZF9saXN0KCkgdG8KQEAgLTQ5OSw2ICs1MTAsNyBAQAogCiAJaWYgKCFvY3QpCiAJCXJldHVybjsKKwogCWlxID0gb2N0LT5pbnN0cl9xdWV1ZVtpcV9ub107CiAJaWYgKCFpcSkKIAkJcmV0dXJuOwpAQCAtNTE0LDYgKzUyNiw4IEBACiAKIAkvKiBGbHVzaCB0aGUgaW5zdHJ1Y3Rpb24gcXVldWUgKi8KIAlvY3Rlb25fZmx1c2hfaXEob2N0LCBpcSwgMSwgMCk7CisKKwlsaW9fZW5hYmxlX2lycShOVUxMLCBpcSk7CiB9CiAKIC8qIENhbGxlZCBieSB0aGUgUG9sbCB0aHJlYWQgYXQgcmVndWxhciBpbnRlcnZhbHMgdG8gY2hlY2sgdGhlIGluc3RydWN0aW9uCkBAIC01ODAsNiArNTk0LDggQEAKIHsKIAlzdHJ1Y3Qgb2N0ZW9uX2NvbmZpZyAqb2N0X2NmZzsKIAlzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMiAqaWgyOworCXN0cnVjdCBvY3Rlb25faW5zdHJfaWgzICppaDM7CisJc3RydWN0IG9jdGVvbl9pbnN0cl9wa2lfaWgzICpwa2lfaWgzOwogCXN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICppcmg7CiAJc3RydWN0IG9jdGVvbl9pbnN0cl9yZHAgKnJkcDsKIApAQCAtNTg4LDM2ICs2MDQsODggQEAKIAogCW9jdF9jZmcgPSBvY3Rlb25fZ2V0X2NvbmYob2N0KTsKIAotCWloMiAgICAgICAgICA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMiAqKSZzYy0+Y21kLmNtZDIuaWgyOwotCWloMi0+dGFndHlwZSA9IEFUT01JQ19UQUc7Ci0JaWgyLT50YWcgICAgID0gTElPX0NPTlRST0w7Ci0JaWgyLT5yYXcgICAgID0gMTsKLQlpaDItPmdycCAgICAgPSBDRkdfR0VUX0NUUkxfUV9HUlAob2N0X2NmZyk7CisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkgeworCQlpaDMgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9paDMgKikmc2MtPmNtZC5jbWQzLmloMzsKIAotCWlmIChzYy0+ZGF0YXNpemUpIHsKLQkJaWgyLT5kbGVuZ3N6ID0gc2MtPmRhdGFzaXplOwotCQlpaDItPnJzID0gMTsKLQl9CisJCWloMy0+cGtpbmQgPSBvY3QtPmluc3RyX3F1ZXVlW3NjLT5pcV9ub10tPnR4cGNpcS5zLnBraW5kOwogCi0JaXJoICAgICAgICAgICAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKikmc2MtPmNtZC5jbWQyLmlyaDsKLQlpcmgtPm9wY29kZSAgICA9IG9wY29kZTsKLQlpcmgtPnN1YmNvZGUgICA9IHN1YmNvZGU7CisJCXBraV9paDMgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9wa2lfaWgzICopJnNjLT5jbWQuY21kMy5wa2lfaWgzOwogCi0JLyogb3Bjb2RlL3N1YmNvZGUgc3BlY2lmaWMgcGFyYW1ldGVycyAob3NzcCkgKi8KLQlpcmgtPm9zc3AgICAgICAgPSBpcmhfb3NzcDsKLQlzYy0+Y21kLmNtZDIub3NzcFswXSA9IG9zc3AwOwotCXNjLT5jbWQuY21kMi5vc3NwWzFdID0gb3NzcDE7CisJCXBraV9paDMtPncgICAgICAgICAgID0gMTsKKwkJcGtpX2loMy0+cmF3ICAgICAgICAgPSAxOworCQlwa2lfaWgzLT51dGFnICAgICAgICA9IDE7CisJCXBraV9paDMtPnVxcGcgICAgICAgID0KKwkJCW9jdC0+aW5zdHJfcXVldWVbc2MtPmlxX25vXS0+dHhwY2lxLnMudXNlX3FwZzsKKwkJcGtpX2loMy0+dXR0ICAgICAgICAgPSAxOworCQlwa2lfaWgzLT50YWcgICAgID0gTElPX0NPTlRST0w7CisJCXBraV9paDMtPnRhZ3R5cGUgPSBBVE9NSUNfVEFHOworCQlwa2lfaWgzLT5xcGcgICAgICAgICA9CisJCQlvY3QtPmluc3RyX3F1ZXVlW3NjLT5pcV9ub10tPnR4cGNpcS5zLnFwZzsKKwkJcGtpX2loMy0+cG0gICAgICAgICAgPSAweDc7CisJCXBraV9paDMtPnNsICAgICAgICAgID0gODsKIAotCWlmIChzYy0+cmRhdGFzaXplKSB7Ci0JCXJkcCA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3JkcCAqKSZzYy0+Y21kLmNtZDIucmRwOwotCQlyZHAtPnBjaWVfcG9ydCA9IG9jdC0+cGNpZV9wb3J0OwotCQlyZHAtPnJsZW4gICAgICA9IHNjLT5yZGF0YXNpemU7CisJCWlmIChzYy0+ZGF0YXNpemUpCisJCQlpaDMtPmRsZW5nc3ogPSBzYy0+ZGF0YXNpemU7CiAKLQkJaXJoLT5yZmxhZyA9ICAxOwotCQlpaDItPmZzeiAgID0gNDA7IC8qIGlyaCtvc3NwWzBdK29zc3BbMV0rcmRwK3JwdHIgPSA0MCBieXRlcyAqLworCQlpcmggICAgICAgICAgICA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqKSZzYy0+Y21kLmNtZDMuaXJoOworCQlpcmgtPm9wY29kZSAgICA9IG9wY29kZTsKKwkJaXJoLT5zdWJjb2RlICAgPSBzdWJjb2RlOworCisJCS8qIG9wY29kZS9zdWJjb2RlIHNwZWNpZmljIHBhcmFtZXRlcnMgKG9zc3ApICovCisJCWlyaC0+b3NzcCAgICAgICA9IGlyaF9vc3NwOworCQlzYy0+Y21kLmNtZDMub3NzcFswXSA9IG9zc3AwOworCQlzYy0+Y21kLmNtZDMub3NzcFsxXSA9IG9zc3AxOworCisJCWlmIChzYy0+cmRhdGFzaXplKSB7CisJCQlyZHAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9yZHAgKikmc2MtPmNtZC5jbWQzLnJkcDsKKwkJCXJkcC0+cGNpZV9wb3J0ID0gb2N0LT5wY2llX3BvcnQ7CisJCQlyZHAtPnJsZW4gICAgICA9IHNjLT5yZGF0YXNpemU7CisKKwkJCWlyaC0+cmZsYWcgPSAgMTsKKwkJCS8qUEtJIElIMyovCisJCQkvKiBwa2lfaWgzIGlyaCtvc3NwWzBdK29zc3BbMV0rcmRwK3JwdHIgPSA0OCBieXRlcyAqLworCQkJaWgzLT5mc3ogICAgPSBMSU9fU09GVENNRFJFU1BfSUgzOworCQl9IGVsc2UgeworCQkJaXJoLT5yZmxhZyA9ICAwOworCQkJLypQS0kgSUgzKi8KKwkJCS8qIHBraV9oMyArIGlyaCArIG9zc3BbMF0gKyBvc3NwWzFdID0gMzIgYnl0ZXMgKi8KKwkJCWloMy0+ZnN6ICAgID0gTElPX1BDSUNNRF9PMzsKKwkJfQorCiAJfSBlbHNlIHsKLQkJaXJoLT5yZmxhZyA9ICAwOwotCQlpaDItPmZzeiAgID0gMjQ7IC8qIGlyaCArIG9zc3BbMF0gKyBvc3NwWzFdID0gMjQgYnl0ZXMgKi8KKwkJaWgyICAgICAgICAgID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaWgyICopJnNjLT5jbWQuY21kMi5paDI7CisJCWloMi0+dGFndHlwZSA9IEFUT01JQ19UQUc7CisJCWloMi0+dGFnICAgICA9IExJT19DT05UUk9MOworCQlpaDItPnJhdyAgICAgPSAxOworCQlpaDItPmdycCAgICAgPSBDRkdfR0VUX0NUUkxfUV9HUlAob2N0X2NmZyk7CisKKwkJaWYgKHNjLT5kYXRhc2l6ZSkgeworCQkJaWgyLT5kbGVuZ3N6ID0gc2MtPmRhdGFzaXplOworCQkJaWgyLT5ycyA9IDE7CisJCX0KKworCQlpcmggICAgICAgICAgICA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqKSZzYy0+Y21kLmNtZDIuaXJoOworCQlpcmgtPm9wY29kZSAgICA9IG9wY29kZTsKKwkJaXJoLT5zdWJjb2RlICAgPSBzdWJjb2RlOworCisJCS8qIG9wY29kZS9zdWJjb2RlIHNwZWNpZmljIHBhcmFtZXRlcnMgKG9zc3ApICovCisJCWlyaC0+b3NzcCAgICAgICA9IGlyaF9vc3NwOworCQlzYy0+Y21kLmNtZDIub3NzcFswXSA9IG9zc3AwOworCQlzYy0+Y21kLmNtZDIub3NzcFsxXSA9IG9zc3AxOworCisJCWlmIChzYy0+cmRhdGFzaXplKSB7CisJCQlyZHAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9yZHAgKikmc2MtPmNtZC5jbWQyLnJkcDsKKwkJCXJkcC0+cGNpZV9wb3J0ID0gb2N0LT5wY2llX3BvcnQ7CisJCQlyZHAtPnJsZW4gICAgICA9IHNjLT5yZGF0YXNpemU7CisKKwkJCWlyaC0+cmZsYWcgPSAgMTsKKwkJCS8qIGlyaCtvc3NwWzBdK29zc3BbMV0rcmRwK3JwdHIgPSA0MCBieXRlcyAqLworCQkJaWgyLT5mc3ogICA9IExJT19TT0ZUQ01EUkVTUF9JSDI7CisJCX0gZWxzZSB7CisJCQlpcmgtPnJmbGFnID0gIDA7CisJCQkvKiBpcmggKyBvc3NwWzBdICsgb3NzcFsxXSA9IDI0IGJ5dGVzICovCisJCQlpaDItPmZzeiAgID0gTElPX1BDSUNNRF9PMjsKKwkJfQogCX0KIH0KIApAQCAtNjI1LDIzICs2OTMsMzkgQEAKIAkJCSAgICAgc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgKnNjKQogewogCXN0cnVjdCBvY3Rlb25faW5zdHJfaWgyICppaDI7CisJc3RydWN0IG9jdGVvbl9pbnN0cl9paDMgKmloMzsKIAlzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqaXJoOwogCXUzMiBsZW47CiAKLQlpaDIgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9paDIgKikmc2MtPmNtZC5jbWQyLmloMjsKLQlpZiAoaWgyLT5kbGVuZ3N6KSB7Ci0JCVdBUk5fT04oIXNjLT5kbWFkcHRyKTsKLQkJc2MtPmNtZC5jbWQyLmRwdHIgPSBzYy0+ZG1hZHB0cjsKKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKSB7CisJCWloMyA9ICAoc3RydWN0IG9jdGVvbl9pbnN0cl9paDMgKikmc2MtPmNtZC5jbWQzLmloMzsKKwkJaWYgKGloMy0+ZGxlbmdzeikgeworCQkJV0FSTl9PTighc2MtPmRtYWRwdHIpOworCQkJc2MtPmNtZC5jbWQzLmRwdHIgPSBzYy0+ZG1hZHB0cjsKKwkJfQorCQlpcmggPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKikmc2MtPmNtZC5jbWQzLmlyaDsKKwkJaWYgKGlyaC0+cmZsYWcpIHsKKwkJCVdBUk5fT04oIXNjLT5kbWFycHRyKTsKKwkJCVdBUk5fT04oIXNjLT5zdGF0dXNfd29yZCk7CisJCQkqc2MtPnN0YXR1c193b3JkID0gQ09NUExFVElPTl9XT1JEX0lOSVQ7CisJCQlzYy0+Y21kLmNtZDMucnB0ciA9IHNjLT5kbWFycHRyOworCQl9CisJCWxlbiA9ICh1MzIpaWgzLT5kbGVuZ3N6OworCX0gZWxzZSB7CisJCWloMiA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMiAqKSZzYy0+Y21kLmNtZDIuaWgyOworCQlpZiAoaWgyLT5kbGVuZ3N6KSB7CisJCQlXQVJOX09OKCFzYy0+ZG1hZHB0cik7CisJCQlzYy0+Y21kLmNtZDIuZHB0ciA9IHNjLT5kbWFkcHRyOworCQl9CisJCWlyaCA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqKSZzYy0+Y21kLmNtZDIuaXJoOworCQlpZiAoaXJoLT5yZmxhZykgeworCQkJV0FSTl9PTighc2MtPmRtYXJwdHIpOworCQkJV0FSTl9PTighc2MtPnN0YXR1c193b3JkKTsKKwkJCSpzYy0+c3RhdHVzX3dvcmQgPSBDT01QTEVUSU9OX1dPUkRfSU5JVDsKKwkJCXNjLT5jbWQuY21kMi5ycHRyID0gc2MtPmRtYXJwdHI7CisJCX0KKwkJbGVuID0gKHUzMilpaDItPmRsZW5nc3o7CiAJfQotCWlyaCA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqKSZzYy0+Y21kLmNtZDIuaXJoOwotCWlmIChpcmgtPnJmbGFnKSB7Ci0JCVdBUk5fT04oIXNjLT5kbWFycHRyKTsKLQkJV0FSTl9PTighc2MtPnN0YXR1c193b3JkKTsKLQkJKnNjLT5zdGF0dXNfd29yZCA9IENPTVBMRVRJT05fV09SRF9JTklUOwotCi0JCXNjLT5jbWQuY21kMi5ycHRyID0gc2MtPmRtYXJwdHI7Ci0JfQotCWxlbiA9ICh1MzIpaWgyLT5kbGVuZ3N6OwogCiAJaWYgKHNjLT53YWl0X3RpbWUpCiAJCXNjLT50aW1lb3V0ID0gamlmZmllcyArIHNjLT53YWl0X3RpbWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vcmVzcG9uc2VfbWFuYWdlci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL3Jlc3BvbnNlX21hbmFnZXIuYwppbmRleCA3MDkwNDllLi5iZTUyMTc4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL3Jlc3BvbnNlX21hbmFnZXIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vcmVzcG9uc2VfbWFuYWdlci5jCkBAIC05MSw4ICs5MSwxMyBAQAogCiAJCXNjID0gKHN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICopb3JkZXJlZF9zY19saXN0LT4KIAkJICAgIGhlYWQubmV4dDsKLQkJcmRwID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfcmRwICopJnNjLT5jbWQuY21kMi5yZHA7Ci0JCXJwdHIgPSBzYy0+Y21kLmNtZDIucnB0cjsKKwkJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0ZW9uX2RldikpIHsKKwkJCXJkcCA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3JkcCAqKSZzYy0+Y21kLmNtZDMucmRwOworCQkJcnB0ciA9IHNjLT5jbWQuY21kMy5ycHRyOworCQl9IGVsc2UgeworCQkJcmRwID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfcmRwICopJnNjLT5jbWQuY21kMi5yZHA7CisJCQlycHRyID0gc2MtPmNtZC5jbWQyLnJwdHI7CisJCX0KIAogCQlzdGF0dXMgPSBPQ1RFT05fUkVRVUVTVF9QRU5ESU5HOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL01ha2VmaWxlCmluZGV4IDVjNDYxNWMuLjZiNGQ0YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL01ha2VmaWxlCkBAIC0yLDYgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgQ2F2aXVtJ3MgVGh1bmRlciBldGhlcm5ldCBkZXZpY2UKICMKIAorb2JqLSQoQ09ORklHX1RIVU5ERVJfTklDX1JHWCkgKz0gdGh1bmRlcl94Y3Yubwogb2JqLSQoQ09ORklHX1RIVU5ERVJfTklDX0JHWCkgKz0gdGh1bmRlcl9iZ3gubwogb2JqLSQoQ09ORklHX1RIVU5ERVJfTklDX1BGKSArPSBuaWNwZi5vCiBvYmotJChDT05GSUdfVEhVTkRFUl9OSUNfVkYpICs9IG5pY3ZmLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljLmgKaW5kZXggODMwMjViYi4uMzA0MjYxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljLmgKQEAgLTIwLDYgKzIwLDE3IEBACiAjZGVmaW5lCVBDSV9ERVZJQ0VfSURfVEhVTkRFUl9OSUNfVkYJCTB4QTAzNAogI2RlZmluZQlQQ0lfREVWSUNFX0lEX1RIVU5ERVJfQkdYCQkweEEwMjYKIAorLyogU3Vic3lzdGVtIGRldmljZSBJRHMgKi8KKyNkZWZpbmUgUENJX1NVQlNZU19ERVZJRF84OFhYX05JQ19QRgkJMHhBMTFFCisjZGVmaW5lIFBDSV9TVUJTWVNfREVWSURfODFYWF9OSUNfUEYJCTB4QTIxRQorI2RlZmluZSBQQ0lfU1VCU1lTX0RFVklEXzgzWFhfTklDX1BGCQkweEEzMUUKKworI2RlZmluZSBQQ0lfU1VCU1lTX0RFVklEXzg4WFhfUEFTUzFfTklDX1ZGCTB4QTExRQorI2RlZmluZSBQQ0lfU1VCU1lTX0RFVklEXzg4WFhfTklDX1ZGCQkweEExMzQKKyNkZWZpbmUgUENJX1NVQlNZU19ERVZJRF84MVhYX05JQ19WRgkJMHhBMjM0CisjZGVmaW5lIFBDSV9TVUJTWVNfREVWSURfODNYWF9OSUNfVkYJCTB4QTMzNAorCisKIC8qIFBDSSBCQVIgbm9zICovCiAjZGVmaW5lCVBDSV9DRkdfUkVHX0JBUl9OVU0JCTAKICNkZWZpbmUJUENJX01TSVhfUkVHX0JBUl9OVU0JCTQKQEAgLTQxLDQwICs1Miw4IEBACiAvKiBNYXggcGtpbmRzICovCiAjZGVmaW5lCU5JQ19NQVhfUEtJTkQJCQkxNgogCi0vKiBSeCBDaGFubmVscyAqLwotLyogUmVjZWl2ZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaW4gVE5TIGJ5cGFzcyBtb2RlCi0gKiBCZWxvdyBpcyBjb25maWd1cmF0aW9uIGluIFROUyBieXBhc3MgbW9kZQotICogQkdYMC1MTUFDMC1DSEFOMCAtIFZOSUMgQ0hBTjAKLSAqIEJHWDAtTE1BQzEtQ0hBTjAgLSBWTklDIENIQU4xNgotICogLi4uCi0gKiBCR1gxLUxNQUMwLUNIQU4wIC0gVk5JQyBDSEFOMTI4Ci0gKiAuLi4KLSAqIEJHWDEtTE1BQzMtQ0hBTjAgLSBWTklDIENIQU4xNzQKLSAqLwotI2RlZmluZQlOSUNfSU5URl9DT1VOVAkJCTIgIC8qIEludGVyZmFjZXMgYnR3IFZOSUMgYW5kIFROUy9CR1ggKi8KLSNkZWZpbmUJTklDX0NIQU5TX1BFUl9JTkYJCTEyOAotI2RlZmluZQlOSUNfTUFYX0NIQU5TCQkJKE5JQ19JTlRGX0NPVU5UICogTklDX0NIQU5TX1BFUl9JTkYpCi0jZGVmaW5lCU5JQ19DUElfQ09VTlQJCQkyMDQ4IC8qIE5vIG9mIGNoYW5uZWwgcGFyc2UgaW5kaWNlcyAqLwotCi0vKiBUTlMgYnlwYXNzIG1vZGU6IDEtMSBtYXBwaW5nIGJldHdlZW4gVk5JQyBhbmQgQkdYOkxNQUMgKi8KLSNkZWZpbmUgTklDX01BWF9CR1gJCQlNQVhfQkdYX1BFUl9DTjg4WFgKLSNkZWZpbmUJTklDX0NQSV9QRVJfQkdYCQkJKE5JQ19DUElfQ09VTlQgLyBOSUNfTUFYX0JHWCkKLSNkZWZpbmUJTklDX01BWF9DUElfUEVSX0xNQUMJCTY0IC8qIE1heCB3aGVuIENQSV9BTEcgaXMgSVAgZGlmZnNlcnYgKi8KLSNkZWZpbmUJTklDX1JTU0lfUEVSX0JHWAkJKE5JQ19SU1NJX0NPVU5UIC8gTklDX01BWF9CR1gpCi0KLS8qIFR4IHNjaGVkdWxpbmcgKi8KLSNkZWZpbmUJTklDX01BWF9UTDQJCQkxMDI0Ci0jZGVmaW5lCU5JQ19NQVhfVEw0X1NIQVBFUlMJCTI1NiAvKiAxIHNoYXBlciBmb3IgNCBUTDRzICovCi0jZGVmaW5lCU5JQ19NQVhfVEwzCQkJMjU2Ci0jZGVmaW5lCU5JQ19NQVhfVEwzX1NIQVBFUlMJCTY0ICAvKiAxIHNoYXBlciBmb3IgNCBUTDNzICovCi0jZGVmaW5lCU5JQ19NQVhfVEwyCQkJNjQKLSNkZWZpbmUJTklDX01BWF9UTDJfU0hBUEVSUwkJMiAgLyogMSBzaGFwZXIgZm9yIDMyIFRMMnMgKi8KLSNkZWZpbmUJTklDX01BWF9UTDEJCQkyCi0KLS8qIFROUyBieXBhc3MgbW9kZSAqLwotI2RlZmluZQlOSUNfVEwyX1BFUl9CR1gJCQkzMgotI2RlZmluZQlOSUNfVEw0X1BFUl9CR1gJCQkoTklDX01BWF9UTDQgLyBOSUNfTUFYX0JHWCkKLSNkZWZpbmUJTklDX1RMNF9QRVJfTE1BQwkJKE5JQ19NQVhfVEw0IC8gTklDX0NIQU5TX1BFUl9JTkYpCisvKiBNYXggd2hlbiBDUElfQUxHIGlzIElQIGRpZmZzZXJ2ICovCisjZGVmaW5lCU5JQ19NQVhfQ1BJX1BFUl9MTUFDCQk2NAogCiAvKiBOSUMgVkYgSW50ZXJydXB0cyAqLwogI2RlZmluZQlOSUNWRl9JTlRSX0NRCQkJMApAQCAtMTQ4LDcgKzEyNyw2IEBACiAJc3RydWN0CW5hcGlfc3RydWN0IG5hcGk7CiB9OwogCi0jZGVmaW5lCU5JQ19SU1NJX0NPVU5UCQkJNDA5NiAvKiBUb3RhbCBubyBvZiBSU1MgaW5kaWNlcyAqLwogI2RlZmluZSBOSUNfTUFYX1JTU19IQVNIX0JJVFMJCTgKICNkZWZpbmUgTklDX01BWF9SU1NfSURSX1RCTF9TSVpFCSgxIDw8IE5JQ19NQVhfUlNTX0hBU0hfQklUUykKICNkZWZpbmUgUlNTX0hBU0hfS0VZX1NJWkUJCTUgLyogMzIwIGJpdCBrZXkgKi8KQEAgLTI3MywxMiArMjUxLDE0IEBACiAJc3RydWN0IG5ldF9kZXZpY2UJKm5ldGRldjsKIAlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CiAJdm9pZCBfX2lvbWVtCQkqcmVnX2Jhc2U7CisjZGVmaW5lCU1BWF9RVUVVRVNfUEVSX1FTRVQJCQk4CiAJc3RydWN0IHF1ZXVlX3NldAkqcXM7CiAJc3RydWN0IG5pY3ZmX2NxX3BvbGwJKm5hcGlbOF07CiAJdTgJCQl2Zl9pZDsKIAl1OAkJCXNxc19pZDsKIAlib29sICAgICAgICAgICAgICAgICAgICBzcXNfbW9kZTsKIAlib29sCQkJaHdfdHNvOworCWJvb2wJCQl0ODg7CiAKIAkvKiBSZWNlaXZlIGJ1ZmZlciBhbGxvYyAqLwogCXUzMgkJCXJiX3BhZ2Vfb2Zmc2V0OwpAQCAtMzI1LDcgKzMwNSw3IEBACiAJYm9vbAkJCW1zaXhfZW5hYmxlZDsKIAl1OAkJCW51bV92ZWM7CiAJc3RydWN0IG1zaXhfZW50cnkJbXNpeF9lbnRyaWVzW05JQ19WRl9NU0lYX1ZFQ1RPUlNdOwotCWNoYXIJCQlpcnFfbmFtZVtOSUNfVkZfTVNJWF9WRUNUT1JTXVsyMF07CisJY2hhcgkJCWlycV9uYW1lW05JQ19WRl9NU0lYX1ZFQ1RPUlNdW0lGTkFNU0laICsgMTVdOwogCWJvb2wJCQlpcnFfYWxsb2NhdGVkW05JQ19WRl9NU0lYX1ZFQ1RPUlNdOwogCWNwdW1hc2tfdmFyX3QJCWFmZmluaXR5X21hc2tbTklDX1ZGX01TSVhfVkVDVE9SU107CiAKQEAgLTM2OCw2ICszNDgsNyBAQAogI2RlZmluZQlOSUNfTUJPWF9NU0dfUE5JQ1ZGX1BUUgkJMHgxNAkvKiBHZXQgcHJpbWFyeSBxc2V0IG5pY3ZmIHB0ciAqLwogI2RlZmluZQlOSUNfTUJPWF9NU0dfU05JQ1ZGX1BUUgkJMHgxNQkvKiBTZW5kIHNxZXQgbmljdmYgcHRyIHRvIFBWRiAqLwogI2RlZmluZQlOSUNfTUJPWF9NU0dfTE9PUEJBQ0sJCTB4MTYJLyogU2V0IGludGVyZmFjZSBpbiBsb29wYmFjayAqLworI2RlZmluZQlOSUNfTUJPWF9NU0dfUkVTRVRfU1RBVF9DT1VOVEVSIDB4MTcJLyogUmVzZXQgc3RhdGlzdGljcyBjb3VudGVycyAqLwogI2RlZmluZQlOSUNfTUJPWF9NU0dfQ0ZHX0RPTkUJCTB4RjAJLyogVkYgY29uZmlndXJhdGlvbiBkb25lICovCiAjZGVmaW5lCU5JQ19NQk9YX01TR19TSFVURE9XTgkJMHhGMQkvKiBWRiBpcyBiZWluZyBzaHV0ZG93biAqLwogCkBAIC00ODQsNiArNDY1LDMxIEBACiAJYm9vbCAgZW5hYmxlOwogfTsKIAorLyogUmVzZXQgc3RhdGlzdGljcyBjb3VudGVycyAqLworc3RydWN0IHJlc2V0X3N0YXRfY2ZnIHsKKwl1OCAgICBtc2c7CisJLyogQml0bWFwIHRvIHNlbGVjdCBOSUNfUEZfVk5JQyh2Zl9pZClfUlhfU1RBVCgwLi4xMykgKi8KKwl1MTYgICByeF9zdGF0X21hc2s7CisJLyogQml0bWFwIHRvIHNlbGVjdCBOSUNfUEZfVk5JQyh2Zl9pZClfVFhfU1RBVCgwLi40KSAqLworCXU4ICAgIHR4X3N0YXRfbWFzazsKKwkvKiBCaXRtYXAgdG8gc2VsZWN0IE5JQ19QRl9RUygwLi4xMjcpX1JRKDAuLjcpX1NUQVQoMC4uMSkKKwkgKiBiaXQxNCwgYml0MTUgTklDX1BGX1FTKHZmX2lkKV9SUTdfU1RBVCgwLi4xKQorCSAqIGJpdDEyLCBiaXQxMyBOSUNfUEZfUVModmZfaWQpX1JRNl9TVEFUKDAuLjEpCisJICogLi4KKwkgKiBiaXQyLCBiaXQzIE5JQ19QRl9RUyh2Zl9pZClfUlExX1NUQVQoMC4uMSkKKwkgKiBiaXQwLCBiaXQxIE5JQ19QRl9RUyh2Zl9pZClfUlEwX1NUQVQoMC4uMSkKKwkgKi8KKwl1MTYgICBycV9zdGF0X21hc2s7CisJLyogQml0bWFwIHRvIHNlbGVjdCBOSUNfUEZfUVMoMC4uMTI3KV9TUSgwLi43KV9TVEFUKDAuLjEpCisJICogYml0MTQsIGJpdDE1IE5JQ19QRl9RUyh2Zl9pZClfU1E3X1NUQVQoMC4uMSkKKwkgKiBiaXQxMiwgYml0MTMgTklDX1BGX1FTKHZmX2lkKV9TUTZfU1RBVCgwLi4xKQorCSAqIC4uCisJICogYml0MiwgYml0MyBOSUNfUEZfUVModmZfaWQpX1NRMV9TVEFUKDAuLjEpCisJICogYml0MCwgYml0MSBOSUNfUEZfUVModmZfaWQpX1NRMF9TVEFUKDAuLjEpCisJICovCisJdTE2ICAgc3Ffc3RhdF9tYXNrOworfTsKKwogLyogMTI4IGJpdCBzaGFyZWQgbWVtb3J5IGJldHdlZW4gUEYgYW5kIGVhY2ggVkYgKi8KIHVuaW9uIG5pY19tYnggewogCXN0cnVjdCB7IHU4IG1zZzsgfQltc2c7CkBAIC01MDEsNiArNTA3LDcgQEAKIAlzdHJ1Y3Qgc3FzX2FsbG9jICAgICAgICBzcXNfYWxsb2M7CiAJc3RydWN0IG5pY3ZmX3B0cgluaWN2ZjsKIAlzdHJ1Y3Qgc2V0X2xvb3BiYWNrCWxiazsKKwlzdHJ1Y3QgcmVzZXRfc3RhdF9jZmcJcmVzZXRfc3RhdDsKIH07CiAKICNkZWZpbmUgTklDX05PREVfSURfTUFTSwkweDAzCkBAIC01MTQsNyArNTIxLDE0IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBwYXNzMV9zaWxpY29uKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXJldHVybiBwZGV2LT5yZXZpc2lvbiA8IDg7CisJcmV0dXJuIChwZGV2LT5yZXZpc2lvbiA8IDgpICYmCisJCShwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IFBDSV9TVUJTWVNfREVWSURfODhYWF9OSUNfUEYpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgcGFzczJfc2lsaWNvbihzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlyZXR1cm4gKHBkZXYtPnJldmlzaW9uID49IDgpICYmCisJCShwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IFBDSV9TVUJTWVNfREVWSURfODhYWF9OSUNfUEYpOwogfQogCiBpbnQgbmljdmZfc2V0X3JlYWxfbnVtX3F1ZXVlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY19tYWluLmMKaW5kZXggMTZlZDIwMy4uMmJiZjRjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWNfbWFpbi5jCkBAIC0yMCw4ICsyMCwyNSBAQAogI2RlZmluZSBEUlZfTkFNRQkidGh1bmRlci1uaWMiCiAjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjAiCiAKK3N0cnVjdCBod19pbmZvIHsKKwl1OAkJYmd4X2NudDsKKwl1OAkJY2hhbnNfcGVyX2xtYWM7CisJdTgJCWNoYW5zX3Blcl9iZ3g7IC8qIFJ4L1R4IGNoYW5zICovCisJdTgJCWNoYW5zX3Blcl9yZ3g7CisJdTgJCWNoYW5zX3Blcl9sYms7CisJdTE2CQljcGlfY250OworCXUxNgkJcnNzaV9jbnQ7CisJdTE2CQlyc3NfaW5kX3RibF9zaXplOworCXUxNgkJdGw0X2NudDsKKwl1MTYJCXRsM19jbnQ7CisJdTgJCXRsMl9jbnQ7CisJdTgJCXRsMV9jbnQ7CisJYm9vbAkJdGwxX3Blcl9iZ3g7IC8qIFRMMSBwZXIgQkdYIG9yIHBlciBMTUFDICovCit9OworCiBzdHJ1Y3QgbmljcGYgewogCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKKwlzdHJ1Y3QgaHdfaW5mbyAgICAgICAgICAqaHc7CiAJdTgJCQlub2RlOwogCXVuc2lnbmVkIGludAkJZmxhZ3M7CiAJdTgJCQludW1fdmZfZW47ICAgICAgLyogTm8gb2YgVkYgZW5hYmxlZCAqLwpAQCAtMzYsMjIgKzUzLDIyIEBACiAjZGVmaW5lCU5JQ19TRVRfVkZfTE1BQ19NQVAoYmd4LCBsbWFjKQkoKChiZ3ggJiAweEYpIDw8IDQpIHwgKGxtYWMgJiAweEYpKQogI2RlZmluZQlOSUNfR0VUX0JHWF9GUk9NX1ZGX0xNQUNfTUFQKG1hcCkJKChtYXAgPj4gNCkgJiAweEYpCiAjZGVmaW5lCU5JQ19HRVRfTE1BQ19GUk9NX1ZGX0xNQUNfTUFQKG1hcCkJKG1hcCAmIDB4RikKLQl1OAkJCXZmX2xtYWNfbWFwW01BWF9MTUFDXTsKKwl1OAkJCSp2Zl9sbWFjX21hcDsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICAgICBkd29yazsKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqY2hlY2tfbGluazsKLQl1OAkJCWxpbmtbTUFYX0xNQUNdOwotCXU4CQkJZHVwbGV4W01BWF9MTUFDXTsKLQl1MzIJCQlzcGVlZFtNQVhfTE1BQ107CisJdTgJCQkqbGluazsKKwl1OAkJCSpkdXBsZXg7CisJdTMyCQkJKnNwZWVkOwogCXUxNgkJCWNwaV9iYXNlW01BWF9OVU1fVkZTX1NVUFBPUlRFRF07CiAJdTE2CQkJcnNzaV9iYXNlW01BWF9OVU1fVkZTX1NVUFBPUlRFRF07Ci0JdTE2CQkJcnNzX2luZF90Ymxfc2l6ZTsKIAlib29sCQkJbWJ4X2xvY2tbTUFYX05VTV9WRlNfU1VQUE9SVEVEXTsKIAogCS8qIE1TSS1YICovCiAJYm9vbAkJCW1zaXhfZW5hYmxlZDsKIAl1OAkJCW51bV92ZWM7Ci0Jc3RydWN0IG1zaXhfZW50cnkJbXNpeF9lbnRyaWVzW05JQ19QRl9NU0lYX1ZFQ1RPUlNdOworCXN0cnVjdCBtc2l4X2VudHJ5CSptc2l4X2VudHJpZXM7CiAJYm9vbAkJCWlycV9hbGxvY2F0ZWRbTklDX1BGX01TSVhfVkVDVE9SU107CisJY2hhcgkJCWlycV9uYW1lW05JQ19QRl9NU0lYX1ZFQ1RPUlNdWzIwXTsKIH07CiAKIC8qIFN1cHBvcnRlZCBkZXZpY2VzICovCkBAIC04OSw5ICsxMDYsMjIgQEAKIC8qIFBGIC0+IFZGIG1haWxib3ggY29tbXVuaWNhdGlvbiBBUElzICovCiBzdGF0aWMgdm9pZCBuaWNfZW5hYmxlX21ieF9pbnRyKHN0cnVjdCBuaWNwZiAqbmljKQogewotCS8qIEVuYWJsZSBtYWlsYm94IGludGVycnVwdCBmb3IgYWxsIDEyOCBWRnMgKi8KLQluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX01BSUxCT1hfRU5BX1cxUywgfjB1bGwpOwotCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfTUFJTEJPWF9FTkFfVzFTICsgc2l6ZW9mKHU2NCksIH4wdWxsKTsKKwlpbnQgdmZfY250ID0gcGNpX3NyaW92X2dldF90b3RhbHZmcyhuaWMtPnBkZXYpOworCisjZGVmaW5lIElOVFJfTUFTSyh2ZnMpICgodmZzIDwgNjQpID8gKEJJVF9VTEwodmZzKSAtIDEpIDogKH4wdWxsKSkKKworCS8qIENsZWFyIGl0LCB0byBhdm9pZCBzcHVyaW91cyBpbnRlcnJ1cHRzIChpZiBhbnkpICovCisJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9NQUlMQk9YX0lOVCwgSU5UUl9NQVNLKHZmX2NudCkpOworCisJLyogRW5hYmxlIG1haWxib3ggaW50ZXJydXB0IGZvciBhbGwgVkZzICovCisJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9NQUlMQk9YX0VOQV9XMVMsIElOVFJfTUFTSyh2Zl9jbnQpKTsKKwkvKiBPbmUgbWFpbGJveCBpbnRyIGVuYWJsZSByZWcgcGVyIDY0IFZGcyAqLworCWlmICh2Zl9jbnQgPiA2NCkgeworCQluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX01BSUxCT1hfSU5UICsgc2l6ZW9mKHU2NCksCisJCQkgICAgICBJTlRSX01BU0sodmZfY250IC0gNjQpKTsKKwkJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9NQUlMQk9YX0VOQV9XMVMgKyBzaXplb2YodTY0KSwKKwkJCSAgICAgIElOVFJfTUFTSyh2Zl9jbnQgLSA2NCkpOworCX0KIH0KIAogc3RhdGljIHZvaWQgbmljX2NsZWFyX21ieF9pbnRyKHN0cnVjdCBuaWNwZiAqbmljLCBpbnQgdmYsIGludCBtYnhfcmVnKQpAQCAtMTQ0LDcgKzE3NCw3IEBACiAKIAltYngubmljX2NmZy50bnNfbW9kZSA9IE5JQ19UTlNfQllQQVNTX01PREU7CiAKLQlpZiAodmYgPCBNQVhfTE1BQykgeworCWlmICh2ZiA8IG5pYy0+bnVtX3ZmX2VuKSB7CiAJCWJneF9pZHggPSBOSUNfR0VUX0JHWF9GUk9NX1ZGX0xNQUNfTUFQKG5pYy0+dmZfbG1hY19tYXBbdmZdKTsKIAkJbG1hYyA9IE5JQ19HRVRfTE1BQ19GUk9NX1ZGX0xNQUNfTUFQKG5pYy0+dmZfbG1hY19tYXBbdmZdKTsKIApAQCAtMTU1LDcgKzE4NSw3IEBACiAJbWJ4Lm5pY19jZmcuc3FzX21vZGUgPSAodmYgPj0gbmljLT5udW1fdmZfZW4pID8gdHJ1ZSA6IGZhbHNlOwogCW1ieC5uaWNfY2ZnLm5vZGVfaWQgPSBuaWMtPm5vZGU7CiAKLQltYngubmljX2NmZy5sb29wYmFja19zdXBwb3J0ZWQgPSB2ZiA8IE1BWF9MTUFDOworCW1ieC5uaWNfY2ZnLmxvb3BiYWNrX3N1cHBvcnRlZCA9IHZmIDwgbmljLT5udW1fdmZfZW47CiAKIAluaWNfc2VuZF9tc2dfdG9fdmYobmljLCB2ZiwgJm1ieCk7CiB9CkBAIC0yNDgsMTQgKzI3OCwyNyBAQAogLyogU2V0IG1pbmltdW0gdHJhbnNtaXQgcGFja2V0IHNpemUgKi8KIHN0YXRpYyB2b2lkIG5pY19zZXRfdHhfcGt0X3BhZChzdHJ1Y3QgbmljcGYgKm5pYywgaW50IHNpemUpCiB7Ci0JaW50IGxtYWM7CisJaW50IGxtYWMsIG1heF9sbWFjOworCXUxNiBzZGV2aWQ7CiAJdTY0IGxtYWNfY2ZnOwogCi0JLyogTWF4IHZhbHVlIHRoYXQgY2FuIGJlIHNldCBpcyA2MCAqLwotCWlmIChzaXplID4gNjApCi0JCXNpemUgPSA2MDsKKwkvKiBUaGVyZSBpcyBhIGlzc3VlIGluIEhXIHdoZXJlLWluIHdoaWxlIHNlbmRpbmcgR1NPIHNpemVkCisJICogcGt0cyBhcyBwYXJ0IG9mIFRTTywgaWYgcGt0IGxlbiBmYWxscyBiZWxvdyB0aGlzIHNpemUKKwkgKiBOSUMgd2lsbCB6ZXJvIFBBRCBwYWNrZXQgYW5kIGFsc28gdXBkYXRlcyBJUCB0b3RhbCBsZW5ndGguCisJICogSGVuY2Ugc2V0IHRoaXMgdmFsdWUgdG8gbGVzc3RoYW4gbWluIHBrdCBzaXplIG9mIE1BQytJUCtUQ1AKKwkgKiBoZWFkZXJzLCBCR1ggd2lsbCBkbyB0aGUgcGFkZGluZyB0byB0cmFuc21pdCA2NCBieXRlIHBrdC4KKwkgKi8KKwlpZiAoc2l6ZSA+IDUyKQorCQlzaXplID0gNTI7CiAKLQlmb3IgKGxtYWMgPSAwOyBsbWFjIDwgKE1BWF9CR1hfUEVSX0NOODhYWCAqIE1BWF9MTUFDX1BFUl9CR1gpOyBsbWFjKyspIHsKKwlwY2lfcmVhZF9jb25maWdfd29yZChuaWMtPnBkZXYsIFBDSV9TVUJTWVNURU1fSUQsICZzZGV2aWQpOworCS8qIDgxeHgncyBSR1ggaGFzIG9ubHkgb25lIExNQUMgKi8KKwlpZiAoc2RldmlkID09IFBDSV9TVUJTWVNfREVWSURfODFYWF9OSUNfUEYpCisJCW1heF9sbWFjID0gKChuaWMtPmh3LT5iZ3hfY250IC0gMSkgKiBNQVhfTE1BQ19QRVJfQkdYKSArIDE7CisJZWxzZQorCQltYXhfbG1hYyA9IG5pYy0+aHctPmJneF9jbnQgKiBNQVhfTE1BQ19QRVJfQkdYOworCisJZm9yIChsbWFjID0gMDsgbG1hYyA8IG1heF9sbWFjOyBsbWFjKyspIHsKIAkJbG1hY19jZmcgPSBuaWNfcmVnX3JlYWQobmljLCBOSUNfUEZfTE1BQ18wXzdfQ0ZHIHwgKGxtYWMgPDwgMykpOwogCQlsbWFjX2NmZyAmPSB+KDB4RiA8PCAyKTsKIAkJbG1hY19jZmcgfD0gKChzaXplIC8gNCkgPDwgMik7CkBAIC0yNzUsNyArMzE4LDcgQEAKIAogCW5pYy0+bnVtX3ZmX2VuID0gMDsKIAotCWZvciAoYmd4ID0gMDsgYmd4IDwgTklDX01BWF9CR1g7IGJneCsrKSB7CisJZm9yIChiZ3ggPSAwOyBiZ3ggPCBuaWMtPmh3LT5iZ3hfY250OyBiZ3grKykgewogCQlpZiAoIShiZ3hfbWFwICYgKDEgPDwgYmd4KSkpCiAJCQljb250aW51ZTsKIAkJbG1hY19jbnQgPSBiZ3hfZ2V0X2xtYWNfY291bnQobmljLT5ub2RlLCBiZ3gpOwpAQCAtMjk1LDI4ICszMzgsMTI1IEBACiAJCQluaWNfcmVnX3dyaXRlKG5pYywKIAkJCQkgICAgICBOSUNfUEZfTE1BQ18wXzdfQ1JFRElUICsgKGxtYWMgKiA4KSwKIAkJCQkgICAgICBsbWFjX2NyZWRpdCk7CisKKwkJLyogT24gQ044MVhYIHRoZXJlIGFyZSBvbmx5IDggVkZzIGJ1dCBtYXggcG9zc2libGUgbm8gb2YKKwkJICogaW50ZXJmYWNlcyBhcmUgOS4KKwkJICovCisJCWlmIChuaWMtPm51bV92Zl9lbiA+PSBwY2lfc3Jpb3ZfZ2V0X3RvdGFsdmZzKG5pYy0+cGRldikpIHsKKwkJCW5pYy0+bnVtX3ZmX2VuID0gcGNpX3NyaW92X2dldF90b3RhbHZmcyhuaWMtPnBkZXYpOworCQkJYnJlYWs7CisJCX0KIAl9CiB9CiAKK3N0YXRpYyB2b2lkIG5pY19mcmVlX2xtYWNtZW0oc3RydWN0IG5pY3BmICpuaWMpCit7CisJa2ZyZWUobmljLT52Zl9sbWFjX21hcCk7CisJa2ZyZWUobmljLT5saW5rKTsKKwlrZnJlZShuaWMtPmR1cGxleCk7CisJa2ZyZWUobmljLT5zcGVlZCk7Cit9CisKK3N0YXRpYyBpbnQgbmljX2dldF9od19pbmZvKHN0cnVjdCBuaWNwZiAqbmljKQoreworCXU4IG1heF9sbWFjOworCXUxNiBzZGV2aWQ7CisJc3RydWN0IGh3X2luZm8gKmh3ID0gbmljLT5odzsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKG5pYy0+cGRldiwgUENJX1NVQlNZU1RFTV9JRCwgJnNkZXZpZCk7CisKKwlzd2l0Y2ggKHNkZXZpZCkgeworCWNhc2UgUENJX1NVQlNZU19ERVZJRF84OFhYX05JQ19QRjoKKwkJaHctPmJneF9jbnQgPSBNQVhfQkdYX1BFUl9DTjg4WFg7CisJCWh3LT5jaGFuc19wZXJfbG1hYyA9IDE2OworCQlody0+Y2hhbnNfcGVyX2JneCA9IDEyODsKKwkJaHctPmNwaV9jbnQgPSAyMDQ4OworCQlody0+cnNzaV9jbnQgPSA0MDk2OworCQlody0+cnNzX2luZF90Ymxfc2l6ZSA9IE5JQ19NQVhfUlNTX0lEUl9UQkxfU0laRTsKKwkJaHctPnRsM19jbnQgPSAyNTY7CisJCWh3LT50bDJfY250ID0gNjQ7CisJCWh3LT50bDFfY250ID0gMjsKKwkJaHctPnRsMV9wZXJfYmd4ID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfU1VCU1lTX0RFVklEXzgxWFhfTklDX1BGOgorCQlody0+Ymd4X2NudCA9IE1BWF9CR1hfUEVSX0NOODFYWDsKKwkJaHctPmNoYW5zX3Blcl9sbWFjID0gODsKKwkJaHctPmNoYW5zX3Blcl9iZ3ggPSAzMjsKKwkJaHctPmNoYW5zX3Blcl9yZ3ggPSA4OworCQlody0+Y2hhbnNfcGVyX2xiayA9IDI0OworCQlody0+Y3BpX2NudCA9IDUxMjsKKwkJaHctPnJzc2lfY250ID0gMjU2OworCQlody0+cnNzX2luZF90Ymxfc2l6ZSA9IDMyOyAvKiBNYXggUlNTSSAvIE1heCBpbnRlcmZhY2VzICovCisJCWh3LT50bDNfY250ID0gNjQ7CisJCWh3LT50bDJfY250ID0gMTY7CisJCWh3LT50bDFfY250ID0gMTA7CisJCWh3LT50bDFfcGVyX2JneCA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIFBDSV9TVUJTWVNfREVWSURfODNYWF9OSUNfUEY6CisJCWh3LT5iZ3hfY250ID0gTUFYX0JHWF9QRVJfQ044M1hYOworCQlody0+Y2hhbnNfcGVyX2xtYWMgPSA4OworCQlody0+Y2hhbnNfcGVyX2JneCA9IDMyOworCQlody0+Y2hhbnNfcGVyX2xiayA9IDY0OworCQlody0+Y3BpX2NudCA9IDIwNDg7CisJCWh3LT5yc3NpX2NudCA9IDEwMjQ7CisJCWh3LT5yc3NfaW5kX3RibF9zaXplID0gNjQ7IC8qIE1heCBSU1NJIC8gTWF4IGludGVyZmFjZXMgKi8KKwkJaHctPnRsM19jbnQgPSAyNTY7CisJCWh3LT50bDJfY250ID0gNjQ7CisJCWh3LT50bDFfY250ID0gMTg7CisJCWh3LT50bDFfcGVyX2JneCA9IGZhbHNlOworCQlicmVhazsKKwl9CisJaHctPnRsNF9jbnQgPSBNQVhfUVVFVUVTX1BFUl9RU0VUICogcGNpX3NyaW92X2dldF90b3RhbHZmcyhuaWMtPnBkZXYpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBMTUFDIHRyYWNraW5nIGVsZW1lbnRzICovCisJbWF4X2xtYWMgPSBody0+Ymd4X2NudCAqIE1BWF9MTUFDX1BFUl9CR1g7CisJbmljLT52Zl9sbWFjX21hcCA9IGttYWxsb2NfYXJyYXkobWF4X2xtYWMsIHNpemVvZih1OCksIEdGUF9LRVJORUwpOworCWlmICghbmljLT52Zl9sbWFjX21hcCkKKwkJZ290byBlcnJvcjsKKwluaWMtPmxpbmsgPSBrbWFsbG9jX2FycmF5KG1heF9sbWFjLCBzaXplb2YodTgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5pYy0+bGluaykKKwkJZ290byBlcnJvcjsKKwluaWMtPmR1cGxleCA9IGttYWxsb2NfYXJyYXkobWF4X2xtYWMsIHNpemVvZih1OCksIEdGUF9LRVJORUwpOworCWlmICghbmljLT5kdXBsZXgpCisJCWdvdG8gZXJyb3I7CisJbmljLT5zcGVlZCA9IGttYWxsb2NfYXJyYXkobWF4X2xtYWMsIHNpemVvZih1MzIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5pYy0+c3BlZWQpCisJCWdvdG8gZXJyb3I7CisJcmV0dXJuIDA7CisKK2Vycm9yOgorCW5pY19mcmVlX2xtYWNtZW0obmljKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKwogI2RlZmluZSBCR1gwX0JMT0NLIDgKICNkZWZpbmUgQkdYMV9CTE9DSyA5CiAKLXN0YXRpYyB2b2lkIG5pY19pbml0X2h3KHN0cnVjdCBuaWNwZiAqbmljKQorc3RhdGljIGludCBuaWNfaW5pdF9odyhzdHJ1Y3QgbmljcGYgKm5pYykKIHsKLQlpbnQgaTsKKwlpbnQgaSwgZXJyOwogCXU2NCBjcW1fY2ZnOwogCisJLyogR2V0IEhXIGNhcGFiaWxpdHkgaW5mbyAqLworCWVyciA9IG5pY19nZXRfaHdfaW5mbyhuaWMpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKIAkvKiBFbmFibGUgTklDIEhXIGJsb2NrICovCiAJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9DRkcsIDB4Myk7CiAKIAkvKiBFbmFibGUgYmFja3ByZXNzdXJlICovCiAJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9CUF9DRkcsICgxVUxMIDw8IDYpIHwgMHgwMyk7CiAKLQkvKiBEaXNhYmxlIFROUyBtb2RlIG9uIGJvdGggaW50ZXJmYWNlcyAqLwotCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfSU5URl8wXzFfU0VORF9DRkcsCi0JCSAgICAgIChOSUNfVE5TX0JZUEFTU19NT0RFIDw8IDcpIHwgQkdYMF9CTE9DSyk7Ci0JbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9JTlRGXzBfMV9TRU5EX0NGRyB8ICgxIDw8IDgpLAotCQkgICAgICAoTklDX1ROU19CWVBBU1NfTU9ERSA8PCA3KSB8IEJHWDFfQkxPQ0spOworCS8qIFROUyBhbmQgVE5TIGJ5cGFzcyBtb2RlcyBhcmUgcHJlc2VudCBvbmx5IG9uIDg4eHggKi8KKwlpZiAobmljLT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IFBDSV9TVUJTWVNfREVWSURfODhYWF9OSUNfUEYpIHsKKwkJLyogRGlzYWJsZSBUTlMgbW9kZSBvbiBib3RoIGludGVyZmFjZXMgKi8KKwkJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9JTlRGXzBfMV9TRU5EX0NGRywKKwkJCSAgICAgIChOSUNfVE5TX0JZUEFTU19NT0RFIDw8IDcpIHwgQkdYMF9CTE9DSyk7CisJCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfSU5URl8wXzFfU0VORF9DRkcgfCAoMSA8PCA4KSwKKwkJCSAgICAgIChOSUNfVE5TX0JZUEFTU19NT0RFIDw8IDcpIHwgQkdYMV9CTE9DSyk7CisJfQorCiAJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9JTlRGXzBfMV9CUF9DRkcsCiAJCSAgICAgICgxVUxMIDw8IDYzKSB8IEJHWDBfQkxPQ0spOwogCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfSU5URl8wXzFfQlBfQ0ZHICsgKDEgPDwgOCksCkBAIC0zNDYsMTEgKzQ4NiwxNCBAQAogCWNxbV9jZmcgPSBuaWNfcmVnX3JlYWQobmljLCBOSUNfUEZfQ1FNX0NGRyk7CiAJaWYgKGNxbV9jZmcgPCBOSUNQRl9DUU1fTUlOX0RST1BfTEVWRUwpCiAJCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfQ1FNX0NGRywgTklDUEZfQ1FNX01JTl9EUk9QX0xFVkVMKTsKKworCXJldHVybiAwOwogfQogCiAvKiBDaGFubmVsIHBhcnNlIGluZGV4IGNvbmZpZ3VyYXRpb24gKi8KIHN0YXRpYyB2b2lkIG5pY19jb25maWdfY3BpKHN0cnVjdCBuaWNwZiAqbmljLCBzdHJ1Y3QgY3BpX2NmZ19tc2cgKmNmZykKIHsKKwlzdHJ1Y3QgaHdfaW5mbyAqaHcgPSBuaWMtPmh3OwogCXUzMiB2bmljLCBiZ3gsIGxtYWMsIGNoYW47CiAJdTMyIHBhZGQsIGNwaV9jb3VudCA9IDA7CiAJdTY0IGNwaV9iYXNlLCBjcGksIHJzc2lfYmFzZSwgcnNzaTsKQEAgLTM2MCw5ICs1MDMsOSBAQAogCWJneCA9IE5JQ19HRVRfQkdYX0ZST01fVkZfTE1BQ19NQVAobmljLT52Zl9sbWFjX21hcFt2bmljXSk7CiAJbG1hYyA9IE5JQ19HRVRfTE1BQ19GUk9NX1ZGX0xNQUNfTUFQKG5pYy0+dmZfbG1hY19tYXBbdm5pY10pOwogCi0JY2hhbiA9IChsbWFjICogTUFYX0JHWF9DSEFOU19QRVJfTE1BQykgKyAoYmd4ICogTklDX0NIQU5TX1BFUl9JTkYpOwotCWNwaV9iYXNlID0gKGxtYWMgKiBOSUNfTUFYX0NQSV9QRVJfTE1BQykgKyAoYmd4ICogTklDX0NQSV9QRVJfQkdYKTsKLQlyc3NpX2Jhc2UgPSAobG1hYyAqIG5pYy0+cnNzX2luZF90Ymxfc2l6ZSkgKyAoYmd4ICogTklDX1JTU0lfUEVSX0JHWCk7CisJY2hhbiA9IChsbWFjICogaHctPmNoYW5zX3Blcl9sbWFjKSArIChiZ3ggKiBody0+Y2hhbnNfcGVyX2JneCk7CisJY3BpX2Jhc2UgPSB2bmljICogTklDX01BWF9DUElfUEVSX0xNQUM7CisJcnNzaV9iYXNlID0gdm5pYyAqIGh3LT5yc3NfaW5kX3RibF9zaXplOwogCiAJLyogUnggY2hhbm5lbCBjb25maWd1cmF0aW9uICovCiAJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9DSEFOXzBfMjU1X1JYX0JQX0NGRyB8IChjaGFuIDw8IDMpLApAQCAtNDM0LDcgKzU3Nyw3IEBACiAJbXNnID0gKHU2NCAqKSZtYng7CiAKIAltYngucnNzX3NpemUubXNnID0gTklDX01CT1hfTVNHX1JTU19TSVpFOwotCW1ieC5yc3Nfc2l6ZS5pbmRfdGJsX3NpemUgPSBuaWMtPnJzc19pbmRfdGJsX3NpemU7CisJbWJ4LnJzc19zaXplLmluZF90Ymxfc2l6ZSA9IG5pYy0+aHctPnJzc19pbmRfdGJsX3NpemU7CiAJbmljX3NlbmRfbXNnX3RvX3ZmKG5pYywgdmYsICZtYngpOwogfQogCkBAIC00ODEsNyArNjI0LDcgQEAKIC8qIDQgbGV2ZWwgdHJhbnNtaXQgc2lkZSBzY2hlZHVsZXIgY29uZmlndXRhdGlvbgogICogZm9yIFROUyBieXBhc3MgbW9kZQogICoKLSAqIFNhbXBsZSBjb25maWd1cmF0aW9uIGZvciBTUTAKKyAqIFNhbXBsZSBjb25maWd1cmF0aW9uIGZvciBTUTAgb24gODh4eAogICogVk5JQzAtU1EwIC0+IFRMNCgwKSAgIC0+IFRMM1swXSAgIC0+IFRMMlswXSAgLT4gVEwxWzBdIC0+IEJHWDAKICAqIFZOSUMxLVNRMCAtPiBUTDQoOCkgICAtPiBUTDNbMl0gICAtPiBUTDJbMF0gIC0+IFRMMVswXSAtPiBCR1gwCiAgKiBWTklDMi1TUTAgLT4gVEw0KDE2KSAgLT4gVEwzWzRdICAgLT4gVEwyWzFdICAtPiBUTDFbMF0gLT4gQkdYMApAQCAtNDk0LDYgKzYzNyw3IEBACiBzdGF0aWMgdm9pZCBuaWNfdHhfY2hhbm5lbF9jZmcoc3RydWN0IG5pY3BmICpuaWMsIHU4IHZuaWMsCiAJCQkgICAgICAgc3RydWN0IHNxX2NmZ19tc2cgKnNxKQogeworCXN0cnVjdCBod19pbmZvICpodyA9IG5pYy0+aHc7CiAJdTMyIGJneCwgbG1hYywgY2hhbjsKIAl1MzIgdGwyLCB0bDMsIHRsNDsKIAl1MzIgcnJfcXVhbnR1bTsKQEAgLTUxMiwyMSArNjU2LDI4IEBACiAJLyogMjQgYnl0ZXMgZm9yIEZDUywgSVBHIGFuZCBwcmVhbWJsZSAqLwogCXJyX3F1YW50dW0gPSAoKE5JQ19IV19NQVhfRlJTICsgMjQpIC8gNCk7CiAKLQlpZiAoIXNxLT5zcXNfbW9kZSkgewotCQl0bDQgPSAobG1hYyAqIE5JQ19UTDRfUEVSX0xNQUMpICsgKGJneCAqIE5JQ19UTDRfUEVSX0JHWCk7Ci0JfSBlbHNlIHsKLQkJZm9yIChzdmYgPSAwOyBzdmYgPCBNQVhfU1FTX1BFUl9WRjsgc3ZmKyspIHsKLQkJCWlmIChuaWMtPnZmX3Nxc1twcXNfdm5pY11bc3ZmXSA9PSB2bmljKQotCQkJCWJyZWFrOworCS8qIEZvciA4OHh4IDAtNTExIFRMNCB0cmFuc21pdHMgdmlhIEJHWDAgYW5kCisJICogNTEyLTEwMjMgVEw0cyB0cmFuc21pdCB2aWEgQkdYMS4KKwkgKi8KKwlpZiAoaHctPnRsMV9wZXJfYmd4KSB7CisJCXRsNCA9IGJneCAqIChody0+dGw0X2NudCAvIGh3LT5iZ3hfY250KTsKKwkJaWYgKCFzcS0+c3FzX21vZGUpIHsKKwkJCXRsNCArPSAobG1hYyAqIE1BWF9RVUVVRVNfUEVSX1FTRVQpOworCQl9IGVsc2UgeworCQkJZm9yIChzdmYgPSAwOyBzdmYgPCBNQVhfU1FTX1BFUl9WRjsgc3ZmKyspIHsKKwkJCQlpZiAobmljLT52Zl9zcXNbcHFzX3ZuaWNdW3N2Zl0gPT0gdm5pYykKKwkJCQkJYnJlYWs7CisJCQl9CisJCQl0bDQgKz0gKE1BWF9MTUFDX1BFUl9CR1ggKiBNQVhfUVVFVUVTX1BFUl9RU0VUKTsKKwkJCXRsNCArPSAobG1hYyAqIE1BWF9RVUVVRVNfUEVSX1FTRVQgKiBNQVhfU1FTX1BFUl9WRik7CisJCQl0bDQgKz0gKHN2ZiAqIE1BWF9RVUVVRVNfUEVSX1FTRVQpOwogCQl9Ci0JCXRsNCA9IChNQVhfTE1BQ19QRVJfQkdYICogTklDX1RMNF9QRVJfTE1BQyk7Ci0JCXRsNCArPSAobG1hYyAqIE5JQ19UTDRfUEVSX0xNQUMgKiBNQVhfU1FTX1BFUl9WRik7Ci0JCXRsNCArPSAoc3ZmICogTklDX1RMNF9QRVJfTE1BQyk7Ci0JCXRsNCArPSAoYmd4ICogTklDX1RMNF9QRVJfQkdYKTsKKwl9IGVsc2UgeworCQl0bDQgPSAodm5pYyAqIE1BWF9RVUVVRVNfUEVSX1FTRVQpOwogCX0KIAl0bDQgKz0gc3FfaWR4OwogCi0JdGwzID0gdGw0IC8gKE5JQ19NQVhfVEw0IC8gTklDX01BWF9UTDMpOworCXRsMyA9IHRsNCAvIChody0+dGw0X2NudCAvIGh3LT50bDNfY250KTsKIAluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX1FTRVRfMF8xMjdfU1FfMF83X0NGRzIgfAogCQkgICAgICAoKHU2NCl2bmljIDw8IE5JQ19RU19JRF9TSElGVCkgfAogCQkgICAgICAoKHUzMilzcV9pZHggPDwgTklDX1FfTlVNX1NISUZUKSwgdGw0KTsKQEAgLTUzNCw4ICs2ODUsMTkgQEAKIAkJICAgICAgKCh1NjQpdm5pYyA8PCAyNykgfCAoKHUzMilzcV9pZHggPDwgMjQpIHwgcnJfcXVhbnR1bSk7CiAKIAluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX1RMM18wXzI1NV9DRkcgfCAodGwzIDw8IDMpLCBycl9xdWFudHVtKTsKLQljaGFuID0gKGxtYWMgKiBNQVhfQkdYX0NIQU5TX1BFUl9MTUFDKSArIChiZ3ggKiBOSUNfQ0hBTlNfUEVSX0lORik7Ci0JbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9UTDNfMF8yNTVfQ0hBTiB8ICh0bDMgPDwgMyksIGNoYW4pOworCisJLyogT24gODh4eCAwLTEyNyBjaGFubmVscyBhcmUgZm9yIEJHWDAgYW5kCisJICogMTI3LTI1NSBjaGFubmVscyBmb3IgQkdYMS4KKwkgKgorCSAqIE9uIDgxeHgvODN4eCBUTDNfQ0hBTiByZWcgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgd2l0aCBjaGFubmVsCisJICogd2l0aGluIExNQUMgaS5lIDAtNyBhbmQgbm90IHRoZSBhY3R1YWwgY2hhbm5lbCBudW1iZXIgbGlrZSBvbiA4OHh4CisJICovCisJY2hhbiA9IChsbWFjICogaHctPmNoYW5zX3Blcl9sbWFjKSArIChiZ3ggKiBody0+Y2hhbnNfcGVyX2JneCk7CisJaWYgKGh3LT50bDFfcGVyX2JneCkKKwkJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9UTDNfMF8yNTVfQ0hBTiB8ICh0bDMgPDwgMyksIGNoYW4pOworCWVsc2UKKwkJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9UTDNfMF8yNTVfQ0hBTiB8ICh0bDMgPDwgMyksIDApOworCiAJLyogRW5hYmxlIGJhY2twcmVzc3VyZSBvbiB0aGUgY2hhbm5lbCAqLwogCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfQ0hBTl8wXzI1NV9UWF9DRkcgfCAoY2hhbiA8PCAzKSwgMSk7CiAKQEAgLTU0NCw2ICs3MDYsMTYgQEAKIAluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX1RMMl8wXzYzX0NGRyB8ICh0bDIgPDwgMyksIHJyX3F1YW50dW0pOwogCS8qIE5vIHByaW9yaXRpZXMgYXMgb2Ygbm93ICovCiAJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9UTDJfMF82M19QUkkgfCAodGwyIDw8IDMpLCAweDAwKTsKKworCS8qIFVubGlrZSA4OHh4IHdoZXJlIFRMMnMgMC0zMSB0cmFuc21pdHMgdG8gVEwxICcwJyBhbmQgcmVzdCB0byBUTDEgJzEnCisJICogb24gODF4eC84M3h4IFRMMiBuZWVkcyB0byBiZSBjb25maWd1cmVkIHRvIHRyYW5zbWl0IHRvIG9uZSBvZiB0aGUKKwkgKiBwb3NzaWJsZSBMTUFDcy4KKwkgKgorCSAqIFRoaXMgcmVnaXN0ZXIgZG9lc24ndCBleGlzdCBvbiA4OHh4LgorCSAqLworCWlmICghaHctPnRsMV9wZXJfYmd4KQorCQluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX1RMMl9MTUFDIHwgKHRsMiA8PCAzKSwKKwkJCSAgICAgIGxtYWMgKyAoYmd4ICogTUFYX0xNQUNfUEVSX0JHWCkpOwogfQogCiAvKiBTZW5kIHByaW1hcnkgbmljdmYgcG9pbnRlciB0byBzZWNvbmRhcnkgUVMncyBWRiAqLwpAQCAtNjE1LDcgKzc4Nyw3IEBACiB7CiAJaW50IGJneF9pZHgsIGxtYWNfaWR4OwogCi0JaWYgKGxiay0+dmZfaWQgPiBNQVhfTE1BQykKKwlpZiAobGJrLT52Zl9pZCA+PSBuaWMtPm51bV92Zl9lbikKIAkJcmV0dXJuIC0xOwogCiAJYmd4X2lkeCA9IE5JQ19HRVRfQkdYX0ZST01fVkZfTE1BQ19NQVAobmljLT52Zl9sbWFjX21hcFtsYmstPnZmX2lkXSk7CkBAIC02MjYsNiArNzk4LDY3IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIFJlc2V0IHN0YXRpc3RpY3MgY291bnRlcnMgKi8KK3N0YXRpYyBpbnQgbmljX3Jlc2V0X3N0YXRfY291bnRlcnMoc3RydWN0IG5pY3BmICpuaWMsCisJCQkJICAgaW50IHZmLCBzdHJ1Y3QgcmVzZXRfc3RhdF9jZmcgKmNmZykKK3sKKwlpbnQgaSwgc3RhdCwgcW51bTsKKwl1NjQgcmVnX2FkZHI7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfU1RBVFNfRU5VTV9MQVNUOyBpKyspIHsKKwkJaWYgKGNmZy0+cnhfc3RhdF9tYXNrICYgQklUKGkpKSB7CisJCQlyZWdfYWRkciA9IE5JQ19QRl9WTklDXzBfMTI3X1JYX1NUQVRfMF8xMyB8CisJCQkJICAgKHZmIDw8IE5JQ19RU19JRF9TSElGVCkgfAorCQkJCSAgIChpIDw8IDMpOworCQkJbmljX3JlZ193cml0ZShuaWMsIHJlZ19hZGRyLCAwKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBUWF9TVEFUU19FTlVNX0xBU1Q7IGkrKykgeworCQlpZiAoY2ZnLT50eF9zdGF0X21hc2sgJiBCSVQoaSkpIHsKKwkJCXJlZ19hZGRyID0gTklDX1BGX1ZOSUNfMF8xMjdfVFhfU1RBVF8wXzQgfAorCQkJCSAgICh2ZiA8PCBOSUNfUVNfSURfU0hJRlQpIHwKKwkJCQkgICAoaSA8PCAzKTsKKwkJCW5pY19yZWdfd3JpdGUobmljLCByZWdfYWRkciwgMCk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDw9IDE1OyBpKyspIHsKKwkJcW51bSA9IGkgPj4gMTsKKwkJc3RhdCA9IGkgJiAxID8gMSA6IDA7CisJCXJlZ19hZGRyID0gKHZmIDw8IE5JQ19RU19JRF9TSElGVCkgfAorCQkJICAgKHFudW0gPDwgTklDX1FfTlVNX1NISUZUKSB8IChzdGF0IDw8IDMpOworCQlpZiAoY2ZnLT5ycV9zdGF0X21hc2sgJiBCSVQoaSkpIHsKKwkJCXJlZ19hZGRyIHw9IE5JQ19QRl9RU0VUXzBfMTI3X1JRXzBfN19TVEFUXzBfMTsKKwkJCW5pY19yZWdfd3JpdGUobmljLCByZWdfYWRkciwgMCk7CisJCX0KKwkJaWYgKGNmZy0+c3Ffc3RhdF9tYXNrICYgQklUKGkpKSB7CisJCQlyZWdfYWRkciB8PSBOSUNfUEZfUVNFVF8wXzEyN19TUV8wXzdfU1RBVF8wXzE7CisJCQluaWNfcmVnX3dyaXRlKG5pYywgcmVnX2FkZHIsIDApOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuaWNfZW5hYmxlX3R1bm5lbF9wYXJzaW5nKHN0cnVjdCBuaWNwZiAqbmljLCBpbnQgdmYpCit7CisJdTY0IHByb3RfZGVmID0gKElQVjZfUFJPVCA8PCAzMikgfCAoSVBWNF9QUk9UIDw8IDE2KSB8IEVUX1BST1Q7CisJdTY0IHZ4bGFuX3Byb3RfZGVmID0gKElQVjZfUFJPVF9ERUYgPDwgMzIpIHwKKwkJCSAgICAgIChJUFY0X1BST1RfREVGKSA8PCAxNiB8IEVUX1BST1RfREVGOworCisJLyogQ29uZmlndXJlIHR1bm5lbCBwYXJzaW5nIHBhcmFtZXRlcnMgKi8KKwluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX1JYX0dFTkVWRV9ERUYsCisJCSAgICAgICgxVUxMIDw8IDYzIHwgVURQX0dFTkVWRV9QT1JUX05VTSkpOworCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfUlhfR0VORVZFX1BST1RfREVGLAorCQkgICAgICAoKDdVTEwgPDwgNjEpIHwgcHJvdF9kZWYpKTsKKwluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX1JYX05WR1JFX1BST1RfREVGLAorCQkgICAgICAoKDdVTEwgPDwgNjEpIHwgcHJvdF9kZWYpKTsKKwluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX1JYX1ZYTEFOX0RFRl8wXzEsCisJCSAgICAgICgoMVVMTCA8PCA2MykgfCBVRFBfVlhMQU5fUE9SVF9OVU0pKTsKKwluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX1JYX1ZYTEFOX1BST1RfREVGLAorCQkgICAgICAoKDB4ZlVMTCA8PCA2MCkgfCB2eGxhbl9wcm90X2RlZikpOworfQorCiBzdGF0aWMgdm9pZCBuaWNfZW5hYmxlX3ZmKHN0cnVjdCBuaWNwZiAqbmljLCBpbnQgdmYsIGJvb2wgZW5hYmxlKQogewogCWludCBiZ3gsIGxtYWM7CkBAIC02NjQsMTggKzg5NywxNyBAQAogCQltYnhfYWRkciArPSBzaXplb2YodTY0KTsKIAl9CiAKLQlkZXZfZGJnKCZuaWMtPnBkZXYtPmRldiwgIiVzOiBNYWlsYm94IG1zZyAlZCBmcm9tIFZGJWRcbiIsCisJZGV2X2RiZygmbmljLT5wZGV2LT5kZXYsICIlczogTWFpbGJveCBtc2cgMHglMDJ4IGZyb20gVkYlZFxuIiwKIAkJX19mdW5jX18sIG1ieC5tc2cubXNnLCB2Zik7CiAJc3dpdGNoIChtYngubXNnLm1zZykgewogCWNhc2UgTklDX01CT1hfTVNHX1JFQURZOgogCQluaWNfbWJ4X3NlbmRfcmVhZHkobmljLCB2Zik7Ci0JCWlmICh2ZiA8IE1BWF9MTUFDKSB7CisJCWlmICh2ZiA8IG5pYy0+bnVtX3ZmX2VuKSB7CiAJCQluaWMtPmxpbmtbdmZdID0gMDsKIAkJCW5pYy0+ZHVwbGV4W3ZmXSA9IDA7CiAJCQluaWMtPnNwZWVkW3ZmXSA9IDA7CiAJCX0KLQkJcmV0ID0gMTsKLQkJYnJlYWs7CisJCWdvdG8gdW5sb2NrOwogCWNhc2UgTklDX01CT1hfTVNHX1FTX0NGRzoKIAkJcmVnX2FkZHIgPSBOSUNfUEZfUVNFVF8wXzEyN19DRkcgfAogCQkJICAgKG1ieC5xcy5udW0gPDwgTklDX1FTX0lEX1NISUZUKTsKQEAgLTY5Myw2ICs5MjUsMTUgQEAKIAkJCSAgIChtYngucnEucXNfbnVtIDw8IE5JQ19RU19JRF9TSElGVCkgfAogCQkJICAgKG1ieC5ycS5ycV9udW0gPDwgTklDX1FfTlVNX1NISUZUKTsKIAkJbmljX3JlZ193cml0ZShuaWMsIHJlZ19hZGRyLCBtYngucnEuY2ZnKTsKKwkJLyogRW5hYmxlIENRRV9SWDJfUyBleHRlbnNpb24gaW4gQ1FFX1JYIGRlc2NyaXB0b3IuCisJCSAqIFRoaXMgZ2V0cyBhcHBlbmRlZCBieSBkZWZhdWx0IG9uIDgxeHgvODN4eCBjaGlwcywKKwkJICogZm9yIGNvbnNpc3RlbmN5IGVuYWJsaW5nIHRoZSBzYW1lIG9uIDg4eHggcGFzczIKKwkJICogd2hlcmUgdGhpcyBpcyBpbnRyb2R1Y2VkLgorCQkgKi8KKwkJaWYgKHBhc3MyX3NpbGljb24obmljLT5wZGV2KSkKKwkJCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfUlhfQ0ZHLCAweDAxKTsKKwkJaWYgKCFwYXNzMV9zaWxpY29uKG5pYy0+cGRldikpCisJCQluaWNfZW5hYmxlX3R1bm5lbF9wYXJzaW5nKG5pYywgdmYpOwogCQlicmVhazsKIAljYXNlIE5JQ19NQk9YX01TR19SUV9CUF9DRkc6CiAJCXJlZ19hZGRyID0gTklDX1BGX1FTRVRfMF8xMjdfUlFfMF83X0JQX0NGRyB8CkBAIC03MTcsOCArOTU4LDEwIEBACiAJCW5pY190eF9jaGFubmVsX2NmZyhuaWMsIG1ieC5xcy5udW0sICZtYnguc3EpOwogCQlicmVhazsKIAljYXNlIE5JQ19NQk9YX01TR19TRVRfTUFDOgotCQlpZiAodmYgPj0gbmljLT5udW1fdmZfZW4pCisJCWlmICh2ZiA+PSBuaWMtPm51bV92Zl9lbikgeworCQkJcmV0ID0gLTE7IC8qIE5BQ0sgKi8KIAkJCWJyZWFrOworCQl9CiAJCWxtYWMgPSBtYngubWFjLnZmX2lkOwogCQliZ3ggPSBOSUNfR0VUX0JHWF9GUk9NX1ZGX0xNQUNfTUFQKG5pYy0+dmZfbG1hY19tYXBbbG1hY10pOwogCQlsbWFjID0gTklDX0dFVF9MTUFDX0ZST01fVkZfTE1BQ19NQVAobmljLT52Zl9sbWFjX21hcFtsbWFjXSk7CkBAIC03NjcsMjUgKzEwMTAsMzggQEAKIAljYXNlIE5JQ19NQk9YX01TR19MT09QQkFDSzoKIAkJcmV0ID0gbmljX2NvbmZpZ19sb29wYmFjayhuaWMsICZtYngubGJrKTsKIAkJYnJlYWs7CisJY2FzZSBOSUNfTUJPWF9NU0dfUkVTRVRfU1RBVF9DT1VOVEVSOgorCQlyZXQgPSBuaWNfcmVzZXRfc3RhdF9jb3VudGVycyhuaWMsIHZmLCAmbWJ4LnJlc2V0X3N0YXQpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKCZuaWMtPnBkZXYtPmRldiwKIAkJCSJJbnZhbGlkIG1zZyBmcm9tIFZGJWQsIG1zZyAweCV4XG4iLCB2ZiwgbWJ4Lm1zZy5tc2cpOwogCQlicmVhazsKIAl9CiAKLQlpZiAoIXJldCkKKwlpZiAoIXJldCkgewogCQluaWNfbWJ4X3NlbmRfYWNrKG5pYywgdmYpOwotCWVsc2UgaWYgKG1ieC5tc2cubXNnICE9IE5JQ19NQk9YX01TR19SRUFEWSkKKwl9IGVsc2UgaWYgKG1ieC5tc2cubXNnICE9IE5JQ19NQk9YX01TR19SRUFEWSkgeworCQlkZXZfZXJyKCZuaWMtPnBkZXYtPmRldiwgIk5BQ0sgZm9yIE1CT1ggMHglMDJ4IGZyb20gVkYgJWRcbiIsCisJCQltYngubXNnLm1zZywgdmYpOwogCQluaWNfbWJ4X3NlbmRfbmFjayhuaWMsIHZmKTsKKwl9CiB1bmxvY2s6CiAJbmljLT5tYnhfbG9ja1t2Zl0gPSBmYWxzZTsKIH0KIAotc3RhdGljIHZvaWQgbmljX21ieF9pbnRyX2hhbmRsZXIgKHN0cnVjdCBuaWNwZiAqbmljLCBpbnQgbWJ4KQorc3RhdGljIGlycXJldHVybl90IG5pY19tYnhfaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKm5pY19pcnEpCiB7CisJc3RydWN0IG5pY3BmICpuaWMgPSAoc3RydWN0IG5pY3BmICopbmljX2lycTsKKwlpbnQgbWJ4OwogCXU2NCBpbnRyOwogCXU4ICB2ZiwgdmZfcGVyX21ieF9yZWcgPSA2NDsKIAorCWlmIChpcnEgPT0gbmljLT5tc2l4X2VudHJpZXNbTklDX1BGX0lOVFJfSURfTUJPWDBdLnZlY3RvcikKKwkJbWJ4ID0gMDsKKwllbHNlCisJCW1ieCA9IDE7CisKIAlpbnRyID0gbmljX3JlZ19yZWFkKG5pYywgTklDX1BGX01BSUxCT1hfSU5UICsgKG1ieCA8PCAzKSk7CiAJZGV2X2RiZygmbmljLT5wZGV2LT5kZXYsICJQRiBpbnRlcnJ1cHQgTWJveCVkIDB4JWxseFxuIiwgbWJ4LCBpbnRyKTsKIAlmb3IgKHZmID0gMDsgdmYgPCB2Zl9wZXJfbWJ4X3JlZzsgdmYrKykgewpAQCAtNzk3LDIzICsxMDUzLDYgQEAKIAkJCW5pY19jbGVhcl9tYnhfaW50cihuaWMsIHZmLCBtYngpOwogCQl9CiAJfQotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgbmljX21ieDBfaW50cl9oYW5kbGVyIChpbnQgaXJxLCB2b2lkICpuaWNfaXJxKQotewotCXN0cnVjdCBuaWNwZiAqbmljID0gKHN0cnVjdCBuaWNwZiAqKW5pY19pcnE7Ci0KLQluaWNfbWJ4X2ludHJfaGFuZGxlcihuaWMsIDApOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgbmljX21ieDFfaW50cl9oYW5kbGVyIChpbnQgaXJxLCB2b2lkICpuaWNfaXJxKQotewotCXN0cnVjdCBuaWNwZiAqbmljID0gKHN0cnVjdCBuaWNwZiAqKW5pY19pcnE7Ci0KLQluaWNfbWJ4X2ludHJfaGFuZGxlcihuaWMsIDEpOwotCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC04MjEsNyArMTA2MCwxMyBAQAogewogCWludCBpLCByZXQ7CiAKLQluaWMtPm51bV92ZWMgPSBOSUNfUEZfTVNJWF9WRUNUT1JTOworCW5pYy0+bnVtX3ZlYyA9IHBjaV9tc2l4X3ZlY19jb3VudChuaWMtPnBkZXYpOworCisJbmljLT5tc2l4X2VudHJpZXMgPSBrbWFsbG9jX2FycmF5KG5pYy0+bnVtX3ZlYywKKwkJCQkJICBzaXplb2Yoc3RydWN0IG1zaXhfZW50cnkpLAorCQkJCQkgIEdGUF9LRVJORUwpOworCWlmICghbmljLT5tc2l4X2VudHJpZXMpCisJCXJldHVybiAtRU5PTUVNOwogCiAJZm9yIChpID0gMDsgaSA8IG5pYy0+bnVtX3ZlYzsgaSsrKQogCQluaWMtPm1zaXhfZW50cmllc1tpXS5lbnRyeSA9IGk7CkBAIC04MjksOCArMTA3NCw5IEBACiAJcmV0ID0gcGNpX2VuYWJsZV9tc2l4KG5pYy0+cGRldiwgbmljLT5tc2l4X2VudHJpZXMsIG5pYy0+bnVtX3ZlYyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZuaWMtPnBkZXYtPmRldiwKLQkJCSJSZXF1ZXN0IGZvciAjJWQgbXNpeCB2ZWN0b3JzIGZhaWxlZFxuIiwKLQkJCSAgIG5pYy0+bnVtX3ZlYyk7CisJCQkiUmVxdWVzdCBmb3IgIyVkIG1zaXggdmVjdG9ycyBmYWlsZWQsIHJldHVybmVkICVkXG4iLAorCQkJICAgbmljLT5udW1fdmVjLCByZXQpOworCQlrZnJlZShuaWMtPm1zaXhfZW50cmllcyk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC04NDIsNiArMTA4OCw3IEBACiB7CiAJaWYgKG5pYy0+bXNpeF9lbmFibGVkKSB7CiAJCXBjaV9kaXNhYmxlX21zaXgobmljLT5wZGV2KTsKKwkJa2ZyZWUobmljLT5tc2l4X2VudHJpZXMpOwogCQluaWMtPm1zaXhfZW5hYmxlZCA9IDA7CiAJCW5pYy0+bnVtX3ZlYyA9IDA7CiAJfQpAQCAtODYwLDI3ICsxMTA3LDI2IEBACiAKIHN0YXRpYyBpbnQgbmljX3JlZ2lzdGVyX2ludGVycnVwdHMoc3RydWN0IG5pY3BmICpuaWMpCiB7Ci0JaW50IHJldDsKKwlpbnQgaSwgcmV0OwogCiAJLyogRW5hYmxlIE1TSS1YICovCiAJcmV0ID0gbmljX2VuYWJsZV9tc2l4KG5pYyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCS8qIFJlZ2lzdGVyIG1haWxib3ggaW50ZXJydXB0IGhhbmRsZXJzICovCi0JcmV0ID0gcmVxdWVzdF9pcnEobmljLT5tc2l4X2VudHJpZXNbTklDX1BGX0lOVFJfSURfTUJPWDBdLnZlY3RvciwKLQkJCSAgbmljX21ieDBfaW50cl9oYW5kbGVyLCAwLCAiTklDIE1ib3gwIiwgbmljKTsKLQlpZiAocmV0KQotCQlnb3RvIGZhaWw7CisJLyogUmVnaXN0ZXIgbWFpbGJveCBpbnRlcnJ1cHQgaGFuZGxlciAqLworCWZvciAoaSA9IE5JQ19QRl9JTlRSX0lEX01CT1gwOyBpIDwgbmljLT5udW1fdmVjOyBpKyspIHsKKwkJc3ByaW50ZihuaWMtPmlycV9uYW1lW2ldLAorCQkJIk5JQ1BGIE1ib3glZCIsIChpIC0gTklDX1BGX0lOVFJfSURfTUJPWDApKTsKIAotCW5pYy0+aXJxX2FsbG9jYXRlZFtOSUNfUEZfSU5UUl9JRF9NQk9YMF0gPSB0cnVlOworCQlyZXQgPSByZXF1ZXN0X2lycShuaWMtPm1zaXhfZW50cmllc1tpXS52ZWN0b3IsCisJCQkJICBuaWNfbWJ4X2ludHJfaGFuZGxlciwgMCwKKwkJCQkgIG5pYy0+aXJxX25hbWVbaV0sIG5pYyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGZhaWw7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShuaWMtPm1zaXhfZW50cmllc1tOSUNfUEZfSU5UUl9JRF9NQk9YMV0udmVjdG9yLAotCQkJICBuaWNfbWJ4MV9pbnRyX2hhbmRsZXIsIDAsICJOSUMgTWJveDEiLCBuaWMpOwotCWlmIChyZXQpCi0JCWdvdG8gZmFpbDsKLQotCW5pYy0+aXJxX2FsbG9jYXRlZFtOSUNfUEZfSU5UUl9JRF9NQk9YMV0gPSB0cnVlOworCQluaWMtPmlycV9hbGxvY2F0ZWRbaV0gPSB0cnVlOworCX0KIAogCS8qIEVuYWJsZSBtYWlsYm94IGludGVycnVwdCAqLwogCW5pY19lbmFibGVfbWJ4X2ludHIobmljKTsKQEAgLTg4OSw2ICsxMTM1LDcgQEAKIGZhaWw6CiAJZGV2X2VycigmbmljLT5wZGV2LT5kZXYsICJSZXF1ZXN0IGlycSBmYWlsZWRcbiIpOwogCW5pY19mcmVlX2FsbF9pbnRlcnJ1cHRzKG5pYyk7CisJbmljX2Rpc2FibGVfbXNpeChuaWMpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTkwMyw2ICsxMTUwLDEyIEBACiAJaW50IHBvcywgc3FzX3Blcl92ZiA9IE1BWF9TUVNfUEVSX1ZGX1NJTkdMRV9OT0RFOwogCXUxNiB0b3RhbF92ZjsKIAorCS8qIFNlY29uZGFyeSBRc2V0cyBhcmUgbmVlZGVkIG9ubHkgaWYgQ1BVIGNvdW50IGlzCisJICogbW9yZXRoYW4gTUFYX1FVRVVFU19QRVJfUVNFVC4KKwkgKi8KKwlpZiAobnVtX29ubGluZV9jcHVzKCkgPD0gTUFYX1FVRVVFU19QRVJfUVNFVCkKKwkJcmV0dXJuIDA7CisKIAkvKiBDaGVjayBpZiBpdHMgYSBtdWx0aS1ub2RlIGVudmlyb25tZW50ICovCiAJaWYgKG5yX25vZGVfaWRzID4gMSkKIAkJc3FzX3Blcl92ZiA9IE1BWF9TUVNfUEVSX1ZGOwpAQCAtMTAwOCw2ICsxMjYxLDEyIEBACiAJaWYgKCFuaWMpCiAJCXJldHVybiAtRU5PTUVNOwogCisJbmljLT5odyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgaHdfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghbmljLT5odykgeworCQlkZXZtX2tmcmVlKGRldiwgbmljKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG5pYyk7CiAKIAluaWMtPnBkZXYgPSBwZGV2OwpAQCAtMTA0NywxMyArMTMwNiwxMiBAQAogCiAJbmljLT5ub2RlID0gbmljX2dldF9ub2RlX2lkKHBkZXYpOwogCi0JbmljX3NldF9sbWFjX3ZmX21hcHBpbmcobmljKTsKLQogCS8qIEluaXRpYWxpemUgaGFyZHdhcmUgKi8KLQluaWNfaW5pdF9odyhuaWMpOworCWVyciA9IG5pY19pbml0X2h3KG5pYyk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb25zOwogCi0JLyogU2V0IFJTUyBUQkwgc2l6ZSBmb3IgZWFjaCBWRiAqLwotCW5pYy0+cnNzX2luZF90Ymxfc2l6ZSA9IE5JQ19NQVhfUlNTX0lEUl9UQkxfU0laRTsKKwluaWNfc2V0X2xtYWNfdmZfbWFwcGluZyhuaWMpOwogCiAJLyogUmVnaXN0ZXIgaW50ZXJydXB0cyAqLwogCWVyciA9IG5pY19yZWdpc3Rlcl9pbnRlcnJ1cHRzKG5pYyk7CkBAIC0xMDg2LDYgKzEzNDQsOSBAQAogZXJyX3JlbGVhc2VfcmVnaW9uczoKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogZXJyX2Rpc2FibGVfZGV2aWNlOgorCW5pY19mcmVlX2xtYWNtZW0obmljKTsKKwlkZXZtX2tmcmVlKGRldiwgbmljLT5odyk7CisJZGV2bV9rZnJlZShkZXYsIG5pYyk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAlyZXR1cm4gZXJyOwpAQCAtMTEwNiw2ICsxMzY3LDExIEBACiAKIAluaWNfdW5yZWdpc3Rlcl9pbnRlcnJ1cHRzKG5pYyk7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworCW5pY19mcmVlX2xtYWNtZW0obmljKTsKKwlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIG5pYy0+aHcpOworCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgbmljKTsKKwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWNfcmVnLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWNfcmVnLmgKaW5kZXggYWZiMTBlMy4uZWRmNzc5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljX3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY19yZWcuaApAQCAtMzYsNiArMzYsMjAgQEAKICNkZWZpbmUgICBOSUNfUEZfTUFJTEJPWF9FTkFfVzFDCQkoMHgwNDUwKQogI2RlZmluZSAgIE5JQ19QRl9NQUlMQk9YX0VOQV9XMVMJCSgweDA0NzApCiAjZGVmaW5lICAgTklDX1BGX1JYX0VUWVBFXzBfNwkJCSgweDA1MDApCisjZGVmaW5lICAgTklDX1BGX1JYX0dFTkVWRV9ERUYJCQkoMHgwNTgwKQorI2RlZmluZSAgICBVRFBfR0VORVZFX1BPUlRfTlVNCQkJCTB4MTdDMVVMTAorI2RlZmluZSAgIE5JQ19QRl9SWF9HRU5FVkVfUFJPVF9ERUYJCSgweDA1ODgpCisjZGVmaW5lICAgIElQVjZfUFJPVAkJCQkJMHg4NkREVUxMCisjZGVmaW5lICAgIElQVjRfUFJPVAkJCQkJMHg4MDBVTEwKKyNkZWZpbmUgICAgRVRfUFJPVAkJCQkJMHg2NTU4VUxMCisjZGVmaW5lICAgTklDX1BGX1JYX05WR1JFX1BST1RfREVGCQkoMHgwNTk4KQorI2RlZmluZSAgIE5JQ19QRl9SWF9WWExBTl9ERUZfMF8xCQkoMHgwNUEwKQorI2RlZmluZSAgICBVRFBfVlhMQU5fUE9SVF9OVU0JCQkJMHgxMkI1CisjZGVmaW5lICAgTklDX1BGX1JYX1ZYTEFOX1BST1RfREVGCQkoMHgwNUIwKQorI2RlZmluZSAgICBJUFY2X1BST1RfREVGCQkJCTB4MlVMTAorI2RlZmluZSAgICBJUFY0X1BST1RfREVGCQkJCTB4MVVMTAorI2RlZmluZSAgICBFVF9QUk9UX0RFRgkJCQkJMHgzVUxMCisjZGVmaW5lICAgTklDX1BGX1JYX0NGRwkJCQkoMHgwNUQwKQogI2RlZmluZSAgIE5JQ19QRl9QS0lORF8wXzE1X0NGRwkJCSgweDA2MDApCiAjZGVmaW5lICAgTklDX1BGX0VDQzBfRkxJUDAJCQkoMHgxMDAwKQogI2RlZmluZSAgIE5JQ19QRl9FQ0MxX0ZMSVAwCQkJKDB4MTAwOCkKQEAgLTEwMyw2ICsxMTcsNyBAQAogI2RlZmluZSAgIE5JQ19QRl9TV19TWU5DX1JYX0RPTkUJCSgweDQ5MDAwOCkKICNkZWZpbmUgICBOSUNfUEZfVEwyXzBfNjNfQ0ZHCQkJKDB4NTAwMDAwKQogI2RlZmluZSAgIE5JQ19QRl9UTDJfMF82M19QUkkJCQkoMHg1MjAwMDApCisjZGVmaW5lICAgTklDX1BGX1RMMl9MTUFDCQkJKDB4NTQwMDAwKQogI2RlZmluZSAgIE5JQ19QRl9UTDJfMF82M19TSF9TVEFUVVMJCSgweDU4MDAwMCkKICNkZWZpbmUgICBOSUNfUEZfVEwzQV8wXzYzX0NGRwkJCSgweDVGMDAwMCkKICNkZWZpbmUgICBOSUNfUEZfVEwzXzBfMjU1X0NGRwkJCSgweDYwMDAwMCkKQEAgLTE3MCw3ICsxODUsNiBAQAogI2RlZmluZSAgIE5JQ19RU0VUX1NRXzBfN19ET09SCQkJKDB4MDEwODM4KQogI2RlZmluZSAgIE5JQ19RU0VUX1NRXzBfN19TVEFUVVMJCSgweDAxMDg0MCkKICNkZWZpbmUgICBOSUNfUVNFVF9TUV8wXzdfREVCVUcJCQkoMHgwMTA4NDgpCi0jZGVmaW5lICAgTklDX1FTRVRfU1FfMF83X0NOTV9DSEcJCSgweDAxMDg2MCkKICNkZWZpbmUgICBOSUNfUVNFVF9TUV8wXzdfU1RBVF8wXzEJCSgweDAxMDkwMCkKIAogI2RlZmluZSAgIE5JQ19RU0VUX1JCRFJfMF8xX0NGRwkJCSgweDAxMEMwMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY3ZmX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY3ZmX2V0aHRvb2wuYwppbmRleCBkMmQ4ZWYyLi5hZDRmZGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWN2Zl9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljdmZfZXRodG9vbC5jCkBAIC0zODIsNyArMzgyLDEwIEBACiAJCXBbaSsrXSA9IG5pY3ZmX3F1ZXVlX3JlZ19yZWFkKG5pYywgTklDX1FTRVRfU1FfMF83X0RPT1IsIHEpOwogCQlwW2krK10gPSBuaWN2Zl9xdWV1ZV9yZWdfcmVhZChuaWMsIE5JQ19RU0VUX1NRXzBfN19TVEFUVVMsIHEpOwogCQlwW2krK10gPSBuaWN2Zl9xdWV1ZV9yZWdfcmVhZChuaWMsIE5JQ19RU0VUX1NRXzBfN19ERUJVRywgcSk7Ci0JCXBbaSsrXSA9IG5pY3ZmX3F1ZXVlX3JlZ19yZWFkKG5pYywgTklDX1FTRVRfU1FfMF83X0NOTV9DSEcsIHEpOworCQkvKiBQYWRkaW5nLCB3YXMgTklDX1FTRVRfU1FfMF83X0NOTV9DSEcsIHdoaWNoCisJCSAqIHByb2R1Y2VzIGJ1cyBlcnJvcnMgd2hlbiByZWFkCisJCSAqLworCQlwW2krK10gPSAwOwogCQlwW2krK10gPSBuaWN2Zl9xdWV1ZV9yZWdfcmVhZChuaWMsIE5JQ19RU0VUX1NRXzBfN19TVEFUXzBfMSwgcSk7CiAJCXJlZ19vZmZzZXQgPSBOSUNfUVNFVF9TUV8wXzdfU1RBVF8wXzEgfCAoMSA8PCAzKTsKIAkJcFtpKytdID0gbmljdmZfcXVldWVfcmVnX3JlYWQobmljLCByZWdfb2Zmc2V0LCBxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY3ZmX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY3ZmX21haW4uYwppbmRleCBhMTllNzNmLi40NWExM2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWN2Zl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljdmZfbWFpbi5jCkBAIC0yOSwxMCArMjksMjAgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBuaWN2Zl9pZF90YWJsZVtdID0gewogCXsgUENJX0RFVklDRV9TVUIoUENJX1ZFTkRPUl9JRF9DQVZJVU0sCiAJCQkgUENJX0RFVklDRV9JRF9USFVOREVSX05JQ19WRiwKLQkJCSBQQ0lfVkVORE9SX0lEX0NBVklVTSwgMHhBMTM0KSB9LAorCQkJIFBDSV9WRU5ET1JfSURfQ0FWSVVNLAorCQkJIFBDSV9TVUJTWVNfREVWSURfODhYWF9OSUNfVkYpIH0sCiAJeyBQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0NBVklVTSwKIAkJCSBQQ0lfREVWSUNFX0lEX1RIVU5ERVJfUEFTUzFfTklDX1ZGLAotCQkJIFBDSV9WRU5ET1JfSURfQ0FWSVVNLCAweEExMUUpIH0sCisJCQkgUENJX1ZFTkRPUl9JRF9DQVZJVU0sCisJCQkgUENJX1NVQlNZU19ERVZJRF84OFhYX1BBU1MxX05JQ19WRikgfSwKKwl7IFBDSV9ERVZJQ0VfU1VCKFBDSV9WRU5ET1JfSURfQ0FWSVVNLAorCQkJIFBDSV9ERVZJQ0VfSURfVEhVTkRFUl9OSUNfVkYsCisJCQkgUENJX1ZFTkRPUl9JRF9DQVZJVU0sCisJCQkgUENJX1NVQlNZU19ERVZJRF84MVhYX05JQ19WRikgfSwKKwl7IFBDSV9ERVZJQ0VfU1VCKFBDSV9WRU5ET1JfSURfQ0FWSVVNLAorCQkJIFBDSV9ERVZJQ0VfSURfVEhVTkRFUl9OSUNfVkYsCisJCQkgUENJX1ZFTkRPUl9JRF9DQVZJVU0sCisJCQkgUENJX1NVQlNZU19ERVZJRF84M1hYX05JQ19WRikgfSwKIAl7IDAsIH0gIC8qIGVuZCBvZiB0YWJsZSAqLwogfTsKIApAQCAtMTM0LDE1ICsxNDQsMTkgQEAKIAogCS8qIFdhaXQgZm9yIHByZXZpb3VzIG1lc3NhZ2UgdG8gYmUgYWNrZWQsIHRpbWVvdXQgMnNlYyAqLwogCXdoaWxlICghbmljLT5wZl9hY2tlZCkgewotCQlpZiAobmljLT5wZl9uYWNrZWQpCisJCWlmIChuaWMtPnBmX25hY2tlZCkgeworCQkJbmV0ZGV2X2VycihuaWMtPm5ldGRldiwKKwkJCQkgICAiUEYgTkFDSyB0byBtYm94IG1zZyAweCUwMnggZnJvbSBWRiVkXG4iLAorCQkJCSAgIChtYngtPm1zZy5tc2cgJiAweEZGKSwgbmljLT52Zl9pZCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCQltc2xlZXAoc2xlZXApOwogCQlpZiAobmljLT5wZl9hY2tlZCkKIAkJCWJyZWFrOwogCQl0aW1lb3V0IC09IHNsZWVwOwogCQlpZiAoIXRpbWVvdXQpIHsKIAkJCW5ldGRldl9lcnIobmljLT5uZXRkZXYsCi0JCQkJICAgIlBGIGRpZG4ndCBhY2sgdG8gbWJveCBtc2cgJWQgZnJvbSBWRiVkXG4iLAorCQkJCSAgICJQRiBkaWRuJ3QgQUNLIHRvIG1ib3ggbXNnIDB4JTAyeCBmcm9tIFZGJWRcbiIsCiAJCQkJICAgKG1ieC0+bXNnLm1zZyAmIDB4RkYpLCBuaWMtPnZmX2lkKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KQEAgLTM1MiwxMyArMzY2LDcgQEAKIAogCXJzcy0+ZW5hYmxlID0gdHJ1ZTsKIAotCS8qIFVzaW5nIHRoZSBIVyByZXNldCB2YWx1ZSBmb3Igbm93ICovCi0JcnNzLT5rZXlbMF0gPSAweEZFRUQwQkFERkVFRDBCQURVTEw7Ci0JcnNzLT5rZXlbMV0gPSAweEZFRUQwQkFERkVFRDBCQURVTEw7Ci0JcnNzLT5rZXlbMl0gPSAweEZFRUQwQkFERkVFRDBCQURVTEw7Ci0JcnNzLT5rZXlbM10gPSAweEZFRUQwQkFERkVFRDBCQURVTEw7Ci0JcnNzLT5rZXlbNF0gPSAweEZFRUQwQkFERkVFRDBCQURVTEw7Ci0KKwluZXRkZXZfcnNzX2tleV9maWxsKHJzcy0+a2V5LCBSU1NfSEFTSF9LRVlfU0laRSAqIHNpemVvZih1NjQpKTsKIAluaWN2Zl9zZXRfcnNzX2tleShuaWMpOwogCiAJcnNzLT5jZmcgPSBSU1NfSVBfSEFTSF9FTkEgfCBSU1NfVENQX0hBU0hfRU5BIHwgUlNTX1VEUF9IQVNIX0VOQTsKQEAgLTUwNywxMiArNTE1LDE1IEBACiAKIHN0YXRpYyB2b2lkIG5pY3ZmX3NuZF9wa3RfaGFuZGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkJCSAgc3RydWN0IGNtcF9xdWV1ZSAqY3EsCi0JCQkJICBzdHJ1Y3QgY3FlX3NlbmRfdCAqY3FlX3R4LCBpbnQgY3FlX3R5cGUpCisJCQkJICBzdHJ1Y3QgY3FlX3NlbmRfdCAqY3FlX3R4LAorCQkJCSAgaW50IGNxZV90eXBlLCBpbnQgYnVkZ2V0LAorCQkJCSAgdW5zaWduZWQgaW50ICp0eF9wa3RzLCB1bnNpZ25lZCBpbnQgKnR4X2J5dGVzKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCXN0cnVjdCBuaWN2ZiAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3Qgc25kX3F1ZXVlICpzcTsKIAlzdHJ1Y3Qgc3FfaGRyX3N1YmRlc2MgKmhkcjsKKwlzdHJ1Y3Qgc3FfaGRyX3N1YmRlc2MgKnRzb19zcWU7CiAKIAlzcSA9ICZuaWMtPnFzLT5zcVtjcWVfdHgtPnNxX2lkeF07CiAKQEAgLTUyNywxNyArNTM4LDIzIEBACiAKIAluaWN2Zl9jaGVja19jcWVfdHhfZXJycyhuaWMsIGNxLCBjcWVfdHgpOwogCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKXNxLT5za2J1ZmZbY3FlX3R4LT5zcWVfcHRyXTsKLQkvKiBGb3IgVFNPIG9mZmxvYWRlZCBwYWNrZXRzIG9ubHkgb25lIFNRRSB3aWxsIGhhdmUgYSB2YWxpZCBTS0IgKi8KIAlpZiAoc2tiKSB7CisJCS8qIENoZWNrIGZvciBkdW1teSBkZXNjcmlwdG9yIHVzZWQgZm9yIEhXIFRTTyBvZmZsb2FkIG9uIDg4eHggKi8KKwkJaWYgKGhkci0+ZG9udF9zZW5kKSB7CisJCQkvKiBHZXQgYWN0dWFsIFRTTyBkZXNjcmlwdG9ycyBhbmQgZnJlZSB0aGVtICovCisJCQl0c29fc3FlID0KKwkJCSAoc3RydWN0IHNxX2hkcl9zdWJkZXNjICopR0VUX1NRX0RFU0Moc3EsIGhkci0+cnN2ZDIpOworCQkJbmljdmZfcHV0X3NxX2Rlc2Moc3EsIHRzb19zcWUtPnN1YmRlc2NfY250ICsgMSk7CisJCX0KIAkJbmljdmZfcHV0X3NxX2Rlc2Moc3EsIGhkci0+c3ViZGVzY19jbnQgKyAxKTsKIAkJcHJlZmV0Y2goc2tiKTsKLQkJZGV2X2NvbnN1bWVfc2tiX2FueShza2IpOworCQkoKnR4X3BrdHMpKys7CisJCSp0eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJbmFwaV9jb25zdW1lX3NrYihza2IsIGJ1ZGdldCk7CiAJCXNxLT5za2J1ZmZbY3FlX3R4LT5zcWVfcHRyXSA9ICh1NjQpTlVMTDsKIAl9IGVsc2UgewotCQkvKiBJbiBjYXNlIG9mIEhXIFRTTywgSFcgc2VuZHMgYSBDUUUgZm9yIGVhY2ggc2VnbWVudCBvZiBhIFRTTwotCQkgKiBwYWNrZXQgaW5zdGVhZCBvZiBhIHNpbmdsZSBDUUUgZm9yIHRoZSB3aG9sZSBUU08gcGFja2V0Ci0JCSAqIHRyYW5zbWl0dGVkLiBFYWNoIG9mIHRoaXMgQ1FFIHBvaW50cyB0byB0aGUgc2FtZSBTUUUsIHNvCi0JCSAqIGF2b2lkIGZyZWVpbmcgc2FtZSBTUUUgbXVsdGlwbGUgdGltZXMuCisJCS8qIEluIGNhc2Ugb2YgU1cgVFNPIG9uIDg4eHgsIG9ubHkgbGFzdCBzZWdtZW50IHdpbGwgaGF2ZQorCQkgKiBhIFNLQiBhdHRhY2hlZCwgc28ganVzdCBmcmVlIFNRRXMgaGVyZS4KIAkJICovCiAJCWlmICghbmljLT5od190c28pCiAJCQluaWN2Zl9wdXRfc3FfZGVzYyhzcSwgaGRyLT5zdWJkZXNjX2NudCArIDEpOwpAQCAtNjQ4LDYgKzY2NSw3IEBACiAJc3RydWN0IGNtcF9xdWV1ZSAqY3EgPSAmcXMtPmNxW2NxX2lkeF07CiAJc3RydWN0IGNxZV9yeF90ICpjcV9kZXNjOwogCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKKwl1bnNpZ25lZCBpbnQgdHhfcGt0cyA9IDAsIHR4X2J5dGVzID0gMDsKIAogCXNwaW5fbG9ja19iaCgmY3EtPmxvY2spOwogbG9vcDoKQEAgLTY4Niw3ICs3MDQsOCBAQAogCQlicmVhazsKIAkJY2FzZSBDUUVfVFlQRV9TRU5EOgogCQkJbmljdmZfc25kX3BrdF9oYW5kbGVyKG5ldGRldiwgY3EsCi0JCQkJCSAgICAgICh2b2lkICopY3FfZGVzYywgQ1FFX1RZUEVfU0VORCk7CisJCQkJCSAgICAgICh2b2lkICopY3FfZGVzYywgQ1FFX1RZUEVfU0VORCwKKwkJCQkJICAgICAgYnVkZ2V0LCAmdHhfcGt0cywgJnR4X2J5dGVzKTsKIAkJCXR4X2RvbmUrKzsKIAkJYnJlYWs7CiAJCWNhc2UgQ1FFX1RZUEVfSU5WQUxJRDoKQEAgLTcxNSw2ICs3MzQsOSBAQAogCQluZXRkZXYgPSBuaWMtPnBuaWN2Zi0+bmV0ZGV2OwogCQl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKG5ldGRldiwKIAkJCQkJICBuaWN2Zl9uZXRkZXZfcWlkeChuaWMsIGNxX2lkeCkpOworCQlpZiAodHhfcGt0cykKKwkJCW5ldGRldl90eF9jb21wbGV0ZWRfcXVldWUodHhxLCB0eF9wa3RzLCB0eF9ieXRlcyk7CisKIAkJbmljID0gbmljLT5wbmljdmY7CiAJCWlmIChuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKHR4cSkgJiYgbmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CiAJCQluZXRpZl90eF9zdGFydF9xdWV1ZSh0eHEpOwpAQCAtOTI4LDE2ICs5NTAsMTkgQEAKIAlpbnQgdmVjdG9yOwogCiAJZm9yX2VhY2hfY3FfaXJxKGlycSkKLQkJc3ByaW50ZihuaWMtPmlycV9uYW1lW2lycV0sICJOSUNWRiVkIENRJWQiLAotCQkJbmljLT52Zl9pZCwgaXJxKTsKKwkJc3ByaW50ZihuaWMtPmlycV9uYW1lW2lycV0sICIlcy1yeHR4LSVkIiwKKwkJCW5pYy0+cG5pY3ZmLT5uZXRkZXYtPm5hbWUsCisJCQluaWN2Zl9uZXRkZXZfcWlkeChuaWMsIGlycSkpOwogCiAJZm9yX2VhY2hfc3FfaXJxKGlycSkKLQkJc3ByaW50ZihuaWMtPmlycV9uYW1lW2lycV0sICJOSUNWRiVkIFNRJWQiLAotCQkJbmljLT52Zl9pZCwgaXJxIC0gTklDVkZfSU5UUl9JRF9TUSk7CisJCXNwcmludGYobmljLT5pcnFfbmFtZVtpcnFdLCAiJXMtc3EtJWQiLAorCQkJbmljLT5wbmljdmYtPm5ldGRldi0+bmFtZSwKKwkJCW5pY3ZmX25ldGRldl9xaWR4KG5pYywgaXJxIC0gTklDVkZfSU5UUl9JRF9TUSkpOwogCiAJZm9yX2VhY2hfcmJkcl9pcnEoaXJxKQotCQlzcHJpbnRmKG5pYy0+aXJxX25hbWVbaXJxXSwgIk5JQ1ZGJWQgUkJEUiVkIiwKLQkJCW5pYy0+dmZfaWQsIGlycSAtIE5JQ1ZGX0lOVFJfSURfUkJEUik7CisJCXNwcmludGYobmljLT5pcnFfbmFtZVtpcnFdLCAiJXMtcmJkci0lZCIsCisJCQluaWMtPnBuaWN2Zi0+bmV0ZGV2LT5uYW1lLAorCQkJbmljLT5zcXNfbW9kZSA/IChuaWMtPnNxc19pZCArIDEpIDogMCk7CiAKIAkvKiBSZWdpc3RlciBDUSBpbnRlcnJ1cHRzICovCiAJZm9yIChpcnEgPSAwOyBpcnEgPCBuaWMtPnFzLT5jcV9jbnQ7IGlycSsrKSB7CkBAIC05NjEsOCArOTg2LDkgQEAKIAl9CiAKIAkvKiBSZWdpc3RlciBRUyBlcnJvciBpbnRlcnJ1cHQgKi8KLQlzcHJpbnRmKG5pYy0+aXJxX25hbWVbTklDVkZfSU5UUl9JRF9RU19FUlJdLAotCQkiTklDVkYlZCBRc2V0IGVycm9yIiwgbmljLT52Zl9pZCk7CisJc3ByaW50ZihuaWMtPmlycV9uYW1lW05JQ1ZGX0lOVFJfSURfUVNfRVJSXSwgIiVzLXFzZXQtZXJyLSVkIiwKKwkJbmljLT5wbmljdmYtPm5ldGRldi0+bmFtZSwKKwkJbmljLT5zcXNfbW9kZSA/IChuaWMtPnNxc19pZCArIDEpIDogMCk7CiAJaXJxID0gTklDVkZfSU5UUl9JRF9RU19FUlI7CiAJcmV0ID0gcmVxdWVzdF9pcnEobmljLT5tc2l4X2VudHJpZXNbaXJxXS52ZWN0b3IsCiAJCQkgIG5pY3ZmX3FzX2Vycl9pbnRyX2hhbmRsZXIsCkBAIC0xMTQxLDYgKzExNjcsOSBAQAogCiAJbmV0aWZfdHhfZGlzYWJsZShuZXRkZXYpOwogCisJZm9yIChxaWR4ID0gMDsgcWlkeCA8IG5ldGRldi0+bnVtX3R4X3F1ZXVlczsgcWlkeCsrKQorCQluZXRkZXZfdHhfcmVzZXRfcXVldWUobmV0ZGV2X2dldF90eF9xdWV1ZShuZXRkZXYsIHFpZHgpKTsKKwogCS8qIEZyZWUgcmVzb3VyY2VzICovCiAJbmljdmZfY29uZmlnX2RhdGFfdHJhbnNmZXIobmljLCBmYWxzZSk7CiAKQEAgLTExOTEsNyArMTIyMCw3IEBACiAJfQogCiAJLyogQ2hlY2sgaWYgd2UgZ290IE1BQyBhZGRyZXNzIGZyb20gUEYgb3IgZWxzZSBnZW5lcmF0ZSBhIHJhZG9tIE1BQyAqLwotCWlmIChpc196ZXJvX2V0aGVyX2FkZHIobmV0ZGV2LT5kZXZfYWRkcikpIHsKKwlpZiAoIW5pYy0+c3FzX21vZGUgJiYgaXNfemVyb19ldGhlcl9hZGRyKG5ldGRldi0+ZGV2X2FkZHIpKSB7CiAJCWV0aF9od19hZGRyX3JhbmRvbShuZXRkZXYpOwogCQluaWN2Zl9od19zZXRfbWFjX2FkZHIobmljLCBuZXRkZXYpOwogCX0KQEAgLTE1MDIsNiArMTUzMSw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAlzdHJ1Y3QgbmljdmYgKm5pYzsKIAlpbnQgICAgZXJyLCBxY291bnQ7CisJdTE2ICAgIHNkZXZpZDsKIAogCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChlcnIpIHsKQEAgLTE1MjcsMTQgKzE1NTcsMTMgQEAKIAkJZ290byBlcnJfcmVsZWFzZV9yZWdpb25zOwogCX0KIAotCXFjb3VudCA9IE1BWF9DTVBfUVVFVUVTX1BFUl9RUzsKKwlxY291bnQgPSBuZXRpZl9nZXRfbnVtX2RlZmF1bHRfcnNzX3F1ZXVlcygpOwogCiAJLyogUmVzdHJpY3QgbXVsdGlxc2V0IHN1cHBvcnQgb25seSBmb3IgaG9zdCBib3VuZCBWRnMgKi8KIAlpZiAocGRldi0+aXNfdmlydGZuKSB7CiAJCS8qIFNldCBtYXggbnVtYmVyIG9mIHF1ZXVlcyBwZXIgVkYgKi8KLQkJcWNvdW50ID0gcm91bmR1cChudW1fb25saW5lX2NwdXMoKSwgTUFYX0NNUF9RVUVVRVNfUEVSX1FTKTsKLQkJcWNvdW50ID0gbWluKHFjb3VudCwKLQkJCSAgICAgKE1BWF9TUVNfUEVSX1ZGICsgMSkgKiBNQVhfQ01QX1FVRVVFU19QRVJfUVMpOworCQlxY291bnQgPSBtaW5fdChpbnQsIG51bV9vbmxpbmVfY3B1cygpLAorCQkJICAgICAgIChNQVhfU1FTX1BFUl9WRiArIDEpICogTUFYX0NNUF9RVUVVRVNfUEVSX1FTKTsKIAl9CiAKIAluZXRkZXYgPSBhbGxvY19ldGhlcmRldl9tcXMoc2l6ZW9mKHN0cnVjdCBuaWN2ZiksIHFjb3VudCwgcWNvdW50KTsKQEAgLTE1NzUsNiArMTYwNCwxMCBAQAogCWlmICghcGFzczFfc2lsaWNvbihuaWMtPnBkZXYpKQogCQluaWMtPmh3X3RzbyA9IHRydWU7CiAKKwlwY2lfcmVhZF9jb25maWdfd29yZChuaWMtPnBkZXYsIFBDSV9TVUJTWVNURU1fSUQsICZzZGV2aWQpOworCWlmIChzZGV2aWQgPT0gMHhBMTM0KQorCQluaWMtPnQ4OCA9IHRydWU7CisKIAkvKiBDaGVjayBpZiB0aGlzIFZGIGlzIGluIFFTIG9ubHkgbW9kZSAqLwogCWlmIChuaWMtPnNxc19tb2RlKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY3ZmX3F1ZXVlcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljdmZfcXVldWVzLmMKaW5kZXggMGZmOGU2MC4uYTRmYzUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljdmZfcXVldWVzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljdmZfcXVldWVzLmMKQEAgLTQ3OSw2ICs0NzksMTYgQEAKIAkJCQkJICAgICAgTklDX1FTRVRfUlFfR0VOX0NGRywgMCwgcnFfY2ZnKTsKIH0KIAorc3RhdGljIHZvaWQgbmljdmZfcmVzZXRfcmN2X3F1ZXVlX3N0YXRzKHN0cnVjdCBuaWN2ZiAqbmljKQoreworCXVuaW9uIG5pY19tYnggbWJ4ID0ge307CisKKwkvKiBSZXNldCBhbGwgUlhRJ3Mgc3RhdHMgKi8KKwltYngucmVzZXRfc3RhdC5tc2cgPSBOSUNfTUJPWF9NU0dfUkVTRVRfU1RBVF9DT1VOVEVSOworCW1ieC5yZXNldF9zdGF0LnJxX3N0YXRfbWFzayA9IDB4RkZGRjsKKwluaWN2Zl9zZW5kX21zZ190b19wZihuaWMsICZtYngpOworfQorCiAvKiBDb25maWd1cmVzIHJlY2VpdmUgcXVldWUgKi8KIHN0YXRpYyB2b2lkIG5pY3ZmX3Jjdl9xdWV1ZV9jb25maWcoc3RydWN0IG5pY3ZmICpuaWMsIHN0cnVjdCBxdWV1ZV9zZXQgKnFzLAogCQkJCSAgIGludCBxaWR4LCBib29sIGVuYWJsZSkKQEAgLTc2MiwxMCArNzcyLDEwIEBACiAJbmljLT5xcyA9IHFzOwogCiAJLyogU2V0IGNvdW50IG9mIGVhY2ggcXVldWUgKi8KLQlxcy0+cmJkcl9jbnQgPSBSQkRSX0NOVDsKLQlxcy0+cnFfY250ID0gUkNWX1FVRVVFX0NOVDsKLQlxcy0+c3FfY250ID0gU05EX1FVRVVFX0NOVDsKLQlxcy0+Y3FfY250ID0gQ01QX1FVRVVFX0NOVDsKKwlxcy0+cmJkcl9jbnQgPSBERUZBVUxUX1JCRFJfQ05UOworCXFzLT5ycV9jbnQgPSBtaW5fdCh1OCwgTUFYX1JDVl9RVUVVRVNfUEVSX1FTLCBudW1fb25saW5lX2NwdXMoKSk7CisJcXMtPnNxX2NudCA9IG1pbl90KHU4LCBNQVhfU05EX1FVRVVFU19QRVJfUVMsIG51bV9vbmxpbmVfY3B1cygpKTsKKwlxcy0+Y3FfY250ID0gbWF4X3QodTgsIHFzLT5ycV9jbnQsIHFzLT5zcV9jbnQpOwogCiAJLyogU2V0IHF1ZXVlIGxlbmd0aHMgKi8KIAlxcy0+cmJkcl9sZW4gPSBSQ1ZfQlVGX0NPVU5UOwpAQCAtODEyLDYgKzgyMiwxMSBAQAogCQluaWN2Zl9mcmVlX3Jlc291cmNlcyhuaWMpOwogCX0KIAorCS8qIFJlc2V0IFJYUSdzIHN0YXRzLgorCSAqIFNRJ3Mgc3RhdHMgd2lsbCBnZXQgcmVzZXQgYXV0b21hdGljYWxseSBvbmNlIFNRIGlzIHJlc2V0LgorCSAqLworCW5pY3ZmX3Jlc2V0X3Jjdl9xdWV1ZV9zdGF0cyhuaWMpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkzOCw2ICs5NTMsOCBAQAogCXJldHVybiBudW1fZWRlc2NzICsgc2gtPmdzb19zZWdzOwogfQogCisjZGVmaW5lIFBPU1RfQ1FFX0RFU0NfQ09VTlQgMgorCiAvKiBHZXQgdGhlIG51bWJlciBvZiBTUSBkZXNjcmlwdG9ycyBuZWVkZWQgdG8geG1pdCB0aGlzIHNrYiAqLwogc3RhdGljIGludCBuaWN2Zl9zcV9zdWJkZXNjX3JlcXVpcmVkKHN0cnVjdCBuaWN2ZiAqbmljLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtOTQ4LDYgKzk2NSwxMCBAQAogCQlyZXR1cm4gc3ViZGVzY19jbnQ7CiAJfQogCisJLyogRHVtbXkgZGVzY3JpcHRvcnMgdG8gZ2V0IFRTTyBwa3QgY29tcGxldGlvbiBub3RpZmljYXRpb24gKi8KKwlpZiAobmljLT50ODggJiYgbmljLT5od190c28gJiYgc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkKKwkJc3ViZGVzY19jbnQgKz0gUE9TVF9DUUVfREVTQ19DT1VOVDsKKwogCWlmIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKQogCQlzdWJkZXNjX2NudCArPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOwogCkBAIC05NjUsMTQgKzk4NiwyMSBAQAogCXN0cnVjdCBzcV9oZHJfc3ViZGVzYyAqaGRyOwogCiAJaGRyID0gKHN0cnVjdCBzcV9oZHJfc3ViZGVzYyAqKUdFVF9TUV9ERVNDKHNxLCBxZW50cnkpOwotCXNxLT5za2J1ZmZbcWVudHJ5XSA9ICh1NjQpc2tiOwotCiAJbWVtc2V0KGhkciwgMCwgU05EX1FVRVVFX0RFU0NfU0laRSk7CiAJaGRyLT5zdWJkZXNjX3R5cGUgPSBTUV9ERVNDX1RZUEVfSEVBREVSOwotCS8qIEVuYWJsZSBub3RpZmljYXRpb24gdmlhIENRRSBhZnRlciBwcm9jZXNzaW5nIFNRRSAqLwotCWhkci0+cG9zdF9jcWUgPSAxOwotCS8qIE5vIG9mIHN1YmRlc2NyaXB0b3JzIGZvbGxvd2luZyB0aGlzICovCi0JaGRyLT5zdWJkZXNjX2NudCA9IHN1YmRlc2NfY250OworCisJaWYgKG5pYy0+dDg4ICYmIG5pYy0+aHdfdHNvICYmIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpIHsKKwkJLyogcG9zdF9jcWUgPSAwLCB0byBhdm9pZCBIVyBwb3N0aW5nIGEgQ1FFIGZvciBldmVyeSBUU08KKwkJICogc2VnbWVudCB0cmFuc21pdHRlZCBvbiA4OHh4LgorCQkgKi8KKwkJaGRyLT5zdWJkZXNjX2NudCA9IHN1YmRlc2NfY250IC0gUE9TVF9DUUVfREVTQ19DT1VOVDsKKwl9IGVsc2UgeworCQlzcS0+c2tidWZmW3FlbnRyeV0gPSAodTY0KXNrYjsKKwkJLyogRW5hYmxlIG5vdGlmaWNhdGlvbiB2aWEgQ1FFIGFmdGVyIHByb2Nlc3NpbmcgU1FFICovCisJCWhkci0+cG9zdF9jcWUgPSAxOworCQkvKiBObyBvZiBzdWJkZXNjcmlwdG9ycyBmb2xsb3dpbmcgdGhpcyAqLworCQloZHItPnN1YmRlc2NfY250ID0gc3ViZGVzY19jbnQ7CisJfQogCWhkci0+dG90X2xlbiA9IGxlbjsKIAogCS8qIE9mZmxvYWQgY2hlY2tzdW0gY2FsY3VsYXRpb24gdG8gSFcgKi8KQEAgLTEwMjMsNiArMTA1MSw1NSBAQAogCWdhdGhlci0+YWRkciA9IGRhdGE7CiB9CiAKKy8qIEFkZCBIRFIgKyBJTU1FRElBVEUgc3ViZGVzY3JpcHRvcnMgcmlnaHQgYWZ0ZXIgZGVzY3JpcHRvcnMgb2YgYSBUU08KKyAqIHBhY2tldCBzbyB0aGF0IGEgQ1FFIGlzIHBvc3RlZCBhcyBhIG5vdGlmYXRpb24gZm9yIHRyYW5zbWlzc2lvbiBvZgorICogVFNPIHBhY2tldC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG5pY3ZmX3NxX2FkZF9jcWVfc3ViZGVzYyhzdHJ1Y3Qgc25kX3F1ZXVlICpzcSwgaW50IHFlbnRyeSwKKwkJCQkJICAgIGludCB0c29fc3FlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzcV9pbW1fc3ViZGVzYyAqaW1tOworCXN0cnVjdCBzcV9oZHJfc3ViZGVzYyAqaGRyOworCisJc3EtPnNrYnVmZltxZW50cnldID0gKHU2NClza2I7CisKKwloZHIgPSAoc3RydWN0IHNxX2hkcl9zdWJkZXNjICopR0VUX1NRX0RFU0Moc3EsIHFlbnRyeSk7CisJbWVtc2V0KGhkciwgMCwgU05EX1FVRVVFX0RFU0NfU0laRSk7CisJaGRyLT5zdWJkZXNjX3R5cGUgPSBTUV9ERVNDX1RZUEVfSEVBREVSOworCS8qIEVuYWJsZSBub3RpZmljYXRpb24gdmlhIENRRSBhZnRlciBwcm9jZXNzaW5nIFNRRSAqLworCWhkci0+cG9zdF9jcWUgPSAxOworCS8qIFRoZXJlIGlzIG5vIHBhY2tldCB0byB0cmFuc21pdCBoZXJlICovCisJaGRyLT5kb250X3NlbmQgPSAxOworCWhkci0+c3ViZGVzY19jbnQgPSBQT1NUX0NRRV9ERVNDX0NPVU5UIC0gMTsKKwloZHItPnRvdF9sZW4gPSAxOworCS8qIEFjdHVhbCBUU08gaGVhZGVyIFNRRSBpbmRleCwgbmVlZGVkIGZvciBjbGVhbnVwICovCisJaGRyLT5yc3ZkMiA9IHRzb19zcWU7CisKKwlxZW50cnkgPSBuaWN2Zl9nZXRfbnh0X3NxZW50cnkoc3EsIHFlbnRyeSk7CisJaW1tID0gKHN0cnVjdCBzcV9pbW1fc3ViZGVzYyAqKUdFVF9TUV9ERVNDKHNxLCBxZW50cnkpOworCW1lbXNldChpbW0sIDAsIFNORF9RVUVVRV9ERVNDX1NJWkUpOworCWltbS0+c3ViZGVzY190eXBlID0gU1FfREVTQ19UWVBFX0lNTUVESUFURTsKKwlpbW0tPmxlbiA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuaWN2Zl9zcV9kb29yYmVsbChzdHJ1Y3QgbmljdmYgKm5pYywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgIGludCBzcV9udW0sIGludCBkZXNjX2NudCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHE7CisKKwl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKG5pYy0+cG5pY3ZmLT5uZXRkZXYsCisJCQkJICBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSk7CisKKwluZXRkZXZfdHhfc2VudF9xdWV1ZSh0eHEsIHNrYi0+bGVuKTsKKworCS8qIG1ha2Ugc3VyZSBhbGwgbWVtb3J5IHN0b3JlcyBhcmUgZG9uZSBiZWZvcmUgcmluZ2luZyBkb29yYmVsbCAqLworCXNtcF93bWIoKTsKKworCS8qIEluZm9ybSBIVyB0byB4bWl0IGFsbCBUU08gc2VnbWVudHMgKi8KKwluaWN2Zl9xdWV1ZV9yZWdfd3JpdGUobmljLCBOSUNfUVNFVF9TUV8wXzdfRE9PUiwKKwkJCSAgICAgIHNxX251bSwgZGVzY19jbnQpOworfQorCiAvKiBTZWdtZW50IGEgVFNPIHBhY2tldCBpbnRvICdnc29fc2l6ZScgc2VnbWVudHMgYW5kIGFwcGVuZAogICogdGhlbSB0byBTUSBmb3IgdHJhbnNmZXIKICAqLwpAQCAtMTA4MiwxMiArMTE1OSw4IEBACiAJLyogU2F2ZSBTS0IgaW4gdGhlIGxhc3Qgc2VnbWVudCBmb3IgZnJlZWluZyAqLwogCXNxLT5za2J1ZmZbaGRyX3FlbnRyeV0gPSAodTY0KXNrYjsKIAotCS8qIG1ha2Ugc3VyZSBhbGwgbWVtb3J5IHN0b3JlcyBhcmUgZG9uZSBiZWZvcmUgcmluZ2luZyBkb29yYmVsbCAqLwotCXNtcF93bWIoKTsKKwluaWN2Zl9zcV9kb29yYmVsbChuaWMsIHNrYiwgc3FfbnVtLCBkZXNjX2NudCk7CiAKLQkvKiBJbmZvcm0gSFcgdG8geG1pdCBhbGwgVFNPIHNlZ21lbnRzICovCi0JbmljdmZfcXVldWVfcmVnX3dyaXRlKG5pYywgTklDX1FTRVRfU1FfMF83X0RPT1IsCi0JCQkgICAgICBzcV9udW0sIGRlc2NfY250KTsKIAluaWMtPmRydl9zdGF0cy50eF90c28rKzsKIAlyZXR1cm4gMTsKIH0KQEAgLTEwOTYsNyArMTE2OSw3IEBACiBpbnQgbmljdmZfc3FfYXBwZW5kX3NrYihzdHJ1Y3QgbmljdmYgKm5pYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgaSwgc2l6ZTsKLQlpbnQgc3ViZGVzY19jbnQ7CisJaW50IHN1YmRlc2NfY250LCB0c29fc3FlID0gMDsKIAlpbnQgc3FfbnVtLCBxZW50cnk7CiAJc3RydWN0IHF1ZXVlX3NldCAqcXM7CiAJc3RydWN0IHNuZF9xdWV1ZSAqc3E7CkBAIC0xMTMxLDYgKzEyMDQsNyBAQAogCS8qIEFkZCBTUSBoZWFkZXIgc3ViZGVzYyAqLwogCW5pY3ZmX3NxX2FkZF9oZHJfc3ViZGVzYyhuaWMsIHNxLCBxZW50cnksIHN1YmRlc2NfY250IC0gMSwKIAkJCQkgc2tiLCBza2ItPmxlbik7CisJdHNvX3NxZSA9IHFlbnRyeTsKIAogCS8qIEFkZCBTUSBnYXRoZXIgc3ViZGVzY3MgKi8KIAlxZW50cnkgPSBuaWN2Zl9nZXRfbnh0X3NxZW50cnkoc3EsIHFlbnRyeSk7CkBAIC0xMTU0LDEyICsxMjI4LDEzIEBACiAJfQogCiBkb29yYmVsbDoKLQkvKiBtYWtlIHN1cmUgYWxsIG1lbW9yeSBzdG9yZXMgYXJlIGRvbmUgYmVmb3JlIHJpbmdpbmcgZG9vcmJlbGwgKi8KLQlzbXBfd21iKCk7CisJaWYgKG5pYy0+dDg4ICYmIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpIHsKKwkJcWVudHJ5ID0gbmljdmZfZ2V0X254dF9zcWVudHJ5KHNxLCBxZW50cnkpOworCQluaWN2Zl9zcV9hZGRfY3FlX3N1YmRlc2Moc3EsIHFlbnRyeSwgdHNvX3NxZSwgc2tiKTsKKwl9CiAKLQkvKiBJbmZvcm0gSFcgdG8geG1pdCBuZXcgcGFja2V0ICovCi0JbmljdmZfcXVldWVfcmVnX3dyaXRlKG5pYywgTklDX1FTRVRfU1FfMF83X0RPT1IsCi0JCQkgICAgICBzcV9udW0sIHN1YmRlc2NfY250KTsKKwluaWN2Zl9zcV9kb29yYmVsbChuaWMsIHNrYiwgc3FfbnVtLCBzdWJkZXNjX2NudCk7CisKIAlyZXR1cm4gMTsKIAogYXBwZW5kX2ZhaWw6CkBAIC0xMTg0LDEzICsxMjU5LDIzIEBACiAJaW50IGZyYWc7CiAJaW50IHBheWxvYWRfbGVuID0gMDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2ZyYWcgPSBOVUxMOwotCXN0cnVjdCBza19idWZmICpwcmV2X2ZyYWcgPSBOVUxMOworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBvZmZzZXQ7CiAJdTE2ICpyYl9sZW5zID0gTlVMTDsKIAl1NjQgKnJiX3B0cnMgPSBOVUxMOwogCiAJcmJfbGVucyA9ICh2b2lkICopY3FlX3J4ICsgKDMgKiBzaXplb2YodTY0KSk7Ci0JcmJfcHRycyA9ICh2b2lkICopY3FlX3J4ICsgKDYgKiBzaXplb2YodTY0KSk7CisJLyogRXhjZXB0IDg4eHggcGFzczEgb24gYWxsIG90aGVyIGNoaXBzIENRRV9SWDJfUyBpcyBhZGRlZCB0bworCSAqIENRRV9SWCBhdCB3b3JkNiwgaGVuY2UgYnVmZmVyIHBvaW50ZXJzIG1vdmUgYnkgd29yZAorCSAqCisJICogVXNlIGV4aXN0aW5nICdod190c28nIGZsYWcgd2hpY2ggd2lsbCBiZSBzZXQgZm9yIGFsbCBjaGlwcworCSAqIGV4Y2VwdCA4OHh4IHBhc3MxIGluc3RlYWQgb2YgYSBhZGRpdGlvbmFsIGNhY2hlIGxpbmUKKwkgKiBhY2Nlc3MgKG9yIG1pc3MpIGJ5IHVzaW5nIHBjaSBkZXYncyByZXZpc2lvbi4KKwkgKi8KKwlpZiAoIW5pYy0+aHdfdHNvKQorCQlyYl9wdHJzID0gKHZvaWQgKiljcWVfcnggKyAoNiAqIHNpemVvZih1NjQpKTsKKwllbHNlCisJCXJiX3B0cnMgPSAodm9pZCAqKWNxZV9yeCArICg3ICogc2l6ZW9mKHU2NCkpOwogCiAJbmV0ZGV2X2RiZyhuaWMtPm5ldGRldiwgIiVzIHJiX2NudCAlZCByYjBfcHRyICVsbHggcmIwX3N6ICVkXG4iLAogCQkgICBfX2Z1bmNfXywgY3FlX3J4LT5yYl9jbnQsIGNxZV9yeC0+cmIwX3B0ciwgY3FlX3J4LT5yYjBfc3opOwpAQCAtMTIwOCwyMiArMTI5MywxMCBAQAogCQkJc2tiX3B1dChza2IsIHBheWxvYWRfbGVuKTsKIAkJfSBlbHNlIHsKIAkJCS8qIEFkZCBmcmFnbWVudHMgKi8KLQkJCXNrYl9mcmFnID0gbmljdmZfcmJfcHRyX3RvX3NrYihuaWMsICpyYl9wdHJzLAotCQkJCQkJICAgICAgIHBheWxvYWRfbGVuKTsKLQkJCWlmICghc2tiX2ZyYWcpIHsKLQkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0KLQkJCWlmICghc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpCi0JCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QgPSBza2JfZnJhZzsKLQkJCWVsc2UKLQkJCQlwcmV2X2ZyYWctPm5leHQgPSBza2JfZnJhZzsKLQotCQkJcHJldl9mcmFnID0gc2tiX2ZyYWc7Ci0JCQlza2ItPmxlbiArPSBwYXlsb2FkX2xlbjsKLQkJCXNrYi0+ZGF0YV9sZW4gKz0gcGF5bG9hZF9sZW47Ci0JCQlza2JfZnJhZy0+bGVuID0gcGF5bG9hZF9sZW47CisJCQlwYWdlID0gdmlydF90b19wYWdlKHBoeXNfdG9fdmlydCgqcmJfcHRycykpOworCQkJb2Zmc2V0ID0gcGh5c190b192aXJ0KCpyYl9wdHJzKSAtIHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJCXNrYl9hZGRfcnhfZnJhZyhza2IsIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MsIHBhZ2UsCisJCQkJCW9mZnNldCwgcGF5bG9hZF9sZW4sIFJDVl9GUkFHX0xFTik7CiAJCX0KIAkJLyogTmV4dCBidWZmZXIgcG9pbnRlciAqLwogCQlyYl9wdHJzKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWN2Zl9xdWV1ZXMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY3ZmX3F1ZXVlcy5oCmluZGV4IDY2NzNlMTEuLjg2OWYzMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY3ZmX3F1ZXVlcy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY3ZmX3F1ZXVlcy5oCkBAIC01NywxMCArNTcsNyBAQAogI2RlZmluZSBDTVBfUVVFVUVfU0laRTYJCTZVTEwgLyogNjRLIGVudHJpZXMgKi8KIAogLyogRGVmYXVsdCBxdWV1ZSBjb3VudCBwZXIgUVMsIGl0cyBsZW5ndGhzIGFuZCB0aHJlc2hvbGQgdmFsdWVzICovCi0jZGVmaW5lIFJCRFJfQ05UCQkxCi0jZGVmaW5lIFJDVl9RVUVVRV9DTlQJCTgKLSNkZWZpbmUgU05EX1FVRVVFX0NOVAkJOAotI2RlZmluZSBDTVBfUVVFVUVfQ05UCQk4IC8qIE1heCBvZiBSQ1YgYW5kIFNORCBxY291bnQgKi8KKyNkZWZpbmUgREVGQVVMVF9SQkRSX0NOVAkxCiAKICNkZWZpbmUgU05EX1FTSVpFCQlTTkRfUVVFVUVfU0laRTIKICNkZWZpbmUgU05EX1FVRVVFX0xFTgkJKDFVTEwgPDwgKFNORF9RU0laRSArIDEwKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL3RodW5kZXJfYmd4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci90aHVuZGVyX2JneC5jCmluZGV4IDYzYTM5YWMuLjhiYmFlZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL3RodW5kZXJfYmd4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvdGh1bmRlcl9iZ3guYwpAQCAtMjgsNiArMjgsOSBAQAogCXN0cnVjdCBiZ3gJCSpiZ3g7CiAJaW50CQkJZG1hYzsKIAl1OAkJCW1hY1tFVEhfQUxFTl07CisJdTggICAgICAgICAgICAgICAgICAgICAgbG1hY190eXBlOworCXU4ICAgICAgICAgICAgICAgICAgICAgIGxhbmVfdG9fc2RzOworCWJvb2wgICAgICAgICAgICAgICAgICAgIHVzZV90cmFpbmluZzsKIAlib29sCQkJbGlua191cDsKIAlpbnQJCQlsbWFjaWQ7IC8qIElEIHdpdGhpbiBCR1ggKi8KIAlpbnQJCQlsbWFjaWRfYmQ7IC8qIElEIG9uIGJvYXJkICovCkBAIC00MywxNCArNDYsMTMgQEAKIAogc3RydWN0IGJneCB7CiAJdTgJCQliZ3hfaWQ7Ci0JdTgJCQlxbG1fbW9kZTsKIAlzdHJ1Y3QJbG1hYwkJbG1hY1tNQVhfTE1BQ19QRVJfQkdYXTsKIAlpbnQJCQlsbWFjX2NvdW50OwotCWludCAgICAgICAgICAgICAgICAgICAgIGxtYWNfdHlwZTsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBsYW5lX3RvX3NkczsKLQlpbnQJCQl1c2VfdHJhaW5pbmc7CisJdTgJCQltYXhfbG1hYzsKIAl2b2lkIF9faW9tZW0JCSpyZWdfYmFzZTsKIAlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgaXNfZGxtOworCWJvb2wgICAgICAgICAgICAgICAgICAgIGlzX3JneDsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYmd4ICpiZ3hfdm5pY1tNQVhfQkdYX1RIVU5ERVJdOwpAQCAtNjEsNiArNjMsNyBAQAogLyogU3VwcG9ydGVkIGRldmljZXMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBiZ3hfaWRfdGFibGVbXSA9IHsKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9DQVZJVU0sIFBDSV9ERVZJQ0VfSURfVEhVTkRFUl9CR1gpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQ0FWSVVNLCBQQ0lfREVWSUNFX0lEX1RIVU5ERVJfUkdYKSB9LAogCXsgMCwgfSAgLyogZW5kIG9mIHRhYmxlICovCiB9OwogCkBAIC0xMjQsOCArMTI3LDggQEAKIAlpbnQgaTsKIAl1bnNpZ25lZCBtYXAgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9CR1hfUEVSX0NOODhYWDsgaSsrKSB7Ci0JCWlmIChiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX0NOODhYWCkgKyBpXSkKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JHWF9QRVJfTk9ERTsgaSsrKSB7CisJCWlmIChiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX05PREUpICsgaV0pCiAJCQltYXAgfD0gKDEgPDwgaSk7CiAJfQogCkBAIC0xMzgsNyArMTQxLDcgQEAKIHsKIAlzdHJ1Y3QgYmd4ICpiZ3g7CiAKLQliZ3ggPSBiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX0NOODhYWCkgKyBiZ3hfaWR4XTsKKwliZ3ggPSBiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX05PREUpICsgYmd4X2lkeF07CiAJaWYgKGJneCkKIAkJcmV0dXJuIGJneC0+bG1hY19jb3VudDsKIApAQCAtMTUzLDcgKzE1Niw3IEBACiAJc3RydWN0IGJneCAqYmd4OwogCXN0cnVjdCBsbWFjICpsbWFjOwogCi0JYmd4ID0gYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9DTjg4WFgpICsgYmd4X2lkeF07CisJYmd4ID0gYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9OT0RFKSArIGJneF9pZHhdOwogCWlmICghYmd4KQogCQlyZXR1cm47CiAKQEAgLTE2Niw3ICsxNjksNyBAQAogCiBjb25zdCB1OCAqYmd4X2dldF9sbWFjX21hYyhpbnQgbm9kZSwgaW50IGJneF9pZHgsIGludCBsbWFjaWQpCiB7Ci0Jc3RydWN0IGJneCAqYmd4ID0gYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9DTjg4WFgpICsgYmd4X2lkeF07CisJc3RydWN0IGJneCAqYmd4ID0gYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9OT0RFKSArIGJneF9pZHhdOwogCiAJaWYgKGJneCkKIAkJcmV0dXJuIGJneC0+bG1hY1tsbWFjaWRdLm1hYzsKQEAgLTE3Nyw3ICsxODAsNyBAQAogCiB2b2lkIGJneF9zZXRfbG1hY19tYWMoaW50IG5vZGUsIGludCBiZ3hfaWR4LCBpbnQgbG1hY2lkLCBjb25zdCB1OCAqbWFjKQogewotCXN0cnVjdCBiZ3ggKmJneCA9IGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfQ044OFhYKSArIGJneF9pZHhdOworCXN0cnVjdCBiZ3ggKmJneCA9IGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfTk9ERSkgKyBiZ3hfaWR4XTsKIAogCWlmICghYmd4KQogCQlyZXR1cm47CkBAIC0xODgsMTEgKzE5MSwxMyBAQAogCiB2b2lkIGJneF9sbWFjX3J4X3R4X2VuYWJsZShpbnQgbm9kZSwgaW50IGJneF9pZHgsIGludCBsbWFjaWQsIGJvb2wgZW5hYmxlKQogewotCXN0cnVjdCBiZ3ggKmJneCA9IGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfQ044OFhYKSArIGJneF9pZHhdOworCXN0cnVjdCBiZ3ggKmJneCA9IGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfTk9ERSkgKyBiZ3hfaWR4XTsKKwlzdHJ1Y3QgbG1hYyAqbG1hYzsKIAl1NjQgY2ZnOwogCiAJaWYgKCFiZ3gpCiAJCXJldHVybjsKKwlsbWFjID0gJmJneC0+bG1hY1tsbWFjaWRdOwogCiAJY2ZnID0gYmd4X3JlZ19yZWFkKGJneCwgbG1hY2lkLCBCR1hfQ01SWF9DRkcpOwogCWlmIChlbmFibGUpCkBAIC0yMDAsNiArMjA1LDkgQEAKIAllbHNlCiAJCWNmZyAmPSB+KENNUl9QS1RfUlhfRU4gfCBDTVJfUEtUX1RYX0VOKTsKIAliZ3hfcmVnX3dyaXRlKGJneCwgbG1hY2lkLCBCR1hfQ01SWF9DRkcsIGNmZyk7CisKKwlpZiAoYmd4LT5pc19yZ3gpCisJCXhjdl9zZXR1cF9saW5rKGVuYWJsZSA/IGxtYWMtPmxpbmtfdXAgOiAwLCBsbWFjLT5sYXN0X3NwZWVkKTsKIH0KIEVYUE9SVF9TWU1CT0woYmd4X2xtYWNfcnhfdHhfZW5hYmxlKTsKIApAQCAtMjY2LDkgKzI3NCwxMiBAQAogCiAJcG9ydF9jZmcgPSBiZ3hfcmVnX3JlYWQoYmd4LCBsbWFjLT5sbWFjaWQsIEJHWF9HTVBfR01JX1BSVFhfQ0ZHKTsKIAotCS8qIHJlbmFibGUgbG1hYyAqLworCS8qIFJlLWVuYWJsZSBsbWFjICovCiAJY21yX2NmZyB8PSBDTVJfRU47CiAJYmd4X3JlZ193cml0ZShiZ3gsIGxtYWMtPmxtYWNpZCwgQkdYX0NNUlhfQ0ZHLCBjbXJfY2ZnKTsKKworCWlmIChiZ3gtPmlzX3JneCAmJiAoY21yX2NmZyAmIChDTVJfUEtUX1JYX0VOIHwgQ01SX1BLVF9UWF9FTikpKQorCQl4Y3Zfc2V0dXBfbGluayhsbWFjLT5saW5rX3VwLCBsbWFjLT5sYXN0X3NwZWVkKTsKIH0KIAogc3RhdGljIHZvaWQgYmd4X2xtYWNfaGFuZGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQpAQCAtMzE0LDcgKzMyNSw3IEBACiB7CiAJc3RydWN0IGJneCAqYmd4OwogCi0JYmd4ID0gYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9DTjg4WFgpICsgYmd4X2lkeF07CisJYmd4ID0gYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9OT0RFKSArIGJneF9pZHhdOwogCWlmICghYmd4KQogCQlyZXR1cm4gMDsKIApAQCAtMzI4LDcgKzMzOSw3IEBACiB7CiAJc3RydWN0IGJneCAqYmd4OwogCi0JYmd4ID0gYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9DTjg4WFgpICsgYmd4X2lkeF07CisJYmd4ID0gYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9OT0RFKSArIGJneF9pZHhdOwogCWlmICghYmd4KQogCQlyZXR1cm4gMDsKIApAQCAtMzU2LDcgKzM2Nyw3IEBACiAJc3RydWN0IGxtYWMgKmxtYWM7CiAJdTY0ICAgIGNmZzsKIAotCWJneCA9IGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfQ044OFhYKSArIGJneF9pZHhdOworCWJneCA9IGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfTk9ERSkgKyBiZ3hfaWR4XTsKIAlpZiAoIWJneCkKIAkJcmV0dXJuOwogCkBAIC0zNzksOCArMzkwLDkgQEAKIH0KIEVYUE9SVF9TWU1CT0woYmd4X2xtYWNfaW50ZXJuYWxfbG9vcGJhY2spOwogCi1zdGF0aWMgaW50IGJneF9sbWFjX3NnbWlpX2luaXQoc3RydWN0IGJneCAqYmd4LCBpbnQgbG1hY2lkKQorc3RhdGljIGludCBiZ3hfbG1hY19zZ21paV9pbml0KHN0cnVjdCBiZ3ggKmJneCwgc3RydWN0IGxtYWMgKmxtYWMpCiB7CisJaW50IGxtYWNpZCA9IGxtYWMtPmxtYWNpZDsKIAl1NjQgY2ZnOwogCiAJYmd4X3JlZ19tb2RpZnkoYmd4LCBsbWFjaWQsIEJHWF9HTVBfR01JX1RYWF9USFJFU0gsIDB4MzApOwpAQCAtNDA5LDE4ICs0MjEsMjkgQEAKIAljZmcgfD0gKFBDU19NUlhfQ1RMX1JTVF9BTiB8IFBDU19NUlhfQ1RMX0FOX0VOKTsKIAliZ3hfcmVnX3dyaXRlKGJneCwgbG1hY2lkLCBCR1hfR01QX1BDU19NUlhfQ1RMLCBjZmcpOwogCi0JaWYgKGJneF9wb2xsX3JlZyhiZ3gsIGxtYWNpZCwgQkdYX0dNUF9QQ1NfTVJYX1NUQVRVUywKLQkJCSBQQ1NfTVJYX1NUQVRVU19BTl9DUFQsIGZhbHNlKSkgewotCQlkZXZfZXJyKCZiZ3gtPnBkZXYtPmRldiwgIkJHWCBBTl9DUFQgbm90IGNvbXBsZXRlZFxuIik7Ci0JCXJldHVybiAtMTsKKwlpZiAobG1hYy0+bG1hY190eXBlID09IEJHWF9NT0RFX1FTR01JSSkgeworCQkvKiBEaXNhYmxlIGRpc3Bhcml0eSBjaGVjayBmb3IgUVNHTUlJICovCisJCWNmZyA9IGJneF9yZWdfcmVhZChiZ3gsIGxtYWNpZCwgQkdYX0dNUF9QQ1NfTUlTQ1hfQ1RMKTsKKwkJY2ZnICY9IH5QQ1NfTUlTQ19DVExfRElTUF9FTjsKKwkJYmd4X3JlZ193cml0ZShiZ3gsIGxtYWNpZCwgQkdYX0dNUF9QQ1NfTUlTQ1hfQ1RMLCBjZmcpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobG1hYy0+bG1hY190eXBlID09IEJHWF9NT0RFX1NHTUlJKSB7CisJCWlmIChiZ3hfcG9sbF9yZWcoYmd4LCBsbWFjaWQsIEJHWF9HTVBfUENTX01SWF9TVEFUVVMsCisJCQkJIFBDU19NUlhfU1RBVFVTX0FOX0NQVCwgZmFsc2UpKSB7CisJCQlkZXZfZXJyKCZiZ3gtPnBkZXYtPmRldiwgIkJHWCBBTl9DUFQgbm90IGNvbXBsZXRlZFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBiZ3hfbG1hY194YXVpX2luaXQoc3RydWN0IGJneCAqYmd4LCBpbnQgbG1hY2lkLCBpbnQgbG1hY190eXBlKQorc3RhdGljIGludCBiZ3hfbG1hY194YXVpX2luaXQoc3RydWN0IGJneCAqYmd4LCBzdHJ1Y3QgbG1hYyAqbG1hYykKIHsKIAl1NjQgY2ZnOworCWludCBsbWFjaWQgPSBsbWFjLT5sbWFjaWQ7CiAKIAkvKiBSZXNldCBTUFUgKi8KIAliZ3hfcmVnX21vZGlmeShiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfQ09OVFJPTDEsIFNQVV9DVExfUkVTRVQpOwpAQCAtNDM2LDEyICs0NTksMTQgQEAKIAogCWJneF9yZWdfbW9kaWZ5KGJneCwgbG1hY2lkLCBCR1hfU1BVWF9DT05UUk9MMSwgU1BVX0NUTF9MT1dfUE9XRVIpOwogCS8qIFNldCBpbnRlcmxlYXZlZCBydW5uaW5nIGRpc3Bhcml0eSBmb3IgUlhBVUkgKi8KLQlpZiAoYmd4LT5sbWFjX3R5cGUgIT0gQkdYX01PREVfUlhBVUkpCi0JCWJneF9yZWdfbW9kaWZ5KGJneCwgbG1hY2lkLAotCQkJICAgICAgIEJHWF9TUFVYX01JU0NfQ09OVFJPTCwgU1BVX01JU0NfQ1RMX1JYX0RJUyk7Ci0JZWxzZQorCWlmIChsbWFjLT5sbWFjX3R5cGUgPT0gQkdYX01PREVfUlhBVUkpCiAJCWJneF9yZWdfbW9kaWZ5KGJneCwgbG1hY2lkLCBCR1hfU1BVWF9NSVNDX0NPTlRST0wsCi0JCQkgICAgICAgU1BVX01JU0NfQ1RMX1JYX0RJUyB8IFNQVV9NSVNDX0NUTF9JTlRMVl9SRElTUCk7CisJCQkgICAgICAgU1BVX01JU0NfQ1RMX0lOVExWX1JESVNQKTsKKworCS8qIENsZWFyIHJlY2VpdmUgcGFja2V0IGRpc2FibGUgKi8KKwljZmcgPSBiZ3hfcmVnX3JlYWQoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX01JU0NfQ09OVFJPTCk7CisJY2ZnICY9IH5TUFVfTUlTQ19DVExfUlhfRElTOworCWJneF9yZWdfd3JpdGUoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX01JU0NfQ09OVFJPTCwgY2ZnKTsKIAogCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCiAJY2ZnID0gYmd4X3JlZ19yZWFkKGJneCwgbG1hY2lkLCBCR1hfU01VWF9SWF9JTlQpOwpAQCAtNDUxLDcgKzQ3Niw3IEBACiAJY2ZnID0gYmd4X3JlZ19yZWFkKGJneCwgbG1hY2lkLCBCR1hfU1BVWF9JTlQpOwogCWJneF9yZWdfd3JpdGUoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX0lOVCwgY2ZnKTsKIAotCWlmIChiZ3gtPnVzZV90cmFpbmluZykgeworCWlmIChsbWFjLT51c2VfdHJhaW5pbmcpIHsKIAkJYmd4X3JlZ193cml0ZShiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfQlJfUE1EX0xQX0NVUCwgMHgwMCk7CiAJCWJneF9yZWdfd3JpdGUoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX0JSX1BNRF9MRF9DVVAsIDB4MDApOwogCQliZ3hfcmVnX3dyaXRlKGJneCwgbG1hY2lkLCBCR1hfU1BVWF9CUl9QTURfTERfUkVQLCAweDAwKTsKQEAgLTQ3NCw5ICs0OTksOSBAQAogCWJneF9yZWdfd3JpdGUoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX0FOX0NPTlRST0wsIGNmZyk7CiAKIAljZmcgPSBiZ3hfcmVnX3JlYWQoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX0FOX0FEVik7Ci0JaWYgKGJneC0+bG1hY190eXBlID09IEJHWF9NT0RFXzEwR19LUikKKwlpZiAobG1hYy0+bG1hY190eXBlID09IEJHWF9NT0RFXzEwR19LUikKIAkJY2ZnIHw9ICgxIDw8IDIzKTsKLQllbHNlIGlmIChiZ3gtPmxtYWNfdHlwZSA9PSBCR1hfTU9ERV80MEdfS1IpCisJZWxzZSBpZiAobG1hYy0+bG1hY190eXBlID09IEJHWF9NT0RFXzQwR19LUikKIAkJY2ZnIHw9ICgxIDw8IDI0KTsKIAllbHNlCiAJCWNmZyAmPSB+KCgxIDw8IDIzKSB8ICgxIDw8IDI0KSk7CkBAIC01MTEsMTEgKzUzNiwxMCBAQAogewogCXN0cnVjdCBiZ3ggKmJneCA9IGxtYWMtPmJneDsKIAlpbnQgbG1hY2lkID0gbG1hYy0+bG1hY2lkOwotCWludCBsbWFjX3R5cGUgPSBiZ3gtPmxtYWNfdHlwZTsKKwlpbnQgbG1hY190eXBlID0gbG1hYy0+bG1hY190eXBlOwogCXU2NCBjZmc7CiAKLQliZ3hfcmVnX21vZGlmeShiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfTUlTQ19DT05UUk9MLCBTUFVfTUlTQ19DVExfUlhfRElTKTsKLQlpZiAoYmd4LT51c2VfdHJhaW5pbmcpIHsKKwlpZiAobG1hYy0+dXNlX3RyYWluaW5nKSB7CiAJCWNmZyA9IGJneF9yZWdfcmVhZChiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfSU5UKTsKIAkJaWYgKCEoY2ZnICYgKDF1bGwgPDwgMTMpKSkgewogCQkJY2ZnID0gKDF1bGwgPDwgMTMpIHwgKDF1bGwgPDwgMTQpOwpAQCAtNTU2LDcgKzU4MCw3IEBACiAJCQkgICAgICAgQkdYX1NQVVhfU1RBVFVTMiwgU1BVX1NUQVRVUzJfUkNWRkxUKTsKIAlpZiAoYmd4X3JlZ19yZWFkKGJneCwgbG1hY2lkLCBCR1hfU1BVWF9TVEFUVVMyKSAmIFNQVV9TVEFUVVMyX1JDVkZMVCkgewogCQlkZXZfZXJyKCZiZ3gtPnBkZXYtPmRldiwgIlJlY2VpdmUgZmF1bHQsIHJldHJ5IHRyYWluaW5nXG4iKTsKLQkJaWYgKGJneC0+dXNlX3RyYWluaW5nKSB7CisJCWlmIChsbWFjLT51c2VfdHJhaW5pbmcpIHsKIAkJCWNmZyA9IGJneF9yZWdfcmVhZChiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfSU5UKTsKIAkJCWlmICghKGNmZyAmICgxdWxsIDw8IDEzKSkpIHsKIAkJCQljZmcgPSAoMXVsbCA8PCAxMykgfCAoMXVsbCA8PCAxNCk7CkBAIC01ODQsMTEgKzYwOCw2IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQkvKiBDbGVhciByZWNlaXZlIHBhY2tldCBkaXNhYmxlICovCi0JY2ZnID0gYmd4X3JlZ19yZWFkKGJneCwgbG1hY2lkLCBCR1hfU1BVWF9NSVNDX0NPTlRST0wpOwotCWNmZyAmPSB+U1BVX01JU0NfQ1RMX1JYX0RJUzsKLQliZ3hfcmVnX3dyaXRlKGJneCwgbG1hY2lkLCBCR1hfU1BVWF9NSVNDX0NPTlRST0wsIGNmZyk7Ci0KIAkvKiBDaGVjayBmb3IgTUFDIFJYIGZhdWx0cyAqLwogCWNmZyA9IGJneF9yZWdfcmVhZChiZ3gsIGxtYWNpZCwgQkdYX1NNVVhfUlhfQ1RMKTsKIAkvKiAwIC0gTGluayBpcyBva2F5LCAxIC0gTG9jYWwgZmF1bHQsIDIgLSBSZW1vdGUgZmF1bHQgKi8KQEAgLTU5OSw3ICs2MTgsNyBAQAogCS8qIFJ4IGxvY2FsL3JlbW90ZSBmYXVsdCBzZWVuLgogCSAqIERvIGxtYWMgcmVpbml0IHRvIHNlZSBpZiBjb25kaXRpb24gcmVjb3ZlcnMKIAkgKi8KLQliZ3hfbG1hY194YXVpX2luaXQoYmd4LCBsbWFjaWQsIGJneC0+bG1hY190eXBlKTsKKwliZ3hfbG1hY194YXVpX2luaXQoYmd4LCBsbWFjKTsKIAogCXJldHVybiAtMTsKIH0KQEAgLTYyMyw3ICs2NDIsNyBAQAogCWlmICgoc3B1X2xpbmsgJiBTUFVfU1RBVFVTMV9SQ1ZfTE5LKSAmJgogCSAgICAhKHNtdV9saW5rICYgU01VX1JYX0NUTF9TVEFUVVMpKSB7CiAJCWxtYWMtPmxpbmtfdXAgPSAxOwotCQlpZiAobG1hYy0+Ymd4LT5sbWFjX3R5cGUgPT0gQkdYX01PREVfWExBVUkpCisJCWlmIChsbWFjLT5sbWFjX3R5cGUgPT0gQkdYX01PREVfWExBVUkpCiAJCQlsbWFjLT5sYXN0X3NwZWVkID0gNDAwMDA7CiAJCWVsc2UKIAkJCWxtYWMtPmxhc3Rfc3BlZWQgPSAxMDAwMDsKQEAgLTY0OSw2ICs2NjgsMTYgQEAKIAlxdWV1ZV9kZWxheWVkX3dvcmsobG1hYy0+Y2hlY2tfbGluaywgJmxtYWMtPmR3b3JrLCBIWiAqIDIpOwogfQogCitzdGF0aWMgaW50IHBoeV9pbnRlcmZhY2VfbW9kZSh1OCBsbWFjX3R5cGUpCit7CisJaWYgKGxtYWNfdHlwZSA9PSBCR1hfTU9ERV9RU0dNSUkpCisJCXJldHVybiBQSFlfSU5URVJGQUNFX01PREVfUVNHTUlJOworCWlmIChsbWFjX3R5cGUgPT0gQkdYX01PREVfUkdNSUkpCisJCXJldHVybiBQSFlfSU5URVJGQUNFX01PREVfUkdNSUk7CisKKwlyZXR1cm4gUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJOworfQorCiBzdGF0aWMgaW50IGJneF9sbWFjX2VuYWJsZShzdHJ1Y3QgYmd4ICpiZ3gsIHU4IGxtYWNpZCkKIHsKIAlzdHJ1Y3QgbG1hYyAqbG1hYzsKQEAgLTY1NywxMyArNjg2LDE1IEBACiAJbG1hYyA9ICZiZ3gtPmxtYWNbbG1hY2lkXTsKIAlsbWFjLT5iZ3ggPSBiZ3g7CiAKLQlpZiAoYmd4LT5sbWFjX3R5cGUgPT0gQkdYX01PREVfU0dNSUkpIHsKKwlpZiAoKGxtYWMtPmxtYWNfdHlwZSA9PSBCR1hfTU9ERV9TR01JSSkgfHwKKwkgICAgKGxtYWMtPmxtYWNfdHlwZSA9PSBCR1hfTU9ERV9RU0dNSUkpIHx8CisJICAgIChsbWFjLT5sbWFjX3R5cGUgPT0gQkdYX01PREVfUkdNSUkpKSB7CiAJCWxtYWMtPmlzX3NnbWlpID0gMTsKLQkJaWYgKGJneF9sbWFjX3NnbWlpX2luaXQoYmd4LCBsbWFjaWQpKQorCQlpZiAoYmd4X2xtYWNfc2dtaWlfaW5pdChiZ3gsIGxtYWMpKQogCQkJcmV0dXJuIC0xOwogCX0gZWxzZSB7CiAJCWxtYWMtPmlzX3NnbWlpID0gMDsKLQkJaWYgKGJneF9sbWFjX3hhdWlfaW5pdChiZ3gsIGxtYWNpZCwgYmd4LT5sbWFjX3R5cGUpKQorCQlpZiAoYmd4X2xtYWNfeGF1aV9pbml0KGJneCwgbG1hYykpCiAJCQlyZXR1cm4gLTE7CiAJfQogCkBAIC02ODUsMTAgKzcxNiwxMCBAQAogCS8qIFJlc3RvcmUgZGVmYXVsdCBjZmcsIGluY2FzZSBsb3cgbGV2ZWwgZmlybXdhcmUgY2hhbmdlZCBpdCAqLwogCWJneF9yZWdfd3JpdGUoYmd4LCBsbWFjaWQsIEJHWF9DTVJYX1JYX0RNQUNfQ1RMLCAweDAzKTsKIAotCWlmICgoYmd4LT5sbWFjX3R5cGUgIT0gQkdYX01PREVfWEZJKSAmJgotCSAgICAoYmd4LT5sbWFjX3R5cGUgIT0gQkdYX01PREVfWExBVUkpICYmCi0JICAgIChiZ3gtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV80MEdfS1IpICYmCi0JICAgIChiZ3gtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV8xMEdfS1IpKSB7CisJaWYgKChsbWFjLT5sbWFjX3R5cGUgIT0gQkdYX01PREVfWEZJKSAmJgorCSAgICAobG1hYy0+bG1hY190eXBlICE9IEJHWF9NT0RFX1hMQVVJKSAmJgorCSAgICAobG1hYy0+bG1hY190eXBlICE9IEJHWF9NT0RFXzQwR19LUikgJiYKKwkgICAgKGxtYWMtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV8xMEdfS1IpKSB7CiAJCWlmICghbG1hYy0+cGh5ZGV2KQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTY5Niw3ICs3MjcsNyBAQAogCiAJCWlmIChwaHlfY29ubmVjdF9kaXJlY3QoJmxtYWMtPm5ldGRldiwgbG1hYy0+cGh5ZGV2LAogCQkJCSAgICAgICBiZ3hfbG1hY19oYW5kbGVyLAotCQkJCSAgICAgICBQSFlfSU5URVJGQUNFX01PREVfU0dNSUkpKQorCQkJCSAgICAgICBwaHlfaW50ZXJmYWNlX21vZGUobG1hYy0+bG1hY190eXBlKSkpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAogCQlwaHlfc3RhcnRfYW5lZyhsbWFjLT5waHlkZXYpOwpAQCAtNzUzLDc2ICs3ODQsMTkgQEAKIAogCWJneF9mbHVzaF9kbWFjX2FkZHJzKGJneCwgbG1hY2lkKTsKIAotCWlmICgoYmd4LT5sbWFjX3R5cGUgIT0gQkdYX01PREVfWEZJKSAmJgotCSAgICAoYmd4LT5sbWFjX3R5cGUgIT0gQkdYX01PREVfWExBVUkpICYmCi0JICAgIChiZ3gtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV80MEdfS1IpICYmCi0JICAgIChiZ3gtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV8xMEdfS1IpICYmIGxtYWMtPnBoeWRldikKKwlpZiAoKGxtYWMtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV9YRkkpICYmCisJICAgIChsbWFjLT5sbWFjX3R5cGUgIT0gQkdYX01PREVfWExBVUkpICYmCisJICAgIChsbWFjLT5sbWFjX3R5cGUgIT0gQkdYX01PREVfNDBHX0tSKSAmJgorCSAgICAobG1hYy0+bG1hY190eXBlICE9IEJHWF9NT0RFXzEwR19LUikgJiYgbG1hYy0+cGh5ZGV2KQogCQlwaHlfZGlzY29ubmVjdChsbWFjLT5waHlkZXYpOwogCiAJbG1hYy0+cGh5ZGV2ID0gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgYmd4X3NldF9udW1fcG9ydHMoc3RydWN0IGJneCAqYmd4KQotewotCXU2NCBsbWFjX2NvdW50OwotCi0Jc3dpdGNoIChiZ3gtPnFsbV9tb2RlKSB7Ci0JY2FzZSBRTE1fTU9ERV9TR01JSToKLQkJYmd4LT5sbWFjX2NvdW50ID0gNDsKLQkJYmd4LT5sbWFjX3R5cGUgPSBCR1hfTU9ERV9TR01JSTsKLQkJYmd4LT5sYW5lX3RvX3NkcyA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgUUxNX01PREVfWEFVSV8xWDQ6Ci0JCWJneC0+bG1hY19jb3VudCA9IDE7Ci0JCWJneC0+bG1hY190eXBlID0gQkdYX01PREVfWEFVSTsKLQkJYmd4LT5sYW5lX3RvX3NkcyA9IDB4RTQ7Ci0JCQlicmVhazsKLQljYXNlIFFMTV9NT0RFX1JYQVVJXzJYMjoKLQkJYmd4LT5sbWFjX2NvdW50ID0gMjsKLQkJYmd4LT5sbWFjX3R5cGUgPSBCR1hfTU9ERV9SWEFVSTsKLQkJYmd4LT5sYW5lX3RvX3NkcyA9IDB4RTQ7Ci0JCQlicmVhazsKLQljYXNlIFFMTV9NT0RFX1hGSV80WDE6Ci0JCWJneC0+bG1hY19jb3VudCA9IDQ7Ci0JCWJneC0+bG1hY190eXBlID0gQkdYX01PREVfWEZJOwotCQliZ3gtPmxhbmVfdG9fc2RzID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBRTE1fTU9ERV9YTEFVSV8xWDQ6Ci0JCWJneC0+bG1hY19jb3VudCA9IDE7Ci0JCWJneC0+bG1hY190eXBlID0gQkdYX01PREVfWExBVUk7Ci0JCWJneC0+bGFuZV90b19zZHMgPSAweEU0OwotCQlicmVhazsKLQljYXNlIFFMTV9NT0RFXzEwR19LUl80WDE6Ci0JCWJneC0+bG1hY19jb3VudCA9IDQ7Ci0JCWJneC0+bG1hY190eXBlID0gQkdYX01PREVfMTBHX0tSOwotCQliZ3gtPmxhbmVfdG9fc2RzID0gMDsKLQkJYmd4LT51c2VfdHJhaW5pbmcgPSAxOwotCQlicmVhazsKLQljYXNlIFFMTV9NT0RFXzQwR19LUjRfMVg0OgotCQliZ3gtPmxtYWNfY291bnQgPSAxOwotCQliZ3gtPmxtYWNfdHlwZSA9IEJHWF9NT0RFXzQwR19LUjsKLQkJYmd4LT5sYW5lX3RvX3NkcyA9IDB4RTQ7Ci0JCWJneC0+dXNlX3RyYWluaW5nID0gMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYmd4LT5sbWFjX2NvdW50ID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JLyogQ2hlY2sgaWYgbG93IGxldmVsIGZpcm13YXJlIGhhcyBwcm9ncmFtbWVkIExNQUMgY291bnQKLQkgKiBiYXNlZCBvbiBib2FyZCB0eXBlLCBpZiB5ZXMgY29uc2lkZXIgdGhhdCBvdGhlcndpc2UKLQkgKiB0aGUgZGVmYXVsdCBzdGF0aWMgdmFsdWVzCi0JICovCi0JbG1hY19jb3VudCA9IGJneF9yZWdfcmVhZChiZ3gsIDAsIEJHWF9DTVJfUlhfTE1BQ1MpICYgMHg3OwotCWlmIChsbWFjX2NvdW50ICE9IDQpCi0JCWJneC0+bG1hY19jb3VudCA9IGxtYWNfY291bnQ7Ci19Ci0KIHN0YXRpYyB2b2lkIGJneF9pbml0X2h3KHN0cnVjdCBiZ3ggKmJneCkKIHsKIAlpbnQgaTsKLQotCWJneF9zZXRfbnVtX3BvcnRzKGJneCk7CisJc3RydWN0IGxtYWMgKmxtYWM7CiAKIAliZ3hfcmVnX21vZGlmeShiZ3gsIDAsIEJHWF9DTVJfR0xPQkFMX0NGRywgQ01SX0dMT0JBTF9DRkdfRkNTX1NUUklQKTsKIAlpZiAoYmd4X3JlZ19yZWFkKGJneCwgMCwgQkdYX0NNUl9CSVNUX1NUQVRVUykpCkBAIC04MzAsMTcgKzgwNCw5IEBACiAKIAkvKiBTZXQgbG1hYyB0eXBlIGFuZCBsYW5lMnNlcmRlcyBtYXBwaW5nICovCiAJZm9yIChpID0gMDsgaSA8IGJneC0+bG1hY19jb3VudDsgaSsrKSB7Ci0JCWlmIChiZ3gtPmxtYWNfdHlwZSA9PSBCR1hfTU9ERV9SWEFVSSkgewotCQkJaWYgKGkpCi0JCQkJYmd4LT5sYW5lX3RvX3NkcyA9IDB4MGU7Ci0JCQllbHNlCi0JCQkJYmd4LT5sYW5lX3RvX3NkcyA9IDB4MDQ7Ci0JCQliZ3hfcmVnX3dyaXRlKGJneCwgaSwgQkdYX0NNUlhfQ0ZHLAotCQkJCSAgICAgIChiZ3gtPmxtYWNfdHlwZSA8PCA4KSB8IGJneC0+bGFuZV90b19zZHMpOwotCQkJY29udGludWU7Ci0JCX0KKwkJbG1hYyA9ICZiZ3gtPmxtYWNbaV07CiAJCWJneF9yZWdfd3JpdGUoYmd4LCBpLCBCR1hfQ01SWF9DRkcsCi0JCQkgICAgICAoYmd4LT5sbWFjX3R5cGUgPDwgOCkgfCAoYmd4LT5sYW5lX3RvX3NkcyArIGkpKTsKKwkJCSAgICAgIChsbWFjLT5sbWFjX3R5cGUgPDwgOCkgfCBsbWFjLT5sYW5lX3RvX3Nkcyk7CiAJCWJneC0+bG1hY1tpXS5sbWFjaWRfYmQgPSBsbWFjX2NvdW50OwogCQlsbWFjX2NvdW50Kys7CiAJfQpAQCAtODYzLDU1ICs4MjksMjEyIEBACiAJCWJneF9yZWdfd3JpdGUoYmd4LCAwLCBCR1hfQ01SX1JYX1NUUkVFUklORyArIChpICogOCksIDB4MDApOwogfQogCi1zdGF0aWMgdm9pZCBiZ3hfZ2V0X3FsbV9tb2RlKHN0cnVjdCBiZ3ggKmJneCkKK3N0YXRpYyB1OCBiZ3hfZ2V0X2xhbmUyc2RzX2NmZyhzdHJ1Y3QgYmd4ICpiZ3gsIHN0cnVjdCBsbWFjICpsbWFjKQoreworCXJldHVybiAodTgpKGJneF9yZWdfcmVhZChiZ3gsIGxtYWMtPmxtYWNpZCwgQkdYX0NNUlhfQ0ZHKSAmIDB4RkYpOworfQorCitzdGF0aWMgdm9pZCBiZ3hfcHJpbnRfcWxtX21vZGUoc3RydWN0IGJneCAqYmd4LCB1OCBsbWFjaWQpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmJneC0+cGRldi0+ZGV2OwotCWludCBsbWFjX3R5cGU7Ci0JaW50IHRyYWluX2VuOworCXN0cnVjdCBsbWFjICpsbWFjOworCWNoYXIgc3RyWzIwXTsKKwl1OCBkbG07CiAKLQkvKiBSZWFkIExNQUMwIHR5cGUgdG8gZmlndXJlIG91dCBRTE0gbW9kZQotCSAqIFRoaXMgaXMgY29uZmlndXJlZCBieSBsb3cgbGV2ZWwgZmlybXdhcmUKLQkgKi8KLQlsbWFjX3R5cGUgPSBiZ3hfcmVnX3JlYWQoYmd4LCAwLCBCR1hfQ01SWF9DRkcpOwotCWxtYWNfdHlwZSA9IChsbWFjX3R5cGUgPj4gOCkgJiAweDA3OworCWlmIChsbWFjaWQgPiBiZ3gtPm1heF9sbWFjKQorCQlyZXR1cm47CiAKLQl0cmFpbl9lbiA9IGJneF9yZWdfcmVhZChiZ3gsIDAsIEJHWF9TUFVYX0JSX1BNRF9DUlRMKSAmCi0JCQkJU1BVX1BNRF9DUlRMX1RSQUlOX0VOOworCWxtYWMgPSAmYmd4LT5sbWFjW2xtYWNpZF07CisJZGxtID0gKGxtYWNpZCAvIDIpICsgKGJneC0+Ymd4X2lkICogMik7CisJaWYgKCFiZ3gtPmlzX2RsbSkKKwkJc3ByaW50ZihzdHIsICJCR1glZCBRTE0gbW9kZSIsIGJneC0+Ymd4X2lkKTsKKwllbHNlCisJCXNwcmludGYoc3RyLCAiQkdYJWQgRExNJWQgbW9kZSIsIGJneC0+Ymd4X2lkLCBkbG0pOwogCi0Jc3dpdGNoIChsbWFjX3R5cGUpIHsKKwlzd2l0Y2ggKGxtYWMtPmxtYWNfdHlwZSkgewogCWNhc2UgQkdYX01PREVfU0dNSUk6Ci0JCWJneC0+cWxtX21vZGUgPSBRTE1fTU9ERV9TR01JSTsKLQkJZGV2X2luZm8oZGV2LCAiQkdYJWQgUUxNIG1vZGU6IFNHTUlJXG4iLCBiZ3gtPmJneF9pZCk7CisJCWRldl9pbmZvKGRldiwgIiVzOiBTR01JSVxuIiwgKGNoYXIgKilzdHIpOwogCQlicmVhazsKIAljYXNlIEJHWF9NT0RFX1hBVUk6Ci0JCWJneC0+cWxtX21vZGUgPSBRTE1fTU9ERV9YQVVJXzFYNDsKLQkJZGV2X2luZm8oZGV2LCAiQkdYJWQgUUxNIG1vZGU6IFhBVUlcbiIsIGJneC0+Ymd4X2lkKTsKKwkJZGV2X2luZm8oZGV2LCAiJXM6IFhBVUlcbiIsIChjaGFyICopc3RyKTsKIAkJYnJlYWs7CiAJY2FzZSBCR1hfTU9ERV9SWEFVSToKLQkJYmd4LT5xbG1fbW9kZSA9IFFMTV9NT0RFX1JYQVVJXzJYMjsKLQkJZGV2X2luZm8oZGV2LCAiQkdYJWQgUUxNIG1vZGU6IFJYQVVJXG4iLCBiZ3gtPmJneF9pZCk7CisJCWRldl9pbmZvKGRldiwgIiVzOiBSWEFVSVxuIiwgKGNoYXIgKilzdHIpOwogCQlicmVhazsKIAljYXNlIEJHWF9NT0RFX1hGSToKLQkJaWYgKCF0cmFpbl9lbikgewotCQkJYmd4LT5xbG1fbW9kZSA9IFFMTV9NT0RFX1hGSV80WDE7Ci0JCQlkZXZfaW5mbyhkZXYsICJCR1glZCBRTE0gbW9kZTogWEZJXG4iLCBiZ3gtPmJneF9pZCk7Ci0JCX0gZWxzZSB7Ci0JCQliZ3gtPnFsbV9tb2RlID0gUUxNX01PREVfMTBHX0tSXzRYMTsKLQkJCWRldl9pbmZvKGRldiwgIkJHWCVkIFFMTSBtb2RlOiAxMEdfS1JcbiIsIGJneC0+Ymd4X2lkKTsKLQkJfQorCQlpZiAoIWxtYWMtPnVzZV90cmFpbmluZykKKwkJCWRldl9pbmZvKGRldiwgIiVzOiBYRklcbiIsIChjaGFyICopc3RyKTsKKwkJZWxzZQorCQkJZGV2X2luZm8oZGV2LCAiJXM6IDEwR19LUlxuIiwgKGNoYXIgKilzdHIpOwogCQlicmVhazsKIAljYXNlIEJHWF9NT0RFX1hMQVVJOgotCQlpZiAoIXRyYWluX2VuKSB7Ci0JCQliZ3gtPnFsbV9tb2RlID0gUUxNX01PREVfWExBVUlfMVg0OwotCQkJZGV2X2luZm8oZGV2LCAiQkdYJWQgUUxNIG1vZGU6IFhMQVVJXG4iLCBiZ3gtPmJneF9pZCk7Ci0JCX0gZWxzZSB7Ci0JCQliZ3gtPnFsbV9tb2RlID0gUUxNX01PREVfNDBHX0tSNF8xWDQ7Ci0JCQlkZXZfaW5mbyhkZXYsICJCR1glZCBRTE0gbW9kZTogNDBHX0tSNFxuIiwgYmd4LT5iZ3hfaWQpOwotCQl9CisJCWlmICghbG1hYy0+dXNlX3RyYWluaW5nKQorCQkJZGV2X2luZm8oZGV2LCAiJXM6IFhMQVVJXG4iLCAoY2hhciAqKXN0cik7CisJCWVsc2UKKwkJCWRldl9pbmZvKGRldiwgIiVzOiA0MEdfS1I0XG4iLCAoY2hhciAqKXN0cik7CisJCWJyZWFrOworCWNhc2UgQkdYX01PREVfUVNHTUlJOgorCQlpZiAoKGxtYWNpZCA9PSAwKSAmJgorCQkgICAgKGJneF9nZXRfbGFuZTJzZHNfY2ZnKGJneCwgbG1hYykgIT0gbG1hY2lkKSkKKwkJCXJldHVybjsKKwkJaWYgKChsbWFjaWQgPT0gMikgJiYKKwkJICAgIChiZ3hfZ2V0X2xhbmUyc2RzX2NmZyhiZ3gsIGxtYWMpID09IGxtYWNpZCkpCisJCQlyZXR1cm47CisJCWRldl9pbmZvKGRldiwgIiVzOiBRU0dNSUlcbiIsIChjaGFyICopc3RyKTsKKwkJYnJlYWs7CisJY2FzZSBCR1hfTU9ERV9SR01JSToKKwkJZGV2X2luZm8oZGV2LCAiJXM6IFJHTUlJXG4iLCAoY2hhciAqKXN0cik7CisJCWJyZWFrOworCWNhc2UgQkdYX01PREVfSU5WQUxJRDoKKwkJLyogTm90aGluZyB0byBkbyAqLworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxtYWNfc2V0X2xhbmUyc2RzKHN0cnVjdCBiZ3ggKmJneCwgc3RydWN0IGxtYWMgKmxtYWMpCit7CisJc3dpdGNoIChsbWFjLT5sbWFjX3R5cGUpIHsKKwljYXNlIEJHWF9NT0RFX1NHTUlJOgorCWNhc2UgQkdYX01PREVfWEZJOgorCQlsbWFjLT5sYW5lX3RvX3NkcyA9IGxtYWMtPmxtYWNpZDsKKwkJYnJlYWs7CisJY2FzZSBCR1hfTU9ERV9YQVVJOgorCWNhc2UgQkdYX01PREVfWExBVUk6CisJY2FzZSBCR1hfTU9ERV9SR01JSToKKwkJbG1hYy0+bGFuZV90b19zZHMgPSAweEU0OworCQlicmVhazsKKwljYXNlIEJHWF9NT0RFX1JYQVVJOgorCQlsbWFjLT5sYW5lX3RvX3NkcyA9IChsbWFjLT5sbWFjaWQpID8gMHhFIDogMHg0OworCQlicmVhazsKKwljYXNlIEJHWF9NT0RFX1FTR01JSToKKwkJLyogVGhlcmUgaXMgbm8gd2F5IHRvIGRldGVybWluZSBpZiBETE0wLzIgaXMgUVNHTUlJIG9yCisJCSAqIERMTTEvMyBpcyBjb25maWd1cmVkIHRvIFFTR01JSSBhcyBib290bG9hZGVyIHdpbGwKKwkJICogY29uZmlndXJlIGFsbCBMTUFDcywgc28gdGFrZSB3aGF0ZXZlciBpcyBjb25maWd1cmVkCisJCSAqIGJ5IGxvdyBsZXZlbCBmaXJtd2FyZS4KKwkJICovCisJCWxtYWMtPmxhbmVfdG9fc2RzID0gYmd4X2dldF9sYW5lMnNkc19jZmcoYmd4LCBsbWFjKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJYmd4LT5xbG1fbW9kZSA9IFFMTV9NT0RFX1NHTUlJOwotCQlkZXZfaW5mbyhkZXYsICJCR1glZCBRTE0gZGVmYXVsdCBtb2RlOiBTR01JSVxuIiwgYmd4LT5iZ3hfaWQpOworCQlsbWFjLT5sYW5lX3RvX3NkcyA9IDA7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgbG1hY19zZXRfdHJhaW5pbmcoc3RydWN0IGJneCAqYmd4LCBzdHJ1Y3QgbG1hYyAqbG1hYywgaW50IGxtYWNpZCkKK3sKKwlpZiAoKGxtYWMtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV8xMEdfS1IpICYmCisJICAgIChsbWFjLT5sbWFjX3R5cGUgIT0gQkdYX01PREVfNDBHX0tSKSkgeworCQlsbWFjLT51c2VfdHJhaW5pbmcgPSAwOworCQlyZXR1cm47CisJfQorCisJbG1hYy0+dXNlX3RyYWluaW5nID0gYmd4X3JlZ19yZWFkKGJneCwgbG1hY2lkLCBCR1hfU1BVWF9CUl9QTURfQ1JUTCkgJgorCQkJCQkJCVNQVV9QTURfQ1JUTF9UUkFJTl9FTjsKK30KKworc3RhdGljIHZvaWQgYmd4X3NldF9sbWFjX2NvbmZpZyhzdHJ1Y3QgYmd4ICpiZ3gsIHU4IGlkeCkKK3sKKwlzdHJ1Y3QgbG1hYyAqbG1hYzsKKwlzdHJ1Y3QgbG1hYyAqb2xtYWM7CisJdTY0IGNtcl9jZmc7CisJdTggbG1hY190eXBlOworCXU4IGxhbmVfdG9fc2RzOworCisJbG1hYyA9ICZiZ3gtPmxtYWNbaWR4XTsKKworCWlmICghYmd4LT5pc19kbG0gfHwgYmd4LT5pc19yZ3gpIHsKKwkJLyogUmVhZCBMTUFDMCB0eXBlIHRvIGZpZ3VyZSBvdXQgUUxNIG1vZGUKKwkJICogVGhpcyBpcyBjb25maWd1cmVkIGJ5IGxvdyBsZXZlbCBmaXJtd2FyZQorCQkgKi8KKwkJY21yX2NmZyA9IGJneF9yZWdfcmVhZChiZ3gsIDAsIEJHWF9DTVJYX0NGRyk7CisJCWxtYWMtPmxtYWNfdHlwZSA9IChjbXJfY2ZnID4+IDgpICYgMHgwNzsKKwkJaWYgKGJneC0+aXNfcmd4KQorCQkJbG1hYy0+bG1hY190eXBlID0gQkdYX01PREVfUkdNSUk7CisJCWxtYWNfc2V0X3RyYWluaW5nKGJneCwgbG1hYywgMCk7CisJCWxtYWNfc2V0X2xhbmUyc2RzKGJneCwgbG1hYyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBPbiA4MXh4IEJHWCBjYW4gYmUgc3BsaXQgYWNyb3NzIDIgRExNcworCSAqIGZpcm13YXJlIHByb2dyYW1zIGxtYWNfdHlwZSBvZiBMTUFDMCBhbmQgTE1BQzIKKwkgKi8KKwlpZiAoKGlkeCA9PSAwKSB8fCAoaWR4ID09IDIpKSB7CisJCWNtcl9jZmcgPSBiZ3hfcmVnX3JlYWQoYmd4LCBpZHgsIEJHWF9DTVJYX0NGRyk7CisJCWxtYWNfdHlwZSA9ICh1OCkoKGNtcl9jZmcgPj4gOCkgJiAweDA3KTsKKwkJbGFuZV90b19zZHMgPSAodTgpKGNtcl9jZmcgJiAweEZGKTsKKwkJLyogQ2hlY2sgaWYgY29uZmlnIGlzIG5vdCByZXNldCB2YWx1ZSAqLworCQlpZiAoKGxtYWNfdHlwZSA9PSAwKSAmJiAobGFuZV90b19zZHMgPT0gMHhFNCkpCisJCQlsbWFjLT5sbWFjX3R5cGUgPSBCR1hfTU9ERV9JTlZBTElEOworCQllbHNlCisJCQlsbWFjLT5sbWFjX3R5cGUgPSBsbWFjX3R5cGU7CisJCWxtYWNfc2V0X3RyYWluaW5nKGJneCwgbG1hYywgbG1hYy0+bG1hY2lkKTsKKwkJbG1hY19zZXRfbGFuZTJzZHMoYmd4LCBsbWFjKTsKKworCQkvKiBTZXQgTE1BQyB0eXBlIG9mIG90aGVyIGxtYWMgb24gc2FtZSBETE0gaS5lIExNQUMgMS8zICovCisJCW9sbWFjID0gJmJneC0+bG1hY1tpZHggKyAxXTsKKwkJb2xtYWMtPmxtYWNfdHlwZSA9IGxtYWMtPmxtYWNfdHlwZTsKKwkJbG1hY19zZXRfdHJhaW5pbmcoYmd4LCBvbG1hYywgb2xtYWMtPmxtYWNpZCk7CisJCWxtYWNfc2V0X2xhbmUyc2RzKGJneCwgb2xtYWMpOworCX0KK30KKworc3RhdGljIGJvb2wgaXNfZGxtMF9pbl9iZ3hfbW9kZShzdHJ1Y3QgYmd4ICpiZ3gpCit7CisJc3RydWN0IGxtYWMgKmxtYWM7CisKKwlpZiAoIWJneC0+aXNfZGxtKQorCQlyZXR1cm4gdHJ1ZTsKKworCWxtYWMgPSAmYmd4LT5sbWFjWzBdOworCWlmIChsbWFjLT5sbWFjX3R5cGUgPT0gQkdYX01PREVfSU5WQUxJRCkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGJneF9nZXRfcWxtX21vZGUoc3RydWN0IGJneCAqYmd4KQoreworCXN0cnVjdCBsbWFjICpsbWFjOworCXN0cnVjdCBsbWFjICpsbWFjMDE7CisJc3RydWN0IGxtYWMgKmxtYWMyMzsKKwl1OCAgaWR4OworCisJLyogSW5pdCBhbGwgTE1BQydzIHR5cGUgdG8gaW52YWxpZCAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgYmd4LT5tYXhfbG1hYzsgaWR4KyspIHsKKwkJbG1hYyA9ICZiZ3gtPmxtYWNbaWR4XTsKKwkJbG1hYy0+bG1hY2lkID0gaWR4OworCQlsbWFjLT5sbWFjX3R5cGUgPSBCR1hfTU9ERV9JTlZBTElEOworCQlsbWFjLT51c2VfdHJhaW5pbmcgPSBmYWxzZTsKKwl9CisKKwkvKiBJdCBpcyBhc3N1bWVkIHRoYXQgbG93IGxldmVsIGZpcm13YXJlIHNldHMgdGhpcyB2YWx1ZSAqLworCWJneC0+bG1hY19jb3VudCA9IGJneF9yZWdfcmVhZChiZ3gsIDAsIEJHWF9DTVJfUlhfTE1BQ1MpICYgMHg3OworCWlmIChiZ3gtPmxtYWNfY291bnQgPiBiZ3gtPm1heF9sbWFjKQorCQliZ3gtPmxtYWNfY291bnQgPSBiZ3gtPm1heF9sbWFjOworCisJZm9yIChpZHggPSAwOyBpZHggPCBiZ3gtPm1heF9sbWFjOyBpZHgrKykKKwkJYmd4X3NldF9sbWFjX2NvbmZpZyhiZ3gsIGlkeCk7CisKKwlpZiAoIWJneC0+aXNfZGxtIHx8IGJneC0+aXNfcmd4KSB7CisJCWJneF9wcmludF9xbG1fbW9kZShiZ3gsIDApOworCQlyZXR1cm47CisJfQorCisJaWYgKGJneC0+bG1hY19jb3VudCkgeworCQliZ3hfcHJpbnRfcWxtX21vZGUoYmd4LCAwKTsKKwkJYmd4X3ByaW50X3FsbV9tb2RlKGJneCwgMik7CisJfQorCisJLyogSWYgRExNMCBpcyBub3QgaW4gQkdYIG1vZGUgdGhlbiBMTUFDMC8xIGhhdmUKKwkgKiB0byBiZSBjb25maWd1cmVkIHdpdGggc2VyZGVzIGxhbmVzIG9mIERMTTEKKwkgKi8KKwlpZiAoaXNfZGxtMF9pbl9iZ3hfbW9kZShiZ3gpIHx8IChiZ3gtPmxtYWNfY291bnQgPiAyKSkKKwkJcmV0dXJuOworCWZvciAoaWR4ID0gMDsgaWR4IDwgYmd4LT5sbWFjX2NvdW50OyBpZHgrKykgeworCQlsbWFjMDEgPSAmYmd4LT5sbWFjW2lkeF07CisJCWxtYWMyMyA9ICZiZ3gtPmxtYWNbaWR4ICsgMl07CisJCWxtYWMwMS0+bG1hY190eXBlID0gbG1hYzIzLT5sbWFjX3R5cGU7CisJCWxtYWMwMS0+bGFuZV90b19zZHMgPSBsbWFjMjMtPmxhbmVfdG9fc2RzOwogCX0KIH0KIApAQCAtMTA0Miw3ICsxMTY1LDcgQEAKIAkJfQogCiAJCWxtYWMrKzsKLQkJaWYgKGxtYWMgPT0gTUFYX0xNQUNfUEVSX0JHWCkgeworCQlpZiAobG1hYyA9PSBiZ3gtPm1heF9sbWFjKSB7CiAJCQlvZl9ub2RlX3B1dChub2RlKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xMDg3LDYgKzEyMTAsNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJc3RydWN0IGJneCAqYmd4ID0gTlVMTDsKIAl1OCBsbWFjOworCXUxNiBzZGV2aWQ7CiAKIAliZ3ggPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmJneCksIEdGUF9LRVJORUwpOwogCWlmICghYmd4KQpAQCAtMTExNSwxMCArMTIzOSwzMCBAQAogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbnM7CiAJfQotCWJneC0+Ymd4X2lkID0gKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBQQ0lfQ0ZHX1JFR19CQVJfTlVNKSA+PiAyNCkgJiAxOwotCWJneC0+Ymd4X2lkICs9IG5pY19nZXRfbm9kZV9pZChwZGV2KSAqIE1BWF9CR1hfUEVSX0NOODhYWDsKIAotCWJneF92bmljW2JneC0+Ymd4X2lkXSA9IGJneDsKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfREVWSUNFX0lELCAmc2RldmlkKTsKKwlpZiAoc2RldmlkICE9IFBDSV9ERVZJQ0VfSURfVEhVTkRFUl9SR1gpIHsKKwkJYmd4LT5iZ3hfaWQgPQorCQkgICAgKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBQQ0lfQ0ZHX1JFR19CQVJfTlVNKSA+PiAyNCkgJiAxOworCQliZ3gtPmJneF9pZCArPSBuaWNfZ2V0X25vZGVfaWQocGRldikgKiBNQVhfQkdYX1BFUl9OT0RFOworCQliZ3gtPm1heF9sbWFjID0gTUFYX0xNQUNfUEVSX0JHWDsKKwkJYmd4X3ZuaWNbYmd4LT5iZ3hfaWRdID0gYmd4OworCX0gZWxzZSB7CisJCWJneC0+aXNfcmd4ID0gdHJ1ZTsKKwkJYmd4LT5tYXhfbG1hYyA9IDE7CisJCWJneC0+Ymd4X2lkID0gTUFYX0JHWF9QRVJfQ044MVhYIC0gMTsKKwkJYmd4X3ZuaWNbYmd4LT5iZ3hfaWRdID0gYmd4OworCQl4Y3ZfaW5pdF9odygpOworCX0KKworCS8qIE9uIDgxeHggYWxsIGFyZSBETE1zIGFuZCBvbiA4M3h4IHRoZXJlIGFyZSAzIEJHWCBRTE1zIGFuZCBvbmUKKwkgKiBCR1ggaS5lIEJHWDIgY2FuIGJlIHNwbGl0IGFjcm9zcyAyIERMTXMuCisJICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX1NVQlNZU1RFTV9JRCwgJnNkZXZpZCk7CisJaWYgKChzZGV2aWQgPT0gUENJX1NVQlNZU19ERVZJRF84MVhYX0JHWCkgfHwKKwkgICAgKChzZGV2aWQgPT0gUENJX1NVQlNZU19ERVZJRF84M1hYX0JHWCkgJiYgKGJneC0+Ymd4X2lkID09IDIpKSkKKwkJYmd4LT5pc19kbG0gPSB0cnVlOworCiAJYmd4X2dldF9xbG1fbW9kZShiZ3gpOwogCiAJZXJyID0gYmd4X2luaXRfcGh5KGJneCk7CkBAIC0xMTMzLDYgKzEyNzcsOCBAQAogCQlpZiAoZXJyKSB7CiAJCQlkZXZfZXJyKGRldiwgIkJHWCVkIGZhaWxlZCB0byBlbmFibGUgbG1hYyVkXG4iLAogCQkJCWJneC0+Ymd4X2lkLCBsbWFjKTsKKwkJCXdoaWxlIChsbWFjKQorCQkJCWJneF9sbWFjX2Rpc2FibGUoYmd4LCAtLWxtYWMpOwogCQkJZ290byBlcnJfZW5hYmxlOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvdGh1bmRlcl9iZ3guaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL3RodW5kZXJfYmd4LmgKaW5kZXggNDIwMTBkMi4uZDU5YzcxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvdGh1bmRlcl9iZ3guaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci90aHVuZGVyX2JneC5oCkBAIC05LDggKzksMjAgQEAKICNpZm5kZWYgVEhVTkRFUl9CR1hfSAogI2RlZmluZSBUSFVOREVSX0JHWF9ICiAKLSNkZWZpbmUgICAgTUFYX0JHWF9USFVOREVSCQkJOCAvKiBNYXggNCBub2RlcywgMiBwZXIgbm9kZSAqLworLyogUENJIGRldmljZSBJRCAqLworI2RlZmluZQlQQ0lfREVWSUNFX0lEX1RIVU5ERVJfQkdYCQkweEEwMjYKKyNkZWZpbmUJUENJX0RFVklDRV9JRF9USFVOREVSX1JHWAkJMHhBMDU0CisKKy8qIFN1YnN5c3RlbSBkZXZpY2UgSURzICovCisjZGVmaW5lIFBDSV9TVUJTWVNfREVWSURfODhYWF9CR1gJCTB4QTEyNgorI2RlZmluZSBQQ0lfU1VCU1lTX0RFVklEXzgxWFhfQkdYCQkweEEyMjYKKyNkZWZpbmUgUENJX1NVQlNZU19ERVZJRF84M1hYX0JHWAkJMHhBMzI2CisKKyNkZWZpbmUgICAgTUFYX0JHWF9USFVOREVSCQkJOCAvKiBNYXggMiBub2RlcywgNCBwZXIgbm9kZSAqLwogI2RlZmluZSAgICBNQVhfQkdYX1BFUl9DTjg4WFgJCQkyCisjZGVmaW5lICAgIE1BWF9CR1hfUEVSX0NOODFYWAkJCTMgLyogMiBCR1hzICsgMSBSR1ggKi8KKyNkZWZpbmUgICAgTUFYX0JHWF9QRVJfQ044M1hYCQkJNAorI2RlZmluZSAgICBNQVhfQkdYX1BFUl9OT0RFCQkJNAogI2RlZmluZSAgICBNQVhfTE1BQ19QRVJfQkdYCQkJNAogI2RlZmluZSAgICBNQVhfQkdYX0NIQU5TX1BFUl9MTUFDCQkxNgogI2RlZmluZSAgICBNQVhfRE1BQ19QRVJfTE1BQwkJCTgKQEAgLTE4LDggKzMwLDYgQEAKIAogI2RlZmluZSAgICBNQVhfRE1BQ19QRVJfTE1BQ19UTlNfQllQQVNTX01PREUJMgogCi0jZGVmaW5lICAgIE1BWF9MTUFDCShNQVhfQkdYX1BFUl9DTjg4WFggKiBNQVhfTE1BQ19QRVJfQkdYKQotCiAvKiBSZWdpc3RlcnMgKi8KICNkZWZpbmUgQkdYX0NNUlhfQ0ZHCQkJMHgwMAogI2RlZmluZSAgQ01SX1BLVF9UWF9FTgkJCQlCSVRfVUxMKDEzKQpAQCAtMTM2LDYgKzE0Niw3IEBACiAjZGVmaW5lIEJHWF9HTVBfUENTX0FOWF9BTl9SRVNVTFRTCTB4MzAwMjAKICNkZWZpbmUgQkdYX0dNUF9QQ1NfU0dNX0FOX0FEVgkJMHgzMDA2OAogI2RlZmluZSBCR1hfR01QX1BDU19NSVNDWF9DVEwJCTB4MzAwNzgKKyNkZWZpbmUgIFBDU19NSVNDX0NUTF9ESVNQX0VOCQkJQklUX1VMTCgxMykKICNkZWZpbmUgIFBDU19NSVNDX0NUTF9HTVhfRU5PCQkJQklUX1VMTCgxMSkKICNkZWZpbmUgIFBDU19NSVNDX0NUTF9TQU1QX1BUX01BU0sJMHg3RnVsbAogI2RlZmluZSBCR1hfR01QX0dNSV9QUlRYX0NGRwkJMHgzODAyMApAQCAtMTk0LDYgKzIwNSw5IEBACiB2b2lkIGJneF9nZXRfbG1hY19saW5rX3N0YXRlKGludCBub2RlLCBpbnQgYmd4X2lkeCwgaW50IGxtYWNpZCwgdm9pZCAqc3RhdHVzKTsKIHZvaWQgYmd4X2xtYWNfaW50ZXJuYWxfbG9vcGJhY2soaW50IG5vZGUsIGludCBiZ3hfaWR4LAogCQkJCWludCBsbWFjX2lkeCwgYm9vbCBlbmFibGUpOwordm9pZCB4Y3ZfaW5pdF9odyh2b2lkKTsKK3ZvaWQgeGN2X3NldHVwX2xpbmsoYm9vbCBsaW5rX3VwLCBpbnQgbGlua19zcGVlZCk7CisKIHU2NCBiZ3hfZ2V0X3J4X3N0YXRzKGludCBub2RlLCBpbnQgYmd4X2lkeCwgaW50IGxtYWMsIGludCBpZHgpOwogdTY0IGJneF9nZXRfdHhfc3RhdHMoaW50IG5vZGUsIGludCBiZ3hfaWR4LCBpbnQgbG1hYywgaW50IGlkeCk7CiAjZGVmaW5lIEJHWF9SWF9TVEFUU19DT1VOVCAxMQpAQCAtMjEzLDE2ICsyMjcsOSBAQAogCUJHWF9NT0RFX1hMQVVJID0gNCwgLyogNCBsYW5lcywgMTAuMzEyNSBHYmF1ZCAqLwogCUJHWF9NT0RFXzEwR19LUiA9IDMsLyogMSBsYW5lLCAxMC4zMTI1IEdiYXVkICovCiAJQkdYX01PREVfNDBHX0tSID0gNCwvKiA0IGxhbmVzLCAxMC4zMTI1IEdiYXVkICovCi19OwotCi1lbnVtIHFsbV9tb2RlIHsKLQlRTE1fTU9ERV9TR01JSSwgICAgICAgICAvKiBTR01JSSwgZWFjaCBsYW5lIGluZGVwZW5kZW50ICovCi0JUUxNX01PREVfWEFVSV8xWDQsICAgICAgLyogMSBYQVVJIG9yIERYQVVJLCA0IGxhbmVzICovCi0JUUxNX01PREVfUlhBVUlfMlgyLCAgICAgLyogMiBSWEFVSSwgMiBsYW5lcyBlYWNoICovCi0JUUxNX01PREVfWEZJXzRYMSwgICAgICAgLyogNCBYRkksIDEgbGFuZSBlYWNoICovCi0JUUxNX01PREVfWExBVUlfMVg0LCAgICAgLyogMSBYTEFVSSwgNCBsYW5lcyBlYWNoICovCi0JUUxNX01PREVfMTBHX0tSXzRYMSwgICAgLyogNCAxMEdCQVNFLUtSLCAxIGxhbmUgZWFjaCAqLwotCVFMTV9NT0RFXzQwR19LUjRfMVg0LCAgIC8qIDEgNDBHQkFTRS1LUjQsIDQgbGFuZXMgZWFjaCAqLworCUJHWF9NT0RFX1JHTUlJID0gNSwKKwlCR1hfTU9ERV9RU0dNSUkgPSA2LAorCUJHWF9NT0RFX0lOVkFMSUQgPSA3LAogfTsKIAogI2VuZGlmIC8qIFRIVU5ERVJfQkdYX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL3RodW5kZXJfeGN2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci90aHVuZGVyX3hjdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YmVmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci90aHVuZGVyX3hjdi5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IENhdml1bSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbWRpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPgorCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSAidGh1bmRlcl9iZ3guaCIKKworI2RlZmluZSBEUlZfTkFNRQkidGh1bmRlci14Y3YiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjAiCisKKy8qIFJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgWENWX1JFU0VUCQkweDAwCisjZGVmaW5lICAgUE9SVF9FTgkJQklUX1VMTCg2MykKKyNkZWZpbmUgICBDTEtfUkVTRVQJCUJJVF9VTEwoMTUpCisjZGVmaW5lICAgRExMX1JFU0VUCQlCSVRfVUxMKDExKQorI2RlZmluZSAgIENPTVBfRU4JCUJJVF9VTEwoNykKKyNkZWZpbmUgICBUWF9QS1RfUkVTRVQJCUJJVF9VTEwoMykKKyNkZWZpbmUgICBUWF9EQVRBX1JFU0VUCQlCSVRfVUxMKDIpCisjZGVmaW5lICAgUlhfUEtUX1JFU0VUCQlCSVRfVUxMKDEpCisjZGVmaW5lICAgUlhfREFUQV9SRVNFVAkJQklUX1VMTCgwKQorI2RlZmluZSBYQ1ZfRExMX0NUTAkJMHgxMAorI2RlZmluZSAgIENMS1JYX0JZUAkJQklUX1VMTCgyMykKKyNkZWZpbmUgICBDTEtUWF9CWVAJCUJJVF9VTEwoMTUpCisjZGVmaW5lIFhDVl9DT01QX0NUTAkJMHgyMAorI2RlZmluZSAgIERSVl9CWVAJCUJJVF9VTEwoNjMpCisjZGVmaW5lIFhDVl9DVEwJCQkweDMwCisjZGVmaW5lIFhDVl9JTlQJCQkweDQwCisjZGVmaW5lIFhDVl9JTlRfVzFTCQkweDQ4CisjZGVmaW5lIFhDVl9JTlRfRU5BX1cxQwkJMHg1MAorI2RlZmluZSBYQ1ZfSU5UX0VOQV9XMVMJCTB4NTgKKyNkZWZpbmUgWENWX0lOQk5EX1NUQVRVUwkweDgwCisjZGVmaW5lIFhDVl9CQVRDSF9DUkRfUkVUCTB4MTAwCisKK3N0cnVjdCB4Y3YgeworCXZvaWQgX19pb21lbQkJKnJlZ19iYXNlOworCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgeGN2ICp4Y3Y7CisKKy8qIFN1cHBvcnRlZCBkZXZpY2VzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgeGN2X2lkX3RhYmxlW10gPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQ0FWSVVNLCAweEEwNTYpIH0sCisJeyAwLCB9ICAvKiBlbmQgb2YgdGFibGUgKi8KK307CisKK01PRFVMRV9BVVRIT1IoIkNhdml1bSBJbmMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ2F2aXVtIFRodW5kZXIgUkdYL1hDViBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB4Y3ZfaWRfdGFibGUpOworCit2b2lkIHhjdl9pbml0X2h3KHZvaWQpCit7CisJdTY0ICBjZmc7CisKKwkvKiBUYWtlIERMTCBvdXQgb2YgcmVzZXQgKi8KKwljZmcgPSByZWFkcV9yZWxheGVkKHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworCWNmZyAmPSB+RExMX1JFU0VUOworCXdyaXRlcV9yZWxheGVkKGNmZywgeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7CisKKwkvKiBUYWtlIGNsb2NrIHRyZWUgb3V0IG9mIHJlc2V0ICovCisJY2ZnID0gcmVhZHFfcmVsYXhlZCh4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKKwljZmcgJj0gfkNMS19SRVNFVDsKKwl3cml0ZXFfcmVsYXhlZChjZmcsIHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworCS8qIFdhaXQgZm9yIERMTCB0byBsb2NrICovCisJbXNsZWVwKDEpOworCisJLyogQ29uZmlndXJlIERMTCAtIGVuYWJsZSBvciBieXBhc3MKKwkgKiBUWCBubyBieXBhc3MsIFJYIGJ5cGFzcworCSAqLworCWNmZyA9IHJlYWRxX3JlbGF4ZWQoeGN2LT5yZWdfYmFzZSArIFhDVl9ETExfQ1RMKTsKKwljZmcgJj0gfjB4RkYwMzsKKwljZmcgfD0gQ0xLUlhfQllQOworCXdyaXRlcV9yZWxheGVkKGNmZywgeGN2LT5yZWdfYmFzZSArIFhDVl9ETExfQ1RMKTsKKworCS8qIEVuYWJsZSBjb21wZW5zYXRpb24gY29udHJvbGxlciBhbmQgZm9yY2UgdGhlCisJICogd3JpdGUgdG8gYmUgdmlzaWJsZSB0byBIVyBieSByZWFkaWcgYmFjay4KKwkgKi8KKwljZmcgPSByZWFkcV9yZWxheGVkKHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworCWNmZyB8PSBDT01QX0VOOworCXdyaXRlcV9yZWxheGVkKGNmZywgeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7CisJcmVhZHFfcmVsYXhlZCh4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKKwkvKiBXYWl0IGZvciBjb21wZW5zYXRpb24gc3RhdGUgbWFjaGluZSB0byBsb2NrICovCisJbXNsZWVwKDEwKTsKKworCS8qIGVuYWJsZSB0aGUgWENWIGJsb2NrICovCisJY2ZnID0gcmVhZHFfcmVsYXhlZCh4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKKwljZmcgfD0gUE9SVF9FTjsKKwl3cml0ZXFfcmVsYXhlZChjZmcsIHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworCisJY2ZnID0gcmVhZHFfcmVsYXhlZCh4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKKwljZmcgfD0gQ0xLX1JFU0VUOworCXdyaXRlcV9yZWxheGVkKGNmZywgeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7Cit9CitFWFBPUlRfU1lNQk9MKHhjdl9pbml0X2h3KTsKKwordm9pZCB4Y3Zfc2V0dXBfbGluayhib29sIGxpbmtfdXAsIGludCBsaW5rX3NwZWVkKQoreworCXU2NCAgY2ZnOworCWludCBzcGVlZCA9IDI7CisKKwlpZiAoIXhjdikgeworCQlkZXZfZXJyKCZ4Y3YtPnBkZXYtPmRldiwKKwkJCSJYQ1YgaW5pdCBub3QgZG9uZSwgcHJvYmUgbWF5IGhhdmUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChsaW5rX3NwZWVkID09IDEwMCkKKwkJc3BlZWQgPSAxOworCWVsc2UgaWYgKGxpbmtfc3BlZWQgPT0gMTApCisJCXNwZWVkID0gMDsKKworCWlmIChsaW5rX3VwKSB7CisJCS8qIHNldCBvcGVyYXRpbmcgc3BlZWQgKi8KKwkJY2ZnID0gcmVhZHFfcmVsYXhlZCh4Y3YtPnJlZ19iYXNlICsgWENWX0NUTCk7CisJCWNmZyAmPSB+MHgwMzsKKwkJY2ZnIHw9IHNwZWVkOworCQl3cml0ZXFfcmVsYXhlZChjZmcsIHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfQ1RMKTsKKworCQkvKiBSZXNldCBkYXRhcGF0aHMgKi8KKwkJY2ZnID0gcmVhZHFfcmVsYXhlZCh4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKKwkJY2ZnIHw9IFRYX0RBVEFfUkVTRVQgfCBSWF9EQVRBX1JFU0VUOworCQl3cml0ZXFfcmVsYXhlZChjZmcsIHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworCisJCS8qIEVuYWJsZSB0aGUgcGFja2V0IGZsb3cgKi8KKwkJY2ZnID0gcmVhZHFfcmVsYXhlZCh4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKKwkJY2ZnIHw9IFRYX1BLVF9SRVNFVCB8IFJYX1BLVF9SRVNFVDsKKwkJd3JpdGVxX3JlbGF4ZWQoY2ZnLCB4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKKworCQkvKiBSZXR1cm4gY3JlZGl0cyB0byBSR1ggKi8KKwkJd3JpdGVxX3JlbGF4ZWQoMHgwMSwgeGN2LT5yZWdfYmFzZSArIFhDVl9CQVRDSF9DUkRfUkVUKTsKKwl9IGVsc2UgeworCQkvKiBEaXNhYmxlIHBhY2tldCBmbG93ICovCisJCWNmZyA9IHJlYWRxX3JlbGF4ZWQoeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7CisJCWNmZyAmPSB+KFRYX1BLVF9SRVNFVCB8IFJYX1BLVF9SRVNFVCk7CisJCXdyaXRlcV9yZWxheGVkKGNmZywgeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7CisJCXJlYWRxX3JlbGF4ZWQoeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7CisJfQorfQorRVhQT1JUX1NZTUJPTCh4Y3Zfc2V0dXBfbGluayk7CisKK3N0YXRpYyBpbnQgeGN2X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWludCBlcnI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKworCXhjdiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgeGN2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF4Y3YpCisJCXJldHVybiAtRU5PTUVNOworCXhjdi0+cGRldiA9IHBkZXY7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgeGN2KTsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9rZnJlZTsKKwl9CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoZGV2LCAiUENJIHJlcXVlc3QgcmVnaW9ucyBmYWlsZWQgMHgleFxuIiwgZXJyKTsKKwkJZ290byBlcnJfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJLyogTUFQIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisJeGN2LT5yZWdfYmFzZSA9IHBjaW1faW9tYXAocGRldiwgUENJX0NGR19SRUdfQkFSX05VTSwgMCk7CisJaWYgKCF4Y3YtPnJlZ19iYXNlKSB7CisJCWRldl9lcnIoZGV2LCAiWENWOiBDYW5ub3QgbWFwIENTUiBtZW1vcnkgc3BhY2UsIGFib3J0aW5nXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb25zOworCX0KKworCXJldHVybiAwOworCitlcnJfcmVsZWFzZV9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworZXJyX2tmcmVlOgorCWRldm1fa2ZyZWUoZGV2LCB4Y3YpOworCXhjdiA9IE5VTEw7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgeGN2X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCisJaWYgKHhjdikgeworCQlkZXZtX2tmcmVlKGRldiwgeGN2KTsKKwkJeGN2ID0gTlVMTDsKKwl9CisKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHhjdl9kcml2ZXIgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUgPSB4Y3ZfaWRfdGFibGUsCisJLnByb2JlID0geGN2X3Byb2JlLAorCS5yZW1vdmUgPSB4Y3ZfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgeGN2X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcHJfaW5mbygiJXMsIHZlciAlc1xuIiwgRFJWX05BTUUsIERSVl9WRVJTSU9OKTsKKworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ4Y3ZfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHhjdl9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmeGN2X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHhjdl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdCh4Y3ZfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvTWFrZWZpbGUKaW5kZXggYWNlMGFiOS4uYzZiNzFmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L01ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogCiBvYmotJChDT05GSUdfQ0hFTFNJT19UNCkgKz0gY3hnYjQubwogCi1jeGdiNC1vYmpzIDo9IGN4Z2I0X21haW4ubyBsMnQubyB0NF9ody5vIHNnZS5vIGNsaXBfdGJsLm8gY3hnYjRfZXRodG9vbC5vCitjeGdiNC1vYmpzIDo9IGN4Z2I0X21haW4ubyBsMnQubyB0NF9ody5vIHNnZS5vIGNsaXBfdGJsLm8gY3hnYjRfZXRodG9vbC5vIGN4Z2I0X3VsZC5vIHNjaGVkLm8gY3hnYjRfZmlsdGVyLm8gY3hnYjRfdGNfdTMyLm8KIGN4Z2I0LSQoQ09ORklHX0NIRUxTSU9fVDRfRENCKSArPSAgY3hnYjRfZGNiLm8KIGN4Z2I0LSQoQ09ORklHX0NIRUxTSU9fVDRfRkNPRSkgKz0gIGN4Z2I0X2Zjb2UubwogY3hnYjQtJChDT05GSUdfREVCVUdfRlMpICs9IGN4Z2I0X2RlYnVnZnMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNC5oCmluZGV4IDJlMmFhOWYuLjI4ZTY1M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0LmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDQgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTUzLDYgKzUzLDggQEAKICNpbmNsdWRlICJjeGdiNF91bGQuaCIKIAogI2RlZmluZSBDSF9XQVJOKGFkYXAsIGZtdCwgLi4uKSBkZXZfd2FybihhZGFwLT5wZGV2X2RldiwgZm10LCAjIyBfX1ZBX0FSR1NfXykKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGFkYXB0ZXJfbGlzdDsKK2V4dGVybiBzdHJ1Y3QgbXV0ZXggdWxkX211dGV4OwogCiBlbnVtIHsKIAlNQVhfTlBPUlRTCT0gNCwgICAgIC8qIG1heCAjIG9mIHBvcnRzICovCkBAIC0zMzgsMTIgKzM0MCwxNCBAQAogCWVudW0gY2hpcF90eXBlIGNoaXA7ICAgICAgICAgICAgICAgLyogY2hpcCBjb2RlICovCiAJc3RydWN0IGFyY2hfc3BlY2lmaWNfcGFyYW1zIGFyY2g7ICAvKiBjaGlwIHNwZWNpZmljIHBhcmFtcyAqLwogCXVuc2lnbmVkIGNoYXIgb2ZmbG9hZDsKKwl1bnNpZ25lZCBjaGFyIGNyeXB0bzsJCS8qIEhXIGNhcGFiaWxpdHkgZm9yIGNyeXB0byAqLwogCiAJdW5zaWduZWQgY2hhciBieXBhc3M7CiAKIAl1bnNpZ25lZCBpbnQgb2ZsZHFfd3JfY3JlZDsKIAlib29sIHVscHR4X21lbXdyaXRlX2RzZ2w7ICAgICAgICAgIC8qIHVzZSBvZiBUNSBEU0dMIGFsbG93ZWQgKi8KIAorCXVuc2lnbmVkIGludCBuc2NoZWRfY2xzOyAgICAgICAgICAvKiBudW1iZXIgb2YgdHJhZmZpYyBjbGFzc2VzICovCiAJdW5zaWduZWQgaW50IG1heF9vcmRpcmRfcXA7ICAgICAgIC8qIE1heCByZWFkIGRlcHRoIHBlciBSRE1BIFFQICovCiAJdW5zaWduZWQgaW50IG1heF9pcmRfYWRhcHRlcjsgICAgIC8qIE1heCByZWFkIGRlcHRoIHBlciBhZGFwdGVyICovCiB9OwpAQCAtNDAzLDcgKzQwNyw2IEBACiAJc3RydWN0IGZ3X2hkciBmd19oZHI7CiB9OwogCi0KIHN0cnVjdCB0cmFjZV9wYXJhbXMgewogCXUzMiBkYXRhW1RSQUNFX0xFTiAvIDRdOwogCXUzMiBtYXNrW1RSQUNFX0xFTiAvIDRdOwpAQCAtNDE5LDggKzQyMiw4IEBACiAJdW5zaWduZWQgc2hvcnQgc3VwcG9ydGVkOyAgICAgICAgLyogbGluayBjYXBhYmlsaXRpZXMgKi8KIAl1bnNpZ25lZCBzaG9ydCBhZHZlcnRpc2luZzsgICAgICAvKiBhZHZlcnRpc2VkIGNhcGFiaWxpdGllcyAqLwogCXVuc2lnbmVkIHNob3J0IGxwX2FkdmVydGlzaW5nOyAgIC8qIHBlZXIgYWR2ZXJ0aXNlZCBjYXBhYmlsaXRpZXMgKi8KLQl1bnNpZ25lZCBzaG9ydCByZXF1ZXN0ZWRfc3BlZWQ7ICAvKiBzcGVlZCB1c2VyIGhhcyByZXF1ZXN0ZWQgKi8KLQl1bnNpZ25lZCBzaG9ydCBzcGVlZDsgICAgICAgICAgICAvKiBhY3R1YWwgbGluayBzcGVlZCAqLworCXVuc2lnbmVkIGludCAgIHJlcXVlc3RlZF9zcGVlZDsgIC8qIHNwZWVkIHVzZXIgaGFzIHJlcXVlc3RlZCAqLworCXVuc2lnbmVkIGludCAgIHNwZWVkOyAgICAgICAgICAgIC8qIGFjdHVhbCBsaW5rIHNwZWVkICovCiAJdW5zaWduZWQgY2hhciAgcmVxdWVzdGVkX2ZjOyAgICAgLyogZmxvdyBjb250cm9sIHVzZXIgaGFzIHJlcXVlc3RlZCAqLwogCXVuc2lnbmVkIGNoYXIgIGZjOyAgICAgICAgICAgICAgIC8qIGFjdHVhbCBsaW5rIGZsb3cgY29udHJvbCAqLwogCXVuc2lnbmVkIGNoYXIgIGF1dG9uZWc7ICAgICAgICAgIC8qIGF1dG9uZWdvdGlhdGluZz8gKi8KQEAgLTQzNCwxMSArNDM3LDYgQEAKIAlNQVhfRVRIX1FTRVRTID0gMzIsICAgICAgICAgICAvKiAjIG9mIEV0aGVybmV0IFR4L1J4IHF1ZXVlIHNldHMgKi8KIAlNQVhfT0ZMRF9RU0VUUyA9IDE2LCAgICAgICAgICAvKiAjIG9mIG9mZmxvYWQgVHgsIGlzY3NpIFJ4IHF1ZXVlIHNldHMgKi8KIAlNQVhfQ1RSTF9RVUVVRVMgPSBOQ0hBTiwgICAgICAvKiAjIG9mIGNvbnRyb2wgVHggcXVldWVzICovCi0JTUFYX1JETUFfUVVFVUVTID0gTkNIQU4sICAgICAgLyogIyBvZiBzdHJlYW1pbmcgUkRNQSBSeCBxdWV1ZXMgKi8KLQlNQVhfUkRNQV9DSVFTID0gMzIsICAgICAgICAvKiAjIG9mICBSRE1BIGNvbmNlbnRyYXRvciBJUXMgKi8KLQotCS8qICMgb2Ygc3RyZWFtaW5nIGlTQ1NJVCBSeCBxdWV1ZXMgKi8KLQlNQVhfSVNDU0lUX1FVRVVFUyA9IE1BWF9PRkxEX1FTRVRTLAogfTsKIAogZW51bSB7CkBAIC00NTUsOCArNDUzLDcgQEAKIGVudW0gewogCUlOR1FfRVhUUkFTID0gMiwgICAgICAgIC8qIGZpcm13YXJlIGV2ZW50IHF1ZXVlIGFuZCAqLwogCQkJCS8qICAgZm9yd2FyZGVkIGludGVycnVwdHMgKi8KLQlNQVhfSU5HUSA9IE1BWF9FVEhfUVNFVFMgKyBNQVhfT0ZMRF9RU0VUUyArIE1BWF9SRE1BX1FVRVVFUyArCi0JCSAgIE1BWF9SRE1BX0NJUVMgKyBNQVhfSVNDU0lUX1FVRVVFUyArIElOR1FfRVhUUkFTLAorCU1BWF9JTkdRID0gTUFYX0VUSF9RU0VUUyArIElOR1FfRVhUUkFTLAogfTsKIAogc3RydWN0IGFkYXB0ZXI7CkBAIC00OTMsNiArNDkwLDcgQEAKICNlbmRpZiAvKiBDT05GSUdfQ0hFTFNJT19UNF9GQ09FICovCiAJYm9vbCByeHRzdGFtcDsgIC8qIEVuYWJsZSBUUyAqLwogCXN0cnVjdCBod3RzdGFtcF9jb25maWcgdHN0YW1wX2NvbmZpZzsKKwlzdHJ1Y3Qgc2NoZWRfdGFibGUgKnNjaGVkX3RibDsKIH07CiAKIHN0cnVjdCBkZW50cnk7CkBAIC01MTAsNiArNTA4LDEwIEBACiAJRldfT0ZMRF9DT05OICAgICAgID0gKDEgPDwgOSksCiB9OwogCitlbnVtIHsKKwlVTFBfQ1JZUFRPX0xPT0tBU0lERSA9IDEgPDwgMCwKK307CisKIHN0cnVjdCByeF9zd19kZXNjOwogCiBzdHJ1Y3Qgc2dlX2ZsIHsgICAgICAgICAgICAgICAgICAgICAvKiBTR0UgZnJlZS1idWZmZXIgcXVldWUgc3RhdGUgKi8KQEAgLTY4MCwxNyArNjgyLDI0IEBACiAJdTggZnVsbDsgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBUeCByaW5nIGlzIGZ1bGwgKi8KIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAorc3RydWN0IHNnZV91bGRfcnhxX2luZm8geworCWNoYXIgbmFtZVtJRk5BTVNJWl07CS8qIG5hbWUgb2YgVUxEIGRyaXZlciAqLworCXN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnVsZHJ4cTsgLyogUnhxJ3MgZm9yIFVMRCAqLworCXUxNiAqbXNpeF90Ymw7CQkvKiBtc2l4X3RibCBmb3IgdWxkICovCisJdTE2ICpyc3BxX2lkOwkJLyogcmVzcG9uc2UgcXVldWUgaWQncyBvZiByeHEgKi8KKwl1MTYgbnJ4cTsJCS8qICMgb2YgaW5ncmVzcyB1bGQgcXVldWVzICovCisJdTE2IG5jaXE7CQkvKiAjIG9mIGNvbXBsZXRpb24gcXVldWVzICovCisJdTggdWxkOwkJCS8qIHVsZCB0eXBlICovCit9OworCiBzdHJ1Y3Qgc2dlIHsKIAlzdHJ1Y3Qgc2dlX2V0aF90eHEgZXRodHhxW01BWF9FVEhfUVNFVFNdOwogCXN0cnVjdCBzZ2Vfb2ZsZF90eHEgb2ZsZHR4cVtNQVhfT0ZMRF9RU0VUU107CiAJc3RydWN0IHNnZV9jdHJsX3R4cSBjdHJscVtNQVhfQ1RSTF9RVUVVRVNdOwogCiAJc3RydWN0IHNnZV9ldGhfcnhxIGV0aHJ4cVtNQVhfRVRIX1FTRVRTXTsKLQlzdHJ1Y3Qgc2dlX29mbGRfcnhxIGlzY3NpcnhxW01BWF9PRkxEX1FTRVRTXTsKLQlzdHJ1Y3Qgc2dlX29mbGRfcnhxIGlzY3NpdHJ4cVtNQVhfSVNDU0lUX1FVRVVFU107Ci0Jc3RydWN0IHNnZV9vZmxkX3J4cSByZG1hcnhxW01BWF9SRE1BX1FVRVVFU107Ci0Jc3RydWN0IHNnZV9vZmxkX3J4cSByZG1hY2lxW01BWF9SRE1BX0NJUVNdOwogCXN0cnVjdCBzZ2VfcnNwcSBmd19ldnRxIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisJc3RydWN0IHNnZV91bGRfcnhxX2luZm8gKip1bGRfcnhxX2luZm87CiAKIAlzdHJ1Y3Qgc2dlX3JzcHEgaW50cnEgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAlzcGlubG9ja190IGludHJxX2xvY2s7CkBAIC02OTgsMTQgKzcwNyw4IEBACiAJdTE2IG1heF9ldGhxc2V0czsgICAgICAgICAgIC8qICMgb2YgYXZhaWxhYmxlIEV0aGVybmV0IHF1ZXVlIHNldHMgKi8KIAl1MTYgZXRocXNldHM7ICAgICAgICAgICAgICAgLyogIyBvZiBhY3RpdmUgRXRoZXJuZXQgcXVldWUgc2V0cyAqLwogCXUxNiBldGh0eHFfcm92ZXI7ICAgICAgICAgICAvKiBUeCBxdWV1ZSB0byBjbGVhbiB1cCBuZXh0ICovCi0JdTE2IGlzY3NpcXNldHM7ICAgICAgICAgICAgICAvKiAjIG9mIGFjdGl2ZSBpU0NTSSBxdWV1ZSBzZXRzICovCi0JdTE2IG5pc2NzaXRxOyAgICAgICAgICAgICAgIC8qICMgb2YgYXZhaWxhYmxlIGlTQ1NUIFJ4IHF1ZXVlcyAqLwotCXUxNiByZG1hcXM7ICAgICAgICAgICAgICAgICAvKiAjIG9mIGF2YWlsYWJsZSBSRE1BIFJ4IHF1ZXVlcyAqLwotCXUxNiByZG1hY2lxczsgICAgICAgICAgICAgICAvKiAjIG9mIGF2YWlsYWJsZSBSRE1BIGNvbmNlbnRyYXRvciBJUXMgKi8KLQl1MTYgaXNjc2lfcnhxW01BWF9PRkxEX1FTRVRTXTsKLQl1MTYgaXNjc2l0X3J4cVtNQVhfSVNDU0lUX1FVRVVFU107Ci0JdTE2IHJkbWFfcnhxW01BWF9SRE1BX1FVRVVFU107Ci0JdTE2IHJkbWFfY2lxW01BWF9SRE1BX0NJUVNdOworCXUxNiBvZmxkcXNldHM7ICAgICAgICAgICAgICAvKiAjIG9mIGFjdGl2ZSBvZmxkIHF1ZXVlIHNldHMgKi8KKwl1MTYgbnFzX3Blcl91bGQ7CSAgICAvKiAjIG9mIFJ4IHF1ZXVlcyBwZXIgVUxEICovCiAJdTE2IHRpbWVyX3ZhbFtTR0VfTlRJTUVSU107CiAJdTggY291bnRlcl92YWxbU0dFX05DT1VOVEVSU107CiAJdTMyIGZsX3BnX29yZGVyOyAgICAgICAgICAgIC8qIGxhcmdlIHBhZ2UgYWxsb2NhdGlvbiBzaXplICovCkBAIC03MjksMTAgKzczMiw3IEBACiB9OwogCiAjZGVmaW5lIGZvcl9lYWNoX2V0aHJ4cShzZ2UsIGkpIGZvciAoaSA9IDA7IGkgPCAoc2dlKS0+ZXRocXNldHM7IGkrKykKLSNkZWZpbmUgZm9yX2VhY2hfaXNjc2lyeHEoc2dlLCBpKSBmb3IgKGkgPSAwOyBpIDwgKHNnZSktPmlzY3NpcXNldHM7IGkrKykKLSNkZWZpbmUgZm9yX2VhY2hfaXNjc2l0cnhxKHNnZSwgaSkgZm9yIChpID0gMDsgaSA8IChzZ2UpLT5uaXNjc2l0cTsgaSsrKQotI2RlZmluZSBmb3JfZWFjaF9yZG1hcnhxKHNnZSwgaSkgZm9yIChpID0gMDsgaSA8IChzZ2UpLT5yZG1hcXM7IGkrKykKLSNkZWZpbmUgZm9yX2VhY2hfcmRtYWNpcShzZ2UsIGkpIGZvciAoaSA9IDA7IGkgPCAoc2dlKS0+cmRtYWNpcXM7IGkrKykKKyNkZWZpbmUgZm9yX2VhY2hfb2ZsZHR4cShzZ2UsIGkpIGZvciAoaSA9IDA7IGkgPCAoc2dlKS0+b2ZsZHFzZXRzOyBpKyspCiAKIHN0cnVjdCBsMnRfZGF0YTsKIApAQCAtNzU3LDYgKzc1NywyMyBAQAogCXU4IGFkZHJbRVRIX0FMRU5dOwogfTsKIAorc3RydWN0IHVsZF9tc2l4X2JtYXAgeworCXVuc2lnbmVkIGxvbmcgKm1zaXhfYm1hcDsKKwl1bnNpZ25lZCBpbnQgbWFwc2l6ZTsKKwlzcGlubG9ja190IGxvY2s7IC8qIGxvY2sgZm9yIGFjcXVpcmluZyBiaXRtYXAgKi8KK307CisKK3N0cnVjdCB1bGRfbXNpeF9pbmZvIHsKKwl1bnNpZ25lZCBzaG9ydCB2ZWM7CisJY2hhciBkZXNjW0lGTkFNU0laICsgMTBdOworCXVuc2lnbmVkIGludCBpZHg7Cit9OworCitzdHJ1Y3QgdmZfaW5mbyB7CisJdW5zaWduZWQgY2hhciB2Zl9tYWNfYWRkcltFVEhfQUxFTl07CisJYm9vbCBwZl9zZXRfbWFjOworfTsKKwogc3RydWN0IGFkYXB0ZXIgewogCXZvaWQgX19pb21lbSAqcmVnczsKIAl2b2lkIF9faW9tZW0gKmJhcjI7CkBAIC03NjcsNiArNzg0LDcgQEAKIAl1bnNpZ25lZCBpbnQgbWJveDsKIAl1bnNpZ25lZCBpbnQgcGY7CiAJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBhZGFwX2lkeDsKIAllbnVtIGNoaXBfdHlwZSBjaGlwOwogCiAJaW50IG1zZ19lbmFibGU7CkBAIC03NzksNiArNzk3LDkgQEAKIAkJdW5zaWduZWQgc2hvcnQgdmVjOwogCQljaGFyIGRlc2NbSUZOQU1TSVogKyAxMF07CiAJfSBtc2l4X2luZm9bTUFYX0lOR1EgKyAxXTsKKwlzdHJ1Y3QgdWxkX21zaXhfaW5mbyAqbXNpeF9pbmZvX3VsZHM7IC8qIG1zaXggaW5mbyBmb3IgdWxkJ3MgKi8KKwlzdHJ1Y3QgdWxkX21zaXhfYm1hcCBtc2l4X2JtYXBfdWxkczsgLyogbXNpeCBiaXRtYXAgZm9yIGFsbCB1bGQgKi8KKwlpbnQgbXNpX2lkeDsKIAogCXN0cnVjdCBkb29yYmVsbF9zdGF0cyBkYl9zdGF0czsKIAlzdHJ1Y3Qgc2dlIHNnZTsKQEAgLTc4Niw2ICs4MDcsOSBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpwb3J0W01BWF9OUE9SVFNdOwogCXU4IGNoYW5fbWFwW05DSEFOXTsgICAgICAgICAgICAgICAgICAgLyogY2hhbm5lbCAtPiBwb3J0IG1hcCAqLwogCisJc3RydWN0IHZmX2luZm8gKnZmaW5mbzsKKwl1OCBudW1fdmZzOworCiAJdTMyIGZpbHRlcl9tb2RlOwogCXVuc2lnbmVkIGludCBsMnRfc3RhcnQ7CiAJdW5zaWduZWQgaW50IGwydF9lbmQ7CkBAIC03OTMsNyArODE3LDEwIEBACiAJdW5zaWduZWQgaW50IGNsaXB0X3N0YXJ0OwogCXVuc2lnbmVkIGludCBjbGlwdF9lbmQ7CiAJc3RydWN0IGNsaXBfdGJsICpjbGlwdDsKKwlzdHJ1Y3QgY3hnYjRfdWxkX2luZm8gKnVsZDsKIAl2b2lkICp1bGRfaGFuZGxlW0NYR0I0X1VMRF9NQVhdOworCXVuc2lnbmVkIGludCBudW1fdWxkOworCXVuc2lnbmVkIGludCBudW1fb2ZsZF91bGQ7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0X25vZGU7CiAJc3RydWN0IGxpc3RfaGVhZCByY3Vfbm9kZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG1hY19obGlzdDsgLyogbGlzdCBvZiBNQUMgYWRkcmVzc2VzIGluIE1QUyBIYXNoICovCkBAIC04MTMsNiArODQwLDggQEAKICNkZWZpbmUgVDRfT1NfTE9HX01CT1hfQ01EUyAyNTYKIAlzdHJ1Y3QgbWJveF9jbWRfbG9nICptYm94X2xvZzsKIAorCXN0cnVjdCBtdXRleCB1bGRfbXV0ZXg7CisKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3Jvb3Q7CiAJYm9vbCB1c2VfYmQ7ICAgICAvKiBVc2UgU0dFIEJhY2sgRG9vciBpbnRmYyBmb3IgcmVhZGluZyBTR0UgQ29udGV4dHMgKi8KIAlib29sIHRyYWNlX3JzczsJLyogMSBpbXBsaWVzIHRoYXQgZGlmZmVyZW50IFJTUyBmbGl0IHBlciBmaWx0ZXIgaXMKQEAgLTgyMiw2ICs4NTEsNTggQEAKIAogCXNwaW5sb2NrX3Qgc3RhdHNfbG9jazsKIAlzcGlubG9ja190IHdpbjBfbG9jayBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworCisJLyogVEMgdTMyIG9mZmxvYWQgKi8KKwlzdHJ1Y3QgY3hnYjRfdGNfdTMyX3RhYmxlICp0Y191MzI7Cit9OworCisvKiBTdXBwb3J0IGZvciAic2NoZWQtY2xhc3MiIGNvbW1hbmQgdG8gYWxsb3cgYSBUWCBTY2hlZHVsaW5nIENsYXNzIHRvIGJlCisgKiBwcm9ncmFtbWVkIHdpdGggdmFyaW91cyBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3QgY2hfc2NoZWRfcGFyYW1zIHsKKwlzOCAgIHR5cGU7ICAgICAgICAgICAgICAgICAgICAgLyogcGFja2V0IG9yIGZsb3cgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlzOCAgIGxldmVsOyAgICAvKiBzY2hlZHVsZXIgaGllcmFyY2h5IGxldmVsICovCisJCQlzOCAgIG1vZGU7ICAgICAvKiBwZXItY2xhc3Mgb3IgcGVyLWZsb3cgKi8KKwkJCXM4ICAgcmF0ZXVuaXQ7IC8qIGJpdCBvciBwYWNrZXQgcmF0ZSAqLworCQkJczggICByYXRlbW9kZTsgLyogJXBvcnQgcmVsYXRpdmUgb3Iga2JwcyBhYnNvbHV0ZSAqLworCQkJczggICBjaGFubmVsOyAgLyogc2NoZWR1bGVyIGNoYW5uZWwgWzAuLk5dICovCisJCQlzOCAgIGNsYXNzOyAgICAvKiBzY2hlZHVsZXIgY2xhc3MgWzAuLk5dICovCisJCQlzMzIgIG1pbnJhdGU7ICAvKiBtaW5pbXVtIHJhdGUgKi8KKwkJCXMzMiAgbWF4cmF0ZTsgIC8qIG1heGltdW0gcmF0ZSAqLworCQkJczE2ICB3ZWlnaHQ7ICAgLyogcGVyY2VudCB3ZWlnaHQgKi8KKwkJCXMxNiAgcGt0c2l6ZTsgIC8qIGF2ZXJhZ2UgcGFja2V0IHNpemUgKi8KKwkJfSBwYXJhbXM7CisJfSB1OworfTsKKworZW51bSB7CisJU0NIRURfQ0xBU1NfVFlQRV9QQUNLRVQgPSAwLCAgICAvKiBjbGFzcyB0eXBlICovCit9OworCitlbnVtIHsKKwlTQ0hFRF9DTEFTU19MRVZFTF9DTF9STCA9IDAsICAgIC8qIGNsYXNzIHJhdGUgbGltaXRlciAqLworfTsKKworZW51bSB7CisJU0NIRURfQ0xBU1NfTU9ERV9DTEFTUyA9IDAsICAgICAvKiBwZXItY2xhc3Mgc2NoZWR1bGluZyAqLworfTsKKworZW51bSB7CisJU0NIRURfQ0xBU1NfUkFURVVOSVRfQklUUyA9IDAsICAvKiBiaXQgcmF0ZSBzY2hlZHVsaW5nICovCit9OworCitlbnVtIHsKKwlTQ0hFRF9DTEFTU19SQVRFTU9ERV9BQlMgPSAxLCAgIC8qIEtiL3MgKi8KK307CisKKy8qIFN1cHBvcnQgZm9yICJzY2hlZF9xdWV1ZSIgY29tbWFuZCB0byBhbGxvdyBvbmUgb3IgbW9yZSBOSUMgVFggUXVldWVzCisgKiB0byBiZSBib3VuZCB0byBhIFRYIFNjaGVkdWxpbmcgQ2xhc3MuCisgKi8KK3N0cnVjdCBjaF9zY2hlZF9xdWV1ZSB7CisJczggICBxdWV1ZTsgICAgLyogcXVldWUgaW5kZXggKi8KKwlzOCAgIGNsYXNzOyAgICAvKiBjbGFzcyBpbmRleCAqLwogfTsKIAogLyogRGVmaW5lZCBiaXQgd2lkdGggb2YgdXNlciBkZWZpbmFibGUgZmlsdGVyIHR1cGxlcwpAQCAtOTQ3LDExICsxMDI4LDQ3IEBACiAJVkxBTl9SRVdSSVRFCiB9OwogCisvKiBIb3N0IHNoYWRvdyBjb3B5IG9mIGluZ3Jlc3MgZmlsdGVyIGVudHJ5LiAgVGhpcyBpcyBpbiBob3N0IG5hdGl2ZSBmb3JtYXQKKyAqIGFuZCBkb2Vzbid0IG1hdGNoIHRoZSBvcmRlcmluZyBvciBiaXQgb3JkZXIsIGV0Yy4gb2YgdGhlIGhhcmR3YXJlIG9mIHRoZQorICogZmlybXdhcmUgY29tbWFuZC4gIFRoZSB1c2Ugb2YgYml0LWZpZWxkIHN0cnVjdHVyZSBlbGVtZW50cyBpcyBwdXJlbHkgdG8KKyAqIHJlbWluZCBvdXJzZWx2ZXMgb2YgdGhlIGZpZWxkIHNpemUgbGltaXRhdGlvbnMgYW5kIHNhdmUgbWVtb3J5IGluIHRoZSBjYXNlCisgKiB3aGVyZSB0aGUgZmlsdGVyIHRhYmxlIGlzIGxhcmdlLgorICovCitzdHJ1Y3QgZmlsdGVyX2VudHJ5IHsKKwkvKiBBZG1pbmlzdHJhdGl2ZSBmaWVsZHMgZm9yIGZpbHRlci4gKi8KKwl1MzIgdmFsaWQ6MTsgICAgICAgICAgICAvKiBmaWx0ZXIgYWxsb2NhdGVkIGFuZCB2YWxpZCAqLworCXUzMiBsb2NrZWQ6MTsgICAgICAgICAgIC8qIGZpbHRlciBpcyBhZG1pbmlzdHJhdGl2ZWx5IGxvY2tlZCAqLworCisJdTMyIHBlbmRpbmc6MTsgICAgICAgICAgLyogZmlsdGVyIGFjdGlvbiBpcyBwZW5kaW5nIGZpcm13YXJlIHJlcGx5ICovCisJdTMyIHNtdGlkeDo4OyAgICAgICAgICAgLyogU291cmNlIE1BQyBUYWJsZSBpbmRleCBmb3Igc21hYyAqLworCXN0cnVjdCBmaWx0ZXJfY3R4ICpjdHg7IC8qIENhbGxlcidzIGNvbXBsZXRpb24gaG9vayAqLworCXN0cnVjdCBsMnRfZW50cnkgKmwydDsgIC8qIExheWVyIFR3byBUYWJsZSBlbnRyeSBmb3IgZG1hYyAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7IC8qIEFzc29jaWF0ZWQgbmV0IGRldmljZSAqLworCXUzMiB0aWQ7ICAgICAgICAgICAgICAgIC8qIFRoaXMgd2lsbCBzdG9yZSB0aGUgYWN0dWFsIHRpZCAqLworCisJLyogVGhlIGZpbHRlciBpdHNlbGYuICBNb3N0IG9mIHRoaXMgaXMgYSBzdHJhaWdodCBjb3B5IG9mIGluZm9ybWF0aW9uCisJICogcHJvdmlkZWQgYnkgdGhlIGV4dGVuZGVkIGlvY3RsKCkuICBTb21lIGZpZWxkcyBhcmUgdHJhbnNsYXRlZCB0bworCSAqIGludGVybmFsIGZvcm1zIC0tIGZvciBpbnN0YW5jZSB0aGUgSW5ncmVzcyBRdWV1ZSBJRCBwYXNzZWQgaW4gZnJvbQorCSAqIHRoZSBpb2N0bCgpIGlzIHRyYW5zbGF0ZWQgaW50byB0aGUgQWJzb2x1dGUgSW5ncmVzcyBRdWV1ZSBJRC4KKwkgKi8KKwlzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gZnM7Cit9OworCiBzdGF0aWMgaW5saW5lIGludCBpc19vZmZsb2FkKGNvbnN0IHN0cnVjdCBhZGFwdGVyICphZGFwKQogewogCXJldHVybiBhZGFwLT5wYXJhbXMub2ZmbG9hZDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgaXNfcGNpX3VsZChjb25zdCBzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gYWRhcC0+cGFyYW1zLmNyeXB0bzsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfdWxkKGNvbnN0IHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCXJldHVybiAoYWRhcC0+cGFyYW1zLm9mZmxvYWQgfHwgYWRhcC0+cGFyYW1zLmNyeXB0byk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdTMyIHQ0X3JlYWRfcmVnKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1MzIgcmVnX2FkZHIpCiB7CiAJcmV0dXJuIHJlYWRsKGFkYXAtPnJlZ3MgKyByZWdfYWRkcik7CkBAIC0xMTc4LDYgKzEyOTUsOCBAQAogaW50IHQ0X3NnZV9hbGxvY19jdHJsX3R4cShzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV9jdHJsX3R4cSAqdHhxLAogCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaXFpZCwKIAkJCSAgdW5zaWduZWQgaW50IGNtcGxxaWQpOworaW50IHQ0X3NnZV9tb2RfY3RybF90eHEoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCBlcWlkLAorCQkJdW5zaWduZWQgaW50IGNtcGxxaWQpOwogaW50IHQ0X3NnZV9hbGxvY19vZmxkX3R4cShzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV9vZmxkX3R4cSAqdHhxLAogCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaXFpZCk7CiBpcnFyZXR1cm5fdCB0NF9zZ2VfaW50cl9tc2l4KGludCBpcnEsIHZvaWQgKmNvb2tpZSk7CkBAIC0xMTg1LDggKzEzMDQsNiBAQAogdm9pZCB0NF9zZ2Vfc3RhcnQoc3RydWN0IGFkYXB0ZXIgKmFkYXApOwogdm9pZCB0NF9zZ2Vfc3RvcChzdHJ1Y3QgYWRhcHRlciAqYWRhcCk7CiBpbnQgY3hnYl9idXN5X3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpKTsKLWludCBjeGdiNF9zZXRfcnNwcV9pbnRyX3BhcmFtcyhzdHJ1Y3Qgc2dlX3JzcHEgKnEsIHVuc2lnbmVkIGludCB1cywKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY250KTsKIHZvaWQgY3hnYjRfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogaW50IGN4Z2I0X3dyaXRlX3Jzcyhjb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSwgY29uc3QgdTE2ICpxdWV1ZXMpOwogZXh0ZXJuIGludCBkYmZpZm9faW50X3RocmVzaDsKQEAgLTEyODksNiArMTQwNiwxOCBAQAogCXJldHVybiBhICYgMHgzZjsKIH0KIAoraW50IGN4Z2I0X3NldF9yc3BxX2ludHJfcGFyYW1zKHN0cnVjdCBzZ2VfcnNwcSAqcSwgdW5zaWduZWQgaW50IHVzLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBjbnQpOworc3RhdGljIGlubGluZSB2b2lkIGluaXRfcnNwcShzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV9yc3BxICpxLAorCQkJICAgICB1bnNpZ25lZCBpbnQgdXMsIHVuc2lnbmVkIGludCBjbnQsCisJCQkgICAgIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBpbnQgaXFlX3NpemUpCit7CisJcS0+YWRhcCA9IGFkYXA7CisJY3hnYjRfc2V0X3JzcHFfaW50cl9wYXJhbXMocSwgdXMsIGNudCk7CisJcS0+aXFlX2xlbiA9IGlxZV9zaXplOworCXEtPnNpemUgPSBzaXplOworfQorCiB2b2lkIHQ0X3dyaXRlX2luZGlyZWN0KHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgYWRkcl9yZWcsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgZGF0YV9yZWcsIGNvbnN0IHUzMiAqdmFscywKIAkJICAgICAgIHVuc2lnbmVkIGludCBucmVncywgdW5zaWduZWQgaW50IHN0YXJ0X2lkeCk7CkBAIC0xNTE0LDYgKzE2NDMsOSBAQAogCQkJIGludCBmaWx0ZXJfaW5kZXgsIGludCAqZW5hYmxlZCk7CiBpbnQgdDRfZndhZGRyc3BhY2Vfd3JpdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCBtYm94LAogCQkJIHUzMiBhZGRyLCB1MzIgdmFsKTsKK2ludCB0NF9zY2hlZF9wYXJhbXMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCB0eXBlLCBpbnQgbGV2ZWwsIGludCBtb2RlLAorCQkgICAgaW50IHJhdGV1bml0LCBpbnQgcmF0ZW1vZGUsIGludCBjaGFubmVsLCBpbnQgY2xhc3MsCisJCSAgICBpbnQgbWlucmF0ZSwgaW50IG1heHJhdGUsIGludCB3ZWlnaHQsIGludCBwa3RzaXplKTsKIHZvaWQgdDRfc2dlX2RlY29kZV9pZG1hX3N0YXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgc3RhdGUpOwogdm9pZCB0NF9mcmVlX21lbSh2b2lkICphZGRyKTsKIHZvaWQgdDRfaWRtYV9tb25pdG9yX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCkBAIC0xNTIxLDQgKzE2NTMsMTEgQEAKIHZvaWQgdDRfaWRtYV9tb25pdG9yKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAogCQkgICAgIHN0cnVjdCBzZ2VfaWRtYV9tb25pdG9yX3N0YXRlICppZG1hLAogCQkgICAgIGludCBoeiwgaW50IHRpY2tzKTsKK2ludCB0NF9zZXRfdmZfbWFjX2FjbChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IHZmLAorCQkgICAgICB1bnNpZ25lZCBpbnQgbmFkZHIsIHU4ICphZGRyKTsKK3ZvaWQgdDRfdWxkX21lbV9mcmVlKHN0cnVjdCBhZGFwdGVyICphZGFwKTsKK2ludCB0NF91bGRfbWVtX2FsbG9jKHN0cnVjdCBhZGFwdGVyICphZGFwKTsKK3ZvaWQgdDRfdWxkX2NsZWFuX3VwKHN0cnVjdCBhZGFwdGVyICphZGFwKTsKK3ZvaWQgdDRfcmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXIodm9pZCk7Cit2b2lkIGZyZWVfcnNwcV9mbChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV9yc3BxICpycSwgc3RydWN0IHNnZV9mbCAqZmwpOwogI2VuZGlmIC8qIF9fQ1hHQjRfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X2RlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfZGVidWdmcy5jCmluZGV4IDkxZmI1MDguLjIwNDU1ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfZGVidWdmcy5jCkBAIC0yNDMyLDE3ICsyNDMyLDExIEBACiB7CiAJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBzZXEtPnByaXZhdGU7CiAJaW50IGV0aF9lbnRyaWVzID0gRElWX1JPVU5EX1VQKGFkYXAtPnNnZS5ldGhxc2V0cywgNCk7Ci0JaW50IGlzY3NpX2VudHJpZXMgPSBESVZfUk9VTkRfVVAoYWRhcC0+c2dlLmlzY3NpcXNldHMsIDQpOwotCWludCBpc2NzaXRfZW50cmllcyA9IERJVl9ST1VORF9VUChhZGFwLT5zZ2UubmlzY3NpdHEsIDQpOwotCWludCByZG1hX2VudHJpZXMgPSBESVZfUk9VTkRfVVAoYWRhcC0+c2dlLnJkbWFxcywgNCk7Ci0JaW50IGNpcV9lbnRyaWVzID0gRElWX1JPVU5EX1VQKGFkYXAtPnNnZS5yZG1hY2lxcywgNCk7CisJaW50IG9mbGRfZW50cmllcyA9IERJVl9ST1VORF9VUChhZGFwLT5zZ2Uub2ZsZHFzZXRzLCA0KTsKIAlpbnQgY3RybF9lbnRyaWVzID0gRElWX1JPVU5EX1VQKE1BWF9DVFJMX1FVRVVFUywgNCk7CiAJaW50IGksIHIgPSAodWludHB0cl90KXYgLSAxOwotCWludCBpc2NzaV9pZHggPSByIC0gZXRoX2VudHJpZXM7Ci0JaW50IGlzY3NpdF9pZHggPSBpc2NzaV9pZHggLSBpc2NzaV9lbnRyaWVzOwotCWludCByZG1hX2lkeCA9IGlzY3NpdF9pZHggLSBpc2NzaXRfZW50cmllczsKLQlpbnQgY2lxX2lkeCA9IHJkbWFfaWR4IC0gcmRtYV9lbnRyaWVzOwotCWludCBjdHJsX2lkeCA9ICBjaXFfaWR4IC0gY2lxX2VudHJpZXM7CisJaW50IG9mbGRfaWR4ID0gciAtIGV0aF9lbnRyaWVzOworCWludCBjdHJsX2lkeCA9ICBvZmxkX2lkeCAtIG9mbGRfZW50cmllczsKIAlpbnQgZnFfaWR4ID0gIGN0cmxfaWR4IC0gY3RybF9lbnRyaWVzOwogCiAJaWYgKHIpCkBAIC0yNTE4LDExOSArMjUxMiwxNyBAQAogCQlSTCgiRkxMb3c6IiwgZmwubG93KTsKIAkJUkwoIkZMU3RhcnZpbmc6IiwgZmwuc3RhcnZpbmcpOwogCi0JfSBlbHNlIGlmIChpc2NzaV9pZHggPCBpc2NzaV9lbnRyaWVzKSB7Ci0JCWNvbnN0IHN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnJ4ID0KLQkJCSZhZGFwLT5zZ2UuaXNjc2lyeHFbaXNjc2lfaWR4ICogNF07CisJfSBlbHNlIGlmIChvZmxkX2lkeCA8IG9mbGRfZW50cmllcykgewogCQljb25zdCBzdHJ1Y3Qgc2dlX29mbGRfdHhxICp0eCA9Ci0JCQkmYWRhcC0+c2dlLm9mbGR0eHFbaXNjc2lfaWR4ICogNF07Ci0JCWludCBuID0gbWluKDQsIGFkYXAtPnNnZS5pc2NzaXFzZXRzIC0gNCAqIGlzY3NpX2lkeCk7CisJCQkmYWRhcC0+c2dlLm9mbGR0eHFbb2ZsZF9pZHggKiA0XTsKKwkJaW50IG4gPSBtaW4oNCwgYWRhcC0+c2dlLm9mbGRxc2V0cyAtIDQgKiBvZmxkX2lkeCk7CiAKLQkJUygiUVR5cGU6IiwgImlTQ1NJIik7CisJCVMoIlFUeXBlOiIsICJPRkxELVR4cSIpOwogCQlUKCJUeFEgSUQ6IiwgcS5jbnR4dF9pZCk7CiAJCVQoIlR4USBzaXplOiIsIHEuc2l6ZSk7CiAJCVQoIlR4USBpbnVzZToiLCBxLmluX3VzZSk7CiAJCVQoIlR4USBDSURYOiIsIHEuY2lkeCk7CiAJCVQoIlR4USBQSURYOiIsIHEucGlkeCk7Ci0JCVIoIlJzcFEgSUQ6IiwgcnNwcS5hYnNfaWQpOwotCQlSKCJSc3BRIHNpemU6IiwgcnNwcS5zaXplKTsKLQkJUigiUnNwUUUgc2l6ZToiLCByc3BxLmlxZV9sZW4pOwotCQlSKCJSc3BRIENJRFg6IiwgcnNwcS5jaWR4KTsKLQkJUigiUnNwUSBHZW46IiwgcnNwcS5nZW4pOwotCQlTMygidSIsICJJbnRyIGRlbGF5OiIsIHF0aW1lcl92YWwoYWRhcCwgJnJ4W2ldLnJzcHEpKTsKLQkJUzMoInUiLCAiSW50ciBwa3RjbnQ6IiwKLQkJICAgYWRhcC0+c2dlLmNvdW50ZXJfdmFsW3J4W2ldLnJzcHEucGt0Y250X2lkeF0pOwotCQlSKCJGTCBJRDoiLCBmbC5jbnR4dF9pZCk7Ci0JCVIoIkZMIHNpemU6IiwgZmwuc2l6ZSAtIDgpOwotCQlSKCJGTCBwZW5kOiIsIGZsLnBlbmRfY3JlZCk7Ci0JCVIoIkZMIGF2YWlsOiIsIGZsLmF2YWlsKTsKLQkJUigiRkwgUElEWDoiLCBmbC5waWR4KTsKLQkJUigiRkwgQ0lEWDoiLCBmbC5jaWR4KTsKLQkJUkwoIlJ4UGFja2V0czoiLCBzdGF0cy5wa3RzKTsKLQkJUkwoIlJ4SW1tUGt0czoiLCBzdGF0cy5pbW0pOwotCQlSTCgiUnhOb01lbToiLCBzdGF0cy5ub21lbSk7Ci0JCVJMKCJGTEFsbG9jRXJyOiIsIGZsLmFsbG9jX2ZhaWxlZCk7Ci0JCVJMKCJGTExyZ0FsY0VycjoiLCBmbC5sYXJnZV9hbGxvY19mYWlsZWQpOwotCQlSTCgiRkxNYXBFcnI6IiwgZmwubWFwcGluZ19lcnIpOwotCQlSTCgiRkxMb3c6IiwgZmwubG93KTsKLQkJUkwoIkZMU3RhcnZpbmc6IiwgZmwuc3RhcnZpbmcpOwotCi0JfSBlbHNlIGlmIChpc2NzaXRfaWR4IDwgaXNjc2l0X2VudHJpZXMpIHsKLQkJY29uc3Qgc3RydWN0IHNnZV9vZmxkX3J4cSAqcnggPQotCQkJJmFkYXAtPnNnZS5pc2NzaXRyeHFbaXNjc2l0X2lkeCAqIDRdOwotCQlpbnQgbiA9IG1pbig0LCBhZGFwLT5zZ2UubmlzY3NpdHEgLSA0ICogaXNjc2l0X2lkeCk7Ci0KLQkJUygiUVR5cGU6IiwgImlTQ1NJVCIpOwotCQlSKCJSc3BRIElEOiIsIHJzcHEuYWJzX2lkKTsKLQkJUigiUnNwUSBzaXplOiIsIHJzcHEuc2l6ZSk7Ci0JCVIoIlJzcFFFIHNpemU6IiwgcnNwcS5pcWVfbGVuKTsKLQkJUigiUnNwUSBDSURYOiIsIHJzcHEuY2lkeCk7Ci0JCVIoIlJzcFEgR2VuOiIsIHJzcHEuZ2VuKTsKLQkJUzMoInUiLCAiSW50ciBkZWxheToiLCBxdGltZXJfdmFsKGFkYXAsICZyeFtpXS5yc3BxKSk7Ci0JCVMzKCJ1IiwgIkludHIgcGt0Y250OiIsCi0JCSAgIGFkYXAtPnNnZS5jb3VudGVyX3ZhbFtyeFtpXS5yc3BxLnBrdGNudF9pZHhdKTsKLQkJUigiRkwgSUQ6IiwgZmwuY250eHRfaWQpOwotCQlSKCJGTCBzaXplOiIsIGZsLnNpemUgLSA4KTsKLQkJUigiRkwgcGVuZDoiLCBmbC5wZW5kX2NyZWQpOwotCQlSKCJGTCBhdmFpbDoiLCBmbC5hdmFpbCk7Ci0JCVIoIkZMIFBJRFg6IiwgZmwucGlkeCk7Ci0JCVIoIkZMIENJRFg6IiwgZmwuY2lkeCk7Ci0JCVJMKCJSeFBhY2tldHM6Iiwgc3RhdHMucGt0cyk7Ci0JCVJMKCJSeEltbVBrdHM6Iiwgc3RhdHMuaW1tKTsKLQkJUkwoIlJ4Tm9NZW06Iiwgc3RhdHMubm9tZW0pOwotCQlSTCgiRkxBbGxvY0VycjoiLCBmbC5hbGxvY19mYWlsZWQpOwotCQlSTCgiRkxMcmdBbGNFcnI6IiwgZmwubGFyZ2VfYWxsb2NfZmFpbGVkKTsKLQkJUkwoIkZMTWFwRXJyOiIsIGZsLm1hcHBpbmdfZXJyKTsKLQkJUkwoIkZMTG93OiIsIGZsLmxvdyk7Ci0JCVJMKCJGTFN0YXJ2aW5nOiIsIGZsLnN0YXJ2aW5nKTsKLQotCX0gZWxzZSBpZiAocmRtYV9pZHggPCByZG1hX2VudHJpZXMpIHsKLQkJY29uc3Qgc3RydWN0IHNnZV9vZmxkX3J4cSAqcnggPQotCQkJCSZhZGFwLT5zZ2UucmRtYXJ4cVtyZG1hX2lkeCAqIDRdOwotCQlpbnQgbiA9IG1pbig0LCBhZGFwLT5zZ2UucmRtYXFzIC0gNCAqIHJkbWFfaWR4KTsKLQotCQlTKCJRVHlwZToiLCAiUkRNQS1DUEwiKTsKLQkJUygiSW50ZXJmYWNlOiIsCi0JCSAgcnhbaV0ucnNwcS5uZXRkZXYgPyByeFtpXS5yc3BxLm5ldGRldi0+bmFtZSA6ICJOL0EiKTsKLQkJUigiUnNwUSBJRDoiLCByc3BxLmFic19pZCk7Ci0JCVIoIlJzcFEgc2l6ZToiLCByc3BxLnNpemUpOwotCQlSKCJSc3BRRSBzaXplOiIsIHJzcHEuaXFlX2xlbik7Ci0JCVIoIlJzcFEgQ0lEWDoiLCByc3BxLmNpZHgpOwotCQlSKCJSc3BRIEdlbjoiLCByc3BxLmdlbik7Ci0JCVMzKCJ1IiwgIkludHIgZGVsYXk6IiwgcXRpbWVyX3ZhbChhZGFwLCAmcnhbaV0ucnNwcSkpOwotCQlTMygidSIsICJJbnRyIHBrdGNudDoiLAotCQkgICBhZGFwLT5zZ2UuY291bnRlcl92YWxbcnhbaV0ucnNwcS5wa3RjbnRfaWR4XSk7Ci0JCVIoIkZMIElEOiIsIGZsLmNudHh0X2lkKTsKLQkJUigiRkwgc2l6ZToiLCBmbC5zaXplIC0gOCk7Ci0JCVIoIkZMIHBlbmQ6IiwgZmwucGVuZF9jcmVkKTsKLQkJUigiRkwgYXZhaWw6IiwgZmwuYXZhaWwpOwotCQlSKCJGTCBQSURYOiIsIGZsLnBpZHgpOwotCQlSKCJGTCBDSURYOiIsIGZsLmNpZHgpOwotCQlSTCgiUnhQYWNrZXRzOiIsIHN0YXRzLnBrdHMpOwotCQlSTCgiUnhJbW1Qa3RzOiIsIHN0YXRzLmltbSk7Ci0JCVJMKCJSeE5vTWVtOiIsIHN0YXRzLm5vbWVtKTsKLQkJUkwoIkZMQWxsb2NFcnI6IiwgZmwuYWxsb2NfZmFpbGVkKTsKLQkJUkwoIkZMTHJnQWxjRXJyOiIsIGZsLmxhcmdlX2FsbG9jX2ZhaWxlZCk7Ci0JCVJMKCJGTE1hcEVycjoiLCBmbC5tYXBwaW5nX2Vycik7Ci0JCVJMKCJGTExvdzoiLCBmbC5sb3cpOwotCQlSTCgiRkxTdGFydmluZzoiLCBmbC5zdGFydmluZyk7Ci0KLQl9IGVsc2UgaWYgKGNpcV9pZHggPCBjaXFfZW50cmllcykgewotCQljb25zdCBzdHJ1Y3Qgc2dlX29mbGRfcnhxICpyeCA9ICZhZGFwLT5zZ2UucmRtYWNpcVtjaXFfaWR4ICogNF07Ci0JCWludCBuID0gbWluKDQsIGFkYXAtPnNnZS5yZG1hY2lxcyAtIDQgKiBjaXFfaWR4KTsKLQotCQlTKCJRVHlwZToiLCAiUkRNQS1DSVEiKTsKLQkJUygiSW50ZXJmYWNlOiIsCi0JCSAgcnhbaV0ucnNwcS5uZXRkZXYgPyByeFtpXS5yc3BxLm5ldGRldi0+bmFtZSA6ICJOL0EiKTsKLQkJUigiUnNwUSBJRDoiLCByc3BxLmFic19pZCk7Ci0JCVIoIlJzcFEgc2l6ZToiLCByc3BxLnNpemUpOwotCQlSKCJSc3BRRSBzaXplOiIsIHJzcHEuaXFlX2xlbik7Ci0JCVIoIlJzcFEgQ0lEWDoiLCByc3BxLmNpZHgpOwotCQlSKCJSc3BRIEdlbjoiLCByc3BxLmdlbik7Ci0JCVMzKCJ1IiwgIkludHIgZGVsYXk6IiwgcXRpbWVyX3ZhbChhZGFwLCAmcnhbaV0ucnNwcSkpOwotCQlTMygidSIsICJJbnRyIHBrdGNudDoiLAotCQkgICBhZGFwLT5zZ2UuY291bnRlcl92YWxbcnhbaV0ucnNwcS5wa3RjbnRfaWR4XSk7Ci0JCVJMKCJSeEFOOiIsIHN0YXRzLmFuKTsKLQkJUkwoIlJ4Tm9NZW06Iiwgc3RhdHMubm9tZW0pOwogCiAJfSBlbHNlIGlmIChjdHJsX2lkeCA8IGN0cmxfZW50cmllcykgewogCQljb25zdCBzdHJ1Y3Qgc2dlX2N0cmxfdHhxICp0eCA9ICZhZGFwLT5zZ2UuY3RybHFbY3RybF9pZHggKiA0XTsKQEAgLTI2NzIsMTAgKzI1NjQsNyBAQAogc3RhdGljIGludCBzZ2VfcXVldWVfZW50cmllcyhjb25zdCBzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKIHsKIAlyZXR1cm4gRElWX1JPVU5EX1VQKGFkYXAtPnNnZS5ldGhxc2V0cywgNCkgKwotCSAgICAgICBESVZfUk9VTkRfVVAoYWRhcC0+c2dlLmlzY3NpcXNldHMsIDQpICsKLQkgICAgICAgRElWX1JPVU5EX1VQKGFkYXAtPnNnZS5uaXNjc2l0cSwgNCkgKwotCSAgICAgICBESVZfUk9VTkRfVVAoYWRhcC0+c2dlLnJkbWFxcywgNCkgKwotCSAgICAgICBESVZfUk9VTkRfVVAoYWRhcC0+c2dlLnJkbWFjaXFzLCA0KSArCisJICAgICAgIERJVl9ST1VORF9VUChhZGFwLT5zZ2Uub2ZsZHFzZXRzLCA0KSArCiAJICAgICAgIERJVl9ST1VORF9VUChNQVhfQ1RSTF9RVUVVRVMsIDQpICsgMTsKIH0KIApAQCAtMjg1OSwxMiArMjc0OCw2IEBACiAJCQkJIHNpemVfbWIgPDwgMjApOwogfQogCi1zdGF0aWMgaW50IGJsb2NrZWRfZmxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3NpemVfdCBibG9ja2VkX2ZsX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICp1YnVmLAogCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewpAQCAtMjkwOCw3ICsyNzkxLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYmxvY2tlZF9mbF9mb3BzID0gewogCS5vd25lciAgID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgPSBibG9ja2VkX2ZsX29wZW4sCisJLm9wZW4gICAgPSBzaW1wbGVfb3BlbiwKIAkucmVhZCAgICA9IGJsb2NrZWRfZmxfcmVhZCwKIAkud3JpdGUgICA9IGJsb2NrZWRfZmxfd3JpdGUsCiAJLmxsc2VlayAgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9maWx0ZXIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA3MzY3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfZmlsdGVyLmMKQEAgLTAsMCArMSw3MjEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUNCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJjeGdiNC5oIgorI2luY2x1ZGUgInQ0X3JlZ3MuaCIKKyNpbmNsdWRlICJsMnQuaCIKKyNpbmNsdWRlICJ0NGZ3X2FwaS5oIgorI2luY2x1ZGUgImN4Z2I0X2ZpbHRlci5oIgorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfZmllbGRfc2V0KHUzMiB2YWwsIHUzMiBtYXNrKQoreworCXJldHVybiB2YWwgfHwgbWFzazsKK30KKworc3RhdGljIGlubGluZSBib29sIHVuc3VwcG9ydGVkKHUzMiBjb25mLCB1MzIgY29uZl9tYXNrLCB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwlyZXR1cm4gIShjb25mICYgY29uZl9tYXNrKSAmJiBpc19maWVsZF9zZXQodmFsLCBtYXNrKTsKK30KKworLyogVmFsaWRhdGUgZmlsdGVyIHNwZWMgYWdhaW5zdCBjb25maWd1cmF0aW9uIGRvbmUgb24gdGhlIGNhcmQuICovCitzdGF0aWMgaW50IHZhbGlkYXRlX2ZpbHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmcykKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldjJhZGFwKGRldik7CisJdTMyIGZjb25mLCBpY29uZjsKKworCS8qIENoZWNrIGZvciB1bmNvbmZpZ3VyZWQgZmllbGRzIGJlaW5nIHVzZWQuICovCisJZmNvbmYgPSBhZGFwdGVyLT5wYXJhbXMudHAudmxhbl9wcmlfbWFwOworCWljb25mID0gYWRhcHRlci0+cGFyYW1zLnRwLmluZ3Jlc3NfY29uZmlnOworCisJaWYgKHVuc3VwcG9ydGVkKGZjb25mLCBGQ09FX0YsIGZzLT52YWwuZmNvZSwgZnMtPm1hc2suZmNvZSkgfHwKKwkgICAgdW5zdXBwb3J0ZWQoZmNvbmYsIFBPUlRfRiwgZnMtPnZhbC5pcG9ydCwgZnMtPm1hc2suaXBvcnQpIHx8CisJICAgIHVuc3VwcG9ydGVkKGZjb25mLCBUT1NfRiwgZnMtPnZhbC50b3MsIGZzLT5tYXNrLnRvcykgfHwKKwkgICAgdW5zdXBwb3J0ZWQoZmNvbmYsIEVUSEVSVFlQRV9GLCBmcy0+dmFsLmV0aHR5cGUsCisJCQlmcy0+bWFzay5ldGh0eXBlKSB8fAorCSAgICB1bnN1cHBvcnRlZChmY29uZiwgTUFDTUFUQ0hfRiwgZnMtPnZhbC5tYWNpZHgsIGZzLT5tYXNrLm1hY2lkeCkgfHwKKwkgICAgdW5zdXBwb3J0ZWQoZmNvbmYsIE1QU0hJVFRZUEVfRiwgZnMtPnZhbC5tYXRjaHR5cGUsCisJCQlmcy0+bWFzay5tYXRjaHR5cGUpIHx8CisJICAgIHVuc3VwcG9ydGVkKGZjb25mLCBGUkFHTUVOVEFUSU9OX0YsIGZzLT52YWwuZnJhZywgZnMtPm1hc2suZnJhZykgfHwKKwkgICAgdW5zdXBwb3J0ZWQoZmNvbmYsIFBST1RPQ09MX0YsIGZzLT52YWwucHJvdG8sIGZzLT5tYXNrLnByb3RvKSB8fAorCSAgICB1bnN1cHBvcnRlZChmY29uZiwgVk5JQ19JRF9GLCBmcy0+dmFsLnBmdmZfdmxkLAorCQkJZnMtPm1hc2sucGZ2Zl92bGQpIHx8CisJICAgIHVuc3VwcG9ydGVkKGZjb25mLCBWTklDX0lEX0YsIGZzLT52YWwub3ZsYW5fdmxkLAorCQkJZnMtPm1hc2sub3ZsYW5fdmxkKSB8fAorCSAgICB1bnN1cHBvcnRlZChmY29uZiwgVkxBTl9GLCBmcy0+dmFsLml2bGFuX3ZsZCwgZnMtPm1hc2suaXZsYW5fdmxkKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJLyogVDQgaW5jb252ZW5pZW50bHkgdXNlcyB0aGUgc2FtZSBGVF9WTklDX0lEX1cgYml0cyBmb3IgYm90aCB0aGUgT3V0ZXIKKwkgKiBWTEFOIFRhZyBhbmQgUEYvVkYvVkZ2bGQgZmllbGRzIGJhc2VkIG9uIFZOSUNfRiBiZWluZyBzZXQKKwkgKiBpbiBUUF9JTkdSRVNTX0NPTkZJRy4gIEhlbnNlIHRoZSBzb21ld2hhdCBjcmF6eSBjaGVja3MKKwkgKiBiZWxvdy4gIEFkZGl0aW9uYWxseSwgc2luY2UgdGhlIFQ0IGZpcm13YXJlIGludGVyZmFjZSBhbHNvCisJICogY2FycmllcyB0aGF0IG92ZXJsYXAsIHdlIG5lZWQgdG8gdHJhbnNsYXRlIGFueSBQRi9WRgorCSAqIHNwZWNpZmljYXRpb24gaW50byB0aGF0IGludGVybmFsIGZvcm1hdCBiZWxvdy4KKwkgKi8KKwlpZiAoaXNfZmllbGRfc2V0KGZzLT52YWwucGZ2Zl92bGQsIGZzLT5tYXNrLnBmdmZfdmxkKSAmJgorCSAgICBpc19maWVsZF9zZXQoZnMtPnZhbC5vdmxhbl92bGQsIGZzLT5tYXNrLm92bGFuX3ZsZCkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAodW5zdXBwb3J0ZWQoaWNvbmYsIFZOSUNfRiwgZnMtPnZhbC5wZnZmX3ZsZCwgZnMtPm1hc2sucGZ2Zl92bGQpIHx8CisJICAgIChpc19maWVsZF9zZXQoZnMtPnZhbC5vdmxhbl92bGQsIGZzLT5tYXNrLm92bGFuX3ZsZCkgJiYKKwkgICAgIChpY29uZiAmIFZOSUNfRikpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKGZzLT52YWwucGYgPiAweDcgfHwgZnMtPnZhbC52ZiA+IDB4N2YpCisJCXJldHVybiAtRVJBTkdFOworCWZzLT5tYXNrLnBmICY9IDB4NzsKKwlmcy0+bWFzay52ZiAmPSAweDdmOworCisJLyogSWYgdGhlIHVzZXIgaXMgcmVxdWVzdGluZyB0aGF0IHRoZSBmaWx0ZXIgYWN0aW9uIGxvb3AKKwkgKiBtYXRjaGluZyBwYWNrZXRzIGJhY2sgb3V0IG9uZSBvZiBvdXIgcG9ydHMsIG1ha2Ugc3VyZSB0aGF0CisJICogdGhlIGVncmVzcyBwb3J0IGlzIGluIHJhbmdlLgorCSAqLworCWlmIChmcy0+YWN0aW9uID09IEZJTFRFUl9TV0lUQ0ggJiYKKwkgICAgZnMtPmVwb3J0ID49IGFkYXB0ZXItPnBhcmFtcy5ucG9ydHMpCisJCXJldHVybiAtRVJBTkdFOworCisJLyogRG9uJ3QgYWxsb3cgdmFyaW91cyB0cml2aWFsbHkgb2J2aW91cyBib2d1cyBvdXQtb2YtcmFuZ2UgdmFsdWVzLi4uICovCisJaWYgKGZzLT52YWwuaXBvcnQgPj0gYWRhcHRlci0+cGFyYW1zLm5wb3J0cykKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwkvKiBUNCBkb2Vzbid0IHN1cHBvcnQgcmVtb3ZpbmcgVkxBTiBUYWdzIGZvciBsb29wIGJhY2sgZmlsdGVycy4gKi8KKwlpZiAoaXNfdDQoYWRhcHRlci0+cGFyYW1zLmNoaXApICYmCisJICAgIGZzLT5hY3Rpb24gPT0gRklMVEVSX1NXSVRDSCAmJgorCSAgICAoZnMtPm5ld3ZsYW4gPT0gVkxBTl9SRU1PVkUgfHwKKwkgICAgIGZzLT5uZXd2bGFuID09IFZMQU5fUkVXUklURSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9maWx0ZXJfc3RlZXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZnMpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYyYWRhcChkZXYpOworCWludCBpcTsKKworCS8qIElmIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgc3RlZXJpbmcgbWF0Y2hpbmcgSW5ncmVzcyBQYWNrZXRzCisJICogdG8gYSBzcGVjaWZpYyBRdWV1ZSBTZXQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIGl0J3MgaW4gcmFuZ2UKKwkgKiBmb3IgdGhlIHBvcnQgYW5kIG1hcCB0aGF0IGludG8gdGhlIEFic29sdXRlIFF1ZXVlIElEIG9mIHRoZQorCSAqIFF1ZXVlIFNldCdzIFJlc3BvbnNlIFF1ZXVlLgorCSAqLworCWlmICghZnMtPmRpcnN0ZWVyKSB7CisJCWlmIChmcy0+aXEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaXEgPSAwOworCX0gZWxzZSB7CisJCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQkvKiBJZiB0aGUgaXEgaWQgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgcXNldHMsCisJCSAqIHRoZW4gYXNzdW1lIGl0IGlzIGFuIGFic29sdXRlIHFpZC4KKwkJICovCisJCWlmIChmcy0+aXEgPCBwaS0+bnFzZXRzKQorCQkJaXEgPSBhZGFwdGVyLT5zZ2UuZXRocnhxW3BpLT5maXJzdF9xc2V0ICsKKwkJCQkJCSBmcy0+aXFdLnJzcHEuYWJzX2lkOworCQllbHNlCisJCQlpcSA9IGZzLT5pcTsKKwl9CisKKwlyZXR1cm4gaXE7Cit9CisKK3N0YXRpYyBpbnQgY3hnYjRfc2V0X2Z0aWQoc3RydWN0IHRpZF9pbmZvICp0LCBpbnQgZmlkeCwgaW50IGZhbWlseSkKK3sKKwlzcGluX2xvY2tfYmgoJnQtPmZ0aWRfbG9jayk7CisKKwlpZiAodGVzdF9iaXQoZmlkeCwgdC0+ZnRpZF9ibWFwKSkgeworCQlzcGluX3VubG9ja19iaCgmdC0+ZnRpZF9sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoZmFtaWx5ID09IFBGX0lORVQpCisJCV9fc2V0X2JpdChmaWR4LCB0LT5mdGlkX2JtYXApOworCWVsc2UKKwkJYml0bWFwX2FsbG9jYXRlX3JlZ2lvbih0LT5mdGlkX2JtYXAsIGZpZHgsIDIpOworCisJc3Bpbl91bmxvY2tfYmgoJnQtPmZ0aWRfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGN4Z2I0X2NsZWFyX2Z0aWQoc3RydWN0IHRpZF9pbmZvICp0LCBpbnQgZmlkeCwgaW50IGZhbWlseSkKK3sKKwlzcGluX2xvY2tfYmgoJnQtPmZ0aWRfbG9jayk7CisJaWYgKGZhbWlseSA9PSBQRl9JTkVUKQorCQlfX2NsZWFyX2JpdChmaWR4LCB0LT5mdGlkX2JtYXApOworCWVsc2UKKwkJYml0bWFwX3JlbGVhc2VfcmVnaW9uKHQtPmZ0aWRfYm1hcCwgZmlkeCwgMik7CisJc3Bpbl91bmxvY2tfYmgoJnQtPmZ0aWRfbG9jayk7Cit9CisKKy8qIERlbGV0ZSB0aGUgZmlsdGVyIGF0IGEgc3BlY2lmaWVkIGluZGV4LiAqLworc3RhdGljIGludCBkZWxfZmlsdGVyX3dyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgZmlkeCkKK3sKKwlzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmID0gJmFkYXB0ZXItPnRpZHMuZnRpZF90YWJbZmlkeF07CisJc3RydWN0IGZ3X2ZpbHRlcl93ciAqZndyOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgaW50IGxlbjsKKworCWxlbiA9IHNpemVvZigqZndyKTsKKworCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9LRVJORUwpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZ3ciA9IChzdHJ1Y3QgZndfZmlsdGVyX3dyICopX19za2JfcHV0KHNrYiwgbGVuKTsKKwl0NF9ta19maWx0ZGVsd3IoZi0+dGlkLCBmd3IsIGFkYXB0ZXItPnNnZS5md19ldnRxLmFic19pZCk7CisKKwkvKiBNYXJrIHRoZSBmaWx0ZXIgYXMgInBlbmRpbmciIGFuZCBzaGlwIG9mZiB0aGUgRmlsdGVyIFdvcmsgUmVxdWVzdC4KKwkgKiBXaGVuIHdlIGdldCB0aGUgV29yayBSZXF1ZXN0IFJlcGx5IHdlJ2xsIGNsZWFyIHRoZSBwZW5kaW5nIHN0YXR1cy4KKwkgKi8KKwlmLT5wZW5kaW5nID0gMTsKKwl0NF9tZ210X3R4KGFkYXB0ZXIsIHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNlbmQgYSBXb3JrIFJlcXVlc3QgdG8gd3JpdGUgdGhlIGZpbHRlciBhdCBhIHNwZWNpZmllZCBpbmRleC4gIFdlIGNvbnN0cnVjdAorICogYSBGaXJtd2FyZSBGaWx0ZXIgV29yayBSZXF1ZXN0IHRvIGhhdmUgdGhlIHdvcmsgZG9uZSBhbmQgcHV0IHRoZSBpbmRpY2F0ZWQKKyAqIGZpbHRlciBpbnRvICJwZW5kaW5nIiBtb2RlIHdoaWNoIHdpbGwgcHJldmVudCBhbnkgZnVydGhlciBhY3Rpb25zIGFnYWluc3QKKyAqIGl0IHRpbGwgd2UgZ2V0IGEgcmVwbHkgZnJvbSB0aGUgZmlybXdhcmUgb24gdGhlIGNvbXBsZXRpb24gc3RhdHVzIG9mIHRoZQorICogcmVxdWVzdC4KKyAqLworaW50IHNldF9maWx0ZXJfd3Ioc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBmaWR4KQoreworCXN0cnVjdCBmaWx0ZXJfZW50cnkgKmYgPSAmYWRhcHRlci0+dGlkcy5mdGlkX3RhYltmaWR4XTsKKwlzdHJ1Y3QgZndfZmlsdGVyX3dyICpmd3I7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IGFsbG9jX3NrYihzaXplb2YoKmZ3ciksIEdGUF9LRVJORUwpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIElmIHRoZSBuZXcgZmlsdGVyIHJlcXVpcmVzIGxvb3BiYWNrIERlc3RpbmF0aW9uIE1BQyBhbmQvb3IgVkxBTgorCSAqIHJld3JpdGluZyB0aGVuIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBMYXllciAyIFRhYmxlIChMMlQpIGVudHJ5IGZvcgorCSAqIHRoZSBmaWx0ZXIuCisJICovCisJaWYgKGYtPmZzLm5ld2RtYWMgfHwgZi0+ZnMubmV3dmxhbikgeworCQkvKiBhbGxvY2F0ZSBMMlQgZW50cnkgZm9yIG5ldyBmaWx0ZXIgKi8KKwkJZi0+bDJ0ID0gdDRfbDJ0X2FsbG9jX3N3aXRjaGluZyhhZGFwdGVyLCBmLT5mcy52bGFuLAorCQkJCQkJZi0+ZnMuZXBvcnQsIGYtPmZzLmRtYWMpOworCQlpZiAoIWYtPmwydCkgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWZ3ciA9IChzdHJ1Y3QgZndfZmlsdGVyX3dyICopX19za2JfcHV0KHNrYiwgc2l6ZW9mKCpmd3IpKTsKKwltZW1zZXQoZndyLCAwLCBzaXplb2YoKmZ3cikpOworCisJLyogSXQgd291bGQgYmUgbmljZSB0byBwdXQgbW9zdCBvZiB0aGUgZm9sbG93aW5nIGluIHQ0X2h3LmMgYnV0IG1vc3QKKwkgKiBvZiB0aGUgd29yayBpcyB0cmFuc2xhdGluZyB0aGUgY3hnYnRvb2wgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24KKwkgKiBpbnRvIHRoZSBXb3JrIFJlcXVlc3QgYW5kIHRoZSBkZWZpbml0aW9uIG9mIHRoYXQgc3RydWN0dXJlIGlzCisJICogY3VycmVudGx5IGluIGN4Z2J0b29sLmggd2hpY2ggaXNuJ3QgYXBwcm9wcmlhdGUgdG8gcHVsbCBpbnRvIHRoZQorCSAqIGNvbW1vbiBjb2RlLiAgV2UgbWF5IGV2ZW50dWFsbHkgdHJ5IHRvIGNvbWUgdXAgd2l0aCBhIG1vcmUgbmV1dHJhbAorCSAqIGZpbHRlciBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBidXQgZm9yIG5vdyBpdCdzIGVhc2llc3QgdG8gc2ltcGx5CisJICogcHV0IHRoaXMgZmFpcmx5IGRpcmVjdCBjb2RlIGluIGxpbmUgLi4uCisJICovCisJZndyLT5vcF9wa2QgPSBodG9ubChGV19XUl9PUF9WKEZXX0ZJTFRFUl9XUikpOworCWZ3ci0+bGVuMTZfcGtkID0gaHRvbmwoRldfV1JfTEVOMTZfVihzaXplb2YoKmZ3cikgLyAxNikpOworCWZ3ci0+dGlkX3RvX2lxID0KKwkJaHRvbmwoRldfRklMVEVSX1dSX1RJRF9WKGYtPnRpZCkgfAorCQkgICAgICBGV19GSUxURVJfV1JfUlFUWVBFX1YoZi0+ZnMudHlwZSkgfAorCQkgICAgICBGV19GSUxURVJfV1JfTk9SRVBMWV9WKDApIHwKKwkJICAgICAgRldfRklMVEVSX1dSX0lRX1YoZi0+ZnMuaXEpKTsKKwlmd3ItPmRlbF9maWx0ZXJfdG9fbDJ0aXggPQorCQlodG9ubChGV19GSUxURVJfV1JfUlBUVElEX1YoZi0+ZnMucnB0dGlkKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9EUk9QX1YoZi0+ZnMuYWN0aW9uID09IEZJTFRFUl9EUk9QKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9ESVJTVEVFUl9WKGYtPmZzLmRpcnN0ZWVyKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9NQVNLSEFTSF9WKGYtPmZzLm1hc2toYXNoKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9ESVJTVEVFUkhBU0hfVihmLT5mcy5kaXJzdGVlcmhhc2gpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX0xQQktfVihmLT5mcy5hY3Rpb24gPT0gRklMVEVSX1NXSVRDSCkgfAorCQkgICAgICBGV19GSUxURVJfV1JfRE1BQ19WKGYtPmZzLm5ld2RtYWMpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX1NNQUNfVihmLT5mcy5uZXdzbWFjKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9JTlNWTEFOX1YoZi0+ZnMubmV3dmxhbiA9PSBWTEFOX0lOU0VSVCB8fAorCQkJCQkgICAgIGYtPmZzLm5ld3ZsYW4gPT0gVkxBTl9SRVdSSVRFKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9STVZMQU5fVihmLT5mcy5uZXd2bGFuID09IFZMQU5fUkVNT1ZFIHx8CisJCQkJCSAgICBmLT5mcy5uZXd2bGFuID09IFZMQU5fUkVXUklURSkgfAorCQkgICAgICBGV19GSUxURVJfV1JfSElUQ05UU19WKGYtPmZzLmhpdGNudHMpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX1RYQ0hBTl9WKGYtPmZzLmVwb3J0KSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9QUklPX1YoZi0+ZnMucHJpbykgfAorCQkgICAgICBGV19GSUxURVJfV1JfTDJUSVhfVihmLT5sMnQgPyBmLT5sMnQtPmlkeCA6IDApKTsKKwlmd3ItPmV0aHR5cGUgPSBodG9ucyhmLT5mcy52YWwuZXRodHlwZSk7CisJZndyLT5ldGh0eXBlbSA9IGh0b25zKGYtPmZzLm1hc2suZXRodHlwZSk7CisJZndyLT5mcmFnX3RvX292bGFuX3ZsZG0gPQorCQkoRldfRklMVEVSX1dSX0ZSQUdfVihmLT5mcy52YWwuZnJhZykgfAorCQkgRldfRklMVEVSX1dSX0ZSQUdNX1YoZi0+ZnMubWFzay5mcmFnKSB8CisJCSBGV19GSUxURVJfV1JfSVZMQU5fVkxEX1YoZi0+ZnMudmFsLml2bGFuX3ZsZCkgfAorCQkgRldfRklMVEVSX1dSX09WTEFOX1ZMRF9WKGYtPmZzLnZhbC5vdmxhbl92bGQpIHwKKwkJIEZXX0ZJTFRFUl9XUl9JVkxBTl9WTERNX1YoZi0+ZnMubWFzay5pdmxhbl92bGQpIHwKKwkJIEZXX0ZJTFRFUl9XUl9PVkxBTl9WTERNX1YoZi0+ZnMubWFzay5vdmxhbl92bGQpKTsKKwlmd3ItPnNtYWNfc2VsID0gMDsKKwlmd3ItPnJ4X2NoYW5fcnhfcnBsX2lxID0KKwkJaHRvbnMoRldfRklMVEVSX1dSX1JYX0NIQU5fVigwKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9SWF9SUExfSVFfVihhZGFwdGVyLT5zZ2UuZndfZXZ0cS5hYnNfaWQpKTsKKwlmd3ItPm1hY2lfdG9fbWF0Y2h0eXBlbSA9CisJCWh0b25sKEZXX0ZJTFRFUl9XUl9NQUNJX1YoZi0+ZnMudmFsLm1hY2lkeCkgfAorCQkgICAgICBGV19GSUxURVJfV1JfTUFDSU1fVihmLT5mcy5tYXNrLm1hY2lkeCkgfAorCQkgICAgICBGV19GSUxURVJfV1JfRkNPRV9WKGYtPmZzLnZhbC5mY29lKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9GQ09FTV9WKGYtPmZzLm1hc2suZmNvZSkgfAorCQkgICAgICBGV19GSUxURVJfV1JfUE9SVF9WKGYtPmZzLnZhbC5pcG9ydCkgfAorCQkgICAgICBGV19GSUxURVJfV1JfUE9SVE1fVihmLT5mcy5tYXNrLmlwb3J0KSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9NQVRDSFRZUEVfVihmLT5mcy52YWwubWF0Y2h0eXBlKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9NQVRDSFRZUEVNX1YoZi0+ZnMubWFzay5tYXRjaHR5cGUpKTsKKwlmd3ItPnB0Y2wgPSBmLT5mcy52YWwucHJvdG87CisJZndyLT5wdGNsbSA9IGYtPmZzLm1hc2sucHJvdG87CisJZndyLT50dHlwID0gZi0+ZnMudmFsLnRvczsKKwlmd3ItPnR0eXBtID0gZi0+ZnMubWFzay50b3M7CisJZndyLT5pdmxhbiA9IGh0b25zKGYtPmZzLnZhbC5pdmxhbik7CisJZndyLT5pdmxhbm0gPSBodG9ucyhmLT5mcy5tYXNrLml2bGFuKTsKKwlmd3ItPm92bGFuID0gaHRvbnMoZi0+ZnMudmFsLm92bGFuKTsKKwlmd3ItPm92bGFubSA9IGh0b25zKGYtPmZzLm1hc2sub3ZsYW4pOworCW1lbWNweShmd3ItPmxpcCwgZi0+ZnMudmFsLmxpcCwgc2l6ZW9mKGZ3ci0+bGlwKSk7CisJbWVtY3B5KGZ3ci0+bGlwbSwgZi0+ZnMubWFzay5saXAsIHNpemVvZihmd3ItPmxpcG0pKTsKKwltZW1jcHkoZndyLT5maXAsIGYtPmZzLnZhbC5maXAsIHNpemVvZihmd3ItPmZpcCkpOworCW1lbWNweShmd3ItPmZpcG0sIGYtPmZzLm1hc2suZmlwLCBzaXplb2YoZndyLT5maXBtKSk7CisJZndyLT5scCA9IGh0b25zKGYtPmZzLnZhbC5scG9ydCk7CisJZndyLT5scG0gPSBodG9ucyhmLT5mcy5tYXNrLmxwb3J0KTsKKwlmd3ItPmZwID0gaHRvbnMoZi0+ZnMudmFsLmZwb3J0KTsKKwlmd3ItPmZwbSA9IGh0b25zKGYtPmZzLm1hc2suZnBvcnQpOworCWlmIChmLT5mcy5uZXdzbWFjKQorCQltZW1jcHkoZndyLT5zbWEsIGYtPmZzLnNtYWMsIHNpemVvZihmd3ItPnNtYSkpOworCisJLyogTWFyayB0aGUgZmlsdGVyIGFzICJwZW5kaW5nIiBhbmQgc2hpcCBvZmYgdGhlIEZpbHRlciBXb3JrIFJlcXVlc3QuCisJICogV2hlbiB3ZSBnZXQgdGhlIFdvcmsgUmVxdWVzdCBSZXBseSB3ZSdsbCBjbGVhciB0aGUgcGVuZGluZyBzdGF0dXMuCisJICovCisJZi0+cGVuZGluZyA9IDE7CisJc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9DT05UUk9MLCBmLT5mcy52YWwuaXBvcnQgJiAweDMpOworCXQ0X29mbGRfc2VuZChhZGFwdGVyLCBza2IpOworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gYW4gZXJyb3IgbnVtYmVyIGlmIHRoZSBpbmRpY2F0ZWQgZmlsdGVyIGlzbid0IHdyaXRhYmxlIC4uLiAqLworaW50IHdyaXRhYmxlX2ZpbHRlcihzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmKQoreworCWlmIChmLT5sb2NrZWQpCisJCXJldHVybiAtRVBFUk07CisJaWYgKGYtPnBlbmRpbmcpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4gMDsKK30KKworLyogRGVsZXRlIHRoZSBmaWx0ZXIgYXQgdGhlIHNwZWNpZmllZCBpbmRleCAoaWYgdmFsaWQpLiAgVGhlIGNoZWNrcyBmb3IgYWxsCisgKiB0aGUgY29tbW9uIHByb2JsZW1zIHdpdGggZG9pbmcgdGhpcyBsaWtlIHRoZSBmaWx0ZXIgYmVpbmcgbG9ja2VkLCBjdXJyZW50bHkKKyAqIHBlbmRpbmcgaW4gYW5vdGhlciBvcGVyYXRpb24sIGV0Yy4KKyAqLworaW50IGRlbGV0ZV9maWx0ZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBmaWR4KQoreworCXN0cnVjdCBmaWx0ZXJfZW50cnkgKmY7CisJaW50IHJldDsKKworCWlmIChmaWR4ID49IGFkYXB0ZXItPnRpZHMubmZ0aWRzICsgYWRhcHRlci0+dGlkcy5uc2Z0aWRzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWYgPSAmYWRhcHRlci0+dGlkcy5mdGlkX3RhYltmaWR4XTsKKwlyZXQgPSB3cml0YWJsZV9maWx0ZXIoZik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoZi0+dmFsaWQpCisJCXJldHVybiBkZWxfZmlsdGVyX3dyKGFkYXB0ZXIsIGZpZHgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENsZWFyIGEgZmlsdGVyIGFuZCByZWxlYXNlIGFueSBvZiBpdHMgcmVzb3VyY2VzIHRoYXQgd2Ugb3duLiAgVGhpcyBhbHNvCisgKiBjbGVhcnMgdGhlIGZpbHRlcidzICJwZW5kaW5nIiBzdGF0dXMuCisgKi8KK3ZvaWQgY2xlYXJfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmKQoreworCS8qIElmIHRoZSBuZXcgb3Igb2xkIGZpbHRlciBoYXZlIGxvb3BiYWNrIHJld3JpdGVpbmcgcnVsZXMgdGhlbiB3ZSdsbAorCSAqIG5lZWQgdG8gZnJlZSBhbnkgZXhpc3RpbmcgTGF5ZXIgVHdvIFRhYmxlIChMMlQpIGVudHJpZXMgb2YgdGhlIG9sZAorCSAqIGZpbHRlciBydWxlLiAgVGhlIGZpcm13YXJlIHdpbGwgaGFuZGxlIGZyZWVpbmcgdXAgYW55IFNvdXJjZSBNQUMKKwkgKiBUYWJsZSAoU01UKSBlbnRyaWVzIHVzZWQgZm9yIHJld3JpdGluZyBTb3VyY2UgTUFDIEFkZHJlc3NlcyBpbgorCSAqIGxvb3BiYWNrIHJ1bGVzLgorCSAqLworCWlmIChmLT5sMnQpCisJCWN4Z2I0X2wydF9yZWxlYXNlKGYtPmwydCk7CisKKwkvKiBUaGUgemVyb2luZyBvZiB0aGUgZmlsdGVyIHJ1bGUgYmVsb3cgY2xlYXJzIHRoZSBmaWx0ZXIgdmFsaWQsCisJICogcGVuZGluZywgbG9ja2VkIGZsYWdzLCBsMnQgcG9pbnRlciwgZXRjLiBzbyBpdCdzIGFsbCB3ZSBuZWVkIGZvcgorCSAqIHRoaXMgb3BlcmF0aW9uLgorCSAqLworCW1lbXNldChmLCAwLCBzaXplb2YoKmYpKTsKK30KKwordm9pZCBjbGVhcl9hbGxfZmlsdGVycyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChhZGFwdGVyLT50aWRzLmZ0aWRfdGFiKSB7CisJCXN0cnVjdCBmaWx0ZXJfZW50cnkgKmYgPSAmYWRhcHRlci0+dGlkcy5mdGlkX3RhYlswXTsKKwkJdW5zaWduZWQgaW50IG1heF9mdGlkID0gYWRhcHRlci0+dGlkcy5uZnRpZHMgKworCQkJCQlhZGFwdGVyLT50aWRzLm5zZnRpZHM7CisKKwkJZm9yIChpID0gMDsgaSA8IG1heF9mdGlkOyBpKyssIGYrKykKKwkJCWlmIChmLT52YWxpZCB8fCBmLT5wZW5kaW5nKQorCQkJCWNsZWFyX2ZpbHRlcihhZGFwdGVyLCBmKTsKKwl9Cit9CisKKy8qIEZpbGwgdXAgZGVmYXVsdCBtYXNrcyBmb3Igc2V0IG1hdGNoIGZpZWxkcy4gKi8KK3N0YXRpYyB2b2lkIGZpbGxfZGVmYXVsdF9tYXNrKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZnMpCit7CisJdW5zaWduZWQgaW50IGxpcCA9IDAsIGxpcF9tYXNrID0gMDsKKwl1bnNpZ25lZCBpbnQgZmlwID0gMCwgZmlwX21hc2sgPSAwOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKGZzLT52YWwuaXBvcnQgJiYgIWZzLT5tYXNrLmlwb3J0KQorCQlmcy0+bWFzay5pcG9ydCB8PSB+MDsKKwlpZiAoZnMtPnZhbC5mY29lICYmICFmcy0+bWFzay5mY29lKQorCQlmcy0+bWFzay5mY29lIHw9IH4wOworCWlmIChmcy0+dmFsLm1hdGNodHlwZSAmJiAhZnMtPm1hc2subWF0Y2h0eXBlKQorCQlmcy0+bWFzay5tYXRjaHR5cGUgfD0gfjA7CisJaWYgKGZzLT52YWwubWFjaWR4ICYmICFmcy0+bWFzay5tYWNpZHgpCisJCWZzLT5tYXNrLm1hY2lkeCB8PSB+MDsKKwlpZiAoZnMtPnZhbC5ldGh0eXBlICYmICFmcy0+bWFzay5ldGh0eXBlKQorCQlmcy0+bWFzay5ldGh0eXBlIHw9IH4wOworCWlmIChmcy0+dmFsLml2bGFuICYmICFmcy0+bWFzay5pdmxhbikKKwkJZnMtPm1hc2suaXZsYW4gfD0gfjA7CisJaWYgKGZzLT52YWwub3ZsYW4gJiYgIWZzLT5tYXNrLm92bGFuKQorCQlmcy0+bWFzay5vdmxhbiB8PSB+MDsKKwlpZiAoZnMtPnZhbC5mcmFnICYmICFmcy0+bWFzay5mcmFnKQorCQlmcy0+bWFzay5mcmFnIHw9IH4wOworCWlmIChmcy0+dmFsLnRvcyAmJiAhZnMtPm1hc2sudG9zKQorCQlmcy0+bWFzay50b3MgfD0gfjA7CisJaWYgKGZzLT52YWwucHJvdG8gJiYgIWZzLT5tYXNrLnByb3RvKQorCQlmcy0+bWFzay5wcm90byB8PSB+MDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZzLT52YWwubGlwKTsgaSsrKSB7CisJCWxpcCB8PSBmcy0+dmFsLmxpcFtpXTsKKwkJbGlwX21hc2sgfD0gZnMtPm1hc2subGlwW2ldOworCQlmaXAgfD0gZnMtPnZhbC5maXBbaV07CisJCWZpcF9tYXNrIHw9IGZzLT5tYXNrLmZpcFtpXTsKKwl9CisKKwlpZiAobGlwICYmICFsaXBfbWFzaykKKwkJbWVtc2V0KGZzLT5tYXNrLmxpcCwgfjAsIHNpemVvZihmcy0+bWFzay5saXApKTsKKworCWlmIChmaXAgJiYgIWZpcF9tYXNrKQorCQltZW1zZXQoZnMtPm1hc2suZmlwLCB+MCwgc2l6ZW9mKGZzLT5tYXNrLmxpcCkpOworCisJaWYgKGZzLT52YWwubHBvcnQgJiYgIWZzLT5tYXNrLmxwb3J0KQorCQlmcy0+bWFzay5scG9ydCA9IH4wOworCWlmIChmcy0+dmFsLmZwb3J0ICYmICFmcy0+bWFzay5mcG9ydCkKKwkJZnMtPm1hc2suZnBvcnQgPSB+MDsKK30KKworLyogQ2hlY2sgYSBDaGVsc2lvIEZpbHRlciBSZXF1ZXN0IGZvciB2YWxpZGl0eSwgY29udmVydCBpdCBpbnRvIG91ciBpbnRlcm5hbAorICogZm9ybWF0IGFuZCBzZW5kIGl0IHRvIHRoZSBoYXJkd2FyZS4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGFuIGVycm9yIG51bWJlcgorICogb3RoZXJ3aXNlLiAgV2UgYXR0YWNoIGFueSBwcm92aWRlZCBmaWx0ZXIgb3BlcmF0aW9uIGNvbnRleHQgdG8gdGhlIGludGVybmFsCisgKiBmaWx0ZXIgc3BlY2lmaWNhdGlvbiBpbiBvcmRlciB0byBmYWNpbGl0YXRlIHNpZ25hbGluZyBjb21wbGV0aW9uIG9mIHRoZQorICogb3BlcmF0aW9uLgorICovCitpbnQgX19jeGdiNF9zZXRfZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmaWx0ZXJfaWQsCisJCSAgICAgICBzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmZzLAorCQkgICAgICAgc3RydWN0IGZpbHRlcl9jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldjJhZGFwKGRldik7CisJdW5zaWduZWQgaW50IG1heF9maWR4LCBmaWR4OworCXN0cnVjdCBmaWx0ZXJfZW50cnkgKmY7CisJdTMyIGljb25mOworCWludCBpcSwgcmV0OworCisJbWF4X2ZpZHggPSBhZGFwdGVyLT50aWRzLm5mdGlkczsKKwlpZiAoZmlsdGVyX2lkICE9IChtYXhfZmlkeCArIGFkYXB0ZXItPnRpZHMubnNmdGlkcyAtIDEpICYmCisJICAgIGZpbHRlcl9pZCA+PSBtYXhfZmlkeCkKKwkJcmV0dXJuIC1FMkJJRzsKKworCWZpbGxfZGVmYXVsdF9tYXNrKGZzKTsKKworCXJldCA9IHZhbGlkYXRlX2ZpbHRlcihkZXYsIGZzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaXEgPSBnZXRfZmlsdGVyX3N0ZWVycShkZXYsIGZzKTsKKwlpZiAoaXEgPCAwKQorCQlyZXR1cm4gaXE7CisKKwkvKiBJUHY2IGZpbHRlcnMgb2NjdXB5IGZvdXIgc2xvdHMgYW5kIG11c3QgYmUgYWxpZ25lZCBvbgorCSAqIGZvdXItc2xvdCBib3VuZGFyaWVzLiAgSVB2NCBmaWx0ZXJzIG9ubHkgb2NjdXB5IGEgc2luZ2xlCisJICogc2xvdCBhbmQgaGF2ZSBubyBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGJ1dCB3cml0aW5nIGEgbmV3CisJICogSVB2NCBmaWx0ZXIgaW50byB0aGUgbWlkZGxlIG9mIGFuIGV4aXN0aW5nIElQdjYgZmlsdGVyCisJICogcmVxdWlyZXMgY2xlYXJpbmcgdGhlIG9sZCBJUHY2IGZpbHRlciBhbmQgaGVuY2Ugd2UgcHJldmVudAorCSAqIGluc2VydGlvbi4KKwkgKi8KKwlpZiAoZnMtPnR5cGUgPT0gMCkgeyAvKiBJUHY0ICovCisJCS8qIElmIG91ciBJUHY0IGZpbHRlciBpc24ndCBiZWluZyB3cml0dGVuIHRvIGEKKwkJICogbXVsdGlwbGUgb2YgZm91ciBmaWx0ZXIgaW5kZXggYW5kIHRoZXJlJ3MgYW4gSVB2NgorCQkgKiBmaWx0ZXIgYXQgdGhlIG11bHRpcGxlIG9mIDQgYmFzZSBzbG90LCB0aGVuIHdlCisJCSAqIHByZXZlbnQgaW5zZXJ0aW9uLgorCQkgKi8KKwkJZmlkeCA9IGZpbHRlcl9pZCAmIH4weDM7CisJCWlmIChmaWR4ICE9IGZpbHRlcl9pZCAmJgorCQkgICAgYWRhcHRlci0+dGlkcy5mdGlkX3RhYltmaWR4XS5mcy50eXBlKSB7CisJCQlmID0gJmFkYXB0ZXItPnRpZHMuZnRpZF90YWJbZmlkeF07CisJCQlpZiAoZi0+dmFsaWQpIHsKKwkJCQlkZXZfZXJyKGFkYXB0ZXItPnBkZXZfZGV2LAorCQkJCQkiSW52YWxpZCBsb2NhdGlvbi4gSVB2NiByZXF1aXJlcyA0IHNsb3RzIGFuZCBpcyBvY2N1cHlpbmcgc2xvdHMgJXUgdG8gJXVcbiIsCisJCQkJCWZpZHgsIGZpZHggKyAzKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7IC8qIElQdjYgKi8KKwkJLyogRW5zdXJlIHRoYXQgdGhlIElQdjYgZmlsdGVyIGlzIGFsaWduZWQgb24gYQorCQkgKiBtdWx0aXBsZSBvZiA0IGJvdW5kYXJ5LgorCQkgKi8KKwkJaWYgKGZpbHRlcl9pZCAmIDB4MykgeworCQkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwKKwkJCQkiSW52YWxpZCBsb2NhdGlvbi4gSVB2NiBtdXN0IGJlIGFsaWduZWQgb24gYSA0LXNsb3QgYm91bmRhcnlcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBDaGVjayBhbGwgZXhjZXB0IHRoZSBiYXNlIG92ZXJsYXBwaW5nIElQdjQgZmlsdGVyIHNsb3RzLiAqLworCQlmb3IgKGZpZHggPSBmaWx0ZXJfaWQgKyAxOyBmaWR4IDwgZmlsdGVyX2lkICsgNDsgZmlkeCsrKSB7CisJCQlmID0gJmFkYXB0ZXItPnRpZHMuZnRpZF90YWJbZmlkeF07CisJCQlpZiAoZi0+dmFsaWQpIHsKKwkJCQlkZXZfZXJyKGFkYXB0ZXItPnBkZXZfZGV2LAorCQkJCQkiSW52YWxpZCBsb2NhdGlvbi4gIElQdjYgcmVxdWlyZXMgNCBzbG90cyBhbmQgYW4gSVB2NCBmaWx0ZXIgZXhpc3RzIGF0ICV1XG4iLAorCQkJCQlmaWR4KTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKworCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHByb3ZpZGVkIGZpbHRlciBpbmRleCBpcyBub3QKKwkgKiBhbHJlYWR5IGluIHVzZSBieSBzb21lb25lIGVsc2UKKwkgKi8KKwlmID0gJmFkYXB0ZXItPnRpZHMuZnRpZF90YWJbZmlsdGVyX2lkXTsKKwlpZiAoZi0+dmFsaWQpCisJCXJldHVybiAtRUJVU1k7CisKKwlmaWR4ID0gZmlsdGVyX2lkICsgYWRhcHRlci0+dGlkcy5mdGlkX2Jhc2U7CisJcmV0ID0gY3hnYjRfc2V0X2Z0aWQoJmFkYXB0ZXItPnRpZHMsIGZpbHRlcl9pZCwKKwkJCSAgICAgZnMtPnR5cGUgPyBQRl9JTkVUNiA6IFBGX0lORVQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGZpbHRlciByZXF1ZXN0ZWQgaXMgd3JpdGFibGUgLi4uICovCisJcmV0ID0gd3JpdGFibGVfZmlsdGVyKGYpOworCWlmIChyZXQpIHsKKwkJLyogQ2xlYXIgdGhlIGJpdHMgd2UgaGF2ZSBzZXQgYWJvdmUgKi8KKwkJY3hnYjRfY2xlYXJfZnRpZCgmYWRhcHRlci0+dGlkcywgZmlsdGVyX2lkLAorCQkJCSBmcy0+dHlwZSA/IFBGX0lORVQ2IDogUEZfSU5FVCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogQ2xlYXIgb3V0IGFueSBvbGQgcmVzb3VyY2VzIGJlaW5nIHVzZWQgYnkgdGhlIGZpbHRlciBiZWZvcmUKKwkgKiB3ZSBzdGFydCBjb25zdHJ1Y3RpbmcgdGhlIG5ldyBmaWx0ZXIuCisJICovCisJaWYgKGYtPnZhbGlkKQorCQljbGVhcl9maWx0ZXIoYWRhcHRlciwgZik7CisKKwkvKiBDb252ZXJ0IHRoZSBmaWx0ZXIgc3BlY2lmaWNhdGlvbiBpbnRvIG91ciBpbnRlcm5hbCBmb3JtYXQuCisJICogV2UgY29weSB0aGUgUEYvVkYgc3BlY2lmaWNhdGlvbiBpbnRvIHRoZSBPdXRlciBWTEFOIGZpZWxkCisJICogaGVyZSBzbyB0aGUgcmVzdCBvZiB0aGUgY29kZSAtLSBpbmNsdWRpbmcgdGhlIGludGVyZmFjZSB0bworCSAqIHRoZSBmaXJtd2FyZSAtLSBkb2Vzbid0IGhhdmUgdG8gY29uc3RhbnRseSBkbyB0aGVzZSBjaGVja3MuCisJICovCisJZi0+ZnMgPSAqZnM7CisJZi0+ZnMuaXEgPSBpcTsKKwlmLT5kZXYgPSBkZXY7CisKKwlpY29uZiA9IGFkYXB0ZXItPnBhcmFtcy50cC5pbmdyZXNzX2NvbmZpZzsKKwlpZiAoaWNvbmYgJiBWTklDX0YpIHsKKwkJZi0+ZnMudmFsLm92bGFuID0gKGZzLT52YWwucGYgPDwgMTMpIHwgZnMtPnZhbC52ZjsKKwkJZi0+ZnMubWFzay5vdmxhbiA9IChmcy0+bWFzay5wZiA8PCAxMykgfCBmcy0+bWFzay52ZjsKKwkJZi0+ZnMudmFsLm92bGFuX3ZsZCA9IGZzLT52YWwucGZ2Zl92bGQ7CisJCWYtPmZzLm1hc2sub3ZsYW5fdmxkID0gZnMtPm1hc2sucGZ2Zl92bGQ7CisJfQorCisJLyogQXR0ZW1wdCB0byBzZXQgdGhlIGZpbHRlci4gIElmIHdlIGRvbid0IHN1Y2NlZWQsIHdlIGNsZWFyCisJICogaXQgYW5kIHJldHVybiB0aGUgZmFpbHVyZS4KKwkgKi8KKwlmLT5jdHggPSBjdHg7CisJZi0+dGlkID0gZmlkeDsgLyogU2F2ZSB0aGUgYWN0dWFsIHRpZCAqLworCXJldCA9IHNldF9maWx0ZXJfd3IoYWRhcHRlciwgZmlsdGVyX2lkKTsKKwlpZiAocmV0KSB7CisJCWN4Z2I0X2NsZWFyX2Z0aWQoJmFkYXB0ZXItPnRpZHMsIGZpbHRlcl9pZCwKKwkJCQkgZnMtPnR5cGUgPyBQRl9JTkVUNiA6IFBGX0lORVQpOworCQljbGVhcl9maWx0ZXIoYWRhcHRlciwgZik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogQ2hlY2sgYSBkZWxldGUgZmlsdGVyIHJlcXVlc3QgZm9yIHZhbGlkaXR5IGFuZCBzZW5kIGl0IHRvIHRoZSBoYXJkd2FyZS4KKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGFuIGVycm9yIG51bWJlciBvdGhlcndpc2UuICBXZSBhdHRhY2ggYW55IHByb3ZpZGVkCisgKiBmaWx0ZXIgb3BlcmF0aW9uIGNvbnRleHQgdG8gdGhlIGludGVybmFsIGZpbHRlciBzcGVjaWZpY2F0aW9uIGluIG9yZGVyIHRvCisgKiBmYWNpbGl0YXRlIHNpZ25hbGluZyBjb21wbGV0aW9uIG9mIHRoZSBvcGVyYXRpb24uCisgKi8KK2ludCBfX2N4Z2I0X2RlbF9maWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZpbHRlcl9pZCwKKwkJICAgICAgIHN0cnVjdCBmaWx0ZXJfY3R4ICpjdHgpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYyYWRhcChkZXYpOworCXN0cnVjdCBmaWx0ZXJfZW50cnkgKmY7CisJdW5zaWduZWQgaW50IG1heF9maWR4OworCWludCByZXQ7CisKKwltYXhfZmlkeCA9IGFkYXB0ZXItPnRpZHMubmZ0aWRzOworCWlmIChmaWx0ZXJfaWQgIT0gKG1heF9maWR4ICsgYWRhcHRlci0+dGlkcy5uc2Z0aWRzIC0gMSkgJiYKKwkgICAgZmlsdGVyX2lkID49IG1heF9maWR4KQorCQlyZXR1cm4gLUUyQklHOworCisJZiA9ICZhZGFwdGVyLT50aWRzLmZ0aWRfdGFiW2ZpbHRlcl9pZF07CisJcmV0ID0gd3JpdGFibGVfZmlsdGVyKGYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoZi0+dmFsaWQpIHsKKwkJZi0+Y3R4ID0gY3R4OworCQljeGdiNF9jbGVhcl9mdGlkKCZhZGFwdGVyLT50aWRzLCBmaWx0ZXJfaWQsCisJCQkJIGYtPmZzLnR5cGUgPyBQRl9JTkVUNiA6IFBGX0lORVQpOworCQlyZXR1cm4gZGVsX2ZpbHRlcl93cihhZGFwdGVyLCBmaWx0ZXJfaWQpOworCX0KKworCS8qIElmIHRoZSBjYWxsZXIgaGFzIHBhc3NlZCBpbiBhIENvbXBsZXRpb24gQ29udGV4dCB0aGVuIHdlIG5lZWQgdG8KKwkgKiBtYXJrIGl0IGFzIGEgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIHNvIHRoZXkgZG9uJ3Qgc3RhbGwgd2FpdGluZworCSAqIGZvciBpdC4KKwkgKi8KKwlpZiAoY3R4KSB7CisJCWN0eC0+cmVzdWx0ID0gMDsKKwkJY29tcGxldGUoJmN0eC0+Y29tcGxldGlvbik7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCBjeGdiNF9zZXRfZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmaWx0ZXJfaWQsCisJCSAgICAgc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmcykKK3sKKwlzdHJ1Y3QgZmlsdGVyX2N0eCBjdHg7CisJaW50IHJldDsKKworCWluaXRfY29tcGxldGlvbigmY3R4LmNvbXBsZXRpb24pOworCisJcmV0ID0gX19jeGdiNF9zZXRfZmlsdGVyKGRldiwgZmlsdGVyX2lkLCBmcywgJmN0eCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBXYWl0IGZvciByZXBseSAqLworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY3R4LmNvbXBsZXRpb24sIDEwICogSFopOworCWlmICghcmV0KQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCXJldCA9IGN0eC5yZXN1bHQ7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworaW50IGN4Z2I0X2RlbF9maWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZpbHRlcl9pZCkKK3sKKwlzdHJ1Y3QgZmlsdGVyX2N0eCBjdHg7CisJaW50IHJldDsKKworCWluaXRfY29tcGxldGlvbigmY3R4LmNvbXBsZXRpb24pOworCisJcmV0ID0gX19jeGdiNF9kZWxfZmlsdGVyKGRldiwgZmlsdGVyX2lkLCAmY3R4KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIFdhaXQgZm9yIHJlcGx5ICovCisJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjdHguY29tcGxldGlvbiwgMTAgKiBIWik7CisJaWYgKCFyZXQpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJcmV0ID0gY3R4LnJlc3VsdDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBIYW5kbGUgYSBmaWx0ZXIgd3JpdGUvZGVsZXRpb24gcmVwbHkuICovCit2b2lkIGZpbHRlcl9ycGwoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIGNvbnN0IHN0cnVjdCBjcGxfc2V0X3RjYl9ycGwgKnJwbCkKK3sKKwl1bnNpZ25lZCBpbnQgdGlkID0gR0VUX1RJRChycGwpOworCXN0cnVjdCBmaWx0ZXJfZW50cnkgKmYgPSBOVUxMOworCXVuc2lnbmVkIGludCBtYXhfZmlkeDsKKwlpbnQgaWR4OworCisJbWF4X2ZpZHggPSBhZGFwLT50aWRzLm5mdGlkcyArIGFkYXAtPnRpZHMubnNmdGlkczsKKwkvKiBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgZmlsdGVyIGVudHJ5IGZvciB0aGlzIHRpZCAqLworCWlmIChhZGFwLT50aWRzLmZ0aWRfdGFiKSB7CisJCS8qIENoZWNrIHRoaXMgaW4gbm9ybWFsIGZpbHRlciByZWdpb24gKi8KKwkJaWR4ID0gdGlkIC0gYWRhcC0+dGlkcy5mdGlkX2Jhc2U7CisJCWlmIChpZHggPj0gbWF4X2ZpZHgpCisJCQlyZXR1cm47CisJCWYgPSAmYWRhcC0+dGlkcy5mdGlkX3RhYltpZHhdOworCQlpZiAoZi0+dGlkICE9IHRpZCkKKwkJCXJldHVybjsKKwl9CisKKwkvKiBXZSBmb3VuZCB0aGUgZmlsdGVyIGVudHJ5IGZvciB0aGlzIHRpZCAqLworCWlmIChmKSB7CisJCXVuc2lnbmVkIGludCByZXQgPSBUQ0JfQ09PS0lFX0cocnBsLT5jb29raWUpOworCQlzdHJ1Y3QgZmlsdGVyX2N0eCAqY3R4OworCisJCS8qIFB1bGwgb2ZmIGFueSBmaWx0ZXIgb3BlcmF0aW9uIGNvbnRleHQgYXR0YWNoZWQgdG8gdGhlCisJCSAqIGZpbHRlci4KKwkJICovCisJCWN0eCA9IGYtPmN0eDsKKwkJZi0+Y3R4ID0gTlVMTDsKKworCQlpZiAocmV0ID09IEZXX0ZJTFRFUl9XUl9GTFRfREVMRVRFRCkgeworCQkJLyogQ2xlYXIgdGhlIGZpbHRlciB3aGVuIHdlIGdldCBjb25maXJtYXRpb24gZnJvbSB0aGUKKwkJCSAqIGhhcmR3YXJlIHRoYXQgdGhlIGZpbHRlciBoYXMgYmVlbiBkZWxldGVkLgorCQkJICovCisJCQljbGVhcl9maWx0ZXIoYWRhcCwgZik7CisJCQlpZiAoY3R4KQorCQkJCWN0eC0+cmVzdWx0ID0gMDsKKwkJfSBlbHNlIGlmIChyZXQgPT0gRldfRklMVEVSX1dSX1NNVF9UQkxfRlVMTCkgeworCQkJZGV2X2VycihhZGFwLT5wZGV2X2RldiwgImZpbHRlciAldSBzZXR1cCBmYWlsZWQgZHVlIHRvIGZ1bGwgU01UXG4iLAorCQkJCWlkeCk7CisJCQljbGVhcl9maWx0ZXIoYWRhcCwgZik7CisJCQlpZiAoY3R4KQorCQkJCWN0eC0+cmVzdWx0ID0gLUVOT01FTTsKKwkJfSBlbHNlIGlmIChyZXQgPT0gRldfRklMVEVSX1dSX0ZMVF9BRERFRCkgeworCQkJZi0+c210aWR4ID0gKGJlNjRfdG9fY3B1KHJwbC0+b2xkdmFsKSA+PiAyNCkgJiAweGZmOworCQkJZi0+cGVuZGluZyA9IDA7ICAvKiBhc3luY2hyb25vdXMgc2V0dXAgY29tcGxldGVkICovCisJCQlmLT52YWxpZCA9IDE7CisJCQlpZiAoY3R4KSB7CisJCQkJY3R4LT5yZXN1bHQgPSAwOworCQkJCWN0eC0+dGlkID0gaWR4OworCQkJfQorCQl9IGVsc2UgeworCQkJLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICBJc3N1ZSBhIHdhcm5pbmcgYWJvdXQgdGhlCisJCQkgKiBwcm9ibGVtIGFuZCBjbGVhciBldmVyeXRoaW5nIG91dC4KKwkJCSAqLworCQkJZGV2X2VycihhZGFwLT5wZGV2X2RldiwgImZpbHRlciAldSBzZXR1cCBmYWlsZWQgd2l0aCBlcnJvciAldVxuIiwKKwkJCQlpZHgsIHJldCk7CisJCQljbGVhcl9maWx0ZXIoYWRhcCwgZik7CisJCQlpZiAoY3R4KQorCQkJCWN0eC0+cmVzdWx0ID0gLUVJTlZBTDsKKwkJfQorCQlpZiAoY3R4KQorCQkJY29tcGxldGUoJmN0eC0+Y29tcGxldGlvbik7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9maWx0ZXIuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM3NDJjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfZmlsdGVyLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX0NYR0I0X0ZJTFRFUl9ICisjZGVmaW5lIF9fQ1hHQjRfRklMVEVSX0gKKworI2luY2x1ZGUgInQ0X21zZy5oIgorCit2b2lkIGZpbHRlcl9ycGwoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIGNvbnN0IHN0cnVjdCBjcGxfc2V0X3RjYl9ycGwgKnJwbCk7Cit2b2lkIGNsZWFyX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IGZpbHRlcl9lbnRyeSAqZik7CisKK2ludCBzZXRfZmlsdGVyX3dyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgZmlkeCk7CitpbnQgZGVsZXRlX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGZpZHgpOworCitpbnQgd3JpdGFibGVfZmlsdGVyKHN0cnVjdCBmaWx0ZXJfZW50cnkgKmYpOwordm9pZCBjbGVhcl9hbGxfZmlsdGVycyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CisjZW5kaWYgLyogX19DWEdCNF9GSUxURVJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X21haW4uYwppbmRleCBjNDVkZTQ5Li5jZjE0N2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X21haW4uYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUNCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtNjcsNiArNjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KIAogI2luY2x1ZGUgImN4Z2I0LmgiCisjaW5jbHVkZSAiY3hnYjRfZmlsdGVyLmgiCiAjaW5jbHVkZSAidDRfcmVncy5oIgogI2luY2x1ZGUgInQ0X3ZhbHVlcy5oIgogI2luY2x1ZGUgInQ0X21zZy5oIgpAQCAtNzYsNiArNzcsOCBAQAogI2luY2x1ZGUgImN4Z2I0X2RlYnVnZnMuaCIKICNpbmNsdWRlICJjbGlwX3RibC5oIgogI2luY2x1ZGUgImwydC5oIgorI2luY2x1ZGUgInNjaGVkLmgiCisjaW5jbHVkZSAiY3hnYjRfdGNfdTMyLmgiCiAKIGNoYXIgY3hnYjRfZHJpdmVyX25hbWVbXSA9IEtCVUlMRF9NT0ROQU1FOwogCkBAIC04NiwzMCArODksNiBAQAogY29uc3QgY2hhciBjeGdiNF9kcml2ZXJfdmVyc2lvbltdID0gRFJWX1ZFUlNJT047CiAjZGVmaW5lIERSVl9ERVNDICJDaGVsc2lvIFQ0L1Q1L1Q2IE5ldHdvcmsgRHJpdmVyIgogCi0vKiBIb3N0IHNoYWRvdyBjb3B5IG9mIGluZ3Jlc3MgZmlsdGVyIGVudHJ5LiAgVGhpcyBpcyBpbiBob3N0IG5hdGl2ZSBmb3JtYXQKLSAqIGFuZCBkb2Vzbid0IG1hdGNoIHRoZSBvcmRlcmluZyBvciBiaXQgb3JkZXIsIGV0Yy4gb2YgdGhlIGhhcmR3YXJlIG9mIHRoZQotICogZmlybXdhcmUgY29tbWFuZC4gIFRoZSB1c2Ugb2YgYml0LWZpZWxkIHN0cnVjdHVyZSBlbGVtZW50cyBpcyBwdXJlbHkgdG8KLSAqIHJlbWluZCBvdXJzZWx2ZXMgb2YgdGhlIGZpZWxkIHNpemUgbGltaXRhdGlvbnMgYW5kIHNhdmUgbWVtb3J5IGluIHRoZSBjYXNlCi0gKiB3aGVyZSB0aGUgZmlsdGVyIHRhYmxlIGlzIGxhcmdlLgotICovCi1zdHJ1Y3QgZmlsdGVyX2VudHJ5IHsKLQkvKiBBZG1pbmlzdHJhdGl2ZSBmaWVsZHMgZm9yIGZpbHRlci4KLQkgKi8KLQl1MzIgdmFsaWQ6MTsgICAgICAgICAgICAvKiBmaWx0ZXIgYWxsb2NhdGVkIGFuZCB2YWxpZCAqLwotCXUzMiBsb2NrZWQ6MTsgICAgICAgICAgIC8qIGZpbHRlciBpcyBhZG1pbmlzdHJhdGl2ZWx5IGxvY2tlZCAqLwotCi0JdTMyIHBlbmRpbmc6MTsgICAgICAgICAgLyogZmlsdGVyIGFjdGlvbiBpcyBwZW5kaW5nIGZpcm13YXJlIHJlcGx5ICovCi0JdTMyIHNtdGlkeDo4OyAgICAgICAgICAgLyogU291cmNlIE1BQyBUYWJsZSBpbmRleCBmb3Igc21hYyAqLwotCXN0cnVjdCBsMnRfZW50cnkgKmwydDsgIC8qIExheWVyIFR3byBUYWJsZSBlbnRyeSBmb3IgZG1hYyAqLwotCi0JLyogVGhlIGZpbHRlciBpdHNlbGYuICBNb3N0IG9mIHRoaXMgaXMgYSBzdHJhaWdodCBjb3B5IG9mIGluZm9ybWF0aW9uCi0JICogcHJvdmlkZWQgYnkgdGhlIGV4dGVuZGVkIGlvY3RsKCkuICBTb21lIGZpZWxkcyBhcmUgdHJhbnNsYXRlZCB0bwotCSAqIGludGVybmFsIGZvcm1zIC0tIGZvciBpbnN0YW5jZSB0aGUgSW5ncmVzcyBRdWV1ZSBJRCBwYXNzZWQgaW4gZnJvbQotCSAqIHRoZSBpb2N0bCgpIGlzIHRyYW5zbGF0ZWQgaW50byB0aGUgQWJzb2x1dGUgSW5ncmVzcyBRdWV1ZSBJRC4KLQkgKi8KLQlzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gZnM7Ci19OwotCiAjZGVmaW5lIERGTFRfTVNHX0VOQUJMRSAoTkVUSUZfTVNHX0RSViB8IE5FVElGX01TR19QUk9CRSB8IE5FVElGX01TR19MSU5LIHwgXAogCQkJIE5FVElGX01TR19USU1FUiB8IE5FVElGX01TR19JRkRPV04gfCBORVRJRl9NU0dfSUZVUCB8XAogCQkJIE5FVElGX01TR19SWF9FUlIgfCBORVRJRl9NU0dfVFhfRVJSKQpAQCAtMjIzLDEzICsyMDIsOCBAQAogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqY3hnYjRfZGVidWdmc19yb290OwogCi1zdGF0aWMgTElTVF9IRUFEKGFkYXB0ZXJfbGlzdCk7Ci1zdGF0aWMgREVGSU5FX01VVEVYKHVsZF9tdXRleCk7Ci0vKiBBZGFwdGVyIGxpc3QgdG8gYmUgYWNjZXNzZWQgZnJvbSBhdG9taWMgY29udGV4dCAqLwotc3RhdGljIExJU1RfSEVBRChhZGFwX3JjdV9saXN0KTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWRhcF9yY3VfbG9jayk7Ci1zdGF0aWMgc3RydWN0IGN4Z2I0X3VsZF9pbmZvIHVsZHNbQ1hHQjRfVUxEX01BWF07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdWxkX3N0cltdID0geyAiUkRNQSIsICJpU0NTSSIsICJpU0NTSVQiIH07CitMSVNUX0hFQUQoYWRhcHRlcl9saXN0KTsKK0RFRklORV9NVVRFWCh1bGRfbXV0ZXgpOwogCiBzdGF0aWMgdm9pZCBsaW5rX3JlcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtMzAzLDExICsyNzcsOSBAQAogCQkJdHhxLT5kY2JfcHJpbyA9IHZhbHVlOwogCX0KIH0KLSNlbmRpZiAvKiBDT05GSUdfQ0hFTFNJT19UNF9EQ0IgKi8KIAotaW50IGN4Z2I0X2RjYl9lbmFibGVkKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGN4Z2I0X2RjYl9lbmFibGVkKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0jaWZkZWYgQ09ORklHX0NIRUxTSU9fVDRfRENCCiAJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJaWYgKCFwaS0+ZGNiLmVuYWJsZWQpCkBAIC0zMTUsMTEgKzI4Nyw4IEBACiAKIAlyZXR1cm4gKChwaS0+ZGNiLnN0YXRlID09IENYR0I0X0RDQl9TVEFURV9GV19BTExTWU5DRUQpIHx8CiAJCShwaS0+ZGNiLnN0YXRlID09IENYR0I0X0RDQl9TVEFURV9IT1NUKSk7Ci0jZWxzZQotCXJldHVybiAwOwotI2VuZGlmCiB9Ci1FWFBPUlRfU1lNQk9MKGN4Z2I0X2RjYl9lbmFibGVkKTsKKyNlbmRpZiAvKiBDT05GSUdfQ0hFTFNJT19UNF9EQ0IgKi8KIAogdm9pZCB0NF9vc19saW5rX2NoYW5nZWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBwb3J0X2lkLCBpbnQgbGlua19zdGF0KQogewpAQCAtNTMxLDY2ICs1MDAsNiBAQAogfQogI2VuZGlmIC8qIENPTkZJR19DSEVMU0lPX1Q0X0RDQiAqLwogCi0vKiBDbGVhciBhIGZpbHRlciBhbmQgcmVsZWFzZSBhbnkgb2YgaXRzIHJlc291cmNlcyB0aGF0IHdlIG93bi4gIFRoaXMgYWxzbwotICogY2xlYXJzIHRoZSBmaWx0ZXIncyAicGVuZGluZyIgc3RhdHVzLgotICovCi1zdGF0aWMgdm9pZCBjbGVhcl9maWx0ZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBmaWx0ZXJfZW50cnkgKmYpCi17Ci0JLyogSWYgdGhlIG5ldyBvciBvbGQgZmlsdGVyIGhhdmUgbG9vcGJhY2sgcmV3cml0ZWluZyBydWxlcyB0aGVuIHdlJ2xsCi0JICogbmVlZCB0byBmcmVlIGFueSBleGlzdGluZyBMYXllciBUd28gVGFibGUgKEwyVCkgZW50cmllcyBvZiB0aGUgb2xkCi0JICogZmlsdGVyIHJ1bGUuICBUaGUgZmlybXdhcmUgd2lsbCBoYW5kbGUgZnJlZWluZyB1cCBhbnkgU291cmNlIE1BQwotCSAqIFRhYmxlIChTTVQpIGVudHJpZXMgdXNlZCBmb3IgcmV3cml0aW5nIFNvdXJjZSBNQUMgQWRkcmVzc2VzIGluCi0JICogbG9vcGJhY2sgcnVsZXMuCi0JICovCi0JaWYgKGYtPmwydCkKLQkJY3hnYjRfbDJ0X3JlbGVhc2UoZi0+bDJ0KTsKLQotCS8qIFRoZSB6ZXJvaW5nIG9mIHRoZSBmaWx0ZXIgcnVsZSBiZWxvdyBjbGVhcnMgdGhlIGZpbHRlciB2YWxpZCwKLQkgKiBwZW5kaW5nLCBsb2NrZWQgZmxhZ3MsIGwydCBwb2ludGVyLCBldGMuIHNvIGl0J3MgYWxsIHdlIG5lZWQgZm9yCi0JICogdGhpcyBvcGVyYXRpb24uCi0JICovCi0JbWVtc2V0KGYsIDAsIHNpemVvZigqZikpOwotfQotCi0vKiBIYW5kbGUgYSBmaWx0ZXIgd3JpdGUvZGVsZXRpb24gcmVwbHkuCi0gKi8KLXN0YXRpYyB2b2lkIGZpbHRlcl9ycGwoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIGNvbnN0IHN0cnVjdCBjcGxfc2V0X3RjYl9ycGwgKnJwbCkKLXsKLQl1bnNpZ25lZCBpbnQgaWR4ID0gR0VUX1RJRChycGwpOwotCXVuc2lnbmVkIGludCBuaWR4ID0gaWR4IC0gYWRhcC0+dGlkcy5mdGlkX2Jhc2U7Ci0JdW5zaWduZWQgaW50IHJldDsKLQlzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmOwotCi0JaWYgKGlkeCA+PSBhZGFwLT50aWRzLmZ0aWRfYmFzZSAmJiBuaWR4IDwKLQkgICAoYWRhcC0+dGlkcy5uZnRpZHMgKyBhZGFwLT50aWRzLm5zZnRpZHMpKSB7Ci0JCWlkeCA9IG5pZHg7Ci0JCXJldCA9IFRDQl9DT09LSUVfRyhycGwtPmNvb2tpZSk7Ci0JCWYgPSAmYWRhcC0+dGlkcy5mdGlkX3RhYltpZHhdOwotCi0JCWlmIChyZXQgPT0gRldfRklMVEVSX1dSX0ZMVF9ERUxFVEVEKSB7Ci0JCQkvKiBDbGVhciB0aGUgZmlsdGVyIHdoZW4gd2UgZ2V0IGNvbmZpcm1hdGlvbiBmcm9tIHRoZQotCQkJICogaGFyZHdhcmUgdGhhdCB0aGUgZmlsdGVyIGhhcyBiZWVuIGRlbGV0ZWQuCi0JCQkgKi8KLQkJCWNsZWFyX2ZpbHRlcihhZGFwLCBmKTsKLQkJfSBlbHNlIGlmIChyZXQgPT0gRldfRklMVEVSX1dSX1NNVF9UQkxfRlVMTCkgewotCQkJZGV2X2VycihhZGFwLT5wZGV2X2RldiwgImZpbHRlciAldSBzZXR1cCBmYWlsZWQgZHVlIHRvIGZ1bGwgU01UXG4iLAotCQkJCWlkeCk7Ci0JCQljbGVhcl9maWx0ZXIoYWRhcCwgZik7Ci0JCX0gZWxzZSBpZiAocmV0ID09IEZXX0ZJTFRFUl9XUl9GTFRfQURERUQpIHsKLQkJCWYtPnNtdGlkeCA9IChiZTY0X3RvX2NwdShycGwtPm9sZHZhbCkgPj4gMjQpICYgMHhmZjsKLQkJCWYtPnBlbmRpbmcgPSAwOyAgLyogYXN5bmNocm9ub3VzIHNldHVwIGNvbXBsZXRlZCAqLwotCQkJZi0+dmFsaWQgPSAxOwotCQl9IGVsc2UgewotCQkJLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICBJc3N1ZSBhIHdhcm5pbmcgYWJvdXQgdGhlCi0JCQkgKiBwcm9ibGVtIGFuZCBjbGVhciBldmVyeXRoaW5nIG91dC4KLQkJCSAqLwotCQkJZGV2X2VycihhZGFwLT5wZGV2X2RldiwgImZpbHRlciAldSBzZXR1cCBmYWlsZWQgd2l0aCBlcnJvciAldVxuIiwKLQkJCQlpZHgsIHJldCk7Ci0JCQljbGVhcl9maWx0ZXIoYWRhcCwgZik7Ci0JCX0KLQl9Ci19Ci0KIC8qIFJlc3BvbnNlIHF1ZXVlIGhhbmRsZXIgZm9yIHRoZSBGVyBldmVudCBxdWV1ZS4KICAqLwogc3RhdGljIGludCBmd2V2dHFfaGFuZGxlcihzdHJ1Y3Qgc2dlX3JzcHEgKnEsIGNvbnN0IF9fYmU2NCAqcnNwLApAQCAtNjc3LDU2ICs1ODYsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBGbHVzaCB0aGUgYWdncmVnYXRlZCBscm8gc2Vzc2lvbnMgKi8KLXN0YXRpYyB2b2lkIHVsZHJ4X2ZsdXNoX2hhbmRsZXIoc3RydWN0IHNnZV9yc3BxICpxKQotewotCWlmICh1bGRzW3EtPnVsZF0ubHJvX2ZsdXNoKQotCQl1bGRzW3EtPnVsZF0ubHJvX2ZsdXNoKCZxLT5scm9fbWdyKTsKLX0KLQotLyoqCi0gKgl1bGRyeF9oYW5kbGVyIC0gcmVzcG9uc2UgcXVldWUgaGFuZGxlciBmb3IgVUxEIHF1ZXVlcwotICoJQHE6IHRoZSByZXNwb25zZSBxdWV1ZSB0aGF0IHJlY2VpdmVkIHRoZSBwYWNrZXQKLSAqCUByc3A6IHRoZSByZXNwb25zZSBxdWV1ZSBkZXNjcmlwdG9yIGhvbGRpbmcgdGhlIG9mZmxvYWQgbWVzc2FnZQotICoJQGdsOiB0aGUgZ2F0aGVyIGxpc3Qgb2YgcGFja2V0IGZyYWdtZW50cwotICoKLSAqCURlbGl2ZXIgYW4gaW5ncmVzcyBvZmZsb2FkIHBhY2tldCB0byBhIFVMRC4gIEFsbCBwcm9jZXNzaW5nIGlzIGRvbmUgYnkKLSAqCXRoZSBVTEQsIHdlIGp1c3QgbWFpbnRhaW4gc3RhdGlzdGljcy4KLSAqLwotc3RhdGljIGludCB1bGRyeF9oYW5kbGVyKHN0cnVjdCBzZ2VfcnNwcSAqcSwgY29uc3QgX19iZTY0ICpyc3AsCi0JCQkgY29uc3Qgc3RydWN0IHBrdF9nbCAqZ2wpCi17Ci0Jc3RydWN0IHNnZV9vZmxkX3J4cSAqcnhxID0gY29udGFpbmVyX29mKHEsIHN0cnVjdCBzZ2Vfb2ZsZF9yeHEsIHJzcHEpOwotCWludCByZXQ7Ci0KLQkvKiBGVyBjYW4gc2VuZCBDUExzIGVuY2Fwc3VsYXRlZCBpbiBhIENQTF9GVzRfTVNHLgotCSAqLwotCWlmICgoKGNvbnN0IHN0cnVjdCByc3NfaGVhZGVyICopcnNwKS0+b3Bjb2RlID09IENQTF9GVzRfTVNHICYmCi0JICAgICgoY29uc3Qgc3RydWN0IGNwbF9mdzRfbXNnICopKHJzcCArIDEpKS0+dHlwZSA9PSBGV19UWVBFX1JTU0NQTCkKLQkJcnNwICs9IDI7Ci0KLQlpZiAocS0+Zmx1c2hfaGFuZGxlcikKLQkJcmV0ID0gdWxkc1txLT51bGRdLmxyb19yeF9oYW5kbGVyKHEtPmFkYXAtPnVsZF9oYW5kbGVbcS0+dWxkXSwKLQkJCQkJCSAgcnNwLCBnbCwgJnEtPmxyb19tZ3IsCi0JCQkJCQkgICZxLT5uYXBpKTsKLQllbHNlCi0JCXJldCA9IHVsZHNbcS0+dWxkXS5yeF9oYW5kbGVyKHEtPmFkYXAtPnVsZF9oYW5kbGVbcS0+dWxkXSwKLQkJCQkJICAgICAgcnNwLCBnbCk7Ci0KLQlpZiAocmV0KSB7Ci0JCXJ4cS0+c3RhdHMubm9tZW0rKzsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChnbCA9PSBOVUxMKQotCQlyeHEtPnN0YXRzLmltbSsrOwotCWVsc2UgaWYgKGdsID09IENYR0I0X01TR19BTikKLQkJcnhxLT5zdGF0cy5hbisrOwotCWVsc2UKLQkJcnhxLT5zdGF0cy5wa3RzKys7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB2b2lkIGRpc2FibGVfbXNpKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewogCWlmIChhZGFwdGVyLT5mbGFncyAmIFVTSU5HX01TSVgpIHsKQEAgLTc3OCwzMCArNjM3LDEyIEBACiAJCQlzbnByaW50ZihhZGFwLT5tc2l4X2luZm9bbXNpX2lkeF0uZGVzYywgbiwgIiVzLVJ4JWQiLAogCQkJCSBkLT5uYW1lLCBpKTsKIAl9Ci0KLQkvKiBvZmZsb2FkIHF1ZXVlcyAqLwotCWZvcl9lYWNoX2lzY3NpcnhxKCZhZGFwLT5zZ2UsIGkpCi0JCXNucHJpbnRmKGFkYXAtPm1zaXhfaW5mb1ttc2lfaWR4KytdLmRlc2MsIG4sICIlcy1pc2NzaSVkIiwKLQkJCSBhZGFwLT5wb3J0WzBdLT5uYW1lLCBpKTsKLQotCWZvcl9lYWNoX2lzY3NpdHJ4cSgmYWRhcC0+c2dlLCBpKQotCQlzbnByaW50ZihhZGFwLT5tc2l4X2luZm9bbXNpX2lkeCsrXS5kZXNjLCBuLCAiJXMtaVNDU0lUJWQiLAotCQkJIGFkYXAtPnBvcnRbMF0tPm5hbWUsIGkpOwotCi0JZm9yX2VhY2hfcmRtYXJ4cSgmYWRhcC0+c2dlLCBpKQotCQlzbnByaW50ZihhZGFwLT5tc2l4X2luZm9bbXNpX2lkeCsrXS5kZXNjLCBuLCAiJXMtcmRtYSVkIiwKLQkJCSBhZGFwLT5wb3J0WzBdLT5uYW1lLCBpKTsKLQotCWZvcl9lYWNoX3JkbWFjaXEoJmFkYXAtPnNnZSwgaSkKLQkJc25wcmludGYoYWRhcC0+bXNpeF9pbmZvW21zaV9pZHgrK10uZGVzYywgbiwgIiVzLXJkbWEtY2lxJWQiLAotCQkJIGFkYXAtPnBvcnRbMF0tPm5hbWUsIGkpOwogfQogCiBzdGF0aWMgaW50IHJlcXVlc3RfbXNpeF9xdWV1ZV9pcnFzKHN0cnVjdCBhZGFwdGVyICphZGFwKQogewogCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcC0+c2dlOwotCWludCBlcnIsIGV0aHFpZHgsIGlzY3NpcWlkeCA9IDAsIHJkbWFxaWR4ID0gMCwgcmRtYWNpcXFpZHggPSAwOwotCWludCBpc2NzaXRxaWR4ID0gMDsKKwlpbnQgZXJyLCBldGhxaWR4OwogCWludCBtc2lfaW5kZXggPSAyOwogCiAJZXJyID0gcmVxdWVzdF9pcnEoYWRhcC0+bXNpeF9pbmZvWzFdLnZlYywgdDRfc2dlX2ludHJfbXNpeCwgMCwKQEAgLTgxOCw1NyArNjU5LDkgQEAKIAkJCWdvdG8gdW53aW5kOwogCQltc2lfaW5kZXgrKzsKIAl9Ci0JZm9yX2VhY2hfaXNjc2lyeHEocywgaXNjc2lxaWR4KSB7Ci0JCWVyciA9IHJlcXVlc3RfaXJxKGFkYXAtPm1zaXhfaW5mb1ttc2lfaW5kZXhdLnZlYywKLQkJCQkgIHQ0X3NnZV9pbnRyX21zaXgsIDAsCi0JCQkJICBhZGFwLT5tc2l4X2luZm9bbXNpX2luZGV4XS5kZXNjLAotCQkJCSAgJnMtPmlzY3NpcnhxW2lzY3NpcWlkeF0ucnNwcSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIHVud2luZDsKLQkJbXNpX2luZGV4Kys7Ci0JfQotCWZvcl9lYWNoX2lzY3NpdHJ4cShzLCBpc2NzaXRxaWR4KSB7Ci0JCWVyciA9IHJlcXVlc3RfaXJxKGFkYXAtPm1zaXhfaW5mb1ttc2lfaW5kZXhdLnZlYywKLQkJCQkgIHQ0X3NnZV9pbnRyX21zaXgsIDAsCi0JCQkJICBhZGFwLT5tc2l4X2luZm9bbXNpX2luZGV4XS5kZXNjLAotCQkJCSAgJnMtPmlzY3NpdHJ4cVtpc2NzaXRxaWR4XS5yc3BxKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gdW53aW5kOwotCQltc2lfaW5kZXgrKzsKLQl9Ci0JZm9yX2VhY2hfcmRtYXJ4cShzLCByZG1hcWlkeCkgewotCQllcnIgPSByZXF1ZXN0X2lycShhZGFwLT5tc2l4X2luZm9bbXNpX2luZGV4XS52ZWMsCi0JCQkJICB0NF9zZ2VfaW50cl9tc2l4LCAwLAotCQkJCSAgYWRhcC0+bXNpeF9pbmZvW21zaV9pbmRleF0uZGVzYywKLQkJCQkgICZzLT5yZG1hcnhxW3JkbWFxaWR4XS5yc3BxKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gdW53aW5kOwotCQltc2lfaW5kZXgrKzsKLQl9Ci0JZm9yX2VhY2hfcmRtYWNpcShzLCByZG1hY2lxcWlkeCkgewotCQllcnIgPSByZXF1ZXN0X2lycShhZGFwLT5tc2l4X2luZm9bbXNpX2luZGV4XS52ZWMsCi0JCQkJICB0NF9zZ2VfaW50cl9tc2l4LCAwLAotCQkJCSAgYWRhcC0+bXNpeF9pbmZvW21zaV9pbmRleF0uZGVzYywKLQkJCQkgICZzLT5yZG1hY2lxW3JkbWFjaXFxaWR4XS5yc3BxKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gdW53aW5kOwotCQltc2lfaW5kZXgrKzsKLQl9CiAJcmV0dXJuIDA7CiAKIHVud2luZDoKLQl3aGlsZSAoLS1yZG1hY2lxcWlkeCA+PSAwKQotCQlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9bLS1tc2lfaW5kZXhdLnZlYywKLQkJCSAmcy0+cmRtYWNpcVtyZG1hY2lxcWlkeF0ucnNwcSk7Ci0Jd2hpbGUgKC0tcmRtYXFpZHggPj0gMCkKLQkJZnJlZV9pcnEoYWRhcC0+bXNpeF9pbmZvWy0tbXNpX2luZGV4XS52ZWMsCi0JCQkgJnMtPnJkbWFyeHFbcmRtYXFpZHhdLnJzcHEpOwotCXdoaWxlICgtLWlzY3NpdHFpZHggPj0gMCkKLQkJZnJlZV9pcnEoYWRhcC0+bXNpeF9pbmZvWy0tbXNpX2luZGV4XS52ZWMsCi0JCQkgJnMtPmlzY3NpdHJ4cVtpc2NzaXRxaWR4XS5yc3BxKTsKLQl3aGlsZSAoLS1pc2NzaXFpZHggPj0gMCkKLQkJZnJlZV9pcnEoYWRhcC0+bXNpeF9pbmZvWy0tbXNpX2luZGV4XS52ZWMsCi0JCQkgJnMtPmlzY3NpcnhxW2lzY3NpcWlkeF0ucnNwcSk7CiAJd2hpbGUgKC0tZXRocWlkeCA+PSAwKQogCQlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9bLS1tc2lfaW5kZXhdLnZlYywKIAkJCSAmcy0+ZXRocnhxW2V0aHFpZHhdLnJzcHEpOwpAQCAtODg0LDE2ICs2NzcsNiBAQAogCWZyZWVfaXJxKGFkYXAtPm1zaXhfaW5mb1sxXS52ZWMsICZzLT5md19ldnRxKTsKIAlmb3JfZWFjaF9ldGhyeHEocywgaSkKIAkJZnJlZV9pcnEoYWRhcC0+bXNpeF9pbmZvW21zaV9pbmRleCsrXS52ZWMsICZzLT5ldGhyeHFbaV0ucnNwcSk7Ci0JZm9yX2VhY2hfaXNjc2lyeHEocywgaSkKLQkJZnJlZV9pcnEoYWRhcC0+bXNpeF9pbmZvW21zaV9pbmRleCsrXS52ZWMsCi0JCQkgJnMtPmlzY3NpcnhxW2ldLnJzcHEpOwotCWZvcl9lYWNoX2lzY3NpdHJ4cShzLCBpKQotCQlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9bbXNpX2luZGV4KytdLnZlYywKLQkJCSAmcy0+aXNjc2l0cnhxW2ldLnJzcHEpOwotCWZvcl9lYWNoX3JkbWFyeHEocywgaSkKLQkJZnJlZV9pcnEoYWRhcC0+bXNpeF9pbmZvW21zaV9pbmRleCsrXS52ZWMsICZzLT5yZG1hcnhxW2ldLnJzcHEpOwotCWZvcl9lYWNoX3JkbWFjaXEocywgaSkKLQkJZnJlZV9pcnEoYWRhcC0+bXNpeF9pbmZvW21zaV9pbmRleCsrXS52ZWMsICZzLT5yZG1hY2lxW2ldLnJzcHEpOwogfQogCiAvKioKQEAgLTEwMzIsMjggKzgxNSwzMCBAQAogCX0KIH0KIAotc3RhdGljIGludCBhbGxvY19vZmxkX3J4cXMoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnEsCi0JCQkgICB1bnNpZ25lZCBpbnQgbnEsIHVuc2lnbmVkIGludCBwZXJfY2hhbiwgaW50IG1zaV9pZHgsCi0JCQkgICB1MTYgKmlkcywgYm9vbCBscm8pCi17Ci0JaW50IGksIGVycjsKIAotCWZvciAoaSA9IDA7IGkgPCBucTsgaSsrLCBxKyspIHsKLQkJaWYgKG1zaV9pZHggPiAwKQotCQkJbXNpX2lkeCsrOwotCQllcnIgPSB0NF9zZ2VfYWxsb2NfcnhxKGFkYXAsICZxLT5yc3BxLCBmYWxzZSwKLQkJCQkgICAgICAgYWRhcC0+cG9ydFtpIC8gcGVyX2NoYW5dLAotCQkJCSAgICAgICBtc2lfaWR4LCBxLT5mbC5zaXplID8gJnEtPmZsIDogTlVMTCwKLQkJCQkgICAgICAgdWxkcnhfaGFuZGxlciwKLQkJCQkgICAgICAgbHJvID8gdWxkcnhfZmx1c2hfaGFuZGxlciA6IE5VTEwsCi0JCQkJICAgICAgIDApOworc3RhdGljIGludCBzZXR1cF9md19zZ2VfcXVldWVzKHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcC0+c2dlOworCWludCBlcnIgPSAwOworCisJYml0bWFwX3plcm8ocy0+c3RhcnZpbmdfZmwsIHMtPmVncl9zeik7CisJYml0bWFwX3plcm8ocy0+dHhxX21hcGVyciwgcy0+ZWdyX3N6KTsKKworCWlmIChhZGFwLT5mbGFncyAmIFVTSU5HX01TSVgpCisJCWFkYXAtPm1zaV9pZHggPSAxOyAgICAgICAgIC8qIHZlY3RvciAwIGlzIGZvciBub24tcXVldWUgaW50ZXJydXB0cyAqLworCWVsc2UgeworCQllcnIgPSB0NF9zZ2VfYWxsb2NfcnhxKGFkYXAsICZzLT5pbnRycSwgZmFsc2UsIGFkYXAtPnBvcnRbMF0sIDAsCisJCQkJICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIC0xKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7Ci0JCW1lbXNldCgmcS0+c3RhdHMsIDAsIHNpemVvZihxLT5zdGF0cykpOwotCQlpZiAoaWRzKQotCQkJaWRzW2ldID0gcS0+cnNwcS5hYnNfaWQ7CisJCWFkYXAtPm1zaV9pZHggPSAtKChpbnQpcy0+aW50cnEuYWJzX2lkICsgMSk7CiAJfQotCXJldHVybiAwOworCisJZXJyID0gdDRfc2dlX2FsbG9jX3J4cShhZGFwLCAmcy0+ZndfZXZ0cSwgdHJ1ZSwgYWRhcC0+cG9ydFswXSwKKwkJCSAgICAgICBhZGFwLT5tc2lfaWR4LCBOVUxMLCBmd2V2dHFfaGFuZGxlciwgTlVMTCwgLTEpOworCWlmIChlcnIpCisJCXQ0X2ZyZWVfc2dlX3Jlc291cmNlcyhhZGFwKTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKioKQEAgLTEwNjYsNDEgKzg1MSwxMCBAQAogICovCiBzdGF0aWMgaW50IHNldHVwX3NnZV9xdWV1ZXMoc3RydWN0IGFkYXB0ZXIgKmFkYXApCiB7Ci0JaW50IGVyciwgbXNpX2lkeCwgaSwgajsKKwlpbnQgZXJyLCBpLCBqOwogCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcC0+c2dlOwotCi0JYml0bWFwX3plcm8ocy0+c3RhcnZpbmdfZmwsIHMtPmVncl9zeik7Ci0JYml0bWFwX3plcm8ocy0+dHhxX21hcGVyciwgcy0+ZWdyX3N6KTsKLQotCWlmIChhZGFwLT5mbGFncyAmIFVTSU5HX01TSVgpCi0JCW1zaV9pZHggPSAxOyAgICAgICAgIC8qIHZlY3RvciAwIGlzIGZvciBub24tcXVldWUgaW50ZXJydXB0cyAqLwotCWVsc2UgewotCQllcnIgPSB0NF9zZ2VfYWxsb2NfcnhxKGFkYXAsICZzLT5pbnRycSwgZmFsc2UsIGFkYXAtPnBvcnRbMF0sIDAsCi0JCQkJICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIC0xKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JCW1zaV9pZHggPSAtKChpbnQpcy0+aW50cnEuYWJzX2lkICsgMSk7Ci0JfQotCi0JLyogTk9URTogSWYgeW91IGFkZC9kZWxldGUgYW55IEluZ3Jlc3MvRWdyZXNzIFF1ZXVlIGFsbG9jYXRpb25zIGluIGhlcmUsCi0JICogZG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSB0aGUgZm9sbG93aW5nIHdoaWNoIG5lZWQgdG8gYmUKLQkgKiBzeW5jaHJvbml6ZWQgdG8gYW5kIGNoYW5nZXMgaGVyZS4KLQkgKgotCSAqIDEuIFRoZSBjYWxjdWxhdGlvbnMgb2YgTUFYX0lOR1EgaW4gY3hnYjQuaC4KLQkgKgotCSAqIDIuIFVwZGF0ZSBlbmFibGVfbXNpeC9uYW1lX21zaXhfdmVjcy9yZXF1ZXN0X21zaXhfcXVldWVfaXJxcwotCSAqICAgIHRvIGFjY29tbW9kYXRlIGFueSBuZXcvZGVsZXRlZCBJbmdyZXNzIFF1ZXVlcwotCSAqICAgIHdoaWNoIG5lZWQgTVNJLVggVmVjdG9ycy4KLQkgKgotCSAqIDMuIFVwZGF0ZSBzZ2VfcWluZm9fc2hvdygpIHRvIGluY2x1ZGUgaW5mb3JtYXRpb24gb24gdGhlCi0JICogICAgbmV3L2RlbGV0ZWQgcXVldWVzLgotCSAqLwotCWVyciA9IHQ0X3NnZV9hbGxvY19yeHEoYWRhcCwgJnMtPmZ3X2V2dHEsIHRydWUsIGFkYXAtPnBvcnRbMF0sCi0JCQkgICAgICAgbXNpX2lkeCwgTlVMTCwgZndldnRxX2hhbmRsZXIsIE5VTEwsIC0xKTsKLQlpZiAoZXJyKSB7Ci1mcmVlb3V0Ogl0NF9mcmVlX3NnZV9yZXNvdXJjZXMoYWRhcCk7Ci0JCXJldHVybiBlcnI7Ci0JfQorCXN0cnVjdCBzZ2VfdWxkX3J4cV9pbmZvICpyeHFfaW5mbyA9IHMtPnVsZF9yeHFfaW5mb1tDWEdCNF9VTERfUkRNQV07CisJdW5zaWduZWQgaW50IGNtcGxxaWQgPSAwOwogCiAJZm9yX2VhY2hfcG9ydChhZGFwLCBpKSB7CiAJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhZGFwLT5wb3J0W2ldOwpAQCAtMTEwOSwxMCArODYzLDEwIEBACiAJCXN0cnVjdCBzZ2VfZXRoX3R4cSAqdCA9ICZzLT5ldGh0eHFbcGktPmZpcnN0X3FzZXRdOwogCiAJCWZvciAoaiA9IDA7IGogPCBwaS0+bnFzZXRzOyBqKyssIHErKykgewotCQkJaWYgKG1zaV9pZHggPiAwKQotCQkJCW1zaV9pZHgrKzsKKwkJCWlmIChhZGFwLT5tc2lfaWR4ID4gMCkKKwkJCQlhZGFwLT5tc2lfaWR4Kys7CiAJCQllcnIgPSB0NF9zZ2VfYWxsb2NfcnhxKGFkYXAsICZxLT5yc3BxLCBmYWxzZSwgZGV2LAotCQkJCQkgICAgICAgbXNpX2lkeCwgJnEtPmZsLAorCQkJCQkgICAgICAgYWRhcC0+bXNpX2lkeCwgJnEtPmZsLAogCQkJCQkgICAgICAgdDRfZXRocnhfaGFuZGxlciwKIAkJCQkJICAgICAgIE5VTEwsCiAJCQkJCSAgICAgICB0NF9nZXRfbXBzX2JnX21hcChhZGFwLApAQCAtMTEzMSw4ICs4ODUsOCBAQAogCQl9CiAJfQogCi0JaiA9IHMtPmlzY3NpcXNldHMgLyBhZGFwLT5wYXJhbXMubnBvcnRzOyAvKiBpc2NzaSBxdWV1ZXMgcGVyIGNoYW5uZWwgKi8KLQlmb3JfZWFjaF9pc2NzaXJ4cShzLCBpKSB7CisJaiA9IHMtPm9mbGRxc2V0cyAvIGFkYXAtPnBhcmFtcy5ucG9ydHM7IC8qIGlzY3NpIHF1ZXVlcyBwZXIgY2hhbm5lbCAqLworCWZvcl9lYWNoX29mbGR0eHEocywgaSkgewogCQllcnIgPSB0NF9zZ2VfYWxsb2Nfb2ZsZF90eHEoYWRhcCwgJnMtPm9mbGR0eHFbaV0sCiAJCQkJCSAgICBhZGFwLT5wb3J0W2kgLyBqXSwKIAkJCQkJICAgIHMtPmZ3X2V2dHEuY250eHRfaWQpOwpAQCAtMTE0MCwzMCArODk0LDE1IEBACiAJCQlnb3RvIGZyZWVvdXQ7CiAJfQogCi0jZGVmaW5lIEFMTE9DX09GTERfUlhRUyhmaXJzdHEsIG5xLCBwZXJfY2hhbiwgaWRzLCBscm8pIGRvIHsgXAotCWVyciA9IGFsbG9jX29mbGRfcnhxcyhhZGFwLCBmaXJzdHEsIG5xLCBwZXJfY2hhbiwgbXNpX2lkeCwgaWRzLCBscm8pOyBcCi0JaWYgKGVycikgXAotCQlnb3RvIGZyZWVvdXQ7IFwKLQlpZiAobXNpX2lkeCA+IDApIFwKLQkJbXNpX2lkeCArPSBucTsgXAotfSB3aGlsZSAoMCkKLQotCUFMTE9DX09GTERfUlhRUyhzLT5pc2NzaXJ4cSwgcy0+aXNjc2lxc2V0cywgaiwgcy0+aXNjc2lfcnhxLCBmYWxzZSk7Ci0JQUxMT0NfT0ZMRF9SWFFTKHMtPmlzY3NpdHJ4cSwgcy0+bmlzY3NpdHEsIGosIHMtPmlzY3NpdF9yeHEsIHRydWUpOwotCUFMTE9DX09GTERfUlhRUyhzLT5yZG1hcnhxLCBzLT5yZG1hcXMsIDEsIHMtPnJkbWFfcnhxLCBmYWxzZSk7Ci0JaiA9IHMtPnJkbWFjaXFzIC8gYWRhcC0+cGFyYW1zLm5wb3J0czsgLyogcmRtYXEgcXVldWVzIHBlciBjaGFubmVsICovCi0JQUxMT0NfT0ZMRF9SWFFTKHMtPnJkbWFjaXEsIHMtPnJkbWFjaXFzLCBqLCBzLT5yZG1hX2NpcSwgZmFsc2UpOwotCi0jdW5kZWYgQUxMT0NfT0ZMRF9SWFFTCi0KIAlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpIHsKLQkJLyoKLQkJICogTm90ZSB0aGF0IC0+cmRtYXJ4cVtpXS5yc3BxLmNudHh0X2lkIGJlbG93IGlzIDAgaWYgd2UgZG9uJ3QKKwkJLyogTm90ZSB0aGF0IGNtcGxxaWQgYmVsb3cgaXMgMCBpZiB3ZSBkb24ndAogCQkgKiBoYXZlIFJETUEgcXVldWVzLCBhbmQgdGhhdCdzIHRoZSByaWdodCB2YWx1ZS4KIAkJICovCisJCWlmIChyeHFfaW5mbykKKwkJCWNtcGxxaWQJPSByeHFfaW5mby0+dWxkcnhxW2ldLnJzcHEuY250eHRfaWQ7CisKIAkJZXJyID0gdDRfc2dlX2FsbG9jX2N0cmxfdHhxKGFkYXAsICZzLT5jdHJscVtpXSwgYWRhcC0+cG9ydFtpXSwKLQkJCQkJICAgIHMtPmZ3X2V2dHEuY250eHRfaWQsCi0JCQkJCSAgICBzLT5yZG1hcnhxW2ldLnJzcHEuY250eHRfaWQpOworCQkJCQkgICAgcy0+ZndfZXZ0cS5jbnR4dF9pZCwgY21wbHFpZCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGZyZWVvdXQ7CiAJfQpAQCAtMTE3NCw2ICs5MTMsOSBAQAogCQkgICAgIFJTU0NPTlRST0xfVihuZXRkZXYycGluZm8oYWRhcC0+cG9ydFswXSktPnR4X2NoYW4pIHwKIAkJICAgICBRVUVVRU5VTUJFUl9WKHMtPmV0aHJ4cVswXS5yc3BxLmFic19pZCkpOwogCXJldHVybiAwOworZnJlZW91dDoKKwl0NF9mcmVlX3NnZV9yZXNvdXJjZXMoYWRhcCk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTExOTcsMTUxICs5MzksNiBAQAogCWt2ZnJlZShhZGRyKTsKIH0KIAotLyogU2VuZCBhIFdvcmsgUmVxdWVzdCB0byB3cml0ZSB0aGUgZmlsdGVyIGF0IGEgc3BlY2lmaWVkIGluZGV4LiAgV2UgY29uc3RydWN0Ci0gKiBhIEZpcm13YXJlIEZpbHRlciBXb3JrIFJlcXVlc3QgdG8gaGF2ZSB0aGUgd29yayBkb25lIGFuZCBwdXQgdGhlIGluZGljYXRlZAotICogZmlsdGVyIGludG8gInBlbmRpbmciIG1vZGUgd2hpY2ggd2lsbCBwcmV2ZW50IGFueSBmdXJ0aGVyIGFjdGlvbnMgYWdhaW5zdAotICogaXQgdGlsbCB3ZSBnZXQgYSByZXBseSBmcm9tIHRoZSBmaXJtd2FyZSBvbiB0aGUgY29tcGxldGlvbiBzdGF0dXMgb2YgdGhlCi0gKiByZXF1ZXN0LgotICovCi1zdGF0aWMgaW50IHNldF9maWx0ZXJfd3Ioc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBmaWR4KQotewotCXN0cnVjdCBmaWx0ZXJfZW50cnkgKmYgPSAmYWRhcHRlci0+dGlkcy5mdGlkX3RhYltmaWR4XTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBmd19maWx0ZXJfd3IgKmZ3cjsKLQl1bnNpZ25lZCBpbnQgZnRpZDsKLQotCXNrYiA9IGFsbG9jX3NrYihzaXplb2YoKmZ3ciksIEdGUF9LRVJORUwpOwotCWlmICghc2tiKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIElmIHRoZSBuZXcgZmlsdGVyIHJlcXVpcmVzIGxvb3BiYWNrIERlc3RpbmF0aW9uIE1BQyBhbmQvb3IgVkxBTgotCSAqIHJld3JpdGluZyB0aGVuIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBMYXllciAyIFRhYmxlIChMMlQpIGVudHJ5IGZvcgotCSAqIHRoZSBmaWx0ZXIuCi0JICovCi0JaWYgKGYtPmZzLm5ld2RtYWMgfHwgZi0+ZnMubmV3dmxhbikgewotCQkvKiBhbGxvY2F0ZSBMMlQgZW50cnkgZm9yIG5ldyBmaWx0ZXIgKi8KLQkJZi0+bDJ0ID0gdDRfbDJ0X2FsbG9jX3N3aXRjaGluZyhhZGFwdGVyLCBmLT5mcy52bGFuLAotCQkJCQkJZi0+ZnMuZXBvcnQsIGYtPmZzLmRtYWMpOwotCQlpZiAoZi0+bDJ0ID09IE5VTEwpIHsKLQkJCWtmcmVlX3NrYihza2IpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0KLQlmdGlkID0gYWRhcHRlci0+dGlkcy5mdGlkX2Jhc2UgKyBmaWR4OwotCi0JZndyID0gKHN0cnVjdCBmd19maWx0ZXJfd3IgKilfX3NrYl9wdXQoc2tiLCBzaXplb2YoKmZ3cikpOwotCW1lbXNldChmd3IsIDAsIHNpemVvZigqZndyKSk7Ci0KLQkvKiBJdCB3b3VsZCBiZSBuaWNlIHRvIHB1dCBtb3N0IG9mIHRoZSBmb2xsb3dpbmcgaW4gdDRfaHcuYyBidXQgbW9zdAotCSAqIG9mIHRoZSB3b3JrIGlzIHRyYW5zbGF0aW5nIHRoZSBjeGdidG9vbCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbgotCSAqIGludG8gdGhlIFdvcmsgUmVxdWVzdCBhbmQgdGhlIGRlZmluaXRpb24gb2YgdGhhdCBzdHJ1Y3R1cmUgaXMKLQkgKiBjdXJyZW50bHkgaW4gY3hnYnRvb2wuaCB3aGljaCBpc24ndCBhcHByb3ByaWF0ZSB0byBwdWxsIGludG8gdGhlCi0JICogY29tbW9uIGNvZGUuICBXZSBtYXkgZXZlbnR1YWxseSB0cnkgdG8gY29tZSB1cCB3aXRoIGEgbW9yZSBuZXV0cmFsCi0JICogZmlsdGVyIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGJ1dCBmb3Igbm93IGl0J3MgZWFzaWVzdCB0byBzaW1wbHkKLQkgKiBwdXQgdGhpcyBmYWlybHkgZGlyZWN0IGNvZGUgaW4gbGluZSAuLi4KLQkgKi8KLQlmd3ItPm9wX3BrZCA9IGh0b25sKEZXX1dSX09QX1YoRldfRklMVEVSX1dSKSk7Ci0JZndyLT5sZW4xNl9wa2QgPSBodG9ubChGV19XUl9MRU4xNl9WKHNpemVvZigqZndyKS8xNikpOwotCWZ3ci0+dGlkX3RvX2lxID0KLQkJaHRvbmwoRldfRklMVEVSX1dSX1RJRF9WKGZ0aWQpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX1JRVFlQRV9WKGYtPmZzLnR5cGUpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX05PUkVQTFlfVigwKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9JUV9WKGYtPmZzLmlxKSk7Ci0JZndyLT5kZWxfZmlsdGVyX3RvX2wydGl4ID0KLQkJaHRvbmwoRldfRklMVEVSX1dSX1JQVFRJRF9WKGYtPmZzLnJwdHRpZCkgfAotCQkgICAgICBGV19GSUxURVJfV1JfRFJPUF9WKGYtPmZzLmFjdGlvbiA9PSBGSUxURVJfRFJPUCkgfAotCQkgICAgICBGV19GSUxURVJfV1JfRElSU1RFRVJfVihmLT5mcy5kaXJzdGVlcikgfAotCQkgICAgICBGV19GSUxURVJfV1JfTUFTS0hBU0hfVihmLT5mcy5tYXNraGFzaCkgfAotCQkgICAgICBGV19GSUxURVJfV1JfRElSU1RFRVJIQVNIX1YoZi0+ZnMuZGlyc3RlZXJoYXNoKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9MUEJLX1YoZi0+ZnMuYWN0aW9uID09IEZJTFRFUl9TV0lUQ0gpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX0RNQUNfVihmLT5mcy5uZXdkbWFjKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9TTUFDX1YoZi0+ZnMubmV3c21hYykgfAotCQkgICAgICBGV19GSUxURVJfV1JfSU5TVkxBTl9WKGYtPmZzLm5ld3ZsYW4gPT0gVkxBTl9JTlNFUlQgfHwKLQkJCQkJICAgICBmLT5mcy5uZXd2bGFuID09IFZMQU5fUkVXUklURSkgfAotCQkgICAgICBGV19GSUxURVJfV1JfUk1WTEFOX1YoZi0+ZnMubmV3dmxhbiA9PSBWTEFOX1JFTU9WRSB8fAotCQkJCQkgICAgZi0+ZnMubmV3dmxhbiA9PSBWTEFOX1JFV1JJVEUpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX0hJVENOVFNfVihmLT5mcy5oaXRjbnRzKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9UWENIQU5fVihmLT5mcy5lcG9ydCkgfAotCQkgICAgICBGV19GSUxURVJfV1JfUFJJT19WKGYtPmZzLnByaW8pIHwKLQkJICAgICAgRldfRklMVEVSX1dSX0wyVElYX1YoZi0+bDJ0ID8gZi0+bDJ0LT5pZHggOiAwKSk7Ci0JZndyLT5ldGh0eXBlID0gaHRvbnMoZi0+ZnMudmFsLmV0aHR5cGUpOwotCWZ3ci0+ZXRodHlwZW0gPSBodG9ucyhmLT5mcy5tYXNrLmV0aHR5cGUpOwotCWZ3ci0+ZnJhZ190b19vdmxhbl92bGRtID0KLQkJKEZXX0ZJTFRFUl9XUl9GUkFHX1YoZi0+ZnMudmFsLmZyYWcpIHwKLQkJIEZXX0ZJTFRFUl9XUl9GUkFHTV9WKGYtPmZzLm1hc2suZnJhZykgfAotCQkgRldfRklMVEVSX1dSX0lWTEFOX1ZMRF9WKGYtPmZzLnZhbC5pdmxhbl92bGQpIHwKLQkJIEZXX0ZJTFRFUl9XUl9PVkxBTl9WTERfVihmLT5mcy52YWwub3ZsYW5fdmxkKSB8Ci0JCSBGV19GSUxURVJfV1JfSVZMQU5fVkxETV9WKGYtPmZzLm1hc2suaXZsYW5fdmxkKSB8Ci0JCSBGV19GSUxURVJfV1JfT1ZMQU5fVkxETV9WKGYtPmZzLm1hc2sub3ZsYW5fdmxkKSk7Ci0JZndyLT5zbWFjX3NlbCA9IDA7Ci0JZndyLT5yeF9jaGFuX3J4X3JwbF9pcSA9Ci0JCWh0b25zKEZXX0ZJTFRFUl9XUl9SWF9DSEFOX1YoMCkgfAotCQkgICAgICBGV19GSUxURVJfV1JfUlhfUlBMX0lRX1YoYWRhcHRlci0+c2dlLmZ3X2V2dHEuYWJzX2lkKSk7Ci0JZndyLT5tYWNpX3RvX21hdGNodHlwZW0gPQotCQlodG9ubChGV19GSUxURVJfV1JfTUFDSV9WKGYtPmZzLnZhbC5tYWNpZHgpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX01BQ0lNX1YoZi0+ZnMubWFzay5tYWNpZHgpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX0ZDT0VfVihmLT5mcy52YWwuZmNvZSkgfAotCQkgICAgICBGV19GSUxURVJfV1JfRkNPRU1fVihmLT5mcy5tYXNrLmZjb2UpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX1BPUlRfVihmLT5mcy52YWwuaXBvcnQpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX1BPUlRNX1YoZi0+ZnMubWFzay5pcG9ydCkgfAotCQkgICAgICBGV19GSUxURVJfV1JfTUFUQ0hUWVBFX1YoZi0+ZnMudmFsLm1hdGNodHlwZSkgfAotCQkgICAgICBGV19GSUxURVJfV1JfTUFUQ0hUWVBFTV9WKGYtPmZzLm1hc2subWF0Y2h0eXBlKSk7Ci0JZndyLT5wdGNsID0gZi0+ZnMudmFsLnByb3RvOwotCWZ3ci0+cHRjbG0gPSBmLT5mcy5tYXNrLnByb3RvOwotCWZ3ci0+dHR5cCA9IGYtPmZzLnZhbC50b3M7Ci0JZndyLT50dHlwbSA9IGYtPmZzLm1hc2sudG9zOwotCWZ3ci0+aXZsYW4gPSBodG9ucyhmLT5mcy52YWwuaXZsYW4pOwotCWZ3ci0+aXZsYW5tID0gaHRvbnMoZi0+ZnMubWFzay5pdmxhbik7Ci0JZndyLT5vdmxhbiA9IGh0b25zKGYtPmZzLnZhbC5vdmxhbik7Ci0JZndyLT5vdmxhbm0gPSBodG9ucyhmLT5mcy5tYXNrLm92bGFuKTsKLQltZW1jcHkoZndyLT5saXAsIGYtPmZzLnZhbC5saXAsIHNpemVvZihmd3ItPmxpcCkpOwotCW1lbWNweShmd3ItPmxpcG0sIGYtPmZzLm1hc2subGlwLCBzaXplb2YoZndyLT5saXBtKSk7Ci0JbWVtY3B5KGZ3ci0+ZmlwLCBmLT5mcy52YWwuZmlwLCBzaXplb2YoZndyLT5maXApKTsKLQltZW1jcHkoZndyLT5maXBtLCBmLT5mcy5tYXNrLmZpcCwgc2l6ZW9mKGZ3ci0+ZmlwbSkpOwotCWZ3ci0+bHAgPSBodG9ucyhmLT5mcy52YWwubHBvcnQpOwotCWZ3ci0+bHBtID0gaHRvbnMoZi0+ZnMubWFzay5scG9ydCk7Ci0JZndyLT5mcCA9IGh0b25zKGYtPmZzLnZhbC5mcG9ydCk7Ci0JZndyLT5mcG0gPSBodG9ucyhmLT5mcy5tYXNrLmZwb3J0KTsKLQlpZiAoZi0+ZnMubmV3c21hYykKLQkJbWVtY3B5KGZ3ci0+c21hLCBmLT5mcy5zbWFjLCBzaXplb2YoZndyLT5zbWEpKTsKLQotCS8qIE1hcmsgdGhlIGZpbHRlciBhcyAicGVuZGluZyIgYW5kIHNoaXAgb2ZmIHRoZSBGaWx0ZXIgV29yayBSZXF1ZXN0LgotCSAqIFdoZW4gd2UgZ2V0IHRoZSBXb3JrIFJlcXVlc3QgUmVwbHkgd2UnbGwgY2xlYXIgdGhlIHBlbmRpbmcgc3RhdHVzLgotCSAqLwotCWYtPnBlbmRpbmcgPSAxOwotCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfQ09OVFJPTCwgZi0+ZnMudmFsLmlwb3J0ICYgMHgzKTsKLQl0NF9vZmxkX3NlbmQoYWRhcHRlciwgc2tiKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogRGVsZXRlIHRoZSBmaWx0ZXIgYXQgYSBzcGVjaWZpZWQgaW5kZXguCi0gKi8KLXN0YXRpYyBpbnQgZGVsX2ZpbHRlcl93cihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IGZpZHgpCi17Ci0Jc3RydWN0IGZpbHRlcl9lbnRyeSAqZiA9ICZhZGFwdGVyLT50aWRzLmZ0aWRfdGFiW2ZpZHhdOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGZ3X2ZpbHRlcl93ciAqZndyOwotCXVuc2lnbmVkIGludCBsZW4sIGZ0aWQ7Ci0KLQlsZW4gPSBzaXplb2YoKmZ3cik7Ci0JZnRpZCA9IGFkYXB0ZXItPnRpZHMuZnRpZF9iYXNlICsgZmlkeDsKLQotCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9LRVJORUwpOwotCWlmICghc2tiKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZ3ciA9IChzdHJ1Y3QgZndfZmlsdGVyX3dyICopX19za2JfcHV0KHNrYiwgbGVuKTsKLQl0NF9ta19maWx0ZGVsd3IoZnRpZCwgZndyLCBhZGFwdGVyLT5zZ2UuZndfZXZ0cS5hYnNfaWQpOwotCi0JLyogTWFyayB0aGUgZmlsdGVyIGFzICJwZW5kaW5nIiBhbmQgc2hpcCBvZmYgdGhlIEZpbHRlciBXb3JrIFJlcXVlc3QuCi0JICogV2hlbiB3ZSBnZXQgdGhlIFdvcmsgUmVxdWVzdCBSZXBseSB3ZSdsbCBjbGVhciB0aGUgcGVuZGluZyBzdGF0dXMuCi0JICovCi0JZi0+cGVuZGluZyA9IDE7Ci0JdDRfbWdtdF90eChhZGFwdGVyLCBza2IpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdTE2IGN4Z2Jfc2VsZWN0X3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgIHZvaWQgKmFjY2VsX3ByaXYsIHNlbGVjdF9xdWV1ZV9mYWxsYmFja190IGZhbGxiYWNrKQogewpAQCAtMTcyMywxOSArMTMyMCwyMiBAQAogICovCiBzdGF0aWMgaW50IHRpZF9pbml0KHN0cnVjdCB0aWRfaW5mbyAqdCkKIHsKLQlzaXplX3Qgc2l6ZTsKLQl1bnNpZ25lZCBpbnQgc3RpZF9ibWFwX3NpemU7Ci0JdW5zaWduZWQgaW50IG5hdGlkcyA9IHQtPm5hdGlkczsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IGNvbnRhaW5lcl9vZih0LCBzdHJ1Y3QgYWRhcHRlciwgdGlkcyk7CisJdW5zaWduZWQgaW50IG1heF9mdGlkcyA9IHQtPm5mdGlkcyArIHQtPm5zZnRpZHM7CisJdW5zaWduZWQgaW50IG5hdGlkcyA9IHQtPm5hdGlkczsKKwl1bnNpZ25lZCBpbnQgc3RpZF9ibWFwX3NpemU7CisJdW5zaWduZWQgaW50IGZ0aWRfYm1hcF9zaXplOworCXNpemVfdCBzaXplOwogCiAJc3RpZF9ibWFwX3NpemUgPSBCSVRTX1RPX0xPTkdTKHQtPm5zdGlkcyArIHQtPm5zZnRpZHMpOworCWZ0aWRfYm1hcF9zaXplID0gQklUU19UT19MT05HUyh0LT5uZnRpZHMpOwogCXNpemUgPSB0LT5udGlkcyAqIHNpemVvZigqdC0+dGlkX3RhYikgKwogCSAgICAgICBuYXRpZHMgKiBzaXplb2YoKnQtPmF0aWRfdGFiKSArCiAJICAgICAgIHQtPm5zdGlkcyAqIHNpemVvZigqdC0+c3RpZF90YWIpICsKIAkgICAgICAgdC0+bnNmdGlkcyAqIHNpemVvZigqdC0+c3RpZF90YWIpICsKIAkgICAgICAgc3RpZF9ibWFwX3NpemUgKiBzaXplb2YobG9uZykgKwotCSAgICAgICB0LT5uZnRpZHMgKiBzaXplb2YoKnQtPmZ0aWRfdGFiKSArCi0JICAgICAgIHQtPm5zZnRpZHMgKiBzaXplb2YoKnQtPmZ0aWRfdGFiKTsKKwkgICAgICAgbWF4X2Z0aWRzICogc2l6ZW9mKCp0LT5mdGlkX3RhYikgKworCSAgICAgICBmdGlkX2JtYXBfc2l6ZSAqIHNpemVvZihsb25nKTsKIAogCXQtPnRpZF90YWIgPSB0NF9hbGxvY19tZW0oc2l6ZSk7CiAJaWYgKCF0LT50aWRfdGFiKQpAQCAtMTc0NSw4ICsxMzQ1LDEwIEBACiAJdC0+c3RpZF90YWIgPSAoc3RydWN0IHNlcnZfZW50cnkgKikmdC0+YXRpZF90YWJbbmF0aWRzXTsKIAl0LT5zdGlkX2JtYXAgPSAodW5zaWduZWQgbG9uZyAqKSZ0LT5zdGlkX3RhYlt0LT5uc3RpZHMgKyB0LT5uc2Z0aWRzXTsKIAl0LT5mdGlkX3RhYiA9IChzdHJ1Y3QgZmlsdGVyX2VudHJ5ICopJnQtPnN0aWRfYm1hcFtzdGlkX2JtYXBfc2l6ZV07CisJdC0+ZnRpZF9ibWFwID0gKHVuc2lnbmVkIGxvbmcgKikmdC0+ZnRpZF90YWJbbWF4X2Z0aWRzXTsKIAlzcGluX2xvY2tfaW5pdCgmdC0+c3RpZF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmdC0+YXRpZF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmdC0+ZnRpZF9sb2NrKTsKIAogCXQtPnN0aWRzX2luX3VzZSA9IDA7CiAJdC0+c2Z0aWRzX2luX3VzZSA9IDA7CkBAIC0xNzYxLDEyICsxMzYzLDE2IEBACiAJCQl0LT5hdGlkX3RhYltuYXRpZHMgLSAxXS5uZXh0ID0gJnQtPmF0aWRfdGFiW25hdGlkc107CiAJCXQtPmFmcmVlID0gdC0+YXRpZF90YWI7CiAJfQotCWJpdG1hcF96ZXJvKHQtPnN0aWRfYm1hcCwgdC0+bnN0aWRzICsgdC0+bnNmdGlkcyk7Ci0JLyogUmVzZXJ2ZSBzdGlkIDAgZm9yIFQ0L1Q1IGFkYXB0ZXJzICovCi0JaWYgKCF0LT5zdGlkX2Jhc2UgJiYKLQkgICAgKENIRUxTSU9fQ0hJUF9WRVJTSU9OKGFkYXAtPnBhcmFtcy5jaGlwKSA8PSBDSEVMU0lPX1Q1KSkKLQkJX19zZXRfYml0KDAsIHQtPnN0aWRfYm1hcCk7CiAKKwlpZiAoaXNfb2ZmbG9hZChhZGFwKSkgeworCQliaXRtYXBfemVybyh0LT5zdGlkX2JtYXAsIHQtPm5zdGlkcyArIHQtPm5zZnRpZHMpOworCQkvKiBSZXNlcnZlIHN0aWQgMCBmb3IgVDQvVDUgYWRhcHRlcnMgKi8KKwkJaWYgKCF0LT5zdGlkX2Jhc2UgJiYKKwkJICAgIENIRUxTSU9fQ0hJUF9WRVJTSU9OKGFkYXAtPnBhcmFtcy5jaGlwKSA8PSBDSEVMU0lPX1Q1KQorCQkJX19zZXRfYml0KDAsIHQtPnN0aWRfYm1hcCk7CisJfQorCisJYml0bWFwX3plcm8odC0+ZnRpZF9ibWFwLCB0LT5uZnRpZHMpOwogCXJldHVybiAwOwogfQogCkBAIC0yMzE2LDcgKzE5MjIsNyBAQAogCiAJZm9yX2VhY2hfZXRocnhxKCZhZGFwLT5zZ2UsIGkpCiAJCWRpc2FibGVfdHhxX2RiKCZhZGFwLT5zZ2UuZXRodHhxW2ldLnEpOwotCWZvcl9lYWNoX2lzY3NpcnhxKCZhZGFwLT5zZ2UsIGkpCisJZm9yX2VhY2hfb2ZsZHR4cSgmYWRhcC0+c2dlLCBpKQogCQlkaXNhYmxlX3R4cV9kYigmYWRhcC0+c2dlLm9mbGR0eHFbaV0ucSk7CiAJZm9yX2VhY2hfcG9ydChhZGFwLCBpKQogCQlkaXNhYmxlX3R4cV9kYigmYWRhcC0+c2dlLmN0cmxxW2ldLnEpOwpAQCAtMjMyOCw3ICsxOTM0LDcgQEAKIAogCWZvcl9lYWNoX2V0aHJ4cSgmYWRhcC0+c2dlLCBpKQogCQllbmFibGVfdHhxX2RiKGFkYXAsICZhZGFwLT5zZ2UuZXRodHhxW2ldLnEpOwotCWZvcl9lYWNoX2lzY3NpcnhxKCZhZGFwLT5zZ2UsIGkpCisJZm9yX2VhY2hfb2ZsZHR4cSgmYWRhcC0+c2dlLCBpKQogCQllbmFibGVfdHhxX2RiKGFkYXAsICZhZGFwLT5zZ2Uub2ZsZHR4cVtpXS5xKTsKIAlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpCiAJCWVuYWJsZV90eHFfZGIoYWRhcCwgJmFkYXAtPnNnZS5jdHJscVtpXS5xKTsKQEAgLTIzMzYsOSArMTk0MiwxMCBAQAogCiBzdGF0aWMgdm9pZCBub3RpZnlfcmRtYV91bGQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIGVudW0gY3hnYjRfY29udHJvbCBjbWQpCiB7Ci0JaWYgKGFkYXAtPnVsZF9oYW5kbGVbQ1hHQjRfVUxEX1JETUFdKQotCQl1bGRzW0NYR0I0X1VMRF9SRE1BXS5jb250cm9sKGFkYXAtPnVsZF9oYW5kbGVbQ1hHQjRfVUxEX1JETUFdLAotCQkJCWNtZCk7CisJZW51bSBjeGdiNF91bGQgdHlwZSA9IENYR0I0X1VMRF9SRE1BOworCisJaWYgKGFkYXAtPnVsZCAmJiBhZGFwLT51bGRbdHlwZV0uaGFuZGxlKQorCQlhZGFwLT51bGRbdHlwZV0uY29udHJvbChhZGFwLT51bGRbdHlwZV0uaGFuZGxlLCBjbWQpOwogfQogCiBzdGF0aWMgdm9pZCBwcm9jZXNzX2RiX2Z1bGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtMjM5MiwxMyArMTk5OSwxNCBAQAogCWlmIChyZXQpCiAJCUNIX1dBUk4oYWRhcCwgIkRCIGRyb3AgcmVjb3ZlcnkgZmFpbGVkLlxuIik7CiB9CisKIHN0YXRpYyB2b2lkIHJlY292ZXJfYWxsX3F1ZXVlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKIHsKIAlpbnQgaTsKIAogCWZvcl9lYWNoX2V0aHJ4cSgmYWRhcC0+c2dlLCBpKQogCQlzeW5jX3R4cV9waWR4KGFkYXAsICZhZGFwLT5zZ2UuZXRodHhxW2ldLnEpOwotCWZvcl9lYWNoX2lzY3NpcnhxKCZhZGFwLT5zZ2UsIGkpCisJZm9yX2VhY2hfb2ZsZHR4cSgmYWRhcC0+c2dlLCBpKQogCQlzeW5jX3R4cV9waWR4KGFkYXAsICZhZGFwLT5zZ2Uub2ZsZHR4cVtpXS5xKTsKIAlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpCiAJCXN5bmNfdHhxX3BpZHgoYWRhcCwgJmFkYXAtPnNnZS5jdHJscVtpXS5xKTsKQEAgLTI0NjMsOTQgKzIwNzEsMTIgQEAKIAlxdWV1ZV93b3JrKGFkYXAtPndvcmtxLCAmYWRhcC0+ZGJfZHJvcF90YXNrKTsKIH0KIAotc3RhdGljIHZvaWQgdWxkX2F0dGFjaChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IHVsZCkKK3ZvaWQgdDRfcmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXIodm9pZCkKIHsKLQl2b2lkICpoYW5kbGU7Ci0Jc3RydWN0IGN4Z2I0X2xsZF9pbmZvIGxsaTsKLQl1bnNpZ25lZCBzaG9ydCBpOwotCi0JbGxpLnBkZXYgPSBhZGFwLT5wZGV2OwotCWxsaS5wZiA9IGFkYXAtPnBmOwotCWxsaS5sMnQgPSBhZGFwLT5sMnQ7Ci0JbGxpLnRpZHMgPSAmYWRhcC0+dGlkczsKLQlsbGkucG9ydHMgPSBhZGFwLT5wb3J0OwotCWxsaS52ciA9ICZhZGFwLT52cmVzOwotCWxsaS5tdHVzID0gYWRhcC0+cGFyYW1zLm10dXM7Ci0JaWYgKHVsZCA9PSBDWEdCNF9VTERfUkRNQSkgewotCQlsbGkucnhxX2lkcyA9IGFkYXAtPnNnZS5yZG1hX3J4cTsKLQkJbGxpLmNpcV9pZHMgPSBhZGFwLT5zZ2UucmRtYV9jaXE7Ci0JCWxsaS5ucnhxID0gYWRhcC0+c2dlLnJkbWFxczsKLQkJbGxpLm5jaXEgPSBhZGFwLT5zZ2UucmRtYWNpcXM7Ci0JfSBlbHNlIGlmICh1bGQgPT0gQ1hHQjRfVUxEX0lTQ1NJKSB7Ci0JCWxsaS5yeHFfaWRzID0gYWRhcC0+c2dlLmlzY3NpX3J4cTsKLQkJbGxpLm5yeHEgPSBhZGFwLT5zZ2UuaXNjc2lxc2V0czsKLQl9IGVsc2UgaWYgKHVsZCA9PSBDWEdCNF9VTERfSVNDU0lUKSB7Ci0JCWxsaS5yeHFfaWRzID0gYWRhcC0+c2dlLmlzY3NpdF9yeHE7Ci0JCWxsaS5ucnhxID0gYWRhcC0+c2dlLm5pc2NzaXRxOwotCX0KLQlsbGkubnR4cSA9IGFkYXAtPnNnZS5pc2NzaXFzZXRzOwotCWxsaS5uY2hhbiA9IGFkYXAtPnBhcmFtcy5ucG9ydHM7Ci0JbGxpLm5wb3J0cyA9IGFkYXAtPnBhcmFtcy5ucG9ydHM7Ci0JbGxpLndyX2NyZWQgPSBhZGFwLT5wYXJhbXMub2ZsZHFfd3JfY3JlZDsKLQlsbGkuYWRhcHRlcl90eXBlID0gYWRhcC0+cGFyYW1zLmNoaXA7Ci0JbGxpLmlzY3NpX2lvbGVuID0gTUFYUlhEQVRBX0codDRfcmVhZF9yZWcoYWRhcCwgVFBfUEFSQV9SRUcyX0EpKTsKLQlsbGkuaXNjc2lfdGFnbWFzayA9IHQ0X3JlYWRfcmVnKGFkYXAsIFVMUF9SWF9JU0NTSV9UQUdNQVNLX0EpOwotCWxsaS5pc2NzaV9wZ3N6X29yZGVyID0gdDRfcmVhZF9yZWcoYWRhcCwgVUxQX1JYX0lTQ1NJX1BTWl9BKTsKLQlsbGkuaXNjc2lfbGxpbWl0ID0gdDRfcmVhZF9yZWcoYWRhcCwgVUxQX1JYX0lTQ1NJX0xMSU1JVF9BKTsKLQlsbGkuaXNjc2lfcHBtID0gJmFkYXAtPmlzY3NpX3BwbTsKLQlsbGkuY2Nsa19wcyA9IDEwMDAwMDAwMDAgLyBhZGFwLT5wYXJhbXMudnBkLmNjbGs7Ci0JbGxpLnVkYl9kZW5zaXR5ID0gMSA8PCBhZGFwLT5wYXJhbXMuc2dlLmVxX3FwcDsKLQlsbGkudWNxX2RlbnNpdHkgPSAxIDw8IGFkYXAtPnBhcmFtcy5zZ2UuaXFfcXBwOwotCWxsaS5maWx0X21vZGUgPSBhZGFwLT5wYXJhbXMudHAudmxhbl9wcmlfbWFwOwotCS8qIE1PRFFfUkVRX01BUCBzZXRzIHF1ZXVlcyAwLTMgdG8gY2hhbiAwLTMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTkNIQU47IGkrKykKLQkJbGxpLnR4X21vZHFbaV0gPSBpOwotCWxsaS5ndHNfcmVnID0gYWRhcC0+cmVncyArIE1ZUEZfUkVHKFNHRV9QRl9HVFNfQSk7Ci0JbGxpLmRiX3JlZyA9IGFkYXAtPnJlZ3MgKyBNWVBGX1JFRyhTR0VfUEZfS0RPT1JCRUxMX0EpOwotCWxsaS5md192ZXJzID0gYWRhcC0+cGFyYW1zLmZ3X3ZlcnM7Ci0JbGxpLmRiZmlmb19pbnRfdGhyZXNoID0gZGJmaWZvX2ludF90aHJlc2g7Ci0JbGxpLnNnZV9pbmdwYWRib3VuZGFyeSA9IGFkYXAtPnNnZS5mbF9hbGlnbjsKLQlsbGkuc2dlX2VncnN0YXR1c3BhZ2VzaXplID0gYWRhcC0+c2dlLnN0YXRfbGVuOwotCWxsaS5zZ2VfcGt0c2hpZnQgPSBhZGFwLT5zZ2UucGt0c2hpZnQ7Ci0JbGxpLmVuYWJsZV9md19vZmxkX2Nvbm4gPSBhZGFwLT5mbGFncyAmIEZXX09GTERfQ09OTjsKLQlsbGkubWF4X29yZGlyZF9xcCA9IGFkYXAtPnBhcmFtcy5tYXhfb3JkaXJkX3FwOwotCWxsaS5tYXhfaXJkX2FkYXB0ZXIgPSBhZGFwLT5wYXJhbXMubWF4X2lyZF9hZGFwdGVyOwotCWxsaS51bHB0eF9tZW13cml0ZV9kc2dsID0gYWRhcC0+cGFyYW1zLnVscHR4X21lbXdyaXRlX2RzZ2w7Ci0JbGxpLm5vZGVpZCA9IGRldl90b19ub2RlKGFkYXAtPnBkZXZfZGV2KTsKLQotCWhhbmRsZSA9IHVsZHNbdWxkXS5hZGQoJmxsaSk7Ci0JaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCWRldl93YXJuKGFkYXAtPnBkZXZfZGV2LAotCQkJICJjb3VsZCBub3QgYXR0YWNoIHRvIHRoZSAlcyBkcml2ZXIsIGVycm9yICVsZFxuIiwKLQkJCSB1bGRfc3RyW3VsZF0sIFBUUl9FUlIoaGFuZGxlKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlhZGFwLT51bGRfaGFuZGxlW3VsZF0gPSBoYW5kbGU7Ci0KIAlpZiAoIW5ldGV2ZW50X3JlZ2lzdGVyZWQpIHsKIAkJcmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXIoJmN4Z2I0X25ldGV2ZW50X25iKTsKIAkJbmV0ZXZlbnRfcmVnaXN0ZXJlZCA9IHRydWU7CiAJfQotCi0JaWYgKGFkYXAtPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpCi0JCXVsZHNbdWxkXS5zdGF0ZV9jaGFuZ2UoaGFuZGxlLCBDWEdCNF9TVEFURV9VUCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0dGFjaF91bGRzKHN0cnVjdCBhZGFwdGVyICphZGFwKQotewotCXVuc2lnbmVkIGludCBpOwotCi0Jc3Bpbl9sb2NrKCZhZGFwX3JjdV9sb2NrKTsKLQlsaXN0X2FkZF90YWlsX3JjdSgmYWRhcC0+cmN1X25vZGUsICZhZGFwX3JjdV9saXN0KTsKLQlzcGluX3VubG9jaygmYWRhcF9yY3VfbG9jayk7Ci0KLQltdXRleF9sb2NrKCZ1bGRfbXV0ZXgpOwotCWxpc3RfYWRkX3RhaWwoJmFkYXAtPmxpc3Rfbm9kZSwgJmFkYXB0ZXJfbGlzdCk7Ci0JZm9yIChpID0gMDsgaSA8IENYR0I0X1VMRF9NQVg7IGkrKykKLQkJaWYgKHVsZHNbaV0uYWRkKQotCQkJdWxkX2F0dGFjaChhZGFwLCBpKTsKLQltdXRleF91bmxvY2soJnVsZF9tdXRleCk7CiB9CiAKIHN0YXRpYyB2b2lkIGRldGFjaF91bGRzKHN0cnVjdCBhZGFwdGVyICphZGFwKQpAQCAtMjU2MCwyMCArMjA4NiwxNiBAQAogCW11dGV4X2xvY2soJnVsZF9tdXRleCk7CiAJbGlzdF9kZWwoJmFkYXAtPmxpc3Rfbm9kZSk7CiAJZm9yIChpID0gMDsgaSA8IENYR0I0X1VMRF9NQVg7IGkrKykKLQkJaWYgKGFkYXAtPnVsZF9oYW5kbGVbaV0pIHsKLQkJCXVsZHNbaV0uc3RhdGVfY2hhbmdlKGFkYXAtPnVsZF9oYW5kbGVbaV0sCisJCWlmIChhZGFwLT51bGQgJiYgYWRhcC0+dWxkW2ldLmhhbmRsZSkgeworCQkJYWRhcC0+dWxkW2ldLnN0YXRlX2NoYW5nZShhZGFwLT51bGRbaV0uaGFuZGxlLAogCQkJCQkgICAgIENYR0I0X1NUQVRFX0RFVEFDSCk7Ci0JCQlhZGFwLT51bGRfaGFuZGxlW2ldID0gTlVMTDsKKwkJCWFkYXAtPnVsZFtpXS5oYW5kbGUgPSBOVUxMOwogCQl9CiAJaWYgKG5ldGV2ZW50X3JlZ2lzdGVyZWQgJiYgbGlzdF9lbXB0eSgmYWRhcHRlcl9saXN0KSkgewogCQl1bnJlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyKCZjeGdiNF9uZXRldmVudF9uYik7CiAJCW5ldGV2ZW50X3JlZ2lzdGVyZWQgPSBmYWxzZTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZ1bGRfbXV0ZXgpOwotCi0Jc3Bpbl9sb2NrKCZhZGFwX3JjdV9sb2NrKTsKLQlsaXN0X2RlbF9yY3UoJmFkYXAtPnJjdV9ub2RlKTsKLQlzcGluX3VubG9jaygmYWRhcF9yY3VfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIG5vdGlmeV91bGRzKHN0cnVjdCBhZGFwdGVyICphZGFwLCBlbnVtIGN4Z2I0X3N0YXRlIG5ld19zdGF0ZSkKQEAgLTI1ODIsNjEgKzIxMDQsMTIgQEAKIAogCW11dGV4X2xvY2soJnVsZF9tdXRleCk7CiAJZm9yIChpID0gMDsgaSA8IENYR0I0X1VMRF9NQVg7IGkrKykKLQkJaWYgKGFkYXAtPnVsZF9oYW5kbGVbaV0pCi0JCQl1bGRzW2ldLnN0YXRlX2NoYW5nZShhZGFwLT51bGRfaGFuZGxlW2ldLCBuZXdfc3RhdGUpOworCQlpZiAoYWRhcC0+dWxkICYmIGFkYXAtPnVsZFtpXS5oYW5kbGUpCisJCQlhZGFwLT51bGRbaV0uc3RhdGVfY2hhbmdlKGFkYXAtPnVsZFtpXS5oYW5kbGUsCisJCQkJCQkgIG5ld19zdGF0ZSk7CiAJbXV0ZXhfdW5sb2NrKCZ1bGRfbXV0ZXgpOwogfQogCi0vKioKLSAqCWN4Z2I0X3JlZ2lzdGVyX3VsZCAtIHJlZ2lzdGVyIGFuIHVwcGVyLWxheWVyIGRyaXZlcgotICoJQHR5cGU6IHRoZSBVTEQgdHlwZQotICoJQHA6IHRoZSBVTEQgbWV0aG9kcwotICoKLSAqCVJlZ2lzdGVycyBhbiB1cHBlci1sYXllciBkcml2ZXIgd2l0aCB0aGlzIGRyaXZlciBhbmQgbm90aWZpZXMgdGhlIFVMRAotICoJYWJvdXQgYW55IHByZXNlbnRseSBhdmFpbGFibGUgZGV2aWNlcyB0aGF0IHN1cHBvcnQgaXRzIHR5cGUuICBSZXR1cm5zCi0gKgklLUVCVVNZIGlmIGEgVUxEIG9mIHRoZSBzYW1lIHR5cGUgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotICovCi1pbnQgY3hnYjRfcmVnaXN0ZXJfdWxkKGVudW0gY3hnYjRfdWxkIHR5cGUsIGNvbnN0IHN0cnVjdCBjeGdiNF91bGRfaW5mbyAqcCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcDsKLQotCWlmICh0eXBlID49IENYR0I0X1VMRF9NQVgpCi0JCXJldHVybiAtRUlOVkFMOwotCW11dGV4X2xvY2soJnVsZF9tdXRleCk7Ci0JaWYgKHVsZHNbdHlwZV0uYWRkKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCXVsZHNbdHlwZV0gPSAqcDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFkYXAsICZhZGFwdGVyX2xpc3QsIGxpc3Rfbm9kZSkKLQkJdWxkX2F0dGFjaChhZGFwLCB0eXBlKTsKLW91dDoJbXV0ZXhfdW5sb2NrKCZ1bGRfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGN4Z2I0X3JlZ2lzdGVyX3VsZCk7Ci0KLS8qKgotICoJY3hnYjRfdW5yZWdpc3Rlcl91bGQgLSB1bnJlZ2lzdGVyIGFuIHVwcGVyLWxheWVyIGRyaXZlcgotICoJQHR5cGU6IHRoZSBVTEQgdHlwZQotICoKLSAqCVVucmVnaXN0ZXJzIGFuIGV4aXN0aW5nIHVwcGVyLWxheWVyIGRyaXZlci4KLSAqLwotaW50IGN4Z2I0X3VucmVnaXN0ZXJfdWxkKGVudW0gY3hnYjRfdWxkIHR5cGUpCi17Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXA7Ci0KLQlpZiAodHlwZSA+PSBDWEdCNF9VTERfTUFYKQotCQlyZXR1cm4gLUVJTlZBTDsKLQltdXRleF9sb2NrKCZ1bGRfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoYWRhcCwgJmFkYXB0ZXJfbGlzdCwgbGlzdF9ub2RlKQotCQlhZGFwLT51bGRfaGFuZGxlW3R5cGVdID0gTlVMTDsKLQl1bGRzW3R5cGVdLmFkZCA9IE5VTEw7Ci0JbXV0ZXhfdW5sb2NrKCZ1bGRfbXV0ZXgpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChjeGdiNF91bnJlZ2lzdGVyX3VsZCk7Ci0KICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogc3RhdGljIGludCBjeGdiNF9pbmV0NmFkZHJfaGFuZGxlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCiAJCQkJICAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGF0YSkKQEAgLTI3NDEsNyArMjIxNCw2IEBACiAJCQkJICBhZGFwLT5tc2l4X2luZm9bMF0uZGVzYywgYWRhcCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGlycV9lcnI7Ci0KIAkJZXJyID0gcmVxdWVzdF9tc2l4X3F1ZXVlX2lycXMoYWRhcCk7CiAJCWlmIChlcnIpIHsKIAkJCWZyZWVfaXJxKGFkYXAtPm1zaXhfaW5mb1swXS52ZWMsIGFkYXApOwpAQCAtMjgxOSw0MCArMjI5MSw2IEBACiAJcmV0dXJuIHQ0X2VuYWJsZV92aShhZGFwdGVyLCBhZGFwdGVyLT5wZiwgcGktPnZpaWQsIGZhbHNlLCBmYWxzZSk7CiB9CiAKLS8qIFJldHVybiBhbiBlcnJvciBudW1iZXIgaWYgdGhlIGluZGljYXRlZCBmaWx0ZXIgaXNuJ3Qgd3JpdGFibGUgLi4uCi0gKi8KLXN0YXRpYyBpbnQgd3JpdGFibGVfZmlsdGVyKHN0cnVjdCBmaWx0ZXJfZW50cnkgKmYpCi17Ci0JaWYgKGYtPmxvY2tlZCkKLQkJcmV0dXJuIC1FUEVSTTsKLQlpZiAoZi0+cGVuZGluZykKLQkJcmV0dXJuIC1FQlVTWTsKLQotCXJldHVybiAwOwotfQotCi0vKiBEZWxldGUgdGhlIGZpbHRlciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IChpZiB2YWxpZCkuICBUaGUgY2hlY2tzIGZvciBhbGwKLSAqIHRoZSBjb21tb24gcHJvYmxlbXMgd2l0aCBkb2luZyB0aGlzIGxpa2UgdGhlIGZpbHRlciBiZWluZyBsb2NrZWQsIGN1cnJlbnRseQotICogcGVuZGluZyBpbiBhbm90aGVyIG9wZXJhdGlvbiwgZXRjLgotICovCi1zdGF0aWMgaW50IGRlbGV0ZV9maWx0ZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBmaWR4KQotewotCXN0cnVjdCBmaWx0ZXJfZW50cnkgKmY7Ci0JaW50IHJldDsKLQotCWlmIChmaWR4ID49IGFkYXB0ZXItPnRpZHMubmZ0aWRzICsgYWRhcHRlci0+dGlkcy5uc2Z0aWRzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWYgPSAmYWRhcHRlci0+dGlkcy5mdGlkX3RhYltmaWR4XTsKLQlyZXQgPSB3cml0YWJsZV9maWx0ZXIoZik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlpZiAoZi0+dmFsaWQpCi0JCXJldHVybiBkZWxfZmlsdGVyX3dyKGFkYXB0ZXIsIGZpZHgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIGludCBjeGdiNF9jcmVhdGVfc2VydmVyX2ZpbHRlcihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc3RpZCwKIAkJX19iZTMyIHNpcCwgX19iZTE2IHNwb3J0LCBfX2JlMTYgdmxhbiwKIAkJdW5zaWduZWQgaW50IHF1ZXVlLCB1bnNpZ25lZCBjaGFyIHBvcnQsIHVuc2lnbmVkIGNoYXIgbWFzaykKQEAgLTI5MjIsNyArMjM2MCw2IEBACiBpbnQgY3hnYjRfcmVtb3ZlX3NlcnZlcl9maWx0ZXIoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN0aWQsCiAJCXVuc2lnbmVkIGludCBxdWV1ZSwgYm9vbCBpcHY2KQogewotCWludCByZXQ7CiAJc3RydWN0IGZpbHRlcl9lbnRyeSAqZjsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcDsKIApAQCAtMjkzNiwxMSArMjM3Myw3IEBACiAJLyogVW5sb2NrIHRoZSBmaWx0ZXIgKi8KIAlmLT5sb2NrZWQgPSAwOwogCi0JcmV0ID0gZGVsZXRlX2ZpbHRlcihhZGFwLCBzdGlkKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGRlbGV0ZV9maWx0ZXIoYWRhcCwgc3RpZCk7CiB9CiBFWFBPUlRfU1lNQk9MKGN4Z2I0X3JlbW92ZV9zZXJ2ZXJfZmlsdGVyKTsKIApAQCAtMzA3OCw2ICsyNTExLDg1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIENPTkZJR19QQ0lfSU9WCitzdGF0aWMgaW50IGR1bW15X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBUdXJuIGNhcnJpZXIgb2ZmIHNpbmNlIHdlIGRvbid0IGhhdmUgdG8gdHJhbnNtaXQgYW55dGhpbmcgb24gdGhpcworCSAqIGludGVyZmFjZS4KKwkgKi8KKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCXJldHVybiAwOworfQorCisvKiBGaWxsIE1BQyBhZGRyZXNzIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCBieSB0aGUgRlcgKi8KK3N0YXRpYyB2b2lkIGZpbGxfdmZfc3RhdGlvbl9tYWNfYWRkcihzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1OCBod19hZGRyW0VUSF9BTEVOXSwgbWFjYWRkcltFVEhfQUxFTl07CisJaW50IGVycjsKKwl1OCAqbmE7CisJdTE2IGEsIGI7CisKKwllcnIgPSB0NF9nZXRfcmF3X3ZwZF9wYXJhbXMoYWRhcCwgJmFkYXAtPnBhcmFtcy52cGQpOworCWlmICghZXJyKSB7CisJCW5hID0gYWRhcC0+cGFyYW1zLnZwZC5uYTsKKwkJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCQlod19hZGRyW2ldID0gKGhleDJ2YWwobmFbMiAqIGkgKyAwXSkgKiAxNiArCisJCQkJICAgICAgaGV4MnZhbChuYVsyICogaSArIDFdKSk7CisJCWEgPSAoaHdfYWRkclswXSA8PCA4KSB8IGh3X2FkZHJbMV07CisJCWIgPSAoaHdfYWRkclsxXSA8PCA4KSB8IGh3X2FkZHJbMl07CisJCWEgXj0gYjsKKwkJYSB8PSAweDAyMDA7ICAgIC8qIGxvY2FsbHkgYXNzaWduZWQgRXRoZXJuZXQgTUFDIGFkZHJlc3MgKi8KKwkJYSAmPSB+MHgwMTAwOyAgIC8qIG5vdCBhIG11bHRpY2FzdCBFdGhlcm5ldCBNQUMgYWRkcmVzcyAqLworCQltYWNhZGRyWzBdID0gYSA+PiA4OworCQltYWNhZGRyWzFdID0gYSAmIDB4ZmY7CisKKwkJZm9yIChpID0gMjsgaSA8IDU7IGkrKykKKwkJCW1hY2FkZHJbaV0gPSBod19hZGRyW2kgKyAxXTsKKworCQlmb3IgKGkgPSAwOyBpIDwgYWRhcC0+bnVtX3ZmczsgaSsrKSB7CisJCQltYWNhZGRyWzVdID0gYWRhcC0+cGYgKiAxNiArIGk7CisJCQlldGhlcl9hZGRyX2NvcHkoYWRhcC0+dmZpbmZvW2ldLnZmX21hY19hZGRyLCBtYWNhZGRyKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBjeGdiX3NldF92Zl9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZmLCB1OCAqbWFjKQoreworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHBpLT5hZGFwdGVyOworCWludCByZXQ7CisKKwkvKiB2ZXJpZnkgTUFDIGFkZHIgaXMgdmFsaWQgKi8KKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIobWFjKSkgeworCQlkZXZfZXJyKHBpLT5hZGFwdGVyLT5wZGV2X2RldiwKKwkJCSJJbnZhbGlkIEV0aGVybmV0IGFkZHJlc3MgJXBNIGZvciBWRiAlZFxuIiwKKwkJCW1hYywgdmYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfaW5mbyhwaS0+YWRhcHRlci0+cGRldl9kZXYsCisJCSAiU2V0dGluZyBNQUMgJXBNIG9uIFZGICVkXG4iLCBtYWMsIHZmKTsKKwlyZXQgPSB0NF9zZXRfdmZfbWFjX2FjbChhZGFwLCB2ZiArIDEsIDEsIG1hYyk7CisJaWYgKCFyZXQpCisJCWV0aGVyX2FkZHJfY29weShhZGFwLT52ZmluZm9bdmZdLnZmX21hY19hZGRyLCBtYWMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY3hnYl9nZXRfdmZfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBpbnQgdmYsIHN0cnVjdCBpZmxhX3ZmX2luZm8gKml2aSkKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBwaS0+YWRhcHRlcjsKKworCWlmICh2ZiA+PSBhZGFwLT5udW1fdmZzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpdmktPnZmID0gdmY7CisJZXRoZXJfYWRkcl9jb3B5KGl2aS0+bWFjLCBhZGFwLT52ZmluZm9bdmZdLnZmX21hY19hZGRyKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiBzdGF0aWMgaW50IGN4Z2Jfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCiB7CiAJaW50IHJldDsKQEAgLTMxMTQsNiArMjYyNiwxMTYgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgaW50IGN4Z2Jfc2V0X3R4X21heHJhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluZGV4LCB1MzIgcmF0ZSkKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBwaS0+YWRhcHRlcjsKKwlzdHJ1Y3Qgc2NoZWRfY2xhc3MgKmU7CisJc3RydWN0IGNoX3NjaGVkX3BhcmFtcyBwOworCXN0cnVjdCBjaF9zY2hlZF9xdWV1ZSBxZTsKKwl1MzIgcmVxX3JhdGU7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWNhbl9zY2hlZChkZXYpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHBpLT5ucXNldHMgLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKGFkYXAtPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpKSB7CisJCWRldl9lcnIoYWRhcC0+cGRldl9kZXYsCisJCQkiRmFpbGVkIHRvIHJhdGUgbGltaXQgb24gcXVldWUgJWQuIExpbmsgRG93bj9cbiIsCisJCQlpbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENvbnZlcnQgZnJvbSBNYnBzIHRvIEticHMgKi8KKwlyZXFfcmF0ZSA9IHJhdGUgPDwgMTA7CisKKwkvKiBNYXggcmF0ZSBpcyAxMCBHYnBzICovCisJaWYgKHJlcV9yYXRlID49IFNDSEVEX01BWF9SQVRFX0tCUFMpIHsKKwkJZGV2X2VycihhZGFwLT5wZGV2X2RldiwKKwkJCSJJbnZhbGlkIHJhdGUgJXUgTWJwcywgTWF4IHJhdGUgaXMgJXUgR2Jwc1xuIiwKKwkJCXJhdGUsIFNDSEVEX01BWF9SQVRFX0tCUFMpOworCQlyZXR1cm4gLUVSQU5HRTsKKwl9CisKKwkvKiBGaXJzdCB1bmJpbmQgdGhlIHF1ZXVlIGZyb20gYW55IGV4aXN0aW5nIGNsYXNzICovCisJbWVtc2V0KCZxZSwgMCwgc2l6ZW9mKHFlKSk7CisJcWUucXVldWUgPSBpbmRleDsKKwlxZS5jbGFzcyA9IFNDSEVEX0NMU19OT05FOworCisJZXJyID0gY3hnYjRfc2NoZWRfY2xhc3NfdW5iaW5kKGRldiwgKHZvaWQgKikoJnFlKSwgU0NIRURfUVVFVUUpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihhZGFwLT5wZGV2X2RldiwKKwkJCSJVbmJpbmRpbmcgUXVldWUgJWQgb24gcG9ydCAlZCBmYWlsLiBFcnI6ICVkXG4iLAorCQkJaW5kZXgsIHBpLT5wb3J0X2lkLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIFF1ZXVlIGFscmVhZHkgdW5ib3VuZCAqLworCWlmICghcmVxX3JhdGUpCisJCXJldHVybiAwOworCisJLyogRmV0Y2ggYW55IGF2YWlsYWJsZSB1bnVzZWQgb3IgbWF0Y2hpbmcgc2NoZWR1bGluZyBjbGFzcyAqLworCW1lbXNldCgmcCwgMCwgc2l6ZW9mKHApKTsKKwlwLnR5cGUgPSBTQ0hFRF9DTEFTU19UWVBFX1BBQ0tFVDsKKwlwLnUucGFyYW1zLmxldmVsICAgID0gU0NIRURfQ0xBU1NfTEVWRUxfQ0xfUkw7CisJcC51LnBhcmFtcy5tb2RlICAgICA9IFNDSEVEX0NMQVNTX01PREVfQ0xBU1M7CisJcC51LnBhcmFtcy5yYXRldW5pdCA9IFNDSEVEX0NMQVNTX1JBVEVVTklUX0JJVFM7CisJcC51LnBhcmFtcy5yYXRlbW9kZSA9IFNDSEVEX0NMQVNTX1JBVEVNT0RFX0FCUzsKKwlwLnUucGFyYW1zLmNoYW5uZWwgID0gcGktPnR4X2NoYW47CisJcC51LnBhcmFtcy5jbGFzcyAgICA9IFNDSEVEX0NMU19OT05FOworCXAudS5wYXJhbXMubWlucmF0ZSAgPSAwOworCXAudS5wYXJhbXMubWF4cmF0ZSAgPSByZXFfcmF0ZTsKKwlwLnUucGFyYW1zLndlaWdodCAgID0gMDsKKwlwLnUucGFyYW1zLnBrdHNpemUgID0gZGV2LT5tdHU7CisKKwllID0gY3hnYjRfc2NoZWRfY2xhc3NfYWxsb2MoZGV2LCAmcCk7CisJaWYgKCFlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEJpbmQgdGhlIHF1ZXVlIHRvIGEgc2NoZWR1bGluZyBjbGFzcyAqLworCW1lbXNldCgmcWUsIDAsIHNpemVvZihxZSkpOworCXFlLnF1ZXVlID0gaW5kZXg7CisJcWUuY2xhc3MgPSBlLT5pZHg7CisKKwllcnIgPSBjeGdiNF9zY2hlZF9jbGFzc19iaW5kKGRldiwgKHZvaWQgKikoJnFlKSwgU0NIRURfUVVFVUUpOworCWlmIChlcnIpCisJCWRldl9lcnIoYWRhcC0+cGRldl9kZXYsCisJCQkiUXVldWUgcmF0ZSBsaW1pdGluZyBmYWlsZWQuIEVycjogJWRcbiIsIGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjeGdiX3NldHVwX3RjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBoYW5kbGUsIF9fYmUxNiBwcm90bywKKwkJCSBzdHJ1Y3QgdGNfdG9fbmV0ZGV2ICp0YykKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldjJwaW5mbyhkZXYpOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gbmV0ZGV2MmFkYXAoZGV2KTsKKworCWlmICghKGFkYXAtPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpKSB7CisJCWRldl9lcnIoYWRhcC0+cGRldl9kZXYsCisJCQkiRmFpbGVkIHRvIHNldHVwIHRjIG9uIHBvcnQgJWQuIExpbmsgRG93bj9cbiIsCisJCQlwaS0+cG9ydF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChUQ19IX01BSihoYW5kbGUpID09IFRDX0hfTUFKKFRDX0hfSU5HUkVTUykgJiYKKwkgICAgdGMtPnR5cGUgPT0gVENfU0VUVVBfQ0xTVTMyKSB7CisJCXN3aXRjaCAodGMtPmNsc191MzItPmNvbW1hbmQpIHsKKwkJY2FzZSBUQ19DTFNVMzJfTkVXX0tOT0RFOgorCQljYXNlIFRDX0NMU1UzMl9SRVBMQUNFX0tOT0RFOgorCQkJcmV0dXJuIGN4Z2I0X2NvbmZpZ19rbm9kZShkZXYsIHByb3RvLCB0Yy0+Y2xzX3UzMik7CisJCWNhc2UgVENfQ0xTVTMyX0RFTEVURV9LTk9ERToKKwkJCXJldHVybiBjeGdiNF9kZWxldGVfa25vZGUoZGV2LCBwcm90bywgdGMtPmNsc191MzIpOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJfQorCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGN4Z2I0X25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuICAgICAgICAgICAgID0gY3hnYl9vcGVuLAogCS5uZG9fc3RvcCAgICAgICAgICAgICA9IGN4Z2JfY2xvc2UsCkBAIC0zMTM2LDcgKzI3NTgsMzEgQEAKICNpZmRlZiBDT05GSUdfTkVUX1JYX0JVU1lfUE9MTAogCS5uZG9fYnVzeV9wb2xsICAgICAgICA9IGN4Z2JfYnVzeV9wb2xsLAogI2VuZGlmCisJLm5kb19zZXRfdHhfbWF4cmF0ZSAgID0gY3hnYl9zZXRfdHhfbWF4cmF0ZSwKKwkubmRvX3NldHVwX3RjICAgICAgICAgPSBjeGdiX3NldHVwX3RjLAorfTsKIAorI2lmZGVmIENPTkZJR19QQ0lfSU9WCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGN4Z2I0X21nbXRfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4gICAgICAgICAgICAgPSBkdW1teV9vcGVuLAorCS5uZG9fc2V0X3ZmX21hYyAgICAgICA9IGN4Z2Jfc2V0X3ZmX21hYywKKwkubmRvX2dldF92Zl9jb25maWcgICAgPSBjeGdiX2dldF92Zl9jb25maWcsCit9OworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGdldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYyYWRhcChkZXYpOworCisJc3RybGNweShpbmZvLT5kcml2ZXIsIGN4Z2I0X2RyaXZlcl9uYW1lLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBjeGdiNF9kcml2ZXJfdmVyc2lvbiwKKwkJc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSwKKwkJc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgY3hnYjRfbWdtdF9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8gICAgICAgPSBnZXRfZHJ2aW5mbywKIH07CiAKIHZvaWQgdDRfZmF0YWxfZXJyKHN0cnVjdCBhZGFwdGVyICphZGFwKQpAQCAtMzk3OSw2ICszNjI1LDEyIEBACiAJYWRhcC0+Y2xpcHRfc3RhcnQgPSB2YWxbMF07CiAJYWRhcC0+Y2xpcHRfZW5kID0gdmFsWzFdOwogCisJLyogV2UgZG9uJ3QgeWV0IGhhdmUgYSBQQVJBTXMgY2FsbHMgdG8gcmV0cmlldmUgdGhlIG51bWJlciBvZiBUcmFmZmljCisJICogQ2xhc3NlcyBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlL2Zpcm13YXJlIHNvIHdlIGhhcmQgY29kZSBpdCBoZXJlCisJICogZm9yIG5vdy4KKwkgKi8KKwlhZGFwLT5wYXJhbXMubnNjaGVkX2NscyA9IGlzX3Q0KGFkYXAtPnBhcmFtcy5jaGlwKSA/IDE1IDogMTY7CisKIAkvKiBxdWVyeSBwYXJhbXMgcmVsYXRlZCB0byBhY3RpdmUgZmlsdGVyIHJlZ2lvbiAqLwogCXBhcmFtc1swXSA9IEZXX1BBUkFNX1BGVkYoQUNUSVZFX0ZJTFRFUl9TVEFSVCk7CiAJcGFyYW1zWzFdID0gRldfUEFSQU1fUEZWRihBQ1RJVkVfRklMVEVSX0VORCk7CkBAIC00MDY3LDYgKzM3MTksNyBAQAogCQlhZGFwLT5wYXJhbXMub2ZsZHFfd3JfY3JlZCA9IHZhbFs1XTsKIAogCQlhZGFwLT5wYXJhbXMub2ZmbG9hZCA9IDE7CisJCWFkYXAtPm51bV9vZmxkX3VsZCArPSAxOwogCX0KIAlpZiAoY2Fwc19jbWQucmRtYWNhcHMpIHsKIAkJcGFyYW1zWzBdID0gRldfUEFSQU1fUEZWRihTVEFHX1NUQVJUKTsKQEAgLTQxMTksNiArMzc3Miw3IEBACiAJCQkgIm1heF9vcmRpcmRfcXAgJWQgbWF4X2lyZF9hZGFwdGVyICVkXG4iLAogCQkJIGFkYXAtPnBhcmFtcy5tYXhfb3JkaXJkX3FwLAogCQkJIGFkYXAtPnBhcmFtcy5tYXhfaXJkX2FkYXB0ZXIpOworCQlhZGFwLT5udW1fb2ZsZF91bGQgKz0gMjsKIAl9CiAJaWYgKGNhcHNfY21kLmlzY3NpY2FwcykgewogCQlwYXJhbXNbMF0gPSBGV19QQVJBTV9QRlZGKElTQ1NJX1NUQVJUKTsKQEAgLTQxMjksNiArMzc4MywxMyBAQAogCQkJZ290byBieWU7CiAJCWFkYXAtPnZyZXMuaXNjc2kuc3RhcnQgPSB2YWxbMF07CiAJCWFkYXAtPnZyZXMuaXNjc2kuc2l6ZSA9IHZhbFsxXSAtIHZhbFswXSArIDE7CisJCS8qIExJTyB0YXJnZXQgYW5kIGN4Z2I0aSBpbml0aWFpdG9yICovCisJCWFkYXAtPm51bV9vZmxkX3VsZCArPSAyOworCX0KKwlpZiAoY2Fwc19jbWQuY3J5cHRvY2FwcykgeworCQkvKiBTaG91bGQgcXVlcnkgcGFyYW1zIGhlcmUuLi5UT0RPICovCisJCWFkYXAtPnBhcmFtcy5jcnlwdG8gfD0gVUxQX0NSWVBUT19MT09LQVNJREU7CisJCWFkYXAtPm51bV91bGQgKz0gMTsKIAl9CiAjdW5kZWYgRldfUEFSQU1fUEZWRgogI3VuZGVmIEZXX1BBUkFNX0RFVgpAQCAtNDMwNSwyMCArMzk2NiwxNyBAQAogCS5yZXN1bWUgICAgICAgICA9IGVlaF9yZXN1bWUsCiB9OwogCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgTGluayBDb25maWd1cmF0aW9uIHN1cHBvcnRzICJIaWdoIFNwZWVkcyIgKHRob3NlIGdyZWF0ZXIKKyAqIHRoYW4gMUdiL3MpLgorICovCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNfeF8xMGdfcG9ydChjb25zdCBzdHJ1Y3QgbGlua19jb25maWcgKmxjKQogewotCXJldHVybiAobGMtPnN1cHBvcnRlZCAmIEZXX1BPUlRfQ0FQX1NQRUVEXzEwRykgIT0gMCB8fAotCSAgICAgICAobGMtPnN1cHBvcnRlZCAmIEZXX1BPUlRfQ0FQX1NQRUVEXzQwRykgIT0gMDsKLX0KKwl1bnNpZ25lZCBpbnQgc3BlZWRzLCBoaWdoX3NwZWVkczsKIAotc3RhdGljIGlubGluZSB2b2lkIGluaXRfcnNwcShzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV9yc3BxICpxLAotCQkJICAgICB1bnNpZ25lZCBpbnQgdXMsIHVuc2lnbmVkIGludCBjbnQsCi0JCQkgICAgIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBpbnQgaXFlX3NpemUpCi17Ci0JcS0+YWRhcCA9IGFkYXA7Ci0JY3hnYjRfc2V0X3JzcHFfaW50cl9wYXJhbXMocSwgdXMsIGNudCk7Ci0JcS0+aXFlX2xlbiA9IGlxZV9zaXplOwotCXEtPnNpemUgPSBzaXplOworCXNwZWVkcyA9IEZXX1BPUlRfQ0FQX1NQRUVEX1YoRldfUE9SVF9DQVBfU1BFRURfRyhsYy0+c3VwcG9ydGVkKSk7CisJaGlnaF9zcGVlZHMgPSBzcGVlZHMgJiB+KEZXX1BPUlRfQ0FQX1NQRUVEXzEwME0gfCBGV19QT1JUX0NBUF9TUEVFRF8xRyk7CisKKwlyZXR1cm4gaGlnaF9zcGVlZHMgIT0gMDsKIH0KIAogLyoKQEAgLTQzMzMsNyArMzk5MSwxNiBAQAogI2lmbmRlZiBDT05GSUdfQ0hFTFNJT19UNF9EQ0IKIAlpbnQgcTEwZyA9IDA7CiAjZW5kaWYKLQlpbnQgY2lxX3NpemU7CisKKwkvKiBSZWR1Y2UgbWVtb3J5IHVzYWdlIGluIGtkdW1wIGVudmlyb25tZW50LCBkaXNhYmxlIGFsbCBvZmZsb2FkLgorCSAqLworCWlmIChpc19rZHVtcF9rZXJuZWwoKSkgeworCQlhZGFwLT5wYXJhbXMub2ZmbG9hZCA9IDA7CisJCWFkYXAtPnBhcmFtcy5jcnlwdG8gPSAwOworCX0gZWxzZSBpZiAoaXNfdWxkKGFkYXApICYmIHQ0X3VsZF9tZW1fYWxsb2MoYWRhcCkpIHsKKwkJYWRhcC0+cGFyYW1zLm9mZmxvYWQgPSAwOworCQlhZGFwLT5wYXJhbXMuY3J5cHRvID0gMDsKKwl9CiAKIAlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpCiAJCW4xMGcgKz0gaXNfeF8xMGdfcG9ydCgmYWRhcDJwaW5mbyhhZGFwLCBpKS0+bGlua19jZmcpOwpAQCAtNDM2NSwxMSArNDAzMiw2IEBACiAJaWYgKHExMGcgPiBuZXRpZl9nZXRfbnVtX2RlZmF1bHRfcnNzX3F1ZXVlcygpKQogCQlxMTBnID0gbmV0aWZfZ2V0X251bV9kZWZhdWx0X3Jzc19xdWV1ZXMoKTsKIAotCS8qIFJlZHVjZSBtZW1vcnkgdXNhZ2UgaW4ga2R1bXAgZW52aXJvbm1lbnQsIGRpc2FibGUgYWxsIG9mZmxvYWQuCi0JICovCi0JaWYgKGlzX2tkdW1wX2tlcm5lbCgpKQotCQlhZGFwLT5wYXJhbXMub2ZmbG9hZCA9IDA7Ci0KIAlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpIHsKIAkJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBhZGFwMnBpbmZvKGFkYXAsIGkpOwogCkBAIC00MzgyLDMzICs0MDQ0LDE4IEBACiAJcy0+ZXRocXNldHMgPSBxaWR4OwogCXMtPm1heF9ldGhxc2V0cyA9IHFpZHg7ICAgLyogTVNJLVggbWF5IGxvd2VyIGl0IGxhdGVyICovCiAKLQlpZiAoaXNfb2ZmbG9hZChhZGFwKSkgeworCWlmIChpc191bGQoYWRhcCkpIHsKIAkJLyoKIAkJICogRm9yIG9mZmxvYWQgd2UgdXNlIDEgcXVldWUvY2hhbm5lbCBpZiBhbGwgcG9ydHMgYXJlIHVwIHRvIDFHLAogCQkgKiBvdGhlcndpc2Ugd2UgZGl2aWRlIGFsbCBhdmFpbGFibGUgcXVldWVzIGFtb25nc3QgdGhlIGNoYW5uZWxzCiAJCSAqIGNhcHBlZCBieSB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb3Jlcy4KIAkJICovCiAJCWlmIChuMTBnKSB7Ci0JCQlpID0gbWluX3QoaW50LCBBUlJBWV9TSVpFKHMtPmlzY3NpcnhxKSwKLQkJCQkgIG51bV9vbmxpbmVfY3B1cygpKTsKLQkJCXMtPmlzY3NpcXNldHMgPSByb3VuZHVwKGksIGFkYXAtPnBhcmFtcy5ucG9ydHMpOwotCQl9IGVsc2UKLQkJCXMtPmlzY3NpcXNldHMgPSBhZGFwLT5wYXJhbXMubnBvcnRzOwotCQkvKiBGb3IgUkRNQSBvbmUgUnggcXVldWUgcGVyIGNoYW5uZWwgc3VmZmljZXMgKi8KLQkJcy0+cmRtYXFzID0gYWRhcC0+cGFyYW1zLm5wb3J0czsKLQkJLyogVHJ5IGFuZCBhbGxvdyBhdCBsZWFzdCAxIENJUSBwZXIgY3B1IHJvdW5kaW5nIGRvd24KLQkJICogdG8gdGhlIG51bWJlciBvZiBwb3J0cywgd2l0aCBhIG1pbmltdW0gb2YgMSBwZXIgcG9ydC4KLQkJICogQSAyIHBvcnQgY2FyZCBpbiBhIDYgY3B1IHN5c3RlbTogNiBDSVFzLCAzIC8gcG9ydC4KLQkJICogQSA0IHBvcnQgY2FyZCBpbiBhIDYgY3B1IHN5c3RlbTogNCBDSVFzLCAxIC8gcG9ydC4KLQkJICogQSA0IHBvcnQgY2FyZCBpbiBhIDIgY3B1IHN5c3RlbTogNCBDSVFzLCAxIC8gcG9ydC4KLQkJICovCi0JCXMtPnJkbWFjaXFzID0gbWluX3QoaW50LCBNQVhfUkRNQV9DSVFTLCBudW1fb25saW5lX2NwdXMoKSk7Ci0JCXMtPnJkbWFjaXFzID0gKHMtPnJkbWFjaXFzIC8gYWRhcC0+cGFyYW1zLm5wb3J0cykgKgotCQkJCWFkYXAtPnBhcmFtcy5ucG9ydHM7Ci0JCXMtPnJkbWFjaXFzID0gbWF4X3QoaW50LCBzLT5yZG1hY2lxcywgYWRhcC0+cGFyYW1zLm5wb3J0cyk7Ci0KLQkJaWYgKCFpc190NChhZGFwLT5wYXJhbXMuY2hpcCkpCi0JCQlzLT5uaXNjc2l0cSA9IHMtPmlzY3NpcXNldHM7CisJCQlpID0gbnVtX29ubGluZV9jcHVzKCk7CisJCQlzLT5vZmxkcXNldHMgPSByb3VuZHVwKGksIGFkYXAtPnBhcmFtcy5ucG9ydHMpOworCQl9IGVsc2UgeworCQkJcy0+b2ZsZHFzZXRzID0gYWRhcC0+cGFyYW1zLm5wb3J0czsKKwkJfQogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHMtPmV0aHJ4cSk7IGkrKykgewpAQCAtNDQyNyw0NyArNDA3NCw4IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocy0+b2ZsZHR4cSk7IGkrKykKIAkJcy0+b2ZsZHR4cVtpXS5xLnNpemUgPSAxMDI0OwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocy0+aXNjc2lyeHEpOyBpKyspIHsKLQkJc3RydWN0IHNnZV9vZmxkX3J4cSAqciA9ICZzLT5pc2NzaXJ4cVtpXTsKLQotCQlpbml0X3JzcHEoYWRhcCwgJnItPnJzcHEsIDUsIDEsIDEwMjQsIDY0KTsKLQkJci0+cnNwcS51bGQgPSBDWEdCNF9VTERfSVNDU0k7Ci0JCXItPmZsLnNpemUgPSA3MjsKLQl9Ci0KLQlpZiAoIWlzX3Q0KGFkYXAtPnBhcmFtcy5jaGlwKSkgewotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5pc2NzaXRyeHEpOyBpKyspIHsKLQkJCXN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnIgPSAmcy0+aXNjc2l0cnhxW2ldOwotCi0JCQlpbml0X3JzcHEoYWRhcCwgJnItPnJzcHEsIDUsIDEsIDEwMjQsIDY0KTsKLQkJCXItPnJzcHEudWxkID0gQ1hHQjRfVUxEX0lTQ1NJVDsKLQkJCXItPmZsLnNpemUgPSA3MjsKLQkJfQotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHMtPnJkbWFyeHEpOyBpKyspIHsKLQkJc3RydWN0IHNnZV9vZmxkX3J4cSAqciA9ICZzLT5yZG1hcnhxW2ldOwotCi0JCWluaXRfcnNwcShhZGFwLCAmci0+cnNwcSwgNSwgMSwgNTExLCA2NCk7Ci0JCXItPnJzcHEudWxkID0gQ1hHQjRfVUxEX1JETUE7Ci0JCXItPmZsLnNpemUgPSA3MjsKLQl9Ci0KLQljaXFfc2l6ZSA9IDY0ICsgYWRhcC0+dnJlcy5jcS5zaXplICsgYWRhcC0+dGlkcy5uZnRpZHM7Ci0JaWYgKGNpcV9zaXplID4gU0dFX01BWF9JUV9TSVpFKSB7Ci0JCUNIX1dBUk4oYWRhcCwgIkNJUSBzaXplIHRvbyBzbWFsbCBmb3IgYXZhaWxhYmxlIElRc1xuIik7Ci0JCWNpcV9zaXplID0gU0dFX01BWF9JUV9TSVpFOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHMtPnJkbWFjaXEpOyBpKyspIHsKLQkJc3RydWN0IHNnZV9vZmxkX3J4cSAqciA9ICZzLT5yZG1hY2lxW2ldOwotCi0JCWluaXRfcnNwcShhZGFwLCAmci0+cnNwcSwgNSwgMSwgY2lxX3NpemUsIDY0KTsKLQkJci0+cnNwcS51bGQgPSBDWEdCNF9VTERfUkRNQTsKLQl9Ci0KIAlpbml0X3JzcHEoYWRhcCwgJnMtPmZ3X2V2dHEsIDAsIDEsIDEwMjQsIDY0KTsKLQlpbml0X3JzcHEoYWRhcCwgJnMtPmludHJxLCAwLCAxLCAyICogTUFYX0lOR1EsIDY0KTsKKwlpbml0X3JzcHEoYWRhcCwgJnMtPmludHJxLCAwLCAxLCA1MTIsIDY0KTsKIH0KIAogLyoKQEAgLTQ0OTgsNDIgKzQxMDYsOTAgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgZ2V0X21zaXhfaW5mbyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgdWxkX21zaXhfaW5mbyAqbXNpeF9pbmZvOworCXVuc2lnbmVkIGludCBtYXhfaW5ncSA9IDA7CisKKwlpZiAoaXNfb2ZmbG9hZChhZGFwKSkKKwkJbWF4X2luZ3EgKz0gTUFYX09GTERfUVNFVFMgKiBhZGFwLT5udW1fb2ZsZF91bGQ7CisJaWYgKGlzX3BjaV91bGQoYWRhcCkpCisJCW1heF9pbmdxICs9IE1BWF9PRkxEX1FTRVRTICogYWRhcC0+bnVtX3VsZDsKKworCWlmICghbWF4X2luZ3EpCisJCWdvdG8gb3V0OworCisJbXNpeF9pbmZvID0ga2NhbGxvYyhtYXhfaW5ncSwgc2l6ZW9mKCptc2l4X2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zaXhfaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhZGFwLT5tc2l4X2JtYXBfdWxkcy5tc2l4X2JtYXAgPSBrY2FsbG9jKEJJVFNfVE9fTE9OR1MobWF4X2luZ3EpLAorCQkJCQkJIHNpemVvZihsb25nKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZGFwLT5tc2l4X2JtYXBfdWxkcy5tc2l4X2JtYXApIHsKKwkJa2ZyZWUobXNpeF9pbmZvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNwaW5fbG9ja19pbml0KCZhZGFwLT5tc2l4X2JtYXBfdWxkcy5sb2NrKTsKKwlhZGFwLT5tc2l4X2luZm9fdWxkcyA9IG1zaXhfaW5mbzsKK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9tc2l4X2luZm8oc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJaWYgKCEoYWRhcC0+bnVtX3VsZCAmJiBhZGFwLT5udW1fb2ZsZF91bGQpKQorCQlyZXR1cm47CisKKwlrZnJlZShhZGFwLT5tc2l4X2luZm9fdWxkcyk7CisJa2ZyZWUoYWRhcC0+bXNpeF9ibWFwX3VsZHMubXNpeF9ibWFwKTsKK30KKwogLyogMiBNU0ktWCB2ZWN0b3JzIG5lZWRlZCBmb3IgdGhlIEZXIHF1ZXVlIGFuZCBub24tZGF0YSBpbnRlcnJ1cHRzICovCiAjZGVmaW5lIEVYVFJBX1ZFQ1MgMgogCiBzdGF0aWMgaW50IGVuYWJsZV9tc2l4KHN0cnVjdCBhZGFwdGVyICphZGFwKQogewotCWludCBvZmxkX25lZWQgPSAwOwotCWludCBpLCB3YW50LCBuZWVkLCBhbGxvY2F0ZWQ7CisJaW50IG9mbGRfbmVlZCA9IDAsIHVsZF9uZWVkID0gMDsKKwlpbnQgaSwgaiwgd2FudCwgbmVlZCwgYWxsb2NhdGVkOwogCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcC0+c2dlOwogCXVuc2lnbmVkIGludCBuY2hhbiA9IGFkYXAtPnBhcmFtcy5ucG9ydHM7CiAJc3RydWN0IG1zaXhfZW50cnkgKmVudHJpZXM7CisJaW50IG1heF9pbmdxID0gTUFYX0lOR1E7CiAKLQllbnRyaWVzID0ga21hbGxvYyhzaXplb2YoKmVudHJpZXMpICogKE1BWF9JTkdRICsgMSksCisJaWYgKGlzX3BjaV91bGQoYWRhcCkpCisJCW1heF9pbmdxICs9IChNQVhfT0ZMRF9RU0VUUyAqIGFkYXAtPm51bV91bGQpOworCWlmIChpc19vZmZsb2FkKGFkYXApKQorCQltYXhfaW5ncSArPSAoTUFYX09GTERfUVNFVFMgKiBhZGFwLT5udW1fb2ZsZF91bGQpOworCWVudHJpZXMgPSBrbWFsbG9jKHNpemVvZigqZW50cmllcykgKiAobWF4X2luZ3EgKyAxKSwKIAkJCSAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbnRyaWVzKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSU5HUSArIDE7ICsraSkKKwkvKiBtYXAgZm9yIG1zaXggKi8KKwlpZiAoZ2V0X21zaXhfaW5mbyhhZGFwKSkgeworCQlhZGFwLT5wYXJhbXMub2ZmbG9hZCA9IDA7CisJCWFkYXAtPnBhcmFtcy5jcnlwdG8gPSAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtYXhfaW5ncSArIDE7ICsraSkKIAkJZW50cmllc1tpXS5lbnRyeSA9IGk7CiAKIAl3YW50ID0gcy0+bWF4X2V0aHFzZXRzICsgRVhUUkFfVkVDUzsKIAlpZiAoaXNfb2ZmbG9hZChhZGFwKSkgewotCQl3YW50ICs9IHMtPnJkbWFxcyArIHMtPnJkbWFjaXFzICsgcy0+aXNjc2lxc2V0cwkrCi0JCQlzLT5uaXNjc2l0cTsKLQkJLyogbmVlZCBuY2hhbiBmb3IgZWFjaCBwb3NzaWJsZSBVTEQgKi8KLQkJaWYgKGlzX3Q0KGFkYXAtPnBhcmFtcy5jaGlwKSkKLQkJCW9mbGRfbmVlZCA9IDMgKiBuY2hhbjsKLQkJZWxzZQotCQkJb2ZsZF9uZWVkID0gNCAqIG5jaGFuOworCQl3YW50ICs9IGFkYXAtPm51bV9vZmxkX3VsZCAqIHMtPm9mbGRxc2V0czsKKwkJb2ZsZF9uZWVkID0gYWRhcC0+bnVtX29mbGRfdWxkICogbmNoYW47CisJfQorCWlmIChpc19wY2lfdWxkKGFkYXApKSB7CisJCXdhbnQgKz0gYWRhcC0+bnVtX3VsZCAqIHMtPm9mbGRxc2V0czsKKwkJdWxkX25lZWQgPSBhZGFwLT5udW1fdWxkICogbmNoYW47CiAJfQogI2lmZGVmIENPTkZJR19DSEVMU0lPX1Q0X0RDQgogCS8qIEZvciBEYXRhIENlbnRlciBCcmlkZ2luZyB3ZSBuZWVkIDggRXRoZXJuZXQgVFggUHJpb3JpdHkgUXVldWVzIGZvcgogCSAqIGVhY2ggcG9ydC4KIAkgKi8KLQluZWVkID0gOCAqIGFkYXAtPnBhcmFtcy5ucG9ydHMgKyBFWFRSQV9WRUNTICsgb2ZsZF9uZWVkOworCW5lZWQgPSA4ICogYWRhcC0+cGFyYW1zLm5wb3J0cyArIEVYVFJBX1ZFQ1MgKyBvZmxkX25lZWQgKyB1bGRfbmVlZDsKICNlbHNlCi0JbmVlZCA9IGFkYXAtPnBhcmFtcy5ucG9ydHMgKyBFWFRSQV9WRUNTICsgb2ZsZF9uZWVkOworCW5lZWQgPSBhZGFwLT5wYXJhbXMubnBvcnRzICsgRVhUUkFfVkVDUyArIG9mbGRfbmVlZCArIHVsZF9uZWVkOwogI2VuZGlmCiAJYWxsb2NhdGVkID0gcGNpX2VuYWJsZV9tc2l4X3JhbmdlKGFkYXAtPnBkZXYsIGVudHJpZXMsIG5lZWQsIHdhbnQpOwogCWlmIChhbGxvY2F0ZWQgPCAwKSB7CkBAIC00NTQ3LDMzICs0MjAzLDMxIEBACiAJICogRXZlcnkgZ3JvdXAgZ2V0cyBpdHMgbWluaW11bSByZXF1aXJlbWVudCBhbmQgTklDIGdldHMgdG9wCiAJICogcHJpb3JpdHkgZm9yIGxlZnRvdmVycy4KIAkgKi8KLQlpID0gYWxsb2NhdGVkIC0gRVhUUkFfVkVDUyAtIG9mbGRfbmVlZDsKKwlpID0gYWxsb2NhdGVkIC0gRVhUUkFfVkVDUyAtIG9mbGRfbmVlZCAtIHVsZF9uZWVkOwogCWlmIChpIDwgcy0+bWF4X2V0aHFzZXRzKSB7CiAJCXMtPm1heF9ldGhxc2V0cyA9IGk7CiAJCWlmIChpIDwgcy0+ZXRocXNldHMpCiAJCQlyZWR1Y2VfZXRocXMoYWRhcCwgaSk7CiAJfQotCWlmIChpc19vZmZsb2FkKGFkYXApKSB7Ci0JCWlmIChhbGxvY2F0ZWQgPCB3YW50KSB7Ci0JCQlzLT5yZG1hcXMgPSBuY2hhbjsKLQkJCXMtPnJkbWFjaXFzID0gbmNoYW47Ci0KLQkJCWlmICghaXNfdDQoYWRhcC0+cGFyYW1zLmNoaXApKQotCQkJCXMtPm5pc2NzaXRxID0gbmNoYW47Ci0JCX0KLQotCQkvKiBsZWZ0b3ZlcnMgZ28gdG8gT0ZMRCAqLwotCQlpID0gYWxsb2NhdGVkIC0gRVhUUkFfVkVDUyAtIHMtPm1heF9ldGhxc2V0cyAtCi0JCSAgICBzLT5yZG1hcXMgLSBzLT5yZG1hY2lxcyAtIHMtPm5pc2NzaXRxOwotCQlzLT5pc2NzaXFzZXRzID0gKGkgLyBuY2hhbikgKiBuY2hhbjsgIC8qIHJvdW5kIGRvd24gKi8KLQorCWlmIChpc191bGQoYWRhcCkpIHsKKwkJaWYgKGFsbG9jYXRlZCA8IHdhbnQpCisJCQlzLT5ucXNfcGVyX3VsZCA9IG5jaGFuOworCQllbHNlCisJCQlzLT5ucXNfcGVyX3VsZCA9IHMtPm9mbGRxc2V0czsKIAl9Ci0JZm9yIChpID0gMDsgaSA8IGFsbG9jYXRlZDsgKytpKQorCisJZm9yIChpID0gMDsgaSA8IChzLT5tYXhfZXRocXNldHMgKyBFWFRSQV9WRUNTKTsgKytpKQogCQlhZGFwLT5tc2l4X2luZm9baV0udmVjID0gZW50cmllc1tpXS52ZWN0b3I7CisJaWYgKGlzX3VsZChhZGFwKSkgeworCQlmb3IgKGogPSAwIDsgaSA8IGFsbG9jYXRlZDsgKytpLCBqKyspIHsKKwkJCWFkYXAtPm1zaXhfaW5mb191bGRzW2pdLnZlYyA9IGVudHJpZXNbaV0udmVjdG9yOworCQkJYWRhcC0+bXNpeF9pbmZvX3VsZHNbal0uaWR4ID0gaTsKKwkJfQorCQlhZGFwLT5tc2l4X2JtYXBfdWxkcy5tYXBzaXplID0gajsKKwl9CiAJZGV2X2luZm8oYWRhcC0+cGRldl9kZXYsICIlZCBNU0ktWCB2ZWN0b3JzIGFsbG9jYXRlZCwgIgotCQkgIm5pYyAlZCBpc2NzaSAlZCByZG1hIGNwbCAlZCByZG1hIGNpcSAlZFxuIiwKLQkJIGFsbG9jYXRlZCwgcy0+bWF4X2V0aHFzZXRzLCBzLT5pc2NzaXFzZXRzLCBzLT5yZG1hcXMsCi0JCSBzLT5yZG1hY2lxcyk7CisJCSAibmljICVkIHBlciB1bGQgJWRcbiIsCisJCSBhbGxvY2F0ZWQsIHMtPm1heF9ldGhxc2V0cywgcy0+bnFzX3Blcl91bGQpOwogCiAJa2ZyZWUoZW50cmllcyk7CiAJcmV0dXJuIDA7CkBAIC00NzU2LDggKzQ0MTAsMTIgQEAKIAkJYnVmcCArPSBzcHJpbnRmKGJ1ZnAsICIxMDAwLyIpOwogCWlmIChwaS0+bGlua19jZmcuc3VwcG9ydGVkICYgRldfUE9SVF9DQVBfU1BFRURfMTBHKQogCQlidWZwICs9IHNwcmludGYoYnVmcCwgIjEwRy8iKTsKKwlpZiAocGktPmxpbmtfY2ZnLnN1cHBvcnRlZCAmIEZXX1BPUlRfQ0FQX1NQRUVEXzI1RykKKwkJYnVmcCArPSBzcHJpbnRmKGJ1ZnAsICIyNUcvIik7CiAJaWYgKHBpLT5saW5rX2NmZy5zdXBwb3J0ZWQgJiBGV19QT1JUX0NBUF9TUEVFRF80MEcpCiAJCWJ1ZnAgKz0gc3ByaW50ZihidWZwLCAiNDBHLyIpOworCWlmIChwaS0+bGlua19jZmcuc3VwcG9ydGVkICYgRldfUE9SVF9DQVBfU1BFRURfMTAwRykKKwkJYnVmcCArPSBzcHJpbnRmKGJ1ZnAsICIxMDBHLyIpOwogCWlmIChidWZwICE9IGJ1ZikKIAkJLS1idWZwOwogCXNwcmludGYoYnVmcCwgIkJBU0UtJXMiLCB0NF9nZXRfcG9ydF90eXBlX2Rlc2NyaXB0aW9uKHBpLT5wb3J0X3R5cGUpKTsKQEAgLTQ3ODMsNyArNDQ0MSw5IEBACiAJdW5zaWduZWQgaW50IGk7CiAKIAl0NF9mcmVlX21lbShhZGFwdGVyLT5sMnQpOworCXQ0X2NsZWFudXBfc2NoZWQoYWRhcHRlcik7CiAJdDRfZnJlZV9tZW0oYWRhcHRlci0+dGlkcy50aWRfdGFiKTsKKwljeGdiNF9jbGVhbnVwX3RjX3UzMihhZGFwdGVyKTsKIAlrZnJlZShhZGFwdGVyLT5zZ2UuZWdyX21hcCk7CiAJa2ZyZWUoYWRhcHRlci0+c2dlLmluZ3JfbWFwKTsKIAlrZnJlZShhZGFwdGVyLT5zZ2Uuc3RhcnZpbmdfZmwpOwpAQCAtNDgzNCwyMSArNDQ5NCw1OSBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BDSV9JT1YKK3N0YXRpYyB2b2lkIGR1bW15X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGV2LT50eXBlID0gQVJQSFJEX05PTkU7CisJZGV2LT5tdHUgPSAwOworCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gMDsKKwlkZXYtPmFkZHJfbGVuID0gMDsKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IDA7CisJZGV2LT5mbGFncyB8PSBJRkZfTk9BUlA7CisJZGV2LT5wcml2X2ZsYWdzIHw9IElGRl9OT19RVUVVRTsKKworCS8qIEluaXRpYWxpemUgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5uZXRkZXZfb3BzID0gJmN4Z2I0X21nbXRfbmV0ZGV2X29wczsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJmN4Z2I0X21nbXRfZXRodG9vbF9vcHM7CisJZGV2LT5kZXN0cnVjdG9yID0gZnJlZV9uZXRkZXY7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX21nbXRfZGV2KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IHBvcnRfaW5mbyAqcGk7CisJY2hhciBuYW1lW0lGTkFNU0laXTsKKwlpbnQgZXJyOworCisJc25wcmludGYobmFtZSwgSUZOQU1TSVosICJtZ210cGYlZCVkIiwgYWRhcC0+YWRhcF9pZHgsIGFkYXAtPnBmKTsKKwluZXRkZXYgPSBhbGxvY19uZXRkZXYoMCwgbmFtZSwgTkVUX05BTUVfVU5LTk9XTiwgZHVtbXlfc2V0dXApOworCWlmICghbmV0ZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBpID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlwaS0+YWRhcHRlciA9IGFkYXA7CisJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmcGRldi0+ZGV2KTsKKworCWFkYXAtPnBvcnRbMF0gPSBuZXRkZXY7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoYWRhcC0+cG9ydFswXSk7CisJaWYgKGVycikgeworCQlwcl9pbmZvKCJVbmFibGUgdG8gcmVnaXN0ZXIgVkYgbWdtdCBuZXRkZXYgJXNcbiIsIG5hbWUpOworCQlmcmVlX25ldGRldihhZGFwLT5wb3J0WzBdKTsKKwkJYWRhcC0+cG9ydFswXSA9IE5VTEw7CisJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGN4Z2I0X2lvdl9jb25maWd1cmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBudW1fdmZzKQogeworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWludCBlcnIgPSAwOwogCWludCBjdXJyZW50X3ZmcyA9IHBjaV9udW1fdmYocGRldik7CiAJdTMyIHBjaWVfZnc7Ci0Jdm9pZCBfX2lvbWVtICpyZWdzOwogCi0JcmVncyA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAwKTsKLQlpZiAoIXJlZ3MpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IG1hcCBkZXZpY2UgcmVnaXN0ZXJzXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcGNpZV9mdyA9IHJlYWRsKHJlZ3MgKyBQQ0lFX0ZXX0EpOwotCWlvdW5tYXAocmVncyk7CisJcGNpZV9mdyA9IHJlYWRsKGFkYXAtPnJlZ3MgKyBQQ0lFX0ZXX0EpOwogCS8qIENoZWNrIGlmIGN4Z2I0IGlzIHRoZSBNQVNURVIgYW5kIGZ3IGlzIGluaXRpYWxpemVkICovCiAJaWYgKCEocGNpZV9mdyAmIFBDSUVfRldfSU5JVF9GKSB8fAogCSAgICAhKHBjaWVfZncgJiBQQ0lFX0ZXX01BU1RFUl9WTERfRikgfHwKQEAgLTQ4NzUsNiArNDU3MywxNCBAQAogCSAqLwogCWlmICghbnVtX3ZmcykgewogCQlwY2lfZGlzYWJsZV9zcmlvdihwZGV2KTsKKwkJaWYgKGFkYXAtPnBvcnRbMF0pIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGFkYXAtPnBvcnRbMF0pOworCQkJYWRhcC0+cG9ydFswXSA9IE5VTEw7CisJCX0KKwkJLyogZnJlZSBWRiByZXNvdXJjZXMgKi8KKwkJa2ZyZWUoYWRhcC0+dmZpbmZvKTsKKwkJYWRhcC0+dmZpbmZvID0gTlVMTDsKKwkJYWRhcC0+bnVtX3ZmcyA9IDA7CiAJCXJldHVybiBudW1fdmZzOwogCX0KIApAQCAtNDg4Miw3ICs0NTg4LDE3IEBACiAJCWVyciA9IHBjaV9lbmFibGVfc3Jpb3YocGRldiwgbnVtX3Zmcyk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOworCisJCWFkYXAtPm51bV92ZnMgPSBudW1fdmZzOworCQllcnIgPSBjb25maWdfbWdtdF9kZXYocGRldik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KKworCWFkYXAtPnZmaW5mbyA9IGtjYWxsb2MoYWRhcC0+bnVtX3ZmcywKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHZmX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoYWRhcC0+dmZpbmZvKQorCQlmaWxsX3ZmX3N0YXRpb25fbWFjX2FkZHIoYWRhcCk7CiAJcmV0dXJuIG51bV92ZnM7CiB9CiAjZW5kaWYKQEAgLTQ4OTMsOSArNDYwOSwxMSBAQAogCXN0cnVjdCBwb3J0X2luZm8gKnBpOwogCWJvb2wgaGlnaGRtYSA9IGZhbHNlOwogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCXZvaWQgX19pb21lbSAqcmVnczsKIAl1MzIgd2hvYW1pLCBwbF9yZXY7CiAJZW51bSBjaGlwX3R5cGUgY2hpcDsKKwlzdGF0aWMgaW50IGFkYXBfaWR4ID0gMTsKIAogCXByaW50a19vbmNlKEtFUk5fSU5GTyAiJXMgLSB2ZXJzaW9uICVzXG4iLCBEUlZfREVTQywgRFJWX1ZFUlNJT04pOwogCkBAIC00OTMwLDcgKzQ2NDgsOSBAQAogCWZ1bmMgPSBDSEVMU0lPX0NISVBfVkVSU0lPTihjaGlwKSA8PSBDSEVMU0lPX1Q1ID8KIAkJU09VUkNFUEZfRyh3aG9hbWkpIDogVDZfU09VUkNFUEZfRyh3aG9hbWkpOwogCWlmIChmdW5jICE9IGVudC0+ZHJpdmVyX2RhdGEpIHsKKyNpZm5kZWYgQ09ORklHX1BDSV9JT1YKIAkJaW91bm1hcChyZWdzKTsKKyNlbmRpZgogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJCXBjaV9zYXZlX3N0YXRlKHBkZXYpOyAgICAgICAgLyogdG8gcmVzdG9yZSBTUi1JT1YgbGF0ZXIgKi8KIAkJZ290byBzcmlvdjsKQEAgLTQ5NjIsNiArNDY4Miw3IEBACiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X3VubWFwX2JhcjA7CiAJfQorCWFkYXBfaWR4Kys7CiAKIAlhZGFwdGVyLT53b3JrcSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJjeGdiNCIpOwogCWlmICghYWRhcHRlci0+d29ya3EpIHsKQEAgLTUwNDgsOCArNDc2OSw2IEBACiAJCQkgICAgICBUNl9TVEFUTU9ERV9WKDApKSk7CiAKIAlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpIHsKLQkJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKLQogCQluZXRkZXYgPSBhbGxvY19ldGhlcmRldl9tcShzaXplb2Yoc3RydWN0IHBvcnRfaW5mbyksCiAJCQkJCSAgIE1BWF9FVEhfUVNFVFMpOwogCQlpZiAoIW5ldGRldikgewpAQCAtNTA2OSw3ICs0Nzg4LDggQEAKIAkJbmV0ZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfCBUU09fRkxBR1MgfAogCQkJTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU0gfAogCQkJTkVUSUZfRl9SWENTVU0gfCBORVRJRl9GX1JYSEFTSCB8Ci0JCQlORVRJRl9GX0hXX1ZMQU5fQ1RBR19UWCB8IE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYOworCQkJTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfCBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWCB8CisJCQlORVRJRl9GX0hXX1RDOwogCQlpZiAoaGlnaGRtYSkKIAkJCW5ldGRldi0+aHdfZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOwogCQluZXRkZXYtPmZlYXR1cmVzIHw9IG5ldGRldi0+aHdfZmVhdHVyZXM7CkBAIC01MTQzLDEwICs0ODYzLDI2IEBACiAJCX0KIAl9CiAjZW5kaWYKLQlpZiAoaXNfb2ZmbG9hZChhZGFwdGVyKSAmJiB0aWRfaW5pdCgmYWRhcHRlci0+dGlkcykgPCAwKSB7CisKKwlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpIHsKKwkJcGkgPSBhZGFwMnBpbmZvKGFkYXB0ZXIsIGkpOworCQlwaS0+c2NoZWRfdGJsID0gdDRfaW5pdF9zY2hlZChhZGFwdGVyLT5wYXJhbXMubnNjaGVkX2Nscyk7CisJCWlmICghcGktPnNjaGVkX3RibCkKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkJICJjb3VsZCBub3QgYWN0aXZhdGUgc2NoZWR1bGluZyBvbiBwb3J0ICVkXG4iLAorCQkJCSBpKTsKKwl9CisKKwlpZiAodGlkX2luaXQoJmFkYXB0ZXItPnRpZHMpIDwgMCkgewogCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiY291bGQgbm90IGFsbG9jYXRlIFRJRCB0YWJsZSwgIgogCQkJICJjb250aW51aW5nXG4iKTsKIAkJYWRhcHRlci0+cGFyYW1zLm9mZmxvYWQgPSAwOworCX0gZWxzZSB7CisJCWFkYXB0ZXItPnRjX3UzMiA9IGN4Z2I0X2luaXRfdGNfdTMyKGFkYXB0ZXIsCisJCQkJCQkgICAgQ1hHQjRfTUFYX0xJTktfSEFORExFKTsKKwkJaWYgKCFhZGFwdGVyLT50Y191MzIpCisJCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJCSAiY291bGQgbm90IG9mZmxvYWQgdGMgdTMyLCBjb250aW51aW5nXG4iKTsKIAl9CiAKIAlpZiAoaXNfb2ZmbG9hZChhZGFwdGVyKSkgewpAQCAtNTE2OCw4ICs0OTA0LDExIEBACiAJLyogU2VlIHdoYXQgaW50ZXJydXB0cyB3ZSdsbCBiZSB1c2luZyAqLwogCWlmIChtc2kgPiAxICYmIGVuYWJsZV9tc2l4KGFkYXB0ZXIpID09IDApCiAJCWFkYXB0ZXItPmZsYWdzIHw9IFVTSU5HX01TSVg7Ci0JZWxzZSBpZiAobXNpID4gMCAmJiBwY2lfZW5hYmxlX21zaShwZGV2KSA9PSAwKQorCWVsc2UgaWYgKG1zaSA+IDAgJiYgcGNpX2VuYWJsZV9tc2kocGRldikgPT0gMCkgewogCQlhZGFwdGVyLT5mbGFncyB8PSBVU0lOR19NU0k7CisJCWlmIChtc2kgPiAxKQorCQkJZnJlZV9tc2l4X2luZm8oYWRhcHRlcik7CisJfQogCiAJLyogY2hlY2sgZm9yIFBDSSBFeHByZXNzIGJhbmR3aWR0aCBjYXBhYmlsdGl0ZXMgKi8KIAljeGdiNF9jaGVja19wY2llX2NhcHMoYWRhcHRlcik7CkBAIC01MjEzLDEwICs0OTUyLDE1IEBACiAJLyogUENJZSBFRUggcmVjb3Zlcnkgb24gcG93ZXJwYyBwbGF0Zm9ybXMgbmVlZHMgZnVuZGFtZW50YWwgcmVzZXQgKi8KIAlwZGV2LT5uZWVkc19mcmVzZXQgPSAxOwogCi0JaWYgKGlzX29mZmxvYWQoYWRhcHRlcikpCi0JCWF0dGFjaF91bGRzKGFkYXB0ZXIpOworCWlmIChpc191bGQoYWRhcHRlcikpIHsKKwkJbXV0ZXhfbG9jaygmdWxkX211dGV4KTsKKwkJbGlzdF9hZGRfdGFpbCgmYWRhcHRlci0+bGlzdF9ub2RlLCAmYWRhcHRlcl9saXN0KTsKKwkJbXV0ZXhfdW5sb2NrKCZ1bGRfbXV0ZXgpOworCX0KIAogCXByaW50X2FkYXB0ZXJfaW5mbyhhZGFwdGVyKTsKKwlzZXR1cF9md19zZ2VfcXVldWVzKGFkYXB0ZXIpOworCXJldHVybiAwOwogCiBzcmlvdjoKICNpZmRlZiBDT05GSUdfUENJX0lPVgpAQCAtNTIzMCwxMSArNDk3NCw0OCBAQAogCQkJCSAiaW5zdGFudGlhdGVkICV1IHZpcnR1YWwgZnVuY3Rpb25zXG4iLAogCQkJCSBudW1fdmZbZnVuY10pOwogCX0KLSNlbmRpZgorCisJYWRhcHRlciA9IGt6YWxsb2Moc2l6ZW9mKCphZGFwdGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZGFwdGVyKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZnJlZV9wY2lfcmVnaW9uOworCX0KKworCWFkYXB0ZXItPnBkZXYgPSBwZGV2OworCWFkYXB0ZXItPnBkZXZfZGV2ID0gJnBkZXYtPmRldjsKKwlhZGFwdGVyLT5uYW1lID0gcGNpX25hbWUocGRldik7CisJYWRhcHRlci0+bWJveCA9IGZ1bmM7CisJYWRhcHRlci0+cGYgPSBmdW5jOworCWFkYXB0ZXItPnJlZ3MgPSByZWdzOworCWFkYXB0ZXItPmFkYXBfaWR4ID0gYWRhcF9pZHg7CisJYWRhcHRlci0+bWJveF9sb2cgPSBremFsbG9jKHNpemVvZigqYWRhcHRlci0+bWJveF9sb2cpICsKKwkJCQkgICAgKHNpemVvZihzdHJ1Y3QgbWJveF9jbWQpICoKKwkJCQkgICAgIFQ0X09TX0xPR19NQk9YX0NNRFMpLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXB0ZXItPm1ib3hfbG9nKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZnJlZV9hZGFwdGVyOworCX0KKwlwY2lfc2V0X2RydmRhdGEocGRldiwgYWRhcHRlcik7CiAJcmV0dXJuIDA7CiAKKyBmcmVlX2FkYXB0ZXI6CisJa2ZyZWUoYWRhcHRlcik7CisgZnJlZV9wY2lfcmVnaW9uOgorCWlvdW5tYXAocmVncyk7CisJcGNpX2Rpc2FibGVfc3Jpb3YocGRldik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlyZXR1cm4gZXJyOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorCiAgb3V0X2ZyZWVfZGV2OgogCWZyZWVfc29tZV9yZXNvdXJjZXMoYWRhcHRlcik7CisJaWYgKGFkYXB0ZXItPmZsYWdzICYgVVNJTkdfTVNJWCkKKwkJZnJlZV9tc2l4X2luZm8oYWRhcHRlcik7CisJaWYgKGFkYXB0ZXItPm51bV91bGQgfHwgYWRhcHRlci0+bnVtX29mbGRfdWxkKQorCQl0NF91bGRfbWVtX2ZyZWUoYWRhcHRlcik7CiAgb3V0X3VubWFwX2JhcjoKIAlpZiAoIWlzX3Q0KGFkYXB0ZXItPnBhcmFtcy5jaGlwKSkKIAkJaW91bm1hcChhZGFwdGVyLT5iYXIyKTsKQEAgLTUyNTgsMTIgKzUwMzksMTIgQEAKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotI2lmZGVmIENPTkZJR19QQ0lfSU9WCi0JcGNpX2Rpc2FibGVfc3Jpb3YocGRldik7CisJaWYgKCFhZGFwdGVyKSB7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJCXJldHVybjsKKwl9CiAKLSNlbmRpZgotCi0JaWYgKGFkYXB0ZXIpIHsKKwlpZiAoYWRhcHRlci0+cGYgPT0gNCkgewogCQlpbnQgaTsKIAogCQkvKiBUZWFyIGRvd24gcGVyLWFkYXB0ZXIgV29yayBRdWV1ZSBmaXJzdCBzaW5jZSBpdCBjYW4gY29udGFpbgpAQCAtNTI3MSw3ICs1MDUyLDcgQEAKIAkJICovCiAJCWRlc3Ryb3lfd29ya3F1ZXVlKGFkYXB0ZXItPndvcmtxKTsKIAotCQlpZiAoaXNfb2ZmbG9hZChhZGFwdGVyKSkKKwkJaWYgKGlzX3VsZChhZGFwdGVyKSkKIAkJCWRldGFjaF91bGRzKGFkYXB0ZXIpOwogCiAJCWRpc2FibGVfaW50ZXJydXB0cyhhZGFwdGVyKTsKQEAgLTUyODUsMTcgKzUwNjYsMTUgQEAKIAkJLyogSWYgd2UgYWxsb2NhdGVkIGZpbHRlcnMsIGZyZWUgdXAgc3RhdGUgYXNzb2NpYXRlZCB3aXRoIGFueQogCQkgKiB2YWxpZCBmaWx0ZXJzIC4uLgogCQkgKi8KLQkJaWYgKGFkYXB0ZXItPnRpZHMuZnRpZF90YWIpIHsKLQkJCXN0cnVjdCBmaWx0ZXJfZW50cnkgKmYgPSAmYWRhcHRlci0+dGlkcy5mdGlkX3RhYlswXTsKLQkJCWZvciAoaSA9IDA7IGkgPCAoYWRhcHRlci0+dGlkcy5uZnRpZHMgKwotCQkJCQlhZGFwdGVyLT50aWRzLm5zZnRpZHMpOyBpKyssIGYrKykKLQkJCQlpZiAoZi0+dmFsaWQpCi0JCQkJCWNsZWFyX2ZpbHRlcihhZGFwdGVyLCBmKTsKLQkJfQorCQljbGVhcl9hbGxfZmlsdGVycyhhZGFwdGVyKTsKIAogCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkKIAkJCWN4Z2JfZG93bihhZGFwdGVyKTsKIAorCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBVU0lOR19NU0lYKQorCQkJZnJlZV9tc2l4X2luZm8oYWRhcHRlcik7CisJCWlmIChhZGFwdGVyLT5udW1fdWxkIHx8IGFkYXB0ZXItPm51bV9vZmxkX3VsZCkKKwkJCXQ0X3VsZF9tZW1fZnJlZShhZGFwdGVyKTsKIAkJZnJlZV9zb21lX3Jlc291cmNlcyhhZGFwdGVyKTsKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCQl0NF9jbGVhbnVwX2NsaXBfdGJsKGFkYXB0ZXIpOwpAQCAtNTMxMiw4ICs1MDkxLDY0IEBACiAJCWtmcmVlKGFkYXB0ZXItPm1ib3hfbG9nKTsKIAkJc3luY2hyb25pemVfcmN1KCk7CiAJCWtmcmVlKGFkYXB0ZXIpOwotCX0gZWxzZQorCX0KKyNpZmRlZiBDT05GSUdfUENJX0lPVgorCWVsc2UgeworCQlpZiAoYWRhcHRlci0+cG9ydFswXSkKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGFkYXB0ZXItPnBvcnRbMF0pOworCQlpb3VubWFwKGFkYXB0ZXItPnJlZ3MpOworCQlrZnJlZShhZGFwdGVyLT52ZmluZm8pOworCQlrZnJlZShhZGFwdGVyKTsKKwkJcGNpX2Rpc2FibGVfc3Jpb3YocGRldik7CiAJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJfQorI2VuZGlmCit9CisKKy8qICJTaHV0ZG93biIgcXVpZXNjZXMgdGhlIGRldmljZSwgc3RvcHBpbmcgSW5ncmVzcyBQYWNrZXQgYW5kIEludGVycnVwdAorICogZGVsaXZlcnkuICBUaGlzIGlzIGVzc2VudGlhbGx5IGEgc3RyaXBwZWQgZG93biB2ZXJzaW9uIG9mIHRoZSBQQ0kgcmVtb3ZlKCkKKyAqIGZ1bmN0aW9uIHdoZXJlIHdlIGRvIHRoZSBtaW5pbWFsIGFtb3VudCBvZiB3b3JrIG5lY2Vzc2FyeSB0byBzaHV0ZG93biBhbnkKKyAqIGZ1cnRoZXIgYWN0aXZpdHkuCisgKi8KK3N0YXRpYyB2b2lkIHNodXRkb3duX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCS8qIEFzIHdpdGggcmVtb3ZlX29uZSgpIGFib3ZlIChzZWUgZXh0ZW5kZWQgY29tbWVudCksIHdlIG9ubHkgd2FudCBkbworCSAqIGRvIGNsZWFudXAgb24gUENJIERldmljZXMgd2hpY2ggd2VudCBhbGwgdGhlIHdheSB0aHJvdWdoIGluaXRfb25lKCkKKwkgKiAuLi4KKwkgKi8KKwlpZiAoIWFkYXB0ZXIpIHsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChhZGFwdGVyLT5wZiA9PSA0KSB7CisJCWludCBpOworCisJCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkKKwkJCWlmIChhZGFwdGVyLT5wb3J0W2ldLT5yZWdfc3RhdGUgPT0gTkVUUkVHX1JFR0lTVEVSRUQpCisJCQkJY3hnYl9jbG9zZShhZGFwdGVyLT5wb3J0W2ldKTsKKworCQl0NF91bGRfY2xlYW5fdXAoYWRhcHRlcik7CisJCWRpc2FibGVfaW50ZXJydXB0cyhhZGFwdGVyKTsKKwkJZGlzYWJsZV9tc2koYWRhcHRlcik7CisKKwkJdDRfc2dlX3N0b3AoYWRhcHRlcik7CisJCWlmIChhZGFwdGVyLT5mbGFncyAmIEZXX09LKQorCQkJdDRfZndfYnllKGFkYXB0ZXIsIGFkYXB0ZXItPm1ib3gpOworCX0KKyNpZmRlZiBDT05GSUdfUENJX0lPVgorCWVsc2UgeworCQlpZiAoYWRhcHRlci0+cG9ydFswXSkKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGFkYXB0ZXItPnBvcnRbMF0pOworCQlpb3VubWFwKGFkYXB0ZXItPnJlZ3MpOworCQlrZnJlZShhZGFwdGVyLT52ZmluZm8pOworCQlrZnJlZShhZGFwdGVyKTsKKwkJcGNpX2Rpc2FibGVfc3Jpb3YocGRldik7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJfQorI2VuZGlmCiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjeGdiNF9kcml2ZXIgPSB7CkBAIC01MzIxLDcgKzUxNTYsNyBAQAogCS5pZF90YWJsZSA9IGN4Z2I0X3BjaV90YmwsCiAJLnByb2JlICAgID0gaW5pdF9vbmUsCiAJLnJlbW92ZSAgID0gcmVtb3ZlX29uZSwKLQkuc2h1dGRvd24gPSByZW1vdmVfb25lLAorCS5zaHV0ZG93biA9IHNodXRkb3duX29uZSwKICNpZmRlZiBDT05GSUdfUENJX0lPVgogCS5zcmlvdl9jb25maWd1cmUgPSBjeGdiNF9pb3ZfY29uZmlndXJlLAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X3RjX3UzMi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF90Y191MzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWQyZGViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF90Y191MzIuYwpAQCAtMCwwICsxLDQ4MyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxuZXQvdGNfYWN0L3RjX2dhY3QuaD4KKyNpbmNsdWRlIDxuZXQvdGNfYWN0L3RjX21pcnJlZC5oPgorCisjaW5jbHVkZSAiY3hnYjQuaCIKKyNpbmNsdWRlICJjeGdiNF90Y191MzJfcGFyc2UuaCIKKyNpbmNsdWRlICJjeGdiNF90Y191MzIuaCIKKworLyogRmlsbCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiB3aXRoIHBhcnNlZCBtYXRjaCB2YWx1ZS9tYXNrIHBhaXIuICovCitzdGF0aWMgaW50IGZpbGxfbWF0Y2hfZmllbGRzKHN0cnVjdCBhZGFwdGVyICphZGFwLAorCQkJICAgICBzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmZzLAorCQkJICAgICBzdHJ1Y3QgdGNfY2xzX3UzMl9vZmZsb2FkICpjbHMsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBjeGdiNF9tYXRjaF9maWVsZCAqZW50cnksCisJCQkgICAgIGJvb2wgbmV4dF9oZWFkZXIpCit7CisJdW5zaWduZWQgaW50IGksIGo7CisJdTMyIHZhbCwgbWFzazsKKwlpbnQgb2ZmLCBlcnI7CisJYm9vbCBmb3VuZDsKKworCWZvciAoaSA9IDA7IGkgPCBjbHMtPmtub2RlLnNlbC0+bmtleXM7IGkrKykgeworCQlvZmYgPSBjbHMtPmtub2RlLnNlbC0+a2V5c1tpXS5vZmY7CisJCXZhbCA9IGNscy0+a25vZGUuc2VsLT5rZXlzW2ldLnZhbDsKKwkJbWFzayA9IGNscy0+a25vZGUuc2VsLT5rZXlzW2ldLm1hc2s7CisKKwkJaWYgKG5leHRfaGVhZGVyKSB7CisJCQkvKiBGb3IgbmV4dCBoZWFkZXJzLCBwYXJzZSBvbmx5IGtleXMgd2l0aCBvZmZtYXNrICovCisJCQlpZiAoIWNscy0+a25vZGUuc2VsLT5rZXlzW2ldLm9mZm1hc2spCisJCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQkvKiBGb3IgdGhlIHJlbWFpbmluZywgcGFyc2Ugb25seSBrZXlzIHdpdGhvdXQgb2ZmbWFzayAqLworCQkJaWYgKGNscy0+a25vZGUuc2VsLT5rZXlzW2ldLm9mZm1hc2spCisJCQkJY29udGludWU7CisJCX0KKworCQlmb3VuZCA9IGZhbHNlOworCisJCWZvciAoaiA9IDA7IGVudHJ5W2pdLnZhbDsgaisrKSB7CisJCQlpZiAob2ZmID09IGVudHJ5W2pdLm9mZikgeworCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQllcnIgPSBlbnRyeVtqXS52YWwoZnMsIHZhbCwgbWFzayk7CisJCQkJaWYgKGVycikKKwkJCQkJcmV0dXJuIGVycjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICghZm91bmQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogRmlsbCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiB3aXRoIHBhcnNlZCBhY3Rpb24uICovCitzdGF0aWMgaW50IGZpbGxfYWN0aW9uX2ZpZWxkcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCwKKwkJCSAgICAgIHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZnMsCisJCQkgICAgICBzdHJ1Y3QgdGNfY2xzX3UzMl9vZmZsb2FkICpjbHMpCit7CisJdW5zaWduZWQgaW50IG51bV9hY3Rpb25zID0gMDsKKwljb25zdCBzdHJ1Y3QgdGNfYWN0aW9uICphOworCXN0cnVjdCB0Y2ZfZXh0cyAqZXh0czsKKwlMSVNUX0hFQUQoYWN0aW9ucyk7CisKKwlleHRzID0gY2xzLT5rbm9kZS5leHRzOworCWlmICh0Y19ub19hY3Rpb25zKGV4dHMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRjZl9leHRzX3RvX2xpc3QoZXh0cywgJmFjdGlvbnMpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYSwgJmFjdGlvbnMsIGxpc3QpIHsKKwkJLyogRG9uJ3QgYWxsb3cgbW9yZSB0aGFuIG9uZSBhY3Rpb24gcGVyIHJ1bGUuICovCisJCWlmIChudW1fYWN0aW9ucykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIERyb3AgaW4gaGFyZHdhcmUuICovCisJCWlmIChpc190Y2ZfZ2FjdF9zaG90KGEpKSB7CisJCQlmcy0+YWN0aW9uID0gRklMVEVSX0RST1A7CisJCQludW1fYWN0aW9ucysrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBSZS1kaXJlY3QgdG8gc3BlY2lmaWVkIHBvcnQgaW4gaGFyZHdhcmUuICovCisJCWlmIChpc190Y2ZfbWlycmVkX3JlZGlyZWN0KGEpKSB7CisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqbl9kZXY7CisJCQl1bnNpZ25lZCBpbnQgaSwgaW5kZXg7CisJCQlib29sIGZvdW5kID0gZmFsc2U7CisKKwkJCWluZGV4ID0gdGNmX21pcnJlZF9pZmluZGV4KGEpOworCQkJZm9yX2VhY2hfcG9ydChhZGFwLCBpKSB7CisJCQkJbl9kZXYgPSBhZGFwLT5wb3J0W2ldOworCQkJCWlmIChpbmRleCA9PSBuX2Rldi0+aWZpbmRleCkgeworCQkJCQlmcy0+YWN0aW9uID0gRklMVEVSX1NXSVRDSDsKKwkJCQkJZnMtPmVwb3J0ID0gaTsKKwkJCQkJZm91bmQgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCS8qIEludGVyZmFjZSBkb2Vzbid0IGJlbG9uZyB0byBhbnkgcG9ydCBvZgorCQkJICogdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUuCisJCQkgKi8KKwkJCWlmICghZm91bmQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCW51bV9hY3Rpb25zKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFVuLXN1cHBvcnRlZCBhY3Rpb24uICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgY3hnYjRfY29uZmlnX2tub2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUxNiBwcm90b2NvbCwKKwkJICAgICAgIHN0cnVjdCB0Y19jbHNfdTMyX29mZmxvYWQgKmNscykKK3sKKwljb25zdCBzdHJ1Y3QgY3hnYjRfbWF0Y2hfZmllbGQgKnN0YXJ0LCAqbGlua19zdGFydCA9IE5VTEw7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYyYWRhcChkZXYpOworCXN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiBmczsKKwlzdHJ1Y3QgY3hnYjRfdGNfdTMyX3RhYmxlICp0OworCXN0cnVjdCBjeGdiNF9saW5rICpsaW5rOworCXVuc2lnbmVkIGludCBmaWx0ZXJfaWQ7CisJdTMyIHVodGlkLCBsaW5rX3VodGlkOworCWJvb2wgaXNfaXB2NiA9IGZhbHNlOworCWludCByZXQ7CisKKwlpZiAoIWNhbl90Y191MzJfb2ZmbG9hZChkZXYpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAocHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfSVApICYmIHByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQVjYpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBGZXRjaCB0aGUgbG9jYXRpb24gdG8gaW5zZXJ0IHRoZSBmaWx0ZXIuICovCisJZmlsdGVyX2lkID0gY2xzLT5rbm9kZS5oYW5kbGUgJiAweEZGRkZGOworCisJaWYgKGZpbHRlcl9pZCA+IGFkYXB0ZXItPnRpZHMubmZ0aWRzKSB7CisJCWRldl9lcnIoYWRhcHRlci0+cGRldl9kZXYsCisJCQkiTG9jYXRpb24gJWQgb3V0IG9mIHJhbmdlIGZvciBpbnNlcnRpb24uIE1heDogJWRcbiIsCisJCQlmaWx0ZXJfaWQsIGFkYXB0ZXItPnRpZHMubmZ0aWRzKTsKKwkJcmV0dXJuIC1FUkFOR0U7CisJfQorCisJdCA9IGFkYXB0ZXItPnRjX3UzMjsKKwl1aHRpZCA9IFRDX1UzMl9VU0VSSFRJRChjbHMtPmtub2RlLmhhbmRsZSk7CisJbGlua191aHRpZCA9IFRDX1UzMl9VU0VSSFRJRChjbHMtPmtub2RlLmxpbmtfaGFuZGxlKTsKKworCS8qIEVuc3VyZSB0aGF0IHVodGlkIGlzIGVpdGhlciByb290IHUzMiAoaS5lLiAweDgwMCkKKwkgKiBvciBhIGEgdmFsaWQgbGlua2VkIGJ1Y2tldC4KKwkgKi8KKwlpZiAodWh0aWQgIT0gMHg4MDAgJiYgdWh0aWQgPj0gdC0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBFbnN1cmUgbGluayBoYW5kbGUgdWh0aWQgaXMgc2FuZSwgaWYgc3BlY2lmaWVkLiAqLworCWlmIChsaW5rX3VodGlkID49IHQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KCZmcywgMCwgc2l6ZW9mKGZzKSk7CisKKwlpZiAocHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKKwkJc3RhcnQgPSBjeGdiNF9pcHY2X2ZpZWxkczsKKwkJaXNfaXB2NiA9IHRydWU7CisJfSBlbHNlIHsKKwkJc3RhcnQgPSBjeGdiNF9pcHY0X2ZpZWxkczsKKwkJaXNfaXB2NiA9IGZhbHNlOworCX0KKworCWlmICh1aHRpZCAhPSAweDgwMCkgeworCQkvKiBMaW5rIG11c3QgZXhpc3QgZnJvbSByb290IG5vZGUgYmVmb3JlIGluc2VydGlvbi4gKi8KKwkJaWYgKCF0LT50YWJsZVt1aHRpZCAtIDFdLmxpbmtfaGFuZGxlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogTGluayBtdXN0IGhhdmUgYSB2YWxpZCBzdXBwb3J0ZWQgbmV4dCBoZWFkZXIuICovCisJCWxpbmtfc3RhcnQgPSB0LT50YWJsZVt1aHRpZCAtIDFdLm1hdGNoX2ZpZWxkOworCQlpZiAoIWxpbmtfc3RhcnQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBQYXJzZSBsaW5rcyBhbmQgcmVjb3JkIHRoZW0gZm9yIHN1YnNlcXVlbnQganVtcHMgdG8gdmFsaWQKKwkgKiBuZXh0IGhlYWRlcnMuCisJICovCisJaWYgKGxpbmtfdWh0aWQpIHsKKwkJY29uc3Qgc3RydWN0IGN4Z2I0X25leHRfaGVhZGVyICpuZXh0OworCQlib29sIGZvdW5kID0gZmFsc2U7CisJCXVuc2lnbmVkIGludCBpLCBqOworCQl1MzIgdmFsLCBtYXNrOworCQlpbnQgb2ZmOworCisJCWlmICh0LT50YWJsZVtsaW5rX3VodGlkIC0gMV0ubGlua19oYW5kbGUpIHsKKwkJCWRldl9lcnIoYWRhcHRlci0+cGRldl9kZXYsCisJCQkJIkxpbmsgaGFuZGxlIGV4aXN0cyBmb3I6IDB4JXhcbiIsCisJCQkJbGlua191aHRpZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCW5leHQgPSBpc19pcHY2ID8gY3hnYjRfaXB2Nl9qdW1wcyA6IGN4Z2I0X2lwdjRfanVtcHM7CisKKwkJLyogVHJ5IHRvIGZpbmQgbWF0Y2hlcyB0aGF0IGFsbG93IGp1bXBzIHRvIG5leHQgaGVhZGVyLiAqLworCQlmb3IgKGkgPSAwOyBuZXh0W2ldLmp1bXA7IGkrKykgeworCQkJaWYgKG5leHRbaV0ub2Zmb2ZmICE9IGNscy0+a25vZGUuc2VsLT5vZmZvZmYgfHwKKwkJCSAgICBuZXh0W2ldLnNoaWZ0ICE9IGNscy0+a25vZGUuc2VsLT5vZmZzaGlmdCB8fAorCQkJICAgIG5leHRbaV0ubWFzayAhPSBjbHMtPmtub2RlLnNlbC0+b2ZmbWFzayB8fAorCQkJICAgIG5leHRbaV0ub2Zmc2V0ICE9IGNscy0+a25vZGUuc2VsLT5vZmYpCisJCQkJY29udGludWU7CisKKwkJCS8qIEZvdW5kIGEgcG9zc2libGUgY2FuZGlkYXRlLiAgRmluZCBhIGtleSB0aGF0CisJCQkgKiBtYXRjaGVzIHRoZSBjb3JyZXNwb25kaW5nIG9mZnNldCwgdmFsdWUsIGFuZAorCQkJICogbWFzayB0byBqdW1wIHRvIG5leHQgaGVhZGVyLgorCQkJICovCisJCQlmb3IgKGogPSAwOyBqIDwgY2xzLT5rbm9kZS5zZWwtPm5rZXlzOyBqKyspIHsKKwkJCQlvZmYgPSBjbHMtPmtub2RlLnNlbC0+a2V5c1tqXS5vZmY7CisJCQkJdmFsID0gY2xzLT5rbm9kZS5zZWwtPmtleXNbal0udmFsOworCQkJCW1hc2sgPSBjbHMtPmtub2RlLnNlbC0+a2V5c1tqXS5tYXNrOworCisJCQkJaWYgKG5leHRbaV0ubWF0Y2hfb2ZmID09IG9mZiAmJgorCQkJCSAgICBuZXh0W2ldLm1hdGNoX3ZhbCA9PSB2YWwgJiYKKwkJCQkgICAgbmV4dFtpXS5tYXRjaF9tYXNrID09IG1hc2spIHsKKwkJCQkJZm91bmQgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmICghZm91bmQpCisJCQkJY29udGludWU7IC8qIFRyeSBuZXh0IGNhbmRpZGF0ZS4gKi8KKworCQkJLyogQ2FuZGlkYXRlIHRvIGp1bXAgdG8gbmV4dCBoZWFkZXIgZm91bmQuCisJCQkgKiBUcmFuc2xhdGUgYWxsIGtleXMgdG8gaW50ZXJuYWwgc3BlY2lmaWNhdGlvbgorCQkJICogYW5kIHN0b3JlIHRoZW0gaW4ganVtcCB0YWJsZS4gVGhpcyBzcGVjIGlzIGNvcGllZAorCQkJICogbGF0ZXIgdG8gc2V0IHRoZSBhY3R1YWwgZmlsdGVycy4KKwkJCSAqLworCQkJcmV0ID0gZmlsbF9tYXRjaF9maWVsZHMoYWRhcHRlciwgJmZzLCBjbHMsCisJCQkJCQlzdGFydCwgZmFsc2UpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIG91dDsKKworCQkJbGluayA9ICZ0LT50YWJsZVtsaW5rX3VodGlkIC0gMV07CisJCQlsaW5rLT5tYXRjaF9maWVsZCA9IG5leHRbaV0uanVtcDsKKwkJCWxpbmstPmxpbmtfaGFuZGxlID0gY2xzLT5rbm9kZS5oYW5kbGU7CisJCQltZW1jcHkoJmxpbmstPmZzLCAmZnMsIHNpemVvZihmcykpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBObyBjYW5kaWRhdGUgZm91bmQgdG8ganVtcCB0byBuZXh0IGhlYWRlci4gKi8KKwkJaWYgKCFmb3VuZCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJldHVybiAwOworCX0KKworCS8qIEZpbGwgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gbWF0Y2ggZmllbGRzIHRvIGJlIHNoaXBwZWQgdG8gaGFyZHdhcmUuCisJICogQ29weSB0aGUgbGlua2VkIHNwZWMgKGlmIGFueSkgZmlyc3QuICBBbmQgdGhlbiB1cGRhdGUgdGhlIHNwZWMgYXMKKwkgKiBuZWVkZWQuCisJICovCisJaWYgKHVodGlkICE9IDB4ODAwICYmIHQtPnRhYmxlW3VodGlkIC0gMV0ubGlua19oYW5kbGUpIHsKKwkJLyogQ29weSBsaW5rZWQgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKi8KKwkJbWVtY3B5KCZmcywgJnQtPnRhYmxlW3VodGlkIC0gMV0uZnMsIHNpemVvZihmcykpOworCQlyZXQgPSBmaWxsX21hdGNoX2ZpZWxkcyhhZGFwdGVyLCAmZnMsIGNscywKKwkJCQkJbGlua19zdGFydCwgdHJ1ZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBmaWxsX21hdGNoX2ZpZWxkcyhhZGFwdGVyLCAmZnMsIGNscywgc3RhcnQsIGZhbHNlKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIEZpbGwgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gYWN0aW9uIGZpZWxkcyB0byBiZSBzaGlwcGVkIHRvCisJICogaGFyZHdhcmUuCisJICovCisJcmV0ID0gZmlsbF9hY3Rpb25fZmllbGRzKGFkYXB0ZXIsICZmcywgY2xzKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIFRoZSBmaWx0ZXIgc3BlYyBoYXMgYmVlbiBjb21wbGV0ZWx5IGJ1aWx0IGZyb20gdGhlIGluZm8KKwkgKiBwcm92aWRlZCBmcm9tIHUzMi4gIFdlIG5vdyBzZXQgc29tZSBkZWZhdWx0IGZpZWxkcyBpbiB0aGUKKwkgKiBzcGVjIGZvciBzYW5pdHkuCisJICovCisKKwkvKiBNYXRjaCBvbmx5IHBhY2tldHMgY29taW5nIGZyb20gdGhlIGluZ3Jlc3MgcG9ydCB3aGVyZSB0aGlzCisJICogZmlsdGVyIHdpbGwgYmUgY3JlYXRlZC4KKwkgKi8KKwlmcy52YWwuaXBvcnQgPSBuZXRkZXYycGluZm8oZGV2KS0+cG9ydF9pZDsKKwlmcy5tYXNrLmlwb3J0ID0gfjA7CisKKwkvKiBFbmFibGUgZmlsdGVyIGhpdCBjb3VudHMuICovCisJZnMuaGl0Y250cyA9IDE7CisKKwkvKiBTZXQgdHlwZSBvZiBmaWx0ZXIgLSBJUHY2IG9yIElQdjQgKi8KKwlmcy50eXBlID0gaXNfaXB2NiA/IDEgOiAwOworCisJLyogU2V0IHRoZSBmaWx0ZXIgKi8KKwlyZXQgPSBjeGdiNF9zZXRfZmlsdGVyKGRldiwgZmlsdGVyX2lkLCAmZnMpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogSWYgdGhpcyBpcyBhIGxpbmtlZCBidWNrZXQsIHRoZW4gc2V0IHRoZSBjb3JyZXNwb25kaW5nCisJICogZW50cnkgaW4gdGhlIGJpdG1hcCB0byBtYXJrIGl0IGFzIGJlbG9uZ2luZyB0byB0aGlzIGxpbmtlZAorCSAqIGJ1Y2tldC4KKwkgKi8KKwlpZiAodWh0aWQgIT0gMHg4MDAgJiYgdC0+dGFibGVbdWh0aWQgLSAxXS5saW5rX2hhbmRsZSkKKwkJc2V0X2JpdChmaWx0ZXJfaWQsIHQtPnRhYmxlW3VodGlkIC0gMV0udGlkX21hcCk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgY3hnYjRfZGVsZXRlX2tub2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUxNiBwcm90b2NvbCwKKwkJICAgICAgIHN0cnVjdCB0Y19jbHNfdTMyX29mZmxvYWQgKmNscykKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldjJhZGFwKGRldik7CisJdW5zaWduZWQgaW50IGZpbHRlcl9pZCwgbWF4X3RpZHMsIGksIGo7CisJc3RydWN0IGN4Z2I0X2xpbmsgKmxpbmsgPSBOVUxMOworCXN0cnVjdCBjeGdiNF90Y191MzJfdGFibGUgKnQ7CisJdTMyIGhhbmRsZSwgdWh0aWQ7CisJaW50IHJldDsKKworCWlmICghY2FuX3RjX3UzMl9vZmZsb2FkKGRldikpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIEZldGNoIHRoZSBsb2NhdGlvbiB0byBkZWxldGUgdGhlIGZpbHRlci4gKi8KKwlmaWx0ZXJfaWQgPSBjbHMtPmtub2RlLmhhbmRsZSAmIDB4RkZGRkY7CisKKwlpZiAoZmlsdGVyX2lkID4gYWRhcHRlci0+dGlkcy5uZnRpZHMpIHsKKwkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwKKwkJCSJMb2NhdGlvbiAlZCBvdXQgb2YgcmFuZ2UgZm9yIGRlbGV0aW9uLiBNYXg6ICVkXG4iLAorCQkJZmlsdGVyX2lkLCBhZGFwdGVyLT50aWRzLm5mdGlkcyk7CisJCXJldHVybiAtRVJBTkdFOworCX0KKworCXQgPSBhZGFwdGVyLT50Y191MzI7CisJaGFuZGxlID0gY2xzLT5rbm9kZS5oYW5kbGU7CisJdWh0aWQgPSBUQ19VMzJfVVNFUkhUSUQoY2xzLT5rbm9kZS5oYW5kbGUpOworCisJLyogRW5zdXJlIHRoYXQgdWh0aWQgaXMgZWl0aGVyIHJvb3QgdTMyIChpLmUuIDB4ODAwKQorCSAqIG9yIGEgYSB2YWxpZCBsaW5rZWQgYnVja2V0LgorCSAqLworCWlmICh1aHRpZCAhPSAweDgwMCAmJiB1aHRpZCA+PSB0LT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGZpbHRlciAqLworCWlmICh1aHRpZCAhPSAweDgwMCkgeworCQlsaW5rID0gJnQtPnRhYmxlW3VodGlkIC0gMV07CisJCWlmICghbGluay0+bGlua19oYW5kbGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoIXRlc3RfYml0KGZpbHRlcl9pZCwgbGluay0+dGlkX21hcCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBjeGdiNF9kZWxfZmlsdGVyKGRldiwgZmlsdGVyX2lkKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlmIChsaW5rKQorCQljbGVhcl9iaXQoZmlsdGVyX2lkLCBsaW5rLT50aWRfbWFwKTsKKworCS8qIElmIGEgbGluayBpcyBiZWluZyBkZWxldGVkLCB0aGVuIGRlbGV0ZSBhbGwgZmlsdGVycworCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluay4KKwkgKi8KKwltYXhfdGlkcyA9IGFkYXB0ZXItPnRpZHMubmZ0aWRzOworCWZvciAoaSA9IDA7IGkgPCB0LT5zaXplOyBpKyspIHsKKwkJbGluayA9ICZ0LT50YWJsZVtpXTsKKworCQlpZiAobGluay0+bGlua19oYW5kbGUgPT0gaGFuZGxlKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgbWF4X3RpZHM7IGorKykgeworCQkJCWlmICghdGVzdF9iaXQoaiwgbGluay0+dGlkX21hcCkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJcmV0ID0gX19jeGdiNF9kZWxfZmlsdGVyKGRldiwgaiwgTlVMTCk7CisJCQkJaWYgKHJldCkKKwkJCQkJZ290byBvdXQ7CisKKwkJCQljbGVhcl9iaXQoaiwgbGluay0+dGlkX21hcCk7CisJCQl9CisKKwkJCS8qIENsZWFyIHRoZSBsaW5rIHN0YXRlICovCisJCQlsaW5rLT5tYXRjaF9maWVsZCA9IE5VTEw7CisJCQlsaW5rLT5saW5rX2hhbmRsZSA9IDA7CisJCQltZW1zZXQoJmxpbmstPmZzLCAwLCBzaXplb2YobGluay0+ZnMpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBjeGdiNF9jbGVhbnVwX3RjX3UzMihzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgY3hnYjRfdGNfdTMyX3RhYmxlICp0OworCXVuc2lnbmVkIGludCBpOworCisJaWYgKCFhZGFwLT50Y191MzIpCisJCXJldHVybjsKKworCS8qIEZyZWUgdXAgYWxsIGFsbG9jYXRlZCBtZW1vcnkuICovCisJdCA9IGFkYXAtPnRjX3UzMjsKKwlmb3IgKGkgPSAwOyBpIDwgdC0+c2l6ZTsgaSsrKSB7CisJCXN0cnVjdCBjeGdiNF9saW5rICpsaW5rID0gJnQtPnRhYmxlW2ldOworCisJCXQ0X2ZyZWVfbWVtKGxpbmstPnRpZF9tYXApOworCX0KKwl0NF9mcmVlX21lbShhZGFwLT50Y191MzIpOworfQorCitzdHJ1Y3QgY3hnYjRfdGNfdTMyX3RhYmxlICpjeGdiNF9pbml0X3RjX3UzMihzdHJ1Y3QgYWRhcHRlciAqYWRhcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgY3hnYjRfdGNfdTMyX3RhYmxlICp0OworCXVuc2lnbmVkIGludCBpOworCisJaWYgKCFzaXplKQorCQlyZXR1cm4gTlVMTDsKKworCXQgPSB0NF9hbGxvY19tZW0oc2l6ZW9mKCp0KSArCisJCQkgKHNpemUgKiBzaXplb2Yoc3RydWN0IGN4Z2I0X2xpbmspKSk7CisJaWYgKCF0KQorCQlyZXR1cm4gTlVMTDsKKworCXQtPnNpemUgPSBzaXplOworCisJZm9yIChpID0gMDsgaSA8IHQtPnNpemU7IGkrKykgeworCQlzdHJ1Y3QgY3hnYjRfbGluayAqbGluayA9ICZ0LT50YWJsZVtpXTsKKwkJdW5zaWduZWQgaW50IGJtYXBfc2l6ZTsKKwkJdW5zaWduZWQgaW50IG1heF90aWRzOworCisJCW1heF90aWRzID0gYWRhcC0+dGlkcy5uZnRpZHM7CisJCWJtYXBfc2l6ZSA9IEJJVFNfVE9fTE9OR1MobWF4X3RpZHMpOworCQlsaW5rLT50aWRfbWFwID0gdDRfYWxsb2NfbWVtKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIGJtYXBfc2l6ZSk7CisJCWlmICghbGluay0+dGlkX21hcCkKKwkJCWdvdG8gb3V0X25vX21lbTsKKwkJYml0bWFwX3plcm8obGluay0+dGlkX21hcCwgbWF4X3RpZHMpOworCX0KKworCXJldHVybiB0OworCitvdXRfbm9fbWVtOgorCWZvciAoaSA9IDA7IGkgPCB0LT5zaXplOyBpKyspIHsKKwkJc3RydWN0IGN4Z2I0X2xpbmsgKmxpbmsgPSAmdC0+dGFibGVbaV07CisKKwkJaWYgKGxpbmstPnRpZF9tYXApCisJCQl0NF9mcmVlX21lbShsaW5rLT50aWRfbWFwKTsKKwl9CisKKwlpZiAodCkKKwkJdDRfZnJlZV9tZW0odCk7CisKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdGNfdTMyLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X3RjX3UzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZGM4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X3RjX3UzMi5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUNCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fQ1hHQjRfVENfVTMyX0gKKyNkZWZpbmUgX19DWEdCNF9UQ19VMzJfSAorCisjaW5jbHVkZSA8bmV0L3BrdF9jbHMuaD4KKworI2RlZmluZSBDWEdCNF9NQVhfTElOS19IQU5ETEUgMzIKKworc3RhdGljIGlubGluZSBib29sIGNhbl90Y191MzJfb2ZmbG9hZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gbmV0ZGV2MmFkYXAoZGV2KTsKKworCXJldHVybiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVEMpICYmIGFkYXAtPnRjX3UzMiA/IHRydWUgOiBmYWxzZTsKK30KKworaW50IGN4Z2I0X2NvbmZpZ19rbm9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX2JlMTYgcHJvdG9jb2wsCisJCSAgICAgICBzdHJ1Y3QgdGNfY2xzX3UzMl9vZmZsb2FkICpjbHMpOworaW50IGN4Z2I0X2RlbGV0ZV9rbm9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX2JlMTYgcHJvdG9jb2wsCisJCSAgICAgICBzdHJ1Y3QgdGNfY2xzX3UzMl9vZmZsb2FkICpjbHMpOworCit2b2lkIGN4Z2I0X2NsZWFudXBfdGNfdTMyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKK3N0cnVjdCBjeGdiNF90Y191MzJfdGFibGUgKmN4Z2I0X2luaXRfdGNfdTMyKHN0cnVjdCBhZGFwdGVyICphZGFwLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBzaXplKTsKKyNlbmRpZiAvKiBfX0NYR0I0X1RDX1UzMl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X3RjX3UzMl9wYXJzZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF90Y191MzJfcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGI5OWVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF90Y191MzJfcGFyc2UuaApAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19DWEdCNF9UQ19VMzJfUEFSU0VfSAorI2RlZmluZSBfX0NYR0I0X1RDX1UzMl9QQVJTRV9ICisKK3N0cnVjdCBjeGdiNF9tYXRjaF9maWVsZCB7CisJaW50IG9mZjsgLyogT2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgaGVhZGVyIHRvIG1hdGNoICovCisJLyogRmlsbCB0aGUgdmFsdWUvbWFzayBwYWlyIGluIHRoZSBzcGVjIGlmIG1hdGNoZWQgKi8KKwlpbnQgKCp2YWwpKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZiwgdTMyIHZhbCwgdTMyIG1hc2spOworfTsKKworLyogSVB2NCBtYXRjaCBmaWVsZHMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGN4Z2I0X2ZpbGxfaXB2NF90b3Moc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmLAorCQkJCSAgICAgIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCWYtPnZhbC50b3MgID0gKG50b2hsKHZhbCkgID4+IDE2KSAmIDB4MDAwMDAwRkY7CisJZi0+bWFzay50b3MgPSAobnRvaGwobWFzaykgPj4gMTYpICYgMHgwMDAwMDBGRjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjeGdiNF9maWxsX2lwdjRfZnJhZyhzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmYsCisJCQkJICAgICAgIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCXUzMiBtYXNrX3ZhbDsKKwl1OCBmcmFnX3ZhbDsKKworCWZyYWdfdmFsID0gKG50b2hsKHZhbCkgPj4gMTMpICYgMHgwMDAwMDAwNzsKKwltYXNrX3ZhbCA9IG50b2hsKG1hc2spICYgMHgwMDAwRkZGRjsKKworCWlmIChmcmFnX3ZhbCA9PSAweDEgJiYgbWFza192YWwgIT0gMHgzRkZGKSB7IC8qIE1GIHNldCAqLworCQlmLT52YWwuZnJhZyA9IDE7CisJCWYtPm1hc2suZnJhZyA9IDE7CisJfSBlbHNlIGlmIChmcmFnX3ZhbCA9PSAweDIgJiYgbWFza192YWwgIT0gMHgzRkZGKSB7IC8qIERGIHNldCAqLworCQlmLT52YWwuZnJhZyA9IDA7CisJCWYtPm1hc2suZnJhZyA9IDE7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGN4Z2I0X2ZpbGxfaXB2NF9wcm90byhzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmYsCisJCQkJCXUzMiB2YWwsIHUzMiBtYXNrKQoreworCWYtPnZhbC5wcm90byAgPSAobnRvaGwodmFsKSAgPj4gMTYpICYgMHgwMDAwMDBGRjsKKwlmLT5tYXNrLnByb3RvID0gKG50b2hsKG1hc2spID4+IDE2KSAmIDB4MDAwMDAwRkY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3hnYjRfZmlsbF9pcHY0X3NyY19pcChzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmYsCisJCQkJCSB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwltZW1jcHkoJmYtPnZhbC5maXBbMF0sICAmdmFsLCAgc2l6ZW9mKHUzMikpOworCW1lbWNweSgmZi0+bWFzay5maXBbMF0sICZtYXNrLCBzaXplb2YodTMyKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3hnYjRfZmlsbF9pcHY0X2RzdF9pcChzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmYsCisJCQkJCSB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwltZW1jcHkoJmYtPnZhbC5saXBbMF0sICAmdmFsLCAgc2l6ZW9mKHUzMikpOworCW1lbWNweSgmZi0+bWFzay5saXBbMF0sICZtYXNrLCBzaXplb2YodTMyKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjeGdiNF9tYXRjaF9maWVsZCBjeGdiNF9pcHY0X2ZpZWxkc1tdID0geworCXsgLm9mZiA9IDAsICAudmFsID0gY3hnYjRfZmlsbF9pcHY0X3RvcyB9LAorCXsgLm9mZiA9IDQsICAudmFsID0gY3hnYjRfZmlsbF9pcHY0X2ZyYWcgfSwKKwl7IC5vZmYgPSA4LCAgLnZhbCA9IGN4Z2I0X2ZpbGxfaXB2NF9wcm90byB9LAorCXsgLm9mZiA9IDEyLCAudmFsID0gY3hnYjRfZmlsbF9pcHY0X3NyY19pcCB9LAorCXsgLm9mZiA9IDE2LCAudmFsID0gY3hnYjRfZmlsbF9pcHY0X2RzdF9pcCB9LAorCXsgLnZhbCA9IE5VTEwgfQorfTsKKworLyogSVB2NiBtYXRjaCBmaWVsZHMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGN4Z2I0X2ZpbGxfaXB2Nl90b3Moc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmLAorCQkJCSAgICAgIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCWYtPnZhbC50b3MgID0gKG50b2hsKHZhbCkgID4+IDIwKSAmIDB4MDAwMDAwRkY7CisJZi0+bWFzay50b3MgPSAobnRvaGwobWFzaykgPj4gMjApICYgMHgwMDAwMDBGRjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjeGdiNF9maWxsX2lwdjZfcHJvdG8oc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmLAorCQkJCQl1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwlmLT52YWwucHJvdG8gID0gKG50b2hsKHZhbCkgID4+IDgpICYgMHgwMDAwMDBGRjsKKwlmLT5tYXNrLnByb3RvID0gKG50b2hsKG1hc2spID4+IDgpICYgMHgwMDAwMDBGRjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjeGdiNF9maWxsX2lwdjZfc3JjX2lwMChzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmYsCisJCQkJCSAgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJbWVtY3B5KCZmLT52YWwuZmlwWzBdLCAgJnZhbCwgIHNpemVvZih1MzIpKTsKKwltZW1jcHkoJmYtPm1hc2suZmlwWzBdLCAmbWFzaywgc2l6ZW9mKHUzMikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGN4Z2I0X2ZpbGxfaXB2Nl9zcmNfaXAxKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZiwKKwkJCQkJICB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwltZW1jcHkoJmYtPnZhbC5maXBbNF0sICAmdmFsLCAgc2l6ZW9mKHUzMikpOworCW1lbWNweSgmZi0+bWFzay5maXBbNF0sICZtYXNrLCBzaXplb2YodTMyKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3hnYjRfZmlsbF9pcHY2X3NyY19pcDIoc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmLAorCQkJCQkgIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCW1lbWNweSgmZi0+dmFsLmZpcFs4XSwgICZ2YWwsICBzaXplb2YodTMyKSk7CisJbWVtY3B5KCZmLT5tYXNrLmZpcFs4XSwgJm1hc2ssIHNpemVvZih1MzIpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjeGdiNF9maWxsX2lwdjZfc3JjX2lwMyhzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmYsCisJCQkJCSAgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJbWVtY3B5KCZmLT52YWwuZmlwWzEyXSwgICZ2YWwsICBzaXplb2YodTMyKSk7CisJbWVtY3B5KCZmLT5tYXNrLmZpcFsxMl0sICZtYXNrLCBzaXplb2YodTMyKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3hnYjRfZmlsbF9pcHY2X2RzdF9pcDAoc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmLAorCQkJCQkgIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCW1lbWNweSgmZi0+dmFsLmxpcFswXSwgICZ2YWwsICBzaXplb2YodTMyKSk7CisJbWVtY3B5KCZmLT5tYXNrLmxpcFswXSwgJm1hc2ssIHNpemVvZih1MzIpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjeGdiNF9maWxsX2lwdjZfZHN0X2lwMShzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmYsCisJCQkJCSAgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJbWVtY3B5KCZmLT52YWwubGlwWzRdLCAgJnZhbCwgIHNpemVvZih1MzIpKTsKKwltZW1jcHkoJmYtPm1hc2subGlwWzRdLCAmbWFzaywgc2l6ZW9mKHUzMikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGN4Z2I0X2ZpbGxfaXB2Nl9kc3RfaXAyKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZiwKKwkJCQkJICB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwltZW1jcHkoJmYtPnZhbC5saXBbOF0sICAmdmFsLCAgc2l6ZW9mKHUzMikpOworCW1lbWNweSgmZi0+bWFzay5saXBbOF0sICZtYXNrLCBzaXplb2YodTMyKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3hnYjRfZmlsbF9pcHY2X2RzdF9pcDMoc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmLAorCQkJCQkgIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCW1lbWNweSgmZi0+dmFsLmxpcFsxMl0sICAmdmFsLCAgc2l6ZW9mKHUzMikpOworCW1lbWNweSgmZi0+bWFzay5saXBbMTJdLCAmbWFzaywgc2l6ZW9mKHUzMikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3hnYjRfbWF0Y2hfZmllbGQgY3hnYjRfaXB2Nl9maWVsZHNbXSA9IHsKKwl7IC5vZmYgPSAwLCAgLnZhbCA9IGN4Z2I0X2ZpbGxfaXB2Nl90b3MgfSwKKwl7IC5vZmYgPSA0LCAgLnZhbCA9IGN4Z2I0X2ZpbGxfaXB2Nl9wcm90byB9LAorCXsgLm9mZiA9IDgsICAudmFsID0gY3hnYjRfZmlsbF9pcHY2X3NyY19pcDAgfSwKKwl7IC5vZmYgPSAxMiwgLnZhbCA9IGN4Z2I0X2ZpbGxfaXB2Nl9zcmNfaXAxIH0sCisJeyAub2ZmID0gMTYsIC52YWwgPSBjeGdiNF9maWxsX2lwdjZfc3JjX2lwMiB9LAorCXsgLm9mZiA9IDIwLCAudmFsID0gY3hnYjRfZmlsbF9pcHY2X3NyY19pcDMgfSwKKwl7IC5vZmYgPSAyNCwgLnZhbCA9IGN4Z2I0X2ZpbGxfaXB2Nl9kc3RfaXAwIH0sCisJeyAub2ZmID0gMjgsIC52YWwgPSBjeGdiNF9maWxsX2lwdjZfZHN0X2lwMSB9LAorCXsgLm9mZiA9IDMyLCAudmFsID0gY3hnYjRfZmlsbF9pcHY2X2RzdF9pcDIgfSwKKwl7IC5vZmYgPSAzNiwgLnZhbCA9IGN4Z2I0X2ZpbGxfaXB2Nl9kc3RfaXAzIH0sCisJeyAudmFsID0gTlVMTCB9Cit9OworCisvKiBUQ1AvVURQIG1hdGNoICovCitzdGF0aWMgaW5saW5lIGludCBjeGdiNF9maWxsX2w0X3BvcnRzKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZiwKKwkJCQkgICAgICB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwlmLT52YWwuZnBvcnQgID0gbnRvaGwodmFsKSAgPj4gMTY7CisJZi0+bWFzay5mcG9ydCA9IG50b2hsKG1hc2spID4+IDE2OworCWYtPnZhbC5scG9ydCAgPSBudG9obCh2YWwpICAmIDB4MDAwMEZGRkY7CisJZi0+bWFzay5scG9ydCA9IG50b2hsKG1hc2spICYgMHgwMDAwRkZGRjsKKworCXJldHVybiAwOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjeGdiNF9tYXRjaF9maWVsZCBjeGdiNF90Y3BfZmllbGRzW10gPSB7CisJeyAub2ZmID0gMCwgLnZhbCA9IGN4Z2I0X2ZpbGxfbDRfcG9ydHMgfSwKKwl7IC52YWwgPSBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3hnYjRfbWF0Y2hfZmllbGQgY3hnYjRfdWRwX2ZpZWxkc1tdID0geworCXsgLm9mZiA9IDAsIC52YWwgPSBjeGdiNF9maWxsX2w0X3BvcnRzIH0sCisJeyAudmFsID0gTlVMTCB9Cit9OworCitzdHJ1Y3QgY3hnYjRfbmV4dF9oZWFkZXIgeworCXVuc2lnbmVkIGludCBvZmZzZXQ7IC8qIE9mZnNldCB0byBuZXh0IGhlYWRlciAqLworCS8qIG9mZnNldCwgc2hpZnQsIGFuZCBtYXNrIGFkZGVkIHRvIG9mZnNldCBhYm92ZQorCSAqIHRvIGdldCB0byBuZXh0IGhlYWRlci4gIFVzZWZ1bCB3aGVuIHVzaW5nIGEgaGVhZGVyCisJICogZmllbGQncyB2YWx1ZSB0byBqdW1wIHRvIG5leHQgaGVhZGVyIHN1Y2ggYXMgSUhMIGZpZWxkCisJICogaW4gSVB2NCBoZWFkZXIuCisJICovCisJdW5zaWduZWQgaW50IG9mZm9mZjsKKwl1MzIgc2hpZnQ7CisJdTMyIG1hc2s7CisJLyogbWF0Y2ggY3JpdGVyaWEgdG8gbWFrZSB0aGlzIGp1bXAgKi8KKwl1bnNpZ25lZCBpbnQgbWF0Y2hfb2ZmOworCXUzMiBtYXRjaF92YWw7CisJdTMyIG1hdGNoX21hc2s7CisJLyogbG9jYXRpb24gb2YganVtcCB0byBtYWtlICovCisJY29uc3Qgc3RydWN0IGN4Z2I0X21hdGNoX2ZpZWxkICpqdW1wOworfTsKKworLyogQWNjZXB0IGEgcnVsZSB3aXRoIGEganVtcCB0byB0cmFuc3BvcnQgbGF5ZXIgaGVhZGVyIGJhc2VkIG9uIElITCBmaWVsZCBpbgorICogSVB2NCBoZWFkZXIuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3hnYjRfbmV4dF9oZWFkZXIgY3hnYjRfaXB2NF9qdW1wc1tdID0geworCXsgLm9mZnNldCA9IDAsIC5vZmZvZmYgPSAwLCAuc2hpZnQgPSA2LCAubWFzayA9IDB4RiwKKwkgIC5tYXRjaF9vZmYgPSA4LCAubWF0Y2hfdmFsID0gMHg2MDAsIC5tYXRjaF9tYXNrID0gMHhGRjAwLAorCSAgLmp1bXAgPSBjeGdiNF90Y3BfZmllbGRzIH0sCisJeyAub2Zmc2V0ID0gMCwgLm9mZm9mZiA9IDAsIC5zaGlmdCA9IDYsIC5tYXNrID0gMHhGLAorCSAgLm1hdGNoX29mZiA9IDgsIC5tYXRjaF92YWwgPSAweDExMDAsIC5tYXRjaF9tYXNrID0gMHhGRjAwLAorCSAgLmp1bXAgPSBjeGdiNF91ZHBfZmllbGRzIH0sCisJeyAuanVtcCA9IE5VTEwgfQorfTsKKworLyogQWNjZXB0IGEgcnVsZSB3aXRoIGEganVtcCBkaXJlY3RseSBwYXN0IHRoZSA0MCBCeXRlcyBvZiBJUHY2IGZpeGVkIGhlYWRlcgorICogdG8gZ2V0IHRvIHRyYW5zcG9ydCBsYXllciBoZWFkZXIuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3hnYjRfbmV4dF9oZWFkZXIgY3hnYjRfaXB2Nl9qdW1wc1tdID0geworCXsgLm9mZnNldCA9IDB4MjgsIC5vZmZvZmYgPSAwLCAuc2hpZnQgPSAwLCAubWFzayA9IDAsCisJICAubWF0Y2hfb2ZmID0gNCwgLm1hdGNoX3ZhbCA9IDB4NjAwMDAsIC5tYXRjaF9tYXNrID0gMHhGRjAwMDAsCisJICAuanVtcCA9IGN4Z2I0X3RjcF9maWVsZHMgfSwKKwl7IC5vZmZzZXQgPSAweDI4LCAub2Zmb2ZmID0gMCwgLnNoaWZ0ID0gMCwgLm1hc2sgPSAwLAorCSAgLm1hdGNoX29mZiA9IDQsIC5tYXRjaF92YWwgPSAweDExMDAwMCwgLm1hdGNoX21hc2sgPSAweEZGMDAwMCwKKwkgIC5qdW1wID0gY3hnYjRfdWRwX2ZpZWxkcyB9LAorCXsgLmp1bXAgPSBOVUxMIH0KK307CisKK3N0cnVjdCBjeGdiNF9saW5rIHsKKwljb25zdCBzdHJ1Y3QgY3hnYjRfbWF0Y2hfZmllbGQgKm1hdGNoX2ZpZWxkOyAgLyogTmV4dCBoZWFkZXIgKi8KKwlzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gZnM7IC8qIE1hdGNoIHNwZWMgYXNzb2NpYXRlZCB3aXRoIGxpbmsgKi8KKwl1MzIgbGlua19oYW5kbGU7ICAgICAgICAgLyogS25vZGUgaGFuZGxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluayAqLworCXVuc2lnbmVkIGxvbmcgKnRpZF9tYXA7ICAvKiBCaXRtYXAgZm9yIGZpbHRlciB0aWRzICovCit9OworCitzdHJ1Y3QgY3hnYjRfdGNfdTMyX3RhYmxlIHsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsgICAgICAgICAgLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGFibGUgKi8KKwlzdHJ1Y3QgY3hnYjRfbGluayB0YWJsZVswXTsgLyogSnVtcCB0YWJsZSAqLworfTsKKyNlbmRpZiAvKiBfX0NYR0I0X1RDX1UzMl9QQVJTRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X3VsZC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF91bGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGIyZDIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF91bGQuYwpAQCAtMCwwICsxLDY5NiBAQAorLyoKKyAqIGN4Z2I0X3VsZC5jOkNoZWxzaW8gVXBwZXIgTGF5ZXIgRHJpdmVyIEludGVyZmFjZSBmb3IgVDQvVDUvVDYgU0dFIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogIFdyaXR0ZW4gYnk6IEF0dWwgR3VwdGEgKGF0dWwuZ3VwdGFAY2hlbHNpby5jb20pCisgKiAgV3JpdHRlbiBieTogSGFyaXByYXNhZCBTaGVuYWkgKGhhcmlwcmFzYWRAY2hlbHNpby5jb20pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSAiY3hnYjQuaCIKKyNpbmNsdWRlICJjeGdiNF91bGQuaCIKKyNpbmNsdWRlICJ0NF9yZWdzLmgiCisjaW5jbHVkZSAidDRmd19hcGkuaCIKKyNpbmNsdWRlICJ0NF9tc2cuaCIKKworI2RlZmluZSBmb3JfZWFjaF91bGRyeHEobSwgaSkgZm9yIChpID0gMDsgaSA8ICgobSktPm5yeHEgKyAobSktPm5jaXEpOyBpKyspCisKK3N0YXRpYyBpbnQgZ2V0X21zaXhfaWR4X2Zyb21fYm1hcChzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgdWxkX21zaXhfYm1hcCAqYm1hcCA9ICZhZGFwLT5tc2l4X2JtYXBfdWxkczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtc2l4X2lkeDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibWFwLT5sb2NrLCBmbGFncyk7CisJbXNpeF9pZHggPSBmaW5kX2ZpcnN0X3plcm9fYml0KGJtYXAtPm1zaXhfYm1hcCwgYm1hcC0+bWFwc2l6ZSk7CisJaWYgKG1zaXhfaWR4IDwgYm1hcC0+bWFwc2l6ZSkgeworCQlfX3NldF9iaXQobXNpeF9pZHgsIGJtYXAtPm1zaXhfYm1hcCk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm1hcC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibWFwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIG1zaXhfaWR4OworfQorCitzdGF0aWMgdm9pZCBmcmVlX21zaXhfaWR4X2luX2JtYXAoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCBtc2l4X2lkeCkKK3sKKwlzdHJ1Y3QgdWxkX21zaXhfYm1hcCAqYm1hcCA9ICZhZGFwLT5tc2l4X2JtYXBfdWxkczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJtYXAtPmxvY2ssIGZsYWdzKTsKKwkgX19jbGVhcl9iaXQobXNpeF9pZHgsIGJtYXAtPm1zaXhfYm1hcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm1hcC0+bG9jaywgZmxhZ3MpOworfQorCisvKiBGbHVzaCB0aGUgYWdncmVnYXRlZCBscm8gc2Vzc2lvbnMgKi8KK3N0YXRpYyB2b2lkIHVsZHJ4X2ZsdXNoX2hhbmRsZXIoc3RydWN0IHNnZV9yc3BxICpxKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcS0+YWRhcDsKKworCWlmIChhZGFwLT51bGRbcS0+dWxkXS5scm9fZmx1c2gpCisJCWFkYXAtPnVsZFtxLT51bGRdLmxyb19mbHVzaCgmcS0+bHJvX21ncik7Cit9CisKKy8qKgorICoJdWxkcnhfaGFuZGxlciAtIHJlc3BvbnNlIHF1ZXVlIGhhbmRsZXIgZm9yIFVMRCBxdWV1ZXMKKyAqCUBxOiB0aGUgcmVzcG9uc2UgcXVldWUgdGhhdCByZWNlaXZlZCB0aGUgcGFja2V0CisgKglAcnNwOiB0aGUgcmVzcG9uc2UgcXVldWUgZGVzY3JpcHRvciBob2xkaW5nIHRoZSBvZmZsb2FkIG1lc3NhZ2UKKyAqCUBnbDogdGhlIGdhdGhlciBsaXN0IG9mIHBhY2tldCBmcmFnbWVudHMKKyAqCisgKglEZWxpdmVyIGFuIGluZ3Jlc3Mgb2ZmbG9hZCBwYWNrZXQgdG8gYSBVTEQuICBBbGwgcHJvY2Vzc2luZyBpcyBkb25lIGJ5CisgKgl0aGUgVUxELCB3ZSBqdXN0IG1haW50YWluIHN0YXRpc3RpY3MuCisgKi8KK3N0YXRpYyBpbnQgdWxkcnhfaGFuZGxlcihzdHJ1Y3Qgc2dlX3JzcHEgKnEsIGNvbnN0IF9fYmU2NCAqcnNwLAorCQkJIGNvbnN0IHN0cnVjdCBwa3RfZ2wgKmdsKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcS0+YWRhcDsKKwlzdHJ1Y3Qgc2dlX29mbGRfcnhxICpyeHEgPSBjb250YWluZXJfb2YocSwgc3RydWN0IHNnZV9vZmxkX3J4cSwgcnNwcSk7CisJaW50IHJldDsKKworCS8qIEZXIGNhbiBzZW5kIENQTHMgZW5jYXBzdWxhdGVkIGluIGEgQ1BMX0ZXNF9NU0cgKi8KKwlpZiAoKChjb25zdCBzdHJ1Y3QgcnNzX2hlYWRlciAqKXJzcCktPm9wY29kZSA9PSBDUExfRlc0X01TRyAmJgorCSAgICAoKGNvbnN0IHN0cnVjdCBjcGxfZnc0X21zZyAqKShyc3AgKyAxKSktPnR5cGUgPT0gRldfVFlQRV9SU1NDUEwpCisJCXJzcCArPSAyOworCisJaWYgKHEtPmZsdXNoX2hhbmRsZXIpCisJCXJldCA9IGFkYXAtPnVsZFtxLT51bGRdLmxyb19yeF9oYW5kbGVyKGFkYXAtPnVsZFtxLT51bGRdLmhhbmRsZSwKKwkJCQlyc3AsIGdsLCAmcS0+bHJvX21nciwKKwkJCQkmcS0+bmFwaSk7CisJZWxzZQorCQlyZXQgPSBhZGFwLT51bGRbcS0+dWxkXS5yeF9oYW5kbGVyKGFkYXAtPnVsZFtxLT51bGRdLmhhbmRsZSwKKwkJCQlyc3AsIGdsKTsKKworCWlmIChyZXQpIHsKKwkJcnhxLT5zdGF0cy5ub21lbSsrOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCFnbCkKKwkJcnhxLT5zdGF0cy5pbW0rKzsKKwllbHNlIGlmIChnbCA9PSBDWEdCNF9NU0dfQU4pCisJCXJ4cS0+c3RhdHMuYW4rKzsKKwllbHNlCisJCXJ4cS0+c3RhdHMucGt0cysrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsbG9jX3VsZF9yeHFzKHN0cnVjdCBhZGFwdGVyICphZGFwLAorCQkJICBzdHJ1Y3Qgc2dlX3VsZF9yeHFfaW5mbyAqcnhxX2luZm8sCisJCQkgIHVuc2lnbmVkIGludCBucSwgdW5zaWduZWQgaW50IG9mZnNldCwgYm9vbCBscm8pCit7CisJc3RydWN0IHNnZSAqcyA9ICZhZGFwLT5zZ2U7CisJc3RydWN0IHNnZV9vZmxkX3J4cSAqcSA9IHJ4cV9pbmZvLT51bGRyeHEgKyBvZmZzZXQ7CisJdW5zaWduZWQgc2hvcnQgKmlkcyA9IHJ4cV9pbmZvLT5yc3BxX2lkICsgb2Zmc2V0OworCXVuc2lnbmVkIGludCBwZXJfY2hhbiA9IG5xIC8gYWRhcC0+cGFyYW1zLm5wb3J0czsKKwl1bnNpZ25lZCBpbnQgYm1hcF9pZHggPSAwOworCWludCBpLCBlcnIsIG1zaV9pZHg7CisKKwlpZiAoYWRhcC0+ZmxhZ3MgJiBVU0lOR19NU0lYKQorCQltc2lfaWR4ID0gMTsKKwllbHNlCisJCW1zaV9pZHggPSAtKChpbnQpcy0+aW50cnEuYWJzX2lkICsgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnE7IGkrKywgcSsrKSB7CisJCWlmIChtc2lfaWR4ID49IDApIHsKKwkJCWJtYXBfaWR4ID0gZ2V0X21zaXhfaWR4X2Zyb21fYm1hcChhZGFwKTsKKwkJCW1zaV9pZHggPSBhZGFwLT5tc2l4X2luZm9fdWxkc1tibWFwX2lkeF0uaWR4OworCQl9CisJCWVyciA9IHQ0X3NnZV9hbGxvY19yeHEoYWRhcCwgJnEtPnJzcHEsIGZhbHNlLAorCQkJCSAgICAgICBhZGFwLT5wb3J0W2kgLyBwZXJfY2hhbl0sCisJCQkJICAgICAgIG1zaV9pZHgsCisJCQkJICAgICAgIHEtPmZsLnNpemUgPyAmcS0+ZmwgOiBOVUxMLAorCQkJCSAgICAgICB1bGRyeF9oYW5kbGVyLAorCQkJCSAgICAgICBscm8gPyB1bGRyeF9mbHVzaF9oYW5kbGVyIDogTlVMTCwKKwkJCQkgICAgICAgMCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGZyZWVvdXQ7CisJCWlmIChtc2lfaWR4ID49IDApCisJCQlyeHFfaW5mby0+bXNpeF90YmxbaSArIG9mZnNldF0gPSBibWFwX2lkeDsKKwkJbWVtc2V0KCZxLT5zdGF0cywgMCwgc2l6ZW9mKHEtPnN0YXRzKSk7CisJCWlmIChpZHMpCisJCQlpZHNbaV0gPSBxLT5yc3BxLmFic19pZDsKKwl9CisJcmV0dXJuIDA7CitmcmVlb3V0OgorCXEgPSByeHFfaW5mby0+dWxkcnhxICsgb2Zmc2V0OworCWZvciAoIDsgaTsgaS0tLCBxKyspIHsKKwkJaWYgKHEtPnJzcHEuZGVzYykKKwkJCWZyZWVfcnNwcV9mbChhZGFwLCAmcS0+cnNwcSwKKwkJCQkgICAgIHEtPmZsLnNpemUgPyAmcS0+ZmwgOiBOVUxMKTsKKwl9CisKKwkvKiBXZSBuZWVkIHRvIGZyZWUgcnhxIGFsc28gaW4gY2FzZSBvZiBjaXEgYWxsb2NhdGlvbiBmYWlsdXJlICovCisJaWYgKG9mZnNldCkgeworCQlxID0gcnhxX2luZm8tPnVsZHJ4cSArIG9mZnNldDsKKwkJZm9yICggOyBpOyBpLS0sIHErKykgeworCQkJaWYgKHEtPnJzcHEuZGVzYykKKwkJCQlmcmVlX3JzcHFfZmwoYWRhcCwgJnEtPnJzcHEsCisJCQkJCSAgICAgcS0+Zmwuc2l6ZSA/ICZxLT5mbCA6IE5VTEwpOworCQl9CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK3NldHVwX3NnZV9xdWV1ZXNfdWxkKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgdWxkX3R5cGUsIGJvb2wgbHJvKQoreworCXN0cnVjdCBzZ2VfdWxkX3J4cV9pbmZvICpyeHFfaW5mbyA9IGFkYXAtPnNnZS51bGRfcnhxX2luZm9bdWxkX3R5cGVdOworCWludCBpLCByZXQgPSAwOworCisJaWYgKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJWCkgeworCQlyeHFfaW5mby0+bXNpeF90YmwgPSBrY2FsbG9jKChyeHFfaW5mby0+bnJ4cSArIHJ4cV9pbmZvLT5uY2lxKSwKKwkJCQkJICAgICBzaXplb2YodW5zaWduZWQgc2hvcnQpLAorCQkJCQkgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIXJ4cV9pbmZvLT5tc2l4X3RibCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9ICEoIWFsbG9jX3VsZF9yeHFzKGFkYXAsIHJ4cV9pbmZvLCByeHFfaW5mby0+bnJ4cSwgMCwgbHJvKSAmJgorCQkgIWFsbG9jX3VsZF9yeHFzKGFkYXAsIHJ4cV9pbmZvLCByeHFfaW5mby0+bmNpcSwKKwkJCQkgcnhxX2luZm8tPm5yeHEsIGxybykpOworCisJLyogVGVsbCB1UCB0byByb3V0ZSBjb250cm9sIHF1ZXVlIGNvbXBsZXRpb25zIHRvIHJkbWEgcnNwcSAqLworCWlmIChhZGFwLT5mbGFncyAmIEZVTExfSU5JVF9ET05FICYmCisJICAgICFyZXQgJiYgdWxkX3R5cGUgPT0gQ1hHQjRfVUxEX1JETUEpIHsKKwkJc3RydWN0IHNnZSAqcyA9ICZhZGFwLT5zZ2U7CisJCXVuc2lnbmVkIGludCBjbXBscWlkOworCQl1MzIgcGFyYW0sIGNtZG9wOworCisJCWNtZG9wID0gRldfUEFSQU1TX1BBUkFNX0RNQVFfRVFfQ01QTElRSURfQ1RSTDsKKwkJZm9yX2VhY2hfcG9ydChhZGFwLCBpKSB7CisJCQljbXBscWlkID0gcnhxX2luZm8tPnVsZHJ4cVtpXS5yc3BxLmNudHh0X2lkOworCQkJcGFyYW0gPSAoRldfUEFSQU1TX01ORU1fVihGV19QQVJBTVNfTU5FTV9ETUFRKSB8CisJCQkJIEZXX1BBUkFNU19QQVJBTV9YX1YoY21kb3ApIHwKKwkJCQkgRldfUEFSQU1TX1BBUkFNX1laX1Yocy0+Y3RybHFbaV0ucS5jbnR4dF9pZCkpOworCQkJcmV0ID0gdDRfc2V0X3BhcmFtcyhhZGFwLCBhZGFwLT5tYm94LCBhZGFwLT5wZiwKKwkJCQkJICAgIDAsIDEsICZwYXJhbSwgJmNtcGxxaWQpOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHQ0X2ZyZWVfdWxkX3J4cXMoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIGludCBuLAorCQkJICAgICBzdHJ1Y3Qgc2dlX29mbGRfcnhxICpxKQoreworCWZvciAoIDsgbjsgbi0tLCBxKyspIHsKKwkJaWYgKHEtPnJzcHEuZGVzYykKKwkJCWZyZWVfcnNwcV9mbChhZGFwLCAmcS0+cnNwcSwKKwkJCQkgICAgIHEtPmZsLnNpemUgPyAmcS0+ZmwgOiBOVUxMKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfc2dlX3F1ZXVlc191bGQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCB1bGRfdHlwZSkKK3sKKwlzdHJ1Y3Qgc2dlX3VsZF9yeHFfaW5mbyAqcnhxX2luZm8gPSBhZGFwLT5zZ2UudWxkX3J4cV9pbmZvW3VsZF90eXBlXTsKKworCWlmIChhZGFwLT5mbGFncyAmIEZVTExfSU5JVF9ET05FICYmIHVsZF90eXBlID09IENYR0I0X1VMRF9SRE1BKSB7CisJCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcC0+c2dlOworCQl1MzIgcGFyYW0sIGNtZG9wLCBjbXBscWlkID0gMDsKKwkJaW50IGk7CisKKwkJY21kb3AgPSBGV19QQVJBTVNfUEFSQU1fRE1BUV9FUV9DTVBMSVFJRF9DVFJMOworCQlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpIHsKKwkJCXBhcmFtID0gKEZXX1BBUkFNU19NTkVNX1YoRldfUEFSQU1TX01ORU1fRE1BUSkgfAorCQkJCSBGV19QQVJBTVNfUEFSQU1fWF9WKGNtZG9wKSB8CisJCQkJIEZXX1BBUkFNU19QQVJBTV9ZWl9WKHMtPmN0cmxxW2ldLnEuY250eHRfaWQpKTsKKwkJCXQ0X3NldF9wYXJhbXMoYWRhcCwgYWRhcC0+bWJveCwgYWRhcC0+cGYsCisJCQkJICAgICAgMCwgMSwgJnBhcmFtLCAmY21wbHFpZCk7CisJCX0KKwl9CisKKwlpZiAocnhxX2luZm8tPm5jaXEpCisJCXQ0X2ZyZWVfdWxkX3J4cXMoYWRhcCwgcnhxX2luZm8tPm5jaXEsCisJCQkJIHJ4cV9pbmZvLT51bGRyeHEgKyByeHFfaW5mby0+bnJ4cSk7CisJdDRfZnJlZV91bGRfcnhxcyhhZGFwLCByeHFfaW5mby0+bnJ4cSwgcnhxX2luZm8tPnVsZHJ4cSk7CisJaWYgKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJWCkKKwkJa2ZyZWUocnhxX2luZm8tPm1zaXhfdGJsKTsKK30KKworc3RhdGljIGludCBjZmdfcXVldWVzX3VsZChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IHVsZF90eXBlLAorCQkJICBjb25zdCBzdHJ1Y3QgY3hnYjRfdWxkX2luZm8gKnVsZF9pbmZvKQoreworCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcC0+c2dlOworCXN0cnVjdCBzZ2VfdWxkX3J4cV9pbmZvICpyeHFfaW5mbzsKKwlpbnQgaSwgbnJ4cSwgY2lxX3NpemU7CisKKwlyeHFfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCpyeHFfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghcnhxX2luZm8pCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJWCAmJiB1bGRfaW5mby0+bnJ4cSA+IHMtPm5xc19wZXJfdWxkKSB7CisJCWkgPSBzLT5ucXNfcGVyX3VsZDsKKwkJcnhxX2luZm8tPm5yeHEgPSByb3VuZHVwKGksIGFkYXAtPnBhcmFtcy5ucG9ydHMpOworCX0gZWxzZSB7CisJCWkgPSBtaW5fdChpbnQsIHVsZF9pbmZvLT5ucnhxLAorCQkJICBudW1fb25saW5lX2NwdXMoKSk7CisJCXJ4cV9pbmZvLT5ucnhxID0gcm91bmR1cChpLCBhZGFwLT5wYXJhbXMubnBvcnRzKTsKKwl9CisJaWYgKCF1bGRfaW5mby0+Y2lxKSB7CisJCXJ4cV9pbmZvLT5uY2lxID0gMDsKKwl9IGVsc2UgIHsKKwkJaWYgKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJWCkKKwkJCXJ4cV9pbmZvLT5uY2lxID0gbWluX3QoaW50LCBzLT5ucXNfcGVyX3VsZCwKKwkJCQkJICAgICAgIG51bV9vbmxpbmVfY3B1cygpKTsKKwkJZWxzZQorCQkJcnhxX2luZm8tPm5jaXEgPSBtaW5fdChpbnQsIE1BWF9PRkxEX1FTRVRTLAorCQkJCQkgICAgICAgbnVtX29ubGluZV9jcHVzKCkpOworCQlyeHFfaW5mby0+bmNpcSA9ICgocnhxX2luZm8tPm5jaXEgLyBhZGFwLT5wYXJhbXMubnBvcnRzKSAqCisJCQkJICBhZGFwLT5wYXJhbXMubnBvcnRzKTsKKwkJcnhxX2luZm8tPm5jaXEgPSBtYXhfdChpbnQsIHJ4cV9pbmZvLT5uY2lxLAorCQkJCSAgICAgICBhZGFwLT5wYXJhbXMubnBvcnRzKTsKKwl9CisKKwlucnhxID0gcnhxX2luZm8tPm5yeHEgKyByeHFfaW5mby0+bmNpcTsgLyogdG90YWwgcnhxJ3MgKi8KKwlyeHFfaW5mby0+dWxkcnhxID0ga2NhbGxvYyhucnhxLCBzaXplb2Yoc3RydWN0IHNnZV9vZmxkX3J4cSksCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFyeHFfaW5mby0+dWxkcnhxKSB7CisJCWtmcmVlKHJ4cV9pbmZvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcnhxX2luZm8tPnJzcHFfaWQgPSBrY2FsbG9jKG5yeHEsIHNpemVvZih1bnNpZ25lZCBzaG9ydCksIEdGUF9LRVJORUwpOworCWlmICghcnhxX2luZm8tPnJzcHFfaWQpIHsKKwkJa2ZyZWUocnhxX2luZm8tPnVsZHJ4cSk7CisJCWtmcmVlKHJ4cV9pbmZvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yIChpID0gMDsgaSA8IHJ4cV9pbmZvLT5ucnhxOyBpKyspIHsKKwkJc3RydWN0IHNnZV9vZmxkX3J4cSAqciA9ICZyeHFfaW5mby0+dWxkcnhxW2ldOworCisJCWluaXRfcnNwcShhZGFwLCAmci0+cnNwcSwgNSwgMSwgdWxkX2luZm8tPnJ4cV9zaXplLCA2NCk7CisJCXItPnJzcHEudWxkID0gdWxkX3R5cGU7CisJCXItPmZsLnNpemUgPSA3MjsKKwl9CisKKwljaXFfc2l6ZSA9IDY0ICsgYWRhcC0+dnJlcy5jcS5zaXplICsgYWRhcC0+dGlkcy5uZnRpZHM7CisJaWYgKGNpcV9zaXplID4gU0dFX01BWF9JUV9TSVpFKSB7CisJCWRldl93YXJuKGFkYXAtPnBkZXZfZGV2LCAiQ0lRIHNpemUgdG9vIHNtYWxsIGZvciBhdmFpbGFibGUgSVFzXG4iKTsKKwkJY2lxX3NpemUgPSBTR0VfTUFYX0lRX1NJWkU7CisJfQorCisJZm9yIChpID0gcnhxX2luZm8tPm5yeHE7IGkgPCBucnhxOyBpKyspIHsKKwkJc3RydWN0IHNnZV9vZmxkX3J4cSAqciA9ICZyeHFfaW5mby0+dWxkcnhxW2ldOworCisJCWluaXRfcnNwcShhZGFwLCAmci0+cnNwcSwgNSwgMSwgY2lxX3NpemUsIDY0KTsKKwkJci0+cnNwcS51bGQgPSB1bGRfdHlwZTsKKwl9CisKKwltZW1jcHkocnhxX2luZm8tPm5hbWUsIHVsZF9pbmZvLT5uYW1lLCBJRk5BTVNJWik7CisJYWRhcC0+c2dlLnVsZF9yeHFfaW5mb1t1bGRfdHlwZV0gPSByeHFfaW5mbzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3F1ZXVlc191bGQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCB1bGRfdHlwZSkKK3sKKwlzdHJ1Y3Qgc2dlX3VsZF9yeHFfaW5mbyAqcnhxX2luZm8gPSBhZGFwLT5zZ2UudWxkX3J4cV9pbmZvW3VsZF90eXBlXTsKKworCWtmcmVlKHJ4cV9pbmZvLT5yc3BxX2lkKTsKKwlrZnJlZShyeHFfaW5mby0+dWxkcnhxKTsKKwlrZnJlZShyeHFfaW5mbyk7Cit9CisKK3N0YXRpYyBpbnQKK3JlcXVlc3RfbXNpeF9xdWV1ZV9pcnFzX3VsZChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IHVsZF90eXBlKQoreworCXN0cnVjdCBzZ2VfdWxkX3J4cV9pbmZvICpyeHFfaW5mbyA9IGFkYXAtPnNnZS51bGRfcnhxX2luZm9bdWxkX3R5cGVdOworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGludCBpZHgsIGJtYXBfaWR4OworCisJZm9yX2VhY2hfdWxkcnhxKHJ4cV9pbmZvLCBpZHgpIHsKKwkJYm1hcF9pZHggPSByeHFfaW5mby0+bXNpeF90YmxbaWR4XTsKKwkJZXJyID0gcmVxdWVzdF9pcnEoYWRhcC0+bXNpeF9pbmZvX3VsZHNbYm1hcF9pZHhdLnZlYywKKwkJCQkgIHQ0X3NnZV9pbnRyX21zaXgsIDAsCisJCQkJICBhZGFwLT5tc2l4X2luZm9fdWxkc1tibWFwX2lkeF0uZGVzYywKKwkJCQkgICZyeHFfaW5mby0+dWxkcnhxW2lkeF0ucnNwcSk7CisJCWlmIChlcnIpCisJCQlnb3RvIHVud2luZDsKKwl9CisJcmV0dXJuIDA7Cit1bndpbmQ6CisJd2hpbGUgKGlkeC0tID4gMCkgeworCQlibWFwX2lkeCA9IHJ4cV9pbmZvLT5tc2l4X3RibFtpZHhdOworCQlmcmVlX21zaXhfaWR4X2luX2JtYXAoYWRhcCwgYm1hcF9pZHgpOworCQlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9fdWxkc1tibWFwX2lkeF0udmVjLAorCQkJICZyeHFfaW5mby0+dWxkcnhxW2lkeF0ucnNwcSk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX21zaXhfcXVldWVfaXJxc191bGQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCB1bGRfdHlwZSkKK3sKKwlzdHJ1Y3Qgc2dlX3VsZF9yeHFfaW5mbyAqcnhxX2luZm8gPSBhZGFwLT5zZ2UudWxkX3J4cV9pbmZvW3VsZF90eXBlXTsKKwl1bnNpZ25lZCBpbnQgaWR4LCBibWFwX2lkeDsKKworCWZvcl9lYWNoX3VsZHJ4cShyeHFfaW5mbywgaWR4KSB7CisJCWJtYXBfaWR4ID0gcnhxX2luZm8tPm1zaXhfdGJsW2lkeF07CisKKwkJZnJlZV9tc2l4X2lkeF9pbl9ibWFwKGFkYXAsIGJtYXBfaWR4KTsKKwkJZnJlZV9pcnEoYWRhcC0+bXNpeF9pbmZvX3VsZHNbYm1hcF9pZHhdLnZlYywKKwkJCSAmcnhxX2luZm8tPnVsZHJ4cVtpZHhdLnJzcHEpOworCX0KK30KKworc3RhdGljIHZvaWQgbmFtZV9tc2l4X3ZlY3NfdWxkKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgdWxkX3R5cGUpCit7CisJc3RydWN0IHNnZV91bGRfcnhxX2luZm8gKnJ4cV9pbmZvID0gYWRhcC0+c2dlLnVsZF9yeHFfaW5mb1t1bGRfdHlwZV07CisJaW50IG4gPSBzaXplb2YoYWRhcC0+bXNpeF9pbmZvX3VsZHNbMF0uZGVzYyk7CisJdW5zaWduZWQgaW50IGlkeCwgYm1hcF9pZHg7CisKKwlmb3JfZWFjaF91bGRyeHEocnhxX2luZm8sIGlkeCkgeworCQlibWFwX2lkeCA9IHJ4cV9pbmZvLT5tc2l4X3RibFtpZHhdOworCisJCXNucHJpbnRmKGFkYXAtPm1zaXhfaW5mb191bGRzW2JtYXBfaWR4XS5kZXNjLCBuLCAiJXMtJXMlZCIsCisJCQkgYWRhcC0+cG9ydFswXS0+bmFtZSwgcnhxX2luZm8tPm5hbWUsIGlkeCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmFibGVfcngoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2VfcnNwcSAqcSkKK3sKKwlpZiAoIXEpCisJCXJldHVybjsKKworCWlmIChxLT5oYW5kbGVyKSB7CisJCWN4Z2JfYnVzeV9wb2xsX2luaXRfbG9jayhxKTsKKwkJbmFwaV9lbmFibGUoJnEtPm5hcGkpOworCX0KKwkvKiAwLWluY3JlbWVudCBHVFMgdG8gc3RhcnQgdGhlIHRpbWVyIGFuZCBlbmFibGUgaW50ZXJydXB0cyAqLworCXQ0X3dyaXRlX3JlZyhhZGFwLCBNWVBGX1JFRyhTR0VfUEZfR1RTX0EpLAorCQkgICAgIFNFSU5UQVJNX1YocS0+aW50cl9wYXJhbXMpIHwKKwkJICAgICBJTkdSRVNTUUlEX1YocS0+Y250eHRfaWQpKTsKK30KKworc3RhdGljIHZvaWQgcXVpZXNjZV9yeChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV9yc3BxICpxKQoreworCWlmIChxICYmIHEtPmhhbmRsZXIpIHsKKwkJbmFwaV9kaXNhYmxlKCZxLT5uYXBpKTsKKwkJbG9jYWxfYmhfZGlzYWJsZSgpOworCQl3aGlsZSAoIWN4Z2JfcG9sbF9sb2NrX25hcGkocSkpCisJCQltZGVsYXkoMSk7CisJCWxvY2FsX2JoX2VuYWJsZSgpOworCX0KK30KKworc3RhdGljIHZvaWQgZW5hYmxlX3J4X3VsZChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IHVsZF90eXBlKQoreworCXN0cnVjdCBzZ2VfdWxkX3J4cV9pbmZvICpyeHFfaW5mbyA9IGFkYXAtPnNnZS51bGRfcnhxX2luZm9bdWxkX3R5cGVdOworCWludCBpZHg7CisKKwlmb3JfZWFjaF91bGRyeHEocnhxX2luZm8sIGlkeCkKKwkJZW5hYmxlX3J4KGFkYXAsICZyeHFfaW5mby0+dWxkcnhxW2lkeF0ucnNwcSk7Cit9CisKK3N0YXRpYyB2b2lkIHF1aWVzY2VfcnhfdWxkKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgdWxkX3R5cGUpCit7CisJc3RydWN0IHNnZV91bGRfcnhxX2luZm8gKnJ4cV9pbmZvID0gYWRhcC0+c2dlLnVsZF9yeHFfaW5mb1t1bGRfdHlwZV07CisJaW50IGlkeDsKKworCWZvcl9lYWNoX3VsZHJ4cShyeHFfaW5mbywgaWR4KQorCQlxdWllc2NlX3J4KGFkYXAsICZyeHFfaW5mby0+dWxkcnhxW2lkeF0ucnNwcSk7Cit9CisKK3N0YXRpYyB2b2lkIHVsZF9xdWV1ZV9pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgdWxkX3R5cGUsCisJCQkgICBzdHJ1Y3QgY3hnYjRfbGxkX2luZm8gKmxsaSkKK3sKKwlzdHJ1Y3Qgc2dlX3VsZF9yeHFfaW5mbyAqcnhxX2luZm8gPSBhZGFwLT5zZ2UudWxkX3J4cV9pbmZvW3VsZF90eXBlXTsKKworCWxsaS0+cnhxX2lkcyA9IHJ4cV9pbmZvLT5yc3BxX2lkOworCWxsaS0+bnJ4cSA9IHJ4cV9pbmZvLT5ucnhxOworCWxsaS0+Y2lxX2lkcyA9IHJ4cV9pbmZvLT5yc3BxX2lkICsgcnhxX2luZm8tPm5yeHE7CisJbGxpLT5uY2lxID0gcnhxX2luZm8tPm5jaXE7Cit9CisKK2ludCB0NF91bGRfbWVtX2FsbG9jKHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcC0+c2dlOworCisJYWRhcC0+dWxkID0ga2NhbGxvYyhDWEdCNF9VTERfTUFYLCBzaXplb2YoKmFkYXAtPnVsZCksIEdGUF9LRVJORUwpOworCWlmICghYWRhcC0+dWxkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXMtPnVsZF9yeHFfaW5mbyA9IGt6YWxsb2MoQ1hHQjRfVUxEX01BWCAqCisJCQkJICBzaXplb2Yoc3RydWN0IHNnZV91bGRfcnhxX2luZm8gKiksCisJCQkJICBHRlBfS0VSTkVMKTsKKwlpZiAoIXMtPnVsZF9yeHFfaW5mbykKKwkJZ290byBlcnJfdWxkOworCisJcmV0dXJuIDA7CitlcnJfdWxkOgorCWtmcmVlKGFkYXAtPnVsZCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3ZvaWQgdDRfdWxkX21lbV9mcmVlKHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcC0+c2dlOworCisJa2ZyZWUocy0+dWxkX3J4cV9pbmZvKTsKKwlrZnJlZShhZGFwLT51bGQpOworfQorCit2b2lkIHQ0X3VsZF9jbGVhbl91cChzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3Qgc2dlX3VsZF9yeHFfaW5mbyAqcnhxX2luZm87CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoIWFkYXAtPnVsZCkKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCBDWEdCNF9VTERfTUFYOyBpKyspIHsKKwkJaWYgKCFhZGFwLT51bGRbaV0uaGFuZGxlKQorCQkJY29udGludWU7CisJCXJ4cV9pbmZvID0gYWRhcC0+c2dlLnVsZF9yeHFfaW5mb1tpXTsKKwkJaWYgKGFkYXAtPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpCisJCQlxdWllc2NlX3J4X3VsZChhZGFwLCBpKTsKKwkJaWYgKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJWCkKKwkJCWZyZWVfbXNpeF9xdWV1ZV9pcnFzX3VsZChhZGFwLCBpKTsKKwkJZnJlZV9zZ2VfcXVldWVzX3VsZChhZGFwLCBpKTsKKwkJZnJlZV9xdWV1ZXNfdWxkKGFkYXAsIGkpOworCX0KK30KKworc3RhdGljIHZvaWQgdWxkX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBjeGdiNF9sbGRfaW5mbyAqbGxkKQoreworCWludCBpOworCisJbGxkLT5wZGV2ID0gYWRhcC0+cGRldjsKKwlsbGQtPnBmID0gYWRhcC0+cGY7CisJbGxkLT5sMnQgPSBhZGFwLT5sMnQ7CisJbGxkLT50aWRzID0gJmFkYXAtPnRpZHM7CisJbGxkLT5wb3J0cyA9IGFkYXAtPnBvcnQ7CisJbGxkLT52ciA9ICZhZGFwLT52cmVzOworCWxsZC0+bXR1cyA9IGFkYXAtPnBhcmFtcy5tdHVzOworCWxsZC0+bnR4cSA9IGFkYXAtPnNnZS5vZmxkcXNldHM7CisJbGxkLT5uY2hhbiA9IGFkYXAtPnBhcmFtcy5ucG9ydHM7CisJbGxkLT5ucG9ydHMgPSBhZGFwLT5wYXJhbXMubnBvcnRzOworCWxsZC0+d3JfY3JlZCA9IGFkYXAtPnBhcmFtcy5vZmxkcV93cl9jcmVkOworCWxsZC0+aXNjc2lfaW9sZW4gPSBNQVhSWERBVEFfRyh0NF9yZWFkX3JlZyhhZGFwLCBUUF9QQVJBX1JFRzJfQSkpOworCWxsZC0+aXNjc2lfdGFnbWFzayA9IHQ0X3JlYWRfcmVnKGFkYXAsIFVMUF9SWF9JU0NTSV9UQUdNQVNLX0EpOworCWxsZC0+aXNjc2lfcGdzel9vcmRlciA9IHQ0X3JlYWRfcmVnKGFkYXAsIFVMUF9SWF9JU0NTSV9QU1pfQSk7CisJbGxkLT5pc2NzaV9sbGltaXQgPSB0NF9yZWFkX3JlZyhhZGFwLCBVTFBfUlhfSVNDU0lfTExJTUlUX0EpOworCWxsZC0+aXNjc2lfcHBtID0gJmFkYXAtPmlzY3NpX3BwbTsKKwlsbGQtPmFkYXB0ZXJfdHlwZSA9IGFkYXAtPnBhcmFtcy5jaGlwOworCWxsZC0+Y2Nsa19wcyA9IDEwMDAwMDAwMDAgLyBhZGFwLT5wYXJhbXMudnBkLmNjbGs7CisJbGxkLT51ZGJfZGVuc2l0eSA9IDEgPDwgYWRhcC0+cGFyYW1zLnNnZS5lcV9xcHA7CisJbGxkLT51Y3FfZGVuc2l0eSA9IDEgPDwgYWRhcC0+cGFyYW1zLnNnZS5pcV9xcHA7CisJbGxkLT5maWx0X21vZGUgPSBhZGFwLT5wYXJhbXMudHAudmxhbl9wcmlfbWFwOworCS8qIE1PRFFfUkVRX01BUCBzZXRzIHF1ZXVlcyAwLTMgdG8gY2hhbiAwLTMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTkNIQU47IGkrKykKKwkJbGxkLT50eF9tb2RxW2ldID0gaTsKKwlsbGQtPmd0c19yZWcgPSBhZGFwLT5yZWdzICsgTVlQRl9SRUcoU0dFX1BGX0dUU19BKTsKKwlsbGQtPmRiX3JlZyA9IGFkYXAtPnJlZ3MgKyBNWVBGX1JFRyhTR0VfUEZfS0RPT1JCRUxMX0EpOworCWxsZC0+ZndfdmVycyA9IGFkYXAtPnBhcmFtcy5md192ZXJzOworCWxsZC0+ZGJmaWZvX2ludF90aHJlc2ggPSBkYmZpZm9faW50X3RocmVzaDsKKwlsbGQtPnNnZV9pbmdwYWRib3VuZGFyeSA9IGFkYXAtPnNnZS5mbF9hbGlnbjsKKwlsbGQtPnNnZV9lZ3JzdGF0dXNwYWdlc2l6ZSA9IGFkYXAtPnNnZS5zdGF0X2xlbjsKKwlsbGQtPnNnZV9wa3RzaGlmdCA9IGFkYXAtPnNnZS5wa3RzaGlmdDsKKwlsbGQtPmVuYWJsZV9md19vZmxkX2Nvbm4gPSBhZGFwLT5mbGFncyAmIEZXX09GTERfQ09OTjsKKwlsbGQtPm1heF9vcmRpcmRfcXAgPSBhZGFwLT5wYXJhbXMubWF4X29yZGlyZF9xcDsKKwlsbGQtPm1heF9pcmRfYWRhcHRlciA9IGFkYXAtPnBhcmFtcy5tYXhfaXJkX2FkYXB0ZXI7CisJbGxkLT51bHB0eF9tZW13cml0ZV9kc2dsID0gYWRhcC0+cGFyYW1zLnVscHR4X21lbXdyaXRlX2RzZ2w7CisJbGxkLT5ub2RlaWQgPSBkZXZfdG9fbm9kZShhZGFwLT5wZGV2X2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIHVsZF9hdHRhY2goc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCB1bGQpCit7CisJdm9pZCAqaGFuZGxlOworCXN0cnVjdCBjeGdiNF9sbGRfaW5mbyBsbGk7CisKKwl1bGRfaW5pdChhZGFwLCAmbGxpKTsKKwl1bGRfcXVldWVfaW5pdChhZGFwLCB1bGQsICZsbGkpOworCisJaGFuZGxlID0gYWRhcC0+dWxkW3VsZF0uYWRkKCZsbGkpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlkZXZfd2FybihhZGFwLT5wZGV2X2RldiwKKwkJCSAiY291bGQgbm90IGF0dGFjaCB0byB0aGUgJXMgZHJpdmVyLCBlcnJvciAlbGRcbiIsCisJCQkgYWRhcC0+dWxkW3VsZF0ubmFtZSwgUFRSX0VSUihoYW5kbGUpKTsKKwkJcmV0dXJuOworCX0KKworCWFkYXAtPnVsZFt1bGRdLmhhbmRsZSA9IGhhbmRsZTsKKwl0NF9yZWdpc3Rlcl9uZXRldmVudF9ub3RpZmllcigpOworCisJaWYgKGFkYXAtPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpCisJCWFkYXAtPnVsZFt1bGRdLnN0YXRlX2NoYW5nZShoYW5kbGUsIENYR0I0X1NUQVRFX1VQKTsKK30KKworLyoqCisgKgljeGdiNF9yZWdpc3Rlcl91bGQgLSByZWdpc3RlciBhbiB1cHBlci1sYXllciBkcml2ZXIKKyAqCUB0eXBlOiB0aGUgVUxEIHR5cGUKKyAqCUBwOiB0aGUgVUxEIG1ldGhvZHMKKyAqCisgKglSZWdpc3RlcnMgYW4gdXBwZXItbGF5ZXIgZHJpdmVyIHdpdGggdGhpcyBkcml2ZXIgYW5kIG5vdGlmaWVzIHRoZSBVTEQKKyAqCWFib3V0IGFueSBwcmVzZW50bHkgYXZhaWxhYmxlIGRldmljZXMgdGhhdCBzdXBwb3J0IGl0cyB0eXBlLiAgUmV0dXJucworICoJJS1FQlVTWSBpZiBhIFVMRCBvZiB0aGUgc2FtZSB0eXBlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KKyAqLworaW50IGN4Z2I0X3JlZ2lzdGVyX3VsZChlbnVtIGN4Z2I0X3VsZCB0eXBlLAorCQkgICAgICAgY29uc3Qgc3RydWN0IGN4Z2I0X3VsZF9pbmZvICpwKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGludCBhZGFwX2lkeCA9IDA7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXA7CisKKwlpZiAodHlwZSA+PSBDWEdCNF9VTERfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnVsZF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShhZGFwLCAmYWRhcHRlcl9saXN0LCBsaXN0X25vZGUpIHsKKwkJaWYgKCh0eXBlID09IENYR0I0X1VMRF9DUllQVE8gJiYgIWlzX3BjaV91bGQoYWRhcCkpIHx8CisJCSAgICAodHlwZSAhPSBDWEdCNF9VTERfQ1JZUFRPICYmICFpc19vZmZsb2FkKGFkYXApKSkKKwkJCWNvbnRpbnVlOworCQlpZiAodHlwZSA9PSBDWEdCNF9VTERfSVNDU0lUICYmIGlzX3Q0KGFkYXAtPnBhcmFtcy5jaGlwKSkKKwkJCWNvbnRpbnVlOworCQlyZXQgPSBjZmdfcXVldWVzX3VsZChhZGFwLCB0eXBlLCBwKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCQlyZXQgPSBzZXR1cF9zZ2VfcXVldWVzX3VsZChhZGFwLCB0eXBlLCBwLT5scm8pOworCQlpZiAocmV0KQorCQkJZ290byBmcmVlX3F1ZXVlczsKKwkJaWYgKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJWCkgeworCQkJbmFtZV9tc2l4X3ZlY3NfdWxkKGFkYXAsIHR5cGUpOworCQkJcmV0ID0gcmVxdWVzdF9tc2l4X3F1ZXVlX2lycXNfdWxkKGFkYXAsIHR5cGUpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGZyZWVfcnhxOworCQl9CisJCWlmIChhZGFwLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKQorCQkJZW5hYmxlX3J4X3VsZChhZGFwLCB0eXBlKTsKKwkJaWYgKGFkYXAtPnVsZFt0eXBlXS5hZGQpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gZnJlZV9pcnE7CisJCX0KKwkJYWRhcC0+dWxkW3R5cGVdID0gKnA7CisJCXVsZF9hdHRhY2goYWRhcCwgdHlwZSk7CisJCWFkYXBfaWR4Kys7CisJfQorCW11dGV4X3VubG9jaygmdWxkX211dGV4KTsKKwlyZXR1cm4gMDsKKworZnJlZV9pcnE6CisJaWYgKGFkYXAtPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpCisJCXF1aWVzY2VfcnhfdWxkKGFkYXAsIHR5cGUpOworCWlmIChhZGFwLT5mbGFncyAmIFVTSU5HX01TSVgpCisJCWZyZWVfbXNpeF9xdWV1ZV9pcnFzX3VsZChhZGFwLCB0eXBlKTsKK2ZyZWVfcnhxOgorCWZyZWVfc2dlX3F1ZXVlc191bGQoYWRhcCwgdHlwZSk7CitmcmVlX3F1ZXVlczoKKwlmcmVlX3F1ZXVlc191bGQoYWRhcCwgdHlwZSk7CitvdXQ6CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFkYXAsICZhZGFwdGVyX2xpc3QsIGxpc3Rfbm9kZSkgeworCQlpZiAoKHR5cGUgPT0gQ1hHQjRfVUxEX0NSWVBUTyAmJiAhaXNfcGNpX3VsZChhZGFwKSkgfHwKKwkJICAgICh0eXBlICE9IENYR0I0X1VMRF9DUllQVE8gJiYgIWlzX29mZmxvYWQoYWRhcCkpKQorCQkJY29udGludWU7CisJCWlmICh0eXBlID09IENYR0I0X1VMRF9JU0NTSVQgJiYgaXNfdDQoYWRhcC0+cGFyYW1zLmNoaXApKQorCQkJY29udGludWU7CisJCWlmICghYWRhcF9pZHgpCisJCQlicmVhazsKKwkJYWRhcC0+dWxkW3R5cGVdLmhhbmRsZSA9IE5VTEw7CisJCWFkYXAtPnVsZFt0eXBlXS5hZGQgPSBOVUxMOworCQlpZiAoYWRhcC0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkKKwkJCXF1aWVzY2VfcnhfdWxkKGFkYXAsIHR5cGUpOworCQlpZiAoYWRhcC0+ZmxhZ3MgJiBVU0lOR19NU0lYKQorCQkJZnJlZV9tc2l4X3F1ZXVlX2lycXNfdWxkKGFkYXAsIHR5cGUpOworCQlmcmVlX3NnZV9xdWV1ZXNfdWxkKGFkYXAsIHR5cGUpOworCQlmcmVlX3F1ZXVlc191bGQoYWRhcCwgdHlwZSk7CisJCWFkYXBfaWR4LS07CisJfQorCW11dGV4X3VubG9jaygmdWxkX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChjeGdiNF9yZWdpc3Rlcl91bGQpOworCisvKioKKyAqCWN4Z2I0X3VucmVnaXN0ZXJfdWxkIC0gdW5yZWdpc3RlciBhbiB1cHBlci1sYXllciBkcml2ZXIKKyAqCUB0eXBlOiB0aGUgVUxEIHR5cGUKKyAqCisgKglVbnJlZ2lzdGVycyBhbiBleGlzdGluZyB1cHBlci1sYXllciBkcml2ZXIuCisgKi8KK2ludCBjeGdiNF91bnJlZ2lzdGVyX3VsZChlbnVtIGN4Z2I0X3VsZCB0eXBlKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwOworCisJaWYgKHR5cGUgPj0gQ1hHQjRfVUxEX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZ1bGRfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYWRhcCwgJmFkYXB0ZXJfbGlzdCwgbGlzdF9ub2RlKSB7CisJCWlmICgodHlwZSA9PSBDWEdCNF9VTERfQ1JZUFRPICYmICFpc19wY2lfdWxkKGFkYXApKSB8fAorCQkgICAgKHR5cGUgIT0gQ1hHQjRfVUxEX0NSWVBUTyAmJiAhaXNfb2ZmbG9hZChhZGFwKSkpCisJCQljb250aW51ZTsKKwkJaWYgKHR5cGUgPT0gQ1hHQjRfVUxEX0lTQ1NJVCAmJiBpc190NChhZGFwLT5wYXJhbXMuY2hpcCkpCisJCQljb250aW51ZTsKKwkJYWRhcC0+dWxkW3R5cGVdLmhhbmRsZSA9IE5VTEw7CisJCWFkYXAtPnVsZFt0eXBlXS5hZGQgPSBOVUxMOworCQlpZiAoYWRhcC0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkKKwkJCXF1aWVzY2VfcnhfdWxkKGFkYXAsIHR5cGUpOworCQlpZiAoYWRhcC0+ZmxhZ3MgJiBVU0lOR19NU0lYKQorCQkJZnJlZV9tc2l4X3F1ZXVlX2lycXNfdWxkKGFkYXAsIHR5cGUpOworCQlmcmVlX3NnZV9xdWV1ZXNfdWxkKGFkYXAsIHR5cGUpOworCQlmcmVlX3F1ZXVlc191bGQoYWRhcCwgdHlwZSk7CisJfQorCW11dGV4X3VubG9jaygmdWxkX211dGV4KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChjeGdiNF91bnJlZ2lzdGVyX3VsZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X3VsZC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF91bGQuaAppbmRleCBmM2M1OGFhLi40N2JkMTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X3VsZC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdWxkLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDQgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTMyLDggKzMyLDggQEAKICAqIFNPRlRXQVJFLgogICovCiAKLSNpZm5kZWYgX19DWEdCNF9PRkxEX0gKLSNkZWZpbmUgX19DWEdCNF9PRkxEX0gKKyNpZm5kZWYgX19DWEdCNF9VTERfSAorI2RlZmluZSBfX0NYR0I0X1VMRF9ICiAKICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CkBAIC00Miw2ICs0Miw4IEBACiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSAiY3hnYjQuaCIKIAorI2RlZmluZSBNQVhfVUxEX1FTRVRTIDE2CisKIC8qIENQTCBtZXNzYWdlIHByaW9yaXR5IGxldmVscyAqLwogZW51bSB7CiAJQ1BMX1BSSU9SSVRZX0RBVEEgICAgID0gMCwgIC8qIGRhdGEgbWVzc2FnZXMgKi8KQEAgLTEwNCw2ICsxMDYsNyBAQAogCXVuc2lnbmVkIGludCBhdGlkX2Jhc2U7CiAKIAlzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmdGlkX3RhYjsKKwl1bnNpZ25lZCBsb25nICpmdGlkX2JtYXA7CiAJdW5zaWduZWQgaW50IG5mdGlkczsKIAl1bnNpZ25lZCBpbnQgZnRpZF9iYXNlOwogCXVuc2lnbmVkIGludCBhZnRpZF9iYXNlOwpAQCAtMTI0LDYgKzEyNyw4IEBACiAJYXRvbWljX3QgdGlkc19pbl91c2U7CiAJLyogVElEcyBpbiB0aGUgSEFTSCAqLwogCWF0b21pY190IGhhc2hfdGlkc19pbl91c2U7CisJLyogbG9jayBmb3Igc2V0dGluZy9jbGVhcmluZyBmaWx0ZXIgYml0bWFwICovCisJc3BpbmxvY2tfdCBmdGlkX2xvY2s7CiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgKmxvb2t1cF90aWQoY29uc3Qgc3RydWN0IHRpZF9pbmZvICp0LCB1bnNpZ25lZCBpbnQgdGlkKQpAQCAtMTgzLDE1ICsxODgsMzggQEAKIGludCBjeGdiNF9yZW1vdmVfc2VydmVyX2ZpbHRlcihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc3RpZCwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgcXVldWUsIGJvb2wgaXB2Nik7CiAKKy8qIEZpbHRlciBvcGVyYXRpb24gY29udGV4dCB0byBhbGxvdyBjYWxsZXJzIG9mIGN4Z2I0X3NldF9maWx0ZXIoKSBhbmQKKyAqIGN4Z2I0X2RlbF9maWx0ZXIoKSB0byB3YWl0IGZvciBhbiBhc3luY2hyb25vdXMgY29tcGxldGlvbi4KKyAqLworc3RydWN0IGZpbHRlcl9jdHggeworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247CS8qIGNvbXBsZXRpb24gcmVuZGV6dm91cyAqLworCXZvaWQgKmNsb3N1cmU7CQkJLyogY2FsbGVyJ3Mgb3BhcXVlIGluZm9ybWF0aW9uICovCisJaW50IHJlc3VsdDsJCQkvKiByZXN1bHQgb2Ygb3BlcmF0aW9uICovCisJdTMyIHRpZDsJCQkvKiB0byBzdG9yZSB0aWQgKi8KK307CisKK3N0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbjsKKworaW50IF9fY3hnYjRfc2V0X2ZpbHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZmlsdGVyX2lkLAorCQkgICAgICAgc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmcywKKwkJICAgICAgIHN0cnVjdCBmaWx0ZXJfY3R4ICpjdHgpOworaW50IF9fY3hnYjRfZGVsX2ZpbHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZmlsdGVyX2lkLAorCQkgICAgICAgc3RydWN0IGZpbHRlcl9jdHggKmN0eCk7CitpbnQgY3hnYjRfc2V0X2ZpbHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZmlsdGVyX2lkLAorCQkgICAgIHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZnMpOworaW50IGN4Z2I0X2RlbF9maWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZpbHRlcl9pZCk7CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfd3JfdHhxKHN0cnVjdCBza19idWZmICpza2IsIGludCBwcmlvLCBpbnQgcXVldWUpCiB7CiAJc2tiX3NldF9xdWV1ZV9tYXBwaW5nKHNrYiwgKHF1ZXVlIDw8IDEpIHwgcHJpbyk7CiB9CiAKIGVudW0gY3hnYjRfdWxkIHsKKwlDWEdCNF9VTERfSU5JVCwKIAlDWEdCNF9VTERfUkRNQSwKIAlDWEdCNF9VTERfSVNDU0ksCiAJQ1hHQjRfVUxEX0lTQ1NJVCwKKwlDWEdCNF9VTERfQ1JZUFRPLAogCUNYR0I0X1VMRF9NQVgKIH07CiAKQEAgLTI4NCw2ICszMTIsMTEgQEAKIAogc3RydWN0IGN4Z2I0X3VsZF9pbmZvIHsKIAljb25zdCBjaGFyICpuYW1lOworCXZvaWQgKmhhbmRsZTsKKwl1bnNpZ25lZCBpbnQgbnJ4cTsKKwl1bnNpZ25lZCBpbnQgcnhxX3NpemU7CisJYm9vbCBjaXE7CisJYm9vbCBscm87CiAJdm9pZCAqKCphZGQpKGNvbnN0IHN0cnVjdCBjeGdiNF9sbGRfaW5mbyAqcCk7CiAJaW50ICgqcnhfaGFuZGxlcikodm9pZCAqaGFuZGxlLCBjb25zdCBfX2JlNjQgKnJzcCwKIAkJCSAgY29uc3Qgc3RydWN0IHBrdF9nbCAqZ2wpOwpAQCAtMzMwLDQgKzM2Myw0IEBACiAJCQkgdTY0ICpwYmFyMl9xb2Zmc2V0LAogCQkJIHVuc2lnbmVkIGludCAqcGJhcjJfcWlkKTsKIAotI2VuZGlmICAvKiAhX19DWEdCNF9PRkxEX0ggKi8KKyNlbmRpZiAgLyogIV9fQ1hHQjRfVUxEX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2NoZWQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2NoZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzlkZTc2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9zY2hlZC5jCkBAIC0wLDAgKzEsNTU2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDQgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjaW5jbHVkZSAiY3hnYjQuaCIKKyNpbmNsdWRlICJzY2hlZC5oIgorCisvKiBTcGlubG9jayBtdXN0IGJlIGhlbGQgYnkgY2FsbGVyICovCitzdGF0aWMgaW50IHQ0X3NjaGVkX2NsYXNzX2Z3X2NtZChzdHJ1Y3QgcG9ydF9pbmZvICpwaSwKKwkJCQkgc3RydWN0IGNoX3NjaGVkX3BhcmFtcyAqcCwKKwkJCQkgZW51bSBzY2hlZF9md19vcHMgb3ApCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBwaS0+YWRhcHRlcjsKKwlzdHJ1Y3Qgc2NoZWRfdGFibGUgKnMgPSBwaS0+c2NoZWRfdGJsOworCXN0cnVjdCBzY2hlZF9jbGFzcyAqZTsKKwlpbnQgZXJyID0gMDsKKworCWUgPSAmcy0+dGFiW3AtPnUucGFyYW1zLmNsYXNzXTsKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBTQ0hFRF9GV19PUF9BREQ6CisJCWVyciA9IHQ0X3NjaGVkX3BhcmFtcyhhZGFwLCBwLT50eXBlLAorCQkJCSAgICAgIHAtPnUucGFyYW1zLmxldmVsLCBwLT51LnBhcmFtcy5tb2RlLAorCQkJCSAgICAgIHAtPnUucGFyYW1zLnJhdGV1bml0LAorCQkJCSAgICAgIHAtPnUucGFyYW1zLnJhdGVtb2RlLAorCQkJCSAgICAgIHAtPnUucGFyYW1zLmNoYW5uZWwsIGUtPmlkeCwKKwkJCQkgICAgICBwLT51LnBhcmFtcy5taW5yYXRlLCBwLT51LnBhcmFtcy5tYXhyYXRlLAorCQkJCSAgICAgIHAtPnUucGFyYW1zLndlaWdodCwgcC0+dS5wYXJhbXMucGt0c2l6ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyogU3BpbmxvY2sgbXVzdCBiZSBoZWxkIGJ5IGNhbGxlciAqLworc3RhdGljIGludCB0NF9zY2hlZF9iaW5kX3VuYmluZF9vcChzdHJ1Y3QgcG9ydF9pbmZvICpwaSwgdm9pZCAqYXJnLAorCQkJCSAgIGVudW0gc2NoZWRfYmluZF90eXBlIHR5cGUsIGJvb2wgYmluZCkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHBpLT5hZGFwdGVyOworCXUzMiBmd19tbmVtLCBmd19jbGFzcywgZndfcGFyYW07CisJdW5zaWduZWQgaW50IHBmID0gYWRhcC0+cGY7CisJdW5zaWduZWQgaW50IHZmID0gMDsKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU0NIRURfUVVFVUU6IHsKKwkJc3RydWN0IHNjaGVkX3F1ZXVlX2VudHJ5ICpxZTsKKworCQlxZSA9IChzdHJ1Y3Qgc2NoZWRfcXVldWVfZW50cnkgKilhcmc7CisKKwkJLyogQ3JlYXRlIGEgdGVtcGxhdGUgZm9yIHRoZSBGV19QQVJBTVNfQ01EIG1uZW1vbmljIGFuZAorCQkgKiB2YWx1ZSAoVFggU2NoZWR1bGluZyBDbGFzcyBpbiB0aGlzIGNhc2UpLgorCQkgKi8KKwkJZndfbW5lbSA9IChGV19QQVJBTVNfTU5FTV9WKEZXX1BBUkFNU19NTkVNX0RNQVEpIHwKKwkJCSAgIEZXX1BBUkFNU19QQVJBTV9YX1YoCisJCQkJICAgRldfUEFSQU1TX1BBUkFNX0RNQVFfRVFfU0NIRURDTEFTU19FVEgpKTsKKwkJZndfY2xhc3MgPSBiaW5kID8gcWUtPnBhcmFtLmNsYXNzIDogRldfU0NIRURfQ0xTX05PTkU7CisJCWZ3X3BhcmFtID0gKGZ3X21uZW0gfCBGV19QQVJBTVNfUEFSQU1fWVpfVihxZS0+Y250eHRfaWQpKTsKKworCQlwZiA9IGFkYXAtPnBmOworCQl2ZiA9IDA7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IHQ0X3NldF9wYXJhbXMoYWRhcCwgYWRhcC0+bWJveCwgcGYsIHZmLCAxLCAmZndfcGFyYW0sICZmd19jbGFzcyk7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IHNjaGVkX2NsYXNzICp0NF9zY2hlZF9xdWV1ZV9sb29rdXAoc3RydWN0IHBvcnRfaW5mbyAqcGksCisJCQkJCQkgY29uc3QgdW5zaWduZWQgaW50IHFpZCwKKwkJCQkJCSBpbnQgKmluZGV4KQoreworCXN0cnVjdCBzY2hlZF90YWJsZSAqcyA9IHBpLT5zY2hlZF90Ymw7CisJc3RydWN0IHNjaGVkX2NsYXNzICplLCAqZW5kOworCXN0cnVjdCBzY2hlZF9jbGFzcyAqZm91bmQgPSBOVUxMOworCWludCBpOworCisJLyogTG9vayBmb3IgYSBjbGFzcyB3aXRoIG1hdGNoaW5nIGJvdW5kIHF1ZXVlIHBhcmFtZXRlcnMgKi8KKwllbmQgPSAmcy0+dGFiW3MtPnNjaGVkX3NpemVdOworCWZvciAoZSA9ICZzLT50YWJbMF07IGUgIT0gZW5kOyArK2UpIHsKKwkJc3RydWN0IHNjaGVkX3F1ZXVlX2VudHJ5ICpxZTsKKworCQlpID0gMDsKKwkJaWYgKGUtPnN0YXRlID09IFNDSEVEX1NUQVRFX1VOVVNFRCkKKwkJCWNvbnRpbnVlOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocWUsICZlLT5xdWV1ZV9saXN0LCBsaXN0KSB7CisJCQlpZiAocWUtPmNudHh0X2lkID09IHFpZCkgeworCQkJCWZvdW5kID0gZTsKKwkJCQlpZiAoaW5kZXgpCisJCQkJCSppbmRleCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpKys7CisJCX0KKworCQlpZiAoZm91bmQpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyBpbnQgdDRfc2NoZWRfcXVldWVfdW5iaW5kKHN0cnVjdCBwb3J0X2luZm8gKnBpLCBzdHJ1Y3QgY2hfc2NoZWRfcXVldWUgKnApCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBwaS0+YWRhcHRlcjsKKwlzdHJ1Y3Qgc2NoZWRfY2xhc3MgKmU7CisJc3RydWN0IHNjaGVkX3F1ZXVlX2VudHJ5ICpxZSA9IE5VTEw7CisJc3RydWN0IHNnZV9ldGhfdHhxICp0eHE7CisJdW5zaWduZWQgaW50IHFpZDsKKwlpbnQgaW5kZXggPSAtMTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChwLT5xdWV1ZSA8IDAgfHwgcC0+cXVldWUgPj0gcGktPm5xc2V0cykKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwl0eHEgPSAmYWRhcC0+c2dlLmV0aHR4cVtwaS0+Zmlyc3RfcXNldCArIHAtPnF1ZXVlXTsKKwlxaWQgPSB0eHEtPnEuY250eHRfaWQ7CisKKwkvKiBGaW5kIHRoZSBleGlzdGluZyBjbGFzcyB0aGF0IHRoZSBxdWV1ZSBpcyBib3VuZCB0byAqLworCWUgPSB0NF9zY2hlZF9xdWV1ZV9sb29rdXAocGksIHFpZCwgJmluZGV4KTsKKwlpZiAoZSAmJiBpbmRleCA+PSAwKSB7CisJCWludCBpID0gMDsKKworCQlzcGluX2xvY2soJmUtPmxvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHFlLCAmZS0+cXVldWVfbGlzdCwgbGlzdCkgeworCQkJaWYgKGkgPT0gaW5kZXgpCisJCQkJYnJlYWs7CisJCQlpKys7CisJCX0KKwkJZXJyID0gdDRfc2NoZWRfYmluZF91bmJpbmRfb3AocGksICh2b2lkICopcWUsIFNDSEVEX1FVRVVFLAorCQkJCQkgICAgICBmYWxzZSk7CisJCWlmIChlcnIpIHsKKwkJCXNwaW5fdW5sb2NrKCZlLT5sb2NrKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbGlzdF9kZWwoJnFlLT5saXN0KTsKKwkJdDRfZnJlZV9tZW0ocWUpOworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZS0+cmVmY250KSkgeworCQkJZS0+c3RhdGUgPSBTQ0hFRF9TVEFURV9VTlVTRUQ7CisJCQltZW1zZXQoJmUtPmluZm8sIDAsIHNpemVvZihlLT5pbmZvKSk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmUtPmxvY2spOworCX0KK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHQ0X3NjaGVkX3F1ZXVlX2JpbmQoc3RydWN0IHBvcnRfaW5mbyAqcGksIHN0cnVjdCBjaF9zY2hlZF9xdWV1ZSAqcCkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHBpLT5hZGFwdGVyOworCXN0cnVjdCBzY2hlZF90YWJsZSAqcyA9IHBpLT5zY2hlZF90Ymw7CisJc3RydWN0IHNjaGVkX2NsYXNzICplOworCXN0cnVjdCBzY2hlZF9xdWV1ZV9lbnRyeSAqcWUgPSBOVUxMOworCXN0cnVjdCBzZ2VfZXRoX3R4cSAqdHhxOworCXVuc2lnbmVkIGludCBxaWQ7CisJaW50IGVyciA9IDA7CisKKwlpZiAocC0+cXVldWUgPCAwIHx8IHAtPnF1ZXVlID49IHBpLT5ucXNldHMpCisJCXJldHVybiAtRVJBTkdFOworCisJcWUgPSB0NF9hbGxvY19tZW0oc2l6ZW9mKHN0cnVjdCBzY2hlZF9xdWV1ZV9lbnRyeSkpOworCWlmICghcWUpCisJCXJldHVybiAtRU5PTUVNOworCisJdHhxID0gJmFkYXAtPnNnZS5ldGh0eHFbcGktPmZpcnN0X3FzZXQgKyBwLT5xdWV1ZV07CisJcWlkID0gdHhxLT5xLmNudHh0X2lkOworCisJLyogVW5iaW5kIHF1ZXVlIGZyb20gYW55IGV4aXN0aW5nIGNsYXNzICovCisJZXJyID0gdDRfc2NoZWRfcXVldWVfdW5iaW5kKHBpLCBwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCS8qIEJpbmQgcXVldWUgdG8gc3BlY2lmaWVkIGNsYXNzICovCisJbWVtc2V0KHFlLCAwLCBzaXplb2YoKnFlKSk7CisJcWUtPmNudHh0X2lkID0gcWlkOworCW1lbWNweSgmcWUtPnBhcmFtLCBwLCBzaXplb2YocWUtPnBhcmFtKSk7CisKKwllID0gJnMtPnRhYltxZS0+cGFyYW0uY2xhc3NdOworCXNwaW5fbG9jaygmZS0+bG9jayk7CisJZXJyID0gdDRfc2NoZWRfYmluZF91bmJpbmRfb3AocGksICh2b2lkICopcWUsIFNDSEVEX1FVRVVFLCB0cnVlKTsKKwlpZiAoZXJyKSB7CisJCXQ0X2ZyZWVfbWVtKHFlKTsKKwkJc3Bpbl91bmxvY2soJmUtPmxvY2spOworCQlnb3RvIG91dDsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZxZS0+bGlzdCwgJmUtPnF1ZXVlX2xpc3QpOworCWF0b21pY19pbmMoJmUtPnJlZmNudCk7CisJc3Bpbl91bmxvY2soJmUtPmxvY2spOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHQ0X3NjaGVkX2NsYXNzX3VuYmluZF9hbGwoc3RydWN0IHBvcnRfaW5mbyAqcGksCisJCQkJICAgICAgc3RydWN0IHNjaGVkX2NsYXNzICplLAorCQkJCSAgICAgIGVudW0gc2NoZWRfYmluZF90eXBlIHR5cGUpCit7CisJaWYgKCFlKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNDSEVEX1FVRVVFOiB7CisJCXN0cnVjdCBzY2hlZF9xdWV1ZV9lbnRyeSAqcWU7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShxZSwgJmUtPnF1ZXVlX2xpc3QsIGxpc3QpCisJCQl0NF9zY2hlZF9xdWV1ZV91bmJpbmQocGksICZxZS0+cGFyYW0pOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHQ0X3NjaGVkX2NsYXNzX2JpbmRfdW5iaW5kX29wKHN0cnVjdCBwb3J0X2luZm8gKnBpLCB2b2lkICphcmcsCisJCQkJCSBlbnVtIHNjaGVkX2JpbmRfdHlwZSB0eXBlLCBib29sIGJpbmQpCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWFyZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNDSEVEX1FVRVVFOiB7CisJCXN0cnVjdCBjaF9zY2hlZF9xdWV1ZSAqcWUgPSAoc3RydWN0IGNoX3NjaGVkX3F1ZXVlICopYXJnOworCisJCWlmIChiaW5kKQorCQkJZXJyID0gdDRfc2NoZWRfcXVldWVfYmluZChwaSwgcWUpOworCQllbHNlCisJCQllcnIgPSB0NF9zY2hlZF9xdWV1ZV91bmJpbmQocGksIHFlKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBjeGdiNF9zY2hlZF9jbGFzc19iaW5kIC0gQmluZCBhbiBlbnRpdHkgdG8gYSBzY2hlZHVsaW5nIGNsYXNzCisgKiBAZGV2OiBuZXRfZGV2aWNlIHBvaW50ZXIKKyAqIEBhcmc6IEVudGl0eSBvcGFxdWUgZGF0YQorICogQHR5cGU6IEVudGl0eSB0eXBlIChRdWV1ZSkKKyAqCisgKiBCaW5kcyBhbiBlbnRpdHkgKHF1ZXVlKSB0byBhIHNjaGVkdWxpbmcgY2xhc3MuICBJZiB0aGUgZW50aXR5CisgKiBpcyBib3VuZCB0byBhbm90aGVyIGNsYXNzLCBpdCB3aWxsIGJlIHVuYm91bmQgZnJvbSB0aGUgb3RoZXIgY2xhc3MKKyAqIGFuZCBib3VuZCB0byB0aGUgY2xhc3Mgc3BlY2lmaWVkIGluIEBhcmcuCisgKi8KK2ludCBjeGdiNF9zY2hlZF9jbGFzc19iaW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywKKwkJCSAgIGVudW0gc2NoZWRfYmluZF90eXBlIHR5cGUpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXYycGluZm8oZGV2KTsKKwlzdHJ1Y3Qgc2NoZWRfdGFibGUgKnM7CisJaW50IGVyciA9IDA7CisJdTggY2xhc3NfaWQ7CisKKwlpZiAoIWNhbl9zY2hlZChkZXYpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJaWYgKCFhcmcpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTQ0hFRF9RVUVVRTogeworCQlzdHJ1Y3QgY2hfc2NoZWRfcXVldWUgKnFlID0gKHN0cnVjdCBjaF9zY2hlZF9xdWV1ZSAqKWFyZzsKKworCQljbGFzc19pZCA9IHFlLT5jbGFzczsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorCisJaWYgKCF2YWxpZF9jbGFzc19pZChkZXYsIGNsYXNzX2lkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY2xhc3NfaWQgPT0gU0NIRURfQ0xTX05PTkUpCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlzID0gcGktPnNjaGVkX3RibDsKKwl3cml0ZV9sb2NrKCZzLT5yd19sb2NrKTsKKwllcnIgPSB0NF9zY2hlZF9jbGFzc19iaW5kX3VuYmluZF9vcChwaSwgYXJnLCB0eXBlLCB0cnVlKTsKKwl3cml0ZV91bmxvY2soJnMtPnJ3X2xvY2spOworCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBjeGdiNF9zY2hlZF9jbGFzc191bmJpbmQgLSBVbmJpbmQgYW4gZW50aXR5IGZyb20gYSBzY2hlZHVsaW5nIGNsYXNzCisgKiBAZGV2OiBuZXRfZGV2aWNlIHBvaW50ZXIKKyAqIEBhcmc6IEVudGl0eSBvcGFxdWUgZGF0YQorICogQHR5cGU6IEVudGl0eSB0eXBlIChRdWV1ZSkKKyAqCisgKiBVbmJpbmRzIGFuIGVudGl0eSAocXVldWUpIGZyb20gYSBzY2hlZHVsaW5nIGNsYXNzLgorICovCitpbnQgY3hnYjRfc2NoZWRfY2xhc3NfdW5iaW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywKKwkJCSAgICAgZW51bSBzY2hlZF9iaW5kX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldjJwaW5mbyhkZXYpOworCXN0cnVjdCBzY2hlZF90YWJsZSAqczsKKwlpbnQgZXJyID0gMDsKKwl1OCBjbGFzc19pZDsKKworCWlmICghY2FuX3NjaGVkKGRldikpCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlpZiAoIWFyZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNDSEVEX1FVRVVFOiB7CisJCXN0cnVjdCBjaF9zY2hlZF9xdWV1ZSAqcWUgPSAoc3RydWN0IGNoX3NjaGVkX3F1ZXVlICopYXJnOworCisJCWNsYXNzX2lkID0gcWUtPmNsYXNzOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwlpZiAoIXZhbGlkX2NsYXNzX2lkKGRldiwgY2xhc3NfaWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXMgPSBwaS0+c2NoZWRfdGJsOworCXdyaXRlX2xvY2soJnMtPnJ3X2xvY2spOworCWVyciA9IHQ0X3NjaGVkX2NsYXNzX2JpbmRfdW5iaW5kX29wKHBpLCBhcmcsIHR5cGUsIGZhbHNlKTsKKwl3cml0ZV91bmxvY2soJnMtPnJ3X2xvY2spOworCisJcmV0dXJuIGVycjsKK30KKworLyogSWYgQHAgaXMgTlVMTCwgZmV0Y2ggYW55IGF2YWlsYWJsZSB1bnVzZWQgY2xhc3MgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2NoZWRfY2xhc3MgKnQ0X3NjaGVkX2NsYXNzX2xvb2t1cChzdHJ1Y3QgcG9ydF9pbmZvICpwaSwKKwkJCQkJCWNvbnN0IHN0cnVjdCBjaF9zY2hlZF9wYXJhbXMgKnApCit7CisJc3RydWN0IHNjaGVkX3RhYmxlICpzID0gcGktPnNjaGVkX3RibDsKKwlzdHJ1Y3Qgc2NoZWRfY2xhc3MgKmUsICplbmQ7CisJc3RydWN0IHNjaGVkX2NsYXNzICpmb3VuZCA9IE5VTEw7CisKKwlpZiAoIXApIHsKKwkJLyogR2V0IGFueSBhdmFpbGFibGUgdW51c2VkIGNsYXNzICovCisJCWVuZCA9ICZzLT50YWJbcy0+c2NoZWRfc2l6ZV07CisJCWZvciAoZSA9ICZzLT50YWJbMF07IGUgIT0gZW5kOyArK2UpIHsKKwkJCWlmIChlLT5zdGF0ZSA9PSBTQ0hFRF9TVEFURV9VTlVTRUQpIHsKKwkJCQlmb3VuZCA9IGU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBMb29rIGZvciBhIGNsYXNzIHdpdGggbWF0Y2hpbmcgc2NoZWR1bGluZyBwYXJhbWV0ZXJzICovCisJCXN0cnVjdCBjaF9zY2hlZF9wYXJhbXMgaW5mbzsKKwkJc3RydWN0IGNoX3NjaGVkX3BhcmFtcyB0cDsKKworCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJCW1lbXNldCgmdHAsIDAsIHNpemVvZih0cCkpOworCisJCW1lbWNweSgmdHAsIHAsIHNpemVvZih0cCkpOworCQkvKiBEb24ndCB0cnkgdG8gbWF0Y2ggY2xhc3MgcGFyYW1ldGVyICovCisJCXRwLnUucGFyYW1zLmNsYXNzID0gU0NIRURfQ0xTX05PTkU7CisKKwkJZW5kID0gJnMtPnRhYltzLT5zY2hlZF9zaXplXTsKKwkJZm9yIChlID0gJnMtPnRhYlswXTsgZSAhPSBlbmQ7ICsrZSkgeworCQkJaWYgKGUtPnN0YXRlID09IFNDSEVEX1NUQVRFX1VOVVNFRCkKKwkJCQljb250aW51ZTsKKworCQkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCQkJbWVtY3B5KCZpbmZvLCAmZS0+aW5mbywgc2l6ZW9mKGluZm8pKTsKKwkJCS8qIERvbid0IHRyeSB0byBtYXRjaCBjbGFzcyBwYXJhbWV0ZXIgKi8KKwkJCWluZm8udS5wYXJhbXMuY2xhc3MgPSBTQ0hFRF9DTFNfTk9ORTsKKworCQkJaWYgKChpbmZvLnR5cGUgPT0gdHAudHlwZSkgJiYKKwkJCSAgICAoIW1lbWNtcCgmaW5mby51LnBhcmFtcywgJnRwLnUucGFyYW1zLAorCQkJCSAgICAgc2l6ZW9mKGluZm8udS5wYXJhbXMpKSkpIHsKKwkJCQlmb3VuZCA9IGU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NoZWRfY2xhc3MgKnQ0X3NjaGVkX2NsYXNzX2FsbG9jKHN0cnVjdCBwb3J0X2luZm8gKnBpLAorCQkJCQkJc3RydWN0IGNoX3NjaGVkX3BhcmFtcyAqcCkKK3sKKwlzdHJ1Y3Qgc2NoZWRfdGFibGUgKnMgPSBwaS0+c2NoZWRfdGJsOworCXN0cnVjdCBzY2hlZF9jbGFzcyAqZTsKKwl1OCBjbGFzc19pZDsKKwlpbnQgZXJyOworCisJaWYgKCFwKQorCQlyZXR1cm4gTlVMTDsKKworCWNsYXNzX2lkID0gcC0+dS5wYXJhbXMuY2xhc3M7CisKKwkvKiBPbmx5IGFjY2VwdCBzZWFyY2ggZm9yIGV4aXN0aW5nIGNsYXNzIHdpdGggbWF0Y2hpbmcgcGFyYW1zCisJICogb3IgYWxsb2NhdGlvbiBvZiBuZXcgY2xhc3Mgd2l0aCBzcGVjaWZpZWQgcGFyYW1zCisJICovCisJaWYgKGNsYXNzX2lkICE9IFNDSEVEX0NMU19OT05FKQorCQlyZXR1cm4gTlVMTDsKKworCXdyaXRlX2xvY2soJnMtPnJ3X2xvY2spOworCS8qIFNlZSBpZiB0aGVyZSdzIGFuIGV4aXNpdGluZyBjbGFzcyB3aXRoIHNhbWUKKwkgKiByZXF1ZXN0ZWQgc2NoZWQgcGFyYW1zCisJICovCisJZSA9IHQ0X3NjaGVkX2NsYXNzX2xvb2t1cChwaSwgcCk7CisJaWYgKCFlKSB7CisJCXN0cnVjdCBjaF9zY2hlZF9wYXJhbXMgbnA7CisKKwkJLyogRmV0Y2ggYW55IGF2YWlsYWJsZSB1bnVzZWQgY2xhc3MgKi8KKwkJZSA9IHQ0X3NjaGVkX2NsYXNzX2xvb2t1cChwaSwgTlVMTCk7CisJCWlmICghZSkKKwkJCWdvdG8gb3V0OworCisJCW1lbXNldCgmbnAsIDAsIHNpemVvZihucCkpOworCQltZW1jcHkoJm5wLCBwLCBzaXplb2YobnApKTsKKwkJbnAudS5wYXJhbXMuY2xhc3MgPSBlLT5pZHg7CisKKwkJc3Bpbl9sb2NrKCZlLT5sb2NrKTsKKwkJLyogTmV3IGNsYXNzICovCisJCWVyciA9IHQ0X3NjaGVkX2NsYXNzX2Z3X2NtZChwaSwgJm5wLCBTQ0hFRF9GV19PUF9BREQpOworCQlpZiAoZXJyKSB7CisJCQlzcGluX3VubG9jaygmZS0+bG9jayk7CisJCQllID0gTlVMTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCW1lbWNweSgmZS0+aW5mbywgJm5wLCBzaXplb2YoZS0+aW5mbykpOworCQlhdG9taWNfc2V0KCZlLT5yZWZjbnQsIDApOworCQllLT5zdGF0ZSA9IFNDSEVEX1NUQVRFX0FDVElWRTsKKwkJc3Bpbl91bmxvY2soJmUtPmxvY2spOworCX0KKworb3V0OgorCXdyaXRlX3VubG9jaygmcy0+cndfbG9jayk7CisJcmV0dXJuIGU7Cit9CisKKy8qKgorICogY3hnYjRfc2NoZWRfY2xhc3NfYWxsb2MgLSBhbGxvY2F0ZSBhIHNjaGVkdWxpbmcgY2xhc3MKKyAqIEBkZXY6IG5ldF9kZXZpY2UgcG9pbnRlcgorICogQHA6IG5ldyBzY2hlZHVsaW5nIGNsYXNzIHRvIGNyZWF0ZS4KKyAqCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gdGhlIHNjaGVkdWxpbmcgY2xhc3MgY3JlYXRlZC4gIElmIEBwIGlzIE5VTEwsIHRoZW4KKyAqIGl0IGFsbG9jYXRlcyBhbmQgcmV0dXJucyBhbnkgYXZhaWxhYmxlIHVudXNlZCBzY2hlZHVsaW5nIGNsYXNzLiBJZiBhCisgKiBzY2hlZHVsaW5nIGNsYXNzIHdpdGggbWF0Y2hpbmcgQHAgaXMgZm91bmQsIHRoZW4gdGhlIG1hdGNoaW5nIGNsYXNzIGlzCisgKiByZXR1cm5lZC4KKyAqLworc3RydWN0IHNjaGVkX2NsYXNzICpjeGdiNF9zY2hlZF9jbGFzc19hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgc3RydWN0IGNoX3NjaGVkX3BhcmFtcyAqcCkKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldjJwaW5mbyhkZXYpOworCXU4IGNsYXNzX2lkOworCisJaWYgKCFjYW5fc2NoZWQoZGV2KSkKKwkJcmV0dXJuIE5VTEw7CisKKwljbGFzc19pZCA9IHAtPnUucGFyYW1zLmNsYXNzOworCWlmICghdmFsaWRfY2xhc3NfaWQoZGV2LCBjbGFzc19pZCkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHQ0X3NjaGVkX2NsYXNzX2FsbG9jKHBpLCBwKTsKK30KKworc3RhdGljIHZvaWQgdDRfc2NoZWRfY2xhc3NfZnJlZShzdHJ1Y3QgcG9ydF9pbmZvICpwaSwgc3RydWN0IHNjaGVkX2NsYXNzICplKQoreworCXQ0X3NjaGVkX2NsYXNzX3VuYmluZF9hbGwocGksIGUsIFNDSEVEX1FVRVVFKTsKK30KKworc3RydWN0IHNjaGVkX3RhYmxlICp0NF9pbml0X3NjaGVkKHVuc2lnbmVkIGludCBzY2hlZF9zaXplKQoreworCXN0cnVjdCBzY2hlZF90YWJsZSAqczsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXMgPSB0NF9hbGxvY19tZW0oc2l6ZW9mKCpzKSArIHNjaGVkX3NpemUgKiBzaXplb2Yoc3RydWN0IHNjaGVkX2NsYXNzKSk7CisJaWYgKCFzKQorCQlyZXR1cm4gTlVMTDsKKworCXMtPnNjaGVkX3NpemUgPSBzY2hlZF9zaXplOworCXJ3bG9ja19pbml0KCZzLT5yd19sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBzLT5zY2hlZF9zaXplOyBpKyspIHsKKwkJbWVtc2V0KCZzLT50YWJbaV0sIDAsIHNpemVvZihzdHJ1Y3Qgc2NoZWRfY2xhc3MpKTsKKwkJcy0+dGFiW2ldLmlkeCA9IGk7CisJCXMtPnRhYltpXS5zdGF0ZSA9IFNDSEVEX1NUQVRFX1VOVVNFRDsKKwkJSU5JVF9MSVNUX0hFQUQoJnMtPnRhYltpXS5xdWV1ZV9saXN0KTsKKwkJc3Bpbl9sb2NrX2luaXQoJnMtPnRhYltpXS5sb2NrKTsKKwkJYXRvbWljX3NldCgmcy0+dGFiW2ldLnJlZmNudCwgMCk7CisJfQorCXJldHVybiBzOworfQorCit2b2lkIHQ0X2NsZWFudXBfc2NoZWQoc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IHNjaGVkX3RhYmxlICpzOworCXVuc2lnbmVkIGludCBpOworCisJZm9yX2VhY2hfcG9ydChhZGFwLCBpKSB7CisJCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2MnBpbmZvKGFkYXAtPnBvcnRbaV0pOworCisJCXMgPSBwaS0+c2NoZWRfdGJsOworCQlmb3IgKGkgPSAwOyBpIDwgcy0+c2NoZWRfc2l6ZTsgaSsrKSB7CisJCQlzdHJ1Y3Qgc2NoZWRfY2xhc3MgKmU7CisKKwkJCXdyaXRlX2xvY2soJnMtPnJ3X2xvY2spOworCQkJZSA9ICZzLT50YWJbaV07CisJCQlpZiAoZS0+c3RhdGUgPT0gU0NIRURfU1RBVEVfQUNUSVZFKQorCQkJCXQ0X3NjaGVkX2NsYXNzX2ZyZWUocGksIGUpOworCQkJd3JpdGVfdW5sb2NrKCZzLT5yd19sb2NrKTsKKwkJfQorCQl0NF9mcmVlX21lbShzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3NjaGVkLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3NjaGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdiMmIzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2NoZWQuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19DWEdCNF9TQ0hFRF9ICisjZGVmaW5lIF9fQ1hHQjRfU0NIRURfSAorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKworI2RlZmluZSBTQ0hFRF9DTFNfTk9ORSAweGZmCisKKyNkZWZpbmUgRldfU0NIRURfQ0xTX05PTkUgMHhmZmZmZmZmZgorCisvKiBNYXggcmF0ZSB0aGF0IGNhbiBiZSBzZXQgdG8gYSBzY2hlZHVsaW5nIGNsYXNzIGlzIDEwIEdicHMgKi8KKyNkZWZpbmUgU0NIRURfTUFYX1JBVEVfS0JQUyAxMDAwMDAwMFUKKworZW51bSB7CisJU0NIRURfU1RBVEVfQUNUSVZFLAorCVNDSEVEX1NUQVRFX1VOVVNFRCwKK307CisKK2VudW0gc2NoZWRfZndfb3BzIHsKKwlTQ0hFRF9GV19PUF9BREQsCit9OworCitlbnVtIHNjaGVkX2JpbmRfdHlwZSB7CisJU0NIRURfUVVFVUUsCit9OworCitzdHJ1Y3Qgc2NoZWRfcXVldWVfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBpbnQgY250eHRfaWQ7CisJc3RydWN0IGNoX3NjaGVkX3F1ZXVlIHBhcmFtOworfTsKKworc3RydWN0IHNjaGVkX2NsYXNzIHsKKwl1OCBzdGF0ZTsKKwl1OCBpZHg7CisJc3RydWN0IGNoX3NjaGVkX3BhcmFtcyBpbmZvOworCXN0cnVjdCBsaXN0X2hlYWQgcXVldWVfbGlzdDsKKwlzcGlubG9ja190IGxvY2s7IC8qIFBlciBjbGFzcyBsb2NrICovCisJYXRvbWljX3QgcmVmY250OworfTsKKworc3RydWN0IHNjaGVkX3RhYmxlIHsgICAgICAvKiBwZXIgcG9ydCBzY2hlZHVsaW5nIHRhYmxlICovCisJdTggc2NoZWRfc2l6ZTsKKwlyd2xvY2tfdCByd19sb2NrOyAvKiBUYWJsZSBsb2NrICovCisJc3RydWN0IHNjaGVkX2NsYXNzIHRhYlswXTsKK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjYW5fc2NoZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldjJwaW5mbyhkZXYpOworCisJcmV0dXJuICFwaS0+c2NoZWRfdGJsID8gZmFsc2UgOiB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgdmFsaWRfY2xhc3NfaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggY2xhc3NfaWQpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXYycGluZm8oZGV2KTsKKworCWlmICgoY2xhc3NfaWQgPiBwaS0+c2NoZWRfdGJsLT5zY2hlZF9zaXplIC0gMSkgJiYKKwkgICAgKGNsYXNzX2lkICE9IFNDSEVEX0NMU19OT05FKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK2ludCBjeGdiNF9zY2hlZF9jbGFzc19iaW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywKKwkJCSAgIGVudW0gc2NoZWRfYmluZF90eXBlIHR5cGUpOworaW50IGN4Z2I0X3NjaGVkX2NsYXNzX3VuYmluZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphcmcsCisJCQkgICAgIGVudW0gc2NoZWRfYmluZF90eXBlIHR5cGUpOworCitzdHJ1Y3Qgc2NoZWRfY2xhc3MgKmN4Z2I0X3NjaGVkX2NsYXNzX2FsbG9jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICBzdHJ1Y3QgY2hfc2NoZWRfcGFyYW1zICpwKTsKKworc3RydWN0IHNjaGVkX3RhYmxlICp0NF9pbml0X3NjaGVkKHVuc2lnbmVkIGludCBzaXplKTsKK3ZvaWQgdDRfY2xlYW51cF9zY2hlZChzdHJ1Y3QgYWRhcHRlciAqYWRhcCk7CisjZW5kaWYgIC8qIF9fQ1hHQjRfU0NIRURfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9zZ2UuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2dlLmMKaW5kZXggYWQzNTUyZC4uMWU3NGZkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9zZ2UuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3NnZS5jCkBAIC0yODYwLDYgKzI4NjAsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IHQ0X3NnZV9tb2RfY3RybF90eHEoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCBlcWlkLAorCQkJdW5zaWduZWQgaW50IGNtcGxxaWQpCit7CisJdTMyIHBhcmFtLCB2YWw7CisKKwlwYXJhbSA9IChGV19QQVJBTVNfTU5FTV9WKEZXX1BBUkFNU19NTkVNX0RNQVEpIHwKKwkJIEZXX1BBUkFNU19QQVJBTV9YX1YoRldfUEFSQU1TX1BBUkFNX0RNQVFfRVFfQ01QTElRSURfQ1RSTCkgfAorCQkgRldfUEFSQU1TX1BBUkFNX1laX1YoZXFpZCkpOworCXZhbCA9IGNtcGxxaWQ7CisJcmV0dXJuIHQ0X3NldF9wYXJhbXMoYWRhcCwgYWRhcC0+bWJveCwgYWRhcC0+cGYsIDAsIDEsICZwYXJhbSwgJnZhbCk7Cit9CisKIGludCB0NF9zZ2VfYWxsb2Nfb2ZsZF90eHEoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2Vfb2ZsZF90eHEgKnR4cSwKIAkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlxaWQpCiB7CkBAIC0yOTI4LDggKzI5NDAsOCBAQAogCXEtPmRlc2MgPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBmcmVlX3JzcHFfZmwoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2VfcnNwcSAqcnEsCi0JCQkgc3RydWN0IHNnZV9mbCAqZmwpCit2b2lkIGZyZWVfcnNwcV9mbChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV9yc3BxICpycSwKKwkJICBzdHJ1Y3Qgc2dlX2ZsICpmbCkKIHsKIAlzdHJ1Y3Qgc2dlICpzID0gJmFkYXAtPnNnZTsKIAl1bnNpZ25lZCBpbnQgZmxfaWQgPSBmbCA/IGZsLT5jbnR4dF9pZCA6IDB4ZmZmZjsKQEAgLTMwMTQsMTIgKzMwMjYsNiBAQAogCQl9CiAJfQogCi0JLyogY2xlYW4gdXAgUkRNQSBhbmQgaVNDU0kgUnggcXVldWVzICovCi0JdDRfZnJlZV9vZmxkX3J4cXMoYWRhcCwgYWRhcC0+c2dlLmlzY3NpcXNldHMsIGFkYXAtPnNnZS5pc2NzaXJ4cSk7Ci0JdDRfZnJlZV9vZmxkX3J4cXMoYWRhcCwgYWRhcC0+c2dlLm5pc2NzaXRxLCBhZGFwLT5zZ2UuaXNjc2l0cnhxKTsKLQl0NF9mcmVlX29mbGRfcnhxcyhhZGFwLCBhZGFwLT5zZ2UucmRtYXFzLCBhZGFwLT5zZ2UucmRtYXJ4cSk7Ci0JdDRfZnJlZV9vZmxkX3J4cXMoYWRhcCwgYWRhcC0+c2dlLnJkbWFjaXFzLCBhZGFwLT5zZ2UucmRtYWNpcSk7Ci0KIAkvKiBjbGVhbiB1cCBvZmZsb2FkIFR4IHF1ZXVlcyAqLwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFkYXAtPnNnZS5vZmxkdHhxKTsgaSsrKSB7CiAJCXN0cnVjdCBzZ2Vfb2ZsZF90eHEgKnEgPSAmYWRhcC0+c2dlLm9mbGR0eHFbaV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0X2h3LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0X2h3LmMKaW5kZXggZGM5MmM4MC4uMjBkZWM4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9ody5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfaHcuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUNCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtMjcyOSw3ICsyNzI5LDcgQEAKIAogb3V0OgogCXZmcmVlKHZwZCk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IDA7CiB9CiAKIC8qKgpAQCAtMzYyNyw3ICszNjI3LDggQEAKIH0KIAogI2RlZmluZSBBRFZFUlRfTUFTSyAoRldfUE9SVF9DQVBfU1BFRURfMTAwTSB8IEZXX1BPUlRfQ0FQX1NQRUVEXzFHIHxcCi0JCSAgICAgRldfUE9SVF9DQVBfU1BFRURfMTBHIHwgRldfUE9SVF9DQVBfU1BFRURfNDBHIHwgXAorCQkgICAgIEZXX1BPUlRfQ0FQX1NQRUVEXzEwRyB8IEZXX1BPUlRfQ0FQX1NQRUVEXzI1RyB8IFwKKwkJICAgICBGV19QT1JUX0NBUF9TUEVFRF80MEcgfCBGV19QT1JUX0NBUF9TUEVFRF8xMDBHIHwgXAogCQkgICAgIEZXX1BPUlRfQ0FQX0FORUcpCiAKIC8qKgpAQCAtNzE5Niw4ICs3MTk3LDEyIEBACiAJCXNwZWVkID0gMTAwMDsKIAllbHNlIGlmIChzdGF0ICYgRldfUE9SVF9DTURfTFNQRUVEX1YoRldfUE9SVF9DQVBfU1BFRURfMTBHKSkKIAkJc3BlZWQgPSAxMDAwMDsKKwllbHNlIGlmIChzdGF0ICYgRldfUE9SVF9DTURfTFNQRUVEX1YoRldfUE9SVF9DQVBfU1BFRURfMjVHKSkKKwkJc3BlZWQgPSAyNTAwMDsKIAllbHNlIGlmIChzdGF0ICYgRldfUE9SVF9DTURfTFNQRUVEX1YoRldfUE9SVF9DQVBfU1BFRURfNDBHKSkKIAkJc3BlZWQgPSA0MDAwMDsKKwllbHNlIGlmIChzdGF0ICYgRldfUE9SVF9DTURfTFNQRUVEX1YoRldfUE9SVF9DQVBfU1BFRURfMTAwRykpCisJCXNwZWVkID0gMTAwMDAwOwogCiAJbGMgPSAmcGktPmxpbmtfY2ZnOwogCkBAIC04MjY0LDMgKzgyNjksNzMgQEAKIAkJdDRfc2dlX2RlY29kZV9pZG1hX3N0YXRlKGFkYXB0ZXIsIGlkbWEtPmlkbWFfc3RhdGVbaV0pOwogCX0KIH0KKworLyoqCisgKgl0NF9zZXRfdmZfbWFjIC0gU2V0IE1BQyBhZGRyZXNzIGZvciB0aGUgc3BlY2lmaWVkIFZGCisgKglAYWRhcHRlcjogVGhlIGFkYXB0ZXIKKyAqCUB2Zjogb25lIG9mIHRoZSBWRnMgaW5zdGFudGlhdGVkIGJ5IHRoZSBzcGVjaWZpZWQgUEYKKyAqCUBuYWRkcjogdGhlIG51bWJlciBvZiBNQUMgYWRkcmVzc2VzCisgKglAYWRkcjogdGhlIE1BQyBhZGRyZXNzKGVzKSB0byBiZSBzZXQgdG8gdGhlIHNwZWNpZmllZCBWRgorICovCitpbnQgdDRfc2V0X3ZmX21hY19hY2woc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCB2ZiwKKwkJICAgICAgdW5zaWduZWQgaW50IG5hZGRyLCB1OCAqYWRkcikKK3sKKwlzdHJ1Y3QgZndfYWNsX21hY19jbWQgY21kOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQub3BfdG9fdmZuID0gY3B1X3RvX2JlMzIoRldfQ01EX09QX1YoRldfQUNMX01BQ19DTUQpIHwKKwkJCQkgICAgRldfQ01EX1JFUVVFU1RfRiB8CisJCQkJICAgIEZXX0NNRF9XUklURV9GIHwKKwkJCQkgICAgRldfQUNMX01BQ19DTURfUEZOX1YoYWRhcHRlci0+cGYpIHwKKwkJCQkgICAgRldfQUNMX01BQ19DTURfVkZOX1YodmYpKTsKKworCS8qIE5vdGU6IERvIG5vdCBlbmFibGUgdGhlIEFDTCAqLworCWNtZC5lbl90b19sZW4xNiA9IGNwdV90b19iZTMyKCh1bnNpZ25lZCBpbnQpRldfTEVOMTYoY21kKSk7CisJY21kLm5tYWMgPSBuYWRkcjsKKworCXN3aXRjaCAoYWRhcHRlci0+cGYpIHsKKwljYXNlIDM6CisJCW1lbWNweShjbWQubWFjYWRkcjMsIGFkZHIsIHNpemVvZihjbWQubWFjYWRkcjMpKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltZW1jcHkoY21kLm1hY2FkZHIyLCBhZGRyLCBzaXplb2YoY21kLm1hY2FkZHIyKSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbWVtY3B5KGNtZC5tYWNhZGRyMSwgYWRkciwgc2l6ZW9mKGNtZC5tYWNhZGRyMSkpOworCQlicmVhazsKKwljYXNlIDA6CisJCW1lbWNweShjbWQubWFjYWRkcjAsIGFkZHIsIHNpemVvZihjbWQubWFjYWRkcjApKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHQ0X3dyX21ib3goYWRhcHRlciwgYWRhcHRlci0+bWJveCwgJmNtZCwgc2l6ZW9mKGNtZCksICZjbWQpOworfQorCitpbnQgdDRfc2NoZWRfcGFyYW1zKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgdHlwZSwgaW50IGxldmVsLCBpbnQgbW9kZSwKKwkJICAgIGludCByYXRldW5pdCwgaW50IHJhdGVtb2RlLCBpbnQgY2hhbm5lbCwgaW50IGNsYXNzLAorCQkgICAgaW50IG1pbnJhdGUsIGludCBtYXhyYXRlLCBpbnQgd2VpZ2h0LCBpbnQgcGt0c2l6ZSkKK3sKKwlzdHJ1Y3QgZndfc2NoZWRfY21kIGNtZDsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLm9wX3RvX3dyaXRlID0gY3B1X3RvX2JlMzIoRldfQ01EX09QX1YoRldfU0NIRURfQ01EKSB8CisJCQkJICAgICAgRldfQ01EX1JFUVVFU1RfRiB8CisJCQkJICAgICAgRldfQ01EX1dSSVRFX0YpOworCWNtZC5yZXR2YWxfbGVuMTYgPSBjcHVfdG9fYmUzMihGV19MRU4xNihjbWQpKTsKKworCWNtZC51LnBhcmFtcy5zYyA9IEZXX1NDSEVEX1NDX1BBUkFNUzsKKwljbWQudS5wYXJhbXMudHlwZSA9IHR5cGU7CisJY21kLnUucGFyYW1zLmxldmVsID0gbGV2ZWw7CisJY21kLnUucGFyYW1zLm1vZGUgPSBtb2RlOworCWNtZC51LnBhcmFtcy5jaCA9IGNoYW5uZWw7CisJY21kLnUucGFyYW1zLmNsID0gY2xhc3M7CisJY21kLnUucGFyYW1zLnVuaXQgPSByYXRldW5pdDsKKwljbWQudS5wYXJhbXMucmF0ZSA9IHJhdGVtb2RlOworCWNtZC51LnBhcmFtcy5taW4gPSBjcHVfdG9fYmUzMihtaW5yYXRlKTsKKwljbWQudS5wYXJhbXMubWF4ID0gY3B1X3RvX2JlMzIobWF4cmF0ZSk7CisJY21kLnUucGFyYW1zLndlaWdodCA9IGNwdV90b19iZTE2KHdlaWdodCk7CisJY21kLnUucGFyYW1zLnBrdHNpemUgPSBjcHVfdG9fYmUxNihwa3RzaXplKTsKKworCXJldHVybiB0NF93cl9tYm94X21lYXQoYWRhcHRlciwgYWRhcHRlci0+bWJveCwgJmNtZCwgc2l6ZW9mKGNtZCksCisJCQkgICAgICAgTlVMTCwgMSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0X21zZy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9tc2cuaAppbmRleCBlMGViZTEzLi5mYmEzYjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0X21zZy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfbXNnLmgKQEAgLTYxLDYgKzYxLDcgQEAKIAlDUExfQUJPUlRfUkVRX1JTUyAgICAgPSAweDJCLAogCUNQTF9BQk9SVF9SUExfUlNTICAgICA9IDB4MkQsCiAKKwlDUExfUlhfUEhZU19BRERSICAgICAgPSAweDMwLAogCUNQTF9DTE9TRV9DT05fUlBMICAgICA9IDB4MzIsCiAJQ1BMX0lTQ1NJX0hEUiAgICAgICAgID0gMHgzMywKIAlDUExfUkRNQV9DUUUgICAgICAgICAgPSAweDM1LApAQCAtODMsNiArODQsMTAgQEAKIAlDUExfUEFTU19PUEVOX1JFUTYgICAgPSAweDgxLAogCUNQTF9BQ1RfT1BFTl9SRVE2ICAgICA9IDB4ODMsCiAKKwlDUExfVFhfVExTX1BEVSAgICAgPSAgICAweDg4LAorCUNQTF9UWF9TRUNfUERVICAgICAgICA9IDB4OEEsCisJQ1BMX1RYX1RMU19BQ0sgICAgICAgID0gMHg4QiwKKwogCUNQTF9SRE1BX1RFUk1JTkFURSAgICA9IDB4QTIsCiAJQ1BMX1JETUFfV1JJVEUgICAgICAgID0gMHhBNCwKIAlDUExfU0dFX0VHUl9VUERBVEUgICAgPSAweEE1LApAQCAtOTQsNiArOTksOCBAQAogCUNQTF9GVzRfUExEICAgICAgICAgICA9IDB4QzEsCiAJQ1BMX0ZXNF9BQ0sgICAgICAgICAgID0gMHhDMywKIAorCUNQTF9SWF9QSFlTX0RTR0wgICAgICA9IDB4RDAsCisKIAlDUExfRlc2X01TRyAgICAgICAgICAgPSAweEUwLAogCUNQTF9GVzZfUExEICAgICAgICAgICA9IDB4RTEsCiAJQ1BMX1RYX1BLVF9MU08gICAgICAgID0gMHhFRCwKQEAgLTEzNjIsNiArMTM2OSwxNSBAQAogCV9fYmUzMiBsZW47CiB9OwogCitzdHJ1Y3QgdWxwX3R4cGt0IHsKKwlfX2JlMzIgY21kX2Rlc3Q7CisJX19iZTMyIGxlbjsKK307CisKKyNkZWZpbmUgVUxQVFhfQ01EX1MgICAgMjQKKyNkZWZpbmUgVUxQVFhfQ01EX00gICAgMHhGRgorI2RlZmluZSBVTFBUWF9DTURfVih4KSAoKHgpIDw8IFVMUFRYX0NNRF9TKQorCiAjZGVmaW5lIFVMUFRYX05TR0VfUyAgICAwCiAjZGVmaW5lIFVMUFRYX05TR0VfVih4KSAoKHgpIDw8IFVMUFRYX05TR0VfUykKIApAQCAtMTM2OSw2ICsxMzg1LDIyIEBACiAjZGVmaW5lIFVMUFRYX01PUkVfVih4KQkoKHgpIDw8IFVMUFRYX01PUkVfUykKICNkZWZpbmUgVUxQVFhfTU9SRV9GCVVMUFRYX01PUkVfVigxVSkKIAorI2RlZmluZSBVTFBfVFhQS1RfREVTVF9TICAgIDE2CisjZGVmaW5lIFVMUF9UWFBLVF9ERVNUX00gICAgMHgzCisjZGVmaW5lIFVMUF9UWFBLVF9ERVNUX1YoeCkgKCh4KSA8PCBVTFBfVFhQS1RfREVTVF9TKQorCisjZGVmaW5lIFVMUF9UWFBLVF9GSURfUyAgICAgNAorI2RlZmluZSBVTFBfVFhQS1RfRklEX00gICAgIDB4N2ZmCisjZGVmaW5lIFVMUF9UWFBLVF9GSURfVih4KSAgKCh4KSA8PCBVTFBfVFhQS1RfRklEX1MpCisKKyNkZWZpbmUgVUxQX1RYUEtUX1JPX1MgICAgICAzCisjZGVmaW5lIFVMUF9UWFBLVF9ST19WKHgpICgoeCkgPDwgVUxQX1RYUEtUX1JPX1MpCisjZGVmaW5lIFVMUF9UWFBLVF9ST19GIFVMUF9UWFBLVF9ST19WKDFVKQorCisjZGVmaW5lIFVMUF9UWF9TQ19NT1JFX1MgMjMKKyNkZWZpbmUgVUxQX1RYX1NDX01PUkVfVih4KSAoKHgpIDw8IFVMUF9UWF9TQ19NT1JFX1MpCisjZGVmaW5lIFVMUF9UWF9TQ19NT1JFX0YgIFVMUF9UWF9TQ19NT1JFX1YoMVUpCisKIHN0cnVjdCB1bHBfbWVtX2lvIHsKIAlXUl9IRFI7CiAJX19iZTMyIGNtZDsKQEAgLTE0MDYsNCArMTQzOCw0MDkgQEAKICNkZWZpbmUgVUxQX01FTUlPX0RBVEFfTEVOX1MgICAgMAogI2RlZmluZSBVTFBfTUVNSU9fREFUQV9MRU5fVih4KSAoKHgpIDw8IFVMUF9NRU1JT19EQVRBX0xFTl9TKQogCisjZGVmaW5lIFVMUFRYX05TR0VfUyAgICAwCisjZGVmaW5lIFVMUFRYX05TR0VfTSAgICAweEZGRkYKKyNkZWZpbmUgVUxQVFhfTlNHRV9WKHgpICgoeCkgPDwgVUxQVFhfTlNHRV9TKQorI2RlZmluZSBVTFBUWF9OU0dFX0coeCkgKCgoeCkgPj4gVUxQVFhfTlNHRV9TKSAmIFVMUFRYX05TR0VfTSkKKworc3RydWN0IHVscHR4X3NjX21lbXJkIHsKKwlfX2JlMzIgY21kX3RvX2xlbjsKKwlfX2JlMzIgYWRkcjsKK307CisKKyNkZWZpbmUgVUxQX1RYUEtUX0RBVEFNT0RJRllfUyAgICAgICAyMworI2RlZmluZSBVTFBfVFhQS1RfREFUQU1PRElGWV9NICAgICAgIDB4MQorI2RlZmluZSBVTFBfVFhQS1RfREFUQU1PRElGWV9WKHgpICAgICgoeCkgPDwgVUxQX1RYUEtUX0RBVEFNT0RJRllfUykKKyNkZWZpbmUgVUxQX1RYUEtUX0RBVEFNT0RJRllfRyh4KSAgICBcCisJKCgoeCkgPj4gVUxQX1RYUEtUX0RBVEFNT0RJRllfUykgJiBVTFBfVFhQS1RfREFUQU1PRElGWV9fTSkKKyNkZWZpbmUgVUxQX1RYUEtUX0RBVEFNT0RJRllfRiAgICAgICBVTFBfVFhQS1RfREFUQU1PRElGWV9WKDFVKQorCisjZGVmaW5lIFVMUF9UWFBLVF9DSEFOTkVMSURfUyAgICAgICAgMjIKKyNkZWZpbmUgVUxQX1RYUEtUX0NIQU5ORUxJRF9NICAgICAgICAweDEKKyNkZWZpbmUgVUxQX1RYUEtUX0NIQU5ORUxJRF9WKHgpICAgICAoKHgpIDw8IFVMUF9UWFBLVF9DSEFOTkVMSURfUykKKyNkZWZpbmUgVUxQX1RYUEtUX0NIQU5ORUxJRF9HKHgpICAgICBcCisJKCgoeCkgPj4gVUxQX1RYUEtUX0NIQU5ORUxJRF9TKSAmIFVMUF9UWFBLVF9DSEFOTkVMSURfTSkKKyNkZWZpbmUgVUxQX1RYUEtUX0NIQU5ORUxJRF9GICAgICAgICBVTFBfVFhQS1RfQ0hBTk5FTElEX1YoMVUpCisKKyNkZWZpbmUgU0NNRF9TRVFfTk9fQ1RSTF9TICAgICAgMjkKKyNkZWZpbmUgU0NNRF9TRVFfTk9fQ1RSTF9NICAgICAgMHgzCisjZGVmaW5lIFNDTURfU0VRX05PX0NUUkxfVih4KSAgICgoeCkgPDwgU0NNRF9TRVFfTk9fQ1RSTF9TKQorI2RlZmluZSBTQ01EX1NFUV9OT19DVFJMX0coeCkgICBcCisJKCgoeCkgPj4gU0NNRF9TRVFfTk9fQ1RSTF9TKSAmIFNDTURfU0VRX05PX0NUUkxfTSkKKworLyogU3RzRmllbGRQcnNudC0gU3RhdHVzIGZpZWxkIGF0IHRoZSBlbmQgb2YgdGhlIFRMUyBQRFUgKi8KKyNkZWZpbmUgU0NNRF9TVEFUVVNfUFJFU0VOVF9TICAgMjgKKyNkZWZpbmUgU0NNRF9TVEFUVVNfUFJFU0VOVF9NICAgMHgxCisjZGVmaW5lIFNDTURfU1RBVFVTX1BSRVNFTlRfVih4KSAgICAoKHgpIDw8IFNDTURfU1RBVFVTX1BSRVNFTlRfUykKKyNkZWZpbmUgU0NNRF9TVEFUVVNfUFJFU0VOVF9HKHgpICAgIFwKKwkoKCh4KSA+PiBTQ01EX1NUQVRVU19QUkVTRU5UX1MpICYgU0NNRF9TVEFUVVNfUFJFU0VOVF9NKQorI2RlZmluZSBTQ01EX1NUQVRVU19QUkVTRU5UX0YgICBTQ01EX1NUQVRVU19QUkVTRU5UX1YoMVUpCisKKy8qIFByb3RvVmVyc2lvbiAtIFByb3RvY29sIFZlcnNpb24gMDogMS4yLCAxOjEuMSwgMjpEVExTLCAzOkdlbmVyaWMsCisgKiAzLTE1OiBSZXNlcnZlZC4KKyAqLworI2RlZmluZSBTQ01EX1BST1RPX1ZFUlNJT05fUyAgICAyNAorI2RlZmluZSBTQ01EX1BST1RPX1ZFUlNJT05fTSAgICAweGYKKyNkZWZpbmUgU0NNRF9QUk9UT19WRVJTSU9OX1YoeCkgKCh4KSA8PCBTQ01EX1BST1RPX1ZFUlNJT05fUykKKyNkZWZpbmUgU0NNRF9QUk9UT19WRVJTSU9OX0coeCkgXAorCSgoKHgpID4+IFNDTURfUFJPVE9fVkVSU0lPTl9TKSAmIFNDTURfUFJPVE9fVkVSU0lPTl9NKQorCisvKiBFbmNEZWNDdHJsIC0gRW5jcnlwdGlvbi9EZWNyeXB0aW9uIENvbnRyb2wuIDA6IEVuY3J5cHQsIDE6IERlY3J5cHQgKi8KKyNkZWZpbmUgU0NNRF9FTkNfREVDX0NUUkxfUyAgICAgMjMKKyNkZWZpbmUgU0NNRF9FTkNfREVDX0NUUkxfTSAgICAgMHgxCisjZGVmaW5lIFNDTURfRU5DX0RFQ19DVFJMX1YoeCkgICgoeCkgPDwgU0NNRF9FTkNfREVDX0NUUkxfUykKKyNkZWZpbmUgU0NNRF9FTkNfREVDX0NUUkxfRyh4KSAgXAorCSgoKHgpID4+IFNDTURfRU5DX0RFQ19DVFJMX1MpICYgU0NNRF9FTkNfREVDX0NUUkxfTSkKKyNkZWZpbmUgU0NNRF9FTkNfREVDX0NUUkxfRiBTQ01EX0VOQ19ERUNfQ1RSTF9WKDFVKQorCisvKiBDaXBoZXJBdXRoU2VxQ3RybCAtIENpcGhlciBBdXRoZW50aWNhdGlvbiBTZXF1ZW5jZSBDb250cm9sLiAqLworI2RlZmluZSBTQ01EX0NJUEhfQVVUSF9TRVFfQ1RSTF9TICAgICAgIDIyCisjZGVmaW5lIFNDTURfQ0lQSF9BVVRIX1NFUV9DVFJMX00gICAgICAgMHgxCisjZGVmaW5lIFNDTURfQ0lQSF9BVVRIX1NFUV9DVFJMX1YoeCkgICAgXAorCSgoeCkgPDwgU0NNRF9DSVBIX0FVVEhfU0VRX0NUUkxfUykKKyNkZWZpbmUgU0NNRF9DSVBIX0FVVEhfU0VRX0NUUkxfRyh4KSAgICBcCisJKCgoeCkgPj4gU0NNRF9DSVBIX0FVVEhfU0VRX0NUUkxfUykgJiBTQ01EX0NJUEhfQVVUSF9TRVFfQ1RSTF9NKQorI2RlZmluZSBTQ01EX0NJUEhfQVVUSF9TRVFfQ1RSTF9GICAgU0NNRF9DSVBIX0FVVEhfU0VRX0NUUkxfVigxVSkKKworLyogQ2lwaE1vZGUgLSAgQ2lwaGVyIE1vZGUuIDA6IE5PUCwgMTpBRVMtQ0JDLCAyOkFFUy1HQ00sIDM6QUVTLUNUUiwKKyAqIDQ6R2VuZXJpYy1BRVMsIDUtMTU6IFJlc2VydmVkLgorICovCisjZGVmaW5lIFNDTURfQ0lQSF9NT0RFX1MgICAgMTgKKyNkZWZpbmUgU0NNRF9DSVBIX01PREVfTSAgICAweGYKKyNkZWZpbmUgU0NNRF9DSVBIX01PREVfVih4KSAoKHgpIDw8IFNDTURfQ0lQSF9NT0RFX1MpCisjZGVmaW5lIFNDTURfQ0lQSF9NT0RFX0coeCkgXAorCSgoKHgpID4+IFNDTURfQ0lQSF9NT0RFX1MpICYgU0NNRF9DSVBIX01PREVfTSkKKworLyogQXV0aE1vZGUgLSBBdXRoIE1vZGUuIDA6IE5PUCwgMTpTSEExLCAyOlNIQTItMjI0LCAzOlNIQTItMjU2CisgKiA0LTE1OiBSZXNlcnZlZAorICovCisjZGVmaW5lIFNDTURfQVVUSF9NT0RFX1MgICAgMTQKKyNkZWZpbmUgU0NNRF9BVVRIX01PREVfTSAgICAweGYKKyNkZWZpbmUgU0NNRF9BVVRIX01PREVfVih4KSAoKHgpIDw8IFNDTURfQVVUSF9NT0RFX1MpCisjZGVmaW5lIFNDTURfQVVUSF9NT0RFX0coeCkgXAorCSgoKHgpID4+IFNDTURfQVVUSF9NT0RFX1MpICYgU0NNRF9BVVRIX01PREVfTSkKKworLyogSG1hY0N0cmwgLSBITUFDIENvbnRyb2wuIDA6Tk9QLCAxOk5vIHRydW5jYXRpb24sIDI6U3VwcG9ydCBITUFDIFRydW5jYXRpb24KKyAqIHBlciBSRkMgNDM2NiwgMzpJUFNlYyA5NiBiaXRzLCA0LTc6UmVzZXJ2ZWQKKyAqLworI2RlZmluZSBTQ01EX0hNQUNfQ1RSTF9TICAgIDExCisjZGVmaW5lIFNDTURfSE1BQ19DVFJMX00gICAgMHg3CisjZGVmaW5lIFNDTURfSE1BQ19DVFJMX1YoeCkgKCh4KSA8PCBTQ01EX0hNQUNfQ1RSTF9TKQorI2RlZmluZSBTQ01EX0hNQUNfQ1RSTF9HKHgpIFwKKwkoKCh4KSA+PiBTQ01EX0hNQUNfQ1RSTF9TKSAmIFNDTURfSE1BQ19DVFJMX00pCisKKy8qIEl2U2l6ZSAtIElWIHNpemUgaW4gdW5pdHMgb2YgMiBieXRlcyAqLworI2RlZmluZSBTQ01EX0lWX1NJWkVfUyAgNworI2RlZmluZSBTQ01EX0lWX1NJWkVfTSAgMHhmCisjZGVmaW5lIFNDTURfSVZfU0laRV9WKHgpICAgKCh4KSA8PCBTQ01EX0lWX1NJWkVfUykKKyNkZWZpbmUgU0NNRF9JVl9TSVpFX0coeCkgICBcCisJKCgoeCkgPj4gU0NNRF9JVl9TSVpFX1MpICYgU0NNRF9JVl9TSVpFX00pCisKKy8qIE51bUlWcyAtIE51bWJlciBvZiBJVnMgKi8KKyNkZWZpbmUgU0NNRF9OVU1fSVZTX1MgIDAKKyNkZWZpbmUgU0NNRF9OVU1fSVZTX00gIDB4N2YKKyNkZWZpbmUgU0NNRF9OVU1fSVZTX1YoeCkgICAoKHgpIDw8IFNDTURfTlVNX0lWU19TKQorI2RlZmluZSBTQ01EX05VTV9JVlNfRyh4KSAgIFwKKwkoKCh4KSA+PiBTQ01EX05VTV9JVlNfUykgJiBTQ01EX05VTV9JVlNfTSkKKworLyogRW5iRGJnSWQgLSBJZiB0aGlzIGlzIGVuYWJsZWQgdXBwZXIgMjAgKDYzOjQ0KSBiaXRzIGlmIFNlcU51bWJlcgorICogKGJlbG93KSBhcmUgdXNlZCBhcyBDaWQgKGNvbm5lY3Rpb24gaWQgZm9yIGRlYnVnIHN0YXR1cyksIHRoZXNlCisgKiBiaXRzIGFyZSBwYWRkZWQgdG8gemVybyBmb3IgZm9ybWluZyB0aGUgNjQgYml0CisgKiBzZXF1ZW5jZSBudW1iZXIgZm9yIFRMUworICovCisjZGVmaW5lIFNDTURfRU5CX0RCR0lEX1MgIDMxCisjZGVmaW5lIFNDTURfRU5CX0RCR0lEX00gIDB4MQorI2RlZmluZSBTQ01EX0VOQl9EQkdJRF9WKHgpICAgKCh4KSA8PCBTQ01EX0VOQl9EQkdJRF9TKQorI2RlZmluZSBTQ01EX0VOQl9EQkdJRF9HKHgpICAgXAorCSgoKHgpID4+IFNDTURfRU5CX0RCR0lEX1MpICYgU0NNRF9FTkJfREJHSURfTSkKKworLyogSVYgZ2VuZXJhdGlvbiBpbiBTVy4gKi8KKyNkZWZpbmUgU0NNRF9JVl9HRU5fQ1RSTF9TICAgICAgMzAKKyNkZWZpbmUgU0NNRF9JVl9HRU5fQ1RSTF9NICAgICAgMHgxCisjZGVmaW5lIFNDTURfSVZfR0VOX0NUUkxfVih4KSAgICgoeCkgPDwgU0NNRF9JVl9HRU5fQ1RSTF9TKQorI2RlZmluZSBTQ01EX0lWX0dFTl9DVFJMX0coeCkgICBcCisJKCgoeCkgPj4gU0NNRF9JVl9HRU5fQ1RSTF9TKSAmIFNDTURfSVZfR0VOX0NUUkxfTSkKKyNkZWZpbmUgU0NNRF9JVl9HRU5fQ1RSTF9GICBTQ01EX0lWX0dFTl9DVFJMX1YoMVUpCisKKy8qIE1vcmUgZnJhZ3MgKi8KKyNkZWZpbmUgU0NNRF9NT1JFX0ZSQUdTX1MgICAyMAorI2RlZmluZSBTQ01EX01PUkVfRlJBR1NfTSAgIDB4MQorI2RlZmluZSBTQ01EX01PUkVfRlJBR1NfVih4KSAgICAoKHgpIDw8IFNDTURfTU9SRV9GUkFHU19TKQorI2RlZmluZSBTQ01EX01PUkVfRlJBR1NfRyh4KSAgICAoKCh4KSA+PiBTQ01EX01PUkVfRlJBR1NfUykgJiBTQ01EX01PUkVfRlJBR1NfTSkKKworLypsYXN0IGZyYWcgKi8KKyNkZWZpbmUgU0NNRF9MQVNUX0ZSQUdfUyAgICAxOQorI2RlZmluZSBTQ01EX0xBU1RfRlJBR19NICAgIDB4MQorI2RlZmluZSBTQ01EX0xBU1RfRlJBR19WKHgpICgoeCkgPDwgU0NNRF9MQVNUX0ZSQUdfUykKKyNkZWZpbmUgU0NNRF9MQVNUX0ZSQUdfRyh4KSAoKCh4KSA+PiBTQ01EX0xBU1RfRlJBR19TKSAmIFNDTURfTEFTVF9GUkFHX00pCisKKy8qIFRsc0NvbXBQZHUgKi8KKyNkZWZpbmUgU0NNRF9UTFNfQ09NUFBEVV9TICAgIDE4CisjZGVmaW5lIFNDTURfVExTX0NPTVBQRFVfTSAgICAweDEKKyNkZWZpbmUgU0NNRF9UTFNfQ09NUFBEVV9WKHgpICgoeCkgPDwgU0NNRF9UTFNfQ09NUFBEVV9TKQorI2RlZmluZSBTQ01EX1RMU19DT01QUERVX0coeCkgKCgoeCkgPj4gU0NNRF9UTFNfQ09NUFBEVV9TKSAmIFNDTURfVExTX0NPTVBQRFVfTSkKKworLyogS2V5Q250eHRJbmxpbmUgLSBLZXkgY29udGV4dCBpbmxpbmUgYWZ0ZXIgdGhlIHNjbWQgIE9SIFBheWxvYWRPbmx5Ki8KKyNkZWZpbmUgU0NNRF9LRVlfQ1RYX0lOTElORV9TICAgMTcKKyNkZWZpbmUgU0NNRF9LRVlfQ1RYX0lOTElORV9NICAgMHgxCisjZGVmaW5lIFNDTURfS0VZX0NUWF9JTkxJTkVfVih4KSAgICAoKHgpIDw8IFNDTURfS0VZX0NUWF9JTkxJTkVfUykKKyNkZWZpbmUgU0NNRF9LRVlfQ1RYX0lOTElORV9HKHgpICAgIFwKKwkoKCh4KSA+PiBTQ01EX0tFWV9DVFhfSU5MSU5FX1MpICYgU0NNRF9LRVlfQ1RYX0lOTElORV9NKQorI2RlZmluZSBTQ01EX0tFWV9DVFhfSU5MSU5FX0YgICBTQ01EX0tFWV9DVFhfSU5MSU5FX1YoMVUpCisKKy8qIFRMU0ZyYWdFbmFibGUgLSAwOiBIb3N0IGNyZWF0ZWQgVExTIFBEVXMsIDE6IFRMUyBGcmFtZ21lbnRhdGlvbiBpbiBBU0lDICovCisjZGVmaW5lIFNDTURfVExTX0ZSQUdfRU5BQkxFX1MgIDE2CisjZGVmaW5lIFNDTURfVExTX0ZSQUdfRU5BQkxFX00gIDB4MQorI2RlZmluZSBTQ01EX1RMU19GUkFHX0VOQUJMRV9WKHgpICAgKCh4KSA8PCBTQ01EX1RMU19GUkFHX0VOQUJMRV9TKQorI2RlZmluZSBTQ01EX1RMU19GUkFHX0VOQUJMRV9HKHgpICAgXAorCSgoKHgpID4+IFNDTURfVExTX0ZSQUdfRU5BQkxFX1MpICYgU0NNRF9UTFNfRlJBR19FTkFCTEVfTSkKKyNkZWZpbmUgU0NNRF9UTFNfRlJBR19FTkFCTEVfRiAgU0NNRF9UTFNfRlJBR19FTkFCTEVfVigxVSkKKworLyogTWFjT25seSAtIE9ubHkgc2VuZCB0aGUgTUFDIGFuZCBkaXNjYXJkIFBEVS4gVGhpcyBpcyB2YWxpZCBmb3IgaGFzaCBvbmx5CisgKiBtb2RlcywgaW4gdGhpcyBjYXNlIFRMU19UWCAgd2lsbCBkcm9wIHRoZSBQRFUgYW5kIG9ubHkKKyAqIHNlbmQgYmFjayB0aGUgTUFDIGJ5dGVzLgorICovCisjZGVmaW5lIFNDTURfTUFDX09OTFlfUyAxNQorI2RlZmluZSBTQ01EX01BQ19PTkxZX00gMHgxCisjZGVmaW5lIFNDTURfTUFDX09OTFlfVih4KSAgKCh4KSA8PCBTQ01EX01BQ19PTkxZX1MpCisjZGVmaW5lIFNDTURfTUFDX09OTFlfRyh4KSAgXAorCSgoKHgpID4+IFNDTURfTUFDX09OTFlfUykgJiBTQ01EX01BQ19PTkxZX00pCisjZGVmaW5lIFNDTURfTUFDX09OTFlfRiBTQ01EX01BQ19PTkxZX1YoMVUpCisKKy8qIEFhZElWRHJvcCAtIERyb3AgdGhlIEFBRCBhbmQgSVYgZmllbGRzLiBVc2VmdWwgaW4gcHJvdG9jb2xzCisgKiB3aGljaCBoYXZlIGNvbXBsZXggQUFEIGFuZCBJViBmb3JtYXRpb25zIEVnOkFFUy1DQ00KKyAqLworI2RlZmluZSBTQ01EX0FBRElWRFJPUF9TIDE0CisjZGVmaW5lIFNDTURfQUFESVZEUk9QX00gMHgxCisjZGVmaW5lIFNDTURfQUFESVZEUk9QX1YoeCkgICgoeCkgPDwgU0NNRF9BQURJVkRST1BfUykKKyNkZWZpbmUgU0NNRF9BQURJVkRST1BfRyh4KSAgXAorCSgoKHgpID4+IFNDTURfQUFESVZEUk9QX1MpICYgU0NNRF9BQURJVkRST1BfTSkKKyNkZWZpbmUgU0NNRF9BQURJVkRST1BfRiBTQ01EX0FBRElWRFJPUF9WKDFVKQorCisvKiBIZHJMZW5ndGggLSBMZW5ndGggb2YgYWxsIGhlYWRlcnMgZXhjbHVkaW5nIFRMUyBoZWFkZXIKKyAqIHByZXNlbnQgYmVmb3JlIHN0YXJ0IG9mIGNyeXB0byBQRFUvcGF5bG9hZC4KKyAqLworI2RlZmluZSBTQ01EX0hEUl9MRU5fUyAgMAorI2RlZmluZSBTQ01EX0hEUl9MRU5fTSAgMHgzZmZmCisjZGVmaW5lIFNDTURfSERSX0xFTl9WKHgpICAgKCh4KSA8PCBTQ01EX0hEUl9MRU5fUykKKyNkZWZpbmUgU0NNRF9IRFJfTEVOX0coeCkgICBcCisJKCgoeCkgPj4gU0NNRF9IRFJfTEVOX1MpICYgU0NNRF9IRFJfTEVOX00pCisKK3N0cnVjdCBjcGxfdHhfc2VjX3BkdSB7CisJX19iZTMyIG9wX2l2aW5zcnRvZnN0OworCV9fYmUzMiBwbGRsZW47CisJX19iZTMyIGFhZHN0YXJ0X2NpcGhlcnN0b3BfaGk7CisJX19iZTMyIGNpcGhlcnN0b3BfbG9fYXV0aGluc2VydDsKKwlfX2JlMzIgc2Vxbm9fbnVtaXZzOworCV9fYmUzMiBpdmdlbl9oZHJsZW47CisJX19iZTY0IHNjbWQxOworfTsKKworI2RlZmluZSBDUExfVFhfU0VDX1BEVV9PUENPREVfUyAgICAgMjQKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfT1BDT0RFX00gICAgIDB4ZmYKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfT1BDT0RFX1YoeCkgICgoeCkgPDwgQ1BMX1RYX1NFQ19QRFVfT1BDT0RFX1MpCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX09QQ09ERV9HKHgpICBcCisJKCgoeCkgPj4gQ1BMX1RYX1NFQ19QRFVfT1BDT0RFX1MpICYgQ1BMX1RYX1NFQ19QRFVfT1BDT0RFX00pCisKKy8qIFJYIENoYW5uZWwgSWQgKi8KKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfUlhDSElEX1MgIDIyCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX1JYQ0hJRF9NICAweDEKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfUlhDSElEX1YoeCkgICAoKHgpIDw8IENQTF9UWF9TRUNfUERVX1JYQ0hJRF9TKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9SWENISURfRyh4KSAgIFwKKwkoKCh4KSA+PiBDUExfVFhfU0VDX1BEVV9SWENISURfUykgJiBDUExfVFhfU0VDX1BEVV9SWENISURfTSkKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfUlhDSElEX0YgIENQTF9UWF9TRUNfUERVX1JYQ0hJRF9WKDFVKQorCisvKiBBY2sgRm9sbG93cyAqLworI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BQ0tGT0xMT1dTX1MgIDIxCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FDS0ZPTExPV1NfTSAgMHgxCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FDS0ZPTExPV1NfVih4KSAgICgoeCkgPDwgQ1BMX1RYX1NFQ19QRFVfQUNLRk9MTE9XU19TKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BQ0tGT0xMT1dTX0coeCkgICBcCisJKCgoeCkgPj4gQ1BMX1RYX1NFQ19QRFVfQUNLRk9MTE9XU19TKSAmIENQTF9UWF9TRUNfUERVX0FDS0ZPTExPV1NfTSkKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQUNLRk9MTE9XU19GICBDUExfVFhfU0VDX1BEVV9BQ0tGT0xMT1dTX1YoMVUpCisKKy8qIExvb3BiYWNrIGJpdCBpbiBjcGxfdHhfc2VjX3BkdSAqLworI2RlZmluZSBDUExfVFhfU0VDX1BEVV9VTFBUWExQQktfUyAgMjAKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfVUxQVFhMUEJLX00gIDB4MQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9VTFBUWExQQktfVih4KSAgICgoeCkgPDwgQ1BMX1RYX1NFQ19QRFVfVUxQVFhMUEJLX1MpCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX1VMUFRYTFBCS19HKHgpICAgXAorCSgoKHgpID4+IENQTF9UWF9TRUNfUERVX1VMUFRYTFBCS19TKSAmIENQTF9UWF9TRUNfUERVX1VMUFRYTFBCS19NKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9VTFBUWExQQktfRiAgQ1BMX1RYX1NFQ19QRFVfVUxQVFhMUEJLX1YoMVUpCisKKy8qIExlbmd0aCBvZiBjcGwgaGVhZGVyIGVuY2Fwc3VsYXRlZCAqLworI2RlZmluZSBDUExfVFhfU0VDX1BEVV9DUExMRU5fUyAgICAgMTYKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQ1BMTEVOX00gICAgIDB4ZgorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9DUExMRU5fVih4KSAgKCh4KSA8PCBDUExfVFhfU0VDX1BEVV9DUExMRU5fUykKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQ1BMTEVOX0coeCkgIFwKKwkoKCh4KSA+PiBDUExfVFhfU0VDX1BEVV9DUExMRU5fUykgJiBDUExfVFhfU0VDX1BEVV9DUExMRU5fTSkKKworLyogUGxhY2VIb2xkZXIgKi8KKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfUExBQ0VIT0xERVJfUyAgICAxMAorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9QTEFDRUhPTERFUl9NICAgIDB4MQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9QTEFDRUhPTERFUl9WKHgpICgoeCkgPDwgQ1BMX1RYX1NFQ19QRFVfUExBQ0VIT0xERVJfUykKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfUExBQ0VIT0xERVJfRyh4KSBcCisJKCgoeCkgPj4gQ1BMX1RYX1NFQ19QRFVfUExBQ0VIT0xERVJfUykgJiBcCisJIENQTF9UWF9TRUNfUERVX1BMQUNFSE9MREVSX00pCisKKy8qIEl2SW5zcnRPZmZzZXQ6IEluc2VydGlvbiBsb2NhdGlvbiBmb3IgSVYgKi8KKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfSVZJTlNSVE9GU1RfUyAgICAwCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0lWSU5TUlRPRlNUX00gICAgMHgzZmYKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfSVZJTlNSVE9GU1RfVih4KSAoKHgpIDw8IENQTF9UWF9TRUNfUERVX0lWSU5TUlRPRlNUX1MpCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0lWSU5TUlRPRlNUX0coeCkgXAorCSgoKHgpID4+IENQTF9UWF9TRUNfUERVX0lWSU5TUlRPRlNUX1MpICYgXAorCSBDUExfVFhfU0VDX1BEVV9JVklOU1JUT0ZTVF9NKQorCisvKiBBYWRTdGFydE9mZnNldDogT2Zmc2V0IGluIGJ5dGVzIGZvciBBQUQgc3RhcnQgZnJvbQorICogdGhlIGZpcnN0IGJ5dGUgZm9sbG93aW5nIHRoZSBwa3QgaGVhZGVycyAoMC0yNTUgYnl0ZXMpCisgKi8KKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQUFEU1RBUlRfUyAgIDI0CisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FBRFNUQVJUX00gICAweGZmCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FBRFNUQVJUX1YoeCkgICAgKCh4KSA8PCBDUExfVFhfU0VDX1BEVV9BQURTVEFSVF9TKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BQURTVEFSVF9HKHgpICAgIFwKKwkoKCh4KSA+PiBDUExfVFhfU0VDX1BEVV9BQURTVEFSVF9TKSAmIFwKKwkgQ1BMX1RYX1NFQ19QRFVfQUFEU1RBUlRfTSkKKworLyogQWFkU3RvcE9mZnNldDogb2Zmc2V0IGluIGJ5dGVzIGZvciBBQUQgc3RvcC9lbmQgZnJvbSB0aGUgZmlyc3QgYnl0ZSBmb2xsb3dpbmcKKyAqIHRoZSBwa3QgaGVhZGVycyAoMC01MTEgYnl0ZXMpCisgKi8KKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQUFEU1RPUF9TICAgIDE1CisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FBRFNUT1BfTSAgICAweDFmZgorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BQURTVE9QX1YoeCkgKCh4KSA8PCBDUExfVFhfU0VDX1BEVV9BQURTVE9QX1MpCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FBRFNUT1BfRyh4KSBcCisJKCgoeCkgPj4gQ1BMX1RYX1NFQ19QRFVfQUFEU1RPUF9TKSAmIENQTF9UWF9TRUNfUERVX0FBRFNUT1BfTSkKKworLyogQ2lwaGVyU3RhcnRPZmZzZXQ6IG9mZnNldCBpbiBieXRlcyBmb3IgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIHN0YXJ0IGZyb20gdGhlCisgKiBmaXJzdCBieXRlIGZvbGxvd2luZyB0aGUgcGt0IGhlYWRlcnMgKDAtMTAyMyBieXRlcykKKyAqLworI2RlZmluZSBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVEFSVF9TICAgIDUKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RBUlRfTSAgICAweDNmZgorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVEFSVF9WKHgpICgoeCkgPDwgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RBUlRfUykKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RBUlRfRyh4KSBcCisJKCgoeCkgPj4gQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RBUlRfUykgJiBcCisJIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUQVJUX00pCisKKy8qIENpcGhlclN0b3BPZmZzZXQ6IG9mZnNldCBpbiBieXRlcyBmb3IgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIGVuZAorICogZnJvbSBlbmQgb2YgdGhlIHBheWxvYWQgb2YgdGhpcyBjb21tYW5kICgwLTUxMSBieXRlcykKKyAqLworI2RlZmluZSBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVE9QX0hJX1MgICAgICAwCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUT1BfSElfTSAgICAgIDB4MWYKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RPUF9ISV9WKHgpICAgXAorCSgoeCkgPDwgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RPUF9ISV9TKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVE9QX0hJX0coeCkgICBcCisJKCgoeCkgPj4gQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RPUF9ISV9TKSAmIFwKKwkgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RPUF9ISV9NKQorCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUT1BfTE9fUyAgICAgIDI4CisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUT1BfTE9fTSAgICAgIDB4ZgorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVE9QX0xPX1YoeCkgICBcCisJKCh4KSA8PCBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVE9QX0xPX1MpCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUT1BfTE9fRyh4KSAgIFwKKwkoKCh4KSA+PiBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVE9QX0xPX1MpICYgXAorCSBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVE9QX0xPX00pCisKKy8qIEF1dGhTdGFydE9mZnNldDogb2Zmc2V0IGluIGJ5dGVzIGZvciBhdXRoZW50aWNhdGlvbiBzdGFydCBmcm9tCisgKiB0aGUgZmlyc3QgYnl0ZSBmb2xsb3dpbmcgdGhlIHBrdCBoZWFkZXJzICgwLTEwMjMpCisgKi8KKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQVVUSFNUQVJUX1MgIDE4CisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FVVEhTVEFSVF9NICAweDNmZgorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BVVRIU1RBUlRfVih4KSAgICgoeCkgPDwgQ1BMX1RYX1NFQ19QRFVfQVVUSFNUQVJUX1MpCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FVVEhTVEFSVF9HKHgpICAgXAorCSgoKHgpID4+IENQTF9UWF9TRUNfUERVX0FVVEhTVEFSVF9TKSAmIFwKKwkgQ1BMX1RYX1NFQ19QRFVfQVVUSFNUQVJUX00pCisKKy8qIEF1dGhTdG9wT2Zmc2V0OiBvZmZzZXQgaW4gYnl0ZXMgZm9yIGF1dGhlbnRpY2F0aW9uCisgKiBlbmQgZnJvbSBlbmQgb2YgdGhlIHBheWxvYWQgb2YgdGhpcyBjb21tYW5kICgwLTUxMSBCeXRlcykKKyAqLworI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BVVRIU1RPUF9TICAgOQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BVVRIU1RPUF9NICAgMHgxZmYKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQVVUSFNUT1BfVih4KSAgICAoKHgpIDw8IENQTF9UWF9TRUNfUERVX0FVVEhTVE9QX1MpCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FVVEhTVE9QX0coeCkgICAgXAorCSgoKHgpID4+IENQTF9UWF9TRUNfUERVX0FVVEhTVE9QX1MpICYgXAorCSBDUExfVFhfU0VDX1BEVV9BVVRIU1RPUF9NKQorCisvKiBBdXRoSW5zcnRPZmZzZXQ6IG9mZnNldCBpbiBieXRlcyBmb3IgYXV0aGVudGljYXRpb24gaW5zZXJ0aW9uCisgKiBmcm9tIGVuZCBvZiB0aGUgcGF5bG9hZCBvZiB0aGlzIGNvbW1hbmQgKDAtNTExIGJ5dGVzKQorICovCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FVVEhJTlNFUlRfUyAwCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FVVEhJTlNFUlRfTSAweDFmZgorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BVVRISU5TRVJUX1YoeCkgICgoeCkgPDwgQ1BMX1RYX1NFQ19QRFVfQVVUSElOU0VSVF9TKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BVVRISU5TRVJUX0coeCkgIFwKKwkoKCh4KSA+PiBDUExfVFhfU0VDX1BEVV9BVVRISU5TRVJUX1MpICYgXAorCSBDUExfVFhfU0VDX1BEVV9BVVRISU5TRVJUX00pCisKK3N0cnVjdCBjcGxfcnhfcGh5c19kc2dsIHsKKwlfX2JlMzIgb3BfdG9fdGlkOworCV9fYmUzMiBwY2lybHhvcmRlcl90b19ub29mc2dlbnRyOworCXN0cnVjdCByc3NfaGVhZGVyIHJzc19oZHJfaW50OworfTsKKworI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX09QQ09ERV9TICAgICAgIDI0CisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfT1BDT0RFX00gICAgICAgMHhmZgorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX09QQ09ERV9WKHgpICAgICgoeCkgPDwgQ1BMX1JYX1BIWVNfRFNHTF9PUENPREVfUykKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9PUENPREVfRyh4KSAgICBcCisJKCgoeCkgPj4gQ1BMX1JYX1BIWVNfRFNHTF9PUENPREVfUykgJiBDUExfUlhfUEhZU19EU0dMX09QQ09ERV9NKQorCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfSVNSRE1BX1MgICAgICAgMjMKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9JU1JETUFfTSAgICAgICAweDEKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9JU1JETUFfVih4KSAgICAoKHgpIDw8IENQTF9SWF9QSFlTX0RTR0xfSVNSRE1BX1MpCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfSVNSRE1BX0coeCkgICAgXAorCSgoKHgpID4+IENQTF9SWF9QSFlTX0RTR0xfSVNSRE1BX1MpICYgQ1BMX1JYX1BIWVNfRFNHTF9JU1JETUFfTSkKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9JU1JETUFfRiAgICAgICBDUExfUlhfUEhZU19EU0dMX0lTUkRNQV9WKDFVKQorCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUlNWRDFfUyAgICAgICAgMjAKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9SU1ZEMV9NICAgICAgICAweDcKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9SU1ZEMV9WKHgpICAgICAoKHgpIDw8IENQTF9SWF9QSFlTX0RTR0xfUlNWRDFfUykKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9SU1ZEMV9HKHgpICAgICBcCisJKCgoeCkgPj4gQ1BMX1JYX1BIWVNfRFNHTF9SU1ZEMV9TKSAmIFwKKwkgQ1BMX1JYX1BIWVNfRFNHTF9SU1ZEMV9NKQorCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJUkxYT1JERVJfUyAgICAgICAgICAzMQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSVJMWE9SREVSX00gICAgICAgICAgMHgxCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJUkxYT1JERVJfVih4KSAgICAgICBcCisJKCh4KSA8PCBDUExfUlhfUEhZU19EU0dMX1BDSVJMWE9SREVSX1MpCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJUkxYT1JERVJfRyh4KSAgICAgICBcCisJKCgoeCkgPj4gQ1BMX1JYX1BIWVNfRFNHTF9QQ0lSTFhPUkRFUl9TKSAmIFwKKwkgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lSTFhPUkRFUl9NKQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSVJMWE9SREVSX0YgIENQTF9SWF9QSFlTX0RTR0xfUENJUkxYT1JERVJfVigxVSkKKworI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSU5PU05PT1BfUyAgICAgICAgICAgMzAKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lOT1NOT09QX00gICAgICAgICAgIDB4MQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSU5PU05PT1BfVih4KSAgICAgICAgXAorCSgoeCkgPDwgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lOT1NOT09QX1MpCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJTk9TTk9PUF9HKHgpICAgICAgICBcCisJKCgoeCkgPj4gQ1BMX1JYX1BIWVNfRFNHTF9QQ0lOT1NOT09QX1MpICYgXAorCSBDUExfUlhfUEhZU19EU0dMX1BDSU5PU05PT1BfTSkKKworI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSU5PU05PT1BfRiAgIENQTF9SWF9QSFlTX0RTR0xfUENJTk9TTk9PUF9WKDFVKQorCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRFTkJfUyAgICAgICAgICAyOQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5URU5CX00gICAgICAgICAgMHgxCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRFTkJfVih4KSAgICAgICBcCisJKCh4KSA8PCBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5URU5CX1MpCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRFTkJfRyh4KSAgICAgICBcCisJKCgoeCkgPj4gQ1BMX1JYX1BIWVNfRFNHTF9QQ0lUUEhOVEVOQl9TKSAmIFwKKwkgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lUUEhOVEVOQl9NKQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5URU5CX0YgIENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRFTkJfVigxVSkKKworI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5UX1MgICAgIDI3CisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRfTSAgICAgMHgzCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRfVih4KSAgKCh4KSA8PCBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5UX1MpCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRfRyh4KSAgXAorCSgoKHgpID4+IENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRfUykgJiBcCisJIENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRfTSkKKworI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX0RDQUlEX1MgICAgICAgIDE2CisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfRENBSURfTSAgICAgICAgMHg3ZmYKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9EQ0FJRF9WKHgpICAgICAoKHgpIDw8IENQTF9SWF9QSFlTX0RTR0xfRENBSURfUykKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9EQ0FJRF9HKHgpICAgICBcCisJKCgoeCkgPj4gQ1BMX1JYX1BIWVNfRFNHTF9EQ0FJRF9TKSAmIFwKKwkgQ1BMX1JYX1BIWVNfRFNHTF9EQ0FJRF9NKQorCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfTk9PRlNHRU5UUl9TICAgICAgICAgICAwCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfTk9PRlNHRU5UUl9NICAgICAgICAgICAweGZmZmYKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9OT09GU0dFTlRSX1YoeCkgICAgICAgIFwKKwkoKHgpIDw8IENQTF9SWF9QSFlTX0RTR0xfTk9PRlNHRU5UUl9TKQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX05PT0ZTR0VOVFJfRyh4KSAgICAgICAgXAorCSgoKHgpID4+IENQTF9SWF9QSFlTX0RTR0xfTk9PRlNHRU5UUl9TKSAmIFwKKwkgQ1BMX1JYX1BIWVNfRFNHTF9OT09GU0dFTlRSX00pCisKICNlbmRpZiAgLyogX19UNF9NU0dfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NGZ3X2FwaS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NGZ3X2FwaS5oCmluZGV4IGE4OWIzMDcuLjRiNThiMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRmd19hcGkuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0ZndfYXBpLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDQgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNCBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTEwMiw2ICsxMDIsNyBAQAogCUZXX1JJX0ZSX05TTVJfV1IgICAgICAgICAgICAgICA9IDB4MTksCiAJRldfUklfSU5WX0xTVEFHX1dSICAgICAgICAgICAgID0gMHgxYSwKIAlGV19JU0NTSV9UWF9EQVRBX1dSCSAgICAgICA9IDB4NDUsCisJRldfQ1JZUFRPX0xPT0tBU0lERV9XUiAgICAgICAgID0gMFg2ZCwKIAlGV19MQVNUQzJFX1dSICAgICAgICAgICAgICAgICAgPSAweDcwCiB9OwogCkBAIC02ODAsNiArNjgxLDcgQEAKIAlGV19SU1NfSU5EX1RCTF9DTUQgICAgICAgICAgICAgPSAweDIwLAogCUZXX1JTU19HTEJfQ09ORklHX0NNRCAgICAgICAgICA9IDB4MjIsCiAJRldfUlNTX1ZJX0NPTkZJR19DTUQgICAgICAgICAgID0gMHgyMywKKwlGV19TQ0hFRF9DTUQgICAgICAgICAgICAgICAgICAgPSAweDI0LAogCUZXX0RFVkxPR19DTUQgICAgICAgICAgICAgICAgICA9IDB4MjUsCiAJRldfQ0xJUF9DTUQgICAgICAgICAgICAgICAgICAgID0gMHgyOCwKIAlGV19MQVNUQzJFX0NNRCAgICAgICAgICAgICAgICAgPSAweDQwLApAQCAtMTA2MCw3ICsxMDYyLDcgQEAKIAlfX2JlMTYgbmljY2FwczsKIAlfX2JlMTYgb2ZsZGNhcHM7CiAJX19iZTE2IHJkbWFjYXBzOwotCV9fYmUxNiByNDsKKwlfX2JlMTYgY3J5cHRvY2FwczsKIAlfX2JlMTYgaXNjc2ljYXBzOwogCV9fYmUxNiBmY29lY2FwczsKIAlfX2JlMzIgY2Zjc3VtOwpAQCAtMjI2NSw2ICsyMjY3LDEyIEBACiAJRldfUE9SVF9DQVBfODAyXzNfQVNNX0RJUgk9IDB4ODAwMCwKIH07CiAKKyNkZWZpbmUgRldfUE9SVF9DQVBfU1BFRURfUyAgICAgMAorI2RlZmluZSBGV19QT1JUX0NBUF9TUEVFRF9NICAgICAweDNmCisjZGVmaW5lIEZXX1BPUlRfQ0FQX1NQRUVEX1YoeCkgICgoeCkgPDwgRldfUE9SVF9DQVBfU1BFRURfUykKKyNkZWZpbmUgRldfUE9SVF9DQVBfU1BFRURfRyh4KSBcCisJKCgoeCkgPj4gRldfUE9SVF9DQVBfU1BFRURfUykgJiBGV19QT1JUX0NBUF9TUEVFRF9NKQorCiBlbnVtIGZ3X3BvcnRfbWRpIHsKIAlGV19QT1JUX0NBUF9NRElfVU5DSEFOR0VELAogCUZXX1BPUlRfQ0FQX01ESV9BVVRPLApAQCAtMjk2MSw2ICsyOTY5LDQxIEBACiAjZGVmaW5lIEZXX1JTU19WSV9DT05GSUdfQ01EX1VEUEVOX1YoeCkJKCh4KSA8PCBGV19SU1NfVklfQ09ORklHX0NNRF9VRFBFTl9TKQogI2RlZmluZSBGV19SU1NfVklfQ09ORklHX0NNRF9VRFBFTl9GCUZXX1JTU19WSV9DT05GSUdfQ01EX1VEUEVOX1YoMVUpCiAKK2VudW0gZndfc2NoZWRfc2MgeworCUZXX1NDSEVEX1NDX1BBUkFNUwkJPSAxLAorfTsKKworc3RydWN0IGZ3X3NjaGVkX2NtZCB7CisJX19iZTMyIG9wX3RvX3dyaXRlOworCV9fYmUzMiByZXR2YWxfbGVuMTY7CisJdW5pb24gZndfc2NoZWQgeworCQlzdHJ1Y3QgZndfc2NoZWRfY29uZmlnIHsKKwkJCV9fdTggICBzYzsKKwkJCV9fdTggICB0eXBlOworCQkJX191OCAgIG1pbm1heGVuOworCQkJX191OCAgIHIzWzVdOworCQkJX191OCAgIG5jbGFzc2VzWzRdOworCQkJX19iZTMyIHI0OworCQl9IGNvbmZpZzsKKwkJc3RydWN0IGZ3X3NjaGVkX3BhcmFtcyB7CisJCQlfX3U4ICAgc2M7CisJCQlfX3U4ICAgdHlwZTsKKwkJCV9fdTggICBsZXZlbDsKKwkJCV9fdTggICBtb2RlOworCQkJX191OCAgIHVuaXQ7CisJCQlfX3U4ICAgcmF0ZTsKKwkJCV9fdTggICBjaDsKKwkJCV9fdTggICBjbDsKKwkJCV9fYmUzMiBtaW47CisJCQlfX2JlMzIgbWF4OworCQkJX19iZTE2IHdlaWdodDsKKwkJCV9fYmUxNiBwa3RzaXplOworCQkJX19iZTE2IGJ1cnN0c2l6ZTsKKwkJCV9fYmUxNiByNDsKKwkJfSBwYXJhbXM7CisJfSB1OworfTsKKwogc3RydWN0IGZ3X2NsaXBfY21kIHsKIAlfX2JlMzIgb3BfdG9fd3JpdGU7CiAJX19iZTMyIGFsbG9jX3RvX2xlbjE2OwpAQCAtMzI0OSw0ICszMjkyLDEyNyBAQAogI2RlZmluZSBQQ0lFX0ZXX1BGX0RFVkxPR19NRU1UWVBFX0coeCkgXAogCSgoKHgpID4+IFBDSUVfRldfUEZfREVWTE9HX01FTVRZUEVfUykgJiBQQ0lFX0ZXX1BGX0RFVkxPR19NRU1UWVBFX00pCiAKKyNkZWZpbmUgTUFYX0lNTV9PRkxEX1RYX0RBVEFfV1JfTEVOICgweGZmICsgc2l6ZW9mKHN0cnVjdCBmd19vZmxkX3R4X2RhdGFfd3IpKQorCitzdHJ1Y3QgZndfY3J5cHRvX2xvb2thc2lkZV93ciB7CisJX19iZTMyIG9wX3RvX2NjdHhfc2l6ZTsKKwlfX2JlMzIgbGVuMTZfcGtkOworCV9fYmUzMiBzZXNzaW9uX2lkOworCV9fYmUzMiByeF9jaGlkX3RvX3J4X3FfaWQ7CisJX19iZTMyIGtleV9hZGRyOworCV9fYmUzMiBwbGRfc2l6ZV9oYXNoX3NpemU7CisJX19iZTY0IGNvb2tpZTsKK307CisKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9PUENPREVfUyAyNAorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX09QQ09ERV9NIDB4ZmYKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9PUENPREVfVih4KSBcCisJKCh4KSA8PCBGV19DUllQVE9fTE9PS0FTSURFX1dSX09QQ09ERV9TKQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX09QQ09ERV9HKHgpIFwKKwkoKCh4KSA+PiBGV19DUllQVE9fTE9PS0FTSURFX1dSX09QQ09ERV9TKSAmIFwKKwkgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9PUENPREVfTSkKKworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NPTVBMX1MgMjMKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DT01QTF9NIDB4MQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NPTVBMX1YoeCkgXAorCSgoeCkgPDwgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DT01QTF9TKQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NPTVBMX0coeCkgXAorCSgoKHgpID4+IEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ09NUExfUykgJiBcCisJIEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ09NUExfTSkKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DT01QTF9GIEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ09NUExfVigxVSkKKworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0lNTV9MRU5fUyAxNQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0lNTV9MRU5fTSAweGZmCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfSU1NX0xFTl9WKHgpIFwKKwkoKHgpIDw8IEZXX0NSWVBUT19MT09LQVNJREVfV1JfSU1NX0xFTl9TKQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0lNTV9MRU5fRyh4KSBcCisJKCgoeCkgPj4gRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9JTU1fTEVOX1MpICYgXAorCSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0lNTV9MRU5fTSkKKworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NDVFhfTE9DX1MgNQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NDVFhfTE9DX00gMHgzCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9MT0NfVih4KSBcCisJKCh4KSA8PCBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NDVFhfTE9DX1MpCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9MT0NfRyh4KSBcCisJKCgoeCkgPj4gRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DQ1RYX0xPQ19TKSAmIFwKKwkgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DQ1RYX0xPQ19NKQorCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9TSVpFX1MgMAorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NDVFhfU0laRV9NIDB4MWYKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DQ1RYX1NJWkVfVih4KSBcCisJKCh4KSA8PCBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NDVFhfU0laRV9TKQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NDVFhfU0laRV9HKHgpIFwKKwkoKCh4KSA+PiBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NDVFhfU0laRV9TKSAmIFwKKwkgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DQ1RYX1NJWkVfTSkKKworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0xFTjE2X1MgMAorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0xFTjE2X00gMHhmZgorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0xFTjE2X1YoeCkgXAorCSgoeCkgPDwgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9MRU4xNl9TKQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0xFTjE2X0coeCkgXAorCSgoKHgpID4+IEZXX0NSWVBUT19MT09LQVNJREVfV1JfTEVOMTZfUykgJiBcCisJIEZXX0NSWVBUT19MT09LQVNJREVfV1JfTEVOMTZfTSkKKworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX0NISURfUyAyOQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX0NISURfTSAweDMKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9SWF9DSElEX1YoeCkgXAorCSgoeCkgPDwgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9SWF9DSElEX1MpCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUlhfQ0hJRF9HKHgpIFwKKwkoKCh4KSA+PiBGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX0NISURfUykgJiBcCisJIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUlhfQ0hJRF9NKQorCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfTENCX1MgIDI3CisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfTENCX00gIDB4MworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0xDQl9WKHgpIFwKKwkoKHgpIDw8IEZXX0NSWVBUT19MT09LQVNJREVfV1JfTENCX1MpCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfTENCX0coeCkgXAorCSgoKHgpID4+IEZXX0NSWVBUT19MT09LQVNJREVfV1JfTENCX1MpICYgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9MQ0JfTSkKKworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1BIQVNIX1MgMjUKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9QSEFTSF9NIDB4MworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1BIQVNIX1YoeCkgXAorCSgoeCkgPDwgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9QSEFTSF9TKQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1BIQVNIX0coeCkgXAorCSgoKHgpID4+IEZXX0NSWVBUT19MT09LQVNJREVfV1JfUEhBU0hfUykgJiBcCisJIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUEhBU0hfTSkKKworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0lWX1MgICAyMworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0lWX00gICAweDMKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9JVl9WKHgpIFwKKwkoKHgpIDw8IEZXX0NSWVBUT19MT09LQVNJREVfV1JfSVZfUykKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9JVl9HKHgpIFwKKwkoKCh4KSA+PiBGV19DUllQVE9fTE9PS0FTSURFX1dSX0lWX1MpICYgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9JVl9NKQorCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfVFhfQ0hfUyAxMAorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1RYX0NIX00gMHgzCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfVFhfQ0hfVih4KSBcCisJKCh4KSA8PCBGV19DUllQVE9fTE9PS0FTSURFX1dSX1RYX0NIX1MpCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfVFhfQ0hfRyh4KSBcCisJKCgoeCkgPj4gRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9UWF9DSF9TKSAmIFwKKwkgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9UWF9DSF9NKQorCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUlhfUV9JRF9TIDAKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9SWF9RX0lEX00gMHgzZmYKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9SWF9RX0lEX1YoeCkgXAorCSgoeCkgPDwgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9SWF9RX0lEX1MpCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUlhfUV9JRF9HKHgpIFwKKwkoKCh4KSA+PiBGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX1FfSURfUykgJiBcCisJIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUlhfUV9JRF9NKQorCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUExEX1NJWkVfUyAyNAorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1BMRF9TSVpFX00gMHhmZgorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1BMRF9TSVpFX1YoeCkgXAorCSgoeCkgPDwgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9QTERfU0laRV9TKQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1BMRF9TSVpFX0coeCkgXAorCSgoKHgpID4+IEZXX0NSWVBUT19MT09LQVNJREVfV1JfUExEX1NJWkVfUykgJiBcCisJIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUExEX1NJWkVfTSkKKworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0hBU0hfU0laRV9TIDE3CisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfSEFTSF9TSVpFX00gMHg3ZgorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0hBU0hfU0laRV9WKHgpIFwKKwkoKHgpIDw8IEZXX0NSWVBUT19MT09LQVNJREVfV1JfSEFTSF9TSVpFX1MpCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfSEFTSF9TSVpFX0coeCkgXAorCSgoKHgpID4+IEZXX0NSWVBUT19MT09LQVNJREVfV1JfSEFTSF9TSVpFX1MpICYgXAorCSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0hBU0hfU0laRV9NKQorCiAjZW5kaWYgLyogX1Q0RldfSU5URVJGQUNFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvY3hnYjR2Zl9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvY3hnYjR2Zl9tYWluLmMKaW5kZXggZTExNmJiOC4uMTAwYjJjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL2N4Z2I0dmZfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi9jeGdiNHZmX21haW4uYwpAQCAtMjM3OCw3ICsyMzc4LDcgQEAKIAkgKi8KIAlwbWFza19ucG9ydHMgPSBod2VpZ2h0MzIoYWRhcHRlci0+cGFyYW1zLnZmcmVzLnBtYXNrKTsKIAlpZiAocG1hc2tfbnBvcnRzIDwgYWRhcHRlci0+cGFyYW1zLm5wb3J0cykgewotCQlkZXZfd2FybihhZGFwdGVyLT5wZGV2X2RldiwgIm9ubHkgdXNpbmcgJWQgb2YgJWQgcHJvdmlzc2lvbmVkIgorCQlkZXZfd2FybihhZGFwdGVyLT5wZGV2X2RldiwgIm9ubHkgdXNpbmcgJWQgb2YgJWQgcHJvdmlzaW9uZWQiCiAJCQkgIiB2aXJ0dWFsIGludGVyZmFjZXM7IGxpbWl0ZWQgYnkgUG9ydCBBY2Nlc3MgUmlnaHRzIgogCQkJICIgbWFzayAlI3hcbiIsIHBtYXNrX25wb3J0cywgYWRhcHRlci0+cGFyYW1zLm5wb3J0cywKIAkJCSBhZGFwdGVyLT5wYXJhbXMudmZyZXMucG1hc2spOwpAQCAtMjc3Nyw2ICsyNzc3LDcgQEAKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcjsKIAlzdHJ1Y3QgcG9ydF9pbmZvICpwaTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXVuc2lnbmVkIGludCBwZjsKIAogCS8qCiAJICogUHJpbnQgb3VyIGRyaXZlciBiYW5uZXIgdGhlIGZpcnN0IHRpbWUgd2UncmUgY2FsbGVkIHRvIGluaXRpYWxpemUgYQpAQCAtMjkwMyw4ICsyOTA0LDExIEBACiAJICogQWxsb2NhdGUgb3VyICJhZGFwdGVyIHBvcnRzIiBhbmQgc3RpdGNoIGV2ZXJ5dGhpbmcgdG9nZXRoZXIuCiAJICovCiAJcG1hc2sgPSBhZGFwdGVyLT5wYXJhbXMudmZyZXMucG1hc2s7CisJcGYgPSB0NHZmX2dldF9wZl9mcm9tX3ZmKGFkYXB0ZXIpOwogCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgcGlkeCkgewogCQlpbnQgcG9ydF9pZCwgdmlpZDsKKwkJdTggbWFjW0VUSF9BTEVOXTsKKwkJdW5zaWduZWQgaW50IG5hZGRyID0gMTsKIAogCQkvKgogCQkgKiBXZSBzaW1wbGlzdGljYWxseSBhbGxvY2F0ZSBvdXIgdmlydHVhbCBpbnRlcmZhY2VzCkBAIC0yOTc1LDYgKzI5NzksMjYgQEAKIAkJCQlwaWR4KTsKIAkJCWdvdG8gZXJyX2ZyZWVfZGV2OwogCQl9CisKKwkJZXJyID0gdDR2Zl9nZXRfdmZfbWFjX2FjbChhZGFwdGVyLCBwZiwgJm5hZGRyLCBtYWMpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJInVuYWJsZSB0byBkZXRlcm1pbmUgTUFDIEFDTCBhZGRyZXNzLCAiCisJCQkJImNvbnRpbnVpbmcgYW55d2F5Li4gKHN0YXR1cyAlZClcbiIsIGVycik7CisJCX0gZWxzZSBpZiAobmFkZHIgJiYgYWRhcHRlci0+cGFyYW1zLnZmcmVzLm52aSA9PSAxKSB7CisJCQlzdHJ1Y3Qgc29ja2FkZHIgYWRkcjsKKworCQkJZXRoZXJfYWRkcl9jb3B5KGFkZHIuc2FfZGF0YSwgbWFjKTsKKwkJCWVyciA9IGN4Z2I0dmZfc2V0X21hY19hZGRyKG5ldGRldiwgJmFkZHIpOworCQkJaWYgKGVycikgeworCQkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkJInVuYWJsZSB0byBzZXQgTUFDIGFkZHJlc3MgJXBNXG4iLAorCQkJCQltYWMpOworCQkJCWdvdG8gZXJyX2ZyZWVfZGV2OworCQkJfQorCQkJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJCQkgIlVzaW5nIGFzc2lnbmVkIE1BQyBBQ0w6ICVwTVxuIiwgbWFjKTsKKwkJfQogCX0KIAogCS8qIFNlZSB3aGF0IGludGVycnVwdHMgd2UnbGwgYmUgdXNpbmcuICBJZiB3ZSd2ZSBiZWVuIGNvbmZpZ3VyZWQgdG8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi9zZ2UuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi9zZ2UuYwppbmRleCBjOGZkNGY4Li5mM2VkOWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvc2dlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3NnZS5jCkBAIC0xNjQ4LDE0ICsxNjQ4LDE1IEBACiAKIAlpZiAoY3N1bV9vayAmJiAhcGt0LT5lcnJfdmVjICYmCiAJICAgIChiZTMyX3RvX2NwdShwa3QtPmwyaW5mbykgJiAoUlhGX1VEUF9GIHwgUlhGX1RDUF9GKSkpIHsKLQkJaWYgKCFwa3QtPmlwX2ZyYWcpCisJCWlmICghcGt0LT5pcF9mcmFnKSB7CiAJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwotCQllbHNlIHsKKwkJCXJ4cS0+c3RhdHMucnhfY3NvKys7CisJCX0gZWxzZSBpZiAocGt0LT5sMmluZm8gJiBodG9ubChSWEZfSVBfRikpIHsKIAkJCV9fc3VtMTYgYyA9IChfX2ZvcmNlIF9fc3VtMTYpcGt0LT5jc3VtOwogCQkJc2tiLT5jc3VtID0gY3N1bV91bmZvbGQoYyk7CiAJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0NPTVBMRVRFOworCQkJcnhxLT5zdGF0cy5yeF9jc28rKzsKIAkJfQotCQlyeHEtPnN0YXRzLnJ4X2NzbysrOwogCX0gZWxzZQogCQlza2JfY2hlY2tzdW1fbm9uZV9hc3NlcnQoc2tiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3Q0dmZfY29tbW9uLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvdDR2Zl9jb21tb24uaAppbmRleCA4ZWU1NDE0Li5iMzkwM2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvdDR2Zl9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvdDR2Zl9jb21tb24uaApAQCAtMTA4LDggKzEwOCw4IEBACiAJdW5zaWduZWQgaW50ICAgc3VwcG9ydGVkOyAgICAgICAgLyogbGluayBjYXBhYmlsaXRpZXMgKi8KIAl1bnNpZ25lZCBpbnQgICBhZHZlcnRpc2luZzsgICAgICAvKiBhZHZlcnRpc2VkIGNhcGFiaWxpdGllcyAqLwogCXVuc2lnbmVkIHNob3J0IGxwX2FkdmVydGlzaW5nOyAgIC8qIHBlZXIgYWR2ZXJ0aXNlZCBjYXBhYmlsaXRpZXMgKi8KLQl1bnNpZ25lZCBzaG9ydCByZXF1ZXN0ZWRfc3BlZWQ7ICAvKiBzcGVlZCB1c2VyIGhhcyByZXF1ZXN0ZWQgKi8KLQl1bnNpZ25lZCBzaG9ydCBzcGVlZDsgICAgICAgICAgICAvKiBhY3R1YWwgbGluayBzcGVlZCAqLworCXVuc2lnbmVkIGludCAgIHJlcXVlc3RlZF9zcGVlZDsgIC8qIHNwZWVkIHVzZXIgaGFzIHJlcXVlc3RlZCAqLworCXVuc2lnbmVkIGludCAgIHNwZWVkOyAgICAgICAgICAgIC8qIGFjdHVhbCBsaW5rIHNwZWVkICovCiAJdW5zaWduZWQgY2hhciAgcmVxdWVzdGVkX2ZjOyAgICAgLyogZmxvdyBjb250cm9sIHVzZXIgaGFzIHJlcXVlc3RlZCAqLwogCXVuc2lnbmVkIGNoYXIgIGZjOyAgICAgICAgICAgICAgIC8qIGFjdHVhbCBsaW5rIGZsb3cgY29udHJvbCAqLwogCXVuc2lnbmVkIGNoYXIgIGF1dG9uZWc7ICAgICAgICAgIC8qIGF1dG9uZWdvdGlhdGluZz8gKi8KQEAgLTI3MSwxMCArMjcxLDE3IEBACiAJcmV0dXJuIChsYy0+c3VwcG9ydGVkICYgRldfUE9SVF9DQVBfU1BFRURfMTBHKSAhPSAwOwogfQogCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgTGluayBDb25maWd1cmF0aW9uIHN1cHBvcnRzICJIaWdoIFNwZWVkcyIgKHRob3NlIGdyZWF0ZXIKKyAqIHRoYW4gMUdiL3MpLgorICovCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNfeF8xMGdfcG9ydChjb25zdCBzdHJ1Y3QgbGlua19jb25maWcgKmxjKQogewotCXJldHVybiAobGMtPnN1cHBvcnRlZCAmIEZXX1BPUlRfQ0FQX1NQRUVEXzEwRykgIT0gMCB8fAotCQkobGMtPnN1cHBvcnRlZCAmIEZXX1BPUlRfQ0FQX1NQRUVEXzQwRykgIT0gMDsKKwl1bnNpZ25lZCBpbnQgc3BlZWRzLCBoaWdoX3NwZWVkczsKKworCXNwZWVkcyA9IEZXX1BPUlRfQ0FQX1NQRUVEX1YoRldfUE9SVF9DQVBfU1BFRURfRyhsYy0+c3VwcG9ydGVkKSk7CisJaGlnaF9zcGVlZHMgPSBzcGVlZHMgJiB+KEZXX1BPUlRfQ0FQX1NQRUVEXzEwME0gfCBGV19QT1JUX0NBUF9TUEVFRF8xRyk7CisKKwlyZXR1cm4gaGlnaF9zcGVlZHMgIT0gMDsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY29yZV90aWNrc19wZXJfdXNlYyhjb25zdCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKQEAgLTM0Nyw2ICszNTQsNyBAQAogCQkJdTY0ICpwYmFyMl9xb2Zmc2V0LAogCQkJdW5zaWduZWQgaW50ICpwYmFyMl9xaWQpOwogCit1bnNpZ25lZCBpbnQgdDR2Zl9nZXRfcGZfZnJvbV92ZihzdHJ1Y3QgYWRhcHRlciAqKTsKIGludCB0NHZmX2dldF9zZ2VfcGFyYW1zKHN0cnVjdCBhZGFwdGVyICopOwogaW50IHQ0dmZfZ2V0X3ZwZF9wYXJhbXMoc3RydWN0IGFkYXB0ZXIgKik7CiBpbnQgdDR2Zl9nZXRfZGV2X3BhcmFtcyhzdHJ1Y3QgYWRhcHRlciAqKTsKQEAgLTM4MSw1ICszODksNyBAQAogCiBpbnQgdDR2Zl9oYW5kbGVfZndfcnBsKHN0cnVjdCBhZGFwdGVyICosIGNvbnN0IF9fYmU2NCAqKTsKIGludCB0NHZmX3ByZXBfYWRhcHRlcihzdHJ1Y3QgYWRhcHRlciAqKTsKK2ludCB0NHZmX2dldF92Zl9tYWNfYWNsKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgcGYsCisJCQl1bnNpZ25lZCBpbnQgKm5hZGRyLCB1OCAqYWRkcik7CiAKICNlbmRpZiAvKiBfX1Q0VkZfQ09NTU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3Q0dmZfaHcuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi90NHZmX2h3LmMKaW5kZXggNDI3YmZhNy4uZTk4MjQ4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3Q0dmZfaHcuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvdDR2Zl9ody5jCkBAIC0zMTQsOCArMzE0LDkgQEAKIH0KIAogI2RlZmluZSBBRFZFUlRfTUFTSyAoRldfUE9SVF9DQVBfU1BFRURfMTAwTSB8IEZXX1BPUlRfQ0FQX1NQRUVEXzFHIHxcCi0JCSAgICAgRldfUE9SVF9DQVBfU1BFRURfMTBHIHwgRldfUE9SVF9DQVBfU1BFRURfNDBHIHwgXAotCQkgICAgIEZXX1BPUlRfQ0FQX1NQRUVEXzEwMEcgfCBGV19QT1JUX0NBUF9BTkVHKQorCQkgICAgIEZXX1BPUlRfQ0FQX1NQRUVEXzEwRyB8IEZXX1BPUlRfQ0FQX1NQRUVEXzI1RyB8IFwKKwkJICAgICBGV19QT1JUX0NBUF9TUEVFRF80MEcgfCBGV19QT1JUX0NBUF9TUEVFRF8xMDBHIHwgXAorCQkgICAgIEZXX1BPUlRfQ0FQX0FORUcpCiAKIC8qKgogICoJaW5pdF9saW5rX2NvbmZpZyAtIGluaXRpYWxpemUgYSBsaW5rJ3MgU1cgc3RhdGUKQEAgLTYzOSw2ICs2NDAsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAordW5zaWduZWQgaW50IHQ0dmZfZ2V0X3BmX2Zyb21fdmYoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIHdob2FtaTsKKworCXdob2FtaSA9IHQ0X3JlYWRfcmVnKGFkYXB0ZXIsIFQ0VkZfUExfQkFTRV9BRERSICsgUExfVkZfV0hPQU1JX0EpOworCXJldHVybiAoQ0hFTFNJT19DSElQX1ZFUlNJT04oYWRhcHRlci0+cGFyYW1zLmNoaXApIDw9IENIRUxTSU9fVDUgPworCQkJU09VUkNFUEZfRyh3aG9hbWkpIDogVDZfU09VUkNFUEZfRyh3aG9hbWkpKTsKK30KKwogLyoqCiAgKgl0NHZmX2dldF9zZ2VfcGFyYW1zIC0gcmV0cmlldmUgYWRhcHRlciBTY2F0dGVyIGdhdGhlciBFbmdpbmUgcGFyYW1ldGVycwogICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCkBAIC03MTYsNyArNzI2LDYgQEAKIAkgKiByZWFkLgogCSAqLwogCWlmICghaXNfdDQoYWRhcHRlci0+cGFyYW1zLmNoaXApKSB7Ci0JCXUzMiB3aG9hbWk7CiAJCXVuc2lnbmVkIGludCBwZiwgc19ocHMsIHNfcXBwOwogCiAJCXBhcmFtc1swXSA9IChGV19QQVJBTVNfTU5FTV9WKEZXX1BBUkFNU19NTkVNX1JFRykgfApAQCAtNzQwLDExICs3NDksNyBAQAogCQkgKiByZWdpc3RlciB3ZSBqdXN0IHJlYWQuIERvIGl0IG9uY2UgaGVyZSBzbyBvdGhlciBjb2RlIGluCiAJCSAqIHRoZSBkcml2ZXIgY2FuIGp1c3QgdXNlIGl0LgogCQkgKi8KLQkJd2hvYW1pID0gdDRfcmVhZF9yZWcoYWRhcHRlciwKLQkJCQkgICAgIFQ0VkZfUExfQkFTRV9BRERSICsgUExfVkZfV0hPQU1JX0EpOwotCQlwZiA9IENIRUxTSU9fQ0hJUF9WRVJTSU9OKGFkYXB0ZXItPnBhcmFtcy5jaGlwKSA8PSBDSEVMU0lPX1Q1ID8KLQkJCVNPVVJDRVBGX0cod2hvYW1pKSA6IFQ2X1NPVVJDRVBGX0cod2hvYW1pKTsKLQorCQlwZiA9IHQ0dmZfZ2V0X3BmX2Zyb21fdmYoYWRhcHRlcik7CiAJCXNfaHBzID0gKEhPU1RQQUdFU0laRVBGMF9TICsKIAkJCSAoSE9TVFBBR0VTSVpFUEYxX1MgLSBIT1NUUEFHRVNJWkVQRjBfUykgKiBwZik7CiAJCXNnZV9wYXJhbXMtPnNnZV92Zl9ocHMgPQpAQCAtMTcxMiw4ICsxNzE3LDEyIEBACiAJCQlzcGVlZCA9IDEwMDA7CiAJCWVsc2UgaWYgKHN0YXQgJiBGV19QT1JUX0NNRF9MU1BFRURfVihGV19QT1JUX0NBUF9TUEVFRF8xMEcpKQogCQkJc3BlZWQgPSAxMDAwMDsKKwkJZWxzZSBpZiAoc3RhdCAmIEZXX1BPUlRfQ01EX0xTUEVFRF9WKEZXX1BPUlRfQ0FQX1NQRUVEXzI1RykpCisJCQlzcGVlZCA9IDI1MDAwOwogCQllbHNlIGlmIChzdGF0ICYgRldfUE9SVF9DTURfTFNQRUVEX1YoRldfUE9SVF9DQVBfU1BFRURfNDBHKSkKIAkJCXNwZWVkID0gNDAwMDA7CisJCWVsc2UgaWYgKHN0YXQgJiBGV19QT1JUX0NNRF9MU1BFRURfVihGV19QT1JUX0NBUF9TUEVFRF8xMDBHKSkKKwkJCXNwZWVkID0gMTAwMDAwOwogCiAJCS8qCiAJCSAqIFNjYW4gYWxsIG9mIG91ciAicG9ydHMiIChWaXJ0dWFsIEludGVyZmFjZXMpIGxvb2tpbmcgZm9yCkBAIC0xODA3LDMgKzE4MTYsNTAgQEAKIAogCXJldHVybiAwOwogfQorCisvKioKKyAqCXQ0dmZfZ2V0X3ZmX21hY19hY2wgLSBHZXQgdGhlIE1BQyBhZGRyZXNzIHRvIGJlIHNldCB0bworICoJCQkgICAgICB0aGUgVkkgb2YgdGhpcyBWRi4KKyAqCUBhZGFwdGVyOiBUaGUgYWRhcHRlcgorICoJQHBmOiBUaGUgcGYgYXNzb2NpYXRlZCB3aXRoIHZmCisgKglAbmFkZHI6IHRoZSBudW1iZXIgb2YgQUNMIE1BQyBhZGRyZXNzZXMgcmV0dXJuZWQgaW4gYWRkcgorICoJQGFkZHI6IFBsYWNlaG9sZGVyIGZvciBNQUMgYWRkcmVzc2VzCisgKgorICoJRmluZCB0aGUgTUFDIGFkZHJlc3MgdG8gYmUgc2V0IHRvIHRoZSBWRidzIFZJLiBUaGUgcmVxdWVzdGVkIE1BQyBhZGRyZXNzCisgKglpcyBmcm9tIHRoZSBob3N0IE9TIHZpYSBjYWxsYmFjayBpbiB0aGUgUEYgZHJpdmVyLgorICovCitpbnQgdDR2Zl9nZXRfdmZfbWFjX2FjbChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IHBmLAorCQkJdW5zaWduZWQgaW50ICpuYWRkciwgdTggKmFkZHIpCit7CisJc3RydWN0IGZ3X2FjbF9tYWNfY21kIGNtZDsKKwlpbnQgcmV0OworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQub3BfdG9fdmZuID0gY3B1X3RvX2JlMzIoRldfQ01EX09QX1YoRldfQUNMX01BQ19DTUQpIHwKKwkJCQkgICAgRldfQ01EX1JFUVVFU1RfRiB8CisJCQkJICAgIEZXX0NNRF9SRUFEX0YpOworCWNtZC5lbl90b19sZW4xNiA9IGNwdV90b19iZTMyKCh1bnNpZ25lZCBpbnQpRldfTEVOMTYoY21kKSk7CisJcmV0ID0gdDR2Zl93cl9tYm94KGFkYXB0ZXIsICZjbWQsIHNpemVvZihjbWQpLCAmY21kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGNtZC5ubWFjIDwgKm5hZGRyKQorCQkqbmFkZHIgPSBjbWQubm1hYzsKKworCXN3aXRjaCAocGYpIHsKKwljYXNlIDM6CisJCW1lbWNweShhZGRyLCBjbWQubWFjYWRkcjMsIHNpemVvZihjbWQubWFjYWRkcjMpKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltZW1jcHkoYWRkciwgY21kLm1hY2FkZHIyLCBzaXplb2YoY21kLm1hY2FkZHIyKSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbWVtY3B5KGFkZHIsIGNtZC5tYWNhZGRyMSwgc2l6ZW9mKGNtZC5tYWNhZGRyMSkpOworCQlicmVhazsKKwljYXNlIDA6CisJCW1lbWNweShhZGRyLCBjbWQubWFjYWRkcjAsIHNpemVvZihjbWQubWFjYWRkcjApKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vbGliY3hnYi9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vbGliY3hnYi9NYWtlZmlsZQppbmRleCAyMzYyMjMwLi4yNTM0ZTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2xpYmN4Z2IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9saWJjeGdiL01ha2VmaWxlCkBAIC0xLDMgKzEsNSBAQAorY2NmbGFncy15IDo9IC1JZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNAorCiBvYmotJChDT05GSUdfQ0hFTFNJT19MSUIpICs9IGxpYmN4Z2IubwogCi1saWJjeGdiLXkgOj0gbGliY3hnYl9wcG0ubworbGliY3hnYi15IDo9IGxpYmN4Z2JfcHBtLm8gbGliY3hnYl9jbS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2xpYmN4Z2IvbGliY3hnYl9jbS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9saWJjeGdiL2xpYmN4Z2JfY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjBkZTViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9saWJjeGdiL2xpYmN4Z2JfY20uYwpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKgkgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKgkgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqCSAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqCSAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKgkgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgorCisjaW5jbHVkZSAibGliY3hnYl9jbS5oIgorCit2b2lkCitjeGdiX2dldF80dHVwbGUoc3RydWN0IGNwbF9wYXNzX2FjY2VwdF9yZXEgKnJlcSwgZW51bSBjaGlwX3R5cGUgdHlwZSwKKwkJaW50ICppcHR5cGUsIF9fdTggKmxvY2FsX2lwLCBfX3U4ICpwZWVyX2lwLAorCQlfX2JlMTYgKmxvY2FsX3BvcnQsIF9fYmUxNiAqcGVlcl9wb3J0KQoreworCWludCBldGhfbGVuID0gKENIRUxTSU9fQ0hJUF9WRVJTSU9OKHR5cGUpIDw9IENIRUxTSU9fVDUpID8KKwkJICAgICAgRVRIX0hEUl9MRU5fRyhiZTMyX3RvX2NwdShyZXEtPmhkcl9sZW4pKSA6CisJCSAgICAgIFQ2X0VUSF9IRFJfTEVOX0coYmUzMl90b19jcHUocmVxLT5oZHJfbGVuKSk7CisJaW50IGlwX2xlbiA9IChDSEVMU0lPX0NISVBfVkVSU0lPTih0eXBlKSA8PSBDSEVMU0lPX1Q1KSA/CisJCSAgICAgSVBfSERSX0xFTl9HKGJlMzJfdG9fY3B1KHJlcS0+aGRyX2xlbikpIDoKKwkJICAgICBUNl9JUF9IRFJfTEVOX0coYmUzMl90b19jcHUocmVxLT5oZHJfbGVuKSk7CisJc3RydWN0IGlwaGRyICppcCA9IChzdHJ1Y3QgaXBoZHIgKikoKHU4ICopKHJlcSArIDEpICsgZXRoX2xlbik7CisJc3RydWN0IGlwdjZoZHIgKmlwNiA9IChzdHJ1Y3QgaXB2NmhkciAqKSgodTggKikocmVxICsgMSkgKyBldGhfbGVuKTsKKwlzdHJ1Y3QgdGNwaGRyICp0Y3AgPSAoc3RydWN0IHRjcGhkciAqKQorCQkJICAgICAoKHU4ICopKHJlcSArIDEpICsgZXRoX2xlbiArIGlwX2xlbik7CisKKwlpZiAoaXAtPnZlcnNpb24gPT0gNCkgeworCQlwcl9kZWJ1ZygiJXMgc2FkZHIgMHgleCBkYWRkciAweCV4IHNwb3J0ICV1IGRwb3J0ICV1XG4iLAorCQkJIF9fZnVuY19fLCBudG9obChpcC0+c2FkZHIpLCBudG9obChpcC0+ZGFkZHIpLAorCQkJIG50b2hzKHRjcC0+c291cmNlKSwgbnRvaHModGNwLT5kZXN0KSk7CisJCSppcHR5cGUgPSA0OworCQltZW1jcHkocGVlcl9pcCwgJmlwLT5zYWRkciwgNCk7CisJCW1lbWNweShsb2NhbF9pcCwgJmlwLT5kYWRkciwgNCk7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzIHNhZGRyICVwSTYgZGFkZHIgJXBJNiBzcG9ydCAldSBkcG9ydCAldVxuIiwKKwkJCSBfX2Z1bmNfXywgaXA2LT5zYWRkci5zNl9hZGRyLCBpcDYtPmRhZGRyLnM2X2FkZHIsCisJCQkgbnRvaHModGNwLT5zb3VyY2UpLCBudG9ocyh0Y3AtPmRlc3QpKTsKKwkJKmlwdHlwZSA9IDY7CisJCW1lbWNweShwZWVyX2lwLCBpcDYtPnNhZGRyLnM2X2FkZHIsIDE2KTsKKwkJbWVtY3B5KGxvY2FsX2lwLCBpcDYtPmRhZGRyLnM2X2FkZHIsIDE2KTsKKwl9CisJKnBlZXJfcG9ydCA9IHRjcC0+c291cmNlOworCSpsb2NhbF9wb3J0ID0gdGNwLT5kZXN0OworfQorRVhQT1JUX1NZTUJPTChjeGdiX2dldF80dHVwbGUpOworCitzdGF0aWMgYm9vbAorY3hnYl9vdXJfaW50ZXJmYWNlKHN0cnVjdCBjeGdiNF9sbGRfaW5mbyAqbGxkaSwKKwkJICAgc3RydWN0IG5ldF9kZXZpY2UgKigqZ2V0X3JlYWxfZGV2KShzdHJ1Y3QgbmV0X2RldmljZSAqKSwKKwkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmVncmVzc19kZXYpCit7CisJaW50IGk7CisKKwllZ3Jlc3NfZGV2ID0gZ2V0X3JlYWxfZGV2KGVncmVzc19kZXYpOworCWZvciAoaSA9IDA7IGkgPCBsbGRpLT5ucG9ydHM7IGkrKykKKwkJaWYgKGxsZGktPnBvcnRzW2ldID09IGVncmVzc19kZXYpCisJCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0cnVjdCBkc3RfZW50cnkgKgorY3hnYl9maW5kX3JvdXRlKHN0cnVjdCBjeGdiNF9sbGRfaW5mbyAqbGxkaSwKKwkJc3RydWN0IG5ldF9kZXZpY2UgKigqZ2V0X3JlYWxfZGV2KShzdHJ1Y3QgbmV0X2RldmljZSAqKSwKKwkJX19iZTMyIGxvY2FsX2lwLCBfX2JlMzIgcGVlcl9pcCwgX19iZTE2IGxvY2FsX3BvcnQsCisJCV9fYmUxNiBwZWVyX3BvcnQsIHU4IHRvcykKK3sKKwlzdHJ1Y3QgcnRhYmxlICpydDsKKwlzdHJ1Y3QgZmxvd2k0IGZsNDsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuOworCisJcnQgPSBpcF9yb3V0ZV9vdXRwdXRfcG9ydHMoJmluaXRfbmV0LCAmZmw0LCBOVUxMLCBwZWVyX2lwLCBsb2NhbF9pcCwKKwkJCQkgICBwZWVyX3BvcnQsIGxvY2FsX3BvcnQsIElQUFJPVE9fVENQLAorCQkJCSAgIHRvcywgMCk7CisJaWYgKElTX0VSUihydCkpCisJCXJldHVybiBOVUxMOworCW4gPSBkc3RfbmVpZ2hfbG9va3VwKCZydC0+ZHN0LCAmcGVlcl9pcCk7CisJaWYgKCFuKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIWN4Z2Jfb3VyX2ludGVyZmFjZShsbGRpLCBnZXRfcmVhbF9kZXYsIG4tPmRldikgJiYKKwkgICAgIShuLT5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSkgeworCQluZWlnaF9yZWxlYXNlKG4pOworCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CisJCXJldHVybiBOVUxMOworCX0KKwluZWlnaF9yZWxlYXNlKG4pOworCXJldHVybiAmcnQtPmRzdDsKK30KK0VYUE9SVF9TWU1CT0woY3hnYl9maW5kX3JvdXRlKTsKKworc3RydWN0IGRzdF9lbnRyeSAqCitjeGdiX2ZpbmRfcm91dGU2KHN0cnVjdCBjeGdiNF9sbGRfaW5mbyAqbGxkaSwKKwkJIHN0cnVjdCBuZXRfZGV2aWNlICooKmdldF9yZWFsX2Rldikoc3RydWN0IG5ldF9kZXZpY2UgKiksCisJCSBfX3U4ICpsb2NhbF9pcCwgX191OCAqcGVlcl9pcCwgX19iZTE2IGxvY2FsX3BvcnQsCisJCSBfX2JlMTYgcGVlcl9wb3J0LCB1OCB0b3MsIF9fdTMyIHNpbjZfc2NvcGVfaWQpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gTlVMTDsKKworCWlmIChJU19FTkFCTEVEKENPTkZJR19JUFY2KSkgeworCQlzdHJ1Y3QgZmxvd2k2IGZsNjsKKworCQltZW1zZXQoJmZsNiwgMCwgc2l6ZW9mKGZsNikpOworCQltZW1jcHkoJmZsNi5kYWRkciwgcGVlcl9pcCwgMTYpOworCQltZW1jcHkoJmZsNi5zYWRkciwgbG9jYWxfaXAsIDE2KTsKKwkJaWYgKGlwdjZfYWRkcl90eXBlKCZmbDYuZGFkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkKKwkJCWZsNi5mbG93aTZfb2lmID0gc2luNl9zY29wZV9pZDsKKwkJZHN0ID0gaXA2X3JvdXRlX291dHB1dCgmaW5pdF9uZXQsIE5VTEwsICZmbDYpOworCQlpZiAoIWRzdCkKKwkJCWdvdG8gb3V0OworCQlpZiAoIWN4Z2Jfb3VyX2ludGVyZmFjZShsbGRpLCBnZXRfcmVhbF9kZXYsCisJCQkJCWlwNl9kc3RfaWRldihkc3QpLT5kZXYpICYmCisJCSAgICAhKGlwNl9kc3RfaWRldihkc3QpLT5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSkgeworCQkJZHN0X3JlbGVhc2UoZHN0KTsKKwkJCWRzdCA9IE5VTEw7CisJCX0KKwl9CisKK291dDoKKwlyZXR1cm4gZHN0OworfQorRVhQT1JUX1NZTUJPTChjeGdiX2ZpbmRfcm91dGU2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vbGliY3hnYi9saWJjeGdiX2NtLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2xpYmN4Z2IvbGliY3hnYl9jbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNWI5NGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2xpYmN4Z2IvbGliY3hnYl9jbS5oCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqCSAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqCSAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICoJICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICoJICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqCSAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX0xJQkNYR0JfQ01fSF9fCisjZGVmaW5lIF9fTElCQ1hHQl9DTV9IX18KKworCisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisjaW5jbHVkZSA8Y3hnYjQuaD4KKyNpbmNsdWRlIDx0NF9tc2cuaD4KKyNpbmNsdWRlIDxsMnQuaD4KKwordm9pZAorY3hnYl9nZXRfNHR1cGxlKHN0cnVjdCBjcGxfcGFzc19hY2NlcHRfcmVxICosIGVudW0gY2hpcF90eXBlLAorCQlpbnQgKiwgX191OCAqLCBfX3U4ICosIF9fYmUxNiAqLCBfX2JlMTYgKik7CitzdHJ1Y3QgZHN0X2VudHJ5ICoKK2N4Z2JfZmluZF9yb3V0ZShzdHJ1Y3QgY3hnYjRfbGxkX2luZm8gKiwKKwkJc3RydWN0IG5ldF9kZXZpY2UgKigqKShzdHJ1Y3QgbmV0X2RldmljZSAqKSwKKwkJX19iZTMyLCBfX2JlMzIsIF9fYmUxNiwJX19iZTE2LCB1OCk7CitzdHJ1Y3QgZHN0X2VudHJ5ICoKK2N4Z2JfZmluZF9yb3V0ZTYoc3RydWN0IGN4Z2I0X2xsZF9pbmZvICosCisJCSBzdHJ1Y3QgbmV0X2RldmljZSAqKCopKHN0cnVjdCBuZXRfZGV2aWNlICopLAorCQkgX191OCAqLCBfX3U4ICosIF9fYmUxNiwgX19iZTE2LCB1OCwgX191MzIpOworCisvKiBSZXR1cm5zIHdoZXRoZXIgYSBDUEwgc3RhdHVzIGNvbnZleXMgbmVnYXRpdmUgYWR2aWNlLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgY3hnYl9pc19uZWdfYWR2KHVuc2lnbmVkIGludCBzdGF0dXMpCit7CisJcmV0dXJuIHN0YXR1cyA9PSBDUExfRVJSX1JUWF9ORUdfQURWSUNFIHx8CisJICAgICAgIHN0YXR1cyA9PSBDUExfRVJSX1BFUlNJU1RfTkVHX0FEVklDRSB8fAorCSAgICAgICBzdGF0dXMgPT0gQ1BMX0VSUl9LRUVQQUxWX05FR19BRFZJQ0U7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY3hnYl9iZXN0X210dShjb25zdCB1bnNpZ25lZCBzaG9ydCAqbXR1cywgdW5zaWduZWQgc2hvcnQgbXR1LAorCSAgICAgIHVuc2lnbmVkIGludCAqaWR4LCBpbnQgdXNlX3RzLCBpbnQgaXB2NikKK3sKKwl1bnNpZ25lZCBzaG9ydCBoZHJfc2l6ZSA9IChpcHY2ID8KKwkJCQkgICBzaXplb2Yoc3RydWN0IGlwdjZoZHIpIDoKKwkJCQkgICBzaXplb2Yoc3RydWN0IGlwaGRyKSkgKworCQkJCSAgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpICsKKwkJCQkgICh1c2VfdHMgPworCQkJCSAgIHJvdW5kX3VwKFRDUE9MRU5fVElNRVNUQU1QLCA0KSA6IDApOworCXVuc2lnbmVkIHNob3J0IGRhdGFfc2l6ZSA9IG10dSAtIGhkcl9zaXplOworCisJY3hnYjRfYmVzdF9hbGlnbmVkX210dShtdHVzLCBoZHJfc2l6ZSwgZGF0YV9zaXplLCA4LCBpZHgpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBjeGdiX2NvbXB1dGVfd3NjYWxlKHUzMiB3aW4pCit7CisJdTMyIHdzY2FsZSA9IDA7CisKKwl3aGlsZSAod3NjYWxlIDwgMTQgJiYgKDY1NTM1IDw8IHdzY2FsZSkgPCB3aW4pCisJCXdzY2FsZSsrOworCXJldHVybiB3c2NhbGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY3hnYl9ta190aWRfcmVsZWFzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgbGVuLCB1MzIgdGlkLCB1MTYgY2hhbikKK3sKKwlzdHJ1Y3QgY3BsX3RpZF9yZWxlYXNlICpyZXE7CisKKwlyZXEgPSAoc3RydWN0IGNwbF90aWRfcmVsZWFzZSAqKV9fc2tiX3B1dChza2IsIGxlbik7CisJbWVtc2V0KHJlcSwgMCwgbGVuKTsKKworCUlOSVRfVFBfV1IocmVxLCB0aWQpOworCU9QQ09ERV9USUQocmVxKSA9IGNwdV90b19iZTMyKE1LX09QQ09ERV9USUQoQ1BMX1RJRF9SRUxFQVNFLCB0aWQpKTsKKwlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX1NFVFVQLCBjaGFuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitjeGdiX21rX2Nsb3NlX2Nvbl9yZXEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGxlbiwgdTMyIHRpZCwgdTE2IGNoYW4sCisJCSAgICAgIHZvaWQgKmhhbmRsZSwgYXJwX2Vycl9oYW5kbGVyX3QgaGFuZGxlcikKK3sKKwlzdHJ1Y3QgY3BsX2Nsb3NlX2Nvbl9yZXEgKnJlcTsKKworCXJlcSA9IChzdHJ1Y3QgY3BsX2Nsb3NlX2Nvbl9yZXEgKilfX3NrYl9wdXQoc2tiLCBsZW4pOworCW1lbXNldChyZXEsIDAsIGxlbik7CisKKwlJTklUX1RQX1dSKHJlcSwgdGlkKTsKKwlPUENPREVfVElEKHJlcSkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9DTE9TRV9DT05fUkVRLCB0aWQpKTsKKwlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0RBVEEsIGNoYW4pOworCXQ0X3NldF9hcnBfZXJyX2hhbmRsZXIoc2tiLCBoYW5kbGUsIGhhbmRsZXIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2N4Z2JfbWtfYWJvcnRfcmVxKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBsZW4sIHUzMiB0aWQsIHUxNiBjaGFuLAorCQkgIHZvaWQgKmhhbmRsZSwgYXJwX2Vycl9oYW5kbGVyX3QgaGFuZGxlcikKK3sKKwlzdHJ1Y3QgY3BsX2Fib3J0X3JlcSAqcmVxOworCisJcmVxID0gKHN0cnVjdCBjcGxfYWJvcnRfcmVxICopX19za2JfcHV0KHNrYiwgbGVuKTsKKwltZW1zZXQocmVxLCAwLCBsZW4pOworCisJSU5JVF9UUF9XUihyZXEsIHRpZCk7CisJT1BDT0RFX1RJRChyZXEpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfQUJPUlRfUkVRLCB0aWQpKTsKKwlyZXEtPmNtZCA9IENQTF9BQk9SVF9TRU5EX1JTVDsKKwlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0RBVEEsIGNoYW4pOworCXQ0X3NldF9hcnBfZXJyX2hhbmRsZXIoc2tiLCBoYW5kbGUsIGhhbmRsZXIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2N4Z2JfbWtfYWJvcnRfcnBsKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBsZW4sIHUzMiB0aWQsIHUxNiBjaGFuKQoreworCXN0cnVjdCBjcGxfYWJvcnRfcnBsICpycGw7CisKKwlycGwgPSAoc3RydWN0IGNwbF9hYm9ydF9ycGwgKilfX3NrYl9wdXQoc2tiLCBsZW4pOworCW1lbXNldChycGwsIDAsIGxlbik7CisKKwlJTklUX1RQX1dSKHJwbCwgdGlkKTsKKwlPUENPREVfVElEKHJwbCkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9BQk9SVF9SUEwsIHRpZCkpOworCXJwbC0+Y21kID0gQ1BMX0FCT1JUX05PX1JTVDsKKwlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0RBVEEsIGNoYW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2N4Z2JfbWtfcnhfZGF0YV9hY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGxlbiwgdTMyIHRpZCwgdTE2IGNoYW4sCisJCSAgICB1MzIgY3JlZGl0X2RhY2spCit7CisJc3RydWN0IGNwbF9yeF9kYXRhX2FjayAqcmVxOworCisJcmVxID0gKHN0cnVjdCBjcGxfcnhfZGF0YV9hY2sgKilfX3NrYl9wdXQoc2tiLCBsZW4pOworCW1lbXNldChyZXEsIDAsIGxlbik7CisKKwlJTklUX1RQX1dSKHJlcSwgdGlkKTsKKwlPUENPREVfVElEKHJlcSkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9SWF9EQVRBX0FDSywgdGlkKSk7CisJcmVxLT5jcmVkaXRfZGFjayA9IGNwdV90b19iZTMyKGNyZWRpdF9kYWNrKTsKKwlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0FDSywgY2hhbik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Rhdmljb20vZG05MDAwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kYXZpY29tL2RtOTAwMC5jCmluZGV4IDE0NzFlMTYuLmY0NTM4NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Rhdmljb20vZG05MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGF2aWNvbS9kbTkwMDAuYwpAQCAtMTI5OSw2ICsxMjk5LDcgQEAKIGRtOTAwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGJvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgaXJxX2ZsYWdzID0gaXJxX2dldF90cmlnZ2VyX3R5cGUoZGV2LT5pcnEpOwogCiAJaWYgKG5ldGlmX21zZ19pZnVwKGRiKSkKIAkJZGV2X2RiZyhkYi0+ZGV2LCAiZW5hYmxpbmcgJXNcbiIsIGRldi0+bmFtZSk7CkBAIC0xMzA2LDkgKzEzMDcsMTEgQEAKIAkvKiBJZiB0aGVyZSBpcyBubyBJUlEgdHlwZSBzcGVjaWZpZWQsIHRlbGwgdGhlIHVzZXIgdGhhdCB0aGlzIGlzIGEKIAkgKiBwcm9ibGVtCiAJICovCi0JaWYgKGlycV9nZXRfdHJpZ2dlcl90eXBlKGRldi0+aXJxKSA9PSBJUlFGX1RSSUdHRVJfTk9ORSkKKwlpZiAoaXJxX2ZsYWdzID09IElSUUZfVFJJR0dFUl9OT05FKQogCQlkZXZfd2FybihkYi0+ZGV2LCAiV0FSTklORzogbm8gSVJRIHJlc291cmNlIGZsYWdzIHNldC5cbiIpOwogCisJaXJxX2ZsYWdzIHw9IElSUUZfU0hBUkVEOworCiAJLyogR1BJTzAgb24gcHJlLWFjdGl2YXRlIFBIWSwgUmVnIDFGIGlzIG5vdCBzZXQgYnkgcmVzZXQgKi8KIAlpb3coZGIsIERNOTAwMF9HUFIsIDApOwkvKiBSRUdfMUYgYml0MCBhY3RpdmF0ZSBwaHl4Y2VyICovCiAJbWRlbGF5KDEpOyAvKiBkZWxheSBuZWVkcyBieSBETTkwMDBCICovCkBAIC0xMzE2LDggKzEzMTksNyBAQAogCS8qIEluaXRpYWxpemUgRE05MDAwIGJvYXJkICovCiAJZG05MDAwX2luaXRfZG05MDAwKGRldik7CiAKLQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGRtOTAwMF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCQkJZGV2LT5uYW1lLCBkZXYpKQorCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgZG05MDAwX2ludGVycnVwdCwgaXJxX2ZsYWdzLCBkZXYtPm5hbWUsIGRldikpCiAJCXJldHVybiAtRUFHQUlOOwogCS8qIE5vdyB0aGF0IHdlIGhhdmUgYW4gaW50ZXJydXB0IGhhbmRsZXIgaG9va2VkIHVwIHdlIGNhbiB1bm1hc2sKIAkgKiBvdXIgaW50ZXJydXB0cwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL2RlNHg1LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZGU0eDUuYwppbmRleCBmMGU5ZTJlLi42NjIwZmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZGU0eDUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZGU0eDUuYwpAQCAtMTk2Niw3ICsxOTY2LDcgQEAKICAgICB9IGVsc2UgaWYgKGxwLT5zZXR1cF9mID09IEhBU0hfUEVSRikgeyAgIC8qIEhhc2ggRmlsdGVyaW5nICovCiAJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikgewogCQljcmMgPSBldGhlcl9jcmNfbGUoRVRIX0FMRU4sIGhhLT5hZGRyKTsKLQkJaGFzaGNvZGUgPSBjcmMgJiBIQVNIX0JJVFM7ICAvKiBoYXNoY29kZSBpcyA5IExTYiBvZiBDUkMgKi8KKwkJaGFzaGNvZGUgPSBjcmMgJiBERTRYNV9IQVNIX0JJVFM7ICAvKiBoYXNoY29kZSBpcyA5IExTYiBvZiBDUkMgKi8KIAogCQlieXRlID0gaGFzaGNvZGUgPj4gMzsgICAgICAgIC8qIGJpdFszLThdIC0+IGJ5dGUgaW4gZmlsdGVyICovCiAJCWJpdCA9IDEgPDwgKGhhc2hjb2RlICYgMHgwNyk7LyogYml0WzAtMl0gLT4gYml0IGluIGJ5dGUgKi8KQEAgLTUwNDMsNyArNTA0Myw3IEBACiAJICAgICoocGEgKyBpKSA9IGRldi0+ZGV2X2FkZHJbaV07ICAgICAgICAgICAgICAgICAvKiBIb3N0IGFkZHJlc3MgKi8KIAkgICAgaWYgKGkgJiAweDAxKSBwYSArPSAyOwogCX0KLQkqKGxwLT5zZXR1cF9mcmFtZSArIChIQVNIX1RBQkxFX0xFTiA+PiAzKSAtIDMpID0gMHg4MDsKKwkqKGxwLT5zZXR1cF9mcmFtZSArIChERTRYNV9IQVNIX1RBQkxFX0xFTiA+PiAzKSAtIDMpID0gMHg4MDsKICAgICB9IGVsc2UgewogCWZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsgLyogSG9zdCBhZGRyZXNzICovCiAJICAgICoocGEgKyAoaSYxKSkgPSBkZXYtPmRldl9hZGRyW2ldOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL2RlNHg1LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZGU0eDUuaAppbmRleCBlYzc1NmViLi4xYmZkYzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZGU0eDUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZGU0eDUuaApAQCAtODYwLDggKzg2MCw4IEBACiAjZGVmaW5lIFBDSSAgMAogI2RlZmluZSBFSVNBIDEKIAotI2RlZmluZSBIQVNIX1RBQkxFX0xFTiAgIDUxMiAgICAgICAvKiBCaXRzICovCi0jZGVmaW5lIEhBU0hfQklUUyAgICAgICAgMHgwMWZmICAgIC8qIDkgTFMgYml0cyAqLworI2RlZmluZSBERTRYNV9IQVNIX1RBQkxFX0xFTiAgIDUxMiAgICAgICAvKiBCaXRzICovCisjZGVmaW5lIERFNFg1X0hBU0hfQklUUyAgICAgICAgMHgwMWZmICAgIC8qIDkgTFMgYml0cyAqLwogCiAjZGVmaW5lIFNFVFVQX0ZSQU1FX0xFTiAgMTkyICAgICAgIC8qIEJ5dGVzICovCiAjZGVmaW5lIElNUEVSRl9QQV9PRkZTRVQgMTU2ICAgICAgIC8qIEJ5dGVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kbGluay9zdW5kYW5jZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGxpbmsvc3VuZGFuY2UuYwppbmRleCA1OGM2MzM4Li43OWQ4MDA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kbGluay9zdW5kYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RsaW5rL3N1bmRhbmNlLmMKQEAgLTg2Nyw3ICs4NjcsNyBAQAogCiAJLyogSW5pdGlhbGl6ZSBvdGhlciByZWdpc3RlcnMuICovCiAJX19zZXRfbWFjX2FkZHIoZGV2KTsKLSNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19WTEFOXzgwMjFRKQogCWlvd3JpdGUxNihkZXYtPm10dSArIDE4LCBpb2FkZHIgKyBNYXhGcmFtZVNpemUpOwogI2Vsc2UKIAlpb3dyaXRlMTYoZGV2LT5tdHUgKyAxNCwgaW9hZGRyICsgTWF4RnJhbWVTaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlLmgKaW5kZXggNDU1NWUwNC4uNmNmYTYzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlLmgKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlICJiZV9ody5oIgogI2luY2x1ZGUgImJlX3JvY2UuaCIKIAotI2RlZmluZSBEUlZfVkVSCQkJIjExLjAuMC4wIgorI2RlZmluZSBEUlZfVkVSCQkJIjExLjEuMC4wIgogI2RlZmluZSBEUlZfTkFNRQkJImJlMm5ldCIKICNkZWZpbmUgQkVfTkFNRQkJCSJFbXVsZXggQmxhZGVFbmdpbmUyIgogI2RlZmluZSBCRTNfTkFNRQkJIkVtdWxleCBCbGFkZUVuZ2luZTMiCkBAIC0zOTksMTMgKzM5OSwxMyBAQAogI2RlZmluZSBCRV9GTEFHU19QSFlfTUlTQ09ORklHVVJFRAkJQklUKDEwKQogI2RlZmluZSBCRV9GTEFHU19FUlJfREVURUNUSU9OX1NDSEVEVUxFRAlCSVQoMTEpCiAjZGVmaW5lIEJFX0ZMQUdTX09TMkJNQwkJCQlCSVQoMTIpCisjZGVmaW5lIEJFX0ZMQUdTX1RSWV9SRUNPVkVSWQkJCUJJVCgxMykKIAogI2RlZmluZSBCRV9VQ19QTUFDX0NPVU5UCQkJMzAKICNkZWZpbmUgQkVfVkZfVUNfUE1BQ19DT1VOVAkJCTIKIAogI2RlZmluZSBNQVhfRVJSX1JFQ09WRVJZX1JFVFJZX0NPVU5UCQkzCiAjZGVmaW5lIEVSUl9ERVRFQ1RJT05fREVMQVkJCQkxMDAwCi0jZGVmaW5lIEVSUl9SRUNPVkVSWV9SRVRSWV9ERUxBWQkJMzAwMDAKIAogLyogRXRodG9vbCBzZXRfZHVtcCBmbGFncyAqLwogI2RlZmluZSBMQU5DRVJfSU5JVElBVEVfRldfRFVNUAkJCTB4MQpAQCAtNTA4LDYgKzUwOCw3MCBAQAogCXUxNiBsc29fbXNzOwkvKiBNU1MgZm9yIExTTyAqLwogfTsKIAorc3RydWN0IGJlX2V0aF9hZGRyIHsKKwl1bnNpZ25lZCBjaGFyIG1hY1tFVEhfQUxFTl07Cit9OworCisjZGVmaW5lIEJFX1NFQwkxMDAwCQkJLyogaW4gbXNlYyAqLworI2RlZmluZSBCRV9NSU4JKDYwICogQkVfU0VDKQkJLyogaW4gbXNlYyAqLworI2RlZmluZSBCRV9IT1VSCSg2MCAqIEJFX01JTikJCS8qIGluIG1zZWMgKi8KKworI2RlZmluZSBFUlJfUkVDT1ZFUllfTUFYX1JFVFJZX0NPVU5UCQkzCisjZGVmaW5lIEVSUl9SRUNPVkVSWV9ERVRFQ1RJT05fREVMQVkJCUJFX1NFQworI2RlZmluZSBFUlJfUkVDT1ZFUllfUkVUUllfREVMQVkJCSgzMCAqIEJFX1NFQykKKworLyogVUUtZGV0ZWN0aW9uLWR1cmF0aW9uIGluIEJFeC9Ta3loYXdrOgorICogQWxsIFBGcyBtdXN0IHdhaXQgZm9yIHRoaXMgZHVyYXRpb24gYWZ0ZXIgdGhleSBkZXRlY3QgVUUgYmVmb3JlIHJlYWRpbmcKKyAqIFNMSVBPUlRfU0VNQVBIT1JFIHJlZ2lzdGVyLiBBdCB0aGUgZW5kIG9mIHRoaXMgZHVyYXRpb24sIHRoZSBGaXJtd2FyZQorICogZ3VhcmFudGVlcyB0aGF0IHRoZSBTTElQT1JUX1NFTUFQSE9SRSByZWdpc3RlciBpcyB1cGRhdGVkIHRvIGluZGljYXRlCisgKiBpZiB0aGUgVUUgaXMgcmVjb3ZlcmFibGUuCisgKi8KKyNkZWZpbmUgRVJSX1JFQ09WRVJZX1VFX0RFVEVDVF9EVVJBVElPTgkJCUJFX1NFQworCisvKiBJbml0aWFsIGlkbGUgdGltZSAoaW4gbXNlYykgdG8gZWxhcHNlIGFmdGVyIGRyaXZlciBsb2FkLAorICogYmVmb3JlIFVFIHJlY292ZXJ5IGlzIGFsbG93ZWQuCisgKi8KKyNkZWZpbmUgRVJSX0lETEVfSFIJCQkyNAorI2RlZmluZSBFUlJfUkVDT1ZFUllfSURMRV9USU1FCQkoRVJSX0lETEVfSFIgKiBCRV9IT1VSKQorCisvKiBUaW1lIGludGVydmFsIChpbiBtc2VjKSBhZnRlciB3aGljaCBVRSByZWNvdmVyeSBjYW4gYmUgcmVwZWF0ZWQgKi8KKyNkZWZpbmUgRVJSX0lOVEVSVkFMX0hSCQkJNzIKKyNkZWZpbmUgRVJSX1JFQ09WRVJZX0lOVEVSVkFMCQkoRVJSX0lOVEVSVkFMX0hSICogQkVfSE9VUikKKworLyogQkV4L1NIIFVFIHJlY292ZXJ5IHN0YXRlIG1hY2hpbmUgKi8KK2VudW0geworCUVSUl9SRUNPVkVSWV9TVF9OT05FID0gMCwJCS8qIE5vIFJlY292ZXJ5ICovCisJRVJSX1JFQ09WRVJZX1NUX0RFVEVDVCA9IDEsCQkvKiBVRSBkZXRlY3Rpb24gZHVyYXRpb24gKi8KKwlFUlJfUkVDT1ZFUllfU1RfUkVTRVQgPSAyLAkJLyogUmVzZXQgUGhhc2UgKFBGMCBvbmx5KSAqLworCUVSUl9SRUNPVkVSWV9TVF9QUkVfUE9MTCA9IDMsCQkvKiBQcmUtUG9sbCBQaGFzZSAoYWxsIFBGcykgKi8KKwlFUlJfUkVDT1ZFUllfU1RfUkVJTklUID0gNAkJLyogUmUtaW5pdGlhbGl6ZSBQaGFzZSAqLworfTsKKworc3RydWN0IGJlX2Vycm9yX3JlY292ZXJ5IHsKKwkvKiBMYW5jZXIgZXJyb3IgcmVjb3ZlcnkgdmFyaWFibGVzICovCisJdTggcmVjb3ZlcnlfcmV0cmllczsKKworCS8qIEJFeC9Ta3loYXdrIGVycm9yIHJlY292ZXJ5IHZhcmlhYmxlcyAqLworCXU4IHJlY292ZXJ5X3N0YXRlOworCXUxNiB1ZV90b19yZXNldF90aW1lOwkJLyogVGltZSBhZnRlciBVRSwgdG8gc29mdCByZXNldAorCQkJCQkgKiB0aGUgY2hpcCAtIFBGMCBvbmx5CisJCQkJCSAqLworCXUxNiB1ZV90b19wb2xsX3RpbWU7CQkvKiBUaW1lIGFmdGVyIFVFLCB0byBSZXN0YXJ0IFBvbGxpbmcKKwkJCQkJICogb2YgU0xJUE9SVF9TRU1BUEhPUkUgcmVnCisJCQkJCSAqLworCXUxNiBsYXN0X2Vycl9jb2RlOworCWJvb2wgcmVjb3Zlcnlfc3VwcG9ydGVkOworCXVuc2lnbmVkIGxvbmcgcHJvYmVfdGltZTsKKwl1bnNpZ25lZCBsb25nIGxhc3RfcmVjb3ZlcnlfdGltZTsKKworCS8qIENvbW1vbiB0byBib3RoIExhbmNlciAmIEJFeC9TSCBlcnJvciByZWNvdmVyeSAqLworCXUzMiByZXNjaGVkX2RlbGF5OworCXN0cnVjdCBkZWxheWVkX3dvcmsgZXJyX2RldGVjdGlvbl93b3JrOworfTsKKworLyogRXRodG9vbCBwcml2X2ZsYWdzICovCisjZGVmaW5lCUJFX0RJU0FCTEVfVFBFX1JFQ09WRVJZCTB4MQorCiBzdHJ1Y3QgYmVfYWRhcHRlciB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKQEAgLTUyMyw3ICs1ODcsNyBAQAogCXN0cnVjdCBiZV9kbWFfbWVtIG1ib3hfbWVtX2FsbG9jZWQ7CiAKIAlzdHJ1Y3QgYmVfbWNjX29iaiBtY2Nfb2JqOwotCXNwaW5sb2NrX3QgbWNjX2xvY2s7CS8qIEZvciBzZXJpYWxpemluZyBtY2MgY21kcyB0byBCRSBjYXJkICovCisJc3RydWN0IG11dGV4IG1jY19sb2NrOwkvKiBGb3Igc2VyaWFsaXppbmcgbWNjIGNtZHMgdG8gQkUgY2FyZCAqLwogCXNwaW5sb2NrX3QgbWNjX2NxX2xvY2s7CiAKIAl1MTYgY2ZnX251bV9yeF9pcnFzOwkJLyogY29uZmlndXJlZCB2aWEgc2V0LWNoYW5uZWxzICovCkBAIC01NTYsNyArNjIwLDYgQEAKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CiAJdTE2IHdvcmtfY291bnRlcjsKIAotCXN0cnVjdCBkZWxheWVkX3dvcmsgYmVfZXJyX2RldGVjdGlvbl93b3JrOwogCXU4IHJlY292ZXJ5X3JldHJpZXM7CiAJdTggZXJyX2ZsYWdzOwogCWJvb2wgcGNpY2ZnX21hcHBlZDsJLyogcGNpY2ZnIG9idGFpbmVkIHZpYSBwY2lfaW9tYXAoKSAqLwpAQCAtNTcwLDkgKzYzMywxNSBAQAogCWludCBpZl9oYW5kbGU7CQkvKiBVc2VkIHRvIGNvbmZpZ3VyZSBmaWx0ZXJpbmcgKi8KIAl1MzIgaWZfZmxhZ3M7CQkvKiBJbnRlcmZhY2UgZmlsdGVyaW5nIGZsYWdzICovCiAJdTMyICpwbWFjX2lkOwkJLyogTUFDIGFkZHIgaGFuZGxlIHVzZWQgYnkgQkUgY2FyZCAqLworCXN0cnVjdCBiZV9ldGhfYWRkciAqdWNfbGlzdDsvKiBsaXN0IG9mIHVjLWFkZHJzIHByb2dyYW1tZWQgKG5vdCBwZXJtKSAqLwogCXUzMiB1Y19tYWNzOwkJLyogQ291bnQgb2Ygc2Vjb25kYXJ5IFVDIE1BQyBwcm9ncmFtbWVkICovCisJc3RydWN0IGJlX2V0aF9hZGRyICptY19saXN0Oy8qIGxpc3Qgb2YgbWNhc3QgYWRkcnMgcHJvZ3JhbW1lZCAqLworCXUzMiBtY19jb3VudDsKIAl1bnNpZ25lZCBsb25nIHZpZHNbQklUU19UT19MT05HUyhWTEFOX05fVklEKV07CiAJdTE2IHZsYW5zX2FkZGVkOworCWJvb2wgdXBkYXRlX3VjX2xpc3Q7CisJYm9vbCB1cGRhdGVfbWNfbGlzdDsKKwlzdHJ1Y3QgbXV0ZXggcnhfZmlsdGVyX2xvY2s7LyogRm9yIHByb3RlY3Rpbmcgdmlkc1tdICYgbWMvdWNfbGlzdFtdICovCiAKIAl1MzIgYmVhY29uX3N0YXRlOwkvKiBmb3Igc2V0X3BoeXNfaWQgKi8KIApAQCAtNjI0LDYgKzY5MywxOCBAQAogCXUzMiBmYXRfZHVtcF9sZW47CiAJdTE2IHNlcmlhbF9udW1bQ05UTF9TRVJJQUxfTlVNX1dPUkRTXTsKIAl1OCBwaHlfc3RhdGU7IC8qIHN0YXRlIG9mIHNmcCBvcHRpY3MgKGZ1bmN0aW9uYWwsIGZhdWx0ZWQsIGV0Yy4sKSAqLworCXU4IGRldl9tYWNbRVRIX0FMRU5dOworCXUzMiBwcml2X2ZsYWdzOyAvKiBldGh0b29sIGdldC9zZXRfcHJpdl9mbGFncygpICovCisJc3RydWN0IGJlX2Vycm9yX3JlY292ZXJ5IGVycm9yX3JlY292ZXJ5OworfTsKKworLyogVXNlZCBmb3IgZGVmZXJlZCBGVyBjb25maWcgY21kcy4gQWRkIGZpZWxkcyB0byB0aGlzIHN0cnVjdCBhcyByZXFkICovCitzdHJ1Y3QgYmVfY21kX3dvcmsgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyOworCXVuaW9uIHsKKwkJX19iZTE2IHZ4bGFuX3BvcnQ7CisJfSBpbmZvOwogfTsKIAogI2RlZmluZSBiZV9waHlzZm4oYWRhcHRlcikJCSghYWRhcHRlci0+dmlydGZuKQpAQCAtODQ4LDYgKzkyOSw5IEBACiAJcmV0dXJuIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApICYmIGlwX2hkcihza2IpLT52ZXJzaW9uID09IDQ7CiB9CiAKKyNkZWZpbmUgYmVfZXJyb3JfcmVjb3ZlcmluZyhhZGFwdGVyKQlcCisJCShhZGFwdGVyLT5mbGFncyAmIEJFX0ZMQUdTX1RSWV9SRUNPVkVSWSkKKwogI2RlZmluZSBCRV9FUlJPUl9FRUgJCTEKICNkZWZpbmUgQkVfRVJST1JfVUUJCUJJVCgxKQogI2RlZmluZSBCRV9FUlJPUl9GVwkJQklUKDIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfY21kcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuYwppbmRleCAyY2MxMTc1Li45Y2ZmZTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfY21kcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmMKQEAgLTkyLDYgKzkyLDExIEBACiAJCUNNRF9TVUJTWVNURU1fQ09NTU9OLAogCQlCRV9QUklWX0RFVkNGRyB8IEJFX1BSSVZfVkhBRE0KIAl9LAorCXsKKwkJT1BDT0RFX0NPTU1PTl9HRVRfRVhUX0ZBVF9DQVBBQklMSVRJRVMsCisJCUNNRF9TVUJTWVNURU1fQ09NTU9OLAorCQlCRV9QUklWX0RFVkNGRworCX0KIH07CiAKIHN0YXRpYyBib29sIGJlX2NtZF9hbGxvd2VkKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1OCBvcGNvZGUsIHU4IHN1YnN5c3RlbSkKQEAgLTU3MSw3ICs1NzYsNyBAQAogLyogV2FpdCB0aWxsIG5vIG1vcmUgcGVuZGluZyBtY2MgcmVxdWVzdHMgYXJlIHByZXNlbnQgKi8KIHN0YXRpYyBpbnQgYmVfbWNjX3dhaXRfY29tcGwoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0jZGVmaW5lIG1jY190aW1lb3V0CQkxMjAwMDAgLyogMTJzIHRpbWVvdXQgKi8KKyNkZWZpbmUgbWNjX3RpbWVvdXQJCTEyMDAwIC8qIDEycyB0aW1lb3V0ICovCiAJaW50IGksIHN0YXR1cyA9IDA7CiAJc3RydWN0IGJlX21jY19vYmogKm1jY19vYmogPSAmYWRhcHRlci0+bWNjX29iajsKIApAQCAtNTg1LDcgKzU5MCw3IEBACiAKIAkJaWYgKGF0b21pY19yZWFkKCZtY2Nfb2JqLT5xLnVzZWQpID09IDApCiAJCQlicmVhazsKLQkJdWRlbGF5KDEwMCk7CisJCXVzbGVlcF9yYW5nZSg1MDAsIDEwMDApOwogCX0KIAlpZiAoaSA9PSBtY2NfdGltZW91dCkgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJGVyBub3QgcmVzcG9uZGluZ1xuIik7CkBAIC03MDUsNyArNzEwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHUxNiBiZV9QT1NUX3N0YWdlX2dldChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3UxNiBiZV9QT1NUX3N0YWdlX2dldChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAl1MzIgc2VtOwogCkBAIC04NjMsNyArODY4LDcgQEAKIHN0YXRpYyBpbnQgYmVfY21kX2xvY2soc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaWYgKHVzZV9tY2MoYWRhcHRlcikpIHsKLQkJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYWRhcHRlci0+bWJveF9sb2NrKTsKQEAgLTg3NCw3ICs4NzksNyBAQAogc3RhdGljIHZvaWQgYmVfY21kX3VubG9jayhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpZiAodXNlX21jYyhhZGFwdGVyKSkKLQkJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwkJcmV0dXJuIG11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCWVsc2UKIAkJcmV0dXJuIG11dGV4X3VubG9jaygmYWRhcHRlci0+bWJveF9sb2NrKTsKIH0KQEAgLTEwNDQsNyArMTA0OSw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfbWFjX3F1ZXJ5ICpyZXE7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTEwNzMsNyArMTA3OCw3IEBACiAJfQogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xMDg1LDcgKzEwOTAsNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX3BtYWNfYWRkICpyZXE7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTExMTAsNyArMTExNSw3IEBACiAJfQogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCSBpZiAoc3RhdHVzID09IE1DQ19TVEFUVVNfVU5BVVRIT1JJWkVEX1JFUVVFU1QpCiAJCXN0YXR1cyA9IC1FUEVSTTsKQEAgLTExMjgsNyArMTEzMyw3IEBACiAJaWYgKHBtYWNfaWQgPT0gLTEpCiAJCXJldHVybiAwOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMTE0OCw3ICsxMTUzLDcgQEAKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE0MTEsNyArMTQxNiw3IEBACiAJc3RydWN0IGJlX2RtYV9tZW0gKnFfbWVtID0gJnJ4cS0+ZG1hX21lbTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMTQ0MSw3ICsxNDQ2LDcgQEAKIAl9CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE1MDUsNyArMTUxMCw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfcV9kZXN0cm95ICpyZXE7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTE1MjIsNyArMTUyNyw3IEBACiAJcS0+Y3JlYXRlZCA9IGZhbHNlOwogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNTkwLDcgKzE1OTUsNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX2hkciAqaGRyOwogCWludCBzdGF0dXMgPSAwOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMTYxOCw3ICsxNjIzLDcgQEAKIAlhZGFwdGVyLT5zdGF0c19jbWRfc2VudCA9IHRydWU7CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE2MzQsNyArMTYzOSw3IEBACiAJCQkgICAgQ01EX1NVQlNZU1RFTV9FVEgpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMTY1Nyw3ICsxNjYyLDcgQEAKIAlhZGFwdGVyLT5zdGF0c19jbWRfc2VudCA9IHRydWU7CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE2OTQsNyArMTY5OSw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfbGlua19zdGF0dXMgKnJlcTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJaWYgKGxpbmtfc3RhdHVzKQogCQkqbGlua19zdGF0dXMgPSBMSU5LX0RPV047CkBAIC0xNzMzLDcgKzE3MzgsNyBAQAogCX0KIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTc0NCw3ICsxNzQ5LDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3JlcV9nZXRfY250bF9hZGRubF9hdHRyaWJzICpyZXE7CiAJaW50IHN0YXR1cyA9IDA7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0xNzU5LDcgKzE3NjQsNyBAQAogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeShhZGFwdGVyKTsKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE4MDgsNyArMTgxMyw3IEBACiAJaWYgKCFnZXRfZmF0X2NtZC52YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3aGlsZSAodG90YWxfc2l6ZSkgewogCQlidWZfc2l6ZSA9IG1pbih0b3RhbF9zaXplLCAodTMyKTYwKjEwMjQpOwpAQCAtMTg0OCw3ICsxODUzLDcgQEAKIGVycjoKIAlkbWFfZnJlZV9jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LCBnZXRfZmF0X2NtZC5zaXplLAogCQkJICBnZXRfZmF0X2NtZC52YSwgZ2V0X2ZhdF9jbWQuZG1hKTsKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE4NTksNyArMTg2NCw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfZ2V0X2Z3X3ZlcnNpb24gKnJlcTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMTg4Miw3ICsxODg3LDcgQEAKIAkJCXNpemVvZihhZGFwdGVyLT5md19vbl9mbGFzaCkpOwogCX0KIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE4OTYsNyArMTkwMSw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfbW9kaWZ5X2VxX2RlbGF5ICpyZXE7CiAJaW50IHN0YXR1cyA9IDAsIGk7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0xOTE5LDcgKzE5MjQsNyBAQAogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeShhZGFwdGVyKTsKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE5NDYsNyArMTk1MSw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfdmxhbl9jb25maWcgKnJlcTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMTk2OCw3ICsxOTczLDcgQEAKIAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE5NzksNyArMTk4NCw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfcnhfZmlsdGVyICpyZXEgPSBtZW0tPnZhOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0xOTk2LDggKzIwMDEsNyBAQAogCXJlcS0+aWZfZmxhZ3MgPSAodmFsdWUgPT0gT04pID8gcmVxLT5pZl9mbGFnc19tYXNrIDogMDsKIAogCWlmIChmbGFncyAmIEJFX0lGX0ZMQUdTX01VTFRJQ0FTVCkgewotCQlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwotCQlpbnQgaSA9IDA7CisJCWludCBpOwogCiAJCS8qIFJlc2V0IG1jYXN0IHByb21pc2MgbW9kZSBpZiBhbHJlYWR5IHNldCBieSBzZXR0aW5nIG1hc2sKIAkJICogYW5kIG5vdCBzZXR0aW5nIGZsYWdzIGZpZWxkCkBAIC0yMDA1LDE0ICsyMDA5LDE1IEBACiAJCXJlcS0+aWZfZmxhZ3NfbWFzayB8PQogCQkJY3B1X3RvX2xlMzIoQkVfSUZfRkxBR1NfTUNBU1RfUFJPTUlTQ1VPVVMgJgogCQkJCSAgICBiZV9pZl9jYXBfZmxhZ3MoYWRhcHRlcikpOwotCQlyZXEtPm1jYXN0X251bSA9IGNwdV90b19sZTMyKG5ldGRldl9tY19jb3VudChhZGFwdGVyLT5uZXRkZXYpKTsKLQkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGFkYXB0ZXItPm5ldGRldikKLQkJCW1lbWNweShyZXEtPm1jYXN0X21hY1tpKytdLmJ5dGUsIGhhLT5hZGRyLCBFVEhfQUxFTik7CisJCXJlcS0+bWNhc3RfbnVtID0gY3B1X3RvX2xlMzIoYWRhcHRlci0+bWNfY291bnQpOworCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bWNfY291bnQ7IGkrKykKKwkJCWV0aGVyX2FkZHJfY29weShyZXEtPm1jYXN0X21hY1tpXS5ieXRlLAorCQkJCQlhZGFwdGVyLT5tY19saXN0W2ldLm1hYyk7CiAJfQogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjA0Myw3ICsyMDQ4LDcgQEAKIAkJCSAgICBDTURfU1VCU1lTVEVNX0NPTU1PTikpCiAJCXJldHVybiAtRVBFUk07CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0yMDYzLDcgKzIwNjgsNyBAQAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAlpZiAoYmFzZV9zdGF0dXMoc3RhdHVzKSA9PSBNQ0NfU1RBVFVTX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCkKIAkJcmV0dXJuICAtRU9QTk9UU1VQUDsKQEAgLTIwODIsNyArMjA4Nyw3IEBACiAJCQkgICAgQ01EX1NVQlNZU1RFTV9DT01NT04pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMjEwNSw3ICsyMTEwLDcgQEAKIAl9CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTIxODYsNyArMjE5MSw3IEBACiAJaWYgKCEoYmVfaWZfY2FwX2ZsYWdzKGFkYXB0ZXIpICYgQkVfSUZfRkxBR1NfUlNTKSkKIAkJcmV0dXJuIDA7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0yMjExLDcgKzIyMTYsNyBAQAogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjIyMyw3ICsyMjI4LDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3JlcV9lbmFibGVfZGlzYWJsZV9iZWFjb24gKnJlcTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMjI0NCw3ICsyMjQ5LDcgQEAKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTIyNTUsNyArMjI2MCw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfZ2V0X2JlYWNvbl9zdGF0ZSAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0yMjc5LDcgKzIyODQsNyBAQAogCX0KIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjMwMyw3ICsyMzA4LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMjMyNSw3ICsyMzMwLDcgQEAKIAkJbWVtY3B5KGRhdGEsIHJlc3AtPnBhZ2VfZGF0YSwgUEFHRV9EQVRBX0xFTik7CiAJfQogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJZG1hX2ZyZWVfY29oZXJlbnQoJmFkYXB0ZXItPnBkZXYtPmRldiwgY21kLnNpemUsIGNtZC52YSwgY21kLmRtYSk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTIzNDIsNyArMjM0Nyw3IEBACiAJdm9pZCAqY3R4dCA9IE5VTEw7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlhZGFwdGVyLT5mbGFzaF9zdGF0dXMgPSAwOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKQEAgLTIzODQsNyArMjM4OSw3IEBACiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnJfdW5sb2NrOwogCi0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZhZGFwdGVyLT5ldF9jbWRfY29tcGwsCiAJCQkJCSBtc2Vjc190b19qaWZmaWVzKDYwMDAwKSkpCkBAIC0yNDAzLDcgKzI0MDgsNyBAQAogCXJldHVybiBzdGF0dXM7CiAKIGVycl91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yNDU3LDcgKzI0NjIsNyBAQAogCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTI0NzUsNyArMjQ4MCw3IEBACiAKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yNDg4LDcgKzI0OTMsNyBAQAogCXN0cnVjdCBsYW5jZXJfY21kX3Jlc3BfcmVhZF9vYmplY3QgKnJlc3A7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTI1MjIsNyArMjUyNyw3IEBACiAJfQogCiBlcnJfdW5sb2NrOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjUzNCw3ICsyNTM5LDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3dyaXRlX2ZsYXNocm9tICpyZXE7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlhZGFwdGVyLT5mbGFzaF9zdGF0dXMgPSAwOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKQEAgLTI1NTksNyArMjU2NCw3IEBACiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnJfdW5sb2NrOwogCi0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZhZGFwdGVyLT5ldF9jbWRfY29tcGwsCiAJCQkJCSBtc2Vjc190b19qaWZmaWVzKDQwMDAwKSkpCkBAIC0yNTcwLDcgKzI1NzUsNyBAQAogCXJldHVybiBzdGF0dXM7CiAKIGVycl91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yNTgxLDcgKzI1ODYsNyBAQAogCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTI2MDgsNyArMjYxMyw3IEBACiAJCW1lbWNweShmbGFzaGVkX2NyYywgcmVxLT5jcmMsIDQpOwogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zMTkyLDcgKzMxOTcsNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX2FjcGlfd29sX21hZ2ljX2NvbmZpZyAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0zMjA5LDcgKzMyMTQsNyBAQAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzIyNCw3ICszMjI5LDcgQEAKIAkJCSAgICBDTURfU1VCU1lTVEVNX0xPV0xFVkVMKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTMyNDcsNyArMzI1Miw3IEBACiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnJfdW5sb2NrOwogCi0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZhZGFwdGVyLT5ldF9jbWRfY29tcGwsCiAJCQkJCSBtc2Vjc190b19qaWZmaWVzKFNFVF9MQl9NT0RFX1RJTUVPVVQpKSkKQEAgLTMyNTYsNyArMzI2MSw3IEBACiAJcmV0dXJuIHN0YXR1czsKIAogZXJyX3VubG9jazoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTMyNzMsNyArMzI3OCw3IEBACiAJCQkgICAgQ01EX1NVQlNZU1RFTV9MT1dMRVZFTCkpCiAJCXJldHVybiAtRVBFUk07CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0zMjk5LDcgKzMzMDQsNyBAQAogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyOwogCi0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFkYXB0ZXItPmV0X2NtZF9jb21wbCk7CiAJcmVzcCA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKQEAgLTMzMDcsNyArMzMxMiw3IEBACiAKIAlyZXR1cm4gc3RhdHVzOwogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzMyMyw3ICszMzI4LDcgQEAKIAkJCSAgICBDTURfU1VCU1lTVEVNX0xPV0xFVkVMKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTMzNTcsNyArMzM2Miw3IEBACiAJfQogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zMzY4LDcgKzMzNzMsNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX3NlZXByb21fcmVhZCAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0zMzg0LDcgKzMzODksNyBAQAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzM5OSw3ICszNDA0LDcgQEAKIAkJCSAgICBDTURfU1VCU1lTVEVNX0NPTU1PTikpCiAJCXJldHVybiAtRVBFUk07CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0zNDQ0LDcgKzM0NDksNyBAQAogCX0KIAlkbWFfZnJlZV9jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LCBjbWQuc2l6ZSwgY21kLnZhLCBjbWQuZG1hKTsKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTM0NTQsNyArMzQ1OSw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfc2V0X3FvcyAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0zNDc0LDcgKzM0NzksNyBAQAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzU4MSw3ICszNTg2LDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3JlcV9nZXRfZm5fcHJpdmlsZWdlcyAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0zNjEzLDcgKzM2MTgsNyBAQAogCX0KIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzYyNSw3ICszNjMwLDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3JlcV9zZXRfZm5fcHJpdmlsZWdlcyAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0zNjQ1LDcgKzM2NTAsNyBAQAogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzY3Nyw3ICszNjgyLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMzc0MSw3ICszNzQ2LDcgQEAKIAl9CiAKIG91dDoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCWRtYV9mcmVlX2NvaGVyZW50KCZhZGFwdGVyLT5wZGV2LT5kZXYsIGdldF9tYWNfbGlzdF9jbWQuc2l6ZSwKIAkJCSAgZ2V0X21hY19saXN0X2NtZC52YSwgZ2V0X21hY19saXN0X2NtZC5kbWEpOwogCXJldHVybiBzdGF0dXM7CkBAIC0zODAxLDcgKzM4MDYsNyBAQAogCWlmICghY21kLnZhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTM4MjMsNyArMzgyOCw3IEBACiAKIGVycjoKIAlkbWFfZnJlZV9jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LCBjbWQuc2l6ZSwgY21kLnZhLCBjbWQuZG1hKTsKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTM4NTksNyArMzg2NCw3IEBACiAJCQkgICAgQ01EX1NVQlNZU1RFTV9DT01NT04pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMzkwMCw3ICszOTA1LDcgQEAKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTM5MTQsNyArMzkxOSw3IEBACiAJaW50IHN0YXR1czsKIAl1MTYgdmlkOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMzk2MSw3ICszOTY2LDcgQEAKIAl9CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTQxMjcsNiArNDEzMiwxMCBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX2dldF9leHRfZmF0X2NhcHMgKnJlcTsKIAlpbnQgc3RhdHVzOwogCisJaWYgKCFiZV9jbWRfYWxsb3dlZChhZGFwdGVyLCBPUENPREVfQ09NTU9OX0dFVF9FWFRfRkFUX0NBUEFCSUxJVElFUywKKwkJCSAgICBDTURfU1VCU1lTVEVNX0NPTU1PTikpCisJCXJldHVybiAtRVBFUk07CisKIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhZGFwdGVyLT5tYm94X2xvY2spKQogCQlyZXR1cm4gLTE7CiAKQEAgLTQxMzgsNyArNDE0Nyw3IEBACiAKIAlyZXEgPSBjbWQtPnZhOwogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJCSAgICAgICBPUENPREVfQ09NTU9OX0dFVF9FWFRfRkFUX0NBUEFCSUxJVEVTLAorCQkJICAgICAgIE9QQ09ERV9DT01NT05fR0VUX0VYVF9GQVRfQ0FQQUJJTElUSUVTLAogCQkJICAgICAgIGNtZC0+c2l6ZSwgd3JiLCBjbWQpOwogCXJlcS0+cGFyYW1ldGVyX3R5cGUgPSBjcHVfdG9fbGUzMigxKTsKIApAQCAtNDE1Niw3ICs0MTY1LDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3JlcV9zZXRfZXh0X2ZhdF9jYXBzICpyZXE7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTQxNjcsMTIgKzQxNzYsMTIgQEAKIAlyZXEgPSBjbWQtPnZhOwogCW1lbWNweSgmcmVxLT5zZXRfcGFyYW1zLCBjb25maWdzLCBzaXplb2Yoc3RydWN0IGJlX2ZhdF9jb25mX3BhcmFtcykpOwogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJCSAgICAgICBPUENPREVfQ09NTU9OX1NFVF9FWFRfRkFUX0NBUEFCSUxJVEVTLAorCQkJICAgICAgIE9QQ09ERV9DT01NT05fU0VUX0VYVF9GQVRfQ0FQQUJJTElUSUVTLAogCQkJICAgICAgIGNtZC0+c2l6ZSwgd3JiLCBjbWQpOwogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNDM3Myw3ICs0MzgyLDcgQEAKIH0KIAogLyogVGhpcyByb3V0aW5lIHJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgTklDIFBGX251bXMgaW4gdGhlIGFkYXB0ZXIgKi8KLXUxNiBiZV9nZXRfbmljX3BmX251bV9saXN0KHU4ICpidWYsIHUzMiBkZXNjX2NvdW50LCB1MTYgKm5pY19wZl9udW1zKQorc3RhdGljIHUxNiBiZV9nZXRfbmljX3BmX251bV9saXN0KHU4ICpidWYsIHUzMiBkZXNjX2NvdW50LCB1MTYgKm5pY19wZl9udW1zKQogewogCXN0cnVjdCBiZV9yZXNfZGVzY19oZHIgKmhkciA9IChzdHJ1Y3QgYmVfcmVzX2Rlc2NfaGRyICopYnVmOwogCXN0cnVjdCBiZV9wY2llX3Jlc19kZXNjICpwY2llID0gTlVMTDsKQEAgLTQ1MjUsNyArNDUzNCw3IEBACiB9CiAKIC8qIE1hcmsgYWxsIGZpZWxkcyBpbnZhbGlkICovCi12b2lkIGJlX3Jlc2V0X25pY19kZXNjKHN0cnVjdCBiZV9uaWNfcmVzX2Rlc2MgKm5pYykKK3N0YXRpYyB2b2lkIGJlX3Jlc2V0X25pY19kZXNjKHN0cnVjdCBiZV9uaWNfcmVzX2Rlc2MgKm5pYykKIHsKIAltZW1zZXQobmljLCAwLCBzaXplb2YoKm5pYykpOwogCW5pYy0+dW5pY2FzdF9tYWNfY291bnQgPSAweEZGRkY7CkBAIC00NjUwLDcgKzQ2NTksNyBAQAogCWlmIChpZmFjZSA9PSAweEZGRkZGRkZGKQogCQlyZXR1cm4gLTE7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC00NjY3LDcgKzQ2NzYsNyBAQAogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNDcwMSw3ICs0NzEwLDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3Jlc3BfZ2V0X2lmYWNlX2xpc3QgKnJlc3A7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTQ3MjIsNyArNDczMSw3IEBACiAJfQogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC00ODE2LDcgKzQ4MjUsNyBAQAogCWlmIChCRXhfY2hpcChhZGFwdGVyKSkKIAkJcmV0dXJuIDA7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC00ODM0LDcgKzQ4NDMsNyBAQAogCXJlcS0+ZW5hYmxlID0gMTsKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC00ODk4LDE0ICs0OTA3LDE1IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotaW50IF9fYmVfY21kX3NldF9sb2dpY2FsX2xpbmtfY29uZmlnKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgICAgaW50IGxpbmtfc3RhdGUsIGludCB2ZXJzaW9uLCB1OCBkb21haW4pCitzdGF0aWMgaW50CitfX2JlX2NtZF9zZXRfbG9naWNhbF9saW5rX2NvbmZpZyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgaW50IGxpbmtfc3RhdGUsIGludCB2ZXJzaW9uLCB1OCBkb21haW4pCiB7CiAJc3RydWN0IGJlX21jY193cmIgKndyYjsKIAlzdHJ1Y3QgYmVfY21kX3JlcV9zZXRfbGxfbGluayAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC00OTMxLDcgKzQ5NDEsNyBAQAogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNDk1NCw2ICs0OTY0LDU3IEBACiAJCQkJCQkJICAxLCBkb21haW4pOwogCXJldHVybiBzdGF0dXM7CiB9CisKK2ludCBiZV9jbWRfc2V0X2ZlYXR1cmVzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBiZV9jbWRfcmVzcF9zZXRfZmVhdHVyZXMgKnJlc3A7CisJc3RydWN0IGJlX2NtZF9yZXFfc2V0X2ZlYXR1cmVzICpyZXE7CisJc3RydWN0IGJlX21jY193cmIgKndyYjsKKwlpbnQgc3RhdHVzOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYWRhcHRlci0+bWNjX2xvY2spKQorCQlyZXR1cm4gLTE7CisKKwl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOworCWlmICghd3JiKSB7CisJCXN0YXR1cyA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCisJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCisJYmVfd3JiX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fQ09NTU9OLAorCQkJICAgICAgIE9QQ09ERV9DT01NT05fU0VUX0ZFQVRVUkVTLAorCQkJICAgICAgIHNpemVvZigqcmVxKSwgd3JiLCBOVUxMKTsKKworCXJlcS0+ZmVhdHVyZXMgPSBjcHVfdG9fbGUzMihCRV9GRUFUVVJFX1VFX1JFQ09WRVJZKTsKKwlyZXEtPnBhcmFtZXRlcl9sZW4gPSBjcHVfdG9fbGUzMihzaXplb2Yoc3RydWN0IGJlX3JlcV91ZV9yZWNvdmVyeSkpOworCXJlcS0+cGFyYW1ldGVyLnJlcS51ZXIgPSBjcHVfdG9fbGUzMihCRV9VRV9SRUNPVkVSWV9VRVJfTUFTSyk7CisKKwlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBlcnI7CisKKwlyZXNwID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCisJYWRhcHRlci0+ZXJyb3JfcmVjb3ZlcnkudWVfdG9fcG9sbF90aW1lID0KKwkJbGUxNl90b19jcHUocmVzcC0+cGFyYW1ldGVyLnJlc3AudWUycnApOworCWFkYXB0ZXItPmVycm9yX3JlY292ZXJ5LnVlX3RvX3Jlc2V0X3RpbWUgPQorCQlsZTE2X3RvX2NwdShyZXNwLT5wYXJhbWV0ZXIucmVzcC51ZTJzcik7CisJYWRhcHRlci0+ZXJyb3JfcmVjb3ZlcnkucmVjb3Zlcnlfc3VwcG9ydGVkID0gdHJ1ZTsKK2VycjoKKwkvKiBDaGVja2luZyAiTUNDX1NUQVRVU19JTlZBTElEX0xFTkdUSCIgZm9yIFNLSCBhcyBGVworCSAqIHJldHVybnMgdGhpcyBlcnJvciBpbiBvbGRlciBmaXJtd2FyZSB2ZXJzaW9ucworCSAqLworCWlmIChiYXNlX3N0YXR1cyhzdGF0dXMpID09IE1DQ19TVEFUVVNfSUxMRUdBTF9SRVFVRVNUIHx8CisJICAgIGJhc2Vfc3RhdHVzKHN0YXR1cykgPT0gTUNDX1NUQVRVU19JTlZBTElEX0xFTkdUSCkKKwkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSAiQWRhcHRlciBkb2VzIG5vdCBzdXBwb3J0IEhXIGVycm9yIHJlY292ZXJ5XG4iKTsKKworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKIGludCBiZV9yb2NlX21jY19jbWQodm9pZCAqbmV0ZGV2X2hhbmRsZSwgdm9pZCAqd3JiX3BheWxvYWQsCiAJCSAgICBpbnQgd3JiX3BheWxvYWRfc2l6ZSwgdTE2ICpjbWRfc3RhdHVzLCB1MTYgKmV4dF9zdGF0dXMpCiB7CkBAIC00OTY0LDcgKzUwMjUsNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVzcF9oZHIgKnJlc3A7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTQ5ODcsNyArNTA0OCw3IEBACiAJbWVtY3B5KHdyYl9wYXlsb2FkLCByZXNwLCBzaXplb2YoKnJlc3ApICsgcmVzcC0+cmVzcG9uc2VfbGVuZ3RoKTsKIAliZV9kd3NfbGVfdG9fY3B1KHdyYl9wYXlsb2FkLCBzaXplb2YoKnJlc3ApICsgcmVzcC0+cmVzcG9uc2VfbGVuZ3RoKTsKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiBFWFBPUlRfU1lNQk9MKGJlX3JvY2VfbWNjX2NtZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfY21kcy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuaAppbmRleCAwZDZiZTIyLi4xYmQ4MmJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfY21kcy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmgKQEAgLTU4LDcgKzU4LDggQEAKIAlNQ0NfU1RBVFVTX0lOU1VGRklDSUVOVF9CVUZGRVIgPSA0LAogCU1DQ19TVEFUVVNfVU5BVVRIT1JJWkVEX1JFUVVFU1QgPSA1LAogCU1DQ19TVEFUVVNfTk9UX1NVUFBPUlRFRCA9IDY2LAotCU1DQ19TVEFUVVNfRkVBVFVSRV9OT1RfU1VQUE9SVEVEID0gNjgKKwlNQ0NfU1RBVFVTX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCA9IDY4LAorCU1DQ19TVEFUVVNfSU5WQUxJRF9MRU5HVEggPSAxMTYKIH07CiAKIC8qIEFkZGl0aW9uYWwgc3RhdHVzICovCkBAIC0yOTQsOCArMjk1LDggQEAKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfUEhZX0RFVEFJTFMJCQkxMDIKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfRFJJVkVSX0ZVTkNUSU9OX0NBUAkJMTAzCiAjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX0NOVExfQURESVRJT05BTF9BVFRSSUJVVEVTCTEyMQotI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9FWFRfRkFUX0NBUEFCSUxJVEVTCQkxMjUKLSNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfRVhUX0ZBVF9DQVBBQklMSVRFUwkJMTI2CisjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX0VYVF9GQVRfQ0FQQUJJTElUSUVTCQkxMjUKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfRVhUX0ZBVF9DQVBBQklMSVRJRVMJCTEyNgogI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9NQUNfTElTVAkJCTE0NwogI2RlZmluZSBPUENPREVfQ09NTU9OX1NFVF9NQUNfTElTVAkJCTE0OAogI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9IU1dfQ09ORklHCQkJMTUyCkBAIC0zMDgsNiArMzA5LDcgQEAKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9SRUFEX09CSkVDVAkJCTE3MQogI2RlZmluZSBPUENPREVfQ09NTU9OX1dSSVRFX09CSkVDVAkJCTE3MgogI2RlZmluZSBPUENPREVfQ09NTU9OX0RFTEVURV9PQkpFQ1QJCQkxNzQKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfRkVBVFVSRVMJCQkxOTEKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9NQU5BR0VfSUZBQ0VfRklMVEVSUwkJMTkzCiAjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX0lGQUNFX0xJU1QJCQkxOTQKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9FTkFCTEVfRElTQUJMRV9WRgkJCTE5NgpAQCAtMjMxNSw2ICsyMzE3LDQxIEBACiAJc3RydWN0IGJlX2lmX2Rlc2MgaWZfZGVzYzsKIH07CiAKKy8qKioqKioqKioqKioqKiBTZXQgRmVhdHVyZXMgKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJQkVfRkVBVFVSRV9VRV9SRUNPVkVSWQkJMHgxMAorI2RlZmluZQlCRV9VRV9SRUNPVkVSWV9VRVJfTUFTSwkJMHgxCisKK3N0cnVjdCBiZV9yZXFfdWVfcmVjb3ZlcnkgeworCXUzMgl1ZXI7CisJdTMyCXJzdmQ7Cit9OworCitzdHJ1Y3QgYmVfY21kX3JlcV9zZXRfZmVhdHVyZXMgeworCXN0cnVjdCBiZV9jbWRfcmVxX2hkciBoZHI7CisJdTMyIGZlYXR1cmVzOworCXUzMiBwYXJhbWV0ZXJfbGVuOworCXVuaW9uIHsKKwkJc3RydWN0IGJlX3JlcV91ZV9yZWNvdmVyeSByZXE7CisJCXUzMiByc3ZkWzJdOworCX0gcGFyYW1ldGVyOworfTsKKworc3RydWN0IGJlX3Jlc3BfdWVfcmVjb3ZlcnkgeworCXUzMiB1ZXI7CisJdTE2IHVlMnJwOworCXUxNiB1ZTJzcjsKK307CisKK3N0cnVjdCBiZV9jbWRfcmVzcF9zZXRfZmVhdHVyZXMgeworCXN0cnVjdCBiZV9jbWRfcmVzcF9oZHIgaGRyOworCXUzMiBmZWF0dXJlczsKKwl1MzIgcGFyYW1ldGVyX2xlbjsKKwl1bmlvbiB7CisJCXN0cnVjdCBiZV9yZXNwX3VlX3JlY292ZXJ5IHJlc3A7CisJCXUzMiByc3ZkWzJdOworCX0gcGFyYW1ldGVyOworfTsKKwogLyoqKioqKioqKioqKioqKiBTZXQgbG9naWNhbCBsaW5rICoqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBQTElOS19FTkFCTEUgICAgICAgICAgICBCSVQoMCkKICNkZWZpbmUgUExJTktfVFJBQ0sgICAgICAgICAgICAgQklUKDgpCkBAIC0yMzQzLDYgKzIzODAsNyBAQAogCXUzMiBjYXBfY29udHJvbF9mbGFnczsKIH0gX19wYWNrZWQ7CiAKK3UxNiBiZV9QT1NUX3N0YWdlX2dldChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcik7CiBpbnQgYmVfcGNpX2ZudW1fZ2V0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKTsKIGludCBiZV9md193YWl0X3JlYWR5KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKTsKIGludCBiZV9jbWRfbWFjX2FkZHJfcXVlcnkoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICptYWNfYWRkciwKQEAgLTI0NzAsMyArMjUwOCw0IEBACiBpbnQgYmVfY21kX3NldF9zcmlvdl9jb25maWcoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkgICAgc3RydWN0IGJlX3Jlc291cmNlcyByZXMsIHUxNiBudW1fdmZzLAogCQkJICAgIHN0cnVjdCBiZV9yZXNvdXJjZXMgKnZmdF9yZXMpOworaW50IGJlX2NtZF9zZXRfZmVhdHVyZXMoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9ldGh0b29sLmMKaW5kZXggNTBlN2JlNS4uMGE0OGEzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfZXRodG9vbC5jCkBAIC00MjEsNiArNDIxLDEwIEBACiAJfQogfQogCitzdGF0aWMgY29uc3QgY2hhciBiZV9wcml2X2ZsYWdzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKwkiZGlzYWJsZS10cGUtcmVjb3ZlcnkiCit9OworCiBzdGF0aWMgdm9pZCBiZV9nZXRfc3RhdF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IHN0cmluZ3NldCwKIAkJCQl1aW50OF90ICpkYXRhKQogewpAQCAtNDU0LDYgKzQ1OCwxMCBAQAogCQkJZGF0YSArPSBFVEhfR1NUUklOR19MRU47CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBFVEhfU1NfUFJJVl9GTEFHUzoKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmVfcHJpdl9mbGFncyk7IGkrKykKKwkJCXN0cmNweShkYXRhICsgaSAqIEVUSF9HU1RSSU5HX0xFTiwgYmVfcHJpdl9mbGFnc1tpXSk7CisJCWJyZWFrOwogCX0KIH0KIApAQCAtNDY4LDYgKzQ3Niw4IEBACiAJCXJldHVybiBFVEhUT09MX1NUQVRTX05VTSArCiAJCQlhZGFwdGVyLT5udW1fcnhfcXMgKiBFVEhUT09MX1JYU1RBVFNfTlVNICsKIAkJCWFkYXB0ZXItPm51bV90eF9xcyAqIEVUSFRPT0xfVFhTVEFUU19OVU07CisJY2FzZSBFVEhfU1NfUFJJVl9GTEFHUzoKKwkJcmV0dXJuIEFSUkFZX1NJWkUoYmVfcHJpdl9mbGFncyk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTM2MCw2ICsxMzcwLDM0IEBACiAJcmV0dXJuIGJlX2NtZF9zdGF0dXMoc3RhdHVzKTsKIH0KIAorc3RhdGljIHUzMiBiZV9nZXRfcHJpdl9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXJldHVybiBhZGFwdGVyLT5wcml2X2ZsYWdzOworfQorCitzdGF0aWMgaW50IGJlX3NldF9wcml2X2ZsYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJYm9vbCB0cGVfb2xkID0gISEoYWRhcHRlci0+cHJpdl9mbGFncyAmIEJFX0RJU0FCTEVfVFBFX1JFQ09WRVJZKTsKKwlib29sIHRwZV9uZXcgPSAhIShmbGFncyAmIEJFX0RJU0FCTEVfVFBFX1JFQ09WRVJZKTsKKworCWlmICh0cGVfb2xkICE9IHRwZV9uZXcpIHsKKwkJaWYgKHRwZV9uZXcpIHsKKwkJCWFkYXB0ZXItPnByaXZfZmxhZ3MgfD0gQkVfRElTQUJMRV9UUEVfUkVDT1ZFUlk7CisJCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCSAiSFcgZXJyb3IgcmVjb3ZlcnkgaXMgZGlzYWJsZWRcbiIpOworCQl9IGVsc2UgeworCQkJYWRhcHRlci0+cHJpdl9mbGFncyAmPSB+QkVfRElTQUJMRV9UUEVfUkVDT1ZFUlk7CisJCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCSAiSFcgZXJyb3IgcmVjb3ZlcnkgaXMgZW5hYmxlZFxuIik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwogY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGJlX2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MgPSBiZV9nZXRfc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvID0gYmVfZ2V0X2RydmluZm8sCkBAIC0xMzczLDYgKzE0MTEsOCBAQAogCS5nZXRfcmluZ3BhcmFtID0gYmVfZ2V0X3JpbmdwYXJhbSwKIAkuZ2V0X3BhdXNlcGFyYW0gPSBiZV9nZXRfcGF1c2VwYXJhbSwKIAkuc2V0X3BhdXNlcGFyYW0gPSBiZV9zZXRfcGF1c2VwYXJhbSwKKwkuc2V0X3ByaXZfZmxhZ3MgPSBiZV9zZXRfcHJpdl9mbGFncywKKwkuZ2V0X3ByaXZfZmxhZ3MgPSBiZV9nZXRfcHJpdl9mbGFncywKIAkuZ2V0X3N0cmluZ3MgPSBiZV9nZXRfc3RhdF9zdHJpbmdzLAogCS5zZXRfcGh5c19pZCA9IGJlX3NldF9waHlzX2lkLAogCS5zZXRfZHVtcCA9IGJlX3NldF9kdW1wLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2h3LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfaHcuaAppbmRleCBjNjg0YmIzLi45Mjk0MmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfaHcuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfaHcuaApAQCAtMzIsMTggKzMyLDIzIEBACiAjZGVmaW5lIE1QVV9FUF9DT05UUk9MIAkJMAogCiAvKioqKioqKioqKiBNUFUgc2VtcGhvcmU6IHVzZWQgZm9yIFNIICYgQkUgICoqKioqKioqKioqKiovCisjZGVmaW5lIFNMSVBPUlRfU09GVFJFU0VUX09GRlNFVAkJMHg1YwkvKiBDU1IgQkFSIG9mZnNldCAqLwogI2RlZmluZSBTTElQT1JUX1NFTUFQSE9SRV9PRkZTRVRfQkV4CQkweGFjICAvKiBDU1IgQkFSIG9mZnNldCAqLwogI2RlZmluZSBTTElQT1JUX1NFTUFQSE9SRV9PRkZTRVRfU0gJCTB4OTQgIC8qIFBDSS1DRkcgb2Zmc2V0ICovCiAjZGVmaW5lIFBPU1RfU1RBR0VfTUFTSwkJCQkweDAwMDBGRkZGCiAjZGVmaW5lIFBPU1RfRVJSX01BU0sJCQkJMHgxCiAjZGVmaW5lIFBPU1RfRVJSX1NISUZUCQkJCTMxCisjZGVmaW5lIFBPU1RfRVJSX1JFQ09WRVJZX0NPREVfTUFTSwkJMHhGRkYKKworLyogU29mdCBSZXNldCByZWdpc3RlciBtYXNrcyAqLworI2RlZmluZSBTTElQT1JUX1NPRlRSRVNFVF9TUl9NQVNLCQkweDAwMDAwMDgwCS8qIFNSIGJpdCAqLwogCiAvKiBNUFUgc2VtcGhvcmUgUE9TVCBzdGFnZSB2YWx1ZXMgKi8KICNkZWZpbmUgUE9TVF9TVEFHRV9BV0FJVElOR19IT1NUX1JEWSAJMHgxIC8qIEZXIGF3YWl0aW5nIGdvYWhlYWQgZnJvbSBob3N0ICovCiAjZGVmaW5lIFBPU1RfU1RBR0VfSE9TVF9SRFkgCQkweDIgLyogSG9zdCBoYXMgZ2l2ZW4gZ28tYWhlZCB0byBGVyAqLwogI2RlZmluZSBQT1NUX1NUQUdFX0JFX1JFU0VUCQkweDMgLyogSG9zdCB3YW50cyB0byByZXNldCBjaGlwICovCiAjZGVmaW5lIFBPU1RfU1RBR0VfQVJNRldfUkRZCQkweGMwMDAJLyogRlcgaXMgZG9uZSB3aXRoIFBPU1QgKi8KLQorI2RlZmluZSBQT1NUX1NUQUdFX1JFQ09WRVJBQkxFX0VSUgkweEUwMDAJLyogUmVjb3ZlcmFibGUgZXJyIGRldGVjdGVkICovCiAKIC8qIExhbmNlciBTTElQT1JUIHJlZ2lzdGVycyAqLwogI2RlZmluZSBTTElQT1JUX1NUQVRVU19PRkZTRVQJCTB4NDA0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX21haW4uYwppbmRleCA4NzRjNzUzLi5kY2I5MzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9tYWluLmMKQEAgLTQxLDYgKzQxLDExIEBACiBtb2R1bGVfcGFyYW0ocnhfZnJhZ19zaXplLCB1c2hvcnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhyeF9mcmFnX3NpemUsICJTaXplIG9mIGEgZnJhZ21lbnQgdGhhdCBob2xkcyByY3ZkIGRhdGEuIik7CiAKKy8qIFBlci1tb2R1bGUgZXJyb3IgZGV0ZWN0aW9uL3JlY292ZXJ5IHdvcmtxIHNoYXJlZCBhY3Jvc3MgYWxsIGZ1bmN0aW9ucy4KKyAqIEVhY2ggZnVuY3Rpb24gc2NoZWR1bGVzIGl0cyBvd24gd29yayByZXF1ZXN0IG9uIHRoaXMgc2hhcmVkIHdvcmtxLgorICovCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJlX2Vycl9yZWNvdmVyeV93b3JrcTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGJlX2Rldl9pZHNbXSA9IHsKIAl7IFBDSV9ERVZJQ0UoQkVfVkVORE9SX0lELCBCRV9ERVZJQ0VfSUQxKSB9LAogCXsgUENJX0RFVklDRShCRV9WRU5ET1JfSUQsIEJFX0RFVklDRV9JRDIpIH0sCkBAIC01Myw2ICs1OCwxMCBAQAogCXsgMCB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGJlX2Rldl9pZHMpOworCisvKiBXb3JrcXVldWUgdXNlZCBieSBhbGwgZnVuY3Rpb25zIGZvciBkZWZlcmluZyBjbWQgY2FsbHMgdG8gdGhlIGFkYXB0ZXIgKi8KK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYmVfd3E7CisKIC8qIFVFIFN0YXR1cyBMb3cgQ1NSICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVlX3N0YXR1c19sb3dfZGVzY1tdID0gewogCSJDRVYiLApAQCAtMjYwLDYgKzI2OSwzOCBAQAogCWlvd3JpdGUzMih2YWwsIGFkYXB0ZXItPmRiICsgREJfQ1FfT0ZGU0VUKTsKIH0KIAorc3RhdGljIGludCBiZV9kZXZfbWFjX2FkZChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTggKm1hYykKK3sKKwlpbnQgaTsKKworCS8qIENoZWNrIGlmIG1hYyBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIGFzIHBhcnQgb2YgdWMtbGlzdCAqLworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT51Y19tYWNzOyBpKyspIHsKKwkJaWYgKGV0aGVyX2FkZHJfZXF1YWwoKHU4ICopJmFkYXB0ZXItPnVjX2xpc3RbaSAqIEVUSF9BTEVOXSwKKwkJCQkgICAgIG1hYykpIHsKKwkJCS8qIG1hYyBhbHJlYWR5IGFkZGVkLCBza2lwIGFkZGl0aW9uICovCisJCQlhZGFwdGVyLT5wbWFjX2lkWzBdID0gYWRhcHRlci0+cG1hY19pZFtpICsgMV07CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiBiZV9jbWRfcG1hY19hZGQoYWRhcHRlciwgbWFjLCBhZGFwdGVyLT5pZl9oYW5kbGUsCisJCQkgICAgICAgJmFkYXB0ZXItPnBtYWNfaWRbMF0sIDApOworfQorCitzdGF0aWMgdm9pZCBiZV9kZXZfbWFjX2RlbChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgaW50IHBtYWNfaWQpCit7CisJaW50IGk7CisKKwkvKiBTa2lwIGRlbGV0aW9uIGlmIHRoZSBwcm9ncmFtbWVkIG1hYyBpcworCSAqIGJlaW5nIHVzZWQgaW4gdWMtbGlzdAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT51Y19tYWNzOyBpKyspIHsKKwkJaWYgKGFkYXB0ZXItPnBtYWNfaWRbaSArIDFdID09IHBtYWNfaWQpCisJCQlyZXR1cm47CisJfQorCWJlX2NtZF9wbWFjX2RlbChhZGFwdGVyLCBhZGFwdGVyLT5pZl9oYW5kbGUsIHBtYWNfaWQsIDApOworfQorCiBzdGF0aWMgaW50IGJlX21hY19hZGRyX3NldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKQEAgLTI2Nyw3ICszMDgsNyBAQAogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CiAJaW50IHN0YXR1czsKIAl1OCBtYWNbRVRIX0FMRU5dOwotCXUzMiBvbGRfcG1hY19pZCA9IGFkYXB0ZXItPnBtYWNfaWRbMF0sIGN1cnJfcG1hY19pZCA9IDA7CisJdTMyIG9sZF9wbWFjX2lkID0gYWRhcHRlci0+cG1hY19pZFswXTsKIAogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwpAQCAtMjc1LDcgKzMxNiw3IEBACiAJLyogUHJvY2VlZCBmdXJ0aGVyIG9ubHkgaWYsIFVzZXIgcHJvdmlkZWQgTUFDIGlzIGRpZmZlcmVudAogCSAqIGZyb20gYWN0aXZlIE1BQwogCSAqLwotCWlmIChldGhlcl9hZGRyX2VxdWFsKGFkZHItPnNhX2RhdGEsIG5ldGRldi0+ZGV2X2FkZHIpKQorCWlmIChldGhlcl9hZGRyX2VxdWFsKGFkZHItPnNhX2RhdGEsIGFkYXB0ZXItPmRldl9tYWMpKQogCQlyZXR1cm4gMDsKIAogCS8qIGlmIGRldmljZSBpcyBub3QgcnVubmluZywgY29weSBNQUMgdG8gbmV0ZGV2LT5kZXZfYWRkciAqLwpAQCAtMjg4LDIzICszMjksMjIgQEAKIAkgKiBGSUxUTUdNVCBwcml2aWxlZ2UuIFRoaXMgZmFpbHVyZSBpcyBPSywgb25seSBpZiB0aGUgUEYgcHJvZ3JhbW1lZAogCSAqIHRoZSBNQUMgZm9yIHRoZSBWRi4KIAkgKi8KLQlzdGF0dXMgPSBiZV9jbWRfcG1hY19hZGQoYWRhcHRlciwgKHU4ICopYWRkci0+c2FfZGF0YSwKLQkJCQkgYWRhcHRlci0+aWZfaGFuZGxlLCAmYWRhcHRlci0+cG1hY19pZFswXSwgMCk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+cnhfZmlsdGVyX2xvY2spOworCXN0YXR1cyA9IGJlX2Rldl9tYWNfYWRkKGFkYXB0ZXIsICh1OCAqKWFkZHItPnNhX2RhdGEpOwogCWlmICghc3RhdHVzKSB7Ci0JCWN1cnJfcG1hY19pZCA9IGFkYXB0ZXItPnBtYWNfaWRbMF07CiAKIAkJLyogRGVsZXRlIHRoZSBvbGQgcHJvZ3JhbW1lZCBNQUMuIFRoaXMgY2FsbCBtYXkgZmFpbCBpZiB0aGUKIAkJICogb2xkIE1BQyB3YXMgYWxyZWFkeSBkZWxldGVkIGJ5IHRoZSBQRiBkcml2ZXIuCiAJCSAqLwogCQlpZiAoYWRhcHRlci0+cG1hY19pZFswXSAhPSBvbGRfcG1hY19pZCkKLQkJCWJlX2NtZF9wbWFjX2RlbChhZGFwdGVyLCBhZGFwdGVyLT5pZl9oYW5kbGUsCi0JCQkJCW9sZF9wbWFjX2lkLCAwKTsKKwkJCWJlX2Rldl9tYWNfZGVsKGFkYXB0ZXIsIG9sZF9wbWFjX2lkKTsKIAl9CiAKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPnJ4X2ZpbHRlcl9sb2NrKTsKIAkvKiBEZWNpZGUgaWYgdGhlIG5ldyBNQUMgaXMgc3VjY2Vzc2Z1bGx5IGFjdGl2YXRlZCBvbmx5IGFmdGVyCiAJICogcXVlcnlpbmcgdGhlIEZXCiAJICovCi0Jc3RhdHVzID0gYmVfY21kX2dldF9hY3RpdmVfbWFjKGFkYXB0ZXIsIGN1cnJfcG1hY19pZCwgbWFjLAorCXN0YXR1cyA9IGJlX2NtZF9nZXRfYWN0aXZlX21hYyhhZGFwdGVyLCBhZGFwdGVyLT5wbWFjX2lkWzBdLCBtYWMsCiAJCQkJICAgICAgIGFkYXB0ZXItPmlmX2hhbmRsZSwgdHJ1ZSwgMCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnI7CkBAIC0zMTcsNiArMzU3LDcgQEAKIAkJZ290byBlcnI7CiAJfQogZG9uZToKKwlldGhlcl9hZGRyX2NvcHkoYWRhcHRlci0+ZGV2X21hYywgYWRkci0+c2FfZGF0YSk7CiAJZXRoZXJfYWRkcl9jb3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEpOwogCWRldl9pbmZvKGRldiwgIk1BQyBhZGRyZXNzIGNoYW5nZWQgdG8gJXBNXG4iLCBhZGRyLT5zYV9kYXRhKTsKIAlyZXR1cm4gMDsKQEAgLTE0MjAsMTMgKzE0NjEsMTggQEAKIAl1MTYgbnVtID0gMCwgaSA9IDA7CiAJaW50IHN0YXR1cyA9IDA7CiAKLQkvKiBObyBuZWVkIHRvIGZ1cnRoZXIgY29uZmlndXJlIHZpZHMgaWYgaW4gcHJvbWlzY3VvdXMgbW9kZSAqLwotCWlmIChiZV9pbl9hbGxfcHJvbWlzYyhhZGFwdGVyKSkKKwkvKiBObyBuZWVkIHRvIGNoYW5nZSB0aGUgVkxBTiBzdGF0ZSBpZiB0aGUgSS9GIGlzIGluIHByb21pc2N1b3VzICovCisJaWYgKGFkYXB0ZXItPm5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKIAkJcmV0dXJuIDA7CiAKIAlpZiAoYWRhcHRlci0+dmxhbnNfYWRkZWQgPiBiZV9tYXhfdmxhbnMoYWRhcHRlcikpCiAJCXJldHVybiBiZV9zZXRfdmxhbl9wcm9taXNjKGFkYXB0ZXIpOwogCisJaWYgKGFkYXB0ZXItPmlmX2ZsYWdzICYgQkVfSUZfRkxBR1NfVkxBTl9QUk9NSVNDVU9VUykgeworCQlzdGF0dXMgPSBiZV9jbGVhcl92bGFuX3Byb21pc2MoYWRhcHRlcik7CisJCWlmIChzdGF0dXMpCisJCQlyZXR1cm4gc3RhdHVzOworCX0KIAkvKiBDb25zdHJ1Y3QgVkxBTiBUYWJsZSB0byBnaXZlIHRvIEhXICovCiAJZm9yX2VhY2hfc2V0X2JpdChpLCBhZGFwdGVyLT52aWRzLCBWTEFOX05fVklEKQogCQl2aWRzW251bSsrXSA9IGNwdV90b19sZTE2KGkpOwpAQCAtMTQzOSw4ICsxNDg1LDYgQEAKIAkJICAgIGFkZGxfc3RhdHVzKHN0YXR1cykgPT0KIAkJCQlNQ0NfQURETF9TVEFUVVNfSU5TVUZGSUNJRU5UX1JFU09VUkNFUykKIAkJCXJldHVybiBiZV9zZXRfdmxhbl9wcm9taXNjKGFkYXB0ZXIpOwotCX0gZWxzZSBpZiAoYWRhcHRlci0+aWZfZmxhZ3MgJiBCRV9JRl9GTEFHU19WTEFOX1BST01JU0NVT1VTKSB7Ci0JCXN0YXR1cyA9IGJlX2NsZWFyX3ZsYW5fcHJvbWlzYyhhZGFwdGVyKTsKIAl9CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE0NTAsNDYgKzE0OTQsNDUgQEAKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJaW50IHN0YXR1cyA9IDA7CiAKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5yeF9maWx0ZXJfbG9jayk7CisKIAkvKiBQYWNrZXRzIHdpdGggVklEIDAgYXJlIGFsd2F5cyByZWNlaXZlZCBieSBMYW5jZXIgYnkgZGVmYXVsdCAqLwogCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSAmJiB2aWQgPT0gMCkKLQkJcmV0dXJuIHN0YXR1czsKKwkJZ290byBkb25lOwogCiAJaWYgKHRlc3RfYml0KHZpZCwgYWRhcHRlci0+dmlkcykpCi0JCXJldHVybiBzdGF0dXM7CisJCWdvdG8gZG9uZTsKIAogCXNldF9iaXQodmlkLCBhZGFwdGVyLT52aWRzKTsKIAlhZGFwdGVyLT52bGFuc19hZGRlZCsrOwogCiAJc3RhdHVzID0gYmVfdmlkX2NvbmZpZyhhZGFwdGVyKTsKLQlpZiAoc3RhdHVzKSB7Ci0JCWFkYXB0ZXItPnZsYW5zX2FkZGVkLS07Ci0JCWNsZWFyX2JpdCh2aWQsIGFkYXB0ZXItPnZpZHMpOwotCX0KLQorZG9uZToKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPnJ4X2ZpbHRlcl9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0aWMgaW50IGJlX3ZsYW5fcmVtX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBfX2JlMTYgcHJvdG8sIHUxNiB2aWQpCiB7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBzdGF0dXMgPSAwOworCisJbXV0ZXhfbG9jaygmYWRhcHRlci0+cnhfZmlsdGVyX2xvY2spOwogCiAJLyogUGFja2V0cyB3aXRoIFZJRCAwIGFyZSBhbHdheXMgcmVjZWl2ZWQgYnkgTGFuY2VyIGJ5IGRlZmF1bHQgKi8KIAlpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikgJiYgdmlkID09IDApCi0JCXJldHVybiAwOworCQlnb3RvIGRvbmU7CiAKIAlpZiAoIXRlc3RfYml0KHZpZCwgYWRhcHRlci0+dmlkcykpCi0JCXJldHVybiAwOworCQlnb3RvIGRvbmU7CiAKIAljbGVhcl9iaXQodmlkLCBhZGFwdGVyLT52aWRzKTsKIAlhZGFwdGVyLT52bGFuc19hZGRlZC0tOwogCi0JcmV0dXJuIGJlX3ZpZF9jb25maWcoYWRhcHRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJlX2NsZWFyX2FsbF9wcm9taXNjKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQotewotCWJlX2NtZF9yeF9maWx0ZXIoYWRhcHRlciwgQkVfSUZfRkxBR1NfQUxMX1BST01JU0NVT1VTLCBPRkYpOwotCWFkYXB0ZXItPmlmX2ZsYWdzICY9IH5CRV9JRl9GTEFHU19BTExfUFJPTUlTQ1VPVVM7CisJc3RhdHVzID0gYmVfdmlkX2NvbmZpZyhhZGFwdGVyKTsKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5yeF9maWx0ZXJfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdGljIHZvaWQgYmVfc2V0X2FsbF9wcm9taXNjKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQpAQCAtMTUxMCw3NSArMTU1MywyMjYgQEAKIAkJYWRhcHRlci0+aWZfZmxhZ3MgfD0gQkVfSUZfRkxBR1NfTUNBU1RfUFJPTUlTQ1VPVVM7CiB9CiAKLXN0YXRpYyB2b2lkIGJlX3NldF9tY19saXN0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIHZvaWQgYmVfc2V0X3VjX3Byb21pc2Moc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaW50IHN0YXR1czsKIAotCXN0YXR1cyA9IGJlX2NtZF9yeF9maWx0ZXIoYWRhcHRlciwgQkVfSUZfRkxBR1NfTVVMVElDQVNULCBPTik7CisJaWYgKGFkYXB0ZXItPmlmX2ZsYWdzICYgQkVfSUZfRkxBR1NfUFJPTUlTQ1VPVVMpCisJCXJldHVybjsKKworCXN0YXR1cyA9IGJlX2NtZF9yeF9maWx0ZXIoYWRhcHRlciwgQkVfSUZfRkxBR1NfUFJPTUlTQ1VPVVMsIE9OKTsKIAlpZiAoIXN0YXR1cykKLQkJYWRhcHRlci0+aWZfZmxhZ3MgJj0gfkJFX0lGX0ZMQUdTX01DQVNUX1BST01JU0NVT1VTOwotCWVsc2UKKwkJYWRhcHRlci0+aWZfZmxhZ3MgfD0gQkVfSUZfRkxBR1NfUFJPTUlTQ1VPVVM7Cit9CisKK3N0YXRpYyB2b2lkIGJlX2NsZWFyX3VjX3Byb21pc2Moc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHN0YXR1czsKKworCWlmICghKGFkYXB0ZXItPmlmX2ZsYWdzICYgQkVfSUZfRkxBR1NfUFJPTUlTQ1VPVVMpKQorCQlyZXR1cm47CisKKwlzdGF0dXMgPSBiZV9jbWRfcnhfZmlsdGVyKGFkYXB0ZXIsIEJFX0lGX0ZMQUdTX1BST01JU0NVT1VTLCBPRkYpOworCWlmICghc3RhdHVzKQorCQlhZGFwdGVyLT5pZl9mbGFncyAmPSB+QkVfSUZfRkxBR1NfUFJPTUlTQ1VPVVM7Cit9CisKKy8qIFRoZSBiZWxvdyAyIGZ1bmN0aW9ucyBhcmUgdGhlIGNhbGxiYWNrIGFyZ3MgZm9yIF9fZGV2X21jX3N5bmMvZGV2X3VjX3N5bmMoKS4KKyAqIFdlIHVzZSBhIHNpbmdsZSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgYm90aCBzeW5jIGFuZCB1bnN5bmMuIFdlIHJlYWxseSBkb24ndAorICogYWRkL3JlbW92ZSBhZGRyZXNzZXMgdGhyb3VnaCB0aGlzIGNhbGxiYWNrLiBCdXQsIHdlIHVzZSBpdCB0byBkZXRlY3QgY2hhbmdlcworICogdG8gdGhlIHVjL21jIGxpc3RzLiBUaGUgZW50aXJlIHVjL21jIGxpc3QgaXMgcHJvZ3JhbW1lZCBpbiBiZV9zZXRfcnhfbW9kZSgpLgorICovCitzdGF0aWMgaW50IGJlX3VjX2xpc3RfdXBkYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJYWRhcHRlci0+dXBkYXRlX3VjX2xpc3QgPSB0cnVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJlX21jX2xpc3RfdXBkYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJYWRhcHRlci0+dXBkYXRlX21jX2xpc3QgPSB0cnVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiZV9zZXRfbWNfbGlzdChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CisJYm9vbCBtY19wcm9taXNjID0gZmFsc2U7CisJaW50IHN0YXR1czsKKworCW5ldGlmX2FkZHJfbG9ja19iaChuZXRkZXYpOworCV9fZGV2X21jX3N5bmMobmV0ZGV2LCBiZV9tY19saXN0X3VwZGF0ZSwgYmVfbWNfbGlzdF91cGRhdGUpOworCisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlhZGFwdGVyLT51cGRhdGVfbWNfbGlzdCA9IGZhbHNlOworCX0gZWxzZSBpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSB8fAorCQkgICBuZXRkZXZfbWNfY291bnQobmV0ZGV2KSA+IGJlX21heF9tYyhhZGFwdGVyKSkgeworCQkvKiBFbmFibGUgbXVsdGljYXN0IHByb21pc2MgaWYgbnVtIGNvbmZpZ3VyZWQgZXhjZWVkcworCQkgKiB3aGF0IHdlIHN1cHBvcnQKKwkJICovCisJCW1jX3Byb21pc2MgPSB0cnVlOworCQlhZGFwdGVyLT51cGRhdGVfbWNfbGlzdCA9IGZhbHNlOworCX0gZWxzZSBpZiAoYWRhcHRlci0+aWZfZmxhZ3MgJiBCRV9JRl9GTEFHU19NQ0FTVF9QUk9NSVNDVU9VUykgeworCQkvKiBVcGRhdGUgbWMtbGlzdCB1bmNvbmRpdGlvbmFsbHkgaWYgdGhlIGlmYWNlIHdhcyBwcmV2aW91c2x5CisJCSAqIGluIG1jLXByb21pc2MgbW9kZSBhbmQgbm93IGlzIG91dCBvZiB0aGF0IG1vZGUuCisJCSAqLworCQlhZGFwdGVyLT51cGRhdGVfbWNfbGlzdCA9IHRydWU7CisJfQorCisJaWYgKGFkYXB0ZXItPnVwZGF0ZV9tY19saXN0KSB7CisJCWludCBpID0gMDsKKworCQkvKiBjYWNoZSB0aGUgbWMtbGlzdCBpbiBhZGFwdGVyICovCisJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBuZXRkZXYpIHsKKwkJCWV0aGVyX2FkZHJfY29weShhZGFwdGVyLT5tY19saXN0W2ldLm1hYywgaGEtPmFkZHIpOworCQkJaSsrOworCQl9CisJCWFkYXB0ZXItPm1jX2NvdW50ID0gbmV0ZGV2X21jX2NvdW50KG5ldGRldik7CisJfQorCW5ldGlmX2FkZHJfdW5sb2NrX2JoKG5ldGRldik7CisKKwlpZiAobWNfcHJvbWlzYykgewogCQliZV9zZXRfbWNfcHJvbWlzYyhhZGFwdGVyKTsKKwl9IGVsc2UgaWYgKGFkYXB0ZXItPnVwZGF0ZV9tY19saXN0KSB7CisJCXN0YXR1cyA9IGJlX2NtZF9yeF9maWx0ZXIoYWRhcHRlciwgQkVfSUZfRkxBR1NfTVVMVElDQVNULCBPTik7CisJCWlmICghc3RhdHVzKQorCQkJYWRhcHRlci0+aWZfZmxhZ3MgJj0gfkJFX0lGX0ZMQUdTX01DQVNUX1BST01JU0NVT1VTOworCQllbHNlCisJCQliZV9zZXRfbWNfcHJvbWlzYyhhZGFwdGVyKTsKKworCQlhZGFwdGVyLT51cGRhdGVfbWNfbGlzdCA9IGZhbHNlOworCX0KK30KKworc3RhdGljIHZvaWQgYmVfY2xlYXJfbWNfbGlzdChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisJX19kZXZfbWNfdW5zeW5jKG5ldGRldiwgTlVMTCk7CisJYmVfY21kX3J4X2ZpbHRlcihhZGFwdGVyLCBCRV9JRl9GTEFHU19NVUxUSUNBU1QsIE9GRik7CisJYWRhcHRlci0+bWNfY291bnQgPSAwOworfQorCitzdGF0aWMgaW50IGJlX3VjX21hY19hZGQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCB1Y19pZHgpCit7CisJaWYgKGV0aGVyX2FkZHJfZXF1YWwoKHU4ICopJmFkYXB0ZXItPnVjX2xpc3RbdWNfaWR4ICogRVRIX0FMRU5dLAorCQkJICAgICBhZGFwdGVyLT5kZXZfbWFjKSkgeworCQlhZGFwdGVyLT5wbWFjX2lkW3VjX2lkeCArIDFdID0gYWRhcHRlci0+cG1hY19pZFswXTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGJlX2NtZF9wbWFjX2FkZChhZGFwdGVyLAorCQkJICAgICAgICh1OCAqKSZhZGFwdGVyLT51Y19saXN0W3VjX2lkeCAqIEVUSF9BTEVOXSwKKwkJCSAgICAgICBhZGFwdGVyLT5pZl9oYW5kbGUsCisJCQkgICAgICAgJmFkYXB0ZXItPnBtYWNfaWRbdWNfaWR4ICsgMV0sIDApOworfQorCitzdGF0aWMgdm9pZCBiZV91Y19tYWNfZGVsKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBpbnQgcG1hY19pZCkKK3sKKwlpZiAocG1hY19pZCA9PSBhZGFwdGVyLT5wbWFjX2lkWzBdKQorCQlyZXR1cm47CisKKwliZV9jbWRfcG1hY19kZWwoYWRhcHRlciwgYWRhcHRlci0+aWZfaGFuZGxlLCBwbWFjX2lkLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgYmVfc2V0X3VjX2xpc3Qoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwotCWludCBpID0gMTsgLyogRmlyc3Qgc2xvdCBpcyBjbGFpbWVkIGJ5IHRoZSBQcmltYXJ5IE1BQyAqLworCWJvb2wgdWNfcHJvbWlzYyA9IGZhbHNlOworCWludCBjdXJyX3VjX21hY3MgPSAwLCBpOwogCi0JZm9yICg7IGFkYXB0ZXItPnVjX21hY3MgPiAwOyBhZGFwdGVyLT51Y19tYWNzLS0sIGkrKykKLQkJYmVfY21kX3BtYWNfZGVsKGFkYXB0ZXIsIGFkYXB0ZXItPmlmX2hhbmRsZSwKLQkJCQlhZGFwdGVyLT5wbWFjX2lkW2ldLCAwKTsKKwluZXRpZl9hZGRyX2xvY2tfYmgobmV0ZGV2KTsKKwlfX2Rldl91Y19zeW5jKG5ldGRldiwgYmVfdWNfbGlzdF91cGRhdGUsIGJlX3VjX2xpc3RfdXBkYXRlKTsKIAotCWlmIChuZXRkZXZfdWNfY291bnQoYWRhcHRlci0+bmV0ZGV2KSA+IGJlX21heF91YyhhZGFwdGVyKSkgewotCQliZV9zZXRfYWxsX3Byb21pc2MoYWRhcHRlcik7Ci0JCXJldHVybjsKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCWFkYXB0ZXItPnVwZGF0ZV91Y19saXN0ID0gZmFsc2U7CisJfSBlbHNlIGlmIChuZXRkZXZfdWNfY291bnQobmV0ZGV2KSA+IChiZV9tYXhfdWMoYWRhcHRlcikgLSAxKSkgeworCQl1Y19wcm9taXNjID0gdHJ1ZTsKKwkJYWRhcHRlci0+dXBkYXRlX3VjX2xpc3QgPSBmYWxzZTsKKwl9ICBlbHNlIGlmIChhZGFwdGVyLT5pZl9mbGFncyAmIEJFX0lGX0ZMQUdTX1BST01JU0NVT1VTKSB7CisJCS8qIFVwZGF0ZSB1Yy1saXN0IHVuY29uZGl0aW9uYWxseSBpZiB0aGUgaWZhY2Ugd2FzIHByZXZpb3VzbHkKKwkJICogaW4gdWMtcHJvbWlzYyBtb2RlIGFuZCBub3cgaXMgb3V0IG9mIHRoYXQgbW9kZS4KKwkJICovCisJCWFkYXB0ZXItPnVwZGF0ZV91Y19saXN0ID0gdHJ1ZTsKIAl9CiAKLQluZXRkZXZfZm9yX2VhY2hfdWNfYWRkcihoYSwgYWRhcHRlci0+bmV0ZGV2KSB7Ci0JCWFkYXB0ZXItPnVjX21hY3MrKzsgLyogRmlyc3Qgc2xvdCBpcyBmb3IgUHJpbWFyeSBNQUMgKi8KLQkJYmVfY21kX3BtYWNfYWRkKGFkYXB0ZXIsICh1OCAqKWhhLT5hZGRyLCBhZGFwdGVyLT5pZl9oYW5kbGUsCi0JCQkJJmFkYXB0ZXItPnBtYWNfaWRbYWRhcHRlci0+dWNfbWFjc10sIDApOworCWlmIChhZGFwdGVyLT51cGRhdGVfdWNfbGlzdCkgeworCQlpID0gMTsgLyogRmlyc3Qgc2xvdCBpcyBjbGFpbWVkIGJ5IHRoZSBQcmltYXJ5IE1BQyAqLworCisJCS8qIGNhY2hlIHRoZSB1Yy1saXN0IGluIGFkYXB0ZXIgYXJyYXkgKi8KKwkJbmV0ZGV2X2Zvcl9lYWNoX3VjX2FkZHIoaGEsIG5ldGRldikgeworCQkJZXRoZXJfYWRkcl9jb3B5KGFkYXB0ZXItPnVjX2xpc3RbaV0ubWFjLCBoYS0+YWRkcik7CisJCQlpKys7CisJCX0KKwkJY3Vycl91Y19tYWNzID0gbmV0ZGV2X3VjX2NvdW50KG5ldGRldik7CisJfQorCW5ldGlmX2FkZHJfdW5sb2NrX2JoKG5ldGRldik7CisKKwlpZiAodWNfcHJvbWlzYykgeworCQliZV9zZXRfdWNfcHJvbWlzYyhhZGFwdGVyKTsKKwl9IGVsc2UgaWYgKGFkYXB0ZXItPnVwZGF0ZV91Y19saXN0KSB7CisJCWJlX2NsZWFyX3VjX3Byb21pc2MoYWRhcHRlcik7CisKKwkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnVjX21hY3M7IGkrKykKKwkJCWJlX3VjX21hY19kZWwoYWRhcHRlciwgYWRhcHRlci0+cG1hY19pZFtpICsgMV0pOworCisJCWZvciAoaSA9IDA7IGkgPCBjdXJyX3VjX21hY3M7IGkrKykKKwkJCWJlX3VjX21hY19hZGQoYWRhcHRlciwgaSk7CisJCWFkYXB0ZXItPnVjX21hY3MgPSBjdXJyX3VjX21hY3M7CisJCWFkYXB0ZXItPnVwZGF0ZV91Y19saXN0ID0gZmFsc2U7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBiZV9jbGVhcl91Y19saXN0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAxOyBpIDwgKGFkYXB0ZXItPnVjX21hY3MgKyAxKTsgaSsrKQotCQliZV9jbWRfcG1hY19kZWwoYWRhcHRlciwgYWRhcHRlci0+aWZfaGFuZGxlLAotCQkJCWFkYXB0ZXItPnBtYWNfaWRbaV0sIDApOworCV9fZGV2X3VjX3Vuc3luYyhuZXRkZXYsIE5VTEwpOworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT51Y19tYWNzOyBpKyspCisJCWJlX3VjX21hY19kZWwoYWRhcHRlciwgYWRhcHRlci0+cG1hY19pZFtpICsgMV0pOworCiAJYWRhcHRlci0+dWNfbWFjcyA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIGJlX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCitzdGF0aWMgdm9pZCBfX2JlX3NldF9yeF9tb2RlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogewotCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisJbXV0ZXhfbG9jaygmYWRhcHRlci0+cnhfZmlsdGVyX2xvY2spOwogCiAJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewotCQliZV9zZXRfYWxsX3Byb21pc2MoYWRhcHRlcik7Ci0JCXJldHVybjsKKwkJaWYgKCFiZV9pbl9hbGxfcHJvbWlzYyhhZGFwdGVyKSkKKwkJCWJlX3NldF9hbGxfcHJvbWlzYyhhZGFwdGVyKTsKKwl9IGVsc2UgaWYgKGJlX2luX2FsbF9wcm9taXNjKGFkYXB0ZXIpKSB7CisJCS8qIFdlIG5lZWQgdG8gcmUtcHJvZ3JhbSB0aGUgdmxhbi1saXN0IG9yIGNsZWFyCisJCSAqIHZsYW4tcHJvbWlzYyBtb2RlIChpZiBuZWVkZWQpIHdoZW4gdGhlIGludGVyZmFjZQorCQkgKiBjb21lcyBvdXQgb2YgcHJvbWlzYyBtb2RlLgorCQkgKi8KKwkJYmVfdmlkX2NvbmZpZyhhZGFwdGVyKTsKIAl9CiAKLQkvKiBJbnRlcmZhY2Ugd2FzIHByZXZpb3VzbHkgaW4gcHJvbWlzY3VvdXMgbW9kZTsgZGlzYWJsZSBpdCAqLwotCWlmIChiZV9pbl9hbGxfcHJvbWlzYyhhZGFwdGVyKSkgewotCQliZV9jbGVhcl9hbGxfcHJvbWlzYyhhZGFwdGVyKTsKLQkJaWYgKGFkYXB0ZXItPnZsYW5zX2FkZGVkKQotCQkJYmVfdmlkX2NvbmZpZyhhZGFwdGVyKTsKLQl9Ci0KLQkvKiBFbmFibGUgbXVsdGljYXN0IHByb21pc2MgaWYgbnVtIGNvbmZpZ3VyZWQgZXhjZWVkcyB3aGF0IHdlIHN1cHBvcnQgKi8KLQlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSB8fAotCSAgICBuZXRkZXZfbWNfY291bnQobmV0ZGV2KSA+IGJlX21heF9tYyhhZGFwdGVyKSkgewotCQliZV9zZXRfbWNfcHJvbWlzYyhhZGFwdGVyKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChuZXRkZXZfdWNfY291bnQobmV0ZGV2KSAhPSBhZGFwdGVyLT51Y19tYWNzKQotCQliZV9zZXRfdWNfbGlzdChhZGFwdGVyKTsKLQorCWJlX3NldF91Y19saXN0KGFkYXB0ZXIpOwogCWJlX3NldF9tY19saXN0KGFkYXB0ZXIpOworCisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5yeF9maWx0ZXJfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGJlX3dvcmtfc2V0X3J4X21vZGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBiZV9jbWRfd29yayAqY21kX3dvcmsgPQorCQkJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmVfY21kX3dvcmssIHdvcmspOworCisJX19iZV9zZXRfcnhfbW9kZShjbWRfd29yay0+YWRhcHRlcik7CisJa2ZyZWUoY21kX3dvcmspOwogfQogCiBzdGF0aWMgaW50IGJlX3NldF92Zl9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLCB1OCAqbWFjKQpAQCAtMTcwMSw3ICsxODk1LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBiZV9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MpCitzdGF0aWMgaW50IGJlX3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcywKKwkJCSAgX19iZTE2IHZsYW5fcHJvdG8pCiB7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBiZV92Zl9jZmcgKnZmX2NmZyA9ICZhZGFwdGVyLT52Zl9jZmdbdmZdOwpAQCAtMTcxMyw2ICsxOTA4LDkgQEAKIAlpZiAodmYgPj0gYWRhcHRlci0+bnVtX3ZmcyB8fCB2bGFuID4gNDA5NSB8fCBxb3MgPiA3KQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmICh2bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFRKSkKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisKIAlpZiAodmxhbiB8fCBxb3MpIHsKIAkJdmxhbiB8PSBxb3MgPDwgVkxBTl9QUklPX1NISUZUOwogCQlzdGF0dXMgPSBiZV9zZXRfdmZfdHZ0KGFkYXB0ZXIsIHZmLCB2bGFuKTsKQEAgLTMyMjAsOSArMzQxOCw3IEBACiAJCSAqLwogCiAJCWlmICh1ZV9sbyB8fCB1ZV9oaSkgewotCQkJZGV2X2VycihkZXYsCi0JCQkJIlVucmVjb3ZlcmFibGUgRXJyb3IgZGV0ZWN0ZWQgaW4gdGhlIGFkYXB0ZXIiKTsKLQkJCWRldl9lcnIoZGV2LCAiUGxlYXNlIHJlYm9vdCBzZXJ2ZXIgdG8gcmVjb3ZlciIpOworCQkJZGV2X2VycihkZXYsICJFcnJvciBkZXRlY3RlZCBpbiB0aGUgYWRhcHRlciIpOwogCQkJaWYgKHNreWhhd2tfY2hpcChhZGFwdGVyKSkKIAkJCQliZV9zZXRfZXJyb3IoYWRhcHRlciwgQkVfRVJST1JfVUUpOwogCkBAIC0zNDI1LDEwICszNjIxLDkgQEAKIAogc3RhdGljIHZvaWQgYmVfZGlzYWJsZV9pZl9maWx0ZXJzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogewotCWJlX2NtZF9wbWFjX2RlbChhZGFwdGVyLCBhZGFwdGVyLT5pZl9oYW5kbGUsCi0JCQlhZGFwdGVyLT5wbWFjX2lkWzBdLCAwKTsKLQorCWJlX2Rldl9tYWNfZGVsKGFkYXB0ZXIsIGFkYXB0ZXItPnBtYWNfaWRbMF0pOwogCWJlX2NsZWFyX3VjX2xpc3QoYWRhcHRlcik7CisJYmVfY2xlYXJfbWNfbGlzdChhZGFwdGVyKTsKIAogCS8qIFRoZSBJRkFDRSBmbGFncyBhcmUgZW5hYmxlZCBpbiB0aGUgb3BlbiBwYXRoIGFuZCBjbGVhcmVkCiAJICogaW4gdGhlIGNsb3NlIHBhdGguIFdoZW4gYSBWRiBnZXRzIGRldGFjaGVkIGZyb20gdGhlIGhvc3QgYW5kCkBAIC0zNDYyLDYgKzM2NTcsMTEgQEAKIAlpZiAoIShhZGFwdGVyLT5mbGFncyAmIEJFX0ZMQUdTX1NFVFVQX0RPTkUpKQogCQlyZXR1cm4gMDsKIAorCS8qIEJlZm9yZSBhdHRlbXB0aW5nIGNsZWFudXAgZW5zdXJlIGFsbCB0aGUgcGVuZGluZyBjbWRzIGluIHRoZQorCSAqIGNvbmZpZ193cSBoYXZlIGZpbmlzaGVkIGV4ZWN1dGlvbgorCSAqLworCWZsdXNoX3dvcmtxdWV1ZShiZV93cSk7CisKIAliZV9kaXNhYmxlX2lmX2ZpbHRlcnMoYWRhcHRlcik7CiAKIAlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBCRV9GTEFHU19OQVBJX0VOQUJMRUQpIHsKQEAgLTM1NzYsMTcgKzM3NzYsMTYgQEAKIAogCS8qIEZvciBCRTMgVkZzLCB0aGUgUEYgcHJvZ3JhbXMgdGhlIGluaXRpYWwgTUFDIGFkZHJlc3MgKi8KIAlpZiAoIShCRXhfY2hpcChhZGFwdGVyKSAmJiBiZV92aXJ0Zm4oYWRhcHRlcikpKSB7Ci0JCXN0YXR1cyA9IGJlX2NtZF9wbWFjX2FkZChhZGFwdGVyLCBhZGFwdGVyLT5uZXRkZXYtPmRldl9hZGRyLAotCQkJCQkgYWRhcHRlci0+aWZfaGFuZGxlLAotCQkJCQkgJmFkYXB0ZXItPnBtYWNfaWRbMF0sIDApOworCQlzdGF0dXMgPSBiZV9kZXZfbWFjX2FkZChhZGFwdGVyLCBhZGFwdGVyLT5uZXRkZXYtPmRldl9hZGRyKTsKIAkJaWYgKHN0YXR1cykKIAkJCXJldHVybiBzdGF0dXM7CisJCWV0aGVyX2FkZHJfY29weShhZGFwdGVyLT5kZXZfbWFjLCBhZGFwdGVyLT5uZXRkZXYtPmRldl9hZGRyKTsKIAl9CiAKIAlpZiAoYWRhcHRlci0+dmxhbnNfYWRkZWQpCiAJCWJlX3ZpZF9jb25maWcoYWRhcHRlcik7CiAKLQliZV9zZXRfcnhfbW9kZShhZGFwdGVyLT5uZXRkZXYpOworCV9fYmVfc2V0X3J4X21vZGUoYWRhcHRlcik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM3NTksOCArMzk1OCwxMyBAQAogCiBzdGF0aWMgdm9pZCBiZV9jYW5jZWxfZXJyX2RldGVjdGlvbihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKKwlzdHJ1Y3QgYmVfZXJyb3JfcmVjb3ZlcnkgKmVycl9yZWMgPSAmYWRhcHRlci0+ZXJyb3JfcmVjb3Zlcnk7CisKKwlpZiAoIWJlX2Vycl9yZWNvdmVyeV93b3JrcSkKKwkJcmV0dXJuOworCiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgQkVfRkxBR1NfRVJSX0RFVEVDVElPTl9TQ0hFRFVMRUQpIHsKLQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZhZGFwdGVyLT5iZV9lcnJfZGV0ZWN0aW9uX3dvcmspOworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmVycl9yZWMtPmVycl9kZXRlY3Rpb25fd29yayk7CiAJCWFkYXB0ZXItPmZsYWdzICY9IH5CRV9GTEFHU19FUlJfREVURUNUSU9OX1NDSEVEVUxFRDsKIAl9CiB9CkBAIC0zODYwLDYgKzQwNjQsMjAgQEAKIAkJdmZ0X3Jlcy0+bWF4X21jY19jb3VudCA9IHJlcy5tYXhfbWNjX2NvdW50IC8gKG51bV92ZnMgKyAxKTsKIH0KIAorc3RhdGljIHZvaWQgYmVfaWZfZGVzdHJveShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwliZV9jbWRfaWZfZGVzdHJveShhZGFwdGVyLCBhZGFwdGVyLT5pZl9oYW5kbGUsICAwKTsKKworCWtmcmVlKGFkYXB0ZXItPnBtYWNfaWQpOworCWFkYXB0ZXItPnBtYWNfaWQgPSBOVUxMOworCisJa2ZyZWUoYWRhcHRlci0+bWNfbGlzdCk7CisJYWRhcHRlci0+bWNfbGlzdCA9IE5VTEw7CisKKwlrZnJlZShhZGFwdGVyLT51Y19saXN0KTsKKwlhZGFwdGVyLT51Y19saXN0ID0gTlVMTDsKK30KKwogc3RhdGljIGludCBiZV9jbGVhcihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CkBAIC0zODY3LDYgKzQwODUsOCBAQAogCiAJYmVfY2FuY2VsX3dvcmtlcihhZGFwdGVyKTsKIAorCWZsdXNoX3dvcmtxdWV1ZShiZV93cSk7CisKIAlpZiAoc3Jpb3ZfZW5hYmxlZChhZGFwdGVyKSkKIAkJYmVfdmZfY2xlYXIoYWRhcHRlcik7CiAKQEAgLTM4ODQsMTAgKzQxMDQsOCBAQAogCX0KIAogCWJlX2Rpc2FibGVfdnhsYW5fb2ZmbG9hZHMoYWRhcHRlcik7Ci0Ja2ZyZWUoYWRhcHRlci0+cG1hY19pZCk7Ci0JYWRhcHRlci0+cG1hY19pZCA9IE5VTEw7CiAKLQliZV9jbWRfaWZfZGVzdHJveShhZGFwdGVyLCBhZGFwdGVyLT5pZl9oYW5kbGUsICAwKTsKKwliZV9pZl9kZXN0cm95KGFkYXB0ZXIpOwogCiAJYmVfY2xlYXJfcXVldWVzKGFkYXB0ZXIpOwogCkBAIC00MTUxLDcgKzQzNjksNyBAQAogICogZm9yIGRpc3RyaWJ1dGlvbiBiZXR3ZWVuIHRoZSBWRnMuIFRoaXMgc2VsZi1pbXBvc2VkIGxpbWl0IHdpbGwgZGV0ZXJtaW5lIHRoZQogICogbm86IG9mIFZGcyBmb3Igd2hpY2ggUlNTIGNhbiBiZSBlbmFibGVkLgogICovCi12b2lkIGJlX2NhbGN1bGF0ZV9wZl9wb29sX3Jzc190YWJsZXMoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCitzdGF0aWMgdm9pZCBiZV9jYWxjdWxhdGVfcGZfcG9vbF9yc3NfdGFibGVzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBiZV9wb3J0X3Jlc291cmNlcyBwb3J0X3JlcyA9IHswfTsKIAl1OCByc3NfdGFibGVzX29uX3BvcnQ7CkBAIC00MzQxLDE0ICs0NTU5LDI5IEBACiAKIHN0YXRpYyB2b2lkIGJlX3NjaGVkdWxlX3dvcmtlcihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFkYXB0ZXItPndvcmssIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhiZV93cSwgJmFkYXB0ZXItPndvcmssIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOwogCWFkYXB0ZXItPmZsYWdzIHw9IEJFX0ZMQUdTX1dPUktFUl9TQ0hFRFVMRUQ7CiB9CiAKK3N0YXRpYyB2b2lkIGJlX2Rlc3Ryb3lfZXJyX3JlY292ZXJ5X3dvcmtxKHZvaWQpCit7CisJaWYgKCFiZV9lcnJfcmVjb3Zlcnlfd29ya3EpCisJCXJldHVybjsKKworCWZsdXNoX3dvcmtxdWV1ZShiZV9lcnJfcmVjb3Zlcnlfd29ya3EpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGJlX2Vycl9yZWNvdmVyeV93b3JrcSk7CisJYmVfZXJyX3JlY292ZXJ5X3dvcmtxID0gTlVMTDsKK30KKwogc3RhdGljIHZvaWQgYmVfc2NoZWR1bGVfZXJyX2RldGVjdGlvbihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyIGRlbGF5KQogewotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWRhcHRlci0+YmVfZXJyX2RldGVjdGlvbl93b3JrLAotCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhkZWxheSkpOworCXN0cnVjdCBiZV9lcnJvcl9yZWNvdmVyeSAqZXJyX3JlYyA9ICZhZGFwdGVyLT5lcnJvcl9yZWNvdmVyeTsKKworCWlmICghYmVfZXJyX3JlY292ZXJ5X3dvcmtxKQorCQlyZXR1cm47CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYmVfZXJyX3JlY292ZXJ5X3dvcmtxLCAmZXJyX3JlYy0+ZXJyX2RldGVjdGlvbl93b3JrLAorCQkJICAgbXNlY3NfdG9famlmZmllcyhkZWxheSkpOwogCWFkYXB0ZXItPmZsYWdzIHw9IEJFX0ZMQUdTX0VSUl9ERVRFQ1RJT05fU0NIRURVTEVEOwogfQogCkBAIC00MzkzLDYgKzQ2MjYsMjIgQEAKIAl1MzIgY2FwX2ZsYWdzID0gYmVfaWZfY2FwX2ZsYWdzKGFkYXB0ZXIpOwogCWludCBzdGF0dXM7CiAKKwkvKiBhbGxvYyByZXF1aXJlZCBtZW1vcnkgZm9yIG90aGVyIGZpbHRlcmluZyBmaWVsZHMgKi8KKwlhZGFwdGVyLT5wbWFjX2lkID0ga2NhbGxvYyhiZV9tYXhfdWMoYWRhcHRlciksCisJCQkJICAgc2l6ZW9mKCphZGFwdGVyLT5wbWFjX2lkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZGFwdGVyLT5wbWFjX2lkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFkYXB0ZXItPm1jX2xpc3QgPSBrY2FsbG9jKGJlX21heF9tYyhhZGFwdGVyKSwKKwkJCQkgICBzaXplb2YoKmFkYXB0ZXItPm1jX2xpc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXB0ZXItPm1jX2xpc3QpCisJCXJldHVybiAtRU5PTUVNOworCisJYWRhcHRlci0+dWNfbGlzdCA9IGtjYWxsb2MoYmVfbWF4X3VjKGFkYXB0ZXIpLAorCQkJCSAgIHNpemVvZigqYWRhcHRlci0+dWNfbGlzdCksIEdGUF9LRVJORUwpOworCWlmICghYWRhcHRlci0+dWNfbGlzdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlpZiAoYWRhcHRlci0+Y2ZnX251bV9yeF9pcnFzID09IDEpCiAJCWNhcF9mbGFncyAmPSB+KEJFX0lGX0ZMQUdTX0RFRlFfUlNTIHwgQkVfSUZfRkxBR1NfUlNTKTsKIApAQCAtNDQwMSw3ICs0NjUwLDEwIEBACiAJc3RhdHVzID0gYmVfY21kX2lmX2NyZWF0ZShhZGFwdGVyLCBiZV9pZl9jYXBfZmxhZ3MoYWRhcHRlciksIGVuX2ZsYWdzLAogCQkJCSAgJmFkYXB0ZXItPmlmX2hhbmRsZSwgMCk7CiAKLQlyZXR1cm4gc3RhdHVzOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwlyZXR1cm4gMDsKIH0KIAogaW50IGJlX3VwZGF0ZV9xdWV1ZXMoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC00NDU4LDEwICs0NzEwLDE1IEBACiAJcmV0dXJuIGZ3X21ham9yOwogfQogCi0vKiBJZiBhbnkgVkZzIGFyZSBhbHJlYWR5IGVuYWJsZWQgZG9uJ3QgRkxSIHRoZSBQRiAqLworLyogSWYgaXQgaXMgZXJyb3IgcmVjb3ZlcnksIEZMUiB0aGUgUEYKKyAqIEVsc2UgaWYgYW55IFZGcyBhcmUgYWxyZWFkeSBlbmFibGVkIGRvbid0IEZMUiB0aGUgUEYKKyAqLwogc3RhdGljIGJvb2wgYmVfcmVzZXRfcmVxdWlyZWQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JcmV0dXJuIHBjaV9udW1fdmYoYWRhcHRlci0+cGRldikgPyBmYWxzZSA6IHRydWU7CisJaWYgKGJlX2Vycm9yX3JlY292ZXJpbmcoYWRhcHRlcikpCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIHBjaV9udW1fdmYoYWRhcHRlci0+cGRldikgPT0gMDsKIH0KIAogLyogV2FpdCBmb3IgdGhlIEZXIHRvIGJlIHJlYWR5IGFuZCBwZXJmb3JtIHRoZSByZXF1aXJlZCBpbml0aWFsaXphdGlvbiAqLwpAQCAtNDQ3Myw2ICs0NzMwLDkgQEAKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwogCisJLyogRlcgaXMgbm93IHJlYWR5OyBjbGVhciBlcnJvcnMgdG8gYWxsb3cgY21kcy9kb29yYmVsbCAqLworCWJlX2NsZWFyX2Vycm9yKGFkYXB0ZXIsIEJFX0NMRUFSX0FMTCk7CisKIAlpZiAoYmVfcmVzZXRfcmVxdWlyZWQoYWRhcHRlcikpIHsKIAkJc3RhdHVzID0gYmVfY21kX3Jlc2V0X2Z1bmN0aW9uKGFkYXB0ZXIpOwogCQlpZiAoc3RhdHVzKQpAQCAtNDQ4MCw5ICs0NzQwLDYgQEAKIAogCQkvKiBXYWl0IGZvciBpbnRlcnJ1cHRzIHRvIHF1aWVzY2UgYWZ0ZXIgYW4gRkxSICovCiAJCW1zbGVlcCgxMDApOwotCi0JCS8qIFdlIGNhbiBjbGVhciBhbGwgZXJyb3JzIHdoZW4gZnVuY3Rpb24gcmVzZXQgc3VjY2VlZHMgKi8KLQkJYmVfY2xlYXJfZXJyb3IoYWRhcHRlciwgQkVfQ0xFQVJfQUxMKTsKIAl9CiAKIAkvKiBUZWxsIEZXIHdlJ3JlIHJlYWR5IHRvIGZpcmUgY21kcyAqLwpAQCAtNDUzMCwxMSArNDc4Nyw2IEBACiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnI7CiAKLQlhZGFwdGVyLT5wbWFjX2lkID0ga2NhbGxvYyhiZV9tYXhfdWMoYWRhcHRlciksCi0JCQkJICAgc2l6ZW9mKCphZGFwdGVyLT5wbWFjX2lkKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhZGFwdGVyLT5wbWFjX2lkKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCXN0YXR1cyA9IGJlX21zaXhfZW5hYmxlKGFkYXB0ZXIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyOwpAQCAtNDU5NSw2ICs0ODQ3LDkgQEAKIAlpZiAoIXN0YXR1cyAmJiBiZV9wYXVzZV9zdXBwb3J0ZWQoYWRhcHRlcikpCiAJCWFkYXB0ZXItPnBoeS5mY19hdXRvbmVnID0gMTsKIAorCWlmIChiZV9waHlzZm4oYWRhcHRlcikgJiYgIWxhbmNlcl9jaGlwKGFkYXB0ZXIpKQorCQliZV9jbWRfc2V0X2ZlYXR1cmVzKGFkYXB0ZXIpOworCiAJYmVfc2NoZWR1bGVfd29ya2VyKGFkYXB0ZXIpOwogCWFkYXB0ZXItPmZsYWdzIHw9IEJFX0ZMQUdTX1NFVFVQX0RPTkU7CiAJcmV0dXJuIDA7CkBAIC00NzI4LDYgKzQ5ODMsMjMgQEAKIAkJCQkgICAgICAgMCwgMCwgbmxmbGFncywgZmlsdGVyX21hc2ssIE5VTEwpOwogfQogCitzdGF0aWMgc3RydWN0IGJlX2NtZF93b3JrICpiZV9hbGxvY193b3JrKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAorCQkJCQkgdm9pZCAoKmZ1bmMpKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSkKK3sKKwlzdHJ1Y3QgYmVfY21kX3dvcmsgKndvcms7CisKKwl3b3JrID0ga3phbGxvYyhzaXplb2YoKndvcmspLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXdvcmspIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJImJlX3dvcmsgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJSU5JVF9XT1JLKCZ3b3JrLT53b3JrLCBmdW5jKTsKKwl3b3JrLT5hZGFwdGVyID0gYWRhcHRlcjsKKwlyZXR1cm4gd29yazsKK30KKwogLyogVnhMQU4gb2ZmbG9hZCBOb3RlczoKICAqCiAgKiBUaGUgc3RhY2sgZGVmaW5lcyB0dW5uZWwgb2ZmbG9hZCBmbGFncyAoaHdfZW5jX2ZlYXR1cmVzKSBmb3IgSVAgYW5kIGRvZXNuJ3QKQEAgLTQ3NDIsMjMgKzUwMTQsMTkgQEAKICAqIGFkZHMgbW9yZSB0aGFuIG9uZSBwb3J0LCBkaXNhYmxlIG9mZmxvYWRzIGFuZCBkb24ndCByZS1lbmFibGUgdGhlbSBhZ2FpbgogICogdW50aWwgYWZ0ZXIgYWxsIHRoZSB0dW5uZWxzIGFyZSByZW1vdmVkLgogICovCi1zdGF0aWMgdm9pZCBiZV9hZGRfdnhsYW5fcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJICAgICAgc3RydWN0IHVkcF90dW5uZWxfaW5mbyAqdGkpCitzdGF0aWMgdm9pZCBiZV93b3JrX2FkZF92eGxhbl9wb3J0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2NtZF93b3JrICpjbWRfd29yayA9CisJCQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBiZV9jbWRfd29yaywgd29yayk7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbWRfd29yay0+YWRhcHRlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhZGFwdGVyLT5wZGV2LT5kZXY7Ci0JX19iZTE2IHBvcnQgPSB0aS0+cG9ydDsKKwlfX2JlMTYgcG9ydCA9IGNtZF93b3JrLT5pbmZvLnZ4bGFuX3BvcnQ7CiAJaW50IHN0YXR1czsKIAotCWlmICh0aS0+dHlwZSAhPSBVRFBfVFVOTkVMX1RZUEVfVlhMQU4pCi0JCXJldHVybjsKLQotCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSB8fCBCRXhfY2hpcChhZGFwdGVyKSB8fCBiZV9pc19tYyhhZGFwdGVyKSkKLQkJcmV0dXJuOwotCiAJaWYgKGFkYXB0ZXItPnZ4bGFuX3BvcnQgPT0gcG9ydCAmJiBhZGFwdGVyLT52eGxhbl9wb3J0X2NvdW50KSB7CiAJCWFkYXB0ZXItPnZ4bGFuX3BvcnRfYWxpYXNlcysrOwotCQlyZXR1cm47CisJCWdvdG8gZG9uZTsKIAl9CiAKIAlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBCRV9GTEFHU19WWExBTl9PRkZMT0FEUykgewpAQCAtNDc3MCw3ICs1MDM4LDcgQEAKIAl9CiAKIAlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydF9jb3VudCsrID49IDEpCi0JCXJldHVybjsKKwkJZ290byBkb25lOwogCiAJc3RhdHVzID0gYmVfY21kX21hbmFnZV9pZmFjZShhZGFwdGVyLCBhZGFwdGVyLT5pZl9oYW5kbGUsCiAJCQkJICAgICBPUF9DT05WRVJUX05PUk1BTF9UT19UVU5ORUwpOwpAQCAtNDc5NSwyOSArNTA2MywyNiBAQAogCiAJZGV2X2luZm8oZGV2LCAiRW5hYmxlZCBWeExBTiBvZmZsb2FkcyBmb3IgVURQIHBvcnQgJWRcbiIsCiAJCSBiZTE2X3RvX2NwdShwb3J0KSk7Ci0JcmV0dXJuOworCWdvdG8gZG9uZTsKIGVycjoKIAliZV9kaXNhYmxlX3Z4bGFuX29mZmxvYWRzKGFkYXB0ZXIpOworZG9uZToKKwlrZnJlZShjbWRfd29yayk7CiB9CiAKLXN0YXRpYyB2b2lkIGJlX2RlbF92eGxhbl9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkgICAgICBzdHJ1Y3QgdWRwX3R1bm5lbF9pbmZvICp0aSkKK3N0YXRpYyB2b2lkIGJlX3dvcmtfZGVsX3Z4bGFuX3BvcnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlfX2JlMTYgcG9ydCA9IHRpLT5wb3J0OwotCi0JaWYgKHRpLT50eXBlICE9IFVEUF9UVU5ORUxfVFlQRV9WWExBTikKLQkJcmV0dXJuOwotCi0JaWYgKGxhbmNlcl9jaGlwKGFkYXB0ZXIpIHx8IEJFeF9jaGlwKGFkYXB0ZXIpIHx8IGJlX2lzX21jKGFkYXB0ZXIpKQotCQlyZXR1cm47CisJc3RydWN0IGJlX2NtZF93b3JrICpjbWRfd29yayA9CisJCQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBiZV9jbWRfd29yaywgd29yayk7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbWRfd29yay0+YWRhcHRlcjsKKwlfX2JlMTYgcG9ydCA9IGNtZF93b3JrLT5pbmZvLnZ4bGFuX3BvcnQ7CiAKIAlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydCAhPSBwb3J0KQogCQlnb3RvIGRvbmU7CiAKIAlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydF9hbGlhc2VzKSB7CiAJCWFkYXB0ZXItPnZ4bGFuX3BvcnRfYWxpYXNlcy0tOwotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCX0KIAogCWJlX2Rpc2FibGVfdnhsYW5fb2ZmbG9hZHMoYWRhcHRlcik7CkBAIC00ODI3LDYgKzUwOTIsNDAgQEAKIAkJIGJlMTZfdG9fY3B1KHBvcnQpKTsKIGRvbmU6CiAJYWRhcHRlci0+dnhsYW5fcG9ydF9jb3VudC0tOworb3V0OgorCWtmcmVlKGNtZF93b3JrKTsKK30KKworc3RhdGljIHZvaWQgYmVfY2ZnX3Z4bGFuX3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgIHN0cnVjdCB1ZHBfdHVubmVsX2luZm8gKnRpLAorCQkJICAgICAgdm9pZCAoKmZ1bmMpKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSkKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2NtZF93b3JrICpjbWRfd29yazsKKworCWlmICh0aS0+dHlwZSAhPSBVRFBfVFVOTkVMX1RZUEVfVlhMQU4pCisJCXJldHVybjsKKworCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSB8fCBCRXhfY2hpcChhZGFwdGVyKSB8fCBiZV9pc19tYyhhZGFwdGVyKSkKKwkJcmV0dXJuOworCisJY21kX3dvcmsgPSBiZV9hbGxvY193b3JrKGFkYXB0ZXIsIGZ1bmMpOworCWlmIChjbWRfd29yaykgeworCQljbWRfd29yay0+aW5mby52eGxhbl9wb3J0ID0gdGktPnBvcnQ7CisJCXF1ZXVlX3dvcmsoYmVfd3EsICZjbWRfd29yay0+d29yayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBiZV9kZWxfdnhsYW5fcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICAgc3RydWN0IHVkcF90dW5uZWxfaW5mbyAqdGkpCit7CisJYmVfY2ZnX3Z4bGFuX3BvcnQobmV0ZGV2LCB0aSwgYmVfd29ya19kZWxfdnhsYW5fcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGJlX2FkZF92eGxhbl9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgICBzdHJ1Y3QgdWRwX3R1bm5lbF9pbmZvICp0aSkKK3sKKwliZV9jZmdfdnhsYW5fcG9ydChuZXRkZXYsIHRpLCBiZV93b3JrX2FkZF92eGxhbl9wb3J0KTsKIH0KIAogc3RhdGljIG5ldGRldl9mZWF0dXJlc190IGJlX2ZlYXR1cmVzX2NoZWNrKHN0cnVjdCBza19idWZmICpza2IsCkBAIC00ODkxLDYgKzUxOTAsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgYmVfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGJlX2NtZF93b3JrICp3b3JrOworCisJd29yayA9IGJlX2FsbG9jX3dvcmsoYWRhcHRlciwgYmVfd29ya19zZXRfcnhfbW9kZSk7CisJaWYgKHdvcmspCisJCXF1ZXVlX3dvcmsoYmVfd3EsICZ3b3JrLT53b3JrKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBiZV9uZXRkZXZfb3BzID0gewogCS5uZG9fb3BlbgkJPSBiZV9vcGVuLAogCS5uZG9fc3RvcAkJPSBiZV9jbG9zZSwKQEAgLTQ5ODQsMTMgKzUyOTMsMTQ1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGJlX3NvZnRfcmVzZXQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIHZhbDsKKworCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJJbml0aWF0aW5nIGNoaXAgc29mdCByZXNldFxuIik7CisJdmFsID0gaW9yZWFkMzIoYWRhcHRlci0+cGNpY2ZnICsgU0xJUE9SVF9TT0ZUUkVTRVRfT0ZGU0VUKTsKKwl2YWwgfD0gU0xJUE9SVF9TT0ZUUkVTRVRfU1JfTUFTSzsKKwlpb3dyaXRlMzIodmFsLCBhZGFwdGVyLT5wY2ljZmcgKyBTTElQT1JUX1NPRlRSRVNFVF9PRkZTRVQpOworfQorCitzdGF0aWMgYm9vbCBiZV9lcnJfaXNfcmVjb3ZlcmFibGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGJlX2Vycm9yX3JlY292ZXJ5ICplcnJfcmVjID0gJmFkYXB0ZXItPmVycm9yX3JlY292ZXJ5OworCXVuc2lnbmVkIGxvbmcgaW5pdGlhbF9pZGxlX3RpbWUgPQorCQltc2Vjc190b19qaWZmaWVzKEVSUl9SRUNPVkVSWV9JRExFX1RJTUUpOworCXVuc2lnbmVkIGxvbmcgcmVjb3ZlcnlfaW50ZXJ2YWwgPQorCQltc2Vjc190b19qaWZmaWVzKEVSUl9SRUNPVkVSWV9JTlRFUlZBTCk7CisJdTE2IHVlX2Vycl9jb2RlOworCXUzMiB2YWw7CisKKwl2YWwgPSBiZV9QT1NUX3N0YWdlX2dldChhZGFwdGVyKTsKKwlpZiAoKHZhbCAmIFBPU1RfU1RBR0VfUkVDT1ZFUkFCTEVfRVJSKSAhPSBQT1NUX1NUQUdFX1JFQ09WRVJBQkxFX0VSUikKKwkJcmV0dXJuIGZhbHNlOworCXVlX2Vycl9jb2RlID0gdmFsICYgUE9TVF9FUlJfUkVDT1ZFUllfQ09ERV9NQVNLOworCWlmICh1ZV9lcnJfY29kZSA9PSAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJSZWNvdmVyYWJsZSBIVyBlcnJvciBjb2RlOiAweCV4XG4iLAorCQl1ZV9lcnJfY29kZSk7CisKKwlpZiAoamlmZmllcyAtIGVycl9yZWMtPnByb2JlX3RpbWUgPD0gaW5pdGlhbF9pZGxlX3RpbWUpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJIkNhbm5vdCByZWNvdmVyIHdpdGhpbiAlbHUgc2VjIGZyb20gZHJpdmVyIGxvYWRcbiIsCisJCQlqaWZmaWVzX3RvX21zZWNzKGluaXRpYWxfaWRsZV90aW1lKSAvIE1TRUNfUEVSX1NFQyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoZXJyX3JlYy0+bGFzdF9yZWNvdmVyeV90aW1lICYmCisJICAgIChqaWZmaWVzIC0gZXJyX3JlYy0+bGFzdF9yZWNvdmVyeV90aW1lIDw9IHJlY292ZXJ5X2ludGVydmFsKSkgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiQ2Fubm90IHJlY292ZXIgd2l0aGluICVsdSBzZWMgZnJvbSBsYXN0IHJlY292ZXJ5XG4iLAorCQkJamlmZmllc190b19tc2VjcyhyZWNvdmVyeV9pbnRlcnZhbCkgLyBNU0VDX1BFUl9TRUMpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKHVlX2Vycl9jb2RlID09IGVycl9yZWMtPmxhc3RfZXJyX2NvZGUpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJIkNhbm5vdCByZWNvdmVyIGZyb20gYSBjb25zZWN1dGl2ZSBUUEUgZXJyb3JcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJZXJyX3JlYy0+bGFzdF9yZWNvdmVyeV90aW1lID0gamlmZmllczsKKwllcnJfcmVjLT5sYXN0X2Vycl9jb2RlID0gdWVfZXJyX2NvZGU7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgYmVfdHBlX3JlY292ZXIoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGJlX2Vycm9yX3JlY292ZXJ5ICplcnJfcmVjID0gJmFkYXB0ZXItPmVycm9yX3JlY292ZXJ5OworCWludCBzdGF0dXMgPSAtRUFHQUlOOworCXUzMiB2YWw7CisKKwlzd2l0Y2ggKGVycl9yZWMtPnJlY292ZXJ5X3N0YXRlKSB7CisJY2FzZSBFUlJfUkVDT1ZFUllfU1RfTk9ORToKKwkJZXJyX3JlYy0+cmVjb3Zlcnlfc3RhdGUgPSBFUlJfUkVDT1ZFUllfU1RfREVURUNUOworCQllcnJfcmVjLT5yZXNjaGVkX2RlbGF5ID0gRVJSX1JFQ09WRVJZX1VFX0RFVEVDVF9EVVJBVElPTjsKKwkJYnJlYWs7CisKKwljYXNlIEVSUl9SRUNPVkVSWV9TVF9ERVRFQ1Q6CisJCXZhbCA9IGJlX1BPU1Rfc3RhZ2VfZ2V0KGFkYXB0ZXIpOworCQlpZiAoKHZhbCAmIFBPU1RfU1RBR0VfUkVDT1ZFUkFCTEVfRVJSKSAhPQorCQkgICAgUE9TVF9TVEFHRV9SRUNPVkVSQUJMRV9FUlIpIHsKKwkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkiVW5yZWNvdmVyYWJsZSBIVyBlcnJvciBkZXRlY3RlZDogMHgleFxuIiwgdmFsKTsKKwkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQllcnJfcmVjLT5yZXNjaGVkX2RlbGF5ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiUmVjb3ZlcmFibGUgSFcgZXJyb3IgZGV0ZWN0ZWRcbiIpOworCisJCS8qIE9ubHkgUEYwIGluaXRpYXRlcyBDaGlwIFNvZnQgUmVzZXQuIEJ1dCBQRjAgbXVzdCB3YWl0IFVFMlNSCisJCSAqIG1pbGxpc2Vjb25kcyBiZWZvcmUgaXQgY2hlY2tzIGZvciBmaW5hbCBlcnJvciBzdGF0dXMgaW4KKwkJICogU0xJUE9SVF9TRU1BUEhPUkUgdG8gZGV0ZXJtaW5lIGlmIHJlY292ZXJ5IGNyaXRlcmlhIGlzIG1ldC4KKwkJICogSWYgaXQgZG9lcywgdGhlbiBQRjAgaW5pdGlhdGVzIGEgU29mdCBSZXNldC4KKwkJICovCisJCWlmIChhZGFwdGVyLT5wZl9udW0gPT0gMCkgeworCQkJZXJyX3JlYy0+cmVjb3Zlcnlfc3RhdGUgPSBFUlJfUkVDT1ZFUllfU1RfUkVTRVQ7CisJCQllcnJfcmVjLT5yZXNjaGVkX2RlbGF5ID0gZXJyX3JlYy0+dWVfdG9fcmVzZXRfdGltZSAtCisJCQkJCUVSUl9SRUNPVkVSWV9VRV9ERVRFQ1RfRFVSQVRJT047CisJCQlicmVhazsKKwkJfQorCisJCWVycl9yZWMtPnJlY292ZXJ5X3N0YXRlID0gRVJSX1JFQ09WRVJZX1NUX1BSRV9QT0xMOworCQllcnJfcmVjLT5yZXNjaGVkX2RlbGF5ID0gZXJyX3JlYy0+dWVfdG9fcG9sbF90aW1lIC0KKwkJCQkJRVJSX1JFQ09WRVJZX1VFX0RFVEVDVF9EVVJBVElPTjsKKwkJYnJlYWs7CisKKwljYXNlIEVSUl9SRUNPVkVSWV9TVF9SRVNFVDoKKwkJaWYgKCFiZV9lcnJfaXNfcmVjb3ZlcmFibGUoYWRhcHRlcikpIHsKKwkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkiRmFpbGVkIHRvIG1lZXQgcmVjb3ZlcnkgY3JpdGVyaWFcbiIpOworCQkJc3RhdHVzID0gLUVJTzsKKwkJCWVycl9yZWMtPnJlc2NoZWRfZGVsYXkgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJYmVfc29mdF9yZXNldChhZGFwdGVyKTsKKwkJZXJyX3JlYy0+cmVjb3Zlcnlfc3RhdGUgPSBFUlJfUkVDT1ZFUllfU1RfUFJFX1BPTEw7CisJCWVycl9yZWMtPnJlc2NoZWRfZGVsYXkgPSBlcnJfcmVjLT51ZV90b19wb2xsX3RpbWUgLQorCQkJCQllcnJfcmVjLT51ZV90b19yZXNldF90aW1lOworCQlicmVhazsKKworCWNhc2UgRVJSX1JFQ09WRVJZX1NUX1BSRV9QT0xMOgorCQllcnJfcmVjLT5yZWNvdmVyeV9zdGF0ZSA9IEVSUl9SRUNPVkVSWV9TVF9SRUlOSVQ7CisJCWVycl9yZWMtPnJlc2NoZWRfZGVsYXkgPSAwOworCQlzdGF0dXMgPSAwOwkJCS8qIGRvbmUgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRUlOVkFMOworCQllcnJfcmVjLT5yZXNjaGVkX2RlbGF5ID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKwogc3RhdGljIGludCBiZV9lcnJfcmVjb3ZlcihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpbnQgc3RhdHVzOwogCi0JLyogRXJyb3IgcmVjb3ZlcnkgaXMgc3VwcG9ydGVkIG9ubHkgTGFuY2VyIGFzIG9mIG5vdyAqLwotCWlmICghbGFuY2VyX2NoaXAoYWRhcHRlcikpCi0JCXJldHVybiAtRUlPOworCWlmICghbGFuY2VyX2NoaXAoYWRhcHRlcikpIHsKKwkJaWYgKCFhZGFwdGVyLT5lcnJvcl9yZWNvdmVyeS5yZWNvdmVyeV9zdXBwb3J0ZWQgfHwKKwkJICAgIGFkYXB0ZXItPnByaXZfZmxhZ3MgJiBCRV9ESVNBQkxFX1RQRV9SRUNPVkVSWSkKKwkJCXJldHVybiAtRUlPOworCQlzdGF0dXMgPSBiZV90cGVfcmVjb3ZlcihhZGFwdGVyKTsKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gZXJyOworCX0KIAogCS8qIFdhaXQgZm9yIGFkYXB0ZXIgdG8gcmVhY2ggcXVpZXNjZW50IHN0YXRlIGJlZm9yZQogCSAqIGRlc3Ryb3lpbmcgcXVldWVzCkBAIC00OTk5LDU5ICs1NDQwLDc0IEBACiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnI7CiAKKwlhZGFwdGVyLT5mbGFncyB8PSBCRV9GTEFHU19UUllfUkVDT1ZFUlk7CisKIAliZV9jbGVhbnVwKGFkYXB0ZXIpOwogCiAJc3RhdHVzID0gYmVfcmVzdW1lKGFkYXB0ZXIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyOwogCi0JcmV0dXJuIDA7CisJYWRhcHRlci0+ZmxhZ3MgJj0gfkJFX0ZMQUdTX1RSWV9SRUNPVkVSWTsKKwogZXJyOgogCXJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXRpYyB2b2lkIGJlX2Vycl9kZXRlY3Rpb25fdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IGJlX2Vycm9yX3JlY292ZXJ5ICplcnJfcmVjID0KKwkJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmVfZXJyb3JfcmVjb3ZlcnksCisJCQkJICAgICBlcnJfZGV0ZWN0aW9uX3dvcmsud29yayk7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPQotCQkJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmVfYWRhcHRlciwKLQkJCQkJICAgICBiZV9lcnJfZGV0ZWN0aW9uX3dvcmsud29yayk7CisJCQljb250YWluZXJfb2YoZXJyX3JlYywgc3RydWN0IGJlX2FkYXB0ZXIsCisJCQkJICAgICBlcnJvcl9yZWNvdmVyeSk7CisJdTMyIHJlc2NoZWRfZGVsYXkgPSBFUlJfUkVDT1ZFUllfREVURUNUSU9OX0RFTEFZOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhZGFwdGVyLT5wZGV2LT5kZXY7CiAJaW50IHJlY292ZXJ5X3N0YXR1czsKLQlpbnQgZGVsYXkgPSBFUlJfREVURUNUSU9OX0RFTEFZOwogCiAJYmVfZGV0ZWN0X2Vycm9yKGFkYXB0ZXIpOwotCi0JaWYgKGJlX2NoZWNrX2Vycm9yKGFkYXB0ZXIsIEJFX0VSUk9SX0hXKSkKLQkJcmVjb3Zlcnlfc3RhdHVzID0gYmVfZXJyX3JlY292ZXIoYWRhcHRlcik7Ci0JZWxzZQorCWlmICghYmVfY2hlY2tfZXJyb3IoYWRhcHRlciwgQkVfRVJST1JfSFcpKQogCQlnb3RvIHJlc2NoZWR1bGVfdGFzazsKIAorCXJlY292ZXJ5X3N0YXR1cyA9IGJlX2Vycl9yZWNvdmVyKGFkYXB0ZXIpOwogCWlmICghcmVjb3Zlcnlfc3RhdHVzKSB7Ci0JCWFkYXB0ZXItPnJlY292ZXJ5X3JldHJpZXMgPSAwOworCQllcnJfcmVjLT5yZWNvdmVyeV9yZXRyaWVzID0gMDsKKwkJZXJyX3JlYy0+cmVjb3Zlcnlfc3RhdGUgPSBFUlJfUkVDT1ZFUllfU1RfTk9ORTsKIAkJZGV2X2luZm8oZGV2LCAiQWRhcHRlciByZWNvdmVyeSBzdWNjZXNzZnVsXG4iKTsKIAkJZ290byByZXNjaGVkdWxlX3Rhc2s7Ci0JfSBlbHNlIGlmIChiZV92aXJ0Zm4oYWRhcHRlcikpIHsKKwl9IGVsc2UgaWYgKCFsYW5jZXJfY2hpcChhZGFwdGVyKSAmJiBlcnJfcmVjLT5yZXNjaGVkX2RlbGF5KSB7CisJCS8qIEJFeC9TSCByZWNvdmVyeSBzdGF0ZSBtYWNoaW5lICovCisJCWlmIChhZGFwdGVyLT5wZl9udW0gPT0gMCAmJgorCQkgICAgZXJyX3JlYy0+cmVjb3Zlcnlfc3RhdGUgPiBFUlJfUkVDT1ZFUllfU1RfREVURUNUKQorCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCSJBZGFwdGVyIHJlY292ZXJ5IGluIHByb2dyZXNzXG4iKTsKKwkJcmVzY2hlZF9kZWxheSA9IGVycl9yZWMtPnJlc2NoZWRfZGVsYXk7CisJCWdvdG8gcmVzY2hlZHVsZV90YXNrOworCX0gZWxzZSBpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikgJiYgYmVfdmlydGZuKGFkYXB0ZXIpKSB7CiAJCS8qIEZvciBWRnMsIGNoZWNrIGlmIFBGIGhhdmUgYWxsb2NhdGVkIHJlc291cmNlcwogCQkgKiBldmVyeSBzZWNvbmQuCiAJCSAqLwogCQlkZXZfZXJyKGRldiwgIlJlLXRyeWluZyBhZGFwdGVyIHJlY292ZXJ5XG4iKTsKIAkJZ290byByZXNjaGVkdWxlX3Rhc2s7Ci0JfSBlbHNlIGlmIChhZGFwdGVyLT5yZWNvdmVyeV9yZXRyaWVzKysgPAotCQkgICBNQVhfRVJSX1JFQ09WRVJZX1JFVFJZX0NPVU5UKSB7CisJfSBlbHNlIGlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSAmJiBlcnJfcmVjLT5yZWNvdmVyeV9yZXRyaWVzKysgPAorCQkgICBFUlJfUkVDT1ZFUllfTUFYX1JFVFJZX0NPVU5UKSB7CiAJCS8qIEluIGNhc2Ugb2YgYW5vdGhlciBlcnJvciBkdXJpbmcgcmVjb3ZlcnksIGl0IHRha2VzIDMwIHNlYwogCQkgKiBmb3IgYWRhcHRlciB0byBjb21lIG91dCBvZiBlcnJvci4gUmV0cnkgZXJyb3IgcmVjb3ZlcnkgYWZ0ZXIKIAkJICogdGhpcyB0aW1lIGludGVydmFsLgogCQkgKi8KIAkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiUmUtdHJ5aW5nIGFkYXB0ZXIgcmVjb3ZlcnlcbiIpOwotCQlkZWxheSA9IEVSUl9SRUNPVkVSWV9SRVRSWV9ERUxBWTsKKwkJcmVzY2hlZF9kZWxheSA9IEVSUl9SRUNPVkVSWV9SRVRSWV9ERUxBWTsKIAkJZ290byByZXNjaGVkdWxlX3Rhc2s7CiAJfSBlbHNlIHsKIAkJZGV2X2VycihkZXYsICJBZGFwdGVyIHJlY292ZXJ5IGZhaWxlZFxuIik7CisJCWRldl9lcnIoZGV2LCAiUGxlYXNlIHJlYm9vdCBzZXJ2ZXIgdG8gcmVjb3ZlclxuIik7CiAJfQogCiAJcmV0dXJuOworCiByZXNjaGVkdWxlX3Rhc2s6Ci0JYmVfc2NoZWR1bGVfZXJyX2RldGVjdGlvbihhZGFwdGVyLCBkZWxheSk7CisJYmVfc2NoZWR1bGVfZXJyX2RldGVjdGlvbihhZGFwdGVyLCByZXNjaGVkX2RlbGF5KTsKIH0KIAogc3RhdGljIHZvaWQgYmVfbG9nX3NmcF9pbmZvKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQpAQCAtNTExNiw3ICs1NTcyLDcgQEAKIAogcmVzY2hlZHVsZToKIAlhZGFwdGVyLT53b3JrX2NvdW50ZXIrKzsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFkYXB0ZXItPndvcmssIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhiZV93cSwgJmFkYXB0ZXItPndvcmssIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOwogfQogCiBzdGF0aWMgdm9pZCBiZV91bm1hcF9wY2lfYmFycyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKQEAgLTUyNTYsMTQgKzU3MTIsMTggQEAKIAl9CiAKIAltdXRleF9pbml0KCZhZGFwdGVyLT5tYm94X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfaW5pdCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2luaXQoJmFkYXB0ZXItPnJ4X2ZpbHRlcl9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+bWNjX2NxX2xvY2spOwogCWluaXRfY29tcGxldGlvbigmYWRhcHRlci0+ZXRfY21kX2NvbXBsKTsKIAogCXBjaV9zYXZlX3N0YXRlKGFkYXB0ZXItPnBkZXYpOwogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmFkYXB0ZXItPndvcmssIGJlX3dvcmtlcik7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJmFkYXB0ZXItPmJlX2Vycl9kZXRlY3Rpb25fd29yaywKKworCWFkYXB0ZXItPmVycm9yX3JlY292ZXJ5LnJlY292ZXJ5X3N0YXRlID0gRVJSX1JFQ09WRVJZX1NUX05PTkU7CisJYWRhcHRlci0+ZXJyb3JfcmVjb3ZlcnkucmVzY2hlZF9kZWxheSA9IDA7CisJSU5JVF9ERUxBWUVEX1dPUksoJmFkYXB0ZXItPmVycm9yX3JlY292ZXJ5LmVycl9kZXRlY3Rpb25fd29yaywKIAkJCSAgYmVfZXJyX2RldGVjdGlvbl90YXNrKTsKIAogCWFkYXB0ZXItPnJ4X2ZjID0gdHJ1ZTsKQEAgLTUyOTgsNiArNTc1OCw5IEBACiAKIAliZV9jbGVhcihhZGFwdGVyKTsKIAorCWlmICghcGNpX3Zmc19hc3NpZ25lZChhZGFwdGVyLT5wZGV2KSkKKwkJYmVfY21kX3Jlc2V0X2Z1bmN0aW9uKGFkYXB0ZXIpOworCiAJLyogdGVsbCBmdyB3ZSdyZSBkb25lIHdpdGggZmlyaW5nIGNtZHMgKi8KIAliZV9jbWRfZndfY2xlYW4oYWRhcHRlcik7CiAKQEAgLTU0NTQsNiArNTkxNyw3IEBACiAJYmVfcm9jZV9kZXZfYWRkKGFkYXB0ZXIpOwogCiAJYmVfc2NoZWR1bGVfZXJyX2RldGVjdGlvbihhZGFwdGVyLCBFUlJfREVURUNUSU9OX0RFTEFZKTsKKwlhZGFwdGVyLT5lcnJvcl9yZWNvdmVyeS5wcm9iZV90aW1lID0gamlmZmllczsKIAogCS8qIE9uIERpZSB0ZW1wZXJhdHVyZSBub3Qgc3VwcG9ydGVkIGZvciBWRi4gKi8KIAlpZiAoYmVfcGh5c2ZuKGFkYXB0ZXIpICYmIElTX0VOQUJMRUQoQ09ORklHX0JFMk5FVF9IV01PTikpIHsKQEAgLTU2OTksNiArNjE2Myw4IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGJlX2luaXRfbW9kdWxlKHZvaWQpCiB7CisJaW50IHN0YXR1czsKKwogCWlmIChyeF9mcmFnX3NpemUgIT0gODE5MiAmJiByeF9mcmFnX3NpemUgIT0gNDA5NiAmJgogCSAgICByeF9mcmFnX3NpemUgIT0gMjA0OCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCkBAIC01NzEyLDEyICs2MTc4LDMzIEBACiAJCXByX2luZm8oRFJWX05BTUUgIiA6IFVzZSBzeXNmcyBtZXRob2QgdG8gZW5hYmxlIFZGc1xuIik7CiAJfQogCi0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJlX2RyaXZlcik7CisJYmVfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYmVfd3EiKTsKKwlpZiAoIWJlX3dxKSB7CisJCXByX3dhcm4oRFJWX05BTUUgIndvcmtxdWV1ZSBjcmVhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJYmVfZXJyX3JlY292ZXJ5X3dvcmtxID0KKwkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImJlX2Vycl9yZWNvdmVyIik7CisJaWYgKCFiZV9lcnJfcmVjb3Zlcnlfd29ya3EpCisJCXByX3dhcm4oRFJWX05BTUUgIkNvdWxkIG5vdCBjcmVhdGUgZXJyb3IgcmVjb3Zlcnkgd29ya3F1ZXVlXG4iKTsKKworCXN0YXR1cyA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJlX2RyaXZlcik7CisJaWYgKHN0YXR1cykgeworCQlkZXN0cm95X3dvcmtxdWV1ZShiZV93cSk7CisJCWJlX2Rlc3Ryb3lfZXJyX3JlY292ZXJ5X3dvcmtxKCk7CisJfQorCXJldHVybiBzdGF0dXM7CiB9CiBtb2R1bGVfaW5pdChiZV9pbml0X21vZHVsZSk7CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBiZV9leGl0X21vZHVsZSh2b2lkKQogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYmVfZHJpdmVyKTsKKworCWJlX2Rlc3Ryb3lfZXJyX3JlY292ZXJ5X3dvcmtxKCk7CisKKwlpZiAoYmVfd3EpCisJCWRlc3Ryb3lfd29ya3F1ZXVlKGJlX3dxKTsKIH0KIG1vZHVsZV9leGl0KGJlX2V4aXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZhcmFkYXkvZnRnbWFjMTAwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mYXJhZGF5L2Z0Z21hYzEwMC5jCmluZGV4IDM2MzYxZjguLjI2MjU4NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZhcmFkYXkvZnRnbWFjMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZmFyYWRheS9mdGdtYWMxMDAuYwpAQCAtNjAsNiArNjAsOCBAQAogCXN0cnVjdCBmdGdtYWMxMDBfZGVzY3MgKmRlc2NzOwogCWRtYV9hZGRyX3QgZGVzY3NfZG1hX2FkZHI7CiAKKwlzdHJ1Y3QgcGFnZSAqcnhfcGFnZXNbUlhfUVVFVUVfRU5UUklFU107CisKIAl1bnNpZ25lZCBpbnQgcnhfcG9pbnRlcjsKIAl1bnNpZ25lZCBpbnQgdHhfY2xlYW5fcG9pbnRlcjsKIAl1bnNpZ25lZCBpbnQgdHhfcG9pbnRlcjsKQEAgLTc3LDYgKzc5LDkgQEAKIAlpbnQgaW50X21hc2tfYWxsOwogCWJvb2wgdXNlX25jc2k7CiAJYm9vbCBlbmFibGVkOworCisJdTMyIHJ4ZGVzMF9lZG9ycl9tYXNrOworCXUzMiB0eGRlczBfZWRvdHJfbWFzazsKIH07CiAKIHN0YXRpYyBpbnQgZnRnbWFjMTAwX2FsbG9jX3J4X3BhZ2Uoc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiwKQEAgLTI1NywxMCArMjYyLDExIEBACiAJcmV0dXJuIHJ4ZGVzLT5yeGRlczAgJiBjcHVfdG9fbGUzMihGVEdNQUMxMDBfUlhERVMwX1JYUEtUX1JEWSk7CiB9CiAKLXN0YXRpYyB2b2lkIGZ0Z21hYzEwMF9yeGRlc19zZXRfZG1hX293bihzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKK3N0YXRpYyB2b2lkIGZ0Z21hYzEwMF9yeGRlc19zZXRfZG1hX293bihjb25zdCBzdHJ1Y3QgZnRnbWFjMTAwICpwcml2LAorCQkJCQlzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKIHsKIAkvKiBjbGVhciBzdGF0dXMgYml0cyAqLwotCXJ4ZGVzLT5yeGRlczAgJj0gY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1JYREVTMF9FRE9SUik7CisJcnhkZXMtPnJ4ZGVzMCAmPSBjcHVfdG9fbGUzMihwcml2LT5yeGRlczBfZWRvcnJfbWFzayk7CiB9CiAKIHN0YXRpYyBib29sIGZ0Z21hYzEwMF9yeGRlc19yeF9lcnJvcihzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKQEAgLTI5OCw5ICszMDQsMTAgQEAKIAlyZXR1cm4gcnhkZXMtPnJ4ZGVzMCAmIGNwdV90b19sZTMyKEZUR01BQzEwMF9SWERFUzBfTVVMVElDQVNUKTsKIH0KIAotc3RhdGljIHZvaWQgZnRnbWFjMTAwX3J4ZGVzX3NldF9lbmRfb2ZfcmluZyhzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKK3N0YXRpYyB2b2lkIGZ0Z21hYzEwMF9yeGRlc19zZXRfZW5kX29mX3JpbmcoY29uc3Qgc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiwKKwkJCQkJICAgIHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzKQogewotCXJ4ZGVzLT5yeGRlczAgfD0gY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1JYREVTMF9FRE9SUik7CisJcnhkZXMtPnJ4ZGVzMCB8PSBjcHVfdG9fbGUzMihwcml2LT5yeGRlczBfZWRvcnJfbWFzayk7CiB9CiAKIHN0YXRpYyB2b2lkIGZ0Z21hYzEwMF9yeGRlc19zZXRfZG1hX2FkZHIoc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMsCkBAIC0zNDEsMTggKzM0OCwyNyBAQAogCXJldHVybiByeGRlcy0+cnhkZXMxICYgY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1JYREVTMV9JUF9DSEtTVU1fRVJSKTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqKmZ0Z21hYzEwMF9yeGRlc19wYWdlX3Nsb3Qoc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiwKKwkJCQkJCSAgICAgIHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzKQoreworCXJldHVybiAmcHJpdi0+cnhfcGFnZXNbcnhkZXMgLSBwcml2LT5kZXNjcy0+cnhkZXNdOworfQorCiAvKgogICogcnhkZXMyIGlzIG5vdCB1c2VkIGJ5IGhhcmR3YXJlLiBXZSB1c2UgaXQgdG8ga2VlcCB0cmFjayBvZiBwYWdlLgogICogU2luY2UgaGFyZHdhcmUgZG9lcyBub3QgdG91Y2ggaXQsIHdlIGNhbiBza2lwIGNwdV90b19sZTMyKCkvbGUzMl90b19jcHUoKS4KICAqLwotc3RhdGljIHZvaWQgZnRnbWFjMTAwX3J4ZGVzX3NldF9wYWdlKHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyB2b2lkIGZ0Z21hYzEwMF9yeGRlc19zZXRfcGFnZShzdHJ1Y3QgZnRnbWFjMTAwICpwcml2LAorCQkJCSAgICAgc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMsCisJCQkJICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlyeGRlcy0+cnhkZXMyID0gKHVuc2lnbmVkIGludClwYWdlOworCSpmdGdtYWMxMDBfcnhkZXNfcGFnZV9zbG90KHByaXYsIHJ4ZGVzKSA9IHBhZ2U7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZnRnbWFjMTAwX3J4ZGVzX2dldF9wYWdlKHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzKQorc3RhdGljIHN0cnVjdCBwYWdlICpmdGdtYWMxMDBfcnhkZXNfZ2V0X3BhZ2Uoc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiwKKwkJCQkJICAgICBzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKIHsKLQlyZXR1cm4gKHN0cnVjdCBwYWdlICopcnhkZXMtPnJ4ZGVzMjsKKwlyZXR1cm4gKmZ0Z21hYzEwMF9yeGRlc19wYWdlX3Nsb3QocHJpdiwgcnhkZXMpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zODIsNyArMzk4LDcgQEAKIAkJaWYgKGZ0Z21hYzEwMF9yeGRlc19maXJzdF9zZWdtZW50KHJ4ZGVzKSkKIAkJCXJldHVybiByeGRlczsKIAotCQlmdGdtYWMxMDBfcnhkZXNfc2V0X2RtYV9vd24ocnhkZXMpOworCQlmdGdtYWMxMDBfcnhkZXNfc2V0X2RtYV9vd24ocHJpdiwgcnhkZXMpOwogCQlmdGdtYWMxMDBfcnhfcG9pbnRlcl9hZHZhbmNlKHByaXYpOwogCQlyeGRlcyA9IGZ0Z21hYzEwMF9jdXJyZW50X3J4ZGVzKHByaXYpOwogCX0KQEAgLTQ1Myw3ICs0NjksNyBAQAogCQlpZiAoZnRnbWFjMTAwX3J4ZGVzX2xhc3Rfc2VnbWVudChyeGRlcykpCiAJCQlkb25lID0gdHJ1ZTsKIAotCQlmdGdtYWMxMDBfcnhkZXNfc2V0X2RtYV9vd24ocnhkZXMpOworCQlmdGdtYWMxMDBfcnhkZXNfc2V0X2RtYV9vd24ocHJpdiwgcnhkZXMpOwogCQlmdGdtYWMxMDBfcnhfcG9pbnRlcl9hZHZhbmNlKHByaXYpOwogCQlyeGRlcyA9IGZ0Z21hYzEwMF9jdXJyZW50X3J4ZGVzKHByaXYpOwogCX0gd2hpbGUgKCFkb25lICYmIGZ0Z21hYzEwMF9yeGRlc19wYWNrZXRfcmVhZHkocnhkZXMpKTsKQEAgLTUwMSw3ICs1MTcsNyBAQAogCiAJZG8gewogCQlkbWFfYWRkcl90IG1hcCA9IGZ0Z21hYzEwMF9yeGRlc19nZXRfZG1hX2FkZHIocnhkZXMpOwotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGZ0Z21hYzEwMF9yeGRlc19nZXRfcGFnZShyeGRlcyk7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gZnRnbWFjMTAwX3J4ZGVzX2dldF9wYWdlKHByaXYsIHJ4ZGVzKTsKIAkJdW5zaWduZWQgaW50IHNpemU7CiAKIAkJZG1hX3VubWFwX3BhZ2UocHJpdi0+ZGV2LCBtYXAsIFJYX0JVRl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwpAQCAtNTQ1LDEwICs1NjEsMTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIGludGVybmFsIGZ1bmN0aW9ucyAodHJhbnNtaXQgZGVzY3JpcHRvcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGZ0Z21hYzEwMF90eGRlc19yZXNldChzdHJ1Y3QgZnRnbWFjMTAwX3R4ZGVzICp0eGRlcykKK3N0YXRpYyB2b2lkIGZ0Z21hYzEwMF90eGRlc19yZXNldChjb25zdCBzdHJ1Y3QgZnRnbWFjMTAwICpwcml2LAorCQkJCSAgc3RydWN0IGZ0Z21hYzEwMF90eGRlcyAqdHhkZXMpCiB7CiAJLyogY2xlYXIgYWxsIGV4Y2VwdCBlbmQgb2YgcmluZyBiaXQgKi8KLQl0eGRlcy0+dHhkZXMwICY9IGNwdV90b19sZTMyKEZUR01BQzEwMF9UWERFUzBfRURPVFIpOworCXR4ZGVzLT50eGRlczAgJj0gY3B1X3RvX2xlMzIocHJpdi0+dHhkZXMwX2Vkb3RyX21hc2spOwogCXR4ZGVzLT50eGRlczEgPSAwOwogCXR4ZGVzLT50eGRlczIgPSAwOwogCXR4ZGVzLT50eGRlczMgPSAwOwpAQCAtNTY5LDkgKzU4NiwxMCBAQAogCXR4ZGVzLT50eGRlczAgfD0gY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1RYREVTMF9UWERNQV9PV04pOwogfQogCi1zdGF0aWMgdm9pZCBmdGdtYWMxMDBfdHhkZXNfc2V0X2VuZF9vZl9yaW5nKHN0cnVjdCBmdGdtYWMxMDBfdHhkZXMgKnR4ZGVzKQorc3RhdGljIHZvaWQgZnRnbWFjMTAwX3R4ZGVzX3NldF9lbmRfb2ZfcmluZyhjb25zdCBzdHJ1Y3QgZnRnbWFjMTAwICpwcml2LAorCQkJCQkgICAgc3RydWN0IGZ0Z21hYzEwMF90eGRlcyAqdHhkZXMpCiB7Ci0JdHhkZXMtPnR4ZGVzMCB8PSBjcHVfdG9fbGUzMihGVEdNQUMxMDBfVFhERVMwX0VET1RSKTsKKwl0eGRlcy0+dHhkZXMwIHw9IGNwdV90b19sZTMyKHByaXYtPnR4ZGVzMF9lZG90cl9tYXNrKTsKIH0KIAogc3RhdGljIHZvaWQgZnRnbWFjMTAwX3R4ZGVzX3NldF9maXJzdF9zZWdtZW50KHN0cnVjdCBmdGdtYWMxMDBfdHhkZXMgKnR4ZGVzKQpAQCAtNjkwLDcgKzcwOCw3IEBACiAKIAlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKLQlmdGdtYWMxMDBfdHhkZXNfcmVzZXQodHhkZXMpOworCWZ0Z21hYzEwMF90eGRlc19yZXNldChwcml2LCB0eGRlcyk7CiAKIAlmdGdtYWMxMDBfdHhfY2xlYW5fcG9pbnRlcl9hZHZhbmNlKHByaXYpOwogCkBAIC03NzksOSArNzk3LDkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZnRnbWFjMTAwX3J4ZGVzX3NldF9wYWdlKHJ4ZGVzLCBwYWdlKTsKKwlmdGdtYWMxMDBfcnhkZXNfc2V0X3BhZ2UocHJpdiwgcnhkZXMsIHBhZ2UpOwogCWZ0Z21hYzEwMF9yeGRlc19zZXRfZG1hX2FkZHIocnhkZXMsIG1hcCk7Ci0JZnRnbWFjMTAwX3J4ZGVzX3NldF9kbWFfb3duKHJ4ZGVzKTsKKwlmdGdtYWMxMDBfcnhkZXNfc2V0X2RtYV9vd24ocHJpdiwgcnhkZXMpOwogCXJldHVybiAwOwogfQogCkBAIC03OTEsNyArODA5LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9FTlRSSUVTOyBpKyspIHsKIAkJc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMgPSAmcHJpdi0+ZGVzY3MtPnJ4ZGVzW2ldOwotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGZ0Z21hYzEwMF9yeGRlc19nZXRfcGFnZShyeGRlcyk7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gZnRnbWFjMTAwX3J4ZGVzX2dldF9wYWdlKHByaXYsIHJ4ZGVzKTsKIAkJZG1hX2FkZHJfdCBtYXAgPSBmdGdtYWMxMDBfcnhkZXNfZ2V0X2RtYV9hZGRyKHJ4ZGVzKTsKIAogCQlpZiAoIXBhZ2UpCkBAIC04MjgsNyArODQ2LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBpbml0aWFsaXplIFJYIHJpbmcgKi8KLQlmdGdtYWMxMDBfcnhkZXNfc2V0X2VuZF9vZl9yaW5nKCZwcml2LT5kZXNjcy0+cnhkZXNbUlhfUVVFVUVfRU5UUklFUyAtIDFdKTsKKwlmdGdtYWMxMDBfcnhkZXNfc2V0X2VuZF9vZl9yaW5nKHByaXYsCisJCQkJCSZwcml2LT5kZXNjcy0+cnhkZXNbUlhfUVVFVUVfRU5UUklFUyAtIDFdKTsKIAogCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9FTlRSSUVTOyBpKyspIHsKIAkJc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMgPSAmcHJpdi0+ZGVzY3MtPnJ4ZGVzW2ldOwpAQCAtODM4LDcgKzg1Nyw4IEBACiAJfQogCiAJLyogaW5pdGlhbGl6ZSBUWCByaW5nICovCi0JZnRnbWFjMTAwX3R4ZGVzX3NldF9lbmRfb2ZfcmluZygmcHJpdi0+ZGVzY3MtPnR4ZGVzW1RYX1FVRVVFX0VOVFJJRVMgLSAxXSk7CisJZnRnbWFjMTAwX3R4ZGVzX3NldF9lbmRfb2ZfcmluZyhwcml2LAorCQkJCQkmcHJpdi0+ZGVzY3MtPnR4ZGVzW1RYX1FVRVVFX0VOVFJJRVMgLSAxXSk7CiAJcmV0dXJuIDA7CiAKIGVycjoKQEAgLTEwNTUsMTQgKzEwNzUsMTIgQEAKIAl9CiAKIAlpZiAoc3RhdHVzICYgcHJpdi0+aW50X21hc2tfYWxsICYgKEZUR01BQzEwMF9JTlRfTk9fUlhCVUYgfAotCQkJRlRHTUFDMTAwX0lOVF9SUEtUX0xPU1QgfCBGVEdNQUMxMDBfSU5UX0FIQl9FUlIgfAotCQkJRlRHTUFDMTAwX0lOVF9QSFlTVFNfQ0hHKSkgeworCQkJRlRHTUFDMTAwX0lOVF9SUEtUX0xPU1QgfCBGVEdNQUMxMDBfSU5UX0FIQl9FUlIpKSB7CiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQluZXRkZXZfaW5mbyhuZXRkZXYsICJbSVNSXSA9IDB4JXg6ICVzJXMlcyVzXG4iLCBzdGF0dXMsCisJCQluZXRkZXZfaW5mbyhuZXRkZXYsICJbSVNSXSA9IDB4JXg6ICVzJXMlc1xuIiwgc3RhdHVzLAogCQkJCSAgICBzdGF0dXMgJiBGVEdNQUMxMDBfSU5UX05PX1JYQlVGID8gIk5PX1JYQlVGICIgOiAiIiwKIAkJCQkgICAgc3RhdHVzICYgRlRHTUFDMTAwX0lOVF9SUEtUX0xPU1QgPyAiUlBLVF9MT1NUICIgOiAiIiwKLQkJCQkgICAgc3RhdHVzICYgRlRHTUFDMTAwX0lOVF9BSEJfRVJSID8gIkFIQl9FUlIgIiA6ICIiLAotCQkJCSAgICBzdGF0dXMgJiBGVEdNQUMxMDBfSU5UX1BIWVNUU19DSEcgPyAiUEhZU1RTX0NIRyIgOiAiIik7CisJCQkJICAgIHN0YXR1cyAmIEZUR01BQzEwMF9JTlRfQUhCX0VSUiA/ICJBSEJfRVJSICIgOiAiIik7CiAKIAkJaWYgKHN0YXR1cyAmIEZUR01BQzEwMF9JTlRfTk9fUlhCVUYpIHsKIAkJCS8qIFJYIGJ1ZmZlciB1bmF2YWlsYWJsZSAqLwpAQCAtMTA5Miw2ICsxMTEwLDcgQEAKIHN0YXRpYyBpbnQgZnRnbWFjMTAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgZnRnbWFjMTAwICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCWludCBlcnI7CiAKIAllcnIgPSBmdGdtYWMxMDBfYWxsb2NfYnVmZmVycyhwcml2KTsKQEAgLTExMTcsNiArMTEzNiwxMSBAQAogCiAJZnRnbWFjMTAwX2luaXRfaHcocHJpdik7CiAJZnRnbWFjMTAwX3N0YXJ0X2h3KHByaXYsIHByaXYtPnVzZV9uY3NpID8gMTAwIDogMTApOworCisJLyogQ2xlYXIgc3RhbGUgaW50ZXJydXB0cyAqLworCXN0YXR1cyA9IGlvcmVhZDMyKHByaXYtPmJhc2UgKyBGVEdNQUMxMDBfT0ZGU0VUX0lTUik7CisJaW93cml0ZTMyKHN0YXR1cywgcHJpdi0+YmFzZSArIEZUR01BQzEwMF9PRkZTRVRfSVNSKTsKKwogCWlmIChuZXRkZXYtPnBoeWRldikKIAkJcGh5X3N0YXJ0KG5ldGRldi0+cGh5ZGV2KTsKIAllbHNlIGlmIChwcml2LT51c2VfbmNzaSkKQEAgLTExNjYsNiArMTE5MCw4IEBACiAJbmFwaV9kaXNhYmxlKCZwcml2LT5uYXBpKTsKIAlpZiAobmV0ZGV2LT5waHlkZXYpCiAJCXBoeV9zdG9wKG5ldGRldi0+cGh5ZGV2KTsKKwllbHNlIGlmIChwcml2LT51c2VfbmNzaSkKKwkJbmNzaV9zdG9wX2Rldihwcml2LT5uZGV2KTsKIAogCWZ0Z21hYzEwMF9zdG9wX2h3KHByaXYpOwogCWZyZWVfaXJxKHByaXYtPmlycSwgbmV0ZGV2KTsKQEAgLTEyMjYsMTIgKzEyNTIsMjEgQEAKIAlzdHJ1Y3QgZnRnbWFjMTAwICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKHByaXYtPmRldik7CiAJaW50IGksIGVyciA9IDA7CisJdTMyIHJlZzsKIAogCS8qIGluaXRpYWxpemUgbWRpbyBidXMgKi8KIAlwcml2LT5taWlfYnVzID0gbWRpb2J1c19hbGxvYygpOwogCWlmICghcHJpdi0+bWlpX2J1cykKIAkJcmV0dXJuIC1FSU87CiAKKwlpZiAob2ZfbWFjaGluZV9pc19jb21wYXRpYmxlKCJhc3BlZWQsYXN0MjQwMCIpIHx8CisJICAgIG9mX21hY2hpbmVfaXNfY29tcGF0aWJsZSgiYXNwZWVkLGFzdDI1MDAiKSkgeworCQkvKiBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgb2xkIE1ESU8gaW50ZXJmYWNlICovCisJCXJlZyA9IGlvcmVhZDMyKHByaXYtPmJhc2UgKyBGVEdNQUMxMDBfT0ZGU0VUX1JFVlIpOworCQlyZWcgJj0gfkZUR01BQzEwMF9SRVZSX05FV19NRElPX0lOVEVSRkFDRTsKKwkJaW93cml0ZTMyKHJlZywgcHJpdi0+YmFzZSArIEZUR01BQzEwMF9PRkZTRVRfUkVWUik7CisJfTsKKwogCXByaXYtPm1paV9idXMtPm5hbWUgPSAiZnRnbWFjMTAwX21kaW8iOwogCXNucHJpbnRmKHByaXYtPm1paV9idXMtPmlkLCBNSUlfQlVTX0lEX1NJWkUsICIlcy0lZCIsCiAJCSBwZGV2LT5uYW1lLCBwZGV2LT5pZCk7CkBAIC0xMzU1LDkgKzEzOTAsMTggQEAKIAkJCSAgICAgIEZUR01BQzEwMF9JTlRfWFBLVF9FVEggfAogCQkJICAgICAgRlRHTUFDMTAwX0lOVF9YUEtUX0xPU1QgfAogCQkJICAgICAgRlRHTUFDMTAwX0lOVF9BSEJfRVJSIHwKLQkJCSAgICAgIEZUR01BQzEwMF9JTlRfUEhZU1RTX0NIRyB8CiAJCQkgICAgICBGVEdNQUMxMDBfSU5UX1JQS1RfQlVGIHwKIAkJCSAgICAgIEZUR01BQzEwMF9JTlRfTk9fUlhCVUYpOworCisJaWYgKG9mX21hY2hpbmVfaXNfY29tcGF0aWJsZSgiYXNwZWVkLGFzdDI0MDAiKSB8fAorCSAgICBvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoImFzcGVlZCxhc3QyNTAwIikpIHsKKwkJcHJpdi0+cnhkZXMwX2Vkb3JyX21hc2sgPSBCSVQoMzApOworCQlwcml2LT50eGRlczBfZWRvdHJfbWFzayA9IEJJVCgzMCk7CisJfSBlbHNlIHsKKwkJcHJpdi0+cnhkZXMwX2Vkb3JyX21hc2sgPSBCSVQoMTUpOworCQlwcml2LT50eGRlczBfZWRvdHJfbWFzayA9IEJJVCgxNSk7CisJfQorCiAJaWYgKHBkZXYtPmRldi5vZl9ub2RlICYmCiAJICAgIG9mX2dldF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwgInVzZS1uY3NpIiwgTlVMTCkpIHsKIAkJaWYgKCFJU19FTkFCTEVEKENPTkZJR19ORVRfTkNTSSkpIHsKQEAgLTEzNjcsNyArMTQxMSw2IEBACiAKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwgIlVzaW5nIE5DU0kgaW50ZXJmYWNlXG4iKTsKIAkJcHJpdi0+dXNlX25jc2kgPSB0cnVlOwotCQlwcml2LT5pbnRfbWFza19hbGwgJj0gfkZUR01BQzEwMF9JTlRfUEhZU1RTX0NIRzsKIAkJcHJpdi0+bmRldiA9IG5jc2lfcmVnaXN0ZXJfZGV2KG5ldGRldiwgZnRnbWFjMTAwX25jc2lfaGFuZGxlcik7CiAJCWlmICghcHJpdi0+bmRldikKIAkJCWdvdG8gZXJyX25jc2lfZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZmFyYWRheS9mdGdtYWMxMDAuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZhcmFkYXkvZnRnbWFjMTAwLmgKaW5kZXggMTM0MDhkNC4uYTdjZTBhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZmFyYWRheS9mdGdtYWMxMDAuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mYXJhZGF5L2Z0Z21hYzEwMC5oCkBAIC0xMzQsNiArMTM0LDExIEBACiAjZGVmaW5lIEZUR01BQzEwMF9ETUFGSUZPU19UWERNQV9SRVEJCSgxIDw8IDMxKQogCiAvKgorICogRmVhdHVyZSBSZWdpc3RlcgorICovCisjZGVmaW5lIEZUR01BQzEwMF9SRVZSX05FV19NRElPX0lOVEVSRkFDRQlCSVQoMzEpCisKKy8qCiAgKiBSZWNlaXZlIGJ1ZmZlciBzaXplIHJlZ2lzdGVyCiAgKi8KICNkZWZpbmUgRlRHTUFDMTAwX1JCU1JfU0laRSh4KQkJKCh4KSAmIDB4M2ZmZikKQEAgLTE1Miw2ICsxNTcsNyBAQAogI2RlZmluZSBGVEdNQUMxMDBfTUFDQ1JfRlVMTERVUAkJKDEgPDwgOCkKICNkZWZpbmUgRlRHTUFDMTAwX01BQ0NSX0dJR0FfTU9ERQkoMSA8PCA5KQogI2RlZmluZSBGVEdNQUMxMDBfTUFDQ1JfQ1JDX0FQRAkJKDEgPDwgMTApCisjZGVmaW5lIEZUR01BQzEwMF9NQUNDUl9QSFlfTElOS19MRVZFTAkoMSA8PCAxMSkKICNkZWZpbmUgRlRHTUFDMTAwX01BQ0NSX1JYX1JVTlQJCSgxIDw8IDEyKQogI2RlZmluZSBGVEdNQUMxMDBfTUFDQ1JfSlVNQk9fTEYJKDEgPDwgMTMpCiAjZGVmaW5lIEZUR01BQzEwMF9NQUNDUl9SWF9BTEwJCSgxIDw8IDE0KQpAQCAtMTg5LDcgKzE5NSw2IEBACiB9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpOwogCiAjZGVmaW5lIEZUR01BQzEwMF9UWERFUzBfVFhCVUZfU0laRSh4KQkoKHgpICYgMHgzZmZmKQotI2RlZmluZSBGVEdNQUMxMDBfVFhERVMwX0VET1RSCQkoMSA8PCAxNSkKICNkZWZpbmUgRlRHTUFDMTAwX1RYREVTMF9DUkNfRVJSCSgxIDw8IDE5KQogI2RlZmluZSBGVEdNQUMxMDBfVFhERVMwX0xUUwkJKDEgPDwgMjgpCiAjZGVmaW5lIEZUR01BQzEwMF9UWERFUzBfRlRTCQkoMSA8PCAyOSkKQEAgLTIxNSw3ICsyMjAsNiBAQAogfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKIAogI2RlZmluZSBGVEdNQUMxMDBfUlhERVMwX1ZEQkMJCTB4M2ZmZgotI2RlZmluZSBGVEdNQUMxMDBfUlhERVMwX0VET1JSCQkoMSA8PCAxNSkKICNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMF9NVUxUSUNBU1QJKDEgPDwgMTYpCiAjZGVmaW5lIEZUR01BQzEwMF9SWERFUzBfQlJPQURDQVNUCSgxIDw8IDE3KQogI2RlZmluZSBGVEdNQUMxMDBfUlhERVMwX1JYX0VSUgkJKDEgPDwgMTgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZmVjX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mZWNfbWFpbi5jCmluZGV4IDAxZjdlODEuLjQ4YTAzM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mZWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mZWNfbWFpbi5jCkBAIC04OSwxMCArODksMTAgQEAKIAkJLmRyaXZlcl9kYXRhID0gMCwKIAl9LCB7CiAJCS5uYW1lID0gImlteDI1LWZlYyIsCi0JCS5kcml2ZXJfZGF0YSA9IEZFQ19RVUlSS19VU0VfR0FTS0VUIHwgRkVDX1FVSVJLX0hBU19SQUNDLAorCQkuZHJpdmVyX2RhdGEgPSBGRUNfUVVJUktfVVNFX0dBU0tFVCwKIAl9LCB7CiAJCS5uYW1lID0gImlteDI3LWZlYyIsCi0JCS5kcml2ZXJfZGF0YSA9IEZFQ19RVUlSS19IQVNfUkFDQywKKwkJLmRyaXZlcl9kYXRhID0gMCwKIAl9LCB7CiAJCS5uYW1lID0gImlteDI4LWZlYyIsCiAJCS5kcml2ZXJfZGF0YSA9IEZFQ19RVUlSS19FTkVUX01BQyB8IEZFQ19RVUlSS19TV0FQX0ZSQU1FIHwKQEAgLTE4MCw2ICsxODAsNyBAQAogLyogRkVDIHJlY2VpdmUgYWNjZWxlcmF0aW9uICovCiAjZGVmaW5lIEZFQ19SQUNDX0lQRElTCQkoMSA8PCAxKQogI2RlZmluZSBGRUNfUkFDQ19QUk9ESVMJCSgxIDw8IDIpCisjZGVmaW5lIEZFQ19SQUNDX1NISUZUMTYJQklUKDcpCiAjZGVmaW5lIEZFQ19SQUNDX09QVElPTlMJKEZFQ19SQUNDX0lQRElTIHwgRkVDX1JBQ0NfUFJPRElTKQogCiAvKgpAQCAtOTEyLDEzICs5MTMsMTEgQEAKIAkgKiBlbmV0LW1hYyByZXNldCB3aWxsIHJlc2V0IG1hYyBhZGRyZXNzIHJlZ2lzdGVycyB0b28sCiAJICogc28gbmVlZCB0byByZWNvbmZpZ3VyZSBpdC4KIAkgKi8KLQlpZiAoZmVwLT5xdWlya3MgJiBGRUNfUVVJUktfRU5FVF9NQUMpIHsKLQkJbWVtY3B5KCZ0ZW1wX21hYywgbmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQkJd3JpdGVsKChfX2ZvcmNlIHUzMiljcHVfdG9fYmUzMih0ZW1wX21hY1swXSksCi0JCSAgICAgICBmZXAtPmh3cCArIEZFQ19BRERSX0xPVyk7Ci0JCXdyaXRlbCgoX19mb3JjZSB1MzIpY3B1X3RvX2JlMzIodGVtcF9tYWNbMV0pLAotCQkgICAgICAgZmVwLT5od3AgKyBGRUNfQUREUl9ISUdIKTsKLQl9CisJbWVtY3B5KCZ0ZW1wX21hYywgbmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwl3cml0ZWwoKF9fZm9yY2UgdTMyKWNwdV90b19iZTMyKHRlbXBfbWFjWzBdKSwKKwkgICAgICAgZmVwLT5od3AgKyBGRUNfQUREUl9MT1cpOworCXdyaXRlbCgoX19mb3JjZSB1MzIpY3B1X3RvX2JlMzIodGVtcF9tYWNbMV0pLAorCSAgICAgICBmZXAtPmh3cCArIEZFQ19BRERSX0hJR0gpOwogCiAJLyogQ2xlYXIgYW55IG91dHN0YW5kaW5nIGludGVycnVwdC4gKi8KIAl3cml0ZWwoMHhmZmZmZmZmZiwgZmVwLT5od3AgKyBGRUNfSUVWRU5UKTsKQEAgLTk0NSw5ICs5NDQsMTEgQEAKIAogI2lmICFkZWZpbmVkKENPTkZJR19NNTI3MikKIAlpZiAoZmVwLT5xdWlya3MgJiBGRUNfUVVJUktfSEFTX1JBQ0MpIHsKLQkJLyogc2V0IFJYIGNoZWNrc3VtICovCiAJCXZhbCA9IHJlYWRsKGZlcC0+aHdwICsgRkVDX1JBQ0MpOworCQkvKiBhbGlnbiBJUCBoZWFkZXIgKi8KKwkJdmFsIHw9IEZFQ19SQUNDX1NISUZUMTY7CiAJCWlmIChmZXAtPmNzdW1fZmxhZ3MgJiBGTEFHX1JYX0NTVU1fRU5BQkxFRCkKKwkJCS8qIHNldCBSWCBjaGVja3N1bSAqLwogCQkJdmFsIHw9IEZFQ19SQUNDX09QVElPTlM7CiAJCWVsc2UKIAkJCXZhbCAmPSB+RkVDX1JBQ0NfT1BUSU9OUzsKQEAgLTE0MjgsNiArMTQyOSwxMiBAQAogCQlwcmVmZXRjaChza2ItPmRhdGEgLSBORVRfSVBfQUxJR04pOwogCQlza2JfcHV0KHNrYiwgcGt0X2xlbiAtIDQpOwogCQlkYXRhID0gc2tiLT5kYXRhOworCisjaWYgIWRlZmluZWQoQ09ORklHX001MjcyKQorCQlpZiAoZmVwLT5xdWlya3MgJiBGRUNfUVVJUktfSEFTX1JBQ0MpCisJCQlkYXRhID0gc2tiX3B1bGxfaW5saW5lKHNrYiwgMik7CisjZW5kaWYKKwogCQlpZiAoIWlzX2NvcHlicmVhayAmJiBuZWVkX3N3YXApCiAJCQlzd2FwX2J1ZmZlcihkYXRhLCBwa3RfbGVuKTsKIApAQCAtMjg4Nyw3ICsyODk0LDcgQEAKICAqIHRoaXMga2luZCBvZiBmZWF0dXJlPykuCiAgKi8KIAotI2RlZmluZSBIQVNIX0JJVFMJNgkJLyogI2JpdHMgaW4gaGFzaCAqLworI2RlZmluZSBGRUNfSEFTSF9CSVRTCTYJCS8qICNiaXRzIGluIGhhc2ggKi8KICNkZWZpbmUgQ1JDMzJfUE9MWQkweEVEQjg4MzIwCiAKIHN0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKQEAgLTI5MzUsMTAgKzI5NDIsMTAgQEAKIAkJCX0KIAkJfQogCi0JCS8qIG9ubHkgdXBwZXIgNiBiaXRzIChIQVNIX0JJVFMpIGFyZSB1c2VkCisJCS8qIG9ubHkgdXBwZXIgNiBiaXRzIChGRUNfSEFTSF9CSVRTKSBhcmUgdXNlZAogCQkgKiB3aGljaCBwb2ludCB0byBzcGVjaWZpYyBiaXQgaW4gaGUgaGFzaCByZWdpc3RlcnMKIAkJICovCi0JCWhhc2ggPSAoY3JjID4+ICgzMiAtIEhBU0hfQklUUykpICYgMHgzZjsKKwkJaGFzaCA9IChjcmMgPj4gKDMyIC0gRkVDX0hBU0hfQklUUykpICYgMHgzZjsKIAogCQlpZiAoaGFzaCA+IDMxKSB7CiAJCQl0bXAgPSByZWFkbChmZXAtPmh3cCArIEZFQ19HUlBfSEFTSF9UQUJMRV9ISUdIKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mbWFuL2ZtYW5fbWFjLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZm1hbi9mbWFuX21hYy5oCmluZGV4IDhkZGVlZGIuLmRkZjAyNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mbWFuL2ZtYW5fbWFjLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZtYW4vZm1hbl9tYWMuaApAQCAtMTkyLDcgKzE5Miw3IEBACiAJLyogQSBoYW5kbGUgdG8gdGhlIEZNIG9iamVjdCB0aGlzIHBvcnQgcmVsYXRlZCB0byAqLwogCXZvaWQgKmZtOwogCS8qIE1ESU8gZXhjZXB0aW9ucyBpbnRlcnJ1cHQgc291cmNlIC0gbm90IHZhbGlkIGZvciBhbGwKLQkgKiBNQUNzOyBNVVNUIGJlIHNldCB0byAnTk9fSVJRJyBmb3IgTUFDcyB0aGF0IGRvbid0IGhhdmUKKwkgKiBNQUNzOyBNVVNUIGJlIHNldCB0byAwIGZvciBNQUNzIHRoYXQgZG9uJ3QgaGF2ZQogCSAqIG1kaW8taXJxLCBvciBmb3IgcG9sbGluZwogCSAqLwogCXZvaWQgKmRldl9pZDsgLyogZGV2aWNlIGNvb2tpZSB1c2VkIGJ5IHRoZSBleGNlcHRpb24gY2JzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9mc19lbmV0LW1haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCmluZGV4IDYxZmQ0ODYuLmRjMTIwYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCkBAIC02MCw2ICs2MCw5IEBACiBNT0RVTEVfUEFSTV9ERVNDKGZzX2VuZXRfZGVidWcsCiAJCSAiRnJlZXNjYWxlIGJpdG1hcHBlZCBkZWJ1Z2dpbmcgbWVzc2FnZSBlbmFibGUgdmFsdWUiKTsKIAorI2RlZmluZSBSWF9SSU5HX1NJWkUJMzIKKyNkZWZpbmUgVFhfUklOR19TSVpFCTY0CisKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogc3RhdGljIHZvaWQgZnNfZW5ldF9uZXRwb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogI2VuZGlmCkBAIC03OSw4ICs4Miw4IEBACiAJCXNrYl9yZXNlcnZlKHNrYiwgYWxpZ24gLSBvZmYpOwogfQogCi0vKiBOQVBJIHJlY2VpdmUgZnVuY3Rpb24gKi8KLXN0YXRpYyBpbnQgZnNfZW5ldF9yeF9uYXBpKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKKy8qIE5BUEkgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgZnNfZW5ldF9uYXBpKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKIHsKIAlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSwgbmFwaSk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGZlcC0+bmRldjsKQEAgLTkwLDE0NyArOTMsMTcgQEAKIAlpbnQgcmVjZWl2ZWQgPSAwOwogCXUxNiBwa3RfbGVuLCBzYzsKIAlpbnQgY3VyaWR4OwotCi0JaWYgKGJ1ZGdldCA8PSAwKQotCQlyZXR1cm4gcmVjZWl2ZWQ7Ci0KLQkvKgotCSAqIEZpcnN0LCBncmFiIGFsbCBvZiB0aGUgc3RhdHMgZm9yIHRoZSBpbmNvbWluZyBwYWNrZXQuCi0JICogVGhlc2UgZ2V0IG1lc3NlZCB1cCBpZiB3ZSBnZXQgY2FsbGVkIGR1ZSB0byBhIGJ1c3kgY29uZGl0aW9uLgotCSAqLwotCWJkcCA9IGZlcC0+Y3VyX3J4OwotCi0JLyogY2xlYXIgUlggc3RhdHVzIGJpdHMgZm9yIG5hcGkqLwotCSgqZmVwLT5vcHMtPm5hcGlfY2xlYXJfcnhfZXZlbnQpKGRldik7Ci0KLQl3aGlsZSAoKChzYyA9IENCRFJfU0MoYmRwKSkgJiBCRF9FTkVUX1JYX0VNUFRZKSA9PSAwKSB7Ci0JCWN1cmlkeCA9IGJkcCAtIGZlcC0+cnhfYmRfYmFzZTsKLQotCQkvKgotCQkgKiBTaW5jZSB3ZSBoYXZlIGFsbG9jYXRlZCBzcGFjZSB0byBob2xkIGEgY29tcGxldGUgZnJhbWUsCi0JCSAqIHRoZSBsYXN0IGluZGljYXRvciBzaG91bGQgYmUgc2V0LgotCQkgKi8KLQkJaWYgKChzYyAmIEJEX0VORVRfUlhfTEFTVCkgPT0gMCkKLQkJCWRldl93YXJuKGZlcC0+ZGV2LCAicmN2IGlzIG5vdCArbGFzdFxuIik7Ci0KLQkJLyoKLQkJICogQ2hlY2sgZm9yIGVycm9ycy4KLQkJICovCi0JCWlmIChzYyAmIChCRF9FTkVUX1JYX0xHIHwgQkRfRU5FVF9SWF9TSCB8IEJEX0VORVRfUlhfQ0wgfAotCQkJICBCRF9FTkVUX1JYX05PIHwgQkRfRU5FVF9SWF9DUiB8IEJEX0VORVRfUlhfT1YpKSB7Ci0JCQlmZXAtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQkJLyogRnJhbWUgdG9vIGxvbmcgb3IgdG9vIHNob3J0LiAqLwotCQkJaWYgKHNjICYgKEJEX0VORVRfUlhfTEcgfCBCRF9FTkVUX1JYX1NIKSkKLQkJCQlmZXAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKLQkJCS8qIEZyYW1lIGFsaWdubWVudCAqLwotCQkJaWYgKHNjICYgKEJEX0VORVRfUlhfTk8gfCBCRF9FTkVUX1JYX0NMKSkKLQkJCQlmZXAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwotCQkJLyogQ1JDIEVycm9yICovCi0JCQlpZiAoc2MgJiBCRF9FTkVUX1JYX0NSKQotCQkJCWZlcC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwotCQkJLyogRklGTyBvdmVycnVuICovCi0JCQlpZiAoc2MgJiBCRF9FTkVUX1JYX09WKQotCQkJCWZlcC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwotCi0JCQlza2IgPSBmZXAtPnJ4X3NrYnVmZltjdXJpZHhdOwotCi0JCQlkbWFfdW5tYXBfc2luZ2xlKGZlcC0+ZGV2LCBDQkRSX0JVRkFERFIoYmRwKSwKLQkJCQlMMV9DQUNIRV9BTElHTihQS1RfTUFYQlVGX1NJWkUpLAotCQkJCURNQV9GUk9NX0RFVklDRSk7Ci0KLQkJCXNrYm4gPSBza2I7Ci0KLQkJfSBlbHNlIHsKLQkJCXNrYiA9IGZlcC0+cnhfc2tidWZmW2N1cmlkeF07Ci0KLQkJCWRtYV91bm1hcF9zaW5nbGUoZmVwLT5kZXYsIENCRFJfQlVGQUREUihiZHApLAotCQkJCUwxX0NBQ0hFX0FMSUdOKFBLVF9NQVhCVUZfU0laRSksCi0JCQkJRE1BX0ZST01fREVWSUNFKTsKLQotCQkJLyoKLQkJCSAqIFByb2Nlc3MgdGhlIGluY29taW5nIGZyYW1lLgotCQkJICovCi0JCQlmZXAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCXBrdF9sZW4gPSBDQkRSX0RBVExFTihiZHApIC0gNDsJLyogcmVtb3ZlIENSQyAqLwotCQkJZmVwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuICsgNDsKLQotCQkJaWYgKHBrdF9sZW4gPD0gZnBpLT5yeF9jb3B5YnJlYWspIHsKLQkJCQkvKiArMiB0byBtYWtlIElQIGhlYWRlciBMMSBjYWNoZSBhbGlnbmVkICovCi0JCQkJc2tibiA9IG5ldGRldl9hbGxvY19za2IoZGV2LCBwa3RfbGVuICsgMik7Ci0JCQkJaWYgKHNrYm4gIT0gTlVMTCkgewotCQkJCQlza2JfcmVzZXJ2ZShza2JuLCAyKTsJLyogYWxpZ24gSVAgaGVhZGVyICovCi0JCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLAotCQkJCQkJICAgICAgc2tibi0+ZGF0YSwgcGt0X2xlbik7Ci0JCQkJCXN3YXAoc2tiLCBza2JuKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXNrYm4gPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgRU5FVF9SWF9GUlNJWkUpOwotCi0JCQkJaWYgKHNrYm4pCi0JCQkJCXNrYl9hbGlnbihza2JuLCBFTkVUX1JYX0FMSUdOKTsKLQkJCX0KLQotCQkJaWYgKHNrYm4gIT0gTlVMTCkgewotCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsJLyogTWFrZSByb29tICovCi0JCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKLQkJCQlyZWNlaXZlZCsrOwotCQkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7Ci0JCQl9IGVsc2UgewotCQkJCWZlcC0+c3RhdHMucnhfZHJvcHBlZCsrOwotCQkJCXNrYm4gPSBza2I7Ci0JCQl9Ci0JCX0KLQotCQlmZXAtPnJ4X3NrYnVmZltjdXJpZHhdID0gc2tibjsKLQkJQ0JEV19CVUZBRERSKGJkcCwgZG1hX21hcF9zaW5nbGUoZmVwLT5kZXYsIHNrYm4tPmRhdGEsCi0JCQkgICAgIEwxX0NBQ0hFX0FMSUdOKFBLVF9NQVhCVUZfU0laRSksCi0JCQkgICAgIERNQV9GUk9NX0RFVklDRSkpOwotCQlDQkRXX0RBVExFTihiZHAsIDApOwotCQlDQkRXX1NDKGJkcCwgKHNjICYgfkJEX0VORVRfUlhfU1RBVFMpIHwgQkRfRU5FVF9SWF9FTVBUWSk7Ci0KLQkJLyoKLQkJICogVXBkYXRlIEJEIHBvaW50ZXIgdG8gbmV4dCBlbnRyeS4KLQkJICovCi0JCWlmICgoc2MgJiBCRF9FTkVUX1JYX1dSQVApID09IDApCi0JCQliZHArKzsKLQkJZWxzZQotCQkJYmRwID0gZmVwLT5yeF9iZF9iYXNlOwotCi0JCSgqZmVwLT5vcHMtPnJ4X2JkX2RvbmUpKGRldik7Ci0KLQkJaWYgKHJlY2VpdmVkID49IGJ1ZGdldCkKLQkJCWJyZWFrOwotCX0KLQotCWZlcC0+Y3VyX3J4ID0gYmRwOwotCi0JaWYgKHJlY2VpdmVkIDwgYnVkZ2V0KSB7Ci0JCS8qIGRvbmUgKi8KLQkJbmFwaV9jb21wbGV0ZShuYXBpKTsKLQkJKCpmZXAtPm9wcy0+bmFwaV9lbmFibGVfcngpKGRldik7Ci0JfQotCXJldHVybiByZWNlaXZlZDsKLX0KLQotc3RhdGljIGludCBmc19lbmV0X3R4X25hcGkoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQotewotCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlLAotCQkJCQkJICAgbmFwaV90eCk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGZlcC0+bmRldjsKLQljYmRfdCBfX2lvbWVtICpiZHA7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgZGlydHlpZHgsIGRvX3dha2UsIGRvX3Jlc3RhcnQ7Ci0JdTE2IHNjOwotCWludCBoYXNfdHhfd29yayA9IDA7CisJaW50IHR4X2xlZnQgPSBUWF9SSU5HX1NJWkU7CiAKIAlzcGluX2xvY2soJmZlcC0+dHhfbG9jayk7CiAJYmRwID0gZmVwLT5kaXJ0eV90eDsKIAotCS8qIGNsZWFyIFRYIHN0YXR1cyBiaXRzIGZvciBuYXBpKi8KLQkoKmZlcC0+b3BzLT5uYXBpX2NsZWFyX3R4X2V2ZW50KShkZXYpOworCS8qIGNsZWFyIHN0YXR1cyBiaXRzIGZvciBuYXBpKi8KKwkoKmZlcC0+b3BzLT5uYXBpX2NsZWFyX2V2ZW50KShkZXYpOwogCiAJZG9fd2FrZSA9IGRvX3Jlc3RhcnQgPSAwOwotCXdoaWxlICgoKHNjID0gQ0JEUl9TQyhiZHApKSAmIEJEX0VORVRfVFhfUkVBRFkpID09IDApIHsKKwl3aGlsZSAoKChzYyA9IENCRFJfU0MoYmRwKSkgJiBCRF9FTkVUX1RYX1JFQURZKSA9PSAwICYmIHR4X2xlZnQpIHsKIAkJZGlydHlpZHggPSBiZHAgLSBmZXAtPnR4X2JkX2Jhc2U7CiAKIAkJaWYgKGZlcC0+dHhfZnJlZSA9PSBmZXAtPnR4X3JpbmcpCkBAIC0zMDIsOSArMTc1LDkgQEAKIAkJICogU2luY2Ugd2UgaGF2ZSBmcmVlZCB1cCBhIGJ1ZmZlciwgdGhlIHJpbmcgaXMgbm8gbG9uZ2VyCiAJCSAqIGZ1bGwuCiAJCSAqLwotCQlpZiAoKytmZXAtPnR4X2ZyZWUgPj0gTUFYX1NLQl9GUkFHUykKKwkJaWYgKCsrZmVwLT50eF9mcmVlID09IE1BWF9TS0JfRlJBR1MpCiAJCQlkb193YWtlID0gMTsKLQkJaGFzX3R4X3dvcmsgPSAxOworCQl0eF9sZWZ0LS07CiAJfQogCiAJZmVwLT5kaXJ0eV90eCA9IGJkcDsKQEAgLTMxMiwxOSArMTg1LDEyOSBAQAogCWlmIChkb19yZXN0YXJ0KQogCQkoKmZlcC0+b3BzLT50eF9yZXN0YXJ0KShkZXYpOwogCi0JaWYgKCFoYXNfdHhfd29yaykgewotCQluYXBpX2NvbXBsZXRlKG5hcGkpOwotCQkoKmZlcC0+b3BzLT5uYXBpX2VuYWJsZV90eCkoZGV2KTsKLQl9Ci0KIAlzcGluX3VubG9jaygmZmVwLT50eF9sb2NrKTsKIAogCWlmIChkb193YWtlKQogCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CiAKLQlpZiAoaGFzX3R4X3dvcmspCi0JCXJldHVybiBidWRnZXQ7Ci0JcmV0dXJuIDA7CisJLyoKKwkgKiBGaXJzdCwgZ3JhYiBhbGwgb2YgdGhlIHN0YXRzIGZvciB0aGUgaW5jb21pbmcgcGFja2V0LgorCSAqIFRoZXNlIGdldCBtZXNzZWQgdXAgaWYgd2UgZ2V0IGNhbGxlZCBkdWUgdG8gYSBidXN5IGNvbmRpdGlvbi4KKwkgKi8KKwliZHAgPSBmZXAtPmN1cl9yeDsKKworCXdoaWxlICgoKHNjID0gQ0JEUl9TQyhiZHApKSAmIEJEX0VORVRfUlhfRU1QVFkpID09IDAgJiYKKwkgICAgICAgcmVjZWl2ZWQgPCBidWRnZXQpIHsKKwkJY3VyaWR4ID0gYmRwIC0gZmVwLT5yeF9iZF9iYXNlOworCisJCS8qCisJCSAqIFNpbmNlIHdlIGhhdmUgYWxsb2NhdGVkIHNwYWNlIHRvIGhvbGQgYSBjb21wbGV0ZSBmcmFtZSwKKwkJICogdGhlIGxhc3QgaW5kaWNhdG9yIHNob3VsZCBiZSBzZXQuCisJCSAqLworCQlpZiAoKHNjICYgQkRfRU5FVF9SWF9MQVNUKSA9PSAwKQorCQkJZGV2X3dhcm4oZmVwLT5kZXYsICJyY3YgaXMgbm90ICtsYXN0XG4iKTsKKworCQkvKgorCQkgKiBDaGVjayBmb3IgZXJyb3JzLgorCQkgKi8KKwkJaWYgKHNjICYgKEJEX0VORVRfUlhfTEcgfCBCRF9FTkVUX1JYX1NIIHwgQkRfRU5FVF9SWF9DTCB8CisJCQkgIEJEX0VORVRfUlhfTk8gfCBCRF9FTkVUX1JYX0NSIHwgQkRfRU5FVF9SWF9PVikpIHsKKwkJCWZlcC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkvKiBGcmFtZSB0b28gbG9uZyBvciB0b28gc2hvcnQuICovCisJCQlpZiAoc2MgJiAoQkRfRU5FVF9SWF9MRyB8IEJEX0VORVRfUlhfU0gpKQorCQkJCWZlcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJLyogRnJhbWUgYWxpZ25tZW50ICovCisJCQlpZiAoc2MgJiAoQkRfRU5FVF9SWF9OTyB8IEJEX0VORVRfUlhfQ0wpKQorCQkJCWZlcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkvKiBDUkMgRXJyb3IgKi8KKwkJCWlmIChzYyAmIEJEX0VORVRfUlhfQ1IpCisJCQkJZmVwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkvKiBGSUZPIG92ZXJydW4gKi8KKwkJCWlmIChzYyAmIEJEX0VORVRfUlhfT1YpCisJCQkJZmVwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisKKwkJCXNrYm4gPSBmZXAtPnJ4X3NrYnVmZltjdXJpZHhdOworCQl9IGVsc2UgeworCQkJc2tiID0gZmVwLT5yeF9za2J1ZmZbY3VyaWR4XTsKKworCQkJLyoKKwkJCSAqIFByb2Nlc3MgdGhlIGluY29taW5nIGZyYW1lLgorCQkJICovCisJCQlmZXAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCXBrdF9sZW4gPSBDQkRSX0RBVExFTihiZHApIC0gNDsJLyogcmVtb3ZlIENSQyAqLworCQkJZmVwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuICsgNDsKKworCQkJaWYgKHBrdF9sZW4gPD0gZnBpLT5yeF9jb3B5YnJlYWspIHsKKwkJCQkvKiArMiB0byBtYWtlIElQIGhlYWRlciBMMSBjYWNoZSBhbGlnbmVkICovCisJCQkJc2tibiA9IG5ldGRldl9hbGxvY19za2IoZGV2LCBwa3RfbGVuICsgMik7CisJCQkJaWYgKHNrYm4gIT0gTlVMTCkgeworCQkJCQlza2JfcmVzZXJ2ZShza2JuLCAyKTsJLyogYWxpZ24gSVAgaGVhZGVyICovCisJCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLAorCQkJCQkJICAgICAgc2tibi0+ZGF0YSwgcGt0X2xlbik7CisJCQkJCXN3YXAoc2tiLCBza2JuKTsKKwkJCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZmVwLT5kZXYsCisJCQkJCQlDQkRSX0JVRkFERFIoYmRwKSwKKwkJCQkJCUwxX0NBQ0hFX0FMSUdOKHBrdF9sZW4pLAorCQkJCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXNrYm4gPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgRU5FVF9SWF9GUlNJWkUpOworCisJCQkJaWYgKHNrYm4pIHsKKwkJCQkJZG1hX2FkZHJfdCBkbWE7CisKKwkJCQkJc2tiX2FsaWduKHNrYm4sIEVORVRfUlhfQUxJR04pOworCisJCQkJCWRtYV91bm1hcF9zaW5nbGUoZmVwLT5kZXYsCisJCQkJCQlDQkRSX0JVRkFERFIoYmRwKSwKKwkJCQkJCUwxX0NBQ0hFX0FMSUdOKFBLVF9NQVhCVUZfU0laRSksCisJCQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCisJCQkJCWRtYSA9IGRtYV9tYXBfc2luZ2xlKGZlcC0+ZGV2LAorCQkJCQkJc2tibi0+ZGF0YSwKKwkJCQkJCUwxX0NBQ0hFX0FMSUdOKFBLVF9NQVhCVUZfU0laRSksCisJCQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCQkJCQlDQkRXX0JVRkFERFIoYmRwLCBkbWEpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHNrYm4gIT0gTlVMTCkgeworCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsJLyogTWFrZSByb29tICovCisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCQlyZWNlaXZlZCsrOworCQkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJCQl9IGVsc2UgeworCQkJCWZlcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCXNrYm4gPSBza2I7CisJCQl9CisJCX0KKworCQlmZXAtPnJ4X3NrYnVmZltjdXJpZHhdID0gc2tibjsKKwkJQ0JEV19EQVRMRU4oYmRwLCAwKTsKKwkJQ0JEV19TQyhiZHAsIChzYyAmIH5CRF9FTkVUX1JYX1NUQVRTKSB8IEJEX0VORVRfUlhfRU1QVFkpOworCisJCS8qCisJCSAqIFVwZGF0ZSBCRCBwb2ludGVyIHRvIG5leHQgZW50cnkuCisJCSAqLworCQlpZiAoKHNjICYgQkRfRU5FVF9SWF9XUkFQKSA9PSAwKQorCQkJYmRwKys7CisJCWVsc2UKKwkJCWJkcCA9IGZlcC0+cnhfYmRfYmFzZTsKKworCQkoKmZlcC0+b3BzLT5yeF9iZF9kb25lKShkZXYpOworCX0KKworCWZlcC0+Y3VyX3J4ID0gYmRwOworCisJaWYgKHJlY2VpdmVkIDwgYnVkZ2V0ICYmIHR4X2xlZnQpIHsKKwkJLyogZG9uZSAqLworCQluYXBpX2NvbXBsZXRlKG5hcGkpOworCQkoKmZlcC0+b3BzLT5uYXBpX2VuYWJsZSkoZGV2KTsKKworCQlyZXR1cm4gcmVjZWl2ZWQ7CisJfQorCisJcmV0dXJuIGJ1ZGdldDsKIH0KIAogLyoKQEAgLTM1MCwxOCArMzMzLDE4IEBACiAJCW5yKys7CiAKIAkJaW50X2Nscl9ldmVudHMgPSBpbnRfZXZlbnRzOwotCQlpbnRfY2xyX2V2ZW50cyAmPSB+ZmVwLT5ldl9uYXBpX3J4OworCQlpbnRfY2xyX2V2ZW50cyAmPSB+ZmVwLT5ldl9uYXBpOwogCiAJCSgqZmVwLT5vcHMtPmNsZWFyX2ludF9ldmVudHMpKGRldiwgaW50X2Nscl9ldmVudHMpOwogCiAJCWlmIChpbnRfZXZlbnRzICYgZmVwLT5ldl9lcnIpCiAJCQkoKmZlcC0+b3BzLT5ldl9lcnJvcikoZGV2LCBpbnRfZXZlbnRzKTsKIAotCQlpZiAoaW50X2V2ZW50cyAmIGZlcC0+ZXZfcngpIHsKKwkJaWYgKGludF9ldmVudHMgJiBmZXAtPmV2KSB7CiAJCQluYXBpX29rID0gbmFwaV9zY2hlZHVsZV9wcmVwKCZmZXAtPm5hcGkpOwogCi0JCQkoKmZlcC0+b3BzLT5uYXBpX2Rpc2FibGVfcngpKGRldik7Ci0JCQkoKmZlcC0+b3BzLT5jbGVhcl9pbnRfZXZlbnRzKShkZXYsIGZlcC0+ZXZfbmFwaV9yeCk7CisJCQkoKmZlcC0+b3BzLT5uYXBpX2Rpc2FibGUpKGRldik7CisJCQkoKmZlcC0+b3BzLT5jbGVhcl9pbnRfZXZlbnRzKShkZXYsIGZlcC0+ZXZfbmFwaSk7CiAKIAkJCS8qIE5PVEU6IGl0IGlzIHBvc3NpYmxlIGZvciBGQ0NzIGluIE5BUEkgbW9kZSAgICAqLwogCQkJLyogdG8gc3VibWl0IGEgc3B1cmlvdXMgaW50ZXJydXB0IHdoaWxlIGluIHBvbGwgICovCkBAIC0zNjksMTcgKzM1Miw2IEBACiAJCQkJX19uYXBpX3NjaGVkdWxlKCZmZXAtPm5hcGkpOwogCQl9CiAKLQkJaWYgKGludF9ldmVudHMgJiBmZXAtPmV2X3R4KSB7Ci0JCQluYXBpX29rID0gbmFwaV9zY2hlZHVsZV9wcmVwKCZmZXAtPm5hcGlfdHgpOwotCi0JCQkoKmZlcC0+b3BzLT5uYXBpX2Rpc2FibGVfdHgpKGRldik7Ci0JCQkoKmZlcC0+b3BzLT5jbGVhcl9pbnRfZXZlbnRzKShkZXYsIGZlcC0+ZXZfbmFwaV90eCk7Ci0KLQkJCS8qIE5PVEU6IGl0IGlzIHBvc3NpYmxlIGZvciBGQ0NzIGluIE5BUEkgbW9kZSAgICAqLwotCQkJLyogdG8gc3VibWl0IGEgc3B1cmlvdXMgaW50ZXJydXB0IHdoaWxlIGluIHBvbGwgICovCi0JCQlpZiAobmFwaV9vaykKLQkJCQlfX25hcGlfc2NoZWR1bGUoJmZlcC0+bmFwaV90eCk7Ci0JCX0KIAl9CiAKIAloYW5kbGVkID0gbnIgPiAwOwpAQCAtNjU5LDcgKzYzMSw4IEBACiAJfQogCiAJcGh5X3N0YXJ0KGRldi0+cGh5ZGV2KTsKLQl3YWtlID0gZmVwLT50eF9mcmVlICYmICEoQ0JEUl9TQyhmZXAtPmN1cl90eCkgJiBCRF9FTkVUX1RYX1JFQURZKTsKKwl3YWtlID0gZmVwLT50eF9mcmVlID49IE1BWF9TS0JfRlJBR1MgJiYKKwkgICAgICAgIShDQkRSX1NDKGZlcC0+Y3VyX3R4KSAmIEJEX0VORVRfVFhfUkVBRFkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlcC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKHdha2UpCkBAIC03NTEsMTEgKzcyNCwxMCBAQAogCWludCBlcnI7CiAKIAkvKiB0byBpbml0aWFsaXplIHRoZSBmZXAtPmN1cl9yeCwuLi4gKi8KLQkvKiBub3QgZG9pbmcgdGhpcywgd2lsbCBjYXVzZSBhIGNyYXNoIGluIGZzX2VuZXRfcnhfbmFwaSAqLworCS8qIG5vdCBkb2luZyB0aGlzLCB3aWxsIGNhdXNlIGEgY3Jhc2ggaW4gZnNfZW5ldF9uYXBpICovCiAJZnNfaW5pdF9iZHMoZmVwLT5uZGV2KTsKIAogCW5hcGlfZW5hYmxlKCZmZXAtPm5hcGkpOwotCW5hcGlfZW5hYmxlKCZmZXAtPm5hcGlfdHgpOwogCiAJLyogSW5zdGFsbCBvdXIgaW50ZXJydXB0IGhhbmRsZXIuICovCiAJciA9IHJlcXVlc3RfaXJxKGZlcC0+aW50ZXJydXB0LCBmc19lbmV0X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCkBAIC03NjMsNyArNzM1LDYgQEAKIAlpZiAociAhPSAwKSB7CiAJCWRldl9lcnIoZmVwLT5kZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgRlNfRU5FVCBJUlEhIik7CiAJCW5hcGlfZGlzYWJsZSgmZmVwLT5uYXBpKTsKLQkJbmFwaV9kaXNhYmxlKCZmZXAtPm5hcGlfdHgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTc3MSw3ICs3NDIsNiBAQAogCWlmIChlcnIpIHsKIAkJZnJlZV9pcnEoZmVwLT5pbnRlcnJ1cHQsIGRldik7CiAJCW5hcGlfZGlzYWJsZSgmZmVwLT5uYXBpKTsKLQkJbmFwaV9kaXNhYmxlKCZmZXAtPm5hcGlfdHgpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlwaHlfc3RhcnQoZGV2LT5waHlkZXYpOwpAQCAtNzg5LDcgKzc1OSw2IEBACiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAJbmFwaV9kaXNhYmxlKCZmZXAtPm5hcGkpOwotCW5hcGlfZGlzYWJsZSgmZmVwLT5uYXBpX3R4KTsKIAlwaHlfc3RvcChkZXYtPnBoeWRldik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZmVwLT5sb2NrLCBmbGFncyk7CkBAIC04NjEsNiArODMwLDQ0IEBACiAJZmVwLT5tc2dfZW5hYmxlID0gdmFsdWU7CiB9CiAKK3N0YXRpYyBpbnQgZnNfZ2V0X3R1bmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgY29uc3Qgc3RydWN0IGV0aHRvb2xfdHVuYWJsZSAqdHVuYSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvICpmcGkgPSBmZXAtPmZwaTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAodHVuYS0+aWQpIHsKKwljYXNlIEVUSFRPT0xfUlhfQ09QWUJSRUFLOgorCQkqKHUzMiAqKWRhdGEgPSBmcGktPnJ4X2NvcHlicmVhazsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmc19zZXRfdHVuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBjb25zdCBzdHJ1Y3QgZXRodG9vbF90dW5hYmxlICp0dW5hLCBjb25zdCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGZzX3BsYXRmb3JtX2luZm8gKmZwaSA9IGZlcC0+ZnBpOworCWludCByZXQgPSAwOworCisJc3dpdGNoICh0dW5hLT5pZCkgeworCWNhc2UgRVRIVE9PTF9SWF9DT1BZQlJFQUs6CisJCWZwaS0+cnhfY29weWJyZWFrID0gKih1MzIgKilkYXRhOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGZzX2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbyA9IGZzX2dldF9kcnZpbmZvLAogCS5nZXRfcmVnc19sZW4gPSBmc19nZXRfcmVnc19sZW4sCkBAIC04NzIsNiArODc5LDggQEAKIAkuZ2V0X3RzX2luZm8gPSBldGh0b29sX29wX2dldF90c19pbmZvLAogCS5nZXRfbGlua19rc2V0dGluZ3MgPSBwaHlfZXRodG9vbF9nZXRfbGlua19rc2V0dGluZ3MsCiAJLnNldF9saW5rX2tzZXR0aW5ncyA9IHBoeV9ldGh0b29sX3NldF9saW5rX2tzZXR0aW5ncywKKwkuZ2V0X3R1bmFibGUgPSBmc19nZXRfdHVuYWJsZSwKKwkuc2V0X3R1bmFibGUgPSBmc19zZXRfdHVuYWJsZSwKIH07CiAKIHN0YXRpYyBpbnQgZnNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKQEAgLTkzOSw4ICs5NDgsOCBAQAogCQlmcGktPmNwX2NvbW1hbmQgPSAqZGF0YTsKIAl9CiAKLQlmcGktPnJ4X3JpbmcgPSAzMjsKLQlmcGktPnR4X3JpbmcgPSA2NDsKKwlmcGktPnJ4X3JpbmcgPSBSWF9SSU5HX1NJWkU7CisJZnBpLT50eF9yaW5nID0gVFhfUklOR19TSVpFOwogCWZwaS0+cnhfY29weWJyZWFrID0gMjQwOwogCWZwaS0+bmFwaV93ZWlnaHQgPSAxNzsKIAlmcGktPnBoeV9ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShvZmRldi0+ZGV2Lm9mX25vZGUsICJwaHktaGFuZGxlIiwgMCk7CkBAIC0xMDI0LDggKzEwMzMsNyBAQAogCiAJbmRldi0+bmV0ZGV2X29wcyA9ICZmc19lbmV0X25ldGRldl9vcHM7CiAJbmRldi0+d2F0Y2hkb2dfdGltZW8gPSAyICogSFo7Ci0JbmV0aWZfbmFwaV9hZGQobmRldiwgJmZlcC0+bmFwaSwgZnNfZW5ldF9yeF9uYXBpLCBmcGktPm5hcGlfd2VpZ2h0KTsKLQluZXRpZl90eF9uYXBpX2FkZChuZGV2LCAmZmVwLT5uYXBpX3R4LCBmc19lbmV0X3R4X25hcGksIDIpOworCW5ldGlmX25hcGlfYWRkKG5kZXYsICZmZXAtPm5hcGksIGZzX2VuZXRfbmFwaSwgZnBpLT5uYXBpX3dlaWdodCk7CiAKIAluZGV2LT5ldGh0b29sX29wcyA9ICZmc19ldGh0b29sX29wczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvZnNfZW5ldC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvZnNfZW5ldC5oCmluZGV4IGUyOWY1NGEuLmZlZTI0YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L2ZzX2VuZXQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9mc19lbmV0LmgKQEAgLTgxLDEyICs4MSw5IEBACiAJdm9pZCAoKmFkanVzdF9saW5rKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAl2b2lkICgqcmVzdGFydCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAJdm9pZCAoKnN0b3ApKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCXZvaWQgKCpuYXBpX2NsZWFyX3J4X2V2ZW50KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQl2b2lkICgqbmFwaV9lbmFibGVfcngpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCXZvaWQgKCpuYXBpX2Rpc2FibGVfcngpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCXZvaWQgKCpuYXBpX2NsZWFyX3R4X2V2ZW50KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQl2b2lkICgqbmFwaV9lbmFibGVfdHgpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCXZvaWQgKCpuYXBpX2Rpc2FibGVfdHgpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpuYXBpX2NsZWFyX2V2ZW50KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqbmFwaV9lbmFibGUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpuYXBpX2Rpc2FibGUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCXZvaWQgKCpyeF9iZF9kb25lKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAl2b2lkICgqdHhfa2lja3N0YXJ0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAl1MzIgKCpnZXRfaW50X2V2ZW50cykoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CkBAIC0xMjIsNyArMTE5LDYgQEAKIAogc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSB7CiAJc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7Ci0Jc3RydWN0IG5hcGlfc3RydWN0IG5hcGlfdHg7CiAJc3RydWN0IGRldmljZSAqZGV2OwkvKiBwb2ludGVyIGJhY2sgdG8gdGhlIGRldmljZSAobXVzdCBiZSBpbml0aWFsaXplZCBmaXJzdCkgKi8KIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAlzcGlubG9ja190IGxvY2s7CS8qIGR1cmluZyBhbGwgb3BzIGV4Y2VwdCBUWCBwY2t0IHByb2Nlc3NpbmcgKi8KQEAgLTE1MiwxMCArMTQ4LDggQEAKIAlpbnQgb2xkZHVwbGV4LCBvbGRzcGVlZCwgb2xkbGluazsJLyogY3VycmVudCBzZXR0aW5ncyAqLwogCiAJLyogZXZlbnQgbWFza3MgKi8KLQl1MzIgZXZfbmFwaV9yeDsJCS8qIG1hc2sgb2YgTkFQSSByeCBldmVudHMgKi8KLQl1MzIgZXZfbmFwaV90eDsJCS8qIG1hc2sgb2YgTkFQSSByeCBldmVudHMgKi8KLQl1MzIgZXZfcng7CQkvKiByeCBldmVudCBtYXNrICAgICAgICAgICovCi0JdTMyIGV2X3R4OwkJLyogdHggZXZlbnQgbWFzayAgICAgICAgICAqLworCXUzMiBldl9uYXBpOwkJLyogbWFzayBvZiBOQVBJIGV2ZW50cyAqLworCXUzMiBldjsJCQkvKiBldmVudCBtYXNrICAgICAgICAgICovCiAJdTMyIGV2X2VycjsJCS8qIGVycm9yIGV2ZW50IG1hc2sgICAgICAgKi8KIAogCXUxNiBiZF9yeF9lbXB0eTsJLyogbWFzayBvZiBCRCByeCBlbXB0eQkgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9tYWMtZmNjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9tYWMtZmNjLmMKaW5kZXggZDcxNzYxYS4uMTIwYzc1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvbWFjLWZjYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L21hYy1mY2MuYwpAQCAtOTAsNyArOTAsNyBAQAogCWludCByZXQgPSAtRUlOVkFMOwogCiAJZmVwLT5pbnRlcnJ1cHQgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvZmRldi0+ZGV2Lm9mX25vZGUsIDApOwotCWlmIChmZXAtPmludGVycnVwdCA9PSBOT19JUlEpCisJaWYgKCFmZXAtPmludGVycnVwdCkKIAkJZ290byBvdXQ7CiAKIAlmZXAtPmZjYy5mY2NwID0gb2ZfaW9tYXAob2ZkZXYtPmRldi5vZl9ub2RlLCAwKTsKQEAgLTEyNCwxMCArMTI0LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jZGVmaW5lIEZDQ19OQVBJX1JYX0VWRU5UX01TSwkoRkNDX0VORVRfUlhGIHwgRkNDX0VORVRfUlhCKQotI2RlZmluZSBGQ0NfTkFQSV9UWF9FVkVOVF9NU0sJKEZDQ19FTkVUX1RYQikKLSNkZWZpbmUgRkNDX1JYX0VWRU5UCQkoRkNDX0VORVRfUlhGKQotI2RlZmluZSBGQ0NfVFhfRVZFTlQJCShGQ0NfRU5FVF9UWEIpCisjZGVmaW5lIEZDQ19OQVBJX0VWRU5UX01TSwkoRkNDX0VORVRfUlhGIHwgRkNDX0VORVRfUlhCIHwgRkNDX0VORVRfVFhCKQorI2RlZmluZSBGQ0NfRVZFTlQJCShGQ0NfRU5FVF9SWEYgfCBGQ0NfRU5FVF9UWEIpCiAjZGVmaW5lIEZDQ19FUlJfRVZFTlRfTVNLCShGQ0NfRU5FVF9UWEUpCiAKIHN0YXRpYyBpbnQgc2V0dXBfZGF0YShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTM3LDEwICsxMzUsOCBAQAogCWlmIChkb19wZF9zZXR1cChmZXApICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZmVwLT5ldl9uYXBpX3J4ID0gRkNDX05BUElfUlhfRVZFTlRfTVNLOwotCWZlcC0+ZXZfbmFwaV90eCA9IEZDQ19OQVBJX1RYX0VWRU5UX01TSzsKLQlmZXAtPmV2X3J4ID0gRkNDX1JYX0VWRU5UOwotCWZlcC0+ZXZfdHggPSBGQ0NfVFhfRVZFTlQ7CisJZmVwLT5ldl9uYXBpID0gRkNDX05BUElfRVZFTlRfTVNLOworCWZlcC0+ZXYgPSBGQ0NfRVZFTlQ7CiAJZmVwLT5ldl9lcnIgPSBGQ0NfRVJSX0VWRU5UX01TSzsKIAogCXJldHVybiAwOwpAQCAtNDI0LDUyICs0MjAsMjggQEAKIAlmc19jbGVhbnVwX2JkcyhkZXYpOwogfQogCi1zdGF0aWMgdm9pZCBuYXBpX2NsZWFyX3J4X2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuYXBpX2NsZWFyX2V2ZW50X2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlmY2NfdCBfX2lvbWVtICpmY2NwID0gZmVwLT5mY2MuZmNjcDsKIAotCVcxNihmY2NwLCBmY2NfZmNjZSwgRkNDX05BUElfUlhfRVZFTlRfTVNLKTsKKwlXMTYoZmNjcCwgZmNjX2ZjY2UsIEZDQ19OQVBJX0VWRU5UX01TSyk7CiB9CiAKLXN0YXRpYyB2b2lkIG5hcGlfZW5hYmxlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuYXBpX2VuYWJsZV9mcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CiAJZmNjX3QgX19pb21lbSAqZmNjcCA9IGZlcC0+ZmNjLmZjY3A7CiAKLQlTMTYoZmNjcCwgZmNjX2ZjY20sIEZDQ19OQVBJX1JYX0VWRU5UX01TSyk7CisJUzE2KGZjY3AsIGZjY19mY2NtLCBGQ0NfTkFQSV9FVkVOVF9NU0spOwogfQogCi1zdGF0aWMgdm9pZCBuYXBpX2Rpc2FibGVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG5hcGlfZGlzYWJsZV9mcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CiAJZmNjX3QgX19pb21lbSAqZmNjcCA9IGZlcC0+ZmNjLmZjY3A7CiAKLQlDMTYoZmNjcCwgZmNjX2ZjY20sIEZDQ19OQVBJX1JYX0VWRU5UX01TSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5hcGlfY2xlYXJfdHhfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWZjY190IF9faW9tZW0gKmZjY3AgPSBmZXAtPmZjYy5mY2NwOwotCi0JVzE2KGZjY3AsIGZjY19mY2NlLCBGQ0NfTkFQSV9UWF9FVkVOVF9NU0spOwotfQotCi1zdGF0aWMgdm9pZCBuYXBpX2VuYWJsZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7Ci0JZmNjX3QgX19pb21lbSAqZmNjcCA9IGZlcC0+ZmNjLmZjY3A7Ci0KLQlTMTYoZmNjcCwgZmNjX2ZjY20sIEZDQ19OQVBJX1RYX0VWRU5UX01TSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5hcGlfZGlzYWJsZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7Ci0JZmNjX3QgX19pb21lbSAqZmNjcCA9IGZlcC0+ZmNjLmZjY3A7Ci0KLQlDMTYoZmNjcCwgZmNjX2ZjY20sIEZDQ19OQVBJX1RYX0VWRU5UX01TSyk7CisJQzE2KGZjY3AsIGZjY19mY2NtLCBGQ0NfTkFQSV9FVkVOVF9NU0spOwogfQogCiBzdGF0aWMgdm9pZCByeF9iZF9kb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC01OTUsMTIgKzU2Nyw5IEBACiAJLnNldF9tdWx0aWNhc3RfbGlzdAk9IHNldF9tdWx0aWNhc3RfbGlzdCwKIAkucmVzdGFydAkJPSByZXN0YXJ0LAogCS5zdG9wCQkJPSBzdG9wLAotCS5uYXBpX2NsZWFyX3J4X2V2ZW50CT0gbmFwaV9jbGVhcl9yeF9ldmVudCwKLQkubmFwaV9lbmFibGVfcngJCT0gbmFwaV9lbmFibGVfcngsCi0JLm5hcGlfZGlzYWJsZV9yeAk9IG5hcGlfZGlzYWJsZV9yeCwKLQkubmFwaV9jbGVhcl90eF9ldmVudAk9IG5hcGlfY2xlYXJfdHhfZXZlbnQsCi0JLm5hcGlfZW5hYmxlX3R4CQk9IG5hcGlfZW5hYmxlX3R4LAotCS5uYXBpX2Rpc2FibGVfdHgJPSBuYXBpX2Rpc2FibGVfdHgsCisJLm5hcGlfY2xlYXJfZXZlbnQJPSBuYXBpX2NsZWFyX2V2ZW50X2ZzLAorCS5uYXBpX2VuYWJsZQkJPSBuYXBpX2VuYWJsZV9mcywKKwkubmFwaV9kaXNhYmxlCQk9IG5hcGlfZGlzYWJsZV9mcywKIAkucnhfYmRfZG9uZQkJPSByeF9iZF9kb25lLAogCS50eF9raWNrc3RhcnQJCT0gdHhfa2lja3N0YXJ0LAogCS5nZXRfaW50X2V2ZW50cwkJPSBnZXRfaW50X2V2ZW50cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L21hYy1mZWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L21hYy1mZWMuYwppbmRleCAzNWEzMThlLi43NzdiZWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9tYWMtZmVjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvbWFjLWZlYy5jCkBAIC05OSw3ICs5OSw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZmVwLT5kZXYpOwogCiAJZmVwLT5pbnRlcnJ1cHQgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvZmRldi0+ZGV2Lm9mX25vZGUsIDApOwotCWlmIChmZXAtPmludGVycnVwdCA9PSBOT19JUlEpCisJaWYgKCFmZXAtPmludGVycnVwdCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmZXAtPmZlYy5mZWNwID0gb2ZfaW9tYXAob2ZkZXYtPmRldi5vZl9ub2RlLCAwKTsKQEAgLTEwOSwxMCArMTA5LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBGRUNfTkFQSV9SWF9FVkVOVF9NU0sJKEZFQ19FTkVUX1JYRiB8IEZFQ19FTkVUX1JYQikKLSNkZWZpbmUgRkVDX05BUElfVFhfRVZFTlRfTVNLCShGRUNfRU5FVF9UWEYpCi0jZGVmaW5lIEZFQ19SWF9FVkVOVAkJKEZFQ19FTkVUX1JYRikKLSNkZWZpbmUgRkVDX1RYX0VWRU5UCQkoRkVDX0VORVRfVFhGKQorI2RlZmluZSBGRUNfTkFQSV9FVkVOVF9NU0sJKEZFQ19FTkVUX1JYRiB8IEZFQ19FTkVUX1JYQiB8IEZFQ19FTkVUX1RYRikKKyNkZWZpbmUgRkVDX0VWRU5UCQkoRkVDX0VORVRfUlhGIHwgRkVDX0VORVRfVFhGKQogI2RlZmluZSBGRUNfRVJSX0VWRU5UX01TSwkoRkVDX0VORVRfSEJFUlIgfCBGRUNfRU5FVF9CQUJSIHwgXAogCQkJCSBGRUNfRU5FVF9CQUJUIHwgRkVDX0VORVRfRUJFUlIpCiAKQEAgLTEyNiwxMCArMTI0LDggQEAKIAlmZXAtPmZlYy5odGhpID0gMDsKIAlmZXAtPmZlYy5odGxvID0gMDsKIAotCWZlcC0+ZXZfbmFwaV9yeCA9IEZFQ19OQVBJX1JYX0VWRU5UX01TSzsKLQlmZXAtPmV2X25hcGlfdHggPSBGRUNfTkFQSV9UWF9FVkVOVF9NU0s7Ci0JZmVwLT5ldl9yeCA9IEZFQ19SWF9FVkVOVDsKLQlmZXAtPmV2X3R4ID0gRkVDX1RYX0VWRU5UOworCWZlcC0+ZXZfbmFwaSA9IEZFQ19OQVBJX0VWRU5UX01TSzsKKwlmZXAtPmV2ID0gRkVDX0VWRU5UOwogCWZlcC0+ZXZfZXJyID0gRkVDX0VSUl9FVkVOVF9NU0s7CiAKIAlyZXR1cm4gMDsKQEAgLTM5Niw1MiArMzkyLDI4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBuYXBpX2NsZWFyX3J4X2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuYXBpX2NsZWFyX2V2ZW50X2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZmVjIF9faW9tZW0gKmZlY3AgPSBmZXAtPmZlYy5mZWNwOwogCi0JRlcoZmVjcCwgaWV2ZW50LCBGRUNfTkFQSV9SWF9FVkVOVF9NU0spOworCUZXKGZlY3AsIGlldmVudCwgRkVDX05BUElfRVZFTlRfTVNLKTsKIH0KIAotc3RhdGljIHZvaWQgbmFwaV9lbmFibGVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG5hcGlfZW5hYmxlX2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZmVjIF9faW9tZW0gKmZlY3AgPSBmZXAtPmZlYy5mZWNwOwogCi0JRlMoZmVjcCwgaW1hc2ssIEZFQ19OQVBJX1JYX0VWRU5UX01TSyk7CisJRlMoZmVjcCwgaW1hc2ssIEZFQ19OQVBJX0VWRU5UX01TSyk7CiB9CiAKLXN0YXRpYyB2b2lkIG5hcGlfZGlzYWJsZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbmFwaV9kaXNhYmxlX2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZmVjIF9faW9tZW0gKmZlY3AgPSBmZXAtPmZlYy5mZWNwOwogCi0JRkMoZmVjcCwgaW1hc2ssIEZFQ19OQVBJX1JYX0VWRU5UX01TSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5hcGlfY2xlYXJfdHhfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBmZWMgX19pb21lbSAqZmVjcCA9IGZlcC0+ZmVjLmZlY3A7Ci0KLQlGVyhmZWNwLCBpZXZlbnQsIEZFQ19OQVBJX1RYX0VWRU5UX01TSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5hcGlfZW5hYmxlX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgZmVjIF9faW9tZW0gKmZlY3AgPSBmZXAtPmZlYy5mZWNwOwotCi0JRlMoZmVjcCwgaW1hc2ssIEZFQ19OQVBJX1RYX0VWRU5UX01TSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5hcGlfZGlzYWJsZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGZlYyBfX2lvbWVtICpmZWNwID0gZmVwLT5mZWMuZmVjcDsKLQotCUZDKGZlY3AsIGltYXNrLCBGRUNfTkFQSV9UWF9FVkVOVF9NU0spOworCUZDKGZlY3AsIGltYXNrLCBGRUNfTkFQSV9FVkVOVF9NU0spOwogfQogCiBzdGF0aWMgdm9pZCByeF9iZF9kb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC01MTMsMTIgKzQ4NSw5IEBACiAJLnNldF9tdWx0aWNhc3RfbGlzdAk9IHNldF9tdWx0aWNhc3RfbGlzdCwKIAkucmVzdGFydAkJPSByZXN0YXJ0LAogCS5zdG9wCQkJPSBzdG9wLAotCS5uYXBpX2NsZWFyX3J4X2V2ZW50CT0gbmFwaV9jbGVhcl9yeF9ldmVudCwKLQkubmFwaV9lbmFibGVfcngJCT0gbmFwaV9lbmFibGVfcngsCi0JLm5hcGlfZGlzYWJsZV9yeAk9IG5hcGlfZGlzYWJsZV9yeCwKLQkubmFwaV9jbGVhcl90eF9ldmVudAk9IG5hcGlfY2xlYXJfdHhfZXZlbnQsCi0JLm5hcGlfZW5hYmxlX3R4CQk9IG5hcGlfZW5hYmxlX3R4LAotCS5uYXBpX2Rpc2FibGVfdHgJPSBuYXBpX2Rpc2FibGVfdHgsCisJLm5hcGlfY2xlYXJfZXZlbnQJPSBuYXBpX2NsZWFyX2V2ZW50X2ZzLAorCS5uYXBpX2VuYWJsZQkJPSBuYXBpX2VuYWJsZV9mcywKKwkubmFwaV9kaXNhYmxlCQk9IG5hcGlfZGlzYWJsZV9mcywKIAkucnhfYmRfZG9uZQkJPSByeF9iZF9kb25lLAogCS50eF9raWNrc3RhcnQJCT0gdHhfa2lja3N0YXJ0LAogCS5nZXRfaW50X2V2ZW50cwkJPSBnZXRfaW50X2V2ZW50cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L21hYy1zY2MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L21hYy1zY2MuYwppbmRleCBlOGI5YzMzLi4xNWFiZDM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9tYWMtc2NjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvbWFjLXNjYy5jCkBAIC05OSw3ICs5OSw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZmVwLT5kZXYpOwogCiAJZmVwLT5pbnRlcnJ1cHQgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvZmRldi0+ZGV2Lm9mX25vZGUsIDApOwotCWlmIChmZXAtPmludGVycnVwdCA9PSBOT19JUlEpCisJaWYgKCFmZXAtPmludGVycnVwdCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmZXAtPnNjYy5zY2NwID0gb2ZfaW9tYXAob2ZkZXYtPmRldi5vZl9ub2RlLCAwKTsKQEAgLTExNSwxMCArMTE1LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBTQ0NfTkFQSV9SWF9FVkVOVF9NU0sJKFNDQ0VfRU5FVF9SWEYgfCBTQ0NFX0VORVRfUlhCKQotI2RlZmluZSBTQ0NfTkFQSV9UWF9FVkVOVF9NU0sJKFNDQ0VfRU5FVF9UWEIpCi0jZGVmaW5lIFNDQ19SWF9FVkVOVAkJKFNDQ0VfRU5FVF9SWEYpCi0jZGVmaW5lIFNDQ19UWF9FVkVOVAkJKFNDQ0VfRU5FVF9UWEIpCisjZGVmaW5lIFNDQ19OQVBJX0VWRU5UX01TSwkoU0NDRV9FTkVUX1JYRiB8IFNDQ0VfRU5FVF9SWEIgfCBTQ0NFX0VORVRfVFhCKQorI2RlZmluZSBTQ0NfRVZFTlQJCShTQ0NFX0VORVRfUlhGIHwgU0NDRV9FTkVUX1RYQikKICNkZWZpbmUgU0NDX0VSUl9FVkVOVF9NU0sJKFNDQ0VfRU5FVF9UWEUgfCBTQ0NFX0VORVRfQlNZKQogCiBzdGF0aWMgaW50IHNldHVwX2RhdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTEzMCwxMCArMTI4LDggQEAKIAlmZXAtPnNjYy5odGhpID0gMDsKIAlmZXAtPnNjYy5odGxvID0gMDsKIAotCWZlcC0+ZXZfbmFwaV9yeCA9IFNDQ19OQVBJX1JYX0VWRU5UX01TSzsKLQlmZXAtPmV2X25hcGlfdHggPSBTQ0NfTkFQSV9UWF9FVkVOVF9NU0s7Ci0JZmVwLT5ldl9yeCA9IFNDQ19SWF9FVkVOVDsKLQlmZXAtPmV2X3R4ID0gU0NDX1RYX0VWRU5UIHwgU0NDRV9FTkVUX1RYRTsKKwlmZXAtPmV2X25hcGkgPSBTQ0NfTkFQSV9FVkVOVF9NU0s7CisJZmVwLT5ldiA9IFNDQ19FVkVOVCB8IFNDQ0VfRU5FVF9UWEU7CiAJZmVwLT5ldl9lcnIgPSBTQ0NfRVJSX0VWRU5UX01TSzsKIAogCXJldHVybiAwOwpAQCAtMzc5LDUyICszNzUsMjggQEAKIAlmc19jbGVhbnVwX2JkcyhkZXYpOwogfQogCi1zdGF0aWMgdm9pZCBuYXBpX2NsZWFyX3J4X2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuYXBpX2NsZWFyX2V2ZW50X2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzY2NfdCBfX2lvbWVtICpzY2NwID0gZmVwLT5zY2Muc2NjcDsKIAotCVcxNihzY2NwLCBzY2Nfc2NjZSwgU0NDX05BUElfUlhfRVZFTlRfTVNLKTsKKwlXMTYoc2NjcCwgc2NjX3NjY2UsIFNDQ19OQVBJX0VWRU5UX01TSyk7CiB9CiAKLXN0YXRpYyB2b2lkIG5hcGlfZW5hYmxlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuYXBpX2VuYWJsZV9mcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CiAJc2NjX3QgX19pb21lbSAqc2NjcCA9IGZlcC0+c2NjLnNjY3A7CiAKLQlTMTYoc2NjcCwgc2NjX3NjY20sIFNDQ19OQVBJX1JYX0VWRU5UX01TSyk7CisJUzE2KHNjY3AsIHNjY19zY2NtLCBTQ0NfTkFQSV9FVkVOVF9NU0spOwogfQogCi1zdGF0aWMgdm9pZCBuYXBpX2Rpc2FibGVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG5hcGlfZGlzYWJsZV9mcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CiAJc2NjX3QgX19pb21lbSAqc2NjcCA9IGZlcC0+c2NjLnNjY3A7CiAKLQlDMTYoc2NjcCwgc2NjX3NjY20sIFNDQ19OQVBJX1JYX0VWRU5UX01TSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5hcGlfY2xlYXJfdHhfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXNjY190IF9faW9tZW0gKnNjY3AgPSBmZXAtPnNjYy5zY2NwOwotCi0JVzE2KHNjY3AsIHNjY19zY2NlLCBTQ0NfTkFQSV9UWF9FVkVOVF9NU0spOwotfQotCi1zdGF0aWMgdm9pZCBuYXBpX2VuYWJsZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc2NjX3QgX19pb21lbSAqc2NjcCA9IGZlcC0+c2NjLnNjY3A7Ci0KLQlTMTYoc2NjcCwgc2NjX3NjY20sIFNDQ19OQVBJX1RYX0VWRU5UX01TSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5hcGlfZGlzYWJsZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc2NjX3QgX19pb21lbSAqc2NjcCA9IGZlcC0+c2NjLnNjY3A7Ci0KLQlDMTYoc2NjcCwgc2NjX3NjY20sIFNDQ19OQVBJX1RYX0VWRU5UX01TSyk7CisJQzE2KHNjY3AsIHNjY19zY2NtLCBTQ0NfTkFQSV9FVkVOVF9NU0spOwogfQogCiBzdGF0aWMgdm9pZCByeF9iZF9kb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC00OTcsMTIgKzQ2OSw5IEBACiAJLnNldF9tdWx0aWNhc3RfbGlzdAk9IHNldF9tdWx0aWNhc3RfbGlzdCwKIAkucmVzdGFydAkJPSByZXN0YXJ0LAogCS5zdG9wCQkJPSBzdG9wLAotCS5uYXBpX2NsZWFyX3J4X2V2ZW50CT0gbmFwaV9jbGVhcl9yeF9ldmVudCwKLQkubmFwaV9lbmFibGVfcngJCT0gbmFwaV9lbmFibGVfcngsCi0JLm5hcGlfZGlzYWJsZV9yeAk9IG5hcGlfZGlzYWJsZV9yeCwKLQkubmFwaV9jbGVhcl90eF9ldmVudAk9IG5hcGlfY2xlYXJfdHhfZXZlbnQsCi0JLm5hcGlfZW5hYmxlX3R4CQk9IG5hcGlfZW5hYmxlX3R4LAotCS5uYXBpX2Rpc2FibGVfdHgJPSBuYXBpX2Rpc2FibGVfdHgsCisJLm5hcGlfY2xlYXJfZXZlbnQJPSBuYXBpX2NsZWFyX2V2ZW50X2ZzLAorCS5uYXBpX2VuYWJsZQkJPSBuYXBpX2VuYWJsZV9mcywKKwkubmFwaV9kaXNhYmxlCQk9IG5hcGlfZGlzYWJsZV9mcywKIAkucnhfYmRfZG9uZQkJPSByeF9iZF9kb25lLAogCS50eF9raWNrc3RhcnQJCT0gdHhfa2lja3N0YXJ0LAogCS5nZXRfaW50X2V2ZW50cwkJPSBnZXRfaW50X2V2ZW50cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc2xfcHFfbWRpby5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzbF9wcV9tZGlvLmMKaW5kZXggZjNjNjNkYy4uNDQ2YzdiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzbF9wcV9tZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzbF9wcV9tZGlvLmMKQEAgLTE5NSw3ICsxOTUsNyBAQAogCXJldHVybiAwOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfR0lBTkZBUikgfHwgZGVmaW5lZChDT05GSUdfR0lBTkZBUl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfR0lBTkZBUikKIC8qCiAgKiBSZXR1cm4gdGhlIFRCSVBBIGFkZHJlc3MsIHN0YXJ0aW5nIGZyb20gdGhlIGFkZHJlc3MKICAqIG9mIHRoZSBtYXBwZWQgR0ZBUiBNRElPIHJlZ2lzdGVycyAoc3RydWN0IGdmYXIpCkBAIC0yMjgsNyArMjI4LDcgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfVUNDX0dFVEgpIHx8IGRlZmluZWQoQ09ORklHX1VDQ19HRVRIX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19VQ0NfR0VUSCkKIC8qCiAgKiBSZXR1cm4gdGhlIFRCSVBBUiBhZGRyZXNzIGZvciBhIFFFIE1ESU8gbm9kZSwgc3RhcnRpbmcgZnJvbSB0aGUgYWRkcmVzcwogICogb2YgdGhlIG1hcHBlZCBNSUkgcmVnaXN0ZXJzIChzdHJ1Y3QgZnNsX3BxX21paSkKQEAgLTMwNiw3ICszMDYsNyBAQAogI2VuZGlmCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZzbF9wcV9tZGlvX21hdGNoW10gPSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfR0lBTkZBUikgfHwgZGVmaW5lZChDT05GSUdfR0lBTkZBUl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfR0lBTkZBUikKIAl7CiAJCS5jb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLXRiaSIsCiAJCS5kYXRhID0gJihzdHJ1Y3QgZnNsX3BxX21kaW9fZGF0YSkgewpAQCAtMzQ0LDcgKzM0NCw3IEBACiAJCX0sCiAJfSwKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1VDQ19HRVRIKSB8fCBkZWZpbmVkKENPTkZJR19VQ0NfR0VUSF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVUNDX0dFVEgpCiAJewogCQkuY29tcGF0aWJsZSA9ICJmc2wsdWNjLW1kaW8iLAogCQkuZGF0YSA9ICYoc3RydWN0IGZzbF9wcV9tZGlvX2RhdGEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5jCmluZGV4IGQyMDkzNWQuLjRiNGY1YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXIuYwpAQCAtMjkyMiwxNyArMjkyMiwyNSBAQAogewogCXVuc2lnbmVkIGludCBzaXplID0gbHN0YXR1cyAmIEJEX0xFTkdUSF9NQVNLOwogCXN0cnVjdCBwYWdlICpwYWdlID0gcnhiLT5wYWdlOworCWJvb2wgbGFzdCA9ICEhKGxzdGF0dXMgJiBCRF9MRkxBRyhSWEJEX0xBU1QpKTsKIAogCS8qIFJlbW92ZSB0aGUgRkNTIGZyb20gdGhlIHBhY2tldCBsZW5ndGggKi8KLQlpZiAobGlrZWx5KGxzdGF0dXMgJiBCRF9MRkxBRyhSWEJEX0xBU1QpKSkKKwlpZiAobGFzdCkKIAkJc2l6ZSAtPSBFVEhfRkNTX0xFTjsKIAotCWlmIChsaWtlbHkoZmlyc3QpKQorCWlmIChsaWtlbHkoZmlyc3QpKSB7CiAJCXNrYl9wdXQoc2tiLCBzaXplKTsKLQllbHNlCi0JCXNrYl9hZGRfcnhfZnJhZyhza2IsIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MsIHBhZ2UsCi0JCQkJcnhiLT5wYWdlX29mZnNldCArIFJYQlVGX0FMSUdOTUVOVCwKLQkJCQlzaXplLCBHRkFSX1JYQl9UUlVFU0laRSk7CisJfSBlbHNlIHsKKwkJLyogdGhlIGxhc3QgZnJhZ21lbnRzJyBsZW5ndGggY29udGFpbnMgdGhlIGZ1bGwgZnJhbWUgbGVuZ3RoICovCisJCWlmIChsYXN0KQorCQkJc2l6ZSAtPSBza2ItPmxlbjsKKworCQkvKiBpbiBjYXNlIHRoZSBsYXN0IGZyYWdtZW50IGNvbnNpc3RlZCBvbmx5IG9mIHRoZSBGQ1MgKi8KKwkJaWYgKHNpemUgPiAwKQorCQkJc2tiX2FkZF9yeF9mcmFnKHNrYiwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncywgcGFnZSwKKwkJCQkJcnhiLT5wYWdlX29mZnNldCArIFJYQlVGX0FMSUdOTUVOVCwKKwkJCQkJc2l6ZSwgR0ZBUl9SWEJfVFJVRVNJWkUpOworCX0KIAogCS8qIHRyeSByZXVzZSBwYWdlICovCiAJaWYgKHVubGlrZWx5KHBhZ2VfY291bnQocGFnZSkgIT0gMSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXIuaAppbmRleCAzNzNmZDA5Li42ZThhOWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyLmgKQEAgLTEwMCw3ICsxMDAsOCBAQAogI2RlZmluZSBERUZBVUxUX1JYX0xGQ19USFIgIDE2CiAjZGVmaW5lIERFRkFVTFRfTEZDX1BUVlZBTCAgNAogCi0jZGVmaW5lIEdGQVJfUlhCX1NJWkUgMTUzNgorLyogcHJldmVudCBmcmFnbWVuYXRpb24gYnkgSFcgaW4gRFNBIGVudmlyb25tZW50cyAqLworI2RlZmluZSBHRkFSX1JYQl9TSVpFIHJvdW5kdXAoMTUzNiArIDgsIDY0KQogI2RlZmluZSBHRkFSX1NLQkZSQUdfU0laRSAoUlhCVUZfQUxJR05NRU5UICsgR0ZBUl9SWEJfU0laRSBcCiAJCQkgICsgU0tCX0RBVEFfQUxJR04oc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pKSkKICNkZWZpbmUgR0ZBUl9SWEJfVFJVRVNJWkUgMjA0OApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3VjY19nZXRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvdWNjX2dldGguYwppbmRleCA1YmYxYWRlLi4xODZlZjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvdWNjX2dldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvdWNjX2dldGguYwpAQCAtMzc1Niw3ICszNzU2LDcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmICgoKnByb3AgPCBRRV9DTEtfTk9ORSkgfHwgKCpwcm9wID4gUUVfQ0xLMjQpKSB7Ci0JCQlwcl9lcnIoImludmFsaWQgcngtY2xvY2sgcHJvcHBlcnR5XG4iKTsKKwkJCXByX2VycigiaW52YWxpZCByeC1jbG9jayBwcm9wZXJ0eVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQl1Z19pbmZvLT51Zl9pbmZvLnJ4X2Nsb2NrID0gKnByb3A7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUveGdtYWNfbWRpby5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3hnbWFjX21kaW8uYwppbmRleCA3YjhmZTg2Li5lMDNiMzBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUveGdtYWNfbWRpby5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS94Z21hY19tZGlvLmMKQEAgLTI3MSwxMSArMjcxLDggQEAKIAkJZ290byBlcnJfaW9yZW1hcDsKIAl9CiAKLQlpZiAob2ZfZ2V0X3Byb3BlcnR5KHBkZXYtPmRldi5vZl9ub2RlLAotCQkJICAgICJsaXR0bGUtZW5kaWFuIiwgTlVMTCkpCi0JCXByaXYtPmlzX2xpdHRsZV9lbmRpYW4gPSB0cnVlOwotCWVsc2UKLQkJcHJpdi0+aXNfbGl0dGxlX2VuZGlhbiA9IGZhbHNlOworCXByaXYtPmlzX2xpdHRsZV9lbmRpYW4gPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCQkgICAgICAgImxpdHRsZS1lbmRpYW4iKTsKIAogCXJldCA9IG9mX21kaW9idXNfcmVnaXN0ZXIoYnVzLCBucCk7CiAJaWYgKHJldCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hpcDA0X2V0aC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hpcDA0X2V0aC5jCmluZGV4IDBjNGFmZTkuLjM5Nzc4ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9oaXAwNF9ldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaGlwMDRfZXRoLmMKQEAgLTYwMCw3ICs2MDAsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotZW51bSBocnRpbWVyX3Jlc3RhcnQgdHhfZG9uZShzdHJ1Y3QgaHJ0aW1lciAqaHJ0aW1lcikKK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCB0eF9kb25lKHN0cnVjdCBocnRpbWVyICpocnRpbWVyKQogewogCXN0cnVjdCBoaXAwNF9wcml2ICpwcml2OwogCkBAIC03NTUsMTMgKzc1NSwxMyBAQAogCXN0cmxjcHkoZHJ2aW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihkcnZpbmZvLT52ZXJzaW9uKSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgaGlwMDRfZXRodG9vbF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGhpcDA0X2V0aHRvb2xfb3BzID0gewogCS5nZXRfY29hbGVzY2UJCT0gaGlwMDRfZ2V0X2NvYWxlc2NlLAogCS5zZXRfY29hbGVzY2UJCT0gaGlwMDRfc2V0X2NvYWxlc2NlLAogCS5nZXRfZHJ2aW5mbwkJPSBoaXAwNF9nZXRfZHJ2aW5mbywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaGlwMDRfbmV0ZGV2X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaGlwMDRfbmV0ZGV2X29wcyA9IHsKIAkubmRvX29wZW4JCT0gaGlwMDRfbWFjX29wZW4sCiAJLm5kb19zdG9wCQk9IGhpcDA0X21hY19zdG9wLAogCS5uZG9fZ2V0X3N0YXRzCQk9IGhpcDA0X2dldF9zdGF0cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9oaXNpX2ZlbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaGlzaV9mZW1hYy5jCmluZGV4IGI1ZDdhZDAuLmNlZDE4NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9oaXNpX2ZlbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hpc2lfZmVtYWMuYwpAQCAtNjk5LDcgKzY5OSw3IEBACiAJcmV0dXJuIHBoeV9taWlfaW9jdGwoZGV2LT5waHlkZXYsIGlmcmVxLCBjbWQpOwogfQogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGhpc2lfZmVtYWNfZXRodG9vbHNfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBoaXNpX2ZlbWFjX2V0aHRvb2xzX29wcyA9IHsKIAkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKIAkuZ2V0X2xpbmtfa3NldHRpbmdzCT0gcGh5X2V0aHRvb2xfZ2V0X2xpbmtfa3NldHRpbmdzLAogCS5zZXRfbGlua19rc2V0dGluZ3MJPSBwaHlfZXRodG9vbF9zZXRfbGlua19rc2V0dGluZ3MsCkBAIC05NDAsOCArOTQwLDggQEAKIH0KIAogI2lmZGVmIENPTkZJR19QTQotaW50IGhpc2lfZmVtYWNfZHJ2X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCSAgIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgaGlzaV9mZW1hY19kcnZfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSAgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGhpc2lfZmVtYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwpAQCAtOTU3LDcgKzk1Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBoaXNpX2ZlbWFjX2Rydl9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgaGlzaV9mZW1hY19kcnZfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgaGlzaV9mZW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaGl4NWhkMl9nbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaGl4NWhkMl9nbWFjLmMKaW5kZXggMjc1NjE4Yi4uZTY5YTZiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hpeDVoZDJfZ21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9oaXg1aGQyX2dtYWMuYwpAQCAtNzUwLDcgKzc1MCw3IEBACiAJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBoaXg1aGQyX25ldF9zZXRfbWFjX2FkZHJlc3MsCiB9OwogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGhpeDVoZDJfZXRodG9vbHNfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBoaXg1aGQyX2V0aHRvb2xzX29wcyA9IHsKIAkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKIAkuZ2V0X2xpbmtfa3NldHRpbmdzICAgICA9IHBoeV9ldGh0b29sX2dldF9saW5rX2tzZXR0aW5ncywKIAkuc2V0X2xpbmtfa3NldHRpbmdzICAgICA9IHBoeV9ldGh0b29sX3NldF9saW5rX2tzZXR0aW5ncywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfZ21hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9nbWFjLmMKaW5kZXggMTIzNWM3Zi4uMWUxZWI5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9nbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9nbWFjLmMKQEAgLTE3LDcgKzE3LDcgQEAKIAl7ImdtYWNfcnhfb2N0ZXRzX3RvdGFsX29rIiwgTUFDX1NUQVRTX0ZJRUxEX09GRihyeF9nb29kX2J5dGVzKX0sCiAJeyJnbWFjX3J4X29jdGV0c19iYWQiLCBNQUNfU1RBVFNfRklFTERfT0ZGKHJ4X2JhZF9ieXRlcyl9LAogCXsiZ21hY19yeF91Y19wa3RzIiwgTUFDX1NUQVRTX0ZJRUxEX09GRihyeF91Y19wa3RzKX0sCi0JeyJnYW1jX3J4X21jX3BrdHMiLCBNQUNfU1RBVFNfRklFTERfT0ZGKHJ4X21jX3BrdHMpfSwKKwl7ImdtYWNfcnhfbWNfcGt0cyIsIE1BQ19TVEFUU19GSUVMRF9PRkYocnhfbWNfcGt0cyl9LAogCXsiZ21hY19yeF9iY19wa3RzIiwgTUFDX1NUQVRTX0ZJRUxEX09GRihyeF9iY19wa3RzKX0sCiAJeyJnbWFjX3J4X3BrdHNfNjRvY3RldHMiLCBNQUNfU1RBVFNfRklFTERfT0ZGKHJ4XzY0Ynl0ZXMpfSwKIAl7ImdtYWNfcnhfcGt0c182NXRvMTI3IiwgTUFDX1NUQVRTX0ZJRUxEX09GRihyeF82NXRvMTI3KX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX21hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9tYWMuYwppbmRleCA1YzhhZmUxLi5hODM0Nzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfbWFjLmMKQEAgLTY4NCw4ICs2ODQsNyBAQAogCWlmICghcGh5IHx8IElTX0VSUihwaHkpKQogCQlyZXR1cm4gLUVJTzsKIAotCWlmIChtZGlvLT5pcnEpCi0JCXBoeS0+aXJxID0gbWRpby0+aXJxW2FkZHJdOworCXBoeS0+aXJxID0gbWRpby0+aXJxW2FkZHJdOwogCiAJLyogQWxsIGRhdGEgaXMgbm93IHN0b3JlZCBpbiB0aGUgcGh5IHN0cnVjdDsKIAkgKiByZWdpc3RlciBpdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX21haW4uYwppbmRleCBhZmI1ZGFhLi5lYjQ0OGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX21haW4uYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCkBAIC0xMTUsMTAgKzExNiw4IEBACiAKIAkJCWRzYWZfZGV2LT5zY19iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsCiAJCQkJCQkJCSAgcmVzKTsKLQkJCWlmIChJU19FUlIoZHNhZl9kZXYtPnNjX2Jhc2UpKSB7Ci0JCQkJZGV2X2Vycihkc2FmX2Rldi0+ZGV2LCAic3ViY3RybCBjYW4gbm90IG1hcCFcbiIpOworCQkJaWYgKElTX0VSUihkc2FmX2Rldi0+c2NfYmFzZSkpCiAJCQkJcmV0dXJuIFBUUl9FUlIoZHNhZl9kZXYtPnNjX2Jhc2UpOwotCQkJfQogCiAJCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sCiAJCQkJCQkgICAgcmVzX2lkeCsrKTsKQEAgLTEyOSwxMCArMTI4LDggQEAKIAogCQkJZHNhZl9kZXYtPnNkc19iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsCiAJCQkJCQkJCSAgIHJlcyk7Ci0JCQlpZiAoSVNfRVJSKGRzYWZfZGV2LT5zZHNfYmFzZSkpIHsKLQkJCQlkZXZfZXJyKGRzYWZfZGV2LT5kZXYsICJzZXJkZXMtY3RybCBjYW4gbm90IG1hcCFcbiIpOworCQkJaWYgKElTX0VSUihkc2FmX2Rldi0+c2RzX2Jhc2UpKQogCQkJCXJldHVybiBQVFJfRVJSKGRzYWZfZGV2LT5zZHNfYmFzZSk7Ci0JCQl9CiAJCX0gZWxzZSB7CiAJCQlkc2FmX2Rldi0+c3ViX2N0cmwgPSBzeXNjb247CiAJCX0KQEAgLTE0NywxMCArMTQ0LDggQEAKIAkJfQogCX0KIAlkc2FmX2Rldi0+cHBlX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKLQlpZiAoSVNfRVJSKGRzYWZfZGV2LT5wcGVfYmFzZSkpIHsKLQkJZGV2X2Vycihkc2FmX2Rldi0+ZGV2LCAicHBlLWJhc2UgcmVzb3VyY2UgY2FuIG5vdCBtYXAhXG4iKTsKKwlpZiAoSVNfRVJSKGRzYWZfZGV2LT5wcGVfYmFzZSkpCiAJCXJldHVybiBQVFJfRVJSKGRzYWZfZGV2LT5wcGVfYmFzZSk7Ci0JfQogCWRzYWZfZGV2LT5wcGVfcGFkZHIgPSByZXMtPnN0YXJ0OwogCiAJaWYgKCFITlNfRFNBRl9JU19ERUJVRyhkc2FmX2RldikpIHsKQEAgLTE2NiwxMCArMTYxLDggQEAKIAkJCX0KIAkJfQogCQlkc2FmX2Rldi0+aW9fYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwotCQlpZiAoSVNfRVJSKGRzYWZfZGV2LT5pb19iYXNlKSkgewotCQkJZGV2X2Vycihkc2FmX2Rldi0+ZGV2LCAiZHNhZi1iYXNlIHJlc291cmNlIGNhbiBub3QgbWFwIVxuIik7CisJCWlmIChJU19FUlIoZHNhZl9kZXYtPmlvX2Jhc2UpKQogCQkJcmV0dXJuIFBUUl9FUlIoZHNhZl9kZXYtPmlvX2Jhc2UpOwotCQl9CiAJfQogCiAJcmV0ID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGRzYWZfZGV2LT5kZXYsICJkZXNjLW51bSIsICZkZXNjX251bSk7CkBAIC0yNzgxLDYgKzI3NzQsODkgQEAKIAogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihnX2RzYWZfZHJpdmVyKTsKIAorLyoqCisgKiBobnNfZHNhZl9yb2NlX3Jlc2V0IC0gcmVzZXQgZHNhZiBhbmQgcm9jZQorICogQGRzYWZfZndub2RlOiBQb2ludGVyIHRvIGZyYW1ld29yayBub2RlIGZvciB0aGUgZGFzZgorICogQGVuYWJsZTogZmFsc2UgLSByZXF1ZXN0IHJlc2V0ICwgdHJ1ZSAtIGRyb3AgcmVzZXQKKyAqIHJldHVlbiAwIC0gc3VjY2VzcyAsIG5lZ2F0aXZlIC1mYWlsCisgKi8KK2ludCBobnNfZHNhZl9yb2NlX3Jlc2V0KHN0cnVjdCBmd25vZGVfaGFuZGxlICpkc2FmX2Z3bm9kZSwgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IGRzYWZfZGV2aWNlICpkc2FmX2RldjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXUzMiBtcDsKKwl1MzIgc2w7CisJdTMyIGNyZWRpdDsKKwlpbnQgaTsKKwljb25zdCB1MzIgcG9ydF9tYXBbRFNBRl9ST0NFX0NSRURJVF9DSE5dW0RTQUZfUk9DRV9DSEFOX01PREVfTlVNXSA9IHsKKwkJe0RTQUZfUk9DRV9QT1JUXzAsIERTQUZfUk9DRV9QT1JUXzAsIERTQUZfUk9DRV9QT1JUXzB9LAorCQl7RFNBRl9ST0NFX1BPUlRfMSwgRFNBRl9ST0NFX1BPUlRfMCwgRFNBRl9ST0NFX1BPUlRfMH0sCisJCXtEU0FGX1JPQ0VfUE9SVF8yLCBEU0FGX1JPQ0VfUE9SVF8xLCBEU0FGX1JPQ0VfUE9SVF8wfSwKKwkJe0RTQUZfUk9DRV9QT1JUXzMsIERTQUZfUk9DRV9QT1JUXzEsIERTQUZfUk9DRV9QT1JUXzB9LAorCQl7RFNBRl9ST0NFX1BPUlRfNCwgRFNBRl9ST0NFX1BPUlRfMiwgRFNBRl9ST0NFX1BPUlRfMX0sCisJCXtEU0FGX1JPQ0VfUE9SVF80LCBEU0FGX1JPQ0VfUE9SVF8yLCBEU0FGX1JPQ0VfUE9SVF8xfSwKKwkJe0RTQUZfUk9DRV9QT1JUXzUsIERTQUZfUk9DRV9QT1JUXzMsIERTQUZfUk9DRV9QT1JUXzF9LAorCQl7RFNBRl9ST0NFX1BPUlRfNSwgRFNBRl9ST0NFX1BPUlRfMywgRFNBRl9ST0NFX1BPUlRfMX0sCisJfTsKKwljb25zdCB1MzIgc2xfbWFwW0RTQUZfUk9DRV9DUkVESVRfQ0hOXVtEU0FGX1JPQ0VfQ0hBTl9NT0RFX05VTV0gPSB7CisJCXtEU0FGX1JPQ0VfU0xfMCwgRFNBRl9ST0NFX1NMXzAsIERTQUZfUk9DRV9TTF8wfSwKKwkJe0RTQUZfUk9DRV9TTF8wLCBEU0FGX1JPQ0VfU0xfMSwgRFNBRl9ST0NFX1NMXzF9LAorCQl7RFNBRl9ST0NFX1NMXzAsIERTQUZfUk9DRV9TTF8wLCBEU0FGX1JPQ0VfU0xfMn0sCisJCXtEU0FGX1JPQ0VfU0xfMCwgRFNBRl9ST0NFX1NMXzEsIERTQUZfUk9DRV9TTF8zfSwKKwkJe0RTQUZfUk9DRV9TTF8wLCBEU0FGX1JPQ0VfU0xfMCwgRFNBRl9ST0NFX1NMXzB9LAorCQl7RFNBRl9ST0NFX1NMXzEsIERTQUZfUk9DRV9TTF8xLCBEU0FGX1JPQ0VfU0xfMX0sCisJCXtEU0FGX1JPQ0VfU0xfMCwgRFNBRl9ST0NFX1NMXzAsIERTQUZfUk9DRV9TTF8yfSwKKwkJe0RTQUZfUk9DRV9TTF8xLCBEU0FGX1JPQ0VfU0xfMSwgRFNBRl9ST0NFX1NMXzN9LAorCX07CisKKwlpZiAoIWlzX29mX25vZGUoZHNhZl9md25vZGUpKSB7CisJCXByX2VycigiaGlzaV9kc2FmOiBPbmx5IHN1cHBvcnQgRFQgbm9kZSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGRldiA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUodG9fb2Zfbm9kZShkc2FmX2Z3bm9kZSkpOworCWRzYWZfZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCWlmIChBRV9JU19WRVIxKGRzYWZfZGV2LT5kc2FmX3ZlcikpIHsKKwkJZGV2X2Vycihkc2FmX2Rldi0+ZGV2LCAiJXMgdjEgY2hpcCBkb2Vzbid0IHN1cHBvcnQgUm9DRSFcbiIsCisJCQlkc2FmX2Rldi0+YWVfZGV2Lm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIWVuYWJsZSkgeworCQkvKiBSZXNldCByb2NlZS1jaGFubmVscyBpbiBkc2FmIGFuZCByb2NlZSAqLworCQlobnNfZHNhZl9zcnN0X2NobnMoZHNhZl9kZXYsIERTQUZfQ0hOU19NQVNLLCBmYWxzZSk7CisJCWhuc19kc2FmX3JvY2Vfc3JzdChkc2FmX2RldiwgZmFsc2UpOworCX0gZWxzZSB7CisJCS8qIENvbmZpZ3VyZSBkc2FmIHR4IHJvY2UgY29ycmVzcG9uZCB0byBwb3J0IG1hcCBhbmQgc2wgbWFwICovCisJCW1wID0gZHNhZl9yZWFkX2Rldihkc2FmX2RldiwgRFNBRl9ST0NFX1BPUlRfTUFQX1JFRyk7CisJCWZvciAoaSA9IDA7IGkgPCBEU0FGX1JPQ0VfQ1JFRElUX0NITjsgaSsrKQorCQkJZHNhZl9zZXRfZmllbGQobXAsIDcgPDwgaSAqIDMsIGkgKiAzLAorCQkJCSAgICAgICBwb3J0X21hcFtpXVtEU0FGX1JPQ0VfNlBPUlRfTU9ERV0pOworCQlkc2FmX3NldF9maWVsZChtcCwgMyA8PCBpICogMywgaSAqIDMsIDApOworCQlkc2FmX3dyaXRlX2Rldihkc2FmX2RldiwgRFNBRl9ST0NFX1BPUlRfTUFQX1JFRywgbXApOworCisJCXNsID0gZHNhZl9yZWFkX2Rldihkc2FmX2RldiwgRFNBRl9ST0NFX1NMX01BUF9SRUcpOworCQlmb3IgKGkgPSAwOyBpIDwgRFNBRl9ST0NFX0NSRURJVF9DSE47IGkrKykKKwkJCWRzYWZfc2V0X2ZpZWxkKHNsLCAzIDw8IGkgKiAyLCBpICogMiwKKwkJCQkgICAgICAgc2xfbWFwW2ldW0RTQUZfUk9DRV82UE9SVF9NT0RFXSk7CisJCWRzYWZfd3JpdGVfZGV2KGRzYWZfZGV2LCBEU0FGX1JPQ0VfU0xfTUFQX1JFRywgc2wpOworCisJCS8qIERlLXJlc2V0IHJvY2VlLWNoYW5uZWxzIGluIGRzYWYgYW5kIHJvY2VlICovCisJCWhuc19kc2FmX3Nyc3RfY2hucyhkc2FmX2RldiwgRFNBRl9DSE5TX01BU0ssIHRydWUpOworCQltc2xlZXAoU1JTVF9USU1FX0lOVEVSVkFMKTsKKwkJaG5zX2RzYWZfcm9jZV9zcnN0KGRzYWZfZGV2LCB0cnVlKTsKKworCQkvKiBFYW5ibGUgZHNhZiBjaGFubmVsIHJvY2VlIGNyZWRpdCAqLworCQljcmVkaXQgPSBkc2FmX3JlYWRfZGV2KGRzYWZfZGV2LCBEU0FGX1NCTV9ST0NFRV9DRkdfUkVHX1JFRyk7CisJCWRzYWZfc2V0X2JpdChjcmVkaXQsIERTQUZfU0JNX1JPQ0VFX0NGR19DUkRfRU5fQiwgMCk7CisJCWRzYWZfd3JpdGVfZGV2KGRzYWZfZGV2LCBEU0FGX1NCTV9ST0NFRV9DRkdfUkVHX1JFRywgY3JlZGl0KTsKKworCQlkc2FmX3NldF9iaXQoY3JlZGl0LCBEU0FGX1NCTV9ST0NFRV9DRkdfQ1JEX0VOX0IsIDEpOworCQlkc2FmX3dyaXRlX2Rldihkc2FmX2RldiwgRFNBRl9TQk1fUk9DRUVfQ0ZHX1JFR19SRUcsIGNyZWRpdCk7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChobnNfZHNhZl9yb2NlX3Jlc2V0KTsKKwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiSHVhd2VpIFRlY2guIENvLiwgTHRkLiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJITlMgRFNBRiBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfbWFpbi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9tYWluLmgKaW5kZXggMWRhZjAxOC4uZjM2ODFkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9tYWluLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9tYWluLmgKQEAgLTQzLDYgKzQzLDMyIEBACiAjZGVmaW5lIERTQUZfUFJJT19OUgk4CiAjZGVmaW5lIERTQUZfUkVHX1BFUl9aT05FCTMKIAorI2RlZmluZSBEU0FGX1JPQ0VfQ1JFRElUX0NITgk4CisjZGVmaW5lIERTQUZfUk9DRV9DSEFOX01PREUJMworCitlbnVtIGRzYWZfcm9jZV9wb3J0X21vZGUgeworCURTQUZfUk9DRV82UE9SVF9NT0RFLAorCURTQUZfUk9DRV80UE9SVF9NT0RFLAorCURTQUZfUk9DRV8yUE9SVF9NT0RFLAorCURTQUZfUk9DRV9DSEFOX01PREVfTlVNLAorfTsKKworZW51bSBkc2FmX3JvY2VfcG9ydF9udW0geworCURTQUZfUk9DRV9QT1JUXzAsCisJRFNBRl9ST0NFX1BPUlRfMSwKKwlEU0FGX1JPQ0VfUE9SVF8yLAorCURTQUZfUk9DRV9QT1JUXzMsCisJRFNBRl9ST0NFX1BPUlRfNCwKKwlEU0FGX1JPQ0VfUE9SVF81LAorfTsKKworZW51bSBkc2FmX3JvY2VfcW9zX3NsIHsKKwlEU0FGX1JPQ0VfU0xfMCwKKwlEU0FGX1JPQ0VfU0xfMSwKKwlEU0FGX1JPQ0VfU0xfMiwKKwlEU0FGX1JPQ0VfU0xfMywKK307CisKICNkZWZpbmUgRFNBRl9TVEFUU19SRUFEKHAsIG9mZnNldCkgKCooKHU2NCAqKSgodTggKikocCkgKyAob2Zmc2V0KSkpKQogI2RlZmluZSBITlNfRFNBRl9JU19ERUJVRyhkZXYpIChkZXYtPmRzYWZfbW9kZSA9PSBEU0FGX01PREVfRElTQUJMRV9TUCkKIApAQCAtNDE5LDYgKzQ0NSwxMCBAQAogCiB2b2lkIGhuc19kc2FmX2ZpeF9tYWNfbW9kZShzdHJ1Y3QgaG5zX21hY19jYiAqbWFjX2NiKTsKIAordm9pZCBobnNfZHNhZl9zcnN0X2NobnMoc3RydWN0IGRzYWZfZGV2aWNlICpkc2FmX2RldiwgdTMyIG1zaywgYm9vbCBlbmFibGUpOworCit2b2lkIGhuc19kc2FmX3JvY2Vfc3JzdChzdHJ1Y3QgZHNhZl9kZXZpY2UgKmRzYWZfZGV2LCBib29sIGVuYWJsZSk7CisKIGludCBobnNfZHNhZl9hZV9pbml0KHN0cnVjdCBkc2FmX2RldmljZSAqZHNhZl9kZXYpOwogdm9pZCBobnNfZHNhZl9hZV91bmluaXQoc3RydWN0IGRzYWZfZGV2aWNlICpkc2FmX2Rldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfbWlzYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9taXNjLmMKaW5kZXggNjExYjY3Yi4uMzZiOWY3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9taXNjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9taXNjLmMKQEAgLTIzMSw2ICsyMzEsNDIgQEAKIAlkc2FmX3dyaXRlX3N1Yihkc2FmX2RldiwgcmVnX2FkZHIsIHJlZ192YWwpOwogfQogCisvKioKKyAqIGhuc19kc2FmX3Nyc3RfY2hucyAtIHJlc2V0IGRzYWYgY2hhbm5lbHMKKyAqIEBkc2FmX2RldjogZHNhZiBkZXZpY2Ugc3RydWN0IHBvaW50ZXIKKyAqIEBtc2s6IHhiYXIgY2hhbm5lbHMgbWFzayB2YWx1ZToKKyAqIGJpdDAtNSBmb3IgeGdlMC01CisgKiBiaXQ2LTExIGZvciBwcGUwLTUKKyAqIGJpdDEyLTE3IGZvciByb2NlMC01CisgKiBiaXQxOC0xOSBmb3IgY29tL2RmeAorICogQGVuYWJsZTogZmFsc2UgLSByZXF1ZXN0IHJlc2V0ICwgdHJ1ZSAtIGRyb3AgcmVzZXQKKyAqLwordm9pZCBobnNfZHNhZl9zcnN0X2NobnMoc3RydWN0IGRzYWZfZGV2aWNlICpkc2FmX2RldiwgdTMyIG1zaywgYm9vbCBlbmFibGUpCit7CisJdTMyIHJlZ19hZGRyOworCisJaWYgKCFlbmFibGUpCisJCXJlZ19hZGRyID0gRFNBRl9TVUJfU0NfRFNBRl9SRVNFVF9SRVFfUkVHOworCWVsc2UKKwkJcmVnX2FkZHIgPSBEU0FGX1NVQl9TQ19EU0FGX1JFU0VUX0RSRVFfUkVHOworCisJZHNhZl93cml0ZV9zdWIoZHNhZl9kZXYsIHJlZ19hZGRyLCBtc2spOworfQorCit2b2lkIGhuc19kc2FmX3JvY2Vfc3JzdChzdHJ1Y3QgZHNhZl9kZXZpY2UgKmRzYWZfZGV2LCBib29sIGVuYWJsZSkKK3sKKwlpZiAoIWVuYWJsZSkgeworCQlkc2FmX3dyaXRlX3N1Yihkc2FmX2RldiwgRFNBRl9TVUJfU0NfUk9DRUVfUkVTRVRfUkVRX1JFRywgMSk7CisJfSBlbHNlIHsKKwkJZHNhZl93cml0ZV9zdWIoZHNhZl9kZXYsCisJCQkgICAgICAgRFNBRl9TVUJfU0NfUk9DRUVfQ0xLX0RJU19SRUcsIDEpOworCQlkc2FmX3dyaXRlX3N1Yihkc2FmX2RldiwKKwkJCSAgICAgICBEU0FGX1NVQl9TQ19ST0NFRV9SRVNFVF9EUkVRX1JFRywgMSk7CisJCW1zbGVlcCgyMCk7CisJCWRzYWZfd3JpdGVfc3ViKGRzYWZfZGV2LCBEU0FGX1NVQl9TQ19ST0NFRV9DTEtfRU5fUkVHLCAxKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkCiBobnNfZHNhZl94Z2VfY29yZV9zcnN0X2J5X3BvcnRfYWNwaShzdHJ1Y3QgZHNhZl9kZXZpY2UgKmRzYWZfZGV2LAogCQkJCSAgICB1MzIgcG9ydCwgYm9vbCBkZXJlc2V0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9wcGUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfcHBlLmMKaW5kZXggZmY4YjZhNC4uNmVhODcyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9wcGUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX3BwZS5jCkBAIC0zMjgsOSArMzI4LDEwIEBACiBzdGF0aWMgdm9pZCBobnNfcHBlX3VuaW5pdF9odyhzdHJ1Y3QgaG5zX3BwZV9jYiAqcHBlX2NiKQogewogCXUzMiBwb3J0OwotCXN0cnVjdCBkc2FmX2RldmljZSAqZHNhZl9kZXYgPSBwcGVfY2ItPnBwZV9jb21tb25fY2ItPmRzYWZfZGV2OwogCiAJaWYgKHBwZV9jYi0+cHBlX2NvbW1vbl9jYikgeworCQlzdHJ1Y3QgZHNhZl9kZXZpY2UgKmRzYWZfZGV2ID0gcHBlX2NiLT5wcGVfY29tbW9uX2NiLT5kc2FmX2RldjsKKwogCQlwb3J0ID0gcHBlX2NiLT5pbmRleDsKIAkJZHNhZl9kZXYtPm1pc2Nfb3AtPnBwZV9zcnN0KGRzYWZfZGV2LCBwb3J0LCAwKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX3JlZy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9yZWcuaAppbmRleCAyMzVmNzQ0Li4xM2MxNmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfcmVnLmgKQEAgLTc3LDYgKzc3LDEyIEBACiAjZGVmaW5lIERTQUZfU1VCX1NDX1BQRV9SRVNFVF9EUkVRX1JFRwkJCTB4QTRDCiAjZGVmaW5lIERTQUZfU1VCX1NDX1JDQl9QUEVfQ09NX1JFU0VUX1JFUV9SRUcJCTB4QTg4CiAjZGVmaW5lIERTQUZfU1VCX1NDX1JDQl9QUEVfQ09NX1JFU0VUX0RSRVFfUkVHCQkweEE4QworI2RlZmluZSBEU0FGX1NVQl9TQ19EU0FGX1JFU0VUX1JFUV9SRUcJCQkweEFBOAorI2RlZmluZSBEU0FGX1NVQl9TQ19ST0NFRV9SRVNFVF9SRVFfUkVHCQkJMHhBNTAKKyNkZWZpbmUgRFNBRl9TVUJfU0NfRFNBRl9SRVNFVF9EUkVRX1JFRwkJCTB4QUFDCisjZGVmaW5lIERTQUZfU1VCX1NDX1JPQ0VFX0NMS19ESVNfUkVHCQkJMHgzMkMKKyNkZWZpbmUgRFNBRl9TVUJfU0NfUk9DRUVfUkVTRVRfRFJFUV9SRUcJCTB4QTU0CisjZGVmaW5lIERTQUZfU1VCX1NDX1JPQ0VFX0NMS19FTl9SRUcJCQkweDMyOAogI2RlZmluZSBEU0FGX1NVQl9TQ19MSUdIVF9NT0RVTEVfREVURUNUX0VOX1JFRwkJMHgyMDYwCiAjZGVmaW5lIERTQUZfU1VCX1NDX1RDQU1fTUJJU1RfRU5fUkVHCQkJMHgyMzAwCiAjZGVmaW5lIERTQUZfU1VCX1NDX0RTQUZfQ0xLX1NUX1JFRwkJCTB4NTMwMApAQCAtMTMzLDYgKzEzOSw4IEBACiAjZGVmaW5lIERTQUZfUk9DRUVfSU5UX1NUU18wX1JFRwkweDIwMAogI2RlZmluZSBEU0FGVjJfU0VSREVTX0xCS18wX1JFRyAgICAgICAgIDB4MjIwCiAjZGVmaW5lIERTQUZfUEFVU0VfQ0ZHX1JFRwkJMHgyNDAKKyNkZWZpbmUgRFNBRl9ST0NFX1BPUlRfTUFQX1JFRwkJMHgyQTAKKyNkZWZpbmUgRFNBRl9ST0NFX1NMX01BUF9SRUcJCTB4MkE0CiAjZGVmaW5lIERTQUZfUFBFX1FJRF9DRkdfMF9SRUcJCTB4MzAwCiAjZGVmaW5lIERTQUZfU1dfUE9SVF9UWVBFXzBfUkVHCQkweDMyMAogI2RlZmluZSBEU0FGX1NUUF9QT1JUX1RZUEVfMF9SRUcJMHgzNDAKQEAgLTE3OCw2ICsxODYsNyBAQAogI2RlZmluZSBEU0FGX1NCTV9CUF9DRkdfMl9YR0VfUkVHXzBfUkVHCQkweDIwMEMKICNkZWZpbmUgRFNBRl9TQk1fQlBfQ0ZHXzJfUFBFX1JFR18wX1JFRwkJMHgyMzBDCiAjZGVmaW5lIERTQUZfU0JNX0JQX0NGR18yX1JPQ0VFX1JFR18wX1JFRwkweDI2MEMKKyNkZWZpbmUgRFNBRl9TQk1fUk9DRUVfQ0ZHX1JFR19SRUcJCTB4MjM4MAogI2RlZmluZSBEU0FGVjJfU0JNX0JQX0NGR18yX1JPQ0VFX1JFR18wX1JFRwkweDIzOEMKICNkZWZpbmUgRFNBRl9TQk1fRlJFRV9DTlRfMF8wX1JFRwkJMHgyMDEwCiAjZGVmaW5lIERTQUZfU0JNX0ZSRUVfQ05UXzFfMF9SRUcJCTB4MjAxNApAQCAtNzk2LDYgKzgwNSw5IEBACiAjZGVmaW5lIERTQUZWMl9TQk1fQ0ZHNF9SRVNFVF9CVUZfTlVNX05PX1BGQ19TIDkKICNkZWZpbmUgRFNBRlYyX1NCTV9DRkc0X1JFU0VUX0JVRl9OVU1fTk9fUEZDX00gKCgoMVVMTCA8PCA5KSAtIDEpIDw8IDkpCiAKKyNkZWZpbmUgRFNBRl9DSE5TX01BU0sJCQkweDNmMDAwCisjZGVmaW5lIERTQUZfU0JNX1JPQ0VFX0NGR19DUkRfRU5fQgkyCisjZGVmaW5lIFNSU1RfVElNRV9JTlRFUlZBTAkJMjAKICNkZWZpbmUgRFNBRlYyX1NCTV9DRkcyX1JPQ0VFX1NFVF9CVUZfTlVNX1MgMAogI2RlZmluZSBEU0FGVjJfU0JNX0NGRzJfUk9DRUVfU0VUX0JVRl9OVU1fTSAoKCgxVUxMIDw8IDgpIC0gMSkgPDwgMCkKICNkZWZpbmUgRFNBRlYyX1NCTV9DRkcyX1JPQ0VFX1JFU0VUX0JVRl9OVU1fUyA4CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19lbmV0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19lbmV0LmMKaW5kZXggZDdlMWY4Yy4uMDU5YWFlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZW5ldC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2VuZXQuYwpAQCAtOTk0LDEwICs5OTQsMTAgQEAKIAlzdHJ1Y3QgaG5hZV9oYW5kbGUgKmggPSBwcml2LT5hZV9oYW5kbGU7CiAJaW50IHN0YXRlID0gMTsKIAotCWlmIChwcml2LT5waHkpIHsKKwlpZiAobmRldi0+cGh5ZGV2KSB7CiAJCWgtPmRldi0+b3BzLT5hZGp1c3RfbGluayhoLCBuZGV2LT5waHlkZXYtPnNwZWVkLAogCQkJCQkgbmRldi0+cGh5ZGV2LT5kdXBsZXgpOwotCQlzdGF0ZSA9IHByaXYtPnBoeS0+bGluazsKKwkJc3RhdGUgPSBuZGV2LT5waHlkZXYtPmxpbms7CiAJfQogCXN0YXRlID0gc3RhdGUgJiYgaC0+ZGV2LT5vcHMtPmdldF9zdGF0dXMoaCk7CiAKQEAgLTEwMjIsNyArMTAyMiw2IEBACiAgKi8KIGludCBobnNfbmljX2luaXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaG5hZV9oYW5kbGUgKmgpCiB7Ci0Jc3RydWN0IGhuc19uaWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwogCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlfZGV2ID0gaC0+cGh5X2RldjsKIAlpbnQgcmV0OwogCkBAIC0xMDQ2LDggKzEwNDUsNiBAQAogCWlmIChoLT5waHlfaWYgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1hHTUlJKQogCQlwaHlfZGV2LT5hdXRvbmVnID0gZmFsc2U7CiAKLQlwcml2LT5waHkgPSBwaHlfZGV2OwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyMjQsOCArMTIyMSw4IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXRfc3RhcnRfZXJyOwogCi0JaWYgKHByaXYtPnBoeSkKLQkJcGh5X3N0YXJ0KHByaXYtPnBoeSk7CisJaWYgKG5kZXYtPnBoeWRldikKKwkJcGh5X3N0YXJ0KG5kZXYtPnBoeWRldik7CiAKIAljbGVhcl9iaXQoTklDX1NUQVRFX0RPV04sICZwcml2LT5zdGF0ZSk7CiAJKHZvaWQpbW9kX3RpbWVyKCZwcml2LT5zZXJ2aWNlX3RpbWVyLCBqaWZmaWVzICsgU0VSVklDRV9USU1FUl9IWik7CkBAIC0xMjU5LDggKzEyNTYsOCBAQAogCW5ldGlmX3R4X2Rpc2FibGUobmRldik7CiAJcHJpdi0+bGluayA9IDA7CiAKLQlpZiAocHJpdi0+cGh5KQotCQlwaHlfc3RvcChwcml2LT5waHkpOworCWlmIChuZGV2LT5waHlkZXYpCisJCXBoeV9zdG9wKG5kZXYtPnBoeWRldik7CiAKIAlvcHMgPSBwcml2LT5hZV9oYW5kbGUtPmRldi0+b3BzOwogCkBAIC0xMzU5LDggKzEzNTYsNyBAQAogc3RhdGljIGludCBobnNfbmljX2RvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLAogCQkJICAgIGludCBjbWQpCiB7Ci0Jc3RydWN0IGhuc19uaWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9kZXYgPSBwcml2LT5waHk7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9kZXYgPSBuZXRkZXYtPnBoeWRldjsKIAogCWlmICghbmV0aWZfcnVubmluZyhuZXRkZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIwMTcsOSArMjAxMyw4IEBACiAJCWhuc19uaWNfdW5pbml0X3JpbmdfZGF0YShwcml2KTsKIAlwcml2LT5yaW5nX2RhdGEgPSBOVUxMOwogCi0JaWYgKHByaXYtPnBoeSkKLQkJcGh5X2Rpc2Nvbm5lY3QocHJpdi0+cGh5KTsKLQlwcml2LT5waHkgPSBOVUxMOworCWlmIChuZGV2LT5waHlkZXYpCisJCXBoeV9kaXNjb25uZWN0KG5kZXYtPnBoeWRldik7CiAKIAlpZiAoIUlTX0VSUl9PUl9OVUxMKHByaXYtPmFlX2hhbmRsZSkpCiAJCWhuYWVfcHV0X2hhbmRsZShwcml2LT5hZV9oYW5kbGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZW5ldC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZW5ldC5oCmluZGV4IDQ0YmIzMDEuLjViNDEyZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2VuZXQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19lbmV0LmgKQEAgLTU5LDcgKzU5LDYgQEAKIAl1MzIgcG9ydF9pZDsKIAlpbnQgcGh5X21vZGU7CiAJaW50IHBoeV9sZWRfdmFsOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IGhuYWVfaGFuZGxlICphZV9oYW5kbGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19ldGh0b29sLmMKaW5kZXggYWIzMzQ4Ny4uNDdlNTliYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2V0aHRvb2wuYwpAQCAtNDgsOSArNDgsOSBAQAogCiAJaCA9IHByaXYtPmFlX2hhbmRsZTsKIAotCWlmIChwcml2LT5waHkpIHsKLQkJaWYgKCFnZW5waHlfcmVhZF9zdGF0dXMocHJpdi0+cGh5KSkKLQkJCWxpbmtfc3RhdCA9IHByaXYtPnBoeS0+bGluazsKKwlpZiAobmV0X2Rldi0+cGh5ZGV2KSB7CisJCWlmICghZ2VucGh5X3JlYWRfc3RhdHVzKG5ldF9kZXYtPnBoeWRldikpCisJCQlsaW5rX3N0YXQgPSBuZXRfZGV2LT5waHlkZXYtPmxpbms7CiAJCWVsc2UKIAkJCWxpbmtfc3RhdCA9IDA7CiAJfQpAQCAtNjQsMTUgKzY0LDE0IEBACiB9CiAKIHN0YXRpYyB2b2lkIGhuc19nZXRfbWRpeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAotCQkJICAgICAgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCisJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCWludCBtZGl4X2N0cmwsIG1kaXgsIHJldHZhbCwgaXNfcmVzb2x2ZWQ7Ci0Jc3RydWN0IGhuc19uaWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlfZGV2ID0gcHJpdi0+cGh5OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlfZGV2ID0gbmV0X2Rldi0+cGh5ZGV2OwogCiAJaWYgKCFwaHlfZGV2IHx8ICFwaHlfZGV2LT5tZGlvLmJ1cykgewotCQljbWQtPmV0aF90cF9tZGl4X2N0cmwgPSBFVEhfVFBfTURJX0lOVkFMSUQ7Ci0JCWNtZC0+ZXRoX3RwX21kaXggPSBFVEhfVFBfTURJX0lOVkFMSUQ7CisJCWNtZC0+YmFzZS5ldGhfdHBfbWRpeF9jdHJsID0gRVRIX1RQX01ESV9JTlZBTElEOworCQljbWQtPmJhc2UuZXRoX3RwX21kaXggPSBFVEhfVFBfTURJX0lOVkFMSUQ7CiAJCXJldHVybjsKIAl9CiAKQEAgLTg5LDM1ICs4OCwzNSBAQAogCiAJc3dpdGNoIChtZGl4X2N0cmwpIHsKIAljYXNlIDB4MDoKLQkJY21kLT5ldGhfdHBfbWRpeF9jdHJsID0gRVRIX1RQX01ESTsKKwkJY21kLT5iYXNlLmV0aF90cF9tZGl4X2N0cmwgPSBFVEhfVFBfTURJOwogCQlicmVhazsKIAljYXNlIDB4MToKLQkJY21kLT5ldGhfdHBfbWRpeF9jdHJsID0gRVRIX1RQX01ESV9YOworCQljbWQtPmJhc2UuZXRoX3RwX21kaXhfY3RybCA9IEVUSF9UUF9NRElfWDsKIAkJYnJlYWs7CiAJY2FzZSAweDM6Ci0JCWNtZC0+ZXRoX3RwX21kaXhfY3RybCA9IEVUSF9UUF9NRElfQVVUTzsKKwkJY21kLT5iYXNlLmV0aF90cF9tZGl4X2N0cmwgPSBFVEhfVFBfTURJX0FVVE87CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWNtZC0+ZXRoX3RwX21kaXhfY3RybCA9IEVUSF9UUF9NRElfSU5WQUxJRDsKKwkJY21kLT5iYXNlLmV0aF90cF9tZGl4X2N0cmwgPSBFVEhfVFBfTURJX0lOVkFMSUQ7CiAJCWJyZWFrOwogCX0KIAogCWlmICghaXNfcmVzb2x2ZWQpCi0JCWNtZC0+ZXRoX3RwX21kaXggPSBFVEhfVFBfTURJX0lOVkFMSUQ7CisJCWNtZC0+YmFzZS5ldGhfdHBfbWRpeCA9IEVUSF9UUF9NRElfSU5WQUxJRDsKIAllbHNlIGlmIChtZGl4KQotCQljbWQtPmV0aF90cF9tZGl4ID0gRVRIX1RQX01ESV9YOworCQljbWQtPmJhc2UuZXRoX3RwX21kaXggPSBFVEhfVFBfTURJX1g7CiAJZWxzZQotCQljbWQtPmV0aF90cF9tZGl4ID0gRVRIX1RQX01ESTsKKwkJY21kLT5iYXNlLmV0aF90cF9tZGl4ID0gRVRIX1RQX01ESTsKIH0KIAogLyoqCi0gKmhuc19uaWNfZ2V0X3NldHRpbmdzIC0gaW1wbGVtZW50IGV0aHRvb2wgZ2V0IHNldHRpbmdzCisgKmhuc19uaWNfZ2V0X2xpbmtfa3NldHRpbmdzIC0gaW1wbGVtZW50IGV0aHRvb2wgZ2V0IGxpbmsga3NldHRpbmdzCiAgKkBuZXRfZGV2OiBuZXRfZGV2aWNlCi0gKkBjbWQ6IGV0aHRvb2xfY21kCisgKkBjbWQ6IGV0aHRvb2xfbGlua19rc2V0dGluZ3MKICAqcmV0dWVuIDAgLSBzdWNjZXNzICwgbmVnYXRpdmUgLS1mYWlsCiAgKi8KLXN0YXRpYyBpbnQgaG5zX25pY19nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCi0JCQkJc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCitzdGF0aWMgaW50IGhuc19uaWNfZ2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAorCQkJCSAgICAgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJc3RydWN0IGhuc19uaWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCXN0cnVjdCBobmFlX2hhbmRsZSAqaDsKQEAgLTEyNSw2ICsxMjQsNyBAQAogCWludCByZXQ7CiAJdTggZHVwbGV4OwogCXUxNiBzcGVlZDsKKwl1MzIgc3VwcG9ydGVkLCBhZHZlcnRpc2luZzsKIAogCWlmICghcHJpdiB8fCAhcHJpdi0+YWVfaGFuZGxlKQogCQlyZXR1cm4gLUVTUkNIOwpAQCAtMTM5LDM4ICsxMzksNDMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyogV2hlbiB0aGVyZSBpcyBubyBwaHksIGF1dG9uZWcgaXMgb2ZmLiAqLwotCWNtZC0+YXV0b25lZyA9IGZhbHNlOwotCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsIHNwZWVkKTsKLQljbWQtPmR1cGxleCA9IGR1cGxleDsKKwlldGh0b29sX2NvbnZlcnRfbGlua19tb2RlX3RvX2xlZ2FjeV91MzIoJnN1cHBvcnRlZCwKKwkJCQkJCWNtZC0+bGlua19tb2Rlcy5zdXBwb3J0ZWQpOworCWV0aHRvb2xfY29udmVydF9saW5rX21vZGVfdG9fbGVnYWN5X3UzMigmYWR2ZXJ0aXNpbmcsCisJCQkJCQljbWQtPmxpbmtfbW9kZXMuYWR2ZXJ0aXNpbmcpOwogCi0JaWYgKHByaXYtPnBoeSkKLQkJKHZvaWQpcGh5X2V0aHRvb2xfZ3NldChwcml2LT5waHksIGNtZCk7CisJLyogV2hlbiB0aGVyZSBpcyBubyBwaHksIGF1dG9uZWcgaXMgb2ZmLiAqLworCWNtZC0+YmFzZS5hdXRvbmVnID0gZmFsc2U7CisJY21kLT5iYXNlLmNtZCA9IHNwZWVkOworCWNtZC0+YmFzZS5kdXBsZXggPSBkdXBsZXg7CisKKwlpZiAobmV0X2Rldi0+cGh5ZGV2KQorCQkodm9pZClwaHlfZXRodG9vbF9rc2V0dGluZ3NfZ2V0KG5ldF9kZXYtPnBoeWRldiwgY21kKTsKIAogCWxpbmtfc3RhdCA9IGhuc19uaWNfZ2V0X2xpbmsobmV0X2Rldik7CiAJaWYgKCFsaW5rX3N0YXQpIHsKLQkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgKHUzMilTUEVFRF9VTktOT1dOKTsKLQkJY21kLT5kdXBsZXggPSBEVVBMRVhfVU5LTk9XTjsKKwkJY21kLT5iYXNlLnNwZWVkID0gKHUzMilTUEVFRF9VTktOT1dOOworCQljbWQtPmJhc2UuZHVwbGV4ID0gRFVQTEVYX1VOS05PV047CiAJfQogCi0JaWYgKGNtZC0+YXV0b25lZykKLQkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0F1dG9uZWc7CisJaWYgKGNtZC0+YmFzZS5hdXRvbmVnKQorCQlhZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0F1dG9uZWc7CiAKLQljbWQtPnN1cHBvcnRlZCB8PSBoLT5pZl9zdXBwb3J0OworCXN1cHBvcnRlZCB8PSBoLT5pZl9zdXBwb3J0OwogCWlmIChoLT5waHlfaWYgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJKSB7Ci0JCWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9UUDsKLQkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsOworCQlzdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX1RQOworCQlhZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsOwogCX0gZWxzZSBpZiAoaC0+cGh5X2lmID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9YR01JSSkgewotCQljbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfRklCUkU7Ci0JCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDAwMGJhc2VLUl9GdWxsOworCQlzdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX0ZJQlJFOworCQlhZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMDAwYmFzZUtSX0Z1bGw7CiAJfQogCiAJc3dpdGNoIChoLT5tZWRpYV90eXBlKSB7CiAJY2FzZSBITkFFX01FRElBX1RZUEVfRklCRVI6Ci0JCWNtZC0+cG9ydCA9IFBPUlRfRklCUkU7CisJCWNtZC0+YmFzZS5wb3J0ID0gUE9SVF9GSUJSRTsKIAkJYnJlYWs7CiAJY2FzZSBITkFFX01FRElBX1RZUEVfQ09QUEVSOgotCQljbWQtPnBvcnQgPSBQT1JUX1RQOworCQljbWQtPmJhc2UucG9ydCA9IFBPUlRfVFA7CiAJCWJyZWFrOwogCWNhc2UgSE5BRV9NRURJQV9UWVBFX1VOS05PV046CiAJZGVmYXVsdDoKQEAgLTE3OCwyMyArMTgzLDI3IEBACiAJfQogCiAJaWYgKCEoQUVfSVNfVkVSMShwcml2LT5lbmV0X3ZlcikgJiYgaC0+cG9ydF90eXBlID09IEhOQUVfUE9SVF9ERUJVRykpCi0JCWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9QYXVzZTsKKwkJc3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9QYXVzZTsKIAotCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0VYVEVSTkFMOwotCWNtZC0+bWRpb19zdXBwb3J0ID0gKEVUSF9NRElPX1NVUFBPUlRTX0M0NSB8IEVUSF9NRElPX1NVUFBPUlRTX0MyMik7CisJZXRodG9vbF9jb252ZXJ0X2xlZ2FjeV91MzJfdG9fbGlua19tb2RlKGNtZC0+bGlua19tb2Rlcy5zdXBwb3J0ZWQsCisJCQkJCQlzdXBwb3J0ZWQpOworCWV0aHRvb2xfY29udmVydF9sZWdhY3lfdTMyX3RvX2xpbmtfbW9kZShjbWQtPmxpbmtfbW9kZXMuYWR2ZXJ0aXNpbmcsCisJCQkJCQlhZHZlcnRpc2luZyk7CisKKwljbWQtPmJhc2UubWRpb19zdXBwb3J0ID0gRVRIX01ESU9fU1VQUE9SVFNfQzQ1IHwgRVRIX01ESU9fU1VQUE9SVFNfQzIyOwogCWhuc19nZXRfbWRpeF9tb2RlKG5ldF9kZXYsIGNtZCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKmhuc19uaWNfc2V0X3NldHRpbmdzIC0gaW1wbGVtZW50IGV0aHRvb2wgc2V0IHNldHRpbmdzCisgKmhuc19uaWNfc2V0X2xpbmtfc2V0dGluZ3MgLSBpbXBsZW1lbnQgZXRodG9vbCBzZXQgbGluayBrc2V0dGluZ3MKICAqQG5ldF9kZXY6IG5ldF9kZXZpY2UKLSAqQGNtZDogZXRodG9vbF9jbWQKKyAqQGNtZDogZXRodG9vbF9saW5rX2tzZXR0aW5ncwogICpyZXR1ZW4gMCAtIHN1Y2Nlc3MgLCBuZWdhdGl2ZSAtLWZhaWwKICAqLwotc3RhdGljIGludCBobnNfbmljX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKLQkJCQlzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgaG5zX25pY19zZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAlzdHJ1Y3QgaG5zX25pY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAJc3RydWN0IGhuYWVfaGFuZGxlICpoOwpAQCAtMjA4LDI0ICsyMTcsMjUgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAloID0gcHJpdi0+YWVfaGFuZGxlOwotCXNwZWVkID0gZXRodG9vbF9jbWRfc3BlZWQoY21kKTsKKwlzcGVlZCA9IGNtZC0+YmFzZS5zcGVlZDsKIAogCWlmIChoLT5waHlfaWYgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1hHTUlJKSB7Ci0JCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUgfHwgc3BlZWQgIT0gU1BFRURfMTAwMDAgfHwKLQkJICAgIGNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKQorCQlpZiAoY21kLT5iYXNlLmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUgfHwKKwkJICAgIHNwZWVkICE9IFNQRUVEXzEwMDAwIHx8CisJCSAgICBjbWQtPmJhc2UuZHVwbGV4ICE9IERVUExFWF9GVUxMKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIGlmIChoLT5waHlfaWYgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJKSB7Ci0JCWlmICghcHJpdi0+cGh5ICYmIGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkKKwkJaWYgKCFuZXRfZGV2LT5waHlkZXYgJiYgY21kLT5iYXNlLmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlpZiAoc3BlZWQgPT0gU1BFRURfMTAwMCAmJiBjbWQtPmR1cGxleCA9PSBEVVBMRVhfSEFMRikKKwkJaWYgKHNwZWVkID09IFNQRUVEXzEwMDAgJiYgY21kLT5iYXNlLmR1cGxleCA9PSBEVVBMRVhfSEFMRikKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAocHJpdi0+cGh5KQotCQkJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocHJpdi0+cGh5LCBjbWQpOworCQlpZiAobmV0X2Rldi0+cGh5ZGV2KQorCQkJcmV0dXJuIHBoeV9ldGh0b29sX2tzZXR0aW5nc19zZXQobmV0X2Rldi0+cGh5ZGV2LCBjbWQpOwogCiAJCWlmICgoc3BlZWQgIT0gU1BFRURfMTAgJiYgc3BlZWQgIT0gU1BFRURfMTAwICYmCi0JCSAgICAgc3BlZWQgIT0gU1BFRURfMTAwMCkgfHwgKGNtZC0+ZHVwbGV4ICE9IERVUExFWF9IQUxGICYmCi0JCSAgICAgY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpKQorCQkgICAgIHNwZWVkICE9IFNQRUVEXzEwMDApIHx8IChjbWQtPmJhc2UuZHVwbGV4ICE9IERVUExFWF9IQUxGICYmCisJCSAgICAgY21kLT5iYXNlLmR1cGxleCAhPSBEVVBMRVhfRlVMTCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9IGVsc2UgewogCQluZXRkZXZfZXJyKG5ldF9kZXYsICJOb3Qgc3VwcG9ydGVkISIpOwpAQCAtMjMzLDcgKzI0Myw3IEBACiAJfQogCiAJaWYgKGgtPmRldi0+b3BzLT5hZGp1c3RfbGluaykgewotCQloLT5kZXYtPm9wcy0+YWRqdXN0X2xpbmsoaCwgKGludClzcGVlZCwgY21kLT5kdXBsZXgpOworCQloLT5kZXYtPm9wcy0+YWRqdXN0X2xpbmsoaCwgKGludClzcGVlZCwgY21kLT5iYXNlLmR1cGxleCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMzA1LDcgKzMxNSw3IEBACiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGhuc19uaWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlfZGV2ID0gcHJpdi0+cGh5OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlfZGV2ID0gbmRldi0+cGh5ZGV2OwogCXN0cnVjdCBobmFlX2hhbmRsZSAqaCA9IHByaXYtPmFlX2hhbmRsZTsKIAogCXN3aXRjaCAobG9vcCkgewpAQCAtOTEwLDcgKzkyMCw3IEBACiAJCW1lbWNweShidWZmLCBobnNfbmljX3Rlc3Rfc3Ryc1tNQUNfSU5URVJOQUxMT09QX1NFUkRFU10sCiAJCSAgICAgICBFVEhfR1NUUklOR19MRU4pOwogCQlidWZmICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJaWYgKChwcml2LT5waHkpICYmICghcHJpdi0+cGh5LT5pc19jNDUpKQorCQlpZiAoKG5ldGRldi0+cGh5ZGV2KSAmJiAoIW5ldGRldi0+cGh5ZGV2LT5pc19jNDUpKQogCQkJbWVtY3B5KGJ1ZmYsIGhuc19uaWNfdGVzdF9zdHJzW01BQ19JTlRFUk5BTExPT1BfUEhZXSwKIAkJCSAgICAgICBFVEhfR1NUUklOR19MRU4pOwogCkBAIC05OTYsNyArMTAwNiw3IEBACiAJCWlmIChwcml2LT5hZV9oYW5kbGUtPnBoeV9pZiA9PSBQSFlfSU5URVJGQUNFX01PREVfWEdNSUkpCiAJCQljbnQtLTsKIAotCQlpZiAoKCFwcml2LT5waHkpIHx8IChwcml2LT5waHktPmlzX2M0NSkpCisJCWlmICgoIW5ldGRldi0+cGh5ZGV2KSB8fCAobmV0ZGV2LT5waHlkZXYtPmlzX2M0NSkpCiAJCQljbnQtLTsKIAogCQlyZXR1cm4gY250OwpAQCAtMTAxNSw4ICsxMDI1LDcgQEAKIGludCBobnNfcGh5X2xlZF9zZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZhbHVlKQogewogCWludCByZXR2YWw7Ci0Jc3RydWN0IGhuc19uaWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9kZXYgPSBwcml2LT5waHk7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9kZXYgPSBuZXRkZXYtPnBoeWRldjsKIAogCXJldHZhbCA9IHBoeV93cml0ZShwaHlfZGV2LCBITlNfUEhZX1BBR0VfUkVHLCBITlNfUEhZX1BBR0VfTEVEKTsKIAlyZXR2YWwgfD0gcGh5X3dyaXRlKHBoeV9kZXYsIEhOU19MRURfRkNfUkVHLCB2YWx1ZSk7CkBAIC0xMDM5LDcgKzEwNDgsNyBAQAogewogCXN0cnVjdCBobnNfbmljX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBobmFlX2hhbmRsZSAqaCA9IHByaXYtPmFlX2hhbmRsZTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldiA9IHByaXYtPnBoeTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldiA9IG5ldGRldi0+cGh5ZGV2OwogCWludCByZXQ7CiAKIAlpZiAocGh5X2RldikKQEAgLTExNTksOCArMTE2OCw3IEBACiBzdGF0aWMgaW50IGhuc19uaWNfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBobnNfbmljX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHkgPSBwcml2LT5waHk7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeSA9IG5ldGRldi0+cGh5ZGV2OwogCiAJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgewogCQlpZiAocGh5KQpAQCAtMTI2NCwxMSArMTI3Miw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgaG5zX2V0aHRvb2xfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBobnNfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvID0gaG5zX25pY19nZXRfZHJ2aW5mbywKIAkuZ2V0X2xpbmsgID0gaG5zX25pY19nZXRfbGluaywKLQkuZ2V0X3NldHRpbmdzICA9IGhuc19uaWNfZ2V0X3NldHRpbmdzLAotCS5zZXRfc2V0dGluZ3MgID0gaG5zX25pY19zZXRfc2V0dGluZ3MsCiAJLmdldF9yaW5ncGFyYW0gPSBobnNfZ2V0X3JpbmdwYXJhbSwKIAkuZ2V0X3BhdXNlcGFyYW0gPSBobnNfZ2V0X3BhdXNlcGFyYW0sCiAJLnNldF9wYXVzZXBhcmFtID0gaG5zX3NldF9wYXVzZXBhcmFtLApAQCAtMTI4OCw2ICsxMjk0LDggQEAKIAkuZ2V0X3J4ZmggPSBobnNfZ2V0X3JzcywKIAkuc2V0X3J4ZmggPSBobnNfc2V0X3JzcywKIAkuZ2V0X3J4bmZjID0gaG5zX2dldF9yeG5mYywKKwkuZ2V0X2xpbmtfa3NldHRpbmdzICA9IGhuc19uaWNfZ2V0X2xpbmtfa3NldHRpbmdzLAorCS5zZXRfbGlua19rc2V0dGluZ3MgID0gaG5zX25pY19zZXRfbGlua19rc2V0dGluZ3MsCiB9OwogCiB2b2lkIGhuc19ldGh0b29sX3NldF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pODI1eHgvODI1OTYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2k4MjV4eC84MjU5Ni5jCmluZGV4IGJlZmI0YWMuLmNlMjM1YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2k4MjV4eC84MjU5Ni5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2k4MjV4eC84MjU5Ni5jCkBAIC04OSwxMCArODksMTAgQEAKICNkZWZpbmUgREVCKHgseSkJaWYgKGk1OTZfZGVidWcgJiAoeCkpIHkKIAogCi0jaWYgZGVmaW5lZChDT05GSUdfTVZNRTE2eF9ORVQpIHx8IGRlZmluZWQoQ09ORklHX01WTUUxNnhfTkVUX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19NVk1FMTZ4X05FVCkKICNkZWZpbmUgRU5BQkxFX01WTUUxNnhfTkVUCiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19CVk1FNjAwMF9ORVQpIHx8IGRlZmluZWQoQ09ORklHX0JWTUU2MDAwX05FVF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQlZNRTYwMDBfTkVUKQogI2RlZmluZSBFTkFCTEVfQlZNRTYwMDBfTkVUCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvY29yZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvY29yZS5jCmluZGV4IDRjOTc3MWQuLjhmMTM5MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL2NvcmUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZW1hYy9jb3JlLmMKQEAgLTk3Nyw3ICs5NzcsMzcgQEAKIAkJZGV2LT5tY2FzdF9wZW5kaW5nID0gMTsKIAkJcmV0dXJuOwogCX0KKworCW11dGV4X2xvY2soJmRldi0+bGlua19sb2NrKTsKIAlfX2VtYWNfc2V0X211bHRpY2FzdF9saXN0KGRldik7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpbmtfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgZW1hY19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKnNhKQoreworCXN0cnVjdCBlbWFjX2luc3RhbmNlICpkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBzYTsKKwlzdHJ1Y3QgZW1hY19yZWdzIF9faW9tZW0gKnAgPSBkZXYtPmVtYWNwOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCSAgICAgICByZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwltdXRleF9sb2NrKCZkZXYtPmxpbmtfbG9jayk7CisKKwltZW1jcHkobmRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIG5kZXYtPmFkZHJfbGVuKTsKKworCWVtYWNfcnhfZGlzYWJsZShkZXYpOworCWVtYWNfdHhfZGlzYWJsZShkZXYpOworCW91dF9iZTMyKCZwLT5pYWhyLCAobmRldi0+ZGV2X2FkZHJbMF0gPDwgOCkgfCBuZGV2LT5kZXZfYWRkclsxXSk7CisJb3V0X2JlMzIoJnAtPmlhbHIsIChuZGV2LT5kZXZfYWRkclsyXSA8PCAyNCkgfAorCQkobmRldi0+ZGV2X2FkZHJbM10gPDwgMTYpIHwgKG5kZXYtPmRldl9hZGRyWzRdIDw8IDgpIHwKKwkJbmRldi0+ZGV2X2FkZHJbNV0pOworCWVtYWNfdHhfZW5hYmxlKGRldik7CisJZW1hY19yeF9lbmFibGUoZGV2KTsKKworCW11dGV4X3VubG9jaygmZGV2LT5saW5rX2xvY2spOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZW1hY19yZXNpemVfcnhfcmluZyhzdHJ1Y3QgZW1hY19pbnN0YW5jZSAqZGV2LCBpbnQgbmV3X210dSkKQEAgLTI2ODYsNyArMjcxNiw3IEBACiAJLm5kb19kb19pb2N0bAkJPSBlbWFjX2lvY3RsLAogCS5uZG9fdHhfdGltZW91dAkJPSBlbWFjX3R4X3RpbWVvdXQsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCi0JLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBlbWFjX3NldF9tYWNfYWRkcmVzcywKIAkubmRvX3N0YXJ0X3htaXQJCT0gZW1hY19zdGFydF94bWl0LAogCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKIH07CkBAIC0yNjk5LDcgKzI3MjksNyBAQAogCS5uZG9fZG9faW9jdGwJCT0gZW1hY19pb2N0bCwKIAkubmRvX3R4X3RpbWVvdXQJCT0gZW1hY190eF90aW1lb3V0LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAotCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZW1hY19zZXRfbWFjX2FkZHJlc3MsCiAJLm5kb19zdGFydF94bWl0CQk9IGVtYWNfc3RhcnRfeG1pdF9zZywKIAkubmRvX2NoYW5nZV9tdHUJCT0gZW1hY19jaGFuZ2VfbXR1LAogfTsKQEAgLTI3NTAsNyArMjc4MCw3IEBACiAJLyogR2V0IGludGVycnVwdHMuIEVNQUMgaXJxIGlzIG1hbmRhdG9yeSwgV09MIGlycSBpcyBvcHRpb25hbCAqLwogCWRldi0+ZW1hY19pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CiAJZGV2LT53b2xfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDEpOwotCWlmIChkZXYtPmVtYWNfaXJxID09IE5PX0lSUSkgeworCWlmICghZGV2LT5lbWFjX2lycSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBtYXAgbWFpbiBpbnRlcnJ1cHRcbiIsIG5wLT5mdWxsX25hbWUpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KQEAgLTI5MTMsOSArMjk0Myw5IEBACiAgZXJyX3JlZ191bm1hcDoKIAlpb3VubWFwKGRldi0+ZW1hY3ApOwogIGVycl9pcnFfdW5tYXA6Ci0JaWYgKGRldi0+d29sX2lycSAhPSBOT19JUlEpCisJaWYgKGRldi0+d29sX2lycSkKIAkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhkZXYtPndvbF9pcnEpOwotCWlmIChkZXYtPmVtYWNfaXJxICE9IE5PX0lSUSkKKwlpZiAoZGV2LT5lbWFjX2lycSkKIAkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhkZXYtPmVtYWNfaXJxKTsKICBlcnJfZnJlZToKIAlmcmVlX25ldGRldihuZGV2KTsKQEAgLTI5NTcsOSArMjk4Nyw5IEBACiAJZW1hY19kYmdfdW5yZWdpc3RlcihkZXYpOwogCWlvdW5tYXAoZGV2LT5lbWFjcCk7CiAKLQlpZiAoZGV2LT53b2xfaXJxICE9IE5PX0lSUSkKKwlpZiAoZGV2LT53b2xfaXJxKQogCQlpcnFfZGlzcG9zZV9tYXBwaW5nKGRldi0+d29sX2lycSk7Ci0JaWYgKGRldi0+ZW1hY19pcnEgIT0gTk9fSVJRKQorCWlmIChkZXYtPmVtYWNfaXJxKQogCQlpcnFfZGlzcG9zZV9tYXBwaW5nKGRldi0+ZW1hY19pcnEpOwogCiAJZnJlZV9uZXRkZXYoZGV2LT5uZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL21hbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvbWFsLmMKaW5kZXggZmRiNWNkYi4uYWFmNmZlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvbWFsLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvbWFsLmMKQEAgLTU5Nyw5ICs1OTcsOCBAQAogCQltYWwtPnJ4ZGVfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob2ZkZXYtPmRldi5vZl9ub2RlLCA0KTsKIAl9CiAKLQlpZiAobWFsLT50eGVvYl9pcnEgPT0gTk9fSVJRIHx8IG1hbC0+cnhlb2JfaXJxID09IE5PX0lSUSB8fAotCSAgICBtYWwtPnNlcnJfaXJxID09IE5PX0lSUSB8fCBtYWwtPnR4ZGVfaXJxID09IE5PX0lSUSB8fAotCSAgICBtYWwtPnJ4ZGVfaXJxID09IE5PX0lSUSkgeworCWlmICghbWFsLT50eGVvYl9pcnEgfHwgIW1hbC0+cnhlb2JfaXJxIHx8ICFtYWwtPnNlcnJfaXJxIHx8CisJICAgICFtYWwtPnR4ZGVfaXJxICB8fCAhbWFsLT5yeGRlX2lycSkgewogCQlwcmludGsoS0VSTl9FUlIKIAkJICAgICAgICJtYWwlZDogZmFpbGVkIHRvIG1hcCBpbnRlcnJ1cHRzICFcbiIsIGluZGV4KTsKIAkJZXJyID0gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12bmljLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdm5pYy5jCmluZGV4IDg4ZjNjODUuLmJmZTE3ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12bmljLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZuaWMuYwpAQCAtMjAzLDcgKzIwMyw4IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmFkYXB0ZXItPnZkZXYtPmRldjsKIAogCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgbHRiLT5zaXplLCBsdGItPmJ1ZmYsIGx0Yi0+YWRkcik7Ci0Jc2VuZF9yZXF1ZXN0X3VubWFwKGFkYXB0ZXIsIGx0Yi0+bWFwX2lkKTsKKwlpZiAoIWFkYXB0ZXItPmZhaWxvdmVyKQorCQlzZW5kX3JlcXVlc3RfdW5tYXAoYWRhcHRlciwgbHRiLT5tYXBfaWQpOwogfQogCiBzdGF0aWMgaW50IGFsbG9jX3J4X3Bvb2woc3RydWN0IGlibXZuaWNfYWRhcHRlciAqYWRhcHRlciwKQEAgLTUyMiw3ICs1MjMsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5yZXFfcnhfcXVldWVzOyBpKyspCiAJCW5hcGlfZGlzYWJsZSgmYWRhcHRlci0+bmFwaVtpXSk7CiAKLQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMobmV0ZGV2KTsKKwlpZiAoIWFkYXB0ZXItPmZhaWxvdmVyKQorCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMobmV0ZGV2KTsKIAogCWlmIChhZGFwdGVyLT5ib3VuY2VfYnVmZmVyKSB7CiAJCWlmICghZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBhZGFwdGVyLT5ib3VuY2VfYnVmZmVyX2RtYSkpIHsKQEAgLTE0MjIsNyArMTQyNCw3IEBACiAJCXNjcnEgPSBhZGFwdGVyLT50eF9zY3JxW2ldOwogCQlzY3JxLT5pcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgc2NycS0+aHdfaXJxKTsKIAotCQlpZiAoc2NycS0+aXJxID09IE5PX0lSUSkgeworCQlpZiAoIXNjcnEtPmlycSkgewogCQkJcmMgPSAtRUlOVkFMOwogCQkJZGV2X2VycihkZXYsICJFcnJvciBtYXBwaW5nIGlycVxuIik7CiAJCQlnb3RvIHJlcV90eF9pcnFfZmFpbGVkOwpAQCAtMTQ0Miw3ICsxNDQ0LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+cmVxX3J4X3F1ZXVlczsgaSsrKSB7CiAJCXNjcnEgPSBhZGFwdGVyLT5yeF9zY3JxW2ldOwogCQlzY3JxLT5pcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgc2NycS0+aHdfaXJxKTsKLQkJaWYgKHNjcnEtPmlycSA9PSBOT19JUlEpIHsKKwkJaWYgKCFzY3JxLT5pcnEpIHsKIAkJCXJjID0gLUVJTlZBTDsKIAkJCWRldl9lcnIoZGV2LCAiRXJyb3IgbWFwcGluZyBpcnFcbiIpOwogCQkJZ290byByZXFfcnhfaXJxX2ZhaWxlZDsKQEAgLTI3NzcsMTIgKzI3NzksNiBAQAogCX0KIH0KIAotc3RhdGljIGludCBpYm12bmljX2Z3X2NvbXBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3NpemVfdCB0cmFjZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBsZW4sCiAJCQkgIGxvZmZfdCAqcHBvcykKIHsKQEAgLTI4MzQsNyArMjgzMCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRyYWNlX29wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gaWJtdm5pY19md19jb21wX29wZW4sCisJLm9wZW4JCT0gc2ltcGxlX29wZW4sCiAJLnJlYWQJCT0gdHJhY2VfcmVhZCwKIH07CiAKQEAgLTI4ODQsNyArMjg4MCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBhdXNlZF9vcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGlibXZuaWNfZndfY29tcF9vcGVuLAorCS5vcGVuCQk9IHNpbXBsZV9vcGVuLAogCS5yZWFkCQk9IHBhdXNlZF9yZWFkLAogCS53cml0ZQkJPSBwYXVzZWRfd3JpdGUsCiB9OwpAQCAtMjkzMiw3ICsyOTI4LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJhY2luZ19vcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGlibXZuaWNfZndfY29tcF9vcGVuLAorCS5vcGVuCQk9IHNpbXBsZV9vcGVuLAogCS5yZWFkCQk9IHRyYWNpbmdfcmVhZCwKIAkud3JpdGUJCT0gdHJhY2luZ193cml0ZSwKIH07CkBAIC0yOTg1LDcgKzI5ODEsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlcnJvcl9sZXZlbF9vcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGlibXZuaWNfZndfY29tcF9vcGVuLAorCS5vcGVuCQk9IHNpbXBsZV9vcGVuLAogCS5yZWFkCQk9IGVycm9yX2xldmVsX3JlYWQsCiAJLndyaXRlCQk9IGVycm9yX2xldmVsX3dyaXRlLAogfTsKQEAgLTMwMzYsNyArMzAzMiw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRyYWNlX2xldmVsX29wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gaWJtdm5pY19md19jb21wX29wZW4sCisJLm9wZW4JCT0gc2ltcGxlX29wZW4sCiAJLnJlYWQJCT0gdHJhY2VfbGV2ZWxfcmVhZCwKIAkud3JpdGUJCT0gdHJhY2VfbGV2ZWxfd3JpdGUsCiB9OwpAQCAtMzA4OSw3ICszMDg1LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJhY2Vfc2l6ZV9vcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGlibXZuaWNfZndfY29tcF9vcGVuLAorCS5vcGVuCQk9IHNpbXBsZV9vcGVuLAogCS5yZWFkCQk9IHRyYWNlX2J1ZmZfc2l6ZV9yZWFkLAogCS53cml0ZQkJPSB0cmFjZV9idWZmX3NpemVfd3JpdGUsCiB9OwpAQCAtMzI4MCw2ICszMjc2LDEwIEBACiAJCQlyYyA9IGlibXZuaWNfc2VuZF9jcnFfaW5pdChhZGFwdGVyKTsKIAkJCWlmIChyYykKIAkJCQlkZXZfZXJyKGRldiwgIkVycm9yIHNlbmRpbmcgaW5pdCByYz0lbGRcbiIsIHJjKTsKKwkJfSBlbHNlIGlmIChnZW5fY3JxLT5jbWQgPT0gSUJNVk5JQ19ERVZJQ0VfRkFJTE9WRVIpIHsKKwkJCWRldl9pbmZvKGRldiwgIkJhY2tpbmcgZGV2aWNlIGZhaWxvdmVyIGRldGVjdGVkXG4iKTsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJCQlhZGFwdGVyLT5mYWlsb3ZlciA9IHRydWU7CiAJCX0gZWxzZSB7CiAJCQkvKiBUaGUgYWRhcHRlciBsb3N0IHRoZSBjb25uZWN0aW9uICovCiAJCQlkZXZfZXJyKGRldiwgIlZpcnR1YWwgQWRhcHRlciBmYWlsZWQgKHJjPSVkKVxuIiwKQEAgLTM2MTUsOCArMzYxNSwxOCBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhZGFwdGVyLT52ZGV2LT5kZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKDMwMDAwKTsKKwlib29sIHJlc3RhcnQgPSBmYWxzZTsKIAlpbnQgcmM7CiAKKwlpZiAoYWRhcHRlci0+ZmFpbG92ZXIpIHsKKwkJcmVsZWFzZV9zdWJfY3JxcyhhZGFwdGVyKTsKKwkJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQkJbmV0aWZfdHhfZGlzYWJsZShuZXRkZXYpOworCQkJaWJtdm5pY19jbG9zZShuZXRkZXYpOworCQkJcmVzdGFydCA9IHRydWU7CisJCX0KKwl9CisKIAlzZW5kX3ZlcnNpb25feGNoZyhhZGFwdGVyKTsKIAlyZWluaXRfY29tcGxldGlvbigmYWRhcHRlci0+aW5pdF9kb25lKTsKIAlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmYWRhcHRlci0+aW5pdF9kb25lLCB0aW1lb3V0KSkgewpAQCAtMzY0NSw2ICszNjU1LDE3IEBACiAKIAluZXRkZXYtPnJlYWxfbnVtX3R4X3F1ZXVlcyA9IGFkYXB0ZXItPnJlcV90eF9xdWV1ZXM7CiAKKwlpZiAoYWRhcHRlci0+ZmFpbG92ZXIpIHsKKwkJYWRhcHRlci0+ZmFpbG92ZXIgPSBmYWxzZTsKKwkJaWYgKHJlc3RhcnQpIHsKKwkJCXJjID0gaWJtdm5pY19vcGVuKG5ldGRldik7CisJCQlpZiAocmMpCisJCQkJZ290byByZXN0YXJ0X2ZhaWxlZDsKKwkJfQorCQluZXRpZl9jYXJyaWVyX29uKG5ldGRldik7CisJCXJldHVybjsKKwl9CisKIAlyYyA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOwogCWlmIChyYykgewogCQlkZXZfZXJyKGRldiwKQEAgLTM2NTUsNiArMzY3Niw4IEBACiAKIAlyZXR1cm47CiAKK3Jlc3RhcnRfZmFpbGVkOgorCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlc3RhcnQgaWJtdm5pYywgcmM9JWRcbiIsIHJjKTsKIHJlZ2lzdGVyX2ZhaWxlZDoKIAlyZWxlYXNlX3N1Yl9jcnFzKGFkYXB0ZXIpOwogdGFza19mYWlsZWQ6CkBAIC0zNjkyLDYgKzM3MTUsNyBAQAogCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIG5ldGRldik7CiAJYWRhcHRlci0+dmRldiA9IGRldjsKIAlhZGFwdGVyLT5uZXRkZXYgPSBuZXRkZXY7CisJYWRhcHRlci0+ZmFpbG92ZXIgPSBmYWxzZTsKIAogCWV0aGVyX2FkZHJfY29weShhZGFwdGVyLT5tYWNfYWRkciwgbWFjX2FkZHJfcCk7CiAJZXRoZXJfYWRkcl9jb3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkYXB0ZXItPm1hY19hZGRyKTsKQEAgLTM3MjEsNiArMzc0NSw3IEBACiAJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKCZkZXYtPmRldiwgYWRhcHRlci0+c3RhdHNfdG9rZW4pKSB7CiAJCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9DTU8pKQogCQkJZGV2X2VycigmZGV2LT5kZXYsICJDb3VsZG4ndCBtYXAgc3RhdHMgYnVmZmVyXG4iKTsKKwkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGZyZWVfY3JxOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZuaWMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12bmljLmgKaW5kZXggZTgyODk4Zi4uYmZjODRjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZuaWMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdm5pYy5oCkBAIC04MzAsNiArODMwLDcgQEAKIAlJQk1WTklDX0NSUV9JTklUICAgICAgICAgICAgICAgICA9IDB4MDEsCiAJSUJNVk5JQ19DUlFfSU5JVF9DT01QTEVURSAgICAgICAgPSAweDAyLAogCUlCTVZOSUNfUEFSVElUSU9OX01JR1JBVEVEICAgICAgID0gMHgwNiwKKwlJQk1WTklDX0RFVklDRV9GQUlMT1ZFUiAgICAgICAgICA9IDB4MDgsCiB9OwogCiBzdHJ1Y3QgaWJtdm5pY19jcnFfcXVldWUgewpAQCAtMTA0Nyw0ICsxMDQ4LDUgQEAKIAl1OCBtYXBfaWQ7CiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgdm5pY19jcnFfaW5pdDsKKwlib29sIGZhaWxvdmVyOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS84MjU3MS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlLzgyNTcxLmMKaW5kZXggN2ZkNGQ1NC4uNmIwM2M4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlLzgyNTcxLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlLzgyNTcxLmMKQEAgLTIwMzIsNyArMjAzMiw4IEBACiAJCQkJICB8IEZMQUcyX0RJU0FCTEVfQVNQTV9MMFMKIAkJCQkgIHwgRkxBRzJfRElTQUJMRV9BU1BNX0wxCiAJCQkJICB8IEZMQUcyX05PX0RJU0FCTEVfUlgKLQkJCQkgIHwgRkxBRzJfRE1BX0JVUlNULAorCQkJCSAgfCBGTEFHMl9ETUFfQlVSU1QKKwkJCQkgIHwgRkxBRzJfQ0hFQ0tfU1lTVElNX09WRVJGTE9XLAogCS5wYmEJCQk9IDMyLAogCS5tYXhfaHdfZnJhbWVfc2l6ZQk9IERFRkFVTFRfSlVNQk8sCiAJLmdldF92YXJpYW50cwkJPSBlMTAwMF9nZXRfdmFyaWFudHNfODI1NzEsCkBAIC0yMDUzLDcgKzIwNTQsOCBAQAogCQkJCSAgfCBGTEFHX0hBU19DVFJMRVhUX09OX0xPQUQsCiAJLmZsYWdzMgkJCT0gRkxBRzJfRElTQUJMRV9BU1BNX0wwUwogCQkJCSAgfCBGTEFHMl9ESVNBQkxFX0FTUE1fTDEKLQkJCQkgIHwgRkxBRzJfTk9fRElTQUJMRV9SWCwKKwkJCQkgIHwgRkxBRzJfTk9fRElTQUJMRV9SWAorCQkJCSAgfCBGTEFHMl9DSEVDS19TWVNUSU1fT1ZFUkZMT1csCiAJLnBiYQkJCT0gMzIsCiAJLm1heF9od19mcmFtZV9zaXplCT0gREVGQVVMVF9KVU1CTywKIAkuZ2V0X3ZhcmlhbnRzCQk9IGUxMDAwX2dldF92YXJpYW50c184MjU3MSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9lMTAwMC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2UxMDAwLmgKaW5kZXggZWY5NmNkMS4uODc5Y2NhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2UxMDAwLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2UxMDAwLmgKQEAgLTQ1Miw2ICs0NTIsNyBAQAogI2RlZmluZSBGTEFHMl9QQ0lNMlBDSV9BUkJJVEVSX1dBICAgICAgICAgQklUKDExKQogI2RlZmluZSBGTEFHMl9ERkxUX0NSQ19TVFJJUFBJTkcgICAgICAgICAgQklUKDEyKQogI2RlZmluZSBGTEFHMl9DSEVDS19SWF9IV1RTVEFNUCAgICAgICAgICAgQklUKDEzKQorI2RlZmluZSBGTEFHMl9DSEVDS19TWVNUSU1fT1ZFUkZMT1cgICAgICAgQklUKDE0KQogCiAjZGVmaW5lIEUxMDAwX1JYX0RFU0NfUFMoUiwgaSkJICAgIFwKIAkoJigoKHVuaW9uIGUxMDAwX3J4X2Rlc2NfcGFja2V0X3NwbGl0ICopKChSKS5kZXNjKSlbaV0pKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2ljaDhsYW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9pY2g4bGFuLmMKaW5kZXggM2UxMTMyMi4uZjNhYWNhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2ljaDhsYW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvaWNoOGxhbi5jCkBAIC01ODg1LDcgKzU4ODUsOCBAQAogCQkJCSAgfCBGTEFHX0hBU19KVU1CT19GUkFNRVMKIAkJCQkgIHwgRkxBR19BUE1FX0lOX1dVQywKIAkuZmxhZ3MyCQkJPSBGTEFHMl9IQVNfUEhZX1NUQVRTCi0JCQkJICB8IEZMQUcyX0hBU19FRUUsCisJCQkJICB8IEZMQUcyX0hBU19FRUUKKwkJCQkgIHwgRkxBRzJfQ0hFQ0tfU1lTVElNX09WRVJGTE9XLAogCS5wYmEJCQk9IDI2LAogCS5tYXhfaHdfZnJhbWVfc2l6ZQk9IDkwMjIsCiAJLmdldF92YXJpYW50cwkJPSBlMTAwMF9nZXRfdmFyaWFudHNfaWNoOGxhbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9uZXRkZXYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9uZXRkZXYuYwppbmRleCAwMmY0NDM5Li43MDE3MjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL25ldGRldi5jCkBAIC00MzAzLDYgKzQzMDMsNDIgQEAKIH0KIAogLyoqCisgKiBlMTAwMGVfc2FuaXRpemVfc3lzdGltIC0gc2FuaXRpemUgcmF3IGN5Y2xlIGNvdW50ZXIgcmVhZHMKKyAqIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKiBAc3lzdGltOiBjeWNsZV90IHZhbHVlIHJlYWQsIHNhbml0aXplZCBhbmQgcmV0dXJuZWQKKyAqCisgKiBFcnJhdGEgZm9yIDgyNTc0LzgyNTgzIHBvc3NpYmxlIGJhZCBiaXRzIHJlYWQgZnJvbSBTWVNUSU1IL0w6CisgKiBjaGVjayB0byBzZWUgdGhhdCB0aGUgdGltZSBpcyBpbmNyZW1lbnRpbmcgYXQgYSByZWFzb25hYmxlCisgKiByYXRlIGFuZCBpcyBhIG11bHRpcGxlIG9mIGluY3ZhbHVlLgorICoqLworc3RhdGljIGN5Y2xlX3QgZTEwMDBlX3Nhbml0aXplX3N5c3RpbShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBjeWNsZV90IHN5c3RpbSkKK3sKKwl1NjQgdGltZV9kZWx0YSwgcmVtLCB0ZW1wOworCWN5Y2xlX3Qgc3lzdGltX25leHQ7CisJdTMyIGluY3ZhbHVlOworCWludCBpOworCisJaW5jdmFsdWUgPSBlcjMyKFRJTUlOQ0EpICYgRTEwMDBfVElNSU5DQV9JTkNWQUxVRV9NQVNLOworCWZvciAoaSA9IDA7IGkgPCBFMTAwMF9NQVhfODI1NzRfU1lTVElNX1JFUkVBRFM7IGkrKykgeworCQkvKiBsYXRjaCBTWVNUSU1IIG9uIHJlYWQgb2YgU1lTVElNTCAqLworCQlzeXN0aW1fbmV4dCA9IChjeWNsZV90KWVyMzIoU1lTVElNTCk7CisJCXN5c3RpbV9uZXh0IHw9IChjeWNsZV90KWVyMzIoU1lTVElNSCkgPDwgMzI7CisKKwkJdGltZV9kZWx0YSA9IHN5c3RpbV9uZXh0IC0gc3lzdGltOworCQl0ZW1wID0gdGltZV9kZWx0YTsKKwkJLyogVk1XYXJlIHVzZXJzIGhhdmUgc2VlbiBpbmN2YWx1ZSBvZiB6ZXJvLCBkb24ndCBkaXYgLyAwICovCisJCXJlbSA9IGluY3ZhbHVlID8gZG9fZGl2KHRlbXAsIGluY3ZhbHVlKSA6ICh0aW1lX2RlbHRhICE9IDApOworCisJCXN5c3RpbSA9IHN5c3RpbV9uZXh0OworCisJCWlmICgodGltZV9kZWx0YSA8IEUxMDAwXzgyNTc0X1NZU1RJTV9FUFNJTE9OKSAmJiAocmVtID09IDApKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN5c3RpbTsKK30KKworLyoqCiAgKiBlMTAwMGVfY3ljbGVjb3VudGVyX3JlYWQgLSByZWFkIHJhdyBjeWNsZSBjb3VudGVyICh1c2VkIGJ5IHRpbWUgY291bnRlcikKICAqIEBjYzogY3ljbGVjb3VudGVyIHN0cnVjdHVyZQogICoqLwpAQCAtNDMxMiw3ICs0MzQ4LDcgQEAKIAkJCQkJCSAgICAgY2MpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJdTMyIHN5c3RpbWVsLCBzeXN0aW1laDsKLQljeWNsZV90IHN5c3RpbSwgc3lzdGltX25leHQ7CisJY3ljbGVfdCBzeXN0aW07CiAJLyogU1lTVElNSCBsYXRjaGluZyB1cG9uIFNZU1RJTUwgcmVhZCBkb2VzIG5vdCB3b3JrIHdlbGwuCiAJICogVGhpcyBtZWFucyB0aGF0IGlmIFNZU1RJTUwgb3ZlcmZsb3dzIGFmdGVyIHdlIHJlYWQgaXQgYnV0IGJlZm9yZQogCSAqIHdlIHJlYWQgU1lTVElNSCwgdGhlIHZhbHVlIG9mIFNZU1RJTUggaGFzIGJlZW4gaW5jcmVtZW50ZWQgYW5kIHdlCkBAIC00MzM1LDMzICs0MzcxLDkgQEAKIAlzeXN0aW0gPSAoY3ljbGVfdClzeXN0aW1lbDsKIAlzeXN0aW0gfD0gKGN5Y2xlX3Qpc3lzdGltZWggPDwgMzI7CiAKLQlpZiAoKGh3LT5tYWMudHlwZSA9PSBlMTAwMF84MjU3NCkgfHwgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF84MjU4MykpIHsKLQkJdTY0IHRpbWVfZGVsdGEsIHJlbSwgdGVtcDsKLQkJdTMyIGluY3ZhbHVlOwotCQlpbnQgaTsKKwlpZiAoYWRhcHRlci0+ZmxhZ3MyICYgRkxBRzJfQ0hFQ0tfU1lTVElNX09WRVJGTE9XKQorCQlzeXN0aW0gPSBlMTAwMGVfc2FuaXRpemVfc3lzdGltKGh3LCBzeXN0aW0pOwogCi0JCS8qIGVycmF0YSBmb3IgODI1NzQvODI1ODMgcG9zc2libGUgYmFkIGJpdHMgcmVhZCBmcm9tIFNZU1RJTUgvTAotCQkgKiBjaGVjayB0byBzZWUgdGhhdCB0aGUgdGltZSBpcyBpbmNyZW1lbnRpbmcgYXQgYSByZWFzb25hYmxlCi0JCSAqIHJhdGUgYW5kIGlzIGEgbXVsdGlwbGUgb2YgaW5jdmFsdWUKLQkJICovCi0JCWluY3ZhbHVlID0gZXIzMihUSU1JTkNBKSAmIEUxMDAwX1RJTUlOQ0FfSU5DVkFMVUVfTUFTSzsKLQkJZm9yIChpID0gMDsgaSA8IEUxMDAwX01BWF84MjU3NF9TWVNUSU1fUkVSRUFEUzsgaSsrKSB7Ci0JCQkvKiBsYXRjaCBTWVNUSU1IIG9uIHJlYWQgb2YgU1lTVElNTCAqLwotCQkJc3lzdGltX25leHQgPSAoY3ljbGVfdCllcjMyKFNZU1RJTUwpOwotCQkJc3lzdGltX25leHQgfD0gKGN5Y2xlX3QpZXIzMihTWVNUSU1IKSA8PCAzMjsKLQotCQkJdGltZV9kZWx0YSA9IHN5c3RpbV9uZXh0IC0gc3lzdGltOwotCQkJdGVtcCA9IHRpbWVfZGVsdGE7Ci0JCQkvKiBWTVdhcmUgdXNlcnMgaGF2ZSBzZWVuIGluY3ZhbHVlIG9mIHplcm8sIGRvbid0IGRpdiAvIDAgKi8KLQkJCXJlbSA9IGluY3ZhbHVlID8gZG9fZGl2KHRlbXAsIGluY3ZhbHVlKSA6ICh0aW1lX2RlbHRhICE9IDApOwotCi0JCQlzeXN0aW0gPSBzeXN0aW1fbmV4dDsKLQotCQkJaWYgKCh0aW1lX2RlbHRhIDwgRTEwMDBfODI1NzRfU1lTVElNX0VQU0lMT04pICYmCi0JCQkgICAgKHJlbSA9PSAwKSkKLQkJCQlicmVhazsKLQkJfQotCX0KIAlyZXR1cm4gc3lzdGltOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvcHRwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvcHRwLmMKaW5kZXggMmUxYjE3YS4uYWQwMzc2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL3B0cC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9wdHAuYwpAQCAtMzM0LDcgKzMzNCw3IEBACiAJaWYgKElTX0VSUihhZGFwdGVyLT5wdHBfY2xvY2spKSB7CiAJCWFkYXB0ZXItPnB0cF9jbG9jayA9IE5VTEw7CiAJCWVfZXJyKCJwdHBfY2xvY2tfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAoYWRhcHRlci0+cHRwX2Nsb2NrKSB7CiAJCWVfaW5mbygicmVnaXN0ZXJlZCBQSEMgY2xvY2tcbiIpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEway5oCmluZGV4IGM0Y2YwOGQuLjRkMTllNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGsuaApAQCAtMjQwLDkgKzI0MCw3IEBACiAJc3RydWN0IGZtMTBrX3ZmX2luZm8JdmZfaW5mb1swXTsKIH07CiAKLSNkZWZpbmUgZm0xMGtfdnhsYW5fcG9ydF9mb3JfZWFjaCh2cCwgaW50ZmMpIFwKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZwLCAmKGludGZjKS0+dnhsYW5fcG9ydCwgbGlzdCkKLXN0cnVjdCBmbTEwa192eGxhbl9wb3J0IHsKK3N0cnVjdCBmbTEwa191ZHBfcG9ydCB7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogCXNhX2ZhbWlseV90CQlzYV9mYW1pbHk7CiAJX19iZTE2CQkJcG9ydDsKQEAgLTMzNSw4ICszMzMsOSBAQAogCXUzMiByZXRhW0ZNMTBLX1JFVEFfU0laRV07CiAJdTMyIHJzc3JrW0ZNMTBLX1JTU1JLX1NJWkVdOwogCi0JLyogVlhMQU4gcG9ydCB0cmFja2luZyBpbmZvcm1hdGlvbiAqLworCS8qIFVEUCBlbmNhcHN1bGF0aW9uIHBvcnQgdHJhY2tpbmcgaW5mb3JtYXRpb24gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHZ4bGFuX3BvcnQ7CisJc3RydWN0IGxpc3RfaGVhZCBnZW5ldmVfcG9ydDsKIAogI2lmZGVmIENPTkZJR19ERUJVR19GUwogCXN0cnVjdCBkZW50cnkgKmRiZ19pbnRmYzsKQEAgLTQ1OCw3ICs0NTcsNyBAQAogbmV0ZGV2X3R4X3QgZm0xMGtfeG1pdF9mcmFtZV9yaW5nKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICBzdHJ1Y3QgZm0xMGtfcmluZyAqdHhfcmluZyk7CiB2b2lkIGZtMTBrX3R4X3RpbWVvdXRfcmVzZXQoc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2UpOwotdTY0IGZtMTBrX2dldF90eF9wZW5kaW5nKHN0cnVjdCBmbTEwa19yaW5nICpyaW5nKTsKK3U2NCBmbTEwa19nZXRfdHhfcGVuZGluZyhzdHJ1Y3QgZm0xMGtfcmluZyAqcmluZywgYm9vbCBpbl9zdyk7CiBib29sIGZtMTBrX2NoZWNrX3R4X2hhbmcoc3RydWN0IGZtMTBrX3JpbmcgKnR4X3JpbmcpOwogdm9pZCBmbTEwa19hbGxvY19yeF9idWZmZXJzKHN0cnVjdCBmbTEwa19yaW5nICpyeF9yaW5nLCB1MTYgY2xlYW5lZF9jb3VudCk7CiAKQEAgLTQ5Niw3ICs0OTUsNiBAQAogCiAvKiBFdGh0b29sICovCiB2b2lkIGZtMTBrX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXUzMiBmbTEwa19nZXRfcmV0YV9zaXplKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogdm9pZCBmbTEwa193cml0ZV9yZXRhKHN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlLCBjb25zdCB1MzIgKmluZGlyKTsKIAogLyogSU9WICovCkBAIC01MDksNyArNTA3LDcgQEAKIHMzMiBmbTEwa19pb3ZfdXBkYXRlX3B2aWQoc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2UsIHUxNiBnbG9ydCwgdTE2IHB2aWQpOwogaW50IGZtMTBrX25kb19zZXRfdmZfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2Zl9pZHgsIHU4ICptYWMpOwogaW50IGZtMTBrX25kb19zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJICBpbnQgdmZfaWR4LCB1MTYgdmlkLCB1OCBxb3MpOworCQkJICBpbnQgdmZfaWR4LCB1MTYgdmlkLCB1OCBxb3MsIF9fYmUxNiB2bGFuX3Byb3RvKTsKIGludCBmbTEwa19uZG9fc2V0X3ZmX2J3KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2Zl9pZHgsIGludCByYXRlLAogCQkJaW50IHVudXNlZCk7CiBpbnQgZm0xMGtfbmRvX2dldF92Zl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfY29tbW9uLmMKaW5kZXggZDZiYWFlYS4uZGQ5NWFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfY29tbW9uLmMKQEAgLTIwNyw2ICsyMDcsOSBAQAogCS8qIGNsZWFyIHR4X3JlYWR5IHRvIHByZXZlbnQgYW55IGZhbHNlIGhpdHMgZm9yIHJlc2V0ICovCiAJaHctPm1hYy50eF9yZWFkeSA9IGZhbHNlOwogCisJaWYgKEZNMTBLX1JFTU9WRUQoaHctPmh3X2FkZHIpKQorCQlyZXR1cm4gMDsKKwogCS8qIGNsZWFyIHRoZSBlbmFibGUgYml0IGZvciBhbGwgcmluZ3MgKi8KIAlmb3IgKGkgPSAwOyBpIDwgcV9jbnQ7IGkrKykgewogCQlyZWcgPSBmbTEwa19yZWFkX3JlZyhodywgRk0xMEtfVFhEQ1RMKGkpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfY29tbW9uLmgKaW5kZXggNTBmNzFlOS4uZDUxZjljNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfY29tbW9uLmgKQEAgLTM0LDcgKzM0LDcgQEAKIC8qIHdyaXRlIG9wZXJhdGlvbnMsIGluZGV4ZWQgdXNpbmcgRFdPUkRTICovCiAjZGVmaW5lIGZtMTBrX3dyaXRlX3JlZyhodywgcmVnLCB2YWwpIFwKIGRvIHsgXAotCXUzMiBfX2lvbWVtICpod19hZGRyID0gQUNDRVNTX09OQ0UoKGh3KS0+aHdfYWRkcik7IFwKKwl1MzIgX19pb21lbSAqaHdfYWRkciA9IFJFQURfT05DRSgoaHcpLT5od19hZGRyKTsgXAogCWlmICghRk0xMEtfUkVNT1ZFRChod19hZGRyKSkgXAogCQl3cml0ZWwoKHZhbCksICZod19hZGRyWyhyZWcpXSk7IFwKIH0gd2hpbGUgKDApCkBAIC00Miw3ICs0Miw3IEBACiAvKiBTd2l0Y2ggcmVnaXN0ZXIgd3JpdGUgb3BlcmF0aW9ucywgaW5kZXggdXNpbmcgRFdPUkRTICovCiAjZGVmaW5lIGZtMTBrX3dyaXRlX3N3X3JlZyhodywgcmVnLCB2YWwpIFwKIGRvIHsgXAotCXUzMiBfX2lvbWVtICpzd19hZGRyID0gQUNDRVNTX09OQ0UoKGh3KS0+c3dfYWRkcik7IFwKKwl1MzIgX19pb21lbSAqc3dfYWRkciA9IFJFQURfT05DRSgoaHcpLT5zd19hZGRyKTsgXAogCWlmICghRk0xMEtfUkVNT1ZFRChzd19hZGRyKSkgXAogCQl3cml0ZWwoKHZhbCksICZzd19hZGRyWyhyZWcpXSk7IFwKIH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19ldGh0b29sLmMKaW5kZXggYzA0Y2JlOS4uNTI0MWUwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2V0aHRvb2wuYwpAQCAtOTY2LDcgKzk2Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXUzMiBmbTEwa19nZXRfcmV0YV9zaXplKHN0cnVjdCBuZXRfZGV2aWNlIF9fYWx3YXlzX3VudXNlZCAqbmV0ZGV2KQorc3RhdGljIHUzMiBmbTEwa19nZXRfcmV0YV9zaXplKHN0cnVjdCBuZXRfZGV2aWNlIF9fYWx3YXlzX3VudXNlZCAqbmV0ZGV2KQogewogCXJldHVybiBGTTEwS19SRVRBX1NJWkUgKiBGTTEwS19SRVRBX0VOVFJJRVNfUEVSX1JFRzsKIH0KQEAgLTExODIsNiArMTE4Miw3IEBACiAJLnNldF9yeGZoCQk9IGZtMTBrX3NldF9yc3NoLAogCS5nZXRfY2hhbm5lbHMJCT0gZm0xMGtfZ2V0X2NoYW5uZWxzLAogCS5zZXRfY2hhbm5lbHMJCT0gZm0xMGtfc2V0X2NoYW5uZWxzLAorCS5nZXRfdHNfaW5mbwkJPSBldGh0b29sX29wX2dldF90c19pbmZvLAogfTsKIAogdm9pZCBmbTEwa19zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2lvdi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfaW92LmMKaW5kZXggNDdmMDc0My4uNWY0ZGFjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfaW92LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfaW92LmMKQEAgLTUxLDcgKzUxLDcgQEAKIAlpbnQgaTsKIAogCS8qIGlmIHRoZXJlIGlzIG5vIGlvdl9kYXRhIHRoZW4gdGhlcmUgaXMgbm8gbWFpbGJveCB0byBwcm9jZXNzICovCi0JaWYgKCFBQ0NFU1NfT05DRShpbnRlcmZhY2UtPmlvdl9kYXRhKSkKKwlpZiAoIVJFQURfT05DRShpbnRlcmZhY2UtPmlvdl9kYXRhKSkKIAkJcmV0dXJuIDA7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CkBAIC05OSw3ICs5OSw3IEBACiAJaW50IGk7CiAKIAkvKiBpZiB0aGVyZSBpcyBubyBpb3ZfZGF0YSB0aGVuIHRoZXJlIGlzIG5vIG1haWxib3ggdG8gcHJvY2VzcyAqLwotCWlmICghQUNDRVNTX09OQ0UoaW50ZXJmYWNlLT5pb3ZfZGF0YSkpCisJaWYgKCFSRUFEX09OQ0UoaW50ZXJmYWNlLT5pb3ZfZGF0YSkpCiAJCXJldHVybiAwOwogCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtNDQ1LDcgKzQ0NSw3IEBACiB9CiAKIGludCBmbTEwa19uZG9fc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmX2lkeCwgdTE2IHZpZCwKLQkJCSAgdTggcW9zKQorCQkJICB1OCBxb3MsIF9fYmUxNiB2bGFuX3Byb3RvKQogewogCXN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZm0xMGtfaW92X2RhdGEgKmlvdl9kYXRhID0gaW50ZXJmYWNlLT5pb3ZfZGF0YTsKQEAgLTQ2MCw2ICs0NjAsMTAgQEAKIAlpZiAocW9zIHx8ICh2aWQgPiAoVkxBTl9WSURfTUFTSyAtIDEpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKiBWRiBWTEFOIFByb3RvY29sIHBhcnQgdG8gZGVmYXVsdCBpcyB1bnN1cHBvcnRlZCAqLworCWlmICh2bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFRKSkKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisKIAl2Zl9pbmZvID0gJmlvdl9kYXRhLT52Zl9pbmZvW3ZmX2lkeF07CiAKIAkvKiBleGl0IGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX21haW4uYwppbmRleCBlOTc2N2I2Li41ZGU5Mzc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfbWFpbi5jCkBAIC01Niw3ICs1Niw4IEBACiAJcHJfaW5mbygiJXNcbiIsIGZtMTBrX2NvcHlyaWdodCk7CiAKIAkvKiBjcmVhdGUgZHJpdmVyIHdvcmtxdWV1ZSAqLwotCWZtMTBrX3dvcmtxdWV1ZSA9IGFsbG9jX3dvcmtxdWV1ZSgiZm0xMGsiLCBXUV9NRU1fUkVDTEFJTSwgMCk7CisJZm0xMGtfd29ya3F1ZXVlID0gYWxsb2Nfd29ya3F1ZXVlKCIlcyIsIFdRX01FTV9SRUNMQUlNLCAwLAorCQkJCQkgIGZtMTBrX2RyaXZlcl9uYW1lKTsKIAogCWZtMTBrX2RiZ19pbml0KCk7CiAKQEAgLTY1MSwxMSArNjUyLDExIEBACiBzdGF0aWMgc3RydWN0IGV0aGhkciAqZm0xMGtfcG9ydF9pc192eGxhbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlID0gbmV0ZGV2X3ByaXYoc2tiLT5kZXYpOwotCXN0cnVjdCBmbTEwa192eGxhbl9wb3J0ICp2eGxhbl9wb3J0OworCXN0cnVjdCBmbTEwa191ZHBfcG9ydCAqdnhsYW5fcG9ydDsKIAogCS8qIHdlIGNhbiBvbmx5IG9mZmxvYWQgYSB2eGxhbiBpZiB3ZSByZWNvZ25pemUgaXQgYXMgc3VjaCAqLwogCXZ4bGFuX3BvcnQgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmludGVyZmFjZS0+dnhsYW5fcG9ydCwKLQkJCQkJICAgICAgc3RydWN0IGZtMTBrX3Z4bGFuX3BvcnQsIGxpc3QpOworCQkJCQkgICAgICBzdHJ1Y3QgZm0xMGtfdWRwX3BvcnQsIGxpc3QpOwogCiAJaWYgKCF2eGxhbl9wb3J0KQogCQlyZXR1cm4gTlVMTDsKQEAgLTExMjgsMTMgKzExMjksMjQgQEAKIAlyZXR1cm4gcmluZy0+c3RhdHMucGFja2V0czsKIH0KIAotdTY0IGZtMTBrX2dldF90eF9wZW5kaW5nKHN0cnVjdCBmbTEwa19yaW5nICpyaW5nKQorLyoqCisgKiBmbTEwa19nZXRfdHhfcGVuZGluZyAtIGhvdyBtYW55IFR4IGRlc2NyaXB0b3JzIG5vdCBwcm9jZXNzZWQKKyAqIEByaW5nOiB0aGUgcmluZyBzdHJ1Y3R1cmUKKyAqIEBpbl9zdzogaXMgdHhfcGVuZGluZyBiZWluZyBjaGVja2VkIGluIFNXIG9yIGluIEhXPworICovCit1NjQgZm0xMGtfZ2V0X3R4X3BlbmRpbmcoc3RydWN0IGZtMTBrX3JpbmcgKnJpbmcsIGJvb2wgaW5fc3cpCiB7CiAJc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2UgPSByaW5nLT5xX3ZlY3Rvci0+aW50ZXJmYWNlOwogCXN0cnVjdCBmbTEwa19odyAqaHcgPSAmaW50ZXJmYWNlLT5odzsKKwl1MzIgaGVhZCwgdGFpbDsKIAotCXUzMiBoZWFkID0gZm0xMGtfcmVhZF9yZWcoaHcsIEZNMTBLX1RESChyaW5nLT5yZWdfaWR4KSk7Ci0JdTMyIHRhaWwgPSBmbTEwa19yZWFkX3JlZyhodywgRk0xMEtfVERUKHJpbmctPnJlZ19pZHgpKTsKKwlpZiAobGlrZWx5KGluX3N3KSkgeworCQloZWFkID0gcmluZy0+bmV4dF90b19jbGVhbjsKKwkJdGFpbCA9IHJpbmctPm5leHRfdG9fdXNlOworCX0gZWxzZSB7CisJCWhlYWQgPSBmbTEwa19yZWFkX3JlZyhodywgRk0xMEtfVERIKHJpbmctPnJlZ19pZHgpKTsKKwkJdGFpbCA9IGZtMTBrX3JlYWRfcmVnKGh3LCBGTTEwS19URFQocmluZy0+cmVnX2lkeCkpOworCX0KIAogCXJldHVybiAoKGhlYWQgPD0gdGFpbCkgPyB0YWlsIDogdGFpbCArIHJpbmctPmNvdW50KSAtIGhlYWQ7CiB9CkBAIC0xMTQzLDcgKzExNTUsNyBAQAogewogCXUzMiB0eF9kb25lID0gZm0xMGtfZ2V0X3R4X2NvbXBsZXRlZCh0eF9yaW5nKTsKIAl1MzIgdHhfZG9uZV9vbGQgPSB0eF9yaW5nLT50eF9zdGF0cy50eF9kb25lX29sZDsKLQl1MzIgdHhfcGVuZGluZyA9IGZtMTBrX2dldF90eF9wZW5kaW5nKHR4X3JpbmcpOworCXUzMiB0eF9wZW5kaW5nID0gZm0xMGtfZ2V0X3R4X3BlbmRpbmcodHhfcmluZywgdHJ1ZSk7CiAKIAljbGVhcl9jaGVja19mb3JfdHhfaGFuZyh0eF9yaW5nKTsKIApAQCAtMTM5Nyw3ICsxNDA5LDcgQEAKIAkgKiB0aGF0IHRoZSBjYWxjdWxhdGlvbiB3aWxsIG5ldmVyIGdldCBiZWxvdyBhIDEuIFRoZSBiaXQgc2hpZnQKIAkgKiBhY2NvdW50cyBmb3IgY2hhbmdlcyBpbiB0aGUgSVRSIGR1ZSB0byBQQ0llIGxpbmsgc3BlZWQuCiAJICovCi0JaXRyX3JvdW5kID0gQUNDRVNTX09OQ0UocmluZ19jb250YWluZXItPml0cl9zY2FsZSkgKyA4OworCWl0cl9yb3VuZCA9IFJFQURfT05DRShyaW5nX2NvbnRhaW5lci0+aXRyX3NjYWxlKSArIDg7CiAJYXZnX3dpcmVfc2l6ZSArPSBCSVQoaXRyX3JvdW5kKSAtIDE7CiAJYXZnX3dpcmVfc2l6ZSA+Pj0gaXRyX3JvdW5kOwogCkBAIC0xNDczLDcgKzE0ODUsNyBAQAogCS8qIHJlLWVuYWJsZSB0aGUgcV92ZWN0b3IgKi8KIAlmbTEwa19xdl9lbmFibGUocV92ZWN0b3IpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIG1pbih3b3JrX2RvbmUsIGJ1ZGdldCAtIDEpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX25ldGRldi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfbmV0ZGV2LmMKaW5kZXggMjBhNWJiZS4uMDU2MjkzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfbmV0ZGV2LmMKQEAgLTM4NCwxMjkgKzM4NCwxNzEgQEAKIH0KIAogLyoqCi0gKiBmbTEwa19kZWxfdnhsYW5fcG9ydF9hbGwKKyAqIGZtMTBrX2ZyZWVfdWRwX3BvcnRfaW5mbwogICogQGludGVyZmFjZTogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIHRoZSBlbnRpcmUgdnhsYW5fcG9ydCBsaXN0CisgKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIGJvdGggZ2VuZXZlX3BvcnQgYW5kIHZ4bGFuX3BvcnQgc3RydWN0dXJlcwogICoqLwotc3RhdGljIHZvaWQgZm0xMGtfZGVsX3Z4bGFuX3BvcnRfYWxsKHN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlKQorc3RhdGljIHZvaWQgZm0xMGtfZnJlZV91ZHBfcG9ydF9pbmZvKHN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlKQogewotCXN0cnVjdCBmbTEwa192eGxhbl9wb3J0ICp2eGxhbl9wb3J0OworCXN0cnVjdCBmbTEwa191ZHBfcG9ydCAqcG9ydDsKIAotCS8qIGZsdXNoIGFsbCBlbnRyaWVzIGZyb20gbGlzdCAqLwotCXZ4bGFuX3BvcnQgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmludGVyZmFjZS0+dnhsYW5fcG9ydCwKLQkJCQkJICAgICAgc3RydWN0IGZtMTBrX3Z4bGFuX3BvcnQsIGxpc3QpOwotCXdoaWxlICh2eGxhbl9wb3J0KSB7Ci0JCWxpc3RfZGVsKCZ2eGxhbl9wb3J0LT5saXN0KTsKLQkJa2ZyZWUodnhsYW5fcG9ydCk7Ci0JCXZ4bGFuX3BvcnQgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmludGVyZmFjZS0+dnhsYW5fcG9ydCwKLQkJCQkJCSAgICAgIHN0cnVjdCBmbTEwa192eGxhbl9wb3J0LAotCQkJCQkJICAgICAgbGlzdCk7CisJLyogZmx1c2ggYWxsIGVudHJpZXMgZnJvbSB2eGxhbiBsaXN0ICovCisJcG9ydCA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmaW50ZXJmYWNlLT52eGxhbl9wb3J0LAorCQkJCQlzdHJ1Y3QgZm0xMGtfdWRwX3BvcnQsIGxpc3QpOworCXdoaWxlIChwb3J0KSB7CisJCWxpc3RfZGVsKCZwb3J0LT5saXN0KTsKKwkJa2ZyZWUocG9ydCk7CisJCXBvcnQgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmludGVyZmFjZS0+dnhsYW5fcG9ydCwKKwkJCQkJCXN0cnVjdCBmbTEwa191ZHBfcG9ydCwKKwkJCQkJCWxpc3QpOworCX0KKworCS8qIGZsdXNoIGFsbCBlbnRyaWVzIGZyb20gZ2VuZXZlIGxpc3QgKi8KKwlwb3J0ID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZpbnRlcmZhY2UtPmdlbmV2ZV9wb3J0LAorCQkJCQlzdHJ1Y3QgZm0xMGtfdWRwX3BvcnQsIGxpc3QpOworCXdoaWxlIChwb3J0KSB7CisJCWxpc3RfZGVsKCZwb3J0LT5saXN0KTsKKwkJa2ZyZWUocG9ydCk7CisJCXBvcnQgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmludGVyZmFjZS0+dnhsYW5fcG9ydCwKKwkJCQkJCXN0cnVjdCBmbTEwa191ZHBfcG9ydCwKKwkJCQkJCWxpc3QpOwogCX0KIH0KIAogLyoqCi0gKiBmbTEwa19yZXN0b3JlX3Z4bGFuX3BvcnQKKyAqIGZtMTBrX3Jlc3RvcmVfdWRwX3BvcnRfaW5mbwogICogQGludGVyZmFjZTogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJlc3RvcmVzIHRoZSB2YWx1ZSBpbiB0aGUgdHVubmVsX2NmZyByZWdpc3RlciBhZnRlciByZXNldAorICogVGhpcyBmdW5jdGlvbiByZXN0b3JlcyB0aGUgdmFsdWUgaW4gdGhlIHR1bm5lbF9jZmcgcmVnaXN0ZXIocykgYWZ0ZXIgcmVzZXQKICAqKi8KLXN0YXRpYyB2b2lkIGZtMTBrX3Jlc3RvcmVfdnhsYW5fcG9ydChzdHJ1Y3QgZm0xMGtfaW50ZmMgKmludGVyZmFjZSkKK3N0YXRpYyB2b2lkIGZtMTBrX3Jlc3RvcmVfdWRwX3BvcnRfaW5mbyhzdHJ1Y3QgZm0xMGtfaW50ZmMgKmludGVyZmFjZSkKIHsKIAlzdHJ1Y3QgZm0xMGtfaHcgKmh3ID0gJmludGVyZmFjZS0+aHc7Ci0Jc3RydWN0IGZtMTBrX3Z4bGFuX3BvcnQgKnZ4bGFuX3BvcnQ7CisJc3RydWN0IGZtMTBrX3VkcF9wb3J0ICpwb3J0OwogCiAJLyogb25seSB0aGUgUEYgc3VwcG9ydHMgY29uZmlndXJpbmcgdHVubmVscyAqLwogCWlmIChody0+bWFjLnR5cGUgIT0gZm0xMGtfbWFjX3BmKQogCQlyZXR1cm47CiAKLQl2eGxhbl9wb3J0ID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZpbnRlcmZhY2UtPnZ4bGFuX3BvcnQsCi0JCQkJCSAgICAgIHN0cnVjdCBmbTEwa192eGxhbl9wb3J0LCBsaXN0KTsKKwlwb3J0ID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZpbnRlcmZhY2UtPnZ4bGFuX3BvcnQsCisJCQkJCXN0cnVjdCBmbTEwa191ZHBfcG9ydCwgbGlzdCk7CiAKIAkvKiByZXN0b3JlIHR1bm5lbCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCiAJZm0xMGtfd3JpdGVfcmVnKGh3LCBGTTEwS19UVU5ORUxfQ0ZHLAotCQkJKHZ4bGFuX3BvcnQgPyBudG9ocyh2eGxhbl9wb3J0LT5wb3J0KSA6IDApIHwKKwkJCShwb3J0ID8gbnRvaHMocG9ydC0+cG9ydCkgOiAwKSB8CiAJCQkoRVRIX1BfVEVCIDw8IEZNMTBLX1RVTk5FTF9DRkdfTlZHUkVfU0hJRlQpKTsKKworCXBvcnQgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmludGVyZmFjZS0+Z2VuZXZlX3BvcnQsCisJCQkJCXN0cnVjdCBmbTEwa191ZHBfcG9ydCwgbGlzdCk7CisKKwkvKiByZXN0b3JlIEdlbmV2ZSB0dW5uZWwgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCWZtMTBrX3dyaXRlX3JlZyhodywgRk0xMEtfVFVOTkVMX0NGR19HRU5FVkUsCisJCQkocG9ydCA/IG50b2hzKHBvcnQtPnBvcnQpIDogMCkpOworfQorCitzdGF0aWMgc3RydWN0IGZtMTBrX3VkcF9wb3J0ICoKK2ZtMTBrX3JlbW92ZV90dW5uZWxfcG9ydChzdHJ1Y3QgbGlzdF9oZWFkICpwb3J0cywKKwkJCSBzdHJ1Y3QgdWRwX3R1bm5lbF9pbmZvICp0aSkKK3sKKwlzdHJ1Y3QgZm0xMGtfdWRwX3BvcnQgKnBvcnQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsIHBvcnRzLCBsaXN0KSB7CisJCWlmICgocG9ydC0+cG9ydCA9PSB0aS0+cG9ydCkgJiYKKwkJICAgIChwb3J0LT5zYV9mYW1pbHkgPT0gdGktPnNhX2ZhbWlseSkpIHsKKwkJCWxpc3RfZGVsKCZwb3J0LT5saXN0KTsKKwkJCXJldHVybiBwb3J0OworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGZtMTBrX2luc2VydF90dW5uZWxfcG9ydChzdHJ1Y3QgbGlzdF9oZWFkICpwb3J0cywKKwkJCQkgICAgIHN0cnVjdCB1ZHBfdHVubmVsX2luZm8gKnRpKQoreworCXN0cnVjdCBmbTEwa191ZHBfcG9ydCAqcG9ydDsKKworCS8qIHJlbW92ZSBleGlzdGluZyBwb3J0IGVudHJ5IGZyb20gdGhlIGxpc3Qgc28gdGhhdCB0aGUgbmV3ZXN0IGl0ZW1zCisJICogYXJlIGFsd2F5cyBhdCB0aGUgdGFpbCBvZiB0aGUgbGlzdC4KKwkgKi8KKwlwb3J0ID0gZm0xMGtfcmVtb3ZlX3R1bm5lbF9wb3J0KHBvcnRzLCB0aSk7CisJaWYgKCFwb3J0KSB7CisJCXBvcnQgPSBrbWFsbG9jKHNpemVvZigqcG9ydCksIEdGUF9BVE9NSUMpOworCQlpZiAgKCFwb3J0KQorCQkJcmV0dXJuOworCQlwb3J0LT5wb3J0ID0gdGktPnBvcnQ7CisJCXBvcnQtPnNhX2ZhbWlseSA9IHRpLT5zYV9mYW1pbHk7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmcG9ydC0+bGlzdCwgcG9ydHMpOwogfQogCiAvKioKLSAqIGZtMTBrX2FkZF92eGxhbl9wb3J0CisgKiBmbTEwa191ZHBfdHVubmVsX2FkZAogICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQogICogQHRpOiBUdW5uZWwgZW5kcG9pbnQgaW5mb3JtYXRpb24KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgbmV3IFZYTEFOIGludGVyZmFjZSBoYXMgYWRkZWQgYSBuZXcgcG9ydAotICogbnVtYmVyIHRvIHRoZSByYW5nZSB0aGF0IGlzIGN1cnJlbnRseSBpbiB1c2UgZm9yIFZYTEFOLiAgVGhlIG5ldyBwb3J0Ci0gKiBudW1iZXIgaXMgYWx3YXlzIGFkZGVkIHRvIHRoZSB0YWlsIHNvIHRoYXQgdGhlIHBvcnQgbnVtYmVyIGxpc3Qgc2hvdWxkCi0gKiBtYXRjaCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHBvcnRzIHdlcmUgYWxsb2NhdGVkLiAgVGhlIGhlYWQgb2YgdGhlIGxpc3QKLSAqIGlzIGFsd2F5cyB1c2VkIGFzIHRoZSBWWExBTiBwb3J0IG51bWJlciBmb3Igb2ZmbG9hZHMuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgbmV3IFVEUCB0dW5uZWwgcG9ydCBoYXMgYmVlbiBhZGRlZC4KKyAqIER1ZSB0byBoYXJkd2FyZSByZXN0cmljdGlvbnMsIG9ubHkgb25lIHBvcnQgcGVyIHR5cGUgY2FuIGJlIG9mZmxvYWRlZCBhdAorICogb25jZS4KICAqKi8KLXN0YXRpYyB2b2lkIGZtMTBrX2FkZF92eGxhbl9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCitzdGF0aWMgdm9pZCBmbTEwa191ZHBfdHVubmVsX2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgdWRwX3R1bm5lbF9pbmZvICp0aSkKIHsKIAlzdHJ1Y3QgZm0xMGtfaW50ZmMgKmludGVyZmFjZSA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGZtMTBrX3Z4bGFuX3BvcnQgKnZ4bGFuX3BvcnQ7CiAKLQlpZiAodGktPnR5cGUgIT0gVURQX1RVTk5FTF9UWVBFX1ZYTEFOKQotCQlyZXR1cm47CiAJLyogb25seSB0aGUgUEYgc3VwcG9ydHMgY29uZmlndXJpbmcgdHVubmVscyAqLwogCWlmIChpbnRlcmZhY2UtPmh3Lm1hYy50eXBlICE9IGZtMTBrX21hY19wZikKIAkJcmV0dXJuOwogCi0JLyogZXhpc3RpbmcgcG9ydHMgYXJlIHB1bGxlZCBvdXQgc28gb3VyIG5ldyBlbnRyeSBpcyBhbHdheXMgbGFzdCAqLwotCWZtMTBrX3Z4bGFuX3BvcnRfZm9yX2VhY2godnhsYW5fcG9ydCwgaW50ZXJmYWNlKSB7Ci0JCWlmICgodnhsYW5fcG9ydC0+cG9ydCA9PSB0aS0+cG9ydCkgJiYKLQkJICAgICh2eGxhbl9wb3J0LT5zYV9mYW1pbHkgPT0gdGktPnNhX2ZhbWlseSkpIHsKLQkJCWxpc3RfZGVsKCZ2eGxhbl9wb3J0LT5saXN0KTsKLQkJCWdvdG8gaW5zZXJ0X3RhaWw7Ci0JCX0KKwlzd2l0Y2ggKHRpLT50eXBlKSB7CisJY2FzZSBVRFBfVFVOTkVMX1RZUEVfVlhMQU46CisJCWZtMTBrX2luc2VydF90dW5uZWxfcG9ydCgmaW50ZXJmYWNlLT52eGxhbl9wb3J0LCB0aSk7CisJCWJyZWFrOworCWNhc2UgVURQX1RVTk5FTF9UWVBFX0dFTkVWRToKKwkJZm0xMGtfaW5zZXJ0X3R1bm5lbF9wb3J0KCZpbnRlcmZhY2UtPmdlbmV2ZV9wb3J0LCB0aSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKIAl9CiAKLQkvKiBhbGxvY2F0ZSBtZW1vcnkgdG8gdHJhY2sgcG9ydHMgKi8KLQl2eGxhbl9wb3J0ID0ga21hbGxvYyhzaXplb2YoKnZ4bGFuX3BvcnQpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXZ4bGFuX3BvcnQpCi0JCXJldHVybjsKLQl2eGxhbl9wb3J0LT5wb3J0ID0gdGktPnBvcnQ7Ci0JdnhsYW5fcG9ydC0+c2FfZmFtaWx5ID0gdGktPnNhX2ZhbWlseTsKLQotaW5zZXJ0X3RhaWw6Ci0JLyogYWRkIG5ldyBwb3J0IHZhbHVlIHRvIGxpc3QgKi8KLQlsaXN0X2FkZF90YWlsKCZ2eGxhbl9wb3J0LT5saXN0LCAmaW50ZXJmYWNlLT52eGxhbl9wb3J0KTsKLQotCWZtMTBrX3Jlc3RvcmVfdnhsYW5fcG9ydChpbnRlcmZhY2UpOworCWZtMTBrX3Jlc3RvcmVfdWRwX3BvcnRfaW5mbyhpbnRlcmZhY2UpOwogfQogCiAvKioKLSAqIGZtMTBrX2RlbF92eGxhbl9wb3J0CisgKiBmbTEwa191ZHBfdHVubmVsX2RlbAogICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQogICogQHRpOiBUdW5uZWwgZW5kcG9pbnQgaW5mb3JtYXRpb24KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgbmV3IFZYTEFOIGludGVyZmFjZSBoYXMgZnJlZWQgYSBwb3J0Ci0gKiBudW1iZXIgZnJvbSB0aGUgcmFuZ2UgdGhhdCBpcyBjdXJyZW50bHkgaW4gdXNlIGZvciBWWExBTi4gIFRoZSBmcmVlZAotICogcG9ydCBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3QgYW5kIHRoZSBuZXcgaGVhZCBpcyB1c2VkIHRvIGRldGVybWluZQotICogdGhlIHBvcnQgbnVtYmVyIGZvciBvZmZsb2Fkcy4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBuZXcgVURQIHR1bm5lbCBwb3J0IGlzIGRlbGV0ZWQuIFRoZSBmcmVlZAorICogcG9ydCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCwgdGhlbiB3ZSByZXByb2dyYW0gdGhlIG9mZmxvYWRlZCBwb3J0CisgKiBiYXNlZCBvbiB0aGUgaGVhZCBvZiB0aGUgbGlzdC4KICAqKi8KLXN0YXRpYyB2b2lkIGZtMTBrX2RlbF92eGxhbl9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCitzdGF0aWMgdm9pZCBmbTEwa191ZHBfdHVubmVsX2RlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgdWRwX3R1bm5lbF9pbmZvICp0aSkKIHsKIAlzdHJ1Y3QgZm0xMGtfaW50ZmMgKmludGVyZmFjZSA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGZtMTBrX3Z4bGFuX3BvcnQgKnZ4bGFuX3BvcnQ7CisJc3RydWN0IGZtMTBrX3VkcF9wb3J0ICpwb3J0ID0gTlVMTDsKIAotCWlmICh0aS0+dHlwZSAhPSBVRFBfVFVOTkVMX1RZUEVfVlhMQU4pCi0JCXJldHVybjsKIAlpZiAoaW50ZXJmYWNlLT5ody5tYWMudHlwZSAhPSBmbTEwa19tYWNfcGYpCiAJCXJldHVybjsKIAotCS8qIGZpbmQgdGhlIHBvcnQgaW4gdGhlIGxpc3QgYW5kIGZyZWUgaXQgKi8KLQlmbTEwa192eGxhbl9wb3J0X2Zvcl9lYWNoKHZ4bGFuX3BvcnQsIGludGVyZmFjZSkgewotCQlpZiAoKHZ4bGFuX3BvcnQtPnBvcnQgPT0gdGktPnBvcnQpICYmCi0JCSAgICAodnhsYW5fcG9ydC0+c2FfZmFtaWx5ID09IHRpLT5zYV9mYW1pbHkpKSB7Ci0JCQlsaXN0X2RlbCgmdnhsYW5fcG9ydC0+bGlzdCk7Ci0JCQlrZnJlZSh2eGxhbl9wb3J0KTsKLQkJCWJyZWFrOwotCQl9CisJc3dpdGNoICh0aS0+dHlwZSkgeworCWNhc2UgVURQX1RVTk5FTF9UWVBFX1ZYTEFOOgorCQlwb3J0ID0gZm0xMGtfcmVtb3ZlX3R1bm5lbF9wb3J0KCZpbnRlcmZhY2UtPnZ4bGFuX3BvcnQsIHRpKTsKKwkJYnJlYWs7CisJY2FzZSBVRFBfVFVOTkVMX1RZUEVfR0VORVZFOgorCQlwb3J0ID0gZm0xMGtfcmVtb3ZlX3R1bm5lbF9wb3J0KCZpbnRlcmZhY2UtPmdlbmV2ZV9wb3J0LCB0aSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKIAl9CiAKLQlmbTEwa19yZXN0b3JlX3Z4bGFuX3BvcnQoaW50ZXJmYWNlKTsKKwkvKiBpZiB3ZSBkaWQgcmVtb3ZlIGEgcG9ydCB3ZSBuZWVkIHRvIGZyZWUgaXRzIG1lbW9yeSAqLworCWtmcmVlKHBvcnQpOworCisJZm0xMGtfcmVzdG9yZV91ZHBfcG9ydF9pbmZvKGludGVyZmFjZSk7CiB9CiAKIC8qKgpAQCAtNTU1LDcgKzU5Nyw2IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfc2V0X3F1ZXVlczsKIAotCS8qIHVwZGF0ZSBWWExBTiBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KIAl1ZHBfdHVubmVsX2dldF9yeF9pbmZvKG5ldGRldik7CiAKIAlmbTEwa191cChpbnRlcmZhY2UpOwpAQCAtNTkxLDcgKzYzMiw3IEBACiAKIAlmbTEwa19xdl9mcmVlX2lycShpbnRlcmZhY2UpOwogCi0JZm0xMGtfZGVsX3Z4bGFuX3BvcnRfYWxsKGludGVyZmFjZSk7CisJZm0xMGtfZnJlZV91ZHBfcG9ydF9pbmZvKGludGVyZmFjZSk7CiAKIAlmbTEwa19mcmVlX2FsbF90eF9yZXNvdXJjZXMoaW50ZXJmYWNlKTsKIAlmbTEwa19mcmVlX2FsbF9yeF9yZXNvdXJjZXMoaW50ZXJmYWNlKTsKQEAgLTEwNTUsNyArMTA5Niw3IEBACiAJaW50ZXJmYWNlLT54Y2FzdF9tb2RlID0geGNhc3RfbW9kZTsKIAogCS8qIFJlc3RvcmUgdHVubmVsIGNvbmZpZ3VyYXRpb24gKi8KLQlmbTEwa19yZXN0b3JlX3Z4bGFuX3BvcnQoaW50ZXJmYWNlKTsKKwlmbTEwa19yZXN0b3JlX3VkcF9wb3J0X2luZm8oaW50ZXJmYWNlKTsKIH0KIAogdm9pZCBmbTEwa19yZXNldF9yeF9zdGF0ZShzdHJ1Y3QgZm0xMGtfaW50ZmMgKmludGVyZmFjZSkKQEAgLTEwOTgsNyArMTEzOSw3IEBACiAJcmN1X3JlYWRfbG9jaygpOwogCiAJZm9yIChpID0gMDsgaSA8IGludGVyZmFjZS0+bnVtX3J4X3F1ZXVlczsgaSsrKSB7Ci0JCXJpbmcgPSBBQ0NFU1NfT05DRShpbnRlcmZhY2UtPnJ4X3JpbmdbaV0pOworCQlyaW5nID0gUkVBRF9PTkNFKGludGVyZmFjZS0+cnhfcmluZ1tpXSk7CiAKIAkJaWYgKCFyaW5nKQogCQkJY29udGludWU7CkBAIC0xMTE0LDcgKzExNTUsNyBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBpbnRlcmZhY2UtPm51bV90eF9xdWV1ZXM7IGkrKykgewotCQlyaW5nID0gQUNDRVNTX09OQ0UoaW50ZXJmYWNlLT50eF9yaW5nW2ldKTsKKwkJcmluZyA9IFJFQURfT05DRShpbnRlcmZhY2UtPnR4X3JpbmdbaV0pOwogCiAJCWlmICghcmluZykKIAkJCWNvbnRpbnVlOwpAQCAtMTI5OSw3ICsxMzQwLDcgQEAKIHN0YXRpYyB2b2lkIGZtMTBrX2Rmd2RfZGVsX3N0YXRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcHJpdikKIHsKIAlzdHJ1Y3QgZm0xMGtfaW50ZmMgKmludGVyZmFjZSA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGZtMTBrX2wyX2FjY2VsICpsMl9hY2NlbCA9IEFDQ0VTU19PTkNFKGludGVyZmFjZS0+bDJfYWNjZWwpOworCXN0cnVjdCBmbTEwa19sMl9hY2NlbCAqbDJfYWNjZWwgPSBSRUFEX09OQ0UoaW50ZXJmYWNlLT5sMl9hY2NlbCk7CiAJc3RydWN0IGZtMTBrX2RnbG9ydF9jZmcgZGdsb3J0ID0geyAwIH07CiAJc3RydWN0IGZtMTBrX2h3ICpodyA9ICZpbnRlcmZhY2UtPmh3OwogCXN0cnVjdCBuZXRfZGV2aWNlICpzZGV2ID0gcHJpdjsKQEAgLTEzNzUsOCArMTQxNiw4IEBACiAJLm5kb19zZXRfdmZfdmxhbgk9IGZtMTBrX25kb19zZXRfdmZfdmxhbiwKIAkubmRvX3NldF92Zl9yYXRlCT0gZm0xMGtfbmRvX3NldF92Zl9idywKIAkubmRvX2dldF92Zl9jb25maWcJPSBmbTEwa19uZG9fZ2V0X3ZmX2NvbmZpZywKLQkubmRvX3VkcF90dW5uZWxfYWRkCT0gZm0xMGtfYWRkX3Z4bGFuX3BvcnQsCi0JLm5kb191ZHBfdHVubmVsX2RlbAk9IGZtMTBrX2RlbF92eGxhbl9wb3J0LAorCS5uZG9fdWRwX3R1bm5lbF9hZGQJPSBmbTEwa191ZHBfdHVubmVsX2FkZCwKKwkubmRvX3VkcF90dW5uZWxfZGVsCT0gZm0xMGtfdWRwX3R1bm5lbF9kZWwsCiAJLm5kb19kZndkX2FkZF9zdGF0aW9uCT0gZm0xMGtfZGZ3ZF9hZGRfc3RhdGlvbiwKIAkubmRvX2Rmd2RfZGVsX3N0YXRpb24JPSBmbTEwa19kZndkX2RlbF9zdGF0aW9uLAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19wY2kuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX3BjaS5jCmluZGV4IDc3NGE1NjUuLmIxYTJmODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX3BjaS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX3BjaS5jCkBAIC02Miw3ICs2Miw3IEBACiAKIHUzMiBmbTEwa19yZWFkX3JlZyhzdHJ1Y3QgZm0xMGtfaHcgKmh3LCBpbnQgcmVnKQogewotCXUzMiBfX2lvbWVtICpod19hZGRyID0gQUNDRVNTX09OQ0UoaHctPmh3X2FkZHIpOworCXUzMiBfX2lvbWVtICpod19hZGRyID0gUkVBRF9PTkNFKGh3LT5od19hZGRyKTsKIAl1MzIgdmFsdWUgPSAwOwogCiAJaWYgKEZNMTBLX1JFTU9WRUQoaHdfYWRkcikpCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkvKiBjaGVjayB0aGUgcmVhbCBhZGRyZXNzIHNwYWNlIHRvIHNlZSBpZiB3ZSd2ZSByZWNvdmVyZWQgKi8KIAlod19hZGRyID0gUkVBRF9PTkNFKGludGVyZmFjZS0+dWNfYWRkcik7CiAJdmFsdWUgPSByZWFkbChod19hZGRyKTsKLQlpZiAoKH52YWx1ZSkpIHsKKwlpZiAofnZhbHVlKSB7CiAJCWludGVyZmFjZS0+aHcuaHdfYWRkciA9IGludGVyZmFjZS0+dWNfYWRkcjsKIAkJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOwogCQlpbnRlcmZhY2UtPmZsYWdzIHw9IEZNMTBLX0ZMQUdfUkVTRVRfUkVRVUVTVEVEOwpAQCAtNzM0LDE1ICs3MzQsMTUgQEAKIAl1NjQgcmRiYSA9IHJpbmctPmRtYTsKIAlzdHJ1Y3QgZm0xMGtfaHcgKmh3ID0gJmludGVyZmFjZS0+aHc7CiAJdTMyIHNpemUgPSByaW5nLT5jb3VudCAqIHNpemVvZih1bmlvbiBmbTEwa19yeF9kZXNjKTsKLQl1MzIgcnhxY3RsID0gRk0xMEtfUlhRQ1RMX0VOQUJMRSB8IEZNMTBLX1JYUUNUTF9QRjsKLQl1MzIgcnhkY3RsID0gRk0xMEtfUlhEQ1RMX1dSSVRFX0JBQ0tfTUlOX0RFTEFZOworCXUzMiByeHFjdGwsIHJ4ZGN0bCA9IEZNMTBLX1JYRENUTF9XUklURV9CQUNLX01JTl9ERUxBWTsKIAl1MzIgc3JyY3RsID0gRk0xMEtfU1JSQ1RMX0JVRkZFUl9DSEFJTklOR19FTjsKIAl1MzIgcnhpbnQgPSBGTTEwS19JTlRfTUFQX0RJU0FCTEU7CiAJdTggcnhfcGF1c2UgPSBpbnRlcmZhY2UtPnJ4X3BhdXNlOwogCXU4IHJlZ19pZHggPSByaW5nLT5yZWdfaWR4OwogCiAJLyogZGlzYWJsZSBxdWV1ZSB0byBhdm9pZCBpc3N1ZXMgd2hpbGUgdXBkYXRpbmcgc3RhdGUgKi8KLQlmbTEwa193cml0ZV9yZWcoaHcsIEZNMTBLX1JYUUNUTChyZWdfaWR4KSwgMCk7CisJcnhxY3RsID0gZm0xMGtfcmVhZF9yZWcoaHcsIEZNMTBLX1JYUUNUTChyZWdfaWR4KSk7CisJcnhxY3RsICY9IH5GTTEwS19SWFFDVExfRU5BQkxFOwogCWZtMTBrX3dyaXRlX2ZsdXNoKGh3KTsKIAogCS8qIHBvc3NpYmxlIHBvbGwgaGVyZSB0byB2ZXJpZnkgcmluZyByZXNvdXJjZXMgaGF2ZSBiZWVuIGNsZWFuZWQgKi8KQEAgLTc5Nyw2ICs3OTcsOCBAQAogCWZtMTBrX3dyaXRlX3JlZyhodywgRk0xMEtfUlhJTlQocmVnX2lkeCksIHJ4aW50KTsKIAogCS8qIGVuYWJsZSBxdWV1ZSAqLworCXJ4cWN0bCA9IGZtMTBrX3JlYWRfcmVnKGh3LCBGTTEwS19SWFFDVEwocmVnX2lkeCkpOworCXJ4cWN0bCB8PSBGTTEwS19SWFFDVExfRU5BQkxFOwogCWZtMTBrX3dyaXRlX3JlZyhodywgRk0xMEtfUlhRQ1RMKHJlZ19pZHgpLCByeHFjdGwpOwogCiAJLyogcGxhY2UgYnVmZmVycyBvbiByaW5nIGZvciByZWNlaXZlIGRhdGEgKi8KQEAgLTE2OTksNyArMTcwMSw3IEBACiAKIAkJLyogc3RhcnQgY2hlY2tpbmcgYXQgdGhlIGxhc3QgcmluZyB0byBoYXZlIHBlbmRpbmcgVHggKi8KIAkJZm9yICg7IGkgPCBpbnRlcmZhY2UtPm51bV90eF9xdWV1ZXM7IGkrKykKLQkJCWlmIChmbTEwa19nZXRfdHhfcGVuZGluZyhpbnRlcmZhY2UtPnR4X3JpbmdbaV0pKQorCQkJaWYgKGZtMTBrX2dldF90eF9wZW5kaW5nKGludGVyZmFjZS0+dHhfcmluZ1tpXSwgZmFsc2UpKQogCQkJCWJyZWFrOwogCiAJCS8qIGlmIGFsbCB0aGUgcXVldWVzIGFyZSBkcmFpbmVkLCB3ZSBjYW4gYnJlYWsgbm93ICovCkBAIC0xODM1LDggKzE4MzcsOSBAQAogCWludGVyZmFjZS0+dHhfaXRyID0gRk0xMEtfVFhfSVRSX0RFRkFVTFQ7CiAJaW50ZXJmYWNlLT5yeF9pdHIgPSBGTTEwS19JVFJfQURBUFRJVkUgfCBGTTEwS19SWF9JVFJfREVGQVVMVDsKIAotCS8qIGluaXRpYWxpemUgdnhsYW5fcG9ydCBsaXN0ICovCisJLyogaW5pdGlhbGl6ZSB1ZHAgcG9ydCBsaXN0cyAqLwogCUlOSVRfTElTVF9IRUFEKCZpbnRlcmZhY2UtPnZ4bGFuX3BvcnQpOworCUlOSVRfTElTVF9IRUFEKCZpbnRlcmZhY2UtPmdlbmV2ZV9wb3J0KTsKIAogCW5ldGRldl9yc3Nfa2V5X2ZpbGwocnNzX2tleSwgc2l6ZW9mKHJzc19rZXkpKTsKIAltZW1jcHkoaW50ZXJmYWNlLT5yc3NyaywgcnNzX2tleSwgc2l6ZW9mKHJzc19rZXkpKTsKQEAgLTE5NTAsOSArMTk1MywxOCBAQAogCXN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlOwogCWludCBlcnI7CiAKKwlpZiAocGRldi0+ZXJyb3Jfc3RhdGUgIT0gcGNpX2NoYW5uZWxfaW9fbm9ybWFsKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJQQ0kgZGV2aWNlIHN0aWxsIGluIGFuIGVycm9yIHN0YXRlLiBVbmFibGUgdG8gbG9hZC4uLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwogCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlX21lbShwZGV2KTsKLQlpZiAoZXJyKQorCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIlBDSSBlbmFibGUgZGV2aWNlIGZhaWxlZDogJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CisJfQogCiAJZXJyID0gZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVudCgmcGRldi0+ZGV2LCBETUFfQklUX01BU0soNDgpKTsKIAlpZiAoZXJyKQpAQCAtMjI3NSw3ICsyMjg3LDcgQEAKIHsKIAlwY2lfZXJzX3Jlc3VsdF90IHJlc3VsdDsKIAotCWlmIChwY2lfZW5hYmxlX2RldmljZV9tZW0ocGRldikpIHsKKwlpZiAocGNpX3JlZW5hYmxlX2RldmljZShwZGV2KSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkiQ2Fubm90IHJlLWVuYWJsZSBQQ0kgZGV2aWNlIGFmdGVyIHJlc2V0LlxuIik7CiAJCXJlc3VsdCA9IFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19wZi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfcGYuYwppbmRleCA2ODIyOTlkLi4yM2ZiMzE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19wZi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX3BmLmMKQEAgLTg2NywxMCArODY3LDYgQEAKIAl2Zl9xX2lkeCA9IGZtMTBrX3ZmX3F1ZXVlX2luZGV4KGh3LCB2Zl9pZHgpOwogCXFtYXBfaWR4ID0gcW1hcF9zdHJpZGUgKiB2Zl9pZHg7CiAKLQkvKiBNQVAgVHggcXVldWUgYmFjayB0byAwIHRlbXBvcmFyaWx5LCBhbmQgZGlzYWJsZSBpdCAqLwotCWZtMTBrX3dyaXRlX3JlZyhodywgRk0xMEtfVFFNQVAocW1hcF9pZHgpLCAwKTsKLQlmbTEwa193cml0ZV9yZWcoaHcsIEZNMTBLX1RYRENUTCh2Zl9xX2lkeCksIDApOwotCiAJLyogRGV0ZXJtaW5lIGNvcnJlY3QgZGVmYXVsdCBWTEFOIElELiBUaGUgRk0xMEtfVkxBTl9PVkVSUklERSBiaXQgaXMKIAkgKiB1c2VkIGhlcmUgdG8gaW5kaWNhdGUgdG8gdGhlIFZGIHRoYXQgaXQgd2lsbCBub3QgaGF2ZSBwcml2aWxlZ2UgdG8KIAkgKiB3cml0ZSBWTEFOX1RBQkxFLiBBbGwgcG9saWN5IGlzIGVuZm9yY2VkIG9uIHRoZSBQRiBidXQgdGhpcyBhbGxvd3MKQEAgLTg4Niw5ICs4ODIsMzUgQEAKIAlmbTEwa190bHZfYXR0cl9wdXRfbWFjX3ZsYW4obXNnLCBGTTEwS19NQUNfVkxBTl9NU0dfREVGQVVMVF9NQUMsCiAJCQkJICAgIHZmX2luZm8tPm1hYywgdmZfdmlkKTsKIAotCS8qIGxvYWQgb250byBvdXRnb2luZyBtYWlsYm94LCBpZ25vcmUgYW55IGVycm9ycyBvbiBlbnF1ZXVlICovCi0JaWYgKHZmX2luZm8tPm1ieC5vcHMuZW5xdWV1ZV90eCkKLQkJdmZfaW5mby0+bWJ4Lm9wcy5lbnF1ZXVlX3R4KGh3LCAmdmZfaW5mby0+bWJ4LCBtc2cpOworCS8qIENvbmZpZ3VyZSBRdWV1ZSBjb250cm9sIHJlZ2lzdGVyIHdpdGggbmV3IFZMQU4gSUQuIFRoZSBUWFFDVEwKKwkgKiByZWdpc3RlciBpcyBSTyBmcm9tIHRoZSBWRiwgc28gdGhlIFBGIG11c3QgZG8gdGhpcyBldmVuIGluIHRoZQorCSAqIGNhc2Ugb2Ygbm90aWZ5aW5nIHRoZSBWRiBvZiBhIG5ldyBWSUQgdmlhIHRoZSBtYWlsYm94LgorCSAqLworCXR4cWN0bCA9ICgodTMyKXZmX3ZpZCA8PCBGTTEwS19UWFFDVExfVklEX1NISUZUKSAmCisJCSBGTTEwS19UWFFDVExfVklEX01BU0s7CisJdHhxY3RsIHw9ICh2Zl9pZHggPDwgRk0xMEtfVFhRQ1RMX1RDX1NISUZUKSB8CisJCSAgRk0xMEtfVFhRQ1RMX1ZGIHwgdmZfaWR4OworCisJZm9yIChpID0gMDsgaSA8IHF1ZXVlc19wZXJfcG9vbDsgaSsrKQorCQlmbTEwa193cml0ZV9yZWcoaHcsIEZNMTBLX1RYUUNUTCh2Zl9xX2lkeCArIGkpLCB0eHFjdGwpOworCisJLyogdHJ5IGxvYWRpbmcgYSBtZXNzYWdlIG9udG8gb3V0Z29pbmcgbWFpbGJveCBmaXJzdCAqLworCWlmICh2Zl9pbmZvLT5tYngub3BzLmVucXVldWVfdHgpIHsKKwkJZXJyID0gdmZfaW5mby0+bWJ4Lm9wcy5lbnF1ZXVlX3R4KGh3LCAmdmZfaW5mby0+bWJ4LCBtc2cpOworCQlpZiAoZXJyICE9IEZNMTBLX01CWF9FUlJfTk9fTUJYKQorCQkJcmV0dXJuIGVycjsKKwkJZXJyID0gMDsKKwl9CisKKwkvKiBJZiB3ZSBhcmVuJ3QgY29ubmVjdGVkIHRvIGEgbWFpbGJveCwgdGhpcyBpcyBtb3N0IGxpa2VseSBiZWNhdXNlCisJICogdGhlIFZGIGRyaXZlciBpcyBub3QgcnVubmluZy4gSXQgc2hvdWxkIHRodXMgYmUgc2FmZSB0byByZS1tYXAKKwkgKiBxdWV1ZXMgYW5kIHVzZSB0aGUgcmVnaXN0ZXJzIHRvIHBhc3MgdGhlIE1BQyBhZGRyZXNzIHNvIHRoYXQgdGhlIFZGCisJICogZHJpdmVyIGdldHMgY29ycmVjdCBpbmZvcm1hdGlvbiBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uLgorCSAqLworCisJLyogTUFQIFR4IHF1ZXVlIGJhY2sgdG8gMCB0ZW1wb3JhcmlseSwgYW5kIGRpc2FibGUgaXQgKi8KKwlmbTEwa193cml0ZV9yZWcoaHcsIEZNMTBLX1RRTUFQKHFtYXBfaWR4KSwgMCk7CisJZm0xMGtfd3JpdGVfcmVnKGh3LCBGTTEwS19UWERDVEwodmZfcV9pZHgpLCAwKTsKIAogCS8qIHZlcmlmeSByaW5nIGhhcyBkaXNhYmxlZCBiZWZvcmUgbW9kaWZ5aW5nIGJhc2UgYWRkcmVzcyByZWdpc3RlcnMgKi8KIAl0eGRjdGwgPSBmbTEwa19yZWFkX3JlZyhodywgRk0xMEtfVFhEQ1RMKHZmX3FfaWR4KSk7CkBAIC05MjcsMTYgKzk0OSw2IEBACiAJCQkJCQkgICBGTTEwS19URExFTl9JVFJfU0NBTEVfU0hJRlQpOwogCiBlcnJfb3V0OgotCS8qIGNvbmZpZ3VyZSBRdWV1ZSBjb250cm9sIHJlZ2lzdGVyICovCi0JdHhxY3RsID0gKCh1MzIpdmZfdmlkIDw8IEZNMTBLX1RYUUNUTF9WSURfU0hJRlQpICYKLQkJIEZNMTBLX1RYUUNUTF9WSURfTUFTSzsKLQl0eHFjdGwgfD0gKHZmX2lkeCA8PCBGTTEwS19UWFFDVExfVENfU0hJRlQpIHwKLQkJICBGTTEwS19UWFFDVExfVkYgfCB2Zl9pZHg7Ci0KLQkvKiBhc3NpZ24gVkxBTiBJRCAqLwotCWZvciAoaSA9IDA7IGkgPCBxdWV1ZXNfcGVyX3Bvb2w7IGkrKykKLQkJZm0xMGtfd3JpdGVfcmVnKGh3LCBGTTEwS19UWFFDVEwodmZfcV9pZHggKyBpKSwgdHhxY3RsKTsKLQogCS8qIHJlc3RvcmUgdGhlIHF1ZXVlIGJhY2sgdG8gVkYgb3duZXJzaGlwICovCiAJZm0xMGtfd3JpdGVfcmVnKGh3LCBGTTEwS19UUU1BUChxbWFwX2lkeCksIHZmX3FfaWR4KTsKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfdHlwZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfdHlwZS5oCmluZGV4IGY0ZTc1YzQuLjZiYjE2YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX3R5cGUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa190eXBlLmgKQEAgLTE1NCw2ICsxNTQsNyBAQAogI2RlZmluZSBGTTEwS19ER0xPUlRERUNfSU5ORVJSU1NfRU5BQkxFCQkweDA4MDAwMDAwCiAjZGVmaW5lIEZNMTBLX1RVTk5FTF9DRkcJMHgwMDQwCiAjZGVmaW5lIEZNMTBLX1RVTk5FTF9DRkdfTlZHUkVfU0hJRlQJCTE2CisjZGVmaW5lIEZNMTBLX1RVTk5FTF9DRkdfR0VORVZFCTB4MDA0MQogI2RlZmluZSBGTTEwS19TV1BSSV9NQVAoX24pCSgoX24pICsgMHgwMDUwKQogI2RlZmluZSBGTTEwS19TV1BSSV9NQVgJCTE2CiAjZGVmaW5lIEZNMTBLX1JTU1JLKF9uLCBfbSkJKCgoX24pICogMHgxMCkgKyAoX20pICsgMHgwODAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGUuaAppbmRleCAyYTg4MjkxLi4yMDMwZDdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGUuaApAQCAtNjUsNzYgKzY1LDcyIEBACiAjaW5jbHVkZSAiaTQwZV9kY2IuaCIKIAogLyogVXNlZnVsIGk0MGUgZGVmYXVsdHMgKi8KLSNkZWZpbmUgSTQwRV9NQVhfVkVCICAgICAgICAgIDE2CisjZGVmaW5lIEk0MEVfTUFYX1ZFQgkJCTE2CiAKLSNkZWZpbmUgSTQwRV9NQVhfTlVNX0RFU0NSSVBUT1JTICAgICAgNDA5NgotI2RlZmluZSBJNDBFX01BWF9DU1JfU1BBQ0UgKDQgKiAxMDI0ICogMTAyNCAtIDY0ICogMTAyNCkKLSNkZWZpbmUgSTQwRV9ERUZBVUxUX05VTV9ERVNDUklQVE9SUyAgNTEyCi0jZGVmaW5lIEk0MEVfUkVRX0RFU0NSSVBUT1JfTVVMVElQTEUgIDMyCi0jZGVmaW5lIEk0MEVfTUlOX05VTV9ERVNDUklQVE9SUyAgICAgIDY0Ci0jZGVmaW5lIEk0MEVfTUlOX01TSVggICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgSTQwRV9ERUZBVUxUX05VTV9WTURRX1ZTSSAgICAgOCAvKiBtYXggMjU2IFZTSXMgKi8KLSNkZWZpbmUgSTQwRV9NSU5fVlNJX0FMTE9DICAgICAgICAgICAgNTEgLyogTEFOLCBBVFIsIEZDT0UsIDMyIFZGLCAxNiBWTURRICovCisjZGVmaW5lIEk0MEVfTUFYX05VTV9ERVNDUklQVE9SUwk0MDk2CisjZGVmaW5lIEk0MEVfTUFYX0NTUl9TUEFDRQkJKDQgKiAxMDI0ICogMTAyNCAtIDY0ICogMTAyNCkKKyNkZWZpbmUgSTQwRV9ERUZBVUxUX05VTV9ERVNDUklQVE9SUwk1MTIKKyNkZWZpbmUgSTQwRV9SRVFfREVTQ1JJUFRPUl9NVUxUSVBMRQkzMgorI2RlZmluZSBJNDBFX01JTl9OVU1fREVTQ1JJUFRPUlMJNjQKKyNkZWZpbmUgSTQwRV9NSU5fTVNJWAkJCTIKKyNkZWZpbmUgSTQwRV9ERUZBVUxUX05VTV9WTURRX1ZTSQk4IC8qIG1heCAyNTYgVlNJcyAqLworI2RlZmluZSBJNDBFX01JTl9WU0lfQUxMT0MJCTgzIC8qIExBTiwgQVRSLCBGQ09FLCA2NCBWRiAqLwogLyogbWF4IDE2IHFwcyAqLwogI2RlZmluZSBpNDBlX2RlZmF1bHRfcXVldWVzX3Blcl92bWRxKHBmKSBcCiAJCSgoKHBmKS0+ZmxhZ3MgJiBJNDBFX0ZMQUdfUlNTX0FRX0NBUEFCTEUpID8gNCA6IDEpCi0jZGVmaW5lIEk0MEVfREVGQVVMVF9RVUVVRVNfUEVSX1ZGICAgIDQKLSNkZWZpbmUgSTQwRV9ERUZBVUxUX1FVRVVFU19QRVJfVEMgICAgMSAvKiBzaG91bGQgYmUgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIEk0MEVfREVGQVVMVF9RVUVVRVNfUEVSX1ZGCTQKKyNkZWZpbmUgSTQwRV9ERUZBVUxUX1FVRVVFU19QRVJfVEMJMSAvKiBzaG91bGQgYmUgYSBwb3dlciBvZiAyICovCiAjZGVmaW5lIGk0MGVfcGZfZ2V0X21heF9xX3Blcl90YyhwZikgXAogCQkoKChwZiktPmZsYWdzICYgSTQwRV9GTEFHXzEyOF9RUF9SU1NfQ0FQQUJMRSkgPyAxMjggOiA2NCkKLSNkZWZpbmUgSTQwRV9GRElSX1JJTkcgICAgICAgICAgICAgICAgMAotI2RlZmluZSBJNDBFX0ZESVJfUklOR19DT1VOVCAgICAgICAgICAzMgorI2RlZmluZSBJNDBFX0ZESVJfUklORwkJCTAKKyNkZWZpbmUgSTQwRV9GRElSX1JJTkdfQ09VTlQJCTMyCiAjaWZkZWYgSTQwRV9GQ09FCi0jZGVmaW5lIEk0MEVfREVGQVVMVF9GQ09FICAgICAgICAgICAgIDggLyogZGVmYXVsdCBudW1iZXIgb2YgUVBzIGZvciBGQ29FICovCi0jZGVmaW5lIEk0MEVfTUlOSU1VTV9GQ09FICAgICAgICAgICAgIDEgLyogbWluaW11bSBudW1iZXIgb2YgUVBzIGZvciBGQ29FICovCisjZGVmaW5lIEk0MEVfREVGQVVMVF9GQ09FCQk4IC8qIGRlZmF1bHQgbnVtYmVyIG9mIFFQcyBmb3IgRkNvRSAqLworI2RlZmluZSBJNDBFX01JTklNVU1fRkNPRQkJMSAvKiBtaW5pbXVtIG51bWJlciBvZiBRUHMgZm9yIEZDb0UgKi8KICNlbmRpZiAvKiBJNDBFX0ZDT0UgKi8KLSNkZWZpbmUgSTQwRV9NQVhfQVFfQlVGX1NJWkUgICAgICAgICAgNDA5NgotI2RlZmluZSBJNDBFX0FRX0xFTiAgICAgICAgICAgICAgICAgICAyNTYKLSNkZWZpbmUgSTQwRV9BUV9XT1JLX0xJTUlUICAgICAgICAgICAgNjYgLyogbWF4IG51bWJlciBvZiBWRnMgKyBhIGxpdHRsZSAqLwotI2RlZmluZSBJNDBFX01BWF9VU0VSX1BSSU9SSVRZICAgICAgICA4Ci0jZGVmaW5lIEk0MEVfREVGQVVMVF9NU0dfRU5BQkxFICAgICAgIDQKLSNkZWZpbmUgSTQwRV9RVUVVRV9XQUlUX1JFVFJZX0xJTUlUICAgMTAKLSNkZWZpbmUgSTQwRV9JTlRfTkFNRV9TVFJfTEVOICAgICAgICAoSUZOQU1TSVogKyAxNikKKyNkZWZpbmUgSTQwRV9NQVhfQVFfQlVGX1NJWkUJCTQwOTYKKyNkZWZpbmUgSTQwRV9BUV9MRU4JCQkyNTYKKyNkZWZpbmUgSTQwRV9BUV9XT1JLX0xJTUlUCQk2NiAvKiBtYXggbnVtYmVyIG9mIFZGcyArIGEgbGl0dGxlICovCisjZGVmaW5lIEk0MEVfTUFYX1VTRVJfUFJJT1JJVFkJCTgKKyNkZWZpbmUgSTQwRV9ERUZBVUxUX01TR19FTkFCTEUJCTQKKyNkZWZpbmUgSTQwRV9RVUVVRV9XQUlUX1JFVFJZX0xJTUlUCTEwCisjZGVmaW5lIEk0MEVfSU5UX05BTUVfU1RSX0xFTgkJKElGTkFNU0laICsgMTYpCiAKIC8qIEV0aHRvb2wgUHJpdmF0ZSBGbGFncyAqLwotI2RlZmluZQlJNDBFX1BSSVZfRkxBR1NfTUZQX0ZMQUcJCUJJVCgwKQotI2RlZmluZQlJNDBFX1BSSVZfRkxBR1NfTElOS1BPTExfRkxBRwkJQklUKDEpCisjZGVmaW5lIEk0MEVfUFJJVl9GTEFHU19NRlBfRkxBRwkJQklUKDApCisjZGVmaW5lIEk0MEVfUFJJVl9GTEFHU19MSU5LUE9MTF9GTEFHCQlCSVQoMSkKICNkZWZpbmUgSTQwRV9QUklWX0ZMQUdTX0ZEX0FUUgkJCUJJVCgyKQogI2RlZmluZSBJNDBFX1BSSVZfRkxBR1NfVkVCX1NUQVRTCQlCSVQoMykKICNkZWZpbmUgSTQwRV9QUklWX0ZMQUdTX0hXX0FUUl9FVklDVAkJQklUKDQpCiAjZGVmaW5lIEk0MEVfUFJJVl9GTEFHU19UUlVFX1BST01JU0NfU1VQUE9SVAlCSVQoNSkKIAotI2RlZmluZSBJNDBFX05WTV9WRVJTSU9OX0xPX1NISUZUICAwCi0jZGVmaW5lIEk0MEVfTlZNX1ZFUlNJT05fTE9fTUFTSyAgICgweGZmIDw8IEk0MEVfTlZNX1ZFUlNJT05fTE9fU0hJRlQpCi0jZGVmaW5lIEk0MEVfTlZNX1ZFUlNJT05fSElfU0hJRlQgIDEyCi0jZGVmaW5lIEk0MEVfTlZNX1ZFUlNJT05fSElfTUFTSyAgICgweGYgPDwgSTQwRV9OVk1fVkVSU0lPTl9ISV9TSElGVCkKLSNkZWZpbmUgSTQwRV9PRU1fVkVSX0JVSUxEX01BU0sgICAgMHhmZmZmCi0jZGVmaW5lIEk0MEVfT0VNX1ZFUl9QQVRDSF9NQVNLICAgIDB4ZmYKLSNkZWZpbmUgSTQwRV9PRU1fVkVSX0JVSUxEX1NISUZUICAgOAotI2RlZmluZSBJNDBFX09FTV9WRVJfU0hJRlQgICAgICAgICAyNAorI2RlZmluZSBJNDBFX05WTV9WRVJTSU9OX0xPX1NISUZUCTAKKyNkZWZpbmUgSTQwRV9OVk1fVkVSU0lPTl9MT19NQVNLCSgweGZmIDw8IEk0MEVfTlZNX1ZFUlNJT05fTE9fU0hJRlQpCisjZGVmaW5lIEk0MEVfTlZNX1ZFUlNJT05fSElfU0hJRlQJMTIKKyNkZWZpbmUgSTQwRV9OVk1fVkVSU0lPTl9ISV9NQVNLCSgweGYgPDwgSTQwRV9OVk1fVkVSU0lPTl9ISV9TSElGVCkKKyNkZWZpbmUgSTQwRV9PRU1fVkVSX0JVSUxEX01BU0sJCTB4ZmZmZgorI2RlZmluZSBJNDBFX09FTV9WRVJfUEFUQ0hfTUFTSwkJMHhmZgorI2RlZmluZSBJNDBFX09FTV9WRVJfQlVJTERfU0hJRlQJOAorI2RlZmluZSBJNDBFX09FTV9WRVJfU0hJRlQJCTI0CiAjZGVmaW5lIEk0MEVfUEhZX0RFQlVHX0FMTCBcCiAJKEk0MEVfQVFfUEhZX0RFQlVHX0RJU0FCTEVfTElOS19GVyB8IFwKIAlJNDBFX0FRX1BIWV9ERUJVR19ESVNBQkxFX0FMTF9MSU5LX0ZXKQogCiAvKiBUaGUgdmFsdWVzIGluIGhlcmUgYXJlIGRlY2ltYWwgY29kZWQgYXMgaGV4IGFzIGlzIHRoZSBjYXNlIGluIHRoZSBOVk0gbWFwKi8KLSNkZWZpbmUgSTQwRV9DVVJSRU5UX05WTV9WRVJTSU9OX0hJIDB4MgotI2RlZmluZSBJNDBFX0NVUlJFTlRfTlZNX1ZFUlNJT05fTE8gMHg0MAorI2RlZmluZSBJNDBFX0NVUlJFTlRfTlZNX1ZFUlNJT05fSEkJMHgyCisjZGVmaW5lIEk0MEVfQ1VSUkVOVF9OVk1fVkVSU0lPTl9MTwkweDQwCiAKLS8qIG1hZ2ljIGZvciBnZXR0aW5nIGRlZmluZXMgaW50byBzdHJpbmdzICovCi0jZGVmaW5lIFNUUklOR0lGWShmb28pICAjZm9vCi0jZGVmaW5lIFhTVFJJTkdJRlkoYmFyKSBTVFJJTkdJRlkoYmFyKQotCi0jZGVmaW5lIEk0MEVfUlhfREVTQyhSLCBpKQkJCVwKKyNkZWZpbmUgSTQwRV9SWF9ERVNDKFIsIGkpCVwKIAkoJigoKHVuaW9uIGk0MGVfMzJieXRlX3J4X2Rlc2MgKikoKFIpLT5kZXNjKSlbaV0pKQotI2RlZmluZSBJNDBFX1RYX0RFU0MoUiwgaSkJCQlcCisjZGVmaW5lIEk0MEVfVFhfREVTQyhSLCBpKQlcCiAJKCYoKChzdHJ1Y3QgaTQwZV90eF9kZXNjICopKChSKS0+ZGVzYykpW2ldKSkKLSNkZWZpbmUgSTQwRV9UWF9DVFhUREVTQyhSLCBpKQkJCVwKKyNkZWZpbmUgSTQwRV9UWF9DVFhUREVTQyhSLCBpKQlcCiAJKCYoKChzdHJ1Y3QgaTQwZV90eF9jb250ZXh0X2Rlc2MgKikoKFIpLT5kZXNjKSlbaV0pKQotI2RlZmluZSBJNDBFX1RYX0ZESVJERVNDKFIsIGkpCQkJXAorI2RlZmluZSBJNDBFX1RYX0ZESVJERVNDKFIsIGkpCVwKIAkoJigoKHN0cnVjdCBpNDBlX2ZpbHRlcl9wcm9ncmFtX2Rlc2MgKikoKFIpLT5kZXNjKSlbaV0pKQogCiAvKiBkZWZhdWx0IHRvIHRyeWluZyBmb3IgZm91ciBzZWNvbmRzICovCi0jZGVmaW5lIEk0MEVfVFJZX0xJTktfVElNRU9VVCAoNCAqIEhaKQorI2RlZmluZSBJNDBFX1RSWV9MSU5LX1RJTUVPVVQJKDQgKiBIWikKIAogLyoqCiAgKiBpNDBlX2lzX21hY183MTAgLSBSZXR1cm4gdHJ1ZSBpZiBNQUMgaXMgWDcxMC9YTDcxMApAQCAtMTk5LDkgKzE5NSw5IEBACiAjZGVmaW5lIEk0MEVfRkRJUl9CVUZGRVJfSEVBRF9ST09NCTMyCiAjZGVmaW5lIEk0MEVfRkRJUl9CVUZGRVJfSEVBRF9ST09NX0ZPUl9BVFIgKEk0MEVfRkRJUl9CVUZGRVJfSEVBRF9ST09NICogNCkKIAotI2RlZmluZSBJNDBFX0hLRVlfQVJSQVlfU0laRSAoKEk0MEVfUEZRRl9IS0VZX01BWF9JTkRFWCArIDEpICogNCkKLSNkZWZpbmUgSTQwRV9ITFVUX0FSUkFZX1NJWkUgKChJNDBFX1BGUUZfSExVVF9NQVhfSU5ERVggKyAxKSAqIDQpCi0jZGVmaW5lIEk0MEVfVkZfSExVVF9BUlJBWV9TSVpFICgoSTQwRV9WRlFGX0hMVVQxX01BWF9JTkRFWCArIDEpICogNCkKKyNkZWZpbmUgSTQwRV9IS0VZX0FSUkFZX1NJWkUJKChJNDBFX1BGUUZfSEtFWV9NQVhfSU5ERVggKyAxKSAqIDQpCisjZGVmaW5lIEk0MEVfSExVVF9BUlJBWV9TSVpFCSgoSTQwRV9QRlFGX0hMVVRfTUFYX0lOREVYICsgMSkgKiA0KQorI2RlZmluZSBJNDBFX1ZGX0hMVVRfQVJSQVlfU0laRQkoKEk0MEVfVkZRRl9ITFVUMV9NQVhfSU5ERVggKyAxKSAqIDQpCiAKIGVudW0gaTQwZV9mZF9zdGF0X2lkeCB7CiAJSTQwRV9GRF9TVEFUX0FUUiwKQEAgLTM4Nyw4ICszODMsOCBAQAogCXN0cnVjdCBtdXRleCBzd2l0Y2hfbXV0ZXg7CiAJdTE2IGxhbl92c2k7ICAgICAgIC8qIG91ciBkZWZhdWx0IExBTiBWU0kgKi8KIAl1MTYgbGFuX3ZlYjsgICAgICAgLyogaW5pdGlhbCByZWxheSwgaWYgZXhpc3RzICovCi0jZGVmaW5lIEk0MEVfTk9fVkVCICAgMHhmZmZmCi0jZGVmaW5lIEk0MEVfTk9fVlNJICAgMHhmZmZmCisjZGVmaW5lIEk0MEVfTk9fVkVCCTB4ZmZmZgorI2RlZmluZSBJNDBFX05PX1ZTSQkweGZmZmYKIAl1MTYgbmV4dF92c2k7ICAgICAgLyogTmV4dCB1bmFsbG9jYXRlZCBWU0kgLSAwLWJhc2VkISAqLwogCXN0cnVjdCBpNDBlX3ZzaSAqKnZzaTsKIAlzdHJ1Y3QgaTQwZV92ZWIgKnZlYltJNDBFX01BWF9WRUJdOwpAQCAtNDIzLDggKzQxOSw4IEBACiAJICovCiAJdTE2IGRjYnhfY2FwOwogCi0JdTMyCWZjb2VfaG1jX2ZpbHRfbnVtOwotCXUzMglmY29lX2htY19jbnR4X251bTsKKwl1MzIgZmNvZV9obWNfZmlsdF9udW07CisJdTMyIGZjb2VfaG1jX2NudHhfbnVtOwogCXN0cnVjdCBpNDBlX2ZpbHRlcl9jb250cm9sX3NldHRpbmdzIGZpbHRlcl9zZXR0aW5nczsKIAogCXN0cnVjdCBwdHBfY2xvY2sgKnB0cF9jbG9jazsKQEAgLTQ3MCwxMCArNDY2LDEwIEBACiBzdHJ1Y3QgaTQwZV92ZWIgewogCXN0cnVjdCBpNDBlX3BmICpwZjsKIAl1MTYgaWR4OwotCXUxNiB2ZWJfaWR4OyAgICAgICAgICAgLyogaW5kZXggb2YgVkVCIHBhcmVudCAqLworCXUxNiB2ZWJfaWR4OwkJLyogaW5kZXggb2YgVkVCIHBhcmVudCAqLwogCXUxNiBzZWlkOwogCXUxNiB1cGxpbmtfc2VpZDsKLQl1MTYgc3RhdHNfaWR4OyAgICAgICAgICAgLyogaW5kZXggb2YgVkVCIHBhcmVudCAqLworCXUxNiBzdGF0c19pZHg7CQkvKiBpbmRleCBvZiBWRUIgcGFyZW50ICovCiAJdTggIGVuYWJsZWRfdGM7CiAJdTE2IGJyaWRnZV9tb2RlOwkvKiBCcmlkZ2UgTW9kZSAoVkVCL1ZFUEEpICovCiAJdTE2IGZsYWdzOwpAQCAtNTM0LDEyICs1MzAsMTMgQEAKIAl1MzIgIHByb21pc2NfdGhyZXNob2xkOwogCiAJdTE2IHdvcmtfbGltaXQ7Ci0JdTE2IGludF9yYXRlX2xpbWl0OyAgLyogdmFsdWUgaW4gdXNlY3MgKi8KKwl1MTYgaW50X3JhdGVfbGltaXQ7CS8qIHZhbHVlIGluIHVzZWNzICovCiAKLQl1MTYgcnNzX3RhYmxlX3NpemU7IC8qIEhXIFJTUyB0YWJsZSBzaXplICovCi0JdTE2IHJzc19zaXplOyAgICAgICAvKiBBbGxvY2F0ZWQgUlNTIHF1ZXVlcyAqLwotCXU4ICAqcnNzX2hrZXlfdXNlcjsgLyogVXNlciBjb25maWd1cmVkIGhhc2gga2V5cyAqLwotCXU4ICAqcnNzX2x1dF91c2VyOyAgLyogVXNlciBjb25maWd1cmVkIGxvb2t1cCB0YWJsZSBlbnRyaWVzICovCisJdTE2IHJzc190YWJsZV9zaXplOwkvKiBIVyBSU1MgdGFibGUgc2l6ZSAqLworCXUxNiByc3Nfc2l6ZTsJCS8qIEFsbG9jYXRlZCBSU1MgcXVldWVzICovCisJdTggICpyc3NfaGtleV91c2VyOwkvKiBVc2VyIGNvbmZpZ3VyZWQgaGFzaCBrZXlzICovCisJdTggICpyc3NfbHV0X3VzZXI7CS8qIFVzZXIgY29uZmlndXJlZCBsb29rdXAgdGFibGUgZW50cmllcyAqLworCiAKIAl1MTYgbWF4X2ZyYW1lOwogCXUxNiByeF9idWZfbGVuOwpAQCAtNTUwLDE0ICs1NDcsMTQgQEAKIAlpbnQgYmFzZV92ZWN0b3I7CiAJYm9vbCBpcnFzX3JlYWR5OwogCi0JdTE2IHNlaWQ7ICAgICAgICAgICAgLyogSFcgaW5kZXggb2YgdGhpcyBWU0kgKGFic29sdXRlIGluZGV4KSAqLwotCXUxNiBpZDsgICAgICAgICAgICAgIC8qIFZTSSBudW1iZXIgKi8KKwl1MTYgc2VpZDsJCS8qIEhXIGluZGV4IG9mIHRoaXMgVlNJIChhYnNvbHV0ZSBpbmRleCkgKi8KKwl1MTYgaWQ7CQkJLyogVlNJIG51bWJlciAqLwogCXUxNiB1cGxpbmtfc2VpZDsKIAotCXUxNiBiYXNlX3F1ZXVlOyAgICAgIC8qIHZzaSdzIGZpcnN0IHF1ZXVlIGluIGh3IGFycmF5ICovCi0JdTE2IGFsbG9jX3F1ZXVlX3BhaXJzOyAvKiBBbGxvY2F0ZWQgVHgvUnggcXVldWVzICovCi0JdTE2IHJlcV9xdWV1ZV9wYWlyczsgLyogVXNlciByZXF1ZXN0ZWQgcXVldWUgcGFpcnMgKi8KLQl1MTYgbnVtX3F1ZXVlX3BhaXJzOyAvKiBVc2VkIHR4IGFuZCByeCBwYWlycyAqLworCXUxNiBiYXNlX3F1ZXVlOwkJLyogdnNpJ3MgZmlyc3QgcXVldWUgaW4gaHcgYXJyYXkgKi8KKwl1MTYgYWxsb2NfcXVldWVfcGFpcnM7CS8qIEFsbG9jYXRlZCBUeC9SeCBxdWV1ZXMgKi8KKwl1MTYgcmVxX3F1ZXVlX3BhaXJzOwkvKiBVc2VyIHJlcXVlc3RlZCBxdWV1ZSBwYWlycyAqLworCXUxNiBudW1fcXVldWVfcGFpcnM7CS8qIFVzZWQgdHggYW5kIHJ4IHBhaXJzICovCiAJdTE2IG51bV9kZXNjOwogCWVudW0gaTQwZV92c2lfdHlwZSB0eXBlOyAgLyogVlNJIHR5cGUsIGUuZy4sIExBTiwgRkNvRSwgZXRjICovCiAJczE2IHZmX2lkOwkJLyogVmlydHVhbCBmdW5jdGlvbiBJRCBmb3IgU1JJT1YgVlNJcyAqLwpAQCAtNTc2LDE5ICs1NzMsMTYgQEAKIAkvKiBUQyBCVyBsaW1pdCBtYXggcXVhbnRhIHdpdGhpbiBWU0kgKi8KIAl1OCAgYndfZXRzX21heF9xdWFudGFbSTQwRV9NQVhfVFJBRkZJQ19DTEFTU107CiAKLQlzdHJ1Y3QgaTQwZV9wZiAqYmFjazsgIC8qIEJhY2tyZWZlcmVuY2UgdG8gYXNzb2NpYXRlZCBQRiAqLwotCXUxNiBpZHg7ICAgICAgICAgICAgICAgLyogaW5kZXggaW4gcGYtPnZzaVtdICovCi0JdTE2IHZlYl9pZHg7ICAgICAgICAgICAvKiBpbmRleCBvZiBWRUIgcGFyZW50ICovCi0Jc3RydWN0IGtvYmplY3QgKmtvYmo7ICAvKiBzeXNmcyBvYmplY3QgKi8KLQlib29sIGN1cnJlbnRfaXN1cDsgICAgIC8qIFN5bmMgJ2xpbmsgdXAnIGxvZ2dpbmcgKi8KKwlzdHJ1Y3QgaTQwZV9wZiAqYmFjazsJLyogQmFja3JlZmVyZW5jZSB0byBhc3NvY2lhdGVkIFBGICovCisJdTE2IGlkeDsJCS8qIGluZGV4IGluIHBmLT52c2lbXSAqLworCXUxNiB2ZWJfaWR4OwkJLyogaW5kZXggb2YgVkVCIHBhcmVudCAqLworCXN0cnVjdCBrb2JqZWN0ICprb2JqOwkvKiBzeXNmcyBvYmplY3QgKi8KKwlib29sIGN1cnJlbnRfaXN1cDsJLyogU3luYyAnbGluayB1cCcgbG9nZ2luZyAqLwogCiAJdm9pZCAqcHJpdjsJLyogY2xpZW50IGRyaXZlciBkYXRhIHJlZmVyZW5jZS4gKi8KIAogCS8qIFZTSSBzcGVjaWZpYyBoYW5kbGVycyAqLwogCWlycXJldHVybl90ICgqaXJxX2hhbmRsZXIpKGludCBpcnEsIHZvaWQgKmRhdGEpOwotCi0JLyogY3VycmVudCByeG5mYyBkYXRhICovCi0Jc3RydWN0IGV0aHRvb2xfcnhuZmMgcnhuZmM7IC8qIGN1cnJlbnQgcnNzIGhhc2ggb3B0cyAqLwogfSBfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wOwogCiBzdHJ1Y3QgaTQwZV9uZXRkZXZfcHJpdiB7CkBAIC03MDcsNiArNzAxLDggQEAKIHZvaWQgaTQwZV9kb19yZXNldChzdHJ1Y3QgaTQwZV9wZiAqcGYsIHUzMiByZXNldF9mbGFncyk7CiBpbnQgaTQwZV9jb25maWdfcnNzKHN0cnVjdCBpNDBlX3ZzaSAqdnNpLCB1OCAqc2VlZCwgdTggKmx1dCwgdTE2IGx1dF9zaXplKTsKIGludCBpNDBlX2dldF9yc3Moc3RydWN0IGk0MGVfdnNpICp2c2ksIHU4ICpzZWVkLCB1OCAqbHV0LCB1MTYgbHV0X3NpemUpOwordm9pZCBpNDBlX2ZpbGxfcnNzX2x1dChzdHJ1Y3QgaTQwZV9wZiAqcGYsIHU4ICpsdXQsCisJCSAgICAgICB1MTYgcnNzX3RhYmxlX3NpemUsIHUxNiByc3Nfc2l6ZSk7CiBzdHJ1Y3QgaTQwZV92c2kgKmk0MGVfZmluZF92c2lfZnJvbV9pZChzdHJ1Y3QgaTQwZV9wZiAqcGYsIHUxNiBpZCk7CiB2b2lkIGk0MGVfdXBkYXRlX3N0YXRzKHN0cnVjdCBpNDBlX3ZzaSAqdnNpKTsKIHZvaWQgaTQwZV91cGRhdGVfZXRoX3N0YXRzKHN0cnVjdCBpNDBlX3ZzaSAqdnNpKTsKQEAgLTcxNCw4ICs3MTAsNiBAQAogaW50IGk0MGVfZmV0Y2hfc3dpdGNoX2NvbmZpZ3VyYXRpb24oc3RydWN0IGk0MGVfcGYgKnBmLAogCQkJCSAgICBib29sIHByaW50Y29uZmlnKTsKIAotaW50IGk0MGVfcHJvZ3JhbV9mZGlyX2ZpbHRlcihzdHJ1Y3QgaTQwZV9mZGlyX2ZpbHRlciAqZmRpcl9kYXRhLCB1OCAqcmF3X3BhY2tldCwKLQkJCSAgICAgc3RydWN0IGk0MGVfcGYgKnBmLCBib29sIGFkZCk7CiBpbnQgaTQwZV9hZGRfZGVsX2ZkaXIoc3RydWN0IGk0MGVfdnNpICp2c2ksCiAJCSAgICAgIHN0cnVjdCBpNDBlX2ZkaXJfZmlsdGVyICppbnB1dCwgYm9vbCBhZGQpOwogdm9pZCBpNDBlX2ZkaXJfY2hlY2tfYW5kX3JlZW5hYmxlKHN0cnVjdCBpNDBlX3BmICpwZik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfYWRtaW5xX2NtZC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2FkbWlucV9jbWQuaAppbmRleCAxMWNmMWE1Li42N2UzOTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfYWRtaW5xX2NtZC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9hZG1pbnFfY21kLmgKQEAgLTIwNCw2ICsyMDQsOSBAQAogCWk0MGVfYXFjX29wY19zdXNwZW5kX3BvcnRfdHgJCQkJPSAweDA0MUIsCiAJaTQwZV9hcWNfb3BjX3Jlc3VtZV9wb3J0X3R4CQkJCT0gMHgwNDFDLAogCWk0MGVfYXFjX29wY19jb25maWd1cmVfcGFydGl0aW9uX2J3CQkJPSAweDA0MUQsCisJLyogaG1jICovCisJaTQwZV9hcWNfb3BjX3F1ZXJ5X2htY19yZXNvdXJjZV9wcm9maWxlCT0gMHgwNTAwLAorCWk0MGVfYXFjX29wY19zZXRfaG1jX3Jlc291cmNlX3Byb2ZpbGUJPSAweDA1MDEsCiAKIAkvKiBwaHkgY29tbWFuZHMqLwogCWk0MGVfYXFjX29wY19nZXRfcGh5X2FiaWxpdGllcwkJPSAweDA2MDAsCkBAIC00NTAsMTMgKzQ1MywxNSBAQAogLyogU2V0IEFSUCBQcm94eSBjb21tYW5kIC8gcmVzcG9uc2UgKGluZGlyZWN0IDB4MDEwNCkgKi8KIHN0cnVjdCBpNDBlX2FxY19hcnBfcHJveHlfZGF0YSB7CiAJX19sZTE2CWNvbW1hbmRfZmxhZ3M7Ci0jZGVmaW5lIEk0MEVfQVFfQVJQX0lOSVRfSVBWNAkweDAwMDgKLSNkZWZpbmUgSTQwRV9BUV9BUlBfVU5TVVBfQ1RMCTB4MDAxMAotI2RlZmluZSBJNDBFX0FRX0FSUF9FTkEJCTB4MDAyMAotI2RlZmluZSBJNDBFX0FRX0FSUF9BRERfSVBWNAkweDAwNDAKLSNkZWZpbmUgSTQwRV9BUV9BUlBfREVMX0lQVjQJMHgwMDgwCisjZGVmaW5lIEk0MEVfQVFfQVJQX0lOSVRfSVBWNAkweDA4MDAKKyNkZWZpbmUgSTQwRV9BUV9BUlBfVU5TVVBfQ1RMCTB4MTAwMAorI2RlZmluZSBJNDBFX0FRX0FSUF9FTkEJCTB4MjAwMAorI2RlZmluZSBJNDBFX0FRX0FSUF9BRERfSVBWNAkweDQwMDAKKyNkZWZpbmUgSTQwRV9BUV9BUlBfREVMX0lQVjQJMHg4MDAwCiAJX19sZTE2CXRhYmxlX2lkOwotCV9fbGUzMglwZnBtX3Byb3h5ZmM7CisJX19sZTMyCWVuYWJsZWRfb2ZmbG9hZHM7CisjZGVmaW5lIEk0MEVfQVFfQVJQX0RJUkVDVEVEX09GRkxPQURfRU5BQkxFCTB4MDAwMDAwMjAKKyNkZWZpbmUgSTQwRV9BUV9BUlBfT0ZGTE9BRF9FTkFCTEUJCTB4MDAwMDA4MDAKIAlfX2xlMzIJaXBfYWRkcjsKIAl1OAltYWNfYWRkcls2XTsKIAl1OAlyZXNlcnZlZFsyXTsKQEAgLTQ3MSwxNyArNDc2LDE5IEBACiAJX19sZTE2CXRhYmxlX2lkeF9pcHY2XzA7CiAJX19sZTE2CXRhYmxlX2lkeF9pcHY2XzE7CiAJX19sZTE2CWNvbnRyb2w7Ci0jZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfQUREXzAJCTB4MDEwMAotI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0RFTF8wCQkweDAyMDAKLSNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9BRERfMQkJMHgwNDAwCi0jZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfREVMXzEJCTB4MDgwMAotI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0FERF9JUFY2XzAJMHgxMDAwCi0jZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfREVMX0lQVjZfMAkweDIwMDAKLSNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9BRERfSVBWNl8xCTB4NDAwMAotI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0RFTF9JUFY2XzEJMHg4MDAwCi0jZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfQ09NTUFORF9TRVEJMHgwMDAxCi0jZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfSU5JVF9JUFY2X1RCTAkweDAwMDIKLSNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9JTklUX01BQ19UQkwJMHgwMDA0CisjZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfQUREXzAJCTB4MDAwMQorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0RFTF8wCQkweDAwMDIKKyNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9BRERfMQkJMHgwMDA0CisjZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfREVMXzEJCTB4MDAwOAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0FERF9JUFY2XzAJMHgwMDEwCisjZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfREVMX0lQVjZfMAkweDAwMjAKKyNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9BRERfSVBWNl8xCTB4MDA0MAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0RFTF9JUFY2XzEJMHgwMDgwCisjZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfQ09NTUFORF9TRVEJMHgwMTAwCisjZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfSU5JVF9JUFY2X1RCTAkweDAyMDAKKyNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9JTklUX01BQ19UQkwJMHgwNDAwCisjZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfT0ZGTE9BRF9FTkFCTEUJMHgwODAwCisjZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfRElSRUNURURfT0ZGTE9BRF9FTkFCTEUJMHgxMDAwCiAJdTgJbWFjX2FkZHJfMFs2XTsKIAl1OAltYWNfYWRkcl8xWzZdOwogCXU4CWxvY2FsX21hY19hZGRyWzZdOwpAQCAtMTU4Miw2ICsxNTg5LDI0IEBACiAKIEk0MEVfQ0hFQ0tfU1RSVUNUX0xFTigweDIyLCBpNDBlX2FxY19jb25maWd1cmVfcGFydGl0aW9uX2J3X2RhdGEpOwogCisvKiBHZXQgYW5kIHNldCB0aGUgYWN0aXZlIEhNQyByZXNvdXJjZSBwcm9maWxlIGFuZCBzdGF0dXMuCisgKiAoZGlyZWN0IDB4MDUwMCkgYW5kIChkaXJlY3QgMHgwNTAxKQorICovCitzdHJ1Y3QgaTQwZV9hcV9nZXRfc2V0X2htY19yZXNvdXJjZV9wcm9maWxlIHsKKwl1OAlwbV9wcm9maWxlOworCXU4CXBlX3ZmX2VuYWJsZWQ7CisJdTgJcmVzZXJ2ZWRbMTRdOworfTsKKworSTQwRV9DSEVDS19DTURfTEVOR1RIKGk0MGVfYXFfZ2V0X3NldF9obWNfcmVzb3VyY2VfcHJvZmlsZSk7CisKK2VudW0gaTQwZV9hcV9obWNfcHJvZmlsZSB7CisJLyogSTQwRV9ITUNfUFJPRklMRV9OT19DSEFOR0UJPSAwLCByZXNlcnZlZCAqLworCUk0MEVfSE1DX1BST0ZJTEVfREVGQVVMVAk9IDEsCisJSTQwRV9ITUNfUFJPRklMRV9GQVZPUl9WRgk9IDIsCisJSTQwRV9ITUNfUFJPRklMRV9FUVVBTAkJPSAzLAorfTsKKwogLyogR2V0IFBIWSBBYmlsaXRpZXMgKGluZGlyZWN0IDB4MDYwMCkgdXNlcyB0aGUgZ2VuZXJpYyBpbmRpcmVjdCBzdHJ1Y3QgKi8KIAogLyogc2V0IGluIHBhcmFtMCBmb3IgZ2V0IHBoeSBhYmlsaXRpZXMgdG8gcmVwb3J0IHF1YWxpZmllZCBtb2R1bGVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfY2xpZW50LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfY2xpZW50LmMKaW5kZXggZTEzNzBjNS4uMjUwZGIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2NsaWVudC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9jbGllbnQuYwpAQCAtMTQ4LDYgKzE0OCwxMSBAQAogCQkJCQkiQ2Fubm90IGxvY2F0ZSBjbGllbnQgaW5zdGFuY2UgdmlydHVhbCBjaGFubmVsIHJlY2VpdmUgcm91dGluZVxuIik7CiAJCQkJY29udGludWU7CiAJCQl9CisJCQlpZiAoIXRlc3RfYml0KF9fSTQwRV9DTElFTlRfSU5TVEFOQ0VfT1BFTkVELAorCQkJCSAgICAgICZjZGV2LT5zdGF0ZSkpIHsKKwkJCQlkZXZfZGJnKCZ2c2ktPmJhY2stPnBkZXYtPmRldiwgIkNsaWVudCBpcyBub3Qgb3BlbiwgYWJvcnQgdmlydGNobmxfcmVjZWl2ZVxuIik7CisJCQkJY29udGludWU7CisJCQl9CiAJCQljZGV2LT5jbGllbnQtPm9wcy0+dmlydGNobmxfcmVjZWl2ZSgmY2Rldi0+bGFuX2luZm8sCiAJCQkJCQkJICAgIGNkZXYtPmNsaWVudCwKIAkJCQkJCQkgICAgdmZfaWQsIG1zZywgbGVuKTsKQEAgLTE4MSw2ICsxODYsMTEgQEAKIAkJCQkJIkNhbm5vdCBsb2NhdGUgY2xpZW50IGluc3RhbmNlIGwyX3BhcmFtX2NoYW5nZSByb3V0aW5lXG4iKTsKIAkJCQljb250aW51ZTsKIAkJCX0KKwkJCWlmICghdGVzdF9iaXQoX19JNDBFX0NMSUVOVF9JTlNUQU5DRV9PUEVORUQsCisJCQkJICAgICAgJmNkZXYtPnN0YXRlKSkgeworCQkJCWRldl9kYmcoJnZzaS0+YmFjay0+cGRldi0+ZGV2LCAiQ2xpZW50IGlzIG5vdCBvcGVuLCBhYm9ydCBsMiBwYXJhbSBjaGFuZ2VcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQogCQkJY2Rldi0+bGFuX2luZm8ucGFyYW1zID0gcGFyYW1zOwogCQkJY2Rldi0+Y2xpZW50LT5vcHMtPmwyX3BhcmFtX2NoYW5nZSgmY2Rldi0+bGFuX2luZm8sCiAJCQkJCQkJICAgY2Rldi0+Y2xpZW50LApAQCAtMTk5LDYgKzIwOSw3IEBACiB2b2lkIGk0MGVfbm90aWZ5X2NsaWVudF9vZl9uZXRkZXZfb3BlbihzdHJ1Y3QgaTQwZV92c2kgKnZzaSkKIHsKIAlzdHJ1Y3QgaTQwZV9jbGllbnRfaW5zdGFuY2UgKmNkZXY7CisJaW50IHJldCA9IDA7CiAKIAlpZiAoIXZzaSkKIAkJcmV0dXJuOwpAQCAtMjExLDcgKzIyMiwxNCBAQAogCQkJCQkiQ2Fubm90IGxvY2F0ZSBjbGllbnQgaW5zdGFuY2Ugb3BlbiByb3V0aW5lXG4iKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCWNkZXYtPmNsaWVudC0+b3BzLT5vcGVuKCZjZGV2LT5sYW5faW5mbywgY2Rldi0+Y2xpZW50KTsKKwkJCWlmICghKHRlc3RfYml0KF9fSTQwRV9DTElFTlRfSU5TVEFOQ0VfT1BFTkVELAorCQkJCSAgICAgICAmY2Rldi0+c3RhdGUpKSkgeworCQkJCXJldCA9IGNkZXYtPmNsaWVudC0+b3BzLT5vcGVuKCZjZGV2LT5sYW5faW5mbywKKwkJCQkJCQkgICAgICBjZGV2LT5jbGllbnQpOworCQkJCWlmICghcmV0KQorCQkJCQlzZXRfYml0KF9fSTQwRV9DTElFTlRfSU5TVEFOQ0VfT1BFTkVELAorCQkJCQkJJmNkZXYtPnN0YXRlKTsKKwkJCX0KIAkJfQogCX0KIAltdXRleF91bmxvY2soJmk0MGVfY2xpZW50X2luc3RhbmNlX211dGV4KTsKQEAgLTI5OCw2ICszMTYsMTEgQEAKIAkJCQkJIkNhbm5vdCBsb2NhdGUgY2xpZW50IGluc3RhbmNlIFZGIHJlc2V0IHJvdXRpbmVcbiIpOwogCQkJCWNvbnRpbnVlOwogCQkJfQorCQkJaWYgKCF0ZXN0X2JpdChfX0k0MEVfQ0xJRU5UX0lOU1RBTkNFX09QRU5FRCwKKwkJCQkgICAgICAmY2Rldi0+c3RhdGUpKSB7CisJCQkJZGV2X2RiZygmcGYtPnBkZXYtPmRldiwgIkNsaWVudCBpcyBub3Qgb3BlbiwgYWJvcnQgdmYtcmVzZXRcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQogCQkJY2Rldi0+Y2xpZW50LT5vcHMtPnZmX3Jlc2V0KCZjZGV2LT5sYW5faW5mbywKIAkJCQkJCSAgICBjZGV2LT5jbGllbnQsIHZmX2lkKTsKIAkJfQpAQCAtMzI4LDYgKzM1MSwxMSBAQAogCQkJCQkiQ2Fubm90IGxvY2F0ZSBjbGllbnQgaW5zdGFuY2UgVkYgZW5hYmxlIHJvdXRpbmVcbiIpOwogCQkJCWNvbnRpbnVlOwogCQkJfQorCQkJaWYgKCF0ZXN0X2JpdChfX0k0MEVfQ0xJRU5UX0lOU1RBTkNFX09QRU5FRCwKKwkJCQkgICAgICAmY2Rldi0+c3RhdGUpKSB7CisJCQkJZGV2X2RiZygmcGYtPnBkZXYtPmRldiwgIkNsaWVudCBpcyBub3Qgb3BlbiwgYWJvcnQgdmYtZW5hYmxlXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KIAkJCWNkZXYtPmNsaWVudC0+b3BzLT52Zl9lbmFibGUoJmNkZXYtPmxhbl9pbmZvLAogCQkJCQkJICAgICBjZGV2LT5jbGllbnQsIG51bV92ZnMpOwogCQl9CkBAIC0zNjIsNiArMzkwLDExIEBACiAJCQkJCSJDYW5ub3QgbG9jYXRlIGNsaWVudCBpbnN0YW5jZSBWRiBjYXBhYmlsaXR5IHJvdXRpbmVcbiIpOwogCQkJCWNvbnRpbnVlOwogCQkJfQorCQkJaWYgKCF0ZXN0X2JpdChfX0k0MEVfQ0xJRU5UX0lOU1RBTkNFX09QRU5FRCwKKwkJCQkgICAgICAmY2Rldi0+c3RhdGUpKSB7CisJCQkJZGV2X2RiZygmcGYtPnBkZXYtPmRldiwgIkNsaWVudCBpcyBub3Qgb3BlbiwgYWJvcnQgdmYtY2FwYWJsZVxuIik7CisJCQkJY29udGludWU7CisJCQl9CiAJCQljYXBhYmxlID0gY2Rldi0+Y2xpZW50LT5vcHMtPnZmX2NhcGFibGUoJmNkZXYtPmxhbl9pbmZvLAogCQkJCQkJCQljZGV2LT5jbGllbnQsCiAJCQkJCQkJCXZmX2lkKTsKQEAgLTQwNywxMiArNDQwLDE0IEBACiAgKiBpNDBlX2NsaWVudF9hZGRfaW5zdGFuY2UgLSBhZGQgYSBjbGllbnQgaW5zdGFuY2Ugc3RydWN0IHRvIHRoZSBpbnN0YW5jZSBsaXN0CiAgKiBAcGY6IHBvaW50ZXIgdG8gdGhlIGJvYXJkIHN0cnVjdAogICogQGNsaWVudDogcG9pbnRlciB0byBhIGNsaWVudCBzdHJ1Y3QgaW4gdGhlIGNsaWVudCBsaXN0LgorICogQGV4aXN0aW5nOiBpZiB0aGVyZSB3YXMgYWxyZWFkeSBhbiBleGlzdGluZyBpbnN0YW5jZQogICoKLSAqIFJldHVybnMgY2RldiBwdHIgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlCisgKiBSZXR1cm5zIGNkZXYgcHRyIG9uIHN1Y2Nlc3Mgb3IgaWYgYWxyZWFkeSBleGlzdHMsIE5VTEwgb24gZmFpbHVyZQogICoqLwogc3RhdGljCiBzdHJ1Y3QgaTQwZV9jbGllbnRfaW5zdGFuY2UgKmk0MGVfY2xpZW50X2FkZF9pbnN0YW5jZShzdHJ1Y3QgaTQwZV9wZiAqcGYsCi0JCQkJCQkgICAgICBzdHJ1Y3QgaTQwZV9jbGllbnQgKmNsaWVudCkKKwkJCQkJCSAgICAgc3RydWN0IGk0MGVfY2xpZW50ICpjbGllbnQsCisJCQkJCQkgICAgIGJvb2wgKmV4aXN0aW5nKQogewogCXN0cnVjdCBpNDBlX2NsaWVudF9pbnN0YW5jZSAqY2RldjsKIAlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKm1hYyA9IE5VTEw7CkBAIC00MjEsNyArNDU2LDcgQEAKIAltdXRleF9sb2NrKCZpNDBlX2NsaWVudF9pbnN0YW5jZV9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjZGV2LCAmaTQwZV9jbGllbnRfaW5zdGFuY2VzLCBsaXN0KSB7CiAJCWlmICgoY2Rldi0+bGFuX2luZm8ucGYgPT0gcGYpICYmIChjZGV2LT5jbGllbnQgPT0gY2xpZW50KSkgewotCQkJY2RldiA9IE5VTEw7CisJCQkqZXhpc3RpbmcgPSB0cnVlOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CkBAIC01MDUsNiArNTQwLDcgQEAKIHsKIAlzdHJ1Y3QgaTQwZV9jbGllbnRfaW5zdGFuY2UgKmNkZXY7CiAJc3RydWN0IGk0MGVfY2xpZW50ICpjbGllbnQ7CisJYm9vbCBleGlzdGluZyA9IGZhbHNlOwogCWludCByZXQgPSAwOwogCiAJaWYgKCEocGYtPmZsYWdzICYgSTQwRV9GTEFHX1NFUlZJQ0VfQ0xJRU5UX1JFUVVFU1RFRCkpCkBAIC01MjgsMTkgKzU2NCwyNyBAQAogCQkJLyogY2hlY2sgaWYgTDIgVlNJIGlzIHVwLCBpZiBub3Qgd2UgYXJlIG5vdCByZWFkeSAqLwogCQkJaWYgKHRlc3RfYml0KF9fSTQwRV9ET1dOLCAmcGYtPnZzaVtwZi0+bGFuX3ZzaV0tPnN0YXRlKSkKIAkJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCWRldl93YXJuKCZwZi0+cGRldi0+ZGV2LCAiVGhpcyBjbGllbnQgJXMgaXMgYmVpbmcgaW5zdGFuY2lhdGVkIGF0IHByb2JlXG4iLAorCQkJCSBjbGllbnQtPm5hbWUpOwogCQl9CiAKIAkJLyogQWRkIHRoZSBjbGllbnQgaW5zdGFuY2UgdG8gdGhlIGluc3RhbmNlIGxpc3QgKi8KLQkJY2RldiA9IGk0MGVfY2xpZW50X2FkZF9pbnN0YW5jZShwZiwgY2xpZW50KTsKKwkJY2RldiA9IGk0MGVfY2xpZW50X2FkZF9pbnN0YW5jZShwZiwgY2xpZW50LCAmZXhpc3RpbmcpOwogCQlpZiAoIWNkZXYpCiAJCQljb250aW51ZTsKIAotCQkvKiBBbHNvIHVwIHRoZSByZWZfY250IG9mIG5vLiBvZiBpbnN0YW5jZXMgb2YgdGhpcyBjbGllbnQgKi8KLQkJYXRvbWljX2luYygmY2xpZW50LT5yZWZfY250KTsKLQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJBZGRlZCBpbnN0YW5jZSBvZiBDbGllbnQgJXMgdG8gUEYlZCBidXM9MHglMDJ4IGZ1bmM9MHglMDJ4XG4iLAotCQkJIGNsaWVudC0+bmFtZSwgcGYtPmh3LnBmX2lkLAotCQkJIHBmLT5ody5idXMuZGV2aWNlLCBwZi0+aHcuYnVzLmZ1bmMpOworCQlpZiAoIWV4aXN0aW5nKSB7CisJCQkvKiBBbHNvIHVwIHRoZSByZWZfY250IGZvciBuby4gb2YgaW5zdGFuY2VzIG9mIHRoaXMKKwkJCSAqIGNsaWVudC4KKwkJCSAqLworCQkJYXRvbWljX2luYygmY2xpZW50LT5yZWZfY250KTsKKwkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiQWRkZWQgaW5zdGFuY2Ugb2YgQ2xpZW50ICVzIHRvIFBGJWQgYnVzPTB4JTAyeCBmdW5jPTB4JTAyeFxuIiwKKwkJCQkgY2xpZW50LT5uYW1lLCBwZi0+aHcucGZfaWQsCisJCQkJIHBmLT5ody5idXMuZGV2aWNlLCBwZi0+aHcuYnVzLmZ1bmMpOworCQl9CiAKKwkJbXV0ZXhfbG9jaygmaTQwZV9jbGllbnRfaW5zdGFuY2VfbXV0ZXgpOwogCQkvKiBTZW5kIGFuIE9wZW4gcmVxdWVzdCB0byB0aGUgY2xpZW50ICovCiAJCWF0b21pY19pbmMoJmNkZXYtPnJlZl9jbnQpOwogCQlpZiAoY2xpZW50LT5vcHMgJiYgY2xpZW50LT5vcHMtPm9wZW4pCkBAIC01NTAsMTAgKzU5NCwxMiBAQAogCQkJc2V0X2JpdChfX0k0MEVfQ0xJRU5UX0lOU1RBTkNFX09QRU5FRCwgJmNkZXYtPnN0YXRlKTsKIAkJfSBlbHNlIHsKIAkJCS8qIHJlbW92ZSBjbGllbnQgaW5zdGFuY2UgKi8KKwkJCW11dGV4X3VubG9jaygmaTQwZV9jbGllbnRfaW5zdGFuY2VfbXV0ZXgpOwogCQkJaTQwZV9jbGllbnRfZGVsX2luc3RhbmNlKHBmLCBjbGllbnQpOwogCQkJYXRvbWljX2RlYygmY2xpZW50LT5yZWZfY250KTsKIAkJCWNvbnRpbnVlOwogCQl9CisJCW11dGV4X3VubG9jaygmaTQwZV9jbGllbnRfaW5zdGFuY2VfbXV0ZXgpOwogCX0KIAltdXRleF91bmxvY2soJmk0MGVfY2xpZW50X211dGV4KTsKIH0KQEAgLTU4OCw3ICs2MzQsOCBAQAogCQkgcGYtPmh3LnBmX2lkLCBwZi0+aHcuYnVzLmRldmljZSwgcGYtPmh3LmJ1cy5mdW5jKTsKIAogCS8qIFNpbmNlIGluIHNvbWUgY2FzZXMgcmVnaXN0ZXIgbWF5IGhhdmUgaGFwcGVuZWQgYmVmb3JlIGEgZGV2aWNlIGdldHMKLQkgKiBhZGRlZCwgd2UgY2FuIHNjaGVkdWxlIGEgc3VidGFzayB0byBnbyBpbml0aWF0ZSB0aGUgY2xpZW50cy4KKwkgKiBhZGRlZCwgd2UgY2FuIHNjaGVkdWxlIGEgc3VidGFzayB0byBnbyBpbml0aWF0ZSB0aGUgY2xpZW50cyBpZgorCSAqIHRoZXkgY2FuIGJlIGxhdW5jaGVkIGF0IHByb2JlIHRpbWUuCiAJICovCiAJcGYtPmZsYWdzIHw9IEk0MEVfRkxBR19TRVJWSUNFX0NMSUVOVF9SRVFVRVNURUQ7CiAJaTQwZV9zZXJ2aWNlX2V2ZW50X3NjaGVkdWxlKHBmKTsKQEAgLTYzNSw3ICs2ODIsNyBAQAogc3RhdGljIGludCBpNDBlX2NsaWVudF9yZWxlYXNlKHN0cnVjdCBpNDBlX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBpNDBlX2NsaWVudF9pbnN0YW5jZSAqY2RldiwgKnRtcDsKLQlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSBOVUxMOworCXN0cnVjdCBpNDBlX3BmICpwZjsKIAlpbnQgcmV0ID0gMDsKIAogCUxJU1RfSEVBRChjZGV2c190bXApOwpAQCAtNjQ1LDEyICs2OTIsMTIgQEAKIAkJaWYgKHN0cm5jbXAoY2Rldi0+Y2xpZW50LT5uYW1lLCBjbGllbnQtPm5hbWUsCiAJCQkgICAgSTQwRV9DTElFTlRfU1RSX0xFTkdUSCkpCiAJCQljb250aW51ZTsKKwkJcGYgPSAoc3RydWN0IGk0MGVfcGYgKiljZGV2LT5sYW5faW5mby5wZjsKIAkJaWYgKHRlc3RfYml0KF9fSTQwRV9DTElFTlRfSU5TVEFOQ0VfT1BFTkVELCAmY2Rldi0+c3RhdGUpKSB7CiAJCQlpZiAoYXRvbWljX3JlYWQoJmNkZXYtPnJlZl9jbnQpID4gMCkgewogCQkJCXJldCA9IEk0MEVfRVJSX05PVF9SRUFEWTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJCXBmID0gKHN0cnVjdCBpNDBlX3BmICopY2Rldi0+bGFuX2luZm8ucGY7CiAJCQlpZiAoY2xpZW50LT5vcHMgJiYgY2xpZW50LT5vcHMtPmNsb3NlKQogCQkJCWNsaWVudC0+b3BzLT5jbG9zZSgmY2Rldi0+bGFuX2luZm8sIGNsaWVudCwKIAkJCQkJCSAgIGZhbHNlKTsKQEAgLTY2Miw4ICs3MDksNyBAQAogCQkJCSBjbGllbnQtPm5hbWUsIHBmLT5ody5wZl9pZCk7CiAJCX0KIAkJLyogZGVsZXRlIHRoZSBjbGllbnQgaW5zdGFuY2UgZnJvbSB0aGUgbGlzdCAqLwotCQlsaXN0X2RlbCgmY2Rldi0+bGlzdCk7Ci0JCWxpc3RfYWRkKCZjZGV2LT5saXN0LCAmY2RldnNfdG1wKTsKKwkJbGlzdF9tb3ZlKCZjZGV2LT5saXN0LCAmY2RldnNfdG1wKTsKIAkJYXRvbWljX2RlYygmY2xpZW50LT5yZWZfY250KTsKIAkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJEZWxldGVkIGNsaWVudCBpbnN0YW5jZSBvZiBDbGllbnQgJXNcbiIsCiAJCQkgY2xpZW50LT5uYW1lKTsKQEAgLTc5Miw3ICs4MzgsOCBAQAogCQkJd3IzMihodywgSTQwRV9QRklOVF9BRVFDVEwsIHJlZyk7CiAJCX0KIAl9Ci0KKwkvKiBNaXRpZ2F0ZSBzeW5jIHByb2JsZW1zIHdpdGggaXdhcnAgVkYgZHJpdmVyICovCisJaTQwZV9mbHVzaChodyk7CiAJcmV0dXJuIDA7CiBlcnI6CiAJa2ZyZWUobGRldi0+cXZsaXN0X2luZm8pOwpAQCAtOTkwLDcgKzEwMzcsNiBAQAogCWlmICghaTQwZV9jbGllbnRfaXNfcmVnaXN0ZXJlZChjbGllbnQpKSB7CiAJCXByX2luZm8oImk0MGU6IENsaWVudCAlcyBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZFxuIiwKIAkJCWNsaWVudC0+bmFtZSk7Ci0JCW11dGV4X3VubG9jaygmaTQwZV9jbGllbnRfbXV0ZXgpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfY2xpZW50LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfY2xpZW50LmgKaW5kZXggYTQ2MDFkOS4uMzhhNmMzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2NsaWVudC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9jbGllbnQuaApAQCAtMzYsOSArMzYsOSBAQAogI2RlZmluZSBJNDBFX0NMSUVOVF9WRVJTSU9OX01JTk9SIDAxCiAjZGVmaW5lIEk0MEVfQ0xJRU5UX1ZFUlNJT05fQlVJTEQgMDAKICNkZWZpbmUgSTQwRV9DTElFTlRfVkVSU0lPTl9TVFIgICAgIFwKLQlYU1RSSU5HSUZZKEk0MEVfQ0xJRU5UX1ZFUlNJT05fTUFKT1IpICIuIiBcCi0JWFNUUklOR0lGWShJNDBFX0NMSUVOVF9WRVJTSU9OX01JTk9SKSAiLiIgXAotCVhTVFJJTkdJRlkoSTQwRV9DTElFTlRfVkVSU0lPTl9CVUlMRCkKKwlfX3N0cmluZ2lmeShJNDBFX0NMSUVOVF9WRVJTSU9OX01BSk9SKSAiLiIgXAorCV9fc3RyaW5naWZ5KEk0MEVfQ0xJRU5UX1ZFUlNJT05fTUlOT1IpICIuIiBcCisJX19zdHJpbmdpZnkoSTQwRV9DTElFTlRfVkVSU0lPTl9CVUlMRCkKIAogc3RydWN0IGk0MGVfY2xpZW50X3ZlcnNpb24gewogCXU4IG1ham9yOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2RlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9kZWJ1Z2ZzLmMKaW5kZXggMDVjZjlhNy4uMGMxODc1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2RlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZGVidWdmcy5jCkBAIC0xMDU0LDYgKzEwNTQsNyBAQAogCQkJc3RydWN0IGk0MGVfZGNieF9jb25maWcgKnJfY2ZnID0KIAkJCQkJCSZwZi0+aHcucmVtb3RlX2RjYnhfY29uZmlnOwogCQkJaW50IGksIHJldDsKKwkJCXUzMiBzd2l0Y2hfaWQ7CiAKIAkJCWJ3X2RhdGEgPSBremFsbG9jKHNpemVvZigKIAkJCQkgICAgc3RydWN0IGk0MGVfYXFjX3F1ZXJ5X3BvcnRfZXRzX2NvbmZpZ19yZXNwKSwKQEAgLTEwNjMsOCArMTA2NCwxMiBAQAogCQkJCWdvdG8gY29tbWFuZF93cml0ZV9kb25lOwogCQkJfQogCisJCQl2c2kgPSBwZi0+dnNpW3BmLT5sYW5fdnNpXTsKKwkJCXN3aXRjaF9pZCA9CisJCQkJdnNpLT5pbmZvLnN3aXRjaF9pZCAmIEk0MEVfQVFfVlNJX1NXX0lEX01BU0s7CisKIAkJCXJldCA9IGk0MGVfYXFfcXVlcnlfcG9ydF9ldHNfY29uZmlnKCZwZi0+aHcsCi0JCQkJCQkJICAgIHBmLT5tYWNfc2VpZCwKKwkJCQkJCQkgICAgc3dpdGNoX2lkLAogCQkJCQkJCSAgICBid19kYXRhLCBOVUxMKTsKIAkJCWlmIChyZXQpIHsKIAkJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKQEAgLTE0MjUsODQgKzE0MzAsNiBAQAogCQlidWZmID0gTlVMTDsKIAkJa2ZyZWUoZGVzYyk7CiAJCWRlc2MgPSBOVUxMOwotCX0gZWxzZSBpZiAoKHN0cm5jbXAoY21kX2J1ZiwgImFkZCBmZF9maWx0ZXIiLCAxMykgPT0gMCkgfHwKLQkJICAgKHN0cm5jbXAoY21kX2J1ZiwgInJlbSBmZF9maWx0ZXIiLCAxMykgPT0gMCkpIHsKLQkJc3RydWN0IGk0MGVfZmRpcl9maWx0ZXIgZmRfZGF0YTsKLQkJdTE2IHBhY2tldF9sZW4sIGksIGogPSAwOwotCQljaGFyICphc2NfcGFja2V0OwotCQl1OCAqcmF3X3BhY2tldDsKLQkJYm9vbCBhZGQgPSBmYWxzZTsKLQkJaW50IHJldDsKLQotCQlpZiAoIShwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCkpCi0JCQlnb3RvIGNvbW1hbmRfd3JpdGVfZG9uZTsKLQotCQlpZiAoc3RybmNtcChjbWRfYnVmLCAiYWRkIiwgMykgPT0gMCkKLQkJCWFkZCA9IHRydWU7Ci0KLQkJaWYgKGFkZCAmJiAocGYtPmF1dG9fZGlzYWJsZV9mbGFncyAmIEk0MEVfRkxBR19GRF9TQl9FTkFCTEVEKSkKLQkJCWdvdG8gY29tbWFuZF93cml0ZV9kb25lOwotCi0JCWFzY19wYWNrZXQgPSBremFsbG9jKEk0MEVfRkRJUl9NQVhfUkFXX1BBQ0tFVF9TSVpFLAotCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghYXNjX3BhY2tldCkKLQkJCWdvdG8gY29tbWFuZF93cml0ZV9kb25lOwotCi0JCXJhd19wYWNrZXQgPSBremFsbG9jKEk0MEVfRkRJUl9NQVhfUkFXX1BBQ0tFVF9TSVpFLAotCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0KLQkJaWYgKCFyYXdfcGFja2V0KSB7Ci0JCQlrZnJlZShhc2NfcGFja2V0KTsKLQkJCWFzY19wYWNrZXQgPSBOVUxMOwotCQkJZ290byBjb21tYW5kX3dyaXRlX2RvbmU7Ci0JCX0KLQotCQljbnQgPSBzc2NhbmYoJmNtZF9idWZbMTNdLAotCQkJICAgICAiJWh4ICUyaGh4ICUyaGh4ICVoeCAlMmhoeCAlMmhoeCAlaHggJXggJWhkICU1MTFzIiwKLQkJCSAgICAgJmZkX2RhdGEucV9pbmRleCwKLQkJCSAgICAgJmZkX2RhdGEuZmxleF9vZmYsICZmZF9kYXRhLnBjdHlwZSwKLQkJCSAgICAgJmZkX2RhdGEuZGVzdF92c2ksICZmZF9kYXRhLmRlc3RfY3RsLAotCQkJICAgICAmZmRfZGF0YS5mZF9zdGF0dXMsICZmZF9kYXRhLmNudF9pbmRleCwKLQkJCSAgICAgJmZkX2RhdGEuZmRfaWQsICZwYWNrZXRfbGVuLCBhc2NfcGFja2V0KTsKLQkJaWYgKGNudCAhPSAxMCkgewotCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCi0JCQkJICJwcm9ncmFtIGZkX2ZpbHRlcjogYmFkIGNvbW1hbmQgc3RyaW5nLCBjbnQ9JWRcbiIsCi0JCQkJIGNudCk7Ci0JCQlrZnJlZShhc2NfcGFja2V0KTsKLQkJCWFzY19wYWNrZXQgPSBOVUxMOwotCQkJa2ZyZWUocmF3X3BhY2tldCk7Ci0JCQlnb3RvIGNvbW1hbmRfd3JpdGVfZG9uZTsKLQkJfQotCi0JCS8qIGZpeCBwYWNrZXQgbGVuZ3RoIGlmIHVzZXIgZW50ZXJlZCAwICovCi0JCWlmIChwYWNrZXRfbGVuID09IDApCi0JCQlwYWNrZXRfbGVuID0gSTQwRV9GRElSX01BWF9SQVdfUEFDS0VUX1NJWkU7Ci0KLQkJLyogbWFrZSBzdXJlIHRvIGNoZWNrIHRoZSBtYXggYXMgd2VsbCAqLwotCQlwYWNrZXRfbGVuID0gbWluX3QodTE2LAotCQkJCSAgIHBhY2tldF9sZW4sIEk0MEVfRkRJUl9NQVhfUkFXX1BBQ0tFVF9TSVpFKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgcGFja2V0X2xlbjsgaSsrKSB7Ci0JCQljbnQgPSBzc2NhbmYoJmFzY19wYWNrZXRbal0sICIlMmhoeCAiLCAmcmF3X3BhY2tldFtpXSk7Ci0JCQlpZiAoIWNudCkKLQkJCQlicmVhazsKLQkJCWogKz0gMzsKLQkJfQotCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIkZEIHJhdyBwYWNrZXQgZHVtcFxuIik7Ci0JCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgIkZEIHJhdyBwYWNrZXQ6ICIsCi0JCQkgICAgICAgRFVNUF9QUkVGSVhfT0ZGU0VULCAxNiwgMSwKLQkJCSAgICAgICByYXdfcGFja2V0LCBwYWNrZXRfbGVuLCB0cnVlKTsKLQkJcmV0ID0gaTQwZV9wcm9ncmFtX2ZkaXJfZmlsdGVyKCZmZF9kYXRhLCByYXdfcGFja2V0LCBwZiwgYWRkKTsKLQkJaWYgKCFyZXQpIHsKLQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiRmlsdGVyIGNvbW1hbmQgc2VuZCBTdGF0dXMgOiBTdWNjZXNzXG4iKTsKLQkJfSBlbHNlIHsKLQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAotCQkJCSAiRmlsdGVyIGNvbW1hbmQgc2VuZCBmYWlsZWQgJWRcbiIsIHJldCk7Ci0JCX0KLQkJa2ZyZWUocmF3X3BhY2tldCk7Ci0JCXJhd19wYWNrZXQgPSBOVUxMOwotCQlrZnJlZShhc2NfcGFja2V0KTsKLQkJYXNjX3BhY2tldCA9IE5VTEw7CiAJfSBlbHNlIGlmIChzdHJuY21wKGNtZF9idWYsICJmZCBjdXJyZW50IGNudCIsIDE0KSA9PSAwKSB7CiAJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiRkQgY3VycmVudCB0b3RhbCBmaWx0ZXIgY291bnQgZm9yIHRoaXMgaW50ZXJmYWNlOiAlZFxuIiwKIAkJCSBpNDBlX2dldF9jdXJyZW50X2ZkX2NvdW50KHBmKSk7CkBAIC0xNzI3LDggKzE2NTQsNiBAQAogCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIiAgZ2xvYnJcbiIpOwogCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIiAgc2VuZCBhcV9jbWQgPGZsYWdzPiA8b3Bjb2RlPiA8ZGF0YWxlbj4gPHJldHZhbD4gPGNvb2tpZV9oPiA8Y29va2llX2w+IDxwYXJhbTA+IDxwYXJhbTE+IDxwYXJhbTI+IDxwYXJhbTM+XG4iKTsKIAkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICIgIHNlbmQgaW5kaXJlY3QgYXFfY21kIDxmbGFncz4gPG9wY29kZT4gPGRhdGFsZW4+IDxyZXR2YWw+IDxjb29raWVfaD4gPGNvb2tpZV9sPiA8cGFyYW0wPiA8cGFyYW0xPiA8cGFyYW0yPiA8cGFyYW0zPiA8YnVmZmVyX2xlbj5cbiIpOwotCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIiAgYWRkIGZkX2ZpbHRlciA8ZGVzdCBxX2luZGV4PiA8ZmxleF9vZmY+IDxwY3R5cGU+IDxkZXN0X3ZzaT4gPGRlc3RfY3RsPiA8ZmRfc3RhdHVzPiA8Y250X2luZGV4PiA8ZmRfaWQ+IDxwYWNrZXRfbGVuPiA8cGFja2V0PlxuIik7Ci0JCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiICByZW0gZmRfZmlsdGVyIDxkZXN0IHFfaW5kZXg+IDxmbGV4X29mZj4gPHBjdHlwZT4gPGRlc3RfdnNpPiA8ZGVzdF9jdGw+IDxmZF9zdGF0dXM+IDxjbnRfaW5kZXg+IDxmZF9pZD4gPHBhY2tldF9sZW4+IDxwYWNrZXQ+XG4iKTsKIAkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICIgIGZkIGN1cnJlbnQgY250Iik7CiAJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiICBsbGRwIHN0YXJ0XG4iKTsKIAkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICIgIGxsZHAgc3RvcFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2V0aHRvb2wuYwppbmRleCBjOTEyZTA0Li45MmJjODg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9ldGh0b29sLmMKQEAgLTE1NjAsMTMgKzE1NjAsMTMgQEAKIAkJfQogI2VuZGlmCiAJCWZvciAoaSA9IDA7IGkgPCB2c2ktPm51bV9xdWV1ZV9wYWlyczsgaSsrKSB7Ci0JCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sICJ0eC0ldS50eF9wYWNrZXRzIiwgaSk7CisJCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sICJ0eC0lZC50eF9wYWNrZXRzIiwgaSk7CiAJCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJCXNucHJpbnRmKHAsIEVUSF9HU1RSSU5HX0xFTiwgInR4LSV1LnR4X2J5dGVzIiwgaSk7CisJCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sICJ0eC0lZC50eF9ieXRlcyIsIGkpOwogCQkJcCArPSBFVEhfR1NUUklOR19MRU47Ci0JCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sICJyeC0ldS5yeF9wYWNrZXRzIiwgaSk7CisJCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sICJyeC0lZC5yeF9wYWNrZXRzIiwgaSk7CiAJCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJCXNucHJpbnRmKHAsIEVUSF9HU1RSSU5HX0xFTiwgInJ4LSV1LnJ4X2J5dGVzIiwgaSk7CisJCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sICJyeC0lZC5yeF9ieXRlcyIsIGkpOwogCQkJcCArPSBFVEhfR1NUUklOR19MRU47CiAJCX0KIAkJaWYgKHZzaSAhPSBwZi0+dnNpW3BmLT5sYW5fdnNpXSB8fCBwZi0+aHcucGFydGl0aW9uX2lkICE9IDEpCkBAIC0xNTgxLDE2ICsxNTgxLDE2IEBACiAJCQl9CiAJCQlmb3IgKGkgPSAwOyBpIDwgSTQwRV9NQVhfVFJBRkZJQ19DTEFTUzsgaSsrKSB7CiAJCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLAotCQkJCQkgInZlYi50Y18ldV90eF9wYWNrZXRzIiwgaSk7CisJCQkJCSAidmViLnRjXyVkX3R4X3BhY2tldHMiLCBpKTsKIAkJCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKIAkJCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sCi0JCQkJCSAidmViLnRjXyV1X3R4X2J5dGVzIiwgaSk7CisJCQkJCSAidmViLnRjXyVkX3R4X2J5dGVzIiwgaSk7CiAJCQkJcCArPSBFVEhfR1NUUklOR19MRU47CiAJCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLAotCQkJCQkgInZlYi50Y18ldV9yeF9wYWNrZXRzIiwgaSk7CisJCQkJCSAidmViLnRjXyVkX3J4X3BhY2tldHMiLCBpKTsKIAkJCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKIAkJCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sCi0JCQkJCSAidmViLnRjXyV1X3J4X2J5dGVzIiwgaSk7CisJCQkJCSAidmViLnRjXyVkX3J4X2J5dGVzIiwgaSk7CiAJCQkJcCArPSBFVEhfR1NUUklOR19MRU47CiAJCQl9CiAJCX0KQEAgLTE2MDEsMjMgKzE2MDEsMjMgQEAKIAkJfQogCQlmb3IgKGkgPSAwOyBpIDwgSTQwRV9NQVhfVVNFUl9QUklPUklUWTsgaSsrKSB7CiAJCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sCi0JCQkJICJwb3J0LnR4X3ByaW9yaXR5XyV1X3hvbiIsIGkpOworCQkJCSAicG9ydC50eF9wcmlvcml0eV8lZF94b24iLCBpKTsKIAkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwogCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLAotCQkJCSAicG9ydC50eF9wcmlvcml0eV8ldV94b2ZmIiwgaSk7CisJCQkJICJwb3J0LnR4X3ByaW9yaXR5XyVkX3hvZmYiLCBpKTsKIAkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwogCQl9CiAJCWZvciAoaSA9IDA7IGkgPCBJNDBFX01BWF9VU0VSX1BSSU9SSVRZOyBpKyspIHsKIAkJCXNucHJpbnRmKHAsIEVUSF9HU1RSSU5HX0xFTiwKLQkJCQkgInBvcnQucnhfcHJpb3JpdHlfJXVfeG9uIiwgaSk7CisJCQkJICJwb3J0LnJ4X3ByaW9yaXR5XyVkX3hvbiIsIGkpOwogCQkJcCArPSBFVEhfR1NUUklOR19MRU47CiAJCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sCi0JCQkJICJwb3J0LnJ4X3ByaW9yaXR5XyV1X3hvZmYiLCBpKTsKKwkJCQkgInBvcnQucnhfcHJpb3JpdHlfJWRfeG9mZiIsIGkpOwogCQkJcCArPSBFVEhfR1NUUklOR19MRU47CiAJCX0KIAkJZm9yIChpID0gMDsgaSA8IEk0MEVfTUFYX1VTRVJfUFJJT1JJVFk7IGkrKykgewogCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLAotCQkJCSAicG9ydC5yeF9wcmlvcml0eV8ldV94b25fMl94b2ZmIiwgaSk7CisJCQkJICJwb3J0LnJ4X3ByaW9yaXR5XyVkX3hvbl8yX3hvZmYiLCBpKTsKIAkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwogCQl9CiAJCS8qIEJVR19PTihwIC0gZGF0YSAhPSBJNDBFX1NUQVRTX0xFTiAqIEVUSF9HU1RSSU5HX0xFTik7ICovCkBAIC0xOTcwLDExICsxOTcwLDIyIEBACiAgKiAxMjV1cyAoODAwMCBpbnRlcnJ1cHRzIHBlciBzZWNvbmQpID09IElUUig2MikKICAqLwogCisvKioKKyAqIF9faTQwZV9nZXRfY29hbGVzY2UgLSBnZXQgcGVyLXF1ZXVlIGNvYWxlc2NlIHNldHRpbmdzCisgKiBAbmV0ZGV2OiB0aGUgbmV0ZGV2IHRvIGNoZWNrCisgKiBAZWM6IGV0aHRvb2wgY29hbGVzY2UgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBxdWV1ZTogd2hpY2ggcXVldWUgdG8gcGljaworICoKKyAqIEdldHMgdGhlIHBlci1xdWV1ZSBzZXR0aW5ncyBmb3IgY29hbGVzY2VuY2UuIFNwZWNpZmljYWxseSBSeCBhbmQgVHggdXNlY3MKKyAqIGFyZSBwZXIgcXVldWUuIElmIHF1ZXVlIGlzIDwwIHRoZW4gd2UgZGVmYXVsdCB0byBxdWV1ZSAwIGFzIHRoZQorICogcmVwcmVzZW50YXRpdmUgdmFsdWUuCisgKiovCiBzdGF0aWMgaW50IF9faTQwZV9nZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMsCiAJCQkgICAgICAgaW50IHF1ZXVlKQogewogCXN0cnVjdCBpNDBlX25ldGRldl9wcml2ICpucCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGk0MGVfcmluZyAqcnhfcmluZywgKnR4X3Jpbmc7CiAJc3RydWN0IGk0MGVfdnNpICp2c2kgPSBucC0+dnNpOwogCiAJZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSA9IHZzaS0+d29ya19saW1pdDsKQEAgLTE5ODksMTQgKzIwMDAsMTggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKElUUl9JU19EWU5BTUlDKHZzaS0+cnhfcmluZ3NbcXVldWVdLT5yeF9pdHJfc2V0dGluZykpCisJcnhfcmluZyA9IHZzaS0+cnhfcmluZ3NbcXVldWVdOworCXR4X3JpbmcgPSB2c2ktPnR4X3JpbmdzW3F1ZXVlXTsKKworCWlmIChJVFJfSVNfRFlOQU1JQyhyeF9yaW5nLT5yeF9pdHJfc2V0dGluZykpCiAJCWVjLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UgPSAxOwogCi0JaWYgKElUUl9JU19EWU5BTUlDKHZzaS0+dHhfcmluZ3NbcXVldWVdLT50eF9pdHJfc2V0dGluZykpCisJaWYgKElUUl9JU19EWU5BTUlDKHR4X3JpbmctPnR4X2l0cl9zZXR0aW5nKSkKIAkJZWMtPnVzZV9hZGFwdGl2ZV90eF9jb2FsZXNjZSA9IDE7CiAKLQllYy0+cnhfY29hbGVzY2VfdXNlY3MgPSB2c2ktPnJ4X3JpbmdzW3F1ZXVlXS0+cnhfaXRyX3NldHRpbmcgJiB+STQwRV9JVFJfRFlOQU1JQzsKLQllYy0+dHhfY29hbGVzY2VfdXNlY3MgPSB2c2ktPnR4X3JpbmdzW3F1ZXVlXS0+dHhfaXRyX3NldHRpbmcgJiB+STQwRV9JVFJfRFlOQU1JQzsKKwllYy0+cnhfY29hbGVzY2VfdXNlY3MgPSByeF9yaW5nLT5yeF9pdHJfc2V0dGluZyAmIH5JNDBFX0lUUl9EWU5BTUlDOworCWVjLT50eF9jb2FsZXNjZV91c2VjcyA9IHR4X3JpbmctPnR4X2l0cl9zZXR0aW5nICYgfkk0MEVfSVRSX0RZTkFNSUM7CisKIAogCS8qIHdlIHVzZSB0aGUgX3VzZWNzX2hpZ2ggdG8gc3RvcmUvc2V0IHRoZSBpbnRlcnJ1cHQgcmF0ZSBsaW1pdAogCSAqIHRoYXQgdGhlIGhhcmR3YXJlIHN1cHBvcnRzLCB0aGF0IGFsbW9zdCBidXQgbm90IHF1aXRlCkBAIC0yMDEwLDE4ICsyMDI1LDQ0IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogaTQwZV9nZXRfY29hbGVzY2UgLSBnZXQgYSBuZXRkZXYncyBjb2FsZXNjZSBzZXR0aW5ncworICogQG5ldGRldjogdGhlIG5ldGRldiB0byBjaGVjaworICogQGVjOiBldGh0b29sIGNvYWxlc2NlIGRhdGEgc3RydWN0dXJlCisgKgorICogR2V0cyB0aGUgY29hbGVzY2Ugc2V0dGluZ3MgZm9yIGEgcGFydGljdWxhciBuZXRkZXYuIE5vdGUgdGhhdCBpZiB1c2VyIGhhcworICogbW9kaWZpZWQgcGVyLXF1ZXVlIHNldHRpbmdzLCB0aGlzIG9ubHkgZ3VhcmFudGVlcyB0byByZXByZXNlbnQgcXVldWUgMC4gU2VlCisgKiBfX2k0MGVfZ2V0X2NvYWxlc2NlIGZvciBtb3JlIGRldGFpbHMuCisgKiovCiBzdGF0aWMgaW50IGk0MGVfZ2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJCQkgICAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKIHsKIAlyZXR1cm4gX19pNDBlX2dldF9jb2FsZXNjZShuZXRkZXYsIGVjLCAtMSk7CiB9CiAKKy8qKgorICogaTQwZV9nZXRfcGVyX3F1ZXVlX2NvYWxlc2NlIC0gZ2V0cyBjb2FsZXNjZSBzZXR0aW5ncyBmb3IgcGFydGljdWxhciBxdWV1ZQorICogQG5ldGRldjogbmV0ZGV2IHN0cnVjdHVyZQorICogQGVjOiBldGh0b29sJ3MgY29hbGVzY2Ugc2V0dGluZ3MKKyAqIEBxdWV1ZTogdGhlIHBhcnRpY3VsYXIgcXVldWUgdG8gcmVhZAorICoKKyAqIFdpbGwgcmVhZCBhIHNwZWNpZmljIHF1ZXVlJ3MgY29hbGVzY2Ugc2V0dGluZ3MKKyAqKi8KIHN0YXRpYyBpbnQgaTQwZV9nZXRfcGVyX3F1ZXVlX2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBxdWV1ZSwKIAkJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjKQogewogCXJldHVybiBfX2k0MGVfZ2V0X2NvYWxlc2NlKG5ldGRldiwgZWMsIHF1ZXVlKTsKIH0KIAorLyoqCisgKiBpNDBlX3NldF9pdHJfcGVyX3F1ZXVlIC0gc2V0IElUUiB2YWx1ZXMgZm9yIHNwZWNpZmljIHF1ZXVlCisgKiBAdnNpOiB0aGUgVlNJIHRvIHNldCB2YWx1ZXMgZm9yCisgKiBAZWM6IGNvYWxlc2NlIHNldHRpbmdzIGZyb20gZXRodG9vbAorICogQHF1ZXVlOiB0aGUgcXVldWUgdG8gbW9kaWZ5CisgKgorICogQ2hhbmdlIHRoZSBJVFIgc2V0dGluZ3MgZm9yIGEgc3BlY2lmaWMgcXVldWUuCisgKiovCisKIHN0YXRpYyB2b2lkIGk0MGVfc2V0X2l0cl9wZXJfcXVldWUoc3RydWN0IGk0MGVfdnNpICp2c2ksCiAJCQkJICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjLAogCQkJCSAgIGludCBxdWV1ZSkKQEAgLTIwNjAsNiArMjEwMSwxNCBAQAogCWk0MGVfZmx1c2goaHcpOwogfQogCisvKioKKyAqIF9faTQwZV9zZXRfY29hbGVzY2UgLSBzZXQgY29hbGVzY2Ugc2V0dGluZ3MgZm9yIHBhcnRpY3VsYXIgcXVldWUKKyAqIEBuZXRkZXY6IHRoZSBuZXRkZXYgdG8gY2hhbmdlCisgKiBAZWM6IGV0aHRvb2wgY29hbGVzY2Ugc2V0dGluZ3MKKyAqIEBxdWV1ZTogdGhlIHF1ZXVlIHRvIGNoYW5nZQorICoKKyAqIFNldHMgdGhlIGNvYWxlc2NlIHNldHRpbmdzIGZvciBhIHBhcnRpY3VsYXIgcXVldWUuCisgKiovCiBzdGF0aWMgaW50IF9faTQwZV9zZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMsCiAJCQkgICAgICAgaW50IHF1ZXVlKQpAQCAtMjEyMCwxMiArMjE2OSwyNyBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIGk0MGVfc2V0X2NvYWxlc2NlIC0gc2V0IGNvYWxlc2NlIHNldHRpbmdzIGZvciBldmVyeSBxdWV1ZSBvbiB0aGUgbmV0ZGV2CisgKiBAbmV0ZGV2OiB0aGUgbmV0ZGV2IHRvIGNoYW5nZQorICogQGVjOiBldGh0b29sIGNvYWxlc2NlIHNldHRpbmdzCisgKgorICogVGhpcyB3aWxsIHNldCBlYWNoIHF1ZXVlIHRvIHRoZSBzYW1lIGNvYWxlc2NlIHNldHRpbmdzLgorICoqLwogc3RhdGljIGludCBpNDBlX3NldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMpCiB7CiAJcmV0dXJuIF9faTQwZV9zZXRfY29hbGVzY2UobmV0ZGV2LCBlYywgLTEpOwogfQogCisvKioKKyAqIGk0MGVfc2V0X3Blcl9xdWV1ZV9jb2FsZXNjZSAtIHNldCBzcGVjaWZpYyBxdWV1ZSdzIGNvYWxlc2NlIHNldHRpbmdzCisgKiBAbmV0ZGV2OiB0aGUgbmV0ZGV2IHRvIGNoYW5nZQorICogQGVjOiBldGh0b29sJ3MgY29hbGVzY2Ugc2V0dGluZ3MKKyAqIEBxdWV1ZTogdGhlIHF1ZXVlIHRvIGNoYW5nZQorICoKKyAqIFNldHMgdGhlIHNwZWNpZmllZCBxdWV1ZSdzIGNvYWxlc2NlIHNldHRpbmdzLgorICoqLwogc3RhdGljIGludCBpNDBlX3NldF9wZXJfcXVldWVfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIHF1ZXVlLAogCQkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMpCiB7CkBAIC0yMTQxLDQxICsyMjA1LDcyIEBACiAgKiovCiBzdGF0aWMgaW50IGk0MGVfZ2V0X3Jzc19oYXNoX29wdHMoc3RydWN0IGk0MGVfcGYgKnBmLCBzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqY21kKQogeworCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZwZi0+aHc7CisJdTggZmxvd19wY3R5cGUgPSAwOworCXU2NCBpX3NldCA9IDA7CisKIAljbWQtPmRhdGEgPSAwOwogCi0JaWYgKHBmLT52c2lbcGYtPmxhbl92c2ldLT5yeG5mYy5kYXRhICE9IDApIHsKLQkJY21kLT5kYXRhID0gcGYtPnZzaVtwZi0+bGFuX3ZzaV0tPnJ4bmZjLmRhdGE7Ci0JCWNtZC0+Zmxvd190eXBlID0gcGYtPnZzaVtwZi0+bGFuX3ZzaV0tPnJ4bmZjLmZsb3dfdHlwZTsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qIFJlcG9ydCBkZWZhdWx0IG9wdGlvbnMgZm9yIFJTUyBvbiBpNDBlICovCiAJc3dpdGNoIChjbWQtPmZsb3dfdHlwZSkgewogCWNhc2UgVENQX1Y0X0ZMT1c6CisJCWZsb3dfcGN0eXBlID0gSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9UQ1A7CisJCWJyZWFrOwogCWNhc2UgVURQX1Y0X0ZMT1c6Ci0JCWNtZC0+ZGF0YSB8PSBSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzM7Ci0JLyogZmFsbCB0aHJvdWdoIHRvIGFkZCBJUCBmaWVsZHMgKi8KKwkJZmxvd19wY3R5cGUgPSBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1VEUDsKKwkJYnJlYWs7CisJY2FzZSBUQ1BfVjZfRkxPVzoKKwkJZmxvd19wY3R5cGUgPSBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY2X1RDUDsKKwkJYnJlYWs7CisJY2FzZSBVRFBfVjZfRkxPVzoKKwkJZmxvd19wY3R5cGUgPSBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY2X1VEUDsKKwkJYnJlYWs7CiAJY2FzZSBTQ1RQX1Y0X0ZMT1c6CiAJY2FzZSBBSF9FU1BfVjRfRkxPVzoKIAljYXNlIEFIX1Y0X0ZMT1c6CiAJY2FzZSBFU1BfVjRfRkxPVzoKIAljYXNlIElQVjRfRkxPVzoKLQkJY21kLT5kYXRhIHw9IFJYSF9JUF9TUkMgfCBSWEhfSVBfRFNUOwotCQlicmVhazsKLQljYXNlIFRDUF9WNl9GTE9XOgotCWNhc2UgVURQX1Y2X0ZMT1c6Ci0JCWNtZC0+ZGF0YSB8PSBSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzM7Ci0JLyogZmFsbCB0aHJvdWdoIHRvIGFkZCBJUCBmaWVsZHMgKi8KIAljYXNlIFNDVFBfVjZfRkxPVzoKIAljYXNlIEFIX0VTUF9WNl9GTE9XOgogCWNhc2UgQUhfVjZfRkxPVzoKIAljYXNlIEVTUF9WNl9GTE9XOgogCWNhc2UgSVBWNl9GTE9XOgorCQkvKiBEZWZhdWx0IGlzIHNyYy9kZXN0IGZvciBJUCwgbm8gbWF0dGVyIHRoZSBMNCBoYXNoaW5nICovCiAJCWNtZC0+ZGF0YSB8PSBSWEhfSVBfU1JDIHwgUlhIX0lQX0RTVDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyogUmVhZCBmbG93IGJhc2VkIGhhc2ggaW5wdXQgc2V0IHJlZ2lzdGVyICovCisJaWYgKGZsb3dfcGN0eXBlKSB7CisJCWlfc2V0ID0gKHU2NClpNDBlX3JlYWRfcnhfY3RsKGh3LCBJNDBFX0dMUUZfSEFTSF9JTlNFVCgwLAorCQkJCQkgICAgICBmbG93X3BjdHlwZSkpIHwKKwkJCSgodTY0KWk0MGVfcmVhZF9yeF9jdGwoaHcsIEk0MEVfR0xRRl9IQVNIX0lOU0VUKDEsCisJCQkJCSAgICAgICBmbG93X3BjdHlwZSkpIDw8IDMyKTsKKwl9CisKKwkvKiBQcm9jZXNzIGJpdHMgb2YgaGFzaCBpbnB1dCBzZXQgKi8KKwlpZiAoaV9zZXQpIHsKKwkJaWYgKGlfc2V0ICYgSTQwRV9MNF9TUkNfTUFTSykKKwkJCWNtZC0+ZGF0YSB8PSBSWEhfTDRfQl8wXzE7CisJCWlmIChpX3NldCAmIEk0MEVfTDRfRFNUX01BU0spCisJCQljbWQtPmRhdGEgfD0gUlhIX0w0X0JfMl8zOworCisJCWlmIChjbWQtPmZsb3dfdHlwZSA9PSBUQ1BfVjRfRkxPVyB8fAorCQkgICAgY21kLT5mbG93X3R5cGUgPT0gVURQX1Y0X0ZMT1cpIHsKKwkJCWlmIChpX3NldCAmIEk0MEVfTDNfU1JDX01BU0spCisJCQkJY21kLT5kYXRhIHw9IFJYSF9JUF9TUkM7CisJCQlpZiAoaV9zZXQgJiBJNDBFX0wzX0RTVF9NQVNLKQorCQkJCWNtZC0+ZGF0YSB8PSBSWEhfSVBfRFNUOworCQl9IGVsc2UgaWYgKGNtZC0+Zmxvd190eXBlID09IFRDUF9WNl9GTE9XIHx8CisJCQkgIGNtZC0+Zmxvd190eXBlID09IFVEUF9WNl9GTE9XKSB7CisJCQlpZiAoaV9zZXQgJiBJNDBFX0wzX1Y2X1NSQ19NQVNLKQorCQkJCWNtZC0+ZGF0YSB8PSBSWEhfSVBfU1JDOworCQkJaWYgKGlfc2V0ICYgSTQwRV9MM19WNl9EU1RfTUFTSykKKwkJCQljbWQtPmRhdGEgfD0gUlhIX0lQX0RTVDsKKwkJfQorCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0yMzE4LDYgKzI0MTMsNTEgQEAKIH0KIAogLyoqCisgKiBpNDBlX2dldF9yc3NfaGFzaF9iaXRzIC0gUmVhZCBSU1MgSGFzaCBiaXRzIGZyb20gcmVnaXN0ZXIKKyAqIEBuZmM6IHBvaW50ZXIgdG8gdXNlciByZXF1ZXN0CisgKiBAaV9zZXRjIGJpdHMgY3VycmVudGx5IHNldAorICoKKyAqIFJldHVybnMgdmFsdWUgb2YgYml0cyB0byBiZSBzZXQgcGVyIHVzZXIgcmVxdWVzdAorICoqLworc3RhdGljIHU2NCBpNDBlX2dldF9yc3NfaGFzaF9iaXRzKHN0cnVjdCBldGh0b29sX3J4bmZjICpuZmMsIHU2NCBpX3NldGMpCit7CisJdTY0IGlfc2V0ID0gaV9zZXRjOworCXU2NCBzcmNfbDMgPSAwLCBkc3RfbDMgPSAwOworCisJaWYgKG5mYy0+ZGF0YSAmIFJYSF9MNF9CXzBfMSkKKwkJaV9zZXQgfD0gSTQwRV9MNF9TUkNfTUFTSzsKKwllbHNlCisJCWlfc2V0ICY9IH5JNDBFX0w0X1NSQ19NQVNLOworCWlmIChuZmMtPmRhdGEgJiBSWEhfTDRfQl8yXzMpCisJCWlfc2V0IHw9IEk0MEVfTDRfRFNUX01BU0s7CisJZWxzZQorCQlpX3NldCAmPSB+STQwRV9MNF9EU1RfTUFTSzsKKworCWlmIChuZmMtPmZsb3dfdHlwZSA9PSBUQ1BfVjZfRkxPVyB8fCBuZmMtPmZsb3dfdHlwZSA9PSBVRFBfVjZfRkxPVykgeworCQlzcmNfbDMgPSBJNDBFX0wzX1Y2X1NSQ19NQVNLOworCQlkc3RfbDMgPSBJNDBFX0wzX1Y2X0RTVF9NQVNLOworCX0gZWxzZSBpZiAobmZjLT5mbG93X3R5cGUgPT0gVENQX1Y0X0ZMT1cgfHwKKwkJICBuZmMtPmZsb3dfdHlwZSA9PSBVRFBfVjRfRkxPVykgeworCQlzcmNfbDMgPSBJNDBFX0wzX1NSQ19NQVNLOworCQlkc3RfbDMgPSBJNDBFX0wzX0RTVF9NQVNLOworCX0gZWxzZSB7CisJCS8qIEFueSBvdGhlciBmbG93IHR5cGUgYXJlIG5vdCBzdXBwb3J0ZWQgaGVyZSAqLworCQlyZXR1cm4gaV9zZXQ7CisJfQorCisJaWYgKG5mYy0+ZGF0YSAmIFJYSF9JUF9TUkMpCisJCWlfc2V0IHw9IHNyY19sMzsKKwllbHNlCisJCWlfc2V0ICY9IH5zcmNfbDM7CisJaWYgKG5mYy0+ZGF0YSAmIFJYSF9JUF9EU1QpCisJCWlfc2V0IHw9IGRzdF9sMzsKKwllbHNlCisJCWlfc2V0ICY9IH5kc3RfbDM7CisKKwlyZXR1cm4gaV9zZXQ7Cit9CisKKy8qKgogICogaTQwZV9zZXRfcnNzX2hhc2hfb3B0IC0gRW5hYmxlL0Rpc2FibGUgZmxvdyB0eXBlcyBmb3IgUlNTIGhhc2gKICAqIEBwZjogcG9pbnRlciB0byB0aGUgcGh5c2ljYWwgZnVuY3Rpb24gc3RydWN0CiAgKiBAY21kOiBldGh0b29sIHJ4bmZjIGNvbW1hbmQKQEAgLTIzMjksNiArMjQ2OSw4IEBACiAJc3RydWN0IGk0MGVfaHcgKmh3ID0gJnBmLT5odzsKIAl1NjQgaGVuYSA9ICh1NjQpaTQwZV9yZWFkX3J4X2N0bChodywgSTQwRV9QRlFGX0hFTkEoMCkpIHwKIAkJICAgKCh1NjQpaTQwZV9yZWFkX3J4X2N0bChodywgSTQwRV9QRlFGX0hFTkEoMSkpIDw8IDMyKTsKKwl1OCBmbG93X3BjdHlwZSA9IDA7CisJdTY0IGlfc2V0LCBpX3NldGM7CiAKIAkvKiBSU1MgZG9lcyBub3Qgc3VwcG9ydCBhbnl0aGluZyBvdGhlciB0aGFuIGhhc2hpbmcKIAkgKiB0byBxdWV1ZXMgb24gc3JjIGFuZCBkc3QgSVBzIGFuZCBwb3J0cwpAQCAtMjMzNyw3NSArMjQ3OSwzOSBAQAogCQkJICBSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIFdlIG5lZWQgYXQgbGVhc3QgdGhlIElQIFNSQyBhbmQgREVTVCBmaWVsZHMgZm9yIGhhc2hpbmcgKi8KLQlpZiAoIShuZmMtPmRhdGEgJiBSWEhfSVBfU1JDKSB8fAotCSAgICAhKG5mYy0+ZGF0YSAmIFJYSF9JUF9EU1QpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXN3aXRjaCAobmZjLT5mbG93X3R5cGUpIHsKIAljYXNlIFRDUF9WNF9GTE9XOgotCQlzd2l0Y2ggKG5mYy0+ZGF0YSAmIChSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzMpKSB7Ci0JCWNhc2UgMDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQljYXNlIChSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzMpOgotCQkJaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19NVUxUSVBMRV9UQ1BfVURQX1JTU19QQ1RZUEUpCi0JCQkJaGVuYSB8PQotCQkJICAgQklUX1VMTChJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1RDUF9TWU5fTk9fQUNLKTsKLQotCQkJaGVuYSB8PSBCSVRfVUxMKEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjRfVENQKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KKwkJZmxvd19wY3R5cGUgPSBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1RDUDsKKwkJaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19NVUxUSVBMRV9UQ1BfVURQX1JTU19QQ1RZUEUpCisJCQloZW5hIHw9CisJCQkgIEJJVF9VTEwoSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9UQ1BfU1lOX05PX0FDSyk7CiAJCWJyZWFrOwogCWNhc2UgVENQX1Y2X0ZMT1c6Ci0JCXN3aXRjaCAobmZjLT5kYXRhICYgKFJYSF9MNF9CXzBfMSB8IFJYSF9MNF9CXzJfMykpIHsKLQkJY2FzZSAwOgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWNhc2UgKFJYSF9MNF9CXzBfMSB8IFJYSF9MNF9CXzJfMyk6Ci0JCQlpZiAocGYtPmZsYWdzICYgSTQwRV9GTEFHX01VTFRJUExFX1RDUF9VRFBfUlNTX1BDVFlQRSkKLQkJCQloZW5hIHw9Ci0JCQkgICBCSVRfVUxMKEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjZfVENQX1NZTl9OT19BQ0spOwotCi0JCQloZW5hIHw9IEJJVF9VTEwoSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNl9UQ1ApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQorCQlmbG93X3BjdHlwZSA9IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjZfVENQOworCQlpZiAocGYtPmZsYWdzICYgSTQwRV9GTEFHX01VTFRJUExFX1RDUF9VRFBfUlNTX1BDVFlQRSkKKwkJCWhlbmEgfD0KKwkJCSAgQklUX1VMTChJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1RDUF9TWU5fTk9fQUNLKTsKKwkJaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19NVUxUSVBMRV9UQ1BfVURQX1JTU19QQ1RZUEUpCisJCQloZW5hIHw9CisJCQkgIEJJVF9VTEwoSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNl9UQ1BfU1lOX05PX0FDSyk7CiAJCWJyZWFrOwogCWNhc2UgVURQX1Y0X0ZMT1c6Ci0JCXN3aXRjaCAobmZjLT5kYXRhICYgKFJYSF9MNF9CXzBfMSB8IFJYSF9MNF9CXzJfMykpIHsKLQkJY2FzZSAwOgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWNhc2UgKFJYSF9MNF9CXzBfMSB8IFJYSF9MNF9CXzJfMyk6Ci0JCQlpZiAocGYtPmZsYWdzICYgSTQwRV9GTEFHX01VTFRJUExFX1RDUF9VRFBfUlNTX1BDVFlQRSkKLQkJCQloZW5hIHw9Ci0JCQkgICAgQklUX1VMTChJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9VTklDQVNUX0lQVjRfVURQKSB8Ci0JCQkgICAgQklUX1VMTChJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9NVUxUSUNBU1RfSVBWNF9VRFApOworCQlmbG93X3BjdHlwZSA9IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjRfVURQOworCQlpZiAocGYtPmZsYWdzICYgSTQwRV9GTEFHX01VTFRJUExFX1RDUF9VRFBfUlNTX1BDVFlQRSkKKwkJCWhlbmEgfD0KKwkJCSAgQklUX1VMTChJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9VTklDQVNUX0lQVjRfVURQKSB8CisJCQkgIEJJVF9VTEwoSTQwRV9GSUxURVJfUENUWVBFX05PTkZfTVVMVElDQVNUX0lQVjRfVURQKTsKIAotCQkJaGVuYSB8PSAoQklUX1VMTChJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1VEUCkgfAotCQkJCSBCSVRfVUxMKEk0MEVfRklMVEVSX1BDVFlQRV9GUkFHX0lQVjQpKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KKwkJaGVuYSB8PSBCSVRfVUxMKEk0MEVfRklMVEVSX1BDVFlQRV9GUkFHX0lQVjQpOwogCQlicmVhazsKIAljYXNlIFVEUF9WNl9GTE9XOgotCQlzd2l0Y2ggKG5mYy0+ZGF0YSAmIChSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzMpKSB7Ci0JCWNhc2UgMDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQljYXNlIChSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzMpOgotCQkJaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19NVUxUSVBMRV9UQ1BfVURQX1JTU19QQ1RZUEUpCi0JCQkJaGVuYSB8PQotCQkJICAgIEJJVF9VTEwoSTQwRV9GSUxURVJfUENUWVBFX05PTkZfVU5JQ0FTVF9JUFY2X1VEUCkgfAotCQkJICAgIEJJVF9VTEwoSTQwRV9GSUxURVJfUENUWVBFX05PTkZfTVVMVElDQVNUX0lQVjZfVURQKTsKKwkJZmxvd19wY3R5cGUgPSBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY2X1VEUDsKKwkJaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19NVUxUSVBMRV9UQ1BfVURQX1JTU19QQ1RZUEUpCisJCQloZW5hIHw9CisJCQkgIEJJVF9VTEwoSTQwRV9GSUxURVJfUENUWVBFX05PTkZfVU5JQ0FTVF9JUFY2X1VEUCkgfAorCQkJICBCSVRfVUxMKEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX01VTFRJQ0FTVF9JUFY2X1VEUCk7CiAKLQkJCWhlbmEgfD0gKEJJVF9VTEwoSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNl9VRFApIHwKLQkJCQkgQklUX1VMTChJNDBFX0ZJTFRFUl9QQ1RZUEVfRlJBR19JUFY2KSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9CisJCWhlbmEgfD0gQklUX1VMTChJNDBFX0ZJTFRFUl9QQ1RZUEVfRlJBR19JUFY2KTsKIAkJYnJlYWs7CiAJY2FzZSBBSF9FU1BfVjRfRkxPVzoKIAljYXNlIEFIX1Y0X0ZMT1c6CkBAIC0yNDM3LDEzICsyNTQzLDIzIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChmbG93X3BjdHlwZSkgeworCQlpX3NldGMgPSAodTY0KWk0MGVfcmVhZF9yeF9jdGwoaHcsIEk0MEVfR0xRRl9IQVNIX0lOU0VUKDAsCisJCQkJCSAgICAgICBmbG93X3BjdHlwZSkpIHwKKwkJCSgodTY0KWk0MGVfcmVhZF9yeF9jdGwoaHcsIEk0MEVfR0xRRl9IQVNIX0lOU0VUKDEsCisJCQkJCSAgICAgICBmbG93X3BjdHlwZSkpIDw8IDMyKTsKKwkJaV9zZXQgPSBpNDBlX2dldF9yc3NfaGFzaF9iaXRzKG5mYywgaV9zZXRjKTsKKwkJaTQwZV93cml0ZV9yeF9jdGwoaHcsIEk0MEVfR0xRRl9IQVNIX0lOU0VUKDAsIGZsb3dfcGN0eXBlKSwKKwkJCQkgICh1MzIpaV9zZXQpOworCQlpNDBlX3dyaXRlX3J4X2N0bChodywgSTQwRV9HTFFGX0hBU0hfSU5TRVQoMSwgZmxvd19wY3R5cGUpLAorCQkJCSAgKHUzMikoaV9zZXQgPj4gMzIpKTsKKwkJaGVuYSB8PSBCSVRfVUxMKGZsb3dfcGN0eXBlKTsKKwl9CisKIAlpNDBlX3dyaXRlX3J4X2N0bChodywgSTQwRV9QRlFGX0hFTkEoMCksICh1MzIpaGVuYSk7CiAJaTQwZV93cml0ZV9yeF9jdGwoaHcsIEk0MEVfUEZRRl9IRU5BKDEpLCAodTMyKShoZW5hID4+IDMyKSk7CiAJaTQwZV9mbHVzaChodyk7CiAKLQkvKiBTYXZlIHNldHRpbmcgZm9yIGZ1dHVyZSBvdXRwdXQvdXBkYXRlICovCi0JcGYtPnZzaVtwZi0+bGFuX3ZzaV0tPnJ4bmZjID0gKm5mYzsKLQogCXJldHVybiAwOwogfQogCkBAIC0yNzQ0LDExICsyODYwLDE1IEBACiBzdGF0aWMgaW50IGk0MGVfc2V0X2NoYW5uZWxzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9jaGFubmVscyAqY2gpCiB7CisJY29uc3QgdTggZHJvcCA9IEk0MEVfRklMVEVSX1BST0dSQU1fREVTQ19ERVNUX0RST1BfUEFDS0VUOwogCXN0cnVjdCBpNDBlX25ldGRldl9wcml2ICpucCA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgaW50IGNvdW50ID0gY2gtPmNvbWJpbmVkX2NvdW50OwogCXN0cnVjdCBpNDBlX3ZzaSAqdnNpID0gbnAtPnZzaTsKIAlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSB2c2ktPmJhY2s7CisJc3RydWN0IGk0MGVfZmRpcl9maWx0ZXIgKnJ1bGU7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGUyOwogCWludCBuZXdfY291bnQ7CisJaW50IGVyciA9IDA7CiAKIAkvKiBXZSBkbyBub3Qgc3VwcG9ydCBzZXR0aW5nIGNoYW5uZWxzIGZvciBhbnkgb3RoZXIgVlNJIGF0IHByZXNlbnQgKi8KIAlpZiAodnNpLT50eXBlICE9IEk0MEVfVlNJX01BSU4pCkBAIC0yNzY2LDYgKzI4ODYsMjYgQEAKIAlpZiAoY291bnQgPiBpNDBlX21heF9jaGFubmVscyh2c2kpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qIHZlcmlmeSB0aGF0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgZG9lcyBub3QgaW52YWxpZGF0ZSBhbnkgY3VycmVudAorCSAqIGZsb3cgZGlyZWN0b3IgcnVsZXMKKwkgKi8KKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJ1bGUsIG5vZGUyLAorCQkJCSAgJnBmLT5mZGlyX2ZpbHRlcl9saXN0LCBmZGlyX25vZGUpIHsKKwkJaWYgKHJ1bGUtPmRlc3RfY3RsICE9IGRyb3AgJiYgY291bnQgPD0gcnVsZS0+cV9pbmRleCkgeworCQkJZGV2X3dhcm4oJnBmLT5wZGV2LT5kZXYsCisJCQkJICJFeGlzdGluZyB1c2VyIGRlZmluZWQgZmlsdGVyICVkIGFzc2lnbnMgZmxvdyB0byBxdWV1ZSAlZFxuIiwKKwkJCQkgcnVsZS0+ZmRfaWQsIHJ1bGUtPnFfaW5kZXgpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGYtPnBkZXYtPmRldiwKKwkJCSJFeGlzdGluZyBmaWx0ZXIgcnVsZXMgbXVzdCBiZSBkZWxldGVkIHRvIHJlZHVjZSBjb21iaW5lZCBjaGFubmVsIGNvdW50IHRvICVkXG4iLAorCQkJY291bnQpOworCQlyZXR1cm4gZXJyOworCX0KKwogCS8qIHVwZGF0ZSBmZWF0dXJlIGxpbWl0cyBmcm9tIGxhcmdlc3QgdG8gc21hbGxlc3Qgc3VwcG9ydGVkIHZhbHVlcyAqLwogCS8qIFRPRE86IEZsb3cgZGlyZWN0b3IgbGltaXQsIERDQiBldGMgKi8KIApAQCAtMjg0NiwxNSArMjk4NiwxMyBAQAogewogCXN0cnVjdCBpNDBlX25ldGRldl9wcml2ICpucCA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGk0MGVfdnNpICp2c2kgPSBucC0+dnNpOworCXN0cnVjdCBpNDBlX3BmICpwZiA9IHZzaS0+YmFjazsKIAl1OCAqc2VlZCA9IE5VTEw7CiAJdTE2IGk7CiAKIAlpZiAoaGZ1bmMgIT0gRVRIX1JTU19IQVNIX05PX0NIQU5HRSAmJiBoZnVuYyAhPSBFVEhfUlNTX0hBU0hfVE9QKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlpZiAoIWluZGlyKQotCQlyZXR1cm4gMDsKLQogCWlmIChrZXkpIHsKIAkJaWYgKCF2c2ktPnJzc19oa2V5X3VzZXIpIHsKIAkJCXZzaS0+cnNzX2hrZXlfdXNlciA9IGt6YWxsb2MoSTQwRV9IS0VZX0FSUkFZX1NJWkUsCkBAIC0yODcyLDggKzMwMTAsMTIgQEAKIAl9CiAKIAkvKiBFYWNoIDMyIGJpdHMgcG9pbnRlZCBieSAnaW5kaXInIGlzIHN0b3JlZCB3aXRoIGEgbHV0IGVudHJ5ICovCi0JZm9yIChpID0gMDsgaSA8IEk0MEVfSExVVF9BUlJBWV9TSVpFOyBpKyspCi0JCXZzaS0+cnNzX2x1dF91c2VyW2ldID0gKHU4KShpbmRpcltpXSk7CisJaWYgKGluZGlyKQorCQlmb3IgKGkgPSAwOyBpIDwgSTQwRV9ITFVUX0FSUkFZX1NJWkU7IGkrKykKKwkJCXZzaS0+cnNzX2x1dF91c2VyW2ldID0gKHU4KShpbmRpcltpXSk7CisJZWxzZQorCQlpNDBlX2ZpbGxfcnNzX2x1dChwZiwgdnNpLT5yc3NfbHV0X3VzZXIsIEk0MEVfSExVVF9BUlJBWV9TSVpFLAorCQkJCSAgdnNpLT5yc3Nfc2l6ZSk7CiAKIAlyZXR1cm4gaTQwZV9jb25maWdfcnNzKHZzaSwgc2VlZCwgdnNpLT5yc3NfbHV0X3VzZXIsCiAJCQkgICAgICAgSTQwRV9ITFVUX0FSUkFZX1NJWkUpOwpAQCAtMjk0Myw2ICszMDg1LDkgQEAKIAl9IGVsc2UgewogCQlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRDsKIAkJcGYtPmF1dG9fZGlzYWJsZV9mbGFncyB8PSBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7CisKKwkJLyogZmx1c2ggY3VycmVudCBBVFIgc2V0dGluZ3MgKi8KKwkJc2V0X2JpdChfX0k0MEVfRkRfRkxVU0hfUkVRVUVTVEVELCAmcGYtPnN0YXRlKTsKIAl9CiAKIAlpZiAoKGZsYWdzICYgSTQwRV9QUklWX0ZMQUdTX1ZFQl9TVEFUUykgJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfbWFpbi5jCmluZGV4IDgxYzk5ZTEuLmFjMWZhZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX21haW4uYwpAQCAtNDEsNyArNDEsNyBAQAogCiAjZGVmaW5lIERSVl9WRVJTSU9OX01BSk9SIDEKICNkZWZpbmUgRFJWX1ZFUlNJT05fTUlOT1IgNgotI2RlZmluZSBEUlZfVkVSU0lPTl9CVUlMRCAxMQorI2RlZmluZSBEUlZfVkVSU0lPTl9CVUlMRCAxNgogI2RlZmluZSBEUlZfVkVSU0lPTiBfX3N0cmluZ2lmeShEUlZfVkVSU0lPTl9NQUpPUikgIi4iIFwKIAkgICAgIF9fc3RyaW5naWZ5KERSVl9WRVJTSU9OX01JTk9SKSAiLiIgXAogCSAgICAgX19zdHJpbmdpZnkoRFJWX1ZFUlNJT05fQlVJTEQpICAgIERSVl9LRVJOCkBAIC01Nyw4ICs1Nyw2IEBACiBzdGF0aWMgaW50IGk0MGVfc2V0dXBfbWlzY192ZWN0b3Ioc3RydWN0IGk0MGVfcGYgKnBmKTsKIHN0YXRpYyB2b2lkIGk0MGVfZGV0ZXJtaW5lX3F1ZXVlX3VzYWdlKHN0cnVjdCBpNDBlX3BmICpwZik7CiBzdGF0aWMgaW50IGk0MGVfc2V0dXBfcGZfZmlsdGVyX2NvbnRyb2woc3RydWN0IGk0MGVfcGYgKnBmKTsKLXN0YXRpYyB2b2lkIGk0MGVfZmlsbF9yc3NfbHV0KHN0cnVjdCBpNDBlX3BmICpwZiwgdTggKmx1dCwKLQkJCSAgICAgIHUxNiByc3NfdGFibGVfc2l6ZSwgdTE2IHJzc19zaXplKTsKIHN0YXRpYyB2b2lkIGk0MGVfZmRpcl9zYl9zZXR1cChzdHJ1Y3QgaTQwZV9wZiAqcGYpOwogc3RhdGljIGludCBpNDBlX3ZlYl9nZXRfYndfaW5mbyhzdHJ1Y3QgaTQwZV92ZWIgKnZlYik7CiAKQEAgLTUyNyw2ICs1MjUsNyBAQAogCQkJcGYtPnZlYltpXS0+c3RhdF9vZmZzZXRzX2xvYWRlZCA9IGZhbHNlOwogCQl9CiAJfQorCXBmLT5od19jc3VtX3J4X2Vycm9yID0gMDsKIH0KIAogLyoqCkBAIC0xMzE2LDcgKzEzMTUsNyBAQAogCWVsZW1lbnQudmxhbl90YWcgPSAwOwogCS8qIC4uLmFuZCBzb21lIGZpcm13YXJlIGRvZXMgaXQgdGhpcyB3YXkuICovCiAJZWxlbWVudC5mbGFncyA9IEk0MEVfQVFDX01BQ1ZMQU5fREVMX1BFUkZFQ1RfTUFUQ0ggfAotCQkJSTQwRV9BUUNfTUFDVkxBTl9BRERfSUdOT1JFX1ZMQU47CisJCQlJNDBFX0FRQ19NQUNWTEFOX0RFTF9JR05PUkVfVkxBTjsKIAlpNDBlX2FxX3JlbW92ZV9tYWN2bGFuKCZwZi0+aHcsIHZzaS0+c2VpZCwgJmVsZW1lbnQsIDEsIE5VTEwpOwogfQogCkBAIC0xOTA5LDcgKzE5MDgsNyBAQAogCQkJZXRoZXJfYWRkcl9jb3B5KGRlbF9saXN0W251bV9kZWxdLm1hY19hZGRyLCBmLT5tYWNhZGRyKTsKIAkJCWlmIChmLT52bGFuID09IEk0MEVfVkxBTl9BTlkpIHsKIAkJCQlkZWxfbGlzdFtudW1fZGVsXS52bGFuX3RhZyA9IDA7Ci0JCQkJY21kX2ZsYWdzIHw9IEk0MEVfQVFDX01BQ1ZMQU5fQUREX0lHTk9SRV9WTEFOOworCQkJCWNtZF9mbGFncyB8PSBJNDBFX0FRQ19NQUNWTEFOX0RFTF9JR05PUkVfVkxBTjsKIAkJCX0gZWxzZSB7CiAJCQkJZGVsX2xpc3RbbnVtX2RlbF0udmxhbl90YWcgPQogCQkJCQljcHVfdG9fbGUxNigodTE2KShmLT52bGFuKSk7CkBAIC00NTU0LDIzICs0NTUzLDM4IEBACiAgKiovCiBzdGF0aWMgdTggaTQwZV9kY2JfZ2V0X251bV90YyhzdHJ1Y3QgaTQwZV9kY2J4X2NvbmZpZyAqZGNiY2ZnKQogeworCWludCBpLCB0Y191bnVzZWQgPSAwOwogCXU4IG51bV90YyA9IDA7Ci0JaW50IGk7CisJdTggcmV0ID0gMDsKIAogCS8qIFNjYW4gdGhlIEVUUyBDb25maWcgUHJpb3JpdHkgVGFibGUgdG8gZmluZAogCSAqIHRyYWZmaWMgY2xhc3MgZW5hYmxlZCBmb3IgYSBnaXZlbiBwcmlvcml0eQotCSAqIGFuZCB1c2UgdGhlIHRyYWZmaWMgY2xhc3MgaW5kZXggdG8gZ2V0IHRoZQotCSAqIG51bWJlciBvZiB0cmFmZmljIGNsYXNzZXMgZW5hYmxlZAorCSAqIGFuZCBjcmVhdGUgYSBiaXRtYXNrIG9mIGVuYWJsZWQgVENzCiAJICovCi0JZm9yIChpID0gMDsgaSA8IEk0MEVfTUFYX1VTRVJfUFJJT1JJVFk7IGkrKykgewotCQlpZiAoZGNiY2ZnLT5ldHNjZmcucHJpb3JpdHl0YWJsZVtpXSA+IG51bV90YykKLQkJCW51bV90YyA9IGRjYmNmZy0+ZXRzY2ZnLnByaW9yaXR5dGFibGVbaV07CisJZm9yIChpID0gMDsgaSA8IEk0MEVfTUFYX1VTRVJfUFJJT1JJVFk7IGkrKykKKwkJbnVtX3RjIHw9IEJJVChkY2JjZmctPmV0c2NmZy5wcmlvcml0eXRhYmxlW2ldKTsKKworCS8qIE5vdyBzY2FuIHRoZSBiaXRtYXNrIHRvIGNoZWNrIGZvcgorCSAqIGNvbnRpZ3VvdXMgVENzIHN0YXJ0aW5nIHdpdGggVEMwCisJICovCisJZm9yIChpID0gMDsgaSA8IEk0MEVfTUFYX1RSQUZGSUNfQ0xBU1M7IGkrKykgeworCQlpZiAobnVtX3RjICYgQklUKGkpKSB7CisJCQlpZiAoIXRjX3VudXNlZCkgeworCQkJCXJldCsrOworCQkJfSBlbHNlIHsKKwkJCQlwcl9lcnIoIk5vbi1jb250aWd1b3VzIFRDIC0gRGlzYWJsaW5nIERDQlxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0Y191bnVzZWQgPSAxOworCQl9CiAJfQogCi0JLyogVHJhZmZpYyBjbGFzcyBpbmRleCBzdGFydHMgZnJvbSB6ZXJvIHNvCi0JICogaW5jcmVtZW50IHRvIHJldHVybiB0aGUgYWN0dWFsIGNvdW50Ci0JICovCi0JcmV0dXJuIG51bV90YyArIDE7CisJLyogVGhlcmUgaXMgYWx3YXlzIGF0IGxlYXN0IFRDMCAqLworCWlmICghcmV0KQorCQlyZXQgPSAxOworCisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC00NjAxLDcgKzQ2MTUsNyBAQAogc3RhdGljIHU4IGk0MGVfcGZfZ2V0X251bV90YyhzdHJ1Y3QgaTQwZV9wZiAqcGYpCiB7CiAJc3RydWN0IGk0MGVfaHcgKmh3ID0gJnBmLT5odzsKLQl1OCBpLCBlbmFibGVkX3RjOworCXU4IGksIGVuYWJsZWRfdGMgPSAxOwogCXU4IG51bV90YyA9IDA7CiAJc3RydWN0IGk0MGVfZGNieF9jb25maWcgKmRjYmNmZyA9ICZody0+bG9jYWxfZGNieF9jb25maWc7CiAKQEAgLTQ2MTksOCArNDYzMyw2IEBACiAJZWxzZQogCQlyZXR1cm4gMTsgLyogT25seSBUQzAgKi8KIAotCS8qIEF0IGxlYXN0IGhhdmUgVEMwICovCi0JZW5hYmxlZF90YyA9IChlbmFibGVkX3RjID8gZW5hYmxlZF90YyA6IDB4MSk7CiAJZm9yIChpID0gMDsgaSA8IEk0MEVfTUFYX1RSQUZGSUNfQ0xBU1M7IGkrKykgewogCQlpZiAoZW5hYmxlZF90YyAmIEJJVChpKSkKIAkJCW51bV90YysrOwpAQCAtNTA5OCw5ICs1MTEwLDEzIEBACiAJCQkJICAgICAgIERDQl9DQVBfRENCWF9WRVJfSUVFRTsKIAogCQkJcGYtPmZsYWdzIHw9IEk0MEVfRkxBR19EQ0JfQ0FQQUJMRTsKLQkJCS8qIEVuYWJsZSBEQ0IgdGFnZ2luZyBvbmx5IHdoZW4gbW9yZSB0aGFuIG9uZSBUQyAqLworCQkJLyogRW5hYmxlIERDQiB0YWdnaW5nIG9ubHkgd2hlbiBtb3JlIHRoYW4gb25lIFRDCisJCQkgKiBvciBleHBsaWNpdGx5IGRpc2FibGUgaWYgb25seSBvbmUgVEMKKwkJCSAqLwogCQkJaWYgKGk0MGVfZGNiX2dldF9udW1fdGMoJmh3LT5sb2NhbF9kY2J4X2NvbmZpZykgPiAxKQogCQkJCXBmLT5mbGFncyB8PSBJNDBFX0ZMQUdfRENCX0VOQUJMRUQ7CisJCQllbHNlCisJCQkJcGYtPmZsYWdzICY9IH5JNDBFX0ZMQUdfRENCX0VOQUJMRUQ7CiAJCQlkZXZfZGJnKCZwZi0+cGRldi0+ZGV2LAogCQkJCSJEQ0JYIG9mZmxvYWQgaXMgc3VwcG9ydGVkIGZvciB0aGlzIFBGLlxuIik7CiAJCX0KQEAgLTUyMjYsNyArNTI0Miw3IEBACiAJCS8qIHJlc2V0IGZkIGNvdW50ZXJzICovCiAJCXBmLT5mZF9hZGRfZXJyID0gcGYtPmZkX2F0cl9jbnQgPSAwOwogCQlpZiAocGYtPmZkX3RjcF9ydWxlID4gMCkgewotCQkJcGYtPmZsYWdzICY9IH5JNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7CisJCQlwZi0+YXV0b19kaXNhYmxlX2ZsYWdzIHw9IEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRDsKIAkJCWlmIChJNDBFX0RFQlVHX0ZEICYgcGYtPmh3LmRlYnVnX21hc2spCiAJCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJGb3JjaW5nIEFUUiBvZmYsIHNpZGViYW5kIHJ1bGVzIGZvciBUQ1AvSVB2NCBleGlzdFxuIik7CiAJCQlwZi0+ZmRfdGNwX3J1bGUgPSAwOwpAQCAtNTQxNiw3ICs1NDMyLDYgQEAKIAl3cjMyKCZwZi0+aHcsIEk0MEVfR0xMQU5fVFNPTVNLX0wsIGJlMzJfdG9fY3B1KFRDUF9GTEFHX0NXUikgPj4gMTYpOwogCiAJdWRwX3R1bm5lbF9nZXRfcnhfaW5mbyhuZXRkZXYpOwotCWk0MGVfbm90aWZ5X2NsaWVudF9vZl9uZXRkZXZfb3Blbih2c2kpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NzAyLDcgKzU3MTcsNyBAQAogCXU4IHR5cGU7CiAKIAkvKiBOb3QgRENCIGNhcGFibGUgb3IgY2FwYWJpbGl0eSBkaXNhYmxlZCAqLwotCWlmICghKHBmLT5mbGFncyAmIEk0MEVfRkxBR19EQ0JfQ0FQQUJMRSkpCisJaWYgKCEocGYtPmZsYWdzICYgSTQwRV9GTEFHX0RDQl9FTkFCTEVEKSkKIAkJcmV0dXJuIHJldDsKIAogCS8qIElnbm9yZSBpZiBldmVudCBpcyBub3QgZm9yIE5lYXJlc3QgQnJpZGdlICovCkBAIC01OTI0LDEzICs1OTM5LDE3IEBACiAJCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJGRCBTaWRlYmFuZC9udHVwbGUgaXMgYmVpbmcgZW5hYmxlZCBzaW5jZSB3ZSBoYXZlIHNwYWNlIGluIHRoZSB0YWJsZSBub3dcbiIpOwogCQl9CiAJfQotCS8qIFdhaXQgZm9yIHNvbWUgbW9yZSBzcGFjZSB0byBiZSBhdmFpbGFibGUgdG8gdHVybiBvbiBBVFIgKi8KKworCS8qIFdhaXQgZm9yIHNvbWUgbW9yZSBzcGFjZSB0byBiZSBhdmFpbGFibGUgdG8gdHVybiBvbiBBVFIuIFdlIGFsc28KKwkgKiBtdXN0IGNoZWNrIHRoYXQgbm8gZXhpc3RpbmcgbnR1cGxlIHJ1bGVzIGZvciBUQ1AgYXJlIGluIGVmZmVjdAorCSAqLwogCWlmIChmY250X3Byb2cgPCAoZmNudF9hdmFpbCAtIEk0MEVfRkRJUl9CVUZGRVJfSEVBRF9ST09NICogMikpIHsKIAkJaWYgKChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQpICYmCi0JCSAgICAocGYtPmF1dG9fZGlzYWJsZV9mbGFncyAmIEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRCkpIHsKKwkJICAgIChwZi0+YXV0b19kaXNhYmxlX2ZsYWdzICYgSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEKSAmJgorCQkgICAgKHBmLT5mZF90Y3BfcnVsZSA9PSAwKSkgewogCQkJcGYtPmF1dG9fZGlzYWJsZV9mbGFncyAmPSB+STQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEOwogCQkJaWYgKEk0MEVfREVCVUdfRkQgJiBwZi0+aHcuZGVidWdfbWFzaykKLQkJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIkFUUiBpcyBiZWluZyBlbmFibGVkIHNpbmNlIHdlIGhhdmUgc3BhY2UgaW4gdGhlIHRhYmxlIG5vd1xuIik7CisJCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJBVFIgaXMgYmVpbmcgZW5hYmxlZCBzaW5jZSB3ZSBoYXZlIHNwYWNlIGluIHRoZSB0YWJsZSBhbmQgdGhlcmUgYXJlIG5vIGNvbmZsaWN0aW5nIG50dXBsZSBydWxlc1xuIik7CiAJCX0KIAl9CiAKQEAgLTU5NjEsOSArNTk4MCw2IEBACiAJaW50IGZkX3Jvb207CiAJaW50IHJlZzsKIAotCWlmICghKHBmLT5mbGFncyAmIChJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCB8IEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRCkpKQotCQlyZXR1cm47Ci0KIAlpZiAoIXRpbWVfYWZ0ZXIoamlmZmllcywgcGYtPmZkX2ZsdXNoX3RpbWVzdGFtcCArCiAJCQkJIChJNDBFX01JTl9GRF9GTFVTSF9JTlRFUlZBTCAqIEhaKSkpCiAJCXJldHVybjsKQEAgLTU5ODMsNyArNTk5OSw3IEBACiAJfQogCiAJcGYtPmZkX2ZsdXNoX3RpbWVzdGFtcCA9IGppZmZpZXM7Ci0JcGYtPmZsYWdzICY9IH5JNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7CisJcGYtPmF1dG9fZGlzYWJsZV9mbGFncyB8PSBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7CiAJLyogZmx1c2ggYWxsIGZpbHRlcnMgKi8KIAl3cjMyKCZwZi0+aHcsIEk0MEVfUEZRRl9DVExfMSwKIAkgICAgIEk0MEVfUEZRRl9DVExfMV9DTEVBUkZEVEFCTEVfTUFTSyk7CkBAIC02MDAzLDcgKzYwMTksNyBAQAogCQkvKiByZXBsYXkgc2lkZWJhbmQgZmlsdGVycyAqLwogCQlpNDBlX2ZkaXJfZmlsdGVyX3Jlc3RvcmUocGYtPnZzaVtwZi0+bGFuX3ZzaV0pOwogCQlpZiAoIWRpc2FibGVfYXRyKQotCQkJcGYtPmZsYWdzIHw9IEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRDsKKwkJCXBmLT5hdXRvX2Rpc2FibGVfZmxhZ3MgJj0gfkk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRDsKIAkJY2xlYXJfYml0KF9fSTQwRV9GRF9GTFVTSF9SRVFVRVNURUQsICZwZi0+c3RhdGUpOwogCQlpZiAoSTQwRV9ERUJVR19GRCAmIHBmLT5ody5kZWJ1Z19tYXNrKQogCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJGRCBGaWx0ZXIgdGFibGUgZmx1c2hlZCBhbmQgRkQtU0IgcmVwbGF5ZWQuXG4iKTsKQEAgLTYwMzcsOSArNjA1Myw2IEBACiAJaWYgKHRlc3RfYml0KF9fSTQwRV9ET1dOLCAmcGYtPnN0YXRlKSkKIAkJcmV0dXJuOwogCi0JaWYgKCEocGYtPmZsYWdzICYgKEk0MEVfRkxBR19GRF9TQl9FTkFCTEVEIHwgSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEKSkpCi0JCXJldHVybjsKLQogCWlmICh0ZXN0X2JpdChfX0k0MEVfRkRfRkxVU0hfUkVRVUVTVEVELCAmcGYtPnN0YXRlKSkKIAkJaTQwZV9mZGlyX2ZsdXNoX2FuZF9yZXBsYXkocGYpOwogCkBAIC03MTM5LDkgKzcxNTIsOSBAQAogCQkJcGYtPnBlbmRpbmdfdWRwX2JpdG1hcCAmPSB+QklUX1VMTChpKTsKIAkJCXBvcnQgPSBwZi0+dWRwX3BvcnRzW2ldLmluZGV4OwogCQkJaWYgKHBvcnQpCi0JCQkJcmV0ID0gaTQwZV9hcV9hZGRfdWRwX3R1bm5lbChodywgbnRvaHMocG9ydCksCi0JCQkJCQkgICAgIHBmLT51ZHBfcG9ydHNbaV0udHlwZSwKLQkJCQkJCSAgICAgTlVMTCwgTlVMTCk7CisJCQkJcmV0ID0gaTQwZV9hcV9hZGRfdWRwX3R1bm5lbChodywgcG9ydCwKKwkJCQkJCQlwZi0+dWRwX3BvcnRzW2ldLnR5cGUsCisJCQkJCQkJTlVMTCwgTlVMTCk7CiAJCQllbHNlCiAJCQkJcmV0ID0gaTQwZV9hcV9kZWxfdWRwX3R1bm5lbChodywgaSwgTlVMTCk7CiAKQEAgLTc2MjgsNyArNzY0MSw2IEBACiAJCQl2ZWN0b3JzX2xlZnQtLTsKIAkJfSBlbHNlIHsKIAkJCXBmLT5udW1fZmRzYl9tc2l4ID0gMDsKLQkJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0ZEX1NCX0VOQUJMRUQ7CiAJCX0KIAl9CiAKQEAgLTc2NDgsNiArNzY2MCw4IEBACiAjZW5kaWYKIAkvKiBjYW4gd2UgcmVzZXJ2ZSBlbm91Z2ggZm9yIGlXQVJQPyAqLwogCWlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfSVdBUlBfRU5BQkxFRCkgeworCQlpd2FycF9yZXF1ZXN0ZWQgPSBwZi0+bnVtX2l3YXJwX21zaXg7CisKIAkJaWYgKCF2ZWN0b3JzX2xlZnQpCiAJCQlwZi0+bnVtX2l3YXJwX21zaXggPSAwOwogCQllbHNlIGlmICh2ZWN0b3JzX2xlZnQgPCBwZi0+bnVtX2l3YXJwX21zaXgpCkBAIC03NjYxLDE4ICs3Njc1LDIzIEBACiAJCWludCB2bWRxX3ZlY3Nfd2FudGVkID0gcGYtPm51bV92bWRxX3ZzaXMgKiBwZi0+bnVtX3ZtZHFfcXBzOwogCQlpbnQgdm1kcV92ZWNzID0gbWluX3QoaW50LCB2ZWN0b3JzX2xlZnQsIHZtZHFfdmVjc193YW50ZWQpOwogCi0JCS8qIGlmIHdlJ3JlIHNob3J0IG9uIHZlY3RvcnMgZm9yIHdoYXQncyBkZXNpcmVkLCB3ZSBsaW1pdAotCQkgKiB0aGUgcXVldWVzIHBlciB2bWRxLiAgSWYgdGhpcyBpcyBzdGlsbCBtb3JlIHRoYW4gYXJlCi0JCSAqIGF2YWlsYWJsZSwgdGhlIHVzZXIgd2lsbCBuZWVkIHRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mCi0JCSAqIHF1ZXVlcy92ZWN0b3JzIHVzZWQgYnkgdGhlIFBGIGxhdGVyIHdpdGggdGhlIGV0aHRvb2wKLQkJICogY2hhbm5lbHMgY29tbWFuZAotCQkgKi8KLQkJaWYgKHZtZHFfdmVjcyA8IHZtZHFfdmVjc193YW50ZWQpCi0JCQlwZi0+bnVtX3ZtZHFfcXBzID0gMTsKLQkJcGYtPm51bV92bWRxX21zaXggPSBwZi0+bnVtX3ZtZHFfcXBzOworCQlpZiAoIXZlY3RvcnNfbGVmdCkgeworCQkJcGYtPm51bV92bWRxX21zaXggPSAwOworCQkJcGYtPm51bV92bWRxX3FwcyA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiBpZiB3ZSdyZSBzaG9ydCBvbiB2ZWN0b3JzIGZvciB3aGF0J3MgZGVzaXJlZCwgd2UgbGltaXQKKwkJCSAqIHRoZSBxdWV1ZXMgcGVyIHZtZHEuICBJZiB0aGlzIGlzIHN0aWxsIG1vcmUgdGhhbiBhcmUKKwkJCSAqIGF2YWlsYWJsZSwgdGhlIHVzZXIgd2lsbCBuZWVkIHRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mCisJCQkgKiBxdWV1ZXMvdmVjdG9ycyB1c2VkIGJ5IHRoZSBQRiBsYXRlciB3aXRoIHRoZSBldGh0b29sCisJCQkgKiBjaGFubmVscyBjb21tYW5kCisJCQkgKi8KKwkJCWlmICh2bWRxX3ZlY3MgPCB2bWRxX3ZlY3Nfd2FudGVkKQorCQkJCXBmLT5udW1fdm1kcV9xcHMgPSAxOworCQkJcGYtPm51bV92bWRxX21zaXggPSBwZi0+bnVtX3ZtZHFfcXBzOwogCi0JCXZfYnVkZ2V0ICs9IHZtZHFfdmVjczsKLQkJdmVjdG9yc19sZWZ0IC09IHZtZHFfdmVjczsKKwkJCXZfYnVkZ2V0ICs9IHZtZHFfdmVjczsKKwkJCXZlY3RvcnNfbGVmdCAtPSB2bWRxX3ZlY3M7CisJCX0KIAl9CiAKIAlwZi0+bXNpeF9lbnRyaWVzID0ga2NhbGxvYyh2X2J1ZGdldCwgc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSwKQEAgLTc2ODQsMjEgKzc3MDMsNiBAQAogCQlwZi0+bXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKIAl2X2FjdHVhbCA9IGk0MGVfcmVzZXJ2ZV9tc2l4X3ZlY3RvcnMocGYsIHZfYnVkZ2V0KTsKIAotCWlmICh2X2FjdHVhbCAhPSB2X2J1ZGdldCkgewotCQkvKiBJZiB3ZSBoYXZlIGxpbWl0ZWQgcmVzb3VyY2VzLCB3ZSB3aWxsIHN0YXJ0IHdpdGggbm8gdmVjdG9ycwotCQkgKiBmb3IgdGhlIHNwZWNpYWwgZmVhdHVyZXMgYW5kIHRoZW4gYWxsb2NhdGUgdmVjdG9ycyB0byBzb21lCi0JCSAqIG9mIHRoZXNlIGZlYXR1cmVzIGJhc2VkIG9uIHRoZSBwb2xpY3kgYW5kIGF0IHRoZSBlbmQgZGlzYWJsZQotCQkgKiB0aGUgZmVhdHVyZXMgdGhhdCBkaWQgbm90IGdldCBhbnkgdmVjdG9ycy4KLQkJICovCi0JCWl3YXJwX3JlcXVlc3RlZCA9IHBmLT5udW1faXdhcnBfbXNpeDsKLQkJcGYtPm51bV9pd2FycF9tc2l4ID0gMDsKLSNpZmRlZiBJNDBFX0ZDT0UKLQkJcGYtPm51bV9mY29lX3FwcyA9IDA7Ci0JCXBmLT5udW1fZmNvZV9tc2l4ID0gMDsKLSNlbmRpZgotCQlwZi0+bnVtX3ZtZHFfbXNpeCA9IDA7Ci0JfQotCiAJaWYgKHZfYWN0dWFsIDwgSTQwRV9NSU5fTVNJWCkgewogCQlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19NU0lYX0VOQUJMRUQ7CiAJCWtmcmVlKHBmLT5tc2l4X2VudHJpZXMpOwpAQCAtNzcxMiw5ICs3NzE2LDE2IEBACiAJCXBmLT5udW1fbGFuX3FwcyA9IDE7CiAJCXBmLT5udW1fbGFuX21zaXggPSAxOwogCi0JfSBlbHNlIGlmICh2X2FjdHVhbCAhPSB2X2J1ZGdldCkgeworCX0gZWxzZSBpZiAoIXZlY3RvcnNfbGVmdCkgeworCQkvKiBJZiB3ZSBoYXZlIGxpbWl0ZWQgcmVzb3VyY2VzLCB3ZSB3aWxsIHN0YXJ0IHdpdGggbm8gdmVjdG9ycworCQkgKiBmb3IgdGhlIHNwZWNpYWwgZmVhdHVyZXMgYW5kIHRoZW4gYWxsb2NhdGUgdmVjdG9ycyB0byBzb21lCisJCSAqIG9mIHRoZXNlIGZlYXR1cmVzIGJhc2VkIG9uIHRoZSBwb2xpY3kgYW5kIGF0IHRoZSBlbmQgZGlzYWJsZQorCQkgKiB0aGUgZmVhdHVyZXMgdGhhdCBkaWQgbm90IGdldCBhbnkgdmVjdG9ycy4KKwkJICovCiAJCWludCB2ZWM7CiAKKwkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCisJCQkgIk1TSS1YIHZlY3RvciBsaW1pdCByZWFjaGVkLCBhdHRlbXB0aW5nIHRvIHJlZGlzdHJpYnV0ZSB2ZWN0b3JzXG4iKTsKIAkJLyogcmVzZXJ2ZSB0aGUgbWlzYyB2ZWN0b3IgKi8KIAkJdmVjID0gdl9hY3R1YWwgLSAxOwogCkBAIC03NzIyLDcgKzc3MzMsMTAgQEAKIAkJcGYtPm51bV92bWRxX21zaXggPSAxOyAgICAvKiBmb3JjZSBWTURxcyB0byBvbmx5IG9uZSB2ZWN0b3IgKi8KIAkJcGYtPm51bV92bWRxX3ZzaXMgPSAxOwogCQlwZi0+bnVtX3ZtZHFfcXBzID0gMTsKLQkJcGYtPmZsYWdzICY9IH5JNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRDsKKyNpZmRlZiBJNDBFX0ZDT0UKKwkJcGYtPm51bV9mY29lX3FwcyA9IDA7CisJCXBmLT5udW1fZmNvZV9tc2l4ID0gMDsKKyNlbmRpZgogCiAJCS8qIHBhcnRpdGlvbiBvdXQgdGhlIHJlbWFpbmluZyB2ZWN0b3JzICovCiAJCXN3aXRjaCAodmVjKSB7CkBAIC03NzU0LDkgKzc3NjgsMTQgQEAKIAkJCQlwZi0+bnVtX3ZtZHFfdnNpcyA9IG1pbl90KGludCwgKHZlYyAvIDIpLAogCQkJCQkJICBJNDBFX0RFRkFVTFRfTlVNX1ZNRFFfVlNJKTsKIAkJCX0KKwkJCWlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCkgeworCQkJCXBmLT5udW1fZmRzYl9tc2l4ID0gMTsKKwkJCQl2ZWMtLTsKKwkJCX0KIAkJCXBmLT5udW1fbGFuX21zaXggPSBtaW5fdChpbnQsCiAJCQkgICAgICAgKHZlYyAtIChwZi0+bnVtX2l3YXJwX21zaXggKyBwZi0+bnVtX3ZtZHFfdnNpcykpLAogCQkJCQkJCSAgICAgIHBmLT5udW1fbGFuX21zaXgpOworCQkJcGYtPm51bV9sYW5fcXBzID0gcGYtPm51bV9sYW5fbXNpeDsKICNpZmRlZiBJNDBFX0ZDT0UKIAkJCS8qIGdpdmUgb25lIHZlY3RvciB0byBGQ29FICovCiAJCQlpZiAocGYtPmZsYWdzICYgSTQwRV9GTEFHX0ZDT0VfRU5BQkxFRCkgewpAQCAtNzc2OCw2ICs3Nzg3LDExIEBACiAJCX0KIAl9CiAKKwlpZiAoKHBmLT5mbGFncyAmIEk0MEVfRkxBR19GRF9TQl9FTkFCTEVEKSAmJgorCSAgICAocGYtPm51bV9mZHNiX21zaXggPT0gMCkpIHsKKwkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJTaWRlYmFuZCBGbG93ZGlyIGRpc2FibGVkLCBub3QgZW5vdWdoIE1TSS1YIHZlY3RvcnNcbiIpOworCQlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19GRF9TQl9FTkFCTEVEOworCX0KIAlpZiAoKHBmLT5mbGFncyAmIEk0MEVfRkxBR19WTURRX0VOQUJMRUQpICYmCiAJICAgIChwZi0+bnVtX3ZtZHFfbXNpeCA9PSAwKSkgewogCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIlZNRHEgZGlzYWJsZWQsIG5vdCBlbm91Z2ggTVNJLVggdmVjdG9yc1xuIik7CkBAIC03Nzg2LDYgKzc4MTAsMTMgQEAKIAkJcGYtPmZsYWdzICY9IH5JNDBFX0ZMQUdfRkNPRV9FTkFCTEVEOwogCX0KICNlbmRpZgorCWk0MGVfZGVidWcoJnBmLT5odywgSTQwRV9ERUJVR19JTklULAorCQkgICAiTVNJLVggdmVjdG9yIGRpc3RyaWJ1dGlvbjogUEYgJWQsIFZNRHEgJWQsIEZEU0IgJWQsIGlXQVJQICVkXG4iLAorCQkgICBwZi0+bnVtX2xhbl9tc2l4LAorCQkgICBwZi0+bnVtX3ZtZHFfbXNpeCAqIHBmLT5udW1fdm1kcV92c2lzLAorCQkgICBwZi0+bnVtX2Zkc2JfbXNpeCwKKwkJICAgcGYtPm51bV9pd2FycF9tc2l4KTsKKwogCXJldHVybiB2X2FjdHVhbDsKIH0KIApAQCAtNzg4Miw2ICs3OTEzLDcgQEAKICNlbmRpZgogCQkJCSAgICAgICBJNDBFX0ZMQUdfUlNTX0VOQUJMRUQJfAogCQkJCSAgICAgICBJNDBFX0ZMQUdfRENCX0NBUEFCTEUJfAorCQkJCSAgICAgICBJNDBFX0ZMQUdfRENCX0VOQUJMRUQJfAogCQkJCSAgICAgICBJNDBFX0ZMQUdfU1JJT1ZfRU5BQkxFRAl8CiAJCQkJICAgICAgIEk0MEVfRkxBR19GRF9TQl9FTkFCTEVECXwKIAkJCQkgICAgICAgSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVECXwKQEAgLTc5NzEsNzIgKzgwMDMsMzQgQEAKIHN0YXRpYyBpbnQgaTQwZV9jb25maWdfcnNzX2FxKHN0cnVjdCBpNDBlX3ZzaSAqdnNpLCBjb25zdCB1OCAqc2VlZCwKIAkJCSAgICAgIHU4ICpsdXQsIHUxNiBsdXRfc2l6ZSkKIHsKLQlzdHJ1Y3QgaTQwZV9hcWNfZ2V0X3NldF9yc3Nfa2V5X2RhdGEgcnNzX2tleTsKIAlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSB2c2ktPmJhY2s7CiAJc3RydWN0IGk0MGVfaHcgKmh3ID0gJnBmLT5odzsKLQlib29sIHBmX2x1dCA9IGZhbHNlOwotCXU4ICpyc3NfbHV0OwotCWludCByZXQsIGk7CisJaW50IHJldCA9IDA7CiAKLQltZW1jcHkoJnJzc19rZXksIHNlZWQsIHNpemVvZihyc3Nfa2V5KSk7Ci0KLQlyc3NfbHV0ID0ga3phbGxvYyhwZi0+cnNzX3RhYmxlX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghcnNzX2x1dCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBQb3B1bGF0ZSB0aGUgTFVUIHdpdGggbWF4IG5vLiBvZiBxdWV1ZXMgaW4gcm91bmQgcm9iaW4gZmFzaGlvbiAqLwotCWZvciAoaSA9IDA7IGkgPCB2c2ktPnJzc190YWJsZV9zaXplOyBpKyspCi0JCXJzc19sdXRbaV0gPSBpICUgdnNpLT5yc3Nfc2l6ZTsKLQotCXJldCA9IGk0MGVfYXFfc2V0X3Jzc19rZXkoaHcsIHZzaS0+aWQsICZyc3Nfa2V5KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAotCQkJICJDYW5ub3Qgc2V0IFJTUyBrZXksIGVyciAlcyBhcV9lcnIgJXNcbiIsCi0JCQkgaTQwZV9zdGF0X3N0cigmcGYtPmh3LCByZXQpLAotCQkJIGk0MGVfYXFfc3RyKCZwZi0+aHcsIHBmLT5ody5hcS5hc3FfbGFzdF9zdGF0dXMpKTsKLQkJZ290byBjb25maWdfcnNzX2FxX291dDsKKwlpZiAoc2VlZCkgeworCQlzdHJ1Y3QgaTQwZV9hcWNfZ2V0X3NldF9yc3Nfa2V5X2RhdGEgKnNlZWRfZHcgPQorCQkJKHN0cnVjdCBpNDBlX2FxY19nZXRfc2V0X3Jzc19rZXlfZGF0YSAqKXNlZWQ7CisJCXJldCA9IGk0MGVfYXFfc2V0X3Jzc19rZXkoaHcsIHZzaS0+aWQsIHNlZWRfZHcpOworCQlpZiAocmV0KSB7CisJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKKwkJCQkgIkNhbm5vdCBzZXQgUlNTIGtleSwgZXJyICVzIGFxX2VyciAlc1xuIiwKKwkJCQkgaTQwZV9zdGF0X3N0cihodywgcmV0KSwKKwkJCQkgaTQwZV9hcV9zdHIoaHcsIGh3LT5hcS5hc3FfbGFzdF9zdGF0dXMpKTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAl9CisJaWYgKGx1dCkgeworCQlib29sIHBmX2x1dCA9IHZzaS0+dHlwZSA9PSBJNDBFX1ZTSV9NQUlOID8gdHJ1ZSA6IGZhbHNlOwogCi0JaWYgKHZzaS0+dHlwZSA9PSBJNDBFX1ZTSV9NQUlOKQotCQlwZl9sdXQgPSB0cnVlOwotCi0JcmV0ID0gaTQwZV9hcV9zZXRfcnNzX2x1dChodywgdnNpLT5pZCwgcGZfbHV0LCByc3NfbHV0LAotCQkJCSAgdnNpLT5yc3NfdGFibGVfc2l6ZSk7Ci0JaWYgKHJldCkKLQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCi0JCQkgIkNhbm5vdCBzZXQgUlNTIGx1dCwgZXJyICVzIGFxX2VyciAlc1xuIiwKLQkJCSBpNDBlX3N0YXRfc3RyKCZwZi0+aHcsIHJldCksCi0JCQkgaTQwZV9hcV9zdHIoJnBmLT5odywgcGYtPmh3LmFxLmFzcV9sYXN0X3N0YXR1cykpOwotCi1jb25maWdfcnNzX2FxX291dDoKLQlrZnJlZShyc3NfbHV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGk0MGVfdnNpX2NvbmZpZ19yc3MgLSBQcmVwYXJlIGZvciBWU0koVk1EcSkgUlNTIGlmIHVzZWQKLSAqIEB2c2k6IFZTSSBzdHJ1Y3R1cmUKLSAqKi8KLXN0YXRpYyBpbnQgaTQwZV92c2lfY29uZmlnX3JzcyhzdHJ1Y3QgaTQwZV92c2kgKnZzaSkKLXsKLQl1OCBzZWVkW0k0MEVfSEtFWV9BUlJBWV9TSVpFXTsKLQlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSB2c2ktPmJhY2s7Ci0JdTggKmx1dDsKLQlpbnQgcmV0OwotCi0JaWYgKCEocGYtPmZsYWdzICYgSTQwRV9GTEFHX1JTU19BUV9DQVBBQkxFKSkKLQkJcmV0dXJuIDA7Ci0KLQlsdXQgPSBremFsbG9jKHZzaS0+cnNzX3RhYmxlX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghbHV0KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWk0MGVfZmlsbF9yc3NfbHV0KHBmLCBsdXQsIHZzaS0+cnNzX3RhYmxlX3NpemUsIHZzaS0+cnNzX3NpemUpOwotCW5ldGRldl9yc3Nfa2V5X2ZpbGwoKHZvaWQgKilzZWVkLCBJNDBFX0hLRVlfQVJSQVlfU0laRSk7Ci0JdnNpLT5yc3Nfc2l6ZSA9IG1pbl90KGludCwgcGYtPmFsbG9jX3Jzc19zaXplLCB2c2ktPm51bV9xdWV1ZV9wYWlycyk7Ci0JcmV0ID0gaTQwZV9jb25maWdfcnNzX2FxKHZzaSwgc2VlZCwgbHV0LCB2c2ktPnJzc190YWJsZV9zaXplKTsKLQlrZnJlZShsdXQpOwotCisJCXJldCA9IGk0MGVfYXFfc2V0X3Jzc19sdXQoaHcsIHZzaS0+aWQsIHBmX2x1dCwgbHV0LCBsdXRfc2l6ZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAorCQkJCSAiQ2Fubm90IHNldCBSU1MgbHV0LCBlcnIgJXMgYXFfZXJyICVzXG4iLAorCQkJCSBpNDBlX3N0YXRfc3RyKGh3LCByZXQpLAorCQkJCSBpNDBlX2FxX3N0cihodywgaHctPmFxLmFzcV9sYXN0X3N0YXR1cykpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC04MDg3LDYgKzgwODEsNDYgQEAKIH0KIAogLyoqCisgKiBpNDBlX3ZzaV9jb25maWdfcnNzIC0gUHJlcGFyZSBmb3IgVlNJKFZNRHEpIFJTUyBpZiB1c2VkCisgKiBAdnNpOiBWU0kgc3RydWN0dXJlCisgKiovCitzdGF0aWMgaW50IGk0MGVfdnNpX2NvbmZpZ19yc3Moc3RydWN0IGk0MGVfdnNpICp2c2kpCit7CisJdTggc2VlZFtJNDBFX0hLRVlfQVJSQVlfU0laRV07CisJc3RydWN0IGk0MGVfcGYgKnBmID0gdnNpLT5iYWNrOworCXU4ICpsdXQ7CisJaW50IHJldDsKKworCWlmICghKHBmLT5mbGFncyAmIEk0MEVfRkxBR19SU1NfQVFfQ0FQQUJMRSkpCisJCXJldHVybiAwOworCisJaWYgKCF2c2ktPnJzc19zaXplKQorCQl2c2ktPnJzc19zaXplID0gbWluX3QoaW50LCBwZi0+YWxsb2NfcnNzX3NpemUsCisJCQkJICAgICAgdnNpLT5udW1fcXVldWVfcGFpcnMpOworCWlmICghdnNpLT5yc3Nfc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsdXQgPSBremFsbG9jKHZzaS0+cnNzX3RhYmxlX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghbHV0KQorCQlyZXR1cm4gLUVOT01FTTsKKwkvKiBVc2UgdGhlIHVzZXIgY29uZmlndXJlZCBoYXNoIGtleXMgYW5kIGxvb2t1cCB0YWJsZSBpZiB0aGVyZSBpcyBvbmUsCisJICogb3RoZXJ3aXNlIHVzZSBkZWZhdWx0CisJICovCisJaWYgKHZzaS0+cnNzX2x1dF91c2VyKQorCQltZW1jcHkobHV0LCB2c2ktPnJzc19sdXRfdXNlciwgdnNpLT5yc3NfdGFibGVfc2l6ZSk7CisJZWxzZQorCQlpNDBlX2ZpbGxfcnNzX2x1dChwZiwgbHV0LCB2c2ktPnJzc190YWJsZV9zaXplLCB2c2ktPnJzc19zaXplKTsKKwlpZiAodnNpLT5yc3NfaGtleV91c2VyKQorCQltZW1jcHkoc2VlZCwgdnNpLT5yc3NfaGtleV91c2VyLCBJNDBFX0hLRVlfQVJSQVlfU0laRSk7CisJZWxzZQorCQluZXRkZXZfcnNzX2tleV9maWxsKCh2b2lkICopc2VlZCwgSTQwRV9IS0VZX0FSUkFZX1NJWkUpOworCXJldCA9IGk0MGVfY29uZmlnX3Jzc19hcSh2c2ksIHNlZWQsIGx1dCwgdnNpLT5yc3NfdGFibGVfc2l6ZSk7CisJa2ZyZWUobHV0KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgogICogaTQwZV9jb25maWdfcnNzX3JlZyAtIENvbmZpZ3VyZSBSU1Mga2V5cyBhbmQgbHV0IGJ5IHdyaXRpbmcgcmVnaXN0ZXJzCiAgKiBAdnNpOiBQb2ludGVyIHRvIHZzaSBzdHJ1Y3R1cmUKICAqIEBzZWVkOiBSU1MgaGFzaCBzZWVkCkBAIC04MjI0LDggKzgyNTgsOCBAQAogICogQHJzc190YWJsZV9zaXplOiBMb29rdXAgdGFibGUgc2l6ZQogICogQHJzc19zaXplOiBSYW5nZSBvZiBxdWV1ZSBudW1iZXIgZm9yIGhhc2hpbmcKICAqLwotc3RhdGljIHZvaWQgaTQwZV9maWxsX3Jzc19sdXQoc3RydWN0IGk0MGVfcGYgKnBmLCB1OCAqbHV0LAotCQkJICAgICAgdTE2IHJzc190YWJsZV9zaXplLCB1MTYgcnNzX3NpemUpCit2b2lkIGk0MGVfZmlsbF9yc3NfbHV0KHN0cnVjdCBpNDBlX3BmICpwZiwgdTggKmx1dCwKKwkJICAgICAgIHUxNiByc3NfdGFibGVfc2l6ZSwgdTE2IHJzc19zaXplKQogewogCXUxNiBpOwogCkBAIC04MjY2LDYgKzgzMDAsOCBAQAogCWlmICghdnNpLT5yc3Nfc2l6ZSkKIAkJdnNpLT5yc3Nfc2l6ZSA9IG1pbl90KGludCwgcGYtPmFsbG9jX3Jzc19zaXplLAogCQkJCSAgICAgIHZzaS0+bnVtX3F1ZXVlX3BhaXJzKTsKKwlpZiAoIXZzaS0+cnNzX3NpemUpCisJCXJldHVybiAtRUlOVkFMOwogCiAJbHV0ID0ga3phbGxvYyh2c2ktPnJzc190YWJsZV9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWx1dCkKQEAgLTg1OTAsNyArODYyNiw2IEBACiAJCQkgICAgIEk0MEVfRkxBR19XQl9PTl9JVFJfQ0FQQUJMRSB8CiAJCQkgICAgIEk0MEVfRkxBR19NVUxUSVBMRV9UQ1BfVURQX1JTU19QQ1RZUEUgfAogCQkJICAgICBJNDBFX0ZMQUdfTk9fUENJX0xJTktfQ0hFQ0sgfAotCQkJICAgICBJNDBFX0ZMQUdfMTAwTV9TR01JSV9DQVBBQkxFIHwKIAkJCSAgICAgSTQwRV9GTEFHX1VTRV9TRVRfTExEUF9NSUIgfAogCQkJICAgICBJNDBFX0ZMQUdfR0VORVZFX09GRkxPQURfQ0FQQUJMRTsKIAl9IGVsc2UgaWYgKChwZi0+aHcuYXEuYXBpX21hal92ZXIgPiAxKSB8fApAQCAtODY2NSwxOCArODcwMCw0MCBAQAogCQkvKiByZXNldCBmZCBjb3VudGVycyAqLwogCQlwZi0+ZmRfYWRkX2VyciA9IHBmLT5mZF9hdHJfY250ID0gcGYtPmZkX3RjcF9ydWxlID0gMDsKIAkJcGYtPmZkaXJfcGZfYWN0aXZlX2ZpbHRlcnMgPSAwOwotCQlwZi0+ZmxhZ3MgfD0gSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEOwotCQlpZiAoSTQwRV9ERUJVR19GRCAmIHBmLT5ody5kZWJ1Z19tYXNrKQotCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJBVFIgcmUtZW5hYmxlZC5cbiIpOwogCQkvKiBpZiBBVFIgd2FzIGF1dG8gZGlzYWJsZWQgaXQgY2FuIGJlIHJlLWVuYWJsZWQuICovCiAJCWlmICgocGYtPmZsYWdzICYgSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEKSAmJgotCQkgICAgKHBmLT5hdXRvX2Rpc2FibGVfZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQpKQorCQkgICAgKHBmLT5hdXRvX2Rpc2FibGVfZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQpKSB7CiAJCQlwZi0+YXV0b19kaXNhYmxlX2ZsYWdzICY9IH5JNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7CisJCQlpZiAoSTQwRV9ERUJVR19GRCAmIHBmLT5ody5kZWJ1Z19tYXNrKQorCQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiQVRSIHJlLWVuYWJsZWQuXG4iKTsKKwkJfQogCX0KIAlyZXR1cm4gbmVlZF9yZXNldDsKIH0KIAogLyoqCisgKiBpNDBlX2NsZWFyX3Jzc19sdXQgLSBjbGVhciB0aGUgcnggaGFzaCBsb29rdXAgdGFibGUKKyAqIEB2c2k6IHRoZSBWU0kgYmVpbmcgY29uZmlndXJlZAorICoqLworc3RhdGljIHZvaWQgaTQwZV9jbGVhcl9yc3NfbHV0KHN0cnVjdCBpNDBlX3ZzaSAqdnNpKQoreworCXN0cnVjdCBpNDBlX3BmICpwZiA9IHZzaS0+YmFjazsKKwlzdHJ1Y3QgaTQwZV9odyAqaHcgPSAmcGYtPmh3OworCXUxNiB2Zl9pZCA9IHZzaS0+dmZfaWQ7CisJdTggaTsKKworCWlmICh2c2ktPnR5cGUgPT0gSTQwRV9WU0lfTUFJTikgeworCQlmb3IgKGkgPSAwOyBpIDw9IEk0MEVfUEZRRl9ITFVUX01BWF9JTkRFWDsgaSsrKQorCQkJd3IzMihodywgSTQwRV9QRlFGX0hMVVQoaSksIDApOworCX0gZWxzZSBpZiAodnNpLT50eXBlID09IEk0MEVfVlNJX1NSSU9WKSB7CisJCWZvciAoaSA9IDA7IGkgPD0gSTQwRV9WRlFGX0hMVVRfTUFYX0lOREVYOyBpKyspCisJCQlpNDBlX3dyaXRlX3J4X2N0bChodywgSTQwRV9WRlFGX0hMVVQxKGksIHZmX2lkKSwgMCk7CisJfSBlbHNlIHsKKwkJZGV2X2VycigmcGYtPnBkZXYtPmRldiwgIkNhbm5vdCBzZXQgUlNTIExVVCAtIGludmFsaWQgVlNJIHR5cGVcbiIpOworCX0KK30KKworLyoqCiAgKiBpNDBlX3NldF9mZWF0dXJlcyAtIHNldCB0aGUgbmV0ZGV2IGZlYXR1cmUgZmxhZ3MKICAqIEBuZXRkZXY6IHB0ciB0byB0aGUgbmV0ZGV2IGJlaW5nIGFkanVzdGVkCiAgKiBAZmVhdHVyZXM6IHRoZSBmZWF0dXJlIHNldCB0aGF0IHRoZSBzdGFjayBpcyBzdWdnZXN0aW5nCkBAIC04Njg5LDYgKzg3NDYsMTIgQEAKIAlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSB2c2ktPmJhY2s7CiAJYm9vbCBuZWVkX3Jlc2V0OwogCisJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9SWEhBU0ggJiYgIShuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWEhBU0gpKQorCQlpNDBlX3BmX2NvbmZpZ19yc3MocGYpOworCWVsc2UgaWYgKCEoZmVhdHVyZXMgJiBORVRJRl9GX1JYSEFTSCkgJiYKKwkJIG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1JYSEFTSCkKKwkJaTQwZV9jbGVhcl9yc3NfbHV0KHZzaSk7CisKIAlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWCkKIAkJaTQwZV92bGFuX3N0cmlwcGluZ19lbmFibGUodnNpKTsKIAllbHNlCkBAIC0xMDQ4OCw2ICsxMDU1MSw3IEBACiAJCQkgICAgICAgSTQwRV9GTEFHX0ZEX1NCX0VOQUJMRUQJfAogCQkJICAgICAgIEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRAl8CiAJCQkgICAgICAgSTQwRV9GTEFHX0RDQl9DQVBBQkxFCXwKKwkJCSAgICAgICBJNDBFX0ZMQUdfRENCX0VOQUJMRUQJfAogCQkJICAgICAgIEk0MEVfRkxBR19TUklPVl9FTkFCTEVECXwKIAkJCSAgICAgICBJNDBFX0ZMQUdfVk1EUV9FTkFCTEVEKTsKIAl9IGVsc2UgaWYgKCEocGYtPmZsYWdzICYgKEk0MEVfRkxBR19SU1NfRU5BQkxFRCB8CkBAIC0xMDUxMSw3ICsxMDU3NSw4IEBACiAJCS8qIE5vdCBlbm91Z2ggcXVldWVzIGZvciBhbGwgVENzICovCiAJCWlmICgocGYtPmZsYWdzICYgSTQwRV9GTEFHX0RDQl9DQVBBQkxFKSAmJgogCQkgICAgKHF1ZXVlc19sZWZ0IDwgSTQwRV9NQVhfVFJBRkZJQ19DTEFTUykpIHsKLQkJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0RDQl9DQVBBQkxFOworCQkJcGYtPmZsYWdzICY9IH4oSTQwRV9GTEFHX0RDQl9DQVBBQkxFIHwKKwkJCQkJSTQwRV9GTEFHX0RDQl9FTkFCTEVEKTsKIAkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAibm90IGVub3VnaCBxdWV1ZXMgZm9yIERDQi4gRENCIGlzIGRpc2FibGVkLlxuIik7CiAJCX0KIAkJcGYtPm51bV9sYW5fcXBzID0gbWF4X3QoaW50LCBwZi0+cnNzX3NpemVfbWF4LApAQCAtMTA5MDgsNyArMTA5NzMsNyBAQAogCWVyciA9IGk0MGVfaW5pdF9wZl9kY2IocGYpOwogCWlmIChlcnIpIHsKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwgIkRDQiBpbml0IGZhaWxlZCAlZCwgZGlzYWJsZWRcbiIsIGVycik7Ci0JCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0RDQl9DQVBBQkxFOworCQlwZi0+ZmxhZ3MgJj0gfihJNDBFX0ZMQUdfRENCX0NBUEFCTEUgJiBJNDBFX0ZMQUdfRENCX0VOQUJMRUQpOwogCQkvKiBDb250aW51ZSB3aXRob3V0IERDQiBlbmFibGVkICovCiAJfQogI2VuZGlmIC8qIENPTkZJR19JNDBFX0RDQiAqLwpAQCAtMTEyODgsMTEgKzExMzUzLDcgQEAKIAl9CiAKIAkvKiBzaHV0ZG93biB0aGUgYWRtaW5xICovCi0JcmV0X2NvZGUgPSBpNDBlX3NodXRkb3duX2FkbWlucShodyk7Ci0JaWYgKHJldF9jb2RlKQotCQlkZXZfd2FybigmcGRldi0+ZGV2LAotCQkJICJGYWlsZWQgdG8gZGVzdHJveSB0aGUgQWRtaW4gUXVldWUgcmVzb3VyY2VzOiAlZFxuIiwKLQkJCSByZXRfY29kZSk7CisJaTQwZV9zaHV0ZG93bl9hZG1pbnEoaHcpOwogCiAJLyogZGVzdHJveSB0aGUgbG9ja3Mgb25seSBvbmNlLCBoZXJlICovCiAJbXV0ZXhfZGVzdHJveSgmaHctPmFxLmFycV9tdXRleCk7CkBAIC0xMTMzOSw2ICsxMTQwMCwxMiBAQAogCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzOiBlcnJvciAlZFxuIiwgX19mdW5jX18sIGVycm9yKTsKIAorCWlmICghcGYpIHsKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJCSAiQ2Fubm90IHJlY292ZXIgLSBlcnJvciBoYXBwZW5lZCBkdXJpbmcgZGV2aWNlIHByb2JlXG4iKTsKKwkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CisJfQorCiAJLyogc2h1dGRvd24gYWxsIG9wZXJhdGlvbnMgKi8KIAlpZiAoIXRlc3RfYml0KF9fSTQwRV9TVVNQRU5ERUQsICZwZi0+c3RhdGUpKSB7CiAJCXJ0bmxfbG9jaygpOwpAQCAtMTE1NjEsNyArMTE2MjgsOCBAQAogCSAqIGl0IGNhbid0IGJlIGFueSB3b3JzZSB0aGFuIHVzaW5nIHRoZSBzeXN0ZW0gd29ya3F1ZXVlIHdoaWNoCiAJICogd2FzIGFscmVhZHkgc2luZ2xlIHRocmVhZGVkCiAJICovCi0JaTQwZV93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKGk0MGVfZHJpdmVyX25hbWUpOworCWk0MGVfd3EgPSBhbGxvY193b3JrcXVldWUoIiVzIiwgV1FfVU5CT1VORCB8IFdRX01FTV9SRUNMQUlNLCAxLAorCQkJCSAgaTQwZV9kcml2ZXJfbmFtZSk7CiAJaWYgKCFpNDBlX3dxKSB7CiAJCXByX2VycigiJXM6IEZhaWxlZCB0byBjcmVhdGUgd29ya3F1ZXVlXG4iLCBpNDBlX2RyaXZlcl9uYW1lKTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfcHRwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfcHRwLmMKaW5kZXggZWQzOWNiYS4uZjFmZWNlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3B0cC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9wdHAuYwpAQCAtNjY5LDcgKzY2OSw3IEBACiAJCXBmLT5wdHBfY2xvY2sgPSBOVUxMOwogCQlkZXZfZXJyKCZwZi0+cGRldi0+ZGV2LCAiJXM6IHB0cF9jbG9ja19yZWdpc3RlciBmYWlsZWRcbiIsCiAJCQlfX2Z1bmNfXyk7Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKHBmLT5wdHBfY2xvY2spIHsKIAkJc3RydWN0IHRpbWVzcGVjNjQgdHM7CiAJCXUzMiByZWd2YWw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV90eHJ4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdHhyeC5jCmluZGV4IGRmN2VjYzkuLjYyODdiZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV90eHJ4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3R4cnguYwpAQCAtNDAsNiArNDAsNjkgQEAKIH0KIAogI2RlZmluZSBJNDBFX1RYRF9DTUQgKEk0MEVfVFhfREVTQ19DTURfRU9QIHwgSTQwRV9UWF9ERVNDX0NNRF9SUykKKy8qKgorICogaTQwZV9mZGlyIC0gR2VuZXJhdGUgYSBGbG93IERpcmVjdG9yIGRlc2NyaXB0b3IgYmFzZWQgb24gZmRhdGEKKyAqIEB0eF9yaW5nOiBUeCByaW5nIHRvIHNlbmQgYnVmZmVyIG9uCisgKiBAZmRhdGE6IEZsb3cgZGlyZWN0b3IgZmlsdGVyIGRhdGEKKyAqIEBhZGQ6IEluZGljYXRlIGlmIHdlIGFyZSBhZGRpbmcgYSBydWxlIG9yIGRlbGV0aW5nIG9uZQorICoKKyAqKi8KK3N0YXRpYyB2b2lkIGk0MGVfZmRpcihzdHJ1Y3QgaTQwZV9yaW5nICp0eF9yaW5nLAorCQkgICAgICBzdHJ1Y3QgaTQwZV9mZGlyX2ZpbHRlciAqZmRhdGEsIGJvb2wgYWRkKQoreworCXN0cnVjdCBpNDBlX2ZpbHRlcl9wcm9ncmFtX2Rlc2MgKmZkaXJfZGVzYzsKKwlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSB0eF9yaW5nLT52c2ktPmJhY2s7CisJdTMyIGZsZXhfcHR5cGUsIGR0eXBlX2NtZDsKKwl1MTYgaTsKKworCS8qIGdyYWIgdGhlIG5leHQgZGVzY3JpcHRvciAqLworCWkgPSB0eF9yaW5nLT5uZXh0X3RvX3VzZTsKKwlmZGlyX2Rlc2MgPSBJNDBFX1RYX0ZESVJERVNDKHR4X3JpbmcsIGkpOworCisJaSsrOworCXR4X3JpbmctPm5leHRfdG9fdXNlID0gKGkgPCB0eF9yaW5nLT5jb3VudCkgPyBpIDogMDsKKworCWZsZXhfcHR5cGUgPSBJNDBFX1RYRF9GTFRSX1FXMF9RSU5ERVhfTUFTSyAmCisJCSAgICAgKGZkYXRhLT5xX2luZGV4IDw8IEk0MEVfVFhEX0ZMVFJfUVcwX1FJTkRFWF9TSElGVCk7CisKKwlmbGV4X3B0eXBlIHw9IEk0MEVfVFhEX0ZMVFJfUVcwX0ZMRVhPRkZfTUFTSyAmCisJCSAgICAgIChmZGF0YS0+ZmxleF9vZmYgPDwgSTQwRV9UWERfRkxUUl9RVzBfRkxFWE9GRl9TSElGVCk7CisKKwlmbGV4X3B0eXBlIHw9IEk0MEVfVFhEX0ZMVFJfUVcwX1BDVFlQRV9NQVNLICYKKwkJICAgICAgKGZkYXRhLT5wY3R5cGUgPDwgSTQwRV9UWERfRkxUUl9RVzBfUENUWVBFX1NISUZUKTsKKworCS8qIFVzZSBMQU4gVlNJIElkIGlmIG5vdCBwcm9ncmFtbWVkIGJ5IHVzZXIgKi8KKwlmbGV4X3B0eXBlIHw9IEk0MEVfVFhEX0ZMVFJfUVcwX0RFU1RfVlNJX01BU0sgJgorCQkgICAgICAoKHUzMikoZmRhdGEtPmRlc3RfdnNpID8gOiBwZi0+dnNpW3BmLT5sYW5fdnNpXS0+aWQpIDw8CisJCSAgICAgICBJNDBFX1RYRF9GTFRSX1FXMF9ERVNUX1ZTSV9TSElGVCk7CisKKwlkdHlwZV9jbWQgPSBJNDBFX1RYX0RFU0NfRFRZUEVfRklMVEVSX1BST0c7CisKKwlkdHlwZV9jbWQgfD0gYWRkID8KKwkJICAgICBJNDBFX0ZJTFRFUl9QUk9HUkFNX0RFU0NfUENNRF9BRERfVVBEQVRFIDw8CisJCSAgICAgSTQwRV9UWERfRkxUUl9RVzFfUENNRF9TSElGVCA6CisJCSAgICAgSTQwRV9GSUxURVJfUFJPR1JBTV9ERVNDX1BDTURfUkVNT1ZFIDw8CisJCSAgICAgSTQwRV9UWERfRkxUUl9RVzFfUENNRF9TSElGVDsKKworCWR0eXBlX2NtZCB8PSBJNDBFX1RYRF9GTFRSX1FXMV9ERVNUX01BU0sgJgorCQkgICAgIChmZGF0YS0+ZGVzdF9jdGwgPDwgSTQwRV9UWERfRkxUUl9RVzFfREVTVF9TSElGVCk7CisKKwlkdHlwZV9jbWQgfD0gSTQwRV9UWERfRkxUUl9RVzFfRkRfU1RBVFVTX01BU0sgJgorCQkgICAgIChmZGF0YS0+ZmRfc3RhdHVzIDw8IEk0MEVfVFhEX0ZMVFJfUVcxX0ZEX1NUQVRVU19TSElGVCk7CisKKwlpZiAoZmRhdGEtPmNudF9pbmRleCkgeworCQlkdHlwZV9jbWQgfD0gSTQwRV9UWERfRkxUUl9RVzFfQ05UX0VOQV9NQVNLOworCQlkdHlwZV9jbWQgfD0gSTQwRV9UWERfRkxUUl9RVzFfQ05USU5ERVhfTUFTSyAmCisJCQkgICAgICgodTMyKWZkYXRhLT5jbnRfaW5kZXggPDwKKwkJCSAgICAgIEk0MEVfVFhEX0ZMVFJfUVcxX0NOVElOREVYX1NISUZUKTsKKwl9CisKKwlmZGlyX2Rlc2MtPnFpbmRleF9mbGV4X3B0eXBlX3ZzaSA9IGNwdV90b19sZTMyKGZsZXhfcHR5cGUpOworCWZkaXJfZGVzYy0+cnN2ZCA9IGNwdV90b19sZTMyKDApOworCWZkaXJfZGVzYy0+ZHR5cGVfY21kX2NudGluZGV4ID0gY3B1X3RvX2xlMzIoZHR5cGVfY21kKTsKKwlmZGlyX2Rlc2MtPmZkX2lkID0gY3B1X3RvX2xlMzIoZmRhdGEtPmZkX2lkKTsKK30KKwogI2RlZmluZSBJNDBFX0ZEX0NMRUFOX0RFTEFZIDEwCiAvKioKICAqIGk0MGVfcHJvZ3JhbV9mZGlyX2ZpbHRlciAtIFByb2dyYW0gYSBGbG93IERpcmVjdG9yIGZpbHRlcgpAQCAtNDgsMTQgKzExMSwxMyBAQAogICogQHBmOiBUaGUgUEYgcG9pbnRlcgogICogQGFkZDogVHJ1ZSBmb3IgYWRkL3VwZGF0ZSwgRmFsc2UgZm9yIHJlbW92ZQogICoqLwotaW50IGk0MGVfcHJvZ3JhbV9mZGlyX2ZpbHRlcihzdHJ1Y3QgaTQwZV9mZGlyX2ZpbHRlciAqZmRpcl9kYXRhLCB1OCAqcmF3X3BhY2tldCwKLQkJCSAgICAgc3RydWN0IGk0MGVfcGYgKnBmLCBib29sIGFkZCkKK3N0YXRpYyBpbnQgaTQwZV9wcm9ncmFtX2ZkaXJfZmlsdGVyKHN0cnVjdCBpNDBlX2ZkaXJfZmlsdGVyICpmZGlyX2RhdGEsCisJCQkJICAgIHU4ICpyYXdfcGFja2V0LCBzdHJ1Y3QgaTQwZV9wZiAqcGYsCisJCQkJICAgIGJvb2wgYWRkKQogewotCXN0cnVjdCBpNDBlX2ZpbHRlcl9wcm9ncmFtX2Rlc2MgKmZkaXJfZGVzYzsKIAlzdHJ1Y3QgaTQwZV90eF9idWZmZXIgKnR4X2J1ZiwgKmZpcnN0OwogCXN0cnVjdCBpNDBlX3R4X2Rlc2MgKnR4X2Rlc2M7CiAJc3RydWN0IGk0MGVfcmluZyAqdHhfcmluZzsKLQl1bnNpZ25lZCBpbnQgZnB0LCBkY2M7CiAJc3RydWN0IGk0MGVfdnNpICp2c2k7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCWRtYV9hZGRyX3QgZG1hOwpAQCAtOTIsNTYgKzE1NCw4IEBACiAKIAkvKiBncmFiIHRoZSBuZXh0IGRlc2NyaXB0b3IgKi8KIAlpID0gdHhfcmluZy0+bmV4dF90b191c2U7Ci0JZmRpcl9kZXNjID0gSTQwRV9UWF9GRElSREVTQyh0eF9yaW5nLCBpKTsKIAlmaXJzdCA9ICZ0eF9yaW5nLT50eF9iaVtpXTsKLQltZW1zZXQoZmlyc3QsIDAsIHNpemVvZihzdHJ1Y3QgaTQwZV90eF9idWZmZXIpKTsKLQotCXR4X3JpbmctPm5leHRfdG9fdXNlID0gKChpICsgMSkgPCB0eF9yaW5nLT5jb3VudCkgPyBpICsgMSA6IDA7Ci0KLQlmcHQgPSAoZmRpcl9kYXRhLT5xX2luZGV4IDw8IEk0MEVfVFhEX0ZMVFJfUVcwX1FJTkRFWF9TSElGVCkgJgotCSAgICAgIEk0MEVfVFhEX0ZMVFJfUVcwX1FJTkRFWF9NQVNLOwotCi0JZnB0IHw9IChmZGlyX2RhdGEtPmZsZXhfb2ZmIDw8IEk0MEVfVFhEX0ZMVFJfUVcwX0ZMRVhPRkZfU0hJRlQpICYKLQkgICAgICAgSTQwRV9UWERfRkxUUl9RVzBfRkxFWE9GRl9NQVNLOwotCi0JZnB0IHw9IChmZGlyX2RhdGEtPnBjdHlwZSA8PCBJNDBFX1RYRF9GTFRSX1FXMF9QQ1RZUEVfU0hJRlQpICYKLQkgICAgICAgSTQwRV9UWERfRkxUUl9RVzBfUENUWVBFX01BU0s7Ci0KLQkvKiBVc2UgTEFOIFZTSSBJZCBpZiBub3QgcHJvZ3JhbW1lZCBieSB1c2VyICovCi0JaWYgKGZkaXJfZGF0YS0+ZGVzdF92c2kgPT0gMCkKLQkJZnB0IHw9IChwZi0+dnNpW3BmLT5sYW5fdnNpXS0+aWQpIDw8Ci0JCSAgICAgICBJNDBFX1RYRF9GTFRSX1FXMF9ERVNUX1ZTSV9TSElGVDsKLQllbHNlCi0JCWZwdCB8PSAoKHUzMilmZGlyX2RhdGEtPmRlc3RfdnNpIDw8Ci0JCQlJNDBFX1RYRF9GTFRSX1FXMF9ERVNUX1ZTSV9TSElGVCkgJgotCQkgICAgICAgSTQwRV9UWERfRkxUUl9RVzBfREVTVF9WU0lfTUFTSzsKLQotCWRjYyA9IEk0MEVfVFhfREVTQ19EVFlQRV9GSUxURVJfUFJPRzsKLQotCWlmIChhZGQpCi0JCWRjYyB8PSBJNDBFX0ZJTFRFUl9QUk9HUkFNX0RFU0NfUENNRF9BRERfVVBEQVRFIDw8Ci0JCSAgICAgICBJNDBFX1RYRF9GTFRSX1FXMV9QQ01EX1NISUZUOwotCWVsc2UKLQkJZGNjIHw9IEk0MEVfRklMVEVSX1BST0dSQU1fREVTQ19QQ01EX1JFTU9WRSA8PAotCQkgICAgICAgSTQwRV9UWERfRkxUUl9RVzFfUENNRF9TSElGVDsKLQotCWRjYyB8PSAoZmRpcl9kYXRhLT5kZXN0X2N0bCA8PCBJNDBFX1RYRF9GTFRSX1FXMV9ERVNUX1NISUZUKSAmCi0JICAgICAgIEk0MEVfVFhEX0ZMVFJfUVcxX0RFU1RfTUFTSzsKLQotCWRjYyB8PSAoZmRpcl9kYXRhLT5mZF9zdGF0dXMgPDwgSTQwRV9UWERfRkxUUl9RVzFfRkRfU1RBVFVTX1NISUZUKSAmCi0JICAgICAgIEk0MEVfVFhEX0ZMVFJfUVcxX0ZEX1NUQVRVU19NQVNLOwotCi0JaWYgKGZkaXJfZGF0YS0+Y250X2luZGV4ICE9IDApIHsKLQkJZGNjIHw9IEk0MEVfVFhEX0ZMVFJfUVcxX0NOVF9FTkFfTUFTSzsKLQkJZGNjIHw9ICgodTMyKWZkaXJfZGF0YS0+Y250X2luZGV4IDw8Ci0JCQlJNDBFX1RYRF9GTFRSX1FXMV9DTlRJTkRFWF9TSElGVCkgJgotCQkJSTQwRV9UWERfRkxUUl9RVzFfQ05USU5ERVhfTUFTSzsKLQl9Ci0KLQlmZGlyX2Rlc2MtPnFpbmRleF9mbGV4X3B0eXBlX3ZzaSA9IGNwdV90b19sZTMyKGZwdCk7Ci0JZmRpcl9kZXNjLT5yc3ZkID0gY3B1X3RvX2xlMzIoMCk7Ci0JZmRpcl9kZXNjLT5kdHlwZV9jbWRfY250aW5kZXggPSBjcHVfdG9fbGUzMihkY2MpOwotCWZkaXJfZGVzYy0+ZmRfaWQgPSBjcHVfdG9fbGUzMihmZGlyX2RhdGEtPmZkX2lkKTsKKwlpNDBlX2ZkaXIodHhfcmluZywgZmRpcl9kYXRhLCBhZGQpOwogCiAJLyogTm93IHByb2dyYW0gYSBkdW1teSBkZXNjcmlwdG9yICovCiAJaSA9IHR4X3JpbmctPm5leHRfdG9fdXNlOwpAQCAtMjgyLDE4ICsyOTYsMTggQEAKIAogCWlmIChhZGQpIHsKIAkJcGYtPmZkX3RjcF9ydWxlKys7Ci0JCWlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQpIHsKLQkJCWlmIChJNDBFX0RFQlVHX0ZEICYgcGYtPmh3LmRlYnVnX21hc2spCi0JCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJGb3JjaW5nIEFUUiBvZmYsIHNpZGViYW5kIHJ1bGVzIGZvciBUQ1AvSVB2NCBmbG93IGJlaW5nIGFwcGxpZWRcbiIpOwotCQkJcGYtPmZsYWdzICY9IH5JNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7Ci0JCX0KKwkJaWYgKChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQpICYmCisJCSAgICBJNDBFX0RFQlVHX0ZEICYgcGYtPmh3LmRlYnVnX21hc2spCisJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIkZvcmNpbmcgQVRSIG9mZiwgc2lkZWJhbmQgcnVsZXMgZm9yIFRDUC9JUHY0IGZsb3cgYmVpbmcgYXBwbGllZFxuIik7CisJCXBmLT5hdXRvX2Rpc2FibGVfZmxhZ3MgfD0gSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEOwogCX0gZWxzZSB7CiAJCXBmLT5mZF90Y3BfcnVsZSA9IChwZi0+ZmRfdGNwX3J1bGUgPiAwKSA/CiAJCQkJICAocGYtPmZkX3RjcF9ydWxlIC0gMSkgOiAwOwogCQlpZiAocGYtPmZkX3RjcF9ydWxlID09IDApIHsKLQkJCXBmLT5mbGFncyB8PSBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7Ci0JCQlpZiAoSTQwRV9ERUJVR19GRCAmIHBmLT5ody5kZWJ1Z19tYXNrKQorCQkJaWYgKChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQpICYmCisJCQkgICAgSTQwRV9ERUJVR19GRCAmIHBmLT5ody5kZWJ1Z19tYXNrKQogCQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiQVRSIHJlLWVuYWJsZWQgZHVlIHRvIG5vIHNpZGViYW5kIFRDUC9JUHY0IHJ1bGVzXG4iKTsKKwkJCXBmLT5hdXRvX2Rpc2FibGVfZmxhZ3MgJj0gfkk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRDsKIAkJfQogCX0KIApAQCAtNTMyLDcgKzU0NiwxMCBAQAogCQkJCQkgICAgc3RydWN0IGk0MGVfdHhfYnVmZmVyICp0eF9idWZmZXIpCiB7CiAJaWYgKHR4X2J1ZmZlci0+c2tiKSB7Ci0JCWRldl9rZnJlZV9za2JfYW55KHR4X2J1ZmZlci0+c2tiKTsKKwkJaWYgKHR4X2J1ZmZlci0+dHhfZmxhZ3MgJiBJNDBFX1RYX0ZMQUdTX0ZEX1NCKQorCQkJa2ZyZWUodHhfYnVmZmVyLT5yYXdfYnVmKTsKKwkJZWxzZQorCQkJZGV2X2tmcmVlX3NrYl9hbnkodHhfYnVmZmVyLT5za2IpOwogCQlpZiAoZG1hX3VubWFwX2xlbih0eF9idWZmZXIsIGxlbikpCiAJCQlkbWFfdW5tYXBfc2luZ2xlKHJpbmctPmRldiwKIAkJCQkJIGRtYV91bm1hcF9hZGRyKHR4X2J1ZmZlciwgZG1hKSwKQEAgLTU0NSw5ICs1NjIsNiBAQAogCQkJICAgICAgIERNQV9UT19ERVZJQ0UpOwogCX0KIAotCWlmICh0eF9idWZmZXItPnR4X2ZsYWdzICYgSTQwRV9UWF9GTEFHU19GRF9TQikKLQkJa2ZyZWUodHhfYnVmZmVyLT5yYXdfYnVmKTsKLQogCXR4X2J1ZmZlci0+bmV4dF90b193YXRjaCA9IE5VTEw7CiAJdHhfYnVmZmVyLT5za2IgPSBOVUxMOwogCWRtYV91bm1hcF9sZW5fc2V0KHR4X2J1ZmZlciwgbGVuLCAwKTsKQEAgLTU4NCw4ICs1OTgsNyBAQAogCQlyZXR1cm47CiAKIAkvKiBjbGVhbnVwIFR4IHF1ZXVlIHN0YXRpc3RpY3MgKi8KLQluZXRkZXZfdHhfcmVzZXRfcXVldWUobmV0ZGV2X2dldF90eF9xdWV1ZSh0eF9yaW5nLT5uZXRkZXYsCi0JCQkJCQkgIHR4X3JpbmctPnF1ZXVlX2luZGV4KSk7CisJbmV0ZGV2X3R4X3Jlc2V0X3F1ZXVlKHR4cmluZ190eHEodHhfcmluZykpOwogfQogCiAvKioKQEAgLTc1NCw4ICs3NjcsOCBAQAogCQkJdHhfcmluZy0+YXJtX3diID0gdHJ1ZTsKIAl9CiAKLQluZXRkZXZfdHhfY29tcGxldGVkX3F1ZXVlKG5ldGRldl9nZXRfdHhfcXVldWUodHhfcmluZy0+bmV0ZGV2LAotCQkJCQkJICAgICAgdHhfcmluZy0+cXVldWVfaW5kZXgpLAorCS8qIG5vdGlmeSBuZXRkZXYgb2YgY29tcGxldGVkIGJ1ZmZlcnMgKi8KKwluZXRkZXZfdHhfY29tcGxldGVkX3F1ZXVlKHR4cmluZ190eHEodHhfcmluZyksCiAJCQkJICB0b3RhbF9wYWNrZXRzLCB0b3RhbF9ieXRlcyk7CiAKICNkZWZpbmUgVFhfV0FLRV9USFJFU0hPTEQgKERFU0NfTkVFREVEICogMikKQEAgLTE4NjQsNiArMTg3NywxNSBAQAogCiAvKiBhIHNtYWxsIG1hY3JvIHRvIHNob3J0ZW4gdXAgc29tZSBsb25nIGxpbmVzICovCiAjZGVmaW5lIElOVFJFRyBJNDBFX1BGSU5UX0RZTl9DVExOCitzdGF0aWMgaW5saW5lIGludCBnZXRfcnhfaXRyX2VuYWJsZWQoc3RydWN0IGk0MGVfdnNpICp2c2ksIGludCBpZHgpCit7CisJcmV0dXJuICEhKHZzaS0+cnhfcmluZ3NbaWR4XS0+cnhfaXRyX3NldHRpbmcpOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfdHhfaXRyX2VuYWJsZWQoc3RydWN0IGk0MGVfdnNpICp2c2ksIGludCBpZHgpCit7CisJcmV0dXJuICEhKHZzaS0+dHhfcmluZ3NbaWR4XS0+dHhfaXRyX3NldHRpbmcpOworfQogCiAvKioKICAqIGk0MGVfdXBkYXRlX2VuYWJsZV9pdHIgLSBVcGRhdGUgaXRyIGFuZCByZS1lbmFibGUgTVNJWCBpbnRlcnJ1cHQKQEAgLTE4NzksNiArMTkwMSw3IEBACiAJdTMyIHJ4dmFsLCB0eHZhbDsKIAlpbnQgdmVjdG9yOwogCWludCBpZHggPSBxX3ZlY3Rvci0+dl9pZHg7CisJaW50IHJ4X2l0cl9zZXR0aW5nLCB0eF9pdHJfc2V0dGluZzsKIAogCXZlY3RvciA9IChxX3ZlY3Rvci0+dl9pZHggKyB2c2ktPmJhc2VfdmVjdG9yKTsKIApAQCAtMTg4NywxOCArMTkxMCwyMSBAQAogCSAqLwogCXJ4dmFsID0gdHh2YWwgPSBpNDBlX2J1aWxkcmVnX2l0cihJNDBFX0lUUl9OT05FLCAwKTsKIAorCXJ4X2l0cl9zZXR0aW5nID0gZ2V0X3J4X2l0cl9lbmFibGVkKHZzaSwgaWR4KTsKKwl0eF9pdHJfc2V0dGluZyA9IGdldF90eF9pdHJfZW5hYmxlZCh2c2ksIGlkeCk7CisKIAlpZiAocV92ZWN0b3ItPml0cl9jb3VudGRvd24gPiAwIHx8Ci0JICAgICghSVRSX0lTX0RZTkFNSUModnNpLT5yeF9yaW5nc1tpZHhdLT5yeF9pdHJfc2V0dGluZykgJiYKLQkgICAgICFJVFJfSVNfRFlOQU1JQyh2c2ktPnR4X3JpbmdzW2lkeF0tPnR4X2l0cl9zZXR0aW5nKSkpIHsKKwkgICAgKCFJVFJfSVNfRFlOQU1JQyhyeF9pdHJfc2V0dGluZykgJiYKKwkgICAgICFJVFJfSVNfRFlOQU1JQyh0eF9pdHJfc2V0dGluZykpKSB7CiAJCWdvdG8gZW5hYmxlX2ludDsKIAl9CiAKLQlpZiAoSVRSX0lTX0RZTkFNSUModnNpLT5yeF9yaW5nc1tpZHhdLT5yeF9pdHJfc2V0dGluZykpIHsKKwlpZiAoSVRSX0lTX0RZTkFNSUModHhfaXRyX3NldHRpbmcpKSB7CiAJCXJ4ID0gaTQwZV9zZXRfbmV3X2R5bmFtaWNfaXRyKCZxX3ZlY3Rvci0+cngpOwogCQlyeHZhbCA9IGk0MGVfYnVpbGRyZWdfaXRyKEk0MEVfUlhfSVRSLCBxX3ZlY3Rvci0+cnguaXRyKTsKIAl9CiAKLQlpZiAoSVRSX0lTX0RZTkFNSUModnNpLT50eF9yaW5nc1tpZHhdLT50eF9pdHJfc2V0dGluZykpIHsKKwlpZiAoSVRSX0lTX0RZTkFNSUModHhfaXRyX3NldHRpbmcpKSB7CiAJCXR4ID0gaTQwZV9zZXRfbmV3X2R5bmFtaWNfaXRyKCZxX3ZlY3Rvci0+dHgpOwogCQl0eHZhbCA9IGk0MGVfYnVpbGRyZWdfaXRyKEk0MEVfVFhfSVRSLCBxX3ZlY3Rvci0+dHguaXRyKTsKIAl9CkBAIC0yNjIxLDkgKzI2NDcsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAKIAkvKiBXZSBuZWVkIHRvIHdhbGsgdGhyb3VnaCB0aGUgbGlzdCBhbmQgdmFsaWRhdGUgdGhhdCBlYWNoIGdyb3VwCi0JICogb2YgNiBmcmFnbWVudHMgdG90YWxzIGF0IGxlYXN0IGdzb19zaXplLiAgSG93ZXZlciB3ZSBkb24ndCBuZWVkCi0JICogdG8gcGVyZm9ybSBzdWNoIHZhbGlkYXRpb24gb24gdGhlIGxhc3QgNiBzaW5jZSB0aGUgbGFzdCA2IGNhbm5vdAotCSAqIGluaGVyaXQgYW55IGRhdGEgZnJvbSBhIGRlc2NyaXB0b3IgYWZ0ZXIgdGhlbS4KKwkgKiBvZiA2IGZyYWdtZW50cyB0b3RhbHMgYXQgbGVhc3QgZ3NvX3NpemUuCiAJICovCiAJbnJfZnJhZ3MgLT0gSTQwRV9NQVhfQlVGRkVSX1RYRCAtIDI7CiAJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdOwpAQCAtMjY1NCw4ICsyNjc4LDcgQEAKIAkJaWYgKHN1bSA8IDApCiAJCQlyZXR1cm4gdHJ1ZTsKIAotCQkvKiB1c2UgcHJlLWRlY3JlbWVudCB0byBhdm9pZCBwcm9jZXNzaW5nIGxhc3QgZnJhZ21lbnQgKi8KLQkJaWYgKCEtLW5yX2ZyYWdzKQorCQlpZiAoIW5yX2ZyYWdzLS0pCiAJCQlicmVhazsKIAogCQlzdW0gLT0gc2tiX2ZyYWdfc2l6ZShzdGFsZSsrKTsKQEAgLTI3ODcsOSArMjgxMCw3IEBACiAKIAl0eF9yaW5nLT5uZXh0X3RvX3VzZSA9IGk7CiAKLQluZXRkZXZfdHhfc2VudF9xdWV1ZShuZXRkZXZfZ2V0X3R4X3F1ZXVlKHR4X3JpbmctPm5ldGRldiwKLQkJCQkJCSB0eF9yaW5nLT5xdWV1ZV9pbmRleCksCi0JCQkJCQkgZmlyc3QtPmJ5dGVjb3VudCk7CisJbmV0ZGV2X3R4X3NlbnRfcXVldWUodHhyaW5nX3R4cSh0eF9yaW5nKSwgZmlyc3QtPmJ5dGVjb3VudCk7CiAJaTQwZV9tYXliZV9zdG9wX3R4KHR4X3JpbmcsIERFU0NfTkVFREVEKTsKIAogCS8qIEFsZ29yaXRobSB0byBvcHRpbWl6ZSB0YWlsIGFuZCBSUyBiaXQgc2V0dGluZzoKQEAgLTI4MTQsMTMgKzI4MzUsMTEgQEAKIAkgKiB0cmlnZ2VyIGEgZm9yY2UgV0IuCiAJICovCiAJaWYgKHNrYi0+eG1pdF9tb3JlICAmJgotCSAgICAhbmV0aWZfeG1pdF9zdG9wcGVkKG5ldGRldl9nZXRfdHhfcXVldWUodHhfcmluZy0+bmV0ZGV2LAotCQkJCQkJICAgIHR4X3JpbmctPnF1ZXVlX2luZGV4KSkpIHsKKwkgICAgIW5ldGlmX3htaXRfc3RvcHBlZCh0eHJpbmdfdHhxKHR4X3JpbmcpKSkgewogCQl0eF9yaW5nLT5mbGFncyB8PSBJNDBFX1RYUl9GTEFHU19MQVNUX1hNSVRfTU9SRV9TRVQ7CiAJCXRhaWxfYnVtcCA9IGZhbHNlOwogCX0gZWxzZSBpZiAoIXNrYi0+eG1pdF9tb3JlICYmCi0JCSAgICFuZXRpZl94bWl0X3N0b3BwZWQobmV0ZGV2X2dldF90eF9xdWV1ZSh0eF9yaW5nLT5uZXRkZXYsCi0JCQkJCQkgICAgICAgdHhfcmluZy0+cXVldWVfaW5kZXgpKSAmJgorCQkgICAhbmV0aWZfeG1pdF9zdG9wcGVkKHR4cmluZ190eHEodHhfcmluZykpICYmCiAJCSAgICghKHR4X3JpbmctPmZsYWdzICYgSTQwRV9UWFJfRkxBR1NfTEFTVF9YTUlUX01PUkVfU0VUKSkgJiYKIAkJICAgKHR4X3JpbmctPnBhY2tldF9zdHJpZGUgPCBXQl9TVFJJREUpICYmCiAJCSAgIChkZXNjX2NvdW50IDwgV0JfU1RSSURFKSkgewpAQCAtMjg0MCwxMCArMjg1OSw5IEBACiAJCQkJCQkgIEk0MEVfVFhEX1FXMV9DTURfU0hJRlQpOwogCiAJLyogbm90aWZ5IEhXIG9mIHBhY2tldCAqLwotCWlmICghdGFpbF9idW1wKQorCWlmICghdGFpbF9idW1wKSB7CiAJCXByZWZldGNodyh0eF9kZXNjICsgMSk7Ci0KLQlpZiAodGFpbF9idW1wKSB7CisJfSBlbHNlIHsKIAkJLyogRm9yY2UgbWVtb3J5IHdyaXRlcyB0byBjb21wbGV0ZSBiZWZvcmUgbGV0dGluZyBoL3cKIAkJICoga25vdyB0aGVyZSBhcmUgbmV3IGRlc2NyaXB0b3JzIHRvIGZldGNoLiAgKE9ubHkKIAkJICogYXBwbGljYWJsZSBmb3Igd2Vhay1vcmRlcmVkIG1lbW9yeSBtb2RlbCBhcmNocywKQEAgLTI4NTIsNyArMjg3MCw2IEBACiAJCXdtYigpOwogCQl3cml0ZWwoaSwgdHhfcmluZy0+dGFpbCk7CiAJfQotCiAJcmV0dXJuOwogCiBkbWFfZXJyb3I6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdHhyeC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3R4cnguaAppbmRleCBiNzhjODEwLi41MDg4NDA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdHhyeC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV90eHJ4LmgKQEAgLTQ2Myw0ICs0NjMsMTMgQEAKIAlyZXR1cm4gKHB0eXBlID49IEk0MEVfUlhfUFRZUEVfTDJfRkNPRV9QQVkzKSAmJgogCSAgICAgICAocHR5cGUgPD0gSTQwRV9SWF9QVFlQRV9MMl9GQ09FX1ZGVF9GQ09USEVSKTsKIH0KKworLyoqCisgKiB0eHJpbmdfdHhxIC0gRmluZCB0aGUgbmV0ZGV2IFR4IHJpbmcgYmFzZWQgb24gdGhlIGk0MGUgVHggcmluZworICogQHJpbmc6IFR4IHJpbmcgdG8gZmluZCB0aGUgbmV0ZGV2IGVxdWl2YWxlbnQgb2YKKyAqKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldGRldl9xdWV1ZSAqdHhyaW5nX3R4cShjb25zdCBzdHJ1Y3QgaTQwZV9yaW5nICpyaW5nKQoreworCXJldHVybiBuZXRkZXZfZ2V0X3R4X3F1ZXVlKHJpbmctPm5ldGRldiwgcmluZy0+cXVldWVfaW5kZXgpOworfQogI2VuZGlmIC8qIF9JNDBFX1RYUlhfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3ZpcnRjaG5sLmgKaW5kZXggYzkyYTNiZC4uZjg2MWQzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3ZpcnRjaG5sLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3ZpcnRjaG5sLmgKQEAgLTE2Myw2ICsxNjMsNyBAQAogI2RlZmluZSBJNDBFX1ZJUlRDSE5MX1ZGX09GRkxPQURfUlhfUE9MTElORwkweDAwMDIwMDAwCiAjZGVmaW5lIEk0MEVfVklSVENITkxfVkZfT0ZGTE9BRF9SU1NfUENUWVBFX1YyCTB4MDAwNDAwMDAKICNkZWZpbmUgSTQwRV9WSVJUQ0hOTF9WRl9PRkZMT0FEX1JTU19QRgkJMFgwMDA4MDAwMAorI2RlZmluZSBJNDBFX1ZJUlRDSE5MX1ZGX09GRkxPQURfRU5DQVBfQ1NVTQkwWDAwMTAwMDAwCiAKIHN0cnVjdCBpNDBlX3ZpcnRjaG5sX3ZmX3Jlc291cmNlIHsKIAl1MTYgbnVtX3ZzaXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmxfcGYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubF9wZi5jCmluZGV4IDZmY2JmNzYuLjU0YjhlZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubF9wZi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubF9wZi5jCkBAIC01MDIsOCArNTAyLDE2IEBACiAJdTMyIHF0eF9jdGw7CiAJaW50IHJldCA9IDA7CiAKKwlpZiAoIWk0MGVfdmNfaXN2YWxpZF92c2lfaWQodmYsIGluZm8tPnZzaV9pZCkpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBlcnJvcl9jb250ZXh0OworCX0KIAlwZl9xdWV1ZV9pZCA9IGk0MGVfdmNfZ2V0X3BmX3F1ZXVlX2lkKHZmLCB2c2lfaWQsIHZzaV9xdWV1ZV9pZCk7CiAJdnNpID0gaTQwZV9maW5kX3ZzaV9mcm9tX2lkKHBmLCB2c2lfaWQpOworCWlmICghdnNpKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyb3JfY29udGV4dDsKKwl9CiAKIAkvKiBjbGVhciB0aGUgY29udGV4dCBzdHJ1Y3R1cmUgZmlyc3QgKi8KIAltZW1zZXQoJnR4X2N0eCwgMCwgc2l6ZW9mKHN0cnVjdCBpNDBlX2htY19vYmpfdHhxKSk7CkBAIC05OTEsNyArOTk5LDEwIEBACiAJCWk0MGVfZW5hYmxlX3ZmX21hcHBpbmdzKHZmKTsKIAkJc2V0X2JpdChJNDBFX1ZGX1NUQVRfQUNUSVZFLCAmdmYtPnZmX3N0YXRlcyk7CiAJCWNsZWFyX2JpdChJNDBFX1ZGX1NUQVRfRElTQUJMRUQsICZ2Zi0+dmZfc3RhdGVzKTsKLQkJaTQwZV9ub3RpZnlfY2xpZW50X29mX3ZmX3Jlc2V0KHBmLCBhYnNfdmZfaWQpOworCQkvKiBEbyBub3Qgbm90aWZ5IHRoZSBjbGllbnQgZHVyaW5nIFZGIGluaXQgKi8KKwkJaWYgKHZmLT5wZi0+bnVtX2FsbG9jX3ZmcykKKwkJCWk0MGVfbm90aWZ5X2NsaWVudF9vZl92Zl9yZXNldChwZiwgYWJzX3ZmX2lkKTsKKwkJdmYtPm51bV92bGFuID0gMDsKIAl9CiAJLyogdGVsbCB0aGUgVkYgdGhlIHJlc2V0IGlzIGRvbmUgKi8KIAl3cjMyKGh3LCBJNDBFX1ZGR0VOX1JTVEFUMSh2Zi0+dmZfaWQpLCBJNDBFX1ZGUl9WRkFDVElWRSk7CkBAIC0xMDg5LDcgKzExMDAsNiBAQAogCQkJZ290byBlcnJfaW92OwogCQl9CiAJfQotCWk0MGVfbm90aWZ5X2NsaWVudF9vZl92Zl9lbmFibGUocGYsIG51bV9hbGxvY192ZnMpOwogCS8qIGFsbG9jYXRlIG1lbW9yeSAqLwogCXZmcyA9IGtjYWxsb2MobnVtX2FsbG9jX3Zmcywgc2l6ZW9mKHN0cnVjdCBpNDBlX3ZmKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2ZnMpIHsKQEAgLTExMTMsNiArMTEyMyw4IEBACiAJfQogCXBmLT5udW1fYWxsb2NfdmZzID0gbnVtX2FsbG9jX3ZmczsKIAorCWk0MGVfbm90aWZ5X2NsaWVudF9vZl92Zl9lbmFibGUocGYsIG51bV9hbGxvY192ZnMpOworCiBlcnJfYWxsb2M6CiAJaWYgKHJldCkKIAkJaTQwZV9mcmVlX3ZmcyhwZik7CkBAIC0xNDcyLDcgKzE0ODQsOCBAQAogCiAJdnNpID0gaTQwZV9maW5kX3ZzaV9mcm9tX2lkKHBmLCBpbmZvLT52c2lfaWQpOwogCWlmICghdGVzdF9iaXQoSTQwRV9WRl9TVEFUX0FDVElWRSwgJnZmLT52Zl9zdGF0ZXMpIHx8Ci0JICAgICFpNDBlX3ZjX2lzdmFsaWRfdnNpX2lkKHZmLCBpbmZvLT52c2lfaWQpKSB7CisJICAgICFpNDBlX3ZjX2lzdmFsaWRfdnNpX2lkKHZmLCBpbmZvLT52c2lfaWQpIHx8CisJICAgICF2c2kpIHsKIAkJYXFfcmV0ID0gSTQwRV9FUlJfUEFSQU07CiAJCWdvdG8gZXJyb3JfcGFyYW07CiAJfQpAQCAtMjIxMyw4ICsyMjI2LDggQEAKIGVycm9yX3BhcmFtOgogCS8qIHNlbmQgdGhlIHJlc3BvbnNlIHRvIHRoZSBWRiAqLwogCXJldHVybiBpNDBlX3ZjX3NlbmRfcmVzcF90b192Zih2ZiwKLQkJCSAgICAgICBjb25maWcgPyBJNDBFX1ZJUlRDSE5MX09QX1JFTEVBU0VfSVdBUlBfSVJRX01BUCA6Ci0JCQkgICAgICAgSTQwRV9WSVJUQ0hOTF9PUF9DT05GSUdfSVdBUlBfSVJRX01BUCwKKwkJCSAgICAgICBjb25maWcgPyBJNDBFX1ZJUlRDSE5MX09QX0NPTkZJR19JV0FSUF9JUlFfTUFQIDoKKwkJCSAgICAgICBJNDBFX1ZJUlRDSE5MX09QX1JFTEVBU0VfSVdBUlBfSVJRX01BUCwKIAkJCSAgICAgICBhcV9yZXQpOwogfQogCkBAIC0yMzE0LDYgKzIzMjcsNyBAQAogCS8qIHNlbmQgdGhlIHJlc3BvbnNlIGJhY2sgdG8gdGhlIFZGICovCiAJYXFfcmV0ID0gaTQwZV92Y19zZW5kX21zZ190b192Zih2ZiwgSTQwRV9WSVJUQ0hOTF9PUF9HRVRfUlNTX0hFTkFfQ0FQUywKIAkJCQkJYXFfcmV0LCAodTggKil2cmgsIGxlbik7CisJa2ZyZWUodnJoKTsKIAlyZXR1cm4gYXFfcmV0OwogfQogCkBAIC0yNzQyLDExICsyNzU2LDEyIEBACiAgKiBAdmZfaWQ6IFZGIGlkZW50aWZpZXIKICAqIEB2bGFuX2lkOiBtYWMgYWRkcmVzcwogICogQHFvczogcHJpb3JpdHkgc2V0dGluZworICogQHZsYW5fcHJvdG86IHZsYW4gcHJvdG9jb2wKICAqCiAgKiBwcm9ncmFtIFZGIHZsYW4gaWQgYW5kL29yIHFvcwogICoqLwotaW50IGk0MGVfbmRvX3NldF92Zl9wb3J0X3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCSAgICAgIGludCB2Zl9pZCwgdTE2IHZsYW5faWQsIHU4IHFvcykKK2ludCBpNDBlX25kb19zZXRfdmZfcG9ydF92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2Zl9pZCwKKwkJCSAgICAgIHUxNiB2bGFuX2lkLCB1OCBxb3MsIF9fYmUxNiB2bGFuX3Byb3RvKQogewogCXUxNiB2bGFucHJpbyA9IHZsYW5faWQgfCAocW9zIDw8IEk0MEVfVkxBTl9QUklPUklUWV9TSElGVCk7CiAJc3RydWN0IGk0MGVfbmV0ZGV2X3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKQEAgLTI3NjksNiArMjc4NCwxMiBAQAogCQlnb3RvIGVycm9yX3B2aWQ7CiAJfQogCisJaWYgKHZsYW5fcHJvdG8gIT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CisJCWRldl9lcnIoJnBmLT5wZGV2LT5kZXYsICJWRiBWTEFOIHByb3RvY29sIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXQgPSAtRVBST1RPTk9TVVBQT1JUOworCQlnb3RvIGVycm9yX3B2aWQ7CisJfQorCiAJdmYgPSAmKHBmLT52Zlt2Zl9pZF0pOwogCXZzaSA9IHBmLT52c2lbdmYtPmxhbl92c2lfaWR4XTsKIAlpZiAoIXRlc3RfYml0KEk0MEVfVkZfU1RBVF9JTklULCAmdmYtPnZmX3N0YXRlcykpIHsKQEAgLTI5OTUsNiArMzAxNiw3IEBACiAJZWxzZQogCQlpdmktPmxpbmtzdGF0ZSA9IElGTEFfVkZfTElOS19TVEFURV9ESVNBQkxFOwogCWl2aS0+c3Bvb2ZjaGsgPSB2Zi0+c3Bvb2ZjaGs7CisJaXZpLT50cnVzdGVkID0gdmYtPnRydXN0ZWQ7CiAJcmV0ID0gMDsKIAogZXJyb3JfcGFyYW06CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmxfcGYuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubF9wZi5oCmluZGV4IDg3NTE3NDEuLjQwMTJkMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubF9wZi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubF9wZi5oCkBAIC0xMjksOCArMTI5LDggQEAKIAogLyogVkYgY29uZmlndXJhdGlvbiByZWxhdGVkIGlwbGluayBoYW5kbGVycyAqLwogaW50IGk0MGVfbmRvX3NldF92Zl9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmX2lkLCB1OCAqbWFjKTsKLWludCBpNDBlX25kb19zZXRfdmZfcG9ydF92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkgICAgICBpbnQgdmZfaWQsIHUxNiB2bGFuX2lkLCB1OCBxb3MpOworaW50IGk0MGVfbmRvX3NldF92Zl9wb3J0X3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmX2lkLAorCQkJICAgICAgdTE2IHZsYW5faWQsIHU4IHFvcywgX19iZTE2IHZsYW5fcHJvdG8pOwogaW50IGk0MGVfbmRvX3NldF92Zl9idyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmZfaWQsIGludCBtaW5fdHhfcmF0ZSwKIAkJICAgICAgIGludCBtYXhfdHhfcmF0ZSk7CiBpbnQgaTQwZV9uZG9fc2V0X3ZmX3RydXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2Zl9pZCwgYm9vbCBzZXR0aW5nKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX2FkbWlucV9jbWQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX2FkbWlucV9jbWQuaAppbmRleCAzMTE0ZGNmLi40MGIwZWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9hZG1pbnFfY21kLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfYWRtaW5xX2NtZC5oCkBAIC0yMDQsNiArMjA0LDkgQEAKIAlpNDBlX2FxY19vcGNfc3VzcGVuZF9wb3J0X3R4CQkJCT0gMHgwNDFCLAogCWk0MGVfYXFjX29wY19yZXN1bWVfcG9ydF90eAkJCQk9IDB4MDQxQywKIAlpNDBlX2FxY19vcGNfY29uZmlndXJlX3BhcnRpdGlvbl9idwkJCT0gMHgwNDFELAorCS8qIGhtYyAqLworCWk0MGVfYXFjX29wY19xdWVyeV9obWNfcmVzb3VyY2VfcHJvZmlsZQk9IDB4MDUwMCwKKwlpNDBlX2FxY19vcGNfc2V0X2htY19yZXNvdXJjZV9wcm9maWxlCT0gMHgwNTAxLAogCiAJLyogcGh5IGNvbW1hbmRzKi8KIAlpNDBlX2FxY19vcGNfZ2V0X3BoeV9hYmlsaXRpZXMJCT0gMHgwNjAwLApAQCAtNDQ3LDEzICs0NTAsMTUgQEAKIC8qIFNldCBBUlAgUHJveHkgY29tbWFuZCAvIHJlc3BvbnNlIChpbmRpcmVjdCAweDAxMDQpICovCiBzdHJ1Y3QgaTQwZV9hcWNfYXJwX3Byb3h5X2RhdGEgewogCV9fbGUxNgljb21tYW5kX2ZsYWdzOwotI2RlZmluZSBJNDBFX0FRX0FSUF9JTklUX0lQVjQJMHgwMDA4Ci0jZGVmaW5lIEk0MEVfQVFfQVJQX1VOU1VQX0NUTAkweDAwMTAKLSNkZWZpbmUgSTQwRV9BUV9BUlBfRU5BCQkweDAwMjAKLSNkZWZpbmUgSTQwRV9BUV9BUlBfQUREX0lQVjQJMHgwMDQwCi0jZGVmaW5lIEk0MEVfQVFfQVJQX0RFTF9JUFY0CTB4MDA4MAorI2RlZmluZSBJNDBFX0FRX0FSUF9JTklUX0lQVjQJMHgwODAwCisjZGVmaW5lIEk0MEVfQVFfQVJQX1VOU1VQX0NUTAkweDEwMDAKKyNkZWZpbmUgSTQwRV9BUV9BUlBfRU5BCQkweDIwMDAKKyNkZWZpbmUgSTQwRV9BUV9BUlBfQUREX0lQVjQJMHg0MDAwCisjZGVmaW5lIEk0MEVfQVFfQVJQX0RFTF9JUFY0CTB4ODAwMAogCV9fbGUxNgl0YWJsZV9pZDsKLQlfX2xlMzIJcGZwbV9wcm94eWZjOworCV9fbGUzMgllbmFibGVkX29mZmxvYWRzOworI2RlZmluZSBJNDBFX0FRX0FSUF9ESVJFQ1RFRF9PRkZMT0FEX0VOQUJMRQkweDAwMDAwMDIwCisjZGVmaW5lIEk0MEVfQVFfQVJQX09GRkxPQURfRU5BQkxFCQkweDAwMDAwODAwCiAJX19sZTMyCWlwX2FkZHI7CiAJdTgJbWFjX2FkZHJbNl07CiAJdTgJcmVzZXJ2ZWRbMl07CkBAIC00NjgsMTcgKzQ3MywxOSBAQAogCV9fbGUxNgl0YWJsZV9pZHhfaXB2Nl8wOwogCV9fbGUxNgl0YWJsZV9pZHhfaXB2Nl8xOwogCV9fbGUxNgljb250cm9sOwotI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0FERF8wCQkweDAxMDAKLSNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9ERUxfMAkJMHgwMjAwCi0jZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfQUREXzEJCTB4MDQwMAotI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0RFTF8xCQkweDA4MDAKLSNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9BRERfSVBWNl8wCTB4MTAwMAotI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0RFTF9JUFY2XzAJMHgyMDAwCi0jZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfQUREX0lQVjZfMQkweDQwMDAKLSNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9ERUxfSVBWNl8xCTB4ODAwMAotI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0NPTU1BTkRfU0VRCTB4MDAwMQotI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0lOSVRfSVBWNl9UQkwJMHgwMDAyCi0jZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfSU5JVF9NQUNfVEJMCTB4MDAwNAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0FERF8wCQkweDAwMDEKKyNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9ERUxfMAkJMHgwMDAyCisjZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfQUREXzEJCTB4MDAwNAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0RFTF8xCQkweDAwMDgKKyNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9BRERfSVBWNl8wCTB4MDAxMAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0RFTF9JUFY2XzAJMHgwMDIwCisjZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfQUREX0lQVjZfMQkweDAwNDAKKyNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9ERUxfSVBWNl8xCTB4MDA4MAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0NPTU1BTkRfU0VRCTB4MDEwMAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0lOSVRfSVBWNl9UQkwJMHgwMjAwCisjZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfSU5JVF9NQUNfVEJMCTB4MDQwMAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX09GRkxPQURfRU5BQkxFCTB4MDgwMAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0RJUkVDVEVEX09GRkxPQURfRU5BQkxFCTB4MTAwMAogCXU4CW1hY19hZGRyXzBbNl07CiAJdTgJbWFjX2FkZHJfMVs2XTsKIAl1OAlsb2NhbF9tYWNfYWRkcls2XTsKQEAgLTE1NzksNiArMTU4NiwyNCBAQAogCiBJNDBFX0NIRUNLX1NUUlVDVF9MRU4oMHgyMiwgaTQwZV9hcWNfY29uZmlndXJlX3BhcnRpdGlvbl9id19kYXRhKTsKIAorLyogR2V0IGFuZCBzZXQgdGhlIGFjdGl2ZSBITUMgcmVzb3VyY2UgcHJvZmlsZSBhbmQgc3RhdHVzLgorICogKGRpcmVjdCAweDA1MDApIGFuZCAoZGlyZWN0IDB4MDUwMSkKKyAqLworc3RydWN0IGk0MGVfYXFfZ2V0X3NldF9obWNfcmVzb3VyY2VfcHJvZmlsZSB7CisJdTgJcG1fcHJvZmlsZTsKKwl1OAlwZV92Zl9lbmFibGVkOworCXU4CXJlc2VydmVkWzE0XTsKK307CisKK0k0MEVfQ0hFQ0tfQ01EX0xFTkdUSChpNDBlX2FxX2dldF9zZXRfaG1jX3Jlc291cmNlX3Byb2ZpbGUpOworCitlbnVtIGk0MGVfYXFfaG1jX3Byb2ZpbGUgeworCS8qIEk0MEVfSE1DX1BST0ZJTEVfTk9fQ0hBTkdFCT0gMCwgcmVzZXJ2ZWQgKi8KKwlJNDBFX0hNQ19QUk9GSUxFX0RFRkFVTFQJPSAxLAorCUk0MEVfSE1DX1BST0ZJTEVfRkFWT1JfVkYJPSAyLAorCUk0MEVfSE1DX1BST0ZJTEVfRVFVQUwJCT0gMywKK307CisKIC8qIEdldCBQSFkgQWJpbGl0aWVzIChpbmRpcmVjdCAweDA2MDApIHVzZXMgdGhlIGdlbmVyaWMgaW5kaXJlY3Qgc3RydWN0ICovCiAKIC8qIHNldCBpbiBwYXJhbTAgZm9yIGdldCBwaHkgYWJpbGl0aWVzIHRvIHJlcG9ydCBxdWFsaWZpZWQgbW9kdWxlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfY29tbW9uLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9jb21tb24uYwppbmRleCA0ZGIwYzAzLi43OTUzYzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9jb21tb24uYwpAQCAtMzAyLDcgKzMwMiw2IEBACiAJCSAgIHZvaWQgKmJ1ZmZlciwgdTE2IGJ1Zl9sZW4pCiB7CiAJc3RydWN0IGk0MGVfYXFfZGVzYyAqYXFfZGVzYyA9IChzdHJ1Y3QgaTQwZV9hcV9kZXNjICopZGVzYzsKLQl1MTYgbGVuID0gbGUxNl90b19jcHUoYXFfZGVzYy0+ZGF0YWxlbik7CiAJdTggKmJ1ZiA9ICh1OCAqKWJ1ZmZlcjsKIAl1MTYgaSA9IDA7CiAKQEAgLTMyNiw2ICszMjUsOCBAQAogCQkgICBsZTMyX3RvX2NwdShhcV9kZXNjLT5wYXJhbXMuZXh0ZXJuYWwuYWRkcl9sb3cpKTsKIAogCWlmICgoYnVmZmVyICE9IE5VTEwpICYmIChhcV9kZXNjLT5kYXRhbGVuICE9IDApKSB7CisJCXUxNiBsZW4gPSBsZTE2X3RvX2NwdShhcV9kZXNjLT5kYXRhbGVuKTsKKwogCQlpNDBlX2RlYnVnKGh3LCBtYXNrLCAiQVEgQ01EIEJ1ZmZlcjpcbiIpOwogCQlpZiAoYnVmX2xlbiA8IGxlbikKIAkJCWxlbiA9IGJ1Zl9sZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV90eHJ4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV90eHJ4LmMKaW5kZXggYTU3OTE5My4uNzVmMmEyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdHhyeC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3R4cnguYwpAQCAtNTEsNyArNTEsMTAgQEAKIAkJCQkJICAgIHN0cnVjdCBpNDBlX3R4X2J1ZmZlciAqdHhfYnVmZmVyKQogewogCWlmICh0eF9idWZmZXItPnNrYikgewotCQlkZXZfa2ZyZWVfc2tiX2FueSh0eF9idWZmZXItPnNrYik7CisJCWlmICh0eF9idWZmZXItPnR4X2ZsYWdzICYgSTQwRV9UWF9GTEFHU19GRF9TQikKKwkJCWtmcmVlKHR4X2J1ZmZlci0+cmF3X2J1Zik7CisJCWVsc2UKKwkJCWRldl9rZnJlZV9za2JfYW55KHR4X2J1ZmZlci0+c2tiKTsKIAkJaWYgKGRtYV91bm1hcF9sZW4odHhfYnVmZmVyLCBsZW4pKQogCQkJZG1hX3VubWFwX3NpbmdsZShyaW5nLT5kZXYsCiAJCQkJCSBkbWFfdW5tYXBfYWRkcih0eF9idWZmZXIsIGRtYSksCkBAIC02NCw5ICs2Nyw2IEBACiAJCQkgICAgICAgRE1BX1RPX0RFVklDRSk7CiAJfQogCi0JaWYgKHR4X2J1ZmZlci0+dHhfZmxhZ3MgJiBJNDBFX1RYX0ZMQUdTX0ZEX1NCKQotCQlrZnJlZSh0eF9idWZmZXItPnJhd19idWYpOwotCiAJdHhfYnVmZmVyLT5uZXh0X3RvX3dhdGNoID0gTlVMTDsKIAl0eF9idWZmZXItPnNrYiA9IE5VTEw7CiAJZG1hX3VubWFwX2xlbl9zZXQodHhfYnVmZmVyLCBsZW4sIDApOwpAQCAtMTAzLDggKzEwMyw3IEBACiAJCXJldHVybjsKIAogCS8qIGNsZWFudXAgVHggcXVldWUgc3RhdGlzdGljcyAqLwotCW5ldGRldl90eF9yZXNldF9xdWV1ZShuZXRkZXZfZ2V0X3R4X3F1ZXVlKHR4X3JpbmctPm5ldGRldiwKLQkJCQkJCSAgdHhfcmluZy0+cXVldWVfaW5kZXgpKTsKKwluZXRkZXZfdHhfcmVzZXRfcXVldWUodHhyaW5nX3R4cSh0eF9yaW5nKSk7CiB9CiAKIC8qKgpAQCAtMjczLDggKzI3Miw4IEBACiAJCQl0eF9yaW5nLT5hcm1fd2IgPSB0cnVlOwogCX0KIAotCW5ldGRldl90eF9jb21wbGV0ZWRfcXVldWUobmV0ZGV2X2dldF90eF9xdWV1ZSh0eF9yaW5nLT5uZXRkZXYsCi0JCQkJCQkgICAgICB0eF9yaW5nLT5xdWV1ZV9pbmRleCksCisJLyogbm90aWZ5IG5ldGRldiBvZiBjb21wbGV0ZWQgYnVmZmVycyAqLworCW5ldGRldl90eF9jb21wbGV0ZWRfcXVldWUodHhyaW5nX3R4cSh0eF9yaW5nKSwKIAkJCQkgIHRvdGFsX3BhY2tldHMsIHRvdGFsX2J5dGVzKTsKIAogI2RlZmluZSBUWF9XQUtFX1RIUkVTSE9MRCAoREVTQ19ORUVERUQgKiAyKQpAQCAtMTMxMiw2ICsxMzExLDE5IEBACiAKIC8qIGEgc21hbGwgbWFjcm8gdG8gc2hvcnRlbiB1cCBzb21lIGxvbmcgbGluZXMgKi8KICNkZWZpbmUgSU5UUkVHIEk0MEVfVkZJTlRfRFlOX0NUTE4xCitzdGF0aWMgaW5saW5lIGludCBnZXRfcnhfaXRyX2VuYWJsZWQoc3RydWN0IGk0MGVfdnNpICp2c2ksIGludCBpZHgpCit7CisJc3RydWN0IGk0MGV2Zl9hZGFwdGVyICphZGFwdGVyID0gdnNpLT5iYWNrOworCisJcmV0dXJuICEhKGFkYXB0ZXItPnJ4X3JpbmdzW2lkeF0ucnhfaXRyX3NldHRpbmcpOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfdHhfaXRyX2VuYWJsZWQoc3RydWN0IGk0MGVfdnNpICp2c2ksIGludCBpZHgpCit7CisJc3RydWN0IGk0MGV2Zl9hZGFwdGVyICphZGFwdGVyID0gdnNpLT5iYWNrOworCisJcmV0dXJuICEhKGFkYXB0ZXItPnR4X3JpbmdzW2lkeF0udHhfaXRyX3NldHRpbmcpOworfQogCiAvKioKICAqIGk0MGVfdXBkYXRlX2VuYWJsZV9pdHIgLSBVcGRhdGUgaXRyIGFuZCByZS1lbmFibGUgTVNJWCBpbnRlcnJ1cHQKQEAgLTEzMjYsNiArMTMzOCw4IEBACiAJYm9vbCByeCA9IGZhbHNlLCB0eCA9IGZhbHNlOwogCXUzMiByeHZhbCwgdHh2YWw7CiAJaW50IHZlY3RvcjsKKwlpbnQgaWR4ID0gcV92ZWN0b3ItPnZfaWR4OworCWludCByeF9pdHJfc2V0dGluZywgdHhfaXRyX3NldHRpbmc7CiAKIAl2ZWN0b3IgPSAocV92ZWN0b3ItPnZfaWR4ICsgdnNpLT5iYXNlX3ZlY3Rvcik7CiAKQEAgLTEzMzQsMTggKzEzNDgsMjEgQEAKIAkgKi8KIAlyeHZhbCA9IHR4dmFsID0gaTQwZV9idWlsZHJlZ19pdHIoSTQwRV9JVFJfTk9ORSwgMCk7CiAKKwlyeF9pdHJfc2V0dGluZyA9IGdldF9yeF9pdHJfZW5hYmxlZCh2c2ksIGlkeCk7CisJdHhfaXRyX3NldHRpbmcgPSBnZXRfdHhfaXRyX2VuYWJsZWQodnNpLCBpZHgpOworCiAJaWYgKHFfdmVjdG9yLT5pdHJfY291bnRkb3duID4gMCB8fAotCSAgICAoIUlUUl9JU19EWU5BTUlDKHZzaS0+cnhfaXRyX3NldHRpbmcpICYmCi0JICAgICAhSVRSX0lTX0RZTkFNSUModnNpLT50eF9pdHJfc2V0dGluZykpKSB7CisJICAgICghSVRSX0lTX0RZTkFNSUMocnhfaXRyX3NldHRpbmcpICYmCisJICAgICAhSVRSX0lTX0RZTkFNSUModHhfaXRyX3NldHRpbmcpKSkgewogCQlnb3RvIGVuYWJsZV9pbnQ7CiAJfQogCi0JaWYgKElUUl9JU19EWU5BTUlDKHZzaS0+cnhfaXRyX3NldHRpbmcpKSB7CisJaWYgKElUUl9JU19EWU5BTUlDKHJ4X2l0cl9zZXR0aW5nKSkgewogCQlyeCA9IGk0MGVfc2V0X25ld19keW5hbWljX2l0cigmcV92ZWN0b3ItPnJ4KTsKIAkJcnh2YWwgPSBpNDBlX2J1aWxkcmVnX2l0cihJNDBFX1JYX0lUUiwgcV92ZWN0b3ItPnJ4Lml0cik7CiAJfQogCi0JaWYgKElUUl9JU19EWU5BTUlDKHZzaS0+dHhfaXRyX3NldHRpbmcpKSB7CisJaWYgKElUUl9JU19EWU5BTUlDKHR4X2l0cl9zZXR0aW5nKSkgewogCQl0eCA9IGk0MGVfc2V0X25ld19keW5hbWljX2l0cigmcV92ZWN0b3ItPnR4KTsKIAkJdHh2YWwgPSBpNDBlX2J1aWxkcmVnX2l0cihJNDBFX1RYX0lUUiwgcV92ZWN0b3ItPnR4Lml0cik7CiAJfQpAQCAtMTgzMiw5ICsxODQ5LDcgQEAKIAkJcmV0dXJuIGZhbHNlOwogCiAJLyogV2UgbmVlZCB0byB3YWxrIHRocm91Z2ggdGhlIGxpc3QgYW5kIHZhbGlkYXRlIHRoYXQgZWFjaCBncm91cAotCSAqIG9mIDYgZnJhZ21lbnRzIHRvdGFscyBhdCBsZWFzdCBnc29fc2l6ZS4gIEhvd2V2ZXIgd2UgZG9uJ3QgbmVlZAotCSAqIHRvIHBlcmZvcm0gc3VjaCB2YWxpZGF0aW9uIG9uIHRoZSBsYXN0IDYgc2luY2UgdGhlIGxhc3QgNiBjYW5ub3QKLQkgKiBpbmhlcml0IGFueSBkYXRhIGZyb20gYSBkZXNjcmlwdG9yIGFmdGVyIHRoZW0uCisJICogb2YgNiBmcmFnbWVudHMgdG90YWxzIGF0IGxlYXN0IGdzb19zaXplLgogCSAqLwogCW5yX2ZyYWdzIC09IEk0MEVfTUFYX0JVRkZFUl9UWEQgLSAyOwogCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXTsKQEAgLTE4NjUsOCArMTg4MCw3IEBACiAJCWlmIChzdW0gPCAwKQogCQkJcmV0dXJuIHRydWU7CiAKLQkJLyogdXNlIHByZS1kZWNyZW1lbnQgdG8gYXZvaWQgcHJvY2Vzc2luZyBsYXN0IGZyYWdtZW50ICovCi0JCWlmICghLS1ucl9mcmFncykKKwkJaWYgKCFucl9mcmFncy0tKQogCQkJYnJlYWs7CiAKIAkJc3VtIC09IHNrYl9mcmFnX3NpemUoc3RhbGUrKyk7CkBAIC0yMDE1LDkgKzIwMjksNyBAQAogCiAJdHhfcmluZy0+bmV4dF90b191c2UgPSBpOwogCi0JbmV0ZGV2X3R4X3NlbnRfcXVldWUobmV0ZGV2X2dldF90eF9xdWV1ZSh0eF9yaW5nLT5uZXRkZXYsCi0JCQkJCQkgdHhfcmluZy0+cXVldWVfaW5kZXgpLAotCQkJCQkJIGZpcnN0LT5ieXRlY291bnQpOworCW5ldGRldl90eF9zZW50X3F1ZXVlKHR4cmluZ190eHEodHhfcmluZyksIGZpcnN0LT5ieXRlY291bnQpOwogCWk0MGVfbWF5YmVfc3RvcF90eCh0eF9yaW5nLCBERVNDX05FRURFRCk7CiAKIAkvKiBBbGdvcml0aG0gdG8gb3B0aW1pemUgdGFpbCBhbmQgUlMgYml0IHNldHRpbmc6CkBAIC0yMDQyLDEzICsyMDU0LDExIEBACiAJICogdHJpZ2dlciBhIGZvcmNlIFdCLgogCSAqLwogCWlmIChza2ItPnhtaXRfbW9yZSAgJiYKLQkgICAgIW5ldGlmX3htaXRfc3RvcHBlZChuZXRkZXZfZ2V0X3R4X3F1ZXVlKHR4X3JpbmctPm5ldGRldiwKLQkJCQkJCSAgICB0eF9yaW5nLT5xdWV1ZV9pbmRleCkpKSB7CisJICAgICFuZXRpZl94bWl0X3N0b3BwZWQodHhyaW5nX3R4cSh0eF9yaW5nKSkpIHsKIAkJdHhfcmluZy0+ZmxhZ3MgfD0gSTQwRV9UWFJfRkxBR1NfTEFTVF9YTUlUX01PUkVfU0VUOwogCQl0YWlsX2J1bXAgPSBmYWxzZTsKIAl9IGVsc2UgaWYgKCFza2ItPnhtaXRfbW9yZSAmJgotCQkgICAhbmV0aWZfeG1pdF9zdG9wcGVkKG5ldGRldl9nZXRfdHhfcXVldWUodHhfcmluZy0+bmV0ZGV2LAotCQkJCQkJICAgICAgIHR4X3JpbmctPnF1ZXVlX2luZGV4KSkgJiYKKwkJICAgIW5ldGlmX3htaXRfc3RvcHBlZCh0eHJpbmdfdHhxKHR4X3JpbmcpKSAmJgogCQkgICAoISh0eF9yaW5nLT5mbGFncyAmIEk0MEVfVFhSX0ZMQUdTX0xBU1RfWE1JVF9NT1JFX1NFVCkpICYmCiAJCSAgICh0eF9yaW5nLT5wYWNrZXRfc3RyaWRlIDwgV0JfU1RSSURFKSAmJgogCQkgICAoZGVzY19jb3VudCA8IFdCX1NUUklERSkpIHsKQEAgLTIwNjgsMTAgKzIwNzgsOSBAQAogCQkJCQkJICBJNDBFX1RYRF9RVzFfQ01EX1NISUZUKTsKIAogCS8qIG5vdGlmeSBIVyBvZiBwYWNrZXQgKi8KLQlpZiAoIXRhaWxfYnVtcCkKKwlpZiAoIXRhaWxfYnVtcCkgewogCQlwcmVmZXRjaHcodHhfZGVzYyArIDEpOwotCi0JaWYgKHRhaWxfYnVtcCkgeworCX0gZWxzZSB7CiAJCS8qIEZvcmNlIG1lbW9yeSB3cml0ZXMgdG8gY29tcGxldGUgYmVmb3JlIGxldHRpbmcgaC93CiAJCSAqIGtub3cgdGhlcmUgYXJlIG5ldyBkZXNjcmlwdG9ycyB0byBmZXRjaC4gIChPbmx5CiAJCSAqIGFwcGxpY2FibGUgZm9yIHdlYWstb3JkZXJlZCBtZW1vcnkgbW9kZWwgYXJjaHMsCkBAIC0yMDgwLDcgKzIwODksNiBAQAogCQl3bWIoKTsKIAkJd3JpdGVsKGksIHR4X3JpbmctPnRhaWwpOwogCX0KLQogCXJldHVybjsKIAogZG1hX2Vycm9yOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdHhyeC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdHhyeC5oCmluZGV4IDAxMTIyNzcuLmFiY2RlY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3R4cnguaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV90eHJ4LmgKQEAgLTI4Nyw2ICsyODcsMTQgQEAKIAl1OCBkY2JfdGM7CQkJLyogVHJhZmZpYyBjbGFzcyBvZiByaW5nICovCiAJdTggX19pb21lbSAqdGFpbDsKIAorCS8qIGhpZ2ggYml0IHNldCBtZWFucyBkeW5hbWljLCB1c2UgYWNjZXNzb3JzIHJvdXRpbmVzIHRvIHJlYWQvd3JpdGUuCisJICogaGFyZHdhcmUgb25seSBzdXBwb3J0cyAydXMgcmVzb2x1dGlvbiBmb3IgdGhlIElUUiByZWdpc3RlcnMuCisJICogdGhlc2UgdmFsdWVzIGFsd2F5cyBzdG9yZSB0aGUgVVNFUiBzZXR0aW5nLCBhbmQgbXVzdCBiZSBjb252ZXJ0ZWQKKwkgKiBiZWZvcmUgcHJvZ3JhbW1pbmcgdG8gYSByZWdpc3Rlci4KKwkgKi8KKwl1MTYgcnhfaXRyX3NldHRpbmc7CisJdTE2IHR4X2l0cl9zZXR0aW5nOworCiAJdTE2IGNvdW50OwkJCS8qIE51bWJlciBvZiBkZXNjcmlwdG9ycyAqLwogCXUxNiByZWdfaWR4OwkJCS8qIEhXIHJlZ2lzdGVyIGluZGV4IG9mIHRoZSByaW5nICovCiAJdTE2IHJ4X2J1Zl9sZW47CkBAIC00NDUsNCArNDUzLDEzIEBACiAJcmV0dXJuIChwdHlwZSA+PSBJNDBFX1JYX1BUWVBFX0wyX0ZDT0VfUEFZMykgJiYKIAkgICAgICAgKHB0eXBlIDw9IEk0MEVfUlhfUFRZUEVfTDJfRkNPRV9WRlRfRkNPVEhFUik7CiB9CisKKy8qKgorICogdHhyaW5nX3R4cSAtIEZpbmQgdGhlIG5ldGRldiBUeCByaW5nIGJhc2VkIG9uIHRoZSBpNDBlIFR4IHJpbmcKKyAqIEByaW5nOiBUeCByaW5nIHRvIGZpbmQgdGhlIG5ldGRldiBlcXVpdmFsZW50IG9mCisgKiovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cmluZ190eHEoY29uc3Qgc3RydWN0IGk0MGVfcmluZyAqcmluZykKK3sKKwlyZXR1cm4gbmV0ZGV2X2dldF90eF9xdWV1ZShyaW5nLT5uZXRkZXYsIHJpbmctPnF1ZXVlX2luZGV4KTsKK30KICNlbmRpZiAvKiBfSTQwRV9UWFJYX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV92aXJ0Y2hubC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdmlydGNobmwuaAppbmRleCBmMDRjZTZjLi5iZDY5MWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV92aXJ0Y2hubC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3ZpcnRjaG5sLmgKQEAgLTE2MCw2ICsxNjAsNyBAQAogI2RlZmluZSBJNDBFX1ZJUlRDSE5MX1ZGX09GRkxPQURfUlhfUE9MTElORwkweDAwMDIwMDAwCiAjZGVmaW5lIEk0MEVfVklSVENITkxfVkZfT0ZGTE9BRF9SU1NfUENUWVBFX1YyCTB4MDAwNDAwMDAKICNkZWZpbmUgSTQwRV9WSVJUQ0hOTF9WRl9PRkZMT0FEX1JTU19QRgkJMFgwMDA4MDAwMAorI2RlZmluZSBJNDBFX1ZJUlRDSE5MX1ZGX09GRkxPQURfRU5DQVBfQ1NVTQkwWDAwMTAwMDAwCiAKIHN0cnVjdCBpNDBlX3ZpcnRjaG5sX3ZmX3Jlc291cmNlIHsKIAl1MTYgbnVtX3ZzaXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmLmgKaW5kZXggNzZlZDk3ZC4uYzVmZDcyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmYuaApAQCAtNTksMzIgKzU5LDI1IEBACiAJdW5zaWduZWQgbG9uZyBzdGF0ZTsKIAlpbnQgYmFzZV92ZWN0b3I7CiAJdTE2IHdvcmtfbGltaXQ7Ci0JLyogaGlnaCBiaXQgc2V0IG1lYW5zIGR5bmFtaWMsIHVzZSBhY2Nlc3NvciByb3V0aW5lcyB0byByZWFkL3dyaXRlLgotCSAqIGhhcmR3YXJlIG9ubHkgc3VwcG9ydHMgMnVzIHJlc29sdXRpb24gZm9yIHRoZSBJVFIgcmVnaXN0ZXJzLgotCSAqIHRoZXNlIHZhbHVlcyBhbHdheXMgc3RvcmUgdGhlIFVTRVIgc2V0dGluZywgYW5kIG11c3QgYmUgY29udmVydGVkCi0JICogYmVmb3JlIHByb2dyYW1taW5nIHRvIGEgcmVnaXN0ZXIuCi0JICovCi0JdTE2IHJ4X2l0cl9zZXR0aW5nOwotCXUxNiB0eF9pdHJfc2V0dGluZzsKIAl1MTYgcXNfaGFuZGxlOwogfTsKIAogLyogSG93IG1hbnkgUnggQnVmZmVycyBkbyB3ZSBidW5kbGUgaW50byBvbmUgd3JpdGUgdG8gdGhlIGhhcmR3YXJlID8gKi8KICNkZWZpbmUgSTQwRVZGX1JYX0JVRkZFUl9XUklURQkxNgkvKiBNdXN0IGJlIHBvd2VyIG9mIDIgKi8KLSNkZWZpbmUgSTQwRVZGX0RFRkFVTFRfVFhEICAgNTEyCi0jZGVmaW5lIEk0MEVWRl9ERUZBVUxUX1JYRCAgIDUxMgotI2RlZmluZSBJNDBFVkZfTUFYX1RYRCAgICAgICA0MDk2Ci0jZGVmaW5lIEk0MEVWRl9NSU5fVFhEICAgICAgIDY0Ci0jZGVmaW5lIEk0MEVWRl9NQVhfUlhEICAgICAgIDQwOTYKLSNkZWZpbmUgSTQwRVZGX01JTl9SWEQgICAgICAgNjQKLSNkZWZpbmUgSTQwRVZGX1JFUV9ERVNDUklQVE9SX01VTFRJUExFICAzMgorI2RlZmluZSBJNDBFVkZfREVGQVVMVF9UWEQJNTEyCisjZGVmaW5lIEk0MEVWRl9ERUZBVUxUX1JYRAk1MTIKKyNkZWZpbmUgSTQwRVZGX01BWF9UWEQJCTQwOTYKKyNkZWZpbmUgSTQwRVZGX01JTl9UWEQJCTY0CisjZGVmaW5lIEk0MEVWRl9NQVhfUlhECQk0MDk2CisjZGVmaW5lIEk0MEVWRl9NSU5fUlhECQk2NAorI2RlZmluZSBJNDBFVkZfUkVRX0RFU0NSSVBUT1JfTVVMVElQTEUJMzIKIAogLyogU3VwcG9ydGVkIFJ4IEJ1ZmZlciBTaXplcyAqLwotI2RlZmluZSBJNDBFVkZfUlhCVUZGRVJfMjA0OCAgMjA0OAotI2RlZmluZSBJNDBFVkZfTUFYX1JYQlVGRkVSICAgMTYzODQgIC8qIGxhcmdlc3Qgc2l6ZSBmb3Igc2luZ2xlIGRlc2NyaXB0b3IgKi8KLSNkZWZpbmUgSTQwRVZGX01BWF9BUV9CVUZfU0laRSAgICA0MDk2Ci0jZGVmaW5lIEk0MEVWRl9BUV9MRU4gICAgICAgICAgICAgMzIKLSNkZWZpbmUgSTQwRVZGX0FRX01BWF9FUlIgICAgICAgICAyMCAvKiB0aW1lcyB0byB0cnkgYmVmb3JlIHJlc2V0dGluZyBBUSAqLworI2RlZmluZSBJNDBFVkZfUlhCVUZGRVJfMjA0OAkyMDQ4CisjZGVmaW5lIEk0MEVWRl9NQVhfUlhCVUZGRVIJMTYzODQgIC8qIGxhcmdlc3Qgc2l6ZSBmb3Igc2luZ2xlIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgSTQwRVZGX01BWF9BUV9CVUZfU0laRQk0MDk2CisjZGVmaW5lIEk0MEVWRl9BUV9MRU4JCTMyCisjZGVmaW5lIEk0MEVWRl9BUV9NQVhfRVJSCTIwIC8qIHRpbWVzIHRvIHRyeSBiZWZvcmUgcmVzZXR0aW5nIEFRICovCiAKICNkZWZpbmUgTUFYSU1VTV9FVEhFUk5FVF9WTEFOX1NJWkUgKFZMQU5fRVRIX0ZSQU1FX0xFTiArIEVUSF9GQ1NfTEVOKQogCkBAIC0xMTEsNyArMTA0LDcgQEAKIAl1OCBudW1fcmluZ3BhaXJzOwkvKiB0b3RhbCBudW1iZXIgb2YgcmluZyBwYWlycyBpbiB2ZWN0b3IgKi8KICNkZWZpbmUgSVRSX0NPVU5URE9XTl9TVEFSVCAxMDAKIAl1OCBpdHJfY291bnRkb3duOwkvKiB3aGVuIDAgb3IgMSB1cGRhdGUgSVRSICovCi0JaW50IHZfaWR4OwkgIC8qIHZlY3RvciBpbmRleCBpbiBsaXN0ICovCisJaW50IHZfaWR4OwkvKiB2ZWN0b3IgaW5kZXggaW4gbGlzdCAqLwogCWNoYXIgbmFtZVtJRk5BTVNJWiArIDldOwogCWJvb2wgYXJtX3diX3N0YXRlOwogCWNwdW1hc2tfdmFyX3QgYWZmaW5pdHlfbWFzazsKQEAgLTEyOSwxMSArMTIyLDExIEBACiAJKCgoKFIpLT5uZXh0X3RvX2NsZWFuID4gKFIpLT5uZXh0X3RvX3VzZSkgPyAwIDogKFIpLT5jb3VudCkgKyBcCiAJKFIpLT5uZXh0X3RvX2NsZWFuIC0gKFIpLT5uZXh0X3RvX3VzZSAtIDEpCiAKLSNkZWZpbmUgSTQwRVZGX1JYX0RFU0NfQURWKFIsIGkpCSAgICBcCisjZGVmaW5lIEk0MEVWRl9SWF9ERVNDX0FEVihSLCBpKQlcCiAJKCYoKCh1bmlvbiBpNDBlX2Fkdl9yeF9kZXNjICopKChSKS5kZXNjKSlbaV0pKQotI2RlZmluZSBJNDBFVkZfVFhfREVTQ19BRFYoUiwgaSkJICAgIFwKKyNkZWZpbmUgSTQwRVZGX1RYX0RFU0NfQURWKFIsIGkpCVwKIAkoJigoKHVuaW9uIGk0MGVfYWR2X3R4X2Rlc2MgKikoKFIpLmRlc2MpKVtpXSkpCi0jZGVmaW5lIEk0MEVWRl9UWF9DVFhUREVTQ19BRFYoUiwgaSkJICAgIFwKKyNkZWZpbmUgSTQwRVZGX1RYX0NUWFRERVNDX0FEVihSLCBpKQlcCiAJKCYoKChzdHJ1Y3QgaTQwZV9hZHZfdHhfY29udGV4dF9kZXNjICopKChSKS5kZXNjKSlbaV0pKQogCiAjZGVmaW5lIE9USEVSX1ZFQ1RPUiAxCkBAIC0yMDQsMjIgKzE5NywyNSBAQAogCXN0cnVjdCBtc2l4X2VudHJ5ICptc2l4X2VudHJpZXM7CiAKIAl1MzIgZmxhZ3M7Ci0jZGVmaW5lIEk0MEVWRl9GTEFHX1JYX0NTVU1fRU5BQkxFRCAgICAgICAgICAgICAgQklUKDApCi0jZGVmaW5lIEk0MEVWRl9GTEFHX0lNSVJfRU5BQkxFRCAgICAgICAgICAgICAgICAgQklUKDUpCi0jZGVmaW5lIEk0MEVWRl9GTEFHX01RX0NBUEFCTEUgICAgICAgICAgICAgICAgICAgQklUKDYpCi0jZGVmaW5lIEk0MEVWRl9GTEFHX05FRURfTElOS19VUERBVEUgICAgICAgICAgICAgQklUKDcpCi0jZGVmaW5lIEk0MEVWRl9GTEFHX1BGX0NPTU1TX0ZBSUxFRCAgICAgICAgICAgICAgQklUKDgpCi0jZGVmaW5lIEk0MEVWRl9GTEFHX1JFU0VUX1BFTkRJTkcgICAgICAgICAgICAgICAgQklUKDkpCi0jZGVmaW5lIEk0MEVWRl9GTEFHX1JFU0VUX05FRURFRCAgICAgICAgICAgICAgICAgQklUKDEwKQorI2RlZmluZSBJNDBFVkZfRkxBR19SWF9DU1VNX0VOQUJMRUQJCUJJVCgwKQorI2RlZmluZSBJNDBFVkZfRkxBR19JTl9ORVRQT0xMCQkJQklUKDQpCisjZGVmaW5lIEk0MEVWRl9GTEFHX0lNSVJfRU5BQkxFRAkJQklUKDUpCisjZGVmaW5lIEk0MEVWRl9GTEFHX01RX0NBUEFCTEUJCQlCSVQoNikKKyNkZWZpbmUgSTQwRVZGX0ZMQUdfTkVFRF9MSU5LX1VQREFURQkJQklUKDcpCisjZGVmaW5lIEk0MEVWRl9GTEFHX1BGX0NPTU1TX0ZBSUxFRAkJQklUKDgpCisjZGVmaW5lIEk0MEVWRl9GTEFHX1JFU0VUX1BFTkRJTkcJCUJJVCg5KQorI2RlZmluZSBJNDBFVkZfRkxBR19SRVNFVF9ORUVERUQJCUJJVCgxMCkKICNkZWZpbmUgSTQwRVZGX0ZMQUdfV0JfT05fSVRSX0NBUEFCTEUJCUJJVCgxMSkKICNkZWZpbmUgSTQwRVZGX0ZMQUdfT1VURVJfVURQX0NTVU1fQ0FQQUJMRQlCSVQoMTIpCiAjZGVmaW5lIEk0MEVWRl9GTEFHX0FERFJfU0VUX0JZX1BGCQlCSVQoMTMpCisjZGVmaW5lIEk0MEVWRl9GTEFHX1NFUlZJQ0VfQ0xJRU5UX1JFUVVFU1RFRAlCSVQoMTQpCiAjZGVmaW5lIEk0MEVWRl9GTEFHX1BST01JU0NfT04JCQlCSVQoMTUpCiAjZGVmaW5lIEk0MEVWRl9GTEFHX0FMTE1VTFRJX09OCQkJQklUKDE2KQogLyogZHVwbGljYXRlcyBmb3IgY29tbW9uIGNvZGUgKi8KLSNkZWZpbmUgSTQwRV9GTEFHX0ZESVJfQVRSX0VOQUJMRUQJCSAwCi0jZGVmaW5lIEk0MEVfRkxBR19EQ0JfRU5BQkxFRAkJCSAwCi0jZGVmaW5lIEk0MEVfRkxBR19SWF9DU1VNX0VOQUJMRUQgICAgICAgICAgICAgICAgSTQwRVZGX0ZMQUdfUlhfQ1NVTV9FTkFCTEVECisjZGVmaW5lIEk0MEVfRkxBR19GRElSX0FUUl9FTkFCTEVECQkwCisjZGVmaW5lIEk0MEVfRkxBR19EQ0JfRU5BQkxFRAkJCTAKKyNkZWZpbmUgSTQwRV9GTEFHX0lOX05FVFBPTEwJCQlJNDBFVkZfRkxBR19JTl9ORVRQT0xMCisjZGVmaW5lIEk0MEVfRkxBR19SWF9DU1VNX0VOQUJMRUQJCUk0MEVWRl9GTEFHX1JYX0NTVU1fRU5BQkxFRAogI2RlZmluZSBJNDBFX0ZMQUdfV0JfT05fSVRSX0NBUEFCTEUJCUk0MEVWRl9GTEFHX1dCX09OX0lUUl9DQVBBQkxFCiAjZGVmaW5lIEk0MEVfRkxBR19PVVRFUl9VRFBfQ1NVTV9DQVBBQkxFCUk0MEVWRl9GTEFHX09VVEVSX1VEUF9DU1VNX0NBUEFCTEUKIAkvKiBmbGFncyBmb3IgYWRtaW4gcXVldWUgc2VydmljZSB0YXNrICovCkBAIC0yMzMsNyArMjI5LDcgQEAKICNkZWZpbmUgSTQwRVZGX0ZMQUdfQVFfQ09ORklHVVJFX1FVRVVFUwkJQklUKDYpCiAjZGVmaW5lIEk0MEVWRl9GTEFHX0FRX01BUF9WRUNUT1JTCQlCSVQoNykKICNkZWZpbmUgSTQwRVZGX0ZMQUdfQVFfSEFORExFX1JFU0VUCQlCSVQoOCkKLSNkZWZpbmUgSTQwRVZGX0ZMQUdfQVFfQ09ORklHVVJFX1JTUwkJQklUKDkpCS8qIGRpcmVjdCBBUSBjb25maWcgKi8KKyNkZWZpbmUgSTQwRVZGX0ZMQUdfQVFfQ09ORklHVVJFX1JTUwkJQklUKDkpIC8qIGRpcmVjdCBBUSBjb25maWcgKi8KICNkZWZpbmUgSTQwRVZGX0ZMQUdfQVFfR0VUX0NPTkZJRwkJQklUKDEwKQogLyogTmV3ZXIgc3R5bGUsIFJTUyBkb25lIGJ5IHRoZSBQRiBzbyB3ZSBjYW4gaWdub3JlIGhhcmR3YXJlIHZhZ2FyaWVzLiAqLwogI2RlZmluZSBJNDBFVkZfRkxBR19BUV9HRVRfSEVOQQkJCUJJVCgxMSkKQEAgLTI1OCw2ICsyNTQsNyBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCB3YXRjaGRvZ190YXNrOwogCWJvb2wgbmV0ZGV2X3JlZ2lzdGVyZWQ7CiAJYm9vbCBsaW5rX3VwOworCWVudW0gaTQwZV9hcV9saW5rX3NwZWVkIGxpbmtfc3BlZWQ7CiAJZW51bSBpNDBlX3ZpcnRjaG5sX29wcyBjdXJyZW50X29wOwogI2RlZmluZSBDTElFTlRfRU5BQkxFRChfYSkgKChfYSktPnZmX3JlcyA/IFwKIAkJCSAgICAoX2EpLT52Zl9yZXMtPnZmX29mZmxvYWRfZmxhZ3MgJiBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmZfZXRodG9vbC5jCmluZGV4IGM5YzIwMmY2Li5hOTk0MDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmX2V0aHRvb2wuYwpAQCAtNzQsMTMgKzc0LDMzIEBACiBzdGF0aWMgaW50IGk0MGV2Zl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCiB7Ci0JLyogSW4gdGhlIGZ1dHVyZSB0aGUgVkYgd2lsbCBiZSBhYmxlIHRvIHF1ZXJ5IHRoZSBQRiBmb3IKLQkgKiBzb21lIGluZm9ybWF0aW9uIC0gZm9yIG5vdyB1c2UgYSBkdW1teSB2YWx1ZQotCSAqLworCXN0cnVjdCBpNDBldmZfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKIAllY21kLT5zdXBwb3J0ZWQgPSAwOwogCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CiAJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0RVTU1ZMTsKIAllY21kLT5wb3J0ID0gUE9SVF9OT05FOworCS8qIFNldCBzcGVlZCBhbmQgZHVwbGV4ICovCisJc3dpdGNoIChhZGFwdGVyLT5saW5rX3NwZWVkKSB7CisJY2FzZSBJNDBFX0xJTktfU1BFRURfNDBHQjoKKwkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGVjbWQsIFNQRUVEXzQwMDAwKTsKKwkJYnJlYWs7CisJY2FzZSBJNDBFX0xJTktfU1BFRURfMjBHQjoKKwkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGVjbWQsIFNQRUVEXzIwMDAwKTsKKwkJYnJlYWs7CisJY2FzZSBJNDBFX0xJTktfU1BFRURfMTBHQjoKKwkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGVjbWQsIFNQRUVEXzEwMDAwKTsKKwkJYnJlYWs7CisJY2FzZSBJNDBFX0xJTktfU1BFRURfMUdCOgorCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgU1BFRURfMTAwMCk7CisJCWJyZWFrOworCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzEwME1COgorCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgU1BFRURfMTAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWVjbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNzYsMzEgKzI5NiwxNzQgQEAKIH0KIAogLyoqCisgKiBfX2k0MGV2Zl9nZXRfY29hbGVzY2UgLSBnZXQgcGVyLXF1ZXVlIGNvYWxlc2NlIHNldHRpbmdzCisgKiBAbmV0ZGV2OiB0aGUgbmV0ZGV2IHRvIGNoZWNrCisgKiBAZWM6IGV0aHRvb2wgY29hbGVzY2UgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBxdWV1ZTogd2hpY2ggcXVldWUgdG8gcGljaworICoKKyAqIEdldHMgdGhlIHBlci1xdWV1ZSBzZXR0aW5ncyBmb3IgY29hbGVzY2VuY2UuIFNwZWNpZmljYWxseSBSeCBhbmQgVHggdXNlY3MKKyAqIGFyZSBwZXIgcXVldWUuIElmIHF1ZXVlIGlzIDwwIHRoZW4gd2UgZGVmYXVsdCB0byBxdWV1ZSAwIGFzIHRoZQorICogcmVwcmVzZW50YXRpdmUgdmFsdWUuCisgKiovCitzdGF0aWMgaW50IF9faTQwZXZmX2dldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCSBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMsCisJCQkJIGludCBxdWV1ZSkKK3sKKwlzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBpNDBlX3ZzaSAqdnNpID0gJmFkYXB0ZXItPnZzaTsKKwlzdHJ1Y3QgaTQwZV9yaW5nICpyeF9yaW5nLCAqdHhfcmluZzsKKworCWVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9IHZzaS0+d29ya19saW1pdDsKKwllYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPSB2c2ktPndvcmtfbGltaXQ7CisKKwkvKiBSeCBhbmQgVHggdXNlY3MgcGVyIHF1ZXVlIHZhbHVlLiBJZiB1c2VyIGRvZXNuJ3Qgc3BlY2lmeSB0aGUKKwkgKiBxdWV1ZSwgcmV0dXJuIHF1ZXVlIDAncyB2YWx1ZSB0byByZXByZXNlbnQuCisJICovCisJaWYgKHF1ZXVlIDwgMCkKKwkJcXVldWUgPSAwOworCWVsc2UgaWYgKHF1ZXVlID49IGFkYXB0ZXItPm51bV9hY3RpdmVfcXVldWVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZ3NbcXVldWVdOworCXR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZ3NbcXVldWVdOworCisJaWYgKElUUl9JU19EWU5BTUlDKHJ4X3JpbmctPnJ4X2l0cl9zZXR0aW5nKSkKKwkJZWMtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSA9IDE7CisKKwlpZiAoSVRSX0lTX0RZTkFNSUModHhfcmluZy0+dHhfaXRyX3NldHRpbmcpKQorCQllYy0+dXNlX2FkYXB0aXZlX3R4X2NvYWxlc2NlID0gMTsKKworCWVjLT5yeF9jb2FsZXNjZV91c2VjcyA9IHJ4X3JpbmctPnJ4X2l0cl9zZXR0aW5nICYgfkk0MEVfSVRSX0RZTkFNSUM7CisJZWMtPnR4X2NvYWxlc2NlX3VzZWNzID0gdHhfcmluZy0+dHhfaXRyX3NldHRpbmcgJiB+STQwRV9JVFJfRFlOQU1JQzsKKworCXJldHVybiAwOworfQorCisvKioKICAqIGk0MGV2Zl9nZXRfY29hbGVzY2UgLSBHZXQgaW50ZXJydXB0IGNvYWxlc2Npbmcgc2V0dGluZ3MKICAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBlYzogZXRodG9vbCBjb2FsZXNjZSBzdHJ1Y3R1cmUKICAqCiAgKiBSZXR1cm5zIGN1cnJlbnQgY29hbGVzY2luZyBzZXR0aW5ncy4gVGhpcyBpcyByZWZlcnJlZCB0byBlbHNld2hlcmUgaW4gdGhlCiAgKiBkcml2ZXIgYXMgSW50ZXJydXB0IFRocm90dGxlIFJhdGUsIGFzIHRoaXMgaXMgaG93IHRoZSBoYXJkd2FyZSBkZXNjcmliZXMKLSAqIHRoaXMgZnVuY3Rpb25hbGl0eS4KKyAqIHRoaXMgZnVuY3Rpb25hbGl0eS4gTm90ZSB0aGF0IGlmIHBlci1xdWV1ZSBzZXR0aW5ncyBoYXZlIGJlZW4gbW9kaWZpZWQgdGhpcworICogb25seSByZXByZXNlbnRzIHRoZSBzZXR0aW5ncyBvZiBxdWV1ZSAwLgogICoqLwogc3RhdGljIGludCBpNDBldmZfZ2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjKQogeworCXJldHVybiBfX2k0MGV2Zl9nZXRfY29hbGVzY2UobmV0ZGV2LCBlYywgLTEpOworfQorCisvKioKKyAqIGk0MGV2Zl9nZXRfcGVyX3F1ZXVlX2NvYWxlc2NlIC0gZ2V0IGNvYWxlc2NlIHZhbHVlcyBmb3Igc3BlY2lmaWMgcXVldWUKKyAqIEBuZXRkZXY6IG5ldGRldiB0byByZWFkCisgKiBAZWM6IGNvYWxlc2NlIHNldHRpbmdzIGZyb20gZXRodG9vbAorICogQHF1ZXVlOiB0aGUgcXVldWUgdG8gcmVhZAorICoKKyAqIFJlYWQgc3BlY2lmaWMgcXVldWUncyBjb2FsZXNjZSBzZXR0aW5ncy4KKyAqKi8KK3N0YXRpYyBpbnQgaTQwZXZmX2dldF9wZXJfcXVldWVfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkJIHUzMiBxdWV1ZSwKKwkJCQkJIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKK3sKKwlyZXR1cm4gX19pNDBldmZfZ2V0X2NvYWxlc2NlKG5ldGRldiwgZWMsIHF1ZXVlKTsKK30KKworLyoqCisgKiBpNDBldmZfc2V0X2l0cl9wZXJfcXVldWUgLSBzZXQgSVRSIHZhbHVlcyBmb3Igc3BlY2lmaWMgcXVldWUKKyAqIEB2c2k6IHRoZSBWU0kgdG8gc2V0IHZhbHVlcyBmb3IKKyAqIEBlYzogY29hbGVzY2Ugc2V0dGluZ3MgZnJvbSBldGh0b29sCisgKiBAcXVldWU6IHRoZSBxdWV1ZSB0byBtb2RpZnkKKyAqCisgKiBDaGFuZ2UgdGhlIElUUiBzZXR0aW5ncyBmb3IgYSBzcGVjaWZpYyBxdWV1ZS4KKyAqKi8KK3N0YXRpYyB2b2lkIGk0MGV2Zl9zZXRfaXRyX3Blcl9xdWV1ZShzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMsCisJCQkJICAgICBpbnQgcXVldWUpCit7CisJc3RydWN0IGk0MGVfdnNpICp2c2kgPSAmYWRhcHRlci0+dnNpOworCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlzdHJ1Y3QgaTQwZV9xX3ZlY3RvciAqcV92ZWN0b3I7CisJdTE2IHZlY3RvcjsKKworCWFkYXB0ZXItPnJ4X3JpbmdzW3F1ZXVlXS5yeF9pdHJfc2V0dGluZyA9IGVjLT5yeF9jb2FsZXNjZV91c2VjczsKKwlhZGFwdGVyLT50eF9yaW5nc1txdWV1ZV0udHhfaXRyX3NldHRpbmcgPSBlYy0+dHhfY29hbGVzY2VfdXNlY3M7CisKKwlpZiAoZWMtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSkKKwkJYWRhcHRlci0+cnhfcmluZ3NbcXVldWVdLnJ4X2l0cl9zZXR0aW5nIHw9IEk0MEVfSVRSX0RZTkFNSUM7CisJZWxzZQorCQlhZGFwdGVyLT5yeF9yaW5nc1txdWV1ZV0ucnhfaXRyX3NldHRpbmcgJj0gfkk0MEVfSVRSX0RZTkFNSUM7CisKKwlpZiAoZWMtPnVzZV9hZGFwdGl2ZV90eF9jb2FsZXNjZSkKKwkJYWRhcHRlci0+dHhfcmluZ3NbcXVldWVdLnR4X2l0cl9zZXR0aW5nIHw9IEk0MEVfSVRSX0RZTkFNSUM7CisJZWxzZQorCQlhZGFwdGVyLT50eF9yaW5nc1txdWV1ZV0udHhfaXRyX3NldHRpbmcgJj0gfkk0MEVfSVRSX0RZTkFNSUM7CisKKwlxX3ZlY3RvciA9IGFkYXB0ZXItPnJ4X3JpbmdzW3F1ZXVlXS5xX3ZlY3RvcjsKKwlxX3ZlY3Rvci0+cnguaXRyID0gSVRSX1RPX1JFRyhhZGFwdGVyLT5yeF9yaW5nc1txdWV1ZV0ucnhfaXRyX3NldHRpbmcpOworCXZlY3RvciA9IHZzaS0+YmFzZV92ZWN0b3IgKyBxX3ZlY3Rvci0+dl9pZHg7CisJd3IzMihodywgSTQwRV9WRklOVF9JVFJOMShJNDBFX1JYX0lUUiwgdmVjdG9yIC0gMSksIHFfdmVjdG9yLT5yeC5pdHIpOworCisJcV92ZWN0b3IgPSBhZGFwdGVyLT50eF9yaW5nc1txdWV1ZV0ucV92ZWN0b3I7CisJcV92ZWN0b3ItPnR4Lml0ciA9IElUUl9UT19SRUcoYWRhcHRlci0+dHhfcmluZ3NbcXVldWVdLnR4X2l0cl9zZXR0aW5nKTsKKwl2ZWN0b3IgPSB2c2ktPmJhc2VfdmVjdG9yICsgcV92ZWN0b3ItPnZfaWR4OworCXdyMzIoaHcsIEk0MEVfVkZJTlRfSVRSTjEoSTQwRV9UWF9JVFIsIHZlY3RvciAtIDEpLCBxX3ZlY3Rvci0+dHguaXRyKTsKKworCWk0MGVfZmx1c2goaHcpOworfQorCisvKioKKyAqIF9faTQwZXZmX3NldF9jb2FsZXNjZSAtIHNldCBjb2FsZXNjZSBzZXR0aW5ncyBmb3IgcGFydGljdWxhciBxdWV1ZQorICogQG5ldGRldjogdGhlIG5ldGRldiB0byBjaGFuZ2UKKyAqIEBlYzogZXRodG9vbCBjb2FsZXNjZSBzZXR0aW5ncworICogQHF1ZXVlOiB0aGUgcXVldWUgdG8gY2hhbmdlCisgKgorICogU2V0cyB0aGUgY29hbGVzY2Ugc2V0dGluZ3MgZm9yIGEgcGFydGljdWxhciBxdWV1ZS4KKyAqKi8KK3N0YXRpYyBpbnQgX19pNDBldmZfc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYywKKwkJCQkgaW50IHF1ZXVlKQorewogCXN0cnVjdCBpNDBldmZfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGk0MGVfdnNpICp2c2kgPSAmYWRhcHRlci0+dnNpOworCWludCBpOwogCi0JZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gdnNpLT53b3JrX2xpbWl0OwotCWVjLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9IHZzaS0+d29ya19saW1pdDsKKwlpZiAoZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSB8fCBlYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxKQorCQl2c2ktPndvcmtfbGltaXQgPSBlYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxOwogCi0JaWYgKElUUl9JU19EWU5BTUlDKHZzaS0+cnhfaXRyX3NldHRpbmcpKQotCQllYy0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlID0gMTsKKwlpZiAoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID09IDApIHsKKwkJaWYgKGVjLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UpCisJCQluZXRpZl9pbmZvKGFkYXB0ZXIsIGRydiwgbmV0ZGV2LCAicngtdXNlY3M9MCwgbmVlZCB0byBkaXNhYmxlIGFkYXB0aXZlLXJ4IGZvciBhIGNvbXBsZXRlIGRpc2FibGVcbiIpOworCX0gZWxzZSBpZiAoKGVjLT5yeF9jb2FsZXNjZV91c2VjcyA8IChJNDBFX01JTl9JVFIgPDwgMSkpIHx8CisJCSAgIChlYy0+cnhfY29hbGVzY2VfdXNlY3MgPiAoSTQwRV9NQVhfSVRSIDw8IDEpKSkgeworCQluZXRpZl9pbmZvKGFkYXB0ZXIsIGRydiwgbmV0ZGV2LCAiSW52YWxpZCB2YWx1ZSwgcngtdXNlY3MgcmFuZ2UgaXMgMC04MTYwXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0JaWYgKElUUl9JU19EWU5BTUlDKHZzaS0+dHhfaXRyX3NldHRpbmcpKQotCQllYy0+dXNlX2FkYXB0aXZlX3R4X2NvYWxlc2NlID0gMTsKKwllbHNlCisJaWYgKGVjLT50eF9jb2FsZXNjZV91c2VjcyA9PSAwKSB7CisJCWlmIChlYy0+dXNlX2FkYXB0aXZlX3R4X2NvYWxlc2NlKQorCQkJbmV0aWZfaW5mbyhhZGFwdGVyLCBkcnYsIG5ldGRldiwgInR4LXVzZWNzPTAsIG5lZWQgdG8gZGlzYWJsZSBhZGFwdGl2ZS10eCBmb3IgYSBjb21wbGV0ZSBkaXNhYmxlXG4iKTsKKwl9IGVsc2UgaWYgKChlYy0+dHhfY29hbGVzY2VfdXNlY3MgPCAoSTQwRV9NSU5fSVRSIDw8IDEpKSB8fAorCQkgICAoZWMtPnR4X2NvYWxlc2NlX3VzZWNzID4gKEk0MEVfTUFYX0lUUiA8PCAxKSkpIHsKKwkJbmV0aWZfaW5mbyhhZGFwdGVyLCBkcnYsIG5ldGRldiwgIkludmFsaWQgdmFsdWUsIHR4LXVzZWNzIHJhbmdlIGlzIDAtODE2MFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAotCWVjLT5yeF9jb2FsZXNjZV91c2VjcyA9IHZzaS0+cnhfaXRyX3NldHRpbmcgJiB+STQwRV9JVFJfRFlOQU1JQzsKLQllYy0+dHhfY29hbGVzY2VfdXNlY3MgPSB2c2ktPnR4X2l0cl9zZXR0aW5nICYgfkk0MEVfSVRSX0RZTkFNSUM7CisJLyogUnggYW5kIFR4IHVzZWNzIGhhcyBwZXIgcXVldWUgdmFsdWUuIElmIHVzZXIgZG9lc24ndCBzcGVjaWZ5IHRoZQorCSAqIHF1ZXVlLCBhcHBseSB0byBhbGwgcXVldWVzLgorCSAqLworCWlmIChxdWV1ZSA8IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9hY3RpdmVfcXVldWVzOyBpKyspCisJCQlpNDBldmZfc2V0X2l0cl9wZXJfcXVldWUoYWRhcHRlciwgZWMsIGkpOworCX0gZWxzZSBpZiAocXVldWUgPCBhZGFwdGVyLT5udW1fYWN0aXZlX3F1ZXVlcykgeworCQlpNDBldmZfc2V0X2l0cl9wZXJfcXVldWUoYWRhcHRlciwgZWMsIHF1ZXVlKTsKKwl9IGVsc2UgeworCQluZXRpZl9pbmZvKGFkYXB0ZXIsIGRydiwgbmV0ZGV2LCAiSW52YWxpZCBxdWV1ZSB2YWx1ZSwgcXVldWUgcmFuZ2UgaXMgMCAtICVkXG4iLAorCQkJICAgYWRhcHRlci0+bnVtX2FjdGl2ZV9xdWV1ZXMgLSAxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMTAsNTYgKzQ3MywyNyBAQAogICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQogICogQGVjOiBldGh0b29sIGNvYWxlc2NlIHN0cnVjdHVyZQogICoKLSAqIENoYW5nZSBjdXJyZW50IGNvYWxlc2Npbmcgc2V0dGluZ3MuCisgKiBDaGFuZ2UgY3VycmVudCBjb2FsZXNjaW5nIHNldHRpbmdzIGZvciBldmVyeSBxdWV1ZS4KICAqKi8KIHN0YXRpYyBpbnQgaTQwZXZmX3NldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKIHsKLQlzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQlzdHJ1Y3QgaTQwZV92c2kgKnZzaSA9ICZhZGFwdGVyLT52c2k7Ci0Jc3RydWN0IGk0MGVfcV92ZWN0b3IgKnFfdmVjdG9yOwotCWludCBpOworCXJldHVybiBfX2k0MGV2Zl9zZXRfY29hbGVzY2UobmV0ZGV2LCBlYywgLTEpOworfQogCi0JaWYgKGVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnEgfHwgZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSkKLQkJdnNpLT53b3JrX2xpbWl0ID0gZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycTsKLQotCWlmICgoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID49IChJNDBFX01JTl9JVFIgPDwgMSkpICYmCi0JICAgIChlYy0+cnhfY29hbGVzY2VfdXNlY3MgPD0gKEk0MEVfTUFYX0lUUiA8PCAxKSkpCi0JCXZzaS0+cnhfaXRyX3NldHRpbmcgPSBlYy0+cnhfY29hbGVzY2VfdXNlY3M7Ci0KLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKChlYy0+dHhfY29hbGVzY2VfdXNlY3MgPj0gKEk0MEVfTUlOX0lUUiA8PCAxKSkgJiYKLQkgICAgKGVjLT50eF9jb2FsZXNjZV91c2VjcyA8PSAoSTQwRV9NQVhfSVRSIDw8IDEpKSkKLQkJdnNpLT50eF9pdHJfc2V0dGluZyA9IGVjLT50eF9jb2FsZXNjZV91c2VjczsKLQllbHNlIGlmIChlYy0+dXNlX2FkYXB0aXZlX3R4X2NvYWxlc2NlKQotCQl2c2ktPnR4X2l0cl9zZXR0aW5nID0gKEk0MEVfSVRSX0RZTkFNSUMgfAotCQkJCSAgICAgICBJVFJfUkVHX1RPX1VTRUMoSTQwRV9JVFJfUlhfREVGKSk7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChlYy0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlKQotCQl2c2ktPnJ4X2l0cl9zZXR0aW5nIHw9IEk0MEVfSVRSX0RZTkFNSUM7Ci0JZWxzZQotCQl2c2ktPnJ4X2l0cl9zZXR0aW5nICY9IH5JNDBFX0lUUl9EWU5BTUlDOwotCi0JaWYgKGVjLT51c2VfYWRhcHRpdmVfdHhfY29hbGVzY2UpCi0JCXZzaS0+dHhfaXRyX3NldHRpbmcgfD0gSTQwRV9JVFJfRFlOQU1JQzsKLQllbHNlCi0JCXZzaS0+dHhfaXRyX3NldHRpbmcgJj0gfkk0MEVfSVRSX0RZTkFNSUM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX21zaXhfdmVjdG9ycyAtIE5PTlFfVkVDUzsgaSsrKSB7Ci0JCXFfdmVjdG9yID0gJmFkYXB0ZXItPnFfdmVjdG9yc1tpXTsKLQkJcV92ZWN0b3ItPnJ4Lml0ciA9IElUUl9UT19SRUcodnNpLT5yeF9pdHJfc2V0dGluZyk7Ci0JCXdyMzIoaHcsIEk0MEVfVkZJTlRfSVRSTjEoMCwgaSksIHFfdmVjdG9yLT5yeC5pdHIpOwotCQlxX3ZlY3Rvci0+dHguaXRyID0gSVRSX1RPX1JFRyh2c2ktPnR4X2l0cl9zZXR0aW5nKTsKLQkJd3IzMihodywgSTQwRV9WRklOVF9JVFJOMSgxLCBpKSwgcV92ZWN0b3ItPnR4Lml0cik7Ci0JCWk0MGVfZmx1c2goaHcpOwotCX0KLQotCXJldHVybiAwOworLyoqCisgKiBpNDBldmZfc2V0X3Blcl9xdWV1ZV9jb2FsZXNjZSAtIHNldCBzcGVjaWZpYyBxdWV1ZSdzIGNvYWxlc2NlIHNldHRpbmdzCisgKiBAbmV0ZGV2OiB0aGUgbmV0ZGV2IHRvIGNoYW5nZQorICogQGVjOiBldGh0b29sJ3MgY29hbGVzY2Ugc2V0dGluZ3MKKyAqIEBxdWV1ZTogdGhlIHF1ZXVlIHRvIG1vZGlmeQorICoKKyAqIE1vZGlmaWVzIGEgc3BlY2lmaWMgcXVldWUncyBjb2FsZXNjZSBzZXR0aW5ncy4KKyAqLworc3RhdGljIGludCBpNDBldmZfc2V0X3Blcl9xdWV1ZV9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCQkgdTMyIHF1ZXVlLAorCQkJCQkgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjKQoreworCXJldHVybiBfX2k0MGV2Zl9zZXRfY29hbGVzY2UobmV0ZGV2LCBlYywgcXVldWUpOwogfQogCiAvKioKQEAgLTUxMyw2ICs2NDcsOCBAQAogCS5zZXRfbXNnbGV2ZWwJCT0gaTQwZXZmX3NldF9tc2dsZXZlbCwKIAkuZ2V0X2NvYWxlc2NlCQk9IGk0MGV2Zl9nZXRfY29hbGVzY2UsCiAJLnNldF9jb2FsZXNjZQkJPSBpNDBldmZfc2V0X2NvYWxlc2NlLAorCS5nZXRfcGVyX3F1ZXVlX2NvYWxlc2NlID0gaTQwZXZmX2dldF9wZXJfcXVldWVfY29hbGVzY2UsCisJLnNldF9wZXJfcXVldWVfY29hbGVzY2UgPSBpNDBldmZfc2V0X3Blcl9xdWV1ZV9jb2FsZXNjZSwKIAkuZ2V0X3J4bmZjCQk9IGk0MGV2Zl9nZXRfcnhuZmMsCiAJLmdldF9yeGZoX2luZGlyX3NpemUJPSBpNDBldmZfZ2V0X3J4ZmhfaW5kaXJfc2l6ZSwKIAkuZ2V0X3J4ZmgJCT0gaTQwZXZmX2dldF9yeGZoLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zl9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmX21haW4uYwppbmRleCA2MDBmYjljLi4xNDM3MjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmX21haW4uYwpAQCAtMzgsNyArMzgsNyBAQAogCiAjZGVmaW5lIERSVl9WRVJTSU9OX01BSk9SIDEKICNkZWZpbmUgRFJWX1ZFUlNJT05fTUlOT1IgNgotI2RlZmluZSBEUlZfVkVSU0lPTl9CVUlMRCAxMQorI2RlZmluZSBEUlZfVkVSU0lPTl9CVUlMRCAxNgogI2RlZmluZSBEUlZfVkVSU0lPTiBfX3N0cmluZ2lmeShEUlZfVkVSU0lPTl9NQUpPUikgIi4iIFwKIAkgICAgIF9fc3RyaW5naWZ5KERSVl9WRVJTSU9OX01JTk9SKSAiLiIgXAogCSAgICAgX19zdHJpbmdpZnkoRFJWX1ZFUlNJT05fQlVJTEQpIFwKQEAgLTM3MCw2ICszNzAsNyBAQAogewogCXN0cnVjdCBpNDBlX3FfdmVjdG9yICpxX3ZlY3RvciA9ICZhZGFwdGVyLT5xX3ZlY3RvcnNbdl9pZHhdOwogCXN0cnVjdCBpNDBlX3JpbmcgKnJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZ3Nbcl9pZHhdOworCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAogCXJ4X3JpbmctPnFfdmVjdG9yID0gcV92ZWN0b3I7CiAJcnhfcmluZy0+bmV4dCA9IHFfdmVjdG9yLT5yeC5yaW5nOwpAQCAtMzc3LDcgKzM3OCwxMCBAQAogCXFfdmVjdG9yLT5yeC5yaW5nID0gcnhfcmluZzsKIAlxX3ZlY3Rvci0+cnguY291bnQrKzsKIAlxX3ZlY3Rvci0+cngubGF0ZW5jeV9yYW5nZSA9IEk0MEVfTE9XX0xBVEVOQ1k7CisJcV92ZWN0b3ItPnJ4Lml0ciA9IElUUl9UT19SRUcocnhfcmluZy0+cnhfaXRyX3NldHRpbmcpOworCXFfdmVjdG9yLT5yaW5nX21hc2sgfD0gQklUKHJfaWR4KTsKIAlxX3ZlY3Rvci0+aXRyX2NvdW50ZG93biA9IElUUl9DT1VOVERPV05fU1RBUlQ7CisJd3IzMihodywgSTQwRV9WRklOVF9JVFJOMShJNDBFX1JYX0lUUiwgdl9pZHggLSAxKSwgcV92ZWN0b3ItPnJ4Lml0cik7CiB9CiAKIC8qKgpAQCAtMzkxLDYgKzM5NSw3IEBACiB7CiAJc3RydWN0IGk0MGVfcV92ZWN0b3IgKnFfdmVjdG9yID0gJmFkYXB0ZXItPnFfdmVjdG9yc1t2X2lkeF07CiAJc3RydWN0IGk0MGVfcmluZyAqdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nc1t0X2lkeF07CisJc3RydWN0IGk0MGVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCiAJdHhfcmluZy0+cV92ZWN0b3IgPSBxX3ZlY3RvcjsKIAl0eF9yaW5nLT5uZXh0ID0gcV92ZWN0b3ItPnR4LnJpbmc7CkBAIC0zOTgsOSArNDAzLDEwIEBACiAJcV92ZWN0b3ItPnR4LnJpbmcgPSB0eF9yaW5nOwogCXFfdmVjdG9yLT50eC5jb3VudCsrOwogCXFfdmVjdG9yLT50eC5sYXRlbmN5X3JhbmdlID0gSTQwRV9MT1dfTEFURU5DWTsKKwlxX3ZlY3Rvci0+dHguaXRyID0gSVRSX1RPX1JFRyh0eF9yaW5nLT50eF9pdHJfc2V0dGluZyk7CiAJcV92ZWN0b3ItPml0cl9jb3VudGRvd24gPSBJVFJfQ09VTlRET1dOX1NUQVJUOwogCXFfdmVjdG9yLT5udW1fcmluZ3BhaXJzKys7Ci0JcV92ZWN0b3ItPnJpbmdfbWFzayB8PSBCSVQodF9pZHgpOworCXdyMzIoaHcsIEk0MEVfVkZJTlRfSVRSTjEoSTQwRV9UWF9JVFIsIHZfaWR4IC0gMSksIHFfdmVjdG9yLT50eC5pdHIpOwogfQogCiAvKioKQEAgLTEwMDcsNyArMTAxMyw3IEBACiAgKiBpNDBldmZfdXBfY29tcGxldGUgLSBGaW5pc2ggdGhlIGxhc3Qgc3RlcHMgb2YgYnJpbmdpbmcgdXAgYSBjb25uZWN0aW9uCiAgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqKi8KLXN0YXRpYyBpbnQgaTQwZXZmX3VwX2NvbXBsZXRlKHN0cnVjdCBpNDBldmZfYWRhcHRlciAqYWRhcHRlcikKK3N0YXRpYyB2b2lkIGk0MGV2Zl91cF9jb21wbGV0ZShzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJYWRhcHRlci0+c3RhdGUgPSBfX0k0MEVWRl9SVU5OSU5HOwogCWNsZWFyX2JpdChfX0k0MEVfRE9XTiwgJmFkYXB0ZXItPnZzaS5zdGF0ZSk7CkBAIC0xMDE2LDcgKzEwMjIsNiBAQAogCiAJYWRhcHRlci0+YXFfcmVxdWlyZWQgfD0gSTQwRVZGX0ZMQUdfQVFfRU5BQkxFX1FVRVVFUzsKIAltb2RfdGltZXJfcGVuZGluZygmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsIGppZmZpZXMgKyAxKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xMDM3LDYgKzEwNDIsNyBAQAogCiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAluZXRpZl90eF9kaXNhYmxlKG5ldGRldik7CisJYWRhcHRlci0+bGlua191cCA9IGZhbHNlOwogCWk0MGV2Zl9uYXBpX2Rpc2FibGVfYWxsKGFkYXB0ZXIpOwogCWk0MGV2Zl9pcnFfZGlzYWJsZShhZGFwdGVyKTsKIApAQCAtMTE1NCw2ICsxMTYwLDcgQEAKIAkJdHhfcmluZy0+bmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCQl0eF9yaW5nLT5kZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OwogCQl0eF9yaW5nLT5jb3VudCA9IGFkYXB0ZXItPnR4X2Rlc2NfY291bnQ7CisJCXR4X3JpbmctPnR4X2l0cl9zZXR0aW5nID0gKEk0MEVfSVRSX0RZTkFNSUMgfCBJNDBFX0lUUl9UWF9ERUYpOwogCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJNDBFX0ZMQUdfV0JfT05fSVRSX0NBUEFCTEUpCiAJCQl0eF9yaW5nLT5mbGFncyB8PSBJNDBFX1RYUl9GTEFHU19XQl9PTl9JVFI7CiAKQEAgLTExNjIsNiArMTE2OSw3IEBACiAJCXJ4X3JpbmctPm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAkJcnhfcmluZy0+ZGV2ID0gJmFkYXB0ZXItPnBkZXYtPmRldjsKIAkJcnhfcmluZy0+Y291bnQgPSBhZGFwdGVyLT5yeF9kZXNjX2NvdW50OworCQlyeF9yaW5nLT5yeF9pdHJfc2V0dGluZyA9IChJNDBFX0lUUl9EWU5BTUlDIHwgSTQwRV9JVFJfUlhfREVGKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE0MjAsNyArMTQyOCw5IEBACiB7CiAJaW50IGVycjsKIAorCXJ0bmxfbG9jaygpOwogCWVyciA9IGk0MGV2Zl9zZXRfaW50ZXJydXB0X2NhcGFiaWxpdHkoYWRhcHRlcik7CisJcnRubF91bmxvY2soKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCSJVbmFibGUgdG8gc2V0dXAgaW50ZXJydXB0IGNhcGFiaWxpdGllc1xuIik7CkBAIC0xNzI5LDYgKzE3MzksNyBAQAogCQkJc2V0X2JpdChfX0k0MEVfRE9XTiwgJmFkYXB0ZXItPnZzaS5zdGF0ZSk7CiAJCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwogCQkJbmV0aWZfdHhfZGlzYWJsZShuZXRkZXYpOworCQkJYWRhcHRlci0+bGlua191cCA9IGZhbHNlOwogCQkJaTQwZXZmX25hcGlfZGlzYWJsZV9hbGwoYWRhcHRlcik7CiAJCQlpNDBldmZfaXJxX2Rpc2FibGUoYWRhcHRlcik7CiAJCQlpNDBldmZfZnJlZV90cmFmZmljX2lycXMoYWRhcHRlcik7CkBAIC0xNzY3LDYgKzE3NzgsNyBAQAogCWlmIChuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKIAkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5ldGRldik7CisJCWFkYXB0ZXItPmxpbmtfdXAgPSBmYWxzZTsKIAkJaTQwZXZmX25hcGlfZGlzYWJsZV9hbGwoYWRhcHRlcik7CiAJfQogCWk0MGV2Zl9pcnFfZGlzYWJsZShhZGFwdGVyKTsKQEAgLTE3ODEsOCArMTc5Myw3IEBACiAJaTQwZXZmX2ZyZWVfYWxsX3R4X3Jlc291cmNlcyhhZGFwdGVyKTsKIAogCS8qIGtpbGwgYW5kIHJlaW5pdCB0aGUgYWRtaW4gcXVldWUgKi8KLQlpZiAoaTQwZXZmX3NodXRkb3duX2FkbWlucShodykpCi0JCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJGYWlsZWQgdG8gc2h1dCBkb3duIGFkbWlucVxuIik7CisJaTQwZXZmX3NodXRkb3duX2FkbWlucShodyk7CiAJYWRhcHRlci0+Y3VycmVudF9vcCA9IEk0MEVfVklSVENITkxfT1BfVU5LTk9XTjsKIAllcnIgPSBpNDBldmZfaW5pdF9hZG1pbnEoaHcpOwogCWlmIChlcnIpCkBAIC0xODAyLDYgKzE4MTMsOCBAQAogCX0KIAlhZGFwdGVyLT5hcV9yZXF1aXJlZCB8PSBJNDBFVkZfRkxBR19BUV9BRERfTUFDX0ZJTFRFUjsKIAlhZGFwdGVyLT5hcV9yZXF1aXJlZCB8PSBJNDBFVkZfRkxBR19BUV9BRERfVkxBTl9GSUxURVI7CisJLyogT3BlbiBSRE1BIENsaWVudCBhZ2FpbiAqLworCWFkYXB0ZXItPmFxX3JlcXVpcmVkIHw9IEk0MEVWRl9GTEFHX1NFUlZJQ0VfQ0xJRU5UX1JFUVVFU1RFRDsKIAljbGVhcl9iaXQoX19JNDBFVkZfSU5fQ1JJVElDQUxfVEFTSywgJmFkYXB0ZXItPmNyaXRfc2VjdGlvbik7CiAJaTQwZXZmX21pc2NfaXJxX2VuYWJsZShhZGFwdGVyKTsKIApAQCAtMTgyMCw5ICsxODMzLDcgQEAKIAogCQlpNDBldmZfY29uZmlndXJlKGFkYXB0ZXIpOwogCi0JCWVyciA9IGk0MGV2Zl91cF9jb21wbGV0ZShhZGFwdGVyKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gcmVzZXRfZXJyOworCQlpNDBldmZfdXBfY29tcGxldGUoYWRhcHRlcik7CiAKIAkJaTQwZXZmX2lycV9lbmFibGUoYWRhcHRlciwgdHJ1ZSk7CiAJfSBlbHNlIHsKQEAgLTIwNTIsOSArMjA2Myw3IEBACiAJaTQwZXZmX2FkZF9maWx0ZXIoYWRhcHRlciwgYWRhcHRlci0+aHcubWFjLmFkZHIpOwogCWk0MGV2Zl9jb25maWd1cmUoYWRhcHRlcik7CiAKLQllcnIgPSBpNDBldmZfdXBfY29tcGxldGUoYWRhcHRlcik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfcmVxX2lycTsKKwlpNDBldmZfdXBfY29tcGxldGUoYWRhcHRlcik7CiAKIAlpNDBldmZfaXJxX2VuYWJsZShhZGFwdGVyLCB0cnVlKTsKIApAQCAtMjI2OCwxMCArMjI3Nyw2IEBACiAJYWRhcHRlci0+dnNpLmJhY2sgPSBhZGFwdGVyOwogCWFkYXB0ZXItPnZzaS5iYXNlX3ZlY3RvciA9IDE7CiAJYWRhcHRlci0+dnNpLndvcmtfbGltaXQgPSBJNDBFX0RFRkFVTFRfSVJRX1dPUks7Ci0JYWRhcHRlci0+dnNpLnJ4X2l0cl9zZXR0aW5nID0gKEk0MEVfSVRSX0RZTkFNSUMgfAotCQkJCSAgICAgICBJVFJfUkVHX1RPX1VTRUMoSTQwRV9JVFJfUlhfREVGKSk7Ci0JYWRhcHRlci0+dnNpLnR4X2l0cl9zZXR0aW5nID0gKEk0MEVfSVRSX0RZTkFNSUMgfAotCQkJCSAgICAgICBJVFJfUkVHX1RPX1VTRUMoSTQwRV9JVFJfVFhfREVGKSk7CiAJdnNpLT5uZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJdnNpLT5xc19oYW5kbGUgPSBhZGFwdGVyLT52c2lfcmVzLT5xc2V0X2hhbmRsZTsKIAlpZiAodmZyZXMtPnZmX29mZmxvYWRfZmxhZ3MgJiBJNDBFX1ZJUlRDSE5MX1ZGX09GRkxPQURfUlNTX1BGKSB7CkBAIC0yNDUzLDYgKzI0NTgsNyBAQAogCQlnb3RvIGVycl9zd19pbml0OwogCiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwlhZGFwdGVyLT5saW5rX3VwID0gZmFsc2U7CiAKIAlpZiAoIWFkYXB0ZXItPm5ldGRldl9yZWdpc3RlcmVkKSB7CiAJCWVyciA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOwpAQCAtMjgzMSw3ICsyODM3LDggQEAKIAogCXByX2luZm8oIiVzXG4iLCBpNDBldmZfY29weXJpZ2h0KTsKIAotCWk0MGV2Zl93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKGk0MGV2Zl9kcml2ZXJfbmFtZSk7CisJaTQwZXZmX3dxID0gYWxsb2Nfd29ya3F1ZXVlKCIlcyIsIFdRX1VOQk9VTkQgfCBXUV9NRU1fUkVDTEFJTSwgMSwKKwkJCQkgICAgaTQwZXZmX2RyaXZlcl9uYW1lKTsKIAlpZiAoIWk0MGV2Zl93cSkgewogCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIHdvcmtxdWV1ZVxuIiwgaTQwZXZmX2RyaXZlcl9uYW1lKTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmX3ZpcnRjaG5sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmX3ZpcnRjaG5sLmMKaW5kZXggZDc2YzIyMS4uZGRmNDc4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zl92aXJ0Y2hubC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmZfdmlydGNobmwuYwpAQCAtODE3LDYgKzgxNyw0NSBAQAogfQogCiAvKioKKyAqIGk0MGV2Zl9wcmludF9saW5rX21lc3NhZ2UgLSBwcmludCBsaW5rIHVwIG9yIGRvd24KKyAqIEBhZGFwdGVyOiBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqIExvZyBhIG1lc3NhZ2UgdGVsbGluZyB0aGUgd29ybGQgb2Ygb3VyIHdvbmRlcm91cyBsaW5rIHN0YXR1cworICovCitzdGF0aWMgdm9pZCBpNDBldmZfcHJpbnRfbGlua19tZXNzYWdlKHN0cnVjdCBpNDBldmZfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCWNoYXIgKnNwZWVkID0gIlVua25vd24gIjsKKworCWlmICghYWRhcHRlci0+bGlua191cCkgeworCQluZXRkZXZfaW5mbyhuZXRkZXYsICJOSUMgTGluayBpcyBEb3duXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoYWRhcHRlci0+bGlua19zcGVlZCkgeworCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzQwR0I6CisJCXNwZWVkID0gIjQwIEciOworCQlicmVhazsKKwljYXNlIEk0MEVfTElOS19TUEVFRF8yMEdCOgorCQlzcGVlZCA9ICIyMCBHIjsKKwkJYnJlYWs7CisJY2FzZSBJNDBFX0xJTktfU1BFRURfMTBHQjoKKwkJc3BlZWQgPSAiMTAgRyI7CisJCWJyZWFrOworCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzFHQjoKKwkJc3BlZWQgPSAiMTAwMCBNIjsKKwkJYnJlYWs7CisJY2FzZSBJNDBFX0xJTktfU1BFRURfMTAwTUI6CisJCXNwZWVkID0gIjEwMCBNIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJbmV0ZGV2X2luZm8obmV0ZGV2LCAiTklDIExpbmsgaXMgVXAgJXNicHMgRnVsbCBEdXBsZXhcbiIsIHNwZWVkKTsKK30KKworLyoqCiAgKiBpNDBldmZfcmVxdWVzdF9yZXNldAogICogQGFkYXB0ZXI6IGFkYXB0ZXIgc3RydWN0dXJlCiAgKgpAQCAtODUzLDE2ICs4OTIsMjAgQEAKIAkJCShzdHJ1Y3QgaTQwZV92aXJ0Y2hubF9wZl9ldmVudCAqKW1zZzsKIAkJc3dpdGNoICh2cGUtPmV2ZW50KSB7CiAJCWNhc2UgSTQwRV9WSVJUQ0hOTF9FVkVOVF9MSU5LX0NIQU5HRToKLQkJCWFkYXB0ZXItPmxpbmtfdXAgPQotCQkJCXZwZS0+ZXZlbnRfZGF0YS5saW5rX2V2ZW50Lmxpbmtfc3RhdHVzOwotCQkJaWYgKGFkYXB0ZXItPmxpbmtfdXAgJiYgIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewotCQkJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJOSUMgTGluayBpcyBVcFxuIik7Ci0JCQkJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOwotCQkJCW5ldGlmX3R4X3dha2VfYWxsX3F1ZXVlcyhuZXRkZXYpOwotCQkJfSBlbHNlIGlmICghYWRhcHRlci0+bGlua191cCkgewotCQkJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJOSUMgTGluayBpcyBEb3duXG4iKTsKLQkJCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwotCQkJCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZXRkZXYpOworCQkJYWRhcHRlci0+bGlua19zcGVlZCA9CisJCQkJdnBlLT5ldmVudF9kYXRhLmxpbmtfZXZlbnQubGlua19zcGVlZDsKKwkJCWlmIChhZGFwdGVyLT5saW5rX3VwICE9CisJCQkgICAgdnBlLT5ldmVudF9kYXRhLmxpbmtfZXZlbnQubGlua19zdGF0dXMpIHsKKwkJCQlhZGFwdGVyLT5saW5rX3VwID0KKwkJCQkJdnBlLT5ldmVudF9kYXRhLmxpbmtfZXZlbnQubGlua19zdGF0dXM7CisJCQkJaWYgKGFkYXB0ZXItPmxpbmtfdXApIHsKKwkJCQkJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhuZXRkZXYpOworCQkJCQluZXRpZl9jYXJyaWVyX29uKG5ldGRldik7CisJCQkJfSBlbHNlIHsKKwkJCQkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5ldGRldik7CisJCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJCQkJfQorCQkJCWk0MGV2Zl9wcmludF9saW5rX21lc3NhZ2UoYWRhcHRlcik7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBJNDBFX1ZJUlRDSE5MX0VWRU5UX1JFU0VUX0lNUEVORElORzoKQEAgLTkzNyw4ICs5ODAsNiBAQAogCWNhc2UgSTQwRV9WSVJUQ0hOTF9PUF9FTkFCTEVfUVVFVUVTOgogCQkvKiBlbmFibGUgdHJhbnNtaXRzICovCiAJCWk0MGV2Zl9pcnFfZW5hYmxlKGFkYXB0ZXIsIHRydWUpOwotCQluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKGFkYXB0ZXItPm5ldGRldik7Ci0JCW5ldGlmX2NhcnJpZXJfb24oYWRhcHRlci0+bmV0ZGV2KTsKIAkJYnJlYWs7CiAJY2FzZSBJNDBFX1ZJUlRDSE5MX09QX0RJU0FCTEVfUVVFVUVTOgogCQlpNDBldmZfZnJlZV9hbGxfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwXzgyNTc1LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfODI1NzUuaAppbmRleCAxOTlmZjk4Li5hY2YwNjA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfODI1NzUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfODI1NzUuaApAQCAtMTg4LDYgKzE4OCwxMSBAQAogLyogRVRRRiByZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgRTEwMDBfRVRRRl9GSUxURVJfRU5BQkxFICAgQklUKDI2KQogI2RlZmluZSBFMTAwMF9FVFFGXzE1ODggICAgICAgICAgICBCSVQoMzApCisjZGVmaW5lIEUxMDAwX0VUUUZfSU1NX0lOVCAgICAgICAgIEJJVCgyOSkKKyNkZWZpbmUgRTEwMDBfRVRRRl9RVUVVRV9FTkFCTEUgICAgQklUKDMxKQorI2RlZmluZSBFMTAwMF9FVFFGX1FVRVVFX1NISUZUICAgICAxNgorI2RlZmluZSBFMTAwMF9FVFFGX1FVRVVFX01BU0sgICAgICAweDAwMDcwMDAwCisjZGVmaW5lIEUxMDAwX0VUUUZfRVRZUEVfTUFTSyAgICAgIDB4MDAwMEZGRkYKIAogLyogRlRRRiByZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgRTEwMDBfRlRRRl9WRl9CUCAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9kZWZpbmVzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfZGVmaW5lcy5oCmluZGV4IDI5OTdjNDQuLjI2ODgxODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9kZWZpbmVzLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX2RlZmluZXMuaApAQCAtMTAyNCw0ICsxMDI0LDggQEAKICNkZWZpbmUgRTEwMDBfUlRUQkNOUkNfUkZfSU5UX01BU0sJXAogCShFMTAwMF9SVFRCQ05SQ19SRl9ERUNfTUFTSyA8PCBFMTAwMF9SVFRCQ05SQ19SRl9JTlRfU0hJRlQpCiAKKyNkZWZpbmUgRTEwMDBfVkxBUFFGX1FVRVVFX1NFTChfbiwgcV9pZHgpIChxX2lkeCA8PCAoKF9uKSAqIDQpKQorI2RlZmluZSBFMTAwMF9WTEFQUUZfUF9WQUxJRChfbikJKDB4MSA8PCAoMyArIChfbikgKiA0KSkKKyNkZWZpbmUgRTEwMDBfVkxBUFFGX1FVRVVFX01BU0sJMHgwMworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9yZWdzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfcmVncy5oCmluZGV4IDIxZDlkMDIuLmQ4NGFmZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9yZWdzLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX3JlZ3MuaApAQCAtMzA5LDYgKzMwOSw3IEBACiAJCQkJCSgweDA1NEUwICsgKChfaSAtIDE2KSAqIDgpKSkKICNkZWZpbmUgRTEwMDBfUkFIKF9pKSAgKCgoX2kpIDw9IDE1KSA/ICgweDA1NDA0ICsgKChfaSkgKiA4KSkgOiBcCiAJCQkJCSgweDA1NEU0ICsgKChfaSAtIDE2KSAqIDgpKSkKKyNkZWZpbmUgRTEwMDBfVkxBUFFGCTB4MDU1QjAgIC8qIFZMQU4gUHJpb3JpdHkgUXVldWUgRmlsdGVyIFZMQVBRRiAqLwogI2RlZmluZSBFMTAwMF9JUDRBVF9SRUcoX2kpICAgICAoMHgwNTg0MCArICgoX2kpICogOCkpCiAjZGVmaW5lIEUxMDAwX0lQNkFUX1JFRyhfaSkgICAgICgweDA1ODgwICsgKChfaSkgKiA0KSkKICNkZWZpbmUgRTEwMDBfV1VQTV9SRUcoX2kpICAgICAgKDB4MDVBMDAgKyAoKF9pKSAqIDQpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYi5oCmluZGV4IDUzODdiM2EuLmQxMTA5M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2IuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiLmgKQEAgLTM1MCwxMSArMzUwLDQ5IEBACiAJfTsKICNlbmRpZgogCisvKiBUaGUgbnVtYmVyIG9mIEwyIGV0aGVyLXR5cGUgZmlsdGVyIHJlZ2lzdGVycywgSW5kZXggMyBpcyByZXNlcnZlZAorICogZm9yIFBUUCAxNTg4IHRpbWVzdGFtcAorICovCisjZGVmaW5lIE1BWF9FVFlQRV9GSUxURVIJKDQgLSAxKQorLyogRVRRRiBmaWx0ZXIgbGlzdDogb25lIHN0YXRpYyBmaWx0ZXIgcGVyIGZpbHRlciBjb25zdW1lci4gVGhpcyBpcworICogdG8gYXZvaWQgZmlsdGVyIGNvbGxpc2lvbnMgbGF0ZXIuIEFkZCBuZXcgZmlsdGVycyBoZXJlISEKKyAqCisgKiBDdXJyZW50IGZpbHRlcnM6CQlGaWx0ZXIgMworICovCisjZGVmaW5lIElHQl9FVFFGX0ZJTFRFUl8xNTg4CTMKKwogI2RlZmluZSBJR0JfTl9FWFRUUwkyCiAjZGVmaW5lIElHQl9OX1BFUk9VVAkyCiAjZGVmaW5lIElHQl9OX1NEUAk0CiAjZGVmaW5lIElHQl9SRVRBX1NJWkUJMTI4CiAKK2VudW0gaWdiX2ZpbHRlcl9tYXRjaF9mbGFncyB7CisJSUdCX0ZJTFRFUl9GTEFHX0VUSEVSX1RZUEUgPSAweDEsCisJSUdCX0ZJTFRFUl9GTEFHX1ZMQU5fVENJICAgPSAweDIsCit9OworCisjZGVmaW5lIElHQl9NQVhfUlhORkNfRklMVEVSUyAxNgorCisvKiBSWCBuZXR3b3JrIGZsb3cgY2xhc3NpZmljYXRpb24gZGF0YSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBpZ2JfbmZjX2lucHV0IHsKKwkvKiBCeXRlIGxheW91dCBpbiBvcmRlciwgYWxsIHZhbHVlcyB3aXRoIE1TQiBmaXJzdDoKKwkgKiBtYXRjaF9mbGFncyAtIDEgYnl0ZQorCSAqIGV0eXBlIC0gMiBieXRlcworCSAqIHZsYW5fdGNpIC0gMiBieXRlcworCSAqLworCXU4IG1hdGNoX2ZsYWdzOworCV9fYmUxNiBldHlwZTsKKwlfX2JlMTYgdmxhbl90Y2k7Cit9OworCitzdHJ1Y3QgaWdiX25mY19maWx0ZXIgeworCXN0cnVjdCBobGlzdF9ub2RlIG5mY19ub2RlOworCXN0cnVjdCBpZ2JfbmZjX2lucHV0IGZpbHRlcjsKKwl1MTYgZXR5cGVfcmVnX2luZGV4OworCXUxNiBzd19pZHg7CisJdTE2IGFjdGlvbjsKK307CisKIC8qIGJvYXJkIHNwZWNpZmljIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KIHN0cnVjdCBpZ2JfYWRhcHRlciB7CiAJdW5zaWduZWQgbG9uZyBhY3RpdmVfdmxhbnNbQklUU19UT19MT05HUyhWTEFOX05fVklEKV07CkBAIC00NTEsNiArNDg5LDcgQEAKIAlzdHJ1Y3QgdGltZWNvdW50ZXIgdGM7CiAJdTMyIHR4X2h3dHN0YW1wX3RpbWVvdXRzOwogCXUzMiByeF9od3RzdGFtcF9jbGVhcmVkOworCWJvb2wgcHBzX3N5c193cmFwX29uOwogCiAJc3RydWN0IHB0cF9waW5fZGVzYyBzZHBfY29uZmlnW0lHQl9OX1NEUF07CiAJc3RydWN0IHsKQEAgLTQ3Myw2ICs1MTIsMTMgQEAKIAlpbnQgY29wcGVyX3RyaWVzOwogCXN0cnVjdCBlMTAwMF9pbmZvIGVpOwogCXUxNiBlZWVfYWR2ZXJ0OworCisJLyogUlggbmV0d29yayBmbG93IGNsYXNzaWZpY2F0aW9uIHN1cHBvcnQgKi8KKwlzdHJ1Y3QgaGxpc3RfaGVhZCBuZmNfZmlsdGVyX2xpc3Q7CisJdW5zaWduZWQgaW50IG5mY19maWx0ZXJfY291bnQ7CisJLyogbG9jayBmb3IgUlggbmV0d29yayBmbG93IGNsYXNzaWZpY2F0aW9uIGZpbHRlciAqLworCXNwaW5sb2NrX3QgbmZjX2xvY2s7CisJYm9vbCBldHlwZV9iaXRtYXBbTUFYX0VUWVBFX0ZJTFRFUl07CiB9OwogCiAvKiBmbGFncyBjb250cm9sbGluZyBQVFAvMTU4OCBmdW5jdGlvbiAqLwpAQCAtNTk5LDQgKzY0NSw5IEBACiAJcmV0dXJuIG5ldGRldl9nZXRfdHhfcXVldWUodHhfcmluZy0+bmV0ZGV2LCB0eF9yaW5nLT5xdWV1ZV9pbmRleCk7CiB9CiAKK2ludCBpZ2JfYWRkX2ZpbHRlcihzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCSAgIHN0cnVjdCBpZ2JfbmZjX2ZpbHRlciAqaW5wdXQpOworaW50IGlnYl9lcmFzZV9maWx0ZXIoc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyLAorCQkgICAgIHN0cnVjdCBpZ2JfbmZjX2ZpbHRlciAqaW5wdXQpOworCiAjZW5kaWYgLyogX0lHQl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX2V0aHRvb2wuYwppbmRleCA2NGU5MWM1Li43MzdiNjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX2V0aHRvb2wuYwpAQCAtMjQzMSw2ICsyNDMxLDYzIEBACiAJfQogfQogCisjZGVmaW5lIEVUSEVSX1RZUEVfRlVMTF9NQVNLICgoX19mb3JjZSBfX2JlMTYpfjApCitzdGF0aWMgaW50IGlnYl9nZXRfZXRodG9vbF9uZmNfZW50cnkoc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgICAgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCkKK3sKKwlzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgKmZzcCA9ICZjbWQtPmZzOworCXN0cnVjdCBpZ2JfbmZjX2ZpbHRlciAqcnVsZSA9IE5VTEw7CisKKwkvKiByZXBvcnQgdG90YWwgcnVsZSBjb3VudCAqLworCWNtZC0+ZGF0YSA9IElHQl9NQVhfUlhORkNfRklMVEVSUzsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJ1bGUsICZhZGFwdGVyLT5uZmNfZmlsdGVyX2xpc3QsIG5mY19ub2RlKSB7CisJCWlmIChmc3AtPmxvY2F0aW9uIDw9IHJ1bGUtPnN3X2lkeCkKKwkJCWJyZWFrOworCX0KKworCWlmICghcnVsZSB8fCBmc3AtPmxvY2F0aW9uICE9IHJ1bGUtPnN3X2lkeCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocnVsZS0+ZmlsdGVyLm1hdGNoX2ZsYWdzKSB7CisJCWZzcC0+Zmxvd190eXBlID0gRVRIRVJfRkxPVzsKKwkJZnNwLT5yaW5nX2Nvb2tpZSA9IHJ1bGUtPmFjdGlvbjsKKwkJaWYgKHJ1bGUtPmZpbHRlci5tYXRjaF9mbGFncyAmIElHQl9GSUxURVJfRkxBR19FVEhFUl9UWVBFKSB7CisJCQlmc3AtPmhfdS5ldGhlcl9zcGVjLmhfcHJvdG8gPSBydWxlLT5maWx0ZXIuZXR5cGU7CisJCQlmc3AtPm1fdS5ldGhlcl9zcGVjLmhfcHJvdG8gPSBFVEhFUl9UWVBFX0ZVTExfTUFTSzsKKwkJfQorCQlpZiAocnVsZS0+ZmlsdGVyLm1hdGNoX2ZsYWdzICYgSUdCX0ZJTFRFUl9GTEFHX1ZMQU5fVENJKSB7CisJCQlmc3AtPmZsb3dfdHlwZSB8PSBGTE9XX0VYVDsKKwkJCWZzcC0+aF9leHQudmxhbl90Y2kgPSBydWxlLT5maWx0ZXIudmxhbl90Y2k7CisJCQlmc3AtPm1fZXh0LnZsYW5fdGNpID0gaHRvbnMoVkxBTl9QUklPX01BU0spOworCQl9CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBpZ2JfZ2V0X2V0aHRvb2xfbmZjX2FsbChzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICAgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCwKKwkJCQkgICB1MzIgKnJ1bGVfbG9jcykKK3sKKwlzdHJ1Y3QgaWdiX25mY19maWx0ZXIgKnJ1bGU7CisJaW50IGNudCA9IDA7CisKKwkvKiByZXBvcnQgdG90YWwgcnVsZSBjb3VudCAqLworCWNtZC0+ZGF0YSA9IElHQl9NQVhfUlhORkNfRklMVEVSUzsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJ1bGUsICZhZGFwdGVyLT5uZmNfZmlsdGVyX2xpc3QsIG5mY19ub2RlKSB7CisJCWlmIChjbnQgPT0gY21kLT5ydWxlX2NudCkKKwkJCXJldHVybiAtRU1TR1NJWkU7CisJCXJ1bGVfbG9jc1tjbnRdID0gcnVsZS0+c3dfaWR4OworCQljbnQrKzsKKwl9CisKKwljbWQtPnJ1bGVfY250ID0gY250OworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgaWdiX2dldF9yc3NfaGFzaF9vcHRzKHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciwKIAkJCQkgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCkKIHsKQEAgLTI0ODQsNiArMjU0MSwxNiBAQAogCQljbWQtPmRhdGEgPSBhZGFwdGVyLT5udW1fcnhfcXVldWVzOwogCQlyZXQgPSAwOwogCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1JYQ0xTUkxDTlQ6CisJCWNtZC0+cnVsZV9jbnQgPSBhZGFwdGVyLT5uZmNfZmlsdGVyX2NvdW50OworCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1JYQ0xTUlVMRToKKwkJcmV0ID0gaWdiX2dldF9ldGh0b29sX25mY19lbnRyeShhZGFwdGVyLCBjbWQpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1JYQ0xTUkxBTEw6CisJCXJldCA9IGlnYl9nZXRfZXRodG9vbF9uZmNfYWxsKGFkYXB0ZXIsIGNtZCwgcnVsZV9sb2NzKTsKKwkJYnJlYWs7CiAJY2FzZSBFVEhUT09MX0dSWEZIOgogCQlyZXQgPSBpZ2JfZ2V0X3Jzc19oYXNoX29wdHMoYWRhcHRlciwgY21kKTsKIAkJYnJlYWs7CkBAIC0yNTk4LDYgKzI2NjUsMjc5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaWdiX3J4bmZjX3dyaXRlX2V0eXBlX2ZpbHRlcihzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCXN0cnVjdCBpZ2JfbmZjX2ZpbHRlciAqaW5wdXQpCit7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1OCBpOworCXUzMiBldHFmOworCXUxNiBldHlwZTsKKworCS8qIGZpbmQgYW4gZW1wdHkgZXR5cGUgZmlsdGVyIHJlZ2lzdGVyICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9FVFlQRV9GSUxURVI7ICsraSkgeworCQlpZiAoIWFkYXB0ZXItPmV0eXBlX2JpdG1hcFtpXSkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBNQVhfRVRZUEVfRklMVEVSKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgImV0aHRvb2wgLU46IGV0eXBlIGZpbHRlcnMgYXJlIGFsbCB1c2VkLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFkYXB0ZXItPmV0eXBlX2JpdG1hcFtpXSA9IHRydWU7CisKKwlldHFmID0gcmQzMihFMTAwMF9FVFFGKGkpKTsKKwlldHlwZSA9IG50b2hzKGlucHV0LT5maWx0ZXIuZXR5cGUgJiBFVEhFUl9UWVBFX0ZVTExfTUFTSyk7CisKKwlldHFmIHw9IEUxMDAwX0VUUUZfRklMVEVSX0VOQUJMRTsKKwlldHFmICY9IH5FMTAwMF9FVFFGX0VUWVBFX01BU0s7CisJZXRxZiB8PSAoZXR5cGUgJiBFMTAwMF9FVFFGX0VUWVBFX01BU0spOworCisJZXRxZiAmPSB+RTEwMDBfRVRRRl9RVUVVRV9NQVNLOworCWV0cWYgfD0gKChpbnB1dC0+YWN0aW9uIDw8IEUxMDAwX0VUUUZfUVVFVUVfU0hJRlQpCisJCSYgRTEwMDBfRVRRRl9RVUVVRV9NQVNLKTsKKwlldHFmIHw9IEUxMDAwX0VUUUZfUVVFVUVfRU5BQkxFOworCisJd3IzMihFMTAwMF9FVFFGKGkpLCBldHFmKTsKKworCWlucHV0LT5ldHlwZV9yZWdfaW5kZXggPSBpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWdiX3J4bmZjX3dyaXRlX3ZsYW5fcHJpb19maWx0ZXIoc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyLAorCQkJCQkgICAgc3RydWN0IGlnYl9uZmNfZmlsdGVyICppbnB1dCkKK3sKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXU4IHZsYW5fcHJpb3JpdHk7CisJdTE2IHF1ZXVlX2luZGV4OworCXUzMiB2bGFwcWY7CisKKwl2bGFwcWYgPSByZDMyKEUxMDAwX1ZMQVBRRik7CisJdmxhbl9wcmlvcml0eSA9IChudG9ocyhpbnB1dC0+ZmlsdGVyLnZsYW5fdGNpKSAmIFZMQU5fUFJJT19NQVNLKQorCQkJCT4+IFZMQU5fUFJJT19TSElGVDsKKwlxdWV1ZV9pbmRleCA9ICh2bGFwcWYgPj4gKHZsYW5fcHJpb3JpdHkgKiA0KSkgJiBFMTAwMF9WTEFQUUZfUVVFVUVfTUFTSzsKKworCS8qIGNoZWNrIHdoZXRoZXIgdGhpcyB2bGFuIHByaW8gaXMgYWxyZWFkeSBzZXQgKi8KKwlpZiAoKHZsYXBxZiAmIEUxMDAwX1ZMQVBRRl9QX1ZBTElEKHZsYW5fcHJpb3JpdHkpKSAmJgorCSAgICAocXVldWVfaW5kZXggIT0gaW5wdXQtPmFjdGlvbikpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiZXRodG9vbCByeG5mYyBzZXQgdmxhbiBwcmlvIGZpbHRlciBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJdmxhcHFmIHw9IEUxMDAwX1ZMQVBRRl9QX1ZBTElEKHZsYW5fcHJpb3JpdHkpOworCXZsYXBxZiB8PSBFMTAwMF9WTEFQUUZfUVVFVUVfU0VMKHZsYW5fcHJpb3JpdHksIGlucHV0LT5hY3Rpb24pOworCisJd3IzMihFMTAwMF9WTEFQUUYsIHZsYXBxZik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGlnYl9hZGRfZmlsdGVyKHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGlnYl9uZmNfZmlsdGVyICppbnB1dCkKK3sKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCWlmIChpbnB1dC0+ZmlsdGVyLm1hdGNoX2ZsYWdzICYgSUdCX0ZJTFRFUl9GTEFHX0VUSEVSX1RZUEUpIHsKKwkJZXJyID0gaWdiX3J4bmZjX3dyaXRlX2V0eXBlX2ZpbHRlcihhZGFwdGVyLCBpbnB1dCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChpbnB1dC0+ZmlsdGVyLm1hdGNoX2ZsYWdzICYgSUdCX0ZJTFRFUl9GTEFHX1ZMQU5fVENJKQorCQllcnIgPSBpZ2JfcnhuZmNfd3JpdGVfdmxhbl9wcmlvX2ZpbHRlcihhZGFwdGVyLCBpbnB1dCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBpZ2JfY2xlYXJfZXR5cGVfZmlsdGVyX3JlZ3Moc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyLAorCQkJCQl1MTYgcmVnX2luZGV4KQoreworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdTMyIGV0cWYgPSByZDMyKEUxMDAwX0VUUUYocmVnX2luZGV4KSk7CisKKwlldHFmICY9IH5FMTAwMF9FVFFGX1FVRVVFX0VOQUJMRTsKKwlldHFmICY9IH5FMTAwMF9FVFFGX1FVRVVFX01BU0s7CisJZXRxZiAmPSB+RTEwMDBfRVRRRl9GSUxURVJfRU5BQkxFOworCisJd3IzMihFMTAwMF9FVFFGKHJlZ19pbmRleCksIGV0cWYpOworCisJYWRhcHRlci0+ZXR5cGVfYml0bWFwW3JlZ19pbmRleF0gPSBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgaWdiX2NsZWFyX3ZsYW5fcHJpb19maWx0ZXIoc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgICAgICB1MTYgdmxhbl90Y2kpCit7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1OCB2bGFuX3ByaW9yaXR5OworCXUzMiB2bGFwcWY7CisKKwl2bGFuX3ByaW9yaXR5ID0gKHZsYW5fdGNpICYgVkxBTl9QUklPX01BU0spID4+IFZMQU5fUFJJT19TSElGVDsKKworCXZsYXBxZiA9IHJkMzIoRTEwMDBfVkxBUFFGKTsKKwl2bGFwcWYgJj0gfkUxMDAwX1ZMQVBRRl9QX1ZBTElEKHZsYW5fcHJpb3JpdHkpOworCXZsYXBxZiAmPSB+RTEwMDBfVkxBUFFGX1FVRVVFX1NFTCh2bGFuX3ByaW9yaXR5LAorCQkJCQkJRTEwMDBfVkxBUFFGX1FVRVVFX01BU0spOworCisJd3IzMihFMTAwMF9WTEFQUUYsIHZsYXBxZik7Cit9CisKK2ludCBpZ2JfZXJhc2VfZmlsdGVyKHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGlnYl9uZmNfZmlsdGVyICppbnB1dCkKK3sKKwlpZiAoaW5wdXQtPmZpbHRlci5tYXRjaF9mbGFncyAmIElHQl9GSUxURVJfRkxBR19FVEhFUl9UWVBFKQorCQlpZ2JfY2xlYXJfZXR5cGVfZmlsdGVyX3JlZ3MoYWRhcHRlciwKKwkJCQkJICAgIGlucHV0LT5ldHlwZV9yZWdfaW5kZXgpOworCisJaWYgKGlucHV0LT5maWx0ZXIubWF0Y2hfZmxhZ3MgJiBJR0JfRklMVEVSX0ZMQUdfVkxBTl9UQ0kpCisJCWlnYl9jbGVhcl92bGFuX3ByaW9fZmlsdGVyKGFkYXB0ZXIsCisJCQkJCSAgIG50b2hzKGlucHV0LT5maWx0ZXIudmxhbl90Y2kpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlnYl91cGRhdGVfZXRodG9vbF9uZmNfZW50cnkoc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyLAorCQkJCQlzdHJ1Y3QgaWdiX25mY19maWx0ZXIgKmlucHV0LAorCQkJCQl1MTYgc3dfaWR4KQoreworCXN0cnVjdCBpZ2JfbmZjX2ZpbHRlciAqcnVsZSwgKnBhcmVudDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCXBhcmVudCA9IE5VTEw7CisJcnVsZSA9IE5VTEw7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShydWxlLCAmYWRhcHRlci0+bmZjX2ZpbHRlcl9saXN0LCBuZmNfbm9kZSkgeworCQkvKiBoYXNoIGZvdW5kLCBvciBubyBtYXRjaGluZyBlbnRyeSAqLworCQlpZiAocnVsZS0+c3dfaWR4ID49IHN3X2lkeCkKKwkJCWJyZWFrOworCQlwYXJlbnQgPSBydWxlOworCX0KKworCS8qIGlmIHRoZXJlIGlzIGFuIG9sZCBydWxlIG9jY3VweWluZyBvdXIgcGxhY2UgcmVtb3ZlIGl0ICovCisJaWYgKHJ1bGUgJiYgKHJ1bGUtPnN3X2lkeCA9PSBzd19pZHgpKSB7CisJCWlmICghaW5wdXQpCisJCQllcnIgPSBpZ2JfZXJhc2VfZmlsdGVyKGFkYXB0ZXIsIHJ1bGUpOworCisJCWhsaXN0X2RlbCgmcnVsZS0+bmZjX25vZGUpOworCQlrZnJlZShydWxlKTsKKwkJYWRhcHRlci0+bmZjX2ZpbHRlcl9jb3VudC0tOworCX0KKworCS8qIElmIG5vIGlucHV0IHRoaXMgd2FzIGEgZGVsZXRlLCBlcnIgc2hvdWxkIGJlIDAgaWYgYSBydWxlIHdhcworCSAqIHN1Y2Nlc3NmdWxseSBmb3VuZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IGVsc2UgLUVJTlZBTAorCSAqLworCWlmICghaW5wdXQpCisJCXJldHVybiBlcnI7CisKKwkvKiBpbml0aWFsaXplIG5vZGUgKi8KKwlJTklUX0hMSVNUX05PREUoJmlucHV0LT5uZmNfbm9kZSk7CisKKwkvKiBhZGQgZmlsdGVyIHRvIHRoZSBsaXN0ICovCisJaWYgKHBhcmVudCkKKwkJaGxpc3RfYWRkX2JlaGluZCgmcGFyZW50LT5uZmNfbm9kZSwgJmlucHV0LT5uZmNfbm9kZSk7CisJZWxzZQorCQlobGlzdF9hZGRfaGVhZCgmaW5wdXQtPm5mY19ub2RlLCAmYWRhcHRlci0+bmZjX2ZpbHRlcl9saXN0KTsKKworCS8qIHVwZGF0ZSBjb3VudHMgKi8KKwlhZGFwdGVyLT5uZmNfZmlsdGVyX2NvdW50Kys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZ2JfYWRkX2V0aHRvb2xfbmZjX2VudHJ5KHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgICAgIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgKmZzcCA9CisJCShzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgKikmY21kLT5mczsKKwlzdHJ1Y3QgaWdiX25mY19maWx0ZXIgKmlucHV0LCAqcnVsZTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghKG5ldGRldi0+aHdfZmVhdHVyZXMgJiBORVRJRl9GX05UVVBMRSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIERvbid0IGFsbG93IHByb2dyYW1taW5nIGlmIHRoZSBhY3Rpb24gaXMgYSBxdWV1ZSBncmVhdGVyIHRoYW4KKwkgKiB0aGUgbnVtYmVyIG9mIG9ubGluZSBSeCBxdWV1ZXMuCisJICovCisJaWYgKChmc3AtPnJpbmdfY29va2llID09IFJYX0NMU19GTE9XX0RJU0MpIHx8CisJICAgIChmc3AtPnJpbmdfY29va2llID49IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMpKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgImV0aHRvb2wgLU46IFRoZSBzcGVjaWZpZWQgYWN0aW9uIGlzIGludmFsaWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBEb24ndCBhbGxvdyBpbmRleGVzIHRvIGV4aXN0IG91dHNpZGUgb2YgYXZhaWxhYmxlIHNwYWNlICovCisJaWYgKGZzcC0+bG9jYXRpb24gPj0gSUdCX01BWF9SWE5GQ19GSUxURVJTKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIkxvY2F0aW9uIG91dCBvZiByYW5nZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgoZnNwLT5mbG93X3R5cGUgJiB+RkxPV19FWFQpICE9IEVUSEVSX0ZMT1cpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGZzcC0+bV91LmV0aGVyX3NwZWMuaF9wcm90byAhPSBFVEhFUl9UWVBFX0ZVTExfTUFTSyAmJgorCSAgICBmc3AtPm1fZXh0LnZsYW5fdGNpICE9IGh0b25zKFZMQU5fUFJJT19NQVNLKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpbnB1dCA9IGt6YWxsb2Moc2l6ZW9mKCppbnB1dCksIEdGUF9LRVJORUwpOworCWlmICghaW5wdXQpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGZzcC0+bV91LmV0aGVyX3NwZWMuaF9wcm90byA9PSBFVEhFUl9UWVBFX0ZVTExfTUFTSykgeworCQlpbnB1dC0+ZmlsdGVyLmV0eXBlID0gZnNwLT5oX3UuZXRoZXJfc3BlYy5oX3Byb3RvOworCQlpbnB1dC0+ZmlsdGVyLm1hdGNoX2ZsYWdzID0gSUdCX0ZJTFRFUl9GTEFHX0VUSEVSX1RZUEU7CisJfQorCisJaWYgKChmc3AtPmZsb3dfdHlwZSAmIEZMT1dfRVhUKSAmJiBmc3AtPm1fZXh0LnZsYW5fdGNpKSB7CisJCWlmIChmc3AtPm1fZXh0LnZsYW5fdGNpICE9IGh0b25zKFZMQU5fUFJJT19NQVNLKSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQlpbnB1dC0+ZmlsdGVyLnZsYW5fdGNpID0gZnNwLT5oX2V4dC52bGFuX3RjaTsKKwkJaW5wdXQtPmZpbHRlci5tYXRjaF9mbGFncyB8PSBJR0JfRklMVEVSX0ZMQUdfVkxBTl9UQ0k7CisJfQorCisJaW5wdXQtPmFjdGlvbiA9IGZzcC0+cmluZ19jb29raWU7CisJaW5wdXQtPnN3X2lkeCA9IGZzcC0+bG9jYXRpb247CisKKwlzcGluX2xvY2soJmFkYXB0ZXItPm5mY19sb2NrKTsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJ1bGUsICZhZGFwdGVyLT5uZmNfZmlsdGVyX2xpc3QsIG5mY19ub2RlKSB7CisJCWlmICghbWVtY21wKCZpbnB1dC0+ZmlsdGVyLCAmcnVsZS0+ZmlsdGVyLAorCQkJICAgIHNpemVvZihpbnB1dC0+ZmlsdGVyKSkpIHsKKwkJCWVyciA9IC1FRVhJU1Q7CisJCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJImV0aHRvb2w6IHRoaXMgZmlsdGVyIGlzIGFscmVhZHkgc2V0XG4iKTsKKwkJCWdvdG8gZXJyX291dF93X2xvY2s7CisJCX0KKwl9CisKKwllcnIgPSBpZ2JfYWRkX2ZpbHRlcihhZGFwdGVyLCBpbnB1dCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X3dfbG9jazsKKworCWlnYl91cGRhdGVfZXRodG9vbF9uZmNfZW50cnkoYWRhcHRlciwgaW5wdXQsIGlucHV0LT5zd19pZHgpOworCisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPm5mY19sb2NrKTsKKwlyZXR1cm4gMDsKKworZXJyX291dF93X2xvY2s6CisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPm5mY19sb2NrKTsKK2Vycl9vdXQ6CisJa2ZyZWUoaW5wdXQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaWdiX2RlbF9ldGh0b29sX25mY19lbnRyeShzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqY21kKQoreworCXN0cnVjdCBldGh0b29sX3J4X2Zsb3dfc3BlYyAqZnNwID0KKwkJKHN0cnVjdCBldGh0b29sX3J4X2Zsb3dfc3BlYyAqKSZjbWQtPmZzOworCWludCBlcnI7CisKKwlzcGluX2xvY2soJmFkYXB0ZXItPm5mY19sb2NrKTsKKwllcnIgPSBpZ2JfdXBkYXRlX2V0aHRvb2xfbmZjX2VudHJ5KGFkYXB0ZXIsIE5VTEwsIGZzcC0+bG9jYXRpb24pOworCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5uZmNfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgaW50IGlnYl9zZXRfcnhuZmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCkKIHsKIAlzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMjYwNyw2ICsyOTQ3LDExIEBACiAJY2FzZSBFVEhUT09MX1NSWEZIOgogCQlyZXQgPSBpZ2Jfc2V0X3Jzc19oYXNoX29wdChhZGFwdGVyLCBjbWQpOwogCQlicmVhazsKKwljYXNlIEVUSFRPT0xfU1JYQ0xTUkxJTlM6CisJCXJldCA9IGlnYl9hZGRfZXRodG9vbF9uZmNfZW50cnkoYWRhcHRlciwgY21kKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX1NSWENMU1JMREVMOgorCQlyZXQgPSBpZ2JfZGVsX2V0aHRvb2xfbmZjX2VudHJ5KGFkYXB0ZXIsIGNtZCk7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX21haW4uYwppbmRleCA5NDJhODlmLi5lZGM5YTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX21haW4uYwpAQCAtNTgsNyArNTgsNyBAQAogI2luY2x1ZGUgImlnYi5oIgogCiAjZGVmaW5lIE1BSiA1Ci0jZGVmaW5lIE1JTiAzCisjZGVmaW5lIE1JTiA0CiAjZGVmaW5lIEJVSUxEIDAKICNkZWZpbmUgRFJWX1ZFUlNJT04gX19zdHJpbmdpZnkoTUFKKSAiLiIgX19zdHJpbmdpZnkoTUlOKSAiLiIgXAogX19zdHJpbmdpZnkoQlVJTEQpICItayIKQEAgLTE2OSwxMyArMTY5LDE1IEBACiBzdGF0aWMgdm9pZCBpZ2JfcmVzdG9yZV92Zl9tdWx0aWNhc3RzKHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlcik7CiBzdGF0aWMgaW50IGlnYl9uZG9fc2V0X3ZmX21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsIHU4ICptYWMpOwogc3RhdGljIGludCBpZ2JfbmRvX3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkgICAgICAgaW50IHZmLCB1MTYgdmxhbiwgdTggcW9zKTsKKwkJCSAgICAgICBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MsIF9fYmUxNiB2bGFuX3Byb3RvKTsKIHN0YXRpYyBpbnQgaWdiX25kb19zZXRfdmZfYncoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50LCBpbnQsIGludCk7CiBzdGF0aWMgaW50IGlnYl9uZG9fc2V0X3ZmX3Nwb29mY2hrKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2ZiwKIAkJCQkgICBib29sIHNldHRpbmcpOwogc3RhdGljIGludCBpZ2JfbmRvX2dldF92Zl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLAogCQkJCSBzdHJ1Y3QgaWZsYV92Zl9pbmZvICppdmkpOwogc3RhdGljIHZvaWQgaWdiX2NoZWNrX3ZmX3JhdGVfbGltaXQoc3RydWN0IGlnYl9hZGFwdGVyICopOworc3RhdGljIHZvaWQgaWdiX25mY19maWx0ZXJfZXhpdChzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgaWdiX25mY19maWx0ZXJfcmVzdG9yZShzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIpOwogCiAjaWZkZWYgQ09ORklHX1BDSV9JT1YKIHN0YXRpYyBpbnQgaWdiX3ZmX2NvbmZpZ3VyZShzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCB2Zik7CkBAIC0xNjExLDYgKzE2MTMsNyBAQAogCWlnYl9zZXR1cF9tcnFjKGFkYXB0ZXIpOwogCWlnYl9zZXR1cF9yY3RsKGFkYXB0ZXIpOwogCisJaWdiX25mY19maWx0ZXJfcmVzdG9yZShhZGFwdGVyKTsKIAlpZ2JfY29uZmlndXJlX3R4KGFkYXB0ZXIpOwogCWlnYl9jb25maWd1cmVfcngoYWRhcHRlcik7CiAKQEAgLTIwNTksNiArMjA2MiwyMSBAQAogCWlmICghKGNoYW5nZWQgJiAoTkVUSUZfRl9SWEFMTCB8IE5FVElGX0ZfTlRVUExFKSkpCiAJCXJldHVybiAwOwogCisJaWYgKCEoZmVhdHVyZXMgJiBORVRJRl9GX05UVVBMRSkpIHsKKwkJc3RydWN0IGhsaXN0X25vZGUgKm5vZGUyOworCQlzdHJ1Y3QgaWdiX25mY19maWx0ZXIgKnJ1bGU7CisKKwkJc3Bpbl9sb2NrKCZhZGFwdGVyLT5uZmNfbG9jayk7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocnVsZSwgbm9kZTIsCisJCQkJCSAgJmFkYXB0ZXItPm5mY19maWx0ZXJfbGlzdCwgbmZjX25vZGUpIHsKKwkJCWlnYl9lcmFzZV9maWx0ZXIoYWRhcHRlciwgcnVsZSk7CisJCQlobGlzdF9kZWwoJnJ1bGUtPm5mY19ub2RlKTsKKwkJCWtmcmVlKHJ1bGUpOworCQl9CisJCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5uZmNfbG9jayk7CisJCWFkYXB0ZXItPm5mY19maWx0ZXJfY291bnQgPSAwOworCX0KKwogCW5ldGRldi0+ZmVhdHVyZXMgPSBmZWF0dXJlczsKIAogCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCkBAIC0zMDUzLDYgKzMwNzEsNyBAQAogCQkJCSAgVkxBTl9ITEVOOwogCWFkYXB0ZXItPm1pbl9mcmFtZV9zaXplID0gRVRIX1pMRU4gKyBFVEhfRkNTX0xFTjsKIAorCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5uZmNfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnN0YXRzNjRfbG9jayk7CiAjaWZkZWYgQ09ORklHX1BDSV9JT1YKIAlzd2l0Y2ggKGh3LT5tYWMudHlwZSkgewpAQCAtMzI0MCw2ICszMjU5LDggQEAKIAlpZ2JfZG93bihhZGFwdGVyKTsKIAlpZ2JfZnJlZV9pcnEoYWRhcHRlcik7CiAKKwlpZ2JfbmZjX2ZpbHRlcl9leGl0KGFkYXB0ZXIpOworCiAJaWdiX2ZyZWVfYWxsX3R4X3Jlc291cmNlcyhhZGFwdGVyKTsKIAlpZ2JfZnJlZV9hbGxfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOwogCkBAIC02MjAxLDE0ICs2MjIyLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaWdiX25kb19zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJICAgICAgIGludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcykKK3N0YXRpYyBpbnQgaWdiX25kb19zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsCisJCQkgICAgICAgdTE2IHZsYW4sIHU4IHFvcywgX19iZTE2IHZsYW5fcHJvdG8pCiB7CiAJc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAogCWlmICgodmYgPj0gYWRhcHRlci0+dmZzX2FsbG9jYXRlZF9jb3VudCkgfHwgKHZsYW4gPiA0MDk1KSB8fCAocW9zID4gNykpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKHZsYW5fcHJvdG8gIT0gaHRvbnMoRVRIX1BfODAyMVEpKQorCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKKwogCXJldHVybiAodmxhbiB8fCBxb3MpID8gaWdiX2VuYWJsZV9wb3J0X3ZsYW4oYWRhcHRlciwgdmYsIHZsYW4sIHFvcykgOgogCQkJICAgICAgIGlnYl9kaXNhYmxlX3BvcnRfdmxhbihhZGFwdGVyLCB2Zik7CiB9CkBAIC04MzA2LDQgKzgzMzAsMjggQEAKIAogCXJldHVybiBlcnI7CiB9CisKK3N0YXRpYyB2b2lkIGlnYl9uZmNfZmlsdGVyX2V4aXQoc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBpZ2JfbmZjX2ZpbHRlciAqcnVsZTsKKworCXNwaW5fbG9jaygmYWRhcHRlci0+bmZjX2xvY2spOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnkocnVsZSwgJmFkYXB0ZXItPm5mY19maWx0ZXJfbGlzdCwgbmZjX25vZGUpCisJCWlnYl9lcmFzZV9maWx0ZXIoYWRhcHRlciwgcnVsZSk7CisKKwlzcGluX3VubG9jaygmYWRhcHRlci0+bmZjX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBpZ2JfbmZjX2ZpbHRlcl9yZXN0b3JlKHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaWdiX25mY19maWx0ZXIgKnJ1bGU7CisKKwlzcGluX2xvY2soJmFkYXB0ZXItPm5mY19sb2NrKTsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJ1bGUsICZhZGFwdGVyLT5uZmNfZmlsdGVyX2xpc3QsIG5mY19ub2RlKQorCQlpZ2JfYWRkX2ZpbHRlcihhZGFwdGVyLCBydWxlKTsKKworCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5uZmNfbG9jayk7Cit9CiAvKiBpZ2JfbWFpbi5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX3B0cC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9wdHAuYwppbmRleCBlNjFiNjQ3Li5hNzg5NWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX3B0cC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2JfcHRwLmMKQEAgLTU5MSw2ICs1OTEsNyBAQAogCQkJdHNpbSB8PSBUU0lOVFJfU1lTX1dSQVA7CiAJCWVsc2UKIAkJCXRzaW0gJj0gflRTSU5UUl9TWVNfV1JBUDsKKwkJaWdiLT5wcHNfc3lzX3dyYXBfb24gPSAhIW9uOwogCQl3cjMyKEUxMDAwX1RTSU0sIHRzaW0pOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZ2ItPnRtcmVnX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIDA7CkBAIC03NDQsNyArNzQ1LDggQEAKIAkJfQogCX0KIAotCXNoaHd0c3RhbXBzLmh3dHN0YW1wID0ga3RpbWVfc3ViX25zKHNoaHd0c3RhbXBzLmh3dHN0YW1wLCBhZGp1c3QpOworCXNoaHd0c3RhbXBzLmh3dHN0YW1wID0KKwkJa3RpbWVfYWRkX25zKHNoaHd0c3RhbXBzLmh3dHN0YW1wLCBhZGp1c3QpOwogCiAJc2tiX3RzdGFtcF90eChhZGFwdGVyLT5wdHBfdHhfc2tiLCAmc2hod3RzdGFtcHMpOwogCWRldl9rZnJlZV9za2JfYW55KGFkYXB0ZXItPnB0cF90eF9za2IpOwpAQCAtNzY3LDEzICs3NjksMzIgQEAKIAkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCV9fbGU2NCAqcmVndmFsID0gKF9fbGU2NCAqKXZhOworCXN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciA9IHFfdmVjdG9yLT5hZGFwdGVyOworCWludCBhZGp1c3QgPSAwOwogCiAJLyogVGhlIHRpbWVzdGFtcCBpcyByZWNvcmRlZCBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdC4KIAkgKiBEV09SRDogMCAgICAgICAgMSAgICAgICAgMiAgICAgICAgMwogCSAqIEZpZWxkOiBSZXNlcnZlZCBSZXNlcnZlZCBTWVNUSU1MICBTWVNUSU1ICiAJICovCi0JaWdiX3B0cF9zeXN0aW1fdG9faHd0c3RhbXAocV92ZWN0b3ItPmFkYXB0ZXIsIHNrYl9od3RzdGFtcHMoc2tiKSwKKwlpZ2JfcHRwX3N5c3RpbV90b19od3RzdGFtcChhZGFwdGVyLCBza2JfaHd0c3RhbXBzKHNrYiksCiAJCQkJICAgbGU2NF90b19jcHUocmVndmFsWzFdKSk7CisKKwkvKiBhZGp1c3QgdGltZXN0YW1wIGZvciB0aGUgUlggbGF0ZW5jeSBiYXNlZCBvbiBsaW5rIHNwZWVkICovCisJaWYgKGFkYXB0ZXItPmh3Lm1hYy50eXBlID09IGUxMDAwX2kyMTApIHsKKwkJc3dpdGNoIChhZGFwdGVyLT5saW5rX3NwZWVkKSB7CisJCWNhc2UgU1BFRURfMTA6CisJCQlhZGp1c3QgPSBJR0JfSTIxMF9SWF9MQVRFTkNZXzEwOworCQkJYnJlYWs7CisJCWNhc2UgU1BFRURfMTAwOgorCQkJYWRqdXN0ID0gSUdCX0kyMTBfUlhfTEFURU5DWV8xMDA7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8xMDAwOgorCQkJYWRqdXN0ID0gSUdCX0kyMTBfUlhfTEFURU5DWV8xMDAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJc2tiX2h3dHN0YW1wcyhza2IpLT5od3RzdGFtcCA9CisJCWt0aW1lX3N1Yl9ucyhza2JfaHd0c3RhbXBzKHNrYiktPmh3dHN0YW1wLCBhZGp1c3QpOwogfQogCiAvKioKQEAgLTgyNSw3ICs4NDYsNyBAQAogCQl9CiAJfQogCXNrYl9od3RzdGFtcHMoc2tiKS0+aHd0c3RhbXAgPQotCQlrdGltZV9hZGRfbnMoc2tiX2h3dHN0YW1wcyhza2IpLT5od3RzdGFtcCwgYWRqdXN0KTsKKwkJa3RpbWVfc3ViX25zKHNrYl9od3RzdGFtcHMoc2tiKS0+aHd0c3RhbXAsIGFkanVzdCk7CiAKIAkvKiBVcGRhdGUgdGhlIGxhc3RfcnhfdGltZXN0YW1wIHRpbWVyIGluIG9yZGVyIHRvIGVuYWJsZSB3YXRjaGRvZyBjaGVjawogCSAqIGZvciBlcnJvciBjYXNlIG9mIGxhdGNoZWQgdGltZXN0YW1wIG9uIGEgZHJvcHBlZCBwYWNrZXQuCkBAIC05NzgsMTIgKzk5OSwxMiBAQAogCiAJLyogZGVmaW5lIGV0aGVydHlwZSBmaWx0ZXIgZm9yIHRpbWVzdGFtcGVkIHBhY2tldHMgKi8KIAlpZiAoaXNfbDIpCi0JCXdyMzIoRTEwMDBfRVRRRigzKSwKKwkJd3IzMihFMTAwMF9FVFFGKElHQl9FVFFGX0ZJTFRFUl8xNTg4KSwKIAkJICAgICAoRTEwMDBfRVRRRl9GSUxURVJfRU5BQkxFIHwgLyogZW5hYmxlIGZpbHRlciAqLwogCQkgICAgICBFMTAwMF9FVFFGXzE1ODggfCAvKiBlbmFibGUgdGltZXN0YW1waW5nICovCiAJCSAgICAgIEVUSF9QXzE1ODgpKTsgICAgIC8qIDE1ODggZXRoIHByb3RvY29sIHR5cGUgKi8KIAllbHNlCi0JCXdyMzIoRTEwMDBfRVRRRigzKSwgMCk7CisJCXdyMzIoRTEwMDBfRVRRRihJR0JfRVRRRl9GSUxURVJfMTU4OCksIDApOwogCiAJLyogTDQgUXVldWUgRmlsdGVyWzNdOiBmaWx0ZXIgYnkgZGVzdGluYXRpb24gcG9ydCBhbmQgcHJvdG9jb2wgKi8KIAlpZiAoaXNfbDQpIHsKQEAgLTExMzksNyArMTE2MCw3IEBACiAJaWYgKElTX0VSUihhZGFwdGVyLT5wdHBfY2xvY2spKSB7CiAJCWFkYXB0ZXItPnB0cF9jbG9jayA9IE5VTEw7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgInB0cF9jbG9ja19yZWdpc3RlciBmYWlsZWRcbiIpOwotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChhZGFwdGVyLT5wdHBfY2xvY2spIHsKIAkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgImFkZGVkIFBIQyBvbiAlc1xuIiwKIAkJCSBhZGFwdGVyLT5uZXRkZXYtPm5hbWUpOwogCQlhZGFwdGVyLT5wdHBfZmxhZ3MgfD0gSUdCX1BUUF9FTkFCTEVEOwpAQCAtMTIxNSw3ICsxMjM2LDkgQEAKIAljYXNlIGUxMDAwX2kyMTE6CiAJCXdyMzIoRTEwMDBfVFNBVVhDLCAweDApOwogCQl3cjMyKEUxMDAwX1RTU0RQLCAweDApOwotCQl3cjMyKEUxMDAwX1RTSU0sIFRTWU5DX0lOVEVSUlVQVFMpOworCQl3cjMyKEUxMDAwX1RTSU0sCisJCSAgICAgVFNZTkNfSU5URVJSVVBUUyB8CisJCSAgICAgKGFkYXB0ZXItPnBwc19zeXNfd3JhcF9vbiA/IFRTSU5UUl9TWVNfV1JBUCA6IDApKTsKIAkJd3IzMihFMTAwMF9JTVMsIEUxMDAwX0lNU19UUyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9uZXRkZXYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL25ldGRldi5jCmluZGV4IGIwNzc4YmEuLjEyYmI4NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL25ldGRldi5jCkBAIC00Nyw3ICs0Nyw3IEBACiAKICNpbmNsdWRlICJpZ2J2Zi5oIgogCi0jZGVmaW5lIERSVl9WRVJTSU9OICIyLjAuMi1rIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMi40LjAtayIKIGNoYXIgaWdidmZfZHJpdmVyX25hbWVbXSA9ICJpZ2J2ZiI7CiBjb25zdCBjaGFyIGlnYnZmX2RyaXZlcl92ZXJzaW9uW10gPSBEUlZfVkVSU0lPTjsKIHN0YXRpYyBjb25zdCBjaGFyIGlnYnZmX2RyaXZlcl9zdHJpbmdbXSA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmUuaAppbmRleCA5NDc1ZmY5Li5iMDZlMzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlLmgKQEAgLTQ1LDEwICs0NSwxMCBAQAogI2luY2x1ZGUgIml4Z2JlX3R5cGUuaCIKICNpbmNsdWRlICJpeGdiZV9jb21tb24uaCIKICNpbmNsdWRlICJpeGdiZV9kY2IuaCIKLSNpZiBkZWZpbmVkKENPTkZJR19GQ09FKSB8fCBkZWZpbmVkKENPTkZJR19GQ09FX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19GQ09FKQogI2RlZmluZSBJWEdCRV9GQ09FCiAjaW5jbHVkZSAiaXhnYmVfZmNvZS5oIgotI2VuZGlmIC8qIENPTkZJR19GQ09FIG9yIENPTkZJR19GQ09FX01PRFVMRSAqLworI2VuZGlmIC8qIElTX0VOQUJMRUQoQ09ORklHX0ZDT0UpICovCiAjaWZkZWYgQ09ORklHX0lYR0JFX0RDQQogI2luY2x1ZGUgPGxpbnV4L2RjYS5oPgogI2VuZGlmCkBAIC02NDUsNiArNjQ1LDcgQEAKICNkZWZpbmUgSVhHQkVfRkxBR19SWF9IV1RTVEFNUF9FTkFCTEVECQlCSVQoMjUpCiAjZGVmaW5lIElYR0JFX0ZMQUdfUlhfSFdUU1RBTVBfSU5fUkVHSVNURVIJQklUKDI2KQogI2RlZmluZSBJWEdCRV9GTEFHX0RDQl9DQVBBQkxFCQkJQklUKDI3KQorI2RlZmluZSBJWEdCRV9GTEFHX0dFTkVWRV9PRkZMT0FEX0NBUEFCTEUJQklUKDI4KQogCiAJdTMyIGZsYWdzMjsKICNkZWZpbmUgSVhHQkVfRkxBRzJfUlNDX0NBUEFCTEUJCQlCSVQoMCkKQEAgLTY1MywxMyArNjU0LDEyIEBACiAjZGVmaW5lIElYR0JFX0ZMQUcyX1RFTVBfU0VOU09SX0VWRU5UCQlCSVQoMykKICNkZWZpbmUgSVhHQkVfRkxBRzJfU0VBUkNIX0ZPUl9TRlAJCUJJVCg0KQogI2RlZmluZSBJWEdCRV9GTEFHMl9TRlBfTkVFRFNfUkVTRVQJCUJJVCg1KQotI2RlZmluZSBJWEdCRV9GTEFHMl9SRVNFVF9SRVFVRVNURUQJCUJJVCg2KQogI2RlZmluZSBJWEdCRV9GTEFHMl9GRElSX1JFUVVJUkVTX1JFSU5JVAlCSVQoNykKICNkZWZpbmUgSVhHQkVfRkxBRzJfUlNTX0ZJRUxEX0lQVjRfVURQCQlCSVQoOCkKICNkZWZpbmUgSVhHQkVfRkxBRzJfUlNTX0ZJRUxEX0lQVjZfVURQCQlCSVQoOSkKICNkZWZpbmUgSVhHQkVfRkxBRzJfUFRQX1BQU19FTkFCTEVECQlCSVQoMTApCiAjZGVmaW5lIElYR0JFX0ZMQUcyX1BIWV9JTlRFUlJVUFQJCUJJVCgxMSkKLSNkZWZpbmUgSVhHQkVfRkxBRzJfVlhMQU5fUkVSRUdfTkVFREVECQlCSVQoMTIpCisjZGVmaW5lIElYR0JFX0ZMQUcyX1VEUF9UVU5fUkVSRUdfTkVFREVECUJJVCgxMikKICNkZWZpbmUgSVhHQkVfRkxBRzJfVkxBTl9QUk9NSVNDCQlCSVQoMTMpCiAKIAkvKiBUeCBmYXN0IHBhdGggZGF0YSAqLwpAQCAtNjczLDYgKzY3Myw3IEBACiAKIAkvKiBQb3J0IG51bWJlciB1c2VkIHRvIGlkZW50aWZ5IFZYTEFOIHRyYWZmaWMgKi8KIAlfX2JlMTYgdnhsYW5fcG9ydDsKKwlfX2JlMTYgZ2VuZXZlX3BvcnQ7CiAKIAkvKiBUWCAqLwogCXN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nW01BWF9UWF9RVUVVRVNdIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CkBAIC04NDAsNiArODQxLDcgQEAKIAlfX0lYR0JFX0lOX1NGUF9JTklULAogCV9fSVhHQkVfUFRQX1JVTk5JTkcsCiAJX19JWEdCRV9QVFBfVFhfSU5fUFJPR1JFU1MsCisJX19JWEdCRV9SRVNFVF9SRVFVRVNURUQsCiB9OwogCiBzdHJ1Y3QgaXhnYmVfY2IgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9jb21tb24uYwppbmRleCBiNDIxN2YzLi43N2QzMDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9jb21tb24uYwpAQCAtOTksNiArOTksNyBAQAogCQljYXNlIElYR0JFX0RFVl9JRF9YNTUwVDoKIAkJY2FzZSBJWEdCRV9ERVZfSURfWDU1MFQxOgogCQljYXNlIElYR0JFX0RFVl9JRF9YNTUwRU1fWF8xMEdfVDoKKwkJY2FzZSBJWEdCRV9ERVZfSURfWDU1MEVNX0FfMTBHX1Q6CiAJCQlzdXBwb3J0ZWQgPSB0cnVlOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CkBAIC0yOTU4LDggKzI5NTksMTAgQEAKIAl9CiAKIAkvKiB3YXMgdGhhdCB0aGUgbGFzdCBwb29sIHVzaW5nIHRoaXMgcmFyPyAqLwotCWlmIChtcHNhcl9sbyA9PSAwICYmIG1wc2FyX2hpID09IDAgJiYgcmFyICE9IDApCisJaWYgKG1wc2FyX2xvID09IDAgJiYgbXBzYXJfaGkgPT0gMCAmJgorCSAgICByYXIgIT0gMCAmJiByYXIgIT0gaHctPm1hYy5zYW5fbWFjX3Jhcl9pbmRleCkKIAkJaHctPm1hYy5vcHMuY2xlYXJfcmFyKGh3LCByYXIpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2V0aHRvb2wuYwppbmRleCAwZDcyMDllLi5mNDlmODAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZXRodG9vbC5jCkBAIC0xOTMsNyArMTkzLDkgQEAKIAlpZiAoc3VwcG9ydGVkX2xpbmsgJiBJWEdCRV9MSU5LX1NQRUVEXzEwR0JfRlVMTCkKIAkJZWNtZC0+c3VwcG9ydGVkIHw9IGl4Z2JlX2dldF9zdXBwb3J0ZWRfMTBndHlwZXMoaHcpOwogCWlmIChzdXBwb3J0ZWRfbGluayAmIElYR0JFX0xJTktfU1BFRURfMUdCX0ZVTEwpCi0JCWVjbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGw7CisJCWVjbWQtPnN1cHBvcnRlZCB8PSAoaXhnYmVfaXNiYWNrcGxhbmUoaHctPnBoeS5tZWRpYV90eXBlKSkgPworCQkJCSAgIFNVUFBPUlRFRF8xMDAwYmFzZUtYX0Z1bGwgOgorCQkJCSAgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbDsKIAlpZiAoc3VwcG9ydGVkX2xpbmsgJiBJWEdCRV9MSU5LX1NQRUVEXzEwMF9GVUxMKQogCQllY21kLT5zdXBwb3J0ZWQgfD0gaXhnYmVfaXNiYWNrcGxhbmUoaHctPnBoeS5tZWRpYV90eXBlKSA/CiAJCQkJICAgU1VQUE9SVEVEXzEwMDBiYXNlS1hfRnVsbCA6CkBAIC0zMTEsNiArMzEzLDI1IEBACiAJCWJyZWFrOwogCX0KIAorCS8qIEluZGljYXRlIHBhdXNlIHN1cHBvcnQgKi8KKwllY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX1BhdXNlOworCisJc3dpdGNoIChody0+ZmMucmVxdWVzdGVkX21vZGUpIHsKKwljYXNlIGl4Z2JlX2ZjX2Z1bGw6CisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfUGF1c2U7CisJCWJyZWFrOworCWNhc2UgaXhnYmVfZmNfcnhfcGF1c2U6CisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfUGF1c2UgfAorCQkJCSAgICAgQURWRVJUSVNFRF9Bc3ltX1BhdXNlOworCQlicmVhazsKKwljYXNlIGl4Z2JlX2ZjX3R4X3BhdXNlOgorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0FzeW1fUGF1c2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVjbWQtPmFkdmVydGlzaW5nICY9IH4oQURWRVJUSVNFRF9QYXVzZSB8CisJCQkJICAgICAgIEFEVkVSVElTRURfQXN5bV9QYXVzZSk7CisJfQorCiAJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewogCQlzd2l0Y2ggKGFkYXB0ZXItPmxpbmtfc3BlZWQpIHsKIAkJY2FzZSBJWEdCRV9MSU5LX1NQRUVEXzEwR0JfRlVMTDoKQEAgLTI5MjYsOSArMjk0NywxMyBAQAogc3RhdGljIHZvaWQgaXhnYmVfZ2V0X3JldGEoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiAqaW5kaXIpCiB7CiAJaW50IGksIHJldGFfc2l6ZSA9IGl4Z2JlX3Jzc19pbmRpcl90YmxfZW50cmllcyhhZGFwdGVyKTsKKwl1MTYgcnNzX20gPSBhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX1JTU10ubWFzazsKKworCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfU1JJT1ZfRU5BQkxFRCkKKwkJcnNzX20gPSBhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX1JTU10uaW5kaWNlcyAtIDE7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcmV0YV9zaXplOyBpKyspCi0JCWluZGlyW2ldID0gYWRhcHRlci0+cnNzX2luZGlyX3RibFtpXTsKKwkJaW5kaXJbaV0gPSBhZGFwdGVyLT5yc3NfaW5kaXJfdGJsW2ldICYgcnNzX207CiB9CiAKIHN0YXRpYyBpbnQgaXhnYmVfZ2V0X3J4Zmgoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyICppbmRpciwgdTggKmtleSwKQEAgLTMwMzksOCArMzA2NCw4IEBACiAJCS8qIFdlIG9ubHkgc3VwcG9ydCBvbmUgcV92ZWN0b3Igd2l0aG91dCBNU0ktWCAqLwogCQltYXhfY29tYmluZWQgPSAxOwogCX0gZWxzZSBpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1NSSU9WX0VOQUJMRUQpIHsKLQkJLyogU1ItSU9WIGN1cnJlbnRseSBvbmx5IGFsbG93cyBvbmUgcXVldWUgb24gdGhlIFBGICovCi0JCW1heF9jb21iaW5lZCA9IDE7CisJCS8qIExpbWl0IHZhbHVlIGJhc2VkIG9uIHRoZSBxdWV1ZSBtYXNrICovCisJCW1heF9jb21iaW5lZCA9IGFkYXB0ZXItPnJpbmdfZmVhdHVyZVtSSU5HX0ZfUlNTXS5tYXNrICsgMTsKIAl9IGVsc2UgaWYgKHRjcyA+IDEpIHsKIAkJLyogRm9yIERDQiByZXBvcnQgY2hhbm5lbHMgcGVyIHRyYWZmaWMgY2xhc3MgKi8KIAkJaWYgKGFkYXB0ZXItPmh3Lm1hYy50eXBlID09IGl4Z2JlX21hY184MjU5OEVCKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9saWIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2xpYi5jCmluZGV4IGJjZGM4ODQuLjE1YWIzMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2xpYi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2xpYi5jCkBAIC01MTUsMTUgKzUxNSwxNiBAQAogCXZtZHFfaSA9IG1pbl90KHUxNiwgSVhHQkVfTUFYX1ZNRFFfSU5ESUNFUywgdm1kcV9pKTsKIAogCS8qIDY0IHBvb2wgbW9kZSB3aXRoIDIgcXVldWVzIHBlciBwb29sICovCi0JaWYgKCh2bWRxX2kgPiAzMikgfHwgKHJzc19pIDwgNCkgfHwgKHZtZHFfaSA+IDE2ICYmIHBvb2xzKSkgeworCWlmICgodm1kcV9pID4gMzIpIHx8ICh2bWRxX2kgPiAxNiAmJiBwb29scykpIHsKIAkJdm1kcV9tID0gSVhHQkVfODI1OTlfVk1EUV8yUV9NQVNLOwogCQlyc3NfbSA9IElYR0JFX1JTU18yUV9NQVNLOwogCQlyc3NfaSA9IG1pbl90KHUxNiwgcnNzX2ksIDIpOwotCS8qIDMyIHBvb2wgbW9kZSB3aXRoIDQgcXVldWVzIHBlciBwb29sICovCisJLyogMzIgcG9vbCBtb2RlIHdpdGggdXAgdG8gNCBxdWV1ZXMgcGVyIHBvb2wgKi8KIAl9IGVsc2UgewogCQl2bWRxX20gPSBJWEdCRV84MjU5OV9WTURRXzRRX01BU0s7CiAJCXJzc19tID0gSVhHQkVfUlNTXzRRX01BU0s7Ci0JCXJzc19pID0gNDsKKwkJLyogV2UgY2FuIHN1cHBvcnQgNCwgMiwgb3IgMSBxdWV1ZXMgKi8KKwkJcnNzX2kgPSAocnNzX2kgPiAzKSA/IDQgOiAocnNzX2kgPiAxKSA/IDIgOiAxOwogCX0KIAogI2lmZGVmIElYR0JFX0ZDT0UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX21haW4uYwppbmRleCA1NDE4YzY5YS4uYTI0NGQ5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX21haW4uYwpAQCAtMTM3LDYgKzEzNyw3IEBACiAJe1BDSV9WREVWSUNFKElOVEVMLCBJWEdCRV9ERVZfSURfWDU1MEVNX0FfU0ZQX04pLCBib2FyZF94NTUwZW1fYSB9LAogCXtQQ0lfVkRFVklDRShJTlRFTCwgSVhHQkVfREVWX0lEX1g1NTBFTV9BX1NHTUlJKSwgYm9hcmRfeDU1MGVtX2EgfSwKIAl7UENJX1ZERVZJQ0UoSU5URUwsIElYR0JFX0RFVl9JRF9YNTUwRU1fQV9TR01JSV9MKSwgYm9hcmRfeDU1MGVtX2EgfSwKKwl7UENJX1ZERVZJQ0UoSU5URUwsIElYR0JFX0RFVl9JRF9YNTUwRU1fQV8xMEdfVCksIGJvYXJkX3g1NTBlbV9hfSwKIAl7UENJX1ZERVZJQ0UoSU5URUwsIElYR0JFX0RFVl9JRF9YNTUwRU1fQV9TRlApLCBib2FyZF94NTUwZW1fYSB9LAogCS8qIHJlcXVpcmVkIGxhc3QgZW50cnkgKi8KIAl7MCwgfQpAQCAtMTEwMyw3ICsxMTA0LDcgQEAKIAogCS8qIERvIHRoZSByZXNldCBvdXRzaWRlIG9mIGludGVycnVwdCBjb250ZXh0ICovCiAJaWYgKCF0ZXN0X2JpdChfX0lYR0JFX0RPV04sICZhZGFwdGVyLT5zdGF0ZSkpIHsKLQkJYWRhcHRlci0+ZmxhZ3MyIHw9IElYR0JFX0ZMQUcyX1JFU0VUX1JFUVVFU1RFRDsKKwkJc2V0X2JpdChfX0lYR0JFX1JFU0VUX1JFUVVFU1RFRCwgJmFkYXB0ZXItPnN0YXRlKTsKIAkJZV93YXJuKGRydiwgImluaXRpYXRpbmcgcmVzZXQgZHVlIHRvIHR4IHRpbWVvdXRcbiIpOwogCQlpeGdiZV9zZXJ2aWNlX2V2ZW50X3NjaGVkdWxlKGFkYXB0ZXIpOwogCX0KQEAgLTE0OTUsNyArMTQ5Niw2IEBACiAJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCV9fbGUxNiBwa3RfaW5mbyA9IHJ4X2Rlc2MtPndiLmxvd2VyLmxvX2R3b3JkLmhzX3Jzcy5wa3RfaW5mbzsKLQlfX2xlMTYgaGRyX2luZm8gPSByeF9kZXNjLT53Yi5sb3dlci5sb19kd29yZC5oc19yc3MuaGRyX2luZm87CiAJYm9vbCBlbmNhcF9wa3QgPSBmYWxzZTsKIAogCXNrYl9jaGVja3N1bV9ub25lX2Fzc2VydChza2IpOwpAQCAtMTUwNCw4ICsxNTA0LDggQEAKIAlpZiAoIShyaW5nLT5uZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU0pKQogCQlyZXR1cm47CiAKLQlpZiAoKHBrdF9pbmZvICYgY3B1X3RvX2xlMTYoSVhHQkVfUlhEQURWX1BLVFRZUEVfVlhMQU4pKSAmJgotCSAgICAoaGRyX2luZm8gJiBjcHVfdG9fbGUxNihJWEdCRV9SWERBRFZfUEtUVFlQRV9UVU5ORUwgPj4gMTYpKSkgeworCS8qIGNoZWNrIGZvciBWWExBTiBhbmQgR2VuZXZlIHBhY2tldHMgKi8KKwlpZiAocGt0X2luZm8gJiBjcHVfdG9fbGUxNihJWEdCRV9SWERBRFZfUEtUVFlQRV9WWExBTikpIHsKIAkJZW5jYXBfcGt0ID0gdHJ1ZTsKIAkJc2tiLT5lbmNhcHN1bGF0aW9uID0gMTsKIAl9CkBAIC0yNzc3LDcgKzI3NzcsNyBAQAogCQl9CiAJCWlmIChlaWNyICYgSVhHQkVfRUlDUl9FQ0MpIHsKIAkJCWVfaW5mbyhsaW5rLCAiUmVjZWl2ZWQgRUNDIEVyciwgaW5pdGlhdGluZyByZXNldFxuIik7Ci0JCQlhZGFwdGVyLT5mbGFnczIgfD0gSVhHQkVfRkxBRzJfUkVTRVRfUkVRVUVTVEVEOworCQkJc2V0X2JpdChfX0lYR0JFX1JFU0VUX1JFUVVFU1RFRCwgJmFkYXB0ZXItPnN0YXRlKTsKIAkJCWl4Z2JlX3NlcnZpY2VfZXZlbnRfc2NoZWR1bGUoYWRhcHRlcik7CiAJCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0VJQ1IsIElYR0JFX0VJQ1JfRUNDKTsKIAkJfQpAQCAtMzAwNyw3ICszMDA3LDcgQEAKIAljYXNlIGl4Z2JlX21hY194NTUwZW1fYToKIAkJaWYgKGVpY3IgJiBJWEdCRV9FSUNSX0VDQykgewogCQkJZV9pbmZvKGxpbmssICJSZWNlaXZlZCBFQ0MgRXJyLCBpbml0aWF0aW5nIHJlc2V0XG4iKTsKLQkJCWFkYXB0ZXItPmZsYWdzMiB8PSBJWEdCRV9GTEFHMl9SRVNFVF9SRVFVRVNURUQ7CisJCQlzZXRfYml0KF9fSVhHQkVfUkVTRVRfUkVRVUVTVEVELCAmYWRhcHRlci0+c3RhdGUpOwogCQkJaXhnYmVfc2VydmljZV9ldmVudF9zY2hlZHVsZShhZGFwdGVyKTsKIAkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRUlDUiwgSVhHQkVfRUlDUl9FQ0MpOwogCQl9CkBAIC0zMjI0LDcgKzMyMjQsNyBAQAogCQl0eGRjdGwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVFhEQ1RMKHJlZ19pZHgpKTsKIAl9IHdoaWxlICgtLXdhaXRfbG9vcCAmJiAhKHR4ZGN0bCAmIElYR0JFX1RYRENUTF9FTkFCTEUpKTsKIAlpZiAoIXdhaXRfbG9vcCkKLQkJZV9lcnIoZHJ2LCAiQ291bGQgbm90IGVuYWJsZSBUeCBRdWV1ZSAlZFxuIiwgcmVnX2lkeCk7CisJCWh3X2RiZyhodywgIkNvdWxkIG5vdCBlbmFibGUgVHggUXVldWUgJWRcbiIsIHJlZ19pZHgpOwogfQogCiBzdGF0aWMgdm9pZCBpeGdiZV9zZXR1cF9tdHFjKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQpAQCAtMzI0OCw3ICszMjQ4LDggQEAKIAkJCW10cWMgfD0gSVhHQkVfTVRRQ19SVF9FTkEgfCBJWEdCRV9NVFFDXzhUQ184VFE7CiAJCWVsc2UgaWYgKHRjcyA+IDEpCiAJCQltdHFjIHw9IElYR0JFX01UUUNfUlRfRU5BIHwgSVhHQkVfTVRRQ180VENfNFRROwotCQllbHNlIGlmIChhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX1JTU10uaW5kaWNlcyA9PSA0KQorCQllbHNlIGlmIChhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX1ZNRFFdLm1hc2sgPT0KKwkJCSBJWEdCRV84MjU5OV9WTURRXzRRX01BU0spCiAJCQltdHFjIHw9IElYR0JFX01UUUNfMzJWRjsKIAkJZWxzZQogCQkJbXRxYyB8PSBJWEdCRV9NVFFDXzY0VkY7CkBAIC0zNDc1LDEyICszNDc2LDEyIEBACiAJdTMyIHJldGFfZW50cmllcyA9IGl4Z2JlX3Jzc19pbmRpcl90YmxfZW50cmllcyhhZGFwdGVyKTsKIAl1MTYgcnNzX2kgPSBhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX1JTU10uaW5kaWNlczsKIAotCS8qIFByb2dyYW0gdGFibGUgZm9yIGF0IGxlYXN0IDIgcXVldWVzIHcvIFNSLUlPViBzbyB0aGF0IFZGcyBjYW4KKwkvKiBQcm9ncmFtIHRhYmxlIGZvciBhdCBsZWFzdCA0IHF1ZXVlcyB3LyBTUi1JT1Ygc28gdGhhdCBWRnMgY2FuCiAJICogbWFrZSBmdWxsIHVzZSBvZiBhbnkgcmluZ3MgdGhleSBtYXkgaGF2ZS4gIFdlIHdpbGwgdXNlIHRoZQogCSAqIFBTUlRZUEUgcmVnaXN0ZXIgdG8gY29udHJvbCBob3cgbWFueSByaW5ncyB3ZSB1c2Ugd2l0aGluIHRoZSBQRi4KIAkgKi8KLQlpZiAoKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19TUklPVl9FTkFCTEVEKSAmJiAocnNzX2kgPCAyKSkKLQkJcnNzX2kgPSAyOworCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1NSSU9WX0VOQUJMRUQpICYmIChyc3NfaSA8IDQpKQorCQlyc3NfaSA9IDQ7CiAKIAkvKiBGaWxsIG91dCBoYXNoIGZ1bmN0aW9uIHNlZWRzICovCiAJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCkBAIC0zNTQ0LDcgKzM1NDUsOCBAQAogCQkJCW1ycWMgPSBJWEdCRV9NUlFDX1ZNRFFSVDhUQ0VOOwkvKiA4IFRDcyAqLwogCQkJZWxzZSBpZiAodGNzID4gMSkKIAkJCQltcnFjID0gSVhHQkVfTVJRQ19WTURRUlQ0VENFTjsJLyogNCBUQ3MgKi8KLQkJCWVsc2UgaWYgKGFkYXB0ZXItPnJpbmdfZmVhdHVyZVtSSU5HX0ZfUlNTXS5pbmRpY2VzID09IDQpCisJCQllbHNlIGlmIChhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX1ZNRFFdLm1hc2sgPT0KKwkJCQkgSVhHQkVfODI1OTlfVk1EUV80UV9NQVNLKQogCQkJCW1ycWMgPSBJWEdCRV9NUlFDX1ZNRFFSU1MzMkVOOwogCQkJZWxzZQogCQkJCW1ycWMgPSBJWEdCRV9NUlFDX1ZNRFFSU1M2NEVOOwpAQCAtMzkyMiw2ICszOTI0LDkgQEAKIAlyZmN0bCAmPSB+SVhHQkVfUkZDVExfUlNDX0RJUzsKIAlpZiAoIShhZGFwdGVyLT5mbGFnczIgJiBJWEdCRV9GTEFHMl9SU0NfRU5BQkxFRCkpCiAJCXJmY3RsIHw9IElYR0JFX1JGQ1RMX1JTQ19ESVM7CisKKwkvKiBkaXNhYmxlIE5GUyBmaWx0ZXJpbmcgKi8KKwlyZmN0bCB8PSAoSVhHQkVfUkZDVExfTkZTV19ESVMgfCBJWEdCRV9SRkNUTF9ORlNSX0RJUyk7CiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SRkNUTCwgcmZjdGwpOwogCiAJLyogUHJvZ3JhbSByZWdpc3RlcnMgZm9yIHRoZSBkaXN0cmlidXRpb24gb2YgcXVldWVzICovCkBAIC00MTAwLDI0ICs0MTA1LDIyIEBACiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAl1MzIgdmxuY3RybCwgaTsKIAotCXN3aXRjaCAoaHctPm1hYy50eXBlKSB7Ci0JY2FzZSBpeGdiZV9tYWNfODI1OTlFQjoKLQljYXNlIGl4Z2JlX21hY19YNTQwOgotCWNhc2UgaXhnYmVfbWFjX1g1NTA6Ci0JY2FzZSBpeGdiZV9tYWNfWDU1MEVNX3g6Ci0JY2FzZSBpeGdiZV9tYWNfeDU1MGVtX2E6Ci0JZGVmYXVsdDoKLQkJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19WTURRX0VOQUJMRUQpCi0JCQlicmVhazsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBpeGdiZV9tYWNfODI1OThFQjoKLQkJLyogbGVnYWN5IGNhc2UsIHdlIGNhbiBqdXN0IGRpc2FibGUgVkxBTiBmaWx0ZXJpbmcgKi8KLQkJdmxuY3RybCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9WTE5DVFJMKTsKLQkJdmxuY3RybCAmPSB+KElYR0JFX1ZMTkNUUkxfVkZFIHwgSVhHQkVfVkxOQ1RSTF9DRklFTik7CisJdmxuY3RybCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9WTE5DVFJMKTsKKworCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfVk1EUV9FTkFCTEVEKSB7CisJLyogRm9yIFZNRHEgYW5kIFNSLUlPViB3ZSBtdXN0IGxlYXZlIFZMQU4gZmlsdGVyaW5nIGVuYWJsZWQgKi8KKwkJdmxuY3RybCB8PSBJWEdCRV9WTE5DVFJMX1ZGRTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WTE5DVFJMLCB2bG5jdHJsKTsKKwl9IGVsc2UgeworCQl2bG5jdHJsICY9IH5JWEdCRV9WTE5DVFJMX1ZGRTsKIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WTE5DVFJMLCB2bG5jdHJsKTsKIAkJcmV0dXJuOwogCX0KIAorCS8qIE5vdGhpbmcgdG8gZG8gZm9yIDgyNTk4ICovCisJaWYgKGh3LT5tYWMudHlwZSA9PSBpeGdiZV9tYWNfODI1OThFQikKKwkJcmV0dXJuOworCiAJLyogV2UgYXJlIGFscmVhZHkgaW4gVkxBTiBwcm9taXNjLCBub3RoaW5nIHRvIGRvICovCiAJaWYgKGFkYXB0ZXItPmZsYWdzMiAmIElYR0JFX0ZMQUcyX1ZMQU5fUFJPTUlTQykKIAkJcmV0dXJuOwpAQCAtNDE5MSwyMyArNDE5NCwxNCBAQAogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJdTMyIHZsbmN0cmwsIGk7CiAKLQlzd2l0Y2ggKGh3LT5tYWMudHlwZSkgewotCWNhc2UgaXhnYmVfbWFjXzgyNTk5RUI6Ci0JY2FzZSBpeGdiZV9tYWNfWDU0MDoKLQljYXNlIGl4Z2JlX21hY19YNTUwOgotCWNhc2UgaXhnYmVfbWFjX1g1NTBFTV94OgotCWNhc2UgaXhnYmVfbWFjX3g1NTBlbV9hOgotCWRlZmF1bHQ6Ci0JCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfVk1EUV9FTkFCTEVEKQotCQkJYnJlYWs7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgaXhnYmVfbWFjXzgyNTk4RUI6Ci0JCXZsbmN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVkxOQ1RSTCk7Ci0JCXZsbmN0cmwgJj0gfklYR0JFX1ZMTkNUUkxfQ0ZJRU47Ci0JCXZsbmN0cmwgfD0gSVhHQkVfVkxOQ1RSTF9WRkU7Ci0JCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVkxOQ1RSTCwgdmxuY3RybCk7CisJLyogU2V0IFZMQU4gZmlsdGVyaW5nIHRvIGVuYWJsZWQgKi8KKwl2bG5jdHJsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1ZMTkNUUkwpOworCXZsbmN0cmwgfD0gSVhHQkVfVkxOQ1RSTF9WRkU7CisJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WTE5DVFJMLCB2bG5jdHJsKTsKKworCWlmICghKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19WTURRX0VOQUJMRUQpIHx8CisJICAgIGh3LT5tYWMudHlwZSA9PSBpeGdiZV9tYWNfODI1OThFQikKIAkJcmV0dXJuOwotCX0KIAogCS8qIFdlIGFyZSBub3QgaW4gVkxBTiBwcm9taXNjLCBub3RoaW5nIHRvIGRvICovCiAJaWYgKCEoYWRhcHRlci0+ZmxhZ3MyICYgSVhHQkVfRkxBRzJfVkxBTl9QUk9NSVNDKSkKQEAgLTQ1ODAsMTggKzQ1NzQsMjMgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGl4Z2JlX2NsZWFyX3Z4bGFuX3BvcnQoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCitzdGF0aWMgdm9pZCBpeGdiZV9jbGVhcl91ZHBfdHVubmVsX3BvcnQoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBtYXNrKQogewotCXN3aXRjaCAoYWRhcHRlci0+aHcubWFjLnR5cGUpIHsKLQljYXNlIGl4Z2JlX21hY19YNTUwOgotCWNhc2UgaXhnYmVfbWFjX1g1NTBFTV94OgotCWNhc2UgaXhnYmVfbWFjX3g1NTBlbV9hOgotCQlJWEdCRV9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9WWExBTkNUUkwsIDApOworCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdTMyIHZ4bGFuY3RybDsKKworCWlmICghKGFkYXB0ZXItPmZsYWdzICYgKElYR0JFX0ZMQUdfVlhMQU5fT0ZGTE9BRF9DQVBBQkxFIHwKKwkJCQlJWEdCRV9GTEFHX0dFTkVWRV9PRkZMT0FEX0NBUEFCTEUpKSkKKwkJcmV0dXJuOworCisJdnhsYW5jdHJsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1ZYTEFOQ1RSTCkgJiYgfm1hc2s7CisJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WWExBTkNUUkwsIHZ4bGFuY3RybCk7CisKKwlpZiAobWFzayAmIElYR0JFX1ZYTEFOQ1RSTF9WWExBTl9VRFBQT1JUX01BU0spCiAJCWFkYXB0ZXItPnZ4bGFuX3BvcnQgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CisKKwlpZiAobWFzayAmIElYR0JFX1ZYTEFOQ1RSTF9HRU5FVkVfVURQUE9SVF9NQVNLKQorCQlhZGFwdGVyLT5nZW5ldmVfcG9ydCA9IDA7CiB9CiAKICNpZmRlZiBDT05GSUdfSVhHQkVfRENCCkBAIC01NDk0LDggKzU0OTMsOCBAQAogCiAJaXhnYmVfbmFwaV9kaXNhYmxlX2FsbChhZGFwdGVyKTsKIAotCWFkYXB0ZXItPmZsYWdzMiAmPSB+KElYR0JFX0ZMQUcyX0ZESVJfUkVRVUlSRVNfUkVJTklUIHwKLQkJCSAgICAgSVhHQkVfRkxBRzJfUkVTRVRfUkVRVUVTVEVEKTsKKwljbGVhcl9iaXQoX19JWEdCRV9SRVNFVF9SRVFVRVNURUQsICZhZGFwdGVyLT5zdGF0ZSk7CisJYWRhcHRlci0+ZmxhZ3MyICY9IH5JWEdCRV9GTEFHMl9GRElSX1JFUVVJUkVTX1JFSU5JVDsKIAlhZGFwdGVyLT5mbGFncyAmPSB+SVhHQkVfRkxBR19ORUVEX0xJTktfVVBEQVRFOwogCiAJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPnNlcnZpY2VfdGltZXIpOwpAQCAtNTcwNSw4ICs1NzA0LDEwIEBACiAJCWlmIChmd3NtICYgSVhHQkVfRldTTV9UU19FTkFCTEVEKQogCQkJYWRhcHRlci0+ZmxhZ3MyIHw9IElYR0JFX0ZMQUcyX1RFTVBfU0VOU09SX0NBUEFCTEU7CiAJCWJyZWFrOwotCWNhc2UgaXhnYmVfbWFjX1g1NTBFTV94OgogCWNhc2UgaXhnYmVfbWFjX3g1NTBlbV9hOgorCQlhZGFwdGVyLT5mbGFncyB8PSBJWEdCRV9GTEFHX0dFTkVWRV9PRkZMT0FEX0NBUEFCTEU7CisJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBpeGdiZV9tYWNfWDU1MEVNX3g6CiAjaWZkZWYgQ09ORklHX0lYR0JFX0RDQgogCQlhZGFwdGVyLT5mbGFncyAmPSB+SVhHQkVfRkxBR19EQ0JfQ0FQQUJMRTsKICNlbmRpZgpAQCAtNjEzOCw3ICs2MTM5LDcgQEAKIAogCWl4Z2JlX3VwX2NvbXBsZXRlKGFkYXB0ZXIpOwogCi0JaXhnYmVfY2xlYXJfdnhsYW5fcG9ydChhZGFwdGVyKTsKKwlpeGdiZV9jbGVhcl91ZHBfdHVubmVsX3BvcnQoYWRhcHRlciwgSVhHQkVfVlhMQU5DVFJMX0FMTF9VRFBQT1JUX01BU0spOwogCXVkcF90dW5uZWxfZ2V0X3J4X2luZm8obmV0ZGV2KTsKIAogCXJldHVybiAwOwpAQCAtNjkxNSw3ICs2OTE2LDcgQEAKIAkJCSAqIChEbyB0aGUgcmVzZXQgb3V0c2lkZSBvZiBpbnRlcnJ1cHQgY29udGV4dCkuCiAJCQkgKi8KIAkJCWVfd2FybihkcnYsICJpbml0aWF0aW5nIHJlc2V0IHRvIGNsZWFyIFR4IHdvcmsgYWZ0ZXIgbGluayBsb3NzXG4iKTsKLQkJCWFkYXB0ZXItPmZsYWdzMiB8PSBJWEdCRV9GTEFHMl9SRVNFVF9SRVFVRVNURUQ7CisJCQlzZXRfYml0KF9fSVhHQkVfUkVTRVRfUkVRVUVTVEVELCAmYWRhcHRlci0+c3RhdGUpOwogCQl9CiAJfQogfQpAQCAtNzE4MSwxMSArNzE4Miw5IEBACiAKIHN0YXRpYyB2b2lkIGl4Z2JlX3Jlc2V0X3N1YnRhc2soc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JaWYgKCEoYWRhcHRlci0+ZmxhZ3MyICYgSVhHQkVfRkxBRzJfUkVTRVRfUkVRVUVTVEVEKSkKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChfX0lYR0JFX1JFU0VUX1JFUVVFU1RFRCwgJmFkYXB0ZXItPnN0YXRlKSkKIAkJcmV0dXJuOwogCi0JYWRhcHRlci0+ZmxhZ3MyICY9IH5JWEdCRV9GTEFHMl9SRVNFVF9SRVFVRVNURUQ7Ci0KIAkvKiBJZiB3ZSdyZSBhbHJlYWR5IGRvd24sIHJlbW92aW5nIG9yIHJlc2V0dGluZywganVzdCBiYWlsICovCiAJaWYgKHRlc3RfYml0KF9fSVhHQkVfRE9XTiwgJmFkYXB0ZXItPnN0YXRlKSB8fAogCSAgICB0ZXN0X2JpdChfX0lYR0JFX1JFTU9WSU5HLCAmYWRhcHRlci0+c3RhdGUpIHx8CkBAIC03MjE5LDkgKzcyMTgsOSBAQAogCQlpeGdiZV9zZXJ2aWNlX2V2ZW50X2NvbXBsZXRlKGFkYXB0ZXIpOwogCQlyZXR1cm47CiAJfQotCWlmIChhZGFwdGVyLT5mbGFnczIgJiBJWEdCRV9GTEFHMl9WWExBTl9SRVJFR19ORUVERUQpIHsKKwlpZiAoYWRhcHRlci0+ZmxhZ3MyICYgSVhHQkVfRkxBRzJfVURQX1RVTl9SRVJFR19ORUVERUQpIHsKIAkJcnRubF9sb2NrKCk7Ci0JCWFkYXB0ZXItPmZsYWdzMiAmPSB+SVhHQkVfRkxBRzJfVlhMQU5fUkVSRUdfTkVFREVEOworCQlhZGFwdGVyLT5mbGFnczIgJj0gfklYR0JFX0ZMQUcyX1VEUF9UVU5fUkVSRUdfTkVFREVEOwogCQl1ZHBfdHVubmVsX2dldF9yeF9pbmZvKGFkYXB0ZXItPm5ldGRldik7CiAJCXJ0bmxfdW5sb2NrKCk7CiAJfQpAQCAtNzY2MSw2ICs3NjYwLDEwIEBACiAJCWlmIChhZGFwdGVyLT52eGxhbl9wb3J0ICYmCiAJCSAgICB1ZHBfaGRyKHNrYiktPmRlc3QgPT0gYWRhcHRlci0+dnhsYW5fcG9ydCkKIAkJCWhkci5uZXR3b3JrID0gc2tiX2lubmVyX25ldHdvcmtfaGVhZGVyKHNrYik7CisKKwkJaWYgKGFkYXB0ZXItPmdlbmV2ZV9wb3J0ICYmCisJCSAgICB1ZHBfaGRyKHNrYiktPmRlc3QgPT0gYWRhcHRlci0+Z2VuZXZlX3BvcnQpCisJCQloZHIubmV0d29yayA9IHNrYl9pbm5lcl9uZXR3b3JrX2hlYWRlcihza2IpOwogCX0KIAogCS8qIEN1cnJlbnRseSBvbmx5IElQdjQvSVB2NiB3aXRoIFRDUCBpcyBzdXBwb3J0ZWQgKi8KQEAgLTgzOTAsMTIgKzgzOTMsMTQgQEAKIAkJCSAgICBzdHJ1Y3QgdGNmX2V4dHMgKmV4dHMsIHU2NCAqYWN0aW9uLCB1OCAqcXVldWUpCiB7CiAJY29uc3Qgc3RydWN0IHRjX2FjdGlvbiAqYTsKKwlMSVNUX0hFQUQoYWN0aW9ucyk7CiAJaW50IGVycjsKIAogCWlmICh0Y19ub19hY3Rpb25zKGV4dHMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXRjX2Zvcl9lYWNoX2FjdGlvbihhLCBleHRzKSB7CisJdGNmX2V4dHNfdG9fbGlzdChleHRzLCAmYWN0aW9ucyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShhLCAmYWN0aW9ucywgbGlzdCkgewogCiAJCS8qIERyb3AgYWN0aW9uICovCiAJCWlmIChpc190Y2ZfZ2FjdF9zaG90KGEpKSB7CkBAIC04Nzk0LDEwICs4Nzk5LDIzIEBACiAJbmV0ZGV2LT5mZWF0dXJlcyA9IGZlYXR1cmVzOwogCiAJaWYgKChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfVlhMQU5fT0ZGTE9BRF9DQVBBQkxFKSkgewotCQlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkKLQkJCWFkYXB0ZXItPmZsYWdzMiB8PSBJWEdCRV9GTEFHMl9WWExBTl9SRVJFR19ORUVERUQ7Ci0JCWVsc2UKLQkJCWl4Z2JlX2NsZWFyX3Z4bGFuX3BvcnQoYWRhcHRlcik7CisJCWlmIChmZWF0dXJlcyAmIE5FVElGX0ZfUlhDU1VNKSB7CisJCQlhZGFwdGVyLT5mbGFnczIgfD0gSVhHQkVfRkxBRzJfVURQX1RVTl9SRVJFR19ORUVERUQ7CisJCX0gZWxzZSB7CisJCQl1MzIgcG9ydF9tYXNrID0gSVhHQkVfVlhMQU5DVFJMX1ZYTEFOX1VEUFBPUlRfTUFTSzsKKworCQkJaXhnYmVfY2xlYXJfdWRwX3R1bm5lbF9wb3J0KGFkYXB0ZXIsIHBvcnRfbWFzayk7CisJCX0KKwl9CisKKwlpZiAoKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19HRU5FVkVfT0ZGTE9BRF9DQVBBQkxFKSkgeworCQlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkgeworCQkJYWRhcHRlci0+ZmxhZ3MyIHw9IElYR0JFX0ZMQUcyX1VEUF9UVU5fUkVSRUdfTkVFREVEOworCQl9IGVsc2UgeworCQkJdTMyIHBvcnRfbWFzayA9IElYR0JFX1ZYTEFOQ1RSTF9HRU5FVkVfVURQUE9SVF9NQVNLOworCisJCQlpeGdiZV9jbGVhcl91ZHBfdHVubmVsX3BvcnQoYWRhcHRlciwgcG9ydF9tYXNrKTsKKwkJfQogCX0KIAogCWlmIChuZWVkX3Jlc2V0KQpAQCAtODgxMCw2NyArODgyOCwxMTUgQEAKIH0KIAogLyoqCi0gKiBpeGdiZV9hZGRfdnhsYW5fcG9ydCAtIEdldCBub3RpZmljYXRpb25zIGFib3V0IFZYTEFOIHBvcnRzIHRoYXQgY29tZSB1cAorICogaXhnYmVfYWRkX3VkcF90dW5uZWxfcG9ydCAtIEdldCBub3RpZmljYXRpb25zIGFib3V0IGFkZGluZyBVRFAgdHVubmVsIHBvcnRzCiAgKiBAZGV2OiBUaGUgcG9ydCdzIG5ldGRldgogICogQHRpOiBUdW5uZWwgZW5kcG9pbnQgaW5mb3JtYXRpb24KICAqKi8KLXN0YXRpYyB2b2lkIGl4Z2JlX2FkZF92eGxhbl9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCB1ZHBfdHVubmVsX2luZm8gKnRpKQorc3RhdGljIHZvaWQgaXhnYmVfYWRkX3VkcF90dW5uZWxfcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCB1ZHBfdHVubmVsX2luZm8gKnRpKQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCV9fYmUxNiBwb3J0ID0gdGktPnBvcnQ7Ci0KLQlpZiAodGktPnR5cGUgIT0gVURQX1RVTk5FTF9UWVBFX1ZYTEFOKQotCQlyZXR1cm47CisJdTMyIHBvcnRfc2hpZnQgPSAwOworCXUzMiByZWc7CiAKIAlpZiAodGktPnNhX2ZhbWlseSAhPSBBRl9JTkVUKQogCQlyZXR1cm47CiAKLQlpZiAoIShhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfVlhMQU5fT0ZGTE9BRF9DQVBBQkxFKSkKLQkJcmV0dXJuOworCXN3aXRjaCAodGktPnR5cGUpIHsKKwljYXNlIFVEUF9UVU5ORUxfVFlQRV9WWExBTjoKKwkJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1ZYTEFOX09GRkxPQURfQ0FQQUJMRSkpCisJCQlyZXR1cm47CiAKLQlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydCA9PSBwb3J0KQotCQlyZXR1cm47CisJCWlmIChhZGFwdGVyLT52eGxhbl9wb3J0ID09IHBvcnQpCisJCQlyZXR1cm47CiAKLQlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydCkgewotCQluZXRkZXZfaW5mbyhkZXYsCi0JCQkgICAgIkhpdCBNYXggbnVtIG9mIFZYTEFOIHBvcnRzLCBub3QgYWRkaW5nIHBvcnQgJWRcbiIsCi0JCQkgICAgbnRvaHMocG9ydCkpOworCQlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydCkgeworCQkJbmV0ZGV2X2luZm8oZGV2LAorCQkJCSAgICAiVlhMQU4gcG9ydCAlZCBzZXQsIG5vdCBhZGRpbmcgcG9ydCAlZFxuIiwKKwkJCQkgICAgbnRvaHMoYWRhcHRlci0+dnhsYW5fcG9ydCksCisJCQkJICAgIG50b2hzKHBvcnQpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWFkYXB0ZXItPnZ4bGFuX3BvcnQgPSBwb3J0OworCQlicmVhazsKKwljYXNlIFVEUF9UVU5ORUxfVFlQRV9HRU5FVkU6CisJCWlmICghKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19HRU5FVkVfT0ZGTE9BRF9DQVBBQkxFKSkKKwkJCXJldHVybjsKKworCQlpZiAoYWRhcHRlci0+Z2VuZXZlX3BvcnQgPT0gcG9ydCkKKwkJCXJldHVybjsKKworCQlpZiAoYWRhcHRlci0+Z2VuZXZlX3BvcnQpIHsKKwkJCW5ldGRldl9pbmZvKGRldiwKKwkJCQkgICAgIkdFTkVWRSBwb3J0ICVkIHNldCwgbm90IGFkZGluZyBwb3J0ICVkXG4iLAorCQkJCSAgICBudG9ocyhhZGFwdGVyLT5nZW5ldmVfcG9ydCksCisJCQkJICAgIG50b2hzKHBvcnQpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXBvcnRfc2hpZnQgPSBJWEdCRV9WWExBTkNUUkxfR0VORVZFX1VEUFBPUlRfU0hJRlQ7CisJCWFkYXB0ZXItPmdlbmV2ZV9wb3J0ID0gcG9ydDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJcmV0dXJuOwogCX0KIAotCWFkYXB0ZXItPnZ4bGFuX3BvcnQgPSBwb3J0OwotCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVlhMQU5DVFJMLCBudG9ocyhwb3J0KSk7CisJcmVnID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1ZYTEFOQ1RSTCkgfCBudG9ocyhwb3J0KSA8PCBwb3J0X3NoaWZ0OworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVlhMQU5DVFJMLCByZWcpOwogfQogCiAvKioKLSAqIGl4Z2JlX2RlbF92eGxhbl9wb3J0IC0gR2V0IG5vdGlmaWNhdGlvbnMgYWJvdXQgVlhMQU4gcG9ydHMgdGhhdCBnbyBhd2F5CisgKiBpeGdiZV9kZWxfdWRwX3R1bm5lbF9wb3J0IC0gR2V0IG5vdGlmaWNhdGlvbnMgYWJvdXQgcmVtb3ZpbmcgVURQIHR1bm5lbCBwb3J0cwogICogQGRldjogVGhlIHBvcnQncyBuZXRkZXYKICAqIEB0aTogVHVubmVsIGVuZHBvaW50IGluZm9ybWF0aW9uCiAgKiovCi1zdGF0aWMgdm9pZCBpeGdiZV9kZWxfdnhsYW5fcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgdWRwX3R1bm5lbF9pbmZvICp0aSkKK3N0YXRpYyB2b2lkIGl4Z2JlX2RlbF91ZHBfdHVubmVsX3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgdWRwX3R1bm5lbF9pbmZvICp0aSkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHBvcnRfbWFzazsKIAotCWlmICh0aS0+dHlwZSAhPSBVRFBfVFVOTkVMX1RZUEVfVlhMQU4pCisJaWYgKHRpLT50eXBlICE9IFVEUF9UVU5ORUxfVFlQRV9WWExBTiAmJgorCSAgICB0aS0+dHlwZSAhPSBVRFBfVFVOTkVMX1RZUEVfR0VORVZFKQogCQlyZXR1cm47CiAKIAlpZiAodGktPnNhX2ZhbWlseSAhPSBBRl9JTkVUKQogCQlyZXR1cm47CiAKLQlpZiAoIShhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfVlhMQU5fT0ZGTE9BRF9DQVBBQkxFKSkKLQkJcmV0dXJuOworCXN3aXRjaCAodGktPnR5cGUpIHsKKwljYXNlIFVEUF9UVU5ORUxfVFlQRV9WWExBTjoKKwkJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1ZYTEFOX09GRkxPQURfQ0FQQUJMRSkpCisJCQlyZXR1cm47CiAKLQlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydCAhPSB0aS0+cG9ydCkgewotCQluZXRkZXZfaW5mbyhkZXYsICJQb3J0ICVkIHdhcyBub3QgZm91bmQsIG5vdCBkZWxldGluZ1xuIiwKLQkJCSAgICBudG9ocyh0aS0+cG9ydCkpOworCQlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydCAhPSB0aS0+cG9ydCkgeworCQkJbmV0ZGV2X2luZm8oZGV2LCAiVlhMQU4gcG9ydCAlZCBub3QgZm91bmRcbiIsCisJCQkJICAgIG50b2hzKHRpLT5wb3J0KSk7CisJCQlyZXR1cm47CisJCX0KKworCQlwb3J0X21hc2sgPSBJWEdCRV9WWExBTkNUUkxfVlhMQU5fVURQUE9SVF9NQVNLOworCQlicmVhazsKKwljYXNlIFVEUF9UVU5ORUxfVFlQRV9HRU5FVkU6CisJCWlmICghKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19HRU5FVkVfT0ZGTE9BRF9DQVBBQkxFKSkKKwkJCXJldHVybjsKKworCQlpZiAoYWRhcHRlci0+Z2VuZXZlX3BvcnQgIT0gdGktPnBvcnQpIHsKKwkJCW5ldGRldl9pbmZvKGRldiwgIkdFTkVWRSBwb3J0ICVkIG5vdCBmb3VuZFxuIiwKKwkJCQkgICAgbnRvaHModGktPnBvcnQpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXBvcnRfbWFzayA9IElYR0JFX1ZYTEFOQ1RSTF9HRU5FVkVfVURQUE9SVF9NQVNLOworCQlicmVhazsKKwlkZWZhdWx0OgogCQlyZXR1cm47CiAJfQogCi0JaXhnYmVfY2xlYXJfdnhsYW5fcG9ydChhZGFwdGVyKTsKLQlhZGFwdGVyLT5mbGFnczIgfD0gSVhHQkVfRkxBRzJfVlhMQU5fUkVSRUdfTkVFREVEOworCWl4Z2JlX2NsZWFyX3VkcF90dW5uZWxfcG9ydChhZGFwdGVyLCBwb3J0X21hc2spOworCWFkYXB0ZXItPmZsYWdzMiB8PSBJWEdCRV9GTEFHMl9VRFBfVFVOX1JFUkVHX05FRURFRDsKIH0KIAogc3RhdGljIGludCBpeGdiZV9uZG9fZmRiX2FkZChzdHJ1Y3QgbmRtc2cgKm5kbSwgc3RydWN0IG5sYXR0ciAqdGJbXSwKQEAgLTkxODQsOCArOTI1MCw4IEBACiAJLm5kb19icmlkZ2VfZ2V0bGluawk9IGl4Z2JlX25kb19icmlkZ2VfZ2V0bGluaywKIAkubmRvX2Rmd2RfYWRkX3N0YXRpb24JPSBpeGdiZV9md2RfYWRkLAogCS5uZG9fZGZ3ZF9kZWxfc3RhdGlvbgk9IGl4Z2JlX2Z3ZF9kZWwsCi0JLm5kb191ZHBfdHVubmVsX2FkZAk9IGl4Z2JlX2FkZF92eGxhbl9wb3J0LAotCS5uZG9fdWRwX3R1bm5lbF9kZWwJPSBpeGdiZV9kZWxfdnhsYW5fcG9ydCwKKwkubmRvX3VkcF90dW5uZWxfYWRkCT0gaXhnYmVfYWRkX3VkcF90dW5uZWxfcG9ydCwKKwkubmRvX3VkcF90dW5uZWxfZGVsCT0gaXhnYmVfZGVsX3VkcF90dW5uZWxfcG9ydCwKIAkubmRvX2ZlYXR1cmVzX2NoZWNrCT0gaXhnYmVfZmVhdHVyZXNfY2hlY2ssCiB9OwogCkBAIC05NTE3LDYgKzk1ODMsNyBAQAogCiAJLyogY29weSBuZXRkZXYgZmVhdHVyZXMgaW50byBsaXN0IG9mIHVzZXIgc2VsZWN0YWJsZSBmZWF0dXJlcyAqLwogCW5ldGRldi0+aHdfZmVhdHVyZXMgfD0gbmV0ZGV2LT5mZWF0dXJlcyB8CisJCQkgICAgICAgTkVUSUZfRl9IV19WTEFOX0NUQUdfRklMVEVSIHwKIAkJCSAgICAgICBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWCB8CiAJCQkgICAgICAgTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfAogCQkJICAgICAgIE5FVElGX0ZfUlhBTEwgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfcGh5LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9waHkuYwppbmRleCBkYjA3MzFlLi4wMjFhYjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9waHkuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9waHkuYwpAQCAtMzQ2LDggKzM0Niw4IEBACiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KLQkJLyogY2xlYXIgdmFsdWUgaWYgbm90aGluZyBmb3VuZCAqLwotCQlody0+cGh5Lm1kaW8ucHJ0YWQgPSAwOworCQkvKiBpbmRpY2F0ZSBubyBQSFkgZm91bmQgKi8KKwkJaHctPnBoeS5tZGlvLnBydGFkID0gTURJT19QUlRBRF9OT05FOwogCQlyZXR1cm4gSVhHQkVfRVJSX1BIWV9BRERSX0lOVkFMSUQ7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfcHRwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9wdHAuYwppbmRleCBlNTQzMWJmLi5hOTIyNzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9wdHAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9wdHAuYwpAQCAtMTI1NCw3ICsxMjU0LDcgQEAKIAkJYWRhcHRlci0+cHRwX2Nsb2NrID0gTlVMTDsKIAkJZV9kZXZfZXJyKCJwdHBfY2xvY2tfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycjsKLQl9IGVsc2UKKwl9IGVsc2UgaWYgKGFkYXB0ZXItPnB0cF9jbG9jaykKIAkJZV9kZXZfaW5mbygicmVnaXN0ZXJlZCBQSEMgZGV2aWNlIG9uICVzXG4iLCBuZXRkZXYtPm5hbWUpOwogCiAJLyogc2V0IGRlZmF1bHQgdGltZXN0YW1wIG1vZGUgdG8gZGlzYWJsZWQgaGVyZS4gV2UgZG8gdGhpcyBpbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmMKaW5kZXggODYxODU5OS4uN2U1ZDk4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5jCkBAIC0zMjksMTMgKzMyOSwxNSBAQAogCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fdmZzOyBpKyspCiAJCWl4Z2JlX3ZmX2NvbmZpZ3VyYXRpb24oZGV2LCAoaSB8IDB4MTAwMDAwMDApKTsKIAorCS8qIHJlc2V0IGJlZm9yZSBlbmFibGluZyBTUklPViB0byBhdm9pZCBtYWlsYm94IGlzc3VlcyAqLworCWl4Z2JlX3NyaW92X3JlaW5pdChhZGFwdGVyKTsKKwogCWVyciA9IHBjaV9lbmFibGVfc3Jpb3YoZGV2LCBudW1fdmZzKTsKIAlpZiAoZXJyKSB7CiAJCWVfZGV2X3dhcm4oIkZhaWxlZCB0byBlbmFibGUgUENJIHNyaW92OiAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJaXhnYmVfZ2V0X3ZmcyhhZGFwdGVyKTsKLQlpeGdiZV9zcmlvdl9yZWluaXQoYWRhcHRlcik7CiAKIAlyZXR1cm4gbnVtX3ZmczsKICNlbHNlCkBAIC0xMzU0LDEzICsxMzU2LDE2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IGl4Z2JlX25kb19zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MpCitpbnQgaXhnYmVfbmRvX3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2ZiwgdTE2IHZsYW4sCisJCQkgIHU4IHFvcywgX19iZTE2IHZsYW5fcHJvdG8pCiB7CiAJaW50IGVyciA9IDA7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAJaWYgKCh2ZiA+PSBhZGFwdGVyLT5udW1fdmZzKSB8fCAodmxhbiA+IDQwOTUpIHx8IChxb3MgPiA3KSkKIAkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZsYW5fcHJvdG8gIT0gaHRvbnMoRVRIX1BfODAyMVEpKQorCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKIAlpZiAodmxhbiB8fCBxb3MpIHsKIAkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHBvcnQgVkxBTiBzZXQsIGlmIHNvCiAJCSAqIHdlIGhhdmUgdG8gZGVsZXRlIHRoZSBvbGQgb25lIGZpcnN0IGJlZm9yZSB3ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmgKaW5kZXggNDdlNjVlMi4uMGM3OTc3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5oCkBAIC00Myw3ICs0Myw3IEBACiB2b2lkIGl4Z2JlX3BpbmdfYWxsX3ZmcyhzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcik7CiBpbnQgaXhnYmVfbmRvX3NldF92Zl9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHF1ZXVlLCB1OCAqbWFjKTsKIGludCBpeGdiZV9uZG9fc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHF1ZXVlLCB1MTYgdmxhbiwKLQkJCSAgIHU4IHFvcyk7CisJCQkgICB1OCBxb3MsIF9fYmUxNiB2bGFuX3Byb3RvKTsKIGludCBpeGdiZV9saW5rX21icHMoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpOwogaW50IGl4Z2JlX25kb19zZXRfdmZfYncoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLCBpbnQgbWluX3R4X3JhdGUsCiAJCQlpbnQgbWF4X3R4X3JhdGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfdHlwZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfdHlwZS5oCmluZGV4IDEyNDhhOTkuLjMxZDgyZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3R5cGUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV90eXBlLmgKQEAgLTkwLDYgKzkwLDcgQEAKICNkZWZpbmUgSVhHQkVfREVWX0lEX1g1NTBFTV9BX1NGUF9OCTB4MTVDNAogI2RlZmluZSBJWEdCRV9ERVZfSURfWDU1MEVNX0FfU0dNSUkJMHgxNUM2CiAjZGVmaW5lIElYR0JFX0RFVl9JRF9YNTUwRU1fQV9TR01JSV9MCTB4MTVDNworI2RlZmluZSBJWEdCRV9ERVZfSURfWDU1MEVNX0FfMTBHX1QJMHgxNUM4CiAjZGVmaW5lIElYR0JFX0RFVl9JRF9YNTUwRU1fQV9TRlAJMHgxNUNFCiAKIC8qIFZGIERldmljZSBJRHMgKi8KQEAgLTQ4Nyw2ICs0ODgsMTMgQEAKICNkZWZpbmUgSVhHQkVfRkhGVF9FWFQoX24pCSgweDA5ODAwICsgKChfbikgKiAweDEwMCkpIC8qIEV4dCBGbGV4aWJsZSBIb3N0CiAJCQkJCQkJICAgICogRmlsdGVyIFRhYmxlICovCiAKKy8qIG1hc2tzIGZvciBhY2Nlc3NpbmcgVlhMQU4gYW5kIEdFTkVWRSBVRFAgcG9ydHMgKi8KKyNkZWZpbmUgSVhHQkVfVlhMQU5DVFJMX1ZYTEFOX1VEUFBPUlRfTUFTSyAgICAgMHgwMDAwZmZmZiAvKiBWWExBTiBwb3J0ICovCisjZGVmaW5lIElYR0JFX1ZYTEFOQ1RSTF9HRU5FVkVfVURQUE9SVF9NQVNLICAgIDB4ZmZmZjAwMDAgLyogR0VORVZFIHBvcnQgKi8KKyNkZWZpbmUgSVhHQkVfVlhMQU5DVFJMX0FMTF9VRFBQT1JUX01BU0sgICAgICAgMHhmZmZmZmZmZiAvKiBHRU5FVkUvVlhMQU4gKi8KKworI2RlZmluZSBJWEdCRV9WWExBTkNUUkxfR0VORVZFX1VEUFBPUlRfU0hJRlQgICAxNgorCiAjZGVmaW5lIElYR0JFX0ZMRVhJQkxFX0ZJTFRFUl9DT1VOVF9NQVggICAgICAgICA0CiAjZGVmaW5lIElYR0JFX0VYVF9GTEVYSUJMRV9GSUxURVJfQ09VTlRfTUFYICAgICAyCiAKQEAgLTE4MjMsNiArMTgzMSw5IEBACiAjZGVmaW5lIElYR0JFX0xFRF9JVlJUKF9pKSAgICAgICBJWEdCRV9MRURfT0ZGU0VUKElYR0JFX0xFRF9JVlJUX0JBU0UsIF9pKQogI2RlZmluZSBJWEdCRV9MRURfQkxJTksoX2kpICAgICAgSVhHQkVfTEVEX09GRlNFVChJWEdCRV9MRURfQkxJTktfQkFTRSwgX2kpCiAjZGVmaW5lIElYR0JFX0xFRF9NT0RFX01BU0soX2kpICBJWEdCRV9MRURfT0ZGU0VUKElYR0JFX0xFRF9NT0RFX01BU0tfQkFTRSwgX2kpCisjZGVmaW5lIElYR0JFX1g1NTdfTEVEX01BTlVBTF9TRVRfTUFTSwlCSVQoOCkKKyNkZWZpbmUgSVhHQkVfWDU1N19NQVhfTEVEX0lOREVYCTMKKyNkZWZpbmUgSVhHQkVfWDU1N19MRURfUFJPVklTSU9OSU5HCTB4QzQzMAogCiAvKiBMRUQgbW9kZXMgKi8KICNkZWZpbmUgSVhHQkVfTEVEX0xJTktfVVAgICAgICAgMHgwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV94NTUwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV94NTUwLmMKaW5kZXggNDcxNmNhNC4uN2U2YjkyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfeDU1MC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3g1NTAuYwpAQCAtMjk1LDYgKzI5NSwxMiBAQAogCWNhc2UgSVhHQkVfREVWX0lEX1g1NTBFTV9BX0tSX0w6CiAJCWh3LT5waHkudHlwZSA9IGl4Z2JlX3BoeV94NTUwZW1fa3I7CiAJCWJyZWFrOworCWNhc2UgSVhHQkVfREVWX0lEX1g1NTBFTV9BXzEwR19UOgorCQlpZiAoaHctPmJ1cy5sYW5faWQpCisJCQlody0+cGh5LnBoeV9zZW1hcGhvcmVfbWFzayA9IElYR0JFX0dTU1JfUEhZMV9TTTsKKwkJZWxzZQorCQkJaHctPnBoeS5waHlfc2VtYXBob3JlX21hc2sgPSBJWEdCRV9HU1NSX1BIWTBfU007CisJCS8qIEZhbGx0aHJvdWdoICovCiAJY2FzZSBJWEdCRV9ERVZfSURfWDU1MEVNX1hfMUdfVDoKIAljYXNlIElYR0JFX0RFVl9JRF9YNTUwRU1fWF8xMEdfVDoKIAkJcmV0dXJuIGl4Z2JlX2lkZW50aWZ5X3BoeV9nZW5lcmljKGh3KTsKQEAgLTE0NTMsNyArMTQ1OSw3IEBACiAJLyogQ29uZmlndXJlIGludGVybmFsIFBIWSBmb3IgS1IvS1guICovCiAJaXhnYmVfc2V0dXBfa3Jfc3BlZWRfeDU1MGVtKGh3LCBzcGVlZCk7CiAKLQlpZiAoIWh3LT5waHkubWRpby5wcnRhZCB8fCBody0+cGh5Lm1kaW8ucHJ0YWQgPT0gMHhGRkZGKQorCWlmIChody0+cGh5Lm1kaW8ucHJ0YWQgPT0gTURJT19QUlRBRF9OT05FKQogCQlyZXR1cm4gSVhHQkVfRVJSX1BIWV9BRERSX0lOVkFMSUQ7CiAKIAkvKiBHZXQgZXh0ZXJuYWwgUEhZIGRldmljZSBpZCAqLwpAQCAtMjExNCw2ICsyMTIwLDUwIEBACiAJcmV0dXJuIGl4Z2JlX2VuYWJsZV9sYXNpX2V4dF90X3g1NTBlbShodyk7CiB9CiAKKy8qKgorICogIGl4Z2JlX2xlZF9vbl90X3g1NTBlbSAtIFR1cm5zIG9uIHRoZSBzb2Z0d2FyZSBjb250cm9sbGFibGUgTEVEcy4KKyAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCisgKiAgQGxlZF9pZHg6IGxlZCBudW1iZXIgdG8gdHVybiBvbgorICoqLworc3RhdGljIHMzMiBpeGdiZV9sZWRfb25fdF94NTUwZW0oc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGxlZF9pZHgpCit7CisJdTE2IHBoeV9kYXRhOworCisJaWYgKGxlZF9pZHggPj0gSVhHQkVfWDU1N19NQVhfTEVEX0lOREVYKQorCQlyZXR1cm4gSVhHQkVfRVJSX1BBUkFNOworCisJLyogVG8gdHVybiBvbiB0aGUgTEVELCBzZXQgbW9kZSB0byBPTi4gKi8KKwlody0+cGh5Lm9wcy5yZWFkX3JlZyhodywgSVhHQkVfWDU1N19MRURfUFJPVklTSU9OSU5HICsgbGVkX2lkeCwKKwkJCSAgICAgSVhHQkVfTURJT19WRU5ET1JfU1BFQ0lGSUNfMV9ERVZfVFlQRSwgJnBoeV9kYXRhKTsKKwlwaHlfZGF0YSB8PSBJWEdCRV9YNTU3X0xFRF9NQU5VQUxfU0VUX01BU0s7CisJaHctPnBoeS5vcHMud3JpdGVfcmVnKGh3LCBJWEdCRV9YNTU3X0xFRF9QUk9WSVNJT05JTkcgKyBsZWRfaWR4LAorCQkJICAgICAgSVhHQkVfTURJT19WRU5ET1JfU1BFQ0lGSUNfMV9ERVZfVFlQRSwgcGh5X2RhdGEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIGl4Z2JlX2xlZF9vZmZfdF94NTUwZW0gLSBUdXJucyBvZmYgdGhlIHNvZnR3YXJlIGNvbnRyb2xsYWJsZSBMRURzLgorICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKKyAqICBAbGVkX2lkeDogbGVkIG51bWJlciB0byB0dXJuIG9mZgorICoqLworc3RhdGljIHMzMiBpeGdiZV9sZWRfb2ZmX3RfeDU1MGVtKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiBsZWRfaWR4KQoreworCXUxNiBwaHlfZGF0YTsKKworCWlmIChsZWRfaWR4ID49IElYR0JFX1g1NTdfTUFYX0xFRF9JTkRFWCkKKwkJcmV0dXJuIElYR0JFX0VSUl9QQVJBTTsKKworCS8qIFRvIHR1cm4gb24gdGhlIExFRCwgc2V0IG1vZGUgdG8gT04uICovCisJaHctPnBoeS5vcHMucmVhZF9yZWcoaHcsIElYR0JFX1g1NTdfTEVEX1BST1ZJU0lPTklORyArIGxlZF9pZHgsCisJCQkgICAgIElYR0JFX01ESU9fVkVORE9SX1NQRUNJRklDXzFfREVWX1RZUEUsICZwaHlfZGF0YSk7CisJcGh5X2RhdGEgJj0gfklYR0JFX1g1NTdfTEVEX01BTlVBTF9TRVRfTUFTSzsKKwlody0+cGh5Lm9wcy53cml0ZV9yZWcoaHcsIElYR0JFX1g1NTdfTEVEX1BST1ZJU0lPTklORyArIGxlZF9pZHgsCisJCQkgICAgICBJWEdCRV9NRElPX1ZFTkRPUl9TUEVDSUZJQ18xX0RFVl9UWVBFLCBwaHlfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKwogLyoqIGl4Z2JlX2dldF9sY2RfeDU1MGVtIC0gRGV0ZXJtaW5lIGxvd2VzdCBjb21tb24gZGVub21pbmF0b3IKICAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCiAgKiAgQGxjZF9zcGVlZDogcG9pbnRlciB0byBsb3dlc3QgY29tbW9uIGxpbmsgc3BlZWQKQEAgLTIzNDQsMTggKzIzOTQsMTIgQEAKIAkvKiBJZiBYNTUyIChYNTUwRU1fYSkgYW5kIE1ESU8gaXMgY29ubmVjdGVkIHRvIGV4dGVybmFsIFBIWSwgdGhlbiBzZXQKIAkgKiBQSFkgYWRkcmVzcy4gVGhpcyByZWdpc3RlciBmaWVsZCB3YXMgaGFzIG9ubHkgYmVlbiB1c2VkIGZvciBYNTUyLgogCSAqLwotCWlmICghaHctPnBoeS5ud19tbmdfaWZfc2VsKSB7Ci0JCWlmIChody0+bWFjLnR5cGUgPT0gaXhnYmVfbWFjX3g1NTBlbV9hKSB7Ci0JCQlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IGh3LT5iYWNrOwotCi0JCQllX3dhcm4oZHJ2LCAibndfbW5nX2lmX3NlbCBub3Qgc2V0XG4iKTsKLQkJfQotCQlyZXR1cm47CisJaWYgKGh3LT5tYWMudHlwZSA9PSBpeGdiZV9tYWNfeDU1MGVtX2EgJiYKKwkgICAgaHctPnBoeS5ud19tbmdfaWZfc2VsICYgSVhHQkVfTldfTU5HX0lGX1NFTF9NRElPX0FDVCkgeworCQlody0+cGh5Lm1kaW8ucHJ0YWQgPSAoaHctPnBoeS5ud19tbmdfaWZfc2VsICYKKwkJCQkgICAgICBJWEdCRV9OV19NTkdfSUZfU0VMX01ESU9fUEhZX0FERCkgPj4KKwkJCQkgICAgIElYR0JFX05XX01OR19JRl9TRUxfTURJT19QSFlfQUREX1NISUZUOwogCX0KLQotCWh3LT5waHkubWRpby5wcnRhZCA9IChody0+cGh5Lm53X21uZ19pZl9zZWwgJgotCQkJICAgICAgSVhHQkVfTldfTU5HX0lGX1NFTF9NRElPX1BIWV9BREQpID4+Ci0JCQkgICAgIElYR0JFX05XX01OR19JRl9TRUxfTURJT19QSFlfQUREX1NISUZUOwogfQogCiAvKiogaXhnYmVfaW5pdF9waHlfb3BzX1g1NTBlbSAtIFBIWS9TRlAgc3BlY2lmaWMgaW5pdApAQCAtMjQ1Niw2ICsyNTAwLDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBJWEdCRV9ERVZfSURfWDU1MEVNX1hfMUdfVDoKIAljYXNlIElYR0JFX0RFVl9JRF9YNTUwRU1fWF8xMEdfVDoKKwljYXNlIElYR0JFX0RFVl9JRF9YNTUwRU1fQV8xMEdfVDoKIAkJbWVkaWFfdHlwZSA9IGl4Z2JlX21lZGlhX3R5cGVfY29wcGVyOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMjUxNCw2ICsyNTU5LDkgQEAKIAogCXN3aXRjaCAoaHctPmRldmljZV9pZCkgewogCWNhc2UgSVhHQkVfREVWX0lEX1g1NTBFTV9YXzEwR19UOgorCWNhc2UgSVhHQkVfREVWX0lEX1g1NTBFTV9BX1NHTUlJOgorCWNhc2UgSVhHQkVfREVWX0lEX1g1NTBFTV9BX1NHTUlJX0w6CisJY2FzZSBJWEdCRV9ERVZfSURfWDU1MEVNX0FfMTBHX1Q6CiAJY2FzZSBJWEdCRV9ERVZfSURfWDU1MEVNX0FfU0ZQOgogCQkvKiBDb25maWcgTURJTyBjbG9jayBzcGVlZCBiZWZvcmUgdGhlIGZpcnN0IE1ESU8gUEhZIGFjY2VzcyAqLwogCQlobHJlZzAgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfSExSRUcwKTsKQEAgLTI4NTMsOCArMjkwMSw2IEBACiAJLndyaXRlX2FuYWxvZ19yZWc4CQk9IE5VTEwsIFwKIAkuc2V0X3J4cGJhCQkJPSAmaXhnYmVfc2V0X3J4cGJhX2dlbmVyaWMsIFwKIAkuY2hlY2tfbGluawkJCT0gJml4Z2JlX2NoZWNrX21hY19saW5rX2dlbmVyaWMsIFwKLQkubGVkX29uCQkJCT0gJml4Z2JlX2xlZF9vbl9nZW5lcmljLCBcCi0JLmxlZF9vZmYJCQk9ICZpeGdiZV9sZWRfb2ZmX2dlbmVyaWMsIFwKIAkuYmxpbmtfbGVkX3N0YXJ0CQk9ICZpeGdiZV9ibGlua19sZWRfc3RhcnRfWDU0MCwgXAogCS5ibGlua19sZWRfc3RvcAkJCT0gJml4Z2JlX2JsaW5rX2xlZF9zdG9wX1g1NDAsIFwKIAkuc2V0X3JhcgkJCT0gJml4Z2JlX3NldF9yYXJfZ2VuZXJpYywgXApAQCAtMjg4Niw2ICsyOTMyLDggQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpeGdiZV9tYWNfb3BlcmF0aW9ucyBtYWNfb3BzX1g1NTAgPSB7CiAJWDU1MF9DT01NT05fTUFDCisJLmxlZF9vbgkJCT0gaXhnYmVfbGVkX29uX2dlbmVyaWMsCisJLmxlZF9vZmYJCT0gaXhnYmVfbGVkX29mZl9nZW5lcmljLAogCS5yZXNldF9odwkJPSAmaXhnYmVfcmVzZXRfaHdfWDU0MCwKIAkuZ2V0X21lZGlhX3R5cGUJCT0gJml4Z2JlX2dldF9tZWRpYV90eXBlX1g1NDAsCiAJLmdldF9zYW5fbWFjX2FkZHIJPSAmaXhnYmVfZ2V0X3Nhbl9tYWNfYWRkcl9nZW5lcmljLApAQCAtMjkwNCw2ICsyOTUyLDggQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpeGdiZV9tYWNfb3BlcmF0aW9ucyBtYWNfb3BzX1g1NTBFTV94ID0gewogCVg1NTBfQ09NTU9OX01BQworCS5sZWRfb24JCQk9IGl4Z2JlX2xlZF9vbl90X3g1NTBlbSwKKwkubGVkX29mZgkJPSBpeGdiZV9sZWRfb2ZmX3RfeDU1MGVtLAogCS5yZXNldF9odwkJPSAmaXhnYmVfcmVzZXRfaHdfWDU1MGVtLAogCS5nZXRfbWVkaWFfdHlwZQkJPSAmaXhnYmVfZ2V0X21lZGlhX3R5cGVfWDU1MGVtLAogCS5nZXRfc2FuX21hY19hZGRyCT0gTlVMTCwKQEAgLTI5MjIsNiArMjk3Miw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXhnYmVfbWFjX29wZXJhdGlvbnMgbWFjX29wc194NTUwZW1fYSA9IHsKIAlYNTUwX0NPTU1PTl9NQUMKKwkubGVkX29uCQkJPSBpeGdiZV9sZWRfb25fdF94NTUwZW0sCisJLmxlZF9vZmYJCT0gaXhnYmVfbGVkX29mZl90X3g1NTBlbSwKIAkucmVzZXRfaHcJCT0gaXhnYmVfcmVzZXRfaHdfWDU1MGVtLAogCS5nZXRfbWVkaWFfdHlwZQkJPSBpeGdiZV9nZXRfbWVkaWFfdHlwZV9YNTUwZW0sCiAJLmdldF9zYW5fbWFjX2FkZHIJPSBOVUxMLApAQCAtMjk5Nyw2ICszMDQ5LDggQEAKIAkuaWRlbnRpZnkJCT0gJml4Z2JlX2lkZW50aWZ5X3BoeV94NTUwZW0sCiAJLnJlYWRfcmVnCQk9ICZpeGdiZV9yZWFkX3BoeV9yZWdfeDU1MGEsCiAJLndyaXRlX3JlZwkJPSAmaXhnYmVfd3JpdGVfcGh5X3JlZ194NTUwYSwKKwkucmVhZF9yZWdfbWRpCQk9ICZpeGdiZV9yZWFkX3BoeV9yZWdfbWRpLAorCS53cml0ZV9yZWdfbWRpCQk9ICZpeGdiZV93cml0ZV9waHlfcmVnX21kaSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgaXhnYmVfbXZhbHNfWDU1MFtJWEdCRV9NVkFMU19JRFhfTElNSVRdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9peGdiZXZmLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2l4Z2JldmYuaAppbmRleCBiZTUyZjU5Li41NjM5ZmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2l4Z2JldmYuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2l4Z2JldmYuaApAQCAtNTAyLDEyICs1MDIsOSBAQAogdm9pZCBpeGdiZV9uYXBpX2FkZF9hbGwoc3RydWN0IGl4Z2JldmZfYWRhcHRlciAqYWRhcHRlcik7CiB2b2lkIGl4Z2JlX25hcGlfZGVsX2FsbChzdHJ1Y3QgaXhnYmV2Zl9hZGFwdGVyICphZGFwdGVyKTsKIAotI2lmZGVmIERFQlVHCi1jaGFyICppeGdiZXZmX2dldF9od19kZXZfbmFtZShzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKLSNkZWZpbmUgaHdfZGJnKGh3LCBmb3JtYXQsIGFyZy4uLikgXAotCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmb3JtYXQsIGl4Z2JldmZfZ2V0X2h3X2Rldl9uYW1lKGh3KSwgIyNhcmcpCi0jZWxzZQotI2RlZmluZSBod19kYmcoaHcsIGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgorI2RlZmluZSBpeGdiZXZmX2h3X3RvX25ldGRldihodykgXAorCSgoKHN0cnVjdCBpeGdiZXZmX2FkYXB0ZXIgKikoaHcpLT5iYWNrKS0+bmV0ZGV2KQogCisjZGVmaW5lIGh3X2RiZyhodywgZm9ybWF0LCBhcmcuLi4pIFwKKwluZXRkZXZfZGJnKGl4Z2JldmZfaHdfdG9fbmV0ZGV2KGh3KSwgZm9ybWF0LCAjIyBhcmcpCiAjZW5kaWYgLyogX0lYR0JFVkZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zl9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2l4Z2JldmZfbWFpbi5jCmluZGV4IGQ5ZDY2MTYuLjdlYWFjMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9peGdiZXZmX21haW4uYwpAQCAtMTYxMiw3ICsxNjEyLDcgQEAKIAkJdHhkY3RsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1ZGVFhEQ1RMKHJlZ19pZHgpKTsKIAl9ICB3aGlsZSAoLS13YWl0X2xvb3AgJiYgISh0eGRjdGwgJiBJWEdCRV9UWERDVExfRU5BQkxFKSk7CiAJaWYgKCF3YWl0X2xvb3ApCi0JCXByX2VycigiQ291bGQgbm90IGVuYWJsZSBUeCBRdWV1ZSAlZFxuIiwgcmVnX2lkeCk7CisJCWh3X2RiZyhodywgIkNvdWxkIG5vdCBlbmFibGUgVHggUXVldWUgJWRcbiIsIHJlZ19pZHgpOwogfQogCiAvKioKQEAgLTE4MTAsOCArMTgxMCwxMCBAQAogCWlmIChody0+bWFjLnR5cGUgPj0gaXhnYmVfbWFjX1g1NTBfdmYpCiAJCWl4Z2JldmZfc2V0dXBfdmZtcnFjKGFkYXB0ZXIpOwogCisJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tYnhfbG9jayk7CiAJLyogbm90aWZ5IHRoZSBQRiBvZiBvdXIgaW50ZW50IHRvIHVzZSB0aGlzIHNpemUgb2YgZnJhbWUgKi8KIAlyZXQgPSBody0+bWFjLm9wcy5zZXRfcmxwbWwoaHcsIG5ldGRldi0+bXR1ICsgRVRIX0hMRU4gKyBFVEhfRkNTX0xFTik7CisJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1ieF9sb2NrKTsKIAlpZiAocmV0KQogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkiRmFpbGVkIHRvIHNldCBNVFUgYXQgJWRcbiIsIG5ldGRldi0+bXR1KTsKQEAgLTI5OTMsNiArMjk5NSw3IEBACiAgKiovCiBpbnQgaXhnYmV2Zl9zZXR1cF90eF9yZXNvdXJjZXMoc3RydWN0IGl4Z2JldmZfcmluZyAqdHhfcmluZykKIHsKKwlzdHJ1Y3QgaXhnYmV2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYodHhfcmluZy0+bmV0ZGV2KTsKIAlpbnQgc2l6ZTsKIAogCXNpemUgPSBzaXplb2Yoc3RydWN0IGl4Z2JldmZfdHhfYnVmZmVyKSAqIHR4X3JpbmctPmNvdW50OwpAQCAtMzc1Nyw4ICszNzYwLDEwIEBACiAJaWYgKChuZXdfbXR1IDwgNjgpIHx8IChtYXhfZnJhbWUgPiBtYXhfcG9zc2libGVfZnJhbWUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWJ4X2xvY2spOwogCS8qIG5vdGlmeSB0aGUgUEYgb2Ygb3VyIGludGVudCB0byB1c2UgdGhpcyBzaXplIG9mIGZyYW1lICovCiAJcmV0ID0gaHctPm1hYy5vcHMuc2V0X3JscG1sKGh3LCBtYXhfZnJhbWUpOworCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tYnhfbG9jayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvdmYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvdmYuYwppbmRleCBhNTJmNzBlLi5kNDZiYTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL3ZmLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi92Zi5jCkBAIC0yODQsNyArMjg0LDggQEAKIAlpZiAoYWRkcikKIAkJZXRoZXJfYWRkcl9jb3B5KG1zZ19hZGRyLCBhZGRyKTsKIAotCXJldF92YWwgPSBpeGdiZXZmX3dyaXRlX21zZ19yZWFkX2FjayhodywgbXNnYnVmLCBtc2didWYsIDMpOworCXJldF92YWwgPSBpeGdiZXZmX3dyaXRlX21zZ19yZWFkX2FjayhodywgbXNnYnVmLCBtc2didWYsCisJCQkJCSAgICAgc2l6ZW9mKG1zZ2J1ZikgLyBzaXplb2YodTMyKSk7CiAJaWYgKCFyZXRfdmFsKSB7CiAJCW1zZ2J1ZlswXSAmPSB+SVhHQkVfVlRfTVNHVFlQRV9DVFM7CiAKQEAgLTQ0MSw3ICs0NDIsOCBAQAogCW1zZ2J1ZlswXSA9IElYR0JFX1ZGX1NFVF9NQUNfQUREUjsKIAlldGhlcl9hZGRyX2NvcHkobXNnX2FkZHIsIGFkZHIpOwogCi0JcmV0X3ZhbCA9IGl4Z2JldmZfd3JpdGVfbXNnX3JlYWRfYWNrKGh3LCBtc2didWYsIG1zZ2J1ZiwgMik7CisJcmV0X3ZhbCA9IGl4Z2JldmZfd3JpdGVfbXNnX3JlYWRfYWNrKGh3LCBtc2didWYsIG1zZ2J1ZiwKKwkJCQkJICAgICBzaXplb2YobXNnYnVmKSAvIHNpemVvZih1MzIpKTsKIAogCW1zZ2J1ZlswXSAmPSB+SVhHQkVfVlRfTVNHVFlQRV9DVFM7CiAKQEAgLTU1MSw3ICs1NTMsOCBAQAogCW1zZ2J1ZlswXSA9IElYR0JFX1ZGX1VQREFURV9YQ0FTVF9NT0RFOwogCW1zZ2J1ZlsxXSA9IHhjYXN0X21vZGU7CiAKLQllcnIgPSBpeGdiZXZmX3dyaXRlX21zZ19yZWFkX2FjayhodywgbXNnYnVmLCBtc2didWYsIDIpOworCWVyciA9IGl4Z2JldmZfd3JpdGVfbXNnX3JlYWRfYWNrKGh3LCBtc2didWYsIG1zZ2J1ZiwKKwkJCQkJIHNpemVvZihtc2didWYpIC8gc2l6ZW9mKHUzMikpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTU4OCw3ICs1OTEsOCBAQAogCS8qIFNldHRpbmcgdGhlIDggYml0IGZpZWxkIE1TRyBJTkZPIHRvIFRSVUUgaW5kaWNhdGVzICJhZGQiICovCiAJbXNnYnVmWzBdIHw9IHZsYW5fb24gPDwgSVhHQkVfVlRfTVNHSU5GT19TSElGVDsKIAotCWVyciA9IGl4Z2JldmZfd3JpdGVfbXNnX3JlYWRfYWNrKGh3LCBtc2didWYsIG1zZ2J1ZiwgMik7CisJZXJyID0gaXhnYmV2Zl93cml0ZV9tc2dfcmVhZF9hY2soaHcsIG1zZ2J1ZiwgbXNnYnVmLAorCQkJCQkgc2l6ZW9mKG1zZ2J1ZikgLyBzaXplb2YodTMyKSk7CiAJaWYgKGVycikKIAkJZ290byBtYnhfZXJyOwogCkBAIC03OTEsNyArNzk1LDggQEAKIAltc2didWZbMF0gPSBJWEdCRV9WRl9TRVRfTFBFOwogCW1zZ2J1ZlsxXSA9IG1heF9zaXplOwogCi0JcmV0X3ZhbCA9IGl4Z2JldmZfd3JpdGVfbXNnX3JlYWRfYWNrKGh3LCBtc2didWYsIG1zZ2J1ZiwgMik7CisJcmV0X3ZhbCA9IGl4Z2JldmZfd3JpdGVfbXNnX3JlYWRfYWNrKGh3LCBtc2didWYsIG1zZ2J1ZiwKKwkJCQkJICAgICBzaXplb2YobXNnYnVmKSAvIHNpemVvZih1MzIpKTsKIAlpZiAocmV0X3ZhbCkKIAkJcmV0dXJuIHJldF92YWw7CiAJaWYgKChtc2didWZbMF0gJiBJWEdCRV9WRl9TRVRfTFBFKSAmJgpAQCAtODM3LDcgKzg0Miw4IEBACiAJbXNnWzFdID0gYXBpOwogCW1zZ1syXSA9IDA7CiAKLQllcnIgPSBpeGdiZXZmX3dyaXRlX21zZ19yZWFkX2FjayhodywgbXNnLCBtc2csIDMpOworCWVyciA9IGl4Z2JldmZfd3JpdGVfbXNnX3JlYWRfYWNrKGh3LCBtc2csIG1zZywKKwkJCQkJIHNpemVvZihtc2cpIC8gc2l6ZW9mKHUzMikpOwogCWlmICghZXJyKSB7CiAJCW1zZ1swXSAmPSB+SVhHQkVfVlRfTVNHVFlQRV9DVFM7CiAKQEAgLTg4Nyw3ICs4OTMsOCBAQAogCW1zZ1swXSA9IElYR0JFX1ZGX0dFVF9RVUVVRTsKIAltc2dbMV0gPSBtc2dbMl0gPSBtc2dbM10gPSBtc2dbNF0gPSAwOwogCi0JZXJyID0gaXhnYmV2Zl93cml0ZV9tc2dfcmVhZF9hY2soaHcsIG1zZywgbXNnLCA1KTsKKwllcnIgPSBpeGdiZXZmX3dyaXRlX21zZ19yZWFkX2FjayhodywgbXNnLCBtc2csCisJCQkJCSBzaXplb2YobXNnKSAvIHNpemVvZih1MzIpKTsKIAlpZiAoIWVycikgewogCQltc2dbMF0gJj0gfklYR0JFX1ZUX01TR1RZUEVfQ1RTOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bWRpby5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm1kaW8uYwppbmRleCA4OTgyYzg4Li5hMGQxYjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bWRpby5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZtZGlvLmMKQEAgLTIxMSw4ICsyMTEsNyBAQAogCWRldi0+cmVncyA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSk7CiAJaWYgKCFkZXYtPnJlZ3MpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIHJlbWFwIFNNSSByZWdpc3RlclxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X21kaW87CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+c21pX2J1c3lfd2FpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bmV0YS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm5ldGEuYwppbmRleCBkNDFjMjhkLi41Y2IwN2MyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bmV0YS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZuZXRhLmMKQEAgLTM4Miw3ICszODIsOCBAQAogCXN0cnVjdCBtdm5ldGFfcnhfcXVldWUgKnJ4cXM7CiAJc3RydWN0IG12bmV0YV90eF9xdWV1ZSAqdHhxczsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCXN0cnVjdCBub3RpZmllcl9ibG9jayBjcHVfbm90aWZpZXI7CisJc3RydWN0IGhsaXN0X25vZGUgbm9kZV9vbmxpbmU7CisJc3RydWN0IGhsaXN0X25vZGUgbm9kZV9kZWFkOwogCWludCByeHFfZGVmOwogCS8qIFByb3RlY3QgdGhlIGFjY2VzcyB0byB0aGUgcGVyY3B1IGludGVycnVwdCByZWdpc3RlcnMsCiAJICogZW5zdXJpbmcgdGhhdCB0aGUgY29uZmlndXJhdGlvbiByZW1haW5zIGNvaGVyZW50LgpAQCAtMzk5LDcgKzQwMCw2IEBACiAJdTE2IHJ4X3Jpbmdfc2l6ZTsKIAogCXN0cnVjdCBtaWlfYnVzICptaWlfYnVzOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlfZGV2OwogCXBoeV9pbnRlcmZhY2VfdCBwaHlfaW50ZXJmYWNlOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGh5X25vZGU7CiAJdW5zaWduZWQgaW50IGxpbms7CkBAIC01NzQsNiArNTc0LDcgQEAKIAlpbnQgbmV4dF9kZXNjX3RvX3Byb2M7CiB9OwogCitzdGF0aWMgZW51bSBjcHVocF9zdGF0ZSBvbmxpbmVfaHBzdGF0ZTsKIC8qIFRoZSBoYXJkd2FyZSBzdXBwb3J0cyBlaWdodCAoOCkgcnggcXVldWVzLCBidXQgd2UgYXJlIG9ubHkgYWxsb3dpbmcKICAqIHRoZSBmaXJzdCBvbmUgdG8gYmUgdXNlZC4gVGhlcmVmb3JlLCBsZXQncyBqdXN0IGFsbG9jYXRlIG9uZSBxdWV1ZS4KICAqLwpAQCAtNjM1LDggKzYzNiw5IEBACiB9CiAKIC8qIEdldCBTeXN0ZW0gTmV0d29yayBTdGF0aXN0aWNzICovCi1zdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKm12bmV0YV9nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkgICAgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCitzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICoKK212bmV0YV9nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQogewogCXN0cnVjdCBtdm5ldGFfcG9ydCAqcHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGludCBzdGFydDsKQEAgLTI2NTEsNiArMjY1Myw3IEBACiAJdTMyIGNhdXNlX3J4X3R4OwogCWludCByeF9xdWV1ZTsKIAlzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwID0gbmV0ZGV2X3ByaXYobmFwaS0+ZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBwLT5kZXY7CiAJc3RydWN0IG12bmV0YV9wY3B1X3BvcnQgKnBvcnQgPSB0aGlzX2NwdV9wdHIocHAtPnBvcnRzKTsKIAogCWlmICghbmV0aWZfcnVubmluZyhwcC0+ZGV2KSkgewpAQCAtMjY2OCw3ICsyNjcxLDcgQEAKIAkJCQkoTVZORVRBX0NBVVNFX1BIWV9TVEFUVVNfQ0hBTkdFIHwKIAkJCQkgTVZORVRBX0NBVVNFX0xJTktfQ0hBTkdFIHwKIAkJCQkgTVZORVRBX0NBVVNFX1BTQ19TWU5DX0NIQU5HRSkpKSB7Ci0JCQltdm5ldGFfZml4ZWRfbGlua191cGRhdGUocHAsIHBwLT5waHlfZGV2KTsKKwkJCW12bmV0YV9maXhlZF9saW5rX3VwZGF0ZShwcCwgbmRldi0+cGh5ZGV2KTsKIAkJfQogCX0KIApAQCAtMjk2Myw2ICsyOTY2LDcgQEAKIHN0YXRpYyB2b2lkIG12bmV0YV9zdGFydF9kZXYoc3RydWN0IG12bmV0YV9wb3J0ICpwcCkKIHsKIAlpbnQgY3B1OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcHAtPmRldjsKIAogCW12bmV0YV9tYXhfcnhfc2l6ZV9zZXQocHAsIHBwLT5wa3Rfc2l6ZSk7CiAJbXZuZXRhX3R4cV9tYXhfdHhfc2l6ZV9zZXQocHAsIHBwLT5wa3Rfc2l6ZSk7CkBAIC0yOTg1LDE1ICsyOTg5LDE2IEBACiAJCSAgICBNVk5FVEFfQ0FVU0VfTElOS19DSEFOR0UgfAogCQkgICAgTVZORVRBX0NBVVNFX1BTQ19TWU5DX0NIQU5HRSk7CiAKLQlwaHlfc3RhcnQocHAtPnBoeV9kZXYpOworCXBoeV9zdGFydChuZGV2LT5waHlkZXYpOwogCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMocHAtPmRldik7CiB9CiAKIHN0YXRpYyB2b2lkIG12bmV0YV9zdG9wX2RldihzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwKQogewogCXVuc2lnbmVkIGludCBjcHU7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwcC0+ZGV2OwogCi0JcGh5X3N0b3AocHAtPnBoeV9kZXYpOworCXBoeV9zdG9wKG5kZXYtPnBoeWRldik7CiAKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQlzdHJ1Y3QgbXZuZXRhX3BjcHVfcG9ydCAqcG9ydCA9IHBlcl9jcHVfcHRyKHBwLT5wb3J0cywgY3B1KTsKQEAgLTMxNjYsNyArMzE3MSw3IEBACiBzdGF0aWMgdm9pZCBtdm5ldGFfYWRqdXN0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJc3RydWN0IG12bmV0YV9wb3J0ICpwcCA9IG5ldGRldl9wcml2KG5kZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBwcC0+cGh5X2RldjsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gbmRldi0+cGh5ZGV2OwogCWludCBzdGF0dXNfY2hhbmdlID0gMDsKIAogCWlmIChwaHlkZXYtPmxpbmspIHsKQEAgLTMyNDQsNyArMzI0OSw2IEBACiAJcGh5X2Rldi0+c3VwcG9ydGVkICY9IFBIWV9HQklUX0ZFQVRVUkVTOwogCXBoeV9kZXYtPmFkdmVydGlzaW5nID0gcGh5X2Rldi0+c3VwcG9ydGVkOwogCi0JcHAtPnBoeV9kZXYgPSBwaHlfZGV2OwogCXBwLT5saW5rICAgID0gMDsKIAlwcC0+ZHVwbGV4ICA9IDA7CiAJcHAtPnNwZWVkICAgPSAwOwpAQCAtMzI1NCw4ICszMjU4LDkgQEAKIAogc3RhdGljIHZvaWQgbXZuZXRhX21kaW9fcmVtb3ZlKHN0cnVjdCBtdm5ldGFfcG9ydCAqcHApCiB7Ci0JcGh5X2Rpc2Nvbm5lY3QocHAtPnBoeV9kZXYpOwotCXBwLT5waHlfZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBwLT5kZXY7CisKKwlwaHlfZGlzY29ubmVjdChuZGV2LT5waHlkZXYpOwogfQogCiAvKiBFbGVjdGluZyBhIENQVSBtdXN0IGJlIGRvbmUgaW4gYW4gYXRvbWljIHdheTogaXQgc2hvdWxkIGJlIGRvbmUKQEAgLTMzMTEsMTAxICszMzE2LDEwNCBAQAogCX0KIH07CiAKLXN0YXRpYyBpbnQgbXZuZXRhX3BlcmNwdV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQorc3RhdGljIGludCBtdm5ldGFfY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKIHsKLQlzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwID0gY29udGFpbmVyX29mKG5mYiwgc3RydWN0IG12bmV0YV9wb3J0LAotCQkJCQkgICAgICBjcHVfbm90aWZpZXIpOwotCWludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1LCBvdGhlcl9jcHU7CisJaW50IG90aGVyX2NwdTsKKwlzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgbXZuZXRhX3BvcnQsCisJCQkJCQkgIG5vZGVfb25saW5lKTsKIAlzdHJ1Y3QgbXZuZXRhX3BjcHVfcG9ydCAqcG9ydCA9IHBlcl9jcHVfcHRyKHBwLT5wb3J0cywgY3B1KTsKIAotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX09OTElORV9GUk9aRU46Ci0JY2FzZSBDUFVfRE9XTl9GQUlMRUQ6Ci0JY2FzZSBDUFVfRE9XTl9GQUlMRURfRlJPWkVOOgotCQlzcGluX2xvY2soJnBwLT5sb2NrKTsKLQkJLyogQ29uZmlndXJpbmcgdGhlIGRyaXZlciBmb3IgYSBuZXcgQ1BVIHdoaWxlIHRoZQotCQkgKiBkcml2ZXIgaXMgc3RvcHBpbmcgaXMgcmFjeSwgc28ganVzdCBhdm9pZCBpdC4KLQkJICovCi0JCWlmIChwcC0+aXNfc3RvcHBlZCkgewotCQkJc3Bpbl91bmxvY2soJnBwLT5sb2NrKTsKLQkJCWJyZWFrOworCisJc3Bpbl9sb2NrKCZwcC0+bG9jayk7CisJLyoKKwkgKiBDb25maWd1cmluZyB0aGUgZHJpdmVyIGZvciBhIG5ldyBDUFUgd2hpbGUgdGhlIGRyaXZlciBpcworCSAqIHN0b3BwaW5nIGlzIHJhY3ksIHNvIGp1c3QgYXZvaWQgaXQuCisJICovCisJaWYgKHBwLT5pc19zdG9wcGVkKSB7CisJCXNwaW5fdW5sb2NrKCZwcC0+bG9jayk7CisJCXJldHVybiAwOworCX0KKwluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMocHAtPmRldik7CisKKwkvKgorCSAqIFdlIGhhdmUgdG8gc3luY2hyb25pc2Ugb24gdGhhIG5hcGkgb2YgZWFjaCBDUFUgZXhjZXB0IHRoZSBvbmUKKwkgKiBqdXN0IGJlaW5nIHdva2VuIHVwCisJICovCisJZm9yX2VhY2hfb25saW5lX2NwdShvdGhlcl9jcHUpIHsKKwkJaWYgKG90aGVyX2NwdSAhPSBjcHUpIHsKKwkJCXN0cnVjdCBtdm5ldGFfcGNwdV9wb3J0ICpvdGhlcl9wb3J0ID0KKwkJCQlwZXJfY3B1X3B0cihwcC0+cG9ydHMsIG90aGVyX2NwdSk7CisKKwkJCW5hcGlfc3luY2hyb25pemUoJm90aGVyX3BvcnQtPm5hcGkpOwogCQl9Ci0JCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhwcC0+ZGV2KTsKLQotCQkvKiBXZSBoYXZlIHRvIHN5bmNocm9uaXNlIG9uIHRoYSBuYXBpIG9mIGVhY2ggQ1BVCi0JCSAqIGV4Y2VwdCB0aGUgb25lIGp1c3QgYmVpbmcgd2FrZWQgdXAKLQkJICovCi0JCWZvcl9lYWNoX29ubGluZV9jcHUob3RoZXJfY3B1KSB7Ci0JCQlpZiAob3RoZXJfY3B1ICE9IGNwdSkgewotCQkJCXN0cnVjdCBtdm5ldGFfcGNwdV9wb3J0ICpvdGhlcl9wb3J0ID0KLQkJCQkJcGVyX2NwdV9wdHIocHAtPnBvcnRzLCBvdGhlcl9jcHUpOwotCi0JCQkJbmFwaV9zeW5jaHJvbml6ZSgmb3RoZXJfcG9ydC0+bmFwaSk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBNYXNrIGFsbCBldGhlcm5ldCBwb3J0IGludGVycnVwdHMgKi8KLQkJb25fZWFjaF9jcHUobXZuZXRhX3BlcmNwdV9tYXNrX2ludGVycnVwdCwgcHAsIHRydWUpOwotCQluYXBpX2VuYWJsZSgmcG9ydC0+bmFwaSk7Ci0KLQotCQkvKiBFbmFibGUgcGVyLUNQVSBpbnRlcnJ1cHRzIG9uIHRoZSBDUFUgdGhhdCBpcwotCQkgKiBicm91Z2h0IHVwLgotCQkgKi8KLQkJbXZuZXRhX3BlcmNwdV9lbmFibGUocHApOwotCi0JCS8qIEVuYWJsZSBwZXItQ1BVIGludGVycnVwdCBvbiB0aGUgb25lIENQVSB3ZSBjYXJlCi0JCSAqIGFib3V0LgotCQkgKi8KLQkJbXZuZXRhX3BlcmNwdV9lbGVjdChwcCk7Ci0KLQkJLyogVW5tYXNrIGFsbCBldGhlcm5ldCBwb3J0IGludGVycnVwdHMgKi8KLQkJb25fZWFjaF9jcHUobXZuZXRhX3BlcmNwdV91bm1hc2tfaW50ZXJydXB0LCBwcCwgdHJ1ZSk7Ci0JCW12cmVnX3dyaXRlKHBwLCBNVk5FVEFfSU5UUl9NSVNDX01BU0ssCi0JCQlNVk5FVEFfQ0FVU0VfUEhZX1NUQVRVU19DSEFOR0UgfAotCQkJTVZORVRBX0NBVVNFX0xJTktfQ0hBTkdFIHwKLQkJCU1WTkVUQV9DQVVTRV9QU0NfU1lOQ19DSEFOR0UpOwotCQluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKHBwLT5kZXYpOwotCQlzcGluX3VubG9jaygmcHAtPmxvY2spOwotCQlicmVhazsKLQljYXNlIENQVV9ET1dOX1BSRVBBUkU6Ci0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFX0ZST1pFTjoKLQkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKHBwLT5kZXYpOwotCQkvKiBUaGFua3MgdG8gdGhpcyBsb2NrIHdlIGFyZSBzdXJlIHRoYXQgYW55IHBlbmRpbmcKLQkJICogY3B1IGVsZWN0aW9uIGlzIGRvbmUKLQkJICovCi0JCXNwaW5fbG9jaygmcHAtPmxvY2spOwotCQkvKiBNYXNrIGFsbCBldGhlcm5ldCBwb3J0IGludGVycnVwdHMgKi8KLQkJb25fZWFjaF9jcHUobXZuZXRhX3BlcmNwdV9tYXNrX2ludGVycnVwdCwgcHAsIHRydWUpOwotCQlzcGluX3VubG9jaygmcHAtPmxvY2spOwotCi0JCW5hcGlfc3luY2hyb25pemUoJnBvcnQtPm5hcGkpOwotCQluYXBpX2Rpc2FibGUoJnBvcnQtPm5hcGkpOwotCQkvKiBEaXNhYmxlIHBlci1DUFUgaW50ZXJydXB0cyBvbiB0aGUgQ1BVIHRoYXQgaXMKLQkJICogYnJvdWdodCBkb3duLgotCQkgKi8KLQkJbXZuZXRhX3BlcmNwdV9kaXNhYmxlKHBwKTsKLQotCQlicmVhazsKLQljYXNlIENQVV9ERUFEOgotCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgotCQkvKiBDaGVjayBpZiBhIG5ldyBDUFUgbXVzdCBiZSBlbGVjdGVkIG5vdyB0aGlzIG9uIGlzIGRvd24gKi8KLQkJc3Bpbl9sb2NrKCZwcC0+bG9jayk7Ci0JCW12bmV0YV9wZXJjcHVfZWxlY3QocHApOwotCQlzcGluX3VubG9jaygmcHAtPmxvY2spOwotCQkvKiBVbm1hc2sgYWxsIGV0aGVybmV0IHBvcnQgaW50ZXJydXB0cyAqLwotCQlvbl9lYWNoX2NwdShtdm5ldGFfcGVyY3B1X3VubWFza19pbnRlcnJ1cHQsIHBwLCB0cnVlKTsKLQkJbXZyZWdfd3JpdGUocHAsIE1WTkVUQV9JTlRSX01JU0NfTUFTSywKLQkJCU1WTkVUQV9DQVVTRV9QSFlfU1RBVFVTX0NIQU5HRSB8Ci0JCQlNVk5FVEFfQ0FVU0VfTElOS19DSEFOR0UgfAotCQkJTVZORVRBX0NBVVNFX1BTQ19TWU5DX0NIQU5HRSk7Ci0JCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMocHAtPmRldik7Ci0JCWJyZWFrOwogCX0KIAotCXJldHVybiBOT1RJRllfT0s7CisJLyogTWFzayBhbGwgZXRoZXJuZXQgcG9ydCBpbnRlcnJ1cHRzICovCisJb25fZWFjaF9jcHUobXZuZXRhX3BlcmNwdV9tYXNrX2ludGVycnVwdCwgcHAsIHRydWUpOworCW5hcGlfZW5hYmxlKCZwb3J0LT5uYXBpKTsKKworCS8qCisJICogRW5hYmxlIHBlci1DUFUgaW50ZXJydXB0cyBvbiB0aGUgQ1BVIHRoYXQgaXMKKwkgKiBicm91Z2h0IHVwLgorCSAqLworCW12bmV0YV9wZXJjcHVfZW5hYmxlKHBwKTsKKworCS8qCisJICogRW5hYmxlIHBlci1DUFUgaW50ZXJydXB0IG9uIHRoZSBvbmUgQ1BVIHdlIGNhcmUKKwkgKiBhYm91dC4KKwkgKi8KKwltdm5ldGFfcGVyY3B1X2VsZWN0KHBwKTsKKworCS8qIFVubWFzayBhbGwgZXRoZXJuZXQgcG9ydCBpbnRlcnJ1cHRzICovCisJb25fZWFjaF9jcHUobXZuZXRhX3BlcmNwdV91bm1hc2tfaW50ZXJydXB0LCBwcCwgdHJ1ZSk7CisJbXZyZWdfd3JpdGUocHAsIE1WTkVUQV9JTlRSX01JU0NfTUFTSywKKwkJICAgIE1WTkVUQV9DQVVTRV9QSFlfU1RBVFVTX0NIQU5HRSB8CisJCSAgICBNVk5FVEFfQ0FVU0VfTElOS19DSEFOR0UgfAorCQkgICAgTVZORVRBX0NBVVNFX1BTQ19TWU5DX0NIQU5HRSk7CisJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhwcC0+ZGV2KTsKKwlzcGluX3VubG9jaygmcHAtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12bmV0YV9jcHVfZG93bl9wcmVwYXJlKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQoreworCXN0cnVjdCBtdm5ldGFfcG9ydCAqcHAgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCBtdm5ldGFfcG9ydCwKKwkJCQkJCSAgbm9kZV9vbmxpbmUpOworCXN0cnVjdCBtdm5ldGFfcGNwdV9wb3J0ICpwb3J0ID0gcGVyX2NwdV9wdHIocHAtPnBvcnRzLCBjcHUpOworCisJLyoKKwkgKiBUaGFua3MgdG8gdGhpcyBsb2NrIHdlIGFyZSBzdXJlIHRoYXQgYW55IHBlbmRpbmcgY3B1IGVsZWN0aW9uIGlzCisJICogZG9uZS4KKwkgKi8KKwlzcGluX2xvY2soJnBwLT5sb2NrKTsKKwkvKiBNYXNrIGFsbCBldGhlcm5ldCBwb3J0IGludGVycnVwdHMgKi8KKwlvbl9lYWNoX2NwdShtdm5ldGFfcGVyY3B1X21hc2tfaW50ZXJydXB0LCBwcCwgdHJ1ZSk7CisJc3Bpbl91bmxvY2soJnBwLT5sb2NrKTsKKworCW5hcGlfc3luY2hyb25pemUoJnBvcnQtPm5hcGkpOworCW5hcGlfZGlzYWJsZSgmcG9ydC0+bmFwaSk7CisJLyogRGlzYWJsZSBwZXItQ1BVIGludGVycnVwdHMgb24gdGhlIENQVSB0aGF0IGlzIGJyb3VnaHQgZG93bi4gKi8KKwltdm5ldGFfcGVyY3B1X2Rpc2FibGUocHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12bmV0YV9jcHVfZGVhZCh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgbXZuZXRhX3BvcnQsCisJCQkJCQkgIG5vZGVfZGVhZCk7CisKKwkvKiBDaGVjayBpZiBhIG5ldyBDUFUgbXVzdCBiZSBlbGVjdGVkIG5vdyB0aGlzIG9uIGlzIGRvd24gKi8KKwlzcGluX2xvY2soJnBwLT5sb2NrKTsKKwltdm5ldGFfcGVyY3B1X2VsZWN0KHBwKTsKKwlzcGluX3VubG9jaygmcHAtPmxvY2spOworCS8qIFVubWFzayBhbGwgZXRoZXJuZXQgcG9ydCBpbnRlcnJ1cHRzICovCisJb25fZWFjaF9jcHUobXZuZXRhX3BlcmNwdV91bm1hc2tfaW50ZXJydXB0LCBwcCwgdHJ1ZSk7CisJbXZyZWdfd3JpdGUocHAsIE1WTkVUQV9JTlRSX01JU0NfTUFTSywKKwkJICAgIE1WTkVUQV9DQVVTRV9QSFlfU1RBVFVTX0NIQU5HRSB8CisJCSAgICBNVk5FVEFfQ0FVU0VfTElOS19DSEFOR0UgfAorCQkgICAgTVZORVRBX0NBVVNFX1BTQ19TWU5DX0NIQU5HRSk7CisJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhwcC0+ZGV2KTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBtdm5ldGFfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMzQ0Miw3ICszNDUwLDE1IEBACiAJLyogUmVnaXN0ZXIgYSBDUFUgbm90aWZpZXIgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIG91ciBDUFUKIAkgKiBtaWdodCBiZSB0YWtlbiBvZmZsaW5lLgogCSAqLwotCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmcHAtPmNwdV9ub3RpZmllcik7CisJcmV0ID0gY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlX25vY2FsbHMob25saW5lX2hwc3RhdGUsCisJCQkJCSAgICAgICAmcHAtPm5vZGVfb25saW5lKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlX2lycTsKKworCXJldCA9IGNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZV9ub2NhbGxzKENQVUhQX05FVF9NVk5FVEFfREVBRCwKKwkJCQkJICAgICAgICZwcC0+bm9kZV9kZWFkKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlX29ubGluZV9ocDsKIAogCS8qIEluIGRlZmF1bHQgbGluayBpcyBkb3duICovCiAJbmV0aWZfY2Fycmllcl9vZmYocHAtPmRldik7CkBAIC0zNDUwLDE1ICszNDY2LDE5IEBACiAJcmV0ID0gbXZuZXRhX21kaW9fcHJvYmUocHApOwogCWlmIChyZXQgPCAwKSB7CiAJCW5ldGRldl9lcnIoZGV2LCAiY2Fubm90IHByb2JlIE1ESU8gYnVzXG4iKTsKLQkJZ290byBlcnJfZnJlZV9pcnE7CisJCWdvdG8gZXJyX2ZyZWVfZGVhZF9ocDsKIAl9CiAKIAltdm5ldGFfc3RhcnRfZGV2KHBwKTsKIAogCXJldHVybiAwOwogCitlcnJfZnJlZV9kZWFkX2hwOgorCWNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKENQVUhQX05FVF9NVk5FVEFfREVBRCwKKwkJCQkJICAgICZwcC0+bm9kZV9kZWFkKTsKK2Vycl9mcmVlX29ubGluZV9ocDoKKwljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyhvbmxpbmVfaHBzdGF0ZSwgJnBwLT5ub2RlX29ubGluZSk7CiBlcnJfZnJlZV9pcnE6Ci0JdW5yZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnBwLT5jcHVfbm90aWZpZXIpOwogCW9uX2VhY2hfY3B1KG12bmV0YV9wZXJjcHVfZGlzYWJsZSwgcHAsIHRydWUpOwogCWZyZWVfcGVyY3B1X2lycShwcC0+ZGV2LT5pcnEsIHBwLT5wb3J0cyk7CiBlcnJfY2xlYW51cF90eHFzOgpAQCAtMzQ4NCw3ICszNTA0LDEwIEBACiAKIAltdm5ldGFfc3RvcF9kZXYocHApOwogCW12bmV0YV9tZGlvX3JlbW92ZShwcCk7Ci0JdW5yZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnBwLT5jcHVfbm90aWZpZXIpOworCisJY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlX25vY2FsbHMob25saW5lX2hwc3RhdGUsICZwcC0+bm9kZV9vbmxpbmUpOworCWNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKENQVUhQX05FVF9NVk5FVEFfREVBRCwKKwkJCQkJICAgICZwcC0+bm9kZV9kZWFkKTsKIAlvbl9lYWNoX2NwdShtdm5ldGFfcGVyY3B1X2Rpc2FibGUsIHBwLCB0cnVlKTsKIAlmcmVlX3BlcmNwdV9pcnEoZGV2LT5pcnEsIHBwLT5wb3J0cyk7CiAJbXZuZXRhX2NsZWFudXBfcnhxcyhwcCk7CkBAIC0zNDk1LDQyICszNTE4LDMxIEBACiAKIHN0YXRpYyBpbnQgbXZuZXRhX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQogewotCXN0cnVjdCBtdm5ldGFfcG9ydCAqcHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYgKCFwcC0+cGh5X2RldikKKwlpZiAoIWRldi0+cGh5ZGV2KQogCQlyZXR1cm4gLUVOT1RTVVBQOwogCi0JcmV0dXJuIHBoeV9taWlfaW9jdGwocHAtPnBoeV9kZXYsIGlmciwgY21kKTsKKwlyZXR1cm4gcGh5X21paV9pb2N0bChkZXYtPnBoeWRldiwgaWZyLCBjbWQpOwogfQogCiAvKiBFdGh0b29sIG1ldGhvZHMgKi8KIAotLyogR2V0IHNldHRpbmdzIChwaHkgYWRkcmVzcywgc3BlZWQpIGZvciBldGh0b29scyAqLwotaW50IG12bmV0YV9ldGh0b29sX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKKy8qIFNldCBsaW5rIGtzZXR0aW5ncyAocGh5IGFkZHJlc3MsIHNwZWVkKSBmb3IgZXRodG9vbHMgKi8KK3N0YXRpYyBpbnQKK212bmV0YV9ldGh0b29sX3NldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7Ci0Jc3RydWN0IG12bmV0YV9wb3J0ICpwcCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlpZiAoIXBwLT5waHlfZGV2KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KHBwLT5waHlfZGV2LCBjbWQpOwotfQotCi0vKiBTZXQgc2V0dGluZ3MgKHBoeSBhZGRyZXNzLCBzcGVlZCkgZm9yIGV0aHRvb2xzICovCi1pbnQgbXZuZXRhX2V0aHRvb2xfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQotewotCXN0cnVjdCBtdm5ldGFfcG9ydCAqcHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBwcC0+cGh5X2RldjsKKwlzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IG5kZXYtPnBoeWRldjsKIAogCWlmICghcGh5ZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICgoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSAhPSBwcC0+dXNlX2luYmFuZF9zdGF0dXMpIHsKKwlpZiAoKGNtZC0+YmFzZS5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSAhPSBwcC0+dXNlX2luYmFuZF9zdGF0dXMpIHsKIAkJdTMyIHZhbDsKIAotCQltdm5ldGFfc2V0X2F1dG9uZWcocHAsIGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSk7CisJCW12bmV0YV9zZXRfYXV0b25lZyhwcCwgY21kLT5iYXNlLmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpOwogCi0JCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKSB7CisJCWlmIChjbWQtPmJhc2UuYXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUpIHsKIAkJCXZhbCA9IG12cmVnX3JlYWQocHAsIE1WTkVUQV9HTUFDX0FVVE9ORUdfQ09ORklHKTsKIAkJCXZhbCAmPSB+KE1WTkVUQV9HTUFDX0NPTkZJR19NSUlfU1BFRUQgfAogCQkJCSBNVk5FVEFfR01BQ19DT05GSUdfR01JSV9TUEVFRCB8CkBAIC0zNTQ3LDE3ICszNTU5LDE3IEBACiAJCQltdnJlZ193cml0ZShwcCwgTVZORVRBX0dNQUNfQVVUT05FR19DT05GSUcsIHZhbCk7CiAJCX0KIAotCQlwcC0+dXNlX2luYmFuZF9zdGF0dXMgPSAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKTsKKwkJcHAtPnVzZV9pbmJhbmRfc3RhdHVzID0gKGNtZC0+YmFzZS5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKTsKIAkJbmV0ZGV2X2luZm8ocHAtPmRldiwgImF1dG9uZWcgc3RhdHVzIHNldCB0byAlaVxuIiwKIAkJCSAgICBwcC0+dXNlX2luYmFuZF9zdGF0dXMpOwogCi0JCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJaWYgKG5ldGlmX3J1bm5pbmcobmRldikpIHsKIAkJCW12bmV0YV9wb3J0X2Rvd24ocHApOwogCQkJbXZuZXRhX3BvcnRfdXAocHApOwogCQl9CiAJfQogCi0JcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocHAtPnBoeV9kZXYsIGNtZCk7CisJcmV0dXJuIHBoeV9ldGh0b29sX2tzZXR0aW5nc19zZXQobmRldi0+cGh5ZGV2LCBjbWQpOwogfQogCiAvKiBTZXQgaW50ZXJydXB0IGNvYWxlc2NpbmcgZm9yIGV0aHRvb2xzICovCkBAIC0zODIxLDggKzM4MzMsNiBAQAogCiBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgbXZuZXRhX2V0aF90b29sX29wcyA9IHsKIAkuZ2V0X2xpbmsgICAgICAgPSBldGh0b29sX29wX2dldF9saW5rLAotCS5nZXRfc2V0dGluZ3MgICA9IG12bmV0YV9ldGh0b29sX2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzICAgPSBtdm5ldGFfZXRodG9vbF9zZXRfc2V0dGluZ3MsCiAJLnNldF9jb2FsZXNjZSAgID0gbXZuZXRhX2V0aHRvb2xfc2V0X2NvYWxlc2NlLAogCS5nZXRfY29hbGVzY2UgICA9IG12bmV0YV9ldGh0b29sX2dldF9jb2FsZXNjZSwKIAkuZ2V0X2RydmluZm8gICAgPSBtdm5ldGFfZXRodG9vbF9nZXRfZHJ2aW5mbywKQEAgLTM4MzUsNiArMzg0NSw4IEBACiAJLmdldF9yeG5mYwk9IG12bmV0YV9ldGh0b29sX2dldF9yeG5mYywKIAkuZ2V0X3J4ZmgJPSBtdm5ldGFfZXRodG9vbF9nZXRfcnhmaCwKIAkuc2V0X3J4ZmgJPSBtdm5ldGFfZXRodG9vbF9zZXRfcnhmaCwKKwkuZ2V0X2xpbmtfa3NldHRpbmdzID0gcGh5X2V0aHRvb2xfZ2V0X2xpbmtfa3NldHRpbmdzLAorCS5zZXRfbGlua19rc2V0dGluZ3MgPSBtdm5ldGFfZXRodG9vbF9zZXRfbGlua19rc2V0dGluZ3MsCiB9OwogCiAvKiBJbml0aWFsaXplIGh3ICovCkBAIC00MDI0LDcgKzQwMzYsNiBAQAogCWVyciA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKGRuLCAibWFuYWdlZCIsICZtYW5hZ2VkKTsKIAlwcC0+dXNlX2luYmFuZF9zdGF0dXMgPSAoZXJyID09IDAgJiYKIAkJCQkgc3RyY21wKG1hbmFnZWQsICJpbi1iYW5kLXN0YXR1cyIpID09IDApOwotCXBwLT5jcHVfbm90aWZpZXIubm90aWZpZXJfY2FsbCA9IG12bmV0YV9wZXJjcHVfbm90aWZpZXI7CiAKIAlwcC0+cnhxX2RlZiA9IHJ4cV9kZWY7CiAKQEAgLTQyMjcsNyArNDIzOCw0MiBAQAogCX0sCiB9OwogCi1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG12bmV0YV9kcml2ZXIpOworc3RhdGljIGludCBfX2luaXQgbXZuZXRhX2RyaXZlcl9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX211bHRpKENQVUhQX0FQX09OTElORV9EWU4sICJuZXQvbXZtZXRhOm9ubGluZSIsCisJCQkJICAgICAgbXZuZXRhX2NwdV9vbmxpbmUsCisJCQkJICAgICAgbXZuZXRhX2NwdV9kb3duX3ByZXBhcmUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlvbmxpbmVfaHBzdGF0ZSA9IHJldDsKKwlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9tdWx0aShDUFVIUF9ORVRfTVZORVRBX0RFQUQsICJuZXQvbXZuZXRhOmRlYWQiLAorCQkJCSAgICAgIE5VTEwsIG12bmV0YV9jcHVfZGVhZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZGVhZDsKKworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXZuZXRhX2RyaXZlcik7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisJcmV0dXJuIDA7CisKK2VycjoKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoQ1BVSFBfTkVUX01WTkVUQV9ERUFEKTsKK2Vycl9kZWFkOgorCWNwdWhwX3JlbW92ZV9tdWx0aV9zdGF0ZShvbmxpbmVfaHBzdGF0ZSk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KG12bmV0YV9kcml2ZXJfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtdm5ldGFfZHJpdmVyX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXZuZXRhX2RyaXZlcik7CisJY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlKENQVUhQX05FVF9NVk5FVEFfREVBRCk7CisJY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlKG9ubGluZV9ocHN0YXRlKTsKK30KK21vZHVsZV9leGl0KG12bmV0YV9kcml2ZXJfZXhpdCk7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiTWFydmVsbCBORVRBIEV0aGVybmV0IERyaXZlciAtIHd3dy5tYXJ2ZWxsLmNvbSIpOwogTU9EVUxFX0FVVEhPUigiUmFtaSBSb3NlbiA8cm9zZW5yQG1hcnZlbGwuY29tPiwgVGhvbWFzIFBldGF6em9uaSA8dGhvbWFzLnBldGF6em9uaUBmcmVlLWVsZWN0cm9ucy5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bmV0YV9ibS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm5ldGFfYm0uaAppbmRleCBlNzRmZDQ0Li5hMzJkZTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bmV0YV9ibS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZuZXRhX2JtLmgKQEAgLTEzMyw3ICsxMzMsNyBAQAogdm9pZCAqbXZuZXRhX2ZyYWdfYWxsb2ModW5zaWduZWQgaW50IGZyYWdfc2l6ZSk7CiB2b2lkIG12bmV0YV9mcmFnX2ZyZWUodW5zaWduZWQgaW50IGZyYWdfc2l6ZSwgdm9pZCAqZGF0YSk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NVk5FVEFfQk0pIHx8IGRlZmluZWQoQ09ORklHX01WTkVUQV9CTV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTVZORVRBX0JNKQogdm9pZCBtdm5ldGFfYm1fcG9vbF9kZXN0cm95KHN0cnVjdCBtdm5ldGFfYm0gKnByaXYsCiAJCQkgICAgc3RydWN0IG12bmV0YV9ibV9wb29sICpibV9wb29sLCB1OCBwb3J0X21hcCk7CiB2b2lkIG12bmV0YV9ibV9idWZzX2ZyZWUoc3RydWN0IG12bmV0YV9ibSAqcHJpdiwgc3RydWN0IG12bmV0YV9ibV9wb29sICpibV9wb29sLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9za3kyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL3NreTIuYwppbmRleCA0NjcxMzhiLi5mMDVlYTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL3NreTIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL3NreTIuYwpAQCAtMzA3MCw3ICszMDcwLDcgQEAKIAkJCWdvdG8gZG9uZTsKIAl9CiAKLQluYXBpX2NvbXBsZXRlKG5hcGkpOworCW5hcGlfY29tcGxldGVfZG9uZShuYXBpLCB3b3JrX2RvbmUpOwogCXNreTJfcmVhZDMyKGh3LCBCMF9ZMl9TUF9MSVNSKTsKIGRvbmU6CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lZGlhdGVrL210a19ldGhfc29jLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWRpYXRlay9tdGtfZXRoX3NvYy5jCmluZGV4IGI1N2FlM2EuLmFkNGFiOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lZGlhdGVrL210a19ldGhfc29jLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVkaWF0ZWsvbXRrX2V0aF9zb2MuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KICNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CkBAIC01MCw2ICs1MSwxMCBAQAogCU1US19FVEhUT09MX1NUQVQocnhfZmxvd19jb250cm9sX3BhY2tldHMpLAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtdGtfY2xrc19zb3VyY2VfbmFtZVtdID0geworCSJldGhpZiIsICJlc3ciLCAiZ3AxIiwgImdwMiIsICJ0cmdwbGwiCit9OworCiB2b2lkIG10a193MzIoc3RydWN0IG10a19ldGggKmV0aCwgdTMyIHZhbCwgdW5zaWduZWQgcmVnKQogewogCV9fcmF3X3dyaXRlbCh2YWwsIGV0aC0+YmFzZSArIHJlZyk7CkBAIC0xMzAsNiArMTM1LDMzIEBACiAJcmV0dXJuIF9tdGtfbWRpb19yZWFkKGV0aCwgcGh5X2FkZHIsIHBoeV9yZWcpOwogfQogCitzdGF0aWMgdm9pZCBtdGtfZ21hYzBfcmdtaWlfYWRqdXN0KHN0cnVjdCBtdGtfZXRoICpldGgsIGludCBzcGVlZCkKK3sKKwl1MzIgdmFsOworCWludCByZXQ7CisKKwl2YWwgPSAoc3BlZWQgPT0gU1BFRURfMTAwMCkgPworCQlJTlRGX01PREVfUkdNSUlfMTAwMCA6IElOVEZfTU9ERV9SR01JSV8xMF8xMDA7CisJbXRrX3czMihldGgsIHZhbCwgSU5URl9NT0RFKTsKKworCXJlZ21hcF91cGRhdGVfYml0cyhldGgtPmV0aHN5cywgRVRIU1lTX0NMS0NGRzAsCisJCQkgICBFVEhTWVNfVFJHTUlJX0NMS19TRUwzNjJfNSwKKwkJCSAgIEVUSFNZU19UUkdNSUlfQ0xLX1NFTDM2Ml81KTsKKworCXZhbCA9IChzcGVlZCA9PSBTUEVFRF8xMDAwKSA/IDI1MDAwMDAwMCA6IDUwMDAwMDAwMDsKKwlyZXQgPSBjbGtfc2V0X3JhdGUoZXRoLT5jbGtzW01US19DTEtfVFJHUExMXSwgdmFsKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGV0aC0+ZGV2LCAiRmFpbGVkIHRvIHNldCB0cmdtaWkgcGxsOiAlZFxuIiwgcmV0KTsKKworCXZhbCA9IChzcGVlZCA9PSBTUEVFRF8xMDAwKSA/CisJCVJDS19DVFJMX1JHTUlJXzEwMDAgOiBSQ0tfQ1RSTF9SR01JSV8xMF8xMDA7CisJbXRrX3czMihldGgsIHZhbCwgVFJHTUlJX1JDS19DVFJMKTsKKworCXZhbCA9IChzcGVlZCA9PSBTUEVFRF8xMDAwKSA/CisJCVRDS19DVFJMX1JHTUlJXzEwMDAgOiBUQ0tfQ1RSTF9SR01JSV8xMF8xMDA7CisJbXRrX3czMihldGgsIHZhbCwgVFJHTUlJX1RDS19DVFJMKTsKK30KKwogc3RhdGljIHZvaWQgbXRrX3BoeV9saW5rX2FkanVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMTQwLDcgKzE3MiwxMCBAQAogCQkgIE1BQ19NQ1JfUlhfRU4gfCBNQUNfTUNSX0JBQ0tPRkZfRU4gfAogCQkgIE1BQ19NQ1JfQkFDS1BSX0VOOwogCi0Jc3dpdGNoIChtYWMtPnBoeV9kZXYtPnNwZWVkKSB7CisJaWYgKHVubGlrZWx5KHRlc3RfYml0KE1US19SRVNFVFRJTkcsICZtYWMtPmh3LT5zdGF0ZSkpKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGRldi0+cGh5ZGV2LT5zcGVlZCkgewogCWNhc2UgU1BFRURfMTAwMDoKIAkJbWNyIHw9IE1BQ19NQ1JfU1BFRURfMTAwMDsKIAkJYnJlYWs7CkBAIC0xNDksMjAgKzE4NCwyMyBAQAogCQlicmVhazsKIAl9OwogCi0JaWYgKG1hYy0+cGh5X2Rldi0+bGluaykKKwlpZiAobWFjLT5pZCA9PSAwICYmICFtYWMtPnRyZ21paSkKKwkJbXRrX2dtYWMwX3JnbWlpX2FkanVzdChtYWMtPmh3LCBkZXYtPnBoeWRldi0+c3BlZWQpOworCisJaWYgKGRldi0+cGh5ZGV2LT5saW5rKQogCQltY3IgfD0gTUFDX01DUl9GT1JDRV9MSU5LOwogCi0JaWYgKG1hYy0+cGh5X2Rldi0+ZHVwbGV4KSB7CisJaWYgKGRldi0+cGh5ZGV2LT5kdXBsZXgpIHsKIAkJbWNyIHw9IE1BQ19NQ1JfRk9SQ0VfRFBYOwogCi0JCWlmIChtYWMtPnBoeV9kZXYtPnBhdXNlKQorCQlpZiAoZGV2LT5waHlkZXYtPnBhdXNlKQogCQkJcm10X2FkdiA9IExQQV9QQVVTRV9DQVA7Ci0JCWlmIChtYWMtPnBoeV9kZXYtPmFzeW1fcGF1c2UpCisJCWlmIChkZXYtPnBoeWRldi0+YXN5bV9wYXVzZSkKIAkJCXJtdF9hZHYgfD0gTFBBX1BBVVNFX0FTWU07CiAKLQkJaWYgKG1hYy0+cGh5X2Rldi0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEX1BhdXNlKQorCQlpZiAoZGV2LT5waHlkZXYtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF9QYXVzZSkKIAkJCWxjbF9hZHYgfD0gQURWRVJUSVNFX1BBVVNFX0NBUDsKLQkJaWYgKG1hYy0+cGh5X2Rldi0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEX0FzeW1fUGF1c2UpCisJCWlmIChkZXYtPnBoeWRldi0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEX0FzeW1fUGF1c2UpCiAJCQlsY2xfYWR2IHw9IEFEVkVSVElTRV9QQVVTRV9BU1lNOwogCiAJCWZsb3djdHJsID0gbWlpX3Jlc29sdmVfZmxvd2N0cmxfZmR4KGxjbF9hZHYsIHJtdF9hZHYpOwpAQCAtMTc5LDcgKzIxNyw3IEBACiAKIAltdGtfdzMyKG1hYy0+aHcsIG1jciwgTVRLX01BQ19NQ1IobWFjLT5pZCkpOwogCi0JaWYgKG1hYy0+cGh5X2Rldi0+bGluaykKKwlpZiAoZGV2LT5waHlkZXYtPmxpbmspCiAJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKIAllbHNlCiAJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CkBAIC0xODgsMTcgKzIyNiw5IEBACiBzdGF0aWMgaW50IG10a19waHlfY29ubmVjdF9ub2RlKHN0cnVjdCBtdGtfZXRoICpldGgsIHN0cnVjdCBtdGtfbWFjICptYWMsCiAJCQkJc3RydWN0IGRldmljZV9ub2RlICpwaHlfbm9kZSkKIHsKLQljb25zdCBfX2JlMzIgKl9hZGRyID0gTlVMTDsKIAlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OwotCWludCBwaHlfbW9kZSwgYWRkcjsKKwlpbnQgcGh5X21vZGU7CiAKLQlfYWRkciA9IG9mX2dldF9wcm9wZXJ0eShwaHlfbm9kZSwgInJlZyIsIE5VTEwpOwotCi0JaWYgKCFfYWRkciB8fCAoYmUzMl90b19jcHUoKl9hZGRyKSA+PSAweDIwKSkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHBoeSBhZGRyZXNzXG4iLCBwaHlfbm9kZS0+bmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhZGRyID0gYmUzMl90b19jcHUoKl9hZGRyKTsKIAlwaHlfbW9kZSA9IG9mX2dldF9waHlfbW9kZShwaHlfbm9kZSk7CiAJaWYgKHBoeV9tb2RlIDwgMCkgewogCQlkZXZfZXJyKGV0aC0+ZGV2LCAiaW5jb3JyZWN0IHBoeS1tb2RlICVkXG4iLCBwaHlfbW9kZSk7CkBAIC0yMTcsMTcgKzI0NywxNyBAQAogCQkgbWFjLT5pZCwgcGh5ZGV2X25hbWUocGh5ZGV2KSwgcGh5ZGV2LT5waHlfaWQsCiAJCSBwaHlkZXYtPmRydi0+bmFtZSk7CiAKLQltYWMtPnBoeV9kZXYgPSBwaHlkZXY7Ci0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtdGtfcGh5X2Nvbm5lY3Qoc3RydWN0IG10a19tYWMgKm1hYykKK3N0YXRpYyBpbnQgbXRrX3BoeV9jb25uZWN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG10a19ldGggKmV0aCA9IG1hYy0+aHc7CisJc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG10a19ldGggKmV0aDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXUzMiB2YWwsIGdlX21vZGU7CisJdTMyIHZhbDsKIAorCWV0aCA9IG1hYy0+aHc7CiAJbnAgPSBvZl9wYXJzZV9waGFuZGxlKG1hYy0+b2Zfbm9kZSwgInBoeS1oYW5kbGUiLCAwKTsKIAlpZiAoIW5wICYmIG9mX3BoeV9pc19maXhlZF9saW5rKG1hYy0+b2Zfbm9kZSkpCiAJCWlmICghb2ZfcGh5X3JlZ2lzdGVyX2ZpeGVkX2xpbmsobWFjLT5vZl9ub2RlKSkKQEAgLTIzNiw0NiArMjY2LDY3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJc3dpdGNoIChvZl9nZXRfcGh5X21vZGUobnApKSB7CisJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfVFJHTUlJOgorCQltYWMtPnRyZ21paSA9IHRydWU7CiAJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfVFhJRDoKIAljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9SWElEOgogCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJX0lEOgogCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJOgotCQlnZV9tb2RlID0gMDsKKwkJbWFjLT5nZV9tb2RlID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfTUlJOgotCQlnZV9tb2RlID0gMTsKKwkJbWFjLT5nZV9tb2RlID0gMTsKKwkJYnJlYWs7CisJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUkVWTUlJOgorCQltYWMtPmdlX21vZGUgPSAyOwogCQlicmVhazsKIAljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJOgotCQlnZV9tb2RlID0gMjsKKwkJaWYgKCFtYWMtPmlkKQorCQkJZ290byBlcnJfcGh5OworCQltYWMtPmdlX21vZGUgPSAzOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKGV0aC0+ZGV2LCAiaW52YWxpZCBwaHlfbW9kZVxuIik7Ci0JCXJldHVybiAtMTsKKwkJZ290byBlcnJfcGh5OwogCX0KIAogCS8qIHB1dCB0aGUgZ21hYyBpbnRvIHRoZSByaWdodCBtb2RlICovCiAJcmVnbWFwX3JlYWQoZXRoLT5ldGhzeXMsIEVUSFNZU19TWVNDRkcwLCAmdmFsKTsKIAl2YWwgJj0gflNZU0NGRzBfR0VfTU9ERShTWVNDRkcwX0dFX01BU0ssIG1hYy0+aWQpOwotCXZhbCB8PSBTWVNDRkcwX0dFX01PREUoZ2VfbW9kZSwgbWFjLT5pZCk7CisJdmFsIHw9IFNZU0NGRzBfR0VfTU9ERShtYWMtPmdlX21vZGUsIG1hYy0+aWQpOwogCXJlZ21hcF93cml0ZShldGgtPmV0aHN5cywgRVRIU1lTX1NZU0NGRzAsIHZhbCk7CiAKLQltdGtfcGh5X2Nvbm5lY3Rfbm9kZShldGgsIG1hYywgbnApOwotCW1hYy0+cGh5X2Rldi0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOwotCW1hYy0+cGh5X2Rldi0+c3BlZWQgPSAwOwotCW1hYy0+cGh5X2Rldi0+ZHVwbGV4ID0gMDsKLQltYWMtPnBoeV9kZXYtPnN1cHBvcnRlZCAmPSBQSFlfR0JJVF9GRUFUVVJFUyB8IFNVUFBPUlRFRF9QYXVzZSB8CisJLyogY291cGxlIHBoeWRldiB0byBuZXRfZGV2aWNlICovCisJaWYgKG10a19waHlfY29ubmVjdF9ub2RlKGV0aCwgbWFjLCBucCkpCisJCWdvdG8gZXJyX3BoeTsKKworCWRldi0+cGh5ZGV2LT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJZGV2LT5waHlkZXYtPnNwZWVkID0gMDsKKwlkZXYtPnBoeWRldi0+ZHVwbGV4ID0gMDsKKworCWlmIChvZl9waHlfaXNfZml4ZWRfbGluayhtYWMtPm9mX25vZGUpKQorCQlkZXYtPnBoeWRldi0+c3VwcG9ydGVkIHw9CisJCVNVUFBPUlRFRF9QYXVzZSB8IFNVUFBPUlRFRF9Bc3ltX1BhdXNlOworCisJZGV2LT5waHlkZXYtPnN1cHBvcnRlZCAmPSBQSFlfR0JJVF9GRUFUVVJFUyB8IFNVUFBPUlRFRF9QYXVzZSB8CiAJCQkJICAgU1VQUE9SVEVEX0FzeW1fUGF1c2U7Ci0JbWFjLT5waHlfZGV2LT5hZHZlcnRpc2luZyA9IG1hYy0+cGh5X2Rldi0+c3VwcG9ydGVkIHwKKwlkZXYtPnBoeWRldi0+YWR2ZXJ0aXNpbmcgPSBkZXYtPnBoeWRldi0+c3VwcG9ydGVkIHwKIAkJCQkgICAgQURWRVJUSVNFRF9BdXRvbmVnOwotCXBoeV9zdGFydF9hbmVnKG1hYy0+cGh5X2Rldik7CisJcGh5X3N0YXJ0X2FuZWcoZGV2LT5waHlkZXYpOworCisJb2Zfbm9kZV9wdXQobnApOwogCiAJcmV0dXJuIDA7CisKK2Vycl9waHk6CisJb2Zfbm9kZV9wdXQobnApOworCWRldl9lcnIoZXRoLT5kZXYsICIlczogaW52YWxpZCBwaHlcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCBtdGtfbWRpb19pbml0KHN0cnVjdCBtdGtfZXRoICpldGgpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICptaWlfbnA7Ci0JaW50IGVycjsKKwlpbnQgcmV0OwogCiAJbWlpX25wID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUoZXRoLT5kZXYtPm9mX25vZGUsICJtZGlvLWJ1cyIpOwogCWlmICghbWlpX25wKSB7CkBAIC0yODQsMTMgKzMzNSwxMyBAQAogCX0KIAogCWlmICghb2ZfZGV2aWNlX2lzX2F2YWlsYWJsZShtaWlfbnApKSB7Ci0JCWVyciA9IDA7CisJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX3B1dF9ub2RlOwogCX0KIAotCWV0aC0+bWlpX2J1cyA9IG1kaW9idXNfYWxsb2MoKTsKKwlldGgtPm1paV9idXMgPSBkZXZtX21kaW9idXNfYWxsb2MoZXRoLT5kZXYpOwogCWlmICghZXRoLT5taWlfYnVzKSB7Ci0JCWVyciA9IC1FTk9NRU07CisJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3B1dF9ub2RlOwogCX0KIApAQCAtMzAxLDE5ICszNTIsMTEgQEAKIAlldGgtPm1paV9idXMtPnBhcmVudCA9IGV0aC0+ZGV2OwogCiAJc25wcmludGYoZXRoLT5taWlfYnVzLT5pZCwgTUlJX0JVU19JRF9TSVpFLCAiJXMiLCBtaWlfbnAtPm5hbWUpOwotCWVyciA9IG9mX21kaW9idXNfcmVnaXN0ZXIoZXRoLT5taWlfYnVzLCBtaWlfbnApOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2ZyZWVfYnVzOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9mcmVlX2J1czoKLQltZGlvYnVzX2ZyZWUoZXRoLT5taWlfYnVzKTsKKwlyZXQgPSBvZl9tZGlvYnVzX3JlZ2lzdGVyKGV0aC0+bWlpX2J1cywgbWlpX25wKTsKIAogZXJyX3B1dF9ub2RlOgogCW9mX25vZGVfcHV0KG1paV9ucCk7Ci0JZXRoLT5taWlfYnVzID0gTlVMTDsKLQlyZXR1cm4gZXJyOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIG10a19tZGlvX2NsZWFudXAoc3RydWN0IG10a19ldGggKmV0aCkKQEAgLTMyMiwyOSArMzY1LDI5IEBACiAJCXJldHVybjsKIAogCW1kaW9idXNfdW5yZWdpc3RlcihldGgtPm1paV9idXMpOwotCW9mX25vZGVfcHV0KGV0aC0+bWlpX2J1cy0+ZGV2Lm9mX25vZGUpOwotCW1kaW9idXNfZnJlZShldGgtPm1paV9idXMpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbXRrX2lycV9kaXNhYmxlKHN0cnVjdCBtdGtfZXRoICpldGgsIHUzMiBtYXNrKQorc3RhdGljIGlubGluZSB2b2lkIG10a19pcnFfZGlzYWJsZShzdHJ1Y3QgbXRrX2V0aCAqZXRoLAorCQkJCSAgIHVuc2lnbmVkIHJlZywgdTMyIG1hc2spCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgdmFsOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV0aC0+aXJxX2xvY2ssIGZsYWdzKTsKLQl2YWwgPSBtdGtfcjMyKGV0aCwgTVRLX1FETUFfSU5UX01BU0spOwotCW10a193MzIoZXRoLCB2YWwgJiB+bWFzaywgTVRLX1FETUFfSU5UX01BU0spOworCXZhbCA9IG10a19yMzIoZXRoLCByZWcpOworCW10a193MzIoZXRoLCB2YWwgJiB+bWFzaywgcmVnKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGgtPmlycV9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtdGtfaXJxX2VuYWJsZShzdHJ1Y3QgbXRrX2V0aCAqZXRoLCB1MzIgbWFzaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdGtfaXJxX2VuYWJsZShzdHJ1Y3QgbXRrX2V0aCAqZXRoLAorCQkJCSAgdW5zaWduZWQgcmVnLCB1MzIgbWFzaykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiB2YWw7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXRoLT5pcnFfbG9jaywgZmxhZ3MpOwotCXZhbCA9IG10a19yMzIoZXRoLCBNVEtfUURNQV9JTlRfTUFTSyk7Ci0JbXRrX3czMihldGgsIHZhbCB8IG1hc2ssIE1US19RRE1BX0lOVF9NQVNLKTsKKwl2YWwgPSBtdGtfcjMyKGV0aCwgcmVnKTsKKwltdGtfdzMyKGV0aCwgdmFsIHwgbWFzaywgcmVnKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGgtPmlycV9sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTM1MywxOCArMzk2LDIwIEBACiAJaW50IHJldCA9IGV0aF9tYWNfYWRkcihkZXYsIHApOwogCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOwogCWNvbnN0IGNoYXIgKm1hY2FkZHIgPSBkZXYtPmRldl9hZGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+aHctPnBhZ2VfbG9jaywgZmxhZ3MpOworCWlmICh1bmxpa2VseSh0ZXN0X2JpdChNVEtfUkVTRVRUSU5HLCAmbWFjLT5ody0+c3RhdGUpKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXNwaW5fbG9ja19iaCgmbWFjLT5ody0+cGFnZV9sb2NrKTsKIAltdGtfdzMyKG1hYy0+aHcsIChtYWNhZGRyWzBdIDw8IDgpIHwgbWFjYWRkclsxXSwKIAkJTVRLX0dETUFfTUFDX0FEUkgobWFjLT5pZCkpOwogCW10a193MzIobWFjLT5odywgKG1hY2FkZHJbMl0gPDwgMjQpIHwgKG1hY2FkZHJbM10gPDwgMTYpIHwKIAkJKG1hY2FkZHJbNF0gPDwgOCkgfCBtYWNhZGRyWzVdLAogCQlNVEtfR0RNQV9NQUNfQURSTChtYWMtPmlkKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjLT5ody0+cGFnZV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfYmgoJm1hYy0+aHctPnBhZ2VfbG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU0MiwxNSArNTg3LDE1IEBACiAJcmV0dXJuICZyaW5nLT5idWZbaWR4XTsKIH0KIAotc3RhdGljIHZvaWQgbXRrX3R4X3VubWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG10a190eF9idWYgKnR4X2J1ZikKK3N0YXRpYyB2b2lkIG10a190eF91bm1hcChzdHJ1Y3QgbXRrX2V0aCAqZXRoLCBzdHJ1Y3QgbXRrX3R4X2J1ZiAqdHhfYnVmKQogewogCWlmICh0eF9idWYtPmZsYWdzICYgTVRLX1RYX0ZMQUdTX1NJTkdMRTApIHsKLQkJZG1hX3VubWFwX3NpbmdsZShkZXYsCisJCWRtYV91bm1hcF9zaW5nbGUoZXRoLT5kZXYsCiAJCQkJIGRtYV91bm1hcF9hZGRyKHR4X2J1ZiwgZG1hX2FkZHIwKSwKIAkJCQkgZG1hX3VubWFwX2xlbih0eF9idWYsIGRtYV9sZW4wKSwKIAkJCQkgRE1BX1RPX0RFVklDRSk7CiAJfSBlbHNlIGlmICh0eF9idWYtPmZsYWdzICYgTVRLX1RYX0ZMQUdTX1BBR0UwKSB7Ci0JCWRtYV91bm1hcF9wYWdlKGRldiwKKwkJZG1hX3VubWFwX3BhZ2UoZXRoLT5kZXYsCiAJCQkgICAgICAgZG1hX3VubWFwX2FkZHIodHhfYnVmLCBkbWFfYWRkcjApLAogCQkJICAgICAgIGRtYV91bm1hcF9sZW4odHhfYnVmLCBkbWFfbGVuMCksCiAJCQkgICAgICAgRE1BX1RPX0RFVklDRSk7CkBAIC01NzIsMTQgKzYxNywxNSBAQAogCWRtYV9hZGRyX3QgbWFwcGVkX2FkZHI7CiAJdW5zaWduZWQgaW50IG5yX2ZyYWdzOwogCWludCBpLCBuX2Rlc2MgPSAxOwotCXUzMiB0eGQ0ID0gMDsKKwl1MzIgdHhkNCA9IDAsIGZwb3J0OwogCiAJaXR4ZCA9IHJpbmctPm5leHRfZnJlZTsKIAlpZiAoaXR4ZCA9PSByaW5nLT5sYXN0X2ZyZWUpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogc2V0IHRoZSBmb3J3YXJkIHBvcnQgKi8KLQl0eGQ0IHw9IChtYWMtPmlkICsgMSkgPDwgVFhfRE1BX0ZQT1JUX1NISUZUOworCWZwb3J0ID0gKG1hYy0+aWQgKyAxKSA8PCBUWF9ETUFfRlBPUlRfU0hJRlQ7CisJdHhkNCB8PSBmcG9ydDsKIAogCXR4X2J1ZiA9IG10a19kZXNjX3RvX3R4X2J1ZihyaW5nLCBpdHhkKTsKIAltZW1zZXQodHhfYnVmLCAwLCBzaXplb2YoKnR4X2J1ZikpOwpAQCAtNTk1LDkgKzY0MSw5IEBACiAJaWYgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpCiAJCXR4ZDQgfD0gVFhfRE1BX0lOU19WTEFOIHwgc2tiX3ZsYW5fdGFnX2dldChza2IpOwogCi0JbWFwcGVkX2FkZHIgPSBkbWFfbWFwX3NpbmdsZSgmZGV2LT5kZXYsIHNrYi0+ZGF0YSwKKwltYXBwZWRfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGV0aC0+ZGV2LCBza2ItPmRhdGEsCiAJCQkJICAgICBza2JfaGVhZGxlbihza2IpLCBETUFfVE9fREVWSUNFKTsKLQlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IoJmRldi0+ZGV2LCBtYXBwZWRfYWRkcikpKQorCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcihldGgtPmRldiwgbWFwcGVkX2FkZHIpKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlXUklURV9PTkNFKGl0eGQtPnR4ZDEsIG1hcHBlZF9hZGRyKTsKQEAgLTYyMywxMCArNjY5LDEwIEBACiAKIAkJCW5fZGVzYysrOwogCQkJZnJhZ19tYXBfc2l6ZSA9IG1pbihmcmFnX3NpemUsIE1US19UWF9ETUFfQlVGX0xFTik7Ci0JCQltYXBwZWRfYWRkciA9IHNrYl9mcmFnX2RtYV9tYXAoJmRldi0+ZGV2LCBmcmFnLCBvZmZzZXQsCisJCQltYXBwZWRfYWRkciA9IHNrYl9mcmFnX2RtYV9tYXAoZXRoLT5kZXYsIGZyYWcsIG9mZnNldCwKIAkJCQkJCSAgICAgICBmcmFnX21hcF9zaXplLAogCQkJCQkJICAgICAgIERNQV9UT19ERVZJQ0UpOwotCQkJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKCZkZXYtPmRldiwgbWFwcGVkX2FkZHIpKSkKKwkJCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcihldGgtPmRldiwgbWFwcGVkX2FkZHIpKSkKIAkJCQlnb3RvIGVycl9kbWE7CiAKIAkJCWlmIChpID09IG5yX2ZyYWdzIC0gMSAmJgpAQCAtNjM3LDcgKzY4Myw3IEBACiAJCQlXUklURV9PTkNFKHR4ZC0+dHhkMywgKFRYX0RNQV9TV0MgfAogCQkJCQkgICAgICAgVFhfRE1BX1BMRU4wKGZyYWdfbWFwX3NpemUpIHwKIAkJCQkJICAgICAgIGxhc3RfZnJhZyAqIFRYX0RNQV9MUzApKTsKLQkJCVdSSVRFX09OQ0UodHhkLT50eGQ0LCAwKTsKKwkJCVdSSVRFX09OQ0UodHhkLT50eGQ0LCBmcG9ydCk7CiAKIAkJCXR4X2J1Zi0+c2tiID0gKHN0cnVjdCBza19idWZmICopTVRLX0RNQV9EVU1NWV9ERVNDOwogCQkJdHhfYnVmID0gbXRrX2Rlc2NfdG9fdHhfYnVmKHJpbmcsIHR4ZCk7CkBAIC02NzksNyArNzI1LDcgQEAKIAkJdHhfYnVmID0gbXRrX2Rlc2NfdG9fdHhfYnVmKHJpbmcsIGl0eGQpOwogCiAJCS8qIHVubWFwIGRtYSAqLwotCQltdGtfdHhfdW5tYXAoJmRldi0+ZGV2LCB0eF9idWYpOworCQltdGtfdHhfdW5tYXAoZXRoLCB0eF9idWYpOwogCiAJCWl0eGQtPnR4ZDMgPSBUWF9ETUFfTFMwIHwgVFhfRE1BX09XTkVSX0NQVTsKIAkJaXR4ZCA9IG10a19xZG1hX3BoeXNfdG9fdmlydChyaW5nLCBpdHhkLT50eGQyKTsKQEAgLTc0OCw3ICs3OTQsNiBAQAogCXN0cnVjdCBtdGtfZXRoICpldGggPSBtYWMtPmh3OwogCXN0cnVjdCBtdGtfdHhfcmluZyAqcmluZyA9ICZldGgtPnR4X3Jpbmc7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmRldi0+c3RhdHM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlib29sIGdzbyA9IGZhbHNlOwogCWludCB0eF9udW07CiAKQEAgLTc1NiwxNCArODAxLDE3IEBACiAJICogaG93ZXZlciB3ZSBoYXZlIDIgcXVldWVzIHJ1bm5pbmcgb24gdGhlIHNhbWUgcmluZyBzbyB3ZSBuZWVkIHRvIGxvY2sKIAkgKiB0aGUgcmluZyBhY2Nlc3MKIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZXRoLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJmV0aC0+cGFnZV9sb2NrKTsKKworCWlmICh1bmxpa2VseSh0ZXN0X2JpdChNVEtfUkVTRVRUSU5HLCAmZXRoLT5zdGF0ZSkpKQorCQlnb3RvIGRyb3A7CiAKIAl0eF9udW0gPSBtdGtfY2FsX3R4ZF9yZXEoc2tiKTsKIAlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJnJpbmctPmZyZWVfY291bnQpIDw9IHR4X251bSkpIHsKIAkJbXRrX3N0b3BfcXVldWUoZXRoKTsKIAkJbmV0aWZfZXJyKGV0aCwgdHhfcXVldWVkLCBkZXYsCiAJCQkgICJUeCBSaW5nIGZ1bGwgd2hlbiBxdWV1ZSBhd2FrZSFcbiIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGgtPnBhZ2VfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9jaygmZXRoLT5wYWdlX2xvY2spOwogCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CiAJfQogCkBAIC03ODgsMjIgKzgzNiw2MiBAQAogCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmcmluZy0+ZnJlZV9jb3VudCkgPD0gcmluZy0+dGhyZXNoKSkKIAkJbXRrX3N0b3BfcXVldWUoZXRoKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0aC0+cGFnZV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2soJmV0aC0+cGFnZV9sb2NrKTsKIAogCXJldHVybiBORVRERVZfVFhfT0s7CiAKIGRyb3A6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRoLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9jaygmZXRoLT5wYWdlX2xvY2spOwogCXN0YXRzLT50eF9kcm9wcGVkKys7CiAJZGV2X2tmcmVlX3NrYihza2IpOwogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgbXRrX3J4X3JpbmcgKm10a19nZXRfcnhfcmluZyhzdHJ1Y3QgbXRrX2V0aCAqZXRoKQoreworCWludCBpOworCXN0cnVjdCBtdGtfcnhfcmluZyAqcmluZzsKKwlpbnQgaWR4OworCisJaWYgKCFldGgtPmh3bHJvKQorCQlyZXR1cm4gJmV0aC0+cnhfcmluZ1swXTsKKworCWZvciAoaSA9IDA7IGkgPCBNVEtfTUFYX1JYX1JJTkdfTlVNOyBpKyspIHsKKwkJcmluZyA9ICZldGgtPnJ4X3JpbmdbaV07CisJCWlkeCA9IE5FWFRfUlhfREVTUF9JRFgocmluZy0+Y2FsY19pZHgsIHJpbmctPmRtYV9zaXplKTsKKwkJaWYgKHJpbmctPmRtYVtpZHhdLnJ4ZDIgJiBSWF9ETUFfRE9ORSkgeworCQkJcmluZy0+Y2FsY19pZHhfdXBkYXRlID0gdHJ1ZTsKKwkJCXJldHVybiByaW5nOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG10a191cGRhdGVfcnhfY3B1X2lkeChzdHJ1Y3QgbXRrX2V0aCAqZXRoKQoreworCXN0cnVjdCBtdGtfcnhfcmluZyAqcmluZzsKKwlpbnQgaTsKKworCWlmICghZXRoLT5od2xybykgeworCQlyaW5nID0gJmV0aC0+cnhfcmluZ1swXTsKKwkJbXRrX3czMihldGgsIHJpbmctPmNhbGNfaWR4LCByaW5nLT5jcnhfaWR4X3JlZyk7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IE1US19NQVhfUlhfUklOR19OVU07IGkrKykgeworCQkJcmluZyA9ICZldGgtPnJ4X3JpbmdbaV07CisJCQlpZiAocmluZy0+Y2FsY19pZHhfdXBkYXRlKSB7CisJCQkJcmluZy0+Y2FsY19pZHhfdXBkYXRlID0gZmFsc2U7CisJCQkJbXRrX3czMihldGgsIHJpbmctPmNhbGNfaWR4LCByaW5nLT5jcnhfaWR4X3JlZyk7CisJCQl9CisJCX0KKwl9Cit9CisKIHN0YXRpYyBpbnQgbXRrX3BvbGxfcngoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0LAogCQkgICAgICAgc3RydWN0IG10a19ldGggKmV0aCkKIHsKLQlzdHJ1Y3QgbXRrX3J4X3JpbmcgKnJpbmcgPSAmZXRoLT5yeF9yaW5nOwotCWludCBpZHggPSByaW5nLT5jYWxjX2lkeDsKKwlzdHJ1Y3QgbXRrX3J4X3JpbmcgKnJpbmc7CisJaW50IGlkeDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXU4ICpkYXRhLCAqbmV3X2RhdGE7CiAJc3RydWN0IG10a19yeF9kbWEgKnJ4ZCwgdHJ4ZDsKQEAgLTgxNSw3ICs5MDMsMTEgQEAKIAkJZG1hX2FkZHJfdCBkbWFfYWRkcjsKIAkJaW50IG1hYyA9IDA7CiAKLQkJaWR4ID0gTkVYVF9SWF9ERVNQX0lEWChpZHgpOworCQlyaW5nID0gbXRrX2dldF9yeF9yaW5nKGV0aCk7CisJCWlmICh1bmxpa2VseSghcmluZykpCisJCQlnb3RvIHJ4X2RvbmU7CisKKwkJaWR4ID0gTkVYVF9SWF9ERVNQX0lEWChyaW5nLT5jYWxjX2lkeCwgcmluZy0+ZG1hX3NpemUpOwogCQlyeGQgPSAmcmluZy0+ZG1hW2lkeF07CiAJCWRhdGEgPSByaW5nLT5kYXRhW2lkeF07CiAKQEAgLTgzMCwxNyArOTIyLDIwIEBACiAKIAkJbmV0ZGV2ID0gZXRoLT5uZXRkZXZbbWFjXTsKIAorCQlpZiAodW5saWtlbHkodGVzdF9iaXQoTVRLX1JFU0VUVElORywgJmV0aC0+c3RhdGUpKSkKKwkJCWdvdG8gcmVsZWFzZV9kZXNjOworCiAJCS8qIGFsbG9jIG5ldyBidWZmZXIgKi8KIAkJbmV3X2RhdGEgPSBuYXBpX2FsbG9jX2ZyYWcocmluZy0+ZnJhZ19zaXplKTsKIAkJaWYgKHVubGlrZWx5KCFuZXdfZGF0YSkpIHsKIAkJCW5ldGRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJZ290byByZWxlYXNlX2Rlc2M7CiAJCX0KLQkJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZSgmZXRoLT5uZXRkZXZbbWFjXS0+ZGV2LAorCQlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGV0aC0+ZGV2LAogCQkJCQkgIG5ld19kYXRhICsgTkVUX1NLQl9QQUQsCiAJCQkJCSAgcmluZy0+YnVmX3NpemUsCiAJCQkJCSAgRE1BX0ZST01fREVWSUNFKTsKLQkJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKCZuZXRkZXYtPmRldiwgZG1hX2FkZHIpKSkgeworCQlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IoZXRoLT5kZXYsIGRtYV9hZGRyKSkpIHsKIAkJCXNrYl9mcmVlX2ZyYWcobmV3X2RhdGEpOwogCQkJbmV0ZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlnb3RvIHJlbGVhc2VfZGVzYzsKQEAgLTg0OSwxMyArOTQ0LDEzIEBACiAJCS8qIHJlY2VpdmUgZGF0YSAqLwogCQlza2IgPSBidWlsZF9za2IoZGF0YSwgcmluZy0+ZnJhZ19zaXplKTsKIAkJaWYgKHVubGlrZWx5KCFza2IpKSB7Ci0JCQlwdXRfcGFnZSh2aXJ0X3RvX2hlYWRfcGFnZShuZXdfZGF0YSkpOworCQkJc2tiX2ZyZWVfZnJhZyhuZXdfZGF0YSk7CiAJCQluZXRkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCWdvdG8gcmVsZWFzZV9kZXNjOwogCQl9CiAJCXNrYl9yZXNlcnZlKHNrYiwgTkVUX1NLQl9QQUQgKyBORVRfSVBfQUxJR04pOwogCi0JCWRtYV91bm1hcF9zaW5nbGUoJm5ldGRldi0+ZGV2LCB0cnhkLnJ4ZDEsCisJCWRtYV91bm1hcF9zaW5nbGUoZXRoLT5kZXYsIHRyeGQucnhkMSwKIAkJCQkgcmluZy0+YnVmX3NpemUsIERNQV9GUk9NX0RFVklDRSk7CiAJCXBrdGxlbiA9IFJYX0RNQV9HRVRfUExFTjAodHJ4ZC5yeGQyKTsKIAkJc2tiLT5kZXYgPSBuZXRkZXY7CkBAIC04NzksMTcgKzk3NCwxOSBAQAogCQlyeGQtPnJ4ZDIgPSBSWF9ETUFfUExFTjAocmluZy0+YnVmX3NpemUpOwogCiAJCXJpbmctPmNhbGNfaWR4ID0gaWR4OworCisJCWRvbmUrKzsKKwl9CisKK3J4X2RvbmU6CisJaWYgKGRvbmUpIHsKIAkJLyogbWFrZSBzdXJlIHRoYXQgYWxsIGNoYW5nZXMgdG8gdGhlIGRtYSByaW5nIGFyZSBmbHVzaGVkIGJlZm9yZQogCQkgKiB3ZSBjb250aW51ZQogCQkgKi8KIAkJd21iKCk7Ci0JCW10a193MzIoZXRoLCByaW5nLT5jYWxjX2lkeCwgTVRLX1FSWF9DUlhfSURYMCk7Ci0JCWRvbmUrKzsKKwkJbXRrX3VwZGF0ZV9yeF9jcHVfaWR4KGV0aCk7CiAJfQogCi0JaWYgKGRvbmUgPCBidWRnZXQpCi0JCW10a193MzIoZXRoLCBNVEtfUlhfRE9ORV9JTlQsIE1US19RTVRLX0lOVF9TVEFUVVMpOwotCiAJcmV0dXJuIGRvbmU7CiB9CiAKQEAgLTkzNyw3ICsxMDM0LDcgQEAKIAkJCWRvbmVbbWFjXSsrOwogCQkJYnVkZ2V0LS07CiAJCX0KLQkJbXRrX3R4X3VubWFwKGV0aC0+ZGV2LCB0eF9idWYpOworCQltdGtfdHhfdW5tYXAoZXRoLCB0eF9idWYpOwogCiAJCXJpbmctPmxhc3RfZnJlZSA9IGRlc2M7CiAJCWF0b21pY19pbmMoJnJpbmctPmZyZWVfY291bnQpOwpAQCAtOTk4LDcgKzEwOTUsNyBAQAogCQlyZXR1cm4gYnVkZ2V0OwogCiAJbmFwaV9jb21wbGV0ZShuYXBpKTsKLQltdGtfaXJxX2VuYWJsZShldGgsIE1US19UWF9ET05FX0lOVCk7CisJbXRrX2lycV9lbmFibGUoZXRoLCBNVEtfUURNQV9JTlRfTUFTSywgTVRLX1RYX0RPTkVfSU5UKTsKIAogCXJldHVybiB0eF9kb25lOwogfQpAQCAtMTAwOCwzMCArMTEwNSwzMyBAQAogCXN0cnVjdCBtdGtfZXRoICpldGggPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IG10a19ldGgsIHJ4X25hcGkpOwogCXUzMiBzdGF0dXMsIG1hc2s7CiAJaW50IHJ4X2RvbmUgPSAwOworCWludCByZW1haW5fYnVkZ2V0ID0gYnVkZ2V0OwogCiAJbXRrX2hhbmRsZV9zdGF0dXNfaXJxKGV0aCk7Ci0JbXRrX3czMihldGgsIE1US19SWF9ET05FX0lOVCwgTVRLX1FNVEtfSU5UX1NUQVRVUyk7Ci0JcnhfZG9uZSA9IG10a19wb2xsX3J4KG5hcGksIGJ1ZGdldCwgZXRoKTsKKworcG9sbF9hZ2FpbjoKKwltdGtfdzMyKGV0aCwgTVRLX1JYX0RPTkVfSU5ULCBNVEtfUERNQV9JTlRfU1RBVFVTKTsKKwlyeF9kb25lID0gbXRrX3BvbGxfcngobmFwaSwgcmVtYWluX2J1ZGdldCwgZXRoKTsKIAogCWlmICh1bmxpa2VseShuZXRpZl9tc2dfaW50cihldGgpKSkgewotCQlzdGF0dXMgPSBtdGtfcjMyKGV0aCwgTVRLX1FNVEtfSU5UX1NUQVRVUyk7Ci0JCW1hc2sgPSBtdGtfcjMyKGV0aCwgTVRLX1FETUFfSU5UX01BU0spOworCQlzdGF0dXMgPSBtdGtfcjMyKGV0aCwgTVRLX1BETUFfSU5UX1NUQVRVUyk7CisJCW1hc2sgPSBtdGtfcjMyKGV0aCwgTVRLX1BETUFfSU5UX01BU0spOwogCQlkZXZfaW5mbyhldGgtPmRldiwKIAkJCSAiZG9uZSByeCAlZCwgaW50ciAweCUwOHgvMHgleFxuIiwKIAkJCSByeF9kb25lLCBzdGF0dXMsIG1hc2spOwogCX0KLQotCWlmIChyeF9kb25lID09IGJ1ZGdldCkKKwlpZiAocnhfZG9uZSA9PSByZW1haW5fYnVkZ2V0KQogCQlyZXR1cm4gYnVkZ2V0OwogCi0Jc3RhdHVzID0gbXRrX3IzMihldGgsIE1US19RTVRLX0lOVF9TVEFUVVMpOwotCWlmIChzdGF0dXMgJiBNVEtfUlhfRE9ORV9JTlQpCi0JCXJldHVybiBidWRnZXQ7Ci0KKwlzdGF0dXMgPSBtdGtfcjMyKGV0aCwgTVRLX1BETUFfSU5UX1NUQVRVUyk7CisJaWYgKHN0YXR1cyAmIE1US19SWF9ET05FX0lOVCkgeworCQlyZW1haW5fYnVkZ2V0IC09IHJ4X2RvbmU7CisJCWdvdG8gcG9sbF9hZ2FpbjsKKwl9CiAJbmFwaV9jb21wbGV0ZShuYXBpKTsKLQltdGtfaXJxX2VuYWJsZShldGgsIE1US19SWF9ET05FX0lOVCk7CisJbXRrX2lycV9lbmFibGUoZXRoLCBNVEtfUERNQV9JTlRfTUFTSywgTVRLX1JYX0RPTkVfSU5UKTsKIAotCXJldHVybiByeF9kb25lOworCXJldHVybiByeF9kb25lICsgYnVkZ2V0IC0gcmVtYWluX2J1ZGdldDsKIH0KIAogc3RhdGljIGludCBtdGtfdHhfYWxsb2Moc3RydWN0IG10a19ldGggKmV0aCkKQEAgLTEwNzgsNiArMTE3OCw3IEBACiAJbXRrX3czMihldGgsCiAJCXJpbmctPnBoeXMgKyAoKE1US19ETUFfU0laRSAtIDEpICogc3opLAogCQlNVEtfUVRYX0RSWF9QVFIpOworCW10a193MzIoZXRoLCAoUURNQV9SRVNfVEhSRVMgPDwgOCkgfCBRRE1BX1JFU19USFJFUywgTVRLX1FUWF9DRkcoMCkpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTEwOTIsNyArMTE5Myw3IEBACiAKIAlpZiAocmluZy0+YnVmKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBNVEtfRE1BX1NJWkU7IGkrKykKLQkJCW10a190eF91bm1hcChldGgtPmRldiwgJnJpbmctPmJ1ZltpXSk7CisJCQltdGtfdHhfdW5tYXAoZXRoLCAmcmluZy0+YnVmW2ldKTsKIAkJa2ZyZWUocmluZy0+YnVmKTsKIAkJcmluZy0+YnVmID0gTlVMTDsKIAl9CkBAIC0xMTA2LDMyICsxMjA3LDQxIEBACiAJfQogfQogCi1zdGF0aWMgaW50IG10a19yeF9hbGxvYyhzdHJ1Y3QgbXRrX2V0aCAqZXRoKQorc3RhdGljIGludCBtdGtfcnhfYWxsb2Moc3RydWN0IG10a19ldGggKmV0aCwgaW50IHJpbmdfbm8sIGludCByeF9mbGFnKQogewotCXN0cnVjdCBtdGtfcnhfcmluZyAqcmluZyA9ICZldGgtPnJ4X3Jpbmc7CisJc3RydWN0IG10a19yeF9yaW5nICpyaW5nID0gJmV0aC0+cnhfcmluZ1tyaW5nX25vXTsKKwlpbnQgcnhfZGF0YV9sZW4sIHJ4X2RtYV9zaXplOwogCWludCBpOwogCi0JcmluZy0+ZnJhZ19zaXplID0gbXRrX21heF9mcmFnX3NpemUoRVRIX0RBVEFfTEVOKTsKKwlpZiAocnhfZmxhZyA9PSBNVEtfUlhfRkxBR1NfSFdMUk8pIHsKKwkJcnhfZGF0YV9sZW4gPSBNVEtfTUFYX0xST19SWF9MRU5HVEg7CisJCXJ4X2RtYV9zaXplID0gTVRLX0hXX0xST19ETUFfU0laRTsKKwl9IGVsc2UgeworCQlyeF9kYXRhX2xlbiA9IEVUSF9EQVRBX0xFTjsKKwkJcnhfZG1hX3NpemUgPSBNVEtfRE1BX1NJWkU7CisJfQorCisJcmluZy0+ZnJhZ19zaXplID0gbXRrX21heF9mcmFnX3NpemUocnhfZGF0YV9sZW4pOwogCXJpbmctPmJ1Zl9zaXplID0gbXRrX21heF9idWZfc2l6ZShyaW5nLT5mcmFnX3NpemUpOwotCXJpbmctPmRhdGEgPSBrY2FsbG9jKE1US19ETUFfU0laRSwgc2l6ZW9mKCpyaW5nLT5kYXRhKSwKKwlyaW5nLT5kYXRhID0ga2NhbGxvYyhyeF9kbWFfc2l6ZSwgc2l6ZW9mKCpyaW5nLT5kYXRhKSwKIAkJCSAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyaW5nLT5kYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWZvciAoaSA9IDA7IGkgPCBNVEtfRE1BX1NJWkU7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCByeF9kbWFfc2l6ZTsgaSsrKSB7CiAJCXJpbmctPmRhdGFbaV0gPSBuZXRkZXZfYWxsb2NfZnJhZyhyaW5nLT5mcmFnX3NpemUpOwogCQlpZiAoIXJpbmctPmRhdGFbaV0pCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlyaW5nLT5kbWEgPSBkbWFfYWxsb2NfY29oZXJlbnQoZXRoLT5kZXYsCi0JCQkJICAgICAgIE1US19ETUFfU0laRSAqIHNpemVvZigqcmluZy0+ZG1hKSwKKwkJCQkgICAgICAgcnhfZG1hX3NpemUgKiBzaXplb2YoKnJpbmctPmRtYSksCiAJCQkJICAgICAgICZyaW5nLT5waHlzLAogCQkJCSAgICAgICBHRlBfQVRPTUlDIHwgX19HRlBfWkVSTyk7CiAJaWYgKCFyaW5nLT5kbWEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZm9yIChpID0gMDsgaSA8IE1US19ETUFfU0laRTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHJ4X2RtYV9zaXplOyBpKyspIHsKIAkJZG1hX2FkZHJfdCBkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGV0aC0+ZGV2LAogCQkJCXJpbmctPmRhdGFbaV0gKyBORVRfU0tCX1BBRCwKIAkJCQlyaW5nLT5idWZfc2l6ZSwKQEAgLTExNDIsMjggKzEyNTIsMzAgQEAKIAogCQlyaW5nLT5kbWFbaV0ucnhkMiA9IFJYX0RNQV9QTEVOMChyaW5nLT5idWZfc2l6ZSk7CiAJfQotCXJpbmctPmNhbGNfaWR4ID0gTVRLX0RNQV9TSVpFIC0gMTsKKwlyaW5nLT5kbWFfc2l6ZSA9IHJ4X2RtYV9zaXplOworCXJpbmctPmNhbGNfaWR4X3VwZGF0ZSA9IGZhbHNlOworCXJpbmctPmNhbGNfaWR4ID0gcnhfZG1hX3NpemUgLSAxOworCXJpbmctPmNyeF9pZHhfcmVnID0gTVRLX1BSWF9DUlhfSURYX0NGRyhyaW5nX25vKTsKIAkvKiBtYWtlIHN1cmUgdGhhdCBhbGwgY2hhbmdlcyB0byB0aGUgZG1hIHJpbmcgYXJlIGZsdXNoZWQgYmVmb3JlIHdlCiAJICogY29udGludWUKIAkgKi8KIAl3bWIoKTsKIAotCW10a193MzIoZXRoLCBldGgtPnJ4X3JpbmcucGh5cywgTVRLX1FSWF9CQVNFX1BUUjApOwotCW10a193MzIoZXRoLCBNVEtfRE1BX1NJWkUsIE1US19RUlhfTUFYX0NOVDApOwotCW10a193MzIoZXRoLCBldGgtPnJ4X3JpbmcuY2FsY19pZHgsIE1US19RUlhfQ1JYX0lEWDApOwotCW10a193MzIoZXRoLCBNVEtfUFNUX0RSWF9JRFgwLCBNVEtfUURNQV9SU1RfSURYKTsKLQltdGtfdzMyKGV0aCwgKFFETUFfUkVTX1RIUkVTIDw8IDgpIHwgUURNQV9SRVNfVEhSRVMsIE1US19RVFhfQ0ZHKDApKTsKKwltdGtfdzMyKGV0aCwgcmluZy0+cGh5cywgTVRLX1BSWF9CQVNFX1BUUl9DRkcocmluZ19ubykpOworCW10a193MzIoZXRoLCByeF9kbWFfc2l6ZSwgTVRLX1BSWF9NQVhfQ05UX0NGRyhyaW5nX25vKSk7CisJbXRrX3czMihldGgsIHJpbmctPmNhbGNfaWR4LCByaW5nLT5jcnhfaWR4X3JlZyk7CisJbXRrX3czMihldGgsIE1US19QU1RfRFJYX0lEWF9DRkcocmluZ19ubyksIE1US19QRE1BX1JTVF9JRFgpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG10a19yeF9jbGVhbihzdHJ1Y3QgbXRrX2V0aCAqZXRoKQorc3RhdGljIHZvaWQgbXRrX3J4X2NsZWFuKHN0cnVjdCBtdGtfZXRoICpldGgsIGludCByaW5nX25vKQogewotCXN0cnVjdCBtdGtfcnhfcmluZyAqcmluZyA9ICZldGgtPnJ4X3Jpbmc7CisJc3RydWN0IG10a19yeF9yaW5nICpyaW5nID0gJmV0aC0+cnhfcmluZ1tyaW5nX25vXTsKIAlpbnQgaTsKIAogCWlmIChyaW5nLT5kYXRhICYmIHJpbmctPmRtYSkgewotCQlmb3IgKGkgPSAwOyBpIDwgTVRLX0RNQV9TSVpFOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IHJpbmctPmRtYV9zaXplOyBpKyspIHsKIAkJCWlmICghcmluZy0+ZGF0YVtpXSkKIAkJCQljb250aW51ZTsKIAkJCWlmICghcmluZy0+ZG1hW2ldLnJ4ZDEpCkBAIC0xMTgwLDEzICsxMjkyLDI3NSBAQAogCiAJaWYgKHJpbmctPmRtYSkgewogCQlkbWFfZnJlZV9jb2hlcmVudChldGgtPmRldiwKLQkJCQkgIE1US19ETUFfU0laRSAqIHNpemVvZigqcmluZy0+ZG1hKSwKKwkJCQkgIHJpbmctPmRtYV9zaXplICogc2l6ZW9mKCpyaW5nLT5kbWEpLAogCQkJCSAgcmluZy0+ZG1hLAogCQkJCSAgcmluZy0+cGh5cyk7CiAJCXJpbmctPmRtYSA9IE5VTEw7CiAJfQogfQogCitzdGF0aWMgaW50IG10a19od2xyb19yeF9pbml0KHN0cnVjdCBtdGtfZXRoICpldGgpCit7CisJaW50IGk7CisJdTMyIHJpbmdfY3RybF9kdzEgPSAwLCByaW5nX2N0cmxfZHcyID0gMCwgcmluZ19jdHJsX2R3MyA9IDA7CisJdTMyIGxyb19jdHJsX2R3MCA9IDAsIGxyb19jdHJsX2R3MyA9IDA7CisKKwkvKiBzZXQgTFJPIHJpbmdzIHRvIGF1dG8tbGVhcm4gbW9kZXMgKi8KKwlyaW5nX2N0cmxfZHcyIHw9IE1US19SSU5HX0FVVE9fTEVSQU5fTU9ERTsKKworCS8qIHZhbGlkYXRlIExSTyByaW5nICovCisJcmluZ19jdHJsX2R3MiB8PSBNVEtfUklOR19WTEQ7CisKKwkvKiBzZXQgQUdFIHRpbWVyICh1bml0OiAyMHVzKSAqLworCXJpbmdfY3RybF9kdzIgfD0gTVRLX1JJTkdfQUdFX1RJTUVfSDsKKwlyaW5nX2N0cmxfZHcxIHw9IE1US19SSU5HX0FHRV9USU1FX0w7CisKKwkvKiBzZXQgbWF4IEFHRyB0aW1lciAodW5pdDogMjB1cykgKi8KKwlyaW5nX2N0cmxfZHcyIHw9IE1US19SSU5HX01BWF9BR0dfVElNRTsKKworCS8qIHNldCBtYXggTFJPIEFHRyBjb3VudCAqLworCXJpbmdfY3RybF9kdzIgfD0gTVRLX1JJTkdfTUFYX0FHR19DTlRfTDsKKwlyaW5nX2N0cmxfZHczIHw9IE1US19SSU5HX01BWF9BR0dfQ05UX0g7CisKKwlmb3IgKGkgPSAxOyBpIDwgTVRLX01BWF9SWF9SSU5HX05VTTsgaSsrKSB7CisJCW10a193MzIoZXRoLCByaW5nX2N0cmxfZHcxLCBNVEtfTFJPX0NUUkxfRFcxX0NGRyhpKSk7CisJCW10a193MzIoZXRoLCByaW5nX2N0cmxfZHcyLCBNVEtfTFJPX0NUUkxfRFcyX0NGRyhpKSk7CisJCW10a193MzIoZXRoLCByaW5nX2N0cmxfZHczLCBNVEtfTFJPX0NUUkxfRFczX0NGRyhpKSk7CisJfQorCisJLyogSVB2NCBjaGVja3N1bSB1cGRhdGUgZW5hYmxlICovCisJbHJvX2N0cmxfZHcwIHw9IE1US19MM19DS1NfVVBEX0VOOworCisJLyogc3dpdGNoIHByaW9yaXR5IGNvbXBhcmlzb24gdG8gcGFja2V0IGNvdW50IG1vZGUgKi8KKwlscm9fY3RybF9kdzAgfD0gTVRLX0xST19BTFRfUEtUX0NOVF9NT0RFOworCisJLyogYmFuZHdpZHRoIHRocmVzaG9sZCBzZXR0aW5nICovCisJbXRrX3czMihldGgsIE1US19IV19MUk9fQldfVEhSRSwgTVRLX1BETUFfTFJPX0NUUkxfRFcyKTsKKworCS8qIGF1dG8tbGVhcm4gc2NvcmUgZGVsdGEgc2V0dGluZyAqLworCW10a193MzIoZXRoLCBNVEtfSFdfTFJPX1JFUExBQ0VfREVMVEEsIE1US19QRE1BX0xST19BTFRfU0NPUkVfREVMVEEpOworCisJLyogc2V0IHJlZnJlc2ggdGltZXIgZm9yIGFsdGVyaW5nIGZsb3dzIHRvIDEgc2VjLiAodW5pdDogMjB1cykgKi8KKwltdGtfdzMyKGV0aCwgKE1US19IV19MUk9fVElNRVJfVU5JVCA8PCAxNikgfCBNVEtfSFdfTFJPX1JFRlJFU0hfVElNRSwKKwkJTVRLX1BETUFfTFJPX0FMVF9SRUZSRVNIX1RJTUVSKTsKKworCS8qIHNldCBIVyBMUk8gbW9kZSAmIHRoZSBtYXggYWdncmVnYXRpb24gY291bnQgZm9yIHJ4IHBhY2tldHMgKi8KKwlscm9fY3RybF9kdzMgfD0gTVRLX0FETUFfTU9ERSB8IChNVEtfSFdfTFJPX01BWF9BR0dfQ05UICYgMHhmZik7CisKKwkvKiB0aGUgbWluaW1hbCByZW1haW5pbmcgcm9vbSBvZiBTREwwIGluIFJYRCBmb3IgbHJvIGFnZ3JlZ2F0aW9uICovCisJbHJvX2N0cmxfZHczIHw9IE1US19MUk9fTUlOX1JYRF9TREw7CisKKwkvKiBlbmFibGUgSFcgTFJPICovCisJbHJvX2N0cmxfZHcwIHw9IE1US19MUk9fRU47CisKKwltdGtfdzMyKGV0aCwgbHJvX2N0cmxfZHczLCBNVEtfUERNQV9MUk9fQ1RSTF9EVzMpOworCW10a193MzIoZXRoLCBscm9fY3RybF9kdzAsIE1US19QRE1BX0xST19DVFJMX0RXMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXRrX2h3bHJvX3J4X3VuaW5pdChzdHJ1Y3QgbXRrX2V0aCAqZXRoKQoreworCWludCBpOworCXUzMiB2YWw7CisKKwkvKiByZWxpbnF1aXNoIGxybyByaW5ncywgZmx1c2ggYWdncmVnYXRlZCBwYWNrZXRzICovCisJbXRrX3czMihldGgsIE1US19MUk9fUklOR19SRUxJTlFVSVNIX1JFUSwgTVRLX1BETUFfTFJPX0NUUkxfRFcwKTsKKworCS8qIHdhaXQgZm9yIHJlbGlucXVpc2htZW50cyBkb25lICovCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJdmFsID0gbXRrX3IzMihldGgsIE1US19QRE1BX0xST19DVFJMX0RXMCk7CisJCWlmICh2YWwgJiBNVEtfTFJPX1JJTkdfUkVMSU5RVUlTSF9ET05FKSB7CisJCQltc2xlZXAoMjApOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyogaW52YWxpZGF0ZSBscm8gcmluZ3MgKi8KKwlmb3IgKGkgPSAxOyBpIDwgTVRLX01BWF9SWF9SSU5HX05VTTsgaSsrKQorCQltdGtfdzMyKGV0aCwgMCwgTVRLX0xST19DVFJMX0RXMl9DRkcoaSkpOworCisJLyogZGlzYWJsZSBIVyBMUk8gKi8KKwltdGtfdzMyKGV0aCwgMCwgTVRLX1BETUFfTFJPX0NUUkxfRFcwKTsKK30KKworc3RhdGljIHZvaWQgbXRrX2h3bHJvX3ZhbF9pcGFkZHIoc3RydWN0IG10a19ldGggKmV0aCwgaW50IGlkeCwgX19iZTMyIGlwKQoreworCXUzMiByZWdfdmFsOworCisJcmVnX3ZhbCA9IG10a19yMzIoZXRoLCBNVEtfTFJPX0NUUkxfRFcyX0NGRyhpZHgpKTsKKworCS8qIGludmFsaWRhdGUgdGhlIElQIHNldHRpbmcgKi8KKwltdGtfdzMyKGV0aCwgKHJlZ192YWwgJiB+TVRLX1JJTkdfTVlJUF9WTEQpLCBNVEtfTFJPX0NUUkxfRFcyX0NGRyhpZHgpKTsKKworCW10a193MzIoZXRoLCBpcCwgTVRLX0xST19ESVBfRFcwX0NGRyhpZHgpKTsKKworCS8qIHZhbGlkYXRlIHRoZSBJUCBzZXR0aW5nICovCisJbXRrX3czMihldGgsIChyZWdfdmFsIHwgTVRLX1JJTkdfTVlJUF9WTEQpLCBNVEtfTFJPX0NUUkxfRFcyX0NGRyhpZHgpKTsKK30KKworc3RhdGljIHZvaWQgbXRrX2h3bHJvX2ludmFsX2lwYWRkcihzdHJ1Y3QgbXRrX2V0aCAqZXRoLCBpbnQgaWR4KQoreworCXUzMiByZWdfdmFsOworCisJcmVnX3ZhbCA9IG10a19yMzIoZXRoLCBNVEtfTFJPX0NUUkxfRFcyX0NGRyhpZHgpKTsKKworCS8qIGludmFsaWRhdGUgdGhlIElQIHNldHRpbmcgKi8KKwltdGtfdzMyKGV0aCwgKHJlZ192YWwgJiB+TVRLX1JJTkdfTVlJUF9WTEQpLCBNVEtfTFJPX0NUUkxfRFcyX0NGRyhpZHgpKTsKKworCW10a193MzIoZXRoLCAwLCBNVEtfTFJPX0RJUF9EVzBfQ0ZHKGlkeCkpOworfQorCitzdGF0aWMgaW50IG10a19od2xyb19nZXRfaXBfY250KHN0cnVjdCBtdGtfbWFjICptYWMpCit7CisJaW50IGNudCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVRLX01BWF9MUk9fSVBfQ05UOyBpKyspIHsKKwkJaWYgKG1hYy0+aHdscm9faXBbaV0pCisJCQljbnQrKzsKKwl9CisKKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgaW50IG10a19od2xyb19hZGRfaXBhZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCkKK3sKKwlzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgKmZzcCA9CisJCShzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgKikmY21kLT5mczsKKwlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbXRrX2V0aCAqZXRoID0gbWFjLT5odzsKKwlpbnQgaHdscm9faWR4OworCisJaWYgKChmc3AtPmZsb3dfdHlwZSAhPSBUQ1BfVjRfRkxPVykgfHwKKwkgICAgKCFmc3AtPmhfdS50Y3BfaXA0X3NwZWMuaXA0ZHN0KSB8fAorCSAgICAoZnNwLT5sb2NhdGlvbiA+IDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1hYy0+aHdscm9faXBbZnNwLT5sb2NhdGlvbl0gPSBodG9ubChmc3AtPmhfdS50Y3BfaXA0X3NwZWMuaXA0ZHN0KTsKKwlod2xyb19pZHggPSAobWFjLT5pZCAqIE1US19NQVhfTFJPX0lQX0NOVCkgKyBmc3AtPmxvY2F0aW9uOworCisJbWFjLT5od2xyb19pcF9jbnQgPSBtdGtfaHdscm9fZ2V0X2lwX2NudChtYWMpOworCisJbXRrX2h3bHJvX3ZhbF9pcGFkZHIoZXRoLCBod2xyb19pZHgsIG1hYy0+aHdscm9faXBbZnNwLT5sb2NhdGlvbl0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2h3bHJvX2RlbF9pcGFkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqY21kKQoreworCXN0cnVjdCBldGh0b29sX3J4X2Zsb3dfc3BlYyAqZnNwID0KKwkJKHN0cnVjdCBldGh0b29sX3J4X2Zsb3dfc3BlYyAqKSZjbWQtPmZzOworCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtdGtfZXRoICpldGggPSBtYWMtPmh3OworCWludCBod2xyb19pZHg7CisKKwlpZiAoZnNwLT5sb2NhdGlvbiA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJbWFjLT5od2xyb19pcFtmc3AtPmxvY2F0aW9uXSA9IDA7CisJaHdscm9faWR4ID0gKG1hYy0+aWQgKiBNVEtfTUFYX0xST19JUF9DTlQpICsgZnNwLT5sb2NhdGlvbjsKKworCW1hYy0+aHdscm9faXBfY250ID0gbXRrX2h3bHJvX2dldF9pcF9jbnQobWFjKTsKKworCW10a19od2xyb19pbnZhbF9pcGFkZHIoZXRoLCBod2xyb19pZHgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG10a19od2xyb19uZXRkZXZfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtdGtfZXRoICpldGggPSBtYWMtPmh3OworCWludCBpLCBod2xyb19pZHg7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVRLX01BWF9MUk9fSVBfQ05UOyBpKyspIHsKKwkJbWFjLT5od2xyb19pcFtpXSA9IDA7CisJCWh3bHJvX2lkeCA9IChtYWMtPmlkICogTVRLX01BWF9MUk9fSVBfQ05UKSArIGk7CisKKwkJbXRrX2h3bHJvX2ludmFsX2lwYWRkcihldGgsIGh3bHJvX2lkeCk7CisJfQorCisJbWFjLT5od2xyb19pcF9jbnQgPSAwOworfQorCitzdGF0aWMgaW50IG10a19od2xyb19nZXRfZmRpcl9lbnRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqY21kKQoreworCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBldGh0b29sX3J4X2Zsb3dfc3BlYyAqZnNwID0KKwkJKHN0cnVjdCBldGh0b29sX3J4X2Zsb3dfc3BlYyAqKSZjbWQtPmZzOworCisJLyogb25seSB0Y3AgZHN0IGlwdjQgaXMgbWVhbmluZ2Z1bCwgb3RoZXJzIGFyZSBtZWFuaW5nbGVzcyAqLworCWZzcC0+Zmxvd190eXBlID0gVENQX1Y0X0ZMT1c7CisJZnNwLT5oX3UudGNwX2lwNF9zcGVjLmlwNGRzdCA9IG50b2hsKG1hYy0+aHdscm9faXBbZnNwLT5sb2NhdGlvbl0pOworCWZzcC0+bV91LnRjcF9pcDRfc3BlYy5pcDRkc3QgPSAwOworCisJZnNwLT5oX3UudGNwX2lwNF9zcGVjLmlwNHNyYyA9IDA7CisJZnNwLT5tX3UudGNwX2lwNF9zcGVjLmlwNHNyYyA9IDB4ZmZmZmZmZmY7CisJZnNwLT5oX3UudGNwX2lwNF9zcGVjLnBzcmMgPSAwOworCWZzcC0+bV91LnRjcF9pcDRfc3BlYy5wc3JjID0gMHhmZmZmOworCWZzcC0+aF91LnRjcF9pcDRfc3BlYy5wZHN0ID0gMDsKKwlmc3AtPm1fdS50Y3BfaXA0X3NwZWMucGRzdCA9IDB4ZmZmZjsKKwlmc3AtPmhfdS50Y3BfaXA0X3NwZWMudG9zID0gMDsKKwlmc3AtPm1fdS50Y3BfaXA0X3NwZWMudG9zID0gMHhmZjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10a19od2xyb19nZXRfZmRpcl9hbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQsCisJCQkJICB1MzIgKnJ1bGVfbG9jcykKK3sKKwlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgY250ID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNVEtfTUFYX0xST19JUF9DTlQ7IGkrKykgeworCQlpZiAobWFjLT5od2xyb19pcFtpXSkgeworCQkJcnVsZV9sb2NzW2NudF0gPSBpOworCQkJY250Kys7CisJCX0KKwl9CisKKwljbWQtPnJ1bGVfY250ID0gY250OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBuZXRkZXZfZmVhdHVyZXNfdCBtdGtfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCit7CisJaWYgKCEoZmVhdHVyZXMgJiBORVRJRl9GX0xSTykpIHsKKwkJc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CisJCWludCBpcF9jbnQgPSBtdGtfaHdscm9fZ2V0X2lwX2NudChtYWMpOworCisJCWlmIChpcF9jbnQpIHsKKwkJCW5ldGRldl9pbmZvKGRldiwgIlJYIGZsb3cgaXMgcHJvZ3JhbW1lZCwgTFJPIHNob3VsZCBrZWVwIG9uXG4iKTsKKworCQkJZmVhdHVyZXMgfD0gTkVUSUZfRl9MUk87CisJCX0KKwl9CisKKwlyZXR1cm4gZmVhdHVyZXM7Cit9CisKK3N0YXRpYyBpbnQgbXRrX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKK3sKKwlpbnQgZXJyID0gMDsKKworCWlmICghKChkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXMpICYgTkVUSUZfRl9MUk8pKQorCQlyZXR1cm4gMDsKKworCWlmICghKGZlYXR1cmVzICYgTkVUSUZfRl9MUk8pKQorCQltdGtfaHdscm9fbmV0ZGV2X2Rpc2FibGUoZGV2KTsKKworCXJldHVybiBlcnI7Cit9CisKIC8qIHdhaXQgZm9yIERNQSB0byBmaW5pc2ggd2hhdGV2ZXIgaXQgaXMgZG9pbmcgYmVmb3JlIHdlIHN0YXJ0IHVzaW5nIGl0IGFnYWluICovCiBzdGF0aWMgaW50IG10a19kbWFfYnVzeV93YWl0KHN0cnVjdCBtdGtfZXRoICpldGgpCiB7CkBAIC0xMjA3LDYgKzE1ODEsNyBAQAogc3RhdGljIGludCBtdGtfZG1hX2luaXQoc3RydWN0IG10a19ldGggKmV0aCkKIHsKIAlpbnQgZXJyOworCXUzMiBpOwogCiAJaWYgKG10a19kbWFfYnVzeV93YWl0KGV0aCkpCiAJCXJldHVybiAtRUJVU1k7CkBAIC0xMjIyLDEwICsxNTk3LDIxIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWVyciA9IG10a19yeF9hbGxvYyhldGgpOworCWVyciA9IG10a19yeF9hbGxvYyhldGgsIDAsIE1US19SWF9GTEFHU19OT1JNQUwpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKKwlpZiAoZXRoLT5od2xybykgeworCQlmb3IgKGkgPSAxOyBpIDwgTVRLX01BWF9SWF9SSU5HX05VTTsgaSsrKSB7CisJCQllcnIgPSBtdGtfcnhfYWxsb2MoZXRoLCBpLCBNVEtfUlhfRkxBR1NfSFdMUk8pOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJCWVyciA9IG10a19od2xyb19yeF9pbml0KGV0aCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwogCS8qIEVuYWJsZSByYW5kb20gZWFybHkgZHJvcCBhbmQgc2V0IGRyb3AgdGhyZXNob2xkIGF1dG9tYXRpY2FsbHkgKi8KIAltdGtfdzMyKGV0aCwgRkNfVEhSRVNfRFJPUF9NT0RFIHwgRkNfVEhSRVNfRFJPUF9FTiB8IEZDX1RIUkVTX01JTiwKIAkJTVRLX1FETUFfRkNfVEhSRVMpOwpAQCAtMTI1MCw3ICsxNjM2LDE0IEBACiAJCWV0aC0+cGh5X3NjcmF0Y2hfcmluZyA9IDA7CiAJfQogCW10a190eF9jbGVhbihldGgpOwotCW10a19yeF9jbGVhbihldGgpOworCW10a19yeF9jbGVhbihldGgsIDApOworCisJaWYgKGV0aC0+aHdscm8pIHsKKwkJbXRrX2h3bHJvX3J4X3VuaW5pdChldGgpOworCQlmb3IgKGkgPSAxOyBpIDwgTVRLX01BWF9SWF9SSU5HX05VTTsgaSsrKQorCQkJbXRrX3J4X2NsZWFuKGV0aCwgaSk7CisJfQorCiAJa2ZyZWUoZXRoLT5zY3JhdGNoX2hlYWQpOwogfQogCkBAIC0xMjcxLDcgKzE2NjQsNyBAQAogCiAJaWYgKGxpa2VseShuYXBpX3NjaGVkdWxlX3ByZXAoJmV0aC0+cnhfbmFwaSkpKSB7CiAJCV9fbmFwaV9zY2hlZHVsZSgmZXRoLT5yeF9uYXBpKTsKLQkJbXRrX2lycV9kaXNhYmxlKGV0aCwgTVRLX1JYX0RPTkVfSU5UKTsKKwkJbXRrX2lycV9kaXNhYmxlKGV0aCwgTVRLX1BETUFfSU5UX01BU0ssIE1US19SWF9ET05FX0lOVCk7CiAJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMTI4Myw3ICsxNjc2LDcgQEAKIAogCWlmIChsaWtlbHkobmFwaV9zY2hlZHVsZV9wcmVwKCZldGgtPnR4X25hcGkpKSkgewogCQlfX25hcGlfc2NoZWR1bGUoJmV0aC0+dHhfbmFwaSk7Ci0JCW10a19pcnFfZGlzYWJsZShldGgsIE1US19UWF9ET05FX0lOVCk7CisJCW10a19pcnFfZGlzYWJsZShldGgsIE1US19RRE1BX0lOVF9NQVNLLCBNVEtfVFhfRE9ORV9JTlQpOwogCX0KIAogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTEyOTQsMTEgKzE2ODcsMTIgQEAKIHsKIAlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbXRrX2V0aCAqZXRoID0gbWFjLT5odzsKLQl1MzIgaW50X21hc2sgPSBNVEtfVFhfRE9ORV9JTlQgfCBNVEtfUlhfRE9ORV9JTlQ7CiAKLQltdGtfaXJxX2Rpc2FibGUoZXRoLCBpbnRfbWFzayk7CisJbXRrX2lycV9kaXNhYmxlKGV0aCwgTVRLX1FETUFfSU5UX01BU0ssIE1US19UWF9ET05FX0lOVCk7CisJbXRrX2lycV9kaXNhYmxlKGV0aCwgTVRLX1BETUFfSU5UX01BU0ssIE1US19SWF9ET05FX0lOVCk7CiAJbXRrX2hhbmRsZV9pcnFfcngoZXRoLT5pcnFbMl0sIGRldik7Ci0JbXRrX2lycV9lbmFibGUoZXRoLCBpbnRfbWFzayk7CisJbXRrX2lycV9lbmFibGUoZXRoLCBNVEtfUURNQV9JTlRfTUFTSywgTVRLX1RYX0RPTkVfSU5UKTsKKwltdGtfaXJxX2VuYWJsZShldGgsIE1US19QRE1BX0lOVF9NQVNLLCBNVEtfUlhfRE9ORV9JTlQpOwogfQogI2VuZGlmCiAKQEAgLTEzMTMsMTEgKzE3MDcsMTUgQEAKIAl9CiAKIAltdGtfdzMyKGV0aCwKLQkJTVRLX1RYX1dCX0RET05FIHwgTVRLX1JYX0RNQV9FTiB8IE1US19UWF9ETUFfRU4gfAotCQlNVEtfUlhfMkJfT0ZGU0VUIHwgTVRLX0RNQV9TSVpFXzE2RFdPUkRTIHwKLQkJTVRLX1JYX0JUXzMyRFdPUkRTIHwgTVRLX05EUF9DT19QUk8sCisJCU1US19UWF9XQl9ERE9ORSB8IE1US19UWF9ETUFfRU4gfAorCQlNVEtfRE1BX1NJWkVfMTZEV09SRFMgfCBNVEtfTkRQX0NPX1BSTywKIAkJTVRLX1FETUFfR0xPX0NGRyk7CiAKKwltdGtfdzMyKGV0aCwKKwkJTVRLX1JYX0RNQV9FTiB8IE1US19SWF8yQl9PRkZTRVQgfAorCQlNVEtfUlhfQlRfMzJEV09SRFMgfCBNVEtfTVVMVElfRU4sCisJCU1US19QRE1BX0dMT19DRkcpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzMzUsMTEgKzE3MzMsMTIgQEAKIAogCQluYXBpX2VuYWJsZSgmZXRoLT50eF9uYXBpKTsKIAkJbmFwaV9lbmFibGUoJmV0aC0+cnhfbmFwaSk7Ci0JCW10a19pcnFfZW5hYmxlKGV0aCwgTVRLX1RYX0RPTkVfSU5UIHwgTVRLX1JYX0RPTkVfSU5UKTsKKwkJbXRrX2lycV9lbmFibGUoZXRoLCBNVEtfUURNQV9JTlRfTUFTSywgTVRLX1RYX0RPTkVfSU5UKTsKKwkJbXRrX2lycV9lbmFibGUoZXRoLCBNVEtfUERNQV9JTlRfTUFTSywgTVRLX1JYX0RPTkVfSU5UKTsKIAl9CiAJYXRvbWljX2luYygmZXRoLT5kbWFfcmVmY250KTsKIAotCXBoeV9zdGFydChtYWMtPnBoeV9kZXYpOworCXBoeV9zdGFydChkZXYtPnBoeWRldik7CiAJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKIAogCXJldHVybiAwOwpAQCAtMTM0NywxNiArMTc0NiwxNSBAQAogCiBzdGF0aWMgdm9pZCBtdGtfc3RvcF9kbWEoc3RydWN0IG10a19ldGggKmV0aCwgdTMyIGdsb19jZmcpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgdmFsOwogCWludCBpOwogCiAJLyogc3RvcCB0aGUgZG1hIGVuZ2luZSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZldGgtPnBhZ2VfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19iaCgmZXRoLT5wYWdlX2xvY2spOwogCXZhbCA9IG10a19yMzIoZXRoLCBnbG9fY2ZnKTsKIAltdGtfdzMyKGV0aCwgdmFsICYgfihNVEtfVFhfV0JfRERPTkUgfCBNVEtfUlhfRE1BX0VOIHwgTVRLX1RYX0RNQV9FTiksCiAJCWdsb19jZmcpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0aC0+cGFnZV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfYmgoJmV0aC0+cGFnZV9sb2NrKTsKIAogCS8qIHdhaXQgZm9yIGRtYSBzdG9wICovCiAJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKQEAgLTEzNzUsMzIgKzE3NzMsNjMgQEAKIAlzdHJ1Y3QgbXRrX2V0aCAqZXRoID0gbWFjLT5odzsKIAogCW5ldGlmX3R4X2Rpc2FibGUoZGV2KTsKLQlwaHlfc3RvcChtYWMtPnBoeV9kZXYpOworCXBoeV9zdG9wKGRldi0+cGh5ZGV2KTsKIAogCS8qIG9ubHkgc2h1dGRvd24gRE1BIGlmIHRoaXMgaXMgdGhlIGxhc3QgdXNlciAqLwogCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmZXRoLT5kbWFfcmVmY250KSkKIAkJcmV0dXJuIDA7CiAKLQltdGtfaXJxX2Rpc2FibGUoZXRoLCBNVEtfVFhfRE9ORV9JTlQgfCBNVEtfUlhfRE9ORV9JTlQpOworCW10a19pcnFfZGlzYWJsZShldGgsIE1US19RRE1BX0lOVF9NQVNLLCBNVEtfVFhfRE9ORV9JTlQpOworCW10a19pcnFfZGlzYWJsZShldGgsIE1US19QRE1BX0lOVF9NQVNLLCBNVEtfUlhfRE9ORV9JTlQpOwogCW5hcGlfZGlzYWJsZSgmZXRoLT50eF9uYXBpKTsKIAluYXBpX2Rpc2FibGUoJmV0aC0+cnhfbmFwaSk7CiAKIAltdGtfc3RvcF9kbWEoZXRoLCBNVEtfUURNQV9HTE9fQ0ZHKTsKKwltdGtfc3RvcF9kbWEoZXRoLCBNVEtfUERNQV9HTE9fQ0ZHKTsKIAogCW10a19kbWFfZnJlZShldGgpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IG10a19od19pbml0KHN0cnVjdCBtdGtfZXRoICpldGgpCitzdGF0aWMgdm9pZCBldGhzeXNfcmVzZXQoc3RydWN0IG10a19ldGggKmV0aCwgdTMyIHJlc2V0X2JpdHMpCiB7Ci0JaW50IGVyciwgaTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMoZXRoLT5ldGhzeXMsIEVUSFNZU19SU1RDVFJMLAorCQkJICAgcmVzZXRfYml0cywKKwkJCSAgIHJlc2V0X2JpdHMpOwogCi0JLyogcmVzZXQgdGhlIGZyYW1lIGVuZ2luZSAqLwotCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KGV0aC0+cnN0Yyk7Ci0JdXNsZWVwX3JhbmdlKDEwLCAyMCk7Ci0JcmVzZXRfY29udHJvbF9kZWFzc2VydChldGgtPnJzdGMpOwotCXVzbGVlcF9yYW5nZSgxMCwgMjApOworCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMoZXRoLT5ldGhzeXMsIEVUSFNZU19SU1RDVFJMLAorCQkJICAgcmVzZXRfYml0cywKKwkJCSAgIH5yZXNldF9iaXRzKTsKKwltZGVsYXkoMTApOworfQorCitzdGF0aWMgaW50IG10a19od19pbml0KHN0cnVjdCBtdGtfZXRoICpldGgpCit7CisJaW50IGksIHZhbDsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KE1US19IV19JTklULCAmZXRoLT5zdGF0ZSkpCisJCXJldHVybiAwOworCisJcG1fcnVudGltZV9lbmFibGUoZXRoLT5kZXYpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZXRoLT5kZXYpOworCisJY2xrX3ByZXBhcmVfZW5hYmxlKGV0aC0+Y2xrc1tNVEtfQ0xLX0VUSElGXSk7CisJY2xrX3ByZXBhcmVfZW5hYmxlKGV0aC0+Y2xrc1tNVEtfQ0xLX0VTV10pOworCWNsa19wcmVwYXJlX2VuYWJsZShldGgtPmNsa3NbTVRLX0NMS19HUDFdKTsKKwljbGtfcHJlcGFyZV9lbmFibGUoZXRoLT5jbGtzW01US19DTEtfR1AyXSk7CisJZXRoc3lzX3Jlc2V0KGV0aCwgUlNUQ1RSTF9GRSk7CisJZXRoc3lzX3Jlc2V0KGV0aCwgUlNUQ1RSTF9QUEUpOworCisJcmVnbWFwX3JlYWQoZXRoLT5ldGhzeXMsIEVUSFNZU19TWVNDRkcwLCAmdmFsKTsKKwlmb3IgKGkgPSAwOyBpIDwgTVRLX01BQ19DT1VOVDsgaSsrKSB7CisJCWlmICghZXRoLT5tYWNbaV0pCisJCQljb250aW51ZTsKKwkJdmFsICY9IH5TWVNDRkcwX0dFX01PREUoU1lTQ0ZHMF9HRV9NQVNLLCBldGgtPm1hY1tpXS0+aWQpOworCQl2YWwgfD0gU1lTQ0ZHMF9HRV9NT0RFKGV0aC0+bWFjW2ldLT5nZV9tb2RlLCBldGgtPm1hY1tpXS0+aWQpOworCX0KKwlyZWdtYXBfd3JpdGUoZXRoLT5ldGhzeXMsIEVUSFNZU19TWVNDRkcwLCB2YWwpOwogCiAJLyogU2V0IEdFMiBkcml2aW5nIGFuZCBzbGV3IHJhdGUgKi8KIAlyZWdtYXBfd3JpdGUoZXRoLT5wY3RsLCBHUElPX0RSVl9TRUwxMCwgMHhhMDApOwpAQCAtMTQyMCwyMiArMTg0OSwxMSBAQAogCS8qIEVuYWJsZSBSWCBWTGFuIE9mZmxvYWRpbmcgKi8KIAltdGtfdzMyKGV0aCwgMSwgTVRLX0NETVBfRUdfQ1RSTCk7CiAKLQllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKGV0aC0+ZGV2LCBldGgtPmlycVsxXSwgbXRrX2hhbmRsZV9pcnFfdHgsIDAsCi0JCQkgICAgICAgZGV2X25hbWUoZXRoLT5kZXYpLCBldGgpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0JZXJyID0gZGV2bV9yZXF1ZXN0X2lycShldGgtPmRldiwgZXRoLT5pcnFbMl0sIG10a19oYW5kbGVfaXJxX3J4LCAwLAotCQkJICAgICAgIGRldl9uYW1lKGV0aC0+ZGV2KSwgZXRoKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZXJyID0gbXRrX21kaW9faW5pdChldGgpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KIAkvKiBkaXNhYmxlIGRlbGF5IGFuZCBub3JtYWwgaW50ZXJydXB0ICovCiAJbXRrX3czMihldGgsIDAsIE1US19RRE1BX0RFTEFZX0lOVCk7Ci0JbXRrX2lycV9kaXNhYmxlKGV0aCwgfjApOworCW10a193MzIoZXRoLCAwLCBNVEtfUERNQV9ERUxBWV9JTlQpOworCW10a19pcnFfZGlzYWJsZShldGgsIE1US19RRE1BX0lOVF9NQVNLLCB+MCk7CisJbXRrX2lycV9kaXNhYmxlKGV0aCwgTVRLX1BETUFfSU5UX01BU0ssIH4wKTsKIAltdGtfdzMyKGV0aCwgUlNUX0dMX1BTRSwgTVRLX1JTVF9HTCk7CiAJbXRrX3czMihldGgsIDAsIE1US19SU1RfR0wpOwogCkBAIC0xNDQ5LDkgKzE4NjcsOCBAQAogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKIAkJdTMyIHZhbCA9IG10a19yMzIoZXRoLCBNVEtfR0RNQV9GV0RfQ0ZHKGkpKTsKIAotCQkvKiBzZXR1cCB0aGUgZm9yd2FyZCBwb3J0IHRvIHNlbmQgZnJhbWUgdG8gUURNQSAqLworCQkvKiBzZXR1cCB0aGUgZm9yd2FyZCBwb3J0IHRvIHNlbmQgZnJhbWUgdG8gUERNQSAqLwogCQl2YWwgJj0gfjB4ZmZmZjsKLQkJdmFsIHw9IDB4NTU1NTsKIAogCQkvKiBFbmFibGUgUlggY2hlY2tzdW0gKi8KIAkJdmFsIHw9IE1US19HRE1BX0lDU19FTiB8IE1US19HRE1BX1RDU19FTiB8IE1US19HRE1BX1VDU19FTjsKQEAgLTE0NjMsNiArMTg4MCwyMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG10a19od19kZWluaXQoc3RydWN0IG10a19ldGggKmV0aCkKK3sKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChNVEtfSFdfSU5JVCwgJmV0aC0+c3RhdGUpKQorCQlyZXR1cm4gMDsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShldGgtPmNsa3NbTVRLX0NMS19HUDJdKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZXRoLT5jbGtzW01US19DTEtfR1AxXSk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGV0aC0+Y2xrc1tNVEtfQ0xLX0VTV10pOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShldGgtPmNsa3NbTVRLX0NMS19FVEhJRl0pOworCisJcG1fcnVudGltZV9wdXRfc3luYyhldGgtPmRldik7CisJcG1fcnVudGltZV9kaXNhYmxlKGV0aC0+ZGV2KTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBtdGtfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMTQ4MSw3ICsxOTE0LDcgQEAKIAkJZGV2LT5hZGRyX2Fzc2lnbl90eXBlID0gTkVUX0FERFJfUkFORE9NOwogCX0KIAotCXJldHVybiBtdGtfcGh5X2Nvbm5lY3QobWFjKTsKKwlyZXR1cm4gbXRrX3BoeV9jb25uZWN0KGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIG10a191bmluaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTE0ODksMjIgKzE5MjIsMTggQEAKIAlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbXRrX2V0aCAqZXRoID0gbWFjLT5odzsKIAotCXBoeV9kaXNjb25uZWN0KG1hYy0+cGh5X2Rldik7Ci0JbXRrX21kaW9fY2xlYW51cChldGgpOwotCW10a19pcnFfZGlzYWJsZShldGgsIH4wKTsKLQlmcmVlX2lycShldGgtPmlycVsxXSwgZGV2KTsKLQlmcmVlX2lycShldGgtPmlycVsyXSwgZGV2KTsKKwlwaHlfZGlzY29ubmVjdChkZXYtPnBoeWRldik7CisJbXRrX2lycV9kaXNhYmxlKGV0aCwgTVRLX1FETUFfSU5UX01BU0ssIH4wKTsKKwltdGtfaXJxX2Rpc2FibGUoZXRoLCBNVEtfUERNQV9JTlRfTUFTSywgfjApOwogfQogCiBzdGF0aWMgaW50IG10a19kb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKIHsKLQlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTSU9DR01JSVBIWToKIAljYXNlIFNJT0NHTUlJUkVHOgogCWNhc2UgU0lPQ1NNSUlSRUc6Ci0JCXJldHVybiBwaHlfbWlpX2lvY3RsKG1hYy0+cGh5X2RldiwgaWZyLCBjbWQpOworCQlyZXR1cm4gcGh5X21paV9pb2N0bChkZXYtPnBoeWRldiwgaWZyLCBjbWQpOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTE1MjAsNiArMTk0OSwxMiBAQAogCiAJcnRubF9sb2NrKCk7CiAKKwlkZXZfZGJnKGV0aC0+ZGV2LCAiWyVzXVslZF0gcmVzZXRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdF9sb2NrKE1US19SRVNFVFRJTkcsICZldGgtPnN0YXRlKSkKKwkJY3B1X3JlbGF4KCk7CisKKwlkZXZfZGJnKGV0aC0+ZGV2LCAiWyVzXVslZF0gbXRrX3N0b3Agc3RhcnRzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCS8qIHN0b3AgYWxsIGRldmljZXMgdG8gbWFrZSBzdXJlIHRoYXQgZG1hIGlzIHByb3Blcmx5IHNodXQgZG93biAqLwogCWZvciAoaSA9IDA7IGkgPCBNVEtfTUFDX0NPVU5UOyBpKyspIHsKIAkJaWYgKCFldGgtPm5ldGRldltpXSkKQEAgLTE1MjcsNiArMTk2MiwyNyBAQAogCQltdGtfc3RvcChldGgtPm5ldGRldltpXSk7CiAJCV9fc2V0X2JpdChpLCAmcmVzdGFydCk7CiAJfQorCWRldl9kYmcoZXRoLT5kZXYsICJbJXNdWyVkXSBtdGtfc3RvcCBlbmRzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJLyogcmVzdGFydCB1bmRlcmx5aW5nIGhhcmR3YXJlIHN1Y2ggYXMgcG93ZXIsIGNsb2NrLCBwaW4gbXV4CisJICogYW5kIHRoZSBjb25uZWN0ZWQgcGh5CisJICovCisJbXRrX2h3X2RlaW5pdChldGgpOworCisJaWYgKGV0aC0+ZGV2LT5waW5zKQorCQlwaW5jdHJsX3NlbGVjdF9zdGF0ZShldGgtPmRldi0+cGlucy0+cCwKKwkJCQkgICAgIGV0aC0+ZGV2LT5waW5zLT5kZWZhdWx0X3N0YXRlKTsKKwltdGtfaHdfaW5pdChldGgpOworCisJZm9yIChpID0gMDsgaSA8IE1US19NQUNfQ09VTlQ7IGkrKykgeworCQlpZiAoIWV0aC0+bWFjW2ldIHx8CisJCSAgICBvZl9waHlfaXNfZml4ZWRfbGluayhldGgtPm1hY1tpXS0+b2Zfbm9kZSkpCisJCQljb250aW51ZTsKKwkJZXJyID0gcGh5X2luaXRfaHcoZXRoLT5uZXRkZXZbaV0tPnBoeWRldik7CisJCWlmIChlcnIpCisJCQlkZXZfZXJyKGV0aC0+ZGV2LCAiJXM6IFBIWSBpbml0IGZhaWxlZC5cbiIsCisJCQkJZXRoLT5uZXRkZXZbaV0tPm5hbWUpOworCX0KIAogCS8qIHJlc3RhcnQgRE1BIGFuZCBlbmFibGUgSVJRcyAqLwogCWZvciAoaSA9IDA7IGkgPCBNVEtfTUFDX0NPVU5UOyBpKyspIHsKQEAgLTE1MzksNTEgKzE5OTUsNjkgQEAKIAkJCWRldl9jbG9zZShldGgtPm5ldGRldltpXSk7CiAJCX0KIAl9CisKKwlkZXZfZGJnKGV0aC0+ZGV2LCAiWyVzXVslZF0gcmVzZXQgZG9uZVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCWNsZWFyX2JpdF91bmxvY2soTVRLX1JFU0VUVElORywgJmV0aC0+c3RhdGUpOworCiAJcnRubF91bmxvY2soKTsKIH0KIAotc3RhdGljIGludCBtdGtfY2xlYW51cChzdHJ1Y3QgbXRrX2V0aCAqZXRoKQorc3RhdGljIGludCBtdGtfZnJlZV9kZXYoc3RydWN0IG10a19ldGggKmV0aCkKIHsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBNVEtfTUFDX0NPVU5UOyBpKyspIHsKIAkJaWYgKCFldGgtPm5ldGRldltpXSkKIAkJCWNvbnRpbnVlOwotCi0JCXVucmVnaXN0ZXJfbmV0ZGV2KGV0aC0+bmV0ZGV2W2ldKTsKIAkJZnJlZV9uZXRkZXYoZXRoLT5uZXRkZXZbaV0pOwogCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10a191bnJlZ19kZXYoc3RydWN0IG10a19ldGggKmV0aCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNVEtfTUFDX0NPVU5UOyBpKyspIHsKKwkJaWYgKCFldGgtPm5ldGRldltpXSkKKwkJCWNvbnRpbnVlOworCQl1bnJlZ2lzdGVyX25ldGRldihldGgtPm5ldGRldltpXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2NsZWFudXAoc3RydWN0IG10a19ldGggKmV0aCkKK3sKKwltdGtfdW5yZWdfZGV2KGV0aCk7CisJbXRrX2ZyZWVfZGV2KGV0aCk7CiAJY2FuY2VsX3dvcmtfc3luYygmZXRoLT5wZW5kaW5nX3dvcmspOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXRrX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIGludCBtdGtfZ2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJCSAgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKLQlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgZXJyOworCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAotCWVyciA9IHBoeV9yZWFkX3N0YXR1cyhtYWMtPnBoeV9kZXYpOwotCWlmIChlcnIpCi0JCXJldHVybiAtRU5PREVWOworCWlmICh1bmxpa2VseSh0ZXN0X2JpdChNVEtfUkVTRVRUSU5HLCAmbWFjLT5ody0+c3RhdGUpKSkKKwkJcmV0dXJuIC1FQlVTWTsKIAotCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KG1hYy0+cGh5X2RldiwgY21kKTsKKwlyZXR1cm4gcGh5X2V0aHRvb2xfa3NldHRpbmdzX2dldChuZGV2LT5waHlkZXYsIGNtZCk7CiB9CiAKLXN0YXRpYyBpbnQgbXRrX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIGludCBtdGtfc2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKLQlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYobmRldik7CiAKLQlpZiAoY21kLT5waHlfYWRkcmVzcyAhPSBtYWMtPnBoeV9kZXYtPm1kaW8uYWRkcikgewotCQltYWMtPnBoeV9kZXYgPSBtZGlvYnVzX2dldF9waHkobWFjLT5ody0+bWlpX2J1cywKLQkJCQkJICAgICAgIGNtZC0+cGh5X2FkZHJlc3MpOwotCQlpZiAoIW1hYy0+cGh5X2RldikKLQkJCXJldHVybiAtRU5PREVWOwotCX0KKwlpZiAodW5saWtlbHkodGVzdF9iaXQoTVRLX1JFU0VUVElORywgJm1hYy0+aHctPnN0YXRlKSkpCisJCXJldHVybiAtRUJVU1k7CiAKLQlyZXR1cm4gcGh5X2V0aHRvb2xfc3NldChtYWMtPnBoeV9kZXYsIGNtZCk7CisJcmV0dXJuIHBoeV9ldGh0b29sX2tzZXR0aW5nc19zZXQobmRldi0+cGh5ZGV2LCBjbWQpOwogfQogCiBzdGF0aWMgdm9pZCBtdGtfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTE2MTQsNyArMjA4OCwxMCBAQAogewogCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JcmV0dXJuIGdlbnBoeV9yZXN0YXJ0X2FuZWcobWFjLT5waHlfZGV2KTsKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoTVRLX1JFU0VUVElORywgJm1hYy0+aHctPnN0YXRlKSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4gZ2VucGh5X3Jlc3RhcnRfYW5lZyhkZXYtPnBoeWRldik7CiB9CiAKIHN0YXRpYyB1MzIgbXRrX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xNjIyLDExICsyMDk5LDE0IEBACiAJc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGVycjsKIAotCWVyciA9IGdlbnBoeV91cGRhdGVfbGluayhtYWMtPnBoeV9kZXYpOworCWlmICh1bmxpa2VseSh0ZXN0X2JpdChNVEtfUkVTRVRUSU5HLCAmbWFjLT5ody0+c3RhdGUpKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWVyciA9IGdlbnBoeV91cGRhdGVfbGluayhkZXYtPnBoeWRldik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGV0aHRvb2xfb3BfZ2V0X2xpbmsoZGV2KTsKIAotCXJldHVybiBtYWMtPnBoeV9kZXYtPmxpbms7CisJcmV0dXJuIGRldi0+cGh5ZGV2LT5saW5rOwogfQogCiBzdGF0aWMgdm9pZCBtdGtfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0cmluZ3NldCwgdTggKmRhdGEpCkBAIC0xNjYyLDYgKzIxNDIsOSBAQAogCXVuc2lnbmVkIGludCBzdGFydDsKIAlpbnQgaTsKIAorCWlmICh1bmxpa2VseSh0ZXN0X2JpdChNVEtfUkVTRVRUSU5HLCAmbWFjLT5ody0+c3RhdGUpKSkKKwkJcmV0dXJuOworCiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSAmJiBuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKSB7CiAJCWlmIChzcGluX3RyeWxvY2soJmh3c3RhdHMtPnN0YXRzX2xvY2spKSB7CiAJCQltdGtfc3RhdHNfdXBkYXRlX21hYyhtYWMpOwpAQCAtMTY2OSw4ICsyMTUyLDkgQEAKIAkJfQogCX0KIAorCWRhdGFfc3JjID0gKHU2NCAqKWh3c3RhdHM7CisKIAlkbyB7Ci0JCWRhdGFfc3JjID0gKHU2NCopaHdzdGF0czsKIAkJZGF0YV9kc3QgPSBkYXRhOwogCQlzdGFydCA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbl9pcnEoJmh3c3RhdHMtPnN5bmNwKTsKIApAQCAtMTY3OSw5ICsyMTYzLDY1IEBACiAJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5X2lycSgmaHdzdGF0cy0+c3luY3AsIHN0YXJ0KSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbXRrX2V0aHRvb2xfb3BzID0gewotCS5nZXRfc2V0dGluZ3MJCT0gbXRrX2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzCQk9IG10a19zZXRfc2V0dGluZ3MsCitzdGF0aWMgaW50IG10a19nZXRfcnhuZmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCwKKwkJCSB1MzIgKnJ1bGVfbG9jcykKK3sKKwlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlzd2l0Y2ggKGNtZC0+Y21kKSB7CisJY2FzZSBFVEhUT09MX0dSWFJJTkdTOgorCQlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTFJPKSB7CisJCQljbWQtPmRhdGEgPSBNVEtfTUFYX1JYX1JJTkdfTlVNOworCQkJcmV0ID0gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1JYQ0xTUkxDTlQ6CisJCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pIHsKKwkJCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCQljbWQtPnJ1bGVfY250ID0gbWFjLT5od2xyb19pcF9jbnQ7CisJCQlyZXQgPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9HUlhDTFNSVUxFOgorCQlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTFJPKQorCQkJcmV0ID0gbXRrX2h3bHJvX2dldF9mZGlyX2VudHJ5KGRldiwgY21kKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX0dSWENMU1JMQUxMOgorCQlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTFJPKQorCQkJcmV0ID0gbXRrX2h3bHJvX2dldF9mZGlyX2FsbChkZXYsIGNtZCwKKwkJCQkJCSAgICAgcnVsZV9sb2NzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtdGtfc2V0X3J4bmZjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQpCit7CisJaW50IHJldCA9IC1FT1BOT1RTVVBQOworCisJc3dpdGNoIChjbWQtPmNtZCkgeworCWNhc2UgRVRIVE9PTF9TUlhDTFNSTElOUzoKKwkJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xSTykKKwkJCXJldCA9IG10a19od2xyb19hZGRfaXBhZGRyKGRldiwgY21kKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX1NSWENMU1JMREVMOgorCQlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTFJPKQorCQkJcmV0ID0gbXRrX2h3bHJvX2RlbF9pcGFkZHIoZGV2LCBjbWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIG10a19ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2xpbmtfa3NldHRpbmdzCT0gbXRrX2dldF9saW5rX2tzZXR0aW5ncywKKwkuc2V0X2xpbmtfa3NldHRpbmdzCT0gbXRrX3NldF9saW5rX2tzZXR0aW5ncywKIAkuZ2V0X2RydmluZm8JCT0gbXRrX2dldF9kcnZpbmZvLAogCS5nZXRfbXNnbGV2ZWwJCT0gbXRrX2dldF9tc2dsZXZlbCwKIAkuc2V0X21zZ2xldmVsCQk9IG10a19zZXRfbXNnbGV2ZWwsCkBAIC0xNjkwLDYgKzIyMzAsOCBAQAogCS5nZXRfc3RyaW5ncwkJPSBtdGtfZ2V0X3N0cmluZ3MsCiAJLmdldF9zc2V0X2NvdW50CQk9IG10a19nZXRfc3NldF9jb3VudCwKIAkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBtdGtfZ2V0X2V0aHRvb2xfc3RhdHMsCisJLmdldF9yeG5mYwkJPSBtdGtfZ2V0X3J4bmZjLAorCS5zZXRfcnhuZmMgICAgICAgICAgICAgID0gbXRrX3NldF9yeG5mYywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbXRrX25ldGRldl9vcHMgPSB7CkBAIC0xNzA0LDYgKzIyNDYsOCBAQAogCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKIAkubmRvX3R4X3RpbWVvdXQJCT0gbXRrX3R4X3RpbWVvdXQsCiAJLm5kb19nZXRfc3RhdHM2NCAgICAgICAgPSBtdGtfZ2V0X3N0YXRzNjQsCisJLm5kb19maXhfZmVhdHVyZXMJPSBtdGtfZml4X2ZlYXR1cmVzLAorCS5uZG9fc2V0X2ZlYXR1cmVzCT0gbXRrX3NldF9mZWF0dXJlcywKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gbXRrX3BvbGxfY29udHJvbGxlciwKICNlbmRpZgpAQCAtMTc0Miw2ICsyMjg2LDkgQEAKIAltYWMtPmh3ID0gZXRoOwogCW1hYy0+b2Zfbm9kZSA9IG5wOwogCisJbWVtc2V0KG1hYy0+aHdscm9faXAsIDAsIHNpemVvZihtYWMtPmh3bHJvX2lwKSk7CisJbWFjLT5od2xyb19pcF9jbnQgPSAwOworCiAJbWFjLT5od19zdGF0cyA9IGRldm1fa3phbGxvYyhldGgtPmRldiwKIAkJCQkgICAgIHNpemVvZigqbWFjLT5od19zdGF0cyksCiAJCQkJICAgICBHRlBfS0VSTkVMKTsKQEAgLTE3NTEsMjcgKzIyOTgsMjQgQEAKIAkJZ290byBmcmVlX25ldGRldjsKIAl9CiAJc3Bpbl9sb2NrX2luaXQoJm1hYy0+aHdfc3RhdHMtPnN0YXRzX2xvY2spOworCXU2NF9zdGF0c19pbml0KCZtYWMtPmh3X3N0YXRzLT5zeW5jcCk7CiAJbWFjLT5od19zdGF0cy0+cmVnX29mZnNldCA9IGlkICogTVRLX1NUQVRfT0ZGU0VUOwogCiAJU0VUX05FVERFVl9ERVYoZXRoLT5uZXRkZXZbaWRdLCBldGgtPmRldik7CiAJZXRoLT5uZXRkZXZbaWRdLT53YXRjaGRvZ190aW1lbyA9IDUgKiBIWjsKIAlldGgtPm5ldGRldltpZF0tPm5ldGRldl9vcHMgPSAmbXRrX25ldGRldl9vcHM7CiAJZXRoLT5uZXRkZXZbaWRdLT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZylldGgtPmJhc2U7CisKKwlldGgtPm5ldGRldltpZF0tPmh3X2ZlYXR1cmVzID0gTVRLX0hXX0ZFQVRVUkVTOworCWlmIChldGgtPmh3bHJvKQorCQlldGgtPm5ldGRldltpZF0tPmh3X2ZlYXR1cmVzIHw9IE5FVElGX0ZfTFJPOworCiAJZXRoLT5uZXRkZXZbaWRdLT52bGFuX2ZlYXR1cmVzID0gTVRLX0hXX0ZFQVRVUkVTICYKIAkJfihORVRJRl9GX0hXX1ZMQU5fQ1RBR19UWCB8IE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYKTsKIAlldGgtPm5ldGRldltpZF0tPmZlYXR1cmVzIHw9IE1US19IV19GRUFUVVJFUzsKIAlldGgtPm5ldGRldltpZF0tPmV0aHRvb2xfb3BzID0gJm10a19ldGh0b29sX29wczsKIAotCWVyciA9IHJlZ2lzdGVyX25ldGRldihldGgtPm5ldGRldltpZF0pOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycihldGgtPmRldiwgImVycm9yIGJyaW5naW5nIHVwIGRldmljZVxuIik7Ci0JCWdvdG8gZnJlZV9uZXRkZXY7Ci0JfQogCWV0aC0+bmV0ZGV2W2lkXS0+aXJxID0gZXRoLT5pcnFbMF07Ci0JbmV0aWZfaW5mbyhldGgsIHByb2JlLCBldGgtPm5ldGRldltpZF0sCi0JCSAgICJtZWRpYXRlayBmcmFtZSBlbmdpbmUgYXQgMHglMDhseCwgaXJxICVkXG4iLAotCQkgICBldGgtPm5ldGRldltpZF0tPmJhc2VfYWRkciwgZXRoLT5pcnFbMF0pOwotCiAJcmV0dXJuIDA7CiAKIGZyZWVfbmV0ZGV2OgpAQCAtMTc5Niw2ICsyMzQwLDcgQEAKIAlpZiAoIWV0aCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlldGgtPmRldiA9ICZwZGV2LT5kZXY7CiAJZXRoLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CiAJaWYgKElTX0VSUihldGgtPmJhc2UpKQogCQlyZXR1cm4gUFRSX0VSUihldGgtPmJhc2UpOwpAQCAtMTgxNywxMSArMjM2Miw3IEBACiAJCXJldHVybiBQVFJfRVJSKGV0aC0+cGN0bCk7CiAJfQogCi0JZXRoLT5yc3RjID0gZGV2bV9yZXNldF9jb250cm9sX2dldCgmcGRldi0+ZGV2LCAiZXRoIik7Ci0JaWYgKElTX0VSUihldGgtPnJzdGMpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGV0aCByZXNldCBmb3VuZFxuIik7Ci0JCXJldHVybiBQVFJfRVJSKGV0aC0+cnN0Yyk7Ci0JfQorCWV0aC0+aHdscm8gPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsICJtZWRpYXRlayxod2xybyIpOwogCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQlldGgtPmlycVtpXSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgaSk7CkBAIC0xODMwLDIxICsyMzcxLDE2IEBACiAJCQlyZXR1cm4gLUVOWElPOwogCQl9CiAJfQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGV0aC0+Y2xrcyk7IGkrKykgeworCQlldGgtPmNsa3NbaV0gPSBkZXZtX2Nsa19nZXQoZXRoLT5kZXYsCisJCQkJCSAgICBtdGtfY2xrc19zb3VyY2VfbmFtZVtpXSk7CisJCWlmIChJU19FUlIoZXRoLT5jbGtzW2ldKSkgeworCQkJaWYgKFBUUl9FUlIoZXRoLT5jbGtzW2ldKSA9PSAtRVBST0JFX0RFRkVSKQorCQkJCXJldHVybiAtRVBST0JFX0RFRkVSOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CiAKLQlldGgtPmNsa19ldGhpZiA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiZXRoaWYiKTsKLQlldGgtPmNsa19lc3cgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImVzdyIpOwotCWV0aC0+Y2xrX2dwMSA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiZ3AxIik7Ci0JZXRoLT5jbGtfZ3AyID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJncDIiKTsKLQlpZiAoSVNfRVJSKGV0aC0+Y2xrX2VzdykgfHwgSVNfRVJSKGV0aC0+Y2xrX2dwMSkgfHwKLQkgICAgSVNfRVJSKGV0aC0+Y2xrX2dwMikgfHwgSVNfRVJSKGV0aC0+Y2xrX2V0aGlmKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQljbGtfcHJlcGFyZV9lbmFibGUoZXRoLT5jbGtfZXRoaWYpOwotCWNsa19wcmVwYXJlX2VuYWJsZShldGgtPmNsa19lc3cpOwotCWNsa19wcmVwYXJlX2VuYWJsZShldGgtPmNsa19ncDEpOwotCWNsa19wcmVwYXJlX2VuYWJsZShldGgtPmNsa19ncDIpOwotCi0JZXRoLT5kZXYgPSAmcGRldi0+ZGV2OwogCWV0aC0+bXNnX2VuYWJsZSA9IG5ldGlmX21zZ19pbml0KG10a19tc2dfbGV2ZWwsIE1US19ERUZBVUxUX01TR19FTkFCTEUpOwogCUlOSVRfV09SSygmZXRoLT5wZW5kaW5nX3dvcmssIG10a19wZW5kaW5nX3dvcmspOwogCkBAIC0xODYyLDcgKzIzOTgsMzUgQEAKIAogCQllcnIgPSBtdGtfYWRkX21hYyhldGgsIG1hY19ucCk7CiAJCWlmIChlcnIpCi0JCQlnb3RvIGVycl9mcmVlX2RldjsKKwkJCWdvdG8gZXJyX2RlaW5pdF9odzsKKwl9CisKKwllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKGV0aC0+ZGV2LCBldGgtPmlycVsxXSwgbXRrX2hhbmRsZV9pcnFfdHgsIDAsCisJCQkgICAgICAgZGV2X25hbWUoZXRoLT5kZXYpLCBldGgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWVfZGV2OworCisJZXJyID0gZGV2bV9yZXF1ZXN0X2lycShldGgtPmRldiwgZXRoLT5pcnFbMl0sIG10a19oYW5kbGVfaXJxX3J4LCAwLAorCQkJICAgICAgIGRldl9uYW1lKGV0aC0+ZGV2KSwgZXRoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX2RldjsKKworCWVyciA9IG10a19tZGlvX2luaXQoZXRoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX2RldjsKKworCWZvciAoaSA9IDA7IGkgPCBNVEtfTUFYX0RFVlM7IGkrKykgeworCQlpZiAoIWV0aC0+bmV0ZGV2W2ldKQorCQkJY29udGludWU7CisKKwkJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGV0aC0+bmV0ZGV2W2ldKTsKKwkJaWYgKGVycikgeworCQkJZGV2X2VycihldGgtPmRldiwgImVycm9yIGJyaW5naW5nIHVwIGRldmljZVxuIik7CisJCQlnb3RvIGVycl9kZWluaXRfbWRpbzsKKwkJfSBlbHNlCisJCQluZXRpZl9pbmZvKGV0aCwgcHJvYmUsIGV0aC0+bmV0ZGV2W2ldLAorCQkJCSAgICJtZWRpYXRlayBmcmFtZSBlbmdpbmUgYXQgMHglMDhseCwgaXJxICVkXG4iLAorCQkJCSAgIGV0aC0+bmV0ZGV2W2ldLT5iYXNlX2FkZHIsIGV0aC0+aXJxWzBdKTsKIAl9CiAKIAkvKiB3ZSBydW4gMiBkZXZpY2VzIG9uIHRoZSBzYW1lIERNQSByaW5nIHNvIHdlIG5lZWQgYSBkdW1teSBkZXZpY2UKQEAgLTE4NzgsMjQgKzI0NDIsMzQgQEAKIAogCXJldHVybiAwOwogCitlcnJfZGVpbml0X21kaW86CisJbXRrX21kaW9fY2xlYW51cChldGgpOwogZXJyX2ZyZWVfZGV2OgotCW10a19jbGVhbnVwKGV0aCk7CisJbXRrX2ZyZWVfZGV2KGV0aCk7CitlcnJfZGVpbml0X2h3OgorCW10a19od19kZWluaXQoZXRoKTsKKwogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgbXRrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBtdGtfZXRoICpldGggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgaTsKIAotCWNsa19kaXNhYmxlX3VucHJlcGFyZShldGgtPmNsa19ldGhpZik7Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGV0aC0+Y2xrX2Vzdyk7Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGV0aC0+Y2xrX2dwMSk7Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGV0aC0+Y2xrX2dwMik7CisJLyogc3RvcCBhbGwgZGV2aWNlcyB0byBtYWtlIHN1cmUgdGhhdCBkbWEgaXMgcHJvcGVybHkgc2h1dCBkb3duICovCisJZm9yIChpID0gMDsgaSA8IE1US19NQUNfQ09VTlQ7IGkrKykgeworCQlpZiAoIWV0aC0+bmV0ZGV2W2ldKQorCQkJY29udGludWU7CisJCW10a19zdG9wKGV0aC0+bmV0ZGV2W2ldKTsKKwl9CisKKwltdGtfaHdfZGVpbml0KGV0aCk7CiAKIAluZXRpZl9uYXBpX2RlbCgmZXRoLT50eF9uYXBpKTsKIAluZXRpZl9uYXBpX2RlbCgmZXRoLT5yeF9uYXBpKTsKIAltdGtfY2xlYW51cChldGgpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCW10a19tZGlvX2NsZWFudXAoZXRoKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTkwNCw2ICsyNDc4LDcgQEAKIAl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10NzYyMy1ldGgiIH0sCiAJe30sCiB9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb2ZfbXRrX21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXRrX2RyaXZlciA9IHsKIAkucHJvYmUgPSBtdGtfcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWRpYXRlay9tdGtfZXRoX3NvYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVkaWF0ZWsvbXRrX2V0aF9zb2MuaAppbmRleCBmODJlM2FjLi4zMDAzMTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWRpYXRlay9tdGtfZXRoX3NvYy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lZGlhdGVrL210a19ldGhfc29jLmgKQEAgLTM5LDcgKzM5LDIxIEBACiAJCQkJIE5FVElGX0ZfU0cgfCBORVRJRl9GX1RTTyB8IFwKIAkJCQkgTkVUSUZfRl9UU082IHwgXAogCQkJCSBORVRJRl9GX0lQVjZfQ1NVTSkKLSNkZWZpbmUgTkVYVF9SWF9ERVNQX0lEWChYKQkoKChYKSArIDEpICYgKE1US19ETUFfU0laRSAtIDEpKQorI2RlZmluZSBORVhUX1JYX0RFU1BfSURYKFgsIFkpCSgoKFgpICsgMSkgJiAoKFkpIC0gMSkpCisKKyNkZWZpbmUgTVRLX01BWF9SWF9SSU5HX05VTQk0CisjZGVmaW5lIE1US19IV19MUk9fRE1BX1NJWkUJOAorCisjZGVmaW5lCU1US19NQVhfTFJPX1JYX0xFTkdUSAkJKDQwOTYgKiAzKQorI2RlZmluZQlNVEtfTUFYX0xST19JUF9DTlQJCTIKKyNkZWZpbmUJTVRLX0hXX0xST19USU1FUl9VTklUCQkxCS8qIDIwIHVzICovCisjZGVmaW5lCU1US19IV19MUk9fUkVGUkVTSF9USU1FCQk1MDAwMAkvKiAxIHNlYy4gKi8KKyNkZWZpbmUJTVRLX0hXX0xST19BR0dfVElNRQkJMTAJLyogMjAwdXMgKi8KKyNkZWZpbmUJTVRLX0hXX0xST19BR0VfVElNRQkJNTAJLyogMW1zICovCisjZGVmaW5lCU1US19IV19MUk9fTUFYX0FHR19DTlQJCTY0CisjZGVmaW5lCU1US19IV19MUk9fQldfVEhSRQkJMzAwMAorI2RlZmluZQlNVEtfSFdfTFJPX1JFUExBQ0VfREVMVEEJMTAwMAorI2RlZmluZQlNVEtfSFdfTFJPX1NETF9SRU1BSU5fUk9PTQkxNTIyCiAKIC8qIEZyYW1lIEVuZ2luZSBHbG9iYWwgUmVzZXQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgTVRLX1JTVF9HTAkJMHgwNApAQCAtNTAsNiArNjQsOSBAQAogI2RlZmluZSBNVEtfR0RNMV9BRgkJQklUKDI4KQogI2RlZmluZSBNVEtfR0RNMl9BRgkJQklUKDI5KQogCisvKiBQRE1BIEhXIExSTyBBbHRlciBGbG93IFRpbWVyIFJlZ2lzdGVyICovCisjZGVmaW5lIE1US19QRE1BX0xST19BTFRfUkVGUkVTSF9USU1FUgkweDFjCisKIC8qIEZyYW1lIEVuZ2luZSBJbnRlcnJ1cHQgR3JvdXBpbmcgUmVnaXN0ZXIgKi8KICNkZWZpbmUgTVRLX0ZFX0lOVF9HUlAJCTB4MjAKIApAQCAtNjgsMTAgKzg1LDc3IEBACiAvKiBVbmljYXN0IEZpbHRlciBNQUMgQWRkcmVzcyBSZWdpc3RlciAtIEhpZ2ggKi8KICNkZWZpbmUgTVRLX0dETUFfTUFDX0FEUkgoeCkJKDB4NTBDICsgKHggKiAweDEwMDApKQogCisvKiBQRE1BIFJYIEJhc2UgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZSBNVEtfUFJYX0JBU0VfUFRSMAkweDkwMAorI2RlZmluZSBNVEtfUFJYX0JBU0VfUFRSX0NGRyh4KQkoTVRLX1BSWF9CQVNFX1BUUjAgKyAoeCAqIDB4MTApKQorCisvKiBQRE1BIFJYIE1heGltdW0gQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTVRLX1BSWF9NQVhfQ05UMAkweDkwNAorI2RlZmluZSBNVEtfUFJYX01BWF9DTlRfQ0ZHKHgpCShNVEtfUFJYX01BWF9DTlQwICsgKHggKiAweDEwKSkKKworLyogUERNQSBSWCBDUFUgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZSBNVEtfUFJYX0NSWF9JRFgwCTB4OTA4CisjZGVmaW5lIE1US19QUlhfQ1JYX0lEWF9DRkcoeCkJKE1US19QUlhfQ1JYX0lEWDAgKyAoeCAqIDB4MTApKQorCisvKiBQRE1BIEhXIExSTyBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZSBNVEtfUERNQV9MUk9fQ1RSTF9EVzAJMHg5ODAKKyNkZWZpbmUgTVRLX0xST19FTgkJCUJJVCgwKQorI2RlZmluZSBNVEtfTDNfQ0tTX1VQRF9FTgkJQklUKDcpCisjZGVmaW5lIE1US19MUk9fQUxUX1BLVF9DTlRfTU9ERQlCSVQoMjEpCisjZGVmaW5lIE1US19MUk9fUklOR19SRUxJTlFVSVNIX1JFUQkoMHg3IDw8IDI2KQorI2RlZmluZSBNVEtfTFJPX1JJTkdfUkVMSU5RVUlTSF9ET05FCSgweDcgPDwgMjkpCisKKyNkZWZpbmUgTVRLX1BETUFfTFJPX0NUUkxfRFcxCTB4OTg0CisjZGVmaW5lIE1US19QRE1BX0xST19DVFJMX0RXMgkweDk4OAorI2RlZmluZSBNVEtfUERNQV9MUk9fQ1RSTF9EVzMJMHg5OGMKKyNkZWZpbmUgTVRLX0FETUFfTU9ERQkJQklUKDE1KQorI2RlZmluZSBNVEtfTFJPX01JTl9SWERfU0RMCShNVEtfSFdfTFJPX1NETF9SRU1BSU5fUk9PTSA8PCAxNikKKworLyogUERNQSBHbG9iYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBNVEtfUERNQV9HTE9fQ0ZHCTB4YTA0CisjZGVmaW5lIE1US19NVUxUSV9FTgkJQklUKDEwKQorCisvKiBQRE1BIFJlc2V0IEluZGV4IFJlZ2lzdGVyICovCisjZGVmaW5lIE1US19QRE1BX1JTVF9JRFgJMHhhMDgKKyNkZWZpbmUgTVRLX1BTVF9EUlhfSURYMAlCSVQoMTYpCisjZGVmaW5lIE1US19QU1RfRFJYX0lEWF9DRkcoeCkJKE1US19QU1RfRFJYX0lEWDAgPDwgKHgpKQorCisvKiBQRE1BIERlbGF5IEludGVycnVwdCBSZWdpc3RlciAqLworI2RlZmluZSBNVEtfUERNQV9ERUxBWV9JTlQJMHhhMGMKKworLyogUERNQSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1US19QRE1BX0lOVF9TVEFUVVMJMHhhMjAKKworLyogUERNQSBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBNVEtfUERNQV9JTlRfTUFTSwkweGEyOAorCisvKiBQRE1BIEhXIExSTyBBbHRlciBGbG93IERlbHRhIFJlZ2lzdGVyICovCisjZGVmaW5lIE1US19QRE1BX0xST19BTFRfU0NPUkVfREVMVEEJMHhhNGMKKwogLyogUERNQSBJbnRlcnJ1cHQgZ3JvdXBpbmcgcmVnaXN0ZXJzICovCiAjZGVmaW5lIE1US19QRE1BX0lOVF9HUlAxCTB4YTUwCiAjZGVmaW5lIE1US19QRE1BX0lOVF9HUlAyCTB4YTU0CiAKKy8qIFBETUEgSFcgTFJPIElQIFNldHRpbmcgUmVnaXN0ZXJzICovCisjZGVmaW5lIE1US19MUk9fUlhfUklORzBfRElQX0RXMAkweGIwNAorI2RlZmluZSBNVEtfTFJPX0RJUF9EVzBfQ0ZHKHgpCQkoTVRLX0xST19SWF9SSU5HMF9ESVBfRFcwICsgKHggKiAweDQwKSkKKyNkZWZpbmUgTVRLX1JJTkdfTVlJUF9WTEQJCUJJVCg5KQorCisvKiBQRE1BIEhXIExSTyBSaW5nIENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lIE1US19MUk9fUlhfUklORzBfQ1RSTF9EVzEJMHhiMjgKKyNkZWZpbmUgTVRLX0xST19SWF9SSU5HMF9DVFJMX0RXMgkweGIyYworI2RlZmluZSBNVEtfTFJPX1JYX1JJTkcwX0NUUkxfRFczCTB4YjMwCisjZGVmaW5lIE1US19MUk9fQ1RSTF9EVzFfQ0ZHKHgpCQkoTVRLX0xST19SWF9SSU5HMF9DVFJMX0RXMSArICh4ICogMHg0MCkpCisjZGVmaW5lIE1US19MUk9fQ1RSTF9EVzJfQ0ZHKHgpCQkoTVRLX0xST19SWF9SSU5HMF9DVFJMX0RXMiArICh4ICogMHg0MCkpCisjZGVmaW5lIE1US19MUk9fQ1RSTF9EVzNfQ0ZHKHgpCQkoTVRLX0xST19SWF9SSU5HMF9DVFJMX0RXMyArICh4ICogMHg0MCkpCisjZGVmaW5lIE1US19SSU5HX0FHRV9USU1FX0wJCSgoTVRLX0hXX0xST19BR0VfVElNRSAmIDB4M2ZmKSA8PCAyMikKKyNkZWZpbmUgTVRLX1JJTkdfQUdFX1RJTUVfSAkJKChNVEtfSFdfTFJPX0FHRV9USU1FID4+IDEwKSAmIDB4M2YpCisjZGVmaW5lIE1US19SSU5HX0FVVE9fTEVSQU5fTU9ERQkoMyA8PCA2KQorI2RlZmluZSBNVEtfUklOR19WTEQJCQlCSVQoOCkKKyNkZWZpbmUgTVRLX1JJTkdfTUFYX0FHR19USU1FCQkoKE1US19IV19MUk9fQUdHX1RJTUUgJiAweGZmZmYpIDw8IDEwKQorI2RlZmluZSBNVEtfUklOR19NQVhfQUdHX0NOVF9MCQkoKE1US19IV19MUk9fTUFYX0FHR19DTlQgJiAweDNmKSA8PCAyNikKKyNkZWZpbmUgTVRLX1JJTkdfTUFYX0FHR19DTlRfSAkJKChNVEtfSFdfTFJPX01BWF9BR0dfQ05UID4+IDYpICYgMHgzKQorCiAvKiBRRE1BIFRYIFF1ZXVlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzICovCiAjZGVmaW5lIE1US19RVFhfQ0ZHKHgpCQkoMHgxODAwICsgKHggKiAweDEwKSkKICNkZWZpbmUgUURNQV9SRVNfVEhSRVMJCTQKQEAgLTEwNiw3ICsxOTAsNiBAQAogCiAvKiBRRE1BIFJlc2V0IEluZGV4IFJlZ2lzdGVyICovCiAjZGVmaW5lIE1US19RRE1BX1JTVF9JRFgJMHgxQTA4Ci0jZGVmaW5lIE1US19QU1RfRFJYX0lEWDAJQklUKDE2KQogCiAvKiBRRE1BIERlbGF5IEludGVycnVwdCBSZWdpc3RlciAqLwogI2RlZmluZSBNVEtfUURNQV9ERUxBWV9JTlQJMHgxQTBDCkBAIC0xMTksMTMgKzIwMiwxNiBAQAogCiAvKiBRRE1BIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KICNkZWZpbmUgTVRLX1FNVEtfSU5UX1NUQVRVUwkweDFBMTgKKyNkZWZpbmUgTVRLX1JYX0RPTkVfSU5UMwlCSVQoMTkpCisjZGVmaW5lIE1US19SWF9ET05FX0lOVDIJQklUKDE4KQogI2RlZmluZSBNVEtfUlhfRE9ORV9JTlQxCUJJVCgxNykKICNkZWZpbmUgTVRLX1JYX0RPTkVfSU5UMAlCSVQoMTYpCiAjZGVmaW5lIE1US19UWF9ET05FX0lOVDMJQklUKDMpCiAjZGVmaW5lIE1US19UWF9ET05FX0lOVDIJQklUKDIpCiAjZGVmaW5lIE1US19UWF9ET05FX0lOVDEJQklUKDEpCiAjZGVmaW5lIE1US19UWF9ET05FX0lOVDAJQklUKDApCi0jZGVmaW5lIE1US19SWF9ET05FX0lOVAkJKE1US19SWF9ET05FX0lOVDAgfCBNVEtfUlhfRE9ORV9JTlQxKQorI2RlZmluZSBNVEtfUlhfRE9ORV9JTlQJCShNVEtfUlhfRE9ORV9JTlQwIHwgTVRLX1JYX0RPTkVfSU5UMSB8IFwKKwkJCQkgTVRLX1JYX0RPTkVfSU5UMiB8IE1US19SWF9ET05FX0lOVDMpCiAjZGVmaW5lIE1US19UWF9ET05FX0lOVAkJKE1US19UWF9ET05FX0lOVDAgfCBNVEtfVFhfRE9ORV9JTlQxIHwgXAogCQkJCSBNVEtfVFhfRE9ORV9JTlQyIHwgTVRLX1RYX0RPTkVfSU5UMykKIApAQCAtMjI3LDYgKzMxMywzMCBAQAogCQkJCSBNQUNfTUNSX0ZPUkNFX1RYX0ZDIHwgTUFDX01DUl9TUEVFRF8xMDAwIHwgXAogCQkJCSBNQUNfTUNSX0ZPUkNFX0RQWCB8IE1BQ19NQ1JfRk9SQ0VfTElOSykKIAorLyogVFJHTUlJIFJYQyBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFRSR01JSV9SQ0tfQ1RSTAkJMHgxMDMwMAorI2RlZmluZSBEUVNJMCh4KQkJKCh4IDw8IDApICYgR0VOTUFTSyg2LCAwKSkKKyNkZWZpbmUgRFFTSTEoeCkJCSgoeCA8PCA4KSAmIEdFTk1BU0soMTQsIDgpKQorI2RlZmluZSBSWENUTF9ETVdUTEFUKHgpCSgoeCA8PCAxNikgJiBHRU5NQVNLKDE4LCAxNikpCisjZGVmaW5lIFJYQ19EUVNJU0VMCQlCSVQoMzApCisjZGVmaW5lIFJDS19DVFJMX1JHTUlJXzEwMDAJKFJYQ19EUVNJU0VMIHwgUlhDVExfRE1XVExBVCgyKSB8IERRU0kxKDE2KSkKKyNkZWZpbmUgUkNLX0NUUkxfUkdNSUlfMTBfMTAwCVJYQ1RMX0RNV1RMQVQoMikKKworLyogVFJHTUlJIFJYQyBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFRSR01JSV9UQ0tfQ1RSTAkJMHgxMDM0MAorI2RlZmluZSBUWENUTF9ETVdUTEFUKHgpCSgoeCA8PCAxNikgJiBHRU5NQVNLKDE4LCAxNikpCisjZGVmaW5lIFRYQ19JTlYJCQlCSVQoMzApCisjZGVmaW5lIFRDS19DVFJMX1JHTUlJXzEwMDAJVFhDVExfRE1XVExBVCgyKQorI2RlZmluZSBUQ0tfQ1RSTF9SR01JSV8xMF8xMDAJKFRYQ19JTlYgfCBUWENUTF9ETVdUTEFUKDIpKQorCisvKiBUUkdNSUkgSW50ZXJmYWNlIG1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSU5URl9NT0RFCQkweDEwMzkwCisjZGVmaW5lIFRSR01JSV9JTlRGX0RJUwkJQklUKDApCisjZGVmaW5lIFRSR01JSV9NT0RFCQlCSVQoMSkKKyNkZWZpbmUgVFJHTUlJX0NFTlRSQUxfQUxJR05FRAlCSVQoMikKKyNkZWZpbmUgSU5URl9NT0RFX1JHTUlJXzEwMDAgICAgKFRSR01JSV9NT0RFIHwgVFJHTUlJX0NFTlRSQUxfQUxJR05FRCkKKyNkZWZpbmUgSU5URl9NT0RFX1JHTUlJXzEwXzEwMCAgMAorCiAvKiBHUElPIHBvcnQgY29udHJvbCByZWdpc3RlcnMgZm9yIEdNQUMgMiovCiAjZGVmaW5lIEdQSU9fT0QzM19DVFJMOAkJMHg0YzAKICNkZWZpbmUgR1BJT19CSUFTX0NUUkwJCTB4ZWQwCkBAIC0yMzcsNiArMzQ3LDE1IEBACiAjZGVmaW5lIFNZU0NGRzBfR0VfTUFTSwkJMHgzCiAjZGVmaW5lIFNZU0NGRzBfR0VfTU9ERSh4LCB5KQkoeCA8PCAoMTIgKyAoeSAqIDIpKSkKIAorLyogZXRoZXJuZXQgc3Vic3lzdGVtIGNsb2NrIHJlZ2lzdGVyICovCisjZGVmaW5lIEVUSFNZU19DTEtDRkcwCQkweDJjCisjZGVmaW5lIEVUSFNZU19UUkdNSUlfQ0xLX1NFTDM2Ml81CUJJVCgxMSkKKworLyogZXRoZXJuZXQgcmVzZXQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBFVEhTWVNfUlNUQ1RSTAkJMHgzNAorI2RlZmluZSBSU1RDVFJMX0ZFCQlCSVQoNikKKyNkZWZpbmUgUlNUQ1RSTF9QUEUJCUJJVCgzMSkKKwogc3RydWN0IG10a19yeF9kbWEgewogCXVuc2lnbmVkIGludCByeGQxOwogCXVuc2lnbmVkIGludCByeGQyOwpAQCAtMjkwLDYgKzQwOSwyMyBAQAogCU1US19UWF9GTEFHU19QQUdFMAk9IDB4MDIsCiB9OwogCisvKiBUaGlzIGVudW0gYWxsb3dzIHVzIHRvIGlkZW50aWZ5IGhvdyB0aGUgY2xvY2sgaXMgZGVmaW5lZCBvbiB0aGUgYXJyYXkgb2YgdGhlCisgKiBjbG9jayBpbiB0aGUgb3JkZXIKKyAqLworZW51bSBtdGtfY2xrc19tYXAgeworCU1US19DTEtfRVRISUYsCisJTVRLX0NMS19FU1csCisJTVRLX0NMS19HUDEsCisJTVRLX0NMS19HUDIsCisJTVRLX0NMS19UUkdQTEwsCisJTVRLX0NMS19NQVgKK307CisKK2VudW0gbXRrX2Rldl9zdGF0ZSB7CisJTVRLX0hXX0lOSVQsCisJTVRLX1JFU0VUVElORworfTsKKwogLyogc3RydWN0IG10a190eF9idWYgLQlUaGlzIHN0cnVjdCBob2xkcyB0aGUgcG9pbnRlcnMgdG8gdGhlIG1lbW9yeSBwb2ludGVkIGF0CiAgKgkJCWJ5IHRoZSBUWCBkZXNjcmlwdG9yCXMKICAqIEBza2I6CQlUaGUgU0tCIHBvaW50ZXIgb2YgdGhlIHBhY2tldCBiZWluZyBzZW50CkBAIC0zMjcsNiArNDYzLDEyIEBACiAJYXRvbWljX3QgZnJlZV9jb3VudDsKIH07CiAKKy8qIFBETUEgcnggcmluZyBtb2RlICovCitlbnVtIG10a19yeF9mbGFncyB7CisJTVRLX1JYX0ZMQUdTX05PUk1BTCA9IDAsCisJTVRLX1JYX0ZMQUdTX0hXTFJPLAorfTsKKwogLyogc3RydWN0IG10a19yeF9yaW5nIC0JVGhpcyBzdHJ1Y3QgaG9sZHMgaW5mbyBkZXNjcmliaW5nIGEgUlggcmluZwogICogQGRtYToJCVRoZSBkZXNjcmlwdG9yIHJpbmcKICAqIEBkYXRhOgkJVGhlIG1lbW9yeSBwb2ludGVkIGF0IGJ5IHRoZSByaW5nCkBAIC0zNDEsNyArNDgzLDEwIEBACiAJZG1hX2FkZHJfdCBwaHlzOwogCXUxNiBmcmFnX3NpemU7CiAJdTE2IGJ1Zl9zaXplOworCXUxNiBkbWFfc2l6ZTsKKwlib29sIGNhbGNfaWR4X3VwZGF0ZTsKIAl1MTYgY2FsY19pZHg7CisJdTMyIGNyeF9pZHhfcmVnOwogfTsKIAogLyogY3VycmVudGx5IG5vIFNvQyBoYXMgbW9yZSB0aGFuIDIgbWFjcyAqLwpAQCAtMzcwLDE4ICs1MTUsMTUgQEAKICAqIEBzY3JhdGNoX3Jpbmc6CU5ld2VyIFNvQ3MgbmVlZCBtZW1vcnkgZm9yIGEgc2Vjb25kIEhXIG1hbmFnZWQgVFggcmluZwogICogQHBoeV9zY3JhdGNoX3Jpbmc6CXBoeXNpY2FsIGFkZHJlc3Mgb2Ygc2NyYXRjaF9yaW5nCiAgKiBAc2NyYXRjaF9oZWFkOglUaGUgc2NyYXRjaCBtZW1vcnkgdGhhdCBzY3JhdGNoX3JpbmcgcG9pbnRzIHRvLgotICogQGNsa19ldGhpZjoJCVRoZSBldGhpZiBjbG9jawotICogQGNsa19lc3c6CQlUaGUgc3dpdGNoIGNsb2NrCi0gKiBAY2xrX2dwMToJCVRoZSBnbWFjMSBjbG9jawotICogQGNsa19ncDI6CQlUaGUgZ21hYzIgY2xvY2sKKyAqIEBjbGtzOgkJY2xvY2sgYXJyYXkgZm9yIGFsbCBjbG9ja3MgcmVxdWlyZWQKICAqIEBtaWlfYnVzOgkJSWYgdGhlcmUgaXMgYSBidXMgd2UgbmVlZCB0byBjcmVhdGUgYW4gaW5zdGFuY2UgZm9yIGl0CiAgKiBAcGVuZGluZ193b3JrOglUaGUgd29ya3F1ZXVlIHVzZWQgdG8gcmVzZXQgdGhlIGRtYSByaW5nCisgKiBAc3RhdGUgICAgICAgICAgICAgICBJbml0aWFsaXphdGlvbiBhbmQgcnVudGltZSBzdGF0ZSBvZiB0aGUgZGV2aWNlLgogICovCiAKIHN0cnVjdCBtdGtfZXRoIHsKIAlzdHJ1Y3QgZGV2aWNlCQkJKmRldjsKIAl2b2lkIF9faW9tZW0JCQkqYmFzZTsKLQlzdHJ1Y3QgcmVzZXRfY29udHJvbAkJKnJzdGM7CiAJc3BpbmxvY2tfdAkJCXBhZ2VfbG9jazsKIAlzcGlubG9ja190CQkJaXJxX2xvY2s7CiAJc3RydWN0IG5ldF9kZXZpY2UJCWR1bW15X2RldjsKQEAgLTM5MiwzNiArNTM0LDQxIEBACiAJdW5zaWduZWQgbG9uZwkJCXN5c2NsazsKIAlzdHJ1Y3QgcmVnbWFwCQkJKmV0aHN5czsKIAlzdHJ1Y3QgcmVnbWFwCQkJKnBjdGw7CisJYm9vbAkJCQlod2xybzsKIAlhdG9taWNfdAkJCWRtYV9yZWZjbnQ7CiAJc3RydWN0IG10a190eF9yaW5nCQl0eF9yaW5nOwotCXN0cnVjdCBtdGtfcnhfcmluZwkJcnhfcmluZzsKKwlzdHJ1Y3QgbXRrX3J4X3JpbmcJCXJ4X3JpbmdbTVRLX01BWF9SWF9SSU5HX05VTV07CiAJc3RydWN0IG5hcGlfc3RydWN0CQl0eF9uYXBpOwogCXN0cnVjdCBuYXBpX3N0cnVjdAkJcnhfbmFwaTsKIAlzdHJ1Y3QgbXRrX3R4X2RtYQkJKnNjcmF0Y2hfcmluZzsKIAlkbWFfYWRkcl90CQkJcGh5X3NjcmF0Y2hfcmluZzsKIAl2b2lkCQkJCSpzY3JhdGNoX2hlYWQ7Ci0Jc3RydWN0IGNsawkJCSpjbGtfZXRoaWY7Ci0Jc3RydWN0IGNsawkJCSpjbGtfZXN3OwotCXN0cnVjdCBjbGsJCQkqY2xrX2dwMTsKLQlzdHJ1Y3QgY2xrCQkJKmNsa19ncDI7CisJc3RydWN0IGNsawkJCSpjbGtzW01US19DTEtfTUFYXTsKKwogCXN0cnVjdCBtaWlfYnVzCQkJKm1paV9idXM7CiAJc3RydWN0IHdvcmtfc3RydWN0CQlwZW5kaW5nX3dvcms7CisJdW5zaWduZWQgbG9uZwkJCXN0YXRlOwogfTsKIAogLyogc3RydWN0IG10a19tYWMgLQl0aGUgc3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIGluZm8gYWJvdXQgdGhlIE1BQ3Mgb2YgdGhlCiAgKgkJCVNvQwogICogQGlkOgkJCVRoZSBudW1iZXIgb2YgdGhlIE1BQworICogQGdlX21vZGU6ICAgICAgICAgICAgSW50ZXJmYWNlIG1vZGUga2VwdCBmb3Igc2V0dXAgcmVzdG9yaW5nCiAgKiBAb2Zfbm9kZToJCU91ciBkZXZpY2V0cmVlIG5vZGUKICAqIEBodzoJCQlCYWNrcG9pbnRlciB0byBvdXIgbWFpbiBkYXRhc3RydXR1cmUKICAqIEBod19zdGF0czoJCVBhY2tldCBzdGF0aXN0aWNzIGNvdW50ZXIKLSAqIEBwaHlfZGV2OgkJVGhlIGF0dGFjaGVkIFBIWSBpZiBhdmFpbGFibGUKKyAqIEB0cmdtaWkJCUluZGljYXRlIGlmIHRoZSBNQUMgdXNlcyBUUkdNSUkgY29ubmVjdGVkIHRvIGludGVybmFsCisJCQlzd2l0Y2gKICAqLwogc3RydWN0IG10a19tYWMgewogCWludAkJCQlpZDsKKwlpbnQJCQkJZ2VfbW9kZTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUJCSpvZl9ub2RlOwogCXN0cnVjdCBtdGtfZXRoCQkJKmh3OwogCXN0cnVjdCBtdGtfaHdfc3RhdHMJCSpod19zdGF0czsKLQlzdHJ1Y3QgcGh5X2RldmljZQkJKnBoeV9kZXY7CisJX19iZTMyCQkJCWh3bHJvX2lwW01US19NQVhfTFJPX0lQX0NOVF07CisJaW50CQkJCWh3bHJvX2lwX2NudDsKKwlib29sCQkJCXRyZ21paTsKIH07CiAKIC8qIHRoZSBzdHJ1Y3QgZGVzY3JpYmluZyB0aGUgU29DLiB0aGVzZSBhcmUgZGVjbGFyZWQgaW4gdGhlIHNvY194eXouYyBmaWxlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9jbWQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY21kLmMKaW5kZXggZjA0YTQyMy4uYjFjZWY3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9jbWQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NtZC5jCkBAIC03ODUsMTcgKzc4NSwyMyBAQAogCQlyZXR1cm4gbWx4NF9jbWRfcmVzZXRfZmxvdyhkZXYsIG9wLCBvcF9tb2RpZmllciwgLUVJTyk7CiAKIAlpZiAoIW1seDRfaXNfbWZ1bmMoZGV2KSB8fCAobmF0aXZlICYmIG1seDRfaXNfbWFzdGVyKGRldikpKSB7CisJCWludCByZXQ7CisKIAkJaWYgKGRldi0+cGVyc2lzdC0+c3RhdGUgJiBNTFg0X0RFVklDRV9TVEFURV9JTlRFUk5BTF9FUlJPUikKIAkJCXJldHVybiBtbHg0X2ludGVybmFsX2Vycl9yZXRfdmFsdWUoZGV2LCBvcCwKIAkJCQkJCQkgIG9wX21vZGlmaWVyKTsKKwkJZG93bl9yZWFkKCZtbHg0X3ByaXYoZGV2KS0+Y21kLnN3aXRjaF9zZW0pOwogCQlpZiAobWx4NF9wcml2KGRldiktPmNtZC51c2VfZXZlbnRzKQotCQkJcmV0dXJuIG1seDRfY21kX3dhaXQoZGV2LCBpbl9wYXJhbSwgb3V0X3BhcmFtLAotCQkJCQkgICAgIG91dF9pc19pbW0sIGluX21vZGlmaWVyLAotCQkJCQkgICAgIG9wX21vZGlmaWVyLCBvcCwgdGltZW91dCk7CisJCQlyZXQgPSBtbHg0X2NtZF93YWl0KGRldiwgaW5fcGFyYW0sIG91dF9wYXJhbSwKKwkJCQkJICAgIG91dF9pc19pbW0sIGluX21vZGlmaWVyLAorCQkJCQkgICAgb3BfbW9kaWZpZXIsIG9wLCB0aW1lb3V0KTsKIAkJZWxzZQotCQkJcmV0dXJuIG1seDRfY21kX3BvbGwoZGV2LCBpbl9wYXJhbSwgb3V0X3BhcmFtLAotCQkJCQkgICAgIG91dF9pc19pbW0sIGluX21vZGlmaWVyLAotCQkJCQkgICAgIG9wX21vZGlmaWVyLCBvcCwgdGltZW91dCk7CisJCQlyZXQgPSBtbHg0X2NtZF9wb2xsKGRldiwgaW5fcGFyYW0sIG91dF9wYXJhbSwKKwkJCQkJICAgIG91dF9pc19pbW0sIGluX21vZGlmaWVyLAorCQkJCQkgICAgb3BfbW9kaWZpZXIsIG9wLCB0aW1lb3V0KTsKKworCQl1cF9yZWFkKCZtbHg0X3ByaXYoZGV2KS0+Y21kLnN3aXRjaF9zZW0pOworCQlyZXR1cm4gcmV0OwogCX0KIAlyZXR1cm4gbWx4NF9zbGF2ZV9jbWQoZGV2LCBpbl9wYXJhbSwgb3V0X3BhcmFtLCBvdXRfaXNfaW1tLAogCQkJICAgICAgaW5fbW9kaWZpZXIsIG9wX21vZGlmaWVyLCBvcCwgdGltZW91dCk7CkBAIC0xODQ1LDYgKzE4NTEsNyBAQAogCiAJaWYgKHZwX29wZXItPnN0YXRlLmRlZmF1bHRfdmxhbiA9PSB2cF9hZG1pbi0+ZGVmYXVsdF92bGFuICYmCiAJICAgIHZwX29wZXItPnN0YXRlLmRlZmF1bHRfcW9zID09IHZwX2FkbWluLT5kZWZhdWx0X3FvcyAmJgorCSAgICB2cF9vcGVyLT5zdGF0ZS52bGFuX3Byb3RvID09IHZwX2FkbWluLT52bGFuX3Byb3RvICYmCiAJICAgIHZwX29wZXItPnN0YXRlLmxpbmtfc3RhdGUgPT0gdnBfYWRtaW4tPmxpbmtfc3RhdGUgJiYKIAkgICAgdnBfb3Blci0+c3RhdGUucW9zX3Zwb3J0ID09IHZwX2FkbWluLT5xb3NfdnBvcnQpCiAJCXJldHVybiAwOwpAQCAtMTkwMyw2ICsxOTEwLDcgQEAKIAogCXZwX29wZXItPnN0YXRlLmRlZmF1bHRfdmxhbiA9IHZwX2FkbWluLT5kZWZhdWx0X3ZsYW47CiAJdnBfb3Blci0+c3RhdGUuZGVmYXVsdF9xb3MgPSB2cF9hZG1pbi0+ZGVmYXVsdF9xb3M7CisJdnBfb3Blci0+c3RhdGUudmxhbl9wcm90byA9IHZwX2FkbWluLT52bGFuX3Byb3RvOwogCXZwX29wZXItPnN0YXRlLmxpbmtfc3RhdGUgPSB2cF9hZG1pbi0+bGlua19zdGF0ZTsKIAl2cF9vcGVyLT5zdGF0ZS5xb3NfdnBvcnQgPSB2cF9hZG1pbi0+cW9zX3Zwb3J0OwogCkBAIC0xOTE2LDYgKzE5MjQsNyBAQAogCXdvcmstPnFvc192cG9ydCA9IHZwX29wZXItPnN0YXRlLnFvc192cG9ydDsKIAl3b3JrLT52bGFuX2lkID0gdnBfb3Blci0+c3RhdGUuZGVmYXVsdF92bGFuOwogCXdvcmstPnZsYW5faXggPSB2cF9vcGVyLT52bGFuX2lkeDsKKwl3b3JrLT52bGFuX3Byb3RvID0gdnBfb3Blci0+c3RhdGUudmxhbl9wcm90bzsKIAl3b3JrLT5wcml2ID0gcHJpdjsKIAlJTklUX1dPUksoJndvcmstPndvcmssIG1seDRfdmZfaW1tZWRfdmxhbl93b3JrX2hhbmRsZXIpOwogCXF1ZXVlX3dvcmsocHJpdi0+bWZ1bmMubWFzdGVyLmNvbW1fd3EsICZ3b3JrLT53b3JrKTsKQEAgLTE5ODYsNiArMTk5NSw4IEBACiAJaW50IHBvcnQsIGVycjsKIAlzdHJ1Y3QgbWx4NF92cG9ydF9zdGF0ZSAqdnBfYWRtaW47CiAJc3RydWN0IG1seDRfdnBvcnRfb3Blcl9zdGF0ZSAqdnBfb3BlcjsKKwlzdHJ1Y3QgbWx4NF9zbGF2ZV9zdGF0ZSAqc2xhdmVfc3RhdGUgPQorCQkmcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlW3NsYXZlXTsKIAlzdHJ1Y3QgbWx4NF9hY3RpdmVfcG9ydHMgYWN0dl9wb3J0cyA9IG1seDRfZ2V0X2FjdGl2ZV9wb3J0cygKIAkJCSZwcml2LT5kZXYsIHNsYXZlKTsKIAlpbnQgbWluX3BvcnQgPSBmaW5kX2ZpcnN0X2JpdChhY3R2X3BvcnRzLnBvcnRzLApAQCAtMjAwMCwxMiArMjAxMSwyNiBAQAogCQkJcHJpdi0+bWZ1bmMubWFzdGVyLnZmX2FkbWluW3NsYXZlXS5lbmFibGVfc21pW3BvcnRdOwogCQl2cF9vcGVyID0gJnByaXYtPm1mdW5jLm1hc3Rlci52Zl9vcGVyW3NsYXZlXS52cG9ydFtwb3J0XTsKIAkJdnBfYWRtaW4gPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnZmX2FkbWluW3NsYXZlXS52cG9ydFtwb3J0XTsKLQkJdnBfb3Blci0+c3RhdGUgPSAqdnBfYWRtaW47CisJCWlmICh2cF9hZG1pbi0+dmxhbl9wcm90byAhPSBodG9ucyhFVEhfUF84MDIxQUQpIHx8CisJCSAgICBzbGF2ZV9zdGF0ZS0+dnN0X3FpbnFfc3VwcG9ydGVkKSB7CisJCQl2cF9vcGVyLT5zdGF0ZS52bGFuX3Byb3RvICAgPSB2cF9hZG1pbi0+dmxhbl9wcm90bzsKKwkJCXZwX29wZXItPnN0YXRlLmRlZmF1bHRfdmxhbiA9IHZwX2FkbWluLT5kZWZhdWx0X3ZsYW47CisJCQl2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3FvcyAgPSB2cF9hZG1pbi0+ZGVmYXVsdF9xb3M7CisJCX0KKwkJdnBfb3Blci0+c3RhdGUubGlua19zdGF0ZSA9IHZwX2FkbWluLT5saW5rX3N0YXRlOworCQl2cF9vcGVyLT5zdGF0ZS5tYWMgICAgICAgID0gdnBfYWRtaW4tPm1hYzsKKwkJdnBfb3Blci0+c3RhdGUuc3Bvb2ZjaGsgICA9IHZwX2FkbWluLT5zcG9vZmNoazsKKwkJdnBfb3Blci0+c3RhdGUudHhfcmF0ZSAgICA9IHZwX2FkbWluLT50eF9yYXRlOworCQl2cF9vcGVyLT5zdGF0ZS5xb3NfdnBvcnQgID0gdnBfYWRtaW4tPnFvc192cG9ydDsKKwkJdnBfb3Blci0+c3RhdGUuZ3VpZCAgICAgICA9IHZwX2FkbWluLT5ndWlkOworCiAJCWlmIChNTFg0X1ZHVCAhPSB2cF9hZG1pbi0+ZGVmYXVsdF92bGFuKSB7CiAJCQllcnIgPSBfX21seDRfcmVnaXN0ZXJfdmxhbigmcHJpdi0+ZGV2LCBwb3J0LAogCQkJCQkJICAgdnBfYWRtaW4tPmRlZmF1bHRfdmxhbiwgJih2cF9vcGVyLT52bGFuX2lkeCkpOwogCQkJaWYgKGVycikgewogCQkJCXZwX29wZXItPnZsYW5faWR4ID0gTk9fSU5EWDsKKwkJCQl2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3ZsYW4gPSBNTFg0X1ZHVDsKKwkJCQl2cF9vcGVyLT5zdGF0ZS52bGFuX3Byb3RvID0gaHRvbnMoRVRIX1BfODAyMVEpOwogCQkJCW1seDRfd2FybigmcHJpdi0+ZGV2LAogCQkJCQkgICJObyB2bGFuIHJlc291cmNlcyBzbGF2ZSAlZCwgcG9ydCAlZFxuIiwKIAkJCQkJICBzbGF2ZSwgcG9ydCk7CkBAIC0yMDg2LDYgKzIxMTEsNyBAQAogCQltbHg0X3dhcm4oZGV2LCAiUmVjZWl2ZWQgcmVzZXQgZnJvbSBzbGF2ZTolZFxuIiwgc2xhdmUpOwogCQlzbGF2ZV9zdGF0ZVtzbGF2ZV0uYWN0aXZlID0gZmFsc2U7CiAJCXNsYXZlX3N0YXRlW3NsYXZlXS5vbGRfdmxhbl9hcGkgPSBmYWxzZTsKKwkJc2xhdmVfc3RhdGVbc2xhdmVdLnZzdF9xaW5xX3N1cHBvcnRlZCA9IGZhbHNlOwogCQltbHg0X21hc3Rlcl9kZWFjdGl2YXRlX2FkbWluX3N0YXRlKHByaXYsIHNsYXZlKTsKIAkJZm9yIChpID0gMDsgaSA8IE1MWDRfRVZFTlRfVFlQRVNfTlVNOyArK2kpIHsKIAkJCQlzbGF2ZV9zdGF0ZVtzbGF2ZV0uZXZlbnRfZXFbaV0uZXFuID0gLTE7CkBAIC0yMzUzLDYgKzIzNzksNyBAQAogCQkJdmZfb3BlciA9ICZwcml2LT5tZnVuYy5tYXN0ZXIudmZfb3BlcltpXTsKIAkJCXNfc3RhdGUgPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlW2ldOwogCQkJc19zdGF0ZS0+bGFzdF9jbWQgPSBNTFg0X0NPTU1fQ01EX1JFU0VUOworCQkJc19zdGF0ZS0+dnN0X3FpbnFfc3VwcG9ydGVkID0gZmFsc2U7CiAJCQltdXRleF9pbml0KCZwcml2LT5tZnVuYy5tYXN0ZXIuZ2VuX2VxZV9tdXRleFtpXSk7CiAJCQlmb3IgKGogPSAwOyBqIDwgTUxYNF9FVkVOVF9UWVBFU19OVU07ICsraikKIAkJCQlzX3N0YXRlLT5ldmVudF9lcVtqXS5lcW4gPSAtMTsKQEAgLTIzODIsNiArMjQwOSw4IEBACiAJCQkJYWRtaW5fdnBvcnQtPnFvc192cG9ydCA9CiAJCQkJCQlNTFg0X1ZQUF9ERUZBVUxUX1ZQT1JUOwogCQkJCW9wZXJfdnBvcnQtPnFvc192cG9ydCA9IE1MWDRfVlBQX0RFRkFVTFRfVlBPUlQ7CisJCQkJYWRtaW5fdnBvcnQtPnZsYW5fcHJvdG8gPSBodG9ucyhFVEhfUF84MDIxUSk7CisJCQkJb3Blcl92cG9ydC0+dmxhbl9wcm90byA9IGh0b25zKEVUSF9QXzgwMjFRKTsKIAkJCQl2Zl9vcGVyLT52cG9ydFtwb3J0XS52bGFuX2lkeCA9IE5PX0lORFg7CiAJCQkJdmZfb3Blci0+dnBvcnRbcG9ydF0ubWFjX2lkeCA9IE5PX0lORFg7CiAJCQkJbWx4NF9zZXRfcmFuZG9tX2FkbWluX2d1aWQoZGV2LCBpLCBwb3J0KTsKQEAgLTI0NTQsNiArMjQ4Myw3IEBACiAJaW50IGZsYWdzID0gMDsKIAogCWlmICghcHJpdi0+Y21kLmluaXRpYWxpemVkKSB7CisJCWluaXRfcndzZW0oJnByaXYtPmNtZC5zd2l0Y2hfc2VtKTsKIAkJbXV0ZXhfaW5pdCgmcHJpdi0+Y21kLnNsYXZlX2NtZF9tdXRleCk7CiAJCXNlbWFfaW5pdCgmcHJpdi0+Y21kLnBvbGxfc2VtLCAxKTsKIAkJcHJpdi0+Y21kLnVzZV9ldmVudHMgPSAwOwpAQCAtMjU4Myw2ICsyNjEzLDcgQEAKIAlpZiAoIXByaXYtPmNtZC5jb250ZXh0KQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWRvd25fd3JpdGUoJnByaXYtPmNtZC5zd2l0Y2hfc2VtKTsKIAlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+Y21kLm1heF9jbWRzOyArK2kpIHsKIAkJcHJpdi0+Y21kLmNvbnRleHRbaV0udG9rZW4gPSBpOwogCQlwcml2LT5jbWQuY29udGV4dFtpXS5uZXh0ICA9IGkgKyAxOwpAQCAtMjYwNiw2ICsyNjM3LDcgQEAKIAogCWRvd24oJnByaXYtPmNtZC5wb2xsX3NlbSk7CiAJcHJpdi0+Y21kLnVzZV9ldmVudHMgPSAxOworCXVwX3dyaXRlKCZwcml2LT5jbWQuc3dpdGNoX3NlbSk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjYxOCw2ICsyNjUwLDcgQEAKIAlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CiAJaW50IGk7CiAKKwlkb3duX3dyaXRlKCZwcml2LT5jbWQuc3dpdGNoX3NlbSk7CiAJcHJpdi0+Y21kLnVzZV9ldmVudHMgPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IHByaXYtPmNtZC5tYXhfY21kczsgKytpKQpAQCAtMjYyNiw2ICsyNjU5LDcgQEAKIAlrZnJlZShwcml2LT5jbWQuY29udGV4dCk7CiAKIAl1cCgmcHJpdi0+Y21kLnBvbGxfc2VtKTsKKwl1cF93cml0ZSgmcHJpdi0+Y21kLnN3aXRjaF9zZW0pOwogfQogCiBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqbWx4NF9hbGxvY19jbWRfbWFpbGJveChzdHJ1Y3QgbWx4NF9kZXYgKmRldikKQEAgLTI5MzcsMTAgKzI5NzEsMTMgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfc2V0X3ZmX21hYyk7CiAKIAotaW50IG1seDRfc2V0X3ZmX3ZsYW4oc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBwb3J0LCBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MpCitpbnQgbWx4NF9zZXRfdmZfdmxhbihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHBvcnQsIGludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcywKKwkJICAgICBfX2JlMTYgcHJvdG8pCiB7CiAJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOwogCXN0cnVjdCBtbHg0X3Zwb3J0X3N0YXRlICp2Zl9hZG1pbjsKKwlzdHJ1Y3QgbWx4NF9zbGF2ZV9zdGF0ZSAqc2xhdmVfc3RhdGU7CisJc3RydWN0IG1seDRfdnBvcnRfb3Blcl9zdGF0ZSAqdmZfb3BlcjsKIAlpbnQgc2xhdmU7CiAKIAlpZiAoKCFtbHg0X2lzX21hc3RlcihkZXYpKSB8fApAQCAtMjk1MCwxMiArMjk4NywzMSBAQAogCWlmICgodmxhbiA+IDQwOTUpIHx8IChxb3MgPiA3KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAocHJvdG8gPT0gaHRvbnMoRVRIX1BfODAyMUFEKSAmJgorCSAgICAhKGRldi0+Y2Fwcy5mbGFnczIgJiBNTFg0X0RFVl9DQVBfRkxBRzJfU1ZMQU5fQllfUVApKQorCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKKworCWlmIChwcm90byAhPSBodG9ucyhFVEhfUF84MDIxUSkgJiYKKwkgICAgcHJvdG8gIT0gaHRvbnMoRVRIX1BfODAyMUFEKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHByb3RvID09IGh0b25zKEVUSF9QXzgwMjFBRCkpICYmCisJICAgICgodmxhbiA9PSAwKSB8fCAodmxhbiA9PSBNTFg0X1ZHVCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXNsYXZlID0gbWx4NF9nZXRfc2xhdmVfaW5keChkZXYsIHZmKTsKIAlpZiAoc2xhdmUgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCXNsYXZlX3N0YXRlID0gJnByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZVtzbGF2ZV07CisJaWYgKChwcm90byA9PSBodG9ucyhFVEhfUF84MDIxQUQpKSAmJiAoc2xhdmVfc3RhdGUtPmFjdGl2ZSkgJiYKKwkgICAgKCFzbGF2ZV9zdGF0ZS0+dnN0X3FpbnFfc3VwcG9ydGVkKSkgeworCQltbHg0X2VycihkZXYsICJ2ZiAlZCBkb2VzIG5vdCBzdXBwb3J0IFZTVCBRaW5RIG1vZGVcbiIsIHZmKTsKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisJfQogCXBvcnQgPSBtbHg0X3NsYXZlc19jbG9zZXN0X3BvcnQoZGV2LCBzbGF2ZSwgcG9ydCk7CiAJdmZfYWRtaW4gPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnZmX2FkbWluW3NsYXZlXS52cG9ydFtwb3J0XTsKKwl2Zl9vcGVyID0gJnByaXYtPm1mdW5jLm1hc3Rlci52Zl9vcGVyW3NsYXZlXS52cG9ydFtwb3J0XTsKIAogCWlmICghbWx4NF92YWxpZF92Zl9zdGF0ZV9jaGFuZ2UoZGV2LCBwb3J0LCB2Zl9hZG1pbiwgdmxhbiwgcW9zKSkKIAkJcmV0dXJuIC1FUEVSTTsKQEAgLTI5NjUsNiArMzAyMSw3IEBACiAJZWxzZQogCQl2Zl9hZG1pbi0+ZGVmYXVsdF92bGFuID0gdmxhbjsKIAl2Zl9hZG1pbi0+ZGVmYXVsdF9xb3MgPSBxb3M7CisJdmZfYWRtaW4tPnZsYW5fcHJvdG8gPSBwcm90bzsKIAogCS8qIElmIHJhdGUgd2FzIGNvbmZpZ3VyZWQgcHJpb3IgdG8gVlNULCB3ZSBzYXZlZCB0aGUgY29uZmlndXJlZCByYXRlCiAJICogaW4gdmZfYWRtaW4tPnJhdGUgYW5kIG5vdywgaWYgcHJpb3JpdHkgc3VwcG9ydGVkIHdlIGVuZm9yY2UgdGhlIFFvUwpAQCAtMjk3Myw3ICszMDMwLDEyIEBACiAJICAgIHZmX2FkbWluLT50eF9yYXRlKQogCQl2Zl9hZG1pbi0+cW9zX3Zwb3J0ID0gc2xhdmU7CiAKLQlpZiAobWx4NF9tYXN0ZXJfaW1tZWRpYXRlX2FjdGl2YXRlX3ZsYW5fcW9zKHByaXYsIHNsYXZlLCBwb3J0KSkKKwkvKiBUcnkgdG8gYWN0aXZhdGUgbmV3IHZmIHN0YXRlIHdpdGhvdXQgcmVzdGFydCwKKwkgKiB0aGlzIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdoaWxlIG1vdmluZyB0byBWU1QgUWluUSBtb2RlLgorCSAqLworCWlmICgocHJvdG8gPT0gaHRvbnMoRVRIX1BfODAyMUFEKSAmJgorCSAgICAgdmZfb3Blci0+c3RhdGUudmxhbl9wcm90byAhPSBwcm90bykgfHwKKwkgICAgbWx4NF9tYXN0ZXJfaW1tZWRpYXRlX2FjdGl2YXRlX3ZsYW5fcW9zKHByaXYsIHNsYXZlLCBwb3J0KSkKIAkJbWx4NF9pbmZvKGRldiwKIAkJCSAgInVwZGF0aW5nIHZmICVkIHBvcnQgJWQgY29uZmlnIHdpbGwgdGFrZSBlZmZlY3Qgb24gbmV4dCBWRiByZXN0YXJ0XG4iLAogCQkJICB2ZiwgcG9ydCk7CkBAIC0zMTE3LDYgKzMxNzksNyBAQAogCiAJaXZmLT52bGFuCQk9IHNfaW5mby0+ZGVmYXVsdF92bGFuOwogCWl2Zi0+cW9zCQk9IHNfaW5mby0+ZGVmYXVsdF9xb3M7CisJaXZmLT52bGFuX3Byb3RvCQk9IHNfaW5mby0+dmxhbl9wcm90bzsKIAogCWlmIChtbHg0X2lzX3ZmX3ZzdF9hbmRfcHJpb19xb3MoZGV2LCBwb3J0LCBzX2luZm8pKQogCQlpdmYtPm1heF90eF9yYXRlID0gc19pbmZvLT50eF9yYXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9jbG9jay5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9jbG9jay5jCmluZGV4IDE0OTQ5OTcuLjA4ZmM1ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fY2xvY2suYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX2Nsb2NrLmMKQEAgLTI5OCw3ICsyOTgsNyBAQAogCWlmIChJU19FUlIobWRldi0+cHRwX2Nsb2NrKSkgewogCQltZGV2LT5wdHBfY2xvY2sgPSBOVUxMOwogCQltbHg0X2VycihtZGV2LCAicHRwX2Nsb2NrX3JlZ2lzdGVyIGZhaWxlZFxuIik7Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKG1kZXYtPnB0cF9jbG9jaykgewogCQltbHg0X2luZm8obWRldiwgInJlZ2lzdGVyZWQgUEhDIGNsb2NrXG4iKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fZGNiX25sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX2RjYl9ubC5jCmluZGV4IDk5YzZiYmQuLmIwNDc2MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fZGNiX25sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9kY2JfbmwuYwpAQCAtOTQsNyArOTQsNyBAQAogCQkqY2FwID0gdHJ1ZTsKIAkJYnJlYWs7CiAJY2FzZSBEQ0JfQ0FQX0FUVFJfRENCWDoKLQkJKmNhcCA9IHByaXYtPmNlZV9wYXJhbXMuZGNieF9jYXA7CisJCSpjYXAgPSBwcml2LT5kY2J4X2NhcDsKIAkJYnJlYWs7CiAJY2FzZSBEQ0JfQ0FQX0FUVFJfUEZDX1RDUzoKIAkJKmNhcCA9IDEgPDwgIG1seDRfbWF4X3RjKHByaXYtPm1kZXYtPmRldik7CkBAIC0xMTEsMTQgKzExMSwxNCBAQAogewogCXN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCi0JcmV0dXJuIHByaXYtPmNlZV9wYXJhbXMuZGNiX2NmZy5wZmNfc3RhdGU7CisJcmV0dXJuIHByaXYtPmNlZV9jb25maWcucGZjX3N0YXRlOwogfQogCiBzdGF0aWMgdm9pZCBtbHg0X2VuX2RjYm5sX3NldHBmY3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHU4IHN0YXRlKQogewogCXN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCi0JcHJpdi0+Y2VlX3BhcmFtcy5kY2JfY2ZnLnBmY19zdGF0ZSA9IHN0YXRlOworCXByaXYtPmNlZV9jb25maWcucGZjX3N0YXRlID0gc3RhdGU7CiB9CiAKIHN0YXRpYyB2b2lkIG1seDRfZW5fZGNibmxfZ2V0X3BmY19jZmcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHByaW9yaXR5LApAQCAtMTI2LDcgKzEyNiw3IEBACiB7CiAJc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKLQkqc2V0dGluZyA9IHByaXYtPmNlZV9wYXJhbXMuZGNiX2NmZy50Y19jb25maWdbcHJpb3JpdHldLmRjYl9wZmM7CisJKnNldHRpbmcgPSBwcml2LT5jZWVfY29uZmlnLmRjYl9wZmNbcHJpb3JpdHldOwogfQogCiBzdGF0aWMgdm9pZCBtbHg0X2VuX2RjYm5sX3NldF9wZmNfY2ZnKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwcmlvcml0eSwKQEAgLTEzNCw4ICsxMzQsOCBAQAogewogCXN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCi0JcHJpdi0+Y2VlX3BhcmFtcy5kY2JfY2ZnLnRjX2NvbmZpZ1twcmlvcml0eV0uZGNiX3BmYyA9IHNldHRpbmc7Ci0JcHJpdi0+Y2VlX3BhcmFtcy5kY2JfY2ZnLnBmY19zdGF0ZSA9IHRydWU7CisJcHJpdi0+Y2VlX2NvbmZpZy5kY2JfcGZjW3ByaW9yaXR5XSA9IHNldHRpbmc7CisJcHJpdi0+Y2VlX2NvbmZpZy5wZmNfc3RhdGUgPSB0cnVlOwogfQogCiBzdGF0aWMgaW50IG1seDRfZW5fZGNibmxfZ2V0bnVtdGNzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB0Y2lkLCB1OCAqbnVtKQpAQCAtMTU3LDEzICsxNTcsMTEgQEAKIHsKIAlzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgbWx4NF9lbl9kZXYgKm1kZXYgPSBwcml2LT5tZGV2OwotCXN0cnVjdCBtbHg0X2VuX2NlZV9jb25maWcgKmRjYl9jZmcgPSAmcHJpdi0+Y2VlX3BhcmFtcy5kY2JfY2ZnOwotCWludCBlcnIgPSAwOwogCi0JaWYgKCEocHJpdi0+Y2VlX3BhcmFtcy5kY2J4X2NhcCAmIERDQl9DQVBfRENCWF9WRVJfQ0VFKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCEocHJpdi0+ZGNieF9jYXAgJiBEQ0JfQ0FQX0RDQlhfVkVSX0NFRSkpCisJCXJldHVybiAxOwogCi0JaWYgKGRjYl9jZmctPnBmY19zdGF0ZSkgeworCWlmIChwcml2LT5jZWVfY29uZmlnLnBmY19zdGF0ZSkgewogCQlpbnQgdGM7CiAKIAkJcHJpdi0+cHJvZi0+cnhfcGF1c2UgPSAwOwpAQCAtMTcxLDcgKzE2OSw3IEBACiAJCWZvciAodGMgPSAwOyB0YyA8IENFRV9EQ0JYX01BWF9QUklPOyB0YysrKSB7CiAJCQl1OCB0Y19tYXNrID0gMSA8PCB0YzsKIAotCQkJc3dpdGNoIChkY2JfY2ZnLT50Y19jb25maWdbdGNdLmRjYl9wZmMpIHsKKwkJCXN3aXRjaCAocHJpdi0+Y2VlX2NvbmZpZy5kY2JfcGZjW3RjXSkgewogCQkJY2FzZSBwZmNfZGlzYWJsZWQ6CiAJCQkJcHJpdi0+cHJvZi0+dHhfcHBwICY9IH50Y19tYXNrOwogCQkJCXByaXYtPnByb2YtPnJ4X3BwcCAmPSB+dGNfbWFzazsKQEAgLTE5OSwxNSArMTk3LDE3IEBACiAJCWVuX2RiZyhEUlYsIHByaXYsICJTZXQgcGZjIG9mZlxuIik7CiAJfQogCi0JZXJyID0gbWx4NF9TRVRfUE9SVF9nZW5lcmFsKG1kZXYtPmRldiwgcHJpdi0+cG9ydCwKLQkJCQkgICAgcHJpdi0+cnhfc2tiX3NpemUgKyBFVEhfRkNTX0xFTiwKLQkJCQkgICAgcHJpdi0+cHJvZi0+dHhfcGF1c2UsCi0JCQkJICAgIHByaXYtPnByb2YtPnR4X3BwcCwKLQkJCQkgICAgcHJpdi0+cHJvZi0+cnhfcGF1c2UsCi0JCQkJICAgIHByaXYtPnByb2YtPnJ4X3BwcCk7Ci0JaWYgKGVycikKKwlpZiAobWx4NF9TRVRfUE9SVF9nZW5lcmFsKG1kZXYtPmRldiwgcHJpdi0+cG9ydCwKKwkJCQkgIHByaXYtPnJ4X3NrYl9zaXplICsgRVRIX0ZDU19MRU4sCisJCQkJICBwcml2LT5wcm9mLT50eF9wYXVzZSwKKwkJCQkgIHByaXYtPnByb2YtPnR4X3BwcCwKKwkJCQkgIHByaXYtPnByb2YtPnJ4X3BhdXNlLAorCQkJCSAgcHJpdi0+cHJvZi0+cnhfcHBwKSkgewogCQllbl9lcnIocHJpdiwgIkZhaWxlZCBzZXR0aW5nIHBhdXNlIHBhcmFtc1xuIik7Ci0JcmV0dXJuIGVycjsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB1OCBtbHg0X2VuX2RjYm5sX2dldF9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMjI1LDcgKzIyNSw3IEBACiAJc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IG51bV90Y3MgPSAwOwogCi0JaWYgKCEocHJpdi0+Y2VlX3BhcmFtcy5kY2J4X2NhcCAmIERDQl9DQVBfRENCWF9WRVJfQ0VFKSkKKwlpZiAoIShwcml2LT5kY2J4X2NhcCAmIERDQl9DQVBfRENCWF9WRVJfQ0VFKSkKIAkJcmV0dXJuIDE7CiAKIAlpZiAoISEoc3RhdGUpID09ICEhKHByaXYtPmZsYWdzICYgTUxYNF9FTl9GTEFHX0RDQl9FTkFCTEVEKSkKQEAgLTIzOCw3ICsyMzgsMTAgQEAKIAkJcHJpdi0+ZmxhZ3MgJj0gfk1MWDRfRU5fRkxBR19EQ0JfRU5BQkxFRDsKIAl9CiAKLQlyZXR1cm4gbWx4NF9lbl9zZXR1cF90YyhkZXYsIG51bV90Y3MpOworCWlmIChtbHg0X2VuX3NldHVwX3RjKGRldiwgbnVtX3RjcykpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7CiB9CiAKIC8qIE9uIHN1Y2Nlc3MgcmV0dXJucyBhIG5vbi16ZXJvIDgwMi4xcCB1c2VyIHByaW9yaXR5IGJpdG1hcApAQCAtMjUyLDcgKzI1NSw3IEBACiAJCQkJLnNlbGVjdG9yID0gaWR0eXBlLAogCQkJCS5wcm90b2NvbCA9IGlkLAogCQkJICAgICB9OwotCWlmICghKHByaXYtPmNlZV9wYXJhbXMuZGNieF9jYXAgJiBEQ0JfQ0FQX0RDQlhfVkVSX0NFRSkpCisJaWYgKCEocHJpdi0+ZGNieF9jYXAgJiBEQ0JfQ0FQX0RDQlhfVkVSX0NFRSkpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIGRjYl9nZXRhcHAobmV0ZGV2LCAmYXBwKTsKQEAgLTI2NCw3ICsyNjcsNyBAQAogCXN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBkY2JfYXBwIGFwcDsKIAotCWlmICghKHByaXYtPmNlZV9wYXJhbXMuZGNieF9jYXAgJiBEQ0JfQ0FQX0RDQlhfVkVSX0NFRSkpCisJaWYgKCEocHJpdi0+ZGNieF9jYXAgJiBEQ0JfQ0FQX0RDQlhfVkVSX0NFRSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbWVtc2V0KCZhcHAsIDAsIHNpemVvZihzdHJ1Y3QgZGNiX2FwcCkpOwpAQCAtNDMzLDcgKzQzNiw3IEBACiB7CiAJc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKLQlyZXR1cm4gcHJpdi0+Y2VlX3BhcmFtcy5kY2J4X2NhcDsKKwlyZXR1cm4gcHJpdi0+ZGNieF9jYXA7CiB9CiAKIHN0YXRpYyB1OCBtbHg0X2VuX2RjYm5sX3NldGRjYngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggbW9kZSkKQEAgLTQ0Miw3ICs0NDUsNyBAQAogCXN0cnVjdCBpZWVlX2V0cyBldHMgPSB7MH07CiAJc3RydWN0IGllZWVfcGZjIHBmYyA9IHswfTsKIAotCWlmIChtb2RlID09IHByaXYtPmNlZV9wYXJhbXMuZGNieF9jYXApCisJaWYgKG1vZGUgPT0gcHJpdi0+ZGNieF9jYXApCiAJCXJldHVybiAwOwogCiAJaWYgKChtb2RlICYgRENCX0NBUF9EQ0JYX0xMRF9NQU5BR0VEKSB8fApAQCAtNDUxLDcgKzQ1NCw3IEBACiAJICAgICEobW9kZSAmIERDQl9DQVBfRENCWF9IT1NUKSkKIAkJZ290byBlcnI7CiAKLQlwcml2LT5jZWVfcGFyYW1zLmRjYnhfY2FwID0gbW9kZTsKKwlwcml2LT5kY2J4X2NhcCA9IG1vZGU7CiAKIAlldHMuZXRzX2NhcCA9IElFRUVfODAyMVFBWl9NQVhfVENTOwogCXBmYy5wZmNfY2FwID0gSUVFRV84MDIxUUFaX01BWF9UQ1M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX25ldGRldi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9uZXRkZXYuYwppbmRleCA0MTk4ZTliLi43ZTcwM2JlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fbmV0ZGV2LmMKQEAgLTcxLDEwICs3MSwxMSBAQAogI2lmZGVmIENPTkZJR19NTFg0X0VOX0RDQgogCWlmICghbWx4NF9pc19zbGF2ZShwcml2LT5tZGV2LT5kZXYpKSB7CiAJCWlmICh1cCkgewotCQkJcHJpdi0+ZmxhZ3MgfD0gTUxYNF9FTl9GTEFHX0RDQl9FTkFCTEVEOworCQkJaWYgKHByaXYtPmRjYnhfY2FwKQorCQkJCXByaXYtPmZsYWdzIHw9IE1MWDRfRU5fRkxBR19EQ0JfRU5BQkxFRDsKIAkJfSBlbHNlIHsKIAkJCXByaXYtPmZsYWdzICY9IH5NTFg0X0VOX0ZMQUdfRENCX0VOQUJMRUQ7Ci0JCQlwcml2LT5jZWVfcGFyYW1zLmRjYl9jZmcucGZjX3N0YXRlID0gZmFsc2U7CisJCQlwcml2LT5jZWVfY29uZmlnLnBmY19zdGF0ZSA9IGZhbHNlOwogCQl9CiAJfQogI2VuZGlmIC8qIENPTkZJR19NTFg0X0VOX0RDQiAqLwpAQCAtMjM5OSwxMiArMjQwMCwxNCBAQAogCXJldHVybiBtbHg0X3NldF92Zl9tYWMobWRldi0+ZGV2LCBlbl9wcml2LT5wb3J0LCBxdWV1ZSwgbWFjX3U2NCk7CiB9CiAKLXN0YXRpYyBpbnQgbWx4NF9lbl9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MpCitzdGF0aWMgaW50IG1seDRfZW5fc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZmLCB1MTYgdmxhbiwgdTggcW9zLAorCQkJICAgICAgIF9fYmUxNiB2bGFuX3Byb3RvKQogewogCXN0cnVjdCBtbHg0X2VuX3ByaXYgKmVuX3ByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbHg0X2VuX2RldiAqbWRldiA9IGVuX3ByaXYtPm1kZXY7CiAKLQlyZXR1cm4gbWx4NF9zZXRfdmZfdmxhbihtZGV2LT5kZXYsIGVuX3ByaXYtPnBvcnQsIHZmLCB2bGFuLCBxb3MpOworCXJldHVybiBtbHg0X3NldF92Zl92bGFuKG1kZXYtPmRldiwgZW5fcHJpdi0+cG9ydCwgdmYsIHZsYW4sIHFvcywKKwkJCQl2bGFuX3Byb3RvKTsKIH0KIAogc3RhdGljIGludCBtbHg0X2VuX3NldF92Zl9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2ZiwgaW50IG1pbl90eF9yYXRlLApAQCAtMjY0MiwxMiArMjY0NSwxNiBAQAogCQkJaWYgKElTX0VSUihwcm9nKSkKIAkJCQlyZXR1cm4gUFRSX0VSUihwcm9nKTsKIAkJfQorCQltdXRleF9sb2NrKCZtZGV2LT5zdGF0ZV9sb2NrKTsKIAkJZm9yIChpID0gMDsgaSA8IHByaXYtPnJ4X3JpbmdfbnVtOyBpKyspIHsKLQkJCS8qIFRoaXMgeGNoZyBpcyBwYWlyZWQgd2l0aCBSRUFEX09OQ0UgaW4gdGhlIGZhc3RwYXRoICovCi0JCQlvbGRfcHJvZyA9IHhjaGcoJnByaXYtPnJ4X3JpbmdbaV0tPnhkcF9wcm9nLCBwcm9nKTsKKwkJCW9sZF9wcm9nID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZCgKKwkJCQkJcHJpdi0+cnhfcmluZ1tpXS0+eGRwX3Byb2csCisJCQkJCWxvY2tkZXBfaXNfaGVsZCgmbWRldi0+c3RhdGVfbG9jaykpOworCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHByaXYtPnJ4X3JpbmdbaV0tPnhkcF9wcm9nLCBwcm9nKTsKIAkJCWlmIChvbGRfcHJvZykKIAkJCQlicGZfcHJvZ19wdXQob2xkX3Byb2cpOwogCQl9CisJCW11dGV4X3VubG9jaygmbWRldi0+c3RhdGVfbG9jayk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjY4MCw3ICsyNjg3LDEwIEBACiAJCQkJCQkJcHJpdi0+eGRwX3JpbmdfbnVtKTsKIAogCWZvciAoaSA9IDA7IGkgPCBwcml2LT5yeF9yaW5nX251bTsgaSsrKSB7Ci0JCW9sZF9wcm9nID0geGNoZygmcHJpdi0+cnhfcmluZ1tpXS0+eGRwX3Byb2csIHByb2cpOworCQlvbGRfcHJvZyA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoCisJCQkJCXByaXYtPnJ4X3JpbmdbaV0tPnhkcF9wcm9nLAorCQkJCQlsb2NrZGVwX2lzX2hlbGQoJm1kZXYtPnN0YXRlX2xvY2spKTsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHByaXYtPnJ4X3JpbmdbaV0tPnhkcF9wcm9nLCBwcm9nKTsKIAkJaWYgKG9sZF9wcm9nKQogCQkJYnBmX3Byb2dfcHV0KG9sZF9wcm9nKTsKIAl9CkBAIC0zMDQ4LDkgKzMwNTgsNiBAQAogCXN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXY7CiAJaW50IGk7CiAJaW50IGVycjsKLSNpZmRlZiBDT05GSUdfTUxYNF9FTl9EQ0IKLQlzdHJ1Y3QgdGNfY29uZmlndXJhdGlvbiAqdGM7Ci0jZW5kaWYKIAogCWRldiA9IGFsbG9jX2V0aGVyZGV2X21xcyhzaXplb2Yoc3RydWN0IG1seDRfZW5fcHJpdiksCiAJCQkJIE1BWF9UWF9SSU5HUywgTUFYX1JYX1JJTkdTKTsKQEAgLTMxMTcsMTYgKzMxMjQsMTMgQEAKIAlwcml2LT5tc2dfZW5hYmxlID0gTUxYNF9FTl9NU0dfTEVWRUw7CiAjaWZkZWYgQ09ORklHX01MWDRfRU5fRENCCiAJaWYgKCFtbHg0X2lzX3NsYXZlKHByaXYtPm1kZXYtPmRldikpIHsKLQkJcHJpdi0+Y2VlX3BhcmFtcy5kY2J4X2NhcCA9IERDQl9DQVBfRENCWF9WRVJfQ0VFIHwKLQkJCQkJICAgIERDQl9DQVBfRENCWF9IT1NUIHwKLQkJCQkJICAgIERDQl9DQVBfRENCWF9WRVJfSUVFRTsKKwkJcHJpdi0+ZGNieF9jYXAgPSBEQ0JfQ0FQX0RDQlhfVkVSX0NFRSB8IERDQl9DQVBfRENCWF9IT1NUIHwKKwkJCURDQl9DQVBfRENCWF9WRVJfSUVFRTsKIAkJcHJpdi0+ZmxhZ3MgfD0gTUxYNF9FTl9EQ0JfRU5BQkxFRDsKLQkJcHJpdi0+Y2VlX3BhcmFtcy5kY2JfY2ZnLnBmY19zdGF0ZSA9IGZhbHNlOworCQlwcml2LT5jZWVfY29uZmlnLnBmY19zdGF0ZSA9IGZhbHNlOwogCi0JCWZvciAoaSA9IDA7IGkgPCBNTFg0X0VOX05VTV9VUDsgaSsrKSB7Ci0JCQl0YyA9ICZwcml2LT5jZWVfcGFyYW1zLmRjYl9jZmcudGNfY29uZmlnW2ldOwotCQkJdGMtPmRjYl9wZmMgPSBwZmNfZGlzYWJsZWQ7Ci0JCX0KKwkJZm9yIChpID0gMDsgaSA8IE1MWDRfRU5fTlVNX1VQOyBpKyspCisJCQlwcml2LT5jZWVfY29uZmlnLmRjYl9wZmNbaV0gPSBwZmNfZGlzYWJsZWQ7CiAKIAkJaWYgKG1kZXYtPmRldi0+Y2Fwcy5mbGFnczIgJiBNTFg0X0RFVl9DQVBfRkxBRzJfRVRTX0NGRykgewogCQkJZGV2LT5kY2JubF9vcHMgPSAmbWx4NF9lbl9kY2JubF9vcHM7CkBAIC0zMjIyLDYgKzMyMjYsNyBAQAogCX0KIAogCWlmIChtbHg0X2lzX3NsYXZlKG1kZXYtPmRldikpIHsKKwkJYm9vbCB2bGFuX29mZmxvYWRfZGlzYWJsZWQ7CiAJCWludCBwaHY7CiAKIAkJZXJyID0gZ2V0X3Bodl9iaXQobWRldi0+ZGV2LCBwb3J0LCAmcGh2KTsKQEAgLTMyMjksNiArMzIzNCwxOCBAQAogCQkJZGV2LT5od19mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fU1RBR19UWDsKIAkJCXByaXYtPnBmbGFncyB8PSBNTFg0X0VOX1BSSVZfRkxBR1NfUEhWOwogCQl9CisJCWVyciA9IG1seDRfZ2V0X2lzX3ZsYW5fb2ZmbG9hZF9kaXNhYmxlZChtZGV2LT5kZXYsIHBvcnQsCisJCQkJCQkJJnZsYW5fb2ZmbG9hZF9kaXNhYmxlZCk7CisJCWlmICghZXJyICYmIHZsYW5fb2ZmbG9hZF9kaXNhYmxlZCkgeworCQkJZGV2LT5od19mZWF0dXJlcyAmPSB+KE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYIHwKKwkJCQkJICAgICAgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlggfAorCQkJCQkgICAgICBORVRJRl9GX0hXX1ZMQU5fU1RBR19UWCB8CisJCQkJCSAgICAgIE5FVElGX0ZfSFdfVkxBTl9TVEFHX1JYKTsKKwkJCWRldi0+ZmVhdHVyZXMgJj0gfihORVRJRl9GX0hXX1ZMQU5fQ1RBR19UWCB8CisJCQkJCSAgIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYIHwKKwkJCQkJICAgTkVUSUZfRl9IV19WTEFOX1NUQUdfVFggfAorCQkJCQkgICBORVRJRl9GX0hXX1ZMQU5fU1RBR19SWCk7CisJCX0KIAl9IGVsc2UgewogCQlpZiAobWRldi0+ZGV2LT5jYXBzLmZsYWdzMiAmIE1MWDRfREVWX0NBUF9GTEFHMl9QSFZfRU4gJiYKIAkJICAgICEobWRldi0+ZGV2LT5jYXBzLmZsYWdzMiAmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3J4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3J4LmMKaW5kZXggMjA0MGRhZC4uZjJlOGJlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fcnguYwpAQCAtNzIsNyArNzIsNyBAQAogCX0KIAlkbWEgPSBkbWFfbWFwX3BhZ2UocHJpdi0+ZGRldiwgcGFnZSwgMCwgUEFHRV9TSVpFIDw8IG9yZGVyLAogCQkJICAgZnJhZ19pbmZvLT5kbWFfZGlyKTsKLQlpZiAoZG1hX21hcHBpbmdfZXJyb3IocHJpdi0+ZGRldiwgZG1hKSkgeworCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcihwcml2LT5kZGV2LCBkbWEpKSkgewogCQlwdXRfcGFnZShwYWdlKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTA4LDcgKzEwOCw4IEBACiAJCSAgICByaW5nX2FsbG9jW2ldLnBhZ2Vfc2l6ZSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChtbHg0X2FsbG9jX3BhZ2VzKHByaXYsICZwYWdlX2FsbG9jW2ldLCBmcmFnX2luZm8sIGdmcCkpCisJCWlmICh1bmxpa2VseShtbHg0X2FsbG9jX3BhZ2VzKHByaXYsICZwYWdlX2FsbG9jW2ldLAorCQkJCQkgICAgICBmcmFnX2luZm8sIGdmcCkpKQogCQkJZ290byBvdXQ7CiAJfQogCkBAIC01MzcsNyArNTM4LDkgQEAKIAlzdHJ1Y3QgbWx4NF9lbl9yeF9yaW5nICpyaW5nID0gKnByaW5nOwogCXN0cnVjdCBicGZfcHJvZyAqb2xkX3Byb2c7CiAKLQlvbGRfcHJvZyA9IFJFQURfT05DRShyaW5nLT54ZHBfcHJvZyk7CisJb2xkX3Byb2cgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKAorCQkJCQlyaW5nLT54ZHBfcHJvZywKKwkJCQkJbG9ja2RlcF9pc19oZWxkKCZtZGV2LT5zdGF0ZV9sb2NrKSk7CiAJaWYgKG9sZF9wcm9nKQogCQlicGZfcHJvZ19wdXQob2xkX3Byb2cpOwogCW1seDRfZnJlZV9od3FfcmVzKG1kZXYtPmRldiwgJnJpbmctPndxcmVzLCBzaXplICogc3RyaWRlICsgVFhCQl9TSVpFKTsKQEAgLTU4Myw3ICs1ODYsNyBAQAogCQlmcmFnX2luZm8gPSAmcHJpdi0+ZnJhZ19pbmZvW25yXTsKIAkJaWYgKGxlbmd0aCA8PSBmcmFnX2luZm8tPmZyYWdfcHJlZml4X3NpemUpCiAJCQlicmVhazsKLQkJaWYgKCFmcmFnc1tucl0ucGFnZSkKKwkJaWYgKHVubGlrZWx5KCFmcmFnc1tucl0ucGFnZSkpCiAJCQlnb3RvIGZhaWw7CiAKIAkJZG1hID0gYmU2NF90b19jcHUocnhfZGVzYy0+ZGF0YVtucl0uYWRkcik7CkBAIC02MjMsNyArNjI2LDcgQEAKIAlkbWFfYWRkcl90IGRtYTsKIAogCXNrYiA9IG5ldGRldl9hbGxvY19za2IocHJpdi0+ZGV2LCBTTUFMTF9QQUNLRVRfU0laRSArIE5FVF9JUF9BTElHTik7Ci0JaWYgKCFza2IpIHsKKwlpZiAodW5saWtlbHkoIXNrYikpIHsKIAkJZW5fZGJnKFJYX0VSUiwgcHJpdiwgIkZhaWxlZCBhbGxvY2F0aW5nIHNrYlxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTczNCw3ICs3MzcsOCBAQAogewogCV9fd3N1bSBjc3VtX3BzZXVkb19oZHIgPSAwOwogCi0JaWYgKGlwdjZoLT5uZXh0aGRyID09IElQUFJPVE9fRlJBR01FTlQgfHwgaXB2NmgtPm5leHRoZHIgPT0gSVBQUk9UT19IT1BPUFRTKQorCWlmICh1bmxpa2VseShpcHY2aC0+bmV4dGhkciA9PSBJUFBST1RPX0ZSQUdNRU5UIHx8CisJCSAgICAgaXB2NmgtPm5leHRoZHIgPT0gSVBQUk9UT19IT1BPUFRTKSkKIAkJcmV0dXJuIC0xOwogCWh3X2NoZWNrc3VtID0gY3N1bV9hZGQoaHdfY2hlY2tzdW0sIChfX2ZvcmNlIF9fd3N1bSlodG9ucyhpcHY2aC0+bmV4dGhkcikpOwogCkBAIC03NjcsNyArNzcxLDcgQEAKIAkJZ2V0X2ZpeGVkX2lwdjRfY3N1bShod19jaGVja3N1bSwgc2tiLCBoZHIpOwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJZWxzZSBpZiAoY3FlLT5zdGF0dXMgJiBjcHVfdG9fYmUxNihNTFg0X0NRRV9TVEFUVVNfSVBWNikpCi0JCWlmIChnZXRfZml4ZWRfaXB2Nl9jc3VtKGh3X2NoZWNrc3VtLCBza2IsIGhkcikpCisJCWlmICh1bmxpa2VseShnZXRfZml4ZWRfaXB2Nl9jc3VtKGh3X2NoZWNrc3VtLCBza2IsIGhkcikpKQogCQkJcmV0dXJuIC0xOwogI2VuZGlmCiAJcmV0dXJuIDA7CkBAIC03OTQsMTMgKzc5OCwxNSBAQAogCXU2NCB0aW1lc3RhbXA7CiAJYm9vbCBsMl90dW5uZWw7CiAKLQlpZiAoIXByaXYtPnBvcnRfdXApCisJaWYgKHVubGlrZWx5KCFwcml2LT5wb3J0X3VwKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoYnVkZ2V0IDw9IDApCisJaWYgKHVubGlrZWx5KGJ1ZGdldCA8PSAwKSkKIAkJcmV0dXJuIHBvbGxlZDsKIAotCXhkcF9wcm9nID0gUkVBRF9PTkNFKHJpbmctPnhkcF9wcm9nKTsKKwkvKiBQcm90ZWN0IGFjY2Vzc2VzIHRvOiByaW5nLT54ZHBfcHJvZywgcHJpdi0+bWFjX2hhc2ggbGlzdCAqLworCXJjdV9yZWFkX2xvY2soKTsKKwl4ZHBfcHJvZyA9IHJjdV9kZXJlZmVyZW5jZShyaW5nLT54ZHBfcHJvZyk7CiAJZG9vcmJlbGxfcGVuZGluZyA9IDA7CiAJdHhfaW5kZXggPSAocHJpdi0+dHhfcmluZ19udW0gLSBwcml2LT54ZHBfcmluZ19udW0pICsgY3EtPnJpbmc7CiAKQEAgLTg1OCwxNSArODY0LDExIEBACiAJCQkJLyogRHJvcCB0aGUgcGFja2V0LCBzaW5jZSBIVyBsb29wYmFjay1lZCBpdCAqLwogCQkJCW1hY19oYXNoID0gZXRoaC0+aF9zb3VyY2VbTUxYNF9FTl9NQUNfSEFTSF9JRFhdOwogCQkJCWJ1Y2tldCA9ICZwcml2LT5tYWNfaGFzaFttYWNfaGFzaF07Ci0JCQkJcmN1X3JlYWRfbG9jaygpOwogCQkJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShlbnRyeSwgYnVja2V0LCBobGlzdCkgewogCQkJCQlpZiAoZXRoZXJfYWRkcl9lcXVhbF82NGJpdHMoZW50cnktPm1hYywKLQkJCQkJCQkJICAgIGV0aGgtPmhfc291cmNlKSkgewotCQkJCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQkJCQkJCSAgICBldGhoLT5oX3NvdXJjZSkpCiAJCQkJCQlnb3RvIG5leHQ7Ci0JCQkJCX0KIAkJCQl9Ci0JCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQl9CiAJCX0KIApAQCAtOTAyLDE2ICs5MDQsMTcgQEAKIAkJCWNhc2UgWERQX1BBU1M6CiAJCQkJYnJlYWs7CiAJCQljYXNlIFhEUF9UWDoKLQkJCQlpZiAoIW1seDRfZW5feG1pdF9mcmFtZShmcmFncywgZGV2LAorCQkJCWlmIChsaWtlbHkoIW1seDRfZW5feG1pdF9mcmFtZShmcmFncywgZGV2LAogCQkJCQkJCWxlbmd0aCwgdHhfaW5kZXgsCi0JCQkJCQkJJmRvb3JiZWxsX3BlbmRpbmcpKQorCQkJCQkJCSZkb29yYmVsbF9wZW5kaW5nKSkpCiAJCQkJCWdvdG8gY29uc3VtZWQ7Ci0JCQkJYnJlYWs7CisJCQkJZ290byB4ZHBfZHJvcDsgLyogRHJvcCBvbiB4bWl0IGZhaWx1cmUgKi8KIAkJCWRlZmF1bHQ6CiAJCQkJYnBmX3dhcm5faW52YWxpZF94ZHBfYWN0aW9uKGFjdCk7CiAJCQljYXNlIFhEUF9BQk9SVEVEOgogCQkJY2FzZSBYRFBfRFJPUDoKLQkJCQlpZiAobWx4NF9lbl9yeF9yZWN5Y2xlKHJpbmcsIGZyYWdzKSkKK3hkcF9kcm9wOgorCQkJCWlmIChsaWtlbHkobWx4NF9lbl9yeF9yZWN5Y2xlKHJpbmcsIGZyYWdzKSkpCiAJCQkJCWdvdG8gY29uc3VtZWQ7CiAJCQkJZ290byBuZXh0OwogCQkJfQpAQCAtMTAxNSwxMiArMTAxOCwxMiBAQAogCiAJCS8qIEdSTyBub3QgcG9zc2libGUsIGNvbXBsZXRlIHByb2Nlc3NpbmcgaGVyZSAqLwogCQlza2IgPSBtbHg0X2VuX3J4X3NrYihwcml2LCByeF9kZXNjLCBmcmFncywgbGVuZ3RoKTsKLQkJaWYgKCFza2IpIHsKKwkJaWYgKHVubGlrZWx5KCFza2IpKSB7CiAJCQlyaW5nLT5kcm9wcGVkKys7CiAJCQlnb3RvIG5leHQ7CiAJCX0KIAotICAgICAgICAgICAgICAgIGlmICh1bmxpa2VseShwcml2LT52YWxpZGF0ZV9sb29wYmFjaykpIHsKKwkJaWYgKHVubGlrZWx5KHByaXYtPnZhbGlkYXRlX2xvb3BiYWNrKSkgewogCQkJdmFsaWRhdGVfbG9vcGJhY2socHJpdiwgc2tiKTsKIAkJCWdvdG8gbmV4dDsKIAkJfQpAQCAtMTA3Nyw2ICsxMDgwLDcgQEAKIAl9CiAKIG91dDoKKwlyY3VfcmVhZF91bmxvY2soKTsKIAlpZiAoZG9vcmJlbGxfcGVuZGluZykKIAkJbWx4NF9lbl94bWl0X2Rvb3JiZWxsKHByaXYtPnR4X3JpbmdbdHhfaW5kZXhdKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl90eC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl90eC5jCmluZGV4IDlkZjg3Y2EuLmUyNTA5YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fdHguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3R4LmMKQEAgLTgxOCw3ICs4MTgsNyBAQAogCXJlYWxfc2l6ZSA9IGdldF9yZWFsX3NpemUoc2tiLCBzaGluZm8sIGRldiwgJmxzb19oZWFkZXJfc2l6ZSwKIAkJCQkgICZpbmxpbmVfb2ssICZmcmFncHRyKTsKIAlpZiAodW5saWtlbHkoIXJlYWxfc2l6ZSkpCi0JCWdvdG8gdHhfZHJvcDsKKwkJZ290byB0eF9kcm9wX2NvdW50OwogCiAJLyogQWxpZ24gZGVzY3JpcHRvciB0byBUWEJCIHNpemUgKi8KIAlkZXNjX3NpemUgPSBBTElHTihyZWFsX3NpemUsIFRYQkJfU0laRSk7CkBAIC04MjYsNyArODI2LDcgQEAKIAlpZiAodW5saWtlbHkobnJfdHhiYiA+IE1BWF9ERVNDX1RYQkJTKSkgewogCQlpZiAobmV0aWZfbXNnX3R4X2Vycihwcml2KSkKIAkJCWVuX3dhcm4ocHJpdiwgIk92ZXJzaXplZCBoZWFkZXIgb3IgU0cgbGlzdFxuIik7Ci0JCWdvdG8gdHhfZHJvcDsKKwkJZ290byB0eF9kcm9wX2NvdW50OwogCX0KIAogCWJmX29rID0gcmluZy0+YmZfZW5hYmxlZDsKQEAgLTEwNzEsOSArMTA3MSwxMCBAQAogCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOwogCX0KIAordHhfZHJvcF9jb3VudDoKKwlyaW5nLT50eF9kcm9wcGVkKys7CiB0eF9kcm9wOgogCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JcmluZy0+dHhfZHJvcHBlZCsrOwogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKQEAgLTExMDYsNyArMTEwNyw3IEBACiAJCWdvdG8gdHhfZHJvcDsKIAogCWlmIChtbHg0X2VuX2lzX3R4X3JpbmdfZnVsbChyaW5nKSkKLQkJZ290byB0eF9kcm9wOworCQlnb3RvIHR4X2Ryb3BfY291bnQ7CiAKIAkvKiBmZXRjaCByaW5nLT5jb25zIGZhciBhaGVhZCBiZWZvcmUgbmVlZGluZyBpdCB0byBhdm9pZCBzdGFsbCAqLwogCXJpbmdfY29ucyA9IFJFQURfT05DRShyaW5nLT5jb25zKTsKQEAgLTExNzYsNyArMTE3Nyw4IEBACiAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogCi10eF9kcm9wOgordHhfZHJvcF9jb3VudDoKIAlyaW5nLT50eF9kcm9wcGVkKys7Cit0eF9kcm9wOgogCXJldHVybiBORVRERVZfVFhfQlVTWTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZXEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZXEuYwppbmRleCBmNjEzOTc3Li5jZjhmOGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VxLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lcS5jCkBAIC0xMzA1LDggKzEzMDUsOCBAQAogCXJldHVybiAwOwogCiBlcnJfb3V0X3VubWFwOgotCXdoaWxlIChpID49IDApCi0JCW1seDRfZnJlZV9lcShkZXYsICZwcml2LT5lcV90YWJsZS5lcVtpLS1dKTsKKwl3aGlsZSAoaSA+IDApCisJCW1seDRfZnJlZV9lcShkZXYsICZwcml2LT5lcV90YWJsZS5lcVstLWldKTsKICNpZmRlZiBDT05GSUdfUkZTX0FDQ0VMCiAJZm9yIChpID0gMTsgaSA8PSBkZXYtPmNhcHMubnVtX3BvcnRzOyBpKyspIHsKIAkJaWYgKG1seDRfcHJpdihkZXYpLT5wb3J0W2ldLnJtYXApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZncuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZncuYwppbmRleCBkNzI4NzA0Li5mOWNiYzY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9mdy5jCkBAIC0xNTgsNyArMTU4LDggQEAKIAkJWzMxXSA9ICJNb2RpZnlpbmcgbG9vcGJhY2sgc291cmNlIGNoZWNrcyB1c2luZyBVUERBVEVfUVAgc3VwcG9ydCIsCiAJCVszMl0gPSAiTG9vcGJhY2sgc291cmNlIGNoZWNrcyBzdXBwb3J0IiwKIAkJWzMzXSA9ICJSb0NFdjIgc3VwcG9ydCIsCi0JCVszNF0gPSAiRE1GUyBTbmlmZmVyIHN1cHBvcnQgKFVDICYgTUMpIgorCQlbMzRdID0gIkRNRlMgU25pZmZlciBzdXBwb3J0IChVQyAmIE1DKSIsCisJCVszNV0gPSAiUWluUSBWU1QgbW9kZSBzdXBwb3J0IiwKIAl9OwogCWludCBpOwogCkBAIC0yNDgsNiArMjQ5LDcyIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBtbHg0X2FjdGl2YXRlX3ZzdF9xaW5xKHN0cnVjdCBtbHg0X3ByaXYgKnByaXYsIGludCBzbGF2ZSwgaW50IHBvcnQpCit7CisJc3RydWN0IG1seDRfdnBvcnRfb3Blcl9zdGF0ZSAqdnBfb3BlcjsKKwlzdHJ1Y3QgbWx4NF92cG9ydF9zdGF0ZSAqdnBfYWRtaW47CisJaW50IGVycjsKKworCXZwX29wZXIgPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnZmX29wZXJbc2xhdmVdLnZwb3J0W3BvcnRdOworCXZwX2FkbWluID0gJnByaXYtPm1mdW5jLm1hc3Rlci52Zl9hZG1pbltzbGF2ZV0udnBvcnRbcG9ydF07CisKKwlpZiAodnBfYWRtaW4tPmRlZmF1bHRfdmxhbiAhPSB2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3ZsYW4pIHsKKwkJZXJyID0gX19tbHg0X3JlZ2lzdGVyX3ZsYW4oJnByaXYtPmRldiwgcG9ydCwKKwkJCQkJICAgdnBfYWRtaW4tPmRlZmF1bHRfdmxhbiwKKwkJCQkJICAgJnZwX29wZXItPnZsYW5faWR4KTsKKwkJaWYgKGVycikgeworCQkJdnBfb3Blci0+dmxhbl9pZHggPSBOT19JTkRYOworCQkJbWx4NF93YXJuKCZwcml2LT5kZXYsCisJCQkJICAiTm8gdmxhbiByZXNvdXJjZXMgc2xhdmUgJWQsIHBvcnQgJWRcbiIsCisJCQkJICBzbGF2ZSwgcG9ydCk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCW1seDRfZGJnKCZwcml2LT5kZXYsICJhbGxvYyB2bGFuICVkIGlkeCAgJWQgc2xhdmUgJWQgcG9ydCAlZFxuIiwKKwkJCSAoaW50KSh2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3ZsYW4pLAorCQkJIHZwX29wZXItPnZsYW5faWR4LCBzbGF2ZSwgcG9ydCk7CisJfQorCXZwX29wZXItPnN0YXRlLnZsYW5fcHJvdG8gICA9IHZwX2FkbWluLT52bGFuX3Byb3RvOworCXZwX29wZXItPnN0YXRlLmRlZmF1bHRfdmxhbiA9IHZwX2FkbWluLT5kZWZhdWx0X3ZsYW47CisJdnBfb3Blci0+c3RhdGUuZGVmYXVsdF9xb3MgID0gdnBfYWRtaW4tPmRlZmF1bHRfcW9zOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWx4NF9oYW5kbGVfdnN0X3FpbnEoc3RydWN0IG1seDRfcHJpdiAqcHJpdiwgaW50IHNsYXZlLCBpbnQgcG9ydCkKK3sKKwlzdHJ1Y3QgbWx4NF92cG9ydF9vcGVyX3N0YXRlICp2cF9vcGVyOworCXN0cnVjdCBtbHg0X3NsYXZlX3N0YXRlICpzbGF2ZV9zdGF0ZTsKKwlzdHJ1Y3QgbWx4NF92cG9ydF9zdGF0ZSAqdnBfYWRtaW47CisJaW50IGVycjsKKworCXZwX29wZXIgPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnZmX29wZXJbc2xhdmVdLnZwb3J0W3BvcnRdOworCXZwX2FkbWluID0gJnByaXYtPm1mdW5jLm1hc3Rlci52Zl9hZG1pbltzbGF2ZV0udnBvcnRbcG9ydF07CisJc2xhdmVfc3RhdGUgPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlW3NsYXZlXTsKKworCWlmICgodnBfYWRtaW4tPnZsYW5fcHJvdG8gIT0gaHRvbnMoRVRIX1BfODAyMUFEKSkgfHwKKwkgICAgKCFzbGF2ZV9zdGF0ZS0+YWN0aXZlKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodnBfb3Blci0+c3RhdGUudmxhbl9wcm90byA9PSB2cF9hZG1pbi0+dmxhbl9wcm90byAmJgorCSAgICB2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3ZsYW4gPT0gdnBfYWRtaW4tPmRlZmF1bHRfdmxhbiAmJgorCSAgICB2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3FvcyA9PSB2cF9hZG1pbi0+ZGVmYXVsdF9xb3MpCisJCXJldHVybiAwOworCisJaWYgKCFzbGF2ZV9zdGF0ZS0+dnN0X3FpbnFfc3VwcG9ydGVkKSB7CisJCS8qIFdhcm4gYW5kIHJldmVydCB0aGUgcmVxdWVzdCB0byBzZXQgdnN0IFFpblEgbW9kZSAqLworCQl2cF9hZG1pbi0+dmxhbl9wcm90byAgID0gdnBfb3Blci0+c3RhdGUudmxhbl9wcm90bzsKKwkJdnBfYWRtaW4tPmRlZmF1bHRfdmxhbiA9IHZwX29wZXItPnN0YXRlLmRlZmF1bHRfdmxhbjsKKwkJdnBfYWRtaW4tPmRlZmF1bHRfcW9zICA9IHZwX29wZXItPnN0YXRlLmRlZmF1bHRfcW9zOworCisJCW1seDRfd2FybigmcHJpdi0+ZGV2LAorCQkJICAiU2xhdmUgJWQgZG9lcyBub3Qgc3VwcG9ydCBWU1QgUWluUSBtb2RlXG4iLCBzbGF2ZSk7CisJCXJldHVybiAwOworCX0KKworCWVyciA9IG1seDRfYWN0aXZhdGVfdnN0X3FpbnEocHJpdiwgc2xhdmUsIHBvcnQpOworCXJldHVybiBlcnI7Cit9CisKIGludCBtbHg0X1FVRVJZX0ZVTkNfQ0FQX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKIAkJCQlzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAogCQkJCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKQEAgLTMxMSwxNCArMzc4LDE4IEBACiAjZGVmaW5lIFFVRVJZX0ZVTkNfQ0FQX1ZGX0VOQUJMRV9RUDAJCTB4MDgKIAogI2RlZmluZSBRVUVSWV9GVU5DX0NBUF9GTEFHUzBfRk9SQ0VfUEhZX1dRRV9HSUQgMHg4MAotI2RlZmluZSBRVUVSWV9GVU5DX0NBUF9TVVBQT1JUU19OT05fUE9XRVJfT0ZfMl9OVU1fRVFTICgxIDw8IDMxKQogI2RlZmluZSBRVUVSWV9GVU5DX0NBUF9QSFZfQklUCQkJMHg0MAorI2RlZmluZSBRVUVSWV9GVU5DX0NBUF9WTEFOX09GRkxPQURfRElTQUJMRQkweDIwCisKKyNkZWZpbmUgUVVFUllfRlVOQ19DQVBfU1VQUE9SVFNfVlNUX1FJTlEJQklUKDMwKQorI2RlZmluZSBRVUVSWV9GVU5DX0NBUF9TVVBQT1JUU19OT05fUE9XRVJfT0ZfMl9OVU1fRVFTIEJJVCgzMSkKIAogCWlmICh2aGNyLT5vcF9tb2RpZmllciA9PSAxKSB7CiAJCXN0cnVjdCBtbHg0X2FjdGl2ZV9wb3J0cyBhY3R2X3BvcnRzID0KIAkJCW1seDRfZ2V0X2FjdGl2ZV9wb3J0cyhkZXYsIHNsYXZlKTsKIAkJaW50IGNvbnZlcnRlZF9wb3J0ID0gbWx4NF9zbGF2ZV9jb252ZXJ0X3BvcnQoCiAJCQkJZGV2LCBzbGF2ZSwgdmhjci0+aW5fbW9kaWZpZXIpOworCQlzdHJ1Y3QgbWx4NF92cG9ydF9vcGVyX3N0YXRlICp2cF9vcGVyOwogCiAJCWlmIChjb252ZXJ0ZWRfcG9ydCA8IDApCiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM1NywxNSArNDI4LDI0IEBACiAJCU1MWDRfUFVUKG91dGJveC0+YnVmLCBkZXYtPmNhcHMucGh5c19wb3J0X2lkW3ZoY3ItPmluX21vZGlmaWVyXSwKIAkJCSBRVUVSWV9GVU5DX0NBUF9QSFlTX1BPUlRfSUQpOwogCi0JCWlmIChkZXYtPmNhcHMucGh2X2JpdFtwb3J0XSkgewotCQkJZmllbGQgPSBRVUVSWV9GVU5DX0NBUF9QSFZfQklUOwotCQkJTUxYNF9QVVQob3V0Ym94LT5idWYsIGZpZWxkLAotCQkJCSBRVUVSWV9GVU5DX0NBUF9GTEFHUzBfT0ZGU0VUKTsKLQkJfQorCQl2cF9vcGVyID0gJnByaXYtPm1mdW5jLm1hc3Rlci52Zl9vcGVyW3NsYXZlXS52cG9ydFtwb3J0XTsKKwkJZXJyID0gbWx4NF9oYW5kbGVfdnN0X3FpbnEocHJpdiwgc2xhdmUsIHBvcnQpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlmaWVsZCA9IDA7CisJCWlmIChkZXYtPmNhcHMucGh2X2JpdFtwb3J0XSkKKwkJCWZpZWxkIHw9IFFVRVJZX0ZVTkNfQ0FQX1BIVl9CSVQ7CisJCWlmICh2cF9vcGVyLT5zdGF0ZS52bGFuX3Byb3RvID09IGh0b25zKEVUSF9QXzgwMjFBRCkpCisJCQlmaWVsZCB8PSBRVUVSWV9GVU5DX0NBUF9WTEFOX09GRkxPQURfRElTQUJMRTsKKwkJTUxYNF9QVVQob3V0Ym94LT5idWYsIGZpZWxkLCBRVUVSWV9GVU5DX0NBUF9GTEFHUzBfT0ZGU0VUKTsKIAogCX0gZWxzZSBpZiAodmhjci0+b3BfbW9kaWZpZXIgPT0gMCkgewogCQlzdHJ1Y3QgbWx4NF9hY3RpdmVfcG9ydHMgYWN0dl9wb3J0cyA9CiAJCQltbHg0X2dldF9hY3RpdmVfcG9ydHMoZGV2LCBzbGF2ZSk7CisJCXN0cnVjdCBtbHg0X3NsYXZlX3N0YXRlICpzbGF2ZV9zdGF0ZSA9CisJCQkmcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlW3NsYXZlXTsKKwogCQkvKiBlbmFibGUgcmRtYSBhbmQgZXRoZXJuZXQgaW50ZXJmYWNlcywgbmV3IHF1b3RhIGxvY2F0aW9ucywKIAkJICogYW5kIHJlc2VydmVkIGxrZXkKIAkJICovCkBAIC00MzksNiArNTE5LDEwIEBACiAKIAkJc2l6ZSA9IGRldi0+Y2Fwcy5yZXNlcnZlZF9sa2V5ICsgKChzbGF2ZSA8PCA4KSAmIDB4RkYwMCk7CiAJCU1MWDRfUFVUKG91dGJveC0+YnVmLCBzaXplLCBRVUVSWV9GVU5DX0NBUF9RUF9SRVNEX0xLRVlfT0ZGU0VUKTsKKworCQlpZiAodmhjci0+aW5fbW9kaWZpZXIgJiBRVUVSWV9GVU5DX0NBUF9TVVBQT1JUU19WU1RfUUlOUSkKKwkJCXNsYXZlX3N0YXRlLT52c3RfcWlucV9zdXBwb3J0ZWQgPSB0cnVlOworCiAJfSBlbHNlCiAJCWVyciA9IC1FSU5WQUw7CiAKQEAgLTQ1NCwxMCArNTM4LDEyIEBACiAJdTMyCQkJc2l6ZSwgcWtleTsKIAlpbnQJCQllcnIgPSAwLCBxdW90YXMgPSAwOwogCXUzMiAgICAgICAgICAgICAgICAgICAgIGluX21vZGlmaWVyOworCXUzMgkJCXNsYXZlX2NhcHM7CiAKIAlvcF9tb2RpZmllciA9ICEhZ2VuX29yX3BvcnQ7IC8qIDAgPSBnZW5lcmFsLCAxID0gbG9naWNhbCBwb3J0ICovCi0JaW5fbW9kaWZpZXIgPSBvcF9tb2RpZmllciA/IGdlbl9vcl9wb3J0IDoKKwlzbGF2ZV9jYXBzID0gUVVFUllfRlVOQ19DQVBfU1VQUE9SVFNfVlNUX1FJTlEgfAogCQlRVUVSWV9GVU5DX0NBUF9TVVBQT1JUU19OT05fUE9XRVJfT0ZfMl9OVU1fRVFTOworCWluX21vZGlmaWVyID0gb3BfbW9kaWZpZXIgPyBnZW5fb3JfcG9ydCA6IHNsYXZlX2NhcHM7CiAKIAltYWlsYm94ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChkZXYpOwogCWlmIChJU19FUlIobWFpbGJveCkpCkBAIC02MTIsOCArNjk4LDcgQEAKIAkJTUxYNF9HRVQoZnVuY19jYXAtPnBoeXNfcG9ydF9pZCwgb3V0Ym94LAogCQkJIFFVRVJZX0ZVTkNfQ0FQX1BIWVNfUE9SVF9JRCk7CiAKLQlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9GVU5DX0NBUF9GTEFHUzBfT0ZGU0VUKTsKLQlmdW5jX2NhcC0+ZmxhZ3MgfD0gKGZpZWxkICYgUVVFUllfRlVOQ19DQVBfUEhWX0JJVCk7CisJTUxYNF9HRVQoZnVuY19jYXAtPmZsYWdzMCwgb3V0Ym94LCBRVUVSWV9GVU5DX0NBUF9GTEFHUzBfT0ZGU0VUKTsKIAogCS8qIEFsbCBvdGhlciByZXNvdXJjZXMgYXJlIGFsbG9jYXRlZCBieSB0aGUgbWFzdGVyLCBidXQgd2Ugc3RpbGwgcmVwb3J0CiAJICogJ251bScgYW5kICdyZXNlcnZlZCcgY2FwYWJpbGl0aWVzIGFzIGZvbGxvd3M6CkBAIC02OTAsNiArNzc1LDcgQEAKICNkZWZpbmUgUVVFUllfREVWX0NBUF9NQVhfREVTQ19TWl9TUV9PRkZTRVQJMHg1MgogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX01BWF9TR19SUV9PRkZTRVQJCTB4NTUKICNkZWZpbmUgUVVFUllfREVWX0NBUF9NQVhfREVTQ19TWl9SUV9PRkZTRVQJMHg1NgorI2RlZmluZSBRVUVSWV9ERVZfQ0FQX1NWTEFOX0JZX1FQX09GRlNFVAkweDVECiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfTUFYX1FQX01DR19PRkZTRVQJCTB4NjEKICNkZWZpbmUgUVVFUllfREVWX0NBUF9SU1ZEX01DR19PRkZTRVQJCTB4NjIKICNkZWZpbmUgUVVFUllfREVWX0NBUF9NQVhfTUNHX09GRlNFVAkJMHg2MwpAQCAtNzY3LDEyICs4NTMsOCBAQAogCWRldl9jYXAtPm1heF9lcXMgPSAxIDw8IChmaWVsZCAmIDB4Zik7CiAJTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfREVWX0NBUF9SU1ZEX01UVF9PRkZTRVQpOwogCWRldl9jYXAtPnJlc2VydmVkX210dHMgPSAxIDw8IChmaWVsZCA+PiA0KTsKLQlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX01BWF9NUldfU1pfT0ZGU0VUKTsKLQlkZXZfY2FwLT5tYXhfbXJ3X3N6ID0gMSA8PCBmaWVsZDsKIAlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX1JTVkRfTVJXX09GRlNFVCk7CiAJZGV2X2NhcC0+cmVzZXJ2ZWRfbXJ3cyA9IDEgPDwgKGZpZWxkICYgMHhmKTsKLQlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX01BWF9NVFRfU0VHX09GRlNFVCk7Ci0JZGV2X2NhcC0+bWF4X210dF9zZWcgPSAxIDw8IChmaWVsZCAmIDB4M2YpOwogCU1MWDRfR0VUKHNpemUsIG91dGJveCwgUVVFUllfREVWX0NBUF9OVU1fU1lTX0VRX09GRlNFVCk7CiAJZGV2X2NhcC0+bnVtX3N5c19lcXMgPSBzaXplICYgMHhmZmY7CiAJTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfREVWX0NBUF9NQVhfUkVRX1FQX09GRlNFVCk7CkBAIC04NTcsNiArOTM5LDkgQEAKIAlNTFg0X0dFVChzaXplLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfTUFYX0RFU0NfU1pfU1FfT0ZGU0VUKTsKIAlkZXZfY2FwLT5tYXhfc3FfZGVzY19zeiA9IHNpemU7CiAKKwlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX1NWTEFOX0JZX1FQX09GRlNFVCk7CisJaWYgKGZpZWxkICYgMHgxKQorCQlkZXZfY2FwLT5mbGFnczIgfD0gTUxYNF9ERVZfQ0FQX0ZMQUcyX1NWTEFOX0JZX1FQOwogCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfTUFYX1FQX01DR19PRkZTRVQpOwogCWRldl9jYXAtPm1heF9xcF9wZXJfbWNnID0gMSA8PCBmaWVsZDsKIAlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX1JTVkRfTUNHX09GRlNFVCk7CkBAIC0yOTE0LDcgKzI5OTksNyBAQAogCW1lbXNldCgmZnVuY19jYXAsIDAsIHNpemVvZihmdW5jX2NhcCkpOwogCWVyciA9IG1seDRfUVVFUllfRlVOQ19DQVAoZGV2LCBwb3J0LCAmZnVuY19jYXApOwogCWlmICghZXJyKQotCQkqcGh2ID0gZnVuY19jYXAuZmxhZ3MgJiBRVUVSWV9GVU5DX0NBUF9QSFZfQklUOworCQkqcGh2ID0gZnVuY19jYXAuZmxhZ3MwICYgUVVFUllfRlVOQ19DQVBfUEhWX0JJVDsKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTChnZXRfcGh2X2JpdCk7CkBAIC0yOTM4LDYgKzMwMjMsMjIgQEAKIH0KIEVYUE9SVF9TWU1CT0woc2V0X3Bodl9iaXQpOwogCitpbnQgbWx4NF9nZXRfaXNfdmxhbl9vZmZsb2FkX2Rpc2FibGVkKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LAorCQkJCSAgICAgIGJvb2wgKnZsYW5fb2ZmbG9hZF9kaXNhYmxlZCkKK3sKKwlzdHJ1Y3QgbWx4NF9mdW5jX2NhcCBmdW5jX2NhcDsKKwlpbnQgZXJyOworCisJbWVtc2V0KCZmdW5jX2NhcCwgMCwgc2l6ZW9mKGZ1bmNfY2FwKSk7CisJZXJyID0gbWx4NF9RVUVSWV9GVU5DX0NBUChkZXYsIHBvcnQsICZmdW5jX2NhcCk7CisJaWYgKCFlcnIpCisJCSp2bGFuX29mZmxvYWRfZGlzYWJsZWQgPQorCQkJISEoZnVuY19jYXAuZmxhZ3MwICYKKwkJCSAgIFFVRVJZX0ZVTkNfQ0FQX1ZMQU5fT0ZGTE9BRF9ESVNBQkxFKTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChtbHg0X2dldF9pc192bGFuX29mZmxvYWRfZGlzYWJsZWQpOworCiB2b2lkIG1seDRfcmVwbGFjZV96ZXJvX21hY3Moc3RydWN0IG1seDRfZGV2ICpkZXYpCiB7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmgKaW5kZXggY2RiZDc2Zi4uNTM0M2EwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9mdy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZncuaApAQCAtODAsOSArODAsNyBAQAogCWludCBtYXhfZXFzOwogCWludCBudW1fc3lzX2VxczsKIAlpbnQgcmVzZXJ2ZWRfbXR0czsKLQlpbnQgbWF4X21yd19zejsKIAlpbnQgcmVzZXJ2ZWRfbXJ3czsKLQlpbnQgbWF4X210dF9zZWc7CiAJaW50IG1heF9yZXF1ZXN0ZXJfcGVyX3FwOwogCWludCBtYXhfcmVzcG9uZGVyX3Blcl9xcDsKIAlpbnQgbWF4X3JkbWFfZ2xvYmFsOwpAQCAtMTUyLDcgKzE1MCw3IEBACiAJdTMyCXFwMV9wcm94eV9xcG47CiAJdTMyCXJlc2VydmVkX2xrZXk7CiAJdTgJcGh5c2ljYWxfcG9ydDsKLQl1OAlwb3J0X2ZsYWdzOworCXU4CWZsYWdzMDsKIAl1OAlmbGFnczE7CiAJdTY0CXBoeXNfcG9ydF9pZDsKIAl1MzIJZXh0cmFfZmxhZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWFpbi5jCmluZGV4IDc1ZGQyZTMuLjcxODNhYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWFpbi5jCkBAIC0yOTcwLDYgKzI5NzAsNyBAQAogCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gY3JlYXRlIG10dSBmaWxlIGZvciBwb3J0ICVkXG4iLCBwb3J0KTsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZpbmZvLT5kZXYtPnBlcnNpc3QtPnBkZXYtPmRldiwKIAkJCQkgICAmaW5mby0+cG9ydF9hdHRyKTsKKwkJZGV2bGlua19wb3J0X3VucmVnaXN0ZXIoJmluZm8tPmRldmxpbmtfcG9ydCk7CiAJCWluZm8tPnBvcnQgPSAtMTsKIAl9CiAKQEAgLTI5ODQsNiArMjk4NSw4IEBACiAJZGV2aWNlX3JlbW92ZV9maWxlKCZpbmZvLT5kZXYtPnBlcnNpc3QtPnBkZXYtPmRldiwgJmluZm8tPnBvcnRfYXR0cik7CiAJZGV2aWNlX3JlbW92ZV9maWxlKCZpbmZvLT5kZXYtPnBlcnNpc3QtPnBkZXYtPmRldiwKIAkJCSAgICZpbmZvLT5wb3J0X210dV9hdHRyKTsKKwlkZXZsaW5rX3BvcnRfdW5yZWdpc3RlcigmaW5mby0+ZGV2bGlua19wb3J0KTsKKwogI2lmZGVmIENPTkZJR19SRlNfQUNDRUwKIAlmcmVlX2lycV9jcHVfcm1hcChpbmZvLT5ybWFwKTsKIAlpbmZvLT5ybWFwID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tbHg0LmgKaW5kZXggYzlkN2ZjNTEuLmU0ODc4ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NC5oCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxuZXQvZGV2bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbHg0L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21seDQvZHJpdmVyLmg+CkBAIC00ODIsNiArNDgzLDcgQEAKIAl1OCBpbml0X3BvcnRfbWFzazsKIAlib29sIGFjdGl2ZTsKIAlib29sIG9sZF92bGFuX2FwaTsKKwlib29sIHZzdF9xaW5xX3N1cHBvcnRlZDsKIAl1OCBmdW5jdGlvbjsKIAlkbWFfYWRkcl90IHZoY3JfZG1hOwogCXUxNiBtdHVbTUxYNF9NQVhfUE9SVFMgKyAxXTsKQEAgLTUwNyw2ICs1MDksNyBAQAogCXU2NCBtYWM7CiAJdTE2IGRlZmF1bHRfdmxhbjsKIAl1OCAgZGVmYXVsdF9xb3M7CisJX19iZTE2IHZsYW5fcHJvdG87CiAJdTMyIHR4X3JhdGU7CiAJYm9vbCBzcG9vZmNoazsKIAl1MzIgbGlua19zdGF0ZTsKQEAgLTYyNyw2ICs2MzAsNyBAQAogCXN0cnVjdCBtdXRleAkJc2xhdmVfY21kX211dGV4OwogCXN0cnVjdCBzZW1hcGhvcmUJcG9sbF9zZW07CiAJc3RydWN0IHNlbWFwaG9yZQlldmVudF9zZW07CisJc3RydWN0IHJ3X3NlbWFwaG9yZQlzd2l0Y2hfc2VtOwogCWludAkJCW1heF9jbWRzOwogCXNwaW5sb2NrX3QJCWNvbnRleHRfbG9jazsKIAlpbnQJCQlmcmVlX2hlYWQ7CkBAIC02NTUsNiArNjU5LDcgQEAKIAl1OCAgICAgICAgICAgICAgICAgICAgICBxb3NfdnBvcnQ7CiAJdTE2CQkJdmxhbl9pZDsKIAl1MTYJCQlvcmlnX3ZsYW5faWQ7CisJX19iZTE2CQkJdmxhbl9wcm90bzsKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tbHg0X2VuLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDRfZW4uaAppbmRleCAyYzI5MTNkLi5hMzUyOGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDRfZW4uaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDRfZW4uaApAQCAtMzQwLDcgKzM0MCw3IEBACiAJdTggIGZjc19kZWw7CiAJdm9pZCAqYnVmOwogCXZvaWQgKnJ4X2luZm87Ci0Jc3RydWN0IGJwZl9wcm9nICp4ZHBfcHJvZzsKKwlzdHJ1Y3QgYnBmX3Byb2cgX19yY3UgKnhkcF9wcm9nOwogCXN0cnVjdCBtbHg0X2VuX3BhZ2VfY2FjaGUgcGFnZV9jYWNoZTsKIAl1bnNpZ25lZCBsb25nIGJ5dGVzOwogCXVuc2lnbmVkIGxvbmcgcGFja2V0czsKQEAgLTQ4MiwyMCArNDgyLDEwIEBACiAJcGZjX2VuYWJsZWRfcngKIH07CiAKLXN0cnVjdCB0Y19jb25maWd1cmF0aW9uIHsKLQllbnVtIGRjYl9wZmNfdHlwZSAgZGNiX3BmYzsKLX07Ci0KIHN0cnVjdCBtbHg0X2VuX2NlZV9jb25maWcgewogCWJvb2wJcGZjX3N0YXRlOwotCXN0cnVjdAl0Y19jb25maWd1cmF0aW9uIHRjX2NvbmZpZ1tNTFg0X0VOX05VTV9VUF07CisJZW51bQlkY2JfcGZjX3R5cGUgZGNiX3BmY1tNTFg0X0VOX05VTV9VUF07CiB9OwotCi1zdHJ1Y3QgbWx4NF9lbl9jZWVfcGFyYW1zIHsKLQl1OCBkY2J4X2NhcDsKLQlzdHJ1Y3QgbWx4NF9lbl9jZWVfY29uZmlnIGRjYl9jZmc7Ci19OwotCiAjZW5kaWYKIAogc3RydWN0IGV0aHRvb2xfZmxvd19pZCB7CkBAIC02MjQsNyArNjE0LDggQEAKIAlzdHJ1Y3QgaWVlZV9ldHMgZXRzOwogCXUxNiBtYXhyYXRlW0lFRUVfODAyMVFBWl9NQVhfVENTXTsKIAllbnVtIGRjYm5sX2NuZGRfc3RhdGVzIGNuZGRfc3RhdGVbSUVFRV84MDIxUUFaX01BWF9UQ1NdOwotCXN0cnVjdCBtbHg0X2VuX2NlZV9wYXJhbXMgY2VlX3BhcmFtczsKKwlzdHJ1Y3QgbWx4NF9lbl9jZWVfY29uZmlnIGNlZV9jb25maWc7CisJdTggZGNieF9jYXA7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfUkZTX0FDQ0VMCiAJc3BpbmxvY2tfdCBmaWx0ZXJzX2xvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3BvcnQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcG9ydC5jCmluZGV4IDNkMjA5NWUuLmM1YjIwNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcG9ydC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcG9ydC5jCkBAIC01Miw3ICs1Miw3IEBACiAKICNkZWZpbmUgTUxYNF9GTEFHX1ZfSUdOT1JFX0ZDU19NQVNLCQkweDIKICNkZWZpbmUgTUxYNF9JR05PUkVfRkNTX01BU0sJCQkweDEKLSNkZWZpbmUgTUxOWDRfVFhfTUFYX05VTUJFUgkJCTgKKyNkZWZpbmUgTUxYNF9UQ19NQVhfTlVNQkVSCQkJOAogCiB2b2lkIG1seDRfaW5pdF9tYWNfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X21hY190YWJsZSAqdGFibGUpCiB7CkBAIC0yMDIyLDcgKzIwMjIsNyBAQAogCXU4IG51bV90YyA9IGRldi0+Y2Fwcy5tYXhfdGNfZXRoOwogCiAJaWYgKCFudW1fdGMpCi0JCW51bV90YyA9IE1MTlg0X1RYX01BWF9OVU1CRVI7CisJCW51bV90YyA9IE1MWDRfVENfTUFYX05VTUJFUjsKIAogCXJldHVybiBudW1fdGM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3Jlc291cmNlX3RyYWNrZXIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcmVzb3VyY2VfdHJhY2tlci5jCmluZGV4IDhiODExMTQuLjg0ZDc4NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcmVzb3VyY2VfdHJhY2tlci5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcmVzb3VyY2VfdHJhY2tlci5jCkBAIC03OTAsMTAgKzc5MCwyMiBAQAogCQkJCU1MWDRfVkxBTl9DVFJMX0VUSF9SWF9CTE9DS19VTlRBR0dFRCB8CiAJCQkJTUxYNF9WTEFOX0NUUkxfRVRIX1JYX0JMT0NLX1RBR0dFRDsKIAkJfSBlbHNlIGlmICgwICE9IHZwX29wZXItPnN0YXRlLmRlZmF1bHRfdmxhbikgewotCQkJcXBjLT5wcmlfcGF0aC52bGFuX2NvbnRyb2wgfD0KLQkJCQlNTFg0X1ZMQU5fQ1RSTF9FVEhfVFhfQkxPQ0tfVEFHR0VEIHwKLQkJCQlNTFg0X1ZMQU5fQ1RSTF9FVEhfUlhfQkxPQ0tfUFJJT19UQUdHRUQgfAotCQkJCU1MWDRfVkxBTl9DVFJMX0VUSF9SWF9CTE9DS19VTlRBR0dFRDsKKwkJCWlmICh2cF9vcGVyLT5zdGF0ZS52bGFuX3Byb3RvID09IGh0b25zKEVUSF9QXzgwMjFBRCkpIHsKKwkJCQkvKiB2c3QgUWluUSBzaG91bGQgYmxvY2sgdW50YWdnZWQgb24gVFgsCisJCQkJICogYnV0IGN2bGFuIGlzIGluIHBheWxvYWQgYW5kIHBodiBpcyBzZXQgc28KKwkJCQkgKiBodyBzZWUgaXQgYXMgdW50YWdnZWQuIEJsb2NrIHRhZ2dlZCBpbnN0ZWFkLgorCQkJCSAqLworCQkJCXFwYy0+cHJpX3BhdGgudmxhbl9jb250cm9sIHw9CisJCQkJCU1MWDRfVkxBTl9DVFJMX0VUSF9UWF9CTE9DS19QUklPX1RBR0dFRCB8CisJCQkJCU1MWDRfVkxBTl9DVFJMX0VUSF9UWF9CTE9DS19UQUdHRUQgfAorCQkJCQlNTFg0X1ZMQU5fQ1RSTF9FVEhfUlhfQkxPQ0tfUFJJT19UQUdHRUQgfAorCQkJCQlNTFg0X1ZMQU5fQ1RSTF9FVEhfUlhfQkxPQ0tfVU5UQUdHRUQ7CisJCQl9IGVsc2UgeyAvKiB2c3QgODAyLjFRICovCisJCQkJcXBjLT5wcmlfcGF0aC52bGFuX2NvbnRyb2wgfD0KKwkJCQkJTUxYNF9WTEFOX0NUUkxfRVRIX1RYX0JMT0NLX1RBR0dFRCB8CisJCQkJCU1MWDRfVkxBTl9DVFJMX0VUSF9SWF9CTE9DS19QUklPX1RBR0dFRCB8CisJCQkJCU1MWDRfVkxBTl9DVFJMX0VUSF9SWF9CTE9DS19VTlRBR0dFRDsKKwkJCX0KIAkJfSBlbHNlIHsgLyogcHJpb3JpdHkgdGFnZ2VkICovCiAJCQlxcGMtPnByaV9wYXRoLnZsYW5fY29udHJvbCB8PQogCQkJCU1MWDRfVkxBTl9DVFJMX0VUSF9UWF9CTE9DS19UQUdHRUQgfApAQCAtODAyLDcgKzgxNCwxMSBAQAogCiAJCXFwYy0+cHJpX3BhdGguZnZsX3J4IHw9IE1MWDRfRlZMX1JYX0ZPUkNFX0VUSF9WTEFOOwogCQlxcGMtPnByaV9wYXRoLnZsYW5faW5kZXggPSB2cF9vcGVyLT52bGFuX2lkeDsKLQkJcXBjLT5wcmlfcGF0aC5mbCB8PSBNTFg0X0ZMX0NWIHwgTUxYNF9GTF9FVEhfSElERV9DUUVfVkxBTjsKKwkJcXBjLT5wcmlfcGF0aC5mbCB8PSBNTFg0X0ZMX0VUSF9ISURFX0NRRV9WTEFOOworCQlpZiAodnBfb3Blci0+c3RhdGUudmxhbl9wcm90byA9PSBodG9ucyhFVEhfUF84MDIxQUQpKQorCQkJcXBjLT5wcmlfcGF0aC5mbCB8PSBNTFg0X0ZMX1NWOworCQllbHNlCisJCQlxcGMtPnByaV9wYXRoLmZsIHw9IE1MWDRfRkxfQ1Y7CiAJCXFwYy0+cHJpX3BhdGguZmV1cCB8PSBNTFg0X0ZFVVBfRk9SQ0VfRVRIX1VQIHwgTUxYNF9GVkxfRk9SQ0VfRVRIX1ZMQU47CiAJCXFwYy0+cHJpX3BhdGguc2NoZWRfcXVldWUgJj0gMHhDNzsKIAkJcXBjLT5wcmlfcGF0aC5zY2hlZF9xdWV1ZSB8PSAodnBfb3Blci0+c3RhdGUuZGVmYXVsdF9xb3MpIDw8IDM7CkBAIC01MjM4LDYgKzUyNTQsNyBAQAogCXU2NCBxcF9wYXRoX21hc2sgPSAoKDFVTEwgPDwgTUxYNF9VUERfUVBfUEFUSF9NQVNLX1ZMQU5fSU5ERVgpIHwKIAkJICAgICAgICgxVUxMIDw8IE1MWDRfVVBEX1FQX1BBVEhfTUFTS19GVkwpIHwKIAkJICAgICAgICgxVUxMIDw8IE1MWDRfVVBEX1FQX1BBVEhfTUFTS19DVikgfAorCQkgICAgICAgKDFVTEwgPDwgTUxYNF9VUERfUVBfUEFUSF9NQVNLX1NWKSB8CiAJCSAgICAgICAoMVVMTCA8PCBNTFg0X1VQRF9RUF9QQVRIX01BU0tfRVRIX0hJREVfQ1FFX1ZMQU4pIHwKIAkJICAgICAgICgxVUxMIDw8IE1MWDRfVVBEX1FQX1BBVEhfTUFTS19GRVVQKSB8CiAJCSAgICAgICAoMVVMTCA8PCBNTFg0X1VQRF9RUF9QQVRIX01BU0tfRlZMX1JYKSB8CkBAIC01MjY2LDcgKzUyODMsMTIgQEAKIAllbHNlIGlmICghd29yay0+dmxhbl9pZCkKIAkJdmxhbl9jb250cm9sID0gTUxYNF9WTEFOX0NUUkxfRVRIX1RYX0JMT0NLX1RBR0dFRCB8CiAJCQlNTFg0X1ZMQU5fQ1RSTF9FVEhfUlhfQkxPQ0tfVEFHR0VEOwotCWVsc2UKKwllbHNlIGlmICh3b3JrLT52bGFuX3Byb3RvID09IGh0b25zKEVUSF9QXzgwMjFBRCkpCisJCXZsYW5fY29udHJvbCA9IE1MWDRfVkxBTl9DVFJMX0VUSF9UWF9CTE9DS19QUklPX1RBR0dFRCB8CisJCQlNTFg0X1ZMQU5fQ1RSTF9FVEhfVFhfQkxPQ0tfVEFHR0VEIHwKKwkJCU1MWDRfVkxBTl9DVFJMX0VUSF9SWF9CTE9DS19QUklPX1RBR0dFRCB8CisJCQlNTFg0X1ZMQU5fQ1RSTF9FVEhfUlhfQkxPQ0tfVU5UQUdHRUQ7CisJZWxzZSAgLyogdnN0IDgwMi4xUSAqLwogCQl2bGFuX2NvbnRyb2wgPSBNTFg0X1ZMQU5fQ1RSTF9FVEhfVFhfQkxPQ0tfVEFHR0VEIHwKIAkJCU1MWDRfVkxBTl9DVFJMX0VUSF9SWF9CTE9DS19QUklPX1RBR0dFRCB8CiAJCQlNTFg0X1ZMQU5fQ1RSTF9FVEhfUlhfQkxPQ0tfVU5UQUdHRUQ7CkBAIC01MzExLDcgKzUzMzMsMTEgQEAKIAkJCQl1cGRfY29udGV4dC0+cXBfY29udGV4dC5wcmlfcGF0aC5mdmxfcnggPQogCQkJCQlxcC0+ZnZsX3J4IHwgTUxYNF9GVkxfUlhfRk9SQ0VfRVRIX1ZMQU47CiAJCQkJdXBkX2NvbnRleHQtPnFwX2NvbnRleHQucHJpX3BhdGguZmwgPQotCQkJCQlxcC0+cHJpX3BhdGhfZmwgfCBNTFg0X0ZMX0NWIHwgTUxYNF9GTF9FVEhfSElERV9DUUVfVkxBTjsKKwkJCQkJcXAtPnByaV9wYXRoX2ZsIHwgTUxYNF9GTF9FVEhfSElERV9DUUVfVkxBTjsKKwkJCQlpZiAod29yay0+dmxhbl9wcm90byA9PSBodG9ucyhFVEhfUF84MDIxQUQpKQorCQkJCQl1cGRfY29udGV4dC0+cXBfY29udGV4dC5wcmlfcGF0aC5mbCB8PSBNTFg0X0ZMX1NWOworCQkJCWVsc2UKKwkJCQkJdXBkX2NvbnRleHQtPnFwX2NvbnRleHQucHJpX3BhdGguZmwgfD0gTUxYNF9GTF9DVjsKIAkJCQl1cGRfY29udGV4dC0+cXBfY29udGV4dC5wcmlfcGF0aC5mZXVwID0KIAkJCQkJcXAtPmZldXAgfCBNTFg0X0ZFVVBfRk9SQ0VfRVRIX1VQIHwgTUxYNF9GVkxfRk9SQ0VfRVRIX1ZMQU47CiAJCQkJdXBkX2NvbnRleHQtPnFwX2NvbnRleHQucHJpX3BhdGguc2NoZWRfcXVldWUgPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9zcnEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvc3JxLmMKaW5kZXggNjcxNDY2Mi4uZjQ0ZDA4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9zcnEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3NycS5jCkBAIC00NSwxNSArNDUsMTIgQEAKIAlzdHJ1Y3QgbWx4NF9zcnFfdGFibGUgKnNycV90YWJsZSA9ICZtbHg0X3ByaXYoZGV2KS0+c3JxX3RhYmxlOwogCXN0cnVjdCBtbHg0X3NycSAqc3JxOwogCi0Jc3Bpbl9sb2NrKCZzcnFfdGFibGUtPmxvY2spOwotCisJcmN1X3JlYWRfbG9jaygpOwogCXNycSA9IHJhZGl4X3RyZWVfbG9va3VwKCZzcnFfdGFibGUtPnRyZWUsIHNycW4gJiAoZGV2LT5jYXBzLm51bV9zcnFzIC0gMSkpOworCXJjdV9yZWFkX3VubG9jaygpOwogCWlmIChzcnEpCiAJCWF0b21pY19pbmMoJnNycS0+cmVmY291bnQpOwotCi0Jc3Bpbl91bmxvY2soJnNycV90YWJsZS0+bG9jayk7Ci0KLQlpZiAoIXNycSkgeworCWVsc2UgewogCQltbHg0X3dhcm4oZGV2LCAiQXN5bmMgZXZlbnQgZm9yIGJvZ3VzIFNSUSAlMDh4XG4iLCBzcnFuKTsKIAkJcmV0dXJuOwogCX0KQEAgLTMwMSwxMiArMjk4LDExIEBACiB7CiAJc3RydWN0IG1seDRfc3JxX3RhYmxlICpzcnFfdGFibGUgPSAmbWx4NF9wcml2KGRldiktPnNycV90YWJsZTsKIAlzdHJ1Y3QgbWx4NF9zcnEgKnNycTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNycV90YWJsZS0+bG9jaywgZmxhZ3MpOworCXJjdV9yZWFkX2xvY2soKTsKIAlzcnEgPSByYWRpeF90cmVlX2xvb2t1cCgmc3JxX3RhYmxlLT50cmVlLAogCQkJCXNycW4gJiAoZGV2LT5jYXBzLm51bV9zcnFzIC0gMSkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNycV90YWJsZS0+bG9jaywgZmxhZ3MpOworCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIHNycTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9NYWtlZmlsZQppbmRleCAwNWNjMWVmLi4wMzQzNzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL01ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogbWx4NV9jb3JlLXkgOj0JbWFpbi5vIGNtZC5vIGRlYnVnZnMubyBmdy5vIGVxLm8gdWFyLm8gcGFnZWFsbG9jLm8gXAogCQloZWFsdGgubyBtY2cubyBjcS5vIHNycS5vIGFsbG9jLm8gcXAubyBwb3J0Lm8gbXIubyBwZC5vIFwKIAkJbWFkLm8gdHJhbnNvYmoubyB2cG9ydC5vIHNyaW92Lm8gZnNfY21kLm8gZnNfY29yZS5vIFwKLQkJZnNfY291bnRlcnMubyBybC5vCisJCWZzX2NvdW50ZXJzLm8gcmwubyBsYWcubyBkZXYubwogCiBtbHg1X2NvcmUtJChDT05GSUdfTUxYNV9DT1JFX0VOKSArPSB3cS5vIGVzd2l0Y2gubyBlc3dpdGNoX29mZmxvYWRzLm8gXAogCQllbl9tYWluLm8gZW5fY29tbW9uLm8gZW5fZnMubyBlbl9ldGh0b29sLm8gZW5fdHgubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvY21kLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvY21kLmMKaW5kZXggZDZlMmExYy4uMWU2MzlmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9jbWQuYwpAQCAtMTQzLDEzICsxNDMsMTQgQEAKIAlyZXR1cm4gY21kLT5jbWRfYnVmICsgKGlkeCA8PCBjbWQtPmxvZ19zdHJpZGUpOwogfQogCi1zdGF0aWMgdTggeG9yOF9idWYodm9pZCAqYnVmLCBpbnQgbGVuKQorc3RhdGljIHU4IHhvcjhfYnVmKHZvaWQgKmJ1Ziwgc2l6ZV90IG9mZnNldCwgaW50IGxlbikKIHsKIAl1OCAqcHRyID0gYnVmOwogCXU4IHN1bSA9IDA7CiAJaW50IGk7CisJaW50IGVuZCA9IGxlbiArIG9mZnNldDsKIAotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwlmb3IgKGkgPSBvZmZzZXQ7IGkgPCBlbmQ7IGkrKykKIAkJc3VtIF49IHB0cltpXTsKIAogCXJldHVybiBzdW07CkBAIC0xNTcsNDEgKzE1OCw0OSBAQAogCiBzdGF0aWMgaW50IHZlcmlmeV9ibG9ja19zaWcoc3RydWN0IG1seDVfY21kX3Byb3RfYmxvY2sgKmJsb2NrKQogewotCWlmICh4b3I4X2J1ZihibG9jay0+cnN2ZDAsIHNpemVvZigqYmxvY2spIC0gc2l6ZW9mKGJsb2NrLT5kYXRhKSAtIDEpICE9IDB4ZmYpCisJc2l6ZV90IHJzdmQwX29mZiA9IG9mZnNldG9mKHN0cnVjdCBtbHg1X2NtZF9wcm90X2Jsb2NrLCByc3ZkMCk7CisJaW50IHhvcl9sZW4gPSBzaXplb2YoKmJsb2NrKSAtIHNpemVvZihibG9jay0+ZGF0YSkgLSAxOworCisJaWYgKHhvcjhfYnVmKGJsb2NrLCByc3ZkMF9vZmYsIHhvcl9sZW4pICE9IDB4ZmYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHhvcjhfYnVmKGJsb2NrLCBzaXplb2YoKmJsb2NrKSkgIT0gMHhmZikKKwlpZiAoeG9yOF9idWYoYmxvY2ssIDAsIHNpemVvZigqYmxvY2spKSAhPSAweGZmKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjYWxjX2Jsb2NrX3NpZyhzdHJ1Y3QgbWx4NV9jbWRfcHJvdF9ibG9jayAqYmxvY2ssIHU4IHRva2VuLAotCQkJICAgaW50IGNzdW0pCitzdGF0aWMgdm9pZCBjYWxjX2Jsb2NrX3NpZyhzdHJ1Y3QgbWx4NV9jbWRfcHJvdF9ibG9jayAqYmxvY2spCiB7Ci0JYmxvY2stPnRva2VuID0gdG9rZW47Ci0JaWYgKGNzdW0pIHsKLQkJYmxvY2stPmN0cmxfc2lnID0gfnhvcjhfYnVmKGJsb2NrLT5yc3ZkMCwgc2l6ZW9mKCpibG9jaykgLQotCQkJCQkgICAgc2l6ZW9mKGJsb2NrLT5kYXRhKSAtIDIpOwotCQlibG9jay0+c2lnID0gfnhvcjhfYnVmKGJsb2NrLCBzaXplb2YoKmJsb2NrKSAtIDEpOwotCX0KKwlpbnQgY3RybF94b3JfbGVuID0gc2l6ZW9mKCpibG9jaykgLSBzaXplb2YoYmxvY2stPmRhdGEpIC0gMjsKKwlzaXplX3QgcnN2ZDBfb2ZmID0gb2Zmc2V0b2Yoc3RydWN0IG1seDVfY21kX3Byb3RfYmxvY2ssIHJzdmQwKTsKKworCWJsb2NrLT5jdHJsX3NpZyA9IH54b3I4X2J1ZihibG9jaywgcnN2ZDBfb2ZmLCBjdHJsX3hvcl9sZW4pOworCWJsb2NrLT5zaWcgPSB+eG9yOF9idWYoYmxvY2ssIDAsIHNpemVvZigqYmxvY2spIC0gMSk7CiB9CiAKLXN0YXRpYyB2b2lkIGNhbGNfY2hhaW5fc2lnKHN0cnVjdCBtbHg1X2NtZF9tc2cgKm1zZywgdTggdG9rZW4sIGludCBjc3VtKQorc3RhdGljIHZvaWQgY2FsY19jaGFpbl9zaWcoc3RydWN0IG1seDVfY21kX21zZyAqbXNnKQogewogCXN0cnVjdCBtbHg1X2NtZF9tYWlsYm94ICpuZXh0ID0gbXNnLT5uZXh0OworCWludCBzaXplID0gbXNnLT5sZW47CisJaW50IGJsZW4gPSBzaXplIC0gbWluX3QoaW50LCBzaXplb2YobXNnLT5maXJzdC5kYXRhKSwgc2l6ZSk7CisJaW50IG4gPSAoYmxlbiArIE1MWDVfQ01EX0RBVEFfQkxPQ0tfU0laRSAtIDEpCisJCS8gTUxYNV9DTURfREFUQV9CTE9DS19TSVpFOworCWludCBpID0gMDsKIAotCXdoaWxlIChuZXh0KSB7Ci0JCWNhbGNfYmxvY2tfc2lnKG5leHQtPmJ1ZiwgdG9rZW4sIGNzdW0pOworCWZvciAoaSA9IDA7IGkgPCBuICYmIG5leHQ7IGkrKykgIHsKKwkJY2FsY19ibG9ja19zaWcobmV4dC0+YnVmKTsKIAkJbmV4dCA9IG5leHQtPm5leHQ7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBzZXRfc2lnbmF0dXJlKHN0cnVjdCBtbHg1X2NtZF93b3JrX2VudCAqZW50LCBpbnQgY3N1bSkKIHsKLQllbnQtPmxheS0+c2lnID0gfnhvcjhfYnVmKGVudC0+bGF5LCBzaXplb2YoKmVudC0+bGF5KSk7Ci0JY2FsY19jaGFpbl9zaWcoZW50LT5pbiwgZW50LT50b2tlbiwgY3N1bSk7Ci0JY2FsY19jaGFpbl9zaWcoZW50LT5vdXQsIGVudC0+dG9rZW4sIGNzdW0pOworCWVudC0+bGF5LT5zaWcgPSB+eG9yOF9idWYoZW50LT5sYXksIDAsICBzaXplb2YoKmVudC0+bGF5KSk7CisJaWYgKGNzdW0pIHsKKwkJY2FsY19jaGFpbl9zaWcoZW50LT5pbik7CisJCWNhbGNfY2hhaW5fc2lnKGVudC0+b3V0KTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHBvbGxfdGltZW91dChzdHJ1Y3QgbWx4NV9jbWRfd29ya19lbnQgKmVudCkKQEAgLTIyMiwxMiArMjMxLDE3IEBACiAJc3RydWN0IG1seDVfY21kX21haWxib3ggKm5leHQgPSBlbnQtPm91dC0+bmV4dDsKIAlpbnQgZXJyOwogCXU4IHNpZzsKKwlpbnQgc2l6ZSA9IGVudC0+b3V0LT5sZW47CisJaW50IGJsZW4gPSBzaXplIC0gbWluX3QoaW50LCBzaXplb2YoZW50LT5vdXQtPmZpcnN0LmRhdGEpLCBzaXplKTsKKwlpbnQgbiA9IChibGVuICsgTUxYNV9DTURfREFUQV9CTE9DS19TSVpFIC0gMSkKKwkJLyBNTFg1X0NNRF9EQVRBX0JMT0NLX1NJWkU7CisJaW50IGkgPSAwOwogCi0Jc2lnID0geG9yOF9idWYoZW50LT5sYXksIHNpemVvZigqZW50LT5sYXkpKTsKKwlzaWcgPSB4b3I4X2J1ZihlbnQtPmxheSwgMCwgc2l6ZW9mKCplbnQtPmxheSkpOwogCWlmIChzaWcgIT0gMHhmZikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl3aGlsZSAobmV4dCkgeworCWZvciAoaSA9IDA7IGkgPCBuICYmIG5leHQ7IGkrKykgewogCQllcnIgPSB2ZXJpZnlfYmxvY2tfc2lnKG5leHQtPmJ1Zik7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwpAQCAtMjgwLDExICsyOTQsMTMgQEAKIAljYXNlIE1MWDVfQ01EX09QX0RFQUxMT0NfUV9DT1VOVEVSOgogCWNhc2UgTUxYNV9DTURfT1BfREVBTExPQ19QRDoKIAljYXNlIE1MWDVfQ01EX09QX0RFQUxMT0NfVUFSOgotCWNhc2UgTUxYNV9DTURfT1BfREVUVEFDSF9GUk9NX01DRzoKKwljYXNlIE1MWDVfQ01EX09QX0RFVEFDSF9GUk9NX01DRzoKIAljYXNlIE1MWDVfQ01EX09QX0RFQUxMT0NfWFJDRDoKIAljYXNlIE1MWDVfQ01EX09QX0RFQUxMT0NfVFJBTlNQT1JUX0RPTUFJTjoKIAljYXNlIE1MWDVfQ01EX09QX0RFTEVURV9WWExBTl9VRFBfRFBPUlQ6CiAJY2FzZSBNTFg1X0NNRF9PUF9ERUxFVEVfTDJfVEFCTEVfRU5UUlk6CisJY2FzZSBNTFg1X0NNRF9PUF9ERVNUUk9ZX0xBRzoKKwljYXNlIE1MWDVfQ01EX09QX0RFU1RST1lfVlBPUlRfTEFHOgogCWNhc2UgTUxYNV9DTURfT1BfREVTVFJPWV9USVI6CiAJY2FzZSBNTFg1X0NNRF9PUF9ERVNUUk9ZX1NROgogCWNhc2UgTUxYNV9DTURfT1BfREVTVFJPWV9SUToKQEAgLTMwMSw2ICszMTcsNyBAQAogCWNhc2UgTUxYNV9DTURfT1BfTU9ESUZZX0ZMT1dfVEFCTEU6CiAJY2FzZSBNTFg1X0NNRF9PUF9TRVRfRkxPV19UQUJMRV9FTlRSWToKIAljYXNlIE1MWDVfQ01EX09QX1NFVF9GTE9XX1RBQkxFX1JPT1Q6CisJY2FzZSBNTFg1X0NNRF9PUF9ERUFMTE9DX0VOQ0FQX0hFQURFUjoKIAkJcmV0dXJuIE1MWDVfQ01EX1NUQVRfT0s7CiAKIAljYXNlIE1MWDVfQ01EX09QX1FVRVJZX0hDQV9DQVA6CkBAIC0zNzUsNiArMzkyLDEwIEBACiAJY2FzZSBNTFg1X0NNRF9PUF9BRERfVlhMQU5fVURQX0RQT1JUOgogCWNhc2UgTUxYNV9DTURfT1BfU0VUX0wyX1RBQkxFX0VOVFJZOgogCWNhc2UgTUxYNV9DTURfT1BfUVVFUllfTDJfVEFCTEVfRU5UUlk6CisJY2FzZSBNTFg1X0NNRF9PUF9DUkVBVEVfTEFHOgorCWNhc2UgTUxYNV9DTURfT1BfTU9ESUZZX0xBRzoKKwljYXNlIE1MWDVfQ01EX09QX1FVRVJZX0xBRzoKKwljYXNlIE1MWDVfQ01EX09QX0NSRUFURV9WUE9SVF9MQUc6CiAJY2FzZSBNTFg1X0NNRF9PUF9DUkVBVEVfVElSOgogCWNhc2UgTUxYNV9DTURfT1BfTU9ESUZZX1RJUjoKIAljYXNlIE1MWDVfQ01EX09QX1FVRVJZX1RJUjoKQEAgLTQwMiw2ICs0MjMsNyBAQAogCWNhc2UgTUxYNV9DTURfT1BfUVVFUllfRkxPV19UQUJMRV9FTlRSWToKIAljYXNlIE1MWDVfQ01EX09QX0FMTE9DX0ZMT1dfQ09VTlRFUjoKIAljYXNlIE1MWDVfQ01EX09QX1FVRVJZX0ZMT1dfQ09VTlRFUjoKKwljYXNlIE1MWDVfQ01EX09QX0FMTE9DX0VOQ0FQX0hFQURFUjoKIAkJKnN0YXR1cyA9IE1MWDVfRFJJVkVSX1NUQVRVU19BQk9SVEVEOwogCQkqc3luZCA9IE1MWDVfRFJJVkVSX1NZTkQ7CiAJCXJldHVybiAtRUlPOwpAQCAtNDkwLDcgKzUxMiw3IEBACiAJTUxYNV9DT01NQU5EX1NUUl9DQVNFKENPTkZJR19JTlRfTU9ERVJBVElPTik7CiAJTUxYNV9DT01NQU5EX1NUUl9DQVNFKEFDQ0VTU19SRUcpOwogCU1MWDVfQ09NTUFORF9TVFJfQ0FTRShBVFRBQ0hfVE9fTUNHKTsKLQlNTFg1X0NPTU1BTkRfU1RSX0NBU0UoREVUVEFDSF9GUk9NX01DRyk7CisJTUxYNV9DT01NQU5EX1NUUl9DQVNFKERFVEFDSF9GUk9NX01DRyk7CiAJTUxYNV9DT01NQU5EX1NUUl9DQVNFKEdFVF9EUk9QUEVEX1BBQ0tFVF9MT0cpOwogCU1MWDVfQ09NTUFORF9TVFJfQ0FTRShNQURfSUZDKTsKIAlNTFg1X0NPTU1BTkRfU1RSX0NBU0UoUVVFUllfTUFEX0RFTVVYKTsKQEAgLTUxMiw2ICs1MzQsMTIgQEAKIAlNTFg1X0NPTU1BTkRfU1RSX0NBU0UoREVMRVRFX0wyX1RBQkxFX0VOVFJZKTsKIAlNTFg1X0NPTU1BTkRfU1RSX0NBU0UoU0VUX1dPTF9ST0wpOwogCU1MWDVfQ09NTUFORF9TVFJfQ0FTRShRVUVSWV9XT0xfUk9MKTsKKwlNTFg1X0NPTU1BTkRfU1RSX0NBU0UoQ1JFQVRFX0xBRyk7CisJTUxYNV9DT01NQU5EX1NUUl9DQVNFKE1PRElGWV9MQUcpOworCU1MWDVfQ09NTUFORF9TVFJfQ0FTRShRVUVSWV9MQUcpOworCU1MWDVfQ09NTUFORF9TVFJfQ0FTRShERVNUUk9ZX0xBRyk7CisJTUxYNV9DT01NQU5EX1NUUl9DQVNFKENSRUFURV9WUE9SVF9MQUcpOworCU1MWDVfQ09NTUFORF9TVFJfQ0FTRShERVNUUk9ZX1ZQT1JUX0xBRyk7CiAJTUxYNV9DT01NQU5EX1NUUl9DQVNFKENSRUFURV9USVIpOwogCU1MWDVfQ09NTUFORF9TVFJfQ0FTRShNT0RJRllfVElSKTsKIAlNTFg1X0NPTU1BTkRfU1RSX0NBU0UoREVTVFJPWV9USVIpOwpAQCAtNTUwLDE1ICs1NzgsMTMwIEBACiAJTUxYNV9DT01NQU5EX1NUUl9DQVNFKERFQUxMT0NfRkxPV19DT1VOVEVSKTsKIAlNTFg1X0NPTU1BTkRfU1RSX0NBU0UoUVVFUllfRkxPV19DT1VOVEVSKTsKIAlNTFg1X0NPTU1BTkRfU1RSX0NBU0UoTU9ESUZZX0ZMT1dfVEFCTEUpOworCU1MWDVfQ09NTUFORF9TVFJfQ0FTRShBTExPQ19FTkNBUF9IRUFERVIpOworCU1MWDVfQ09NTUFORF9TVFJfQ0FTRShERUFMTE9DX0VOQ0FQX0hFQURFUik7CiAJZGVmYXVsdDogcmV0dXJuICJ1bmtub3duIGNvbW1hbmQgb3Bjb2RlIjsKIAl9CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpjbWRfc3RhdHVzX3N0cih1OCBzdGF0dXMpCit7CisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIE1MWDVfQ01EX1NUQVRfT0s6CisJCXJldHVybiAiT0siOworCWNhc2UgTUxYNV9DTURfU1RBVF9JTlRfRVJSOgorCQlyZXR1cm4gImludGVybmFsIGVycm9yIjsKKwljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX09QX0VSUjoKKwkJcmV0dXJuICJiYWQgb3BlcmF0aW9uIjsKKwljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1BBUkFNX0VSUjoKKwkJcmV0dXJuICJiYWQgcGFyYW1ldGVyIjsKKwljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1NZU19TVEFURV9FUlI6CisJCXJldHVybiAiYmFkIHN5c3RlbSBzdGF0ZSI7CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9SRVNfRVJSOgorCQlyZXR1cm4gImJhZCByZXNvdXJjZSI7CisJY2FzZSBNTFg1X0NNRF9TVEFUX1JFU19CVVNZOgorCQlyZXR1cm4gInJlc291cmNlIGJ1c3kiOworCWNhc2UgTUxYNV9DTURfU1RBVF9MSU1fRVJSOgorCQlyZXR1cm4gImxpbWl0cyBleGNlZWRlZCI7CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9SRVNfU1RBVEVfRVJSOgorCQlyZXR1cm4gImJhZCByZXNvdXJjZSBzdGF0ZSI7CisJY2FzZSBNTFg1X0NNRF9TVEFUX0lYX0VSUjoKKwkJcmV0dXJuICJiYWQgaW5kZXgiOworCWNhc2UgTUxYNV9DTURfU1RBVF9OT19SRVNfRVJSOgorCQlyZXR1cm4gIm5vIHJlc291cmNlcyI7CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9JTlBfTEVOX0VSUjoKKwkJcmV0dXJuICJiYWQgaW5wdXQgbGVuZ3RoIjsKKwljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX09VVFBfTEVOX0VSUjoKKwkJcmV0dXJuICJiYWQgb3V0cHV0IGxlbmd0aCI7CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9RUF9TVEFURV9FUlI6CisJCXJldHVybiAiYmFkIFFQIHN0YXRlIjsKKwljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1BLVF9FUlI6CisJCXJldHVybiAiYmFkIHBhY2tldCAoZGlzY2FyZGVkKSI7CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9TSVpFX09VVFNfQ1FFU19FUlI6CisJCXJldHVybiAiYmFkIHNpemUgdG9vIG1hbnkgb3V0c3RhbmRpbmcgQ1FFcyI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIHN0YXR1cyI7CisJfQorfQorCitzdGF0aWMgaW50IGNtZF9zdGF0dXNfdG9fZXJyKHU4IHN0YXR1cykKK3sKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgTUxYNV9DTURfU1RBVF9PSzoJCQkJcmV0dXJuIDA7CisJY2FzZSBNTFg1X0NNRF9TVEFUX0lOVF9FUlI6CQkJcmV0dXJuIC1FSU87CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9PUF9FUlI6CQkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9QQVJBTV9FUlI6CQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1NZU19TVEFURV9FUlI6CQlyZXR1cm4gLUVJTzsKKwljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1JFU19FUlI6CQkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBNTFg1X0NNRF9TVEFUX1JFU19CVVNZOgkJCXJldHVybiAtRUJVU1k7CisJY2FzZSBNTFg1X0NNRF9TVEFUX0xJTV9FUlI6CQkJcmV0dXJuIC1FTk9NRU07CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9SRVNfU1RBVEVfRVJSOgkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBNTFg1X0NNRF9TVEFUX0lYX0VSUjoJCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIE1MWDVfQ01EX1NUQVRfTk9fUkVTX0VSUjoJCQlyZXR1cm4gLUVBR0FJTjsKKwljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX0lOUF9MRU5fRVJSOgkJcmV0dXJuIC1FSU87CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9PVVRQX0xFTl9FUlI6CQlyZXR1cm4gLUVJTzsKKwljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1FQX1NUQVRFX0VSUjoJCXJldHVybiAtRUlOVkFMOworCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfUEtUX0VSUjoJCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1NJWkVfT1VUU19DUUVTX0VSUjoJcmV0dXJuIC1FSU5WQUw7CisJZGVmYXVsdDoJCQkJCXJldHVybiAtRUlPOworCX0KK30KKworc3RydWN0IG1seDVfaWZjX21ib3hfb3V0X2JpdHMgeworCXU4ICAgICAgICAgc3RhdHVzWzB4OF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF84WzB4MThdOworCisJdTggICAgICAgICBzeW5kcm9tZVsweDIwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHg0MF07Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfbWJveF9pbl9iaXRzIHsKKwl1OCAgICAgICAgIG9wY29kZVsweDEwXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwWzB4MTBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF8yMFsweDEwXTsKKwl1OCAgICAgICAgIG9wX21vZFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHg0MF07Cit9OworCit2b2lkIG1seDVfY21kX21ib3hfc3RhdHVzKHZvaWQgKm91dCwgdTggKnN0YXR1cywgdTMyICpzeW5kcm9tZSkKK3sKKwkqc3RhdHVzID0gTUxYNV9HRVQobWJveF9vdXQsIG91dCwgc3RhdHVzKTsKKwkqc3luZHJvbWUgPSBNTFg1X0dFVChtYm94X291dCwgb3V0LCBzeW5kcm9tZSk7Cit9CisKK3N0YXRpYyBpbnQgbWx4NV9jbWRfY2hlY2soc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdm9pZCAqaW4sIHZvaWQgKm91dCkKK3sKKwl1MzIgc3luZHJvbWU7CisJdTggIHN0YXR1czsKKwl1MTYgb3Bjb2RlOworCXUxNiBvcF9tb2Q7CisKKwltbHg1X2NtZF9tYm94X3N0YXR1cyhvdXQsICZzdGF0dXMsICZzeW5kcm9tZSk7CisJaWYgKCFzdGF0dXMpCisJCXJldHVybiAwOworCisJb3Bjb2RlID0gTUxYNV9HRVQobWJveF9pbiwgaW4sIG9wY29kZSk7CisJb3BfbW9kID0gTUxYNV9HRVQobWJveF9pbiwgaW4sIG9wX21vZCk7CisKKwltbHg1X2NvcmVfZXJyKGRldiwKKwkJICAgICAgIiVzKDB4JXgpIG9wX21vZCgweCV4KSBmYWlsZWQsIHN0YXR1cyAlcygweCV4KSwgc3luZHJvbWUgKDB4JXgpXG4iLAorCQkgICAgICBtbHg1X2NvbW1hbmRfc3RyKG9wY29kZSksCisJCSAgICAgIG9wY29kZSwgb3BfbW9kLAorCQkgICAgICBjbWRfc3RhdHVzX3N0cihzdGF0dXMpLAorCQkgICAgICBzdGF0dXMsCisJCSAgICAgIHN5bmRyb21lKTsKKworCXJldHVybiBjbWRfc3RhdHVzX3RvX2VycihzdGF0dXMpOworfQorCiBzdGF0aWMgdm9pZCBkdW1wX2NvbW1hbmQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKIAkJCSBzdHJ1Y3QgbWx4NV9jbWRfd29ya19lbnQgKmVudCwgaW50IGlucHV0KQogewotCXUxNiBvcCA9IGJlMTZfdG9fY3B1KCgoc3RydWN0IG1seDVfaW5ib3hfaGRyICopKGVudC0+bGF5LT5pbikpLT5vcGNvZGUpOwogCXN0cnVjdCBtbHg1X2NtZF9tc2cgKm1zZyA9IGlucHV0ID8gZW50LT5pbiA6IGVudC0+b3V0OworCXUxNiBvcCA9IE1MWDVfR0VUKG1ib3hfaW4sIGVudC0+bGF5LT5pbiwgb3Bjb2RlKTsKIAlzdHJ1Y3QgbWx4NV9jbWRfbWFpbGJveCAqbmV4dCA9IG1zZy0+bmV4dDsKIAlpbnQgZGF0YV9vbmx5OwogCXUzMiBvZmZzZXQgPSAwOwpAQCAtNjA4LDkgKzc1MSw3IEBACiAKIHN0YXRpYyB1MTYgbXNnX3RvX29wY29kZShzdHJ1Y3QgbWx4NV9jbWRfbXNnICppbikKIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIgKmhkciA9IChzdHJ1Y3QgbWx4NV9pbmJveF9oZHIgKikoaW4tPmZpcnN0LmRhdGEpOwotCi0JcmV0dXJuIGJlMTZfdG9fY3B1KGhkci0+b3Bjb2RlKTsKKwlyZXR1cm4gTUxYNV9HRVQobWJveF9pbiwgaW4tPmZpcnN0LmRhdGEsIG9wY29kZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNiX3RpbWVvdXRfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC02NTYsNyArNzk3LDYgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT5hbGxvY19sb2NrLCBmbGFncyk7CiAJfQogCi0JZW50LT50b2tlbiA9IGFsbG9jX3Rva2VuKGNtZCk7CiAJY21kLT5lbnRfYXJyW2VudC0+aWR4XSA9IGVudDsKIAlsYXkgPSBnZXRfaW5zdChjbWQsIGVudC0+aWR4KTsKIAllbnQtPmxheSA9IGxheTsKQEAgLTc0OSwxNiArODg5LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgX19iZTMyICpnZXRfc3luZF9wdHIoc3RydWN0IG1seDVfb3V0Ym94X2hkciAqb3V0KQotewotCXJldHVybiAmb3V0LT5zeW5kcm9tZTsKLX0KLQotc3RhdGljIHU4ICpnZXRfc3RhdHVzX3B0cihzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyICpvdXQpCi17Ci0JcmV0dXJuICZvdXQtPnN0YXR1czsKLX0KLQogLyogIE5vdGVzOgogICogICAgMS4gQ2FsbGJhY2sgZnVuY3Rpb25zIG1heSBub3Qgc2xlZXAKICAqICAgIDIuIHBhZ2UgcXVldWUgY29tbWFuZHMgZG8gbm90IHN1cHBvcnQgYXN5bmNocm91cyBjb21wbGV0aW9uCkBAIC03NjYsNyArODk2LDggQEAKIHN0YXRpYyBpbnQgbWx4NV9jbWRfaW52b2tlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2NtZF9tc2cgKmluLAogCQkJICAgc3RydWN0IG1seDVfY21kX21zZyAqb3V0LCB2b2lkICp1b3V0LCBpbnQgdW91dF9zaXplLAogCQkJICAgbWx4NV9jbWRfY2JrX3QgY2FsbGJhY2ssCi0JCQkgICB2b2lkICpjb250ZXh0LCBpbnQgcGFnZV9xdWV1ZSwgdTggKnN0YXR1cykKKwkJCSAgIHZvaWQgKmNvbnRleHQsIGludCBwYWdlX3F1ZXVlLCB1OCAqc3RhdHVzLAorCQkJICAgdTggdG9rZW4pCiB7CiAJc3RydWN0IG1seDVfY21kICpjbWQgPSAmZGV2LT5jbWQ7CiAJc3RydWN0IG1seDVfY21kX3dvcmtfZW50ICplbnQ7CkBAIC03ODMsNiArOTE0LDggQEAKIAlpZiAoSVNfRVJSKGVudCkpCiAJCXJldHVybiBQVFJfRVJSKGVudCk7CiAKKwllbnQtPnRva2VuID0gdG9rZW47CisKIAlpZiAoIWNhbGxiYWNrKQogCQlpbml0X2NvbXBsZXRpb24oJmVudC0+ZG9uZSk7CiAKQEAgLTgwNCw3ICs5MzcsNyBAQAogCQlnb3RvIG91dF9mcmVlOwogCiAJZHMgPSBlbnQtPnRzMiAtIGVudC0+dHMxOwotCW9wID0gYmUxNl90b19jcHUoKChzdHJ1Y3QgbWx4NV9pbmJveF9oZHIgKilpbi0+Zmlyc3QuZGF0YSktPm9wY29kZSk7CisJb3AgPSBNTFg1X0dFVChtYm94X2luLCBpbi0+Zmlyc3QuZGF0YSwgb3Bjb2RlKTsKIAlpZiAob3AgPCBBUlJBWV9TSVpFKGNtZC0+c3RhdHMpKSB7CiAJCXN0YXRzID0gJmNtZC0+c3RhdHNbb3BdOwogCQlzcGluX2xvY2tfaXJxKCZzdGF0cy0+bG9jayk7CkBAIC04NTQsNyArOTg3LDggQEAKIAkud3JpdGUJPSBkYmdfd3JpdGUsCiB9OwogCi1zdGF0aWMgaW50IG1seDVfY29weV90b19tc2coc3RydWN0IG1seDVfY21kX21zZyAqdG8sIHZvaWQgKmZyb20sIGludCBzaXplKQorc3RhdGljIGludCBtbHg1X2NvcHlfdG9fbXNnKHN0cnVjdCBtbHg1X2NtZF9tc2cgKnRvLCB2b2lkICpmcm9tLCBpbnQgc2l6ZSwKKwkJCSAgICB1OCB0b2tlbikKIHsKIAlzdHJ1Y3QgbWx4NV9jbWRfcHJvdF9ibG9jayAqYmxvY2s7CiAJc3RydWN0IG1seDVfY21kX21haWxib3ggKm5leHQ7CkBAIC04ODAsNiArMTAxNCw3IEBACiAJCW1lbWNweShibG9jay0+ZGF0YSwgZnJvbSwgY29weSk7CiAJCWZyb20gKz0gY29weTsKIAkJc2l6ZSAtPSBjb3B5OworCQlibG9jay0+dG9rZW4gPSB0b2tlbjsKIAkJbmV4dCA9IG5leHQtPm5leHQ7CiAJfQogCkBAIC05NDksNyArMTA4NCw4IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWx4NV9jbWRfbXNnICptbHg1X2FsbG9jX2NtZF9tc2coc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKLQkJCQkJICAgICAgIGdmcF90IGZsYWdzLCBpbnQgc2l6ZSkKKwkJCQkJICAgICAgIGdmcF90IGZsYWdzLCBpbnQgc2l6ZSwKKwkJCQkJICAgICAgIHU4IHRva2VuKQogewogCXN0cnVjdCBtbHg1X2NtZF9tYWlsYm94ICp0bXAsICpoZWFkID0gTlVMTDsKIAlzdHJ1Y3QgbWx4NV9jbWRfcHJvdF9ibG9jayAqYmxvY2s7CkBAIC05NzgsNiArMTExNCw3IEBACiAJCXRtcC0+bmV4dCA9IGhlYWQ7CiAJCWJsb2NrLT5uZXh0ID0gY3B1X3RvX2JlNjQodG1wLT5uZXh0ID8gdG1wLT5uZXh0LT5kbWEgOiAwKTsKIAkJYmxvY2stPmJsb2NrX251bSA9IGNwdV90b19iZTMyKG4gLSBpIC0gMSk7CisJCWJsb2NrLT50b2tlbiA9IHRva2VuOwogCQloZWFkID0gdG1wOwogCX0KIAltc2ctPm5leHQgPSBoZWFkOwpAQCAtMTAxNSw3ICsxMTUyLDYgQEAKIAlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBtbHg1X2NtZF9kZWJ1ZyAqZGJnID0gJmRldi0+Y21kLmRiZzsKIAl2b2lkICpwdHI7Ci0JaW50IGVycjsKIAogCWlmICgqcG9zICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTAyMywyNSArMTE1OSwxNSBAQAogCWtmcmVlKGRiZy0+aW5fbXNnKTsKIAlkYmctPmluX21zZyA9IE5VTEw7CiAJZGJnLT5pbmxlbiA9IDA7Ci0KLQlwdHIgPSBremFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIXB0cikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIocHRyLCBidWYsIGNvdW50KSkgewotCQllcnIgPSAtRUZBVUxUOwotCQlnb3RvIG91dDsKLQl9CisJcHRyID0gbWVtZHVwX3VzZXIoYnVmLCBjb3VudCk7CisJaWYgKElTX0VSUihwdHIpKQorCQlyZXR1cm4gUFRSX0VSUihwdHIpOwogCWRiZy0+aW5fbXNnID0gcHRyOwogCWRiZy0+aW5sZW4gPSBjb3VudDsKIAogCSpwb3MgPSBjb3VudDsKIAogCXJldHVybiBjb3VudDsKLQotb3V0OgotCWtmcmVlKHB0cik7Ci0JcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHNzaXplX3QgZGF0YV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCkBAIC0xMzAxLDExICsxNDI3LDE2IEBACiAJCQkJY2FsbGJhY2sgPSBlbnQtPmNhbGxiYWNrOwogCQkJCWNvbnRleHQgPSBlbnQtPmNvbnRleHQ7CiAJCQkJZXJyID0gZW50LT5yZXQ7Ci0JCQkJaWYgKCFlcnIpCisJCQkJaWYgKCFlcnIpIHsKIAkJCQkJZXJyID0gbWx4NV9jb3B5X2Zyb21fbXNnKGVudC0+dW91dCwKIAkJCQkJCQkJIGVudC0+b3V0LAogCQkJCQkJCQkgZW50LT51b3V0X3NpemUpOwogCisJCQkJCWVyciA9IGVyciA/IGVyciA6IG1seDVfY21kX2NoZWNrKGRldiwKKwkJCQkJCQkJCWVudC0+aW4tPmZpcnN0LmRhdGEsCisJCQkJCQkJCQllbnQtPnVvdXQpOworCQkJCX0KKwogCQkJCW1seDVfZnJlZV9jbWRfbXNnKGRldiwgZW50LT5vdXQpOwogCQkJCWZyZWVfbXNnKGRldiwgZW50LT5pbik7CiAKQEAgLTEzNTIsMTkgKzE0ODMsMTQgQEAKIAl9CiAKIAlpZiAoSVNfRVJSKG1zZykpCi0JCW1zZyA9IG1seDVfYWxsb2NfY21kX21zZyhkZXYsIGdmcCwgaW5fc2l6ZSk7CisJCW1zZyA9IG1seDVfYWxsb2NfY21kX21zZyhkZXYsIGdmcCwgaW5fc2l6ZSwgMCk7CiAKIAlyZXR1cm4gbXNnOwogfQogCi1zdGF0aWMgdTE2IG9wY29kZV9mcm9tX2luKHN0cnVjdCBtbHg1X2luYm94X2hkciAqaW4pCitzdGF0aWMgaW50IGlzX21hbmFnZV9wYWdlcyh2b2lkICppbikKIHsKLQlyZXR1cm4gYmUxNl90b19jcHUoaW4tPm9wY29kZSk7Ci19Ci0KLXN0YXRpYyBpbnQgaXNfbWFuYWdlX3BhZ2VzKHN0cnVjdCBtbHg1X2luYm94X2hkciAqaW4pCi17Ci0JcmV0dXJuIGJlMTZfdG9fY3B1KGluLT5vcGNvZGUpID09IE1MWDVfQ01EX09QX01BTkFHRV9QQUdFUzsKKwlyZXR1cm4gTUxYNV9HRVQobWJveF9pbiwgaW4sIG9wY29kZSkgPT0gTUxYNV9DTURfT1BfTUFOQUdFX1BBR0VTOwogfQogCiBzdGF0aWMgaW50IGNtZF9leGVjKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHZvaWQgKmluLCBpbnQgaW5fc2l6ZSwgdm9pZCAqb3V0LApAQCAtMTM3NywxMiArMTUwMywxNSBAQAogCWludCBlcnI7CiAJdTggc3RhdHVzID0gMDsKIAl1MzIgZHJ2X3N5bmQ7CisJdTggdG9rZW47CiAKIAlpZiAocGNpX2NoYW5uZWxfb2ZmbGluZShkZXYtPnBkZXYpIHx8CiAJICAgIGRldi0+c3RhdGUgPT0gTUxYNV9ERVZJQ0VfU1RBVEVfSU5URVJOQUxfRVJST1IpIHsKLQkJZXJyID0gbWx4NV9pbnRlcm5hbF9lcnJfcmV0X3ZhbHVlKGRldiwgb3Bjb2RlX2Zyb21faW4oaW4pLCAmZHJ2X3N5bmQsICZzdGF0dXMpOwotCQkqZ2V0X3N5bmRfcHRyKG91dCkgPSBjcHVfdG9fYmUzMihkcnZfc3luZCk7Ci0JCSpnZXRfc3RhdHVzX3B0cihvdXQpID0gc3RhdHVzOworCQl1MTYgb3Bjb2RlID0gTUxYNV9HRVQobWJveF9pbiwgaW4sIG9wY29kZSk7CisKKwkJZXJyID0gbWx4NV9pbnRlcm5hbF9lcnJfcmV0X3ZhbHVlKGRldiwgb3Bjb2RlLCAmZHJ2X3N5bmQsICZzdGF0dXMpOworCQlNTFg1X1NFVChtYm94X291dCwgb3V0LCBzdGF0dXMsIHN0YXR1cyk7CisJCU1MWDVfU0VUKG1ib3hfb3V0LCBvdXQsIHN5bmRyb21lLCBkcnZfc3luZCk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xMzk1LDIwICsxNTI0LDIyIEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0JZXJyID0gbWx4NV9jb3B5X3RvX21zZyhpbmIsIGluLCBpbl9zaXplKTsKKwl0b2tlbiA9IGFsbG9jX3Rva2VuKCZkZXYtPmNtZCk7CisKKwllcnIgPSBtbHg1X2NvcHlfdG9fbXNnKGluYiwgaW4sIGluX3NpemUsIHRva2VuKTsKIAlpZiAoZXJyKSB7CiAJCW1seDVfY29yZV93YXJuKGRldiwgImVyciAlZFxuIiwgZXJyKTsKIAkJZ290byBvdXRfaW47CiAJfQogCi0Jb3V0YiA9IG1seDVfYWxsb2NfY21kX21zZyhkZXYsIGdmcCwgb3V0X3NpemUpOworCW91dGIgPSBtbHg1X2FsbG9jX2NtZF9tc2coZGV2LCBnZnAsIG91dF9zaXplLCB0b2tlbik7CiAJaWYgKElTX0VSUihvdXRiKSkgewogCQllcnIgPSBQVFJfRVJSKG91dGIpOwogCQlnb3RvIG91dF9pbjsKIAl9CiAKIAllcnIgPSBtbHg1X2NtZF9pbnZva2UoZGV2LCBpbmIsIG91dGIsIG91dCwgb3V0X3NpemUsIGNhbGxiYWNrLCBjb250ZXh0LAotCQkJICAgICAgcGFnZXNfcXVldWUsICZzdGF0dXMpOworCQkJICAgICAgcGFnZXNfcXVldWUsICZzdGF0dXMsIHRva2VuKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9vdXQ7CiAKQEAgLTE0MzQsNyArMTU2NSwxMCBAQAogaW50IG1seDVfY21kX2V4ZWMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdm9pZCAqaW4sIGludCBpbl9zaXplLCB2b2lkICpvdXQsCiAJCSAgaW50IG91dF9zaXplKQogewotCXJldHVybiBjbWRfZXhlYyhkZXYsIGluLCBpbl9zaXplLCBvdXQsIG91dF9zaXplLCBOVUxMLCBOVUxMKTsKKwlpbnQgZXJyOworCisJZXJyID0gY21kX2V4ZWMoZGV2LCBpbiwgaW5fc2l6ZSwgb3V0LCBvdXRfc2l6ZSwgTlVMTCwgTlVMTCk7CisJcmV0dXJuIGVyciA/IDogbWx4NV9jbWRfY2hlY2soZGV2LCBpbiwgb3V0KTsKIH0KIEVYUE9SVF9TWU1CT0wobWx4NV9jbWRfZXhlYyk7CiAKQEAgLTE0NzYsNyArMTYxMCw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJmNtZC0+Y2FjaGUubWVkLmhlYWQpOwogCiAJZm9yIChpID0gMDsgaSA8IE5VTV9MT05HX0xJU1RTOyBpKyspIHsKLQkJbXNnID0gbWx4NV9hbGxvY19jbWRfbXNnKGRldiwgR0ZQX0tFUk5FTCwgTE9OR19MSVNUX1NJWkUpOworCQltc2cgPSBtbHg1X2FsbG9jX2NtZF9tc2coZGV2LCBHRlBfS0VSTkVMLCBMT05HX0xJU1RfU0laRSwgMCk7CiAJCWlmIChJU19FUlIobXNnKSkgewogCQkJZXJyID0gUFRSX0VSUihtc2cpOwogCQkJZ290byBleF9lcnI7CkBAIC0xNDg2LDcgKzE2MjAsNyBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBOVU1fTUVEX0xJU1RTOyBpKyspIHsKLQkJbXNnID0gbWx4NV9hbGxvY19jbWRfbXNnKGRldiwgR0ZQX0tFUk5FTCwgTUVEX0xJU1RfU0laRSk7CisJCW1zZyA9IG1seDVfYWxsb2NfY21kX21zZyhkZXYsIEdGUF9LRVJORUwsIE1FRF9MSVNUX1NJWkUsIDApOwogCQlpZiAoSVNfRVJSKG1zZykpIHsKIAkJCWVyciA9IFBUUl9FUlIobXNnKTsKIAkJCWdvdG8gZXhfZXJyOwpAQCAtMTY3MSw5NiArMTgwNSwzIEBACiAJcGNpX3Bvb2xfZGVzdHJveShjbWQtPnBvb2wpOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NtZF9jbGVhbnVwKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9zdGF0dXNfc3RyKHU4IHN0YXR1cykKLXsKLQlzd2l0Y2ggKHN0YXR1cykgewotCWNhc2UgTUxYNV9DTURfU1RBVF9PSzoKLQkJcmV0dXJuICJPSyI7Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX0lOVF9FUlI6Ci0JCXJldHVybiAiaW50ZXJuYWwgZXJyb3IiOwotCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfT1BfRVJSOgotCQlyZXR1cm4gImJhZCBvcGVyYXRpb24iOwotCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfUEFSQU1fRVJSOgotCQlyZXR1cm4gImJhZCBwYXJhbWV0ZXIiOwotCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfU1lTX1NUQVRFX0VSUjoKLQkJcmV0dXJuICJiYWQgc3lzdGVtIHN0YXRlIjsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1JFU19FUlI6Ci0JCXJldHVybiAiYmFkIHJlc291cmNlIjsKLQljYXNlIE1MWDVfQ01EX1NUQVRfUkVTX0JVU1k6Ci0JCXJldHVybiAicmVzb3VyY2UgYnVzeSI7Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX0xJTV9FUlI6Ci0JCXJldHVybiAibGltaXRzIGV4Y2VlZGVkIjsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1JFU19TVEFURV9FUlI6Ci0JCXJldHVybiAiYmFkIHJlc291cmNlIHN0YXRlIjsKLQljYXNlIE1MWDVfQ01EX1NUQVRfSVhfRVJSOgotCQlyZXR1cm4gImJhZCBpbmRleCI7Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX05PX1JFU19FUlI6Ci0JCXJldHVybiAibm8gcmVzb3VyY2VzIjsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX0lOUF9MRU5fRVJSOgotCQlyZXR1cm4gImJhZCBpbnB1dCBsZW5ndGgiOwotCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfT1VUUF9MRU5fRVJSOgotCQlyZXR1cm4gImJhZCBvdXRwdXQgbGVuZ3RoIjsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1FQX1NUQVRFX0VSUjoKLQkJcmV0dXJuICJiYWQgUVAgc3RhdGUiOwotCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfUEtUX0VSUjoKLQkJcmV0dXJuICJiYWQgcGFja2V0IChkaXNjYXJkZWQpIjsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1NJWkVfT1VUU19DUUVTX0VSUjoKLQkJcmV0dXJuICJiYWQgc2l6ZSB0b28gbWFueSBvdXRzdGFuZGluZyBDUUVzIjsKLQlkZWZhdWx0OgotCQlyZXR1cm4gInVua25vd24gc3RhdHVzIjsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgY21kX3N0YXR1c190b19lcnIodTggc3RhdHVzKQotewotCXN3aXRjaCAoc3RhdHVzKSB7Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX09LOgkJCQlyZXR1cm4gMDsKLQljYXNlIE1MWDVfQ01EX1NUQVRfSU5UX0VSUjoJCQlyZXR1cm4gLUVJTzsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX09QX0VSUjoJCQlyZXR1cm4gLUVJTlZBTDsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1BBUkFNX0VSUjoJCXJldHVybiAtRUlOVkFMOwotCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfU1lTX1NUQVRFX0VSUjoJCXJldHVybiAtRUlPOwotCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfUkVTX0VSUjoJCQlyZXR1cm4gLUVJTlZBTDsKLQljYXNlIE1MWDVfQ01EX1NUQVRfUkVTX0JVU1k6CQkJcmV0dXJuIC1FQlVTWTsKLQljYXNlIE1MWDVfQ01EX1NUQVRfTElNX0VSUjoJCQlyZXR1cm4gLUVOT01FTTsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1JFU19TVEFURV9FUlI6CQlyZXR1cm4gLUVJTlZBTDsKLQljYXNlIE1MWDVfQ01EX1NUQVRfSVhfRVJSOgkJCXJldHVybiAtRUlOVkFMOwotCWNhc2UgTUxYNV9DTURfU1RBVF9OT19SRVNfRVJSOgkJCXJldHVybiAtRUFHQUlOOwotCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfSU5QX0xFTl9FUlI6CQlyZXR1cm4gLUVJTzsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX09VVFBfTEVOX0VSUjoJCXJldHVybiAtRUlPOwotCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfUVBfU1RBVEVfRVJSOgkJcmV0dXJuIC1FSU5WQUw7Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9QS1RfRVJSOgkJCXJldHVybiAtRUlOVkFMOwotCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfU0laRV9PVVRTX0NRRVNfRVJSOglyZXR1cm4gLUVJTlZBTDsKLQlkZWZhdWx0OgkJCQkJcmV0dXJuIC1FSU87Ci0JfQotfQotCi0vKiB0aGlzIHdpbGwgYmUgYXZhaWxhYmxlIHRpbGwgYWxsIHRoZSBjb21tYW5kcyB1c2Ugc2V0L2dldCBtYWNyb3MgKi8KLWludCBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKHN0cnVjdCBtbHg1X291dGJveF9oZHIgKmhkcikKLXsKLQlpZiAoIWhkci0+c3RhdHVzKQotCQlyZXR1cm4gMDsKLQotCXByX3dhcm4oImNvbW1hbmQgZmFpbGVkLCBzdGF0dXMgJXMoMHgleCksIHN5bmRyb21lIDB4JXhcbiIsCi0JCWNtZF9zdGF0dXNfc3RyKGhkci0+c3RhdHVzKSwgaGRyLT5zdGF0dXMsCi0JCWJlMzJfdG9fY3B1KGhkci0+c3luZHJvbWUpKTsKLQotCXJldHVybiBjbWRfc3RhdHVzX3RvX2VycihoZHItPnN0YXR1cyk7Ci19Ci0KLWludCBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyX3YyKHZvaWQgKnB0cikKLXsKLQl1MzIJc3luZHJvbWU7Ci0JdTgJc3RhdHVzOwotCi0Jc3RhdHVzID0gYmUzMl90b19jcHUoKihfX2JlMzIgKilwdHIpID4+IDI0OwotCWlmICghc3RhdHVzKQotCQlyZXR1cm4gMDsKLQotCXN5bmRyb21lID0gYmUzMl90b19jcHUoKihfX2JlMzIgKikocHRyICsgNCkpOwotCi0JcHJfd2FybigiY29tbWFuZCBmYWlsZWQsIHN0YXR1cyAlcygweCV4KSwgc3luZHJvbWUgMHgleFxuIiwKLQkJY21kX3N0YXR1c19zdHIoc3RhdHVzKSwgc3RhdHVzLCBzeW5kcm9tZSk7Ci0KLQlyZXR1cm4gY21kX3N0YXR1c190b19lcnIoc3RhdHVzKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9jcS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2NxLmMKaW5kZXggODczYTYzMS4uMzJkNGFmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2NxLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2NxLmMKQEAgLTEzNCwzMyArMTM0LDI5IEBACiAJCWNvbXBsZXRlKCZjcS0+ZnJlZSk7CiB9CiAKLQogaW50IG1seDVfY29yZV9jcmVhdGVfY3Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfY29yZV9jcSAqY3EsCi0JCQlzdHJ1Y3QgbWx4NV9jcmVhdGVfY3FfbWJveF9pbiAqaW4sIGludCBpbmxlbikKKwkJCXUzMiAqaW4sIGludCBpbmxlbikKIHsKLQlpbnQgZXJyOwogCXN0cnVjdCBtbHg1X2NxX3RhYmxlICp0YWJsZSA9ICZkZXYtPnByaXYuY3FfdGFibGU7Ci0Jc3RydWN0IG1seDVfY3JlYXRlX2NxX21ib3hfb3V0IG91dDsKLQlzdHJ1Y3QgbWx4NV9kZXN0cm95X2NxX21ib3hfaW4gZGluOwotCXN0cnVjdCBtbHg1X2Rlc3Ryb3lfY3FfbWJveF9vdXQgZG91dDsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX2NxX291dCldOworCXUzMiBkaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X2NxX2luKV07CisJdTMyIGRvdXRbTUxYNV9TVF9TWl9EVyhkZXN0cm95X2NxX291dCldOwogCWludCBlcW4gPSBNTFg1X0dFVChjcWMsIE1MWDVfQUREUl9PRihjcmVhdGVfY3FfaW4sIGluLCBjcV9jb250ZXh0KSwKIAkJCSAgIGNfZXFuKTsKIAlzdHJ1Y3QgbWx4NV9lcSAqZXE7CisJaW50IGVycjsKIAogCWVxID0gbWx4NV9lcW4yZXEoZGV2LCBlcW4pOwogCWlmIChJU19FUlIoZXEpKQogCQlyZXR1cm4gUFRSX0VSUihlcSk7CiAKLQlpbi0+aGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX0NSRUFURV9DUSk7Ci0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCAmb3V0LCBzaXplb2Yob3V0KSk7CisJbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOworCU1MWDVfU0VUKGNyZWF0ZV9jcV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfQ1JFQVRFX0NRKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKG91dC5oZHIuc3RhdHVzKQotCQlyZXR1cm4gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0KLQljcS0+Y3FuID0gYmUzMl90b19jcHUob3V0LmNxbikgJiAweGZmZmZmZjsKKwljcS0+Y3FuID0gTUxYNV9HRVQoY3JlYXRlX2NxX291dCwgb3V0LCBjcW4pOwogCWNxLT5jb25zX2luZGV4ID0gMDsKIAljcS0+YXJtX3NuICAgICA9IDA7CiAJYXRvbWljX3NldCgmY3EtPnJlZmNvdW50LCAxKTsKQEAgLTE4NiwxMCArMTgyLDExIEBACiAJcmV0dXJuIDA7CiAKIGVycl9jbWQ6Ci0JbWVtc2V0KCZkaW4sIDAsIHNpemVvZihkaW4pKTsKLQltZW1zZXQoJmRvdXQsIDAsIHNpemVvZihkb3V0KSk7Ci0JZGluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9ERVNUUk9ZX0NRKTsKLQltbHg1X2NtZF9leGVjKGRldiwgJmRpbiwgc2l6ZW9mKGRpbiksICZkb3V0LCBzaXplb2YoZG91dCkpOworCW1lbXNldChkaW4sIDAsIHNpemVvZihkaW4pKTsKKwltZW1zZXQoZG91dCwgMCwgc2l6ZW9mKGRvdXQpKTsKKwlNTFg1X1NFVChkZXN0cm95X2NxX2luLCBkaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfREVTVFJPWV9DUSk7CisJTUxYNV9TRVQoZGVzdHJveV9jcV9pbiwgZGluLCBjcW4sIGNxLT5jcW4pOworCW1seDVfY21kX2V4ZWMoZGV2LCBkaW4sIHNpemVvZihkaW4pLCBkb3V0LCBzaXplb2YoZG91dCkpOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfY29yZV9jcmVhdGVfY3EpOwpAQCAtMTk3LDggKzE5NCw4IEBACiBpbnQgbWx4NV9jb3JlX2Rlc3Ryb3lfY3Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfY29yZV9jcSAqY3EpCiB7CiAJc3RydWN0IG1seDVfY3FfdGFibGUgKnRhYmxlID0gJmRldi0+cHJpdi5jcV90YWJsZTsKLQlzdHJ1Y3QgbWx4NV9kZXN0cm95X2NxX21ib3hfaW4gaW47Ci0Jc3RydWN0IG1seDVfZGVzdHJveV9jcV9tYm94X291dCBvdXQ7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfY3Ffb3V0KV0gPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV9jcV9pbildID0gezB9OwogCXN0cnVjdCBtbHg1X2NvcmVfY3EgKnRtcDsKIAlpbnQgZXJyOwogCkBAIC0yMTQsMTcgKzIxMSwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQltZW1zZXQoJmluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9ERVNUUk9ZX0NRKTsKLQlpbi5jcW4gPSBjcHVfdG9fYmUzMihjcS0+Y3FuKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCAmb3V0LCBzaXplb2Yob3V0KSk7CisJTUxYNV9TRVQoZGVzdHJveV9jcV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfREVTVFJPWV9DUSk7CisJTUxYNV9TRVQoZGVzdHJveV9jcV9pbiwgaW4sIGNxbiwgY3EtPmNxbik7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKG91dC5oZHIuc3RhdHVzKQotCQlyZXR1cm4gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0KIAlzeW5jaHJvbml6ZV9pcnEoY3EtPmlycW4pOwogCiAJbWx4NV9kZWJ1Z19jcV9yZW1vdmUoZGV2LCBjcSk7CkBAIC0yMzcsNDQgKzIyOSwyMyBAQAogRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfZGVzdHJveV9jcSk7CiAKIGludCBtbHg1X2NvcmVfcXVlcnlfY3Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfY29yZV9jcSAqY3EsCi0JCSAgICAgICBzdHJ1Y3QgbWx4NV9xdWVyeV9jcV9tYm94X291dCAqb3V0KQorCQkgICAgICAgdTMyICpvdXQsIGludCBvdXRsZW4pCiB7Ci0Jc3RydWN0IG1seDVfcXVlcnlfY3FfbWJveF9pbiBpbjsKLQlpbnQgZXJyOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X2NxX2luKV0gPSB7MH07CiAKLQltZW1zZXQoJmluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQob3V0LCAwLCBzaXplb2YoKm91dCkpOwotCi0JaW4uaGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX1FVRVJZX0NRKTsKLQlpbi5jcW4gPSBjcHVfdG9fYmUzMihjcS0+Y3FuKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZigqb3V0KSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmIChvdXQtPmhkci5zdGF0dXMpCi0JCXJldHVybiBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQtPmhkcik7Ci0KLQlyZXR1cm4gZXJyOworCU1MWDVfU0VUKHF1ZXJ5X2NxX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9RVUVSWV9DUSk7CisJTUxYNV9TRVQocXVlcnlfY3FfaW4sIGluLCBjcW4sIGNxLT5jcW4pOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKIH0KIEVYUE9SVF9TWU1CT0wobWx4NV9jb3JlX3F1ZXJ5X2NxKTsKIAotCiBpbnQgbWx4NV9jb3JlX21vZGlmeV9jcShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jb3JlX2NxICpjcSwKLQkJCXN0cnVjdCBtbHg1X21vZGlmeV9jcV9tYm94X2luICppbiwgaW50IGluX3N6KQorCQkJdTMyICppbiwgaW50IGlubGVuKQogewotCXN0cnVjdCBtbHg1X21vZGlmeV9jcV9tYm94X291dCBvdXQ7Ci0JaW50IGVycjsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcobW9kaWZ5X2NxX291dCldID0gezB9OwogCi0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlpbi0+aGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX01PRElGWV9DUSk7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbl9zeiwgJm91dCwgc2l6ZW9mKG91dCkpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAob3V0Lmhkci5zdGF0dXMpCi0JCXJldHVybiBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQuaGRyKTsKLQotCXJldHVybiAwOworCU1MWDVfU0VUKG1vZGlmeV9jcV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfTU9ESUZZX0NRKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfY29yZV9tb2RpZnlfY3EpOwogCkBAIC0yODMsMTggKzI1NCwyMCBAQAogCQkJCSAgIHUxNiBjcV9wZXJpb2QsCiAJCQkJICAgdTE2IGNxX21heF9jb3VudCkKIHsKLQlzdHJ1Y3QgbWx4NV9tb2RpZnlfY3FfbWJveF9pbiBpbjsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhtb2RpZnlfY3FfaW4pXSA9IHswfTsKKwl2b2lkICpjcWM7CiAKLQltZW1zZXQoJmluLCAwLCBzaXplb2YoaW4pKTsKKwlNTFg1X1NFVChtb2RpZnlfY3FfaW4sIGluLCBjcW4sIGNxLT5jcW4pOworCWNxYyA9IE1MWDVfQUREUl9PRihtb2RpZnlfY3FfaW4sIGluLCBjcV9jb250ZXh0KTsKKwlNTFg1X1NFVChjcWMsIGNxYywgY3FfcGVyaW9kLCBjcV9wZXJpb2QpOworCU1MWDVfU0VUKGNxYywgY3FjLCBjcV9tYXhfY291bnQsIGNxX21heF9jb3VudCk7CisJTUxYNV9TRVQobW9kaWZ5X2NxX2luLCBpbiwKKwkJIG1vZGlmeV9maWVsZF9zZWxlY3RfcmVzaXplX2ZpZWxkX3NlbGVjdC5tb2RpZnlfZmllbGRfc2VsZWN0Lm1vZGlmeV9maWVsZF9zZWxlY3QsCisJCSBNTFg1X0NRX01PRElGWV9QRVJJT0QgfCBNTFg1X0NRX01PRElGWV9DT1VOVCk7CiAKLQlpbi5jcW4gICAgICAgICAgICAgID0gY3B1X3RvX2JlMzIoY3EtPmNxbik7Ci0JaW4uY3R4LmNxX3BlcmlvZCAgICA9IGNwdV90b19iZTE2KGNxX3BlcmlvZCk7Ci0JaW4uY3R4LmNxX21heF9jb3VudCA9IGNwdV90b19iZTE2KGNxX21heF9jb3VudCk7Ci0JaW4uZmllbGRfc2VsZWN0ICAgICA9IGNwdV90b19iZTMyKE1MWDVfQ1FfTU9ESUZZX1BFUklPRCB8Ci0JCQkJCSAgTUxYNV9DUV9NT0RJRllfQ09VTlQpOwotCi0JcmV0dXJuIG1seDVfY29yZV9tb2RpZnlfY3EoZGV2LCBjcSwgJmluLCBzaXplb2YoaW4pKTsKKwlyZXR1cm4gbWx4NV9jb3JlX21vZGlmeV9jcShkZXYsIGNxLCBpbiwgc2l6ZW9mKGluKSk7CiB9CitFWFBPUlRfU1lNQk9MKG1seDVfY29yZV9tb2RpZnlfY3FfbW9kZXJhdGlvbik7CiAKIGludCBtbHg1X2luaXRfY3FfdGFibGUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZGVidWdmcy5jCmluZGV4IDUyMTBkOTIuLmU5NGE5NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2RlYnVnZnMuYwpAQCAtMjc3LDI0ICsyNzcsMjggQEAKIHN0YXRpYyB1NjQgcXBfcmVhZF9maWVsZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jb3JlX3FwICpxcCwKIAkJCSBpbnQgaW5kZXgsIGludCAqaXNfc3RyKQogewotCXN0cnVjdCBtbHg1X3F1ZXJ5X3FwX21ib3hfb3V0ICpvdXQ7CisJaW50IG91dGxlbiA9IE1MWDVfU1RfU1pfQllURVMocXVlcnlfcXBfb3V0KTsKIAlzdHJ1Y3QgbWx4NV9xcF9jb250ZXh0ICpjdHg7CiAJdTY0IHBhcmFtID0gMDsKKwl1MzIgKm91dDsKIAlpbnQgZXJyOwogCWludCBub19zcTsKIAotCW91dCA9IGt6YWxsb2Moc2l6ZW9mKCpvdXQpLCBHRlBfS0VSTkVMKTsKKwlvdXQgPSBremFsbG9jKG91dGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFvdXQpCiAJCXJldHVybiBwYXJhbTsKIAotCWVyciA9IG1seDVfY29yZV9xcF9xdWVyeShkZXYsIHFwLCBvdXQsIHNpemVvZigqb3V0KSk7CisJZXJyID0gbWx4NV9jb3JlX3FwX3F1ZXJ5KGRldiwgcXAsIG91dCwgb3V0bGVuKTsKIAlpZiAoZXJyKSB7Ci0JCW1seDVfY29yZV93YXJuKGRldiwgImZhaWxlZCB0byBxdWVyeSBxcFxuIik7CisJCW1seDVfY29yZV93YXJuKGRldiwgImZhaWxlZCB0byBxdWVyeSBxcCBlcnI9JWRcbiIsIGVycik7CiAJCWdvdG8gb3V0OwogCX0KIAogCSppc19zdHIgPSAwOwotCWN0eCA9ICZvdXQtPmN0eDsKKworCS8qIEZJWE1FOiB1c2UgTUxYNV9HRVQgcmF0aGVyIHRoYW4gbWx4NV9xcF9jb250ZXh0IG1hbnVhbCBzdHJ1Y3QgKi8KKwljdHggPSAoc3RydWN0IG1seDVfcXBfY29udGV4dCAqKU1MWDVfQUREUl9PRihxdWVyeV9xcF9vdXQsIG91dCwgcXBjKTsKKwogCXN3aXRjaCAoaW5kZXgpIHsKIAljYXNlIFFQX1BJRDoKIAkJcGFyYW0gPSBxcC0+cGlkOwpAQCAtMzU4LDMyICszNjIsMzIgQEAKIHN0YXRpYyB1NjQgZXFfcmVhZF9maWVsZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9lcSAqZXEsCiAJCQkgaW50IGluZGV4KQogewotCXN0cnVjdCBtbHg1X3F1ZXJ5X2VxX21ib3hfb3V0ICpvdXQ7Ci0Jc3RydWN0IG1seDVfZXFfY29udGV4dCAqY3R4OworCWludCBvdXRsZW4gPSBNTFg1X1NUX1NaX0JZVEVTKHF1ZXJ5X2VxX291dCk7CiAJdTY0IHBhcmFtID0gMDsKKwl2b2lkICpjdHg7CisJdTMyICpvdXQ7CiAJaW50IGVycjsKIAotCW91dCA9IGt6YWxsb2Moc2l6ZW9mKCpvdXQpLCBHRlBfS0VSTkVMKTsKKwlvdXQgPSBremFsbG9jKG91dGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFvdXQpCiAJCXJldHVybiBwYXJhbTsKIAotCWN0eCA9ICZvdXQtPmN0eDsKLQotCWVyciA9IG1seDVfY29yZV9lcV9xdWVyeShkZXYsIGVxLCBvdXQsIHNpemVvZigqb3V0KSk7CisJZXJyID0gbWx4NV9jb3JlX2VxX3F1ZXJ5KGRldiwgZXEsIG91dCwgb3V0bGVuKTsKIAlpZiAoZXJyKSB7CiAJCW1seDVfY29yZV93YXJuKGRldiwgImZhaWxlZCB0byBxdWVyeSBlcVxuIik7CiAJCWdvdG8gb3V0OwogCX0KKwljdHggPSBNTFg1X0FERFJfT0YocXVlcnlfZXFfb3V0LCBvdXQsIGVxX2NvbnRleHRfZW50cnkpOwogCiAJc3dpdGNoIChpbmRleCkgewogCWNhc2UgRVFfTlVNX0VRRVM6Ci0JCXBhcmFtID0gMSA8PCAoKGJlMzJfdG9fY3B1KGN0eC0+bG9nX3N6X3Vzcl9wYWdlKSA+PiAyNCkgJiAweDFmKTsKKwkJcGFyYW0gPSAxIDw8IE1MWDVfR0VUKGVxYywgY3R4LCBsb2dfZXFfc2l6ZSk7CiAJCWJyZWFrOwogCWNhc2UgRVFfSU5UUjoKLQkJcGFyYW0gPSBjdHgtPmludHI7CisJCXBhcmFtID0gTUxYNV9HRVQoZXFjLCBjdHgsIGludHIpOwogCQlicmVhazsKIAljYXNlIEVRX0xPR19QR19TWjoKLQkJcGFyYW0gPSAoY3R4LT5sb2dfcGFnZV9zaXplICYgMHgxZikgKyAxMjsKKwkJcGFyYW0gPSBNTFg1X0dFVChlcWMsIGN0eCwgbG9nX3BhZ2Vfc2l6ZSkgKyAxMjsKIAkJYnJlYWs7CiAJfQogCkBAIC0zOTUsMzcgKzM5OSwzNyBAQAogc3RhdGljIHU2NCBjcV9yZWFkX2ZpZWxkKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2NvcmVfY3EgKmNxLAogCQkJIGludCBpbmRleCkKIHsKLQlzdHJ1Y3QgbWx4NV9xdWVyeV9jcV9tYm94X291dCAqb3V0OwotCXN0cnVjdCBtbHg1X2NxX2NvbnRleHQgKmN0eDsKKwlpbnQgb3V0bGVuID0gTUxYNV9TVF9TWl9CWVRFUyhxdWVyeV9jcV9vdXQpOwogCXU2NCBwYXJhbSA9IDA7CisJdm9pZCAqY3R4OworCXUzMiAqb3V0OwogCWludCBlcnI7CiAKLQlvdXQgPSBremFsbG9jKHNpemVvZigqb3V0KSwgR0ZQX0tFUk5FTCk7CisJb3V0ID0gbWx4NV92emFsbG9jKG91dGxlbik7CiAJaWYgKCFvdXQpCiAJCXJldHVybiBwYXJhbTsKIAotCWN0eCA9ICZvdXQtPmN0eDsKLQotCWVyciA9IG1seDVfY29yZV9xdWVyeV9jcShkZXYsIGNxLCBvdXQpOworCWVyciA9IG1seDVfY29yZV9xdWVyeV9jcShkZXYsIGNxLCBvdXQsIG91dGxlbik7CiAJaWYgKGVycikgewogCQltbHg1X2NvcmVfd2FybihkZXYsICJmYWlsZWQgdG8gcXVlcnkgY3FcbiIpOwogCQlnb3RvIG91dDsKIAl9CisJY3R4ID0gTUxYNV9BRERSX09GKHF1ZXJ5X2NxX291dCwgb3V0LCBjcV9jb250ZXh0KTsKIAogCXN3aXRjaCAoaW5kZXgpIHsKIAljYXNlIENRX1BJRDoKIAkJcGFyYW0gPSBjcS0+cGlkOwogCQlicmVhazsKIAljYXNlIENRX05VTV9DUUVTOgotCQlwYXJhbSA9IDEgPDwgKChiZTMyX3RvX2NwdShjdHgtPmxvZ19zel91c3JfcGFnZSkgPj4gMjQpICYgMHgxZik7CisJCXBhcmFtID0gMSA8PCBNTFg1X0dFVChjcWMsIGN0eCwgbG9nX2NxX3NpemUpOwogCQlicmVhazsKIAljYXNlIENRX0xPR19QR19TWjoKLQkJcGFyYW0gPSAoY3R4LT5sb2dfcGdfc3ogJiAweDFmKSArIDEyOworCQlwYXJhbSA9IE1MWDVfR0VUKGNxYywgY3R4LCBsb2dfcGFnZV9zaXplKTsKIAkJYnJlYWs7CiAJfQogCiBvdXQ6Ci0Ja2ZyZWUob3V0KTsKKwlrdmZyZWUob3V0KTsKIAlyZXR1cm4gcGFyYW07CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9kZXYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWRiYzI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2Rldi5jCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbHg1L2RyaXZlci5oPgorI2luY2x1ZGUgIm1seDVfY29yZS5oIgorCitzdGF0aWMgTElTVF9IRUFEKGludGZfbGlzdCk7CitzdGF0aWMgTElTVF9IRUFEKG1seDVfZGV2X2xpc3QpOworLyogaW50ZiBkZXYgbGlzdCBtdXRleCAqLworc3RhdGljIERFRklORV9NVVRFWChtbHg1X2ludGZfbXV0ZXgpOworCitzdHJ1Y3QgbWx4NV9kZXZpY2VfY29udGV4dCB7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCXN0cnVjdCBtbHg1X2ludGVyZmFjZSAgKmludGY7CisJdm9pZAkJICAgICAgICpjb250ZXh0OworCXVuc2lnbmVkIGxvbmcJCXN0YXRlOworfTsKKworZW51bSB7CisJTUxYNV9JTlRFUkZBQ0VfQURERUQsCisJTUxYNV9JTlRFUkZBQ0VfQVRUQUNIRUQsCit9OworCit2b2lkIG1seDVfYWRkX2RldmljZShzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgKmludGYsIHN0cnVjdCBtbHg1X3ByaXYgKnByaXYpCit7CisJc3RydWN0IG1seDVfZGV2aWNlX2NvbnRleHQgKmRldl9jdHg7CisJc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiA9IGNvbnRhaW5lcl9vZihwcml2LCBzdHJ1Y3QgbWx4NV9jb3JlX2RldiwgcHJpdik7CisKKwlpZiAoIW1seDVfbGFnX2ludGZfYWRkKGludGYsIHByaXYpKQorCQlyZXR1cm47CisKKwlkZXZfY3R4ID0ga3phbGxvYyhzaXplb2YoKmRldl9jdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldl9jdHgpCisJCXJldHVybjsKKworCWRldl9jdHgtPmludGYgPSBpbnRmOworCWRldl9jdHgtPmNvbnRleHQgPSBpbnRmLT5hZGQoZGV2KTsKKwlzZXRfYml0KE1MWDVfSU5URVJGQUNFX0FEREVELCAmZGV2X2N0eC0+c3RhdGUpOworCWlmIChpbnRmLT5hdHRhY2gpCisJCXNldF9iaXQoTUxYNV9JTlRFUkZBQ0VfQVRUQUNIRUQsICZkZXZfY3R4LT5zdGF0ZSk7CisKKwlpZiAoZGV2X2N0eC0+Y29udGV4dCkgeworCQlzcGluX2xvY2tfaXJxKCZwcml2LT5jdHhfbG9jayk7CisJCWxpc3RfYWRkX3RhaWwoJmRldl9jdHgtPmxpc3QsICZwcml2LT5jdHhfbGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+Y3R4X2xvY2spOworCX0gZWxzZSB7CisJCWtmcmVlKGRldl9jdHgpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBtbHg1X2RldmljZV9jb250ZXh0ICptbHg1X2dldF9kZXZpY2Uoc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmLAorCQkJCQkJICAgc3RydWN0IG1seDVfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgbWx4NV9kZXZpY2VfY29udGV4dCAqZGV2X2N0eDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2X2N0eCwgJnByaXYtPmN0eF9saXN0LCBsaXN0KQorCQlpZiAoZGV2X2N0eC0+aW50ZiA9PSBpbnRmKQorCQkJcmV0dXJuIGRldl9jdHg7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgbWx4NV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBtbHg1X2ludGVyZmFjZSAqaW50Ziwgc3RydWN0IG1seDVfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgbWx4NV9kZXZpY2VfY29udGV4dCAqZGV2X2N0eDsKKwlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2ID0gY29udGFpbmVyX29mKHByaXYsIHN0cnVjdCBtbHg1X2NvcmVfZGV2LCBwcml2KTsKKworCWRldl9jdHggPSBtbHg1X2dldF9kZXZpY2UoaW50ZiwgcHJpdik7CisJaWYgKCFkZXZfY3R4KQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxKCZwcml2LT5jdHhfbG9jayk7CisJbGlzdF9kZWwoJmRldl9jdHgtPmxpc3QpOworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+Y3R4X2xvY2spOworCisJaWYgKHRlc3RfYml0KE1MWDVfSU5URVJGQUNFX0FEREVELCAmZGV2X2N0eC0+c3RhdGUpKQorCQlpbnRmLT5yZW1vdmUoZGV2LCBkZXZfY3R4LT5jb250ZXh0KTsKKworCWtmcmVlKGRldl9jdHgpOworfQorCitzdGF0aWMgdm9pZCBtbHg1X2F0dGFjaF9pbnRlcmZhY2Uoc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmLCBzdHJ1Y3QgbWx4NV9wcml2ICpwcml2KQoreworCXN0cnVjdCBtbHg1X2RldmljZV9jb250ZXh0ICpkZXZfY3R4OworCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYgPSBjb250YWluZXJfb2YocHJpdiwgc3RydWN0IG1seDVfY29yZV9kZXYsIHByaXYpOworCisJZGV2X2N0eCA9IG1seDVfZ2V0X2RldmljZShpbnRmLCBwcml2KTsKKwlpZiAoIWRldl9jdHgpCisJCXJldHVybjsKKworCWlmIChpbnRmLT5hdHRhY2gpIHsKKwkJaWYgKHRlc3RfYml0KE1MWDVfSU5URVJGQUNFX0FUVEFDSEVELCAmZGV2X2N0eC0+c3RhdGUpKQorCQkJcmV0dXJuOworCQlpbnRmLT5hdHRhY2goZGV2LCBkZXZfY3R4LT5jb250ZXh0KTsKKwkJc2V0X2JpdChNTFg1X0lOVEVSRkFDRV9BVFRBQ0hFRCwgJmRldl9jdHgtPnN0YXRlKTsKKwl9IGVsc2UgeworCQlpZiAodGVzdF9iaXQoTUxYNV9JTlRFUkZBQ0VfQURERUQsICZkZXZfY3R4LT5zdGF0ZSkpCisJCQlyZXR1cm47CisJCWRldl9jdHgtPmNvbnRleHQgPSBpbnRmLT5hZGQoZGV2KTsKKwkJc2V0X2JpdChNTFg1X0lOVEVSRkFDRV9BRERFRCwgJmRldl9jdHgtPnN0YXRlKTsKKwl9Cit9CisKK3ZvaWQgbWx4NV9hdHRhY2hfZGV2aWNlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCit7CisJc3RydWN0IG1seDVfcHJpdiAqcHJpdiA9ICZkZXYtPnByaXY7CisJc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmOworCisJbXV0ZXhfbG9jaygmbWx4NV9pbnRmX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGludGYsICZpbnRmX2xpc3QsIGxpc3QpCisJCW1seDVfYXR0YWNoX2ludGVyZmFjZShpbnRmLCBwcml2KTsKKwltdXRleF91bmxvY2soJm1seDVfaW50Zl9tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIG1seDVfZGV0YWNoX2ludGVyZmFjZShzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgKmludGYsIHN0cnVjdCBtbHg1X3ByaXYgKnByaXYpCit7CisJc3RydWN0IG1seDVfZGV2aWNlX2NvbnRleHQgKmRldl9jdHg7CisJc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiA9IGNvbnRhaW5lcl9vZihwcml2LCBzdHJ1Y3QgbWx4NV9jb3JlX2RldiwgcHJpdik7CisKKwlkZXZfY3R4ID0gbWx4NV9nZXRfZGV2aWNlKGludGYsIHByaXYpOworCWlmICghZGV2X2N0eCkKKwkJcmV0dXJuOworCisJaWYgKGludGYtPmRldGFjaCkgeworCQlpZiAoIXRlc3RfYml0KE1MWDVfSU5URVJGQUNFX0FUVEFDSEVELCAmZGV2X2N0eC0+c3RhdGUpKQorCQkJcmV0dXJuOworCQlpbnRmLT5kZXRhY2goZGV2LCBkZXZfY3R4LT5jb250ZXh0KTsKKwkJY2xlYXJfYml0KE1MWDVfSU5URVJGQUNFX0FUVEFDSEVELCAmZGV2X2N0eC0+c3RhdGUpOworCX0gZWxzZSB7CisJCWlmICghdGVzdF9iaXQoTUxYNV9JTlRFUkZBQ0VfQURERUQsICZkZXZfY3R4LT5zdGF0ZSkpCisJCQlyZXR1cm47CisJCWludGYtPnJlbW92ZShkZXYsIGRldl9jdHgtPmNvbnRleHQpOworCQljbGVhcl9iaXQoTUxYNV9JTlRFUkZBQ0VfQURERUQsICZkZXZfY3R4LT5zdGF0ZSk7CisJfQorfQorCit2b2lkIG1seDVfZGV0YWNoX2RldmljZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCXN0cnVjdCBtbHg1X3ByaXYgKnByaXYgPSAmZGV2LT5wcml2OworCXN0cnVjdCBtbHg1X2ludGVyZmFjZSAqaW50ZjsKKworCW11dGV4X2xvY2soJm1seDVfaW50Zl9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRmLCAmaW50Zl9saXN0LCBsaXN0KQorCQltbHg1X2RldGFjaF9pbnRlcmZhY2UoaW50ZiwgcHJpdik7CisJbXV0ZXhfdW5sb2NrKCZtbHg1X2ludGZfbXV0ZXgpOworfQorCitib29sIG1seDVfZGV2aWNlX3JlZ2lzdGVyZWQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbWx4NV9wcml2ICpwcml2OworCWJvb2wgZm91bmQgPSBmYWxzZTsKKworCW11dGV4X2xvY2soJm1seDVfaW50Zl9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwcml2LCAmbWx4NV9kZXZfbGlzdCwgZGV2X2xpc3QpCisJCWlmIChwcml2ID09ICZkZXYtPnByaXYpCisJCQlmb3VuZCA9IHRydWU7CisJbXV0ZXhfdW5sb2NrKCZtbHg1X2ludGZfbXV0ZXgpOworCisJcmV0dXJuIGZvdW5kOworfQorCitpbnQgbWx4NV9yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbWx4NV9wcml2ICpwcml2ID0gJmRldi0+cHJpdjsKKwlzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgKmludGY7CisKKwltdXRleF9sb2NrKCZtbHg1X2ludGZfbXV0ZXgpOworCWxpc3RfYWRkX3RhaWwoJnByaXYtPmRldl9saXN0LCAmbWx4NV9kZXZfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRmLCAmaW50Zl9saXN0LCBsaXN0KQorCQltbHg1X2FkZF9kZXZpY2UoaW50ZiwgcHJpdik7CisJbXV0ZXhfdW5sb2NrKCZtbHg1X2ludGZfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbWx4NV91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCXN0cnVjdCBtbHg1X3ByaXYgKnByaXYgPSAmZGV2LT5wcml2OworCXN0cnVjdCBtbHg1X2ludGVyZmFjZSAqaW50ZjsKKworCW11dGV4X2xvY2soJm1seDVfaW50Zl9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRmLCAmaW50Zl9saXN0LCBsaXN0KQorCQltbHg1X3JlbW92ZV9kZXZpY2UoaW50ZiwgcHJpdik7CisJbGlzdF9kZWwoJnByaXYtPmRldl9saXN0KTsKKwltdXRleF91bmxvY2soJm1seDVfaW50Zl9tdXRleCk7Cit9CisKK2ludCBtbHg1X3JlZ2lzdGVyX2ludGVyZmFjZShzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IG1seDVfcHJpdiAqcHJpdjsKKworCWlmICghaW50Zi0+YWRkIHx8ICFpbnRmLT5yZW1vdmUpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmbWx4NV9pbnRmX211dGV4KTsKKwlsaXN0X2FkZF90YWlsKCZpbnRmLT5saXN0LCAmaW50Zl9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByaXYsICZtbHg1X2Rldl9saXN0LCBkZXZfbGlzdCkKKwkJbWx4NV9hZGRfZGV2aWNlKGludGYsIHByaXYpOworCW11dGV4X3VubG9jaygmbWx4NV9pbnRmX211dGV4KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChtbHg1X3JlZ2lzdGVyX2ludGVyZmFjZSk7CisKK3ZvaWQgbWx4NV91bnJlZ2lzdGVyX2ludGVyZmFjZShzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IG1seDVfcHJpdiAqcHJpdjsKKworCW11dGV4X2xvY2soJm1seDVfaW50Zl9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwcml2LCAmbWx4NV9kZXZfbGlzdCwgZGV2X2xpc3QpCisJCW1seDVfcmVtb3ZlX2RldmljZShpbnRmLCBwcml2KTsKKwlsaXN0X2RlbCgmaW50Zi0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZtbHg1X2ludGZfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTChtbHg1X3VucmVnaXN0ZXJfaW50ZXJmYWNlKTsKKwordm9pZCAqbWx4NV9nZXRfcHJvdG9jb2xfZGV2KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IG1seDVfcHJpdiAqcHJpdiA9ICZtZGV2LT5wcml2OworCXN0cnVjdCBtbHg1X2RldmljZV9jb250ZXh0ICpkZXZfY3R4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCAqcmVzdWx0ID0gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5jdHhfbG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZfY3R4LCAmbWRldi0+cHJpdi5jdHhfbGlzdCwgbGlzdCkKKwkJaWYgKChkZXZfY3R4LT5pbnRmLT5wcm90b2NvbCA9PSBwcm90b2NvbCkgJiYKKwkJICAgIGRldl9jdHgtPmludGYtPmdldF9kZXYpIHsKKwkJCXJlc3VsdCA9IGRldl9jdHgtPmludGYtPmdldF9kZXYoZGV2X2N0eC0+Y29udGV4dCk7CisJCQlicmVhazsKKwkJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+Y3R4X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MKG1seDVfZ2V0X3Byb3RvY29sX2Rldik7CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggaW50Zl9tdXRleCBoZWxkICovCit2b2lkIG1seDVfYWRkX2Rldl9ieV9wcm90b2NvbChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRmLCAmaW50Zl9saXN0LCBsaXN0KQorCQlpZiAoaW50Zi0+cHJvdG9jb2wgPT0gcHJvdG9jb2wpIHsKKwkJCW1seDVfYWRkX2RldmljZShpbnRmLCAmZGV2LT5wcml2KTsKKwkJCWJyZWFrOworCQl9Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggaW50Zl9tdXRleCBoZWxkICovCit2b2lkIG1seDVfcmVtb3ZlX2Rldl9ieV9wcm90b2NvbChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRmLCAmaW50Zl9saXN0LCBsaXN0KQorCQlpZiAoaW50Zi0+cHJvdG9jb2wgPT0gcHJvdG9jb2wpIHsKKwkJCW1seDVfcmVtb3ZlX2RldmljZShpbnRmLCAmZGV2LT5wcml2KTsKKwkJCWJyZWFrOworCQl9Cit9CisKK3N0YXRpYyB1MTYgbWx4NV9nZW5fcGNpX2lkKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCit7CisJcmV0dXJuICh1MTYpKChkZXYtPnBkZXYtPmJ1cy0+bnVtYmVyIDw8IDgpIHwKKwkJICAgICBQQ0lfU0xPVChkZXYtPnBkZXYtPmRldmZuKSk7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggaW50Zl9tdXRleCBoZWxkICovCitzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWx4NV9nZXRfbmV4dF9waHlzX2RldihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCXUxNiBwY2lfaWQgPSBtbHg1X2dlbl9wY2lfaWQoZGV2KTsKKwlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqcmVzID0gTlVMTDsKKwlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqdG1wX2RldjsKKwlzdHJ1Y3QgbWx4NV9wcml2ICpwcml2OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwcml2LCAmbWx4NV9kZXZfbGlzdCwgZGV2X2xpc3QpIHsKKwkJdG1wX2RldiA9IGNvbnRhaW5lcl9vZihwcml2LCBzdHJ1Y3QgbWx4NV9jb3JlX2RldiwgcHJpdik7CisJCWlmICgoZGV2ICE9IHRtcF9kZXYpICYmIChtbHg1X2dlbl9wY2lfaWQodG1wX2RldikgPT0gcGNpX2lkKSkgeworCQkJcmVzID0gdG1wX2RldjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJlczsKK30KKwordm9pZCBtbHg1X2NvcmVfZXZlbnQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgZW51bSBtbHg1X2Rldl9ldmVudCBldmVudCwKKwkJICAgICB1bnNpZ25lZCBsb25nIHBhcmFtKQoreworCXN0cnVjdCBtbHg1X3ByaXYgKnByaXYgPSAmZGV2LT5wcml2OworCXN0cnVjdCBtbHg1X2RldmljZV9jb250ZXh0ICpkZXZfY3R4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+Y3R4X2xvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2X2N0eCwgJnByaXYtPmN0eF9saXN0LCBsaXN0KQorCQlpZiAoZGV2X2N0eC0+aW50Zi0+ZXZlbnQpCisJCQlkZXZfY3R4LT5pbnRmLT5ldmVudChkZXYsIGRldl9jdHgtPmNvbnRleHQsIGV2ZW50LCBwYXJhbSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5jdHhfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIG1seDVfZGV2X2xpc3RfbG9jayh2b2lkKQoreworCW11dGV4X2xvY2soJm1seDVfaW50Zl9tdXRleCk7Cit9CisKK3ZvaWQgbWx4NV9kZXZfbGlzdF91bmxvY2sodm9pZCkKK3sKKwltdXRleF91bmxvY2soJm1seDVfaW50Zl9tdXRleCk7Cit9CisKK2ludCBtbHg1X2Rldl9saXN0X3RyeWxvY2sodm9pZCkKK3sKKwlyZXR1cm4gbXV0ZXhfdHJ5bG9jaygmbWx4NV9pbnRmX211dGV4KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuLmgKaW5kZXggMWI0OTVlZi4uNDYwMzYzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuLmgKQEAgLTYyLDE5ICs2MiwyNSBAQAogI2RlZmluZSBNTFg1RV9QQVJBTVNfTUFYSU1VTV9MT0dfUlFfU0laRSAgICAgICAgICAgICAgICAweGQKIAogI2RlZmluZSBNTFg1RV9QQVJBTVNfTUlOSU1VTV9MT0dfUlFfU0laRV9NUFcgICAgICAgICAgICAweDEKLSNkZWZpbmUgTUxYNUVfUEFSQU1TX0RFRkFVTFRfTE9HX1JRX1NJWkVfTVBXICAgICAgICAgICAgMHg0CisjZGVmaW5lIE1MWDVFX1BBUkFNU19ERUZBVUxUX0xPR19SUV9TSVpFX01QVyAgICAgICAgICAgIDB4MwogI2RlZmluZSBNTFg1RV9QQVJBTVNfTUFYSU1VTV9MT0dfUlFfU0laRV9NUFcgICAgICAgICAgICAweDYKIAorI2RlZmluZSBNTFg1X1JYX0hFQURST09NIE5FVF9TS0JfUEFECisKICNkZWZpbmUgTUxYNV9NUFdSUV9MT0dfU1RSSURFX1NJWkUJCTYgIC8qID49IDYsIEhXIHJlc3RyaWN0aW9uICovCiAjZGVmaW5lIE1MWDVfTVBXUlFfTE9HX1NUUklERV9TSVpFX0NRRV9DT01QUkVTUwk4ICAvKiA+PSA2LCBIVyByZXN0cmljdGlvbiAqLwotI2RlZmluZSBNTFg1X01QV1JRX0xPR19XUUVfU1oJCQkxNworI2RlZmluZSBNTFg1X01QV1JRX0xPR19XUUVfU1oJCQkxOAogI2RlZmluZSBNTFg1X01QV1JRX1dRRV9QQUdFX09SREVSICAoTUxYNV9NUFdSUV9MT0dfV1FFX1NaIC0gUEFHRV9TSElGVCA+IDAgPyBcCiAJCQkJICAgIE1MWDVfTVBXUlFfTE9HX1dRRV9TWiAtIFBBR0VfU0hJRlQgOiAwKQogI2RlZmluZSBNTFg1X01QV1JRX1BBR0VTX1BFUl9XUUUJCUJJVChNTFg1X01QV1JRX1dRRV9QQUdFX09SREVSKQogI2RlZmluZSBNTFg1X01QV1JRX1NUUklERVNfUEVSX1BBR0UJCShNTFg1X01QV1JRX05VTV9TVFJJREVTID4+IFwKIAkJCQkJCSBNTFg1X01QV1JRX1dRRV9QQUdFX09SREVSKQotI2RlZmluZSBNTFg1X0NIQU5ORUxfTUFYX05VTV9NVFRTIChBTElHTihNTFg1X01QV1JRX1BBR0VTX1BFUl9XUUUsIDgpICogXAotCQkJCSAgIEJJVChNTFg1RV9QQVJBTVNfTUFYSU1VTV9MT0dfUlFfU0laRV9NUFcpKQorCisjZGVmaW5lIE1MWDVfTVRUX09DVFcobnBhZ2VzKSAoQUxJR04obnBhZ2VzLCA4KSAvIDIpCisjZGVmaW5lIE1MWDVFX1JFUVVJUkVEX01UVFMocnFzLCB3cWVzKVwKKwkocnFzICogd3FlcyAqIEFMSUdOKE1MWDVfTVBXUlFfUEFHRVNfUEVSX1dRRSwgOCkpCisjZGVmaW5lIE1MWDVFX1ZBTElEX05VTV9NVFRTKG51bV9tdHRzKSAoTUxYNV9NVFRfT0NUVyhudW1fbXR0cykgPD0gVTE2X01BWCkKKwogI2RlZmluZSBNTFg1X1VNUl9BTElHTgkJCQkoMjA0OCkKICNkZWZpbmUgTUxYNV9NUFdSUV9TTUFMTF9QQUNLRVRfVEhSRVNIT0xECSgxMjgpCiAKQEAgLTk1LDYgKzEwMSwxOCBAQAogI2RlZmluZSBNTFg1RV9VUERBVEVfU1RBVFNfSU5URVJWQUwgICAgMjAwIC8qIG1zZWNzICovCiAjZGVmaW5lIE1MWDVFX1NRX0JGX0JVREdFVCAgICAgICAgICAgICAxNgogCisjZGVmaW5lIE1MWDVFX0lDT1NRX01BWF9XUUVCQlMgXAorCShESVZfUk9VTkRfVVAoc2l6ZW9mKHN0cnVjdCBtbHg1ZV91bXJfd3FlKSwgTUxYNV9TRU5EX1dRRV9CQikpCisKKyNkZWZpbmUgTUxYNUVfWERQX01JTl9JTkxJTkUgKEVUSF9ITEVOICsgVkxBTl9ITEVOKQorI2RlZmluZSBNTFg1RV9YRFBfSUhTX0RTX0NPVU5UIFwKKwlESVZfUk9VTkRfVVAoTUxYNUVfWERQX01JTl9JTkxJTkUgLSAyLCBNTFg1X1NFTkRfV1FFX0RTKQorI2RlZmluZSBNTFg1RV9YRFBfVFhfRFNfQ09VTlQgXAorCShNTFg1RV9YRFBfSUhTX0RTX0NPVU5UICsgXAorCSAoc2l6ZW9mKHN0cnVjdCBtbHg1ZV90eF93cWUpIC8gTUxYNV9TRU5EX1dRRV9EUykgKyAxIC8qIFNHIERTICovKQorI2RlZmluZSBNTFg1RV9YRFBfVFhfV1FFQkJTIFwKKwlESVZfUk9VTkRfVVAoTUxYNUVfWERQX1RYX0RTX0NPVU5ULCBNTFg1X1NFTkRfV1FFQkJfTlVNX0RTKQorCiAjZGVmaW5lIE1MWDVFX05VTV9NQUlOX0dST1VQUyA5CiAKIHN0YXRpYyBpbmxpbmUgdTE2IG1seDVfbWluX3J4X3dxZXMoaW50IHdxX3R5cGUsIHUzMiB3cV9zaXplKQpAQCAtMjE5LDkgKzIzNyw4IEBACiB9OwogCiBlbnVtIHsKLQlNTFg1RV9SUV9TVEFURV9QT1NUX1dRRVNfRU5BQkxFLAorCU1MWDVFX1JRX1NUQVRFX0ZMVVNILAogCU1MWDVFX1JRX1NUQVRFX1VNUl9XUUVfSU5fUFJPR1JFU1MsCi0JTUxYNUVfUlFfU1RBVEVfRkxVU0hfVElNRU9VVCwKIAlNTFg1RV9SUV9TVEFURV9BTSwKIH07CiAKQEAgLTI4NCwyMCArMzAxLDQ0IEBACiAJdTgJCQkJCXRpcmVkOwogfTsKIAorLyogYSBzaW5nbGUgY2FjaGUgdW5pdCBpcyBjYXBhYmxlIHRvIHNlcnZlIG9uZSBuYXBpIGNhbGwgKGZvciBub24tc3RyaWRpbmcgcnEpCisgKiBvciBhIE1QV1FFIChmb3Igc3RyaWRpbmcgcnEpLgorICovCisjZGVmaW5lIE1MWDVFX0NBQ0hFX1VOSVQJKE1MWDVfTVBXUlFfUEFHRVNfUEVSX1dRRSA+IE5BUElfUE9MTF9XRUlHSFQgPyBcCisJCQkJIE1MWDVfTVBXUlFfUEFHRVNfUEVSX1dRRSA6IE5BUElfUE9MTF9XRUlHSFQpCisjZGVmaW5lIE1MWDVFX0NBQ0hFX1NJWkUJKDIgKiByb3VuZHVwX3Bvd19vZl90d28oTUxYNUVfQ0FDSEVfVU5JVCkpCitzdHJ1Y3QgbWx4NWVfcGFnZV9jYWNoZSB7CisJdTMyIGhlYWQ7CisJdTMyIHRhaWw7CisJc3RydWN0IG1seDVlX2RtYV9pbmZvIHBhZ2VfY2FjaGVbTUxYNUVfQ0FDSEVfU0laRV07Cit9OworCiBzdHJ1Y3QgbWx4NWVfcnEgewogCS8qIGRhdGEgcGF0aCAqLwogCXN0cnVjdCBtbHg1X3dxX2xsICAgICAgd3E7Ci0JdTMyICAgICAgICAgICAgICAgICAgICB3cWVfc3o7Ci0Jc3RydWN0IHNrX2J1ZmYgICAgICAgKipza2I7Ci0Jc3RydWN0IG1seDVlX21wd19pbmZvICp3cWVfaW5mbzsKKworCXVuaW9uIHsKKwkJc3RydWN0IG1seDVlX2RtYV9pbmZvICpkbWFfaW5mbzsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqaW5mbzsKKwkJCXZvaWQgICAgICAgICAgICAgICAgICAqbXR0X25vX2FsaWduOworCQkJdTMyICAgICAgICAgICAgICAgICAgICBtdHRfb2Zmc2V0OworCQl9IG1wd3FlOworCX07CisJc3RydWN0IHsKKwkJdTggICAgICAgICAgICAgcGFnZV9vcmRlcjsKKwkJdTMyICAgICAgICAgICAgd3FlX3N6OyAgICAvKiB3cWUgZGF0YSBidWZmZXIgc2l6ZSAqLworCQl1OCAgICAgICAgICAgICBtYXBfZGlyOyAgIC8qIGRtYSBtYXAgZGlyZWN0aW9uICovCisJfSBidWZmOwogCV9fYmUzMiAgICAgICAgICAgICAgICAgbWtleV9iZTsKLQlfX2JlMzIgICAgICAgICAgICAgICAgIHVtcl9ta2V5X2JlOwogCiAJc3RydWN0IGRldmljZSAgICAgICAgICpwZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlICAgICAqbmV0ZGV2OwogCXN0cnVjdCBtbHg1ZV90c3RhbXAgICAqdHN0YW1wOwogCXN0cnVjdCBtbHg1ZV9ycV9zdGF0cyAgc3RhdHM7CiAJc3RydWN0IG1seDVlX2NxICAgICAgICBjcTsKKwlzdHJ1Y3QgbWx4NWVfcGFnZV9jYWNoZSBwYWdlX2NhY2hlOworCiAJbWx4NWVfZnBfaGFuZGxlX3J4X2NxZSBoYW5kbGVfcnhfY3FlOwogCW1seDVlX2ZwX2FsbG9jX3dxZSAgICAgYWxsb2Nfd3FlOwogCW1seDVlX2ZwX2RlYWxsb2Nfd3FlICAgZGVhbGxvY193cWU7CkBAIC0zMDYsNiArMzQ3LDcgQEAKIAlpbnQgICAgICAgICAgICAgICAgICAgIGl4OwogCiAJc3RydWN0IG1seDVlX3J4X2FtICAgICBhbTsgLyogQWRhcHRpdmUgTW9kZXJhdGlvbiAqLworCXN0cnVjdCBicGZfcHJvZyAgICAgICAqeGRwX3Byb2c7CiAKIAkvKiBjb250cm9sICovCiAJc3RydWN0IG1seDVfd3FfY3RybCAgICB3cV9jdHJsOwpAQCAtMzE5LDMyICszNjEsMTUgQEAKIAogc3RydWN0IG1seDVlX3Vtcl9kbWFfaW5mbyB7CiAJX19iZTY0ICAgICAgICAgICAgICAgICptdHQ7Ci0JX19iZTY0ICAgICAgICAgICAgICAgICptdHRfbm9fYWxpZ247CiAJZG1hX2FkZHJfdCAgICAgICAgICAgICBtdHRfYWRkcjsKLQlzdHJ1Y3QgbWx4NWVfZG1hX2luZm8gKmRtYV9pbmZvOworCXN0cnVjdCBtbHg1ZV9kbWFfaW5mbyAgZG1hX2luZm9bTUxYNV9NUFdSUV9QQUdFU19QRVJfV1FFXTsKKwlzdHJ1Y3QgbWx4NWVfdW1yX3dxZSAgIHdxZTsKIH07CiAKIHN0cnVjdCBtbHg1ZV9tcHdfaW5mbyB7Ci0JdW5pb24gewotCQlzdHJ1Y3QgbWx4NWVfZG1hX2luZm8gICAgIGRtYV9pbmZvOwotCQlzdHJ1Y3QgbWx4NWVfdW1yX2RtYV9pbmZvIHVtcjsKLQl9OworCXN0cnVjdCBtbHg1ZV91bXJfZG1hX2luZm8gdW1yOwogCXUxNiBjb25zdW1lZF9zdHJpZGVzOwogCXUxNiBza2JzX2ZyYWdzW01MWDVfTVBXUlFfUEFHRVNfUEVSX1dRRV07Ci0KLQl2b2lkICgqZG1hX3ByZV9zeW5jKShzdHJ1Y3QgZGV2aWNlICpwZGV2LAotCQkJICAgICBzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpLAotCQkJICAgICB1MzIgd3FlX29mZnNldCwgdTMyIGxlbik7Ci0Jdm9pZCAoKmFkZF9za2JfZnJhZykoc3RydWN0IG1seDVlX3JxICpycSwKLQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgc3RydWN0IG1seDVlX21wd19pbmZvICp3aSwKLQkJCSAgICAgdTMyIHBhZ2VfaWR4LCB1MzIgZnJhZ19vZmZzZXQsIHUzMiBsZW4pOwotCXZvaWQgKCpjb3B5X3NrYl9oZWFkZXIpKHN0cnVjdCBkZXZpY2UgKnBkZXYsCi0JCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQlzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpLAotCQkJCXUzMiBwYWdlX2lkeCwgdTMyIG9mZnNldCwKLQkJCQl1MzIgaGVhZGxlbik7Ci0Jdm9pZCAoKmZyZWVfd3FlKShzdHJ1Y3QgbWx4NWVfcnEgKnJxLCBzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpKTsKIH07CiAKIHN0cnVjdCBtbHg1ZV90eF93cWVfaW5mbyB7CkBAIC0zNjUsMTYgKzM5MCwyMSBAQAogfTsKIAogZW51bSB7Ci0JTUxYNUVfU1FfU1RBVEVfV0FLRV9UWFFfRU5BQkxFLAorCU1MWDVFX1NRX1NUQVRFX0ZMVVNILAogCU1MWDVFX1NRX1NUQVRFX0JGX0VOQUJMRSwKLQlNTFg1RV9TUV9TVEFURV9UWF9USU1FT1VULAogfTsKIAotc3RydWN0IG1seDVlX2ljb193cWVfaW5mbyB7CitzdHJ1Y3QgbWx4NWVfc3Ffd3FlX2luZm8gewogCXU4ICBvcGNvZGU7CiAJdTggIG51bV93cWViYnM7CiB9OwogCitlbnVtIG1seDVlX3NxX3R5cGUgeworCU1MWDVFX1NRX1RYUSwKKwlNTFg1RV9TUV9JQ08sCisJTUxYNUVfU1FfWERQCit9OworCiBzdHJ1Y3QgbWx4NWVfc3EgewogCS8qIGRhdGEgcGF0aCAqLwogCkBAIC0zOTIsMTAgKzQyMiwyMCBAQAogCiAJc3RydWN0IG1seDVlX2NxICAgICAgICAgICAgY3E7CiAKLQkvKiBwb2ludGVycyB0byBwZXIgcGFja2V0IGluZm86IHdyaXRlQHhtaXQsIHJlYWRAY29tcGxldGlvbiAqLwotCXN0cnVjdCBza19idWZmICAgICAgICAgICAqKnNrYjsKLQlzdHJ1Y3QgbWx4NWVfc3FfZG1hICAgICAgICpkbWFfZmlmbzsKLQlzdHJ1Y3QgbWx4NWVfdHhfd3FlX2luZm8gICp3cWVfaW5mbzsKKwkvKiBwb2ludGVycyB0byBwZXIgdHggZWxlbWVudCBpbmZvOiB3cml0ZUB4bWl0LCByZWFkQGNvbXBsZXRpb24gKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAgKipza2I7CisJCQlzdHJ1Y3QgbWx4NWVfc3FfZG1hICAgICAgICpkbWFfZmlmbzsKKwkJCXN0cnVjdCBtbHg1ZV90eF93cWVfaW5mbyAgKndxZV9pbmZvOworCQl9IHR4cTsKKwkJc3RydWN0IG1seDVlX3NxX3dxZV9pbmZvICppY29fd3FlOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IG1seDVlX3NxX3dxZV9pbmZvICAqd3FlX2luZm87CisJCQlzdHJ1Y3QgbWx4NWVfZG1hX2luZm8gICAgICpkaTsKKwkJCWJvb2wgICAgICAgICAgICAgICAgICAgICAgIGRvb3JiZWxsOworCQl9IHhkcDsKKwl9IGRiOwogCiAJLyogcmVhZCBvbmx5ICovCiAJc3RydWN0IG1seDVfd3FfY3ljICAgICAgICAgd3E7CkBAIC00MTcsOCArNDU3LDggQEAKIAlzdHJ1Y3QgbWx4NV91YXIgICAgICAgICAgICB1YXI7CiAJc3RydWN0IG1seDVlX2NoYW5uZWwgICAgICAqY2hhbm5lbDsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICB0YzsKLQlzdHJ1Y3QgbWx4NWVfaWNvX3dxZV9pbmZvICppY29fd3FlX2luZm87CiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZV9saW1pdDsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOwogfSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCiBzdGF0aWMgaW5saW5lIGJvb2wgbWx4NWVfc3FfaGFzX3Jvb21fZm9yKHN0cnVjdCBtbHg1ZV9zcSAqc3EsIHUxNiBuKQpAQCAtNDM0LDggKzQ3NCwxMCBAQAogc3RydWN0IG1seDVlX2NoYW5uZWwgewogCS8qIGRhdGEgcGF0aCAqLwogCXN0cnVjdCBtbHg1ZV9ycSAgICAgICAgICAgIHJxOworCXN0cnVjdCBtbHg1ZV9zcSAgICAgICAgICAgIHhkcF9zcTsKIAlzdHJ1Y3QgbWx4NWVfc3EgICAgICAgICAgICBzcVtNTFg1RV9NQVhfTlVNX1RDXTsKIAlzdHJ1Y3QgbWx4NWVfc3EgICAgICAgICAgICBpY29zcTsgICAvKiBpbnRlcm5hbCBjb250cm9sIG9wZXJhdGlvbnMgKi8KKwlib29sICAgICAgICAgICAgICAgICAgICAgICB4ZHA7CiAJc3RydWN0IG5hcGlfc3RydWN0ICAgICAgICAgbmFwaTsKIAlzdHJ1Y3QgZGV2aWNlICAgICAgICAgICAgICpwZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICAgKm5ldGRldjsKQEAgLTYxNyw2ICs2NTksNyBAQAogCS8qIHByaXYgZGF0YSBwYXRoIGZpZWxkcyAtIHN0YXJ0ICovCiAJc3RydWN0IG1seDVlX3NxICAgICAgICAgICAgKip0eHFfdG9fc3FfbWFwOwogCWludCBjaGFubmVsdGNfdG9fdHhxX21hcFtNTFg1RV9NQVhfTlVNX0NIQU5ORUxTXVtNTFg1RV9NQVhfTlVNX1RDXTsKKwlzdHJ1Y3QgYnBmX3Byb2cgKnhkcF9wcm9nOwogCS8qIHByaXYgZGF0YSBwYXRoIGZpZWxkcyAtIGVuZCAqLwogCiAJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgc3RhdGU7CkBAIC02NTEsNDAgKzY5NCw2IEBACiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAqcHByaXY7CiB9OwogCi1lbnVtIG1seDVlX2xpbmtfbW9kZSB7Ci0JTUxYNUVfMTAwMEJBU0VfQ1hfU0dNSUkJID0gMCwKLQlNTFg1RV8xMDAwQkFTRV9LWAkgPSAxLAotCU1MWDVFXzEwR0JBU0VfQ1g0CSA9IDIsCi0JTUxYNUVfMTBHQkFTRV9LWDQJID0gMywKLQlNTFg1RV8xMEdCQVNFX0tSCSA9IDQsCi0JTUxYNUVfMjBHQkFTRV9LUjIJID0gNSwKLQlNTFg1RV80MEdCQVNFX0NSNAkgPSA2LAotCU1MWDVFXzQwR0JBU0VfS1I0CSA9IDcsCi0JTUxYNUVfNTZHQkFTRV9SNAkgPSA4LAotCU1MWDVFXzEwR0JBU0VfQ1IJID0gMTIsCi0JTUxYNUVfMTBHQkFTRV9TUgkgPSAxMywKLQlNTFg1RV8xMEdCQVNFX0VSCSA9IDE0LAotCU1MWDVFXzQwR0JBU0VfU1I0CSA9IDE1LAotCU1MWDVFXzQwR0JBU0VfTFI0CSA9IDE2LAotCU1MWDVFXzUwR0JBU0VfU1IyCSA9IDE4LAotCU1MWDVFXzEwMEdCQVNFX0NSNAkgPSAyMCwKLQlNTFg1RV8xMDBHQkFTRV9TUjQJID0gMjEsCi0JTUxYNUVfMTAwR0JBU0VfS1I0CSA9IDIyLAotCU1MWDVFXzEwMEdCQVNFX0xSNAkgPSAyMywKLQlNTFg1RV8xMDBCQVNFX1RYCSA9IDI0LAotCU1MWDVFXzEwMDBCQVNFX1QJID0gMjUsCi0JTUxYNUVfMTBHQkFTRV9UCQkgPSAyNiwKLQlNTFg1RV8yNUdCQVNFX0NSCSA9IDI3LAotCU1MWDVFXzI1R0JBU0VfS1IJID0gMjgsCi0JTUxYNUVfMjVHQkFTRV9TUgkgPSAyOSwKLQlNTFg1RV81MEdCQVNFX0NSMgkgPSAzMCwKLQlNTFg1RV81MEdCQVNFX0tSMgkgPSAzMSwKLQlNTFg1RV9MSU5LX01PREVTX05VTUJFUiwKLX07Ci0KLSNkZWZpbmUgTUxYNUVfUFJPVF9NQVNLKGxpbmtfbW9kZSkgKDEgPDwgbGlua19tb2RlKQotCi0KIHZvaWQgbWx4NWVfYnVpbGRfcHR5czJldGh0b29sX21hcCh2b2lkKTsKIAogdm9pZCBtbHg1ZV9zZW5kX25vcChzdHJ1Y3QgbWx4NWVfc3EgKnNxLCBib29sIG5vdGlmeV9odyk7CkBAIC02OTcsMzEgKzcwNiwxOSBAQAogaW50IG1seDVlX25hcGlfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpOwogYm9vbCBtbHg1ZV9wb2xsX3R4X2NxKHN0cnVjdCBtbHg1ZV9jcSAqY3EsIGludCBuYXBpX2J1ZGdldCk7CiBpbnQgbWx4NWVfcG9sbF9yeF9jcShzdHJ1Y3QgbWx4NWVfY3EgKmNxLCBpbnQgYnVkZ2V0KTsKLXZvaWQgbWx4NWVfZnJlZV90eF9kZXNjcyhzdHJ1Y3QgbWx4NWVfc3EgKnNxKTsKLXZvaWQgbWx4NWVfZnJlZV9yeF9kZXNjcyhzdHJ1Y3QgbWx4NWVfcnEgKnJxKTsKK3ZvaWQgbWx4NWVfZnJlZV9zcV9kZXNjcyhzdHJ1Y3QgbWx4NWVfc3EgKnNxKTsKIAordm9pZCBtbHg1ZV9wYWdlX3JlbGVhc2Uoc3RydWN0IG1seDVlX3JxICpycSwgc3RydWN0IG1seDVlX2RtYV9pbmZvICpkbWFfaW5mbywKKwkJCWJvb2wgcmVjeWNsZSk7CiB2b2lkIG1seDVlX2hhbmRsZV9yeF9jcWUoc3RydWN0IG1seDVlX3JxICpycSwgc3RydWN0IG1seDVfY3FlNjQgKmNxZSk7CiB2b2lkIG1seDVlX2hhbmRsZV9yeF9jcWVfbXB3cnEoc3RydWN0IG1seDVlX3JxICpycSwgc3RydWN0IG1seDVfY3FlNjQgKmNxZSk7CiBib29sIG1seDVlX3Bvc3Rfcnhfd3FlcyhzdHJ1Y3QgbWx4NWVfcnEgKnJxKTsKIGludCBtbHg1ZV9hbGxvY19yeF93cWUoc3RydWN0IG1seDVlX3JxICpycSwgc3RydWN0IG1seDVlX3J4X3dxZSAqd3FlLCB1MTYgaXgpOwotaW50IG1seDVlX2FsbG9jX3J4X21wd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHN0cnVjdCBtbHg1ZV9yeF93cWUgKndxZSwgdTE2IGl4KTsKK2ludCBtbHg1ZV9hbGxvY19yeF9tcHdxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLCBzdHJ1Y3QgbWx4NWVfcnhfd3FlICp3cWUsCXUxNiBpeCk7CiB2b2lkIG1seDVlX2RlYWxsb2Nfcnhfd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHUxNiBpeCk7CiB2b2lkIG1seDVlX2RlYWxsb2NfcnhfbXB3cWUoc3RydWN0IG1seDVlX3JxICpycSwgdTE2IGl4KTsKLXZvaWQgbWx4NWVfcG9zdF9yeF9mcmFnbWVudGVkX21wd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEpOwotdm9pZCBtbHg1ZV9jb21wbGV0ZV9yeF9saW5lYXJfbXB3cWUoc3RydWN0IG1seDVlX3JxICpycSwKLQkJCQkgICAgc3RydWN0IG1seDVfY3FlNjQgKmNxZSwKLQkJCQkgICAgdTE2IGJ5dGVfY250LAotCQkJCSAgICBzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpLAotCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXZvaWQgbWx4NWVfY29tcGxldGVfcnhfZnJhZ21lbnRlZF9tcHdxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLAotCQkJCQlzdHJ1Y3QgbWx4NV9jcWU2NCAqY3FlLAotCQkJCQl1MTYgYnl0ZV9jbnQsCi0JCQkJCXN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2ksCi0JCQkJCXN0cnVjdCBza19idWZmICpza2IpOwotdm9pZCBtbHg1ZV9mcmVlX3J4X2xpbmVhcl9tcHdxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLAotCQkJCXN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2kpOwotdm9pZCBtbHg1ZV9mcmVlX3J4X2ZyYWdtZW50ZWRfbXB3cWUoc3RydWN0IG1seDVlX3JxICpycSwKLQkJCQkgICAgc3RydWN0IG1seDVlX21wd19pbmZvICp3aSk7Cit2b2lkIG1seDVlX3Bvc3RfcnhfbXB3cWUoc3RydWN0IG1seDVlX3JxICpycSk7Cit2b2lkIG1seDVlX2ZyZWVfcnhfbXB3cWUoc3RydWN0IG1seDVlX3JxICpycSwgc3RydWN0IG1seDVlX21wd19pbmZvICp3aSk7CiBzdHJ1Y3QgbWx4NV9jcWU2NCAqbWx4NWVfZ2V0X2NxZShzdHJ1Y3QgbWx4NWVfY3EgKmNxKTsKIAogdm9pZCBtbHg1ZV9yeF9hbShzdHJ1Y3QgbWx4NWVfcnEgKnJxKTsKQEAgLTgwOCwxNyArODA1LDE4IEBACiAJbWx4NV9jcV9hcm0obWNxLCBNTFg1X0NRX0RCX1JFUV9OT1QsIG1jcS0+dWFyLT5tYXAsIE5VTEwsIGNxLT53cS5jYyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdTMyIG1seDVlX2dldF93cWVfbXR0X29mZnNldChzdHJ1Y3QgbWx4NWVfcnEgKnJxLCB1MTYgd3FlX2l4KQoreworCXJldHVybiBycS0+bXB3cWUubXR0X29mZnNldCArCisJCXdxZV9peCAqIEFMSUdOKE1MWDVfTVBXUlFfUEFHRVNfUEVSX1dRRSwgOCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IG1seDVlX2dldF9tYXhfbnVtX2NoYW5uZWxzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2KQogewogCXJldHVybiBtaW5fdChpbnQsIG1kZXYtPnByaXYuZXFfdGFibGUubnVtX2NvbXBfdmVjdG9ycywKIAkJICAgICBNTFg1RV9NQVhfTlVNX0NIQU5ORUxTKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbWx4NWVfZ2V0X210dF9vY3R3KGludCBucGFnZXMpCi17Ci0JcmV0dXJuIEFMSUdOKG5wYWdlcywgOCkgLyAyOwotfQotCiBleHRlcm4gY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIG1seDVlX2V0aHRvb2xfb3BzOwogI2lmZGVmIENPTkZJR19NTFg1X0NPUkVfRU5fRENCCiBleHRlcm4gY29uc3Qgc3RydWN0IGRjYm5sX3J0bmxfb3BzIG1seDVlX2RjYm5sX29wczsKQEAgLTg3MSw2ICs4NjksNyBAQAogaW50IG1seDVlX2FkZF9zcXNfZndkX3J1bGVzKHN0cnVjdCBtbHg1ZV9wcml2ICpwcml2KTsKIHZvaWQgbWx4NWVfcmVtb3ZlX3Nxc19md2RfcnVsZXMoc3RydWN0IG1seDVlX3ByaXYgKnByaXYpOwogaW50IG1seDVlX2F0dHJfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBzd2l0Y2hkZXZfYXR0ciAqYXR0cik7Cit2b2lkIG1seDVlX2hhbmRsZV9yeF9jcWVfcmVwKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHN0cnVjdCBtbHg1X2NxZTY0ICpjcWUpOwogCiBpbnQgbWx4NWVfY3JlYXRlX2RpcmVjdF9ycXRzKHN0cnVjdCBtbHg1ZV9wcml2ICpwcml2KTsKIHZvaWQgbWx4NWVfZGVzdHJveV9ycXQoc3RydWN0IG1seDVlX3ByaXYgKnByaXYsIHN0cnVjdCBtbHg1ZV9ycXQgKnJxdCk7CkBAIC04ODEsOSArODgwLDEyIEBACiBpbnQgbWx4NWVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiBpbnQgbWx4NWVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIHZvaWQgbWx4NWVfdXBkYXRlX3N0YXRzX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLXZvaWQgKm1seDVlX2NyZWF0ZV9uZXRkZXYoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsCi0JCQkgIGNvbnN0IHN0cnVjdCBtbHg1ZV9wcm9maWxlICpwcm9maWxlLCB2b2lkICpwcHJpdik7CitzdHJ1Y3QgbmV0X2RldmljZSAqbWx4NWVfY3JlYXRlX25ldGRldihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IG1seDVlX3Byb2ZpbGUgKnByb2ZpbGUsCisJCQkJICAgICAgIHZvaWQgKnBwcml2KTsKIHZvaWQgbWx4NWVfZGVzdHJveV9uZXRkZXYoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHN0cnVjdCBtbHg1ZV9wcml2ICpwcml2KTsKK2ludCBtbHg1ZV9hdHRhY2hfbmV0ZGV2KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3ZvaWQgbWx4NWVfZGV0YWNoX25ldGRldihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKgogbWx4NWVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fY2xvY2suYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9jbG9jay5jCmluZGV4IDg0N2E4ZjMuLjEzZGMzODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9jbG9jay5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9jbG9jay5jCkBAIC0yNzMsNyArMjczLDcgQEAKIAogCXRzdGFtcC0+cHRwID0gcHRwX2Nsb2NrX3JlZ2lzdGVyKCZ0c3RhbXAtPnB0cF9pbmZvLAogCQkJCQkgJnByaXYtPm1kZXYtPnBkZXYtPmRldik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKHRzdGFtcC0+cHRwKSkgeworCWlmIChJU19FUlIodHN0YW1wLT5wdHApKSB7CiAJCW1seDVfY29yZV93YXJuKHByaXYtPm1kZXYsICJwdHBfY2xvY2tfcmVnaXN0ZXIgZmFpbGVkICVsZFxuIiwKIAkJCSAgICAgICBQVFJfRVJSKHRzdGFtcC0+cHRwKSk7CiAJCXRzdGFtcC0+cHRwID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9jb21tb24uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9jb21tb24uYwppbmRleCA2NzMwNDNjLi4wMjllODU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2NvbW1vbi5jCkBAIC02MCwyNCArNjAsMjcgQEAKIHN0YXRpYyBpbnQgbWx4NWVfY3JlYXRlX21rZXkoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHUzMiBwZG4sCiAJCQkgICAgIHN0cnVjdCBtbHg1X2NvcmVfbWtleSAqbWtleSkKIHsKLQlzdHJ1Y3QgbWx4NV9jcmVhdGVfbWtleV9tYm94X2luICppbjsKKwlpbnQgaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKGNyZWF0ZV9ta2V5X2luKTsKKwl2b2lkICpta2M7CisJdTMyICppbjsKIAlpbnQgZXJyOwogCi0JaW4gPSBtbHg1X3Z6YWxsb2Moc2l6ZW9mKCppbikpOworCWluID0gbWx4NV92emFsbG9jKGlubGVuKTsKIAlpZiAoIWluKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWluLT5zZWcuZmxhZ3MgPSBNTFg1X1BFUk1fTE9DQUxfV1JJVEUgfAotCQkJTUxYNV9QRVJNX0xPQ0FMX1JFQUQgIHwKLQkJCU1MWDVfQUNDRVNTX01PREVfUEE7Ci0JaW4tPnNlZy5mbGFnc19wZCA9IGNwdV90b19iZTMyKHBkbiB8IE1MWDVfTUtFWV9MRU42NCk7Ci0JaW4tPnNlZy5xcG5fbWtleTdfMCA9IGNwdV90b19iZTMyKDB4ZmZmZmZmIDw8IDgpOworCW1rYyA9IE1MWDVfQUREUl9PRihjcmVhdGVfbWtleV9pbiwgaW4sIG1lbW9yeV9rZXlfbWtleV9lbnRyeSk7CisJTUxYNV9TRVQobWtjLCBta2MsIGFjY2Vzc19tb2RlLCBNTFg1X01LQ19BQ0NFU1NfTU9ERV9QQSk7CisJTUxYNV9TRVQobWtjLCBta2MsIGx3LCAxKTsKKwlNTFg1X1NFVChta2MsIG1rYywgbHIsIDEpOwogCi0JZXJyID0gbWx4NV9jb3JlX2NyZWF0ZV9ta2V5KG1kZXYsIG1rZXksIGluLCBzaXplb2YoKmluKSwgTlVMTCwgTlVMTCwKLQkJCQkgICAgTlVMTCk7CisJTUxYNV9TRVQobWtjLCBta2MsIHBkLCBwZG4pOworCU1MWDVfU0VUKG1rYywgbWtjLCBsZW5ndGg2NCwgMSk7CisJTUxYNV9TRVQobWtjLCBta2MsIHFwbiwgMHhmZmZmZmYpOworCisJZXJyID0gbWx4NV9jb3JlX2NyZWF0ZV9ta2V5KG1kZXYsIG1rZXksIGluLCBpbmxlbik7CiAKIAlrdmZyZWUoaW4pOwotCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTM5LDcgKzE0Miw3IEBACiAJc3RydWN0IG1seDVlX3RpciAqdGlyOwogCXZvaWQgKmluOwogCWludCBpbmxlbjsKLQlpbnQgZXJyOworCWludCBlcnIgPSAwOwogCiAJaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKG1vZGlmeV90aXJfaW4pOwogCWluID0gbWx4NV92emFsbG9jKGlubGVuKTsKQEAgLTE1MSwxMCArMTU0LDExIEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aXIsICZtZGV2LT5tbHg1ZV9yZXMudGQudGlyc19saXN0LCBsaXN0KSB7CiAJCWVyciA9IG1seDVfY29yZV9tb2RpZnlfdGlyKG1kZXYsIHRpci0+dGlybiwgaW4sIGlubGVuKTsKIAkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7CisJCQlnb3RvIG91dDsKIAl9CiAKK291dDoKIAlrdmZyZWUoaW4pOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9kY2JubC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2RjYm5sLmMKaW5kZXggY2FhOWEzYy4uNzYyYWYxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2RjYm5sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2RjYm5sLmMKQEAgLTEyNywyOSArMTI3LDQwIEBACiAJcmV0dXJuIG1seDVfc2V0X3BvcnRfdGNfYndfYWxsb2MobWRldiwgdGNfdHhfYncpOwogfQogCi1zdGF0aWMgaW50IG1seDVlX2RiY25sX3ZhbGlkYXRlX2V0cyhzdHJ1Y3QgaWVlZV9ldHMgKmV0cykKK3N0YXRpYyBpbnQgbWx4NWVfZGJjbmxfdmFsaWRhdGVfZXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJICAgIHN0cnVjdCBpZWVlX2V0cyAqZXRzKQogewogCWludCBid19zdW0gPSAwOwogCWludCBpOwogCiAJLyogVmFsaWRhdGUgUHJpb3JpdHkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgSUVFRV84MDIxUUFaX01BWF9UQ1M7IGkrKykgewotCQlpZiAoZXRzLT5wcmlvX3RjW2ldID49IE1MWDVFX01BWF9QUklPUklUWSkKKwkJaWYgKGV0cy0+cHJpb190Y1tpXSA+PSBNTFg1RV9NQVhfUFJJT1JJVFkpIHsKKwkJCW5ldGRldl9lcnIobmV0ZGV2LAorCQkJCSAgICJGYWlsZWQgdG8gdmFsaWRhdGUgRVRTOiBwcmlvcml0eSB2YWx1ZSBncmVhdGVyIHRoYW4gbWF4KCVkKVxuIiwKKwkJCQkgICAgTUxYNUVfTUFYX1BSSU9SSVRZKTsKIAkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJfQogCiAJLyogVmFsaWRhdGUgQmFuZHdpZHRoIFN1bSAqLwogCWZvciAoaSA9IDA7IGkgPCBJRUVFXzgwMjFRQVpfTUFYX1RDUzsgaSsrKSB7CiAJCWlmIChldHMtPnRjX3RzYVtpXSA9PSBJRUVFXzgwMjFRQVpfVFNBX0VUUykgewotCQkJaWYgKCFldHMtPnRjX3R4X2J3W2ldKQorCQkJaWYgKCFldHMtPnRjX3R4X2J3W2ldKSB7CisJCQkJbmV0ZGV2X2VycihuZXRkZXYsCisJCQkJCSAgICJGYWlsZWQgdG8gdmFsaWRhdGUgRVRTOiBCVyAwIGlzIGlsbGVnYWxcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQogCiAJCQlid19zdW0gKz0gZXRzLT50Y190eF9id1tpXTsKIAkJfQogCX0KIAotCWlmIChid19zdW0gIT0gMCAmJiBid19zdW0gIT0gMTAwKQorCWlmIChid19zdW0gIT0gMCAmJiBid19zdW0gIT0gMTAwKSB7CisJCW5ldGRldl9lcnIobmV0ZGV2LAorCQkJICAgIkZhaWxlZCB0byB2YWxpZGF0ZSBFVFM6IEJXIHN1bSBpcyBpbGxlZ2FsXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0xNTksNyArMTcwLDcgQEAKIAlzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJaW50IGVycjsKIAotCWVyciA9IG1seDVlX2RiY25sX3ZhbGlkYXRlX2V0cyhldHMpOworCWVyciA9IG1seDVlX2RiY25sX3ZhbGlkYXRlX2V0cyhuZXRkZXYsIGV0cyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9ldGh0b29sLmMKaW5kZXggNGEzNzU3ZS4uMjdmZjQwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fZXRodG9vbC5jCkBAIC0zMzEsNyArMzMxLDcgQEAKIAlpZiAobWx4NWVfcXVlcnlfZ2xvYmFsX3BhdXNlX2NvbWJpbmVkKHByaXYpKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBOVU1fUFBPUlRfUEVSX1BSSU9fUEZDX0NPVU5URVJTOyBpKyspIHsKIAkJCWRhdGFbaWR4KytdID0gTUxYNUVfUkVBRF9DVFI2NF9CRSgmcHJpdi0+c3RhdHMucHBvcnQucGVyX3ByaW9fY291bnRlcnNbMF0sCi0JCQkJCQkJICBwcG9ydF9wZXJfcHJpb19wZmNfc3RhdHNfZGVzYywgMCk7CisJCQkJCQkJICBwcG9ydF9wZXJfcHJpb19wZmNfc3RhdHNfZGVzYywgaSk7CiAJCX0KIAl9CiAKQEAgLTM1MiwxNSArMzUyLDYxIEBACiAJCQkJCQkJCSAgIHNxX3N0YXRzX2Rlc2MsIGopOwogfQogCitzdGF0aWMgdTMyIG1seDVlX3J4X3dxZXNfdG9fcGFja2V0cyhzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdiwgaW50IHJxX3dxX3R5cGUsCisJCQkJICAgIGludCBudW1fd3FlKQoreworCWludCBwYWNrZXRzX3Blcl93cWU7CisJaW50IHN0cmlkZV9zaXplOworCWludCBudW1fc3RyaWRlczsKKwlpbnQgd3FlX3NpemU7CisKKwlpZiAocnFfd3FfdHlwZSAhPSBNTFg1X1dRX1RZUEVfTElOS0VEX0xJU1RfU1RSSURJTkdfUlEpCisJCXJldHVybiBudW1fd3FlOworCisJc3RyaWRlX3NpemUgPSAxIDw8IHByaXYtPnBhcmFtcy5tcHdxZV9sb2dfc3RyaWRlX3N6OworCW51bV9zdHJpZGVzID0gMSA8PCBwcml2LT5wYXJhbXMubXB3cWVfbG9nX251bV9zdHJpZGVzOworCXdxZV9zaXplID0gc3RyaWRlX3NpemUgKiBudW1fc3RyaWRlczsKKworCXBhY2tldHNfcGVyX3dxZSA9IHdxZV9zaXplIC8KKwkJCSAgQUxJR04oRVRIX0RBVEFfTEVOLCBzdHJpZGVfc2l6ZSk7CisJcmV0dXJuICgxIDw8IChvcmRlcl9iYXNlXzIobnVtX3dxZSAqIHBhY2tldHNfcGVyX3dxZSkgLSAxKSk7Cit9CisKK3N0YXRpYyB1MzIgbWx4NWVfcGFja2V0c190b19yeF93cWVzKHN0cnVjdCBtbHg1ZV9wcml2ICpwcml2LCBpbnQgcnFfd3FfdHlwZSwKKwkJCQkgICAgaW50IG51bV9wYWNrZXRzKQoreworCWludCBwYWNrZXRzX3Blcl93cWU7CisJaW50IHN0cmlkZV9zaXplOworCWludCBudW1fc3RyaWRlczsKKwlpbnQgd3FlX3NpemU7CisJaW50IG51bV93cWVzOworCisJaWYgKHJxX3dxX3R5cGUgIT0gTUxYNV9XUV9UWVBFX0xJTktFRF9MSVNUX1NUUklESU5HX1JRKQorCQlyZXR1cm4gbnVtX3BhY2tldHM7CisKKwlzdHJpZGVfc2l6ZSA9IDEgPDwgcHJpdi0+cGFyYW1zLm1wd3FlX2xvZ19zdHJpZGVfc3o7CisJbnVtX3N0cmlkZXMgPSAxIDw8IHByaXYtPnBhcmFtcy5tcHdxZV9sb2dfbnVtX3N0cmlkZXM7CisJd3FlX3NpemUgPSBzdHJpZGVfc2l6ZSAqIG51bV9zdHJpZGVzOworCisJbnVtX3BhY2tldHMgPSAoMSA8PCBvcmRlcl9iYXNlXzIobnVtX3BhY2tldHMpKTsKKworCXBhY2tldHNfcGVyX3dxZSA9IHdxZV9zaXplIC8KKwkJCSAgQUxJR04oRVRIX0RBVEFfTEVOLCBzdHJpZGVfc2l6ZSk7CisJbnVtX3dxZXMgPSBESVZfUk9VTkRfVVAobnVtX3BhY2tldHMsIHBhY2tldHNfcGVyX3dxZSk7CisJcmV0dXJuIDEgPDwgKG9yZGVyX2Jhc2VfMihudW1fd3FlcykpOworfQorCiBzdGF0aWMgdm9pZCBtbHg1ZV9nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpwYXJhbSkKIHsKIAlzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHJxX3dxX3R5cGUgPSBwcml2LT5wYXJhbXMucnFfd3FfdHlwZTsKIAotCXBhcmFtLT5yeF9tYXhfcGVuZGluZyA9IDEgPDwgbWx4NV9tYXhfbG9nX3JxX3NpemUocnFfd3FfdHlwZSk7CisJcGFyYW0tPnJ4X21heF9wZW5kaW5nID0gbWx4NWVfcnhfd3Flc190b19wYWNrZXRzKHByaXYsIHJxX3dxX3R5cGUsCisJCQkJCQkJIDEgPDwgbWx4NV9tYXhfbG9nX3JxX3NpemUocnFfd3FfdHlwZSkpOwogCXBhcmFtLT50eF9tYXhfcGVuZGluZyA9IDEgPDwgTUxYNUVfUEFSQU1TX01BWElNVU1fTE9HX1NRX1NJWkU7Ci0JcGFyYW0tPnJ4X3BlbmRpbmcgICAgID0gMSA8PCBwcml2LT5wYXJhbXMubG9nX3JxX3NpemU7CisJcGFyYW0tPnJ4X3BlbmRpbmcgPSBtbHg1ZV9yeF93cWVzX3RvX3BhY2tldHMocHJpdiwgcnFfd3FfdHlwZSwKKwkJCQkJCSAgICAgMSA8PCBwcml2LT5wYXJhbXMubG9nX3JxX3NpemUpOwogCXBhcmFtLT50eF9wZW5kaW5nICAgICA9IDEgPDwgcHJpdi0+cGFyYW1zLmxvZ19zcV9zaXplOwogfQogCkBAIC0zNzAsOSArNDE2LDEzIEBACiAJc3RydWN0IG1seDVlX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWJvb2wgd2FzX29wZW5lZDsKIAlpbnQgcnFfd3FfdHlwZSA9IHByaXYtPnBhcmFtcy5ycV93cV90eXBlOworCXUzMiByeF9wZW5kaW5nX3dxZXM7CisJdTMyIG1pbl9ycV9zaXplOworCXUzMiBtYXhfcnFfc2l6ZTsKIAl1MTYgbWluX3J4X3dxZXM7CiAJdTggbG9nX3JxX3NpemU7CiAJdTggbG9nX3NxX3NpemU7CisJdTMyIG51bV9tdHRzOwogCWludCBlcnIgPSAwOwogCiAJaWYgKHBhcmFtLT5yeF9qdW1ib19wZW5kaW5nKSB7CkBAIC0zODUsMTggKzQzNSwzNiBAQAogCQkJICAgIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmIChwYXJhbS0+cnhfcGVuZGluZyA8ICgxIDw8IG1seDVfbWluX2xvZ19ycV9zaXplKHJxX3dxX3R5cGUpKSkgeworCisJbWluX3JxX3NpemUgPSBtbHg1ZV9yeF93cWVzX3RvX3BhY2tldHMocHJpdiwgcnFfd3FfdHlwZSwKKwkJCQkJICAgICAgIDEgPDwgbWx4NV9taW5fbG9nX3JxX3NpemUocnFfd3FfdHlwZSkpOworCW1heF9ycV9zaXplID0gbWx4NWVfcnhfd3Flc190b19wYWNrZXRzKHByaXYsIHJxX3dxX3R5cGUsCisJCQkJCSAgICAgICAxIDw8IG1seDVfbWF4X2xvZ19ycV9zaXplKHJxX3dxX3R5cGUpKTsKKwlyeF9wZW5kaW5nX3dxZXMgPSBtbHg1ZV9wYWNrZXRzX3RvX3J4X3dxZXMocHJpdiwgcnFfd3FfdHlwZSwKKwkJCQkJCSAgIHBhcmFtLT5yeF9wZW5kaW5nKTsKKworCWlmIChwYXJhbS0+cnhfcGVuZGluZyA8IG1pbl9ycV9zaXplKSB7CiAJCW5ldGRldl9pbmZvKGRldiwgIiVzOiByeF9wZW5kaW5nICglZCkgPCBtaW4gKCVkKVxuIiwKIAkJCSAgICBfX2Z1bmNfXywgcGFyYW0tPnJ4X3BlbmRpbmcsCi0JCQkgICAgMSA8PCBtbHg1X21pbl9sb2dfcnFfc2l6ZShycV93cV90eXBlKSk7CisJCQkgICAgbWluX3JxX3NpemUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKHBhcmFtLT5yeF9wZW5kaW5nID4gKDEgPDwgbWx4NV9tYXhfbG9nX3JxX3NpemUocnFfd3FfdHlwZSkpKSB7CisJaWYgKHBhcmFtLT5yeF9wZW5kaW5nID4gbWF4X3JxX3NpemUpIHsKIAkJbmV0ZGV2X2luZm8oZGV2LCAiJXM6IHJ4X3BlbmRpbmcgKCVkKSA+IG1heCAoJWQpXG4iLAogCQkJICAgIF9fZnVuY19fLCBwYXJhbS0+cnhfcGVuZGluZywKLQkJCSAgICAxIDw8IG1seDVfbWF4X2xvZ19ycV9zaXplKHJxX3dxX3R5cGUpKTsKKwkJCSAgICBtYXhfcnFfc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKworCW51bV9tdHRzID0gTUxYNUVfUkVRVUlSRURfTVRUUyhwcml2LT5wYXJhbXMubnVtX2NoYW5uZWxzLAorCQkJCSAgICAgICByeF9wZW5kaW5nX3dxZXMpOworCWlmIChwcml2LT5wYXJhbXMucnFfd3FfdHlwZSA9PSBNTFg1X1dRX1RZUEVfTElOS0VEX0xJU1RfU1RSSURJTkdfUlEgJiYKKwkgICAgIU1MWDVFX1ZBTElEX05VTV9NVFRTKG51bV9tdHRzKSkgeworCQluZXRkZXZfaW5mbyhkZXYsICIlczogcnhfcGVuZGluZyAoJWQpIHJlcXVlc3QgY2FuJ3QgYmUgc2F0aXNmaWVkLCB0cnkgdG8gcmVkdWNlLlxuIiwKKwkJCSAgICBfX2Z1bmNfXywgcGFyYW0tPnJ4X3BlbmRpbmcpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAocGFyYW0tPnR4X3BlbmRpbmcgPCAoMSA8PCBNTFg1RV9QQVJBTVNfTUlOSU1VTV9MT0dfU1FfU0laRSkpIHsKIAkJbmV0ZGV2X2luZm8oZGV2LCAiJXM6IHR4X3BlbmRpbmcgKCVkKSA8IG1pbiAoJWQpXG4iLAogCQkJICAgIF9fZnVuY19fLCBwYXJhbS0+dHhfcGVuZGluZywKQEAgLTQxMCw5ICs0NzgsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlsb2dfcnFfc2l6ZSA9IG9yZGVyX2Jhc2VfMihwYXJhbS0+cnhfcGVuZGluZyk7CisJbG9nX3JxX3NpemUgPSBvcmRlcl9iYXNlXzIocnhfcGVuZGluZ193cWVzKTsKIAlsb2dfc3Ffc2l6ZSA9IG9yZGVyX2Jhc2VfMihwYXJhbS0+dHhfcGVuZGluZyk7Ci0JbWluX3J4X3dxZXMgPSBtbHg1X21pbl9yeF93cWVzKHJxX3dxX3R5cGUsIHBhcmFtLT5yeF9wZW5kaW5nKTsKKwltaW5fcnhfd3FlcyA9IG1seDVfbWluX3J4X3dxZXMocnFfd3FfdHlwZSwgcnhfcGVuZGluZ193cWVzKTsKIAogCWlmIChsb2dfcnFfc2l6ZSA9PSBwcml2LT5wYXJhbXMubG9nX3JxX3NpemUgJiYKIAkgICAgbG9nX3NxX3NpemUgPT0gcHJpdi0+cGFyYW1zLmxvZ19zcV9zaXplICYmCkBAIC00NTQsNiArNTIyLDcgQEAKIAl1bnNpZ25lZCBpbnQgY291bnQgPSBjaC0+Y29tYmluZWRfY291bnQ7CiAJYm9vbCBhcmZzX2VuYWJsZWQ7CiAJYm9vbCB3YXNfb3BlbmVkOworCXUzMiBudW1fbXR0czsKIAlpbnQgZXJyID0gMDsKIAogCWlmICghY291bnQpIHsKQEAgLTQ3Miw2ICs1NDEsMTQgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJbnVtX210dHMgPSBNTFg1RV9SRVFVSVJFRF9NVFRTKGNvdW50LCBCSVQocHJpdi0+cGFyYW1zLmxvZ19ycV9zaXplKSk7CisJaWYgKHByaXYtPnBhcmFtcy5ycV93cV90eXBlID09IE1MWDVfV1FfVFlQRV9MSU5LRURfTElTVF9TVFJJRElOR19SUSAmJgorCSAgICAhTUxYNUVfVkFMSURfTlVNX01UVFMobnVtX210dHMpKSB7CisJCW5ldGRldl9pbmZvKGRldiwgIiVzOiByeCBjb3VudCAoJWQpIHJlcXVlc3QgY2FuJ3QgYmUgc2F0aXNmaWVkLCB0cnkgdG8gcmVkdWNlLlxuIiwKKwkJCSAgICBfX2Z1bmNfXywgY291bnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAocHJpdi0+cGFyYW1zLm51bV9jaGFubmVscyA9PSBjb3VudCkKIAkJcmV0dXJuIDA7CiAKQEAgLTU4Miw5ICs2NTksMTAgQEAKIHN0YXRpYyB2b2lkIHB0eXMyZXRodG9vbF9zdXBwb3J0ZWRfbGluayh1bnNpZ25lZCBsb25nICpzdXBwb3J0ZWRfbW9kZXMsCiAJCQkJCXUzMiBldGhfcHJvdG9fY2FwKQogeworCXVuc2lnbmVkIGxvbmcgcHJvdG9fY2FwID0gZXRoX3Byb3RvX2NhcDsKIAlpbnQgcHJvdG87CiAKLQlmb3JfZWFjaF9zZXRfYml0KHByb3RvLCAodW5zaWduZWQgbG9uZyAqKSZldGhfcHJvdG9fY2FwLCBNTFg1RV9MSU5LX01PREVTX05VTUJFUikKKwlmb3JfZWFjaF9zZXRfYml0KHByb3RvLCAmcHJvdG9fY2FwLCBNTFg1RV9MSU5LX01PREVTX05VTUJFUikKIAkJYml0bWFwX29yKHN1cHBvcnRlZF9tb2Rlcywgc3VwcG9ydGVkX21vZGVzLAogCQkJICBwdHlzMmV0aHRvb2xfdGFibGVbcHJvdG9dLnN1cHBvcnRlZCwKIAkJCSAgX19FVEhUT09MX0xJTktfTU9ERV9NQVNLX05CSVRTKTsKQEAgLTU5Myw5ICs2NzEsMTAgQEAKIHN0YXRpYyB2b2lkIHB0eXMyZXRodG9vbF9hZHZlcl9saW5rKHVuc2lnbmVkIGxvbmcgKmFkdmVydGlzaW5nX21vZGVzLAogCQkJCSAgICB1MzIgZXRoX3Byb3RvX2NhcCkKIHsKKwl1bnNpZ25lZCBsb25nIHByb3RvX2NhcCA9IGV0aF9wcm90b19jYXA7CiAJaW50IHByb3RvOwogCi0JZm9yX2VhY2hfc2V0X2JpdChwcm90bywgKHVuc2lnbmVkIGxvbmcgKikmZXRoX3Byb3RvX2NhcCwgTUxYNUVfTElOS19NT0RFU19OVU1CRVIpCisJZm9yX2VhY2hfc2V0X2JpdChwcm90bywgJnByb3RvX2NhcCwgTUxYNUVfTElOS19NT0RFU19OVU1CRVIpCiAJCWJpdG1hcF9vcihhZHZlcnRpc2luZ19tb2RlcywgYWR2ZXJ0aXNpbmdfbW9kZXMsCiAJCQkgIHB0eXMyZXRodG9vbF90YWJsZVtwcm90b10uYWR2ZXJ0aXNlZCwKIAkJCSAgX19FVEhUT09MX0xJTktfTU9ERV9NQVNLX05CSVRTKTsKQEAgLTcyNiw3ICs4MDUsNyBAQAogewogCXN0cnVjdCBtbHg1ZV9wcml2ICpwcml2ICAgID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiA9IHByaXYtPm1kZXY7Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKHB0eXNfcmVnKV07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHB0eXNfcmVnKV0gPSB7MH07CiAJdTMyIGV0aF9wcm90b19jYXA7CiAJdTMyIGV0aF9wcm90b19hZG1pbjsKIAl1MzIgZXRoX3Byb3RvX2xwOwpAQCAtNzM2LDcgKzgxNSw2IEBACiAJaW50IGVycjsKIAogCWVyciA9IG1seDVfcXVlcnlfcG9ydF9wdHlzKG1kZXYsIG91dCwgc2l6ZW9mKG91dCksIE1MWDVfUFRZU19FTiwgMSk7Ci0KIAlpZiAoZXJyKSB7CiAJCW5ldGRldl9lcnIobmV0ZGV2LCAiJXM6IHF1ZXJ5IHBvcnQgcHR5cyBmYWlsZWQ6ICVkXG4iLAogCQkJICAgX19mdW5jX18sIGVycik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fZnMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9mcy5jCmluZGV4IDE1ODdhOWYuLjM2ZmJjNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9mcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9mcy5jCkBAIC0yOTQsNiArMjk0LDM2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIG1seDVlX2FkZF92bGFuX3J1bGVzKHN0cnVjdCBtbHg1ZV9wcml2ICpwcml2KQoreworCWludCBpOworCisJbWx4NWVfYWRkX3ZsYW5fcnVsZShwcml2LCBNTFg1RV9WTEFOX1JVTEVfVFlQRV9VTlRBR0dFRCwgMCk7CisKKwlmb3JfZWFjaF9zZXRfYml0KGksIHByaXYtPmZzLnZsYW4uYWN0aXZlX3ZsYW5zLCBWTEFOX05fVklEKSB7CisJCW1seDVlX2FkZF92bGFuX3J1bGUocHJpdiwgTUxYNUVfVkxBTl9SVUxFX1RZUEVfTUFUQ0hfVklELCBpKTsKKwl9CisKKwlpZiAocHJpdi0+ZnMudmxhbi5maWx0ZXJfZGlzYWJsZWQgJiYKKwkgICAgIShwcml2LT5uZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpKQorCQltbHg1ZV9hZGRfdmxhbl9ydWxlKHByaXYsIE1MWDVFX1ZMQU5fUlVMRV9UWVBFX0FOWV9WSUQsIDApOworfQorCitzdGF0aWMgdm9pZCBtbHg1ZV9kZWxfdmxhbl9ydWxlcyhzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdikKK3sKKwlpbnQgaTsKKworCW1seDVlX2RlbF92bGFuX3J1bGUocHJpdiwgTUxYNUVfVkxBTl9SVUxFX1RZUEVfVU5UQUdHRUQsIDApOworCisJZm9yX2VhY2hfc2V0X2JpdChpLCBwcml2LT5mcy52bGFuLmFjdGl2ZV92bGFucywgVkxBTl9OX1ZJRCkgeworCQltbHg1ZV9kZWxfdmxhbl9ydWxlKHByaXYsIE1MWDVFX1ZMQU5fUlVMRV9UWVBFX01BVENIX1ZJRCwgaSk7CisJfQorCisJaWYgKHByaXYtPmZzLnZsYW4uZmlsdGVyX2Rpc2FibGVkICYmCisJICAgICEocHJpdi0+bmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSkKKwkJbWx4NWVfZGVsX3ZsYW5fcnVsZShwcml2LCBNTFg1RV9WTEFOX1JVTEVfVFlQRV9BTllfVklELCAwKTsKK30KKwogI2RlZmluZSBtbHg1ZV9mb3JfZWFjaF9oYXNoX25vZGUoaG4sIHRtcCwgaGFzaCwgaSkgXAogCWZvciAoaSA9IDA7IGkgPCBNTFg1RV9MMl9BRERSX0hBU0hfU0laRTsgaSsrKSBcCiAJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG4sIHRtcCwgJmhhc2hbaV0sIGhsaXN0KQpAQCAtMTAyNCwxNCArMTA1NCwxMCBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2ZyZWVfZzsKIAotCWVyciA9IG1seDVlX2FkZF92bGFuX3J1bGUocHJpdiwgTUxYNUVfVkxBTl9SVUxFX1RZUEVfVU5UQUdHRUQsIDApOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2Rlc3Ryb3lfdmxhbl9mbG93X2dyb3VwczsKKwltbHg1ZV9hZGRfdmxhbl9ydWxlcyhwcml2KTsKIAogCXJldHVybiAwOwogCi1lcnJfZGVzdHJveV92bGFuX2Zsb3dfZ3JvdXBzOgotCW1seDVlX2Rlc3Ryb3lfZ3JvdXBzKGZ0KTsKIGVycl9mcmVlX2c6CiAJa2ZyZWUoZnQtPmcpOwogZXJyX2Rlc3Ryb3lfdmxhbl90YWJsZToKQEAgLTEwNDMsNiArMTA2OSw3IEBACiAKIHN0YXRpYyB2b2lkIG1seDVlX2Rlc3Ryb3lfdmxhbl90YWJsZShzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdikKIHsKKwltbHg1ZV9kZWxfdmxhbl9ydWxlcyhwcml2KTsKIAltbHg1ZV9kZXN0cm95X2Zsb3dfdGFibGUoJnByaXYtPmZzLnZsYW4uZnQpOwogfQogCkBAIC0xMTAwLDcgKzExMjcsNiBAQAogCiB2b2lkIG1seDVlX2Rlc3Ryb3lfZmxvd19zdGVlcmluZyhzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdikKIHsKLQltbHg1ZV9kZWxfdmxhbl9ydWxlKHByaXYsIE1MWDVFX1ZMQU5fUlVMRV9UWVBFX1VOVEFHR0VELCAwKTsKIAltbHg1ZV9kZXN0cm95X3ZsYW5fdGFibGUocHJpdik7CiAJbWx4NWVfZGVzdHJveV9sMl90YWJsZShwcml2KTsKIAltbHg1ZV9kZXN0cm95X3R0Y190YWJsZShwcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fbWFpbi5jCmluZGV4IDg3MGJlYTMuLjdlYWYzODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX21haW4uYwpAQCAtMzQsMTggKzM0LDEyIEBACiAjaW5jbHVkZSA8bmV0L3BrdF9jbHMuaD4KICNpbmNsdWRlIDxsaW51eC9tbHg1L2ZzLmg+CiAjaW5jbHVkZSA8bmV0L3Z4bGFuLmg+CisjaW5jbHVkZSA8bGludXgvYnBmLmg+CiAjaW5jbHVkZSAiZW4uaCIKICNpbmNsdWRlICJlbl90Yy5oIgogI2luY2x1ZGUgImVzd2l0Y2guaCIKICNpbmNsdWRlICJ2eGxhbi5oIgogCi1lbnVtIHsKLQlNTFg1X0VOX1FQX0ZMVVNIX1RJTUVPVVRfTVMJPSA1MDAwLAotCU1MWDVfRU5fUVBfRkxVU0hfTVNMRUVQX1FVQU5UCT0gMjAsCi0JTUxYNV9FTl9RUF9GTFVTSF9NQVhfSVRFUgk9IE1MWDVfRU5fUVBfRkxVU0hfVElNRU9VVF9NUyAvCi0JCQkJCSAgTUxYNV9FTl9RUF9GTFVTSF9NU0xFRVBfUVVBTlQsCi19OwotCiBzdHJ1Y3QgbWx4NWVfcnFfcGFyYW0gewogCXUzMgkJCXJxY1tNTFg1X1NUX1NaX0RXKHJxYyldOwogCXN0cnVjdCBtbHg1X3dxX3BhcmFtCXdxOwpAQCAtNTcsNyArNTEsNyBAQAogCXN0cnVjdCBtbHg1X3dxX3BhcmFtICAgICAgIHdxOwogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgIG1heF9pbmxpbmU7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgbWluX2lubGluZV9tb2RlOwotCWJvb2wgICAgICAgICAgICAgICAgICAgICAgIGljb3NxOworCWVudW0gbWx4NWVfc3FfdHlwZSAgICAgICAgIHR5cGU7CiB9OwogCiBzdHJ1Y3QgbWx4NWVfY3FfcGFyYW0gewpAQCAtNzAsMTIgKzY0LDU1IEBACiBzdHJ1Y3QgbWx4NWVfY2hhbm5lbF9wYXJhbSB7CiAJc3RydWN0IG1seDVlX3JxX3BhcmFtICAgICAgcnE7CiAJc3RydWN0IG1seDVlX3NxX3BhcmFtICAgICAgc3E7CisJc3RydWN0IG1seDVlX3NxX3BhcmFtICAgICAgeGRwX3NxOwogCXN0cnVjdCBtbHg1ZV9zcV9wYXJhbSAgICAgIGljb3NxOwogCXN0cnVjdCBtbHg1ZV9jcV9wYXJhbSAgICAgIHJ4X2NxOwogCXN0cnVjdCBtbHg1ZV9jcV9wYXJhbSAgICAgIHR4X2NxOwogCXN0cnVjdCBtbHg1ZV9jcV9wYXJhbSAgICAgIGljb3NxX2NxOwogfTsKIAorc3RhdGljIGJvb2wgbWx4NWVfY2hlY2tfZnJhZ21lbnRlZF9zdHJpZGluZ19ycV9jYXAoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYpCit7CisJcmV0dXJuIE1MWDVfQ0FQX0dFTihtZGV2LCBzdHJpZGluZ19ycSkgJiYKKwkJTUxYNV9DQVBfR0VOKG1kZXYsIHVtcl9wdHJfcmxreSkgJiYKKwkJTUxYNV9DQVBfRVRIKG1kZXYsIHJlZ191bXJfc3EpOworfQorCitzdGF0aWMgdm9pZCBtbHg1ZV9zZXRfcnFfdHlwZV9wYXJhbXMoc3RydWN0IG1seDVlX3ByaXYgKnByaXYsIHU4IHJxX3R5cGUpCit7CisJcHJpdi0+cGFyYW1zLnJxX3dxX3R5cGUgPSBycV90eXBlOworCXN3aXRjaCAocHJpdi0+cGFyYW1zLnJxX3dxX3R5cGUpIHsKKwljYXNlIE1MWDVfV1FfVFlQRV9MSU5LRURfTElTVF9TVFJJRElOR19SUToKKwkJcHJpdi0+cGFyYW1zLmxvZ19ycV9zaXplID0gTUxYNUVfUEFSQU1TX0RFRkFVTFRfTE9HX1JRX1NJWkVfTVBXOworCQlwcml2LT5wYXJhbXMubXB3cWVfbG9nX3N0cmlkZV9zeiA9IHByaXYtPnBhcmFtcy5yeF9jcWVfY29tcHJlc3MgPworCQkJTUxYNV9NUFdSUV9MT0dfU1RSSURFX1NJWkVfQ1FFX0NPTVBSRVNTIDoKKwkJCU1MWDVfTVBXUlFfTE9HX1NUUklERV9TSVpFOworCQlwcml2LT5wYXJhbXMubXB3cWVfbG9nX251bV9zdHJpZGVzID0gTUxYNV9NUFdSUV9MT0dfV1FFX1NaIC0KKwkJCXByaXYtPnBhcmFtcy5tcHdxZV9sb2dfc3RyaWRlX3N6OworCQlicmVhazsKKwlkZWZhdWx0OiAvKiBNTFg1X1dRX1RZUEVfTElOS0VEX0xJU1QgKi8KKwkJcHJpdi0+cGFyYW1zLmxvZ19ycV9zaXplID0gTUxYNUVfUEFSQU1TX0RFRkFVTFRfTE9HX1JRX1NJWkU7CisJfQorCXByaXYtPnBhcmFtcy5taW5fcnhfd3FlcyA9IG1seDVfbWluX3J4X3dxZXMocHJpdi0+cGFyYW1zLnJxX3dxX3R5cGUsCisJCQkJCSAgICAgICBCSVQocHJpdi0+cGFyYW1zLmxvZ19ycV9zaXplKSk7CisKKwltbHg1X2NvcmVfaW5mbyhwcml2LT5tZGV2LAorCQkgICAgICAgIk1MWDVFOiBTdHJkUnEoJWQpIFJxU3ooJWxkKSBTdHJkU3ooJWxkKSBSeENxZUNtcHJzcyglZClcbiIsCisJCSAgICAgICBwcml2LT5wYXJhbXMucnFfd3FfdHlwZSA9PSBNTFg1X1dRX1RZUEVfTElOS0VEX0xJU1RfU1RSSURJTkdfUlEsCisJCSAgICAgICBCSVQocHJpdi0+cGFyYW1zLmxvZ19ycV9zaXplKSwKKwkJICAgICAgIEJJVChwcml2LT5wYXJhbXMubXB3cWVfbG9nX3N0cmlkZV9zeiksCisJCSAgICAgICBwcml2LT5wYXJhbXMucnhfY3FlX2NvbXByZXNzX2FkbWluKTsKK30KKworc3RhdGljIHZvaWQgbWx4NWVfc2V0X3JxX3ByaXZfcGFyYW1zKHN0cnVjdCBtbHg1ZV9wcml2ICpwcml2KQoreworCXU4IHJxX3R5cGUgPSBtbHg1ZV9jaGVja19mcmFnbWVudGVkX3N0cmlkaW5nX3JxX2NhcChwcml2LT5tZGV2KSAmJgorCQkgICAgIXByaXYtPnhkcF9wcm9nID8KKwkJICAgIE1MWDVfV1FfVFlQRV9MSU5LRURfTElTVF9TVFJJRElOR19SUSA6CisJCSAgICBNTFg1X1dRX1RZUEVfTElOS0VEX0xJU1Q7CisJbWx4NWVfc2V0X3JxX3R5cGVfcGFyYW1zKHByaXYsIHJxX3R5cGUpOworfQorCiBzdGF0aWMgdm9pZCBtbHg1ZV91cGRhdGVfY2FycmllcihzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdikKIHsKIAlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiA9IHByaXYtPm1kZXY7CkBAIC0xNDMsMTIgKzE4MCwxOCBAQAogCQlzLT5yeF9jc3VtX25vbmUJKz0gcnFfc3RhdHMtPmNzdW1fbm9uZTsKIAkJcy0+cnhfY3N1bV9jb21wbGV0ZSArPSBycV9zdGF0cy0+Y3N1bV9jb21wbGV0ZTsKIAkJcy0+cnhfY3N1bV91bm5lY2Vzc2FyeV9pbm5lciArPSBycV9zdGF0cy0+Y3N1bV91bm5lY2Vzc2FyeV9pbm5lcjsKKwkJcy0+cnhfeGRwX2Ryb3AgKz0gcnFfc3RhdHMtPnhkcF9kcm9wOworCQlzLT5yeF94ZHBfdHggKz0gcnFfc3RhdHMtPnhkcF90eDsKKwkJcy0+cnhfeGRwX3R4X2Z1bGwgKz0gcnFfc3RhdHMtPnhkcF90eF9mdWxsOwogCQlzLT5yeF93cWVfZXJyICAgKz0gcnFfc3RhdHMtPndxZV9lcnI7CiAJCXMtPnJ4X21wd3FlX2ZpbGxlciArPSBycV9zdGF0cy0+bXB3cWVfZmlsbGVyOwotCQlzLT5yeF9tcHdxZV9mcmFnICAgKz0gcnFfc3RhdHMtPm1wd3FlX2ZyYWc7CiAJCXMtPnJ4X2J1ZmZfYWxsb2NfZXJyICs9IHJxX3N0YXRzLT5idWZmX2FsbG9jX2VycjsKIAkJcy0+cnhfY3FlX2NvbXByZXNzX2Jsa3MgKz0gcnFfc3RhdHMtPmNxZV9jb21wcmVzc19ibGtzOwogCQlzLT5yeF9jcWVfY29tcHJlc3NfcGt0cyArPSBycV9zdGF0cy0+Y3FlX2NvbXByZXNzX3BrdHM7CisJCXMtPnJ4X2NhY2hlX3JldXNlICs9IHJxX3N0YXRzLT5jYWNoZV9yZXVzZTsKKwkJcy0+cnhfY2FjaGVfZnVsbCAgKz0gcnFfc3RhdHMtPmNhY2hlX2Z1bGw7CisJCXMtPnJ4X2NhY2hlX2VtcHR5ICs9IHJxX3N0YXRzLT5jYWNoZV9lbXB0eTsKKwkJcy0+cnhfY2FjaGVfYnVzeSAgKz0gcnFfc3RhdHMtPmNhY2hlX2J1c3k7CiAKIAkJZm9yIChqID0gMDsgaiA8IHByaXYtPnBhcmFtcy5udW1fdGM7IGorKykgewogCQkJc3Ffc3RhdHMgPSAmcHJpdi0+Y2hhbm5lbFtpXS0+c3Fbal0uc3RhdHM7CkBAIC0xNjIsNiArMjA1LDcgQEAKIAkJCXMtPnR4X3F1ZXVlX3N0b3BwZWQJKz0gc3Ffc3RhdHMtPnN0b3BwZWQ7CiAJCQlzLT50eF9xdWV1ZV93YWtlCSs9IHNxX3N0YXRzLT53YWtlOwogCQkJcy0+dHhfcXVldWVfZHJvcHBlZAkrPSBzcV9zdGF0cy0+ZHJvcHBlZDsKKwkJCXMtPnR4X3htaXRfbW9yZQkJKz0gc3Ffc3RhdHMtPnhtaXRfbW9yZTsKIAkJCXMtPnR4X2NzdW1fcGFydGlhbF9pbm5lciArPSBzcV9zdGF0cy0+Y3N1bV9wYXJ0aWFsX2lubmVyOwogCQkJdHhfb2ZmbG9hZF9ub25lCQkrPSBzcV9zdGF0cy0+Y3N1bV9ub25lOwogCQl9CkBAIC0xODAsMTggKzIyNCwxNSBAQAogewogCWludCBvdXRsZW4gPSBNTFg1X1NUX1NaX0JZVEVTKHF1ZXJ5X3Zwb3J0X2NvdW50ZXJfb3V0KTsKIAl1MzIgKm91dCA9ICh1MzIgKilwcml2LT5zdGF0cy52cG9ydC5xdWVyeV92cG9ydF9vdXQ7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfdnBvcnRfY291bnRlcl9pbildOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X3Zwb3J0X2NvdW50ZXJfaW4pXSA9IHswfTsKIAlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiA9IHByaXYtPm1kZXY7CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCiAJTUxYNV9TRVQocXVlcnlfdnBvcnRfY291bnRlcl9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX1FVRVJZX1ZQT1JUX0NPVU5URVIpOwogCU1MWDVfU0VUKHF1ZXJ5X3Zwb3J0X2NvdW50ZXJfaW4sIGluLCBvcF9tb2QsIDApOwogCU1MWDVfU0VUKHF1ZXJ5X3Zwb3J0X2NvdW50ZXJfaW4sIGluLCBvdGhlcl92cG9ydCwgMCk7CiAKIAltZW1zZXQob3V0LCAwLCBvdXRsZW4pOwotCiAJbWx4NV9jbWRfZXhlYyhtZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRsZW4pOwogfQogCkBAIC0zMDQsNiArMzQ1LDExNyBAQAogI2RlZmluZSBNTFg1RV9IVzJTV19NVFUoaHdtdHUpIChod210dSAtIChFVEhfSExFTiArIFZMQU5fSExFTiArIEVUSF9GQ1NfTEVOKSkKICNkZWZpbmUgTUxYNUVfU1cySFdfTVRVKHN3bXR1KSAoc3dtdHUgKyAoRVRIX0hMRU4gKyBWTEFOX0hMRU4gKyBFVEhfRkNTX0xFTikpCiAKK3N0YXRpYyBpbmxpbmUgaW50IG1seDVlX2dldF93cWVfbXR0X3N6KHZvaWQpCit7CisJLyogVU1SIGNvcGllcyBNVFRzIGluIHVuaXRzIG9mIE1MWDVfVU1SX01UVF9BTElHTk1FTlQgYnl0ZXMuCisJICogVG8gYXZvaWQgY29weWluZyBnYXJiYWdlIGFmdGVyIHRoZSBtdHQgYXJyYXksIHdlIGFsbG9jYXRlCisJICogYSBsaXR0bGUgbW9yZS4KKwkgKi8KKwlyZXR1cm4gQUxJR04oTUxYNV9NUFdSUV9QQUdFU19QRVJfV1FFICogc2l6ZW9mKF9fYmU2NCksCisJCSAgICAgTUxYNV9VTVJfTVRUX0FMSUdOTUVOVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtbHg1ZV9idWlsZF91bXJfd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHN0cnVjdCBtbHg1ZV9zcSAqc3EsCisJCQkJICAgICAgIHN0cnVjdCBtbHg1ZV91bXJfd3FlICp3cWUsIHUxNiBpeCkKK3sKKwlzdHJ1Y3QgbWx4NV93cWVfY3RybF9zZWcgICAgICAqY3NlZyA9ICZ3cWUtPmN0cmw7CisJc3RydWN0IG1seDVfd3FlX3Vtcl9jdHJsX3NlZyAqdWNzZWcgPSAmd3FlLT51Y3RybDsKKwlzdHJ1Y3QgbWx4NV93cWVfZGF0YV9zZWcgICAgICAqZHNlZyA9ICZ3cWUtPmRhdGE7CisJc3RydWN0IG1seDVlX21wd19pbmZvICp3aSA9ICZycS0+bXB3cWUuaW5mb1tpeF07CisJdTggZHNfY250ID0gRElWX1JPVU5EX1VQKHNpemVvZigqd3FlKSwgTUxYNV9TRU5EX1dRRV9EUyk7CisJdTMyIHVtcl93cWVfbXR0X29mZnNldCA9IG1seDVlX2dldF93cWVfbXR0X29mZnNldChycSwgaXgpOworCisJY3NlZy0+cXBuX2RzICAgID0gY3B1X3RvX2JlMzIoKHNxLT5zcW4gPDwgTUxYNV9XUUVfQ1RSTF9RUE5fU0hJRlQpIHwKKwkJCQkgICAgICBkc19jbnQpOworCWNzZWctPmZtX2NlX3NlICA9IE1MWDVfV1FFX0NUUkxfQ1FfVVBEQVRFOworCWNzZWctPmltbSAgICAgICA9IHJxLT5ta2V5X2JlOworCisJdWNzZWctPmZsYWdzID0gTUxYNV9VTVJfVFJBTlNMQVRJT05fT0ZGU0VUX0VOOworCXVjc2VnLT5rbG1fb2N0b3dvcmRzID0KKwkJY3B1X3RvX2JlMTYoTUxYNV9NVFRfT0NUVyhNTFg1X01QV1JRX1BBR0VTX1BFUl9XUUUpKTsKKwl1Y3NlZy0+YnNmX29jdG93b3JkcyA9CisJCWNwdV90b19iZTE2KE1MWDVfTVRUX09DVFcodW1yX3dxZV9tdHRfb2Zmc2V0KSk7CisJdWNzZWctPm1rZXlfbWFzayAgICAgPSBjcHVfdG9fYmU2NChNTFg1X01LRVlfTUFTS19GUkVFKTsKKworCWRzZWctPmxrZXkgPSBzcS0+bWtleV9iZTsKKwlkc2VnLT5hZGRyID0gY3B1X3RvX2JlNjQod2ktPnVtci5tdHRfYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgbWx4NWVfcnFfYWxsb2NfbXB3cWVfaW5mbyhzdHJ1Y3QgbWx4NWVfcnEgKnJxLAorCQkJCSAgICAgc3RydWN0IG1seDVlX2NoYW5uZWwgKmMpCit7CisJaW50IHdxX3N6ID0gbWx4NV93cV9sbF9nZXRfc2l6ZSgmcnEtPndxKTsKKwlpbnQgbXR0X3N6ID0gbWx4NWVfZ2V0X3dxZV9tdHRfc3ooKTsKKwlpbnQgbXR0X2FsbG9jID0gbXR0X3N6ICsgTUxYNV9VTVJfQUxJR04gLSAxOworCWludCBpOworCisJcnEtPm1wd3FlLmluZm8gPSBremFsbG9jX25vZGUod3Ffc3ogKiBzaXplb2YoKnJxLT5tcHdxZS5pbmZvKSwKKwkJCQkgICAgICBHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShjLT5jcHUpKTsKKwlpZiAoIXJxLT5tcHdxZS5pbmZvKQorCQlnb3RvIGVycl9vdXQ7CisKKwkvKiBXZSBhbGxvY2F0ZSBtb3JlIHRoYW4gbXR0X3N6IGFzIHdlIHdpbGwgYWxpZ24gdGhlIHBvaW50ZXIgKi8KKwlycS0+bXB3cWUubXR0X25vX2FsaWduID0ga3phbGxvY19ub2RlKG10dF9hbGxvYyAqIHdxX3N6LCBHRlBfS0VSTkVMLAorCQkJCQljcHVfdG9fbm9kZShjLT5jcHUpKTsKKwlpZiAodW5saWtlbHkoIXJxLT5tcHdxZS5tdHRfbm9fYWxpZ24pKQorCQlnb3RvIGVycl9mcmVlX3dxZV9pbmZvOworCisJZm9yIChpID0gMDsgaSA8IHdxX3N6OyBpKyspIHsKKwkJc3RydWN0IG1seDVlX21wd19pbmZvICp3aSA9ICZycS0+bXB3cWUuaW5mb1tpXTsKKworCQl3aS0+dW1yLm10dCA9IFBUUl9BTElHTihycS0+bXB3cWUubXR0X25vX2FsaWduICsgaSAqIG10dF9hbGxvYywKKwkJCQkJTUxYNV9VTVJfQUxJR04pOworCQl3aS0+dW1yLm10dF9hZGRyID0gZG1hX21hcF9zaW5nbGUoYy0+cGRldiwgd2ktPnVtci5tdHQsIG10dF9zeiwKKwkJCQkJCSAgUENJX0RNQV9UT0RFVklDRSk7CisJCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcihjLT5wZGV2LCB3aS0+dW1yLm10dF9hZGRyKSkpCisJCQlnb3RvIGVycl91bm1hcF9tdHRzOworCisJCW1seDVlX2J1aWxkX3Vtcl93cWUocnEsICZjLT5pY29zcSwgJndpLT51bXIud3FlLCBpKTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3VubWFwX210dHM6CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCXN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2kgPSAmcnEtPm1wd3FlLmluZm9baV07CisKKwkJZG1hX3VubWFwX3NpbmdsZShjLT5wZGV2LCB3aS0+dW1yLm10dF9hZGRyLCBtdHRfc3osCisJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCX0KKwlrZnJlZShycS0+bXB3cWUubXR0X25vX2FsaWduKTsKK2Vycl9mcmVlX3dxZV9pbmZvOgorCWtmcmVlKHJxLT5tcHdxZS5pbmZvKTsKKworZXJyX291dDoKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgbWx4NWVfcnFfZnJlZV9tcHdxZV9pbmZvKHN0cnVjdCBtbHg1ZV9ycSAqcnEpCit7CisJaW50IHdxX3N6ID0gbWx4NV93cV9sbF9nZXRfc2l6ZSgmcnEtPndxKTsKKwlpbnQgbXR0X3N6ID0gbWx4NWVfZ2V0X3dxZV9tdHRfc3ooKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB3cV9zejsgaSsrKSB7CisJCXN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2kgPSAmcnEtPm1wd3FlLmluZm9baV07CisKKwkJZG1hX3VubWFwX3NpbmdsZShycS0+cGRldiwgd2ktPnVtci5tdHRfYWRkciwgbXR0X3N6LAorCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwl9CisJa2ZyZWUocnEtPm1wd3FlLm10dF9ub19hbGlnbik7CisJa2ZyZWUocnEtPm1wd3FlLmluZm8pOworfQorCitzdGF0aWMgYm9vbCBtbHg1ZV9pc192Zl92cG9ydF9yZXAoc3RydWN0IG1seDVlX3ByaXYgKnByaXYpCit7CisJc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKnJlcCA9IChzdHJ1Y3QgbWx4NV9lc3dpdGNoX3JlcCAqKXByaXYtPnBwcml2OworCisJaWYgKHJlcCAmJiByZXAtPnZwb3J0ICE9IEZEQl9VUExJTktfVlBPUlQpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgaW50IG1seDVlX2NyZWF0ZV9ycShzdHJ1Y3QgbWx4NWVfY2hhbm5lbCAqYywKIAkJCSAgIHN0cnVjdCBtbHg1ZV9ycV9wYXJhbSAqcGFyYW0sCiAJCQkgICBzdHJ1Y3QgbWx4NWVfcnEgKnJxKQpAQCAtMzEzLDYgKzQ2NSw4IEBACiAJdm9pZCAqcnFjID0gcGFyYW0tPnJxYzsKIAl2b2lkICpycWNfd3EgPSBNTFg1X0FERFJfT0YocnFjLCBycWMsIHdxKTsKIAl1MzIgYnl0ZV9jb3VudDsKKwl1MzIgZnJhZ19zejsKKwlpbnQgbnBhZ2VzOwogCWludCB3cV9zejsKIAlpbnQgZXJyOwogCWludCBpOwpAQCAtMzI4LDUxICs0ODIsNiBAQAogCiAJd3Ffc3ogPSBtbHg1X3dxX2xsX2dldF9zaXplKCZycS0+d3EpOwogCi0Jc3dpdGNoIChwcml2LT5wYXJhbXMucnFfd3FfdHlwZSkgewotCWNhc2UgTUxYNV9XUV9UWVBFX0xJTktFRF9MSVNUX1NUUklESU5HX1JROgotCQlycS0+d3FlX2luZm8gPSBremFsbG9jX25vZGUod3Ffc3ogKiBzaXplb2YoKnJxLT53cWVfaW5mbyksCi0JCQkJCSAgICBHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShjLT5jcHUpKTsKLQkJaWYgKCFycS0+d3FlX2luZm8pIHsKLQkJCWVyciA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycl9ycV93cV9kZXN0cm95OwotCQl9Ci0JCXJxLT5oYW5kbGVfcnhfY3FlID0gbWx4NWVfaGFuZGxlX3J4X2NxZV9tcHdycTsKLQkJcnEtPmFsbG9jX3dxZSA9IG1seDVlX2FsbG9jX3J4X21wd3FlOwotCQlycS0+ZGVhbGxvY193cWUgPSBtbHg1ZV9kZWFsbG9jX3J4X21wd3FlOwotCi0JCXJxLT5tcHdxZV9zdHJpZGVfc3ogPSBCSVQocHJpdi0+cGFyYW1zLm1wd3FlX2xvZ19zdHJpZGVfc3opOwotCQlycS0+bXB3cWVfbnVtX3N0cmlkZXMgPSBCSVQocHJpdi0+cGFyYW1zLm1wd3FlX2xvZ19udW1fc3RyaWRlcyk7Ci0JCXJxLT53cWVfc3ogPSBycS0+bXB3cWVfc3RyaWRlX3N6ICogcnEtPm1wd3FlX251bV9zdHJpZGVzOwotCQlieXRlX2NvdW50ID0gcnEtPndxZV9zejsKLQkJYnJlYWs7Ci0JZGVmYXVsdDogLyogTUxYNV9XUV9UWVBFX0xJTktFRF9MSVNUICovCi0JCXJxLT5za2IgPSBremFsbG9jX25vZGUod3Ffc3ogKiBzaXplb2YoKnJxLT5za2IpLCBHRlBfS0VSTkVMLAotCQkJCSAgICAgICBjcHVfdG9fbm9kZShjLT5jcHUpKTsKLQkJaWYgKCFycS0+c2tiKSB7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBlcnJfcnFfd3FfZGVzdHJveTsKLQkJfQotCQlycS0+aGFuZGxlX3J4X2NxZSA9IG1seDVlX2hhbmRsZV9yeF9jcWU7Ci0JCXJxLT5hbGxvY193cWUgPSBtbHg1ZV9hbGxvY19yeF93cWU7Ci0JCXJxLT5kZWFsbG9jX3dxZSA9IG1seDVlX2RlYWxsb2Nfcnhfd3FlOwotCi0JCXJxLT53cWVfc3ogPSAocHJpdi0+cGFyYW1zLmxyb19lbikgPwotCQkJCXByaXYtPnBhcmFtcy5scm9fd3FlX3N6IDoKLQkJCQlNTFg1RV9TVzJIV19NVFUocHJpdi0+bmV0ZGV2LT5tdHUpOwotCQlycS0+d3FlX3N6ID0gU0tCX0RBVEFfQUxJR04ocnEtPndxZV9zeik7Ci0JCWJ5dGVfY291bnQgPSBycS0+d3FlX3N6OwotCQlieXRlX2NvdW50IHw9IE1MWDVfSFdfU1RBUlRfUEFERElORzsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgd3Ffc3o7IGkrKykgewotCQlzdHJ1Y3QgbWx4NWVfcnhfd3FlICp3cWUgPSBtbHg1X3dxX2xsX2dldF93cWUoJnJxLT53cSwgaSk7Ci0KLQkJd3FlLT5kYXRhLmJ5dGVfY291bnQgPSBjcHVfdG9fYmUzMihieXRlX2NvdW50KTsKLQl9Ci0KLQlJTklUX1dPUksoJnJxLT5hbS53b3JrLCBtbHg1ZV9yeF9hbV93b3JrKTsKLQlycS0+YW0ubW9kZSA9IHByaXYtPnBhcmFtcy5yeF9jcV9wZXJpb2RfbW9kZTsKLQogCXJxLT53cV90eXBlID0gcHJpdi0+cGFyYW1zLnJxX3dxX3R5cGU7CiAJcnEtPnBkZXYgICAgPSBjLT5wZGV2OwogCXJxLT5uZXRkZXYgID0gYy0+bmV0ZGV2OwpAQCAtMzgwLDggKzQ4OSw4NSBAQAogCXJxLT5jaGFubmVsID0gYzsKIAlycS0+aXggICAgICA9IGMtPml4OwogCXJxLT5wcml2ICAgID0gYy0+cHJpdjsKLQlycS0+bWtleV9iZSA9IGMtPm1rZXlfYmU7Ci0JcnEtPnVtcl9ta2V5X2JlID0gY3B1X3RvX2JlMzIoYy0+cHJpdi0+dW1yX21rZXkua2V5KTsKKwlycS0+eGRwX3Byb2cgPSBwcml2LT54ZHBfcHJvZzsKKworCXJxLT5idWZmLm1hcF9kaXIgPSBETUFfRlJPTV9ERVZJQ0U7CisJaWYgKHJxLT54ZHBfcHJvZykKKwkJcnEtPmJ1ZmYubWFwX2RpciA9IERNQV9CSURJUkVDVElPTkFMOworCisJc3dpdGNoIChwcml2LT5wYXJhbXMucnFfd3FfdHlwZSkgeworCWNhc2UgTUxYNV9XUV9UWVBFX0xJTktFRF9MSVNUX1NUUklESU5HX1JROgorCQlpZiAobWx4NWVfaXNfdmZfdnBvcnRfcmVwKHByaXYpKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBlcnJfcnFfd3FfZGVzdHJveTsKKwkJfQorCisJCXJxLT5oYW5kbGVfcnhfY3FlID0gbWx4NWVfaGFuZGxlX3J4X2NxZV9tcHdycTsKKwkJcnEtPmFsbG9jX3dxZSA9IG1seDVlX2FsbG9jX3J4X21wd3FlOworCQlycS0+ZGVhbGxvY193cWUgPSBtbHg1ZV9kZWFsbG9jX3J4X21wd3FlOworCisJCXJxLT5tcHdxZS5tdHRfb2Zmc2V0ID0gYy0+aXggKgorCQkJTUxYNUVfUkVRVUlSRURfTVRUUygxLCBCSVQocHJpdi0+cGFyYW1zLmxvZ19ycV9zaXplKSk7CisKKwkJcnEtPm1wd3FlX3N0cmlkZV9zeiA9IEJJVChwcml2LT5wYXJhbXMubXB3cWVfbG9nX3N0cmlkZV9zeik7CisJCXJxLT5tcHdxZV9udW1fc3RyaWRlcyA9IEJJVChwcml2LT5wYXJhbXMubXB3cWVfbG9nX251bV9zdHJpZGVzKTsKKworCQlycS0+YnVmZi53cWVfc3ogPSBycS0+bXB3cWVfc3RyaWRlX3N6ICogcnEtPm1wd3FlX251bV9zdHJpZGVzOworCQlieXRlX2NvdW50ID0gcnEtPmJ1ZmYud3FlX3N6OworCQlycS0+bWtleV9iZSA9IGNwdV90b19iZTMyKGMtPnByaXYtPnVtcl9ta2V5LmtleSk7CisJCWVyciA9IG1seDVlX3JxX2FsbG9jX21wd3FlX2luZm8ocnEsIGMpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfcnFfd3FfZGVzdHJveTsKKwkJYnJlYWs7CisJZGVmYXVsdDogLyogTUxYNV9XUV9UWVBFX0xJTktFRF9MSVNUICovCisJCXJxLT5kbWFfaW5mbyA9IGt6YWxsb2Nfbm9kZSh3cV9zeiAqIHNpemVvZigqcnEtPmRtYV9pbmZvKSwKKwkJCQkJICAgIEdGUF9LRVJORUwsIGNwdV90b19ub2RlKGMtPmNwdSkpOworCQlpZiAoIXJxLT5kbWFfaW5mbykgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX3JxX3dxX2Rlc3Ryb3k7CisJCX0KKworCQlpZiAobWx4NWVfaXNfdmZfdnBvcnRfcmVwKHByaXYpKQorCQkJcnEtPmhhbmRsZV9yeF9jcWUgPSBtbHg1ZV9oYW5kbGVfcnhfY3FlX3JlcDsKKwkJZWxzZQorCQkJcnEtPmhhbmRsZV9yeF9jcWUgPSBtbHg1ZV9oYW5kbGVfcnhfY3FlOworCisJCXJxLT5hbGxvY193cWUgPSBtbHg1ZV9hbGxvY19yeF93cWU7CisJCXJxLT5kZWFsbG9jX3dxZSA9IG1seDVlX2RlYWxsb2Nfcnhfd3FlOworCisJCXJxLT5idWZmLndxZV9zeiA9IChwcml2LT5wYXJhbXMubHJvX2VuKSA/CisJCQkJcHJpdi0+cGFyYW1zLmxyb193cWVfc3ogOgorCQkJCU1MWDVFX1NXMkhXX01UVShwcml2LT5uZXRkZXYtPm10dSk7CisJCWJ5dGVfY291bnQgPSBycS0+YnVmZi53cWVfc3o7CisKKwkJLyogY2FsYyB0aGUgcmVxdWlyZWQgcGFnZSBvcmRlciAqLworCQlmcmFnX3N6ID0gTUxYNV9SWF9IRUFEUk9PTSArCisJCQkgIGJ5dGVfY291bnQgLyogcGFja2V0IGRhdGEgKi8gKworCQkJICBTS0JfREFUQV9BTElHTihzaXplb2Yoc3RydWN0IHNrYl9zaGFyZWRfaW5mbykpOworCQlmcmFnX3N6ID0gU0tCX0RBVEFfQUxJR04oZnJhZ19zeik7CisKKwkJbnBhZ2VzID0gRElWX1JPVU5EX1VQKGZyYWdfc3osIFBBR0VfU0laRSk7CisJCXJxLT5idWZmLnBhZ2Vfb3JkZXIgPSBvcmRlcl9iYXNlXzIobnBhZ2VzKTsKKworCQlieXRlX2NvdW50IHw9IE1MWDVfSFdfU1RBUlRfUEFERElORzsKKwkJcnEtPm1rZXlfYmUgPSBjLT5ta2V5X2JlOworCX0KKworCWZvciAoaSA9IDA7IGkgPCB3cV9zejsgaSsrKSB7CisJCXN0cnVjdCBtbHg1ZV9yeF93cWUgKndxZSA9IG1seDVfd3FfbGxfZ2V0X3dxZSgmcnEtPndxLCBpKTsKKworCQl3cWUtPmRhdGEuYnl0ZV9jb3VudCA9IGNwdV90b19iZTMyKGJ5dGVfY291bnQpOworCQl3cWUtPmRhdGEubGtleSA9IHJxLT5ta2V5X2JlOworCX0KKworCUlOSVRfV09SSygmcnEtPmFtLndvcmssIG1seDVlX3J4X2FtX3dvcmspOworCXJxLT5hbS5tb2RlID0gcHJpdi0+cGFyYW1zLnJ4X2NxX3BlcmlvZF9tb2RlOworCisJcnEtPnBhZ2VfY2FjaGUuaGVhZCA9IDA7CisJcnEtPnBhZ2VfY2FjaGUudGFpbCA9IDA7CisKKwlpZiAocnEtPnhkcF9wcm9nKQorCQlicGZfcHJvZ19hZGQocnEtPnhkcF9wcm9nLCAxKTsKIAogCXJldHVybiAwOwogCkBAIC0zOTMsMTQgKzU3OSwyNSBAQAogCiBzdGF0aWMgdm9pZCBtbHg1ZV9kZXN0cm95X3JxKHN0cnVjdCBtbHg1ZV9ycSAqcnEpCiB7CisJaW50IGk7CisKKwlpZiAocnEtPnhkcF9wcm9nKQorCQlicGZfcHJvZ19wdXQocnEtPnhkcF9wcm9nKTsKKwogCXN3aXRjaCAocnEtPndxX3R5cGUpIHsKIAljYXNlIE1MWDVfV1FfVFlQRV9MSU5LRURfTElTVF9TVFJJRElOR19SUToKLQkJa2ZyZWUocnEtPndxZV9pbmZvKTsKKwkJbWx4NWVfcnFfZnJlZV9tcHdxZV9pbmZvKHJxKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDogLyogTUxYNV9XUV9UWVBFX0xJTktFRF9MSVNUICovCi0JCWtmcmVlKHJxLT5za2IpOworCQlrZnJlZShycS0+ZG1hX2luZm8pOwogCX0KIAorCWZvciAoaSA9IHJxLT5wYWdlX2NhY2hlLmhlYWQ7IGkgIT0gcnEtPnBhZ2VfY2FjaGUudGFpbDsKKwkgICAgIGkgPSAoaSArIDEpICYgKE1MWDVFX0NBQ0hFX1NJWkUgLSAxKSkgeworCQlzdHJ1Y3QgbWx4NWVfZG1hX2luZm8gKmRtYV9pbmZvID0gJnJxLT5wYWdlX2NhY2hlLnBhZ2VfY2FjaGVbaV07CisKKwkJbWx4NWVfcGFnZV9yZWxlYXNlKHJxLCBkbWFfaW5mbywgZmFsc2UpOworCX0KIAltbHg1X3dxX2Rlc3Ryb3koJnJxLT53cV9jdHJsKTsKIH0KIApAQCAtNDI4LDcgKzYyNSw2IEBACiAKIAlNTFg1X1NFVChycWMsICBycWMsIGNxbiwJCXJxLT5jcS5tY3EuY3FuKTsKIAlNTFg1X1NFVChycWMsICBycWMsIHN0YXRlLAkJTUxYNV9SUUNfU1RBVEVfUlNUKTsKLQlNTFg1X1NFVChycWMsICBycWMsIGZsdXNoX2luX2Vycm9yX2VuLAkxKTsKIAlNTFg1X1NFVChycWMsICBycWMsIHZzZCwgcHJpdi0+cGFyYW1zLnZsYW5fc3RyaXBfZGlzYWJsZSk7CiAJTUxYNV9TRVQod3EsICAgd3EsICBsb2dfd3FfcGdfc3osCXJxLT53cV9jdHJsLmJ1Zi5wYWdlX3NoaWZ0IC0KIAkJCQkJCU1MWDVfQURBUFRFUl9QQUdFX1NISUZUKTsKQEAgLTQ5Miw3ICs2ODgsOCBAQAogCXJxYyA9IE1MWDVfQUREUl9PRihtb2RpZnlfcnFfaW4sIGluLCBjdHgpOwogCiAJTUxYNV9TRVQobW9kaWZ5X3JxX2luLCBpbiwgcnFfc3RhdGUsIE1MWDVfUlFDX1NUQVRFX1JEWSk7Ci0JTUxYNV9TRVQ2NChtb2RpZnlfcnFfaW4sIGluLCBtb2RpZnlfYml0bWFzaywgTUxYNV9SUV9CSVRNQVNLX1ZTRCk7CisJTUxYNV9TRVQ2NChtb2RpZnlfcnFfaW4sIGluLCBtb2RpZnlfYml0bWFzaywKKwkJICAgTUxYNV9NT0RJRllfUlFfSU5fTU9ESUZZX0JJVE1BU0tfVlNEKTsKIAlNTFg1X1NFVChycWMsIHJxYywgdnNkLCB2c2QpOwogCU1MWDVfU0VUKHJxYywgcnFjLCBzdGF0ZSwgTUxYNV9SUUNfU1RBVEVfUkRZKTsKIApAQCAtNTI1LDYgKzcyMiwyNyBAQAogCXJldHVybiAtRVRJTUVET1VUOwogfQogCitzdGF0aWMgdm9pZCBtbHg1ZV9mcmVlX3J4X2Rlc2NzKHN0cnVjdCBtbHg1ZV9ycSAqcnEpCit7CisJc3RydWN0IG1seDVfd3FfbGwgKndxID0gJnJxLT53cTsKKwlzdHJ1Y3QgbWx4NWVfcnhfd3FlICp3cWU7CisJX19iZTE2IHdxZV9peF9iZTsKKwl1MTYgd3FlX2l4OworCisJLyogVU1SIFdRRSAoaWYgaW4gcHJvZ3Jlc3MpIGlzIGFsd2F5cyBhdCB3cS0+aGVhZCAqLworCWlmICh0ZXN0X2JpdChNTFg1RV9SUV9TVEFURV9VTVJfV1FFX0lOX1BST0dSRVNTLCAmcnEtPnN0YXRlKSkKKwkJbWx4NWVfZnJlZV9yeF9tcHdxZShycSwgJnJxLT5tcHdxZS5pbmZvW3dxLT5oZWFkXSk7CisKKwl3aGlsZSAoIW1seDVfd3FfbGxfaXNfZW1wdHkod3EpKSB7CisJCXdxZV9peF9iZSA9ICp3cS0+dGFpbF9uZXh0OworCQl3cWVfaXggICAgPSBiZTE2X3RvX2NwdSh3cWVfaXhfYmUpOworCQl3cWUgICAgICAgPSBtbHg1X3dxX2xsX2dldF93cWUoJnJxLT53cSwgd3FlX2l4KTsKKwkJcnEtPmRlYWxsb2Nfd3FlKHJxLCB3cWVfaXgpOworCQltbHg1X3dxX2xsX3BvcCgmcnEtPndxLCB3cWVfaXhfYmUsCisJCQkgICAgICAgJndxZS0+bmV4dC5uZXh0X3dxZV9pbmRleCk7CisJfQorfQorCiBzdGF0aWMgaW50IG1seDVlX29wZW5fcnEoc3RydWN0IG1seDVlX2NoYW5uZWwgKmMsCiAJCQkgc3RydWN0IG1seDVlX3JxX3BhcmFtICpwYXJhbSwKIAkJCSBzdHJ1Y3QgbWx4NWVfcnEgKnJxKQpAQCAtNTQ4LDEwICs3NjYsOCBAQAogCWlmIChwYXJhbS0+YW1fZW5hYmxlZCkKIAkJc2V0X2JpdChNTFg1RV9SUV9TVEFURV9BTSwgJmMtPnJxLnN0YXRlKTsKIAotCXNldF9iaXQoTUxYNUVfUlFfU1RBVEVfUE9TVF9XUUVTX0VOQUJMRSwgJnJxLT5zdGF0ZSk7Ci0KLQlzcS0+aWNvX3dxZV9pbmZvW3BpXS5vcGNvZGUgICAgID0gTUxYNV9PUENPREVfTk9QOwotCXNxLT5pY29fd3FlX2luZm9bcGldLm51bV93cWViYnMgPSAxOworCXNxLT5kYi5pY29fd3FlW3BpXS5vcGNvZGUgICAgID0gTUxYNV9PUENPREVfTk9QOworCXNxLT5kYi5pY29fd3FlW3BpXS5udW1fd3FlYmJzID0gMTsKIAltbHg1ZV9zZW5kX25vcChzcSwgdHJ1ZSk7IC8qIHRyaWdnZXIgbWx4NWVfcG9zdF9yeF93cWVzKCkgKi8KIAogCXJldHVybiAwOwpAQCAtNTY2LDIzICs3ODIsOCBAQAogCiBzdGF0aWMgdm9pZCBtbHg1ZV9jbG9zZV9ycShzdHJ1Y3QgbWx4NWVfcnEgKnJxKQogewotCWludCB0b3V0ID0gMDsKLQlpbnQgZXJyOwotCi0JY2xlYXJfYml0KE1MWDVFX1JRX1NUQVRFX1BPU1RfV1FFU19FTkFCTEUsICZycS0+c3RhdGUpOworCXNldF9iaXQoTUxYNUVfUlFfU1RBVEVfRkxVU0gsICZycS0+c3RhdGUpOwogCW5hcGlfc3luY2hyb25pemUoJnJxLT5jaGFubmVsLT5uYXBpKTsgLyogcHJldmVudCBtbHg1ZV9wb3N0X3J4X3dxZXMgKi8KLQotCWVyciA9IG1seDVlX21vZGlmeV9ycV9zdGF0ZShycSwgTUxYNV9SUUNfU1RBVEVfUkRZLCBNTFg1X1JRQ19TVEFURV9FUlIpOwotCXdoaWxlICghbWx4NV93cV9sbF9pc19lbXB0eSgmcnEtPndxKSAmJiAhZXJyICYmCi0JICAgICAgIHRvdXQrKyA8IE1MWDVfRU5fUVBfRkxVU0hfTUFYX0lURVIpCi0JCW1zbGVlcChNTFg1X0VOX1FQX0ZMVVNIX01TTEVFUF9RVUFOVCk7Ci0KLQlpZiAoZXJyIHx8IHRvdXQgPT0gTUxYNV9FTl9RUF9GTFVTSF9NQVhfSVRFUikKLQkJc2V0X2JpdChNTFg1RV9SUV9TVEFURV9GTFVTSF9USU1FT1VULCAmcnEtPnN0YXRlKTsKLQotCS8qIGF2b2lkIGRlc3Ryb3lpbmcgcnEgYmVmb3JlIG1seDVlX3BvbGxfcnhfY3EoKSBpcyBkb25lIHdpdGggaXQgKi8KLQluYXBpX3N5bmNocm9uaXplKCZycS0+Y2hhbm5lbC0+bmFwaSk7Ci0KIAljYW5jZWxfd29ya19zeW5jKCZycS0+YW0ud29yayk7CiAKIAltbHg1ZV9kaXNhYmxlX3JxKHJxKTsKQEAgLTU5MCwyNiArNzkxLDY1IEBACiAJbWx4NWVfZGVzdHJveV9ycShycSk7CiB9CiAKLXN0YXRpYyB2b2lkIG1seDVlX2ZyZWVfc3FfZGIoc3RydWN0IG1seDVlX3NxICpzcSkKK3N0YXRpYyB2b2lkIG1seDVlX2ZyZWVfc3FfeGRwX2RiKHN0cnVjdCBtbHg1ZV9zcSAqc3EpCiB7Ci0Ja2ZyZWUoc3EtPndxZV9pbmZvKTsKLQlrZnJlZShzcS0+ZG1hX2ZpZm8pOwotCWtmcmVlKHNxLT5za2IpOworCWtmcmVlKHNxLT5kYi54ZHAuZGkpOworCWtmcmVlKHNxLT5kYi54ZHAud3FlX2luZm8pOwogfQogCi1zdGF0aWMgaW50IG1seDVlX2FsbG9jX3NxX2RiKHN0cnVjdCBtbHg1ZV9zcSAqc3EsIGludCBudW1hKQorc3RhdGljIGludCBtbHg1ZV9hbGxvY19zcV94ZHBfZGIoc3RydWN0IG1seDVlX3NxICpzcSwgaW50IG51bWEpCit7CisJaW50IHdxX3N6ID0gbWx4NV93cV9jeWNfZ2V0X3NpemUoJnNxLT53cSk7CisKKwlzcS0+ZGIueGRwLmRpID0ga3phbGxvY19ub2RlKHNpemVvZigqc3EtPmRiLnhkcC5kaSkgKiB3cV9zeiwKKwkJCQkgICAgIEdGUF9LRVJORUwsIG51bWEpOworCXNxLT5kYi54ZHAud3FlX2luZm8gPSBremFsbG9jX25vZGUoc2l6ZW9mKCpzcS0+ZGIueGRwLndxZV9pbmZvKSAqIHdxX3N6LAorCQkJCQkgICBHRlBfS0VSTkVMLCBudW1hKTsKKwlpZiAoIXNxLT5kYi54ZHAuZGkgfHwgIXNxLT5kYi54ZHAud3FlX2luZm8pIHsKKwkJbWx4NWVfZnJlZV9zcV94ZHBfZGIoc3EpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWx4NWVfZnJlZV9zcV9pY29fZGIoc3RydWN0IG1seDVlX3NxICpzcSkKK3sKKwlrZnJlZShzcS0+ZGIuaWNvX3dxZSk7Cit9CisKK3N0YXRpYyBpbnQgbWx4NWVfYWxsb2Nfc3FfaWNvX2RiKHN0cnVjdCBtbHg1ZV9zcSAqc3EsIGludCBudW1hKQoreworCXU4IHdxX3N6ID0gbWx4NV93cV9jeWNfZ2V0X3NpemUoJnNxLT53cSk7CisKKwlzcS0+ZGIuaWNvX3dxZSA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKnNxLT5kYi5pY29fd3FlKSAqIHdxX3N6LAorCQkJCSAgICAgIEdGUF9LRVJORUwsIG51bWEpOworCWlmICghc3EtPmRiLmljb193cWUpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1seDVlX2ZyZWVfc3FfdHhxX2RiKHN0cnVjdCBtbHg1ZV9zcSAqc3EpCit7CisJa2ZyZWUoc3EtPmRiLnR4cS53cWVfaW5mbyk7CisJa2ZyZWUoc3EtPmRiLnR4cS5kbWFfZmlmbyk7CisJa2ZyZWUoc3EtPmRiLnR4cS5za2IpOworfQorCitzdGF0aWMgaW50IG1seDVlX2FsbG9jX3NxX3R4cV9kYihzdHJ1Y3QgbWx4NWVfc3EgKnNxLCBpbnQgbnVtYSkKIHsKIAlpbnQgd3Ffc3ogPSBtbHg1X3dxX2N5Y19nZXRfc2l6ZSgmc3EtPndxKTsKIAlpbnQgZGZfc3ogPSB3cV9zeiAqIE1MWDVfU0VORF9XUUVCQl9OVU1fRFM7CiAKLQlzcS0+c2tiID0ga3phbGxvY19ub2RlKHdxX3N6ICogc2l6ZW9mKCpzcS0+c2tiKSwgR0ZQX0tFUk5FTCwgbnVtYSk7Ci0Jc3EtPmRtYV9maWZvID0ga3phbGxvY19ub2RlKGRmX3N6ICogc2l6ZW9mKCpzcS0+ZG1hX2ZpZm8pLCBHRlBfS0VSTkVMLAotCQkJCSAgICBudW1hKTsKLQlzcS0+d3FlX2luZm8gPSBremFsbG9jX25vZGUod3Ffc3ogKiBzaXplb2YoKnNxLT53cWVfaW5mbyksIEdGUF9LRVJORUwsCi0JCQkJICAgIG51bWEpOwotCi0JaWYgKCFzcS0+c2tiIHx8ICFzcS0+ZG1hX2ZpZm8gfHwgIXNxLT53cWVfaW5mbykgewotCQltbHg1ZV9mcmVlX3NxX2RiKHNxKTsKKwlzcS0+ZGIudHhxLnNrYiA9IGt6YWxsb2Nfbm9kZSh3cV9zeiAqIHNpemVvZigqc3EtPmRiLnR4cS5za2IpLAorCQkJCSAgICAgIEdGUF9LRVJORUwsIG51bWEpOworCXNxLT5kYi50eHEuZG1hX2ZpZm8gPSBremFsbG9jX25vZGUoZGZfc3ogKiBzaXplb2YoKnNxLT5kYi50eHEuZG1hX2ZpZm8pLAorCQkJCQkgICBHRlBfS0VSTkVMLCBudW1hKTsKKwlzcS0+ZGIudHhxLndxZV9pbmZvID0ga3phbGxvY19ub2RlKHdxX3N6ICogc2l6ZW9mKCpzcS0+ZGIudHhxLndxZV9pbmZvKSwKKwkJCQkJICAgR0ZQX0tFUk5FTCwgbnVtYSk7CisJaWYgKCFzcS0+ZGIudHhxLnNrYiB8fCAhc3EtPmRiLnR4cS5kbWFfZmlmbyB8fCAhc3EtPmRiLnR4cS53cWVfaW5mbykgeworCQltbHg1ZV9mcmVlX3NxX3R4cV9kYihzcSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtNjE4LDYgKzg1OCw0NiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBtbHg1ZV9mcmVlX3NxX2RiKHN0cnVjdCBtbHg1ZV9zcSAqc3EpCit7CisJc3dpdGNoIChzcS0+dHlwZSkgeworCWNhc2UgTUxYNUVfU1FfVFhROgorCQltbHg1ZV9mcmVlX3NxX3R4cV9kYihzcSk7CisJCWJyZWFrOworCWNhc2UgTUxYNUVfU1FfSUNPOgorCQltbHg1ZV9mcmVlX3NxX2ljb19kYihzcSk7CisJCWJyZWFrOworCWNhc2UgTUxYNUVfU1FfWERQOgorCQltbHg1ZV9mcmVlX3NxX3hkcF9kYihzcSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBtbHg1ZV9hbGxvY19zcV9kYihzdHJ1Y3QgbWx4NWVfc3EgKnNxLCBpbnQgbnVtYSkKK3sKKwlzd2l0Y2ggKHNxLT50eXBlKSB7CisJY2FzZSBNTFg1RV9TUV9UWFE6CisJCXJldHVybiBtbHg1ZV9hbGxvY19zcV90eHFfZGIoc3EsIG51bWEpOworCWNhc2UgTUxYNUVfU1FfSUNPOgorCQlyZXR1cm4gbWx4NWVfYWxsb2Nfc3FfaWNvX2RiKHNxLCBudW1hKTsKKwljYXNlIE1MWDVFX1NRX1hEUDoKKwkJcmV0dXJuIG1seDVlX2FsbG9jX3NxX3hkcF9kYihzcSwgbnVtYSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWx4NWVfc3FfZ2V0X21heF93cWViYnModTggc3FfdHlwZSkKK3sKKwlzd2l0Y2ggKHNxX3R5cGUpIHsKKwljYXNlIE1MWDVFX1NRX0lDTzoKKwkJcmV0dXJuIE1MWDVFX0lDT1NRX01BWF9XUUVCQlM7CisJY2FzZSBNTFg1RV9TUV9YRFA6CisJCXJldHVybiBNTFg1RV9YRFBfVFhfV1FFQkJTOworCX0KKwlyZXR1cm4gTUxYNV9TRU5EX1dRRV9NQVhfV1FFQkJTOworfQorCiBzdGF0aWMgaW50IG1seDVlX2NyZWF0ZV9zcShzdHJ1Y3QgbWx4NWVfY2hhbm5lbCAqYywKIAkJCSAgIGludCB0YywKIAkJCSAgIHN0cnVjdCBtbHg1ZV9zcV9wYXJhbSAqcGFyYW0sCkBAIC02MzAsNiArOTEwLDEzIEBACiAJdm9pZCAqc3FjX3dxID0gTUxYNV9BRERSX09GKHNxYywgc3FjLCB3cSk7CiAJaW50IGVycjsKIAorCXNxLT50eXBlICAgICAgPSBwYXJhbS0+dHlwZTsKKwlzcS0+cGRldiAgICAgID0gYy0+cGRldjsKKwlzcS0+dHN0YW1wICAgID0gJnByaXYtPnRzdGFtcDsKKwlzcS0+bWtleV9iZSAgID0gYy0+bWtleV9iZTsKKwlzcS0+Y2hhbm5lbCAgID0gYzsKKwlzcS0+dGMgICAgICAgID0gdGM7CisKIAllcnIgPSBtbHg1X2FsbG9jX21hcF91YXIobWRldiwgJnNxLT51YXIsICEhTUxYNV9DQVBfR0VOKG1kZXYsIGJmKSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTY1OCwxOCArOTQ1LDcgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9zcV93cV9kZXN0cm95OwogCi0JaWYgKHBhcmFtLT5pY29zcSkgewotCQl1OCB3cV9zeiA9IG1seDVfd3FfY3ljX2dldF9zaXplKCZzcS0+d3EpOwotCi0JCXNxLT5pY29fd3FlX2luZm8gPSBremFsbG9jX25vZGUoc2l6ZW9mKCpzcS0+aWNvX3dxZV9pbmZvKSAqCi0JCQkJCQl3cV9zeiwKLQkJCQkJCUdGUF9LRVJORUwsCi0JCQkJCQljcHVfdG9fbm9kZShjLT5jcHUpKTsKLQkJaWYgKCFzcS0+aWNvX3dxZV9pbmZvKSB7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBlcnJfZnJlZV9zcV9kYjsKLQkJfQotCX0gZWxzZSB7CisJaWYgKHNxLT50eXBlID09IE1MWDVFX1NRX1RYUSkgewogCQlpbnQgdHhxX2l4OwogCiAJCXR4cV9peCA9IGMtPml4ICsgdGMgKiBwcml2LT5wYXJhbXMubnVtX2NoYW5uZWxzOwpAQCAtNjc3LDE5ICs5NTMsMTEgQEAKIAkJcHJpdi0+dHhxX3RvX3NxX21hcFt0eHFfaXhdID0gc3E7CiAJfQogCi0Jc3EtPnBkZXYgICAgICA9IGMtPnBkZXY7Ci0Jc3EtPnRzdGFtcCAgICA9ICZwcml2LT50c3RhbXA7Ci0Jc3EtPm1rZXlfYmUgICA9IGMtPm1rZXlfYmU7Ci0Jc3EtPmNoYW5uZWwgICA9IGM7Ci0Jc3EtPnRjICAgICAgICA9IHRjOwotCXNxLT5lZGdlICAgICAgPSAoc3EtPndxLnN6X20xICsgMSkgLSBNTFg1X1NFTkRfV1FFX01BWF9XUUVCQlM7CisJc3EtPmVkZ2UgPSAoc3EtPndxLnN6X20xICsgMSkgLSBtbHg1ZV9zcV9nZXRfbWF4X3dxZWJicyhzcS0+dHlwZSk7CiAJc3EtPmJmX2J1ZGdldCA9IE1MWDVFX1NRX0JGX0JVREdFVDsKIAogCXJldHVybiAwOwogCi1lcnJfZnJlZV9zcV9kYjoKLQltbHg1ZV9mcmVlX3NxX2RiKHNxKTsKLQogZXJyX3NxX3dxX2Rlc3Ryb3k6CiAJbWx4NV93cV9kZXN0cm95KCZzcS0+d3FfY3RybCk7CiAKQEAgLTcwNCw3ICs5NzIsNiBAQAogCXN0cnVjdCBtbHg1ZV9jaGFubmVsICpjID0gc3EtPmNoYW5uZWw7CiAJc3RydWN0IG1seDVlX3ByaXYgKnByaXYgPSBjLT5wcml2OwogCi0Ja2ZyZWUoc3EtPmljb193cWVfaW5mbyk7CiAJbWx4NWVfZnJlZV9zcV9kYihzcSk7CiAJbWx4NV93cV9kZXN0cm95KCZzcS0+d3FfY3RybCk7CiAJbWx4NV91bm1hcF9mcmVlX3Vhcihwcml2LT5tZGV2LCAmc3EtPnVhcik7CkBAIC03MzMsMTEgKzEwMDAsMTIgQEAKIAogCW1lbWNweShzcWMsIHBhcmFtLT5zcWMsIHNpemVvZihwYXJhbS0+c3FjKSk7CiAKLQlNTFg1X1NFVChzcWMsICBzcWMsIHRpc19udW1fMCwgcGFyYW0tPmljb3NxID8gMCA6IHByaXYtPnRpc25bc3EtPnRjXSk7CisJTUxYNV9TRVQoc3FjLCAgc3FjLCB0aXNfbnVtXzAsIHBhcmFtLT50eXBlID09IE1MWDVFX1NRX0lDTyA/CisJCQkJICAgICAgIDAgOiBwcml2LT50aXNuW3NxLT50Y10pOwogCU1MWDVfU0VUKHNxYywgIHNxYywgY3FuLAkJc3EtPmNxLm1jcS5jcW4pOwogCU1MWDVfU0VUKHNxYywgIHNxYywgbWluX3dxZV9pbmxpbmVfbW9kZSwgc3EtPm1pbl9pbmxpbmVfbW9kZSk7CiAJTUxYNV9TRVQoc3FjLCAgc3FjLCBzdGF0ZSwJCU1MWDVfU1FDX1NUQVRFX1JTVCk7Ci0JTUxYNV9TRVQoc3FjLCAgc3FjLCB0aXNfbHN0X3N6LAkJcGFyYW0tPmljb3NxID8gMCA6IDEpOworCU1MWDVfU0VUKHNxYywgIHNxYywgdGlzX2xzdF9zeiwgcGFyYW0tPnR5cGUgPT0gTUxYNUVfU1FfSUNPID8gMCA6IDEpOwogCU1MWDVfU0VUKHNxYywgIHNxYywgZmx1c2hfaW5fZXJyb3JfZW4sCTEpOwogCiAJTUxYNV9TRVQod3EsICAgd3EsIHdxX3R5cGUsICAgICAgIE1MWDVfV1FfVFlQRV9DWUNMSUMpOwpAQCAtODIxLDcgKzEwODksNiBAQAogCQlnb3RvIGVycl9kaXNhYmxlX3NxOwogCiAJaWYgKHNxLT50eHEpIHsKLQkJc2V0X2JpdChNTFg1RV9TUV9TVEFURV9XQUtFX1RYUV9FTkFCTEUsICZzcS0+c3RhdGUpOwogCQluZXRkZXZfdHhfcmVzZXRfcXVldWUoc3EtPnR4cSk7CiAJCW5ldGlmX3R4X3N0YXJ0X3F1ZXVlKHNxLT50eHEpOwogCX0KQEAgLTg0NSwzOCArMTExMiwyMiBAQAogCiBzdGF0aWMgdm9pZCBtbHg1ZV9jbG9zZV9zcShzdHJ1Y3QgbWx4NWVfc3EgKnNxKQogewotCWludCB0b3V0ID0gMDsKLQlpbnQgZXJyOwotCi0JaWYgKHNxLT50eHEpIHsKLQkJY2xlYXJfYml0KE1MWDVFX1NRX1NUQVRFX1dBS0VfVFhRX0VOQUJMRSwgJnNxLT5zdGF0ZSk7Ci0JCS8qIHByZXZlbnQgbmV0aWZfdHhfd2FrZV9xdWV1ZSAqLwotCQluYXBpX3N5bmNocm9uaXplKCZzcS0+Y2hhbm5lbC0+bmFwaSk7Ci0JCW5ldGlmX3R4X2Rpc2FibGVfcXVldWUoc3EtPnR4cSk7Ci0KLQkJLyogZW5zdXJlIGh3IGlzIG5vdGlmaWVkIG9mIGFsbCBwZW5kaW5nIHdxZXMgKi8KLQkJaWYgKG1seDVlX3NxX2hhc19yb29tX2ZvcihzcSwgMSkpCi0JCQltbHg1ZV9zZW5kX25vcChzcSwgdHJ1ZSk7Ci0KLQkJZXJyID0gbWx4NWVfbW9kaWZ5X3NxKHNxLCBNTFg1X1NRQ19TVEFURV9SRFksCi0JCQkJICAgICAgTUxYNV9TUUNfU1RBVEVfRVJSLCBmYWxzZSwgMCk7Ci0JCWlmIChlcnIpCi0JCQlzZXRfYml0KE1MWDVFX1NRX1NUQVRFX1RYX1RJTUVPVVQsICZzcS0+c3RhdGUpOwotCX0KLQotCS8qIHdhaXQgdGlsbCBzcSBpcyBlbXB0eSwgdW5sZXNzIGEgVFggdGltZW91dCBvY2N1cnJlZCBvbiB0aGlzIFNRICovCi0Jd2hpbGUgKHNxLT5jYyAhPSBzcS0+cGMgJiYKLQkgICAgICAgIXRlc3RfYml0KE1MWDVFX1NRX1NUQVRFX1RYX1RJTUVPVVQsICZzcS0+c3RhdGUpKSB7Ci0JCW1zbGVlcChNTFg1X0VOX1FQX0ZMVVNIX01TTEVFUF9RVUFOVCk7Ci0JCWlmICh0b3V0KysgPiBNTFg1X0VOX1FQX0ZMVVNIX01BWF9JVEVSKQotCQkJc2V0X2JpdChNTFg1RV9TUV9TVEFURV9UWF9USU1FT1VULCAmc3EtPnN0YXRlKTsKLQl9Ci0KLQkvKiBhdm9pZCBkZXN0cm95aW5nIHNxIGJlZm9yZSBtbHg1ZV9wb2xsX3R4X2NxKCkgaXMgZG9uZSB3aXRoIGl0ICovCisJc2V0X2JpdChNTFg1RV9TUV9TVEFURV9GTFVTSCwgJnNxLT5zdGF0ZSk7CisJLyogcHJldmVudCBuZXRpZl90eF93YWtlX3F1ZXVlICovCiAJbmFwaV9zeW5jaHJvbml6ZSgmc3EtPmNoYW5uZWwtPm5hcGkpOwogCi0JbWx4NWVfZnJlZV90eF9kZXNjcyhzcSk7CisJaWYgKHNxLT50eHEpIHsKKwkJbmV0aWZfdHhfZGlzYWJsZV9xdWV1ZShzcS0+dHhxKTsKKworCQkvKiBsYXN0IGRvb3JiZWxsIG91dCwgZ29kc3BlZWQgLi4gKi8KKwkJaWYgKG1seDVlX3NxX2hhc19yb29tX2ZvcihzcSwgMSkpIHsKKwkJCXNxLT5kYi50eHEuc2tiWyhzcS0+cGMgJiBzcS0+d3Euc3pfbTEpXSA9IE5VTEw7CisJCQltbHg1ZV9zZW5kX25vcChzcSwgdHJ1ZSk7CisJCX0KKwl9CisKIAltbHg1ZV9kaXNhYmxlX3NxKHNxKTsKKwltbHg1ZV9mcmVlX3NxX2Rlc2NzKHNxKTsKIAltbHg1ZV9kZXN0cm95X3NxKHNxKTsKIH0KIApAQCAtMTIzNywxNCArMTQ4OCwzMSBAQAogCQl9CiAJfQogCisJaWYgKHByaXYtPnhkcF9wcm9nKSB7CisJCS8qIFhEUCBTUSBDUSBwYXJhbXMgYXJlIHNhbWUgYXMgbm9ybWFsIFRYUSBzcSBDUSBwYXJhbXMgKi8KKwkJZXJyID0gbWx4NWVfb3Blbl9jcShjLCAmY3BhcmFtLT50eF9jcSwgJmMtPnhkcF9zcS5jcSwKKwkJCQkgICAgcHJpdi0+cGFyYW1zLnR4X2NxX21vZGVyYXRpb24pOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfY2xvc2Vfc3FzOworCisJCWVyciA9IG1seDVlX29wZW5fc3EoYywgMCwgJmNwYXJhbS0+eGRwX3NxLCAmYy0+eGRwX3NxKTsKKwkJaWYgKGVycikgeworCQkJbWx4NWVfY2xvc2VfY3EoJmMtPnhkcF9zcS5jcSk7CisJCQlnb3RvIGVycl9jbG9zZV9zcXM7CisJCX0KKwl9CisKKwljLT54ZHAgPSAhIXByaXYtPnhkcF9wcm9nOwogCWVyciA9IG1seDVlX29wZW5fcnEoYywgJmNwYXJhbS0+cnEsICZjLT5ycSk7CiAJaWYgKGVycikKLQkJZ290byBlcnJfY2xvc2Vfc3FzOworCQlnb3RvIGVycl9jbG9zZV94ZHBfc3E7CiAKIAluZXRpZl9zZXRfeHBzX3F1ZXVlKG5ldGRldiwgZ2V0X2NwdV9tYXNrKGMtPmNwdSksIGl4KTsKIAkqY3AgPSBjOwogCiAJcmV0dXJuIDA7CitlcnJfY2xvc2VfeGRwX3NxOgorCW1seDVlX2Nsb3NlX3NxKCZjLT54ZHBfc3EpOwogCiBlcnJfY2xvc2Vfc3FzOgogCW1seDVlX2Nsb3NlX3NxcyhjKTsKQEAgLTEyNzMsOSArMTU0MSwxMyBAQAogc3RhdGljIHZvaWQgbWx4NWVfY2xvc2VfY2hhbm5lbChzdHJ1Y3QgbWx4NWVfY2hhbm5lbCAqYykKIHsKIAltbHg1ZV9jbG9zZV9ycSgmYy0+cnEpOworCWlmIChjLT54ZHApCisJCW1seDVlX2Nsb3NlX3NxKCZjLT54ZHBfc3EpOwogCW1seDVlX2Nsb3NlX3NxcyhjKTsKIAltbHg1ZV9jbG9zZV9zcSgmYy0+aWNvc3EpOwogCW5hcGlfZGlzYWJsZSgmYy0+bmFwaSk7CisJaWYgKGMtPnhkcCkKKwkJbWx4NWVfY2xvc2VfY3EoJmMtPnhkcF9zcS5jcSk7CiAJbWx4NWVfY2xvc2VfY3EoJmMtPnJxLmNxKTsKIAltbHg1ZV9jbG9zZV90eF9jcXMoYyk7CiAJbWx4NWVfY2xvc2VfY3EoJmMtPmljb3NxLmNxKTsKQEAgLTEzNDksNiArMTYyMSw3IEBACiAKIAlwYXJhbS0+bWF4X2lubGluZSA9IHByaXYtPnBhcmFtcy50eF9tYXhfaW5saW5lOwogCXBhcmFtLT5taW5faW5saW5lX21vZGUgPSBwcml2LT5wYXJhbXMudHhfbWluX2lubGluZV9tb2RlOworCXBhcmFtLT50eXBlID0gTUxYNUVfU1FfVFhROwogfQogCiBzdGF0aWMgdm9pZCBtbHg1ZV9idWlsZF9jb21tb25fY3FfcGFyYW0oc3RydWN0IG1seDVlX3ByaXYgKnByaXYsCkBAIC0xNDIyLDcgKzE2OTUsMjIgQEAKIAlNTFg1X1NFVCh3cSwgd3EsIGxvZ193cV9zeiwgbG9nX3dxX3NpemUpOwogCU1MWDVfU0VUKHNxYywgc3FjLCByZWdfdW1yLCBNTFg1X0NBUF9FVEgocHJpdi0+bWRldiwgcmVnX3Vtcl9zcSkpOwogCi0JcGFyYW0tPmljb3NxID0gdHJ1ZTsKKwlwYXJhbS0+dHlwZSA9IE1MWDVFX1NRX0lDTzsKK30KKworc3RhdGljIHZvaWQgbWx4NWVfYnVpbGRfeGRwc3FfcGFyYW0oc3RydWN0IG1seDVlX3ByaXYgKnByaXYsCisJCQkJICAgIHN0cnVjdCBtbHg1ZV9zcV9wYXJhbSAqcGFyYW0pCit7CisJdm9pZCAqc3FjID0gcGFyYW0tPnNxYzsKKwl2b2lkICp3cSA9IE1MWDVfQUREUl9PRihzcWMsIHNxYywgd3EpOworCisJbWx4NWVfYnVpbGRfc3FfcGFyYW1fY29tbW9uKHByaXYsIHBhcmFtKTsKKwlNTFg1X1NFVCh3cSwgd3EsIGxvZ193cV9zeiwgICAgIHByaXYtPnBhcmFtcy5sb2dfc3Ffc2l6ZSk7CisKKwlwYXJhbS0+bWF4X2lubGluZSA9IHByaXYtPnBhcmFtcy50eF9tYXhfaW5saW5lOworCS8qIEZPUiBYRFAgU1FzIHdpbGwgc3VwcG9ydCBvbmx5IEwyIGlubGluZSBtb2RlICovCisJcGFyYW0tPm1pbl9pbmxpbmVfbW9kZSA9IE1MWDVfSU5MSU5FX01PREVfTk9ORTsKKwlwYXJhbS0+dHlwZSA9IE1MWDVFX1NRX1hEUDsKIH0KIAogc3RhdGljIHZvaWQgbWx4NWVfYnVpbGRfY2hhbm5lbF9wYXJhbShzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdiwgc3RydWN0IG1seDVlX2NoYW5uZWxfcGFyYW0gKmNwYXJhbSkKQEAgLTE0MzEsNiArMTcxOSw3IEBACiAKIAltbHg1ZV9idWlsZF9ycV9wYXJhbShwcml2LCAmY3BhcmFtLT5ycSk7CiAJbWx4NWVfYnVpbGRfc3FfcGFyYW0ocHJpdiwgJmNwYXJhbS0+c3EpOworCW1seDVlX2J1aWxkX3hkcHNxX3BhcmFtKHByaXYsICZjcGFyYW0tPnhkcF9zcSk7CiAJbWx4NWVfYnVpbGRfaWNvc3FfcGFyYW0ocHJpdiwgJmNwYXJhbS0+aWNvc3EsIGljb3NxX2xvZ193cV9zeik7CiAJbWx4NWVfYnVpbGRfcnhfY3FfcGFyYW0ocHJpdiwgJmNwYXJhbS0+cnhfY3EpOwogCW1seDVlX2J1aWxkX3R4X2NxX3BhcmFtKHByaXYsICZjcGFyYW0tPnR4X2NxKTsKQEAgLTE4MjYsMTAgKzIxMTUsNiBAQAogCW5ldGlmX3NldF9yZWFsX251bV90eF9xdWV1ZXMobmV0ZGV2LCBudW1fdHhxcyk7CiAJbmV0aWZfc2V0X3JlYWxfbnVtX3J4X3F1ZXVlcyhuZXRkZXYsIHByaXYtPnBhcmFtcy5udW1fY2hhbm5lbHMpOwogCi0JZXJyID0gbWx4NWVfc2V0X2Rldl9wb3J0X210dShuZXRkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2NsZWFyX3N0YXRlX29wZW5lZF9mbGFnOwotCiAJZXJyID0gbWx4NWVfb3Blbl9jaGFubmVscyhwcml2KTsKIAlpZiAoZXJyKSB7CiAJCW5ldGRldl9lcnIobmV0ZGV2LCAiJXM6IG1seDVlX29wZW5fY2hhbm5lbHMgZmFpbGVkLCAlZFxuIiwKQEAgLTE5MDgsNiArMjE5Myw5IEBACiAJc3RydWN0IG1seDVlX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWludCBlcnI7CiAKKwlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KG5ldGRldikpCisJCXJldHVybiAtRU5PREVWOworCiAJbXV0ZXhfbG9jaygmcHJpdi0+c3RhdGVfbG9jayk7CiAJZXJyID0gbWx4NWVfY2xvc2VfbG9ja2VkKG5ldGRldik7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5zdGF0ZV9sb2NrKTsKQEAgLTIwMjIsMTQgKzIzMTAsMTUgQEAKIHN0YXRpYyBpbnQgbWx4NWVfY3JlYXRlX3RpcyhzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdiwgaW50IHRjKQogewogCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2ID0gcHJpdi0+bWRldjsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhjcmVhdGVfdGlzX2luKV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoY3JlYXRlX3Rpc19pbildID0gezB9OwogCXZvaWQgKnRpc2MgPSBNTFg1X0FERFJfT0YoY3JlYXRlX3Rpc19pbiwgaW4sIGN0eCk7CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCiAJTUxYNV9TRVQodGlzYywgdGlzYywgcHJpbywgdGMgPDwgMSk7CiAJTUxYNV9TRVQodGlzYywgdGlzYywgdHJhbnNwb3J0X2RvbWFpbiwgbWRldi0+bWx4NWVfcmVzLnRkLnRkbik7CiAKKwlpZiAobWx4NV9sYWdfaXNfbGFjcF9vd25lcihtZGV2KSkKKwkJTUxYNV9TRVQodGlzYywgdGlzYywgc3RyaWN0X2xhZ190eF9wb3J0X2FmZmluaXR5LCAxKTsKKwogCXJldHVybiBtbHg1X2NvcmVfY3JlYXRlX3RpcyhtZGV2LCBpbiwgc2l6ZW9mKGluKSwgJnByaXYtPnRpc25bdGNdKTsKIH0KIApAQCAtMjU3Myw2ICsyODYyLDcgQEAKIAl1MTYgbWF4X210dTsKIAl1MTYgbWluX210dTsKIAlpbnQgZXJyID0gMDsKKwlib29sIHJlc2V0OwogCiAJbWx4NV9xdWVyeV9wb3J0X21heF9tdHUobWRldiwgJm1heF9tdHUsIDEpOwogCkBAIC0yNTg4LDEzICsyODc4LDE4IEBACiAKIAltdXRleF9sb2NrKCZwcml2LT5zdGF0ZV9sb2NrKTsKIAorCXJlc2V0ID0gIXByaXYtPnBhcmFtcy5scm9fZW4gJiYKKwkJKHByaXYtPnBhcmFtcy5ycV93cV90eXBlICE9CisJCSBNTFg1X1dRX1RZUEVfTElOS0VEX0xJU1RfU1RSSURJTkdfUlEpOworCiAJd2FzX29wZW5lZCA9IHRlc3RfYml0KE1MWDVFX1NUQVRFX09QRU5FRCwgJnByaXYtPnN0YXRlKTsKLQlpZiAod2FzX29wZW5lZCkKKwlpZiAod2FzX29wZW5lZCAmJiByZXNldCkKIAkJbWx4NWVfY2xvc2VfbG9ja2VkKG5ldGRldik7CiAKIAluZXRkZXYtPm10dSA9IG5ld19tdHU7CisJbWx4NWVfc2V0X2Rldl9wb3J0X210dShuZXRkZXYpOwogCi0JaWYgKHdhc19vcGVuZWQpCisJaWYgKHdhc19vcGVuZWQgJiYgcmVzZXQpCiAJCWVyciA9IG1seDVlX29wZW5fbG9ja2VkKG5ldGRldik7CiAKIAltdXRleF91bmxvY2soJnByaXYtPnN0YXRlX2xvY2spOwpAQCAtMjYyMiwxMSArMjkxNywxNSBAQAogCXJldHVybiBtbHg1X2Vzd2l0Y2hfc2V0X3Zwb3J0X21hYyhtZGV2LT5wcml2LmVzd2l0Y2gsIHZmICsgMSwgbWFjKTsKIH0KIAotc3RhdGljIGludCBtbHg1ZV9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MpCitzdGF0aWMgaW50IG1seDVlX3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcywKKwkJCSAgICAgX19iZTE2IHZsYW5fcHJvdG8pCiB7CiAJc3RydWN0IG1seDVlX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2ID0gcHJpdi0+bWRldjsKIAorCWlmICh2bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFRKSkKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisKIAlyZXR1cm4gbWx4NV9lc3dpdGNoX3NldF92cG9ydF92bGFuKG1kZXYtPnByaXYuZXN3aXRjaCwgdmYgKyAxLAogCQkJCQkgICB2bGFuLCBxb3MpOwogfQpAQCAtMjc5NCw3ICszMDkzLDcgQEAKIAkJaWYgKCFuZXRpZl94bWl0X3N0b3BwZWQobmV0ZGV2X2dldF90eF9xdWV1ZShkZXYsIGkpKSkKIAkJCWNvbnRpbnVlOwogCQlzY2hlZF93b3JrID0gdHJ1ZTsKLQkJc2V0X2JpdChNTFg1RV9TUV9TVEFURV9UWF9USU1FT1VULCAmc3EtPnN0YXRlKTsKKwkJc2V0X2JpdChNTFg1RV9TUV9TVEFURV9GTFVTSCwgJnNxLT5zdGF0ZSk7CiAJCW5ldGRldl9lcnIoZGV2LCAiVFggdGltZW91dCBvbiBxdWV1ZTogJWQsIFNROiAweCV4LCBDUTogMHgleCwgU1EgQ29uczogMHgleCBTUSBQcm9kOiAweCV4XG4iLAogCQkJICAgaSwgc3EtPnNxbiwgc3EtPmNxLm1jcS5jcW4sIHNxLT5jYywgc3EtPnBjKTsKIAl9CkBAIC0yODAzLDYgKzMxMDIsMTA2IEBACiAJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnR4X3RpbWVvdXRfd29yayk7CiB9CiAKK3N0YXRpYyBpbnQgbWx4NWVfeGRwX3NldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCit7CisJc3RydWN0IG1seDVlX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBicGZfcHJvZyAqb2xkX3Byb2c7CisJaW50IGVyciA9IDA7CisJYm9vbCByZXNldCwgd2FzX29wZW5lZDsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJnByaXYtPnN0YXRlX2xvY2spOworCisJaWYgKChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pICYmIHByb2cpIHsKKwkJbmV0ZGV2X3dhcm4obmV0ZGV2LCAiY2FuJ3Qgc2V0IFhEUCB3aGlsZSBMUk8gaXMgb24sIGRpc2FibGUgTFJPIGZpcnN0XG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byB1bmxvY2s7CisJfQorCisJd2FzX29wZW5lZCA9IHRlc3RfYml0KE1MWDVFX1NUQVRFX09QRU5FRCwgJnByaXYtPnN0YXRlKTsKKwkvKiBubyBuZWVkIGZvciBmdWxsIHJlc2V0IHdoZW4gZXhjaGFuZ2luZyBwcm9ncmFtcyAqLworCXJlc2V0ID0gKCFwcml2LT54ZHBfcHJvZyB8fCAhcHJvZyk7CisKKwlpZiAod2FzX29wZW5lZCAmJiByZXNldCkKKwkJbWx4NWVfY2xvc2VfbG9ja2VkKG5ldGRldik7CisKKwkvKiBleGNoYW5nZSBwcm9ncmFtcyAqLworCW9sZF9wcm9nID0geGNoZygmcHJpdi0+eGRwX3Byb2csIHByb2cpOworCWlmIChwcm9nKQorCQlicGZfcHJvZ19hZGQocHJvZywgMSk7CisJaWYgKG9sZF9wcm9nKQorCQlicGZfcHJvZ19wdXQob2xkX3Byb2cpOworCisJaWYgKHJlc2V0KSAvKiBjaGFuZ2UgUlEgdHlwZSBhY2NvcmRpbmcgdG8gcHJpdi0+eGRwX3Byb2cgKi8KKwkJbWx4NWVfc2V0X3JxX3ByaXZfcGFyYW1zKHByaXYpOworCisJaWYgKHdhc19vcGVuZWQgJiYgcmVzZXQpCisJCW1seDVlX29wZW5fbG9ja2VkKG5ldGRldik7CisKKwlpZiAoIXRlc3RfYml0KE1MWDVFX1NUQVRFX09QRU5FRCwgJnByaXYtPnN0YXRlKSB8fCByZXNldCkKKwkJZ290byB1bmxvY2s7CisKKwkvKiBleGNoYW5naW5nIHByb2dyYW1zIHcvbyByZXNldCwgd2UgdXBkYXRlIHJlZiBjb3VudHMgb24gYmVoYWxmCisJICogb2YgdGhlIGNoYW5uZWxzIFJRcyBoZXJlLgorCSAqLworCWJwZl9wcm9nX2FkZChwcm9nLCBwcml2LT5wYXJhbXMubnVtX2NoYW5uZWxzKTsKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+cGFyYW1zLm51bV9jaGFubmVsczsgaSsrKSB7CisJCXN0cnVjdCBtbHg1ZV9jaGFubmVsICpjID0gcHJpdi0+Y2hhbm5lbFtpXTsKKworCQlzZXRfYml0KE1MWDVFX1JRX1NUQVRFX0ZMVVNILCAmYy0+cnEuc3RhdGUpOworCQluYXBpX3N5bmNocm9uaXplKCZjLT5uYXBpKTsKKwkJLyogcHJldmVudCBtbHg1ZV9wb2xsX3J4X2NxIGZyb20gYWNjZXNzaW5nIHJxLT54ZHBfcHJvZyAqLworCisJCW9sZF9wcm9nID0geGNoZygmYy0+cnEueGRwX3Byb2csIHByb2cpOworCisJCWNsZWFyX2JpdChNTFg1RV9SUV9TVEFURV9GTFVTSCwgJmMtPnJxLnN0YXRlKTsKKwkJLyogbmFwaV9zY2hlZHVsZSBpbiBjYXNlIHdlIGhhdmUgbWlzc2VkIGFueXRoaW5nICovCisJCXNldF9iaXQoTUxYNUVfQ0hBTk5FTF9OQVBJX1NDSEVELCAmYy0+ZmxhZ3MpOworCQluYXBpX3NjaGVkdWxlKCZjLT5uYXBpKTsKKworCQlpZiAob2xkX3Byb2cpCisJCQlicGZfcHJvZ19wdXQob2xkX3Byb2cpOworCX0KKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmcHJpdi0+c3RhdGVfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJvb2wgbWx4NWVfeGRwX2F0dGFjaGVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1seDVlX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICEhcHJpdi0+eGRwX3Byb2c7Cit9CisKK3N0YXRpYyBpbnQgbWx4NWVfeGRwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRkZXZfeGRwICp4ZHApCit7CisJc3dpdGNoICh4ZHAtPmNvbW1hbmQpIHsKKwljYXNlIFhEUF9TRVRVUF9QUk9HOgorCQlyZXR1cm4gbWx4NWVfeGRwX3NldChkZXYsIHhkcC0+cHJvZyk7CisJY2FzZSBYRFBfUVVFUllfUFJPRzoKKwkJeGRwLT5wcm9nX2F0dGFjaGVkID0gbWx4NWVfeGRwX2F0dGFjaGVkKGRldik7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisvKiBGYWtlICJpbnRlcnJ1cHQiIGNhbGxlZCBieSBuZXRwb2xsIChlZyBuZXRjb25zb2xlKSB0byBzZW5kIHNrYnMgd2l0aG91dAorICogcmVlbmFibGluZyBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgdm9pZCBtbHg1ZV9uZXRwb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1seDVlX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHByaXYtPnBhcmFtcy5udW1fY2hhbm5lbHM7IGkrKykKKwkJbmFwaV9zY2hlZHVsZSgmcHJpdi0+Y2hhbm5lbFtpXS0+bmFwaSk7Cit9CisjZW5kaWYKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBtbHg1ZV9uZXRkZXZfb3BzX2Jhc2ljID0gewogCS5uZG9fb3BlbiAgICAgICAgICAgICAgICA9IG1seDVlX29wZW4sCiAJLm5kb19zdG9wICAgICAgICAgICAgICAgID0gbWx4NWVfY2xvc2UsCkBAIC0yODIyLDYgKzMyMjEsMTAgQEAKIAkubmRvX3J4X2Zsb3dfc3RlZXIJID0gbWx4NWVfcnhfZmxvd19zdGVlciwKICNlbmRpZgogCS5uZG9fdHhfdGltZW91dCAgICAgICAgICA9IG1seDVlX3R4X3RpbWVvdXQsCisJLm5kb194ZHAJCSA9IG1seDVlX3hkcCwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyICAgICA9IG1seDVlX25ldHBvbGwsCisjZW5kaWYKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbWx4NWVfbmV0ZGV2X29wc19zcmlvdiA9IHsKQEAgLTI4NTMsNiArMzI1NiwxMCBAQAogCS5uZG9fc2V0X3ZmX2xpbmtfc3RhdGUgICA9IG1seDVlX3NldF92Zl9saW5rX3N0YXRlLAogCS5uZG9fZ2V0X3ZmX3N0YXRzICAgICAgICA9IG1seDVlX2dldF92Zl9zdGF0cywKIAkubmRvX3R4X3RpbWVvdXQgICAgICAgICAgPSBtbHg1ZV90eF90aW1lb3V0LAorCS5uZG9feGRwCQkgPSBtbHg1ZV94ZHAsCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwkubmRvX3BvbGxfY29udHJvbGxlciAgICAgPSBtbHg1ZV9uZXRwb2xsLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IG1seDVlX2NoZWNrX3JlcXVpcmVkX2hjYV9jYXAoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYpCkBAIC0yOTI3LDEzICszMzM0LDYgQEAKIAkJaW5kaXJlY3Rpb25fcnF0W2ldID0gaSAlIG51bV9jaGFubmVsczsKIH0KIAotc3RhdGljIGJvb2wgbWx4NWVfY2hlY2tfZnJhZ21lbnRlZF9zdHJpZGluZ19ycV9jYXAoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYpCi17Ci0JcmV0dXJuIE1MWDVfQ0FQX0dFTihtZGV2LCBzdHJpZGluZ19ycSkgJiYKLQkJTUxYNV9DQVBfR0VOKG1kZXYsIHVtcl9wdHJfcmxreSkgJiYKLQkJTUxYNV9DQVBfRVRIKG1kZXYsIHJlZ191bXJfc3EpOwotfQotCiBzdGF0aWMgaW50IG1seDVlX2dldF9wY2lfYncoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHUzMiAqcGNpX2J3KQogewogCWVudW0gcGNpZV9saW5rX3dpZHRoIHdpZHRoOwpAQCAtMzAxMywxMSArMzQxMywxMyBAQAogCQkJCQkgTUxYNV9DUV9QRVJJT0RfTU9ERV9TVEFSVF9GUk9NX0NRRSA6CiAJCQkJCSBNTFg1X0NRX1BFUklPRF9NT0RFX1NUQVJUX0ZST01fRVFFOwogCi0JcHJpdi0+cGFyYW1zLmxvZ19zcV9zaXplICAgICAgICAgICA9Ci0JCU1MWDVFX1BBUkFNU19ERUZBVUxUX0xPR19TUV9TSVpFOwotCXByaXYtPnBhcmFtcy5ycV93cV90eXBlID0gbWx4NWVfY2hlY2tfZnJhZ21lbnRlZF9zdHJpZGluZ19ycV9jYXAobWRldikgPwotCQlNTFg1X1dRX1RZUEVfTElOS0VEX0xJU1RfU1RSSURJTkdfUlEgOgotCQlNTFg1X1dRX1RZUEVfTElOS0VEX0xJU1Q7CisJcHJpdi0+bWRldiAgICAgICAgICAgICAgICAgICAgICAgICA9IG1kZXY7CisJcHJpdi0+bmV0ZGV2ICAgICAgICAgICAgICAgICAgICAgICA9IG5ldGRldjsKKwlwcml2LT5wYXJhbXMubnVtX2NoYW5uZWxzICAgICAgICAgID0gcHJvZmlsZS0+bWF4X25jaChtZGV2KTsKKwlwcml2LT5wcm9maWxlICAgICAgICAgICAgICAgICAgICAgID0gcHJvZmlsZTsKKwlwcml2LT5wcHJpdiAgICAgICAgICAgICAgICAgICAgICAgID0gcHByaXY7CisKKwlwcml2LT5wYXJhbXMubG9nX3NxX3NpemUgPSBNTFg1RV9QQVJBTVNfREVGQVVMVF9MT0dfU1FfU0laRTsKIAogCS8qIHNldCBDUUUgY29tcHJlc3Npb24gKi8KIAlwcml2LT5wYXJhbXMucnhfY3FlX2NvbXByZXNzX2FkbWluID0gZmFsc2U7CkBAIC0zMDMwLDMzICszNDMyLDExIEBACiAJCXByaXYtPnBhcmFtcy5yeF9jcWVfY29tcHJlc3NfYWRtaW4gPQogCQkJY3FlX2NvbXByZXNzX2hldXJpc3RpYyhsaW5rX3NwZWVkLCBwY2lfYncpOwogCX0KLQogCXByaXYtPnBhcmFtcy5yeF9jcWVfY29tcHJlc3MgPSBwcml2LT5wYXJhbXMucnhfY3FlX2NvbXByZXNzX2FkbWluOwogCi0Jc3dpdGNoIChwcml2LT5wYXJhbXMucnFfd3FfdHlwZSkgewotCWNhc2UgTUxYNV9XUV9UWVBFX0xJTktFRF9MSVNUX1NUUklESU5HX1JROgotCQlwcml2LT5wYXJhbXMubG9nX3JxX3NpemUgPSBNTFg1RV9QQVJBTVNfREVGQVVMVF9MT0dfUlFfU0laRV9NUFc7Ci0JCXByaXYtPnBhcmFtcy5tcHdxZV9sb2dfc3RyaWRlX3N6ID0KLQkJCXByaXYtPnBhcmFtcy5yeF9jcWVfY29tcHJlc3MgPwotCQkJTUxYNV9NUFdSUV9MT0dfU1RSSURFX1NJWkVfQ1FFX0NPTVBSRVNTIDoKLQkJCU1MWDVfTVBXUlFfTE9HX1NUUklERV9TSVpFOwotCQlwcml2LT5wYXJhbXMubXB3cWVfbG9nX251bV9zdHJpZGVzID0gTUxYNV9NUFdSUV9MT0dfV1FFX1NaIC0KLQkJCXByaXYtPnBhcmFtcy5tcHdxZV9sb2dfc3RyaWRlX3N6OworCW1seDVlX3NldF9ycV9wcml2X3BhcmFtcyhwcml2KTsKKwlpZiAocHJpdi0+cGFyYW1zLnJxX3dxX3R5cGUgPT0gTUxYNV9XUV9UWVBFX0xJTktFRF9MSVNUX1NUUklESU5HX1JRKQogCQlwcml2LT5wYXJhbXMubHJvX2VuID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDogLyogTUxYNV9XUV9UWVBFX0xJTktFRF9MSVNUICovCi0JCXByaXYtPnBhcmFtcy5sb2dfcnFfc2l6ZSA9IE1MWDVFX1BBUkFNU19ERUZBVUxUX0xPR19SUV9TSVpFOwotCX0KLQotCW1seDVfY29yZV9pbmZvKG1kZXYsCi0JCSAgICAgICAiTUxYNUU6IFN0cmRScSglZCkgUnFTeiglbGQpIFN0cmRTeiglbGQpIFJ4Q3FlQ21wcnNzKCVkKVxuIiwKLQkJICAgICAgIHByaXYtPnBhcmFtcy5ycV93cV90eXBlID09IE1MWDVfV1FfVFlQRV9MSU5LRURfTElTVF9TVFJJRElOR19SUSwKLQkJICAgICAgIEJJVChwcml2LT5wYXJhbXMubG9nX3JxX3NpemUpLAotCQkgICAgICAgQklUKHByaXYtPnBhcmFtcy5tcHdxZV9sb2dfc3RyaWRlX3N6KSwKLQkJICAgICAgIHByaXYtPnBhcmFtcy5yeF9jcWVfY29tcHJlc3NfYWRtaW4pOwotCi0JcHJpdi0+cGFyYW1zLm1pbl9yeF93cWVzID0gbWx4NV9taW5fcnhfd3Flcyhwcml2LT5wYXJhbXMucnFfd3FfdHlwZSwKLQkJCQkJICAgIEJJVChwcml2LT5wYXJhbXMubG9nX3JxX3NpemUpKTsKIAogCXByaXYtPnBhcmFtcy5yeF9hbV9lbmFibGVkID0gTUxYNV9DQVBfR0VOKG1kZXYsIGNxX21vZGVyYXRpb24pOwogCW1seDVlX3NldF9yeF9jcV9tb2RlX3BhcmFtcygmcHJpdi0+cGFyYW1zLCBjcV9wZXJpb2RfbW9kZSk7CkBAIC0zMDc2LDE5ICszNDU2LDE2IEBACiAJbWx4NWVfYnVpbGRfZGVmYXVsdF9pbmRpcl9ycXQobWRldiwgcHJpdi0+cGFyYW1zLmluZGlyZWN0aW9uX3JxdCwKIAkJCQkgICAgICBNTFg1RV9JTkRJUl9SUVRfU0laRSwgcHJvZmlsZS0+bWF4X25jaChtZGV2KSk7CiAKLQlwcml2LT5wYXJhbXMubHJvX3dxZV9zeiAgICAgICAgICAgID0KLQkJTUxYNUVfUEFSQU1TX0RFRkFVTFRfTFJPX1dRRV9TWjsKKwlwcml2LT5wYXJhbXMubHJvX3dxZV9zeiA9CisJCU1MWDVFX1BBUkFNU19ERUZBVUxUX0xST19XUUVfU1ogLQorCQkvKiBFeHRyYSByb29tIG5lZWRlZCBmb3IgYnVpbGRfc2tiICovCisJCU1MWDVfUlhfSEVBRFJPT00gLQorCQlTS0JfREFUQV9BTElHTihzaXplb2Yoc3RydWN0IHNrYl9zaGFyZWRfaW5mbykpOwogCiAJLyogSW5pdGlhbGl6ZSBwZmxhZ3MgKi8KIAlNTFg1RV9TRVRfUFJJVl9GTEFHKHByaXYsIE1MWDVFX1BGTEFHX1JYX0NRRV9CQVNFRF9NT0RFUiwKIAkJCSAgICBwcml2LT5wYXJhbXMucnhfY3FfcGVyaW9kX21vZGUgPT0gTUxYNV9DUV9QRVJJT0RfTU9ERV9TVEFSVF9GUk9NX0NRRSk7CiAKLQlwcml2LT5tZGV2ICAgICAgICAgICAgICAgICAgICAgICAgID0gbWRldjsKLQlwcml2LT5uZXRkZXYgICAgICAgICAgICAgICAgICAgICAgID0gbmV0ZGV2OwotCXByaXYtPnBhcmFtcy5udW1fY2hhbm5lbHMgICAgICAgICAgPSBwcm9maWxlLT5tYXhfbmNoKG1kZXYpOwotCXByaXYtPnByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgPSBwcm9maWxlOwotCXByaXYtPnBwcml2ICAgICAgICAgICAgICAgICAgICAgICAgPSBwcHJpdjsKLQogI2lmZGVmIENPTkZJR19NTFg1X0NPUkVfRU5fRENCCiAJbWx4NWVfZXRzX2luaXQocHJpdik7CiAjZW5kaWYKQEAgLTMyMjgsMzUgKzM2MDUsMzcgQEAKIHN0YXRpYyBpbnQgbWx4NWVfY3JlYXRlX3Vtcl9ta2V5KHN0cnVjdCBtbHg1ZV9wcml2ICpwcml2KQogewogCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2ID0gcHJpdi0+bWRldjsKLQlzdHJ1Y3QgbWx4NV9jcmVhdGVfbWtleV9tYm94X2luICppbjsKLQlzdHJ1Y3QgbWx4NV9ta2V5X3NlZyAqbWtjOwotCWludCBpbmxlbiA9IHNpemVvZigqaW4pOwotCXU2NCBucGFnZXMgPQotCQlwcml2LT5wcm9maWxlLT5tYXhfbmNoKG1kZXYpICogTUxYNV9DSEFOTkVMX01BWF9OVU1fTVRUUzsKKwl1NjQgbnBhZ2VzID0gTUxYNUVfUkVRVUlSRURfTVRUUyhwcml2LT5wcm9maWxlLT5tYXhfbmNoKG1kZXYpLAorCQkJCQkgQklUKE1MWDVFX1BBUkFNU19NQVhJTVVNX0xPR19SUV9TSVpFX01QVykpOworCWludCBpbmxlbiA9IE1MWDVfU1RfU1pfQllURVMoY3JlYXRlX21rZXlfaW4pOworCXZvaWQgKm1rYzsKKwl1MzIgKmluOwogCWludCBlcnI7CiAKIAlpbiA9IG1seDVfdnphbGxvYyhpbmxlbik7CiAJaWYgKCFpbikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlta2MgPSAmaW4tPnNlZzsKLQlta2MtPnN0YXR1cyA9IE1MWDVfTUtFWV9TVEFUVVNfRlJFRTsKLQlta2MtPmZsYWdzID0gTUxYNV9QRVJNX1VNUl9FTiB8Ci0JCSAgICAgTUxYNV9QRVJNX0xPQ0FMX1JFQUQgfAotCQkgICAgIE1MWDVfUEVSTV9MT0NBTF9XUklURSB8Ci0JCSAgICAgTUxYNV9BQ0NFU1NfTU9ERV9NVFQ7CisJbWtjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9ta2V5X2luLCBpbiwgbWVtb3J5X2tleV9ta2V5X2VudHJ5KTsKIAotCW1rYy0+cXBuX21rZXk3XzAgPSBjcHVfdG9fYmUzMigweGZmZmZmZiA8PCA4KTsKLQlta2MtPmZsYWdzX3BkID0gY3B1X3RvX2JlMzIobWRldi0+bWx4NWVfcmVzLnBkbik7Ci0JbWtjLT5sZW4gPSBjcHVfdG9fYmU2NChucGFnZXMgPDwgUEFHRV9TSElGVCk7Ci0JbWtjLT54bHRfb2N0X3NpemUgPSBjcHVfdG9fYmUzMihtbHg1ZV9nZXRfbXR0X29jdHcobnBhZ2VzKSk7Ci0JbWtjLT5sb2cyX3BhZ2Vfc2l6ZSA9IFBBR0VfU0hJRlQ7CisJbnBhZ2VzID0gbWluX3QodTMyLCBBTElHTihVMTZfTUFYLCA0KSAqIDIsIG5wYWdlcyk7CiAKLQllcnIgPSBtbHg1X2NvcmVfY3JlYXRlX21rZXkobWRldiwgJnByaXYtPnVtcl9ta2V5LCBpbiwgaW5sZW4sIE5VTEwsCi0JCQkJICAgIE5VTEwsIE5VTEwpOworCU1MWDVfU0VUKG1rYywgbWtjLCBmcmVlLCAxKTsKKwlNTFg1X1NFVChta2MsIG1rYywgdW1yX2VuLCAxKTsKKwlNTFg1X1NFVChta2MsIG1rYywgbHcsIDEpOworCU1MWDVfU0VUKG1rYywgbWtjLCBsciwgMSk7CisJTUxYNV9TRVQobWtjLCBta2MsIGFjY2Vzc19tb2RlLCBNTFg1X01LQ19BQ0NFU1NfTU9ERV9NVFQpOworCisJTUxYNV9TRVQobWtjLCBta2MsIHFwbiwgMHhmZmZmZmYpOworCU1MWDVfU0VUKG1rYywgbWtjLCBwZCwgbWRldi0+bWx4NWVfcmVzLnBkbik7CisJTUxYNV9TRVQ2NChta2MsIG1rYywgbGVuLCBucGFnZXMgPDwgUEFHRV9TSElGVCk7CisJTUxYNV9TRVQobWtjLCBta2MsIHRyYW5zbGF0aW9uc19vY3R3b3JkX3NpemUsCisJCSBNTFg1X01UVF9PQ1RXKG5wYWdlcykpOworCU1MWDVfU0VUKG1rYywgbWtjLCBsb2dfcGFnZV9zaXplLCBQQUdFX1NISUZUKTsKKworCWVyciA9IG1seDVfY29yZV9jcmVhdGVfbWtleShtZGV2LCAmcHJpdi0+dW1yX21rZXksIGluLCBpbmxlbik7CiAKIAlrdmZyZWUoaW4pOwotCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMzM3NSw2ICszNzU0LDggQEAKIAlzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3cgPSBtZGV2LT5wcml2LmVzd2l0Y2g7CiAJc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgcmVwOwogCisJbWx4NV9sYWdfYWRkKG1kZXYsIG5ldGRldik7CisKIAlpZiAobWx4NWVfdnhsYW5fYWxsb3dlZChtZGV2KSkgewogCQlydG5sX2xvY2soKTsKIAkJdWRwX3R1bm5lbF9nZXRfcnhfaW5mbyhuZXRkZXYpOwpAQCAtMzM4NSwxMSArMzc2NiwxMiBAQAogCXF1ZXVlX3dvcmsocHJpdi0+d3EsICZwcml2LT5zZXRfcnhfbW9kZV93b3JrKTsKIAogCWlmIChNTFg1X0NBUF9HRU4obWRldiwgdnBvcnRfZ3JvdXBfbWFuYWdlcikpIHsKKwkJbWx4NV9xdWVyeV9uaWNfdnBvcnRfbWFjX2FkZHJlc3MobWRldiwgMCwgcmVwLmh3X2lkKTsKIAkJcmVwLmxvYWQgPSBtbHg1ZV9uaWNfcmVwX2xvYWQ7CiAJCXJlcC51bmxvYWQgPSBtbHg1ZV9uaWNfcmVwX3VubG9hZDsKLQkJcmVwLnZwb3J0ID0gMDsKKwkJcmVwLnZwb3J0ID0gRkRCX1VQTElOS19WUE9SVDsKIAkJcmVwLnByaXZfZGF0YSA9IHByaXY7Ci0JCW1seDVfZXN3aXRjaF9yZWdpc3Rlcl92cG9ydF9yZXAoZXN3LCAmcmVwKTsKKwkJbWx4NV9lc3dpdGNoX3JlZ2lzdGVyX3Zwb3J0X3JlcChlc3csIDAsICZyZXApOwogCX0KIH0KIApAQCAtMzM5Nyw2ICszNzc5LDcgQEAKIHsKIAlxdWV1ZV93b3JrKHByaXYtPndxLCAmcHJpdi0+c2V0X3J4X21vZGVfd29yayk7CiAJbWx4NWVfZGlzYWJsZV9hc3luY19ldmVudHMocHJpdik7CisJbWx4NV9sYWdfcmVtb3ZlKHByaXYtPm1kZXYpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1seDVlX3Byb2ZpbGUgbWx4NWVfbmljX3Byb2ZpbGUgPSB7CkBAIC0zNDEzLDEzICszNzk2LDEzIEBACiAJLm1heF90YwkJICAgPSBNTFg1RV9NQVhfTlVNX1RDLAogfTsKIAotdm9pZCAqbWx4NWVfY3JlYXRlX25ldGRldihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwKLQkJCSAgY29uc3Qgc3RydWN0IG1seDVlX3Byb2ZpbGUgKnByb2ZpbGUsIHZvaWQgKnBwcml2KQorc3RydWN0IG5ldF9kZXZpY2UgKm1seDVlX2NyZWF0ZV9uZXRkZXYoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBtbHg1ZV9wcm9maWxlICpwcm9maWxlLAorCQkJCSAgICAgICB2b2lkICpwcHJpdikKIHsKKwlpbnQgbmNoID0gcHJvZmlsZS0+bWF4X25jaChtZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCXN0cnVjdCBtbHg1ZV9wcml2ICpwcml2OwotCWludCBuY2ggPSBwcm9maWxlLT5tYXhfbmNoKG1kZXYpOwotCWludCBlcnI7CiAKIAluZXRkZXYgPSBhbGxvY19ldGhlcmRldl9tcXMoc2l6ZW9mKHN0cnVjdCBtbHg1ZV9wcml2KSwKIAkJCQkgICAgbmNoICogcHJvZmlsZS0+bWF4X3RjLApAQCAtMzQzNywxMiArMzgyMCwzMSBAQAogCiAJcHJpdi0+d3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgibWx4NWUiKTsKIAlpZiAoIXByaXYtPndxKQotCQlnb3RvIGVycl9mcmVlX25ldGRldjsKKwkJZ290byBlcnJfY2xlYW51cF9uaWM7CisKKwlyZXR1cm4gbmV0ZGV2OworCitlcnJfY2xlYW51cF9uaWM6CisJcHJvZmlsZS0+Y2xlYW51cChwcml2KTsKKwlmcmVlX25ldGRldihuZXRkZXYpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBtbHg1ZV9hdHRhY2hfbmV0ZGV2KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCWNvbnN0IHN0cnVjdCBtbHg1ZV9wcm9maWxlICpwcm9maWxlOworCXN0cnVjdCBtbHg1ZV9wcml2ICpwcml2OworCWludCBlcnI7CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlwcm9maWxlID0gcHJpdi0+cHJvZmlsZTsKKwljbGVhcl9iaXQoTUxYNUVfU1RBVEVfREVTVFJPWUlORywgJnByaXYtPnN0YXRlKTsKIAogCWVyciA9IG1seDVlX2NyZWF0ZV91bXJfbWtleShwcml2KTsKIAlpZiAoZXJyKSB7CiAJCW1seDVfY29yZV9lcnIobWRldiwgImNyZWF0ZSB1bXIgbWtleSBmYWlsZWQsICVkXG4iLCBlcnIpOwotCQlnb3RvIGVycl9kZXN0cm95X3dxOworCQlnb3RvIG91dDsKIAl9CiAKIAllcnIgPSBwcm9maWxlLT5pbml0X3R4KHByaXYpOwpAQCAtMzQ2MywyMCArMzg2NSwxOCBAQAogCiAJbWx4NWVfaW5pdF9sMl9hZGRyKHByaXYpOwogCi0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7Ci0JaWYgKGVycikgewotCQltbHg1X2NvcmVfZXJyKG1kZXYsICJyZWdpc3Rlcl9uZXRkZXYgZmFpbGVkLCAlZFxuIiwgZXJyKTsKLQkJZ290byBlcnJfZGVhbGxvY19xX2NvdW50ZXJzOwotCX0KKwltbHg1ZV9zZXRfZGV2X3BvcnRfbXR1KG5ldGRldik7CiAKIAlpZiAocHJvZmlsZS0+ZW5hYmxlKQogCQlwcm9maWxlLT5lbmFibGUocHJpdik7CiAKLQlyZXR1cm4gcHJpdjsKKwlydG5sX2xvY2soKTsKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQltbHg1ZV9vcGVuKG5ldGRldik7CisJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOworCXJ0bmxfdW5sb2NrKCk7CiAKLWVycl9kZWFsbG9jX3FfY291bnRlcnM6Ci0JbWx4NWVfZGVzdHJveV9xX2NvdW50ZXIocHJpdik7Ci0JcHJvZmlsZS0+Y2xlYW51cF9yeChwcml2KTsKKwlyZXR1cm4gMDsKIAogZXJyX2Nsb3NlX2Ryb3BfcnE6CiAJbWx4NWVfY2xvc2VfZHJvcF9ycShwcml2KTsKQEAgLTM0ODcsMTMgKzM4ODcsOCBAQAogZXJyX2Rlc3Ryb3lfdW1yX21rZXk6CiAJbWx4NV9jb3JlX2Rlc3Ryb3lfbWtleShtZGV2LCAmcHJpdi0+dW1yX21rZXkpOwogCi1lcnJfZGVzdHJveV93cToKLQlkZXN0cm95X3dvcmtxdWV1ZShwcml2LT53cSk7Ci0KLWVycl9mcmVlX25ldGRldjoKLQlmcmVlX25ldGRldihuZXRkZXYpOwotCi0JcmV0dXJuIE5VTEw7CitvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgbWx4NWVfcmVnaXN0ZXJfdnBvcnRfcmVwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2KQpAQCAtMzUwMSw2MSArMzg5Niw0MCBAQAogCXN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdyA9IG1kZXYtPnByaXYuZXN3aXRjaDsKIAlpbnQgdG90YWxfdmZzID0gTUxYNV9UT1RBTF9WUE9SVFMobWRldik7CiAJaW50IHZwb3J0OworCXU4IG1hY1tFVEhfQUxFTl07CiAKIAlpZiAoIU1MWDVfQ0FQX0dFTihtZGV2LCB2cG9ydF9ncm91cF9tYW5hZ2VyKSkKIAkJcmV0dXJuOwogCisJbWx4NV9xdWVyeV9uaWNfdnBvcnRfbWFjX2FkZHJlc3MobWRldiwgMCwgbWFjKTsKKwogCWZvciAodnBvcnQgPSAxOyB2cG9ydCA8IHRvdGFsX3ZmczsgdnBvcnQrKykgewogCQlzdHJ1Y3QgbWx4NV9lc3dpdGNoX3JlcCByZXA7CiAKIAkJcmVwLmxvYWQgPSBtbHg1ZV92cG9ydF9yZXBfbG9hZDsKIAkJcmVwLnVubG9hZCA9IG1seDVlX3Zwb3J0X3JlcF91bmxvYWQ7CiAJCXJlcC52cG9ydCA9IHZwb3J0OwotCQltbHg1X2Vzd2l0Y2hfcmVnaXN0ZXJfdnBvcnRfcmVwKGVzdywgJnJlcCk7CisJCWV0aGVyX2FkZHJfY29weShyZXAuaHdfaWQsIG1hYyk7CisJCW1seDVfZXN3aXRjaF9yZWdpc3Rlcl92cG9ydF9yZXAoZXN3LCB2cG9ydCwgJnJlcCk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCAqbWx4NWVfYWRkKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2KQordm9pZCBtbHg1ZV9kZXRhY2hfbmV0ZGV2KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdyA9IG1kZXYtPnByaXYuZXN3aXRjaDsKLQl2b2lkICpwcHJpdiA9IE5VTEw7Ci0Jdm9pZCAqcmV0OwotCi0JaWYgKG1seDVlX2NoZWNrX3JlcXVpcmVkX2hjYV9jYXAobWRldikpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKG1seDVlX2NyZWF0ZV9tZGV2X3Jlc291cmNlcyhtZGV2KSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQltbHg1ZV9yZWdpc3Rlcl92cG9ydF9yZXAobWRldik7Ci0KLQlpZiAoTUxYNV9DQVBfR0VOKG1kZXYsIHZwb3J0X2dyb3VwX21hbmFnZXIpKQotCQlwcHJpdiA9ICZlc3ctPm9mZmxvYWRzLnZwb3J0X3JlcHNbMF07Ci0KLQlyZXQgPSBtbHg1ZV9jcmVhdGVfbmV0ZGV2KG1kZXYsICZtbHg1ZV9uaWNfcHJvZmlsZSwgcHByaXYpOwotCWlmICghcmV0KSB7Ci0JCW1seDVlX2Rlc3Ryb3lfbWRldl9yZXNvdXJjZXMobWRldik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIG1seDVlX2Rlc3Ryb3lfbmV0ZGV2KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCBzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdikKLXsKKwlzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJY29uc3Qgc3RydWN0IG1seDVlX3Byb2ZpbGUgKnByb2ZpbGUgPSBwcml2LT5wcm9maWxlOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwcml2LT5uZXRkZXY7CiAKIAlzZXRfYml0KE1MWDVFX1NUQVRFX0RFU1RST1lJTkcsICZwcml2LT5zdGF0ZSk7CiAJaWYgKHByb2ZpbGUtPmRpc2FibGUpCiAJCXByb2ZpbGUtPmRpc2FibGUocHJpdik7CiAKIAlmbHVzaF93b3JrcXVldWUocHJpdi0+d3EpOwotCWlmICh0ZXN0X2JpdChNTFg1X0lOVEVSRkFDRV9TVEFURV9TSFVURE9XTiwgJm1kZXYtPmludGZfc3RhdGUpKSB7Ci0JCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKworCXJ0bmxfbG9jaygpOworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCiAJCW1seDVlX2Nsb3NlKG5ldGRldik7Ci0JfSBlbHNlIHsKLQkJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKLQl9CisJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCXJ0bmxfdW5sb2NrKCk7CiAKIAltbHg1ZV9kZXN0cm95X3FfY291bnRlcihwcml2KTsKIAlwcm9maWxlLT5jbGVhbnVwX3J4KHByaXYpOwpAQCAtMzU2MywxMiArMzkzNywxMDkgQEAKIAlwcm9maWxlLT5jbGVhbnVwX3R4KHByaXYpOwogCW1seDVfY29yZV9kZXN0cm95X21rZXkocHJpdi0+bWRldiwgJnByaXYtPnVtcl9ta2V5KTsKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPnVwZGF0ZV9zdGF0c193b3JrKTsKK30KKworLyogbWx4NWVfYXR0YWNoIGFuZCBtbHg1ZV9kZXRhY2ggc2NvcGUgc2hvdWxkIGJlIG9ubHkgY3JlYXRpbmcvZGVzdHJveWluZworICogaGFyZHdhcmUgY29udGV4dHMgYW5kIHRvIGNvbm5lY3QgaXQgdG8gdGhlIGN1cnJlbnQgbmV0ZGV2LgorICovCitzdGF0aWMgaW50IG1seDVlX2F0dGFjaChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgdm9pZCAqdnByaXYpCit7CisJc3RydWN0IG1seDVlX3ByaXYgKnByaXYgPSB2cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHJpdi0+bmV0ZGV2OworCWludCBlcnI7CisKKwlpZiAobmV0aWZfZGV2aWNlX3ByZXNlbnQobmV0ZGV2KSkKKwkJcmV0dXJuIDA7CisKKwllcnIgPSBtbHg1ZV9jcmVhdGVfbWRldl9yZXNvdXJjZXMobWRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IG1seDVlX2F0dGFjaF9uZXRkZXYobWRldiwgbmV0ZGV2KTsKKwlpZiAoZXJyKSB7CisJCW1seDVlX2Rlc3Ryb3lfbWRldl9yZXNvdXJjZXMobWRldik7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1seDVlX2RldGFjaChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgdm9pZCAqdnByaXYpCit7CisJc3RydWN0IG1seDVlX3ByaXYgKnByaXYgPSB2cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHJpdi0+bmV0ZGV2OworCisJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChuZXRkZXYpKQorCQlyZXR1cm47CisKKwltbHg1ZV9kZXRhY2hfbmV0ZGV2KG1kZXYsIG5ldGRldik7CisJbWx4NWVfZGVzdHJveV9tZGV2X3Jlc291cmNlcyhtZGV2KTsKK30KKworc3RhdGljIHZvaWQgKm1seDVlX2FkZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldikKK3sKKwlzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3cgPSBtZGV2LT5wcml2LmVzd2l0Y2g7CisJaW50IHRvdGFsX3ZmcyA9IE1MWDVfVE9UQUxfVlBPUlRTKG1kZXYpOworCXZvaWQgKnBwcml2ID0gTlVMTDsKKwl2b2lkICpwcml2OworCWludCB2cG9ydDsKKwlpbnQgZXJyOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisKKwllcnIgPSBtbHg1ZV9jaGVja19yZXF1aXJlZF9oY2FfY2FwKG1kZXYpOworCWlmIChlcnIpCisJCXJldHVybiBOVUxMOworCisJbWx4NWVfcmVnaXN0ZXJfdnBvcnRfcmVwKG1kZXYpOworCisJaWYgKE1MWDVfQ0FQX0dFTihtZGV2LCB2cG9ydF9ncm91cF9tYW5hZ2VyKSkKKwkJcHByaXYgPSAmZXN3LT5vZmZsb2Fkcy52cG9ydF9yZXBzWzBdOworCisJbmV0ZGV2ID0gbWx4NWVfY3JlYXRlX25ldGRldihtZGV2LCAmbWx4NWVfbmljX3Byb2ZpbGUsIHBwcml2KTsKKwlpZiAoIW5ldGRldikgeworCQltbHg1X2NvcmVfZXJyKG1kZXYsICJtbHg1ZV9jcmVhdGVfbmV0ZGV2IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX3VucmVnaXN0ZXJfcmVwczsKKwl9CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWVyciA9IG1seDVlX2F0dGFjaChtZGV2LCBwcml2KTsKKwlpZiAoZXJyKSB7CisJCW1seDVfY29yZV9lcnIobWRldiwgIm1seDVlX2F0dGFjaCBmYWlsZWQsICVkXG4iLCBlcnIpOworCQlnb3RvIGVycl9kZXN0cm95X25ldGRldjsKKwl9CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKwlpZiAoZXJyKSB7CisJCW1seDVfY29yZV9lcnIobWRldiwgInJlZ2lzdGVyX25ldGRldiBmYWlsZWQsICVkXG4iLCBlcnIpOworCQlnb3RvIGVycl9kZXRhY2g7CisJfQorCisJcmV0dXJuIHByaXY7CisKK2Vycl9kZXRhY2g6CisJbWx4NWVfZGV0YWNoKG1kZXYsIHByaXYpOworCitlcnJfZGVzdHJveV9uZXRkZXY6CisJbWx4NWVfZGVzdHJveV9uZXRkZXYobWRldiwgcHJpdik7CisKK2Vycl91bnJlZ2lzdGVyX3JlcHM6CisJZm9yICh2cG9ydCA9IDE7IHZwb3J0IDwgdG90YWxfdmZzOyB2cG9ydCsrKQorCQltbHg1X2Vzd2l0Y2hfdW5yZWdpc3Rlcl92cG9ydF9yZXAoZXN3LCB2cG9ydCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBtbHg1ZV9kZXN0cm95X25ldGRldihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgc3RydWN0IG1seDVlX3ByaXYgKnByaXYpCit7CisJY29uc3Qgc3RydWN0IG1seDVlX3Byb2ZpbGUgKnByb2ZpbGUgPSBwcml2LT5wcm9maWxlOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwcml2LT5uZXRkZXY7CisKKwl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPndxKTsKIAlpZiAocHJvZmlsZS0+Y2xlYW51cCkKIAkJcHJvZmlsZS0+Y2xlYW51cChwcml2KTsKLQotCWlmICghdGVzdF9iaXQoTUxYNV9JTlRFUkZBQ0VfU1RBVEVfU0hVVERPV04sICZtZGV2LT5pbnRmX3N0YXRlKSkKLQkJZnJlZV9uZXRkZXYobmV0ZGV2KTsKKwlmcmVlX25ldGRldihuZXRkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBtbHg1ZV9yZW1vdmUoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHZvaWQgKnZwcml2KQpAQCAtMzU3OCwxMiArNDA0OSwxMSBAQAogCXN0cnVjdCBtbHg1ZV9wcml2ICpwcml2ID0gdnByaXY7CiAJaW50IHZwb3J0OwogCi0JbWx4NWVfZGVzdHJveV9uZXRkZXYobWRldiwgcHJpdik7Ci0KIAlmb3IgKHZwb3J0ID0gMTsgdnBvcnQgPCB0b3RhbF92ZnM7IHZwb3J0KyspCiAJCW1seDVfZXN3aXRjaF91bnJlZ2lzdGVyX3Zwb3J0X3JlcChlc3csIHZwb3J0KTsKIAotCW1seDVlX2Rlc3Ryb3lfbWRldl9yZXNvdXJjZXMobWRldik7CisJbWx4NWVfZGV0YWNoKG1kZXYsIHZwcml2KTsKKwltbHg1ZV9kZXN0cm95X25ldGRldihtZGV2LCBwcml2KTsKIH0KIAogc3RhdGljIHZvaWQgKm1seDVlX2dldF9uZXRkZXYodm9pZCAqdnByaXYpCkBAIC0zNTk2LDYgKzQwNjYsOCBAQAogc3RhdGljIHN0cnVjdCBtbHg1X2ludGVyZmFjZSBtbHg1ZV9pbnRlcmZhY2UgPSB7CiAJLmFkZCAgICAgICA9IG1seDVlX2FkZCwKIAkucmVtb3ZlICAgID0gbWx4NWVfcmVtb3ZlLAorCS5hdHRhY2ggICAgPSBtbHg1ZV9hdHRhY2gsCisJLmRldGFjaCAgICA9IG1seDVlX2RldGFjaCwKIAkuZXZlbnQgICAgID0gbWx4NWVfYXN5bmNfZXZlbnQsCiAJLnByb3RvY29sICA9IE1MWDVfSU5URVJGQUNFX1BST1RPQ09MX0VUSCwKIAkuZ2V0X2RldiAgID0gbWx4NWVfZ2V0X25ldGRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9yZXAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9yZXAuYwppbmRleCAxYzdkOGI4Li4zYzk3ZGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fcmVwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX3JlcC5jCkBAIC0xMzUsMTcgKzEzNSwxNiBAQAogaW50IG1seDVlX2F0dHJfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBzd2l0Y2hkZXZfYXR0ciAqYXR0cikKIHsKIAlzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKnJlcCA9IHByaXYtPnBwcml2OwogCXN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdyA9IHByaXYtPm1kZXYtPnByaXYuZXN3aXRjaDsKLQl1OCBtYWNbRVRIX0FMRU5dOwogCiAJaWYgKGVzdy0+bW9kZSA9PSBTUklPVl9OT05FKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlzd2l0Y2ggKGF0dHItPmlkKSB7CiAJY2FzZSBTV0lUQ0hERVZfQVRUUl9JRF9QT1JUX1BBUkVOVF9JRDoKLQkJbWx4NV9xdWVyeV9uaWNfdnBvcnRfbWFjX2FkZHJlc3MocHJpdi0+bWRldiwgMCwgbWFjKTsKIAkJYXR0ci0+dS5wcGlkLmlkX2xlbiA9IEVUSF9BTEVOOwotCQltZW1jcHkoJmF0dHItPnUucHBpZC5pZCwgJm1hYywgRVRIX0FMRU4pOworCQlldGhlcl9hZGRyX2NvcHkoYXR0ci0+dS5wcGlkLmlkLCByZXAtPmh3X2lkKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtNDE0LDE5ICs0MTMsNTAgQEAKIGludCBtbHg1ZV92cG9ydF9yZXBfbG9hZChzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCiAJCQkgc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKnJlcCkKIHsKLQlyZXAtPnByaXZfZGF0YSA9IG1seDVlX2NyZWF0ZV9uZXRkZXYoZXN3LT5kZXYsICZtbHg1ZV9yZXBfcHJvZmlsZSwgcmVwKTsKLQlpZiAoIXJlcC0+cHJpdl9kYXRhKSB7Ci0JCXByX3dhcm4oIkZhaWxlZCB0byBjcmVhdGUgcmVwcmVzZW50b3IgZm9yIHZwb3J0ICVkXG4iLAorCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJaW50IGVycjsKKworCW5ldGRldiA9IG1seDVlX2NyZWF0ZV9uZXRkZXYoZXN3LT5kZXYsICZtbHg1ZV9yZXBfcHJvZmlsZSwgcmVwKTsKKwlpZiAoIW5ldGRldikgeworCQlwcl93YXJuKCJGYWlsZWQgdG8gY3JlYXRlIHJlcHJlc2VudG9yIG5ldGRldiBmb3IgdnBvcnQgJWRcbiIsCiAJCQlyZXAtPnZwb3J0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCisJcmVwLT5wcml2X2RhdGEgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJZXJyID0gbWx4NWVfYXR0YWNoX25ldGRldihlc3ctPmRldiwgbmV0ZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByX3dhcm4oIkZhaWxlZCB0byBhdHRhY2ggcmVwcmVzZW50b3IgbmV0ZGV2IGZvciB2cG9ydCAlZFxuIiwKKwkJCXJlcC0+dnBvcnQpOworCQlnb3RvIGVycl9kZXN0cm95X25ldGRldjsKKwl9CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByX3dhcm4oIkZhaWxlZCB0byByZWdpc3RlciByZXByZXNlbnRvciBuZXRkZXYgZm9yIHZwb3J0ICVkXG4iLAorCQkJcmVwLT52cG9ydCk7CisJCWdvdG8gZXJyX2RldGFjaF9uZXRkZXY7CisJfQorCiAJcmV0dXJuIDA7CisKK2Vycl9kZXRhY2hfbmV0ZGV2OgorCW1seDVlX2RldGFjaF9uZXRkZXYoZXN3LT5kZXYsIG5ldGRldik7CisKK2Vycl9kZXN0cm95X25ldGRldjoKKwltbHg1ZV9kZXN0cm95X25ldGRldihlc3ctPmRldiwgcmVwLT5wcml2X2RhdGEpOworCisJcmV0dXJuIGVycjsKKwogfQogCiB2b2lkIG1seDVlX3Zwb3J0X3JlcF91bmxvYWQoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAogCQkJICAgIHN0cnVjdCBtbHg1X2Vzd2l0Y2hfcmVwICpyZXApCiB7CiAJc3RydWN0IG1seDVlX3ByaXYgKnByaXYgPSByZXAtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHJpdi0+bmV0ZGV2OwogCisJbWx4NWVfZGV0YWNoX25ldGRldihlc3ctPmRldiwgbmV0ZGV2KTsKIAltbHg1ZV9kZXN0cm95X25ldGRldihlc3ctPmRldiwgcHJpdik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fcnguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9yeC5jCmluZGV4IDlmMmExNmEuLmM2ZGU2ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9yeC5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bmV0L2J1c3lfcG9sbC5oPgogI2luY2x1ZGUgImVuLmgiCiAjaW5jbHVkZSAiZW5fdGMuaCIKKyNpbmNsdWRlICJlc3dpdGNoLmgiCiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBtbHg1ZV9yeF9od19zdGFtcChzdHJ1Y3QgbWx4NWVfdHN0YW1wICp0c3RhbXApCiB7CkBAIC0xNzksNTEgKzE4MCw5OSBAQAogCW11dGV4X3VubG9jaygmcHJpdi0+c3RhdGVfbG9jayk7CiB9CiAKLWludCBtbHg1ZV9hbGxvY19yeF93cWUoc3RydWN0IG1seDVlX3JxICpycSwgc3RydWN0IG1seDVlX3J4X3dxZSAqd3FlLCB1MTYgaXgpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlkbWFfYWRkcl90IGRtYV9hZGRyOworI2RlZmluZSBSUV9QQUdFX1NJWkUocnEpICgoMSA8PCBycS0+YnVmZi5wYWdlX29yZGVyKSA8PCBQQUdFX1NISUZUKQogCi0Jc2tiID0gbmFwaV9hbGxvY19za2IocnEtPmNxLm5hcGksIHJxLT53cWVfc3opOwotCWlmICh1bmxpa2VseSghc2tiKSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBtbHg1ZV9yeF9jYWNoZV9wdXQoc3RydWN0IG1seDVlX3JxICpycSwKKwkJCQkgICAgICBzdHJ1Y3QgbWx4NWVfZG1hX2luZm8gKmRtYV9pbmZvKQoreworCXN0cnVjdCBtbHg1ZV9wYWdlX2NhY2hlICpjYWNoZSA9ICZycS0+cGFnZV9jYWNoZTsKKwl1MzIgdGFpbF9uZXh0ID0gKGNhY2hlLT50YWlsICsgMSkgJiAoTUxYNUVfQ0FDSEVfU0laRSAtIDEpOworCisJaWYgKHRhaWxfbmV4dCA9PSBjYWNoZS0+aGVhZCkgeworCQlycS0+c3RhdHMuY2FjaGVfZnVsbCsrOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJY2FjaGUtPnBhZ2VfY2FjaGVbY2FjaGUtPnRhaWxdID0gKmRtYV9pbmZvOworCWNhY2hlLT50YWlsID0gdGFpbF9uZXh0OworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgbWx4NWVfcnhfY2FjaGVfZ2V0KHN0cnVjdCBtbHg1ZV9ycSAqcnEsCisJCQkJICAgICAgc3RydWN0IG1seDVlX2RtYV9pbmZvICpkbWFfaW5mbykKK3sKKwlzdHJ1Y3QgbWx4NWVfcGFnZV9jYWNoZSAqY2FjaGUgPSAmcnEtPnBhZ2VfY2FjaGU7CisKKwlpZiAodW5saWtlbHkoY2FjaGUtPmhlYWQgPT0gY2FjaGUtPnRhaWwpKSB7CisJCXJxLT5zdGF0cy5jYWNoZV9lbXB0eSsrOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKHBhZ2VfcmVmX2NvdW50KGNhY2hlLT5wYWdlX2NhY2hlW2NhY2hlLT5oZWFkXS5wYWdlKSAhPSAxKSB7CisJCXJxLT5zdGF0cy5jYWNoZV9idXN5Kys7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkqZG1hX2luZm8gPSBjYWNoZS0+cGFnZV9jYWNoZVtjYWNoZS0+aGVhZF07CisJY2FjaGUtPmhlYWQgPSAoY2FjaGUtPmhlYWQgKyAxKSAmIChNTFg1RV9DQUNIRV9TSVpFIC0gMSk7CisJcnEtPnN0YXRzLmNhY2hlX3JldXNlKys7CisKKwlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShycS0+cGRldiwgZG1hX2luZm8tPmFkZHIsCisJCQkJICAgUlFfUEFHRV9TSVpFKHJxKSwKKwkJCQkgICBETUFfRlJPTV9ERVZJQ0UpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIGludCBtbHg1ZV9wYWdlX2FsbG9jX21hcHBlZChzdHJ1Y3QgbWx4NWVfcnEgKnJxLAorCQkJCQkgIHN0cnVjdCBtbHg1ZV9kbWFfaW5mbyAqZG1hX2luZm8pCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlpZiAobWx4NWVfcnhfY2FjaGVfZ2V0KHJxLCBkbWFfaW5mbykpCisJCXJldHVybiAwOworCisJcGFnZSA9IGRldl9hbGxvY19wYWdlcyhycS0+YnVmZi5wYWdlX29yZGVyKTsKKwlpZiAodW5saWtlbHkoIXBhZ2UpKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUocnEtPnBkZXYsCi0JCQkJICAvKiBodyBzdGFydCBwYWRkaW5nICovCi0JCQkJICBza2ItPmRhdGEsCi0JCQkJICAvKiBodyBlbmQgcGFkZGluZyAqLwotCQkJCSAgcnEtPndxZV9zeiwKLQkJCQkgIERNQV9GUk9NX0RFVklDRSk7Ci0KLQlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IocnEtPnBkZXYsIGRtYV9hZGRyKSkpCi0JCWdvdG8gZXJyX2ZyZWVfc2tiOwotCi0JKigoZG1hX2FkZHJfdCAqKXNrYi0+Y2IpID0gZG1hX2FkZHI7Ci0Jd3FlLT5kYXRhLmFkZHIgPSBjcHVfdG9fYmU2NChkbWFfYWRkcik7Ci0Jd3FlLT5kYXRhLmxrZXkgPSBycS0+bWtleV9iZTsKLQotCXJxLT5za2JbaXhdID0gc2tiOworCWRtYV9pbmZvLT5wYWdlID0gcGFnZTsKKwlkbWFfaW5mby0+YWRkciA9IGRtYV9tYXBfcGFnZShycS0+cGRldiwgcGFnZSwgMCwKKwkJCQkgICAgICBSUV9QQUdFX1NJWkUocnEpLCBycS0+YnVmZi5tYXBfZGlyKTsKKwlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IocnEtPnBkZXYsIGRtYV9pbmZvLT5hZGRyKSkpIHsKKwkJcHV0X3BhZ2UocGFnZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAogCXJldHVybiAwOworfQogCi1lcnJfZnJlZV9za2I6Ci0JZGV2X2tmcmVlX3NrYihza2IpOwordm9pZCBtbHg1ZV9wYWdlX3JlbGVhc2Uoc3RydWN0IG1seDVlX3JxICpycSwgc3RydWN0IG1seDVlX2RtYV9pbmZvICpkbWFfaW5mbywKKwkJCWJvb2wgcmVjeWNsZSkKK3sKKwlpZiAobGlrZWx5KHJlY3ljbGUpICYmIG1seDVlX3J4X2NhY2hlX3B1dChycSwgZG1hX2luZm8pKQorCQlyZXR1cm47CiAKLQlyZXR1cm4gLUVOT01FTTsKKwlkbWFfdW5tYXBfcGFnZShycS0+cGRldiwgZG1hX2luZm8tPmFkZHIsIFJRX1BBR0VfU0laRShycSksCisJCSAgICAgICBycS0+YnVmZi5tYXBfZGlyKTsKKwlwdXRfcGFnZShkbWFfaW5mby0+cGFnZSk7Cit9CisKK2ludCBtbHg1ZV9hbGxvY19yeF93cWUoc3RydWN0IG1seDVlX3JxICpycSwgc3RydWN0IG1seDVlX3J4X3dxZSAqd3FlLCB1MTYgaXgpCit7CisJc3RydWN0IG1seDVlX2RtYV9pbmZvICpkaSA9ICZycS0+ZG1hX2luZm9baXhdOworCisJaWYgKHVubGlrZWx5KG1seDVlX3BhZ2VfYWxsb2NfbWFwcGVkKHJxLCBkaSkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdxZS0+ZGF0YS5hZGRyID0gY3B1X3RvX2JlNjQoZGktPmFkZHIgKyBNTFg1X1JYX0hFQURST09NKTsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBtbHg1ZV9kZWFsbG9jX3J4X3dxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLCB1MTYgaXgpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJxLT5za2JbaXhdOworCXN0cnVjdCBtbHg1ZV9kbWFfaW5mbyAqZGkgPSAmcnEtPmRtYV9pbmZvW2l4XTsKIAotCWlmIChza2IpIHsKLQkJcnEtPnNrYltpeF0gPSBOVUxMOwotCQlkbWFfdW5tYXBfc2luZ2xlKHJxLT5wZGV2LAotCQkJCSAqKChkbWFfYWRkcl90ICopc2tiLT5jYiksCi0JCQkJIHJxLT53cWVfc3osCi0JCQkJIERNQV9GUk9NX0RFVklDRSk7Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKLQl9CisJbWx4NWVfcGFnZV9yZWxlYXNlKHJxLCBkaSwgdHJ1ZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG1seDVlX21wd3FlX3N0cmlkZXNfcGVyX3BhZ2Uoc3RydWN0IG1seDVlX3JxICpycSkKQEAgLTIzMSw0NCArMjgwLDExIEBACiAJcmV0dXJuIHJxLT5tcHdxZV9udW1fc3RyaWRlcyA+PiBNTFg1X01QV1JRX1dRRV9QQUdFX09SREVSOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLW1seDVlX2RtYV9wcmVfc3luY19saW5lYXJfbXB3cWUoc3RydWN0IGRldmljZSAqcGRldiwKLQkJCQlzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpLAotCQkJCXUzMiB3cWVfb2Zmc2V0LCB1MzIgbGVuKQotewotCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHBkZXYsIHdpLT5kbWFfaW5mby5hZGRyICsgd3FlX29mZnNldCwKLQkJCQlsZW4sIERNQV9GUk9NX0RFVklDRSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbWx4NWVfZG1hX3ByZV9zeW5jX2ZyYWdtZW50ZWRfbXB3cWUoc3RydWN0IGRldmljZSAqcGRldiwKLQkJCQkgICAgc3RydWN0IG1seDVlX21wd19pbmZvICp3aSwKLQkJCQkgICAgdTMyIHdxZV9vZmZzZXQsIHUzMiBsZW4pCi17Ci0JLyogTm8gZG1hIHByZSBzeW5jIGZvciBmcmFnbWVudGVkIE1QV1FFICovCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbWx4NWVfYWRkX3NrYl9mcmFnX2xpbmVhcl9tcHdxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLAotCQkJCXN0cnVjdCBza19idWZmICpza2IsCi0JCQkJc3RydWN0IG1seDVlX21wd19pbmZvICp3aSwKLQkJCQl1MzIgcGFnZV9pZHgsIHUzMiBmcmFnX29mZnNldCwKLQkJCQl1MzIgbGVuKQotewotCXVuc2lnbmVkIGludCB0cnVlc2l6ZSA9CUFMSUdOKGxlbiwgcnEtPm1wd3FlX3N0cmlkZV9zeik7Ci0KLQl3aS0+c2tic19mcmFnc1twYWdlX2lkeF0rKzsKLQlza2JfYWRkX3J4X2ZyYWcoc2tiLCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzLAotCQkJJndpLT5kbWFfaW5mby5wYWdlW3BhZ2VfaWR4XSwgZnJhZ19vZmZzZXQsCi0JCQlsZW4sIHRydWVzaXplKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1tbHg1ZV9hZGRfc2tiX2ZyYWdfZnJhZ21lbnRlZF9tcHdxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLAotCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICBzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpLAotCQkJCSAgICB1MzIgcGFnZV9pZHgsIHUzMiBmcmFnX29mZnNldCwKLQkJCQkgICAgdTMyIGxlbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBtbHg1ZV9hZGRfc2tiX2ZyYWdfbXB3cWUoc3RydWN0IG1seDVlX3JxICpycSwKKwkJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgICBzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpLAorCQkJCQkgICAgdTMyIHBhZ2VfaWR4LCB1MzIgZnJhZ19vZmZzZXQsCisJCQkJCSAgICB1MzIgbGVuKQogewogCXVuc2lnbmVkIGludCB0cnVlc2l6ZSA9CUFMSUdOKGxlbiwgcnEtPm1wd3FlX3N0cmlkZV9zeik7CiAKQEAgLTI4MiwyNCArMjk4LDExIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotbWx4NWVfY29weV9za2JfaGVhZGVyX2xpbmVhcl9tcHdxZShzdHJ1Y3QgZGV2aWNlICpwZGV2LAotCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgc3RydWN0IG1seDVlX21wd19pbmZvICp3aSwKLQkJCQkgICB1MzIgcGFnZV9pZHgsIHUzMiBvZmZzZXQsCi0JCQkJICAgdTMyIGhlYWRsZW4pCi17Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSAmd2ktPmRtYV9pbmZvLnBhZ2VbcGFnZV9pZHhdOwotCi0Jc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBwYWdlX2FkZHJlc3MocGFnZSkgKyBvZmZzZXQsCi0JCQkJQUxJR04oaGVhZGxlbiwgc2l6ZW9mKGxvbmcpKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbWx4NWVfY29weV9za2JfaGVhZGVyX2ZyYWdtZW50ZWRfbXB3cWUoc3RydWN0IGRldmljZSAqcGRldiwKLQkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgICAgc3RydWN0IG1seDVlX21wd19pbmZvICp3aSwKLQkJCQkgICAgICAgdTMyIHBhZ2VfaWR4LCB1MzIgb2Zmc2V0LAotCQkJCSAgICAgICB1MzIgaGVhZGxlbikKK21seDVlX2NvcHlfc2tiX2hlYWRlcl9tcHdxZShzdHJ1Y3QgZGV2aWNlICpwZGV2LAorCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgc3RydWN0IG1seDVlX21wd19pbmZvICp3aSwKKwkJCSAgICB1MzIgcGFnZV9pZHgsIHUzMiBvZmZzZXQsCisJCQkgICAgdTMyIGhlYWRsZW4pCiB7CiAJdTE2IGhlYWRsZW5fcGcgPSBtaW5fdCh1MzIsIGhlYWRsZW4sIFBBR0VfU0laRSAtIG9mZnNldCk7CiAJc3RydWN0IG1seDVlX2RtYV9pbmZvICpkbWFfaW5mbyA9ICZ3aS0+dW1yLmRtYV9pbmZvW3BhZ2VfaWR4XTsKQEAgLTMyNCw0NiArMzI3LDkgQEAKIAl9CiB9CiAKLXN0YXRpYyB1MTYgbWx4NWVfZ2V0X3dxZV9tdHRfb2Zmc2V0KHUxNiBycV9peCwgdTE2IHdxZV9peCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBtbHg1ZV9wb3N0X3Vtcl93cWUoc3RydWN0IG1seDVlX3JxICpycSwgdTE2IGl4KQogewotCXJldHVybiBycV9peCAqIE1MWDVfQ0hBTk5FTF9NQVhfTlVNX01UVFMgKwotCQl3cWVfaXggKiBBTElHTihNTFg1X01QV1JRX1BBR0VTX1BFUl9XUUUsIDgpOwotfQotCi1zdGF0aWMgdm9pZCBtbHg1ZV9idWlsZF91bXJfd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsCi0JCQkJc3RydWN0IG1seDVlX3NxICpzcSwKLQkJCQlzdHJ1Y3QgbWx4NWVfdW1yX3dxZSAqd3FlLAotCQkJCXUxNiBpeCkKLXsKLQlzdHJ1Y3QgbWx4NV93cWVfY3RybF9zZWcgICAgICAqY3NlZyA9ICZ3cWUtPmN0cmw7Ci0Jc3RydWN0IG1seDVfd3FlX3Vtcl9jdHJsX3NlZyAqdWNzZWcgPSAmd3FlLT51Y3RybDsKLQlzdHJ1Y3QgbWx4NV93cWVfZGF0YV9zZWcgICAgICAqZHNlZyA9ICZ3cWUtPmRhdGE7Ci0Jc3RydWN0IG1seDVlX21wd19pbmZvICp3aSA9ICZycS0+d3FlX2luZm9baXhdOwotCXU4IGRzX2NudCA9IERJVl9ST1VORF9VUChzaXplb2YoKndxZSksIE1MWDVfU0VORF9XUUVfRFMpOwotCXUxNiB1bXJfd3FlX210dF9vZmZzZXQgPSBtbHg1ZV9nZXRfd3FlX210dF9vZmZzZXQocnEtPml4LCBpeCk7Ci0KLQltZW1zZXQod3FlLCAwLCBzaXplb2YoKndxZSkpOwotCWNzZWctPm9wbW9kX2lkeF9vcGNvZGUgPQotCQljcHVfdG9fYmUzMigoc3EtPnBjIDw8IE1MWDVfV1FFX0NUUkxfV1FFX0lOREVYX1NISUZUKSB8Ci0JCQkgICAgTUxYNV9PUENPREVfVU1SKTsKLQljc2VnLT5xcG5fZHMgICAgPSBjcHVfdG9fYmUzMigoc3EtPnNxbiA8PCBNTFg1X1dRRV9DVFJMX1FQTl9TSElGVCkgfAotCQkJCSAgICAgIGRzX2NudCk7Ci0JY3NlZy0+Zm1fY2Vfc2UgID0gTUxYNV9XUUVfQ1RSTF9DUV9VUERBVEU7Ci0JY3NlZy0+aW1tICAgICAgID0gcnEtPnVtcl9ta2V5X2JlOwotCi0JdWNzZWctPmZsYWdzID0gTUxYNV9VTVJfVFJBTlNMQVRJT05fT0ZGU0VUX0VOOwotCXVjc2VnLT5rbG1fb2N0b3dvcmRzID0KLQkJY3B1X3RvX2JlMTYobWx4NWVfZ2V0X210dF9vY3R3KE1MWDVfTVBXUlFfUEFHRVNfUEVSX1dRRSkpOwotCXVjc2VnLT5ic2Zfb2N0b3dvcmRzID0KLQkJY3B1X3RvX2JlMTYobWx4NWVfZ2V0X210dF9vY3R3KHVtcl93cWVfbXR0X29mZnNldCkpOwotCXVjc2VnLT5ta2V5X21hc2sgICAgID0gY3B1X3RvX2JlNjQoTUxYNV9NS0VZX01BU0tfRlJFRSk7Ci0KLQlkc2VnLT5sa2V5ID0gc3EtPm1rZXlfYmU7Ci0JZHNlZy0+YWRkciA9IGNwdV90b19iZTY0KHdpLT51bXIubXR0X2FkZHIpOwotfQotCi1zdGF0aWMgdm9pZCBtbHg1ZV9wb3N0X3Vtcl93cWUoc3RydWN0IG1seDVlX3JxICpycSwgdTE2IGl4KQoteworCXN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2kgPSAmcnEtPm1wd3FlLmluZm9baXhdOwogCXN0cnVjdCBtbHg1ZV9zcSAqc3EgPSAmcnEtPmNoYW5uZWwtPmljb3NxOwogCXN0cnVjdCBtbHg1X3dxX2N5YyAqd3EgPSAmc3EtPndxOwogCXN0cnVjdCBtbHg1ZV91bXJfd3FlICp3cWU7CkBAIC0zNzIsMTQyICszMzgsODYgQEAKIAogCS8qIGZpbGwgc3EgZWRnZSB3aXRoIG5vcHMgdG8gYXZvaWQgd3FlIHdyYXAgYXJvdW5kICovCiAJd2hpbGUgKChwaSA9IChzcS0+cGMgJiB3cS0+c3pfbTEpKSA+IHNxLT5lZGdlKSB7Ci0JCXNxLT5pY29fd3FlX2luZm9bcGldLm9wY29kZSA9IE1MWDVfT1BDT0RFX05PUDsKLQkJc3EtPmljb193cWVfaW5mb1twaV0ubnVtX3dxZWJicyA9IDE7CisJCXNxLT5kYi5pY29fd3FlW3BpXS5vcGNvZGUgPSBNTFg1X09QQ09ERV9OT1A7CisJCXNxLT5kYi5pY29fd3FlW3BpXS5udW1fd3FlYmJzID0gMTsKIAkJbWx4NWVfc2VuZF9ub3Aoc3EsIHRydWUpOwogCX0KIAogCXdxZSA9IG1seDVfd3FfY3ljX2dldF93cWUod3EsIHBpKTsKLQltbHg1ZV9idWlsZF91bXJfd3FlKHJxLCBzcSwgd3FlLCBpeCk7Ci0Jc3EtPmljb193cWVfaW5mb1twaV0ub3Bjb2RlID0gTUxYNV9PUENPREVfVU1SOwotCXNxLT5pY29fd3FlX2luZm9bcGldLm51bV93cWViYnMgPSBudW1fd3FlYmJzOworCW1lbWNweSh3cWUsICZ3aS0+dW1yLndxZSwgc2l6ZW9mKCp3cWUpKTsKKwl3cWUtPmN0cmwub3Btb2RfaWR4X29wY29kZSA9CisJCWNwdV90b19iZTMyKChzcS0+cGMgPDwgTUxYNV9XUUVfQ1RSTF9XUUVfSU5ERVhfU0hJRlQpIHwKKwkJCSAgICBNTFg1X09QQ09ERV9VTVIpOworCisJc3EtPmRiLmljb193cWVbcGldLm9wY29kZSA9IE1MWDVfT1BDT0RFX1VNUjsKKwlzcS0+ZGIuaWNvX3dxZVtwaV0ubnVtX3dxZWJicyA9IG51bV93cWViYnM7CiAJc3EtPnBjICs9IG51bV93cWViYnM7CiAJbWx4NWVfdHhfbm90aWZ5X2h3KHNxLCAmd3FlLT5jdHJsLCAwKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbWx4NWVfZ2V0X3dxZV9tdHRfc3oodm9pZCkKK3N0YXRpYyBpbnQgbWx4NWVfYWxsb2NfcnhfdW1yX21wd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsCisJCQkJICAgIHN0cnVjdCBtbHg1ZV9yeF93cWUgKndxZSwKKwkJCQkgICAgdTE2IGl4KQogewotCS8qIFVNUiBjb3BpZXMgTVRUcyBpbiB1bml0cyBvZiBNTFg1X1VNUl9NVFRfQUxJR05NRU5UIGJ5dGVzLgotCSAqIFRvIGF2b2lkIGNvcHlpbmcgZ2FyYmFnZSBhZnRlciB0aGUgbXR0IGFycmF5LCB3ZSBhbGxvY2F0ZQotCSAqIGEgbGl0dGxlIG1vcmUuCi0JICovCi0JcmV0dXJuIEFMSUdOKE1MWDVfTVBXUlFfUEFHRVNfUEVSX1dRRSAqIHNpemVvZihfX2JlNjQpLAotCQkgICAgIE1MWDVfVU1SX01UVF9BTElHTk1FTlQpOwotfQotCi1zdGF0aWMgaW50IG1seDVlX2FsbG9jX2FuZF9tYXBfcGFnZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLAotCQkJCSAgICBzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpLAotCQkJCSAgICBpbnQgaSkKLXsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQotCXBhZ2UgPSBkZXZfYWxsb2NfcGFnZSgpOwotCWlmICh1bmxpa2VseSghcGFnZSkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jd2ktPnVtci5kbWFfaW5mb1tpXS5wYWdlID0gcGFnZTsKLQl3aS0+dW1yLmRtYV9pbmZvW2ldLmFkZHIgPSBkbWFfbWFwX3BhZ2UocnEtPnBkZXYsIHBhZ2UsIDAsIFBBR0VfU0laRSwKLQkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7Ci0JaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKHJxLT5wZGV2LCB3aS0+dW1yLmRtYV9pbmZvW2ldLmFkZHIpKSkgewotCQlwdXRfcGFnZShwYWdlKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXdpLT51bXIubXR0W2ldID0gY3B1X3RvX2JlNjQod2ktPnVtci5kbWFfaW5mb1tpXS5hZGRyIHwgTUxYNV9FTl9XUik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtbHg1ZV9hbGxvY19yeF9mcmFnbWVudGVkX21wd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsCi0JCQkJCSAgIHN0cnVjdCBtbHg1ZV9yeF93cWUgKndxZSwKLQkJCQkJICAgdTE2IGl4KQotewotCXN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2kgPSAmcnEtPndxZV9pbmZvW2l4XTsKLQlpbnQgbXR0X3N6ID0gbWx4NWVfZ2V0X3dxZV9tdHRfc3ooKTsKLQl1MzIgZG1hX29mZnNldCA9IG1seDVlX2dldF93cWVfbXR0X29mZnNldChycS0+aXgsIGl4KSA8PCBQQUdFX1NISUZUOworCXN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2kgPSAmcnEtPm1wd3FlLmluZm9baXhdOworCXU2NCBkbWFfb2Zmc2V0ID0gKHU2NCltbHg1ZV9nZXRfd3FlX210dF9vZmZzZXQocnEsIGl4KSA8PCBQQUdFX1NISUZUOworCWludCBwZ19zdHJpZGVzID0gbWx4NWVfbXB3cWVfc3RyaWRlc19wZXJfcGFnZShycSk7CisJaW50IGVycjsKIAlpbnQgaTsKIAotCXdpLT51bXIuZG1hX2luZm8gPSBrbWFsbG9jKHNpemVvZigqd2ktPnVtci5kbWFfaW5mbykgKgotCQkJCSAgIE1MWDVfTVBXUlFfUEFHRVNfUEVSX1dRRSwKLQkJCQkgICBHRlBfQVRPTUlDKTsKLQlpZiAodW5saWtlbHkoIXdpLT51bXIuZG1hX2luZm8pKQotCQlnb3RvIGVycl9vdXQ7Ci0KLQkvKiBXZSBhbGxvY2F0ZSBtb3JlIHRoYW4gbXR0X3N6IGFzIHdlIHdpbGwgYWxpZ24gdGhlIHBvaW50ZXIgKi8KLQl3aS0+dW1yLm10dF9ub19hbGlnbiA9IGt6YWxsb2MobXR0X3N6ICsgTUxYNV9VTVJfQUxJR04gLSAxLAotCQkJCSAgICAgICBHRlBfQVRPTUlDKTsKLQlpZiAodW5saWtlbHkoIXdpLT51bXIubXR0X25vX2FsaWduKSkKLQkJZ290byBlcnJfZnJlZV91bXI7Ci0KLQl3aS0+dW1yLm10dCA9IFBUUl9BTElHTih3aS0+dW1yLm10dF9ub19hbGlnbiwgTUxYNV9VTVJfQUxJR04pOwotCXdpLT51bXIubXR0X2FkZHIgPSBkbWFfbWFwX3NpbmdsZShycS0+cGRldiwgd2ktPnVtci5tdHQsIG10dF9zeiwKLQkJCQkJICBQQ0lfRE1BX1RPREVWSUNFKTsKLQlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IocnEtPnBkZXYsIHdpLT51bXIubXR0X2FkZHIpKSkKLQkJZ290byBlcnJfZnJlZV9tdHQ7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgTUxYNV9NUFdSUV9QQUdFU19QRVJfV1FFOyBpKyspIHsKLQkJaWYgKHVubGlrZWx5KG1seDVlX2FsbG9jX2FuZF9tYXBfcGFnZShycSwgd2ksIGkpKSkKKwkJc3RydWN0IG1seDVlX2RtYV9pbmZvICpkbWFfaW5mbyA9ICZ3aS0+dW1yLmRtYV9pbmZvW2ldOworCisJCWVyciA9IG1seDVlX3BhZ2VfYWxsb2NfbWFwcGVkKHJxLCBkbWFfaW5mbyk7CisJCWlmICh1bmxpa2VseShlcnIpKQogCQkJZ290byBlcnJfdW5tYXA7Ci0JCXBhZ2VfcmVmX2FkZCh3aS0+dW1yLmRtYV9pbmZvW2ldLnBhZ2UsCi0JCQkgICAgIG1seDVlX21wd3FlX3N0cmlkZXNfcGVyX3BhZ2UocnEpKTsKKwkJd2ktPnVtci5tdHRbaV0gPSBjcHVfdG9fYmU2NChkbWFfaW5mby0+YWRkciB8IE1MWDVfRU5fV1IpOworCQlwYWdlX3JlZl9hZGQoZG1hX2luZm8tPnBhZ2UsIHBnX3N0cmlkZXMpOwogCQl3aS0+c2tic19mcmFnc1tpXSA9IDA7CiAJfQogCiAJd2ktPmNvbnN1bWVkX3N0cmlkZXMgPSAwOwotCXdpLT5kbWFfcHJlX3N5bmMgPSBtbHg1ZV9kbWFfcHJlX3N5bmNfZnJhZ21lbnRlZF9tcHdxZTsKLQl3aS0+YWRkX3NrYl9mcmFnID0gbWx4NWVfYWRkX3NrYl9mcmFnX2ZyYWdtZW50ZWRfbXB3cWU7Ci0Jd2ktPmNvcHlfc2tiX2hlYWRlciA9IG1seDVlX2NvcHlfc2tiX2hlYWRlcl9mcmFnbWVudGVkX21wd3FlOwotCXdpLT5mcmVlX3dxZSAgICAgPSBtbHg1ZV9mcmVlX3J4X2ZyYWdtZW50ZWRfbXB3cWU7Ci0Jd3FlLT5kYXRhLmxrZXkgPSBycS0+dW1yX21rZXlfYmU7CiAJd3FlLT5kYXRhLmFkZHIgPSBjcHVfdG9fYmU2NChkbWFfb2Zmc2V0KTsKIAogCXJldHVybiAwOwogCiBlcnJfdW5tYXA6CiAJd2hpbGUgKC0taSA+PSAwKSB7Ci0JCWRtYV91bm1hcF9wYWdlKHJxLT5wZGV2LCB3aS0+dW1yLmRtYV9pbmZvW2ldLmFkZHIsIFBBR0VfU0laRSwKLQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQlwYWdlX3JlZl9zdWIod2ktPnVtci5kbWFfaW5mb1tpXS5wYWdlLAotCQkJICAgICBtbHg1ZV9tcHdxZV9zdHJpZGVzX3Blcl9wYWdlKHJxKSk7Ci0JCXB1dF9wYWdlKHdpLT51bXIuZG1hX2luZm9baV0ucGFnZSk7CisJCXN0cnVjdCBtbHg1ZV9kbWFfaW5mbyAqZG1hX2luZm8gPSAmd2ktPnVtci5kbWFfaW5mb1tpXTsKKworCQlwYWdlX3JlZl9zdWIoZG1hX2luZm8tPnBhZ2UsIHBnX3N0cmlkZXMpOworCQltbHg1ZV9wYWdlX3JlbGVhc2UocnEsIGRtYV9pbmZvLCB0cnVlKTsKIAl9Ci0JZG1hX3VubWFwX3NpbmdsZShycS0+cGRldiwgd2ktPnVtci5tdHRfYWRkciwgbXR0X3N6LCBQQ0lfRE1BX1RPREVWSUNFKTsKIAotZXJyX2ZyZWVfbXR0OgotCWtmcmVlKHdpLT51bXIubXR0X25vX2FsaWduKTsKLQotZXJyX2ZyZWVfdW1yOgotCWtmcmVlKHdpLT51bXIuZG1hX2luZm8pOwotCi1lcnJfb3V0OgotCXJldHVybiAtRU5PTUVNOworCXJldHVybiBlcnI7CiB9CiAKLXZvaWQgbWx4NWVfZnJlZV9yeF9mcmFnbWVudGVkX21wd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsCi0JCQkJICAgIHN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2kpCit2b2lkIG1seDVlX2ZyZWVfcnhfbXB3cWUoc3RydWN0IG1seDVlX3JxICpycSwgc3RydWN0IG1seDVlX21wd19pbmZvICp3aSkKIHsKLQlpbnQgbXR0X3N6ID0gbWx4NWVfZ2V0X3dxZV9tdHRfc3ooKTsKKwlpbnQgcGdfc3RyaWRlcyA9IG1seDVlX21wd3FlX3N0cmlkZXNfcGVyX3BhZ2UocnEpOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IE1MWDVfTVBXUlFfUEFHRVNfUEVSX1dRRTsgaSsrKSB7Ci0JCWRtYV91bm1hcF9wYWdlKHJxLT5wZGV2LCB3aS0+dW1yLmRtYV9pbmZvW2ldLmFkZHIsIFBBR0VfU0laRSwKLQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQlwYWdlX3JlZl9zdWIod2ktPnVtci5kbWFfaW5mb1tpXS5wYWdlLAotCQkJbWx4NWVfbXB3cWVfc3RyaWRlc19wZXJfcGFnZShycSkgLSB3aS0+c2tic19mcmFnc1tpXSk7Ci0JCXB1dF9wYWdlKHdpLT51bXIuZG1hX2luZm9baV0ucGFnZSk7CisJCXN0cnVjdCBtbHg1ZV9kbWFfaW5mbyAqZG1hX2luZm8gPSAmd2ktPnVtci5kbWFfaW5mb1tpXTsKKworCQlwYWdlX3JlZl9zdWIoZG1hX2luZm8tPnBhZ2UsIHBnX3N0cmlkZXMgLSB3aS0+c2tic19mcmFnc1tpXSk7CisJCW1seDVlX3BhZ2VfcmVsZWFzZShycSwgZG1hX2luZm8sIHRydWUpOwogCX0KLQlkbWFfdW5tYXBfc2luZ2xlKHJxLT5wZGV2LCB3aS0+dW1yLm10dF9hZGRyLCBtdHRfc3osIFBDSV9ETUFfVE9ERVZJQ0UpOwotCWtmcmVlKHdpLT51bXIubXR0X25vX2FsaWduKTsKLQlrZnJlZSh3aS0+dW1yLmRtYV9pbmZvKTsKIH0KIAotdm9pZCBtbHg1ZV9wb3N0X3J4X2ZyYWdtZW50ZWRfbXB3cWUoc3RydWN0IG1seDVlX3JxICpycSkKK3ZvaWQgbWx4NWVfcG9zdF9yeF9tcHdxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxKQogewogCXN0cnVjdCBtbHg1X3dxX2xsICp3cSA9ICZycS0+d3E7CiAJc3RydWN0IG1seDVlX3J4X3dxZSAqd3FlID0gbWx4NV93cV9sbF9nZXRfd3FlKHdxLCB3cS0+aGVhZCk7CiAKIAljbGVhcl9iaXQoTUxYNUVfUlFfU1RBVEVfVU1SX1dRRV9JTl9QUk9HUkVTUywgJnJxLT5zdGF0ZSk7CisKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoTUxYNUVfUlFfU1RBVEVfRkxVU0gsICZycS0+c3RhdGUpKSkgeworCQltbHg1ZV9mcmVlX3J4X21wd3FlKHJxLCAmcnEtPm1wd3FlLmluZm9bd3EtPmhlYWRdKTsKKwkJcmV0dXJuOworCX0KKwogCW1seDVfd3FfbGxfcHVzaCh3cSwgYmUxNl90b19jcHUod3FlLT5uZXh0Lm5leHRfd3FlX2luZGV4KSk7Ci0JcnEtPnN0YXRzLm1wd3FlX2ZyYWcrKzsKIAogCS8qIGVuc3VyZSB3cWVzIGFyZSB2aXNpYmxlIHRvIGRldmljZSBiZWZvcmUgdXBkYXRpbmcgZG9vcmJlbGwgcmVjb3JkICovCiAJZG1hX3dtYigpOwpAQCAtNTE1LDEwNiArNDI1LDI4IEBACiAJbWx4NV93cV9sbF91cGRhdGVfZGJfcmVjb3JkKHdxKTsKIH0KIAotc3RhdGljIGludCBtbHg1ZV9hbGxvY19yeF9saW5lYXJfbXB3cWUoc3RydWN0IG1seDVlX3JxICpycSwKLQkJCQkgICAgICAgc3RydWN0IG1seDVlX3J4X3dxZSAqd3FlLAotCQkJCSAgICAgICB1MTYgaXgpCi17Ci0Jc3RydWN0IG1seDVlX21wd19pbmZvICp3aSA9ICZycS0+d3FlX2luZm9baXhdOwotCWdmcF90IGdmcF9tYXNrOwotCWludCBpOwotCi0JZ2ZwX21hc2sgPSBHRlBfQVRPTUlDIHwgX19HRlBfQ09MRCB8IF9fR0ZQX01FTUFMTE9DOwotCXdpLT5kbWFfaW5mby5wYWdlID0gYWxsb2NfcGFnZXNfbm9kZShOVU1BX05PX05PREUsIGdmcF9tYXNrLAotCQkJCQkgICAgIE1MWDVfTVBXUlFfV1FFX1BBR0VfT1JERVIpOwotCWlmICh1bmxpa2VseSghd2ktPmRtYV9pbmZvLnBhZ2UpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXdpLT5kbWFfaW5mby5hZGRyID0gZG1hX21hcF9wYWdlKHJxLT5wZGV2LCB3aS0+ZG1hX2luZm8ucGFnZSwgMCwKLQkJCQkJIHJxLT53cWVfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKHJxLT5wZGV2LCB3aS0+ZG1hX2luZm8uYWRkcikpKSB7Ci0JCXB1dF9wYWdlKHdpLT5kbWFfaW5mby5wYWdlKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogV2Ugc3BsaXQgdGhlIGhpZ2gtb3JkZXIgcGFnZSBpbnRvIG9yZGVyLTAgb25lcyBhbmQgbWFuYWdlIHRoZWlyCi0JICogcmVmZXJlbmNlIGNvdW50ZXIgdG8gbWluaW1pemUgdGhlIG1lbW9yeSBoZWxkIGJ5IHNtYWxsIHNrYiBmcmFnbWVudHMKLQkgKi8KLQlzcGxpdF9wYWdlKHdpLT5kbWFfaW5mby5wYWdlLCBNTFg1X01QV1JRX1dRRV9QQUdFX09SREVSKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUxYNV9NUFdSUV9QQUdFU19QRVJfV1FFOyBpKyspIHsKLQkJcGFnZV9yZWZfYWRkKCZ3aS0+ZG1hX2luZm8ucGFnZVtpXSwKLQkJCSAgICAgbWx4NWVfbXB3cWVfc3RyaWRlc19wZXJfcGFnZShycSkpOwotCQl3aS0+c2tic19mcmFnc1tpXSA9IDA7Ci0JfQotCi0Jd2ktPmNvbnN1bWVkX3N0cmlkZXMgPSAwOwotCXdpLT5kbWFfcHJlX3N5bmMgPSBtbHg1ZV9kbWFfcHJlX3N5bmNfbGluZWFyX21wd3FlOwotCXdpLT5hZGRfc2tiX2ZyYWcgPSBtbHg1ZV9hZGRfc2tiX2ZyYWdfbGluZWFyX21wd3FlOwotCXdpLT5jb3B5X3NrYl9oZWFkZXIgPSBtbHg1ZV9jb3B5X3NrYl9oZWFkZXJfbGluZWFyX21wd3FlOwotCXdpLT5mcmVlX3dxZSAgICAgPSBtbHg1ZV9mcmVlX3J4X2xpbmVhcl9tcHdxZTsKLQl3cWUtPmRhdGEubGtleSA9IHJxLT5ta2V5X2JlOwotCXdxZS0+ZGF0YS5hZGRyID0gY3B1X3RvX2JlNjQod2ktPmRtYV9pbmZvLmFkZHIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgbWx4NWVfZnJlZV9yeF9saW5lYXJfbXB3cWUoc3RydWN0IG1seDVlX3JxICpycSwKLQkJCQlzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpKQotewotCWludCBpOwotCi0JZG1hX3VubWFwX3BhZ2UocnEtPnBkZXYsIHdpLT5kbWFfaW5mby5hZGRyLCBycS0+d3FlX3N6LAotCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUxYNV9NUFdSUV9QQUdFU19QRVJfV1FFOyBpKyspIHsKLQkJcGFnZV9yZWZfc3ViKCZ3aS0+ZG1hX2luZm8ucGFnZVtpXSwKLQkJCW1seDVlX21wd3FlX3N0cmlkZXNfcGVyX3BhZ2UocnEpIC0gd2ktPnNrYnNfZnJhZ3NbaV0pOwotCQlwdXRfcGFnZSgmd2ktPmRtYV9pbmZvLnBhZ2VbaV0pOwotCX0KLX0KLQogaW50IG1seDVlX2FsbG9jX3J4X21wd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHN0cnVjdCBtbHg1ZV9yeF93cWUgKndxZSwgdTE2IGl4KQogewogCWludCBlcnI7CiAKLQllcnIgPSBtbHg1ZV9hbGxvY19yeF9saW5lYXJfbXB3cWUocnEsIHdxZSwgaXgpOwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCWVyciA9IG1seDVlX2FsbG9jX3J4X2ZyYWdtZW50ZWRfbXB3cWUocnEsIHdxZSwgaXgpOwotCQlpZiAodW5saWtlbHkoZXJyKSkKLQkJCXJldHVybiBlcnI7Ci0JCXNldF9iaXQoTUxYNUVfUlFfU1RBVEVfVU1SX1dRRV9JTl9QUk9HUkVTUywgJnJxLT5zdGF0ZSk7Ci0JCW1seDVlX3Bvc3RfdW1yX3dxZShycSwgaXgpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCXJldHVybiAwOworCWVyciA9IG1seDVlX2FsbG9jX3J4X3Vtcl9tcHdxZShycSwgd3FlLCBpeCk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCXJldHVybiBlcnI7CisJc2V0X2JpdChNTFg1RV9SUV9TVEFURV9VTVJfV1FFX0lOX1BST0dSRVNTLCAmcnEtPnN0YXRlKTsKKwltbHg1ZV9wb3N0X3Vtcl93cWUocnEsIGl4KTsKKwlyZXR1cm4gLUVCVVNZOwogfQogCiB2b2lkIG1seDVlX2RlYWxsb2NfcnhfbXB3cWUoc3RydWN0IG1seDVlX3JxICpycSwgdTE2IGl4KQogewotCXN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2kgPSAmcnEtPndxZV9pbmZvW2l4XTsKKwlzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpID0gJnJxLT5tcHdxZS5pbmZvW2l4XTsKIAotCXdpLT5mcmVlX3dxZShycSwgd2kpOwotfQotCi12b2lkIG1seDVlX2ZyZWVfcnhfZGVzY3Moc3RydWN0IG1seDVlX3JxICpycSkKLXsKLQlzdHJ1Y3QgbWx4NV93cV9sbCAqd3EgPSAmcnEtPndxOwotCXN0cnVjdCBtbHg1ZV9yeF93cWUgKndxZTsKLQlfX2JlMTYgd3FlX2l4X2JlOwotCXUxNiB3cWVfaXg7Ci0KLQl3aGlsZSAoIW1seDVfd3FfbGxfaXNfZW1wdHkod3EpKSB7Ci0JCXdxZV9peF9iZSA9ICp3cS0+dGFpbF9uZXh0OwotCQl3cWVfaXggICAgPSBiZTE2X3RvX2NwdSh3cWVfaXhfYmUpOwotCQl3cWUgICAgICAgPSBtbHg1X3dxX2xsX2dldF93cWUoJnJxLT53cSwgd3FlX2l4KTsKLQkJcnEtPmRlYWxsb2Nfd3FlKHJxLCB3cWVfaXgpOwotCQltbHg1X3dxX2xsX3BvcCgmcnEtPndxLCB3cWVfaXhfYmUsCi0JCQkgICAgICAgJndxZS0+bmV4dC5uZXh0X3dxZV9pbmRleCk7Ci0JfQorCW1seDVlX2ZyZWVfcnhfbXB3cWUocnEsIHdpKTsKIH0KIAogI2RlZmluZSBSUV9DQU5OT1RfUE9TVChycSkgXAotCQkoIXRlc3RfYml0KE1MWDVFX1JRX1NUQVRFX1BPU1RfV1FFU19FTkFCTEUsICZycS0+c3RhdGUpIHx8IFwKLQkJIHRlc3RfYml0KE1MWDVFX1JRX1NUQVRFX1VNUl9XUUVfSU5fUFJPR1JFU1MsICZycS0+c3RhdGUpKQorCSh0ZXN0X2JpdChNTFg1RV9SUV9TVEFURV9GTFVTSCwgJnJxLT5zdGF0ZSkgfHwgXAorCSB0ZXN0X2JpdChNTFg1RV9SUV9TVEFURV9VTVJfV1FFX0lOX1BST0dSRVNTLCAmcnEtPnN0YXRlKSkKIAogYm9vbCBtbHg1ZV9wb3N0X3J4X3dxZXMoc3RydWN0IG1seDVlX3JxICpycSkKIHsKQEAgLTYyOCw5ICs0NjAsMTAgQEAKIAkJaW50IGVycjsKIAogCQllcnIgPSBycS0+YWxsb2Nfd3FlKHJxLCB3cWUsIHdxLT5oZWFkKTsKKwkJaWYgKGVyciA9PSAtRUJVU1kpCisJCQlyZXR1cm4gdHJ1ZTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCWlmIChlcnIgIT0gLUVCVVNZKQotCQkJCXJxLT5zdGF0cy5idWZmX2FsbG9jX2VycisrOworCQkJcnEtPnN0YXRzLmJ1ZmZfYWxsb2NfZXJyKys7CiAJCQlicmVhazsKIAkJfQogCkBAIC02NDgsMjQgKzQ4MSwzMiBAQAogc3RhdGljIHZvaWQgbWx4NWVfbHJvX3VwZGF0ZV9oZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG1seDVfY3FlNjQgKmNxZSwKIAkJCQkgdTMyIGNxZV9iY250KQogewotCXN0cnVjdCBldGhoZHIJKmV0aAk9IChzdHJ1Y3QgZXRoaGRyICopKHNrYi0+ZGF0YSk7Ci0Jc3RydWN0IGlwaGRyCSppcHY0CT0gKHN0cnVjdCBpcGhkciAqKShza2ItPmRhdGEgKyBFVEhfSExFTik7Ci0Jc3RydWN0IGlwdjZoZHIJKmlwdjYJPSAoc3RydWN0IGlwdjZoZHIgKikoc2tiLT5kYXRhICsgRVRIX0hMRU4pOworCXN0cnVjdCBldGhoZHIJKmV0aCA9IChzdHJ1Y3QgZXRoaGRyICopKHNrYi0+ZGF0YSk7CisJc3RydWN0IGlwaGRyCSppcHY0OworCXN0cnVjdCBpcHY2aGRyCSppcHY2OwogCXN0cnVjdCB0Y3BoZHIJKnRjcDsKKwlpbnQgbmV0d29ya19kZXB0aCA9IDA7CisJX19iZTE2IHByb3RvOworCXUxNiB0b3RfbGVuOwogCiAJdTggbDRfaGRyX3R5cGUgPSBnZXRfY3FlX2w0X2hkcl90eXBlKGNxZSk7CiAJaW50IHRjcF9hY2sgPSAoKENRRV9MNF9IRFJfVFlQRV9UQ1BfQUNLX05PX0RBVEEgID09IGw0X2hkcl90eXBlKSB8fAogCQkgICAgICAgKENRRV9MNF9IRFJfVFlQRV9UQ1BfQUNLX0FORF9EQVRBID09IGw0X2hkcl90eXBlKSk7CiAKLQl1MTYgdG90X2xlbiA9IGNxZV9iY250IC0gRVRIX0hMRU47CisJc2tiLT5tYWNfbGVuID0gRVRIX0hMRU47CisJcHJvdG8gPSBfX3ZsYW5fZ2V0X3Byb3RvY29sKHNrYiwgZXRoLT5oX3Byb3RvLCAmbmV0d29ya19kZXB0aCk7CiAKLQlpZiAoZXRoLT5oX3Byb3RvID09IGh0b25zKEVUSF9QX0lQKSkgewotCQl0Y3AgPSAoc3RydWN0IHRjcGhkciAqKShza2ItPmRhdGEgKyBFVEhfSExFTiArCisJaXB2NCA9IChzdHJ1Y3QgaXBoZHIgKikoc2tiLT5kYXRhICsgbmV0d29ya19kZXB0aCk7CisJaXB2NiA9IChzdHJ1Y3QgaXB2NmhkciAqKShza2ItPmRhdGEgKyBuZXR3b3JrX2RlcHRoKTsKKwl0b3RfbGVuID0gY3FlX2JjbnQgLSBuZXR3b3JrX2RlcHRoOworCisJaWYgKHByb3RvID09IGh0b25zKEVUSF9QX0lQKSkgeworCQl0Y3AgPSAoc3RydWN0IHRjcGhkciAqKShza2ItPmRhdGEgKyBuZXR3b3JrX2RlcHRoICsKIAkJCQkJc2l6ZW9mKHN0cnVjdCBpcGhkcikpOwogCQlpcHY2ID0gTlVMTDsKIAkJc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSA9IFNLQl9HU09fVENQVjQ7CiAJfSBlbHNlIHsKLQkJdGNwID0gKHN0cnVjdCB0Y3BoZHIgKikoc2tiLT5kYXRhICsgRVRIX0hMRU4gKworCQl0Y3AgPSAoc3RydWN0IHRjcGhkciAqKShza2ItPmRhdGEgKyBuZXR3b3JrX2RlcHRoICsKIAkJCQkJc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CiAJCWlwdjQgPSBOVUxMOwogCQlza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlID0gU0tCX0dTT19UQ1BWNjsKQEAgLTc4OSwxMiArNjMwLDE4NiBAQAogCXJxLT5zdGF0cy5wYWNrZXRzKys7CiAJcnEtPnN0YXRzLmJ5dGVzICs9IGNxZV9iY250OwogCW1seDVlX2J1aWxkX3J4X3NrYihjcWUsIGNxZV9iY250LCBycSwgc2tiKTsKLQluYXBpX2dyb19yZWNlaXZlKHJxLT5jcS5uYXBpLCBza2IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWx4NWVfeG1pdF94ZHBfZG9vcmJlbGwoc3RydWN0IG1seDVlX3NxICpzcSkKK3sKKwlzdHJ1Y3QgbWx4NV93cV9jeWMgKndxID0gJnNxLT53cTsKKwlzdHJ1Y3QgbWx4NWVfdHhfd3FlICp3cWU7CisJdTE2IHBpID0gKHNxLT5wYyAtIE1MWDVFX1hEUF9UWF9XUUVCQlMpICYgd3EtPnN6X20xOyAvKiBsYXN0IHBpICovCisKKwl3cWUgID0gbWx4NV93cV9jeWNfZ2V0X3dxZSh3cSwgcGkpOworCisJd3FlLT5jdHJsLmZtX2NlX3NlID0gTUxYNV9XUUVfQ1RSTF9DUV9VUERBVEU7CisJbWx4NWVfdHhfbm90aWZ5X2h3KHNxLCAmd3FlLT5jdHJsLCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1seDVlX3htaXRfeGRwX2ZyYW1lKHN0cnVjdCBtbHg1ZV9ycSAqcnEsCisJCQkJCXN0cnVjdCBtbHg1ZV9kbWFfaW5mbyAqZGksCisJCQkJCXVuc2lnbmVkIGludCBkYXRhX29mZnNldCwKKwkJCQkJaW50IGxlbikKK3sKKwlzdHJ1Y3QgbWx4NWVfc3EgICAgICAgICAgKnNxICAgPSAmcnEtPmNoYW5uZWwtPnhkcF9zcTsKKwlzdHJ1Y3QgbWx4NV93cV9jeWMgICAgICAgKndxICAgPSAmc3EtPndxOworCXUxNiAgICAgICAgICAgICAgICAgICAgICBwaSAgICA9IHNxLT5wYyAmIHdxLT5zel9tMTsKKwlzdHJ1Y3QgbWx4NWVfdHhfd3FlICAgICAgKndxZSAgPSBtbHg1X3dxX2N5Y19nZXRfd3FlKHdxLCBwaSk7CisJc3RydWN0IG1seDVlX3NxX3dxZV9pbmZvICp3aSAgID0gJnNxLT5kYi54ZHAud3FlX2luZm9bcGldOworCisJc3RydWN0IG1seDVfd3FlX2N0cmxfc2VnICpjc2VnID0gJndxZS0+Y3RybDsKKwlzdHJ1Y3QgbWx4NV93cWVfZXRoX3NlZyAgKmVzZWcgPSAmd3FlLT5ldGg7CisJc3RydWN0IG1seDVfd3FlX2RhdGFfc2VnICpkc2VnOworCisJZG1hX2FkZHJfdCBkbWFfYWRkciAgPSBkaS0+YWRkciArIGRhdGFfb2Zmc2V0ICsgTUxYNUVfWERQX01JTl9JTkxJTkU7CisJdW5zaWduZWQgaW50IGRtYV9sZW4gPSBsZW4gLSBNTFg1RV9YRFBfTUlOX0lOTElORTsKKwl2b2lkICpkYXRhICAgICAgICAgICA9IHBhZ2VfYWRkcmVzcyhkaS0+cGFnZSkgKyBkYXRhX29mZnNldDsKKworCWlmICh1bmxpa2VseSghbWx4NWVfc3FfaGFzX3Jvb21fZm9yKHNxLCBNTFg1RV9YRFBfVFhfV1FFQkJTKSkpIHsKKwkJaWYgKHNxLT5kYi54ZHAuZG9vcmJlbGwpIHsKKwkJCS8qIFNRIGlzIGZ1bGwsIHJpbmcgZG9vcmJlbGwgKi8KKwkJCW1seDVlX3htaXRfeGRwX2Rvb3JiZWxsKHNxKTsKKwkJCXNxLT5kYi54ZHAuZG9vcmJlbGwgPSBmYWxzZTsKKwkJfQorCQlycS0+c3RhdHMueGRwX3R4X2Z1bGwrKzsKKwkJbWx4NWVfcGFnZV9yZWxlYXNlKHJxLCBkaSwgdHJ1ZSk7CisJCXJldHVybjsKKwl9CisKKwlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzcS0+cGRldiwgZG1hX2FkZHIsIGRtYV9sZW4sCisJCQkJICAgUENJX0RNQV9UT0RFVklDRSk7CisKKwltZW1zZXQod3FlLCAwLCBzaXplb2YoKndxZSkpOworCisJLyogY29weSB0aGUgaW5saW5lIHBhcnQgKi8KKwltZW1jcHkoZXNlZy0+aW5saW5lX2hkcl9zdGFydCwgZGF0YSwgTUxYNUVfWERQX01JTl9JTkxJTkUpOworCWVzZWctPmlubGluZV9oZHJfc3ogPSBjcHVfdG9fYmUxNihNTFg1RV9YRFBfTUlOX0lOTElORSk7CisKKwlkc2VnID0gKHN0cnVjdCBtbHg1X3dxZV9kYXRhX3NlZyAqKWNzZWcgKyAoTUxYNUVfWERQX1RYX0RTX0NPVU5UIC0gMSk7CisKKwkvKiB3cml0ZSB0aGUgZG1hIHBhcnQgKi8KKwlkc2VnLT5hZGRyICAgICAgID0gY3B1X3RvX2JlNjQoZG1hX2FkZHIpOworCWRzZWctPmJ5dGVfY291bnQgPSBjcHVfdG9fYmUzMihkbWFfbGVuKTsKKwlkc2VnLT5sa2V5ICAgICAgID0gc3EtPm1rZXlfYmU7CisKKwljc2VnLT5vcG1vZF9pZHhfb3Bjb2RlID0gY3B1X3RvX2JlMzIoKHNxLT5wYyA8PCA4KSB8IE1MWDVfT1BDT0RFX1NFTkQpOworCWNzZWctPnFwbl9kcyA9IGNwdV90b19iZTMyKChzcS0+c3FuIDw8IDgpIHwgTUxYNUVfWERQX1RYX0RTX0NPVU5UKTsKKworCXNxLT5kYi54ZHAuZGlbcGldID0gKmRpOworCXdpLT5vcGNvZGUgICAgID0gTUxYNV9PUENPREVfU0VORDsKKwl3aS0+bnVtX3dxZWJicyA9IE1MWDVFX1hEUF9UWF9XUUVCQlM7CisJc3EtPnBjICs9IE1MWDVFX1hEUF9UWF9XUUVCQlM7CisKKwlzcS0+ZGIueGRwLmRvb3JiZWxsID0gdHJ1ZTsKKwlycS0+c3RhdHMueGRwX3R4Kys7Cit9CisKKy8qIHJldHVybnMgdHJ1ZSBpZiBwYWNrZXQgd2FzIGNvbnN1bWVkIGJ5IHhkcCAqLworc3RhdGljIGlubGluZSBib29sIG1seDVlX3hkcF9oYW5kbGUoc3RydWN0IG1seDVlX3JxICpycSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nLAorCQkJCSAgICBzdHJ1Y3QgbWx4NWVfZG1hX2luZm8gKmRpLAorCQkJCSAgICB2b2lkICpkYXRhLCB1MTYgbGVuKQoreworCXN0cnVjdCB4ZHBfYnVmZiB4ZHA7CisJdTMyIGFjdDsKKworCWlmICghcHJvZykKKwkJcmV0dXJuIGZhbHNlOworCisJeGRwLmRhdGEgPSBkYXRhOworCXhkcC5kYXRhX2VuZCA9IHhkcC5kYXRhICsgbGVuOworCWFjdCA9IGJwZl9wcm9nX3J1bl94ZHAocHJvZywgJnhkcCk7CisJc3dpdGNoIChhY3QpIHsKKwljYXNlIFhEUF9QQVNTOgorCQlyZXR1cm4gZmFsc2U7CisJY2FzZSBYRFBfVFg6CisJCW1seDVlX3htaXRfeGRwX2ZyYW1lKHJxLCBkaSwgTUxYNV9SWF9IRUFEUk9PTSwgbGVuKTsKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJYnBmX3dhcm5faW52YWxpZF94ZHBfYWN0aW9uKGFjdCk7CisJY2FzZSBYRFBfQUJPUlRFRDoKKwljYXNlIFhEUF9EUk9QOgorCQlycS0+c3RhdHMueGRwX2Ryb3ArKzsKKwkJbWx4NWVfcGFnZV9yZWxlYXNlKHJxLCBkaSwgdHJ1ZSk7CisJCXJldHVybiB0cnVlOworCX0KK30KKworc3RhdGljIGlubGluZQorc3RydWN0IHNrX2J1ZmYgKnNrYl9mcm9tX2NxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLCBzdHJ1Y3QgbWx4NV9jcWU2NCAqY3FlLAorCQkJICAgICB1MTYgd3FlX2NvdW50ZXIsIHUzMiBjcWVfYmNudCkKK3sKKwlzdHJ1Y3QgYnBmX3Byb2cgKnhkcF9wcm9nID0gUkVBRF9PTkNFKHJxLT54ZHBfcHJvZyk7CisJc3RydWN0IG1seDVlX2RtYV9pbmZvICpkaTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXZvaWQgKnZhLCAqZGF0YTsKKworCWRpICAgICAgICAgICAgID0gJnJxLT5kbWFfaW5mb1t3cWVfY291bnRlcl07CisJdmEgICAgICAgICAgICAgPSBwYWdlX2FkZHJlc3MoZGktPnBhZ2UpOworCWRhdGEgICAgICAgICAgID0gdmEgKyBNTFg1X1JYX0hFQURST09NOworCisJZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUocnEtPnBkZXYsCisJCQkJICAgICAgZGktPmFkZHIsCisJCQkJICAgICAgTUxYNV9SWF9IRUFEUk9PTSwKKwkJCQkgICAgICBycS0+YnVmZi53cWVfc3osCisJCQkJICAgICAgRE1BX0ZST01fREVWSUNFKTsKKwlwcmVmZXRjaChkYXRhKTsKKworCWlmICh1bmxpa2VseSgoY3FlLT5vcF9vd24gPj4gNCkgIT0gTUxYNV9DUUVfUkVTUF9TRU5EKSkgeworCQlycS0+c3RhdHMud3FlX2VycisrOworCQltbHg1ZV9wYWdlX3JlbGVhc2UocnEsIGRpLCB0cnVlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKG1seDVlX3hkcF9oYW5kbGUocnEsIHhkcF9wcm9nLCBkaSwgZGF0YSwgY3FlX2JjbnQpKQorCQlyZXR1cm4gTlVMTDsgLyogcGFnZS9wYWNrZXQgd2FzIGNvbnN1bWVkIGJ5IFhEUCAqLworCisJc2tiID0gYnVpbGRfc2tiKHZhLCBSUV9QQUdFX1NJWkUocnEpKTsKKwlpZiAodW5saWtlbHkoIXNrYikpIHsKKwkJcnEtPnN0YXRzLmJ1ZmZfYWxsb2NfZXJyKys7CisJCW1seDVlX3BhZ2VfcmVsZWFzZShycSwgZGksIHRydWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBxdWV1ZSB1cCBmb3IgcmVjeWNsaW5nIC4uKi8KKwlwYWdlX3JlZl9pbmMoZGktPnBhZ2UpOworCW1seDVlX3BhZ2VfcmVsZWFzZShycSwgZGksIHRydWUpOworCisJc2tiX3Jlc2VydmUoc2tiLCBNTFg1X1JYX0hFQURST09NKTsKKwlza2JfcHV0KHNrYiwgY3FlX2JjbnQpOworCisJcmV0dXJuIHNrYjsKIH0KIAogdm9pZCBtbHg1ZV9oYW5kbGVfcnhfY3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHN0cnVjdCBtbHg1X2NxZTY0ICpjcWUpCiB7CiAJc3RydWN0IG1seDVlX3J4X3dxZSAqd3FlOworCV9fYmUxNiB3cWVfY291bnRlcl9iZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUxNiB3cWVfY291bnRlcjsKKwl1MzIgY3FlX2JjbnQ7CisKKwl3cWVfY291bnRlcl9iZSA9IGNxZS0+d3FlX2NvdW50ZXI7CisJd3FlX2NvdW50ZXIgICAgPSBiZTE2X3RvX2NwdSh3cWVfY291bnRlcl9iZSk7CisJd3FlICAgICAgICAgICAgPSBtbHg1X3dxX2xsX2dldF93cWUoJnJxLT53cSwgd3FlX2NvdW50ZXIpOworCWNxZV9iY250ICAgICAgID0gYmUzMl90b19jcHUoY3FlLT5ieXRlX2NudCk7CisKKwlza2IgPSBza2JfZnJvbV9jcWUocnEsIGNxZSwgd3FlX2NvdW50ZXIsIGNxZV9iY250KTsKKwlpZiAoIXNrYikKKwkJZ290byB3cV9sbF9wb3A7CisKKwltbHg1ZV9jb21wbGV0ZV9yeF9jcWUocnEsIGNxZSwgY3FlX2JjbnQsIHNrYik7CisJbmFwaV9ncm9fcmVjZWl2ZShycS0+Y3EubmFwaSwgc2tiKTsKKword3FfbGxfcG9wOgorCW1seDVfd3FfbGxfcG9wKCZycS0+d3EsIHdxZV9jb3VudGVyX2JlLAorCQkgICAgICAgJndxZS0+bmV4dC5uZXh0X3dxZV9pbmRleCk7Cit9CisKK3ZvaWQgbWx4NWVfaGFuZGxlX3J4X2NxZV9yZXAoc3RydWN0IG1seDVlX3JxICpycSwgc3RydWN0IG1seDVfY3FlNjQgKmNxZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcnEtPm5ldGRldjsKKwlzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKnJlcCA9IHByaXYtPnBwcml2OworCXN0cnVjdCBtbHg1ZV9yeF93cWUgKndxZTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCV9fYmUxNiB3cWVfY291bnRlcl9iZTsKIAl1MTYgd3FlX2NvdW50ZXI7CkBAIC04MDMsMjYgKzgxOCwxOSBAQAogCXdxZV9jb3VudGVyX2JlID0gY3FlLT53cWVfY291bnRlcjsKIAl3cWVfY291bnRlciAgICA9IGJlMTZfdG9fY3B1KHdxZV9jb3VudGVyX2JlKTsKIAl3cWUgICAgICAgICAgICA9IG1seDVfd3FfbGxfZ2V0X3dxZSgmcnEtPndxLCB3cWVfY291bnRlcik7Ci0Jc2tiICAgICAgICAgICAgPSBycS0+c2tiW3dxZV9jb3VudGVyXTsKLQlwcmVmZXRjaChza2ItPmRhdGEpOwotCXJxLT5za2Jbd3FlX2NvdW50ZXJdID0gTlVMTDsKKwljcWVfYmNudCAgICAgICA9IGJlMzJfdG9fY3B1KGNxZS0+Ynl0ZV9jbnQpOwogCi0JZG1hX3VubWFwX3NpbmdsZShycS0+cGRldiwKLQkJCSAqKChkbWFfYWRkcl90ICopc2tiLT5jYiksCi0JCQkgcnEtPndxZV9zeiwKLQkJCSBETUFfRlJPTV9ERVZJQ0UpOwotCi0JaWYgKHVubGlrZWx5KChjcWUtPm9wX293biA+PiA0KSAhPSBNTFg1X0NRRV9SRVNQX1NFTkQpKSB7Ci0JCXJxLT5zdGF0cy53cWVfZXJyKys7Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlza2IgPSBza2JfZnJvbV9jcWUocnEsIGNxZSwgd3FlX2NvdW50ZXIsIGNxZV9iY250KTsKKwlpZiAoIXNrYikKIAkJZ290byB3cV9sbF9wb3A7Ci0JfQotCi0JY3FlX2JjbnQgPSBiZTMyX3RvX2NwdShjcWUtPmJ5dGVfY250KTsKLQlza2JfcHV0KHNrYiwgY3FlX2JjbnQpOwogCiAJbWx4NWVfY29tcGxldGVfcnhfY3FlKHJxLCBjcWUsIGNxZV9iY250LCBza2IpOwogCisJaWYgKHJlcC0+dmxhbiAmJiBza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKQorCQlza2Jfdmxhbl9wb3Aoc2tiKTsKKworCW5hcGlfZ3JvX3JlY2VpdmUocnEtPmNxLm5hcGksIHNrYik7CisKIHdxX2xsX3BvcDoKIAltbHg1X3dxX2xsX3BvcCgmcnEtPndxLCB3cWVfY291bnRlcl9iZSwKIAkJICAgICAgICZ3cWUtPm5leHQubmV4dF93cWVfaW5kZXgpOwpAQCAtODM0LDcgKzg0Miw2IEBACiAJCQkJCSAgIHUzMiBjcWVfYmNudCwKIAkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQl1MzIgY29uc3VtZWRfYnl0ZXMgPSBBTElHTihjcWVfYmNudCwgcnEtPm1wd3FlX3N0cmlkZV9zeik7CiAJdTE2IHN0cmlkZV9peCAgICAgID0gbXB3cnFfZ2V0X2NxZV9zdHJpZGVfaW5kZXgoY3FlKTsKIAl1MzIgd3FlX29mZnNldCAgICAgPSBzdHJpZGVfaXggKiBycS0+bXB3cWVfc3RyaWRlX3N6OwogCXUzMiBoZWFkX29mZnNldCAgICA9IHdxZV9vZmZzZXQgJiAoUEFHRV9TSVpFIC0gMSk7CkBAIC04NDgsMjEgKzg1NSwyMCBAQAogCQlwYWdlX2lkeCsrOwogCQlmcmFnX29mZnNldCAtPSBQQUdFX1NJWkU7CiAJfQotCXdpLT5kbWFfcHJlX3N5bmMocnEtPnBkZXYsIHdpLCB3cWVfb2Zmc2V0LCBjb25zdW1lZF9ieXRlcyk7CiAKIAl3aGlsZSAoYnl0ZV9jbnQpIHsKIAkJdTMyIHBnX2NvbnN1bWVkX2J5dGVzID0KIAkJCW1pbl90KHUzMiwgUEFHRV9TSVpFIC0gZnJhZ19vZmZzZXQsIGJ5dGVfY250KTsKIAotCQl3aS0+YWRkX3NrYl9mcmFnKHJxLCBza2IsIHdpLCBwYWdlX2lkeCwgZnJhZ19vZmZzZXQsCi0JCQkJIHBnX2NvbnN1bWVkX2J5dGVzKTsKKwkJbWx4NWVfYWRkX3NrYl9mcmFnX21wd3FlKHJxLCBza2IsIHdpLCBwYWdlX2lkeCwgZnJhZ19vZmZzZXQsCisJCQkJCSBwZ19jb25zdW1lZF9ieXRlcyk7CiAJCWJ5dGVfY250IC09IHBnX2NvbnN1bWVkX2J5dGVzOwogCQlmcmFnX29mZnNldCA9IDA7CiAJCXBhZ2VfaWR4Kys7CiAJfQogCS8qIGNvcHkgaGVhZGVyICovCi0Jd2ktPmNvcHlfc2tiX2hlYWRlcihycS0+cGRldiwgc2tiLCB3aSwgaGVhZF9wYWdlX2lkeCwgaGVhZF9vZmZzZXQsCi0JCQkgICAgaGVhZGxlbik7CisJbWx4NWVfY29weV9za2JfaGVhZGVyX21wd3FlKHJxLT5wZGV2LCBza2IsIHdpLCBoZWFkX3BhZ2VfaWR4LAorCQkJCSAgICBoZWFkX29mZnNldCwgaGVhZGxlbik7CiAJLyogc2tiIGxpbmVhciBwYXJ0IHdhcyBhbGxvY2F0ZWQgd2l0aCBoZWFkbGVuIGFuZCBhbGlnbmVkIHRvIGxvbmcgKi8KIAlza2ItPnRhaWwgKz0gaGVhZGxlbjsKIAlza2ItPmxlbiAgKz0gaGVhZGxlbjsKQEAgLTg3Miw3ICs4NzgsNyBAQAogewogCXUxNiBjc3RyaWRlcyAgICAgICA9IG1wd3JxX2dldF9jcWVfY29uc3VtZWRfc3RyaWRlcyhjcWUpOwogCXUxNiB3cWVfaWQgICAgICAgICA9IGJlMTZfdG9fY3B1KGNxZS0+d3FlX2lkKTsKLQlzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpID0gJnJxLT53cWVfaW5mb1t3cWVfaWRdOworCXN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2kgPSAmcnEtPm1wd3FlLmluZm9bd3FlX2lkXTsKIAlzdHJ1Y3QgbWx4NWVfcnhfd3FlICAqd3FlID0gbWx4NV93cV9sbF9nZXRfd3FlKCZycS0+d3EsIHdxZV9pZCk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1MTYgY3FlX2JjbnQ7CkBAIC05MDIsMjEgKzkwOCwyMyBAQAogCiAJbWx4NWVfbXB3cWVfZmlsbF9yeF9za2IocnEsIGNxZSwgd2ksIGNxZV9iY250LCBza2IpOwogCW1seDVlX2NvbXBsZXRlX3J4X2NxZShycSwgY3FlLCBjcWVfYmNudCwgc2tiKTsKKwluYXBpX2dyb19yZWNlaXZlKHJxLT5jcS5uYXBpLCBza2IpOwogCiBtcHdycV9jcWVfb3V0OgogCWlmIChsaWtlbHkod2ktPmNvbnN1bWVkX3N0cmlkZXMgPCBycS0+bXB3cWVfbnVtX3N0cmlkZXMpKQogCQlyZXR1cm47CiAKLQl3aS0+ZnJlZV93cWUocnEsIHdpKTsKKwltbHg1ZV9mcmVlX3J4X21wd3FlKHJxLCB3aSk7CiAJbWx4NV93cV9sbF9wb3AoJnJxLT53cSwgY3FlLT53cWVfaWQsICZ3cWUtPm5leHQubmV4dF93cWVfaW5kZXgpOwogfQogCiBpbnQgbWx4NWVfcG9sbF9yeF9jcShzdHJ1Y3QgbWx4NWVfY3EgKmNxLCBpbnQgYnVkZ2V0KQogewogCXN0cnVjdCBtbHg1ZV9ycSAqcnEgPSBjb250YWluZXJfb2YoY3EsIHN0cnVjdCBtbHg1ZV9ycSwgY3EpOworCXN0cnVjdCBtbHg1ZV9zcSAqeGRwX3NxID0gJnJxLT5jaGFubmVsLT54ZHBfc3E7CiAJaW50IHdvcmtfZG9uZSA9IDA7CiAKLQlpZiAodW5saWtlbHkodGVzdF9iaXQoTUxYNUVfUlFfU1RBVEVfRkxVU0hfVElNRU9VVCwgJnJxLT5zdGF0ZSkpKQorCWlmICh1bmxpa2VseSh0ZXN0X2JpdChNTFg1RV9SUV9TVEFURV9GTFVTSCwgJnJxLT5zdGF0ZSkpKQogCQlyZXR1cm4gMDsKIAogCWlmIChjcS0+ZGVjbXByc19sZWZ0KQpAQCAtOTQwLDYgKzk0OCwxMSBAQAogCQlycS0+aGFuZGxlX3J4X2NxZShycSwgY3FlKTsKIAl9CiAKKwlpZiAoeGRwX3NxLT5kYi54ZHAuZG9vcmJlbGwpIHsKKwkJbWx4NWVfeG1pdF94ZHBfZG9vcmJlbGwoeGRwX3NxKTsKKwkJeGRwX3NxLT5kYi54ZHAuZG9vcmJlbGwgPSBmYWxzZTsKKwl9CisKIAltbHg1X2Nxd3FfdXBkYXRlX2RiX3JlY29yZCgmY3EtPndxKTsKIAogCS8qIGVuc3VyZSBjcSBzcGFjZSBpcyBmcmVlZCBiZWZvcmUgZW5hYmxpbmcgbW9yZSBjcWVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fc3RhdHMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9zdGF0cy5oCmluZGV4IDdiOWQ4YTkuLjU3NDUyZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9zdGF0cy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9zdGF0cy5oCkBAIC02NSwxNyArNjUsMjQgQEAKIAl1NjQgcnhfY3N1bV9ub25lOwogCXU2NCByeF9jc3VtX2NvbXBsZXRlOwogCXU2NCByeF9jc3VtX3VubmVjZXNzYXJ5X2lubmVyOworCXU2NCByeF94ZHBfZHJvcDsKKwl1NjQgcnhfeGRwX3R4OworCXU2NCByeF94ZHBfdHhfZnVsbDsKIAl1NjQgdHhfY3N1bV9wYXJ0aWFsOwogCXU2NCB0eF9jc3VtX3BhcnRpYWxfaW5uZXI7CiAJdTY0IHR4X3F1ZXVlX3N0b3BwZWQ7CiAJdTY0IHR4X3F1ZXVlX3dha2U7CiAJdTY0IHR4X3F1ZXVlX2Ryb3BwZWQ7CisJdTY0IHR4X3htaXRfbW9yZTsKIAl1NjQgcnhfd3FlX2VycjsKIAl1NjQgcnhfbXB3cWVfZmlsbGVyOwotCXU2NCByeF9tcHdxZV9mcmFnOwogCXU2NCByeF9idWZmX2FsbG9jX2VycjsKIAl1NjQgcnhfY3FlX2NvbXByZXNzX2Jsa3M7CiAJdTY0IHJ4X2NxZV9jb21wcmVzc19wa3RzOworCXU2NCByeF9jYWNoZV9yZXVzZTsKKwl1NjQgcnhfY2FjaGVfZnVsbDsKKwl1NjQgcnhfY2FjaGVfZW1wdHk7CisJdTY0IHJ4X2NhY2hlX2J1c3k7CiAKIAkvKiBTcGVjaWFsIGhhbmRsaW5nIGNvdW50ZXJzICovCiAJdTY0IGxpbmtfZG93bl9ldmVudHNfcGh5OwpAQCAtOTYsMTcgKzEwMywyNCBAQAogCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgcnhfY3N1bV9ub25lKSB9LAogCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgcnhfY3N1bV9jb21wbGV0ZSkgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHJ4X2NzdW1fdW5uZWNlc3NhcnlfaW5uZXIpIH0sCisJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF94ZHBfZHJvcCkgfSwKKwl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHJ4X3hkcF90eCkgfSwKKwl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHJ4X3hkcF90eF9mdWxsKSB9LAogCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgdHhfY3N1bV9wYXJ0aWFsKSB9LAogCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgdHhfY3N1bV9wYXJ0aWFsX2lubmVyKSB9LAogCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgdHhfcXVldWVfc3RvcHBlZCkgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHR4X3F1ZXVlX3dha2UpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCB0eF9xdWV1ZV9kcm9wcGVkKSB9LAorCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgdHhfeG1pdF9tb3JlKSB9LAogCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgcnhfd3FlX2VycikgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHJ4X21wd3FlX2ZpbGxlcikgfSwKLQl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHJ4X21wd3FlX2ZyYWcpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF9idWZmX2FsbG9jX2VycikgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHJ4X2NxZV9jb21wcmVzc19ibGtzKSB9LAogCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgcnhfY3FlX2NvbXByZXNzX3BrdHMpIH0sCisJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF9jYWNoZV9yZXVzZSkgfSwKKwl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHJ4X2NhY2hlX2Z1bGwpIH0sCisJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF9jYWNoZV9lbXB0eSkgfSwKKwl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHJ4X2NhY2hlX2J1c3kpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCBsaW5rX2Rvd25fZXZlbnRzX3BoeSkgfSwKIH07CiAKQEAgLTI3MCwxMiArMjg0LDE4IEBACiAJdTY0IGNzdW1fbm9uZTsKIAl1NjQgbHJvX3BhY2tldHM7CiAJdTY0IGxyb19ieXRlczsKKwl1NjQgeGRwX2Ryb3A7CisJdTY0IHhkcF90eDsKKwl1NjQgeGRwX3R4X2Z1bGw7CiAJdTY0IHdxZV9lcnI7CiAJdTY0IG1wd3FlX2ZpbGxlcjsKLQl1NjQgbXB3cWVfZnJhZzsKIAl1NjQgYnVmZl9hbGxvY19lcnI7CiAJdTY0IGNxZV9jb21wcmVzc19ibGtzOwogCXU2NCBjcWVfY29tcHJlc3NfcGt0czsKKwl1NjQgY2FjaGVfcmV1c2U7CisJdTY0IGNhY2hlX2Z1bGw7CisJdTY0IGNhY2hlX2VtcHR5OworCXU2NCBjYWNoZV9idXN5OwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjb3VudGVyX2Rlc2MgcnFfc3RhdHNfZGVzY1tdID0gewpAQCAtMjg0LDIwICszMDQsMjcgQEAKIAl7IE1MWDVFX0RFQ0xBUkVfUlhfU1RBVChzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMsIGNzdW1fY29tcGxldGUpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBjc3VtX3VubmVjZXNzYXJ5X2lubmVyKSB9LAogCXsgTUxYNUVfREVDTEFSRV9SWF9TVEFUKHN0cnVjdCBtbHg1ZV9ycV9zdGF0cywgY3N1bV9ub25lKSB9LAorCXsgTUxYNUVfREVDTEFSRV9SWF9TVEFUKHN0cnVjdCBtbHg1ZV9ycV9zdGF0cywgeGRwX2Ryb3ApIH0sCisJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCB4ZHBfdHgpIH0sCisJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCB4ZHBfdHhfZnVsbCkgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfUlhfU1RBVChzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMsIGxyb19wYWNrZXRzKSB9LAogCXsgTUxYNUVfREVDTEFSRV9SWF9TVEFUKHN0cnVjdCBtbHg1ZV9ycV9zdGF0cywgbHJvX2J5dGVzKSB9LAogCXsgTUxYNUVfREVDTEFSRV9SWF9TVEFUKHN0cnVjdCBtbHg1ZV9ycV9zdGF0cywgd3FlX2VycikgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfUlhfU1RBVChzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMsIG1wd3FlX2ZpbGxlcikgfSwKLQl7IE1MWDVFX0RFQ0xBUkVfUlhfU1RBVChzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMsIG1wd3FlX2ZyYWcpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBidWZmX2FsbG9jX2VycikgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfUlhfU1RBVChzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMsIGNxZV9jb21wcmVzc19ibGtzKSB9LAogCXsgTUxYNUVfREVDTEFSRV9SWF9TVEFUKHN0cnVjdCBtbHg1ZV9ycV9zdGF0cywgY3FlX2NvbXByZXNzX3BrdHMpIH0sCisJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBjYWNoZV9yZXVzZSkgfSwKKwl7IE1MWDVFX0RFQ0xBUkVfUlhfU1RBVChzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMsIGNhY2hlX2Z1bGwpIH0sCisJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBjYWNoZV9lbXB0eSkgfSwKKwl7IE1MWDVFX0RFQ0xBUkVfUlhfU1RBVChzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMsIGNhY2hlX2J1c3kpIH0sCiB9OwogCiBzdHJ1Y3QgbWx4NWVfc3Ffc3RhdHMgewogCS8qIGNvbW1vbmx5IGFjY2Vzc2VkIGluIGRhdGEgcGF0aCAqLwogCXU2NCBwYWNrZXRzOwogCXU2NCBieXRlczsKKwl1NjQgeG1pdF9tb3JlOwogCXU2NCB0c29fcGFja2V0czsKIAl1NjQgdHNvX2J5dGVzOwogCXU2NCB0c29faW5uZXJfcGFja2V0czsKQEAgLTMyNCw2ICszNTEsNyBAQAogCXsgTUxYNUVfREVDTEFSRV9UWF9TVEFUKHN0cnVjdCBtbHg1ZV9zcV9zdGF0cywgc3RvcHBlZCkgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfVFhfU1RBVChzdHJ1Y3QgbWx4NWVfc3Ffc3RhdHMsIHdha2UpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1RYX1NUQVQoc3RydWN0IG1seDVlX3NxX3N0YXRzLCBkcm9wcGVkKSB9LAorCXsgTUxYNUVfREVDTEFSRV9UWF9TVEFUKHN0cnVjdCBtbHg1ZV9zcV9zdGF0cywgeG1pdF9tb3JlKSB9LAogfTsKIAogI2RlZmluZSBOVU1fU1dfQ09VTlRFUlMJCQlBUlJBWV9TSVpFKHN3X3N0YXRzX2Rlc2MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fdGMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl90Yy5jCmluZGV4IDBmMTliMDEuLmNlOGM1NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl90Yy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl90Yy5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmhhc2h0YWJsZS5oPgogI2luY2x1ZGUgPG5ldC9zd2l0Y2hkZXYuaD4KICNpbmNsdWRlIDxuZXQvdGNfYWN0L3RjX21pcnJlZC5oPgorI2luY2x1ZGUgPG5ldC90Y19hY3QvdGNfdmxhbi5oPgogI2luY2x1ZGUgImVuLmgiCiAjaW5jbHVkZSAiZW5fdGMuaCIKICNpbmNsdWRlICJlc3dpdGNoLmgiCkBAIC00Nyw2ICs0OCw3IEBACiAJc3RydWN0IHJoYXNoX2hlYWQJbm9kZTsKIAl1NjQJCQljb29raWU7CiAJc3RydWN0IG1seDVfZmxvd19ydWxlCSpydWxlOworCXN0cnVjdCBtbHg1X2Vzd19mbG93X2F0dHIgKmF0dHI7CiB9OwogCiAjZGVmaW5lIE1MWDVFX1RDX1RBQkxFX05VTV9FTlRSSUVTIDEwMjQKQEAgLTExNCwyNyArMTE2LDMwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWx4NV9mbG93X3J1bGUgKm1seDVlX3RjX2FkZF9mZGJfZmxvdyhzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdiwKIAkJCQkJCSAgICBzdHJ1Y3QgbWx4NV9mbG93X3NwZWMgKnNwZWMsCi0JCQkJCQkgICAgdTMyIGFjdGlvbiwgdTMyIGRzdF92cG9ydCkKKwkJCQkJCSAgICBzdHJ1Y3QgbWx4NV9lc3dfZmxvd19hdHRyICphdHRyKQogewogCXN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdyA9IHByaXYtPm1kZXYtPnByaXYuZXN3aXRjaDsKLQlzdHJ1Y3QgbWx4NV9lc3dpdGNoX3JlcCAqcmVwID0gcHJpdi0+cHByaXY7Ci0JdTMyIHNyY192cG9ydDsKKwlpbnQgZXJyOwogCi0JaWYgKHJlcC0+dnBvcnQpIC8qIHNldCBzb3VyY2UgdnBvcnQgZm9yIHRoZSBmbG93ICovCi0JCXNyY192cG9ydCA9IHJlcC0+dnBvcnQ7Ci0JZWxzZQotCQlzcmNfdnBvcnQgPSBGREJfVVBMSU5LX1ZQT1JUOworCWVyciA9IG1seDVfZXN3aXRjaF9hZGRfdmxhbl9hY3Rpb24oZXN3LCBhdHRyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCi0JcmV0dXJuIG1seDVfZXN3aXRjaF9hZGRfb2ZmbG9hZGVkX3J1bGUoZXN3LCBzcGVjLCBhY3Rpb24sIHNyY192cG9ydCwgZHN0X3Zwb3J0KTsKKwlyZXR1cm4gbWx4NV9lc3dpdGNoX2FkZF9vZmZsb2FkZWRfcnVsZShlc3csIHNwZWMsIGF0dHIpOwogfQogCiBzdGF0aWMgdm9pZCBtbHg1ZV90Y19kZWxfZmxvdyhzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCBtbHg1X2Zsb3dfcnVsZSAqcnVsZSkKKwkJCSAgICAgIHN0cnVjdCBtbHg1X2Zsb3dfcnVsZSAqcnVsZSwKKwkJCSAgICAgIHN0cnVjdCBtbHg1X2Vzd19mbG93X2F0dHIgKmF0dHIpCiB7CisJc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3ID0gcHJpdi0+bWRldi0+cHJpdi5lc3dpdGNoOwogCXN0cnVjdCBtbHg1X2ZjICpjb3VudGVyID0gTlVMTDsKIAogCWNvdW50ZXIgPSBtbHg1X2Zsb3dfcnVsZV9jb3VudGVyKHJ1bGUpOwogCisJaWYgKGVzdyAmJiBlc3ctPm1vZGUgPT0gU1JJT1ZfT0ZGTE9BRFMpCisJCW1seDVfZXN3aXRjaF9kZWxfdmxhbl9hY3Rpb24oZXN3LCBhdHRyKTsKKwogCW1seDVfZGVsX2Zsb3dfcnVsZShydWxlKTsKIAogCW1seDVfZmNfZGVzdHJveShwcml2LT5tZGV2LCBjb3VudGVyKTsKQEAgLTE1OSw2ICsxNjQsNyBAQAogCSAgICB+KEJJVChGTE9XX0RJU1NFQ1RPUl9LRVlfQ09OVFJPTCkgfAogCSAgICAgIEJJVChGTE9XX0RJU1NFQ1RPUl9LRVlfQkFTSUMpIHwKIAkgICAgICBCSVQoRkxPV19ESVNTRUNUT1JfS0VZX0VUSF9BRERSUykgfAorCSAgICAgIEJJVChGTE9XX0RJU1NFQ1RPUl9LRVlfVkxBTikgfAogCSAgICAgIEJJVChGTE9XX0RJU1NFQ1RPUl9LRVlfSVBWNF9BRERSUykgfAogCSAgICAgIEJJVChGTE9XX0RJU1NFQ1RPUl9LRVlfSVBWNl9BRERSUykgfAogCSAgICAgIEJJVChGTE9XX0RJU1NFQ1RPUl9LRVlfUE9SVFMpKSkgewpAQCAtMTcwLDcgKzE3Niw3IEBACiAJaWYgKGRpc3NlY3Rvcl91c2VzX2tleShmLT5kaXNzZWN0b3IsIEZMT1dfRElTU0VDVE9SX0tFWV9DT05UUk9MKSkgewogCQlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2NvbnRyb2wgKmtleSA9CiAJCQlza2JfZmxvd19kaXNzZWN0b3JfdGFyZ2V0KGYtPmRpc3NlY3RvciwKLQkJCQkJCSAgRkxPV19ESVNTRUNUT1JfS0VZX0JBU0lDLAorCQkJCQkJICBGTE9XX0RJU1NFQ1RPUl9LRVlfQ09OVFJPTCwKIAkJCQkJCSAgZi0+a2V5KTsKIAkJYWRkcl90eXBlID0ga2V5LT5hZGRyX3R5cGU7CiAJfQpAQCAtMjIyLDYgKzIyOCwyNCBAQAogCQkJCWtleS0+c3JjKTsKIAl9CiAKKwlpZiAoZGlzc2VjdG9yX3VzZXNfa2V5KGYtPmRpc3NlY3RvciwgRkxPV19ESVNTRUNUT1JfS0VZX1ZMQU4pKSB7CisJCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfdmxhbiAqa2V5ID0KKwkJCXNrYl9mbG93X2Rpc3NlY3Rvcl90YXJnZXQoZi0+ZGlzc2VjdG9yLAorCQkJCQkJICBGTE9XX0RJU1NFQ1RPUl9LRVlfVkxBTiwKKwkJCQkJCSAgZi0+a2V5KTsKKwkJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV92bGFuICptYXNrID0KKwkJCXNrYl9mbG93X2Rpc3NlY3Rvcl90YXJnZXQoZi0+ZGlzc2VjdG9yLAorCQkJCQkJICBGTE9XX0RJU1NFQ1RPUl9LRVlfVkxBTiwKKwkJCQkJCSAgZi0+bWFzayk7CisJCWlmIChtYXNrLT52bGFuX2lkKSB7CisJCQlNTFg1X1NFVChmdGVfbWF0Y2hfc2V0X2x5cl8yXzQsIGhlYWRlcnNfYywgdmxhbl90YWcsIDEpOworCQkJTUxYNV9TRVQoZnRlX21hdGNoX3NldF9seXJfMl80LCBoZWFkZXJzX3YsIHZsYW5fdGFnLCAxKTsKKworCQkJTUxYNV9TRVQoZnRlX21hdGNoX3NldF9seXJfMl80LCBoZWFkZXJzX2MsIGZpcnN0X3ZpZCwgbWFzay0+dmxhbl9pZCk7CisJCQlNTFg1X1NFVChmdGVfbWF0Y2hfc2V0X2x5cl8yXzQsIGhlYWRlcnNfdiwgZmlyc3RfdmlkLCBrZXktPnZsYW5faWQpOworCQl9CisJfQorCiAJaWYgKGFkZHJfdHlwZSA9PSBGTE9XX0RJU1NFQ1RPUl9LRVlfSVBWNF9BRERSUykgewogCQlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2lwdjRfYWRkcnMgKmtleSA9CiAJCQlza2JfZmxvd19kaXNzZWN0b3JfdGFyZ2V0KGYtPmRpc3NlY3RvciwKQEAgLTMxOCw2ICszNDIsNyBAQAogCQkJCXUzMiAqYWN0aW9uLCB1MzIgKmZsb3dfdGFnKQogewogCWNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmE7CisJTElTVF9IRUFEKGFjdGlvbnMpOwogCiAJaWYgKHRjX25vX2FjdGlvbnMoZXh0cykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzI1LDcgKzM1MCw4IEBACiAJKmZsb3dfdGFnID0gTUxYNV9GU19ERUZBVUxUX0ZMT1dfVEFHOwogCSphY3Rpb24gPSAwOwogCi0JdGNfZm9yX2VhY2hfYWN0aW9uKGEsIGV4dHMpIHsKKwl0Y2ZfZXh0c190b19saXN0KGV4dHMsICZhY3Rpb25zKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGEsICZhY3Rpb25zLCBsaXN0KSB7CiAJCS8qIE9ubHkgc3VwcG9ydCBhIHNpbmdsZSBhY3Rpb24gcGVyIHJ1bGUgKi8KIAkJaWYgKCphY3Rpb24pCiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM1OSwyMyArMzg1LDIyIEBACiB9CiAKIHN0YXRpYyBpbnQgcGFyc2VfdGNfZmRiX2FjdGlvbnMoc3RydWN0IG1seDVlX3ByaXYgKnByaXYsIHN0cnVjdCB0Y2ZfZXh0cyAqZXh0cywKLQkJCQl1MzIgKmFjdGlvbiwgdTMyICpkZXN0X3Zwb3J0KQorCQkJCXN0cnVjdCBtbHg1X2Vzd19mbG93X2F0dHIgKmF0dHIpCiB7CiAJY29uc3Qgc3RydWN0IHRjX2FjdGlvbiAqYTsKKwlMSVNUX0hFQUQoYWN0aW9ucyk7CiAKIAlpZiAodGNfbm9fYWN0aW9ucyhleHRzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkqYWN0aW9uID0gMDsKKwltZW1zZXQoYXR0ciwgMCwgc2l6ZW9mKCphdHRyKSk7CisJYXR0ci0+aW5fcmVwID0gcHJpdi0+cHByaXY7CiAKLQl0Y19mb3JfZWFjaF9hY3Rpb24oYSwgZXh0cykgewotCQkvKiBPbmx5IHN1cHBvcnQgYSBzaW5nbGUgYWN0aW9uIHBlciBydWxlICovCi0JCWlmICgqYWN0aW9uKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KKwl0Y2ZfZXh0c190b19saXN0KGV4dHMsICZhY3Rpb25zKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGEsICZhY3Rpb25zLCBsaXN0KSB7CiAJCWlmIChpc190Y2ZfZ2FjdF9zaG90KGEpKSB7Ci0JCQkqYWN0aW9uID0gTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0RST1AgfAotCQkJCSAgTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0NPVU5UOworCQkJYXR0ci0+YWN0aW9uIHw9IE1MWDVfRkxPV19DT05URVhUX0FDVElPTl9EUk9QIHwKKwkJCQkJTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0NPVU5UOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMzgzLDcgKzQwOCw2IEBACiAJCQlpbnQgaWZpbmRleCA9IHRjZl9taXJyZWRfaWZpbmRleChhKTsKIAkJCXN0cnVjdCBuZXRfZGV2aWNlICpvdXRfZGV2OwogCQkJc3RydWN0IG1seDVlX3ByaXYgKm91dF9wcml2OwotCQkJc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKm91dF9yZXA7CiAKIAkJCW91dF9kZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgoZGV2X25ldChwcml2LT5uZXRkZXYpLCBpZmluZGV4KTsKIApAQCAtMzkzLDEzICs0MTcsMjIgQEAKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAorCQkJYXR0ci0+YWN0aW9uIHw9IE1MWDVfRkxPV19DT05URVhUX0FDVElPTl9GV0RfREVTVDsKIAkJCW91dF9wcml2ID0gbmV0ZGV2X3ByaXYob3V0X2Rldik7Ci0JCQlvdXRfcmVwICA9IG91dF9wcml2LT5wcHJpdjsKLQkJCWlmIChvdXRfcmVwLT52cG9ydCA9PSAwKQotCQkJCSpkZXN0X3Zwb3J0ID0gRkRCX1VQTElOS19WUE9SVDsKLQkJCWVsc2UKLQkJCQkqZGVzdF92cG9ydCA9IG91dF9yZXAtPnZwb3J0OwotCQkJKmFjdGlvbiA9IE1MWDVfRkxPV19DT05URVhUX0FDVElPTl9GV0RfREVTVDsKKwkJCWF0dHItPm91dF9yZXAgPSBvdXRfcHJpdi0+cHByaXY7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChpc190Y2ZfdmxhbihhKSkgeworCQkJaWYgKHRjZl92bGFuX2FjdGlvbihhKSA9PSBWTEFOX0ZfUE9QKSB7CisJCQkJYXR0ci0+YWN0aW9uIHw9IE1MWDVfRkxPV19DT05URVhUX0FDVElPTl9WTEFOX1BPUDsKKwkJCX0gZWxzZSBpZiAodGNmX3ZsYW5fYWN0aW9uKGEpID09IFZMQU5fRl9QVVNIKSB7CisJCQkJaWYgKHRjZl92bGFuX3B1c2hfcHJvdG8oYSkgIT0gaHRvbnMoRVRIX1BfODAyMVEpKQorCQkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkJCQlhdHRyLT5hY3Rpb24gfD0gTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX1ZMQU5fUFVTSDsKKwkJCQlhdHRyLT52bGFuID0gdGNmX3ZsYW5fcHVzaF92aWQoYSk7CisJCQl9CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC00MTMsMTggKzQ0NiwyOSBAQAogewogCXN0cnVjdCBtbHg1ZV90Y190YWJsZSAqdGMgPSAmcHJpdi0+ZnMudGM7CiAJaW50IGVyciA9IDA7Ci0JdTMyIGZsb3dfdGFnLCBhY3Rpb24sIGRlc3RfdnBvcnQgPSAwOworCWJvb2wgZmRiX2Zsb3cgPSBmYWxzZTsKKwl1MzIgZmxvd190YWcsIGFjdGlvbjsKIAlzdHJ1Y3QgbWx4NWVfdGNfZmxvdyAqZmxvdzsKIAlzdHJ1Y3QgbWx4NV9mbG93X3NwZWMgKnNwZWM7CiAJc3RydWN0IG1seDVfZmxvd19ydWxlICpvbGQgPSBOVUxMOworCXN0cnVjdCBtbHg1X2Vzd19mbG93X2F0dHIgKm9sZF9hdHRyID0gTlVMTDsKIAlzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3cgPSBwcml2LT5tZGV2LT5wcml2LmVzd2l0Y2g7CiAKKwlpZiAoZXN3ICYmIGVzdy0+bW9kZSA9PSBTUklPVl9PRkZMT0FEUykKKwkJZmRiX2Zsb3cgPSB0cnVlOworCiAJZmxvdyA9IHJoYXNodGFibGVfbG9va3VwX2Zhc3QoJnRjLT5odCwgJmYtPmNvb2tpZSwKIAkJCQkgICAgICB0Yy0+aHRfcGFyYW1zKTsKLQlpZiAoZmxvdykKKwlpZiAoZmxvdykgewogCQlvbGQgPSBmbG93LT5ydWxlOwotCWVsc2UKLQkJZmxvdyA9IGt6YWxsb2Moc2l6ZW9mKCpmbG93KSwgR0ZQX0tFUk5FTCk7CisJCW9sZF9hdHRyID0gZmxvdy0+YXR0cjsKKwl9IGVsc2UgeworCQlpZiAoZmRiX2Zsb3cpCisJCQlmbG93ID0ga3phbGxvYyhzaXplb2YoKmZsb3cpICsgc2l6ZW9mKHN0cnVjdCBtbHg1X2Vzd19mbG93X2F0dHIpLAorCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJZWxzZQorCQkJZmxvdyA9IGt6YWxsb2Moc2l6ZW9mKCpmbG93KSwgR0ZQX0tFUk5FTCk7CisJfQogCiAJc3BlYyA9IG1seDVfdnphbGxvYyhzaXplb2YoKnNwZWMpKTsKIAlpZiAoIXNwZWMgfHwgIWZsb3cpIHsKQEAgLTQzOCwxMSArNDgyLDEyIEBACiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyX2ZyZWU7CiAKLQlpZiAoZXN3ICYmIGVzdy0+bW9kZSA9PSBTUklPVl9PRkZMT0FEUykgewotCQllcnIgPSBwYXJzZV90Y19mZGJfYWN0aW9ucyhwcml2LCBmLT5leHRzLCAmYWN0aW9uLCAmZGVzdF92cG9ydCk7CisJaWYgKGZkYl9mbG93KSB7CisJCWZsb3ctPmF0dHIgID0gKHN0cnVjdCBtbHg1X2Vzd19mbG93X2F0dHIgKikoZmxvdyArIDEpOworCQllcnIgPSBwYXJzZV90Y19mZGJfYWN0aW9ucyhwcml2LCBmLT5leHRzLCBmbG93LT5hdHRyKTsKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIGVycl9mcmVlOwotCQlmbG93LT5ydWxlID0gbWx4NWVfdGNfYWRkX2ZkYl9mbG93KHByaXYsIHNwZWMsIGFjdGlvbiwgZGVzdF92cG9ydCk7CisJCWZsb3ctPnJ1bGUgPSBtbHg1ZV90Y19hZGRfZmRiX2Zsb3cocHJpdiwgc3BlYywgZmxvdy0+YXR0cik7CiAJfSBlbHNlIHsKIAkJZXJyID0gcGFyc2VfdGNfbmljX2FjdGlvbnMocHJpdiwgZi0+ZXh0cywgJmFjdGlvbiwgJmZsb3dfdGFnKTsKIAkJaWYgKGVyciA8IDApCkBAIC00NjEsNyArNTA2LDcgQEAKIAkJZ290byBlcnJfZGVsX3J1bGU7CiAKIAlpZiAob2xkKQotCQltbHg1ZV90Y19kZWxfZmxvdyhwcml2LCBvbGQpOworCQltbHg1ZV90Y19kZWxfZmxvdyhwcml2LCBvbGQsIG9sZF9hdHRyKTsKIAogCWdvdG8gb3V0OwogCkBAIC00ODksNyArNTM0LDcgQEAKIAogCXJoYXNodGFibGVfcmVtb3ZlX2Zhc3QoJnRjLT5odCwgJmZsb3ctPm5vZGUsIHRjLT5odF9wYXJhbXMpOwogCi0JbWx4NWVfdGNfZGVsX2Zsb3cocHJpdiwgZmxvdy0+cnVsZSk7CisJbWx4NWVfdGNfZGVsX2Zsb3cocHJpdiwgZmxvdy0+cnVsZSwgZmxvdy0+YXR0cik7CiAKIAlrZnJlZShmbG93KTsKIApAQCAtNTAzLDYgKzU0OCw3IEBACiAJc3RydWN0IG1seDVlX3RjX2Zsb3cgKmZsb3c7CiAJc3RydWN0IHRjX2FjdGlvbiAqYTsKIAlzdHJ1Y3QgbWx4NV9mYyAqY291bnRlcjsKKwlMSVNUX0hFQUQoYWN0aW9ucyk7CiAJdTY0IGJ5dGVzOwogCXU2NCBwYWNrZXRzOwogCXU2NCBsYXN0dXNlOwpAQCAtNTE4LDcgKzU2NCw4IEBACiAKIAltbHg1X2ZjX3F1ZXJ5X2NhY2hlZChjb3VudGVyLCAmYnl0ZXMsICZwYWNrZXRzLCAmbGFzdHVzZSk7CiAKLQl0Y19mb3JfZWFjaF9hY3Rpb24oYSwgZi0+ZXh0cykKKwl0Y2ZfZXh0c190b19saXN0KGYtPmV4dHMsICZhY3Rpb25zKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGEsICZhY3Rpb25zLCBsaXN0KQogCQl0Y2ZfYWN0aW9uX3N0YXRzX3VwZGF0ZShhLCBieXRlcywgcGFja2V0cywgbGFzdHVzZSk7CiAKIAlyZXR1cm4gMDsKQEAgLTU0NCw3ICs1OTEsNyBAQAogCXN0cnVjdCBtbHg1ZV90Y19mbG93ICpmbG93ID0gcHRyOwogCXN0cnVjdCBtbHg1ZV9wcml2ICpwcml2ID0gYXJnOwogCi0JbWx4NWVfdGNfZGVsX2Zsb3cocHJpdiwgZmxvdy0+cnVsZSk7CisJbWx4NWVfdGNfZGVsX2Zsb3cocHJpdiwgZmxvdy0+cnVsZSwgZmxvdy0+YXR0cik7CiAJa2ZyZWUoZmxvdyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl90eC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX3R4LmMKaW5kZXggZTA3M2JmNTkuLjcwYTcxNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl90eC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl90eC5jCkBAIC01Miw3ICs1Miw2IEBACiAJY3NlZy0+b3Btb2RfaWR4X29wY29kZSA9IGNwdV90b19iZTMyKChzcS0+cGMgPDwgOCkgfCBNTFg1X09QQ09ERV9OT1ApOwogCWNzZWctPnFwbl9kcyAgICAgICAgICAgPSBjcHVfdG9fYmUzMigoc3EtPnNxbiA8PCA4KSB8IDB4MDEpOwogCi0Jc3EtPnNrYltwaV0gPSBOVUxMOwogCXNxLT5wYysrOwogCXNxLT5zdGF0cy5ub3ArKzsKIApAQCAtODIsMTUgKzgxLDE3IEBACiAJCQkJICB1MzIgc2l6ZSwKIAkJCQkgIGVudW0gbWx4NWVfZG1hX21hcF90eXBlIG1hcF90eXBlKQogewotCXNxLT5kbWFfZmlmb1tzcS0+ZG1hX2ZpZm9fcGMgJiBzcS0+ZG1hX2ZpZm9fbWFza10uYWRkciA9IGFkZHI7Ci0Jc3EtPmRtYV9maWZvW3NxLT5kbWFfZmlmb19wYyAmIHNxLT5kbWFfZmlmb19tYXNrXS5zaXplID0gc2l6ZTsKLQlzcS0+ZG1hX2ZpZm9bc3EtPmRtYV9maWZvX3BjICYgc3EtPmRtYV9maWZvX21hc2tdLnR5cGUgPSBtYXBfdHlwZTsKKwl1MzIgaSA9IHNxLT5kbWFfZmlmb19wYyAmIHNxLT5kbWFfZmlmb19tYXNrOworCisJc3EtPmRiLnR4cS5kbWFfZmlmb1tpXS5hZGRyID0gYWRkcjsKKwlzcS0+ZGIudHhxLmRtYV9maWZvW2ldLnNpemUgPSBzaXplOworCXNxLT5kYi50eHEuZG1hX2ZpZm9baV0udHlwZSA9IG1hcF90eXBlOwogCXNxLT5kbWFfZmlmb19wYysrOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBtbHg1ZV9zcV9kbWEgKm1seDVlX2RtYV9nZXQoc3RydWN0IG1seDVlX3NxICpzcSwgdTMyIGkpCiB7Ci0JcmV0dXJuICZzcS0+ZG1hX2ZpZm9baSAmIHNxLT5kbWFfZmlmb19tYXNrXTsKKwlyZXR1cm4gJnNxLT5kYi50eHEuZG1hX2ZpZm9baSAmIHNxLT5kbWFfZmlmb19tYXNrXTsKIH0KIAogc3RhdGljIHZvaWQgbWx4NWVfZG1hX3VubWFwX3dxZV9lcnIoc3RydWN0IG1seDVlX3NxICpzcSwgdTggbnVtX2RtYSkKQEAgLTIyMSw3ICsyMjIsNyBAQAogCiAJdTE2IHBpID0gc3EtPnBjICYgd3EtPnN6X20xOwogCXN0cnVjdCBtbHg1ZV90eF93cWUgICAgICAqd3FlICA9IG1seDVfd3FfY3ljX2dldF93cWUod3EsIHBpKTsKLQlzdHJ1Y3QgbWx4NWVfdHhfd3FlX2luZm8gKndpICAgPSAmc3EtPndxZV9pbmZvW3BpXTsKKwlzdHJ1Y3QgbWx4NWVfdHhfd3FlX2luZm8gKndpICAgPSAmc3EtPmRiLnR4cS53cWVfaW5mb1twaV07CiAKIAlzdHJ1Y3QgbWx4NV93cWVfY3RybF9zZWcgKmNzZWcgPSAmd3FlLT5jdHJsOwogCXN0cnVjdCBtbHg1X3dxZV9ldGhfc2VnICAqZXNlZyA9ICZ3cWUtPmV0aDsKQEAgLTM0MSw3ICszNDIsNyBAQAogCWNzZWctPm9wbW9kX2lkeF9vcGNvZGUgPSBjcHVfdG9fYmUzMigoc3EtPnBjIDw8IDgpIHwgb3Bjb2RlKTsKIAljc2VnLT5xcG5fZHMgICAgICAgICAgID0gY3B1X3RvX2JlMzIoKHNxLT5zcW4gPDwgOCkgfCBkc19jbnQpOwogCi0Jc3EtPnNrYltwaV0gPSBza2I7CisJc3EtPmRiLnR4cS5za2JbcGldID0gc2tiOwogCiAJd2ktPm51bV93cWViYnMgPSBESVZfUk9VTkRfVVAoZHNfY250LCBNTFg1X1NFTkRfV1FFQkJfTlVNX0RTKTsKIAlzcS0+cGMgKz0gd2ktPm51bV93cWViYnM7CkBAIC0zNTYsNiArMzU3LDcgQEAKIAkJc3EtPnN0YXRzLnN0b3BwZWQrKzsKIAl9CiAKKwlzcS0+c3RhdHMueG1pdF9tb3JlICs9IHNrYi0+eG1pdF9tb3JlOwogCWlmICghc2tiLT54bWl0X21vcmUgfHwgbmV0aWZfeG1pdF9zdG9wcGVkKHNxLT50eHEpKSB7CiAJCWludCBiZl9zeiA9IDA7CiAKQEAgLTM2Nyw4ICszNjksMTAgQEAKIAl9CiAKIAkvKiBmaWxsIHNxIGVkZ2Ugd2l0aCBub3BzIHRvIGF2b2lkIHdxZSB3cmFwIGFyb3VuZCAqLwotCXdoaWxlICgoc3EtPnBjICYgd3EtPnN6X20xKSA+IHNxLT5lZGdlKQorCXdoaWxlICgocGkgPSAoc3EtPnBjICYgd3EtPnN6X20xKSkgPiBzcS0+ZWRnZSkgeworCQlzcS0+ZGIudHhxLnNrYltwaV0gPSBOVUxMOwogCQltbHg1ZV9zZW5kX25vcChzcSwgZmFsc2UpOworCX0KIAogCWlmIChiZikKIAkJc3EtPmJmX2J1ZGdldC0tOwpAQCAtMzk0LDM1ICszOTgsNiBAQAogCXJldHVybiBtbHg1ZV9zcV94bWl0KHNxLCBza2IpOwogfQogCi12b2lkIG1seDVlX2ZyZWVfdHhfZGVzY3Moc3RydWN0IG1seDVlX3NxICpzcSkKLXsKLQlzdHJ1Y3QgbWx4NWVfdHhfd3FlX2luZm8gKndpOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JdTE2IGNpOwotCWludCBpOwotCi0Jd2hpbGUgKHNxLT5jYyAhPSBzcS0+cGMpIHsKLQkJY2kgPSBzcS0+Y2MgJiBzcS0+d3Euc3pfbTE7Ci0JCXNrYiA9IHNxLT5za2JbY2ldOwotCQl3aSA9ICZzcS0+d3FlX2luZm9bY2ldOwotCi0JCWlmICghc2tiKSB7IC8qIG5vcCAqLwotCQkJc3EtPmNjKys7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWZvciAoaSA9IDA7IGkgPCB3aS0+bnVtX2RtYTsgaSsrKSB7Ci0JCQlzdHJ1Y3QgbWx4NWVfc3FfZG1hICpkbWEgPQotCQkJCW1seDVlX2RtYV9nZXQoc3EsIHNxLT5kbWFfZmlmb19jYysrKTsKLQotCQkJbWx4NWVfdHhfZG1hX3VubWFwKHNxLT5wZGV2LCBkbWEpOwotCQl9Ci0KLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJc3EtPmNjICs9IHdpLT5udW1fd3FlYmJzOwotCX0KLX0KLQogYm9vbCBtbHg1ZV9wb2xsX3R4X2NxKHN0cnVjdCBtbHg1ZV9jcSAqY3EsIGludCBuYXBpX2J1ZGdldCkKIHsKIAlzdHJ1Y3QgbWx4NWVfc3EgKnNxOwpAQCAtNDM0LDcgKzQwOSw3IEBACiAKIAlzcSA9IGNvbnRhaW5lcl9vZihjcSwgc3RydWN0IG1seDVlX3NxLCBjcSk7CiAKLQlpZiAodW5saWtlbHkodGVzdF9iaXQoTUxYNUVfU1FfU1RBVEVfVFhfVElNRU9VVCwgJnNxLT5zdGF0ZSkpKQorCWlmICh1bmxpa2VseSh0ZXN0X2JpdChNTFg1RV9TUV9TVEFURV9GTFVTSCwgJnNxLT5zdGF0ZSkpKQogCQlyZXR1cm4gZmFsc2U7CiAKIAlucGt0cyA9IDA7CkBAIC00NzAsOCArNDQ1LDggQEAKIAkJCWxhc3Rfd3FlID0gKHNxY2MgPT0gd3FlX2NvdW50ZXIpOwogCiAJCQljaSA9IHNxY2MgJiBzcS0+d3Euc3pfbTE7Ci0JCQlza2IgPSBzcS0+c2tiW2NpXTsKLQkJCXdpID0gJnNxLT53cWVfaW5mb1tjaV07CisJCQlza2IgPSBzcS0+ZGIudHhxLnNrYltjaV07CisJCQl3aSA9ICZzcS0+ZGIudHhxLndxZV9pbmZvW2NpXTsKIAogCQkJaWYgKHVubGlrZWx5KCFza2IpKSB7IC8qIG5vcCAqLwogCQkJCXNxY2MrKzsKQEAgLTUxMiwxMSArNDg3LDczIEBACiAJbmV0ZGV2X3R4X2NvbXBsZXRlZF9xdWV1ZShzcS0+dHhxLCBucGt0cywgbmJ5dGVzKTsKIAogCWlmIChuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKHNxLT50eHEpICYmCi0JICAgIG1seDVlX3NxX2hhc19yb29tX2ZvcihzcSwgTUxYNUVfU1FfU1RPUF9ST09NKSAmJgotCSAgICBsaWtlbHkodGVzdF9iaXQoTUxYNUVfU1FfU1RBVEVfV0FLRV9UWFFfRU5BQkxFLCAmc3EtPnN0YXRlKSkpIHsKLQkJCQluZXRpZl90eF93YWtlX3F1ZXVlKHNxLT50eHEpOwotCQkJCXNxLT5zdGF0cy53YWtlKys7CisJICAgIG1seDVlX3NxX2hhc19yb29tX2ZvcihzcSwgTUxYNUVfU1FfU1RPUF9ST09NKSkgeworCQluZXRpZl90eF93YWtlX3F1ZXVlKHNxLT50eHEpOworCQlzcS0+c3RhdHMud2FrZSsrOwogCX0KIAogCXJldHVybiAoaSA9PSBNTFg1RV9UWF9DUV9QT0xMX0JVREdFVCk7CiB9CisKK3N0YXRpYyB2b2lkIG1seDVlX2ZyZWVfdHhxX3NxX2Rlc2NzKHN0cnVjdCBtbHg1ZV9zcSAqc3EpCit7CisJc3RydWN0IG1seDVlX3R4X3dxZV9pbmZvICp3aTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUxNiBjaTsKKwlpbnQgaTsKKworCXdoaWxlIChzcS0+Y2MgIT0gc3EtPnBjKSB7CisJCWNpID0gc3EtPmNjICYgc3EtPndxLnN6X20xOworCQlza2IgPSBzcS0+ZGIudHhxLnNrYltjaV07CisJCXdpID0gJnNxLT5kYi50eHEud3FlX2luZm9bY2ldOworCisJCWlmICghc2tiKSB7IC8qIG5vcCAqLworCQkJc3EtPmNjKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCB3aS0+bnVtX2RtYTsgaSsrKSB7CisJCQlzdHJ1Y3QgbWx4NWVfc3FfZG1hICpkbWEgPQorCQkJCW1seDVlX2RtYV9nZXQoc3EsIHNxLT5kbWFfZmlmb19jYysrKTsKKworCQkJbWx4NWVfdHhfZG1hX3VubWFwKHNxLT5wZGV2LCBkbWEpOworCQl9CisKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJc3EtPmNjICs9IHdpLT5udW1fd3FlYmJzOworCX0KK30KKworc3RhdGljIHZvaWQgbWx4NWVfZnJlZV94ZHBfc3FfZGVzY3Moc3RydWN0IG1seDVlX3NxICpzcSkKK3sKKwlzdHJ1Y3QgbWx4NWVfc3Ffd3FlX2luZm8gKndpOworCXN0cnVjdCBtbHg1ZV9kbWFfaW5mbyAqZGk7CisJdTE2IGNpOworCisJd2hpbGUgKHNxLT5jYyAhPSBzcS0+cGMpIHsKKwkJY2kgPSBzcS0+Y2MgJiBzcS0+d3Euc3pfbTE7CisJCWRpID0gJnNxLT5kYi54ZHAuZGlbY2ldOworCQl3aSA9ICZzcS0+ZGIueGRwLndxZV9pbmZvW2NpXTsKKworCQlpZiAod2ktPm9wY29kZSA9PSBNTFg1X09QQ09ERV9OT1ApIHsKKwkJCXNxLT5jYysrOworCQkJY29udGludWU7CisJCX0KKworCQlzcS0+Y2MgKz0gd2ktPm51bV93cWViYnM7CisKKwkJbWx4NWVfcGFnZV9yZWxlYXNlKCZzcS0+Y2hhbm5lbC0+cnEsIGRpLCBmYWxzZSk7CisJfQorfQorCit2b2lkIG1seDVlX2ZyZWVfc3FfZGVzY3Moc3RydWN0IG1seDVlX3NxICpzcSkKK3sKKwlzd2l0Y2ggKHNxLT50eXBlKSB7CisJY2FzZSBNTFg1RV9TUV9UWFE6CisJCW1seDVlX2ZyZWVfdHhxX3NxX2Rlc2NzKHNxKTsKKwkJYnJlYWs7CisJY2FzZSBNTFg1RV9TUV9YRFA6CisJCW1seDVlX2ZyZWVfeGRwX3NxX2Rlc2NzKHNxKTsKKwkJYnJlYWs7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX3R4cnguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl90eHJ4LmMKaW5kZXggNjRhZTJlOC4uNTcwM2YxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX3R4cnguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fdHhyeC5jCkBAIC01MSwxNiArNTEsMTggQEAKIAogc3RhdGljIHZvaWQgbWx4NWVfcG9sbF9pY29fY3Eoc3RydWN0IG1seDVlX2NxICpjcSkKIHsKKwlzdHJ1Y3QgbWx4NWVfc3EgKnNxID0gY29udGFpbmVyX29mKGNxLCBzdHJ1Y3QgbWx4NWVfc3EsIGNxKTsKIAlzdHJ1Y3QgbWx4NV93cV9jeWMgKndxOwogCXN0cnVjdCBtbHg1X2NxZTY0ICpjcWU7Ci0Jc3RydWN0IG1seDVlX3NxICpzcTsKIAl1MTYgc3FjYzsKIAorCWlmICh1bmxpa2VseSh0ZXN0X2JpdChNTFg1RV9TUV9TVEFURV9GTFVTSCwgJnNxLT5zdGF0ZSkpKQorCQlyZXR1cm47CisKIAljcWUgPSBtbHg1ZV9nZXRfY3FlKGNxKTsKIAlpZiAobGlrZWx5KCFjcWUpKQogCQlyZXR1cm47CiAKLQlzcSA9IGNvbnRhaW5lcl9vZihjcSwgc3RydWN0IG1seDVlX3NxLCBjcSk7CiAJd3EgPSAmc3EtPndxOwogCiAJLyogc3EtPmNjIG11c3QgYmUgdXBkYXRlZCBvbmx5IGFmdGVyIG1seDVfY3F3cV91cGRhdGVfZGJfcmVjb3JkKCksCkBAIC03MCw3ICs3Miw3IEBACiAKIAlkbyB7CiAJCXUxNiBjaSA9IGJlMTZfdG9fY3B1KGNxZS0+d3FlX2NvdW50ZXIpICYgd3EtPnN6X20xOwotCQlzdHJ1Y3QgbWx4NWVfaWNvX3dxZV9pbmZvICppY293aSA9ICZzcS0+aWNvX3dxZV9pbmZvW2NpXTsKKwkJc3RydWN0IG1seDVlX3NxX3dxZV9pbmZvICppY293aSA9ICZzcS0+ZGIuaWNvX3dxZVtjaV07CiAKIAkJbWx4NV9jcXdxX3BvcCgmY3EtPndxKTsKIAkJc3FjYyArPSBpY293aS0+bnVtX3dxZWJiczsKQEAgLTg1LDcgKzg3LDcgQEAKIAkJY2FzZSBNTFg1X09QQ09ERV9OT1A6CiAJCQlicmVhazsKIAkJY2FzZSBNTFg1X09QQ09ERV9VTVI6Ci0JCQltbHg1ZV9wb3N0X3J4X2ZyYWdtZW50ZWRfbXB3cWUoJnNxLT5jaGFubmVsLT5ycSk7CisJCQltbHg1ZV9wb3N0X3J4X21wd3FlKCZzcS0+Y2hhbm5lbC0+cnEpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlXQVJOX09OQ0UodHJ1ZSwKQEAgLTEwMyw2ICsxMDUsNjYgQEAKIAlzcS0+Y2MgPSBzcWNjOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgbWx4NWVfcG9sbF94ZHBfdHhfY3Eoc3RydWN0IG1seDVlX2NxICpjcSkKK3sKKwlzdHJ1Y3QgbWx4NWVfc3EgKnNxOworCXUxNiBzcWNjOworCWludCBpOworCisJc3EgPSBjb250YWluZXJfb2YoY3EsIHN0cnVjdCBtbHg1ZV9zcSwgY3EpOworCisJaWYgKHVubGlrZWx5KHRlc3RfYml0KE1MWDVFX1NRX1NUQVRFX0ZMVVNILCAmc3EtPnN0YXRlKSkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIHNxLT5jYyBtdXN0IGJlIHVwZGF0ZWQgb25seSBhZnRlciBtbHg1X2Nxd3FfdXBkYXRlX2RiX3JlY29yZCgpLAorCSAqIG90aGVyd2lzZSBhIGNxIG92ZXJydW4gbWF5IG9jY3VyCisJICovCisJc3FjYyA9IHNxLT5jYzsKKworCWZvciAoaSA9IDA7IGkgPCBNTFg1RV9UWF9DUV9QT0xMX0JVREdFVDsgaSsrKSB7CisJCXN0cnVjdCBtbHg1X2NxZTY0ICpjcWU7CisJCXUxNiB3cWVfY291bnRlcjsKKwkJYm9vbCBsYXN0X3dxZTsKKworCQljcWUgPSBtbHg1ZV9nZXRfY3FlKGNxKTsKKwkJaWYgKCFjcWUpCisJCQlicmVhazsKKworCQltbHg1X2Nxd3FfcG9wKCZjcS0+d3EpOworCisJCXdxZV9jb3VudGVyID0gYmUxNl90b19jcHUoY3FlLT53cWVfY291bnRlcik7CisKKwkJZG8geworCQkJc3RydWN0IG1seDVlX3NxX3dxZV9pbmZvICp3aTsKKwkJCXN0cnVjdCBtbHg1ZV9kbWFfaW5mbyAqZGk7CisJCQl1MTYgY2k7CisKKwkJCWxhc3Rfd3FlID0gKHNxY2MgPT0gd3FlX2NvdW50ZXIpOworCisJCQljaSA9IHNxY2MgJiBzcS0+d3Euc3pfbTE7CisJCQlkaSA9ICZzcS0+ZGIueGRwLmRpW2NpXTsKKwkJCXdpID0gJnNxLT5kYi54ZHAud3FlX2luZm9bY2ldOworCisJCQlpZiAodW5saWtlbHkod2ktPm9wY29kZSA9PSBNTFg1X09QQ09ERV9OT1ApKSB7CisJCQkJc3FjYysrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlzcWNjICs9IHdpLT5udW1fd3FlYmJzOworCQkJLyogUmVjeWNsZSBSWCBwYWdlICovCisJCQltbHg1ZV9wYWdlX3JlbGVhc2UoJnNxLT5jaGFubmVsLT5ycSwgZGksIHRydWUpOworCQl9IHdoaWxlICghbGFzdF93cWUpOworCX0KKworCW1seDVfY3F3cV91cGRhdGVfZGJfcmVjb3JkKCZjcS0+d3EpOworCisJLyogZW5zdXJlIGNxIHNwYWNlIGlzIGZyZWVkIGJlZm9yZSBlbmFibGluZyBtb3JlIGNxZXMgKi8KKwl3bWIoKTsKKworCXNxLT5jYyA9IHNxY2M7CisJcmV0dXJuIChpID09IE1MWDVFX1RYX0NRX1BPTExfQlVER0VUKTsKK30KKwogaW50IG1seDVlX25hcGlfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCiB7CiAJc3RydWN0IG1seDVlX2NoYW5uZWwgKmMgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IG1seDVlX2NoYW5uZWwsCkBAIC0xMTksNiArMTgxLDkgQEAKIAl3b3JrX2RvbmUgPSBtbHg1ZV9wb2xsX3J4X2NxKCZjLT5ycS5jcSwgYnVkZ2V0KTsKIAlidXN5IHw9IHdvcmtfZG9uZSA9PSBidWRnZXQ7CiAKKwlpZiAoYy0+eGRwKQorCQlidXN5IHw9IG1seDVlX3BvbGxfeGRwX3R4X2NxKCZjLT54ZHBfc3EuY3EpOworCiAJbWx4NWVfcG9sbF9pY29fY3EoJmMtPmljb3NxLmNxKTsKIAogCWJ1c3kgfD0gbWx4NWVfcG9zdF9yeF93cWVzKCZjLT5ycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lcS5jCmluZGV4IDBlMzA2MDIuLmFhY2EwOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lcS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lcS5jCkBAIC04NiwyMyArODYsMTIgQEAKIAogc3RhdGljIGludCBtbHg1X2NtZF9kZXN0cm95X2VxKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHU4IGVxbikKIHsKLQlzdHJ1Y3QgbWx4NV9kZXN0cm95X2VxX21ib3hfaW4gaW47Ci0Jc3RydWN0IG1seDVfZGVzdHJveV9lcV9tYm94X291dCBvdXQ7Ci0JaW50IGVycjsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV9lcV9vdXQpXSA9IHswfTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X2VxX2luKV0gICA9IHswfTsKIAotCW1lbXNldCgmaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldCgmb3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JaW4uaGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX0RFU1RST1lfRVEpOwotCWluLmVxbiA9IGVxbjsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCAmb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKCFlcnIpCi0JCWdvdG8gZXg7Ci0KLQlpZiAob3V0Lmhkci5zdGF0dXMpCi0JCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwotCi1leDoKLQlyZXR1cm4gZXJyOworCU1MWDVfU0VUKGRlc3Ryb3lfZXFfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0RFU1RST1lfRVEpOworCU1MWDVfU0VUKGRlc3Ryb3lfZXFfaW4sIGluLCBlcV9udW1iZXIsIGVxbik7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWx4NV9lcWUgKmdldF9lcWUoc3RydWN0IG1seDVfZXEgKmVxLCB1MzIgZW50cnkpCkBAIC0zNTEsMTEgKzM0MCwxMyBAQAogaW50IG1seDVfY3JlYXRlX21hcF9lcShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9lcSAqZXEsIHU4IHZlY2lkeCwKIAkJICAgICAgIGludCBuZW50LCB1NjQgbWFzaywgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1seDVfdWFyICp1YXIpCiB7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGNyZWF0ZV9lcV9vdXQpXSA9IHswfTsKIAlzdHJ1Y3QgbWx4NV9wcml2ICpwcml2ID0gJmRldi0+cHJpdjsKLQlzdHJ1Y3QgbWx4NV9jcmVhdGVfZXFfbWJveF9pbiAqaW47Ci0Jc3RydWN0IG1seDVfY3JlYXRlX2VxX21ib3hfb3V0IG91dDsKLQlpbnQgZXJyOworCV9fYmU2NCAqcGFzOworCXZvaWQgKmVxYzsKIAlpbnQgaW5sZW47CisJdTMyICppbjsKKwlpbnQgZXJyOwogCiAJZXEtPm5lbnQgPSByb3VuZHVwX3Bvd19vZl90d28obmVudCArIE1MWDVfTlVNX1NQQVJFX0VRRSk7CiAJZXEtPmNvbnNfaW5kZXggPSAwOwpAQCAtMzY1LDM1ICszNTYsMzYgQEAKIAogCWluaXRfZXFfYnVmKGVxKTsKIAotCWlubGVuID0gc2l6ZW9mKCppbikgKyBzaXplb2YoaW4tPnBhc1swXSkgKiBlcS0+YnVmLm5wYWdlczsKKwlpbmxlbiA9IE1MWDVfU1RfU1pfQllURVMoY3JlYXRlX2VxX2luKSArCisJCU1MWDVfRkxEX1NaX0JZVEVTKGNyZWF0ZV9lcV9pbiwgcGFzWzBdKSAqIGVxLT5idWYubnBhZ2VzOworCiAJaW4gPSBtbHg1X3Z6YWxsb2MoaW5sZW4pOwogCWlmICghaW4pIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfYnVmOwogCX0KLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwogCi0JbWx4NV9maWxsX3BhZ2VfYXJyYXkoJmVxLT5idWYsIGluLT5wYXMpOworCXBhcyA9IChfX2JlNjQgKilNTFg1X0FERFJfT0YoY3JlYXRlX2VxX2luLCBpbiwgcGFzKTsKKwltbHg1X2ZpbGxfcGFnZV9hcnJheSgmZXEtPmJ1ZiwgcGFzKTsKIAotCWluLT5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfQ1JFQVRFX0VRKTsKLQlpbi0+Y3R4LmxvZ19zel91c3JfcGFnZSA9IGNwdV90b19iZTMyKGlsb2cyKGVxLT5uZW50KSA8PCAyNCB8IHVhci0+aW5kZXgpOwotCWluLT5jdHguaW50ciA9IHZlY2lkeDsKLQlpbi0+Y3R4LmxvZ19wYWdlX3NpemUgPSBlcS0+YnVmLnBhZ2Vfc2hpZnQgLSBNTFg1X0FEQVBURVJfUEFHRV9TSElGVDsKLQlpbi0+ZXZlbnRzX21hc2sgPSBjcHVfdG9fYmU2NChtYXNrKTsKKwlNTFg1X1NFVChjcmVhdGVfZXFfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0NSRUFURV9FUSk7CisJTUxYNV9TRVQ2NChjcmVhdGVfZXFfaW4sIGluLCBldmVudF9iaXRtYXNrLCBtYXNrKTsKIAotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sICZvdXQsIHNpemVvZihvdXQpKTsKKwllcWMgPSBNTFg1X0FERFJfT0YoY3JlYXRlX2VxX2luLCBpbiwgZXFfY29udGV4dF9lbnRyeSk7CisJTUxYNV9TRVQoZXFjLCBlcWMsIGxvZ19lcV9zaXplLCBpbG9nMihlcS0+bmVudCkpOworCU1MWDVfU0VUKGVxYywgZXFjLCB1YXJfcGFnZSwgdWFyLT5pbmRleCk7CisJTUxYNV9TRVQoZXFjLCBlcWMsIGludHIsIHZlY2lkeCk7CisJTUxYNV9TRVQoZXFjLCBlcWMsIGxvZ19wYWdlX3NpemUsCisJCSBlcS0+YnVmLnBhZ2Vfc2hpZnQgLSBNTFg1X0FEQVBURVJfUEFHRV9TSElGVCk7CisKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9pbjsKIAotCWlmIChvdXQuaGRyLnN0YXR1cykgewotCQllcnIgPSBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQuaGRyKTsKLQkJZ290byBlcnJfaW47Ci0JfQotCiAJc25wcmludGYocHJpdi0+aXJxX2luZm9bdmVjaWR4XS5uYW1lLCBNTFg1X01BWF9JUlFfTkFNRSwgIiVzQHBjaTolcyIsCiAJCSBuYW1lLCBwY2lfbmFtZShkZXYtPnBkZXYpKTsKIAotCWVxLT5lcW4gPSBvdXQuZXFfbnVtYmVyOworCWVxLT5lcW4gPSBNTFg1X0dFVChjcmVhdGVfZXFfb3V0LCBvdXQsIGVxX251bWJlcik7CiAJZXEtPmlycW4gPSBwcml2LT5tc2l4X2Fyclt2ZWNpZHhdLnZlY3RvcjsKIAllcS0+ZGV2ID0gZGV2OwogCWVxLT5kb29yYmVsbCA9IHVhci0+bWFwICsgTUxYNV9FUV9ET09SQkVMX09GRlNFVDsKQEAgLTU0NywyMiArNTM5LDEyIEBACiB9CiAKIGludCBtbHg1X2NvcmVfZXFfcXVlcnkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfZXEgKmVxLAotCQkgICAgICAgc3RydWN0IG1seDVfcXVlcnlfZXFfbWJveF9vdXQgKm91dCwgaW50IG91dGxlbikKKwkJICAgICAgIHUzMiAqb3V0LCBpbnQgb3V0bGVuKQogewotCXN0cnVjdCBtbHg1X3F1ZXJ5X2VxX21ib3hfaW4gaW47Ci0JaW50IGVycjsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9lcV9pbildID0gezB9OwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgb3V0bGVuKTsKLQlpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfUVVFUllfRVEpOwotCWluLmVxbiA9IGVxLT5lcW47Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRsZW4pOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAob3V0LT5oZHIuc3RhdHVzKQotCQllcnIgPSBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQtPmhkcik7Ci0KLQlyZXR1cm4gZXJyOworCU1MWDVfU0VUKHF1ZXJ5X2VxX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9RVUVSWV9FUSk7CisJTUxYNV9TRVQocXVlcnlfZXFfaW4sIGluLCBlcV9udW1iZXIsIGVxLT5lcW4pOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDVfY29yZV9lcV9xdWVyeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXN3aXRjaC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2Vzd2l0Y2guYwppbmRleCBmNmQ2Njc3Li5hYmJmMmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXN3aXRjaC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lc3dpdGNoLmMKQEAgLTgxLDE5ICs4MSwxMiBAQAogCQkJICAgIE1DX0FERFJfQ0hBTkdFIHwgXAogCQkJICAgIFBST01JU0NfQ0hBTkdFKQogCi1pbnQgZXN3X29mZmxvYWRzX2luaXQoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LCBpbnQgbnZwb3J0cyk7Ci12b2lkIGVzd19vZmZsb2Fkc19jbGVhbnVwKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywgaW50IG52cG9ydHMpOwotCiBzdGF0aWMgaW50IGFybV92cG9ydF9jb250ZXh0X2V2ZW50c19jbWQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2IHZwb3J0LAogCQkJCQl1MzIgZXZlbnRzX21hc2spCiB7Ci0JaW50IGluW01MWDVfU1RfU1pfRFcobW9kaWZ5X25pY192cG9ydF9jb250ZXh0X2luKV07Ci0JaW50IG91dFtNTFg1X1NUX1NaX0RXKG1vZGlmeV9uaWNfdnBvcnRfY29udGV4dF9vdXQpXTsKKwlpbnQgaW5bTUxYNV9TVF9TWl9EVyhtb2RpZnlfbmljX3Zwb3J0X2NvbnRleHRfaW4pXSAgID0gezB9OworCWludCBvdXRbTUxYNV9TVF9TWl9EVyhtb2RpZnlfbmljX3Zwb3J0X2NvbnRleHRfb3V0KV0gPSB7MH07CiAJdm9pZCAqbmljX3Zwb3J0X2N0eDsKLQlpbnQgZXJyOwotCi0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CiAKIAlNTFg1X1NFVChtb2RpZnlfbmljX3Zwb3J0X2NvbnRleHRfaW4sIGluLAogCQkgb3Bjb2RlLCBNTFg1X0NNRF9PUF9NT0RJRllfTklDX1ZQT1JUX0NPTlRFWFQpOwpAQCAtMTE2LDExMyArMTA5LDQ0IEBACiAJCU1MWDVfU0VUKG5pY192cG9ydF9jb250ZXh0LCBuaWNfdnBvcnRfY3R4LAogCQkJIGV2ZW50X29uX3Byb21pc2NfY2hhbmdlLCAxKTsKIAotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikKLQkJZ290byBleDsKLQllcnIgPSBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyX3YyKG91dCk7Ci0JaWYgKGVycikKLQkJZ290byBleDsKLQlyZXR1cm4gMDsKLWV4OgotCXJldHVybiBlcnI7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIC8qIEUtU3dpdGNoIHZwb3J0IGNvbnRleHQgSFcgY29tbWFuZHMgKi8KLXN0YXRpYyBpbnQgcXVlcnlfZXN3X3Zwb3J0X2NvbnRleHRfY21kKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCB1MzIgdnBvcnQsCi0JCQkJICAgICAgIHUzMiAqb3V0LCBpbnQgb3V0bGVuKQotewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X2Vzd192cG9ydF9jb250ZXh0X2luKV07Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCi0JTUxYNV9TRVQocXVlcnlfbmljX3Zwb3J0X2NvbnRleHRfaW4sIGluLCBvcGNvZGUsCi0JCSBNTFg1X0NNRF9PUF9RVUVSWV9FU1dfVlBPUlRfQ09OVEVYVCk7Ci0KLQlNTFg1X1NFVChxdWVyeV9lc3dfdnBvcnRfY29udGV4dF9pbiwgaW4sIHZwb3J0X251bWJlciwgdnBvcnQpOwotCWlmICh2cG9ydCkKLQkJTUxYNV9TRVQocXVlcnlfZXN3X3Zwb3J0X2NvbnRleHRfaW4sIGluLCBvdGhlcl92cG9ydCwgMSk7Ci0KLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMobWRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKLX0KLQotc3RhdGljIGludCBxdWVyeV9lc3dfdnBvcnRfY3ZsYW4oc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHZwb3J0LAotCQkJCSB1MTYgKnZsYW4sIHU4ICpxb3MpCi17Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKHF1ZXJ5X2Vzd192cG9ydF9jb250ZXh0X291dCldOwotCWludCBlcnI7Ci0JYm9vbCBjdmxhbl9zdHJpcDsKLQlib29sIGN2bGFuX2luc2VydDsKLQotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQotCSp2bGFuID0gMDsKLQkqcW9zID0gMDsKLQotCWlmICghTUxYNV9DQVBfRVNXKGRldiwgdnBvcnRfY3ZsYW5fc3RyaXApIHx8Ci0JICAgICFNTFg1X0NBUF9FU1coZGV2LCB2cG9ydF9jdmxhbl9pbnNlcnRfaWZfbm90X2V4aXN0KSkKLQkJcmV0dXJuIC1FTk9UU1VQUDsKLQotCWVyciA9IHF1ZXJ5X2Vzd192cG9ydF9jb250ZXh0X2NtZChkZXYsIHZwb3J0LCBvdXQsIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQotCWN2bGFuX3N0cmlwID0gTUxYNV9HRVQocXVlcnlfZXN3X3Zwb3J0X2NvbnRleHRfb3V0LCBvdXQsCi0JCQkgICAgICAgZXN3X3Zwb3J0X2NvbnRleHQudnBvcnRfY3ZsYW5fc3RyaXApOwotCi0JY3ZsYW5faW5zZXJ0ID0gTUxYNV9HRVQocXVlcnlfZXN3X3Zwb3J0X2NvbnRleHRfb3V0LCBvdXQsCi0JCQkJZXN3X3Zwb3J0X2NvbnRleHQudnBvcnRfY3ZsYW5faW5zZXJ0KTsKLQotCWlmIChjdmxhbl9zdHJpcCB8fCBjdmxhbl9pbnNlcnQpIHsKLQkJKnZsYW4gPSBNTFg1X0dFVChxdWVyeV9lc3dfdnBvcnRfY29udGV4dF9vdXQsIG91dCwKLQkJCQkgZXN3X3Zwb3J0X2NvbnRleHQuY3ZsYW5faWQpOwotCQkqcW9zID0gTUxYNV9HRVQocXVlcnlfZXN3X3Zwb3J0X2NvbnRleHRfb3V0LCBvdXQsCi0JCQkJZXN3X3Zwb3J0X2NvbnRleHQuY3ZsYW5fcGNwKTsKLQl9Ci0KLQllc3dfZGVidWcoZGV2LCAiUXVlcnkgVnBvcnRbJWRdIGN2bGFuOiBWTEFOICVkIHFvcz0lZFxuIiwKLQkJICB2cG9ydCwgKnZsYW4sICpxb3MpOwotb3V0OgotCXJldHVybiBlcnI7Ci19Ci0KIHN0YXRpYyBpbnQgbW9kaWZ5X2Vzd192cG9ydF9jb250ZXh0X2NtZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgdnBvcnQsCiAJCQkJCXZvaWQgKmluLCBpbnQgaW5sZW4pCiB7Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKG1vZGlmeV9lc3dfdnBvcnRfY29udGV4dF9vdXQpXTsKLQotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQotCU1MWDVfU0VUKG1vZGlmeV9lc3dfdnBvcnRfY29udGV4dF9pbiwgaW4sIHZwb3J0X251bWJlciwgdnBvcnQpOwotCWlmICh2cG9ydCkKLQkJTUxYNV9TRVQobW9kaWZ5X2Vzd192cG9ydF9jb250ZXh0X2luLCBpbiwgb3RoZXJfdnBvcnQsIDEpOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhtb2RpZnlfZXN3X3Zwb3J0X2NvbnRleHRfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChtb2RpZnlfZXN3X3Zwb3J0X2NvbnRleHRfaW4sIGluLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9NT0RJRllfRVNXX1ZQT1JUX0NPTlRFWFQpOwotCi0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIGlubGVuLAotCQkJCQkgIG91dCwgc2l6ZW9mKG91dCkpOworCU1MWDVfU0VUKG1vZGlmeV9lc3dfdnBvcnRfY29udGV4dF9pbiwgaW4sIHZwb3J0X251bWJlciwgdnBvcnQpOworCWlmICh2cG9ydCkKKwkJTUxYNV9TRVQobW9kaWZ5X2Vzd192cG9ydF9jb250ZXh0X2luLCBpbiwgb3RoZXJfdnBvcnQsIDEpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIAogc3RhdGljIGludCBtb2RpZnlfZXN3X3Zwb3J0X2N2bGFuKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiB2cG9ydCwKLQkJCQkgIHUxNiB2bGFuLCB1OCBxb3MsIGJvb2wgc2V0KQorCQkJCSAgdTE2IHZsYW4sIHU4IHFvcywgdTggc2V0X2ZsYWdzKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKG1vZGlmeV9lc3dfdnBvcnRfY29udGV4dF9pbildOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhtb2RpZnlfZXN3X3Zwb3J0X2NvbnRleHRfaW4pXSA9IHswfTsKIAogCWlmICghTUxYNV9DQVBfRVNXKGRldiwgdnBvcnRfY3ZsYW5fc3RyaXApIHx8CiAJICAgICFNTFg1X0NBUF9FU1coZGV2LCB2cG9ydF9jdmxhbl9pbnNlcnRfaWZfbm90X2V4aXN0KSkKIAkJcmV0dXJuIC1FTk9UU1VQUDsKIAotCWVzd19kZWJ1ZyhkZXYsICJTZXQgVnBvcnRbJWRdIFZMQU4gJWQgcW9zICVkIHNldD0lZFxuIiwKLQkJICB2cG9ydCwgdmxhbiwgcW9zLCBzZXQpOworCWVzd19kZWJ1ZyhkZXYsICJTZXQgVnBvcnRbJWRdIFZMQU4gJWQgcW9zICVkIHNldD0leFxuIiwKKwkJICB2cG9ydCwgdmxhbiwgcW9zLCBzZXRfZmxhZ3MpOwogCi0JaWYgKHNldCkgeworCWlmIChzZXRfZmxhZ3MgJiBTRVRfVkxBTl9TVFJJUCkKIAkJTUxYNV9TRVQobW9kaWZ5X2Vzd192cG9ydF9jb250ZXh0X2luLCBpbiwKIAkJCSBlc3dfdnBvcnRfY29udGV4dC52cG9ydF9jdmxhbl9zdHJpcCwgMSk7CisKKwlpZiAoc2V0X2ZsYWdzICYgU0VUX1ZMQU5fSU5TRVJUKSB7CiAJCS8qIGluc2VydCBvbmx5IGlmIG5vIHZsYW4gaW4gcGFja2V0ICovCiAJCU1MWDVfU0VUKG1vZGlmeV9lc3dfdnBvcnRfY29udGV4dF9pbiwgaW4sCiAJCQkgZXN3X3Zwb3J0X2NvbnRleHQudnBvcnRfY3ZsYW5faW5zZXJ0LCAxKTsKKwogCQlNTFg1X1NFVChtb2RpZnlfZXN3X3Zwb3J0X2NvbnRleHRfaW4sIGluLAogCQkJIGVzd192cG9ydF9jb250ZXh0LmN2bGFuX3BjcCwgcW9zKTsKIAkJTUxYNV9TRVQobW9kaWZ5X2Vzd192cG9ydF9jb250ZXh0X2luLCBpbiwKQEAgLTI0MSwxMyArMTY1LDEwIEBACiBzdGF0aWMgaW50IHNldF9sMl90YWJsZV9lbnRyeV9jbWQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIGluZGV4LAogCQkJCSAgdTggKm1hYywgdTggdmxhbl92YWxpZCwgdTE2IHZsYW4pCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoc2V0X2wyX3RhYmxlX2VudHJ5X2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKHNldF9sMl90YWJsZV9lbnRyeV9vdXQpXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhzZXRfbDJfdGFibGVfZW50cnlfaW4pXSAgID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhzZXRfbDJfdGFibGVfZW50cnlfb3V0KV0gPSB7MH07CiAJdTggKmluX21hY19hZGRyOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0KIAlNTFg1X1NFVChzZXRfbDJfdGFibGVfZW50cnlfaW4sIGluLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9TRVRfTDJfVEFCTEVfRU5UUlkpOwogCU1MWDVfU0VUKHNldF9sMl90YWJsZV9lbnRyeV9pbiwgaW4sIHRhYmxlX2luZGV4LCBpbmRleCk7CkBAIC0yNTcsMjMgKzE3OCwxOCBAQAogCWluX21hY19hZGRyID0gTUxYNV9BRERSX09GKHNldF9sMl90YWJsZV9lbnRyeV9pbiwgaW4sIG1hY19hZGRyZXNzKTsKIAlldGhlcl9hZGRyX2NvcHkoJmluX21hY19hZGRyWzJdLCBtYWMpOwogCi0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksCi0JCQkJCSAgb3V0LCBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIHN0YXRpYyBpbnQgZGVsX2wyX3RhYmxlX2VudHJ5X2NtZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgaW5kZXgpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoZGVsZXRlX2wyX3RhYmxlX2VudHJ5X2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlbGV0ZV9sMl90YWJsZV9lbnRyeV9vdXQpXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlbGV0ZV9sMl90YWJsZV9lbnRyeV9pbildICAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlbGV0ZV9sMl90YWJsZV9lbnRyeV9vdXQpXSA9IHswfTsKIAogCU1MWDVfU0VUKGRlbGV0ZV9sMl90YWJsZV9lbnRyeV9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX0RFTEVURV9MMl9UQUJMRV9FTlRSWSk7CiAJTUxYNV9TRVQoZGVsZXRlX2wyX3RhYmxlX2VudHJ5X2luLCBpbiwgdGFibGVfaW5kZXgsIGluZGV4KTsKLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgc2l6ZW9mKGluKSwKLQkJCQkJICBvdXQsIHNpemVvZihvdXQpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIAogc3RhdGljIGludCBhbGxvY19sMl90YWJsZV9pbmRleChzdHJ1Y3QgbWx4NV9sMl90YWJsZSAqbDJfdGFibGUsIHUzMiAqaXgpCkBAIC0zNDAsNyArMjU2LDcgQEAKIAogCXNwZWMgPSBtbHg1X3Z6YWxsb2Moc2l6ZW9mKCpzcGVjKSk7CiAJaWYgKCFzcGVjKSB7Ci0JCXByX3dhcm4oIkZEQjogRmFpbGVkIHRvIGFsbG9jIG1hdGNoIHBhcmFtZXRlcnNcbiIpOworCQllc3dfd2Fybihlc3ctPmRldiwgIkZEQjogRmFpbGVkIHRvIGFsbG9jIG1hdGNoIHBhcmFtZXRlcnNcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJZG1hY192ID0gTUxYNV9BRERSX09GKGZ0ZV9tYXRjaF9wYXJhbSwgc3BlYy0+bWF0Y2hfdmFsdWUsCkBAIC0zNzQsOCArMjkwLDggQEAKIAkJCQkgICBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fRldEX0RFU1QsCiAJCQkJICAgMCwgJmRlc3QpOwogCWlmIChJU19FUlIoZmxvd19ydWxlKSkgewotCQlwcl93YXJuKAotCQkJIkZEQjogRmFpbGVkIHRvIGFkZCBmbG93IHJ1bGU6IGRtYWNfdiglcE0pIGRtYWNfYyglcE0pIC0+IHZwb3J0KCVkKSwgZXJyKCVsZClcbiIsCisJCWVzd193YXJuKGVzdy0+ZGV2LAorCQkJICJGREI6IEZhaWxlZCB0byBhZGQgZmxvdyBydWxlOiBkbWFjX3YoJXBNKSBkbWFjX2MoJXBNKSAtPiB2cG9ydCglZCksIGVyciglbGQpXG4iLAogCQkJIGRtYWNfdiwgZG1hY19jLCB2cG9ydCwgUFRSX0VSUihmbG93X3J1bGUpKTsKIAkJZmxvd19ydWxlID0gTlVMTDsKIAl9CkBAIC05NTUsNyArODcxLDcgQEAKIAllc3dfZGVidWcoZXN3LT5kZXYsICJ2cG9ydFslZF0gY29udGV4dCB1cGRhdGUgcnggbW9kZSBwcm9taXNjX2FsbD0lZCwgYWxsX211bHRpPSVkXG4iLAogCQkgIHZwb3J0X251bSwgcHJvbWlzY19hbGwsIHByb21pc2NfbWMpOwogCi0JaWYgKCF2cG9ydC0+dHJ1c3RlZCB8fCAhdnBvcnQtPmVuYWJsZWQpIHsKKwlpZiAoIXZwb3J0LT5pbmZvLnRydXN0ZWQgfHwgIXZwb3J0LT5lbmFibGVkKSB7CiAJCXByb21pc2NfdWMgPSAwOwogCQlwcm9taXNjX21jID0gMDsKIAkJcHJvbWlzY19hbGwgPSAwOwpAQCAtMTI5MSwzMCArMTIwNywyMCBAQAogCQkJCSAgICBzdHJ1Y3QgbWx4NV92cG9ydCAqdnBvcnQpCiB7CiAJc3RydWN0IG1seDVfZmxvd19zcGVjICpzcGVjOwotCXU4IHNtYWNbRVRIX0FMRU5dOwogCWludCBlcnIgPSAwOwogCXU4ICpzbWFjX3Y7CiAKLQlpZiAodnBvcnQtPnNwb29mY2hrKSB7Ci0JCWVyciA9IG1seDVfcXVlcnlfbmljX3Zwb3J0X21hY19hZGRyZXNzKGVzdy0+ZGV2LCB2cG9ydC0+dnBvcnQsIHNtYWMpOwotCQlpZiAoZXJyKSB7Ci0JCQllc3dfd2Fybihlc3ctPmRldiwKLQkJCQkgInZwb3J0WyVkXSBjb25maWd1cmUgaW5ncmVzcyBydWxlcyBmYWlsZWQsIHF1ZXJ5IHNtYWMgZmFpbGVkLCBlcnIoJWQpXG4iLAotCQkJCSB2cG9ydC0+dnBvcnQsIGVycik7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJaWYgKHZwb3J0LT5pbmZvLnNwb29mY2hrICYmICFpc192YWxpZF9ldGhlcl9hZGRyKHZwb3J0LT5pbmZvLm1hYykpIHsKKwkJbWx4NV9jb3JlX3dhcm4oZXN3LT5kZXYsCisJCQkgICAgICAgInZwb3J0WyVkXSBjb25maWd1cmUgaW5ncmVzcyBydWxlcyBmYWlsZWQsIGlsbGVnYWwgbWFjIHdpdGggc3Bvb2ZjaGtcbiIsCisJCQkgICAgICAgdnBvcnQtPnZwb3J0KTsKKwkJcmV0dXJuIC1FUEVSTTsKIAotCQlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoc21hYykpIHsKLQkJCW1seDVfY29yZV93YXJuKGVzdy0+ZGV2LAotCQkJCSAgICAgICAidnBvcnRbJWRdIGNvbmZpZ3VyZSBpbmdyZXNzIHJ1bGVzIGZhaWxlZCwgaWxsZWdhbCBtYWMgd2l0aCBzcG9vZmNoa1xuIiwKLQkJCQkgICAgICAgdnBvcnQtPnZwb3J0KTsKLQkJCXJldHVybiAtRVBFUk07Ci0JCX0KIAl9CiAKIAllc3dfdnBvcnRfY2xlYW51cF9pbmdyZXNzX3J1bGVzKGVzdywgdnBvcnQpOwogCi0JaWYgKCF2cG9ydC0+dmxhbiAmJiAhdnBvcnQtPnFvcyAmJiAhdnBvcnQtPnNwb29mY2hrKSB7CisJaWYgKCF2cG9ydC0+aW5mby52bGFuICYmICF2cG9ydC0+aW5mby5xb3MgJiYgIXZwb3J0LT5pbmZvLnNwb29mY2hrKSB7CiAJCWVzd192cG9ydF9kaXNhYmxlX2luZ3Jlc3NfYWNsKGVzdywgdnBvcnQpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMzIzLDcgKzEyMjksNyBAQAogCiAJZXN3X2RlYnVnKGVzdy0+ZGV2LAogCQkgICJ2cG9ydFslZF0gY29uZmlndXJlIGluZ3Jlc3MgcnVsZXMsIHZsYW4oJWQpIHFvcyglZClcbiIsCi0JCSAgdnBvcnQtPnZwb3J0LCB2cG9ydC0+dmxhbiwgdnBvcnQtPnFvcyk7CisJCSAgdnBvcnQtPnZwb3J0LCB2cG9ydC0+aW5mby52bGFuLCB2cG9ydC0+aW5mby5xb3MpOwogCiAJc3BlYyA9IG1seDVfdnphbGxvYyhzaXplb2YoKnNwZWMpKTsKIAlpZiAoIXNwZWMpIHsKQEAgLTEzMzMsMTYgKzEyMzksMTYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHZwb3J0LT52bGFuIHx8IHZwb3J0LT5xb3MpCisJaWYgKHZwb3J0LT5pbmZvLnZsYW4gfHwgdnBvcnQtPmluZm8ucW9zKQogCQlNTFg1X1NFVF9UT19PTkVTKGZ0ZV9tYXRjaF9wYXJhbSwgc3BlYy0+bWF0Y2hfY3JpdGVyaWEsIG91dGVyX2hlYWRlcnMudmxhbl90YWcpOwogCi0JaWYgKHZwb3J0LT5zcG9vZmNoaykgeworCWlmICh2cG9ydC0+aW5mby5zcG9vZmNoaykgewogCQlNTFg1X1NFVF9UT19PTkVTKGZ0ZV9tYXRjaF9wYXJhbSwgc3BlYy0+bWF0Y2hfY3JpdGVyaWEsIG91dGVyX2hlYWRlcnMuc21hY180N18xNik7CiAJCU1MWDVfU0VUX1RPX09ORVMoZnRlX21hdGNoX3BhcmFtLCBzcGVjLT5tYXRjaF9jcml0ZXJpYSwgb3V0ZXJfaGVhZGVycy5zbWFjXzE1XzApOwogCQlzbWFjX3YgPSBNTFg1X0FERFJfT0YoZnRlX21hdGNoX3BhcmFtLAogCQkJCSAgICAgIHNwZWMtPm1hdGNoX3ZhbHVlLAogCQkJCSAgICAgIG91dGVyX2hlYWRlcnMuc21hY180N18xNik7Ci0JCWV0aGVyX2FkZHJfY29weShzbWFjX3YsIHNtYWMpOworCQlldGhlcl9hZGRyX2NvcHkoc21hY192LCB2cG9ydC0+aW5mby5tYWMpOwogCX0KIAogCXNwZWMtPm1hdGNoX2NyaXRlcmlhX2VuYWJsZSA9IE1MWDVfTUFUQ0hfT1VURVJfSEVBREVSUzsKQEAgLTEzNTIsOCArMTI1OCw5IEBACiAJCQkJICAgMCwgTlVMTCk7CiAJaWYgKElTX0VSUih2cG9ydC0+aW5ncmVzcy5hbGxvd19ydWxlKSkgewogCQllcnIgPSBQVFJfRVJSKHZwb3J0LT5pbmdyZXNzLmFsbG93X3J1bGUpOwotCQlwcl93YXJuKCJ2cG9ydFslZF0gY29uZmlndXJlIGluZ3Jlc3MgYWxsb3cgcnVsZSwgZXJyKCVkKVxuIiwKLQkJCXZwb3J0LT52cG9ydCwgZXJyKTsKKwkJZXN3X3dhcm4oZXN3LT5kZXYsCisJCQkgInZwb3J0WyVkXSBjb25maWd1cmUgaW5ncmVzcyBhbGxvdyBydWxlLCBlcnIoJWQpXG4iLAorCQkJIHZwb3J0LT52cG9ydCwgZXJyKTsKIAkJdnBvcnQtPmluZ3Jlc3MuYWxsb3dfcnVsZSA9IE5VTEw7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEzNjUsOCArMTI3Miw5IEBACiAJCQkJICAgMCwgTlVMTCk7CiAJaWYgKElTX0VSUih2cG9ydC0+aW5ncmVzcy5kcm9wX3J1bGUpKSB7CiAJCWVyciA9IFBUUl9FUlIodnBvcnQtPmluZ3Jlc3MuZHJvcF9ydWxlKTsKLQkJcHJfd2FybigidnBvcnRbJWRdIGNvbmZpZ3VyZSBpbmdyZXNzIGRyb3AgcnVsZSwgZXJyKCVkKVxuIiwKLQkJCXZwb3J0LT52cG9ydCwgZXJyKTsKKwkJZXN3X3dhcm4oZXN3LT5kZXYsCisJCQkgInZwb3J0WyVkXSBjb25maWd1cmUgaW5ncmVzcyBkcm9wIHJ1bGUsIGVyciglZClcbiIsCisJCQkgdnBvcnQtPnZwb3J0LCBlcnIpOwogCQl2cG9ydC0+aW5ncmVzcy5kcm9wX3J1bGUgPSBOVUxMOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMzg2LDcgKzEyOTQsNyBAQAogCiAJZXN3X3Zwb3J0X2NsZWFudXBfZWdyZXNzX3J1bGVzKGVzdywgdnBvcnQpOwogCi0JaWYgKCF2cG9ydC0+dmxhbiAmJiAhdnBvcnQtPnFvcykgeworCWlmICghdnBvcnQtPmluZm8udmxhbiAmJiAhdnBvcnQtPmluZm8ucW9zKSB7CiAJCWVzd192cG9ydF9kaXNhYmxlX2VncmVzc19hY2woZXN3LCB2cG9ydCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTEzOTUsNyArMTMwMyw3IEBACiAKIAllc3dfZGVidWcoZXN3LT5kZXYsCiAJCSAgInZwb3J0WyVkXSBjb25maWd1cmUgZWdyZXNzIHJ1bGVzLCB2bGFuKCVkKSBxb3MoJWQpXG4iLAotCQkgIHZwb3J0LT52cG9ydCwgdnBvcnQtPnZsYW4sIHZwb3J0LT5xb3MpOworCQkgIHZwb3J0LT52cG9ydCwgdnBvcnQtPmluZm8udmxhbiwgdnBvcnQtPmluZm8ucW9zKTsKIAogCXNwZWMgPSBtbHg1X3Z6YWxsb2Moc2l6ZW9mKCpzcGVjKSk7CiAJaWYgKCFzcGVjKSB7CkBAIC0xNDA5LDcgKzEzMTcsNyBAQAogCU1MWDVfU0VUX1RPX09ORVMoZnRlX21hdGNoX3BhcmFtLCBzcGVjLT5tYXRjaF9jcml0ZXJpYSwgb3V0ZXJfaGVhZGVycy52bGFuX3RhZyk7CiAJTUxYNV9TRVRfVE9fT05FUyhmdGVfbWF0Y2hfcGFyYW0sIHNwZWMtPm1hdGNoX3ZhbHVlLCBvdXRlcl9oZWFkZXJzLnZsYW5fdGFnKTsKIAlNTFg1X1NFVF9UT19PTkVTKGZ0ZV9tYXRjaF9wYXJhbSwgc3BlYy0+bWF0Y2hfY3JpdGVyaWEsIG91dGVyX2hlYWRlcnMuZmlyc3RfdmlkKTsKLQlNTFg1X1NFVChmdGVfbWF0Y2hfcGFyYW0sIHNwZWMtPm1hdGNoX3ZhbHVlLCBvdXRlcl9oZWFkZXJzLmZpcnN0X3ZpZCwgdnBvcnQtPnZsYW4pOworCU1MWDVfU0VUKGZ0ZV9tYXRjaF9wYXJhbSwgc3BlYy0+bWF0Y2hfdmFsdWUsIG91dGVyX2hlYWRlcnMuZmlyc3RfdmlkLCB2cG9ydC0+aW5mby52bGFuKTsKIAogCXNwZWMtPm1hdGNoX2NyaXRlcmlhX2VuYWJsZSA9IE1MWDVfTUFUQ0hfT1VURVJfSEVBREVSUzsKIAl2cG9ydC0+ZWdyZXNzLmFsbG93ZWRfdmxhbiA9CkBAIC0xNDE4LDggKzEzMjYsOSBAQAogCQkJCSAgIDAsIE5VTEwpOwogCWlmIChJU19FUlIodnBvcnQtPmVncmVzcy5hbGxvd2VkX3ZsYW4pKSB7CiAJCWVyciA9IFBUUl9FUlIodnBvcnQtPmVncmVzcy5hbGxvd2VkX3ZsYW4pOwotCQlwcl93YXJuKCJ2cG9ydFslZF0gY29uZmlndXJlIGVncmVzcyBhbGxvd2VkIHZsYW4gcnVsZSBmYWlsZWQsIGVyciglZClcbiIsCi0JCQl2cG9ydC0+dnBvcnQsIGVycik7CisJCWVzd193YXJuKGVzdy0+ZGV2LAorCQkJICJ2cG9ydFslZF0gY29uZmlndXJlIGVncmVzcyBhbGxvd2VkIHZsYW4gcnVsZSBmYWlsZWQsIGVyciglZClcbiIsCisJCQkgdnBvcnQtPnZwb3J0LCBlcnIpOwogCQl2cG9ydC0+ZWdyZXNzLmFsbG93ZWRfdmxhbiA9IE5VTEw7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTE0MzIsOCArMTM0MSw5IEBACiAJCQkJICAgMCwgTlVMTCk7CiAJaWYgKElTX0VSUih2cG9ydC0+ZWdyZXNzLmRyb3BfcnVsZSkpIHsKIAkJZXJyID0gUFRSX0VSUih2cG9ydC0+ZWdyZXNzLmRyb3BfcnVsZSk7Ci0JCXByX3dhcm4oInZwb3J0WyVkXSBjb25maWd1cmUgZWdyZXNzIGRyb3AgcnVsZSBmYWlsZWQsIGVyciglZClcbiIsCi0JCQl2cG9ydC0+dnBvcnQsIGVycik7CisJCWVzd193YXJuKGVzdy0+ZGV2LAorCQkJICJ2cG9ydFslZF0gY29uZmlndXJlIGVncmVzcyBkcm9wIHJ1bGUgZmFpbGVkLCBlcnIoJWQpXG4iLAorCQkJIHZwb3J0LT52cG9ydCwgZXJyKTsKIAkJdnBvcnQtPmVncmVzcy5kcm9wX3J1bGUgPSBOVUxMOwogCX0KIG91dDoKQEAgLTE0NDEsNiArMTM1MSw0MSBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyB2b2lkIG5vZGVfZ3VpZF9nZW5fZnJvbV9tYWModTY0ICpub2RlX2d1aWQsIHU4IG1hY1tFVEhfQUxFTl0pCit7CisJKCh1OCAqKW5vZGVfZ3VpZClbN10gPSBtYWNbMF07CisJKCh1OCAqKW5vZGVfZ3VpZClbNl0gPSBtYWNbMV07CisJKCh1OCAqKW5vZGVfZ3VpZClbNV0gPSBtYWNbMl07CisJKCh1OCAqKW5vZGVfZ3VpZClbNF0gPSAweGZmOworCSgodTggKilub2RlX2d1aWQpWzNdID0gMHhmZTsKKwkoKHU4ICopbm9kZV9ndWlkKVsyXSA9IG1hY1szXTsKKwkoKHU4ICopbm9kZV9ndWlkKVsxXSA9IG1hY1s0XTsKKwkoKHU4ICopbm9kZV9ndWlkKVswXSA9IG1hY1s1XTsKK30KKworc3RhdGljIHZvaWQgZXN3X2FwcGx5X3Zwb3J0X2NvbmYoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAorCQkJCSBzdHJ1Y3QgbWx4NV92cG9ydCAqdnBvcnQpCit7CisJaW50IHZwb3J0X251bSA9IHZwb3J0LT52cG9ydDsKKworCWlmICghdnBvcnRfbnVtKQorCQlyZXR1cm47CisKKwltbHg1X21vZGlmeV92cG9ydF9hZG1pbl9zdGF0ZShlc3ctPmRldiwKKwkJCQkgICAgICBNTFg1X1FVRVJZX1ZQT1JUX1NUQVRFX0lOX09QX01PRF9FU1dfVlBPUlQsCisJCQkJICAgICAgdnBvcnRfbnVtLAorCQkJCSAgICAgIHZwb3J0LT5pbmZvLmxpbmtfc3RhdGUpOworCW1seDVfbW9kaWZ5X25pY192cG9ydF9tYWNfYWRkcmVzcyhlc3ctPmRldiwgdnBvcnRfbnVtLCB2cG9ydC0+aW5mby5tYWMpOworCW1seDVfbW9kaWZ5X25pY192cG9ydF9ub2RlX2d1aWQoZXN3LT5kZXYsIHZwb3J0X251bSwgdnBvcnQtPmluZm8ubm9kZV9ndWlkKTsKKwltb2RpZnlfZXN3X3Zwb3J0X2N2bGFuKGVzdy0+ZGV2LCB2cG9ydF9udW0sIHZwb3J0LT5pbmZvLnZsYW4sIHZwb3J0LT5pbmZvLnFvcywKKwkJCSAgICAgICAodnBvcnQtPmluZm8udmxhbiB8fCB2cG9ydC0+aW5mby5xb3MpKTsKKworCS8qIE9ubHkgbGVnYWN5IG1vZGUgbmVlZHMgQUNMcyAqLworCWlmIChlc3ctPm1vZGUgPT0gU1JJT1ZfTEVHQUNZKSB7CisJCWVzd192cG9ydF9pbmdyZXNzX2NvbmZpZyhlc3csIHZwb3J0KTsKKwkJZXN3X3Zwb3J0X2VncmVzc19jb25maWcoZXN3LCB2cG9ydCk7CisJfQorfQogc3RhdGljIHZvaWQgZXN3X2VuYWJsZV92cG9ydChzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csIGludCB2cG9ydF9udW0sCiAJCQkgICAgIGludCBlbmFibGVfZXZlbnRzKQogewpAQCAtMTQ1MSwyMiArMTM5NiwxNyBAQAogCiAJZXN3X2RlYnVnKGVzdy0+ZGV2LCAiRW5hYmxpbmcgVlBPUlQoJWQpXG4iLCB2cG9ydF9udW0pOwogCi0JaWYgKHZwb3J0X251bSkgeyAvKiBPbmx5IFZGcyBuZWVkIEFDTHMgZm9yIFZTVCBhbmQgc3Bvb2ZjaGsgZmlsdGVyaW5nICovCi0JCWVzd192cG9ydF9pbmdyZXNzX2NvbmZpZyhlc3csIHZwb3J0KTsKLQkJZXN3X3Zwb3J0X2VncmVzc19jb25maWcoZXN3LCB2cG9ydCk7Ci0JfQotCi0JbWx4NV9tb2RpZnlfdnBvcnRfYWRtaW5fc3RhdGUoZXN3LT5kZXYsCi0JCQkJICAgICAgTUxYNV9RVUVSWV9WUE9SVF9TVEFURV9JTl9PUF9NT0RfRVNXX1ZQT1JULAotCQkJCSAgICAgIHZwb3J0X251bSwKLQkJCQkgICAgICBNTFg1X0VTV19WUE9SVF9BRE1JTl9TVEFURV9BVVRPKTsKKwkvKiBSZXN0b3JlIG9sZCB2cG9ydCBjb25maWd1cmF0aW9uICovCisJZXN3X2FwcGx5X3Zwb3J0X2NvbmYoZXN3LCB2cG9ydCk7CiAKIAkvKiBTeW5jIHdpdGggY3VycmVudCB2cG9ydCBjb250ZXh0ICovCiAJdnBvcnQtPmVuYWJsZWRfZXZlbnRzID0gZW5hYmxlX2V2ZW50czsKIAl2cG9ydC0+ZW5hYmxlZCA9IHRydWU7CiAKIAkvKiBvbmx5IFBGIGlzIHRydXN0ZWQgYnkgZGVmYXVsdCAqLwotCXZwb3J0LT50cnVzdGVkID0gKHZwb3J0X251bSkgPyBmYWxzZSA6IHRydWU7CisJaWYgKCF2cG9ydF9udW0pCisJCXZwb3J0LT5pbmZvLnRydXN0ZWQgPSB0cnVlOworCiAJZXN3X3Zwb3J0X2NoYW5nZV9oYW5kbGVfbG9ja2VkKHZwb3J0KTsKIAogCWVzdy0+ZW5hYmxlZF92cG9ydHMrKzsKQEAgLTE0ODYsMTEgKzE0MjYsNiBAQAogCXZwb3J0LT5lbmFibGVkID0gZmFsc2U7CiAKIAlzeW5jaHJvbml6ZV9pcnEobWx4NV9nZXRfbXNpeF92ZWMoZXN3LT5kZXYsIE1MWDVfRVFfVkVDX0FTWU5DKSk7Ci0KLQltbHg1X21vZGlmeV92cG9ydF9hZG1pbl9zdGF0ZShlc3ctPmRldiwKLQkJCQkgICAgICBNTFg1X1FVRVJZX1ZQT1JUX1NUQVRFX0lOX09QX01PRF9FU1dfVlBPUlQsCi0JCQkJICAgICAgdnBvcnRfbnVtLAotCQkJCSAgICAgIE1MWDVfRVNXX1ZQT1JUX0FETUlOX1NUQVRFX0RPV04pOwogCS8qIFdhaXQgZm9yIGN1cnJlbnQgYWxyZWFkeSBzY2hlZHVsZWQgZXZlbnRzIHRvIGNvbXBsZXRlICovCiAJZmx1c2hfd29ya3F1ZXVlKGVzdy0+d29ya19xdWV1ZSk7CiAJLyogRGlzYWJsZSBldmVudHMgZnJvbSB0aGlzIHZwb3J0ICovCkBAIC0xNTAyLDcgKzE0MzcsMTIgQEAKIAkgKi8KIAllc3dfdnBvcnRfY2hhbmdlX2hhbmRsZV9sb2NrZWQodnBvcnQpOwogCXZwb3J0LT5lbmFibGVkX2V2ZW50cyA9IDA7Ci0JaWYgKHZwb3J0X251bSkgeworCisJaWYgKHZwb3J0X251bSAmJiBlc3ctPm1vZGUgPT0gU1JJT1ZfTEVHQUNZKSB7CisJCW1seDVfbW9kaWZ5X3Zwb3J0X2FkbWluX3N0YXRlKGVzdy0+ZGV2LAorCQkJCQkgICAgICBNTFg1X1FVRVJZX1ZQT1JUX1NUQVRFX0lOX09QX01PRF9FU1dfVlBPUlQsCisJCQkJCSAgICAgIHZwb3J0X251bSwKKwkJCQkJICAgICAgTUxYNV9FU1dfVlBPUlRfQURNSU5fU1RBVEVfRE9XTik7CiAJCWVzd192cG9ydF9kaXNhYmxlX2VncmVzc19hY2woZXN3LCB2cG9ydCk7CiAJCWVzd192cG9ydF9kaXNhYmxlX2luZ3Jlc3NfYWNsKGVzdywgdnBvcnQpOwogCX0KQEAgLTE1NTMsNiArMTQ5Myw3IEBACiAKIGFib3J0OgogCWVzd19lbmFibGVfdnBvcnQoZXN3LCAwLCBVQ19BRERSX0NIQU5HRSk7CisJZXN3LT5tb2RlID0gU1JJT1ZfTk9ORTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xNTg4LDYgKzE1MjksMjUgQEAKIAllc3dfZW5hYmxlX3Zwb3J0KGVzdywgMCwgVUNfQUREUl9DSEFOR0UpOwogfQogCit2b2lkIG1seDVfZXN3aXRjaF9hdHRhY2goc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3KQoreworCWlmICghZXN3IHx8ICFNTFg1X0NBUF9HRU4oZXN3LT5kZXYsIHZwb3J0X2dyb3VwX21hbmFnZXIpIHx8CisJICAgIE1MWDVfQ0FQX0dFTihlc3ctPmRldiwgcG9ydF90eXBlKSAhPSBNTFg1X0NBUF9QT1JUX1RZUEVfRVRIKQorCQlyZXR1cm47CisKKwllc3dfZW5hYmxlX3Zwb3J0KGVzdywgMCwgVUNfQUREUl9DSEFOR0UpOworCS8qIFZGIFZwb3J0cyB3aWxsIGJlIGVuYWJsZWQgd2hlbiBTUklPViBpcyBlbmFibGVkICovCit9CisKK3ZvaWQgbWx4NV9lc3dpdGNoX2RldGFjaChzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3cpCit7CisJaWYgKCFlc3cgfHwgIU1MWDVfQ0FQX0dFTihlc3ctPmRldiwgdnBvcnRfZ3JvdXBfbWFuYWdlcikgfHwKKwkgICAgTUxYNV9DQVBfR0VOKGVzdy0+ZGV2LCBwb3J0X3R5cGUpICE9IE1MWDVfQ0FQX1BPUlRfVFlQRV9FVEgpCisJCXJldHVybjsKKworCWVzd19kaXNhYmxlX3Zwb3J0KGVzdywgMCk7Cit9CisKIGludCBtbHg1X2Vzd2l0Y2hfaW5pdChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQogewogCWludCBsMl90YWJsZV9zaXplID0gMSA8PCBNTFg1X0NBUF9HRU4oZGV2LCBsb2dfbWF4X2wyX3RhYmxlKTsKQEAgLTE2NTUsNiArMTYxNSw3IEBACiAJCXN0cnVjdCBtbHg1X3Zwb3J0ICp2cG9ydCA9ICZlc3ctPnZwb3J0c1t2cG9ydF9udW1dOwogCiAJCXZwb3J0LT52cG9ydCA9IHZwb3J0X251bTsKKwkJdnBvcnQtPmluZm8ubGlua19zdGF0ZSA9IE1MWDVfRVNXX1ZQT1JUX0FETUlOX1NUQVRFX0FVVE87CiAJCXZwb3J0LT5kZXYgPSBkZXY7CiAJCUlOSVRfV09SSygmdnBvcnQtPnZwb3J0X2NoYW5nZV9oYW5kbGVyLAogCQkJICBlc3dfdnBvcnRfY2hhbmdlX2hhbmRsZXIpOwpAQCAtMTY2NSw4ICsxNjI2LDYgQEAKIAllc3ctPm1vZGUgPSBTUklPVl9OT05FOwogCiAJZGV2LT5wcml2LmVzd2l0Y2ggPSBlc3c7Ci0JZXN3X2VuYWJsZV92cG9ydChlc3csIDAsIFVDX0FERFJfQ0hBTkdFKTsKLQkvKiBWRiBWcG9ydHMgd2lsbCBiZSBlbmFibGVkIHdoZW4gU1JJT1YgaXMgZW5hYmxlZCAqLwogCXJldHVybiAwOwogYWJvcnQ6CiAJaWYgKGVzdy0+d29ya19xdWV1ZSkKQEAgLTE2ODUsNyArMTY0NCw2IEBACiAJCXJldHVybjsKIAogCWVzd19pbmZvKGVzdy0+ZGV2LCAiY2xlYW51cFxuIik7Ci0JZXN3X2Rpc2FibGVfdnBvcnQoZXN3LCAwKTsKIAogCWVzdy0+ZGV2LT5wcml2LmVzd2l0Y2ggPSBOVUxMOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGVzdy0+d29ya19xdWV1ZSk7CkBAIC0xNzE4LDE4ICsxNjc2LDYgQEAKIAkoZXN3ICYmIE1MWDVfQ0FQX0dFTihlc3ctPmRldiwgdnBvcnRfZ3JvdXBfbWFuYWdlcikgJiYgbWx4NV9jb3JlX2lzX3BmKGVzdy0+ZGV2KSkKICNkZWZpbmUgTEVHQUxfVlBPUlQoZXN3LCB2cG9ydCkgKHZwb3J0ID49IDAgJiYgdnBvcnQgPCBlc3ctPnRvdGFsX3Zwb3J0cykKIAotc3RhdGljIHZvaWQgbm9kZV9ndWlkX2dlbl9mcm9tX21hYyh1NjQgKm5vZGVfZ3VpZCwgdTggbWFjW0VUSF9BTEVOXSkKLXsKLQkoKHU4ICopbm9kZV9ndWlkKVs3XSA9IG1hY1swXTsKLQkoKHU4ICopbm9kZV9ndWlkKVs2XSA9IG1hY1sxXTsKLQkoKHU4ICopbm9kZV9ndWlkKVs1XSA9IG1hY1syXTsKLQkoKHU4ICopbm9kZV9ndWlkKVs0XSA9IDB4ZmY7Ci0JKCh1OCAqKW5vZGVfZ3VpZClbM10gPSAweGZlOwotCSgodTggKilub2RlX2d1aWQpWzJdID0gbWFjWzNdOwotCSgodTggKilub2RlX2d1aWQpWzFdID0gbWFjWzRdOwotCSgodTggKilub2RlX2d1aWQpWzBdID0gbWFjWzVdOwotfQotCiBpbnQgbWx4NV9lc3dpdGNoX3NldF92cG9ydF9tYWMoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAogCQkJICAgICAgIGludCB2cG9ydCwgdTggbWFjW0VUSF9BTEVOXSkKIHsKQEAgLTE3NDIsMTMgKzE2ODgsMTUgQEAKIAlpZiAoIUxFR0FMX1ZQT1JUKGVzdywgdnBvcnQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCW11dGV4X2xvY2soJmVzdy0+c3RhdGVfbG9jayk7CiAJZXZwb3J0ID0gJmVzdy0+dnBvcnRzW3Zwb3J0XTsKIAotCWlmIChldnBvcnQtPnNwb29mY2hrICYmICFpc192YWxpZF9ldGhlcl9hZGRyKG1hYykpIHsKKwlpZiAoZXZwb3J0LT5pbmZvLnNwb29mY2hrICYmICFpc192YWxpZF9ldGhlcl9hZGRyKG1hYykpIHsKIAkJbWx4NV9jb3JlX3dhcm4oZXN3LT5kZXYsCiAJCQkgICAgICAgIk1BQyBpbnZhbGlkYXRpb24gaXMgbm90IGFsbG93ZWQgd2hlbiBzcG9vZmNoayBpcyBvbiwgdnBvcnQoJWQpXG4iLAogCQkJICAgICAgIHZwb3J0KTsKLQkJcmV0dXJuIC1FUEVSTTsKKwkJZXJyID0gLUVQRVJNOworCQlnb3RvIHVubG9jazsKIAl9CiAKIAllcnIgPSBtbHg1X21vZGlmeV9uaWNfdnBvcnRfbWFjX2FkZHJlc3MoZXN3LT5kZXYsIHZwb3J0LCBtYWMpOwpAQCAtMTc1Niw3ICsxNzA0LDcgQEAKIAkJbWx4NV9jb3JlX3dhcm4oZXN3LT5kZXYsCiAJCQkgICAgICAgIkZhaWxlZCB0byBtbHg1X21vZGlmeV9uaWNfdnBvcnRfbWFjIHZwb3J0KCVkKSBlcnI9KCVkKVxuIiwKIAkJCSAgICAgICB2cG9ydCwgZXJyKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byB1bmxvY2s7CiAJfQogCiAJbm9kZV9ndWlkX2dlbl9mcm9tX21hYygmbm9kZV9ndWlkLCBtYWMpOwpAQCAtMTc2Niw5ICsxNzE0LDEyIEBACiAJCQkgICAgICAgIkZhaWxlZCB0byBzZXQgdnBvcnQgJWQgbm9kZSBndWlkLCBlcnIgPSAlZC4gUkRNQV9DTSB3aWxsIG5vdCBmdW5jdGlvbiBwcm9wZXJseSBmb3IgdGhpcyBWRi5cbiIsCiAJCQkgICAgICAgdnBvcnQsIGVycik7CiAKLQltdXRleF9sb2NrKCZlc3ctPnN0YXRlX2xvY2spOwotCWlmIChldnBvcnQtPmVuYWJsZWQpCisJZXRoZXJfYWRkcl9jb3B5KGV2cG9ydC0+aW5mby5tYWMsIG1hYyk7CisJZXZwb3J0LT5pbmZvLm5vZGVfZ3VpZCA9IG5vZGVfZ3VpZDsKKwlpZiAoZXZwb3J0LT5lbmFibGVkICYmIGVzdy0+bW9kZSA9PSBTUklPVl9MRUdBQ1kpCiAJCWVyciA9IGVzd192cG9ydF9pbmdyZXNzX2NvbmZpZyhlc3csIGV2cG9ydCk7CisKK3VubG9jazoKIAltdXRleF91bmxvY2soJmVzdy0+c3RhdGVfbG9jayk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTE3NzYsMjIgKzE3MjcsMzggQEAKIGludCBtbHg1X2Vzd2l0Y2hfc2V0X3Zwb3J0X3N0YXRlKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywKIAkJCQkgaW50IHZwb3J0LCBpbnQgbGlua19zdGF0ZSkKIHsKKwlzdHJ1Y3QgbWx4NV92cG9ydCAqZXZwb3J0OworCWludCBlcnIgPSAwOworCiAJaWYgKCFFU1dfQUxMT1dFRChlc3cpKQogCQlyZXR1cm4gLUVQRVJNOwogCWlmICghTEVHQUxfVlBPUlQoZXN3LCB2cG9ydCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIG1seDVfbW9kaWZ5X3Zwb3J0X2FkbWluX3N0YXRlKGVzdy0+ZGV2LAotCQkJCQkgICAgIE1MWDVfUVVFUllfVlBPUlRfU1RBVEVfSU5fT1BfTU9EX0VTV19WUE9SVCwKLQkJCQkJICAgICB2cG9ydCwgbGlua19zdGF0ZSk7CisJbXV0ZXhfbG9jaygmZXN3LT5zdGF0ZV9sb2NrKTsKKwlldnBvcnQgPSAmZXN3LT52cG9ydHNbdnBvcnRdOworCisJZXJyID0gbWx4NV9tb2RpZnlfdnBvcnRfYWRtaW5fc3RhdGUoZXN3LT5kZXYsCisJCQkJCSAgICBNTFg1X1FVRVJZX1ZQT1JUX1NUQVRFX0lOX09QX01PRF9FU1dfVlBPUlQsCisJCQkJCSAgICB2cG9ydCwgbGlua19zdGF0ZSk7CisJaWYgKGVycikgeworCQltbHg1X2NvcmVfd2Fybihlc3ctPmRldiwKKwkJCSAgICAgICAiRmFpbGVkIHRvIHNldCB2cG9ydCAlZCBsaW5rIHN0YXRlLCBlcnIgPSAlZCIsCisJCQkgICAgICAgdnBvcnQsIGVycik7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWV2cG9ydC0+aW5mby5saW5rX3N0YXRlID0gbGlua19zdGF0ZTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmZXN3LT5zdGF0ZV9sb2NrKTsKKwlyZXR1cm4gMDsKIH0KIAogaW50IG1seDVfZXN3aXRjaF9nZXRfdnBvcnRfY29uZmlnKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywKIAkJCQkgIGludCB2cG9ydCwgc3RydWN0IGlmbGFfdmZfaW5mbyAqaXZpKQogewogCXN0cnVjdCBtbHg1X3Zwb3J0ICpldnBvcnQ7Ci0JdTE2IHZsYW47Ci0JdTggcW9zOwogCiAJaWYgKCFFU1dfQUxMT1dFRChlc3cpKQogCQlyZXR1cm4gLUVQRVJNOwpAQCAtMTgwMyw1NCArMTc3MCw2MSBAQAogCW1lbXNldChpdmksIDAsIHNpemVvZigqaXZpKSk7CiAJaXZpLT52ZiA9IHZwb3J0IC0gMTsKIAotCW1seDVfcXVlcnlfbmljX3Zwb3J0X21hY19hZGRyZXNzKGVzdy0+ZGV2LCB2cG9ydCwgaXZpLT5tYWMpOwotCWl2aS0+bGlua3N0YXRlID0gbWx4NV9xdWVyeV92cG9ydF9hZG1pbl9zdGF0ZShlc3ctPmRldiwKLQkJCQkJCSAgICAgIE1MWDVfUVVFUllfVlBPUlRfU1RBVEVfSU5fT1BfTU9EX0VTV19WUE9SVCwKLQkJCQkJCSAgICAgIHZwb3J0KTsKLQlxdWVyeV9lc3dfdnBvcnRfY3ZsYW4oZXN3LT5kZXYsIHZwb3J0LCAmdmxhbiwgJnFvcyk7Ci0JaXZpLT52bGFuID0gdmxhbjsKLQlpdmktPnFvcyA9IHFvczsKLQlpdmktPnNwb29mY2hrID0gZXZwb3J0LT5zcG9vZmNoazsKKwltdXRleF9sb2NrKCZlc3ctPnN0YXRlX2xvY2spOworCWV0aGVyX2FkZHJfY29weShpdmktPm1hYywgZXZwb3J0LT5pbmZvLm1hYyk7CisJaXZpLT5saW5rc3RhdGUgPSBldnBvcnQtPmluZm8ubGlua19zdGF0ZTsKKwlpdmktPnZsYW4gPSBldnBvcnQtPmluZm8udmxhbjsKKwlpdmktPnFvcyA9IGV2cG9ydC0+aW5mby5xb3M7CisJaXZpLT5zcG9vZmNoayA9IGV2cG9ydC0+aW5mby5zcG9vZmNoazsKKwlpdmktPnRydXN0ZWQgPSBldnBvcnQtPmluZm8udHJ1c3RlZDsKKwltdXRleF91bmxvY2soJmVzdy0+c3RhdGVfbG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KIAotaW50IG1seDVfZXN3aXRjaF9zZXRfdnBvcnRfdmxhbihzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCi0JCQkJaW50IHZwb3J0LCB1MTYgdmxhbiwgdTggcW9zKQoraW50IF9fbWx4NV9lc3dpdGNoX3NldF92cG9ydF92bGFuKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywKKwkJCQkgIGludCB2cG9ydCwgdTE2IHZsYW4sIHU4IHFvcywgdTggc2V0X2ZsYWdzKQogewogCXN0cnVjdCBtbHg1X3Zwb3J0ICpldnBvcnQ7CiAJaW50IGVyciA9IDA7Ci0JaW50IHNldCA9IDA7CiAKIAlpZiAoIUVTV19BTExPV0VEKGVzdykpCiAJCXJldHVybiAtRVBFUk07CiAJaWYgKCFMRUdBTF9WUE9SVChlc3csIHZwb3J0KSB8fCAodmxhbiA+IDQwOTUpIHx8IChxb3MgPiA3KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAodmxhbiB8fCBxb3MpCi0JCXNldCA9IDE7Ci0KKwltdXRleF9sb2NrKCZlc3ctPnN0YXRlX2xvY2spOwogCWV2cG9ydCA9ICZlc3ctPnZwb3J0c1t2cG9ydF07CiAKLQllcnIgPSBtb2RpZnlfZXN3X3Zwb3J0X2N2bGFuKGVzdy0+ZGV2LCB2cG9ydCwgdmxhbiwgcW9zLCBzZXQpOworCWVyciA9IG1vZGlmeV9lc3dfdnBvcnRfY3ZsYW4oZXN3LT5kZXYsIHZwb3J0LCB2bGFuLCBxb3MsIHNldF9mbGFncyk7CiAJaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwkJZ290byB1bmxvY2s7CiAKLQltdXRleF9sb2NrKCZlc3ctPnN0YXRlX2xvY2spOwotCWV2cG9ydC0+dmxhbiA9IHZsYW47Ci0JZXZwb3J0LT5xb3MgPSBxb3M7Ci0JaWYgKGV2cG9ydC0+ZW5hYmxlZCkgeworCWV2cG9ydC0+aW5mby52bGFuID0gdmxhbjsKKwlldnBvcnQtPmluZm8ucW9zID0gcW9zOworCWlmIChldnBvcnQtPmVuYWJsZWQgJiYgZXN3LT5tb2RlID09IFNSSU9WX0xFR0FDWSkgewogCQllcnIgPSBlc3dfdnBvcnRfaW5ncmVzc19jb25maWcoZXN3LCBldnBvcnQpOwogCQlpZiAoZXJyKQotCQkJZ290byBvdXQ7CisJCQlnb3RvIHVubG9jazsKIAkJZXJyID0gZXN3X3Zwb3J0X2VncmVzc19jb25maWcoZXN3LCBldnBvcnQpOwogCX0KIAotb3V0OgordW5sb2NrOgogCW11dGV4X3VubG9jaygmZXN3LT5zdGF0ZV9sb2NrKTsKIAlyZXR1cm4gZXJyOwogfQogCitpbnQgbWx4NV9lc3dpdGNoX3NldF92cG9ydF92bGFuKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywKKwkJCQlpbnQgdnBvcnQsIHUxNiB2bGFuLCB1OCBxb3MpCit7CisJdTggc2V0X2ZsYWdzID0gMDsKKworCWlmICh2bGFuIHx8IHFvcykKKwkJc2V0X2ZsYWdzID0gU0VUX1ZMQU5fU1RSSVAgfCBTRVRfVkxBTl9JTlNFUlQ7CisKKwlyZXR1cm4gX19tbHg1X2Vzd2l0Y2hfc2V0X3Zwb3J0X3ZsYW4oZXN3LCB2cG9ydCwgdmxhbiwgcW9zLCBzZXRfZmxhZ3MpOworfQorCiBpbnQgbWx4NV9lc3dpdGNoX3NldF92cG9ydF9zcG9vZmNoayhzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCiAJCQkJICAgIGludCB2cG9ydCwgYm9vbCBzcG9vZmNoaykKIHsKQEAgLTE4NjMsMTUgKzE4MzcsMTQgQEAKIAlpZiAoIUxFR0FMX1ZQT1JUKGVzdywgdnBvcnQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWV2cG9ydCA9ICZlc3ctPnZwb3J0c1t2cG9ydF07Ci0KIAltdXRleF9sb2NrKCZlc3ctPnN0YXRlX2xvY2spOwotCXBzY2hrID0gZXZwb3J0LT5zcG9vZmNoazsKLQlldnBvcnQtPnNwb29mY2hrID0gc3Bvb2ZjaGs7Ci0JaWYgKGV2cG9ydC0+ZW5hYmxlZCkKKwlldnBvcnQgPSAmZXN3LT52cG9ydHNbdnBvcnRdOworCXBzY2hrID0gZXZwb3J0LT5pbmZvLnNwb29mY2hrOworCWV2cG9ydC0+aW5mby5zcG9vZmNoayA9IHNwb29mY2hrOworCWlmIChldnBvcnQtPmVuYWJsZWQgJiYgZXN3LT5tb2RlID09IFNSSU9WX0xFR0FDWSkKIAkJZXJyID0gZXN3X3Zwb3J0X2luZ3Jlc3NfY29uZmlnKGVzdywgZXZwb3J0KTsKIAlpZiAoZXJyKQotCQlldnBvcnQtPnNwb29mY2hrID0gcHNjaGs7CisJCWV2cG9ydC0+aW5mby5zcG9vZmNoayA9IHBzY2hrOwogCW11dGV4X3VubG9jaygmZXN3LT5zdGF0ZV9sb2NrKTsKIAogCXJldHVybiBlcnI7CkBAIC0xODg3LDEwICsxODYwLDkgQEAKIAlpZiAoIUxFR0FMX1ZQT1JUKGVzdywgdnBvcnQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWV2cG9ydCA9ICZlc3ctPnZwb3J0c1t2cG9ydF07Ci0KIAltdXRleF9sb2NrKCZlc3ctPnN0YXRlX2xvY2spOwotCWV2cG9ydC0+dHJ1c3RlZCA9IHNldHRpbmc7CisJZXZwb3J0ID0gJmVzdy0+dnBvcnRzW3Zwb3J0XTsKKwlldnBvcnQtPmluZm8udHJ1c3RlZCA9IHNldHRpbmc7CiAJaWYgKGV2cG9ydC0+ZW5hYmxlZCkKIAkJZXN3X3Zwb3J0X2NoYW5nZV9oYW5kbGVfbG9ja2VkKGV2cG9ydCk7CiAJbXV0ZXhfdW5sb2NrKCZlc3ctPnN0YXRlX2xvY2spOwpAQCAtMTkwMyw3ICsxODc1LDcgQEAKIAkJCQkgc3RydWN0IGlmbGFfdmZfc3RhdHMgKnZmX3N0YXRzKQogewogCWludCBvdXRsZW4gPSBNTFg1X1NUX1NaX0JZVEVTKHF1ZXJ5X3Zwb3J0X2NvdW50ZXJfb3V0KTsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV92cG9ydF9jb3VudGVyX2luKV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfdnBvcnRfY291bnRlcl9pbildID0gezB9OwogCWludCBlcnIgPSAwOwogCXUzMiAqb3V0OwogCkBAIC0xOTE2LDggKzE4ODgsNiBAQAogCWlmICghb3V0KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0KIAlNTFg1X1NFVChxdWVyeV92cG9ydF9jb3VudGVyX2luLCBpbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfUVVFUllfVlBPUlRfQ09VTlRFUik7CiAJTUxYNV9TRVQocXVlcnlfdnBvcnRfY291bnRlcl9pbiwgaW4sIG9wX21vZCwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXN3aXRjaC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2Vzd2l0Y2guaAppbmRleCBjMGIwNTYwLi4yZTI5MzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXN3aXRjaC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lc3dpdGNoLmgKQEAgLTEwOSw2ICsxMDksMTYgQEAKIAlzdHJ1Y3QgbWx4NV9mbG93X3J1bGUgICpkcm9wX3J1bGU7CiB9OwogCitzdHJ1Y3QgbWx4NV92cG9ydF9pbmZvIHsKKwl1OCAgICAgICAgICAgICAgICAgICAgICBtYWNbRVRIX0FMRU5dOworCXUxNiAgICAgICAgICAgICAgICAgICAgIHZsYW47CisJdTggICAgICAgICAgICAgICAgICAgICAgcW9zOworCXU2NCAgICAgICAgICAgICAgICAgICAgIG5vZGVfZ3VpZDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBsaW5rX3N0YXRlOworCWJvb2wgICAgICAgICAgICAgICAgICAgIHNwb29mY2hrOworCWJvb2wgICAgICAgICAgICAgICAgICAgIHRydXN0ZWQ7Cit9OworCiBzdHJ1Y3QgbWx4NV92cG9ydCB7CiAJc3RydWN0IG1seDVfY29yZV9kZXYgICAgKmRldjsKIAlpbnQgICAgICAgICAgICAgICAgICAgICB2cG9ydDsKQEAgLTEyMSwxMCArMTMxLDggQEAKIAlzdHJ1Y3QgdnBvcnRfaW5ncmVzcyAgICBpbmdyZXNzOwogCXN0cnVjdCB2cG9ydF9lZ3Jlc3MgICAgIGVncmVzczsKIAotCXUxNiAgICAgICAgICAgICAgICAgICAgIHZsYW47Ci0JdTggICAgICAgICAgICAgICAgICAgICAgcW9zOwotCWJvb2wgICAgICAgICAgICAgICAgICAgIHNwb29mY2hrOwotCWJvb2wgICAgICAgICAgICAgICAgICAgIHRydXN0ZWQ7CisJc3RydWN0IG1seDVfdnBvcnRfaW5mbyAgaW5mbzsKKwogCWJvb2wgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ7CiAJdTE2ICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZF9ldmVudHM7CiB9OwpAQCAtMTQ5LDYgKzE1Nyw3IEBACiAJCQlzdHJ1Y3QgbWx4NV9mbG93X2dyb3VwICpzZW5kX3RvX3Zwb3J0X2dycDsKIAkJCXN0cnVjdCBtbHg1X2Zsb3dfZ3JvdXAgKm1pc3NfZ3JwOwogCQkJc3RydWN0IG1seDVfZmxvd19ydWxlICAqbWlzc19ydWxlOworCQkJaW50IHZsYW5fcHVzaF9wb3BfcmVmY291bnQ7CiAJCX0gb2ZmbG9hZHM7CiAJfTsKIH07CkBAIC0xNzAsOSArMTc5LDEzIEBACiAJdm9pZAkJICAgICAgICgqdW5sb2FkKShzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCiAJCQkJCSBzdHJ1Y3QgbWx4NV9lc3dpdGNoX3JlcCAqcmVwKTsKIAl1MTYJCSAgICAgICB2cG9ydDsKLQlzdHJ1Y3QgbWx4NV9mbG93X3J1bGUgKnZwb3J0X3J4X3J1bGU7CisJdTgJCSAgICAgICBod19pZFtFVEhfQUxFTl07CiAJdm9pZAkJICAgICAgKnByaXZfZGF0YTsKKworCXN0cnVjdCBtbHg1X2Zsb3dfcnVsZSAqdnBvcnRfcnhfcnVsZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgIHZwb3J0X3Nxc19saXN0OworCXUxNgkJICAgICAgIHZsYW47CisJdTMyCQkgICAgICAgdmxhbl9yZWZjb3VudDsKIAlib29sCQkgICAgICAgdmFsaWQ7CiB9OwogCkBAIC0yMDAsOSArMjEzLDE0IEBACiAJaW50ICAgICAgICAgICAgICAgICAgICAgbW9kZTsKIH07CiAKK3ZvaWQgZXN3X29mZmxvYWRzX2NsZWFudXAoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LCBpbnQgbnZwb3J0cyk7CitpbnQgZXN3X29mZmxvYWRzX2luaXQoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LCBpbnQgbnZwb3J0cyk7CisKIC8qIEUtU3dpdGNoIEFQSSAqLwogaW50IG1seDVfZXN3aXRjaF9pbml0KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwogdm9pZCBtbHg1X2Vzd2l0Y2hfY2xlYW51cChzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3cpOwordm9pZCBtbHg1X2Vzd2l0Y2hfYXR0YWNoKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdyk7Cit2b2lkIG1seDVfZXN3aXRjaF9kZXRhY2goc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3KTsKIHZvaWQgbWx4NV9lc3dpdGNoX3Zwb3J0X2V2ZW50KHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywgc3RydWN0IG1seDVfZXFlICplcWUpOwogaW50IG1seDVfZXN3aXRjaF9lbmFibGVfc3Jpb3Yoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LCBpbnQgbnZmcywgaW50IG1vZGUpOwogdm9pZCBtbHg1X2Vzd2l0Y2hfZGlzYWJsZV9zcmlvdihzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3cpOwpAQCAtMjIzLDE0ICsyNDEsMzIgQEAKIAkJCQkgc3RydWN0IGlmbGFfdmZfc3RhdHMgKnZmX3N0YXRzKTsKIAogc3RydWN0IG1seDVfZmxvd19zcGVjOworc3RydWN0IG1seDVfZXN3X2Zsb3dfYXR0cjsKIAogc3RydWN0IG1seDVfZmxvd19ydWxlICoKIG1seDVfZXN3aXRjaF9hZGRfb2ZmbG9hZGVkX3J1bGUoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAogCQkJCXN0cnVjdCBtbHg1X2Zsb3dfc3BlYyAqc3BlYywKLQkJCQl1MzIgYWN0aW9uLCB1MzIgc3JjX3Zwb3J0LCB1MzIgZHN0X3Zwb3J0KTsKKwkJCQlzdHJ1Y3QgbWx4NV9lc3dfZmxvd19hdHRyICphdHRyKTsKIHN0cnVjdCBtbHg1X2Zsb3dfcnVsZSAqCiBtbHg1X2Vzd2l0Y2hfY3JlYXRlX3Zwb3J0X3J4X3J1bGUoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LCBpbnQgdnBvcnQsIHUzMiB0aXJuKTsKIAorZW51bSB7CisJU0VUX1ZMQU5fU1RSSVAJPSBCSVQoMCksCisJU0VUX1ZMQU5fSU5TRVJUCT0gQklUKDEpCit9OworCisjZGVmaW5lIE1MWDVfRkxPV19DT05URVhUX0FDVElPTl9WTEFOX1BPUCAgMHg0MAorI2RlZmluZSBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fVkxBTl9QVVNIIDB4ODAKKworc3RydWN0IG1seDVfZXN3X2Zsb3dfYXR0ciB7CisJc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKmluX3JlcDsKKwlzdHJ1Y3QgbWx4NV9lc3dpdGNoX3JlcCAqb3V0X3JlcDsKKworCWludAlhY3Rpb247CisJdTE2CXZsYW47CisJYm9vbAl2bGFuX2hhbmRsZWQ7Cit9OworCiBpbnQgbWx4NV9lc3dpdGNoX3NxczJ2cG9ydF9zdGFydChzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCiAJCQkJIHN0cnVjdCBtbHg1X2Vzd2l0Y2hfcmVwICpyZXAsCiAJCQkJIHUxNiAqc3Fuc19hcnJheSwgaW50IHNxbnNfbnVtKTsKQEAgLTI0MCw5ICsyNzYsMTcgQEAKIGludCBtbHg1X2RldmxpbmtfZXN3aXRjaF9tb2RlX3NldChzdHJ1Y3QgZGV2bGluayAqZGV2bGluaywgdTE2IG1vZGUpOwogaW50IG1seDVfZGV2bGlua19lc3dpdGNoX21vZGVfZ2V0KHN0cnVjdCBkZXZsaW5rICpkZXZsaW5rLCB1MTYgKm1vZGUpOwogdm9pZCBtbHg1X2Vzd2l0Y2hfcmVnaXN0ZXJfdnBvcnRfcmVwKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywKKwkJCQkgICAgIGludCB2cG9ydF9pbmRleCwKIAkJCQkgICAgIHN0cnVjdCBtbHg1X2Vzd2l0Y2hfcmVwICpyZXApOwogdm9pZCBtbHg1X2Vzd2l0Y2hfdW5yZWdpc3Rlcl92cG9ydF9yZXAoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAotCQkJCSAgICAgICBpbnQgdnBvcnQpOworCQkJCSAgICAgICBpbnQgdnBvcnRfaW5kZXgpOworCitpbnQgbWx4NV9lc3dpdGNoX2FkZF92bGFuX2FjdGlvbihzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCisJCQkJIHN0cnVjdCBtbHg1X2Vzd19mbG93X2F0dHIgKmF0dHIpOworaW50IG1seDVfZXN3aXRjaF9kZWxfdmxhbl9hY3Rpb24oc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAorCQkJCSBzdHJ1Y3QgbWx4NV9lc3dfZmxvd19hdHRyICphdHRyKTsKK2ludCBfX21seDVfZXN3aXRjaF9zZXRfdnBvcnRfdmxhbihzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCisJCQkJICBpbnQgdnBvcnQsIHUxNiB2bGFuLCB1OCBxb3MsIHU4IHNldF9mbGFncyk7CiAKICNkZWZpbmUgTUxYNV9ERUJVR19FU1dJVENIX01BU0sgQklUKDMpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lc3dpdGNoX29mZmxvYWRzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXN3aXRjaF9vZmZsb2Fkcy5jCmluZGV4IGEzNTdlOGUuLmM1NWFkOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lc3dpdGNoX29mZmxvYWRzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2Vzd2l0Y2hfb2ZmbG9hZHMuYwpAQCAtNDYsMTkgKzQ2LDIyIEBACiBzdHJ1Y3QgbWx4NV9mbG93X3J1bGUgKgogbWx4NV9lc3dpdGNoX2FkZF9vZmZsb2FkZWRfcnVsZShzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCiAJCQkJc3RydWN0IG1seDVfZmxvd19zcGVjICpzcGVjLAotCQkJCXUzMiBhY3Rpb24sIHUzMiBzcmNfdnBvcnQsIHUzMiBkc3RfdnBvcnQpCisJCQkJc3RydWN0IG1seDVfZXN3X2Zsb3dfYXR0ciAqYXR0cikKIHsKIAlzdHJ1Y3QgbWx4NV9mbG93X2Rlc3RpbmF0aW9uIGRlc3QgPSB7IDAgfTsKIAlzdHJ1Y3QgbWx4NV9mYyAqY291bnRlciA9IE5VTEw7CiAJc3RydWN0IG1seDVfZmxvd19ydWxlICpydWxlOwogCXZvaWQgKm1pc2M7CisJaW50IGFjdGlvbjsKIAogCWlmIChlc3ctPm1vZGUgIT0gU1JJT1ZfT0ZGTE9BRFMpCiAJCXJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTsKIAorCWFjdGlvbiA9IGF0dHItPmFjdGlvbjsKKwogCWlmIChhY3Rpb24gJiBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fRldEX0RFU1QpIHsKIAkJZGVzdC50eXBlID0gTUxYNV9GTE9XX0RFU1RJTkFUSU9OX1RZUEVfVlBPUlQ7Ci0JCWRlc3QudnBvcnRfbnVtID0gZHN0X3Zwb3J0OworCQlkZXN0LnZwb3J0X251bSA9IGF0dHItPm91dF9yZXAtPnZwb3J0OwogCQlhY3Rpb24gPSBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fRldEX0RFU1Q7CiAJfSBlbHNlIGlmIChhY3Rpb24gJiBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fQ09VTlQpIHsKIAkJY291bnRlciA9IG1seDVfZmNfY3JlYXRlKGVzdy0+ZGV2LCB0cnVlKTsKQEAgLTY5LDcgKzcyLDcgQEAKIAl9CiAKIAltaXNjID0gTUxYNV9BRERSX09GKGZ0ZV9tYXRjaF9wYXJhbSwgc3BlYy0+bWF0Y2hfdmFsdWUsIG1pc2NfcGFyYW1ldGVycyk7Ci0JTUxYNV9TRVQoZnRlX21hdGNoX3NldF9taXNjLCBtaXNjLCBzb3VyY2VfcG9ydCwgc3JjX3Zwb3J0KTsKKwlNTFg1X1NFVChmdGVfbWF0Y2hfc2V0X21pc2MsIG1pc2MsIHNvdXJjZV9wb3J0LCBhdHRyLT5pbl9yZXAtPnZwb3J0KTsKIAogCW1pc2MgPSBNTFg1X0FERFJfT0YoZnRlX21hdGNoX3BhcmFtLCBzcGVjLT5tYXRjaF9jcml0ZXJpYSwgbWlzY19wYXJhbWV0ZXJzKTsKIAlNTFg1X1NFVF9UT19PTkVTKGZ0ZV9tYXRjaF9zZXRfbWlzYywgbWlzYywgc291cmNlX3BvcnQpOwpAQCAtODYsNiArODksMTg2IEBACiAJcmV0dXJuIHJ1bGU7CiB9CiAKK3N0YXRpYyBpbnQgZXN3X3NldF9nbG9iYWxfdmxhbl9wb3Aoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LCB1OCB2YWwpCit7CisJc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKnJlcDsKKwlpbnQgdmZfdnBvcnQsIGVyciA9IDA7CisKKwllc3dfZGVidWcoZXN3LT5kZXYsICIlcyBhcHBseWluZyBnbG9iYWwgJXMgcG9saWN5XG4iLCBfX2Z1bmNfXywgdmFsID8gInBvcCIgOiAibm9uZSIpOworCWZvciAodmZfdnBvcnQgPSAxOyB2Zl92cG9ydCA8IGVzdy0+ZW5hYmxlZF92cG9ydHM7IHZmX3Zwb3J0KyspIHsKKwkJcmVwID0gJmVzdy0+b2ZmbG9hZHMudnBvcnRfcmVwc1t2Zl92cG9ydF07CisJCWlmICghcmVwLT52YWxpZCkKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IF9fbWx4NV9lc3dpdGNoX3NldF92cG9ydF92bGFuKGVzdywgcmVwLT52cG9ydCwgMCwgMCwgdmFsKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWx4NV9lc3dpdGNoX3JlcCAqCitlc3dfdmxhbl9hY3Rpb25fZ2V0X3Zwb3J0KHN0cnVjdCBtbHg1X2Vzd19mbG93X2F0dHIgKmF0dHIsIGJvb2wgcHVzaCwgYm9vbCBwb3ApCit7CisJc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKmluX3JlcCwgKm91dF9yZXAsICp2cG9ydCA9IE5VTEw7CisKKwlpbl9yZXAgID0gYXR0ci0+aW5fcmVwOworCW91dF9yZXAgPSBhdHRyLT5vdXRfcmVwOworCisJaWYgKHB1c2gpCisJCXZwb3J0ID0gaW5fcmVwOworCWVsc2UgaWYgKHBvcCkKKwkJdnBvcnQgPSBvdXRfcmVwOworCWVsc2UKKwkJdnBvcnQgPSBpbl9yZXA7CisKKwlyZXR1cm4gdnBvcnQ7Cit9CisKK3N0YXRpYyBpbnQgZXN3X2FkZF92bGFuX2FjdGlvbl9jaGVjayhzdHJ1Y3QgbWx4NV9lc3dfZmxvd19hdHRyICphdHRyLAorCQkJCSAgICAgYm9vbCBwdXNoLCBib29sIHBvcCwgYm9vbCBmd2QpCit7CisJc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKmluX3JlcCwgKm91dF9yZXA7CisKKwlpZiAoKHB1c2ggfHwgcG9wKSAmJiAhZndkKQorCQlnb3RvIG91dF9ub3RzdXBwOworCisJaW5fcmVwICA9IGF0dHItPmluX3JlcDsKKwlvdXRfcmVwID0gYXR0ci0+b3V0X3JlcDsKKworCWlmIChwdXNoICYmIGluX3JlcC0+dnBvcnQgPT0gRkRCX1VQTElOS19WUE9SVCkKKwkJZ290byBvdXRfbm90c3VwcDsKKworCWlmIChwb3AgJiYgb3V0X3JlcC0+dnBvcnQgPT0gRkRCX1VQTElOS19WUE9SVCkKKwkJZ290byBvdXRfbm90c3VwcDsKKworCS8qIHZwb3J0IGhhcyB2bGFuIHB1c2ggY29uZmlndXJlZCwgY2FuJ3Qgb2ZmbG9hZCBWRiAtLT4gd2lyZSBydWxlcyB3Lm8gaXQgKi8KKwlpZiAoIXB1c2ggJiYgIXBvcCAmJiBmd2QpCisJCWlmIChpbl9yZXAtPnZsYW4gJiYgb3V0X3JlcC0+dnBvcnQgPT0gRkRCX1VQTElOS19WUE9SVCkKKwkJCWdvdG8gb3V0X25vdHN1cHA7CisKKwkvKiBwcm90ZWN0cyBhZ2FpbnN0ICgxKSBzZXR0aW5nIHJ1bGVzIHdpdGggZGlmZmVyZW50IHZsYW5zIHRvIHB1c2ggYW5kCisJICogKDIpIHNldHRpbmcgcnVsZXMgdy5vIHZsYW5zIChhdHRyLT52bGFuID0gMCkgJiYgdy4gdmxhbnMgdG8gcHVzaCAoIT0gMCkKKwkgKi8KKwlpZiAocHVzaCAmJiBpbl9yZXAtPnZsYW5fcmVmY291bnQgJiYgKGluX3JlcC0+dmxhbiAhPSBhdHRyLT52bGFuKSkKKwkJZ290byBvdXRfbm90c3VwcDsKKworCXJldHVybiAwOworCitvdXRfbm90c3VwcDoKKwlyZXR1cm4gLUVOT1RTVVBQOworfQorCitpbnQgbWx4NV9lc3dpdGNoX2FkZF92bGFuX2FjdGlvbihzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCisJCQkJIHN0cnVjdCBtbHg1X2Vzd19mbG93X2F0dHIgKmF0dHIpCit7CisJc3RydWN0IG9mZmxvYWRzX2ZkYiAqb2ZmbG9hZHMgPSAmZXN3LT5mZGJfdGFibGUub2ZmbG9hZHM7CisJc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKnZwb3J0ID0gTlVMTDsKKwlib29sIHB1c2gsIHBvcCwgZndkOworCWludCBlcnIgPSAwOworCisJcHVzaCA9ICEhKGF0dHItPmFjdGlvbiAmIE1MWDVfRkxPV19DT05URVhUX0FDVElPTl9WTEFOX1BVU0gpOworCXBvcCAgPSAhIShhdHRyLT5hY3Rpb24gJiBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fVkxBTl9QT1ApOworCWZ3ZCAgPSAhIShhdHRyLT5hY3Rpb24gJiBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fRldEX0RFU1QpOworCisJZXJyID0gZXN3X2FkZF92bGFuX2FjdGlvbl9jaGVjayhhdHRyLCBwdXNoLCBwb3AsIGZ3ZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWF0dHItPnZsYW5faGFuZGxlZCA9IGZhbHNlOworCisJdnBvcnQgPSBlc3dfdmxhbl9hY3Rpb25fZ2V0X3Zwb3J0KGF0dHIsIHB1c2gsIHBvcCk7CisKKwlpZiAoIXB1c2ggJiYgIXBvcCAmJiBmd2QpIHsKKwkJLyogdHJhY2tzIFZGIC0tPiB3aXJlIHJ1bGVzIHdpdGhvdXQgdmxhbiBwdXNoIGFjdGlvbiAqLworCQlpZiAoYXR0ci0+b3V0X3JlcC0+dnBvcnQgPT0gRkRCX1VQTElOS19WUE9SVCkgeworCQkJdnBvcnQtPnZsYW5fcmVmY291bnQrKzsKKwkJCWF0dHItPnZsYW5faGFuZGxlZCA9IHRydWU7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXB1c2ggJiYgIXBvcCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShvZmZsb2Fkcy0+dmxhbl9wdXNoX3BvcF9yZWZjb3VudCkpIHsKKwkJLyogaXQncyB0aGUgMXN0IHZsYW4gcnVsZSwgYXBwbHkgZ2xvYmFsIHZsYW4gcG9wIHBvbGljeSAqLworCQllcnIgPSBlc3dfc2V0X2dsb2JhbF92bGFuX3BvcChlc3csIFNFVF9WTEFOX1NUUklQKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKwlvZmZsb2Fkcy0+dmxhbl9wdXNoX3BvcF9yZWZjb3VudCsrOworCisJaWYgKHB1c2gpIHsKKwkJaWYgKHZwb3J0LT52bGFuX3JlZmNvdW50KQorCQkJZ290byBza2lwX3NldF9wdXNoOworCisJCWVyciA9IF9fbWx4NV9lc3dpdGNoX3NldF92cG9ydF92bGFuKGVzdywgdnBvcnQtPnZwb3J0LCBhdHRyLT52bGFuLCAwLAorCQkJCQkJICAgIFNFVF9WTEFOX0lOU0VSVCB8IFNFVF9WTEFOX1NUUklQKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQl2cG9ydC0+dmxhbiA9IGF0dHItPnZsYW47Citza2lwX3NldF9wdXNoOgorCQl2cG9ydC0+dmxhbl9yZWZjb3VudCsrOworCX0KK291dDoKKwlpZiAoIWVycikKKwkJYXR0ci0+dmxhbl9oYW5kbGVkID0gdHJ1ZTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgbWx4NV9lc3dpdGNoX2RlbF92bGFuX2FjdGlvbihzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCisJCQkJIHN0cnVjdCBtbHg1X2Vzd19mbG93X2F0dHIgKmF0dHIpCit7CisJc3RydWN0IG9mZmxvYWRzX2ZkYiAqb2ZmbG9hZHMgPSAmZXN3LT5mZGJfdGFibGUub2ZmbG9hZHM7CisJc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKnZwb3J0ID0gTlVMTDsKKwlib29sIHB1c2gsIHBvcCwgZndkOworCWludCBlcnIgPSAwOworCisJaWYgKCFhdHRyLT52bGFuX2hhbmRsZWQpCisJCXJldHVybiAwOworCisJcHVzaCA9ICEhKGF0dHItPmFjdGlvbiAmIE1MWDVfRkxPV19DT05URVhUX0FDVElPTl9WTEFOX1BVU0gpOworCXBvcCAgPSAhIShhdHRyLT5hY3Rpb24gJiBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fVkxBTl9QT1ApOworCWZ3ZCAgPSAhIShhdHRyLT5hY3Rpb24gJiBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fRldEX0RFU1QpOworCisJdnBvcnQgPSBlc3dfdmxhbl9hY3Rpb25fZ2V0X3Zwb3J0KGF0dHIsIHB1c2gsIHBvcCk7CisKKwlpZiAoIXB1c2ggJiYgIXBvcCAmJiBmd2QpIHsKKwkJLyogdHJhY2tzIFZGIC0tPiB3aXJlIHJ1bGVzIHdpdGhvdXQgdmxhbiBwdXNoIGFjdGlvbiAqLworCQlpZiAoYXR0ci0+b3V0X3JlcC0+dnBvcnQgPT0gRkRCX1VQTElOS19WUE9SVCkKKwkJCXZwb3J0LT52bGFuX3JlZmNvdW50LS07CisKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHB1c2gpIHsKKwkJdnBvcnQtPnZsYW5fcmVmY291bnQtLTsKKwkJaWYgKHZwb3J0LT52bGFuX3JlZmNvdW50KQorCQkJZ290byBza2lwX3Vuc2V0X3B1c2g7CisKKwkJdnBvcnQtPnZsYW4gPSAwOworCQllcnIgPSBfX21seDVfZXN3aXRjaF9zZXRfdnBvcnRfdmxhbihlc3csIHZwb3J0LT52cG9ydCwKKwkJCQkJCSAgICAwLCAwLCBTRVRfVkxBTl9TVFJJUCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwl9CisKK3NraXBfdW5zZXRfcHVzaDoKKwlvZmZsb2Fkcy0+dmxhbl9wdXNoX3BvcF9yZWZjb3VudC0tOworCWlmIChvZmZsb2Fkcy0+dmxhbl9wdXNoX3BvcF9yZWZjb3VudCkKKwkJcmV0dXJuIDA7CisKKwkvKiBubyBtb3JlIHZsYW4gcnVsZXMsIHN0b3AgZ2xvYmFsIHZsYW4gcG9wIHBvbGljeSAqLworCWVyciA9IGVzd19zZXRfZ2xvYmFsX3ZsYW5fcG9wKGVzdywgMCk7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgc3RydWN0IG1seDVfZmxvd19ydWxlICoKIG1seDVfZXN3aXRjaF9hZGRfc2VuZF90b192cG9ydF9ydWxlKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywgaW50IHZwb3J0LCB1MzIgc3FuKQogewpAQCAtMTEzLDcgKzI5Niw3IEBACiAJZGVzdC50eXBlID0gTUxYNV9GTE9XX0RFU1RJTkFUSU9OX1RZUEVfVlBPUlQ7CiAJZGVzdC52cG9ydF9udW0gPSB2cG9ydDsKIAotCWZsb3dfcnVsZSA9IG1seDVfYWRkX2Zsb3dfcnVsZShlc3ctPmZkYl90YWJsZS5mZGIsIHNwZWMsCisJZmxvd19ydWxlID0gbWx4NV9hZGRfZmxvd19ydWxlKGVzdy0+ZmRiX3RhYmxlLm9mZmxvYWRzLmZkYiwgc3BlYywKIAkJCQkgICAgICAgTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0ZXRF9ERVNULAogCQkJCSAgICAgICAwLCAmZGVzdCk7CiAJaWYgKElTX0VSUihmbG93X3J1bGUpKQpAQCAtMTQ0LDE2ICszMjcsMTIgQEAKIHsKIAlzdHJ1Y3QgbWx4NV9mbG93X3J1bGUgKmZsb3dfcnVsZTsKIAlzdHJ1Y3QgbWx4NV9lc3dfc3EgKmVzd19zcTsKLQlpbnQgdnBvcnQ7CiAJaW50IGVycjsKIAlpbnQgaTsKIAogCWlmIChlc3ctPm1vZGUgIT0gU1JJT1ZfT0ZGTE9BRFMpCiAJCXJldHVybiAwOwogCi0JdnBvcnQgPSByZXAtPnZwb3J0ID09IDAgPwotCQlGREJfVVBMSU5LX1ZQT1JUIDogcmVwLT52cG9ydDsKLQogCWZvciAoaSA9IDA7IGkgPCBzcW5zX251bTsgaSsrKSB7CiAJCWVzd19zcSA9IGt6YWxsb2Moc2l6ZW9mKCplc3dfc3EpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFlc3dfc3EpIHsKQEAgLTE2Myw3ICszNDIsNyBAQAogCiAJCS8qIEFkZCByZS1pbmplY3QgcnVsZSB0byB0aGUgUEYvcmVwcmVzZW50b3Igc3FzICovCiAJCWZsb3dfcnVsZSA9IG1seDVfZXN3aXRjaF9hZGRfc2VuZF90b192cG9ydF9ydWxlKGVzdywKLQkJCQkJCQkJdnBvcnQsCisJCQkJCQkJCXJlcC0+dnBvcnQsCiAJCQkJCQkJCXNxbnNfYXJyYXlbaV0pOwogCQlpZiAoSVNfRVJSKGZsb3dfcnVsZSkpIHsKIAkJCWVyciA9IFBUUl9FUlIoZmxvd19ydWxlKTsKQEAgLTQ0Niw3ICs2MjUsNyBAQAogCiBzdGF0aWMgaW50IGVzd19vZmZsb2Fkc19zdGFydChzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3cpCiB7Ci0JaW50IGVyciwgbnVtX3ZmcyA9IGVzdy0+ZGV2LT5wcml2LnNyaW92Lm51bV92ZnM7CisJaW50IGVyciwgZXJyMSwgbnVtX3ZmcyA9IGVzdy0+ZGV2LT5wcml2LnNyaW92Lm51bV92ZnM7CiAKIAlpZiAoZXN3LT5tb2RlICE9IFNSSU9WX0xFR0FDWSkgewogCQllc3dfd2Fybihlc3ctPmRldiwgIkNhbid0IHNldCBvZmZsb2FkcyBtb2RlLCBTUklPViBsZWdhY3kgbm90IGVuYWJsZWRcbiIpOwpAQCAtNDU1LDggKzYzNCwxMiBAQAogCiAJbWx4NV9lc3dpdGNoX2Rpc2FibGVfc3Jpb3YoZXN3KTsKIAllcnIgPSBtbHg1X2Vzd2l0Y2hfZW5hYmxlX3NyaW92KGVzdywgbnVtX3ZmcywgU1JJT1ZfT0ZGTE9BRFMpOwotCWlmIChlcnIpCi0JCWVzd193YXJuKGVzdy0+ZGV2LCAiRmFpbGVkIHNldCBlc3dpdGNoIHRvIG9mZmxvYWRzLCBlcnIgJWRcbiIsIGVycik7CisJaWYgKGVycikgeworCQllc3dfd2Fybihlc3ctPmRldiwgIkZhaWxlZCBzZXR0aW5nIGVzd2l0Y2ggdG8gb2ZmbG9hZHMsIGVyciAlZFxuIiwgZXJyKTsKKwkJZXJyMSA9IG1seDVfZXN3aXRjaF9lbmFibGVfc3Jpb3YoZXN3LCBudW1fdmZzLCBTUklPVl9MRUdBQ1kpOworCQlpZiAoZXJyMSkKKwkJCWVzd193YXJuKGVzdy0+ZGV2LCAiRmFpbGVkIHNldHRpbmcgZXN3aXRjaCBiYWNrIHRvIGxlZ2FjeSwgZXJyICVkXG4iLCBlcnIpOworCX0KIAlyZXR1cm4gZXJyOwogfQogCkBAIC01MDgsMTIgKzY5MSwxNiBAQAogCiBzdGF0aWMgaW50IGVzd19vZmZsb2Fkc19zdG9wKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdykKIHsKLQlpbnQgZXJyLCBudW1fdmZzID0gZXN3LT5kZXYtPnByaXYuc3Jpb3YubnVtX3ZmczsKKwlpbnQgZXJyLCBlcnIxLCBudW1fdmZzID0gZXN3LT5kZXYtPnByaXYuc3Jpb3YubnVtX3ZmczsKIAogCW1seDVfZXN3aXRjaF9kaXNhYmxlX3NyaW92KGVzdyk7CiAJZXJyID0gbWx4NV9lc3dpdGNoX2VuYWJsZV9zcmlvdihlc3csIG51bV92ZnMsIFNSSU9WX0xFR0FDWSk7Ci0JaWYgKGVycikKLQkJZXN3X3dhcm4oZXN3LT5kZXYsICJGYWlsZWQgc2V0IGVzd2l0Y2ggbGVnYWN5IG1vZGUuIGVyciAlZFxuIiwgZXJyKTsKKwlpZiAoZXJyKSB7CisJCWVzd193YXJuKGVzdy0+ZGV2LCAiRmFpbGVkIHNldHRpbmcgZXN3aXRjaCB0byBsZWdhY3ksIGVyciAlZFxuIiwgZXJyKTsKKwkJZXJyMSA9IG1seDVfZXN3aXRjaF9lbmFibGVfc3Jpb3YoZXN3LCBudW1fdmZzLCBTUklPVl9PRkZMT0FEUyk7CisJCWlmIChlcnIxKQorCQkJZXN3X3dhcm4oZXN3LT5kZXYsICJGYWlsZWQgc2V0dGluZyBlc3dpdGNoIGJhY2sgdG8gb2ZmbG9hZHMsIGVyciAlZFxuIiwgZXJyKTsKKwl9CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtNTM1LDcgKzcyMiw3IEBACiAJZXN3X2Rlc3Ryb3lfb2ZmbG9hZHNfZmRiX3RhYmxlKGVzdyk7CiB9CiAKLXN0YXRpYyBpbnQgbWx4NV9lc3dfbW9kZV9mcm9tX2RldmxpbmsodTE2IG1vZGUsIHUxNiAqbWx4NV9tb2RlKQorc3RhdGljIGludCBlc3dfbW9kZV9mcm9tX2RldmxpbmsodTE2IG1vZGUsIHUxNiAqbWx4NV9tb2RlKQogewogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgREVWTElOS19FU1dJVENIX01PREVfTEVHQUNZOgpAQCAtNTUxLDYgKzczOCwyMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGVzd19tb2RlX3RvX2RldmxpbmsodTE2IG1seDVfbW9kZSwgdTE2ICptb2RlKQoreworCXN3aXRjaCAobWx4NV9tb2RlKSB7CisJY2FzZSBTUklPVl9MRUdBQ1k6CisJCSptb2RlID0gREVWTElOS19FU1dJVENIX01PREVfTEVHQUNZOworCQlicmVhazsKKwljYXNlIFNSSU9WX09GRkxPQURTOgorCQkqbW9kZSA9IERFVkxJTktfRVNXSVRDSF9NT0RFX1NXSVRDSERFVjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIGludCBtbHg1X2RldmxpbmtfZXN3aXRjaF9tb2RlX3NldChzdHJ1Y3QgZGV2bGluayAqZGV2bGluaywgdTE2IG1vZGUpCiB7CiAJc3RydWN0IG1seDVfY29yZV9kZXYgKmRldjsKQEAgLTU2Niw3ICs3NjksNyBAQAogCWlmIChjdXJfbWx4NV9tb2RlID09IFNSSU9WX05PTkUpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCWlmIChtbHg1X2Vzd19tb2RlX2Zyb21fZGV2bGluayhtb2RlLCAmbWx4NV9tb2RlKSkKKwlpZiAoZXN3X21vZGVfZnJvbV9kZXZsaW5rKG1vZGUsICZtbHg1X21vZGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChjdXJfbWx4NV9tb2RlID09IG1seDVfbW9kZSkKQEAgLTU5MiwzMyArNzk1LDQwIEBACiAJaWYgKGRldi0+cHJpdi5lc3dpdGNoLT5tb2RlID09IFNSSU9WX05PTkUpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCSptb2RlID0gZGV2LT5wcml2LmVzd2l0Y2gtPm1vZGU7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXN3X21vZGVfdG9fZGV2bGluayhkZXYtPnByaXYuZXN3aXRjaC0+bW9kZSwgbW9kZSk7CiB9CiAKIHZvaWQgbWx4NV9lc3dpdGNoX3JlZ2lzdGVyX3Zwb3J0X3JlcChzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCi0JCQkJICAgICBzdHJ1Y3QgbWx4NV9lc3dpdGNoX3JlcCAqcmVwKQotewotCXN0cnVjdCBtbHg1X2Vzd19vZmZsb2FkICpvZmZsb2FkcyA9ICZlc3ctPm9mZmxvYWRzOwotCi0JbWVtY3B5KCZvZmZsb2Fkcy0+dnBvcnRfcmVwc1tyZXAtPnZwb3J0XSwgcmVwLAotCSAgICAgICBzaXplb2Yoc3RydWN0IG1seDVfZXN3aXRjaF9yZXApKTsKLQotCUlOSVRfTElTVF9IRUFEKCZvZmZsb2Fkcy0+dnBvcnRfcmVwc1tyZXAtPnZwb3J0XS52cG9ydF9zcXNfbGlzdCk7Ci0Jb2ZmbG9hZHMtPnZwb3J0X3JlcHNbcmVwLT52cG9ydF0udmFsaWQgPSB0cnVlOwotfQotCi12b2lkIG1seDVfZXN3aXRjaF91bnJlZ2lzdGVyX3Zwb3J0X3JlcChzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCi0JCQkJICAgICAgIGludCB2cG9ydCkKKwkJCQkgICAgIGludCB2cG9ydF9pbmRleCwKKwkJCQkgICAgIHN0cnVjdCBtbHg1X2Vzd2l0Y2hfcmVwICpfX3JlcCkKIHsKIAlzdHJ1Y3QgbWx4NV9lc3dfb2ZmbG9hZCAqb2ZmbG9hZHMgPSAmZXN3LT5vZmZsb2FkczsKIAlzdHJ1Y3QgbWx4NV9lc3dpdGNoX3JlcCAqcmVwOwogCi0JcmVwID0gJm9mZmxvYWRzLT52cG9ydF9yZXBzW3Zwb3J0XTsKKwlyZXAgPSAmb2ZmbG9hZHMtPnZwb3J0X3JlcHNbdnBvcnRfaW5kZXhdOwogCi0JaWYgKGVzdy0+bW9kZSA9PSBTUklPVl9PRkZMT0FEUyAmJiBlc3ctPnZwb3J0c1t2cG9ydF0uZW5hYmxlZCkKKwltZW1zZXQocmVwLCAwLCBzaXplb2YoKnJlcCkpOworCisJcmVwLT5sb2FkICAgPSBfX3JlcC0+bG9hZDsKKwlyZXAtPnVubG9hZCA9IF9fcmVwLT51bmxvYWQ7CisJcmVwLT52cG9ydCAgPSBfX3JlcC0+dnBvcnQ7CisJcmVwLT5wcml2X2RhdGEgPSBfX3JlcC0+cHJpdl9kYXRhOworCWV0aGVyX2FkZHJfY29weShyZXAtPmh3X2lkLCBfX3JlcC0+aHdfaWQpOworCisJSU5JVF9MSVNUX0hFQUQoJnJlcC0+dnBvcnRfc3FzX2xpc3QpOworCXJlcC0+dmFsaWQgPSB0cnVlOworfQorCit2b2lkIG1seDVfZXN3aXRjaF91bnJlZ2lzdGVyX3Zwb3J0X3JlcChzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCisJCQkJICAgICAgIGludCB2cG9ydF9pbmRleCkKK3sKKwlzdHJ1Y3QgbWx4NV9lc3dfb2ZmbG9hZCAqb2ZmbG9hZHMgPSAmZXN3LT5vZmZsb2FkczsKKwlzdHJ1Y3QgbWx4NV9lc3dpdGNoX3JlcCAqcmVwOworCisJcmVwID0gJm9mZmxvYWRzLT52cG9ydF9yZXBzW3Zwb3J0X2luZGV4XTsKKworCWlmIChlc3ctPm1vZGUgPT0gU1JJT1ZfT0ZGTE9BRFMgJiYgZXN3LT52cG9ydHNbdnBvcnRfaW5kZXhdLmVuYWJsZWQpCiAJCXJlcC0+dW5sb2FkKGVzdywgcmVwKTsKIAotCW9mZmxvYWRzLT52cG9ydF9yZXBzW3Zwb3J0XS52YWxpZCA9IGZhbHNlOworCXJlcC0+dmFsaWQgPSBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mc19jbWQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mc19jbWQuYwppbmRleCA5MTM0MDEwLi4xMTNjMzIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZnNfY21kLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2ZzX2NtZC5jCkBAIC00MSwxMCArNDEsOCBAQAogaW50IG1seDVfY21kX3VwZGF0ZV9yb290X2Z0KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQkgICAgc3RydWN0IG1seDVfZmxvd190YWJsZSAqZnQpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoc2V0X2Zsb3dfdGFibGVfcm9vdF9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhzZXRfZmxvd190YWJsZV9yb290X291dCldOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhzZXRfZmxvd190YWJsZV9yb290X2luKV0gICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoc2V0X2Zsb3dfdGFibGVfcm9vdF9vdXQpXSA9IHswfTsKIAogCU1MWDVfU0VUKHNldF9mbG93X3RhYmxlX3Jvb3RfaW4sIGluLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9TRVRfRkxPV19UQUJMRV9ST09UKTsKQEAgLTU1LDMwICs1MywyMyBAQAogCQlNTFg1X1NFVChzZXRfZmxvd190YWJsZV9yb290X2luLCBpbiwgb3RoZXJfdnBvcnQsIDEpOwogCX0KIAotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LAotCQkJCQkgIHNpemVvZihvdXQpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIAogaW50IG1seDVfY21kX2NyZWF0ZV9mbG93X3RhYmxlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQkgICAgICAgdTE2IHZwb3J0LAorCQkJICAgICAgIGVudW0gZnNfZmxvd190YWJsZV9vcF9tb2Qgb3BfbW9kLAogCQkJICAgICAgIGVudW0gZnNfZmxvd190YWJsZV90eXBlIHR5cGUsIHVuc2lnbmVkIGludCBsZXZlbCwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgbG9nX3NpemUsIHN0cnVjdCBtbHg1X2Zsb3dfdGFibGUKIAkJCSAgICAgICAqbmV4dF9mdCwgdW5zaWduZWQgaW50ICp0YWJsZV9pZCkKIHsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX2Zsb3dfdGFibGVfb3V0KV07Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoY3JlYXRlX2Zsb3dfdGFibGVfaW4pXTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX2Zsb3dfdGFibGVfb3V0KV0gPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoY3JlYXRlX2Zsb3dfdGFibGVfaW4pXSAgID0gezB9OwogCWludCBlcnI7CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCiAJTUxYNV9TRVQoY3JlYXRlX2Zsb3dfdGFibGVfaW4sIGluLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9DUkVBVEVfRkxPV19UQUJMRSk7CiAKLQlpZiAobmV4dF9mdCkgewotCQlNTFg1X1NFVChjcmVhdGVfZmxvd190YWJsZV9pbiwgaW4sIHRhYmxlX21pc3NfbW9kZSwgMSk7Ci0JCU1MWDVfU0VUKGNyZWF0ZV9mbG93X3RhYmxlX2luLCBpbiwgdGFibGVfbWlzc19pZCwgbmV4dF9mdC0+aWQpOwotCX0KIAlNTFg1X1NFVChjcmVhdGVfZmxvd190YWJsZV9pbiwgaW4sIHRhYmxlX3R5cGUsIHR5cGUpOwogCU1MWDVfU0VUKGNyZWF0ZV9mbG93X3RhYmxlX2luLCBpbiwgbGV2ZWwsIGxldmVsKTsKIAlNTFg1X1NFVChjcmVhdGVfZmxvd190YWJsZV9pbiwgaW4sIGxvZ19zaXplLCBsb2dfc2l6ZSk7CkBAIC04NywxMCArNzgsMjMgQEAKIAkJTUxYNV9TRVQoY3JlYXRlX2Zsb3dfdGFibGVfaW4sIGluLCBvdGhlcl92cG9ydCwgMSk7CiAJfQogCi0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWVyciA9IG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwKLQkJCQkJIHNpemVvZihvdXQpKTsKKwlzd2l0Y2ggKG9wX21vZCkgeworCWNhc2UgRlNfRlRfT1BfTU9EX05PUk1BTDoKKwkJaWYgKG5leHRfZnQpIHsKKwkJCU1MWDVfU0VUKGNyZWF0ZV9mbG93X3RhYmxlX2luLCBpbiwgdGFibGVfbWlzc19tb2RlLCAxKTsKKwkJCU1MWDVfU0VUKGNyZWF0ZV9mbG93X3RhYmxlX2luLCBpbiwgdGFibGVfbWlzc19pZCwgbmV4dF9mdC0+aWQpOworCQl9CisJCWJyZWFrOwogCisJY2FzZSBGU19GVF9PUF9NT0RfTEFHX0RFTVVYOgorCQlNTFg1X1NFVChjcmVhdGVfZmxvd190YWJsZV9pbiwgaW4sIG9wX21vZCwgMHgxKTsKKwkJaWYgKG5leHRfZnQpCisJCQlNTFg1X1NFVChjcmVhdGVfZmxvd190YWJsZV9pbiwgaW4sIGxhZ19tYXN0ZXJfbmV4dF90YWJsZV9pZCwKKwkJCQkgbmV4dF9mdC0+aWQpOworCQlicmVhazsKKwl9CisKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogCWlmICghZXJyKQogCQkqdGFibGVfaWQgPSBNTFg1X0dFVChjcmVhdGVfZmxvd190YWJsZV9vdXQsIG91dCwKIAkJCQkgICAgIHRhYmxlX2lkKTsKQEAgLTEwMCwxMSArMTA0LDggQEAKIGludCBtbHg1X2NtZF9kZXN0cm95X2Zsb3dfdGFibGUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKIAkJCQlzdHJ1Y3QgbWx4NV9mbG93X3RhYmxlICpmdCkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X2Zsb3dfdGFibGVfaW4pXTsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV9mbG93X3RhYmxlX291dCldOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV9mbG93X3RhYmxlX2luKV0gICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV9mbG93X3RhYmxlX291dCldID0gezB9OwogCiAJTUxYNV9TRVQoZGVzdHJveV9mbG93X3RhYmxlX2luLCBpbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfREVTVFJPWV9GTE9XX1RBQkxFKTsKQEAgLTExNSwzOSArMTE2LDQ5IEBACiAJCU1MWDVfU0VUKGRlc3Ryb3lfZmxvd190YWJsZV9pbiwgaW4sIG90aGVyX3Zwb3J0LCAxKTsKIAl9CiAKLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LAotCQkJCQkgIHNpemVvZihvdXQpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIAogaW50IG1seDVfY21kX21vZGlmeV9mbG93X3RhYmxlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQkgICAgICAgc3RydWN0IG1seDVfZmxvd190YWJsZSAqZnQsCiAJCQkgICAgICAgc3RydWN0IG1seDVfZmxvd190YWJsZSAqbmV4dF9mdCkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhtb2RpZnlfZmxvd190YWJsZV9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhtb2RpZnlfZmxvd190YWJsZV9vdXQpXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKG1vZGlmeV9mbG93X3RhYmxlX2luKV0gICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcobW9kaWZ5X2Zsb3dfdGFibGVfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChtb2RpZnlfZmxvd190YWJsZV9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX01PRElGWV9GTE9XX1RBQkxFKTsKIAlNTFg1X1NFVChtb2RpZnlfZmxvd190YWJsZV9pbiwgaW4sIHRhYmxlX3R5cGUsIGZ0LT50eXBlKTsKIAlNTFg1X1NFVChtb2RpZnlfZmxvd190YWJsZV9pbiwgaW4sIHRhYmxlX2lkLCBmdC0+aWQpOwotCWlmIChmdC0+dnBvcnQpIHsKLQkJTUxYNV9TRVQobW9kaWZ5X2Zsb3dfdGFibGVfaW4sIGluLCB2cG9ydF9udW1iZXIsIGZ0LT52cG9ydCk7Ci0JCU1MWDVfU0VUKG1vZGlmeV9mbG93X3RhYmxlX2luLCBpbiwgb3RoZXJfdnBvcnQsIDEpOwotCX0KLQlNTFg1X1NFVChtb2RpZnlfZmxvd190YWJsZV9pbiwgaW4sIG1vZGlmeV9maWVsZF9zZWxlY3QsCi0JCSBNTFg1X01PRElGWV9GTE9XX1RBQkxFX01JU1NfVEFCTEVfSUQpOwotCWlmIChuZXh0X2Z0KSB7Ci0JCU1MWDVfU0VUKG1vZGlmeV9mbG93X3RhYmxlX2luLCBpbiwgdGFibGVfbWlzc19tb2RlLCAxKTsKLQkJTUxYNV9TRVQobW9kaWZ5X2Zsb3dfdGFibGVfaW4sIGluLCB0YWJsZV9taXNzX2lkLCBuZXh0X2Z0LT5pZCk7CisKKwlpZiAoZnQtPm9wX21vZCA9PSBGU19GVF9PUF9NT0RfTEFHX0RFTVVYKSB7CisJCU1MWDVfU0VUKG1vZGlmeV9mbG93X3RhYmxlX2luLCBpbiwgbW9kaWZ5X2ZpZWxkX3NlbGVjdCwKKwkJCSBNTFg1X01PRElGWV9GTE9XX1RBQkxFX0xBR19ORVhUX1RBQkxFX0lEKTsKKwkJaWYgKG5leHRfZnQpIHsKKwkJCU1MWDVfU0VUKG1vZGlmeV9mbG93X3RhYmxlX2luLCBpbiwKKwkJCQkgbGFnX21hc3Rlcl9uZXh0X3RhYmxlX2lkLCBuZXh0X2Z0LT5pZCk7CisJCX0gZWxzZSB7CisJCQlNTFg1X1NFVChtb2RpZnlfZmxvd190YWJsZV9pbiwgaW4sCisJCQkJIGxhZ19tYXN0ZXJfbmV4dF90YWJsZV9pZCwgMCk7CisJCX0KIAl9IGVsc2UgewotCQlNTFg1X1NFVChtb2RpZnlfZmxvd190YWJsZV9pbiwgaW4sIHRhYmxlX21pc3NfbW9kZSwgMCk7CisJCWlmIChmdC0+dnBvcnQpIHsKKwkJCU1MWDVfU0VUKG1vZGlmeV9mbG93X3RhYmxlX2luLCBpbiwgdnBvcnRfbnVtYmVyLAorCQkJCSBmdC0+dnBvcnQpOworCQkJTUxYNV9TRVQobW9kaWZ5X2Zsb3dfdGFibGVfaW4sIGluLCBvdGhlcl92cG9ydCwgMSk7CisJCX0KKwkJTUxYNV9TRVQobW9kaWZ5X2Zsb3dfdGFibGVfaW4sIGluLCBtb2RpZnlfZmllbGRfc2VsZWN0LAorCQkJIE1MWDVfTU9ESUZZX0ZMT1dfVEFCTEVfTUlTU19UQUJMRV9JRCk7CisJCWlmIChuZXh0X2Z0KSB7CisJCQlNTFg1X1NFVChtb2RpZnlfZmxvd190YWJsZV9pbiwgaW4sIHRhYmxlX21pc3NfbW9kZSwgMSk7CisJCQlNTFg1X1NFVChtb2RpZnlfZmxvd190YWJsZV9pbiwgaW4sIHRhYmxlX21pc3NfaWQsCisJCQkJIG5leHRfZnQtPmlkKTsKKwkJfSBlbHNlIHsKKwkJCU1MWDVfU0VUKG1vZGlmeV9mbG93X3RhYmxlX2luLCBpbiwgdGFibGVfbWlzc19tb2RlLCAwKTsKKwkJfQogCX0KIAotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsCi0JCQkJCSAgc2l6ZW9mKG91dCkpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCiBpbnQgbWx4NV9jbWRfY3JlYXRlX2Zsb3dfZ3JvdXAoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKQEAgLTE1NSwxMiArMTY2LDEwIEBACiAJCQkgICAgICAgdTMyICppbiwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmdyb3VwX2lkKQogeworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfZmxvd19ncm91cF9vdXQpXSA9IHswfTsKIAlpbnQgaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKGNyZWF0ZV9mbG93X2dyb3VwX2luKTsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX2Zsb3dfZ3JvdXBfb3V0KV07CiAJaW50IGVycjsKIAotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQogCU1MWDVfU0VUKGNyZWF0ZV9mbG93X2dyb3VwX2luLCBpbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfQ1JFQVRFX0ZMT1dfR1JPVVApOwogCU1MWDVfU0VUKGNyZWF0ZV9mbG93X2dyb3VwX2luLCBpbiwgdGFibGVfdHlwZSwgZnQtPnR5cGUpOwpAQCAtMTcwLDEzICsxNzksMTAgQEAKIAkJTUxYNV9TRVQoY3JlYXRlX2Zsb3dfZ3JvdXBfaW4sIGluLCBvdGhlcl92cG9ydCwgMSk7CiAJfQogCi0JZXJyID0gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwKLQkJCQkJIGlubGVuLCBvdXQsCi0JCQkJCSBzaXplb2Yob3V0KSk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CiAJaWYgKCFlcnIpCiAJCSpncm91cF9pZCA9IE1MWDVfR0VUKGNyZWF0ZV9mbG93X2dyb3VwX291dCwgb3V0LAogCQkJCSAgICAgZ3JvdXBfaWQpOwotCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTg0LDExICsxOTAsOCBAQAogCQkJCXN0cnVjdCBtbHg1X2Zsb3dfdGFibGUgKmZ0LAogCQkJCXVuc2lnbmVkIGludCBncm91cF9pZCkKIHsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV9mbG93X2dyb3VwX291dCldOwotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfZmxvd19ncm91cF9pbildOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfZmxvd19ncm91cF9vdXQpXSA9IHswfTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X2Zsb3dfZ3JvdXBfaW4pXSAgID0gezB9OwogCiAJTUxYNV9TRVQoZGVzdHJveV9mbG93X2dyb3VwX2luLCBpbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfREVTVFJPWV9GTE9XX0dST1VQKTsKQEAgLTIwMCw4ICsyMDMsNyBAQAogCQlNTFg1X1NFVChkZXN0cm95X2Zsb3dfZ3JvdXBfaW4sIGluLCBvdGhlcl92cG9ydCwgMSk7CiAJfQogCi0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwKLQkJCQkJICBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIHN0YXRpYyBpbnQgbWx4NV9jbWRfc2V0X2Z0ZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LApAQCAtMjEyLDcgKzIxNCw3IEBACiB7CiAJdW5zaWduZWQgaW50IGlubGVuID0gTUxYNV9TVF9TWl9CWVRFUyhzZXRfZnRlX2luKSArCiAJCWZ0ZS0+ZGVzdHNfc2l6ZSAqIE1MWDVfU1RfU1pfQllURVMoZGVzdF9mb3JtYXRfc3RydWN0KTsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoc2V0X2Z0ZV9vdXQpXTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoc2V0X2Z0ZV9vdXQpXSA9IHswfTsKIAlzdHJ1Y3QgbWx4NV9mbG93X3J1bGUgKmRzdDsKIAl2b2lkICppbl9mbG93X2NvbnRleHQ7CiAJdm9pZCAqaW5fbWF0Y2hfdmFsdWU7CkBAIC0yOTAsMTEgKzI5Miw4IEBACiAJCQkgbGlzdF9zaXplKTsKIAl9CiAKLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JZXJyID0gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgaW5sZW4sIG91dCwKLQkJCQkJIHNpemVvZihvdXQpKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKIAlrdmZyZWUoaW4pOwotCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMzAzLDcgKzMwMiw3IEBACiAJCQl1bnNpZ25lZCBncm91cF9pZCwKIAkJCXN0cnVjdCBmc19mdGUgKmZ0ZSkKIHsKLQlyZXR1cm4JbWx4NV9jbWRfc2V0X2Z0ZShkZXYsIDAsIDAsIGZ0LCBncm91cF9pZCwgZnRlKTsKKwlyZXR1cm4gbWx4NV9jbWRfc2V0X2Z0ZShkZXYsIDAsIDAsIGZ0LCBncm91cF9pZCwgZnRlKTsKIH0KIAogaW50IG1seDVfY21kX3VwZGF0ZV9mdGUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKQEAgLTMyNywxMiArMzI2LDggQEAKIAkJCXN0cnVjdCBtbHg1X2Zsb3dfdGFibGUgKmZ0LAogCQkJdW5zaWduZWQgaW50IGluZGV4KQogewotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZWxldGVfZnRlX291dCldOwotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlbGV0ZV9mdGVfaW4pXTsKLQlpbnQgZXJyOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlbGV0ZV9mdGVfb3V0KV0gPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGVsZXRlX2Z0ZV9pbildICAgPSB7MH07CiAKIAlNTFg1X1NFVChkZWxldGVfZnRlX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9ERUxFVEVfRkxPV19UQUJMRV9FTlRSWSk7CiAJTUxYNV9TRVQoZGVsZXRlX2Z0ZV9pbiwgaW4sIHRhYmxlX3R5cGUsIGZ0LT50eXBlKTsKQEAgLTM0Myw3NCArMzM4LDU1IEBACiAJCU1MWDVfU0VUKGRlbGV0ZV9mdGVfaW4sIGluLCBvdGhlcl92cG9ydCwgMSk7CiAJfQogCi0JZXJyID0gIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwotCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIAogaW50IG1seDVfY21kX2ZjX2FsbG9jKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUxNiAqaWQpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoYWxsb2NfZmxvd19jb3VudGVyX2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGFsbG9jX2Zsb3dfY291bnRlcl9vdXQpXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhhbGxvY19mbG93X2NvdW50ZXJfaW4pXSAgID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhhbGxvY19mbG93X2NvdW50ZXJfb3V0KV0gPSB7MH07CiAJaW50IGVycjsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwotCiAJTUxYNV9TRVQoYWxsb2NfZmxvd19jb3VudGVyX2luLCBpbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfQUxMT0NfRkxPV19DT1VOVEVSKTsKIAotCWVyciA9IG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwKLQkJCQkJIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JKmlkID0gTUxYNV9HRVQoYWxsb2NfZmxvd19jb3VudGVyX291dCwgb3V0LCBmbG93X2NvdW50ZXJfaWQpOwotCi0JcmV0dXJuIDA7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKKwlpZiAoIWVycikKKwkJKmlkID0gTUxYNV9HRVQoYWxsb2NfZmxvd19jb3VudGVyX291dCwgb3V0LCBmbG93X2NvdW50ZXJfaWQpOworCXJldHVybiBlcnI7CiB9CiAKIGludCBtbHg1X2NtZF9mY19mcmVlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUxNiBpZCkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZWFsbG9jX2Zsb3dfY291bnRlcl9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZWFsbG9jX2Zsb3dfY291bnRlcl9vdXQpXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlYWxsb2NfZmxvd19jb3VudGVyX2luKV0gICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVhbGxvY19mbG93X2NvdW50ZXJfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChkZWFsbG9jX2Zsb3dfY291bnRlcl9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX0RFQUxMT0NfRkxPV19DT1VOVEVSKTsKIAlNTFg1X1NFVChkZWFsbG9jX2Zsb3dfY291bnRlcl9pbiwgaW4sIGZsb3dfY291bnRlcl9pZCwgaWQpOwotCi0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwKLQkJCQkJICBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIGludCBtbHg1X2NtZF9mY19xdWVyeShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgaWQsCiAJCSAgICAgIHU2NCAqcGFja2V0cywgdTY0ICpieXRlcykKIHsKIAl1MzIgb3V0W01MWDVfU1RfU1pfQllURVMocXVlcnlfZmxvd19jb3VudGVyX291dCkgKwotCQlNTFg1X1NUX1NaX0JZVEVTKHRyYWZmaWNfY291bnRlcildOwotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X2Zsb3dfY291bnRlcl9pbildOworCQlNTFg1X1NUX1NaX0JZVEVTKHRyYWZmaWNfY291bnRlcildICAgPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfZmxvd19jb3VudGVyX2luKV0gPSB7MH07CiAJdm9pZCAqc3RhdHM7CiAJaW50IGVyciA9IDA7CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQogCU1MWDVfU0VUKHF1ZXJ5X2Zsb3dfY291bnRlcl9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX1FVRVJZX0ZMT1dfQ09VTlRFUik7CiAJTUxYNV9TRVQocXVlcnlfZmxvd19jb3VudGVyX2luLCBpbiwgb3BfbW9kLCAwKTsKIAlNTFg1X1NFVChxdWVyeV9mbG93X2NvdW50ZXJfaW4sIGluLCBmbG93X2NvdW50ZXJfaWQsIGlkKTsKLQotCWVyciA9IG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCXN0YXRzID0gTUxYNV9BRERSX09GKHF1ZXJ5X2Zsb3dfY291bnRlcl9vdXQsIG91dCwgZmxvd19zdGF0aXN0aWNzKTsKIAkqcGFja2V0cyA9IE1MWDVfR0VUNjQodHJhZmZpY19jb3VudGVyLCBzdGF0cywgcGFja2V0cyk7CiAJKmJ5dGVzID0gTUxYNV9HRVQ2NCh0cmFmZmljX2NvdW50ZXIsIHN0YXRzLCBvY3RldHMpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQyNSwxMSArNDAxLDExIEBACiBtbHg1X2NtZF9mY19idWxrX2FsbG9jKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUxNiBpZCwgaW50IG51bSkKIHsKIAlzdHJ1Y3QgbWx4NV9jbWRfZmNfYnVsayAqYjsKLQlpbnQgb3V0bGVuID0gc2l6ZW9mKCpiKSArCisJaW50IG91dGxlbiA9CiAJCU1MWDVfU1RfU1pfQllURVMocXVlcnlfZmxvd19jb3VudGVyX291dCkgKwogCQlNTFg1X1NUX1NaX0JZVEVTKHRyYWZmaWNfY291bnRlcikgKiBudW07CiAKLQliID0ga3phbGxvYyhvdXRsZW4sIEdGUF9LRVJORUwpOworCWIgPSBremFsbG9jKHNpemVvZigqYikgKyBvdXRsZW4sIEdGUF9LRVJORUwpOwogCWlmICghYikKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTQ0OCwxOCArNDI0LDE0IEBACiBpbnQKIG1seDVfY21kX2ZjX2J1bGtfcXVlcnkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfY21kX2ZjX2J1bGsgKmIpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfZmxvd19jb3VudGVyX2luKV07Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X2Zsb3dfY291bnRlcl9pbildID0gezB9OwogCiAJTUxYNV9TRVQocXVlcnlfZmxvd19jb3VudGVyX2luLCBpbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfUVVFUllfRkxPV19DT1VOVEVSKTsKIAlNTFg1X1NFVChxdWVyeV9mbG93X2NvdW50ZXJfaW4sIGluLCBvcF9tb2QsIDApOwogCU1MWDVfU0VUKHF1ZXJ5X2Zsb3dfY291bnRlcl9pbiwgaW4sIGZsb3dfY291bnRlcl9pZCwgYi0+aWQpOwogCU1MWDVfU0VUKHF1ZXJ5X2Zsb3dfY291bnRlcl9pbiwgaW4sIG51bV9vZl9jb3VudGVycywgYi0+bnVtKTsKLQotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLAotCQkJCQkgIGItPm91dCwgYi0+b3V0bGVuKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBiLT5vdXQsIGItPm91dGxlbik7CiB9CiAKIHZvaWQgbWx4NV9jbWRfZmNfYnVsa19nZXQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKQEAgLTQ4MCwzICs0NTIsNTEgQEAKIAkqcGFja2V0cyA9IE1MWDVfR0VUNjQodHJhZmZpY19jb3VudGVyLCBzdGF0cywgcGFja2V0cyk7CiAJKmJ5dGVzID0gTUxYNV9HRVQ2NCh0cmFmZmljX2NvdW50ZXIsIHN0YXRzLCBvY3RldHMpOwogfQorCisjZGVmaW5lIE1BWF9FTkNBUF9TSVpFICgxMjgpCisKK2ludCBtbHg1X2NtZF9hbGxvY19lbmNhcChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAorCQkJIGludCBoZWFkZXJfdHlwZSwKKwkJCSBzaXplX3Qgc2l6ZSwKKwkJCSB2b2lkICplbmNhcF9oZWFkZXIsCisJCQkgdTMyICplbmNhcF9pZCkKK3sKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoYWxsb2NfZW5jYXBfaGVhZGVyX291dCldOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGFsbG9jX2VuY2FwX2hlYWRlcl9pbikgKworCSAgICAgIChNQVhfRU5DQVBfU0laRSAvIHNpemVvZih1MzIpKV07CisJdm9pZCAqZW5jYXBfaGVhZGVyX2luID0gTUxYNV9BRERSX09GKGFsbG9jX2VuY2FwX2hlYWRlcl9pbiwgaW4sCisJCQkJCSAgICAgZW5jYXBfaGVhZGVyKTsKKwl2b2lkICpoZWFkZXIgPSBNTFg1X0FERFJfT0YoZW5jYXBfaGVhZGVyX2luLCBlbmNhcF9oZWFkZXJfaW4sCisJCQkJICAgIGVuY2FwX2hlYWRlcik7CisJaW50IGlubGVuID0gaGVhZGVyIC0gKHZvaWQgKilpbiAgKyBzaXplOworCWludCBlcnI7CisKKwlpZiAoc2l6ZSA+IE1BWF9FTkNBUF9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldChpbiwgMCwgaW5sZW4pOworCU1MWDVfU0VUKGFsbG9jX2VuY2FwX2hlYWRlcl9pbiwgaW4sIG9wY29kZSwKKwkJIE1MWDVfQ01EX09QX0FMTE9DX0VOQ0FQX0hFQURFUik7CisJTUxYNV9TRVQoZW5jYXBfaGVhZGVyX2luLCBlbmNhcF9oZWFkZXJfaW4sIGVuY2FwX2hlYWRlcl9zaXplLCBzaXplKTsKKwlNTFg1X1NFVChlbmNhcF9oZWFkZXJfaW4sIGVuY2FwX2hlYWRlcl9pbiwgaGVhZGVyX3R5cGUsIGhlYWRlcl90eXBlKTsKKwltZW1jcHkoaGVhZGVyLCBlbmNhcF9oZWFkZXIsIHNpemUpOworCisJbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOworCisJKmVuY2FwX2lkID0gTUxYNV9HRVQoYWxsb2NfZW5jYXBfaGVhZGVyX291dCwgb3V0LCBlbmNhcF9pZCk7CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBtbHg1X2NtZF9kZWFsbG9jX2VuY2FwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiBlbmNhcF9pZCkKK3sKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZWFsbG9jX2VuY2FwX2hlYWRlcl9pbildOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZWFsbG9jX2VuY2FwX2hlYWRlcl9vdXQpXTsKKworCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CisJTUxYNV9TRVQoZGVhbGxvY19lbmNhcF9oZWFkZXJfaW4sIGluLCBvcGNvZGUsCisJCSBNTFg1X0NNRF9PUF9ERUFMTE9DX0VOQ0FQX0hFQURFUik7CisJTUxYNV9TRVQoZGVhbGxvY19lbmNhcF9oZWFkZXJfaW4sIGluLCBlbmNhcF9pZCwgZW5jYXBfaWQpOworCisJbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mc19jbWQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mc19jbWQuaAppbmRleCAxNTg4NDRjLi5jNWJjNDY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZnNfY21kLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2ZzX2NtZC5oCkBAIC0zNSw2ICszNSw3IEBACiAKIGludCBtbHg1X2NtZF9jcmVhdGVfZmxvd190YWJsZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkJICAgICAgIHUxNiB2cG9ydCwKKwkJCSAgICAgICBlbnVtIGZzX2Zsb3dfdGFibGVfb3BfbW9kIG9wX21vZCwKIAkJCSAgICAgICBlbnVtIGZzX2Zsb3dfdGFibGVfdHlwZSB0eXBlLCB1bnNpZ25lZCBpbnQgbGV2ZWwsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGxvZ19zaXplLCBzdHJ1Y3QgbWx4NV9mbG93X3RhYmxlCiAJCQkgICAgICAgKm5leHRfZnQsIHVuc2lnbmVkIGludCAqdGFibGVfaWQpOwpAQCAtODgsNCArODksMTEgQEAKIAkJCSAgc3RydWN0IG1seDVfY21kX2ZjX2J1bGsgKmIsIHUxNiBpZCwKIAkJCSAgdTY0ICpwYWNrZXRzLCB1NjQgKmJ5dGVzKTsKIAoraW50IG1seDVfY21kX2FsbG9jX2VuY2FwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCisJCQkgaW50IGhlYWRlcl90eXBlLAorCQkJIHNpemVfdCBzaXplLAorCQkJIHZvaWQgKmVuY2FwX2hlYWRlciwKKwkJCSB1MzIgKmVuY2FwX2lkKTsKK3ZvaWQgbWx4NV9jbWRfZGVhbGxvY19lbmNhcChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgZW5jYXBfaWQpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mc19jb3JlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZnNfY29yZS5jCmluZGV4IDc1YmI4YzguLjVkYTJjYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mc19jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2ZzX2NvcmUuYwpAQCAtODAsNyArODAsNyBAQAogCQkJICAgTEVGVE9WRVJTX05VTV9QUklPUykKIAogI2RlZmluZSBFVEhUT09MX1BSSU9fTlVNX0xFVkVMUyAxCi0jZGVmaW5lIEVUSFRPT0xfTlVNX1BSSU9TIDEwCisjZGVmaW5lIEVUSFRPT0xfTlVNX1BSSU9TIDExCiAjZGVmaW5lIEVUSFRPT0xfTUlOX0xFVkVMIChLRVJORUxfTUlOX0xFVkVMICsgRVRIVE9PTF9OVU1fUFJJT1MpCiAvKiBWbGFuLCBtYWMsIHR0YywgYVJGUyAqLwogI2RlZmluZSBLRVJORUxfTklDX1BSSU9fTlVNX0xFVkVMUyA0CkBAIC05Niw2ICs5NiwxMCBAQAogI2RlZmluZSBPRkZMT0FEU19OVU1fUFJJT1MgMQogI2RlZmluZSBPRkZMT0FEU19NSU5fTEVWRUwgKEFOQ0hPUl9NSU5fTEVWRUwgKyAxKQogCisjZGVmaW5lIExBR19QUklPX05VTV9MRVZFTFMgMQorI2RlZmluZSBMQUdfTlVNX1BSSU9TIDEKKyNkZWZpbmUgTEFHX01JTl9MRVZFTCAoT0ZGTE9BRFNfTUlOX0xFVkVMICsgMSkKKwogc3RydWN0IG5vZGVfY2FwcyB7CiAJc2l6ZV90CWFycl9zejsKIAlsb25nCSpjYXBzOwpAQCAtMTExLDEyICsxMTUsMTYgQEAKIAlpbnQgbnVtX2xldmVsczsKIH0gcm9vdF9mcyA9IHsKIAkudHlwZSA9IEZTX1RZUEVfTkFNRVNQQUNFLAotCS5hcl9zaXplID0gNiwKKwkuYXJfc2l6ZSA9IDcsCiAJLmNoaWxkcmVuID0gKHN0cnVjdCBpbml0X3RyZWVfbm9kZVtdKSB7CiAJCUFERF9QUklPKDAsIEJZX1BBU1NfTUlOX0xFVkVMLCAwLAogCQkJIEZTX0NIQUlOSU5HX0NBUFMsCiAJCQkgQUREX05TKEFERF9NVUxUSVBMRV9QUklPKE1MWDVfQllfUEFTU19OVU1fUFJJT1MsCiAJCQkJCQkgIEJZX1BBU1NfUFJJT19OVU1fTEVWRUxTKSkpLAorCQlBRERfUFJJTygwLCBMQUdfTUlOX0xFVkVMLCAwLAorCQkJIEZTX0NIQUlOSU5HX0NBUFMsCisJCQkgQUREX05TKEFERF9NVUxUSVBMRV9QUklPKExBR19OVU1fUFJJT1MsCisJCQkJCQkgIExBR19QUklPX05VTV9MRVZFTFMpKSksCiAJCUFERF9QUklPKDAsIE9GRkxPQURTX01JTl9MRVZFTCwgMCwge30sCiAJCQkgQUREX05TKEFERF9NVUxUSVBMRV9QUklPKE9GRkxPQURTX05VTV9QUklPUywgT0ZGTE9BRFNfTUFYX0ZUKSkpLAogCQlBRERfUFJJTygwLCBFVEhUT09MX01JTl9MRVZFTCwgMCwKQEAgLTM0NSw3ICszNTMsNyBAQAogCiAJZXJyID0gbWx4NV9jbWRfZGVzdHJveV9mbG93X3RhYmxlKGRldiwgZnQpOwogCWlmIChlcnIpCi0JCXByX3dhcm4oImZsb3cgc3RlZXJpbmcgY2FuJ3QgZGVzdHJveSBmdFxuIik7CisJCW1seDVfY29yZV93YXJuKGRldiwgImZsb3cgc3RlZXJpbmcgY2FuJ3QgZGVzdHJveSBmdFxuIik7CiAJZnNfZ2V0X29iaihwcmlvLCBmdC0+bm9kZS5wYXJlbnQpOwogCXByaW8tPm51bV9mdC0tOwogfQpAQCAtMzY0LDcgKzM3Miw3IEBACiAKIAltYXRjaF92YWx1ZSA9IG1seDVfdnphbGxvYyhtYXRjaF9sZW4pOwogCWlmICghbWF0Y2hfdmFsdWUpIHsKLQkJcHJfd2FybigiZmFpbGVkIHRvIGFsbG9jYXRlIGluYm94XG4iKTsKKwkJbWx4NV9jb3JlX3dhcm4oZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGluYm94XG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzg3LDggKzM5NSw5IEBACiAJCQkJCSAgbW9kaWZ5X21hc2ssCiAJCQkJCSAgZnRlKTsKIAkJaWYgKGVycikKLQkJCXByX3dhcm4oIiVzIGNhbid0IGRlbCBydWxlIGZnIGlkPSVkIGZ0ZV9pbmRleD0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgZmctPmlkLCBmdGUtPmluZGV4KTsKKwkJCW1seDVfY29yZV93YXJuKGRldiwKKwkJCQkgICAgICAgIiVzIGNhbid0IGRlbCBydWxlIGZnIGlkPSVkIGZ0ZV9pbmRleD0lZFxuIiwKKwkJCQkgICAgICAgX19mdW5jX18sIGZnLT5pZCwgZnRlLT5pbmRleCk7CiAJfQogCWt2ZnJlZShtYXRjaF92YWx1ZSk7CiB9CkBAIC00MDksOCArNDE4LDkgQEAKIAllcnIgPSBtbHg1X2NtZF9kZWxldGVfZnRlKGRldiwgZnQsCiAJCQkJICBmdGUtPmluZGV4KTsKIAlpZiAoZXJyKQotCQlwcl93YXJuKCJmbG93IHN0ZWVyaW5nIGNhbid0IGRlbGV0ZSBmdGUgaW4gaW5kZXggJWQgb2YgZmxvdyBncm91cCBpZCAlZFxuIiwKLQkJCWZ0ZS0+aW5kZXgsIGZnLT5pZCk7CisJCW1seDVfY29yZV93YXJuKGRldiwKKwkJCSAgICAgICAiZmxvdyBzdGVlcmluZyBjYW4ndCBkZWxldGUgZnRlIGluIGluZGV4ICVkIG9mIGZsb3cgZ3JvdXAgaWQgJWRcbiIsCisJCQkgICAgICAgZnRlLT5pbmRleCwgZmctPmlkKTsKIAogCWZ0ZS0+c3RhdHVzID0gMDsKIAlmZy0+bnVtX2Z0ZXMtLTsKQEAgLTQyNyw4ICs0MzcsOCBAQAogCWRldiA9IGdldF9kZXYoJmZ0LT5ub2RlKTsKIAogCWlmIChtbHg1X2NtZF9kZXN0cm95X2Zsb3dfZ3JvdXAoZGV2LCBmdCwgZmctPmlkKSkKLQkJcHJfd2FybigiZmxvdyBzdGVlcmluZyBjYW4ndCBkZXN0cm95IGZnICVkIG9mIGZ0ICVkXG4iLAotCQkJZmctPmlkLCBmdC0+aWQpOworCQltbHg1X2NvcmVfd2FybihkZXYsICJmbG93IHN0ZWVyaW5nIGNhbid0IGRlc3Ryb3kgZmcgJWQgb2YgZnQgJWRcbiIsCisJCQkgICAgICAgZmctPmlkLCBmdC0+aWQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZzX2Z0ZSAqYWxsb2NfZnRlKHU4IGFjdGlvbiwKQEAgLTQ3NSw3ICs0ODUsOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IG1seDVfZmxvd190YWJsZSAqYWxsb2NfZmxvd190YWJsZShpbnQgbGV2ZWwsIHUxNiB2cG9ydCwgaW50IG1heF9mdGUsCi0JCQkJCQllbnVtIGZzX2Zsb3dfdGFibGVfdHlwZSB0YWJsZV90eXBlKQorCQkJCQkJZW51bSBmc19mbG93X3RhYmxlX3R5cGUgdGFibGVfdHlwZSwKKwkJCQkJCWVudW0gZnNfZmxvd190YWJsZV9vcF9tb2Qgb3BfbW9kKQogewogCXN0cnVjdCBtbHg1X2Zsb3dfdGFibGUgKmZ0OwogCkBAIC00ODUsNiArNDk2LDcgQEAKIAogCWZ0LT5sZXZlbCA9IGxldmVsOwogCWZ0LT5ub2RlLnR5cGUgPSBGU19UWVBFX0ZMT1dfVEFCTEU7CisJZnQtPm9wX21vZCA9IG9wX21vZDsKIAlmdC0+dHlwZSA9IHRhYmxlX3R5cGU7CiAJZnQtPnZwb3J0ID0gdnBvcnQ7CiAJZnQtPm1heF9mdGUgPSBtYXhfZnRlOwpAQCAtNzIyLDYgKzczNCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWx4NV9mbG93X3RhYmxlICpfX21seDVfY3JlYXRlX2Zsb3dfdGFibGUoc3RydWN0IG1seDVfZmxvd19uYW1lc3BhY2UgKm5zLAorCQkJCQkJCWVudW0gZnNfZmxvd190YWJsZV9vcF9tb2Qgb3BfbW9kLAogCQkJCQkJCXUxNiB2cG9ydCwgaW50IHByaW8sCiAJCQkJCQkJaW50IG1heF9mdGUsIHUzMiBsZXZlbCkKIHsKQEAgLTc1NCwxOCArNzY3LDE5IEBACiAJbGV2ZWwgKz0gZnNfcHJpby0+c3RhcnRfbGV2ZWw7CiAJZnQgPSBhbGxvY19mbG93X3RhYmxlKGxldmVsLAogCQkJICAgICAgdnBvcnQsCi0JCQkgICAgICByb3VuZHVwX3Bvd19vZl90d28obWF4X2Z0ZSksCi0JCQkgICAgICByb290LT50YWJsZV90eXBlKTsKKwkJCSAgICAgIG1heF9mdGUgPyByb3VuZHVwX3Bvd19vZl90d28obWF4X2Z0ZSkgOiAwLAorCQkJICAgICAgcm9vdC0+dGFibGVfdHlwZSwKKwkJCSAgICAgIG9wX21vZCk7CiAJaWYgKCFmdCkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIHVubG9ja19yb290OwogCX0KIAogCXRyZWVfaW5pdF9ub2RlKCZmdC0+bm9kZSwgMSwgZGVsX2Zsb3dfdGFibGUpOwotCWxvZ190YWJsZV9zeiA9IGlsb2cyKGZ0LT5tYXhfZnRlKTsKKwlsb2dfdGFibGVfc3ogPSBmdC0+bWF4X2Z0ZSA/IGlsb2cyKGZ0LT5tYXhfZnRlKSA6IDA7CiAJbmV4dF9mdCA9IGZpbmRfbmV4dF9jaGFpbmVkX2Z0KGZzX3ByaW8pOwotCWVyciA9IG1seDVfY21kX2NyZWF0ZV9mbG93X3RhYmxlKHJvb3QtPmRldiwgZnQtPnZwb3J0LCBmdC0+dHlwZSwgZnQtPmxldmVsLAotCQkJCQkgbG9nX3RhYmxlX3N6LCBuZXh0X2Z0LCAmZnQtPmlkKTsKKwllcnIgPSBtbHg1X2NtZF9jcmVhdGVfZmxvd190YWJsZShyb290LT5kZXYsIGZ0LT52cG9ydCwgZnQtPm9wX21vZCwgZnQtPnR5cGUsCisJCQkJCSBmdC0+bGV2ZWwsIGxvZ190YWJsZV9zeiwgbmV4dF9mdCwgJmZ0LT5pZCk7CiAJaWYgKGVycikKIAkJZ290byBmcmVlX2Z0OwogCkBAIC03OTIsMTYgKzgwNiwyNyBAQAogCQkJCQkgICAgICAgaW50IHByaW8sIGludCBtYXhfZnRlLAogCQkJCQkgICAgICAgdTMyIGxldmVsKQogewotCXJldHVybiBfX21seDVfY3JlYXRlX2Zsb3dfdGFibGUobnMsIDAsIHByaW8sIG1heF9mdGUsIGxldmVsKTsKKwlyZXR1cm4gX19tbHg1X2NyZWF0ZV9mbG93X3RhYmxlKG5zLCBGU19GVF9PUF9NT0RfTk9STUFMLCAwLCBwcmlvLAorCQkJCQltYXhfZnRlLCBsZXZlbCk7CiB9CiAKIHN0cnVjdCBtbHg1X2Zsb3dfdGFibGUgKm1seDVfY3JlYXRlX3Zwb3J0X2Zsb3dfdGFibGUoc3RydWN0IG1seDVfZmxvd19uYW1lc3BhY2UgKm5zLAogCQkJCQkJICAgICBpbnQgcHJpbywgaW50IG1heF9mdGUsCiAJCQkJCQkgICAgIHUzMiBsZXZlbCwgdTE2IHZwb3J0KQogewotCXJldHVybiBfX21seDVfY3JlYXRlX2Zsb3dfdGFibGUobnMsIHZwb3J0LCBwcmlvLCBtYXhfZnRlLCBsZXZlbCk7CisJcmV0dXJuIF9fbWx4NV9jcmVhdGVfZmxvd190YWJsZShucywgRlNfRlRfT1BfTU9EX05PUk1BTCwgdnBvcnQsIHByaW8sCisJCQkJCW1heF9mdGUsIGxldmVsKTsKIH0KIAorc3RydWN0IG1seDVfZmxvd190YWJsZSAqbWx4NV9jcmVhdGVfbGFnX2RlbXV4X2Zsb3dfdGFibGUoCisJCQkJCSAgICAgICBzdHJ1Y3QgbWx4NV9mbG93X25hbWVzcGFjZSAqbnMsCisJCQkJCSAgICAgICBpbnQgcHJpbywgdTMyIGxldmVsKQoreworCXJldHVybiBfX21seDVfY3JlYXRlX2Zsb3dfdGFibGUobnMsIEZTX0ZUX09QX01PRF9MQUdfREVNVVgsIDAsIHByaW8sIDAsCisJCQkJCWxldmVsKTsKK30KK0VYUE9SVF9TWU1CT0wobWx4NV9jcmVhdGVfbGFnX2RlbXV4X2Zsb3dfdGFibGUpOworCiBzdHJ1Y3QgbWx4NV9mbG93X3RhYmxlICptbHg1X2NyZWF0ZV9hdXRvX2dyb3VwZWRfZmxvd190YWJsZShzdHJ1Y3QgbWx4NV9mbG93X25hbWVzcGFjZSAqbnMsCiAJCQkJCQkJICAgIGludCBwcmlvLAogCQkJCQkJCSAgICBpbnQgbnVtX2Zsb3dfdGFibGVfZW50cmllcywKQEAgLTEzNzksNiArMTQwNCw3IEBACiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIE1MWDVfRkxPV19OQU1FU1BBQ0VfQllQQVNTOgorCWNhc2UgTUxYNV9GTE9XX05BTUVTUEFDRV9MQUc6CiAJY2FzZSBNTFg1X0ZMT1dfTkFNRVNQQUNFX09GRkxPQURTOgogCWNhc2UgTUxYNV9GTE9XX05BTUVTUEFDRV9FVEhUT09MOgogCWNhc2UgTUxYNV9GTE9XX05BTUVTUEFDRV9LRVJORUw6CkBAIC0xNDAxLDYgKzE0MjcsMTYgQEAKIAkJCXJldHVybiAmc3RlZXJpbmctPmVzd19pbmdyZXNzX3Jvb3RfbnMtPm5zOwogCQllbHNlCiAJCQlyZXR1cm4gTlVMTDsKKwljYXNlIE1MWDVfRkxPV19OQU1FU1BBQ0VfU05JRkZFUl9SWDoKKwkJaWYgKHN0ZWVyaW5nLT5zbmlmZmVyX3J4X3Jvb3RfbnMpCisJCQlyZXR1cm4gJnN0ZWVyaW5nLT5zbmlmZmVyX3J4X3Jvb3RfbnMtPm5zOworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKKwljYXNlIE1MWDVfRkxPV19OQU1FU1BBQ0VfU05JRkZFUl9UWDoKKwkJaWYgKHN0ZWVyaW5nLT5zbmlmZmVyX3R4X3Jvb3RfbnMpCisJCQlyZXR1cm4gJnN0ZWVyaW5nLT5zbmlmZmVyX3R4X3Jvb3RfbnMtPm5zOworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xNzAwLDEwICsxNzM2LDQ2IEBACiAJY2xlYW51cF9yb290X25zKHN0ZWVyaW5nLT5lc3dfZWdyZXNzX3Jvb3RfbnMpOwogCWNsZWFudXBfcm9vdF9ucyhzdGVlcmluZy0+ZXN3X2luZ3Jlc3Nfcm9vdF9ucyk7CiAJY2xlYW51cF9yb290X25zKHN0ZWVyaW5nLT5mZGJfcm9vdF9ucyk7CisJY2xlYW51cF9yb290X25zKHN0ZWVyaW5nLT5zbmlmZmVyX3J4X3Jvb3RfbnMpOworCWNsZWFudXBfcm9vdF9ucyhzdGVlcmluZy0+c25pZmZlcl90eF9yb290X25zKTsKIAltbHg1X2NsZWFudXBfZmNfc3RhdHMoZGV2KTsKIAlrZnJlZShzdGVlcmluZyk7CiB9CiAKK3N0YXRpYyBpbnQgaW5pdF9zbmlmZmVyX3R4X3Jvb3RfbnMoc3RydWN0IG1seDVfZmxvd19zdGVlcmluZyAqc3RlZXJpbmcpCit7CisJc3RydWN0IGZzX3ByaW8gKnByaW87CisKKwlzdGVlcmluZy0+c25pZmZlcl90eF9yb290X25zID0gY3JlYXRlX3Jvb3RfbnMoc3RlZXJpbmcsIEZTX0ZUX1NOSUZGRVJfVFgpOworCWlmICghc3RlZXJpbmctPnNuaWZmZXJfdHhfcm9vdF9ucykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBDcmVhdGUgc2luZ2xlIHByaW8gKi8KKwlwcmlvID0gZnNfY3JlYXRlX3ByaW8oJnN0ZWVyaW5nLT5zbmlmZmVyX3R4X3Jvb3RfbnMtPm5zLCAwLCAxKTsKKwlpZiAoSVNfRVJSKHByaW8pKSB7CisJCWNsZWFudXBfcm9vdF9ucyhzdGVlcmluZy0+c25pZmZlcl90eF9yb290X25zKTsKKwkJcmV0dXJuIFBUUl9FUlIocHJpbyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXRfc25pZmZlcl9yeF9yb290X25zKHN0cnVjdCBtbHg1X2Zsb3dfc3RlZXJpbmcgKnN0ZWVyaW5nKQoreworCXN0cnVjdCBmc19wcmlvICpwcmlvOworCisJc3RlZXJpbmctPnNuaWZmZXJfcnhfcm9vdF9ucyA9IGNyZWF0ZV9yb290X25zKHN0ZWVyaW5nLCBGU19GVF9TTklGRkVSX1JYKTsKKwlpZiAoIXN0ZWVyaW5nLT5zbmlmZmVyX3J4X3Jvb3RfbnMpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogQ3JlYXRlIHNpbmdsZSBwcmlvICovCisJcHJpbyA9IGZzX2NyZWF0ZV9wcmlvKCZzdGVlcmluZy0+c25pZmZlcl9yeF9yb290X25zLT5ucywgMCwgMSk7CisJaWYgKElTX0VSUihwcmlvKSkgeworCQljbGVhbnVwX3Jvb3RfbnMoc3RlZXJpbmctPnNuaWZmZXJfcnhfcm9vdF9ucyk7CisJCXJldHVybiBQVFJfRVJSKHByaW8pOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBpbml0X2ZkYl9yb290X25zKHN0cnVjdCBtbHg1X2Zsb3dfc3RlZXJpbmcgKnN0ZWVyaW5nKQogewogCXN0cnVjdCBmc19wcmlvICpwcmlvOwpAQCAtMTgwMCw2ICsxODcyLDE4IEBACiAJCX0KIAl9CiAKKwlpZiAoTUxYNV9DQVBfRkxPV1RBQkxFX1NOSUZGRVJfUlgoZGV2LCBmdF9zdXBwb3J0KSkgeworCQllcnIgPSBpbml0X3NuaWZmZXJfcnhfcm9vdF9ucyhzdGVlcmluZyk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoTUxYNV9DQVBfRkxPV1RBQkxFX1NOSUZGRVJfVFgoZGV2LCBmdF9zdXBwb3J0KSkgeworCQllcnIgPSBpbml0X3NuaWZmZXJfdHhfcm9vdF9ucyhzdGVlcmluZyk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycjsKKwl9CisKIAlyZXR1cm4gMDsKIGVycjoKIAltbHg1X2NsZWFudXBfZnMoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mc19jb3JlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZnNfY29yZS5oCmluZGV4IDljZmZiNmEuLjcxZmYwM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mc19jb3JlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2ZzX2NvcmUuaApAQCAtNDksNiArNDksMTMgQEAKIAlGU19GVF9FU1dfRUdSRVNTX0FDTCAgPSAweDIsCiAJRlNfRlRfRVNXX0lOR1JFU1NfQUNMID0gMHgzLAogCUZTX0ZUX0ZEQiAgICAgICAgICAgICA9IDBYNCwKKwlGU19GVF9TTklGRkVSX1JYCT0gMFg1LAorCUZTX0ZUX1NOSUZGRVJfVFgJPSAwWDYsCit9OworCitlbnVtIGZzX2Zsb3dfdGFibGVfb3BfbW9kIHsKKwlGU19GVF9PUF9NT0RfTk9STUFMLAorCUZTX0ZUX09QX01PRF9MQUdfREVNVVgsCiB9OwogCiBlbnVtIGZzX2Z0ZV9zdGF0dXMgewpAQCAtNjEsNiArNjgsOCBAQAogCXN0cnVjdCBtbHg1X2Zsb3dfcm9vdF9uYW1lc3BhY2UgKmZkYl9yb290X25zOwogCXN0cnVjdCBtbHg1X2Zsb3dfcm9vdF9uYW1lc3BhY2UgKmVzd19lZ3Jlc3Nfcm9vdF9uczsKIAlzdHJ1Y3QgbWx4NV9mbG93X3Jvb3RfbmFtZXNwYWNlICplc3dfaW5ncmVzc19yb290X25zOworCXN0cnVjdCBtbHg1X2Zsb3dfcm9vdF9uYW1lc3BhY2UJKnNuaWZmZXJfdHhfcm9vdF9uczsKKwlzdHJ1Y3QgbWx4NV9mbG93X3Jvb3RfbmFtZXNwYWNlCSpzbmlmZmVyX3J4X3Jvb3RfbnM7CiB9OwogCiBzdHJ1Y3QgZnNfbm9kZSB7CkBAIC05Myw2ICsxMDIsNyBAQAogCXVuc2lnbmVkIGludAkJCW1heF9mdGU7CiAJdW5zaWduZWQgaW50CQkJbGV2ZWw7CiAJZW51bSBmc19mbG93X3RhYmxlX3R5cGUJCXR5cGU7CisJZW51bSBmc19mbG93X3RhYmxlX29wX21vZAlvcF9tb2Q7CiAJc3RydWN0IHsKIAkJYm9vbAkJCWFjdGl2ZTsKIAkJdW5zaWduZWQgaW50CQlyZXF1aXJlZF9ncm91cHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZnNfY291bnRlcnMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mc19jb3VudGVycy5jCmluZGV4IGMyODc3ZTkuLjNhOTE5NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mc19jb3VudGVycy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mc19jb3VudGVycy5jCkBAIC0xMjYsMTIgKzEyNiwyMSBAQAogCWZvciAobm9kZSA9ICZmaXJzdC0+bm9kZTsgbm9kZTsgbm9kZSA9IHJiX25leHQobm9kZSkpIHsKIAkJc3RydWN0IG1seDVfZmMgKmNvdW50ZXIgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgbWx4NV9mYywgbm9kZSk7CiAJCXN0cnVjdCBtbHg1X2ZjX2NhY2hlICpjID0gJmNvdW50ZXItPmNhY2hlOworCQl1NjQgcGFja2V0czsKKwkJdTY0IGJ5dGVzOwogCiAJCWlmIChjb3VudGVyLT5pZCA+IGxhc3RfaWQpCiAJCQlicmVhazsKIAogCQltbHg1X2NtZF9mY19idWxrX2dldChkZXYsIGIsCi0JCQkJICAgICBjb3VudGVyLT5pZCwgJmMtPnBhY2tldHMsICZjLT5ieXRlcyk7CisJCQkJICAgICBjb3VudGVyLT5pZCwgJnBhY2tldHMsICZieXRlcyk7CisKKwkJaWYgKGMtPnBhY2tldHMgPT0gcGFja2V0cykKKwkJCWNvbnRpbnVlOworCisJCWMtPnBhY2tldHMgPSBwYWNrZXRzOworCQljLT5ieXRlcyA9IGJ5dGVzOworCQljLT5sYXN0dXNlID0gamlmZmllczsKIAl9CiAKIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mdy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2Z3LmMKaW5kZXggNzdmYzFhYS4uNTcxOGFhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2Z3LmMKQEAgLTM4LDEzICszOCwxMCBAQAogc3RhdGljIGludCBtbHg1X2NtZF9xdWVyeV9hZGFwdGVyKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiAqb3V0LAogCQkJCSAgaW50IG91dGxlbikKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9hZGFwdGVyX2luKV07Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X2FkYXB0ZXJfaW4pXSA9IHswfTsKIAogCU1MWDVfU0VUKHF1ZXJ5X2FkYXB0ZXJfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX1FVRVJZX0FEQVBURVIpOwotCi0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIG91dGxlbik7CiB9CiAKIGludCBtbHg1X3F1ZXJ5X2JvYXJkX2lkKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCkBAIC0xNjIsMzggKzE1OSwxOCBAQAogCiBpbnQgbWx4NV9jbWRfaW5pdF9oY2Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgbWx4NV9jbWRfaW5pdF9oY2FfbWJveF9pbiBpbjsKLQlzdHJ1Y3QgbWx4NV9jbWRfaW5pdF9oY2FfbWJveF9vdXQgb3V0OwotCWludCBlcnI7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGluaXRfaGNhX291dCldID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGluaXRfaGNhX2luKV0gICA9IHswfTsKIAotCW1lbXNldCgmaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldCgmb3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JaW4uaGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX0lOSVRfSENBKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCAmb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmIChvdXQuaGRyLnN0YXR1cykKLQkJZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0KLQlyZXR1cm4gZXJyOworCU1MWDVfU0VUKGluaXRfaGNhX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9JTklUX0hDQSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIGludCBtbHg1X2NtZF90ZWFyZG93bl9oY2Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgbWx4NV9jbWRfdGVhcmRvd25faGNhX21ib3hfaW4gaW47Ci0Jc3RydWN0IG1seDVfY21kX3RlYXJkb3duX2hjYV9tYm94X291dCBvdXQ7Ci0JaW50IGVycjsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcodGVhcmRvd25faGNhX291dCldID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHRlYXJkb3duX2hjYV9pbildICAgPSB7MH07CiAKLQltZW1zZXQoJmluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9URUFSRE9XTl9IQ0EpOwotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCAmaW4sIHNpemVvZihpbiksICZvdXQsIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKG91dC5oZHIuc3RhdHVzKQotCQllcnIgPSBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQuaGRyKTsKLQotCXJldHVybiBlcnI7CisJTUxYNV9TRVQodGVhcmRvd25faGNhX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9URUFSRE9XTl9IQ0EpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2xhZy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2xhZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OTU3MjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbGFnLmMKQEAgLTAsMCArMSw1ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tbHg1L2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21seDUvdnBvcnQuaD4KKyNpbmNsdWRlICJtbHg1X2NvcmUuaCIKKworZW51bSB7CisJTUxYNV9MQUdfRkxBR19CT05ERUQgPSAxIDw8IDAsCit9OworCitzdHJ1Y3QgbGFnX2Z1bmMgeworCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgICAgKm5ldGRldjsKK307CisKKy8qIFVzZWQgZm9yIGNvbGxlY3Rpb24gb2YgbmV0ZGV2IGV2ZW50IGluZm8uICovCitzdHJ1Y3QgbGFnX3RyYWNrZXIgeworCWVudW0gICBuZXRkZXZfbGFnX3R4X3R5cGUgICAgICAgICAgIHR4X3R5cGU7CisJc3RydWN0IG5ldGRldl9sYWdfbG93ZXJfc3RhdGVfaW5mbyAgbmV0ZGV2X3N0YXRlW01MWDVfTUFYX1BPUlRTXTsKKwlib29sIGlzX2JvbmRlZDsKK307CisKKy8qIExBRyBkYXRhIG9mIGEgQ29ubmVjdFggY2FyZC4KKyAqIEl0IHNlcnZlcyBib3RoIGl0cyBwaHlzIGZ1bmN0aW9ucy4KKyAqLworc3RydWN0IG1seDVfbGFnIHsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOworCXU4ICAgICAgICAgICAgICAgICAgICAgICAgdjJwX21hcFtNTFg1X01BWF9QT1JUU107CisJc3RydWN0IGxhZ19mdW5jICAgICAgICAgICBwZltNTFg1X01BWF9QT1JUU107CisJc3RydWN0IGxhZ190cmFja2VyICAgICAgICB0cmFja2VyOworCXN0cnVjdCBkZWxheWVkX3dvcmsgICAgICAgYm9uZF93b3JrOworCXN0cnVjdCBub3RpZmllcl9ibG9jayAgICAgbmI7Cit9OworCisvKiBHZW5lcmFsIHB1cnBvc2UsIHVzZSBmb3Igc2hvcnQgcGVyaW9kcyBvZiB0aW1lLgorICogQmV3YXJlIG9mIGxvY2sgZGVwZW5kZW5jaWVzIChwcmVmZXJhYmx5LCBubyBsb2NrcyBzaG91bGQgYmUgYWNxdWlyZWQKKyAqIHVuZGVyIGl0KS4KKyAqLworc3RhdGljIERFRklORV9NVVRFWChsYWdfbXV0ZXgpOworCitzdGF0aWMgaW50IG1seDVfY21kX2NyZWF0ZV9sYWcoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTggcmVtYXBfcG9ydDEsCisJCQkgICAgICAgdTggcmVtYXBfcG9ydDIpCit7CisJdTMyICAgaW5bTUxYNV9TVF9TWl9EVyhjcmVhdGVfbGFnX2luKV0gICA9IHswfTsKKwl1MzIgICBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfbGFnX291dCldID0gezB9OworCXZvaWQgKmxhZ19jdHggPSBNTFg1X0FERFJfT0YoY3JlYXRlX2xhZ19pbiwgaW4sIGN0eCk7CisKKwlNTFg1X1NFVChjcmVhdGVfbGFnX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9DUkVBVEVfTEFHKTsKKworCU1MWDVfU0VUKGxhZ2MsIGxhZ19jdHgsIHR4X3JlbWFwX2FmZmluaXR5XzEsIHJlbWFwX3BvcnQxKTsKKwlNTFg1X1NFVChsYWdjLCBsYWdfY3R4LCB0eF9yZW1hcF9hZmZpbml0eV8yLCByZW1hcF9wb3J0Mik7CisKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKK30KKworc3RhdGljIGludCBtbHg1X2NtZF9tb2RpZnlfbGFnKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHU4IHJlbWFwX3BvcnQxLAorCQkJICAgICAgIHU4IHJlbWFwX3BvcnQyKQoreworCXUzMiAgIGluW01MWDVfU1RfU1pfRFcobW9kaWZ5X2xhZ19pbildICAgPSB7MH07CisJdTMyICAgb3V0W01MWDVfU1RfU1pfRFcobW9kaWZ5X2xhZ19vdXQpXSA9IHswfTsKKwl2b2lkICpsYWdfY3R4ID0gTUxYNV9BRERSX09GKG1vZGlmeV9sYWdfaW4sIGluLCBjdHgpOworCisJTUxYNV9TRVQobW9kaWZ5X2xhZ19pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfTU9ESUZZX0xBRyk7CisJTUxYNV9TRVQobW9kaWZ5X2xhZ19pbiwgaW4sIGZpZWxkX3NlbGVjdCwgMHgxKTsKKworCU1MWDVfU0VUKGxhZ2MsIGxhZ19jdHgsIHR4X3JlbWFwX2FmZmluaXR5XzEsIHJlbWFwX3BvcnQxKTsKKwlNTFg1X1NFVChsYWdjLCBsYWdfY3R4LCB0eF9yZW1hcF9hZmZpbml0eV8yLCByZW1hcF9wb3J0Mik7CisKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKK30KKworc3RhdGljIGludCBtbHg1X2NtZF9kZXN0cm95X2xhZyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCXUzMiAgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X2xhZ19pbildICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV9sYWdfb3V0KV0gPSB7MH07CisKKwlNTFg1X1NFVChkZXN0cm95X2xhZ19pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfREVTVFJPWV9MQUcpOworCisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7Cit9CisKK2ludCBtbHg1X2NtZF9jcmVhdGVfdnBvcnRfbGFnKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCit7CisJdTMyICBpbltNTFg1X1NUX1NaX0RXKGNyZWF0ZV92cG9ydF9sYWdfaW4pXSAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGNyZWF0ZV92cG9ydF9sYWdfb3V0KV0gPSB7MH07CisKKwlNTFg1X1NFVChjcmVhdGVfdnBvcnRfbGFnX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9DUkVBVEVfVlBPUlRfTEFHKTsKKworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOworfQorRVhQT1JUX1NZTUJPTChtbHg1X2NtZF9jcmVhdGVfdnBvcnRfbGFnKTsKKworaW50IG1seDVfY21kX2Rlc3Ryb3lfdnBvcnRfbGFnKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCit7CisJdTMyICBpbltNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfdnBvcnRfbGFnX2luKV0gID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZXN0cm95X3Zwb3J0X2xhZ19vdXQpXSA9IHswfTsKKworCU1MWDVfU0VUKGRlc3Ryb3lfdnBvcnRfbGFnX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9ERVNUUk9ZX1ZQT1JUX0xBRyk7CisKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKK30KK0VYUE9SVF9TWU1CT0wobWx4NV9jbWRfZGVzdHJveV92cG9ydF9sYWcpOworCitzdGF0aWMgc3RydWN0IG1seDVfbGFnICptbHg1X2xhZ19kZXZfZ2V0KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCit7CisJcmV0dXJuIGRldi0+cHJpdi5sYWc7Cit9CisKK3N0YXRpYyBpbnQgbWx4NV9sYWdfZGV2X2dldF9uZXRkZXZfaWR4KHN0cnVjdCBtbHg1X2xhZyAqbGRldiwKKwkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUxYNV9NQVhfUE9SVFM7IGkrKykKKwkJaWYgKGxkZXYtPnBmW2ldLm5ldGRldiA9PSBuZGV2KQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBib29sIG1seDVfbGFnX2lzX2JvbmRlZChzdHJ1Y3QgbWx4NV9sYWcgKmxkZXYpCit7CisJcmV0dXJuICEhKGxkZXYtPmZsYWdzICYgTUxYNV9MQUdfRkxBR19CT05ERUQpOworfQorCitzdGF0aWMgdm9pZCBtbHg1X2luZmVyX3R4X2FmZmluaXR5X21hcHBpbmcoc3RydWN0IGxhZ190cmFja2VyICp0cmFja2VyLAorCQkJCQkgICB1OCAqcG9ydDEsIHU4ICpwb3J0MikKK3sKKwlpZiAodHJhY2tlci0+dHhfdHlwZSA9PSBORVRERVZfTEFHX1RYX1RZUEVfQUNUSVZFQkFDS1VQKSB7CisJCWlmICh0cmFja2VyLT5uZXRkZXZfc3RhdGVbMF0udHhfZW5hYmxlZCkgeworCQkJKnBvcnQxID0gMTsKKwkJCSpwb3J0MiA9IDE7CisJCX0gZWxzZSB7CisJCQkqcG9ydDEgPSAyOworCQkJKnBvcnQyID0gMjsKKwkJfQorCX0gZWxzZSB7CisJCSpwb3J0MSA9IDE7CisJCSpwb3J0MiA9IDI7CisJCWlmICghdHJhY2tlci0+bmV0ZGV2X3N0YXRlWzBdLmxpbmtfdXApCisJCQkqcG9ydDEgPSAyOworCQllbHNlIGlmICghdHJhY2tlci0+bmV0ZGV2X3N0YXRlWzFdLmxpbmtfdXApCisJCQkqcG9ydDIgPSAxOworCX0KK30KKworc3RhdGljIHZvaWQgbWx4NV9hY3RpdmF0ZV9sYWcoc3RydWN0IG1seDVfbGFnICpsZGV2LAorCQkJICAgICAgc3RydWN0IGxhZ190cmFja2VyICp0cmFja2VyKQoreworCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYwID0gbGRldi0+cGZbMF0uZGV2OworCWludCBlcnI7CisKKwlsZGV2LT5mbGFncyB8PSBNTFg1X0xBR19GTEFHX0JPTkRFRDsKKworCW1seDVfaW5mZXJfdHhfYWZmaW5pdHlfbWFwcGluZyh0cmFja2VyLCAmbGRldi0+djJwX21hcFswXSwKKwkJCQkgICAgICAgJmxkZXYtPnYycF9tYXBbMV0pOworCisJZXJyID0gbWx4NV9jbWRfY3JlYXRlX2xhZyhkZXYwLCBsZGV2LT52MnBfbWFwWzBdLCBsZGV2LT52MnBfbWFwWzFdKTsKKwlpZiAoZXJyKQorCQltbHg1X2NvcmVfZXJyKGRldjAsCisJCQkgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBMQUcgKCVkKVxuIiwKKwkJCSAgICAgIGVycik7Cit9CisKK3N0YXRpYyB2b2lkIG1seDVfZGVhY3RpdmF0ZV9sYWcoc3RydWN0IG1seDVfbGFnICpsZGV2KQoreworCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYwID0gbGRldi0+cGZbMF0uZGV2OworCWludCBlcnI7CisKKwlsZGV2LT5mbGFncyAmPSB+TUxYNV9MQUdfRkxBR19CT05ERUQ7CisKKwllcnIgPSBtbHg1X2NtZF9kZXN0cm95X2xhZyhkZXYwKTsKKwlpZiAoZXJyKQorCQltbHg1X2NvcmVfZXJyKGRldjAsCisJCQkgICAgICAiRmFpbGVkIHRvIGRlc3Ryb3kgTEFHICglZClcbiIsCisJCQkgICAgICBlcnIpOworfQorCitzdGF0aWMgdm9pZCBtbHg1X2RvX2JvbmQoc3RydWN0IG1seDVfbGFnICpsZGV2KQoreworCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYwID0gbGRldi0+cGZbMF0uZGV2OworCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYxID0gbGRldi0+cGZbMV0uZGV2OworCXN0cnVjdCBsYWdfdHJhY2tlciB0cmFja2VyOworCXU4IHYycF9wb3J0MSwgdjJwX3BvcnQyOworCWludCBpLCBlcnI7CisKKwlpZiAoIWRldjAgfHwgIWRldjEpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmxhZ19tdXRleCk7CisJdHJhY2tlciA9IGxkZXYtPnRyYWNrZXI7CisJbXV0ZXhfdW5sb2NrKCZsYWdfbXV0ZXgpOworCisJaWYgKHRyYWNrZXIuaXNfYm9uZGVkICYmICFtbHg1X2xhZ19pc19ib25kZWQobGRldikpIHsKKwkJaWYgKG1seDVfc3Jpb3ZfaXNfZW5hYmxlZChkZXYwKSB8fAorCQkgICAgbWx4NV9zcmlvdl9pc19lbmFibGVkKGRldjEpKSB7CisJCQltbHg1X2NvcmVfd2FybihkZXYwLCAiTEFHIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBTUklPViIpOworCQkJcmV0dXJuOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IE1MWDVfTUFYX1BPUlRTOyBpKyspCisJCQltbHg1X3JlbW92ZV9kZXZfYnlfcHJvdG9jb2wobGRldi0+cGZbaV0uZGV2LAorCQkJCQkJICAgIE1MWDVfSU5URVJGQUNFX1BST1RPQ09MX0lCKTsKKworCQltbHg1X2FjdGl2YXRlX2xhZyhsZGV2LCAmdHJhY2tlcik7CisKKwkJbWx4NV9hZGRfZGV2X2J5X3Byb3RvY29sKGRldjAsIE1MWDVfSU5URVJGQUNFX1BST1RPQ09MX0lCKTsKKwkJbWx4NV9uaWNfdnBvcnRfZW5hYmxlX3JvY2UoZGV2MSk7CisJfSBlbHNlIGlmICh0cmFja2VyLmlzX2JvbmRlZCAmJiBtbHg1X2xhZ19pc19ib25kZWQobGRldikpIHsKKwkJbWx4NV9pbmZlcl90eF9hZmZpbml0eV9tYXBwaW5nKCZ0cmFja2VyLCAmdjJwX3BvcnQxLAorCQkJCQkgICAgICAgJnYycF9wb3J0Mik7CisKKwkJaWYgKCh2MnBfcG9ydDEgIT0gbGRldi0+djJwX21hcFswXSkgfHwKKwkJICAgICh2MnBfcG9ydDIgIT0gbGRldi0+djJwX21hcFsxXSkpIHsKKwkJCWxkZXYtPnYycF9tYXBbMF0gPSB2MnBfcG9ydDE7CisJCQlsZGV2LT52MnBfbWFwWzFdID0gdjJwX3BvcnQyOworCisJCQllcnIgPSBtbHg1X2NtZF9tb2RpZnlfbGFnKGRldjAsIHYycF9wb3J0MSwgdjJwX3BvcnQyKTsKKwkJCWlmIChlcnIpCisJCQkJbWx4NV9jb3JlX2VycihkZXYwLAorCQkJCQkgICAgICAiRmFpbGVkIHRvIG1vZGlmeSBMQUcgKCVkKVxuIiwKKwkJCQkJICAgICAgZXJyKTsKKwkJfQorCX0gZWxzZSBpZiAoIXRyYWNrZXIuaXNfYm9uZGVkICYmIG1seDVfbGFnX2lzX2JvbmRlZChsZGV2KSkgeworCQltbHg1X3JlbW92ZV9kZXZfYnlfcHJvdG9jb2woZGV2MCwgTUxYNV9JTlRFUkZBQ0VfUFJPVE9DT0xfSUIpOworCQltbHg1X25pY192cG9ydF9kaXNhYmxlX3JvY2UoZGV2MSk7CisKKwkJbWx4NV9kZWFjdGl2YXRlX2xhZyhsZGV2KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTUxYNV9NQVhfUE9SVFM7IGkrKykKKwkJCWlmIChsZGV2LT5wZltpXS5kZXYpCisJCQkJbWx4NV9hZGRfZGV2X2J5X3Byb3RvY29sKGxkZXYtPnBmW2ldLmRldiwKKwkJCQkJCQkgTUxYNV9JTlRFUkZBQ0VfUFJPVE9DT0xfSUIpOworCX0KK30KKworc3RhdGljIHZvaWQgbWx4NV9xdWV1ZV9ib25kX3dvcmsoc3RydWN0IG1seDVfbGFnICpsZGV2LCB1bnNpZ25lZCBsb25nIGRlbGF5KQoreworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbGRldi0+Ym9uZF93b3JrLCBkZWxheSk7Cit9CisKK3N0YXRpYyB2b2lkIG1seDVfZG9fYm9uZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkZWxheWVkX3dvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7CisJc3RydWN0IG1seDVfbGFnICpsZGV2ID0gY29udGFpbmVyX29mKGRlbGF5ZWRfd29yaywgc3RydWN0IG1seDVfbGFnLAorCQkJCQkgICAgIGJvbmRfd29yayk7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IG1seDVfZGV2X2xpc3RfdHJ5bG9jaygpOworCWlmICghc3RhdHVzKSB7CisJCS8qIDEgc2VjIGRlbGF5LiAqLworCQltbHg1X3F1ZXVlX2JvbmRfd29yayhsZGV2LCBIWik7CisJCXJldHVybjsKKwl9CisKKwltbHg1X2RvX2JvbmQobGRldik7CisJbWx4NV9kZXZfbGlzdF91bmxvY2soKTsKK30KKworc3RhdGljIGludCBtbHg1X2hhbmRsZV9jaGFuZ2V1cHBlcl9ldmVudChzdHJ1Y3QgbWx4NV9sYWcgKmxkZXYsCisJCQkJCSBzdHJ1Y3QgbGFnX3RyYWNrZXIgKnRyYWNrZXIsCisJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCQkJIHN0cnVjdCBuZXRkZXZfbm90aWZpZXJfY2hhbmdldXBwZXJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqdXBwZXIgPSBpbmZvLT51cHBlcl9kZXYsICpuZGV2X3RtcDsKKwlzdHJ1Y3QgbmV0ZGV2X2xhZ191cHBlcl9pbmZvICpsYWdfdXBwZXJfaW5mbzsKKwlib29sIGlzX2JvbmRlZDsKKwlpbnQgYm9uZF9zdGF0dXMgPSAwOworCWludCBudW1fc2xhdmVzID0gMDsKKwlpbnQgaWR4OworCisJaWYgKCFuZXRpZl9pc19sYWdfbWFzdGVyKHVwcGVyKSkKKwkJcmV0dXJuIDA7CisKKwlsYWdfdXBwZXJfaW5mbyA9IGluZm8tPnVwcGVyX2luZm87CisKKwkvKiBUaGUgZXZlbnQgbWF5IHN0aWxsIGJlIG9mIGludGVyZXN0IGlmIHRoZSBzbGF2ZSBkb2VzIG5vdCBiZWxvbmcgdG8KKwkgKiB1cywgYnV0IGlzIGVuc2xhdmVkIHRvIGEgbWFzdGVyIHdoaWNoIGhhcyBvbmUgb3IgbW9yZSBvZiBvdXIgbmV0ZGV2cworCSAqIGFzIHNsYXZlcyAoZS5nLiwgaWYgYSBuZXcgc2xhdmUgaXMgYWRkZWQgdG8gYSBtYXN0ZXIgdGhhdCBib25kcyB0d28KKwkgKiBvZiBvdXIgbmV0ZGV2cywgd2Ugc2hvdWxkIHVuYm9uZCkuCisJICovCisJcmN1X3JlYWRfbG9jaygpOworCWZvcl9lYWNoX25ldGRldl9pbl9ib25kX3JjdSh1cHBlciwgbmRldl90bXApIHsKKwkJaWR4ID0gbWx4NV9sYWdfZGV2X2dldF9uZXRkZXZfaWR4KGxkZXYsIG5kZXZfdG1wKTsKKwkJaWYgKGlkeCA+IC0xKQorCQkJYm9uZF9zdGF0dXMgfD0gKDEgPDwgaWR4KTsKKworCQludW1fc2xhdmVzKys7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJLyogTm9uZSBvZiB0aGlzIGxhZ2RldidzIG5ldGRldnMgYXJlIHNsYXZlcyBvZiB0aGlzIG1hc3Rlci4gKi8KKwlpZiAoIShib25kX3N0YXR1cyAmIDB4MykpCisJCXJldHVybiAwOworCisJaWYgKGxhZ191cHBlcl9pbmZvKQorCQl0cmFja2VyLT50eF90eXBlID0gbGFnX3VwcGVyX2luZm8tPnR4X3R5cGU7CisKKwkvKiBEZXRlcm1pbmUgYm9uZGluZyBzdGF0dXM6CisJICogQSBkZXZpY2UgaXMgY29uc2lkZXJlZCBib25kZWQgaWYgYm90aCBpdHMgcGh5c2ljYWwgcG9ydHMgYXJlIHNsYXZlcworCSAqIG9mIHRoZSBzYW1lIGxhZyBtYXN0ZXIsIGFuZCBvbmx5IHRoZW0uCisJICogTGFnIG1vZGUgbXVzdCBiZSBhY3RpdmViYWNrdXAgb3IgaGFzaC4KKwkgKi8KKwlpc19ib25kZWQgPSAobnVtX3NsYXZlcyA9PSBNTFg1X01BWF9QT1JUUykgJiYKKwkJICAgIChib25kX3N0YXR1cyA9PSAweDMpICYmCisJCSAgICAoKHRyYWNrZXItPnR4X3R5cGUgPT0gTkVUREVWX0xBR19UWF9UWVBFX0FDVElWRUJBQ0tVUCkgfHwKKwkJICAgICAodHJhY2tlci0+dHhfdHlwZSA9PSBORVRERVZfTEFHX1RYX1RZUEVfSEFTSCkpOworCisJaWYgKHRyYWNrZXItPmlzX2JvbmRlZCAhPSBpc19ib25kZWQpIHsKKwkJdHJhY2tlci0+aXNfYm9uZGVkID0gaXNfYm9uZGVkOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtbHg1X2hhbmRsZV9jaGFuZ2Vsb3dlcnN0YXRlX2V2ZW50KHN0cnVjdCBtbHg1X2xhZyAqbGRldiwKKwkJCQkJICAgICAgc3RydWN0IGxhZ190cmFja2VyICp0cmFja2VyLAorCQkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCQkJICAgICAgc3RydWN0IG5ldGRldl9ub3RpZmllcl9jaGFuZ2Vsb3dlcnN0YXRlX2luZm8gKmluZm8pCit7CisJc3RydWN0IG5ldGRldl9sYWdfbG93ZXJfc3RhdGVfaW5mbyAqbGFnX2xvd2VyX2luZm87CisJaW50IGlkeDsKKworCWlmICghbmV0aWZfaXNfbGFnX3BvcnQobmRldikpCisJCXJldHVybiAwOworCisJaWR4ID0gbWx4NV9sYWdfZGV2X2dldF9uZXRkZXZfaWR4KGxkZXYsIG5kZXYpOworCWlmIChpZHggPT0gLTEpCisJCXJldHVybiAwOworCisJLyogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGRldGVybWluZSB2aXJ0dWFsIHRvIHBoeXNpY2FsCisJICogcG9ydCBtYXBwaW5nLgorCSAqLworCWxhZ19sb3dlcl9pbmZvID0gaW5mby0+bG93ZXJfc3RhdGVfaW5mbzsKKwlpZiAoIWxhZ19sb3dlcl9pbmZvKQorCQlyZXR1cm4gMDsKKworCXRyYWNrZXItPm5ldGRldl9zdGF0ZVtpZHhdID0gKmxhZ19sb3dlcl9pbmZvOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWx4NV9sYWdfbmV0ZGV2X2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKKwkJCQkgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gbmV0ZGV2X25vdGlmaWVyX2luZm9fdG9fZGV2KHB0cik7CisJc3RydWN0IGxhZ190cmFja2VyIHRyYWNrZXI7CisJc3RydWN0IG1seDVfbGFnICpsZGV2OworCWludCBjaGFuZ2VkID0gMDsKKworCWlmICghbmV0X2VxKGRldl9uZXQobmRldiksICZpbml0X25ldCkpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCWlmICgoZXZlbnQgIT0gTkVUREVWX0NIQU5HRVVQUEVSKSAmJiAoZXZlbnQgIT0gTkVUREVWX0NIQU5HRUxPV0VSU1RBVEUpKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwlsZGV2ICAgID0gY29udGFpbmVyX29mKHRoaXMsIHN0cnVjdCBtbHg1X2xhZywgbmIpOworCXRyYWNrZXIgPSBsZGV2LT50cmFja2VyOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX0NIQU5HRVVQUEVSOgorCQljaGFuZ2VkID0gbWx4NV9oYW5kbGVfY2hhbmdldXBwZXJfZXZlbnQobGRldiwgJnRyYWNrZXIsIG5kZXYsCisJCQkJCQkJcHRyKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfQ0hBTkdFTE9XRVJTVEFURToKKwkJY2hhbmdlZCA9IG1seDVfaGFuZGxlX2NoYW5nZWxvd2Vyc3RhdGVfZXZlbnQobGRldiwgJnRyYWNrZXIsCisJCQkJCQkJICAgICBuZGV2LCBwdHIpOworCQlicmVhazsKKwl9CisKKwltdXRleF9sb2NrKCZsYWdfbXV0ZXgpOworCWxkZXYtPnRyYWNrZXIgPSB0cmFja2VyOworCW11dGV4X3VubG9jaygmbGFnX211dGV4KTsKKworCWlmIChjaGFuZ2VkKQorCQltbHg1X3F1ZXVlX2JvbmRfd29yayhsZGV2LCAwKTsKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBtbHg1X2xhZyAqbWx4NV9sYWdfZGV2X2FsbG9jKHZvaWQpCit7CisJc3RydWN0IG1seDVfbGFnICpsZGV2OworCisJbGRldiA9IGt6YWxsb2Moc2l6ZW9mKCpsZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZsZGV2LT5ib25kX3dvcmssIG1seDVfZG9fYm9uZF93b3JrKTsKKworCXJldHVybiBsZGV2OworfQorCitzdGF0aWMgdm9pZCBtbHg1X2xhZ19kZXZfZnJlZShzdHJ1Y3QgbWx4NV9sYWcgKmxkZXYpCit7CisJa2ZyZWUobGRldik7Cit9CisKK3N0YXRpYyB2b2lkIG1seDVfbGFnX2Rldl9hZGRfcGYoc3RydWN0IG1seDVfbGFnICpsZGV2LAorCQkJCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwl1bnNpZ25lZCBpbnQgZm4gPSBQQ0lfRlVOQyhkZXYtPnBkZXYtPmRldmZuKTsKKworCWlmIChmbiA+PSBNTFg1X01BWF9QT1JUUykKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmbGFnX211dGV4KTsKKwlsZGV2LT5wZltmbl0uZGV2ICAgID0gZGV2OworCWxkZXYtPnBmW2ZuXS5uZXRkZXYgPSBuZXRkZXY7CisJbGRldi0+dHJhY2tlci5uZXRkZXZfc3RhdGVbZm5dLmxpbmtfdXAgPSAwOworCWxkZXYtPnRyYWNrZXIubmV0ZGV2X3N0YXRlW2ZuXS50eF9lbmFibGVkID0gMDsKKworCWRldi0+cHJpdi5sYWcgPSBsZGV2OworCW11dGV4X3VubG9jaygmbGFnX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgbWx4NV9sYWdfZGV2X3JlbW92ZV9wZihzdHJ1Y3QgbWx4NV9sYWcgKmxkZXYsCisJCQkJICAgc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNTFg1X01BWF9QT1JUUzsgaSsrKQorCQlpZiAobGRldi0+cGZbaV0uZGV2ID09IGRldikKKwkJCWJyZWFrOworCisJaWYgKGkgPT0gTUxYNV9NQVhfUE9SVFMpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmxhZ19tdXRleCk7CisJbWVtc2V0KCZsZGV2LT5wZltpXSwgMCwgc2l6ZW9mKCpsZGV2LT5wZikpOworCisJZGV2LT5wcml2LmxhZyA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZsYWdfbXV0ZXgpOworfQorCisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggaW50Zl9tdXRleCBoZWxkICovCit2b2lkIG1seDVfbGFnX2FkZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBtbHg1X2xhZyAqbGRldiA9IE5VTEw7CisJc3RydWN0IG1seDVfY29yZV9kZXYgKnRtcF9kZXY7CisKKwlpZiAoIU1MWDVfQ0FQX0dFTihkZXYsIHZwb3J0X2dyb3VwX21hbmFnZXIpIHx8CisJICAgICFNTFg1X0NBUF9HRU4oZGV2LCBsYWdfbWFzdGVyKSB8fAorCSAgICAoTUxYNV9DQVBfR0VOKGRldiwgbnVtX2xhZ19wb3J0cykgIT0gTUxYNV9NQVhfUE9SVFMpKQorCQlyZXR1cm47CisKKwl0bXBfZGV2ID0gbWx4NV9nZXRfbmV4dF9waHlzX2RldihkZXYpOworCWlmICh0bXBfZGV2KQorCQlsZGV2ID0gdG1wX2Rldi0+cHJpdi5sYWc7CisKKwlpZiAoIWxkZXYpIHsKKwkJbGRldiA9IG1seDVfbGFnX2Rldl9hbGxvYygpOworCQlpZiAoIWxkZXYpIHsKKwkJCW1seDVfY29yZV9lcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jIGxhZyBkZXZcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJbWx4NV9sYWdfZGV2X2FkZF9wZihsZGV2LCBkZXYsIG5ldGRldik7CisKKwlpZiAoIWxkZXYtPm5iLm5vdGlmaWVyX2NhbGwpIHsKKwkJbGRldi0+bmIubm90aWZpZXJfY2FsbCA9IG1seDVfbGFnX25ldGRldl9ldmVudDsKKwkJaWYgKHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbGRldi0+bmIpKSB7CisJCQlsZGV2LT5uYi5ub3RpZmllcl9jYWxsID0gTlVMTDsKKwkJCW1seDVfY29yZV9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIExBRyBuZXRkZXYgbm90aWZpZXJcbiIpOworCQl9CisJfQorfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGludGZfbXV0ZXggaGVsZCAqLwordm9pZCBtbHg1X2xhZ19yZW1vdmUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbWx4NV9sYWcgKmxkZXY7CisJaW50IGk7CisKKwlsZGV2ID0gbWx4NV9sYWdfZGV2X2dldChkZXYpOworCWlmICghbGRldikKKwkJcmV0dXJuOworCisJaWYgKG1seDVfbGFnX2lzX2JvbmRlZChsZGV2KSkKKwkJbWx4NV9kZWFjdGl2YXRlX2xhZyhsZGV2KTsKKworCW1seDVfbGFnX2Rldl9yZW1vdmVfcGYobGRldiwgZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBNTFg1X01BWF9QT1JUUzsgaSsrKQorCQlpZiAobGRldi0+cGZbaV0uZGV2KQorCQkJYnJlYWs7CisKKwlpZiAoaSA9PSBNTFg1X01BWF9QT1JUUykgeworCQlpZiAobGRldi0+bmIubm90aWZpZXJfY2FsbCkKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZsZGV2LT5uYik7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbGRldi0+Ym9uZF93b3JrKTsKKwkJbWx4NV9sYWdfZGV2X2ZyZWUobGRldik7CisJfQorfQorCitib29sIG1seDVfbGFnX2lzX2FjdGl2ZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCXN0cnVjdCBtbHg1X2xhZyAqbGRldjsKKwlib29sIHJlczsKKworCW11dGV4X2xvY2soJmxhZ19tdXRleCk7CisJbGRldiA9IG1seDVfbGFnX2Rldl9nZXQoZGV2KTsKKwlyZXMgID0gbGRldiAmJiBtbHg1X2xhZ19pc19ib25kZWQobGRldik7CisJbXV0ZXhfdW5sb2NrKCZsYWdfbXV0ZXgpOworCisJcmV0dXJuIHJlczsKK30KK0VYUE9SVF9TWU1CT0wobWx4NV9sYWdfaXNfYWN0aXZlKTsKKworc3RydWN0IG5ldF9kZXZpY2UgKm1seDVfbGFnX2dldF9yb2NlX25ldGRldihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgbWx4NV9sYWcgKmxkZXY7CisKKwltdXRleF9sb2NrKCZsYWdfbXV0ZXgpOworCWxkZXYgPSBtbHg1X2xhZ19kZXZfZ2V0KGRldik7CisKKwlpZiAoIShsZGV2ICYmIG1seDVfbGFnX2lzX2JvbmRlZChsZGV2KSkpCisJCWdvdG8gdW5sb2NrOworCisJaWYgKGxkZXYtPnRyYWNrZXIudHhfdHlwZSA9PSBORVRERVZfTEFHX1RYX1RZUEVfQUNUSVZFQkFDS1VQKSB7CisJCW5kZXYgPSBsZGV2LT50cmFja2VyLm5ldGRldl9zdGF0ZVswXS50eF9lbmFibGVkID8KKwkJICAgICAgIGxkZXYtPnBmWzBdLm5ldGRldiA6IGxkZXYtPnBmWzFdLm5ldGRldjsKKwl9IGVsc2UgeworCQluZGV2ID0gbGRldi0+cGZbMF0ubmV0ZGV2OworCX0KKwlpZiAobmRldikKKwkJZGV2X2hvbGQobmRldik7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJmxhZ19tdXRleCk7CisKKwlyZXR1cm4gbmRldjsKK30KK0VYUE9SVF9TWU1CT0wobWx4NV9sYWdfZ2V0X3JvY2VfbmV0ZGV2KTsKKworYm9vbCBtbHg1X2xhZ19pbnRmX2FkZChzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgKmludGYsIHN0cnVjdCBtbHg1X3ByaXYgKnByaXYpCit7CisJc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiA9IGNvbnRhaW5lcl9vZihwcml2LCBzdHJ1Y3QgbWx4NV9jb3JlX2RldiwKKwkJCQkJCSBwcml2KTsKKwlzdHJ1Y3QgbWx4NV9sYWcgKmxkZXY7CisKKwlpZiAoaW50Zi0+cHJvdG9jb2wgIT0gTUxYNV9JTlRFUkZBQ0VfUFJPVE9DT0xfSUIpCisJCXJldHVybiB0cnVlOworCisJbGRldiA9IG1seDVfbGFnX2Rldl9nZXQoZGV2KTsKKwlpZiAoIWxkZXYgfHwgIW1seDVfbGFnX2lzX2JvbmRlZChsZGV2KSB8fCBsZGV2LT5wZlswXS5kZXYgPT0gZGV2KQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qIElmIGJvbmRlZCwgd2UgZG8gbm90IGFkZCBhbiBJQiBkZXZpY2UgZm9yIFBGMS4gKi8KKwlyZXR1cm4gZmFsc2U7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tYWQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tYWQuYwppbmRleCAxMzY4ZGFjLi4zYTNiMDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWFkLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21hZC5jCkBAIC0zOSwzNiArMzksMzMgQEAKIGludCBtbHg1X2NvcmVfbWFkX2lmYyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBjb25zdCB2b2lkICppbmIsIHZvaWQgKm91dGIsCiAJCSAgICAgIHUxNiBvcG1vZCwgdTggcG9ydCkKIHsKLQlzdHJ1Y3QgbWx4NV9tYWRfaWZjX21ib3hfaW4gKmluID0gTlVMTDsKLQlzdHJ1Y3QgbWx4NV9tYWRfaWZjX21ib3hfb3V0ICpvdXQgPSBOVUxMOwotCWludCBlcnI7CisJaW50IG91dGxlbiA9IE1MWDVfU1RfU1pfQllURVMobWFkX2lmY19vdXQpOworCWludCBpbmxlbiA9IE1MWDVfU1RfU1pfQllURVMobWFkX2lmY19pbik7CisJaW50IGVyciA9IC1FTk9NRU07CisJdm9pZCAqZGF0YTsKKwl2b2lkICpyZXNwOworCXUzMiAqb3V0OworCXUzMiAqaW47CiAKLQlpbiA9IGt6YWxsb2Moc2l6ZW9mKCppbiksIEdGUF9LRVJORUwpOwotCWlmICghaW4pCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jb3V0ID0ga3phbGxvYyhzaXplb2YoKm91dCksIEdGUF9LRVJORUwpOwotCWlmICghb3V0KSB7Ci0JCWVyciA9IC1FTk9NRU07CisJaW4gPSBremFsbG9jKGlubGVuLCBHRlBfS0VSTkVMKTsKKwlvdXQgPSBremFsbG9jKG91dGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbiB8fCAhb3V0KQogCQlnb3RvIG91dDsKLQl9CiAKLQlpbi0+aGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX01BRF9JRkMpOwotCWluLT5oZHIub3Btb2QgPSBjcHVfdG9fYmUxNihvcG1vZCk7Ci0JaW4tPnBvcnQgPSBwb3J0OworCU1MWDVfU0VUKG1hZF9pZmNfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX01BRF9JRkMpOworCU1MWDVfU0VUKG1hZF9pZmNfaW4sIGluLCBvcF9tb2QsIG9wbW9kKTsKKwlNTFg1X1NFVChtYWRfaWZjX2luLCBpbiwgcG9ydCwgcG9ydCk7CiAKLQltZW1jcHkoaW4tPmRhdGEsIGluYiwgc2l6ZW9mKGluLT5kYXRhKSk7CisJZGF0YSA9IE1MWDVfQUREUl9PRihtYWRfaWZjX2luLCBpbiwgbWFkKTsKKwltZW1jcHkoZGF0YSwgaW5iLCBNTFg1X0ZMRF9TWl9CWVRFUyhtYWRfaWZjX2luLCBtYWQpKTsKIAotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKCppbiksIG91dCwgc2l6ZW9mKCpvdXQpKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCBvdXQsIG91dGxlbik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQlpZiAob3V0LT5oZHIuc3RhdHVzKSB7Ci0JCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC0+aGRyKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbWVtY3B5KG91dGIsIG91dC0+ZGF0YSwgc2l6ZW9mKG91dC0+ZGF0YSkpOworCXJlc3AgPSBNTFg1X0FERFJfT0YobWFkX2lmY19vdXQsIG91dCwgcmVzcG9uc2VfbWFkX3BhY2tldCk7CisJbWVtY3B5KG91dGIsIHJlc3AsCisJICAgICAgIE1MWDVfRkxEX1NaX0JZVEVTKG1hZF9pZmNfb3V0LCByZXNwb25zZV9tYWRfcGFja2V0KSk7CiAKIG91dDoKIAlrZnJlZShvdXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tYWluLmMKaW5kZXggNGY0OTFkNC4uZDljM2M3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWFpbi5jCkBAIC03MiwxNiArNzIsNiBAQAogbW9kdWxlX3BhcmFtX25hbWVkKHByb2Zfc2VsLCBwcm9mX3NlbCwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocHJvZl9zZWwsICJwcm9maWxlIHNlbGVjdG9yLiBWYWxpZCByYW5nZSAwIC0gMiIpOwogCi1zdGF0aWMgTElTVF9IRUFEKGludGZfbGlzdCk7Ci1zdGF0aWMgTElTVF9IRUFEKGRldl9saXN0KTsKLXN0YXRpYyBERUZJTkVfTVVURVgoaW50Zl9tdXRleCk7Ci0KLXN0cnVjdCBtbHg1X2RldmljZV9jb250ZXh0IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Ci0Jc3RydWN0IG1seDVfaW50ZXJmYWNlICAqaW50ZjsKLQl2b2lkCQkgICAgICAgKmNvbnRleHQ7Ci19OwotCiBlbnVtIHsKIAlNTFg1X0FUT01JQ19SRVFfTU9ERV9CRSA9IDB4MCwKIAlNTFg1X0FUT01JQ19SRVFfTU9ERV9IT1NUX0VORElBTk5FU1MgPSAweDEsCkBAIC0zMjQsNyArMzE0LDcgQEAKIAkJCQlNTFg1X0RFVl9DQVBfRkxBR19EQ1QsCiB9OwogCi1zdGF0aWMgdTE2IHRvX2Z3X3BrZXlfc3oodTMyIHNpemUpCitzdGF0aWMgdTE2IHRvX2Z3X3BrZXlfc3ooc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHNpemUpCiB7CiAJc3dpdGNoIChzaXplKSB7CiAJY2FzZSAxMjg6CkBAIC0zNDAsNyArMzMwLDcgQEAKIAljYXNlIDQwOTY6CiAJCXJldHVybiA1OwogCWRlZmF1bHQ6Ci0JCXByX3dhcm4oImludmFsaWQgcGtleSB0YWJsZSBzaXplICVkXG4iLCBzaXplKTsKKwkJbWx4NV9jb3JlX3dhcm4oZGV2LCAiaW52YWxpZCBwa2V5IHRhYmxlIHNpemUgJWRcbiIsIHNpemUpOwogCQlyZXR1cm4gMDsKIAl9CiB9CkBAIC0zNjMsMTAgKzM1Myw2IEBACiAJTUxYNV9TRVQocXVlcnlfaGNhX2NhcF9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfUVVFUllfSENBX0NBUCk7CiAJTUxYNV9TRVQocXVlcnlfaGNhX2NhcF9pbiwgaW4sIG9wX21vZCwgb3Btb2QpOwogCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRfc3opOwotCWlmIChlcnIpCi0JCWdvdG8gcXVlcnlfZXg7Ci0KLQllcnIgPSBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyX3YyKG91dCk7CiAJaWYgKGVycikgewogCQltbHg1X2NvcmVfd2FybihkZXYsCiAJCQkgICAgICAgIlFVRVJZX0hDQV9DQVAgOiB0eXBlKCV4KSBvcG1vZGUoJXgpIEZhaWxlZCglZClcbiIsCkBAIC00MDksMjAgKzM5NSwxMSBAQAogCiBzdGF0aWMgaW50IHNldF9jYXBzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHZvaWQgKmluLCBpbnQgaW5fc3osIGludCBvcG1vZCkKIHsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoc2V0X2hjYV9jYXBfb3V0KV07Ci0JaW50IGVycjsKLQotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoc2V0X2hjYV9jYXBfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChzZXRfaGNhX2NhcF9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfU0VUX0hDQV9DQVApOwogCU1MWDVfU0VUKHNldF9oY2FfY2FwX2luLCBpbiwgb3BfbW9kLCBvcG1vZCA8PCAxKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGluX3N6LCBvdXQsIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycl92MihvdXQpOwotCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbl9zeiwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIHN0YXRpYyBpbnQgaGFuZGxlX2hjYV9jYXBfYXRvbWljKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCkBAIC00OTAsNyArNDY3LDcgQEAKIAkJICAgICAgMTI4KTsKIAkvKiB3ZSBsaW1pdCB0aGUgc2l6ZSBvZiB0aGUgcGtleSB0YWJsZSB0byAxMjggZW50cmllcyBmb3Igbm93ICovCiAJTUxYNV9TRVQoY21kX2hjYV9jYXAsIHNldF9oY2FfY2FwLCBwa2V5X3RhYmxlX3NpemUsCi0JCSB0b19md19wa2V5X3N6KDEyOCkpOworCQkgdG9fZndfcGtleV9zeihkZXYsIDEyOCkpOwogCiAJaWYgKHByb2YtPm1hc2sgJiBNTFg1X1BST0ZfTUFTS19RUF9TSVpFKQogCQlNTFg1X1NFVChjbWRfaGNhX2NhcCwgc2V0X2hjYV9jYXAsIGxvZ19tYXhfcXAsCkBAIC01MjgsMzcgKzUwNSwyMiBAQAogCiBpbnQgbWx4NV9jb3JlX2VuYWJsZV9oY2Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2IGZ1bmNfaWQpCiB7Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGVuYWJsZV9oY2Ffb3V0KV07Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoZW5hYmxlX2hjYV9pbildOwotCWludCBlcnI7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGVuYWJsZV9oY2Ffb3V0KV0gPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZW5hYmxlX2hjYV9pbildICAgPSB7MH07CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwogCU1MWDVfU0VUKGVuYWJsZV9oY2FfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0VOQUJMRV9IQ0EpOwogCU1MWDVfU0VUKGVuYWJsZV9oY2FfaW4sIGluLCBmdW5jdGlvbl9pZCwgZnVuY19pZCk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwotCi0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgJm91dCwgc2l6ZW9mKG91dCkpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycl92MihvdXQpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCAmb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIGludCBtbHg1X2NvcmVfZGlzYWJsZV9oY2Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2IGZ1bmNfaWQpCiB7Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRpc2FibGVfaGNhX291dCldOwotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRpc2FibGVfaGNhX2luKV07Ci0JaW50IGVycjsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGlzYWJsZV9oY2Ffb3V0KV0gPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGlzYWJsZV9oY2FfaW4pXSAgID0gezB9OwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKIAlNTFg1X1NFVChkaXNhYmxlX2hjYV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfRElTQUJMRV9IQ0EpOwogCU1MWDVfU0VUKGRpc2FibGVfaGNhX2luLCBpbiwgZnVuY3Rpb25faWQsIGZ1bmNfaWQpOwotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycl92MihvdXQpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCiBjeWNsZV90IG1seDVfcmVhZF9pbnRlcm5hbF90aW1lcihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQpAQCAtNzU4LDQ0ICs3MjAsNDAgQEAKIAogc3RhdGljIGludCBtbHg1X2NvcmVfc2V0X2lzc2koc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKIHsKLQl1MzIgcXVlcnlfaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9pc3NpX2luKV07Ci0JdTMyIHF1ZXJ5X291dFtNTFg1X1NUX1NaX0RXKHF1ZXJ5X2lzc2lfb3V0KV07Ci0JdTMyIHNldF9pbltNTFg1X1NUX1NaX0RXKHNldF9pc3NpX2luKV07Ci0JdTMyIHNldF9vdXRbTUxYNV9TVF9TWl9EVyhzZXRfaXNzaV9vdXQpXTsKLQlpbnQgZXJyOworCXUzMiBxdWVyeV9pbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X2lzc2lfaW4pXSAgID0gezB9OworCXUzMiBxdWVyeV9vdXRbTUxYNV9TVF9TWl9EVyhxdWVyeV9pc3NpX291dCldID0gezB9OwogCXUzMiBzdXBfaXNzaTsKLQotCW1lbXNldChxdWVyeV9pbiwgMCwgc2l6ZW9mKHF1ZXJ5X2luKSk7Ci0JbWVtc2V0KHF1ZXJ5X291dCwgMCwgc2l6ZW9mKHF1ZXJ5X291dCkpOworCWludCBlcnI7CiAKIAlNTFg1X1NFVChxdWVyeV9pc3NpX2luLCBxdWVyeV9pbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9RVUVSWV9JU1NJKTsKLQotCWVyciA9IG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgcXVlcnlfaW4sIHNpemVvZihxdWVyeV9pbiksCi0JCQkJCSBxdWVyeV9vdXQsIHNpemVvZihxdWVyeV9vdXQpKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgcXVlcnlfaW4sIHNpemVvZihxdWVyeV9pbiksCisJCQkgICAgcXVlcnlfb3V0LCBzaXplb2YocXVlcnlfb3V0KSk7CiAJaWYgKGVycikgewotCQlpZiAoKChzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyICopcXVlcnlfb3V0KS0+c3RhdHVzID09Ci0JCSAgICBNTFg1X0NNRF9TVEFUX0JBRF9PUF9FUlIpIHsKKwkJdTMyIHN5bmRyb21lOworCQl1OCBzdGF0dXM7CisKKwkJbWx4NV9jbWRfbWJveF9zdGF0dXMocXVlcnlfb3V0LCAmc3RhdHVzLCAmc3luZHJvbWUpOworCQlpZiAoc3RhdHVzID09IE1MWDVfQ01EX1NUQVRfQkFEX09QX0VSUikgewogCQkJcHJfZGVidWcoIk9ubHkgSVNTSSAwIGlzIHN1cHBvcnRlZFxuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCi0JCXByX2VycigiZmFpbGVkIHRvIHF1ZXJ5IElTU0lcbiIpOworCQlwcl9lcnIoImZhaWxlZCB0byBxdWVyeSBJU1NJIGVyciglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJc3VwX2lzc2kgPSBNTFg1X0dFVChxdWVyeV9pc3NpX291dCwgcXVlcnlfb3V0LCBzdXBwb3J0ZWRfaXNzaV9kdzApOwogCiAJaWYgKHN1cF9pc3NpICYgKDEgPDwgMSkpIHsKLQkJbWVtc2V0KHNldF9pbiwgMCwgc2l6ZW9mKHNldF9pbikpOwotCQltZW1zZXQoc2V0X291dCwgMCwgc2l6ZW9mKHNldF9vdXQpKTsKKwkJdTMyIHNldF9pbltNTFg1X1NUX1NaX0RXKHNldF9pc3NpX2luKV0gICA9IHswfTsKKwkJdTMyIHNldF9vdXRbTUxYNV9TVF9TWl9EVyhzZXRfaXNzaV9vdXQpXSA9IHswfTsKIAogCQlNTFg1X1NFVChzZXRfaXNzaV9pbiwgc2V0X2luLCBvcGNvZGUsIE1MWDVfQ01EX09QX1NFVF9JU1NJKTsKIAkJTUxYNV9TRVQoc2V0X2lzc2lfaW4sIHNldF9pbiwgY3VycmVudF9pc3NpLCAxKTsKLQotCQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIHNldF9pbiwgc2l6ZW9mKHNldF9pbiksCi0JCQkJCQkgc2V0X291dCwgc2l6ZW9mKHNldF9vdXQpKTsKKwkJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIHNldF9pbiwgc2l6ZW9mKHNldF9pbiksCisJCQkJICAgIHNldF9vdXQsIHNpemVvZihzZXRfb3V0KSk7CiAJCWlmIChlcnIpIHsKLQkJCXByX2VycigiZmFpbGVkIHRvIHNldCBJU1NJPTFcbiIpOworCQkJcHJfZXJyKCJmYWlsZWQgdG8gc2V0IElTU0k9MSBlcnIoJWQpXG4iLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCkBAIC04MDksMTIwICs3NjcsNiBAQAogCXJldHVybiAtRU5PVFNVUFA7CiB9CiAKLXN0YXRpYyB2b2lkIG1seDVfYWRkX2RldmljZShzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgKmludGYsIHN0cnVjdCBtbHg1X3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IG1seDVfZGV2aWNlX2NvbnRleHQgKmRldl9jdHg7Ci0Jc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiA9IGNvbnRhaW5lcl9vZihwcml2LCBzdHJ1Y3QgbWx4NV9jb3JlX2RldiwgcHJpdik7Ci0KLQlkZXZfY3R4ID0ga21hbGxvYyhzaXplb2YoKmRldl9jdHgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldl9jdHgpCi0JCXJldHVybjsKLQotCWRldl9jdHgtPmludGYgICAgPSBpbnRmOwotCWRldl9jdHgtPmNvbnRleHQgPSBpbnRmLT5hZGQoZGV2KTsKLQotCWlmIChkZXZfY3R4LT5jb250ZXh0KSB7Ci0JCXNwaW5fbG9ja19pcnEoJnByaXYtPmN0eF9sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmZGV2X2N0eC0+bGlzdCwgJnByaXYtPmN0eF9saXN0KTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5jdHhfbG9jayk7Ci0JfSBlbHNlIHsKLQkJa2ZyZWUoZGV2X2N0eCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBtbHg1X3JlbW92ZV9kZXZpY2Uoc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmLCBzdHJ1Y3QgbWx4NV9wcml2ICpwcml2KQotewotCXN0cnVjdCBtbHg1X2RldmljZV9jb250ZXh0ICpkZXZfY3R4OwotCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYgPSBjb250YWluZXJfb2YocHJpdiwgc3RydWN0IG1seDVfY29yZV9kZXYsIHByaXYpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZfY3R4LCAmcHJpdi0+Y3R4X2xpc3QsIGxpc3QpCi0JCWlmIChkZXZfY3R4LT5pbnRmID09IGludGYpIHsKLQkJCXNwaW5fbG9ja19pcnEoJnByaXYtPmN0eF9sb2NrKTsKLQkJCWxpc3RfZGVsKCZkZXZfY3R4LT5saXN0KTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+Y3R4X2xvY2spOwotCi0JCQlpbnRmLT5yZW1vdmUoZGV2LCBkZXZfY3R4LT5jb250ZXh0KTsKLQkJCWtmcmVlKGRldl9jdHgpOwotCQkJcmV0dXJuOwotCQl9Ci19Ci0KLXN0YXRpYyBpbnQgbWx4NV9yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKLXsKLQlzdHJ1Y3QgbWx4NV9wcml2ICpwcml2ID0gJmRldi0+cHJpdjsKLQlzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgKmludGY7Ci0KLQltdXRleF9sb2NrKCZpbnRmX211dGV4KTsKLQlsaXN0X2FkZF90YWlsKCZwcml2LT5kZXZfbGlzdCwgJmRldl9saXN0KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGludGYsICZpbnRmX2xpc3QsIGxpc3QpCi0JCW1seDVfYWRkX2RldmljZShpbnRmLCBwcml2KTsKLQltdXRleF91bmxvY2soJmludGZfbXV0ZXgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG1seDVfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKLXsKLQlzdHJ1Y3QgbWx4NV9wcml2ICpwcml2ID0gJmRldi0+cHJpdjsKLQlzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgKmludGY7Ci0KLQltdXRleF9sb2NrKCZpbnRmX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGludGYsICZpbnRmX2xpc3QsIGxpc3QpCi0JCW1seDVfcmVtb3ZlX2RldmljZShpbnRmLCBwcml2KTsKLQlsaXN0X2RlbCgmcHJpdi0+ZGV2X2xpc3QpOwotCW11dGV4X3VubG9jaygmaW50Zl9tdXRleCk7Ci19Ci0KLWludCBtbHg1X3JlZ2lzdGVyX2ludGVyZmFjZShzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgKmludGYpCi17Ci0Jc3RydWN0IG1seDVfcHJpdiAqcHJpdjsKLQotCWlmICghaW50Zi0+YWRkIHx8ICFpbnRmLT5yZW1vdmUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmaW50Zl9tdXRleCk7Ci0JbGlzdF9hZGRfdGFpbCgmaW50Zi0+bGlzdCwgJmludGZfbGlzdCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShwcml2LCAmZGV2X2xpc3QsIGRldl9saXN0KQotCQltbHg1X2FkZF9kZXZpY2UoaW50ZiwgcHJpdik7Ci0JbXV0ZXhfdW5sb2NrKCZpbnRmX211dGV4KTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChtbHg1X3JlZ2lzdGVyX2ludGVyZmFjZSk7Ci0KLXZvaWQgbWx4NV91bnJlZ2lzdGVyX2ludGVyZmFjZShzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgKmludGYpCi17Ci0Jc3RydWN0IG1seDVfcHJpdiAqcHJpdjsKLQotCW11dGV4X2xvY2soJmludGZfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocHJpdiwgJmRldl9saXN0LCBkZXZfbGlzdCkKLQkJbWx4NV9yZW1vdmVfZGV2aWNlKGludGYsIHByaXYpOwotCWxpc3RfZGVsKCZpbnRmLT5saXN0KTsKLQltdXRleF91bmxvY2soJmludGZfbXV0ZXgpOwotfQotRVhQT1JUX1NZTUJPTChtbHg1X3VucmVnaXN0ZXJfaW50ZXJmYWNlKTsKLQotdm9pZCAqbWx4NV9nZXRfcHJvdG9jb2xfZGV2KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCBpbnQgcHJvdG9jb2wpCi17Ci0Jc3RydWN0IG1seDVfcHJpdiAqcHJpdiA9ICZtZGV2LT5wcml2OwotCXN0cnVjdCBtbHg1X2RldmljZV9jb250ZXh0ICpkZXZfY3R4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jdm9pZCAqcmVzdWx0ID0gTlVMTDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5jdHhfbG9jaywgZmxhZ3MpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZfY3R4LCAmbWRldi0+cHJpdi5jdHhfbGlzdCwgbGlzdCkKLQkJaWYgKChkZXZfY3R4LT5pbnRmLT5wcm90b2NvbCA9PSBwcm90b2NvbCkgJiYKLQkJICAgIGRldl9jdHgtPmludGYtPmdldF9kZXYpIHsKLQkJCXJlc3VsdCA9IGRldl9jdHgtPmludGYtPmdldF9kZXYoZGV2X2N0eC0+Y29udGV4dCk7Ci0JCQlicmVhazsKLQkJfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+Y3R4X2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci1FWFBPUlRfU1lNQk9MKG1seDVfZ2V0X3Byb3RvY29sX2Rldik7CiAKIHN0YXRpYyBpbnQgbWx4NV9wY2lfaW5pdChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9wcml2ICpwcml2KQogewpAQCAtOTk1LDggKzgzOSwxMDIgQEAKIAlkZWJ1Z2ZzX3JlbW92ZShwcml2LT5kYmdfcm9vdCk7CiB9CiAKLSNkZWZpbmUgTUxYNV9JQl9NT0QgIm1seDVfaWIiCi1zdGF0aWMgaW50IG1seDVfbG9hZF9vbmUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfcHJpdiAqcHJpdikKK3N0YXRpYyBpbnQgbWx4NV9pbml0X29uY2Uoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cGRldjsKKwlpbnQgZXJyOworCisJZXJyID0gbWx4NV9xdWVyeV9oY2FfY2FwcyhkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicXVlcnkgaGNhIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IG1seDVfcXVlcnlfYm9hcmRfaWQoZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInF1ZXJ5IGJvYXJkIGlkIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IG1seDVfZXFfaW5pdChkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgZXFcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlNTFg1X0lOSVRfRE9PUkJFTExfTE9DSygmcHJpdi0+Y3FfdWFyX2xvY2spOworCisJZXJyID0gbWx4NV9pbml0X2NxX3RhYmxlKGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBjcSB0YWJsZVxuIik7CisJCWdvdG8gZXJyX2VxX2NsZWFudXA7CisJfQorCisJbWx4NV9pbml0X3FwX3RhYmxlKGRldik7CisKKwltbHg1X2luaXRfc3JxX3RhYmxlKGRldik7CisKKwltbHg1X2luaXRfbWtleV90YWJsZShkZXYpOworCisJZXJyID0gbWx4NV9pbml0X3JsX3RhYmxlKGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gaW5pdCByYXRlIGxpbWl0aW5nXG4iKTsKKwkJZ290byBlcnJfdGFibGVzX2NsZWFudXA7CisJfQorCisjaWZkZWYgQ09ORklHX01MWDVfQ09SRV9FTgorCWVyciA9IG1seDVfZXN3aXRjaF9pbml0KGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gaW5pdCBlc3dpdGNoICVkXG4iLCBlcnIpOworCQlnb3RvIGVycl9ybF9jbGVhbnVwOworCX0KKyNlbmRpZgorCisJZXJyID0gbWx4NV9zcmlvdl9pbml0KGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gaW5pdCBzcmlvdiAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJfZXN3aXRjaF9jbGVhbnVwOworCX0KKworCXJldHVybiAwOworCitlcnJfZXN3aXRjaF9jbGVhbnVwOgorI2lmZGVmIENPTkZJR19NTFg1X0NPUkVfRU4KKwltbHg1X2Vzd2l0Y2hfY2xlYW51cChkZXYtPnByaXYuZXN3aXRjaCk7CisKK2Vycl9ybF9jbGVhbnVwOgorI2VuZGlmCisJbWx4NV9jbGVhbnVwX3JsX3RhYmxlKGRldik7CisKK2Vycl90YWJsZXNfY2xlYW51cDoKKwltbHg1X2NsZWFudXBfbWtleV90YWJsZShkZXYpOworCW1seDVfY2xlYW51cF9zcnFfdGFibGUoZGV2KTsKKwltbHg1X2NsZWFudXBfcXBfdGFibGUoZGV2KTsKKwltbHg1X2NsZWFudXBfY3FfdGFibGUoZGV2KTsKKworZXJyX2VxX2NsZWFudXA6CisJbWx4NV9lcV9jbGVhbnVwKGRldik7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBtbHg1X2NsZWFudXBfb25jZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCW1seDVfc3Jpb3ZfY2xlYW51cChkZXYpOworI2lmZGVmIENPTkZJR19NTFg1X0NPUkVfRU4KKwltbHg1X2Vzd2l0Y2hfY2xlYW51cChkZXYtPnByaXYuZXN3aXRjaCk7CisjZW5kaWYKKwltbHg1X2NsZWFudXBfcmxfdGFibGUoZGV2KTsKKwltbHg1X2NsZWFudXBfbWtleV90YWJsZShkZXYpOworCW1seDVfY2xlYW51cF9zcnFfdGFibGUoZGV2KTsKKwltbHg1X2NsZWFudXBfcXBfdGFibGUoZGV2KTsKKwltbHg1X2NsZWFudXBfY3FfdGFibGUoZGV2KTsKKwltbHg1X2VxX2NsZWFudXAoZGV2KTsKK30KKworc3RhdGljIGludCBtbHg1X2xvYWRfb25lKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X3ByaXYgKnByaXYsCisJCQkgYm9vbCBib290KQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2LT5wZGV2OwogCWludCBlcnI7CkBAIC0xMDI5LDEyICs5NjcsMTAgQEAKIAkJZ290byBvdXRfZXJyOwogCX0KIAotCW1seDVfcGFnZWFsbG9jX2luaXQoZGV2KTsKLQogCWVyciA9IG1seDVfY29yZV9lbmFibGVfaGNhKGRldiwgMCk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJlbmFibGUgaGNhIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyX3BhZ2VhbGxvY19jbGVhbnVwOworCQlnb3RvIGVycl9jbWRfY2xlYW51cDsKIAl9CiAKIAllcnIgPSBtbHg1X2NvcmVfc2V0X2lzc2koZGV2KTsKQEAgLTEwODcsMzQgKzEwMjMsMjEgQEAKIAogCW1seDVfc3RhcnRfaGVhbHRoX3BvbGwoZGV2KTsKIAotCWVyciA9IG1seDVfcXVlcnlfaGNhX2NhcHMoZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInF1ZXJ5IGhjYSBmYWlsZWRcbiIpOwotCQlnb3RvIGVycl9zdG9wX3BvbGw7Ci0JfQotCi0JZXJyID0gbWx4NV9xdWVyeV9ib2FyZF9pZChkZXYpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAicXVlcnkgYm9hcmQgaWQgZmFpbGVkXG4iKTsKKwlpZiAoYm9vdCAmJiBtbHg1X2luaXRfb25jZShkZXYsIHByaXYpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInN3IG9ianMgaW5pdCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9zdG9wX3BvbGw7CiAJfQogCiAJZXJyID0gbWx4NV9lbmFibGVfbXNpeChkZXYpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZW5hYmxlIG1zaXggZmFpbGVkXG4iKTsKLQkJZ290byBlcnJfc3RvcF9wb2xsOwotCX0KLQotCWVyciA9IG1seDVfZXFfaW5pdChkZXYpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgZXFcbiIpOwotCQlnb3RvIGRpc2FibGVfbXNpeDsKKwkJZ290byBlcnJfY2xlYW51cF9vbmNlOwogCX0KIAogCWVyciA9IG1seDVfYWxsb2NfdXVhcnMoZGV2LCAmcHJpdi0+dXVhcmkpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIGFsbG9jYXRpbmcgdWFyLCBhYm9ydGluZ1xuIik7Ci0JCWdvdG8gZXJyX2VxX2NsZWFudXA7CisJCWdvdG8gZXJyX2Rpc2FibGVfbXNpeDsKIAl9CiAKIAllcnIgPSBtbHg1X3N0YXJ0X2VxcyhkZXYpOwpAQCAtMTEzMCwxNSArMTA1MywxMCBAQAogCX0KIAogCWVyciA9IG1seDVfaXJxX3NldF9hZmZpbml0eV9oaW50cyhkZXYpOwotCWlmIChlcnIpCisJaWYgKGVycikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2MgYWZmaW5pdHkgaGludCBjcHVtYXNrXG4iKTsKLQotCU1MWDVfSU5JVF9ET09SQkVMTF9MT0NLKCZwcml2LT5jcV91YXJfbG9jayk7Ci0KLQltbHg1X2luaXRfY3FfdGFibGUoZGV2KTsKLQltbHg1X2luaXRfcXBfdGFibGUoZGV2KTsKLQltbHg1X2luaXRfc3JxX3RhYmxlKGRldik7Ci0JbWx4NV9pbml0X21rZXlfdGFibGUoZGV2KTsKKwkJZ290byBlcnJfYWZmaW5pdHlfaGludHM7CisJfQogCiAJZXJyID0gbWx4NV9pbml0X2ZzKGRldik7CiAJaWYgKGVycikgewpAQCAtMTE0NiwzNiArMTA2NCwyNiBAQAogCQlnb3RvIGVycl9mczsKIAl9CiAKLQllcnIgPSBtbHg1X2luaXRfcmxfdGFibGUoZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBpbml0IHJhdGUgbGltaXRpbmdcbiIpOwotCQlnb3RvIGVycl9ybDsKLQl9Ci0KICNpZmRlZiBDT05GSUdfTUxYNV9DT1JFX0VOCi0JZXJyID0gbWx4NV9lc3dpdGNoX2luaXQoZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImVzd2l0Y2ggaW5pdCBmYWlsZWQgJWRcbiIsIGVycik7Ci0JCWdvdG8gZXJyX3JlZ19kZXY7Ci0JfQorCW1seDVfZXN3aXRjaF9hdHRhY2goZGV2LT5wcml2LmVzd2l0Y2gpOwogI2VuZGlmCiAKLQllcnIgPSBtbHg1X3NyaW92X2luaXQoZGV2KTsKKwllcnIgPSBtbHg1X3NyaW92X2F0dGFjaChkZXYpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAic3Jpb3YgaW5pdCBmYWlsZWQgJWRcbiIsIGVycik7CiAJCWdvdG8gZXJyX3NyaW92OwogCX0KIAotCWVyciA9IG1seDVfcmVnaXN0ZXJfZGV2aWNlKGRldik7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtbHg1X3JlZ2lzdGVyX2RldmljZSBmYWlsZWQgJWRcbiIsIGVycik7Ci0JCWdvdG8gZXJyX3JlZ19kZXY7CisJaWYgKG1seDVfZGV2aWNlX3JlZ2lzdGVyZWQoZGV2KSkgeworCQltbHg1X2F0dGFjaF9kZXZpY2UoZGV2KTsKKwl9IGVsc2UgeworCQllcnIgPSBtbHg1X3JlZ2lzdGVyX2RldmljZShkZXYpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtbHg1X3JlZ2lzdGVyX2RldmljZSBmYWlsZWQgJWRcbiIsIGVycik7CisJCQlnb3RvIGVycl9yZWdfZGV2OworCQl9CiAJfQogCi0JZXJyID0gcmVxdWVzdF9tb2R1bGVfbm93YWl0KE1MWDVfSUJfTU9EKTsKLQlpZiAoZXJyKQotCQlwcl9pbmZvKCJmYWlsZWQgcmVxdWVzdCBtb2R1bGUgb24gJXNcbiIsIE1MWDVfSUJfTU9EKTsKLQogCWNsZWFyX2JpdChNTFg1X0lOVEVSRkFDRV9TVEFURV9ET1dOLCAmZGV2LT5pbnRmX3N0YXRlKTsKIAlzZXRfYml0KE1MWDVfSU5URVJGQUNFX1NUQVRFX1VQLCAmZGV2LT5pbnRmX3N0YXRlKTsKIG91dDoKQEAgLTExODMsMjMgKzEwOTEsMTkgQEAKIAogCXJldHVybiAwOwogCi1lcnJfc3Jpb3Y6Ci0JaWYgKG1seDVfc3Jpb3ZfY2xlYW51cChkZXYpKQotCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgInNyaW92IGNsZWFudXAgZmFpbGVkXG4iKTsKLQotI2lmZGVmIENPTkZJR19NTFg1X0NPUkVfRU4KLQltbHg1X2Vzd2l0Y2hfY2xlYW51cChkZXYtPnByaXYuZXN3aXRjaCk7Ci0jZW5kaWYKIGVycl9yZWdfZGV2OgotCW1seDVfY2xlYW51cF9ybF90YWJsZShkZXYpOwotZXJyX3JsOgorCW1seDVfc3Jpb3ZfZGV0YWNoKGRldik7CisKK2Vycl9zcmlvdjoKKyNpZmRlZiBDT05GSUdfTUxYNV9DT1JFX0VOCisJbWx4NV9lc3dpdGNoX2RldGFjaChkZXYtPnByaXYuZXN3aXRjaCk7CisjZW5kaWYKIAltbHg1X2NsZWFudXBfZnMoZGV2KTsKKwogZXJyX2ZzOgotCW1seDVfY2xlYW51cF9ta2V5X3RhYmxlKGRldik7Ci0JbWx4NV9jbGVhbnVwX3NycV90YWJsZShkZXYpOwotCW1seDVfY2xlYW51cF9xcF90YWJsZShkZXYpOwotCW1seDVfY2xlYW51cF9jcV90YWJsZShkZXYpOwogCW1seDVfaXJxX2NsZWFyX2FmZmluaXR5X2hpbnRzKGRldik7CisKK2Vycl9hZmZpbml0eV9oaW50czoKIAlmcmVlX2NvbXBfZXFzKGRldik7CiAKIGVycl9zdG9wX2VxczoKQEAgLTEyMDgsMTIgKzExMTIsMTMgQEAKIGVycl9mcmVlX3VhcjoKIAltbHg1X2ZyZWVfdXVhcnMoZGV2LCAmcHJpdi0+dXVhcmkpOwogCi1lcnJfZXFfY2xlYW51cDoKLQltbHg1X2VxX2NsZWFudXAoZGV2KTsKLQotZGlzYWJsZV9tc2l4OgorZXJyX2Rpc2FibGVfbXNpeDoKIAltbHg1X2Rpc2FibGVfbXNpeChkZXYpOwogCitlcnJfY2xlYW51cF9vbmNlOgorCWlmIChib290KQorCQltbHg1X2NsZWFudXBfb25jZShkZXYpOworCiBlcnJfc3RvcF9wb2xsOgogCW1seDVfc3RvcF9oZWFsdGhfcG9sbChkZXYpOwogCWlmIChtbHg1X2NtZF90ZWFyZG93bl9oY2EoZGV2KSkgewpAQCAtMTIzMCw4ICsxMTM1LDcgQEAKIGVycl9kaXNhYmxlX2hjYToKIAltbHg1X2NvcmVfZGlzYWJsZV9oY2EoZGV2LCAwKTsKIAotZXJyX3BhZ2VhbGxvY19jbGVhbnVwOgotCW1seDVfcGFnZWFsbG9jX2NsZWFudXAoZGV2KTsKK2Vycl9jbWRfY2xlYW51cDoKIAltbHg1X2NtZF9jbGVhbnVwKGRldik7CiAKIG91dF9lcnI6CkBAIC0xMjQxLDQwICsxMTQ1LDM1IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBtbHg1X3VubG9hZF9vbmUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfcHJpdiAqcHJpdikKK3N0YXRpYyBpbnQgbWx4NV91bmxvYWRfb25lKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X3ByaXYgKnByaXYsCisJCQkgICBib29sIGNsZWFudXApCiB7CiAJaW50IGVyciA9IDA7CiAKLQllcnIgPSBtbHg1X3NyaW92X2NsZWFudXAoZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCWRldl93YXJuKCZkZXYtPnBkZXYtPmRldiwgIiVzOiBzcmlvdiBjbGVhbnVwIGZhaWxlZCAtIGFib3J0XG4iLAotCQkJIF9fZnVuY19fKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KIAltdXRleF9sb2NrKCZkZXYtPmludGZfc3RhdGVfbXV0ZXgpOwogCWlmICh0ZXN0X2JpdChNTFg1X0lOVEVSRkFDRV9TVEFURV9ET1dOLCAmZGV2LT5pbnRmX3N0YXRlKSkgewogCQlkZXZfd2FybigmZGV2LT5wZGV2LT5kZXYsICIlczogaW50ZXJmYWNlIGlzIGRvd24sIE5PUFxuIiwKIAkJCSBfX2Z1bmNfXyk7CisJCWlmIChjbGVhbnVwKQorCQkJbWx4NV9jbGVhbnVwX29uY2UoZGV2KTsKIAkJZ290byBvdXQ7CiAJfQotCW1seDVfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2KTsKLSNpZmRlZiBDT05GSUdfTUxYNV9DT1JFX0VOCi0JbWx4NV9lc3dpdGNoX2NsZWFudXAoZGV2LT5wcml2LmVzd2l0Y2gpOwotI2VuZGlmCiAKLQltbHg1X2NsZWFudXBfcmxfdGFibGUoZGV2KTsKKwlpZiAobWx4NV9kZXZpY2VfcmVnaXN0ZXJlZChkZXYpKQorCQltbHg1X2RldGFjaF9kZXZpY2UoZGV2KTsKKworCW1seDVfc3Jpb3ZfZGV0YWNoKGRldik7CisjaWZkZWYgQ09ORklHX01MWDVfQ09SRV9FTgorCW1seDVfZXN3aXRjaF9kZXRhY2goZGV2LT5wcml2LmVzd2l0Y2gpOworI2VuZGlmCiAJbWx4NV9jbGVhbnVwX2ZzKGRldik7Ci0JbWx4NV9jbGVhbnVwX21rZXlfdGFibGUoZGV2KTsKLQltbHg1X2NsZWFudXBfc3JxX3RhYmxlKGRldik7Ci0JbWx4NV9jbGVhbnVwX3FwX3RhYmxlKGRldik7Ci0JbWx4NV9jbGVhbnVwX2NxX3RhYmxlKGRldik7CiAJbWx4NV9pcnFfY2xlYXJfYWZmaW5pdHlfaGludHMoZGV2KTsKIAlmcmVlX2NvbXBfZXFzKGRldik7CiAJbWx4NV9zdG9wX2VxcyhkZXYpOwogCW1seDVfZnJlZV91dWFycyhkZXYsICZwcml2LT51dWFyaSk7Ci0JbWx4NV9lcV9jbGVhbnVwKGRldik7CiAJbWx4NV9kaXNhYmxlX21zaXgoZGV2KTsKKwlpZiAoY2xlYW51cCkKKwkJbWx4NV9jbGVhbnVwX29uY2UoZGV2KTsKIAltbHg1X3N0b3BfaGVhbHRoX3BvbGwoZGV2KTsKIAllcnIgPSBtbHg1X2NtZF90ZWFyZG93bl9oY2EoZGV2KTsKIAlpZiAoZXJyKSB7CkBAIC0xMjg0LDcgKzExODMsNiBAQAogCW1seDVfcGFnZWFsbG9jX3N0b3AoZGV2KTsKIAltbHg1X3JlY2xhaW1fc3RhcnR1cF9wYWdlcyhkZXYpOwogCW1seDVfY29yZV9kaXNhYmxlX2hjYShkZXYsIDApOwotCW1seDVfcGFnZWFsbG9jX2NsZWFudXAoZGV2KTsKIAltbHg1X2NtZF9jbGVhbnVwKGRldik7CiAKIG91dDoKQEAgLTEyOTQsMjIgKzExOTIsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXZvaWQgbWx4NV9jb3JlX2V2ZW50KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIGVudW0gbWx4NV9kZXZfZXZlbnQgZXZlbnQsCi0JCSAgICAgdW5zaWduZWQgbG9uZyBwYXJhbSkKLXsKLQlzdHJ1Y3QgbWx4NV9wcml2ICpwcml2ID0gJmRldi0+cHJpdjsKLQlzdHJ1Y3QgbWx4NV9kZXZpY2VfY29udGV4dCAqZGV2X2N0eDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmN0eF9sb2NrLCBmbGFncyk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldl9jdHgsICZwcml2LT5jdHhfbGlzdCwgbGlzdCkKLQkJaWYgKGRldl9jdHgtPmludGYtPmV2ZW50KQotCQkJZGV2X2N0eC0+aW50Zi0+ZXZlbnQoZGV2LCBkZXZfY3R4LT5jb250ZXh0LCBldmVudCwgcGFyYW0pOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+Y3R4X2xvY2ssIGZsYWdzKTsKLX0KLQogc3RydWN0IG1seDVfY29yZV9ldmVudF9oYW5kbGVyIHsKIAl2b2lkICgqZXZlbnQpKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCSAgICAgIGVudW0gbWx4NV9kZXZfZXZlbnQgZXZlbnQsCkBAIC0xMzIzLDYgKzEyMDUsNyBAQAogI2VuZGlmCiB9OwogCisjZGVmaW5lIE1MWDVfSUJfTU9EICJtbHg1X2liIgogc3RhdGljIGludCBpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKQEAgLTEzNDQsOCArMTIyNyw5IEBACiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAKIAlpZiAocHJvZl9zZWwgPCAwIHx8IHByb2Zfc2VsID49IEFSUkFZX1NJWkUocHJvZmlsZSkpIHsKLQkJcHJfd2Fybigic2VsZWN0ZWQgcHJvZmlsZSBvdXQgb2YgcmFuZ2UsIHNlbGVjdGluZyBkZWZhdWx0ICglZClcbiIsCi0JCQlNTFg1X0RFRkFVTFRfUFJPRik7CisJCW1seDVfY29yZV93YXJuKGRldiwKKwkJCSAgICAgICAic2VsZWN0ZWQgcHJvZmlsZSBvdXQgb2YgcmFuZ2UsIHNlbGVjdGluZyBkZWZhdWx0ICglZClcbiIsCisJCQkgICAgICAgTUxYNV9ERUZBVUxUX1BST0YpOwogCQlwcm9mX3NlbCA9IE1MWDVfREVGQVVMVF9QUk9GOwogCX0KIAlkZXYtPnByb2ZpbGUgPSAmcHJvZmlsZVtwcm9mX3NlbF07CkBAIC0xMzY4LDEyICsxMjUyLDE4IEBACiAJCWdvdG8gY2xvc2VfcGNpOwogCX0KIAotCWVyciA9IG1seDVfbG9hZF9vbmUoZGV2LCBwcml2KTsKKwltbHg1X3BhZ2VhbGxvY19pbml0KGRldik7CisKKwllcnIgPSBtbHg1X2xvYWRfb25lKGRldiwgcHJpdiwgdHJ1ZSk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtbHg1X2xvYWRfb25lIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWRcbiIsIGVycik7CiAJCWdvdG8gY2xlYW5faGVhbHRoOwogCX0KIAorCWVyciA9IHJlcXVlc3RfbW9kdWxlX25vd2FpdChNTFg1X0lCX01PRCk7CisJaWYgKGVycikKKwkJcHJfaW5mbygiZmFpbGVkIHJlcXVlc3QgbW9kdWxlIG9uICVzXG4iLCBNTFg1X0lCX01PRCk7CisKIAllcnIgPSBkZXZsaW5rX3JlZ2lzdGVyKGRldmxpbmssICZwZGV2LT5kZXYpOwogCWlmIChlcnIpCiAJCWdvdG8gY2xlYW5fbG9hZDsKQEAgLTEzODEsOCArMTI3MSw5IEBACiAJcmV0dXJuIDA7CiAKIGNsZWFuX2xvYWQ6Ci0JbWx4NV91bmxvYWRfb25lKGRldiwgcHJpdik7CisJbWx4NV91bmxvYWRfb25lKGRldiwgcHJpdiwgdHJ1ZSk7CiBjbGVhbl9oZWFsdGg6CisJbWx4NV9wYWdlYWxsb2NfY2xlYW51cChkZXYpOwogCW1seDVfaGVhbHRoX2NsZWFudXAoZGV2KTsKIGNsb3NlX3BjaToKIAltbHg1X3BjaV9jbG9zZShkZXYsIHByaXYpOwpAQCAtMTQwMCwxMSArMTI5MSwxNSBAQAogCXN0cnVjdCBtbHg1X3ByaXYgKnByaXYgPSAmZGV2LT5wcml2OwogCiAJZGV2bGlua191bnJlZ2lzdGVyKGRldmxpbmspOwotCWlmIChtbHg1X3VubG9hZF9vbmUoZGV2LCBwcml2KSkgeworCW1seDVfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2KTsKKworCWlmIChtbHg1X3VubG9hZF9vbmUoZGV2LCBwcml2LCB0cnVlKSkgewogCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIm1seDVfdW5sb2FkX29uZSBmYWlsZWRcbiIpOwogCQltbHg1X2hlYWx0aF9jbGVhbnVwKGRldik7CiAJCXJldHVybjsKIAl9CisKKwltbHg1X3BhZ2VhbGxvY19jbGVhbnVwKGRldik7CiAJbWx4NV9oZWFsdGhfY2xlYW51cChkZXYpOwogCW1seDVfcGNpX2Nsb3NlKGRldiwgcHJpdik7CiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwpAQCAtMTQxOSwzNyArMTMxNCwxMyBAQAogCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzIHdhcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKIAltbHg1X2VudGVyX2Vycm9yX3N0YXRlKGRldik7Ci0JbWx4NV91bmxvYWRfb25lKGRldiwgcHJpdik7CisJbWx4NV91bmxvYWRfb25lKGRldiwgcHJpdiwgZmFsc2UpOworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwogCW1seDVfcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CiAJcmV0dXJuIHN0YXRlID09IHBjaV9jaGFubmVsX2lvX3Blcm1fZmFpbHVyZSA/CiAJCVBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1QgOiBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUOwogfQogCi1zdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCBtbHg1X3BjaV9zbG90X3Jlc2V0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IGVyciA9IDA7Ci0KLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXMgd2FzIGNhbGxlZFxuIiwgX19mdW5jX18pOwotCi0JZXJyID0gbWx4NV9wY2lfZW5hYmxlX2RldmljZShkZXYpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IG1seDVfcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkIHdpdGggZXJyb3IgY29kZTogJWRcbiIKLQkJCSwgX19mdW5jX18sIGVycik7Ci0JCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOwotCX0KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7Ci0JcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7Ci0KLQlyZXR1cm4gZXJyID8gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVCA6IFBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRDsKLX0KLQotdm9pZCBtbHg1X2Rpc2FibGVfZGV2aWNlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCi17Ci0JbWx4NV9wY2lfZXJyX2RldGVjdGVkKGRldi0+cGRldiwgMCk7Ci19Ci0KIC8qIHdhaXQgZm9yIHRoZSBkZXZpY2UgdG8gc2hvdyB2aXRhbCBzaWducyBieSB3YWl0aW5nCiAgKiBmb3IgdGhlIGhlYWx0aCBjb3VudGVyIHRvIHN0YXJ0IGNvdW50aW5nLgogICovCkBAIC0xNDc3LDYgKzEzNDgsMzYgQEAKIAlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KIAorc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgbWx4NV9wY2lfc2xvdF9yZXNldChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBlcnI7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXMgd2FzIGNhbGxlZFxuIiwgX19mdW5jX18pOworCisJZXJyID0gbWx4NV9wY2lfZW5hYmxlX2RldmljZShkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IG1seDVfcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkIHdpdGggZXJyb3IgY29kZTogJWRcbiIKKwkJCSwgX19mdW5jX18sIGVycik7CisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJaWYgKHdhaXRfdml0YWwocGRldikpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHdhaXRfdml0YWwgdGltZWQgb3V0XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCX0KKworCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQ7Cit9CisKK3ZvaWQgbWx4NV9kaXNhYmxlX2RldmljZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCW1seDVfcGNpX2Vycl9kZXRlY3RlZChkZXYtPnBkZXYsIDApOworfQorCiBzdGF0aWMgdm9pZCBtbHg1X3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKQEAgLTE0ODUsMTQgKzEzODYsNyBAQAogCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzIHdhcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKIAotCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwotCWVyciA9IHdhaXRfdml0YWwocGRldik7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogd2FpdF92aXRhbCB0aW1lZCBvdXRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCWVyciA9IG1seDVfbG9hZF9vbmUoZGV2LCBwcml2KTsKKwllcnIgPSBtbHg1X2xvYWRfb25lKGRldiwgcHJpdiwgZmFsc2UpOwogCWlmIChlcnIpCiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBtbHg1X2xvYWRfb25lIGZhaWxlZCB3aXRoIGVycm9yIGNvZGU6ICVkXG4iCiAJCQksIF9fZnVuY19fLCBlcnIpOwpAQCAtMTUxNCw3ICsxNDA4LDcgQEAKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiU2h1dGRvd24gd2FzIGNhbGxlZFxuIik7CiAJLyogTm90aWZ5IG1seDUgY2xpZW50cyB0aGF0IHRoZSBrZXJuZWwgaXMgYmVpbmcgc2h1dCBkb3duICovCiAJc2V0X2JpdChNTFg1X0lOVEVSRkFDRV9TVEFURV9TSFVURE9XTiwgJmRldi0+aW50Zl9zdGF0ZSk7Ci0JbWx4NV91bmxvYWRfb25lKGRldiwgcHJpdik7CisJbWx4NV91bmxvYWRfb25lKGRldiwgcHJpdiwgZmFsc2UpOwogCW1seDVfcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tY2cuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tY2cuYwppbmRleCBkNWEwYzJkLi5iYTJiMDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWNnLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21jZy5jCkBAIC0zNyw3MCArMzcsMzAgQEAKICNpbmNsdWRlIDxyZG1hL2liX3ZlcmJzLmg+CiAjaW5jbHVkZSAibWx4NV9jb3JlLmgiCiAKLXN0cnVjdCBtbHg1X2F0dGFjaF9tY2dfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlxcG47Ci0JX19iZTMyCQkJcnN2ZDsKLQl1OAkJCWdpZFsxNl07Ci19OwotCi1zdHJ1Y3QgbWx4NV9hdHRhY2hfbWNnX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmZbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kZXRhY2hfbWNnX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJcXBuOwotCV9fYmUzMgkJCXJzdmQ7Ci0JdTgJCQlnaWRbMTZdOwotfTsKLQotc3RydWN0IG1seDVfZGV0YWNoX21jZ19tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZmWzhdOwotfTsKLQogaW50IG1seDVfY29yZV9hdHRhY2hfbWNnKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHVuaW9uIGliX2dpZCAqbWdpZCwgdTMyIHFwbikKIHsKLQlzdHJ1Y3QgbWx4NV9hdHRhY2hfbWNnX21ib3hfaW4gaW47Ci0Jc3RydWN0IG1seDVfYXR0YWNoX21jZ19tYm94X291dCBvdXQ7Ci0JaW50IGVycjsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoYXR0YWNoX3RvX21jZ19vdXQpXSA9IHswfTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhhdHRhY2hfdG9fbWNnX2luKV0gICA9IHswfTsKKwl2b2lkICpnaWQ7CiAKLQltZW1zZXQoJmluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9BVFRBQ0hfVE9fTUNHKTsKLQltZW1jcHkoaW4uZ2lkLCBtZ2lkLCBzaXplb2YoKm1naWQpKTsKLQlpbi5xcG4gPSBjcHVfdG9fYmUzMihxcG4pOwotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCAmaW4sIHNpemVvZihpbiksICZvdXQsIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKG91dC5oZHIuc3RhdHVzKQotCQllcnIgPSBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQuaGRyKTsKLQotCXJldHVybiBlcnI7CisJTUxYNV9TRVQoYXR0YWNoX3RvX21jZ19pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfQVRUQUNIX1RPX01DRyk7CisJTUxYNV9TRVQoYXR0YWNoX3RvX21jZ19pbiwgaW4sIHFwbiwgcXBuKTsKKwlnaWQgPSBNTFg1X0FERFJfT0YoYXR0YWNoX3RvX21jZ19pbiwgaW4sIG11bHRpY2FzdF9naWQpOworCW1lbWNweShnaWQsIG1naWQsIHNpemVvZigqbWdpZCkpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfYXR0YWNoX21jZyk7CiAKIGludCBtbHg1X2NvcmVfZGV0YWNoX21jZyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1bmlvbiBpYl9naWQgKm1naWQsIHUzMiBxcG4pCiB7Ci0Jc3RydWN0IG1seDVfZGV0YWNoX21jZ19tYm94X2luIGluOwotCXN0cnVjdCBtbHg1X2RldGFjaF9tY2dfbWJveF9vdXQgb3V0OwotCWludCBlcnI7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRldGFjaF9mcm9tX21jZ19vdXQpXSA9IHswfTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZXRhY2hfZnJvbV9tY2dfaW4pXSAgID0gezB9OworCXZvaWQgKmdpZDsKIAotCW1lbXNldCgmaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldCgmb3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JaW4uaGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX0RFVFRBQ0hfRlJPTV9NQ0cpOwotCW1lbWNweShpbi5naWQsIG1naWQsIHNpemVvZigqbWdpZCkpOwotCWluLnFwbiA9IGNwdV90b19iZTMyKHFwbik7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgJm91dCwgc2l6ZW9mKG91dCkpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAob3V0Lmhkci5zdGF0dXMpCi0JCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwotCi0JcmV0dXJuIGVycjsKKwlNTFg1X1NFVChkZXRhY2hfZnJvbV9tY2dfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0RFVEFDSF9GUk9NX01DRyk7CisJTUxYNV9TRVQoZGV0YWNoX2Zyb21fbWNnX2luLCBpbiwgcXBuLCBxcG4pOworCWdpZCA9IE1MWDVfQUREUl9PRihkZXRhY2hfZnJvbV9tY2dfaW4sIGluLCBtdWx0aWNhc3RfZ2lkKTsKKwltZW1jcHkoZ2lkLCBtZ2lkLCBzaXplb2YoKm1naWQpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIEVYUE9SVF9TWU1CT0wobWx4NV9jb3JlX2RldGFjaF9tY2cpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21seDVfY29yZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21seDVfY29yZS5oCmluZGV4IDJmODZlYzYuLjNkMGNmYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tbHg1X2NvcmUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWx4NV9jb3JlLmgKQEAgLTU4LDggKzU4LDggQEAKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgbWx4NV9jb3JlX2VycihfX2RldiwgZm9ybWF0LCAuLi4pCQkJCVwKLQlkZXZfZXJyKCYoX19kZXYpLT5wZGV2LT5kZXYsICIlczolczolZDoocGlkICVkKTogIiBmb3JtYXQsCVwKLQkgICAgICAgKF9fZGV2KS0+cHJpdi5uYW1lLCBfX2Z1bmNfXywgX19MSU5FX18sIGN1cnJlbnQtPnBpZCwJXAorCWRldl9lcnIoJihfX2RldiktPnBkZXYtPmRldiwgIiVzOiVkOihwaWQgJWQpOiAiIGZvcm1hdCwJXAorCQlfX2Z1bmNfXywgX19MSU5FX18sIGN1cnJlbnQtPnBpZCwJXAogCSAgICAgICAjI19fVkFfQVJHU19fKQogCiAjZGVmaW5lIG1seDVfY29yZV93YXJuKF9fZGV2LCBmb3JtYXQsIC4uLikJCQkJXApAQCAtNzUsMTkgKzc1LDYgQEAKIAlNTFg1X0NNRF9USU1FLCAvKiBwcmludCBjb21tYW5kIGV4ZWN1dGlvbiB0aW1lICovCiB9OwogCi1zdGF0aWMgaW5saW5lIGludCBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgKmluLAotCQkJCQkgICAgIGludCBpbl9zaXplLCB1MzIgKm91dCwKLQkJCQkJICAgICBpbnQgb3V0X3NpemUpCi17Ci0JaW50IGVycjsKLQotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5fc2l6ZSwgb3V0LCBvdXRfc2l6ZSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCXJldHVybiBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKChzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyICopb3V0KTsKLX0KLQogaW50IG1seDVfcXVlcnlfaGNhX2NhcHMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CiBpbnQgbWx4NV9xdWVyeV9ib2FyZF9pZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKIGludCBtbHg1X2NtZF9pbml0X2hjYShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKQEAgLTk2LDcgKzgzLDEyIEBACiAJCSAgICAgdW5zaWduZWQgbG9uZyBwYXJhbSk7CiB2b2lkIG1seDVfZW50ZXJfZXJyb3Jfc3RhdGUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CiB2b2lkIG1seDVfZGlzYWJsZV9kZXZpY2Uoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CitpbnQgbWx4NV9zcmlvdl9pbml0KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwordm9pZCBtbHg1X3NyaW92X2NsZWFudXAoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CitpbnQgbWx4NV9zcmlvdl9hdHRhY2goc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7Cit2b2lkIG1seDVfc3Jpb3ZfZGV0YWNoKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwogaW50IG1seDVfY29yZV9zcmlvdl9jb25maWd1cmUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG51bV92ZnMpOworYm9vbCBtbHg1X3NyaW92X2lzX2VuYWJsZWQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CiBpbnQgbWx4NV9jb3JlX2VuYWJsZV9oY2Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2IGZ1bmNfaWQpOwogaW50IG1seDVfY29yZV9kaXNhYmxlX2hjYShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgZnVuY19pZCk7CiBpbnQgbWx4NV93YWl0X2Zvcl92Zl9wYWdlcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKQEAgLTEwNSw3ICs5NywzOCBAQAogc3RydWN0IG1seDVfZXEgKm1seDVfZXFuMmVxKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIGludCBlcW4pOwogdm9pZCBtbHg1X2NxX3Rhc2tsZXRfY2IodW5zaWduZWQgbG9uZyBkYXRhKTsKIAordm9pZCBtbHg1X2xhZ19hZGQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7Cit2b2lkIG1seDVfbGFnX3JlbW92ZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKKwordm9pZCBtbHg1X2FkZF9kZXZpY2Uoc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmLCBzdHJ1Y3QgbWx4NV9wcml2ICpwcml2KTsKK3ZvaWQgbWx4NV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBtbHg1X2ludGVyZmFjZSAqaW50Ziwgc3RydWN0IG1seDVfcHJpdiAqcHJpdik7Cit2b2lkIG1seDVfYXR0YWNoX2RldmljZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKK3ZvaWQgbWx4NV9kZXRhY2hfZGV2aWNlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOworYm9vbCBtbHg1X2RldmljZV9yZWdpc3RlcmVkKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOworaW50IG1seDVfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwordm9pZCBtbHg1X3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwordm9pZCBtbHg1X2FkZF9kZXZfYnlfcHJvdG9jb2woc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgaW50IHByb3RvY29sKTsKK3ZvaWQgbWx4NV9yZW1vdmVfZGV2X2J5X3Byb3RvY29sKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIGludCBwcm90b2NvbCk7CitzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWx4NV9nZXRfbmV4dF9waHlzX2RldihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKK3ZvaWQgbWx4NV9kZXZfbGlzdF9sb2NrKHZvaWQpOwordm9pZCBtbHg1X2Rldl9saXN0X3VubG9jayh2b2lkKTsKK2ludCBtbHg1X2Rldl9saXN0X3RyeWxvY2sodm9pZCk7CisKK2Jvb2wgbWx4NV9sYWdfaW50Zl9hZGQoc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmLCBzdHJ1Y3QgbWx4NV9wcml2ICpwcml2KTsKKwogdm9pZCBtbHg1ZV9pbml0KHZvaWQpOwogdm9pZCBtbHg1ZV9jbGVhbnVwKHZvaWQpOwogCitzdGF0aWMgaW5saW5lIGludCBtbHg1X2xhZ19pc19sYWNwX293bmVyKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCit7CisJLyogTEFDUCBvd25lciBjb25kaXRpb25zOgorCSAqIDEpIEZ1bmN0aW9uIGlzIHBoeXNpY2FsLgorCSAqIDIpIExBRyBpcyBzdXBwb3J0ZWQgYnkgRlcuCisJICogMykgTEFHIGlzIG1hbmFnZWQgYnkgZHJpdmVyIChjdXJyZW50bHkgdGhlIG9ubHkgb3B0aW9uKS4KKwkgKi8KKwlyZXR1cm4gIE1MWDVfQ0FQX0dFTihkZXYsIHZwb3J0X2dyb3VwX21hbmFnZXIpICYmCisJCSAgIChNTFg1X0NBUF9HRU4oZGV2LCBudW1fbGFnX3BvcnRzKSA+IDEpICYmCisJCSAgICBNTFg1X0NBUF9HRU4oZGV2LCBsYWdfbWFzdGVyKTsKK30KKwogI2VuZGlmIC8qIF9fTUxYNV9DT1JFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21yLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbXIuYwppbmRleCA3N2E3MjkzOS4uYjk3MzZmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21yLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21yLmMKQEAgLTQ5LDQ4ICs0OSw0MyBAQAogewogfQogCi1pbnQgbWx4NV9jb3JlX2NyZWF0ZV9ta2V5KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCi0JCQkgIHN0cnVjdCBtbHg1X2NvcmVfbWtleSAqbWtleSwKLQkJCSAgc3RydWN0IG1seDVfY3JlYXRlX21rZXlfbWJveF9pbiAqaW4sIGludCBpbmxlbiwKLQkJCSAgbWx4NV9jbWRfY2JrX3QgY2FsbGJhY2ssIHZvaWQgKmNvbnRleHQsCi0JCQkgIHN0cnVjdCBtbHg1X2NyZWF0ZV9ta2V5X21ib3hfb3V0ICpvdXQpCitpbnQgbWx4NV9jb3JlX2NyZWF0ZV9ta2V5X2NiKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCisJCQkgICAgIHN0cnVjdCBtbHg1X2NvcmVfbWtleSAqbWtleSwKKwkJCSAgICAgdTMyICppbiwgaW50IGlubGVuLAorCQkJICAgICB1MzIgKm91dCwgaW50IG91dGxlbiwKKwkJCSAgICAgbWx4NV9jbWRfY2JrX3QgY2FsbGJhY2ssIHZvaWQgKmNvbnRleHQpCiB7CiAJc3RydWN0IG1seDVfbWtleV90YWJsZSAqdGFibGUgPSAmZGV2LT5wcml2Lm1rZXlfdGFibGU7Ci0Jc3RydWN0IG1seDVfY3JlYXRlX21rZXlfbWJveF9vdXQgbG91dDsKKwl1MzIgbG91dFtNTFg1X1NUX1NaX0RXKGNyZWF0ZV9ta2V5X291dCldID0gezB9OworCXUzMiBta2V5X2luZGV4OworCXZvaWQgKm1rYzsKIAlpbnQgZXJyOwogCXU4IGtleTsKIAotCW1lbXNldCgmbG91dCwgMCwgc2l6ZW9mKGxvdXQpKTsKIAlzcGluX2xvY2tfaXJxKCZkZXYtPnByaXYubWtleV9sb2NrKTsKIAlrZXkgPSBkZXYtPnByaXYubWtleV9rZXkrKzsKIAlzcGluX3VubG9ja19pcnEoJmRldi0+cHJpdi5ta2V5X2xvY2spOwotCWluLT5zZWcucXBuX21rZXk3XzAgfD0gY3B1X3RvX2JlMzIoa2V5KTsKLQlpbi0+aGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX0NSRUFURV9NS0VZKTsKLQlpZiAoY2FsbGJhY2spIHsKLQkJZXJyID0gbWx4NV9jbWRfZXhlY19jYihkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2YoKm91dCksCi0JCQkJICAgICAgIGNhbGxiYWNrLCBjb250ZXh0KTsKKwlta2MgPSBNTFg1X0FERFJfT0YoY3JlYXRlX21rZXlfaW4sIGluLCBtZW1vcnlfa2V5X21rZXlfZW50cnkpOworCisJTUxYNV9TRVQoY3JlYXRlX21rZXlfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0NSRUFURV9NS0VZKTsKKwlNTFg1X1NFVChta2MsIG1rYywgbWtleV83XzAsIGtleSk7CisKKwlpZiAoY2FsbGJhY2spCisJCXJldHVybiBtbHg1X2NtZF9leGVjX2NiKGRldiwgaW4sIGlubGVuLCBvdXQsIG91dGxlbiwKKwkJCQkJY2FsbGJhY2ssIGNvbnRleHQpOworCisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgbG91dCwgc2l6ZW9mKGxvdXQpKTsKKwlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCX0gZWxzZSB7Ci0JCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sICZsb3V0LCBzaXplb2YobG91dCkpOwotCX0KIAotCWlmIChlcnIpIHsKLQkJbWx4NV9jb3JlX2RiZyhkZXYsICJjbWQgZXhlYyBmYWlsZWQgJWRcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JaWYgKGxvdXQuaGRyLnN0YXR1cykgewotCQltbHg1X2NvcmVfZGJnKGRldiwgInN0YXR1cyAlZFxuIiwgbG91dC5oZHIuc3RhdHVzKTsKLQkJcmV0dXJuIG1seDVfY21kX3N0YXR1c190b19lcnIoJmxvdXQuaGRyKTsKLQl9Ci0KLQlta2V5LT5pb3ZhID0gYmU2NF90b19jcHUoaW4tPnNlZy5zdGFydF9hZGRyKTsKLQlta2V5LT5zaXplID0gYmU2NF90b19jcHUoaW4tPnNlZy5sZW4pOwotCW1rZXktPmtleSA9IG1seDVfaWR4X3RvX21rZXkoYmUzMl90b19jcHUobG91dC5ta2V5KSAmIDB4ZmZmZmZmKSB8IGtleTsKLQlta2V5LT5wZCA9IGJlMzJfdG9fY3B1KGluLT5zZWcuZmxhZ3NfcGQpICYgMHhmZmZmZmY7CisJbWtleV9pbmRleCA9IE1MWDVfR0VUKGNyZWF0ZV9ta2V5X291dCwgbG91dCwgbWtleV9pbmRleCk7CisJbWtleS0+aW92YSA9IE1MWDVfR0VUNjQobWtjLCBta2MsIHN0YXJ0X2FkZHIpOworCW1rZXktPnNpemUgPSBNTFg1X0dFVDY0KG1rYywgbWtjLCBsZW4pOworCW1rZXktPmtleSA9IG1seDVfaWR4X3RvX21rZXkobWtleV9pbmRleCkgfCBrZXk7CisJbWtleS0+cGQgPSBNTFg1X0dFVChta2MsIG1rYywgcGQpOwogCiAJbWx4NV9jb3JlX2RiZyhkZXYsICJvdXQgMHgleCwga2V5IDB4JXgsIG1rZXkgMHgleFxuIiwKLQkJICAgICAgYmUzMl90b19jcHUobG91dC5ta2V5KSwga2V5LCBta2V5LT5rZXkpOworCQkgICAgICBta2V5X2luZGV4LCBrZXksIG1rZXktPmtleSk7CiAKIAkvKiBjb25uZWN0IHRvIG1rZXkgdHJlZSAqLwogCXdyaXRlX2xvY2tfaXJxKCZ0YWJsZS0+bG9jayk7CkBAIC0xMDQsMjAgKzk5LDI1IEBACiAKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfY3JlYXRlX21rZXlfY2IpOworCitpbnQgbWx4NV9jb3JlX2NyZWF0ZV9ta2V5KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCisJCQkgIHN0cnVjdCBtbHg1X2NvcmVfbWtleSAqbWtleSwKKwkJCSAgdTMyICppbiwgaW50IGlubGVuKQoreworCXJldHVybiBtbHg1X2NvcmVfY3JlYXRlX21rZXlfY2IoZGV2LCBta2V5LCBpbiwgaW5sZW4sCisJCQkJCU5VTEwsIDAsIE5VTEwsIE5VTEwpOworfQogRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfY3JlYXRlX21rZXkpOwogCiBpbnQgbWx4NV9jb3JlX2Rlc3Ryb3lfbWtleShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkJICAgc3RydWN0IG1seDVfY29yZV9ta2V5ICpta2V5KQogewogCXN0cnVjdCBtbHg1X21rZXlfdGFibGUgKnRhYmxlID0gJmRldi0+cHJpdi5ta2V5X3RhYmxlOwotCXN0cnVjdCBtbHg1X2Rlc3Ryb3lfbWtleV9tYm94X2luIGluOwotCXN0cnVjdCBtbHg1X2Rlc3Ryb3lfbWtleV9tYm94X291dCBvdXQ7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfbWtleV9vdXQpXSA9IHswfTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X21rZXlfaW4pXSAgID0gezB9OwogCXN0cnVjdCBtbHg1X2NvcmVfbWtleSAqZGVsZXRlZF9ta2V5OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGVycjsKLQotCW1lbXNldCgmaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldCgmb3V0LCAwLCBzaXplb2Yob3V0KSk7CiAKIAl3cml0ZV9sb2NrX2lycXNhdmUoJnRhYmxlLT5sb2NrLCBmbGFncyk7CiAJZGVsZXRlZF9ta2V5ID0gcmFkaXhfdHJlZV9kZWxldGUoJnRhYmxlLT50cmVlLCBtbHg1X2Jhc2VfbWtleShta2V5LT5rZXkpKTsKQEAgLTEyOCw5NCArMTI4LDcxIEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9ERVNUUk9ZX01LRVkpOwotCWluLm1rZXkgPSBjcHVfdG9fYmUzMihtbHg1X21rZXlfdG9faWR4KG1rZXktPmtleSkpOwotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCAmaW4sIHNpemVvZihpbiksICZvdXQsIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKG91dC5oZHIuc3RhdHVzKQotCQlyZXR1cm4gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0KLQlyZXR1cm4gZXJyOworCU1MWDVfU0VUKGRlc3Ryb3lfbWtleV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfREVTVFJPWV9NS0VZKTsKKwlNTFg1X1NFVChkZXN0cm95X21rZXlfaW4sIGluLCBta2V5X2luZGV4LCBtbHg1X21rZXlfdG9faWR4KG1rZXktPmtleSkpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfZGVzdHJveV9ta2V5KTsKIAogaW50IG1seDVfY29yZV9xdWVyeV9ta2V5KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2NvcmVfbWtleSAqbWtleSwKLQkJCSBzdHJ1Y3QgbWx4NV9xdWVyeV9ta2V5X21ib3hfb3V0ICpvdXQsIGludCBvdXRsZW4pCisJCQkgdTMyICpvdXQsIGludCBvdXRsZW4pCiB7Ci0Jc3RydWN0IG1seDVfcXVlcnlfbWtleV9tYm94X2luIGluOwotCWludCBlcnI7CisJdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfbWtleV9pbildID0gezB9OwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7CiAJbWVtc2V0KG91dCwgMCwgb3V0bGVuKTsKLQotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9RVUVSWV9NS0VZKTsKLQlpbi5ta2V5ID0gY3B1X3RvX2JlMzIobWx4NV9ta2V5X3RvX2lkeChta2V5LT5rZXkpKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCBvdXQsIG91dGxlbik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmIChvdXQtPmhkci5zdGF0dXMpCi0JCXJldHVybiBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQtPmhkcik7Ci0KLQlyZXR1cm4gZXJyOworCU1MWDVfU0VUKHF1ZXJ5X21rZXlfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX1FVRVJZX01LRVkpOworCU1MWDVfU0VUKHF1ZXJ5X21rZXlfaW4sIGluLCBta2V5X2luZGV4LCBtbHg1X21rZXlfdG9faWR4KG1rZXktPmtleSkpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKIH0KIEVYUE9SVF9TWU1CT0wobWx4NV9jb3JlX3F1ZXJ5X21rZXkpOwogCiBpbnQgbWx4NV9jb3JlX2R1bXBfZmlsbF9ta2V5KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2NvcmVfbWtleSAqX21rZXksCiAJCQkgICAgIHUzMiAqbWtleSkKIHsKLQlzdHJ1Y3QgbWx4NV9xdWVyeV9zcGVjaWFsX2N0eHNfbWJveF9pbiBpbjsKLQlzdHJ1Y3QgbWx4NV9xdWVyeV9zcGVjaWFsX2N0eHNfbWJveF9vdXQgb3V0OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhxdWVyeV9zcGVjaWFsX2NvbnRleHRzX291dCldID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X3NwZWNpYWxfY29udGV4dHNfaW4pXSAgID0gezB9OwogCWludCBlcnI7CiAKLQltZW1zZXQoJmluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwotCi0JaW4uaGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX1FVRVJZX1NQRUNJQUxfQ09OVEVYVFMpOwotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCAmaW4sIHNpemVvZihpbiksICZvdXQsIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKG91dC5oZHIuc3RhdHVzKQotCQlyZXR1cm4gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0KLQkqbWtleSA9IGJlMzJfdG9fY3B1KG91dC5kdW1wX2ZpbGxfbWtleSk7Ci0KKwlNTFg1X1NFVChxdWVyeV9zcGVjaWFsX2NvbnRleHRzX2luLCBpbiwgb3Bjb2RlLAorCQkgTUxYNV9DTURfT1BfUVVFUllfU1BFQ0lBTF9DT05URVhUUyk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKKwlpZiAoIWVycikKKwkJKm1rZXkgPSBNTFg1X0dFVChxdWVyeV9zcGVjaWFsX2NvbnRleHRzX291dCwgb3V0LAorCQkJCSBkdW1wX2ZpbGxfbWtleSk7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0wobWx4NV9jb3JlX2R1bXBfZmlsbF9ta2V5KTsKIAorc3RhdGljIGlubGluZSB1MzIgbWx4NV9nZXRfcHN2KHUzMiAqb3V0LCBpbnQgcHN2X2luZGV4KQoreworCXN3aXRjaCAocHN2X2luZGV4KSB7CisJY2FzZSAxOiByZXR1cm4gTUxYNV9HRVQoY3JlYXRlX3Bzdl9vdXQsIG91dCwgcHN2MV9pbmRleCk7CisJY2FzZSAyOiByZXR1cm4gTUxYNV9HRVQoY3JlYXRlX3Bzdl9vdXQsIG91dCwgcHN2Ml9pbmRleCk7CisJY2FzZSAzOiByZXR1cm4gTUxYNV9HRVQoY3JlYXRlX3Bzdl9vdXQsIG91dCwgcHN2M19pbmRleCk7CisJZGVmYXVsdDogcmV0dXJuIE1MWDVfR0VUKGNyZWF0ZV9wc3Zfb3V0LCBvdXQsIHBzdjBfaW5kZXgpOworCX0KK30KKwogaW50IG1seDVfY29yZV9jcmVhdGVfcHN2KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiBwZG4sCiAJCQkgaW50IG5wc3ZzLCB1MzIgKnNpZ19pbmRleCkKIHsKLQlzdHJ1Y3QgbWx4NV9hbGxvY2F0ZV9wc3ZfaW4gaW47Ci0Jc3RydWN0IG1seDVfYWxsb2NhdGVfcHN2X291dCBvdXQ7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGNyZWF0ZV9wc3Zfb3V0KV0gPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoY3JlYXRlX3Bzdl9pbildICAgPSB7MH07CiAJaW50IGksIGVycjsKIAogCWlmIChucHN2cyA+IE1MWDVfTUFYX1BTVlMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKKwlNTFg1X1NFVChjcmVhdGVfcHN2X2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9DUkVBVEVfUFNWKTsKKwlNTFg1X1NFVChjcmVhdGVfcHN2X2luLCBpbiwgcGQsIHBkbik7CisJTUxYNV9TRVQoY3JlYXRlX3Bzdl9pbiwgaW4sIG51bV9wc3YsIG5wc3ZzKTsKIAotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9DUkVBVEVfUFNWKTsKLQlpbi5ucHN2X3BkID0gY3B1X3RvX2JlMzIoKG5wc3ZzIDw8IDI4KSB8IHBkbik7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgJm91dCwgc2l6ZW9mKG91dCkpOwotCWlmIChlcnIpIHsKLQkJbWx4NV9jb3JlX2VycihkZXYsICJjbWQgZXhlYyBmYWlsZWQgJWRcbiIsIGVycik7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKKwlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmIChvdXQuaGRyLnN0YXR1cykgewotCQltbHg1X2NvcmVfZXJyKGRldiwgImNyZWF0ZV9wc3YgYmFkIHN0YXR1cyAlZFxuIiwKLQkJCSAgICAgIG91dC5oZHIuc3RhdHVzKTsKLQkJcmV0dXJuIG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwotCX0KIAogCWZvciAoaSA9IDA7IGkgPCBucHN2czsgaSsrKQotCQlzaWdfaW5kZXhbaV0gPSBiZTMyX3RvX2NwdShvdXQucHN2X2lkeFtpXSkgJiAweGZmZmZmZjsKKwkJc2lnX2luZGV4W2ldID0gbWx4NV9nZXRfcHN2KG91dCwgaSk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjIzLDI5ICsyMDAsMTEgQEAKIAogaW50IG1seDVfY29yZV9kZXN0cm95X3BzdihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBpbnQgcHN2X251bSkKIHsKLQlzdHJ1Y3QgbWx4NV9kZXN0cm95X3Bzdl9pbiBpbjsKLQlzdHJ1Y3QgbWx4NV9kZXN0cm95X3Bzdl9vdXQgb3V0OwotCWludCBlcnI7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfcHN2X291dCldID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfcHN2X2luKV0gICA9IHswfTsKIAotCW1lbXNldCgmaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldCgmb3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0KLQlpbi5wc3ZfbnVtYmVyID0gY3B1X3RvX2JlMzIocHN2X251bSk7Ci0JaW4uaGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX0RFU1RST1lfUFNWKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCAmb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikgewotCQltbHg1X2NvcmVfZXJyKGRldiwgImRlc3Ryb3lfcHN2IGNtZCBleGVjIGZhaWxlZCAlZFxuIiwgZXJyKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKG91dC5oZHIuc3RhdHVzKSB7Ci0JCW1seDVfY29yZV9lcnIoZGV2LCAiZGVzdHJveV9wc3YgYmFkIHN0YXR1cyAlZFxuIiwKLQkJCSAgICAgIG91dC5oZHIuc3RhdHVzKTsKLQkJZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0JCWdvdG8gb3V0OwotCX0KLQotb3V0OgotCXJldHVybiBlcnI7CisJTUxYNV9TRVQoZGVzdHJveV9wc3ZfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0RFU1RST1lfUFNWKTsKKwlNTFg1X1NFVChkZXN0cm95X3Bzdl9pbiwgaW4sIHBzdm4sIHBzdl9udW0pOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfZGVzdHJveV9wc3YpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3BhZ2VhbGxvYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3BhZ2VhbGxvYy5jCmluZGV4IDMyZGVhMzUuLmQ0NTg1MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9wYWdlYWxsb2MuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcGFnZWFsbG9jLmMKQEAgLTQ0LDEyICs0NCw2IEBACiAJTUxYNV9QQUdFU19UQUtFCQk9IDIKIH07CiAKLWVudW0gewotCU1MWDVfQk9PVF9QQUdFUwkJPSAxLAotCU1MWDVfSU5JVF9QQUdFUwkJPSAyLAotCU1MWDVfUE9TVF9JTklUX1BBR0VTCT0gMwotfTsKLQogc3RydWN0IG1seDVfcGFnZXNfcmVxIHsKIAlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2OwogCXUxNglmdW5jX2lkOwpAQCAtNjcsMzMgKzYxLDYgQEAKIAl1bnNpZ25lZAkJZnJlZV9jb3VudDsKIH07CiAKLXN0cnVjdCBtbHg1X3F1ZXJ5X3BhZ2VzX2luYm94IHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X3F1ZXJ5X3BhZ2VzX291dGJveCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JX19iZTE2CQkJcnN2ZDsKLQlfX2JlMTYJCQlmdW5jX2lkOwotCV9fYmUzMgkJCW51bV9wYWdlczsKLX07Ci0KLXN0cnVjdCBtbHg1X21hbmFnZV9wYWdlc19pbmJveCB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMTYJCQlyc3ZkOwotCV9fYmUxNgkJCWZ1bmNfaWQ7Ci0JX19iZTMyCQkJbnVtX2VudHJpZXM7Ci0JX19iZTY0CQkJcGFzWzBdOwotfTsKLQotc3RydWN0IG1seDVfbWFuYWdlX3BhZ2VzX291dGJveCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JX19iZTMyCQkJbnVtX2VudHJpZXM7Ci0JdTgJCQlyc3ZkWzRdOwotCV9fYmU2NAkJCXBhc1swXTsKLX07Ci0KIGVudW0gewogCU1BWF9SRUNMQUlNX1RJTUVfTVNFQ1MJPSA1MDAwLAogCU1BWF9SRUNMQUlNX1ZGU19QQUdFU19USU1FX01TRUNTID0gMiAqIDEwMDAgKiA2MCwKQEAgLTE2NywyNCArMTM0LDIxIEBACiBzdGF0aWMgaW50IG1seDVfY21kX3F1ZXJ5X3BhZ2VzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUxNiAqZnVuY19pZCwKIAkJCQlzMzIgKm5wYWdlcywgaW50IGJvb3QpCiB7Ci0Jc3RydWN0IG1seDVfcXVlcnlfcGFnZXNfaW5ib3gJaW47Ci0Jc3RydWN0IG1seDVfcXVlcnlfcGFnZXNfb3V0Ym94CW91dDsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcocXVlcnlfcGFnZXNfb3V0KV0gPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfcGFnZXNfaW4pXSAgID0gezB9OwogCWludCBlcnI7CiAKLQltZW1zZXQoJmluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9RVUVSWV9QQUdFUyk7Ci0JaW4uaGRyLm9wbW9kID0gYm9vdCA/IGNwdV90b19iZTE2KE1MWDVfQk9PVF9QQUdFUykgOiBjcHVfdG9fYmUxNihNTFg1X0lOSVRfUEFHRVMpOworCU1MWDVfU0VUKHF1ZXJ5X3BhZ2VzX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9RVUVSWV9QQUdFUyk7CisJTUxYNV9TRVQocXVlcnlfcGFnZXNfaW4sIGluLCBvcF9tb2QsIGJvb3QgPworCQkgTUxYNV9RVUVSWV9QQUdFU19JTl9PUF9NT0RfQk9PVF9QQUdFUyA6CisJCSBNTFg1X1FVRVJZX1BBR0VTX0lOX09QX01PRF9JTklUX1BBR0VTKTsKIAotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCAmaW4sIHNpemVvZihpbiksICZvdXQsIHNpemVvZihvdXQpKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlpZiAob3V0Lmhkci5zdGF0dXMpCi0JCXJldHVybiBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQuaGRyKTsKLQotCSpucGFnZXMgPSBiZTMyX3RvX2NwdShvdXQubnVtX3BhZ2VzKTsKLQkqZnVuY19pZCA9IGJlMTZfdG9fY3B1KG91dC5mdW5jX2lkKTsKKwkqbnBhZ2VzID0gTUxYNV9HRVQocXVlcnlfcGFnZXNfb3V0LCBvdXQsIG51bV9wYWdlcyk7CisJKmZ1bmNfaWQgPSBNTFg1X0dFVChxdWVyeV9wYWdlc19vdXQsIG91dCwgZnVuY3Rpb25faWQpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTI4MCw0NiArMjQ0LDM3IEBACiAKIHN0YXRpYyB2b2lkIHBhZ2Vfbm90aWZ5X2ZhaWwoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2IGZ1bmNfaWQpCiB7Ci0Jc3RydWN0IG1seDVfbWFuYWdlX3BhZ2VzX2luYm94ICppbjsKLQlzdHJ1Y3QgbWx4NV9tYW5hZ2VfcGFnZXNfb3V0Ym94IG91dDsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcobWFuYWdlX3BhZ2VzX291dCldID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKG1hbmFnZV9wYWdlc19pbildICAgPSB7MH07CiAJaW50IGVycjsKIAotCWluID0ga3phbGxvYyhzaXplb2YoKmluKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbikKLQkJcmV0dXJuOworCU1MWDVfU0VUKG1hbmFnZV9wYWdlc19pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfTUFOQUdFX1BBR0VTKTsKKwlNTFg1X1NFVChtYW5hZ2VfcGFnZXNfaW4sIGluLCBvcF9tb2QsIE1MWDVfUEFHRVNfQ0FOVF9HSVZFKTsKKwlNTFg1X1NFVChtYW5hZ2VfcGFnZXNfaW4sIGluLCBmdW5jdGlvbl9pZCwgZnVuY19pZCk7CiAKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWluLT5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfTUFOQUdFX1BBR0VTKTsKLQlpbi0+aGRyLm9wbW9kID0gY3B1X3RvX2JlMTYoTUxYNV9QQUdFU19DQU5UX0dJVkUpOwotCWluLT5mdW5jX2lkID0gY3B1X3RvX2JlMTYoZnVuY19pZCk7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoKmluKSwgJm91dCwgc2l6ZW9mKG91dCkpOwotCWlmICghZXJyKQotCQllcnIgPSBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQuaGRyKTsKLQorCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiAJaWYgKGVycikKLQkJbWx4NV9jb3JlX3dhcm4oZGV2LCAicGFnZSBub3RpZnkgZmFpbGVkXG4iKTsKLQotCWtmcmVlKGluKTsKKwkJbWx4NV9jb3JlX3dhcm4oZGV2LCAicGFnZSBub3RpZnkgZmFpbGVkIGZ1bmNfaWQoJWQpIGVyciglZClcbiIsCisJCQkgICAgICAgZnVuY19pZCwgZXJyKTsKIH0KIAogc3RhdGljIGludCBnaXZlX3BhZ2VzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUxNiBmdW5jX2lkLCBpbnQgbnBhZ2VzLAogCQkgICAgICBpbnQgbm90aWZ5X2ZhaWwpCiB7Ci0Jc3RydWN0IG1seDVfbWFuYWdlX3BhZ2VzX2luYm94ICppbjsKLQlzdHJ1Y3QgbWx4NV9tYW5hZ2VfcGFnZXNfb3V0Ym94IG91dDsKLQlpbnQgaW5sZW47CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKG1hbmFnZV9wYWdlc19vdXQpXSA9IHswfTsKKwlpbnQgaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKG1hbmFnZV9wYWdlc19pbik7CiAJdTY0IGFkZHI7CiAJaW50IGVycjsKKwl1MzIgKmluOwogCWludCBpOwogCi0JaW5sZW4gPSBzaXplb2YoKmluKSArIG5wYWdlcyAqIHNpemVvZihpbi0+cGFzWzBdKTsKKwlpbmxlbiArPSBucGFnZXMgKiBNTFg1X0ZMRF9TWl9CWVRFUyhtYW5hZ2VfcGFnZXNfaW4sIHBhc1swXSk7CiAJaW4gPSBtbHg1X3Z6YWxsb2MoaW5sZW4pOwogCWlmICghaW4pIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJbWx4NV9jb3JlX3dhcm4oZGV2LCAidnphbGxvYyBmYWlsZWQgJWRcbiIsIGlubGVuKTsKIAkJZ290byBvdXRfZnJlZTsKIAl9Ci0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKIAogCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykgewogcmV0cnk6CkBAIC0zMzIsMjcgKzI4NywyMSBAQAogCiAJCQlnb3RvIHJldHJ5OwogCQl9Ci0JCWluLT5wYXNbaV0gPSBjcHVfdG9fYmU2NChhZGRyKTsKKwkJTUxYNV9TRVQ2NChtYW5hZ2VfcGFnZXNfaW4sIGluLCBwYXNbaV0sIGFkZHIpOwogCX0KIAotCWluLT5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfTUFOQUdFX1BBR0VTKTsKLQlpbi0+aGRyLm9wbW9kID0gY3B1X3RvX2JlMTYoTUxYNV9QQUdFU19HSVZFKTsKLQlpbi0+ZnVuY19pZCA9IGNwdV90b19iZTE2KGZ1bmNfaWQpOwotCWluLT5udW1fZW50cmllcyA9IGNwdV90b19iZTMyKG5wYWdlcyk7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgJm91dCwgc2l6ZW9mKG91dCkpOworCU1MWDVfU0VUKG1hbmFnZV9wYWdlc19pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfTUFOQUdFX1BBR0VTKTsKKwlNTFg1X1NFVChtYW5hZ2VfcGFnZXNfaW4sIGluLCBvcF9tb2QsIE1MWDVfUEFHRVNfR0lWRSk7CisJTUxYNV9TRVQobWFuYWdlX3BhZ2VzX2luLCBpbiwgZnVuY3Rpb25faWQsIGZ1bmNfaWQpOworCU1MWDVfU0VUKG1hbmFnZV9wYWdlc19pbiwgaW4sIGlucHV0X251bV9lbnRyaWVzLCBucGFnZXMpOworCisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CiAJaWYgKGVycikgewogCQltbHg1X2NvcmVfd2FybihkZXYsICJmdW5jX2lkIDB4JXgsIG5wYWdlcyAlZCwgZXJyICVkXG4iLAogCQkJICAgICAgIGZ1bmNfaWQsIG5wYWdlcywgZXJyKTsKIAkJZ290byBvdXRfNGs7CiAJfQogCi0JZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0JaWYgKGVycikgewotCQltbHg1X2NvcmVfd2FybihkZXYsICJmdW5jX2lkIDB4JXgsIG5wYWdlcyAlZCwgc3RhdHVzICVkXG4iLAotCQkJICAgICAgIGZ1bmNfaWQsIG5wYWdlcywgb3V0Lmhkci5zdGF0dXMpOwotCQlnb3RvIG91dF80azsKLQl9Ci0KIAlkZXYtPnByaXYuZndfcGFnZXMgKz0gbnBhZ2VzOwogCWlmIChmdW5jX2lkKQogCQlkZXYtPnByaXYudmZzX3BhZ2VzICs9IG5wYWdlczsKQEAgLTM2NCw3ICszMTMsNyBAQAogCiBvdXRfNGs6CiAJZm9yIChpLS07IGkgPj0gMDsgaS0tKQotCQlmcmVlXzRrKGRldiwgYmU2NF90b19jcHUoaW4tPnBhc1tpXSkpOworCQlmcmVlXzRrKGRldiwgTUxYNV9HRVQ2NChtYW5hZ2VfcGFnZXNfaW4sIGluLCBwYXNbaV0pKTsKIG91dF9mcmVlOgogCWt2ZnJlZShpbik7CiAJaWYgKG5vdGlmeV9mYWlsKQpAQCAtMzczLDY0ICszMjIsNjcgQEAKIH0KIAogc3RhdGljIGludCByZWNsYWltX3BhZ2VzX2NtZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAotCQkJICAgICBzdHJ1Y3QgbWx4NV9tYW5hZ2VfcGFnZXNfaW5ib3ggKmluLCBpbnQgaW5fc2l6ZSwKLQkJCSAgICAgc3RydWN0IG1seDVfbWFuYWdlX3BhZ2VzX291dGJveCAqb3V0LCBpbnQgb3V0X3NpemUpCisJCQkgICAgIHUzMiAqaW4sIGludCBpbl9zaXplLCB1MzIgKm91dCwgaW50IG91dF9zaXplKQogewogCXN0cnVjdCBmd19wYWdlICpmd3A7CiAJc3RydWN0IHJiX25vZGUgKnA7CisJdTMyIGZ1bmNfaWQ7CiAJdTMyIG5wYWdlczsKIAl1MzIgaSA9IDA7CiAKIAlpZiAoZGV2LT5zdGF0ZSAhPSBNTFg1X0RFVklDRV9TVEFURV9JTlRFUk5BTF9FUlJPUikKLQkJcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgKHUzMiAqKWluLCBpbl9zaXplLAotCQkJCQkJICAodTMyICopb3V0LCBvdXRfc2l6ZSk7CisJCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGluX3NpemUsIG91dCwgb3V0X3NpemUpOwogCi0JbnBhZ2VzID0gYmUzMl90b19jcHUoaW4tPm51bV9lbnRyaWVzKTsKKwkvKiBObyBoYXJkIGZlZWxpbmdzLCB3ZSB3YW50IG91ciBwYWdlcyBiYWNrISAqLworCW5wYWdlcyA9IE1MWDVfR0VUKG1hbmFnZV9wYWdlc19pbiwgaW4sIGlucHV0X251bV9lbnRyaWVzKTsKKwlmdW5jX2lkID0gTUxYNV9HRVQobWFuYWdlX3BhZ2VzX2luLCBpbiwgZnVuY3Rpb25faWQpOwogCiAJcCA9IHJiX2ZpcnN0KCZkZXYtPnByaXYucGFnZV9yb290KTsKIAl3aGlsZSAocCAmJiBpIDwgbnBhZ2VzKSB7CiAJCWZ3cCA9IHJiX2VudHJ5KHAsIHN0cnVjdCBmd19wYWdlLCByYl9ub2RlKTsKLQkJb3V0LT5wYXNbaV0gPSBjcHVfdG9fYmU2NChmd3AtPmFkZHIpOwogCQlwID0gcmJfbmV4dChwKTsKKwkJaWYgKGZ3cC0+ZnVuY19pZCAhPSBmdW5jX2lkKQorCQkJY29udGludWU7CisKKwkJTUxYNV9TRVQ2NChtYW5hZ2VfcGFnZXNfb3V0LCBvdXQsIHBhc1tpXSwgZndwLT5hZGRyKTsKIAkJaSsrOwogCX0KIAotCW91dC0+bnVtX2VudHJpZXMgPSBjcHVfdG9fYmUzMihpKTsKKwlNTFg1X1NFVChtYW5hZ2VfcGFnZXNfb3V0LCBvdXQsIG91dHB1dF9udW1fZW50cmllcywgaSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcmVjbGFpbV9wYWdlcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgZnVuY19pZCwgaW50IG5wYWdlcywKIAkJCSBpbnQgKm5jbGFpbWVkKQogewotCXN0cnVjdCBtbHg1X21hbmFnZV9wYWdlc19pbmJveCAgIGluOwotCXN0cnVjdCBtbHg1X21hbmFnZV9wYWdlc19vdXRib3ggKm91dDsKKwlpbnQgb3V0bGVuID0gTUxYNV9TVF9TWl9CWVRFUyhtYW5hZ2VfcGFnZXNfb3V0KTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhtYW5hZ2VfcGFnZXNfaW4pXSA9IHswfTsKIAlpbnQgbnVtX2NsYWltZWQ7Ci0JaW50IG91dGxlbjsKLQl1NjQgYWRkcjsKKwl1MzIgKm91dDsKIAlpbnQgZXJyOwogCWludCBpOwogCiAJaWYgKG5jbGFpbWVkKQogCQkqbmNsYWltZWQgPSAwOwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7Ci0Jb3V0bGVuID0gc2l6ZW9mKCpvdXQpICsgbnBhZ2VzICogc2l6ZW9mKG91dC0+cGFzWzBdKTsKKwlvdXRsZW4gKz0gbnBhZ2VzICogTUxYNV9GTERfU1pfQllURVMobWFuYWdlX3BhZ2VzX291dCwgcGFzWzBdKTsKIAlvdXQgPSBtbHg1X3Z6YWxsb2Mob3V0bGVuKTsKIAlpZiAoIW91dCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfTUFOQUdFX1BBR0VTKTsKLQlpbi5oZHIub3Btb2QgPSBjcHVfdG9fYmUxNihNTFg1X1BBR0VTX1RBS0UpOwotCWluLmZ1bmNfaWQgPSBjcHVfdG9fYmUxNihmdW5jX2lkKTsKLQlpbi5udW1fZW50cmllcyA9IGNwdV90b19iZTMyKG5wYWdlcyk7CisJTUxYNV9TRVQobWFuYWdlX3BhZ2VzX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9NQU5BR0VfUEFHRVMpOworCU1MWDVfU0VUKG1hbmFnZV9wYWdlc19pbiwgaW4sIG9wX21vZCwgTUxYNV9QQUdFU19UQUtFKTsKKwlNTFg1X1NFVChtYW5hZ2VfcGFnZXNfaW4sIGluLCBmdW5jdGlvbl9pZCwgZnVuY19pZCk7CisJTUxYNV9TRVQobWFuYWdlX3BhZ2VzX2luLCBpbiwgaW5wdXRfbnVtX2VudHJpZXMsIG5wYWdlcyk7CisKIAltbHg1X2NvcmVfZGJnKGRldiwgIm5wYWdlcyAlZCwgb3V0bGVuICVkXG4iLCBucGFnZXMsIG91dGxlbik7Ci0JZXJyID0gcmVjbGFpbV9wYWdlc19jbWQoZGV2LCAmaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKKwllcnIgPSByZWNsYWltX3BhZ2VzX2NtZChkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIG91dGxlbik7CiAJaWYgKGVycikgewogCQltbHg1X2NvcmVfZXJyKGRldiwgImZhaWxlZCByZWNsYWltaW5nIHBhZ2VzOiBlcnIgJWRcbiIsIGVycik7CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCi0JbnVtX2NsYWltZWQgPSBiZTMyX3RvX2NwdShvdXQtPm51bV9lbnRyaWVzKTsKKwludW1fY2xhaW1lZCA9IE1MWDVfR0VUKG1hbmFnZV9wYWdlc19vdXQsIG91dCwgb3V0cHV0X251bV9lbnRyaWVzKTsKIAlpZiAobnVtX2NsYWltZWQgPiBucGFnZXMpIHsKIAkJbWx4NV9jb3JlX3dhcm4oZGV2LCAiZncgcmV0dXJuZWQgJWQsIGRyaXZlciBhc2tlZCAlZCA9PiBjb3JydXB0aW9uXG4iLAogCQkJICAgICAgIG51bV9jbGFpbWVkLCBucGFnZXMpOwpAQCAtNDM4LDEwICszOTAsOSBAQAogCQlnb3RvIG91dF9mcmVlOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBudW1fY2xhaW1lZDsgaSsrKSB7Ci0JCWFkZHIgPSBiZTY0X3RvX2NwdShvdXQtPnBhc1tpXSk7Ci0JCWZyZWVfNGsoZGV2LCBhZGRyKTsKLQl9CisJZm9yIChpID0gMDsgaSA8IG51bV9jbGFpbWVkOyBpKyspCisJCWZyZWVfNGsoZGV2LCBNTFg1X0dFVDY0KG1hbmFnZV9wYWdlc19vdXQsIG91dCwgcGFzW2ldKSk7CisKIAogCWlmIChuY2xhaW1lZCkKIAkJKm5jbGFpbWVkID0gbnVtX2NsYWltZWQ7CkBAIC01MTgsOCArNDY5LDggQEAKIAlpbnQgcmV0OwogCiAJcmV0ID0gKHNpemVvZihsYXktPm91dCkgKyBNTFg1X0JMS1NfRk9SX1JFQ0xBSU1fUEFHRVMgKiBzaXplb2YoYmxvY2stPmRhdGEpIC0KLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtbHg1X21hbmFnZV9wYWdlc19vdXRib3gpKSAvCi0JICAgICAgIEZJRUxEX1NJWkVPRihzdHJ1Y3QgbWx4NV9tYW5hZ2VfcGFnZXNfb3V0Ym94LCBwYXNbMF0pOworCSAgICAgICBNTFg1X1NUX1NaX0JZVEVTKG1hbmFnZV9wYWdlc19vdXQpKSAvCisJICAgICAgIE1MWDVfRkxEX1NaX0JZVEVTKG1hbmFnZV9wYWdlc19vdXQsIHBhc1swXSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNTk0LDYgKzU0NSwxMiBAQAogCXVuc2lnbmVkIGxvbmcgZW5kID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoTUFYX1JFQ0xBSU1fVkZTX1BBR0VTX1RJTUVfTVNFQ1MpOwogCWludCBwcmV2X3Zmc19wYWdlcyA9IGRldi0+cHJpdi52ZnNfcGFnZXM7CiAKKwkvKiBJbiBjYXNlIG9mIGludGVybmFsIGVycm9yIHdlIHdpbGwgZnJlZSB0aGUgcGFnZXMgbWFudWFsbHkgbGF0ZXIgKi8KKwlpZiAoZGV2LT5zdGF0ZSA9PSBNTFg1X0RFVklDRV9TVEFURV9JTlRFUk5BTF9FUlJPUikgeworCQltbHg1X2NvcmVfd2FybihkZXYsICJTa2lwcGluZyB3YWl0IGZvciB2ZiBwYWdlcyBzdGFnZSIpOworCQlyZXR1cm4gMDsKKwl9CisKIAltbHg1X2NvcmVfZGJnKGRldiwgIldhaXRpbmcgZm9yICVkIHBhZ2VzIGZyb20gJXNcbiIsIHByZXZfdmZzX3BhZ2VzLAogCQkgICAgICBkZXYtPnByaXYubmFtZSk7CiAJd2hpbGUgKGRldi0+cHJpdi52ZnNfcGFnZXMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9wZC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3BkLmMKaW5kZXggZjJkM2FlZS4uYmQ4MzBkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3BkLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3BkLmMKQEAgLTM2LDY2ICszNiwyNyBAQAogI2luY2x1ZGUgPGxpbnV4L21seDUvY21kLmg+CiAjaW5jbHVkZSAibWx4NV9jb3JlLmgiCiAKLXN0cnVjdCBtbHg1X2FsbG9jX3BkX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQotc3RydWN0IG1seDVfYWxsb2NfcGRfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCV9fYmUzMgkJCXBkbjsKLQl1OAkJCXJzdmRbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kZWFsbG9jX3BkX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJcGRuOwotCXU4CQkJcnN2ZFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2RlYWxsb2NfcGRfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KIGludCBtbHg1X2NvcmVfYWxsb2NfcGQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyICpwZG4pCiB7Ci0Jc3RydWN0IG1seDVfYWxsb2NfcGRfbWJveF9pbglpbjsKLQlzdHJ1Y3QgbWx4NV9hbGxvY19wZF9tYm94X291dAlvdXQ7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGFsbG9jX3BkX291dCldID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGFsbG9jX3BkX2luKV0gICA9IHswfTsKIAlpbnQgZXJyOwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfQUxMT0NfUEQpOwotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCAmaW4sIHNpemVvZihpbiksICZvdXQsIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKG91dC5oZHIuc3RhdHVzKQotCQlyZXR1cm4gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0KLQkqcGRuID0gYmUzMl90b19jcHUob3V0LnBkbikgJiAweGZmZmZmZjsKKwlNTFg1X1NFVChhbGxvY19wZF9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfQUxMT0NfUEQpOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CisJaWYgKCFlcnIpCisJCSpwZG4gPSBNTFg1X0dFVChhbGxvY19wZF9vdXQsIG91dCwgcGQpOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfY29yZV9hbGxvY19wZCk7CiAKIGludCBtbHg1X2NvcmVfZGVhbGxvY19wZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgcGRuKQogewotCXN0cnVjdCBtbHg1X2RlYWxsb2NfcGRfbWJveF9pbglpbjsKLQlzdHJ1Y3QgbWx4NV9kZWFsbG9jX3BkX21ib3hfb3V0CW91dDsKLQlpbnQgZXJyOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZWFsbG9jX3BkX291dCldID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlYWxsb2NfcGRfaW4pXSAgID0gezB9OwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfREVBTExPQ19QRCk7Ci0JaW4ucGRuID0gY3B1X3RvX2JlMzIocGRuKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCAmb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmIChvdXQuaGRyLnN0YXR1cykKLQkJcmV0dXJuIG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwotCi0JcmV0dXJuIGVycjsKKwlNTFg1X1NFVChkZWFsbG9jX3BkX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9ERUFMTE9DX1BEKTsKKwlNTFg1X1NFVChkZWFsbG9jX3BkX2luLCBpbiwgcGQsIHBkbik7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfY29yZV9kZWFsbG9jX3BkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9wb3J0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcG9ydC5jCmluZGV4IDc1MmMwODEuLjM0ZTcxODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9wb3J0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3BvcnQuYwpAQCAtMzgsNDUgKzM4LDQyIEBACiAKIGludCBtbHg1X2NvcmVfYWNjZXNzX3JlZyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB2b2lkICpkYXRhX2luLAogCQkJIGludCBzaXplX2luLCB2b2lkICpkYXRhX291dCwgaW50IHNpemVfb3V0LAotCQkJIHUxNiByZWdfbnVtLCBpbnQgYXJnLCBpbnQgd3JpdGUpCisJCQkgdTE2IHJlZ19pZCwgaW50IGFyZywgaW50IHdyaXRlKQogewotCXN0cnVjdCBtbHg1X2FjY2Vzc19yZWdfbWJveF9pbiAqaW4gPSBOVUxMOwotCXN0cnVjdCBtbHg1X2FjY2Vzc19yZWdfbWJveF9vdXQgKm91dCA9IE5VTEw7CisJaW50IG91dGxlbiA9IE1MWDVfU1RfU1pfQllURVMoYWNjZXNzX3JlZ2lzdGVyX291dCkgKyBzaXplX291dDsKKwlpbnQgaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKGFjY2Vzc19yZWdpc3Rlcl9pbikgKyBzaXplX2luOwogCWludCBlcnIgPSAtRU5PTUVNOworCXUzMiAqb3V0ID0gTlVMTDsKKwl1MzIgKmluID0gTlVMTDsKKwl2b2lkICpkYXRhOwogCi0JaW4gPSBtbHg1X3Z6YWxsb2Moc2l6ZW9mKCppbikgKyBzaXplX2luKTsKLQlpZiAoIWluKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpbiA9IG1seDVfdnphbGxvYyhpbmxlbik7CisJb3V0ID0gbWx4NV92emFsbG9jKG91dGxlbik7CisJaWYgKCFpbiB8fCAhb3V0KQorCQlnb3RvIG91dDsKIAotCW91dCA9IG1seDVfdnphbGxvYyhzaXplb2YoKm91dCkgKyBzaXplX291dCk7Ci0JaWYgKCFvdXQpCi0JCWdvdG8gZXgxOworCWRhdGEgPSBNTFg1X0FERFJfT0YoYWNjZXNzX3JlZ2lzdGVyX2luLCBpbiwgcmVnaXN0ZXJfZGF0YSk7CisJbWVtY3B5KGRhdGEsIGRhdGFfaW4sIHNpemVfaW4pOwogCi0JbWVtY3B5KGluLT5kYXRhLCBkYXRhX2luLCBzaXplX2luKTsKLQlpbi0+aGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX0FDQ0VTU19SRUcpOwotCWluLT5oZHIub3Btb2QgPSBjcHVfdG9fYmUxNighd3JpdGUpOwotCWluLT5hcmcgPSBjcHVfdG9fYmUzMihhcmcpOwotCWluLT5yZWdpc3Rlcl9pZCA9IGNwdV90b19iZTE2KHJlZ19udW0pOwotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKCppbikgKyBzaXplX2luLCBvdXQsCi0JCQkgICAgc2l6ZW9mKCpvdXQpICsgc2l6ZV9vdXQpOworCU1MWDVfU0VUKGFjY2Vzc19yZWdpc3Rlcl9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfQUNDRVNTX1JFRyk7CisJTUxYNV9TRVQoYWNjZXNzX3JlZ2lzdGVyX2luLCBpbiwgb3BfbW9kLCAhd3JpdGUpOworCU1MWDVfU0VUKGFjY2Vzc19yZWdpc3Rlcl9pbiwgaW4sIGFyZ3VtZW50LCBhcmcpOworCU1MWDVfU0VUKGFjY2Vzc19yZWdpc3Rlcl9pbiwgaW4sIHJlZ2lzdGVyX2lkLCByZWdfaWQpOworCisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBvdXRsZW4pOwogCWlmIChlcnIpCi0JCWdvdG8gZXgyOworCQlnb3RvIG91dDsKIAotCWlmIChvdXQtPmhkci5zdGF0dXMpCi0JCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC0+aGRyKTsKKwlkYXRhID0gTUxYNV9BRERSX09GKGFjY2Vzc19yZWdpc3Rlcl9vdXQsIG91dCwgcmVnaXN0ZXJfZGF0YSk7CisJbWVtY3B5KGRhdGFfb3V0LCBkYXRhLCBzaXplX291dCk7CiAKLQlpZiAoIWVycikKLQkJbWVtY3B5KGRhdGFfb3V0LCBvdXQtPmRhdGEsIHNpemVfb3V0KTsKLQotZXgyOgorb3V0OgogCWt2ZnJlZShvdXQpOwotZXgxOgogCWt2ZnJlZShpbik7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDVfY29yZV9hY2Nlc3NfcmVnKTsKIAotCiBzdHJ1Y3QgbWx4NV9yZWdfcGNhcCB7CiAJdTgJCQlyc3ZkMDsKIAl1OAkJCXBvcnRfbnVtOwpAQCAtMTA0LDEyICsxMDEsMTAgQEAKIGludCBtbHg1X3F1ZXJ5X3BvcnRfcHR5cyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgKnB0eXMsCiAJCQkgaW50IHB0eXNfc2l6ZSwgaW50IHByb3RvX21hc2ssIHU4IGxvY2FsX3BvcnQpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocHR5c19yZWcpXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhwdHlzX3JlZyldID0gezB9OwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKIAlNTFg1X1NFVChwdHlzX3JlZywgaW4sIGxvY2FsX3BvcnQsIGxvY2FsX3BvcnQpOwogCU1MWDVfU0VUKHB0eXNfcmVnLCBpbiwgcHJvdG9fbWFzaywgcHJvdG9fbWFzayk7Ci0KIAlyZXR1cm4gbWx4NV9jb3JlX2FjY2Vzc19yZWcoZGV2LCBpbiwgc2l6ZW9mKGluKSwgcHR5cywKIAkJCQkgICAgcHR5c19zaXplLCBNTFg1X1JFR19QVFlTLCAwLCAwKTsKIH0KQEAgLTExNywxMyArMTEyLDExIEBACiAKIGludCBtbHg1X3NldF9wb3J0X2JlYWNvbihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgYmVhY29uX2R1cmF0aW9uKQogeworCXUzMiBpbltNTFg1X1NUX1NaX0RXKG1sY3JfcmVnKV0gID0gezB9OwogCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhtbGNyX3JlZyldOwotCXUzMiBpbltNTFg1X1NUX1NaX0RXKG1sY3JfcmVnKV07CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwogCU1MWDVfU0VUKG1sY3JfcmVnLCBpbiwgbG9jYWxfcG9ydCwgMSk7CiAJTUxYNV9TRVQobWxjcl9yZWcsIGluLCBiZWFjb25fZHVyYXRpb24sIGJlYWNvbl9kdXJhdGlvbik7Ci0KIAlyZXR1cm4gbWx4NV9jb3JlX2FjY2Vzc19yZWcoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LAogCQkJCSAgICBzaXplb2Yob3V0KSwgTUxYNV9SRUdfTUxDUiwgMCwgMSk7CiB9CkBAIC0xODIsMjUgKzE3NSwzOSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NV9xdWVyeV9wb3J0X2xpbmtfd2lkdGhfb3Blcik7CiAKLWludCBtbHg1X3F1ZXJ5X3BvcnRfcHJvdG9fb3BlcihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAotCQkJICAgICAgIHU4ICpwcm90b19vcGVyLCBpbnQgcHJvdG9fbWFzaywKLQkJCSAgICAgICB1OCBsb2NhbF9wb3J0KQoraW50IG1seDVfcXVlcnlfcG9ydF9ldGhfcHJvdG9fb3BlcihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAorCQkJCSAgIHUzMiAqcHJvdG9fb3BlciwgdTggbG9jYWxfcG9ydCkKIHsKIAl1MzIgb3V0W01MWDVfU1RfU1pfRFcocHR5c19yZWcpXTsKIAlpbnQgZXJyOwogCi0JZXJyID0gbWx4NV9xdWVyeV9wb3J0X3B0eXMoZGV2LCBvdXQsIHNpemVvZihvdXQpLCBwcm90b19tYXNrLCBsb2NhbF9wb3J0KTsKKwllcnIgPSBtbHg1X3F1ZXJ5X3BvcnRfcHR5cyhkZXYsIG91dCwgc2l6ZW9mKG91dCksIE1MWDVfUFRZU19FTiwKKwkJCQkgICBsb2NhbF9wb3J0KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKHByb3RvX21hc2sgPT0gTUxYNV9QVFlTX0VOKQotCQkqcHJvdG9fb3BlciA9IE1MWDVfR0VUKHB0eXNfcmVnLCBvdXQsIGV0aF9wcm90b19vcGVyKTsKLQllbHNlCi0JCSpwcm90b19vcGVyID0gTUxYNV9HRVQocHR5c19yZWcsIG91dCwgaWJfcHJvdG9fb3Blcik7CisJKnByb3RvX29wZXIgPSBNTFg1X0dFVChwdHlzX3JlZywgb3V0LCBldGhfcHJvdG9fb3Blcik7CiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG1seDVfcXVlcnlfcG9ydF9wcm90b19vcGVyKTsKK0VYUE9SVF9TWU1CT0wobWx4NV9xdWVyeV9wb3J0X2V0aF9wcm90b19vcGVyKTsKKworaW50IG1seDVfcXVlcnlfcG9ydF9pYl9wcm90b19vcGVyKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCisJCQkJICB1OCAqcHJvdG9fb3BlciwgdTggbG9jYWxfcG9ydCkKK3sKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcocHR5c19yZWcpXTsKKwlpbnQgZXJyOworCisJZXJyID0gbWx4NV9xdWVyeV9wb3J0X3B0eXMoZGV2LCBvdXQsIHNpemVvZihvdXQpLCBNTFg1X1BUWVNfSUIsCisJCQkJICAgbG9jYWxfcG9ydCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCSpwcm90b19vcGVyID0gTUxYNV9HRVQocHR5c19yZWcsIG91dCwgaWJfcHJvdG9fb3Blcik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobWx4NV9xdWVyeV9wb3J0X2liX3Byb3RvX29wZXIpOwogCiBpbnQgbWx4NV9zZXRfcG9ydF9wdHlzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIGJvb2wgYW5fZGlzYWJsZSwKIAkJICAgICAgIHUzMiBwcm90b19hZG1pbiwgaW50IHByb3RvX21hc2spCkBAIC0yNDYsMTUgKzI1MywxMiBAQAogaW50IG1seDVfc2V0X3BvcnRfYWRtaW5fc3RhdHVzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQkgICAgICAgZW51bSBtbHg1X3BvcnRfc3RhdHVzIHN0YXR1cykKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhwYW9zX3JlZyldOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHBhb3NfcmVnKV0gPSB7MH07CiAJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHBhb3NfcmVnKV07CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCiAJTUxYNV9TRVQocGFvc19yZWcsIGluLCBsb2NhbF9wb3J0LCAxKTsKIAlNTFg1X1NFVChwYW9zX3JlZywgaW4sIGFkbWluX3N0YXR1cywgc3RhdHVzKTsKIAlNTFg1X1NFVChwYW9zX3JlZywgaW4sIGFzZSwgMSk7Ci0KIAlyZXR1cm4gbWx4NV9jb3JlX2FjY2Vzc19yZWcoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LAogCQkJCSAgICBzaXplb2Yob3V0KSwgTUxYNV9SRUdfUEFPUywgMCwgMSk7CiB9CkBAIC0yNjMsMTkgKzI2NywxNSBAQAogaW50IG1seDVfcXVlcnlfcG9ydF9hZG1pbl9zdGF0dXMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKIAkJCQkgZW51bSBtbHg1X3BvcnRfc3RhdHVzICpzdGF0dXMpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocGFvc19yZWcpXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhwYW9zX3JlZyldID0gezB9OwogCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhwYW9zX3JlZyldOwogCWludCBlcnI7CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCiAJTUxYNV9TRVQocGFvc19yZWcsIGluLCBsb2NhbF9wb3J0LCAxKTsKLQogCWVyciA9IG1seDVfY29yZV9hY2Nlc3NfcmVnKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwKIAkJCQkgICBzaXplb2Yob3V0KSwgTUxYNV9SRUdfUEFPUywgMCwgMCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQogCSpzdGF0dXMgPSBNTFg1X0dFVChwYW9zX3JlZywgb3V0LCBhZG1pbl9zdGF0dXMpOwogCXJldHVybiAwOwogfQpAQCAtMjg0LDEzICsyODQsMTAgQEAKIHN0YXRpYyB2b2lkIG1seDVfcXVlcnlfcG9ydF9tdHUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2ICphZG1pbl9tdHUsCiAJCQkJdTE2ICptYXhfbXR1LCB1MTYgKm9wZXJfbXR1LCB1OCBwb3J0KQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHBtdHVfcmVnKV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocG10dV9yZWcpXSA9IHswfTsKIAl1MzIgb3V0W01MWDVfU1RfU1pfRFcocG10dV9yZWcpXTsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0KIAlNTFg1X1NFVChwbXR1X3JlZywgaW4sIGxvY2FsX3BvcnQsIHBvcnQpOwotCiAJbWx4NV9jb3JlX2FjY2Vzc19yZWcoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LAogCQkJICAgICBzaXplb2Yob3V0KSwgTUxYNV9SRUdfUE1UVSwgMCwgMCk7CiAKQEAgLTMwNCwxNCArMzAxLDExIEBACiAKIGludCBtbHg1X3NldF9wb3J0X210dShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgbXR1LCB1OCBwb3J0KQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHBtdHVfcmVnKV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocG10dV9yZWcpXSA9IHswfTsKIAl1MzIgb3V0W01MWDVfU1RfU1pfRFcocG10dV9yZWcpXTsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0KIAlNTFg1X1NFVChwbXR1X3JlZywgaW4sIGFkbWluX210dSwgbXR1KTsKIAlNTFg1X1NFVChwbXR1X3JlZywgaW4sIGxvY2FsX3BvcnQsIHBvcnQpOwotCiAJcmV0dXJuIG1seDVfY29yZV9hY2Nlc3NfcmVnKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwKIAkJCQkgICBzaXplb2Yob3V0KSwgTUxYNV9SRUdfUE1UVSwgMCwgMSk7CiB9CkBAIC0zMzMsMTUgKzMyNywxMiBAQAogCiBzdGF0aWMgaW50IG1seDVfcXVlcnlfbW9kdWxlX251bShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBpbnQgKm1vZHVsZV9udW0pCiB7CisJdTMyIGluW01MWDVfU1RfU1pfRFcocG1scF9yZWcpXSA9IHswfTsKIAl1MzIgb3V0W01MWDVfU1RfU1pfRFcocG1scF9yZWcpXTsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhwbWxwX3JlZyldOwogCWludCBtb2R1bGVfbWFwcGluZzsKIAlpbnQgZXJyOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQogCU1MWDVfU0VUKHBtbHBfcmVnLCBpbiwgbG9jYWxfcG9ydCwgMSk7Ci0KIAllcnIgPSBtbHg1X2NvcmVfYWNjZXNzX3JlZyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpLAogCQkJCSAgIE1MWDVfUkVHX1BNTFAsIDAsIDApOwogCWlmIChlcnIpCkBAIC00MTAsMTEgKzQwMSw5IEBACiBzdGF0aWMgaW50IG1seDVfcXVlcnlfcG9ydF9wdmxjKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiAqcHZsYywKIAkJCQlpbnQgcHZsY19zaXplLCAgdTggbG9jYWxfcG9ydCkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhwdmxjX3JlZyldOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHB2bGNfcmVnKV0gPSB7MH07CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwogCU1MWDVfU0VUKHB2bGNfcmVnLCBpbiwgbG9jYWxfcG9ydCwgbG9jYWxfcG9ydCk7Ci0KIAlyZXR1cm4gbWx4NV9jb3JlX2FjY2Vzc19yZWcoZGV2LCBpbiwgc2l6ZW9mKGluKSwgcHZsYywKIAkJCQkgICAgcHZsY19zaXplLCBNTFg1X1JFR19QVkxDLCAwLCAwKTsKIH0KQEAgLTQ2MCwxMCArNDQ5LDkgQEAKIAogaW50IG1seDVfc2V0X3BvcnRfcGF1c2Uoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHJ4X3BhdXNlLCB1MzIgdHhfcGF1c2UpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocGZjY19yZWcpXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhwZmNjX3JlZyldID0gezB9OwogCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhwZmNjX3JlZyldOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKIAlNTFg1X1NFVChwZmNjX3JlZywgaW4sIGxvY2FsX3BvcnQsIDEpOwogCU1MWDVfU0VUKHBmY2NfcmVnLCBpbiwgcHB0eCwgdHhfcGF1c2UpOwogCU1MWDVfU0VUKHBmY2NfcmVnLCBpbiwgcHByeCwgcnhfcGF1c2UpOwpAQCAtNDc2LDEzICs0NjQsMTEgQEAKIGludCBtbHg1X3F1ZXJ5X3BvcnRfcGF1c2Uoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKIAkJCSAgdTMyICpyeF9wYXVzZSwgdTMyICp0eF9wYXVzZSkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhwZmNjX3JlZyldOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHBmY2NfcmVnKV0gPSB7MH07CiAJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHBmY2NfcmVnKV07CiAJaW50IGVycjsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CiAJTUxYNV9TRVQocGZjY19yZWcsIGluLCBsb2NhbF9wb3J0LCAxKTsKLQogCWVyciA9IG1seDVfY29yZV9hY2Nlc3NfcmVnKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwKIAkJCQkgICBzaXplb2Yob3V0KSwgTUxYNV9SRUdfUEZDQywgMCwgMCk7CiAJaWYgKGVycikKQEAgLTUwMCwxMCArNDg2LDkgQEAKIAogaW50IG1seDVfc2V0X3BvcnRfcGZjKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHU4IHBmY19lbl90eCwgdTggcGZjX2VuX3J4KQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHBmY2NfcmVnKV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocGZjY19yZWcpXSA9IHswfTsKIAl1MzIgb3V0W01MWDVfU1RfU1pfRFcocGZjY19yZWcpXTsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CiAJTUxYNV9TRVQocGZjY19yZWcsIGluLCBsb2NhbF9wb3J0LCAxKTsKIAlNTFg1X1NFVChwZmNjX3JlZywgaW4sIHBmY3R4LCBwZmNfZW5fdHgpOwogCU1MWDVfU0VUKHBmY2NfcmVnLCBpbiwgcGZjcngsIHBmY19lbl9yeCk7CkBAIC01MTcsMTMgKzUwMiwxMSBAQAogCiBpbnQgbWx4NV9xdWVyeV9wb3J0X3BmYyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1OCAqcGZjX2VuX3R4LCB1OCAqcGZjX2VuX3J4KQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHBmY2NfcmVnKV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocGZjY19yZWcpXSA9IHswfTsKIAl1MzIgb3V0W01MWDVfU1RfU1pfRFcocGZjY19yZWcpXTsKIAlpbnQgZXJyOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKIAlNTFg1X1NFVChwZmNjX3JlZywgaW4sIGxvY2FsX3BvcnQsIDEpOwotCiAJZXJyID0gbWx4NV9jb3JlX2FjY2Vzc19yZWcoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LAogCQkJCSAgIHNpemVvZihvdXQpLCBNTFg1X1JFR19QRkNDLCAwLCAwKTsKIAlpZiAoZXJyKQpAQCAtNTY3LDEyICs1NTAsMTEgQEAKIAogaW50IG1seDVfc2V0X3BvcnRfcHJpb190YyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgdTggKnByaW9fdGMpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocXRjdF9yZWcpXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdGN0X3JlZyldID0gezB9OwogCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhxdGN0X3JlZyldOwogCWludCBlcnI7CiAJaW50IGk7CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkJaWYgKHByaW9fdGNbaV0gPiBtbHg1X21heF90YyhtZGV2KSkKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtNjE3LDExICs1OTksOSBAQAogCiBpbnQgbWx4NV9zZXRfcG9ydF90Y19ncm91cChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgdTggKnRjX2dyb3VwKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHFldGNfcmVnKV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocWV0Y19yZWcpXSA9IHswfTsKIAlpbnQgaTsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0KIAlmb3IgKGkgPSAwOyBpIDw9IG1seDVfbWF4X3RjKG1kZXYpOyBpKyspIHsKIAkJTUxYNV9TRVQocWV0Y19yZWcsIGluLCB0Y19jb25maWd1cmF0aW9uW2ldLmcsIDEpOwogCQlNTFg1X1NFVChxZXRjX3JlZywgaW4sIHRjX2NvbmZpZ3VyYXRpb25baV0uZ3JvdXAsIHRjX2dyb3VwW2ldKTsKQEAgLTYzMywxMSArNjEzLDkgQEAKIAogaW50IG1seDVfc2V0X3BvcnRfdGNfYndfYWxsb2Moc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHU4ICp0Y19idykKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxZXRjX3JlZyldOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHFldGNfcmVnKV0gPSB7MH07CiAJaW50IGk7CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCiAJZm9yIChpID0gMDsgaSA8PSBtbHg1X21heF90YyhtZGV2KTsgaSsrKSB7CiAJCU1MWDVfU0VUKHFldGNfcmVnLCBpbiwgdGNfY29uZmlndXJhdGlvbltpXS5iLCAxKTsKIAkJTUxYNV9TRVQocWV0Y19yZWcsIGluLCB0Y19jb25maWd1cmF0aW9uW2ldLmJ3X2FsbG9jYXRpb24sIHRjX2J3W2ldKTsKQEAgLTY1MSwxMiArNjI5LDEwIEBACiAJCQkJICAgIHU4ICptYXhfYndfdmFsdWUsCiAJCQkJICAgIHU4ICptYXhfYndfdW5pdHMpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocWV0Y19yZWcpXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxZXRjX3JlZyldID0gezB9OwogCXZvaWQgKmV0c190Y25fY29uZjsKIAlpbnQgaTsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0KIAlNTFg1X1NFVChxZXRjX3JlZywgaW4sIHBvcnRfbnVtYmVyLCAxKTsKIAogCWZvciAoaSA9IDA7IGkgPD0gbWx4NV9tYXhfdGMobWRldik7IGkrKykgewpAQCAtNzAxLDM1ICs2NzcsMjQgQEAKIAogaW50IG1seDVfc2V0X3BvcnRfd29sKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCB1OCB3b2xfbW9kZSkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhzZXRfd29sX3JvbF9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhzZXRfd29sX3JvbF9vdXQpXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHNldF93b2xfcm9sX2luKV0gICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoc2V0X3dvbF9yb2xfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChzZXRfd29sX3JvbF9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfU0VUX1dPTF9ST0wpOwogCU1MWDVfU0VUKHNldF93b2xfcm9sX2luLCBpbiwgd29sX21vZGVfdmFsaWQsIDEpOwogCU1MWDVfU0VUKHNldF93b2xfcm9sX2luLCBpbiwgd29sX21vZGUsIHdvbF9tb2RlKTsKLQotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhtZGV2LCBpbiwgc2l6ZW9mKGluKSwKLQkJCQkJICBvdXQsIHNpemVvZihvdXQpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhtZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg1X3NldF9wb3J0X3dvbCk7CiAKIGludCBtbHg1X3F1ZXJ5X3BvcnRfd29sKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCB1OCAqd29sX21vZGUpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfd29sX3JvbF9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhxdWVyeV93b2xfcm9sX291dCldOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X3dvbF9yb2xfaW4pXSAgID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhxdWVyeV93b2xfcm9sX291dCldID0gezB9OwogCWludCBlcnI7CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQogCU1MWDVfU0VUKHF1ZXJ5X3dvbF9yb2xfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX1FVRVJZX1dPTF9ST0wpOwotCi0JZXJyID0gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMobWRldiwgaW4sIHNpemVvZihpbiksCi0JCQkJCSBvdXQsIHNpemVvZihvdXQpKTsKLQorCWVyciA9IG1seDVfY21kX2V4ZWMobWRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogCWlmICghZXJyKQogCQkqd29sX21vZGUgPSBNTFg1X0dFVChxdWVyeV93b2xfcm9sX291dCwgb3V0LCB3b2xfbW9kZSk7CiAKQEAgLTc0MCwxMSArNzA1LDkgQEAKIHN0YXRpYyBpbnQgbWx4NV9xdWVyeV9wb3J0c19jaGVjayhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgdTMyICpvdXQsCiAJCQkJICBpbnQgb3V0bGVuKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHBjbXJfcmVnKV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocGNtcl9yZWcpXSA9IHswfTsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CiAJTUxYNV9TRVQocGNtcl9yZWcsIGluLCBsb2NhbF9wb3J0LCAxKTsKLQogCXJldHVybiBtbHg1X2NvcmVfYWNjZXNzX3JlZyhtZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LAogCQkJCSAgICBvdXRsZW4sIE1MWDVfUkVHX1BDTVIsIDAsIDApOwogfQpAQCAtNzU5LDEyICs3MjIsMTAgQEAKIAogaW50IG1seDVfc2V0X3BvcnRfZmNzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCB1OCBlbmFibGUpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocGNtcl9yZWcpXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhwY21yX3JlZyldID0gezB9OwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKIAlNTFg1X1NFVChwY21yX3JlZywgaW4sIGxvY2FsX3BvcnQsIDEpOwogCU1MWDVfU0VUKHBjbXJfcmVnLCBpbiwgZmNzX2NoaywgZW5hYmxlKTsKLQogCXJldHVybiBtbHg1X3NldF9wb3J0c19jaGVjayhtZGV2LCBpbiwgc2l6ZW9mKGluKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9xcC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3FwLmMKaW5kZXggYjgyZDY1OC4uZDBhNDAwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3FwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3FwLmMKQEAgLTI3MSwzMCArMjcxLDIwIEBACiAKIGludCBtbHg1X2NvcmVfY3JlYXRlX3FwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQlzdHJ1Y3QgbWx4NV9jb3JlX3FwICpxcCwKLQkJCXN0cnVjdCBtbHg1X2NyZWF0ZV9xcF9tYm94X2luICppbiwKLQkJCWludCBpbmxlbikKKwkJCXUzMiAqaW4sIGludCBpbmxlbikKIHsKLQlzdHJ1Y3QgbWx4NV9jcmVhdGVfcXBfbWJveF9vdXQgb3V0OwotCXN0cnVjdCBtbHg1X2Rlc3Ryb3lfcXBfbWJveF9pbiBkaW47Ci0Jc3RydWN0IG1seDVfZGVzdHJveV9xcF9tYm94X291dCBkb3V0OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfcXBfb3V0KV0gPSB7MH07CisJdTMyIGRvdXRbTUxYNV9TVF9TWl9EVyhkZXN0cm95X3FwX291dCldOworCXUzMiBkaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X3FwX2luKV07CiAJaW50IGVycjsKIAotCW1lbXNldCgmb3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JaW4tPmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9DUkVBVEVfUVApOworCU1MWDVfU0VUKGNyZWF0ZV9xcF9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfQ1JFQVRFX1FQKTsKIAotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sICZvdXQsIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKSB7Ci0JCW1seDVfY29yZV93YXJuKGRldiwgInJldCAlZFxuIiwgZXJyKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKKwlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCX0KIAotCWlmIChvdXQuaGRyLnN0YXR1cykgewotCQltbHg1X2NvcmVfd2FybihkZXYsICJjdXJyZW50IG51bSBvZiBRUHMgMHgleFxuIiwKLQkJCSAgICAgICBhdG9taWNfcmVhZCgmZGV2LT5udW1fcXBzKSk7Ci0JCXJldHVybiBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQuaGRyKTsKLQl9Ci0KLQlxcC0+cXBuID0gYmUzMl90b19jcHUob3V0LnFwbikgJiAweGZmZmZmZjsKKwlxcC0+cXBuID0gTUxYNV9HRVQoY3JlYXRlX3FwX291dCwgb3V0LCBxcG4pOwogCW1seDVfY29yZV9kYmcoZGV2LCAicXBuID0gMHgleFxuIiwgcXAtPnFwbik7CiAKIAllcnIgPSBjcmVhdGVfcXBycXNxX2NvbW1vbihkZXYsIHFwLCBNTFg1X1JFU19RUCk7CkBAIC0zMTEsMTIgKzMwMSwxMSBAQAogCXJldHVybiAwOwogCiBlcnJfY21kOgotCW1lbXNldCgmZGluLCAwLCBzaXplb2YoZGluKSk7Ci0JbWVtc2V0KCZkb3V0LCAwLCBzaXplb2YoZG91dCkpOwotCWRpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfREVTVFJPWV9RUCk7Ci0JZGluLnFwbiA9IGNwdV90b19iZTMyKHFwLT5xcG4pOwotCW1seDVfY21kX2V4ZWMoZGV2LCAmZGluLCBzaXplb2YoZGluKSwgJm91dCwgc2l6ZW9mKGRvdXQpKTsKLQorCW1lbXNldChkaW4sIDAsIHNpemVvZihkaW4pKTsKKwltZW1zZXQoZG91dCwgMCwgc2l6ZW9mKGRvdXQpKTsKKwlNTFg1X1NFVChkZXN0cm95X3FwX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9ERVNUUk9ZX1FQKTsKKwlNTFg1X1NFVChkZXN0cm95X3FwX2luLCBpbiwgcXBuLCBxcC0+cXBuKTsKKwltbHg1X2NtZF9leGVjKGRldiwgZGluLCBzaXplb2YoZGluKSwgZG91dCwgc2l6ZW9mKGRvdXQpKTsKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NV9jb3JlX2NyZWF0ZV9xcCk7CkBAIC0zMjQsNDUgKzMxMywxNDUgQEAKIGludCBtbHg1X2NvcmVfZGVzdHJveV9xcChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkJIHN0cnVjdCBtbHg1X2NvcmVfcXAgKnFwKQogewotCXN0cnVjdCBtbHg1X2Rlc3Ryb3lfcXBfbWJveF9pbiBpbjsKLQlzdHJ1Y3QgbWx4NV9kZXN0cm95X3FwX21ib3hfb3V0IG91dDsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV9xcF9vdXQpXSA9IHswfTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X3FwX2luKV0gICA9IHswfTsKIAlpbnQgZXJyOwogCiAJbWx4NV9kZWJ1Z19xcF9yZW1vdmUoZGV2LCBxcCk7CiAKIAlkZXN0cm95X3FwcnFzcV9jb21tb24oZGV2LCBxcCk7CiAKLQltZW1zZXQoJmluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9ERVNUUk9ZX1FQKTsKLQlpbi5xcG4gPSBjcHVfdG9fYmUzMihxcC0+cXBuKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCAmb3V0LCBzaXplb2Yob3V0KSk7CisJTUxYNV9TRVQoZGVzdHJveV9xcF9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfREVTVFJPWV9RUCk7CisJTUxYNV9TRVQoZGVzdHJveV9xcF9pbiwgaW4sIHFwbiwgcXAtPnFwbik7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKG91dC5oZHIuc3RhdHVzKQotCQlyZXR1cm4gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0KIAlhdG9taWNfZGVjKCZkZXYtPm51bV9xcHMpOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NV9jb3JlX2Rlc3Ryb3lfcXApOwogCi1pbnQgbWx4NV9jb3JlX3FwX21vZGlmeShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgb3BlcmF0aW9uLAotCQkJc3RydWN0IG1seDVfbW9kaWZ5X3FwX21ib3hfaW4gKmluLCBpbnQgc3FkX2V2ZW50LAorc3RydWN0IG1ib3hfaW5mbyB7CisJdTMyICppbjsKKwl1MzIgKm91dDsKKwlpbnQgaW5sZW47CisJaW50IG91dGxlbjsKK307CisKK3N0YXRpYyBpbnQgbWJveF9hbGxvYyhzdHJ1Y3QgbWJveF9pbmZvICptYm94LCBpbnQgaW5sZW4sIGludCBvdXRsZW4pCit7CisJbWJveC0+aW5sZW4gID0gaW5sZW47CisJbWJveC0+b3V0bGVuID0gb3V0bGVuOworCW1ib3gtPmluID0ga3phbGxvYyhtYm94LT5pbmxlbiwgR0ZQX0tFUk5FTCk7CisJbWJveC0+b3V0ID0ga3phbGxvYyhtYm94LT5vdXRsZW4sIEdGUF9LRVJORUwpOworCWlmICghbWJveC0+aW4gfHwgIW1ib3gtPm91dCkgeworCQlrZnJlZShtYm94LT5pbik7CisJCWtmcmVlKG1ib3gtPm91dCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYm94X2ZyZWUoc3RydWN0IG1ib3hfaW5mbyAqbWJveCkKK3sKKwlrZnJlZShtYm94LT5pbik7CisJa2ZyZWUobWJveC0+b3V0KTsKK30KKworc3RhdGljIGludCBtb2RpZnlfcXBfbWJveF9hbGxvYyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgb3Bjb2RlLCBpbnQgcXBuLAorCQkJCXUzMiBvcHRfcGFyYW1fbWFzaywgdm9pZCAqcXBjLAorCQkJCXN0cnVjdCBtYm94X2luZm8gKm1ib3gpCit7CisJbWJveC0+b3V0ID0gTlVMTDsKKwltYm94LT5pbiA9IE5VTEw7CisKKyNkZWZpbmUgTUJPWF9BTExPQyhtYm94LCB0eXApICBcCisJbWJveF9hbGxvYyhtYm94LCBNTFg1X1NUX1NaX0JZVEVTKHR5cCMjX2luKSwgTUxYNV9TVF9TWl9CWVRFUyh0eXAjI19vdXQpKQorCisjZGVmaW5lIE1PRF9RUF9JTl9TRVQodHlwLCBpbiwgX29wY29kZSwgX3FwbikgXAorCU1MWDVfU0VUKHR5cCMjX2luLCBpbiwgb3Bjb2RlLCBfb3Bjb2RlKTsgXAorCU1MWDVfU0VUKHR5cCMjX2luLCBpbiwgcXBuLCBfcXBuKQorCisjZGVmaW5lIE1PRF9RUF9JTl9TRVRfUVBDKHR5cCwgaW4sIF9vcGNvZGUsIF9xcG4sIF9vcHRfcCwgX3FwYykgXAorCU1PRF9RUF9JTl9TRVQodHlwLCBpbiwgX29wY29kZSwgX3Fwbik7IFwKKwlNTFg1X1NFVCh0eXAjI19pbiwgaW4sIG9wdF9wYXJhbV9tYXNrLCBfb3B0X3ApOyBcCisJbWVtY3B5KE1MWDVfQUREUl9PRih0eXAjI19pbiwgaW4sIHFwYyksIF9xcGMsIE1MWDVfU1RfU1pfQllURVMocXBjKSkKKworCXN3aXRjaCAob3Bjb2RlKSB7CisJLyogMlJTVCAmIDJFUlIgKi8KKwljYXNlIE1MWDVfQ01EX09QXzJSU1RfUVA6CisJCWlmIChNQk9YX0FMTE9DKG1ib3gsIHFwXzJyc3QpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCU1PRF9RUF9JTl9TRVQocXBfMnJzdCwgbWJveC0+aW4sIG9wY29kZSwgcXBuKTsKKwkJYnJlYWs7CisJY2FzZSBNTFg1X0NNRF9PUF8yRVJSX1FQOgorCQlpZiAoTUJPWF9BTExPQyhtYm94LCBxcF8yZXJyKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlNT0RfUVBfSU5fU0VUKHFwXzJlcnIsIG1ib3gtPmluLCBvcGNvZGUsIHFwbik7CisJCWJyZWFrOworCisJLyogTU9ESUZZIHdpdGggUVBDICovCisJY2FzZSBNTFg1X0NNRF9PUF9SU1QySU5JVF9RUDoKKwkJaWYgKE1CT1hfQUxMT0MobWJveCwgcnN0MmluaXRfcXApKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCSBNT0RfUVBfSU5fU0VUX1FQQyhyc3QyaW5pdF9xcCwgbWJveC0+aW4sIG9wY29kZSwgcXBuLAorCQkJCSAgIG9wdF9wYXJhbV9tYXNrLCBxcGMpOworCQkgYnJlYWs7CisJY2FzZSBNTFg1X0NNRF9PUF9JTklUMlJUUl9RUDoKKwkJaWYgKE1CT1hfQUxMT0MobWJveCwgaW5pdDJydHJfcXApKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCSBNT0RfUVBfSU5fU0VUX1FQQyhpbml0MnJ0cl9xcCwgbWJveC0+aW4sIG9wY29kZSwgcXBuLAorCQkJCSAgIG9wdF9wYXJhbV9tYXNrLCBxcGMpOworCQkgYnJlYWs7CisJY2FzZSBNTFg1X0NNRF9PUF9SVFIyUlRTX1FQOgorCQlpZiAoTUJPWF9BTExPQyhtYm94LCBydHIycnRzX3FwKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQkgTU9EX1FQX0lOX1NFVF9RUEMocnRyMnJ0c19xcCwgbWJveC0+aW4sIG9wY29kZSwgcXBuLAorCQkJCSAgIG9wdF9wYXJhbV9tYXNrLCBxcGMpOworCQkgYnJlYWs7CisJY2FzZSBNTFg1X0NNRF9PUF9SVFMyUlRTX1FQOgorCQlpZiAoTUJPWF9BTExPQyhtYm94LCBydHMycnRzX3FwKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlNT0RfUVBfSU5fU0VUX1FQQyhydHMycnRzX3FwLCBtYm94LT5pbiwgb3Bjb2RlLCBxcG4sCisJCQkJICBvcHRfcGFyYW1fbWFzaywgcXBjKTsKKwkJYnJlYWs7CisJY2FzZSBNTFg1X0NNRF9PUF9TUUVSUjJSVFNfUVA6CisJCWlmIChNQk9YX0FMTE9DKG1ib3gsIHNxZXJyMnJ0c19xcCkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJTU9EX1FQX0lOX1NFVF9RUEMoc3FlcnIycnRzX3FwLCBtYm94LT5pbiwgb3Bjb2RlLCBxcG4sCisJCQkJICBvcHRfcGFyYW1fbWFzaywgcXBjKTsKKwkJYnJlYWs7CisJY2FzZSBNTFg1X0NNRF9PUF9JTklUMklOSVRfUVA6CisJCWlmIChNQk9YX0FMTE9DKG1ib3gsIGluaXQyaW5pdF9xcCkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJTU9EX1FQX0lOX1NFVF9RUEMoaW5pdDJpbml0X3FwLCBtYm94LT5pbiwgb3Bjb2RlLCBxcG4sCisJCQkJICBvcHRfcGFyYW1fbWFzaywgcXBjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWx4NV9jb3JlX2VycihkZXYsICJVbmtub3duIHRyYW5zaXRpb24gZm9yIG1vZGlmeSBRUDogT1AoMHgleCkgUVBOKDB4JXgpXG4iLAorCQkJICAgICAgb3Bjb2RlLCBxcG4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBtbHg1X2NvcmVfcXBfbW9kaWZ5KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUxNiBvcGNvZGUsCisJCQl1MzIgb3B0X3BhcmFtX21hc2ssIHZvaWQgKnFwYywKIAkJCXN0cnVjdCBtbHg1X2NvcmVfcXAgKnFwKQogewotCXN0cnVjdCBtbHg1X21vZGlmeV9xcF9tYm94X291dCBvdXQ7Ci0JaW50IGVyciA9IDA7CisJc3RydWN0IG1ib3hfaW5mbyBtYm94OworCWludCBlcnI7CiAKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWluLT5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYob3BlcmF0aW9uKTsKLQlpbi0+cXBuID0gY3B1X3RvX2JlMzIocXAtPnFwbik7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoKmluKSwgJm91dCwgc2l6ZW9mKG91dCkpOworCWVyciA9IG1vZGlmeV9xcF9tYm94X2FsbG9jKGRldiwgb3Bjb2RlLCBxcC0+cXBuLAorCQkJCSAgIG9wdF9wYXJhbV9tYXNrLCBxcGMsICZtYm94KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JcmV0dXJuIG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBtYm94LmluLCBtYm94LmlubGVuLCBtYm94Lm91dCwgbWJveC5vdXRsZW4pOworCW1ib3hfZnJlZSgmbWJveCk7CisJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDVfY29yZV9xcF9tb2RpZnkpOwogCkBAIC0zODIsNjYgKzQ3MSwzOCBAQAogfQogCiBpbnQgbWx4NV9jb3JlX3FwX3F1ZXJ5KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2NvcmVfcXAgKnFwLAotCQkgICAgICAgc3RydWN0IG1seDVfcXVlcnlfcXBfbWJveF9vdXQgKm91dCwgaW50IG91dGxlbikKKwkJICAgICAgIHUzMiAqb3V0LCBpbnQgb3V0bGVuKQogewotCXN0cnVjdCBtbHg1X3F1ZXJ5X3FwX21ib3hfaW4gaW47Ci0JaW50IGVycjsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9xcF9pbildID0gezB9OwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgb3V0bGVuKTsKLQlpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfUVVFUllfUVApOwotCWluLnFwbiA9IGNwdV90b19iZTMyKHFwLT5xcG4pOwotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCAmaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKG91dC0+aGRyLnN0YXR1cykKLQkJcmV0dXJuIG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC0+aGRyKTsKLQotCXJldHVybiBlcnI7CisJTUxYNV9TRVQocXVlcnlfcXBfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX1FVRVJZX1FQKTsKKwlNTFg1X1NFVChxdWVyeV9xcF9pbiwgaW4sIHFwbiwgcXAtPnFwbik7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRsZW4pOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NV9jb3JlX3FwX3F1ZXJ5KTsKIAogaW50IG1seDVfY29yZV94cmNkX2FsbG9jKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiAqeHJjZG4pCiB7Ci0Jc3RydWN0IG1seDVfYWxsb2NfeHJjZF9tYm94X2luIGluOwotCXN0cnVjdCBtbHg1X2FsbG9jX3hyY2RfbWJveF9vdXQgb3V0OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhhbGxvY194cmNkX291dCldID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGFsbG9jX3hyY2RfaW4pXSAgID0gezB9OwogCWludCBlcnI7CiAKLQltZW1zZXQoJmluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9BTExPQ19YUkNEKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCAmb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmIChvdXQuaGRyLnN0YXR1cykKLQkJZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0JZWxzZQotCQkqeHJjZG4gPSBiZTMyX3RvX2NwdShvdXQueHJjZG4pICYgMHhmZmZmZmY7Ci0KKwlNTFg1X1NFVChhbGxvY194cmNkX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9BTExPQ19YUkNEKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOworCWlmICghZXJyKQorCQkqeHJjZG4gPSBNTFg1X0dFVChhbGxvY194cmNkX291dCwgb3V0LCB4cmNkKTsKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NV9jb3JlX3hyY2RfYWxsb2MpOwogCiBpbnQgbWx4NV9jb3JlX3hyY2RfZGVhbGxvYyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgeHJjZG4pCiB7Ci0Jc3RydWN0IG1seDVfZGVhbGxvY194cmNkX21ib3hfaW4gaW47Ci0Jc3RydWN0IG1seDVfZGVhbGxvY194cmNkX21ib3hfb3V0IG91dDsKLQlpbnQgZXJyOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZWFsbG9jX3hyY2Rfb3V0KV0gPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGVhbGxvY194cmNkX2luKV0gICA9IHswfTsKIAotCW1lbXNldCgmaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldCgmb3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JaW4uaGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX0RFQUxMT0NfWFJDRCk7Ci0JaW4ueHJjZG4gPSBjcHVfdG9fYmUzMih4cmNkbik7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgJm91dCwgc2l6ZW9mKG91dCkpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAob3V0Lmhkci5zdGF0dXMpCi0JCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwotCi0JcmV0dXJuIGVycjsKKwlNTFg1X1NFVChkZWFsbG9jX3hyY2RfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0RFQUxMT0NfWFJDRCk7CisJTUxYNV9TRVQoZGVhbGxvY194cmNkX2luLCBpbiwgeHJjZCwgeHJjZG4pOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NV9jb3JlX3hyY2RfZGVhbGxvYyk7CiAKQEAgLTQ0OSwyOCArNTEwLDIzIEBACiBpbnQgbWx4NV9jb3JlX3BhZ2VfZmF1bHRfcmVzdW1lKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiBxcG4sCiAJCQkJdTggZmxhZ3MsIGludCBlcnJvcikKIHsKLQlzdHJ1Y3QgbWx4NV9wYWdlX2ZhdWx0X3Jlc3VtZV9tYm94X2luIGluOwotCXN0cnVjdCBtbHg1X3BhZ2VfZmF1bHRfcmVzdW1lX21ib3hfb3V0IG91dDsKLQlpbnQgZXJyOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhwYWdlX2ZhdWx0X3Jlc3VtZV9vdXQpXSA9IHswfTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhwYWdlX2ZhdWx0X3Jlc3VtZV9pbildICAgPSB7MH07CiAKLQltZW1zZXQoJmluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9QQUdFX0ZBVUxUX1JFU1VNRSk7Ci0JaW4uaGRyLm9wbW9kID0gMDsKLQlmbGFncyAmPSAoTUxYNV9QQUdFX0ZBVUxUX1JFU1VNRV9SRVFVRVNUT1IgfAotCQkgIE1MWDVfUEFHRV9GQVVMVF9SRVNVTUVfV1JJVEUJICAgfAotCQkgIE1MWDVfUEFHRV9GQVVMVF9SRVNVTUVfUkRNQSk7Ci0JZmxhZ3MgfD0gKGVycm9yID8gTUxYNV9QQUdFX0ZBVUxUX1JFU1VNRV9FUlJPUiA6IDApOwotCWluLmZsYWdzX3FwbiA9IGNwdV90b19iZTMyKChxcG4gJiBNTFg1X1FQTl9NQVNLKSB8Ci0JCQkJICAgKGZsYWdzIDw8IE1MWDVfUVBOX0JJVFMpKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCAmb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwlNTFg1X1NFVChwYWdlX2ZhdWx0X3Jlc3VtZV9pbiwgaW4sIG9wY29kZSwKKwkJIE1MWDVfQ01EX09QX1BBR0VfRkFVTFRfUkVTVU1FKTsKKwlNTFg1X1NFVChwYWdlX2ZhdWx0X3Jlc3VtZV9pbiwgaW4sIHFwbiwgcXBuKTsKIAotCWlmIChvdXQuaGRyLnN0YXR1cykKLQkJZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7CisJaWYgKGZsYWdzICYgTUxYNV9QQUdFX0ZBVUxUX1JFU1VNRV9SRVFVRVNUT1IpCisJCU1MWDVfU0VUKHBhZ2VfZmF1bHRfcmVzdW1lX2luLCBpbiwgcmVxX3JlcywgMSk7CisJaWYgKGZsYWdzICYgTUxYNV9QQUdFX0ZBVUxUX1JFU1VNRV9XUklURSkKKwkJTUxYNV9TRVQocGFnZV9mYXVsdF9yZXN1bWVfaW4sIGluLCByZWFkX3dyaXRlLCAxKTsKKwlpZiAoZmxhZ3MgJiBNTFg1X1BBR0VfRkFVTFRfUkVTVU1FX1JETUEpCisJCU1MWDVfU0VUKHBhZ2VfZmF1bHRfcmVzdW1lX2luLCBpbiwgcmRtYSwgMSk7CisJaWYgKGVycm9yKQorCQlNTFg1X1NFVChwYWdlX2ZhdWx0X3Jlc3VtZV9pbiwgaW4sIGVycm9yLCAxKTsKIAotCXJldHVybiBlcnI7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg1X2NvcmVfcGFnZV9mYXVsdF9yZXN1bWUpOwogI2VuZGlmCkBAIC01NDEsMTUgKzU5NywxMiBAQAogCiBpbnQgbWx4NV9jb3JlX2FsbG9jX3FfY291bnRlcihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgKmNvdW50ZXJfaWQpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoYWxsb2NfcV9jb3VudGVyX2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGFsbG9jX3FfY291bnRlcl9vdXQpXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhhbGxvY19xX2NvdW50ZXJfaW4pXSAgID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhhbGxvY19xX2NvdW50ZXJfb3V0KV0gPSB7MH07CiAJaW50IGVycjsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwotCiAJTUxYNV9TRVQoYWxsb2NfcV9jb3VudGVyX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9BTExPQ19RX0NPVU5URVIpOwotCWVyciA9IG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiAJaWYgKCFlcnIpCiAJCSpjb3VudGVyX2lkID0gTUxYNV9HRVQoYWxsb2NfcV9jb3VudGVyX291dCwgb3V0LAogCQkJCSAgICAgICBjb3VudGVyX3NldF9pZCk7CkBAIC01NTksMzEgKzYxMiwyNSBAQAogCiBpbnQgbWx4NV9jb3JlX2RlYWxsb2NfcV9jb3VudGVyKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUxNiBjb3VudGVyX2lkKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlYWxsb2NfcV9jb3VudGVyX2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlYWxsb2NfcV9jb3VudGVyX291dCldOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGVhbGxvY19xX2NvdW50ZXJfaW4pXSAgID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZWFsbG9jX3FfY291bnRlcl9vdXQpXSA9IHswfTsKIAogCU1MWDVfU0VUKGRlYWxsb2NfcV9jb3VudGVyX2luLCBpbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfREVBTExPQ19RX0NPVU5URVIpOwogCU1MWDVfU0VUKGRlYWxsb2NfcV9jb3VudGVyX2luLCBpbiwgY291bnRlcl9zZXRfaWQsIGNvdW50ZXJfaWQpOwotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsCi0JCQkJCSAgc2l6ZW9mKG91dCkpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NV9jb3JlX2RlYWxsb2NfcV9jb3VudGVyKTsKIAogaW50IG1seDVfY29yZV9xdWVyeV9xX2NvdW50ZXIoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2IGNvdW50ZXJfaWQsCiAJCQkgICAgICBpbnQgcmVzZXQsIHZvaWQgKm91dCwgaW50IG91dF9zaXplKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X3FfY291bnRlcl9pbildOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9xX2NvdW50ZXJfaW4pXSA9IHswfTsKIAogCU1MWDVfU0VUKHF1ZXJ5X3FfY291bnRlcl9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfUVVFUllfUV9DT1VOVEVSKTsKIAlNTFg1X1NFVChxdWVyeV9xX2NvdW50ZXJfaW4sIGluLCBjbGVhciwgcmVzZXQpOwogCU1MWDVfU0VUKHF1ZXJ5X3FfY291bnRlcl9pbiwgaW4sIGNvdW50ZXJfc2V0X2lkLCBjb3VudGVyX2lkKTsKLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRfc2l6ZSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRfc2l6ZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg1X2NvcmVfcXVlcnlfcV9jb3VudGVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3JsLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcmwuYwppbmRleCBjMDdjMjhiLi4xMDQ5MDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcmwuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcmwuYwpAQCAtNjMsMTkgKzYzLDE0IEBACiBzdGF0aWMgaW50IG1seDVfc2V0X3JhdGVfbGltaXRfY21kKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQkJICAgdTMyIHJhdGUsIHUxNiBpbmRleCkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhzZXRfcmF0ZV9saW1pdF9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhzZXRfcmF0ZV9saW1pdF9vdXQpXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHNldF9yYXRlX2xpbWl0X2luKV0gICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoc2V0X3JhdGVfbGltaXRfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChzZXRfcmF0ZV9saW1pdF9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX1NFVF9SQVRFX0xJTUlUKTsKIAlNTFg1X1NFVChzZXRfcmF0ZV9saW1pdF9pbiwgaW4sIHJhdGVfbGltaXRfaW5kZXgsIGluZGV4KTsKIAlNTFg1X1NFVChzZXRfcmF0ZV9saW1pdF9pbiwgaW4sIHJhdGVfbGltaXQsIHJhdGUpOwotCi0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksCi0JCQkJCSAgb3V0LCBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIGJvb2wgbWx4NV9ybF9pc19pbl9yYW5nZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgcmF0ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9zcmlvdi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3NyaW92LmMKaW5kZXggYjM4MGE2Yi4uZTA4NjI3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3NyaW92LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3NyaW92LmMKQEAgLTM3LDE5OCArMzcsMjAwIEBACiAjaW5jbHVkZSAiZXN3aXRjaC5oIgogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGVuYWJsZV92ZnMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgaW50IG51bV92ZnMpCitib29sIG1seDVfc3Jpb3ZfaXNfZW5hYmxlZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCXN0cnVjdCBtbHg1X2NvcmVfc3Jpb3YgKnNyaW92ID0gJmRldi0+cHJpdi5zcmlvdjsKKworCXJldHVybiAhIXNyaW92LT5udW1fdmZzOworfQorCitzdGF0aWMgaW50IG1seDVfZGV2aWNlX2VuYWJsZV9zcmlvdihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBpbnQgbnVtX3ZmcykKIHsKIAlzdHJ1Y3QgbWx4NV9jb3JlX3NyaW92ICpzcmlvdiA9ICZkZXYtPnByaXYuc3Jpb3Y7CiAJaW50IGVycjsKIAlpbnQgdmY7CiAKLQlmb3IgKHZmID0gMTsgdmYgPD0gbnVtX3ZmczsgdmYrKykgewotCQllcnIgPSBtbHg1X2NvcmVfZW5hYmxlX2hjYShkZXYsIHZmKTsKLQkJaWYgKGVycikgewotCQkJbWx4NV9jb3JlX3dhcm4oZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBWRiAlZFxuIiwgdmYgLSAxKTsKLQkJfSBlbHNlIHsKLQkJCXNyaW92LT52ZnNfY3R4W3ZmIC0gMV0uZW5hYmxlZCA9IDE7Ci0JCQltbHg1X2NvcmVfZGJnKGRldiwgInN1Y2Nlc3NmdWxseSBlbmFibGVkIFZGICVkXG4iLCB2ZiAtIDEpOwotCQl9CisJaWYgKHNyaW92LT5lbmFibGVkX3ZmcykgeworCQltbHg1X2NvcmVfd2FybihkZXYsCisJCQkgICAgICAgImZhaWxlZCB0byBlbmFibGUgU1JJT1Ygb24gZGV2aWNlLCBhbHJlYWR5IGVuYWJsZWQgd2l0aCAlZCB2ZnNcbiIsCisJCQkgICAgICAgc3Jpb3YtPmVuYWJsZWRfdmZzKTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9Ci19CiAKLXN0YXRpYyB2b2lkIGRpc2FibGVfdmZzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIGludCBudW1fdmZzKQotewotCXN0cnVjdCBtbHg1X2NvcmVfc3Jpb3YgKnNyaW92ID0gJmRldi0+cHJpdi5zcmlvdjsKLQlpbnQgdmY7Ci0KLQlmb3IgKHZmID0gMTsgdmYgPD0gbnVtX3ZmczsgdmYrKykgewotCQlpZiAoc3Jpb3YtPnZmc19jdHhbdmYgLSAxXS5lbmFibGVkKSB7Ci0JCQlpZiAobWx4NV9jb3JlX2Rpc2FibGVfaGNhKGRldiwgdmYpKQotCQkJCW1seDVfY29yZV93YXJuKGRldiwgImZhaWxlZCB0byBkaXNhYmxlIFZGICVkXG4iLCB2ZiAtIDEpOwotCQkJZWxzZQotCQkJCXNyaW92LT52ZnNfY3R4W3ZmIC0gMV0uZW5hYmxlZCA9IDA7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbWx4NV9jb3JlX2NyZWF0ZV92ZnMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBudW1fdmZzKQotewotCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYgID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCBlcnI7Ci0KLQlpZiAocGNpX251bV92ZihwZGV2KSkKLQkJcGNpX2Rpc2FibGVfc3Jpb3YocGRldik7Ci0KLQllbmFibGVfdmZzKGRldiwgbnVtX3Zmcyk7Ci0KLQllcnIgPSBwY2lfZW5hYmxlX3NyaW92KHBkZXYsIG51bV92ZnMpOworI2lmZGVmIENPTkZJR19NTFg1X0NPUkVfRU4KKwllcnIgPSBtbHg1X2Vzd2l0Y2hfZW5hYmxlX3NyaW92KGRldi0+cHJpdi5lc3dpdGNoLCBudW1fdmZzLCBTUklPVl9MRUdBQ1kpOwogCWlmIChlcnIpIHsKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImVuYWJsZSBzcmlvdiBmYWlsZWQgJWRcbiIsIGVycik7Ci0JCWdvdG8gZXg7CisJCW1seDVfY29yZV93YXJuKGRldiwKKwkJCSAgICAgICAiZmFpbGVkIHRvIGVuYWJsZSBlc3dpdGNoIFNSSU9WICglZClcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorI2VuZGlmCisKKwlmb3IgKHZmID0gMDsgdmYgPCBudW1fdmZzOyB2ZisrKSB7CisJCWVyciA9IG1seDVfY29yZV9lbmFibGVfaGNhKGRldiwgdmYgKyAxKTsKKwkJaWYgKGVycikgeworCQkJbWx4NV9jb3JlX3dhcm4oZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBWRiAlZCAoJWQpXG4iLCB2ZiwgZXJyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNyaW92LT52ZnNfY3R4W3ZmXS5lbmFibGVkID0gMTsKKwkJc3Jpb3YtPmVuYWJsZWRfdmZzKys7CisJCW1seDVfY29yZV9kYmcoZGV2LCAic3VjY2Vzc2Z1bGx5IGVuYWJsZWQgVkYqICVkXG4iLCB2Zik7CisKIAl9CiAKIAlyZXR1cm4gMDsKK30KIAotZXg6Ci0JZGlzYWJsZV92ZnMoZGV2LCBudW1fdmZzKTsKK3N0YXRpYyB2b2lkIG1seDVfZGV2aWNlX2Rpc2FibGVfc3Jpb3Yoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbWx4NV9jb3JlX3NyaW92ICpzcmlvdiA9ICZkZXYtPnByaXYuc3Jpb3Y7CisJaW50IGVycjsKKwlpbnQgdmY7CisKKwlpZiAoIXNyaW92LT5lbmFibGVkX3ZmcykKKwkJcmV0dXJuOworCisJZm9yICh2ZiA9IDA7IHZmIDwgc3Jpb3YtPm51bV92ZnM7IHZmKyspIHsKKwkJaWYgKCFzcmlvdi0+dmZzX2N0eFt2Zl0uZW5hYmxlZCkKKwkJCWNvbnRpbnVlOworCQllcnIgPSBtbHg1X2NvcmVfZGlzYWJsZV9oY2EoZGV2LCB2ZiArIDEpOworCQlpZiAoZXJyKSB7CisJCQltbHg1X2NvcmVfd2FybihkZXYsICJmYWlsZWQgdG8gZGlzYWJsZSBWRiAlZFxuIiwgdmYpOworCQkJY29udGludWU7CisJCX0KKwkJc3Jpb3YtPnZmc19jdHhbdmZdLmVuYWJsZWQgPSAwOworCQlzcmlvdi0+ZW5hYmxlZF92ZnMtLTsKKwl9CisKKyNpZmRlZiBDT05GSUdfTUxYNV9DT1JFX0VOCisJbWx4NV9lc3dpdGNoX2Rpc2FibGVfc3Jpb3YoZGV2LT5wcml2LmVzd2l0Y2gpOworI2VuZGlmCisKKwlpZiAobWx4NV93YWl0X2Zvcl92Zl9wYWdlcyhkZXYpKQorCQltbHg1X2NvcmVfd2FybihkZXYsICJ0aW1lb3V0IHJlY2xhaW1pbmcgVkZzIHBhZ2VzXG4iKTsKK30KKworc3RhdGljIGludCBtbHg1X3BjaV9lbmFibGVfc3Jpb3Yoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBudW1fdmZzKQoreworCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYgID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBlcnIgPSAwOworCisJaWYgKHBjaV9udW1fdmYocGRldikpIHsKKwkJbWx4NV9jb3JlX3dhcm4oZGV2LCAiVW5hYmxlIHRvIGVuYWJsZSBwY2kgc3Jpb3YsIGFscmVhZHkgZW5hYmxlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJZXJyID0gcGNpX2VuYWJsZV9zcmlvdihwZGV2LCBudW1fdmZzKTsKKwlpZiAoZXJyKQorCQltbHg1X2NvcmVfd2FybihkZXYsICJwY2lfZW5hYmxlX3NyaW92IGZhaWxlZCA6ICVkXG4iLCBlcnIpOworCiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBtbHg1X2NvcmVfc3Jpb3ZfZW5hYmxlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgbnVtX3ZmcykKK3N0YXRpYyB2b2lkIG1seDVfcGNpX2Rpc2FibGVfc3Jpb3Yoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcGNpX2Rpc2FibGVfc3Jpb3YocGRldik7Cit9CisKK3N0YXRpYyBpbnQgbWx4NV9zcmlvdl9lbmFibGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBudW1fdmZzKQogewogCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYgID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBtbHg1X2NvcmVfc3Jpb3YgKnNyaW92ID0gJmRldi0+cHJpdi5zcmlvdjsKLQlpbnQgZXJyOworCWludCBlcnIgPSAwOwogCi0Ja2ZyZWUoc3Jpb3YtPnZmc19jdHgpOwotCXNyaW92LT52ZnNfY3R4ID0ga2NhbGxvYyhudW1fdmZzLCBzaXplb2YoKnNyaW92LT52ZnNfY3R4KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFzcmlvdi0+dmZzX2N0eCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcmlvdi0+ZW5hYmxlZF92ZnMgPSBudW1fdmZzOwotCWVyciA9IG1seDVfY29yZV9jcmVhdGVfdmZzKHBkZXYsIG51bV92ZnMpOworCWVyciA9IG1seDVfZGV2aWNlX2VuYWJsZV9zcmlvdihkZXYsIG51bV92ZnMpOwogCWlmIChlcnIpIHsKLQkJa2ZyZWUoc3Jpb3YtPnZmc19jdHgpOwotCQlzcmlvdi0+dmZzX2N0eCA9IE5VTEw7CisJCW1seDVfY29yZV93YXJuKGRldiwgIm1seDVfZGV2aWNlX2VuYWJsZV9zcmlvdiBmYWlsZWQgOiAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKKwllcnIgPSBtbHg1X3BjaV9lbmFibGVfc3Jpb3YocGRldiwgbnVtX3Zmcyk7CisJaWYgKGVycikgeworCQltbHg1X2NvcmVfd2FybihkZXYsICJtbHg1X3BjaV9lbmFibGVfc3Jpb3YgZmFpbGVkIDogJWRcbiIsIGVycik7CisJCW1seDVfZGV2aWNlX2Rpc2FibGVfc3Jpb3YoZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzcmlvdi0+bnVtX3ZmcyA9IG51bV92ZnM7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbWx4NV9jb3JlX2luaXRfdmZzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIGludCBudW1fdmZzKQorc3RhdGljIHZvaWQgbWx4NV9zcmlvdl9kaXNhYmxlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogeworCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYgID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBtbHg1X2NvcmVfc3Jpb3YgKnNyaW92ID0gJmRldi0+cHJpdi5zcmlvdjsKIAotCXNyaW92LT5udW1fdmZzID0gbnVtX3ZmczsKLX0KLQotc3RhdGljIHZvaWQgbWx4NV9jb3JlX2NsZWFudXBfdmZzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IG1seDVfY29yZV9zcmlvdiAqc3Jpb3Y7Ci0KLQlzcmlvdiA9ICZkZXYtPnByaXYuc3Jpb3Y7Ci0JZGlzYWJsZV92ZnMoZGV2LCBzcmlvdi0+bnVtX3Zmcyk7Ci0KLQlpZiAobWx4NV93YWl0X2Zvcl92Zl9wYWdlcyhkZXYpKQotCQltbHg1X2NvcmVfd2FybihkZXYsICJ0aW1lb3V0IGNsYWltaW5nIFZGcyBwYWdlc1xuIik7Ci0KKwltbHg1X3BjaV9kaXNhYmxlX3NyaW92KHBkZXYpOworCW1seDVfZGV2aWNlX2Rpc2FibGVfc3Jpb3YoZGV2KTsKIAlzcmlvdi0+bnVtX3ZmcyA9IDA7CiB9CiAKIGludCBtbHg1X2NvcmVfc3Jpb3ZfY29uZmlndXJlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgbnVtX3ZmcykKIHsKIAlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2ICA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgbWx4NV9jb3JlX3NyaW92ICpzcmlvdiA9ICZkZXYtPnByaXYuc3Jpb3Y7Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gMDsKIAogCW1seDVfY29yZV9kYmcoZGV2LCAicmVxdWVzdGVkIG51bV92ZnMgJWRcbiIsIG51bV92ZnMpOwogCWlmICghbWx4NV9jb3JlX2lzX3BmKGRldikpCiAJCXJldHVybiAtRVBFUk07CiAKLQltbHg1X2NvcmVfY2xlYW51cF92ZnMoZGV2KTsKLQotCWlmICghbnVtX3ZmcykgewotI2lmZGVmIENPTkZJR19NTFg1X0NPUkVfRU4KLQkJbWx4NV9lc3dpdGNoX2Rpc2FibGVfc3Jpb3YoZGV2LT5wcml2LmVzd2l0Y2gpOwotI2VuZGlmCi0JCWtmcmVlKHNyaW92LT52ZnNfY3R4KTsKLQkJc3Jpb3YtPnZmc19jdHggPSBOVUxMOwotCQlpZiAoIXBjaV92ZnNfYXNzaWduZWQocGRldikpCi0JCQlwY2lfZGlzYWJsZV9zcmlvdihwZGV2KTsKLQkJZWxzZQotCQkJcHJfaW5mbygidW5sb2FkaW5nIFBGIGRyaXZlciB3aGlsZSBsZWF2aW5nIG9ycGhhbiBWRnNcbiIpOwotCQlyZXR1cm4gMDsKKwlpZiAobnVtX3ZmcyAmJiBtbHg1X2xhZ19pc19hY3RpdmUoZGV2KSkgeworCQltbHg1X2NvcmVfd2FybihkZXYsICJjYW4ndCB0dXJuIHNyaW92IG9uIHdoaWxlIExBRyBpcyBhY3RpdmUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZXJyID0gbWx4NV9jb3JlX3NyaW92X2VuYWJsZShwZGV2LCBudW1fdmZzKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl93YXJuKCZwZGV2LT5kZXYsICJtbHg1X2NvcmVfc3Jpb3ZfZW5hYmxlIGZhaWxlZCAlZFxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJaWYgKG51bV92ZnMpCisJCWVyciA9IG1seDVfc3Jpb3ZfZW5hYmxlKHBkZXYsIG51bV92ZnMpOworCWVsc2UKKwkJbWx4NV9zcmlvdl9kaXNhYmxlKHBkZXYpOwogCi0JbWx4NV9jb3JlX2luaXRfdmZzKGRldiwgbnVtX3Zmcyk7Ci0jaWZkZWYgQ09ORklHX01MWDVfQ09SRV9FTgotCW1seDVfZXN3aXRjaF9lbmFibGVfc3Jpb3YoZGV2LT5wcml2LmVzd2l0Y2gsIG51bV92ZnMsIFNSSU9WX0xFR0FDWSk7Ci0jZW5kaWYKLQotCXJldHVybiBudW1fdmZzOworCXJldHVybiBlcnIgPyBlcnIgOiBudW1fdmZzOwogfQogCi1zdGF0aWMgaW50IHN5bmNfcmVxdWlyZWQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCitpbnQgbWx4NV9zcmlvdl9hdHRhY2goc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2ICA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgbWx4NV9jb3JlX3NyaW92ICpzcmlvdiA9ICZkZXYtPnByaXYuc3Jpb3Y7Ci0JaW50IGN1cl92ZnMgPSBwY2lfbnVtX3ZmKHBkZXYpOwogCi0JaWYgKGN1cl92ZnMgIT0gc3Jpb3YtPm51bV92ZnMpIHsKLQkJcHJfaW5mbygiY3VycmVudCBWRnMgJWQsIHJlZ2lzdGVyZWQgJWQgLSBzeW5jIG5lZWRlZFxuIiwgY3VyX3Zmcywgc3Jpb3YtPm51bV92ZnMpOwotCQlyZXR1cm4gMTsKLQl9CisJaWYgKCFtbHg1X2NvcmVfaXNfcGYoZGV2KSB8fCAhc3Jpb3YtPm51bV92ZnMpCisJCXJldHVybiAwOwogCi0JcmV0dXJuIDA7CisJLyogSWYgc3Jpb3YgVkZzIGV4aXN0IGluIFBDSSBsZXZlbCwgZW5hYmxlIHRoZW0gaW4gZGV2aWNlIGxldmVsICovCisJcmV0dXJuIG1seDVfZGV2aWNlX2VuYWJsZV9zcmlvdihkZXYsIHNyaW92LT5udW1fdmZzKTsKK30KKwordm9pZCBtbHg1X3NyaW92X2RldGFjaChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCWlmICghbWx4NV9jb3JlX2lzX3BmKGRldikpCisJCXJldHVybjsKKworCW1seDVfZGV2aWNlX2Rpc2FibGVfc3Jpb3YoZGV2KTsKIH0KIAogaW50IG1seDVfc3Jpb3ZfaW5pdChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQogewogCXN0cnVjdCBtbHg1X2NvcmVfc3Jpb3YgKnNyaW92ID0gJmRldi0+cHJpdi5zcmlvdjsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cGRldjsKLQlpbnQgY3VyX3ZmczsKKwlpbnQgdG90YWxfdmZzOwogCiAJaWYgKCFtbHg1X2NvcmVfaXNfcGYoZGV2KSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoIXN5bmNfcmVxdWlyZWQoZGV2LT5wZGV2KSkKLQkJcmV0dXJuIDA7Ci0KLQljdXJfdmZzID0gcGNpX251bV92ZihwZGV2KTsKLQlzcmlvdi0+dmZzX2N0eCA9IGtjYWxsb2MoY3VyX3Zmcywgc2l6ZW9mKCpzcmlvdi0+dmZzX2N0eCksIEdGUF9LRVJORUwpOworCXRvdGFsX3ZmcyA9IHBjaV9zcmlvdl9nZXRfdG90YWx2ZnMocGRldik7CisJc3Jpb3YtPm51bV92ZnMgPSBwY2lfbnVtX3ZmKHBkZXYpOworCXNyaW92LT52ZnNfY3R4ID0ga2NhbGxvYyh0b3RhbF92ZnMsIHNpemVvZigqc3Jpb3YtPnZmc19jdHgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNyaW92LT52ZnNfY3R4KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNyaW92LT5lbmFibGVkX3ZmcyA9IGN1cl92ZnM7Ci0KLQltbHg1X2NvcmVfaW5pdF92ZnMoZGV2LCBjdXJfdmZzKTsKLSNpZmRlZiBDT05GSUdfTUxYNV9DT1JFX0VOCi0JaWYgKGN1cl92ZnMpCi0JCW1seDVfZXN3aXRjaF9lbmFibGVfc3Jpb3YoZGV2LT5wcml2LmVzd2l0Y2gsIGN1cl92ZnMsCi0JCQkJCSAgU1JJT1ZfTEVHQUNZKTsKLSNlbmRpZgotCi0JZW5hYmxlX3ZmcyhkZXYsIGN1cl92ZnMpOwotCiAJcmV0dXJuIDA7CiB9CiAKLWludCBtbHg1X3NyaW92X2NsZWFudXAoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKK3ZvaWQgbWx4NV9zcmlvdl9jbGVhbnVwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXYtPnBkZXY7Ci0JaW50IGVycjsKKwlzdHJ1Y3QgbWx4NV9jb3JlX3NyaW92ICpzcmlvdiA9ICZkZXYtPnByaXYuc3Jpb3Y7CiAKIAlpZiAoIW1seDVfY29yZV9pc19wZihkZXYpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCi0JZXJyID0gbWx4NV9jb3JlX3NyaW92X2NvbmZpZ3VyZShwZGV2LCAwKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIDA7CisJa2ZyZWUoc3Jpb3YtPnZmc19jdHgpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3NycS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3NycS5jCmluZGV4IGMwN2Y0ZDAuLjMwOTk2MzAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvc3JxLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3NycS5jCkBAIC0xNzUsOCArMTc1LDggQEAKIAlNTFg1X1NFVChjcmVhdGVfc3JxX2luLCBjcmVhdGVfaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX0NSRUFURV9TUlEpOwogCi0JZXJyID0gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBjcmVhdGVfaW4sIGlubGVuLCBjcmVhdGVfb3V0LAotCQkJCQkgc2l6ZW9mKGNyZWF0ZV9vdXQpKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgY3JlYXRlX2luLCBpbmxlbiwgY3JlYXRlX291dCwKKwkJCSAgICBzaXplb2YoY3JlYXRlX291dCkpOwogCWt2ZnJlZShjcmVhdGVfaW4pOwogCWlmICghZXJyKQogCQlzcnEtPnNycW4gPSBNTFg1X0dFVChjcmVhdGVfc3JxX291dCwgY3JlYXRlX291dCwgc3Jxbik7CkBAIC0xOTQsOCArMTk0LDggQEAKIAkJIE1MWDVfQ01EX09QX0RFU1RST1lfU1JRKTsKIAlNTFg1X1NFVChkZXN0cm95X3NycV9pbiwgc3JxX2luLCBzcnFuLCBzcnEtPnNycW4pOwogCi0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgc3JxX2luLCBzaXplb2Yoc3JxX2luKSwKLQkJCQkJICBzcnFfb3V0LCBzaXplb2Yoc3JxX291dCkpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgc3JxX2luLCBzaXplb2Yoc3JxX2luKSwKKwkJCSAgICAgc3JxX291dCwgc2l6ZW9mKHNycV9vdXQpKTsKIH0KIAogc3RhdGljIGludCBhcm1fc3JxX2NtZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jb3JlX3NycSAqc3JxLApAQCAtMjA5LDggKzIwOSw4IEBACiAJTUxYNV9TRVQoYXJtX3hyY19zcnFfaW4sIHNycV9pbiwgeHJjX3NycW4sIHNycS0+c3Jxbik7CiAJTUxYNV9TRVQoYXJtX3hyY19zcnFfaW4sIHNycV9pbiwgbHdtLCAgICAgIGx3bSk7CiAKLQlyZXR1cm4gIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgc3JxX2luLCBzaXplb2Yoc3JxX2luKSwKLQkJCQkJICAgc3JxX291dCwgc2l6ZW9mKHNycV9vdXQpKTsKKwlyZXR1cm4gIG1seDVfY21kX2V4ZWMoZGV2LCBzcnFfaW4sIHNpemVvZihzcnFfaW4pLAorCQkJICAgICAgc3JxX291dCwgc2l6ZW9mKHNycV9vdXQpKTsKIH0KIAogc3RhdGljIGludCBxdWVyeV9zcnFfY21kKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2NvcmVfc3JxICpzcnEsCkBAIC0yMjgsOSArMjI4LDggQEAKIAlNTFg1X1NFVChxdWVyeV9zcnFfaW4sIHNycV9pbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfUVVFUllfU1JRKTsKIAlNTFg1X1NFVChxdWVyeV9zcnFfaW4sIHNycV9pbiwgc3Jxbiwgc3JxLT5zcnFuKTsKLQllcnIgPSAgbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBzcnFfaW4sIHNpemVvZihzcnFfaW4pLAotCQkJCQkgIHNycV9vdXQsCi0JCQkJCSAgTUxYNV9TVF9TWl9CWVRFUyhxdWVyeV9zcnFfb3V0KSk7CisJZXJyID0gIG1seDVfY21kX2V4ZWMoZGV2LCBzcnFfaW4sIHNpemVvZihzcnFfaW4pLAorCQkJICAgICBzcnFfb3V0LCBNTFg1X1NUX1NaX0JZVEVTKHF1ZXJ5X3NycV9vdXQpKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIApAQCAtMjcyLDggKzI3MSw4IEBACiAJCSBNTFg1X0NNRF9PUF9DUkVBVEVfWFJDX1NSUSk7CiAKIAltZW1zZXQoY3JlYXRlX291dCwgMCwgc2l6ZW9mKGNyZWF0ZV9vdXQpKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGNyZWF0ZV9pbiwgaW5sZW4sIGNyZWF0ZV9vdXQsCi0JCQkJCSBzaXplb2YoY3JlYXRlX291dCkpOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBjcmVhdGVfaW4sIGlubGVuLCBjcmVhdGVfb3V0LAorCQkJICAgIHNpemVvZihjcmVhdGVfb3V0KSk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTI4NiwzNiArMjg1LDMwIEBACiBzdGF0aWMgaW50IGRlc3Ryb3lfeHJjX3NycV9jbWQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgbWx4NV9jb3JlX3NycSAqc3JxKQogewotCXUzMiB4cmNzcnFfaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X3hyY19zcnFfaW4pXTsKLQl1MzIgeHJjc3JxX291dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfeHJjX3NycV9vdXQpXTsKLQotCW1lbXNldCh4cmNzcnFfaW4sIDAsIHNpemVvZih4cmNzcnFfaW4pKTsKLQltZW1zZXQoeHJjc3JxX291dCwgMCwgc2l6ZW9mKHhyY3NycV9vdXQpKTsKKwl1MzIgeHJjc3JxX2luW01MWDVfU1RfU1pfRFcoZGVzdHJveV94cmNfc3JxX2luKV0gICA9IHswfTsKKwl1MzIgeHJjc3JxX291dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfeHJjX3NycV9vdXQpXSA9IHswfTsKIAogCU1MWDVfU0VUKGRlc3Ryb3lfeHJjX3NycV9pbiwgeHJjc3JxX2luLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9ERVNUUk9ZX1hSQ19TUlEpOwogCU1MWDVfU0VUKGRlc3Ryb3lfeHJjX3NycV9pbiwgeHJjc3JxX2luLCB4cmNfc3Jxbiwgc3JxLT5zcnFuKTsKIAotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIHhyY3NycV9pbiwgc2l6ZW9mKHhyY3NycV9pbiksCi0JCQkJCSAgeHJjc3JxX291dCwgc2l6ZW9mKHhyY3NycV9vdXQpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIHhyY3NycV9pbiwgc2l6ZW9mKHhyY3NycV9pbiksCisJCQkgICAgIHhyY3NycV9vdXQsIHNpemVvZih4cmNzcnFfb3V0KSk7CiB9CiAKIHN0YXRpYyBpbnQgYXJtX3hyY19zcnFfY21kKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQkgICBzdHJ1Y3QgbWx4NV9jb3JlX3NycSAqc3JxLCB1MTYgbHdtKQogewotCXUzMiB4cmNzcnFfaW5bTUxYNV9TVF9TWl9EVyhhcm1feHJjX3NycV9pbildOwotCXUzMiB4cmNzcnFfb3V0W01MWDVfU1RfU1pfRFcoYXJtX3hyY19zcnFfb3V0KV07Ci0KLQltZW1zZXQoeHJjc3JxX2luLCAwLCBzaXplb2YoeHJjc3JxX2luKSk7Ci0JbWVtc2V0KHhyY3NycV9vdXQsIDAsIHNpemVvZih4cmNzcnFfb3V0KSk7CisJdTMyIHhyY3NycV9pbltNTFg1X1NUX1NaX0RXKGFybV94cmNfc3JxX2luKV0gICA9IHswfTsKKwl1MzIgeHJjc3JxX291dFtNTFg1X1NUX1NaX0RXKGFybV94cmNfc3JxX291dCldID0gezB9OwogCiAJTUxYNV9TRVQoYXJtX3hyY19zcnFfaW4sIHhyY3NycV9pbiwgb3Bjb2RlLCAgIE1MWDVfQ01EX09QX0FSTV9YUkNfU1JRKTsKIAlNTFg1X1NFVChhcm1feHJjX3NycV9pbiwgeHJjc3JxX2luLCBvcF9tb2QsICAgTUxYNV9BUk1fWFJDX1NSUV9JTl9PUF9NT0RfWFJDX1NSUSk7CiAJTUxYNV9TRVQoYXJtX3hyY19zcnFfaW4sIHhyY3NycV9pbiwgeHJjX3NycW4sIHNycS0+c3Jxbik7CiAJTUxYNV9TRVQoYXJtX3hyY19zcnFfaW4sIHhyY3NycV9pbiwgbHdtLCAgICAgIGx3bSk7CiAKLQlyZXR1cm4gIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgeHJjc3JxX2luLCBzaXplb2YoeHJjc3JxX2luKSwKLQkJCQkJICAgeHJjc3JxX291dCwgc2l6ZW9mKHhyY3NycV9vdXQpKTsKKwlyZXR1cm4gIG1seDVfY21kX2V4ZWMoZGV2LCB4cmNzcnFfaW4sIHNpemVvZih4cmNzcnFfaW4pLAorCQkJICAgICAgeHJjc3JxX291dCwgc2l6ZW9mKHhyY3NycV9vdXQpKTsKIH0KIAogc3RhdGljIGludCBxdWVyeV94cmNfc3JxX2NtZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LApAQCAtMzM1LDkgKzMyOCw5IEBACiAJTUxYNV9TRVQocXVlcnlfeHJjX3NycV9pbiwgeHJjc3JxX2luLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9RVUVSWV9YUkNfU1JRKTsKIAlNTFg1X1NFVChxdWVyeV94cmNfc3JxX2luLCB4cmNzcnFfaW4sIHhyY19zcnFuLCBzcnEtPnNycW4pOwotCWVyciA9ICBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIHhyY3NycV9pbiwgc2l6ZW9mKHhyY3NycV9pbiksCi0JCQkJCSAgeHJjc3JxX291dCwKLQkJCQkJICBNTFg1X1NUX1NaX0JZVEVTKHF1ZXJ5X3hyY19zcnFfb3V0KSk7CisKKwllcnIgPSAgbWx4NV9jbWRfZXhlYyhkZXYsIHhyY3NycV9pbiwgc2l6ZW9mKHhyY3NycV9pbiksIHhyY3NycV9vdXQsCisJCQkgICAgIE1MWDVfU1RfU1pfQllURVMocXVlcnlfeHJjX3NycV9vdXQpKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3RyYW5zb2JqLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvdHJhbnNvYmouYwppbmRleCAyODI3NGE2Li5hMDBmZjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvdHJhbnNvYmouYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvdHJhbnNvYmouYwpAQCAtMzYsMTcgKzM2LDE0IEBACiAKIGludCBtbHg1X2NvcmVfYWxsb2NfdHJhbnNwb3J0X2RvbWFpbihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgKnRkbikKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhhbGxvY190cmFuc3BvcnRfZG9tYWluX2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGFsbG9jX3RyYW5zcG9ydF9kb21haW5fb3V0KV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoYWxsb2NfdHJhbnNwb3J0X2RvbWFpbl9pbildICAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGFsbG9jX3RyYW5zcG9ydF9kb21haW5fb3V0KV0gPSB7MH07CiAJaW50IGVycjsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwotCiAJTUxYNV9TRVQoYWxsb2NfdHJhbnNwb3J0X2RvbWFpbl9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX0FMTE9DX1RSQU5TUE9SVF9ET01BSU4pOwogCi0JZXJyID0gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIAlpZiAoIWVycikKIAkJKnRkbiA9IE1MWDVfR0VUKGFsbG9jX3RyYW5zcG9ydF9kb21haW5fb3V0LCBvdXQsCiAJCQkJdHJhbnNwb3J0X2RvbWFpbik7CkBAIC01NywyOSArNTQsMjMgQEAKIAogdm9pZCBtbHg1X2NvcmVfZGVhbGxvY190cmFuc3BvcnRfZG9tYWluKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiB0ZG4pCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoZGVhbGxvY190cmFuc3BvcnRfZG9tYWluX2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlYWxsb2NfdHJhbnNwb3J0X2RvbWFpbl9vdXQpXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlYWxsb2NfdHJhbnNwb3J0X2RvbWFpbl9pbildICAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlYWxsb2NfdHJhbnNwb3J0X2RvbWFpbl9vdXQpXSA9IHswfTsKIAogCU1MWDVfU0VUKGRlYWxsb2NfdHJhbnNwb3J0X2RvbWFpbl9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX0RFQUxMT0NfVFJBTlNQT1JUX0RPTUFJTik7CiAJTUxYNV9TRVQoZGVhbGxvY190cmFuc3BvcnRfZG9tYWluX2luLCBpbiwgdHJhbnNwb3J0X2RvbWFpbiwgdGRuKTsKLQotCW1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOworCW1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfY29yZV9kZWFsbG9jX3RyYW5zcG9ydF9kb21haW4pOwogCiBpbnQgbWx4NV9jb3JlX2NyZWF0ZV9ycShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgKmluLCBpbnQgaW5sZW4sIHUzMiAqcnFuKQogewotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfcnFfb3V0KV07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGNyZWF0ZV9ycV9vdXQpXSA9IHswfTsKIAlpbnQgZXJyOwogCiAJTUxYNV9TRVQoY3JlYXRlX3JxX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9DUkVBVEVfUlEpOwotCi0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWVyciA9IG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKIAlpZiAoIWVycikKIAkJKnJxbiA9IE1MWDVfR0VUKGNyZWF0ZV9ycV9vdXQsIG91dCwgcnFuKTsKIApAQCAtOTUsMjEgKzg2LDE4IEBACiAJTUxYNV9TRVQobW9kaWZ5X3JxX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9NT0RJRllfUlEpOwogCiAJbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfbW9kaWZ5X3JxKTsKIAogdm9pZCBtbHg1X2NvcmVfZGVzdHJveV9ycShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgcnFuKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfcnFfaW4pXTsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV9ycV9vdXQpXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV9ycV9pbildICAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfcnFfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChkZXN0cm95X3JxX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9ERVNUUk9ZX1JRKTsKIAlNTFg1X1NFVChkZXN0cm95X3JxX2luLCBpbiwgcnFuLCBycW4pOwotCi0JbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CisJbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIEVYUE9SVF9TWU1CT0wobWx4NV9jb3JlX2Rlc3Ryb3lfcnEpOwogCkBAIC0xMjEsMTkgKzEwOSwxNyBAQAogCU1MWDVfU0VUKHF1ZXJ5X3JxX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9RVUVSWV9SUSk7CiAJTUxYNV9TRVQocXVlcnlfcnFfaW4sIGluLCBycW4sIHJxbik7CiAKLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRsZW4pOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKIH0KIEVYUE9SVF9TWU1CT0wobWx4NV9jb3JlX3F1ZXJ5X3JxKTsKIAogaW50IG1seDVfY29yZV9jcmVhdGVfc3Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyICppbiwgaW50IGlubGVuLCB1MzIgKnNxbikKIHsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX3NxX291dCldOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfc3Ffb3V0KV0gPSB7MH07CiAJaW50IGVycjsKIAogCU1MWDVfU0VUKGNyZWF0ZV9zcV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfQ1JFQVRFX1NRKTsKLQotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CiAJaWYgKCFlcnIpCiAJCSpzcW4gPSBNTFg1X0dFVChjcmVhdGVfc3Ffb3V0LCBvdXQsIHNxbik7CiAKQEAgLTE0MiwyNyArMTI4LDIyIEBACiAKIGludCBtbHg1X2NvcmVfbW9kaWZ5X3NxKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiBzcW4sIHUzMiAqaW4sIGludCBpbmxlbikKIHsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcobW9kaWZ5X3NxX291dCldOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhtb2RpZnlfc3Ffb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChtb2RpZnlfc3FfaW4sIGluLCBzcW4sIHNxbik7CiAJTUxYNV9TRVQobW9kaWZ5X3NxX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9NT0RJRllfU1EpOwotCi0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfbW9kaWZ5X3NxKTsKIAogdm9pZCBtbHg1X2NvcmVfZGVzdHJveV9zcShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgc3FuKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfc3FfaW4pXTsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV9zcV9vdXQpXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV9zcV9pbildICAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfc3Ffb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChkZXN0cm95X3NxX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9ERVNUUk9ZX1NRKTsKIAlNTFg1X1NFVChkZXN0cm95X3NxX2luLCBpbiwgc3FuLCBzcW4pOwotCi0JbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CisJbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIAogaW50IG1seDVfY29yZV9xdWVyeV9zcShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgc3FuLCB1MzIgKm91dCkKQEAgLTE3MiwyMSArMTUzLDIwIEBACiAKIAlNTFg1X1NFVChxdWVyeV9zcV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfUVVFUllfU1EpOwogCU1MWDVfU0VUKHF1ZXJ5X3NxX2luLCBpbiwgc3FuLCBzcW4pOwotCi0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIG91dGxlbik7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfY29yZV9xdWVyeV9zcSk7CiAKIGludCBtbHg1X2NvcmVfY3JlYXRlX3RpcihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgKmluLCBpbnQgaW5sZW4sCiAJCQkgdTMyICp0aXJuKQogewotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfdGlyX291dCldOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfdGlyX291dCldID0gezB9OwogCWludCBlcnI7CiAKIAlNTFg1X1NFVChjcmVhdGVfdGlyX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9DUkVBVEVfVElSKTsKIAogCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CiAJaWYgKCFlcnIpCiAJCSp0aXJuID0gTUxYNV9HRVQoY3JlYXRlX3Rpcl9vdXQsIG91dCwgdGlybik7CiAKQEAgLTE5NywzOSArMTc3LDMyIEBACiBpbnQgbWx4NV9jb3JlX21vZGlmeV90aXIoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHRpcm4sIHUzMiAqaW4sCiAJCQkgaW50IGlubGVuKQogewotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhtb2RpZnlfdGlyX291dCldOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhtb2RpZnlfdGlyX291dCldID0gezB9OwogCiAJTUxYNV9TRVQobW9kaWZ5X3Rpcl9pbiwgaW4sIHRpcm4sIHRpcm4pOwogCU1MWDVfU0VUKG1vZGlmeV90aXJfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX01PRElGWV9USVIpOwotCi0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCiB2b2lkIG1seDVfY29yZV9kZXN0cm95X3RpcihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgdGlybikKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X3Rpcl9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZXN0cm95X3Rpcl9vdXQpXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV90aXJfaW4pXSAgID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZXN0cm95X3Rpcl9vdXQpXSA9IHswfTsKIAogCU1MWDVfU0VUKGRlc3Ryb3lfdGlyX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9ERVNUUk9ZX1RJUik7CiAJTUxYNV9TRVQoZGVzdHJveV90aXJfaW4sIGluLCB0aXJuLCB0aXJuKTsKLQotCW1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOworCW1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfY29yZV9kZXN0cm95X3Rpcik7CiAKIGludCBtbHg1X2NvcmVfY3JlYXRlX3RpcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgKmluLCBpbnQgaW5sZW4sCiAJCQkgdTMyICp0aXNuKQogewotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfdGlzX291dCldOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfdGlzX291dCldID0gezB9OwogCWludCBlcnI7CiAKIAlNTFg1X1NFVChjcmVhdGVfdGlzX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9DUkVBVEVfVElTKTsKLQotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CiAJaWYgKCFlcnIpCiAJCSp0aXNuID0gTUxYNV9HRVQoY3JlYXRlX3Rpc19vdXQsIG91dCwgdGlzbik7CiAKQEAgLTI0NSwzNCArMjE4LDI5IEBACiAJTUxYNV9TRVQobW9kaWZ5X3Rpc19pbiwgaW4sIHRpc24sIHRpc24pOwogCU1MWDVfU0VUKG1vZGlmeV90aXNfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX01PRElGWV9USVMpOwogCi0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfY29yZV9tb2RpZnlfdGlzKTsKIAogdm9pZCBtbHg1X2NvcmVfZGVzdHJveV90aXMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHRpc24pCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV90aXNfaW4pXTsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV90aXNfb3V0KV07Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfdGlzX2luKV0gICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV90aXNfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChkZXN0cm95X3Rpc19pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfREVTVFJPWV9USVMpOwogCU1MWDVfU0VUKGRlc3Ryb3lfdGlzX2luLCBpbiwgdGlzbiwgdGlzbik7Ci0KLQltbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKKwltbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfZGVzdHJveV90aXMpOwogCiBpbnQgbWx4NV9jb3JlX2NyZWF0ZV9ybXAoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyICppbiwgaW50IGlubGVuLAogCQkJIHUzMiAqcm1wbikKIHsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX3JtcF9vdXQpXTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX3JtcF9vdXQpXSA9IHswfTsKIAlpbnQgZXJyOwogCiAJTUxYNV9TRVQoY3JlYXRlX3JtcF9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfQ1JFQVRFX1JNUCk7Ci0KLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JZXJyID0gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOwogCWlmICghZXJyKQogCQkqcm1wbiA9IE1MWDVfR0VUKGNyZWF0ZV9ybXBfb3V0LCBvdXQsIHJtcG4pOwogCkBAIC0yODEsMzggKzI0OSwzMSBAQAogCiBpbnQgbWx4NV9jb3JlX21vZGlmeV9ybXAoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyICppbiwgaW50IGlubGVuKQogewotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhtb2RpZnlfcm1wX291dCldOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhtb2RpZnlfcm1wX291dCldID0gezB9OwogCiAJTUxYNV9TRVQobW9kaWZ5X3JtcF9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfTU9ESUZZX1JNUCk7Ci0KLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIGludCBtbHg1X2NvcmVfZGVzdHJveV9ybXAoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHJtcG4pCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV9ybXBfaW4pXTsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV9ybXBfb3V0KV07Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfcm1wX2luKV0gICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV9ybXBfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChkZXN0cm95X3JtcF9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfREVTVFJPWV9STVApOwogCU1MWDVfU0VUKGRlc3Ryb3lfcm1wX2luLCBpbiwgcm1wbiwgcm1wbik7Ci0KLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LAorCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwKIAkJCQkJICBzaXplb2Yob3V0KSk7CiB9CiAKIGludCBtbHg1X2NvcmVfcXVlcnlfcm1wKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiBybXBuLCB1MzIgKm91dCkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9ybXBfaW4pXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9ybXBfaW4pXSA9IHswfTsKIAlpbnQgb3V0bGVuID0gTUxYNV9TVF9TWl9CWVRFUyhxdWVyeV9ybXBfb3V0KTsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CiAJTUxYNV9TRVQocXVlcnlfcm1wX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9RVUVSWV9STVApOwogCU1MWDVfU0VUKHF1ZXJ5X3JtcF9pbiwgaW4sIHJtcG4sICAgcm1wbik7Ci0KLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRsZW4pOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKIH0KIAogaW50IG1seDVfY29yZV9hcm1fcm1wKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiBybXBuLCB1MTYgbHdtKQpAQCAtMzQ3LDEzICszMDgsMTEgQEAKIGludCBtbHg1X2NvcmVfY3JlYXRlX3hzcnEoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyICppbiwgaW50IGlubGVuLAogCQkJICB1MzIgKnhzcnFuKQogewotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfeHJjX3NycV9vdXQpXTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX3hyY19zcnFfb3V0KV0gPSB7MH07CiAJaW50IGVycjsKIAogCU1MWDVfU0VUKGNyZWF0ZV94cmNfc3JxX2luLCBpbiwgb3Bjb2RlLCAgICAgTUxYNV9DTURfT1BfQ1JFQVRFX1hSQ19TUlEpOwotCi0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWVyciA9IG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKIAlpZiAoIWVycikKIAkJKnhzcnFuID0gTUxYNV9HRVQoY3JlYXRlX3hyY19zcnFfb3V0LCBvdXQsIHhyY19zcnFuKTsKIApAQCAtMzYyLDMzICszMjEsMjUgQEAKIAogaW50IG1seDVfY29yZV9kZXN0cm95X3hzcnEoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHhzcnFuKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfeHJjX3NycV9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZXN0cm95X3hyY19zcnFfb3V0KV07Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X3hyY19zcnFfaW4pXSAgID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZXN0cm95X3hyY19zcnFfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChkZXN0cm95X3hyY19zcnFfaW4sIGluLCBvcGNvZGUsICAgTUxYNV9DTURfT1BfREVTVFJPWV9YUkNfU1JRKTsKIAlNTFg1X1NFVChkZXN0cm95X3hyY19zcnFfaW4sIGluLCB4cmNfc3JxbiwgeHNycW4pOwotCi0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwKLQkJCQkJICBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIGludCBtbHg1X2NvcmVfcXVlcnlfeHNycShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgeHNycW4sIHUzMiAqb3V0KQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X3hyY19zcnFfaW4pXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV94cmNfc3JxX2luKV0gPSB7MH07CiAJdm9pZCAqc3JxYzsKIAl2b2lkICp4cmNfc3JxYzsKIAlpbnQgZXJyOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKIAlNTFg1X1NFVChxdWVyeV94cmNfc3JxX2luLCBpbiwgb3Bjb2RlLCAgIE1MWDVfQ01EX09QX1FVRVJZX1hSQ19TUlEpOwogCU1MWDVfU0VUKHF1ZXJ5X3hyY19zcnFfaW4sIGluLCB4cmNfc3JxbiwgeHNycW4pOwotCi0JZXJyID0gIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksCi0JCQkJCSAgb3V0LAotCQkJCQkgIE1MWDVfU1RfU1pfQllURVMocXVlcnlfeHJjX3NycV9vdXQpKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwKKwkJCSAgICBNTFg1X1NUX1NaX0JZVEVTKHF1ZXJ5X3hyY19zcnFfb3V0KSk7CiAJaWYgKCFlcnIpIHsKIAkJeHJjX3NycWMgPSBNTFg1X0FERFJfT0YocXVlcnlfeHJjX3NycV9vdXQsIG91dCwKIAkJCQkJeHJjX3NycV9jb250ZXh0X2VudHJ5KTsKQEAgLTQwMSwzMiArMzUyLDI1IEBACiAKIGludCBtbHg1X2NvcmVfYXJtX3hzcnEoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHhzcnFuLCB1MTYgbHdtKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGFybV94cmNfc3JxX2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGFybV94cmNfc3JxX291dCldOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7CisJdTMyIGluW01MWDVfU1RfU1pfRFcoYXJtX3hyY19zcnFfaW4pXSAgID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhhcm1feHJjX3NycV9vdXQpXSA9IHswfTsKIAogCU1MWDVfU0VUKGFybV94cmNfc3JxX2luLCBpbiwgb3Bjb2RlLCAgIE1MWDVfQ01EX09QX0FSTV9YUkNfU1JRKTsKIAlNTFg1X1NFVChhcm1feHJjX3NycV9pbiwgaW4sIHhyY19zcnFuLCB4c3Jxbik7CiAJTUxYNV9TRVQoYXJtX3hyY19zcnFfaW4sIGluLCBsd20sICAgICAgbHdtKTsKIAlNTFg1X1NFVChhcm1feHJjX3NycV9pbiwgaW4sIG9wX21vZCwKIAkJIE1MWDVfQVJNX1hSQ19TUlFfSU5fT1BfTU9EX1hSQ19TUlEpOwotCi0JcmV0dXJuICBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsCi0JCQkJCSAgIHNpemVvZihvdXQpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIAogaW50IG1seDVfY29yZV9jcmVhdGVfcnF0KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiAqaW4sIGludCBpbmxlbiwKIAkJCSB1MzIgKnJxdG4pCiB7Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGNyZWF0ZV9ycXRfb3V0KV07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGNyZWF0ZV9ycXRfb3V0KV0gPSB7MH07CiAJaW50IGVycjsKIAogCU1MWDVfU0VUKGNyZWF0ZV9ycXRfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0NSRUFURV9SUVQpOwotCi0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWVyciA9IG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKIAlpZiAoIWVycikKIAkJKnJxdG4gPSBNTFg1X0dFVChjcmVhdGVfcnF0X291dCwgb3V0LCBycXRuKTsKIApAQCAtNDM3LDI1ICszODEsMjAgQEAKIGludCBtbHg1X2NvcmVfbW9kaWZ5X3JxdChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgcnF0biwgdTMyICppbiwKIAkJCSBpbnQgaW5sZW4pCiB7Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKG1vZGlmeV9ycXRfb3V0KV07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKG1vZGlmeV9ycXRfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChtb2RpZnlfcnF0X2luLCBpbiwgcnF0biwgcnF0bik7CiAJTUxYNV9TRVQobW9kaWZ5X3JxdF9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfTU9ESUZZX1JRVCk7Ci0KLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIHZvaWQgbWx4NV9jb3JlX2Rlc3Ryb3lfcnF0KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiBycXRuKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfcnF0X2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfcnF0X291dCldOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X3JxdF9pbildICAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfcnF0X291dCldID0gezB9OwogCiAJTUxYNV9TRVQoZGVzdHJveV9ycXRfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0RFU1RST1lfUlFUKTsKIAlNTFg1X1NFVChkZXN0cm95X3JxdF9pbiwgaW4sIHJxdG4sIHJxdG4pOwotCi0JbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CisJbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIEVYUE9SVF9TWU1CT0wobWx4NV9jb3JlX2Rlc3Ryb3lfcnF0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS91YXIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS91YXIuYwppbmRleCA1ZmY4YWY0Li5hYjBiODk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvdWFyLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3Vhci5jCkBAIC00Miw3MyArNDIsMjggQEAKIAlOVU1fTE9XX0xBVF9VVUFSUwk9IDQsCiB9OwogCi0KLXN0cnVjdCBtbHg1X2FsbG9jX3Vhcl9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2FsbG9jX3Vhcl9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JX19iZTMyCQkJdWFybjsKLQl1OAkJCXJzdmRbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9mcmVlX3Vhcl9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCXVhcm47Ci0JdTgJCQlyc3ZkWzRdOwotfTsKLQotc3RydWN0IG1seDVfZnJlZV91YXJfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KIGludCBtbHg1X2NtZF9hbGxvY191YXIoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyICp1YXJuKQogewotCXN0cnVjdCBtbHg1X2FsbG9jX3Vhcl9tYm94X2luCWluOwotCXN0cnVjdCBtbHg1X2FsbG9jX3Vhcl9tYm94X291dAlvdXQ7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGFsbG9jX3Vhcl9vdXQpXSA9IHswfTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhhbGxvY191YXJfaW4pXSAgID0gezB9OwogCWludCBlcnI7CiAKLQltZW1zZXQoJmluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9BTExPQ19VQVIpOwotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCAmaW4sIHNpemVvZihpbiksICZvdXQsIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKQotCQlnb3RvIGV4OwotCi0JaWYgKG91dC5oZHIuc3RhdHVzKSB7Ci0JCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwotCQlnb3RvIGV4OwotCX0KLQotCSp1YXJuID0gYmUzMl90b19jcHUob3V0LnVhcm4pICYgMHhmZmZmZmY7Ci0KLWV4OgorCU1MWDVfU0VUKGFsbG9jX3Vhcl9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfQUxMT0NfVUFSKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOworCWlmICghZXJyKQorCQkqdWFybiA9IE1MWDVfR0VUKGFsbG9jX3Vhcl9vdXQsIG91dCwgdWFyKTsKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NtZF9hbGxvY191YXIpOwogCiBpbnQgbWx4NV9jbWRfZnJlZV91YXIoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHVhcm4pCiB7Ci0Jc3RydWN0IG1seDVfZnJlZV91YXJfbWJveF9pbglpbjsKLQlzdHJ1Y3QgbWx4NV9mcmVlX3Vhcl9tYm94X291dAlvdXQ7Ci0JaW50IGVycjsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVhbGxvY191YXJfb3V0KV0gPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGVhbGxvY191YXJfaW4pXSAgID0gezB9OwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfREVBTExPQ19VQVIpOwotCWluLnVhcm4gPSBjcHVfdG9fYmUzMih1YXJuKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCAmb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikKLQkJZ290byBleDsKLQotCWlmIChvdXQuaGRyLnN0YXR1cykKLQkJZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0KLWV4OgotCXJldHVybiBlcnI7CisJTUxYNV9TRVQoZGVhbGxvY191YXJfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0RFQUxMT0NfVUFSKTsKKwlNTFg1X1NFVChkZWFsbG9jX3Vhcl9pbiwgaW4sIHVhciwgdWFybik7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfY21kX2ZyZWVfdWFyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3Zwb3J0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvdnBvcnQuYwppbmRleCAyMTM2NWQwLi41MjVmMTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvdnBvcnQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvdnBvcnQuYwpAQCAtMzksMTAgKzM5LDcgQEAKIHN0YXRpYyBpbnQgX21seDVfcXVlcnlfdnBvcnRfc3RhdGUoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHU4IG9wbW9kLAogCQkJCSAgIHUxNiB2cG9ydCwgdTMyICpvdXQsIGludCBvdXRsZW4pCiB7Ci0JaW50IGVycjsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV92cG9ydF9zdGF0ZV9pbildOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV92cG9ydF9zdGF0ZV9pbildID0gezB9OwogCiAJTUxYNV9TRVQocXVlcnlfdnBvcnRfc3RhdGVfaW4sIGluLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9RVUVSWV9WUE9SVF9TVEFURSk7CkBAIC01MSwxMSArNDgsNyBAQAogCWlmICh2cG9ydCkKIAkJTUxYNV9TRVQocXVlcnlfdnBvcnRfc3RhdGVfaW4sIGluLCBvdGhlcl92cG9ydCwgMSk7CiAKLQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhtZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRsZW4pOwotCWlmIChlcnIpCi0JCW1seDVfY29yZV93YXJuKG1kZXYsICJNTFg1X0NNRF9PUF9RVUVSWV9WUE9SVF9TVEFURSBmYWlsZWRcbiIpOwotCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhtZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRsZW4pOwogfQogCiB1OCBtbHg1X3F1ZXJ5X3Zwb3J0X3N0YXRlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCB1OCBvcG1vZCwgdTE2IHZwb3J0KQpAQCAtODEsNTggKzc0LDQzIEBACiBpbnQgbWx4NV9tb2RpZnlfdnBvcnRfYWRtaW5fc3RhdGUoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHU4IG9wbW9kLAogCQkJCSAgdTE2IHZwb3J0LCB1OCBzdGF0ZSkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhtb2RpZnlfdnBvcnRfc3RhdGVfaW4pXTsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcobW9kaWZ5X3Zwb3J0X3N0YXRlX291dCldOwotCWludCBlcnI7Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKG1vZGlmeV92cG9ydF9zdGF0ZV9pbildICAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKG1vZGlmeV92cG9ydF9zdGF0ZV9vdXQpXSA9IHswfTsKIAogCU1MWDVfU0VUKG1vZGlmeV92cG9ydF9zdGF0ZV9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX01PRElGWV9WUE9SVF9TVEFURSk7CiAJTUxYNV9TRVQobW9kaWZ5X3Zwb3J0X3N0YXRlX2luLCBpbiwgb3BfbW9kLCBvcG1vZCk7CiAJTUxYNV9TRVQobW9kaWZ5X3Zwb3J0X3N0YXRlX2luLCBpbiwgdnBvcnRfbnVtYmVyLCB2cG9ydCk7Ci0KIAlpZiAodnBvcnQpCiAJCU1MWDVfU0VUKG1vZGlmeV92cG9ydF9zdGF0ZV9pbiwgaW4sIG90aGVyX3Zwb3J0LCAxKTsKLQogCU1MWDVfU0VUKG1vZGlmeV92cG9ydF9zdGF0ZV9pbiwgaW4sIGFkbWluX3N0YXRlLCBzdGF0ZSk7CiAKLQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhtZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LAotCQkJCQkgc2l6ZW9mKG91dCkpOwotCWlmIChlcnIpCi0JCW1seDVfY29yZV93YXJuKG1kZXYsICJNTFg1X0NNRF9PUF9NT0RJRllfVlBPUlRfU1RBVEUgZmFpbGVkXG4iKTsKLQotCXJldHVybiBlcnI7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMobWRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NV9tb2RpZnlfdnBvcnRfYWRtaW5fc3RhdGUpOwogCiBzdGF0aWMgaW50IG1seDVfcXVlcnlfbmljX3Zwb3J0X2NvbnRleHQoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHUxNiB2cG9ydCwKIAkJCQkJdTMyICpvdXQsIGludCBvdXRsZW4pCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfbmljX3Zwb3J0X2NvbnRleHRfaW4pXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CisJdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfbmljX3Zwb3J0X2NvbnRleHRfaW4pXSA9IHswfTsKIAogCU1MWDVfU0VUKHF1ZXJ5X25pY192cG9ydF9jb250ZXh0X2luLCBpbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfUVVFUllfTklDX1ZQT1JUX0NPTlRFWFQpOwotCiAJTUxYNV9TRVQocXVlcnlfbmljX3Zwb3J0X2NvbnRleHRfaW4sIGluLCB2cG9ydF9udW1iZXIsIHZwb3J0KTsKIAlpZiAodnBvcnQpCiAJCU1MWDVfU0VUKHF1ZXJ5X25pY192cG9ydF9jb250ZXh0X2luLCBpbiwgb3RoZXJfdnBvcnQsIDEpOwogCi0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKG1kZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIG91dGxlbik7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMobWRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKIH0KIAogc3RhdGljIGludCBtbHg1X21vZGlmeV9uaWNfdnBvcnRfY29udGV4dChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgdm9pZCAqaW4sCiAJCQkJCSBpbnQgaW5sZW4pCiB7Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKG1vZGlmeV9uaWNfdnBvcnRfY29udGV4dF9vdXQpXTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcobW9kaWZ5X25pY192cG9ydF9jb250ZXh0X291dCldID0gezB9OwogCiAJTUxYNV9TRVQobW9kaWZ5X25pY192cG9ydF9jb250ZXh0X2luLCBpbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfTU9ESUZZX05JQ19WUE9SVF9DT05URVhUKTsKLQotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMobWRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhtZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCiB2b2lkIG1seDVfcXVlcnlfbmljX3Zwb3J0X21pbl9pbmxpbmUoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsCkBAIC0xNDcsNiArMTI1LDI2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg1X3F1ZXJ5X25pY192cG9ydF9taW5faW5saW5lKTsKIAoraW50IG1seDVfbW9kaWZ5X25pY192cG9ydF9taW5faW5saW5lKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LAorCQkJCSAgICAgdTE2IHZwb3J0LCB1OCBtaW5faW5saW5lKQoreworCXUzMiBpbltNTFg1X1NUX1NaX0RXKG1vZGlmeV9uaWNfdnBvcnRfY29udGV4dF9pbildID0gezB9OworCWludCBpbmxlbiA9IE1MWDVfU1RfU1pfQllURVMobW9kaWZ5X25pY192cG9ydF9jb250ZXh0X2luKTsKKwl2b2lkICpuaWNfdnBvcnRfY3R4OworCisJTUxYNV9TRVQobW9kaWZ5X25pY192cG9ydF9jb250ZXh0X2luLCBpbiwKKwkJIGZpZWxkX3NlbGVjdC5taW5faW5saW5lLCAxKTsKKwlNTFg1X1NFVChtb2RpZnlfbmljX3Zwb3J0X2NvbnRleHRfaW4sIGluLCB2cG9ydF9udW1iZXIsIHZwb3J0KTsKKwlNTFg1X1NFVChtb2RpZnlfbmljX3Zwb3J0X2NvbnRleHRfaW4sIGluLCBvdGhlcl92cG9ydCwgMSk7CisKKwluaWNfdnBvcnRfY3R4ID0gTUxYNV9BRERSX09GKG1vZGlmeV9uaWNfdnBvcnRfY29udGV4dF9pbiwKKwkJCQkgICAgIGluLCBuaWNfdnBvcnRfY29udGV4dCk7CisJTUxYNV9TRVQobmljX3Zwb3J0X2NvbnRleHQsIG5pY192cG9ydF9jdHgsCisJCSBtaW5fd3FlX2lubGluZV9tb2RlLCBtaW5faW5saW5lKTsKKworCXJldHVybiBtbHg1X21vZGlmeV9uaWNfdnBvcnRfY29udGV4dChtZGV2LCBpbiwgaW5sZW4pOworfQorCiBpbnQgbWx4NV9xdWVyeV9uaWNfdnBvcnRfbWFjX2FkZHJlc3Moc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsCiAJCQkJICAgICB1MTYgdnBvcnQsIHU4ICphZGRyKQogewpAQCAtMjU0LDcgKzI1Miw3IEBACiAJCQkJICB1OCBhZGRyX2xpc3RbXVtFVEhfQUxFTl0sCiAJCQkJICBpbnQgKmxpc3Rfc2l6ZSkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9uaWNfdnBvcnRfY29udGV4dF9pbildOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X25pY192cG9ydF9jb250ZXh0X2luKV0gPSB7MH07CiAJdm9pZCAqbmljX3Zwb3J0X2N0eDsKIAlpbnQgbWF4X2xpc3Rfc2l6ZTsKIAlpbnQgcmVxX2xpc3Rfc2l6ZTsKQEAgLTI3OCw3ICsyNzYsNiBAQAogCW91dF9zeiA9IE1MWDVfU1RfU1pfQllURVMobW9kaWZ5X25pY192cG9ydF9jb250ZXh0X2luKSArCiAJCQlyZXFfbGlzdF9zaXplICogTUxYNV9TVF9TWl9CWVRFUyhtYWNfYWRkcmVzc19sYXlvdXQpOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKIAlvdXQgPSBremFsbG9jKG91dF9zeiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFvdXQpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjkxLDcgKzI4OCw3IEBACiAJaWYgKHZwb3J0KQogCQlNTFg1X1NFVChxdWVyeV9uaWNfdnBvcnRfY29udGV4dF9pbiwgaW4sIG90aGVyX3Zwb3J0LCAxKTsKIAotCWVyciA9IG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0X3N6KTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0X3N6KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIApAQCAtMzYxLDcgKzM1OCw3IEBACiAJCWV0aGVyX2FkZHJfY29weShjdXJyX21hYywgYWRkcl9saXN0W2ldKTsKIAl9CiAKLQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBpbl9zeiwgb3V0LCBzaXplb2Yob3V0KSk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbl9zeiwgb3V0LCBzaXplb2Yob3V0KSk7CiAJa2ZyZWUoaW4pOwogCXJldHVybiBlcnI7CiB9CkBAIC00MDYsNyArNDAzLDcgQEAKIAlpZiAodnBvcnQpCiAJCU1MWDVfU0VUKHF1ZXJ5X25pY192cG9ydF9jb250ZXh0X2luLCBpbiwgb3RoZXJfdnBvcnQsIDEpOwogCi0JZXJyID0gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRfc3opOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRfc3opOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCkBAIC00NzMsNyArNDcwLDcgQEAKIAkJTUxYNV9TRVQodmxhbl9sYXlvdXQsIHZsYW5fYWRkciwgdmxhbiwgdmxhbnNbaV0pOwogCX0KIAotCWVyciA9IG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIGluX3N6LCBvdXQsIHNpemVvZihvdXQpKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGluX3N6LCBvdXQsIHNpemVvZihvdXQpKTsKIAlrZnJlZShpbik7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTYzMSwxMCArNjI4LDYgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnJfdjIob3V0KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQogCXRtcCA9IG91dCArIE1MWDVfU1RfU1pfQllURVMocXVlcnlfaGNhX3Zwb3J0X2dpZF9vdXQpOwogCWdpZC0+Z2xvYmFsLnN1Ym5ldF9wcmVmaXggPSB0bXAtPmdsb2JhbC5zdWJuZXRfcHJlZml4OwogCWdpZC0+Z2xvYmFsLmludGVyZmFjZV9pZCA9IHRtcC0+Z2xvYmFsLmludGVyZmFjZV9pZDsKQEAgLTcwMCwxMCArNjkzLDYgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnJfdjIob3V0KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQogCXBrYXJyID0gTUxYNV9BRERSX09GKHF1ZXJ5X2hjYV92cG9ydF9wa2V5X291dCwgb3V0LCBwa2V5KTsKIAlmb3IgKGkgPSAwOyBpIDwgbm91dDsgaSsrLCBwa2V5KyssIHBrYXJyICs9IE1MWDVfU1RfU1pfQllURVMocGtleSkpCiAJCSpwa2V5ID0gTUxYNV9HRVRfUFIocGtleSwgcGthcnIsIHBrZXkpOwpAQCAtNzIxLDcgKzcxMCw3IEBACiAJCQkJIHN0cnVjdCBtbHg1X2hjYV92cG9ydF9jb250ZXh0ICpyZXApCiB7CiAJaW50IG91dF9zeiA9IE1MWDVfU1RfU1pfQllURVMocXVlcnlfaGNhX3Zwb3J0X2NvbnRleHRfb3V0KTsKLQlpbnQgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9oY2FfdnBvcnRfY29udGV4dF9pbildOworCWludCBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X2hjYV92cG9ydF9jb250ZXh0X2luKV0gPSB7MH07CiAJaW50IGlzX2dyb3VwX21hbmFnZXI7CiAJdm9pZCAqb3V0OwogCXZvaWQgKmN0eDsKQEAgLTcyOSw3ICs3MTgsNiBAQAogCiAJaXNfZ3JvdXBfbWFuYWdlciA9IE1MWDVfQ0FQX0dFTihkZXYsIHZwb3J0X2dyb3VwX21hbmFnZXIpOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKIAlvdXQgPSBremFsbG9jKG91dF9zeiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFvdXQpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNzUyLDkgKzc0MCw2IEBACiAJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsICBvdXRfc3opOwogCWlmIChlcnIpCiAJCWdvdG8gZXg7Ci0JZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycl92MihvdXQpOwotCWlmIChlcnIpCi0JCWdvdG8gZXg7CiAKIAljdHggPSBNTFg1X0FERFJfT0YocXVlcnlfaGNhX3Zwb3J0X2NvbnRleHRfb3V0LCBvdXQsIGhjYV92cG9ydF9jb250ZXh0KTsKIAlyZXAtPmZpZWxkX3NlbGVjdCA9IE1MWDVfR0VUX1BSKGhjYV92cG9ydF9jb250ZXh0LCBjdHgsIGZpZWxkX3NlbGVjdCk7CkBAIC05NjksMTAgKzk1NCw2IEBACiAJCU1MWDVfU0VUKHF1ZXJ5X3Zwb3J0X2NvdW50ZXJfaW4sIGluLCBwb3J0X251bSwgcG9ydF9udW0pOwogCiAJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbl9zeiwgb3V0LCAgb3V0X3N6KTsKLQlpZiAoZXJyKQotCQlnb3RvIGZyZWU7Ci0JZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycl92MihvdXQpOwotCiBmcmVlOgogCWt2ZnJlZShpbik7CiAJcmV0dXJuIGVycjsKQEAgLTEwMzUsMTEgKzEwMTYsNiBAQAogCU1MWDVfU0VUKGhjYV92cG9ydF9jb250ZXh0LCBjdHgsIHFrZXlfdmlvbGF0aW9uX2NvdW50ZXIsIHJlcS0+cWtleV92aW9sYXRpb25fY291bnRlcik7CiAJTUxYNV9TRVQoaGNhX3Zwb3J0X2NvbnRleHQsIGN0eCwgcGtleV92aW9sYXRpb25fY291bnRlciwgcmVxLT5wa2V5X3Zpb2xhdGlvbl9jb3VudGVyKTsKIAllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGluX3N6LCBvdXQsIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKQotCQlnb3RvIGV4OwotCi0JZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycl92MihvdXQpOwotCiBleDoKIAlrZnJlZShpbik7CiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS92eGxhbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3Z4bGFuLmMKaW5kZXggZTI1YTczZWQuLjA3YTliYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS92eGxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS92eGxhbi5jCkBAIC00Niw0MSArNDYsMjQgQEAKIAogc3RhdGljIGludCBtbHg1ZV92eGxhbl9jb3JlX2FkZF9wb3J0X2NtZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgdTE2IHBvcnQpCiB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkciAqaGRyOwotCWludCBlcnI7Ci0KLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhhZGRfdnhsYW5fdWRwX2Rwb3J0X2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGFkZF92eGxhbl91ZHBfZHBvcnRfb3V0KV07Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhhZGRfdnhsYW5fdWRwX2Rwb3J0X2luKV0gICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoYWRkX3Z4bGFuX3VkcF9kcG9ydF9vdXQpXSA9IHswfTsKIAogCU1MWDVfU0VUKGFkZF92eGxhbl91ZHBfZHBvcnRfaW4sIGluLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9BRERfVlhMQU5fVURQX0RQT1JUKTsKIAlNTFg1X1NFVChhZGRfdnhsYW5fdWRwX2Rwb3J0X2luLCBpbiwgdnhsYW5fdWRwX3BvcnQsIHBvcnQpOwotCi0JZXJyID0gbWx4NV9jbWRfZXhlYyhtZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWhkciA9IChzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyICopb3V0OwotCXJldHVybiBoZHItPnN0YXR1cyA/IC1FTk9NRU0gOiAwOworCXJldHVybiBtbHg1X2NtZF9leGVjKG1kZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIAogc3RhdGljIGludCBtbHg1ZV92eGxhbl9jb3JlX2RlbF9wb3J0X2NtZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgdTE2IHBvcnQpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoZGVsZXRlX3Z4bGFuX3VkcF9kcG9ydF9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZWxldGVfdnhsYW5fdWRwX2Rwb3J0X291dCldOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGVsZXRlX3Z4bGFuX3VkcF9kcG9ydF9pbildICAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlbGV0ZV92eGxhbl91ZHBfZHBvcnRfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChkZWxldGVfdnhsYW5fdWRwX2Rwb3J0X2luLCBpbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfREVMRVRFX1ZYTEFOX1VEUF9EUE9SVCk7CiAJTUxYNV9TRVQoZGVsZXRlX3Z4bGFuX3VkcF9kcG9ydF9pbiwgaW4sIHZ4bGFuX3VkcF9wb3J0LCBwb3J0KTsKLQotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhtZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LAotCQkJCQkgIHNpemVvZihvdXQpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhtZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIHN0cnVjdCBtbHg1ZV92eGxhbiAqbWx4NWVfdnhsYW5fbG9va3VwX3BvcnQoc3RydWN0IG1seDVlX3ByaXYgKnByaXYsIHUxNiBwb3J0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvY29yZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvY29yZS5jCmluZGV4IDA2OGVlNjVhLi5hYTMzZDU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvY29yZS5jCkBAIC0xMTAwLDEwICsxMTAwLDE1IEBACiAJCWdvdG8gZXJyX2FsbG9jX3N0YXRzOwogCX0KIAotCWlmIChtbHhzd19kcml2ZXItPnByb2ZpbGUtPnVzZWRfbWF4X2xhZyAmJgotCSAgICBtbHhzd19kcml2ZXItPnByb2ZpbGUtPnVzZWRfbWF4X3BvcnRfcGVyX2xhZykgewotCQlhbGxvY19zaXplID0gc2l6ZW9mKHU4KSAqIG1seHN3X2RyaXZlci0+cHJvZmlsZS0+bWF4X2xhZyAqCi0JCQkgICAgIG1seHN3X2RyaXZlci0+cHJvZmlsZS0+bWF4X3BvcnRfcGVyX2xhZzsKKwllcnIgPSBtbHhzd19idXMtPmluaXQoYnVzX3ByaXYsIG1seHN3X2NvcmUsIG1seHN3X2RyaXZlci0+cHJvZmlsZSwKKwkJCSAgICAgICZtbHhzd19jb3JlLT5yZXNvdXJjZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2J1c19pbml0OworCisJaWYgKG1seHN3X2NvcmUtPnJlc291cmNlcy5tYXhfbGFnX3ZhbGlkICYmCisJICAgIG1seHN3X2NvcmUtPnJlc291cmNlcy5tYXhfcG9ydHNfaW5fbGFnX3ZhbGlkKSB7CisJCWFsbG9jX3NpemUgPSBzaXplb2YodTgpICogbWx4c3dfY29yZS0+cmVzb3VyY2VzLm1heF9sYWcgKgorCQkJbWx4c3dfY29yZS0+cmVzb3VyY2VzLm1heF9wb3J0c19pbl9sYWc7CiAJCW1seHN3X2NvcmUtPmxhZy5tYXBwaW5nID0ga3phbGxvYyhhbGxvY19zaXplLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFtbHhzd19jb3JlLT5sYWcubWFwcGluZykgewogCQkJZXJyID0gLUVOT01FTTsKQEAgLTExMTEsMTEgKzExMTYsNiBAQAogCQl9CiAJfQogCi0JZXJyID0gbWx4c3dfYnVzLT5pbml0KGJ1c19wcml2LCBtbHhzd19jb3JlLCBtbHhzd19kcml2ZXItPnByb2ZpbGUsCi0JCQkgICAgICAmbWx4c3dfY29yZS0+cmVzb3VyY2VzKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9idXNfaW5pdDsKLQogCWVyciA9IG1seHN3X2VtYWRfaW5pdChtbHhzd19jb3JlKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9lbWFkX2luaXQ7CkBAIC0xMTQ2LDEwICsxMTQ2LDEwIEBACiBlcnJfZGV2bGlua19yZWdpc3RlcjoKIAltbHhzd19lbWFkX2ZpbmkobWx4c3dfY29yZSk7CiBlcnJfZW1hZF9pbml0OgotCW1seHN3X2J1cy0+ZmluaShidXNfcHJpdik7Ci1lcnJfYnVzX2luaXQ6CiAJa2ZyZWUobWx4c3dfY29yZS0+bGFnLm1hcHBpbmcpOwogZXJyX2FsbG9jX2xhZ19tYXBwaW5nOgorCW1seHN3X2J1cy0+ZmluaShidXNfcHJpdik7CitlcnJfYnVzX2luaXQ6CiAJZnJlZV9wZXJjcHUobWx4c3dfY29yZS0+cGNwdV9zdGF0cyk7CiBlcnJfYWxsb2Nfc3RhdHM6CiAJZGV2bGlua19mcmVlKGRldmxpbmspOwpAQCAtMTYxNSw3ICsxNjE1LDcgQEAKIHN0YXRpYyBpbnQgbWx4c3dfY29yZV9sYWdfbWFwcGluZ19pbmRleChzdHJ1Y3QgbWx4c3dfY29yZSAqbWx4c3dfY29yZSwKIAkJCQkJdTE2IGxhZ19pZCwgdTggcG9ydF9pbmRleCkKIHsKLQlyZXR1cm4gbWx4c3dfY29yZS0+ZHJpdmVyLT5wcm9maWxlLT5tYXhfcG9ydF9wZXJfbGFnICogbGFnX2lkICsKKwlyZXR1cm4gbWx4c3dfY29yZS0+cmVzb3VyY2VzLm1heF9wb3J0c19pbl9sYWcgKiBsYWdfaWQgKwogCSAgICAgICBwb3J0X2luZGV4OwogfQogCkBAIC0xNjQ0LDcgKzE2NDQsNyBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IG1seHN3X2NvcmUtPmRyaXZlci0+cHJvZmlsZS0+bWF4X3BvcnRfcGVyX2xhZzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IG1seHN3X2NvcmUtPnJlc291cmNlcy5tYXhfcG9ydHNfaW5fbGFnOyBpKyspIHsKIAkJaW50IGluZGV4ID0gbWx4c3dfY29yZV9sYWdfbWFwcGluZ19pbmRleChtbHhzd19jb3JlLAogCQkJCQkJCSBsYWdfaWQsIGkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9jb3JlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9jb3JlLmgKaW5kZXggZDM0NzZlYS4uYzRmNTUwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvY29yZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L2NvcmUuaApAQCAtODcsNiArODcsNyBAQAogCXZvaWQgKCpmdW5jKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBsb2NhbF9wb3J0LCB2b2lkICpwcml2KTsKIAl1OCBsb2NhbF9wb3J0OwogCXUxNiB0cmFwX2lkOworCWVudW0gbWx4c3dfcmVnX2hwa3RfYWN0aW9uIGFjdGlvbjsKIH07CiAKIHN0cnVjdCBtbHhzd19ldmVudF9saXN0ZW5lciB7CkBAIC0xNzgsOCArMTc5LDYgQEAKIAogc3RydWN0IG1seHN3X2NvbmZpZ19wcm9maWxlIHsKIAl1MTYJdXNlZF9tYXhfdmVwYV9jaGFubmVsczoxLAotCQl1c2VkX21heF9sYWc6MSwKLQkJdXNlZF9tYXhfcG9ydF9wZXJfbGFnOjEsCiAJCXVzZWRfbWF4X21pZDoxLAogCQl1c2VkX21heF9wZ3Q6MSwKIAkJdXNlZF9tYXhfc3lzdGVtX3BvcnQ6MSwKQEAgLTE5MSwxMCArMTkwLDkgQEAKIAkJdXNlZF9tYXhfcGtleToxLAogCQl1c2VkX2FyX3NlYzoxLAogCQl1c2VkX2FkYXB0aXZlX3JvdXRpbmdfZ3JvdXBfY2FwOjEsCi0JCXVzZWRfa3ZkX3NpemVzOjE7CisJCXVzZWRfa3ZkX3NwbGl0X2RhdGE6MTsgLyogaW5kaWNhdGUgZm9yIHRoZSBrdmQncyB2YWx1ZXMgKi8KKwogCXU4CW1heF92ZXBhX2NoYW5uZWxzOwotCXUxNgltYXhfbGFnOwotCXUxNgltYXhfcG9ydF9wZXJfbGFnOwogCXUxNgltYXhfbWlkOwogCXUxNgltYXhfcGd0OwogCXUxNgltYXhfc3lzdGVtX3BvcnQ7CkBAIC0yMTMsOCArMjExLDkgQEAKIAl1MTYJYWRhcHRpdmVfcm91dGluZ19ncm91cF9jYXA7CiAJdTgJYXJuOwogCXUzMglrdmRfbGluZWFyX3NpemU7Ci0JdTMyCWt2ZF9oYXNoX3NpbmdsZV9zaXplOwotCXUzMglrdmRfaGFzaF9kb3VibGVfc2l6ZTsKKwl1MTYJa3ZkX2hhc2hfZ3JhbnVsYXJpdHk7CisJdTgJa3ZkX2hhc2hfc2luZ2xlX3BhcnRzOworCXU4CWt2ZF9oYXNoX2RvdWJsZV9wYXJ0czsKIAl1OAlyZXNvdXJjZV9xdWVyeV9lbmFibGU7CiAJc3RydWN0IG1seHN3X3N3aWRfY29uZmlnIHN3aWRfY29uZmlnW01MWFNXX0NPTkZJR19QUk9GSUxFX1NXSURfQ09VTlRdOwogfTsKQEAgLTI2OCw4ICsyNjcsMzUgQEAKIH07CiAKIHN0cnVjdCBtbHhzd19yZXNvdXJjZXMgewotCXU4CW1heF9zcGFuX3ZhbGlkOjE7CisJdTMyCW1heF9zcGFuX3ZhbGlkOjEsCisJCW1heF9sYWdfdmFsaWQ6MSwKKwkJbWF4X3BvcnRzX2luX2xhZ192YWxpZDoxLAorCQlrdmRfc2l6ZV92YWxpZDoxLAorCQlrdmRfc2luZ2xlX21pbl9zaXplX3ZhbGlkOjEsCisJCWt2ZF9kb3VibGVfbWluX3NpemVfdmFsaWQ6MSwKKwkJbWF4X3ZpcnR1YWxfcm91dGVyc192YWxpZDoxLAorCQltYXhfc3lzdGVtX3BvcnRzX3ZhbGlkOjEsCisJCW1heF92bGFuX2dyb3Vwc192YWxpZDoxLAorCQltYXhfcmVnaW9uc192YWxpZDoxLAorCQltYXhfcmlmX3ZhbGlkOjE7CiAJdTggICAgICBtYXhfc3BhbjsKKwl1OAltYXhfbGFnOworCXU4CW1heF9wb3J0c19pbl9sYWc7CisJdTMyCWt2ZF9zaXplOworCXUzMglrdmRfc2luZ2xlX21pbl9zaXplOworCXUzMglrdmRfZG91YmxlX21pbl9zaXplOworCXUxNiAgICAgbWF4X3ZpcnR1YWxfcm91dGVyczsKKwl1MTYJbWF4X3N5c3RlbV9wb3J0czsKKwl1MTYJbWF4X3ZsYW5fZ3JvdXBzOworCXUxNgltYXhfcmVnaW9uczsKKwl1MTYJbWF4X3JpZjsKKworCS8qIEludGVybmFsIHJlc291cmNlcy4KKwkgKiBEZXRlcm1pbmVkIGJ5IHRoZSBTVywgbm90IHF1ZXJpZWQgZnJvbSB0aGUgSFcuCisJICovCisJdTMyCWt2ZF9zaW5nbGVfc2l6ZTsKKwl1MzIJa3ZkX2RvdWJsZV9zaXplOworCXUzMglrdmRfbGluZWFyX3NpemU7CiB9OwogCiBzdHJ1Y3QgbWx4c3dfcmVzb3VyY2VzICptbHhzd19jb3JlX3Jlc291cmNlc19nZXQoc3RydWN0IG1seHN3X2NvcmUgKm1seHN3X2NvcmUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvcGNpLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9wY2kuYwppbmRleCAxZDEzNjBjLi5lNzQyYmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9wY2kuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9wY2kuYwpAQCAtMTE1Niw2ICsxMTU2LDE2IEBACiAKICNkZWZpbmUgTUxYU1dfUkVTT1VSQ0VTX1RBQkxFX0VORF9JRCAweGZmZmYKICNkZWZpbmUgTUxYU1dfTUFYX1NQQU5fSUQgMHgyNDIwCisjZGVmaW5lIE1MWFNXX01BWF9MQUdfSUQgMHgyNTIwCisjZGVmaW5lIE1MWFNXX01BWF9QT1JUU19JTl9MQUdfSUQgMHgyNTIxCisjZGVmaW5lIE1MWFNXX0tWRF9TSVpFX0lEIDB4MTAwMQorI2RlZmluZSBNTFhTV19LVkRfU0lOR0xFX01JTl9TSVpFX0lEIDB4MTAwMgorI2RlZmluZSBNTFhTV19LVkRfRE9VQkxFX01JTl9TSVpFX0lEIDB4MTAwMworI2RlZmluZSBNTFhTV19NQVhfVklSVFVBTF9ST1VURVJTX0lEIDB4MkMwMQorI2RlZmluZSBNTFhTV19NQVhfU1lTVEVNX1BPUlRfSUQgMHgyNTAyCisjZGVmaW5lIE1MWFNXX01BWF9WTEFOX0dST1VQU19JRCAweDI5MDYKKyNkZWZpbmUgTUxYU1dfTUFYX1JFR0lPTlNfSUQgMHgyOTAxCisjZGVmaW5lIE1MWFNXX01BWF9SSUZfSUQgMHgyQzAyCiAjZGVmaW5lIE1MWFNXX1JFU09VUkNFU19RVUVSWV9NQVhfUVVFUklFUyAxMDAKICNkZWZpbmUgTUxYU1dfUkVTT1VSQ0VTX1BFUl9RVUVSWSAzMgogCkBAIC0xMTY3LDYgKzExNzcsNDYgQEAKIAkJcmVzb3VyY2VzLT5tYXhfc3BhbiA9IHZhbDsKIAkJcmVzb3VyY2VzLT5tYXhfc3Bhbl92YWxpZCA9IDE7CiAJCWJyZWFrOworCWNhc2UgTUxYU1dfTUFYX0xBR19JRDoKKwkJcmVzb3VyY2VzLT5tYXhfbGFnID0gdmFsOworCQlyZXNvdXJjZXMtPm1heF9sYWdfdmFsaWQgPSAxOworCQlicmVhazsKKwljYXNlIE1MWFNXX01BWF9QT1JUU19JTl9MQUdfSUQ6CisJCXJlc291cmNlcy0+bWF4X3BvcnRzX2luX2xhZyA9IHZhbDsKKwkJcmVzb3VyY2VzLT5tYXhfcG9ydHNfaW5fbGFnX3ZhbGlkID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNTFhTV19LVkRfU0laRV9JRDoKKwkJcmVzb3VyY2VzLT5rdmRfc2l6ZSA9IHZhbDsKKwkJcmVzb3VyY2VzLT5rdmRfc2l6ZV92YWxpZCA9IDE7CisJCWJyZWFrOworCWNhc2UgTUxYU1dfS1ZEX1NJTkdMRV9NSU5fU0laRV9JRDoKKwkJcmVzb3VyY2VzLT5rdmRfc2luZ2xlX21pbl9zaXplID0gdmFsOworCQlyZXNvdXJjZXMtPmt2ZF9zaW5nbGVfbWluX3NpemVfdmFsaWQgPSAxOworCQlicmVhazsKKwljYXNlIE1MWFNXX0tWRF9ET1VCTEVfTUlOX1NJWkVfSUQ6CisJCXJlc291cmNlcy0+a3ZkX2RvdWJsZV9taW5fc2l6ZSA9IHZhbDsKKwkJcmVzb3VyY2VzLT5rdmRfZG91YmxlX21pbl9zaXplX3ZhbGlkID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNTFhTV19NQVhfVklSVFVBTF9ST1VURVJTX0lEOgorCQlyZXNvdXJjZXMtPm1heF92aXJ0dWFsX3JvdXRlcnMgPSB2YWw7CisJCXJlc291cmNlcy0+bWF4X3ZpcnR1YWxfcm91dGVyc192YWxpZCA9IDE7CisJCWJyZWFrOworCWNhc2UgTUxYU1dfTUFYX1NZU1RFTV9QT1JUX0lEOgorCQlyZXNvdXJjZXMtPm1heF9zeXN0ZW1fcG9ydHMgPSB2YWw7CisJCXJlc291cmNlcy0+bWF4X3N5c3RlbV9wb3J0c192YWxpZCA9IDE7CisJCWJyZWFrOworCWNhc2UgTUxYU1dfTUFYX1ZMQU5fR1JPVVBTX0lEOgorCQlyZXNvdXJjZXMtPm1heF92bGFuX2dyb3VwcyA9IHZhbDsKKwkJcmVzb3VyY2VzLT5tYXhfdmxhbl9ncm91cHNfdmFsaWQgPSAxOworCQlicmVhazsKKwljYXNlIE1MWFNXX01BWF9SRUdJT05TX0lEOgorCQlyZXNvdXJjZXMtPm1heF9yZWdpb25zID0gdmFsOworCQlyZXNvdXJjZXMtPm1heF9yZWdpb25zX3ZhbGlkID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNTFhTV19NQVhfUklGX0lEOgorCQlyZXNvdXJjZXMtPm1heF9yaWYgPSB2YWw7CisJCXJlc291cmNlcy0+bWF4X3JpZl92YWxpZCA9IDE7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTEyMDksMTAgKzEyNTksNTIgQEAKIAlyZXR1cm4gLUVJTzsKIH0KIAorc3RhdGljIGludCBtbHhzd19wY2lfcHJvZmlsZV9nZXRfa3ZkX3NpemVzKGNvbnN0IHN0cnVjdCBtbHhzd19jb25maWdfcHJvZmlsZSAqcHJvZmlsZSwKKwkJCQkJICAgc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzKQoreworCXUzMiBzaW5nbGVzX3NpemUsIGRvdWJsZXNfc2l6ZSwgbGluZWFyX3NpemU7CisKKwlpZiAoIXJlc291cmNlcy0+a3ZkX3NpbmdsZV9taW5fc2l6ZV92YWxpZCB8fAorCSAgICAhcmVzb3VyY2VzLT5rdmRfZG91YmxlX21pbl9zaXplX3ZhbGlkIHx8CisJICAgICFwcm9maWxlLT51c2VkX2t2ZF9zcGxpdF9kYXRhKQorCQlyZXR1cm4gLUVJTzsKKworCWxpbmVhcl9zaXplID0gcHJvZmlsZS0+a3ZkX2xpbmVhcl9zaXplOworCisJLyogVGhlIGhhc2ggcGFydCBpcyB3aGF0IGxlZnQgb2YgdGhlIGt2ZCB3aXRob3V0IHRoZQorCSAqIGxpbmVhciBwYXJ0LiBJdCBpcyBzcGxpdCB0byB0aGUgc2luZ2xlIHNpemUgYW5kCisJICogZG91YmxlIHNpemUgYnkgdGhlIHBhcnRzIHJhdGlvIGZyb20gdGhlIHByb2ZpbGUuCisJICogQm90aCBzaXplcyBtdXN0IGJlIGEgbXVsdGlwbGljYXRpb25zIG9mIHRoZQorCSAqIGdyYW51bGFyaXR5IGZyb20gdGhlIHByb2ZpbGUuCisJICovCisJZG91Ymxlc19zaXplID0gKHJlc291cmNlcy0+a3ZkX3NpemUgLSBsaW5lYXJfc2l6ZSk7CisJZG91Ymxlc19zaXplICo9IHByb2ZpbGUtPmt2ZF9oYXNoX2RvdWJsZV9wYXJ0czsKKwlkb3VibGVzX3NpemUgLz0gKHByb2ZpbGUtPmt2ZF9oYXNoX2RvdWJsZV9wYXJ0cyArCisJCQkgcHJvZmlsZS0+a3ZkX2hhc2hfc2luZ2xlX3BhcnRzKTsKKwlkb3VibGVzX3NpemUgLz0gcHJvZmlsZS0+a3ZkX2hhc2hfZ3JhbnVsYXJpdHk7CisJZG91Ymxlc19zaXplICo9IHByb2ZpbGUtPmt2ZF9oYXNoX2dyYW51bGFyaXR5OworCXNpbmdsZXNfc2l6ZSA9IHJlc291cmNlcy0+a3ZkX3NpemUgLSBkb3VibGVzX3NpemUgLQorCQkgICAgICAgbGluZWFyX3NpemU7CisKKwkvKiBDaGVjayByZXN1bHRzIGFyZSBsZWdhbC4gKi8KKwlpZiAoc2luZ2xlc19zaXplIDwgcmVzb3VyY2VzLT5rdmRfc2luZ2xlX21pbl9zaXplIHx8CisJICAgIGRvdWJsZXNfc2l6ZSA8IHJlc291cmNlcy0+a3ZkX2RvdWJsZV9taW5fc2l6ZSB8fAorCSAgICByZXNvdXJjZXMtPmt2ZF9zaXplIDwgbGluZWFyX3NpemUpCisJCXJldHVybiAtRUlPOworCisJcmVzb3VyY2VzLT5rdmRfc2luZ2xlX3NpemUgPSBzaW5nbGVzX3NpemU7CisJcmVzb3VyY2VzLT5rdmRfZG91YmxlX3NpemUgPSBkb3VibGVzX3NpemU7CisJcmVzb3VyY2VzLT5rdmRfbGluZWFyX3NpemUgPSBsaW5lYXJfc2l6ZTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG1seHN3X3BjaV9jb25maWdfcHJvZmlsZShzdHJ1Y3QgbWx4c3dfcGNpICptbHhzd19wY2ksIGNoYXIgKm1ib3gsCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBtbHhzd19jb25maWdfcHJvZmlsZSAqcHJvZmlsZSkKKwkJCQkgICAgY29uc3Qgc3RydWN0IG1seHN3X2NvbmZpZ19wcm9maWxlICpwcm9maWxlLAorCQkJCSAgICBzdHJ1Y3QgbWx4c3dfcmVzb3VyY2VzICpyZXNvdXJjZXMpCiB7CiAJaW50IGk7CisJaW50IGVycjsKIAogCW1seHN3X2NtZF9tYm94X3plcm8obWJveCk7CiAKQEAgLTEyMjIsMTggKzEzMTQsNiBAQAogCQltbHhzd19jbWRfbWJveF9jb25maWdfcHJvZmlsZV9tYXhfdmVwYV9jaGFubmVsc19zZXQoCiAJCQltYm94LCBwcm9maWxlLT5tYXhfdmVwYV9jaGFubmVscyk7CiAJfQotCWlmIChwcm9maWxlLT51c2VkX21heF9sYWcpIHsKLQkJbWx4c3dfY21kX21ib3hfY29uZmlnX3Byb2ZpbGVfc2V0X21heF9sYWdfc2V0KAotCQkJbWJveCwgMSk7Ci0JCW1seHN3X2NtZF9tYm94X2NvbmZpZ19wcm9maWxlX21heF9sYWdfc2V0KAotCQkJbWJveCwgcHJvZmlsZS0+bWF4X2xhZyk7Ci0JfQotCWlmIChwcm9maWxlLT51c2VkX21heF9wb3J0X3Blcl9sYWcpIHsKLQkJbWx4c3dfY21kX21ib3hfY29uZmlnX3Byb2ZpbGVfc2V0X21heF9wb3J0X3Blcl9sYWdfc2V0KAotCQkJbWJveCwgMSk7Ci0JCW1seHN3X2NtZF9tYm94X2NvbmZpZ19wcm9maWxlX21heF9wb3J0X3Blcl9sYWdfc2V0KAotCQkJbWJveCwgcHJvZmlsZS0+bWF4X3BvcnRfcGVyX2xhZyk7Ci0JfQogCWlmIChwcm9maWxlLT51c2VkX21heF9taWQpIHsKIAkJbWx4c3dfY21kX21ib3hfY29uZmlnX3Byb2ZpbGVfc2V0X21heF9taWRfc2V0KAogCQkJbWJveCwgMSk7CkBAIC0xMzEwLDE5ICsxMzkwLDIyIEBACiAJCW1seHN3X2NtZF9tYm94X2NvbmZpZ19wcm9maWxlX2FkYXB0aXZlX3JvdXRpbmdfZ3JvdXBfY2FwX3NldCgKIAkJCW1ib3gsIHByb2ZpbGUtPmFkYXB0aXZlX3JvdXRpbmdfZ3JvdXBfY2FwKTsKIAl9Ci0JaWYgKHByb2ZpbGUtPnVzZWRfa3ZkX3NpemVzKSB7Ci0JCW1seHN3X2NtZF9tYm94X2NvbmZpZ19wcm9maWxlX3NldF9rdmRfbGluZWFyX3NpemVfc2V0KAotCQkJbWJveCwgMSk7Ci0JCW1seHN3X2NtZF9tYm94X2NvbmZpZ19wcm9maWxlX2t2ZF9saW5lYXJfc2l6ZV9zZXQoCi0JCQltYm94LCBwcm9maWxlLT5rdmRfbGluZWFyX3NpemUpOwotCQltbHhzd19jbWRfbWJveF9jb25maWdfcHJvZmlsZV9zZXRfa3ZkX2hhc2hfc2luZ2xlX3NpemVfc2V0KAotCQkJbWJveCwgMSk7Ci0JCW1seHN3X2NtZF9tYm94X2NvbmZpZ19wcm9maWxlX2t2ZF9oYXNoX3NpbmdsZV9zaXplX3NldCgKLQkJCW1ib3gsIHByb2ZpbGUtPmt2ZF9oYXNoX3NpbmdsZV9zaXplKTsKKwlpZiAocmVzb3VyY2VzLT5rdmRfc2l6ZV92YWxpZCkgeworCQllcnIgPSBtbHhzd19wY2lfcHJvZmlsZV9nZXRfa3ZkX3NpemVzKHByb2ZpbGUsIHJlc291cmNlcyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCW1seHN3X2NtZF9tYm94X2NvbmZpZ19wcm9maWxlX3NldF9rdmRfbGluZWFyX3NpemVfc2V0KG1ib3gsIDEpOworCQltbHhzd19jbWRfbWJveF9jb25maWdfcHJvZmlsZV9rdmRfbGluZWFyX3NpemVfc2V0KG1ib3gsCisJCQkJCQlyZXNvdXJjZXMtPmt2ZF9saW5lYXJfc2l6ZSk7CisJCW1seHN3X2NtZF9tYm94X2NvbmZpZ19wcm9maWxlX3NldF9rdmRfaGFzaF9zaW5nbGVfc2l6ZV9zZXQobWJveCwKKwkJCQkJCQkJCSAgIDEpOworCQltbHhzd19jbWRfbWJveF9jb25maWdfcHJvZmlsZV9rdmRfaGFzaF9zaW5nbGVfc2l6ZV9zZXQobWJveCwKKwkJCQkJCXJlc291cmNlcy0+a3ZkX3NpbmdsZV9zaXplKTsKIAkJbWx4c3dfY21kX21ib3hfY29uZmlnX3Byb2ZpbGVfc2V0X2t2ZF9oYXNoX2RvdWJsZV9zaXplX3NldCgKLQkJCW1ib3gsIDEpOwotCQltbHhzd19jbWRfbWJveF9jb25maWdfcHJvZmlsZV9rdmRfaGFzaF9kb3VibGVfc2l6ZV9zZXQoCi0JCQltYm94LCBwcm9maWxlLT5rdmRfaGFzaF9kb3VibGVfc2l6ZSk7CisJCQkJCQkJCW1ib3gsIDEpOworCQltbHhzd19jbWRfbWJveF9jb25maWdfcHJvZmlsZV9rdmRfaGFzaF9kb3VibGVfc2l6ZV9zZXQobWJveCwKKwkJCQkJCXJlc291cmNlcy0+a3ZkX2RvdWJsZV9zaXplKTsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUxYU1dfQ09ORklHX1BST0ZJTEVfU1dJRF9DT1VOVDsgaSsrKQpAQCAtMTUyNCw3ICsxNjA3LDcgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9xdWVyeV9yZXNvdXJjZXM7CiAKLQllcnIgPSBtbHhzd19wY2lfY29uZmlnX3Byb2ZpbGUobWx4c3dfcGNpLCBtYm94LCBwcm9maWxlKTsKKwllcnIgPSBtbHhzd19wY2lfY29uZmlnX3Byb2ZpbGUobWx4c3dfcGNpLCBtYm94LCBwcm9maWxlLCByZXNvdXJjZXMpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2NvbmZpZ19wcm9maWxlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9wb3J0LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9wb3J0LmgKaW5kZXggZjMzYjk5Ny4uYWYzNzFhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvcG9ydC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3BvcnQuaApAQCAtNTYsNiArNTYsNyBAQAogI2RlZmluZSBNTFhTV19QT1JUX1BIWV9CSVRTX01BU0sJKE1MWFNXX1BPUlRfTUFYX1BIWV9QT1JUUyAtIDEpCiAKICNkZWZpbmUgTUxYU1dfUE9SVF9DUFVfUE9SVAkJMHgwCisjZGVmaW5lIE1MWFNXX1BPUlRfUk9VVEVSX1BPUlQJCShNTFhTV19QT1JUX01BWF9QSFlfUE9SVFMgKyAyKQogCiAjZGVmaW5lIE1MWFNXX1BPUlRfRE9OVF9DQVJFCQkoTUxYU1dfUE9SVF9NQVhfUE9SVFMpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3JlZy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvcmVnLmgKaW5kZXggN2NhOTIwMS4uNjQ2MGM3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvcmVnLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvcmVnLmgKQEAgLTU5MSw2ICs1OTEsMTIgQEAKICAqLwogTUxYU1dfSVRFTTMyKHJlZywgc2ZuLCBzd2lkLCAweDAwLCAyNCwgOCk7CiAKKy8qIHJlZ19zZm5fZW5kCisgKiBGb3JjZXMgdGhlIGN1cnJlbnQgc2Vzc2lvbiB0byBlbmQuCisgKiBBY2Nlc3M6IE9QCisgKi8KK01MWFNXX0lURU0zMihyZWcsIHNmbiwgZW5kLCAweDA0LCAyMCwgMSk7CisKIC8qIHJlZ19zZm5fbnVtX3JlYwogICogUmVxdWVzdDogTnVtYmVyIG9mIGxlYXJuZWQgbm90aWZpY2F0aW9ucyBhbmQgYWdlZC1vdXQgbm90aWZpY2F0aW9uCiAgKiByZWNvcmRzIHJlcXVlc3RlZC4KQEAgLTYwNSw2ICs2MTEsNyBAQAogewogCU1MWFNXX1JFR19aRVJPKHNmbiwgcGF5bG9hZCk7CiAJbWx4c3dfcmVnX3Nmbl9zd2lkX3NldChwYXlsb2FkLCAwKTsKKwltbHhzd19yZWdfc2ZuX2VuZF9zZXQocGF5bG9hZCwgMSk7CiAJbWx4c3dfcmVnX3Nmbl9udW1fcmVjX3NldChwYXlsb2FkLCBNTFhTV19SRUdfU0ZOX1JFQ19NQVhfQ09VTlQpOwogfQogCkBAIC0xMzg1LDcgKzEzOTIsNyBAQAogewogCU1MWFNXX1JFR19aRVJPKHNsY3IsIHBheWxvYWQpOwogCW1seHN3X3JlZ19zbGNyX3BwX3NldChwYXlsb2FkLCBNTFhTV19SRUdfU0xDUl9QUF9HTE9CQUwpOwotCW1seHN3X3JlZ19zbGNyX3R5cGVfc2V0KHBheWxvYWQsIE1MWFNXX1JFR19TTENSX1RZUEVfWE9SKTsKKwltbHhzd19yZWdfc2xjcl90eXBlX3NldChwYXlsb2FkLCBNTFhTV19SRUdfU0xDUl9UWVBFX0NSQyk7CiAJbWx4c3dfcmVnX3NsY3JfbGFnX2hhc2hfc2V0KHBheWxvYWQsIGxhZ19oYXNoKTsKIH0KIApAQCAtMjEzMSw2ICsyMTM4LDE4IEBACiAgKi8KIE1MWFNXX0lURU0zMihyZWcsIHB0eXMsIHByb3RvX21hc2ssIDB4MDAsIDAsIDMpOwogCitlbnVtIHsKKwlNTFhTV19SRUdfUFRZU19BTl9TVEFUVVNfTkEsCisJTUxYU1dfUkVHX1BUWVNfQU5fU1RBVFVTX09LLAorCU1MWFNXX1JFR19QVFlTX0FOX1NUQVRVU19GQUlMLAorfTsKKworLyogcmVnX3B0eXNfYW5fc3RhdHVzCisgKiBBdXRvbmVnb3RpYXRpb24gc3RhdHVzLgorICogQWNjZXNzOiBSTworICovCitNTFhTV19JVEVNMzIocmVnLCBwdHlzLCBhbl9zdGF0dXMsIDB4MDQsIDI4LCA0KTsKKwogI2RlZmluZSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfU0dNSUkJCQlCSVQoMCkKICNkZWZpbmUgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMDBCQVNFX0tYCQlCSVQoMSkKICNkZWZpbmUgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwR0JBU0VfQ1g0CQlCSVQoMikKQEAgLTIxNDUsNiArMjE2NCw3IEBACiAjZGVmaW5lIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMEdCQVNFX0VSX0xSCQlCSVQoMTQpCiAjZGVmaW5lIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF80MEdCQVNFX1NSNAkJQklUKDE1KQogI2RlZmluZSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNDBHQkFTRV9MUjRfRVI0CUJJVCgxNikKKyNkZWZpbmUgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzUwR0JBU0VfU1IyCQlCSVQoMTgpCiAjZGVmaW5lIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF81MEdCQVNFX0tSNAkJQklUKDE5KQogI2RlZmluZSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTAwR0JBU0VfQ1I0CQlCSVQoMjApCiAjZGVmaW5lIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMDBHQkFTRV9TUjQJCUJJVCgyMSkKQEAgLTIxNzcsNiArMjE5NywxMyBAQAogICovCiBNTFhTV19JVEVNMzIocmVnLCBwdHlzLCBldGhfcHJvdG9fb3BlciwgMHgyNCwgMCwgMzIpOwogCisvKiByZWdfcHR5c19ldGhfcHJvdG9fbHBfYWR2ZXJ0aXNlCisgKiBUaGUgcHJvdG9jb2xzIHRoYXQgd2VyZSBhZHZlcnRpc2VkIGJ5IHRoZSBsaW5rIHBhcnRuZXIgZHVyaW5nCisgKiBhdXRvbmVnb3RpYXRpb24uCisgKiBBY2Nlc3M6IFJPCisgKi8KK01MWFNXX0lURU0zMihyZWcsIHB0eXMsIGV0aF9wcm90b19scF9hZHZlcnRpc2UsIDB4MzAsIDAsIDMyKTsKKwogc3RhdGljIGlubGluZSB2b2lkIG1seHN3X3JlZ19wdHlzX3BhY2soY2hhciAqcGF5bG9hZCwgdTggbG9jYWxfcG9ydCwKIAkJCQkgICAgICAgdTMyIHByb3RvX2FkbWluKQogewpAQCAtMzM4Myw2ICszNDEwLDE1IEBACiAgKi8KIE1MWFNXX0lURU0zMihyZWcsIHJpdHIsIGlwdjZfZmUsIDB4MDQsIDI4LCAxKTsKIAorLyogcmVnX3JpdHJfbGJfZW4KKyAqIExvb3AtYmFjayBmaWx0ZXIgZW5hYmxlIGZvciB1bmljYXN0IHBhY2tldHMuCisgKiBJZiB0aGUgZmxhZyBpcyBzZXQgdGhlbiBsb29wLWJhY2sgZmlsdGVyIGZvciB1bmljYXN0IHBhY2tldHMgaXMKKyAqIGltcGxlbWVudGVkIG9uIHRoZSBSSUYuIE11bHRpY2FzdCBwYWNrZXRzIGFyZSBhbHdheXMgc3ViamVjdCB0bworICogbG9vcC1iYWNrIGZpbHRlcmluZy4KKyAqIEFjY2VzczogUlcKKyAqLworTUxYU1dfSVRFTTMyKHJlZywgcml0ciwgbGJfZW4sIDB4MDQsIDI0LCAxKTsKKwogLyogcmVnX3JpdHJfdmlydHVhbF9yb3V0ZXIKICAqIFZpcnR1YWwgcm91dGVyIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcm91dGVyIGludGVyZmFjZS4KICAqIEFjY2VzczogUlcKQEAgLTM0ODQsNiArMzUyMCw3IEBACiAJbWx4c3dfcmVnX3JpdHJfb3Bfc2V0KHBheWxvYWQsIG9wKTsKIAltbHhzd19yZWdfcml0cl9yaWZfc2V0KHBheWxvYWQsIHJpZik7CiAJbWx4c3dfcmVnX3JpdHJfaXB2NF9mZV9zZXQocGF5bG9hZCwgMSk7CisJbWx4c3dfcmVnX3JpdHJfbGJfZW5fc2V0KHBheWxvYWQsIDEpOwogCW1seHN3X3JlZ19yaXRyX210dV9zZXQocGF5bG9hZCwgbXR1KTsKIAltbHhzd19yZWdfcml0cl9pZl9tYWNfbWVtY3B5X3RvKHBheWxvYWQsIG1hYyk7CiB9CkBAIC00MDAwLDYgKzQwMzcsNyBAQAogewogCU1MWFNXX1JFR19aRVJPKHJhbHVlLCBwYXlsb2FkKTsKIAltbHhzd19yZWdfcmFsdWVfcHJvdG9jb2xfc2V0KHBheWxvYWQsIHByb3RvY29sKTsKKwltbHhzd19yZWdfcmFsdWVfb3Bfc2V0KHBheWxvYWQsIG9wKTsKIAltbHhzd19yZWdfcmFsdWVfdmlydHVhbF9yb3V0ZXJfc2V0KHBheWxvYWQsIHZpcnR1YWxfcm91dGVyKTsKIAltbHhzd19yZWdfcmFsdWVfcHJlZml4X2xlbl9zZXQocGF5bG9hZCwgcHJlZml4X2xlbik7CiAJbWx4c3dfcmVnX3JhbHVlX2VudHJ5X3R5cGVfc2V0KHBheWxvYWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW0uYwppbmRleCBjM2U2MTUwLi4xZWMwYTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtLmMKQEAgLTU2LDYgKzU2LDcgQEAKICNpbmNsdWRlIDxnZW5lcmF0ZWQvdXRzcmVsZWFzZS5oPgogI2luY2x1ZGUgPG5ldC9wa3RfY2xzLmg+CiAjaW5jbHVkZSA8bmV0L3RjX2FjdC90Y19taXJyZWQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZXZlbnQuaD4KIAogI2luY2x1ZGUgInNwZWN0cnVtLmgiCiAjaW5jbHVkZSAiY29yZS5oIgpAQCAtMjQ3LDcgKzI0OCw4IEBACiAJc3Bhbl9lbnRyeS0+dXNlZCA9IGZhbHNlOwogfQogCi1zdHJ1Y3QgbWx4c3dfc3Bfc3Bhbl9lbnRyeSAqbWx4c3dfc3Bfc3Bhbl9lbnRyeV9maW5kKHN0cnVjdCBtbHhzd19zcF9wb3J0ICpwb3J0KQorc3RhdGljIHN0cnVjdCBtbHhzd19zcF9zcGFuX2VudHJ5ICoKK21seHN3X3NwX3NwYW5fZW50cnlfZmluZChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gcG9ydC0+bWx4c3dfc3A7CiAJaW50IGk7CkBAIC0yNjEsNyArMjYzLDggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RydWN0IG1seHN3X3NwX3NwYW5fZW50cnkgKm1seHN3X3NwX3NwYW5fZW50cnlfZ2V0KHN0cnVjdCBtbHhzd19zcF9wb3J0ICpwb3J0KQorc3RhdGljIHN0cnVjdCBtbHhzd19zcF9zcGFuX2VudHJ5CisqbWx4c3dfc3Bfc3Bhbl9lbnRyeV9nZXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IG1seHN3X3NwX3NwYW5fZW50cnkgKnNwYW5fZW50cnk7CiAKQEAgLTM2Myw3ICszNjYsOCBAQAogCX0KIAogCS8qIGJpbmQgdGhlIHBvcnQgdG8gdGhlIFNQQU4gZW50cnkgKi8KLQltbHhzd19yZWdfbXBhcl9wYWNrKG1wYXJfcGwsIHBvcnQtPmxvY2FsX3BvcnQsIHR5cGUsIHRydWUsIHBhX2lkKTsKKwltbHhzd19yZWdfbXBhcl9wYWNrKG1wYXJfcGwsIHBvcnQtPmxvY2FsX3BvcnQsCisJCQkgICAgKGVudW0gbWx4c3dfcmVnX21wYXJfaV9lKSB0eXBlLCB0cnVlLCBwYV9pZCk7CiAJZXJyID0gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcobXBhciksIG1wYXJfcGwpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX21wYXJfcmVnX3dyaXRlOwpAQCAtNDA0LDcgKzQwOCw4IEBACiAJCXJldHVybjsKIAogCS8qIHJlbW92ZSB0aGUgaW5zcGVjdGVkIHBvcnQgKi8KLQltbHhzd19yZWdfbXBhcl9wYWNrKG1wYXJfcGwsIHBvcnQtPmxvY2FsX3BvcnQsIHR5cGUsIGZhbHNlLCBwYV9pZCk7CisJbWx4c3dfcmVnX21wYXJfcGFjayhtcGFyX3BsLCBwb3J0LT5sb2NhbF9wb3J0LAorCQkJICAgIChlbnVtIG1seHN3X3JlZ19tcGFyX2lfZSkgdHlwZSwgZmFsc2UsIHBhX2lkKTsKIAltbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhtcGFyKSwgbXBhcl9wbCk7CiAKIAkvKiByZW1vdmUgdGhlIFNCSUIgYnVmZmVyIGlmIGl0IHdhcyBlZ3Jlc3MgU1BBTiAqLwpAQCAtNTU1LDggKzU2MCw5IEBACiAJcmV0dXJuIG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHN2ZmEpLCBzdmZhX3BsKTsKIH0KIAotc3RhdGljIGludCBtbHhzd19zcF9wb3J0X3ZpZF9sZWFybmluZ19zZXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCi0JCQkJCSAgdTE2IHZpZCwgYm9vbCBsZWFybl9lbmFibGUpCitpbnQgX19tbHhzd19zcF9wb3J0X3ZpZF9sZWFybmluZ19zZXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCisJCQkJICAgICB1MTYgdmlkX2JlZ2luLCB1MTYgdmlkX2VuZCwKKwkJCQkgICAgIGJvb2wgbGVhcm5fZW5hYmxlKQogewogCXN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AgPSBtbHhzd19zcF9wb3J0LT5tbHhzd19zcDsKIAljaGFyICpzcHZtbHJfcGw7CkBAIC01NjUsMTMgKzU3MSwyMCBAQAogCXNwdm1scl9wbCA9IGttYWxsb2MoTUxYU1dfUkVHX1NQVk1MUl9MRU4sIEdGUF9LRVJORUwpOwogCWlmICghc3B2bWxyX3BsKQogCQlyZXR1cm4gLUVOT01FTTsKLQltbHhzd19yZWdfc3B2bWxyX3BhY2soc3B2bWxyX3BsLCBtbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0LCB2aWQsIHZpZCwKLQkJCSAgICAgIGxlYXJuX2VuYWJsZSk7CisJbWx4c3dfcmVnX3Nwdm1scl9wYWNrKHNwdm1scl9wbCwgbWx4c3dfc3BfcG9ydC0+bG9jYWxfcG9ydCwgdmlkX2JlZ2luLAorCQkJICAgICAgdmlkX2VuZCwgbGVhcm5fZW5hYmxlKTsKIAllcnIgPSBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhzcHZtbHIpLCBzcHZtbHJfcGwpOwogCWtmcmVlKHNwdm1scl9wbCk7CiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBtbHhzd19zcF9wb3J0X3ZpZF9sZWFybmluZ19zZXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCisJCQkJCSAgdTE2IHZpZCwgYm9vbCBsZWFybl9lbmFibGUpCit7CisJcmV0dXJuIF9fbWx4c3dfc3BfcG9ydF92aWRfbGVhcm5pbmdfc2V0KG1seHN3X3NwX3BvcnQsIHZpZCwgdmlkLAorCQkJCQkJbGVhcm5fZW5hYmxlKTsKK30KKwogc3RhdGljIGludAogbWx4c3dfc3BfcG9ydF9zeXN0ZW1fcG9ydF9tYXBwaW5nX3NldChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCkKIHsKQEAgLTgxMCw5ICs4MjMsOSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKgotbWx4c3dfc3BfcG9ydF9nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQorc3RhdGljIGludAorbWx4c3dfc3BfcG9ydF9nZXRfc3dfc3RhdHM2NChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQogewogCXN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWx4c3dfc3BfcG9ydF9wY3B1X3N0YXRzICpwOwpAQCAtODM5LDYgKzg1MiwxMDcgQEAKIAkJdHhfZHJvcHBlZAkrPSBwLT50eF9kcm9wcGVkOwogCX0KIAlzdGF0cy0+dHhfZHJvcHBlZAk9IHR4X2Ryb3BwZWQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIG1seHN3X3NwX3BvcnRfaGFzX29mZmxvYWRfc3RhdHMoaW50IGF0dHJfaWQpCit7CisJc3dpdGNoIChhdHRyX2lkKSB7CisJY2FzZSBJRkxBX09GRkxPQURfWFNUQVRTX0NQVV9ISVQ6CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCBtbHhzd19zcF9wb3J0X2dldF9vZmZsb2FkX3N0YXRzKGludCBhdHRyX2lkLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICB2b2lkICpzcCkKK3sKKwlzd2l0Y2ggKGF0dHJfaWQpIHsKKwljYXNlIElGTEFfT0ZGTE9BRF9YU1RBVFNfQ1BVX0hJVDoKKwkJcmV0dXJuIG1seHN3X3NwX3BvcnRfZ2V0X3N3X3N0YXRzNjQoZGV2LCBzcCk7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgbWx4c3dfc3BfcG9ydF9nZXRfc3RhdHNfcmF3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBncnAsCisJCQkJICAgICAgIGludCBwcmlvLCBjaGFyICpwcGNudF9wbCkKK3sKKwlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IG1seHN3X3NwX3BvcnQtPm1seHN3X3NwOworCisJbWx4c3dfcmVnX3BwY250X3BhY2socHBjbnRfcGwsIG1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQsIGdycCwgcHJpbyk7CisJcmV0dXJuIG1seHN3X3JlZ19xdWVyeShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHBwY250KSwgcHBjbnRfcGwpOworfQorCitzdGF0aWMgaW50IG1seHN3X3NwX3BvcnRfZ2V0X2h3X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cykKK3sKKwljaGFyIHBwY250X3BsW01MWFNXX1JFR19QUENOVF9MRU5dOworCWludCBlcnI7CisKKwllcnIgPSBtbHhzd19zcF9wb3J0X2dldF9zdGF0c19yYXcoZGV2LCBNTFhTV19SRUdfUFBDTlRfSUVFRV84MDIzX0NOVCwKKwkJCQkJICAwLCBwcGNudF9wbCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlzdGF0cy0+dHhfcGFja2V0cyA9CisJCW1seHN3X3JlZ19wcGNudF9hX2ZyYW1lc190cmFuc21pdHRlZF9va19nZXQocHBjbnRfcGwpOworCXN0YXRzLT5yeF9wYWNrZXRzID0KKwkJbWx4c3dfcmVnX3BwY250X2FfZnJhbWVzX3JlY2VpdmVkX29rX2dldChwcGNudF9wbCk7CisJc3RhdHMtPnR4X2J5dGVzID0KKwkJbWx4c3dfcmVnX3BwY250X2Ffb2N0ZXRzX3RyYW5zbWl0dGVkX29rX2dldChwcGNudF9wbCk7CisJc3RhdHMtPnJ4X2J5dGVzID0KKwkJbWx4c3dfcmVnX3BwY250X2Ffb2N0ZXRzX3JlY2VpdmVkX29rX2dldChwcGNudF9wbCk7CisJc3RhdHMtPm11bHRpY2FzdCA9CisJCW1seHN3X3JlZ19wcGNudF9hX211bHRpY2FzdF9mcmFtZXNfcmVjZWl2ZWRfb2tfZ2V0KHBwY250X3BsKTsKKworCXN0YXRzLT5yeF9jcmNfZXJyb3JzID0KKwkJbWx4c3dfcmVnX3BwY250X2FfZnJhbWVfY2hlY2tfc2VxdWVuY2VfZXJyb3JzX2dldChwcGNudF9wbCk7CisJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyA9CisJCW1seHN3X3JlZ19wcGNudF9hX2FsaWdubWVudF9lcnJvcnNfZ2V0KHBwY250X3BsKTsKKworCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzID0gKAorCQltbHhzd19yZWdfcHBjbnRfYV9pbl9yYW5nZV9sZW5ndGhfZXJyb3JzX2dldChwcGNudF9wbCkgKworCQltbHhzd19yZWdfcHBjbnRfYV9vdXRfb2ZfcmFuZ2VfbGVuZ3RoX2ZpZWxkX2dldChwcGNudF9wbCkgKworCQltbHhzd19yZWdfcHBjbnRfYV9mcmFtZV90b29fbG9uZ19lcnJvcnNfZ2V0KHBwY250X3BsKSk7CisKKwlzdGF0cy0+cnhfZXJyb3JzID0gKHN0YXRzLT5yeF9jcmNfZXJyb3JzICsKKwkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyArIHN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKTsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0c19jYWNoZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG1seHN3X3NwX3BvcnQsCisJCQkgICAgIGh3X3N0YXRzLnVwZGF0ZV9kdy53b3JrKTsKKworCWlmICghbmV0aWZfY2Fycmllcl9vayhtbHhzd19zcF9wb3J0LT5kZXYpKQorCQlnb3RvIG91dDsKKworCW1seHN3X3NwX3BvcnRfZ2V0X2h3X3N0YXRzKG1seHN3X3NwX3BvcnQtPmRldiwKKwkJCQkgICBtbHhzd19zcF9wb3J0LT5od19zdGF0cy5jYWNoZSk7CisKK291dDoKKwltbHhzd19jb3JlX3NjaGVkdWxlX2R3KCZtbHhzd19zcF9wb3J0LT5od19zdGF0cy51cGRhdGVfZHcsCisJCQkgICAgICAgTUxYU1dfSFdfU1RBVFNfVVBEQVRFX1RJTUUpOworfQorCisvKiBSZXR1cm4gdGhlIHN0YXRzIGZyb20gYSBjYWNoZSB0aGF0IGlzIHVwZGF0ZWQgcGVyaW9kaWNhbGx5LAorICogYXMgdGhpcyBmdW5jdGlvbiBtaWdodCBnZXQgY2FsbGVkIGluIGFuIGF0b21pYyBjb250ZXh0LgorICovCitzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICoKK21seHN3X3NwX3BvcnRfZ2V0X3N0YXRzNjQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cykKK3sKKwlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCA9IG5ldGRldl9wcml2KGRldik7CisKKwltZW1jcHkoc3RhdHMsIG1seHN3X3NwX3BvcnQtPmh3X3N0YXRzLmNhY2hlLCBzaXplb2YoKnN0YXRzKSk7CisKIAlyZXR1cm4gc3RhdHM7CiB9CiAKQEAgLTk0Miw4ICsxMDU2LDggQEAKIAlrZnJlZShtbHhzd19zcF92cG9ydCk7CiB9CiAKLWludCBtbHhzd19zcF9wb3J0X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX19iZTE2IF9fYWx3YXlzX3VudXNlZCBwcm90bywKLQkJCSAgdTE2IHZpZCkKK3N0YXRpYyBpbnQgbWx4c3dfc3BfcG9ydF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIF9fYmUxNiBfX2Fsd2F5c191bnVzZWQgcHJvdG8sIHUxNiB2aWQpCiB7CiAJc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF92cG9ydDsKQEAgLTk1NiwxNiArMTA3MCwxMiBAQAogCWlmICghdmlkKQogCQlyZXR1cm4gMDsKIAotCWlmIChtbHhzd19zcF9wb3J0X3Zwb3J0X2ZpbmQobWx4c3dfc3BfcG9ydCwgdmlkKSkgewotCQluZXRkZXZfd2FybihkZXYsICJWSUQ9JWQgYWxyZWFkeSBjb25maWd1cmVkXG4iLCB2aWQpOworCWlmIChtbHhzd19zcF9wb3J0X3Zwb3J0X2ZpbmQobWx4c3dfc3BfcG9ydCwgdmlkKSkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJbWx4c3dfc3BfdnBvcnQgPSBtbHhzd19zcF9wb3J0X3Zwb3J0X2NyZWF0ZShtbHhzd19zcF9wb3J0LCB2aWQpOwotCWlmICghbWx4c3dfc3BfdnBvcnQpIHsKLQkJbmV0ZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY3JlYXRlIHZQb3J0IGZvciBWSUQ9JWRcbiIsIHZpZCk7CisJaWYgKCFtbHhzd19zcF92cG9ydCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJLyogV2hlbiBhZGRpbmcgdGhlIGZpcnN0IFZMQU4gaW50ZXJmYWNlIG9uIGEgYnJpZGdlZCBwb3J0IHdlIG5lZWQgdG8KIAkgKiB0cmFuc2l0aW9uIGFsbCB0aGUgYWN0aXZlIDgwMi4xUSBicmlkZ2UgVkxBTnMgdG8gdXNlIGV4cGxpY2l0CkBAIC05NzMsMzAgKzEwODMsMTcgQEAKIAkgKi8KIAlpZiAobGlzdF9pc19zaW5ndWxhcigmbWx4c3dfc3BfcG9ydC0+dnBvcnRzX2xpc3QpKSB7CiAJCWVyciA9IG1seHN3X3NwX3BvcnRfdnBfbW9kZV90cmFucyhtbHhzd19zcF9wb3J0KTsKLQkJaWYgKGVycikgewotCQkJbmV0ZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IHRvIFZpcnR1YWwgbW9kZVxuIik7CisJCWlmIChlcnIpCiAJCQlnb3RvIGVycl9wb3J0X3ZwX21vZGVfdHJhbnM7Ci0JCX0KLQl9Ci0KLQllcnIgPSBtbHhzd19zcF9wb3J0X3ZpZF9sZWFybmluZ19zZXQobWx4c3dfc3BfdnBvcnQsIHZpZCwgZmFsc2UpOwotCWlmIChlcnIpIHsKLQkJbmV0ZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZGlzYWJsZSBsZWFybmluZyBmb3IgVklEPSVkXG4iLCB2aWQpOwotCQlnb3RvIGVycl9wb3J0X3ZpZF9sZWFybmluZ19zZXQ7CiAJfQogCiAJZXJyID0gbWx4c3dfc3BfcG9ydF92bGFuX3NldChtbHhzd19zcF92cG9ydCwgdmlkLCB2aWQsIHRydWUsIHVudGFnZ2VkKTsKLQlpZiAoZXJyKSB7Ci0JCW5ldGRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHNldCBWTEFOIG1lbWJlcnNoaXAgZm9yIFZJRD0lZFxuIiwKLQkJCSAgIHZpZCk7CisJaWYgKGVycikKIAkJZ290byBlcnJfcG9ydF9hZGRfdmlkOwotCX0KIAogCXJldHVybiAwOwogCiBlcnJfcG9ydF9hZGRfdmlkOgotCW1seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChtbHhzd19zcF92cG9ydCwgdmlkLCB0cnVlKTsKLWVycl9wb3J0X3ZpZF9sZWFybmluZ19zZXQ6CiAJaWYgKGxpc3RfaXNfc2luZ3VsYXIoJm1seHN3X3NwX3BvcnQtPnZwb3J0c19saXN0KSkKIAkJbWx4c3dfc3BfcG9ydF92bGFuX21vZGVfdHJhbnMobWx4c3dfc3BfcG9ydCk7CiBlcnJfcG9ydF92cF9tb2RlX3RyYW5zOgpAQCAtMTAxMCw3ICsxMTA3LDYgQEAKIAlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3Zwb3J0OwogCXN0cnVjdCBtbHhzd19zcF9maWQgKmY7Ci0JaW50IGVycjsKIAogCS8qIFZMQU4gMCBpcyByZW1vdmVkIGZyb20gSFcgZmlsdGVyIHdoZW4gZGV2aWNlIGdvZXMgZG93biwgYnV0CiAJICogaXQgaXMgcmVzZXJ2ZWQgaW4gb3VyIGNhc2UsIHNvIHNpbXBseSByZXR1cm4uCkBAIC0xMDE5LDIzICsxMTE1LDEwIEBACiAJCXJldHVybiAwOwogCiAJbWx4c3dfc3BfdnBvcnQgPSBtbHhzd19zcF9wb3J0X3Zwb3J0X2ZpbmQobWx4c3dfc3BfcG9ydCwgdmlkKTsKLQlpZiAoIW1seHN3X3NwX3Zwb3J0KSB7Ci0JCW5ldGRldl93YXJuKGRldiwgIlZJRD0lZCBkb2VzIG5vdCBleGlzdFxuIiwgdmlkKTsKKwlpZiAoV0FSTl9PTighbWx4c3dfc3BfdnBvcnQpKQogCQlyZXR1cm4gMDsKLQl9CiAKLQllcnIgPSBtbHhzd19zcF9wb3J0X3ZsYW5fc2V0KG1seHN3X3NwX3Zwb3J0LCB2aWQsIHZpZCwgZmFsc2UsIGZhbHNlKTsKLQlpZiAoZXJyKSB7Ci0JCW5ldGRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHNldCBWTEFOIG1lbWJlcnNoaXAgZm9yIFZJRD0lZFxuIiwKLQkJCSAgIHZpZCk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JZXJyID0gbWx4c3dfc3BfcG9ydF92aWRfbGVhcm5pbmdfc2V0KG1seHN3X3NwX3Zwb3J0LCB2aWQsIHRydWUpOwotCWlmIChlcnIpIHsKLQkJbmV0ZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIGxlYXJuaW5nIGZvciBWSUQ9JWRcbiIsIHZpZCk7Ci0JCXJldHVybiBlcnI7Ci0JfQorCW1seHN3X3NwX3BvcnRfdmxhbl9zZXQobWx4c3dfc3BfdnBvcnQsIHZpZCwgdmlkLCBmYWxzZSwgZmFsc2UpOwogCiAJLyogRHJvcCBGSUQgcmVmZXJlbmNlLiBJZiB0aGlzIHdhcyB0aGUgbGFzdCByZWZlcmVuY2UgdGhlCiAJICogcmVzb3VyY2VzIHdpbGwgYmUgZnJlZWQuCkBAIC0xMDQ4LDEzICsxMTMxLDggQEAKIAkgKiB0cmFuc2l0aW9uIGFsbCBhY3RpdmUgODAyLjFRIGJyaWRnZSBWTEFOcyB0byB1c2UgVklEIHRvIEZJRAogCSAqIG1hcHBpbmdzIGFuZCBzZXQgcG9ydCdzIG1vZGUgdG8gVkxBTiBtb2RlLgogCSAqLwotCWlmIChsaXN0X2lzX3Npbmd1bGFyKCZtbHhzd19zcF9wb3J0LT52cG9ydHNfbGlzdCkpIHsKLQkJZXJyID0gbWx4c3dfc3BfcG9ydF92bGFuX21vZGVfdHJhbnMobWx4c3dfc3BfcG9ydCk7Ci0JCWlmIChlcnIpIHsKLQkJCW5ldGRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHNldCB0byBWTEFOIG1vZGVcbiIpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCX0KKwlpZiAobGlzdF9pc19zaW5ndWxhcigmbWx4c3dfc3BfcG9ydC0+dnBvcnRzX2xpc3QpKQorCQltbHhzd19zcF9wb3J0X3ZsYW5fbW9kZV90cmFucyhtbHhzd19zcF9wb3J0KTsKIAogCW1seHN3X3NwX3BvcnRfdnBvcnRfZGVzdHJveShtbHhzd19zcF92cG9ydCk7CiAKQEAgLTExNDksNiArMTIyNyw3IEBACiAJCQkJCSAgYm9vbCBpbmdyZXNzKQogewogCWNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmE7CisJTElTVF9IRUFEKGFjdGlvbnMpOwogCWludCBlcnI7CiAKIAlpZiAoIXRjX3NpbmdsZV9hY3Rpb24oY2xzLT5leHRzKSkgewpAQCAtMTE1Niw3ICsxMjM1LDggQEAKIAkJcmV0dXJuIC1FTk9UU1VQUDsKIAl9CiAKLQl0Y19mb3JfZWFjaF9hY3Rpb24oYSwgY2xzLT5leHRzKSB7CisJdGNmX2V4dHNfdG9fbGlzdChjbHMtPmV4dHMsICZhY3Rpb25zKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGEsICZhY3Rpb25zLCBsaXN0KSB7CiAJCWlmICghaXNfdGNmX21pcnJlZF9taXJyb3IoYSkgfHwgcHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfQUxMKSkKIAkJCXJldHVybiAtRU5PVFNVUFA7CiAKQEAgLTEyMzQsNiArMTMxNCw4IEBACiAJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBtbHhzd19zcF9wb3J0X3NldF9tYWNfYWRkcmVzcywKIAkubmRvX2NoYW5nZV9tdHUJCT0gbWx4c3dfc3BfcG9ydF9jaGFuZ2VfbXR1LAogCS5uZG9fZ2V0X3N0YXRzNjQJPSBtbHhzd19zcF9wb3J0X2dldF9zdGF0czY0LAorCS5uZG9faGFzX29mZmxvYWRfc3RhdHMJPSBtbHhzd19zcF9wb3J0X2hhc19vZmZsb2FkX3N0YXRzLAorCS5uZG9fZ2V0X29mZmxvYWRfc3RhdHMJPSBtbHhzd19zcF9wb3J0X2dldF9vZmZsb2FkX3N0YXRzLAogCS5uZG9fdmxhbl9yeF9hZGRfdmlkCT0gbWx4c3dfc3BfcG9ydF9hZGRfdmlkLAogCS5uZG9fdmxhbl9yeF9raWxsX3ZpZAk9IG1seHN3X3NwX3BvcnRfa2lsbF92aWQsCiAJLm5kb19uZWlnaF9jb25zdHJ1Y3QJPSBtbHhzd19zcF9yb3V0ZXJfbmVpZ2hfY29uc3RydWN0LApAQCAtMTU3Miw4ICsxNjU0LDYgQEAKIAkJCQkgICAgICBlbnVtIG1seHN3X3JlZ19wcGNudF9ncnAgZ3JwLCBpbnQgcHJpbywKIAkJCQkgICAgICB1NjQgKmRhdGEsIGludCBkYXRhX2luZGV4KQogewotCXN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7CiAJc3RydWN0IG1seHN3X3NwX3BvcnRfaHdfc3RhdHMgKmh3X3N0YXRzOwogCWNoYXIgcHBjbnRfcGxbTUxYU1dfUkVHX1BQQ05UX0xFTl07CiAJaW50IGksIGxlbjsKQEAgLTE1ODIsMTAgKzE2NjIsOSBAQAogCWVyciA9IG1seHN3X3NwX2dldF9od19zdGF0c19ieV9ncm91cCgmaHdfc3RhdHMsICZsZW4sIGdycCk7CiAJaWYgKGVycikKIAkJcmV0dXJuOwotCW1seHN3X3JlZ19wcGNudF9wYWNrKHBwY250X3BsLCBtbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0LCBncnAsIHByaW8pOwotCWVyciA9IG1seHN3X3JlZ19xdWVyeShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHBwY250KSwgcHBjbnRfcGwpOworCW1seHN3X3NwX3BvcnRfZ2V0X3N0YXRzX3JhdyhkZXYsIGdycCwgcHJpbywgcHBjbnRfcGwpOwogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJZGF0YVtkYXRhX2luZGV4ICsgaV0gPSAhZXJyID8gaHdfc3RhdHNbaV0uZ2V0dGVyKHBwY250X3BsKSA6IDA7CisJCWRhdGFbZGF0YV9pbmRleCArIGldID0gaHdfc3RhdHNbaV0uZ2V0dGVyKHBwY250X3BsKTsKIH0KIAogc3RhdGljIHZvaWQgbWx4c3dfc3BfcG9ydF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTE2MjQsMTEyICsxNzAzLDE0OSBAQAogfQogCiBzdHJ1Y3QgbWx4c3dfc3BfcG9ydF9saW5rX21vZGUgeworCWVudW0gZXRodG9vbF9saW5rX21vZGVfYml0X2luZGljZXMgbWFza19ldGh0b29sOwogCXUzMiBtYXNrOwotCXUzMiBzdXBwb3J0ZWQ7Ci0JdTMyIGFkdmVydGlzZWQ7CiAJdTMyIHNwZWVkOwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBtbHhzd19zcF9wb3J0X2xpbmtfbW9kZSBtbHhzd19zcF9wb3J0X2xpbmtfbW9kZVtdID0gewogCXsKIAkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMEJBU0VfVCwKLQkJLnN1cHBvcnRlZAk9IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsLAotCQkuYWR2ZXJ0aXNlZAk9IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCwKLQkJLnNwZWVkCQk9IDEwMCwKLQl9LAotCXsKLQkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMEJBU0VfVFgsCi0JCS5zcGVlZAkJPSAxMDAsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV8xMDBiYXNlVF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzEwMCwKIAl9LAogCXsKIAkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEX1NHTUlJIHwKIAkJCQkgIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMDAwQkFTRV9LWCwKLQkJLnN1cHBvcnRlZAk9IFNVUFBPUlRFRF8xMDAwYmFzZUtYX0Z1bGwsCi0JCS5hZHZlcnRpc2VkCT0gQURWRVJUSVNFRF8xMDAwYmFzZUtYX0Z1bGwsCi0JCS5zcGVlZAkJPSAxMDAwLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfMTAwMGJhc2VLWF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzEwMDAsCiAJfSwKIAl7CiAJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMEdCQVNFX1QsCi0JCS5zdXBwb3J0ZWQJPSBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsLAotCQkuYWR2ZXJ0aXNlZAk9IEFEVkVSVElTRURfMTAwMDBiYXNlVF9GdWxsLAotCQkuc3BlZWQJCT0gMTAwMDAsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV8xMDAwMGJhc2VUX0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfMTAwMDAsCiAJfSwKIAl7CiAJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMEdCQVNFX0NYNCB8CiAJCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9LWDQsCi0JCS5zdXBwb3J0ZWQJPSBTVVBQT1JURURfMTAwMDBiYXNlS1g0X0Z1bGwsCi0JCS5hZHZlcnRpc2VkCT0gQURWRVJUSVNFRF8xMDAwMGJhc2VLWDRfRnVsbCwKLQkJLnNwZWVkCQk9IDEwMDAwLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfMTAwMDBiYXNlS1g0X0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfMTAwMDAsCiAJfSwKIAl7CiAJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMEdCQVNFX0tSIHwKIAkJCQkgIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMEdCQVNFX0NSIHwKIAkJCQkgIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMEdCQVNFX1NSIHwKIAkJCQkgIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMEdCQVNFX0VSX0xSLAotCQkuc3VwcG9ydGVkCT0gU1VQUE9SVEVEXzEwMDAwYmFzZUtSX0Z1bGwsCi0JCS5hZHZlcnRpc2VkCT0gQURWRVJUSVNFRF8xMDAwMGJhc2VLUl9GdWxsLAotCQkuc3BlZWQJCT0gMTAwMDAsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV8xMDAwMGJhc2VLUl9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzEwMDAwLAogCX0sCiAJewogCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMjBHQkFTRV9LUjIsCi0JCS5zdXBwb3J0ZWQJPSBTVVBQT1JURURfMjAwMDBiYXNlS1IyX0Z1bGwsCi0JCS5hZHZlcnRpc2VkCT0gQURWRVJUSVNFRF8yMDAwMGJhc2VLUjJfRnVsbCwKLQkJLnNwZWVkCQk9IDIwMDAwLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfMjAwMDBiYXNlS1IyX0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfMjAwMDAsCiAJfSwKIAl7CiAJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF80MEdCQVNFX0NSNCwKLQkJLnN1cHBvcnRlZAk9IFNVUFBPUlRFRF80MDAwMGJhc2VDUjRfRnVsbCwKLQkJLmFkdmVydGlzZWQJPSBBRFZFUlRJU0VEXzQwMDAwYmFzZUNSNF9GdWxsLAotCQkuc3BlZWQJCT0gNDAwMDAsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV80MDAwMGJhc2VDUjRfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF80MDAwMCwKIAl9LAogCXsKIAkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzQwR0JBU0VfS1I0LAotCQkuc3VwcG9ydGVkCT0gU1VQUE9SVEVEXzQwMDAwYmFzZUtSNF9GdWxsLAotCQkuYWR2ZXJ0aXNlZAk9IEFEVkVSVElTRURfNDAwMDBiYXNlS1I0X0Z1bGwsCi0JCS5zcGVlZAkJPSA0MDAwMCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzQwMDAwYmFzZUtSNF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzQwMDAwLAogCX0sCiAJewogCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNDBHQkFTRV9TUjQsCi0JCS5zdXBwb3J0ZWQJPSBTVVBQT1JURURfNDAwMDBiYXNlU1I0X0Z1bGwsCi0JCS5hZHZlcnRpc2VkCT0gQURWRVJUSVNFRF80MDAwMGJhc2VTUjRfRnVsbCwKLQkJLnNwZWVkCQk9IDQwMDAwLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfNDAwMDBiYXNlU1I0X0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfNDAwMDAsCiAJfSwKIAl7CiAJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF80MEdCQVNFX0xSNF9FUjQsCi0JCS5zdXBwb3J0ZWQJPSBTVVBQT1JURURfNDAwMDBiYXNlTFI0X0Z1bGwsCi0JCS5hZHZlcnRpc2VkCT0gQURWRVJUSVNFRF80MDAwMGJhc2VMUjRfRnVsbCwKLQkJLnNwZWVkCQk9IDQwMDAwLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfNDAwMDBiYXNlTFI0X0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfNDAwMDAsCiAJfSwKIAl7Ci0JCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8yNUdCQVNFX0NSIHwKLQkJCQkgIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8yNUdCQVNFX0tSIHwKLQkJCQkgIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8yNUdCQVNFX1NSLAotCQkuc3BlZWQJCT0gMjUwMDAsCisJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8yNUdCQVNFX0NSLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfMjUwMDBiYXNlQ1JfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF8yNTAwMCwKIAl9LAogCXsKLQkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzUwR0JBU0VfS1I0IHwKLQkJCQkgIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF81MEdCQVNFX0NSMiB8Ci0JCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNTBHQkFTRV9LUjIsCi0JCS5zcGVlZAkJPSA1MDAwMCwKKwkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzI1R0JBU0VfS1IsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV8yNTAwMGJhc2VLUl9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzI1MDAwLAorCX0sCisJeworCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMjVHQkFTRV9TUiwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzI1MDAwYmFzZVNSX0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfMjUwMDAsCisJfSwKKwl7CisJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8yNUdCQVNFX1NSLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfMjUwMDBiYXNlU1JfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF8yNTAwMCwKKwl9LAorCXsKKwkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzUwR0JBU0VfQ1IyLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfNTAwMDBiYXNlQ1IyX0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfNTAwMDAsCisJfSwKKwl7CisJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF81MEdCQVNFX0tSMiwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzUwMDAwYmFzZUtSMl9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzUwMDAwLAorCX0sCisJeworCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNTBHQkFTRV9TUjIsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV81MDAwMGJhc2VTUjJfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF81MDAwMCwKIAl9LAogCXsKIAkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzU2R0JBU0VfUjQsCi0JCS5zdXBwb3J0ZWQJPSBTVVBQT1JURURfNTYwMDBiYXNlS1I0X0Z1bGwsCi0JCS5hZHZlcnRpc2VkCT0gQURWRVJUSVNFRF81NjAwMGJhc2VLUjRfRnVsbCwKLQkJLnNwZWVkCQk9IDU2MDAwLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfNTYwMDBiYXNlS1I0X0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfNTYwMDAsCiAJfSwKIAl7Ci0JCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMDBHQkFTRV9DUjQgfAotCQkJCSAgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMEdCQVNFX1NSNCB8Ci0JCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTAwR0JBU0VfS1I0IHwKLQkJCQkgIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMDBHQkFTRV9MUjRfRVI0LAotCQkuc3BlZWQJCT0gMTAwMDAwLAorCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNTZHQkFTRV9SNCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzU2MDAwYmFzZUNSNF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzU2MDAwLAorCX0sCisJeworCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNTZHQkFTRV9SNCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzU2MDAwYmFzZVNSNF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzU2MDAwLAorCX0sCisJeworCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNTZHQkFTRV9SNCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzU2MDAwYmFzZUxSNF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzU2MDAwLAorCX0sCisJeworCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTAwR0JBU0VfQ1I0LAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfMTAwMDAwYmFzZUNSNF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzEwMDAwMCwKKwl9LAorCXsKKwkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMEdCQVNFX1NSNCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzEwMDAwMGJhc2VTUjRfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF8xMDAwMDAsCisJfSwKKwl7CisJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMDBHQkFTRV9LUjQsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV8xMDAwMDBiYXNlS1I0X0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfMTAwMDAwLAorCX0sCisJeworCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTAwR0JBU0VfTFI0X0VSNCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzEwMDAwMGJhc2VMUjRfRVI0X0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfMTAwMDAwLAogCX0sCiB9OwogCiAjZGVmaW5lIE1MWFNXX1NQX1BPUlRfTElOS19NT0RFX0xFTiBBUlJBWV9TSVpFKG1seHN3X3NwX3BvcnRfbGlua19tb2RlKQogCi1zdGF0aWMgdTMyIG1seHN3X3NwX2Zyb21fcHR5c19zdXBwb3J0ZWRfcG9ydCh1MzIgcHR5c19ldGhfcHJvdG8pCitzdGF0aWMgdm9pZAorbWx4c3dfc3BfZnJvbV9wdHlzX3N1cHBvcnRlZF9wb3J0KHUzMiBwdHlzX2V0aF9wcm90bywKKwkJCQkgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJaWYgKHB0eXNfZXRoX3Byb3RvICYgKE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMEdCQVNFX0NSIHwKIAkJCSAgICAgIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMEdCQVNFX1NSIHwKQEAgLTE3MzcsNDMgKzE4NTMsMjkgQEAKIAkJCSAgICAgIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF80MEdCQVNFX1NSNCB8CiAJCQkgICAgICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTAwR0JBU0VfU1I0IHwKIAkJCSAgICAgIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF9TR01JSSkpCi0JCXJldHVybiBTVVBQT1JURURfRklCUkU7CisJCWV0aHRvb2xfbGlua19rc2V0dGluZ3NfYWRkX2xpbmtfbW9kZShjbWQsIHN1cHBvcnRlZCwgRklCUkUpOwogCiAJaWYgKHB0eXNfZXRoX3Byb3RvICYgKE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMEdCQVNFX0tSIHwKIAkJCSAgICAgIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMEdCQVNFX0tYNCB8CiAJCQkgICAgICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNDBHQkFTRV9LUjQgfAogCQkJICAgICAgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMEdCQVNFX0tSNCB8CiAJCQkgICAgICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTAwMEJBU0VfS1gpKQotCQlyZXR1cm4gU1VQUE9SVEVEX0JhY2twbGFuZTsKLQlyZXR1cm4gMDsKKwkJZXRodG9vbF9saW5rX2tzZXR0aW5nc19hZGRfbGlua19tb2RlKGNtZCwgc3VwcG9ydGVkLCBCYWNrcGxhbmUpOwogfQogCi1zdGF0aWMgdTMyIG1seHN3X3NwX2Zyb21fcHR5c19zdXBwb3J0ZWRfbGluayh1MzIgcHR5c19ldGhfcHJvdG8pCitzdGF0aWMgdm9pZCBtbHhzd19zcF9mcm9tX3B0eXNfbGluayh1MzIgcHR5c19ldGhfcHJvdG8sIHVuc2lnbmVkIGxvbmcgKm1vZGUpCiB7Ci0JdTMyIG1vZGVzID0gMDsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBNTFhTV19TUF9QT1JUX0xJTktfTU9ERV9MRU47IGkrKykgewogCQlpZiAocHR5c19ldGhfcHJvdG8gJiBtbHhzd19zcF9wb3J0X2xpbmtfbW9kZVtpXS5tYXNrKQotCQkJbW9kZXMgfD0gbWx4c3dfc3BfcG9ydF9saW5rX21vZGVbaV0uc3VwcG9ydGVkOworCQkJX19zZXRfYml0KG1seHN3X3NwX3BvcnRfbGlua19tb2RlW2ldLm1hc2tfZXRodG9vbCwKKwkJCQkgIG1vZGUpOwogCX0KLQlyZXR1cm4gbW9kZXM7Ci19Ci0KLXN0YXRpYyB1MzIgbWx4c3dfc3BfZnJvbV9wdHlzX2FkdmVydF9saW5rKHUzMiBwdHlzX2V0aF9wcm90bykKLXsKLQl1MzIgbW9kZXMgPSAwOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE1MWFNXX1NQX1BPUlRfTElOS19NT0RFX0xFTjsgaSsrKSB7Ci0JCWlmIChwdHlzX2V0aF9wcm90byAmIG1seHN3X3NwX3BvcnRfbGlua19tb2RlW2ldLm1hc2spCi0JCQltb2RlcyB8PSBtbHhzd19zcF9wb3J0X2xpbmtfbW9kZVtpXS5hZHZlcnRpc2VkOwotCX0KLQlyZXR1cm4gbW9kZXM7CiB9CiAKIHN0YXRpYyB2b2lkIG1seHN3X3NwX2Zyb21fcHR5c19zcGVlZF9kdXBsZXgoYm9vbCBjYXJyaWVyX29rLCB1MzIgcHR5c19ldGhfcHJvdG8sCi0JCQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKKwkJCQkJICAgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJdTMyIHNwZWVkID0gU1BFRURfVU5LTk9XTjsKIAl1OCBkdXBsZXggPSBEVVBMRVhfVU5LTk9XTjsKQEAgLTE3OTAsOCArMTg5Miw4IEBACiAJCX0KIAl9CiBvdXQ6Ci0JZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgc3BlZWQpOwotCWNtZC0+ZHVwbGV4ID0gZHVwbGV4OworCWNtZC0+YmFzZS5zcGVlZCA9IHNwZWVkOworCWNtZC0+YmFzZS5kdXBsZXggPSBkdXBsZXg7CiB9CiAKIHN0YXRpYyB1OCBtbHhzd19zcF9wb3J0X2Nvbm5lY3Rvcl9wb3J0KHUzMiBwdHlzX2V0aF9wcm90bykKQEAgLTE4MTYsNDkgKzE5MTgsMTUgQEAKIAlyZXR1cm4gUE9SVF9PVEhFUjsKIH0KIAotc3RhdGljIGludCBtbHhzd19zcF9wb3J0X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQotewotCXN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7Ci0JY2hhciBwdHlzX3BsW01MWFNXX1JFR19QVFlTX0xFTl07Ci0JdTMyIGV0aF9wcm90b19jYXA7Ci0JdTMyIGV0aF9wcm90b19hZG1pbjsKLQl1MzIgZXRoX3Byb3RvX29wZXI7Ci0JaW50IGVycjsKLQotCW1seHN3X3JlZ19wdHlzX3BhY2socHR5c19wbCwgbWx4c3dfc3BfcG9ydC0+bG9jYWxfcG9ydCwgMCk7Ci0JZXJyID0gbWx4c3dfcmVnX3F1ZXJ5KG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocHR5cyksIHB0eXNfcGwpOwotCWlmIChlcnIpIHsKLQkJbmV0ZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IHByb3RvIik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCW1seHN3X3JlZ19wdHlzX3VucGFjayhwdHlzX3BsLCAmZXRoX3Byb3RvX2NhcCwKLQkJCSAgICAgICZldGhfcHJvdG9fYWRtaW4sICZldGhfcHJvdG9fb3Blcik7Ci0KLQljbWQtPnN1cHBvcnRlZCA9IG1seHN3X3NwX2Zyb21fcHR5c19zdXBwb3J0ZWRfcG9ydChldGhfcHJvdG9fY2FwKSB8Ci0JCQkgbWx4c3dfc3BfZnJvbV9wdHlzX3N1cHBvcnRlZF9saW5rKGV0aF9wcm90b19jYXApIHwKLQkJCSBTVVBQT1JURURfUGF1c2UgfCBTVVBQT1JURURfQXN5bV9QYXVzZSB8Ci0JCQkgU1VQUE9SVEVEX0F1dG9uZWc7Ci0JY21kLT5hZHZlcnRpc2luZyA9IG1seHN3X3NwX2Zyb21fcHR5c19hZHZlcnRfbGluayhldGhfcHJvdG9fYWRtaW4pOwotCW1seHN3X3NwX2Zyb21fcHR5c19zcGVlZF9kdXBsZXgobmV0aWZfY2Fycmllcl9vayhkZXYpLAotCQkJCQlldGhfcHJvdG9fb3BlciwgY21kKTsKLQotCWV0aF9wcm90b19vcGVyID0gZXRoX3Byb3RvX29wZXIgPyBldGhfcHJvdG9fb3BlciA6IGV0aF9wcm90b19jYXA7Ci0JY21kLT5wb3J0ID0gbWx4c3dfc3BfcG9ydF9jb25uZWN0b3JfcG9ydChldGhfcHJvdG9fb3Blcik7Ci0JY21kLT5scF9hZHZlcnRpc2luZyA9IG1seHN3X3NwX2Zyb21fcHR5c19hZHZlcnRfbGluayhldGhfcHJvdG9fb3Blcik7Ci0KLQljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHUzMiBtbHhzd19zcF90b19wdHlzX2FkdmVydF9saW5rKHUzMiBhZHZlcnRpc2luZykKK3N0YXRpYyB1MzIKK21seHN3X3NwX3RvX3B0eXNfYWR2ZXJ0X2xpbmsoY29uc3Qgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAl1MzIgcHR5c19wcm90byA9IDA7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUxYU1dfU1BfUE9SVF9MSU5LX01PREVfTEVOOyBpKyspIHsKLQkJaWYgKGFkdmVydGlzaW5nICYgbWx4c3dfc3BfcG9ydF9saW5rX21vZGVbaV0uYWR2ZXJ0aXNlZCkKKwkJaWYgKHRlc3RfYml0KG1seHN3X3NwX3BvcnRfbGlua19tb2RlW2ldLm1hc2tfZXRodG9vbCwKKwkJCSAgICAgY21kLT5saW5rX21vZGVzLmFkdmVydGlzaW5nKSkKIAkJCXB0eXNfcHJvdG8gfD0gbWx4c3dfc3BfcG9ydF9saW5rX21vZGVbaV0ubWFzazsKIAl9CiAJcmV0dXJuIHB0eXNfcHJvdG87CkBAIC0xODg4LDYxICsxOTU2LDExMyBAQAogCXJldHVybiBwdHlzX3Byb3RvOwogfQogCi1zdGF0aWMgaW50IG1seHN3X3NwX3BvcnRfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCitzdGF0aWMgdm9pZCBtbHhzd19zcF9wb3J0X2dldF9saW5rX3N1cHBvcnRlZCh1MzIgZXRoX3Byb3RvX2NhcCwKKwkJCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQoreworCWV0aHRvb2xfbGlua19rc2V0dGluZ3NfYWRkX2xpbmtfbW9kZShjbWQsIHN1cHBvcnRlZCwgQXN5bV9QYXVzZSk7CisJZXRodG9vbF9saW5rX2tzZXR0aW5nc19hZGRfbGlua19tb2RlKGNtZCwgc3VwcG9ydGVkLCBBdXRvbmVnKTsKKwlldGh0b29sX2xpbmtfa3NldHRpbmdzX2FkZF9saW5rX21vZGUoY21kLCBzdXBwb3J0ZWQsIFBhdXNlKTsKKworCW1seHN3X3NwX2Zyb21fcHR5c19zdXBwb3J0ZWRfcG9ydChldGhfcHJvdG9fY2FwLCBjbWQpOworCW1seHN3X3NwX2Zyb21fcHR5c19saW5rKGV0aF9wcm90b19jYXAsIGNtZC0+bGlua19tb2Rlcy5zdXBwb3J0ZWQpOworfQorCitzdGF0aWMgdm9pZCBtbHhzd19zcF9wb3J0X2dldF9saW5rX2FkdmVydGlzZSh1MzIgZXRoX3Byb3RvX2FkbWluLCBib29sIGF1dG9uZWcsCisJCQkJCSAgICAgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKK3sKKwlpZiAoIWF1dG9uZWcpCisJCXJldHVybjsKKworCWV0aHRvb2xfbGlua19rc2V0dGluZ3NfYWRkX2xpbmtfbW9kZShjbWQsIGFkdmVydGlzaW5nLCBBdXRvbmVnKTsKKwltbHhzd19zcF9mcm9tX3B0eXNfbGluayhldGhfcHJvdG9fYWRtaW4sIGNtZC0+bGlua19tb2Rlcy5hZHZlcnRpc2luZyk7Cit9CisKK3N0YXRpYyB2b2lkCittbHhzd19zcF9wb3J0X2dldF9saW5rX2xwX2FkdmVydGlzZSh1MzIgZXRoX3Byb3RvX2xwLCB1OCBhdXRvbmVnX3N0YXR1cywKKwkJCQkgICAgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKK3sKKwlpZiAoYXV0b25lZ19zdGF0dXMgIT0gTUxYU1dfUkVHX1BUWVNfQU5fU1RBVFVTX09LIHx8ICFldGhfcHJvdG9fbHApCisJCXJldHVybjsKKworCWV0aHRvb2xfbGlua19rc2V0dGluZ3NfYWRkX2xpbmtfbW9kZShjbWQsIGxwX2FkdmVydGlzaW5nLCBBdXRvbmVnKTsKKwltbHhzd19zcF9mcm9tX3B0eXNfbGluayhldGhfcHJvdG9fbHAsIGNtZC0+bGlua19tb2Rlcy5scF9hZHZlcnRpc2luZyk7Cit9CisKK3N0YXRpYyBpbnQgbWx4c3dfc3BfcG9ydF9nZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCit7CisJdTMyIGV0aF9wcm90b19jYXAsIGV0aF9wcm90b19hZG1pbiwgZXRoX3Byb3RvX29wZXIsIGV0aF9wcm90b19scDsKKwlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IG1seHN3X3NwX3BvcnQtPm1seHN3X3NwOworCWNoYXIgcHR5c19wbFtNTFhTV19SRUdfUFRZU19MRU5dOworCXU4IGF1dG9uZWdfc3RhdHVzOworCWJvb2wgYXV0b25lZzsKKwlpbnQgZXJyOworCisJYXV0b25lZyA9IG1seHN3X3NwX3BvcnQtPmxpbmsuYXV0b25lZzsKKwltbHhzd19yZWdfcHR5c19wYWNrKHB0eXNfcGwsIG1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQsIDApOworCWVyciA9IG1seHN3X3JlZ19xdWVyeShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHB0eXMpLCBwdHlzX3BsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCW1seHN3X3JlZ19wdHlzX3VucGFjayhwdHlzX3BsLCAmZXRoX3Byb3RvX2NhcCwgJmV0aF9wcm90b19hZG1pbiwKKwkJCSAgICAgICZldGhfcHJvdG9fb3Blcik7CisKKwltbHhzd19zcF9wb3J0X2dldF9saW5rX3N1cHBvcnRlZChldGhfcHJvdG9fY2FwLCBjbWQpOworCisJbWx4c3dfc3BfcG9ydF9nZXRfbGlua19hZHZlcnRpc2UoZXRoX3Byb3RvX2FkbWluLCBhdXRvbmVnLCBjbWQpOworCisJZXRoX3Byb3RvX2xwID0gbWx4c3dfcmVnX3B0eXNfZXRoX3Byb3RvX2xwX2FkdmVydGlzZV9nZXQocHR5c19wbCk7CisJYXV0b25lZ19zdGF0dXMgPSBtbHhzd19yZWdfcHR5c19hbl9zdGF0dXNfZ2V0KHB0eXNfcGwpOworCW1seHN3X3NwX3BvcnRfZ2V0X2xpbmtfbHBfYWR2ZXJ0aXNlKGV0aF9wcm90b19scCwgYXV0b25lZ19zdGF0dXMsIGNtZCk7CisKKwljbWQtPmJhc2UuYXV0b25lZyA9IGF1dG9uZWcgPyBBVVRPTkVHX0VOQUJMRSA6IEFVVE9ORUdfRElTQUJMRTsKKwljbWQtPmJhc2UucG9ydCA9IG1seHN3X3NwX3BvcnRfY29ubmVjdG9yX3BvcnQoZXRoX3Byb3RvX29wZXIpOworCW1seHN3X3NwX2Zyb21fcHR5c19zcGVlZF9kdXBsZXgobmV0aWZfY2Fycmllcl9vayhkZXYpLCBldGhfcHJvdG9fb3BlciwKKwkJCQkJY21kKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittbHhzd19zcF9wb3J0X3NldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBjb25zdCBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCXN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7CiAJY2hhciBwdHlzX3BsW01MWFNXX1JFR19QVFlTX0xFTl07Ci0JdTMyIHNwZWVkOwotCXUzMiBldGhfcHJvdG9fbmV3OwotCXUzMiBldGhfcHJvdG9fY2FwOwotCXUzMiBldGhfcHJvdG9fYWRtaW47CisJdTMyIGV0aF9wcm90b19jYXAsIGV0aF9wcm90b19uZXc7CisJYm9vbCBhdXRvbmVnOwogCWludCBlcnI7CiAKLQlzcGVlZCA9IGV0aHRvb2xfY21kX3NwZWVkKGNtZCk7Ci0KLQlldGhfcHJvdG9fbmV3ID0gY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFID8KLQkJbWx4c3dfc3BfdG9fcHR5c19hZHZlcnRfbGluayhjbWQtPmFkdmVydGlzaW5nKSA6Ci0JCW1seHN3X3NwX3RvX3B0eXNfc3BlZWQoc3BlZWQpOwotCiAJbWx4c3dfcmVnX3B0eXNfcGFjayhwdHlzX3BsLCBtbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0LCAwKTsKIAllcnIgPSBtbHhzd19yZWdfcXVlcnkobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhwdHlzKSwgcHR5c19wbCk7Ci0JaWYgKGVycikgewotCQluZXRkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgcHJvdG8iKTsKKwlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCX0KLQltbHhzd19yZWdfcHR5c191bnBhY2socHR5c19wbCwgJmV0aF9wcm90b19jYXAsICZldGhfcHJvdG9fYWRtaW4sIE5VTEwpOworCW1seHN3X3JlZ19wdHlzX3VucGFjayhwdHlzX3BsLCAmZXRoX3Byb3RvX2NhcCwgTlVMTCwgTlVMTCk7CisKKwlhdXRvbmVnID0gY21kLT5iYXNlLmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEU7CisJZXRoX3Byb3RvX25ldyA9IGF1dG9uZWcgPworCQltbHhzd19zcF90b19wdHlzX2FkdmVydF9saW5rKGNtZCkgOgorCQltbHhzd19zcF90b19wdHlzX3NwZWVkKGNtZC0+YmFzZS5zcGVlZCk7CiAKIAlldGhfcHJvdG9fbmV3ID0gZXRoX3Byb3RvX25ldyAmIGV0aF9wcm90b19jYXA7CiAJaWYgKCFldGhfcHJvdG9fbmV3KSB7Ci0JCW5ldGRldl9lcnIoZGV2LCAiTm90IHN1cHBvcnRlZCBwcm90byBhZG1pbiByZXF1ZXN0ZWQiKTsKKwkJbmV0ZGV2X2VycihkZXYsICJObyBzdXBwb3J0ZWQgc3BlZWQgcmVxdWVzdGVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmIChldGhfcHJvdG9fbmV3ID09IGV0aF9wcm90b19hZG1pbikKLQkJcmV0dXJuIDA7CiAKIAltbHhzd19yZWdfcHR5c19wYWNrKHB0eXNfcGwsIG1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQsIGV0aF9wcm90b19uZXcpOwogCWVyciA9IG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHB0eXMpLCBwdHlzX3BsKTsKLQlpZiAoZXJyKSB7Ci0JCW5ldGRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHNldCBwcm90byBhZG1pbiIpOworCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JfQogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCiAJCXJldHVybiAwOwogCi0JZXJyID0gbWx4c3dfc3BfcG9ydF9hZG1pbl9zdGF0dXNfc2V0KG1seHN3X3NwX3BvcnQsIGZhbHNlKTsKLQlpZiAoZXJyKSB7Ci0JCW5ldGRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHNldCBhZG1pbiBzdGF0dXMiKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJbWx4c3dfc3BfcG9ydC0+bGluay5hdXRvbmVnID0gYXV0b25lZzsKIAotCWVyciA9IG1seHN3X3NwX3BvcnRfYWRtaW5fc3RhdHVzX3NldChtbHhzd19zcF9wb3J0LCB0cnVlKTsKLQlpZiAoZXJyKSB7Ci0JCW5ldGRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHNldCBhZG1pbiBzdGF0dXMiKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJbWx4c3dfc3BfcG9ydF9hZG1pbl9zdGF0dXNfc2V0KG1seHN3X3NwX3BvcnQsIGZhbHNlKTsKKwltbHhzd19zcF9wb3J0X2FkbWluX3N0YXR1c19zZXQobWx4c3dfc3BfcG9ydCwgdHJ1ZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5NTYsOCArMjA3Niw4IEBACiAJLnNldF9waHlzX2lkCQk9IG1seHN3X3NwX3BvcnRfc2V0X3BoeXNfaWQsCiAJLmdldF9ldGh0b29sX3N0YXRzCT0gbWx4c3dfc3BfcG9ydF9nZXRfc3RhdHMsCiAJLmdldF9zc2V0X2NvdW50CQk9IG1seHN3X3NwX3BvcnRfZ2V0X3NzZXRfY291bnQsCi0JLmdldF9zZXR0aW5ncwkJPSBtbHhzd19zcF9wb3J0X2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzCQk9IG1seHN3X3NwX3BvcnRfc2V0X3NldHRpbmdzLAorCS5nZXRfbGlua19rc2V0dGluZ3MJPSBtbHhzd19zcF9wb3J0X2dldF9saW5rX2tzZXR0aW5ncywKKwkuc2V0X2xpbmtfa3NldHRpbmdzCT0gbWx4c3dfc3BfcG9ydF9zZXRfbGlua19rc2V0dGluZ3MsCiB9OwogCiBzdGF0aWMgaW50CkBAIC0yMDc2LDYgKzIxOTYsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtbHhzd19zcF9wb3J0X3B2aWRfdnBvcnRfY3JlYXRlKHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0KQoreworCW1seHN3X3NwX3BvcnQtPnB2aWQgPSAxOworCisJcmV0dXJuIG1seHN3X3NwX3BvcnRfYWRkX3ZpZChtbHhzd19zcF9wb3J0LT5kZXYsIDAsIDEpOworfQorCitzdGF0aWMgaW50IG1seHN3X3NwX3BvcnRfcHZpZF92cG9ydF9kZXN0cm95KHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0KQoreworCXJldHVybiBtbHhzd19zcF9wb3J0X2tpbGxfdmlkKG1seHN3X3NwX3BvcnQtPmRldiwgMCwgMSk7Cit9CisKIHN0YXRpYyBpbnQgbWx4c3dfc3BfcG9ydF9jcmVhdGUoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCwgdTggbG9jYWxfcG9ydCwKIAkJCQlib29sIHNwbGl0LCB1OCBtb2R1bGUsIHU4IHdpZHRoLCB1OCBsYW5lKQogewpAQCAtMjA5NSw2ICsyMjI3LDcgQEAKIAltbHhzd19zcF9wb3J0LT5tYXBwaW5nLm1vZHVsZSA9IG1vZHVsZTsKIAltbHhzd19zcF9wb3J0LT5tYXBwaW5nLndpZHRoID0gd2lkdGg7CiAJbWx4c3dfc3BfcG9ydC0+bWFwcGluZy5sYW5lID0gbGFuZTsKKwltbHhzd19zcF9wb3J0LT5saW5rLmF1dG9uZWcgPSAxOwogCWJ5dGVzID0gRElWX1JPVU5EX1VQKFZMQU5fTl9WSUQsIEJJVFNfUEVSX0JZVEUpOwogCW1seHN3X3NwX3BvcnQtPmFjdGl2ZV92bGFucyA9IGt6YWxsb2MoYnl0ZXMsIEdGUF9LRVJORUwpOwogCWlmICghbWx4c3dfc3BfcG9ydC0+YWN0aXZlX3ZsYW5zKSB7CkBAIC0yMTE2LDkgKzIyNDksMjYgQEAKIAkJZ290byBlcnJfYWxsb2Nfc3RhdHM7CiAJfQogCisJbWx4c3dfc3BfcG9ydC0+aHdfc3RhdHMuY2FjaGUgPQorCQlremFsbG9jKHNpemVvZigqbWx4c3dfc3BfcG9ydC0+aHdfc3RhdHMuY2FjaGUpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbWx4c3dfc3BfcG9ydC0+aHdfc3RhdHMuY2FjaGUpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfYWxsb2NfaHdfc3RhdHM7CisJfQorCUlOSVRfREVMQVlFRF9XT1JLKCZtbHhzd19zcF9wb3J0LT5od19zdGF0cy51cGRhdGVfZHcsCisJCQkgICZ1cGRhdGVfc3RhdHNfY2FjaGUpOworCiAJZGV2LT5uZXRkZXZfb3BzID0gJm1seHN3X3NwX3BvcnRfbmV0ZGV2X29wczsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJm1seHN3X3NwX3BvcnRfZXRodG9vbF9vcHM7CiAKKwllcnIgPSBtbHhzd19zcF9wb3J0X3N3aWRfc2V0KG1seHN3X3NwX3BvcnQsIDApOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihtbHhzd19zcC0+YnVzX2luZm8tPmRldiwgIlBvcnQgJWQ6IEZhaWxlZCB0byBzZXQgU1dJRFxuIiwKKwkJCW1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQpOworCQlnb3RvIGVycl9wb3J0X3N3aWRfc2V0OworCX0KKwogCWVyciA9IG1seHN3X3NwX3BvcnRfZGV2X2FkZHJfaW5pdChtbHhzd19zcF9wb3J0KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIobWx4c3dfc3AtPmJ1c19pbmZvLT5kZXYsICJQb3J0ICVkOiBVbmFibGUgdG8gaW5pdCBwb3J0IG1hYyBhZGRyZXNzXG4iLApAQCAtMjEzNSw3ICsyMjg1LDcgQEAKIAkvKiBFYWNoIHBhY2tldCBuZWVkcyB0byBoYXZlIGEgVHggaGVhZGVyIChtZXRhZGF0YSkgb24gdG9wIGFsbCBvdGhlcgogCSAqIGhlYWRlcnMuCiAJICovCi0JZGV2LT5oYXJkX2hlYWRlcl9sZW4gKz0gTUxYU1dfVFhIRFJfTEVOOworCWRldi0+bmVlZGVkX2hlYWRyb29tID0gTUxYU1dfVFhIRFJfTEVOOwogCiAJZXJyID0gbWx4c3dfc3BfcG9ydF9zeXN0ZW1fcG9ydF9tYXBwaW5nX3NldChtbHhzd19zcF9wb3J0KTsKIAlpZiAoZXJyKSB7CkBAIC0yMTQ0LDEzICsyMjk0LDYgQEAKIAkJZ290byBlcnJfcG9ydF9zeXN0ZW1fcG9ydF9tYXBwaW5nX3NldDsKIAl9CiAKLQllcnIgPSBtbHhzd19zcF9wb3J0X3N3aWRfc2V0KG1seHN3X3NwX3BvcnQsIDApOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycihtbHhzd19zcC0+YnVzX2luZm8tPmRldiwgIlBvcnQgJWQ6IEZhaWxlZCB0byBzZXQgU1dJRFxuIiwKLQkJCW1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQpOwotCQlnb3RvIGVycl9wb3J0X3N3aWRfc2V0OwotCX0KLQogCWVyciA9IG1seHN3X3NwX3BvcnRfc3BlZWRfYnlfd2lkdGhfc2V0KG1seHN3X3NwX3BvcnQsIHdpZHRoKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIobWx4c3dfc3AtPmJ1c19pbmZvLT5kZXYsICJQb3J0ICVkOiBGYWlsZWQgdG8gZW5hYmxlIHNwZWVkc1xuIiwKQEAgLTIxOTEsNyArMjMzNCwxNSBAQAogCQlnb3RvIGVycl9wb3J0X2RjYl9pbml0OwogCX0KIAorCWVyciA9IG1seHN3X3NwX3BvcnRfcHZpZF92cG9ydF9jcmVhdGUobWx4c3dfc3BfcG9ydCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKG1seHN3X3NwLT5idXNfaW5mby0+ZGV2LCAiUG9ydCAlZDogRmFpbGVkIHRvIGNyZWF0ZSBQVklEIHZQb3J0XG4iLAorCQkJbWx4c3dfc3BfcG9ydC0+bG9jYWxfcG9ydCk7CisJCWdvdG8gZXJyX3BvcnRfcHZpZF92cG9ydF9jcmVhdGU7CisJfQorCiAJbWx4c3dfc3BfcG9ydF9zd2l0Y2hkZXZfaW5pdChtbHhzd19zcF9wb3J0KTsKKwltbHhzd19zcC0+cG9ydHNbbG9jYWxfcG9ydF0gPSBtbHhzd19zcF9wb3J0OwogCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycihtbHhzd19zcC0+YnVzX2luZm8tPmRldiwgIlBvcnQgJWQ6IEZhaWxlZCB0byByZWdpc3RlciBuZXRkZXZcbiIsCkBAIC0yMjA4LDI3ICsyMzU5LDI5IEBACiAJCWdvdG8gZXJyX2NvcmVfcG9ydF9pbml0OwogCX0KIAotCWVyciA9IG1seHN3X3NwX3BvcnRfdmxhbl9pbml0KG1seHN3X3NwX3BvcnQpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3BvcnRfdmxhbl9pbml0OwotCi0JbWx4c3dfc3AtPnBvcnRzW2xvY2FsX3BvcnRdID0gbWx4c3dfc3BfcG9ydDsKKwltbHhzd19jb3JlX3NjaGVkdWxlX2R3KCZtbHhzd19zcF9wb3J0LT5od19zdGF0cy51cGRhdGVfZHcsIDApOwogCXJldHVybiAwOwogCi1lcnJfcG9ydF92bGFuX2luaXQ6Ci0JbWx4c3dfY29yZV9wb3J0X2ZpbmkoJm1seHN3X3NwX3BvcnQtPmNvcmVfcG9ydCk7CiBlcnJfY29yZV9wb3J0X2luaXQ6CiAJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIGVycl9yZWdpc3Rlcl9uZXRkZXY6CisJbWx4c3dfc3AtPnBvcnRzW2xvY2FsX3BvcnRdID0gTlVMTDsKKwltbHhzd19zcF9wb3J0X3N3aXRjaGRldl9maW5pKG1seHN3X3NwX3BvcnQpOworCW1seHN3X3NwX3BvcnRfcHZpZF92cG9ydF9kZXN0cm95KG1seHN3X3NwX3BvcnQpOworZXJyX3BvcnRfcHZpZF92cG9ydF9jcmVhdGU6CisJbWx4c3dfc3BfcG9ydF9kY2JfZmluaShtbHhzd19zcF9wb3J0KTsKIGVycl9wb3J0X2RjYl9pbml0OgogZXJyX3BvcnRfZXRzX2luaXQ6CiBlcnJfcG9ydF9idWZmZXJzX2luaXQ6CiBlcnJfcG9ydF9hZG1pbl9zdGF0dXNfc2V0OgogZXJyX3BvcnRfbXR1X3NldDoKIGVycl9wb3J0X3NwZWVkX2J5X3dpZHRoX3NldDoKLWVycl9wb3J0X3N3aWRfc2V0OgogZXJyX3BvcnRfc3lzdGVtX3BvcnRfbWFwcGluZ19zZXQ6CiBlcnJfZGV2X2FkZHJfaW5pdDoKKwltbHhzd19zcF9wb3J0X3N3aWRfc2V0KG1seHN3X3NwX3BvcnQsIE1MWFNXX1BPUlRfU1dJRF9ESVNBQkxFRF9QT1JUKTsKK2Vycl9wb3J0X3N3aWRfc2V0OgorCWtmcmVlKG1seHN3X3NwX3BvcnQtPmh3X3N0YXRzLmNhY2hlKTsKK2Vycl9hbGxvY19od19zdGF0czoKIAlmcmVlX3BlcmNwdShtbHhzd19zcF9wb3J0LT5wY3B1X3N0YXRzKTsKIGVycl9hbGxvY19zdGF0czoKIAlrZnJlZShtbHhzd19zcF9wb3J0LT51bnRhZ2dlZF92bGFucyk7CkBAIC0yMjQ1LDE1ICsyMzk4LDE3IEBACiAKIAlpZiAoIW1seHN3X3NwX3BvcnQpCiAJCXJldHVybjsKLQltbHhzd19zcC0+cG9ydHNbbG9jYWxfcG9ydF0gPSBOVUxMOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbWx4c3dfc3BfcG9ydC0+aHdfc3RhdHMudXBkYXRlX2R3KTsKIAltbHhzd19jb3JlX3BvcnRfZmluaSgmbWx4c3dfc3BfcG9ydC0+Y29yZV9wb3J0KTsKIAl1bnJlZ2lzdGVyX25ldGRldihtbHhzd19zcF9wb3J0LT5kZXYpOyAvKiBUaGlzIGNhbGxzIG5kb19zdG9wICovCi0JbWx4c3dfc3BfcG9ydF9kY2JfZmluaShtbHhzd19zcF9wb3J0KTsKLQltbHhzd19zcF9wb3J0X2tpbGxfdmlkKG1seHN3X3NwX3BvcnQtPmRldiwgMCwgMSk7CisJbWx4c3dfc3AtPnBvcnRzW2xvY2FsX3BvcnRdID0gTlVMTDsKIAltbHhzd19zcF9wb3J0X3N3aXRjaGRldl9maW5pKG1seHN3X3NwX3BvcnQpOworCW1seHN3X3NwX3BvcnRfcHZpZF92cG9ydF9kZXN0cm95KG1seHN3X3NwX3BvcnQpOworCW1seHN3X3NwX3BvcnRfZGNiX2ZpbmkobWx4c3dfc3BfcG9ydCk7CiAJbWx4c3dfc3BfcG9ydF9zd2lkX3NldChtbHhzd19zcF9wb3J0LCBNTFhTV19QT1JUX1NXSURfRElTQUJMRURfUE9SVCk7CiAJbWx4c3dfc3BfcG9ydF9tb2R1bGVfdW5tYXAobWx4c3dfc3AsIG1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQpOwogCWZyZWVfcGVyY3B1KG1seHN3X3NwX3BvcnQtPnBjcHVfc3RhdHMpOworCWtmcmVlKG1seHN3X3NwX3BvcnQtPmh3X3N0YXRzLmNhY2hlKTsKIAlrZnJlZShtbHhzd19zcF9wb3J0LT51bnRhZ2dlZF92bGFucyk7CiAJa2ZyZWUobWx4c3dfc3BfcG9ydC0+YWN0aXZlX3ZsYW5zKTsKIAlXQVJOX09OX09OQ0UoIWxpc3RfZW1wdHkoJm1seHN3X3NwX3BvcnQtPnZwb3J0c19saXN0KSk7CkBAIC0yNTc3LDEwMyArMjczMiw0NyBAQAogCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CiB9CiAKK3N0YXRpYyB2b2lkIG1seHN3X3NwX3J4X2xpc3RlbmVyX21hcmtfZnVuYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBsb2NhbF9wb3J0LAorCQkJCQkgICB2b2lkICpwcml2KQoreworCXNrYi0+b2ZmbG9hZF9md2RfbWFyayA9IDE7CisJcmV0dXJuIG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMoc2tiLCBsb2NhbF9wb3J0LCBwcml2KTsKK30KKworI2RlZmluZSBNTFhTV19TUF9SWEwoX2Z1bmMsIF90cmFwX2lkLCBfYWN0aW9uKQkJCVwKKwl7CQkJCQkJCVwKKwkJLmZ1bmMgPSBfZnVuYywJCQkJCVwKKwkJLmxvY2FsX3BvcnQgPSBNTFhTV19QT1JUX0RPTlRfQ0FSRSwJCVwKKwkJLnRyYXBfaWQgPSBNTFhTV19UUkFQX0lEXyMjX3RyYXBfaWQsCQlcCisJCS5hY3Rpb24gPSBNTFhTV19SRUdfSFBLVF9BQ1RJT05fIyNfYWN0aW9uLAlcCisJfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1seHN3X3J4X2xpc3RlbmVyIG1seHN3X3NwX3J4X2xpc3RlbmVyW10gPSB7Ci0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9GREJfTUMsCi0JfSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgRkRCX01DLCBUUkFQX1RPX0NQVSksCiAJLyogVHJhcHMgZm9yIHNwZWNpZmljIEwyIHBhY2tldCB0eXBlcywgbm90IHRyYXBwZWQgYXMgRkRCIE1DICovCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9TVFAsCi0JfSwKLQl7Ci0JCS5mdW5jID0gbWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywKLQkJLmxvY2FsX3BvcnQgPSBNTFhTV19QT1JUX0RPTlRfQ0FSRSwKLQkJLnRyYXBfaWQgPSBNTFhTV19UUkFQX0lEX0xBQ1AsCi0JfSwKLQl7Ci0JCS5mdW5jID0gbWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywKLQkJLmxvY2FsX3BvcnQgPSBNTFhTV19QT1JUX0RPTlRfQ0FSRSwKLQkJLnRyYXBfaWQgPSBNTFhTV19UUkFQX0lEX0VBUE9MLAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9MTERQLAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9NTVJQLAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9NVlJQLAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9SUFZTVCwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfREhDUCwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfSUdNUF9RVUVSWSwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfSUdNUF9WMV9SRVBPUlQsCi0JfSwKLQl7Ci0JCS5mdW5jID0gbWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywKLQkJLmxvY2FsX3BvcnQgPSBNTFhTV19QT1JUX0RPTlRfQ0FSRSwKLQkJLnRyYXBfaWQgPSBNTFhTV19UUkFQX0lEX0lHTVBfVjJfUkVQT1JULAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9JR01QX1YyX0xFQVZFLAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9JR01QX1YzX1JFUE9SVCwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfQVJQQkMsCi0JfSwKLQl7Ci0JCS5mdW5jID0gbWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywKLQkJLmxvY2FsX3BvcnQgPSBNTFhTV19QT1JUX0RPTlRfQ0FSRSwKLQkJLnRyYXBfaWQgPSBNTFhTV19UUkFQX0lEX0FSUFVDLAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9JUDJNRSwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfUlRSX0lOR1JFU1MwLAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9IT1NUX01JU1NfSVBWNCwKLQl9LAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBTVFAsIFRSQVBfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgTEFDUCwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBFQVBPTCwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBMTERQLCBUUkFQX1RPX0NQVSksCisJTUxYU1dfU1BfUlhMKG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsIE1NUlAsIFRSQVBfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgTVZSUCwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBSUFZTVCwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9tYXJrX2Z1bmMsIERIQ1AsIE1JUlJPUl9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9tYXJrX2Z1bmMsIElHTVBfUVVFUlksIE1JUlJPUl9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBJR01QX1YxX1JFUE9SVCwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBJR01QX1YyX1JFUE9SVCwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBJR01QX1YyX0xFQVZFLCBUUkFQX1RPX0NQVSksCisJTUxYU1dfU1BfUlhMKG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsIElHTVBfVjNfUkVQT1JULCBUUkFQX1RPX0NQVSksCisJTUxYU1dfU1BfUlhMKG1seHN3X3NwX3J4X2xpc3RlbmVyX21hcmtfZnVuYywgQVJQQkMsIE1JUlJPUl9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9tYXJrX2Z1bmMsIEFSUFVDLCBNSVJST1JfVE9fQ1BVKSwKKwkvKiBMMyB0cmFwcyAqLworCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBNVFVFUlJPUiwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBUVExFUlJPUiwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBMQkVSUk9SLCBUUkFQX1RPX0NQVSksCisJTUxYU1dfU1BfUlhMKG1seHN3X3NwX3J4X2xpc3RlbmVyX21hcmtfZnVuYywgT1NQRiwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBJUDJNRSwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBSVFJfSU5HUkVTUzAsIFRSQVBfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgSE9TVF9NSVNTX0lQVjQsIFRSQVBfVE9fQ1BVKSwKIH07CiAKIHN0YXRpYyBpbnQgbWx4c3dfc3BfdHJhcHNfaW5pdChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQpAQCAtMjcwMCw3ICsyNzk5LDcgQEAKIAkJaWYgKGVycikKIAkJCWdvdG8gZXJyX3J4X2xpc3RlbmVyX3JlZ2lzdGVyOwogCi0JCW1seHN3X3JlZ19ocGt0X3BhY2soaHBrdF9wbCwgTUxYU1dfUkVHX0hQS1RfQUNUSU9OX1RSQVBfVE9fQ1BVLAorCQltbHhzd19yZWdfaHBrdF9wYWNrKGhwa3RfcGwsIG1seHN3X3NwX3J4X2xpc3RlbmVyW2ldLmFjdGlvbiwKIAkJCQkgICAgbWx4c3dfc3BfcnhfbGlzdGVuZXJbaV0udHJhcF9pZCk7CiAJCWVyciA9IG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKGhwa3QpLCBocGt0X3BsKTsKIAkJaWYgKGVycikKQEAgLTI3ODgsNyArMjg4Nyw5IEBACiAKIHN0YXRpYyBpbnQgbWx4c3dfc3BfbGFnX2luaXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKIHsKKwlzdHJ1Y3QgbWx4c3dfcmVzb3VyY2VzICpyZXNvdXJjZXM7CiAJY2hhciBzbGNyX3BsW01MWFNXX1JFR19TTENSX0xFTl07CisJaW50IGVycjsKIAogCW1seHN3X3JlZ19zbGNyX3BhY2soc2xjcl9wbCwgTUxYU1dfUkVHX1NMQ1JfTEFHX0hBU0hfU01BQyB8CiAJCQkJICAgICBNTFhTV19SRUdfU0xDUl9MQUdfSEFTSF9ETUFDIHwKQEAgLTI3OTksNyArMjkwMCwyNiBAQAogCQkJCSAgICAgTUxYU1dfUkVHX1NMQ1JfTEFHX0hBU0hfU1BPUlQgfAogCQkJCSAgICAgTUxYU1dfUkVHX1NMQ1JfTEFHX0hBU0hfRFBPUlQgfAogCQkJCSAgICAgTUxYU1dfUkVHX1NMQ1JfTEFHX0hBU0hfSVBQUk9UTyk7Ci0JcmV0dXJuIG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHNsY3IpLCBzbGNyX3BsKTsKKwllcnIgPSBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhzbGNyKSwgc2xjcl9wbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisJaWYgKCEocmVzb3VyY2VzLT5tYXhfbGFnX3ZhbGlkICYmIHJlc291cmNlcy0+bWF4X3BvcnRzX2luX2xhZ192YWxpZCkpCisJCXJldHVybiAtRUlPOworCisJbWx4c3dfc3AtPmxhZ3MgPSBrY2FsbG9jKHJlc291cmNlcy0+bWF4X2xhZywKKwkJCQkgc2l6ZW9mKHN0cnVjdCBtbHhzd19zcF91cHBlciksCisJCQkJIEdGUF9LRVJORUwpOworCWlmICghbWx4c3dfc3AtPmxhZ3MpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1seHN3X3NwX2xhZ19maW5pKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCit7CisJa2ZyZWUobWx4c3dfc3AtPmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IG1seHN3X3NwX2luaXQoc3RydWN0IG1seHN3X2NvcmUgKm1seHN3X2NvcmUsCkBAIC0yODgzLDYgKzMwMDMsNyBAQAogZXJyX3JvdXRlcl9pbml0OgogCW1seHN3X3NwX3N3aXRjaGRldl9maW5pKG1seHN3X3NwKTsKIGVycl9zd2l0Y2hkZXZfaW5pdDoKKwltbHhzd19zcF9sYWdfZmluaShtbHhzd19zcCk7CiBlcnJfbGFnX2luaXQ6CiAJbWx4c3dfc3BfYnVmZmVyc19maW5pKG1seHN3X3NwKTsKIGVycl9idWZmZXJzX2luaXQ6CkBAIC0yODk2LDM4ICszMDE3LDI2IEBACiBzdGF0aWMgdm9pZCBtbHhzd19zcF9maW5pKHN0cnVjdCBtbHhzd19jb3JlICptbHhzd19jb3JlKQogewogCXN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AgPSBtbHhzd19jb3JlX2RyaXZlcl9wcml2KG1seHN3X2NvcmUpOwotCWludCBpOwogCiAJbWx4c3dfc3BfcG9ydHNfcmVtb3ZlKG1seHN3X3NwKTsKIAltbHhzd19zcF9zcGFuX2ZpbmkobWx4c3dfc3ApOwogCW1seHN3X3NwX3JvdXRlcl9maW5pKG1seHN3X3NwKTsKIAltbHhzd19zcF9zd2l0Y2hkZXZfZmluaShtbHhzd19zcCk7CisJbWx4c3dfc3BfbGFnX2ZpbmkobWx4c3dfc3ApOwogCW1seHN3X3NwX2J1ZmZlcnNfZmluaShtbHhzd19zcCk7CiAJbWx4c3dfc3BfdHJhcHNfZmluaShtbHhzd19zcCk7CiAJbWx4c3dfc3BfZXZlbnRfdW5yZWdpc3RlcihtbHhzd19zcCwgTUxYU1dfVFJBUF9JRF9QVURFKTsKIAlXQVJOX09OKCFsaXN0X2VtcHR5KCZtbHhzd19zcC0+dmZpZHMubGlzdCkpOwogCVdBUk5fT04oIWxpc3RfZW1wdHkoJm1seHN3X3NwLT5maWRzKSk7Ci0JZm9yIChpID0gMDsgaSA8IE1MWFNXX1NQX1JJRl9NQVg7IGkrKykKLQkJV0FSTl9PTl9PTkNFKG1seHN3X3NwLT5yaWZzW2ldKTsKIH0KIAogc3RhdGljIHN0cnVjdCBtbHhzd19jb25maWdfcHJvZmlsZSBtbHhzd19zcF9jb25maWdfcHJvZmlsZSA9IHsKIAkudXNlZF9tYXhfdmVwYV9jaGFubmVscwkJPSAxLAogCS5tYXhfdmVwYV9jaGFubmVscwkJPSAwLAotCS51c2VkX21heF9sYWcJCQk9IDEsCi0JLm1heF9sYWcJCQk9IE1MWFNXX1NQX0xBR19NQVgsCi0JLnVzZWRfbWF4X3BvcnRfcGVyX2xhZwkJPSAxLAotCS5tYXhfcG9ydF9wZXJfbGFnCQk9IE1MWFNXX1NQX1BPUlRfUEVSX0xBR19NQVgsCiAJLnVzZWRfbWF4X21pZAkJCT0gMSwKIAkubWF4X21pZAkJCT0gTUxYU1dfU1BfTUlEX01BWCwKIAkudXNlZF9tYXhfcGd0CQkJPSAxLAogCS5tYXhfcGd0CQkJPSAwLAotCS51c2VkX21heF9zeXN0ZW1fcG9ydAkJPSAxLAotCS5tYXhfc3lzdGVtX3BvcnQJCT0gNjQsCi0JLnVzZWRfbWF4X3ZsYW5fZ3JvdXBzCQk9IDEsCi0JLm1heF92bGFuX2dyb3VwcwkJPSAxMjcsCi0JLnVzZWRfbWF4X3JlZ2lvbnMJCT0gMSwKLQkubWF4X3JlZ2lvbnMJCQk9IDQwMCwKIAkudXNlZF9mbG9vZF90YWJsZXMJCT0gMSwKIAkudXNlZF9mbG9vZF9tb2RlCQk9IDEsCiAJLmZsb29kX21vZGUJCQk9IDMsCkBAIC0yOTM5LDEwICszMDQ4LDExIEBACiAJLm1heF9pYl9tYwkJCT0gMCwKIAkudXNlZF9tYXhfcGtleQkJCT0gMSwKIAkubWF4X3BrZXkJCQk9IDAsCi0JLnVzZWRfa3ZkX3NpemVzCQkJPSAxLAorCS51c2VkX2t2ZF9zcGxpdF9kYXRhCQk9IDEsCisJLmt2ZF9oYXNoX2dyYW51bGFyaXR5CQk9IE1MWFNXX1NQX0tWRF9HUkFOVUxBUklUWSwKKwkua3ZkX2hhc2hfc2luZ2xlX3BhcnRzCQk9IDIsCisJLmt2ZF9oYXNoX2RvdWJsZV9wYXJ0cwkJPSAxLAogCS5rdmRfbGluZWFyX3NpemUJCT0gTUxYU1dfU1BfS1ZEX0xJTkVBUl9TSVpFLAotCS5rdmRfaGFzaF9zaW5nbGVfc2l6ZQkJPSBNTFhTV19TUF9LVkRfSEFTSF9TSU5HTEVfU0laRSwKLQkua3ZkX2hhc2hfZG91YmxlX3NpemUJCT0gTUxYU1dfU1BfS1ZEX0hBU0hfRE9VQkxFX1NJWkUsCiAJLnN3aWRfY29uZmlnCQkJPSB7CiAJCXsKIAkJCS51c2VkX3R5cGUJPSAxLApAQCAtMzA1OSwxMyArMzE2OSwxNSBAQAogCiBzdGF0aWMgaW50IG1seHN3X3NwX2F2YWlsX3JpZl9nZXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKIHsKKwlzdHJ1Y3QgbWx4c3dfcmVzb3VyY2VzICpyZXNvdXJjZXM7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUxYU1dfU1BfUklGX01BWDsgaSsrKQorCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisJZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy0+bWF4X3JpZjsgaSsrKQogCQlpZiAoIW1seHN3X3NwLT5yaWZzW2ldKQogCQkJcmV0dXJuIGk7CiAKLQlyZXR1cm4gTUxYU1dfU1BfUklGX01BWDsKKwlyZXR1cm4gTUxYU1dfU1BfSU5WQUxJRF9SSUY7CiB9CiAKIHN0YXRpYyB2b2lkIG1seHN3X3NwX3Zwb3J0X3JpZl9zcF9hdHRyX2dldChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfdnBvcnQsCkBAIC0zMTQ1LDcgKzMyNTcsNyBAQAogCWludCBlcnI7CiAKIAlyaWYgPSBtbHhzd19zcF9hdmFpbF9yaWZfZ2V0KG1seHN3X3NwKTsKLQlpZiAocmlmID09IE1MWFNXX1NQX1JJRl9NQVgpCisJaWYgKHJpZiA9PSBNTFhTV19TUF9JTlZBTElEX1JJRikKIAkJcmV0dXJuIEVSUl9QVFIoLUVSQU5HRSk7CiAKIAllcnIgPSBtbHhzd19zcF92cG9ydF9yaWZfc3Bfb3AobWx4c3dfc3BfdnBvcnQsIGwzX2RldiwgcmlmLCB0cnVlKTsKQEAgLTMzMTEsNiArMzQyMywzOSBAQAogCXJldHVybiBtbHhzd19zcF9maWRfZmluZChtbHhzd19zcCwgZmlkKTsKIH0KIAorc3RhdGljIGVudW0gbWx4c3dfZmxvb2RfdGFibGVfdHlwZSBtbHhzd19zcF9mbG9vZF90YWJsZV90eXBlX2dldCh1MTYgZmlkKQoreworCXJldHVybiBtbHhzd19zcF9maWRfaXNfdmZpZChmaWQpID8gTUxYU1dfUkVHX1NGR0NfVEFCTEVfVFlQRV9GSUQgOgorCSAgICAgICBNTFhTV19SRUdfU0ZHQ19UQUJMRV9UWVBFX0ZJRF9PRkZFU1Q7Cit9CisKK3N0YXRpYyB1MTYgbWx4c3dfc3BfZmxvb2RfdGFibGVfaW5kZXhfZ2V0KHUxNiBmaWQpCit7CisJcmV0dXJuIG1seHN3X3NwX2ZpZF9pc192ZmlkKGZpZCkgPyBtbHhzd19zcF9maWRfdG9fdmZpZChmaWQpIDogZmlkOworfQorCitzdGF0aWMgaW50IG1seHN3X3NwX3JvdXRlcl9wb3J0X2Zsb29kX3NldChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLCB1MTYgZmlkLAorCQkJCQkgIGJvb2wgc2V0KQoreworCWVudW0gbWx4c3dfZmxvb2RfdGFibGVfdHlwZSB0YWJsZV90eXBlOworCWNoYXIgKnNmdHJfcGw7CisJdTE2IGluZGV4OworCWludCBlcnI7CisKKwlzZnRyX3BsID0ga21hbGxvYyhNTFhTV19SRUdfU0ZUUl9MRU4sIEdGUF9LRVJORUwpOworCWlmICghc2Z0cl9wbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0YWJsZV90eXBlID0gbWx4c3dfc3BfZmxvb2RfdGFibGVfdHlwZV9nZXQoZmlkKTsKKwlpbmRleCA9IG1seHN3X3NwX2Zsb29kX3RhYmxlX2luZGV4X2dldChmaWQpOworCW1seHN3X3JlZ19zZnRyX3BhY2soc2Z0cl9wbCwgTUxYU1dfU1BfRkxPT0RfVEFCTEVfQk0sIGluZGV4LCB0YWJsZV90eXBlLAorCQkJICAgIDEsIE1MWFNXX1BPUlRfUk9VVEVSX1BPUlQsIHNldCk7CisJZXJyID0gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcoc2Z0ciksIHNmdHJfcGwpOworCisJa2ZyZWUoc2Z0cl9wbCk7CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGVudW0gbWx4c3dfcmVnX3JpdHJfaWZfdHlwZSBtbHhzd19zcF9yaWZfdHlwZV9nZXQodTE2IGZpZCkKIHsKIAlpZiAobWx4c3dfc3BfZmlkX2lzX3ZmaWQoZmlkKSkKQEAgLTMzNDQsMTIgKzM0ODksMTYgQEAKIAlpbnQgZXJyOwogCiAJcmlmID0gbWx4c3dfc3BfYXZhaWxfcmlmX2dldChtbHhzd19zcCk7Ci0JaWYgKHJpZiA9PSBNTFhTV19TUF9SSUZfTUFYKQorCWlmIChyaWYgPT0gTUxYU1dfU1BfSU5WQUxJRF9SSUYpCiAJCXJldHVybiAtRVJBTkdFOwogCisJZXJyID0gbWx4c3dfc3Bfcm91dGVyX3BvcnRfZmxvb2Rfc2V0KG1seHN3X3NwLCBmLT5maWQsIHRydWUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKIAllcnIgPSBtbHhzd19zcF9yaWZfYnJpZGdlX29wKG1seHN3X3NwLCBsM19kZXYsIGYtPmZpZCwgcmlmLCB0cnVlKTsKIAlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCQlnb3RvIGVycl9yaWZfYnJpZGdlX29wOwogCiAJZXJyID0gbWx4c3dfc3BfcmlmX2ZkYl9vcChtbHhzd19zcCwgbDNfZGV2LT5kZXZfYWRkciwgZi0+ZmlkLCB0cnVlKTsKIAlpZiAoZXJyKQpAQCAtMzM3Miw2ICszNTIxLDggQEAKIAltbHhzd19zcF9yaWZfZmRiX29wKG1seHN3X3NwLCBsM19kZXYtPmRldl9hZGRyLCBmLT5maWQsIGZhbHNlKTsKIGVycl9yaWZfZmRiX29wOgogCW1seHN3X3NwX3JpZl9icmlkZ2Vfb3AobWx4c3dfc3AsIGwzX2RldiwgZi0+ZmlkLCByaWYsIGZhbHNlKTsKK2Vycl9yaWZfYnJpZGdlX29wOgorCW1seHN3X3NwX3JvdXRlcl9wb3J0X2Zsb29kX3NldChtbHhzd19zcCwgZi0+ZmlkLCBmYWxzZSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMzM5MSw2ICszNTQyLDggQEAKIAogCW1seHN3X3NwX3JpZl9icmlkZ2Vfb3AobWx4c3dfc3AsIGwzX2RldiwgZi0+ZmlkLCByaWYsIGZhbHNlKTsKIAorCW1seHN3X3NwX3JvdXRlcl9wb3J0X2Zsb29kX3NldChtbHhzd19zcCwgZi0+ZmlkLCBmYWxzZSk7CisKIAluZXRkZXZfZGJnKGwzX2RldiwgIlJJRj0lZCBkZXN0cm95ZWRcbiIsIHJpZik7CiB9CiAKQEAgLTM1NDMsMTIgKzM2OTYsMTQgQEAKIAlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7CiAJdTggbG9jYWxfcG9ydCA9IG1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQ7CiAJdTE2IGxhZ19pZCA9IG1seHN3X3NwX3BvcnQtPmxhZ19pZDsKKwlzdHJ1Y3QgbWx4c3dfcmVzb3VyY2VzICpyZXNvdXJjZXM7CiAJaW50IGksIGNvdW50ID0gMDsKIAogCWlmICghbWx4c3dfc3BfcG9ydC0+bGFnZ2VkKQogCQlyZXR1cm4gdHJ1ZTsKIAotCWZvciAoaSA9IDA7IGkgPCBNTFhTV19TUF9QT1JUX1BFUl9MQUdfTUFYOyBpKyspIHsKKwlyZXNvdXJjZXMgPSBtbHhzd19jb3JlX3Jlc291cmNlc19nZXQobWx4c3dfc3AtPmNvcmUpOworCWZvciAoaSA9IDA7IGkgPCByZXNvdXJjZXMtPm1heF9wb3J0c19pbl9sYWc7IGkrKykgewogCQlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbGFnX3BvcnQ7CiAKIAkJbGFnX3BvcnQgPSBtbHhzd19zcF9wb3J0X2xhZ2dlZF9nZXQobWx4c3dfc3AsIGxhZ19pZCwgaSk7CkBAIC0zNzU0LDExICszOTA5LDEzIEBACiAJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqbGFnX2RldiwKIAkJCQkgIHUxNiAqcF9sYWdfaWQpCiB7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOwogCXN0cnVjdCBtbHhzd19zcF91cHBlciAqbGFnOwogCWludCBmcmVlX2xhZ19pZCA9IC0xOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1MWFNXX1NQX0xBR19NQVg7IGkrKykgeworCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisJZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy0+bWF4X2xhZzsgaSsrKSB7CiAJCWxhZyA9IG1seHN3X3NwX2xhZ19nZXQobWx4c3dfc3AsIGkpOwogCQlpZiAobGFnLT5yZWZfY291bnQpIHsKIAkJCWlmIChsYWctPmRldiA9PSBsYWdfZGV2KSB7CkBAIC0zNzkyLDkgKzM5NDksMTEgQEAKIHN0YXRpYyBpbnQgbWx4c3dfc3BfcG9ydF9sYWdfaW5kZXhfZ2V0KHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AsCiAJCQkJICAgICAgIHUxNiBsYWdfaWQsIHU4ICpwX3BvcnRfaW5kZXgpCiB7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1MWFNXX1NQX1BPUlRfUEVSX0xBR19NQVg7IGkrKykgeworCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisJZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy0+bWF4X3BvcnRzX2luX2xhZzsgaSsrKSB7CiAJCWlmICghbWx4c3dfc3BfcG9ydF9sYWdnZWRfZ2V0KG1seHN3X3NwLCBsYWdfaWQsIGkpKSB7CiAJCQkqcF9wb3J0X2luZGV4ID0gaTsKIAkJCXJldHVybiAwOwpAQCAtNDQ4NywxOCArNDY0NiwyNiBAQAogCS5wcmlvcml0eSA9IDEwLAkvKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgRklCIG5vdGlmaWVyIGJsb2NrICovCiB9OwogCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG1seHN3X3NwX3JvdXRlcl9uZXRldmVudF9uYiBfX3JlYWRfbW9zdGx5ID0geworCS5ub3RpZmllcl9jYWxsID0gbWx4c3dfc3Bfcm91dGVyX25ldGV2ZW50X2V2ZW50LAorfTsKKwogc3RhdGljIGludCBfX2luaXQgbWx4c3dfc3BfbW9kdWxlX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyOwogCiAJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZtbHhzd19zcF9uZXRkZXZpY2VfbmIpOwogCXJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZtbHhzd19zcF9pbmV0YWRkcl9uYik7CisJcmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXIoJm1seHN3X3NwX3JvdXRlcl9uZXRldmVudF9uYik7CisKIAllcnIgPSBtbHhzd19jb3JlX2RyaXZlcl9yZWdpc3RlcigmbWx4c3dfc3BfZHJpdmVyKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9jb3JlX2RyaXZlcl9yZWdpc3RlcjsKIAlyZXR1cm4gMDsKIAogZXJyX2NvcmVfZHJpdmVyX3JlZ2lzdGVyOgorCXVucmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXIoJm1seHN3X3NwX3JvdXRlcl9uZXRldmVudF9uYik7CisJdW5yZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmbWx4c3dfc3BfaW5ldGFkZHJfbmIpOwogCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZtbHhzd19zcF9uZXRkZXZpY2VfbmIpOwogCXJldHVybiBlcnI7CiB9CkBAIC00NTA2LDYgKzQ2NzMsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IG1seHN3X3NwX21vZHVsZV9leGl0KHZvaWQpCiB7CiAJbWx4c3dfY29yZV9kcml2ZXJfdW5yZWdpc3RlcigmbWx4c3dfc3BfZHJpdmVyKTsKKwl1bnJlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyKCZtbHhzd19zcF9yb3V0ZXJfbmV0ZXZlbnRfbmIpOwogCXVucmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoJm1seHN3X3NwX2luZXRhZGRyX25iKTsKIAl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbWx4c3dfc3BfbmV0ZGV2aWNlX25iKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bS5oCmluZGV4IGY2OWFhMzcuLjliMjI4NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW0uaApAQCAtNDUsNyArNDUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9kY2JubC5oPgogI2luY2x1ZGUgPGxpbnV4L2luNi5oPgotI2luY2x1ZGUgPG5ldC9zd2l0Y2hkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogCiAjaW5jbHVkZSAicG9ydC5oIgogI2luY2x1ZGUgImNvcmUuaCIKQEAgLTU0LDEwICs1NCw3IEBACiAjZGVmaW5lIE1MWFNXX1NQX1ZGSURfTUFYIDY2NTYJLyogQnJpZGdlZCBWTEFOIGludGVyZmFjZXMgKi8KIAogI2RlZmluZSBNTFhTV19TUF9SRklEX0JBU0UgMTUzNjAKLSNkZWZpbmUgTUxYU1dfU1BfUklGX01BWCA4MDAKLQotI2RlZmluZSBNTFhTV19TUF9MQUdfTUFYIDY0Ci0jZGVmaW5lIE1MWFNXX1NQX1BPUlRfUEVSX0xBR19NQVggMTYKKyNkZWZpbmUgTUxYU1dfU1BfSU5WQUxJRF9SSUYgMHhmZmZmCiAKICNkZWZpbmUgTUxYU1dfU1BfTUlEX01BWCA3MDAwCiAKQEAgLTY3LDggKzY0LDYgQEAKICNkZWZpbmUgTUxYU1dfU1BfTFBNX1RSRUVfTUFYIDIyCiAjZGVmaW5lIE1MWFNXX1NQX0xQTV9UUkVFX0NPVU5UIChNTFhTV19TUF9MUE1fVFJFRV9NQVggLSBNTFhTV19TUF9MUE1fVFJFRV9NSU4pCiAKLSNkZWZpbmUgTUxYU1dfU1BfVklSVFVBTF9ST1VURVJfTUFYIDI1NgotCiAjZGVmaW5lIE1MWFNXX1NQX1BPUlRfQkFTRV9TUEVFRCAyNTAwMAkvKiBNYi9zICovCiAKICNkZWZpbmUgTUxYU1dfU1BfQllURVNfUEVSX0NFTEwgOTYKQEAgLTc3LDggKzcyLDcgQEAKICNkZWZpbmUgTUxYU1dfU1BfQ0VMTFNfVE9fQllURVMoYykgKGMgKiBNTFhTV19TUF9CWVRFU19QRVJfQ0VMTCkKIAogI2RlZmluZSBNTFhTV19TUF9LVkRfTElORUFSX1NJWkUgNjU1MzYgLyogZW50cmllcyAqLwotI2RlZmluZSBNTFhTV19TUF9LVkRfSEFTSF9TSU5HTEVfU0laRSAxNjM4NDAgLyogZW50cmllcyAqLwotI2RlZmluZSBNTFhTV19TUF9LVkRfSEFTSF9ET1VCTEVfU0laRSAzMjc2OCAvKiBlbnRyaWVzICovCisjZGVmaW5lIE1MWFNXX1NQX0tWRF9HUkFOVUxBUklUWSAxMjgKIAogLyogTWF4aW11bSBkZWxheSBidWZmZXIgbmVlZGVkIGluIGNhc2Ugb2YgUEFVU0UgZnJhbWVzLCBpbiBjZWxscy4KICAqIEFzc3VtZXMgMTAwbSBjYWJsZSBhbmQgbWF4aW11bSBNVFUuCkBAIC0yNTMsNyArMjQ3LDcgQEAKIAogc3RydWN0IG1seHN3X3NwX3JvdXRlciB7CiAJc3RydWN0IG1seHN3X3NwX2xwbV90cmVlIGxwbV90cmVlc1tNTFhTV19TUF9MUE1fVFJFRV9DT1VOVF07Ci0Jc3RydWN0IG1seHN3X3NwX3ZyIHZyc1tNTFhTV19TUF9WSVJUVUFMX1JPVVRFUl9NQVhdOworCXN0cnVjdCBtbHhzd19zcF92ciAqdnJzOwogCXN0cnVjdCByaGFzaHRhYmxlIG5laWdoX2h0OwogCXN0cnVjdCB7CiAJCXN0cnVjdCBkZWxheWVkX3dvcmsgZHc7CkBAIC0yNjMsNiArMjU3LDcgQEAKICNkZWZpbmUgTUxYU1dfU1BfVU5SRVNPTFZFRF9OSF9QUk9CRV9JTlRFUlZBTCA1MDAwIC8qIG1zICovCiAJc3RydWN0IGxpc3RfaGVhZCBuZXh0aG9wX2dyb3VwX2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBuZXh0aG9wX25laWdoc19saXN0OworCWJvb2wgYWJvcnRlZDsKIH07CiAKIHN0cnVjdCBtbHhzd19zcCB7CkBAIC0yNzUsNyArMjcwLDcgQEAKIAkJREVDTEFSRV9CSVRNQVAobWFwcGVkLCBNTFhTV19TUF9NSURfTUFYKTsKIAl9IGJyX21pZHM7CiAJc3RydWN0IGxpc3RfaGVhZCBmaWRzOwkvKiBWTEFOLWF3YXJlIGJyaWRnZSBGSURzICovCi0Jc3RydWN0IG1seHN3X3NwX3JpZiAqcmlmc1tNTFhTV19TUF9SSUZfTUFYXTsKKwlzdHJ1Y3QgbWx4c3dfc3BfcmlmICoqcmlmczsKIAlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqKnBvcnRzOwogCXN0cnVjdCBtbHhzd19jb3JlICpjb3JlOwogCWNvbnN0IHN0cnVjdCBtbHhzd19idXNfaW5mbyAqYnVzX2luZm87CkBAIC0yOTAsNyArMjg1LDcgQEAKICNkZWZpbmUgTUxYU1dfU1BfREVGQVVMVF9BR0VJTkdfVElNRSAzMDAKIAl1MzIgYWdlaW5nX3RpbWU7CiAJc3RydWN0IG1seHN3X3NwX3VwcGVyIG1hc3Rlcl9icmlkZ2U7Ci0Jc3RydWN0IG1seHN3X3NwX3VwcGVyIGxhZ3NbTUxYU1dfU1BfTEFHX01BWF07CisJc3RydWN0IG1seHN3X3NwX3VwcGVyICpsYWdzOwogCXU4IHBvcnRfdG9fbW9kdWxlW01MWFNXX1BPUlRfTUFYX1BPUlRTXTsKIAlzdHJ1Y3QgbWx4c3dfc3Bfc2Igc2I7CiAJc3RydWN0IG1seHN3X3NwX3JvdXRlciByb3V0ZXI7CkBAIC0zMDIsNiArMjk3LDcgQEAKIAkJc3RydWN0IG1seHN3X3NwX3NwYW5fZW50cnkgKmVudHJpZXM7CiAJCWludCBlbnRyaWVzX2NvdW50OwogCX0gc3BhbjsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZmliX25iOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbWx4c3dfc3BfdXBwZXIgKgpAQCAtMzQxLDcgKzMzNyw4IEBACiAJfSB2cG9ydDsKIAlzdHJ1Y3QgewogCQl1OCB0eF9wYXVzZToxLAotCQkgICByeF9wYXVzZToxOworCQkgICByeF9wYXVzZToxLAorCQkgICBhdXRvbmVnOjE7CiAJfSBsaW5rOwogCXN0cnVjdCB7CiAJCXN0cnVjdCBpZWVlX2V0cyAqZXRzOwpAQCAtMzYwLDYgKzM1NywxMSBAQAogCXN0cnVjdCBsaXN0X2hlYWQgdnBvcnRzX2xpc3Q7CiAJLyogVEMgaGFuZGxlcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbWFsbF90Y19saXN0OworCXN0cnVjdCB7CisJCSNkZWZpbmUgTUxYU1dfSFdfU1RBVFNfVVBEQVRFX1RJTUUgSFoKKwkJc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpjYWNoZTsKKwkJc3RydWN0IGRlbGF5ZWRfd29yayB1cGRhdGVfZHc7CisJfSBod19zdGF0czsKIH07CiAKIHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0X2xvd2VyX2Rldl9ob2xkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpAQCAtNDc3LDkgKzQ3OSwxMiBAQAogbWx4c3dfc3BfcmlmX2ZpbmRfYnlfZGV2KGNvbnN0IHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AsCiAJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgbWx4c3dfcmVzb3VyY2VzICpyZXNvdXJjZXM7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUxYU1dfU1BfUklGX01BWDsgaSsrKQorCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2VzLT5tYXhfcmlmOyBpKyspCiAJCWlmIChtbHhzd19zcC0+cmlmc1tpXSAmJiBtbHhzd19zcC0+cmlmc1tpXS0+ZGV2ID09IGRldikKIAkJCXJldHVybiBtbHhzd19zcC0+cmlmc1tpXTsKIApAQCAtNTM2LDggKzU0MSw2IEBACiAJCQkJIHUxNiB2aWQpOwogaW50IG1seHN3X3NwX3BvcnRfdmxhbl9zZXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsIHUxNiB2aWRfYmVnaW4sCiAJCQkgICB1MTYgdmlkX2VuZCwgYm9vbCBpc19tZW1iZXIsIGJvb2wgdW50YWdnZWQpOwotaW50IG1seHN3X3NwX3BvcnRfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX2JlMTYgX19hbHdheXNfdW51c2VkIHByb3RvLAotCQkJICB1MTYgdmlkKTsKIGludCBtbHhzd19zcF92cG9ydF9mbG9vZF9zZXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3Zwb3J0LCB1MTYgZmlkLAogCQkJICAgICBib29sIHNldCk7CiB2b2lkIG1seHN3X3NwX3BvcnRfYWN0aXZlX3ZsYW5zX2RlbChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCk7CkBAIC01NjAsNiArNTYzLDkgQEAKIGludCBtbHhzd19zcF9wb3J0X2V0c19tYXhyYXRlX3NldChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKIAkJCQkgIGVudW0gbWx4c3dfcmVnX3FlZWNfaHIgaHIsIHU4IGluZGV4LAogCQkJCSAgdTggbmV4dF9pbmRleCwgdTMyIG1heHJhdGUpOworaW50IF9fbWx4c3dfc3BfcG9ydF92aWRfbGVhcm5pbmdfc2V0KHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0LAorCQkJCSAgICAgdTE2IHZpZF9iZWdpbiwgdTE2IHZpZF9lbmQsCisJCQkJICAgICBib29sIGxlYXJuX2VuYWJsZSk7CiAKICNpZmRlZiBDT05GSUdfTUxYU1dfU1BFQ1RSVU1fRENCCiAKQEAgLTU4MCwxNSArNTg2LDEyIEBACiAKIGludCBtbHhzd19zcF9yb3V0ZXJfaW5pdChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKTsKIHZvaWQgbWx4c3dfc3Bfcm91dGVyX2Zpbmkoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCk7Ci1pbnQgbWx4c3dfc3Bfcm91dGVyX2ZpYjRfYWRkKHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0LAotCQkJICAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9pcHY0X2ZpYiAqZmliNCwKLQkJCSAgICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpOwotaW50IG1seHN3X3NwX3JvdXRlcl9maWI0X2RlbChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKLQkJCSAgICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgKmZpYjQpOwogaW50IG1seHN3X3NwX3JvdXRlcl9uZWlnaF9jb25zdHJ1Y3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICAgc3RydWN0IG5laWdoYm91ciAqbik7CiB2b2lkIG1seHN3X3NwX3JvdXRlcl9uZWlnaF9kZXN0cm95KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICAgc3RydWN0IG5laWdoYm91ciAqbik7CitpbnQgbWx4c3dfc3Bfcm91dGVyX25ldGV2ZW50X2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cik7CiAKIGludCBtbHhzd19zcF9rdmRsX2FsbG9jKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AsIHVuc2lnbmVkIGludCBlbnRyeV9jb3VudCk7CiB2b2lkIG1seHN3X3NwX2t2ZGxfZnJlZShzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLCBpbnQgZW50cnlfaW5kZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fYnVmZmVycy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fYnVmZmVycy5jCmluZGV4IDA3NGNkZGEuLmJjYWVkOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtX2J1ZmZlcnMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bV9idWZmZXJzLmMKQEAgLTMzMCw3ICszMzAsNyBAQAogCU1MWFNXX1NQX0NQVV9QT1JUX1NCX0NNLAogCU1MWFNXX1NQX0NQVV9QT1JUX1NCX0NNLAogCU1MWFNXX1NQX0NQVV9QT1JUX1NCX0NNLAotCU1MWFNXX1NQX0NQVV9QT1JUX1NCX0NNLAorCU1MWFNXX1NQX1NCX0NNKE1MWFNXX1NQX0JZVEVTX1RPX0NFTExTKDEwMDAwKSwgMCwgMCksCiAJTUxYU1dfU1BfQ1BVX1BPUlRfU0JfQ00sCiAJTUxYU1dfU1BfQ1BVX1BPUlRfU0JfQ00sCiAJTUxYU1dfU1BfQ1BVX1BPUlRfU0JfQ00sCkBAIC01OTUsOSArNTk1LDkgQEAKIAllbnVtIG1seHN3X3JlZ19zYnh4X2RpciBkaXIgPSBkaXJfZ2V0KHBvb2xfaW5kZXgpOwogCXN0cnVjdCBtbHhzd19zcF9zYl9wciAqcHIgPSBtbHhzd19zcF9zYl9wcl9nZXQobWx4c3dfc3AsIHBvb2wsIGRpcik7CiAKLQlwb29sX2luZm8tPnBvb2xfdHlwZSA9IGRpcjsKKwlwb29sX2luZm8tPnBvb2xfdHlwZSA9IChlbnVtIGRldmxpbmtfc2JfcG9vbF90eXBlKSBkaXI7CiAJcG9vbF9pbmZvLT5zaXplID0gTUxYU1dfU1BfQ0VMTFNfVE9fQllURVMocHItPnNpemUpOwotCXBvb2xfaW5mby0+dGhyZXNob2xkX3R5cGUgPSBwci0+bW9kZTsKKwlwb29sX2luZm8tPnRocmVzaG9sZF90eXBlID0gKGVudW0gZGV2bGlua19zYl90aHJlc2hvbGRfdHlwZSkgcHItPm1vZGU7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYwOCw5ICs2MDgsMTAgQEAKIAlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfY29yZV9kcml2ZXJfcHJpdihtbHhzd19jb3JlKTsKIAl1OCBwb29sID0gcG9vbF9nZXQocG9vbF9pbmRleCk7CiAJZW51bSBtbHhzd19yZWdfc2J4eF9kaXIgZGlyID0gZGlyX2dldChwb29sX2luZGV4KTsKLQllbnVtIG1seHN3X3JlZ19zYnByX21vZGUgbW9kZSA9IHRocmVzaG9sZF90eXBlOwogCXUzMiBwb29sX3NpemUgPSBNTFhTV19TUF9CWVRFU19UT19DRUxMUyhzaXplKTsKKwllbnVtIG1seHN3X3JlZ19zYnByX21vZGUgbW9kZTsKIAorCW1vZGUgPSAoZW51bSBtbHhzd19yZWdfc2Jwcl9tb2RlKSB0aHJlc2hvbGRfdHlwZTsKIAlyZXR1cm4gbWx4c3dfc3Bfc2JfcHJfd3JpdGUobWx4c3dfc3AsIHBvb2wsIGRpciwgbW9kZSwgcG9vbF9zaXplKTsKIH0KIApAQCAtNjk2LDEzICs2OTcsMTMgQEAKIAlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7CiAJdTggbG9jYWxfcG9ydCA9IG1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQ7CiAJdTggcGdfYnVmZiA9IHRjX2luZGV4OwotCWVudW0gbWx4c3dfcmVnX3NieHhfZGlyIGRpciA9IHBvb2xfdHlwZTsKKwllbnVtIG1seHN3X3JlZ19zYnh4X2RpciBkaXIgPSAoZW51bSBtbHhzd19yZWdfc2J4eF9kaXIpIHBvb2xfdHlwZTsKIAlzdHJ1Y3QgbWx4c3dfc3Bfc2JfY20gKmNtID0gbWx4c3dfc3Bfc2JfY21fZ2V0KG1seHN3X3NwLCBsb2NhbF9wb3J0LAogCQkJCQkJICAgICAgIHBnX2J1ZmYsIGRpcik7CiAKIAkqcF90aHJlc2hvbGQgPSBtbHhzd19zcF9zYl90aHJlc2hvbGRfb3V0KG1seHN3X3NwLCBjbS0+cG9vbCwgZGlyLAogCQkJCQkJIGNtLT5tYXhfYnVmZik7Ci0JKnBfcG9vbF9pbmRleCA9IHBvb2xfaW5kZXhfZ2V0KGNtLT5wb29sLCBwb29sX3R5cGUpOworCSpwX3Bvb2xfaW5kZXggPSBwb29sX2luZGV4X2dldChjbS0+cG9vbCwgZGlyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzE2LDIzICs3MTcsMTkgQEAKIAlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7CiAJdTggbG9jYWxfcG9ydCA9IG1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQ7CiAJdTggcGdfYnVmZiA9IHRjX2luZGV4OwotCWVudW0gbWx4c3dfcmVnX3NieHhfZGlyIGRpciA9IHBvb2xfdHlwZTsKLQl1OCBwb29sID0gcG9vbF9pbmRleDsKKwllbnVtIG1seHN3X3JlZ19zYnh4X2RpciBkaXIgPSAoZW51bSBtbHhzd19yZWdfc2J4eF9kaXIpIHBvb2xfdHlwZTsKKwl1OCBwb29sID0gcG9vbF9nZXQocG9vbF9pbmRleCk7CiAJdTMyIG1heF9idWZmOwogCWludCBlcnI7CiAKKwlpZiAoZGlyICE9IGRpcl9nZXQocG9vbF9pbmRleCkpCisJCXJldHVybiAtRUlOVkFMOworCiAJZXJyID0gbWx4c3dfc3Bfc2JfdGhyZXNob2xkX2luKG1seHN3X3NwLCBwb29sLCBkaXIsCiAJCQkJICAgICAgIHRocmVzaG9sZCwgJm1heF9idWZmKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKHBvb2xfdHlwZSA9PSBERVZMSU5LX1NCX1BPT0xfVFlQRV9FR1JFU1MpIHsKLQkJaWYgKHBvb2wgPCBNTFhTV19TUF9TQl9QT09MX0NPVU5UKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXBvb2wgLT0gTUxYU1dfU1BfU0JfUE9PTF9DT1VOVDsKLQl9IGVsc2UgaWYgKHBvb2wgPj0gTUxYU1dfU1BfU0JfUE9PTF9DT1VOVCkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAJcmV0dXJuIG1seHN3X3NwX3NiX2NtX3dyaXRlKG1seHN3X3NwLCBsb2NhbF9wb3J0LCBwZ19idWZmLCBkaXIsCiAJCQkJICAgIDAsIG1heF9idWZmLCBwb29sKTsKIH0KQEAgLTk0Nyw3ICs5NDQsNyBAQAogCXN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AgPSBtbHhzd19zcF9wb3J0LT5tbHhzd19zcDsKIAl1OCBsb2NhbF9wb3J0ID0gbWx4c3dfc3BfcG9ydC0+bG9jYWxfcG9ydDsKIAl1OCBwZ19idWZmID0gdGNfaW5kZXg7Ci0JZW51bSBtbHhzd19yZWdfc2J4eF9kaXIgZGlyID0gcG9vbF90eXBlOworCWVudW0gbWx4c3dfcmVnX3NieHhfZGlyIGRpciA9IChlbnVtIG1seHN3X3JlZ19zYnh4X2RpcikgcG9vbF90eXBlOwogCXN0cnVjdCBtbHhzd19zcF9zYl9jbSAqY20gPSBtbHhzd19zcF9zYl9jbV9nZXQobWx4c3dfc3AsIGxvY2FsX3BvcnQsCiAJCQkJCQkgICAgICAgcGdfYnVmZiwgZGlyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fZGNiLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bV9kY2IuYwppbmRleCAwMWNmYjc1Li5iNmVkN2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bV9kY2IuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bV9kY2IuYwpAQCAtMzQxLDYgKzM0MSw4IEBACiAJY2hhciBwZmNjX3BsW01MWFNXX1JFR19QRkNDX0xFTl07CiAKIAltbHhzd19yZWdfcGZjY19wYWNrKHBmY2NfcGwsIG1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQpOworCW1seHN3X3JlZ19wZmNjX3Bwcnhfc2V0KHBmY2NfcGwsIG1seHN3X3NwX3BvcnQtPmxpbmsucnhfcGF1c2UpOworCW1seHN3X3JlZ19wZmNjX3BwdHhfc2V0KHBmY2NfcGwsIG1seHN3X3NwX3BvcnQtPmxpbmsudHhfcGF1c2UpOwogCW1seHN3X3JlZ19wZmNjX3ByaW9fcGFjayhwZmNjX3BsLCBwZmMtPnBmY19lbik7CiAKIAlyZXR1cm4gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwX3BvcnQtPm1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocGZjYyksCkBAIC0zNTEsMTcgKzM1MywxNyBAQAogCQkJCSAgICAgIHN0cnVjdCBpZWVlX3BmYyAqcGZjKQogewogCXN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlib29sIHBhdXNlX2VuID0gbWx4c3dfc3BfcG9ydF9pc19wYXVzZV9lbihtbHhzd19zcF9wb3J0KTsKIAlpbnQgZXJyOwogCi0JaWYgKChtbHhzd19zcF9wb3J0LT5saW5rLnR4X3BhdXNlIHx8IG1seHN3X3NwX3BvcnQtPmxpbmsucnhfcGF1c2UpICYmCi0JICAgIHBmYy0+cGZjX2VuKSB7CisJaWYgKHBhdXNlX2VuICYmIHBmYy0+cGZjX2VuKSB7CiAJCW5ldGRldl9lcnIoZGV2LCAiUEFVU0UgZnJhbWVzIGFscmVhZHkgZW5hYmxlZCBvbiBwb3J0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJZXJyID0gX19tbHhzd19zcF9wb3J0X2hlYWRyb29tX3NldChtbHhzd19zcF9wb3J0LCBkZXYtPm10dSwKIAkJCQkJICAgbWx4c3dfc3BfcG9ydC0+ZGNiLmV0cy0+cHJpb190YywKLQkJCQkJICAgZmFsc2UsIHBmYyk7CisJCQkJCSAgIHBhdXNlX2VuLCBwZmMpOwogCWlmIChlcnIpIHsKIAkJbmV0ZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY29uZmlndXJlIHBvcnQncyBoZWFkcm9vbSBmb3IgUEZDXG4iKTsKIAkJcmV0dXJuIGVycjsKQEAgLTM4MCw3ICszODIsNyBAQAogCiBlcnJfcG9ydF9wZmNfc2V0OgogCV9fbWx4c3dfc3BfcG9ydF9oZWFkcm9vbV9zZXQobWx4c3dfc3BfcG9ydCwgZGV2LT5tdHUsCi0JCQkJICAgICBtbHhzd19zcF9wb3J0LT5kY2IuZXRzLT5wcmlvX3RjLCBmYWxzZSwKKwkJCQkgICAgIG1seHN3X3NwX3BvcnQtPmRjYi5ldHMtPnByaW9fdGMsIHBhdXNlX2VuLAogCQkJCSAgICAgbWx4c3dfc3BfcG9ydC0+ZGNiLnBmYyk7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtX3JvdXRlci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fcm91dGVyLmMKaW5kZXggODE0MThkNi4uNzhmYzU1N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtX3JvdXRlci5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtX3JvdXRlci5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bmV0L25ldGV2ZW50Lmg+CiAjaW5jbHVkZSA8bmV0L25laWdoYm91ci5oPgogI2luY2x1ZGUgPG5ldC9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvaXBfZmliLmg+CiAKICNpbmNsdWRlICJzcGVjdHJ1bS5oIgogI2luY2x1ZGUgImNvcmUuaCIKQEAgLTEwNyw2ICsxMDgsNyBAQAogfQogCiBzdHJ1Y3QgbWx4c3dfc3BfZmliX2tleSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAl1bnNpZ25lZCBjaGFyIGFkZHJbc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcildOwogCXVuc2lnbmVkIGNoYXIgcHJlZml4X2xlbjsKIH07CkBAIC0xMjEsMTcgKzEyMywyMCBAQAogCiBzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5IHsKIAlzdHJ1Y3Qgcmhhc2hfaGVhZCBodF9ub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgbWx4c3dfc3BfZmliX2tleSBrZXk7CiAJZW51bSBtbHhzd19zcF9maWJfZW50cnlfdHlwZSB0eXBlOwotCXU4IGFkZGVkOjE7CisJdW5zaWduZWQgaW50IHJlZl9jb3VudDsKIAl1MTYgcmlmOyAvKiB1c2VkIGZvciBhY3Rpb24gbG9jYWwgKi8KIAlzdHJ1Y3QgbWx4c3dfc3BfdnIgKnZyOworCXN0cnVjdCBmaWJfaW5mbyAqZmk7CiAJc3RydWN0IGxpc3RfaGVhZCBuZXh0aG9wX2dyb3VwX25vZGU7CiAJc3RydWN0IG1seHN3X3NwX25leHRob3BfZ3JvdXAgKm5oX2dyb3VwOwogfTsKIAogc3RydWN0IG1seHN3X3NwX2ZpYiB7CiAJc3RydWN0IHJoYXNodGFibGUgaHQ7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeV9saXN0OwogCXVuc2lnbmVkIGxvbmcgcHJlZml4X3JlZl9jb3VudFtNTFhTV19TUF9QUkVGSVhfQ09VTlRdOwogCXN0cnVjdCBtbHhzd19zcF9wcmVmaXhfdXNhZ2UgcHJlZml4X3VzYWdlOwogfTsKQEAgLTE1Myw2ICsxNTgsNyBAQAogCQkJCSAgICAgbWx4c3dfc3BfZmliX2h0X3BhcmFtcyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKKwlsaXN0X2FkZF90YWlsKCZmaWJfZW50cnktPmxpc3QsICZmaWItPmVudHJ5X2xpc3QpOwogCWlmIChmaWItPnByZWZpeF9yZWZfY291bnRbcHJlZml4X2xlbl0rKyA9PSAwKQogCQltbHhzd19zcF9wcmVmaXhfdXNhZ2Vfc2V0KCZmaWItPnByZWZpeF91c2FnZSwgcHJlZml4X2xlbik7CiAJcmV0dXJuIDA7CkBAIC0xNjUsMTkgKzE3MSwyMiBAQAogCiAJaWYgKC0tZmliLT5wcmVmaXhfcmVmX2NvdW50W3ByZWZpeF9sZW5dID09IDApCiAJCW1seHN3X3NwX3ByZWZpeF91c2FnZV9jbGVhcigmZmliLT5wcmVmaXhfdXNhZ2UsIHByZWZpeF9sZW4pOworCWxpc3RfZGVsKCZmaWJfZW50cnktPmxpc3QpOwogCXJoYXNodGFibGVfcmVtb3ZlX2Zhc3QoJmZpYi0+aHQsICZmaWJfZW50cnktPmh0X25vZGUsCiAJCQkgICAgICAgbWx4c3dfc3BfZmliX2h0X3BhcmFtcyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICoKIG1seHN3X3NwX2ZpYl9lbnRyeV9jcmVhdGUoc3RydWN0IG1seHN3X3NwX2ZpYiAqZmliLCBjb25zdCB2b2lkICphZGRyLAotCQkJICBzaXplX3QgYWRkcl9sZW4sIHVuc2lnbmVkIGNoYXIgcHJlZml4X2xlbikKKwkJCSAgc2l6ZV90IGFkZHJfbGVuLCB1bnNpZ25lZCBjaGFyIHByZWZpeF9sZW4sCisJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG1seHN3X3NwX2ZpYl9lbnRyeSAqZmliX2VudHJ5OwogCiAJZmliX2VudHJ5ID0ga3phbGxvYyhzaXplb2YoKmZpYl9lbnRyeSksIEdGUF9LRVJORUwpOwogCWlmICghZmliX2VudHJ5KQogCQlyZXR1cm4gTlVMTDsKKwlmaWJfZW50cnktPmtleS5kZXYgPSBkZXY7CiAJbWVtY3B5KGZpYl9lbnRyeS0+a2V5LmFkZHIsIGFkZHIsIGFkZHJfbGVuKTsKIAlmaWJfZW50cnktPmtleS5wcmVmaXhfbGVuID0gcHJlZml4X2xlbjsKIAlyZXR1cm4gZmliX2VudHJ5OwpAQCAtMTkwLDEwICsxOTksMTMgQEAKIAogc3RhdGljIHN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKgogbWx4c3dfc3BfZmliX2VudHJ5X2xvb2t1cChzdHJ1Y3QgbWx4c3dfc3BfZmliICpmaWIsIGNvbnN0IHZvaWQgKmFkZHIsCi0JCQkgIHNpemVfdCBhZGRyX2xlbiwgdW5zaWduZWQgY2hhciBwcmVmaXhfbGVuKQorCQkJICBzaXplX3QgYWRkcl9sZW4sIHVuc2lnbmVkIGNoYXIgcHJlZml4X2xlbiwKKwkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbWx4c3dfc3BfZmliX2tleSBrZXkgPSB7eyAwIH0gfTsKKwlzdHJ1Y3QgbWx4c3dfc3BfZmliX2tleSBrZXk7CiAKKwltZW1zZXQoJmtleSwgMCwgc2l6ZW9mKGtleSkpOworCWtleS5kZXYgPSBkZXY7CiAJbWVtY3B5KGtleS5hZGRyLCBhZGRyLCBhZGRyX2xlbik7CiAJa2V5LnByZWZpeF9sZW4gPSBwcmVmaXhfbGVuOwogCXJldHVybiByaGFzaHRhYmxlX2xvb2t1cF9mYXN0KCZmaWItPmh0LCAma2V5LCBtbHhzd19zcF9maWJfaHRfcGFyYW1zKTsKQEAgLTIxMCw2ICsyMjIsNyBAQAogCWVyciA9IHJoYXNodGFibGVfaW5pdCgmZmliLT5odCwgJm1seHN3X3NwX2ZpYl9odF9wYXJhbXMpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX3JoYXNodGFibGVfaW5pdDsKKwlJTklUX0xJU1RfSEVBRCgmZmliLT5lbnRyeV9saXN0KTsKIAlyZXR1cm4gZmliOwogCiBlcnJfcmhhc2h0YWJsZV9pbml0OgpAQCAtMjQ2LDcgKzI1OSw5IEBACiB7CiAJY2hhciByYWx0YV9wbFtNTFhTV19SRUdfUkFMVEFfTEVOXTsKIAotCW1seHN3X3JlZ19yYWx0YV9wYWNrKHJhbHRhX3BsLCB0cnVlLCBscG1fdHJlZS0+cHJvdG8sIGxwbV90cmVlLT5pZCk7CisJbWx4c3dfcmVnX3JhbHRhX3BhY2socmFsdGFfcGwsIHRydWUsCisJCQkgICAgIChlbnVtIG1seHN3X3JlZ19yYWx4eF9wcm90b2NvbCkgbHBtX3RyZWUtPnByb3RvLAorCQkJICAgICBscG1fdHJlZS0+aWQpOwogCXJldHVybiBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhyYWx0YSksIHJhbHRhX3BsKTsKIH0KIApAQCAtMjU1LDcgKzI3MCw5IEBACiB7CiAJY2hhciByYWx0YV9wbFtNTFhTV19SRUdfUkFMVEFfTEVOXTsKIAotCW1seHN3X3JlZ19yYWx0YV9wYWNrKHJhbHRhX3BsLCBmYWxzZSwgbHBtX3RyZWUtPnByb3RvLCBscG1fdHJlZS0+aWQpOworCW1seHN3X3JlZ19yYWx0YV9wYWNrKHJhbHRhX3BsLCBmYWxzZSwKKwkJCSAgICAgKGVudW0gbWx4c3dfcmVnX3JhbHh4X3Byb3RvY29sKSBscG1fdHJlZS0+cHJvdG8sCisJCQkgICAgIGxwbV90cmVlLT5pZCk7CiAJcmV0dXJuIG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHJhbHRhKSwgcmFsdGFfcGwpOwogfQogCkBAIC0zNjIsMTAgKzM3OSwxMiBAQAogCiBzdGF0aWMgc3RydWN0IG1seHN3X3NwX3ZyICptbHhzd19zcF92cl9maW5kX3VudXNlZChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQogeworCXN0cnVjdCBtbHhzd19yZXNvdXJjZXMgKnJlc291cmNlczsKIAlzdHJ1Y3QgbWx4c3dfc3BfdnIgKnZyOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1MWFNXX1NQX1ZJUlRVQUxfUk9VVEVSX01BWDsgaSsrKSB7CisJcmVzb3VyY2VzID0gbWx4c3dfY29yZV9yZXNvdXJjZXNfZ2V0KG1seHN3X3NwLT5jb3JlKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2VzLT5tYXhfdmlydHVhbF9yb3V0ZXJzOyBpKyspIHsKIAkJdnIgPSAmbWx4c3dfc3AtPnJvdXRlci52cnNbaV07CiAJCWlmICghdnItPnVzZWQpCiAJCQlyZXR1cm4gdnI7CkBAIC0zNzgsNyArMzk3LDkgQEAKIHsKIAljaGFyIHJhbHRiX3BsW01MWFNXX1JFR19SQUxUQl9MRU5dOwogCi0JbWx4c3dfcmVnX3JhbHRiX3BhY2socmFsdGJfcGwsIHZyLT5pZCwgdnItPnByb3RvLCB2ci0+bHBtX3RyZWUtPmlkKTsKKwltbHhzd19yZWdfcmFsdGJfcGFjayhyYWx0Yl9wbCwgdnItPmlkLAorCQkJICAgICAoZW51bSBtbHhzd19yZWdfcmFseHhfcHJvdG9jb2wpIHZyLT5wcm90bywKKwkJCSAgICAgdnItPmxwbV90cmVlLT5pZCk7CiAJcmV0dXJuIG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHJhbHRiKSwgcmFsdGJfcGwpOwogfQogCkBAIC0zODgsNyArNDA5LDggQEAKIAljaGFyIHJhbHRiX3BsW01MWFNXX1JFR19SQUxUQl9MRU5dOwogCiAJLyogQmluZCB0byB0cmVlIDAgd2hpY2ggaXMgZGVmYXVsdCAqLwotCW1seHN3X3JlZ19yYWx0Yl9wYWNrKHJhbHRiX3BsLCB2ci0+aWQsIHZyLT5wcm90bywgMCk7CisJbWx4c3dfcmVnX3JhbHRiX3BhY2socmFsdGJfcGwsIHZyLT5pZCwKKwkJCSAgICAgKGVudW0gbWx4c3dfcmVnX3JhbHh4X3Byb3RvY29sKSB2ci0+cHJvdG8sIDApOwogCXJldHVybiBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhyYWx0YiksIHJhbHRiX3BsKTsKIH0KIApAQCAtNDA0LDExICs0MjYsMTQgQEAKIAkJCQkJICAgIHUzMiB0Yl9pZCwKIAkJCQkJICAgIGVudW0gbWx4c3dfc3BfbDNwcm90byBwcm90bykKIHsKKwlzdHJ1Y3QgbWx4c3dfcmVzb3VyY2VzICpyZXNvdXJjZXM7CiAJc3RydWN0IG1seHN3X3NwX3ZyICp2cjsKIAlpbnQgaTsKIAogCXRiX2lkID0gbWx4c3dfc3BfZml4X3RiX2lkKHRiX2lkKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUxYU1dfU1BfVklSVFVBTF9ST1VURVJfTUFYOyBpKyspIHsKKworCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisJZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy0+bWF4X3ZpcnR1YWxfcm91dGVyczsgaSsrKSB7CiAJCXZyID0gJm1seHN3X3NwLT5yb3V0ZXIudnJzW2ldOwogCQlpZiAodnItPnVzZWQgJiYgdnItPnByb3RvID09IHByb3RvICYmIHZyLT50Yl9pZCA9PSB0Yl9pZCkKIAkJCXJldHVybiB2cjsKQEAgLTU0MiwxNSArNTY3LDMzIEBACiAJCQkJCSAgICZ2ci0+ZmliLT5wcmVmaXhfdXNhZ2UpOwogfQogCi1zdGF0aWMgdm9pZCBtbHhzd19zcF92cnNfaW5pdChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQorc3RhdGljIGludCBtbHhzd19zcF92cnNfaW5pdChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQogeworCXN0cnVjdCBtbHhzd19yZXNvdXJjZXMgKnJlc291cmNlczsKIAlzdHJ1Y3QgbWx4c3dfc3BfdnIgKnZyOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1MWFNXX1NQX1ZJUlRVQUxfUk9VVEVSX01BWDsgaSsrKSB7CisJcmVzb3VyY2VzID0gbWx4c3dfY29yZV9yZXNvdXJjZXNfZ2V0KG1seHN3X3NwLT5jb3JlKTsKKwlpZiAoIXJlc291cmNlcy0+bWF4X3ZpcnR1YWxfcm91dGVyc192YWxpZCkKKwkJcmV0dXJuIC1FSU87CisKKwltbHhzd19zcC0+cm91dGVyLnZycyA9IGtjYWxsb2MocmVzb3VyY2VzLT5tYXhfdmlydHVhbF9yb3V0ZXJzLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IG1seHN3X3NwX3ZyKSwKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFtbHhzd19zcC0+cm91dGVyLnZycykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2VzLT5tYXhfdmlydHVhbF9yb3V0ZXJzOyBpKyspIHsKIAkJdnIgPSAmbWx4c3dfc3AtPnJvdXRlci52cnNbaV07CiAJCXZyLT5pZCA9IGk7CiAJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1seHN3X3NwX3Zyc19maW5pKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCit7CisJa2ZyZWUobWx4c3dfc3AtPnJvdXRlci52cnMpOwogfQogCiBzdHJ1Y3QgbWx4c3dfc3BfbmVpZ2hfa2V5IHsKQEAgLTY1Nyw3ICs3MDAsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlyID0gbWx4c3dfc3BfcmlmX2ZpbmRfYnlfZGV2KG1seHN3X3NwLCBkZXYpOworCXIgPSBtbHhzd19zcF9yaWZfZmluZF9ieV9kZXYobWx4c3dfc3AsIG4tPmRldik7CiAJaWYgKFdBUk5fT04oIXIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtOTM4LDggKzk4MSw4IEBACiAJbWx4c3dfc3BfcG9ydF9kZXZfcHV0KG1seHN3X3NwX3BvcnQpOwogfQogCi1zdGF0aWMgaW50IG1seHN3X3NwX3JvdXRlcl9uZXRldmVudF9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZCwKLQkJCQkJICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCitpbnQgbWx4c3dfc3Bfcm91dGVyX25ldGV2ZW50X2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKIHsKIAlzdHJ1Y3QgbWx4c3dfc3BfbmVpZ2hfZW50cnkgKm5laWdoX2VudHJ5OwogCXN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0OwpAQCAtMTAwOSwxMCArMTA1Miw2IEBACiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG1seHN3X3NwX3JvdXRlcl9uZXRldmVudF9uYiBfX3JlYWRfbW9zdGx5ID0gewotCS5ub3RpZmllcl9jYWxsID0gbWx4c3dfc3Bfcm91dGVyX25ldGV2ZW50X2V2ZW50LAotfTsKLQogc3RhdGljIGludCBtbHhzd19zcF9uZWlnaF9pbml0KHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCiB7CiAJaW50IGVycjsKQEAgLTEwMjcsMTAgKzEwNjYsNiBAQAogCSAqLwogCW1seHN3X3NwX3JvdXRlcl9uZWlnaHNfdXBkYXRlX2ludGVydmFsX2luaXQobWx4c3dfc3ApOwogCi0JZXJyID0gcmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXIoJm1seHN3X3NwX3JvdXRlcl9uZXRldmVudF9uYik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfcmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXI7Ci0KIAkvKiBDcmVhdGUgdGhlIGRlbGF5ZWQgd29ya3MgZm9yIHRoZSBhY3Rpdml0eV91cGRhdGUgKi8KIAlJTklUX0RFTEFZRURfV09SSygmbWx4c3dfc3AtPnJvdXRlci5uZWlnaHNfdXBkYXRlLmR3LAogCQkJICBtbHhzd19zcF9yb3V0ZXJfbmVpZ2hzX3VwZGF0ZV93b3JrKTsKQEAgLTEwMzksMTcgKzEwNzQsMTIgQEAKIAltbHhzd19jb3JlX3NjaGVkdWxlX2R3KCZtbHhzd19zcC0+cm91dGVyLm5laWdoc191cGRhdGUuZHcsIDApOwogCW1seHN3X2NvcmVfc2NoZWR1bGVfZHcoJm1seHN3X3NwLT5yb3V0ZXIubmV4dGhvcF9wcm9iZV9kdywgMCk7CiAJcmV0dXJuIDA7Ci0KLWVycl9yZWdpc3Rlcl9uZXRldmVudF9ub3RpZmllcjoKLQlyaGFzaHRhYmxlX2Rlc3Ryb3koJm1seHN3X3NwLT5yb3V0ZXIubmVpZ2hfaHQpOwotCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIG1seHN3X3NwX25laWdoX2Zpbmkoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKIHsKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJm1seHN3X3NwLT5yb3V0ZXIubmVpZ2hzX3VwZGF0ZS5kdyk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZtbHhzd19zcC0+cm91dGVyLm5leHRob3BfcHJvYmVfZHcpOwotCXVucmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXIoJm1seHN3X3NwX3JvdXRlcl9uZXRldmVudF9uYik7CiAJcmhhc2h0YWJsZV9kZXN0cm95KCZtbHhzd19zcC0+cm91dGVyLm5laWdoX2h0KTsKIH0KIApAQCAtMTA4OCw5ICsxMTE4LDEwIEBACiB7CiAJY2hhciByYWxldV9wbFtNTFhTV19SRUdfUkFMRVVfTEVOXTsKIAotCW1seHN3X3JlZ19yYWxldV9wYWNrKHJhbGV1X3BsLCB2ci0+cHJvdG8sIHZyLT5pZCwKLQkJCSAgICAgYWRqX2luZGV4LCBlY21wX3NpemUsCi0JCQkgICAgIG5ld19hZGpfaW5kZXgsIG5ld19lY21wX3NpemUpOworCW1seHN3X3JlZ19yYWxldV9wYWNrKHJhbGV1X3BsLAorCQkJICAgICAoZW51bSBtbHhzd19yZWdfcmFseHhfcHJvdG9jb2wpIHZyLT5wcm90bywgdnItPmlkLAorCQkJICAgICBhZGpfaW5kZXgsIGVjbXBfc2l6ZSwgbmV3X2Fkal9pbmRleCwKKwkJCSAgICAgbmV3X2VjbXBfc2l6ZSk7CiAJcmV0dXJuIG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHJhbGV1KSwgcmFsZXVfcGwpOwogfQogCkBAIC0xNDk2LDQzICsxNTI3LDYgQEAKIAltbHhzd19zcF9uZXh0aG9wX2dyb3VwX2Rlc3Ryb3kobWx4c3dfc3AsIG5oX2dycCk7CiB9CiAKLXN0YXRpYyBpbnQgX19tbHhzd19zcF9yb3V0ZXJfaW5pdChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQotewotCWNoYXIgcmdjcl9wbFtNTFhTV19SRUdfUkdDUl9MRU5dOwotCi0JbWx4c3dfcmVnX3JnY3JfcGFjayhyZ2NyX3BsLCB0cnVlKTsKLQltbHhzd19yZWdfcmdjcl9tYXhfcm91dGVyX2ludGVyZmFjZXNfc2V0KHJnY3JfcGwsIE1MWFNXX1NQX1JJRl9NQVgpOwotCXJldHVybiBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhyZ2NyKSwgcmdjcl9wbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fbWx4c3dfc3Bfcm91dGVyX2Zpbmkoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKLXsKLQljaGFyIHJnY3JfcGxbTUxYU1dfUkVHX1JHQ1JfTEVOXTsKLQotCW1seHN3X3JlZ19yZ2NyX3BhY2socmdjcl9wbCwgZmFsc2UpOwotCW1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHJnY3IpLCByZ2NyX3BsKTsKLX0KLQotaW50IG1seHN3X3NwX3JvdXRlcl9pbml0KHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCi17Ci0JaW50IGVycjsKLQotCUlOSVRfTElTVF9IRUFEKCZtbHhzd19zcC0+cm91dGVyLm5leHRob3BfbmVpZ2hzX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZtbHhzd19zcC0+cm91dGVyLm5leHRob3BfZ3JvdXBfbGlzdCk7Ci0JZXJyID0gX19tbHhzd19zcF9yb3V0ZXJfaW5pdChtbHhzd19zcCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQltbHhzd19zcF9scG1faW5pdChtbHhzd19zcCk7Ci0JbWx4c3dfc3BfdnJzX2luaXQobWx4c3dfc3ApOwotCXJldHVybiBtbHhzd19zcF9uZWlnaF9pbml0KG1seHN3X3NwKTsKLX0KLQotdm9pZCBtbHhzd19zcF9yb3V0ZXJfZmluaShzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQotewotCW1seHN3X3NwX25laWdoX2ZpbmkobWx4c3dfc3ApOwotCV9fbWx4c3dfc3Bfcm91dGVyX2ZpbmkobWx4c3dfc3ApOwotfQotCiBzdGF0aWMgaW50IG1seHN3X3NwX2ZpYl9lbnRyeV9vcDRfcmVtb3RlKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AsCiAJCQkJCSBzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICpmaWJfZW50cnksCiAJCQkJCSBlbnVtIG1seHN3X3JlZ19yYWx1ZV9vcCBvcCkKQEAgLTE1NTgsOCArMTU1Miw5IEBACiAJCXRyYXBfaWQgPSBNTFhTV19UUkFQX0lEX1JUUl9JTkdSRVNTMDsKIAl9CiAKLQltbHhzd19yZWdfcmFsdWVfcGFjazQocmFsdWVfcGwsIHZyLT5wcm90bywgb3AsIHZyLT5pZCwKLQkJCSAgICAgIGZpYl9lbnRyeS0+a2V5LnByZWZpeF9sZW4sICpwX2RpcCk7CisJbWx4c3dfcmVnX3JhbHVlX3BhY2s0KHJhbHVlX3BsLAorCQkJICAgICAgKGVudW0gbWx4c3dfcmVnX3JhbHh4X3Byb3RvY29sKSB2ci0+cHJvdG8sIG9wLAorCQkJICAgICAgdnItPmlkLCBmaWJfZW50cnktPmtleS5wcmVmaXhfbGVuLCAqcF9kaXApOwogCW1seHN3X3JlZ19yYWx1ZV9hY3RfcmVtb3RlX3BhY2socmFsdWVfcGwsIHRyYXBfYWN0aW9uLCB0cmFwX2lkLAogCQkJCQlhZGphY2VuY3lfaW5kZXgsIGVjbXBfc2l6ZSk7CiAJcmV0dXJuIG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHJhbHVlKSwgcmFsdWVfcGwpOwpAQCAtMTU3Myw4ICsxNTY4LDkgQEAKIAl1MzIgKnBfZGlwID0gKHUzMiAqKSBmaWJfZW50cnktPmtleS5hZGRyOwogCXN0cnVjdCBtbHhzd19zcF92ciAqdnIgPSBmaWJfZW50cnktPnZyOwogCi0JbWx4c3dfcmVnX3JhbHVlX3BhY2s0KHJhbHVlX3BsLCB2ci0+cHJvdG8sIG9wLCB2ci0+aWQsCi0JCQkgICAgICBmaWJfZW50cnktPmtleS5wcmVmaXhfbGVuLCAqcF9kaXApOworCW1seHN3X3JlZ19yYWx1ZV9wYWNrNChyYWx1ZV9wbCwKKwkJCSAgICAgIChlbnVtIG1seHN3X3JlZ19yYWx4eF9wcm90b2NvbCkgdnItPnByb3RvLCBvcCwKKwkJCSAgICAgIHZyLT5pZCwgZmliX2VudHJ5LT5rZXkucHJlZml4X2xlbiwgKnBfZGlwKTsKIAltbHhzd19yZWdfcmFsdWVfYWN0X2xvY2FsX3BhY2socmFsdWVfcGwsCiAJCQkJICAgICAgIE1MWFNXX1JFR19SQUxVRV9UUkFQX0FDVElPTl9OT1AsIDAsCiAJCQkJICAgICAgIGZpYl9lbnRyeS0+cmlmKTsKQEAgLTE1ODksOCArMTU4NSw5IEBACiAJdTMyICpwX2RpcCA9ICh1MzIgKikgZmliX2VudHJ5LT5rZXkuYWRkcjsKIAlzdHJ1Y3QgbWx4c3dfc3BfdnIgKnZyID0gZmliX2VudHJ5LT52cjsKIAotCW1seHN3X3JlZ19yYWx1ZV9wYWNrNChyYWx1ZV9wbCwgdnItPnByb3RvLCBvcCwgdnItPmlkLAotCQkJICAgICAgZmliX2VudHJ5LT5rZXkucHJlZml4X2xlbiwgKnBfZGlwKTsKKwltbHhzd19yZWdfcmFsdWVfcGFjazQocmFsdWVfcGwsCisJCQkgICAgICAoZW51bSBtbHhzd19yZWdfcmFseHhfcHJvdG9jb2wpIHZyLT5wcm90bywgb3AsCisJCQkgICAgICB2ci0+aWQsIGZpYl9lbnRyeS0+a2V5LnByZWZpeF9sZW4sICpwX2RpcCk7CiAJbWx4c3dfcmVnX3JhbHVlX2FjdF9pcDJtZV9wYWNrKHJhbHVlX3BsKTsKIAlyZXR1cm4gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmFsdWUpLCByYWx1ZV9wbCk7CiB9CkBAIC0xNjI2LDExICsxNjIzLDggQEAKIHN0YXRpYyBpbnQgbWx4c3dfc3BfZmliX2VudHJ5X3VwZGF0ZShzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLAogCQkJCSAgICAgc3RydWN0IG1seHN3X3NwX2ZpYl9lbnRyeSAqZmliX2VudHJ5KQogewotCWVudW0gbWx4c3dfcmVnX3JhbHVlX29wIG9wOwotCi0Jb3AgPSAhZmliX2VudHJ5LT5hZGRlZCA/IE1MWFNXX1JFR19SQUxVRV9PUF9XUklURV9XUklURSA6Ci0JCQkJIE1MWFNXX1JFR19SQUxVRV9PUF9XUklURV9VUERBVEU7Ci0JcmV0dXJuIG1seHN3X3NwX2ZpYl9lbnRyeV9vcChtbHhzd19zcCwgZmliX2VudHJ5LCBvcCk7CisJcmV0dXJuIG1seHN3X3NwX2ZpYl9lbnRyeV9vcChtbHhzd19zcCwgZmliX2VudHJ5LAorCQkJCSAgICAgTUxYU1dfUkVHX1JBTFVFX09QX1dSSVRFX1dSSVRFKTsKIH0KIAogc3RhdGljIGludCBtbHhzd19zcF9maWJfZW50cnlfZGVsKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AsCkBAIC0xNjQwLDEyOCArMTYzNCwxODAgQEAKIAkJCQkgICAgIE1MWFNXX1JFR19SQUxVRV9PUF9XUklURV9ERUxFVEUpOwogfQogCi1zdHJ1Y3QgbWx4c3dfc3Bfcm91dGVyX2ZpYjRfYWRkX2luZm8gewotCXN0cnVjdCBzd2l0Y2hkZXZfdHJhbnNfaXRlbSB0cml0ZW07Ci0Jc3RydWN0IG1seHN3X3NwICptbHhzd19zcDsKLQlzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICpmaWJfZW50cnk7Ci19OwotCi1zdGF0aWMgdm9pZCBtbHhzd19zcF9yb3V0ZXJfZmliNF9hZGRfaW5mb19kZXN0cm95KHZvaWQgY29uc3QgKmRhdGEpCi17Ci0JY29uc3Qgc3RydWN0IG1seHN3X3NwX3JvdXRlcl9maWI0X2FkZF9pbmZvICppbmZvID0gZGF0YTsKLQlzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICpmaWJfZW50cnkgPSBpbmZvLT5maWJfZW50cnk7Ci0Jc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IGluZm8tPm1seHN3X3NwOwotCi0JbWx4c3dfc3BfZmliX2VudHJ5X2Rlc3Ryb3koZmliX2VudHJ5KTsKLQltbHhzd19zcF92cl9wdXQobWx4c3dfc3AsIGZpYl9lbnRyeS0+dnIpOwotCWtmcmVlKGluZm8pOwotfQotCiBzdGF0aWMgaW50CiBtbHhzd19zcF9yb3V0ZXJfZmliNF9lbnRyeV9pbml0KHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AsCi0JCQkJY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgKmZpYjQsCisJCQkJY29uc3Qgc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvICpmZW5faW5mbywKIAkJCQlzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICpmaWJfZW50cnkpCiB7Ci0Jc3RydWN0IGZpYl9pbmZvICpmaSA9IGZpYjQtPmZpOworCXN0cnVjdCBmaWJfaW5mbyAqZmkgPSBmZW5faW5mby0+Zmk7CisJc3RydWN0IG1seHN3X3NwX3JpZiAqciA9IE5VTEw7CisJaW50IG5oc2VsOworCWludCBlcnI7CiAKLQlpZiAoZmliNC0+dHlwZSA9PSBSVE5fTE9DQUwgfHwgZmliNC0+dHlwZSA9PSBSVE5fQlJPQURDQVNUKSB7CisJaWYgKGZlbl9pbmZvLT50eXBlID09IFJUTl9MT0NBTCB8fCBmZW5faW5mby0+dHlwZSA9PSBSVE5fQlJPQURDQVNUKSB7CiAJCWZpYl9lbnRyeS0+dHlwZSA9IE1MWFNXX1NQX0ZJQl9FTlRSWV9UWVBFX1RSQVA7CiAJCXJldHVybiAwOwogCX0KLQlpZiAoZmliNC0+dHlwZSAhPSBSVE5fVU5JQ0FTVCkKKwlpZiAoZmVuX2luZm8tPnR5cGUgIT0gUlROX1VOSUNBU1QpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGZpLT5maWJfc2NvcGUgIT0gUlRfU0NPUEVfVU5JVkVSU0UpIHsKLQkJc3RydWN0IG1seHN3X3NwX3JpZiAqcjsKKwlmb3IgKG5oc2VsID0gMDsgbmhzZWwgPCBmaS0+ZmliX25oczsgbmhzZWwrKykgeworCQljb25zdCBzdHJ1Y3QgZmliX25oICpuaCA9ICZmaS0+ZmliX25oW25oc2VsXTsKIAotCQlmaWJfZW50cnktPnR5cGUgPSBNTFhTV19TUF9GSUJfRU5UUllfVFlQRV9MT0NBTDsKLQkJciA9IG1seHN3X3NwX3JpZl9maW5kX2J5X2RldihtbHhzd19zcCwgZmktPmZpYl9kZXYpOwotCQlpZiAoIXIpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZmliX2VudHJ5LT5yaWYgPSByLT5yaWY7CisJCWlmICghbmgtPm5oX2RldikKKwkJCWNvbnRpbnVlOworCQlyID0gbWx4c3dfc3BfcmlmX2ZpbmRfYnlfZGV2KG1seHN3X3NwLCBuaC0+bmhfZGV2KTsKKwkJaWYgKCFyKSB7CisJCQkvKiBJbiBjYXNlIHJvdXRlciBpbnRlcmZhY2UgaXMgbm90IGZvdW5kIGZvcgorCQkJICogYXQgbGVhc3Qgb25lIG9mIHRoZSBuZXh0aG9wcywgdGhhdCBtZWFucworCQkJICogdGhlIG5leHRob3AgcG9pbnRzIHRvIHNvbWUgZGV2aWNlIHVucmVsYXRlZAorCQkJICogdG8gdXMuIFNldCB0cmFwIGFuZCBwYXNzIHRoZSBwYWNrZXRzIGZvcgorCQkJICogdGhpcyBwcmVmaXggdG8ga2VybmVsLgorCQkJICovCisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghcikgeworCQlmaWJfZW50cnktPnR5cGUgPSBNTFhTV19TUF9GSUJfRU5UUllfVFlQRV9UUkFQOwogCQlyZXR1cm4gMDsKIAl9Ci0JZmliX2VudHJ5LT50eXBlID0gTUxYU1dfU1BfRklCX0VOVFJZX1RZUEVfUkVNT1RFOwotCXJldHVybiBtbHhzd19zcF9uZXh0aG9wX2dyb3VwX2dldChtbHhzd19zcCwgZmliX2VudHJ5LCBmaSk7CisKKwlpZiAoZmktPmZpYl9zY29wZSAhPSBSVF9TQ09QRV9VTklWRVJTRSkgeworCQlmaWJfZW50cnktPnR5cGUgPSBNTFhTV19TUF9GSUJfRU5UUllfVFlQRV9MT0NBTDsKKwkJZmliX2VudHJ5LT5yaWYgPSByLT5yaWY7CisJfSBlbHNlIHsKKwkJZmliX2VudHJ5LT50eXBlID0gTUxYU1dfU1BfRklCX0VOVFJZX1RZUEVfUkVNT1RFOworCQllcnIgPSBtbHhzd19zcF9uZXh0aG9wX2dyb3VwX2dldChtbHhzd19zcCwgZmliX2VudHJ5LCBmaSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlmaWJfaW5mb19vZmZsb2FkX2luYyhmZW5faW5mby0+ZmkpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogbWx4c3dfc3Bfcm91dGVyX2ZpYjRfZW50cnlfZmluaShzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLAogCQkJCXN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKmZpYl9lbnRyeSkKIHsKLQlpZiAoZmliX2VudHJ5LT50eXBlICE9IE1MWFNXX1NQX0ZJQl9FTlRSWV9UWVBFX1JFTU9URSkKLQkJcmV0dXJuOwotCW1seHN3X3NwX25leHRob3BfZ3JvdXBfcHV0KG1seHN3X3NwLCBmaWJfZW50cnkpOworCWlmIChmaWJfZW50cnktPnR5cGUgIT0gTUxYU1dfU1BfRklCX0VOVFJZX1RZUEVfVFJBUCkKKwkJZmliX2luZm9fb2ZmbG9hZF9kZWMoZmliX2VudHJ5LT5maSk7CisJaWYgKGZpYl9lbnRyeS0+dHlwZSA9PSBNTFhTV19TUF9GSUJfRU5UUllfVFlQRV9SRU1PVEUpCisJCW1seHN3X3NwX25leHRob3BfZ3JvdXBfcHV0KG1seHN3X3NwLCBmaWJfZW50cnkpOwogfQogCi1zdGF0aWMgaW50Ci1tbHhzd19zcF9yb3V0ZXJfZmliNF9hZGRfcHJlcGFyZShzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKLQkJCQkgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgKmZpYjQsCi0JCQkJIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQorc3RhdGljIHN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKgorbWx4c3dfc3BfZmliX2VudHJ5X2dldChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLAorCQkgICAgICAgY29uc3Qgc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvICpmZW5faW5mbykKIHsKLQlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7Ci0Jc3RydWN0IG1seHN3X3NwX3JvdXRlcl9maWI0X2FkZF9pbmZvICppbmZvOwogCXN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKmZpYl9lbnRyeTsKKwlzdHJ1Y3QgZmliX2luZm8gKmZpID0gZmVuX2luZm8tPmZpOwogCXN0cnVjdCBtbHhzd19zcF92ciAqdnI7CiAJaW50IGVycjsKIAotCXZyID0gbWx4c3dfc3BfdnJfZ2V0KG1seHN3X3NwLCBmaWI0LT5kc3RfbGVuLCBmaWI0LT50Yl9pZCwKKwl2ciA9IG1seHN3X3NwX3ZyX2dldChtbHhzd19zcCwgZmVuX2luZm8tPmRzdF9sZW4sIGZlbl9pbmZvLT50Yl9pZCwKIAkJCSAgICAgTUxYU1dfU1BfTDNfUFJPVE9fSVBWNCk7CiAJaWYgKElTX0VSUih2cikpCi0JCXJldHVybiBQVFJfRVJSKHZyKTsKKwkJcmV0dXJuIEVSUl9DQVNUKHZyKTsKIAotCWZpYl9lbnRyeSA9IG1seHN3X3NwX2ZpYl9lbnRyeV9jcmVhdGUodnItPmZpYiwgJmZpYjQtPmRzdCwKLQkJCQkJICAgICAgc2l6ZW9mKGZpYjQtPmRzdCksIGZpYjQtPmRzdF9sZW4pOworCWZpYl9lbnRyeSA9IG1seHN3X3NwX2ZpYl9lbnRyeV9sb29rdXAodnItPmZpYiwgJmZlbl9pbmZvLT5kc3QsCisJCQkJCSAgICAgIHNpemVvZihmZW5faW5mby0+ZHN0KSwKKwkJCQkJICAgICAgZmVuX2luZm8tPmRzdF9sZW4sIGZpLT5maWJfZGV2KTsKKwlpZiAoZmliX2VudHJ5KSB7CisJCS8qIEFscmVhZHkgZXhpc3RzLCBqdXN0IHRha2UgYSByZWZlcmVuY2UgKi8KKwkJZmliX2VudHJ5LT5yZWZfY291bnQrKzsKKwkJcmV0dXJuIGZpYl9lbnRyeTsKKwl9CisJZmliX2VudHJ5ID0gbWx4c3dfc3BfZmliX2VudHJ5X2NyZWF0ZSh2ci0+ZmliLCAmZmVuX2luZm8tPmRzdCwKKwkJCQkJICAgICAgc2l6ZW9mKGZlbl9pbmZvLT5kc3QpLAorCQkJCQkgICAgICBmZW5faW5mby0+ZHN0X2xlbiwgZmktPmZpYl9kZXYpOwogCWlmICghZmliX2VudHJ5KSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2ZpYl9lbnRyeV9jcmVhdGU7CiAJfQogCWZpYl9lbnRyeS0+dnIgPSB2cjsKKwlmaWJfZW50cnktPmZpID0gZmk7CisJZmliX2VudHJ5LT5yZWZfY291bnQgPSAxOwogCi0JZXJyID0gbWx4c3dfc3Bfcm91dGVyX2ZpYjRfZW50cnlfaW5pdChtbHhzd19zcCwgZmliNCwgZmliX2VudHJ5KTsKKwllcnIgPSBtbHhzd19zcF9yb3V0ZXJfZmliNF9lbnRyeV9pbml0KG1seHN3X3NwLCBmZW5faW5mbywgZmliX2VudHJ5KTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9maWI0X2VudHJ5X2luaXQ7CiAKLQlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWluZm8pIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBlcnJfYWxsb2NfaW5mbzsKLQl9Ci0JaW5mby0+bWx4c3dfc3AgPSBtbHhzd19zcDsKLQlpbmZvLT5maWJfZW50cnkgPSBmaWJfZW50cnk7Ci0Jc3dpdGNoZGV2X3RyYW5zX2l0ZW1fZW5xdWV1ZSh0cmFucywgaW5mbywKLQkJCQkgICAgIG1seHN3X3NwX3JvdXRlcl9maWI0X2FkZF9pbmZvX2Rlc3Ryb3ksCi0JCQkJICAgICAmaW5mby0+dHJpdGVtKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZmliX2VudHJ5OwogCi1lcnJfYWxsb2NfaW5mbzoKLQltbHhzd19zcF9yb3V0ZXJfZmliNF9lbnRyeV9maW5pKG1seHN3X3NwLCBmaWJfZW50cnkpOwogZXJyX2ZpYjRfZW50cnlfaW5pdDoKIAltbHhzd19zcF9maWJfZW50cnlfZGVzdHJveShmaWJfZW50cnkpOwogZXJyX2ZpYl9lbnRyeV9jcmVhdGU6CiAJbWx4c3dfc3BfdnJfcHV0KG1seHN3X3NwLCB2cik7Ci0JcmV0dXJuIGVycjsKKworCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKLXN0YXRpYyBpbnQKLW1seHN3X3NwX3JvdXRlcl9maWI0X2FkZF9jb21taXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCi0JCQkJY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgKmZpYjQsCi0JCQkJc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCitzdGF0aWMgc3RydWN0IG1seHN3X3NwX2ZpYl9lbnRyeSAqCittbHhzd19zcF9maWJfZW50cnlfZmluZChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLAorCQkJY29uc3Qgc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvICpmZW5faW5mbykKIHsKLQlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7Ci0Jc3RydWN0IG1seHN3X3NwX3JvdXRlcl9maWI0X2FkZF9pbmZvICppbmZvOworCXN0cnVjdCBtbHhzd19zcF92ciAqdnI7CisKKwl2ciA9IG1seHN3X3NwX3ZyX2ZpbmQobWx4c3dfc3AsIGZlbl9pbmZvLT50Yl9pZCwKKwkJCSAgICAgIE1MWFNXX1NQX0wzX1BST1RPX0lQVjQpOworCWlmICghdnIpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIG1seHN3X3NwX2ZpYl9lbnRyeV9sb29rdXAodnItPmZpYiwgJmZlbl9pbmZvLT5kc3QsCisJCQkJCSBzaXplb2YoZmVuX2luZm8tPmRzdCksCisJCQkJCSBmZW5faW5mby0+ZHN0X2xlbiwKKwkJCQkJIGZlbl9pbmZvLT5maS0+ZmliX2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIG1seHN3X3NwX2ZpYl9lbnRyeV9wdXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCwKKwkJCQkgICBzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICpmaWJfZW50cnkpCit7CisJc3RydWN0IG1seHN3X3NwX3ZyICp2ciA9IGZpYl9lbnRyeS0+dnI7CisKKwlpZiAoLS1maWJfZW50cnktPnJlZl9jb3VudCA9PSAwKSB7CisJCW1seHN3X3NwX3JvdXRlcl9maWI0X2VudHJ5X2ZpbmkobWx4c3dfc3AsIGZpYl9lbnRyeSk7CisJCW1seHN3X3NwX2ZpYl9lbnRyeV9kZXN0cm95KGZpYl9lbnRyeSk7CisJfQorCW1seHN3X3NwX3ZyX3B1dChtbHhzd19zcCwgdnIpOworfQorCitzdGF0aWMgdm9pZCBtbHhzd19zcF9maWJfZW50cnlfcHV0X2FsbChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLAorCQkJCSAgICAgICBzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICpmaWJfZW50cnkpCit7CisJdW5zaWduZWQgaW50IGxhc3RfcmVmX2NvdW50OworCisJZG8geworCQlsYXN0X3JlZl9jb3VudCA9IGZpYl9lbnRyeS0+cmVmX2NvdW50OworCQltbHhzd19zcF9maWJfZW50cnlfcHV0KG1seHN3X3NwLCBmaWJfZW50cnkpOworCX0gd2hpbGUgKGxhc3RfcmVmX2NvdW50ICE9IDEpOworfQorCitzdGF0aWMgaW50IG1seHN3X3NwX3JvdXRlcl9maWI0X2FkZChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLAorCQkJCSAgICBzdHJ1Y3QgZmliX2VudHJ5X25vdGlmaWVyX2luZm8gKmZlbl9pbmZvKQorewogCXN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKmZpYl9lbnRyeTsKIAlzdHJ1Y3QgbWx4c3dfc3BfdnIgKnZyOwogCWludCBlcnI7CiAKLQlpbmZvID0gc3dpdGNoZGV2X3RyYW5zX2l0ZW1fZGVxdWV1ZSh0cmFucyk7Ci0JZmliX2VudHJ5ID0gaW5mby0+ZmliX2VudHJ5OwotCWtmcmVlKGluZm8pOworCWlmIChtbHhzd19zcC0+cm91dGVyLmFib3J0ZWQpCisJCXJldHVybiAwOworCisJZmliX2VudHJ5ID0gbWx4c3dfc3BfZmliX2VudHJ5X2dldChtbHhzd19zcCwgZmVuX2luZm8pOworCWlmIChJU19FUlIoZmliX2VudHJ5KSkgeworCQlkZXZfd2FybihtbHhzd19zcC0+YnVzX2luZm8tPmRldiwgIkZhaWxlZCB0byBnZXQgRklCNCBlbnRyeSBiZWluZyBhZGRlZC5cbiIpOworCQlyZXR1cm4gUFRSX0VSUihmaWJfZW50cnkpOworCX0KKworCWlmIChmaWJfZW50cnktPnJlZl9jb3VudCAhPSAxKQorCQlyZXR1cm4gMDsKIAogCXZyID0gZmliX2VudHJ5LT52cjsKLQllcnIgPSBtbHhzd19zcF9maWJfZW50cnlfaW5zZXJ0KGZpYl9lbnRyeS0+dnItPmZpYiwgZmliX2VudHJ5KTsKLQlpZiAoZXJyKQorCWVyciA9IG1seHN3X3NwX2ZpYl9lbnRyeV9pbnNlcnQodnItPmZpYiwgZmliX2VudHJ5KTsKKwlpZiAoZXJyKSB7CisJCWRldl93YXJuKG1seHN3X3NwLT5idXNfaW5mby0+ZGV2LCAiRmFpbGVkIHRvIGluc2VydCBGSUI0IGVudHJ5IGJlaW5nIGFkZGVkLlxuIik7CiAJCWdvdG8gZXJyX2ZpYl9lbnRyeV9pbnNlcnQ7CisJfQogCWVyciA9IG1seHN3X3NwX2ZpYl9lbnRyeV91cGRhdGUobWx4c3dfc3AsIGZpYl9lbnRyeSk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfZmliX2VudHJ5X2FkZDsKQEAgLTE3NzAsNDUgKzE4MTYsMTk4IEBACiBlcnJfZmliX2VudHJ5X2FkZDoKIAltbHhzd19zcF9maWJfZW50cnlfcmVtb3ZlKHZyLT5maWIsIGZpYl9lbnRyeSk7CiBlcnJfZmliX2VudHJ5X2luc2VydDoKLQltbHhzd19zcF9yb3V0ZXJfZmliNF9lbnRyeV9maW5pKG1seHN3X3NwLCBmaWJfZW50cnkpOwotCW1seHN3X3NwX2ZpYl9lbnRyeV9kZXN0cm95KGZpYl9lbnRyeSk7Ci0JbWx4c3dfc3BfdnJfcHV0KG1seHN3X3NwLCB2cik7CisJbWx4c3dfc3BfZmliX2VudHJ5X3B1dChtbHhzd19zcCwgZmliX2VudHJ5KTsKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgbWx4c3dfc3Bfcm91dGVyX2ZpYjRfYWRkKHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0LAotCQkJICAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9pcHY0X2ZpYiAqZmliNCwKLQkJCSAgICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCitzdGF0aWMgaW50IG1seHN3X3NwX3JvdXRlcl9maWI0X2RlbChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLAorCQkJCSAgICBzdHJ1Y3QgZmliX2VudHJ5X25vdGlmaWVyX2luZm8gKmZlbl9pbmZvKQogewotCWlmIChzd2l0Y2hkZXZfdHJhbnNfcGhfcHJlcGFyZSh0cmFucykpCi0JCXJldHVybiBtbHhzd19zcF9yb3V0ZXJfZmliNF9hZGRfcHJlcGFyZShtbHhzd19zcF9wb3J0LAotCQkJCQkJCWZpYjQsIHRyYW5zKTsKLQlyZXR1cm4gbWx4c3dfc3Bfcm91dGVyX2ZpYjRfYWRkX2NvbW1pdChtbHhzd19zcF9wb3J0LAotCQkJCQkgICAgICAgZmliNCwgdHJhbnMpOwotfQotCi1pbnQgbWx4c3dfc3Bfcm91dGVyX2ZpYjRfZGVsKHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0LAotCQkJICAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9pcHY0X2ZpYiAqZmliNCkKLXsKLQlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7CiAJc3RydWN0IG1seHN3X3NwX2ZpYl9lbnRyeSAqZmliX2VudHJ5OwotCXN0cnVjdCBtbHhzd19zcF92ciAqdnI7CiAKLQl2ciA9IG1seHN3X3NwX3ZyX2ZpbmQobWx4c3dfc3AsIGZpYjQtPnRiX2lkLCBNTFhTV19TUF9MM19QUk9UT19JUFY0KTsKLQlpZiAoIXZyKSB7Ci0JCWRldl93YXJuKG1seHN3X3NwLT5idXNfaW5mby0+ZGV2LCAiRmFpbGVkIHRvIGZpbmQgdmlydHVhbCByb3V0ZXIgZm9yIEZJQjQgZW50cnkgYmVpbmcgcmVtb3ZlZC5cbiIpOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9Ci0JZmliX2VudHJ5ID0gbWx4c3dfc3BfZmliX2VudHJ5X2xvb2t1cCh2ci0+ZmliLCAmZmliNC0+ZHN0LAotCQkJCQkgICAgICBzaXplb2YoZmliNC0+ZHN0KSwgZmliNC0+ZHN0X2xlbik7CisJaWYgKG1seHN3X3NwLT5yb3V0ZXIuYWJvcnRlZCkKKwkJcmV0dXJuIDA7CisKKwlmaWJfZW50cnkgPSBtbHhzd19zcF9maWJfZW50cnlfZmluZChtbHhzd19zcCwgZmVuX2luZm8pOwogCWlmICghZmliX2VudHJ5KSB7CiAJCWRldl93YXJuKG1seHN3X3NwLT5idXNfaW5mby0+ZGV2LCAiRmFpbGVkIHRvIGZpbmQgRklCNCBlbnRyeSBiZWluZyByZW1vdmVkLlxuIik7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KLQltbHhzd19zcF9maWJfZW50cnlfZGVsKG1seHN3X3NwX3BvcnQtPm1seHN3X3NwLCBmaWJfZW50cnkpOwotCW1seHN3X3NwX2ZpYl9lbnRyeV9yZW1vdmUodnItPmZpYiwgZmliX2VudHJ5KTsKLQltbHhzd19zcF9yb3V0ZXJfZmliNF9lbnRyeV9maW5pKG1seHN3X3NwLCBmaWJfZW50cnkpOwotCW1seHN3X3NwX2ZpYl9lbnRyeV9kZXN0cm95KGZpYl9lbnRyeSk7Ci0JbWx4c3dfc3BfdnJfcHV0KG1seHN3X3NwLCB2cik7CisKKwlpZiAoZmliX2VudHJ5LT5yZWZfY291bnQgPT0gMSkgeworCQltbHhzd19zcF9maWJfZW50cnlfZGVsKG1seHN3X3NwLCBmaWJfZW50cnkpOworCQltbHhzd19zcF9maWJfZW50cnlfcmVtb3ZlKGZpYl9lbnRyeS0+dnItPmZpYiwgZmliX2VudHJ5KTsKKwl9CisKKwltbHhzd19zcF9maWJfZW50cnlfcHV0KG1seHN3X3NwLCBmaWJfZW50cnkpOwogCXJldHVybiAwOwogfQorCitzdGF0aWMgaW50IG1seHN3X3NwX3JvdXRlcl9zZXRfYWJvcnRfdHJhcChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQoreworCWNoYXIgcmFsdGFfcGxbTUxYU1dfUkVHX1JBTFRBX0xFTl07CisJY2hhciByYWxzdF9wbFtNTFhTV19SRUdfUkFMU1RfTEVOXTsKKwljaGFyIHJhbHRiX3BsW01MWFNXX1JFR19SQUxUQl9MRU5dOworCWNoYXIgcmFsdWVfcGxbTUxYU1dfUkVHX1JBTFVFX0xFTl07CisJaW50IGVycjsKKworCW1seHN3X3JlZ19yYWx0YV9wYWNrKHJhbHRhX3BsLCB0cnVlLCBNTFhTV19SRUdfUkFMWFhfUFJPVE9DT0xfSVBWNCwKKwkJCSAgICAgTUxYU1dfU1BfTFBNX1RSRUVfTUlOKTsKKwllcnIgPSBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhyYWx0YSksIHJhbHRhX3BsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbWx4c3dfcmVnX3JhbHN0X3BhY2socmFsc3RfcGwsIDB4ZmYsIE1MWFNXX1NQX0xQTV9UUkVFX01JTik7CisJZXJyID0gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmFsc3QpLCByYWxzdF9wbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW1seHN3X3JlZ19yYWx0Yl9wYWNrKHJhbHRiX3BsLCAwLCBNTFhTV19SRUdfUkFMWFhfUFJPVE9DT0xfSVBWNCwgMCk7CisJZXJyID0gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmFsdGIpLCByYWx0Yl9wbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW1seHN3X3JlZ19yYWx1ZV9wYWNrNChyYWx1ZV9wbCwgTUxYU1dfU1BfTDNfUFJPVE9fSVBWNCwKKwkJCSAgICAgIE1MWFNXX1JFR19SQUxVRV9PUF9XUklURV9XUklURSwgMCwgMCwgMCk7CisJbWx4c3dfcmVnX3JhbHVlX2FjdF9pcDJtZV9wYWNrKHJhbHVlX3BsKTsKKwlyZXR1cm4gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmFsdWUpLCByYWx1ZV9wbCk7Cit9CisKK3N0YXRpYyB2b2lkIG1seHN3X3NwX3JvdXRlcl9maWI0X2Fib3J0KHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCit7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOworCXN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKmZpYl9lbnRyeTsKKwlzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICp0bXA7CisJc3RydWN0IG1seHN3X3NwX3ZyICp2cjsKKwlpbnQgaTsKKwlpbnQgZXJyOworCisJcmVzb3VyY2VzID0gbWx4c3dfY29yZV9yZXNvdXJjZXNfZ2V0KG1seHN3X3NwLT5jb3JlKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2VzLT5tYXhfdmlydHVhbF9yb3V0ZXJzOyBpKyspIHsKKwkJdnIgPSAmbWx4c3dfc3AtPnJvdXRlci52cnNbaV07CisJCWlmICghdnItPnVzZWQpCisJCQljb250aW51ZTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmliX2VudHJ5LCB0bXAsCisJCQkJCSAmdnItPmZpYi0+ZW50cnlfbGlzdCwgbGlzdCkgeworCQkJYm9vbCBkb19icmVhayA9ICZ0bXAtPmxpc3QgPT0gJnZyLT5maWItPmVudHJ5X2xpc3Q7CisKKwkJCW1seHN3X3NwX2ZpYl9lbnRyeV9kZWwobWx4c3dfc3AsIGZpYl9lbnRyeSk7CisJCQltbHhzd19zcF9maWJfZW50cnlfcmVtb3ZlKGZpYl9lbnRyeS0+dnItPmZpYiwKKwkJCQkJCSAgZmliX2VudHJ5KTsKKwkJCW1seHN3X3NwX2ZpYl9lbnRyeV9wdXRfYWxsKG1seHN3X3NwLCBmaWJfZW50cnkpOworCQkJaWYgKGRvX2JyZWFrKQorCQkJCWJyZWFrOworCQl9CisJfQorCW1seHN3X3NwLT5yb3V0ZXIuYWJvcnRlZCA9IHRydWU7CisJZXJyID0gbWx4c3dfc3Bfcm91dGVyX3NldF9hYm9ydF90cmFwKG1seHN3X3NwKTsKKwlpZiAoZXJyKQorCQlkZXZfd2FybihtbHhzd19zcC0+YnVzX2luZm8tPmRldiwgIkZhaWxlZCB0byBzZXQgYWJvcnQgdHJhcC5cbiIpOworfQorCitzdGF0aWMgaW50IF9fbWx4c3dfc3Bfcm91dGVyX2luaXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKK3sKKwlzdHJ1Y3QgbWx4c3dfcmVzb3VyY2VzICpyZXNvdXJjZXM7CisJY2hhciByZ2NyX3BsW01MWFNXX1JFR19SR0NSX0xFTl07CisJaW50IGVycjsKKworCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisJaWYgKCFyZXNvdXJjZXMtPm1heF9yaWZfdmFsaWQpCisJCXJldHVybiAtRUlPOworCisJbWx4c3dfc3AtPnJpZnMgPSBrY2FsbG9jKHJlc291cmNlcy0+bWF4X3JpZiwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBtbHhzd19zcF9yaWYgKiksIEdGUF9LRVJORUwpOworCWlmICghbWx4c3dfc3AtPnJpZnMpCisJCXJldHVybiAtRU5PTUVNOworCisJbWx4c3dfcmVnX3JnY3JfcGFjayhyZ2NyX3BsLCB0cnVlKTsKKwltbHhzd19yZWdfcmdjcl9tYXhfcm91dGVyX2ludGVyZmFjZXNfc2V0KHJnY3JfcGwsIHJlc291cmNlcy0+bWF4X3JpZik7CisJZXJyID0gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmdjciksIHJnY3JfcGwpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3JnY3JfZmFpbDsKKworCXJldHVybiAwOworCitlcnJfcmdjcl9mYWlsOgorCWtmcmVlKG1seHN3X3NwLT5yaWZzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX21seHN3X3NwX3JvdXRlcl9maW5pKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCit7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOworCWNoYXIgcmdjcl9wbFtNTFhTV19SRUdfUkdDUl9MRU5dOworCWludCBpOworCisJbWx4c3dfcmVnX3JnY3JfcGFjayhyZ2NyX3BsLCBmYWxzZSk7CisJbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmdjciksIHJnY3JfcGwpOworCisJcmVzb3VyY2VzID0gbWx4c3dfY29yZV9yZXNvdXJjZXNfZ2V0KG1seHN3X3NwLT5jb3JlKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2VzLT5tYXhfcmlmOyBpKyspCisJCVdBUk5fT05fT05DRShtbHhzd19zcC0+cmlmc1tpXSk7CisKKwlrZnJlZShtbHhzd19zcC0+cmlmcyk7Cit9CisKK3N0YXRpYyBpbnQgbWx4c3dfc3Bfcm91dGVyX2ZpYl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AgPSBjb250YWluZXJfb2YobmIsIHN0cnVjdCBtbHhzd19zcCwgZmliX25iKTsKKwlzdHJ1Y3QgZmliX2VudHJ5X25vdGlmaWVyX2luZm8gKmZlbl9pbmZvID0gcHRyOworCWludCBlcnI7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBGSUJfRVZFTlRfRU5UUllfQUREOgorCQllcnIgPSBtbHhzd19zcF9yb3V0ZXJfZmliNF9hZGQobWx4c3dfc3AsIGZlbl9pbmZvKTsKKwkJaWYgKGVycikKKwkJCW1seHN3X3NwX3JvdXRlcl9maWI0X2Fib3J0KG1seHN3X3NwKTsKKwkJYnJlYWs7CisJY2FzZSBGSUJfRVZFTlRfRU5UUllfREVMOgorCQltbHhzd19zcF9yb3V0ZXJfZmliNF9kZWwobWx4c3dfc3AsIGZlbl9pbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBGSUJfRVZFTlRfUlVMRV9BREQ6IC8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgRklCX0VWRU5UX1JVTEVfREVMOgorCQltbHhzd19zcF9yb3V0ZXJfZmliNF9hYm9ydChtbHhzd19zcCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK2ludCBtbHhzd19zcF9yb3V0ZXJfaW5pdChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQoreworCWludCBlcnI7CisKKwlJTklUX0xJU1RfSEVBRCgmbWx4c3dfc3AtPnJvdXRlci5uZXh0aG9wX25laWdoc19saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmbWx4c3dfc3AtPnJvdXRlci5uZXh0aG9wX2dyb3VwX2xpc3QpOworCWVyciA9IF9fbWx4c3dfc3Bfcm91dGVyX2luaXQobWx4c3dfc3ApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwltbHhzd19zcF9scG1faW5pdChtbHhzd19zcCk7CisJZXJyID0gbWx4c3dfc3BfdnJzX2luaXQobWx4c3dfc3ApOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3Zyc19pbml0OworCisJZXJyID0gIG1seHN3X3NwX25laWdoX2luaXQobWx4c3dfc3ApOworCWlmIChlcnIpCisJCWdvdG8gZXJyX25laWdoX2luaXQ7CisKKwltbHhzd19zcC0+ZmliX25iLm5vdGlmaWVyX2NhbGwgPSBtbHhzd19zcF9yb3V0ZXJfZmliX2V2ZW50OworCXJlZ2lzdGVyX2ZpYl9ub3RpZmllcigmbWx4c3dfc3AtPmZpYl9uYik7CisJcmV0dXJuIDA7CisKK2Vycl9uZWlnaF9pbml0OgorCW1seHN3X3NwX3Zyc19maW5pKG1seHN3X3NwKTsKK2Vycl92cnNfaW5pdDoKKwlfX21seHN3X3NwX3JvdXRlcl9maW5pKG1seHN3X3NwKTsKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIG1seHN3X3NwX3JvdXRlcl9maW5pKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCit7CisJdW5yZWdpc3Rlcl9maWJfbm90aWZpZXIoJm1seHN3X3NwLT5maWJfbmIpOworCW1seHN3X3NwX25laWdoX2ZpbmkobWx4c3dfc3ApOworCW1seHN3X3NwX3Zyc19maW5pKG1seHN3X3NwKTsKKwlfX21seHN3X3NwX3JvdXRlcl9maW5pKG1seHN3X3NwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtX3N3aXRjaGRldi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fc3dpdGNoZGV2LmMKaW5kZXggYTFhZDVlNi4uNWUwMGM3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fc3dpdGNoZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fc3dpdGNoZGV2LmMKQEAgLTE2Nyw4ICsxNjcsOCBAQAogfQogCiBzdGF0aWMgaW50IF9fbWx4c3dfc3BfcG9ydF9mbG9vZF9zZXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCi0JCQkJICAgICB1MTYgaWR4X2JlZ2luLCB1MTYgaWR4X2VuZCwgYm9vbCBzZXQsCi0JCQkJICAgICBib29sIG9ubHlfdWMpCisJCQkJICAgICB1MTYgaWR4X2JlZ2luLCB1MTYgaWR4X2VuZCwgYm9vbCB1Y19zZXQsCisJCQkJICAgICBib29sIGJtX3NldCkKIHsKIAlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7CiAJdTE2IGxvY2FsX3BvcnQgPSBtbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0OwpAQCAtMTg3LDI4ICsxODcsMjIgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAltbHhzd19yZWdfc2Z0cl9wYWNrKHNmdHJfcGwsIE1MWFNXX1NQX0ZMT09EX1RBQkxFX1VDLCBpZHhfYmVnaW4sCi0JCQkgICAgdGFibGVfdHlwZSwgcmFuZ2UsIGxvY2FsX3BvcnQsIHNldCk7CisJCQkgICAgdGFibGVfdHlwZSwgcmFuZ2UsIGxvY2FsX3BvcnQsIHVjX3NldCk7CiAJZXJyID0gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcoc2Z0ciksIHNmdHJfcGwpOwogCWlmIChlcnIpCiAJCWdvdG8gYnVmZmVyX291dDsKIAotCS8qIEZsb29kaW5nIGNvbnRyb2wgYWxsb3dzIG9uZSB0byBkZWNpZGUgd2hldGhlciBhIGdpdmVuIHBvcnQgd2lsbAotCSAqIGZsb29kIHVuaWNhc3QgdHJhZmZpYyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gRkRCIGVudHJ5LgotCSAqLwotCWlmIChvbmx5X3VjKQotCQlnb3RvIGJ1ZmZlcl9vdXQ7Ci0KIAltbHhzd19yZWdfc2Z0cl9wYWNrKHNmdHJfcGwsIE1MWFNXX1NQX0ZMT09EX1RBQkxFX0JNLCBpZHhfYmVnaW4sCi0JCQkgICAgdGFibGVfdHlwZSwgcmFuZ2UsIGxvY2FsX3BvcnQsIHNldCk7CisJCQkgICAgdGFibGVfdHlwZSwgcmFuZ2UsIGxvY2FsX3BvcnQsIGJtX3NldCk7CiAJZXJyID0gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcoc2Z0ciksIHNmdHJfcGwpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2Zsb29kX2JtX3NldDsKLQllbHNlCi0JCWdvdG8gYnVmZmVyX291dDsKKworCWdvdG8gYnVmZmVyX291dDsKIAogZXJyX2Zsb29kX2JtX3NldDoKIAltbHhzd19yZWdfc2Z0cl9wYWNrKHNmdHJfcGwsIE1MWFNXX1NQX0ZMT09EX1RBQkxFX1VDLCBpZHhfYmVnaW4sCi0JCQkgICAgdGFibGVfdHlwZSwgcmFuZ2UsIGxvY2FsX3BvcnQsICFzZXQpOworCQkJICAgIHRhYmxlX3R5cGUsIHJhbmdlLCBsb2NhbF9wb3J0LCAhdWNfc2V0KTsKIAltbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhzZnRyKSwgc2Z0cl9wbCk7CiBidWZmZXJfb3V0OgogCWtmcmVlKHNmdHJfcGwpOwpAQCAtMjU3LDE2ICsyNTEsNDMgQEAKIAkgKiB0aGUgc3RhcnQgb2YgdGhlIHZGSURzIHJhbmdlLgogCSAqLwogCXZmaWQgPSBtbHhzd19zcF9maWRfdG9fdmZpZChmaWQpOwotCXJldHVybiBfX21seHN3X3NwX3BvcnRfZmxvb2Rfc2V0KG1seHN3X3NwX3Zwb3J0LCB2ZmlkLCB2ZmlkLCBzZXQsCi0JCQkJCSBmYWxzZSk7CisJcmV0dXJuIF9fbWx4c3dfc3BfcG9ydF9mbG9vZF9zZXQobWx4c3dfc3BfdnBvcnQsIHZmaWQsIHZmaWQsIHNldCwgc2V0KTsKK30KKworc3RhdGljIGludCBtbHhzd19zcF9wb3J0X2xlYXJuaW5nX3NldChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKKwkJCQkgICAgICBib29sIHNldCkKK3sKKwl1MTYgdmlkOworCWludCBlcnI7CisKKwlpZiAobWx4c3dfc3BfcG9ydF9pc192cG9ydChtbHhzd19zcF9wb3J0KSkgeworCQl2aWQgPSBtbHhzd19zcF92cG9ydF92aWRfZ2V0KG1seHN3X3NwX3BvcnQpOworCisJCXJldHVybiBfX21seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChtbHhzd19zcF9wb3J0LCB2aWQsIHZpZCwKKwkJCQkJCQlzZXQpOworCX0KKworCWZvcl9lYWNoX3NldF9iaXQodmlkLCBtbHhzd19zcF9wb3J0LT5hY3RpdmVfdmxhbnMsIFZMQU5fTl9WSUQpIHsKKwkJZXJyID0gX19tbHhzd19zcF9wb3J0X3ZpZF9sZWFybmluZ19zZXQobWx4c3dfc3BfcG9ydCwgdmlkLCB2aWQsCisJCQkJCQkgICAgICAgc2V0KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3BvcnRfdmlkX2xlYXJuaW5nX3NldDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3BvcnRfdmlkX2xlYXJuaW5nX3NldDoKKwlmb3JfZWFjaF9zZXRfYml0KHZpZCwgbWx4c3dfc3BfcG9ydC0+YWN0aXZlX3ZsYW5zLCBWTEFOX05fVklEKQorCQlfX21seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChtbHhzd19zcF9wb3J0LCB2aWQsIHZpZCwgIXNldCk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBtbHhzd19zcF9wb3J0X2F0dHJfYnJfZmxhZ3Nfc2V0KHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0LAogCQkJCQkgICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucywKIAkJCQkJICAgdW5zaWduZWQgbG9uZyBicnBvcnRfZmxhZ3MpCiB7CisJdW5zaWduZWQgbG9uZyBsZWFybmluZyA9IG1seHN3X3NwX3BvcnQtPmxlYXJuaW5nID8gQlJfTEVBUk5JTkcgOiAwOwogCXVuc2lnbmVkIGxvbmcgdWNfZmxvb2QgPSBtbHhzd19zcF9wb3J0LT51Y19mbG9vZCA/IEJSX0ZMT09EIDogMDsKLQlib29sIHNldDsKIAlpbnQgZXJyOwogCiAJaWYgKCFtbHhzd19zcF9wb3J0LT5icmlkZ2VkKQpAQCAtMjc2LDE3ICsyOTcsMzAgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAoKHVjX2Zsb29kIF4gYnJwb3J0X2ZsYWdzKSAmIEJSX0ZMT09EKSB7Ci0JCXNldCA9IG1seHN3X3NwX3BvcnQtPnVjX2Zsb29kID8gZmFsc2UgOiB0cnVlOwotCQllcnIgPSBtbHhzd19zcF9wb3J0X3VjX2Zsb29kX3NldChtbHhzd19zcF9wb3J0LCBzZXQpOworCQllcnIgPSBtbHhzd19zcF9wb3J0X3VjX2Zsb29kX3NldChtbHhzd19zcF9wb3J0LAorCQkJCQkJICFtbHhzd19zcF9wb3J0LT51Y19mbG9vZCk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCX0KIAorCWlmICgobGVhcm5pbmcgXiBicnBvcnRfZmxhZ3MpICYgQlJfTEVBUk5JTkcpIHsKKwkJZXJyID0gbWx4c3dfc3BfcG9ydF9sZWFybmluZ19zZXQobWx4c3dfc3BfcG9ydCwKKwkJCQkJCSAhbWx4c3dfc3BfcG9ydC0+bGVhcm5pbmcpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfcG9ydF9sZWFybmluZ19zZXQ7CisJfQorCiAJbWx4c3dfc3BfcG9ydC0+dWNfZmxvb2QgPSBicnBvcnRfZmxhZ3MgJiBCUl9GTE9PRCA/IDEgOiAwOwogCW1seHN3X3NwX3BvcnQtPmxlYXJuaW5nID0gYnJwb3J0X2ZsYWdzICYgQlJfTEVBUk5JTkcgPyAxIDogMDsKIAltbHhzd19zcF9wb3J0LT5sZWFybmluZ19zeW5jID0gYnJwb3J0X2ZsYWdzICYgQlJfTEVBUk5JTkdfU1lOQyA/IDEgOiAwOwogCiAJcmV0dXJuIDA7CisKK2Vycl9wb3J0X2xlYXJuaW5nX3NldDoKKwlpZiAoKHVjX2Zsb29kIF4gYnJwb3J0X2ZsYWdzKSAmIEJSX0ZMT09EKQorCQltbHhzd19zcF9wb3J0X3VjX2Zsb29kX3NldChtbHhzd19zcF9wb3J0LAorCQkJCQkgICBtbHhzd19zcF9wb3J0LT51Y19mbG9vZCk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBtbHhzd19zcF9hZ2Vpbmdfc2V0KHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AsIHUzMiBhZ2VpbmdfdGltZSkKQEAgLTQ1MCw2ICs0ODQsOCBAQAogCiAJa2ZyZWUoZik7CiAKKwltbHhzd19zcF9maWRfbWFwKG1seHN3X3NwLCBmaWQsIGZhbHNlKTsKKwogCW1seHN3X3NwX2ZpZF9vcChtbHhzd19zcCwgZmlkLCBmYWxzZSk7CiB9CiAKQEAgLTQ1OCw2ICs0OTQsOSBAQAogewogCXN0cnVjdCBtbHhzd19zcF9maWQgKmY7CiAKKwlpZiAodGVzdF9iaXQoZmlkLCBtbHhzd19zcF9wb3J0LT5hY3RpdmVfdmxhbnMpKQorCQlyZXR1cm4gMDsKKwogCWYgPSBtbHhzd19zcF9maWRfZmluZChtbHhzd19zcF9wb3J0LT5tbHhzd19zcCwgZmlkKTsKIAlpZiAoIWYpIHsKIAkJZiA9IG1seHN3X3NwX2ZpZF9jcmVhdGUobWx4c3dfc3BfcG9ydC0+bWx4c3dfc3AsIGZpZCk7CkBAIC01MTUsNyArNTU0LDcgQEAKIAl9CiAKIAllcnIgPSBfX21seHN3X3NwX3BvcnRfZmxvb2Rfc2V0KG1seHN3X3NwX3BvcnQsIGZpZF9iZWdpbiwgZmlkX2VuZCwKLQkJCQkJdHJ1ZSwgZmFsc2UpOworCQkJCQltbHhzd19zcF9wb3J0LT51Y19mbG9vZCwgdHJ1ZSk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfcG9ydF9mbG9vZF9zZXQ7CiAKQEAgLTYzMyw2ICs2NzIsMjcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtbHhzd19zcF9wb3J0X3ZpZF9sZWFybmluZ19zZXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCisJCQkJCSAgdTE2IHZpZF9iZWdpbiwgdTE2IHZpZF9lbmQsCisJCQkJCSAgYm9vbCBsZWFybl9lbmFibGUpCit7CisJdTE2IHZpZCwgdmlkX2U7CisJaW50IGVycjsKKworCWZvciAodmlkID0gdmlkX2JlZ2luOyB2aWQgPD0gdmlkX2VuZDsKKwkgICAgIHZpZCArPSBNTFhTV19SRUdfU1BWTUxSX1JFQ19NQVhfQ09VTlQpIHsKKwkJdmlkX2UgPSBtaW4oKHUxNikgKHZpZCArIE1MWFNXX1JFR19TUFZNTFJfUkVDX01BWF9DT1VOVCAtIDEpLAorCQkJICAgIHZpZF9lbmQpOworCisJCWVyciA9IF9fbWx4c3dfc3BfcG9ydF92aWRfbGVhcm5pbmdfc2V0KG1seHN3X3NwX3BvcnQsIHZpZCwKKwkJCQkJCSAgICAgICB2aWRfZSwgbGVhcm5fZW5hYmxlKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgX19tbHhzd19zcF9wb3J0X3ZsYW5zX2FkZChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKIAkJCQkgICAgIHUxNiB2aWRfYmVnaW4sIHUxNiB2aWRfZW5kLAogCQkJCSAgICAgYm9vbCBmbGFnX3VudGFnZ2VkLCBib29sIGZsYWdfcHZpZCkKQEAgLTY3Myw2ICs3MzMsMTQgQEAKIAkJfQogCX0KIAorCWVyciA9IG1seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChtbHhzd19zcF9wb3J0LCB2aWRfYmVnaW4sIHZpZF9lbmQsCisJCQkJCSAgICAgbWx4c3dfc3BfcG9ydC0+bGVhcm5pbmcpOworCWlmIChlcnIpIHsKKwkJbmV0ZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IGxlYXJuaW5nIGZvciBWSURzICVkLSVkXG4iLAorCQkJICAgdmlkX2JlZ2luLCB2aWRfZW5kKTsKKwkJZ290byBlcnJfcG9ydF92aWRfbGVhcm5pbmdfc2V0OworCX0KKwogCS8qIENoYW5naW5nIGFjdGl2aXR5IGJpdHMgb25seSBpZiBIVyBvcGVyYXRpb24gc3VjY2VkZWQgKi8KIAlmb3IgKHZpZCA9IHZpZF9iZWdpbjsgdmlkIDw9IHZpZF9lbmQ7IHZpZCsrKSB7CiAJCXNldF9iaXQodmlkLCBtbHhzd19zcF9wb3J0LT5hY3RpdmVfdmxhbnMpOwpAQCAtNjk1LDYgKzc2Myw5IEBACiBlcnJfcG9ydF9zdHBfc3RhdGVfc2V0OgogCWZvciAodmlkID0gdmlkX2JlZ2luOyB2aWQgPD0gdmlkX2VuZDsgdmlkKyspCiAJCWNsZWFyX2JpdCh2aWQsIG1seHN3X3NwX3BvcnQtPmFjdGl2ZV92bGFucyk7CisJbWx4c3dfc3BfcG9ydF92aWRfbGVhcm5pbmdfc2V0KG1seHN3X3NwX3BvcnQsIHZpZF9iZWdpbiwgdmlkX2VuZCwKKwkJCQkgICAgICAgZmFsc2UpOworZXJyX3BvcnRfdmlkX2xlYXJuaW5nX3NldDoKIAlpZiAob2xkX3B2aWQgIT0gbWx4c3dfc3BfcG9ydC0+cHZpZCkKIAkJbWx4c3dfc3BfcG9ydF9wdmlkX3NldChtbHhzd19zcF9wb3J0LCBvbGRfcHZpZCk7CiBlcnJfcG9ydF9wdmlkX3NldDoKQEAgLTk3MywxMSArMTA0NCw2IEBACiAJCQkJCSAgICAgIFNXSVRDSERFVl9PQkpfUE9SVF9WTEFOKG9iaiksCiAJCQkJCSAgICAgIHRyYW5zKTsKIAkJYnJlYWs7Ci0JY2FzZSBTV0lUQ0hERVZfT0JKX0lEX0lQVjRfRklCOgotCQllcnIgPSBtbHhzd19zcF9yb3V0ZXJfZmliNF9hZGQobWx4c3dfc3BfcG9ydCwKLQkJCQkJICAgICAgIFNXSVRDSERFVl9PQkpfSVBWNF9GSUIob2JqKSwKLQkJCQkJICAgICAgIHRyYW5zKTsKLQkJYnJlYWs7CiAJY2FzZSBTV0lUQ0hERVZfT0JKX0lEX1BPUlRfRkRCOgogCQllcnIgPSBtbHhzd19zcF9wb3J0X2ZkYl9zdGF0aWNfYWRkKG1seHN3X3NwX3BvcnQsCiAJCQkJCQkgICBTV0lUQ0hERVZfT0JKX1BPUlRfRkRCKG9iaiksCkBAIC05OTcsMzggKzEwNjMsMjUgQEAKIH0KIAogc3RhdGljIGludCBfX21seHN3X3NwX3BvcnRfdmxhbnNfZGVsKHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0LAotCQkJCSAgICAgdTE2IHZpZF9iZWdpbiwgdTE2IHZpZF9lbmQsIGJvb2wgaW5pdCkKKwkJCQkgICAgIHUxNiB2aWRfYmVnaW4sIHUxNiB2aWRfZW5kKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBtbHhzd19zcF9wb3J0LT5kZXY7CiAJdTE2IHZpZCwgcHZpZDsKLQlpbnQgZXJyOwogCi0JaWYgKCFpbml0ICYmICFtbHhzd19zcF9wb3J0LT5icmlkZ2VkKQorCWlmICghbWx4c3dfc3BfcG9ydC0+YnJpZGdlZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQllcnIgPSBfX21seHN3X3NwX3BvcnRfdmxhbnNfc2V0KG1seHN3X3NwX3BvcnQsIHZpZF9iZWdpbiwgdmlkX2VuZCwKLQkJCQkJZmFsc2UsIGZhbHNlKTsKLQlpZiAoZXJyKSB7Ci0JCW5ldGRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIGRlbCBWSURzICVkLSVkXG4iLCB2aWRfYmVnaW4sCi0JCQkgICB2aWRfZW5kKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAoaW5pdCkKLQkJZ290byBvdXQ7CisJbWx4c3dfc3BfcG9ydF92aWRfbGVhcm5pbmdfc2V0KG1seHN3X3NwX3BvcnQsIHZpZF9iZWdpbiwgdmlkX2VuZCwKKwkJCQkgICAgICAgZmFsc2UpOwogCiAJcHZpZCA9IG1seHN3X3NwX3BvcnQtPnB2aWQ7Ci0JaWYgKHB2aWQgPj0gdmlkX2JlZ2luICYmIHB2aWQgPD0gdmlkX2VuZCkgewotCQllcnIgPSBtbHhzd19zcF9wb3J0X3B2aWRfc2V0KG1seHN3X3NwX3BvcnQsIDApOwotCQlpZiAoZXJyKSB7Ci0JCQluZXRkZXZfZXJyKGRldiwgIlVuYWJsZSB0byBkZWwgUFZJRCAlZFxuIiwgcHZpZCk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9Ci0JfQorCWlmIChwdmlkID49IHZpZF9iZWdpbiAmJiBwdmlkIDw9IHZpZF9lbmQpCisJCW1seHN3X3NwX3BvcnRfcHZpZF9zZXQobWx4c3dfc3BfcG9ydCwgMCk7CisKKwlfX21seHN3X3NwX3BvcnRfdmxhbnNfc2V0KG1seHN3X3NwX3BvcnQsIHZpZF9iZWdpbiwgdmlkX2VuZCwgZmFsc2UsCisJCQkJICBmYWxzZSk7CiAKIAltbHhzd19zcF9wb3J0X2ZpZF9sZWF2ZShtbHhzd19zcF9wb3J0LCB2aWRfYmVnaW4sIHZpZF9lbmQpOwogCi1vdXQ6CiAJLyogQ2hhbmdpbmcgYWN0aXZpdHkgYml0cyBvbmx5IGlmIEhXIG9wZXJhdGlvbiBzdWNjZWRlZCAqLwogCWZvciAodmlkID0gdmlkX2JlZ2luOyB2aWQgPD0gdmlkX2VuZDsgdmlkKyspCiAJCWNsZWFyX2JpdCh2aWQsIG1seHN3X3NwX3BvcnQtPmFjdGl2ZV92bGFucyk7CkBAIC0xMDM5LDggKzEwOTIsOCBAQAogc3RhdGljIGludCBtbHhzd19zcF9wb3J0X3ZsYW5zX2RlbChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKIAkJCQkgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X3ZsYW4gKnZsYW4pCiB7Ci0JcmV0dXJuIF9fbWx4c3dfc3BfcG9ydF92bGFuc19kZWwobWx4c3dfc3BfcG9ydCwKLQkJCQkJIHZsYW4tPnZpZF9iZWdpbiwgdmxhbi0+dmlkX2VuZCwgZmFsc2UpOworCXJldHVybiBfX21seHN3X3NwX3BvcnRfdmxhbnNfZGVsKG1seHN3X3NwX3BvcnQsIHZsYW4tPnZpZF9iZWdpbiwKKwkJCQkJIHZsYW4tPnZpZF9lbmQpOwogfQogCiB2b2lkIG1seHN3X3NwX3BvcnRfYWN0aXZlX3ZsYW5zX2RlbChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCkKQEAgLTEwNDgsNyArMTEwMSw3IEBACiAJdTE2IHZpZDsKIAogCWZvcl9lYWNoX3NldF9iaXQodmlkLCBtbHhzd19zcF9wb3J0LT5hY3RpdmVfdmxhbnMsIFZMQU5fTl9WSUQpCi0JCV9fbWx4c3dfc3BfcG9ydF92bGFuc19kZWwobWx4c3dfc3BfcG9ydCwgdmlkLCB2aWQsIGZhbHNlKTsKKwkJX19tbHhzd19zcF9wb3J0X3ZsYW5zX2RlbChtbHhzd19zcF9wb3J0LCB2aWQsIHZpZCk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTExMjMsMTAgKzExNzYsNiBAQAogCQllcnIgPSBtbHhzd19zcF9wb3J0X3ZsYW5zX2RlbChtbHhzd19zcF9wb3J0LAogCQkJCQkgICAgICBTV0lUQ0hERVZfT0JKX1BPUlRfVkxBTihvYmopKTsKIAkJYnJlYWs7Ci0JY2FzZSBTV0lUQ0hERVZfT0JKX0lEX0lQVjRfRklCOgotCQllcnIgPSBtbHhzd19zcF9yb3V0ZXJfZmliNF9kZWwobWx4c3dfc3BfcG9ydCwKLQkJCQkJICAgICAgIFNXSVRDSERFVl9PQkpfSVBWNF9GSUIob2JqKSk7Ci0JCWJyZWFrOwogCWNhc2UgU1dJVENIREVWX09CSl9JRF9QT1JUX0ZEQjoKIAkJZXJyID0gbWx4c3dfc3BfcG9ydF9mZGJfc3RhdGljX2RlbChtbHhzd19zcF9wb3J0LAogCQkJCQkJICAgU1dJVENIREVWX09CSl9QT1JUX0ZEQihvYmopKTsKQEAgLTExNDcsOSArMTE5NiwxMSBAQAogCQkJCQkJICAgdTE2IGxhZ19pZCkKIHsKIAlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydDsKKwlzdHJ1Y3QgbWx4c3dfcmVzb3VyY2VzICpyZXNvdXJjZXM7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUxYU1dfU1BfUE9SVF9QRVJfTEFHX01BWDsgaSsrKSB7CisJcmVzb3VyY2VzID0gbWx4c3dfY29yZV9yZXNvdXJjZXNfZ2V0KG1seHN3X3NwLT5jb3JlKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2VzLT5tYXhfcG9ydHNfaW5fbGFnOyBpKyspIHsKIAkJbWx4c3dfc3BfcG9ydCA9IG1seHN3X3NwX3BvcnRfbGFnZ2VkX2dldChtbHhzd19zcCwgbGFnX2lkLCBpKTsKIAkJaWYgKG1seHN3X3NwX3BvcnQpCiAJCQlyZXR1cm4gbWx4c3dfc3BfcG9ydDsKQEAgLTEzNjgsOCArMTQxOSw2IEBACiAJCXZpZCA9IGZpZDsKIAl9CiAKLQlhZGRpbmcgPSBhZGRpbmcgJiYgbWx4c3dfc3BfcG9ydC0+bGVhcm5pbmc7Ci0KIGRvX2ZkYl9vcDoKIAllcnIgPSBtbHhzd19zcF9wb3J0X2ZkYl91Y19vcChtbHhzd19zcCwgbG9jYWxfcG9ydCwgbWFjLCBmaWQsCiAJCQkJICAgICAgYWRkaW5nLCB0cnVlKTsKQEAgLTE0MzEsOCArMTQ4MCw2IEBACiAJCXZpZCA9IGZpZDsKIAl9CiAKLQlhZGRpbmcgPSBhZGRpbmcgJiYgbWx4c3dfc3BfcG9ydC0+bGVhcm5pbmc7Ci0KIGRvX2ZkYl9vcDoKIAllcnIgPSBtbHhzd19zcF9wb3J0X2ZkYl91Y19sYWdfb3AobWx4c3dfc3AsIGxhZ19pZCwgbWFjLCBmaWQsIGxhZ192aWQsCiAJCQkJCSAgYWRkaW5nLCB0cnVlKTsKQEAgLTE0OTgsMjAgKzE1NDUsMTggQEAKIAltbHhzd19zcCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbWx4c3dfc3AsIGZkYl9ub3RpZnkuZHcud29yayk7CiAKIAlydG5sX2xvY2soKTsKLQlkbyB7Ci0JCW1seHN3X3JlZ19zZm5fcGFjayhzZm5fcGwpOwotCQllcnIgPSBtbHhzd19yZWdfcXVlcnkobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhzZm4pLCBzZm5fcGwpOwotCQlpZiAoZXJyKSB7Ci0JCQlkZXZfZXJyX3JhdGVsaW1pdGVkKG1seHN3X3NwLT5idXNfaW5mby0+ZGV2LCAiRmFpbGVkIHRvIGdldCBGREIgbm90aWZpY2F0aW9uc1xuIik7Ci0JCQlicmVhazsKLQkJfQotCQludW1fcmVjID0gbWx4c3dfcmVnX3Nmbl9udW1fcmVjX2dldChzZm5fcGwpOwotCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3JlYzsgaSsrKQotCQkJbWx4c3dfc3BfZmRiX25vdGlmeV9yZWNfcHJvY2VzcyhtbHhzd19zcCwgc2ZuX3BsLCBpKTsKKwltbHhzd19yZWdfc2ZuX3BhY2soc2ZuX3BsKTsKKwllcnIgPSBtbHhzd19yZWdfcXVlcnkobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhzZm4pLCBzZm5fcGwpOworCWlmIChlcnIpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChtbHhzd19zcC0+YnVzX2luZm8tPmRldiwgIkZhaWxlZCB0byBnZXQgRkRCIG5vdGlmaWNhdGlvbnNcbiIpOworCQlnb3RvIG91dDsKKwl9CisJbnVtX3JlYyA9IG1seHN3X3JlZ19zZm5fbnVtX3JlY19nZXQoc2ZuX3BsKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3JlYzsgaSsrKQorCQltbHhzd19zcF9mZGJfbm90aWZ5X3JlY19wcm9jZXNzKG1seHN3X3NwLCBzZm5fcGwsIGkpOwogCi0JfSB3aGlsZSAobnVtX3JlYyk7CitvdXQ6CiAJcnRubF91bmxvY2soKTsKLQogCWtmcmVlKHNmbl9wbCk7CiAJbWx4c3dfc3BfZmRiX25vdGlmeV93b3JrX3NjaGVkdWxlKG1seHN3X3NwKTsKIH0KQEAgLTE1NDYsMzIgKzE1OTEsNiBAQAogCW1seHN3X3NwX2ZkYl9maW5pKG1seHN3X3NwKTsKIH0KIAotaW50IG1seHN3X3NwX3BvcnRfdmxhbl9pbml0KHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBtbHhzd19zcF9wb3J0LT5kZXY7Ci0JaW50IGVycjsKLQotCS8qIEFsbG93IG9ubHkgdW50YWdnZWQgcGFja2V0cyB0byBpbmdyZXNzIGFuZCB0YWcgdGhlbSBpbnRlcm5hbGx5Ci0JICogd2l0aCBWSUQgMS4KLQkgKi8KLQltbHhzd19zcF9wb3J0LT5wdmlkID0gMTsKLQllcnIgPSBfX21seHN3X3NwX3BvcnRfdmxhbnNfZGVsKG1seHN3X3NwX3BvcnQsIDAsIFZMQU5fTl9WSUQgLSAxLAotCQkJCQl0cnVlKTsKLQlpZiAoZXJyKSB7Ci0JCW5ldGRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIGluaXQgVkxBTnNcbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCS8qIEFkZCBpbXBsaWNpdCBWTEFOIGludGVyZmFjZSBpbiB0aGUgZGV2aWNlLCBzbyB0aGF0IHVudGFnZ2VkCi0JICogcGFja2V0cyB3aWxsIGJlIGNsYXNzaWZpZWQgdG8gdGhlIGRlZmF1bHQgdkZJRC4KLQkgKi8KLQllcnIgPSBtbHhzd19zcF9wb3J0X2FkZF92aWQoZGV2LCAwLCAxKTsKLQlpZiAoZXJyKQotCQluZXRkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBjb25maWd1cmUgZGVmYXVsdCB2RklEXG4iKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KIHZvaWQgbWx4c3dfc3BfcG9ydF9zd2l0Y2hkZXZfaW5pdChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCkKIHsKIAltbHhzd19zcF9wb3J0LT5kZXYtPnN3aXRjaGRldl9vcHMgPSAmbWx4c3dfc3BfcG9ydF9zd2l0Y2hkZXZfb3BzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3dpdGNoeDIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3N3aXRjaHgyLmMKaW5kZXggMzc3ZGFhNC4uYzBjMjNlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3dpdGNoeDIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zd2l0Y2h4Mi5jCkBAIC05OTcsNyArOTk3LDcgQEAKIAkvKiBFYWNoIHBhY2tldCBuZWVkcyB0byBoYXZlIGEgVHggaGVhZGVyIChtZXRhZGF0YSkgb24gdG9wIGFsbCBvdGhlcgogCSAqIGhlYWRlcnMuCiAJICovCi0JZGV2LT5oYXJkX2hlYWRlcl9sZW4gKz0gTUxYU1dfVFhIRFJfTEVOOworCWRldi0+bmVlZGVkX2hlYWRyb29tID0gTUxYU1dfVFhIRFJfTEVOOwogCiAJZXJyID0gbWx4c3dfc3hfcG9ydF9tb2R1bGVfY2hlY2sobWx4c3dfc3hfcG9ydCwgJnVzYWJsZSk7CiAJaWYgKGVycikgewpAQCAtMTUxMiwxMCArMTUxMiw2IEBACiBzdGF0aWMgc3RydWN0IG1seHN3X2NvbmZpZ19wcm9maWxlIG1seHN3X3N4X2NvbmZpZ19wcm9maWxlID0gewogCS51c2VkX21heF92ZXBhX2NoYW5uZWxzCQk9IDEsCiAJLm1heF92ZXBhX2NoYW5uZWxzCQk9IDAsCi0JLnVzZWRfbWF4X2xhZwkJCT0gMSwKLQkubWF4X2xhZwkJCT0gNjQsCi0JLnVzZWRfbWF4X3BvcnRfcGVyX2xhZwkJPSAxLAotCS5tYXhfcG9ydF9wZXJfbGFnCQk9IDE2LAogCS51c2VkX21heF9taWQJCQk9IDEsCiAJLm1heF9taWQJCQk9IDcwMDAsCiAJLnVzZWRfbWF4X3BndAkJCT0gMSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3RyYXAuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3RyYXAuaAppbmRleCA0NzBkNzY5Li5lZDhlMzAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy90cmFwLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvdHJhcC5oCkBAIC01Niw2ICs1NiwxMCBAQAogCU1MWFNXX1RSQVBfSURfSUdNUF9WM19SRVBPUlQgPSAweDM0LAogCU1MWFNXX1RSQVBfSURfQVJQQkMgPSAweDUwLAogCU1MWFNXX1RSQVBfSURfQVJQVUMgPSAweDUxLAorCU1MWFNXX1RSQVBfSURfTVRVRVJST1IgPSAweDUyLAorCU1MWFNXX1RSQVBfSURfVFRMRVJST1IgPSAweDUzLAorCU1MWFNXX1RSQVBfSURfTEJFUlJPUiA9IDB4NTQsCisJTUxYU1dfVFJBUF9JRF9PU1BGID0gMHg1NSwKIAlNTFhTV19UUkFQX0lEX0lQMk1FID0gMHg1RiwKIAlNTFhTV19UUkFQX0lEX1JUUl9JTkdSRVNTMCA9IDB4NzAsCiAJTUxYU1dfVFJBUF9JRF9IT1NUX01JU1NfSVBWNCA9IDB4OTAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL25zODM4MjAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25hdHNlbWkvbnM4MzgyMC5jCmluZGV4IGViODA3YjAuLjU2OWFkZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25hdHNlbWkvbnM4MzgyMC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25hdHNlbWkvbnM4MzgyMC5jCkBAIC0xMzQsNyArMTM0LDcgQEAKIAogLyogdHVuYWJsZXMgKi8KICNkZWZpbmUgUlhfQlVGX1NJWkUJMTUwMAkvKiA4MTkyICovCi0jaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVkxBTl84MDIxUSkKICNkZWZpbmUgTlM4MzgyMF9WTEFOX0FDQ0VMX1NVUFBPUlQKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9NYWtlZmlsZQppbmRleCA2ODE3ODgxLi4wZWZiMmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvTWFrZWZpbGUKQEAgLTMsNiArMywxMyBAQAogbmZwX25ldHZmLW9ianMgOj0gXAogCSAgICBuZnBfbmV0X2NvbW1vbi5vIFwKIAkgICAgbmZwX25ldF9ldGh0b29sLm8gXAorCSAgICBuZnBfbmV0X29mZmxvYWQubyBcCiAJICAgIG5mcF9uZXR2Zl9tYWluLm8KIAoraWZlcSAoJChDT05GSUdfQlBGX1NZU0NBTEwpLHkpCituZnBfbmV0dmYtb2JqcyArPSBcCisJICAgIG5mcF9icGZfdmVyaWZpZXIubyBcCisJICAgIG5mcF9icGZfaml0Lm8KK2VuZGlmCisKIG5mcF9uZXR2Zi0kKENPTkZJR19ORlBfTkVUX0RFQlVHKSArPSBuZnBfbmV0X2RlYnVnZnMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfYXNtLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjQ4NGI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfYXNtLmgKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTmV0cm9ub21lIFN5c3RlbXMsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIExpY2Vuc2UgVmVyc2lvbiAyLAorICogSnVuZSAxOTkxIGFzIHNob3duIGluIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3Rvcnkgb2YgdGhpcworICogc291cmNlIHRyZWUgb3IgdGhlIEJTRCAyLUNsYXVzZSBMaWNlbnNlIHByb3ZpZGVkIGJlbG93LiAgWW91IGhhdmUgdGhlCisgKiBvcHRpb24gdG8gbGljZW5zZSB0aGlzIHNvZnR3YXJlIHVuZGVyIHRoZSBjb21wbGV0ZSB0ZXJtcyBvZiBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBUaGUgQlNEIDItQ2xhdXNlIExpY2Vuc2U6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fTkZQX0FTTV9IX18KKyNkZWZpbmUgX19ORlBfQVNNX0hfXyAxCisKKyNpbmNsdWRlICJuZnBfYnBmLmgiCisKKyNkZWZpbmUgUkVHX05PTkUJMAorCisjZGVmaW5lIFJFX1JFR19OT19EU1QJMHgwMjAKKyNkZWZpbmUgUkVfUkVHX0lNTQkweDAyMAorI2RlZmluZSBSRV9SRUdfSU1NX2VuY29kZSh4KQkJCQkJXAorCShSRV9SRUdfSU1NIHwgKCh4KSAmIDB4MWYpIHwgKCgoeCkgJiAweDYwKSA8PCAxKSkKKyNkZWZpbmUgUkVfUkVHX0lNTV9NQVgJIDB4MDdmVUxMCisjZGVmaW5lIFJFX1JFR19YRlIJMHgwODAKKworI2RlZmluZSBVUl9SRUdfWEZSCTB4MTgwCisjZGVmaW5lIFVSX1JFR19OTgkweDI4MAorI2RlZmluZSBVUl9SRUdfTk9fRFNUCTB4MzAwCisjZGVmaW5lIFVSX1JFR19JTU0JVVJfUkVHX05PX0RTVAorI2RlZmluZSBVUl9SRUdfSU1NX2VuY29kZSh4KSAoVVJfUkVHX0lNTSB8ICh4KSkKKyNkZWZpbmUgVVJfUkVHX0lNTV9NQVgJIDB4MGZmVUxMCisKKyNkZWZpbmUgT1BfQlJfQkFTRQkweDBkODAwMDAwMDIwVUxMCisjZGVmaW5lIE9QX0JSX0JBU0VfTUFTSwkweDBmODAwMGMzY2UwVUxMCisjZGVmaW5lIE9QX0JSX01BU0sJMHgwMDAwMDAwMDAxZlVMTAorI2RlZmluZSBPUF9CUl9FVl9QSVAJMHgwMDAwMDAwMDMwMFVMTAorI2RlZmluZSBPUF9CUl9DU1MJMHgwMDAwMDAzYzAwMFVMTAorI2RlZmluZSBPUF9CUl9ERUZCUgkweDAwMDAwMzAwMDAwVUxMCisjZGVmaW5lIE9QX0JSX0FERFJfTE8JMHgwMDdmZmMwMDAwMFVMTAorI2RlZmluZSBPUF9CUl9BRERSX0hJCTB4MTAwMDAwMDAwMDBVTEwKKworI2RlZmluZSBuZnBfaXNfYnIoX2luc24pCQkJCVwKKwkoKChfaW5zbikgJiBPUF9CUl9CQVNFX01BU0spID09IE9QX0JSX0JBU0UpCisKK2VudW0gYnJfbWFzayB7CisJQlJfQkVRID0gMHgwMCwKKwlCUl9CTkUgPSAweDAxLAorCUJSX0JIUyA9IDB4MDQsCisJQlJfQkxPID0gMHgwNSwKKwlCUl9CR0UgPSAweDA4LAorCUJSX1VOQyA9IDB4MTgsCit9OworCitlbnVtIGJyX2V2X3BpcCB7CisJQlJfRVZfUElQX1VOQ09ORCA9IDAsCisJQlJfRVZfUElQX0NPTkQgPSAxLAorfTsKKworZW51bSBicl9jdHhfc2lnbmFsX3N0YXRlIHsKKwlCUl9DU1NfTk9ORSA9IDIsCit9OworCisjZGVmaW5lIE9QX0JCWVRFX0JBU0UJMHgwYzgwMDAwMDAwMFVMTAorI2RlZmluZSBPUF9CQl9BX1NSQwkweDAwMDAwMDAwMGZmVUxMCisjZGVmaW5lIE9QX0JCX0JZVEUJMHgwMDAwMDAwMDMwMFVMTAorI2RlZmluZSBPUF9CQl9CX1NSQwkweDAwMDAwMDNmYzAwVUxMCisjZGVmaW5lIE9QX0JCX0k4CTB4MDAwMDAwNDAwMDBVTEwKKyNkZWZpbmUgT1BfQkJfRVEJMHgwMDAwMDA4MDAwMFVMTAorI2RlZmluZSBPUF9CQl9ERUZCUgkweDAwMDAwMzAwMDAwVUxMCisjZGVmaW5lIE9QX0JCX0FERFJfTE8JMHgwMDdmZmMwMDAwMFVMTAorI2RlZmluZSBPUF9CQl9BRERSX0hJCTB4MTAwMDAwMDAwMDBVTEwKKworI2RlZmluZSBPUF9CQUxVX0JBU0UJMHgwZTgwMDAwMDAwMFVMTAorI2RlZmluZSBPUF9CQV9BX1NSQwkweDAwMDAwMDAwM2ZmVUxMCisjZGVmaW5lIE9QX0JBX0JfU1JDCTB4MDAwMDAwZmZjMDBVTEwKKyNkZWZpbmUgT1BfQkFfREVGQlIJMHgwMDAwMDMwMDAwMFVMTAorI2RlZmluZSBPUF9CQV9BRERSX0hJCTB4MDAwN2ZjMDAwMDBVTEwKKworI2RlZmluZSBPUF9JTU1FRF9BX1NSQwkweDAwMDAwMDAwM2ZmVUxMCisjZGVmaW5lIE9QX0lNTUVEX0JfU1JDCTB4MDAwMDAwZmZjMDBVTEwKKyNkZWZpbmUgT1BfSU1NRURfSU1NCTB4MDAwMGZmMDAwMDBVTEwKKyNkZWZpbmUgT1BfSU1NRURfV0lEVEgJMHgwMDA2MDAwMDAwMFVMTAorI2RlZmluZSBPUF9JTU1FRF9JTlYJMHgwMDA4MDAwMDAwMFVMTAorI2RlZmluZSBPUF9JTU1FRF9TSElGVAkweDAwNjAwMDAwMDAwVUxMCisjZGVmaW5lIE9QX0lNTUVEX0JBU0UJMHgwZjAwMDAwMDAwMFVMTAorI2RlZmluZSBPUF9JTU1FRF9XUl9BQgkweDIwMDAwMDAwMDAwVUxMCisKK2VudW0gaW1tZWRfd2lkdGggeworCUlNTUVEX1dJRFRIX0FMTCA9IDAsCisJSU1NRURfV0lEVEhfQllURSA9IDEsCisJSU1NRURfV0lEVEhfV09SRCA9IDIsCit9OworCitlbnVtIGltbWVkX3NoaWZ0IHsKKwlJTU1FRF9TSElGVF8wQiA9IDAsCisJSU1NRURfU0hJRlRfMUIgPSAxLAorCUlNTUVEX1NISUZUXzJCID0gMiwKK307CisKKyNkZWZpbmUgT1BfU0hGX0JBU0UJMHgwODAwMDAwMDAwMFVMTAorI2RlZmluZSBPUF9TSEZfQV9TUkMJMHgwMDAwMDAwMDBmZlVMTAorI2RlZmluZSBPUF9TSEZfU0MJMHgwMDAwMDAwMDMwMFVMTAorI2RlZmluZSBPUF9TSEZfQl9TUkMJMHgwMDAwMDAzZmMwMFVMTAorI2RlZmluZSBPUF9TSEZfSTgJMHgwMDAwMDA0MDAwMFVMTAorI2RlZmluZSBPUF9TSEZfU1cJMHgwMDAwMDA4MDAwMFVMTAorI2RlZmluZSBPUF9TSEZfRFNUCTB4MDAwMGZmMDAwMDBVTEwKKyNkZWZpbmUgT1BfU0hGX1NISUZUCTB4MDAxZjAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfU0hGX09QCTB4MDBlMDAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfU0hGX0RTVF9BQgkweDAxMDAwMDAwMDAwVUxMCisjZGVmaW5lIE9QX1NIRl9XUl9BQgkweDIwMDAwMDAwMDAwVUxMCisKK2VudW0gc2hmX29wIHsKKwlTSEZfT1BfTk9ORSA9IDAsCisJU0hGX09QX0FORCA9IDIsCisJU0hGX09QX09SID0gNSwKK307CisKK2VudW0gc2hmX3NjIHsKKwlTSEZfU0NfUl9ST1QgPSAwLAorCVNIRl9TQ19SX1NIRiA9IDEsCisJU0hGX1NDX0xfU0hGID0gMiwKKwlTSEZfU0NfUl9EU0hGID0gMywKK307CisKKyNkZWZpbmUgT1BfQUxVX0FfU1JDCTB4MDAwMDAwMDAzZmZVTEwKKyNkZWZpbmUgT1BfQUxVX0JfU1JDCTB4MDAwMDAwZmZjMDBVTEwKKyNkZWZpbmUgT1BfQUxVX0RTVAkweDAwMDNmZjAwMDAwVUxMCisjZGVmaW5lIE9QX0FMVV9TVwkweDAwMDQwMDAwMDAwVUxMCisjZGVmaW5lIE9QX0FMVV9PUAkweDAwZjgwMDAwMDAwVUxMCisjZGVmaW5lIE9QX0FMVV9EU1RfQUIJMHgwMTAwMDAwMDAwMFVMTAorI2RlZmluZSBPUF9BTFVfQkFTRQkweDBhMDAwMDAwMDAwVUxMCisjZGVmaW5lIE9QX0FMVV9XUl9BQgkweDIwMDAwMDAwMDAwVUxMCisKK2VudW0gYWx1X29wIHsKKwlBTFVfT1BfTk9ORQk9IDB4MDAsCisJQUxVX09QX0FERAk9IDB4MDEsCisJQUxVX09QX05FRwk9IDB4MDQsCisJQUxVX09QX0FORAk9IDB4MDgsCisJQUxVX09QX1NVQl9DCT0gMHgwZCwKKwlBTFVfT1BfQUREX0MJPSAweDExLAorCUFMVV9PUF9PUgk9IDB4MTQsCisJQUxVX09QX1NVQgk9IDB4MTUsCisJQUxVX09QX1hPUgk9IDB4MTgsCit9OworCitlbnVtIGFsdV9kc3RfYWIgeworCUFMVV9EU1RfQSA9IDAsCisJQUxVX0RTVF9CID0gMSwKK307CisKKyNkZWZpbmUgT1BfTERGX0JBU0UJMHgwYzAwMDAwMDAwMFVMTAorI2RlZmluZSBPUF9MREZfQV9TUkMJMHgwMDAwMDAwMDBmZlVMTAorI2RlZmluZSBPUF9MREZfU0MJMHgwMDAwMDAwMDMwMFVMTAorI2RlZmluZSBPUF9MREZfQl9TUkMJMHgwMDAwMDAzZmMwMFVMTAorI2RlZmluZSBPUF9MREZfSTgJMHgwMDAwMDA0MDAwMFVMTAorI2RlZmluZSBPUF9MREZfU1cJMHgwMDAwMDA4MDAwMFVMTAorI2RlZmluZSBPUF9MREZfWkYJMHgwMDAwMDEwMDAwMFVMTAorI2RlZmluZSBPUF9MREZfQk1BU0sJMHgwMDAwZjAwMDAwMFVMTAorI2RlZmluZSBPUF9MREZfU0hGCTB4MDAxZjAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfTERGX1dSX0FCCTB4MjAwMDAwMDAwMDBVTEwKKworI2RlZmluZSBPUF9DTURfQV9TUkMJIDB4MDAwMDAwMDAwZmZVTEwKKyNkZWZpbmUgT1BfQ01EX0NUWAkgMHgwMDAwMDAwMDMwMFVMTAorI2RlZmluZSBPUF9DTURfQl9TUkMJIDB4MDAwMDAwM2ZjMDBVTEwKKyNkZWZpbmUgT1BfQ01EX1RPS0VOCSAweDAwMDAwMGMwMDAwVUxMCisjZGVmaW5lIE9QX0NNRF9YRkVSCSAweDAwMDAxZjAwMDAwVUxMCisjZGVmaW5lIE9QX0NNRF9DTlQJIDB4MDAwMGUwMDAwMDBVTEwKKyNkZWZpbmUgT1BfQ01EX1NJRwkgMHgwMDBmMDAwMDAwMFVMTAorI2RlZmluZSBPUF9DTURfVEdUX0NNRAkgMHgwN2YwMDAwMDAwMFVMTAorI2RlZmluZSBPUF9DTURfTU9ERQkweDFjMDAwMDAwMDAwMFVMTAorCitzdHJ1Y3QgY21kX3RndF9hY3QgeworCXU4IHRva2VuOworCXU4IHRndF9jbWQ7Cit9OworCitlbnVtIGNtZF90Z3RfbWFwIHsKKwlDTURfVEdUX1JFQUQ4LAorCUNNRF9UR1RfV1JJVEU4LAorCUNNRF9UR1RfUkVBRF9MRSwKKwlDTURfVEdUX1JFQURfU1dBUF9MRSwKKwlfX0NNRF9UR1RfTUFQX1NJWkUsCit9OworCitlbnVtIGNtZF9tb2RlIHsKKwlDTURfTU9ERV80MGJfQUIJPSAwLAorCUNNRF9NT0RFXzQwYl9CQQk9IDEsCisJQ01EX01PREVfMzJiCT0gNCwKK307CisKK2VudW0gY21kX2N0eF9zd2FwIHsKKwlDTURfQ1RYX1NXQVAgPSAwLAorCUNNRF9DVFhfTk9fU1dBUCA9IDMsCit9OworCisjZGVmaW5lIE9QX0xDU1JfQkFTRQkweDBmYzAwMDAwMDAwVUxMCisjZGVmaW5lIE9QX0xDU1JfQV9TUkMJMHgwMDAwMDAwMDNmZlVMTAorI2RlZmluZSBPUF9MQ1NSX0JfU1JDCTB4MDAwMDAwZmZjMDBVTEwKKyNkZWZpbmUgT1BfTENTUl9XUklURQkweDAwMDAwMjAwMDAwVUxMCisjZGVmaW5lIE9QX0xDU1JfQUREUgkweDAwMWZmYzAwMDAwVUxMCisKK2VudW0gbGNzcl93cl9zcmMgeworCUxDU1JfV1JfQVJFRywKKwlMQ1NSX1dSX0JSRUcsCisJTENTUl9XUl9JTU0sCit9OworCisjZGVmaW5lIE9QX0NBUkJfQkFTRQkweDBlMDAwMDAwMDAwVUxMCisjZGVmaW5lIE9QX0NBUkJfT1IJMHgwMDAwMDAxMDAwMFVMTAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX2JwZi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfYnBmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdhYThhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX2JwZi5oCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IE5ldHJvbm9tZSBTeXN0ZW1zLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBMaWNlbnNlIFZlcnNpb24gMiwKKyAqIEp1bmUgMTk5MSBhcyBzaG93biBpbiB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IG9mIHRoaXMKKyAqIHNvdXJjZSB0cmVlIG9yIHRoZSBCU0QgMi1DbGF1c2UgTGljZW5zZSBwcm92aWRlZCBiZWxvdy4gIFlvdSBoYXZlIHRoZQorICogb3B0aW9uIHRvIGxpY2Vuc2UgdGhpcyBzb2Z0d2FyZSB1bmRlciB0aGUgY29tcGxldGUgdGVybXMgb2YgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogVGhlIEJTRCAyLUNsYXVzZSBMaWNlbnNlOgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX05GUF9CUEZfSF9fCisjZGVmaW5lIF9fTkZQX0JQRl9IX18gMQorCisjaW5jbHVkZSA8bGludXgvYml0ZmllbGQuaD4KKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBGSUVMRF9GSVQobWFzaywgdmFsKSAgKCEoKCgodTY0KXZhbCkgPDwgX19iZl9zaGYobWFzaykpICYgfihtYXNrKSkpCisKKy8qIEZvciBicmFuY2ggZml4dXAgbG9naWMgdXNlIHVwLW1vc3QgYnl0ZSBvZiBicmFuY2ggaW5zdHJ1Y3Rpb24gYXMgc2NyYXRjaAorICogYXJlYS4gIFJlbWVtYmVyIHRvIGNsZWFyIHRoaXMgYmVmb3JlIHNlbmRpbmcgaW5zdHJ1Y3Rpb25zIHRvIEhXIQorICovCisjZGVmaW5lIE9QX0JSX1NQRUNJQUwJMHhmZjAwMDAwMDAwMDAwMDAwVUxMCisKK2VudW0gYnJfc3BlY2lhbCB7CisJT1BfQlJfTk9STUFMID0gMCwKKwlPUF9CUl9HT19PVVQsCisJT1BfQlJfR09fQUJPUlQsCit9OworCitlbnVtIHN0YXRpY19yZWdzIHsKKwlTVEFUSUNfUkVHX1BLVAkJPSAxLAorI2RlZmluZSBSRUdfUEtUX0JBTksJQUxVX0RTVF9BCisJU1RBVElDX1JFR19JTU0JCT0gMiwgLyogQmFuayBBQiAqLworfTsKKworZW51bSBuZnBfYnBmX2FjdGlvbl90eXBlIHsKKwlOTl9BQ1RfVENfRFJPUCwKKwlOTl9BQ1RfVENfUkVESVIsCisJTk5fQUNUX0RJUkVDVCwKK307CisKKy8qIFNvZnR3YXJlIHJlZ2lzdGVyIHJlcHJlc2VudGF0aW9uLCBoYXJkd2FyZSBlbmNvZGluZyBpbiBhc20uaCAqLworI2RlZmluZSBOTl9SRUdfVFlQRQlHRU5NQVNLKDMxLCAyNCkKKyNkZWZpbmUgTk5fUkVHX1ZBTAlHRU5NQVNLKDcsIDApCisKK2VudW0gbmZwX2JwZl9yZWdfdHlwZSB7CisJTk5fUkVHX0dQUl9BID0JQklUKDApLAorCU5OX1JFR19HUFJfQiA9CUJJVCgxKSwKKwlOTl9SRUdfTk5SID0JQklUKDIpLAorCU5OX1JFR19YRkVSID0JQklUKDMpLAorCU5OX1JFR19JTU0gPQlCSVQoNCksCisJTk5fUkVHX05PTkUgPQlCSVQoNSksCit9OworCisjZGVmaW5lIE5OX1JFR19HUFJfQk9USAkoTk5fUkVHX0dQUl9BIHwgTk5fUkVHX0dQUl9CKQorCisjZGVmaW5lIHJlZ19ib3RoKHgpCSgoeCkgfCBGSUVMRF9QUkVQKE5OX1JFR19UWVBFLCBOTl9SRUdfR1BSX0JPVEgpKQorI2RlZmluZSByZWdfYSh4KQkoKHgpIHwgRklFTERfUFJFUChOTl9SRUdfVFlQRSwgTk5fUkVHX0dQUl9BKSkKKyNkZWZpbmUgcmVnX2IoeCkJKCh4KSB8IEZJRUxEX1BSRVAoTk5fUkVHX1RZUEUsIE5OX1JFR19HUFJfQikpCisjZGVmaW5lIHJlZ19ubnIoeCkJKCh4KSB8IEZJRUxEX1BSRVAoTk5fUkVHX1RZUEUsIE5OX1JFR19OTlIpKQorI2RlZmluZSByZWdfeGZlcih4KQkoKHgpIHwgRklFTERfUFJFUChOTl9SRUdfVFlQRSwgTk5fUkVHX1hGRVIpKQorI2RlZmluZSByZWdfaW1tKHgpCSgoeCkgfCBGSUVMRF9QUkVQKE5OX1JFR19UWVBFLCBOTl9SRUdfSU1NKSkKKyNkZWZpbmUgcmVnX25vbmUoKQkoRklFTERfUFJFUChOTl9SRUdfVFlQRSwgTk5fUkVHX05PTkUpKQorCisjZGVmaW5lIHBrdF9yZWcobnApCXJlZ19hKChucCktPnJlZ3NfcGVyX3RocmVhZCAtIFNUQVRJQ19SRUdfUEtUKQorI2RlZmluZSBpbW1fYShucCkJcmVnX2EoKG5wKS0+cmVnc19wZXJfdGhyZWFkIC0gU1RBVElDX1JFR19JTU0pCisjZGVmaW5lIGltbV9iKG5wKQlyZWdfYigobnApLT5yZWdzX3Blcl90aHJlYWQgLSBTVEFUSUNfUkVHX0lNTSkKKyNkZWZpbmUgaW1tX2JvdGgobnApCXJlZ19ib3RoKChucCktPnJlZ3NfcGVyX3RocmVhZCAtIFNUQVRJQ19SRUdfSU1NKQorCisjZGVmaW5lIE5GUF9CUEZfQUJJX0ZMQUdTCXJlZ19ubnIoMCkKKyNkZWZpbmUgICBORlBfQlBGX0FCSV9GTEFHX01BUksJMQorI2RlZmluZSBORlBfQlBGX0FCSV9NQVJLCXJlZ19ubnIoMSkKKyNkZWZpbmUgTkZQX0JQRl9BQklfUEtUCQlyZWdfbm5yKDIpCisjZGVmaW5lIE5GUF9CUEZfQUJJX0xFTgkJcmVnX25ucigzKQorCitzdHJ1Y3QgbmZwX3Byb2c7CitzdHJ1Y3QgbmZwX2luc25fbWV0YTsKK3R5cGVkZWYgaW50ICgqaW5zdHJfY2JfdCkoc3RydWN0IG5mcF9wcm9nICosIHN0cnVjdCBuZnBfaW5zbl9tZXRhICopOworCisjZGVmaW5lIG5mcF9wcm9nX2ZpcnN0X21ldGEobmZwX3Byb2cpCQkJCQlcCisJbGlzdF9maXJzdF9lbnRyeSgmKG5mcF9wcm9nKS0+aW5zbnMsIHN0cnVjdCBuZnBfaW5zbl9tZXRhLCBsKQorI2RlZmluZSBuZnBfcHJvZ19sYXN0X21ldGEobmZwX3Byb2cpCQkJCQlcCisJbGlzdF9sYXN0X2VudHJ5KCYobmZwX3Byb2cpLT5pbnNucywgc3RydWN0IG5mcF9pbnNuX21ldGEsIGwpCisjZGVmaW5lIG5mcF9tZXRhX25leHQobWV0YSkJbGlzdF9uZXh0X2VudHJ5KG1ldGEsIGwpCisjZGVmaW5lIG5mcF9tZXRhX3ByZXYobWV0YSkJbGlzdF9wcmV2X2VudHJ5KG1ldGEsIGwpCisKKy8qKgorICogc3RydWN0IG5mcF9pbnNuX21ldGEgLSBCUEYgaW5zdHJ1Y3Rpb24gd3JhcHBlcgorICogQGluc246IEJQRiBpbnN0cnVjdGlvbgorICogQG9mZjogaW5kZXggb2YgZmlyc3QgZ2VuZXJhdGVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gKGluIG5mcF9wcm9nLnByb2cpCisgKiBAbjogZUJQRiBpbnN0cnVjdGlvbiBudW1iZXIKKyAqIEBza2lwOiBza2lwIHRoaXMgaW5zdHJ1Y3Rpb24gKG9wdGltaXplZCBvdXQpCisgKiBAZG91YmxlX2NiOiBjYWxsYmFjayBmb3Igc2Vjb25kIHBhcnQgb2YgdGhlIGluc3RydWN0aW9uCisgKiBAbDogbGluayBvbiBuZnBfcHJvZy0+aW5zbnMgbGlzdAorICovCitzdHJ1Y3QgbmZwX2luc25fbWV0YSB7CisJc3RydWN0IGJwZl9pbnNuIGluc247CisJdW5zaWduZWQgaW50IG9mZjsKKwl1bnNpZ25lZCBzaG9ydCBuOworCWJvb2wgc2tpcDsKKwlpbnN0cl9jYl90IGRvdWJsZV9jYjsKKworCXN0cnVjdCBsaXN0X2hlYWQgbDsKK307CisKKyNkZWZpbmUgQlBGX1NJWkVfTUFTSwkweDE4CisKK3N0YXRpYyBpbmxpbmUgdTggbWJwZl9jbGFzcyhjb25zdCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gQlBGX0NMQVNTKG1ldGEtPmluc24uY29kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggbWJwZl9zcmMoY29uc3Qgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIEJQRl9TUkMobWV0YS0+aW5zbi5jb2RlKTsKK30KKworc3RhdGljIGlubGluZSB1OCBtYnBmX29wKGNvbnN0IHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiBCUEZfT1AobWV0YS0+aW5zbi5jb2RlKTsKK30KKworc3RhdGljIGlubGluZSB1OCBtYnBmX21vZGUoY29uc3Qgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIEJQRl9NT0RFKG1ldGEtPmluc24uY29kZSk7Cit9CisKKy8qKgorICogc3RydWN0IG5mcF9wcm9nIC0gbmZwIEJQRiBwcm9ncmFtCisgKiBAcHJvZzogbWFjaGluZSBjb2RlCisgKiBAcHJvZ19sZW46IG51bWJlciBvZiB2YWxpZCBpbnN0cnVjdGlvbnMgaW4gQHByb2cgYXJyYXkKKyAqIEBfX3Byb2dfYWxsb2NfbGVuOiBhbGxvYyBzaXplIG9mIEBwcm9nIGFycmF5CisgKiBAYWN0OiBCUEYgcHJvZ3JhbS9hY3Rpb24gdHlwZSAoVEMgREEsIFRDIHdpdGggYWN0aW9uLCBYRFAgZXRjLikKKyAqIEBudW1fcmVnczogbnVtYmVyIG9mIHJlZ2lzdGVycyB1c2VkIGJ5IHRoaXMgcHJvZ3JhbQorICogQHJlZ3NfcGVyX3RocmVhZDogbnVtYmVyIG9mIGJhc2ljIHJlZ2lzdGVycyBhbGxvY2F0ZWQgcGVyIHRocmVhZAorICogQHN0YXJ0X29mZjogYWRkcmVzcyBvZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlIG1lbW9yeQorICogQHRndF9vdXQ6IGp1bXAgdGFyZ2V0IGZvciBub3JtYWwgZXhpdAorICogQHRndF9hYm9ydDoganVtcCB0YXJnZXQgZm9yIGFib3J0IChlLmcuIGFjY2VzcyBvdXRzaWRlIG9mIHBhY2tldCBidWZmZXIpCisgKiBAdGd0X2RvbmU6IGp1bXAgdGFyZ2V0IHRvIGdldCB0aGUgbmV4dCBwYWNrZXQKKyAqIEBuX3RyYW5zbGF0ZWQ6IG51bWJlciBvZiBzdWNjZXNzZnVsbHkgdHJhbnNsYXRlZCBpbnN0cnVjdGlvbnMgKGZvciBlcnJvcnMpCisgKiBAZXJyb3I6IGVycm9yIGNvZGUgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAqIEBpbnNuczogbGlzdCBvZiBCUEYgaW5zdHJ1Y3Rpb24gd3JhcHBlcnMgKHN0cnVjdCBuZnBfaW5zbl9tZXRhKQorICovCitzdHJ1Y3QgbmZwX3Byb2cgeworCXU2NCAqcHJvZzsKKwl1bnNpZ25lZCBpbnQgcHJvZ19sZW47CisJdW5zaWduZWQgaW50IF9fcHJvZ19hbGxvY19sZW47CisKKwllbnVtIG5mcF9icGZfYWN0aW9uX3R5cGUgYWN0OworCisJdW5zaWduZWQgaW50IG51bV9yZWdzOworCXVuc2lnbmVkIGludCByZWdzX3Blcl90aHJlYWQ7CisKKwl1bnNpZ25lZCBpbnQgc3RhcnRfb2ZmOworCXVuc2lnbmVkIGludCB0Z3Rfb3V0OworCXVuc2lnbmVkIGludCB0Z3RfYWJvcnQ7CisJdW5zaWduZWQgaW50IHRndF9kb25lOworCisJdW5zaWduZWQgaW50IG5fdHJhbnNsYXRlZDsKKwlpbnQgZXJyb3I7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGluc25zOworfTsKKworc3RydWN0IG5mcF9icGZfcmVzdWx0IHsKKwl1bnNpZ25lZCBpbnQgbl9pbnN0cjsKKwlib29sIGRlbnNlX21vZGU7Cit9OworCitpbnQKK25mcF9icGZfaml0KHN0cnVjdCBicGZfcHJvZyAqZmlsdGVyLCB2b2lkICpwcm9nLCBlbnVtIG5mcF9icGZfYWN0aW9uX3R5cGUgYWN0LAorCSAgICB1bnNpZ25lZCBpbnQgcHJvZ19zdGFydCwgdW5zaWduZWQgaW50IHByb2dfZG9uZSwKKwkgICAgdW5zaWduZWQgaW50IHByb2dfc3osIHN0cnVjdCBuZnBfYnBmX3Jlc3VsdCAqcmVzKTsKKworaW50IG5mcF9wcm9nX3ZlcmlmeShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX2JwZl9qaXQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX2JwZl9qaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGRmNTMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfYnBmX2ppdC5jCkBAIC0wLDAgKzEsMTgxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBOZXRyb25vbWUgU3lzdGVtcywgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgTGljZW5zZSBWZXJzaW9uIDIsCisgKiBKdW5lIDE5OTEgYXMgc2hvd24gaW4gdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBvZiB0aGlzCisgKiBzb3VyY2UgdHJlZSBvciB0aGUgQlNEIDItQ2xhdXNlIExpY2Vuc2UgcHJvdmlkZWQgYmVsb3cuICBZb3UgaGF2ZSB0aGUKKyAqIG9wdGlvbiB0byBsaWNlbnNlIHRoaXMgc29mdHdhcmUgdW5kZXIgdGhlIGNvbXBsZXRlIHRlcm1zIG9mIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIFRoZSBCU0QgMi1DbGF1c2UgTGljZW5zZToKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkJIk5GUCBuZXQgYnBmOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYnBmLmg+CisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorCisjaW5jbHVkZSAibmZwX2FzbS5oIgorI2luY2x1ZGUgIm5mcF9icGYuaCIKKworLyogLS0tIE5GUCBwcm9nIC0tLSAqLworLyogRm9yZWFjaCAibXVsdGlwbGUiIGVudHJpZXMgbWFjcm9zIHByb3ZpZGUgcG9zIGFuZCBuZXh0PG4+IHBvaW50ZXJzLgorICogSXQncyBzYWZlIHRvIG1vZGlmeSB0aGUgbmV4dCBwb2ludGVycyAoYnV0IG5vdCBwb3MpLgorICovCisjZGVmaW5lIG5mcF9mb3JfZWFjaF9pbnNuX3dhbGsyKG5mcF9wcm9nLCBwb3MsIG5leHQpCQkJXAorCWZvciAocG9zID0gbGlzdF9maXJzdF9lbnRyeSgmKG5mcF9wcm9nKS0+aW5zbnMsIHR5cGVvZigqcG9zKSwgbCksIFwKKwkgICAgIG5leHQgPSBsaXN0X25leHRfZW50cnkocG9zLCBsKTsJCQlcCisJICAgICAmKG5mcF9wcm9nKS0+aW5zbnMgIT0gJnBvcy0+bCAmJgkJCVwKKwkgICAgICYobmZwX3Byb2cpLT5pbnNucyAhPSAmbmV4dC0+bDsJCQlcCisJICAgICBwb3MgPSBuZnBfbWV0YV9uZXh0KHBvcyksCQkJCVwKKwkgICAgIG5leHQgPSBuZnBfbWV0YV9uZXh0KHBvcykpCisKKyNkZWZpbmUgbmZwX2Zvcl9lYWNoX2luc25fd2FsazMobmZwX3Byb2csIHBvcywgbmV4dCwgbmV4dDIpCQlcCisJZm9yIChwb3MgPSBsaXN0X2ZpcnN0X2VudHJ5KCYobmZwX3Byb2cpLT5pbnNucywgdHlwZW9mKCpwb3MpLCBsKSwgXAorCSAgICAgbmV4dCA9IGxpc3RfbmV4dF9lbnRyeShwb3MsIGwpLAkJCVwKKwkgICAgIG5leHQyID0gbGlzdF9uZXh0X2VudHJ5KG5leHQsIGwpOwkJCVwKKwkgICAgICYobmZwX3Byb2cpLT5pbnNucyAhPSAmcG9zLT5sICYmCQkJXAorCSAgICAgJihuZnBfcHJvZyktPmluc25zICE9ICZuZXh0LT5sICYmCQkJXAorCSAgICAgJihuZnBfcHJvZyktPmluc25zICE9ICZuZXh0Mi0+bDsJCQlcCisJICAgICBwb3MgPSBuZnBfbWV0YV9uZXh0KHBvcyksCQkJCVwKKwkgICAgIG5leHQgPSBuZnBfbWV0YV9uZXh0KHBvcyksCQkJCVwKKwkgICAgIG5leHQyID0gbmZwX21ldGFfbmV4dChuZXh0KSkKKworc3RhdGljIGJvb2wKK25mcF9tZXRhX2hhc19uZXh0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiBtZXRhLT5sLm5leHQgIT0gJm5mcF9wcm9nLT5pbnNuczsKK30KKworc3RhdGljIGJvb2wKK25mcF9tZXRhX2hhc19wcmV2KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiBtZXRhLT5sLnByZXYgIT0gJm5mcF9wcm9nLT5pbnNuczsKK30KKworc3RhdGljIHZvaWQgbmZwX3Byb2dfZnJlZShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nKQoreworCXN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1ldGEsIHRtcCwgJm5mcF9wcm9nLT5pbnNucywgbCkgeworCQlsaXN0X2RlbCgmbWV0YS0+bCk7CisJCWtmcmVlKG1ldGEpOworCX0KKwlrZnJlZShuZnBfcHJvZyk7Cit9CisKK3N0YXRpYyB2b2lkIG5mcF9wcm9nX3B1c2goc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgdTY0IGluc24pCit7CisJaWYgKG5mcF9wcm9nLT5fX3Byb2dfYWxsb2NfbGVuID09IG5mcF9wcm9nLT5wcm9nX2xlbikgeworCQluZnBfcHJvZy0+ZXJyb3IgPSAtRU5PU1BDOworCQlyZXR1cm47CisJfQorCisJbmZwX3Byb2ctPnByb2dbbmZwX3Byb2ctPnByb2dfbGVuXSA9IGluc247CisJbmZwX3Byb2ctPnByb2dfbGVuKys7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZwX3Byb2dfY3VycmVudF9vZmZzZXQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZykKK3sKKwlyZXR1cm4gbmZwX3Byb2ctPnN0YXJ0X29mZiArIG5mcF9wcm9nLT5wcm9nX2xlbjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorbmZwX3Byb2dfb2Zmc2V0X3RvX2luZGV4KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcmV0dXJuIG9mZnNldCAtIG5mcF9wcm9nLT5zdGFydF9vZmY7Cit9CisKKy8qIC0tLSBTVyByZWcgLS0tICovCitzdHJ1Y3QgbmZwX2luc25fdXJfcmVncyB7CisJZW51bSBhbHVfZHN0X2FiIGRzdF9hYjsKKwl1MTYgZHN0OworCXUxNiBhcmVnLCBicmVnOworCWJvb2wgc3dhcDsKKwlib29sIHdyX2JvdGg7Cit9OworCitzdHJ1Y3QgbmZwX2luc25fcmVfcmVncyB7CisJZW51bSBhbHVfZHN0X2FiIGRzdF9hYjsKKwl1OCBkc3Q7CisJdTggYXJlZywgYnJlZzsKKwlib29sIHN3YXA7CisJYm9vbCB3cl9ib3RoOworCWJvb2wgaTg7Cit9OworCitzdGF0aWMgdTE2IG5mcF9zd3JlZ190b191bnJlZyh1MzIgc3dyZWcsIGJvb2wgaXNfZHN0KQoreworCXUxNiB2YWwgPSBGSUVMRF9HRVQoTk5fUkVHX1ZBTCwgc3dyZWcpOworCisJc3dpdGNoIChGSUVMRF9HRVQoTk5fUkVHX1RZUEUsIHN3cmVnKSkgeworCWNhc2UgTk5fUkVHX0dQUl9BOgorCWNhc2UgTk5fUkVHX0dQUl9COgorCWNhc2UgTk5fUkVHX0dQUl9CT1RIOgorCQlyZXR1cm4gdmFsOworCWNhc2UgTk5fUkVHX05OUjoKKwkJcmV0dXJuIFVSX1JFR19OTiB8IHZhbDsKKwljYXNlIE5OX1JFR19YRkVSOgorCQlyZXR1cm4gVVJfUkVHX1hGUiB8IHZhbDsKKwljYXNlIE5OX1JFR19JTU06CisJCWlmICh2YWwgJiB+MHhmZikgeworCQkJcHJfZXJyKCJpbW1lZGlhdGUgdG9vIGxhcmdlXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiBVUl9SRUdfSU1NX2VuY29kZSh2YWwpOworCWNhc2UgTk5fUkVHX05PTkU6CisJCXJldHVybiBpc19kc3QgPyBVUl9SRUdfTk9fRFNUIDogUkVHX05PTkU7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCJ1bnJlY29nbml6ZWQgcmVnIGVuY29kaW5nICUwOHhcbiIsIHN3cmVnKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50Citzd3JlZ190b191bnJlc3RyaWN0ZWQodTMyIGRzdCwgdTMyIGxyZWcsIHUzMiBycmVnLCBzdHJ1Y3QgbmZwX2luc25fdXJfcmVncyAqcmVnKQoreworCW1lbXNldChyZWcsIDAsIHNpemVvZigqcmVnKSk7CisKKwkvKiBEZWNvZGUgZGVzdGluYXRpb24gKi8KKwlpZiAoRklFTERfR0VUKE5OX1JFR19UWVBFLCBkc3QpID09IE5OX1JFR19JTU0pCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKEZJRUxEX0dFVChOTl9SRUdfVFlQRSwgZHN0KSA9PSBOTl9SRUdfR1BSX0IpCisJCXJlZy0+ZHN0X2FiID0gQUxVX0RTVF9COworCWlmIChGSUVMRF9HRVQoTk5fUkVHX1RZUEUsIGRzdCkgPT0gTk5fUkVHX0dQUl9CT1RIKQorCQlyZWctPndyX2JvdGggPSB0cnVlOworCXJlZy0+ZHN0ID0gbmZwX3N3cmVnX3RvX3VucmVnKGRzdCwgdHJ1ZSk7CisKKwkvKiBEZWNvZGUgc291cmNlIG9wZXJhbmRzICovCisJaWYgKEZJRUxEX0dFVChOTl9SRUdfVFlQRSwgbHJlZykgPT0gRklFTERfR0VUKE5OX1JFR19UWVBFLCBycmVnKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoRklFTERfR0VUKE5OX1JFR19UWVBFLCBscmVnKSA9PSBOTl9SRUdfR1BSX0IgfHwKKwkgICAgRklFTERfR0VUKE5OX1JFR19UWVBFLCBycmVnKSA9PSBOTl9SRUdfR1BSX0EpIHsKKwkJcmVnLT5hcmVnID0gbmZwX3N3cmVnX3RvX3VucmVnKHJyZWcsIGZhbHNlKTsKKwkJcmVnLT5icmVnID0gbmZwX3N3cmVnX3RvX3VucmVnKGxyZWcsIGZhbHNlKTsKKwkJcmVnLT5zd2FwID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlyZWctPmFyZWcgPSBuZnBfc3dyZWdfdG9fdW5yZWcobHJlZywgZmFsc2UpOworCQlyZWctPmJyZWcgPSBuZnBfc3dyZWdfdG9fdW5yZWcocnJlZywgZmFsc2UpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTE2IG5mcF9zd3JlZ190b19yZXJlZyh1MzIgc3dyZWcsIGJvb2wgaXNfZHN0LCBib29sIGhhc19pbW04LCBib29sICppOCkKK3sKKwl1MTYgdmFsID0gRklFTERfR0VUKE5OX1JFR19WQUwsIHN3cmVnKTsKKworCXN3aXRjaCAoRklFTERfR0VUKE5OX1JFR19UWVBFLCBzd3JlZykpIHsKKwljYXNlIE5OX1JFR19HUFJfQToKKwljYXNlIE5OX1JFR19HUFJfQjoKKwljYXNlIE5OX1JFR19HUFJfQk9USDoKKwkJcmV0dXJuIHZhbDsKKwljYXNlIE5OX1JFR19YRkVSOgorCQlyZXR1cm4gUkVfUkVHX1hGUiB8IHZhbDsKKwljYXNlIE5OX1JFR19JTU06CisJCWlmICh2YWwgJiB+KDB4N2YgfCBoYXNfaW1tOCA8PCA3KSkgeworCQkJcHJfZXJyKCJpbW1lZGlhdGUgdG9vIGxhcmdlXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCSppOCA9IHZhbCAmIDB4ODA7CisJCXJldHVybiBSRV9SRUdfSU1NX2VuY29kZSh2YWwgJiAweDdmKTsKKwljYXNlIE5OX1JFR19OT05FOgorCQlyZXR1cm4gaXNfZHN0ID8gUkVfUkVHX05PX0RTVCA6IFJFR19OT05FOworCWRlZmF1bHQ6CisJCXByX2VycigidW5yZWNvZ25pemVkIHJlZyBlbmNvZGluZ1xuIik7CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludAorc3dyZWdfdG9fcmVzdHJpY3RlZCh1MzIgZHN0LCB1MzIgbHJlZywgdTMyIHJyZWcsIHN0cnVjdCBuZnBfaW5zbl9yZV9yZWdzICpyZWcsCisJCSAgICBib29sIGhhc19pbW04KQoreworCW1lbXNldChyZWcsIDAsIHNpemVvZigqcmVnKSk7CisKKwkvKiBEZWNvZGUgZGVzdGluYXRpb24gKi8KKwlpZiAoRklFTERfR0VUKE5OX1JFR19UWVBFLCBkc3QpID09IE5OX1JFR19JTU0pCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKEZJRUxEX0dFVChOTl9SRUdfVFlQRSwgZHN0KSA9PSBOTl9SRUdfR1BSX0IpCisJCXJlZy0+ZHN0X2FiID0gQUxVX0RTVF9COworCWlmIChGSUVMRF9HRVQoTk5fUkVHX1RZUEUsIGRzdCkgPT0gTk5fUkVHX0dQUl9CT1RIKQorCQlyZWctPndyX2JvdGggPSB0cnVlOworCXJlZy0+ZHN0ID0gbmZwX3N3cmVnX3RvX3JlcmVnKGRzdCwgdHJ1ZSwgZmFsc2UsIE5VTEwpOworCisJLyogRGVjb2RlIHNvdXJjZSBvcGVyYW5kcyAqLworCWlmIChGSUVMRF9HRVQoTk5fUkVHX1RZUEUsIGxyZWcpID09IEZJRUxEX0dFVChOTl9SRUdfVFlQRSwgcnJlZykpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKEZJRUxEX0dFVChOTl9SRUdfVFlQRSwgbHJlZykgPT0gTk5fUkVHX0dQUl9CIHx8CisJICAgIEZJRUxEX0dFVChOTl9SRUdfVFlQRSwgcnJlZykgPT0gTk5fUkVHX0dQUl9BKSB7CisJCXJlZy0+YXJlZyA9IG5mcF9zd3JlZ190b19yZXJlZyhycmVnLCBmYWxzZSwgaGFzX2ltbTgsICZyZWctPmk4KTsKKwkJcmVnLT5icmVnID0gbmZwX3N3cmVnX3RvX3JlcmVnKGxyZWcsIGZhbHNlLCBoYXNfaW1tOCwgJnJlZy0+aTgpOworCQlyZWctPnN3YXAgPSB0cnVlOworCX0gZWxzZSB7CisJCXJlZy0+YXJlZyA9IG5mcF9zd3JlZ190b19yZXJlZyhscmVnLCBmYWxzZSwgaGFzX2ltbTgsICZyZWctPmk4KTsKKwkJcmVnLT5icmVnID0gbmZwX3N3cmVnX3RvX3JlcmVnKHJyZWcsIGZhbHNlLCBoYXNfaW1tOCwgJnJlZy0+aTgpOworCX0KKworCXJldHVybiAwOworfQorCisvKiAtLS0gRW1pdHRlcnMgLS0tICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNtZF90Z3RfYWN0IGNtZF90Z3RfYWN0W19fQ01EX1RHVF9NQVBfU0laRV0gPSB7CisJW0NNRF9UR1RfV1JJVEU4XSA9CQl7IDB4MDAsIDB4NDIgfSwKKwlbQ01EX1RHVF9SRUFEOF0gPQkJeyAweDAxLCAweDQzIH0sCisJW0NNRF9UR1RfUkVBRF9MRV0gPQkJeyAweDAxLCAweDQwIH0sCisJW0NNRF9UR1RfUkVBRF9TV0FQX0xFXSA9CXsgMHgwMywgMHg0MCB9LAorfTsKKworc3RhdGljIHZvaWQKK19fZW1pdF9jbWQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgZW51bSBjbWRfdGd0X21hcCBvcCwKKwkgICB1OCBtb2RlLCB1OCB4ZmVyLCB1OCBhcmVnLCB1OCBicmVnLCB1OCBzaXplLCBib29sIHN5bmMpCit7CisJZW51bSBjbWRfY3R4X3N3YXAgY3R4OworCXU2NCBpbnNuOworCisJaWYgKHN5bmMpCisJCWN0eCA9IENNRF9DVFhfU1dBUDsKKwllbHNlCisJCWN0eCA9IENNRF9DVFhfTk9fU1dBUDsKKworCWluc24gPQlGSUVMRF9QUkVQKE9QX0NNRF9BX1NSQywgYXJlZykgfAorCQlGSUVMRF9QUkVQKE9QX0NNRF9DVFgsIGN0eCkgfAorCQlGSUVMRF9QUkVQKE9QX0NNRF9CX1NSQywgYnJlZykgfAorCQlGSUVMRF9QUkVQKE9QX0NNRF9UT0tFTiwgY21kX3RndF9hY3Rbb3BdLnRva2VuKSB8CisJCUZJRUxEX1BSRVAoT1BfQ01EX1hGRVIsIHhmZXIpIHwKKwkJRklFTERfUFJFUChPUF9DTURfQ05ULCBzaXplKSB8CisJCUZJRUxEX1BSRVAoT1BfQ01EX1NJRywgc3luYykgfAorCQlGSUVMRF9QUkVQKE9QX0NNRF9UR1RfQ01ELCBjbWRfdGd0X2FjdFtvcF0udGd0X2NtZCkgfAorCQlGSUVMRF9QUkVQKE9QX0NNRF9NT0RFLCBtb2RlKTsKKworCW5mcF9wcm9nX3B1c2gobmZwX3Byb2csIGluc24pOworfQorCitzdGF0aWMgdm9pZAorZW1pdF9jbWQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgZW51bSBjbWRfdGd0X21hcCBvcCwKKwkgdTggbW9kZSwgdTggeGZlciwgdTMyIGxyZWcsIHUzMiBycmVnLCB1OCBzaXplLCBib29sIHN5bmMpCit7CisJc3RydWN0IG5mcF9pbnNuX3JlX3JlZ3MgcmVnOworCWludCBlcnI7CisKKwllcnIgPSBzd3JlZ190b19yZXN0cmljdGVkKHJlZ19ub25lKCksIGxyZWcsIHJyZWcsICZyZWcsIGZhbHNlKTsKKwlpZiAoZXJyKSB7CisJCW5mcF9wcm9nLT5lcnJvciA9IGVycjsKKwkJcmV0dXJuOworCX0KKwlpZiAocmVnLnN3YXApIHsKKwkJcHJfZXJyKCJjbWQgY2FuJ3Qgc3dhcCBhcmd1bWVudHNcbiIpOworCQluZnBfcHJvZy0+ZXJyb3IgPSAtRUZBVUxUOworCQlyZXR1cm47CisJfQorCisJX19lbWl0X2NtZChuZnBfcHJvZywgb3AsIG1vZGUsIHhmZXIsIHJlZy5hcmVnLCByZWcuYnJlZywgc2l6ZSwgc3luYyk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2VtaXRfYnIoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgZW51bSBicl9tYXNrIG1hc2ssIGVudW0gYnJfZXZfcGlwIGV2X3BpcCwKKwkgIGVudW0gYnJfY3R4X3NpZ25hbF9zdGF0ZSBjc3MsIHUxNiBhZGRyLCB1OCBkZWZlcikKK3sKKwl1MTYgYWRkcl9sbywgYWRkcl9oaTsKKwl1NjQgaW5zbjsKKworCWFkZHJfbG8gPSBhZGRyICYgKE9QX0JSX0FERFJfTE8gPj4gX19iZl9zaGYoT1BfQlJfQUREUl9MTykpOworCWFkZHJfaGkgPSBhZGRyICE9IGFkZHJfbG87CisKKwlpbnNuID0gT1BfQlJfQkFTRSB8CisJCUZJRUxEX1BSRVAoT1BfQlJfTUFTSywgbWFzaykgfAorCQlGSUVMRF9QUkVQKE9QX0JSX0VWX1BJUCwgZXZfcGlwKSB8CisJCUZJRUxEX1BSRVAoT1BfQlJfQ1NTLCBjc3MpIHwKKwkJRklFTERfUFJFUChPUF9CUl9ERUZCUiwgZGVmZXIpIHwKKwkJRklFTERfUFJFUChPUF9CUl9BRERSX0xPLCBhZGRyX2xvKSB8CisJCUZJRUxEX1BSRVAoT1BfQlJfQUREUl9ISSwgYWRkcl9oaSk7CisKKwluZnBfcHJvZ19wdXNoKG5mcF9wcm9nLCBpbnNuKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9icl9kZWYoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgdTE2IGFkZHIsIHU4IGRlZmVyKQoreworCWlmIChkZWZlciA+IDIpIHsKKwkJcHJfZXJyKCJCVUc6IGJyYW5jaCBkZWZlciBvdXQgb2YgYm91bmRzICVkXG4iLCBkZWZlcik7CisJCW5mcF9wcm9nLT5lcnJvciA9IC1FRkFVTFQ7CisJCXJldHVybjsKKwl9CisJX19lbWl0X2JyKG5mcF9wcm9nLCBCUl9VTkMsIEJSX0VWX1BJUF9VTkNPTkQsIEJSX0NTU19OT05FLCBhZGRyLCBkZWZlcik7Cit9CisKK3N0YXRpYyB2b2lkCitlbWl0X2JyKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIGVudW0gYnJfbWFzayBtYXNrLCB1MTYgYWRkciwgdTggZGVmZXIpCit7CisJX19lbWl0X2JyKG5mcF9wcm9nLCBtYXNrLAorCQkgIG1hc2sgIT0gQlJfVU5DID8gQlJfRVZfUElQX0NPTkQgOiBCUl9FVl9QSVBfVU5DT05ELAorCQkgIEJSX0NTU19OT05FLCBhZGRyLCBkZWZlcik7Cit9CisKK3N0YXRpYyB2b2lkCitfX2VtaXRfYnJfYnl0ZShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCB1OCBhcmVnLCB1OCBicmVnLCBib29sIGltbTgsCisJICAgICAgIHU4IGJ5dGUsIGJvb2wgZXF1YWwsIHUxNiBhZGRyLCB1OCBkZWZlcikKK3sKKwl1MTYgYWRkcl9sbywgYWRkcl9oaTsKKwl1NjQgaW5zbjsKKworCWFkZHJfbG8gPSBhZGRyICYgKE9QX0JCX0FERFJfTE8gPj4gX19iZl9zaGYoT1BfQkJfQUREUl9MTykpOworCWFkZHJfaGkgPSBhZGRyICE9IGFkZHJfbG87CisKKwlpbnNuID0gT1BfQkJZVEVfQkFTRSB8CisJCUZJRUxEX1BSRVAoT1BfQkJfQV9TUkMsIGFyZWcpIHwKKwkJRklFTERfUFJFUChPUF9CQl9CWVRFLCBieXRlKSB8CisJCUZJRUxEX1BSRVAoT1BfQkJfQl9TUkMsIGJyZWcpIHwKKwkJRklFTERfUFJFUChPUF9CQl9JOCwgaW1tOCkgfAorCQlGSUVMRF9QUkVQKE9QX0JCX0VRLCBlcXVhbCkgfAorCQlGSUVMRF9QUkVQKE9QX0JCX0RFRkJSLCBkZWZlcikgfAorCQlGSUVMRF9QUkVQKE9QX0JCX0FERFJfTE8sIGFkZHJfbG8pIHwKKwkJRklFTERfUFJFUChPUF9CQl9BRERSX0hJLCBhZGRyX2hpKTsKKworCW5mcF9wcm9nX3B1c2gobmZwX3Byb2csIGluc24pOworfQorCitzdGF0aWMgdm9pZAorZW1pdF9icl9ieXRlX25lcShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLAorCQkgdTMyIGRzdCwgdTggaW1tLCB1OCBieXRlLCB1MTYgYWRkciwgdTggZGVmZXIpCit7CisJc3RydWN0IG5mcF9pbnNuX3JlX3JlZ3MgcmVnOworCWludCBlcnI7CisKKwllcnIgPSBzd3JlZ190b19yZXN0cmljdGVkKHJlZ19ub25lKCksIGRzdCwgcmVnX2ltbShpbW0pLCAmcmVnLCB0cnVlKTsKKwlpZiAoZXJyKSB7CisJCW5mcF9wcm9nLT5lcnJvciA9IGVycjsKKwkJcmV0dXJuOworCX0KKworCV9fZW1pdF9icl9ieXRlKG5mcF9wcm9nLCByZWcuYXJlZywgcmVnLmJyZWcsIHJlZy5pOCwgYnl0ZSwgZmFsc2UsIGFkZHIsCisJCSAgICAgICBkZWZlcik7Cit9CisKK3N0YXRpYyB2b2lkCitfX2VtaXRfaW1tZWQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgdTE2IGFyZWcsIHUxNiBicmVnLCB1MTYgaW1tX2hpLAorCSAgICAgZW51bSBpbW1lZF93aWR0aCB3aWR0aCwgYm9vbCBpbnZlcnQsCisJICAgICBlbnVtIGltbWVkX3NoaWZ0IHNoaWZ0LCBib29sIHdyX2JvdGgpCit7CisJdTY0IGluc247CisKKwlpbnNuID0gT1BfSU1NRURfQkFTRSB8CisJCUZJRUxEX1BSRVAoT1BfSU1NRURfQV9TUkMsIGFyZWcpIHwKKwkJRklFTERfUFJFUChPUF9JTU1FRF9CX1NSQywgYnJlZykgfAorCQlGSUVMRF9QUkVQKE9QX0lNTUVEX0lNTSwgaW1tX2hpKSB8CisJCUZJRUxEX1BSRVAoT1BfSU1NRURfV0lEVEgsIHdpZHRoKSB8CisJCUZJRUxEX1BSRVAoT1BfSU1NRURfSU5WLCBpbnZlcnQpIHwKKwkJRklFTERfUFJFUChPUF9JTU1FRF9TSElGVCwgc2hpZnQpIHwKKwkJRklFTERfUFJFUChPUF9JTU1FRF9XUl9BQiwgd3JfYm90aCk7CisKKwluZnBfcHJvZ19wdXNoKG5mcF9wcm9nLCBpbnNuKTsKK30KKworc3RhdGljIHZvaWQKK2VtaXRfaW1tZWQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgdTMyIGRzdCwgdTE2IGltbSwKKwkgICBlbnVtIGltbWVkX3dpZHRoIHdpZHRoLCBib29sIGludmVydCwgZW51bSBpbW1lZF9zaGlmdCBzaGlmdCkKK3sKKwlzdHJ1Y3QgbmZwX2luc25fdXJfcmVncyByZWc7CisJaW50IGVycjsKKworCWlmIChGSUVMRF9HRVQoTk5fUkVHX1RZUEUsIGRzdCkgPT0gTk5fUkVHX0lNTSkgeworCQluZnBfcHJvZy0+ZXJyb3IgPSAtRUZBVUxUOworCQlyZXR1cm47CisJfQorCisJZXJyID0gc3dyZWdfdG9fdW5yZXN0cmljdGVkKGRzdCwgZHN0LCByZWdfaW1tKGltbSAmIDB4ZmYpLCAmcmVnKTsKKwlpZiAoZXJyKSB7CisJCW5mcF9wcm9nLT5lcnJvciA9IGVycjsKKwkJcmV0dXJuOworCX0KKworCV9fZW1pdF9pbW1lZChuZnBfcHJvZywgcmVnLmFyZWcsIHJlZy5icmVnLCBpbW0gPj4gOCwgd2lkdGgsCisJCSAgICAgaW52ZXJ0LCBzaGlmdCwgcmVnLndyX2JvdGgpOworfQorCitzdGF0aWMgdm9pZAorX19lbWl0X3NoZihzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCB1MTYgZHN0LCBlbnVtIGFsdV9kc3RfYWIgZHN0X2FiLAorCSAgIGVudW0gc2hmX3NjIHNjLCB1OCBzaGlmdCwKKwkgICB1MTYgYXJlZywgZW51bSBzaGZfb3Agb3AsIHUxNiBicmVnLCBib29sIGk4LCBib29sIHN3LCBib29sIHdyX2JvdGgpCit7CisJdTY0IGluc247CisKKwlpZiAoIUZJRUxEX0ZJVChPUF9TSEZfU0hJRlQsIHNoaWZ0KSkgeworCQluZnBfcHJvZy0+ZXJyb3IgPSAtRUZBVUxUOworCQlyZXR1cm47CisJfQorCisJaWYgKHNjID09IFNIRl9TQ19MX1NIRikKKwkJc2hpZnQgPSAzMiAtIHNoaWZ0OworCisJaW5zbiA9IE9QX1NIRl9CQVNFIHwKKwkJRklFTERfUFJFUChPUF9TSEZfQV9TUkMsIGFyZWcpIHwKKwkJRklFTERfUFJFUChPUF9TSEZfU0MsIHNjKSB8CisJCUZJRUxEX1BSRVAoT1BfU0hGX0JfU1JDLCBicmVnKSB8CisJCUZJRUxEX1BSRVAoT1BfU0hGX0k4LCBpOCkgfAorCQlGSUVMRF9QUkVQKE9QX1NIRl9TVywgc3cpIHwKKwkJRklFTERfUFJFUChPUF9TSEZfRFNULCBkc3QpIHwKKwkJRklFTERfUFJFUChPUF9TSEZfU0hJRlQsIHNoaWZ0KSB8CisJCUZJRUxEX1BSRVAoT1BfU0hGX09QLCBvcCkgfAorCQlGSUVMRF9QUkVQKE9QX1NIRl9EU1RfQUIsIGRzdF9hYikgfAorCQlGSUVMRF9QUkVQKE9QX1NIRl9XUl9BQiwgd3JfYm90aCk7CisKKwluZnBfcHJvZ19wdXNoKG5mcF9wcm9nLCBpbnNuKTsKK30KKworc3RhdGljIHZvaWQKK2VtaXRfc2hmKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHUzMiBkc3QsIHUzMiBscmVnLCBlbnVtIHNoZl9vcCBvcCwgdTMyIHJyZWcsCisJIGVudW0gc2hmX3NjIHNjLCB1OCBzaGlmdCkKK3sKKwlzdHJ1Y3QgbmZwX2luc25fcmVfcmVncyByZWc7CisJaW50IGVycjsKKworCWVyciA9IHN3cmVnX3RvX3Jlc3RyaWN0ZWQoZHN0LCBscmVnLCBycmVnLCAmcmVnLCB0cnVlKTsKKwlpZiAoZXJyKSB7CisJCW5mcF9wcm9nLT5lcnJvciA9IGVycjsKKwkJcmV0dXJuOworCX0KKworCV9fZW1pdF9zaGYobmZwX3Byb2csIHJlZy5kc3QsIHJlZy5kc3RfYWIsIHNjLCBzaGlmdCwKKwkJICAgcmVnLmFyZWcsIG9wLCByZWcuYnJlZywgcmVnLmk4LCByZWcuc3dhcCwgcmVnLndyX2JvdGgpOworfQorCitzdGF0aWMgdm9pZAorX19lbWl0X2FsdShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCB1MTYgZHN0LCBlbnVtIGFsdV9kc3RfYWIgZHN0X2FiLAorCSAgIHUxNiBhcmVnLCBlbnVtIGFsdV9vcCBvcCwgdTE2IGJyZWcsIGJvb2wgc3dhcCwgYm9vbCB3cl9ib3RoKQoreworCXU2NCBpbnNuOworCisJaW5zbiA9IE9QX0FMVV9CQVNFIHwKKwkJRklFTERfUFJFUChPUF9BTFVfQV9TUkMsIGFyZWcpIHwKKwkJRklFTERfUFJFUChPUF9BTFVfQl9TUkMsIGJyZWcpIHwKKwkJRklFTERfUFJFUChPUF9BTFVfRFNULCBkc3QpIHwKKwkJRklFTERfUFJFUChPUF9BTFVfU1csIHN3YXApIHwKKwkJRklFTERfUFJFUChPUF9BTFVfT1AsIG9wKSB8CisJCUZJRUxEX1BSRVAoT1BfQUxVX0RTVF9BQiwgZHN0X2FiKSB8CisJCUZJRUxEX1BSRVAoT1BfQUxVX1dSX0FCLCB3cl9ib3RoKTsKKworCW5mcF9wcm9nX3B1c2gobmZwX3Byb2csIGluc24pOworfQorCitzdGF0aWMgdm9pZAorZW1pdF9hbHUoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgdTMyIGRzdCwgdTMyIGxyZWcsIGVudW0gYWx1X29wIG9wLCB1MzIgcnJlZykKK3sKKwlzdHJ1Y3QgbmZwX2luc25fdXJfcmVncyByZWc7CisJaW50IGVycjsKKworCWVyciA9IHN3cmVnX3RvX3VucmVzdHJpY3RlZChkc3QsIGxyZWcsIHJyZWcsICZyZWcpOworCWlmIChlcnIpIHsKKwkJbmZwX3Byb2ctPmVycm9yID0gZXJyOworCQlyZXR1cm47CisJfQorCisJX19lbWl0X2FsdShuZnBfcHJvZywgcmVnLmRzdCwgcmVnLmRzdF9hYiwKKwkJICAgcmVnLmFyZWcsIG9wLCByZWcuYnJlZywgcmVnLnN3YXAsIHJlZy53cl9ib3RoKTsKK30KKworc3RhdGljIHZvaWQKK19fZW1pdF9sZF9maWVsZChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBlbnVtIHNoZl9zYyBzYywKKwkJdTggYXJlZywgdTggYm1hc2ssIHU4IGJyZWcsIHU4IHNoaWZ0LCBib29sIGltbTgsCisJCWJvb2wgemVybywgYm9vbCBzd2FwLCBib29sIHdyX2JvdGgpCit7CisJdTY0IGluc247CisKKwlpbnNuID0gT1BfTERGX0JBU0UgfAorCQlGSUVMRF9QUkVQKE9QX0xERl9BX1NSQywgYXJlZykgfAorCQlGSUVMRF9QUkVQKE9QX0xERl9TQywgc2MpIHwKKwkJRklFTERfUFJFUChPUF9MREZfQl9TUkMsIGJyZWcpIHwKKwkJRklFTERfUFJFUChPUF9MREZfSTgsIGltbTgpIHwKKwkJRklFTERfUFJFUChPUF9MREZfU1csIHN3YXApIHwKKwkJRklFTERfUFJFUChPUF9MREZfWkYsIHplcm8pIHwKKwkJRklFTERfUFJFUChPUF9MREZfQk1BU0ssIGJtYXNrKSB8CisJCUZJRUxEX1BSRVAoT1BfTERGX1NIRiwgc2hpZnQpIHwKKwkJRklFTERfUFJFUChPUF9MREZfV1JfQUIsIHdyX2JvdGgpOworCisJbmZwX3Byb2dfcHVzaChuZnBfcHJvZywgaW5zbik7Cit9CisKK3N0YXRpYyB2b2lkCitlbWl0X2xkX2ZpZWxkX2FueShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBlbnVtIHNoZl9zYyBzYywgdTggc2hpZnQsCisJCSAgdTMyIGRzdCwgdTggYm1hc2ssIHUzMiBzcmMsIGJvb2wgemVybykKK3sKKwlzdHJ1Y3QgbmZwX2luc25fcmVfcmVncyByZWc7CisJaW50IGVycjsKKworCWVyciA9IHN3cmVnX3RvX3Jlc3RyaWN0ZWQocmVnX25vbmUoKSwgZHN0LCBzcmMsICZyZWcsIHRydWUpOworCWlmIChlcnIpIHsKKwkJbmZwX3Byb2ctPmVycm9yID0gZXJyOworCQlyZXR1cm47CisJfQorCisJX19lbWl0X2xkX2ZpZWxkKG5mcF9wcm9nLCBzYywgcmVnLmFyZWcsIGJtYXNrLCByZWcuYnJlZywgc2hpZnQsCisJCQlyZWcuaTgsIHplcm8sIHJlZy5zd2FwLCByZWcud3JfYm90aCk7Cit9CisKK3N0YXRpYyB2b2lkCitlbWl0X2xkX2ZpZWxkKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHUzMiBkc3QsIHU4IGJtYXNrLCB1MzIgc3JjLAorCSAgICAgIGVudW0gc2hmX3NjIHNjLCB1OCBzaGlmdCkKK3sKKwllbWl0X2xkX2ZpZWxkX2FueShuZnBfcHJvZywgc2MsIHNoaWZ0LCBkc3QsIGJtYXNrLCBzcmMsIGZhbHNlKTsKK30KKworLyogLS0tIFdyYXBwZXJzIC0tLSAqLworc3RhdGljIGJvb2wgcGFja19pbW1lZCh1MzIgaW1tLCB1MTYgKnZhbCwgZW51bSBpbW1lZF9zaGlmdCAqc2hpZnQpCit7CisJaWYgKCEoaW1tICYgMHhmZmZmMDAwMCkpIHsKKwkJKnZhbCA9IGltbTsKKwkJKnNoaWZ0ID0gSU1NRURfU0hJRlRfMEI7CisJfSBlbHNlIGlmICghKGltbSAmIDB4ZmYwMDAwZmYpKSB7CisJCSp2YWwgPSBpbW0gPj4gODsKKwkJKnNoaWZ0ID0gSU1NRURfU0hJRlRfMUI7CisJfSBlbHNlIGlmICghKGltbSAmIDB4MDAwMGZmZmYpKSB7CisJCSp2YWwgPSBpbW0gPj4gMTY7CisJCSpzaGlmdCA9IElNTUVEX1NISUZUXzJCOworCX0gZWxzZSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgd3JwX2ltbWVkKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHUzMiBkc3QsIHUzMiBpbW0pCit7CisJZW51bSBpbW1lZF9zaGlmdCBzaGlmdDsKKwl1MTYgdmFsOworCisJaWYgKHBhY2tfaW1tZWQoaW1tLCAmdmFsLCAmc2hpZnQpKSB7CisJCWVtaXRfaW1tZWQobmZwX3Byb2csIGRzdCwgdmFsLCBJTU1FRF9XSURUSF9BTEwsIGZhbHNlLCBzaGlmdCk7CisJfSBlbHNlIGlmIChwYWNrX2ltbWVkKH5pbW0sICZ2YWwsICZzaGlmdCkpIHsKKwkJZW1pdF9pbW1lZChuZnBfcHJvZywgZHN0LCB2YWwsIElNTUVEX1dJRFRIX0FMTCwgdHJ1ZSwgc2hpZnQpOworCX0gZWxzZSB7CisJCWVtaXRfaW1tZWQobmZwX3Byb2csIGRzdCwgaW1tICYgMHhmZmZmLCBJTU1FRF9XSURUSF9BTEwsCisJCQkgICBmYWxzZSwgSU1NRURfU0hJRlRfMEIpOworCQllbWl0X2ltbWVkKG5mcF9wcm9nLCBkc3QsIGltbSA+PiAxNiwgSU1NRURfV0lEVEhfV09SRCwKKwkJCSAgIGZhbHNlLCBJTU1FRF9TSElGVF8yQik7CisJfQorfQorCisvKiB1cl9sb2FkX2ltbV9hbnkoKSAtIGVuY29kZSBpbW1lZGlhdGUgb3IgdXNlIHRtcCByZWdpc3RlciAodW5yZXN0cmljdGVkKQorICogSWYgdGhlIEBpbW0gaXMgc21hbGwgZW5vdWdoIGVuY29kZSBpdCBkaXJlY3RseSBpbiBvcGVyYW5kIGFuZCByZXR1cm4KKyAqIG90aGVyd2lzZSBsb2FkIEBpbW0gdG8gYSBzcGFyZSByZWdpc3RlciBhbmQgcmV0dXJuIGl0cyBlbmNvZGluZy4KKyAqLworc3RhdGljIHUzMiB1cl9sb2FkX2ltbV9hbnkoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgdTMyIGltbSwgdTMyIHRtcF9yZWcpCit7CisJaWYgKEZJRUxEX0ZJVChVUl9SRUdfSU1NX01BWCwgaW1tKSkKKwkJcmV0dXJuIHJlZ19pbW0oaW1tKTsKKworCXdycF9pbW1lZChuZnBfcHJvZywgdG1wX3JlZywgaW1tKTsKKwlyZXR1cm4gdG1wX3JlZzsKK30KKworLyogcmVfbG9hZF9pbW1fYW55KCkgLSBlbmNvZGUgaW1tZWRpYXRlIG9yIHVzZSB0bXAgcmVnaXN0ZXIgKHJlc3RyaWN0ZWQpCisgKiBJZiB0aGUgQGltbSBpcyBzbWFsbCBlbm91Z2ggZW5jb2RlIGl0IGRpcmVjdGx5IGluIG9wZXJhbmQgYW5kIHJldHVybgorICogb3RoZXJ3aXNlIGxvYWQgQGltbSB0byBhIHNwYXJlIHJlZ2lzdGVyIGFuZCByZXR1cm4gaXRzIGVuY29kaW5nLgorICovCitzdGF0aWMgdTMyIHJlX2xvYWRfaW1tX2FueShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCB1MzIgaW1tLCB1MzIgdG1wX3JlZykKK3sKKwlpZiAoRklFTERfRklUKFJFX1JFR19JTU1fTUFYLCBpbW0pKQorCQlyZXR1cm4gcmVnX2ltbShpbW0pOworCisJd3JwX2ltbWVkKG5mcF9wcm9nLCB0bXBfcmVnLCBpbW0pOworCXJldHVybiB0bXBfcmVnOworfQorCitzdGF0aWMgdm9pZAord3JwX2JyX3NwZWNpYWwoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgZW51bSBicl9tYXNrIG1hc2ssCisJICAgICAgIGVudW0gYnJfc3BlY2lhbCBzcGVjaWFsKQoreworCWVtaXRfYnIobmZwX3Byb2csIG1hc2ssIDAsIDApOworCisJbmZwX3Byb2ctPnByb2dbbmZwX3Byb2ctPnByb2dfbGVuIC0gMV0gfD0KKwkJRklFTERfUFJFUChPUF9CUl9TUEVDSUFMLCBzcGVjaWFsKTsKK30KKworc3RhdGljIHZvaWQgd3JwX3JlZ19tb3Yoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgdTE2IGRzdCwgdTE2IHNyYykKK3sKKwllbWl0X2FsdShuZnBfcHJvZywgcmVnX2JvdGgoZHN0KSwgcmVnX25vbmUoKSwgQUxVX09QX05PTkUsIHJlZ19iKHNyYykpOworfQorCitzdGF0aWMgaW50Citjb25zdHJ1Y3RfZGF0YV9pbmRfbGQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgdTE2IG9mZnNldCwKKwkJICAgICAgdTE2IHNyYywgYm9vbCBzcmNfdmFsaWQsIHU4IHNpemUpCit7CisJdW5zaWduZWQgaW50IGk7CisJdTE2IHNoaWZ0LCBzejsKKwl1MzIgdG1wX3JlZzsKKworCS8qIFdlIGxvYWQgdGhlIHZhbHVlIGZyb20gdGhlIGFkZHJlc3MgaW5kaWNhdGVkIGluIEBvZmZzZXQgYW5kIHRoZW4KKwkgKiBzaGlmdCBvdXQgdGhlIGRhdGEgd2UgZG9uJ3QgbmVlZC4gIE5vdGU6IHRoaXMgaXMgYmlnIGVuZGlhbiEKKwkgKi8KKwlzeiA9IHNpemUgPCA0ID8gNCA6IHNpemU7CisJc2hpZnQgPSBzaXplIDwgNCA/IDQgLSBzaXplIDogMDsKKworCWlmIChzcmNfdmFsaWQpIHsKKwkJLyogQ2FsY3VsYXRlIHRoZSB0cnVlIG9mZnNldCAoc3JjX3JlZyArIGltbSkgKi8KKwkJdG1wX3JlZyA9IHVyX2xvYWRfaW1tX2FueShuZnBfcHJvZywgb2Zmc2V0LCBpbW1fYihuZnBfcHJvZykpOworCQllbWl0X2FsdShuZnBfcHJvZywgaW1tX2JvdGgobmZwX3Byb2cpLAorCQkJIHJlZ19hKHNyYyksIEFMVV9PUF9BREQsIHRtcF9yZWcpOworCQkvKiBDaGVjayBwYWNrZXQgbGVuZ3RoIChzaXplIGd1YXJhbnRlZWQgdG8gZml0IGIvYyBpdCdzIHU4KSAqLworCQllbWl0X2FsdShuZnBfcHJvZywgaW1tX2EobmZwX3Byb2cpLAorCQkJIGltbV9hKG5mcF9wcm9nKSwgQUxVX09QX0FERCwgcmVnX2ltbShzaXplKSk7CisJCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfbm9uZSgpLAorCQkJIE5GUF9CUEZfQUJJX0xFTiwgQUxVX09QX1NVQiwgaW1tX2EobmZwX3Byb2cpKTsKKwkJd3JwX2JyX3NwZWNpYWwobmZwX3Byb2csIEJSX0JMTywgT1BfQlJfR09fQUJPUlQpOworCQkvKiBMb2FkIGRhdGEgKi8KKwkJZW1pdF9jbWQobmZwX3Byb2csIENNRF9UR1RfUkVBRDgsIENNRF9NT0RFXzMyYiwgMCwKKwkJCSBwa3RfcmVnKG5mcF9wcm9nKSwgaW1tX2IobmZwX3Byb2cpLCBzeiAtIDEsIHRydWUpOworCX0gZWxzZSB7CisJCS8qIENoZWNrIHBhY2tldCBsZW5ndGggKi8KKwkJdG1wX3JlZyA9IHVyX2xvYWRfaW1tX2FueShuZnBfcHJvZywgb2Zmc2V0ICsgc2l6ZSwKKwkJCQkJICBpbW1fYShuZnBfcHJvZykpOworCQllbWl0X2FsdShuZnBfcHJvZywgcmVnX25vbmUoKSwKKwkJCSBORlBfQlBGX0FCSV9MRU4sIEFMVV9PUF9TVUIsIHRtcF9yZWcpOworCQl3cnBfYnJfc3BlY2lhbChuZnBfcHJvZywgQlJfQkxPLCBPUF9CUl9HT19BQk9SVCk7CisJCS8qIExvYWQgZGF0YSAqLworCQl0bXBfcmVnID0gcmVfbG9hZF9pbW1fYW55KG5mcF9wcm9nLCBvZmZzZXQsIGltbV9iKG5mcF9wcm9nKSk7CisJCWVtaXRfY21kKG5mcF9wcm9nLCBDTURfVEdUX1JFQUQ4LCBDTURfTU9ERV8zMmIsIDAsCisJCQkgcGt0X3JlZyhuZnBfcHJvZyksIHRtcF9yZWcsIHN6IC0gMSwgdHJ1ZSk7CisJfQorCisJaSA9IDA7CisJaWYgKHNoaWZ0KQorCQllbWl0X3NoZihuZnBfcHJvZywgcmVnX2JvdGgoMCksIHJlZ19ub25lKCksIFNIRl9PUF9OT05FLAorCQkJIHJlZ194ZmVyKDApLCBTSEZfU0NfUl9TSEYsIHNoaWZ0ICogOCk7CisJZWxzZQorCQlmb3IgKDsgaSAqIDQgPCBzaXplOyBpKyspCisJCQllbWl0X2FsdShuZnBfcHJvZywgcmVnX2JvdGgoaSksCisJCQkJIHJlZ19ub25lKCksIEFMVV9PUF9OT05FLCByZWdfeGZlcihpKSk7CisKKwlpZiAoaSA8IDIpCisJCXdycF9pbW1lZChuZnBfcHJvZywgcmVnX2JvdGgoMSksIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uc3RydWN0X2RhdGFfbGQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgdTE2IG9mZnNldCwgdTggc2l6ZSkKK3sKKwlyZXR1cm4gY29uc3RydWN0X2RhdGFfaW5kX2xkKG5mcF9wcm9nLCBvZmZzZXQsIDAsIGZhbHNlLCBzaXplKTsKK30KKworc3RhdGljIGludCB3cnBfc2V0X21hcmsoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgdTggc3JjKQoreworCWVtaXRfYWx1KG5mcF9wcm9nLCBORlBfQlBGX0FCSV9NQVJLLAorCQkgcmVnX25vbmUoKSwgQUxVX09QX05PTkUsIHJlZ19iKHNyYykpOworCWVtaXRfYWx1KG5mcF9wcm9nLCBORlBfQlBGX0FCSV9GTEFHUywKKwkJIE5GUF9CUEZfQUJJX0ZMQUdTLCBBTFVfT1BfT1IsIHJlZ19pbW0oTkZQX0JQRl9BQklfRkxBR19NQVJLKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3dycF9hbHVfaW1tKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHU4IGRzdCwgZW51bSBhbHVfb3AgYWx1X29wLCB1MzIgaW1tKQoreworCXUzMiB0bXBfcmVnOworCisJaWYgKGFsdV9vcCA9PSBBTFVfT1BfQU5EKSB7CisJCWlmICghaW1tKQorCQkJd3JwX2ltbWVkKG5mcF9wcm9nLCByZWdfYm90aChkc3QpLCAwKTsKKwkJaWYgKCFpbW0gfHwgIX5pbW0pCisJCQlyZXR1cm47CisJfQorCWlmIChhbHVfb3AgPT0gQUxVX09QX09SKSB7CisJCWlmICghfmltbSkKKwkJCXdycF9pbW1lZChuZnBfcHJvZywgcmVnX2JvdGgoZHN0KSwgfjBVKTsKKwkJaWYgKCFpbW0gfHwgIX5pbW0pCisJCQlyZXR1cm47CisJfQorCWlmIChhbHVfb3AgPT0gQUxVX09QX1hPUikgeworCQlpZiAoIX5pbW0pCisJCQllbWl0X2FsdShuZnBfcHJvZywgcmVnX2JvdGgoZHN0KSwgcmVnX25vbmUoKSwKKwkJCQkgQUxVX09QX05FRywgcmVnX2IoZHN0KSk7CisJCWlmICghaW1tIHx8ICF+aW1tKQorCQkJcmV0dXJuOworCX0KKworCXRtcF9yZWcgPSB1cl9sb2FkX2ltbV9hbnkobmZwX3Byb2csIGltbSwgaW1tX2IobmZwX3Byb2cpKTsKKwllbWl0X2FsdShuZnBfcHJvZywgcmVnX2JvdGgoZHN0KSwgcmVnX2EoZHN0KSwgYWx1X29wLCB0bXBfcmVnKTsKK30KKworc3RhdGljIGludAord3JwX2FsdTY0X2ltbShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSwKKwkgICAgICBlbnVtIGFsdV9vcCBhbHVfb3AsIGJvb2wgc2tpcCkKK3sKKwljb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluc24gPSAmbWV0YS0+aW5zbjsKKwl1NjQgaW1tID0gaW5zbi0+aW1tOyAvKiBzaWduIGV4dGVuZCAqLworCisJaWYgKHNraXApIHsKKwkJbWV0YS0+c2tpcCA9IHRydWU7CisJCXJldHVybiAwOworCX0KKworCXdycF9hbHVfaW1tKG5mcF9wcm9nLCBpbnNuLT5kc3RfcmVnICogMiwgYWx1X29wLCBpbW0gJiB+MFUpOworCXdycF9hbHVfaW1tKG5mcF9wcm9nLCBpbnNuLT5kc3RfcmVnICogMiArIDEsIGFsdV9vcCwgaW1tID4+IDMyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3cnBfYWx1NjRfcmVnKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhLAorCSAgICAgIGVudW0gYWx1X29wIGFsdV9vcCkKK3sKKwl1OCBkc3QgPSBtZXRhLT5pbnNuLmRzdF9yZWcgKiAyLCBzcmMgPSBtZXRhLT5pbnNuLnNyY19yZWcgKiAyOworCisJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ib3RoKGRzdCksIHJlZ19hKGRzdCksIGFsdV9vcCwgcmVnX2Ioc3JjKSk7CisJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ib3RoKGRzdCArIDEpLAorCQkgcmVnX2EoZHN0ICsgMSksIGFsdV9vcCwgcmVnX2Ioc3JjICsgMSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dycF9hbHUzMl9pbW0oc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEsCisJICAgICAgZW51bSBhbHVfb3AgYWx1X29wLCBib29sIHNraXApCit7CisJY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNuID0gJm1ldGEtPmluc247CisKKwlpZiAoc2tpcCkgeworCQltZXRhLT5za2lwID0gdHJ1ZTsKKwkJcmV0dXJuIDA7CisJfQorCisJd3JwX2FsdV9pbW0obmZwX3Byb2csIGluc24tPmRzdF9yZWcgKiAyLCBhbHVfb3AsIGluc24tPmltbSk7CisJd3JwX2ltbWVkKG5mcF9wcm9nLCByZWdfYm90aChpbnNuLT5kc3RfcmVnICogMiArIDEpLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3cnBfYWx1MzJfcmVnKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhLAorCSAgICAgIGVudW0gYWx1X29wIGFsdV9vcCkKK3sKKwl1OCBkc3QgPSBtZXRhLT5pbnNuLmRzdF9yZWcgKiAyLCBzcmMgPSBtZXRhLT5pbnNuLnNyY19yZWcgKiAyOworCisJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ib3RoKGRzdCksIHJlZ19hKGRzdCksIGFsdV9vcCwgcmVnX2Ioc3JjKSk7CisJd3JwX2ltbWVkKG5mcF9wcm9nLCByZWdfYm90aChtZXRhLT5pbnNuLmRzdF9yZWcgKiAyICsgMSksIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit3cnBfdGVzdF9yZWdfb25lKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHU4IGRzdCwgZW51bSBhbHVfb3AgYWx1X29wLCB1OCBzcmMsCisJCSBlbnVtIGJyX21hc2sgYnJfbWFzaywgdTE2IG9mZikKK3sKKwllbWl0X2FsdShuZnBfcHJvZywgcmVnX25vbmUoKSwgcmVnX2EoZHN0KSwgYWx1X29wLCByZWdfYihzcmMpKTsKKwllbWl0X2JyKG5mcF9wcm9nLCBicl9tYXNrLCBvZmYsIDApOworfQorCitzdGF0aWMgaW50Cit3cnBfdGVzdF9yZWcoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEsCisJICAgICBlbnVtIGFsdV9vcCBhbHVfb3AsIGVudW0gYnJfbWFzayBicl9tYXNrKQoreworCWNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9ICZtZXRhLT5pbnNuOworCisJaWYgKGluc24tPm9mZiA8IDApIC8qIFRPRE8gKi8KKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCXdycF90ZXN0X3JlZ19vbmUobmZwX3Byb2csIGluc24tPmRzdF9yZWcgKiAyLCBhbHVfb3AsCisJCQkgaW5zbi0+c3JjX3JlZyAqIDIsIGJyX21hc2ssIGluc24tPm9mZik7CisJd3JwX3Rlc3RfcmVnX29uZShuZnBfcHJvZywgaW5zbi0+ZHN0X3JlZyAqIDIgKyAxLCBhbHVfb3AsCisJCQkgaW5zbi0+c3JjX3JlZyAqIDIgKyAxLCBicl9tYXNrLCBpbnNuLT5vZmYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dycF9jbXBfaW1tKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhLAorCSAgICBlbnVtIGJyX21hc2sgYnJfbWFzaywgYm9vbCBzd2FwKQoreworCWNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9ICZtZXRhLT5pbnNuOworCXU2NCBpbW0gPSBpbnNuLT5pbW07IC8qIHNpZ24gZXh0ZW5kICovCisJdTggcmVnID0gaW5zbi0+ZHN0X3JlZyAqIDI7CisJdTMyIHRtcF9yZWc7CisKKwlpZiAoaW5zbi0+b2ZmIDwgMCkgLyogVE9ETyAqLworCQlyZXR1cm4gLUVOT1RTVVBQOworCisJdG1wX3JlZyA9IHVyX2xvYWRfaW1tX2FueShuZnBfcHJvZywgaW1tICYgfjBVLCBpbW1fYihuZnBfcHJvZykpOworCWlmICghc3dhcCkKKwkJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ub25lKCksIHJlZ19hKHJlZyksIEFMVV9PUF9TVUIsIHRtcF9yZWcpOworCWVsc2UKKwkJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ub25lKCksIHRtcF9yZWcsIEFMVV9PUF9TVUIsIHJlZ19hKHJlZykpOworCisJdG1wX3JlZyA9IHVyX2xvYWRfaW1tX2FueShuZnBfcHJvZywgaW1tID4+IDMyLCBpbW1fYihuZnBfcHJvZykpOworCWlmICghc3dhcCkKKwkJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ub25lKCksCisJCQkgcmVnX2EocmVnICsgMSksIEFMVV9PUF9TVUJfQywgdG1wX3JlZyk7CisJZWxzZQorCQllbWl0X2FsdShuZnBfcHJvZywgcmVnX25vbmUoKSwKKwkJCSB0bXBfcmVnLCBBTFVfT1BfU1VCX0MsIHJlZ19hKHJlZyArIDEpKTsKKworCWVtaXRfYnIobmZwX3Byb2csIGJyX21hc2ssIGluc24tPm9mZiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAord3JwX2NtcF9yZWcoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEsCisJICAgIGVudW0gYnJfbWFzayBicl9tYXNrLCBib29sIHN3YXApCit7CisJY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNuID0gJm1ldGEtPmluc247CisJdTggYXJlZyA9IGluc24tPnNyY19yZWcgKiAyLCBicmVnID0gaW5zbi0+ZHN0X3JlZyAqIDI7CisKKwlpZiAoaW5zbi0+b2ZmIDwgMCkgLyogVE9ETyAqLworCQlyZXR1cm4gLUVOT1RTVVBQOworCisJaWYgKHN3YXApIHsKKwkJYXJlZyBePSBicmVnOworCQlicmVnIF49IGFyZWc7CisJCWFyZWcgXj0gYnJlZzsKKwl9CisKKwllbWl0X2FsdShuZnBfcHJvZywgcmVnX25vbmUoKSwgcmVnX2EoYXJlZyksIEFMVV9PUF9TVUIsIHJlZ19iKGJyZWcpKTsKKwllbWl0X2FsdShuZnBfcHJvZywgcmVnX25vbmUoKSwKKwkJIHJlZ19hKGFyZWcgKyAxKSwgQUxVX09QX1NVQl9DLCByZWdfYihicmVnICsgMSkpOworCWVtaXRfYnIobmZwX3Byb2csIGJyX21hc2ssIGluc24tPm9mZiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tIENhbGxiYWNrcyAtLS0gKi8KK3N0YXRpYyBpbnQgbW92X3JlZzY0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCWNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9ICZtZXRhLT5pbnNuOworCisJd3JwX3JlZ19tb3YobmZwX3Byb2csIGluc24tPmRzdF9yZWcgKiAyLCBpbnNuLT5zcmNfcmVnICogMik7CisJd3JwX3JlZ19tb3YobmZwX3Byb2csIGluc24tPmRzdF9yZWcgKiAyICsgMSwgaW5zbi0+c3JjX3JlZyAqIDIgKyAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl9pbW02NChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwl1NjQgaW1tID0gbWV0YS0+aW5zbi5pbW07IC8qIHNpZ24gZXh0ZW5kICovCisKKwl3cnBfaW1tZWQobmZwX3Byb2csIHJlZ19ib3RoKG1ldGEtPmluc24uZHN0X3JlZyAqIDIpLCBpbW0gJiB+MFUpOworCXdycF9pbW1lZChuZnBfcHJvZywgcmVnX2JvdGgobWV0YS0+aW5zbi5kc3RfcmVnICogMiArIDEpLCBpbW0gPj4gMzIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeG9yX3JlZzY0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiB3cnBfYWx1NjRfcmVnKG5mcF9wcm9nLCBtZXRhLCBBTFVfT1BfWE9SKTsKK30KKworc3RhdGljIGludCB4b3JfaW1tNjQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIHdycF9hbHU2NF9pbW0obmZwX3Byb2csIG1ldGEsIEFMVV9PUF9YT1IsICFtZXRhLT5pbnNuLmltbSk7Cit9CisKK3N0YXRpYyBpbnQgYW5kX3JlZzY0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiB3cnBfYWx1NjRfcmVnKG5mcF9wcm9nLCBtZXRhLCBBTFVfT1BfQU5EKTsKK30KKworc3RhdGljIGludCBhbmRfaW1tNjQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIHdycF9hbHU2NF9pbW0obmZwX3Byb2csIG1ldGEsIEFMVV9PUF9BTkQsICF+bWV0YS0+aW5zbi5pbW0pOworfQorCitzdGF0aWMgaW50IG9yX3JlZzY0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiB3cnBfYWx1NjRfcmVnKG5mcF9wcm9nLCBtZXRhLCBBTFVfT1BfT1IpOworfQorCitzdGF0aWMgaW50IG9yX2ltbTY0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiB3cnBfYWx1NjRfaW1tKG5mcF9wcm9nLCBtZXRhLCBBTFVfT1BfT1IsICFtZXRhLT5pbnNuLmltbSk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3JlZzY0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCWNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9ICZtZXRhLT5pbnNuOworCisJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ib3RoKGluc24tPmRzdF9yZWcgKiAyKSwKKwkJIHJlZ19hKGluc24tPmRzdF9yZWcgKiAyKSwgQUxVX09QX0FERCwKKwkJIHJlZ19iKGluc24tPnNyY19yZWcgKiAyKSk7CisJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ib3RoKGluc24tPmRzdF9yZWcgKiAyICsgMSksCisJCSByZWdfYShpbnNuLT5kc3RfcmVnICogMiArIDEpLCBBTFVfT1BfQUREX0MsCisJCSByZWdfYihpbnNuLT5zcmNfcmVnICogMiArIDEpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZF9pbW02NChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwljb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluc24gPSAmbWV0YS0+aW5zbjsKKwl1NjQgaW1tID0gaW5zbi0+aW1tOyAvKiBzaWduIGV4dGVuZCAqLworCisJd3JwX2FsdV9pbW0obmZwX3Byb2csIGluc24tPmRzdF9yZWcgKiAyLCBBTFVfT1BfQURELCBpbW0gJiB+MFUpOworCXdycF9hbHVfaW1tKG5mcF9wcm9nLCBpbnNuLT5kc3RfcmVnICogMiArIDEsIEFMVV9PUF9BRERfQywgaW1tID4+IDMyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN1Yl9yZWc2NChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwljb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluc24gPSAmbWV0YS0+aW5zbjsKKworCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfYm90aChpbnNuLT5kc3RfcmVnICogMiksCisJCSByZWdfYShpbnNuLT5kc3RfcmVnICogMiksIEFMVV9PUF9TVUIsCisJCSByZWdfYihpbnNuLT5zcmNfcmVnICogMikpOworCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfYm90aChpbnNuLT5kc3RfcmVnICogMiArIDEpLAorCQkgcmVnX2EoaW5zbi0+ZHN0X3JlZyAqIDIgKyAxKSwgQUxVX09QX1NVQl9DLAorCQkgcmVnX2IoaW5zbi0+c3JjX3JlZyAqIDIgKyAxKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJfaW1tNjQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNuID0gJm1ldGEtPmluc247CisJdTY0IGltbSA9IGluc24tPmltbTsgLyogc2lnbiBleHRlbmQgKi8KKworCXdycF9hbHVfaW1tKG5mcF9wcm9nLCBpbnNuLT5kc3RfcmVnICogMiwgQUxVX09QX1NVQiwgaW1tICYgfjBVKTsKKwl3cnBfYWx1X2ltbShuZnBfcHJvZywgaW5zbi0+ZHN0X3JlZyAqIDIgKyAxLCBBTFVfT1BfU1VCX0MsIGltbSA+PiAzMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaGxfaW1tNjQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNuID0gJm1ldGEtPmluc247CisKKwlpZiAoaW5zbi0+aW1tICE9IDMyKQorCQlyZXR1cm4gMTsgLyogVE9ETyAqLworCisJd3JwX3JlZ19tb3YobmZwX3Byb2csIGluc24tPmRzdF9yZWcgKiAyICsgMSwgaW5zbi0+ZHN0X3JlZyAqIDIpOworCXdycF9pbW1lZChuZnBfcHJvZywgcmVnX2JvdGgoaW5zbi0+ZHN0X3JlZyAqIDIpLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNocl9pbW02NChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwljb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluc24gPSAmbWV0YS0+aW5zbjsKKworCWlmIChpbnNuLT5pbW0gIT0gMzIpCisJCXJldHVybiAxOyAvKiBUT0RPICovCisKKwl3cnBfcmVnX21vdihuZnBfcHJvZywgaW5zbi0+ZHN0X3JlZyAqIDIsIGluc24tPmRzdF9yZWcgKiAyICsgMSk7CisJd3JwX2ltbWVkKG5mcF9wcm9nLCByZWdfYm90aChpbnNuLT5kc3RfcmVnICogMiArIDEpLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl9yZWcoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNuID0gJm1ldGEtPmluc247CisKKwl3cnBfcmVnX21vdihuZnBfcHJvZywgaW5zbi0+ZHN0X3JlZyAqIDIsICBpbnNuLT5zcmNfcmVnICogMik7CisJd3JwX2ltbWVkKG5mcF9wcm9nLCByZWdfYm90aChpbnNuLT5kc3RfcmVnICogMiArIDEpLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl9pbW0oc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNuID0gJm1ldGEtPmluc247CisKKwl3cnBfaW1tZWQobmZwX3Byb2csIHJlZ19ib3RoKGluc24tPmRzdF9yZWcgKiAyKSwgaW5zbi0+aW1tKTsKKwl3cnBfaW1tZWQobmZwX3Byb2csIHJlZ19ib3RoKGluc24tPmRzdF9yZWcgKiAyICsgMSksIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeG9yX3JlZyhzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gd3JwX2FsdTMyX3JlZyhuZnBfcHJvZywgbWV0YSwgQUxVX09QX1hPUik7Cit9CisKK3N0YXRpYyBpbnQgeG9yX2ltbShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gd3JwX2FsdTMyX2ltbShuZnBfcHJvZywgbWV0YSwgQUxVX09QX1hPUiwgIX5tZXRhLT5pbnNuLmltbSk7Cit9CisKK3N0YXRpYyBpbnQgYW5kX3JlZyhzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gd3JwX2FsdTMyX3JlZyhuZnBfcHJvZywgbWV0YSwgQUxVX09QX0FORCk7Cit9CisKK3N0YXRpYyBpbnQgYW5kX2ltbShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gd3JwX2FsdTMyX2ltbShuZnBfcHJvZywgbWV0YSwgQUxVX09QX0FORCwgIX5tZXRhLT5pbnNuLmltbSk7Cit9CisKK3N0YXRpYyBpbnQgb3JfcmVnKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiB3cnBfYWx1MzJfcmVnKG5mcF9wcm9nLCBtZXRhLCBBTFVfT1BfT1IpOworfQorCitzdGF0aWMgaW50IG9yX2ltbShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gd3JwX2FsdTMyX2ltbShuZnBfcHJvZywgbWV0YSwgQUxVX09QX09SLCAhbWV0YS0+aW5zbi5pbW0pOworfQorCitzdGF0aWMgaW50IGFkZF9yZWcoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIHdycF9hbHUzMl9yZWcobmZwX3Byb2csIG1ldGEsIEFMVV9PUF9BREQpOworfQorCitzdGF0aWMgaW50IGFkZF9pbW0oc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIHdycF9hbHUzMl9pbW0obmZwX3Byb2csIG1ldGEsIEFMVV9PUF9BREQsICFtZXRhLT5pbnNuLmltbSk7Cit9CisKK3N0YXRpYyBpbnQgc3ViX3JlZyhzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gd3JwX2FsdTMyX3JlZyhuZnBfcHJvZywgbWV0YSwgQUxVX09QX1NVQik7Cit9CisKK3N0YXRpYyBpbnQgc3ViX2ltbShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gd3JwX2FsdTMyX2ltbShuZnBfcHJvZywgbWV0YSwgQUxVX09QX1NVQiwgIW1ldGEtPmluc24uaW1tKTsKK30KKworc3RhdGljIGludCBzaGxfaW1tKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCWNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9ICZtZXRhLT5pbnNuOworCisJaWYgKCFpbnNuLT5pbW0pCisJCXJldHVybiAxOyAvKiBUT0RPOiB6ZXJvIHNoaWZ0IG1lYW5zIGluZGlyZWN0ICovCisKKwllbWl0X3NoZihuZnBfcHJvZywgcmVnX2JvdGgoaW5zbi0+ZHN0X3JlZyAqIDIpLAorCQkgcmVnX25vbmUoKSwgU0hGX09QX05PTkUsIHJlZ19iKGluc24tPmRzdF9yZWcgKiAyKSwKKwkJIFNIRl9TQ19MX1NIRiwgaW5zbi0+aW1tKTsKKwl3cnBfaW1tZWQobmZwX3Byb2csIHJlZ19ib3RoKGluc24tPmRzdF9yZWcgKiAyICsgMSksIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW1tX2xkOF9wYXJ0MihzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwl3cnBfaW1tZWQobmZwX3Byb2csIHJlZ19ib3RoKG5mcF9tZXRhX3ByZXYobWV0YSktPmluc24uZHN0X3JlZyAqIDIgKyAxKSwKKwkJICBtZXRhLT5pbnNuLmltbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbW1fbGQ4KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCWNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9ICZtZXRhLT5pbnNuOworCisJbWV0YS0+ZG91YmxlX2NiID0gaW1tX2xkOF9wYXJ0MjsKKwl3cnBfaW1tZWQobmZwX3Byb2csIHJlZ19ib3RoKGluc24tPmRzdF9yZWcgKiAyKSwgaW5zbi0+aW1tKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRhdGFfbGQxKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiBjb25zdHJ1Y3RfZGF0YV9sZChuZnBfcHJvZywgbWV0YS0+aW5zbi5pbW0sIDEpOworfQorCitzdGF0aWMgaW50IGRhdGFfbGQyKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiBjb25zdHJ1Y3RfZGF0YV9sZChuZnBfcHJvZywgbWV0YS0+aW5zbi5pbW0sIDIpOworfQorCitzdGF0aWMgaW50IGRhdGFfbGQ0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiBjb25zdHJ1Y3RfZGF0YV9sZChuZnBfcHJvZywgbWV0YS0+aW5zbi5pbW0sIDQpOworfQorCitzdGF0aWMgaW50IGRhdGFfaW5kX2xkMShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gY29uc3RydWN0X2RhdGFfaW5kX2xkKG5mcF9wcm9nLCBtZXRhLT5pbnNuLmltbSwKKwkJCQkgICAgIG1ldGEtPmluc24uc3JjX3JlZyAqIDIsIHRydWUsIDEpOworfQorCitzdGF0aWMgaW50IGRhdGFfaW5kX2xkMihzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gY29uc3RydWN0X2RhdGFfaW5kX2xkKG5mcF9wcm9nLCBtZXRhLT5pbnNuLmltbSwKKwkJCQkgICAgIG1ldGEtPmluc24uc3JjX3JlZyAqIDIsIHRydWUsIDIpOworfQorCitzdGF0aWMgaW50IGRhdGFfaW5kX2xkNChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gY29uc3RydWN0X2RhdGFfaW5kX2xkKG5mcF9wcm9nLCBtZXRhLT5pbnNuLmltbSwKKwkJCQkgICAgIG1ldGEtPmluc24uc3JjX3JlZyAqIDIsIHRydWUsIDQpOworfQorCitzdGF0aWMgaW50IG1lbV9sZHg0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCWlmIChtZXRhLT5pbnNuLm9mZiA9PSBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbGVuKSkKKwkJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ib3RoKG1ldGEtPmluc24uZHN0X3JlZyAqIDIpLAorCQkJIHJlZ19ub25lKCksIEFMVV9PUF9OT05FLCBORlBfQlBGX0FCSV9MRU4pOworCWVsc2UKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCXdycF9pbW1lZChuZnBfcHJvZywgcmVnX2JvdGgobWV0YS0+aW5zbi5kc3RfcmVnICogMiArIDEpLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lbV9zdHg0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCWlmIChtZXRhLT5pbnNuLm9mZiA9PSBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbWFyaykpCisJCXJldHVybiB3cnBfc2V0X21hcmsobmZwX3Byb2csIG1ldGEtPmluc24uc3JjX3JlZyAqIDIpOworCisJcmV0dXJuIC1FTk9UU1VQUDsKK30KKworc3RhdGljIGludCBqdW1wKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCWlmIChtZXRhLT5pbnNuLm9mZiA8IDApIC8qIFRPRE8gKi8KKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwllbWl0X2JyKG5mcF9wcm9nLCBCUl9VTkMsIG1ldGEtPmluc24ub2ZmLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGplcV9pbW0oc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNuID0gJm1ldGEtPmluc247CisJdTY0IGltbSA9IGluc24tPmltbTsgLyogc2lnbiBleHRlbmQgKi8KKwl1MzIgb3IxID0gcmVnX2EoaW5zbi0+ZHN0X3JlZyAqIDIpLCBvcjIgPSByZWdfYihpbnNuLT5kc3RfcmVnICogMiArIDEpOworCXUzMiB0bXBfcmVnOworCisJaWYgKGluc24tPm9mZiA8IDApIC8qIFRPRE8gKi8KKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCWlmIChpbW0gJiB+MFUpIHsKKwkJdG1wX3JlZyA9IHVyX2xvYWRfaW1tX2FueShuZnBfcHJvZywgaW1tICYgfjBVLCBpbW1fYihuZnBfcHJvZykpOworCQllbWl0X2FsdShuZnBfcHJvZywgaW1tX2EobmZwX3Byb2cpLAorCQkJIHJlZ19hKGluc24tPmRzdF9yZWcgKiAyKSwgQUxVX09QX1hPUiwgdG1wX3JlZyk7CisJCW9yMSA9IGltbV9hKG5mcF9wcm9nKTsKKwl9CisKKwlpZiAoaW1tID4+IDMyKSB7CisJCXRtcF9yZWcgPSB1cl9sb2FkX2ltbV9hbnkobmZwX3Byb2csIGltbSA+PiAzMiwgaW1tX2IobmZwX3Byb2cpKTsKKwkJZW1pdF9hbHUobmZwX3Byb2csIGltbV9iKG5mcF9wcm9nKSwKKwkJCSByZWdfYShpbnNuLT5kc3RfcmVnICogMiArIDEpLCBBTFVfT1BfWE9SLCB0bXBfcmVnKTsKKwkJb3IyID0gaW1tX2IobmZwX3Byb2cpOworCX0KKworCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfbm9uZSgpLCBvcjEsIEFMVV9PUF9PUiwgb3IyKTsKKwllbWl0X2JyKG5mcF9wcm9nLCBCUl9CRVEsIGluc24tPm9mZiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqZ3RfaW1tKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiB3cnBfY21wX2ltbShuZnBfcHJvZywgbWV0YSwgQlJfQkxPLCBmYWxzZSk7Cit9CisKK3N0YXRpYyBpbnQgamdlX2ltbShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gd3JwX2NtcF9pbW0obmZwX3Byb2csIG1ldGEsIEJSX0JIUywgdHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQganNldF9pbW0oc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNuID0gJm1ldGEtPmluc247CisJdTY0IGltbSA9IGluc24tPmltbTsgLyogc2lnbiBleHRlbmQgKi8KKwl1MzIgdG1wX3JlZzsKKworCWlmIChpbnNuLT5vZmYgPCAwKSAvKiBUT0RPICovCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlpZiAoIWltbSkgeworCQltZXRhLT5za2lwID0gdHJ1ZTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGltbSAmIH4wVSkgeworCQl0bXBfcmVnID0gdXJfbG9hZF9pbW1fYW55KG5mcF9wcm9nLCBpbW0gJiB+MFUsIGltbV9iKG5mcF9wcm9nKSk7CisJCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfbm9uZSgpLAorCQkJIHJlZ19hKGluc24tPmRzdF9yZWcgKiAyKSwgQUxVX09QX0FORCwgdG1wX3JlZyk7CisJCWVtaXRfYnIobmZwX3Byb2csIEJSX0JORSwgaW5zbi0+b2ZmLCAwKTsKKwl9CisKKwlpZiAoaW1tID4+IDMyKSB7CisJCXRtcF9yZWcgPSB1cl9sb2FkX2ltbV9hbnkobmZwX3Byb2csIGltbSA+PiAzMiwgaW1tX2IobmZwX3Byb2cpKTsKKwkJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ub25lKCksCisJCQkgcmVnX2EoaW5zbi0+ZHN0X3JlZyAqIDIgKyAxKSwgQUxVX09QX0FORCwgdG1wX3JlZyk7CisJCWVtaXRfYnIobmZwX3Byb2csIEJSX0JORSwgaW5zbi0+b2ZmLCAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqbmVfaW1tKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCWNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9ICZtZXRhLT5pbnNuOworCXU2NCBpbW0gPSBpbnNuLT5pbW07IC8qIHNpZ24gZXh0ZW5kICovCisJdTMyIHRtcF9yZWc7CisKKwlpZiAoaW5zbi0+b2ZmIDwgMCkgLyogVE9ETyAqLworCQlyZXR1cm4gLUVOT1RTVVBQOworCisJaWYgKCFpbW0pIHsKKwkJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ub25lKCksIHJlZ19hKGluc24tPmRzdF9yZWcgKiAyKSwKKwkJCSBBTFVfT1BfT1IsIHJlZ19iKGluc24tPmRzdF9yZWcgKiAyICsgMSkpOworCQllbWl0X2JyKG5mcF9wcm9nLCBCUl9CTkUsIGluc24tPm9mZiwgMCk7CisJfQorCisJdG1wX3JlZyA9IHVyX2xvYWRfaW1tX2FueShuZnBfcHJvZywgaW1tICYgfjBVLCBpbW1fYihuZnBfcHJvZykpOworCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfbm9uZSgpLAorCQkgcmVnX2EoaW5zbi0+ZHN0X3JlZyAqIDIpLCBBTFVfT1BfWE9SLCB0bXBfcmVnKTsKKwllbWl0X2JyKG5mcF9wcm9nLCBCUl9CTkUsIGluc24tPm9mZiwgMCk7CisKKwl0bXBfcmVnID0gdXJfbG9hZF9pbW1fYW55KG5mcF9wcm9nLCBpbW0gPj4gMzIsIGltbV9iKG5mcF9wcm9nKSk7CisJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ub25lKCksCisJCSByZWdfYShpbnNuLT5kc3RfcmVnICogMiArIDEpLCBBTFVfT1BfWE9SLCB0bXBfcmVnKTsKKwllbWl0X2JyKG5mcF9wcm9nLCBCUl9CTkUsIGluc24tPm9mZiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqZXFfcmVnKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCWNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9ICZtZXRhLT5pbnNuOworCisJaWYgKGluc24tPm9mZiA8IDApIC8qIFRPRE8gKi8KKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCWVtaXRfYWx1KG5mcF9wcm9nLCBpbW1fYShuZnBfcHJvZyksIHJlZ19hKGluc24tPmRzdF9yZWcgKiAyKSwKKwkJIEFMVV9PUF9YT1IsIHJlZ19iKGluc24tPnNyY19yZWcgKiAyKSk7CisJZW1pdF9hbHUobmZwX3Byb2csIGltbV9iKG5mcF9wcm9nKSwgcmVnX2EoaW5zbi0+ZHN0X3JlZyAqIDIgKyAxKSwKKwkJIEFMVV9PUF9YT1IsIHJlZ19iKGluc24tPnNyY19yZWcgKiAyICsgMSkpOworCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfbm9uZSgpLAorCQkgaW1tX2EobmZwX3Byb2cpLCBBTFVfT1BfT1IsIGltbV9iKG5mcF9wcm9nKSk7CisJZW1pdF9icihuZnBfcHJvZywgQlJfQkVRLCBpbnNuLT5vZmYsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgamd0X3JlZyhzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gd3JwX2NtcF9yZWcobmZwX3Byb2csIG1ldGEsIEJSX0JMTywgZmFsc2UpOworfQorCitzdGF0aWMgaW50IGpnZV9yZWcoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIHdycF9jbXBfcmVnKG5mcF9wcm9nLCBtZXRhLCBCUl9CSFMsIHRydWUpOworfQorCitzdGF0aWMgaW50IGpzZXRfcmVnKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiB3cnBfdGVzdF9yZWcobmZwX3Byb2csIG1ldGEsIEFMVV9PUF9BTkQsIEJSX0JORSk7Cit9CisKK3N0YXRpYyBpbnQgam5lX3JlZyhzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gd3JwX3Rlc3RfcmVnKG5mcF9wcm9nLCBtZXRhLCBBTFVfT1BfWE9SLCBCUl9CTkUpOworfQorCitzdGF0aWMgaW50IGdvdG9fb3V0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXdycF9icl9zcGVjaWFsKG5mcF9wcm9nLCBCUl9VTkMsIE9QX0JSX0dPX09VVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGluc3RyX2NiX3QgaW5zdHJfY2JbMjU2XSA9IHsKKwlbQlBGX0FMVTY0IHwgQlBGX01PViB8IEJQRl9YXSA9CW1vdl9yZWc2NCwKKwlbQlBGX0FMVTY0IHwgQlBGX01PViB8IEJQRl9LXSA9CW1vdl9pbW02NCwKKwlbQlBGX0FMVTY0IHwgQlBGX1hPUiB8IEJQRl9YXSA9CXhvcl9yZWc2NCwKKwlbQlBGX0FMVTY0IHwgQlBGX1hPUiB8IEJQRl9LXSA9CXhvcl9pbW02NCwKKwlbQlBGX0FMVTY0IHwgQlBGX0FORCB8IEJQRl9YXSA9CWFuZF9yZWc2NCwKKwlbQlBGX0FMVTY0IHwgQlBGX0FORCB8IEJQRl9LXSA9CWFuZF9pbW02NCwKKwlbQlBGX0FMVTY0IHwgQlBGX09SIHwgQlBGX1hdID0Jb3JfcmVnNjQsCisJW0JQRl9BTFU2NCB8IEJQRl9PUiB8IEJQRl9LXSA9CW9yX2ltbTY0LAorCVtCUEZfQUxVNjQgfCBCUEZfQUREIHwgQlBGX1hdID0JYWRkX3JlZzY0LAorCVtCUEZfQUxVNjQgfCBCUEZfQUREIHwgQlBGX0tdID0JYWRkX2ltbTY0LAorCVtCUEZfQUxVNjQgfCBCUEZfU1VCIHwgQlBGX1hdID0Jc3ViX3JlZzY0LAorCVtCUEZfQUxVNjQgfCBCUEZfU1VCIHwgQlBGX0tdID0Jc3ViX2ltbTY0LAorCVtCUEZfQUxVNjQgfCBCUEZfTFNIIHwgQlBGX0tdID0Jc2hsX2ltbTY0LAorCVtCUEZfQUxVNjQgfCBCUEZfUlNIIHwgQlBGX0tdID0Jc2hyX2ltbTY0LAorCVtCUEZfQUxVIHwgQlBGX01PViB8IEJQRl9YXSA9CW1vdl9yZWcsCisJW0JQRl9BTFUgfCBCUEZfTU9WIHwgQlBGX0tdID0JbW92X2ltbSwKKwlbQlBGX0FMVSB8IEJQRl9YT1IgfCBCUEZfWF0gPQl4b3JfcmVnLAorCVtCUEZfQUxVIHwgQlBGX1hPUiB8IEJQRl9LXSA9CXhvcl9pbW0sCisJW0JQRl9BTFUgfCBCUEZfQU5EIHwgQlBGX1hdID0JYW5kX3JlZywKKwlbQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfS10gPQlhbmRfaW1tLAorCVtCUEZfQUxVIHwgQlBGX09SIHwgQlBGX1hdID0Jb3JfcmVnLAorCVtCUEZfQUxVIHwgQlBGX09SIHwgQlBGX0tdID0Jb3JfaW1tLAorCVtCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9YXSA9CWFkZF9yZWcsCisJW0JQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0tdID0JYWRkX2ltbSwKKwlbQlBGX0FMVSB8IEJQRl9TVUIgfCBCUEZfWF0gPQlzdWJfcmVnLAorCVtCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9LXSA9CXN1Yl9pbW0sCisJW0JQRl9BTFUgfCBCUEZfTFNIIHwgQlBGX0tdID0Jc2hsX2ltbSwKKwlbQlBGX0xEIHwgQlBGX0lNTSB8IEJQRl9EV10gPQlpbW1fbGQ4LAorCVtCUEZfTEQgfCBCUEZfQUJTIHwgQlBGX0JdID0JZGF0YV9sZDEsCisJW0JQRl9MRCB8IEJQRl9BQlMgfCBCUEZfSF0gPQlkYXRhX2xkMiwKKwlbQlBGX0xEIHwgQlBGX0FCUyB8IEJQRl9XXSA9CWRhdGFfbGQ0LAorCVtCUEZfTEQgfCBCUEZfSU5EIHwgQlBGX0JdID0JZGF0YV9pbmRfbGQxLAorCVtCUEZfTEQgfCBCUEZfSU5EIHwgQlBGX0hdID0JZGF0YV9pbmRfbGQyLAorCVtCUEZfTEQgfCBCUEZfSU5EIHwgQlBGX1ddID0JZGF0YV9pbmRfbGQ0LAorCVtCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9XXSA9CW1lbV9sZHg0LAorCVtCUEZfU1RYIHwgQlBGX01FTSB8IEJQRl9XXSA9CW1lbV9zdHg0LAorCVtCUEZfSk1QIHwgQlBGX0pBIHwgQlBGX0tdID0JanVtcCwKKwlbQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfS10gPQlqZXFfaW1tLAorCVtCUEZfSk1QIHwgQlBGX0pHVCB8IEJQRl9LXSA9CWpndF9pbW0sCisJW0JQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX0tdID0JamdlX2ltbSwKKwlbQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX0tdID0JanNldF9pbW0sCisJW0JQRl9KTVAgfCBCUEZfSk5FIHwgQlBGX0tdID0Jam5lX2ltbSwKKwlbQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfWF0gPQlqZXFfcmVnLAorCVtCUEZfSk1QIHwgQlBGX0pHVCB8IEJQRl9YXSA9CWpndF9yZWcsCisJW0JQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX1hdID0JamdlX3JlZywKKwlbQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX1hdID0JanNldF9yZWcsCisJW0JQRl9KTVAgfCBCUEZfSk5FIHwgQlBGX1hdID0Jam5lX3JlZywKKwlbQlBGX0pNUCB8IEJQRl9FWElUXSA9CQlnb3RvX291dCwKK307CisKKy8qIC0tLSBNaXNjIGNvZGUgLS0tICovCitzdGF0aWMgdm9pZCBicl9zZXRfb2Zmc2V0KHU2NCAqaW5zdHIsIHUxNiBvZmZzZXQpCit7CisJdTE2IGFkZHJfbG8sIGFkZHJfaGk7CisKKwlhZGRyX2xvID0gb2Zmc2V0ICYgKE9QX0JSX0FERFJfTE8gPj4gX19iZl9zaGYoT1BfQlJfQUREUl9MTykpOworCWFkZHJfaGkgPSBvZmZzZXQgIT0gYWRkcl9sbzsKKwkqaW5zdHIgJj0gfihPUF9CUl9BRERSX0hJIHwgT1BfQlJfQUREUl9MTyk7CisJKmluc3RyIHw9IEZJRUxEX1BSRVAoT1BfQlJfQUREUl9ISSwgYWRkcl9oaSk7CisJKmluc3RyIHw9IEZJRUxEX1BSRVAoT1BfQlJfQUREUl9MTywgYWRkcl9sbyk7Cit9CisKKy8qIC0tLSBBc3NlbWJsZXIgbG9naWMgLS0tICovCitzdGF0aWMgaW50IG5mcF9maXh1cF9icmFuY2hlcyhzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nKQoreworCXN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhLCAqbmV4dDsKKwl1MzIgb2ZmLCBicl9pZHg7CisJdTMyIGlkeDsKKworCW5mcF9mb3JfZWFjaF9pbnNuX3dhbGsyKG5mcF9wcm9nLCBtZXRhLCBuZXh0KSB7CisJCWlmIChtZXRhLT5za2lwKQorCQkJY29udGludWU7CisJCWlmIChCUEZfQ0xBU1MobWV0YS0+aW5zbi5jb2RlKSAhPSBCUEZfSk1QKQorCQkJY29udGludWU7CisKKwkJYnJfaWR4ID0gbmZwX3Byb2dfb2Zmc2V0X3RvX2luZGV4KG5mcF9wcm9nLCBuZXh0LT5vZmYpIC0gMTsKKwkJaWYgKCFuZnBfaXNfYnIobmZwX3Byb2ctPnByb2dbYnJfaWR4XSkpIHsKKwkJCXByX2VycigiRml4dXAgZm91bmQgYmxvY2sgbm90IGVuZGluZyBpbiBicmFuY2ggJWQgJTAyeCAlMDE2bGx4ISFcbiIsCisJCQkgICAgICAgYnJfaWR4LCBtZXRhLT5pbnNuLmNvZGUsIG5mcF9wcm9nLT5wcm9nW2JyX2lkeF0pOworCQkJcmV0dXJuIC1FTE9PUDsKKwkJfQorCQkvKiBMZWF2ZSBzcGVjaWFsIGJyYW5jaGVzIGZvciBsYXRlciAqLworCQlpZiAoRklFTERfR0VUKE9QX0JSX1NQRUNJQUwsIG5mcF9wcm9nLT5wcm9nW2JyX2lkeF0pKQorCQkJY29udGludWU7CisKKwkJLyogRmluZCB0aGUgdGFyZ2V0IG9mZnNldCBpbiBhc3NlbWJsZXIgcmVhbG0gKi8KKwkJb2ZmID0gbWV0YS0+aW5zbi5vZmY7CisJCWlmICghb2ZmKSB7CisJCQlwcl9lcnIoIkZpeHVwIGZvdW5kIHplcm8gb2Zmc2V0ISFcbiIpOworCQkJcmV0dXJuIC1FTE9PUDsKKwkJfQorCisJCXdoaWxlIChvZmYgJiYgbmZwX21ldGFfaGFzX25leHQobmZwX3Byb2csIG5leHQpKSB7CisJCQluZXh0ID0gbmZwX21ldGFfbmV4dChuZXh0KTsKKwkJCW9mZi0tOworCQl9CisJCWlmIChvZmYpIHsKKwkJCXByX2VycigiRml4dXAgZm91bmQgdG9vIGxhcmdlIGp1bXAhISAlZFxuIiwgb2ZmKTsKKwkJCXJldHVybiAtRUxPT1A7CisJCX0KKworCQlpZiAobmV4dC0+c2tpcCkgeworCQkJcHJfZXJyKCJCcmFuY2ggbGFuZGluZyBvbiByZW1vdmVkIGluc3RydWN0aW9uISFcbiIpOworCQkJcmV0dXJuIC1FTE9PUDsKKwkJfQorCisJCWZvciAoaWR4ID0gbmZwX3Byb2dfb2Zmc2V0X3RvX2luZGV4KG5mcF9wcm9nLCBtZXRhLT5vZmYpOworCQkgICAgIGlkeCA8PSBicl9pZHg7IGlkeCsrKSB7CisJCQlpZiAoIW5mcF9pc19icihuZnBfcHJvZy0+cHJvZ1tpZHhdKSkKKwkJCQljb250aW51ZTsKKwkJCWJyX3NldF9vZmZzZXQoJm5mcF9wcm9nLT5wcm9nW2lkeF0sIG5leHQtPm9mZik7CisJCX0KKwl9CisKKwkvKiBGaXh1cCAnZ290byBvdXQncyBzZXBhcmF0ZWx5LCB0aGV5IGNhbiBiZSBzY2F0dGVyZWQgYXJvdW5kICovCisJZm9yIChicl9pZHggPSAwOyBicl9pZHggPCBuZnBfcHJvZy0+cHJvZ19sZW47IGJyX2lkeCsrKSB7CisJCWVudW0gYnJfc3BlY2lhbCBzcGVjaWFsOworCisJCWlmICgobmZwX3Byb2ctPnByb2dbYnJfaWR4XSAmIE9QX0JSX0JBU0VfTUFTSykgIT0gT1BfQlJfQkFTRSkKKwkJCWNvbnRpbnVlOworCisJCXNwZWNpYWwgPSBGSUVMRF9HRVQoT1BfQlJfU1BFQ0lBTCwgbmZwX3Byb2ctPnByb2dbYnJfaWR4XSk7CisJCXN3aXRjaCAoc3BlY2lhbCkgeworCQljYXNlIE9QX0JSX05PUk1BTDoKKwkJCWJyZWFrOworCQljYXNlIE9QX0JSX0dPX09VVDoKKwkJCWJyX3NldF9vZmZzZXQoJm5mcF9wcm9nLT5wcm9nW2JyX2lkeF0sCisJCQkJICAgICAgbmZwX3Byb2ctPnRndF9vdXQpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfQlJfR09fQUJPUlQ6CisJCQlicl9zZXRfb2Zmc2V0KCZuZnBfcHJvZy0+cHJvZ1ticl9pZHhdLAorCQkJCSAgICAgIG5mcF9wcm9nLT50Z3RfYWJvcnQpOworCQkJYnJlYWs7CisJCX0KKworCQluZnBfcHJvZy0+cHJvZ1ticl9pZHhdICY9IH5PUF9CUl9TUEVDSUFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuZnBfaW50cm8oc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZykKK3sKKwllbWl0X2FsdShuZnBfcHJvZywgcGt0X3JlZyhuZnBfcHJvZyksCisJCSByZWdfbm9uZSgpLCBBTFVfT1BfTk9ORSwgTkZQX0JQRl9BQklfUEtUKTsKK30KKworc3RhdGljIHZvaWQgbmZwX291dHJvX3RjX2xlZ2FjeShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nKQoreworCWNvbnN0IHU4IGFjdDJjb2RlW10gPSB7CisJCVtOTl9BQ1RfVENfRFJPUF0gID0gMHgyMiwKKwkJW05OX0FDVF9UQ19SRURJUl0gPSAweDI0CisJfTsKKwkvKiBUYXJnZXQgZm9yIGFib3J0cyAqLworCW5mcF9wcm9nLT50Z3RfYWJvcnQgPSBuZnBfcHJvZ19jdXJyZW50X29mZnNldChuZnBfcHJvZyk7CisJd3JwX2ltbWVkKG5mcF9wcm9nLCByZWdfYm90aCgwKSwgMCk7CisKKwkvKiBUYXJnZXQgZm9yIG5vcm1hbCBleGl0cyAqLworCW5mcF9wcm9nLT50Z3Rfb3V0ID0gbmZwX3Byb2dfY3VycmVudF9vZmZzZXQobmZwX3Byb2cpOworCS8qIExlZ2FjeSBUQyBtb2RlOgorCSAqICAgMCAgICAgICAgMHgxMSAtPiBwYXNzLCAgY291bnQgYXMgc3RhdDAKKwkgKiAgLTEgIGRyb3AgIDB4MjIgLT4gZHJvcCwgIGNvdW50IGFzIHN0YXQxCisJICogICAgIHJlZGlyICAweDI0IC0+IHJlZGlyLCBjb3VudCBhcyBzdGF0MQorCSAqICBpZmUgbWFyayAgMHgyMSAtPiBwYXNzLCAgY291bnQgYXMgc3RhdDEKKwkgKiAgaWZlICsgdHggIDB4MjQgLT4gcmVkaXIsIGNvdW50IGFzIHN0YXQxCisJICovCisJZW1pdF9icl9ieXRlX25lcShuZnBfcHJvZywgcmVnX2IoMCksIDB4ZmYsIDAsIG5mcF9wcm9nLT50Z3RfZG9uZSwgMik7CisJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19hKDApLAorCQkgcmVnX25vbmUoKSwgQUxVX09QX05PTkUsIE5GUF9CUEZfQUJJX0ZMQUdTKTsKKwllbWl0X2xkX2ZpZWxkKG5mcF9wcm9nLCByZWdfYSgwKSwgMHhjLCByZWdfaW1tKDB4MTEpLCBTSEZfU0NfTF9TSEYsIDE2KTsKKworCWVtaXRfYnIobmZwX3Byb2csIEJSX1VOQywgbmZwX3Byb2ctPnRndF9kb25lLCAxKTsKKwllbWl0X2xkX2ZpZWxkKG5mcF9wcm9nLCByZWdfYSgwKSwgMHhjLCByZWdfaW1tKGFjdDJjb2RlW25mcF9wcm9nLT5hY3RdKSwKKwkJICAgICAgU0hGX1NDX0xfU0hGLCAxNik7Cit9CisKK3N0YXRpYyB2b2lkIG5mcF9vdXRyb190Y19kYShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nKQoreworCS8qIFRDIGRpcmVjdC1hY3Rpb24gbW9kZToKKwkgKiAgIDAsMSAgIG9rICAgICAgICBOT1QgU1VQUE9SVEVEWzFdCisJICogICAyICAgZHJvcCAgMHgyMiAtPiBkcm9wLCAgY291bnQgYXMgc3RhdDEKKwkgKiAgIDQsNSBudWtlICAweDAyIC0+IGRyb3AKKwkgKiAgIDcgIHJlZGlyICAweDQ0IC0+IHJlZGlyLCBjb3VudCBhcyBzdGF0MgorCSAqICAgKiB1bnNwZWMgIDB4MTEgLT4gcGFzcywgIGNvdW50IGFzIHN0YXQwCisJICoKKwkgKiBbMV0gV2UgY2FuJ3Qgc3VwcG9ydCBPSyBhbmQgUkVDTEFTU0lGWSBiZWNhdXNlIHdlIGNhbid0IHRlbGwgVEMKKwkgKiAgICAgdGhlIGV4YWN0IGRlY2lzaW9uIG1hZGUuICBXZSBhcmUgZm9yY2VkIHRvIHN1cHBvcnQgVU5TUEVDCisJICogICAgIHRvIGhhbmRsZSBhYm9ydHMgc28gdGhhdCdzIHRoZSBvbmx5IG9uZSB3ZSBoYW5kbGUgZm9yIHBhc3NpbmcKKwkgKiAgICAgcGFja2V0cyB1cCB0aGUgc3RhY2suCisJICovCisJLyogVGFyZ2V0IGZvciBhYm9ydHMgKi8KKwluZnBfcHJvZy0+dGd0X2Fib3J0ID0gbmZwX3Byb2dfY3VycmVudF9vZmZzZXQobmZwX3Byb2cpOworCisJZW1pdF9icl9kZWYobmZwX3Byb2csIG5mcF9wcm9nLT50Z3RfZG9uZSwgMik7CisKKwllbWl0X2FsdShuZnBfcHJvZywgcmVnX2EoMCksCisJCSByZWdfbm9uZSgpLCBBTFVfT1BfTk9ORSwgTkZQX0JQRl9BQklfRkxBR1MpOworCWVtaXRfbGRfZmllbGQobmZwX3Byb2csIHJlZ19hKDApLCAweGMsIHJlZ19pbW0oMHgxMSksIFNIRl9TQ19MX1NIRiwgMTYpOworCisJLyogVGFyZ2V0IGZvciBub3JtYWwgZXhpdHMgKi8KKwluZnBfcHJvZy0+dGd0X291dCA9IG5mcF9wcm9nX2N1cnJlbnRfb2Zmc2V0KG5mcF9wcm9nKTsKKworCS8qIGlmIFIwID4gNyBqdW1wIHRvIGFib3J0ICovCisJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ub25lKCksIHJlZ19pbW0oNyksIEFMVV9PUF9TVUIsIHJlZ19iKDApKTsKKwllbWl0X2JyKG5mcF9wcm9nLCBCUl9CTE8sIG5mcF9wcm9nLT50Z3RfYWJvcnQsIDApOworCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfYSgwKSwKKwkJIHJlZ19ub25lKCksIEFMVV9PUF9OT05FLCBORlBfQlBGX0FCSV9GTEFHUyk7CisKKwl3cnBfaW1tZWQobmZwX3Byb2csIHJlZ19iKDIpLCAweDQxMjIxMjExKTsKKwl3cnBfaW1tZWQobmZwX3Byb2csIHJlZ19iKDMpLCAweDQxMDAxMjExKTsKKworCWVtaXRfc2hmKG5mcF9wcm9nLCByZWdfYSgxKSwKKwkJIHJlZ19ub25lKCksIFNIRl9PUF9OT05FLCByZWdfYigwKSwgU0hGX1NDX0xfU0hGLCAyKTsKKworCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfbm9uZSgpLCByZWdfYSgxKSwgQUxVX09QX09SLCByZWdfaW1tKDApKTsKKwllbWl0X3NoZihuZnBfcHJvZywgcmVnX2EoMiksCisJCSByZWdfaW1tKDB4ZiksIFNIRl9PUF9BTkQsIHJlZ19iKDIpLCBTSEZfU0NfUl9TSEYsIDApOworCisJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ub25lKCksIHJlZ19hKDEpLCBBTFVfT1BfT1IsIHJlZ19pbW0oMCkpOworCWVtaXRfc2hmKG5mcF9wcm9nLCByZWdfYigyKSwKKwkJIHJlZ19pbW0oMHhmKSwgU0hGX09QX0FORCwgcmVnX2IoMyksIFNIRl9TQ19SX1NIRiwgMCk7CisKKwllbWl0X2JyX2RlZihuZnBfcHJvZywgbmZwX3Byb2ctPnRndF9kb25lLCAyKTsKKworCWVtaXRfc2hmKG5mcF9wcm9nLCByZWdfYigyKSwKKwkJIHJlZ19hKDIpLCBTSEZfT1BfT1IsIHJlZ19iKDIpLCBTSEZfU0NfTF9TSEYsIDQpOworCWVtaXRfbGRfZmllbGQobmZwX3Byb2csIHJlZ19hKDApLCAweGMsIHJlZ19iKDIpLCBTSEZfU0NfTF9TSEYsIDE2KTsKK30KKworc3RhdGljIHZvaWQgbmZwX291dHJvKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2cpCit7CisJc3dpdGNoIChuZnBfcHJvZy0+YWN0KSB7CisJY2FzZSBOTl9BQ1RfRElSRUNUOgorCQluZnBfb3V0cm9fdGNfZGEobmZwX3Byb2cpOworCQlicmVhazsKKwljYXNlIE5OX0FDVF9UQ19EUk9QOgorCWNhc2UgTk5fQUNUX1RDX1JFRElSOgorCQluZnBfb3V0cm9fdGNfbGVnYWN5KG5mcF9wcm9nKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IG5mcF90cmFuc2xhdGUoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZykKK3sKKwlzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YTsKKwlpbnQgZXJyOworCisJbmZwX2ludHJvKG5mcF9wcm9nKTsKKwlpZiAobmZwX3Byb2ctPmVycm9yKQorCQlyZXR1cm4gbmZwX3Byb2ctPmVycm9yOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtZXRhLCAmbmZwX3Byb2ctPmluc25zLCBsKSB7CisJCWluc3RyX2NiX3QgY2IgPSBpbnN0cl9jYlttZXRhLT5pbnNuLmNvZGVdOworCisJCW1ldGEtPm9mZiA9IG5mcF9wcm9nX2N1cnJlbnRfb2Zmc2V0KG5mcF9wcm9nKTsKKworCQlpZiAobWV0YS0+c2tpcCkgeworCQkJbmZwX3Byb2ctPm5fdHJhbnNsYXRlZCsrOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobmZwX21ldGFfaGFzX3ByZXYobmZwX3Byb2csIG1ldGEpICYmCisJCSAgICBuZnBfbWV0YV9wcmV2KG1ldGEpLT5kb3VibGVfY2IpCisJCQljYiA9IG5mcF9tZXRhX3ByZXYobWV0YSktPmRvdWJsZV9jYjsKKwkJaWYgKCFjYikKKwkJCXJldHVybiAtRU5PRU5UOworCQllcnIgPSBjYihuZnBfcHJvZywgbWV0YSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCW5mcF9wcm9nLT5uX3RyYW5zbGF0ZWQrKzsKKwl9CisKKwluZnBfb3V0cm8obmZwX3Byb2cpOworCWlmIChuZnBfcHJvZy0+ZXJyb3IpCisJCXJldHVybiBuZnBfcHJvZy0+ZXJyb3I7CisKKwlyZXR1cm4gbmZwX2ZpeHVwX2JyYW5jaGVzKG5mcF9wcm9nKTsKK30KKworc3RhdGljIGludAorbmZwX3Byb2dfcHJlcGFyZShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBjb25zdCBzdHJ1Y3QgYnBmX2luc24gKnByb2csCisJCSB1bnNpZ25lZCBpbnQgY250KQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCXN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhOworCisJCW1ldGEgPSBremFsbG9jKHNpemVvZigqbWV0YSksIEdGUF9LRVJORUwpOworCQlpZiAoIW1ldGEpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQltZXRhLT5pbnNuID0gcHJvZ1tpXTsKKwkJbWV0YS0+biA9IGk7CisKKwkJbGlzdF9hZGRfdGFpbCgmbWV0YS0+bCwgJm5mcF9wcm9nLT5pbnNucyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLSBPcHRpbWl6YXRpb25zIC0tLSAqLworc3RhdGljIHZvaWQgbmZwX2JwZl9vcHRfcmVnX2luaXQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZykKK3sKKwlzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobWV0YSwgJm5mcF9wcm9nLT5pbnNucywgbCkgeworCQlzdHJ1Y3QgYnBmX2luc24gaW5zbiA9IG1ldGEtPmluc247CisKKwkJLyogUHJvZ3JhbXMgY29udmVydGVkIGZyb20gY0JQRiBzdGFydCB3aXRoIHJlZ2lzdGVyIHhvcmluZyAqLworCQlpZiAoaW5zbi5jb2RlID09IChCUEZfQUxVNjQgfCBCUEZfWE9SIHwgQlBGX1gpICYmCisJCSAgICBpbnNuLnNyY19yZWcgPT0gaW5zbi5kc3RfcmVnKQorCQkJY29udGludWU7CisKKwkJLyogUHJvZ3JhbXMgc3RhcnQgd2l0aCBSNiA9IFIxIGJ1dCB3ZSBpZ25vcmUgdGhlIHNrYiBwb2ludGVyICovCisJCWlmIChpbnNuLmNvZGUgPT0gKEJQRl9BTFU2NCB8IEJQRl9NT1YgfCBCUEZfWCkgJiYKKwkJICAgIGluc24uc3JjX3JlZyA9PSAxICYmIGluc24uZHN0X3JlZyA9PSA2KQorCQkJbWV0YS0+c2tpcCA9IHRydWU7CisKKwkJLyogUmV0dXJuIGFzIHNvb24gYXMgc29tZXRoaW5nIGRvZXNuJ3QgbWF0Y2ggKi8KKwkJaWYgKCFtZXRhLT5za2lwKQorCQkJcmV0dXJuOworCX0KK30KKworLyogVHJ5IHRvIHJlbmFtZSByZWdpc3RlcnMgc28gdGhhdCBwcm9ncmFtIHVzZXMgb25seSBsb3cgb25lcyAqLworc3RhdGljIGludCBuZnBfYnBmX29wdF9yZWdfcmVuYW1lKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2cpCit7CisJYm9vbCByZWdfdXNlZFtNQVhfQlBGX1JFR10gPSB7fTsKKwl1OCB0Z3RfcmVnW01BWF9CUEZfUkVHXSA9IHt9OworCXN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhOworCXVuc2lnbmVkIGludCBpLCBqOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtZXRhLCAmbmZwX3Byb2ctPmluc25zLCBsKSB7CisJCWlmIChtZXRhLT5za2lwKQorCQkJY29udGludWU7CisKKwkJcmVnX3VzZWRbbWV0YS0+aW5zbi5zcmNfcmVnXSA9IHRydWU7CisJCXJlZ191c2VkW21ldGEtPmluc24uZHN0X3JlZ10gPSB0cnVlOworCX0KKworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgQVJSQVlfU0laRSh0Z3RfcmVnKTsgaSsrKSB7CisJCWlmICghcmVnX3VzZWRbaV0pCisJCQljb250aW51ZTsKKworCQl0Z3RfcmVnW2ldID0gaisrOworCX0KKwluZnBfcHJvZy0+bnVtX3JlZ3MgPSBqOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtZXRhLCAmbmZwX3Byb2ctPmluc25zLCBsKSB7CisJCW1ldGEtPmluc24uc3JjX3JlZyA9IHRndF9yZWdbbWV0YS0+aW5zbi5zcmNfcmVnXTsKKwkJbWV0YS0+aW5zbi5kc3RfcmVnID0gdGd0X3JlZ1ttZXRhLT5pbnNuLmRzdF9yZWddOworCX0KKworCXJldHVybiAwOworfQorCisvKiBSZW1vdmUgbWFza2luZyBhZnRlciBsb2FkIHNpbmNlIG91ciBsb2FkIGd1YXJhbnRlZXMgdGhpcyBpcyBub3QgbmVlZGVkICovCitzdGF0aWMgdm9pZCBuZnBfYnBmX29wdF9sZF9tYXNrKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2cpCit7CisJc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGExLCAqbWV0YTI7CisJY29uc3QgczMyIGV4cF9tYXNrW10gPSB7CisJCVtCUEZfQl0gPSAweDAwMDAwMGZmVSwKKwkJW0JQRl9IXSA9IDB4MDAwMGZmZmZVLAorCQlbQlBGX1ddID0gMHhmZmZmZmZmZlUsCisJfTsKKworCW5mcF9mb3JfZWFjaF9pbnNuX3dhbGsyKG5mcF9wcm9nLCBtZXRhMSwgbWV0YTIpIHsKKwkJc3RydWN0IGJwZl9pbnNuIGluc24sIG5leHQ7CisKKwkJaW5zbiA9IG1ldGExLT5pbnNuOworCQluZXh0ID0gbWV0YTItPmluc247CisKKwkJaWYgKEJQRl9DTEFTUyhpbnNuLmNvZGUpICE9IEJQRl9MRCkKKwkJCWNvbnRpbnVlOworCQlpZiAoQlBGX01PREUoaW5zbi5jb2RlKSAhPSBCUEZfQUJTICYmCisJCSAgICBCUEZfTU9ERShpbnNuLmNvZGUpICE9IEJQRl9JTkQpCisJCQljb250aW51ZTsKKworCQlpZiAobmV4dC5jb2RlICE9IChCUEZfQUxVNjQgfCBCUEZfQU5EIHwgQlBGX0spKQorCQkJY29udGludWU7CisKKwkJaWYgKCFleHBfbWFza1tCUEZfU0laRShpbnNuLmNvZGUpXSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZXhwX21hc2tbQlBGX1NJWkUoaW5zbi5jb2RlKV0gIT0gbmV4dC5pbW0pCisJCQljb250aW51ZTsKKworCQlpZiAobmV4dC5zcmNfcmVnIHx8IG5leHQuZHN0X3JlZykKKwkJCWNvbnRpbnVlOworCisJCW1ldGEyLT5za2lwID0gdHJ1ZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5mcF9icGZfb3B0X2xkX3NoaWZ0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2cpCit7CisJc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGExLCAqbWV0YTIsICptZXRhMzsKKworCW5mcF9mb3JfZWFjaF9pbnNuX3dhbGszKG5mcF9wcm9nLCBtZXRhMSwgbWV0YTIsIG1ldGEzKSB7CisJCXN0cnVjdCBicGZfaW5zbiBpbnNuLCBuZXh0MSwgbmV4dDI7CisKKwkJaW5zbiA9IG1ldGExLT5pbnNuOworCQluZXh0MSA9IG1ldGEyLT5pbnNuOworCQluZXh0MiA9IG1ldGEzLT5pbnNuOworCisJCWlmIChCUEZfQ0xBU1MoaW5zbi5jb2RlKSAhPSBCUEZfTEQpCisJCQljb250aW51ZTsKKwkJaWYgKEJQRl9NT0RFKGluc24uY29kZSkgIT0gQlBGX0FCUyAmJgorCQkgICAgQlBGX01PREUoaW5zbi5jb2RlKSAhPSBCUEZfSU5EKQorCQkJY29udGludWU7CisJCWlmIChCUEZfU0laRShpbnNuLmNvZGUpICE9IEJQRl9XKQorCQkJY29udGludWU7CisKKwkJaWYgKCEobmV4dDEuY29kZSA9PSAoQlBGX0xTSCB8IEJQRl9LIHwgQlBGX0FMVTY0KSAmJgorCQkgICAgICBuZXh0Mi5jb2RlID09IChCUEZfUlNIIHwgQlBGX0sgfCBCUEZfQUxVNjQpKSAmJgorCQkgICAgIShuZXh0MS5jb2RlID09IChCUEZfUlNIIHwgQlBGX0sgfCBCUEZfQUxVNjQpICYmCisJCSAgICAgIG5leHQyLmNvZGUgPT0gKEJQRl9MU0ggfCBCUEZfSyB8IEJQRl9BTFU2NCkpKQorCQkJY29udGludWU7CisKKwkJaWYgKG5leHQxLnNyY19yZWcgfHwgbmV4dDEuZHN0X3JlZyB8fAorCQkgICAgbmV4dDIuc3JjX3JlZyB8fCBuZXh0Mi5kc3RfcmVnKQorCQkJY29udGludWU7CisKKwkJaWYgKG5leHQxLmltbSAhPSAweDIwIHx8IG5leHQyLmltbSAhPSAweDIwKQorCQkJY29udGludWU7CisKKwkJbWV0YTItPnNraXAgPSB0cnVlOworCQltZXRhMy0+c2tpcCA9IHRydWU7CisJfQorfQorCitzdGF0aWMgaW50IG5mcF9icGZfb3B0aW1pemUoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZykKK3sKKwlpbnQgcmV0OworCisJbmZwX2JwZl9vcHRfcmVnX2luaXQobmZwX3Byb2cpOworCisJcmV0ID0gbmZwX2JwZl9vcHRfcmVnX3JlbmFtZShuZnBfcHJvZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW5mcF9icGZfb3B0X2xkX21hc2sobmZwX3Byb2cpOworCW5mcF9icGZfb3B0X2xkX3NoaWZ0KG5mcF9wcm9nKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG5mcF9icGZfaml0KCkgLSB0cmFuc2xhdGUgQlBGIGNvZGUgaW50byBORlAgYXNzZW1ibHkKKyAqIEBmaWx0ZXI6CWtlcm5lbCBCUEYgZmlsdGVyIHN0cnVjdAorICogQHByb2dfbWVtOgltZW1vcnkgdG8gc3RvcmUgYXNzZW1ibGVyIGluc3RydWN0aW9ucworICogQGFjdDoJYWN0aW9uIGF0dGFjaGVkIHRvIHRoaXMgZUJQRiBwcm9ncmFtCisgKiBAcHJvZ19zdGFydDoJb2Zmc2V0IG9mIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiB3aGVuIGxvYWRlZAorICogQHByb2dfZG9uZToJd2hlcmUgdG8ganVtcCBvbiBleGl0CisgKiBAcHJvZ19zejoJc2l6ZSBvZiBAcHJvZ19tZW0gaW4gaW5zdHJ1Y3Rpb25zCisgKiBAcmVzOglhY2hpZXZlZCBwYXJhbWV0ZXJzIG9mIHRyYW5zbGF0aW9uIHJlc3VsdHMKKyAqLworaW50CituZnBfYnBmX2ppdChzdHJ1Y3QgYnBmX3Byb2cgKmZpbHRlciwgdm9pZCAqcHJvZ19tZW0sCisJICAgIGVudW0gbmZwX2JwZl9hY3Rpb25fdHlwZSBhY3QsCisJICAgIHVuc2lnbmVkIGludCBwcm9nX3N0YXJ0LCB1bnNpZ25lZCBpbnQgcHJvZ19kb25lLAorCSAgICB1bnNpZ25lZCBpbnQgcHJvZ19zeiwgc3RydWN0IG5mcF9icGZfcmVzdWx0ICpyZXMpCit7CisJc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZzsKKwlpbnQgcmV0OworCisJbmZwX3Byb2cgPSBremFsbG9jKHNpemVvZigqbmZwX3Byb2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5mcF9wcm9nKQorCQlyZXR1cm4gLUVOT01FTTsKKworCUlOSVRfTElTVF9IRUFEKCZuZnBfcHJvZy0+aW5zbnMpOworCW5mcF9wcm9nLT5hY3QgPSBhY3Q7CisJbmZwX3Byb2ctPnN0YXJ0X29mZiA9IHByb2dfc3RhcnQ7CisJbmZwX3Byb2ctPnRndF9kb25lID0gcHJvZ19kb25lOworCisJcmV0ID0gbmZwX3Byb2dfcHJlcGFyZShuZnBfcHJvZywgZmlsdGVyLT5pbnNuc2ksIGZpbHRlci0+bGVuKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IG5mcF9wcm9nX3ZlcmlmeShuZnBfcHJvZywgZmlsdGVyKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IG5mcF9icGZfb3B0aW1pemUobmZwX3Byb2cpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKG5mcF9wcm9nLT5udW1fcmVncyA8PSA3KQorCQluZnBfcHJvZy0+cmVnc19wZXJfdGhyZWFkID0gMTY7CisJZWxzZQorCQluZnBfcHJvZy0+cmVnc19wZXJfdGhyZWFkID0gMzI7CisKKwluZnBfcHJvZy0+cHJvZyA9IHByb2dfbWVtOworCW5mcF9wcm9nLT5fX3Byb2dfYWxsb2NfbGVuID0gcHJvZ19zejsKKworCXJldCA9IG5mcF90cmFuc2xhdGUobmZwX3Byb2cpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJUcmFuc2xhdGlvbiBmYWlsZWQgd2l0aCBlcnJvciAlZCAodHJhbnNsYXRlZDogJXUpXG4iLAorCQkgICAgICAgcmV0LCBuZnBfcHJvZy0+bl90cmFuc2xhdGVkKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXMtPm5faW5zdHIgPSBuZnBfcHJvZy0+cHJvZ19sZW47CisJcmVzLT5kZW5zZV9tb2RlID0gbmZwX3Byb2ctPm51bV9yZWdzIDw9IDc7CitvdXQ6CisJbmZwX3Byb2dfZnJlZShuZnBfcHJvZyk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfYnBmX3ZlcmlmaWVyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9icGZfdmVyaWZpZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDRjYWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfYnBmX3ZlcmlmaWVyLmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTmV0cm9ub21lIFN5c3RlbXMsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIExpY2Vuc2UgVmVyc2lvbiAyLAorICogSnVuZSAxOTkxIGFzIHNob3duIGluIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3Rvcnkgb2YgdGhpcworICogc291cmNlIHRyZWUgb3IgdGhlIEJTRCAyLUNsYXVzZSBMaWNlbnNlIHByb3ZpZGVkIGJlbG93LiAgWW91IGhhdmUgdGhlCisgKiBvcHRpb24gdG8gbGljZW5zZSB0aGlzIHNvZnR3YXJlIHVuZGVyIHRoZSBjb21wbGV0ZSB0ZXJtcyBvZiBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBUaGUgQlNEIDItQ2xhdXNlIExpY2Vuc2U6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpCSJORlAgbmV0IGJwZjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgorI2luY2x1ZGUgPGxpbnV4L2JwZl92ZXJpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworI2luY2x1ZGUgIm5mcF9icGYuaCIKKworLyogQW5hbHl6ZXIvdmVyaWZpZXIgZGVmaW5pdGlvbnMgKi8KK3N0cnVjdCBuZnBfYnBmX2FuYWx5emVyX3ByaXYgeworCXN0cnVjdCBuZnBfcHJvZyAqcHJvZzsKKwlzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqCituZnBfYnBmX2dvdG9fbWV0YShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSwKKwkJICB1bnNpZ25lZCBpbnQgaW5zbl9pZHgsIHVuc2lnbmVkIGludCBuX2luc25zKQoreworCXVuc2lnbmVkIGludCBmb3J3YXJkLCBiYWNrd2FyZCwgaTsKKworCWJhY2t3YXJkID0gbWV0YS0+biAtIGluc25faWR4OworCWZvcndhcmQgPSBpbnNuX2lkeCAtIG1ldGEtPm47CisKKwlpZiAobWluKGZvcndhcmQsIGJhY2t3YXJkKSA+IG5faW5zbnMgLSBpbnNuX2lkeCAtIDEpIHsKKwkJYmFja3dhcmQgPSBuX2luc25zIC0gaW5zbl9pZHggLSAxOworCQltZXRhID0gbmZwX3Byb2dfbGFzdF9tZXRhKG5mcF9wcm9nKTsKKwl9CisJaWYgKG1pbihmb3J3YXJkLCBiYWNrd2FyZCkgPiBpbnNuX2lkeCAmJiBiYWNrd2FyZCA+IGluc25faWR4KSB7CisJCWZvcndhcmQgPSBpbnNuX2lkeDsKKwkJbWV0YSA9IG5mcF9wcm9nX2ZpcnN0X21ldGEobmZwX3Byb2cpOworCX0KKworCWlmIChmb3J3YXJkIDwgYmFja3dhcmQpCisJCWZvciAoaSA9IDA7IGkgPCBmb3J3YXJkOyBpKyspCisJCQltZXRhID0gbmZwX21ldGFfbmV4dChtZXRhKTsKKwllbHNlCisJCWZvciAoaSA9IDA7IGkgPCBiYWNrd2FyZDsgaSsrKQorCQkJbWV0YSA9IG5mcF9tZXRhX3ByZXYobWV0YSk7CisKKwlyZXR1cm4gbWV0YTsKK30KKworc3RhdGljIGludAorbmZwX2JwZl9jaGVja19leGl0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csCisJCSAgIGNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpCit7CisJY29uc3Qgc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZzAgPSAmZW52LT5jdXJfc3RhdGUucmVnc1swXTsKKworCWlmIChyZWcwLT50eXBlICE9IENPTlNUX0lNTSkgeworCQlwcl9pbmZvKCJ1bnN1cHBvcnRlZCBleGl0IHN0YXRlOiAlZCwgaW1tOiAlbGx4XG4iLAorCQkJcmVnMC0+dHlwZSwgcmVnMC0+aW1tKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG5mcF9wcm9nLT5hY3QgIT0gTk5fQUNUX0RJUkVDVCAmJgorCSAgICByZWcwLT5pbW0gIT0gMCAmJiAocmVnMC0+aW1tICYgfjBVKSAhPSB+MFUpIHsKKwkJcHJfaW5mbygidW5zdXBwb3J0ZWQgZXhpdCBzdGF0ZTogJWQsIGltbTogJWxseFxuIiwKKwkJCXJlZzAtPnR5cGUsIHJlZzAtPmltbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChuZnBfcHJvZy0+YWN0ID09IE5OX0FDVF9ESVJFQ1QgJiYgcmVnMC0+aW1tIDw9IFRDX0FDVF9SRURJUkVDVCAmJgorCSAgICByZWcwLT5pbW0gIT0gVENfQUNUX1NIT1QgJiYgcmVnMC0+aW1tICE9IFRDX0FDVF9TVE9MRU4gJiYKKwkgICAgcmVnMC0+aW1tICE9IFRDX0FDVF9RVUVVRUQpIHsKKwkJcHJfaW5mbygidW5zdXBwb3J0ZWQgZXhpdCBzdGF0ZTogJWQsIGltbTogJWxseFxuIiwKKwkJCXJlZzAtPnR5cGUsIHJlZzAtPmltbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CituZnBfYnBmX2NoZWNrX2N0eF9wdHIoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywKKwkJICAgICAgY29uc3Qgc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTggcmVnKQoreworCWlmIChlbnYtPmN1cl9zdGF0ZS5yZWdzW3JlZ10udHlwZSAhPSBQVFJfVE9fQ1RYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CituZnBfdmVyaWZ5X2luc24oc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGluc25faWR4LCBpbnQgcHJldl9pbnNuX2lkeCkKK3sKKwlzdHJ1Y3QgbmZwX2JwZl9hbmFseXplcl9wcml2ICpwcml2ID0gZW52LT5hbmFseXplcl9wcml2OworCXN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhID0gcHJpdi0+bWV0YTsKKworCW1ldGEgPSBuZnBfYnBmX2dvdG9fbWV0YShwcml2LT5wcm9nLCBtZXRhLCBpbnNuX2lkeCwgZW52LT5wcm9nLT5sZW4pOworCXByaXYtPm1ldGEgPSBtZXRhOworCisJaWYgKG1ldGEtPmluc24uc3JjX3JlZyA9PSBCUEZfUkVHXzEwIHx8CisJICAgIG1ldGEtPmluc24uZHN0X3JlZyA9PSBCUEZfUkVHXzEwKSB7CisJCXByX2Vycigic3RhY2sgbm90IHlldCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG1ldGEtPmluc24uc3JjX3JlZyA+PSBNQVhfQlBGX1JFRyB8fAorCSAgICBtZXRhLT5pbnNuLmRzdF9yZWcgPj0gTUFYX0JQRl9SRUcpIHsKKwkJcHJfZXJyKCJwcm9ncmFtIHVzZXMgZXh0ZW5kZWQgcmVnaXN0ZXJzIC0gaml0IGhhcmRlbmluZz9cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobWV0YS0+aW5zbi5jb2RlID09IChCUEZfSk1QIHwgQlBGX0VYSVQpKQorCQlyZXR1cm4gbmZwX2JwZl9jaGVja19leGl0KHByaXYtPnByb2csIGVudik7CisKKwlpZiAoKG1ldGEtPmluc24uY29kZSAmIH5CUEZfU0laRV9NQVNLKSA9PSAoQlBGX0xEWCB8IEJQRl9NRU0pKQorCQlyZXR1cm4gbmZwX2JwZl9jaGVja19jdHhfcHRyKHByaXYtPnByb2csIGVudiwKKwkJCQkJICAgICBtZXRhLT5pbnNuLnNyY19yZWcpOworCWlmICgobWV0YS0+aW5zbi5jb2RlICYgfkJQRl9TSVpFX01BU0spID09IChCUEZfU1RYIHwgQlBGX01FTSkpCisJCXJldHVybiBuZnBfYnBmX2NoZWNrX2N0eF9wdHIocHJpdi0+cHJvZywgZW52LAorCQkJCQkgICAgIG1ldGEtPmluc24uZHN0X3JlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZXh0X2FuYWx5emVyX29wcyBuZnBfYnBmX2FuYWx5emVyX29wcyA9IHsKKwkuaW5zbl9ob29rID0gbmZwX3ZlcmlmeV9pbnNuLAorfTsKKworaW50IG5mcF9wcm9nX3ZlcmlmeShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCit7CisJc3RydWN0IG5mcF9icGZfYW5hbHl6ZXJfcHJpdiAqcHJpdjsKKwlpbnQgcmV0OworCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaXYtPnByb2cgPSBuZnBfcHJvZzsKKwlwcml2LT5tZXRhID0gbmZwX3Byb2dfZmlyc3RfbWV0YShuZnBfcHJvZyk7CisKKwlyZXQgPSBicGZfYW5hbHl6ZXIocHJvZywgJm5mcF9icGZfYW5hbHl6ZXJfb3BzLCBwcml2KTsKKworCWtmcmVlKHByaXYpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX25ldC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0LmgKaW5kZXggNjkwNjM1Ni4uZWQ4MjRlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0LmgKQEAgLTYyLDYgKzYyLDkgQEAKIC8qIE1heCB0aW1lIHRvIHdhaXQgZm9yIE5GUCB0byByZXNwb25kIG9uIHVwZGF0ZXMgKGluIHNlY29uZHMpICovCiAjZGVmaW5lIE5GUF9ORVRfUE9MTF9USU1FT1VUCTUKIAorLyogSW50ZXJ2YWwgZm9yIHJlYWRpbmcgb2ZmbG9hZGVkIGZpbHRlciBzdGF0cyAqLworI2RlZmluZSBORlBfTkVUX1NUQVRfUE9MTF9JVkwJbXNlY3NfdG9famlmZmllcygxMDApCisKIC8qIEJhciBhbGxvY2F0aW9uICovCiAjZGVmaW5lIE5GUF9ORVRfQ1RSTF9CQVIJMAogI2RlZmluZSBORlBfTkVUX1EwX0JBUgkJMgpAQCAtMjIwLDcgKzIyMyw3IEBACiAjZGVmaW5lIFBDSUVfREVTQ19SWF9JX1RDUF9DU1VNX09LCWNwdV90b19sZTE2KEJJVCgxMSkpCiAjZGVmaW5lIFBDSUVfREVTQ19SWF9JX1VEUF9DU1VNCQljcHVfdG9fbGUxNihCSVQoMTApKQogI2RlZmluZSBQQ0lFX0RFU0NfUlhfSV9VRFBfQ1NVTV9PSwljcHVfdG9fbGUxNihCSVQoOSkpCi0jZGVmaW5lIFBDSUVfREVTQ19SWF9TUEFSRQkJY3B1X3RvX2xlMTYoQklUKDgpKQorI2RlZmluZSBQQ0lFX0RFU0NfUlhfQlBGCQljcHVfdG9fbGUxNihCSVQoOCkpCiAjZGVmaW5lIFBDSUVfREVTQ19SWF9FT1AJCWNwdV90b19sZTE2KEJJVCg3KSkKICNkZWZpbmUgUENJRV9ERVNDX1JYX0lQNF9DU1VNCQljcHVfdG9fbGUxNihCSVQoNikpCiAjZGVmaW5lIFBDSUVfREVTQ19SWF9JUDRfQ1NVTV9PSwljcHVfdG9fbGUxNihCSVQoNSkpCkBAIC0yNjYsNiArMjY5LDggQEAKIAl9OwogfTsKIAorI2RlZmluZSBORlBfTkVUX01FVEFfRklFTERfTUFTSyBHRU5NQVNLKE5GUF9ORVRfTUVUQV9GSUVMRF9TSVpFIC0gMSwgMCkKKwogc3RydWN0IG5mcF9uZXRfcnhfaGFzaCB7CiAJX19iZTMyIGhhc2hfdHlwZTsKIAlfX2JlMzIgaGFzaDsKQEAgLTQwNSw2ICs0MTAsMTEgQEAKIAkgICAgICAgZndfdmVyLT5taW5vciA9PSBtaW5vcjsKIH0KIAorc3RydWN0IG5mcF9zdGF0X3BhaXIgeworCXU2NCBwa3RzOworCXU2NCBieXRlczsKK307CisKIC8qKgogICogc3RydWN0IG5mcF9uZXQgLSBORlAgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAcGRldjogICAgICAgICAgICAgICBCYWNrcG9pbnRlciB0byBQQ0kgZGV2aWNlCkBAIC00MTMsNiArNDIzLDcgQEAKICAqIEBpc192ZjogICAgICAgICAgICAgIElzIHRoZSBkcml2ZXIgYXR0YWNoZWQgdG8gYSBWRj8KICAqIEBpc19uZnAzMjAwOiAgICAgICAgIElzIHRoZSBkcml2ZXIgZm9yIGEgTkZQLTMyMDAgY2FyZD8KICAqIEBmd19sb2FkZWQ6ICAgICAgICAgIElzIHRoZSBmaXJtd2FyZSBsb2FkZWQ/CisgKiBAYnBmX29mZmxvYWRfc2tpcF9zdzogIE9mZmxvYWRlZCBCUEYgcHJvZ3JhbSB3aWxsIG5vdCBiZSByZXJ1biBieSBjbHNfYnBmCiAgKiBAY3RybDogICAgICAgICAgICAgICBMb2NhbCBjb3B5IG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyL3dvcmQuCiAgKiBAZmxfYnVmc3o6ICAgICAgICAgICBDdXJyZW50bHkgY29uZmlndXJlZCBzaXplIG9mIHRoZSBmcmVlbGlzdCBidWZmZXJzCiAgKiBAcnhfb2Zmc2V0OgkJT2Zmc2V0IGluIHRoZSBSWCBidWZmZXJzIHdoZXJlIHBhY2tldCBkYXRhIHN0YXJ0cwpAQCAtNDI3LDYgKzQzOCwxMSBAQAogICogQHJzc19jZmc6ICAgICAgICAgICAgUlNTIGNvbmZpZ3VyYXRpb24KICAqIEByc3Nfa2V5OiAgICAgICAgICAgIFJTUyBzZWNyZXQga2V5CiAgKiBAcnNzX2l0Ymw6ICAgICAgICAgICBSU1MgaW5kaXJlY3Rpb24gdGFibGUKKyAqIEByeF9maWx0ZXI6CQlGaWx0ZXIgb2ZmbG9hZCBzdGF0aXN0aWNzIC0gZHJvcHBlZCBwYWNrZXRzL2J5dGVzCisgKiBAcnhfZmlsdGVyX3ByZXY6CUZpbHRlciBvZmZsb2FkIHN0YXRpc3RpY3MgLSB2YWx1ZXMgZnJvbSBwcmV2aW91cyB1cGRhdGUKKyAqIEByeF9maWx0ZXJfY2hhbmdlOglKaWZmaWVzIHdoZW4gc3RhdGlzdGljcyBsYXN0IGNoYW5nZWQKKyAqIEByeF9maWx0ZXJfc3RhdHNfdGltZXI6ICBUaW1lciBmb3IgcG9sbGluZyBmaWx0ZXIgb2ZmbG9hZCBzdGF0aXN0aWNzCisgKiBAcnhfZmlsdGVyX2xvY2s6CUxvY2sgcHJvdGVjdGluZyB0aW1lciBzdGF0ZSBjaGFuZ2VzICh0ZWFyZG93bikKICAqIEBtYXhfdHhfcmluZ3M6ICAgICAgIE1heGltdW0gbnVtYmVyIG9mIFRYIHJpbmdzIHN1cHBvcnRlZCBieSB0aGUgRmlybXdhcmUKICAqIEBtYXhfcnhfcmluZ3M6ICAgICAgIE1heGltdW0gbnVtYmVyIG9mIFJYIHJpbmdzIHN1cHBvcnRlZCBieSB0aGUgRmlybXdhcmUKICAqIEBudW1fdHhfcmluZ3M6ICAgICAgIEN1cnJlbnRseSBjb25maWd1cmVkIG51bWJlciBvZiBUWCByaW5ncwpAQCAtNDczLDYgKzQ4OSw3IEBACiAJdW5zaWduZWQgaXNfdmY6MTsKIAl1bnNpZ25lZCBpc19uZnAzMjAwOjE7CiAJdW5zaWduZWQgZndfbG9hZGVkOjE7CisJdW5zaWduZWQgYnBmX29mZmxvYWRfc2tpcF9zdzoxOwogCiAJdTMyIGN0cmw7CiAJdTMyIGZsX2J1ZnN6OwpAQCAtNTAyLDYgKzUxOSwxMSBAQAogCXU4IHJzc19rZXlbTkZQX05FVF9DRkdfUlNTX0tFWV9TWl07CiAJdTggcnNzX2l0YmxbTkZQX05FVF9DRkdfUlNTX0lUQkxfU1pdOwogCisJc3RydWN0IG5mcF9zdGF0X3BhaXIgcnhfZmlsdGVyLCByeF9maWx0ZXJfcHJldjsKKwl1bnNpZ25lZCBsb25nIHJ4X2ZpbHRlcl9jaGFuZ2U7CisJc3RydWN0IHRpbWVyX2xpc3QgcnhfZmlsdGVyX3N0YXRzX3RpbWVyOworCXNwaW5sb2NrX3QgcnhfZmlsdGVyX2xvY2s7CisKIAlpbnQgbWF4X3R4X3JpbmdzOwogCWludCBtYXhfcnhfcmluZ3M7CiAKQEAgLTU2MSwxMiArNTgzLDI4IEBACiAvKiBGdW5jdGlvbnMgdG8gcmVhZC93cml0ZSBmcm9tL3RvIGEgQkFSCiAgKiBQZXJmb3JtcyBhbnkgZW5kaWFuIGNvbnZlcnNpb24gbmVjZXNzYXJ5LgogICovCitzdGF0aWMgaW5saW5lIHUxNiBubl9yZWFkYihzdHJ1Y3QgbmZwX25ldCAqbm4sIGludCBvZmYpCit7CisJcmV0dXJuIHJlYWRiKG5uLT5jdHJsX2JhciArIG9mZik7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBubl93cml0ZWIoc3RydWN0IG5mcF9uZXQgKm5uLCBpbnQgb2ZmLCB1OCB2YWwpCiB7CiAJd3JpdGViKHZhbCwgbm4tPmN0cmxfYmFyICsgb2ZmKTsKIH0KIAotLyogTkZQLTMyMDAgY2FuJ3QgaGFuZGxlIDE2LWJpdCBhY2Nlc3NlcyB0b28gd2VsbCAtIGhlbmNlIG5vIHJlYWR3L3dyaXRldyAqLworLyogTkZQLTMyMDAgY2FuJ3QgaGFuZGxlIDE2LWJpdCBhY2Nlc3NlcyB0b28gd2VsbCAqLworc3RhdGljIGlubGluZSB1MTYgbm5fcmVhZHcoc3RydWN0IG5mcF9uZXQgKm5uLCBpbnQgb2ZmKQoreworCVdBUk5fT05fT05DRShubi0+aXNfbmZwMzIwMCk7CisJcmV0dXJuIHJlYWR3KG5uLT5jdHJsX2JhciArIG9mZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBubl93cml0ZXcoc3RydWN0IG5mcF9uZXQgKm5uLCBpbnQgb2ZmLCB1MTYgdmFsKQoreworCVdBUk5fT05fT05DRShubi0+aXNfbmZwMzIwMCk7CisJd3JpdGV3KHZhbCwgbm4tPmN0cmxfYmFyICsgb2ZmKTsKK30KIAogc3RhdGljIGlubGluZSB1MzIgbm5fcmVhZGwoc3RydWN0IG5mcF9uZXQgKm5uLCBpbnQgb2ZmKQogewpAQCAtNzU3LDQgKzc5NSw5IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX05GUF9ORVRfREVCVUcgKi8KIAordm9pZCBuZnBfbmV0X2ZpbHRlcl9zdGF0c190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOworaW50CituZnBfbmV0X2JwZl9vZmZsb2FkKHN0cnVjdCBuZnBfbmV0ICpubiwgdTMyIGhhbmRsZSwgX19iZTE2IHByb3RvLAorCQkgICAgc3RydWN0IHRjX2Nsc19icGZfb2ZmbG9hZCAqY2xzX2JwZik7CisKICNlbmRpZiAvKiBfTkZQX05FVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0X2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0X2NvbW1vbi5jCmluZGV4IDg4Njc4YzEuLmFlZTNmZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX25ldF9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9uZXRfY29tbW9uLmMKQEAgLTQxLDcgKzQxLDYgQEAKICAqICAgICAgICAgIENocmlzIFRlbGZlciA8Y2hyaXMudGVsZmVyQG5ldHJvbm9tZS5jb20+CiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC02MSw2ICs2MCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgogCisjaW5jbHVkZSA8bmV0L3BrdF9jbHMuaD4KICNpbmNsdWRlIDxuZXQvdnhsYW4uaD4KIAogI2luY2x1ZGUgIm5mcF9uZXRfY3RybC5oIgpAQCAtMTI5MywzNiArMTI5Myw3MCBAQAogCX0KIH0KIAotLyoqCi0gKiBuZnBfbmV0X3NldF9oYXNoKCkgLSBTZXQgU0tCIGhhc2ggZGF0YQotICogQG5ldGRldjogYWRhcHRlcidzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCi0gKiBAc2tiOiAgIFNLQiB0byBzZXQgdGhlIGhhc2ggZGF0YSBvbgotICogQHJ4ZDogICBSWCBkZXNjcmlwdG9yCi0gKgotICogVGhlIFJTUyBoYXNoIGFuZCBoYXNoLXR5cGUgYXJlIHByZS1wZW5kZWQgdG8gdGhlIHBhY2tldCBkYXRhLgotICogRXh0cmFjdCBhbmQgZGVjb2RlIGl0IGFuZCBzZXQgdGhlIHNrYiBmaWVsZHMuCi0gKi8KIHN0YXRpYyB2b2lkIG5mcF9uZXRfc2V0X2hhc2goc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgc3RydWN0IG5mcF9uZXRfcnhfZGVzYyAqcnhkKQorCQkJICAgICB1bnNpZ25lZCBpbnQgdHlwZSwgX19iZTMyICpoYXNoKQoreworCWlmICghKG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1JYSEFTSCkpCisJCXJldHVybjsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTkZQX05FVF9SU1NfSVBWNDoKKwljYXNlIE5GUF9ORVRfUlNTX0lQVjY6CisJY2FzZSBORlBfTkVUX1JTU19JUFY2X0VYOgorCQlza2Jfc2V0X2hhc2goc2tiLCBnZXRfdW5hbGlnbmVkX2JlMzIoaGFzaCksIFBLVF9IQVNIX1RZUEVfTDMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlza2Jfc2V0X2hhc2goc2tiLCBnZXRfdW5hbGlnbmVkX2JlMzIoaGFzaCksIFBLVF9IQVNIX1RZUEVfTDQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCituZnBfbmV0X3NldF9oYXNoX2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgc3RydWN0IG5mcF9uZXRfcnhfZGVzYyAqcnhkKQogewogCXN0cnVjdCBuZnBfbmV0X3J4X2hhc2ggKnJ4X2hhc2g7CiAKLQlpZiAoIShyeGQtPnJ4ZC5mbGFncyAmIFBDSUVfREVTQ19SWF9SU1MpIHx8Ci0JICAgICEobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhIQVNIKSkKKwlpZiAoIShyeGQtPnJ4ZC5mbGFncyAmIFBDSUVfREVTQ19SWF9SU1MpKQogCQlyZXR1cm47CiAKIAlyeF9oYXNoID0gKHN0cnVjdCBuZnBfbmV0X3J4X2hhc2ggKikoc2tiLT5kYXRhIC0gc2l6ZW9mKCpyeF9oYXNoKSk7CiAKLQlzd2l0Y2ggKGJlMzJfdG9fY3B1KHJ4X2hhc2gtPmhhc2hfdHlwZSkpIHsKLQljYXNlIE5GUF9ORVRfUlNTX0lQVjQ6Ci0JY2FzZSBORlBfTkVUX1JTU19JUFY2OgotCWNhc2UgTkZQX05FVF9SU1NfSVBWNl9FWDoKLQkJc2tiX3NldF9oYXNoKHNrYiwgYmUzMl90b19jcHUocnhfaGFzaC0+aGFzaCksIFBLVF9IQVNIX1RZUEVfTDMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlza2Jfc2V0X2hhc2goc2tiLCBiZTMyX3RvX2NwdShyeF9oYXNoLT5oYXNoKSwgUEtUX0hBU0hfVFlQRV9MNCk7Ci0JCWJyZWFrOworCW5mcF9uZXRfc2V0X2hhc2gobmV0ZGV2LCBza2IsIGdldF91bmFsaWduZWRfYmUzMigmcnhfaGFzaC0+aGFzaF90eXBlKSwKKwkJCSAmcnhfaGFzaC0+aGFzaCk7Cit9CisKK3N0YXRpYyB2b2lkICoKK25mcF9uZXRfcGFyc2VfbWV0YShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICBpbnQgbWV0YV9sZW4pCit7CisJdTggKmRhdGEgPSBza2ItPmRhdGEgLSBtZXRhX2xlbjsKKwl1MzIgbWV0YV9pbmZvOworCisJbWV0YV9pbmZvID0gZ2V0X3VuYWxpZ25lZF9iZTMyKGRhdGEpOworCWRhdGEgKz0gNDsKKworCXdoaWxlIChtZXRhX2luZm8pIHsKKwkJc3dpdGNoIChtZXRhX2luZm8gJiBORlBfTkVUX01FVEFfRklFTERfTUFTSykgeworCQljYXNlIE5GUF9ORVRfTUVUQV9IQVNIOgorCQkJbWV0YV9pbmZvID4+PSBORlBfTkVUX01FVEFfRklFTERfU0laRTsKKwkJCW5mcF9uZXRfc2V0X2hhc2gobmV0ZGV2LCBza2IsCisJCQkJCSBtZXRhX2luZm8gJiBORlBfTkVUX01FVEFfRklFTERfTUFTSywKKwkJCQkJIChfX2JlMzIgKilkYXRhKTsKKwkJCWRhdGEgKz0gNDsKKwkJCWJyZWFrOworCQljYXNlIE5GUF9ORVRfTUVUQV9NQVJLOgorCQkJc2tiLT5tYXJrID0gZ2V0X3VuYWxpZ25lZF9iZTMyKGRhdGEpOworCQkJZGF0YSArPSA0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1ldGFfaW5mbyA+Pj0gTkZQX05FVF9NRVRBX0ZJRUxEX1NJWkU7CiAJfQorCisJcmV0dXJuIGRhdGE7CiB9CiAKIC8qKgpAQCAtMTQzOSwxOCArMTQ3MywyOSBAQAogCQkJc2tiX3Jlc2VydmUoc2tiLCBubi0+cnhfb2Zmc2V0KTsKIAkJc2tiX3B1dChza2IsIGRhdGFfbGVuIC0gbWV0YV9sZW4pOwogCi0JCW5mcF9uZXRfc2V0X2hhc2gobm4tPm5ldGRldiwgc2tiLCByeGQpOwotCi0JCS8qIFBhZCBzbWFsbCBmcmFtZXMgdG8gbWluaW11bSAqLwotCQlpZiAoc2tiX3B1dF9wYWR0byhza2IsIDYwKSkKLQkJCWJyZWFrOwotCiAJCS8qIFN0YXRzIHVwZGF0ZSAqLwogCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyX3ZlYy0+cnhfc3luYyk7CiAJCXJfdmVjLT5yeF9wa3RzKys7CiAJCXJfdmVjLT5yeF9ieXRlcyArPSBza2ItPmxlbjsKIAkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnJfdmVjLT5yeF9zeW5jKTsKIAorCQlpZiAobm4tPmZ3X3Zlci5tYWpvciA8PSAzKSB7CisJCQluZnBfbmV0X3NldF9oYXNoX2Rlc2Mobm4tPm5ldGRldiwgc2tiLCByeGQpOworCQl9IGVsc2UgaWYgKG1ldGFfbGVuKSB7CisJCQl2b2lkICplbmQ7CisKKwkJCWVuZCA9IG5mcF9uZXRfcGFyc2VfbWV0YShubi0+bmV0ZGV2LCBza2IsIG1ldGFfbGVuKTsKKwkJCWlmICh1bmxpa2VseShlbmQgIT0gc2tiLT5kYXRhKSkgeworCQkJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnJfdmVjLT5yeF9zeW5jKTsKKwkJCQlyX3ZlYy0+cnhfZHJvcHMrKzsKKwkJCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcl92ZWMtPnJ4X3N5bmMpOworCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCQlubl93YXJuX3JhdGVsaW1pdChubiwgImludmFsaWQgUlggcGFja2V0IG1ldGFkYXRhXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCiAJCXNrYl9yZWNvcmRfcnhfcXVldWUoc2tiLCByeF9yaW5nLT5pZHgpOwogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBubi0+bmV0ZGV2KTsKIApAQCAtMjA0OSwxMiArMjA5NCwxNiBAQAogCiAJbm4tPnJ4X3JpbmdzID0ga2NhbGxvYyhubi0+bnVtX3J4X3JpbmdzLCBzaXplb2YoKm5uLT5yeF9yaW5ncyksCiAJCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFubi0+cnhfcmluZ3MpCisJaWYgKCFubi0+cnhfcmluZ3MpIHsKKwkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfZnJlZV9sc2M7CisJfQogCW5uLT50eF9yaW5ncyA9IGtjYWxsb2Mobm4tPm51bV90eF9yaW5ncywgc2l6ZW9mKCpubi0+dHhfcmluZ3MpLAogCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghbm4tPnR4X3JpbmdzKQorCWlmICghbm4tPnR4X3JpbmdzKSB7CisJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2ZyZWVfcnhfcmluZ3M7CisJfQogCiAJZm9yIChyID0gMDsgciA8IG5uLT5udW1fcl92ZWNzOyByKyspIHsKIAkJZXJyID0gbmZwX25ldF9wcmVwYXJlX3ZlY3RvcihubiwgJm5uLT5yX3ZlY3Nbcl0sIHIpOwpAQCAtMjM4Nyw2ICsyNDM2LDMxIEBACiAJcmV0dXJuIHN0YXRzOwogfQogCitzdGF0aWMgYm9vbCBuZnBfbmV0X2VicGZfY2FwYWJsZShzdHJ1Y3QgbmZwX25ldCAqbm4pCit7CisJaWYgKG5uLT5jYXAgJiBORlBfTkVUX0NGR19DVFJMX0JQRiAmJgorCSAgICBubl9yZWFkYihubiwgTkZQX05FVF9DRkdfQlBGX0FCSSkgPT0gTkZQX05FVF9CUEZfQUJJKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK25mcF9uZXRfc2V0dXBfdGMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGhhbmRsZSwgX19iZTE2IHByb3RvLAorCQkgc3RydWN0IHRjX3RvX25ldGRldiAqdGMpCit7CisJc3RydWN0IG5mcF9uZXQgKm5uID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWlmIChUQ19IX01BSihoYW5kbGUpICE9IFRDX0hfTUFKKFRDX0hfSU5HUkVTUykpCisJCXJldHVybiAtRU5PVFNVUFA7CisJaWYgKHByb3RvICE9IGh0b25zKEVUSF9QX0FMTCkpCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlpZiAodGMtPnR5cGUgPT0gVENfU0VUVVBfQ0xTQlBGICYmIG5mcF9uZXRfZWJwZl9jYXBhYmxlKG5uKSkKKwkJcmV0dXJuIG5mcF9uZXRfYnBmX29mZmxvYWQobm4sIGhhbmRsZSwgcHJvdG8sIHRjLT5jbHNfYnBmKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCiBzdGF0aWMgaW50IG5mcF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJCQkJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CkBAIC0yNDQxLDYgKzI1MTUsMTEgQEAKIAkJCW5ld19jdHJsICY9IH5ORlBfTkVUX0NGR19DVFJMX0dBVEhFUjsKIAl9CiAKKwlpZiAoY2hhbmdlZCAmIE5FVElGX0ZfSFdfVEMgJiYgbm4tPmN0cmwgJiBORlBfTkVUX0NGR19DVFJMX0JQRikgeworCQlubl9lcnIobm4sICJDYW5ub3QgZGlzYWJsZSBIVyBUQyBvZmZsb2FkIHdoaWxlIGluIHVzZVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCiAJbm5fZGJnKG5uLCAiRmVhdHVyZSBjaGFuZ2UgMHglbGx4IC0+IDB4JWxseCAoY2hhbmdlZD0weCVsbHgpXG4iLAogCSAgICAgICBuZXRkZXYtPmZlYXR1cmVzLCBmZWF0dXJlcywgY2hhbmdlZCk7CiAKQEAgLTI1OTAsNiArMjY2OSw3IEBACiAJLm5kb19zdG9wCQk9IG5mcF9uZXRfbmV0ZGV2X2Nsb3NlLAogCS5uZG9fc3RhcnRfeG1pdAkJPSBuZnBfbmV0X3R4LAogCS5uZG9fZ2V0X3N0YXRzNjQJPSBuZnBfbmV0X3N0YXQ2NCwKKwkubmRvX3NldHVwX3RjCQk9IG5mcF9uZXRfc2V0dXBfdGMsCiAJLm5kb190eF90aW1lb3V0CQk9IG5mcF9uZXRfdHhfdGltZW91dCwKIAkubmRvX3NldF9yeF9tb2RlCT0gbmZwX25ldF9zZXRfcnhfbW9kZSwKIAkubmRvX2NoYW5nZV9tdHUJCT0gbmZwX25ldF9jaGFuZ2VfbXR1LApAQCAtMjYxNSw3ICsyNjk1LDcgQEAKIAkJbm4tPmZ3X3Zlci5yZXN2LCBubi0+ZndfdmVyLmNsYXNzLAogCQlubi0+ZndfdmVyLm1ham9yLCBubi0+ZndfdmVyLm1pbm9yLAogCQlubi0+bWF4X210dSk7Ci0Jbm5faW5mbyhubiwgIkNBUDogJSN4ICVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzXG4iLAorCW5uX2luZm8obm4sICJDQVA6ICUjeCAlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzXG4iLAogCQlubi0+Y2FwLAogCQlubi0+Y2FwICYgTkZQX05FVF9DRkdfQ1RSTF9QUk9NSVNDICA/ICJQUk9NSVNDICIgIDogIiIsCiAJCW5uLT5jYXAgJiBORlBfTkVUX0NGR19DVFJMX0wyQkMgICAgID8gIkwyQkNGSUxUICIgOiAiIiwKQEAgLTI2MzIsNyArMjcxMiw4IEBACiAJCW5uLT5jYXAgJiBORlBfTkVUX0NGR19DVFJMX01TSVhBVVRPID8gIkFVVE9NQVNLICIgOiAiIiwKIAkJbm4tPmNhcCAmIE5GUF9ORVRfQ0ZHX0NUUkxfSVJRTU9EICAgPyAiSVJRTU9EICIgICA6ICIiLAogCQlubi0+Y2FwICYgTkZQX05FVF9DRkdfQ1RSTF9WWExBTiAgICA/ICJWWExBTiAiICAgIDogIiIsCi0JCW5uLT5jYXAgJiBORlBfTkVUX0NGR19DVFJMX05WR1JFICAgID8gIk5WR1JFICIJICA6ICIiKTsKKwkJbm4tPmNhcCAmIE5GUF9ORVRfQ0ZHX0NUUkxfTlZHUkUgICAgPyAiTlZHUkUgIgkgIDogIiIsCisJCW5mcF9uZXRfZWJwZl9jYXBhYmxlKG5uKSAgICAgICAgICAgID8gIkJQRiAiCSAgOiAiIik7CiB9CiAKIC8qKgpAQCAtMjY3NSwxMCArMjc1NiwxMyBAQAogCW5uLT5yeGRfY250ID0gTkZQX05FVF9SWF9ERVNDU19ERUZBVUxUOwogCiAJc3Bpbl9sb2NrX2luaXQoJm5uLT5yZWNvbmZpZ19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbm4tPnJ4X2ZpbHRlcl9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmbm4tPmxpbmtfc3RhdHVzX2xvY2spOwogCiAJc2V0dXBfdGltZXIoJm5uLT5yZWNvbmZpZ190aW1lciwKIAkJICAgIG5mcF9uZXRfcmVjb25maWdfdGltZXIsICh1bnNpZ25lZCBsb25nKW5uKTsKKwlzZXR1cF90aW1lcigmbm4tPnJ4X2ZpbHRlcl9zdGF0c190aW1lciwKKwkJICAgIG5mcF9uZXRfZmlsdGVyX3N0YXRzX3RpbWVyLCAodW5zaWduZWQgbG9uZylubik7CiAKIAlyZXR1cm4gbm47CiB9CkBAIC0yODAwLDYgKzI4ODQsOSBAQAogCiAJbmV0ZGV2LT5mZWF0dXJlcyA9IG5ldGRldi0+aHdfZmVhdHVyZXM7CiAKKwlpZiAobmZwX25ldF9lYnBmX2NhcGFibGUobm4pKQorCQluZXRkZXYtPmh3X2ZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVEM7CisKIAkvKiBBZHZlcnRpc2UgYnV0IGRpc2FibGUgVFNPIGJ5IGRlZmF1bHQuICovCiAJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+KE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU082KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0X2N0cmwuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX25ldF9jdHJsLmgKaW5kZXggYWQ2YzRlMy4uOTNiMTBiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0X2N0cmwuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9uZXRfY3RybC5oCkBAIC02Niw2ICs2NiwxMyBAQAogI2RlZmluZSBORlBfTkVUX0xTT19NQVhfSERSX1NaCQkyNTUKIAogLyoqCisgKiBQcmVwZW5kIGZpZWxkIHR5cGVzCisgKi8KKyNkZWZpbmUgTkZQX05FVF9NRVRBX0ZJRUxEX1NJWkUJCTQKKyNkZWZpbmUgTkZQX05FVF9NRVRBX0hBU0gJCTEgLyogbmV4dCBmaWVsZCBjYXJyaWVzIGhhc2ggdHlwZSAqLworI2RlZmluZSBORlBfTkVUX01FVEFfTUFSSwkJMgorCisvKioKICAqIEhhc2ggdHlwZSBwcmUtcGVuZGVkIHdoZW4gYSBSU1MgaGFzaCB3YXMgY29tcHV0ZWQKICAqLwogI2RlZmluZSBORlBfTkVUX1JTU19OT05FICAgICAgICAgICAgICAgIDAKQEAgLTEyMyw2ICsxMzAsNyBAQAogI2RlZmluZSAgIE5GUF9ORVRfQ0ZHX0NUUkxfTDJTV0lUQ0hfTE9DQUwgKDB4MSA8PCAyMykgLyogU3dpdGNoIHRvIGxvY2FsICovCiAjZGVmaW5lICAgTkZQX05FVF9DRkdfQ1RSTF9WWExBTgkgICgweDEgPDwgMjQpIC8qIFZYTEFOIHR1bm5lbCBzdXBwb3J0ICovCiAjZGVmaW5lICAgTkZQX05FVF9DRkdfQ1RSTF9OVkdSRQkgICgweDEgPDwgMjUpIC8qIE5WR1JFIHR1bm5lbCBzdXBwb3J0ICovCisjZGVmaW5lICAgTkZQX05FVF9DRkdfQ1RSTF9CUEYJCSAgKDB4MSA8PCAyNykgLyogQlBGIG9mZmxvYWQgY2FwYWJsZSAqLwogI2RlZmluZSBORlBfTkVUX0NGR19VUERBVEUgICAgICAgICAgICAgIDB4MDAwNAogI2RlZmluZSAgIE5GUF9ORVRfQ0ZHX1VQREFURV9HRU4gICAgICAgICAgKDB4MSA8PCAgMCkgLyogR2VuZXJhbCB1cGRhdGUgKi8KICNkZWZpbmUgICBORlBfTkVUX0NGR19VUERBVEVfUklORyAgICAgICAgICgweDEgPDwgIDEpIC8qIFJpbmcgY29uZmlnIGNoYW5nZSAqLwpAQCAtMTM0LDYgKzE0Miw3IEBACiAjZGVmaW5lICAgTkZQX05FVF9DRkdfVVBEQVRFX1JFU0VUICAgICAgICAoMHgxIDw8ICA3KSAvKiBVcGRhdGUgZHVlIHRvIEZMUiAqLwogI2RlZmluZSAgIE5GUF9ORVRfQ0ZHX1VQREFURV9JUlFNT0QgICAgICAgKDB4MSA8PCAgOCkgLyogSVJRIG1vZCBjaGFuZ2UgKi8KICNkZWZpbmUgICBORlBfTkVUX0NGR19VUERBVEVfVlhMQU4JICAoMHgxIDw8ICA5KSAvKiBWWExBTiBwb3J0IGNoYW5nZSAqLworI2RlZmluZSAgIE5GUF9ORVRfQ0ZHX1VQREFURV9CUEYJICAoMHgxIDw8IDEwKSAvKiBCUEYgcHJvZ3JhbSBsb2FkICovCiAjZGVmaW5lICAgTkZQX05FVF9DRkdfVVBEQVRFX0VSUiAgICAgICAgICAoMHgxIDw8IDMxKSAvKiBBIGVycm9yIG9jY3VycmVkICovCiAjZGVmaW5lIE5GUF9ORVRfQ0ZHX1RYUlNfRU5BQkxFICAgICAgICAgMHgwMDA4CiAjZGVmaW5lIE5GUF9ORVRfQ0ZHX1JYUlNfRU5BQkxFICAgICAgICAgMHgwMDEwCkBAIC0xOTYsMTAgKzIwNSwzNyBAQAogI2RlZmluZSBORlBfTkVUX0NGR19WWExBTl9TWgkJICAweDAwMDgKIAogLyoqCi0gKiA2NEIgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKDB4MDA4MCAtIDB4MDBjMCkKKyAqIE5GUDYwMDAgLSBCUEYgc2VjdGlvbgorICogQE5GUF9ORVRfQ0ZHX0JQRl9BQkk6CUJQRiBBQkkgdmVyc2lvbgorICogQE5GUF9ORVRfQ0ZHX0JQRl9DQVA6CUJQRiBjYXBhYmlsaXRpZXMKKyAqIEBORlBfTkVUX0NGR19CUEZfTUFYX0xFTjoJTWF4aW11bSBzaXplIG9mIEpJVGVkIEJQRiBjb2RlIGluIGJ5dGVzCisgKiBATkZQX05FVF9DRkdfQlBGX1NUQVJUOglPZmZzZXQgYXQgd2hpY2ggQlBGIHdpbGwgYmUgbG9hZGVkCisgKiBATkZQX05FVF9DRkdfQlBGX0RPTkU6CU9mZnNldCB0byBqdW1wIHRvIG9uIGV4aXQKKyAqIEBORlBfTkVUX0NGR19CUEZfU1RBQ0tfU1o6CVRvdGFsIHNpemUgb2Ygc3RhY2sgYXJlYSBpbiA2NEIgY2h1bmtzCisgKiBATkZQX05FVF9DRkdfQlBGX0lOTF9NVFU6CVBhY2tldCBkYXRhIHNwbGl0IG9mZnNldCBpbiA2NEIgY2h1bmtzCisgKiBATkZQX05FVF9DRkdfQlBGX1NJWkU6CVNpemUgb2YgdGhlIEpJVGVkIEJQRiBjb2RlIGluIGluc3RydWN0aW9ucworICogQE5GUF9ORVRfQ0ZHX0JQRl9BRERSOglETUEgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIHdpdGggSklUZWQgQlBGIGNvZGUKICAqLwotI2RlZmluZSBORlBfTkVUX0NGR19SRVNFUlZFRCAgICAgICAgICAgIDB4MDA4MAotI2RlZmluZSBORlBfTkVUX0NGR19SRVNFUlZFRF9TWiAgICAgICAgIDB4MDA0MAorI2RlZmluZSBORlBfTkVUX0NGR19CUEZfQUJJCQkweDAwODAKKyNkZWZpbmUgICBORlBfTkVUX0JQRl9BQkkJCTEKKyNkZWZpbmUgTkZQX05FVF9DRkdfQlBGX0NBUAkJMHgwMDgxCisjZGVmaW5lICAgTkZQX05FVF9CUEZfQ0FQX1JFTE8JCSgxIDw8IDApIC8qIHNlYW1sZXNzIHJlbG9hZCAqLworI2RlZmluZSBORlBfTkVUX0NGR19CUEZfTUFYX0xFTgkJMHgwMDgyCisjZGVmaW5lIE5GUF9ORVRfQ0ZHX0JQRl9TVEFSVAkJMHgwMDg0CisjZGVmaW5lIE5GUF9ORVRfQ0ZHX0JQRl9ET05FCQkweDAwODYKKyNkZWZpbmUgTkZQX05FVF9DRkdfQlBGX1NUQUNLX1NaCTB4MDA4OAorI2RlZmluZSBORlBfTkVUX0NGR19CUEZfSU5MX01UVQkJMHgwMDg5CisjZGVmaW5lIE5GUF9ORVRfQ0ZHX0JQRl9TSVpFCQkweDAwOGUKKyNkZWZpbmUgTkZQX05FVF9DRkdfQlBGX0FERFIJCTB4MDA5MAorI2RlZmluZSAgIE5GUF9ORVRfQ0ZHX0JQRl9DRkdfOENUWAkoMSA8PCAwKSAvKiA4Y3R4IG1vZGUgKi8KKyNkZWZpbmUgICBORlBfTkVUX0NGR19CUEZfQ0ZHX01BU0sJN1VMTAorI2RlZmluZSAgIE5GUF9ORVRfQ0ZHX0JQRl9BRERSX01BU0sJKH5ORlBfTkVUX0NGR19CUEZfQ0ZHX01BU0spCisKKy8qKgorICogNDBCIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICgweDAwOTggLSAweDAwYzApCisgKi8KKyNkZWZpbmUgTkZQX05FVF9DRkdfUkVTRVJWRUQgICAgICAgICAgICAweDAwOTgKKyNkZWZpbmUgTkZQX05FVF9DRkdfUkVTRVJWRURfU1ogICAgICAgICAweDAwMjgKIAogLyoqCiAgKiBSU1MgY29uZmlndXJhdGlvbiAoMHgwMTAwIC0gMHgwMWFjKToKQEAgLTMwMyw2ICszMzksMTUgQEAKICNkZWZpbmUgTkZQX05FVF9DRkdfU1RBVFNfVFhfTUNfRlJBTUVTICAoTkZQX05FVF9DRkdfU1RBVFNfQkFTRSArIDB4ODApCiAjZGVmaW5lIE5GUF9ORVRfQ0ZHX1NUQVRTX1RYX0JDX0ZSQU1FUyAgKE5GUF9ORVRfQ0ZHX1NUQVRTX0JBU0UgKyAweDg4KQogCisjZGVmaW5lIE5GUF9ORVRfQ0ZHX1NUQVRTX0FQUDBfRlJBTUVTCShORlBfTkVUX0NGR19TVEFUU19CQVNFICsgMHg5MCkKKyNkZWZpbmUgTkZQX05FVF9DRkdfU1RBVFNfQVBQMF9CWVRFUwkoTkZQX05FVF9DRkdfU1RBVFNfQkFTRSArIDB4OTgpCisjZGVmaW5lIE5GUF9ORVRfQ0ZHX1NUQVRTX0FQUDFfRlJBTUVTCShORlBfTkVUX0NGR19TVEFUU19CQVNFICsgMHhhMCkKKyNkZWZpbmUgTkZQX05FVF9DRkdfU1RBVFNfQVBQMV9CWVRFUwkoTkZQX05FVF9DRkdfU1RBVFNfQkFTRSArIDB4YTgpCisjZGVmaW5lIE5GUF9ORVRfQ0ZHX1NUQVRTX0FQUDJfRlJBTUVTCShORlBfTkVUX0NGR19TVEFUU19CQVNFICsgMHhiMCkKKyNkZWZpbmUgTkZQX05FVF9DRkdfU1RBVFNfQVBQMl9CWVRFUwkoTkZQX05FVF9DRkdfU1RBVFNfQkFTRSArIDB4YjgpCisjZGVmaW5lIE5GUF9ORVRfQ0ZHX1NUQVRTX0FQUDNfRlJBTUVTCShORlBfTkVUX0NGR19TVEFUU19CQVNFICsgMHhjMCkKKyNkZWZpbmUgTkZQX05FVF9DRkdfU1RBVFNfQVBQM19CWVRFUwkoTkZQX05FVF9DRkdfU1RBVFNfQkFTRSArIDB4YzgpCisKIC8qKgogICogUGVyIHJpbmcgc3RhdHMgKDB4MTAwMCAtIDB4MTgwMCkKICAqIG9wdGlvbnMsIDY0Yml0IHBlciBlbnRyeQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0X2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX25ldF9ldGh0b29sLmMKaW5kZXggN2Q3OTMzZC4uMzQxOGYyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0X2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9uZXRfZXRodG9vbC5jCkBAIC00MCw3ICs0MCw2IEBACiAgKiAgICAgICAgICBCcmFkIFBldHJ1cyA8YnJhZC5wZXRydXNAbmV0cm9ub21lLmNvbT4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CkBAIC0xMDcsNiArMTA2LDE4IEBACiAJeyJkZXZfdHhfcGt0cyIsIE5OX0VUX0RFVl9TVEFUKE5GUF9ORVRfQ0ZHX1NUQVRTX1RYX0ZSQU1FUyl9LAogCXsiZGV2X3R4X21jX3BrdHMiLCBOTl9FVF9ERVZfU1RBVChORlBfTkVUX0NGR19TVEFUU19UWF9NQ19GUkFNRVMpfSwKIAl7ImRldl90eF9iY19wa3RzIiwgTk5fRVRfREVWX1NUQVQoTkZQX05FVF9DRkdfU1RBVFNfVFhfQkNfRlJBTUVTKX0sCisKKwl7ImJwZl9wYXNzX3BrdHMiLCBOTl9FVF9ERVZfU1RBVChORlBfTkVUX0NGR19TVEFUU19BUFAwX0ZSQU1FUyl9LAorCXsiYnBmX3Bhc3NfYnl0ZXMiLCBOTl9FVF9ERVZfU1RBVChORlBfTkVUX0NGR19TVEFUU19BUFAwX0JZVEVTKX0sCisJLyogc2VlIGNvbW1lbnRzIGluIG91dHJvIGZ1bmN0aW9ucyBpbiBuZnBfYnBmX2ppdC5jIHRvIGZpbmQgb3V0CisJICogaG93IGRpZmZlcmVudCBCUEYgbW9kZXMgdXNlIGFwcC1zcGVjaWZpYyBjb3VudGVycworCSAqLworCXsiYnBmX2FwcDFfcGt0cyIsIE5OX0VUX0RFVl9TVEFUKE5GUF9ORVRfQ0ZHX1NUQVRTX0FQUDFfRlJBTUVTKX0sCisJeyJicGZfYXBwMV9ieXRlcyIsIE5OX0VUX0RFVl9TVEFUKE5GUF9ORVRfQ0ZHX1NUQVRTX0FQUDFfQllURVMpfSwKKwl7ImJwZl9hcHAyX3BrdHMiLCBOTl9FVF9ERVZfU1RBVChORlBfTkVUX0NGR19TVEFUU19BUFAyX0ZSQU1FUyl9LAorCXsiYnBmX2FwcDJfYnl0ZXMiLCBOTl9FVF9ERVZfU1RBVChORlBfTkVUX0NGR19TVEFUU19BUFAyX0JZVEVTKX0sCisJeyJicGZfYXBwM19wa3RzIiwgTk5fRVRfREVWX1NUQVQoTkZQX05FVF9DRkdfU1RBVFNfQVBQM19GUkFNRVMpfSwKKwl7ImJwZl9hcHAzX2J5dGVzIiwgTk5fRVRfREVWX1NUQVQoTkZQX05FVF9DRkdfU1RBVFNfQVBQM19CWVRFUyl9LAogfTsKIAogI2RlZmluZSBOTl9FVF9HTE9CQUxfU1RBVFNfTEVOIEFSUkFZX1NJWkUobmZwX25ldF9ldF9zdGF0cykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX25ldF9vZmZsb2FkLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9uZXRfb2ZmbG9hZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhY2ZiNjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9uZXRfb2ZmbG9hZC5jCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IE5ldHJvbm9tZSBTeXN0ZW1zLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBMaWNlbnNlIFZlcnNpb24gMiwKKyAqIEp1bmUgMTk5MSBhcyBzaG93biBpbiB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IG9mIHRoaXMKKyAqIHNvdXJjZSB0cmVlIG9yIHRoZSBCU0QgMi1DbGF1c2UgTGljZW5zZSBwcm92aWRlZCBiZWxvdy4gIFlvdSBoYXZlIHRoZQorICogb3B0aW9uIHRvIGxpY2Vuc2UgdGhpcyBzb2Z0d2FyZSB1bmRlciB0aGUgY29tcGxldGUgdGVybXMgb2YgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogVGhlIEJTRCAyLUNsYXVzZSBMaWNlbnNlOgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworLyoKKyAqIG5mcF9uZXRfb2ZmbG9hZC5jCisgKiBOZXRyb25vbWUgbmV0d29yayBkZXZpY2UgZHJpdmVyOiBUQyBvZmZsb2FkIGZ1bmN0aW9ucyBmb3IgUEYgYW5kIFZGCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgPG5ldC9wa3RfY2xzLmg+CisjaW5jbHVkZSA8bmV0L3RjX2FjdC90Y19nYWN0Lmg+CisjaW5jbHVkZSA8bmV0L3RjX2FjdC90Y19taXJyZWQuaD4KKworI2luY2x1ZGUgIm5mcF9icGYuaCIKKyNpbmNsdWRlICJuZnBfbmV0X2N0cmwuaCIKKyNpbmNsdWRlICJuZnBfbmV0LmgiCisKK3ZvaWQgbmZwX25ldF9maWx0ZXJfc3RhdHNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZnBfbmV0ICpubiA9ICh2b2lkICopZGF0YTsKKwlzdHJ1Y3QgbmZwX3N0YXRfcGFpciBsYXRlc3Q7CisKKwlzcGluX2xvY2tfYmgoJm5uLT5yeF9maWx0ZXJfbG9jayk7CisKKwlpZiAobm4tPmN0cmwgJiBORlBfTkVUX0NGR19DVFJMX0JQRikKKwkJbW9kX3RpbWVyKCZubi0+cnhfZmlsdGVyX3N0YXRzX3RpbWVyLAorCQkJICBqaWZmaWVzICsgTkZQX05FVF9TVEFUX1BPTExfSVZMKTsKKworCXNwaW5fdW5sb2NrX2JoKCZubi0+cnhfZmlsdGVyX2xvY2spOworCisJbGF0ZXN0LnBrdHMgPSBubl9yZWFkcShubiwgTkZQX05FVF9DRkdfU1RBVFNfQVBQMV9GUkFNRVMpOworCWxhdGVzdC5ieXRlcyA9IG5uX3JlYWRxKG5uLCBORlBfTkVUX0NGR19TVEFUU19BUFAxX0JZVEVTKTsKKworCWlmIChsYXRlc3QucGt0cyAhPSBubi0+cnhfZmlsdGVyLnBrdHMpCisJCW5uLT5yeF9maWx0ZXJfY2hhbmdlID0gamlmZmllczsKKworCW5uLT5yeF9maWx0ZXIgPSBsYXRlc3Q7Cit9CisKK3N0YXRpYyB2b2lkIG5mcF9uZXRfYnBmX3N0YXRzX3Jlc2V0KHN0cnVjdCBuZnBfbmV0ICpubikKK3sKKwlubi0+cnhfZmlsdGVyLnBrdHMgPSBubl9yZWFkcShubiwgTkZQX05FVF9DRkdfU1RBVFNfQVBQMV9GUkFNRVMpOworCW5uLT5yeF9maWx0ZXIuYnl0ZXMgPSBubl9yZWFkcShubiwgTkZQX05FVF9DRkdfU1RBVFNfQVBQMV9CWVRFUyk7CisJbm4tPnJ4X2ZpbHRlcl9wcmV2ID0gbm4tPnJ4X2ZpbHRlcjsKKwlubi0+cnhfZmlsdGVyX2NoYW5nZSA9IGppZmZpZXM7Cit9CisKK3N0YXRpYyBpbnQKK25mcF9uZXRfYnBmX3N0YXRzX3VwZGF0ZShzdHJ1Y3QgbmZwX25ldCAqbm4sIHN0cnVjdCB0Y19jbHNfYnBmX29mZmxvYWQgKmNsc19icGYpCit7CisJc3RydWN0IHRjX2FjdGlvbiAqYTsKKwlMSVNUX0hFQUQoYWN0aW9ucyk7CisJdTY0IGJ5dGVzLCBwa3RzOworCisJcGt0cyA9IG5uLT5yeF9maWx0ZXIucGt0cyAtIG5uLT5yeF9maWx0ZXJfcHJldi5wa3RzOworCWJ5dGVzID0gbm4tPnJ4X2ZpbHRlci5ieXRlcyAtIG5uLT5yeF9maWx0ZXJfcHJldi5ieXRlczsKKwlieXRlcyAtPSBwa3RzICogRVRIX0hMRU47CisKKwlubi0+cnhfZmlsdGVyX3ByZXYgPSBubi0+cnhfZmlsdGVyOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwl0Y2ZfZXh0c190b19saXN0KGNsc19icGYtPmV4dHMsICZhY3Rpb25zKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGEsICZhY3Rpb25zLCBsaXN0KQorCQl0Y2ZfYWN0aW9uX3N0YXRzX3VwZGF0ZShhLCBieXRlcywgcGt0cywgbm4tPnJ4X2ZpbHRlcl9jaGFuZ2UpOworCisJcHJlZW1wdF9lbmFibGUoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CituZnBfbmV0X2JwZl9nZXRfYWN0KHN0cnVjdCBuZnBfbmV0ICpubiwgc3RydWN0IHRjX2Nsc19icGZfb2ZmbG9hZCAqY2xzX2JwZikKK3sKKwljb25zdCBzdHJ1Y3QgdGNfYWN0aW9uICphOworCUxJU1RfSEVBRChhY3Rpb25zKTsKKworCS8qIFRDIGRpcmVjdCBhY3Rpb24gKi8KKwlpZiAoY2xzX2JwZi0+ZXh0c19pbnRlZ3JhdGVkKSB7CisJCWlmICh0Y19ub19hY3Rpb25zKGNsc19icGYtPmV4dHMpKQorCQkJcmV0dXJuIE5OX0FDVF9ESVJFQ1Q7CisKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwkvKiBUQyBsZWdhY3kgbW9kZSAqLworCWlmICghdGNfc2luZ2xlX2FjdGlvbihjbHNfYnBmLT5leHRzKSkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCXRjZl9leHRzX3RvX2xpc3QoY2xzX2JwZi0+ZXh0cywgJmFjdGlvbnMpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYSwgJmFjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKGlzX3RjZl9nYWN0X3Nob3QoYSkpCisJCQlyZXR1cm4gTk5fQUNUX1RDX0RST1A7CisKKwkJaWYgKGlzX3RjZl9taXJyZWRfcmVkaXJlY3QoYSkgJiYKKwkJICAgIHRjZl9taXJyZWRfaWZpbmRleChhKSA9PSBubi0+bmV0ZGV2LT5pZmluZGV4KQorCQkJcmV0dXJuIE5OX0FDVF9UQ19SRURJUjsKKwl9CisKKwlyZXR1cm4gLUVOT1RTVVBQOworfQorCitzdGF0aWMgaW50CituZnBfbmV0X2JwZl9vZmZsb2FkX3ByZXBhcmUoc3RydWN0IG5mcF9uZXQgKm5uLAorCQkJICAgIHN0cnVjdCB0Y19jbHNfYnBmX29mZmxvYWQgKmNsc19icGYsCisJCQkgICAgc3RydWN0IG5mcF9icGZfcmVzdWx0ICpyZXMsCisJCQkgICAgdm9pZCAqKmNvZGUsIGRtYV9hZGRyX3QgKmRtYV9hZGRyLCB1MTYgbWF4X2luc3RyKQoreworCXVuc2lnbmVkIGludCBjb2RlX3N6ID0gbWF4X2luc3RyICogc2l6ZW9mKHU2NCk7CisJZW51bSBuZnBfYnBmX2FjdGlvbl90eXBlIGFjdDsKKwl1MTYgc3RhcnRfb2ZmLCBkb25lX29mZjsKKwl1bnNpZ25lZCBpbnQgbWF4X210dTsKKwlpbnQgcmV0OworCisJaWYgKCFJU19FTkFCTEVEKENPTkZJR19CUEZfU1lTQ0FMTCkpCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlyZXQgPSBuZnBfbmV0X2JwZl9nZXRfYWN0KG5uLCBjbHNfYnBmKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlhY3QgPSByZXQ7CisKKwltYXhfbXR1ID0gbm5fcmVhZGIobm4sIE5GUF9ORVRfQ0ZHX0JQRl9JTkxfTVRVKSAqIDY0IC0gMzI7CisJaWYgKG1heF9tdHUgPCBubi0+bmV0ZGV2LT5tdHUpIHsKKwkJbm5faW5mbyhubiwgIkJQRiBvZmZsb2FkIG5vdCBzdXBwb3J0ZWQgd2l0aCBNVFUgbGFyZ2VyIHRoYW4gSFcgcGFja2V0IHNwbGl0IGJvdW5kYXJ5XG4iKTsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwlzdGFydF9vZmYgPSBubl9yZWFkdyhubiwgTkZQX05FVF9DRkdfQlBGX1NUQVJUKTsKKwlkb25lX29mZiA9IG5uX3JlYWR3KG5uLCBORlBfTkVUX0NGR19CUEZfRE9ORSk7CisKKwkqY29kZSA9IGRtYV96YWxsb2NfY29oZXJlbnQoJm5uLT5wZGV2LT5kZXYsIGNvZGVfc3osIGRtYV9hZGRyLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoISpjb2RlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IG5mcF9icGZfaml0KGNsc19icGYtPnByb2csICpjb2RlLCBhY3QsIHN0YXJ0X29mZiwgZG9uZV9vZmYsCisJCQkgIG1heF9pbnN0ciwgcmVzKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldHVybiAwOworCitvdXQ6CisJZG1hX2ZyZWVfY29oZXJlbnQoJm5uLT5wZGV2LT5kZXYsIGNvZGVfc3osICpjb2RlLCAqZG1hX2FkZHIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCituZnBfbmV0X2JwZl9sb2FkX2FuZF9zdGFydChzdHJ1Y3QgbmZwX25ldCAqbm4sIHUzMiB0Y19mbGFncywKKwkJCSAgIHZvaWQgKmNvZGUsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJCQkgICB1bnNpZ25lZCBpbnQgY29kZV9zeiwgdW5zaWduZWQgaW50IG5faW5zdHIsCisJCQkgICBib29sIGRlbnNlX21vZGUpCit7CisJdTY0IGJwZl9hZGRyID0gZG1hX2FkZHI7CisJaW50IGVycjsKKworCW5uLT5icGZfb2ZmbG9hZF9za2lwX3N3ID0gISEodGNfZmxhZ3MgJiBUQ0FfQ0xTX0ZMQUdTX1NLSVBfU1cpOworCisJaWYgKGRlbnNlX21vZGUpCisJCWJwZl9hZGRyIHw9IE5GUF9ORVRfQ0ZHX0JQRl9DRkdfOENUWDsKKworCW5uX3dyaXRldyhubiwgTkZQX05FVF9DRkdfQlBGX1NJWkUsIG5faW5zdHIpOworCW5uX3dyaXRlcShubiwgTkZQX05FVF9DRkdfQlBGX0FERFIsIGJwZl9hZGRyKTsKKworCS8qIExvYWQgdXAgdGhlIEpJVGVkIGNvZGUgKi8KKwllcnIgPSBuZnBfbmV0X3JlY29uZmlnKG5uLCBORlBfTkVUX0NGR19VUERBVEVfQlBGKTsKKwlpZiAoZXJyKQorCQlubl9lcnIobm4sICJGVyBjb21tYW5kIGVycm9yIHdoaWxlIGxvYWRpbmcgQlBGOiAlZFxuIiwgZXJyKTsKKworCS8qIEVuYWJsZSBwYXNzaW5nIHBhY2tldHMgdGhyb3VnaCBCUEYgZnVuY3Rpb24gKi8KKwlubi0+Y3RybCB8PSBORlBfTkVUX0NGR19DVFJMX0JQRjsKKwlubl93cml0ZWwobm4sIE5GUF9ORVRfQ0ZHX0NUUkwsIG5uLT5jdHJsKTsKKwllcnIgPSBuZnBfbmV0X3JlY29uZmlnKG5uLCBORlBfTkVUX0NGR19VUERBVEVfR0VOKTsKKwlpZiAoZXJyKQorCQlubl9lcnIobm4sICJGVyBjb21tYW5kIGVycm9yIHdoaWxlIGVuYWJsaW5nIEJQRjogJWRcbiIsIGVycik7CisKKwlkbWFfZnJlZV9jb2hlcmVudCgmbm4tPnBkZXYtPmRldiwgY29kZV9zeiwgY29kZSwgZG1hX2FkZHIpOworCisJbmZwX25ldF9icGZfc3RhdHNfcmVzZXQobm4pOworCW1vZF90aW1lcigmbm4tPnJ4X2ZpbHRlcl9zdGF0c190aW1lciwgamlmZmllcyArIE5GUF9ORVRfU1RBVF9QT0xMX0lWTCk7Cit9CisKK3N0YXRpYyBpbnQgbmZwX25ldF9icGZfc3RvcChzdHJ1Y3QgbmZwX25ldCAqbm4pCit7CisJaWYgKCEobm4tPmN0cmwgJiBORlBfTkVUX0NGR19DVFJMX0JQRikpCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2JoKCZubi0+cnhfZmlsdGVyX2xvY2spOworCW5uLT5jdHJsICY9IH5ORlBfTkVUX0NGR19DVFJMX0JQRjsKKwlzcGluX3VubG9ja19iaCgmbm4tPnJ4X2ZpbHRlcl9sb2NrKTsKKwlubl93cml0ZWwobm4sIE5GUF9ORVRfQ0ZHX0NUUkwsIG5uLT5jdHJsKTsKKworCWRlbF90aW1lcl9zeW5jKCZubi0+cnhfZmlsdGVyX3N0YXRzX3RpbWVyKTsKKwlubi0+YnBmX29mZmxvYWRfc2tpcF9zdyA9IDA7CisKKwlyZXR1cm4gbmZwX25ldF9yZWNvbmZpZyhubiwgTkZQX05FVF9DRkdfVVBEQVRFX0dFTik7Cit9CisKK2ludAorbmZwX25ldF9icGZfb2ZmbG9hZChzdHJ1Y3QgbmZwX25ldCAqbm4sIHUzMiBoYW5kbGUsIF9fYmUxNiBwcm90bywKKwkJICAgIHN0cnVjdCB0Y19jbHNfYnBmX29mZmxvYWQgKmNsc19icGYpCit7CisJc3RydWN0IG5mcF9icGZfcmVzdWx0IHJlczsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCXUxNiBtYXhfaW5zdHI7CisJdm9pZCAqY29kZTsKKwlpbnQgZXJyOworCisJbWF4X2luc3RyID0gbm5fcmVhZHcobm4sIE5GUF9ORVRfQ0ZHX0JQRl9NQVhfTEVOKTsKKworCXN3aXRjaCAoY2xzX2JwZi0+Y29tbWFuZCkgeworCWNhc2UgVENfQ0xTQlBGX1JFUExBQ0U6CisJCS8qIFRoZXJlIGlzIG5vdGhpbmcgc3RvcHBpbmcgdXMgZnJvbSBpbXBsZW1lbnRpbmcgc2VhbWxlc3MKKwkJICogcmVwbGFjZSBidXQgdGhlIHNpbXBsZSBtZXRob2Qgb2YgbG9hZGluZyBJIGFkb3B0ZWQgaW4KKwkJICogdGhlIGZpcm13YXJlIGRvZXMgbm90IGhhbmRsZSBhdG9taWMgcmVwbGFjZSAoaS5lLiB3ZSBoYXZlIHRvCisJCSAqIHN0b3AgdGhlIEJQRiBvZmZsb2FkIGFuZCByZS1lbmFibGUgaXQpLiAgTGVha2luZy1pbiBhIGZldworCQkgKiBmcmFtZXMgd2hpY2ggZGlkbid0IGhhdmUgQlBGIGFwcGxpZWQgaW4gdGhlIGhhcmR3YXJlIHNob3VsZAorCQkgKiBiZSBmaW5lIGlmIHNvZnR3YXJlIGZhbGxiYWNrIGlzIGF2YWlsYWJsZSwgdGhvdWdoLgorCQkgKi8KKwkJaWYgKG5uLT5icGZfb2ZmbG9hZF9za2lwX3N3KQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQllcnIgPSBuZnBfbmV0X2JwZl9vZmZsb2FkX3ByZXBhcmUobm4sIGNsc19icGYsICZyZXMsICZjb2RlLAorCQkJCQkJICAmZG1hX2FkZHIsIG1heF9pbnN0cik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCW5mcF9uZXRfYnBmX3N0b3Aobm4pOworCQluZnBfbmV0X2JwZl9sb2FkX2FuZF9zdGFydChubiwgY2xzX2JwZi0+Z2VuX2ZsYWdzLCBjb2RlLAorCQkJCQkgICBkbWFfYWRkciwgbWF4X2luc3RyICogc2l6ZW9mKHU2NCksCisJCQkJCSAgIHJlcy5uX2luc3RyLCByZXMuZGVuc2VfbW9kZSk7CisJCXJldHVybiAwOworCisJY2FzZSBUQ19DTFNCUEZfQUREOgorCQlpZiAobm4tPmN0cmwgJiBORlBfTkVUX0NGR19DVFJMX0JQRikKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJZXJyID0gbmZwX25ldF9icGZfb2ZmbG9hZF9wcmVwYXJlKG5uLCBjbHNfYnBmLCAmcmVzLCAmY29kZSwKKwkJCQkJCSAgJmRtYV9hZGRyLCBtYXhfaW5zdHIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQluZnBfbmV0X2JwZl9sb2FkX2FuZF9zdGFydChubiwgY2xzX2JwZi0+Z2VuX2ZsYWdzLCBjb2RlLAorCQkJCQkgICBkbWFfYWRkciwgbWF4X2luc3RyICogc2l6ZW9mKHU2NCksCisJCQkJCSAgIHJlcy5uX2luc3RyLCByZXMuZGVuc2VfbW9kZSk7CisJCXJldHVybiAwOworCisJY2FzZSBUQ19DTFNCUEZfREVTVFJPWToKKwkJcmV0dXJuIG5mcF9uZXRfYnBmX3N0b3Aobm4pOworCisJY2FzZSBUQ19DTFNCUEZfU1RBVFM6CisJCXJldHVybiBuZnBfbmV0X2JwZl9zdGF0c191cGRhdGUobm4sIGNsc19icGYpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9uZXR2Zl9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9uZXR2Zl9tYWluLmMKaW5kZXggMzdhYmVmMC4uMjgwMGJiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0dmZfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX25ldHZmX21haW4uYwpAQCAtMzgsNyArMzgsNiBAQAogICogICAgICAgICBSb2xmIE5ldWdlYmF1ZXIgPHJvbGYubmV1Z2ViYXVlckBuZXRyb25vbWUuY29tPgogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTM0LDcgKzEzMyw3IEBACiAJfQogCiAJbmZwX25ldF9nZXRfZndfdmVyc2lvbigmZndfdmVyLCBjdHJsX2Jhcik7Ci0JaWYgKGZ3X3Zlci5jbGFzcyAhPSBORlBfTkVUX0NGR19WRVJTSU9OX0NMQVNTX0dFTkVSSUMpIHsKKwlpZiAoZndfdmVyLnJlc3YgfHwgZndfdmVyLmNsYXNzICE9IE5GUF9ORVRfQ0ZHX1ZFUlNJT05fQ0xBU1NfR0VORVJJQykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmtub3duIEZpcm13YXJlIEFCSSAlZC4lZC4lZC4lZFxuIiwKIAkJCWZ3X3Zlci5yZXN2LCBmd192ZXIuY2xhc3MsIGZ3X3Zlci5tYWpvciwgZndfdmVyLm1pbm9yKTsKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTE0MiwxNiArMTQxLDE0IEBACiAJfQogCiAJLyogRGV0ZXJtaW5lIHN0cmlkZSAqLwotCWlmIChuZnBfbmV0X2Z3X3Zlcl9lcSgmZndfdmVyLCAwLCAwLCAwLCAwKSB8fAotCSAgICBuZnBfbmV0X2Z3X3Zlcl9lcSgmZndfdmVyLCAwLCAwLCAwLCAxKSB8fAotCSAgICBuZnBfbmV0X2Z3X3Zlcl9lcSgmZndfdmVyLCAwLCAwLCAweDEyLCAweDQ4KSkgeworCWlmIChuZnBfbmV0X2Z3X3Zlcl9lcSgmZndfdmVyLCAwLCAwLCAwLCAxKSkgewogCQlzdHJpZGUgPSAyOwogCQl0eF9iYXJfbm8gPSBORlBfTkVUX1EwX0JBUjsKIAkJcnhfYmFyX25vID0gTkZQX05FVF9RMV9CQVI7CiAJCWRldl93YXJuKCZwZGV2LT5kZXYsICJPQlNPTEVURSBGaXJtd2FyZSBkZXRlY3RlZCAtIFZGIGlzb2xhdGlvbiBub3QgYXZhaWxhYmxlXG4iKTsKIAl9IGVsc2UgewogCQlzd2l0Y2ggKGZ3X3Zlci5tYWpvcikgewotCQljYXNlIDEgLi4uIDM6CisJCWNhc2UgMSAuLi4gNDoKIAkJCWlmIChpc19uZnAzMjAwKSB7CiAJCQkJc3RyaWRlID0gMjsKIAkJCQl0eF9iYXJfbm8gPSBORlBfTkVUX1EwX0JBUjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L251dm90b24vdzkwcDkxMF9ldGhlci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbnV2b3Rvbi93OTBwOTEwX2V0aGVyLmMKaW5kZXggODdiN2I4MS4uNzEyZDhiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbnV2b3Rvbi93OTBwOTEwX2V0aGVyLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbnV2b3Rvbi93OTBwOTEwX2V0aGVyLmMKQEAgLTc1MSw3ICs3NTEsNyBAQAogCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgInJ4IGNyYyBlcnJcbiIpOwogCQkJCWV0aGVyLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFJYRFNfQUxJRSkgewotCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgInJ4IGFsaWdtZW50IGVyclxuIik7CisJCQkJZGV2X2VycigmcGRldi0+ZGV2LCAicnggYWxpZ25tZW50IGVyclxuIik7CiAJCQkJZXRoZXItPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBSWERTX1BUTEUpIHsKIAkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyeCBsb25nZXIgZXJyXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L254cC9scGNfZXRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9ueHAvbHBjX2V0aC5jCmluZGV4IDRkNGVjYmEuLjhlMTNlYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L254cC9scGNfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbnhwL2xwY19ldGguYwpAQCAtNDc1LDE0ICs0NzUsNiBAQAogCW1hY1s1XSA9IHRtcCA+PiA4OwogfQogCi1zdGF0aWMgdm9pZCBfX2xwY19ldGhfY2xvY2tfZW5hYmxlKHN0cnVjdCBuZXRkYXRhX2xvY2FsICpwbGRhdCwgYm9vbCBlbmFibGUpCi17Ci0JaWYgKGVuYWJsZSkKLQkJY2xrX3ByZXBhcmVfZW5hYmxlKHBsZGF0LT5jbGspOwotCWVsc2UKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBsZGF0LT5jbGspOwotfQotCiBzdGF0aWMgdm9pZCBfX2xwY19wYXJhbXNfc2V0dXAoc3RydWN0IG5ldGRhdGFfbG9jYWwgKnBsZGF0KQogewogCXUzMiB0bXA7CkBAIC0xMDU2LDcgKzEwNDgsNyBAQAogCXdyaXRlbCgwLCBMUENfRU5FVF9NQUMyKHBsZGF0LT5uZXRfYmFzZSkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBsZGF0LT5sb2NrLCBmbGFncyk7CiAKLQlfX2xwY19ldGhfY2xvY2tfZW5hYmxlKHBsZGF0LCBmYWxzZSk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBsZGF0LT5jbGspOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTk3LDExICsxMTg5LDE0IEBACiBzdGF0aWMgaW50IGxwY19ldGhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3QgbmV0ZGF0YV9sb2NhbCAqcGxkYXQgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgcmV0OwogCiAJaWYgKG5ldGlmX21zZ19pZnVwKHBsZGF0KSkKIAkJZGV2X2RiZygmcGxkYXQtPnBkZXYtPmRldiwgImVuYWJsaW5nICVzXG4iLCBuZGV2LT5uYW1lKTsKIAotCV9fbHBjX2V0aF9jbG9ja19lbmFibGUocGxkYXQsIHRydWUpOworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwbGRhdC0+Y2xrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJLyogU3VzcGVuZGVkIFBIWSBtYWtlcyBMUEMgZXRoZXJuZXQgY29yZSBibG9jaywgc28gcmVzdW1lIG5vdyAqLwogCXBoeV9yZXN1bWUobmRldi0+cGh5ZGV2KTsKQEAgLTEzMjAsNyArMTMxNSw5IEBACiAJfQogCiAJLyogRW5hYmxlIG5ldHdvcmsgY2xvY2sgKi8KLQlfX2xwY19ldGhfY2xvY2tfZW5hYmxlKHBsZGF0LCB0cnVlKTsKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocGxkYXQtPmNsayk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfb3V0X2Nsa19wdXQ7CiAKIAkvKiBNYXAgSU8gc3BhY2UgKi8KIAlwbGRhdC0+bmV0X2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CkBAIC0xNDU0LDYgKzE0NTEsNyBAQAogCWlvdW5tYXAocGxkYXQtPm5ldF9iYXNlKTsKIGVycl9vdXRfZGlzYWJsZV9jbG9ja3M6CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBsZGF0LT5jbGspOworZXJyX291dF9jbGtfcHV0OgogCWNsa19wdXQocGxkYXQtPmNsayk7CiBlcnJfb3V0X2ZyZWVfZGV2OgogCWZyZWVfbmV0ZGV2KG5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvS2NvbmZpZwppbmRleCA2YmE0ODQwLi4wZGYxMzkxZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9LY29uZmlnCkBAIC04OCw2ICs4OCw5IEBACiAJLS0taGVscC0tLQogCSAgVGhpcyBlbmFibGVzIHRoZSBzdXBwb3J0IGZvciAuLi4KIAorY29uZmlnIFFFRF9MTDIKKwlib29sCisKIGNvbmZpZyBRRURfU1JJT1YKIAlib29sICJRTG9naWMgUUVEIDI1LzQwLzEwMEdiIFNSLUlPViBzdXBwb3J0IgogCWRlcGVuZHMgb24gUUVEICYmIFBDSV9JT1YKQEAgLTEwNCw0ICsxMDcsMTUgQEAKIAktLS1oZWxwLS0tCiAJICBUaGlzIGVuYWJsZXMgdGhlIHN1cHBvcnQgZm9yIC4uLgogCitjb25maWcgSU5GSU5JQkFORF9RRURSCisJdHJpc3RhdGUgIlFMb2dpYyBxZWRlIFJvQ0Ugc291cmNlcyBbZGVidWddIgorCWRlcGVuZHMgb24gUUVERSAmJiA2NEJJVAorCXNlbGVjdCBRRURfTEwyCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCSAgVGhpcyBwcm92aWRlcyBhIHRlbXBvcmFyeSBub2RlIHRoYXQgYWxsb3dzIHRoZSBjb21waWxhdGlvbgorCSAgYW5kIGxvZ2ljYWwgdGVzdGluZyBvZiB0aGUgSW5maW5pQmFuZCBvdmVyIEV0aGVybmV0IHN1cHBvcnQKKwkgIGZvciBRTG9naWMgUUVELiBUaGlzIHdvdWxkIGJlIHJlcGxhY2VkIGJ5IHRoZSAncmVhbCcgb3B0aW9uCisJICBvbmNlIHRoZSBRRURSIGRyaXZlciBpcyBhZGRlZCBbK3JlbG9jYXRlZF0uCisKIGVuZGlmICMgTkVUX1ZFTkRPUl9RTE9HSUMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL01ha2VmaWxlCmluZGV4IGQxZjE1N2UuLmNkYTBhZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9NYWtlZmlsZQpAQCAtMiw1ICsyLDcgQEAKIAogcWVkLXkgOj0gcWVkX2N4dC5vIHFlZF9kZXYubyBxZWRfaHcubyBxZWRfaW5pdF9md19mdW5jcy5vIHFlZF9pbml0X29wcy5vIFwKIAkgcWVkX2ludC5vIHFlZF9tYWluLm8gcWVkX21jcC5vIHFlZF9zcF9jb21tYW5kcy5vIHFlZF9zcHEubyBxZWRfbDIubyBcCi0JIHFlZF9zZWxmdGVzdC5vIHFlZF9kY2J4Lm8KKwkgcWVkX3NlbGZ0ZXN0Lm8gcWVkX2RjYngubyBxZWRfZGVidWcubwogcWVkLSQoQ09ORklHX1FFRF9TUklPVikgKz0gcWVkX3NyaW92Lm8gcWVkX3ZmLm8KK3FlZC0kKENPTkZJR19RRURfTEwyKSArPSBxZWRfbGwyLm8KK3FlZC0kKENPTkZJR19JTkZJTklCQU5EX1FFRFIpICs9IHFlZF9yb2NlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZC5oCmluZGV4IDM1ZTUzNzcuLjY1M2JiNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWQuaApAQCAtMjMsMTAgKzIzLDExIEBACiAjaW5jbHVkZSA8bGludXgvemxpYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2h0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3FlZC9xZWRfaWYuaD4KKyNpbmNsdWRlICJxZWRfZGVidWcuaCIKICNpbmNsdWRlICJxZWRfaHNpLmgiCiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgcWVkX2NvbW1vbl9vcHMgcWVkX2NvbW1vbl9vcHNfcGFzczsKLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OICI4LjcuMS4yMCIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OICI4LjEwLjkuMjAiCiAKICNkZWZpbmUgTUFYX0hXRk5TX1BFUl9ERVZJQ0UgICAgKDQpCiAjZGVmaW5lIE5BTUVfU0laRSAxNgpAQCAtMzQsNiArMzUsOSBAQAogCiAjZGVmaW5lIFFFRF9XRlFfVU5JVAkxMDAKIAorI2RlZmluZSBRRURfV0lEX1NJWkUgICAgICAgICAgICAoMTAyNCkKKyNkZWZpbmUgUUVEX1BGX0RFTVNfU0laRSAgICAgICAgKDQpCisKIC8qIGNhdSBzdGF0ZXMgKi8KIGVudW0gcWVkX2NvYWxlc2NpbmdfbW9kZSB7CiAJUUVEX0NPQUxfTU9ERV9ESVNBQkxFLApAQCAtNDIsMTEgKzQ2LDIxIEBACiAKIHN0cnVjdCBxZWRfZXRoX2NiX29wczsKIHN0cnVjdCBxZWRfZGV2X2luZm87Cit1bmlvbiBxZWRfbWNwX3Byb3RvY29sX3N0YXRzOworZW51bSBxZWRfbWNwX3Byb3RvY29sX3R5cGU7CiAKIC8qIGhlbHBlcnMgKi8KIHN0YXRpYyBpbmxpbmUgdTMyIHFlZF9kYl9hZGRyKHUzMiBjaWQsIHUzMiBERU1TKQogewogCXUzMiBkYl9hZGRyID0gRklFTERfVkFMVUUoREJfTEVHQUNZX0FERFJfREVNUywgREVNUykgfAorCQkgICAgICAoY2lkICogUUVEX1BGX0RFTVNfU0laRSk7CisKKwlyZXR1cm4gZGJfYWRkcjsKK30KKworc3RhdGljIGlubGluZSB1MzIgcWVkX2RiX2FkZHJfdmYodTMyIGNpZCwgdTMyIERFTVMpCit7CisJdTMyIGRiX2FkZHIgPSBGSUVMRF9WQUxVRShEQl9MRUdBQ1lfQUREUl9ERU1TLCBERU1TKSB8CiAJCSAgICAgIEZJRUxEX1ZBTFVFKERCX0xFR0FDWV9BRERSX0lDSUQsIGNpZCk7CiAKIAlyZXR1cm4gZGJfYWRkcjsKQEAgLTY5LDYgKzgzLDcgQEAKIHN0cnVjdCBxZWRfc2JfYXR0bl9pbmZvOwogc3RydWN0IHFlZF9jeHRfbW5ncjsKIHN0cnVjdCBxZWRfc2Jfc3BfaW5mbzsKK3N0cnVjdCBxZWRfbGwyX2luZm87CiBzdHJ1Y3QgcWVkX21jcF9pbmZvOwogCiBzdHJ1Y3QgcWVkX3J0X2RhdGEgewpAQCAtMTQ4LDEzICsxNjMsMTcgQEAKIAlRRURfUkwsCiAJUUVEX01BQywKIAlRRURfVkxBTiwKKwlRRURfUkRNQV9DTlFfUkFNLAogCVFFRF9JTFQsCisJUUVEX0xMMl9RVUVVRSwKKwlRRURfUkRNQV9TVEFUU19RVUVVRSwKIAlRRURfTUFYX1JFU0MsCiB9OwogCiBlbnVtIFFFRF9GRUFUVVJFIHsKIAlRRURfUEZfTDJfUVVFLAogCVFFRF9WRiwKKwlRRURfUkRNQV9DTlEsCiAJUUVEX01BWF9GRUFUVVJFUywKIH07CiAKQEAgLTM1Nyw2ICszNzYsOSBAQAogCXN0cnVjdCBxZWRfc2JfYXR0bl9pbmZvCQkqcF9zYl9hdHRuOwogCiAJLyogUHJvdG9jb2wgcmVsYXRlZCAqLworCWJvb2wJCQkJdXNpbmdfbGwyOworCXN0cnVjdCBxZWRfbGwyX2luZm8JCSpwX2xsMl9pbmZvOworCXN0cnVjdCBxZWRfcmRtYV9pbmZvCQkqcF9yZG1hX2luZm87CiAJc3RydWN0IHFlZF9wZl9wYXJhbXMJCXBmX3BhcmFtczsKIAogCWJvb2wgYl9yZG1hX2VuYWJsZWRfaW5fcHJzOwpAQCAtMzkzLDYgKzQxNSwxOSBAQAogCS8qIEJ1ZmZlciBmb3IgdW56aXBwaW5nIGZpcm13YXJlIGRhdGEgKi8KIAl2b2lkCQkJCSp1bnppcF9idWY7CiAKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEJCWRiZ19pbmZvOworCisJLyogUFdNIHJlZ2lvbiBzcGVjaWZpYyBkYXRhICovCisJdTMyCQkJCWRwaV9zaXplOworCXUzMgkJCQlkcGlfY291bnQ7CisKKwkvKiBUaGlzIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBkb29yYmVsbCBhZGRyZXNzICovCisJdTMyIGRwaV9zdGFydF9vZmZzZXQ7CisKKwkvKiBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyBzZXQgdGhlbiBFRFBNIHNob3VsZG4ndCBiZSB1c2VkICovCisJdTggZGNieF9ub19lZHBtOworCXU4IGRiX2Jhcl9ub19lZHBtOworCiAJc3RydWN0IHFlZF9zaW1kX2ZwX2hhbmRsZXIJc2ltZF9wcm90b19oYW5kbGVyWzY0XTsKIAogI2lmZGVmIENPTkZJR19RRURfU1JJT1YKQEAgLTQwMiw2ICs0MzcsNyBAQAogI2VuZGlmCiAKIAlzdHJ1Y3Qgel9zdHJlYW1fcwkJKnN0cmVhbTsKKwlzdHJ1Y3QgcWVkX3JvY2VfbGwyX2luZm8JKmxsMjsKIH07CiAKIHN0cnVjdCBwY2lfcGFyYW1zIHsKQEAgLTQyNiw2ICs0NjIsMjEgQEAKIAlib29sCQkJZnBfaW5pdGlhbGl6ZWQ7CiAJdTgJCQlmcF9tc2l4X2Jhc2U7CiAJdTgJCQlmcF9tc2l4X2NudDsKKwl1OAkJCXJkbWFfbXNpeF9iYXNlOworCXU4CQkJcmRtYV9tc2l4X2NudDsKK307CisKK3N0cnVjdCBxZWRfZGJnX2ZlYXR1cmUgeworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwl1OCAqZHVtcF9idWY7CisJdTMyIGJ1Zl9zaXplOworCXUzMiBkdW1wZWRfZHdvcmRzOworfTsKKworc3RydWN0IHFlZF9kYmdfcGFyYW1zIHsKKwlzdHJ1Y3QgcWVkX2RiZ19mZWF0dXJlIGZlYXR1cmVzW0RCR19GRUFUVVJFX05VTV07CisJdTggZW5naW5lX2Zvcl9kZWJ1ZzsKKwlib29sIHByaW50X2RhdGE7CiB9OwogCiBzdHJ1Y3QgcWVkX2RldiB7CkBAIC00NDIsNiArNDkzLDggQEAKIAkJCQkgQ0hJUF9SRVZfSVNfQTAoZGV2KSkKICNkZWZpbmUgUUVEX0lTX0JCX0IwKGRldikgICAgICAgKFFFRF9JU19CQihkZXYpICYmIFwKIAkJCQkgQ0hJUF9SRVZfSVNfQjAoZGV2KSkKKyNkZWZpbmUgUUVEX0lTX0FIKGRldikgICgoZGV2KS0+dHlwZSA9PSBRRURfREVWX1RZUEVfQUgpCisjZGVmaW5lIFFFRF9JU19LMihkZXYpICBRRURfSVNfQUgoZGV2KQogCiAjZGVmaW5lIFFFRF9HRVRfVFlQRShkZXYpICAgICAgIChRRURfSVNfQkJfQTAoZGV2KSA/IENISVBfQkJfQTAgOiBcCiAJCQkJIFFFRF9JU19CQl9CMChkZXYpID8gQ0hJUF9CQl9CMCA6IENISVBfSzIpCkBAIC01MTcsNyArNTcwLDYgQEAKIAogCWJvb2wJCQkJYl9pc192ZjsKIAl1MzIJCQkJZHJ2X3R5cGU7Ci0KIAlzdHJ1Y3QgcWVkX2V0aF9zdGF0cwkJKnJlc2V0X3N0YXRzOwogCXN0cnVjdCBxZWRfZndfZGF0YQkJKmZ3X2RhdGE7CiAKQEAgLTU0Miw3ICs1OTQsMTggQEAKIAl9IHByb3RvY29sX29wczsKIAl2b2lkCQkJCSpvcHNfY29va2llOwogCisJc3RydWN0IHFlZF9kYmdfcGFyYW1zCQlkYmdfcGFyYW1zOworCisjaWZkZWYgQ09ORklHX1FFRF9MTDIKKwlzdHJ1Y3QgcWVkX2NiX2xsMl9pbmZvCQkqbGwyOworCXU4CQkJCWxsMl9tYWNfYWRkcmVzc1tFVEhfQUxFTl07CisjZW5kaWYKKwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZQkJKmZpcm13YXJlOworCisJdTMyIHJkbWFfbWF4X3NnZTsKKwl1MzIgcmRtYV9tYXhfaW5saW5lOworCXUzMiByZG1hX21heF9zcnFfc2dlOwogfTsKIAogI2RlZmluZSBOVU1fT0ZfVkZTKGRldikgICAgICAgICBNQVhfTlVNX1ZGU19CQgpAQCAtNTYxLDkgKzYyNCwxOCBAQAogc3RhdGljIGlubGluZSB1OCBxZWRfY29uY3JldGVfdG9fc3dfZmlkKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAogCQkJCQl1MzIgY29uY3JldGVfZmlkKQogeworCXU4IHZmaWQgPSBHRVRfRklFTEQoY29uY3JldGVfZmlkLCBQWFBfQ09OQ1JFVEVfRklEX1ZGSUQpOwogCXU4IHBmaWQgPSBHRVRfRklFTEQoY29uY3JldGVfZmlkLCBQWFBfQ09OQ1JFVEVfRklEX1BGSUQpOworCXU4IHZmX3ZhbGlkID0gR0VUX0ZJRUxEKGNvbmNyZXRlX2ZpZCwKKwkJCQlQWFBfQ09OQ1JFVEVfRklEX1ZGVkFMSUQpOworCXU4IHN3X2ZpZDsKIAotCXJldHVybiBwZmlkOworCWlmICh2Zl92YWxpZCkKKwkJc3dfZmlkID0gdmZpZCArIE1BWF9OVU1fUEZTOworCWVsc2UKKwkJc3dfZmlkID0gcGZpZDsKKworCXJldHVybiBzd19maWQ7CiB9CiAKICNkZWZpbmUgUFVSRV9MQl9UQyA4CkBAIC01OTcsNyArNjY5LDkgQEAKIHUzMiBxZWRfdW56aXBfZGF0YShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJICAgdTMyIGlucHV0X2xlbiwgdTggKmlucHV0X2J1ZiwKIAkJICAgdTMyIG1heF9zaXplLCB1OCAqdW56aXBfYnVmKTsKLQordm9pZCBxZWRfZ2V0X3Byb3RvY29sX3N0YXRzKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJICAgIGVudW0gcWVkX21jcF9wcm90b2NvbF90eXBlIHR5cGUsCisJCQkgICAgdW5pb24gcWVkX21jcF9wcm90b2NvbF9zdGF0cyAqc3RhdHMpOwogaW50IHFlZF9zbG93cGF0aF9pcnFfcmVxKHN0cnVjdCBxZWRfaHdmbiAqaHdmbik7CiAKICNlbmRpZiAvKiBfUUVEX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2N4dC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfY3h0LmMKaW5kZXggMWMzNWYzNy4uODIzNzBhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfY3h0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfY3h0LmMKQEAgLTQ4LDcgKzQ4LDEzIEBACiAjZGVmaW5lIFRNX0VMRU1fU0laRSAgICA0CiAKIC8qIElMVCBjb25zdGFudHMgKi8KKyNpZiBJU19FTkFCTEVEKENPTkZJR19JTkZJTklCQU5EX1FFRFIpCisvKiBGb3IgUm9DRSB3ZSBjb25maWd1cmUgdG8gNjRLIHRvIGNvdmVyIGZvciBSb0NFIG1heCB0YXNrcyAyNTZLIHB1cnBvc2UuICovCisjZGVmaW5lIElMVF9ERUZBVUxUX0hXX1BfU0laRQkJNAorI2Vsc2UKICNkZWZpbmUgSUxUX0RFRkFVTFRfSFdfUF9TSVpFCQkzCisjZW5kaWYKKwogI2RlZmluZSBJTFRfUEFHRV9JTl9CWVRFUyhod19wX3NpemUpCSgxVSA8PCAoKGh3X3Bfc2l6ZSkgKyAxMikpCiAjZGVmaW5lIElMVF9DRkdfUkVHKGNsaSwgcmVnKQlQU1dSUTJfUkVHXyAjIyBjbGkgIyMgXyAjIyByZWcgIyMgX1JUX09GRlNFVAogCkBAIC0zNzcsOSArMzgzLDggQEAKIAl9CiB9CiAKLXUzMiBxZWRfY3h0X2dldF9wcm90b19jaWRfY291bnQoc3RydWN0IHFlZF9od2ZuCQkqcF9od2ZuLAotCQkJCWVudW0gcHJvdG9jb2xfdHlwZQl0eXBlLAotCQkJCXUzMgkJCSp2Zl9jaWQpCit1MzIgcWVkX2N4dF9nZXRfcHJvdG9fY2lkX2NvdW50KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCWVudW0gcHJvdG9jb2xfdHlwZSB0eXBlLCB1MzIgKnZmX2NpZCkKIHsKIAlpZiAodmZfY2lkKQogCQkqdmZfY2lkID0gcF9od2ZuLT5wX2N4dF9tbmdyLT5jb25uX2NmZ1t0eXBlXS5jaWRzX3Blcl92ZjsKQEAgLTQwNSwxMCArNDEwLDEwIEBACiAJcmV0dXJuIGNudDsKIH0KIAotc3RhdGljIHZvaWQKLXFlZF9jeHRfc2V0X3Byb3RvX3RpZF9jb3VudChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgICBlbnVtIHByb3RvY29sX3R5cGUgcHJvdG8sCi0JCQkgICAgdTggc2VnLCB1OCBzZWdfdHlwZSwgdTMyIGNvdW50LCBib29sIGhhc19mbCkKK3N0YXRpYyB2b2lkIHFlZF9jeHRfc2V0X3Byb3RvX3RpZF9jb3VudChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJZW51bSBwcm90b2NvbF90eXBlIHByb3RvLAorCQkJCQl1OCBzZWcsCisJCQkJCXU4IHNlZ190eXBlLCB1MzIgY291bnQsIGJvb2wgaGFzX2ZsKQogewogCXN0cnVjdCBxZWRfY3h0X21uZ3IgKnBfbW5nciA9IHBfaHdmbi0+cF9jeHRfbW5ncjsKIAlzdHJ1Y3QgcWVkX3RpZF9zZWcgKnBfc2VnID0gJnBfbW5nci0+Y29ubl9jZmdbcHJvdG9dLnRpZF9zZWdbc2VnXTsKQEAgLTQyMCw4ICs0MjUsNyBAQAogCiBzdGF0aWMgdm9pZCBxZWRfaWx0X2NsaV9ibGtfZmlsbChzdHJ1Y3QgcWVkX2lsdF9jbGllbnRfY2ZnICpwX2NsaSwKIAkJCQkgc3RydWN0IHFlZF9pbHRfY2xpX2JsayAqcF9ibGssCi0JCQkJIHUzMiBzdGFydF9saW5lLCB1MzIgdG90YWxfc2l6ZSwKLQkJCQkgdTMyIGVsZW1fc2l6ZSkKKwkJCQkgdTMyIHN0YXJ0X2xpbmUsIHUzMiB0b3RhbF9zaXplLCB1MzIgZWxlbV9zaXplKQogewogCXUzMiBpbHRfc2l6ZSA9IElMVF9QQUdFX0lOX0JZVEVTKHBfY2xpLT5wX3NpemUudmFsKTsKIApAQCAtNDQ4LDggKzQ1Miw3IEBACiAJCXBfY2xpLT5maXJzdC52YWwgPSAqcF9saW5lOwogCiAJcF9jbGktPmFjdGl2ZSA9IHRydWU7Ci0JKnBfbGluZSArPSBESVZfUk9VTkRfVVAocF9ibGstPnRvdGFsX3NpemUsCi0JCQkJcF9ibGstPnJlYWxfc2l6ZV9pbl9wYWdlKTsKKwkqcF9saW5lICs9IERJVl9ST1VORF9VUChwX2Jsay0+dG90YWxfc2l6ZSwgcF9ibGstPnJlYWxfc2l6ZV9pbl9wYWdlKTsKIAlwX2NsaS0+bGFzdC52YWwgPSAqcF9saW5lIC0gMTsKIAogCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX0lMVCwKQEAgLTc5NSwxMCArNzk4LDkgQEAKIAlwX21uZ3ItPnQyX251bV9wYWdlcyA9IERJVl9ST1VORF9VUCh0b3RhbF9zaXplLCBwc3opOwogCiAJLyogYWxsb2NhdGUgdDIgKi8KLQlwX21uZ3ItPnQyID0ga3phbGxvYyhwX21uZ3ItPnQyX251bV9wYWdlcyAqIHNpemVvZihzdHJ1Y3QgcWVkX2RtYV9tZW0pLAorCXBfbW5nci0+dDIgPSBrY2FsbG9jKHBfbW5nci0+dDJfbnVtX3BhZ2VzLCBzaXplb2Yoc3RydWN0IHFlZF9kbWFfbWVtKSwKIAkJCSAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwX21uZ3ItPnQyKSB7Ci0JCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgdDIgdGFibGVcbiIpOwogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gdDJfZmFpbDsKIAl9CkBAIC05MjYsMTIgKzkyOCw5IEBACiAJCXZvaWQgKnBfdmlydDsKIAkJdTMyIHNpemU7CiAKLQkJc2l6ZSA9IG1pbl90KHUzMiwgc3pfbGVmdCwKLQkJCSAgICAgcF9ibGstPnJlYWxfc2l6ZV9pbl9wYWdlKTsKKwkJc2l6ZSA9IG1pbl90KHUzMiwgc3pfbGVmdCwgcF9ibGstPnJlYWxfc2l6ZV9pbl9wYWdlKTsKIAkJcF92aXJ0ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKLQkJCQkJICAgIHNpemUsCi0JCQkJCSAgICAmcF9waHlzLAotCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCQkJCSAgICBzaXplLCAmcF9waHlzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFwX3ZpcnQpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJbWVtc2V0KHBfdmlydCwgMCwgc2l6ZSk7CkBAIC05NjMsNyArOTYyLDYgQEAKIAlwX21uZ3ItPmlsdF9zaGFkb3cgPSBrY2FsbG9jKHNpemUsIHNpemVvZihzdHJ1Y3QgcWVkX2RtYV9tZW0pLAogCQkJCSAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwX21uZ3ItPmlsdF9zaGFkb3cpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBpbHQgc2hhZG93IHRhYmxlXG4iKTsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGlsdF9zaGFkb3dfZmFpbDsKIAl9CkBAIC05NzYsNyArOTc0LDcgQEAKIAkJZm9yIChqID0gMDsgaiA8IElMVF9DTElfUEZfQkxPQ0tTOyBqKyspIHsKIAkJCXBfYmxrID0gJmNsaWVudHNbaV0ucGZfYmxrc1tqXTsKIAkJCXJjID0gcWVkX2lsdF9ibGtfYWxsb2MocF9od2ZuLCBwX2JsaywgaSwgMCk7Ci0JCQlpZiAocmMgIT0gMCkKKwkJCWlmIChyYykKIAkJCQlnb3RvIGlsdF9zaGFkb3dfZmFpbDsKIAkJfQogCQlmb3IgKGsgPSAwOyBrIDwgcF9tbmdyLT52Zl9jb3VudDsgaysrKSB7CkBAIC05ODUsNyArOTgzLDcgQEAKIAogCQkJCXBfYmxrID0gJmNsaWVudHNbaV0udmZfYmxrc1tqXTsKIAkJCQlyYyA9IHFlZF9pbHRfYmxrX2FsbG9jKHBfaHdmbiwgcF9ibGssIGksIGxpbmVzKTsKLQkJCQlpZiAocmMgIT0gMCkKKwkJCQlpZiAocmMpCiAJCQkJCWdvdG8gaWx0X3NoYWRvd19mYWlsOwogCQkJfQogCQl9CkBAIC0xMDU2LDEwICsxMDU0LDggQEAKIAl1MzIgaTsKIAogCXBfbW5nciA9IGt6YWxsb2Moc2l6ZW9mKCpwX21uZ3IpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBfbW5ncikgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGBzdHJ1Y3QgcWVkX2N4dF9tbmdyJ1xuIik7CisJaWYgKCFwX21uZ3IpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCS8qIEluaXRpYWxpemUgSUxUIGNsaWVudCByZWdpc3RlcnMgKi8KIAljbGllbnRzID0gcF9tbmdyLT5jbGllbnRzOwpAQCAtMTExMSwyNCArMTEwNywxOCBAQAogCiAJLyogQWxsb2NhdGUgdGhlIElMVCBzaGFkb3cgdGFibGUgKi8KIAlyYyA9IHFlZF9pbHRfc2hhZG93X2FsbG9jKHBfaHdmbik7Ci0JaWYgKHJjKSB7Ci0JCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgaWx0IG1lbW9yeVxuIik7CisJaWYgKHJjKQogCQlnb3RvIHRhYmxlc19hbGxvY19mYWlsOwotCX0KIAogCS8qIEFsbG9jYXRlIHRoZSBUMiAgdGFibGUgKi8KIAlyYyA9IHFlZF9jeHRfc3JjX3QyX2FsbG9jKHBfaHdmbik7Ci0JaWYgKHJjKSB7Ci0JCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgVDIgbWVtb3J5XG4iKTsKKwlpZiAocmMpCiAJCWdvdG8gdGFibGVzX2FsbG9jX2ZhaWw7Ci0JfQogCiAJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGFjcXVpcmVkIGNpZHMgYml0bWFwcyAqLwogCXJjID0gcWVkX2NpZF9tYXBfYWxsb2MocF9od2ZuKTsKLQlpZiAocmMpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBjaWQgbWFwc1xuIik7CisJaWYgKHJjKQogCQlnb3RvIHRhYmxlc19hbGxvY19mYWlsOwotCX0KIAogCXJldHVybiAwOwogCkBAIC0xNjcyLDcgKzE2NjIsNyBAQAogCQkgICAgIHBfaHdmbi0+cmVsX3BmX2lkICogTlVNX1RBU0tfUEZfU0VHTUVOVFMgKyBpKTsKIAogCQlTVE9SRV9SVF9SRUdfQUdHKHBfaHdmbiwgcnRfcmVnLCBjZmdfd29yZCk7Ci0JCWFjdGl2ZV9zZWdfbWFzayB8PSAodG1faWlkcy5wZl90aWRzW2ldID8gKDEgPDwgaSkgOiAwKTsKKwkJYWN0aXZlX3NlZ19tYXNrIHw9ICh0bV9paWRzLnBmX3RpZHNbaV0gPyBCSVQoaSkgOiAwKTsKIAogCQl0bV9vZmZzZXQgKz0gdG1faWlkcy5wZl90aWRzW2ldOwogCX0KQEAgLTE3MDIsOCArMTY5Miw3IEBACiB9CiAKIGludCBxZWRfY3h0X2FjcXVpcmVfY2lkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJZW51bSBwcm90b2NvbF90eXBlIHR5cGUsCi0JCQl1MzIgKnBfY2lkKQorCQkJZW51bSBwcm90b2NvbF90eXBlIHR5cGUsIHUzMiAqcF9jaWQpCiB7CiAJc3RydWN0IHFlZF9jeHRfbW5nciAqcF9tbmdyID0gcF9od2ZuLT5wX2N4dF9tbmdyOwogCXUzMiByZWxfY2lkOwpAQCAtMTcxNyw4ICsxNzA2LDcgQEAKIAkJCQkgICAgICBwX21uZ3ItPmFjcXVpcmVkW3R5cGVdLm1heF9jb3VudCk7CiAKIAlpZiAocmVsX2NpZCA+PSBwX21uZ3ItPmFjcXVpcmVkW3R5cGVdLm1heF9jb3VudCkgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAibm8gQ0lEIGF2YWlsYWJsZSBmb3IgcHJvdG9jb2wgJWRcbiIsCi0JCQkgIHR5cGUpOworCQlEUF9OT1RJQ0UocF9od2ZuLCAibm8gQ0lEIGF2YWlsYWJsZSBmb3IgcHJvdG9jb2wgJWRcbiIsIHR5cGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE3MzAsOCArMTcxOCw3IEBACiB9CiAKIHN0YXRpYyBib29sIHFlZF9jeHRfdGVzdF9jaWRfYWNxdWlyZWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkJICAgICAgdTMyIGNpZCwKLQkJCQkgICAgICBlbnVtIHByb3RvY29sX3R5cGUgKnBfdHlwZSkKKwkJCQkgICAgICB1MzIgY2lkLCBlbnVtIHByb3RvY29sX3R5cGUgKnBfdHlwZSkKIHsKIAlzdHJ1Y3QgcWVkX2N4dF9tbmdyICpwX21uZ3IgPSBwX2h3Zm4tPnBfY3h0X21uZ3I7CiAJc3RydWN0IHFlZF9jaWRfYWNxdWlyZWRfbWFwICpwX21hcDsKQEAgLTE3NjMsOCArMTc1MCw3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgcWVkX2N4dF9yZWxlYXNlX2NpZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSB1MzIgY2lkKQordm9pZCBxZWRfY3h0X3JlbGVhc2VfY2lkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1MzIgY2lkKQogewogCXN0cnVjdCBxZWRfY3h0X21uZ3IgKnBfbW5nciA9IHBfaHdmbi0+cF9jeHRfbW5ncjsKIAllbnVtIHByb3RvY29sX3R5cGUgdHlwZTsKQEAgLTE3ODEsOCArMTc2Nyw3IEBACiAJX19jbGVhcl9iaXQocmVsX2NpZCwgcF9tbmdyLT5hY3F1aXJlZFt0eXBlXS5jaWRfbWFwKTsKIH0KIAotaW50IHFlZF9jeHRfZ2V0X2NpZF9pbmZvKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJIHN0cnVjdCBxZWRfY3h0X2luZm8gKnBfaW5mbykKK2ludCBxZWRfY3h0X2dldF9jaWRfaW5mbyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9jeHRfaW5mbyAqcF9pbmZvKQogewogCXN0cnVjdCBxZWRfY3h0X21uZ3IgKnBfbW5nciA9IHBfaHdmbi0+cF9jeHRfbW5ncjsKIAl1MzIgY29ubl9jeHRfc2l6ZSwgaHdfcF9zaXplLCBjeHRzX3Blcl9wLCBsaW5lOwpAQCAtMTg2MCw2ICsxODQ1LDggQEAKIAkvKiBTZXQgdGhlIG51bWJlciBvZiByZXF1aXJlZCBDT1JFIGNvbm5lY3Rpb25zICovCiAJdTMyIGNvcmVfY2lkcyA9IDE7IC8qIFNQUSAqLwogCisJaWYgKHBfaHdmbi0+dXNpbmdfbGwyKQorCQljb3JlX2NpZHMgKz0gNDsKIAlxZWRfY3h0X3NldF9wcm90b19jaWRfY291bnQocF9od2ZuLCBQUk9UT0NPTElEX0NPUkUsIGNvcmVfY2lkcywgMCk7CiAKIAlzd2l0Y2ggKHBfaHdmbi0+aHdfaW5mby5wZXJzb25hbGl0eSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfY3h0LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9jeHQuaAppbmRleCBjNmY2ZjJlLi4yYjhiZGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9jeHQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9jeHQuaApAQCAtMTcwLDYgKzE3MCwxMyBAQAogICovCiB2b2lkIHFlZF9jeHRfcmVsZWFzZV9jaWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCQkgdTMyIGNpZCk7CitpbnQgcWVkX2N4dF9keW5hbWljX2lsdF9hbGxvYyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICAgIGVudW0gcWVkX2N4dF9lbGVtX3R5cGUgZWxlbV90eXBlLCB1MzIgaWlkKTsKK3UzMiBxZWRfY3h0X2dldF9wcm90b190aWRfY291bnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJZW51bSBwcm90b2NvbF90eXBlIHR5cGUpOwordTMyIHFlZF9jeHRfZ2V0X3Byb3RvX2NpZF9zdGFydChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQllbnVtIHByb3RvY29sX3R5cGUgdHlwZSk7CitpbnQgcWVkX2N4dF9mcmVlX3Byb3RvX2lsdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgZW51bSBwcm90b2NvbF90eXBlIHByb3RvKTsKIAogI2RlZmluZSBRRURfQ1RYX1dPUktJTkdfTUVNIDAKICNkZWZpbmUgUUVEX0NUWF9GTF9NRU0gMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGNieC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGNieC5jCmluZGV4IGQwZGMyOGYuLjEzMGRhMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2RjYnguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kY2J4LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlICJxZWRfZGNieC5oIgogI2luY2x1ZGUgInFlZF9oc2kuaCIKICNpbmNsdWRlICJxZWRfc3AuaCIKKyNpbmNsdWRlICJxZWRfc3Jpb3YuaCIKICNpZmRlZiBDT05GSUdfRENCCiAjaW5jbHVkZSA8bGludXgvcWVkL3FlZF9ldGhfaWYuaD4KICNlbmRpZgpAQCAtNTIsNDAgKzUzLDk0IEBACiAJCSAgRENCWF9BUFBfU0ZfRVRIVFlQRSk7CiB9CiAKK3N0YXRpYyBib29sIHFlZF9kY2J4X2llZWVfYXBwX2V0aHR5cGUodTMyIGFwcF9pbmZvX2JpdG1hcCkKK3sKKwl1OCBtZndfdmFsID0gUUVEX01GV19HRVRfRklFTEQoYXBwX2luZm9fYml0bWFwLCBEQ0JYX0FQUF9TRl9JRUVFKTsKKworCS8qIE9sZCBNRlcgKi8KKwlpZiAobWZ3X3ZhbCA9PSBEQ0JYX0FQUF9TRl9JRUVFX1JFU0VSVkVEKQorCQlyZXR1cm4gcWVkX2RjYnhfYXBwX2V0aHR5cGUoYXBwX2luZm9fYml0bWFwKTsKKworCXJldHVybiAhIShtZndfdmFsID09IERDQlhfQVBQX1NGX0lFRUVfRVRIVFlQRSk7Cit9CisKIHN0YXRpYyBib29sIHFlZF9kY2J4X2FwcF9wb3J0KHUzMiBhcHBfaW5mb19iaXRtYXApCiB7CiAJcmV0dXJuICEhKFFFRF9NRldfR0VUX0ZJRUxEKGFwcF9pbmZvX2JpdG1hcCwgRENCWF9BUFBfU0YpID09CiAJCSAgRENCWF9BUFBfU0ZfUE9SVCk7CiB9CiAKLXN0YXRpYyBib29sIHFlZF9kY2J4X2RlZmF1bHRfdGx2KHUzMiBhcHBfaW5mb19iaXRtYXAsIHUxNiBwcm90b19pZCkKK3N0YXRpYyBib29sIHFlZF9kY2J4X2llZWVfYXBwX3BvcnQodTMyIGFwcF9pbmZvX2JpdG1hcCwgdTggdHlwZSkKIHsKLQlyZXR1cm4gISEocWVkX2RjYnhfYXBwX2V0aHR5cGUoYXBwX2luZm9fYml0bWFwKSAmJgotCQkgIHByb3RvX2lkID09IFFFRF9FVEhfVFlQRV9ERUZBVUxUKTsKKwl1OCBtZndfdmFsID0gUUVEX01GV19HRVRfRklFTEQoYXBwX2luZm9fYml0bWFwLCBEQ0JYX0FQUF9TRl9JRUVFKTsKKworCS8qIE9sZCBNRlcgKi8KKwlpZiAobWZ3X3ZhbCA9PSBEQ0JYX0FQUF9TRl9JRUVFX1JFU0VSVkVEKQorCQlyZXR1cm4gcWVkX2RjYnhfYXBwX3BvcnQoYXBwX2luZm9fYml0bWFwKTsKKworCXJldHVybiAhIShtZndfdmFsID09IHR5cGUgfHwgbWZ3X3ZhbCA9PSBEQ0JYX0FQUF9TRl9JRUVFX1RDUF9VRFBfUE9SVCk7CiB9CiAKLXN0YXRpYyBib29sIHFlZF9kY2J4X2lzY3NpX3Rsdih1MzIgYXBwX2luZm9fYml0bWFwLCB1MTYgcHJvdG9faWQpCitzdGF0aWMgYm9vbCBxZWRfZGNieF9kZWZhdWx0X3Rsdih1MzIgYXBwX2luZm9fYml0bWFwLCB1MTYgcHJvdG9faWQsIGJvb2wgaWVlZSkKIHsKLQlyZXR1cm4gISEocWVkX2RjYnhfYXBwX3BvcnQoYXBwX2luZm9fYml0bWFwKSAmJgotCQkgIHByb3RvX2lkID09IFFFRF9UQ1BfUE9SVF9JU0NTSSk7CisJYm9vbCBldGh0eXBlOworCisJaWYgKGllZWUpCisJCWV0aHR5cGUgPSBxZWRfZGNieF9pZWVlX2FwcF9ldGh0eXBlKGFwcF9pbmZvX2JpdG1hcCk7CisJZWxzZQorCQlldGh0eXBlID0gcWVkX2RjYnhfYXBwX2V0aHR5cGUoYXBwX2luZm9fYml0bWFwKTsKKworCXJldHVybiAhIShldGh0eXBlICYmIChwcm90b19pZCA9PSBRRURfRVRIX1RZUEVfREVGQVVMVCkpOwogfQogCi1zdGF0aWMgYm9vbCBxZWRfZGNieF9mY29lX3Rsdih1MzIgYXBwX2luZm9fYml0bWFwLCB1MTYgcHJvdG9faWQpCitzdGF0aWMgYm9vbCBxZWRfZGNieF9pc2NzaV90bHYodTMyIGFwcF9pbmZvX2JpdG1hcCwgdTE2IHByb3RvX2lkLCBib29sIGllZWUpCiB7Ci0JcmV0dXJuICEhKHFlZF9kY2J4X2FwcF9ldGh0eXBlKGFwcF9pbmZvX2JpdG1hcCkgJiYKLQkJICBwcm90b19pZCA9PSBRRURfRVRIX1RZUEVfRkNPRSk7CisJYm9vbCBwb3J0OworCisJaWYgKGllZWUpCisJCXBvcnQgPSBxZWRfZGNieF9pZWVlX2FwcF9wb3J0KGFwcF9pbmZvX2JpdG1hcCwKKwkJCQkJICAgICAgRENCWF9BUFBfU0ZfSUVFRV9UQ1BfUE9SVCk7CisJZWxzZQorCQlwb3J0ID0gcWVkX2RjYnhfYXBwX3BvcnQoYXBwX2luZm9fYml0bWFwKTsKKworCXJldHVybiAhIShwb3J0ICYmIChwcm90b19pZCA9PSBRRURfVENQX1BPUlRfSVNDU0kpKTsKIH0KIAotc3RhdGljIGJvb2wgcWVkX2RjYnhfcm9jZV90bHYodTMyIGFwcF9pbmZvX2JpdG1hcCwgdTE2IHByb3RvX2lkKQorc3RhdGljIGJvb2wgcWVkX2RjYnhfZmNvZV90bHYodTMyIGFwcF9pbmZvX2JpdG1hcCwgdTE2IHByb3RvX2lkLCBib29sIGllZWUpCiB7Ci0JcmV0dXJuICEhKHFlZF9kY2J4X2FwcF9ldGh0eXBlKGFwcF9pbmZvX2JpdG1hcCkgJiYKLQkJICBwcm90b19pZCA9PSBRRURfRVRIX1RZUEVfUk9DRSk7CisJYm9vbCBldGh0eXBlOworCisJaWYgKGllZWUpCisJCWV0aHR5cGUgPSBxZWRfZGNieF9pZWVlX2FwcF9ldGh0eXBlKGFwcF9pbmZvX2JpdG1hcCk7CisJZWxzZQorCQlldGh0eXBlID0gcWVkX2RjYnhfYXBwX2V0aHR5cGUoYXBwX2luZm9fYml0bWFwKTsKKworCXJldHVybiAhIShldGh0eXBlICYmIChwcm90b19pZCA9PSBRRURfRVRIX1RZUEVfRkNPRSkpOwogfQogCi1zdGF0aWMgYm9vbCBxZWRfZGNieF9yb2NlX3YyX3Rsdih1MzIgYXBwX2luZm9fYml0bWFwLCB1MTYgcHJvdG9faWQpCitzdGF0aWMgYm9vbCBxZWRfZGNieF9yb2NlX3Rsdih1MzIgYXBwX2luZm9fYml0bWFwLCB1MTYgcHJvdG9faWQsIGJvb2wgaWVlZSkKIHsKLQlyZXR1cm4gISEocWVkX2RjYnhfYXBwX3BvcnQoYXBwX2luZm9fYml0bWFwKSAmJgotCQkgIHByb3RvX2lkID09IFFFRF9VRFBfUE9SVF9UWVBFX1JPQ0VfVjIpOworCWJvb2wgZXRodHlwZTsKKworCWlmIChpZWVlKQorCQlldGh0eXBlID0gcWVkX2RjYnhfaWVlZV9hcHBfZXRodHlwZShhcHBfaW5mb19iaXRtYXApOworCWVsc2UKKwkJZXRodHlwZSA9IHFlZF9kY2J4X2FwcF9ldGh0eXBlKGFwcF9pbmZvX2JpdG1hcCk7CisKKwlyZXR1cm4gISEoZXRodHlwZSAmJiAocHJvdG9faWQgPT0gUUVEX0VUSF9UWVBFX1JPQ0UpKTsKK30KKworc3RhdGljIGJvb2wgcWVkX2RjYnhfcm9jZV92Ml90bHYodTMyIGFwcF9pbmZvX2JpdG1hcCwgdTE2IHByb3RvX2lkLCBib29sIGllZWUpCit7CisJYm9vbCBwb3J0OworCisJaWYgKGllZWUpCisJCXBvcnQgPSBxZWRfZGNieF9pZWVlX2FwcF9wb3J0KGFwcF9pbmZvX2JpdG1hcCwKKwkJCQkJICAgICAgRENCWF9BUFBfU0ZfSUVFRV9VRFBfUE9SVCk7CisJZWxzZQorCQlwb3J0ID0gcWVkX2RjYnhfYXBwX3BvcnQoYXBwX2luZm9fYml0bWFwKTsKKworCXJldHVybiAhIShwb3J0ICYmIChwcm90b19pZCA9PSBRRURfVURQX1BPUlRfVFlQRV9ST0NFX1YyKSk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xNjQsMTcgKzIxOSwxNyBAQAogc3RhdGljIGJvb2wKIHFlZF9kY2J4X2dldF9hcHBfcHJvdG9jb2xfdHlwZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJCSAgICAgICB1MzIgYXBwX3ByaW9fYml0bWFwLAotCQkJICAgICAgIHUxNiBpZCwgZW51bSBkY2J4X3Byb3RvY29sX3R5cGUgKnR5cGUpCisJCQkgICAgICAgdTE2IGlkLCBlbnVtIGRjYnhfcHJvdG9jb2xfdHlwZSAqdHlwZSwgYm9vbCBpZWVlKQogewotCWlmIChxZWRfZGNieF9mY29lX3RsdihhcHBfcHJpb19iaXRtYXAsIGlkKSkgeworCWlmIChxZWRfZGNieF9mY29lX3RsdihhcHBfcHJpb19iaXRtYXAsIGlkLCBpZWVlKSkgewogCQkqdHlwZSA9IERDQlhfUFJPVE9DT0xfRkNPRTsKLQl9IGVsc2UgaWYgKHFlZF9kY2J4X3JvY2VfdGx2KGFwcF9wcmlvX2JpdG1hcCwgaWQpKSB7CisJfSBlbHNlIGlmIChxZWRfZGNieF9yb2NlX3RsdihhcHBfcHJpb19iaXRtYXAsIGlkLCBpZWVlKSkgewogCQkqdHlwZSA9IERDQlhfUFJPVE9DT0xfUk9DRTsKLQl9IGVsc2UgaWYgKHFlZF9kY2J4X2lzY3NpX3RsdihhcHBfcHJpb19iaXRtYXAsIGlkKSkgeworCX0gZWxzZSBpZiAocWVkX2RjYnhfaXNjc2lfdGx2KGFwcF9wcmlvX2JpdG1hcCwgaWQsIGllZWUpKSB7CiAJCSp0eXBlID0gRENCWF9QUk9UT0NPTF9JU0NTSTsKLQl9IGVsc2UgaWYgKHFlZF9kY2J4X2RlZmF1bHRfdGx2KGFwcF9wcmlvX2JpdG1hcCwgaWQpKSB7CisJfSBlbHNlIGlmIChxZWRfZGNieF9kZWZhdWx0X3RsdihhcHBfcHJpb19iaXRtYXAsIGlkLCBpZWVlKSkgewogCQkqdHlwZSA9IERDQlhfUFJPVE9DT0xfRVRIOwotCX0gZWxzZSBpZiAocWVkX2RjYnhfcm9jZV92Ml90bHYoYXBwX3ByaW9fYml0bWFwLCBpZCkpIHsKKwl9IGVsc2UgaWYgKHFlZF9kY2J4X3JvY2VfdjJfdGx2KGFwcF9wcmlvX2JpdG1hcCwgaWQsIGllZWUpKSB7CiAJCSp0eXBlID0gRENCWF9QUk9UT0NPTF9ST0NFX1YyOwogCX0gZWxzZSB7CiAJCSp0eXBlID0gRENCWF9NQVhfUFJPVE9DT0xfVFlQRTsKQEAgLTE5NCwxNyArMjQ5LDE4IEBACiBxZWRfZGNieF9wcm9jZXNzX3RsdihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJICAgICBzdHJ1Y3QgcWVkX2RjYnhfcmVzdWx0cyAqcF9kYXRhLAogCQkgICAgIHN0cnVjdCBkY2J4X2FwcF9wcmlvcml0eV9lbnRyeSAqcF90YmwsCi0JCSAgICAgdTMyIHByaV90Y190YmwsIGludCBjb3VudCwgYm9vbCBkY2J4X2VuYWJsZWQpCisJCSAgICAgdTMyIHByaV90Y190YmwsIGludCBjb3VudCwgdTggZGNieF92ZXJzaW9uKQogewogCXU4IHRjLCBwcmlvcml0eV9tYXA7CiAJZW51bSBkY2J4X3Byb3RvY29sX3R5cGUgdHlwZTsKKwlib29sIGVuYWJsZSwgaWVlZTsKIAl1MTYgcHJvdG9jb2xfaWQ7CiAJaW50IHByaW9yaXR5OwotCWJvb2wgZW5hYmxlOwogCWludCBpOwogCiAJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfRENCLCAiTnVtIEFQUCBlbnRyaWVzID0gJWRcbiIsIGNvdW50KTsKIAorCWllZWUgPSAoZGNieF92ZXJzaW9uID09IERDQlhfQ09ORklHX1ZFUlNJT05fSUVFRSk7CiAJLyogUGFyc2UgQVBQIFRMViAqLwogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCXByb3RvY29sX2lkID0gUUVEX01GV19HRVRfRklFTEQocF90YmxbaV0uZW50cnksCkBAIC0yMTksNyArMjc1LDcgQEAKIAogCQl0YyA9IFFFRF9EQ0JYX1BSSU8yVEMocHJpX3RjX3RibCwgcHJpb3JpdHkpOwogCQlpZiAocWVkX2RjYnhfZ2V0X2FwcF9wcm90b2NvbF90eXBlKHBfaHdmbiwgcF90YmxbaV0uZW50cnksCi0JCQkJCQkgICBwcm90b2NvbF9pZCwgJnR5cGUpKSB7CisJCQkJCQkgICBwcm90b2NvbF9pZCwgJnR5cGUsIGllZWUpKSB7CiAJCQkvKiBFVEggYWx3YXlzIGhhdmUgdGhlIGVuYWJsZSBiaXQgcmVzZXQsIGFzIGl0IGdldHMKIAkJCSAqIHZsYW4gaW5mb3JtYXRpb24gcGVyIHBhY2tldC4gRm9yIG90aGVyIHByb3RvY29scywKIAkJCSAqIHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBkY2J4X2VuYWJsZWQKQEAgLTI3NSwxNSArMzMxLDEyIEBACiAJc3RydWN0IGRjYnhfZXRzX2ZlYXR1cmUgKnBfZXRzOwogCXN0cnVjdCBxZWRfaHdfaW5mbyAqcF9pbmZvOwogCXUzMiBwcmlfdGNfdGJsLCBmbGFnczsKLQlib29sIGRjYnhfZW5hYmxlZDsKKwl1OCBkY2J4X3ZlcnNpb247CiAJaW50IG51bV9lbnRyaWVzOwogCWludCByYyA9IDA7CiAKLQkvKiBJZiBEQ0J4IHZlcnNpb24gaXMgbm9uIHplcm8sIHRoZW4gbmVnb3RpYXRpb24gd2FzCi0JICogc3VjY2Vzc2Z1bHkgcGVyZm9ybWVkCi0JICovCiAJZmxhZ3MgPSBwX2h3Zm4tPnBfZGNieF9pbmZvLT5vcGVyYXRpb25hbC5mbGFnczsKLQlkY2J4X2VuYWJsZWQgPSAhIVFFRF9NRldfR0VUX0ZJRUxEKGZsYWdzLCBEQ0JYX0NPTkZJR19WRVJTSU9OKTsKKwlkY2J4X3ZlcnNpb24gPSBRRURfTUZXX0dFVF9GSUVMRChmbGFncywgRENCWF9DT05GSUdfVkVSU0lPTik7CiAKIAlwX2FwcCA9ICZwX2h3Zm4tPnBfZGNieF9pbmZvLT5vcGVyYXRpb25hbC5mZWF0dXJlcy5hcHA7CiAJcF90YmwgPSBwX2FwcC0+YXBwX3ByaV90Ymw7CkBAIC0yOTUsMTMgKzM0OCwxMyBAQAogCW51bV9lbnRyaWVzID0gUUVEX01GV19HRVRfRklFTEQocF9hcHAtPmZsYWdzLCBEQ0JYX0FQUF9OVU1fRU5UUklFUyk7CiAKIAlyYyA9IHFlZF9kY2J4X3Byb2Nlc3NfdGx2KHBfaHdmbiwgJmRhdGEsIHBfdGJsLCBwcmlfdGNfdGJsLAotCQkJCSAgbnVtX2VudHJpZXMsIGRjYnhfZW5hYmxlZCk7CisJCQkJICBudW1fZW50cmllcywgZGNieF92ZXJzaW9uKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAogCXBfaW5mby0+bnVtX3RjID0gUUVEX01GV19HRVRfRklFTEQocF9ldHMtPmZsYWdzLCBEQ0JYX0VUU19NQVhfVENTKTsKIAlkYXRhLnBmX2lkID0gcF9od2ZuLT5yZWxfcGZfaWQ7Ci0JZGF0YS5kY2J4X2VuYWJsZWQgPSBkY2J4X2VuYWJsZWQ7CisJZGF0YS5kY2J4X2VuYWJsZWQgPSAhIWRjYnhfdmVyc2lvbjsKIAogCXFlZF9kY2J4X2RwX3Byb3RvY29sKHBfaHdmbiwgJmRhdGEpOwogCkBAIC00MDAsNyArNDUzLDcgQEAKIHFlZF9kY2J4X2dldF9hcHBfZGF0YShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJICAgICAgc3RydWN0IGRjYnhfYXBwX3ByaW9yaXR5X2ZlYXR1cmUgKnBfYXBwLAogCQkgICAgICBzdHJ1Y3QgZGNieF9hcHBfcHJpb3JpdHlfZW50cnkgKnBfdGJsLAotCQkgICAgICBzdHJ1Y3QgcWVkX2RjYnhfcGFyYW1zICpwX3BhcmFtcykKKwkJICAgICAgc3RydWN0IHFlZF9kY2J4X3BhcmFtcyAqcF9wYXJhbXMsIGJvb2wgaWVlZSkKIHsKIAlzdHJ1Y3QgcWVkX2FwcF9lbnRyeSAqZW50cnk7CiAJdTggcHJpX21hcDsKQEAgLTQxNCwxNSArNDY3LDQ2IEBACiAJCQkJCQkgICAgICBEQ0JYX0FQUF9OVU1fRU5UUklFUyk7CiAJZm9yIChpID0gMDsgaSA8IERDQlhfTUFYX0FQUF9QUk9UT0NPTDsgaSsrKSB7CiAJCWVudHJ5ID0gJnBfcGFyYW1zLT5hcHBfZW50cnlbaV07Ci0JCWVudHJ5LT5ldGh0eXBlID0gIShRRURfTUZXX0dFVF9GSUVMRChwX3RibFtpXS5lbnRyeSwKLQkJCQkJCSAgICAgRENCWF9BUFBfU0YpKTsKKwkJaWYgKGllZWUpIHsKKwkJCXU4IHNmX2llZWU7CisJCQl1MzIgdmFsOworCisJCQlzZl9pZWVlID0gUUVEX01GV19HRVRfRklFTEQocF90YmxbaV0uZW50cnksCisJCQkJCQkgICAgRENCWF9BUFBfU0ZfSUVFRSk7CisJCQlzd2l0Y2ggKHNmX2llZWUpIHsKKwkJCWNhc2UgRENCWF9BUFBfU0ZfSUVFRV9SRVNFUlZFRDoKKwkJCQkvKiBPbGQgTUZXICovCisJCQkJdmFsID0gUUVEX01GV19HRVRfRklFTEQocF90YmxbaV0uZW50cnksCisJCQkJCQkJRENCWF9BUFBfU0YpOworCQkJCWVudHJ5LT5zZl9pZWVlID0gdmFsID8KKwkJCQkgICAgUUVEX0RDQlhfU0ZfSUVFRV9UQ1BfVURQX1BPUlQgOgorCQkJCSAgICBRRURfRENCWF9TRl9JRUVFX0VUSFRZUEU7CisJCQkJYnJlYWs7CisJCQljYXNlIERDQlhfQVBQX1NGX0lFRUVfRVRIVFlQRToKKwkJCQllbnRyeS0+c2ZfaWVlZSA9IFFFRF9EQ0JYX1NGX0lFRUVfRVRIVFlQRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRENCWF9BUFBfU0ZfSUVFRV9UQ1BfUE9SVDoKKwkJCQllbnRyeS0+c2ZfaWVlZSA9IFFFRF9EQ0JYX1NGX0lFRUVfVENQX1BPUlQ7CisJCQkJYnJlYWs7CisJCQljYXNlIERDQlhfQVBQX1NGX0lFRUVfVURQX1BPUlQ6CisJCQkJZW50cnktPnNmX2llZWUgPSBRRURfRENCWF9TRl9JRUVFX1VEUF9QT1JUOworCQkJCWJyZWFrOworCQkJY2FzZSBEQ0JYX0FQUF9TRl9JRUVFX1RDUF9VRFBfUE9SVDoKKwkJCQllbnRyeS0+c2ZfaWVlZSA9IFFFRF9EQ0JYX1NGX0lFRUVfVENQX1VEUF9QT1JUOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJZW50cnktPmV0aHR5cGUgPSAhKFFFRF9NRldfR0VUX0ZJRUxEKHBfdGJsW2ldLmVudHJ5LAorCQkJCQkJCSAgICAgRENCWF9BUFBfU0YpKTsKKwkJfQorCiAJCXByaV9tYXAgPSBRRURfTUZXX0dFVF9GSUVMRChwX3RibFtpXS5lbnRyeSwgRENCWF9BUFBfUFJJX01BUCk7CiAJCWVudHJ5LT5wcmlvID0gZmZzKHByaV9tYXApIC0gMTsKIAkJZW50cnktPnByb3RvX2lkID0gUUVEX01GV19HRVRfRklFTEQocF90YmxbaV0uZW50cnksCiAJCQkJCQkgICAgRENCWF9BUFBfUFJPVE9DT0xfSUQpOwogCQlxZWRfZGNieF9nZXRfYXBwX3Byb3RvY29sX3R5cGUocF9od2ZuLCBwX3RibFtpXS5lbnRyeSwKIAkJCQkJICAgICAgIGVudHJ5LT5wcm90b19pZCwKLQkJCQkJICAgICAgICZlbnRyeS0+cHJvdG9fdHlwZSk7CisJCQkJCSAgICAgICAmZW50cnktPnByb3RvX3R5cGUsIGllZWUpOwogCX0KIAogCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX0RDQiwKQEAgLTQ4Myw3ICs1NjcsNyBAQAogCWJ3X21hcFsxXSA9IGJlMzJfdG9fY3B1KHBfZXRzLT50Y19id190YmxbMV0pOwogCXRzYV9tYXBbMF0gPSBiZTMyX3RvX2NwdShwX2V0cy0+dGNfdHNhX3RibFswXSk7CiAJdHNhX21hcFsxXSA9IGJlMzJfdG9fY3B1KHBfZXRzLT50Y190c2FfdGJsWzFdKTsKLQlwcmlfbWFwID0gYmUzMl90b19jcHUocF9ldHMtPnByaV90Y190YmxbMF0pOworCXByaV9tYXAgPSBwX2V0cy0+cHJpX3RjX3RibFswXTsKIAlmb3IgKGkgPSAwOyBpIDwgUUVEX01BWF9QRkNfUFJJT1JJVElFUzsgaSsrKSB7CiAJCXBfcGFyYW1zLT5ldHNfdGNfYndfdGJsW2ldID0gKCh1OCAqKWJ3X21hcClbaV07CiAJCXBfcGFyYW1zLT5ldHNfdGNfdHNhX3RibFtpXSA9ICgodTggKil0c2FfbWFwKVtpXTsKQEAgLTUwMCw5ICs1ODQsOSBAQAogCQkJICAgc3RydWN0IGRjYnhfYXBwX3ByaW9yaXR5X2ZlYXR1cmUgKnBfYXBwLAogCQkJICAgc3RydWN0IGRjYnhfYXBwX3ByaW9yaXR5X2VudHJ5ICpwX3RibCwKIAkJCSAgIHN0cnVjdCBkY2J4X2V0c19mZWF0dXJlICpwX2V0cywKLQkJCSAgIHUzMiBwZmMsIHN0cnVjdCBxZWRfZGNieF9wYXJhbXMgKnBfcGFyYW1zKQorCQkJICAgdTMyIHBmYywgc3RydWN0IHFlZF9kY2J4X3BhcmFtcyAqcF9wYXJhbXMsIGJvb2wgaWVlZSkKIHsKLQlxZWRfZGNieF9nZXRfYXBwX2RhdGEocF9od2ZuLCBwX2FwcCwgcF90YmwsIHBfcGFyYW1zKTsKKwlxZWRfZGNieF9nZXRfYXBwX2RhdGEocF9od2ZuLCBwX2FwcCwgcF90YmwsIHBfcGFyYW1zLCBpZWVlKTsKIAlxZWRfZGNieF9nZXRfZXRzX2RhdGEocF9od2ZuLCBwX2V0cywgcF9wYXJhbXMpOwogCXFlZF9kY2J4X2dldF9wZmNfZGF0YShwX2h3Zm4sIHBmYywgcF9wYXJhbXMpOwogfQpAQCAtNTE2LDcgKzYwMCw3IEBACiAJcF9mZWF0ID0gJnBfaHdmbi0+cF9kY2J4X2luZm8tPmxvY2FsX2FkbWluLmZlYXR1cmVzOwogCXFlZF9kY2J4X2dldF9jb21tb25fcGFyYW1zKHBfaHdmbiwgJnBfZmVhdC0+YXBwLAogCQkJCSAgIHBfZmVhdC0+YXBwLmFwcF9wcmlfdGJsLCAmcF9mZWF0LT5ldHMsCi0JCQkJICAgcF9mZWF0LT5wZmMsICZwYXJhbXMtPmxvY2FsLnBhcmFtcyk7CisJCQkJICAgcF9mZWF0LT5wZmMsICZwYXJhbXMtPmxvY2FsLnBhcmFtcywgZmFsc2UpOwogCXBhcmFtcy0+bG9jYWwudmFsaWQgPSB0cnVlOwogfQogCkBAIC01MjksNyArNjEzLDcgQEAKIAlwX2ZlYXQgPSAmcF9od2ZuLT5wX2RjYnhfaW5mby0+cmVtb3RlLmZlYXR1cmVzOwogCXFlZF9kY2J4X2dldF9jb21tb25fcGFyYW1zKHBfaHdmbiwgJnBfZmVhdC0+YXBwLAogCQkJCSAgIHBfZmVhdC0+YXBwLmFwcF9wcmlfdGJsLCAmcF9mZWF0LT5ldHMsCi0JCQkJICAgcF9mZWF0LT5wZmMsICZwYXJhbXMtPnJlbW90ZS5wYXJhbXMpOworCQkJCSAgIHBfZmVhdC0+cGZjLCAmcGFyYW1zLT5yZW1vdGUucGFyYW1zLCBmYWxzZSk7CiAJcGFyYW1zLT5yZW1vdGUudmFsaWQgPSB0cnVlOwogfQogCkBAIC01NzQsNyArNjU4LDggQEAKIAogCXFlZF9kY2J4X2dldF9jb21tb25fcGFyYW1zKHBfaHdmbiwgJnBfZmVhdC0+YXBwLAogCQkJCSAgIHBfZmVhdC0+YXBwLmFwcF9wcmlfdGJsLCAmcF9mZWF0LT5ldHMsCi0JCQkJICAgcF9mZWF0LT5wZmMsICZwYXJhbXMtPm9wZXJhdGlvbmFsLnBhcmFtcyk7CisJCQkJICAgcF9mZWF0LT5wZmMsICZwYXJhbXMtPm9wZXJhdGlvbmFsLnBhcmFtcywKKwkJCQkgICBwX29wZXJhdGlvbmFsLT5pZWVlKTsKIAlxZWRfZGNieF9nZXRfcHJpb3JpdHlfaW5mbyhwX2h3Zm4sICZwX29wZXJhdGlvbmFsLT5hcHBfcHJpbywgcF9yZXN1bHRzKTsKIAllcnIgPSBRRURfTUZXX0dFVF9GSUVMRChwX2ZlYXQtPmFwcC5mbGFncywgRENCWF9BUFBfRVJST1IpOwogCXBfb3BlcmF0aW9uYWwtPmVyciA9IGVycjsKQEAgLTc5MCwxMSArODc1LDggQEAKIAlpbnQgcmMgPSAwOwogCiAJcF9od2ZuLT5wX2RjYnhfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCpwX2h3Zm4tPnBfZGNieF9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwX2h3Zm4tPnBfZGNieF9pbmZvKSB7Ci0JCURQX05PVElDRShwX2h3Zm4sCi0JCQkgICJGYWlsZWQgdG8gYWxsb2NhdGUgJ3N0cnVjdCBxZWRfZGNieF9pbmZvJ1xuIik7CisJaWYgKCFwX2h3Zm4tPnBfZGNieF9pbmZvKQogCQlyYyA9IC1FTk9NRU07Ci0JfQogCiAJcmV0dXJuIHJjOwogfQpAQCAtODYxLDYgKzk0Myw5IEBACiAJc3RydWN0IHFlZF9wdHQgKnBfcHR0OwogCWludCByYzsKIAorCWlmIChJU19WRihwX2h3Zm4tPmNkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXBfcHR0ID0gcWVkX3B0dF9hY3F1aXJlKHBfaHdmbik7CiAJaWYgKCFwX3B0dCkKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTkwMCw2ICs5ODUsNyBAQAogCQlpZiAocF9wYXJhbXMtPnBmYy5wcmlvW2ldKQogCQkJcGZjX21hcCB8PSBCSVQoaSk7CiAKKwkqcGZjICY9IH5EQ0JYX1BGQ19QUklfRU5fQklUTUFQX01BU0s7CiAJKnBmYyB8PSAocGZjX21hcCA8PCBEQ0JYX1BGQ19QUklfRU5fQklUTUFQX1NISUZUKTsKIAogCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX0RDQiwgInBmYyA9IDB4JXhcbiIsICpwZmMpOwpAQCAtOTQ0LDcgKzEwMzAsNiBAQAogCQl2YWwgPSAoKCh1MzIpcF9wYXJhbXMtPmV0c19wcmlfdGNfdGJsW2ldKSA8PCAoKDcgLSBpKSAqIDQpKTsKIAkJcF9ldHMtPnByaV90Y190YmxbMF0gfD0gdmFsOwogCX0KLQlwX2V0cy0+cHJpX3RjX3RibFswXSA9IGNwdV90b19iZTMyKHBfZXRzLT5wcmlfdGNfdGJsWzBdKTsKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCXBfZXRzLT50Y19id190YmxbaV0gPSBjcHVfdG9fYmUzMihwX2V0cy0+dGNfYndfdGJsW2ldKTsKIAkJcF9ldHMtPnRjX3RzYV90YmxbaV0gPSBjcHVfdG9fYmUzMihwX2V0cy0+dGNfdHNhX3RibFtpXSk7CkBAIC05NTQsNyArMTAzOSw3IEBACiBzdGF0aWMgdm9pZAogcWVkX2RjYnhfc2V0X2FwcF9kYXRhKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkgICAgICBzdHJ1Y3QgZGNieF9hcHBfcHJpb3JpdHlfZmVhdHVyZSAqcF9hcHAsCi0JCSAgICAgIHN0cnVjdCBxZWRfZGNieF9wYXJhbXMgKnBfcGFyYW1zKQorCQkgICAgICBzdHJ1Y3QgcWVkX2RjYnhfcGFyYW1zICpwX3BhcmFtcywgYm9vbCBpZWVlKQogewogCXUzMiAqZW50cnk7CiAJaW50IGk7CkBAIC05NzUsMTIgKzEwNjAsNDUgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBEQ0JYX01BWF9BUFBfUFJPVE9DT0w7IGkrKykgewogCQllbnRyeSA9ICZwX2FwcC0+YXBwX3ByaV90YmxbaV0uZW50cnk7Ci0JCSplbnRyeSAmPSB+RENCWF9BUFBfU0ZfTUFTSzsKLQkJaWYgKHBfcGFyYW1zLT5hcHBfZW50cnlbaV0uZXRodHlwZSkKLQkJCSplbnRyeSB8PSAoKHUzMilEQ0JYX0FQUF9TRl9FVEhUWVBFIDw8Ci0JCQkJICAgRENCWF9BUFBfU0ZfU0hJRlQpOwotCQllbHNlCi0JCQkqZW50cnkgfD0gKCh1MzIpRENCWF9BUFBfU0ZfUE9SVCA8PCBEQ0JYX0FQUF9TRl9TSElGVCk7CisJCSplbnRyeSA9IDA7CisJCWlmIChpZWVlKSB7CisJCQkqZW50cnkgJj0gfihEQ0JYX0FQUF9TRl9JRUVFX01BU0sgfCBEQ0JYX0FQUF9TRl9NQVNLKTsKKwkJCXN3aXRjaCAocF9wYXJhbXMtPmFwcF9lbnRyeVtpXS5zZl9pZWVlKSB7CisJCQljYXNlIFFFRF9EQ0JYX1NGX0lFRUVfRVRIVFlQRToKKwkJCQkqZW50cnkgfD0gKCh1MzIpRENCWF9BUFBfU0ZfSUVFRV9FVEhUWVBFIDw8CisJCQkJCSAgIERDQlhfQVBQX1NGX0lFRUVfU0hJRlQpOworCQkJCSplbnRyeSB8PSAoKHUzMilEQ0JYX0FQUF9TRl9FVEhUWVBFIDw8CisJCQkJCSAgIERDQlhfQVBQX1NGX1NISUZUKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUUVEX0RDQlhfU0ZfSUVFRV9UQ1BfUE9SVDoKKwkJCQkqZW50cnkgfD0gKCh1MzIpRENCWF9BUFBfU0ZfSUVFRV9UQ1BfUE9SVCA8PAorCQkJCQkgICBEQ0JYX0FQUF9TRl9JRUVFX1NISUZUKTsKKwkJCQkqZW50cnkgfD0gKCh1MzIpRENCWF9BUFBfU0ZfUE9SVCA8PAorCQkJCQkgICBEQ0JYX0FQUF9TRl9TSElGVCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFFFRF9EQ0JYX1NGX0lFRUVfVURQX1BPUlQ6CisJCQkJKmVudHJ5IHw9ICgodTMyKURDQlhfQVBQX1NGX0lFRUVfVURQX1BPUlQgPDwKKwkJCQkJICAgRENCWF9BUFBfU0ZfSUVFRV9TSElGVCk7CisJCQkJKmVudHJ5IHw9ICgodTMyKURDQlhfQVBQX1NGX1BPUlQgPDwKKwkJCQkJICAgRENCWF9BUFBfU0ZfU0hJRlQpOworCQkJCWJyZWFrOworCQkJY2FzZSBRRURfRENCWF9TRl9JRUVFX1RDUF9VRFBfUE9SVDoKKwkJCQkqZW50cnkgfD0gKCh1MzIpRENCWF9BUFBfU0ZfSUVFRV9UQ1BfVURQX1BPUlQgPDwKKwkJCQkJICAgRENCWF9BUFBfU0ZfSUVFRV9TSElGVCk7CisJCQkJKmVudHJ5IHw9ICgodTMyKURDQlhfQVBQX1NGX1BPUlQgPDwKKwkJCQkJICAgRENCWF9BUFBfU0ZfU0hJRlQpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJKmVudHJ5ICY9IH5EQ0JYX0FQUF9TRl9NQVNLOworCQkJaWYgKHBfcGFyYW1zLT5hcHBfZW50cnlbaV0uZXRodHlwZSkKKwkJCQkqZW50cnkgfD0gKCh1MzIpRENCWF9BUFBfU0ZfRVRIVFlQRSA8PAorCQkJCQkgICBEQ0JYX0FQUF9TRl9TSElGVCk7CisJCQllbHNlCisJCQkJKmVudHJ5IHw9ICgodTMyKURDQlhfQVBQX1NGX1BPUlQgPDwKKwkJCQkJICAgRENCWF9BUFBfU0ZfU0hJRlQpOworCQl9CisKIAkJKmVudHJ5ICY9IH5EQ0JYX0FQUF9QUk9UT0NPTF9JRF9NQVNLOwogCQkqZW50cnkgfD0gKCh1MzIpcF9wYXJhbXMtPmFwcF9lbnRyeVtpXS5wcm90b19pZCA8PAogCQkJICAgRENCWF9BUFBfUFJPVE9DT0xfSURfU0hJRlQpOwpAQCAtOTk1LDE1ICsxMTEzLDE5IEBACiAJCQkgIHN0cnVjdCBkY2J4X2xvY2FsX3BhcmFtcyAqbG9jYWxfYWRtaW4sCiAJCQkgIHN0cnVjdCBxZWRfZGNieF9zZXQgKnBhcmFtcykKIHsKKwlib29sIGllZWUgPSBmYWxzZTsKKwogCWxvY2FsX2FkbWluLT5mbGFncyA9IDA7CiAJbWVtY3B5KCZsb2NhbF9hZG1pbi0+ZmVhdHVyZXMsCiAJICAgICAgICZwX2h3Zm4tPnBfZGNieF9pbmZvLT5vcGVyYXRpb25hbC5mZWF0dXJlcywKIAkgICAgICAgc2l6ZW9mKGxvY2FsX2FkbWluLT5mZWF0dXJlcykpOwogCi0JaWYgKHBhcmFtcy0+ZW5hYmxlZCkKKwlpZiAocGFyYW1zLT5lbmFibGVkKSB7CiAJCWxvY2FsX2FkbWluLT5jb25maWcgPSBwYXJhbXMtPnZlcl9udW07Ci0JZWxzZQorCQlpZWVlID0gISEocGFyYW1zLT52ZXJfbnVtICYgRENCWF9DT05GSUdfVkVSU0lPTl9JRUVFKTsKKwl9IGVsc2UgewogCQlsb2NhbF9hZG1pbi0+Y29uZmlnID0gRENCWF9DT05GSUdfVkVSU0lPTl9ESVNBQkxFRDsKKwl9CiAKIAlpZiAocGFyYW1zLT5vdmVycmlkZV9mbGFncyAmIFFFRF9EQ0JYX09WRVJSSURFX1BGQ19DRkcpCiAJCXFlZF9kY2J4X3NldF9wZmNfZGF0YShwX2h3Zm4sICZsb2NhbF9hZG1pbi0+ZmVhdHVyZXMucGZjLApAQCAtMTAxNSw3ICsxMTM3LDcgQEAKIAogCWlmIChwYXJhbXMtPm92ZXJyaWRlX2ZsYWdzICYgUUVEX0RDQlhfT1ZFUlJJREVfQVBQX0NGRykKIAkJcWVkX2RjYnhfc2V0X2FwcF9kYXRhKHBfaHdmbiwgJmxvY2FsX2FkbWluLT5mZWF0dXJlcy5hcHAsCi0JCQkJICAgICAgJnBhcmFtcy0+Y29uZmlnLnBhcmFtcyk7CisJCQkJICAgICAgJnBhcmFtcy0+Y29uZmlnLnBhcmFtcywgaWVlZSk7CiB9CiAKIGludCBxZWRfZGNieF9jb25maWdfcGFyYW1zKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCkBAIC0xMDY0LDExICsxMTg2LDkgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JZGNieF9pbmZvID0ga21hbGxvYyhzaXplb2YoKmRjYnhfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghZGNieF9pbmZvKSB7Ci0JCURQX0VSUihwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgc3RydWN0IHFlZF9kY2J4X2luZm9cbiIpOworCWRjYnhfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCpkY2J4X2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRjYnhfaW5mbykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcmMgPSBxZWRfZGNieF9xdWVyeV9wYXJhbXMocF9od2ZuLCBkY2J4X2luZm8sIFFFRF9EQ0JYX09QRVJBVElPTkFMX01JQik7CiAJaWYgKHJjKSB7CkBAIC0xMTAxLDExICsxMjIxLDkgQEAKIHsKIAlzdHJ1Y3QgcWVkX2RjYnhfZ2V0ICpkY2J4X2luZm87CiAKLQlkY2J4X2luZm8gPSBrbWFsbG9jKHNpemVvZigqZGNieF9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkY2J4X2luZm8pIHsKLQkJRFBfRVJSKGh3Zm4tPmNkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkY2J4X2luZm9cbiIpOworCWRjYnhfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCpkY2J4X2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRjYnhfaW5mbykKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJaWYgKHFlZF9kY2J4X3F1ZXJ5X3BhcmFtcyhod2ZuLCBkY2J4X2luZm8sIHR5cGUpKSB7CiAJCWtmcmVlKGRjYnhfaW5mbyk7CkBAIC0xNTk2LDggKzE3MTQsMTAgQEAKIAkJaWYgKChlbnRyeS0+ZXRodHlwZSA9PSBldGh0eXBlKSAmJiAoZW50cnktPnByb3RvX2lkID09IGlkdmFsKSkKIAkJCWJyZWFrOwogCQkvKiBGaXJzdCBlbXB0eSBzbG90ICovCi0JCWlmICghZW50cnktPnByb3RvX2lkKQorCQlpZiAoIWVudHJ5LT5wcm90b19pZCkgeworCQkJZGNieF9zZXQuY29uZmlnLnBhcmFtcy5udW1fYXBwX2VudHJpZXMrKzsKIAkJCWJyZWFrOworCQl9CiAJfQogCiAJaWYgKGkgPT0gUUVEX0RDQlhfTUFYX0FQUF9QUk9UT0NPTCkgewpAQCAtMTg1NSw2ICsxOTc1LDcgQEAKIAogCWlmICghZGNieF9pbmZvLT5vcGVyYXRpb25hbC5pZWVlKSB7CiAJCURQX0lORk8oaHdmbiwgIkRDQlggaXMgbm90IGVuYWJsZWQvb3BlcmF0aW9uYWwgaW4gSUVFRSBtb2RlXG4iKTsKKwkJa2ZyZWUoZGNieF9pbmZvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMDIzLDE3ICsyMTQ0LDE5IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQgcWVkX2RjYm5sX2llZWVfcGVlcl9nZXRldHMoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHN0cnVjdCBpZWVlX2V0cyAqZXRzKQorc3RhdGljIGludAorcWVkX2RjYm5sX2llZWVfcGVlcl9nZXRldHMoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHN0cnVjdCBpZWVlX2V0cyAqZXRzKQogewogCXJldHVybiBxZWRfZGNibmxfZ2V0X2llZWVfZXRzKGNkZXYsIGV0cywgdHJ1ZSk7CiB9CiAKLWludCBxZWRfZGNibmxfaWVlZV9wZWVyX2dldHBmYyhzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IGllZWVfcGZjICpwZmMpCitzdGF0aWMgaW50CitxZWRfZGNibmxfaWVlZV9wZWVyX2dldHBmYyhzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IGllZWVfcGZjICpwZmMpCiB7CiAJcmV0dXJuIHFlZF9kY2JubF9nZXRfaWVlZV9wZmMoY2RldiwgcGZjLCB0cnVlKTsKIH0KIAotaW50IHFlZF9kY2JubF9pZWVlX2dldGFwcChzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IGRjYl9hcHAgKmFwcCkKK3N0YXRpYyBpbnQgcWVkX2RjYm5sX2llZWVfZ2V0YXBwKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBzdHJ1Y3QgZGNiX2FwcCAqYXBwKQogewogCXN0cnVjdCBxZWRfaHdmbiAqaHdmbiA9IFFFRF9MRUFESU5HX0hXRk4oY2Rldik7CiAJc3RydWN0IHFlZF9kY2J4X2dldCAqZGNieF9pbmZvOwpAQCAtMjA3Nyw3ICsyMjAwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHFlZF9kY2JubF9pZWVlX3NldGFwcChzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IGRjYl9hcHAgKmFwcCkKK3N0YXRpYyBpbnQgcWVkX2RjYm5sX2llZWVfc2V0YXBwKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBzdHJ1Y3QgZGNiX2FwcCAqYXBwKQogewogCXN0cnVjdCBxZWRfaHdmbiAqaHdmbiA9IFFFRF9MRUFESU5HX0hXRk4oY2Rldik7CiAJc3RydWN0IHFlZF9kY2J4X2dldCAqZGNieF9pbmZvOwpAQCAtMjExNyw4ICsyMjQwLDEwIEBACiAJCSAgICAoZW50cnktPnByb3RvX2lkID09IGFwcC0+cHJvdG9jb2wpKQogCQkJYnJlYWs7CiAJCS8qIEZpcnN0IGVtcHR5IHNsb3QgKi8KLQkJaWYgKCFlbnRyeS0+cHJvdG9faWQpCisJCWlmICghZW50cnktPnByb3RvX2lkKSB7CisJCQlkY2J4X3NldC5jb25maWcucGFyYW1zLm51bV9hcHBfZW50cmllcysrOwogCQkJYnJlYWs7CisJCX0KIAl9CiAKIAlpZiAoaSA9PSBRRURfRENCWF9NQVhfQVBQX1BST1RPQ09MKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGU3ZDViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGVidWcuYwpAQCAtMCwwICsxLDY4OTggQEAKKy8qIFFMb2dpYyBxZWQgTklDIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDE1IFFMb2dpYyBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKKyAqIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgInFlZC5oIgorI2luY2x1ZGUgInFlZF9oc2kuaCIKKyNpbmNsdWRlICJxZWRfaHcuaCIKKyNpbmNsdWRlICJxZWRfbWNwLmgiCisjaW5jbHVkZSAicWVkX3JlZ19hZGRyLmgiCisKKy8qIENoaXAgSURzIGVudW0gKi8KK2VudW0gY2hpcF9pZHMgeworCUNISVBfUkVTRVJWRUQsCisJQ0hJUF9CQl9CMCwKKwlDSElQX0syLAorCU1BWF9DSElQX0lEUworfTsKKworLyogTWVtb3J5IGdyb3VwcyBlbnVtICovCitlbnVtIG1lbV9ncm91cHMgeworCU1FTV9HUk9VUF9QWFBfTUVNLAorCU1FTV9HUk9VUF9ETUFFX01FTSwKKwlNRU1fR1JPVVBfQ01fTUVNLAorCU1FTV9HUk9VUF9RTV9NRU0sCisJTUVNX0dST1VQX1RNX01FTSwKKwlNRU1fR1JPVVBfQlJCX1JBTSwKKwlNRU1fR1JPVVBfQlJCX01FTSwKKwlNRU1fR1JPVVBfUFJTX01FTSwKKwlNRU1fR1JPVVBfU0RNX01FTSwKKwlNRU1fR1JPVVBfUEJVRiwKKwlNRU1fR1JPVVBfSU9SLAorCU1FTV9HUk9VUF9SQU0sCisJTUVNX0dST1VQX0JUQl9SQU0sCisJTUVNX0dST1VQX1JESUZfQ1RYLAorCU1FTV9HUk9VUF9URElGX0NUWCwKKwlNRU1fR1JPVVBfQ09OTl9DRkNfTUVNLAorCU1FTV9HUk9VUF9UQVNLX0NGQ19NRU0sCisJTUVNX0dST1VQX0NBVV9QSSwKKwlNRU1fR1JPVVBfQ0FVX01FTSwKKwlNRU1fR1JPVVBfUFhQX0lMVCwKKwlNRU1fR1JPVVBfTVVMRF9NRU0sCisJTUVNX0dST1VQX0JUQl9NRU0sCisJTUVNX0dST1VQX0lHVV9NRU0sCisJTUVNX0dST1VQX0lHVV9NU0lYLAorCU1FTV9HUk9VUF9DQVVfU0IsCisJTUVNX0dST1VQX0JNQl9SQU0sCisJTUVNX0dST1VQX0JNQl9NRU0sCisJTUVNX0dST1VQU19OVU0KK307CisKKy8qIE1lbW9yeSBncm91cHMgbmFtZXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc19tZW1fZ3JvdXBfbmFtZXNbXSA9IHsKKwkiUFhQX01FTSIsCisJIkRNQUVfTUVNIiwKKwkiQ01fTUVNIiwKKwkiUU1fTUVNIiwKKwkiVE1fTUVNIiwKKwkiQlJCX1JBTSIsCisJIkJSQl9NRU0iLAorCSJQUlNfTUVNIiwKKwkiU0RNX01FTSIsCisJIlBCVUYiLAorCSJJT1IiLAorCSJSQU0iLAorCSJCVEJfUkFNIiwKKwkiUkRJRl9DVFgiLAorCSJURElGX0NUWCIsCisJIkNPTk5fQ0ZDX01FTSIsCisJIlRBU0tfQ0ZDX01FTSIsCisJIkNBVV9QSSIsCisJIkNBVV9NRU0iLAorCSJQWFBfSUxUIiwKKwkiTVVMRF9NRU0iLAorCSJCVEJfTUVNIiwKKwkiSUdVX01FTSIsCisJIklHVV9NU0lYIiwKKwkiQ0FVX1NCIiwKKwkiQk1CX1JBTSIsCisJIkJNQl9NRU0iLAorfTsKKworLyogSWRsZSBjaGVjayBjb25kaXRpb25zICovCitzdGF0aWMgdTMyIGNvbmQ0KGNvbnN0IHUzMiAqciwgY29uc3QgdTMyICppbW0pCit7CisJcmV0dXJuICgoclswXSAmIGltbVswXSkgIT0gaW1tWzFdKSAmJiAoKHJbMV0gJiBpbW1bMl0pICE9IGltbVszXSk7Cit9CisKK3N0YXRpYyB1MzIgY29uZDYoY29uc3QgdTMyICpyLCBjb25zdCB1MzIgKmltbSkKK3sKKwlyZXR1cm4gKChyWzBdID4+IGltbVswXSkgJiBpbW1bMV0pICE9IGltbVsyXTsKK30KKworc3RhdGljIHUzMiBjb25kNShjb25zdCB1MzIgKnIsIGNvbnN0IHUzMiAqaW1tKQoreworCXJldHVybiAoclswXSAmIGltbVswXSkgIT0gaW1tWzFdOworfQorCitzdGF0aWMgdTMyIGNvbmQ4KGNvbnN0IHUzMiAqciwgY29uc3QgdTMyICppbW0pCit7CisJcmV0dXJuICgoclswXSAmIGltbVswXSkgPj4gaW1tWzFdKSAhPQorCSAgICAoKChyWzBdICYgaW1tWzJdKSA+PiBpbW1bM10pIHwgKChyWzFdICYgaW1tWzRdKSA8PCBpbW1bNV0pKTsKK30KKworc3RhdGljIHUzMiBjb25kOShjb25zdCB1MzIgKnIsIGNvbnN0IHUzMiAqaW1tKQoreworCXJldHVybiAoKHJbMF0gJiBpbW1bMF0pID4+IGltbVsxXSkgIT0gKHJbMF0gJiBpbW1bMl0pOworfQorCitzdGF0aWMgdTMyIGNvbmQxKGNvbnN0IHUzMiAqciwgY29uc3QgdTMyICppbW0pCit7CisJcmV0dXJuIChyWzBdICYgfmltbVswXSkgIT0gaW1tWzFdOworfQorCitzdGF0aWMgdTMyIGNvbmQwKGNvbnN0IHUzMiAqciwgY29uc3QgdTMyICppbW0pCit7CisJcmV0dXJuIHJbMF0gIT0gaW1tWzBdOworfQorCitzdGF0aWMgdTMyIGNvbmQxMChjb25zdCB1MzIgKnIsIGNvbnN0IHUzMiAqaW1tKQoreworCXJldHVybiByWzBdICE9IHJbMV0gJiYgclsyXSA9PSBpbW1bMF07Cit9CisKK3N0YXRpYyB1MzIgY29uZDExKGNvbnN0IHUzMiAqciwgY29uc3QgdTMyICppbW0pCit7CisJcmV0dXJuIHJbMF0gIT0gclsxXSAmJiByWzJdID4gaW1tWzBdOworfQorCitzdGF0aWMgdTMyIGNvbmQzKGNvbnN0IHUzMiAqciwgY29uc3QgdTMyICppbW0pCit7CisJcmV0dXJuIHJbMF0gIT0gclsxXTsKK30KKworc3RhdGljIHUzMiBjb25kMTIoY29uc3QgdTMyICpyLCBjb25zdCB1MzIgKmltbSkKK3sKKwlyZXR1cm4gclswXSAmIGltbVswXTsKK30KKworc3RhdGljIHUzMiBjb25kNyhjb25zdCB1MzIgKnIsIGNvbnN0IHUzMiAqaW1tKQoreworCXJldHVybiByWzBdIDwgKHJbMV0gLSBpbW1bMF0pOworfQorCitzdGF0aWMgdTMyIGNvbmQyKGNvbnN0IHUzMiAqciwgY29uc3QgdTMyICppbW0pCit7CisJcmV0dXJuIHJbMF0gPiBpbW1bMF07Cit9CisKKy8qIEFycmF5IG9mIElkbGUgQ2hlY2sgY29uZGl0aW9ucyAqLworc3RhdGljIHUzMigqY29uZF9hcnJbXSkgKGNvbnN0IHUzMiAqciwgY29uc3QgdTMyICppbW0pID0geworCWNvbmQwLAorCWNvbmQxLAorCWNvbmQyLAorCWNvbmQzLAorCWNvbmQ0LAorCWNvbmQ1LAorCWNvbmQ2LAorCWNvbmQ3LAorCWNvbmQ4LAorCWNvbmQ5LAorCWNvbmQxMCwKKwljb25kMTEsCisJY29uZDEyLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitlbnVtIHBsYXRmb3JtX2lkcyB7CisJUExBVEZPUk1fQVNJQywKKwlQTEFURk9STV9SRVNFUlZFRCwKKwlQTEFURk9STV9SRVNFUlZFRDIsCisJUExBVEZPUk1fUkVTRVJWRUQzLAorCU1BWF9QTEFURk9STV9JRFMKK307CisKK3N0cnVjdCBkYmdfYXJyYXkgeworCWNvbnN0IHUzMiAqcHRyOworCXUzMiBzaXplX2luX2R3b3JkczsKK307CisKKy8qIENoaXAgY29uc3RhbnQgZGVmaW5pdGlvbnMgKi8KK3N0cnVjdCBjaGlwX2RlZnMgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IHsKKwkJdTggbnVtX3BvcnRzOworCQl1OCBudW1fcGZzOworCX0gcGVyX3BsYXRmb3JtW01BWF9QTEFURk9STV9JRFNdOworfTsKKworLyogUGxhdGZvcm0gY29uc3RhbnQgZGVmaW5pdGlvbnMgKi8KK3N0cnVjdCBwbGF0Zm9ybV9kZWZzIHsKKwljb25zdCBjaGFyICpuYW1lOworCXUzMiBkZWxheV9mYWN0b3I7Cit9OworCisvKiBTdG9ybSBjb25zdGFudCBkZWZpbml0aW9ucyAqLworc3RydWN0IHN0b3JtX2RlZnMgeworCWNoYXIgbGV0dGVyOworCWVudW0gYmxvY2tfaWQgYmxvY2tfaWQ7CisJZW51bSBkYmdfYnVzX2NsaWVudHMgZGJnX2NsaWVudF9pZFtNQVhfQ0hJUF9JRFNdOworCWJvb2wgaGFzX3ZmYzsKKwl1MzIgc2VtX2Zhc3RfbWVtX2FkZHI7CisJdTMyIHNlbV9mcmFtZV9tb2RlX2FkZHI7CisJdTMyIHNlbV9zbG93X2VuYWJsZV9hZGRyOworCXUzMiBzZW1fc2xvd19tb2RlX2FkZHI7CisJdTMyIHNlbV9zbG93X21vZGUxX2NvbmZfYWRkcjsKKwl1MzIgc2VtX3N5bmNfZGJnX2VtcHR5X2FkZHI7CisJdTMyIHNlbV9zbG93X2RiZ19lbXB0eV9hZGRyOworCXUzMiBjbV9jdHhfd3JfYWRkcjsKKwl1MzIgY21fY29ubl9hZ19jdHhfbGlkX3NpemU7IC8qIEluIHF1YWQtcmVncyAqLworCXUzMiBjbV9jb25uX2FnX2N0eF9yZF9hZGRyOworCXUzMiBjbV9jb25uX3N0X2N0eF9saWRfc2l6ZTsgLyogSW4gcXVhZC1yZWdzICovCisJdTMyIGNtX2Nvbm5fc3RfY3R4X3JkX2FkZHI7CisJdTMyIGNtX3Rhc2tfYWdfY3R4X2xpZF9zaXplOyAvKiBJbiBxdWFkLXJlZ3MgKi8KKwl1MzIgY21fdGFza19hZ19jdHhfcmRfYWRkcjsKKwl1MzIgY21fdGFza19zdF9jdHhfbGlkX3NpemU7IC8qIEluIHF1YWQtcmVncyAqLworCXUzMiBjbV90YXNrX3N0X2N0eF9yZF9hZGRyOworfTsKKworLyogQmxvY2sgY29uc3RhbnQgZGVmaW5pdGlvbnMgKi8KK3N0cnVjdCBibG9ja19kZWZzIHsKKwljb25zdCBjaGFyICpuYW1lOworCWJvb2wgaGFzX2RiZ19idXNbTUFYX0NISVBfSURTXTsKKwlib29sIGFzc29jaWF0ZWRfdG9fc3Rvcm07CisJdTMyIHN0b3JtX2lkOyAvKiBWYWxpZCBvbmx5IGlmIGFzc29jaWF0ZWRfdG9fc3Rvcm0gaXMgdHJ1ZSAqLworCWVudW0gZGJnX2J1c19jbGllbnRzIGRiZ19jbGllbnRfaWRbTUFYX0NISVBfSURTXTsKKwl1MzIgZGJnX3NlbGVjdF9hZGRyOworCXUzMiBkYmdfY3ljbGVfZW5hYmxlX2FkZHI7CisJdTMyIGRiZ19zaGlmdF9hZGRyOworCXUzMiBkYmdfZm9yY2VfdmFsaWRfYWRkcjsKKwl1MzIgZGJnX2ZvcmNlX2ZyYW1lX2FkZHI7CisJYm9vbCBoYXNfcmVzZXRfYml0OworCWJvb2wgdW5yZXNldDsgLyogSWYgdHJ1ZSwgdGhlIGJsb2NrIGlzIHRha2VuIG91dCBvZiByZXNldCBiZWZvcmUgZHVtcCAqLworCWVudW0gZGJnX3Jlc2V0X3JlZ3MgcmVzZXRfcmVnOworCXU4IHJlc2V0X2JpdF9vZmZzZXQ7IC8qIEJpdCBvZmZzZXQgaW4gcmVzZXQgcmVnaXN0ZXIgKi8KK307CisKKy8qIFJlc2V0IHJlZ2lzdGVyIGRlZmluaXRpb25zICovCitzdHJ1Y3QgcmVzZXRfcmVnX2RlZnMgeworCXUzMiBhZGRyOworCXUzMiB1bnJlc2V0X3ZhbDsKKwlib29sIGV4aXN0c1tNQVhfQ0hJUF9JRFNdOworfTsKKworc3RydWN0IGdyY19wYXJhbV9kZWZzIHsKKwl1MzIgZGVmYXVsdF92YWxbTUFYX0NISVBfSURTXTsKKwl1MzIgbWluOworCXUzMiBtYXg7CisJYm9vbCBpc19wcmVzZXQ7CisJdTMyIGV4Y2x1ZGVfYWxsX3ByZXNldF92YWw7CisJdTMyIGNyYXNoX3ByZXNldF92YWw7Cit9OworCitzdHJ1Y3QgcnNzX21lbV9kZWZzIHsKKwljb25zdCBjaGFyICptZW1fbmFtZTsKKwljb25zdCBjaGFyICp0eXBlX25hbWU7CisJdTMyIGFkZHI7IC8qIEluIDEyOGIgdW5pdHMgKi8KKwl1MzIgbnVtX2VudHJpZXNbTUFYX0NISVBfSURTXTsKKwl1MzIgZW50cnlfd2lkdGhbTUFYX0NISVBfSURTXTsgLyogSW4gYml0cyAqLworfTsKKworc3RydWN0IHZmY19yYW1fZGVmcyB7CisJY29uc3QgY2hhciAqbWVtX25hbWU7CisJY29uc3QgY2hhciAqdHlwZV9uYW1lOworCXUzMiBiYXNlX3JvdzsKKwl1MzIgbnVtX3Jvd3M7Cit9OworCitzdHJ1Y3QgYmlnX3JhbV9kZWZzIHsKKwljb25zdCBjaGFyICppbnN0YW5jZV9uYW1lOworCWVudW0gbWVtX2dyb3VwcyBtZW1fZ3JvdXBfaWQ7CisJZW51bSBtZW1fZ3JvdXBzIHJhbV9tZW1fZ3JvdXBfaWQ7CisJZW51bSBkYmdfZ3JjX3BhcmFtcyBncmNfcGFyYW07CisJdTMyIGFkZHJfcmVnX2FkZHI7CisJdTMyIGRhdGFfcmVnX2FkZHI7CisJdTMyIG51bV9vZl9ibG9ja3NbTUFYX0NISVBfSURTXTsKK307CisKK3N0cnVjdCBwaHlfZGVmcyB7CisJY29uc3QgY2hhciAqcGh5X25hbWU7CisJdTMyIGJhc2VfYWRkcjsKKwl1MzIgdGJ1c19hZGRyX2xvX2FkZHI7CisJdTMyIHRidXNfYWRkcl9oaV9hZGRyOworCXUzMiB0YnVzX2RhdGFfbG9fYWRkcjsKKwl1MzIgdGJ1c19kYXRhX2hpX2FkZHI7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUFYX0xDSURTCQkJMzIwCisjZGVmaW5lIE1BWF9MVElEUwkJCTMyMAorI2RlZmluZSBOVU1fSU9SX1NFVFMJCQkyCisjZGVmaW5lIElPUlNfUEVSX1NFVAkJCTE3NgorI2RlZmluZSBJT1JfU0VUX09GRlNFVChzZXRfaWQpCQkoKHNldF9pZCkgKiAyNTYpCisjZGVmaW5lIEJZVEVTX0lOX0RXT1JECQkJc2l6ZW9mKHUzMikKKworLyogSW4gdGhlIG1hY3JvcyBiZWxvdywgc2l6ZSBhbmQgb2Zmc2V0IGFyZSBzcGVjaWZpZWQgaW4gYml0cyAqLworI2RlZmluZSBDRUlMX0RXT1JEUyhzaXplKQkJRElWX1JPVU5EX1VQKHNpemUsIDMyKQorI2RlZmluZSBGSUVMRF9CSVRfT0ZGU0VUKHR5cGUsIGZpZWxkKQl0eXBlICMjIF8gIyMgZmllbGQgIyMgXyAjIyBPRkZTRVQKKyNkZWZpbmUgRklFTERfQklUX1NJWkUodHlwZSwgZmllbGQpCXR5cGUgIyMgXyAjIyBmaWVsZCAjIyBfICMjIFNJWkUKKyNkZWZpbmUgRklFTERfRFdPUkRfT0ZGU0VUKHR5cGUsIGZpZWxkKSBcCisJIChpbnQpKEZJRUxEX0JJVF9PRkZTRVQodHlwZSwgZmllbGQpIC8gMzIpCisjZGVmaW5lIEZJRUxEX0RXT1JEX1NISUZUKHR5cGUsIGZpZWxkKQkoRklFTERfQklUX09GRlNFVCh0eXBlLCBmaWVsZCkgJSAzMikKKyNkZWZpbmUgRklFTERfQklUX01BU0sodHlwZSwgZmllbGQpIFwKKwkoKCgxIDw8IEZJRUxEX0JJVF9TSVpFKHR5cGUsIGZpZWxkKSkgLSAxKSA8PCBcCisJIEZJRUxEX0RXT1JEX1NISUZUKHR5cGUsIGZpZWxkKSkKKyNkZWZpbmUgU0VUX1ZBUl9GSUVMRCh2YXIsIHR5cGUsIGZpZWxkLCB2YWwpIFwKKwlkbyB7IFwKKwkJdmFyW0ZJRUxEX0RXT1JEX09GRlNFVCh0eXBlLCBmaWVsZCldICY9CVwKKwkJKH5GSUVMRF9CSVRfTUFTSyh0eXBlLCBmaWVsZCkpOwlcCisJCXZhcltGSUVMRF9EV09SRF9PRkZTRVQodHlwZSwgZmllbGQpXSB8PSBcCisJCSh2YWwpIDw8IEZJRUxEX0RXT1JEX1NISUZUKHR5cGUsIGZpZWxkKTsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEFSUl9SRUdfV1IoZGV2LCBwdHQsIGFkZHIsIGFyciwgYXJyX3NpemUpIFwKKwlkbyB7IFwKKwkJZm9yIChpID0gMDsgaSA8IChhcnJfc2l6ZSk7IGkrKykgXAorCQkJcWVkX3dyKGRldiwgcHR0LCBhZGRyLAkoYXJyKVtpXSk7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBBUlJfUkVHX1JEKGRldiwgcHR0LCBhZGRyLCBhcnIsIGFycl9zaXplKSBcCisJZG8geyBcCisJCWZvciAoaSA9IDA7IGkgPCAoYXJyX3NpemUpOyBpKyspIFwKKwkJCShhcnIpW2ldID0gcWVkX3JkKGRldiwgcHR0LCBhZGRyKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgRFdPUkRTX1RPX0JZVEVTKGR3b3JkcykJCSgoZHdvcmRzKSAqIEJZVEVTX0lOX0RXT1JEKQorI2RlZmluZSBCWVRFU19UT19EV09SRFMoYnl0ZXMpCQkoKGJ5dGVzKSAvIEJZVEVTX0lOX0RXT1JEKQorI2RlZmluZSBSQU1fTElORVNfVE9fRFdPUkRTKGxpbmVzKQkoKGxpbmVzKSAqIDIpCisjZGVmaW5lIFJBTV9MSU5FU19UT19CWVRFUyhsaW5lcykgXAorCURXT1JEU19UT19CWVRFUyhSQU1fTElORVNfVE9fRFdPUkRTKGxpbmVzKSkKKyNkZWZpbmUgUkVHX0RVTVBfTEVOX1NISUZUCQkyNAorI2RlZmluZSBNRU1fRFVNUF9FTlRSWV9TSVpFX0RXT1JEUyBcCisJQllURVNfVE9fRFdPUkRTKHNpemVvZihzdHJ1Y3QgZGJnX2R1bXBfbWVtKSkKKyNkZWZpbmUgSURMRV9DSEtfUlVMRV9TSVpFX0RXT1JEUyBcCisJQllURVNfVE9fRFdPUkRTKHNpemVvZihzdHJ1Y3QgZGJnX2lkbGVfY2hrX3J1bGUpKQorI2RlZmluZSBJRExFX0NIS19SRVNVTFRfSERSX0RXT1JEUyBcCisJQllURVNfVE9fRFdPUkRTKHNpemVvZihzdHJ1Y3QgZGJnX2lkbGVfY2hrX3Jlc3VsdF9oZHIpKQorI2RlZmluZSBJRExFX0NIS19SRVNVTFRfUkVHX0hEUl9EV09SRFMgXAorCUJZVEVTX1RPX0RXT1JEUyhzaXplb2Yoc3RydWN0IGRiZ19pZGxlX2Noa19yZXN1bHRfcmVnX2hkcikpCisjZGVmaW5lIElETEVfQ0hLX01BWF9FTlRSSUVTX1NJWkUJMzIKKworLyogVGhlIHNpemVzIGFuZCBvZmZzZXRzIGJlbG93IGFyZSBzcGVjaWZpZWQgaW4gYml0cyAqLworI2RlZmluZSBWRkNfQ0FNX0NNRF9TVFJVQ1RfU0laRQkJNjQKKyNkZWZpbmUgVkZDX0NBTV9DTURfUk9XX09GRlNFVAkJNDgKKyNkZWZpbmUgVkZDX0NBTV9DTURfUk9XX1NJWkUJCTkKKyNkZWZpbmUgVkZDX0NBTV9BRERSX1NUUlVDVF9TSVpFCTE2CisjZGVmaW5lIFZGQ19DQU1fQUREUl9PUF9PRkZTRVQJCTAKKyNkZWZpbmUgVkZDX0NBTV9BRERSX09QX1NJWkUJCTQKKyNkZWZpbmUgVkZDX0NBTV9SRVNQX1NUUlVDVF9TSVpFCTI1NgorI2RlZmluZSBWRkNfUkFNX0FERFJfU1RSVUNUX1NJWkUJMTYKKyNkZWZpbmUgVkZDX1JBTV9BRERSX09QX09GRlNFVAkJMAorI2RlZmluZSBWRkNfUkFNX0FERFJfT1BfU0laRQkJMgorI2RlZmluZSBWRkNfUkFNX0FERFJfUk9XX09GRlNFVAkJMgorI2RlZmluZSBWRkNfUkFNX0FERFJfUk9XX1NJWkUJCTEwCisjZGVmaW5lIFZGQ19SQU1fUkVTUF9TVFJVQ1RfU0laRQkyNTYKKyNkZWZpbmUgVkZDX0NBTV9DTURfRFdPUkRTCQlDRUlMX0RXT1JEUyhWRkNfQ0FNX0NNRF9TVFJVQ1RfU0laRSkKKyNkZWZpbmUgVkZDX0NBTV9BRERSX0RXT1JEUwkJQ0VJTF9EV09SRFMoVkZDX0NBTV9BRERSX1NUUlVDVF9TSVpFKQorI2RlZmluZSBWRkNfQ0FNX1JFU1BfRFdPUkRTCQlDRUlMX0RXT1JEUyhWRkNfQ0FNX1JFU1BfU1RSVUNUX1NJWkUpCisjZGVmaW5lIFZGQ19SQU1fQ01EX0RXT1JEUwkJVkZDX0NBTV9DTURfRFdPUkRTCisjZGVmaW5lIFZGQ19SQU1fQUREUl9EV09SRFMJCUNFSUxfRFdPUkRTKFZGQ19SQU1fQUREUl9TVFJVQ1RfU0laRSkKKyNkZWZpbmUgVkZDX1JBTV9SRVNQX0RXT1JEUwkJQ0VJTF9EV09SRFMoVkZDX1JBTV9SRVNQX1NUUlVDVF9TSVpFKQorI2RlZmluZSBOVU1fVkZDX1JBTV9UWVBFUwkJNAorI2RlZmluZSBWRkNfQ0FNX05VTV9ST1dTCQk1MTIKKyNkZWZpbmUgVkZDX09QQ09ERV9DQU1fUkQJCTE0CisjZGVmaW5lIFZGQ19PUENPREVfUkFNX1JECQkwCisjZGVmaW5lIE5VTV9SU1NfTUVNX1RZUEVTCQk1CisjZGVmaW5lIE5VTV9CSUdfUkFNX1RZUEVTCQkzCisjZGVmaW5lIEJJR19SQU1fQkxPQ0tfU0laRV9CWVRFUwkxMjgKKyNkZWZpbmUgQklHX1JBTV9CTE9DS19TSVpFX0RXT1JEUyBcCisJQllURVNfVE9fRFdPUkRTKEJJR19SQU1fQkxPQ0tfU0laRV9CWVRFUykKKyNkZWZpbmUgTlVNX1BIWV9UQlVTX0FERFJFU1NFUwkJMjA0OAorI2RlZmluZSBQSFlfRFVNUF9TSVpFX0RXT1JEUwkJKE5VTV9QSFlfVEJVU19BRERSRVNTRVMgLyAyKQorI2RlZmluZSBSRVNFVF9SRUdfVU5SRVNFVF9PRkZTRVQJNAorI2RlZmluZSBTVEFMTF9ERUxBWV9NUwkJCTUwMAorI2RlZmluZSBTVEFUSUNfREVCVUdfTElORV9EV09SRFMJOQorI2RlZmluZSBOVU1fREJHX0JVU19MSU5FUwkJMjU2CisjZGVmaW5lIE5VTV9DT01NT05fR0xPQkFMX1BBUkFNUwk4CisjZGVmaW5lIEZXX0lNR19NQUlOCQkJMQorI2RlZmluZSBSRUdfRklGT19ERVBUSF9FTEVNRU5UUwkJMzIKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9EV09SRFMJCTIKKyNkZWZpbmUgUkVHX0ZJRk9fREVQVEhfRFdPUkRTIFwKKwkoUkVHX0ZJRk9fRUxFTUVOVF9EV09SRFMgKiBSRUdfRklGT19ERVBUSF9FTEVNRU5UUykKKyNkZWZpbmUgSUdVX0ZJRk9fREVQVEhfRUxFTUVOVFMJCTY0CisjZGVmaW5lIElHVV9GSUZPX0VMRU1FTlRfRFdPUkRTCQk0CisjZGVmaW5lIElHVV9GSUZPX0RFUFRIX0RXT1JEUyBcCisJKElHVV9GSUZPX0VMRU1FTlRfRFdPUkRTICogSUdVX0ZJRk9fREVQVEhfRUxFTUVOVFMpCisjZGVmaW5lIFBST1RFQ1RJT05fT1ZFUlJJREVfREVQVEhfRUxFTUVOVFMJMjAKKyNkZWZpbmUgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX0RXT1JEUwkyCisjZGVmaW5lIFBST1RFQ1RJT05fT1ZFUlJJREVfREVQVEhfRFdPUkRTIFwKKwkoUFJPVEVDVElPTl9PVkVSUklERV9ERVBUSF9FTEVNRU5UUyAqIFwKKwkgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX0RXT1JEUykKKyNkZWZpbmUgTUNQX1NQQURfVFJBQ0VfT0ZGU0laRV9BRERSIFwKKwkoTUNQX1JFR19TQ1JBVENIICsgXAorCSBvZmZzZXRvZihzdHJ1Y3Qgc3RhdGljX2luaXQsIHNlY3Rpb25zW1NQQURfU0VDVElPTl9UUkFDRV0pKQorI2RlZmluZSBNQ1BfVFJBQ0VfTUVUQV9JTUFHRV9TSUdOQVRVUkUgIDB4NjY5OTU1YWEKKyNkZWZpbmUgRU1QVFlfRldfVkVSU0lPTl9TVFIJCSI/Pz9fPz8/Xz8/P18/Pz8iCisjZGVmaW5lIEVNUFRZX0ZXX0lNQUdFX1NUUgkJIj8/Pz8/Pz8/Pz8/Pz8/PyIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENvbnN0YW50IEFycmF5cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZWJ1ZyBhcnJheXMgKi8KK3N0YXRpYyBzdHJ1Y3QgZGJnX2FycmF5IHNfZGJnX2FycmF5c1tNQVhfQklOX0RCR19CVUZGRVJfVFlQRV0gPSB7IHswfSB9OworCisvKiBDaGlwIGNvbnN0YW50IGRlZmluaXRpb25zIGFycmF5ICovCitzdGF0aWMgc3RydWN0IGNoaXBfZGVmcyBzX2NoaXBfZGVmc1tNQVhfQ0hJUF9JRFNdID0geworCXsgInJlc2VydmVkIiwgeyB7MCwgMH0sIHswLCAwfSwgezAsIDB9LCB7MCwgMH0gfSB9LAorCXsgImJiX2IwIiwKKwkgIHsge01BWF9OVU1fUE9SVFNfQkIsIE1BWF9OVU1fUEZTX0JCfSwgezAsIDB9LCB7MCwgMH0sIHswLCAwfSB9IH0sCisJeyAiazIiLCB7IHtNQVhfTlVNX1BPUlRTX0syLCBNQVhfTlVNX1BGU19LMn0sIHswLCAwfSwgezAsIDB9LCB7MCwgMH0gfSB9Cit9OworCisvKiBTdG9ybSBjb25zdGFudCBkZWZpbml0aW9ucyBhcnJheSAqLworc3RhdGljIHN0cnVjdCBzdG9ybV9kZWZzIHNfc3Rvcm1fZGVmc1tdID0geworCS8qIFRzdG9ybSAqLworCXsnVCcsIEJMT0NLX1RTRU0sCisJIHtEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNULAorCSAgREJHX0JVU19DTElFTlRfUkJDVH0sIHRydWUsCisJIFRTRU1fUkVHX0ZBU1RfTUVNT1JZLAorCSBUU0VNX1JFR19EQkdfRlJBTUVfTU9ERSwgVFNFTV9SRUdfU0xPV19EQkdfQUNUSVZFLAorCSBUU0VNX1JFR19TTE9XX0RCR19NT0RFLCBUU0VNX1JFR19EQkdfTU9ERTFfQ0ZHLAorCSBUU0VNX1JFR19TWU5DX0RCR19FTVBUWSwgVFNFTV9SRUdfU0xPV19EQkdfRU1QVFksCisJIFRDTV9SRUdfQ1RYX1JCQ19BQ0NTLAorCSA0LCBUQ01fUkVHX0FHR19DT05fQ1RYLAorCSAxNiwgVENNX1JFR19TTV9DT05fQ1RYLAorCSAyLCBUQ01fUkVHX0FHR19UQVNLX0NUWCwKKwkgNCwgVENNX1JFR19TTV9UQVNLX0NUWH0sCisJLyogTXN0b3JtICovCisJeydNJywgQkxPQ0tfTVNFTSwKKwkge0RCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ1QsCisJICBEQkdfQlVTX0NMSUVOVF9SQkNNfSwgZmFsc2UsCisJIE1TRU1fUkVHX0ZBU1RfTUVNT1JZLAorCSBNU0VNX1JFR19EQkdfRlJBTUVfTU9ERSwgTVNFTV9SRUdfU0xPV19EQkdfQUNUSVZFLAorCSBNU0VNX1JFR19TTE9XX0RCR19NT0RFLCBNU0VNX1JFR19EQkdfTU9ERTFfQ0ZHLAorCSBNU0VNX1JFR19TWU5DX0RCR19FTVBUWSwgTVNFTV9SRUdfU0xPV19EQkdfRU1QVFksCisJIE1DTV9SRUdfQ1RYX1JCQ19BQ0NTLAorCSAxLCBNQ01fUkVHX0FHR19DT05fQ1RYLAorCSAxMCwgTUNNX1JFR19TTV9DT05fQ1RYLAorCSAyLCBNQ01fUkVHX0FHR19UQVNLX0NUWCwKKwkgNywgTUNNX1JFR19TTV9UQVNLX0NUWH0sCisJLyogVXN0b3JtICovCisJeydVJywgQkxPQ0tfVVNFTSwKKwkge0RCR19CVVNfQ0xJRU5UX1JCQ1UsIERCR19CVVNfQ0xJRU5UX1JCQ1UsCisJICBEQkdfQlVTX0NMSUVOVF9SQkNVfSwgZmFsc2UsCisJIFVTRU1fUkVHX0ZBU1RfTUVNT1JZLAorCSBVU0VNX1JFR19EQkdfRlJBTUVfTU9ERSwgVVNFTV9SRUdfU0xPV19EQkdfQUNUSVZFLAorCSBVU0VNX1JFR19TTE9XX0RCR19NT0RFLCBVU0VNX1JFR19EQkdfTU9ERTFfQ0ZHLAorCSBVU0VNX1JFR19TWU5DX0RCR19FTVBUWSwgVVNFTV9SRUdfU0xPV19EQkdfRU1QVFksCisJIFVDTV9SRUdfQ1RYX1JCQ19BQ0NTLAorCSAyLCBVQ01fUkVHX0FHR19DT05fQ1RYLAorCSAxMywgVUNNX1JFR19TTV9DT05fQ1RYLAorCSAzLCBVQ01fUkVHX0FHR19UQVNLX0NUWCwKKwkgMywgVUNNX1JFR19TTV9UQVNLX0NUWH0sCisJLyogWHN0b3JtICovCisJeydYJywgQkxPQ0tfWFNFTSwKKwkge0RCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1gsCisJICBEQkdfQlVTX0NMSUVOVF9SQkNYfSwgZmFsc2UsCisJIFhTRU1fUkVHX0ZBU1RfTUVNT1JZLAorCSBYU0VNX1JFR19EQkdfRlJBTUVfTU9ERSwgWFNFTV9SRUdfU0xPV19EQkdfQUNUSVZFLAorCSBYU0VNX1JFR19TTE9XX0RCR19NT0RFLCBYU0VNX1JFR19EQkdfTU9ERTFfQ0ZHLAorCSBYU0VNX1JFR19TWU5DX0RCR19FTVBUWSwgWFNFTV9SRUdfU0xPV19EQkdfRU1QVFksCisJIFhDTV9SRUdfQ1RYX1JCQ19BQ0NTLAorCSA5LCBYQ01fUkVHX0FHR19DT05fQ1RYLAorCSAxNSwgWENNX1JFR19TTV9DT05fQ1RYLAorCSAwLCAwLAorCSAwLCAwfSwKKwkvKiBZc3Rvcm0gKi8KKwl7J1knLCBCTE9DS19ZU0VNLAorCSB7REJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWCwKKwkgIERCR19CVVNfQ0xJRU5UX1JCQ1l9LCBmYWxzZSwKKwkgWVNFTV9SRUdfRkFTVF9NRU1PUlksCisJIFlTRU1fUkVHX0RCR19GUkFNRV9NT0RFLCBZU0VNX1JFR19TTE9XX0RCR19BQ1RJVkUsCisJIFlTRU1fUkVHX1NMT1dfREJHX01PREUsIFlTRU1fUkVHX0RCR19NT0RFMV9DRkcsCisJIFlTRU1fUkVHX1NZTkNfREJHX0VNUFRZLCBUU0VNX1JFR19TTE9XX0RCR19FTVBUWSwKKwkgWUNNX1JFR19DVFhfUkJDX0FDQ1MsCisJIDIsIFlDTV9SRUdfQUdHX0NPTl9DVFgsCisJIDMsIFlDTV9SRUdfU01fQ09OX0NUWCwKKwkgMiwgWUNNX1JFR19BR0dfVEFTS19DVFgsCisJIDEyLCBZQ01fUkVHX1NNX1RBU0tfQ1RYfSwKKwkvKiBQc3Rvcm0gKi8KKwl7J1AnLCBCTE9DS19QU0VNLAorCSB7REJHX0JVU19DTElFTlRfUkJDUywgREJHX0JVU19DTElFTlRfUkJDUywKKwkgIERCR19CVVNfQ0xJRU5UX1JCQ1N9LCB0cnVlLAorCSBQU0VNX1JFR19GQVNUX01FTU9SWSwKKwkgUFNFTV9SRUdfREJHX0ZSQU1FX01PREUsIFBTRU1fUkVHX1NMT1dfREJHX0FDVElWRSwKKwkgUFNFTV9SRUdfU0xPV19EQkdfTU9ERSwgUFNFTV9SRUdfREJHX01PREUxX0NGRywKKwkgUFNFTV9SRUdfU1lOQ19EQkdfRU1QVFksIFBTRU1fUkVHX1NMT1dfREJHX0VNUFRZLAorCSBQQ01fUkVHX0NUWF9SQkNfQUNDUywKKwkgMCwgMCwKKwkgMTAsIFBDTV9SRUdfU01fQ09OX0NUWCwKKwkgMCwgMCwKKwkgMCwgMH0KK307CisKKy8qIEJsb2NrIGRlZmluaXRpb25zIGFycmF5ICovCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfZ3JjX2RlZnMgPSB7CisJImdyYyIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ04sIERCR19CVVNfQ0xJRU5UX1JCQ04sIERCR19CVVNfQ0xJRU5UX1JCQ059LAorCUdSQ19SRUdfREJHX1NFTEVDVCwgR1JDX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCUdSQ19SRUdfREJHX1NISUZULCBHUkNfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlHUkNfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1VBLCAxCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfbWlzY3NfZGVmcyA9IHsKKwkibWlzY3MiLCB7ZmFsc2UsIGZhbHNlLCBmYWxzZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTfSwKKwkwLCAwLCAwLCAwLCAwLAorCWZhbHNlLCBmYWxzZSwgTUFYX0RCR19SRVNFVF9SRUdTLCAwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfbWlzY19kZWZzID0geworCSJtaXNjIiwge2ZhbHNlLCBmYWxzZSwgZmFsc2V9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UU30sCisJMCwgMCwgMCwgMCwgMCwKKwlmYWxzZSwgZmFsc2UsIE1BWF9EQkdfUkVTRVRfUkVHUywgMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2RidV9kZWZzID0geworCSJkYnUiLCB7ZmFsc2UsIGZhbHNlLCBmYWxzZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTfSwKKwkwLCAwLCAwLCAwLCAwLAorCWZhbHNlLCBmYWxzZSwgTUFYX0RCR19SRVNFVF9SRUdTLCAwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcGdsdWVfYl9kZWZzID0geworCSJwZ2x1ZV9iIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDSCwgREJHX0JVU19DTElFTlRfUkJDSCwgREJHX0JVU19DTElFTlRfUkJDSH0sCisJUEdMVUVfQl9SRUdfREJHX1NFTEVDVCwgUEdMVUVfQl9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQR0xVRV9CX1JFR19EQkdfU0hJRlQsIFBHTFVFX0JfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQR0xVRV9CX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ1NfUExfSFYsIDEKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19jbmlnX2RlZnMgPSB7CisJImNuaWciLCB7ZmFsc2UsIGZhbHNlLCB0cnVlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIERCR19CVVNfQ0xJRU5UX1JCQ1d9LAorCUNOSUdfUkVHX0RCR19TRUxFQ1RfSzIsIENOSUdfUkVHX0RCR19EV09SRF9FTkFCTEVfSzIsCisJQ05JR19SRUdfREJHX1NISUZUX0syLCBDTklHX1JFR19EQkdfRk9SQ0VfVkFMSURfSzIsCisJQ05JR19SRUdfREJHX0ZPUkNFX0ZSQU1FX0syLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NTX1BMX0hWLCAwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfY3BtdV9kZWZzID0geworCSJjcG11Iiwge2ZhbHNlLCBmYWxzZSwgZmFsc2V9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UU30sCisJMCwgMCwgMCwgMCwgMCwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDU19QTF9IViwgOAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX25jc2lfZGVmcyA9IHsKKwkibmNzaSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1osIERCR19CVVNfQ0xJRU5UX1JCQ1osIERCR19CVVNfQ0xJRU5UX1JCQ1p9LAorCU5DU0lfUkVHX0RCR19TRUxFQ1QsIE5DU0lfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJTkNTSV9SRUdfREJHX1NISUZULCBOQ1NJX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJTkNTSV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NTX1BMX0hWLCA1Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfb3B0ZV9kZWZzID0geworCSJvcHRlIiwge2ZhbHNlLCBmYWxzZSwgZmFsc2V9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UU30sCisJMCwgMCwgMCwgMCwgMCwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDU19QTF9IViwgNAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2JtYl9kZWZzID0geworCSJibWIiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNaLCBEQkdfQlVTX0NMSUVOVF9SQkNaLCBEQkdfQlVTX0NMSUVOVF9SQkNCfSwKKwlCTUJfUkVHX0RCR19TRUxFQ1QsIEJNQl9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlCTUJfUkVHX0RCR19TSElGVCwgQk1CX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJQk1CX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ1NfUExfVUEsIDcKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wY2llX2RlZnMgPSB7CisJInBjaWUiLCB7ZmFsc2UsIGZhbHNlLCB0cnVlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIERCR19CVVNfQ0xJRU5UX1JCQ0h9LAorCVBDSUVfUkVHX0RCR19DT01NT05fU0VMRUNULCBQQ0lFX1JFR19EQkdfQ09NTU9OX0RXT1JEX0VOQUJMRSwKKwlQQ0lFX1JFR19EQkdfQ09NTU9OX1NISUZULCBQQ0lFX1JFR19EQkdfQ09NTU9OX0ZPUkNFX1ZBTElELAorCVBDSUVfUkVHX0RCR19DT01NT05fRk9SQ0VfRlJBTUUsCisJZmFsc2UsIGZhbHNlLCBNQVhfREJHX1JFU0VUX1JFR1MsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19tY3BfZGVmcyA9IHsKKwkibWNwIiwge2ZhbHNlLCBmYWxzZSwgZmFsc2V9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UU30sCisJMCwgMCwgMCwgMCwgMCwKKwlmYWxzZSwgZmFsc2UsIE1BWF9EQkdfUkVTRVRfUkVHUywgMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX21jcDJfZGVmcyA9IHsKKwkibWNwMiIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1osIERCR19CVVNfQ0xJRU5UX1JCQ1osIERCR19CVVNfQ0xJRU5UX1JCQ1p9LAorCU1DUDJfUkVHX0RCR19TRUxFQ1QsIE1DUDJfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJTUNQMl9SRUdfREJHX1NISUZULCBNQ1AyX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJTUNQMl9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCWZhbHNlLCBmYWxzZSwgTUFYX0RCR19SRVNFVF9SRUdTLCAwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcHN3aHN0X2RlZnMgPSB7CisJInBzd2hzdCIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1B9LAorCVBTV0hTVF9SRUdfREJHX1NFTEVDVCwgUFNXSFNUX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBTV0hTVF9SRUdfREJHX1NISUZULCBQU1dIU1RfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQU1dIU1RfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX0hWLCAwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcHN3aHN0Ml9kZWZzID0geworCSJwc3doc3QyIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUH0sCisJUFNXSFNUMl9SRUdfREJHX1NFTEVDVCwgUFNXSFNUMl9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQU1dIU1QyX1JFR19EQkdfU0hJRlQsIFBTV0hTVDJfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQU1dIU1QyX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9IViwgMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3Bzd3JkX2RlZnMgPSB7CisJInBzd3JkIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUH0sCisJUFNXUkRfUkVHX0RCR19TRUxFQ1QsIFBTV1JEX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBTV1JEX1JFR19EQkdfU0hJRlQsIFBTV1JEX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUFNXUkRfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX0hWLCAyCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcHN3cmQyX2RlZnMgPSB7CisJInBzd3JkMiIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1B9LAorCVBTV1JEMl9SRUdfREJHX1NFTEVDVCwgUFNXUkQyX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBTV1JEMl9SRUdfREJHX1NISUZULCBQU1dSRDJfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQU1dSRDJfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX0hWLCAyCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcHN3d3JfZGVmcyA9IHsKKwkicHN3d3IiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQfSwKKwlQU1dXUl9SRUdfREJHX1NFTEVDVCwgUFNXV1JfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUFNXV1JfUkVHX0RCR19TSElGVCwgUFNXV1JfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQU1dXUl9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfSFYsIDMKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wc3d3cjJfZGVmcyA9IHsKKwkicHN3d3IyIiwge2ZhbHNlLCBmYWxzZSwgZmFsc2V9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UU30sCisJMCwgMCwgMCwgMCwgMCwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX0hWLCAzCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcHN3cnFfZGVmcyA9IHsKKwkicHN3cnEiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQfSwKKwlQU1dSUV9SRUdfREJHX1NFTEVDVCwgUFNXUlFfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUFNXUlFfUkVHX0RCR19TSElGVCwgUFNXUlFfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQU1dSUV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfSFYsIDEKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wc3dycTJfZGVmcyA9IHsKKwkicHN3cnEyIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUH0sCisJUFNXUlEyX1JFR19EQkdfU0VMRUNULCBQU1dSUTJfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUFNXUlEyX1JFR19EQkdfU0hJRlQsIFBTV1JRMl9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBTV1JRMl9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfSFYsIDEKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wZ2xjc19kZWZzID0geworCSJwZ2xjcyIsIHtmYWxzZSwgZmFsc2UsIHRydWV9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgREJHX0JVU19DTElFTlRfUkJDSH0sCisJUEdMQ1NfUkVHX0RCR19TRUxFQ1QsIFBHTENTX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBHTENTX1JFR19EQkdfU0hJRlQsIFBHTENTX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUEdMQ1NfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDU19QTF9IViwgMgorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3B0dV9kZWZzID0geworCSJwdHUiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQfSwKKwlQVFVfUkVHX0RCR19TRUxFQ1QsIFBUVV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQVFVfUkVHX0RCR19TSElGVCwgUFRVX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUFRVX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCAyMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2RtYWVfZGVmcyA9IHsKKwkiZG1hZSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1B9LAorCURNQUVfUkVHX0RCR19TRUxFQ1QsIERNQUVfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJRE1BRV9SRUdfREJHX1NISUZULCBETUFFX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJRE1BRV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMjgKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja190Y21fZGVmcyA9IHsKKwkidGNtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfVFNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNUfSwKKwlUQ01fUkVHX0RCR19TRUxFQ1QsIFRDTV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlUQ01fUkVHX0RCR19TSElGVCwgVENNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJVENNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCA1Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfbWNtX2RlZnMgPSB7CisJIm1jbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX01TVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDTX0sCisJTUNNX1JFR19EQkdfU0VMRUNULCBNQ01fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJTUNNX1JFR19EQkdfU0hJRlQsIE1DTV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCU1DTV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgMworfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3VjbV9kZWZzID0geworCSJ1Y20iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19VU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1UsIERCR19CVVNfQ0xJRU5UX1JCQ1UsIERCR19CVVNfQ0xJRU5UX1JCQ1V9LAorCVVDTV9SRUdfREJHX1NFTEVDVCwgVUNNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVVDTV9SRUdfREJHX1NISUZULCBVQ01fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlVQ01fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDgKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja194Y21fZGVmcyA9IHsKKwkieGNtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfWFNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNYfSwKKwlYQ01fUkVHX0RCR19TRUxFQ1QsIFhDTV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlYQ01fUkVHX0RCR19TSElGVCwgWENNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJWENNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAxOQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3ljbV9kZWZzID0geworCSJ5Y20iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19ZU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1l9LAorCVlDTV9SRUdfREJHX1NFTEVDVCwgWUNNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVlDTV9SRUdfREJHX1NISUZULCBZQ01fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlZQ01fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDUKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wY21fZGVmcyA9IHsKKwkicGNtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfUFNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNTLCBEQkdfQlVTX0NMSUVOVF9SQkNTLCBEQkdfQlVTX0NMSUVOVF9SQkNTfSwKKwlQQ01fUkVHX0RCR19TRUxFQ1QsIFBDTV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQQ01fUkVHX0RCR19TSElGVCwgUENNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUENNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCA0Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcW1fZGVmcyA9IHsKKwkicW0iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNRfSwKKwlRTV9SRUdfREJHX1NFTEVDVCwgUU1fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUU1fUkVHX0RCR19TSElGVCwgUU1fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlRTV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMTYKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja190bV9kZWZzID0geworCSJ0bSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1MsIERCR19CVVNfQ0xJRU5UX1JCQ1MsIERCR19CVVNfQ0xJRU5UX1JCQ1N9LAorCVRNX1JFR19EQkdfU0VMRUNULCBUTV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlUTV9SRUdfREJHX1NISUZULCBUTV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVRNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAxNworfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2RvcnFfZGVmcyA9IHsKKwkiZG9ycSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1l9LAorCURPUlFfUkVHX0RCR19TRUxFQ1QsIERPUlFfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJRE9SUV9SRUdfREJHX1NISUZULCBET1JRX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJRE9SUV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMTgKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19icmJfZGVmcyA9IHsKKwkiYnJiIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUiwgREJHX0JVU19DTElFTlRfUkJDUiwgREJHX0JVU19DTElFTlRfUkJDUn0sCisJQlJCX1JFR19EQkdfU0VMRUNULCBCUkJfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJQlJCX1JFR19EQkdfU0hJRlQsIEJSQl9SRUdfREJHX0ZPUkNFX1ZBTElELAorCUJSQl9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3NyY19kZWZzID0geworCSJzcmMiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNGLCBEQkdfQlVTX0NMSUVOVF9SQkNGLCBEQkdfQlVTX0NMSUVOVF9SQkNGfSwKKwlTUkNfUkVHX0RCR19TRUxFQ1QsIFNSQ19SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlTUkNfUkVHX0RCR19TSElGVCwgU1JDX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJU1JDX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAyCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcHJzX2RlZnMgPSB7CisJInBycyIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1IsIERCR19CVVNfQ0xJRU5UX1JCQ1IsIERCR19CVVNfQ0xJRU5UX1JCQ1J9LAorCVBSU19SRUdfREJHX1NFTEVDVCwgUFJTX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBSU19SRUdfREJHX1NISUZULCBQUlNfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQUlNfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDEKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja190c2RtX2RlZnMgPSB7CisJInRzZG0iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19UU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ1R9LAorCVRTRE1fUkVHX0RCR19TRUxFQ1QsIFRTRE1fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJVFNETV9SRUdfREJHX1NISUZULCBUU0RNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJVFNETV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMworfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX21zZG1fZGVmcyA9IHsKKwkibXNkbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX01TVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDTX0sCisJTVNETV9SRUdfREJHX1NFTEVDVCwgTVNETV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlNU0RNX1JFR19EQkdfU0hJRlQsIE1TRE1fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlNU0RNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCA2Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfdXNkbV9kZWZzID0geworCSJ1c2RtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfVVNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNVLCBEQkdfQlVTX0NMSUVOVF9SQkNVLCBEQkdfQlVTX0NMSUVOVF9SQkNVfSwKKwlVU0RNX1JFR19EQkdfU0VMRUNULCBVU0RNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVVTRE1fUkVHX0RCR19TSElGVCwgVVNETV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVVTRE1fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDcKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja194c2RtX2RlZnMgPSB7CisJInhzZG0iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19YU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1h9LAorCVhTRE1fUkVHX0RCR19TRUxFQ1QsIFhTRE1fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJWFNETV9SRUdfREJHX1NISUZULCBYU0RNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJWFNETV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMjAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja195c2RtX2RlZnMgPSB7CisJInlzZG0iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19ZU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1l9LAorCVlTRE1fUkVHX0RCR19TRUxFQ1QsIFlTRE1fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJWVNETV9SRUdfREJHX1NISUZULCBZU0RNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJWVNETV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgOAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3BzZG1fZGVmcyA9IHsKKwkicHNkbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX1BTVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDUywgREJHX0JVU19DTElFTlRfUkJDUywgREJHX0JVU19DTElFTlRfUkJDU30sCisJUFNETV9SRUdfREJHX1NFTEVDVCwgUFNETV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQU0RNX1JFR19EQkdfU0hJRlQsIFBTRE1fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQU0RNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCA3Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfdHNlbV9kZWZzID0geworCSJ0c2VtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfVFNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNUfSwKKwlUU0VNX1JFR19EQkdfU0VMRUNULCBUU0VNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVRTRU1fUkVHX0RCR19TSElGVCwgVFNFTV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVRTRU1fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDQKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19tc2VtX2RlZnMgPSB7CisJIm1zZW0iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19NU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ019LAorCU1TRU1fUkVHX0RCR19TRUxFQ1QsIE1TRU1fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJTVNFTV9SRUdfREJHX1NISUZULCBNU0VNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJTVNFTV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgOQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3VzZW1fZGVmcyA9IHsKKwkidXNlbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX1VTVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDVSwgREJHX0JVU19DTElFTlRfUkJDVSwgREJHX0JVU19DTElFTlRfUkJDVX0sCisJVVNFTV9SRUdfREJHX1NFTEVDVCwgVVNFTV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlVU0VNX1JFR19EQkdfU0hJRlQsIFVTRU1fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlVU0VNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCA5Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfeHNlbV9kZWZzID0geworCSJ4c2VtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfWFNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNYfSwKKwlYU0VNX1JFR19EQkdfU0VMRUNULCBYU0VNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVhTRU1fUkVHX0RCR19TSElGVCwgWFNFTV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVhTRU1fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDIxCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfeXNlbV9kZWZzID0geworCSJ5c2VtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfWVNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNZfSwKKwlZU0VNX1JFR19EQkdfU0VMRUNULCBZU0VNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVlTRU1fUkVHX0RCR19TSElGVCwgWVNFTV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVlTRU1fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDExCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcHNlbV9kZWZzID0geworCSJwc2VtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfUFNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNTLCBEQkdfQlVTX0NMSUVOVF9SQkNTLCBEQkdfQlVTX0NMSUVOVF9SQkNTfSwKKwlQU0VNX1JFR19EQkdfU0VMRUNULCBQU0VNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBTRU1fUkVHX0RCR19TSElGVCwgUFNFTV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBTRU1fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDEwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcnNzX2RlZnMgPSB7CisJInJzcyIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ1R9LAorCVJTU19SRUdfREJHX1NFTEVDVCwgUlNTX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVJTU19SRUdfREJHX1NISUZULCBSU1NfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlSU1NfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDE4Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfdG1sZF9kZWZzID0geworCSJ0bWxkIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDTX0sCisJVE1MRF9SRUdfREJHX1NFTEVDVCwgVE1MRF9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlUTUxEX1JFR19EQkdfU0hJRlQsIFRNTERfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlUTUxEX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCAxMworfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX211bGRfZGVmcyA9IHsKKwkibXVsZCIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1UsIERCR19CVVNfQ0xJRU5UX1JCQ1UsIERCR19CVVNfQ0xJRU5UX1JCQ1V9LAorCU1VTERfUkVHX0RCR19TRUxFQ1QsIE1VTERfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJTVVMRF9SRUdfREJHX1NISUZULCBNVUxEX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJTVVMRF9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgMTQKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja195dWxkX2RlZnMgPSB7CisJInl1bGQiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNVLCBEQkdfQlVTX0NMSUVOVF9SQkNVLCBEQkdfQlVTX0NMSUVOVF9SQkNVfSwKKwlZVUxEX1JFR19EQkdfU0VMRUNULCBZVUxEX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVlVTERfUkVHX0RCR19TSElGVCwgWVVMRF9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVlVTERfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDE1Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfeHlsZF9kZWZzID0geworCSJ4eWxkIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWH0sCisJWFlMRF9SRUdfREJHX1NFTEVDVCwgWFlMRF9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlYWUxEX1JFR19EQkdfU0hJRlQsIFhZTERfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlYWUxEX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCAxMgorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3BybV9kZWZzID0geworCSJwcm0iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNNfSwKKwlQUk1fUkVHX0RCR19TRUxFQ1QsIFBSTV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQUk1fUkVHX0RCR19TSElGVCwgUFJNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUFJNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCAyMQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3BiZl9wYjFfZGVmcyA9IHsKKwkicGJmX3BiMSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1MsIERCR19CVVNfQ0xJRU5UX1JCQ1MsIERCR19CVVNfQ0xJRU5UX1JCQ1Z9LAorCVBCRl9QQjFfUkVHX0RCR19TRUxFQ1QsIFBCRl9QQjFfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUEJGX1BCMV9SRUdfREJHX1NISUZULCBQQkZfUEIxX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUEJGX1BCMV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwKKwkxMQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3BiZl9wYjJfZGVmcyA9IHsKKwkicGJmX3BiMiIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1MsIERCR19CVVNfQ0xJRU5UX1JCQ1MsIERCR19CVVNfQ0xJRU5UX1JCQ1Z9LAorCVBCRl9QQjJfUkVHX0RCR19TRUxFQ1QsIFBCRl9QQjJfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUEJGX1BCMl9SRUdfREJHX1NISUZULCBQQkZfUEIyX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUEJGX1BCMl9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwKKwkxMgorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3JwYl9kZWZzID0geworCSJycGIiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNNfSwKKwlSUEJfUkVHX0RCR19TRUxFQ1QsIFJQQl9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlSUEJfUkVHX0RCR19TSElGVCwgUlBCX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUlBCX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAxMworfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2J0Yl9kZWZzID0geworCSJidGIiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNSLCBEQkdfQlVTX0NMSUVOVF9SQkNSLCBEQkdfQlVTX0NMSUVOVF9SQkNWfSwKKwlCVEJfUkVHX0RCR19TRUxFQ1QsIEJUQl9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlCVEJfUkVHX0RCR19TSElGVCwgQlRCX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJQlRCX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAxMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3BiZl9kZWZzID0geworCSJwYmYiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNTLCBEQkdfQlVTX0NMSUVOVF9SQkNTLCBEQkdfQlVTX0NMSUVOVF9SQkNWfSwKKwlQQkZfUkVHX0RCR19TRUxFQ1QsIFBCRl9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQQkZfUkVHX0RCR19TSElGVCwgUEJGX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUEJGX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAxNQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3JkaWZfZGVmcyA9IHsKKwkicmRpZiIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ019LAorCVJESUZfUkVHX0RCR19TRUxFQ1QsIFJESUZfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUkRJRl9SRUdfREJHX1NISUZULCBSRElGX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUkRJRl9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgMTYKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja190ZGlmX2RlZnMgPSB7CisJInRkaWYiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNTLCBEQkdfQlVTX0NMSUVOVF9SQkNTLCBEQkdfQlVTX0NMSUVOVF9SQkNTfSwKKwlURElGX1JFR19EQkdfU0VMRUNULCBURElGX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVRESUZfUkVHX0RCR19TSElGVCwgVERJRl9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVRESUZfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDE3Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfY2R1X2RlZnMgPSB7CisJImNkdSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ0YsIERCR19CVVNfQ0xJRU5UX1JCQ0YsIERCR19CVVNfQ0xJRU5UX1JCQ0Z9LAorCUNEVV9SRUdfREJHX1NFTEVDVCwgQ0RVX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCUNEVV9SRUdfREJHX1NISUZULCBDRFVfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlDRFVfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDIzCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfY2NmY19kZWZzID0geworCSJjY2ZjIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDRiwgREJHX0JVU19DTElFTlRfUkJDRiwgREJHX0JVU19DTElFTlRfUkJDRn0sCisJQ0NGQ19SRUdfREJHX1NFTEVDVCwgQ0NGQ19SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlDQ0ZDX1JFR19EQkdfU0hJRlQsIENDRkNfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlDQ0ZDX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAyNAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3RjZmNfZGVmcyA9IHsKKwkidGNmYyIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ0YsIERCR19CVVNfQ0xJRU5UX1JCQ0YsIERCR19CVVNfQ0xJRU5UX1JCQ0Z9LAorCVRDRkNfUkVHX0RCR19TRUxFQ1QsIFRDRkNfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJVENGQ19SRUdfREJHX1NISUZULCBUQ0ZDX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJVENGQ19SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMjUKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19pZ3VfZGVmcyA9IHsKKwkiaWd1Iiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUH0sCisJSUdVX1JFR19EQkdfU0VMRUNULCBJR1VfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJSUdVX1JFR19EQkdfU0hJRlQsIElHVV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCUlHVV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMjcKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19jYXVfZGVmcyA9IHsKKwkiY2F1Iiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUH0sCisJQ0FVX1JFR19EQkdfU0VMRUNULCBDQVVfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJQ0FVX1JFR19EQkdfU0hJRlQsIENBVV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCUNBVV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgMTkKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja191bWFjX2RlZnMgPSB7CisJInVtYWMiLCB7ZmFsc2UsIGZhbHNlLCB0cnVlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIERCR19CVVNfQ0xJRU5UX1JCQ1p9LAorCVVNQUNfUkVHX0RCR19TRUxFQ1QsIFVNQUNfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJVU1BQ19SRUdfREJHX1NISUZULCBVTUFDX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJVU1BQ19SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NTX1BMX0hWLCA2Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfeG1hY19kZWZzID0geworCSJ4bWFjIiwge2ZhbHNlLCBmYWxzZSwgZmFsc2V9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UU30sCisJMCwgMCwgMCwgMCwgMCwKKwlmYWxzZSwgZmFsc2UsIE1BWF9EQkdfUkVTRVRfUkVHUywgMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2RiZ19kZWZzID0geworCSJkYmciLCB7ZmFsc2UsIGZhbHNlLCBmYWxzZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTfSwKKwkwLCAwLCAwLCAwLCAwLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVkFVWCwgMworfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX25pZ19kZWZzID0geworCSJuaWciLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNOLCBEQkdfQlVTX0NMSUVOVF9SQkNOLCBEQkdfQlVTX0NMSUVOVF9SQkNOfSwKKwlOSUdfUkVHX0RCR19TRUxFQ1QsIE5JR19SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlOSUdfUkVHX0RCR19TSElGVCwgTklHX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJTklHX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WQVVYLCAwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfd29sX2RlZnMgPSB7CisJIndvbCIsIHtmYWxzZSwgZmFsc2UsIHRydWV9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgREJHX0JVU19DTElFTlRfUkJDWn0sCisJV09MX1JFR19EQkdfU0VMRUNULCBXT0xfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJV09MX1JFR19EQkdfU0hJRlQsIFdPTF9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVdPTF9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVkFVWCwgNworfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2JtYm5fZGVmcyA9IHsKKwkiYm1ibiIsIHtmYWxzZSwgZmFsc2UsIHRydWV9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgREJHX0JVU19DTElFTlRfUkJDQn0sCisJQk1CTl9SRUdfREJHX1NFTEVDVCwgQk1CTl9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlCTUJOX1JFR19EQkdfU0hJRlQsIEJNQk5fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlCTUJOX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJZmFsc2UsIGZhbHNlLCBNQVhfREJHX1JFU0VUX1JFR1MsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19pcGNfZGVmcyA9IHsKKwkiaXBjIiwge2ZhbHNlLCBmYWxzZSwgZmFsc2V9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UU30sCisJMCwgMCwgMCwgMCwgMCwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDU19QTF9VQSwgOAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX253bV9kZWZzID0geworCSJud20iLCB7ZmFsc2UsIGZhbHNlLCB0cnVlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIERCR19CVVNfQ0xJRU5UX1JCQ1d9LAorCU5XTV9SRUdfREJHX1NFTEVDVCwgTldNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCU5XTV9SRUdfREJHX1NISUZULCBOV01fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlOV01fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDU19QTF9IVl8yLCAwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfbndzX2RlZnMgPSB7CisJIm53cyIsIHtmYWxzZSwgZmFsc2UsIGZhbHNlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFN9LAorCTAsIDAsIDAsIDAsIDAsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ1NfUExfSFYsIDEyCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfbXNfZGVmcyA9IHsKKwkibXMiLCB7ZmFsc2UsIGZhbHNlLCBmYWxzZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTfSwKKwkwLCAwLCAwLCAwLCAwLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NTX1BMX0hWLCAxMworfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3BoeV9wY2llX2RlZnMgPSB7CisJInBoeV9wY2llIiwge2ZhbHNlLCBmYWxzZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBEQkdfQlVTX0NMSUVOVF9SQkNIfSwKKwlQQ0lFX1JFR19EQkdfQ09NTU9OX1NFTEVDVCwgUENJRV9SRUdfREJHX0NPTU1PTl9EV09SRF9FTkFCTEUsCisJUENJRV9SRUdfREJHX0NPTU1PTl9TSElGVCwgUENJRV9SRUdfREJHX0NPTU1PTl9GT1JDRV9WQUxJRCwKKwlQQ0lFX1JFR19EQkdfQ09NTU9OX0ZPUkNFX0ZSQU1FLAorCWZhbHNlLCBmYWxzZSwgTUFYX0RCR19SRVNFVF9SRUdTLCAwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfbGVkX2RlZnMgPSB7CisJImxlZCIsIHtmYWxzZSwgZmFsc2UsIGZhbHNlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFN9LAorCTAsIDAsIDAsIDAsIDAsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDU19QTF9IViwgMTQKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19taXNjX2FldV9kZWZzID0geworCSJtaXNjX2FldSIsIHtmYWxzZSwgZmFsc2UsIGZhbHNlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFN9LAorCTAsIDAsIDAsIDAsIDAsCisJZmFsc2UsIGZhbHNlLCBNQVhfREJHX1JFU0VUX1JFR1MsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19iYXIwX21hcF9kZWZzID0geworCSJiYXIwX21hcCIsIHtmYWxzZSwgZmFsc2UsIGZhbHNlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFN9LAorCTAsIDAsIDAsIDAsIDAsCisJZmFsc2UsIGZhbHNlLCBNQVhfREJHX1JFU0VUX1JFR1MsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyAqc19ibG9ja19kZWZzW01BWF9CTE9DS19JRF0gPSB7CisJJmJsb2NrX2dyY19kZWZzLAorCSZibG9ja19taXNjc19kZWZzLAorCSZibG9ja19taXNjX2RlZnMsCisJJmJsb2NrX2RidV9kZWZzLAorCSZibG9ja19wZ2x1ZV9iX2RlZnMsCisJJmJsb2NrX2NuaWdfZGVmcywKKwkmYmxvY2tfY3BtdV9kZWZzLAorCSZibG9ja19uY3NpX2RlZnMsCisJJmJsb2NrX29wdGVfZGVmcywKKwkmYmxvY2tfYm1iX2RlZnMsCisJJmJsb2NrX3BjaWVfZGVmcywKKwkmYmxvY2tfbWNwX2RlZnMsCisJJmJsb2NrX21jcDJfZGVmcywKKwkmYmxvY2tfcHN3aHN0X2RlZnMsCisJJmJsb2NrX3Bzd2hzdDJfZGVmcywKKwkmYmxvY2tfcHN3cmRfZGVmcywKKwkmYmxvY2tfcHN3cmQyX2RlZnMsCisJJmJsb2NrX3Bzd3dyX2RlZnMsCisJJmJsb2NrX3Bzd3dyMl9kZWZzLAorCSZibG9ja19wc3dycV9kZWZzLAorCSZibG9ja19wc3dycTJfZGVmcywKKwkmYmxvY2tfcGdsY3NfZGVmcywKKwkmYmxvY2tfZG1hZV9kZWZzLAorCSZibG9ja19wdHVfZGVmcywKKwkmYmxvY2tfdGNtX2RlZnMsCisJJmJsb2NrX21jbV9kZWZzLAorCSZibG9ja191Y21fZGVmcywKKwkmYmxvY2tfeGNtX2RlZnMsCisJJmJsb2NrX3ljbV9kZWZzLAorCSZibG9ja19wY21fZGVmcywKKwkmYmxvY2tfcW1fZGVmcywKKwkmYmxvY2tfdG1fZGVmcywKKwkmYmxvY2tfZG9ycV9kZWZzLAorCSZibG9ja19icmJfZGVmcywKKwkmYmxvY2tfc3JjX2RlZnMsCisJJmJsb2NrX3Byc19kZWZzLAorCSZibG9ja190c2RtX2RlZnMsCisJJmJsb2NrX21zZG1fZGVmcywKKwkmYmxvY2tfdXNkbV9kZWZzLAorCSZibG9ja194c2RtX2RlZnMsCisJJmJsb2NrX3lzZG1fZGVmcywKKwkmYmxvY2tfcHNkbV9kZWZzLAorCSZibG9ja190c2VtX2RlZnMsCisJJmJsb2NrX21zZW1fZGVmcywKKwkmYmxvY2tfdXNlbV9kZWZzLAorCSZibG9ja194c2VtX2RlZnMsCisJJmJsb2NrX3lzZW1fZGVmcywKKwkmYmxvY2tfcHNlbV9kZWZzLAorCSZibG9ja19yc3NfZGVmcywKKwkmYmxvY2tfdG1sZF9kZWZzLAorCSZibG9ja19tdWxkX2RlZnMsCisJJmJsb2NrX3l1bGRfZGVmcywKKwkmYmxvY2tfeHlsZF9kZWZzLAorCSZibG9ja19wcm1fZGVmcywKKwkmYmxvY2tfcGJmX3BiMV9kZWZzLAorCSZibG9ja19wYmZfcGIyX2RlZnMsCisJJmJsb2NrX3JwYl9kZWZzLAorCSZibG9ja19idGJfZGVmcywKKwkmYmxvY2tfcGJmX2RlZnMsCisJJmJsb2NrX3JkaWZfZGVmcywKKwkmYmxvY2tfdGRpZl9kZWZzLAorCSZibG9ja19jZHVfZGVmcywKKwkmYmxvY2tfY2NmY19kZWZzLAorCSZibG9ja190Y2ZjX2RlZnMsCisJJmJsb2NrX2lndV9kZWZzLAorCSZibG9ja19jYXVfZGVmcywKKwkmYmxvY2tfdW1hY19kZWZzLAorCSZibG9ja194bWFjX2RlZnMsCisJJmJsb2NrX2RiZ19kZWZzLAorCSZibG9ja19uaWdfZGVmcywKKwkmYmxvY2tfd29sX2RlZnMsCisJJmJsb2NrX2JtYm5fZGVmcywKKwkmYmxvY2tfaXBjX2RlZnMsCisJJmJsb2NrX253bV9kZWZzLAorCSZibG9ja19ud3NfZGVmcywKKwkmYmxvY2tfbXNfZGVmcywKKwkmYmxvY2tfcGh5X3BjaWVfZGVmcywKKwkmYmxvY2tfbGVkX2RlZnMsCisJJmJsb2NrX21pc2NfYWV1X2RlZnMsCisJJmJsb2NrX2JhcjBfbWFwX2RlZnMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RlZnMgc19wbGF0Zm9ybV9kZWZzW10gPSB7CisJeyJhc2ljIiwgMX0sCisJeyJyZXNlcnZlZCIsIDB9LAorCXsicmVzZXJ2ZWQyIiwgMH0sCisJeyJyZXNlcnZlZDMiLCAwfQorfTsKKworc3RhdGljIHN0cnVjdCBncmNfcGFyYW1fZGVmcyBzX2dyY19wYXJhbV9kZWZzW10gPSB7CisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDEsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfVFNUT1JNICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDEsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfTVNUT1JNICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDEsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfVVNUT1JNICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDEsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfWFNUT1JNICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDEsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfWVNUT1JNICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDEsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfUFNUT1JNICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfUkVHUyAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX1JBTSAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX1BCVUYgKi8KKwl7ezAsIDAsIDB9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9JT1IgKi8KKwl7ezAsIDAsIDB9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9WRkMgKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9DTV9DVFggKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9JTFQgKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9SU1MgKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9DQVUgKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9RTSAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX01DUCAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9SRVNFUlZFRCAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX0NGQyAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX0lHVSAqLworCXt7MCwgMCwgMH0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX0JSQiAqLworCXt7MCwgMCwgMH0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX0JUQiAqLworCXt7MCwgMCwgMH0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX0JNQiAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX05JRyAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX01VTEQgKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9QUlMgKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9ETUFFICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfVE0gKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9TRE0gKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9ESUYgKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9TVEFUSUMgKi8KKwl7ezAsIDAsIDB9LCAwLCAxLCBmYWxzZSwgMCwgMH0sCS8qIERCR19HUkNfUEFSQU1fVU5TVEFMTCAqLworCXt7TUFYX0xDSURTLCBNQVhfTENJRFMsIE1BWF9MQ0lEU30sIDEsIE1BWF9MQ0lEUywgZmFsc2UsIE1BWF9MQ0lEUywKKwkgTUFYX0xDSURTfSwJCQkvKiBEQkdfR1JDX1BBUkFNX05VTV9MQ0lEUyAqLworCXt7TUFYX0xUSURTLCBNQVhfTFRJRFMsIE1BWF9MVElEU30sIDEsIE1BWF9MVElEUywgZmFsc2UsIE1BWF9MVElEUywKKwkgTUFYX0xUSURTfSwJCQkvKiBEQkdfR1JDX1BBUkFNX05VTV9MVElEUyAqLworCXt7MCwgMCwgMH0sIDAsIDEsIHRydWUsIDAsIDB9LAkvKiBEQkdfR1JDX1BBUkFNX0VYQ0xVREVfQUxMICovCisJe3swLCAwLCAwfSwgMCwgMSwgdHJ1ZSwgMCwgMH0sCS8qIERCR19HUkNfUEFSQU1fQ1JBU0ggKi8KKwl7ezAsIDAsIDB9LCAwLCAxLCBmYWxzZSwgMSwgMH0sCS8qIERCR19HUkNfUEFSQU1fUEFSSVRZX1NBRkUgKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9DTSAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfQkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfUEhZICovCit9OworCitzdGF0aWMgc3RydWN0IHJzc19tZW1fZGVmcyBzX3Jzc19tZW1fZGVmc1tdID0geworCXsgInJzc19tZW1fY2lkIiwgInJzc19jaWQiLCAwLAorCSAgezI1NiwgMjU2LCAzMjB9LAorCSAgezMyLCAzMiwgMzJ9IH0sCisJeyAicnNzX21lbV9rZXlfbXNiIiwgInJzc19rZXkiLCAxMDI0LAorCSAgezEyOCwgMTI4LCAyMDh9LAorCSAgezI1NiwgMjU2LCAyNTZ9IH0sCisJeyAicnNzX21lbV9rZXlfbHNiIiwgInJzc19rZXkiLCAyMDQ4LAorCSAgezEyOCwgMTI4LCAyMDh9LAorCSAgezY0LCA2NCwgNjR9IH0sCisJeyAicnNzX21lbV9pbmZvIiwgInJzc19pbmZvIiwgMzA3MiwKKwkgIHsxMjgsIDEyOCwgMjA4fSwKKwkgIHsxNiwgMTYsIDE2fSB9LAorCXsgInJzc19tZW1faW5kIiwgInJzc19pbmQiLCA0MDk2LAorCSAgeygxMjggKiAxMjgpLCAoMTI4ICogMTI4KSwgKDEyOCAqIDIwOCl9LAorCSAgezE2LCAxNiwgMTZ9IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdmZjX3JhbV9kZWZzIHNfdmZjX3JhbV9kZWZzW10gPSB7CisJeyJ2ZmNfcmFtX3R0MSIsICJ2ZmNfcmFtIiwgMCwgNTEyfSwKKwl7InZmY19yYW1fbXR0MiIsICJ2ZmNfcmFtIiwgNTEyLCAxMjh9LAorCXsidmZjX3JhbV9zdHQyIiwgInZmY19yYW0iLCA2NDAsIDMyfSwKKwl7InZmY19yYW1fcm9fdmVjdCIsICJ2ZmNfcmFtIiwgNjcyLCAzMn0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYmlnX3JhbV9kZWZzIHNfYmlnX3JhbV9kZWZzW10gPSB7CisJeyAiQlJCIiwgTUVNX0dST1VQX0JSQl9NRU0sIE1FTV9HUk9VUF9CUkJfUkFNLCBEQkdfR1JDX1BBUkFNX0RVTVBfQlJCLAorCSAgQlJCX1JFR19CSUdfUkFNX0FERFJFU1MsIEJSQl9SRUdfQklHX1JBTV9EQVRBLAorCSAgezQ4MDAsIDQ4MDAsIDU2MzJ9IH0sCisJeyAiQlRCIiwgTUVNX0dST1VQX0JUQl9NRU0sIE1FTV9HUk9VUF9CVEJfUkFNLCBEQkdfR1JDX1BBUkFNX0RVTVBfQlRCLAorCSAgQlRCX1JFR19CSUdfUkFNX0FERFJFU1MsIEJUQl9SRUdfQklHX1JBTV9EQVRBLAorCSAgezI4ODAsIDI4ODAsIDM2ODB9IH0sCisJeyAiQk1CIiwgTUVNX0dST1VQX0JNQl9NRU0sIE1FTV9HUk9VUF9CTUJfUkFNLCBEQkdfR1JDX1BBUkFNX0RVTVBfQk1CLAorCSAgQk1CX1JFR19CSUdfUkFNX0FERFJFU1MsIEJNQl9SRUdfQklHX1JBTV9EQVRBLAorCSAgezExNTIsIDExNTIsIDExNTJ9IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzZXRfcmVnX2RlZnMgc19yZXNldF9yZWdzX2RlZnNbXSA9IHsKKwl7IE1JU0NTX1JFR19SRVNFVF9QTF9VQSwgMHgwLAorCSAge3RydWUsIHRydWUsIHRydWV9IH0sCQkvKiBEQkdfUkVTRVRfUkVHX01JU0NTX1BMX1VBICovCisJeyBNSVNDU19SRUdfUkVTRVRfUExfSFYsIDB4MCwKKwkgIHt0cnVlLCB0cnVlLCB0cnVlfSB9LAkJLyogREJHX1JFU0VUX1JFR19NSVNDU19QTF9IViAqLworCXsgTUlTQ1NfUkVHX1JFU0VUX1BMX0hWXzIsIDB4MCwKKwkgIHtmYWxzZSwgZmFsc2UsIHRydWV9IH0sCS8qIERCR19SRVNFVF9SRUdfTUlTQ1NfUExfSFZfMiAqLworCXsgTUlTQ19SRUdfUkVTRVRfUExfVUEsIDB4MCwKKwkgIHt0cnVlLCB0cnVlLCB0cnVlfSB9LAkJLyogREJHX1JFU0VUX1JFR19NSVNDX1BMX1VBICovCisJeyBNSVNDX1JFR19SRVNFVF9QTF9IViwgMHgwLAorCSAge3RydWUsIHRydWUsIHRydWV9IH0sCQkvKiBEQkdfUkVTRVRfUkVHX01JU0NfUExfSFYgKi8KKwl7IE1JU0NfUkVHX1JFU0VUX1BMX1BEQV9WTUFJTl8xLCAweDQ0MDQwNDAsCisJICB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0gfSwJCS8qIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSAqLworCXsgTUlTQ19SRUdfUkVTRVRfUExfUERBX1ZNQUlOXzIsIDB4N2MwMDAwNywKKwkgIHt0cnVlLCB0cnVlLCB0cnVlfSB9LAkJLyogREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yICovCisJeyBNSVNDX1JFR19SRVNFVF9QTF9QREFfVkFVWCwgMHgyLAorCSAge3RydWUsIHRydWUsIHRydWV9IH0sCQkvKiBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZBVVggKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5X2RlZnMgc19waHlfZGVmc1tdID0geworCXsibndfcGh5IiwgTldTX1JFR19OV1NfQ01VLCBQSFlfTldfSVBfUkVHX1BIWTBfVE9QX1RCVVNfQUREUl83XzAsCisJIFBIWV9OV19JUF9SRUdfUEhZMF9UT1BfVEJVU19BRERSXzE1XzgsCisJIFBIWV9OV19JUF9SRUdfUEhZMF9UT1BfVEJVU19EQVRBXzdfMCwKKwkgUEhZX05XX0lQX1JFR19QSFkwX1RPUF9UQlVTX0RBVEFfMTFfOH0sCisJeyJzZ21paV9waHkiLCBNU19SRUdfTVNfQ01VLCBQSFlfU0dNSUlfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMiwKKwkgUEhZX1NHTUlJX0lQX1JFR19BSEJfQ01VX0NTUl8wX1gxMzMsCisJIFBIWV9TR01JSV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMwLAorCSBQSFlfU0dNSUlfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMX0sCisJeyJwY2llX3BoeTAiLCBQSFlfUENJRV9SRUdfUEhZMCwgUEhZX1BDSUVfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMiwKKwkgUEhZX1BDSUVfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMywKKwkgUEhZX1BDSUVfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMCwKKwkgUEhZX1BDSUVfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMX0sCisJeyJwY2llX3BoeTEiLCBQSFlfUENJRV9SRUdfUEhZMSwgUEhZX1BDSUVfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMiwKKwkgUEhZX1BDSUVfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMywKKwkgUEhZX1BDSUVfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMCwKKwkgUEhZX1BDSUVfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMX0sCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQcml2YXRlIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJlYWRzIGFuZCByZXR1cm5zIGEgc2luZ2xlIGR3b3JkIGZyb20gdGhlIHNwZWNpZmllZCB1bmFsaWduZWQgYnVmZmVyICovCitzdGF0aWMgdTMyIHFlZF9yZWFkX3VuYWxpZ25lZF9kd29yZCh1OCAqYnVmKQoreworCXUzMiBkd29yZDsKKworCW1lbWNweSgodTggKikmZHdvcmQsIGJ1Ziwgc2l6ZW9mKGR3b3JkKSk7CisJcmV0dXJuIGR3b3JkOworfQorCisvKiBJbml0aWFsaXplcyBkZWJ1ZyBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIGRldmljZSAqLworc3RhdGljIGVudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2Rldl9pbml0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCisJaWYgKGRldl9kYXRhLT5pbml0aWFsaXplZCkKKwkJcmV0dXJuIERCR19TVEFUVVNfT0s7CisKKwlpZiAoUUVEX0lTX0syKHBfaHdmbi0+Y2RldikpIHsKKwkJZGV2X2RhdGEtPmNoaXBfaWQgPSBDSElQX0syOworCQlkZXZfZGF0YS0+bW9kZV9lbmFibGVbTU9ERV9LMl0gPSAxOworCX0gZWxzZSBpZiAoUUVEX0lTX0JCX0IwKHBfaHdmbi0+Y2RldikpIHsKKwkJZGV2X2RhdGEtPmNoaXBfaWQgPSBDSElQX0JCX0IwOworCQlkZXZfZGF0YS0+bW9kZV9lbmFibGVbTU9ERV9CQl9CMF0gPSAxOworCX0gZWxzZSB7CisJCXJldHVybiBEQkdfU1RBVFVTX1VOS05PV05fQ0hJUDsKKwl9CisKKwlkZXZfZGF0YS0+cGxhdGZvcm1faWQgPSBQTEFURk9STV9BU0lDOworCWRldl9kYXRhLT5tb2RlX2VuYWJsZVtNT0RFX0FTSUNdID0gMTsKKwlkZXZfZGF0YS0+aW5pdGlhbGl6ZWQgPSB0cnVlOworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCisvKiBSZWFkcyB0aGUgRlcgaW5mbyBzdHJ1Y3R1cmUgZm9yIHRoZSBzcGVjaWZpZWQgU3Rvcm0gZnJvbSB0aGUgY2hpcCwKKyAqIGFuZCB3cml0ZXMgaXQgdG8gdGhlIHNwZWNpZmllZCBmd19pbmZvIHBvaW50ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHFlZF9yZWFkX2Z3X2luZm8oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCSAgICAgdTggc3Rvcm1faWQsIHN0cnVjdCBmd19pbmZvICpmd19pbmZvKQoreworCS8qIFJlYWQgZmlyc3QgdGhlIGFkZHJlc3MgdGhhdCBwb2ludHMgdG8gZndfaW5mbyBsb2NhdGlvbi4KKwkgKiBUaGUgYWRkcmVzcyBpcyBsb2NhdGVkIGluIHRoZSBsYXN0IGxpbmUgb2YgdGhlIFN0b3JtIFJBTS4KKwkgKi8KKwl1MzIgYWRkciA9IHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uc2VtX2Zhc3RfbWVtX2FkZHIgKworCQkgICBTRU1fRkFTVF9SRUdfSU5UX1JBTSArCisJCSAgIERXT1JEU19UT19CWVRFUyhTRU1fRkFTVF9SRUdfSU5UX1JBTV9TSVpFKSAtCisJCSAgIHNpemVvZihzdHJ1Y3QgZndfaW5mb19sb2NhdGlvbik7CisJc3RydWN0IGZ3X2luZm9fbG9jYXRpb24gZndfaW5mb19sb2NhdGlvbjsKKwl1MzIgKmRlc3QgPSAodTMyICopJmZ3X2luZm9fbG9jYXRpb247CisJdTMyIGk7CisKKwltZW1zZXQoJmZ3X2luZm9fbG9jYXRpb24sIDAsIHNpemVvZihmd19pbmZvX2xvY2F0aW9uKSk7CisJbWVtc2V0KGZ3X2luZm8sIDAsIHNpemVvZigqZndfaW5mbykpOworCWZvciAoaSA9IDA7IGkgPCBCWVRFU19UT19EV09SRFMoc2l6ZW9mKGZ3X2luZm9fbG9jYXRpb24pKTsKKwkgICAgIGkrKywgYWRkciArPSBCWVRFU19JTl9EV09SRCkKKwkJZGVzdFtpXSA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LCBhZGRyKTsKKwlpZiAoZndfaW5mb19sb2NhdGlvbi5zaXplID4gMCAmJiBmd19pbmZvX2xvY2F0aW9uLnNpemUgPD0KKwkgICAgc2l6ZW9mKCpmd19pbmZvKSkgeworCQkvKiBSZWFkIEZXIHZlcnNpb24gaW5mbyBmcm9tIFN0b3JtIFJBTSAqLworCQlhZGRyID0gZndfaW5mb19sb2NhdGlvbi5ncmNfYWRkcjsKKwkJZGVzdCA9ICh1MzIgKilmd19pbmZvOworCQlmb3IgKGkgPSAwOyBpIDwgQllURVNfVE9fRFdPUkRTKGZ3X2luZm9fbG9jYXRpb24uc2l6ZSk7CisJCSAgICAgaSsrLCBhZGRyICs9IEJZVEVTX0lOX0RXT1JEKQorCQkJZGVzdFtpXSA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LCBhZGRyKTsKKwl9Cit9CisKKy8qIER1bXBzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZQorICogaW4gYnl0ZXMgKGFjdHVhbCBsZW5ndGggKyAxIGZvciB0aGUgbnVsbCBjaGFyYWN0ZXIgdGVybWluYXRpb24pLgorICovCitzdGF0aWMgdTMyIHFlZF9kdW1wX3N0cihjaGFyICpkdW1wX2J1ZiwgYm9vbCBkdW1wLCBjb25zdCBjaGFyICpzdHIpCit7CisJaWYgKGR1bXApCisJCXN0cmNweShkdW1wX2J1Ziwgc3RyKTsKKwlyZXR1cm4gKHUzMilzdHJsZW4oc3RyKSArIDE7Cit9CisKKy8qIER1bXBzIHplcm9zIHRvIGFsaWduIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHRvIGR3b3Jkcy4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUKKyAqIGluIGJ5dGVzLgorICovCitzdGF0aWMgdTMyIHFlZF9kdW1wX2FsaWduKGNoYXIgKmR1bXBfYnVmLCBib29sIGR1bXAsIHUzMiBieXRlX29mZnNldCkKK3sKKwl1OCBvZmZzZXRfaW5fZHdvcmQgPSAodTgpKGJ5dGVfb2Zmc2V0ICYgMHgzKSwgYWxpZ25fc2l6ZTsKKworCWFsaWduX3NpemUgPSBvZmZzZXRfaW5fZHdvcmQgPyBCWVRFU19JTl9EV09SRCAtIG9mZnNldF9pbl9kd29yZCA6IDA7CisKKwlpZiAoZHVtcCAmJiBhbGlnbl9zaXplKQorCQltZW1zZXQoZHVtcF9idWYsIDAsIGFsaWduX3NpemUpOworCXJldHVybiBhbGlnbl9zaXplOworfQorCisvKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgcGFyYW0gdG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2R1bXBfc3RyX3BhcmFtKHUzMiAqZHVtcF9idWYsCisJCQkgICAgICBib29sIGR1bXAsCisJCQkgICAgICBjb25zdCBjaGFyICpwYXJhbV9uYW1lLCBjb25zdCBjaGFyICpwYXJhbV92YWwpCit7CisJY2hhciAqY2hhcl9idWYgPSAoY2hhciAqKWR1bXBfYnVmOworCXUzMiBvZmZzZXQgPSAwOworCisJLyogRHVtcCBwYXJhbSBuYW1lICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cihjaGFyX2J1ZiArIG9mZnNldCwgZHVtcCwgcGFyYW1fbmFtZSk7CisKKwkvKiBJbmRpY2F0ZSBhIHN0cmluZyBwYXJhbSB2YWx1ZSAqLworCWlmIChkdW1wKQorCQkqKGNoYXJfYnVmICsgb2Zmc2V0KSA9IDE7CisJb2Zmc2V0Kys7CisKKwkvKiBEdW1wIHBhcmFtIHZhbHVlICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cihjaGFyX2J1ZiArIG9mZnNldCwgZHVtcCwgcGFyYW1fdmFsKTsKKworCS8qIEFsaWduIGJ1ZmZlciB0byBuZXh0IGR3b3JkICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX2FsaWduKGNoYXJfYnVmICsgb2Zmc2V0LCBkdW1wLCBvZmZzZXQpOworCXJldHVybiBCWVRFU19UT19EV09SRFMob2Zmc2V0KTsKK30KKworLyogV3JpdGVzIHRoZSBzcGVjaWZpZWQgbnVtZXJpYyBwYXJhbSB0byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqLworc3RhdGljIHUzMiBxZWRfZHVtcF9udW1fcGFyYW0odTMyICpkdW1wX2J1ZiwKKwkJCSAgICAgIGJvb2wgZHVtcCwgY29uc3QgY2hhciAqcGFyYW1fbmFtZSwgdTMyIHBhcmFtX3ZhbCkKK3sKKwljaGFyICpjaGFyX2J1ZiA9IChjaGFyICopZHVtcF9idWY7CisJdTMyIG9mZnNldCA9IDA7CisKKwkvKiBEdW1wIHBhcmFtIG5hbWUgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyKGNoYXJfYnVmICsgb2Zmc2V0LCBkdW1wLCBwYXJhbV9uYW1lKTsKKworCS8qIEluZGljYXRlIGEgbnVtZXJpYyBwYXJhbSB2YWx1ZSAqLworCWlmIChkdW1wKQorCQkqKGNoYXJfYnVmICsgb2Zmc2V0KSA9IDA7CisJb2Zmc2V0Kys7CisKKwkvKiBBbGlnbiBidWZmZXIgdG8gbmV4dCBkd29yZCAqLworCW9mZnNldCArPSBxZWRfZHVtcF9hbGlnbihjaGFyX2J1ZiArIG9mZnNldCwgZHVtcCwgb2Zmc2V0KTsKKworCS8qIER1bXAgcGFyYW0gdmFsdWUgKGFuZCBjaGFuZ2Ugb2Zmc2V0IGZyb20gYnl0ZXMgdG8gZHdvcmRzKSAqLworCW9mZnNldCA9IEJZVEVTX1RPX0RXT1JEUyhvZmZzZXQpOworCWlmIChkdW1wKQorCQkqKGR1bXBfYnVmICsgb2Zmc2V0KSA9IHBhcmFtX3ZhbDsKKwlvZmZzZXQrKzsKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBSZWFkcyB0aGUgRlcgdmVyc2lvbiBhbmQgd3JpdGVzIGl0IGFzIGEgcGFyYW0gdG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2R1bXBfZndfdmVyX3BhcmFtKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJIHUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCkKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJY2hhciBmd192ZXJfc3RyWzE2XSA9IEVNUFRZX0ZXX1ZFUlNJT05fU1RSOworCWNoYXIgZndfaW1nX3N0clsxNl0gPSBFTVBUWV9GV19JTUFHRV9TVFI7CisJc3RydWN0IGZ3X2luZm8gZndfaW5mbyA9IHsgezB9LCB7MH0gfTsKKwlpbnQgcHJpbnRlZF9jaGFyczsKKwl1MzIgb2Zmc2V0ID0gMDsKKworCWlmIChkdW1wKSB7CisJCS8qIFJlYWQgRlcgaW1hZ2UvdmVyc2lvbiBmcm9tIFBSQU0gaW4gYSBub24tcmVzZXQgU0VNSSAqLworCQlib29sIGZvdW5kID0gZmFsc2U7CisJCXU4IHN0b3JtX2lkOworCisJCWZvciAoc3Rvcm1faWQgPSAwOyBzdG9ybV9pZCA8IE1BWF9EQkdfU1RPUk1TICYmICFmb3VuZDsKKwkJICAgICBzdG9ybV9pZCsrKSB7CisJCQkvKiBSZWFkIEZXIHZlcnNpb24vaW1hZ2UgICovCisJCQlpZiAoIWRldl9kYXRhLT5ibG9ja19pbl9yZXNldAorCQkJICAgIFtzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLmJsb2NrX2lkXSkgeworCQkJCS8qIHJlYWQgRlcgaW5mbyBmb3IgdGhlIGN1cnJlbnQgU3Rvcm0gKi8KKwkJCQlxZWRfcmVhZF9md19pbmZvKHBfaHdmbiwKKwkJCQkJCSBwX3B0dCwgc3Rvcm1faWQsICZmd19pbmZvKTsKKworCQkJCS8qIENyZWF0ZSBGVyB2ZXJzaW9uL2ltYWdlIHN0cmluZ3MgKi8KKwkJCQlwcmludGVkX2NoYXJzID0KKwkJCQkgICAgc25wcmludGYoZndfdmVyX3N0ciwKKwkJCQkJICAgICBzaXplb2YoZndfdmVyX3N0ciksCisJCQkJCSAgICAgIiVkXyVkXyVkXyVkIiwKKwkJCQkJICAgICBmd19pbmZvLnZlci5udW0ubWFqb3IsCisJCQkJCSAgICAgZndfaW5mby52ZXIubnVtLm1pbm9yLAorCQkJCQkgICAgIGZ3X2luZm8udmVyLm51bS5yZXYsCisJCQkJCSAgICAgZndfaW5mby52ZXIubnVtLmVuZyk7CisJCQkJaWYgKHByaW50ZWRfY2hhcnMgPCAwIHx8IHByaW50ZWRfY2hhcnMgPj0KKwkJCQkgICAgc2l6ZW9mKGZ3X3Zlcl9zdHIpKQorCQkJCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJCQkJICAiVW5leHBlY3RlZCBkZWJ1ZyBlcnJvcjogaW52YWxpZCBGVyB2ZXJzaW9uIHN0cmluZ1xuIik7CisJCQkJc3dpdGNoIChmd19pbmZvLnZlci5pbWFnZV9pZCkgeworCQkJCWNhc2UgRldfSU1HX01BSU46CisJCQkJCXN0cmNweShmd19pbWdfc3RyLCAibWFpbiIpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlzdHJjcHkoZndfaW1nX3N0ciwgInVua25vd24iKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZm91bmQgPSB0cnVlOworCQkJfQorCQl9CisJfQorCisJLyogRHVtcCBGVyB2ZXJzaW9uLCBpbWFnZSBhbmQgdGltZXN0YW1wICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cl9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsICJmdy12ZXJzaW9uIiwgZndfdmVyX3N0cik7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cl9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsICJmdy1pbWFnZSIsIGZ3X2ltZ19zdHIpOworCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLAorCQkJCSAgICAgImZ3LXRpbWVzdGFtcCIsIGZ3X2luZm8udmVyLnRpbWVzdGFtcCk7CisJcmV0dXJuIG9mZnNldDsKK30KKworLyogUmVhZHMgdGhlIE1GVyB2ZXJzaW9uIGFuZCB3cml0ZXMgaXQgYXMgYSBwYXJhbSB0byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqLworc3RhdGljIHUzMiBxZWRfZHVtcF9tZndfdmVyX3BhcmFtKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wKQoreworCWNoYXIgbWZ3X3Zlcl9zdHJbMTZdID0gRU1QVFlfRldfVkVSU0lPTl9TVFI7CisKKwlpZiAoZHVtcCkgeworCQl1MzIgZ2xvYmFsX3NlY3Rpb25fb2Zmc2l6ZSwgZ2xvYmFsX3NlY3Rpb25fYWRkciwgbWZ3X3ZlcjsKKwkJdTMyIHB1YmxpY19kYXRhX2FkZHIsIGdsb2JhbF9zZWN0aW9uX29mZnNpemVfYWRkcjsKKwkJaW50IHByaW50ZWRfY2hhcnM7CisKKwkJLyogRmluZCBNQ1AgcHVibGljIGRhdGEgR1JDIGFkZHJlc3MuCisJCSAqIE5lZWRzIHRvIGJlIE9SZWQgd2l0aCBNQ1BfUkVHX1NDUkFUQ0ggZHVlIHRvIGEgSFcgYnVnLgorCQkgKi8KKwkJcHVibGljX2RhdGFfYWRkciA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkJCQkgIE1JU0NfUkVHX1NIQVJFRF9NRU1fQUREUikgfAorCQkJCQkgIE1DUF9SRUdfU0NSQVRDSDsKKworCQkvKiBGaW5kIE1DUCBwdWJsaWMgZ2xvYmFsIHNlY3Rpb24gb2Zmc2V0ICovCisJCWdsb2JhbF9zZWN0aW9uX29mZnNpemVfYWRkciA9IHB1YmxpY19kYXRhX2FkZHIgKworCQkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgbWNwX3B1YmxpY19kYXRhLAorCQkJCQkJICAgICAgIHNlY3Rpb25zKSArCisJCQkJCSAgICAgIHNpemVvZihvZmZzaXplX3QpICogUFVCTElDX0dMT0JBTDsKKwkJZ2xvYmFsX3NlY3Rpb25fb2Zmc2l6ZSA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkJCQkJZ2xvYmFsX3NlY3Rpb25fb2Zmc2l6ZV9hZGRyKTsKKwkJZ2xvYmFsX3NlY3Rpb25fYWRkciA9IE1DUF9SRUdfU0NSQVRDSCArCisJCQkJICAgICAgKGdsb2JhbF9zZWN0aW9uX29mZnNpemUgJgorCQkJCSAgICAgICBPRkZTSVpFX09GRlNFVF9NQVNLKSAqIDQ7CisKKwkJLyogUmVhZCBNRlcgdmVyc2lvbiBmcm9tIE1DUCBwdWJsaWMgZ2xvYmFsIHNlY3Rpb24gKi8KKwkJbWZ3X3ZlciA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkJCSBnbG9iYWxfc2VjdGlvbl9hZGRyICsKKwkJCQkgb2Zmc2V0b2Yoc3RydWN0IHB1YmxpY19nbG9iYWwsIG1md192ZXIpKTsKKworCQkvKiBEdW1wIE1GVyB2ZXJzaW9uIHBhcmFtICovCisJCXByaW50ZWRfY2hhcnMgPSBzbnByaW50ZihtZndfdmVyX3N0ciwgc2l6ZW9mKG1md192ZXJfc3RyKSwKKwkJCQkJICIlZF8lZF8lZF8lZCIsCisJCQkJCSAodTgpIChtZndfdmVyID4+IDI0KSwKKwkJCQkJICh1OCkgKG1md192ZXIgPj4gMTYpLAorCQkJCQkgKHU4KSAobWZ3X3ZlciA+PiA4KSwKKwkJCQkJICh1OCkgbWZ3X3Zlcik7CisJCWlmIChwcmludGVkX2NoYXJzIDwgMCB8fCBwcmludGVkX2NoYXJzID49IHNpemVvZihtZndfdmVyX3N0cikpCisJCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJCSAgIlVuZXhwZWN0ZWQgZGVidWcgZXJyb3I6IGludmFsaWQgTUZXIHZlcnNpb24gc3RyaW5nXG4iKTsKKwl9CisKKwlyZXR1cm4gcWVkX2R1bXBfc3RyX3BhcmFtKGR1bXBfYnVmLCBkdW1wLCAibWZ3LXZlcnNpb24iLCBtZndfdmVyX3N0cik7Cit9CisKKy8qIFdyaXRlcyBhIHNlY3Rpb24gaGVhZGVyIHRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICogUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICovCitzdGF0aWMgdTMyIHFlZF9kdW1wX3NlY3Rpb25faGRyKHUzMiAqZHVtcF9idWYsCisJCQkJYm9vbCBkdW1wLCBjb25zdCBjaGFyICpuYW1lLCB1MzIgbnVtX3BhcmFtcykKK3sKKwlyZXR1cm4gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmLCBkdW1wLCBuYW1lLCBudW1fcGFyYW1zKTsKK30KKworLyogV3JpdGVzIHRoZSBjb21tb24gZ2xvYmFsIHBhcmFtcyB0byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqLworc3RhdGljIHUzMiBxZWRfZHVtcF9jb21tb25fZ2xvYmFsX3BhcmFtcyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJIHUzMiAqZHVtcF9idWYsCisJCQkJCSBib29sIGR1bXAsCisJCQkJCSB1OCBudW1fc3BlY2lmaWNfZ2xvYmFsX3BhcmFtcykKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJdTMyIG9mZnNldCA9IDA7CisKKwkvKiBGaW5kIHBsYXRmb3JtIHN0cmluZyBhbmQgZHVtcCBnbG9iYWwgcGFyYW1zIHNlY3Rpb24gaGVhZGVyICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX3NlY3Rpb25faGRyKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgICBkdW1wLAorCQkJCSAgICAgICAiZ2xvYmFsX3BhcmFtcyIsCisJCQkJICAgICAgIE5VTV9DT01NT05fR0xPQkFMX1BBUkFNUyArCisJCQkJICAgICAgIG51bV9zcGVjaWZpY19nbG9iYWxfcGFyYW1zKTsKKworCS8qIFN0b3JlIHBhcmFtcyAqLworCW9mZnNldCArPSBxZWRfZHVtcF9md192ZXJfcGFyYW0ocF9od2ZuLCBwX3B0dCwgZHVtcF9idWYgKyBvZmZzZXQsIGR1bXApOworCW9mZnNldCArPSBxZWRfZHVtcF9tZndfdmVyX3BhcmFtKHBfaHdmbiwKKwkJCQkJIHBfcHR0LCBkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCk7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsICJ0b29scy12ZXJzaW9uIiwgVE9PTFNfVkVSU0lPTik7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cl9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsCisJCQkJICAgICAiY2hpcCIsCisJCQkJICAgICBzX2NoaXBfZGVmc1tkZXZfZGF0YS0+Y2hpcF9pZF0ubmFtZSk7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cl9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsCisJCQkJICAgICAicGxhdGZvcm0iLAorCQkJCSAgICAgc19wbGF0Zm9ybV9kZWZzW2Rldl9kYXRhLT5wbGF0Zm9ybV9pZF0uCisJCQkJICAgICBuYW1lKTsKKwlvZmZzZXQgKz0KKwkgICAgcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAicGNpLWZ1bmMiLAorCQkJICAgICAgIHBfaHdmbi0+YWJzX3BmX2lkKTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBXcml0ZXMgdGhlIGxhc3Qgc2VjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LgorICogUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICovCitzdGF0aWMgdTMyIHFlZF9kdW1wX2xhc3Rfc2VjdGlvbih1MzIgKmR1bXBfYnVmLCB1MzIgb2Zmc2V0LCBib29sIGR1bXApCit7CisJdTMyIHN0YXJ0X29mZnNldCA9IG9mZnNldCwgY3JjID0gfjA7CisKKwkvKiBEdW1wIENSQyBzZWN0aW9uIGhlYWRlciAqLworCW9mZnNldCArPSBxZWRfZHVtcF9zZWN0aW9uX2hkcihkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgImxhc3QiLCAwKTsKKworCS8qIENhbGN1bGF0ZSBDUkMzMiBhbmQgYWRkIGl0IHRvIHRoZSBkd29yZCBmb2xsb3dpbmcgdGhlICJsYXN0IiBzZWN0aW9uLgorCSAqLworCWlmIChkdW1wKQorCQkqKGR1bXBfYnVmICsgb2Zmc2V0KSA9IH5jcmMzMihjcmMsICh1OCAqKWR1bXBfYnVmLAorCQkJCQkgICAgICBEV09SRFNfVE9fQllURVMob2Zmc2V0KSk7CisJb2Zmc2V0Kys7CisJcmV0dXJuIG9mZnNldCAtIHN0YXJ0X29mZnNldDsKK30KKworLyogVXBkYXRlIGJsb2NrcyByZXNldCBzdGF0ZSAgKi8KK3N0YXRpYyB2b2lkIHFlZF91cGRhdGVfYmxvY2tzX3Jlc2V0X3N0YXRlKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJdTMyIHJlZ192YWxbTUFYX0RCR19SRVNFVF9SRUdTXSA9IHsgMCB9OworCXUzMiBpOworCisJLyogUmVhZCByZXNldCByZWdpc3RlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0RCR19SRVNFVF9SRUdTOyBpKyspCisJCWlmIChzX3Jlc2V0X3JlZ3NfZGVmc1tpXS5leGlzdHNbZGV2X2RhdGEtPmNoaXBfaWRdKQorCQkJcmVnX3ZhbFtpXSA9IHFlZF9yZChwX2h3Zm4sCisJCQkJCSAgICBwX3B0dCwgc19yZXNldF9yZWdzX2RlZnNbaV0uYWRkcik7CisKKwkvKiBDaGVjayBpZiBibG9ja3MgYXJlIGluIHJlc2V0ICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9CTE9DS19JRDsgaSsrKQorCQlkZXZfZGF0YS0+YmxvY2tfaW5fcmVzZXRbaV0gPQorCQkgICAgc19ibG9ja19kZWZzW2ldLT5oYXNfcmVzZXRfYml0ICYmCisJCSAgICAhKHJlZ192YWxbc19ibG9ja19kZWZzW2ldLT5yZXNldF9yZWddICYKKwkJICAgICAgQklUKHNfYmxvY2tfZGVmc1tpXS0+cmVzZXRfYml0X29mZnNldCkpOworfQorCisvKiBFbmFibGUgLyBkaXNhYmxlIHRoZSBEZWJ1ZyBibG9jayAqLworc3RhdGljIHZvaWQgcWVkX2J1c19lbmFibGVfZGJnX2Jsb2NrKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCBib29sIGVuYWJsZSkKK3sKKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgREJHX1JFR19EQkdfQkxPQ0tfT04sIGVuYWJsZSA/IDEgOiAwKTsKK30KKworLyogUmVzZXRzIHRoZSBEZWJ1ZyBibG9jayAqLworc3RhdGljIHZvaWQgcWVkX2J1c19yZXNldF9kYmdfYmxvY2soc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3sKKwl1MzIgZGJnX3Jlc2V0X3JlZ19hZGRyLCBvbGRfcmVzZXRfcmVnX3ZhbCwgbmV3X3Jlc2V0X3JlZ192YWw7CisKKwlkYmdfcmVzZXRfcmVnX2FkZHIgPQorCQlzX3Jlc2V0X3JlZ3NfZGVmc1tzX2Jsb2NrX2RlZnNbQkxPQ0tfREJHXS0+cmVzZXRfcmVnXS5hZGRyOworCW9sZF9yZXNldF9yZWdfdmFsID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsIGRiZ19yZXNldF9yZWdfYWRkcik7CisJbmV3X3Jlc2V0X3JlZ192YWwgPSBvbGRfcmVzZXRfcmVnX3ZhbCAmCisJCQkgICAgfkJJVChzX2Jsb2NrX2RlZnNbQkxPQ0tfREJHXS0+cmVzZXRfYml0X29mZnNldCk7CisKKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgZGJnX3Jlc2V0X3JlZ19hZGRyLCBuZXdfcmVzZXRfcmVnX3ZhbCk7CisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIGRiZ19yZXNldF9yZWdfYWRkciwgb2xkX3Jlc2V0X3JlZ192YWwpOworfQorCitzdGF0aWMgdm9pZCBxZWRfYnVzX3NldF9mcmFtaW5nX21vZGUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgICBlbnVtIGRiZ19idXNfZnJhbWVfbW9kZXMgbW9kZSkKK3sKKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgREJHX1JFR19GUkFNSU5HX01PREUsICh1OCltb2RlKTsKK30KKworLyogRW5hYmxlIC8gZGlzYWJsZSBEZWJ1ZyBCdXMgY2xpZW50cyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXNrLgorICogKDEgPSBlbmFibGUsIDAgPSBkaXNhYmxlKQorICovCitzdGF0aWMgdm9pZCBxZWRfYnVzX2VuYWJsZV9jbGllbnRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTMyIGNsaWVudF9tYXNrKQoreworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBEQkdfUkVHX0NMSUVOVF9FTkFCTEUsIGNsaWVudF9tYXNrKTsKK30KKworc3RhdGljIGJvb2wgcWVkX2lzX21vZGVfbWF0Y2goc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHUxNiAqbW9kZXNfYnVmX29mZnNldCkKK3sKKwljb25zdCB1MzIgKnB0ciA9IHNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19NT0RFX1RSRUVdLnB0cjsKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJdTggdHJlZV92YWwgPSAoKHU4ICopcHRyKVsoKm1vZGVzX2J1Zl9vZmZzZXQpKytdOworCWJvb2wgYXJnMSwgYXJnMjsKKworCXN3aXRjaCAodHJlZV92YWwpIHsKKwljYXNlIElOSVRfTU9ERV9PUF9OT1Q6CisJCXJldHVybiAhcWVkX2lzX21vZGVfbWF0Y2gocF9od2ZuLCBtb2Rlc19idWZfb2Zmc2V0KTsKKwljYXNlIElOSVRfTU9ERV9PUF9PUjoKKwljYXNlIElOSVRfTU9ERV9PUF9BTkQ6CisJCWFyZzEgPSBxZWRfaXNfbW9kZV9tYXRjaChwX2h3Zm4sIG1vZGVzX2J1Zl9vZmZzZXQpOworCQlhcmcyID0gcWVkX2lzX21vZGVfbWF0Y2gocF9od2ZuLCBtb2Rlc19idWZfb2Zmc2V0KTsKKwkJcmV0dXJuICh0cmVlX3ZhbCA9PSBJTklUX01PREVfT1BfT1IpID8gKGFyZzEgfHwKKwkJCQkJCQlhcmcyKSA6IChhcmcxICYmIGFyZzIpOworCWRlZmF1bHQ6CisJCXJldHVybiBkZXZfZGF0YS0+bW9kZV9lbmFibGVbdHJlZV92YWwgLSBNQVhfSU5JVF9NT0RFX09QU10gPiAwOworCX0KK30KKworLyogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBHUkMgcGFyYW0gKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19nZXRfcGFyYW0oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgIGVudW0gZGJnX2dyY19wYXJhbXMgZ3JjX3BhcmFtKQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKworCXJldHVybiBkZXZfZGF0YS0+Z3JjLnBhcmFtX3ZhbFtncmNfcGFyYW1dOworfQorCisvKiBDbGVhciBhbGwgR1JDIHBhcmFtcyAqLworc3RhdGljIHZvaWQgcWVkX2RiZ19ncmNfY2xlYXJfcGFyYW1zKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuKQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwl1MzIgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfREJHX0dSQ19QQVJBTVM7IGkrKykKKwkJZGV2X2RhdGEtPmdyYy5wYXJhbV9zZXRfYnlfdXNlcltpXSA9IDA7Cit9CisKKy8qIEFzc2lnbiBkZWZhdWx0IEdSQyBwYXJhbSB2YWx1ZXMgKi8KK3N0YXRpYyB2b2lkIHFlZF9kYmdfZ3JjX3NldF9wYXJhbXNfZGVmYXVsdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbikKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0RCR19HUkNfUEFSQU1TOyBpKyspCisJCWlmICghZGV2X2RhdGEtPmdyYy5wYXJhbV9zZXRfYnlfdXNlcltpXSkKKwkJCWRldl9kYXRhLT5ncmMucGFyYW1fdmFsW2ldID0KKwkJCSAgICBzX2dyY19wYXJhbV9kZWZzW2ldLmRlZmF1bHRfdmFsW2Rldl9kYXRhLT5jaGlwX2lkXTsKK30KKworLyogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgZW50aXR5IChpbmRpY2F0ZWQgYnkgR1JDIHBhcmFtKSBzaG91bGQgYmUKKyAqIGluY2x1ZGVkIGluIHRoZSBkdW1wLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBib29sIHFlZF9ncmNfaXNfaW5jbHVkZWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJZW51bSBkYmdfZ3JjX3BhcmFtcyBncmNfcGFyYW0pCit7CisJcmV0dXJuIHFlZF9ncmNfZ2V0X3BhcmFtKHBfaHdmbiwgZ3JjX3BhcmFtKSA+IDA7Cit9CisKKy8qIFJldHVybnMgdHJ1ZSBvZiB0aGUgc3BlY2lmaWVkIFN0b3JtIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgZHVtcCwgZmFsc2UKKyAqIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGJvb2wgcWVkX2dyY19pc19zdG9ybV9pbmNsdWRlZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgICBlbnVtIGRiZ19zdG9ybXMgc3Rvcm0pCit7CisJcmV0dXJuIHFlZF9ncmNfZ2V0X3BhcmFtKHBfaHdmbiwgKGVudW0gZGJnX2dyY19wYXJhbXMpc3Rvcm0pID4gMDsKK30KKworLyogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbWVtb3J5IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgZHVtcCwgZmFsc2UKKyAqIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGJvb2wgcWVkX2dyY19pc19tZW1faW5jbHVkZWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgIGVudW0gYmxvY2tfaWQgYmxvY2tfaWQsIHU4IG1lbV9ncm91cF9pZCkKK3sKKwl1OCBpOworCisJLyogQ2hlY2sgU3Rvcm0gbWF0Y2ggKi8KKwlpZiAoc19ibG9ja19kZWZzW2Jsb2NrX2lkXS0+YXNzb2NpYXRlZF90b19zdG9ybSAmJgorCSAgICAhcWVkX2dyY19pc19zdG9ybV9pbmNsdWRlZChwX2h3Zm4sCisJCQkoZW51bSBkYmdfc3Rvcm1zKXNfYmxvY2tfZGVmc1tibG9ja19pZF0tPnN0b3JtX2lkKSkKKwkJcmV0dXJuIGZhbHNlOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9CSUdfUkFNX1RZUEVTOyBpKyspCisJCWlmIChtZW1fZ3JvdXBfaWQgPT0gc19iaWdfcmFtX2RlZnNbaV0ubWVtX2dyb3VwX2lkIHx8CisJCSAgICBtZW1fZ3JvdXBfaWQgPT0gc19iaWdfcmFtX2RlZnNbaV0ucmFtX21lbV9ncm91cF9pZCkKKwkJCXJldHVybiBxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwKKwkJCQkJCSAgIHNfYmlnX3JhbV9kZWZzW2ldLmdyY19wYXJhbSk7CisJaWYgKG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfUFhQX0lMVCB8fCBtZW1fZ3JvdXBfaWQgPT0KKwkgICAgTUVNX0dST1VQX1BYUF9NRU0pCisJCXJldHVybiBxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX1BYUCk7CisJaWYgKG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfUkFNKQorCQlyZXR1cm4gcWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9SQU0pOworCWlmIChtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX1BCVUYpCisJCXJldHVybiBxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX1BCVUYpOworCWlmIChtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX0NBVV9NRU0gfHwKKwkgICAgbWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9DQVVfU0IgfHwKKwkgICAgbWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9DQVVfUEkpCisJCXJldHVybiBxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX0NBVSk7CisJaWYgKG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfUU1fTUVNKQorCQlyZXR1cm4gcWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9RTSk7CisJaWYgKG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfQ09OTl9DRkNfTUVNIHx8CisJICAgIG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfVEFTS19DRkNfTUVNKQorCQlyZXR1cm4gcWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9DRkMpOworCWlmIChtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX0lHVV9NRU0gfHwgbWVtX2dyb3VwX2lkID09CisJICAgIE1FTV9HUk9VUF9JR1VfTVNJWCkKKwkJcmV0dXJuIHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfSUdVKTsKKwlpZiAobWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9NVUxEX01FTSkKKwkJcmV0dXJuIHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfTVVMRCk7CisJaWYgKG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfUFJTX01FTSkKKwkJcmV0dXJuIHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfUFJTKTsKKwlpZiAobWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9ETUFFX01FTSkKKwkJcmV0dXJuIHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfRE1BRSk7CisJaWYgKG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfVE1fTUVNKQorCQlyZXR1cm4gcWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9UTSk7CisJaWYgKG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfU0RNX01FTSkKKwkJcmV0dXJuIHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfU0RNKTsKKwlpZiAobWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9URElGX0NUWCB8fCBtZW1fZ3JvdXBfaWQgPT0KKwkgICAgTUVNX0dST1VQX1JESUZfQ1RYKQorCQlyZXR1cm4gcWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9ESUYpOworCWlmIChtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX0NNX01FTSkKKwkJcmV0dXJuIHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfQ00pOworCWlmIChtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX0lPUikKKwkJcmV0dXJuIHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfSU9SKTsKKworCXJldHVybiB0cnVlOworfQorCisvKiBTdGFsbHMgYWxsIFN0b3JtcyAqLworc3RhdGljIHZvaWQgcWVkX2dyY19zdGFsbF9zdG9ybXMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgYm9vbCBzdGFsbCkKK3sKKwl1OCByZWdfdmFsID0gc3RhbGwgPyAxIDogMDsKKwl1OCBzdG9ybV9pZDsKKworCWZvciAoc3Rvcm1faWQgPSAwOyBzdG9ybV9pZCA8IE1BWF9EQkdfU1RPUk1TOyBzdG9ybV9pZCsrKSB7CisJCWlmIChxZWRfZ3JjX2lzX3N0b3JtX2luY2x1ZGVkKHBfaHdmbiwKKwkJCQkJICAgICAgKGVudW0gZGJnX3N0b3JtcylzdG9ybV9pZCkpIHsKKwkJCXUzMiByZWdfYWRkciA9CisJCQkgICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5zZW1fZmFzdF9tZW1fYWRkciArCisJCQkgICAgU0VNX0ZBU1RfUkVHX1NUQUxMXzA7CisKKwkJCXFlZF93cihwX2h3Zm4sIHBfcHR0LCByZWdfYWRkciwgcmVnX3ZhbCk7CisJCX0KKwl9CisKKwltc2xlZXAoU1RBTExfREVMQVlfTVMpOworfQorCisvKiBUYWtlcyBhbGwgYmxvY2tzIG91dCBvZiByZXNldCAqLworc3RhdGljIHZvaWQgcWVkX2dyY191bnJlc2V0X2Jsb2NrcyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCXUzMiByZWdfdmFsW01BWF9EQkdfUkVTRVRfUkVHU10gPSB7IDAgfTsKKwl1MzIgaTsKKworCS8qIEZpbGwgcmVzZXQgcmVncyB2YWx1ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JMT0NLX0lEOyBpKyspCisJCWlmIChzX2Jsb2NrX2RlZnNbaV0tPmhhc19yZXNldF9iaXQgJiYgc19ibG9ja19kZWZzW2ldLT51bnJlc2V0KQorCQkJcmVnX3ZhbFtzX2Jsb2NrX2RlZnNbaV0tPnJlc2V0X3JlZ10gfD0KKwkJCSAgICBCSVQoc19ibG9ja19kZWZzW2ldLT5yZXNldF9iaXRfb2Zmc2V0KTsKKworCS8qIFdyaXRlIHJlc2V0IHJlZ2lzdGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfREJHX1JFU0VUX1JFR1M7IGkrKykgeworCQlpZiAoc19yZXNldF9yZWdzX2RlZnNbaV0uZXhpc3RzW2Rldl9kYXRhLT5jaGlwX2lkXSkgeworCQkJcmVnX3ZhbFtpXSB8PSBzX3Jlc2V0X3JlZ3NfZGVmc1tpXS51bnJlc2V0X3ZhbDsKKwkJCWlmIChyZWdfdmFsW2ldKQorCQkJCXFlZF93cihwX2h3Zm4sCisJCQkJICAgICAgIHBfcHR0LAorCQkJCSAgICAgICBzX3Jlc2V0X3JlZ3NfZGVmc1tpXS5hZGRyICsKKwkJCQkgICAgICAgUkVTRVRfUkVHX1VOUkVTRVRfT0ZGU0VULCByZWdfdmFsW2ldKTsKKwkJfQorCX0KK30KKworLyogUmV0dXJucyB0aGUgYXR0ZW50aW9uIG5hbWUgb2Zmc2V0cyBvZiB0aGUgc3BlY2lmaWVkIGJsb2NrICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGRiZ19hdHRuX2Jsb2NrX3R5cGVfZGF0YSAqCitxZWRfZ2V0X2Jsb2NrX2F0dG5fZGF0YShlbnVtIGJsb2NrX2lkIGJsb2NrX2lkLCBlbnVtIGRiZ19hdHRuX3R5cGUgYXR0bl90eXBlKQoreworCWNvbnN0IHN0cnVjdCBkYmdfYXR0bl9ibG9jayAqYmFzZV9hdHRuX2Jsb2NrX2FyciA9CisJCShjb25zdCBzdHJ1Y3QgZGJnX2F0dG5fYmxvY2sgKikKKwkJc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0FUVE5fQkxPQ0tTXS5wdHI7CisKKwlyZXR1cm4gJmJhc2VfYXR0bl9ibG9ja19hcnJbYmxvY2tfaWRdLnBlcl90eXBlX2RhdGFbYXR0bl90eXBlXTsKK30KKworLyogUmV0dXJucyB0aGUgYXR0ZW50aW9uIHJlZ2lzdGVycyBvZiB0aGUgc3BlY2lmaWVkIGJsb2NrICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGRiZ19hdHRuX3JlZyAqCitxZWRfZ2V0X2Jsb2NrX2F0dG5fcmVncyhlbnVtIGJsb2NrX2lkIGJsb2NrX2lkLCBlbnVtIGRiZ19hdHRuX3R5cGUgYXR0bl90eXBlLAorCQkJdTggKm51bV9hdHRuX3JlZ3MpCit7CisJY29uc3Qgc3RydWN0IGRiZ19hdHRuX2Jsb2NrX3R5cGVfZGF0YSAqYmxvY2tfdHlwZV9kYXRhID0KKwkJcWVkX2dldF9ibG9ja19hdHRuX2RhdGEoYmxvY2tfaWQsIGF0dG5fdHlwZSk7CisKKwkqbnVtX2F0dG5fcmVncyA9IGJsb2NrX3R5cGVfZGF0YS0+bnVtX3JlZ3M7CisJcmV0dXJuICYoKGNvbnN0IHN0cnVjdCBkYmdfYXR0bl9yZWcgKikKKwkJIHNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19BVFROX1JFR1NdLnB0cilbYmxvY2tfdHlwZV9kYXRhLT4KKwkJCQkJCQkgIHJlZ3Nfb2Zmc2V0XTsKK30KKworLyogRm9yIGVhY2ggYmxvY2ssIGNsZWFyIHRoZSBzdGF0dXMgb2YgYWxsIHBhcml0aWVzICovCitzdGF0aWMgdm9pZCBxZWRfZ3JjX2NsZWFyX2FsbF9wcnR5KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJdTggcmVnX2lkeCwgbnVtX2F0dG5fcmVnczsKKwl1MzIgYmxvY2tfaWQ7CisKKwlmb3IgKGJsb2NrX2lkID0gMDsgYmxvY2tfaWQgPCBNQVhfQkxPQ0tfSUQ7IGJsb2NrX2lkKyspIHsKKwkJY29uc3Qgc3RydWN0IGRiZ19hdHRuX3JlZyAqYXR0bl9yZWdfYXJyOworCisJCWlmIChkZXZfZGF0YS0+YmxvY2tfaW5fcmVzZXRbYmxvY2tfaWRdKQorCQkJY29udGludWU7CisKKwkJYXR0bl9yZWdfYXJyID0gcWVkX2dldF9ibG9ja19hdHRuX3JlZ3MoKGVudW0gYmxvY2tfaWQpYmxvY2tfaWQsCisJCQkJCQkgICAgICAgQVRUTl9UWVBFX1BBUklUWSwKKwkJCQkJCSAgICAgICAmbnVtX2F0dG5fcmVncyk7CisJCWZvciAocmVnX2lkeCA9IDA7IHJlZ19pZHggPCBudW1fYXR0bl9yZWdzOyByZWdfaWR4KyspIHsKKwkJCWNvbnN0IHN0cnVjdCBkYmdfYXR0bl9yZWcgKnJlZ19kYXRhID0KKwkJCQkmYXR0bl9yZWdfYXJyW3JlZ19pZHhdOworCisJCQkvKiBDaGVjayBtb2RlICovCisJCQlib29sIGV2YWxfbW9kZSA9IEdFVF9GSUVMRChyZWdfZGF0YS0+bW9kZS5kYXRhLAorCQkJCQkJICAgREJHX01PREVfSERSX0VWQUxfTU9ERSkgPiAwOworCQkJdTE2IG1vZGVzX2J1Zl9vZmZzZXQgPQorCQkJCUdFVF9GSUVMRChyZWdfZGF0YS0+bW9kZS5kYXRhLAorCQkJCQkgIERCR19NT0RFX0hEUl9NT0RFU19CVUZfT0ZGU0VUKTsKKworCQkJaWYgKCFldmFsX21vZGUgfHwKKwkJCSAgICBxZWRfaXNfbW9kZV9tYXRjaChwX2h3Zm4sICZtb2Rlc19idWZfb2Zmc2V0KSkKKwkJCQkvKiBNb2RlIG1hdGNoIC0gcmVhZCBwYXJpdHkgc3RhdHVzIHJlYWQtY2xlYXIKKwkJCQkgKiByZWdpc3Rlci4KKwkJCQkgKi8KKwkJCQlxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJCQkgICAgICAgRFdPUkRTX1RPX0JZVEVTKHJlZ19kYXRhLT4KKwkJCQkJCSAgICAgICBzdHNfY2xyX2FkZHJlc3MpKTsKKwkJfQorCX0KK30KKworLyogRHVtcHMgR1JDIHJlZ2lzdGVycyBzZWN0aW9uIGhlYWRlci4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICogVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBkdW1wZWQ6CisgKiAtICdjb3VudCcgPSBudW1fZHVtcGVkX2VudHJpZXMKKyAqIC0gJ3NwbGl0JyA9IHNwbGl0X3R5cGUKKyAqIC0gJ2lkJ2kgPSBzcGxpdF9pZCAoZHVtcGVkIG9ubHkgaWYgc3BsaXRfaWQgPj0gMCkKKyAqIC0gJ3BhcmFtX25hbWUnID0gcGFyYW1fdmFsICh1c2VyIHBhcmFtLCBkdW1wZWQgb25seSBpZiBwYXJhbV9uYW1lICE9IE5VTEwgYW5kCisgKglwYXJhbV92YWwgIT0gTlVMTCkKKyAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfcmVnc19oZHIodTMyICpkdW1wX2J1ZiwKKwkJCQkgYm9vbCBkdW1wLAorCQkJCSB1MzIgbnVtX3JlZ19lbnRyaWVzLAorCQkJCSBjb25zdCBjaGFyICpzcGxpdF90eXBlLAorCQkJCSBpbnQgc3BsaXRfaWQsCisJCQkJIGNvbnN0IGNoYXIgKnBhcmFtX25hbWUsIGNvbnN0IGNoYXIgKnBhcmFtX3ZhbCkKK3sKKwl1OCBudW1fcGFyYW1zID0gMiArIChzcGxpdF9pZCA+PSAwID8gMSA6IDApICsgKHBhcmFtX25hbWUgPyAxIDogMCk7CisJdTMyIG9mZnNldCA9IDA7CisKKwlvZmZzZXQgKz0gcWVkX2R1bXBfc2VjdGlvbl9oZHIoZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICAgIGR1bXAsICJncmNfcmVncyIsIG51bV9wYXJhbXMpOworCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLCAiY291bnQiLCBudW1fcmVnX2VudHJpZXMpOworCW9mZnNldCArPSBxZWRfZHVtcF9zdHJfcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLCAic3BsaXQiLCBzcGxpdF90eXBlKTsKKwlpZiAoc3BsaXRfaWQgPj0gMCkKKwkJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJICAgICBkdW1wLCAiaWQiLCBzcGxpdF9pZCk7CisJaWYgKHBhcmFtX25hbWUgJiYgcGFyYW1fdmFsKQorCQlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkgICAgIGR1bXAsIHBhcmFtX25hbWUsIHBhcmFtX3ZhbCk7CisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcHMgR1JDIHJlZ2lzdGVyL21lbW9yeS4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLiAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfcmVnX2VudHJ5KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgKmR1bXBfYnVmLAorCQkJCSAgYm9vbCBkdW1wLCB1MzIgYWRkciwgdTMyIGxlbikKK3sKKwl1MzIgb2Zmc2V0ID0gMCwgaTsKKworCWlmIChkdW1wKSB7CisJCSooZHVtcF9idWYgKyBvZmZzZXQrKykgPSBhZGRyIHwgKGxlbiA8PCBSRUdfRFVNUF9MRU5fU0hJRlQpOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyssIGFkZHIrKywgb2Zmc2V0KyspCisJCQkqKGR1bXBfYnVmICsgb2Zmc2V0KSA9IHFlZF9yZChwX2h3Zm4sCisJCQkJCQkgICAgICBwX3B0dCwKKwkJCQkJCSAgICAgIERXT1JEU19UT19CWVRFUyhhZGRyKSk7CisJfSBlbHNlIHsKKwkJb2Zmc2V0ICs9IGxlbiArIDE7CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcHMgR1JDIHJlZ2lzdGVycyBlbnRyaWVzLiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9yZWdzX2VudHJpZXMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgICBzdHJ1Y3QgZGJnX2FycmF5IGlucHV0X3JlZ3NfYXJyLAorCQkJCSAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkgICAgIGJvb2wgZHVtcCwKKwkJCQkgICAgIGJvb2wgYmxvY2tfZW5hYmxlW01BWF9CTE9DS19JRF0sCisJCQkJICAgICB1MzIgKm51bV9kdW1wZWRfcmVnX2VudHJpZXMpCit7CisJdTMyIGksIG9mZnNldCA9IDAsIGlucHV0X29mZnNldCA9IDA7CisJYm9vbCBtb2RlX21hdGNoID0gdHJ1ZTsKKworCSpudW1fZHVtcGVkX3JlZ19lbnRyaWVzID0gMDsKKwl3aGlsZSAoaW5wdXRfb2Zmc2V0IDwgaW5wdXRfcmVnc19hcnIuc2l6ZV9pbl9kd29yZHMpIHsKKwkJY29uc3Qgc3RydWN0IGRiZ19kdW1wX2NvbmRfaGRyICpjb25kX2hkciA9CisJCSAgICAoY29uc3Qgc3RydWN0IGRiZ19kdW1wX2NvbmRfaGRyICopCisJCSAgICAmaW5wdXRfcmVnc19hcnIucHRyW2lucHV0X29mZnNldCsrXTsKKwkJYm9vbCBldmFsX21vZGUgPSBHRVRfRklFTEQoY29uZF9oZHItPm1vZGUuZGF0YSwKKwkJCQkJICAgREJHX01PREVfSERSX0VWQUxfTU9ERSkgPiAwOworCisJCS8qIENoZWNrIG1vZGUvYmxvY2sgKi8KKwkJaWYgKGV2YWxfbW9kZSkgeworCQkJdTE2IG1vZGVzX2J1Zl9vZmZzZXQgPQorCQkJCUdFVF9GSUVMRChjb25kX2hkci0+bW9kZS5kYXRhLAorCQkJCQkgIERCR19NT0RFX0hEUl9NT0RFU19CVUZfT0ZGU0VUKTsKKwkJCW1vZGVfbWF0Y2ggPSBxZWRfaXNfbW9kZV9tYXRjaChwX2h3Zm4sCisJCQkJCQkgICAgICAgJm1vZGVzX2J1Zl9vZmZzZXQpOworCQl9CisKKwkJaWYgKG1vZGVfbWF0Y2ggJiYgYmxvY2tfZW5hYmxlW2NvbmRfaGRyLT5ibG9ja19pZF0pIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBjb25kX2hkci0+ZGF0YV9zaXplOworCQkJICAgICBpKyssIGlucHV0X29mZnNldCsrKSB7CisJCQkJY29uc3Qgc3RydWN0IGRiZ19kdW1wX3JlZyAqcmVnID0KKwkJCQkgICAgKGNvbnN0IHN0cnVjdCBkYmdfZHVtcF9yZWcgKikKKwkJCQkgICAgJmlucHV0X3JlZ3NfYXJyLnB0cltpbnB1dF9vZmZzZXRdOworCisJCQkJb2Zmc2V0ICs9CisJCQkJCXFlZF9ncmNfZHVtcF9yZWdfZW50cnkocF9od2ZuLCBwX3B0dCwKKwkJCQkJCSAgICBkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwKKwkJCQkJCSAgICBHRVRfRklFTEQocmVnLT5kYXRhLAorCQkJCQkJCURCR19EVU1QX1JFR19BRERSRVNTKSwKKwkJCQkJCSAgICBHRVRfRklFTEQocmVnLT5kYXRhLAorCQkJCQkJCURCR19EVU1QX1JFR19MRU5HVEgpKTsKKwkJCQkoKm51bV9kdW1wZWRfcmVnX2VudHJpZXMpKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpbnB1dF9vZmZzZXQgKz0gY29uZF9oZHItPmRhdGFfc2l6ZTsKKwkJfQorCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXBzIEdSQyByZWdpc3RlcnMgZW50cmllcy4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLiAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfc3BsaXRfZGF0YShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgc3RydWN0IGRiZ19hcnJheSBpbnB1dF9yZWdzX2FyciwKKwkJCQkgICB1MzIgKmR1bXBfYnVmLAorCQkJCSAgIGJvb2wgZHVtcCwKKwkJCQkgICBib29sIGJsb2NrX2VuYWJsZVtNQVhfQkxPQ0tfSURdLAorCQkJCSAgIGNvbnN0IGNoYXIgKnNwbGl0X3R5cGVfbmFtZSwKKwkJCQkgICB1MzIgc3BsaXRfaWQsCisJCQkJICAgY29uc3QgY2hhciAqcGFyYW1fbmFtZSwKKwkJCQkgICBjb25zdCBjaGFyICpwYXJhbV92YWwpCit7CisJdTMyIG51bV9kdW1wZWRfcmVnX2VudHJpZXMsIG9mZnNldDsKKworCS8qIENhbGN1bGF0ZSByZWdpc3RlciBkdW1wIGhlYWRlciBzaXplIChhbmQgc2tpcCBpdCBmb3Igbm93KSAqLworCW9mZnNldCA9IHFlZF9ncmNfZHVtcF9yZWdzX2hkcihkdW1wX2J1ZiwKKwkJCQkgICAgICAgZmFsc2UsCisJCQkJICAgICAgIDAsCisJCQkJICAgICAgIHNwbGl0X3R5cGVfbmFtZSwKKwkJCQkgICAgICAgc3BsaXRfaWQsIHBhcmFtX25hbWUsIHBhcmFtX3ZhbCk7CisKKwkvKiBEdW1wIHJlZ2lzdGVycyAqLworCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfcmVnc19lbnRyaWVzKHBfaHdmbiwKKwkJCQkJICAgIHBfcHR0LAorCQkJCQkgICAgaW5wdXRfcmVnc19hcnIsCisJCQkJCSAgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJICAgIGR1bXAsCisJCQkJCSAgICBibG9ja19lbmFibGUsCisJCQkJCSAgICAmbnVtX2R1bXBlZF9yZWdfZW50cmllcyk7CisKKwkvKiBXcml0ZSByZWdpc3RlciBkdW1wIGhlYWRlciAqLworCWlmIChkdW1wICYmIG51bV9kdW1wZWRfcmVnX2VudHJpZXMgPiAwKQorCQlxZWRfZ3JjX2R1bXBfcmVnc19oZHIoZHVtcF9idWYsCisJCQkJICAgICAgZHVtcCwKKwkJCQkgICAgICBudW1fZHVtcGVkX3JlZ19lbnRyaWVzLAorCQkJCSAgICAgIHNwbGl0X3R5cGVfbmFtZSwKKwkJCQkgICAgICBzcGxpdF9pZCwgcGFyYW1fbmFtZSwgcGFyYW1fdmFsKTsKKworCXJldHVybiBudW1fZHVtcGVkX3JlZ19lbnRyaWVzID4gMCA/IG9mZnNldCA6IDA7Cit9CisKKy8qIER1bXBzIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIGlucHV0IHJlZ2lzdGVycyBhcnJheS4KKyAqIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgdTMyICpkdW1wX2J1ZiwKKwkJCQkgIGJvb2wgZHVtcCwKKwkJCQkgIGJvb2wgYmxvY2tfZW5hYmxlW01BWF9CTE9DS19JRF0sCisJCQkJICBjb25zdCBjaGFyICpwYXJhbV9uYW1lLCBjb25zdCBjaGFyICpwYXJhbV92YWwpCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCXUzMiBvZmZzZXQgPSAwLCBpbnB1dF9vZmZzZXQgPSAwOworCXU4IHBvcnRfaWQsIHBmX2lkOworCisJaWYgKGR1bXApCisJCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX0RFQlVHLCAiRHVtcGluZyByZWdpc3RlcnMuLi5cbiIpOworCXdoaWxlIChpbnB1dF9vZmZzZXQgPAorCSAgICAgICBzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfRFVNUF9SRUddLnNpemVfaW5fZHdvcmRzKSB7CisJCWNvbnN0IHN0cnVjdCBkYmdfZHVtcF9zcGxpdF9oZHIgKnNwbGl0X2hkciA9CisJCQkoY29uc3Qgc3RydWN0IGRiZ19kdW1wX3NwbGl0X2hkciAqKQorCQkJJnNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19EVU1QX1JFR10ucHRyW2lucHV0X29mZnNldCsrXTsKKwkJdTggc3BsaXRfdHlwZV9pZCA9IEdFVF9GSUVMRChzcGxpdF9oZHItPmhkciwKKwkJCQkJICAgICBEQkdfRFVNUF9TUExJVF9IRFJfU1BMSVRfVFlQRV9JRCk7CisJCXUzMiBzcGxpdF9kYXRhX3NpemUgPSBHRVRfRklFTEQoc3BsaXRfaGRyLT5oZHIsCisJCQkJCQlEQkdfRFVNUF9TUExJVF9IRFJfREFUQV9TSVpFKTsKKwkJc3RydWN0IGRiZ19hcnJheSBjdXJyX2lucHV0X3JlZ3NfYXJyID0geworCQkJJnNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19EVU1QX1JFR10ucHRyW2lucHV0X29mZnNldF0sCisJCQlzcGxpdF9kYXRhX3NpemV9OworCisJCXN3aXRjaCAoc3BsaXRfdHlwZV9pZCkgeworCQljYXNlIFNQTElUX1RZUEVfTk9ORToKKwkJY2FzZSBTUExJVF9UWVBFX1ZGOgorCQkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9zcGxpdF9kYXRhKHBfaHdmbiwKKwkJCQkJCQkgIHBfcHR0LAorCQkJCQkJCSAgY3Vycl9pbnB1dF9yZWdzX2FyciwKKwkJCQkJCQkgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkJCSAgZHVtcCwKKwkJCQkJCQkgIGJsb2NrX2VuYWJsZSwKKwkJCQkJCQkgICJlbmciLAorCQkJCQkJCSAgKHUzMikoLTEpLAorCQkJCQkJCSAgcGFyYW1fbmFtZSwKKwkJCQkJCQkgIHBhcmFtX3ZhbCk7CisJCQlicmVhazsKKwkJY2FzZSBTUExJVF9UWVBFX1BPUlQ6CisJCQlmb3IgKHBvcnRfaWQgPSAwOworCQkJICAgICBwb3J0X2lkIDwKKwkJCSAgICAgc19jaGlwX2RlZnNbZGV2X2RhdGEtPmNoaXBfaWRdLgorCQkJICAgICBwZXJfcGxhdGZvcm1bZGV2X2RhdGEtPnBsYXRmb3JtX2lkXS5udW1fcG9ydHM7CisJCQkgICAgIHBvcnRfaWQrKykgeworCQkJCWlmIChkdW1wKQorCQkJCQlxZWRfcG9ydF9wcmV0ZW5kKHBfaHdmbiwgcF9wdHQsCisJCQkJCQkJIHBvcnRfaWQpOworCQkJCW9mZnNldCArPQorCQkJCSAgICBxZWRfZ3JjX2R1bXBfc3BsaXRfZGF0YShwX2h3Zm4sIHBfcHR0LAorCQkJCQkJCSAgICBjdXJyX2lucHV0X3JlZ3NfYXJyLAorCQkJCQkJCSAgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJCQkgICAgZHVtcCwgYmxvY2tfZW5hYmxlLAorCQkJCQkJCSAgICAicG9ydCIsIHBvcnRfaWQsCisJCQkJCQkJICAgIHBhcmFtX25hbWUsCisJCQkJCQkJICAgIHBhcmFtX3ZhbCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTUExJVF9UWVBFX1BGOgorCQljYXNlIFNQTElUX1RZUEVfUE9SVF9QRjoKKwkJCWZvciAocGZfaWQgPSAwOworCQkJICAgICBwZl9pZCA8CisJCQkgICAgIHNfY2hpcF9kZWZzW2Rldl9kYXRhLT5jaGlwX2lkXS4KKwkJCSAgICAgcGVyX3BsYXRmb3JtW2Rldl9kYXRhLT5wbGF0Zm9ybV9pZF0ubnVtX3BmczsKKwkJCSAgICAgcGZfaWQrKykgeworCQkJCWlmIChkdW1wKQorCQkJCQlxZWRfZmlkX3ByZXRlbmQocF9od2ZuLCBwX3B0dCwgcGZfaWQpOworCQkJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfc3BsaXRfZGF0YShwX2h3Zm4sCisJCQkJCQkJcF9wdHQsCisJCQkJCQkJY3Vycl9pbnB1dF9yZWdzX2FyciwKKwkJCQkJCQlkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJCQlkdW1wLCBibG9ja19lbmFibGUsCisJCQkJCQkJInBmIiwgcGZfaWQsIHBhcmFtX25hbWUsCisJCQkJCQkJcGFyYW1fdmFsKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlpbnB1dF9vZmZzZXQgKz0gc3BsaXRfZGF0YV9zaXplOworCX0KKworCS8qIFByZXRlbmQgdG8gb3JpZ2luYWwgUEYgKi8KKwlpZiAoZHVtcCkKKwkJcWVkX2ZpZF9wcmV0ZW5kKHBfaHdmbiwgcF9wdHQsIHBfaHdmbi0+cmVsX3BmX2lkKTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wIHJlc2V0IHJlZ2lzdGVycy4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLiAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfcmVzZXRfcmVncyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wKQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwl1MzIgaSwgb2Zmc2V0ID0gMCwgbnVtX3JlZ3MgPSAwOworCisJLyogQ2FsY3VsYXRlIGhlYWRlciBzaXplICovCisJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9yZWdzX2hkcihkdW1wX2J1ZiwKKwkJCQkJZmFsc2UsIDAsICJlbmciLCAtMSwgTlVMTCwgTlVMTCk7CisKKwkvKiBXcml0ZSByZXNldCByZWdpc3RlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0RCR19SRVNFVF9SRUdTOyBpKyspIHsKKwkJaWYgKHNfcmVzZXRfcmVnc19kZWZzW2ldLmV4aXN0c1tkZXZfZGF0YS0+Y2hpcF9pZF0pIHsKKwkJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfcmVnX2VudHJ5KHBfaHdmbiwKKwkJCQkJCQkgcF9wdHQsCisJCQkJCQkJIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkJCSBkdW1wLAorCQkJCQkJCSBCWVRFU19UT19EV09SRFMKKwkJCQkJCQkgKHNfcmVzZXRfcmVnc19kZWZzCisJCQkJCQkJICBbaV0uYWRkciksIDEpOworCQkJbnVtX3JlZ3MrKzsKKwkJfQorCX0KKworCS8qIFdyaXRlIGhlYWRlciAqLworCWlmIChkdW1wKQorCQlxZWRfZ3JjX2R1bXBfcmVnc19oZHIoZHVtcF9idWYsCisJCQkJICAgICAgdHJ1ZSwgbnVtX3JlZ3MsICJlbmciLCAtMSwgTlVMTCwgTlVMTCk7CisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcCByZWdpc3RlcnMgdGhhdCBhcmUgbW9kaWZpZWQgZHVyaW5nIEdSQyBEdW1wIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSBkdW1wZWQKKyAqIGZpcnN0LiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX21vZGlmaWVkX3JlZ3Moc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgICAgIHUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCkKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJdTMyIG9mZnNldCA9IDAsIG51bV9yZWdfZW50cmllcyA9IDAsIGJsb2NrX2lkOworCXU4IHN0b3JtX2lkLCByZWdfaWR4LCBudW1fYXR0bl9yZWdzOworCisJLyogQ2FsY3VsYXRlIGhlYWRlciBzaXplICovCisJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9yZWdzX2hkcihkdW1wX2J1ZiwKKwkJCQkJZmFsc2UsIDAsICJlbmciLCAtMSwgTlVMTCwgTlVMTCk7CisKKwkvKiBXcml0ZSBwYXJpdHkgcmVnaXN0ZXJzICovCisJZm9yIChibG9ja19pZCA9IDA7IGJsb2NrX2lkIDwgTUFYX0JMT0NLX0lEOyBibG9ja19pZCsrKSB7CisJCWNvbnN0IHN0cnVjdCBkYmdfYXR0bl9yZWcgKmF0dG5fcmVnX2FycjsKKworCQlpZiAoZGV2X2RhdGEtPmJsb2NrX2luX3Jlc2V0W2Jsb2NrX2lkXSAmJiBkdW1wKQorCQkJY29udGludWU7CisKKwkJYXR0bl9yZWdfYXJyID0gcWVkX2dldF9ibG9ja19hdHRuX3JlZ3MoKGVudW0gYmxvY2tfaWQpYmxvY2tfaWQsCisJCQkJCQkgICAgICAgQVRUTl9UWVBFX1BBUklUWSwKKwkJCQkJCSAgICAgICAmbnVtX2F0dG5fcmVncyk7CisJCWZvciAocmVnX2lkeCA9IDA7IHJlZ19pZHggPCBudW1fYXR0bl9yZWdzOyByZWdfaWR4KyspIHsKKwkJCWNvbnN0IHN0cnVjdCBkYmdfYXR0bl9yZWcgKnJlZ19kYXRhID0KKwkJCQkmYXR0bl9yZWdfYXJyW3JlZ19pZHhdOworCQkJdTE2IG1vZGVzX2J1Zl9vZmZzZXQ7CisJCQlib29sIGV2YWxfbW9kZTsKKworCQkJLyogQ2hlY2sgbW9kZSAqLworCQkJZXZhbF9tb2RlID0gR0VUX0ZJRUxEKHJlZ19kYXRhLT5tb2RlLmRhdGEsCisJCQkJCSAgICAgIERCR19NT0RFX0hEUl9FVkFMX01PREUpID4gMDsKKwkJCW1vZGVzX2J1Zl9vZmZzZXQgPQorCQkJCUdFVF9GSUVMRChyZWdfZGF0YS0+bW9kZS5kYXRhLAorCQkJCQkgIERCR19NT0RFX0hEUl9NT0RFU19CVUZfT0ZGU0VUKTsKKwkJCWlmICghZXZhbF9tb2RlIHx8CisJCQkgICAgcWVkX2lzX21vZGVfbWF0Y2gocF9od2ZuLCAmbW9kZXNfYnVmX29mZnNldCkpIHsKKwkJCQkvKiBNb2RlIG1hdGNoIC0gcmVhZCBhbmQgZHVtcCByZWdpc3RlcnMgKi8KKwkJCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3JlZ19lbnRyeShwX2h3Zm4sCisJCQkJCQkJcF9wdHQsCisJCQkJCQkJZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCQkJZHVtcCwKKwkJCQkJCQlyZWdfZGF0YS0+bWFza19hZGRyZXNzLAorCQkJCQkJCTEpOworCQkJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfcmVnX2VudHJ5KHBfaHdmbiwKKwkJCQkJCXBfcHR0LAorCQkJCQkJZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCQlkdW1wLAorCQkJCQkJR0VUX0ZJRUxEKHJlZ19kYXRhLT5kYXRhLAorCQkJCQkJICAgIERCR19BVFROX1JFR19TVFNfQUREUkVTUyksCisJCQkJCQkxKTsKKwkJCQludW1fcmVnX2VudHJpZXMgKz0gMjsKKwkJCX0KKwkJfQorCX0KKworCS8qIFdyaXRlIHN0b3JtIHN0YWxsIHN0YXR1cyByZWdpc3RlcnMgKi8KKwlmb3IgKHN0b3JtX2lkID0gMDsgc3Rvcm1faWQgPCBNQVhfREJHX1NUT1JNUzsgc3Rvcm1faWQrKykgeworCQlpZiAoZGV2X2RhdGEtPmJsb2NrX2luX3Jlc2V0W3Nfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uYmxvY2tfaWRdICYmCisJCSAgICBkdW1wKQorCQkJY29udGludWU7CisKKwkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9yZWdfZW50cnkocF9od2ZuLAorCQkJCQlwX3B0dCwKKwkJCQkJZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCWR1bXAsCisJCQkJCUJZVEVTX1RPX0RXT1JEUyhzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLgorCQkJCQkJCXNlbV9mYXN0X21lbV9hZGRyICsKKwkJCQkJCQlTRU1fRkFTVF9SRUdfU1RBTExFRCksCisJCQkJCTEpOworCQludW1fcmVnX2VudHJpZXMrKzsKKwl9CisKKwkvKiBXcml0ZSBoZWFkZXIgKi8KKwlpZiAoZHVtcCkKKwkJcWVkX2dyY19kdW1wX3JlZ3NfaGRyKGR1bXBfYnVmLAorCQkJCSAgICAgIHRydWUsCisJCQkJICAgICAgbnVtX3JlZ19lbnRyaWVzLCAiZW5nIiwgLTEsIE5VTEwsIE5VTEwpOworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXBzIGEgR1JDIG1lbW9yeSBoZWFkZXIgKHNlY3Rpb24gYW5kIHBhcmFtcykuCisgKiBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIGR1bXBlZDoKKyAqIG5hbWUgLSBuYW1lIGlzIGR1bXBlZCBvbmx5IGlmIGl0J3Mgbm90IE5VTEwuCisgKiBhZGRyIC0gYnl0ZV9hZGRyIGlzIGR1bXBlZCBvbmx5IGlmIG5hbWUgaXMgTlVMTC4KKyAqIGxlbiAtIGR3b3JkX2xlbiBpcyBhbHdheXMgZHVtcGVkLgorICogd2lkdGggLSBiaXRfd2lkdGggaXMgZHVtcGVkIGlmIGl0J3Mgbm90IHplcm8uCisgKiBwYWNrZWQgLSBwYWNrZWQ9MSBpcyBkdW1wZWQgaWYgaXQncyBub3QgZmFsc2UuCisgKiBtZW1fZ3JvdXAgLSBtZW1fZ3JvdXAgaXMgYWx3YXlzIGR1bXBlZC4KKyAqIGlzX3N0b3JtIC0gdHJ1ZSBvbmx5IGlmIHRoZSBtZW1vcnkgaXMgcmVsYXRlZCB0byBhIFN0b3JtLgorICogc3Rvcm1fbGV0dGVyIC0gc3Rvcm0gbGV0dGVyICh2YWxpZCBvbmx5IGlmIGlzX3N0b3JtIGlzIHRydWUpLgorICogUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9tZW1faGRyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCXUzMiAqZHVtcF9idWYsCisJCQkJYm9vbCBkdW1wLAorCQkJCWNvbnN0IGNoYXIgKm5hbWUsCisJCQkJdTMyIGJ5dGVfYWRkciwKKwkJCQl1MzIgZHdvcmRfbGVuLAorCQkJCXUzMiBiaXRfd2lkdGgsCisJCQkJYm9vbCBwYWNrZWQsCisJCQkJY29uc3QgY2hhciAqbWVtX2dyb3VwLAorCQkJCWJvb2wgaXNfc3Rvcm0sIGNoYXIgc3Rvcm1fbGV0dGVyKQoreworCXU4IG51bV9wYXJhbXMgPSAzOworCXUzMiBvZmZzZXQgPSAwOworCWNoYXIgYnVmWzY0XTsKKworCWlmICghZHdvcmRfbGVuKQorCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAiVW5leHBlY3RlZCBHUkMgRHVtcCBlcnJvcjogZHVtcGVkIG1lbW9yeSBzaXplIG11c3QgYmUgbm9uLXplcm9cbiIpOworCWlmIChiaXRfd2lkdGgpCisJCW51bV9wYXJhbXMrKzsKKwlpZiAocGFja2VkKQorCQludW1fcGFyYW1zKys7CisKKwkvKiBEdW1wIHNlY3Rpb24gaGVhZGVyICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX3NlY3Rpb25faGRyKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgICBkdW1wLCAiZ3JjX21lbSIsIG51bV9wYXJhbXMpOworCWlmIChuYW1lKSB7CisJCS8qIER1bXAgbmFtZSAqLworCQlpZiAoaXNfc3Rvcm0pIHsKKwkJCXN0cmNweShidWYsICI/U1RPUk1fIik7CisJCQlidWZbMF0gPSBzdG9ybV9sZXR0ZXI7CisJCQlzdHJjcHkoYnVmICsgc3RybGVuKGJ1ZiksIG5hbWUpOworCQl9IGVsc2UgeworCQkJc3RyY3B5KGJ1ZiwgbmFtZSk7CisJCX0KKworCQlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkgICAgIGR1bXAsICJuYW1lIiwgYnVmKTsKKwkJaWYgKGR1bXApCisJCQlEUF9WRVJCT1NFKHBfaHdmbiwKKwkJCQkgICBRRURfTVNHX0RFQlVHLAorCQkJCSAgICJEdW1waW5nICVkIHJlZ2lzdGVycyBmcm9tICVzLi4uXG4iLAorCQkJCSAgIGR3b3JkX2xlbiwgYnVmKTsKKwl9IGVsc2UgeworCQkvKiBEdW1wIGFkZHJlc3MgKi8KKwkJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJICAgICBkdW1wLCAiYWRkciIsIGJ5dGVfYWRkcik7CisJCWlmIChkdW1wICYmIGR3b3JkX2xlbiA+IDY0KQorCQkJRFBfVkVSQk9TRShwX2h3Zm4sCisJCQkJICAgUUVEX01TR19ERUJVRywKKwkJCQkgICAiRHVtcGluZyAlZCByZWdpc3RlcnMgZnJvbSBhZGRyZXNzIDB4JXguLi5cbiIsCisJCQkJICAgZHdvcmRfbGVuLCBieXRlX2FkZHIpOworCX0KKworCS8qIER1bXAgbGVuICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgImxlbiIsIGR3b3JkX2xlbik7CisKKwkvKiBEdW1wIGJpdCB3aWR0aCAqLworCWlmIChiaXRfd2lkdGgpCisJCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCSAgICAgZHVtcCwgIndpZHRoIiwgYml0X3dpZHRoKTsKKworCS8qIER1bXAgcGFja2VkICovCisJaWYgKHBhY2tlZCkKKwkJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJICAgICBkdW1wLCAicGFja2VkIiwgMSk7CisKKwkvKiBEdW1wIHJlZyB0eXBlICovCisJaWYgKGlzX3N0b3JtKSB7CisJCXN0cmNweShidWYsICI/U1RPUk1fIik7CisJCWJ1ZlswXSA9IHN0b3JtX2xldHRlcjsKKwkJc3RyY3B5KGJ1ZiArIHN0cmxlbihidWYpLCBtZW1fZ3JvdXApOworCX0gZWxzZSB7CisJCXN0cmNweShidWYsIG1lbV9ncm91cCk7CisJfQorCisJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cl9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgInR5cGUiLCBidWYpOworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXBzIGEgc2luZ2xlIEdSQyBtZW1vcnkuIElmIG5hbWUgaXMgTlVMTCwgdGhlIG1lbW9yeSBpcyBzdG9yZWQgYnkgYWRkcmVzcy4KKyAqIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfbWVtKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCSAgICB1MzIgKmR1bXBfYnVmLAorCQkJICAgIGJvb2wgZHVtcCwKKwkJCSAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgIHUzMiBieXRlX2FkZHIsCisJCQkgICAgdTMyIGR3b3JkX2xlbiwKKwkJCSAgICB1MzIgYml0X3dpZHRoLAorCQkJICAgIGJvb2wgcGFja2VkLAorCQkJICAgIGNvbnN0IGNoYXIgKm1lbV9ncm91cCwKKwkJCSAgICBib29sIGlzX3N0b3JtLCBjaGFyIHN0b3JtX2xldHRlcikKK3sKKwl1MzIgb2Zmc2V0ID0gMDsKKworCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfbWVtX2hkcihwX2h3Zm4sCisJCQkJICAgICAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgICBkdW1wLAorCQkJCSAgICAgICBuYW1lLAorCQkJCSAgICAgICBieXRlX2FkZHIsCisJCQkJICAgICAgIGR3b3JkX2xlbiwKKwkJCQkgICAgICAgYml0X3dpZHRoLAorCQkJCSAgICAgICBwYWNrZWQsCisJCQkJICAgICAgIG1lbV9ncm91cCwgaXNfc3Rvcm0sIHN0b3JtX2xldHRlcik7CisJaWYgKGR1bXApIHsKKwkJdTMyIGk7CisKKwkJZm9yIChpID0gMDsgaSA8IGR3b3JkX2xlbjsKKwkJICAgICBpKyssIGJ5dGVfYWRkciArPSBCWVRFU19JTl9EV09SRCwgb2Zmc2V0KyspCisJCQkqKGR1bXBfYnVmICsgb2Zmc2V0KSA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LCBieXRlX2FkZHIpOworCX0gZWxzZSB7CisJCW9mZnNldCArPSBkd29yZF9sZW47CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcHMgR1JDIG1lbW9yaWVzIGVudHJpZXMuIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4gKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX21lbV9lbnRyaWVzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgIHN0cnVjdCBkYmdfYXJyYXkgaW5wdXRfbWVtc19hcnIsCisJCQkJICAgIHUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCkKK3sKKwl1MzIgaSwgb2Zmc2V0ID0gMCwgaW5wdXRfb2Zmc2V0ID0gMDsKKwlib29sIG1vZGVfbWF0Y2ggPSB0cnVlOworCisJd2hpbGUgKGlucHV0X29mZnNldCA8IGlucHV0X21lbXNfYXJyLnNpemVfaW5fZHdvcmRzKSB7CisJCWNvbnN0IHN0cnVjdCBkYmdfZHVtcF9jb25kX2hkciAqY29uZF9oZHI7CisJCXUzMiBudW1fZW50cmllczsKKwkJYm9vbCBldmFsX21vZGU7CisKKwkJY29uZF9oZHIgPSAoY29uc3Qgc3RydWN0IGRiZ19kdW1wX2NvbmRfaGRyICopCisJCQkgICAmaW5wdXRfbWVtc19hcnIucHRyW2lucHV0X29mZnNldCsrXTsKKwkJZXZhbF9tb2RlID0gR0VUX0ZJRUxEKGNvbmRfaGRyLT5tb2RlLmRhdGEsCisJCQkJICAgICAgREJHX01PREVfSERSX0VWQUxfTU9ERSkgPiAwOworCisJCS8qIENoZWNrIHJlcXVpcmVkIG1vZGUgKi8KKwkJaWYgKGV2YWxfbW9kZSkgeworCQkJdTE2IG1vZGVzX2J1Zl9vZmZzZXQgPQorCQkJCUdFVF9GSUVMRChjb25kX2hkci0+bW9kZS5kYXRhLAorCQkJCQkgIERCR19NT0RFX0hEUl9NT0RFU19CVUZfT0ZGU0VUKTsKKworCQkJbW9kZV9tYXRjaCA9IHFlZF9pc19tb2RlX21hdGNoKHBfaHdmbiwKKwkJCQkJCSAgICAgICAmbW9kZXNfYnVmX29mZnNldCk7CisJCX0KKworCQlpZiAoIW1vZGVfbWF0Y2gpIHsKKwkJCWlucHV0X29mZnNldCArPSBjb25kX2hkci0+ZGF0YV9zaXplOworCQkJY29udGludWU7CisJCX0KKworCQludW1fZW50cmllcyA9IGNvbmRfaGRyLT5kYXRhX3NpemUgLyBNRU1fRFVNUF9FTlRSWV9TSVpFX0RXT1JEUzsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOworCQkgICAgIGkrKywgaW5wdXRfb2Zmc2V0ICs9IE1FTV9EVU1QX0VOVFJZX1NJWkVfRFdPUkRTKSB7CisJCQljb25zdCBzdHJ1Y3QgZGJnX2R1bXBfbWVtICptZW0gPQorCQkJCShjb25zdCBzdHJ1Y3QgZGJnX2R1bXBfbWVtICopCisJCQkJJmlucHV0X21lbXNfYXJyLnB0cltpbnB1dF9vZmZzZXRdOworCQkJdTggbWVtX2dyb3VwX2lkOworCisJCQltZW1fZ3JvdXBfaWQgPSBHRVRfRklFTEQobWVtLT5kd29yZDAsCisJCQkJCQkgREJHX0RVTVBfTUVNX01FTV9HUk9VUF9JRCk7CisJCQlpZiAobWVtX2dyb3VwX2lkID49IE1FTV9HUk9VUFNfTlVNKSB7CisJCQkJRFBfTk9USUNFKHBfaHdmbiwgIkludmFsaWQgbWVtX2dyb3VwX2lkXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJaWYgKHFlZF9ncmNfaXNfbWVtX2luY2x1ZGVkKHBfaHdmbiwKKwkJCQkJKGVudW0gYmxvY2tfaWQpY29uZF9oZHItPmJsb2NrX2lkLAorCQkJCQltZW1fZ3JvdXBfaWQpKSB7CisJCQkJdTMyIG1lbV9ieXRlX2FkZHIgPQorCQkJCQlEV09SRFNfVE9fQllURVMoR0VUX0ZJRUxEKG1lbS0+ZHdvcmQwLAorCQkJCQkJCURCR19EVU1QX01FTV9BRERSRVNTKSk7CisJCQkJdTMyIG1lbV9sZW4gPSBHRVRfRklFTEQobWVtLT5kd29yZDEsCisJCQkJCQkJREJHX0RVTVBfTUVNX0xFTkdUSCk7CisJCQkJY2hhciBzdG9ybV9sZXR0ZXIgPSAnYSc7CisJCQkJYm9vbCBpc19zdG9ybSA9IGZhbHNlOworCisJCQkJLyogVXBkYXRlIG1lbW9yeSBsZW5ndGggZm9yIENDRkMvVENGQyBtZW1vcmllcworCQkJCSAqIGFjY29yZGluZyB0byBudW1iZXIgb2YgTENJRHMvTFRJRHMuCisJCQkJICovCisJCQkJaWYgKG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfQ09OTl9DRkNfTUVNKQorCQkJCQltZW1fbGVuID0gcWVkX2dyY19nZXRfcGFyYW0ocF9od2ZuLAorCQkJCQkJCURCR19HUkNfUEFSQU1fTlVNX0xDSURTKQorCQkJCQkJCSogKG1lbV9sZW4gLyBNQVhfTENJRFMpOworCQkJCWVsc2UgaWYgKG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfVEFTS19DRkNfTUVNKQorCQkJCQltZW1fbGVuID0gcWVkX2dyY19nZXRfcGFyYW0ocF9od2ZuLAorCQkJCQkJCURCR19HUkNfUEFSQU1fTlVNX0xUSURTKQorCQkJCQkJCSogKG1lbV9sZW4gLyBNQVhfTFRJRFMpOworCisJCQkJLyogSWYgbWVtb3J5IGlzIGFzc29jaWF0ZWQgd2l0aCBTdG9ybSwgdXBkYXRlCisJCQkJICogU3Rvcm0gZGV0YWlscy4KKwkJCQkgKi8KKwkJCQlpZiAoc19ibG9ja19kZWZzW2NvbmRfaGRyLT5ibG9ja19pZF0tPgorCQkJCQkJCWFzc29jaWF0ZWRfdG9fc3Rvcm0pIHsKKwkJCQkJaXNfc3Rvcm0gPSB0cnVlOworCQkJCQlzdG9ybV9sZXR0ZXIgPQorCQkJCQkJc19zdG9ybV9kZWZzW3NfYmxvY2tfZGVmc1sKKwkJCQkJCWNvbmRfaGRyLT5ibG9ja19pZF0tPgorCQkJCQkJc3Rvcm1faWRdLmxldHRlcjsKKwkJCQl9CisKKwkJCQkvKiBEdW1wIG1lbW9yeSAqLworCQkJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfbWVtKHBfaHdmbiwgcF9wdHQsCisJCQkJCQlkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgTlVMTCwKKwkJCQkJCW1lbV9ieXRlX2FkZHIsIG1lbV9sZW4sIDAsCisJCQkJCQlmYWxzZSwKKwkJCQkJCXNfbWVtX2dyb3VwX25hbWVzW21lbV9ncm91cF9pZF0sCisJCQkJCQlpc19zdG9ybSwgc3Rvcm1fbGV0dGVyKTsKKwkJCQl9CisJCQl9CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcHMgR1JDIG1lbW9yaWVzIGFjY29yZGluZyB0byB0aGUgaW5wdXQgYXJyYXkgZHVtcF9tZW0uCisgKiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX21lbW9yaWVzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJIHUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCkKK3sKKwl1MzIgb2Zmc2V0ID0gMCwgaW5wdXRfb2Zmc2V0ID0gMDsKKworCXdoaWxlIChpbnB1dF9vZmZzZXQgPAorCSAgICAgICBzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfRFVNUF9NRU1dLnNpemVfaW5fZHdvcmRzKSB7CisJCWNvbnN0IHN0cnVjdCBkYmdfZHVtcF9zcGxpdF9oZHIgKnNwbGl0X2hkciA9CisJCQkoY29uc3Qgc3RydWN0IGRiZ19kdW1wX3NwbGl0X2hkciAqKQorCQkJJnNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19EVU1QX01FTV0ucHRyW2lucHV0X29mZnNldCsrXTsKKwkJdTggc3BsaXRfdHlwZV9pZCA9IEdFVF9GSUVMRChzcGxpdF9oZHItPmhkciwKKwkJCQkJICAgICBEQkdfRFVNUF9TUExJVF9IRFJfU1BMSVRfVFlQRV9JRCk7CisJCXUzMiBzcGxpdF9kYXRhX3NpemUgPSBHRVRfRklFTEQoc3BsaXRfaGRyLT5oZHIsCisJCQkJCQlEQkdfRFVNUF9TUExJVF9IRFJfREFUQV9TSVpFKTsKKwkJc3RydWN0IGRiZ19hcnJheSBjdXJyX2lucHV0X21lbXNfYXJyID0geworCQkJJnNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19EVU1QX01FTV0ucHRyW2lucHV0X29mZnNldF0sCisJCQlzcGxpdF9kYXRhX3NpemV9OworCisJCXN3aXRjaCAoc3BsaXRfdHlwZV9pZCkgeworCQljYXNlIFNQTElUX1RZUEVfTk9ORToKKwkJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfbWVtX2VudHJpZXMocF9od2ZuLAorCQkJCQkJCSAgIHBfcHR0LAorCQkJCQkJCSAgIGN1cnJfaW5wdXRfbWVtc19hcnIsCisJCQkJCQkJICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCQkJICAgZHVtcCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURQX05PVElDRShwX2h3Zm4sCisJCQkJICAiRHVtcGluZyBzcGxpdCBtZW1vcmllcyBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZFxuIik7CisJCQlicmVhazsKKwkJfQorCisJCWlucHV0X29mZnNldCArPSBzcGxpdF9kYXRhX3NpemU7CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcHMgR1JDIGNvbnRleHQgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCBTdG9ybS4KKyAqIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfY3R4X2RhdGEoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgdTMyICpkdW1wX2J1ZiwKKwkJCQkgYm9vbCBkdW1wLAorCQkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJCSB1MzIgbnVtX2xpZHMsCisJCQkJIHUzMiBsaWRfc2l6ZSwKKwkJCQkgdTMyIHJkX3JlZ19hZGRyLAorCQkJCSB1OCBzdG9ybV9pZCkKK3sKKwl1MzIgaSwgbGlkLCB0b3RhbF9zaXplOworCXUzMiBvZmZzZXQgPSAwOworCisJaWYgKCFsaWRfc2l6ZSkKKwkJcmV0dXJuIDA7CisJbGlkX3NpemUgKj0gQllURVNfSU5fRFdPUkQ7CisJdG90YWxfc2l6ZSA9IG51bV9saWRzICogbGlkX3NpemU7CisJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9tZW1faGRyKHBfaHdmbiwKKwkJCQkgICAgICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICAgIGR1bXAsCisJCQkJICAgICAgIG5hbWUsCisJCQkJICAgICAgIDAsCisJCQkJICAgICAgIHRvdGFsX3NpemUsCisJCQkJICAgICAgIGxpZF9zaXplICogMzIsCisJCQkJICAgICAgIGZhbHNlLAorCQkJCSAgICAgICBuYW1lLAorCQkJCSAgICAgICB0cnVlLCBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLmxldHRlcik7CisKKwkvKiBEdW1wIGNvbnRleHQgZGF0YSAqLworCWlmIChkdW1wKSB7CisJCWZvciAobGlkID0gMDsgbGlkIDwgbnVtX2xpZHM7IGxpZCsrKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGlkX3NpemU7IGkrKywgb2Zmc2V0KyspIHsKKwkJCQlxZWRfd3IocF9od2ZuLAorCQkJCSAgICAgICBwX3B0dCwKKwkJCQkgICAgICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5jbV9jdHhfd3JfYWRkciwKKwkJCQkgICAgICAgQklUKDkpIHwgbGlkKTsKKwkJCQkqKGR1bXBfYnVmICsgb2Zmc2V0KSA9IHFlZF9yZChwX2h3Zm4sCisJCQkJCQkJICAgICAgcF9wdHQsCisJCQkJCQkJICAgICAgcmRfcmVnX2FkZHIpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJb2Zmc2V0ICs9IHRvdGFsX3NpemU7CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcHMgR1JDIGNvbnRleHRzLiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9jdHgoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgKmR1bXBfYnVmLCBib29sIGR1bXApCit7CisJdTMyIG9mZnNldCA9IDA7CisJdTggc3Rvcm1faWQ7CisKKwlmb3IgKHN0b3JtX2lkID0gMDsgc3Rvcm1faWQgPCBNQVhfREJHX1NUT1JNUzsgc3Rvcm1faWQrKykgeworCQlpZiAoIXFlZF9ncmNfaXNfc3Rvcm1faW5jbHVkZWQocF9od2ZuLAorCQkJCQkgICAgICAgKGVudW0gZGJnX3N0b3JtcylzdG9ybV9pZCkpCisJCQljb250aW51ZTsKKworCQkvKiBEdW1wIENvbm4gQUcgY29udGV4dCBzaXplICovCisJCW9mZnNldCArPQorCQkJcWVkX2dyY19kdW1wX2N0eF9kYXRhKHBfaHdmbiwKKwkJCQkJICAgICAgcF9wdHQsCisJCQkJCSAgICAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkgICAgICBkdW1wLAorCQkJCQkgICAgICAiQ09OTl9BR19DVFgiLAorCQkJCQkgICAgICBxZWRfZ3JjX2dldF9wYXJhbShwX2h3Zm4sCisJCQkJCQkgICAgREJHX0dSQ19QQVJBTV9OVU1fTENJRFMpLAorCQkJCQkgICAgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLgorCQkJCQkJICAgIGNtX2Nvbm5fYWdfY3R4X2xpZF9zaXplLAorCQkJCQkgICAgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLgorCQkJCQkJICAgIGNtX2Nvbm5fYWdfY3R4X3JkX2FkZHIsCisJCQkJCSAgICAgIHN0b3JtX2lkKTsKKworCQkvKiBEdW1wIENvbm4gU1QgY29udGV4dCBzaXplICovCisJCW9mZnNldCArPQorCQkJcWVkX2dyY19kdW1wX2N0eF9kYXRhKHBfaHdmbiwKKwkJCQkJICAgICAgcF9wdHQsCisJCQkJCSAgICAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkgICAgICBkdW1wLAorCQkJCQkgICAgICAiQ09OTl9TVF9DVFgiLAorCQkJCQkgICAgICBxZWRfZ3JjX2dldF9wYXJhbShwX2h3Zm4sCisJCQkJCQkgICAgREJHX0dSQ19QQVJBTV9OVU1fTENJRFMpLAorCQkJCQkgICAgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLgorCQkJCQkJICAgIGNtX2Nvbm5fc3RfY3R4X2xpZF9zaXplLAorCQkJCQkgICAgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLgorCQkJCQkJICAgIGNtX2Nvbm5fc3RfY3R4X3JkX2FkZHIsCisJCQkJCSAgICAgIHN0b3JtX2lkKTsKKworCQkvKiBEdW1wIFRhc2sgQUcgY29udGV4dCBzaXplICovCisJCW9mZnNldCArPQorCQkJcWVkX2dyY19kdW1wX2N0eF9kYXRhKHBfaHdmbiwKKwkJCQkJICAgICAgcF9wdHQsCisJCQkJCSAgICAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkgICAgICBkdW1wLAorCQkJCQkgICAgICAiVEFTS19BR19DVFgiLAorCQkJCQkgICAgICBxZWRfZ3JjX2dldF9wYXJhbShwX2h3Zm4sCisJCQkJCQkgICAgREJHX0dSQ19QQVJBTV9OVU1fTFRJRFMpLAorCQkJCQkgICAgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLgorCQkJCQkJICAgIGNtX3Rhc2tfYWdfY3R4X2xpZF9zaXplLAorCQkJCQkgICAgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLgorCQkJCQkJICAgIGNtX3Rhc2tfYWdfY3R4X3JkX2FkZHIsCisJCQkJCSAgICAgIHN0b3JtX2lkKTsKKworCQkvKiBEdW1wIFRhc2sgU1QgY29udGV4dCBzaXplICovCisJCW9mZnNldCArPQorCQkJcWVkX2dyY19kdW1wX2N0eF9kYXRhKHBfaHdmbiwKKwkJCQkJICAgICAgcF9wdHQsCisJCQkJCSAgICAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkgICAgICBkdW1wLAorCQkJCQkgICAgICAiVEFTS19TVF9DVFgiLAorCQkJCQkgICAgICBxZWRfZ3JjX2dldF9wYXJhbShwX2h3Zm4sCisJCQkJCQkgICAgREJHX0dSQ19QQVJBTV9OVU1fTFRJRFMpLAorCQkJCQkgICAgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLgorCQkJCQkJICAgIGNtX3Rhc2tfc3RfY3R4X2xpZF9zaXplLAorCQkJCQkgICAgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLgorCQkJCQkJICAgIGNtX3Rhc2tfc3RfY3R4X3JkX2FkZHIsCisJCQkJCSAgICAgIHN0b3JtX2lkKTsKKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wcyBHUkMgSU9ScyBkYXRhLiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9pb3JzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCkKK3sKKwljaGFyIGJ1ZlsxMF0gPSAiSU9SX1NFVF8/IjsKKwl1OCBzdG9ybV9pZCwgc2V0X2lkOworCXUzMiBvZmZzZXQgPSAwOworCisJZm9yIChzdG9ybV9pZCA9IDA7IHN0b3JtX2lkIDwgTUFYX0RCR19TVE9STVM7IHN0b3JtX2lkKyspIHsKKwkJaWYgKHFlZF9ncmNfaXNfc3Rvcm1faW5jbHVkZWQocF9od2ZuLAorCQkJCQkgICAgICAoZW51bSBkYmdfc3Rvcm1zKXN0b3JtX2lkKSkgeworCQkJZm9yIChzZXRfaWQgPSAwOyBzZXRfaWQgPCBOVU1fSU9SX1NFVFM7IHNldF9pZCsrKSB7CisJCQkJdTMyIGFkZHIgPQorCQkJCSAgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLnNlbV9mYXN0X21lbV9hZGRyICsKKwkJCQkgICAgU0VNX0ZBU1RfUkVHX1NUT1JNX1JFR19GSUxFICsKKwkJCQkgICAgRFdPUkRTX1RPX0JZVEVTKElPUl9TRVRfT0ZGU0VUKHNldF9pZCkpOworCisJCQkJYnVmW3N0cmxlbihidWYpIC0gMV0gPSAnMCcgKyBzZXRfaWQ7CisJCQkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9tZW0ocF9od2ZuLAorCQkJCQkJCSAgIHBfcHR0LAorCQkJCQkJCSAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkJCSAgIGR1bXAsCisJCQkJCQkJICAgYnVmLAorCQkJCQkJCSAgIGFkZHIsCisJCQkJCQkJICAgSU9SU19QRVJfU0VULAorCQkJCQkJCSAgIDMyLAorCQkJCQkJCSAgIGZhbHNlLAorCQkJCQkJCSAgICJpb3IiLAorCQkJCQkJCSAgIHRydWUsCisJCQkJCQkJICAgc19zdG9ybV9kZWZzCisJCQkJCQkJICAgW3N0b3JtX2lkXS5sZXR0ZXIpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcCBWRkMgQ0FNLiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF92ZmNfY2FtKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCXN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQl1MzIgKmR1bXBfYnVmLCBib29sIGR1bXAsIHU4IHN0b3JtX2lkKQoreworCXUzMiB0b3RhbF9zaXplID0gVkZDX0NBTV9OVU1fUk9XUyAqIFZGQ19DQU1fUkVTUF9EV09SRFM7CisJdTMyIGNhbV9hZGRyW1ZGQ19DQU1fQUREUl9EV09SRFNdID0geyAwIH07CisJdTMyIGNhbV9jbWRbVkZDX0NBTV9DTURfRFdPUkRTXSA9IHsgMCB9OworCXUzMiBvZmZzZXQgPSAwOworCXUzMiByb3csIGk7CisKKwlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX21lbV9oZHIocF9od2ZuLAorCQkJCSAgICAgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgICAgZHVtcCwKKwkJCQkgICAgICAgInZmY19jYW0iLAorCQkJCSAgICAgICAwLAorCQkJCSAgICAgICB0b3RhbF9zaXplLAorCQkJCSAgICAgICAyNTYsCisJCQkJICAgICAgIGZhbHNlLAorCQkJCSAgICAgICAidmZjX2NhbSIsCisJCQkJICAgICAgIHRydWUsIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0ubGV0dGVyKTsKKwlpZiAoZHVtcCkgeworCQkvKiBQcmVwYXJlIENBTSBhZGRyZXNzICovCisJCVNFVF9WQVJfRklFTEQoY2FtX2FkZHIsIFZGQ19DQU1fQUREUiwgT1AsIFZGQ19PUENPREVfQ0FNX1JEKTsKKwkJZm9yIChyb3cgPSAwOyByb3cgPCBWRkNfQ0FNX05VTV9ST1dTOworCQkgICAgIHJvdysrLCBvZmZzZXQgKz0gVkZDX0NBTV9SRVNQX0RXT1JEUykgeworCQkJLyogV3JpdGUgVkZDIENBTSBjb21tYW5kICovCisJCQlTRVRfVkFSX0ZJRUxEKGNhbV9jbWQsIFZGQ19DQU1fQ01ELCBST1csIHJvdyk7CisJCQlBUlJfUkVHX1dSKHBfaHdmbiwKKwkJCQkgICBwX3B0dCwKKwkJCQkgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLnNlbV9mYXN0X21lbV9hZGRyICsKKwkJCQkgICBTRU1fRkFTVF9SRUdfVkZDX0RBVEFfV1IsCisJCQkJICAgY2FtX2NtZCwgVkZDX0NBTV9DTURfRFdPUkRTKTsKKworCQkJLyogV3JpdGUgVkZDIENBTSBhZGRyZXNzICovCisJCQlBUlJfUkVHX1dSKHBfaHdmbiwKKwkJCQkgICBwX3B0dCwKKwkJCQkgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLnNlbV9mYXN0X21lbV9hZGRyICsKKwkJCQkgICBTRU1fRkFTVF9SRUdfVkZDX0FERFIsCisJCQkJICAgY2FtX2FkZHIsIFZGQ19DQU1fQUREUl9EV09SRFMpOworCisJCQkvKiBSZWFkIFZGQyBDQU0gcmVhZCByZXNwb25zZSAqLworCQkJQVJSX1JFR19SRChwX2h3Zm4sCisJCQkJICAgcF9wdHQsCisJCQkJICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5zZW1fZmFzdF9tZW1fYWRkciArCisJCQkJICAgU0VNX0ZBU1RfUkVHX1ZGQ19EQVRBX1JELAorCQkJCSAgIGR1bXBfYnVmICsgb2Zmc2V0LCBWRkNfQ0FNX1JFU1BfRFdPUkRTKTsKKwkJfQorCX0gZWxzZSB7CisJCW9mZnNldCArPSB0b3RhbF9zaXplOworCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXAgVkZDIFJBTS4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLiAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfdmZjX3JhbShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJdTMyICpkdW1wX2J1ZiwKKwkJCQlib29sIGR1bXAsCisJCQkJdTggc3Rvcm1faWQsIHN0cnVjdCB2ZmNfcmFtX2RlZnMgKnJhbV9kZWZzKQoreworCXUzMiB0b3RhbF9zaXplID0gcmFtX2RlZnMtPm51bV9yb3dzICogVkZDX1JBTV9SRVNQX0RXT1JEUzsKKwl1MzIgcmFtX2FkZHJbVkZDX1JBTV9BRERSX0RXT1JEU10gPSB7IDAgfTsKKwl1MzIgcmFtX2NtZFtWRkNfUkFNX0NNRF9EV09SRFNdID0geyAwIH07CisJdTMyIG9mZnNldCA9IDA7CisJdTMyIHJvdywgaTsKKworCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfbWVtX2hkcihwX2h3Zm4sCisJCQkJICAgICAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgICBkdW1wLAorCQkJCSAgICAgICByYW1fZGVmcy0+bWVtX25hbWUsCisJCQkJICAgICAgIDAsCisJCQkJICAgICAgIHRvdGFsX3NpemUsCisJCQkJICAgICAgIDI1NiwKKwkJCQkgICAgICAgZmFsc2UsCisJCQkJICAgICAgIHJhbV9kZWZzLT50eXBlX25hbWUsCisJCQkJICAgICAgIHRydWUsIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0ubGV0dGVyKTsKKworCS8qIFByZXBhcmUgUkFNIGFkZHJlc3MgKi8KKwlTRVRfVkFSX0ZJRUxEKHJhbV9hZGRyLCBWRkNfUkFNX0FERFIsIE9QLCBWRkNfT1BDT0RFX1JBTV9SRCk7CisKKwlpZiAoIWR1bXApCisJCXJldHVybiBvZmZzZXQgKyB0b3RhbF9zaXplOworCisJZm9yIChyb3cgPSByYW1fZGVmcy0+YmFzZV9yb3c7CisJICAgICByb3cgPCByYW1fZGVmcy0+YmFzZV9yb3cgKyByYW1fZGVmcy0+bnVtX3Jvd3M7CisJICAgICByb3crKywgb2Zmc2V0ICs9IFZGQ19SQU1fUkVTUF9EV09SRFMpIHsKKwkJLyogV3JpdGUgVkZDIFJBTSBjb21tYW5kICovCisJCUFSUl9SRUdfV1IocF9od2ZuLAorCQkJICAgcF9wdHQsCisJCQkgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLnNlbV9mYXN0X21lbV9hZGRyICsKKwkJCSAgIFNFTV9GQVNUX1JFR19WRkNfREFUQV9XUiwKKwkJCSAgIHJhbV9jbWQsIFZGQ19SQU1fQ01EX0RXT1JEUyk7CisKKwkJLyogV3JpdGUgVkZDIFJBTSBhZGRyZXNzICovCisJCVNFVF9WQVJfRklFTEQocmFtX2FkZHIsIFZGQ19SQU1fQUREUiwgUk9XLCByb3cpOworCQlBUlJfUkVHX1dSKHBfaHdmbiwKKwkJCSAgIHBfcHR0LAorCQkJICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5zZW1fZmFzdF9tZW1fYWRkciArCisJCQkgICBTRU1fRkFTVF9SRUdfVkZDX0FERFIsCisJCQkgICByYW1fYWRkciwgVkZDX1JBTV9BRERSX0RXT1JEUyk7CisKKwkJLyogUmVhZCBWRkMgUkFNIHJlYWQgcmVzcG9uc2UgKi8KKwkJQVJSX1JFR19SRChwX2h3Zm4sCisJCQkgICBwX3B0dCwKKwkJCSAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uc2VtX2Zhc3RfbWVtX2FkZHIgKworCQkJICAgU0VNX0ZBU1RfUkVHX1ZGQ19EQVRBX1JELAorCQkJICAgZHVtcF9idWYgKyBvZmZzZXQsIFZGQ19SQU1fUkVTUF9EV09SRFMpOworCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXBzIEdSQyBWRkMgZGF0YS4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLiAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfdmZjKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wKQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwl1OCBzdG9ybV9pZCwgaTsKKwl1MzIgb2Zmc2V0ID0gMDsKKworCWZvciAoc3Rvcm1faWQgPSAwOyBzdG9ybV9pZCA8IE1BWF9EQkdfU1RPUk1TOyBzdG9ybV9pZCsrKSB7CisJCWlmIChxZWRfZ3JjX2lzX3N0b3JtX2luY2x1ZGVkKHBfaHdmbiwKKwkJCQkJICAgICAgKGVudW0gZGJnX3N0b3JtcylzdG9ybV9pZCkgJiYKKwkJICAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uaGFzX3ZmYyAmJgorCQkgICAgKHN0b3JtX2lkICE9IERCR19QU1RPUk1fSUQgfHwKKwkJICAgICBkZXZfZGF0YS0+cGxhdGZvcm1faWQgPT0gUExBVEZPUk1fQVNJQykpIHsKKwkJCS8qIFJlYWQgQ0FNICovCisJCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3ZmY19jYW0ocF9od2ZuLAorCQkJCQkJICAgICAgIHBfcHR0LAorCQkJCQkJICAgICAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkJICAgICAgIGR1bXAsIHN0b3JtX2lkKTsKKworCQkJLyogUmVhZCBSQU0gKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBOVU1fVkZDX1JBTV9UWVBFUzsgaSsrKQorCQkJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfdmZjX3JhbShwX2h3Zm4sCisJCQkJCQkJICAgICAgIHBfcHR0LAorCQkJCQkJCSAgICAgICBkdW1wX2J1ZiArCisJCQkJCQkJICAgICAgIG9mZnNldCwKKwkJCQkJCQkgICAgICAgZHVtcCwKKwkJCQkJCQkgICAgICAgc3Rvcm1faWQsCisJCQkJCQkJICAgICAgICZzX3ZmY19yYW1fZGVmcworCQkJCQkJCSAgICAgICBbaV0pOworCQl9CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcHMgR1JDIFJTUyBkYXRhLiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9yc3Moc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgKmR1bXBfYnVmLCBib29sIGR1bXApCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCXUzMiBvZmZzZXQgPSAwOworCXU4IHJzc19tZW1faWQ7CisKKwlmb3IgKHJzc19tZW1faWQgPSAwOyByc3NfbWVtX2lkIDwgTlVNX1JTU19NRU1fVFlQRVM7IHJzc19tZW1faWQrKykgeworCQlzdHJ1Y3QgcnNzX21lbV9kZWZzICpyc3NfZGVmcyA9ICZzX3Jzc19tZW1fZGVmc1tyc3NfbWVtX2lkXTsKKwkJdTMyIG51bV9lbnRyaWVzID0gcnNzX2RlZnMtPm51bV9lbnRyaWVzW2Rldl9kYXRhLT5jaGlwX2lkXTsKKwkJdTMyIGVudHJ5X3dpZHRoID0gcnNzX2RlZnMtPmVudHJ5X3dpZHRoW2Rldl9kYXRhLT5jaGlwX2lkXTsKKwkJdTMyIHRvdGFsX3NpemUgPSAobnVtX2VudHJpZXMgKiBlbnRyeV93aWR0aCkgLyAzMjsKKwkJYm9vbCBwYWNrZWQgPSAoZW50cnlfd2lkdGggPT0gMTYpOworCQl1MzIgYWRkciA9IHJzc19kZWZzLT5hZGRyOworCQl1MzIgaSwgajsKKworCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX21lbV9oZHIocF9od2ZuLAorCQkJCQkgICAgICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCSAgICAgICBkdW1wLAorCQkJCQkgICAgICAgcnNzX2RlZnMtPm1lbV9uYW1lLAorCQkJCQkgICAgICAgYWRkciwKKwkJCQkJICAgICAgIHRvdGFsX3NpemUsCisJCQkJCSAgICAgICBlbnRyeV93aWR0aCwKKwkJCQkJICAgICAgIHBhY2tlZCwKKwkJCQkJICAgICAgIHJzc19kZWZzLT50eXBlX25hbWUsIGZhbHNlLCAwKTsKKworCQlpZiAoIWR1bXApIHsKKwkJCW9mZnNldCArPSB0b3RhbF9zaXplOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBEdW1wIFJTUyBkYXRhICovCisJCWZvciAoaSA9IDA7IGkgPCBCWVRFU19UT19EV09SRFModG90YWxfc2l6ZSk7IGkrKywgYWRkcisrKSB7CisJCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwgUlNTX1JFR19SU1NfUkFNX0FERFIsIGFkZHIpOworCQkJZm9yIChqID0gMDsgaiA8IEJZVEVTX0lOX0RXT1JEOyBqKyssIG9mZnNldCsrKQorCQkJCSooZHVtcF9idWYgKyBvZmZzZXQpID0KKwkJCQkJcWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCQkJCSAgICAgICBSU1NfUkVHX1JTU19SQU1fREFUQSArCisJCQkJCSAgICAgICBEV09SRFNfVE9fQllURVMoaikpOworCQl9CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcHMgR1JDIEJpZyBSQU0uIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4gKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX2JpZ19yYW0oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCXUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCwgdTggYmlnX3JhbV9pZCkKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJY2hhciBtZW1fbmFtZVsxMl0gPSAiPz8/X0JJR19SQU0iOworCWNoYXIgdHlwZV9uYW1lWzhdID0gIj8/P19SQU0iOworCXUzMiByYW1fc2l6ZSwgdG90YWxfYmxvY2tzOworCXUzMiBvZmZzZXQgPSAwLCBpLCBqOworCisJdG90YWxfYmxvY2tzID0KKwkJc19iaWdfcmFtX2RlZnNbYmlnX3JhbV9pZF0ubnVtX29mX2Jsb2Nrc1tkZXZfZGF0YS0+Y2hpcF9pZF07CisJcmFtX3NpemUgPSB0b3RhbF9ibG9ja3MgKiBCSUdfUkFNX0JMT0NLX1NJWkVfRFdPUkRTOworCisJc3RybmNweSh0eXBlX25hbWUsIHNfYmlnX3JhbV9kZWZzW2JpZ19yYW1faWRdLmluc3RhbmNlX25hbWUsCisJCXN0cmxlbihzX2JpZ19yYW1fZGVmc1tiaWdfcmFtX2lkXS5pbnN0YW5jZV9uYW1lKSk7CisJc3RybmNweShtZW1fbmFtZSwgc19iaWdfcmFtX2RlZnNbYmlnX3JhbV9pZF0uaW5zdGFuY2VfbmFtZSwKKwkJc3RybGVuKHNfYmlnX3JhbV9kZWZzW2JpZ19yYW1faWRdLmluc3RhbmNlX25hbWUpKTsKKworCS8qIER1bXAgbWVtb3J5IGhlYWRlciAqLworCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfbWVtX2hkcihwX2h3Zm4sCisJCQkJICAgICAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgICBkdW1wLAorCQkJCSAgICAgICBtZW1fbmFtZSwKKwkJCQkgICAgICAgMCwKKwkJCQkgICAgICAgcmFtX3NpemUsCisJCQkJICAgICAgIEJJR19SQU1fQkxPQ0tfU0laRV9CWVRFUyAqIDgsCisJCQkJICAgICAgIGZhbHNlLCB0eXBlX25hbWUsIGZhbHNlLCAwKTsKKworCWlmICghZHVtcCkKKwkJcmV0dXJuIG9mZnNldCArIHJhbV9zaXplOworCisJLyogUmVhZCBhbmQgZHVtcCBCaWcgUkFNIGRhdGEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdG90YWxfYmxvY2tzIC8gMjsgaSsrKSB7CisJCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBzX2JpZ19yYW1fZGVmc1tiaWdfcmFtX2lkXS5hZGRyX3JlZ19hZGRyLAorCQkgICAgICAgaSk7CisJCWZvciAoaiA9IDA7IGogPCAyICogQklHX1JBTV9CTE9DS19TSVpFX0RXT1JEUzsgaisrLCBvZmZzZXQrKykKKwkJCSooZHVtcF9idWYgKyBvZmZzZXQpID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCQkJCQlzX2JpZ19yYW1fZGVmc1tiaWdfcmFtX2lkXS4KKwkJCQkJCQlkYXRhX3JlZ19hZGRyICsKKwkJCQkJCURXT1JEU19UT19CWVRFUyhqKSk7CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfbWNwKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wKQoreworCWJvb2wgYmxvY2tfZW5hYmxlW01BWF9CTE9DS19JRF0gPSB7IDAgfTsKKwlib29sIGhhbHRlZCA9IGZhbHNlOworCXUzMiBvZmZzZXQgPSAwOworCisJLyogSGFsdCBNQ1AgKi8KKwlpZiAoZHVtcCkgeworCQloYWx0ZWQgPSAhcWVkX21jcF9oYWx0KHBfaHdmbiwgcF9wdHQpOworCQlpZiAoIWhhbHRlZCkKKwkJCURQX05PVElDRShwX2h3Zm4sICJNQ1AgaGFsdCBmYWlsZWQhXG4iKTsKKwl9CisKKwkvKiBEdW1wIE1DUCBzY3JhdGNocGFkICovCisJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9tZW0ocF9od2ZuLAorCQkJCSAgIHBfcHR0LAorCQkJCSAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgIGR1bXAsCisJCQkJICAgTlVMTCwKKwkJCQkgICBNQ1BfUkVHX1NDUkFUQ0gsCisJCQkJICAgTUNQX1JFR19TQ1JBVENIX1NJWkUsCisJCQkJICAgMCwgZmFsc2UsICJNQ1AiLCBmYWxzZSwgMCk7CisKKwkvKiBEdW1wIE1DUCBjcHVfcmVnX2ZpbGUgKi8KKwlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX21lbShwX2h3Zm4sCisJCQkJICAgcF9wdHQsCisJCQkJICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgZHVtcCwKKwkJCQkgICBOVUxMLAorCQkJCSAgIE1DUF9SRUdfQ1BVX1JFR19GSUxFLAorCQkJCSAgIE1DUF9SRUdfQ1BVX1JFR19GSUxFX1NJWkUsCisJCQkJICAgMCwgZmFsc2UsICJNQ1AiLCBmYWxzZSwgMCk7CisKKwkvKiBEdW1wIE1DUCByZWdpc3RlcnMgKi8KKwlibG9ja19lbmFibGVbQkxPQ0tfTUNQXSA9IHRydWU7CisJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9yZWdpc3RlcnMocF9od2ZuLAorCQkJCQkgcF9wdHQsCisJCQkJCSBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJIGR1bXAsIGJsb2NrX2VuYWJsZSwgImJsb2NrIiwgIk1DUCIpOworCisJLyogRHVtcCByZXF1aXJlZCBub24tTUNQIHJlZ2lzdGVycyAqLworCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfcmVnc19oZHIoZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCWR1bXAsIDEsICJlbmciLCAtMSwgImJsb2NrIiwgIk1DUCIpOworCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfcmVnX2VudHJ5KHBfaHdmbiwKKwkJCQkJIHBfcHR0LAorCQkJCQkgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCSBkdW1wLAorCQkJCQkgQllURVNfVE9fRFdPUkRTCisJCQkJCSAoTUlTQ19SRUdfU0hBUkVEX01FTV9BRERSKSwgMSk7CisKKwkvKiBSZWxlYXNlIE1DUCAqLworCWlmIChoYWx0ZWQgJiYgcWVkX21jcF9yZXN1bWUocF9od2ZuLCBwX3B0dCkpCisJCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gcmVzdW1lIE1DUCBhZnRlciBoYWx0IVxuIik7CisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcHMgdGhlIHRidXMgaW5kaXJlY3QgbWVtb3J5IGZvciBhbGwgUEhZcy4gKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX3BoeShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCkKK3sKKwl1MzIgb2Zmc2V0ID0gMCwgdGJ1c19sb19vZmZzZXQsIHRidXNfaGlfb2Zmc2V0OworCWNoYXIgbWVtX25hbWVbMzJdOworCXU4IHBoeV9pZDsKKworCWZvciAocGh5X2lkID0gMDsgcGh5X2lkIDwgQVJSQVlfU0laRShzX3BoeV9kZWZzKTsgcGh5X2lkKyspIHsKKwkJc3RydWN0IHBoeV9kZWZzICpwaHlfZGVmcyA9ICZzX3BoeV9kZWZzW3BoeV9pZF07CisJCWludCBwcmludGVkX2NoYXJzOworCisJCXByaW50ZWRfY2hhcnMgPSBzbnByaW50ZihtZW1fbmFtZSwgc2l6ZW9mKG1lbV9uYW1lKSwgInRidXNfJXMiLAorCQkJCQkgcGh5X2RlZnMtPnBoeV9uYW1lKTsKKwkJaWYgKHByaW50ZWRfY2hhcnMgPCAwIHx8IHByaW50ZWRfY2hhcnMgPj0gc2l6ZW9mKG1lbV9uYW1lKSkKKwkJCURQX05PVElDRShwX2h3Zm4sCisJCQkJICAiVW5leHBlY3RlZCBkZWJ1ZyBlcnJvcjogaW52YWxpZCBQSFkgbWVtb3J5IG5hbWVcbiIpOworCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX21lbV9oZHIocF9od2ZuLAorCQkJCQkgICAgICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCSAgICAgICBkdW1wLAorCQkJCQkgICAgICAgbWVtX25hbWUsCisJCQkJCSAgICAgICAwLAorCQkJCQkgICAgICAgUEhZX0RVTVBfU0laRV9EV09SRFMsCisJCQkJCSAgICAgICAxNiwgdHJ1ZSwgbWVtX25hbWUsIGZhbHNlLCAwKTsKKwkJaWYgKGR1bXApIHsKKwkJCXUzMiBhZGRyX2xvX2FkZHIgPSBwaHlfZGVmcy0+YmFzZV9hZGRyICsKKwkJCQkJICAgcGh5X2RlZnMtPnRidXNfYWRkcl9sb19hZGRyOworCQkJdTMyIGFkZHJfaGlfYWRkciA9IHBoeV9kZWZzLT5iYXNlX2FkZHIgKworCQkJCQkgICBwaHlfZGVmcy0+dGJ1c19hZGRyX2hpX2FkZHI7CisJCQl1MzIgZGF0YV9sb19hZGRyID0gcGh5X2RlZnMtPmJhc2VfYWRkciArCisJCQkJCSAgIHBoeV9kZWZzLT50YnVzX2RhdGFfbG9fYWRkcjsKKwkJCXUzMiBkYXRhX2hpX2FkZHIgPSBwaHlfZGVmcy0+YmFzZV9hZGRyICsKKwkJCQkJICAgcGh5X2RlZnMtPnRidXNfZGF0YV9oaV9hZGRyOworCQkJdTggKmJ5dGVzX2J1ZiA9ICh1OCAqKShkdW1wX2J1ZiArIG9mZnNldCk7CisKKwkJCWZvciAodGJ1c19oaV9vZmZzZXQgPSAwOworCQkJICAgICB0YnVzX2hpX29mZnNldCA8IChOVU1fUEhZX1RCVVNfQUREUkVTU0VTID4+IDgpOworCQkJICAgICB0YnVzX2hpX29mZnNldCsrKSB7CisJCQkJcWVkX3dyKHBfaHdmbiwKKwkJCQkgICAgICAgcF9wdHQsIGFkZHJfaGlfYWRkciwgdGJ1c19oaV9vZmZzZXQpOworCQkJCWZvciAodGJ1c19sb19vZmZzZXQgPSAwOyB0YnVzX2xvX29mZnNldCA8IDI1NjsKKwkJCQkgICAgIHRidXNfbG9fb2Zmc2V0KyspIHsKKwkJCQkJcWVkX3dyKHBfaHdmbiwKKwkJCQkJICAgICAgIHBfcHR0LAorCQkJCQkgICAgICAgYWRkcl9sb19hZGRyLCB0YnVzX2xvX29mZnNldCk7CisJCQkJCSooYnl0ZXNfYnVmKyspID0KKwkJCQkJCSh1OClxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJCQkJCQkgICBkYXRhX2xvX2FkZHIpOworCQkJCQkqKGJ5dGVzX2J1ZisrKSA9CisJCQkJCQkodTgpcWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCQkJCQkJICAgZGF0YV9oaV9hZGRyKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlvZmZzZXQgKz0gUEhZX0RVTVBfU0laRV9EV09SRFM7CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIHZvaWQgcWVkX2NvbmZpZ19kYmdfbGluZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJZW51bSBibG9ja19pZCBibG9ja19pZCwKKwkJCQl1OCBsaW5lX2lkLAorCQkJCXU4IGN5Y2xlX2VuLAorCQkJCXU4IHJpZ2h0X3NoaWZ0LCB1OCBmb3JjZV92YWxpZCwgdTggZm9yY2VfZnJhbWUpCit7CisJc3RydWN0IGJsb2NrX2RlZnMgKnBfYmxvY2tfZGVmcyA9IHNfYmxvY2tfZGVmc1tibG9ja19pZF07CisKKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgcF9ibG9ja19kZWZzLT5kYmdfc2VsZWN0X2FkZHIsIGxpbmVfaWQpOworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBwX2Jsb2NrX2RlZnMtPmRiZ19jeWNsZV9lbmFibGVfYWRkciwgY3ljbGVfZW4pOworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBwX2Jsb2NrX2RlZnMtPmRiZ19zaGlmdF9hZGRyLCByaWdodF9zaGlmdCk7CisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIHBfYmxvY2tfZGVmcy0+ZGJnX2ZvcmNlX3ZhbGlkX2FkZHIsIGZvcmNlX3ZhbGlkKTsKKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgcF9ibG9ja19kZWZzLT5kYmdfZm9yY2VfZnJhbWVfYWRkciwgZm9yY2VfZnJhbWUpOworfQorCisvKiBEdW1wcyBTdGF0aWMgRGVidWcgZGF0YS4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLiAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfc3RhdGljX2RlYnVnKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgICAgdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wKQoreworCXUzMiBibG9ja19kd29yZHMgPSBOVU1fREJHX0JVU19MSU5FUyAqIFNUQVRJQ19ERUJVR19MSU5FX0RXT1JEUzsKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJdTMyIG9mZnNldCA9IDAsIGJsb2NrX2lkLCBsaW5lX2lkLCBhZGRyLCBpOworCXN0cnVjdCBibG9ja19kZWZzICpwX2Jsb2NrX2RlZnM7CisKKwlpZiAoZHVtcCkgeworCQlEUF9WRVJCT1NFKHBfaHdmbiwKKwkJCSAgIFFFRF9NU0dfREVCVUcsICJEdW1waW5nIHN0YXRpYyBkZWJ1ZyBkYXRhLi4uXG4iKTsKKworCQkvKiBEaXNhYmxlIGFsbCBibG9ja3MgZGVidWcgb3V0cHV0ICovCisJCWZvciAoYmxvY2tfaWQgPSAwOyBibG9ja19pZCA8IE1BWF9CTE9DS19JRDsgYmxvY2tfaWQrKykgeworCQkJcF9ibG9ja19kZWZzID0gc19ibG9ja19kZWZzW2Jsb2NrX2lkXTsKKworCQkJaWYgKHBfYmxvY2tfZGVmcy0+aGFzX2RiZ19idXNbZGV2X2RhdGEtPmNoaXBfaWRdKQorCQkJCXFlZF93cihwX2h3Zm4sIHBfcHR0LAorCQkJCSAgICAgICBwX2Jsb2NrX2RlZnMtPmRiZ19jeWNsZV9lbmFibGVfYWRkciwgMCk7CisJCX0KKworCQlxZWRfYnVzX3Jlc2V0X2RiZ19ibG9jayhwX2h3Zm4sIHBfcHR0KTsKKwkJcWVkX2J1c19zZXRfZnJhbWluZ19tb2RlKHBfaHdmbiwKKwkJCQkJIHBfcHR0LCBEQkdfQlVTX0ZSQU1FX01PREVfOEhXXzBTVCk7CisJCXFlZF93cihwX2h3Zm4sCisJCSAgICAgICBwX3B0dCwgREJHX1JFR19ERUJVR19UQVJHRVQsIERCR19CVVNfVEFSR0VUX0lEX0lOVF9CVUYpOworCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwgREJHX1JFR19GVUxMX01PREUsIDEpOworCQlxZWRfYnVzX2VuYWJsZV9kYmdfYmxvY2socF9od2ZuLCBwX3B0dCwgdHJ1ZSk7CisJfQorCisJLyogRHVtcCBhbGwgc3RhdGljIGRlYnVnIGxpbmVzIGZvciBlYWNoIHJlbGV2YW50IGJsb2NrICovCisJZm9yIChibG9ja19pZCA9IDA7IGJsb2NrX2lkIDwgTUFYX0JMT0NLX0lEOyBibG9ja19pZCsrKSB7CisJCXBfYmxvY2tfZGVmcyA9IHNfYmxvY2tfZGVmc1tibG9ja19pZF07CisKKwkJaWYgKCFwX2Jsb2NrX2RlZnMtPmhhc19kYmdfYnVzW2Rldl9kYXRhLT5jaGlwX2lkXSkKKwkJCWNvbnRpbnVlOworCisJCS8qIER1bXAgc3RhdGljIHNlY3Rpb24gcGFyYW1zICovCisJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfbWVtX2hkcihwX2h3Zm4sCisJCQkJCSAgICAgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJICAgICAgIGR1bXAsCisJCQkJCSAgICAgICBwX2Jsb2NrX2RlZnMtPm5hbWUsIDAsCisJCQkJCSAgICAgICBibG9ja19kd29yZHMsIDMyLCBmYWxzZSwKKwkJCQkJICAgICAgICJTVEFUSUMiLCBmYWxzZSwgMCk7CisKKwkJaWYgKGR1bXAgJiYgIWRldl9kYXRhLT5ibG9ja19pbl9yZXNldFtibG9ja19pZF0pIHsKKwkJCXU4IGRiZ19jbGllbnRfaWQgPQorCQkJCXBfYmxvY2tfZGVmcy0+ZGJnX2NsaWVudF9pZFtkZXZfZGF0YS0+Y2hpcF9pZF07CisKKwkJCS8qIEVuYWJsZSBibG9jaydzIGNsaWVudCAqLworCQkJcWVkX2J1c19lbmFibGVfY2xpZW50cyhwX2h3Zm4sIHBfcHR0LAorCQkJCQkgICAgICAgQklUKGRiZ19jbGllbnRfaWQpKTsKKworCQkJZm9yIChsaW5lX2lkID0gMDsgbGluZV9pZCA8IE5VTV9EQkdfQlVTX0xJTkVTOworCQkJICAgICBsaW5lX2lkKyspIHsKKwkJCQkvKiBDb25maWd1cmUgZGVidWcgbGluZSBJRCAqLworCQkJCXFlZF9jb25maWdfZGJnX2xpbmUocF9od2ZuLAorCQkJCQkJICAgIHBfcHR0LAorCQkJCQkJICAgIChlbnVtIGJsb2NrX2lkKWJsb2NrX2lkLAorCQkJCQkJICAgICh1OClsaW5lX2lkLAorCQkJCQkJICAgIDB4ZiwgMCwgMCwgMCk7CisKKwkJCQkvKiBSZWFkIGRlYnVnIGxpbmUgaW5mbyAqLworCQkJCWZvciAoaSA9IDAsIGFkZHIgPSBEQkdfUkVHX0NBTEVOREFSX09VVF9EQVRBOworCQkJCSAgICAgaSA8IFNUQVRJQ19ERUJVR19MSU5FX0RXT1JEUzsKKwkJCQkgICAgIGkrKywgb2Zmc2V0KyssIGFkZHIgKz0gQllURVNfSU5fRFdPUkQpCisJCQkJCWR1bXBfYnVmW29mZnNldF0gPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJCQkJCQkJICBhZGRyKTsKKwkJCX0KKworCQkJLyogRGlzYWJsZSBibG9jaydzIGNsaWVudCBhbmQgZGVidWcgb3V0cHV0ICovCisJCQlxZWRfYnVzX2VuYWJsZV9jbGllbnRzKHBfaHdmbiwgcF9wdHQsIDApOworCQkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsCisJCQkgICAgICAgcF9ibG9ja19kZWZzLT5kYmdfY3ljbGVfZW5hYmxlX2FkZHIsIDApOworCQl9IGVsc2UgeworCQkJLyogQWxsIGxpbmVzIGFyZSBpbnZhbGlkIC0gZHVtcCB6ZXJvcyAqLworCQkJaWYgKGR1bXApCisJCQkJbWVtc2V0KGR1bXBfYnVmICsgb2Zmc2V0LCAwLAorCQkJCSAgICAgICBEV09SRFNfVE9fQllURVMoYmxvY2tfZHdvcmRzKSk7CisJCQlvZmZzZXQgKz0gYmxvY2tfZHdvcmRzOworCQl9CisJfQorCisJaWYgKGR1bXApIHsKKwkJcWVkX2J1c19lbmFibGVfZGJnX2Jsb2NrKHBfaHdmbiwgcF9wdHQsIGZhbHNlKTsKKwkJcWVkX2J1c19lbmFibGVfY2xpZW50cyhwX2h3Zm4sIHBfcHR0LCAwKTsKKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBQZXJmb3JtcyBHUkMgRHVtcCB0byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqLworc3RhdGljIGVudW0gZGJnX3N0YXR1cyBxZWRfZ3JjX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkgICAgYm9vbCBkdW1wLCB1MzIgKm51bV9kdW1wZWRfZHdvcmRzKQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwlib29sIHBhcml0aWVzX21hc2tlZCA9IGZhbHNlOworCXU4IGksIHBvcnRfbW9kZSA9IDA7CisJdTMyIG9mZnNldCA9IDA7CisKKwkvKiBDaGVjayBpZiBlbXVsYXRpb24gcGxhdGZvcm0gKi8KKwkqbnVtX2R1bXBlZF9kd29yZHMgPSAwOworCisJLyogRmlsbCBHUkMgcGFyYW1ldGVycyB0aGF0IHdlcmUgbm90IHNldCBieSB0aGUgdXNlciB3aXRoIHRoZWlyIGRlZmF1bHQKKwkgKiB2YWx1ZS4KKwkgKi8KKwlxZWRfZGJnX2dyY19zZXRfcGFyYW1zX2RlZmF1bHQocF9od2ZuKTsKKworCS8qIEZpbmQgcG9ydCBtb2RlICovCisJaWYgKGR1bXApIHsKKwkJc3dpdGNoIChxZWRfcmQocF9od2ZuLCBwX3B0dCwgTUlTQ19SRUdfUE9SVF9NT0RFKSkgeworCQljYXNlIDA6CisJCQlwb3J0X21vZGUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXBvcnRfbW9kZSA9IDI7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcG9ydF9tb2RlID0gNDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogVXBkYXRlIHJlc2V0IHN0YXRlICovCisJaWYgKGR1bXApCisJCXFlZF91cGRhdGVfYmxvY2tzX3Jlc2V0X3N0YXRlKHBfaHdmbiwgcF9wdHQpOworCisJLyogRHVtcCBnbG9iYWwgcGFyYW1zICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX2NvbW1vbl9nbG9iYWxfcGFyYW1zKHBfaHdmbiwKKwkJCQkJCXBfcHR0LAorCQkJCQkJZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsIDQpOworCW9mZnNldCArPSBxZWRfZHVtcF9zdHJfcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLCAiZHVtcC10eXBlIiwgImdyYy1kdW1wIik7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsCisJCQkJICAgICAibnVtLWxjaWRzIiwKKwkJCQkgICAgIHFlZF9ncmNfZ2V0X3BhcmFtKHBfaHdmbiwKKwkJCQkJCURCR19HUkNfUEFSQU1fTlVNX0xDSURTKSk7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsCisJCQkJICAgICAibnVtLWx0aWRzIiwKKwkJCQkgICAgIHFlZF9ncmNfZ2V0X3BhcmFtKHBfaHdmbiwKKwkJCQkJCURCR19HUkNfUEFSQU1fTlVNX0xUSURTKSk7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsICJudW0tcG9ydHMiLCBwb3J0X21vZGUpOworCisJLyogRHVtcCByZXNldCByZWdpc3RlcnMgKGR1bXBlZCBiZWZvcmUgdGFraW5nIGJsb2NrcyBvdXQgb2YgcmVzZXQgKSAqLworCWlmIChxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX1JFR1MpKQorCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3Jlc2V0X3JlZ3MocF9od2ZuLAorCQkJCQkJICBwX3B0dCwKKwkJCQkJCSAgZHVtcF9idWYgKyBvZmZzZXQsIGR1bXApOworCisJLyogVGFrZSBhbGwgYmxvY2tzIG91dCBvZiByZXNldCAodXNpbmcgcmVzZXQgcmVnaXN0ZXJzKSAqLworCWlmIChkdW1wKSB7CisJCXFlZF9ncmNfdW5yZXNldF9ibG9ja3MocF9od2ZuLCBwX3B0dCk7CisJCXFlZF91cGRhdGVfYmxvY2tzX3Jlc2V0X3N0YXRlKHBfaHdmbiwgcF9wdHQpOworCX0KKworCS8qIERpc2FibGUgYWxsIHBhcml0aWVzIHVzaW5nIE1GVyBjb21tYW5kICovCisJaWYgKGR1bXApIHsKKwkJcGFyaXRpZXNfbWFza2VkID0gIXFlZF9tY3BfbWFza19wYXJpdGllcyhwX2h3Zm4sIHBfcHR0LCAxKTsKKwkJaWYgKCFwYXJpdGllc19tYXNrZWQpIHsKKwkJCWlmIChxZWRfZ3JjX2dldF9wYXJhbQorCQkJICAgIChwX2h3Zm4sIERCR19HUkNfUEFSQU1fUEFSSVRZX1NBRkUpKQorCQkJCXJldHVybiBEQkdfU1RBVFVTX01DUF9DT1VMRF9OT1RfTUFTS19QUlRZOworCQkJZWxzZQorCQkJCURQX05PVElDRShwX2h3Zm4sCisJCQkJCSAgIkZhaWxlZCB0byBtYXNrIHBhcml0aWVzIHVzaW5nIE1GV1xuIik7CisJCX0KKwl9CisKKwkvKiBEdW1wIG1vZGlmaWVkIHJlZ2lzdGVycyAoZHVtcGVkIGJlZm9yZSBtb2RpZnlpbmcgdGhlbSkgKi8KKwlpZiAocWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9SRUdTKSkKKwkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9tb2RpZmllZF9yZWdzKHBfaHdmbiwKKwkJCQkJCSAgICAgcF9wdHQsCisJCQkJCQkgICAgIGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wKTsKKworCS8qIFN0YWxsIHN0b3JtcyAqLworCWlmIChkdW1wICYmCisJICAgIChxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwKKwkJCQkgREJHX0dSQ19QQVJBTV9EVU1QX0lPUikgfHwKKwkgICAgIHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfVkZDKSkpCisJCXFlZF9ncmNfc3RhbGxfc3Rvcm1zKHBfaHdmbiwgcF9wdHQsIHRydWUpOworCisJLyogRHVtcCBhbGwgcmVncyAgKi8KKwlpZiAocWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9SRUdTKSkgeworCQkvKiBEdW1wIGFsbCBibG9ja3MgZXhjZXB0IE1DUCAqLworCQlib29sIGJsb2NrX2VuYWJsZVtNQVhfQkxPQ0tfSURdOworCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQkxPQ0tfSUQ7IGkrKykKKwkJCWJsb2NrX2VuYWJsZVtpXSA9IHRydWU7CisJCWJsb2NrX2VuYWJsZVtCTE9DS19NQ1BdID0gZmFsc2U7CisJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfcmVnaXN0ZXJzKHBfaHdmbiwKKwkJCQkJCSBwX3B0dCwKKwkJCQkJCSBkdW1wX2J1ZiArCisJCQkJCQkgb2Zmc2V0LAorCQkJCQkJIGR1bXAsCisJCQkJCQkgYmxvY2tfZW5hYmxlLCBOVUxMLCBOVUxMKTsKKwl9CisKKwkvKiBEdW1wIG1lbW9yaWVzICovCisJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9tZW1vcmllcyhwX2h3Zm4sIHBfcHR0LCBkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCk7CisKKwkvKiBEdW1wIE1DUCAqLworCWlmIChxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX01DUCkpCisJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfbWNwKHBfaHdmbiwKKwkJCQkJICAgcF9wdHQsIGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wKTsKKworCS8qIER1bXAgY29udGV4dCAqLworCWlmIChxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX0NNX0NUWCkpCisJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfY3R4KHBfaHdmbiwKKwkJCQkJICAgcF9wdHQsIGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wKTsKKworCS8qIER1bXAgUlNTIG1lbW9yaWVzICovCisJaWYgKHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfUlNTKSkKKwkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9yc3MocF9od2ZuLAorCQkJCQkgICBwX3B0dCwgZHVtcF9idWYgKyBvZmZzZXQsIGR1bXApOworCisJLyogRHVtcCBCaWcgUkFNICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9CSUdfUkFNX1RZUEVTOyBpKyspCisJCWlmIChxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgc19iaWdfcmFtX2RlZnNbaV0uZ3JjX3BhcmFtKSkKKwkJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfYmlnX3JhbShwX2h3Zm4sCisJCQkJCQkgICAgICAgcF9wdHQsCisJCQkJCQkgICAgICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCQkgICAgICAgZHVtcCwgaSk7CisKKwkvKiBEdW1wIElPUnMgKi8KKwlpZiAocWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9JT1IpKQorCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX2lvcnMocF9od2ZuLAorCQkJCQkgICAgcF9wdHQsIGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wKTsKKworCS8qIER1bXAgVkZDICovCisJaWYgKHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfVkZDKSkKKwkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF92ZmMocF9od2ZuLAorCQkJCQkgICBwX3B0dCwgZHVtcF9idWYgKyBvZmZzZXQsIGR1bXApOworCisJLyogRHVtcCBQSFkgdGJ1cyAqLworCWlmIChxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwKKwkJCQlEQkdfR1JDX1BBUkFNX0RVTVBfUEhZKSAmJiBkZXZfZGF0YS0+Y2hpcF9pZCA9PQorCSAgICBDSElQX0syICYmIGRldl9kYXRhLT5wbGF0Zm9ybV9pZCA9PSBQTEFURk9STV9BU0lDKQorCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3BoeShwX2h3Zm4sCisJCQkJCSAgIHBfcHR0LCBkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCk7CisKKwkvKiBEdW1wIHN0YXRpYyBkZWJ1ZyBkYXRhICAqLworCWlmIChxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwKKwkJCQlEQkdfR1JDX1BBUkFNX0RVTVBfU1RBVElDKSAmJgorCSAgICBkZXZfZGF0YS0+YnVzLnN0YXRlID09IERCR19CVVNfU1RBVEVfSURMRSkKKwkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9zdGF0aWNfZGVidWcocF9od2ZuLAorCQkJCQkJICAgIHBfcHR0LAorCQkJCQkJICAgIGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wKTsKKworCS8qIER1bXAgbGFzdCBzZWN0aW9uICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX2xhc3Rfc2VjdGlvbihkdW1wX2J1Ziwgb2Zmc2V0LCBkdW1wKTsKKwlpZiAoZHVtcCkgeworCQkvKiBVbnN0YWxsIHN0b3JtcyAqLworCQlpZiAocWVkX2dyY19nZXRfcGFyYW0ocF9od2ZuLCBEQkdfR1JDX1BBUkFNX1VOU1RBTEwpKQorCQkJcWVkX2dyY19zdGFsbF9zdG9ybXMocF9od2ZuLCBwX3B0dCwgZmFsc2UpOworCisJCS8qIENsZWFyIHBhcml0eSBzdGF0dXMgKi8KKwkJcWVkX2dyY19jbGVhcl9hbGxfcHJ0eShwX2h3Zm4sIHBfcHR0KTsKKworCQkvKiBFbmFibGUgYWxsIHBhcml0aWVzIHVzaW5nIE1GVyBjb21tYW5kICovCisJCWlmIChwYXJpdGllc19tYXNrZWQpCisJCQlxZWRfbWNwX21hc2tfcGFyaXRpZXMocF9od2ZuLCBwX3B0dCwgMCk7CisJfQorCisJKm51bV9kdW1wZWRfZHdvcmRzID0gb2Zmc2V0OworCisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKKy8qIFdyaXRlcyB0aGUgc3BlY2lmaWVkIGZhaWxpbmcgSWRsZSBDaGVjayBydWxlIHRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICogUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICovCitzdGF0aWMgdTMyIHFlZF9pZGxlX2Noa19kdW1wX2ZhaWx1cmUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgICB1MzIgKgorCQkJCSAgICAgZHVtcF9idWYsCisJCQkJICAgICBib29sIGR1bXAsCisJCQkJICAgICB1MTYgcnVsZV9pZCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBkYmdfaWRsZV9jaGtfcnVsZSAqcnVsZSwKKwkJCQkgICAgIHUxNiBmYWlsX2VudHJ5X2lkLCB1MzIgKmNvbmRfcmVnX3ZhbHVlcykKK3sKKwljb25zdCB1bmlvbiBkYmdfaWRsZV9jaGtfcmVnICpyZWdzID0gJigoY29uc3QgdW5pb24gZGJnX2lkbGVfY2hrX3JlZyAqKQorCQkJCQkgICAgICAgc19kYmdfYXJyYXlzCisJCQkJCSAgICAgICBbQklOX0JVRl9EQkdfSURMRV9DSEtfUkVHU10uCisJCQkJCSAgICAgICBwdHIpW3J1bGUtPnJlZ19vZmZzZXRdOworCWNvbnN0IHN0cnVjdCBkYmdfaWRsZV9jaGtfY29uZF9yZWcgKmNvbmRfcmVncyA9ICZyZWdzWzBdLmNvbmRfcmVnOworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwlzdHJ1Y3QgZGJnX2lkbGVfY2hrX3Jlc3VsdF9oZHIgKmhkciA9CisJCShzdHJ1Y3QgZGJnX2lkbGVfY2hrX3Jlc3VsdF9oZHIgKilkdW1wX2J1ZjsKKwljb25zdCBzdHJ1Y3QgZGJnX2lkbGVfY2hrX2luZm9fcmVnICppbmZvX3JlZ3MgPQorCQkmcmVnc1tydWxlLT5udW1fY29uZF9yZWdzXS5pbmZvX3JlZzsKKwl1MzIgbmV4dF9yZWdfb2Zmc2V0ID0gMCwgaSwgb2Zmc2V0ID0gMDsKKwl1OCByZWdfaWQ7CisKKwkvKiBEdW1wIHJ1bGUgZGF0YSAqLworCWlmIChkdW1wKSB7CisJCW1lbXNldChoZHIsIDAsIHNpemVvZigqaGRyKSk7CisJCWhkci0+cnVsZV9pZCA9IHJ1bGVfaWQ7CisJCWhkci0+bWVtX2VudHJ5X2lkID0gZmFpbF9lbnRyeV9pZDsKKwkJaGRyLT5zZXZlcml0eSA9IHJ1bGUtPnNldmVyaXR5OworCQloZHItPm51bV9kdW1wZWRfY29uZF9yZWdzID0gcnVsZS0+bnVtX2NvbmRfcmVnczsKKwl9CisKKwlvZmZzZXQgKz0gSURMRV9DSEtfUkVTVUxUX0hEUl9EV09SRFM7CisKKwkvKiBEdW1wIGNvbmRpdGlvbiByZWdpc3RlciB2YWx1ZXMgKi8KKwlmb3IgKHJlZ19pZCA9IDA7IHJlZ19pZCA8IHJ1bGUtPm51bV9jb25kX3JlZ3M7IHJlZ19pZCsrKSB7CisJCWNvbnN0IHN0cnVjdCBkYmdfaWRsZV9jaGtfY29uZF9yZWcgKnJlZyA9ICZjb25kX3JlZ3NbcmVnX2lkXTsKKworCQkvKiBXcml0ZSByZWdpc3RlciBoZWFkZXIgKi8KKwkJaWYgKGR1bXApIHsKKwkJCXN0cnVjdCBkYmdfaWRsZV9jaGtfcmVzdWx0X3JlZ19oZHIgKnJlZ19oZHIgPQorCQkJICAgIChzdHJ1Y3QgZGJnX2lkbGVfY2hrX3Jlc3VsdF9yZWdfaGRyICopKGR1bXBfYnVmCisJCQkJCQkJCSAgICsgb2Zmc2V0KTsKKwkJCW9mZnNldCArPSBJRExFX0NIS19SRVNVTFRfUkVHX0hEUl9EV09SRFM7CisJCQltZW1zZXQocmVnX2hkciwgMCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGRiZ19pZGxlX2Noa19yZXN1bHRfcmVnX2hkcikpOworCQkJcmVnX2hkci0+c3RhcnRfZW50cnkgPSByZWctPnN0YXJ0X2VudHJ5OworCQkJcmVnX2hkci0+c2l6ZSA9IHJlZy0+ZW50cnlfc2l6ZTsKKwkJCVNFVF9GSUVMRChyZWdfaGRyLT5kYXRhLAorCQkJCSAgREJHX0lETEVfQ0hLX1JFU1VMVF9SRUdfSERSX0lTX01FTSwKKwkJCQkgIHJlZy0+bnVtX2VudHJpZXMgPiAxIHx8IHJlZy0+c3RhcnRfZW50cnkgPiAwCisJCQkJICA/IDEgOiAwKTsKKwkJCVNFVF9GSUVMRChyZWdfaGRyLT5kYXRhLAorCQkJCSAgREJHX0lETEVfQ0hLX1JFU1VMVF9SRUdfSERSX1JFR19JRCwgcmVnX2lkKTsKKworCQkJLyogV3JpdGUgcmVnaXN0ZXIgdmFsdWVzICovCisJCQlmb3IgKGkgPSAwOyBpIDwgcmVnX2hkci0+c2l6ZTsKKwkJCSAgICAgaSsrLCBuZXh0X3JlZ19vZmZzZXQrKywgb2Zmc2V0KyspCisJCQkJZHVtcF9idWZbb2Zmc2V0XSA9CisJCQkJICAgIGNvbmRfcmVnX3ZhbHVlc1tuZXh0X3JlZ19vZmZzZXRdOworCQl9IGVsc2UgeworCQkJb2Zmc2V0ICs9IElETEVfQ0hLX1JFU1VMVF9SRUdfSERSX0RXT1JEUyArCisJCQkgICAgcmVnLT5lbnRyeV9zaXplOworCQl9CisJfQorCisJLyogRHVtcCBpbmZvIHJlZ2lzdGVyIHZhbHVlcyAqLworCWZvciAocmVnX2lkID0gMDsgcmVnX2lkIDwgcnVsZS0+bnVtX2luZm9fcmVnczsgcmVnX2lkKyspIHsKKwkJY29uc3Qgc3RydWN0IGRiZ19pZGxlX2Noa19pbmZvX3JlZyAqcmVnID0gJmluZm9fcmVnc1tyZWdfaWRdOworCQl1MzIgYmxvY2tfaWQ7CisKKwkJaWYgKCFkdW1wKSB7CisJCQlvZmZzZXQgKz0gSURMRV9DSEtfUkVTVUxUX1JFR19IRFJfRFdPUkRTICsgcmVnLT5zaXplOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBDaGVjayBpZiByZWdpc3RlcidzIGJsb2NrIGlzIGluIHJlc2V0ICovCisJCWJsb2NrX2lkID0gR0VUX0ZJRUxEKHJlZy0+ZGF0YSwgREJHX0lETEVfQ0hLX0lORk9fUkVHX0JMT0NLX0lEKTsKKwkJaWYgKGJsb2NrX2lkID49IE1BWF9CTE9DS19JRCkgeworCQkJRFBfTk9USUNFKHBfaHdmbiwgIkludmFsaWQgYmxvY2tfaWRcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIWRldl9kYXRhLT5ibG9ja19pbl9yZXNldFtibG9ja19pZF0pIHsKKwkJCWJvb2wgZXZhbF9tb2RlID0gR0VUX0ZJRUxEKHJlZy0+bW9kZS5kYXRhLAorCQkJCQkJICAgREJHX01PREVfSERSX0VWQUxfTU9ERSkgPiAwOworCQkJYm9vbCBtb2RlX21hdGNoID0gdHJ1ZTsKKworCQkJLyogQ2hlY2sgbW9kZSAqLworCQkJaWYgKGV2YWxfbW9kZSkgeworCQkJCXUxNiBtb2Rlc19idWZfb2Zmc2V0ID0KKwkJCQkJR0VUX0ZJRUxEKHJlZy0+bW9kZS5kYXRhLAorCQkJCQkJREJHX01PREVfSERSX01PREVTX0JVRl9PRkZTRVQpOworCQkJCW1vZGVfbWF0Y2ggPQorCQkJCQlxZWRfaXNfbW9kZV9tYXRjaChwX2h3Zm4sCisJCQkJCQkJICAmbW9kZXNfYnVmX29mZnNldCk7CisJCQl9CisKKwkJCWlmIChtb2RlX21hdGNoKSB7CisJCQkJdTMyIGdyY19hZGRyID0KKwkJCQkJRFdPUkRTX1RPX0JZVEVTKEdFVF9GSUVMRChyZWctPmRhdGEsCisJCQkJCQlEQkdfSURMRV9DSEtfSU5GT19SRUdfQUREUkVTUykpOworCisJCQkJLyogV3JpdGUgcmVnaXN0ZXIgaGVhZGVyICovCisJCQkJc3RydWN0IGRiZ19pZGxlX2Noa19yZXN1bHRfcmVnX2hkciAqcmVnX2hkciA9CisJCQkJCShzdHJ1Y3QgZGJnX2lkbGVfY2hrX3Jlc3VsdF9yZWdfaGRyICopCisJCQkJCShkdW1wX2J1ZiArIG9mZnNldCk7CisKKwkJCQlvZmZzZXQgKz0gSURMRV9DSEtfUkVTVUxUX1JFR19IRFJfRFdPUkRTOworCQkJCWhkci0+bnVtX2R1bXBlZF9pbmZvX3JlZ3MrKzsKKwkJCQltZW1zZXQocmVnX2hkciwgMCwgc2l6ZW9mKCpyZWdfaGRyKSk7CisJCQkJcmVnX2hkci0+c2l6ZSA9IHJlZy0+c2l6ZTsKKwkJCQlTRVRfRklFTEQocmVnX2hkci0+ZGF0YSwKKwkJCQkJREJHX0lETEVfQ0hLX1JFU1VMVF9SRUdfSERSX1JFR19JRCwKKwkJCQkJcnVsZS0+bnVtX2NvbmRfcmVncyArIHJlZ19pZCk7CisKKwkJCQkvKiBXcml0ZSByZWdpc3RlciB2YWx1ZXMgKi8KKwkJCQlmb3IgKGkgPSAwOyBpIDwgcmVnLT5zaXplOworCQkJCSAgICAgaSsrLCBvZmZzZXQrKywgZ3JjX2FkZHIgKz0gNCkKKwkJCQkJZHVtcF9idWZbb2Zmc2V0XSA9CisJCQkJCQlxZWRfcmQocF9od2ZuLCBwX3B0dCwgZ3JjX2FkZHIpOworCQkJCX0KKwkJCX0KKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wcyBpZGxlIGNoZWNrIHJ1bGUgZW50cmllcy4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLiAqLworc3RhdGljIHUzMgorcWVkX2lkbGVfY2hrX2R1bXBfcnVsZV9lbnRyaWVzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkgICAgICAgdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBkYmdfaWRsZV9jaGtfcnVsZSAqaW5wdXRfcnVsZXMsCisJCQkgICAgICAgdTMyIG51bV9pbnB1dF9ydWxlcywgdTMyICpudW1fZmFpbGluZ19ydWxlcykKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJdTMyIGNvbmRfcmVnX3ZhbHVlc1tJRExFX0NIS19NQVhfRU5UUklFU19TSVpFXTsKKwl1MzIgaSwgaiwgb2Zmc2V0ID0gMDsKKwl1MTYgZW50cnlfaWQ7CisJdTggcmVnX2lkOworCisJKm51bV9mYWlsaW5nX3J1bGVzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2lucHV0X3J1bGVzOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGRiZ19pZGxlX2Noa19jb25kX3JlZyAqY29uZF9yZWdzOworCQljb25zdCBzdHJ1Y3QgZGJnX2lkbGVfY2hrX3J1bGUgKnJ1bGU7CisJCWNvbnN0IHVuaW9uIGRiZ19pZGxlX2Noa19yZWcgKnJlZ3M7CisJCXUxNiBudW1fcmVnX2VudHJpZXMgPSAxOworCQlib29sIGNoZWNrX3J1bGUgPSB0cnVlOworCQljb25zdCB1MzIgKmltbV92YWx1ZXM7CisKKwkJcnVsZSA9ICZpbnB1dF9ydWxlc1tpXTsKKwkJcmVncyA9ICYoKGNvbnN0IHVuaW9uIGRiZ19pZGxlX2Noa19yZWcgKikKKwkJCSBzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfSURMRV9DSEtfUkVHU10ucHRyKQorCQkJW3J1bGUtPnJlZ19vZmZzZXRdOworCQljb25kX3JlZ3MgPSAmcmVnc1swXS5jb25kX3JlZzsKKwkJaW1tX3ZhbHVlcyA9ICZzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfSURMRV9DSEtfSU1NU10ucHRyCisJCQkgICAgIFtydWxlLT5pbW1fb2Zmc2V0XTsKKworCQkvKiBDaGVjayBpZiBhbGwgY29uZGl0aW9uIHJlZ2lzdGVyIGJsb2NrcyBhcmUgb3V0IG9mIHJlc2V0LCBhbmQKKwkJICogZmluZCBtYXhpbWFsIG51bWJlciBvZiBlbnRyaWVzIChhbGwgY29uZGl0aW9uIHJlZ2lzdGVycyB0aGF0CisJCSAqIGFyZSBtZW1vcmllcyBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSwgd2hpY2ggaXMgPiAxKS4KKwkJICovCisJCWZvciAocmVnX2lkID0gMDsgcmVnX2lkIDwgcnVsZS0+bnVtX2NvbmRfcmVncyAmJiBjaGVja19ydWxlOworCQkgICAgIHJlZ19pZCsrKSB7CisJCQl1MzIgYmxvY2tfaWQgPSBHRVRfRklFTEQoY29uZF9yZWdzW3JlZ19pZF0uZGF0YSwKKwkJCQkJCURCR19JRExFX0NIS19DT05EX1JFR19CTE9DS19JRCk7CisKKwkJCWlmIChibG9ja19pZCA+PSBNQVhfQkxPQ0tfSUQpIHsKKwkJCQlEUF9OT1RJQ0UocF9od2ZuLCAiSW52YWxpZCBibG9ja19pZFxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWNoZWNrX3J1bGUgPSAhZGV2X2RhdGEtPmJsb2NrX2luX3Jlc2V0W2Jsb2NrX2lkXTsKKwkJCWlmIChjb25kX3JlZ3NbcmVnX2lkXS5udW1fZW50cmllcyA+IG51bV9yZWdfZW50cmllcykKKwkJCQludW1fcmVnX2VudHJpZXMgPSBjb25kX3JlZ3NbcmVnX2lkXS5udW1fZW50cmllczsKKwkJfQorCisJCWlmICghY2hlY2tfcnVsZSAmJiBkdW1wKQorCQkJY29udGludWU7CisKKwkJLyogR28gb3ZlciBhbGwgcmVnaXN0ZXIgZW50cmllcyAobnVtYmVyIG9mIGVudHJpZXMgaXMgdGhlIHNhbWUKKwkJICogZm9yIGFsbCBjb25kaXRpb24gcmVnaXN0ZXJzKS4KKwkJICovCisJCWZvciAoZW50cnlfaWQgPSAwOyBlbnRyeV9pZCA8IG51bV9yZWdfZW50cmllczsgZW50cnlfaWQrKykgeworCQkJLyogUmVhZCBjdXJyZW50IGVudHJ5IG9mIGFsbCBjb25kaXRpb24gcmVnaXN0ZXJzICovCisJCQlpZiAoZHVtcCkgeworCQkJCXUzMiBuZXh0X3JlZ19vZmZzZXQgPSAwOworCisJCQkJZm9yIChyZWdfaWQgPSAwOworCQkJCSAgICAgcmVnX2lkIDwgcnVsZS0+bnVtX2NvbmRfcmVnczsKKwkJCQkgICAgIHJlZ19pZCsrKSB7CisJCQkJCWNvbnN0IHN0cnVjdCBkYmdfaWRsZV9jaGtfY29uZF9yZWcKKwkJCQkJCSpyZWcgPSAmY29uZF9yZWdzW3JlZ19pZF07CisKKwkJCQkJLyogRmluZCBHUkMgYWRkcmVzcyAoaWYgaXQncyBhIG1lbW9yeSwKKwkJCQkJICogdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmljIGVudHJ5IGlzCisJCQkJCSAqIGNhbGN1bGF0ZWQpLgorCQkJCQkgKi8KKwkJCQkJdTMyIGdyY19hZGRyID0KKwkJCQkJICAgRFdPUkRTX1RPX0JZVEVTKAorCQkJCQkJR0VUX0ZJRUxEKHJlZy0+ZGF0YSwKKwkJCQkJCSAgICBEQkdfSURMRV9DSEtfQ09ORF9SRUdfQUREUkVTUykpOworCisJCQkJCWlmIChyZWctPm51bV9lbnRyaWVzID4gMSB8fAorCQkJCQkgICAgcmVnLT5zdGFydF9lbnRyeSA+IDApIHsKKwkJCQkJCXUzMiBwYWRkZWRfZW50cnlfc2l6ZSA9CisJCQkJCQkJcmVnLT5lbnRyeV9zaXplID4gMSA/CisJCQkJCQkJcm91bmR1cF9wb3dfb2ZfdHdvCisJCQkJCQkJKHJlZy0+ZW50cnlfc2l6ZSkgOiAxOworCisJCQkJCQlncmNfYWRkciArPQorCQkJCQkJCURXT1JEU19UT19CWVRFUygKKwkJCQkJCQkJKHJlZy0+c3RhcnRfZW50cnkgKworCQkJCQkJCQllbnRyeV9pZCkKKwkJCQkJCQkJKiBwYWRkZWRfZW50cnlfc2l6ZSk7CisJCQkJCX0KKworCQkJCQkvKiBSZWFkIHJlZ2lzdGVycyAqLworCQkJCQlpZiAobmV4dF9yZWdfb2Zmc2V0ICsgcmVnLT5lbnRyeV9zaXplID49CisJCQkJCSAgICBJRExFX0NIS19NQVhfRU5UUklFU19TSVpFKSB7CisJCQkJCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJCQkJCSAgImlkbGUgY2hlY2sgcmVnaXN0ZXJzIGVudHJ5IGlzIHRvbyBsYXJnZVxuIik7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCisJCQkJCWZvciAoaiA9IDA7IGogPCByZWctPmVudHJ5X3NpemU7CisJCQkJCSAgICAgaisrLCBuZXh0X3JlZ19vZmZzZXQrKywKKwkJCQkJICAgICBncmNfYWRkciArPSA0KQorCQkJCQkgICAgIGNvbmRfcmVnX3ZhbHVlc1tuZXh0X3JlZ19vZmZzZXRdID0KKwkJCQkJCXFlZF9yZChwX2h3Zm4sIHBfcHR0LCBncmNfYWRkcik7CisJCQkJfQorCQkJfQorCisJCQkvKiBDYWxsIHJ1bGUncyBjb25kaXRpb24gZnVuY3Rpb24gLSBhIHJldHVybiB2YWx1ZSBvZgorCQkJICogdHJ1ZSBpbmRpY2F0ZXMgZmFpbHVyZS4KKwkJCSAqLworCQkJaWYgKCgqY29uZF9hcnJbcnVsZS0+Y29uZF9pZF0pKGNvbmRfcmVnX3ZhbHVlcywKKwkJCQkJCSAgICAgICBpbW1fdmFsdWVzKSB8fCAhZHVtcCkgeworCQkJCW9mZnNldCArPQorCQkJCQlxZWRfaWRsZV9jaGtfZHVtcF9mYWlsdXJlKHBfaHdmbiwKKwkJCQkJCQlwX3B0dCwKKwkJCQkJCQlkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJCQlkdW1wLAorCQkJCQkJCXJ1bGUtPnJ1bGVfaWQsCisJCQkJCQkJcnVsZSwKKwkJCQkJCQllbnRyeV9pZCwKKwkJCQkJCQljb25kX3JlZ192YWx1ZXMpOworCQkJCSgqbnVtX2ZhaWxpbmdfcnVsZXMpKys7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBQZXJmb3JtcyBJZGxlIENoZWNrIER1bXAgdG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2lkbGVfY2hrX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wKQoreworCXUzMiBvZmZzZXQgPSAwLCBpbnB1dF9vZmZzZXQgPSAwLCBudW1fZmFpbGluZ19ydWxlcyA9IDA7CisJdTMyIG51bV9mYWlsaW5nX3J1bGVzX29mZnNldDsKKworCS8qIER1bXAgZ2xvYmFsIHBhcmFtcyAqLworCW9mZnNldCArPSBxZWRfZHVtcF9jb21tb25fZ2xvYmFsX3BhcmFtcyhwX2h3Zm4sCisJCQkJCQlwX3B0dCwKKwkJCQkJCWR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAxKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwgImR1bXAtdHlwZSIsICJpZGxlLWNoayIpOworCisJLyogRHVtcCBpZGxlIGNoZWNrIHNlY3Rpb24gaGVhZGVyIHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX3NlY3Rpb25faGRyKGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAiaWRsZV9jaGsiLCAxKTsKKwludW1fZmFpbGluZ19ydWxlc19vZmZzZXQgPSBvZmZzZXQ7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgIm51bV9ydWxlcyIsIDApOworCXdoaWxlIChpbnB1dF9vZmZzZXQgPAorCSAgICAgICBzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfSURMRV9DSEtfUlVMRVNdLnNpemVfaW5fZHdvcmRzKSB7CisJCWNvbnN0IHN0cnVjdCBkYmdfaWRsZV9jaGtfY29uZF9oZHIgKmNvbmRfaGRyID0KKwkJCShjb25zdCBzdHJ1Y3QgZGJnX2lkbGVfY2hrX2NvbmRfaGRyICopCisJCQkmc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0lETEVfQ0hLX1JVTEVTXS5wdHIKKwkJCVtpbnB1dF9vZmZzZXQrK107CisJCWJvb2wgZXZhbF9tb2RlID0gR0VUX0ZJRUxEKGNvbmRfaGRyLT5tb2RlLmRhdGEsCisJCQkJCSAgIERCR19NT0RFX0hEUl9FVkFMX01PREUpID4gMDsKKwkJYm9vbCBtb2RlX21hdGNoID0gdHJ1ZTsKKworCQkvKiBDaGVjayBtb2RlICovCisJCWlmIChldmFsX21vZGUpIHsKKwkJCXUxNiBtb2Rlc19idWZfb2Zmc2V0ID0KKwkJCQlHRVRfRklFTEQoY29uZF9oZHItPm1vZGUuZGF0YSwKKwkJCQkJICBEQkdfTU9ERV9IRFJfTU9ERVNfQlVGX09GRlNFVCk7CisKKwkJCW1vZGVfbWF0Y2ggPSBxZWRfaXNfbW9kZV9tYXRjaChwX2h3Zm4sCisJCQkJCQkgICAgICAgJm1vZGVzX2J1Zl9vZmZzZXQpOworCQl9CisKKwkJaWYgKG1vZGVfbWF0Y2gpIHsKKwkJCXUzMiBjdXJyX2ZhaWxpbmdfcnVsZXM7CisKKwkJCW9mZnNldCArPQorCQkJICAgIHFlZF9pZGxlX2Noa19kdW1wX3J1bGVfZW50cmllcyhwX2h3Zm4sCisJCQkJcF9wdHQsCisJCQkJZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJZHVtcCwKKwkJCQkoY29uc3Qgc3RydWN0IGRiZ19pZGxlX2Noa19ydWxlICopCisJCQkJJnNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19JRExFX0NIS19SVUxFU10uCisJCQkJcHRyW2lucHV0X29mZnNldF0sCisJCQkJY29uZF9oZHItPmRhdGFfc2l6ZSAvIElETEVfQ0hLX1JVTEVfU0laRV9EV09SRFMsCisJCQkJJmN1cnJfZmFpbGluZ19ydWxlcyk7CisJCQludW1fZmFpbGluZ19ydWxlcyArPSBjdXJyX2ZhaWxpbmdfcnVsZXM7CisJCX0KKworCQlpbnB1dF9vZmZzZXQgKz0gY29uZF9oZHItPmRhdGFfc2l6ZTsKKwl9CisKKwkvKiBPdmVyd3JpdGUgbnVtX3J1bGVzIHBhcmFtZXRlciAqLworCWlmIChkdW1wKQorCQlxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBudW1fZmFpbGluZ19ydWxlc19vZmZzZXQsCisJCQkJICAgZHVtcCwgIm51bV9ydWxlcyIsIG51bV9mYWlsaW5nX3J1bGVzKTsKKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIEZpbmRzIHRoZSBtZXRhIGRhdGEgaW1hZ2UgaW4gTlZSQU0uICovCitzdGF0aWMgZW51bSBkYmdfc3RhdHVzIHFlZF9maW5kX252cmFtX2ltYWdlKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkgICAgdTMyIGltYWdlX3R5cGUsCisJCQkJCSAgICB1MzIgKm52cmFtX29mZnNldF9ieXRlcywKKwkJCQkJICAgIHUzMiAqbnZyYW1fc2l6ZV9ieXRlcykKK3sKKwl1MzIgcmV0X21jcF9yZXNwLCByZXRfbWNwX3BhcmFtLCByZXRfdHhuX3NpemU7CisJc3RydWN0IG1jcF9maWxlX2F0dCBmaWxlX2F0dDsKKworCS8qIENhbGwgTlZSQU0gZ2V0IGZpbGUgY29tbWFuZCAqLworCWlmIChxZWRfbWNwX252bV9yZF9jbWQocF9od2ZuLCBwX3B0dCwgRFJWX01TR19DT0RFX05WTV9HRVRfRklMRV9BVFQsCisJCQkgICAgICAgaW1hZ2VfdHlwZSwgJnJldF9tY3BfcmVzcCwgJnJldF9tY3BfcGFyYW0sCisJCQkgICAgICAgJnJldF90eG5fc2l6ZSwgKHUzMiAqKSZmaWxlX2F0dCkgIT0gMCkKKwkJcmV0dXJuIERCR19TVEFUVVNfTlZSQU1fR0VUX0lNQUdFX0ZBSUxFRDsKKworCS8qIENoZWNrIHJlc3BvbnNlICovCisJaWYgKChyZXRfbWNwX3Jlc3AgJiBGV19NU0dfQ09ERV9NQVNLKSAhPSBGV19NU0dfQ09ERV9OVk1fT0spCisJCXJldHVybiBEQkdfU1RBVFVTX05WUkFNX0dFVF9JTUFHRV9GQUlMRUQ7CisKKwkvKiBVcGRhdGUgcmV0dXJuIHZhbHVlcyAqLworCSpudnJhbV9vZmZzZXRfYnl0ZXMgPSBmaWxlX2F0dC5udm1fc3RhcnRfYWRkcjsKKwkqbnZyYW1fc2l6ZV9ieXRlcyA9IGZpbGVfYXR0LmxlbjsKKwlEUF9WRVJCT1NFKHBfaHdmbiwKKwkJICAgUUVEX01TR19ERUJVRywKKwkJICAgImZpbmRfbnZyYW1faW1hZ2U6IGZvdW5kIE5WUkFNIGltYWdlIG9mIHR5cGUgJWQgaW4gTlZSQU0gb2Zmc2V0ICVkIGJ5dGVzIHdpdGggc2l6ZSAlZCBieXRlc1xuIiwKKwkJICAgaW1hZ2VfdHlwZSwgKm52cmFtX29mZnNldF9ieXRlcywgKm52cmFtX3NpemVfYnl0ZXMpOworCisJLyogQ2hlY2sgYWxpZ25tZW50ICovCisJaWYgKCpudnJhbV9zaXplX2J5dGVzICYgMHgzKQorCQlyZXR1cm4gREJHX1NUQVRVU19OT05fQUxJR05FRF9OVlJBTV9JTUFHRTsKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworc3RhdGljIGVudW0gZGJnX3N0YXR1cyBxZWRfbnZyYW1fcmVhZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgICAgdTMyIG52cmFtX29mZnNldF9ieXRlcywKKwkJCQkgICAgICB1MzIgbnZyYW1fc2l6ZV9ieXRlcywgdTMyICpyZXRfYnVmKQoreworCXUzMiByZXRfbWNwX3Jlc3AsIHJldF9tY3BfcGFyYW0sIHJldF9yZWFkX3NpemU7CisJdTMyIGJ5dGVzX3RvX2NvcHksIHJlYWRfb2Zmc2V0ID0gMDsKKwlzMzIgYnl0ZXNfbGVmdCA9IG52cmFtX3NpemVfYnl0ZXM7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwKKwkJICAgUUVEX01TR19ERUJVRywKKwkJICAgIm52cmFtX3JlYWQ6IHJlYWRpbmcgaW1hZ2Ugb2Ygc2l6ZSAlZCBieXRlcyBmcm9tIE5WUkFNXG4iLAorCQkgICBudnJhbV9zaXplX2J5dGVzKTsKKwlkbyB7CisJCWJ5dGVzX3RvX2NvcHkgPQorCQkgICAgKGJ5dGVzX2xlZnQgPgorCQkgICAgIE1DUF9EUlZfTlZNX0JVRl9MRU4pID8gTUNQX0RSVl9OVk1fQlVGX0xFTiA6IGJ5dGVzX2xlZnQ7CisKKwkJLyogQ2FsbCBOVlJBTSByZWFkIGNvbW1hbmQgKi8KKwkJaWYgKHFlZF9tY3BfbnZtX3JkX2NtZChwX2h3Zm4sIHBfcHR0LAorCQkJCSAgICAgICBEUlZfTVNHX0NPREVfTlZNX1JFQURfTlZSQU0sCisJCQkJICAgICAgIChudnJhbV9vZmZzZXRfYnl0ZXMgKworCQkJCQlyZWFkX29mZnNldCkgfAorCQkJCSAgICAgICAoYnl0ZXNfdG9fY29weSA8PAorCQkJCQlEUlZfTUJfUEFSQU1fTlZNX0xFTl9TSElGVCksCisJCQkJICAgICAgICZyZXRfbWNwX3Jlc3AsICZyZXRfbWNwX3BhcmFtLAorCQkJCSAgICAgICAmcmV0X3JlYWRfc2l6ZSwKKwkJCQkgICAgICAgKHUzMiAqKSgodTggKilyZXRfYnVmICsKKwkJCQkJICAgICAgIHJlYWRfb2Zmc2V0KSkgIT0gMCkKKwkJCXJldHVybiBEQkdfU1RBVFVTX05WUkFNX1JFQURfRkFJTEVEOworCisJCS8qIENoZWNrIHJlc3BvbnNlICovCisJCWlmICgocmV0X21jcF9yZXNwICYgRldfTVNHX0NPREVfTUFTSykgIT0gRldfTVNHX0NPREVfTlZNX09LKQorCQkJcmV0dXJuIERCR19TVEFUVVNfTlZSQU1fUkVBRF9GQUlMRUQ7CisKKwkJLyogVXBkYXRlIHJlYWQgb2Zmc2V0ICovCisJCXJlYWRfb2Zmc2V0ICs9IHJldF9yZWFkX3NpemU7CisJCWJ5dGVzX2xlZnQgLT0gcmV0X3JlYWRfc2l6ZTsKKwl9IHdoaWxlIChieXRlc19sZWZ0ID4gMCk7CisKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworLyogR2V0IGluZm8gb24gdGhlIE1DUCBUcmFjZSBkYXRhIGluIHRoZSBzY3JhdGNocGFkOgorICogLSB0cmFjZV9kYXRhX2dyY19hZGRyIC0gdGhlIEdSQyBhZGRyZXNzIG9mIHRoZSB0cmFjZSBkYXRhCisgKiAtIHRyYWNlX2RhdGFfc2l6ZV9ieXRlcyAtIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBNQ1AgVHJhY2UgZGF0YSAod2l0aG91dAorICoJdGhlIGhlYWRlcikKKyAqLworc3RhdGljIGVudW0gZGJnX3N0YXR1cyBxZWRfbWNwX3RyYWNlX2dldF9kYXRhX2luZm8oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCQkgICB1MzIgKnRyYWNlX2RhdGFfZ3JjX2FkZHIsCisJCQkJCQkgICB1MzIgKnRyYWNlX2RhdGFfc2l6ZV9ieXRlcykKK3sKKwkvKiBSZWFkIE1DUCB0cmFjZSBzZWN0aW9uIG9mZnNpemUgc3RydWN0dXJlIGZyb20gTUNQIHNjcmF0Y2hwYWQgKi8KKwl1MzIgc3BhZF90cmFjZV9vZmZzaXplID0gcWVkX3JkKHBfaHdmbiwKKwkJCQkJcF9wdHQsCisJCQkJCU1DUF9TUEFEX1RSQUNFX09GRlNJWkVfQUREUik7CisJdTMyIHNpZ25hdHVyZTsKKworCS8qIEV4dHJhY3QgTUNQIHRyYWNlIHNlY3Rpb24gR1JDIGFkZHJlc3MgZnJvbSBvZmZzaXplIHN0cnVjdHVyZSAod2l0aGluCisJICogc2NyYXRjaHBhZCkuCisJICovCisJKnRyYWNlX2RhdGFfZ3JjX2FkZHIgPQorCQlNQ1BfUkVHX1NDUkFUQ0ggKyBTRUNUSU9OX09GRlNFVChzcGFkX3RyYWNlX29mZnNpemUpOworCisJLyogUmVhZCBzaWduYXR1cmUgZnJvbSBNQ1AgdHJhY2Ugc2VjdGlvbiAqLworCXNpZ25hdHVyZSA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkJICAgKnRyYWNlX2RhdGFfZ3JjX2FkZHIgKworCQkJICAgb2Zmc2V0b2Yoc3RydWN0IG1jcF90cmFjZSwgc2lnbmF0dXJlKSk7CisJaWYgKHNpZ25hdHVyZSAhPSBNRldfVFJBQ0VfU0lHTkFUVVJFKQorCQlyZXR1cm4gREJHX1NUQVRVU19JTlZBTElEX1RSQUNFX1NJR05BVFVSRTsKKworCS8qIFJlYWQgdHJhY2Ugc2l6ZSBmcm9tIE1DUCB0cmFjZSBzZWN0aW9uICovCisJKnRyYWNlX2RhdGFfc2l6ZV9ieXRlcyA9IHFlZF9yZChwX2h3Zm4sCisJCQkJCXBfcHR0LAorCQkJCQkqdHJhY2VfZGF0YV9ncmNfYWRkciArCisJCQkJCW9mZnNldG9mKHN0cnVjdCBtY3BfdHJhY2UsIHNpemUpKTsKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworLyogUmVhZHMgTUNQIHRyYWNlIG1ldGEgZGF0YSBpbWFnZSBmcm9tIE5WUkFNLgorICogLSBydW5uaW5nX2J1bmRsZV9pZCAoT1VUKSAtIHRoZSBydW5uaW5nIGJ1bmRsZSBJRCAoaW52YWxpZCB3aGVuIGxvYWRlZCBmcm9tCisgKglmaWxlKQorICogLSB0cmFjZV9tZXRhX29mZnNldF9ieXRlcyAoT1VUKSAtIHRoZSBOVlJBTSBvZmZzZXQgaW4gYnl0ZXMgaW4gd2hpY2ggdGhlIE1DUAorICoJVHJhY2UgbWV0YSBkYXRhIHN0YXJ0cyAoaW52YWxpZCB3aGVuIGxvYWRlZCBmcm9tIGZpbGUpCisgKiAtIHRyYWNlX21ldGFfc2l6ZV9ieXRlcyAoT1VUKSAtIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBNQ1AgVHJhY2UgbWV0YSBkYXRhCisgKi8KK3N0YXRpYyBlbnVtIGRiZ19zdGF0dXMgcWVkX21jcF90cmFjZV9nZXRfbWV0YV9pbmZvKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkJICAgdTMyIHRyYWNlX2RhdGFfc2l6ZV9ieXRlcywKKwkJCQkJCSAgIHUzMiAqcnVubmluZ19idW5kbGVfaWQsCisJCQkJCQkgICB1MzIgKnRyYWNlX21ldGFfb2Zmc2V0X2J5dGVzLAorCQkJCQkJICAgdTMyICp0cmFjZV9tZXRhX3NpemVfYnl0ZXMpCit7CisJLyogUmVhZCBNQ1AgdHJhY2Ugc2VjdGlvbiBvZmZzaXplIHN0cnVjdHVyZSBmcm9tIE1DUCBzY3JhdGNocGFkICovCisJdTMyIHNwYWRfdHJhY2Vfb2Zmc2l6ZSA9IHFlZF9yZChwX2h3Zm4sCisJCQkJCXBfcHR0LAorCQkJCQlNQ1BfU1BBRF9UUkFDRV9PRkZTSVpFX0FERFIpOworCisJLyogRmluZCBydW5uaW5nIGJ1bmRsZSBJRCAqLworCXUzMiBydW5uaW5nX21md19hZGRyID0KKwkJTUNQX1JFR19TQ1JBVENIICsgU0VDVElPTl9PRkZTRVQoc3BhZF90cmFjZV9vZmZzaXplKSArCisJCVFFRF9TRUNUSU9OX1NJWkUoc3BhZF90cmFjZV9vZmZzaXplKSArIHRyYWNlX2RhdGFfc2l6ZV9ieXRlczsKKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzOworCXUzMiBudnJhbV9pbWFnZV90eXBlOworCisJKnJ1bm5pbmdfYnVuZGxlX2lkID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsIHJ1bm5pbmdfbWZ3X2FkZHIpOworCWlmICgqcnVubmluZ19idW5kbGVfaWQgPiAxKQorCQlyZXR1cm4gREJHX1NUQVRVU19JTlZBTElEX05WUkFNX0JVTkRMRTsKKworCS8qIEZpbmQgaW1hZ2UgaW4gTlZSQU0gKi8KKwludnJhbV9pbWFnZV90eXBlID0KKwkgICAgKCpydW5uaW5nX2J1bmRsZV9pZCA9PQorCSAgICAgRElSX0lEXzEpID8gTlZNX1RZUEVfTUZXX1RSQUNFMSA6IE5WTV9UWVBFX01GV19UUkFDRTI7CisJc3RhdHVzID0gcWVkX2ZpbmRfbnZyYW1faW1hZ2UocF9od2ZuLAorCQkJCSAgICAgIHBfcHR0LAorCQkJCSAgICAgIG52cmFtX2ltYWdlX3R5cGUsCisJCQkJICAgICAgdHJhY2VfbWV0YV9vZmZzZXRfYnl0ZXMsCisJCQkJICAgICAgdHJhY2VfbWV0YV9zaXplX2J5dGVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIFJlYWRzIHRoZSBNQ1AgVHJhY2UgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgR1JDIGFkZHJlc3MgaW50byB0aGUgc3BlY2lmaWVkCisgKiBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIHFlZF9tY3BfdHJhY2VfcmVhZF9kYXRhKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgIHUzMiBncmNfYWRkciwgdTMyIHNpemVfaW5fZHdvcmRzLCB1MzIgKmJ1ZikKK3sKKwl1MzIgaTsKKworCURQX1ZFUkJPU0UocF9od2ZuLAorCQkgICBRRURfTVNHX0RFQlVHLAorCQkgICAibWNwX3RyYWNlX3JlYWRfZGF0YTogcmVhZGluZyB0cmFjZSBkYXRhIG9mIHNpemUgJWQgZHdvcmRzIGZyb20gR1JDIGFkZHJlc3MgMHgleFxuIiwKKwkJICAgc2l6ZV9pbl9kd29yZHMsIGdyY19hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZV9pbl9kd29yZHM7IGkrKywgZ3JjX2FkZHIgKz0gQllURVNfSU5fRFdPUkQpCisJCWJ1ZltpXSA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LCBncmNfYWRkcik7Cit9CisKKy8qIFJlYWRzIHRoZSBNQ1AgVHJhY2UgbWV0YSBkYXRhIChmcm9tIE5WUkFNIG9yIGJ1ZmZlcikgaW50byB0aGUgc3BlY2lmaWVkCisgKiBidWZmZXIuCisgKi8KK3N0YXRpYyBlbnVtIGRiZ19zdGF0dXMgcWVkX21jcF90cmFjZV9yZWFkX21ldGEoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCSAgICAgICB1MzIgbnZyYW1fb2Zmc2V0X2luX2J5dGVzLAorCQkJCQkgICAgICAgdTMyIHNpemVfaW5fYnl0ZXMsIHUzMiAqYnVmKQoreworCXU4ICpieXRlX2J1ZiA9ICh1OCAqKWJ1ZjsKKwl1OCBtb2R1bGVzX251bSwgaTsKKwl1MzIgc2lnbmF0dXJlOworCisJLyogUmVhZCBtZXRhIGRhdGEgZnJvbSBOVlJBTSAqLworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXMgPSBxZWRfbnZyYW1fcmVhZChwX2h3Zm4sCisJCQkJCQlwX3B0dCwKKwkJCQkJCW52cmFtX29mZnNldF9pbl9ieXRlcywKKwkJCQkJCXNpemVfaW5fYnl0ZXMsCisJCQkJCQlidWYpOworCisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogRXh0cmFjdCBhbmQgY2hlY2sgZmlyc3Qgc2lnbmF0dXJlICovCisJc2lnbmF0dXJlID0gcWVkX3JlYWRfdW5hbGlnbmVkX2R3b3JkKGJ5dGVfYnVmKTsKKwlieXRlX2J1ZiArPSBzaXplb2YodTMyKTsKKwlpZiAoc2lnbmF0dXJlICE9IE1DUF9UUkFDRV9NRVRBX0lNQUdFX1NJR05BVFVSRSkKKwkJcmV0dXJuIERCR19TVEFUVVNfSU5WQUxJRF9UUkFDRV9TSUdOQVRVUkU7CisKKwkvKiBFeHRyYWN0IG51bWJlciBvZiBtb2R1bGVzICovCisJbW9kdWxlc19udW0gPSAqKGJ5dGVfYnVmKyspOworCisJLyogU2tpcCBhbGwgbW9kdWxlcyAqLworCWZvciAoaSA9IDA7IGkgPCBtb2R1bGVzX251bTsgaSsrKSB7CisJCXU4IG1vZHVsZV9sZW4gPSAqKGJ5dGVfYnVmKyspOworCisJCWJ5dGVfYnVmICs9IG1vZHVsZV9sZW47CisJfQorCisJLyogRXh0cmFjdCBhbmQgY2hlY2sgc2Vjb25kIHNpZ25hdHVyZSAqLworCXNpZ25hdHVyZSA9IHFlZF9yZWFkX3VuYWxpZ25lZF9kd29yZChieXRlX2J1Zik7CisJYnl0ZV9idWYgKz0gc2l6ZW9mKHUzMik7CisJaWYgKHNpZ25hdHVyZSAhPSBNQ1BfVFJBQ0VfTUVUQV9JTUFHRV9TSUdOQVRVUkUpCisJCXJldHVybiBEQkdfU1RBVFVTX0lOVkFMSURfVFJBQ0VfU0lHTkFUVVJFOworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCisvKiBEdW1wIE1DUCBUcmFjZSAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9tY3BfdHJhY2VfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkgICBib29sIGR1bXAsIHUzMiAqbnVtX2R1bXBlZF9kd29yZHMpCit7CisJdTMyIHRyYWNlX2RhdGFfZ3JjX2FkZHIsIHRyYWNlX2RhdGFfc2l6ZV9ieXRlcywgdHJhY2VfZGF0YV9zaXplX2R3b3JkczsKKwl1MzIgdHJhY2VfbWV0YV9zaXplX2R3b3JkcywgcnVubmluZ19idW5kbGVfaWQsIG9mZnNldCA9IDA7CisJdTMyIHRyYWNlX21ldGFfb2Zmc2V0X2J5dGVzLCB0cmFjZV9tZXRhX3NpemVfYnl0ZXM7CisJZW51bSBkYmdfc3RhdHVzIHN0YXR1czsKKwlpbnQgaGFsdGVkID0gMDsKKworCSpudW1fZHVtcGVkX2R3b3JkcyA9IDA7CisKKwkvKiBHZXQgdHJhY2UgZGF0YSBpbmZvICovCisJc3RhdHVzID0gcWVkX21jcF90cmFjZV9nZXRfZGF0YV9pbmZvKHBfaHdmbiwKKwkJCQkJICAgICBwX3B0dCwKKwkJCQkJICAgICAmdHJhY2VfZGF0YV9ncmNfYWRkciwKKwkJCQkJICAgICAmdHJhY2VfZGF0YV9zaXplX2J5dGVzKTsKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiBEdW1wIGdsb2JhbCBwYXJhbXMgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfY29tbW9uX2dsb2JhbF9wYXJhbXMocF9od2ZuLAorCQkJCQkJcF9wdHQsCisJCQkJCQlkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgMSk7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cl9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsICJkdW1wLXR5cGUiLCAibWNwLXRyYWNlIik7CisKKwkvKiBIYWx0IE1DUCB3aGlsZSByZWFkaW5nIGZyb20gc2NyYXRjaHBhZCBzbyB0aGUgcmVhZCBkYXRhIHdpbGwgYmUKKwkgKiBjb25zaXN0ZW50IGlmIGhhbHQgZmFpbHMsIE1DUCB0cmFjZSBpcyB0YWtlbiBhbnl3YXksIHdpdGggYSBzbWFsbAorCSAqIHJpc2sgdGhhdCBpdCBtYXkgYmUgY29ycnVwdC4KKwkgKi8KKwlpZiAoZHVtcCkgeworCQloYWx0ZWQgPSAhcWVkX21jcF9oYWx0KHBfaHdmbiwgcF9wdHQpOworCQlpZiAoIWhhbHRlZCkKKwkJCURQX05PVElDRShwX2h3Zm4sICJNQ1AgaGFsdCBmYWlsZWQhXG4iKTsKKwl9CisKKwkvKiBGaW5kIHRyYWNlIGRhdGEgc2l6ZSAqLworCXRyYWNlX2RhdGFfc2l6ZV9kd29yZHMgPQorCQlESVZfUk9VTkRfVVAodHJhY2VfZGF0YV9zaXplX2J5dGVzICsgc2l6ZW9mKHN0cnVjdCBtY3BfdHJhY2UpLAorCQkJICAgICBCWVRFU19JTl9EV09SRCk7CisKKwkvKiBEdW1wIHRyYWNlIGRhdGEgc2VjdGlvbiBoZWFkZXIgYW5kIHBhcmFtICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX3NlY3Rpb25faGRyKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgICBkdW1wLCAibWNwX3RyYWNlX2RhdGEiLCAxKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwgInNpemUiLCB0cmFjZV9kYXRhX3NpemVfZHdvcmRzKTsKKworCS8qIFJlYWQgdHJhY2UgZGF0YSBmcm9tIHNjcmF0Y2hwYWQgaW50byBkdW1wIGJ1ZmZlciAqLworCWlmIChkdW1wKQorCQlxZWRfbWNwX3RyYWNlX3JlYWRfZGF0YShwX2h3Zm4sCisJCQkJCXBfcHR0LAorCQkJCQl0cmFjZV9kYXRhX2dyY19hZGRyLAorCQkJCQl0cmFjZV9kYXRhX3NpemVfZHdvcmRzLAorCQkJCQlkdW1wX2J1ZiArIG9mZnNldCk7CisJb2Zmc2V0ICs9IHRyYWNlX2RhdGFfc2l6ZV9kd29yZHM7CisKKwkvKiBSZXN1bWUgTUNQIChvbmx5IGlmIGhhbHQgc3VjY2VlZGVkKSAqLworCWlmIChoYWx0ZWQgJiYgcWVkX21jcF9yZXN1bWUocF9od2ZuLCBwX3B0dCkgIT0gMCkKKwkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byByZXN1bWUgTUNQIGFmdGVyIGhhbHQhXG4iKTsKKworCS8qIER1bXAgdHJhY2UgbWV0YSBzZWN0aW9uIGhlYWRlciAqLworCW9mZnNldCArPSBxZWRfZHVtcF9zZWN0aW9uX2hkcihkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgICAgZHVtcCwgIm1jcF90cmFjZV9tZXRhIiwgMSk7CisKKwkvKiBSZWFkIHRyYWNlIG1ldGEgaW5mbyAqLworCXN0YXR1cyA9IHFlZF9tY3BfdHJhY2VfZ2V0X21ldGFfaW5mbyhwX2h3Zm4sCisJCQkJCSAgICAgcF9wdHQsCisJCQkJCSAgICAgdHJhY2VfZGF0YV9zaXplX2J5dGVzLAorCQkJCQkgICAgICZydW5uaW5nX2J1bmRsZV9pZCwKKwkJCQkJICAgICAmdHJhY2VfbWV0YV9vZmZzZXRfYnl0ZXMsCisJCQkJCSAgICAgJnRyYWNlX21ldGFfc2l6ZV9ieXRlcyk7CisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogRHVtcCB0cmFjZSBtZXRhIHNpemUgcGFyYW0gKHRyYWNlX21ldGFfc2l6ZV9ieXRlcyBpcyBhbHdheXMKKwkgKiBkd29yZC1hbGlnbmVkKS4KKwkgKi8KKwl0cmFjZV9tZXRhX3NpemVfZHdvcmRzID0gQllURVNfVE9fRFdPUkRTKHRyYWNlX21ldGFfc2l6ZV9ieXRlcyk7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwJZHVtcCwgInNpemUiLAorCQkJCSAgICAgdHJhY2VfbWV0YV9zaXplX2R3b3Jkcyk7CisKKwkvKiBSZWFkIHRyYWNlIG1ldGEgaW1hZ2UgaW50byBkdW1wIGJ1ZmZlciAqLworCWlmIChkdW1wKSB7CisJCXN0YXR1cyA9IHFlZF9tY3BfdHJhY2VfcmVhZF9tZXRhKHBfaHdmbiwKKwkJCQkJCXBfcHR0LAorCQkJCQkJdHJhY2VfbWV0YV9vZmZzZXRfYnl0ZXMsCisJCQkJCQl0cmFjZV9tZXRhX3NpemVfYnl0ZXMsCisJCQkJCQlkdW1wX2J1ZiArIG9mZnNldCk7CisJCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCisJb2Zmc2V0ICs9IHRyYWNlX21ldGFfc2l6ZV9kd29yZHM7CisKKwkqbnVtX2R1bXBlZF9kd29yZHMgPSBvZmZzZXQ7CisKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworLyogRHVtcCBHUkMgRklGTyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9yZWdfZmlmb19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgdTMyICpkdW1wX2J1ZiwKKwkJCQkgIGJvb2wgZHVtcCwgdTMyICpudW1fZHVtcGVkX2R3b3JkcykKK3sKKwl1MzIgb2Zmc2V0ID0gMCwgZHdvcmRzX3JlYWQsIHNpemVfcGFyYW1fb2Zmc2V0OworCWJvb2wgZmlmb19oYXNfZGF0YTsKKworCSpudW1fZHVtcGVkX2R3b3JkcyA9IDA7CisKKwkvKiBEdW1wIGdsb2JhbCBwYXJhbXMgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfY29tbW9uX2dsb2JhbF9wYXJhbXMocF9od2ZuLAorCQkJCQkJcF9wdHQsCisJCQkJCQlkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgMSk7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cl9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsICJkdW1wLXR5cGUiLCAicmVnLWZpZm8iKTsKKworCS8qIER1bXAgZmlmbyBkYXRhIHNlY3Rpb24gaGVhZGVyIGFuZCBwYXJhbS4gVGhlIHNpemUgcGFyYW0gaXMgMCBmb3Igbm93LAorCSAqIGFuZCBpcyBvdmVyd3JpdHRlbiBhZnRlciByZWFkaW5nIHRoZSBGSUZPLgorCSAqLworCW9mZnNldCArPSBxZWRfZHVtcF9zZWN0aW9uX2hkcihkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgICAgZHVtcCwgInJlZ19maWZvX2RhdGEiLCAxKTsKKwlzaXplX3BhcmFtX29mZnNldCA9IG9mZnNldDsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAic2l6ZSIsIDApOworCisJaWYgKCFkdW1wKSB7CisJCS8qIEZJRk8gbWF4IHNpemUgaXMgUkVHX0ZJRk9fREVQVEhfRFdPUkRTLiBUaGVyZSBpcyBubyB3YXkgdG8KKwkJICogdGVzdCBob3cgbXVjaCBkYXRhIGlzIGF2YWlsYWJsZSwgZXhjZXB0IGZvciByZWFkaW5nIGl0LgorCQkgKi8KKwkJb2Zmc2V0ICs9IFJFR19GSUZPX0RFUFRIX0RXT1JEUzsKKwkJKm51bV9kdW1wZWRfZHdvcmRzID0gb2Zmc2V0OworCQlyZXR1cm4gREJHX1NUQVRVU19PSzsKKwl9CisKKwlmaWZvX2hhc19kYXRhID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCQkgICAgICAgR1JDX1JFR19UUkFDRV9GSUZPX1ZBTElEX0RBVEEpID4gMDsKKworCS8qIFB1bGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBmaWZvLiBVc2UgRE1BRSBzaW5jZSB0aGlzIGlzIHdpZGVidXMgbWVtb3J5CisJICogYW5kIG11c3QgYmUgYWNjZXNzZWQgYXRvbWljYWxseS4gVGVzdCBmb3IgZHdvcmRzX3JlYWQgbm90IHBhc3NpbmcKKwkgKiBidWZmZXIgc2l6ZSBzaW5jZSBtb3JlIGVudHJpZXMgY291bGQgYmUgYWRkZWQgdG8gdGhlIGJ1ZmZlciBhcyB3ZSBhcmUKKwkgKiBlbXB0eWluZyBpdC4KKwkgKi8KKwlmb3IgKGR3b3Jkc19yZWFkID0gMDsKKwkgICAgIGZpZm9faGFzX2RhdGEgJiYgZHdvcmRzX3JlYWQgPCBSRUdfRklGT19ERVBUSF9EV09SRFM7CisJICAgICBkd29yZHNfcmVhZCArPSBSRUdfRklGT19FTEVNRU5UX0RXT1JEUywgb2Zmc2V0ICs9CisJICAgICBSRUdfRklGT19FTEVNRU5UX0RXT1JEUykgeworCQlpZiAocWVkX2RtYWVfZ3JjMmhvc3QocF9od2ZuLCBwX3B0dCwgR1JDX1JFR19UUkFDRV9GSUZPLAorCQkJCSAgICAgICh1NjQpKHVpbnRwdHJfdCkoJmR1bXBfYnVmW29mZnNldF0pLAorCQkJCSAgICAgIFJFR19GSUZPX0VMRU1FTlRfRFdPUkRTLCAwKSkKKwkJCXJldHVybiBEQkdfU1RBVFVTX0RNQUVfRkFJTEVEOworCQlmaWZvX2hhc19kYXRhID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCQkJICAgICAgIEdSQ19SRUdfVFJBQ0VfRklGT19WQUxJRF9EQVRBKSA+IDA7CisJfQorCisJcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgc2l6ZV9wYXJhbV9vZmZzZXQsIGR1bXAsICJzaXplIiwKKwkJCSAgIGR3b3Jkc19yZWFkKTsKKworCSpudW1fZHVtcGVkX2R3b3JkcyA9IG9mZnNldDsKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworLyogRHVtcCBJR1UgRklGTyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9pZ3VfZmlmb19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgdTMyICpkdW1wX2J1ZiwKKwkJCQkgIGJvb2wgZHVtcCwgdTMyICpudW1fZHVtcGVkX2R3b3JkcykKK3sKKwl1MzIgb2Zmc2V0ID0gMCwgZHdvcmRzX3JlYWQsIHNpemVfcGFyYW1fb2Zmc2V0OworCWJvb2wgZmlmb19oYXNfZGF0YTsKKworCSpudW1fZHVtcGVkX2R3b3JkcyA9IDA7CisKKwkvKiBEdW1wIGdsb2JhbCBwYXJhbXMgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfY29tbW9uX2dsb2JhbF9wYXJhbXMocF9od2ZuLAorCQkJCQkJcF9wdHQsCisJCQkJCQlkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgMSk7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cl9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsICJkdW1wLXR5cGUiLCAiaWd1LWZpZm8iKTsKKworCS8qIER1bXAgZmlmbyBkYXRhIHNlY3Rpb24gaGVhZGVyIGFuZCBwYXJhbS4gVGhlIHNpemUgcGFyYW0gaXMgMCBmb3Igbm93LAorCSAqIGFuZCBpcyBvdmVyd3JpdHRlbiBhZnRlciByZWFkaW5nIHRoZSBGSUZPLgorCSAqLworCW9mZnNldCArPSBxZWRfZHVtcF9zZWN0aW9uX2hkcihkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgICAgZHVtcCwgImlndV9maWZvX2RhdGEiLCAxKTsKKwlzaXplX3BhcmFtX29mZnNldCA9IG9mZnNldDsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAic2l6ZSIsIDApOworCisJaWYgKCFkdW1wKSB7CisJCS8qIEZJRk8gbWF4IHNpemUgaXMgSUdVX0ZJRk9fREVQVEhfRFdPUkRTLiBUaGVyZSBpcyBubyB3YXkgdG8KKwkJICogdGVzdCBob3cgbXVjaCBkYXRhIGlzIGF2YWlsYWJsZSwgZXhjZXB0IGZvciByZWFkaW5nIGl0LgorCQkgKi8KKwkJb2Zmc2V0ICs9IElHVV9GSUZPX0RFUFRIX0RXT1JEUzsKKwkJKm51bV9kdW1wZWRfZHdvcmRzID0gb2Zmc2V0OworCQlyZXR1cm4gREJHX1NUQVRVU19PSzsKKwl9CisKKwlmaWZvX2hhc19kYXRhID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCQkgICAgICAgSUdVX1JFR19FUlJPUl9IQU5ETElOR19EQVRBX1ZBTElEKSA+IDA7CisKKwkvKiBQdWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gZmlmby4gVXNlIERNQUUgc2luY2UgdGhpcyBpcyB3aWRlYnVzIG1lbW9yeQorCSAqIGFuZCBtdXN0IGJlIGFjY2Vzc2VkIGF0b21pY2FsbHkuIFRlc3QgZm9yIGR3b3Jkc19yZWFkIG5vdCBwYXNzaW5nCisJICogYnVmZmVyIHNpemUgc2luY2UgbW9yZSBlbnRyaWVzIGNvdWxkIGJlIGFkZGVkIHRvIHRoZSBidWZmZXIgYXMgd2UgYXJlCisJICogZW1wdHlpbmcgaXQuCisJICovCisJZm9yIChkd29yZHNfcmVhZCA9IDA7CisJICAgICBmaWZvX2hhc19kYXRhICYmIGR3b3Jkc19yZWFkIDwgSUdVX0ZJRk9fREVQVEhfRFdPUkRTOworCSAgICAgZHdvcmRzX3JlYWQgKz0gSUdVX0ZJRk9fRUxFTUVOVF9EV09SRFMsIG9mZnNldCArPQorCSAgICAgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRFMpIHsKKwkJaWYgKHFlZF9kbWFlX2dyYzJob3N0KHBfaHdmbiwgcF9wdHQsCisJCQkJICAgICAgSUdVX1JFR19FUlJPUl9IQU5ETElOR19NRU1PUlksCisJCQkJICAgICAgKHU2NCkodWludHB0cl90KSgmZHVtcF9idWZbb2Zmc2V0XSksCisJCQkJICAgICAgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRFMsIDApKQorCQkJcmV0dXJuIERCR19TVEFUVVNfRE1BRV9GQUlMRUQ7CisJCWZpZm9faGFzX2RhdGEgPQlxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJCQkgICAgICAgSUdVX1JFR19FUlJPUl9IQU5ETElOR19EQVRBX1ZBTElEKSA+IDA7CisJfQorCisJcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgc2l6ZV9wYXJhbV9vZmZzZXQsIGR1bXAsICJzaXplIiwKKwkJCSAgIGR3b3Jkc19yZWFkKTsKKworCSpudW1fZHVtcGVkX2R3b3JkcyA9IG9mZnNldDsKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworLyogUHJvdGVjdGlvbiBPdmVycmlkZSBkdW1wICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX3Byb3RlY3Rpb25fb3ZlcnJpZGVfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCSAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJICAgICBib29sIGR1bXAsIHUzMiAqbnVtX2R1bXBlZF9kd29yZHMpCit7CisJdTMyIG9mZnNldCA9IDAsIHNpemVfcGFyYW1fb2Zmc2V0LCBvdmVycmlkZV93aW5kb3dfZHdvcmRzOworCisJKm51bV9kdW1wZWRfZHdvcmRzID0gMDsKKworCS8qIER1bXAgZ2xvYmFsIHBhcmFtcyAqLworCW9mZnNldCArPSBxZWRfZHVtcF9jb21tb25fZ2xvYmFsX3BhcmFtcyhwX2h3Zm4sCisJCQkJCQlwX3B0dCwKKwkJCQkJCWR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAxKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwgImR1bXAtdHlwZSIsICJwcm90ZWN0aW9uLW92ZXJyaWRlIik7CisKKwkvKiBEdW1wIGRhdGEgc2VjdGlvbiBoZWFkZXIgYW5kIHBhcmFtLiBUaGUgc2l6ZSBwYXJhbSBpcyAwIGZvciBub3csIGFuZAorCSAqIGlzIG92ZXJ3cml0dGVuIGFmdGVyIHJlYWRpbmcgdGhlIGRhdGEuCisJICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX3NlY3Rpb25faGRyKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgICBkdW1wLCAicHJvdGVjdGlvbl9vdmVycmlkZV9kYXRhIiwgMSk7CisJc2l6ZV9wYXJhbV9vZmZzZXQgPSBvZmZzZXQ7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgInNpemUiLCAwKTsKKworCWlmICghZHVtcCkgeworCQlvZmZzZXQgKz0gUFJPVEVDVElPTl9PVkVSUklERV9ERVBUSF9EV09SRFM7CisJCSpudW1fZHVtcGVkX2R3b3JkcyA9IG9mZnNldDsKKwkJcmV0dXJuIERCR19TVEFUVVNfT0s7CisJfQorCisJLyogQWRkIG92ZXJyaWRlIHdpbmRvdyBpbmZvIHRvIGJ1ZmZlciAqLworCW92ZXJyaWRlX3dpbmRvd19kd29yZHMgPQorCQlxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJICAgICAgIEdSQ19SRUdfTlVNQkVSX1ZBTElEX09WRVJSSURFX1dJTkRPVykgKgorCQkgICAgICAgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX0RXT1JEUzsKKwlpZiAocWVkX2RtYWVfZ3JjMmhvc3QocF9od2ZuLCBwX3B0dCwKKwkJCSAgICAgIEdSQ19SRUdfUFJPVEVDVElPTl9PVkVSUklERV9XSU5ET1csCisJCQkgICAgICAodTY0KSh1aW50cHRyX3QpKGR1bXBfYnVmICsgb2Zmc2V0KSwKKwkJCSAgICAgIG92ZXJyaWRlX3dpbmRvd19kd29yZHMsIDApKQorCQlyZXR1cm4gREJHX1NUQVRVU19ETUFFX0ZBSUxFRDsKKwlvZmZzZXQgKz0gb3ZlcnJpZGVfd2luZG93X2R3b3JkczsKKwlxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBzaXplX3BhcmFtX29mZnNldCwgZHVtcCwgInNpemUiLAorCQkJICAgb3ZlcnJpZGVfd2luZG93X2R3b3Jkcyk7CisKKwkqbnVtX2R1bXBlZF9kd29yZHMgPSBvZmZzZXQ7CisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKKy8qIFBlcmZvcm1zIEZXIEFzc2VydHMgRHVtcCB0byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqLworc3RhdGljIHUzMiBxZWRfZndfYXNzZXJ0c19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wKQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwljaGFyIHN0b3JtX2xldHRlcl9zdHJbMl0gPSAiPyI7CisJc3RydWN0IGZ3X2luZm8gZndfaW5mbzsKKwl1MzIgb2Zmc2V0ID0gMCwgaTsKKwl1OCBzdG9ybV9pZDsKKworCS8qIER1bXAgZ2xvYmFsIHBhcmFtcyAqLworCW9mZnNldCArPSBxZWRfZHVtcF9jb21tb25fZ2xvYmFsX3BhcmFtcyhwX2h3Zm4sCisJCQkJCQlwX3B0dCwKKwkJCQkJCWR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAxKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwgImR1bXAtdHlwZSIsICJmdy1hc3NlcnRzIik7CisJZm9yIChzdG9ybV9pZCA9IDA7IHN0b3JtX2lkIDwgTUFYX0RCR19TVE9STVM7IHN0b3JtX2lkKyspIHsKKwkJdTMyIGZ3X2Fzc2VydHNfc2VjdGlvbl9hZGRyLCBuZXh0X2xpc3RfaWR4X2FkZHIsIG5leHRfbGlzdF9pZHgsCisJCQlsYXN0X2xpc3RfaWR4LCBlbGVtZW50X2FkZHI7CisKKwkJaWYgKGRldl9kYXRhLT5ibG9ja19pbl9yZXNldFtzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLmJsb2NrX2lkXSkKKwkJCWNvbnRpbnVlOworCisJCS8qIFJlYWQgRlcgaW5mbyBmb3IgdGhlIGN1cnJlbnQgU3Rvcm0gKi8KKwkJcWVkX3JlYWRfZndfaW5mbyhwX2h3Zm4sIHBfcHR0LCBzdG9ybV9pZCwgJmZ3X2luZm8pOworCisJCS8qIER1bXAgRlcgQXNzZXJ0cyBzZWN0aW9uIGhlYWRlciBhbmQgcGFyYW1zICovCisJCXN0b3JtX2xldHRlcl9zdHJbMF0gPSBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLmxldHRlcjsKKwkJb2Zmc2V0ICs9IHFlZF9kdW1wX3NlY3Rpb25faGRyKGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLAorCQkJCQkgICAgICAgImZ3X2Fzc2VydHMiLCAyKTsKKwkJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cl9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgInN0b3JtIiwKKwkJCQkJICAgICBzdG9ybV9sZXR0ZXJfc3RyKTsKKwkJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgInNpemUiLAorCQkJCQkgICAgIGZ3X2luZm8uZndfYXNzZXJ0c19zZWN0aW9uLgorCQkJCQkgICAgIGxpc3RfZWxlbWVudF9kd29yZF9zaXplKTsKKworCQlpZiAoIWR1bXApIHsKKwkJCW9mZnNldCArPSBmd19pbmZvLmZ3X2Fzc2VydHNfc2VjdGlvbi4KKwkJCQkgIGxpc3RfZWxlbWVudF9kd29yZF9zaXplOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBSZWFkIGFuZCBkdW1wIEZXIEFzc2VydHMgZGF0YSAqLworCQlmd19hc3NlcnRzX3NlY3Rpb25fYWRkciA9CisJCQlzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLnNlbV9mYXN0X21lbV9hZGRyICsKKwkJCVNFTV9GQVNUX1JFR19JTlRfUkFNICsKKwkJCVJBTV9MSU5FU19UT19CWVRFUyhmd19pbmZvLmZ3X2Fzc2VydHNfc2VjdGlvbi4KKwkJCQkJICAgc2VjdGlvbl9yYW1fbGluZV9vZmZzZXQpOworCQluZXh0X2xpc3RfaWR4X2FkZHIgPQorCQkJZndfYXNzZXJ0c19zZWN0aW9uX2FkZHIgKworCQkJRFdPUkRTX1RPX0JZVEVTKGZ3X2luZm8uZndfYXNzZXJ0c19zZWN0aW9uLgorCQkJCQlsaXN0X25leHRfaW5kZXhfZHdvcmRfb2Zmc2V0KTsKKwkJbmV4dF9saXN0X2lkeCA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LCBuZXh0X2xpc3RfaWR4X2FkZHIpOworCQlsYXN0X2xpc3RfaWR4ID0gKG5leHRfbGlzdF9pZHggPiAwCisJCQkJID8gbmV4dF9saXN0X2lkeAorCQkJCSA6IGZ3X2luZm8uZndfYXNzZXJ0c19zZWN0aW9uLmxpc3RfbnVtX2VsZW1lbnRzKQorCQkJCS0gMTsKKwkJZWxlbWVudF9hZGRyID0KKwkJCWZ3X2Fzc2VydHNfc2VjdGlvbl9hZGRyICsKKwkJCURXT1JEU19UT19CWVRFUyhmd19pbmZvLmZ3X2Fzc2VydHNfc2VjdGlvbi4KKwkJCQkJbGlzdF9kd29yZF9vZmZzZXQpICsKKwkJCWxhc3RfbGlzdF9pZHggKgorCQkJRFdPUkRTX1RPX0JZVEVTKGZ3X2luZm8uZndfYXNzZXJ0c19zZWN0aW9uLgorCQkJCQlsaXN0X2VsZW1lbnRfZHdvcmRfc2l6ZSk7CisJCWZvciAoaSA9IDA7CisJCSAgICAgaSA8IGZ3X2luZm8uZndfYXNzZXJ0c19zZWN0aW9uLmxpc3RfZWxlbWVudF9kd29yZF9zaXplOworCQkgICAgIGkrKywgb2Zmc2V0KyssIGVsZW1lbnRfYWRkciArPSBCWVRFU19JTl9EV09SRCkKKwkJCWR1bXBfYnVmW29mZnNldF0gPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwgZWxlbWVudF9hZGRyKTsKKwl9CisKKwkvKiBEdW1wIGxhc3Qgc2VjdGlvbiAqLworCW9mZnNldCArPSBxZWRfZHVtcF9zZWN0aW9uX2hkcihkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgImxhc3QiLCAwKTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUHVibGljIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19zZXRfYmluX3B0cihjb25zdCB1OCAqIGNvbnN0IGJpbl9wdHIpCit7CisJLyogQ29udmVydCBiaW5hcnkgZGF0YSB0byBkZWJ1ZyBhcnJheXMgKi8KKwl1MzIgbnVtX29mX2J1ZmZlcnMgPSAqKHUzMiAqKWJpbl9wdHI7CisJc3RydWN0IGJpbl9idWZmZXJfaGRyICpidWZfYXJyYXk7CisJdTggYnVmX2lkOworCisJYnVmX2FycmF5ID0gKHN0cnVjdCBiaW5fYnVmZmVyX2hkciAqKSgodTMyICopYmluX3B0ciArIDEpOworCisJZm9yIChidWZfaWQgPSAwOyBidWZfaWQgPCBudW1fb2ZfYnVmZmVyczsgYnVmX2lkKyspIHsKKwkJc19kYmdfYXJyYXlzW2J1Zl9pZF0ucHRyID0KKwkJICAgICh1MzIgKikoYmluX3B0ciArIGJ1Zl9hcnJheVtidWZfaWRdLm9mZnNldCk7CisJCXNfZGJnX2FycmF5c1tidWZfaWRdLnNpemVfaW5fZHdvcmRzID0KKwkJICAgIEJZVEVTX1RPX0RXT1JEUyhidWZfYXJyYXlbYnVmX2lkXS5sZW5ndGgpOworCX0KKworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19ncmNfZ2V0X2R1bXBfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJICAgICAgdTMyICpidWZfc2l6ZSkKK3sKKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzID0gcWVkX2RiZ19kZXZfaW5pdChwX2h3Zm4sIHBfcHR0KTsKKworCSpidWZfc2l6ZSA9IDA7CisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCWlmICghc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX01PREVfVFJFRV0ucHRyIHx8CisJICAgICFzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfRFVNUF9SRUddLnB0ciB8fAorCSAgICAhc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0RVTVBfTUVNXS5wdHIgfHwKKwkgICAgIXNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19BVFROX0JMT0NLU10ucHRyIHx8CisJICAgICFzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfQVRUTl9SRUdTXS5wdHIpCisJCXJldHVybiBEQkdfU1RBVFVTX0RCR19BUlJBWV9OT1RfU0VUOworCXJldHVybiBxZWRfZ3JjX2R1bXAocF9od2ZuLCBwX3B0dCwgTlVMTCwgZmFsc2UsIGJ1Zl9zaXplKTsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfZ3JjX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgdTMyICpkdW1wX2J1ZiwKKwkJCQkgdTMyIGJ1Zl9zaXplX2luX2R3b3JkcywKKwkJCQkgdTMyICpudW1fZHVtcGVkX2R3b3JkcykKK3sKKwl1MzIgbmVlZGVkX2J1Zl9zaXplX2luX2R3b3JkczsKKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzOworCisJc3RhdHVzID0gcWVkX2RiZ19ncmNfZ2V0X2R1bXBfYnVmX3NpemUocF9od2ZuLCBwX3B0dCwKKwkJCQkJICAgICAgICZuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzKTsKKworCSpudW1fZHVtcGVkX2R3b3JkcyA9IDA7CisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChidWZfc2l6ZV9pbl9kd29yZHMgPCBuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzKQorCQlyZXR1cm4gREJHX1NUQVRVU19EVU1QX0JVRl9UT09fU01BTEw7CisKKwkvKiBHUkMgRHVtcCAqLworCXN0YXR1cyA9IHFlZF9ncmNfZHVtcChwX2h3Zm4sIHBfcHR0LCBkdW1wX2J1ZiwgdHJ1ZSwgbnVtX2R1bXBlZF9kd29yZHMpOworCisJLyogQ2xlYXIgYWxsIEdSQyBwYXJhbXMgKi8KKwlxZWRfZGJnX2dyY19jbGVhcl9wYXJhbXMocF9od2ZuKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19pZGxlX2Noa19nZXRfZHVtcF9idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJCSAgIHUzMiAqYnVmX3NpemUpCit7CisJZW51bSBkYmdfc3RhdHVzIHN0YXR1cyA9IHFlZF9kYmdfZGV2X2luaXQocF9od2ZuLCBwX3B0dCk7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCisJKmJ1Zl9zaXplID0gMDsKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisJaWYgKCFzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfTU9ERV9UUkVFXS5wdHIgfHwKKwkgICAgIXNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19JRExFX0NIS19SRUdTXS5wdHIgfHwKKwkgICAgIXNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19JRExFX0NIS19JTU1TXS5wdHIgfHwKKwkgICAgIXNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19JRExFX0NIS19SVUxFU10ucHRyKQorCQlyZXR1cm4gREJHX1NUQVRVU19EQkdfQVJSQVlfTk9UX1NFVDsKKwlpZiAoIWRldl9kYXRhLT5pZGxlX2Noay5idWZfc2l6ZV9zZXQpIHsKKwkJZGV2X2RhdGEtPmlkbGVfY2hrLmJ1Zl9zaXplID0gcWVkX2lkbGVfY2hrX2R1bXAocF9od2ZuLAorCQkJCQkJCQlwX3B0dCwKKwkJCQkJCQkJTlVMTCwgZmFsc2UpOworCQlkZXZfZGF0YS0+aWRsZV9jaGsuYnVmX3NpemVfc2V0ID0gdHJ1ZTsKKwl9CisKKwkqYnVmX3NpemUgPSBkZXZfZGF0YS0+aWRsZV9jaGsuYnVmX3NpemU7CisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2lkbGVfY2hrX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJICAgICAgdTMyIGJ1Zl9zaXplX2luX2R3b3JkcywKKwkJCQkgICAgICB1MzIgKm51bV9kdW1wZWRfZHdvcmRzKQoreworCXUzMiBuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzOworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBxZWRfZGJnX2lkbGVfY2hrX2dldF9kdW1wX2J1Zl9zaXplKHBfaHdmbiwgcF9wdHQsCisJCQkJCQkgICAgJm5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHMpOworCisJKm51bV9kdW1wZWRfZHdvcmRzID0gMDsKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisJaWYgKGJ1Zl9zaXplX2luX2R3b3JkcyA8IG5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHMpCisJCXJldHVybiBEQkdfU1RBVFVTX0RVTVBfQlVGX1RPT19TTUFMTDsKKworCS8qIFVwZGF0ZSByZXNldCBzdGF0ZSAqLworCXFlZF91cGRhdGVfYmxvY2tzX3Jlc2V0X3N0YXRlKHBfaHdmbiwgcF9wdHQpOworCisJLyogSWRsZSBDaGVjayBEdW1wICovCisJKm51bV9kdW1wZWRfZHdvcmRzID0gcWVkX2lkbGVfY2hrX2R1bXAocF9od2ZuLCBwX3B0dCwgZHVtcF9idWYsIHRydWUpOworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19tY3BfdHJhY2VfZ2V0X2R1bXBfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkJICAgIHUzMiAqYnVmX3NpemUpCit7CisJZW51bSBkYmdfc3RhdHVzIHN0YXR1cyA9IHFlZF9kYmdfZGV2X2luaXQocF9od2ZuLCBwX3B0dCk7CisKKwkqYnVmX3NpemUgPSAwOworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gcWVkX21jcF90cmFjZV9kdW1wKHBfaHdmbiwgcF9wdHQsIE5VTEwsIGZhbHNlLCBidWZfc2l6ZSk7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX21jcF90cmFjZV9kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJICAgICAgIHUzMiBidWZfc2l6ZV9pbl9kd29yZHMsCisJCQkJICAgICAgIHUzMiAqbnVtX2R1bXBlZF9kd29yZHMpCit7CisJdTMyIG5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHM7CisJZW51bSBkYmdfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IHFlZF9kYmdfbWNwX3RyYWNlX2dldF9kdW1wX2J1Zl9zaXplKHBfaHdmbiwgcF9wdHQsCisJCQkJCQkmbmVlZGVkX2J1Zl9zaXplX2luX2R3b3Jkcyk7CisKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisJaWYgKGJ1Zl9zaXplX2luX2R3b3JkcyA8IG5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHMpCisJCXJldHVybiBEQkdfU1RBVFVTX0RVTVBfQlVGX1RPT19TTUFMTDsKKworCS8qIFVwZGF0ZSByZXNldCBzdGF0ZSAqLworCXFlZF91cGRhdGVfYmxvY2tzX3Jlc2V0X3N0YXRlKHBfaHdmbiwgcF9wdHQpOworCisJLyogUGVyZm9ybSBkdW1wICovCisJcmV0dXJuIHFlZF9tY3BfdHJhY2VfZHVtcChwX2h3Zm4sCisJCQkJICBwX3B0dCwgZHVtcF9idWYsIHRydWUsIG51bV9kdW1wZWRfZHdvcmRzKTsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfcmVnX2ZpZm9fZ2V0X2R1bXBfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCQkgICB1MzIgKmJ1Zl9zaXplKQoreworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXMgPSBxZWRfZGJnX2Rldl9pbml0KHBfaHdmbiwgcF9wdHQpOworCisJKmJ1Zl9zaXplID0gMDsKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIHFlZF9yZWdfZmlmb19kdW1wKHBfaHdmbiwgcF9wdHQsIE5VTEwsIGZhbHNlLCBidWZfc2l6ZSk7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX3JlZ19maWZvX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJICAgICAgdTMyIGJ1Zl9zaXplX2luX2R3b3JkcywKKwkJCQkgICAgICB1MzIgKm51bV9kdW1wZWRfZHdvcmRzKQoreworCXUzMiBuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzOworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBxZWRfZGJnX3JlZ19maWZvX2dldF9kdW1wX2J1Zl9zaXplKHBfaHdmbiwgcF9wdHQsCisJCQkJCQkgICAgJm5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHMpOworCisJKm51bV9kdW1wZWRfZHdvcmRzID0gMDsKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisJaWYgKGJ1Zl9zaXplX2luX2R3b3JkcyA8IG5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHMpCisJCXJldHVybiBEQkdfU1RBVFVTX0RVTVBfQlVGX1RPT19TTUFMTDsKKworCS8qIFVwZGF0ZSByZXNldCBzdGF0ZSAqLworCXFlZF91cGRhdGVfYmxvY2tzX3Jlc2V0X3N0YXRlKHBfaHdmbiwgcF9wdHQpOworCXJldHVybiBxZWRfcmVnX2ZpZm9fZHVtcChwX2h3Zm4sCisJCQkJIHBfcHR0LCBkdW1wX2J1ZiwgdHJ1ZSwgbnVtX2R1bXBlZF9kd29yZHMpOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19pZ3VfZmlmb19nZXRfZHVtcF9idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJCSAgIHUzMiAqYnVmX3NpemUpCit7CisJZW51bSBkYmdfc3RhdHVzIHN0YXR1cyA9IHFlZF9kYmdfZGV2X2luaXQocF9od2ZuLCBwX3B0dCk7CisKKwkqYnVmX3NpemUgPSAwOworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gcWVkX2lndV9maWZvX2R1bXAocF9od2ZuLCBwX3B0dCwgTlVMTCwgZmFsc2UsIGJ1Zl9zaXplKTsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfaWd1X2ZpZm9fZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkgICAgICB1MzIgYnVmX3NpemVfaW5fZHdvcmRzLAorCQkJCSAgICAgIHUzMiAqbnVtX2R1bXBlZF9kd29yZHMpCit7CisJdTMyIG5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHM7CisJZW51bSBkYmdfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IHFlZF9kYmdfaWd1X2ZpZm9fZ2V0X2R1bXBfYnVmX3NpemUocF9od2ZuLCBwX3B0dCwKKwkJCQkJCSAgICAmbmVlZGVkX2J1Zl9zaXplX2luX2R3b3Jkcyk7CisKKwkqbnVtX2R1bXBlZF9kd29yZHMgPSAwOworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoYnVmX3NpemVfaW5fZHdvcmRzIDwgbmVlZGVkX2J1Zl9zaXplX2luX2R3b3JkcykKKwkJcmV0dXJuIERCR19TVEFUVVNfRFVNUF9CVUZfVE9PX1NNQUxMOworCisJLyogVXBkYXRlIHJlc2V0IHN0YXRlICovCisJcWVkX3VwZGF0ZV9ibG9ja3NfcmVzZXRfc3RhdGUocF9od2ZuLCBwX3B0dCk7CisJcmV0dXJuIHFlZF9pZ3VfZmlmb19kdW1wKHBfaHdmbiwKKwkJCQkgcF9wdHQsIGR1bXBfYnVmLCB0cnVlLCBudW1fZHVtcGVkX2R3b3Jkcyk7Cit9CisKK2VudW0gZGJnX3N0YXR1cworcWVkX2RiZ19wcm90ZWN0aW9uX292ZXJyaWRlX2dldF9kdW1wX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCSAgICAgIHUzMiAqYnVmX3NpemUpCit7CisJZW51bSBkYmdfc3RhdHVzIHN0YXR1cyA9IHFlZF9kYmdfZGV2X2luaXQocF9od2ZuLCBwX3B0dCk7CisKKwkqYnVmX3NpemUgPSAwOworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gcWVkX3Byb3RlY3Rpb25fb3ZlcnJpZGVfZHVtcChwX2h3Zm4sCisJCQkJCSAgICBwX3B0dCwgTlVMTCwgZmFsc2UsIGJ1Zl9zaXplKTsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfcHJvdGVjdGlvbl9vdmVycmlkZV9kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJCSB1MzIgKmR1bXBfYnVmLAorCQkJCQkJIHUzMiBidWZfc2l6ZV9pbl9kd29yZHMsCisJCQkJCQkgdTMyICpudW1fZHVtcGVkX2R3b3JkcykKK3sKKwl1MzIgbmVlZGVkX2J1Zl9zaXplX2luX2R3b3JkczsKKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzOworCisJc3RhdHVzID0gcWVkX2RiZ19wcm90ZWN0aW9uX292ZXJyaWRlX2dldF9kdW1wX2J1Zl9zaXplKHBfaHdmbiwgcF9wdHQsCisJCQkJCQkmbmVlZGVkX2J1Zl9zaXplX2luX2R3b3Jkcyk7CisKKwkqbnVtX2R1bXBlZF9kd29yZHMgPSAwOworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoYnVmX3NpemVfaW5fZHdvcmRzIDwgbmVlZGVkX2J1Zl9zaXplX2luX2R3b3JkcykKKwkJcmV0dXJuIERCR19TVEFUVVNfRFVNUF9CVUZfVE9PX1NNQUxMOworCisJLyogVXBkYXRlIHJlc2V0IHN0YXRlICovCisJcWVkX3VwZGF0ZV9ibG9ja3NfcmVzZXRfc3RhdGUocF9od2ZuLCBwX3B0dCk7CisJcmV0dXJuIHFlZF9wcm90ZWN0aW9uX292ZXJyaWRlX2R1bXAocF9od2ZuLAorCQkJCQkgICAgcF9wdHQsCisJCQkJCSAgICBkdW1wX2J1ZiwgdHJ1ZSwgbnVtX2R1bXBlZF9kd29yZHMpOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19md19hc3NlcnRzX2dldF9kdW1wX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCQkgICAgIHUzMiAqYnVmX3NpemUpCit7CisJZW51bSBkYmdfc3RhdHVzIHN0YXR1cyA9IHFlZF9kYmdfZGV2X2luaXQocF9od2ZuLCBwX3B0dCk7CisKKwkqYnVmX3NpemUgPSAwOworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIFVwZGF0ZSByZXNldCBzdGF0ZSAqLworCXFlZF91cGRhdGVfYmxvY2tzX3Jlc2V0X3N0YXRlKHBfaHdmbiwgcF9wdHQpOworCSpidWZfc2l6ZSA9IHFlZF9md19hc3NlcnRzX2R1bXAocF9od2ZuLCBwX3B0dCwgTlVMTCwgZmFsc2UpOworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19md19hc3NlcnRzX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCXN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJdTMyICpkdW1wX2J1ZiwKKwkJCQkJdTMyIGJ1Zl9zaXplX2luX2R3b3JkcywKKwkJCQkJdTMyICpudW1fZHVtcGVkX2R3b3JkcykKK3sKKwl1MzIgbmVlZGVkX2J1Zl9zaXplX2luX2R3b3JkczsKKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzOworCisJc3RhdHVzID0gcWVkX2RiZ19md19hc3NlcnRzX2dldF9kdW1wX2J1Zl9zaXplKHBfaHdmbiwgcF9wdHQsCisJCQkJCQkmbmVlZGVkX2J1Zl9zaXplX2luX2R3b3Jkcyk7CisKKwkqbnVtX2R1bXBlZF9kd29yZHMgPSAwOworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoYnVmX3NpemVfaW5fZHdvcmRzIDwgbmVlZGVkX2J1Zl9zaXplX2luX2R3b3JkcykKKwkJcmV0dXJuIERCR19TVEFUVVNfRFVNUF9CVUZfVE9PX1NNQUxMOworCisJKm51bV9kdW1wZWRfZHdvcmRzID0gcWVkX2Z3X2Fzc2VydHNfZHVtcChwX2h3Zm4sIHBfcHR0LCBkdW1wX2J1ZiwgdHJ1ZSk7CisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IG1jcF90cmFjZV9mb3JtYXQgeworCXUzMiBkYXRhOworI2RlZmluZSBNQ1BfVFJBQ0VfRk9STUFUX01PRFVMRV9NQVNLCTB4MDAwMGZmZmYKKyNkZWZpbmUgTUNQX1RSQUNFX0ZPUk1BVF9NT0RVTEVfU0hJRlQJMAorI2RlZmluZSBNQ1BfVFJBQ0VfRk9STUFUX0xFVkVMX01BU0sJMHgwMDAzMDAwMAorI2RlZmluZSBNQ1BfVFJBQ0VfRk9STUFUX0xFVkVMX1NISUZUCTE2CisjZGVmaW5lIE1DUF9UUkFDRV9GT1JNQVRfUDFfU0laRV9NQVNLCTB4MDAwYzAwMDAKKyNkZWZpbmUgTUNQX1RSQUNFX0ZPUk1BVF9QMV9TSVpFX1NISUZUCTE4CisjZGVmaW5lIE1DUF9UUkFDRV9GT1JNQVRfUDJfU0laRV9NQVNLCTB4MDAzMDAwMDAKKyNkZWZpbmUgTUNQX1RSQUNFX0ZPUk1BVF9QMl9TSVpFX1NISUZUCTIwCisjZGVmaW5lIE1DUF9UUkFDRV9GT1JNQVRfUDNfU0laRV9NQVNLCTB4MDBjMDAwMDAKKyNkZWZpbmUgTUNQX1RSQUNFX0ZPUk1BVF9QM19TSVpFX1NISUZUCTIyCisjZGVmaW5lIE1DUF9UUkFDRV9GT1JNQVRfTEVOX01BU0sJMHhmZjAwMDAwMAorI2RlZmluZSBNQ1BfVFJBQ0VfRk9STUFUX0xFTl9TSElGVAkyNAorCWNoYXIgKmZvcm1hdF9zdHI7Cit9OworCitzdHJ1Y3QgbWNwX3RyYWNlX21ldGEgeworCXUzMiBtb2R1bGVzX251bTsKKwljaGFyICoqbW9kdWxlczsKKwl1MzIgZm9ybWF0c19udW07CisJc3RydWN0IG1jcF90cmFjZV9mb3JtYXQgKmZvcm1hdHM7Cit9OworCisvKiBSZWcgZmlmbyBlbGVtZW50ICovCitzdHJ1Y3QgcmVnX2ZpZm9fZWxlbWVudCB7CisJdTY0IGRhdGE7CisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfQUREUkVTU19TSElGVAkJMAorI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX0FERFJFU1NfTUFTSwkJMHg3ZmZmZmYKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9BQ0NFU1NfU0hJRlQJCTIzCisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfQUNDRVNTX01BU0sJCTB4MQorI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX1BGX1NISUZUCQkyNAorI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX1BGX01BU0sJCTB4ZgorI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX1ZGX1NISUZUCQkyOAorI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX1ZGX01BU0sJCTB4ZmYKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9QT1JUX1NISUZUCQkzNgorI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX1BPUlRfTUFTSwkJMHgzCisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfUFJJVklMRUdFX1NISUZUCTM4CisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfUFJJVklMRUdFX01BU0sJCTB4MworI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX1BST1RFQ1RJT05fU0hJRlQJNDAKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9QUk9URUNUSU9OX01BU0sJMHg3CisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfTUFTVEVSX1NISUZUCQk0MworI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX01BU1RFUl9NQVNLCQkweGYKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9FUlJPUl9TSElGVAkJNDcKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9FUlJPUl9NQVNLCQkweDFmCit9OworCisvKiBJR1UgZmlmbyBlbGVtZW50ICovCitzdHJ1Y3QgaWd1X2ZpZm9fZWxlbWVudCB7CisJdTMyIGR3b3JkMDsKKyNkZWZpbmUgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDBfRklEX1NISUZUCQkwCisjZGVmaW5lIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQwX0ZJRF9NQVNLCQkweGZmCisjZGVmaW5lIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQwX0lTX1BGX1NISUZUCQk4CisjZGVmaW5lIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQwX0lTX1BGX01BU0sJCTB4MQorI2RlZmluZSBJR1VfRklGT19FTEVNRU5UX0RXT1JEMF9TT1VSQ0VfU0hJRlQJCTkKKyNkZWZpbmUgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDBfU09VUkNFX01BU0sJCTB4ZgorI2RlZmluZSBJR1VfRklGT19FTEVNRU5UX0RXT1JEMF9FUlJfVFlQRV9TSElGVAkJMTMKKyNkZWZpbmUgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDBfRVJSX1RZUEVfTUFTSwkJMHhmCisjZGVmaW5lIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQwX0NNRF9BRERSX1NISUZUCQkxNworI2RlZmluZSBJR1VfRklGT19FTEVNRU5UX0RXT1JEMF9DTURfQUREUl9NQVNLCQkweDdmZmYKKwl1MzIgZHdvcmQxOworCXUzMiBkd29yZDI7CisjZGVmaW5lIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQxMl9JU19XUl9DTURfU0hJRlQJMAorI2RlZmluZSBJR1VfRklGT19FTEVNRU5UX0RXT1JEMTJfSVNfV1JfQ01EX01BU0sJCTB4MQorI2RlZmluZSBJR1VfRklGT19FTEVNRU5UX0RXT1JEMTJfV1JfREFUQV9TSElGVAkJMQorI2RlZmluZSBJR1VfRklGT19FTEVNRU5UX0RXT1JEMTJfV1JfREFUQV9NQVNLCQkweGZmZmZmZmZmCisJdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IGlndV9maWZvX3dyX2RhdGEgeworCXUzMiBkYXRhOworI2RlZmluZSBJR1VfRklGT19XUl9EQVRBX1BST0RfQ09OU19TSElGVAkJMAorI2RlZmluZSBJR1VfRklGT19XUl9EQVRBX1BST0RfQ09OU19NQVNLCQkJMHhmZmZmZmYKKyNkZWZpbmUgSUdVX0ZJRk9fV1JfREFUQV9VUERBVEVfRkxBR19TSElGVAkJMjQKKyNkZWZpbmUgSUdVX0ZJRk9fV1JfREFUQV9VUERBVEVfRkxBR19NQVNLCQkweDEKKyNkZWZpbmUgSUdVX0ZJRk9fV1JfREFUQV9FTl9ESVNfSU5UX0ZPUl9TQl9TSElGVAkyNQorI2RlZmluZSBJR1VfRklGT19XUl9EQVRBX0VOX0RJU19JTlRfRk9SX1NCX01BU0sJCTB4MworI2RlZmluZSBJR1VfRklGT19XUl9EQVRBX1NFR01FTlRfU0hJRlQJCQkyNworI2RlZmluZSBJR1VfRklGT19XUl9EQVRBX1NFR01FTlRfTUFTSwkJCTB4MQorI2RlZmluZSBJR1VfRklGT19XUl9EQVRBX1RJTUVSX01BU0tfU0hJRlQJCTI4CisjZGVmaW5lIElHVV9GSUZPX1dSX0RBVEFfVElNRVJfTUFTS19NQVNLCQkweDEKKyNkZWZpbmUgSUdVX0ZJRk9fV1JfREFUQV9DTURfVFlQRV9TSElGVAkJCTMxCisjZGVmaW5lIElHVV9GSUZPX1dSX0RBVEFfQ01EX1RZUEVfTUFTSwkJCTB4MQorfTsKKworc3RydWN0IGlndV9maWZvX2NsZWFudXBfd3JfZGF0YSB7CisJdTMyIGRhdGE7CisjZGVmaW5lIElHVV9GSUZPX0NMRUFOVVBfV1JfREFUQV9SRVNFUlZFRF9TSElGVAkJMAorI2RlZmluZSBJR1VfRklGT19DTEVBTlVQX1dSX0RBVEFfUkVTRVJWRURfTUFTSwkJMHg3ZmZmZmZmCisjZGVmaW5lIElHVV9GSUZPX0NMRUFOVVBfV1JfREFUQV9DTEVBTlVQX1ZBTF9TSElGVAkyNworI2RlZmluZSBJR1VfRklGT19DTEVBTlVQX1dSX0RBVEFfQ0xFQU5VUF9WQUxfTUFTSwkweDEKKyNkZWZpbmUgSUdVX0ZJRk9fQ0xFQU5VUF9XUl9EQVRBX0NMRUFOVVBfVFlQRV9TSElGVAkyOAorI2RlZmluZSBJR1VfRklGT19DTEVBTlVQX1dSX0RBVEFfQ0xFQU5VUF9UWVBFX01BU0sJMHg3CisjZGVmaW5lIElHVV9GSUZPX0NMRUFOVVBfV1JfREFUQV9DTURfVFlQRV9TSElGVAkJMzEKKyNkZWZpbmUgSUdVX0ZJRk9fQ0xFQU5VUF9XUl9EQVRBX0NNRF9UWVBFX01BU0sJCTB4MQorfTsKKworLyogUHJvdGVjdGlvbiBvdmVycmlkZSBlbGVtZW50ICovCitzdHJ1Y3QgcHJvdGVjdGlvbl9vdmVycmlkZV9lbGVtZW50IHsKKwl1NjQgZGF0YTsKKyNkZWZpbmUgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX0FERFJFU1NfU0hJRlQJCTAKKyNkZWZpbmUgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX0FERFJFU1NfTUFTSwkJMHg3ZmZmZmYKKyNkZWZpbmUgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX1dJTkRPV19TSVpFX1NISUZUCQkyMworI2RlZmluZSBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfV0lORE9XX1NJWkVfTUFTSwkJMHhmZmZmZmYKKyNkZWZpbmUgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX1JFQURfU0hJRlQJCQk0NworI2RlZmluZSBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfUkVBRF9NQVNLCQkJMHgxCisjZGVmaW5lIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9XUklURV9TSElGVAkJCTQ4CisjZGVmaW5lIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9XUklURV9NQVNLCQkJMHgxCisjZGVmaW5lIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9SRUFEX1BST1RFQ1RJT05fU0hJRlQJNDkKKyNkZWZpbmUgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX1JFQURfUFJPVEVDVElPTl9NQVNLCTB4NworI2RlZmluZSBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfV1JJVEVfUFJPVEVDVElPTl9TSElGVAk1MgorI2RlZmluZSBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfV1JJVEVfUFJPVEVDVElPTl9NQVNLCTB4NworfTsKKworZW51bSBpZ3VfZmlmb19zb3VyY2VzIHsKKwlJR1VfU1JDX1BYUDAsCisJSUdVX1NSQ19QWFAxLAorCUlHVV9TUkNfUFhQMiwKKwlJR1VfU1JDX1BYUDMsCisJSUdVX1NSQ19QWFA0LAorCUlHVV9TUkNfUFhQNSwKKwlJR1VfU1JDX1BYUDYsCisJSUdVX1NSQ19QWFA3LAorCUlHVV9TUkNfQ0FVLAorCUlHVV9TUkNfQVRUTiwKKwlJR1VfU1JDX0dSQworfTsKKworZW51bSBpZ3VfZmlmb19hZGRyX3R5cGVzIHsKKwlJR1VfQUREUl9UWVBFX01TSVhfTUVNLAorCUlHVV9BRERSX1RZUEVfV1JJVEVfUEJBLAorCUlHVV9BRERSX1RZUEVfV1JJVEVfSU5UX0FDSywKKwlJR1VfQUREUl9UWVBFX1dSSVRFX0FUVE5fQklUUywKKwlJR1VfQUREUl9UWVBFX1JFQURfSU5ULAorCUlHVV9BRERSX1RZUEVfV1JJVEVfUFJPRF9VUERBVEUsCisJSUdVX0FERFJfVFlQRV9SRVNFUlZFRAorfTsKKworc3RydWN0IGlndV9maWZvX2FkZHJfZGF0YSB7CisJdTE2IHN0YXJ0X2FkZHI7CisJdTE2IGVuZF9hZGRyOworCWNoYXIgKmRlc2M7CisJY2hhciAqdmZfZGVzYzsKKwllbnVtIGlndV9maWZvX2FkZHJfdHlwZXMgdHlwZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNQVhfTVNHX0xFTgkJCQkxMDI0CisjZGVmaW5lIE1DUF9UUkFDRV9NQVhfTU9EVUxFX0xFTgkJOAorI2RlZmluZSBNQ1BfVFJBQ0VfRk9STUFUX01BWF9QQVJBTVMJCTMKKyNkZWZpbmUgTUNQX1RSQUNFX0ZPUk1BVF9QQVJBTV9XSURUSCBcCisJKE1DUF9UUkFDRV9GT1JNQVRfUDJfU0laRV9TSElGVCAtIE1DUF9UUkFDRV9GT1JNQVRfUDFfU0laRV9TSElGVCkKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9BRERSX0ZBQ1RPUgkJNAorI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX0lTX1BGX1ZGX1ZBTAkJMTI3CisjZGVmaW5lIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9BRERSX0ZBQ1RPUgk0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBCWVRFU19UT19EV09SRFMoYnl0ZXMpCQkJKChieXRlcykgLyBCWVRFU19JTl9EV09SRCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENvbnN0YW50IEFycmF5cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTdGF0dXMgc3RyaW5nIGFycmF5ICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNfc3RhdHVzX3N0cltdID0geworCSJPcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIsCisJIkRlYnVnIGFwcGxpY2F0aW9uIHZlcnNpb24gd2Fzbid0IHNldCIsCisJIlVuc3VwcG9ydGVkIGRlYnVnIGFwcGxpY2F0aW9uIHZlcnNpb24iLAorCSJUaGUgZGVidWcgYmxvY2sgd2Fzbid0IHJlc2V0IHNpbmNlIHRoZSBsYXN0IHJlY29yZGluZyIsCisJIkludmFsaWQgYXJndW1lbnRzIiwKKwkiVGhlIGRlYnVnIG91dHB1dCB3YXMgYWxyZWFkeSBzZXQiLAorCSJJbnZhbGlkIFBDSSBidWZmZXIgc2l6ZSIsCisJIlBDSSBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWQiLAorCSJBIFBDSSBidWZmZXIgd2Fzbid0IGFsbG9jYXRlZCIsCisJIlRvbyBtYW55IGlucHV0cyB3ZXJlIGVuYWJsZWQuIEVuYWJsZWQgbGVzcyBpbnB1dHMsIG9yIHNldCAndW5pZnlJbnB1dHMnIHRvIHRydWUiLAorCSJHUkMvVGltZXN0YW1wIGlucHV0IG92ZXJsYXAgaW4gY3ljbGUgZHdvcmQgMCIsCisJIkNhbm5vdCByZWNvcmQgU3Rvcm0gZGF0YSBzaW5jZSB0aGUgZW50aXJlIHJlY29yZGluZyBjeWNsZSBpcyB1c2VkIGJ5IEhXIiwKKwkiVGhlIFN0b3JtIHdhcyBhbHJlYWR5IGVuYWJsZWQiLAorCSJUaGUgc3BlY2lmaWVkIFN0b3JtIHdhc24ndCBlbmFibGVkIiwKKwkiVGhlIGJsb2NrIHdhcyBhbHJlYWR5IGVuYWJsZWQiLAorCSJUaGUgc3BlY2lmaWVkIGJsb2NrIHdhc24ndCBlbmFibGVkIiwKKwkiTm8gaW5wdXQgd2FzIGVuYWJsZWQgZm9yIHJlY29yZGluZyIsCisJIkZpbHRlcnMgYW5kIHRyaWdnZXJzIGFyZSBub3QgYWxsb3dlZCB3aGVuIHJlY29yZGluZyBpbiA2NGIgdW5pdHMiLAorCSJUaGUgZmlsdGVyIHdhcyBhbHJlYWR5IGVuYWJsZWQiLAorCSJUaGUgdHJpZ2dlciB3YXMgYWxyZWFkeSBlbmFibGVkIiwKKwkiVGhlIHRyaWdnZXIgd2Fzbid0IGVuYWJsZWQiLAorCSJBIGNvbnN0cmFpbnQgY2FuIGJlIGFkZGVkIG9ubHkgYWZ0ZXIgYSBmaWx0ZXIgd2FzIGVuYWJsZWQgb3IgYSB0cmlnZ2VyIHN0YXRlIHdhcyBhZGRlZCIsCisJIkNhbm5vdCBhZGQgbW9yZSB0aGFuIDMgdHJpZ2dlciBzdGF0ZXMiLAorCSJDYW5ub3QgYWRkIG1vcmUgdGhhbiA0IGNvbnN0cmFpbnRzIHBlciBmaWx0ZXIgb3IgdHJpZ2dlciBzdGF0ZSIsCisJIlRoZSByZWNvcmRpbmcgd2Fzbid0IHN0YXJ0ZWQiLAorCSJBIHRyaWdnZXIgd2FzIGNvbmZpZ3VyZWQsIGJ1dCBpdCBkaWRuJ3QgdHJpZ2dlciIsCisJIk5vIGRhdGEgd2FzIHJlY29yZGVkIiwKKwkiRHVtcCBidWZmZXIgaXMgdG9vIHNtYWxsIiwKKwkiRHVtcGVkIGRhdGEgaXMgbm90IGFsaWduZWQgdG8gY2h1bmtzIiwKKwkiVW5rbm93biBjaGlwIiwKKwkiRmFpbGVkIGFsbG9jYXRpbmcgdmlydHVhbCBtZW1vcnkiLAorCSJUaGUgaW5wdXQgYmxvY2sgaXMgaW4gcmVzZXQiLAorCSJJbnZhbGlkIE1DUCB0cmFjZSBzaWduYXR1cmUgZm91bmQgaW4gTlZSQU0iLAorCSJJbnZhbGlkIGJ1bmRsZSBJRCBmb3VuZCBpbiBOVlJBTSIsCisJIkZhaWxlZCBnZXR0aW5nIE5WUkFNIGltYWdlIiwKKwkiTlZSQU0gaW1hZ2UgaXMgbm90IGR3b3JkLWFsaWduZWQiLAorCSJGYWlsZWQgcmVhZGluZyBmcm9tIE5WUkFNIiwKKwkiSWRsZSBjaGVjayBwYXJzaW5nIGZhaWxlZCIsCisJIk1DUCBUcmFjZSBkYXRhIGlzIGNvcnJ1cHQiLAorCSJEdW1wIGRvZXNuJ3QgY29udGFpbiBtZXRhIGRhdGEgLSBpdCBtdXN0IGJlIHByb3ZpZGVkIGluIGFuIGltYWdlIGZpbGUiLAorCSJGYWlsZWQgdG8gaGFsdCBNQ1AiLAorCSJGYWlsZWQgdG8gcmVzdW1lIE1DUCBhZnRlciBoYWx0IiwKKwkiRE1BRSB0cmFuc2FjdGlvbiBmYWlsZWQiLAorCSJGYWlsZWQgdG8gZW1wdHkgU0VNSSBzeW5jIEZJRk8iLAorCSJJR1UgRklGTyBkYXRhIGlzIGNvcnJ1cHQiLAorCSJNQ1AgZmFpbGVkIHRvIG1hc2sgcGFyaXRpZXMiLAorCSJGVyBBc3NlcnRzIHBhcnNpbmcgZmFpbGVkIiwKKwkiR1JDIEZJRk8gZGF0YSBpcyBjb3JydXB0IiwKKwkiUHJvdGVjdGlvbiBPdmVycmlkZSBkYXRhIGlzIGNvcnJ1cHQiLAorCSJEZWJ1ZyBhcnJheXMgd2VyZSBub3Qgc2V0ICh3aGVuIHVzaW5nIGJpbmFyeSBmaWxlcywgZGJnX3NldF9iaW5fcHRyIG11c3QgYmUgY2FsbGVkKSIsCisJIldoZW4gYSBibG9jayBpcyBmaWx0ZXJlZCwgbm8gb3RoZXIgYmxvY2tzIGNhbiBiZSByZWNvcmRlZCB1bmxlc3MgaW5wdXRzIGFyZSB1bmlmaWVkIChkdWUgdG8gYSBIVyBidWcpIgorfTsKKworLyogSWRsZSBjaGVjayBzZXZlcml0eSBuYW1lcyBhcnJheSAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzX2lkbGVfY2hrX3NldmVyaXR5X3N0cltdID0geworCSJFcnJvciIsCisJIkVycm9yIGlmIG5vIHRyYWZmaWMiLAorCSJXYXJuaW5nIgorfTsKKworLyogTUNQIFRyYWNlIGxldmVsIG5hbWVzIGFycmF5ICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNfbWNwX3RyYWNlX2xldmVsX3N0cltdID0geworCSJFUlJPUiIsCisJIlRSQUNFIiwKKwkiREVCVUciCit9OworCisvKiBQYXJzaW5nIHN0cmluZ3MgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc19hY2Nlc3Nfc3Ryc1tdID0geworCSJyZWFkIiwKKwkid3JpdGUiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNfcHJpdmlsZWdlX3N0cnNbXSA9IHsKKwkiVkYiLAorCSJQREEiLAorCSJIViIsCisJIlVBIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzX3Byb3RlY3Rpb25fc3Ryc1tdID0geworCSIoZGVmYXVsdCkiLAorCSIoZGVmYXVsdCkiLAorCSIoZGVmYXVsdCkiLAorCSIoZGVmYXVsdCkiLAorCSJvdmVycmlkZSBWRiIsCisJIm92ZXJyaWRlIFBEQSIsCisJIm92ZXJyaWRlIEhWIiwKKwkib3ZlcnJpZGUgVUEiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNfbWFzdGVyX3N0cnNbXSA9IHsKKwkiPz8/IiwKKwkicHhwIiwKKwkibWNwIiwKKwkibXNkbSIsCisJInBzZG0iLAorCSJ5c2RtIiwKKwkidXNkbSIsCisJInRzZG0iLAorCSJ4c2RtIiwKKwkiZGJ1IiwKKwkiZG1hZSIsCisJIj8/PyIsCisJIj8/PyIsCisJIj8/PyIsCisJIj8/PyIsCisJIj8/PyIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc19yZWdfZmlmb19lcnJvcl9zdHJzW10gPSB7CisJImdyYyB0aW1lb3V0IiwKKwkiYWRkcmVzcyBkb2Vzbid0IGJlbG9uZyB0byBhbnkgYmxvY2siLAorCSJyZXNlcnZlZCBhZGRyZXNzIGluIGJsb2NrIG9yIHdyaXRlIHRvIHJlYWQtb25seSBhZGRyZXNzIiwKKwkicHJpdmlsZWdlL3Byb3RlY3Rpb24gbWlzbWF0Y2giLAorCSJwYXRoIGlzb2xhdGlvbiBlcnJvciIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc19pZ3VfZmlmb19zb3VyY2Vfc3Ryc1tdID0geworCSJUU1RPUk0iLAorCSJNU1RPUk0iLAorCSJVU1RPUk0iLAorCSJYU1RPUk0iLAorCSJZU1RPUk0iLAorCSJQU1RPUk0iLAorCSJQQ0lFIiwKKwkiTklHX1FNX1BCRiIsCisJIkNBVSIsCisJIkFUVE4iLAorCSJHUkMiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzX2lndV9maWZvX2Vycm9yX3N0cnNbXSA9IHsKKwkibm8gZXJyb3IiLAorCSJsZW5ndGggZXJyb3IiLAorCSJmdW5jdGlvbiBkaXNhYmxlZCIsCisJIlZGIHNlbnQgY29tbWFuZCB0byBhdHRuZXRpb24gYWRkcmVzcyIsCisJImhvc3Qgc2VudCBwcm9kIHVwZGF0ZSBjb21tYW5kIiwKKwkicmVhZCBvZiBkdXJpbmcgaW50ZXJydXB0IHJlZ2lzdGVyIHdoaWxlIGluIE1JTUQgbW9kZSIsCisJImFjY2VzcyB0byBQWFAgQkFSIHJlc2VydmVkIGFkZHJlc3MiLAorCSJwcm9kdWNlciB1cGRhdGUgY29tbWFuZCB0byBhdHRlbnRpb24gaW5kZXgiLAorCSJ1bmtub3duIGVycm9yIiwKKwkiU0IgaW5kZXggbm90IHZhbGlkIiwKKwkiU0IgcmVsYXRpdmUgaW5kZXggYW5kIEZJRCBub3QgZm91bmQiLAorCSJGSUQgbm90IG1hdGNoIiwKKwkiY29tbWFuZCB3aXRoIGVycm9yIGZsYWcgYXNzZXJ0ZWQgKFBDSSBlcnJvciBvciBDQVUgZGlzY2FyZCkiLAorCSJWRiBzZW50IGNsZWFudXAgYW5kIFJGIGNsZWFudXAgaXMgZGlzYWJsZWQiLAorCSJjbGVhbnVwIGNvbW1hbmQgb24gdHlwZSBiaWdnZXIgdGhhbiA0IgorfTsKKworLyogSUdVIEZJRk8gYWRkcmVzcyBkYXRhICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGlndV9maWZvX2FkZHJfZGF0YSBzX2lndV9maWZvX2FkZHJfZGF0YVtdID0geworCXsweDAsIDB4MTAxLCAiTVNJLVggTWVtb3J5IiwgTlVMTCwgSUdVX0FERFJfVFlQRV9NU0lYX01FTX0sCisJezB4MTAyLCAweDFmZiwgInJlc2VydmVkIiwgTlVMTCwgSUdVX0FERFJfVFlQRV9SRVNFUlZFRH0sCisJezB4MjAwLCAweDIwMCwgIldyaXRlIFBCQVswOjYzXSIsIE5VTEwsIElHVV9BRERSX1RZUEVfV1JJVEVfUEJBfSwKKwl7MHgyMDEsIDB4MjAxLCAiV3JpdGUgUEJBWzY0OjEyN10iLCAicmVzZXJ2ZWQiLAorCSBJR1VfQUREUl9UWVBFX1dSSVRFX1BCQX0sCisJezB4MjAyLCAweDIwMiwgIldyaXRlIFBCQVsxMjhdIiwgInJlc2VydmVkIiwgSUdVX0FERFJfVFlQRV9XUklURV9QQkF9LAorCXsweDIwMywgMHgzZmYsICJyZXNlcnZlZCIsIE5VTEwsIElHVV9BRERSX1RZUEVfUkVTRVJWRUR9LAorCXsweDQwMCwgMHg1ZWYsICJXcml0ZSBpbnRlcnJ1cHQgYWNrbm93bGVkZ21lbnQiLCBOVUxMLAorCSBJR1VfQUREUl9UWVBFX1dSSVRFX0lOVF9BQ0t9LAorCXsweDVmMCwgMHg1ZjAsICJBdHRlbnRpb24gYml0cyB1cGRhdGUiLCBOVUxMLAorCSBJR1VfQUREUl9UWVBFX1dSSVRFX0FUVE5fQklUU30sCisJezB4NWYxLCAweDVmMSwgIkF0dGVudGlvbiBiaXRzIHNldCIsIE5VTEwsCisJIElHVV9BRERSX1RZUEVfV1JJVEVfQVRUTl9CSVRTfSwKKwl7MHg1ZjIsIDB4NWYyLCAiQXR0ZW50aW9uIGJpdHMgY2xlYXIiLCBOVUxMLAorCSBJR1VfQUREUl9UWVBFX1dSSVRFX0FUVE5fQklUU30sCisJezB4NWYzLCAweDVmMywgIlJlYWQgaW50ZXJydXB0IDA6NjMgd2l0aCBtYXNrIiwgTlVMTCwKKwkgSUdVX0FERFJfVFlQRV9SRUFEX0lOVH0sCisJezB4NWY0LCAweDVmNCwgIlJlYWQgaW50ZXJydXB0IDA6MzEgd2l0aCBtYXNrIiwgTlVMTCwKKwkgSUdVX0FERFJfVFlQRV9SRUFEX0lOVH0sCisJezB4NWY1LCAweDVmNSwgIlJlYWQgaW50ZXJydXB0IDMyOjYzIHdpdGggbWFzayIsIE5VTEwsCisJIElHVV9BRERSX1RZUEVfUkVBRF9JTlR9LAorCXsweDVmNiwgMHg1ZjYsICJSZWFkIGludGVycnVwdCAwOjYzIHdpdGhvdXQgbWFzayIsIE5VTEwsCisJIElHVV9BRERSX1RZUEVfUkVBRF9JTlR9LAorCXsweDVmNywgMHg1ZmYsICJyZXNlcnZlZCIsIE5VTEwsIElHVV9BRERSX1RZUEVfUkVTRVJWRUR9LAorCXsweDYwMCwgMHg3ZmYsICJQcm9kdWNlciB1cGRhdGUiLCBOVUxMLCBJR1VfQUREUl9UWVBFX1dSSVRFX1BST0RfVVBEQVRFfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNQ1AgVHJhY2UgbWV0YSBkYXRhIC0gdXNlZCBpbiBjYXNlIHRoZSBkdW1wIGRvZXNuJ3QgY29udGFpbiB0aGUgbWV0YSBkYXRhCisgKiAoZS5nLiBkdWUgdG8gbm8gTlZSQU0gYWNjZXNzKS4KKyAqLworc3RhdGljIHN0cnVjdCBkYmdfYXJyYXkgc19tY3BfdHJhY2VfbWV0YSA9IHsgTlVMTCwgMCB9OworCisvKiBUZW1wb3JhcnkgYnVmZmVyLCB1c2VkIGZvciBwcmludCBzaXplIGNhbGN1bGF0aW9ucyAqLworc3RhdGljIGNoYXIgc190ZW1wX2J1ZltNQVhfTVNHX0xFTl07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQdWJsaWMgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX3VzZXJfc2V0X2Jpbl9wdHIoY29uc3QgdTggKiBjb25zdCBiaW5fcHRyKQoreworCS8qIENvbnZlcnQgYmluYXJ5IGRhdGEgdG8gZGVidWcgYXJyYXlzICovCisJdTMyIG51bV9vZl9idWZmZXJzID0gKih1MzIgKiliaW5fcHRyOworCXN0cnVjdCBiaW5fYnVmZmVyX2hkciAqYnVmX2FycmF5OworCXU4IGJ1Zl9pZDsKKworCWJ1Zl9hcnJheSA9IChzdHJ1Y3QgYmluX2J1ZmZlcl9oZHIgKikoKHUzMiAqKWJpbl9wdHIgKyAxKTsKKworCWZvciAoYnVmX2lkID0gMDsgYnVmX2lkIDwgbnVtX29mX2J1ZmZlcnM7IGJ1Zl9pZCsrKSB7CisJCXNfZGJnX2FycmF5c1tidWZfaWRdLnB0ciA9CisJCSAgICAodTMyICopKGJpbl9wdHIgKyBidWZfYXJyYXlbYnVmX2lkXS5vZmZzZXQpOworCQlzX2RiZ19hcnJheXNbYnVmX2lkXS5zaXplX2luX2R3b3JkcyA9CisJCSAgICBCWVRFU19UT19EV09SRFMoYnVmX2FycmF5W2J1Zl9pZF0ubGVuZ3RoKTsKKwl9CisKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworc3RhdGljIHUzMiBxZWRfY3ljbGljX2FkZCh1MzIgYSwgdTMyIGIsIHUzMiBzaXplKQoreworCXJldHVybiAoYSArIGIpICUgc2l6ZTsKK30KKworc3RhdGljIHUzMiBxZWRfY3ljbGljX3N1Yih1MzIgYSwgdTMyIGIsIHUzMiBzaXplKQoreworCXJldHVybiAoc2l6ZSArIGEgLSBiKSAlIHNpemU7Cit9CisKKy8qIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHNwZWNpZmllZCBjeWNsaWMgYnVmZmVyICh1cCB0byA0CisgKiBieXRlcykgYW5kIHJldHVybnMgdGhlbSBhcyBhIGR3b3JkIHZhbHVlLiB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBvZmZzZXQgaXMKKyAqIHVwZGF0ZWQuCisgKi8KK3N0YXRpYyB1MzIgcWVkX3JlYWRfZnJvbV9jeWNsaWNfYnVmKHZvaWQgKmJ1ZiwKKwkJCQkgICAgdTMyICpvZmZzZXQsCisJCQkJICAgIHUzMiBidWZfc2l6ZSwgdTggbnVtX2J5dGVzX3RvX3JlYWQpCit7CisJdTggKmJ5dGVzX2J1ZiA9ICh1OCAqKWJ1ZjsKKwl1OCAqdmFsX3B0cjsKKwl1MzIgdmFsID0gMDsKKwl1OCBpOworCisJdmFsX3B0ciA9ICh1OCAqKSZ2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2J5dGVzX3RvX3JlYWQ7IGkrKykgeworCQl2YWxfcHRyW2ldID0gYnl0ZXNfYnVmWypvZmZzZXRdOworCQkqb2Zmc2V0ID0gcWVkX2N5Y2xpY19hZGQoKm9mZnNldCwgMSwgYnVmX3NpemUpOworCX0KKworCXJldHVybiB2YWw7Cit9CisKKy8qIFJlYWRzIGFuZCByZXR1cm5zIHRoZSBuZXh0IGJ5dGUgZnJvbSB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqIFRoZSBzcGVjaWZpZWQgYnVmZmVyIG9mZnNldCBpcyB1cGRhdGVkLgorICovCitzdGF0aWMgdTggcWVkX3JlYWRfYnl0ZV9mcm9tX2J1Zih2b2lkICpidWYsIHUzMiAqb2Zmc2V0KQoreworCXJldHVybiAoKHU4ICopYnVmKVsoKm9mZnNldCkrK107Cit9CisKKy8qIFJlYWRzIGFuZCByZXR1cm5zIHRoZSBuZXh0IGR3b3JkIGZyb20gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKiBUaGUgc3BlY2lmaWVkIGJ1ZmZlciBvZmZzZXQgaXMgdXBkYXRlZC4KKyAqLworc3RhdGljIHUzMiBxZWRfcmVhZF9kd29yZF9mcm9tX2J1Zih2b2lkICpidWYsIHUzMiAqb2Zmc2V0KQoreworCXUzMiBkd29yZF92YWwgPSAqKHUzMiAqKSYoKHU4ICopYnVmKVsqb2Zmc2V0XTsKKworCSpvZmZzZXQgKz0gNDsKKwlyZXR1cm4gZHdvcmRfdmFsOworfQorCisvKiBSZWFkcyB0aGUgbmV4dCBzdHJpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGJ1ZmZlciwgYW5kIGNvcGllcyBpdCB0byB0aGUKKyAqIHNwZWNpZmllZCBwb2ludGVyLiBUaGUgc3BlY2lmaWVkIGJ1ZmZlciBvZmZzZXQgaXMgdXBkYXRlZC4KKyAqLworc3RhdGljIHZvaWQgcWVkX3JlYWRfc3RyX2Zyb21fYnVmKHZvaWQgKmJ1ZiwgdTMyICpvZmZzZXQsIHUzMiBzaXplLCBjaGFyICpkZXN0KQoreworCWNvbnN0IGNoYXIgKnNvdXJjZV9zdHIgPSAmKChjb25zdCBjaGFyICopYnVmKVsqb2Zmc2V0XTsKKworCXN0cm5jcHkoZGVzdCwgc291cmNlX3N0ciwgc2l6ZSk7CisJZGVzdFtzaXplIC0gMV0gPSAnXDAnOworCSpvZmZzZXQgKz0gc2l6ZTsKK30KKworLyogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHNwZWNpZmllZCBvZmZzZXQgKGluIGJ5dGVzKSBvZiB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqIElmIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGluIE5VTEwsIGEgdGVtcG9yYXJ5IGJ1ZmZlciBwb2ludGVyIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgY2hhciAqcWVkX2dldF9idWZfcHRyKHZvaWQgKmJ1ZiwgdTMyIG9mZnNldCkKK3sKKwlyZXR1cm4gYnVmID8gKGNoYXIgKilidWYgKyBvZmZzZXQgOiBzX3RlbXBfYnVmOworfQorCisvKiBSZWFkcyBhIHBhcmFtIGZyb20gdGhlIHNwZWNpZmllZCBidWZmZXIuIFJldHVybnMgdGhlIG51bWJlciBvZiBkd29yZHMgcmVhZC4KKyAqIElmIHRoZSByZXR1cm5lZCBzdHJfcGFyYW0gaXMgTlVMTCwgdGhlIHBhcmFtIGlzIG51bWVyaWMgYW5kIGl0cyB2YWx1ZSBpcworICogcmV0dXJuZWQgaW4gbnVtX3BhcmFtLgorICogT3RoZXJpd2lzZSwgdGhlIHBhcmFtIGlzIGEgc3RyaW5nIGFuZCBpdHMgcG9pbnRlciBpcyByZXR1cm5lZCBpbiBzdHJfcGFyYW0uCisgKi8KK3N0YXRpYyB1MzIgcWVkX3JlYWRfcGFyYW0odTMyICpkdW1wX2J1ZiwKKwkJCSAgY29uc3QgY2hhciAqKnBhcmFtX25hbWUsCisJCQkgIGNvbnN0IGNoYXIgKipwYXJhbV9zdHJfdmFsLCB1MzIgKnBhcmFtX251bV92YWwpCit7CisJY2hhciAqY2hhcl9idWYgPSAoY2hhciAqKWR1bXBfYnVmOworCXUzMiBvZmZzZXQgPSAwOyAvKiBJbiBieXRlcyAqLworCisJLyogRXh0cmFjdCBwYXJhbSBuYW1lICovCisJKnBhcmFtX25hbWUgPSBjaGFyX2J1ZjsKKwlvZmZzZXQgKz0gc3RybGVuKCpwYXJhbV9uYW1lKSArIDE7CisKKwkvKiBDaGVjayBwYXJhbSB0eXBlICovCisJaWYgKCooY2hhcl9idWYgKyBvZmZzZXQrKykpIHsKKwkJLyogU3RyaW5nIHBhcmFtICovCisJCSpwYXJhbV9zdHJfdmFsID0gY2hhcl9idWYgKyBvZmZzZXQ7CisJCW9mZnNldCArPSBzdHJsZW4oKnBhcmFtX3N0cl92YWwpICsgMTsKKwkJaWYgKG9mZnNldCAmIDB4MykKKwkJCW9mZnNldCArPSAoNCAtIChvZmZzZXQgJiAweDMpKTsKKwl9IGVsc2UgeworCQkvKiBOdW1lcmljIHBhcmFtICovCisJCSpwYXJhbV9zdHJfdmFsID0gTlVMTDsKKwkJaWYgKG9mZnNldCAmIDB4MykKKwkJCW9mZnNldCArPSAoNCAtIChvZmZzZXQgJiAweDMpKTsKKwkJKnBhcmFtX251bV92YWwgPSAqKHUzMiAqKShjaGFyX2J1ZiArIG9mZnNldCk7CisJCW9mZnNldCArPSA0OworCX0KKworCXJldHVybiBvZmZzZXQgLyA0OworfQorCisvKiBSZWFkcyBhIHNlY3Rpb24gaGVhZGVyIGZyb20gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZHdvcmRzIHJlYWQuCisgKi8KK3N0YXRpYyB1MzIgcWVkX3JlYWRfc2VjdGlvbl9oZHIodTMyICpkdW1wX2J1ZiwKKwkJCQljb25zdCBjaGFyICoqc2VjdGlvbl9uYW1lLAorCQkJCXUzMiAqbnVtX3NlY3Rpb25fcGFyYW1zKQoreworCWNvbnN0IGNoYXIgKnBhcmFtX3N0cl92YWw7CisKKwlyZXR1cm4gcWVkX3JlYWRfcGFyYW0oZHVtcF9idWYsCisJCQkgICAgICBzZWN0aW9uX25hbWUsICZwYXJhbV9zdHJfdmFsLCBudW1fc2VjdGlvbl9wYXJhbXMpOworfQorCisvKiBSZWFkcyBzZWN0aW9uIHBhcmFtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGFuZCBwcmludHMgdGhlbSB0byB0aGUgcmVzdWx0cworICogYnVmZmVyLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZHdvcmRzIHJlYWQuCisgKi8KK3N0YXRpYyB1MzIgcWVkX3ByaW50X3NlY3Rpb25fcGFyYW1zKHUzMiAqZHVtcF9idWYsCisJCQkJICAgIHUzMiBudW1fc2VjdGlvbl9wYXJhbXMsCisJCQkJICAgIGNoYXIgKnJlc3VsdHNfYnVmLCB1MzIgKm51bV9jaGFyc19wcmludGVkKQoreworCXUzMiBpLCBkdW1wX29mZnNldCA9IDAsIHJlc3VsdHNfb2Zmc2V0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fc2VjdGlvbl9wYXJhbXM7IGkrKykgeworCQljb25zdCBjaGFyICpwYXJhbV9uYW1lOworCQljb25zdCBjaGFyICpwYXJhbV9zdHJfdmFsOworCQl1MzIgcGFyYW1fbnVtX3ZhbCA9IDA7CisKKwkJZHVtcF9vZmZzZXQgKz0gcWVkX3JlYWRfcGFyYW0oZHVtcF9idWYgKyBkdW1wX29mZnNldCwKKwkJCQkJICAgICAgJnBhcmFtX25hbWUsCisJCQkJCSAgICAgICZwYXJhbV9zdHJfdmFsLCAmcGFyYW1fbnVtX3ZhbCk7CisJCWlmIChwYXJhbV9zdHJfdmFsKQorCQkJLyogU3RyaW5nIHBhcmFtICovCisJCQlyZXN1bHRzX29mZnNldCArPQorCQkJCXNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkJCXJlc3VsdHNfb2Zmc2V0KSwKKwkJCQkJIiVzOiAlc1xuIiwgcGFyYW1fbmFtZSwgcGFyYW1fc3RyX3ZhbCk7CisJCWVsc2UgaWYgKHN0cmNtcChwYXJhbV9uYW1lLCAiZnctdGltZXN0YW1wIikpCisJCQkvKiBOdW1lcmljIHBhcmFtICovCisJCQlyZXN1bHRzX29mZnNldCArPQorCQkJCXNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkJCXJlc3VsdHNfb2Zmc2V0KSwKKwkJCQkJIiVzOiAlZFxuIiwgcGFyYW1fbmFtZSwgcGFyYW1fbnVtX3ZhbCk7CisJfQorCisJcmVzdWx0c19vZmZzZXQgKz0KKwkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsIHJlc3VsdHNfb2Zmc2V0KSwgIlxuIik7CisJKm51bV9jaGFyc19wcmludGVkID0gcmVzdWx0c19vZmZzZXQ7CisJcmV0dXJuIGR1bXBfb2Zmc2V0OworfQorCitjb25zdCBjaGFyICpxZWRfZGJnX2dldF9zdGF0dXNfc3RyKGVudW0gZGJnX3N0YXR1cyBzdGF0dXMpCit7CisJcmV0dXJuIChzdGF0dXMgPAorCQlNQVhfREJHX1NUQVRVUykgPyBzX3N0YXR1c19zdHJbc3RhdHVzXSA6ICJJbnZhbGlkIGRlYnVnIHN0YXR1cyI7Cit9CisKKy8qIFBhcnNlcyB0aGUgaWRsZSBjaGVjayBydWxlcyBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KKyAqIEluIGNhc2Ugb2YgcGFyc2luZyBlcnJvciwgcmV0dXJucyAwLgorICovCitzdGF0aWMgdTMyIHFlZF9wYXJzZV9pZGxlX2Noa19kdW1wX3J1bGVzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgdTMyICpkdW1wX2J1ZiwKKwkJCQkJIHUzMiAqZHVtcF9idWZfZW5kLAorCQkJCQkgdTMyIG51bV9ydWxlcywKKwkJCQkJIGJvb2wgcHJpbnRfZndfaWRsZV9jaGssCisJCQkJCSBjaGFyICpyZXN1bHRzX2J1ZiwKKwkJCQkJIHUzMiAqbnVtX2Vycm9ycywgdTMyICpudW1fd2FybmluZ3MpCit7CisJdTMyIHJ1bGVfaWR4LCByZXN1bHRzX29mZnNldCA9IDA7IC8qIE9mZnNldCBpbiByZXN1bHRzX2J1ZiBpbiBieXRlcyAqLworCXUxNiBpLCBqOworCisJKm51bV9lcnJvcnMgPSAwOworCSpudW1fd2FybmluZ3MgPSAwOworCisJLyogR28gb3ZlciBkdW1wZWQgcmVzdWx0cyAqLworCWZvciAocnVsZV9pZHggPSAwOyBydWxlX2lkeCA8IG51bV9ydWxlcyAmJiBkdW1wX2J1ZiA8IGR1bXBfYnVmX2VuZDsKKwkgICAgIHJ1bGVfaWR4KyspIHsKKwkJY29uc3Qgc3RydWN0IGRiZ19pZGxlX2Noa19ydWxlX3BhcnNpbmdfZGF0YSAqcnVsZV9wYXJzaW5nX2RhdGE7CisJCXN0cnVjdCBkYmdfaWRsZV9jaGtfcmVzdWx0X2hkciAqaGRyOworCQljb25zdCBjaGFyICpwYXJzaW5nX3N0cjsKKwkJdTMyIHBhcnNpbmdfc3RyX29mZnNldDsKKwkJY29uc3QgY2hhciAqbHNpX21zZzsKKwkJdTggY3Vycl9yZWdfaWQgPSAwOworCQlib29sIGhhc19md19tc2c7CisKKwkJaGRyID0gKHN0cnVjdCBkYmdfaWRsZV9jaGtfcmVzdWx0X2hkciAqKWR1bXBfYnVmOworCQlydWxlX3BhcnNpbmdfZGF0YSA9CisJCQkoY29uc3Qgc3RydWN0IGRiZ19pZGxlX2Noa19ydWxlX3BhcnNpbmdfZGF0YSAqKQorCQkJJnNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19JRExFX0NIS19QQVJTSU5HX0RBVEFdLgorCQkJcHRyW2hkci0+cnVsZV9pZF07CisJCXBhcnNpbmdfc3RyX29mZnNldCA9CisJCQlHRVRfRklFTEQocnVsZV9wYXJzaW5nX2RhdGEtPmRhdGEsCisJCQkJICBEQkdfSURMRV9DSEtfUlVMRV9QQVJTSU5HX0RBVEFfU1RSX09GRlNFVCk7CisJCWhhc19md19tc2cgPQorCQkJR0VUX0ZJRUxEKHJ1bGVfcGFyc2luZ19kYXRhLT5kYXRhLAorCQkJCURCR19JRExFX0NIS19SVUxFX1BBUlNJTkdfREFUQV9IQVNfRldfTVNHKSA+IDA7CisJCXBhcnNpbmdfc3RyID0gJigoY29uc3QgY2hhciAqKQorCQkJCXNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19QQVJTSU5HX1NUUklOR1NdLnB0cikKKwkJCQlbcGFyc2luZ19zdHJfb2Zmc2V0XTsKKwkJbHNpX21zZyA9IHBhcnNpbmdfc3RyOworCisJCWlmIChoZHItPnNldmVyaXR5ID49IE1BWF9EQkdfSURMRV9DSEtfU0VWRVJJVFlfVFlQRVMpCisJCQlyZXR1cm4gMDsKKworCQkvKiBTa2lwIHJ1bGUgaGVhZGVyICovCisJCWR1bXBfYnVmICs9IChzaXplb2Yoc3RydWN0IGRiZ19pZGxlX2Noa19yZXN1bHRfaGRyKSAvIDQpOworCisJCS8qIFVwZGF0ZSBlcnJvcnMvd2FybmluZ3MgY291bnQgKi8KKwkJaWYgKGhkci0+c2V2ZXJpdHkgPT0gSURMRV9DSEtfU0VWRVJJVFlfRVJST1IgfHwKKwkJICAgIGhkci0+c2V2ZXJpdHkgPT0gSURMRV9DSEtfU0VWRVJJVFlfRVJST1JfTk9fVFJBRkZJQykKKwkJCSgqbnVtX2Vycm9ycykrKzsKKwkJZWxzZQorCQkJKCpudW1fd2FybmluZ3MpKys7CisKKwkJLyogUHJpbnQgcnVsZSBzZXZlcml0eSAqLworCQlyZXN1bHRzX29mZnNldCArPQorCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCSAgICByZXN1bHRzX29mZnNldCksICIlczogIiwKKwkJCSAgICBzX2lkbGVfY2hrX3NldmVyaXR5X3N0cltoZHItPnNldmVyaXR5XSk7CisKKwkJLyogUHJpbnQgcnVsZSBtZXNzYWdlICovCisJCWlmIChoYXNfZndfbXNnKQorCQkJcGFyc2luZ19zdHIgKz0gc3RybGVuKHBhcnNpbmdfc3RyKSArIDE7CisJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwgIiVzLiIsCisJCQkgICAgaGFzX2Z3X21zZyAmJgorCQkJICAgIHByaW50X2Z3X2lkbGVfY2hrID8gcGFyc2luZ19zdHIgOiBsc2lfbXNnKTsKKwkJcGFyc2luZ19zdHIgKz0gc3RybGVuKHBhcnNpbmdfc3RyKSArIDE7CisKKwkJLyogUHJpbnQgcmVnaXN0ZXIgdmFsdWVzICovCisJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwgIiBSZWdpc3RlcnM6Iik7CisJCWZvciAoaSA9IDA7CisJCSAgICAgaSA8IGhkci0+bnVtX2R1bXBlZF9jb25kX3JlZ3MgKyBoZHItPm51bV9kdW1wZWRfaW5mb19yZWdzOworCQkgICAgIGkrKykgeworCQkJc3RydWN0IGRiZ19pZGxlX2Noa19yZXN1bHRfcmVnX2hkciAqcmVnX2hkcgorCQkJICAgID0gKHN0cnVjdCBkYmdfaWRsZV9jaGtfcmVzdWx0X3JlZ19oZHIgKikKKwkJCSAgICBkdW1wX2J1ZjsKKwkJCWJvb2wgaXNfbWVtID0KKwkJCQlHRVRfRklFTEQocmVnX2hkci0+ZGF0YSwKKwkJCQkJICBEQkdfSURMRV9DSEtfUkVTVUxUX1JFR19IRFJfSVNfTUVNKTsKKwkJCXU4IHJlZ19pZCA9CisJCQkJR0VUX0ZJRUxEKHJlZ19oZHItPmRhdGEsCisJCQkJCSAgREJHX0lETEVfQ0hLX1JFU1VMVF9SRUdfSERSX1JFR19JRCk7CisKKwkJCS8qIFNraXAgcmVnIGhlYWRlciAqLworCQkJZHVtcF9idWYgKz0KKwkJCSAgICAoc2l6ZW9mKHN0cnVjdCBkYmdfaWRsZV9jaGtfcmVzdWx0X3JlZ19oZHIpIC8gNCk7CisKKwkJCS8qIFNraXAgcmVnaXN0ZXIgbmFtZXMgdW50aWwgdGhlIHJlcXVpcmVkIHJlZ19pZCBpcworCQkJICogcmVhY2hlZC4KKwkJCSAqLworCQkJZm9yICg7IHJlZ19pZCA+IGN1cnJfcmVnX2lkOworCQkJICAgICBjdXJyX3JlZ19pZCsrLAorCQkJICAgICBwYXJzaW5nX3N0ciArPSBzdHJsZW4ocGFyc2luZ19zdHIpICsgMSk7CisKKwkJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLCAiICVzIiwKKwkJCQkgICAgcGFyc2luZ19zdHIpOworCQkJaWYgKGkgPCBoZHItPm51bV9kdW1wZWRfY29uZF9yZWdzICYmIGlzX21lbSkKKwkJCQlyZXN1bHRzX29mZnNldCArPQorCQkJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLAorCQkJCQkgICAgIlslZF0iLCBoZHItPm1lbV9lbnRyeV9pZCArCisJCQkJCSAgICByZWdfaGRyLT5zdGFydF9lbnRyeSk7CisJCQlyZXN1bHRzX29mZnNldCArPQorCQkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwgIj0iKTsKKwkJCWZvciAoaiA9IDA7IGogPCByZWdfaGRyLT5zaXplOyBqKyssIGR1bXBfYnVmKyspIHsKKwkJCQlyZXN1bHRzX29mZnNldCArPQorCQkJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLAorCQkJCQkgICAgIjB4JXgiLCAqZHVtcF9idWYpOworCQkJCWlmIChqIDwgcmVnX2hkci0+c2l6ZSAtIDEpCisJCQkJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCQkJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cgorCQkJCQkJICAgIChyZXN1bHRzX2J1ZiwKKwkJCQkJCSAgICAgcmVzdWx0c19vZmZzZXQpLCAiLCIpOworCQkJfQorCQl9CisKKwkJcmVzdWx0c19vZmZzZXQgKz0KKwkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLCByZXN1bHRzX29mZnNldCksICJcbiIpOworCX0KKworCS8qIENoZWNrIGlmIGVuZCBvZiBkdW1wIGJ1ZmZlciB3YXMgZXhjZWVkZWQgKi8KKwlpZiAoZHVtcF9idWYgPiBkdW1wX2J1Zl9lbmQpCisJCXJldHVybiAwOworCXJldHVybiByZXN1bHRzX29mZnNldDsKK30KKworLyogUGFyc2VzIGFuIGlkbGUgY2hlY2sgZHVtcCBidWZmZXIuCisgKiBJZiByZXN1bHRfYnVmIGlzIG5vdCBOVUxMLCB0aGUgaWRsZSBjaGVjayByZXN1bHRzIGFyZSBwcmludGVkIHRvIGl0LgorICogSW4gYW55IGNhc2UsIHRoZSByZXF1aXJlZCByZXN1bHRzIGJ1ZmZlciBzaXplIGlzIGFzc2lnbmVkIHRvCisgKiBwYXJzZWRfcmVzdWx0c19ieXRlcy4KKyAqIFRoZSBwYXJzaW5nIHN0YXR1cyBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGVudW0gZGJnX3N0YXR1cyBxZWRfcGFyc2VfaWRsZV9jaGtfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJCSAgICAgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSAgICAgICBjaGFyICpyZXN1bHRzX2J1ZiwKKwkJCQkJICAgICAgIHUzMiAqcGFyc2VkX3Jlc3VsdHNfYnl0ZXMsCisJCQkJCSAgICAgICB1MzIgKm51bV9lcnJvcnMsCisJCQkJCSAgICAgICB1MzIgKm51bV93YXJuaW5ncykKK3sKKwljb25zdCBjaGFyICpzZWN0aW9uX25hbWUsICpwYXJhbV9uYW1lLCAqcGFyYW1fc3RyX3ZhbDsKKwl1MzIgKmR1bXBfYnVmX2VuZCA9IGR1bXBfYnVmICsgbnVtX2R1bXBlZF9kd29yZHM7CisJdTMyIG51bV9zZWN0aW9uX3BhcmFtcyA9IDAsIG51bV9ydWxlczsKKwl1MzIgcmVzdWx0c19vZmZzZXQgPSAwOwkvKiBPZmZzZXQgaW4gcmVzdWx0c19idWYgaW4gYnl0ZXMgKi8KKworCSpwYXJzZWRfcmVzdWx0c19ieXRlcyA9IDA7CisJKm51bV9lcnJvcnMgPSAwOworCSpudW1fd2FybmluZ3MgPSAwOworCWlmICghc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX1BBUlNJTkdfU1RSSU5HU10ucHRyIHx8CisJICAgICFzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfSURMRV9DSEtfUEFSU0lOR19EQVRBXS5wdHIpCisJCXJldHVybiBEQkdfU1RBVFVTX0RCR19BUlJBWV9OT1RfU0VUOworCisJLyogUmVhZCBnbG9iYWxfcGFyYW1zIHNlY3Rpb24gKi8KKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9zZWN0aW9uX2hkcihkdW1wX2J1ZiwKKwkJCQkJICZzZWN0aW9uX25hbWUsICZudW1fc2VjdGlvbl9wYXJhbXMpOworCWlmIChzdHJjbXAoc2VjdGlvbl9uYW1lLCAiZ2xvYmFsX3BhcmFtcyIpKQorCQlyZXR1cm4gREJHX1NUQVRVU19JRExFX0NIS19QQVJTRV9GQUlMRUQ7CisKKwkvKiBQcmludCBnbG9iYWwgcGFyYW1zICovCisJZHVtcF9idWYgKz0gcWVkX3ByaW50X3NlY3Rpb25fcGFyYW1zKGR1bXBfYnVmLAorCQkJCQkgICAgIG51bV9zZWN0aW9uX3BhcmFtcywKKwkJCQkJICAgICByZXN1bHRzX2J1ZiwgJnJlc3VsdHNfb2Zmc2V0KTsKKworCS8qIFJlYWQgaWRsZV9jaGsgc2VjdGlvbiAqLworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3NlY3Rpb25faGRyKGR1bXBfYnVmLAorCQkJCQkgJnNlY3Rpb25fbmFtZSwgJm51bV9zZWN0aW9uX3BhcmFtcyk7CisJaWYgKHN0cmNtcChzZWN0aW9uX25hbWUsICJpZGxlX2NoayIpIHx8IG51bV9zZWN0aW9uX3BhcmFtcyAhPSAxKQorCQlyZXR1cm4gREJHX1NUQVRVU19JRExFX0NIS19QQVJTRV9GQUlMRUQ7CisKKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9wYXJhbShkdW1wX2J1ZiwKKwkJCQkgICAmcGFyYW1fbmFtZSwgJnBhcmFtX3N0cl92YWwsICZudW1fcnVsZXMpOworCWlmIChzdHJjbXAocGFyYW1fbmFtZSwgIm51bV9ydWxlcyIpICE9IDApCisJCXJldHVybiBEQkdfU1RBVFVTX0lETEVfQ0hLX1BBUlNFX0ZBSUxFRDsKKworCWlmIChudW1fcnVsZXMpIHsKKwkJdTMyIHJ1bGVzX3ByaW50X3NpemU7CisKKwkJLyogUHJpbnQgRlcgb3V0cHV0ICovCisJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwKKwkJCSAgICAiRldfSURMRV9DSEVDSzpcbiIpOworCQlydWxlc19wcmludF9zaXplID0KKwkJCXFlZF9wYXJzZV9pZGxlX2Noa19kdW1wX3J1bGVzKHBfaHdmbiwgZHVtcF9idWYsCisJCQkJCQkgICAgICBkdW1wX2J1Zl9lbmQsIG51bV9ydWxlcywKKwkJCQkJCSAgICAgIHRydWUsCisJCQkJCQkgICAgICByZXN1bHRzX2J1ZiA/CisJCQkJCQkgICAgICByZXN1bHRzX2J1ZiArCisJCQkJCQkgICAgICByZXN1bHRzX29mZnNldCA6IE5VTEwsCisJCQkJCQkgICAgICBudW1fZXJyb3JzLCBudW1fd2FybmluZ3MpOworCQlyZXN1bHRzX29mZnNldCArPSBydWxlc19wcmludF9zaXplOworCQlpZiAocnVsZXNfcHJpbnRfc2l6ZSA9PSAwKQorCQkJcmV0dXJuIERCR19TVEFUVVNfSURMRV9DSEtfUEFSU0VfRkFJTEVEOworCisJCS8qIFByaW50IExTSSBvdXRwdXQgKi8KKwkJcmVzdWx0c19vZmZzZXQgKz0KKwkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLAorCQkJICAgICJcbkxTSV9JRExFX0NIRUNLOlxuIik7CisJCXJ1bGVzX3ByaW50X3NpemUgPQorCQkJcWVkX3BhcnNlX2lkbGVfY2hrX2R1bXBfcnVsZXMocF9od2ZuLCBkdW1wX2J1ZiwKKwkJCQkJCSAgICAgIGR1bXBfYnVmX2VuZCwgbnVtX3J1bGVzLAorCQkJCQkJICAgICAgZmFsc2UsCisJCQkJCQkgICAgICByZXN1bHRzX2J1ZiA/CisJCQkJCQkgICAgICByZXN1bHRzX2J1ZiArCisJCQkJCQkgICAgICByZXN1bHRzX29mZnNldCA6IE5VTEwsCisJCQkJCQkgICAgICBudW1fZXJyb3JzLCBudW1fd2FybmluZ3MpOworCQlyZXN1bHRzX29mZnNldCArPSBydWxlc19wcmludF9zaXplOworCQlpZiAocnVsZXNfcHJpbnRfc2l6ZSA9PSAwKQorCQkJcmV0dXJuIERCR19TVEFUVVNfSURMRV9DSEtfUEFSU0VfRkFJTEVEOworCX0KKworCS8qIFByaW50IGVycm9ycy93YXJuaW5ncyBjb3VudCAqLworCWlmICgqbnVtX2Vycm9ycykgeworCQlyZXN1bHRzX29mZnNldCArPQorCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCSAgICByZXN1bHRzX29mZnNldCksCisJCQkgICAgIlxuSWRsZSBDaGVjayBmYWlsZWQhISEgKHdpdGggJWQgZXJyb3JzIGFuZCAlZCB3YXJuaW5ncylcbiIsCisJCQkgICAgKm51bV9lcnJvcnMsICpudW1fd2FybmluZ3MpOworCX0gZWxzZSBpZiAoKm51bV93YXJuaW5ncykgeworCQlyZXN1bHRzX29mZnNldCArPQorCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCSAgICByZXN1bHRzX29mZnNldCksCisJCQkgICAgIlxuSWRsZSBDaGVjayBjb21wbGV0ZWQgc3VjY2Vzc2Z1bHkgKHdpdGggJWQgd2FybmluZ3MpXG4iLAorCQkJICAgICpudW1fd2FybmluZ3MpOworCX0gZWxzZSB7CisJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwKKwkJCSAgICAiXG5JZGxlIENoZWNrIGNvbXBsZXRlZCBzdWNjZXNzZnVseVxuIik7CisJfQorCisJLyogQWRkIDEgZm9yIHN0cmluZyBOVUxMIHRlcm1pbmF0aW9uICovCisJKnBhcnNlZF9yZXN1bHRzX2J5dGVzID0gcmVzdWx0c19vZmZzZXQgKyAxOworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2dldF9pZGxlX2Noa19yZXN1bHRzX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICB1MzIgKmR1bXBfYnVmLAorCQkJCQkJICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCQkgIHUzMiAqcmVzdWx0c19idWZfc2l6ZSkKK3sKKwl1MzIgbnVtX2Vycm9ycywgbnVtX3dhcm5pbmdzOworCisJcmV0dXJuIHFlZF9wYXJzZV9pZGxlX2Noa19kdW1wKHBfaHdmbiwKKwkJCQkgICAgICAgZHVtcF9idWYsCisJCQkJICAgICAgIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCSAgICAgICBOVUxMLAorCQkJCSAgICAgICByZXN1bHRzX2J1Zl9zaXplLAorCQkJCSAgICAgICAmbnVtX2Vycm9ycywgJm51bV93YXJuaW5ncyk7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfcHJpbnRfaWRsZV9jaGtfcmVzdWx0cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgICBjaGFyICpyZXN1bHRzX2J1ZiwKKwkJCQkJICAgdTMyICpudW1fZXJyb3JzLCB1MzIgKm51bV93YXJuaW5ncykKK3sKKwl1MzIgcGFyc2VkX2J1Zl9zaXplOworCisJcmV0dXJuIHFlZF9wYXJzZV9pZGxlX2Noa19kdW1wKHBfaHdmbiwKKwkJCQkgICAgICAgZHVtcF9idWYsCisJCQkJICAgICAgIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCSAgICAgICByZXN1bHRzX2J1ZiwKKwkJCQkgICAgICAgJnBhcnNlZF9idWZfc2l6ZSwKKwkJCQkgICAgICAgbnVtX2Vycm9ycywgbnVtX3dhcm5pbmdzKTsKK30KKworLyogRnJlZXMgdGhlIHNwZWNpZmllZCBNQ1AgVHJhY2UgbWV0YSBkYXRhICovCitzdGF0aWMgdm9pZCBxZWRfbWNwX3RyYWNlX2ZyZWVfbWV0YShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgc3RydWN0IG1jcF90cmFjZV9tZXRhICptZXRhKQoreworCXUzMiBpOworCisJLyogUmVsZWFzZSBtb2R1bGVzICovCisJaWYgKG1ldGEtPm1vZHVsZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IG1ldGEtPm1vZHVsZXNfbnVtOyBpKyspCisJCQlrZnJlZShtZXRhLT5tb2R1bGVzW2ldKTsKKwkJa2ZyZWUobWV0YS0+bW9kdWxlcyk7CisJfQorCisJLyogUmVsZWFzZSBmb3JtYXRzICovCisJaWYgKG1ldGEtPmZvcm1hdHMpIHsKKwkJZm9yIChpID0gMDsgaSA8IG1ldGEtPmZvcm1hdHNfbnVtOyBpKyspCisJCQlrZnJlZShtZXRhLT5mb3JtYXRzW2ldLmZvcm1hdF9zdHIpOworCQlrZnJlZShtZXRhLT5mb3JtYXRzKTsKKwl9Cit9CisKKy8qIEFsbG9jYXRlcyBhbmQgZmlsbHMgTUNQIFRyYWNlIG1ldGEgZGF0YSBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIG1ldGEgZGF0YQorICogZHVtcCBidWZmZXIuCisgKiBSZXR1cm5zIGRlYnVnIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgZW51bSBkYmdfc3RhdHVzIHFlZF9tY3BfdHJhY2VfYWxsb2NfbWV0YShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCWNvbnN0IHUzMiAqbWV0YV9idWYsCisJCQkJCQlzdHJ1Y3QgbWNwX3RyYWNlX21ldGEgKm1ldGEpCit7CisJdTggKm1ldGFfYnVmX2J5dGVzID0gKHU4ICopbWV0YV9idWY7CisJdTMyIG9mZnNldCA9IDAsIHNpZ25hdHVyZSwgaTsKKworCW1lbXNldChtZXRhLCAwLCBzaXplb2YoKm1ldGEpKTsKKworCS8qIFJlYWQgZmlyc3Qgc2lnbmF0dXJlICovCisJc2lnbmF0dXJlID0gcWVkX3JlYWRfZHdvcmRfZnJvbV9idWYobWV0YV9idWZfYnl0ZXMsICZvZmZzZXQpOworCWlmIChzaWduYXR1cmUgIT0gTUNQX1RSQUNFX01FVEFfSU1BR0VfU0lHTkFUVVJFKQorCQlyZXR1cm4gREJHX1NUQVRVU19JTlZBTElEX1RSQUNFX1NJR05BVFVSRTsKKworCS8qIFJlYWQgbnVtYmVyIG9mIG1vZHVsZXMgYW5kIGFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIHRoZSBtb2R1bGVzCisJICogcG9pbnRlcnMuCisJICovCisJbWV0YS0+bW9kdWxlc19udW0gPSBxZWRfcmVhZF9ieXRlX2Zyb21fYnVmKG1ldGFfYnVmX2J5dGVzLCAmb2Zmc2V0KTsKKwltZXRhLT5tb2R1bGVzID0ga3phbGxvYyhtZXRhLT5tb2R1bGVzX251bSAqIHNpemVvZihjaGFyICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1ldGEtPm1vZHVsZXMpCisJCXJldHVybiBEQkdfU1RBVFVTX1ZJUlRfTUVNX0FMTE9DX0ZBSUxFRDsKKworCS8qIEFsbG9jYXRlIGFuZCByZWFkIGFsbCBtb2R1bGUgc3RyaW5ncyAqLworCWZvciAoaSA9IDA7IGkgPCBtZXRhLT5tb2R1bGVzX251bTsgaSsrKSB7CisJCXU4IG1vZHVsZV9sZW4gPSBxZWRfcmVhZF9ieXRlX2Zyb21fYnVmKG1ldGFfYnVmX2J5dGVzLCAmb2Zmc2V0KTsKKworCQkqKG1ldGEtPm1vZHVsZXMgKyBpKSA9IGt6YWxsb2MobW9kdWxlX2xlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghKCoobWV0YS0+bW9kdWxlcyArIGkpKSkgeworCQkJLyogVXBkYXRlIG51bWJlciBvZiBtb2R1bGVzIHRvIGJlIHJlbGVhc2VkICovCisJCQltZXRhLT5tb2R1bGVzX251bSA9IGkgPyBpIC0gMSA6IDA7CisJCQlyZXR1cm4gREJHX1NUQVRVU19WSVJUX01FTV9BTExPQ19GQUlMRUQ7CisJCX0KKworCQlxZWRfcmVhZF9zdHJfZnJvbV9idWYobWV0YV9idWZfYnl0ZXMsICZvZmZzZXQsIG1vZHVsZV9sZW4sCisJCQkJICAgICAgKihtZXRhLT5tb2R1bGVzICsgaSkpOworCQlpZiAobW9kdWxlX2xlbiA+IE1DUF9UUkFDRV9NQVhfTU9EVUxFX0xFTikKKwkJCSgqKG1ldGEtPm1vZHVsZXMgKyBpKSlbTUNQX1RSQUNFX01BWF9NT0RVTEVfTEVOXSA9ICdcMCc7CisJfQorCisJLyogUmVhZCBzZWNvbmQgc2lnbmF0dXJlICovCisJc2lnbmF0dXJlID0gcWVkX3JlYWRfZHdvcmRfZnJvbV9idWYobWV0YV9idWZfYnl0ZXMsICZvZmZzZXQpOworCWlmIChzaWduYXR1cmUgIT0gTUNQX1RSQUNFX01FVEFfSU1BR0VfU0lHTkFUVVJFKQorCQlyZXR1cm4gREJHX1NUQVRVU19JTlZBTElEX1RSQUNFX1NJR05BVFVSRTsKKworCS8qIFJlYWQgbnVtYmVyIG9mIGZvcm1hdHMgYW5kIGFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIGZvcm1hdHMgKi8KKwltZXRhLT5mb3JtYXRzX251bSA9IHFlZF9yZWFkX2R3b3JkX2Zyb21fYnVmKG1ldGFfYnVmX2J5dGVzLCAmb2Zmc2V0KTsKKwltZXRhLT5mb3JtYXRzID0ga3phbGxvYyhtZXRhLT5mb3JtYXRzX251bSAqCisJCQkJc2l6ZW9mKHN0cnVjdCBtY3BfdHJhY2VfZm9ybWF0KSwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIW1ldGEtPmZvcm1hdHMpCisJCXJldHVybiBEQkdfU1RBVFVTX1ZJUlRfTUVNX0FMTE9DX0ZBSUxFRDsKKworCS8qIEFsbG9jYXRlIGFuZCByZWFkIGFsbCBzdHJpbmdzICovCisJZm9yIChpID0gMDsgaSA8IG1ldGEtPmZvcm1hdHNfbnVtOyBpKyspIHsKKwkJc3RydWN0IG1jcF90cmFjZV9mb3JtYXQgKmZvcm1hdF9wdHIgPSAmbWV0YS0+Zm9ybWF0c1tpXTsKKwkJdTggZm9ybWF0X2xlbjsKKworCQlmb3JtYXRfcHRyLT5kYXRhID0gcWVkX3JlYWRfZHdvcmRfZnJvbV9idWYobWV0YV9idWZfYnl0ZXMsCisJCQkJCQkJICAgJm9mZnNldCk7CisJCWZvcm1hdF9sZW4gPQorCQkgICAgKGZvcm1hdF9wdHItPmRhdGEgJgorCQkgICAgIE1DUF9UUkFDRV9GT1JNQVRfTEVOX01BU0spID4+IE1DUF9UUkFDRV9GT1JNQVRfTEVOX1NISUZUOworCQlmb3JtYXRfcHRyLT5mb3JtYXRfc3RyID0ga3phbGxvYyhmb3JtYXRfbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFmb3JtYXRfcHRyLT5mb3JtYXRfc3RyKSB7CisJCQkvKiBVcGRhdGUgbnVtYmVyIG9mIG1vZHVsZXMgdG8gYmUgcmVsZWFzZWQgKi8KKwkJCW1ldGEtPmZvcm1hdHNfbnVtID0gaSA/IGkgLSAxIDogMDsKKwkJCXJldHVybiBEQkdfU1RBVFVTX1ZJUlRfTUVNX0FMTE9DX0ZBSUxFRDsKKwkJfQorCisJCXFlZF9yZWFkX3N0cl9mcm9tX2J1ZihtZXRhX2J1Zl9ieXRlcywKKwkJCQkgICAgICAmb2Zmc2V0LAorCQkJCSAgICAgIGZvcm1hdF9sZW4sIGZvcm1hdF9wdHItPmZvcm1hdF9zdHIpOworCX0KKworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCisvKiBQYXJzZXMgYW4gTUNQIFRyYWNlIGR1bXAgYnVmZmVyLgorICogSWYgcmVzdWx0X2J1ZiBpcyBub3QgTlVMTCwgdGhlIE1DUCBUcmFjZSByZXN1bHRzIGFyZSBwcmludGVkIHRvIGl0LgorICogSW4gYW55IGNhc2UsIHRoZSByZXF1aXJlZCByZXN1bHRzIGJ1ZmZlciBzaXplIGlzIGFzc2lnbmVkIHRvCisgKiBwYXJzZWRfcmVzdWx0c19ieXRlcy4KKyAqIFRoZSBwYXJzaW5nIHN0YXR1cyBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGVudW0gZGJnX3N0YXR1cyBxZWRfcGFyc2VfbWNwX3RyYWNlX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQl1MzIgKmR1bXBfYnVmLAorCQkJCQkJdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkJY2hhciAqcmVzdWx0c19idWYsCisJCQkJCQl1MzIgKnBhcnNlZF9yZXN1bHRzX2J5dGVzKQoreworCXUzMiByZXN1bHRzX29mZnNldCA9IDAsIHBhcmFtX21hc2ssIHBhcmFtX3NoaWZ0LCBwYXJhbV9udW1fdmFsOworCXUzMiBudW1fc2VjdGlvbl9wYXJhbXMsIG9mZnNldCwgZW5kX29mZnNldCwgYnl0ZXNfbGVmdDsKKwljb25zdCBjaGFyICpzZWN0aW9uX25hbWUsICpwYXJhbV9uYW1lLCAqcGFyYW1fc3RyX3ZhbDsKKwl1MzIgdHJhY2VfZGF0YV9kd29yZHMsIHRyYWNlX21ldGFfZHdvcmRzOworCXN0cnVjdCBtY3BfdHJhY2VfbWV0YSBtZXRhOworCXN0cnVjdCBtY3BfdHJhY2UgKnRyYWNlOworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXM7CisJY29uc3QgdTMyICptZXRhX2J1ZjsKKwl1OCAqdHJhY2VfYnVmOworCisJKnBhcnNlZF9yZXN1bHRzX2J5dGVzID0gMDsKKworCS8qIFJlYWQgZ2xvYmFsX3BhcmFtcyBzZWN0aW9uICovCisJZHVtcF9idWYgKz0gcWVkX3JlYWRfc2VjdGlvbl9oZHIoZHVtcF9idWYsCisJCQkJCSAmc2VjdGlvbl9uYW1lLCAmbnVtX3NlY3Rpb25fcGFyYW1zKTsKKwlpZiAoc3RyY21wKHNlY3Rpb25fbmFtZSwgImdsb2JhbF9wYXJhbXMiKSkKKwkJcmV0dXJuIERCR19TVEFUVVNfTUNQX1RSQUNFX0JBRF9EQVRBOworCisJLyogUHJpbnQgZ2xvYmFsIHBhcmFtcyAqLworCWR1bXBfYnVmICs9IHFlZF9wcmludF9zZWN0aW9uX3BhcmFtcyhkdW1wX2J1ZiwKKwkJCQkJICAgICBudW1fc2VjdGlvbl9wYXJhbXMsCisJCQkJCSAgICAgcmVzdWx0c19idWYsICZyZXN1bHRzX29mZnNldCk7CisKKwkvKiBSZWFkIHRyYWNlX2RhdGEgc2VjdGlvbiAqLworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3NlY3Rpb25faGRyKGR1bXBfYnVmLAorCQkJCQkgJnNlY3Rpb25fbmFtZSwgJm51bV9zZWN0aW9uX3BhcmFtcyk7CisJaWYgKHN0cmNtcChzZWN0aW9uX25hbWUsICJtY3BfdHJhY2VfZGF0YSIpIHx8IG51bV9zZWN0aW9uX3BhcmFtcyAhPSAxKQorCQlyZXR1cm4gREJHX1NUQVRVU19NQ1BfVFJBQ0VfQkFEX0RBVEE7CisJZHVtcF9idWYgKz0gcWVkX3JlYWRfcGFyYW0oZHVtcF9idWYsCisJCQkJICAgJnBhcmFtX25hbWUsICZwYXJhbV9zdHJfdmFsLCAmcGFyYW1fbnVtX3ZhbCk7CisJaWYgKHN0cmNtcChwYXJhbV9uYW1lLCAic2l6ZSIpKQorCQlyZXR1cm4gREJHX1NUQVRVU19NQ1BfVFJBQ0VfQkFEX0RBVEE7CisJdHJhY2VfZGF0YV9kd29yZHMgPSBwYXJhbV9udW1fdmFsOworCisJLyogUHJlcGFyZSB0cmFjZSBpbmZvICovCisJdHJhY2UgPSAoc3RydWN0IG1jcF90cmFjZSAqKWR1bXBfYnVmOworCXRyYWNlX2J1ZiA9ICh1OCAqKWR1bXBfYnVmICsgc2l6ZW9mKHN0cnVjdCBtY3BfdHJhY2UpOworCW9mZnNldCA9IHRyYWNlLT50cmFjZV9vbGRlc3Q7CisJZW5kX29mZnNldCA9IHRyYWNlLT50cmFjZV9wcm9kOworCWJ5dGVzX2xlZnQgPSBxZWRfY3ljbGljX3N1YihlbmRfb2Zmc2V0LCBvZmZzZXQsIHRyYWNlLT5zaXplKTsKKwlkdW1wX2J1ZiArPSB0cmFjZV9kYXRhX2R3b3JkczsKKworCS8qIFJlYWQgbWV0YV9kYXRhIHNlY3Rpb24gKi8KKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9zZWN0aW9uX2hkcihkdW1wX2J1ZiwKKwkJCQkJICZzZWN0aW9uX25hbWUsICZudW1fc2VjdGlvbl9wYXJhbXMpOworCWlmIChzdHJjbXAoc2VjdGlvbl9uYW1lLCAibWNwX3RyYWNlX21ldGEiKSkKKwkJcmV0dXJuIERCR19TVEFUVVNfTUNQX1RSQUNFX0JBRF9EQVRBOworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3BhcmFtKGR1bXBfYnVmLAorCQkJCSAgICZwYXJhbV9uYW1lLCAmcGFyYW1fc3RyX3ZhbCwgJnBhcmFtX251bV92YWwpOworCWlmIChzdHJjbXAocGFyYW1fbmFtZSwgInNpemUiKSAhPSAwKQorCQlyZXR1cm4gREJHX1NUQVRVU19NQ1BfVFJBQ0VfQkFEX0RBVEE7CisJdHJhY2VfbWV0YV9kd29yZHMgPSBwYXJhbV9udW1fdmFsOworCisJLyogQ2hvb3NlIG1ldGEgZGF0YSBidWZmZXIgKi8KKwlpZiAoIXRyYWNlX21ldGFfZHdvcmRzKSB7CisJCS8qIER1bXAgZG9lc24ndCBpbmNsdWRlIG1ldGEgZGF0YSAqLworCQlpZiAoIXNfbWNwX3RyYWNlX21ldGEucHRyKQorCQkJcmV0dXJuIERCR19TVEFUVVNfTUNQX1RSQUNFX05PX01FVEE7CisJCW1ldGFfYnVmID0gc19tY3BfdHJhY2VfbWV0YS5wdHI7CisJfSBlbHNlIHsKKwkJLyogRHVtcCBpbmNsdWRlcyBtZXRhIGRhdGEgKi8KKwkJbWV0YV9idWYgPSBkdW1wX2J1ZjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBtZXRhIGRhdGEgbWVtb3J5ICovCisJc3RhdHVzID0gcWVkX21jcF90cmFjZV9hbGxvY19tZXRhKHBfaHdmbiwgbWV0YV9idWYsICZtZXRhKTsKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCWdvdG8gZnJlZV9tZW07CisKKwkvKiBJZ25vcmUgdGhlIGxldmVsIGFuZCBtb2R1bGVzIG1hc2tzIC0ganVzdCBwcmludCBldmVyeXRoaW5nIHRoYXQgaXMKKwkgKiBhbHJlYWR5IGluIHRoZSBidWZmZXIuCisJICovCisJd2hpbGUgKGJ5dGVzX2xlZnQpIHsKKwkJc3RydWN0IG1jcF90cmFjZV9mb3JtYXQgKmZvcm1hdF9wdHI7CisJCXU4IGZvcm1hdF9sZXZlbCwgZm9ybWF0X21vZHVsZTsKKwkJdTMyIHBhcmFtc1szXSA9IHsgMCwgMCwgMCB9OworCQl1MzIgaGVhZGVyLCBmb3JtYXRfaWR4LCBpOworCisJCWlmIChieXRlc19sZWZ0IDwgTUZXX1RSQUNFX0VOVFJZX1NJWkUpIHsKKwkJCXN0YXR1cyA9IERCR19TVEFUVVNfTUNQX1RSQUNFX0JBRF9EQVRBOworCQkJZ290byBmcmVlX21lbTsKKwkJfQorCisJCWhlYWRlciA9IHFlZF9yZWFkX2Zyb21fY3ljbGljX2J1Zih0cmFjZV9idWYsCisJCQkJCQkgICZvZmZzZXQsCisJCQkJCQkgIHRyYWNlLT5zaXplLAorCQkJCQkJICBNRldfVFJBQ0VfRU5UUllfU0laRSk7CisJCWJ5dGVzX2xlZnQgLT0gTUZXX1RSQUNFX0VOVFJZX1NJWkU7CisJCWZvcm1hdF9pZHggPSBoZWFkZXIgJiBNRldfVFJBQ0VfRVZFTlRJRF9NQVNLOworCisJCS8qIFNraXAgbWVzc2FnZSBpZiBpdHMgIGluZGV4IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIG1ldGEgZGF0YSAqLworCQlpZiAoZm9ybWF0X2lkeCA+IG1ldGEuZm9ybWF0c19udW0pIHsKKwkJCXU4IGZvcm1hdF9zaXplID0KKwkJCSAgICAodTgpKChoZWFkZXIgJgorCQkJCSAgTUZXX1RSQUNFX1BSTV9TSVpFX01BU0spID4+CisJCQkJIE1GV19UUkFDRV9QUk1fU0laRV9TSElGVCk7CisKKwkJCWlmIChieXRlc19sZWZ0IDwgZm9ybWF0X3NpemUpIHsKKwkJCQlzdGF0dXMgPSBEQkdfU1RBVFVTX01DUF9UUkFDRV9CQURfREFUQTsKKwkJCQlnb3RvIGZyZWVfbWVtOworCQkJfQorCisJCQlvZmZzZXQgPSBxZWRfY3ljbGljX2FkZChvZmZzZXQsCisJCQkJCQlmb3JtYXRfc2l6ZSwgdHJhY2UtPnNpemUpOworCQkJYnl0ZXNfbGVmdCAtPSBmb3JtYXRfc2l6ZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZm9ybWF0X3B0ciA9ICZtZXRhLmZvcm1hdHNbZm9ybWF0X2lkeF07CisJCWZvciAoaSA9IDAsCisJCSAgICAgcGFyYW1fbWFzayA9IE1DUF9UUkFDRV9GT1JNQVRfUDFfU0laRV9NQVNLLCBwYXJhbV9zaGlmdCA9CisJCSAgICAgTUNQX1RSQUNFX0ZPUk1BVF9QMV9TSVpFX1NISUZUOworCQkgICAgIGkgPCBNQ1BfVFJBQ0VfRk9STUFUX01BWF9QQVJBTVM7CisJCSAgICAgaSsrLCBwYXJhbV9tYXNrIDw8PSBNQ1BfVFJBQ0VfRk9STUFUX1BBUkFNX1dJRFRILAorCQkgICAgIHBhcmFtX3NoaWZ0ICs9IE1DUF9UUkFDRV9GT1JNQVRfUEFSQU1fV0lEVEgpIHsKKwkJCS8qIEV4dHJhY3QgcGFyYW0gc2l6ZSAoMC4uMykgKi8KKwkJCXU4IHBhcmFtX3NpemUgPQorCQkJICAgICh1OCkoKGZvcm1hdF9wdHItPmRhdGEgJgorCQkJCSAgcGFyYW1fbWFzaykgPj4gcGFyYW1fc2hpZnQpOworCisJCQkvKiBJZiB0aGUgcGFyYW0gc2l6ZSBpcyB6ZXJvLCB0aGVyZSBhcmUgbm8gb3RoZXIKKwkJCSAqIHBhcmFtZXRlcnMuCisJCQkgKi8KKwkJCWlmICghcGFyYW1fc2l6ZSkKKwkJCQlicmVhazsKKworCQkJLyogU2l6ZSBpcyBlbmNvZGVkIHVzaW5nIDIgYml0cywgd2hlcmUgMyBpcyB1c2VkIHRvCisJCQkgKiBlbmNvZGUgNC4KKwkJCSAqLworCQkJaWYgKHBhcmFtX3NpemUgPT0gMykKKwkJCQlwYXJhbV9zaXplID0gNDsKKwkJCWlmIChieXRlc19sZWZ0IDwgcGFyYW1fc2l6ZSkgeworCQkJCXN0YXR1cyA9IERCR19TVEFUVVNfTUNQX1RSQUNFX0JBRF9EQVRBOworCQkJCWdvdG8gZnJlZV9tZW07CisJCQl9CisKKwkJCXBhcmFtc1tpXSA9IHFlZF9yZWFkX2Zyb21fY3ljbGljX2J1Zih0cmFjZV9idWYsCisJCQkJCQkJICAgICAmb2Zmc2V0LAorCQkJCQkJCSAgICAgdHJhY2UtPnNpemUsCisJCQkJCQkJICAgICBwYXJhbV9zaXplKTsKKwkJCWJ5dGVzX2xlZnQgLT0gcGFyYW1fc2l6ZTsKKwkJfQorCisJCWZvcm1hdF9sZXZlbCA9CisJCSAgICAodTgpKChmb3JtYXRfcHRyLT5kYXRhICYKKwkJCSAgTUNQX1RSQUNFX0ZPUk1BVF9MRVZFTF9NQVNLKSA+PgorCQkJICBNQ1BfVFJBQ0VfRk9STUFUX0xFVkVMX1NISUZUKTsKKwkJZm9ybWF0X21vZHVsZSA9CisJCSAgICAodTgpKChmb3JtYXRfcHRyLT5kYXRhICYKKwkJCSAgTUNQX1RSQUNFX0ZPUk1BVF9NT0RVTEVfTUFTSykgPj4KKwkJCSBNQ1BfVFJBQ0VfRk9STUFUX01PRFVMRV9TSElGVCk7CisJCWlmIChmb3JtYXRfbGV2ZWwgPj0gQVJSQVlfU0laRShzX21jcF90cmFjZV9sZXZlbF9zdHIpKSB7CisJCQlzdGF0dXMgPSBEQkdfU1RBVFVTX01DUF9UUkFDRV9CQURfREFUQTsKKwkJCWdvdG8gZnJlZV9tZW07CisJCX0KKworCQkvKiBQcmludCBjdXJyZW50IG1lc3NhZ2UgdG8gcmVzdWx0cyBidWZmZXIgKi8KKwkJcmVzdWx0c19vZmZzZXQgKz0KKwkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLCAiJXMgJS04czogIiwKKwkJCSAgICBzX21jcF90cmFjZV9sZXZlbF9zdHJbZm9ybWF0X2xldmVsXSwKKwkJCSAgICBtZXRhLm1vZHVsZXNbZm9ybWF0X21vZHVsZV0pOworCQlyZXN1bHRzX29mZnNldCArPQorCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCSAgICByZXN1bHRzX29mZnNldCksCisJCQkgICAgZm9ybWF0X3B0ci0+Zm9ybWF0X3N0ciwgcGFyYW1zWzBdLCBwYXJhbXNbMV0sCisJCQkgICAgcGFyYW1zWzJdKTsKKwl9CisKK2ZyZWVfbWVtOgorCSpwYXJzZWRfcmVzdWx0c19ieXRlcyA9IHJlc3VsdHNfb2Zmc2V0ICsgMTsKKwlxZWRfbWNwX3RyYWNlX2ZyZWVfbWV0YShwX2h3Zm4sICZtZXRhKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2dldF9tY3BfdHJhY2VfcmVzdWx0c19idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgIHUzMiAqZHVtcF9idWYsCisJCQkJCQkgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCQkgICB1MzIgKnJlc3VsdHNfYnVmX3NpemUpCit7CisJcmV0dXJuIHFlZF9wYXJzZV9tY3BfdHJhY2VfZHVtcChwX2h3Zm4sCisJCQkJCWR1bXBfYnVmLAorCQkJCQludW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJTlVMTCwgcmVzdWx0c19idWZfc2l6ZSk7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfcHJpbnRfbWNwX3RyYWNlX3Jlc3VsdHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkgICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgICAgY2hhciAqcmVzdWx0c19idWYpCit7CisJdTMyIHBhcnNlZF9idWZfc2l6ZTsKKworCXJldHVybiBxZWRfcGFyc2VfbWNwX3RyYWNlX2R1bXAocF9od2ZuLAorCQkJCQlkdW1wX2J1ZiwKKwkJCQkJbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCXJlc3VsdHNfYnVmLCAmcGFyc2VkX2J1Zl9zaXplKTsKK30KKworLyogUGFyc2VzIGEgUmVnIEZJRk8gZHVtcCBidWZmZXIuCisgKiBJZiByZXN1bHRfYnVmIGlzIG5vdCBOVUxMLCB0aGUgUmVnIEZJRk8gcmVzdWx0cyBhcmUgcHJpbnRlZCB0byBpdC4KKyAqIEluIGFueSBjYXNlLCB0aGUgcmVxdWlyZWQgcmVzdWx0cyBidWZmZXIgc2l6ZSBpcyBhc3NpZ25lZCB0bworICogcGFyc2VkX3Jlc3VsdHNfYnl0ZXMuCisgKiBUaGUgcGFyc2luZyBzdGF0dXMgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBlbnVtIGRiZ19zdGF0dXMgcWVkX3BhcnNlX3JlZ19maWZvX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkgICAgICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgICAgICAgY2hhciAqcmVzdWx0c19idWYsCisJCQkJCSAgICAgICB1MzIgKnBhcnNlZF9yZXN1bHRzX2J5dGVzKQoreworCXUzMiByZXN1bHRzX29mZnNldCA9IDAsIHBhcmFtX251bV92YWwsIG51bV9zZWN0aW9uX3BhcmFtcywgbnVtX2VsZW1lbnRzOworCWNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZSwgKnBhcmFtX25hbWUsICpwYXJhbV9zdHJfdmFsOworCXN0cnVjdCByZWdfZmlmb19lbGVtZW50ICplbGVtZW50czsKKwl1OCBpLCBqLCBlcnJfdmFsLCB2Zl92YWw7CisJY2hhciB2Zl9zdHJbNF07CisKKwkvKiBSZWFkIGdsb2JhbF9wYXJhbXMgc2VjdGlvbiAqLworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3NlY3Rpb25faGRyKGR1bXBfYnVmLAorCQkJCQkgJnNlY3Rpb25fbmFtZSwgJm51bV9zZWN0aW9uX3BhcmFtcyk7CisJaWYgKHN0cmNtcChzZWN0aW9uX25hbWUsICJnbG9iYWxfcGFyYW1zIikpCisJCXJldHVybiBEQkdfU1RBVFVTX1JFR19GSUZPX0JBRF9EQVRBOworCisJLyogUHJpbnQgZ2xvYmFsIHBhcmFtcyAqLworCWR1bXBfYnVmICs9IHFlZF9wcmludF9zZWN0aW9uX3BhcmFtcyhkdW1wX2J1ZiwKKwkJCQkJICAgICBudW1fc2VjdGlvbl9wYXJhbXMsCisJCQkJCSAgICAgcmVzdWx0c19idWYsICZyZXN1bHRzX29mZnNldCk7CisKKwkvKiBSZWFkIHJlZ19maWZvX2RhdGEgc2VjdGlvbiAqLworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3NlY3Rpb25faGRyKGR1bXBfYnVmLAorCQkJCQkgJnNlY3Rpb25fbmFtZSwgJm51bV9zZWN0aW9uX3BhcmFtcyk7CisJaWYgKHN0cmNtcChzZWN0aW9uX25hbWUsICJyZWdfZmlmb19kYXRhIikpCisJCXJldHVybiBEQkdfU1RBVFVTX1JFR19GSUZPX0JBRF9EQVRBOworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3BhcmFtKGR1bXBfYnVmLAorCQkJCSAgICZwYXJhbV9uYW1lLCAmcGFyYW1fc3RyX3ZhbCwgJnBhcmFtX251bV92YWwpOworCWlmIChzdHJjbXAocGFyYW1fbmFtZSwgInNpemUiKSkKKwkJcmV0dXJuIERCR19TVEFUVVNfUkVHX0ZJRk9fQkFEX0RBVEE7CisJaWYgKHBhcmFtX251bV92YWwgJSBSRUdfRklGT19FTEVNRU5UX0RXT1JEUykKKwkJcmV0dXJuIERCR19TVEFUVVNfUkVHX0ZJRk9fQkFEX0RBVEE7CisJbnVtX2VsZW1lbnRzID0gcGFyYW1fbnVtX3ZhbCAvIFJFR19GSUZPX0VMRU1FTlRfRFdPUkRTOworCWVsZW1lbnRzID0gKHN0cnVjdCByZWdfZmlmb19lbGVtZW50ICopZHVtcF9idWY7CisKKwkvKiBEZWNvZGUgZWxlbWVudHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VsZW1lbnRzOyBpKyspIHsKKwkJYm9vbCBlcnJfcHJpbnRlZCA9IGZhbHNlOworCisJCS8qIERpc2NvdmVyIGlmIGVsZW1lbnQgYmVsb25ncyB0byBhIFZGIG9yIGEgUEYgKi8KKwkJdmZfdmFsID0gR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmRhdGEsIFJFR19GSUZPX0VMRU1FTlRfVkYpOworCQlpZiAodmZfdmFsID09IFJFR19GSUZPX0VMRU1FTlRfSVNfUEZfVkZfVkFMKQorCQkJc3ByaW50Zih2Zl9zdHIsICIlcyIsICJOL0EiKTsKKwkJZWxzZQorCQkJc3ByaW50Zih2Zl9zdHIsICIlZCIsIHZmX3ZhbCk7CisKKwkJLyogQWRkIHBhcnNlZCBlbGVtZW50IHRvIHBhcnNlZCBidWZmZXIgKi8KKwkJcmVzdWx0c19vZmZzZXQgKz0KKwkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLAorCQkJICAgICJyYXc6IDB4JTAxNmxseCwgYWRkcmVzczogMHglMDdsbHgsIGFjY2VzczogJS01cywgcGY6ICUybGxkLCB2ZjogJXMsIHBvcnQ6ICVsbGQsIHByaXZpbGVnZTogJS0zcywgcHJvdGVjdGlvbjogJS0xMnMsIG1hc3RlcjogJS00cywgZXJyb3JzOiAiLAorCQkJICAgIGVsZW1lbnRzW2ldLmRhdGEsCisJCQkgICAgR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmRhdGEsCisJCQkJICAgICAgUkVHX0ZJRk9fRUxFTUVOVF9BRERSRVNTKSAqCisJCQkJICAgICAgUkVHX0ZJRk9fRUxFTUVOVF9BRERSX0ZBQ1RPUiwKKwkJCQkgICAgICBzX2FjY2Vzc19zdHJzW0dFVF9GSUVMRChlbGVtZW50c1tpXS5kYXRhLAorCQkJCQkJICAgIFJFR19GSUZPX0VMRU1FTlRfQUNDRVNTKV0sCisJCQkgICAgR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmRhdGEsCisJCQkJICAgICAgUkVHX0ZJRk9fRUxFTUVOVF9QRiksIHZmX3N0ciwKKwkJCSAgICBHRVRfRklFTEQoZWxlbWVudHNbaV0uZGF0YSwKKwkJCQkgICAgICBSRUdfRklGT19FTEVNRU5UX1BPUlQpLAorCQkJCSAgICAgIHNfcHJpdmlsZWdlX3N0cnNbR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLgorCQkJCSAgICAgIGRhdGEsCisJCQkJICAgICAgUkVHX0ZJRk9fRUxFTUVOVF9QUklWSUxFR0UpXSwKKwkJCSAgICBzX3Byb3RlY3Rpb25fc3Ryc1tHRVRfRklFTEQoZWxlbWVudHNbaV0uZGF0YSwKKwkJCQkJCVJFR19GSUZPX0VMRU1FTlRfUFJPVEVDVElPTildLAorCQkJICAgIHNfbWFzdGVyX3N0cnNbR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmRhdGEsCisJCQkJCQlSRUdfRklGT19FTEVNRU5UX01BU1RFUildKTsKKworCQkvKiBQcmludCBlcnJvcnMgKi8KKwkJZm9yIChqID0gMCwKKwkJICAgICBlcnJfdmFsID0gR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmRhdGEsCisJCQkJCSBSRUdfRklGT19FTEVNRU5UX0VSUk9SKTsKKwkJICAgICBqIDwgQVJSQVlfU0laRShzX3JlZ19maWZvX2Vycm9yX3N0cnMpOworCQkgICAgIGorKywgZXJyX3ZhbCA+Pj0gMSkgeworCQkJaWYgKCEoZXJyX3ZhbCAmIDB4MSkpCisJCQkJY29udGludWU7CisJCQlpZiAoZXJyX3ByaW50ZWQpCisJCQkJcmVzdWx0c19vZmZzZXQgKz0KKwkJCQkJc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCQkJCXJlc3VsdHNfb2Zmc2V0KSwKKwkJCQkJCSIsICIpOworCQkJcmVzdWx0c19vZmZzZXQgKz0KKwkJCQlzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJCQlyZXN1bHRzX29mZnNldCksICIlcyIsCisJCQkJCXNfcmVnX2ZpZm9fZXJyb3Jfc3Ryc1tqXSk7CisJCQllcnJfcHJpbnRlZCA9IHRydWU7CisJCX0KKworCQlyZXN1bHRzX29mZnNldCArPQorCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsIHJlc3VsdHNfb2Zmc2V0KSwgIlxuIik7CisJfQorCisJcmVzdWx0c19vZmZzZXQgKz0gc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCQkgIHJlc3VsdHNfb2Zmc2V0KSwKKwkJCQkgICJmaWZvIGNvbnRhaW5lZCAlZCBlbGVtZW50cyIsIG51bV9lbGVtZW50cyk7CisKKwkvKiBBZGQgMSBmb3Igc3RyaW5nIE5VTEwgdGVybWluYXRpb24gKi8KKwkqcGFyc2VkX3Jlc3VsdHNfYnl0ZXMgPSByZXN1bHRzX29mZnNldCArIDE7CisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZ2V0X3JlZ19maWZvX3Jlc3VsdHNfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgIHUzMiAqZHVtcF9idWYsCisJCQkJCQkgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJCSAgdTMyICpyZXN1bHRzX2J1Zl9zaXplKQoreworCXJldHVybiBxZWRfcGFyc2VfcmVnX2ZpZm9fZHVtcChwX2h3Zm4sCisJCQkJICAgICAgIGR1bXBfYnVmLAorCQkJCSAgICAgICBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkgICAgICAgTlVMTCwgcmVzdWx0c19idWZfc2l6ZSk7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfcHJpbnRfcmVnX2ZpZm9fcmVzdWx0cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgICBjaGFyICpyZXN1bHRzX2J1ZikKK3sKKwl1MzIgcGFyc2VkX2J1Zl9zaXplOworCisJcmV0dXJuIHFlZF9wYXJzZV9yZWdfZmlmb19kdW1wKHBfaHdmbiwKKwkJCQkgICAgICAgZHVtcF9idWYsCisJCQkJICAgICAgIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCSAgICAgICByZXN1bHRzX2J1ZiwgJnBhcnNlZF9idWZfc2l6ZSk7Cit9CisKKy8qIFBhcnNlcyBhbiBJR1UgRklGTyBkdW1wIGJ1ZmZlci4KKyAqIElmIHJlc3VsdF9idWYgaXMgbm90IE5VTEwsIHRoZSBJR1UgRklGTyByZXN1bHRzIGFyZSBwcmludGVkIHRvIGl0LgorICogSW4gYW55IGNhc2UsIHRoZSByZXF1aXJlZCByZXN1bHRzIGJ1ZmZlciBzaXplIGlzIGFzc2lnbmVkIHRvCisgKiBwYXJzZWRfcmVzdWx0c19ieXRlcy4KKyAqIFRoZSBwYXJzaW5nIHN0YXR1cyBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGVudW0gZGJnX3N0YXR1cyBxZWRfcGFyc2VfaWd1X2ZpZm9fZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJCSAgICAgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSAgICAgICBjaGFyICpyZXN1bHRzX2J1ZiwKKwkJCQkJICAgICAgIHUzMiAqcGFyc2VkX3Jlc3VsdHNfYnl0ZXMpCit7CisJdTMyIHJlc3VsdHNfb2Zmc2V0ID0gMCwgcGFyYW1fbnVtX3ZhbCwgbnVtX3NlY3Rpb25fcGFyYW1zLCBudW1fZWxlbWVudHM7CisJY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lLCAqcGFyYW1fbmFtZSwgKnBhcmFtX3N0cl92YWw7CisJc3RydWN0IGlndV9maWZvX2VsZW1lbnQgKmVsZW1lbnRzOworCWNoYXIgcGFyc2VkX2FkZHJfZGF0YVszMl07CisJY2hhciBwYXJzZWRfd3JfZGF0YVsyNTZdOworCXU4IGksIGo7CisKKwkvKiBSZWFkIGdsb2JhbF9wYXJhbXMgc2VjdGlvbiAqLworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3NlY3Rpb25faGRyKGR1bXBfYnVmLAorCQkJCQkgJnNlY3Rpb25fbmFtZSwgJm51bV9zZWN0aW9uX3BhcmFtcyk7CisJaWYgKHN0cmNtcChzZWN0aW9uX25hbWUsICJnbG9iYWxfcGFyYW1zIikpCisJCXJldHVybiBEQkdfU1RBVFVTX0lHVV9GSUZPX0JBRF9EQVRBOworCisJLyogUHJpbnQgZ2xvYmFsIHBhcmFtcyAqLworCWR1bXBfYnVmICs9IHFlZF9wcmludF9zZWN0aW9uX3BhcmFtcyhkdW1wX2J1ZiwKKwkJCQkJICAgICBudW1fc2VjdGlvbl9wYXJhbXMsCisJCQkJCSAgICAgcmVzdWx0c19idWYsICZyZXN1bHRzX29mZnNldCk7CisKKwkvKiBSZWFkIGlndV9maWZvX2RhdGEgc2VjdGlvbiAqLworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3NlY3Rpb25faGRyKGR1bXBfYnVmLAorCQkJCQkgJnNlY3Rpb25fbmFtZSwgJm51bV9zZWN0aW9uX3BhcmFtcyk7CisJaWYgKHN0cmNtcChzZWN0aW9uX25hbWUsICJpZ3VfZmlmb19kYXRhIikpCisJCXJldHVybiBEQkdfU1RBVFVTX0lHVV9GSUZPX0JBRF9EQVRBOworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3BhcmFtKGR1bXBfYnVmLAorCQkJCSAgICZwYXJhbV9uYW1lLCAmcGFyYW1fc3RyX3ZhbCwgJnBhcmFtX251bV92YWwpOworCWlmIChzdHJjbXAocGFyYW1fbmFtZSwgInNpemUiKSkKKwkJcmV0dXJuIERCR19TVEFUVVNfSUdVX0ZJRk9fQkFEX0RBVEE7CisJaWYgKHBhcmFtX251bV92YWwgJSBJR1VfRklGT19FTEVNRU5UX0RXT1JEUykKKwkJcmV0dXJuIERCR19TVEFUVVNfSUdVX0ZJRk9fQkFEX0RBVEE7CisJbnVtX2VsZW1lbnRzID0gcGFyYW1fbnVtX3ZhbCAvIElHVV9GSUZPX0VMRU1FTlRfRFdPUkRTOworCWVsZW1lbnRzID0gKHN0cnVjdCBpZ3VfZmlmb19lbGVtZW50ICopZHVtcF9idWY7CisKKwkvKiBEZWNvZGUgZWxlbWVudHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VsZW1lbnRzOyBpKyspIHsKKwkJLyogZHdvcmQxMiAoZHdvcmQgaW5kZXggMSBhbmQgMikgY29udGFpbnMgYml0cyAzMi4uOTUgb2YgdGhlCisJCSAqIEZJRk8gZWxlbWVudC4KKwkJICovCisJCXU2NCBkd29yZDEyID0KKwkJICAgICgodTY0KWVsZW1lbnRzW2ldLmR3b3JkMiA8PCAzMikgfCBlbGVtZW50c1tpXS5kd29yZDE7CisJCWJvb2wgaXNfd3JfY21kID0gR0VUX0ZJRUxEKGR3b3JkMTIsCisJCQkJCSAgIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQxMl9JU19XUl9DTUQpOworCQlib29sIGlzX3BmID0gR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmR3b3JkMCwKKwkJCQkgICAgICAgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDBfSVNfUEYpOworCQl1MTYgY21kX2FkZHIgPSBHRVRfRklFTEQoZWxlbWVudHNbaV0uZHdvcmQwLAorCQkJCQkgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDBfQ01EX0FERFIpOworCQl1OCBzb3VyY2UgPSBHRVRfRklFTEQoZWxlbWVudHNbaV0uZHdvcmQwLAorCQkJCSAgICAgIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQwX1NPVVJDRSk7CisJCXU4IGVycl90eXBlID0gR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmR3b3JkMCwKKwkJCQkJSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDBfRVJSX1RZUEUpOworCQljb25zdCBzdHJ1Y3QgaWd1X2ZpZm9fYWRkcl9kYXRhICphZGRyX2RhdGEgPSBOVUxMOworCisJCWlmIChzb3VyY2UgPj0gQVJSQVlfU0laRShzX2lndV9maWZvX3NvdXJjZV9zdHJzKSkKKwkJCXJldHVybiBEQkdfU1RBVFVTX0lHVV9GSUZPX0JBRF9EQVRBOworCQlpZiAoZXJyX3R5cGUgPj0gQVJSQVlfU0laRShzX2lndV9maWZvX2Vycm9yX3N0cnMpKQorCQkJcmV0dXJuIERCR19TVEFUVVNfSUdVX0ZJRk9fQkFEX0RBVEE7CisKKwkJLyogRmluZCBhZGRyZXNzIGRhdGEgKi8KKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUoc19pZ3VfZmlmb19hZGRyX2RhdGEpICYmICFhZGRyX2RhdGE7CisJCSAgICAgaisrKQorCQkJaWYgKGNtZF9hZGRyID49IHNfaWd1X2ZpZm9fYWRkcl9kYXRhW2pdLnN0YXJ0X2FkZHIgJiYKKwkJCSAgICBjbWRfYWRkciA8PSBzX2lndV9maWZvX2FkZHJfZGF0YVtqXS5lbmRfYWRkcikKKwkJCQlhZGRyX2RhdGEgPSAmc19pZ3VfZmlmb19hZGRyX2RhdGFbal07CisJCWlmICghYWRkcl9kYXRhKQorCQkJcmV0dXJuIERCR19TVEFUVVNfSUdVX0ZJRk9fQkFEX0RBVEE7CisKKwkJLyogUHJlcGFyZSBwYXJzZWQgYWRkcmVzcyBkYXRhICovCisJCXN3aXRjaCAoYWRkcl9kYXRhLT50eXBlKSB7CisJCWNhc2UgSUdVX0FERFJfVFlQRV9NU0lYX01FTToKKwkJCXNwcmludGYocGFyc2VkX2FkZHJfZGF0YSwKKwkJCQkiIHZlY3Rvcl9udW09MHgleCIsIGNtZF9hZGRyIC8gMik7CisJCQlicmVhazsKKwkJY2FzZSBJR1VfQUREUl9UWVBFX1dSSVRFX0lOVF9BQ0s6CisJCWNhc2UgSUdVX0FERFJfVFlQRV9XUklURV9QUk9EX1VQREFURToKKwkJCXNwcmludGYocGFyc2VkX2FkZHJfZGF0YSwKKwkJCQkiIFNCPTB4JXgiLCBjbWRfYWRkciAtIGFkZHJfZGF0YS0+c3RhcnRfYWRkcik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXBhcnNlZF9hZGRyX2RhdGFbMF0gPSAnXDAnOworCQl9CisKKwkJLyogUHJlcGFyZSBwYXJzZWQgd3JpdGUgZGF0YSAqLworCQlpZiAoaXNfd3JfY21kKSB7CisJCQl1MzIgd3JfZGF0YSA9IEdFVF9GSUVMRChkd29yZDEyLAorCQkJCQlJR1VfRklGT19FTEVNRU5UX0RXT1JEMTJfV1JfREFUQSk7CisJCQl1MzIgcHJvZF9jb25zID0gR0VUX0ZJRUxEKHdyX2RhdGEsCisJCQkJCQkgIElHVV9GSUZPX1dSX0RBVEFfUFJPRF9DT05TKTsKKwkJCXU4IGlzX2NsZWFudXAgPSBHRVRfRklFTEQod3JfZGF0YSwKKwkJCQkJCSAgSUdVX0ZJRk9fV1JfREFUQV9DTURfVFlQRSk7CisKKwkJCWlmIChzb3VyY2UgPT0gSUdVX1NSQ19BVFROKSB7CisJCQkJc3ByaW50ZihwYXJzZWRfd3JfZGF0YSwKKwkJCQkJInByb2Q6IDB4JXgsICIsIHByb2RfY29ucyk7CisJCQl9IGVsc2UgeworCQkJCWlmIChpc19jbGVhbnVwKSB7CisJCQkJCXU4IGNsZWFudXBfdmFsID0gR0VUX0ZJRUxEKHdyX2RhdGEsCisJCQkJCQkJCSAgIElHVV9GSUZPX0NMRUFOVVBfV1JfREFUQV9DTEVBTlVQX1ZBTCk7CisJCQkJCXU4IGNsZWFudXBfdHlwZSA9IEdFVF9GSUVMRCh3cl9kYXRhLAorCQkJCQkJCQkgICAgSUdVX0ZJRk9fQ0xFQU5VUF9XUl9EQVRBX0NMRUFOVVBfVFlQRSk7CisKKwkJCQkJc3ByaW50ZihwYXJzZWRfd3JfZGF0YSwKKwkJCQkJCSJjbWRfdHlwZTogY2xlYW51cCwgY2xlYW51cF92YWw6ICVzLCBjbGVhbnVwX3R5cGU6ICVkLCAiLAorCQkJCQkJY2xlYW51cF92YWwgPyAic2V0IiA6ICJjbGVhciIsCisJCQkJCQljbGVhbnVwX3R5cGUpOworCQkJCX0gZWxzZSB7CisJCQkJCXU4IHVwZGF0ZV9mbGFnID0gR0VUX0ZJRUxEKHdyX2RhdGEsCisJCQkJCQkJCSAgIElHVV9GSUZPX1dSX0RBVEFfVVBEQVRFX0ZMQUcpOworCQkJCQl1OCBlbl9kaXNfaW50X2Zvcl9zYiA9CisJCQkJCSAgICBHRVRfRklFTEQod3JfZGF0YSwKKwkJCQkJCSAgICAgIElHVV9GSUZPX1dSX0RBVEFfRU5fRElTX0lOVF9GT1JfU0IpOworCQkJCQl1OCBzZWdtZW50ID0gR0VUX0ZJRUxEKHdyX2RhdGEsCisJCQkJCQkJICAgICAgIElHVV9GSUZPX1dSX0RBVEFfU0VHTUVOVCk7CisJCQkJCXU4IHRpbWVyX21hc2sgPSBHRVRfRklFTEQod3JfZGF0YSwKKwkJCQkJCQkJICBJR1VfRklGT19XUl9EQVRBX1RJTUVSX01BU0spOworCisJCQkJCXNwcmludGYocGFyc2VkX3dyX2RhdGEsCisJCQkJCQkiY21kX3R5cGU6IHByb2QvY29ucyB1cGRhdGUsIHByb2QvY29uczogMHgleCwgdXBkYXRlX2ZsYWc6ICVzLCBlbl9kaXNfaW50X2Zvcl9zYjogJXMsIHNlZ21lbnQ6ICVzLCB0aW1lcl9tYXNrPSVkLCAiLAorCQkJCQkJcHJvZF9jb25zLAorCQkJCQkJdXBkYXRlX2ZsYWcgPyAidXBkYXRlIiA6ICJub3AiLAorCQkJCQkJZW5fZGlzX2ludF9mb3Jfc2IKKwkJCQkJCT8gKGVuX2Rpc19pbnRfZm9yX3NiID09CisJCQkJCQkgICAxID8gImRpc2FibGUiIDogIm5vcCIpIDoKKwkJCQkJCSJlbmFibGUiLAorCQkJCQkJc2VnbWVudCA/ICJhdHRuIiA6ICJyZWd1bGFyIiwKKwkJCQkJCXRpbWVyX21hc2spOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBhcnNlZF93cl9kYXRhWzBdID0gJ1wwJzsKKwkJfQorCisJCS8qIEFkZCBwYXJzZWQgZWxlbWVudCB0byBwYXJzZWQgYnVmZmVyICovCisJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwKKwkJCSAgICAicmF3OiAweCUwMXglMDh4JTA4eCwgJXM6ICVkLCBzb3VyY2U6ICVzLCB0eXBlOiAlcywgY21kX2FkZHI6IDB4JXggKCVzJXMpLCAlc2Vycm9yOiAlc1xuIiwKKwkJCSAgICBlbGVtZW50c1tpXS5kd29yZDIsIGVsZW1lbnRzW2ldLmR3b3JkMSwKKwkJCSAgICBlbGVtZW50c1tpXS5kd29yZDAsCisJCQkgICAgaXNfcGYgPyAicGYiIDogInZmIiwKKwkJCSAgICBHRVRfRklFTEQoZWxlbWVudHNbaV0uZHdvcmQwLAorCQkJCSAgICAgIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQwX0ZJRCksCisJCQkgICAgc19pZ3VfZmlmb19zb3VyY2Vfc3Ryc1tzb3VyY2VdLAorCQkJICAgIGlzX3dyX2NtZCA/ICJ3ciIgOiAicmQiLCBjbWRfYWRkciwKKwkJCSAgICAoIWlzX3BmICYmIGFkZHJfZGF0YS0+dmZfZGVzYykKKwkJCSAgICA/IGFkZHJfZGF0YS0+dmZfZGVzYyA6IGFkZHJfZGF0YS0+ZGVzYywKKwkJCSAgICBwYXJzZWRfYWRkcl9kYXRhLCBwYXJzZWRfd3JfZGF0YSwKKwkJCSAgICBzX2lndV9maWZvX2Vycm9yX3N0cnNbZXJyX3R5cGVdKTsKKwl9CisKKwlyZXN1bHRzX29mZnNldCArPSBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJCSAgcmVzdWx0c19vZmZzZXQpLAorCQkJCSAgImZpZm8gY29udGFpbmVkICVkIGVsZW1lbnRzIiwgbnVtX2VsZW1lbnRzKTsKKworCS8qIEFkZCAxIGZvciBzdHJpbmcgTlVMTCB0ZXJtaW5hdGlvbiAqLworCSpwYXJzZWRfcmVzdWx0c19ieXRlcyA9IHJlc3VsdHNfb2Zmc2V0ICsgMTsKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9nZXRfaWd1X2ZpZm9fcmVzdWx0c19idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJCSAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkJICB1MzIgKnJlc3VsdHNfYnVmX3NpemUpCit7CisJcmV0dXJuIHFlZF9wYXJzZV9pZ3VfZmlmb19kdW1wKHBfaHdmbiwKKwkJCQkgICAgICAgZHVtcF9idWYsCisJCQkJICAgICAgIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCSAgICAgICBOVUxMLCByZXN1bHRzX2J1Zl9zaXplKTsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9wcmludF9pZ3VfZmlmb19yZXN1bHRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSAgIGNoYXIgKnJlc3VsdHNfYnVmKQoreworCXUzMiBwYXJzZWRfYnVmX3NpemU7CisKKwlyZXR1cm4gcWVkX3BhcnNlX2lndV9maWZvX2R1bXAocF9od2ZuLAorCQkJCSAgICAgICBkdW1wX2J1ZiwKKwkJCQkgICAgICAgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJICAgICAgIHJlc3VsdHNfYnVmLCAmcGFyc2VkX2J1Zl9zaXplKTsKK30KKworc3RhdGljIGVudW0gZGJnX3N0YXR1cworcWVkX3BhcnNlX3Byb3RlY3Rpb25fb3ZlcnJpZGVfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICB1MzIgKmR1bXBfYnVmLAorCQkJCSAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkgICBjaGFyICpyZXN1bHRzX2J1ZiwKKwkJCQkgICB1MzIgKnBhcnNlZF9yZXN1bHRzX2J5dGVzKQoreworCXUzMiByZXN1bHRzX29mZnNldCA9IDAsIHBhcmFtX251bV92YWwsIG51bV9zZWN0aW9uX3BhcmFtcywgbnVtX2VsZW1lbnRzOworCWNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZSwgKnBhcmFtX25hbWUsICpwYXJhbV9zdHJfdmFsOworCXN0cnVjdCBwcm90ZWN0aW9uX292ZXJyaWRlX2VsZW1lbnQgKmVsZW1lbnRzOworCXU4IGk7CisKKwkvKiBSZWFkIGdsb2JhbF9wYXJhbXMgc2VjdGlvbiAqLworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3NlY3Rpb25faGRyKGR1bXBfYnVmLAorCQkJCQkgJnNlY3Rpb25fbmFtZSwgJm51bV9zZWN0aW9uX3BhcmFtcyk7CisJaWYgKHN0cmNtcChzZWN0aW9uX25hbWUsICJnbG9iYWxfcGFyYW1zIikpCisJCXJldHVybiBEQkdfU1RBVFVTX1BST1RFQ1RJT05fT1ZFUlJJREVfQkFEX0RBVEE7CisKKwkvKiBQcmludCBnbG9iYWwgcGFyYW1zICovCisJZHVtcF9idWYgKz0gcWVkX3ByaW50X3NlY3Rpb25fcGFyYW1zKGR1bXBfYnVmLAorCQkJCQkgICAgIG51bV9zZWN0aW9uX3BhcmFtcywKKwkJCQkJICAgICByZXN1bHRzX2J1ZiwgJnJlc3VsdHNfb2Zmc2V0KTsKKworCS8qIFJlYWQgcHJvdGVjdGlvbl9vdmVycmlkZV9kYXRhIHNlY3Rpb24gKi8KKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9zZWN0aW9uX2hkcihkdW1wX2J1ZiwKKwkJCQkJICZzZWN0aW9uX25hbWUsICZudW1fc2VjdGlvbl9wYXJhbXMpOworCWlmIChzdHJjbXAoc2VjdGlvbl9uYW1lLCAicHJvdGVjdGlvbl9vdmVycmlkZV9kYXRhIikpCisJCXJldHVybiBEQkdfU1RBVFVTX1BST1RFQ1RJT05fT1ZFUlJJREVfQkFEX0RBVEE7CisJZHVtcF9idWYgKz0gcWVkX3JlYWRfcGFyYW0oZHVtcF9idWYsCisJCQkJICAgJnBhcmFtX25hbWUsICZwYXJhbV9zdHJfdmFsLCAmcGFyYW1fbnVtX3ZhbCk7CisJaWYgKHN0cmNtcChwYXJhbV9uYW1lLCAic2l6ZSIpKQorCQlyZXR1cm4gREJHX1NUQVRVU19QUk9URUNUSU9OX09WRVJSSURFX0JBRF9EQVRBOworCWlmIChwYXJhbV9udW1fdmFsICUgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX0RXT1JEUyAhPSAwKQorCQlyZXR1cm4gREJHX1NUQVRVU19QUk9URUNUSU9OX09WRVJSSURFX0JBRF9EQVRBOworCW51bV9lbGVtZW50cyA9IHBhcmFtX251bV92YWwgLyBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfRFdPUkRTOworCWVsZW1lbnRzID0gKHN0cnVjdCBwcm90ZWN0aW9uX292ZXJyaWRlX2VsZW1lbnQgKilkdW1wX2J1ZjsKKworCS8qIERlY29kZSBlbGVtZW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fZWxlbWVudHM7IGkrKykgeworCQl1MzIgYWRkcmVzcyA9IEdFVF9GSUVMRChlbGVtZW50c1tpXS5kYXRhLAorCQkJCQlQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfQUREUkVTUykgKgorCQkJCQlQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfQUREUl9GQUNUT1I7CisKKwkJcmVzdWx0c19vZmZzZXQgKz0KKwkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLAorCQkJICAgICJ3aW5kb3cgJTJkLCBhZGRyZXNzOiAweCUwN3gsIHNpemU6ICU3bGxkIHJlZ3MsIHJlYWQ6ICVsbGQsIHdyaXRlOiAlbGxkLCByZWFkIHByb3RlY3Rpb246ICUtMTJzLCB3cml0ZSBwcm90ZWN0aW9uOiAlLTEyc1xuIiwKKwkJCSAgICBpLCBhZGRyZXNzLAorCQkJICAgIEdFVF9GSUVMRChlbGVtZW50c1tpXS5kYXRhLAorCQkJCSAgICAgIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9XSU5ET1dfU0laRSksCisJCQkgICAgR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmRhdGEsCisJCQkJICAgICAgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX1JFQUQpLAorCQkJICAgIEdFVF9GSUVMRChlbGVtZW50c1tpXS5kYXRhLAorCQkJCSAgICAgIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9XUklURSksCisJCQkgICAgc19wcm90ZWN0aW9uX3N0cnNbR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmRhdGEsCisJCQkJUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX1JFQURfUFJPVEVDVElPTildLAorCQkJICAgIHNfcHJvdGVjdGlvbl9zdHJzW0dFVF9GSUVMRChlbGVtZW50c1tpXS5kYXRhLAorCQkJCVBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9XUklURV9QUk9URUNUSU9OKV0pOworCX0KKworCXJlc3VsdHNfb2Zmc2V0ICs9IHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkJICByZXN1bHRzX29mZnNldCksCisJCQkJICAicHJvdGVjdGlvbiBvdmVycmlkZSBjb250YWluZWQgJWQgZWxlbWVudHMiLAorCQkJCSAgbnVtX2VsZW1lbnRzKTsKKworCS8qIEFkZCAxIGZvciBzdHJpbmcgTlVMTCB0ZXJtaW5hdGlvbiAqLworCSpwYXJzZWRfcmVzdWx0c19ieXRlcyA9IHJlc3VsdHNfb2Zmc2V0ICsgMTsKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworZW51bSBkYmdfc3RhdHVzCitxZWRfZ2V0X3Byb3RlY3Rpb25fb3ZlcnJpZGVfcmVzdWx0c19idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkgICAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJICAgICB1MzIgKnJlc3VsdHNfYnVmX3NpemUpCit7CisJcmV0dXJuIHFlZF9wYXJzZV9wcm90ZWN0aW9uX292ZXJyaWRlX2R1bXAocF9od2ZuLAorCQkJCQkJICBkdW1wX2J1ZiwKKwkJCQkJCSAgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCQkgIE5VTEwsIHJlc3VsdHNfYnVmX3NpemUpOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX3ByaW50X3Byb3RlY3Rpb25fb3ZlcnJpZGVfcmVzdWx0cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJCQkgICAgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCQkgICAgICBjaGFyICpyZXN1bHRzX2J1ZikKK3sKKwl1MzIgcGFyc2VkX2J1Zl9zaXplOworCisJcmV0dXJuIHFlZF9wYXJzZV9wcm90ZWN0aW9uX292ZXJyaWRlX2R1bXAocF9od2ZuLAorCQkJCQkJICBkdW1wX2J1ZiwKKwkJCQkJCSAgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCQkgIHJlc3VsdHNfYnVmLAorCQkJCQkJICAmcGFyc2VkX2J1Zl9zaXplKTsKK30KKworLyogUGFyc2VzIGEgRlcgQXNzZXJ0cyBkdW1wIGJ1ZmZlci4KKyAqIElmIHJlc3VsdF9idWYgaXMgbm90IE5VTEwsIHRoZSBGVyBBc3NlcnRzIHJlc3VsdHMgYXJlIHByaW50ZWQgdG8gaXQuCisgKiBJbiBhbnkgY2FzZSwgdGhlIHJlcXVpcmVkIHJlc3VsdHMgYnVmZmVyIHNpemUgaXMgYXNzaWduZWQgdG8KKyAqIHBhcnNlZF9yZXN1bHRzX2J5dGVzLgorICogVGhlIHBhcnNpbmcgc3RhdHVzIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgZW51bSBkYmdfc3RhdHVzIHFlZF9wYXJzZV9md19hc3NlcnRzX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgdTMyICpkdW1wX2J1ZiwKKwkJCQkJCSB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCQkgY2hhciAqcmVzdWx0c19idWYsCisJCQkJCQkgdTMyICpwYXJzZWRfcmVzdWx0c19ieXRlcykKK3sKKwl1MzIgcmVzdWx0c19vZmZzZXQgPSAwLCBudW1fc2VjdGlvbl9wYXJhbXMsIHBhcmFtX251bV92YWwsIGk7CisJY29uc3QgY2hhciAqcGFyYW1fbmFtZSwgKnBhcmFtX3N0cl92YWwsICpzZWN0aW9uX25hbWU7CisJYm9vbCBsYXN0X3NlY3Rpb25fZm91bmQgPSBmYWxzZTsKKworCSpwYXJzZWRfcmVzdWx0c19ieXRlcyA9IDA7CisKKwkvKiBSZWFkIGdsb2JhbF9wYXJhbXMgc2VjdGlvbiAqLworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3NlY3Rpb25faGRyKGR1bXBfYnVmLAorCQkJCQkgJnNlY3Rpb25fbmFtZSwgJm51bV9zZWN0aW9uX3BhcmFtcyk7CisJaWYgKHN0cmNtcChzZWN0aW9uX25hbWUsICJnbG9iYWxfcGFyYW1zIikpCisJCXJldHVybiBEQkdfU1RBVFVTX0ZXX0FTU0VSVFNfUEFSU0VfRkFJTEVEOworCisJLyogUHJpbnQgZ2xvYmFsIHBhcmFtcyAqLworCWR1bXBfYnVmICs9IHFlZF9wcmludF9zZWN0aW9uX3BhcmFtcyhkdW1wX2J1ZiwKKwkJCQkJICAgICBudW1fc2VjdGlvbl9wYXJhbXMsCisJCQkJCSAgICAgcmVzdWx0c19idWYsICZyZXN1bHRzX29mZnNldCk7CisJd2hpbGUgKCFsYXN0X3NlY3Rpb25fZm91bmQpIHsKKwkJY29uc3QgY2hhciAqc3Rvcm1fbGV0dGVyID0gTlVMTDsKKwkJdTMyIHN0b3JtX2R1bXBfc2l6ZSA9IDA7CisKKwkJZHVtcF9idWYgKz0gcWVkX3JlYWRfc2VjdGlvbl9oZHIoZHVtcF9idWYsCisJCQkJCQkgJnNlY3Rpb25fbmFtZSwKKwkJCQkJCSAmbnVtX3NlY3Rpb25fcGFyYW1zKTsKKwkJaWYgKCFzdHJjbXAoc2VjdGlvbl9uYW1lLCAibGFzdCIpKSB7CisJCQlsYXN0X3NlY3Rpb25fZm91bmQgPSB0cnVlOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoc3RyY21wKHNlY3Rpb25fbmFtZSwgImZ3X2Fzc2VydHMiKSkgeworCQkJcmV0dXJuIERCR19TVEFUVVNfRldfQVNTRVJUU19QQVJTRV9GQUlMRUQ7CisJCX0KKworCQkvKiBFeHRyYWN0IHBhcmFtcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3NlY3Rpb25fcGFyYW1zOyBpKyspIHsKKwkJCWR1bXBfYnVmICs9IHFlZF9yZWFkX3BhcmFtKGR1bXBfYnVmLAorCQkJCQkJICAgJnBhcmFtX25hbWUsCisJCQkJCQkgICAmcGFyYW1fc3RyX3ZhbCwKKwkJCQkJCSAgICZwYXJhbV9udW1fdmFsKTsKKwkJCWlmICghc3RyY21wKHBhcmFtX25hbWUsICJzdG9ybSIpKQorCQkJCXN0b3JtX2xldHRlciA9IHBhcmFtX3N0cl92YWw7CisJCQllbHNlIGlmICghc3RyY21wKHBhcmFtX25hbWUsICJzaXplIikpCisJCQkJc3Rvcm1fZHVtcF9zaXplID0gcGFyYW1fbnVtX3ZhbDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gREJHX1NUQVRVU19GV19BU1NFUlRTX1BBUlNFX0ZBSUxFRDsKKwkJfQorCisJCWlmICghc3Rvcm1fbGV0dGVyIHx8ICFzdG9ybV9kdW1wX3NpemUpCisJCQlyZXR1cm4gREJHX1NUQVRVU19GV19BU1NFUlRTX1BBUlNFX0ZBSUxFRDsKKworCQkvKiBQcmludCBkYXRhICovCisJCXJlc3VsdHNfb2Zmc2V0ICs9IHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkJCSAgcmVzdWx0c19vZmZzZXQpLAorCQkJCQkgICJcbiVzU1RPUk1fQVNTRVJUOiBzaXplPSVkXG4iLAorCQkJCQkgIHN0b3JtX2xldHRlciwgc3Rvcm1fZHVtcF9zaXplKTsKKwkJZm9yIChpID0gMDsgaSA8IHN0b3JtX2R1bXBfc2l6ZTsgaSsrLCBkdW1wX2J1ZisrKQorCQkJcmVzdWx0c19vZmZzZXQgKz0KKwkJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJCSAgICByZXN1bHRzX29mZnNldCksCisJCQkJICAgICIlMDh4XG4iLCAqZHVtcF9idWYpOworCX0KKworCS8qIEFkZCAxIGZvciBzdHJpbmcgTlVMTCB0ZXJtaW5hdGlvbiAqLworCSpwYXJzZWRfcmVzdWx0c19ieXRlcyA9IHJlc3VsdHNfb2Zmc2V0ICsgMTsKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9nZXRfZndfYXNzZXJ0c19yZXN1bHRzX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgIHUzMiAqZHVtcF9idWYsCisJCQkJCQkgICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkJICAgIHUzMiAqcmVzdWx0c19idWZfc2l6ZSkKK3sKKwlyZXR1cm4gcWVkX3BhcnNlX2Z3X2Fzc2VydHNfZHVtcChwX2h3Zm4sCisJCQkJCSBkdW1wX2J1ZiwKKwkJCQkJIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgTlVMTCwgcmVzdWx0c19idWZfc2l6ZSk7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfcHJpbnRfZndfYXNzZXJ0c19yZXN1bHRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJCSAgICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgICAgIGNoYXIgKnJlc3VsdHNfYnVmKQoreworCXUzMiBwYXJzZWRfYnVmX3NpemU7CisKKwlyZXR1cm4gcWVkX3BhcnNlX2Z3X2Fzc2VydHNfZHVtcChwX2h3Zm4sCisJCQkJCSBkdW1wX2J1ZiwKKwkJCQkJIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgcmVzdWx0c19idWYsICZwYXJzZWRfYnVmX3NpemUpOworfQorCisvKiBXcmFwcGVyIGZvciB1bmlmeWluZyB0aGUgaWRsZV9jaGsgYW5kIG1jcF90cmFjZSBhcGkgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfcHJpbnRfaWRsZV9jaGtfcmVzdWx0c193cmFwcGVyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJCSAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJCSAgIGNoYXIgKnJlc3VsdHNfYnVmKQoreworCXUzMiBudW1fZXJyb3JzLCBudW1fd2Fybm5pbmdzOworCisJcmV0dXJuIHFlZF9wcmludF9pZGxlX2Noa19yZXN1bHRzKHBfaHdmbiwgZHVtcF9idWYsIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgIHJlc3VsdHNfYnVmLCAmbnVtX2Vycm9ycywKKwkJCQkJICAmbnVtX3dhcm5uaW5ncyk7Cit9CisKKy8qIEZlYXR1cmUgbWV0YSBkYXRhIGxvb2t1cCB0YWJsZSAqLworc3RhdGljIHN0cnVjdCB7CisJY2hhciAqbmFtZTsKKwllbnVtIGRiZ19zdGF0dXMgKCpnZXRfc2l6ZSkoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTMyICpzaXplKTsKKwllbnVtIGRiZ19zdGF0dXMgKCpwZXJmb3JtX2R1bXApKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiAqZHVtcF9idWYsCisJCQkJCXUzMiBidWZfc2l6ZSwgdTMyICpkdW1wZWRfZHdvcmRzKTsKKwllbnVtIGRiZ19zdGF0dXMgKCpwcmludF9yZXN1bHRzKShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJIHUzMiAqZHVtcF9idWYsIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJIGNoYXIgKnJlc3VsdHNfYnVmKTsKKwllbnVtIGRiZ19zdGF0dXMgKCpyZXN1bHRzX2J1Zl9zaXplKShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgIHUzMiAqZHVtcF9idWYsCisJCQkJCSAgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSAgICB1MzIgKnJlc3VsdHNfYnVmX3NpemUpOworfSBxZWRfZmVhdHVyZXNfbG9va3VwW10gPSB7CisJeworCSJncmMiLCBxZWRfZGJnX2dyY19nZXRfZHVtcF9idWZfc2l6ZSwKKwkJICAgIHFlZF9kYmdfZ3JjX2R1bXAsIE5VTEwsIE5VTEx9LCB7CisJImlkbGVfY2hrIiwKKwkJICAgIHFlZF9kYmdfaWRsZV9jaGtfZ2V0X2R1bXBfYnVmX3NpemUsCisJCSAgICBxZWRfZGJnX2lkbGVfY2hrX2R1bXAsCisJCSAgICBxZWRfcHJpbnRfaWRsZV9jaGtfcmVzdWx0c193cmFwcGVyLAorCQkgICAgcWVkX2dldF9pZGxlX2Noa19yZXN1bHRzX2J1Zl9zaXplfSwgeworCSJtY3BfdHJhY2UiLAorCQkgICAgcWVkX2RiZ19tY3BfdHJhY2VfZ2V0X2R1bXBfYnVmX3NpemUsCisJCSAgICBxZWRfZGJnX21jcF90cmFjZV9kdW1wLCBxZWRfcHJpbnRfbWNwX3RyYWNlX3Jlc3VsdHMsCisJCSAgICBxZWRfZ2V0X21jcF90cmFjZV9yZXN1bHRzX2J1Zl9zaXplfSwgeworCSJyZWdfZmlmbyIsCisJCSAgICBxZWRfZGJnX3JlZ19maWZvX2dldF9kdW1wX2J1Zl9zaXplLAorCQkgICAgcWVkX2RiZ19yZWdfZmlmb19kdW1wLCBxZWRfcHJpbnRfcmVnX2ZpZm9fcmVzdWx0cywKKwkJICAgIHFlZF9nZXRfcmVnX2ZpZm9fcmVzdWx0c19idWZfc2l6ZX0sIHsKKwkiaWd1X2ZpZm8iLAorCQkgICAgcWVkX2RiZ19pZ3VfZmlmb19nZXRfZHVtcF9idWZfc2l6ZSwKKwkJICAgIHFlZF9kYmdfaWd1X2ZpZm9fZHVtcCwgcWVkX3ByaW50X2lndV9maWZvX3Jlc3VsdHMsCisJCSAgICBxZWRfZ2V0X2lndV9maWZvX3Jlc3VsdHNfYnVmX3NpemV9LCB7CisJInByb3RlY3Rpb25fb3ZlcnJpZGUiLAorCQkgICAgcWVkX2RiZ19wcm90ZWN0aW9uX292ZXJyaWRlX2dldF9kdW1wX2J1Zl9zaXplLAorCQkgICAgcWVkX2RiZ19wcm90ZWN0aW9uX292ZXJyaWRlX2R1bXAsCisJCSAgICBxZWRfcHJpbnRfcHJvdGVjdGlvbl9vdmVycmlkZV9yZXN1bHRzLAorCQkgICAgcWVkX2dldF9wcm90ZWN0aW9uX292ZXJyaWRlX3Jlc3VsdHNfYnVmX3NpemV9LCB7CisJImZ3X2Fzc2VydHMiLAorCQkgICAgcWVkX2RiZ19md19hc3NlcnRzX2dldF9kdW1wX2J1Zl9zaXplLAorCQkgICAgcWVkX2RiZ19md19hc3NlcnRzX2R1bXAsCisJCSAgICBxZWRfcHJpbnRfZndfYXNzZXJ0c19yZXN1bHRzLAorCQkgICAgcWVkX2dldF9md19hc3NlcnRzX3Jlc3VsdHNfYnVmX3NpemV9LH07CisKK3N0YXRpYyB2b2lkIHFlZF9kYmdfcHJpbnRfZmVhdHVyZSh1OCAqcF90ZXh0X2J1ZiwgdTMyIHRleHRfc2l6ZSkKK3sKKwl1MzIgaSwgcHJlY2lzaW9uID0gODA7CisKKwlpZiAoIXBfdGV4dF9idWYpCisJCXJldHVybjsKKworCXByX25vdGljZSgiXG4lLipzIiwgcHJlY2lzaW9uLCBwX3RleHRfYnVmKTsKKwlmb3IgKGkgPSBwcmVjaXNpb247IGkgPCB0ZXh0X3NpemU7IGkgKz0gcHJlY2lzaW9uKQorCQlwcl9jb250KCIlLipzIiwgcHJlY2lzaW9uLCBwX3RleHRfYnVmICsgaSk7CisJcHJfY29udCgiXG4iKTsKK30KKworI2RlZmluZSBRRURfUkVTVUxUU19CVUZfTUlOX1NJWkUgMTYKKy8qIEdlbmVyaWMgZnVuY3Rpb24gZm9yIGRlY29kaW5nIGRlYnVnIGZlYXR1cmUgaW5mbyAqLworZW51bSBkYmdfc3RhdHVzIGZvcm1hdF9mZWF0dXJlKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICAgIGVudW0gcWVkX2RiZ19mZWF0dXJlcyBmZWF0dXJlX2lkeCkKK3sKKwlzdHJ1Y3QgcWVkX2RiZ19mZWF0dXJlICpmZWF0dXJlID0KKwkgICAgJnBfaHdmbi0+Y2Rldi0+ZGJnX3BhcmFtcy5mZWF0dXJlc1tmZWF0dXJlX2lkeF07CisJdTMyIHRleHRfc2l6ZV9ieXRlcywgbnVsbF9jaGFyX3BvcywgaTsKKwllbnVtIGRiZ19zdGF0dXMgcmM7CisJY2hhciAqdGV4dF9idWY7CisKKwkvKiBDaGVjayBpZiBmZWF0dXJlIHN1cHBvcnRzIGZvcm1hdHRpbmcgY2FwYWJpbGl0eSAqLworCWlmICghcWVkX2ZlYXR1cmVzX2xvb2t1cFtmZWF0dXJlX2lkeF0ucmVzdWx0c19idWZfc2l6ZSkKKwkJcmV0dXJuIERCR19TVEFUVVNfT0s7CisKKwkvKiBPYnRhaW4gc2l6ZSBvZiBmb3JtYXR0ZWQgb3V0cHV0ICovCisJcmMgPSBxZWRfZmVhdHVyZXNfbG9va3VwW2ZlYXR1cmVfaWR4XS4KKwkJcmVzdWx0c19idWZfc2l6ZShwX2h3Zm4sICh1MzIgKilmZWF0dXJlLT5kdW1wX2J1ZiwKKwkJCQkgZmVhdHVyZS0+ZHVtcGVkX2R3b3JkcywgJnRleHRfc2l6ZV9ieXRlcyk7CisJaWYgKHJjICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiByYzsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBhbGxvY2F0ZWQgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIGR3b3JkICg0IGJ5dGVzKSAqLworCW51bGxfY2hhcl9wb3MgPSB0ZXh0X3NpemVfYnl0ZXMgLSAxOworCXRleHRfc2l6ZV9ieXRlcyA9ICh0ZXh0X3NpemVfYnl0ZXMgKyAzKSAmIH4weDM7CisKKwlpZiAodGV4dF9zaXplX2J5dGVzIDwgUUVEX1JFU1VMVFNfQlVGX01JTl9TSVpFKSB7CisJCURQX05PVElDRShwX2h3Zm4tPmNkZXYsCisJCQkgICJmb3JtYXR0ZWQgc2l6ZSBvZiBmZWF0dXJlIHdhcyB0b28gc21hbGwgJWQuIEFib3J0aW5nXG4iLAorCQkJICB0ZXh0X3NpemVfYnl0ZXMpOworCQlyZXR1cm4gREJHX1NUQVRVU19JTlZBTElEX0FSR1M7CisJfQorCisJLyogQWxsb2NhdGUgdGVtcCB0ZXh0IGJ1ZiAqLworCXRleHRfYnVmID0gdnphbGxvYyh0ZXh0X3NpemVfYnl0ZXMpOworCWlmICghdGV4dF9idWYpCisJCXJldHVybiBEQkdfU1RBVFVTX1ZJUlRfTUVNX0FMTE9DX0ZBSUxFRDsKKworCS8qIERlY29kZSBmZWF0dXJlIG9wY29kZXMgdG8gc3RyaW5nIG9uIHRlbXAgYnVmICovCisJcmMgPSBxZWRfZmVhdHVyZXNfbG9va3VwW2ZlYXR1cmVfaWR4XS4KKwkJcHJpbnRfcmVzdWx0cyhwX2h3Zm4sICh1MzIgKilmZWF0dXJlLT5kdW1wX2J1ZiwKKwkJCSAgICAgIGZlYXR1cmUtPmR1bXBlZF9kd29yZHMsIHRleHRfYnVmKTsKKwlpZiAocmMgIT0gREJHX1NUQVRVU19PSykgeworCQl2ZnJlZSh0ZXh0X2J1Zik7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBSZXBsYWNlIHRoZSBvcmlnaW5hbCBudWxsIGNoYXJhY3RlciB3aXRoIGEgJ1xuJyBjaGFyYWN0ZXIuCisJICogVGhlIGJ5dGVzIHRoYXQgd2VyZSBhZGRlZCBhcyBhIHJlc3VsdCBvZiB0aGUgZHdvcmQgYWxpZ25tZW50IGFyZSBhbHNvCisJICogcGFkZGVkIHdpdGggJ1xuJyBjaGFyYWN0ZXJzLgorCSAqLworCWZvciAoaSA9IG51bGxfY2hhcl9wb3M7IGkgPCB0ZXh0X3NpemVfYnl0ZXM7IGkrKykKKwkJdGV4dF9idWZbaV0gPSAnXG4nOworCisJLyogRHVtcCBwcmludGFibGUgZmVhdHVyZSB0byBsb2cgKi8KKwlpZiAocF9od2ZuLT5jZGV2LT5kYmdfcGFyYW1zLnByaW50X2RhdGEpCisJCXFlZF9kYmdfcHJpbnRfZmVhdHVyZSh0ZXh0X2J1ZiwgdGV4dF9zaXplX2J5dGVzKTsKKworCS8qIEZyZWUgdGhlIG9sZCBkdW1wX2J1ZiBhbmQgcG9pbnQgdGhlIGR1bXBfYnVmIHRvIHRoZSBuZXdseSBhbGxvY2FndGVkCisJICogYW5kIGZvcm1hdHRlZCB0ZXh0IGJ1ZmZlci4KKwkgKi8KKwl2ZnJlZShmZWF0dXJlLT5kdW1wX2J1Zik7CisJZmVhdHVyZS0+ZHVtcF9idWYgPSB0ZXh0X2J1ZjsKKwlmZWF0dXJlLT5idWZfc2l6ZSA9IHRleHRfc2l6ZV9ieXRlczsKKwlmZWF0dXJlLT5kdW1wZWRfZHdvcmRzID0gdGV4dF9zaXplX2J5dGVzIC8gNDsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIEdlbmVyaWMgZnVuY3Rpb24gZm9yIHBlcmZvcm1pbmcgdGhlIGR1bXAgb2YgYSBkZWJ1ZyBmZWF0dXJlLiAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJICAgICBlbnVtIHFlZF9kYmdfZmVhdHVyZXMgZmVhdHVyZV9pZHgpCit7CisJc3RydWN0IHFlZF9kYmdfZmVhdHVyZSAqZmVhdHVyZSA9CisJICAgICZwX2h3Zm4tPmNkZXYtPmRiZ19wYXJhbXMuZmVhdHVyZXNbZmVhdHVyZV9pZHhdOworCXUzMiBidWZfc2l6ZV9kd29yZHM7CisJZW51bSBkYmdfc3RhdHVzIHJjOworCisJRFBfTk9USUNFKHBfaHdmbi0+Y2RldiwgIkNvbGxlY3RpbmcgYSBkZWJ1ZyBmZWF0dXJlIFtcIiVzXCJdXG4iLAorCQkgIHFlZF9mZWF0dXJlc19sb29rdXBbZmVhdHVyZV9pZHhdLm5hbWUpOworCisJLyogRHVtcF9idWYgd2FzIGFscmVhZHkgYWxsb2NhdGVkIG5lZWQgdG8gZnJlZSAodGhpcyBjYW4gaGFwcGVuIGlmIGR1bXAKKwkgKiB3YXMgY2FsbGVkIGJ1dCBmaWxlIHdhcyBuZXZlciByZWFkKS4KKwkgKiBXZSBjYW4ndCB1c2UgdGhlIGJ1ZmZlciBhcyBpcyBzaW5jZSBzaXplIG1heSBoYXZlIGNoYW5nZWQuCisJICovCisJaWYgKGZlYXR1cmUtPmR1bXBfYnVmKSB7CisJCXZmcmVlKGZlYXR1cmUtPmR1bXBfYnVmKTsKKwkJZmVhdHVyZS0+ZHVtcF9idWYgPSBOVUxMOworCX0KKworCS8qIEdldCBidWZmZXIgc2l6ZSBmcm9tIGhzaSwgYWxsb2NhdGUgYWNjb3JkaW5nbHksIGFuZCBwZXJmb3JtIHRoZQorCSAqIGR1bXAuCisJICovCisJcmMgPSBxZWRfZmVhdHVyZXNfbG9va3VwW2ZlYXR1cmVfaWR4XS5nZXRfc2l6ZShwX2h3Zm4sIHBfcHR0LAorCQkJCQkJICAgICAgICZidWZfc2l6ZV9kd29yZHMpOworCWlmIChyYyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gcmM7CisJZmVhdHVyZS0+YnVmX3NpemUgPSBidWZfc2l6ZV9kd29yZHMgKiBzaXplb2YodTMyKTsKKwlmZWF0dXJlLT5kdW1wX2J1ZiA9IHZtYWxsb2MoZmVhdHVyZS0+YnVmX3NpemUpOworCWlmICghZmVhdHVyZS0+ZHVtcF9idWYpCisJCXJldHVybiBEQkdfU1RBVFVTX1ZJUlRfTUVNX0FMTE9DX0ZBSUxFRDsKKworCXJjID0gcWVkX2ZlYXR1cmVzX2xvb2t1cFtmZWF0dXJlX2lkeF0uCisJCXBlcmZvcm1fZHVtcChwX2h3Zm4sIHBfcHR0LCAodTMyICopZmVhdHVyZS0+ZHVtcF9idWYsCisJCQkgICAgIGZlYXR1cmUtPmJ1Zl9zaXplIC8gc2l6ZW9mKHUzMiksCisJCQkgICAgICZmZWF0dXJlLT5kdW1wZWRfZHdvcmRzKTsKKworCS8qIElmIG1jcCBpcyBzdHVjayB3ZSBnZXQgREJHX1NUQVRVU19OVlJBTV9HRVRfSU1BR0VfRkFJTEVEIGVycm9yLgorCSAqIEluIHRoaXMgY2FzZSB0aGUgYnVmZmVyIGhvbGRzIHZhbGlkIGJpbmFyeSBkYXRhLCBidXQgd2Ugd29udCBhYmxlCisJICogdG8gcGFyc2UgaXQgKHNpbmNlIHBhcnNpbmcgcmVsaWVzIG9uIGRhdGEgaW4gTlZSQU0gd2hpY2ggaXMgb25seQorCSAqIGFjY2Vzc2libGUgd2hlbiBNRlcgaXMgcmVzcG9uc2l2ZSkuIHNraXAgdGhlIGZvcm1hdHRpbmcgYnV0IHJldHVybgorCSAqIHN1Y2Nlc3Mgc28gdGhhdCBiaW5hcnkgZGF0YSBpcyBwcm92aWRlZC4KKwkgKi8KKwlpZiAocmMgPT0gREJHX1NUQVRVU19OVlJBTV9HRVRfSU1BR0VfRkFJTEVEKQorCQlyZXR1cm4gREJHX1NUQVRVU19PSzsKKworCWlmIChyYyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gcmM7CisKKwkvKiBGb3JtYXQgb3V0cHV0ICovCisJcmMgPSBmb3JtYXRfZmVhdHVyZShwX2h3Zm4sIGZlYXR1cmVfaWR4KTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxZWRfZGJnX2dyYyhzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyLCB1MzIgKm51bV9kdW1wZWRfYnl0ZXMpCit7CisJcmV0dXJuIHFlZF9kYmdfZmVhdHVyZShjZGV2LCBidWZmZXIsIERCR19GRUFUVVJFX0dSQywgbnVtX2R1bXBlZF9ieXRlcyk7Cit9CisKK2ludCBxZWRfZGJnX2dyY19zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCXJldHVybiBxZWRfZGJnX2ZlYXR1cmVfc2l6ZShjZGV2LCBEQkdfRkVBVFVSRV9HUkMpOworfQorCitpbnQgcWVkX2RiZ19pZGxlX2NoayhzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyLCB1MzIgKm51bV9kdW1wZWRfYnl0ZXMpCit7CisJcmV0dXJuIHFlZF9kYmdfZmVhdHVyZShjZGV2LCBidWZmZXIsIERCR19GRUFUVVJFX0lETEVfQ0hLLAorCQkJICAgICAgIG51bV9kdW1wZWRfYnl0ZXMpOworfQorCitpbnQgcWVkX2RiZ19pZGxlX2Noa19zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCXJldHVybiBxZWRfZGJnX2ZlYXR1cmVfc2l6ZShjZGV2LCBEQkdfRkVBVFVSRV9JRExFX0NISyk7Cit9CisKK2ludCBxZWRfZGJnX3JlZ19maWZvKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIsIHUzMiAqbnVtX2R1bXBlZF9ieXRlcykKK3sKKwlyZXR1cm4gcWVkX2RiZ19mZWF0dXJlKGNkZXYsIGJ1ZmZlciwgREJHX0ZFQVRVUkVfUkVHX0ZJRk8sCisJCQkgICAgICAgbnVtX2R1bXBlZF9ieXRlcyk7Cit9CisKK2ludCBxZWRfZGJnX3JlZ19maWZvX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYpCit7CisJcmV0dXJuIHFlZF9kYmdfZmVhdHVyZV9zaXplKGNkZXYsIERCR19GRUFUVVJFX1JFR19GSUZPKTsKK30KKworaW50IHFlZF9kYmdfaWd1X2ZpZm8oc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlciwgdTMyICpudW1fZHVtcGVkX2J5dGVzKQoreworCXJldHVybiBxZWRfZGJnX2ZlYXR1cmUoY2RldiwgYnVmZmVyLCBEQkdfRkVBVFVSRV9JR1VfRklGTywKKwkJCSAgICAgICBudW1fZHVtcGVkX2J5dGVzKTsKK30KKworaW50IHFlZF9kYmdfaWd1X2ZpZm9fc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwlyZXR1cm4gcWVkX2RiZ19mZWF0dXJlX3NpemUoY2RldiwgREJHX0ZFQVRVUkVfSUdVX0ZJRk8pOworfQorCitpbnQgcWVkX2RiZ19wcm90ZWN0aW9uX292ZXJyaWRlKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIsCisJCQkJdTMyICpudW1fZHVtcGVkX2J5dGVzKQoreworCXJldHVybiBxZWRfZGJnX2ZlYXR1cmUoY2RldiwgYnVmZmVyLCBEQkdfRkVBVFVSRV9QUk9URUNUSU9OX09WRVJSSURFLAorCQkJICAgICAgIG51bV9kdW1wZWRfYnl0ZXMpOworfQorCitpbnQgcWVkX2RiZ19wcm90ZWN0aW9uX292ZXJyaWRlX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYpCit7CisJcmV0dXJuIHFlZF9kYmdfZmVhdHVyZV9zaXplKGNkZXYsIERCR19GRUFUVVJFX1BST1RFQ1RJT05fT1ZFUlJJREUpOworfQorCitpbnQgcWVkX2RiZ19md19hc3NlcnRzKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIsCisJCSAgICAgICB1MzIgKm51bV9kdW1wZWRfYnl0ZXMpCit7CisJcmV0dXJuIHFlZF9kYmdfZmVhdHVyZShjZGV2LCBidWZmZXIsIERCR19GRUFUVVJFX0ZXX0FTU0VSVFMsCisJCQkgICAgICAgbnVtX2R1bXBlZF9ieXRlcyk7Cit9CisKK2ludCBxZWRfZGJnX2Z3X2Fzc2VydHNfc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwlyZXR1cm4gcWVkX2RiZ19mZWF0dXJlX3NpemUoY2RldiwgREJHX0ZFQVRVUkVfRldfQVNTRVJUUyk7Cit9CisKK2ludCBxZWRfZGJnX21jcF90cmFjZShzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyLAorCQkgICAgICB1MzIgKm51bV9kdW1wZWRfYnl0ZXMpCit7CisJcmV0dXJuIHFlZF9kYmdfZmVhdHVyZShjZGV2LCBidWZmZXIsIERCR19GRUFUVVJFX01DUF9UUkFDRSwKKwkJCSAgICAgICBudW1fZHVtcGVkX2J5dGVzKTsKK30KKworaW50IHFlZF9kYmdfbWNwX3RyYWNlX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYpCit7CisJcmV0dXJuIHFlZF9kYmdfZmVhdHVyZV9zaXplKGNkZXYsIERCR19GRUFUVVJFX01DUF9UUkFDRSk7Cit9CisKKy8qIERlZmluZXMgdGhlIGFtb3VudCBvZiBieXRlcyBhbGxvY2F0ZWQgZm9yIHJlY29yZGluZyB0aGUgbGVuZ3RoIG9mIGRlYnVnZnMKKyAqIGZlYXR1cmUgYnVmZmVyLgorICovCisjZGVmaW5lIFJFR0RVTVBfSEVBREVSX1NJWkUJCQlzaXplb2YodTMyKQorI2RlZmluZSBSRUdEVU1QX0hFQURFUl9GRUFUVVJFX1NISUZUCQkyNAorI2RlZmluZSBSRUdEVU1QX0hFQURFUl9FTkdJTkVfU0hJRlQJCTMxCisjZGVmaW5lIFJFR0RVTVBfSEVBREVSX09NSVRfRU5HSU5FX1NISUZUCTMwCitlbnVtIGRlYnVnX3ByaW50X2ZlYXR1cmVzIHsKKwlPTERfTU9ERSA9IDAsCisJSURMRV9DSEsgPSAxLAorCUdSQ19EVU1QID0gMiwKKwlNQ1BfVFJBQ0UgPSAzLAorCVJFR19GSUZPID0gNCwKKwlQUk9URUNUSU9OX09WRVJSSURFID0gNSwKKwlJR1VfRklGTyA9IDYsCisJUEhZID0gNywKKwlGV19BU1NFUlRTID0gOCwKK307CisKK3N0YXRpYyB1MzIgcWVkX2NhbGNfcmVnZHVtcF9oZWFkZXIoZW51bSBkZWJ1Z19wcmludF9mZWF0dXJlcyBmZWF0dXJlLAorCQkJCSAgIGludCBlbmdpbmUsIHUzMiBmZWF0dXJlX3NpemUsIHU4IG9taXRfZW5naW5lKQoreworCS8qIEluc2VydCB0aGUgZW5naW5lLCBmZWF0dXJlIGFuZCBtb2RlIGluc2lkZSB0aGUgaGVhZGVyIGFuZCBjb21iaW5lIGl0CisJICogd2l0aCBmZWF0dXJlIHNpemUuCisJICovCisJcmV0dXJuIGZlYXR1cmVfc2l6ZSB8IChmZWF0dXJlIDw8IFJFR0RVTVBfSEVBREVSX0ZFQVRVUkVfU0hJRlQpIHwKKwkgICAgICAgKG9taXRfZW5naW5lIDw8IFJFR0RVTVBfSEVBREVSX09NSVRfRU5HSU5FX1NISUZUKSB8CisJICAgICAgIChlbmdpbmUgPDwgUkVHRFVNUF9IRUFERVJfRU5HSU5FX1NISUZUKTsKK30KKworaW50IHFlZF9kYmdfYWxsX2RhdGEoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlcikKK3sKKwl1OCBjdXJfZW5naW5lLCBvbWl0X2VuZ2luZSA9IDAsIG9yZ19lbmdpbmU7CisJdTMyIG9mZnNldCA9IDAsIGZlYXR1cmVfc2l6ZTsKKwlpbnQgcmM7CisKKwlpZiAoY2Rldi0+bnVtX2h3Zm5zID09IDEpCisJCW9taXRfZW5naW5lID0gMTsKKworCW9yZ19lbmdpbmUgPSBxZWRfZ2V0X2RlYnVnX2VuZ2luZShjZGV2KTsKKwlmb3IgKGN1cl9lbmdpbmUgPSAwOyBjdXJfZW5naW5lIDwgY2Rldi0+bnVtX2h3Zm5zOyBjdXJfZW5naW5lKyspIHsKKwkJLyogQ29sbGVjdCBpZGxlX2Noa3MgYW5kIGdyY0R1bXAgZm9yIGVhY2ggaHcgZnVuY3Rpb24gKi8KKwkJRFBfVkVSQk9TRShjZGV2LCBRRURfTVNHX0RFQlVHLAorCQkJICAgIm9idGFpbmluZyBpZGxlX2NoayBhbmQgZ3JjZHVtcCBmb3IgY3VycmVudCBlbmdpbmVcbiIpOworCQlxZWRfc2V0X2RlYnVnX2VuZ2luZShjZGV2LCBjdXJfZW5naW5lKTsKKworCQkvKiBGaXJzdCBpZGxlX2NoayAqLworCQlyYyA9IHFlZF9kYmdfaWRsZV9jaGsoY2RldiwgKHU4ICopYnVmZmVyICsgb2Zmc2V0ICsKKwkJCQkgICAgICBSRUdEVU1QX0hFQURFUl9TSVpFLCAmZmVhdHVyZV9zaXplKTsKKwkJaWYgKCFyYykgeworCQkJKih1MzIgKikoKHU4ICopYnVmZmVyICsgb2Zmc2V0KSA9CisJCQkgICAgcWVkX2NhbGNfcmVnZHVtcF9oZWFkZXIoSURMRV9DSEssIGN1cl9lbmdpbmUsCisJCQkJCQkgICAgZmVhdHVyZV9zaXplLCBvbWl0X2VuZ2luZSk7CisJCQlvZmZzZXQgKz0gKGZlYXR1cmVfc2l6ZSArIFJFR0RVTVBfSEVBREVSX1NJWkUpOworCQl9IGVsc2UgeworCQkJRFBfRVJSKGNkZXYsICJxZWRfZGJnX2lkbGVfY2hrIGZhaWxlZC4gcmMgPSAlZFxuIiwgcmMpOworCQl9CisKKwkJLyogU2Vjb25kIGlkbGVfY2hrICovCisJCXJjID0gcWVkX2RiZ19pZGxlX2NoayhjZGV2LCAodTggKilidWZmZXIgKyBvZmZzZXQgKworCQkJCSAgICAgIFJFR0RVTVBfSEVBREVSX1NJWkUsICZmZWF0dXJlX3NpemUpOworCQlpZiAoIXJjKSB7CisJCQkqKHUzMiAqKSgodTggKilidWZmZXIgKyBvZmZzZXQpID0KKwkJCSAgICBxZWRfY2FsY19yZWdkdW1wX2hlYWRlcihJRExFX0NISywgY3VyX2VuZ2luZSwKKwkJCQkJCSAgICBmZWF0dXJlX3NpemUsIG9taXRfZW5naW5lKTsKKwkJCW9mZnNldCArPSAoZmVhdHVyZV9zaXplICsgUkVHRFVNUF9IRUFERVJfU0laRSk7CisJCX0gZWxzZSB7CisJCQlEUF9FUlIoY2RldiwgInFlZF9kYmdfaWRsZV9jaGsgZmFpbGVkLiByYyA9ICVkXG4iLCByYyk7CisJCX0KKworCQkvKiByZWdfZmlmbyBkdW1wICovCisJCXJjID0gcWVkX2RiZ19yZWdfZmlmbyhjZGV2LCAodTggKilidWZmZXIgKyBvZmZzZXQgKworCQkJCSAgICAgIFJFR0RVTVBfSEVBREVSX1NJWkUsICZmZWF0dXJlX3NpemUpOworCQlpZiAoIXJjKSB7CisJCQkqKHUzMiAqKSgodTggKilidWZmZXIgKyBvZmZzZXQpID0KKwkJCSAgICBxZWRfY2FsY19yZWdkdW1wX2hlYWRlcihSRUdfRklGTywgY3VyX2VuZ2luZSwKKwkJCQkJCSAgICBmZWF0dXJlX3NpemUsIG9taXRfZW5naW5lKTsKKwkJCW9mZnNldCArPSAoZmVhdHVyZV9zaXplICsgUkVHRFVNUF9IRUFERVJfU0laRSk7CisJCX0gZWxzZSB7CisJCQlEUF9FUlIoY2RldiwgInFlZF9kYmdfcmVnX2ZpZm8gZmFpbGVkLiByYyA9ICVkXG4iLCByYyk7CisJCX0KKworCQkvKiBpZ3VfZmlmbyBkdW1wICovCisJCXJjID0gcWVkX2RiZ19pZ3VfZmlmbyhjZGV2LCAodTggKilidWZmZXIgKyBvZmZzZXQgKworCQkJCSAgICAgIFJFR0RVTVBfSEVBREVSX1NJWkUsICZmZWF0dXJlX3NpemUpOworCQlpZiAoIXJjKSB7CisJCQkqKHUzMiAqKSgodTggKilidWZmZXIgKyBvZmZzZXQpID0KKwkJCSAgICBxZWRfY2FsY19yZWdkdW1wX2hlYWRlcihJR1VfRklGTywgY3VyX2VuZ2luZSwKKwkJCQkJCSAgICBmZWF0dXJlX3NpemUsIG9taXRfZW5naW5lKTsKKwkJCW9mZnNldCArPSAoZmVhdHVyZV9zaXplICsgUkVHRFVNUF9IRUFERVJfU0laRSk7CisJCX0gZWxzZSB7CisJCQlEUF9FUlIoY2RldiwgInFlZF9kYmdfaWd1X2ZpZm8gZmFpbGVkLiByYyA9ICVkIiwgcmMpOworCQl9CisKKwkJLyogcHJvdGVjdGlvbl9vdmVycmlkZSBkdW1wICovCisJCXJjID0gcWVkX2RiZ19wcm90ZWN0aW9uX292ZXJyaWRlKGNkZXYsICh1OCAqKWJ1ZmZlciArIG9mZnNldCArCisJCQkJCQkgUkVHRFVNUF9IRUFERVJfU0laRSwKKwkJCQkJCSAmZmVhdHVyZV9zaXplKTsKKwkJaWYgKCFyYykgeworCQkJKih1MzIgKikoKHU4ICopYnVmZmVyICsgb2Zmc2V0KSA9CisJCQkgICAgcWVkX2NhbGNfcmVnZHVtcF9oZWFkZXIoUFJPVEVDVElPTl9PVkVSUklERSwKKwkJCQkJCSAgICBjdXJfZW5naW5lLAorCQkJCQkJICAgIGZlYXR1cmVfc2l6ZSwgb21pdF9lbmdpbmUpOworCQkJb2Zmc2V0ICs9IChmZWF0dXJlX3NpemUgKyBSRUdEVU1QX0hFQURFUl9TSVpFKTsKKwkJfSBlbHNlIHsKKwkJCURQX0VSUihjZGV2LAorCQkJICAgICAgICJxZWRfZGJnX3Byb3RlY3Rpb25fb3ZlcnJpZGUgZmFpbGVkLiByYyA9ICVkXG4iLAorCQkJICAgICAgIHJjKTsKKwkJfQorCisJCS8qIGZ3X2Fzc2VydHMgZHVtcCAqLworCQlyYyA9IHFlZF9kYmdfZndfYXNzZXJ0cyhjZGV2LCAodTggKilidWZmZXIgKyBvZmZzZXQgKworCQkJCQlSRUdEVU1QX0hFQURFUl9TSVpFLCAmZmVhdHVyZV9zaXplKTsKKwkJaWYgKCFyYykgeworCQkJKih1MzIgKikoKHU4ICopYnVmZmVyICsgb2Zmc2V0KSA9CisJCQkgICAgcWVkX2NhbGNfcmVnZHVtcF9oZWFkZXIoRldfQVNTRVJUUywgY3VyX2VuZ2luZSwKKwkJCQkJCSAgICBmZWF0dXJlX3NpemUsIG9taXRfZW5naW5lKTsKKwkJCW9mZnNldCArPSAoZmVhdHVyZV9zaXplICsgUkVHRFVNUF9IRUFERVJfU0laRSk7CisJCX0gZWxzZSB7CisJCQlEUF9FUlIoY2RldiwgInFlZF9kYmdfZndfYXNzZXJ0cyBmYWlsZWQuIHJjID0gJWRcbiIsCisJCQkgICAgICAgcmMpOworCQl9CisKKwkJLyogR1JDIGR1bXAgLSBtdXN0IGJlIGxhc3QgYmVjYXVzZSB3aGVuIG1jcCBzdHVjayBpdCB3aWxsCisJCSAqIGNsdXR0ZXIgaWRsZV9jaGssIHJlZ19maWZvLCAuLi4KKwkJICovCisJCXJjID0gcWVkX2RiZ19ncmMoY2RldiwgKHU4ICopYnVmZmVyICsgb2Zmc2V0ICsKKwkJCQkgUkVHRFVNUF9IRUFERVJfU0laRSwgJmZlYXR1cmVfc2l6ZSk7CisJCWlmICghcmMpIHsKKwkJCSoodTMyICopKCh1OCAqKWJ1ZmZlciArIG9mZnNldCkgPQorCQkJICAgIHFlZF9jYWxjX3JlZ2R1bXBfaGVhZGVyKEdSQ19EVU1QLCBjdXJfZW5naW5lLAorCQkJCQkJICAgIGZlYXR1cmVfc2l6ZSwgb21pdF9lbmdpbmUpOworCQkJb2Zmc2V0ICs9IChmZWF0dXJlX3NpemUgKyBSRUdEVU1QX0hFQURFUl9TSVpFKTsKKwkJfSBlbHNlIHsKKwkJCURQX0VSUihjZGV2LCAicWVkX2RiZ19ncmMgZmFpbGVkLiByYyA9ICVkIiwgcmMpOworCQl9CisJfQorCisJLyogbWNwX3RyYWNlICovCisJcmMgPSBxZWRfZGJnX21jcF90cmFjZShjZGV2LCAodTggKilidWZmZXIgKyBvZmZzZXQgKworCQkJICAgICAgIFJFR0RVTVBfSEVBREVSX1NJWkUsICZmZWF0dXJlX3NpemUpOworCWlmICghcmMpIHsKKwkJKih1MzIgKikoKHU4ICopYnVmZmVyICsgb2Zmc2V0KSA9CisJCSAgICBxZWRfY2FsY19yZWdkdW1wX2hlYWRlcihNQ1BfVFJBQ0UsIGN1cl9lbmdpbmUsCisJCQkJCSAgICBmZWF0dXJlX3NpemUsIG9taXRfZW5naW5lKTsKKwkJb2Zmc2V0ICs9IChmZWF0dXJlX3NpemUgKyBSRUdEVU1QX0hFQURFUl9TSVpFKTsKKwl9IGVsc2UgeworCQlEUF9FUlIoY2RldiwgInFlZF9kYmdfbWNwX3RyYWNlIGZhaWxlZC4gcmMgPSAlZFxuIiwgcmMpOworCX0KKworCXFlZF9zZXRfZGVidWdfZW5naW5lKGNkZXYsIG9yZ19lbmdpbmUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBxZWRfZGJnX2FsbF9kYXRhX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYpCit7CisJdTggY3VyX2VuZ2luZSwgb3JnX2VuZ2luZTsKKwl1MzIgcmVnc19sZW4gPSAwOworCisJb3JnX2VuZ2luZSA9IHFlZF9nZXRfZGVidWdfZW5naW5lKGNkZXYpOworCWZvciAoY3VyX2VuZ2luZSA9IDA7IGN1cl9lbmdpbmUgPCBjZGV2LT5udW1faHdmbnM7IGN1cl9lbmdpbmUrKykgeworCQkvKiBFbmdpbmUgc3BlY2lmaWMgKi8KKwkJRFBfVkVSQk9TRShjZGV2LCBRRURfTVNHX0RFQlVHLAorCQkJICAgImNhbGN1bGF0aW5nIGlkbGVfY2hrIGFuZCBncmNkdW1wIHJlZ2lzdGVyIGxlbmd0aCBmb3IgY3VycmVudCBlbmdpbmVcbiIpOworCQlxZWRfc2V0X2RlYnVnX2VuZ2luZShjZGV2LCBjdXJfZW5naW5lKTsKKwkJcmVnc19sZW4gKz0gUkVHRFVNUF9IRUFERVJfU0laRSArIHFlZF9kYmdfaWRsZV9jaGtfc2l6ZShjZGV2KSArCisJCQkgICAgUkVHRFVNUF9IRUFERVJfU0laRSArIHFlZF9kYmdfaWRsZV9jaGtfc2l6ZShjZGV2KSArCisJCQkgICAgUkVHRFVNUF9IRUFERVJfU0laRSArIHFlZF9kYmdfZ3JjX3NpemUoY2RldikgKworCQkJICAgIFJFR0RVTVBfSEVBREVSX1NJWkUgKyBxZWRfZGJnX3JlZ19maWZvX3NpemUoY2RldikgKworCQkJICAgIFJFR0RVTVBfSEVBREVSX1NJWkUgKyBxZWRfZGJnX2lndV9maWZvX3NpemUoY2RldikgKworCQkJICAgIFJFR0RVTVBfSEVBREVSX1NJWkUgKworCQkJICAgIHFlZF9kYmdfcHJvdGVjdGlvbl9vdmVycmlkZV9zaXplKGNkZXYpICsKKwkJCSAgICBSRUdEVU1QX0hFQURFUl9TSVpFICsgcWVkX2RiZ19md19hc3NlcnRzX3NpemUoY2Rldik7CisJfQorCisJLyogRW5naW5lIGNvbW1vbiAqLworCXJlZ3NfbGVuICs9IFJFR0RVTVBfSEVBREVSX1NJWkUgKyBxZWRfZGJnX21jcF90cmFjZV9zaXplKGNkZXYpOworCXFlZF9zZXRfZGVidWdfZW5naW5lKGNkZXYsIG9yZ19lbmdpbmUpOworCisJcmV0dXJuIHJlZ3NfbGVuOworfQorCitpbnQgcWVkX2RiZ19mZWF0dXJlKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIsCisJCSAgICBlbnVtIHFlZF9kYmdfZmVhdHVyZXMgZmVhdHVyZSwgdTMyICpudW1fZHVtcGVkX2J5dGVzKQoreworCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0KKwkJJmNkZXYtPmh3Zm5zW2NkZXYtPmRiZ19wYXJhbXMuZW5naW5lX2Zvcl9kZWJ1Z107CisJc3RydWN0IHFlZF9kYmdfZmVhdHVyZSAqcWVkX2ZlYXR1cmUgPQorCQkmY2Rldi0+ZGJnX3BhcmFtcy5mZWF0dXJlc1tmZWF0dXJlXTsKKwllbnVtIGRiZ19zdGF0dXMgZGJnX3JjOworCXN0cnVjdCBxZWRfcHR0ICpwX3B0dDsKKwlpbnQgcmMgPSAwOworCisJLyogQWNxdWlyZSBwdHQgKi8KKwlwX3B0dCA9IHFlZF9wdHRfYWNxdWlyZShwX2h3Zm4pOworCWlmICghcF9wdHQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogR2V0IGR1bXAgKi8KKwlkYmdfcmMgPSBxZWRfZGJnX2R1bXAocF9od2ZuLCBwX3B0dCwgZmVhdHVyZSk7CisJaWYgKGRiZ19yYyAhPSBEQkdfU1RBVFVTX09LKSB7CisJCURQX1ZFUkJPU0UoY2RldiwgUUVEX01TR19ERUJVRywgIiVzXG4iLAorCQkJICAgcWVkX2RiZ19nZXRfc3RhdHVzX3N0cihkYmdfcmMpKTsKKwkJKm51bV9kdW1wZWRfYnl0ZXMgPSAwOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCURQX1ZFUkJPU0UoY2RldiwgUUVEX01TR19ERUJVRywKKwkJICAgImNvcHlpbmcgZGVidWdmcyBmZWF0dXJlIHRvIGV4dGVybmFsIGJ1ZmZlclxuIik7CisJbWVtY3B5KGJ1ZmZlciwgcWVkX2ZlYXR1cmUtPmR1bXBfYnVmLCBxZWRfZmVhdHVyZS0+YnVmX3NpemUpOworCSpudW1fZHVtcGVkX2J5dGVzID0gY2Rldi0+ZGJnX3BhcmFtcy5mZWF0dXJlc1tmZWF0dXJlXS5kdW1wZWRfZHdvcmRzICoKKwkJCSAgICA0OworCitvdXQ6CisJcWVkX3B0dF9yZWxlYXNlKHBfaHdmbiwgcF9wdHQpOworCXJldHVybiByYzsKK30KKworaW50IHFlZF9kYmdfZmVhdHVyZV9zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBlbnVtIHFlZF9kYmdfZmVhdHVyZXMgZmVhdHVyZSkKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiA9CisJCSZjZGV2LT5od2Zuc1tjZGV2LT5kYmdfcGFyYW1zLmVuZ2luZV9mb3JfZGVidWddOworCXN0cnVjdCBxZWRfcHR0ICpwX3B0dCA9IHFlZF9wdHRfYWNxdWlyZShwX2h3Zm4pOworCXN0cnVjdCBxZWRfZGJnX2ZlYXR1cmUgKnFlZF9mZWF0dXJlID0KKwkJJmNkZXYtPmRiZ19wYXJhbXMuZmVhdHVyZXNbZmVhdHVyZV07CisJdTMyIGJ1Zl9zaXplX2R3b3JkczsKKwllbnVtIGRiZ19zdGF0dXMgcmM7CisKKwlpZiAoIXBfcHR0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJjID0gcWVkX2ZlYXR1cmVzX2xvb2t1cFtmZWF0dXJlXS5nZXRfc2l6ZShwX2h3Zm4sIHBfcHR0LAorCQkJCQkJICAgJmJ1Zl9zaXplX2R3b3Jkcyk7CisJaWYgKHJjICE9IERCR19TVEFUVVNfT0spCisJCWJ1Zl9zaXplX2R3b3JkcyA9IDA7CisKKwlxZWRfcHR0X3JlbGVhc2UocF9od2ZuLCBwX3B0dCk7CisJcWVkX2ZlYXR1cmUtPmJ1Zl9zaXplID0gYnVmX3NpemVfZHdvcmRzICogc2l6ZW9mKHUzMik7CisJcmV0dXJuIHFlZF9mZWF0dXJlLT5idWZfc2l6ZTsKK30KKwordTggcWVkX2dldF9kZWJ1Z19lbmdpbmUoc3RydWN0IHFlZF9kZXYgKmNkZXYpCit7CisJcmV0dXJuIGNkZXYtPmRiZ19wYXJhbXMuZW5naW5lX2Zvcl9kZWJ1ZzsKK30KKwordm9pZCBxZWRfc2V0X2RlYnVnX2VuZ2luZShzdHJ1Y3QgcWVkX2RldiAqY2RldiwgaW50IGVuZ2luZV9udW1iZXIpCit7CisJRFBfVkVSQk9TRShjZGV2LCBRRURfTVNHX0RFQlVHLCAic2V0IGRlYnVnIGVuZ2luZSB0byAlZFxuIiwKKwkJICAgZW5naW5lX251bWJlcik7CisJY2Rldi0+ZGJnX3BhcmFtcy5lbmdpbmVfZm9yX2RlYnVnID0gZW5naW5lX251bWJlcjsKK30KKwordm9pZCBxZWRfZGJnX3BmX2luaXQoc3RydWN0IHFlZF9kZXYgKmNkZXYpCit7CisJY29uc3QgdTggKmRiZ192YWx1ZXM7CisKKwkvKiBEZWJ1ZyB2YWx1ZXMgYXJlIGFmdGVyIGluaXQgdmFsdWVzLgorCSAqIFRoZSBvZmZzZXQgaXMgdGhlIGZpcnN0IGR3b3JkIG9mIHRoZSBmaWxlLgorCSAqLworCWRiZ192YWx1ZXMgPSBjZGV2LT5maXJtd2FyZS0+ZGF0YSArICoodTMyICopY2Rldi0+ZmlybXdhcmUtPmRhdGE7CisJcWVkX2RiZ19zZXRfYmluX3B0cigodTggKilkYmdfdmFsdWVzKTsKKwlxZWRfZGJnX3VzZXJfc2V0X2Jpbl9wdHIoKHU4ICopZGJnX3ZhbHVlcyk7Cit9CisKK3ZvaWQgcWVkX2RiZ19wZl9leGl0KHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCXN0cnVjdCBxZWRfZGJnX2ZlYXR1cmUgKmZlYXR1cmUgPSBOVUxMOworCWVudW0gcWVkX2RiZ19mZWF0dXJlcyBmZWF0dXJlX2lkeDsKKworCS8qIERlYnVnIGZlYXR1cmVzJyBidWZmZXJzIG1heSBiZSBhbGxvY2F0ZWQgaWYgZGVidWcgZmVhdHVyZSB3YXMgdXNlZAorCSAqIGJ1dCBkdW1wIHdhc24ndCBjYWxsZWQuCisJICovCisJZm9yIChmZWF0dXJlX2lkeCA9IDA7IGZlYXR1cmVfaWR4IDwgREJHX0ZFQVRVUkVfTlVNOyBmZWF0dXJlX2lkeCsrKSB7CisJCWZlYXR1cmUgPSAmY2Rldi0+ZGJnX3BhcmFtcy5mZWF0dXJlc1tmZWF0dXJlX2lkeF07CisJCWlmIChmZWF0dXJlLT5kdW1wX2J1ZikgeworCQkJdmZyZWUoZmVhdHVyZS0+ZHVtcF9idWYpOworCQkJZmVhdHVyZS0+ZHVtcF9idWYgPSBOVUxMOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGVidWcuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg3MmQ3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2RlYnVnLmgKQEAgLTAsMCArMSw1NCBAQAorLyogUUxvZ2ljIHFlZCBOSUMgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaWZuZGVmIF9RRURfREVCVUdGU19ICisjZGVmaW5lIF9RRURfREVCVUdGU19ICisKK2VudW0gcWVkX2RiZ19mZWF0dXJlcyB7CisJREJHX0ZFQVRVUkVfR1JDLAorCURCR19GRUFUVVJFX0lETEVfQ0hLLAorCURCR19GRUFUVVJFX01DUF9UUkFDRSwKKwlEQkdfRkVBVFVSRV9SRUdfRklGTywKKwlEQkdfRkVBVFVSRV9JR1VfRklGTywKKwlEQkdfRkVBVFVSRV9QUk9URUNUSU9OX09WRVJSSURFLAorCURCR19GRUFUVVJFX0ZXX0FTU0VSVFMsCisJREJHX0ZFQVRVUkVfTlVNCit9OworCitpbnQgcWVkX2RiZ19ncmMoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlciwgdTMyICpudW1fZHVtcGVkX2J5dGVzKTsKK2ludCBxZWRfZGJnX2dyY19zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2KTsKK2ludCBxZWRfZGJnX2lkbGVfY2hrKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIsCisJCSAgICAgdTMyICpudW1fZHVtcGVkX2J5dGVzKTsKK2ludCBxZWRfZGJnX2lkbGVfY2hrX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYpOworaW50IHFlZF9kYmdfcmVnX2ZpZm8oc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlciwKKwkJICAgICB1MzIgKm51bV9kdW1wZWRfYnl0ZXMpOworaW50IHFlZF9kYmdfcmVnX2ZpZm9fc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2Rldik7CitpbnQgcWVkX2RiZ19pZ3VfZmlmbyhzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyLAorCQkgICAgIHUzMiAqbnVtX2R1bXBlZF9ieXRlcyk7CitpbnQgcWVkX2RiZ19pZ3VfZmlmb19zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2KTsKK2ludCBxZWRfZGJnX3Byb3RlY3Rpb25fb3ZlcnJpZGUoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlciwKKwkJCQl1MzIgKm51bV9kdW1wZWRfYnl0ZXMpOworaW50IHFlZF9kYmdfcHJvdGVjdGlvbl9vdmVycmlkZV9zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2KTsKK2ludCBxZWRfZGJnX2Z3X2Fzc2VydHMoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlciwKKwkJICAgICAgIHUzMiAqbnVtX2R1bXBlZF9ieXRlcyk7CitpbnQgcWVkX2RiZ19md19hc3NlcnRzX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYpOworaW50IHFlZF9kYmdfbWNwX3RyYWNlKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIsCisJCSAgICAgIHUzMiAqbnVtX2R1bXBlZF9ieXRlcyk7CitpbnQgcWVkX2RiZ19tY3BfdHJhY2Vfc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2Rldik7CitpbnQgcWVkX2RiZ19hbGxfZGF0YShzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyKTsKK2ludCBxZWRfZGJnX2FsbF9kYXRhX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYpOwordTggcWVkX2dldF9kZWJ1Z19lbmdpbmUoc3RydWN0IHFlZF9kZXYgKmNkZXYpOwordm9pZCBxZWRfc2V0X2RlYnVnX2VuZ2luZShzdHJ1Y3QgcWVkX2RldiAqY2RldiwgaW50IGVuZ2luZV9udW1iZXIpOworaW50IHFlZF9kYmdfZmVhdHVyZShzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyLAorCQkgICAgZW51bSBxZWRfZGJnX2ZlYXR1cmVzIGZlYXR1cmUsIHUzMiAqbnVtX2R1bXBlZF9ieXRlcyk7CitpbnQgcWVkX2RiZ19mZWF0dXJlX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYsIGVudW0gcWVkX2RiZ19mZWF0dXJlcyBmZWF0dXJlKTsKKwordm9pZCBxZWRfZGJnX3BmX2luaXQoc3RydWN0IHFlZF9kZXYgKmNkZXYpOwordm9pZCBxZWRfZGJnX3BmX2V4aXQoc3RydWN0IHFlZF9kZXYgKmNkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2Rldi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGV2LmMKaW5kZXggMGU0ZjRhOS4uNzU0ZjZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGV2LmMKQEAgLTI5LDE0ICsyOSwxOCBAQAogI2luY2x1ZGUgInFlZF9ody5oIgogI2luY2x1ZGUgInFlZF9pbml0X29wcy5oIgogI2luY2x1ZGUgInFlZF9pbnQuaCIKKyNpbmNsdWRlICJxZWRfbGwyLmgiCiAjaW5jbHVkZSAicWVkX21jcC5oIgogI2luY2x1ZGUgInFlZF9yZWdfYWRkci5oIgogI2luY2x1ZGUgInFlZF9zcC5oIgogI2luY2x1ZGUgInFlZF9zcmlvdi5oIgogI2luY2x1ZGUgInFlZF92Zi5oIgorI2luY2x1ZGUgInFlZF9yb2NlLmgiCiAKLXN0YXRpYyBzcGlubG9ja190IHFtX2xvY2s7Ci1zdGF0aWMgYm9vbCBxbV9sb2NrX2luaXQgPSBmYWxzZTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socW1fbG9jayk7CisKKyNkZWZpbmUgUUVEX01JTl9EUElTICAgICAgICAgICAgKDQpCisjZGVmaW5lIFFFRF9NSU5fUFdNX1JFR0lPTiAgICAgIChRRURfV0lEX1NJWkUgKiBRRURfTUlOX0RQSVMpCiAKIC8qIEFQSSBjb21tb24gdG8gYWxsIHByb3RvY29scyAqLwogZW51bSBCQVJfSUQgewpAQCAtNDQsOCArNDgsNyBAQAogCUJBUl9JRF8xICAgICAgICAvKiBVc2VkIGZvciBkb29yYmVsbHMgKi8KIH07CiAKLXN0YXRpYyB1MzIgcWVkX2h3X2Jhcl9zaXplKHN0cnVjdCBxZWRfaHdmbgkqcF9od2ZuLAotCQkJICAgZW51bSBCQVJfSUQJCWJhcl9pZCkKK3N0YXRpYyB1MzIgcWVkX2h3X2Jhcl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBlbnVtIEJBUl9JRCBiYXJfaWQpCiB7CiAJdTMyIGJhcl9yZWcgPSAoYmFyX2lkID09IEJBUl9JRF8wID8KIAkJICAgICAgIFBHTFVFX0JfUkVHX1BGX0JBUjBfU0laRSA6IFBHTFVFX0JfUkVHX1BGX0JBUjFfU0laRSk7CkBAIC03MCw4ICs3Myw3IEBACiAJfQogfQogCi12b2lkIHFlZF9pbml0X2RwKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAotCQkgdTMyIGRwX21vZHVsZSwgdTggZHBfbGV2ZWwpCit2b2lkIHFlZF9pbml0X2RwKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB1MzIgZHBfbW9kdWxlLCB1OCBkcF9sZXZlbCkKIHsKIAl1MzIgaTsKIApAQCAtMTUwLDYgKzE1Miw5IEBACiAJCXFlZF9lcV9mcmVlKHBfaHdmbiwgcF9od2ZuLT5wX2VxKTsKIAkJcWVkX2NvbnNxX2ZyZWUocF9od2ZuLCBwX2h3Zm4tPnBfY29uc3EpOwogCQlxZWRfaW50X2ZyZWUocF9od2ZuKTsKKyNpZmRlZiBDT05GSUdfUUVEX0xMMgorCQlxZWRfbGwyX2ZyZWUocF9od2ZuLCBwX2h3Zm4tPnBfbGwyX2luZm8pOworI2VuZGlmCiAJCXFlZF9pb3ZfZnJlZShwX2h3Zm4pOwogCQlxZWRfZG1hZV9pbmZvX2ZyZWUocF9od2ZuKTsKIAkJcWVkX2RjYnhfaW5mb19mcmVlKHBfaHdmbiwgcF9od2ZuLT5wX2RjYnhfaW5mbyk7CkBAIC0zNDMsNyArMzQ4LDYgQEAKIAlyZXR1cm4gMDsKIAogYWxsb2NfZXJyOgotCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBRTSBwYXJhbXNcbiIpOwogCXFlZF9xbV9pbmZvX2ZyZWUocF9od2ZuKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KQEAgLTQwNyw2ICs0MTEsOSBAQAogCiBpbnQgcWVkX3Jlc2NfYWxsb2Moc3RydWN0IHFlZF9kZXYgKmNkZXYpCiB7CisjaWZkZWYgQ09ORklHX1FFRF9MTDIKKwlzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9pbmZvOworI2VuZGlmCiAJc3RydWN0IHFlZF9jb25zcSAqcF9jb25zcTsKIAlzdHJ1Y3QgcWVkX2VxICpwX2VxOwogCWludCBpLCByYyA9IDA7CkBAIC00MjcsMTggKzQzNCwxMiBAQAogCQkJCSAgICAgUkVTQ19OVU0ocF9od2ZuLCBRRURfTDJfUVVFVUUpOwogCiAJCXBfaHdmbi0+cF90eF9jaWRzID0ga3phbGxvYyh0eF9zaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwX2h3Zm4tPnBfdHhfY2lkcykgewotCQkJRFBfTk9USUNFKHBfaHdmbiwKLQkJCQkgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBUeCBDaWRzXG4iKTsKKwkJaWYgKCFwX2h3Zm4tPnBfdHhfY2lkcykKIAkJCWdvdG8gYWxsb2Nfbm9fbWVtOwotCQl9CiAKIAkJcF9od2ZuLT5wX3J4X2NpZHMgPSBremFsbG9jKHJ4X3NpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoIXBfaHdmbi0+cF9yeF9jaWRzKSB7Ci0JCQlEUF9OT1RJQ0UocF9od2ZuLAotCQkJCSAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFJ4IENpZHNcbiIpOworCQlpZiAoIXBfaHdmbi0+cF9yeF9jaWRzKQogCQkJZ290byBhbGxvY19ub19tZW07Ci0JCX0KIAl9CiAKIAlmb3JfZWFjaF9od2ZuKGNkZXYsIGkpIHsKQEAgLTUyMywyOSArNTI0LDI5IEBACiAJCQlnb3RvIGFsbG9jX25vX21lbTsKIAkJcF9od2ZuLT5wX2NvbnNxID0gcF9jb25zcTsKIAorI2lmZGVmIENPTkZJR19RRURfTEwyCisJCWlmIChwX2h3Zm4tPnVzaW5nX2xsMikgeworCQkJcF9sbDJfaW5mbyA9IHFlZF9sbDJfYWxsb2MocF9od2ZuKTsKKwkJCWlmICghcF9sbDJfaW5mbykKKwkJCQlnb3RvIGFsbG9jX25vX21lbTsKKwkJCXBfaHdmbi0+cF9sbDJfaW5mbyA9IHBfbGwyX2luZm87CisJCX0KKyNlbmRpZgorCiAJCS8qIERNQSBpbmZvIGluaXRpYWxpemF0aW9uICovCiAJCXJjID0gcWVkX2RtYWVfaW5mb19hbGxvYyhwX2h3Zm4pOwotCQlpZiAocmMpIHsKLQkJCURQX05PVElDRShwX2h3Zm4sCi0JCQkJICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZG1hZV9pbmZvIHN0cnVjdHVyZVxuIik7CisJCWlmIChyYykKIAkJCWdvdG8gYWxsb2NfZXJyOwotCQl9CiAKIAkJLyogRENCWCBpbml0aWFsaXphdGlvbiAqLwogCQlyYyA9IHFlZF9kY2J4X2luZm9fYWxsb2MocF9od2ZuKTsKLQkJaWYgKHJjKSB7Ci0JCQlEUF9OT1RJQ0UocF9od2ZuLAotCQkJCSAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRjYnggc3RydWN0dXJlXG4iKTsKKwkJaWYgKHJjKQogCQkJZ290byBhbGxvY19lcnI7Ci0JCX0KIAl9CiAKIAljZGV2LT5yZXNldF9zdGF0cyA9IGt6YWxsb2Moc2l6ZW9mKCpjZGV2LT5yZXNldF9zdGF0cyksIEdGUF9LRVJORUwpOwotCWlmICghY2Rldi0+cmVzZXRfc3RhdHMpIHsKLQkJRFBfTk9USUNFKGNkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVzZXQgc3RhdGlzdGljc1xuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBhbGxvY19lcnI7Ci0JfQorCWlmICghY2Rldi0+cmVzZXRfc3RhdHMpCisJCWdvdG8gYWxsb2Nfbm9fbWVtOwogCiAJcmV0dXJuIDA7CiAKQEAgLTU4MCw2ICs1ODEsMTAgQEAKIAkJcWVkX2ludF9zZXR1cChwX2h3Zm4sIHBfaHdmbi0+cF9tYWluX3B0dCk7CiAKIAkJcWVkX2lvdl9zZXR1cChwX2h3Zm4sIHBfaHdmbi0+cF9tYWluX3B0dCk7CisjaWZkZWYgQ09ORklHX1FFRF9MTDIKKwkJaWYgKHBfaHdmbi0+dXNpbmdfbGwyKQorCQkJcWVkX2xsMl9zZXR1cChwX2h3Zm4sIHBfaHdmbi0+cF9sbDJfaW5mbyk7CisjZW5kaWYKIAl9CiB9CiAKQEAgLTYwNSw5ICs2MTAsOCBAQAogCiAJLyogTWFrZSBzdXJlIG5vdGlmaWNhdGlvbiBpcyBub3Qgc2V0IGJlZm9yZSBpbml0aWF0aW5nIGZpbmFsIGNsZWFudXAgKi8KIAlpZiAoUkVHX1JEKHBfaHdmbiwgYWRkcikpIHsKLQkJRFBfTk9USUNFKAotCQkJcF9od2ZuLAotCQkJIlVuZXhwZWN0ZWQ7IEZvdW5kIGZpbmFsIGNsZWFudXAgbm90aWZpY2F0aW9uIGJlZm9yZSBpbml0aWF0aW5nIGZpbmFsIGNsZWFudXBcbiIpOworCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAiVW5leHBlY3RlZDsgRm91bmQgZmluYWwgY2xlYW51cCBub3RpZmljYXRpb24gYmVmb3JlIGluaXRpYXRpbmcgZmluYWwgY2xlYW51cFxuIik7CiAJCVJFR19XUihwX2h3Zm4sIGFkZHIsIDApOwogCX0KIApAQCAtNzAxLDE3ICs3MDUsMTQgQEAKIAkJCQljb250aW51ZTsKIAogCQkJcWVkX2luaXRfY2F1X3NiX2VudHJ5KHBfaHdmbiwgJnNiX2VudHJ5LAotCQkJCQkgICAgICBwX2Jsb2NrLT5mdW5jdGlvbl9pZCwKLQkJCQkJICAgICAgMCwgMCk7Ci0JCQlTVE9SRV9SVF9SRUdfQUdHKHBfaHdmbiwgb2Zmc2V0ICsgc2JfaWQgKiAyLAotCQkJCQkgc2JfZW50cnkpOworCQkJCQkgICAgICBwX2Jsb2NrLT5mdW5jdGlvbl9pZCwgMCwgMCk7CisJCQlTVE9SRV9SVF9SRUdfQUdHKHBfaHdmbiwgb2Zmc2V0ICsgc2JfaWQgKiAyLCBzYl9lbnRyeSk7CiAJCX0KIAl9CiB9CiAKIHN0YXRpYyBpbnQgcWVkX2h3X2luaXRfY29tbW9uKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkJICAgICAgaW50IGh3X21vZGUpCisJCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIGludCBod19tb2RlKQogewogCXN0cnVjdCBxZWRfcW1faW5mbyAqcW1faW5mbyA9ICZwX2h3Zm4tPnFtX2luZm87CiAJc3RydWN0IHFlZF9xbV9jb21tb25fcnRfaW5pdF9wYXJhbXMgcGFyYW1zOwpAQCAtNzU5LDcgKzc2MCw3IEBACiAJcWVkX3BvcnRfdW5wcmV0ZW5kKHBfaHdmbiwgcF9wdHQpOwogCiAJcmMgPSBxZWRfaW5pdF9ydW4ocF9od2ZuLCBwX3B0dCwgUEhBU0VfRU5HSU5FLCBBTllfUEhBU0VfSUQsIGh3X21vZGUpOwotCWlmIChyYyAhPSAwKQorCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCiAJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIFBTV1JRMl9SRUdfTDJQX1ZBTElEQVRFX1ZGSUQsIDApOwpAQCAtNzgwLDYgKzc4MSw5IEBACiAJCWNvbmNyZXRlX2ZpZCA9IHFlZF92ZmlkX3RvX2NvbmNyZXRlKHBfaHdmbiwgdmZfaWQpOwogCQlxZWRfZmlkX3ByZXRlbmQocF9od2ZuLCBwX3B0dCwgKHUxNikgY29uY3JldGVfZmlkKTsKIAkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIENDRkNfUkVHX1NUUk9OR19FTkFCTEVfVkYsIDB4MSk7CisJCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBDQ0ZDX1JFR19XRUFLX0VOQUJMRV9WRiwgMHgwKTsKKwkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIFRDRkNfUkVHX1NUUk9OR19FTkFCTEVfVkYsIDB4MSk7CisJCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBUQ0ZDX1JFR19XRUFLX0VOQUJMRV9WRiwgMHgwKTsKIAl9CiAJLyogcHJldGVuZCB0byBvcmlnaW5hbCBQRiAqLwogCXFlZF9maWRfcHJldGVuZChwX2h3Zm4sIHBfcHR0LCBwX2h3Zm4tPnJlbF9wZl9pZCk7CkBAIC03ODcsMzggKzc5MSwxNDEgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgcWVkX2h3X2luaXRfcG9ydChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCi0JCQkgICAgaW50IGh3X21vZGUpCitzdGF0aWMgaW50CitxZWRfaHdfaW5pdF9kcGlfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiBwd21fcmVnaW9uX3NpemUsIHUzMiBuX2NwdXMpCiB7CisJdTMyIGRwaV9wYWdlX3NpemVfMSwgZHBpX3BhZ2Vfc2l6ZV8yLCBkcGlfcGFnZV9zaXplOworCXUzMiBkcGlfYml0X3NoaWZ0LCBkcGlfY291bnQ7CisJdTMyIG1pbl9kcGlzOworCisJLyogQ2FsY3VsYXRlIERQSSBzaXplICovCisJZHBpX3BhZ2Vfc2l6ZV8xID0gUUVEX1dJRF9TSVpFICogbl9jcHVzOworCWRwaV9wYWdlX3NpemVfMiA9IG1heF90KHUzMiwgUUVEX1dJRF9TSVpFLCBQQUdFX1NJWkUpOworCWRwaV9wYWdlX3NpemUgPSBtYXhfdCh1MzIsIGRwaV9wYWdlX3NpemVfMSwgZHBpX3BhZ2Vfc2l6ZV8yKTsKKwlkcGlfcGFnZV9zaXplID0gcm91bmR1cF9wb3dfb2ZfdHdvKGRwaV9wYWdlX3NpemUpOworCWRwaV9iaXRfc2hpZnQgPSBpbG9nMihkcGlfcGFnZV9zaXplIC8gNDA5Nik7CisKKwlkcGlfY291bnQgPSBwd21fcmVnaW9uX3NpemUgLyBkcGlfcGFnZV9zaXplOworCisJbWluX2RwaXMgPSBwX2h3Zm4tPnBmX3BhcmFtcy5yZG1hX3BmX3BhcmFtcy5taW5fZHBpczsKKwltaW5fZHBpcyA9IG1heF90KHUzMiwgUUVEX01JTl9EUElTLCBtaW5fZHBpcyk7CisKKwlwX2h3Zm4tPmRwaV9zaXplID0gZHBpX3BhZ2Vfc2l6ZTsKKwlwX2h3Zm4tPmRwaV9jb3VudCA9IGRwaV9jb3VudDsKKworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBET1JRX1JFR19QRl9EUElfQklUX1NISUZULCBkcGlfYml0X3NoaWZ0KTsKKworCWlmIChkcGlfY291bnQgPCBtaW5fZHBpcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworZW51bSBRRURfUk9DRV9FRFBNX01PREUgeworCVFFRF9ST0NFX0VEUE1fTU9ERV9FTkFCTEUgPSAwLAorCVFFRF9ST0NFX0VEUE1fTU9ERV9GT1JDRV9PTiA9IDEsCisJUUVEX1JPQ0VfRURQTV9NT0RFX0RJU0FCTEUgPSAyLAorfTsKKworc3RhdGljIGludAorcWVkX2h3X2luaXRfcGZfZG9vcmJlbGxfYmFyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCit7CisJdTMyIHB3bV9yZWdzaXplLCBub3JtX3JlZ3NpemU7CisJdTMyIG5vbl9wd21fY29ubiwgbWluX2FkZHJfcmVnMTsKKwl1MzIgZGJfYmFyX3NpemUsIG5fY3B1czsKKwl1MzIgcm9jZV9lZHBtX21vZGU7CisJdTMyIHBmX2RlbXNfc2hpZnQ7CiAJaW50IHJjID0gMDsKKwl1OCBjb25kOwogCi0JcmMgPSBxZWRfaW5pdF9ydW4ocF9od2ZuLCBwX3B0dCwgUEhBU0VfUE9SVCwgcF9od2ZuLT5wb3J0X2lkLCBod19tb2RlKTsKLQlpZiAocmMgIT0gMCkKLQkJcmV0dXJuIHJjOworCWRiX2Jhcl9zaXplID0gcWVkX2h3X2Jhcl9zaXplKHBfaHdmbiwgQkFSX0lEXzEpOworCWlmIChwX2h3Zm4tPmNkZXYtPm51bV9od2ZucyA+IDEpCisJCWRiX2Jhcl9zaXplIC89IDI7CiAKLQlpZiAoaHdfbW9kZSAmICgxIDw8IE1PREVfTUZfU0kpKSB7Ci0JCXU4IHBmX2lkID0gMDsKKwkvKiBDYWxjdWxhdGUgZG9vcmJlbGwgcmVnaW9ucyAqLworCW5vbl9wd21fY29ubiA9IHFlZF9jeHRfZ2V0X3Byb3RvX2NpZF9zdGFydChwX2h3Zm4sIFBST1RPQ09MSURfQ09SRSkgKworCQkgICAgICAgcWVkX2N4dF9nZXRfcHJvdG9fY2lkX2NvdW50KHBfaHdmbiwgUFJPVE9DT0xJRF9DT1JFLAorCQkJCQkJICAgTlVMTCkgKworCQkgICAgICAgcWVkX2N4dF9nZXRfcHJvdG9fY2lkX2NvdW50KHBfaHdmbiwgUFJPVE9DT0xJRF9FVEgsCisJCQkJCQkgICBOVUxMKTsKKwlub3JtX3JlZ3NpemUgPSByb3VuZHVwKFFFRF9QRl9ERU1TX1NJWkUgKiBub25fcHdtX2Nvbm4sIDQwOTYpOworCW1pbl9hZGRyX3JlZzEgPSBub3JtX3JlZ3NpemUgLyA0MDk2OworCXB3bV9yZWdzaXplID0gZGJfYmFyX3NpemUgLSBub3JtX3JlZ3NpemU7CiAKLQkJaWYgKCFxZWRfaHdfaW5pdF9maXJzdF9ldGgocF9od2ZuLCBwX3B0dCwgJnBmX2lkKSkgewotCQkJRFBfVkVSQk9TRShwX2h3Zm4sIE5FVElGX01TR19JRlVQLAotCQkJCSAgICJQRlslMDh4XSBpcyBmaXJzdCBldGggb24gZW5naW5lXG4iLCBwZl9pZCk7Ci0KLQkJCS8qIFdlIHNob3VsZCBoYXZlIGNvbmZpZ3VyZWQgQklUIGZvciBwcGZpZCwgaS5lLiwgdGhlCi0JCQkgKiByZWxhdGl2ZSBmdW5jdGlvbiBudW1iZXIgaW4gdGhlIHBvcnQuIEJ1dCB0aGVyZSdzIGEKLQkJCSAqIGJ1ZyBpbiBMTEggaW4gQkIgd2hlcmUgdGhlIHBwZmlkIGlzIGFjdHVhbGx5IGVuZ2luZQotCQkJICogYmFzZWQsIHNvIHdlIG5lZWQgdG8gdGFrZSB0aGlzIGludG8gYWNjb3VudC4KLQkJCSAqLwotCQkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsCi0JCQkgICAgICAgTklHX1JFR19MTEhfVEFHTUFDX0RFRl9QRl9WRUNUT1IsIDEgPDwgcGZfaWQpOwotCQl9Ci0KLQkJLyogVGFrZSB0aGUgcHJvdG9jb2wtYmFzZWQgaGl0IHZlY3RvciBpZiB0aGVyZSBpcyBhIGhpdCwKLQkJICogb3RoZXJ3aXNlIHRha2UgdGhlIG90aGVyIHZlY3Rvci4KLQkJICovCi0JCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBOSUdfUkVHX0xMSF9DTFNfVFlQRV9EVUFMTU9ERSwgMHgyKTsKKwkvKiBDaGVjayB0aGF0IHRoZSBub3JtYWwgYW5kIFBXTSBzaXplcyBhcmUgdmFsaWQgKi8KKwlpZiAoZGJfYmFyX3NpemUgPCBub3JtX3JlZ3NpemUpIHsKKwkJRFBfRVJSKHBfaHdmbi0+Y2RldiwKKwkJICAgICAgICJEb29yYmVsbCBCQVIgc2l6ZSAweCV4IGlzIHRvbyBzbWFsbCAobm9ybWFsIHJlZ2lvbiBpcyAweCUweCApXG4iLAorCQkgICAgICAgZGJfYmFyX3NpemUsIG5vcm1fcmVnc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KLQlyZXR1cm4gcmM7CisKKwlpZiAocHdtX3JlZ3NpemUgPCBRRURfTUlOX1BXTV9SRUdJT04pIHsKKwkJRFBfRVJSKHBfaHdmbi0+Y2RldiwKKwkJICAgICAgICJQV00gcmVnaW9uIHNpemUgMHglMHggaXMgdG9vIHNtYWxsLiBTaG91bGQgYmUgYXQgbGVhc3QgMHglMHggKERvb3JiZWxsIEJBUiBzaXplIGlzIDB4JXggYW5kIG5vcm1hbCByZWdpb24gc2l6ZSBpcyAweCUweClcbiIsCisJCSAgICAgICBwd21fcmVnc2l6ZSwKKwkJICAgICAgIFFFRF9NSU5fUFdNX1JFR0lPTiwgZGJfYmFyX3NpemUsIG5vcm1fcmVnc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgRFBJcyAqLworCXJvY2VfZWRwbV9tb2RlID0gcF9od2ZuLT5wZl9wYXJhbXMucmRtYV9wZl9wYXJhbXMucm9jZV9lZHBtX21vZGU7CisJaWYgKChyb2NlX2VkcG1fbW9kZSA9PSBRRURfUk9DRV9FRFBNX01PREVfRU5BQkxFKSB8fAorCSAgICAoKHJvY2VfZWRwbV9tb2RlID09IFFFRF9ST0NFX0VEUE1fTU9ERV9GT1JDRV9PTikpKSB7CisJCS8qIEVpdGhlciBFRFBNIGlzIG1hbmRhdG9yeSwgb3Igd2UgYXJlIGF0dGVtcHRpbmcgdG8gYWxsb2NhdGUgYQorCQkgKiBXSUQgcGVyIENQVS4KKwkJICovCisJCW5fY3B1cyA9IG51bV9hY3RpdmVfY3B1cygpOworCQlyYyA9IHFlZF9od19pbml0X2RwaV9zaXplKHBfaHdmbiwgcF9wdHQsIHB3bV9yZWdzaXplLCBuX2NwdXMpOworCX0KKworCWNvbmQgPSAocmMgJiYgKHJvY2VfZWRwbV9tb2RlID09IFFFRF9ST0NFX0VEUE1fTU9ERV9FTkFCTEUpKSB8fAorCSAgICAgICAocm9jZV9lZHBtX21vZGUgPT0gUUVEX1JPQ0VfRURQTV9NT0RFX0RJU0FCTEUpOworCWlmIChjb25kIHx8IHBfaHdmbi0+ZGNieF9ub19lZHBtKSB7CisJCS8qIEVpdGhlciBFRFBNIGlzIGRpc2FibGVkIGZyb20gdXNlciBjb25maWd1cmF0aW9uLCBvciBpdCBpcworCQkgKiBkaXNhYmxlZCB2aWEgRENCeCwgb3IgaXQgaXMgbm90IG1hbmRhdG9yeSBhbmQgd2UgZmFpbGVkIHRvCisJCSAqIGFsbG9jYXRlZCBhIFdJRCBwZXIgQ1BVLgorCQkgKi8KKwkJbl9jcHVzID0gMTsKKwkJcmMgPSBxZWRfaHdfaW5pdF9kcGlfc2l6ZShwX2h3Zm4sIHBfcHR0LCBwd21fcmVnc2l6ZSwgbl9jcHVzKTsKKworCQlpZiAoY29uZCkKKwkJCXFlZF9yZG1hX2RwbV9iYXIocF9od2ZuLCBwX3B0dCk7CisJfQorCisJRFBfSU5GTyhwX2h3Zm4sCisJCSJkb29yYmVsbCBiYXI6IG5vcm1hbF9yZWdpb25fc2l6ZT0lZCwgcHdtX3JlZ2lvbl9zaXplPSVkLCBkcGlfc2l6ZT0lZCwgZHBpX2NvdW50PSVkLCByb2NlX2VkcG09JXNcbiIsCisJCW5vcm1fcmVnc2l6ZSwKKwkJcHdtX3JlZ3NpemUsCisJCXBfaHdmbi0+ZHBpX3NpemUsCisJCXBfaHdmbi0+ZHBpX2NvdW50LAorCQkoKHBfaHdmbi0+ZGNieF9ub19lZHBtKSB8fCAocF9od2ZuLT5kYl9iYXJfbm9fZWRwbSkpID8KKwkJImRpc2FibGVkIiA6ICJlbmFibGVkIik7CisKKwlpZiAocmMpIHsKKwkJRFBfRVJSKHBfaHdmbiwKKwkJICAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgZW5vdWdoIERQSXMuIEFsbG9jYXRlZCAlZCBidXQgdGhlIGN1cnJlbnQgbWluaW11bSBpcyAlZC5cbiIsCisJCSAgICAgICBwX2h3Zm4tPmRwaV9jb3VudCwKKwkJICAgICAgIHBfaHdmbi0+cGZfcGFyYW1zLnJkbWFfcGZfcGFyYW1zLm1pbl9kcGlzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcF9od2ZuLT5kcGlfc3RhcnRfb2Zmc2V0ID0gbm9ybV9yZWdzaXplOworCisJLyogREVNUyBzaXplIGlzIGNvbmZpZ3VyZWQgbG9nMiBvZiBEV09SRHMsIGhlbmNlIHRoZSBkaXZpc2lvbiBieSA0ICovCisJcGZfZGVtc19zaGlmdCA9IGlsb2cyKFFFRF9QRl9ERU1TX1NJWkUgLyA0KTsKKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgRE9SUV9SRUdfUEZfSUNJRF9CSVRfU0hJRlRfTk9STSwgcGZfZGVtc19zaGlmdCk7CisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIERPUlFfUkVHX1BGX01JTl9BRERSX1JFRzEsIG1pbl9hZGRyX3JlZzEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWVkX2h3X2luaXRfcG9ydChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIGludCBod19tb2RlKQoreworCXJldHVybiBxZWRfaW5pdF9ydW4ocF9od2ZuLCBwX3B0dCwgUEhBU0VfUE9SVCwKKwkJCSAgICBwX2h3Zm4tPnBvcnRfaWQsIGh3X21vZGUpOwogfQogCiBzdGF0aWMgaW50IHFlZF9od19pbml0X3BmKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLApAQCAtODQ4LDcgKzk1NSw3IEBACiAJcWVkX2ludF9pZ3VfaW5pdF9ydChwX2h3Zm4pOwogCiAJLyogU2V0IFZMQU4gaW4gTklHIGlmIG5lZWRlZCAqLwotCWlmIChod19tb2RlICYgKDEgPDwgTU9ERV9NRl9TRCkpIHsKKwlpZiAoaHdfbW9kZSAmIEJJVChNT0RFX01GX1NEKSkgewogCQlEUF9WRVJCT1NFKHBfaHdmbiwgTkVUSUZfTVNHX0hXLCAiQ29uZmlndXJpbmcgTExIX0ZVTkNfVEFHXG4iKTsKIAkJU1RPUkVfUlRfUkVHKHBfaHdmbiwgTklHX1JFR19MTEhfRlVOQ19UQUdfRU5fUlRfT0ZGU0VULCAxKTsKIAkJU1RPUkVfUlRfUkVHKHBfaHdmbiwgTklHX1JFR19MTEhfRlVOQ19UQUdfVkFMVUVfUlRfT0ZGU0VULApAQCAtODU2LDcgKzk2Myw3IEBACiAJfQogCiAJLyogRW5hYmxlIGNsYXNzaWZpY2F0aW9uIGJ5IE1BQyBpZiBuZWVkZWQgKi8KLQlpZiAoaHdfbW9kZSAmICgxIDw8IE1PREVfTUZfU0kpKSB7CisJaWYgKGh3X21vZGUgJiBCSVQoTU9ERV9NRl9TSSkpIHsKIAkJRFBfVkVSQk9TRShwX2h3Zm4sIE5FVElGX01TR19IVywKIAkJCSAgICJDb25maWd1cmluZyBUQUdNQUNfQ0xTX1RZUEVcbiIpOwogCQlTVE9SRV9SVF9SRUcocF9od2ZuLApAQCAtODcxLDcgKzk3OCw3IEBACiAKIAkvKiBDbGVhbnVwIGNoaXAgZnJvbSBwcmV2aW91cyBkcml2ZXIgaWYgc3VjaCByZW1haW5zIGV4aXN0ICovCiAJcmMgPSBxZWRfZmluYWxfY2xlYW51cChwX2h3Zm4sIHBfcHR0LCByZWxfcGZfaWQsIGZhbHNlKTsKLQlpZiAocmMgIT0gMCkKKwlpZiAocmMpCiAJCXJldHVybiByYzsKIAogCS8qIFBGIEluaXQgc2VxdWVuY2UgKi8KQEAgLTg4NywyMCArOTk0LDkgQEAKIAkvKiBQdXJlIHJ1bnRpbWUgaW5pdGlhbGl6YXRpb25zIC0gZGlyZWN0bHkgdG8gdGhlIEhXICAqLwogCXFlZF9pbnRfaWd1X2luaXRfcHVyZV9ydChwX2h3Zm4sIHBfcHR0LCB0cnVlLCB0cnVlKTsKIAotCWlmIChod19tb2RlICYgKDEgPDwgTU9ERV9NRl9TSSkpIHsKLQkJdTggcGZfaWQgPSAwOwotCQl1MzIgdmFsID0gMDsKLQotCQlpZiAoIXFlZF9od19pbml0X2ZpcnN0X2V0aChwX2h3Zm4sIHBfcHR0LCAmcGZfaWQpKSB7Ci0JCQlpZiAocF9od2ZuLT5yZWxfcGZfaWQgPT0gcGZfaWQpIHsKLQkJCQlEUF9WRVJCT1NFKHBfaHdmbiwgTkVUSUZfTVNHX0lGVVAsCi0JCQkJCSAgICJQRlslZF0gaXMgZmlyc3QgRVRIIG9uIGVuZ2luZVxuIiwKLQkJCQkJICAgcGZfaWQpOwotCQkJCXZhbCA9IDE7Ci0JCQl9Ci0JCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwgUFJTX1JFR19NU0dfSU5GTywgdmFsKTsKLQkJfQotCX0KKwlyYyA9IHFlZF9od19pbml0X3BmX2Rvb3JiZWxsX2JhcihwX2h3Zm4sIHBfcHR0KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKIAogCWlmIChiX2h3X3N0YXJ0KSB7CiAJCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCkBAIC05NTAsOCArMTA0Niw3IEBACiAJLyogUmVhZCBzaGFkb3cgb2YgY3VycmVudCBNRlcgbWFpbGJveCAqLwogCXFlZF9tY3BfcmVhZF9tYihwX2h3Zm4sIHBfbWFpbl9wdHQpOwogCW1lbWNweShwX2h3Zm4tPm1jcF9pbmZvLT5tZndfbWJfc2hhZG93LAotCSAgICAgICBwX2h3Zm4tPm1jcF9pbmZvLT5tZndfbWJfY3VyLAotCSAgICAgICBwX2h3Zm4tPm1jcF9pbmZvLT5tZndfbWJfbGVuZ3RoKTsKKwkgICAgICAgcF9od2ZuLT5tY3BfaW5mby0+bWZ3X21iX2N1ciwgcF9od2ZuLT5tY3BfaW5mby0+bWZ3X21iX2xlbmd0aCk7CiB9CiAKIGludCBxZWRfaHdfaW5pdChzdHJ1Y3QgcWVkX2RldiAqY2RldiwKQEAgLTk3MSw3ICsxMDY2LDcgQEAKIAogCWlmIChJU19QRihjZGV2KSkgewogCQlyYyA9IHFlZF9pbml0X2Z3X2RhdGEoY2RldiwgYmluX2Z3X2RhdGEpOwotCQlpZiAocmMgIT0gMCkKKwkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwogCX0KIApAQCAtOTg4LDggKzEwODMsNyBAQAogCiAJCXFlZF9jYWxjX2h3X21vZGUocF9od2ZuKTsKIAotCQlyYyA9IHFlZF9tY3BfbG9hZF9yZXEocF9od2ZuLCBwX2h3Zm4tPnBfbWFpbl9wdHQsCi0JCQkJICAgICAgJmxvYWRfY29kZSk7CisJCXJjID0gcWVkX21jcF9sb2FkX3JlcShwX2h3Zm4sIHBfaHdmbi0+cF9tYWluX3B0dCwgJmxvYWRfY29kZSk7CiAJCWlmIChyYykgewogCQkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCBzZW5kaW5nIExPQURfUkVRIGNvbW1hbmRcbiIpOwogCQkJcmV0dXJuIHJjOwpAQCAtMTAwNCwxMSArMTA5OCw2IEBACiAJCXBfaHdmbi0+Zmlyc3Rfb25fZW5naW5lID0gKGxvYWRfY29kZSA9PQogCQkJCQkgICBGV19NU0dfQ09ERV9EUlZfTE9BRF9FTkdJTkUpOwogCi0JCWlmICghcW1fbG9ja19pbml0KSB7Ci0JCQlzcGluX2xvY2tfaW5pdCgmcW1fbG9jayk7Ci0JCQlxbV9sb2NrX2luaXQgPSB0cnVlOwotCQl9Ci0KIAkJc3dpdGNoIChsb2FkX2NvZGUpIHsKIAkJY2FzZSBGV19NU0dfQ09ERV9EUlZfTE9BRF9FTkdJTkU6CiAJCQlyYyA9IHFlZF9od19pbml0X2NvbW1vbihwX2h3Zm4sIHBfaHdmbi0+cF9tYWluX3B0dCwKQEAgLTEwNzEsOSArMTE2MCw4IEBACiB9CiAKICNkZWZpbmUgUUVEX0hXX1NUT1BfUkVUUllfTElNSVQgKDEwKQotc3RhdGljIGlubGluZSB2b2lkIHFlZF9od190aW1lcnNfc3RvcChzdHJ1Y3QgcWVkX2RldiAqY2RldiwKLQkJCQkgICAgICBzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCitzdGF0aWMgdm9pZCBxZWRfaHdfdGltZXJzX3N0b3Aoc3RydWN0IHFlZF9kZXYgKmNkZXYsCisJCQkgICAgICAgc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKIHsKIAlpbnQgaTsKIApAQCAtMTA4NCw4ICsxMTcyLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgUUVEX0hXX1NUT1BfUkVUUllfTElNSVQ7IGkrKykgewogCQlpZiAoKCFxZWRfcmQocF9od2ZuLCBwX3B0dCwKIAkJCSAgICAgVE1fUkVHX1BGX1NDQU5fQUNUSVZFX0NPTk4pKSAmJgotCQkgICAgKCFxZWRfcmQocF9od2ZuLCBwX3B0dCwKLQkJCSAgICAgVE1fUkVHX1BGX1NDQU5fQUNUSVZFX1RBU0spKSkKKwkJICAgICghcWVkX3JkKHBfaHdmbiwgcF9wdHQsIFRNX1JFR19QRl9TQ0FOX0FDVElWRV9UQVNLKSkpCiAJCQlicmVhazsKIAogCQkvKiBEZXBlbmRlbnQgb24gbnVtYmVyIG9mIGNvbm5lY3Rpb24vdGFza3MsIHBvc3NpYmx5CkBAIC0xMTkwLDggKzEyNzcsNyBAQAogCQl9CiAKIAkJRFBfVkVSQk9TRShwX2h3Zm4sCi0JCQkgICBORVRJRl9NU0dfSUZET1dOLAotCQkJICAgIlNodXR0aW5nIGRvd24gdGhlIGZhc3RwYXRoXG4iKTsKKwkJCSAgIE5FVElGX01TR19JRkRPV04sICJTaHV0dGluZyBkb3duIHRoZSBmYXN0cGF0aFxuIik7CiAKIAkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsCiAJCSAgICAgICBOSUdfUkVHX1JYX0xMSF9CUkJfR0FURV9ETlRGV0RfUEVSUEYsIDB4MSk7CkBAIC0xMjE5LDE0ICsxMzA1LDEzIEBACiAJICAgICAgIE5JR19SRUdfUlhfTExIX0JSQl9HQVRFX0ROVEZXRF9QRVJQRiwgMHgwKTsKIH0KIAotc3RhdGljIGludCBxZWRfcmVnX2Fzc2VydChzdHJ1Y3QgcWVkX2h3Zm4gKmh3Zm4sCi0JCQkgIHN0cnVjdCBxZWRfcHR0ICpwdHQsIHUzMiByZWcsCi0JCQkgIGJvb2wgZXhwZWN0ZWQpCitzdGF0aWMgaW50IHFlZF9yZWdfYXNzZXJ0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiByZWcsIGJvb2wgZXhwZWN0ZWQpCiB7Ci0JdTMyIGFzc2VydF92YWwgPSBxZWRfcmQoaHdmbiwgcHR0LCByZWcpOworCXUzMiBhc3NlcnRfdmFsID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsIHJlZyk7CiAKIAlpZiAoYXNzZXJ0X3ZhbCAhPSBleHBlY3RlZCkgewotCQlEUF9OT1RJQ0UoaHdmbiwgIlZhbHVlIGF0IGFkZHJlc3MgMHgleCAhPSAweCUwOHhcbiIsCisJCURQX05PVElDRShwX2h3Zm4sICJWYWx1ZSBhdCBhZGRyZXNzIDB4JTA4eCAhPSAweCUwOHhcbiIsCiAJCQkgIHJlZywgZXhwZWN0ZWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMzA2LDggKzEzOTEsNyBAQAogCiAJLyogQ2xlYW4gUHJldmlvdXMgZXJyb3JzIGlmIHN1Y2ggZXhpc3QgKi8KIAlxZWRfd3IocF9od2ZuLCBwX2h3Zm4tPnBfbWFpbl9wdHQsCi0JICAgICAgIFBHTFVFX0JfUkVHX1dBU19FUlJPUl9QRl8zMV8wX0NMUiwKLQkgICAgICAgMSA8PCBwX2h3Zm4tPmFic19wZl9pZCk7CisJICAgICAgIFBHTFVFX0JfUkVHX1dBU19FUlJPUl9QRl8zMV8wX0NMUiwgMSA8PCBwX2h3Zm4tPmFic19wZl9pZCk7CiAKIAkvKiBlbmFibGUgaW50ZXJuYWwgdGFyZ2V0LXJlYWQgKi8KIAlxZWRfd3IocF9od2ZuLCBwX2h3Zm4tPnBfbWFpbl9wdHQsCkBAIC0xMzE3LDcgKzE0MDEsOCBAQAogc3RhdGljIHZvaWQgZ2V0X2Z1bmN0aW9uX2lkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuKQogewogCS8qIE1FIFJlZ2lzdGVyICovCi0JcF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQgPSAodTE2KVJFR19SRChwX2h3Zm4sIFBYUF9QRl9NRV9PUEFRVUVfQUREUik7CisJcF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQgPSAodTE2KSBSRUdfUkQocF9od2ZuLAorCQkJCQkJICBQWFBfUEZfTUVfT1BBUVVFX0FERFIpOwogCiAJcF9od2ZuLT5od19pbmZvLmNvbmNyZXRlX2ZpZCA9IFJFR19SRChwX2h3Zm4sIFBYUF9QRl9NRV9DT05DUkVURV9BRERSKTsKIApAQCAtMTMyNiw2ICsxNDExLDEwIEBACiAJCQkJICAgICAgUFhQX0NPTkNSRVRFX0ZJRF9QRklEKTsKIAlwX2h3Zm4tPnBvcnRfaWQgPSBHRVRfRklFTEQocF9od2ZuLT5od19pbmZvLmNvbmNyZXRlX2ZpZCwKIAkJCQkgICAgUFhQX0NPTkNSRVRFX0ZJRF9QT1JUKTsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBORVRJRl9NU0dfUFJPQkUsCisJCSAgICJSZWFkIE1FIHJlZ2lzdGVyOiBDb25jcmV0ZSAweCUwOHggT3BhcXVlIDB4JTA0eFxuIiwKKwkJICAgcF9od2ZuLT5od19pbmZvLmNvbmNyZXRlX2ZpZCwgcF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQpOwogfQogCiBzdGF0aWMgdm9pZCBxZWRfaHdfc2V0X2ZlYXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4pCkBAIC0xMzMzLDYgKzE0MjIsMTkgQEAKIAl1MzIgKmZlYXRfbnVtID0gcF9od2ZuLT5od19pbmZvLmZlYXRfbnVtOwogCWludCBudW1fZmVhdHVyZXMgPSAxOwogCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSU5GSU5JQkFORF9RRURSKQorCS8qIFJvY2UgQ05RIGVhY2ggcmVxdWlyZXM6IDEgc3RhdHVzIGJsb2NrICsgMSBDTlEuIFdlIGRpdmlkZSB0aGUKKwkgKiBzdGF0dXMgYmxvY2tzIGVxdWFsbHkgYmV0d2VlbiBMMiAvIFJvQ0UgYnV0IHdpdGggY29uc2lkZXJhdGlvbiBhcworCSAqIHRvIGhvdyBtYW55IGwyIHF1ZXVlcyAvIGNucXMgd2UgaGF2ZQorCSAqLworCWlmIChwX2h3Zm4tPmh3X2luZm8ucGVyc29uYWxpdHkgPT0gUUVEX1BDSV9FVEhfUk9DRSkgeworCQludW1fZmVhdHVyZXMrKzsKKworCQlmZWF0X251bVtRRURfUkRNQV9DTlFdID0KKwkJCW1pbl90KHUzMiwgUkVTQ19OVU0ocF9od2ZuLCBRRURfU0IpIC8gbnVtX2ZlYXR1cmVzLAorCQkJICAgICAgUkVTQ19OVU0ocF9od2ZuLCBRRURfUkRNQV9DTlFfUkFNKSk7CisJfQorI2VuZGlmCiAJZmVhdF9udW1bUUVEX1BGX0wyX1FVRV0gPSBtaW5fdCh1MzIsIFJFU0NfTlVNKHBfaHdmbiwgUUVEX1NCKSAvCiAJCQkJCQludW1fZmVhdHVyZXMsCiAJCQkJCVJFU0NfTlVNKHBfaHdmbiwgUUVEX0wyX1FVRVVFKSk7CkBAIC0xMzczLDYgKzE0NzUsMTAgQEAKIAlyZXNjX251bVtRRURfVkxBTl0gPSAoRVRIX05VTV9WTEFOX0ZJTFRFUlMgLSAxIC8qRm9yIHZsYW4wKi8pIC8KIAkJCSAgICAgbnVtX2Z1bmNzOwogCXJlc2NfbnVtW1FFRF9JTFRdID0gUFhQX05VTV9JTFRfUkVDT1JEU19CQiAvIG51bV9mdW5jczsKKwlyZXNjX251bVtRRURfTEwyX1FVRVVFXSA9IE1BWF9OVU1fTEwyX1JYX1FVRVVFUyAvIG51bV9mdW5jczsKKwlyZXNjX251bVtRRURfUkRNQV9DTlFfUkFNXSA9IE5VTV9PRl9DTURRU19DUVMgLyBudW1fZnVuY3M7CisJcmVzY19udW1bUUVEX1JETUFfU1RBVFNfUVVFVUVdID0gUkRNQV9OVU1fU1RBVElTVElDX0NPVU5URVJTX0JCIC8KKwkJCQkJIG51bV9mdW5jczsKIAogCWZvciAoaSA9IDA7IGkgPCBRRURfTUFYX1JFU0M7IGkrKykKIAkJcmVzY19zdGFydFtpXSA9IHJlc2NfbnVtW2ldICogZW5hYmxlZF9mdW5jX2lkeDsKQEAgLTEzOTYsNyArMTUwMiw4IEBACiAJCSAgICJSTCA9ICVkIHN0YXJ0ID0gJWRcbiIKIAkJICAgIk1BQyA9ICVkIHN0YXJ0ID0gJWRcbiIKIAkJICAgIlZMQU4gPSAlZCBzdGFydCA9ICVkXG4iCi0JCSAgICJJTFQgPSAlZCBzdGFydCA9ICVkXG4iLAorCQkgICAiSUxUID0gJWQgc3RhcnQgPSAlZFxuIgorCQkgICAiTEwyX1FVRVVFID0gJWQgc3RhcnQgPSAlZFxuIiwKIAkJICAgcF9od2ZuLT5od19pbmZvLnJlc2NfbnVtW1FFRF9TQl0sCiAJCSAgIHBfaHdmbi0+aHdfaW5mby5yZXNjX3N0YXJ0W1FFRF9TQl0sCiAJCSAgIHBfaHdmbi0+aHdfaW5mby5yZXNjX251bVtRRURfTDJfUVVFVUVdLApAQCAtMTQxMiwxMyArMTUxOSwxNCBAQAogCQkgICBwX2h3Zm4tPmh3X2luZm8ucmVzY19udW1bUUVEX1ZMQU5dLAogCQkgICBwX2h3Zm4tPmh3X2luZm8ucmVzY19zdGFydFtRRURfVkxBTl0sCiAJCSAgIHBfaHdmbi0+aHdfaW5mby5yZXNjX251bVtRRURfSUxUXSwKLQkJICAgcF9od2ZuLT5od19pbmZvLnJlc2Nfc3RhcnRbUUVEX0lMVF0pOworCQkgICBwX2h3Zm4tPmh3X2luZm8ucmVzY19zdGFydFtRRURfSUxUXSwKKwkJICAgUkVTQ19OVU0ocF9od2ZuLCBRRURfTEwyX1FVRVVFKSwKKwkJICAgUkVTQ19TVEFSVChwX2h3Zm4sIFFFRF9MTDJfUVVFVUUpKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHFlZF9od19nZXRfbnZtX2luZm8oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQorc3RhdGljIGludCBxZWRfaHdfZ2V0X252bV9pbmZvKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCiB7CiAJdTMyIG52bV9jZmcxX29mZnNldCwgbWZfbW9kZSwgYWRkciwgZ2VuZXJpY19jb250MCwgY29yZV9jZmc7CiAJdTMyIHBvcnRfY2ZnX2FkZHIsIGxpbmtfdGVtcCwgbnZtX2NmZ19hZGRyLCBkZXZpY2VfY2FwYWJpbGl0aWVzOwpAQCAtMTQ3Miw4ICsxNTgwLDcgQEAKIAkJcF9od2ZuLT5od19pbmZvLnBvcnRfbW9kZSA9IFFFRF9QT1JUX01PREVfREVfMVgyNUc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCURQX05PVElDRShwX2h3Zm4sICJVbmtub3duIHBvcnQgbW9kZSBpbiAweCUwOHhcbiIsCi0JCQkgIGNvcmVfY2ZnKTsKKwkJRFBfTk9USUNFKHBfaHdmbiwgIlVua25vd24gcG9ydCBtb2RlIGluIDB4JTA4eFxuIiwgY29yZV9jZmcpOwogCQlicmVhazsKIAl9CiAKQEAgLTE0ODQsMTEgKzE1OTEsMTEgQEAKIAlsaW5rX3RlbXAgPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwKIAkJCSAgIHBvcnRfY2ZnX2FkZHIgKwogCQkJICAgb2Zmc2V0b2Yoc3RydWN0IG52bV9jZmcxX3BvcnQsIHNwZWVkX2NhcF9tYXNrKSk7Ci0JbGluay0+c3BlZWQuYWR2ZXJ0aXNlZF9zcGVlZHMgPQotCQlsaW5rX3RlbXAgJiBOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfTUFTSzsKKwlsaW5rX3RlbXAgJj0gTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLX01BU0s7CisJbGluay0+c3BlZWQuYWR2ZXJ0aXNlZF9zcGVlZHMgPSBsaW5rX3RlbXA7CiAKLQlwX2h3Zm4tPm1jcF9pbmZvLT5saW5rX2NhcGFiaWxpdGllcy5zcGVlZF9jYXBhYmlsaXRpZXMgPQotCQkJCQkJbGluay0+c3BlZWQuYWR2ZXJ0aXNlZF9zcGVlZHM7CisJbGlua190ZW1wID0gbGluay0+c3BlZWQuYWR2ZXJ0aXNlZF9zcGVlZHM7CisJcF9od2ZuLT5tY3BfaW5mby0+bGlua19jYXBhYmlsaXRpZXMuc3BlZWRfY2FwYWJpbGl0aWVzID0gbGlua190ZW1wOwogCiAJbGlua190ZW1wID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsCiAJCQkgICBwb3J0X2NmZ19hZGRyICsKQEAgLTE1MTcsOCArMTYyNCw3IEBACiAJCWxpbmstPnNwZWVkLmZvcmNlZF9zcGVlZCA9IDEwMDAwMDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJRFBfTk9USUNFKHBfaHdmbiwgIlVua25vd24gU3BlZWQgaW4gMHglMDh4XG4iLAotCQkJICBsaW5rX3RlbXApOworCQlEUF9OT1RJQ0UocF9od2ZuLCAiVW5rbm93biBTcGVlZCBpbiAweCUwOHhcbiIsIGxpbmtfdGVtcCk7CiAJfQogCiAJbGlua190ZW1wICY9IE5WTV9DRkcxX1BPUlRfRFJWX0ZMT1dfQ09OVFJPTF9NQVNLOwpAQCAtMTYyOCwxMCArMTczNCwxMCBAQAogCiAJRFBfVkVSQk9TRShwX2h3Zm4sCiAJCSAgIE5FVElGX01TR19QUk9CRSwKLQkJICAgIlBGIFtyZWxfaWQgJWQsIGFic19pZCAlZF0gd2l0aGluIHRoZSAlZCBlbmFibGVkIGZ1bmN0aW9ucyBvbiB0aGUgZW5naW5lXG4iLAorCQkgICAiUEYgW3JlbF9pZCAlZCwgYWJzX2lkICVkXSBvY2N1cGllcyBpbmRleCAlZCB3aXRoaW4gdGhlICVkIGVuYWJsZWQgZnVuY3Rpb25zIG9uIHRoZSBlbmdpbmVcbiIsCiAJCSAgIHBfaHdmbi0+cmVsX3BmX2lkLAogCQkgICBwX2h3Zm4tPmFic19wZl9pZCwKLQkJICAgcF9od2ZuLT5udW1fZnVuY3Nfb25fZW5naW5lKTsKKwkJICAgcF9od2ZuLT5lbmFibGVkX2Z1bmNfaWR4LCBwX2h3Zm4tPm51bV9mdW5jc19vbl9lbmdpbmUpOwogfQogCiBzdGF0aWMgaW50CkBAIC0xNzAzLDEwICsxODA5LDkgQEAKIAl1MzIgdG1wOwogCiAJLyogUmVhZCBWZW5kb3IgSWQgLyBEZXZpY2UgSWQgKi8KLQlwY2lfcmVhZF9jb25maWdfd29yZChjZGV2LT5wZGV2LCBQQ0lfVkVORE9SX0lELAotCQkJICAgICAmY2Rldi0+dmVuZG9yX2lkKTsKLQlwY2lfcmVhZF9jb25maWdfd29yZChjZGV2LT5wZGV2LCBQQ0lfREVWSUNFX0lELAotCQkJICAgICAmY2Rldi0+ZGV2aWNlX2lkKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChjZGV2LT5wZGV2LCBQQ0lfVkVORE9SX0lELCAmY2Rldi0+dmVuZG9yX2lkKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChjZGV2LT5wZGV2LCBQQ0lfREVWSUNFX0lELCAmY2Rldi0+ZGV2aWNlX2lkKTsKKwogCWNkZXYtPmNoaXBfbnVtID0gKHUxNilxZWRfcmQocF9od2ZuLCBwX2h3Zm4tPnBfbWFpbl9wdHQsCiAJCQkJICAgICBNSVNDU19SRUdfQ0hJUF9OVU0pOwogCWNkZXYtPmNoaXBfcmV2ID0gKHUxNilxZWRfcmQocF9od2ZuLCBwX2h3Zm4tPnBfbWFpbl9wdHQsCkBAIC0xNzcxLDEwICsxODc2LDggQEAKIAogCS8qIEFsbG9jYXRlIFBUVCBwb29sICovCiAJcmMgPSBxZWRfcHR0X3Bvb2xfYWxsb2MocF9od2ZuKTsKLQlpZiAocmMpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBwcmVwYXJlIGh3Zm4ncyBod1xuIik7CisJaWYgKHJjKQogCQlnb3RvIGVycjA7Ci0JfQogCiAJLyogQWxsb2NhdGUgdGhlIG1haW4gUFRUICovCiAJcF9od2ZuLT5wX21haW5fcHR0ID0gcWVkX2dldF9yZXNlcnZlZF9wdHQocF9od2ZuLCBSRVNFUlZFRF9QVFRfTUFJTik7CkBAIC0xNzgyLDcgKzE4ODUsNyBAQAogCS8qIEZpcnN0IGh3Zm4gbGVhcm5zIGJhc2ljIGluZm9ybWF0aW9uLCBlLmcuLCBudW1iZXIgb2YgaHdmbnMgKi8KIAlpZiAoIXBfaHdmbi0+bXlfaWQpIHsKIAkJcmMgPSBxZWRfZ2V0X2Rldl9pbmZvKHBfaHdmbi0+Y2Rldik7Ci0JCWlmIChyYyAhPSAwKQorCQlpZiAocmMpCiAJCQlnb3RvIGVycjE7CiAJfQogCkBAIC0xODA0LDEwICsxOTA3LDggQEAKIAogCS8qIEFsbG9jYXRlIHRoZSBpbml0IFJUIGFycmF5IGFuZCBpbml0aWFsaXplIHRoZSBpbml0LW9wcyBlbmdpbmUgKi8KIAlyYyA9IHFlZF9pbml0X2FsbG9jKHBfaHdmbik7Ci0JaWYgKHJjKSB7Ci0JCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgdGhlIGluaXQgYXJyYXlcbiIpOworCWlmIChyYykKIAkJZ290byBlcnIyOwotCX0KIAogCXJldHVybiByYzsKIGVycjI6CkBAIC0yMDE1LDEwICsyMTE2LDggQEAKIAkJcF92aXJ0ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZjZGV2LT5wZGV2LT5kZXYsCiAJCQkJCSAgICBRRURfQ0hBSU5fUEFHRV9TSVpFLAogCQkJCQkgICAgJnBfcGh5cywgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcF92aXJ0KSB7Ci0JCQlEUF9OT1RJQ0UoY2RldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBjaGFpbiBtZW1vcnlcbiIpOworCQlpZiAoIXBfdmlydCkKIAkJCXJldHVybiAtRU5PTUVNOwotCQl9CiAKIAkJaWYgKGkgPT0gMCkgewogCQkJcWVkX2NoYWluX2luaXRfbWVtKHBfY2hhaW4sIHBfdmlydCwgcF9waHlzKTsKQEAgLTIwNDgsMTAgKzIxNDcsOCBAQAogCiAJcF92aXJ0ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZjZGV2LT5wZGV2LT5kZXYsCiAJCQkJICAgIFFFRF9DSEFJTl9QQUdFX1NJWkUsICZwX3BoeXMsIEdGUF9LRVJORUwpOwotCWlmICghcF92aXJ0KSB7Ci0JCURQX05PVElDRShjZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNoYWluIG1lbW9yeVxuIik7CisJaWYgKCFwX3ZpcnQpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXFlZF9jaGFpbl9pbml0X21lbShwX2NoYWluLCBwX3ZpcnQsIHBfcGh5cyk7CiAJcWVkX2NoYWluX3Jlc2V0KHBfY2hhaW4pOwpAQCAtMjA2OCwxMyArMjE2NSw5IEBACiAJdm9pZCAqcF92aXJ0ID0gTlVMTDsKIAogCXNpemUgPSBwYWdlX2NudCAqIHNpemVvZigqcHBfdmlydF9hZGRyX3RibCk7Ci0JcHBfdmlydF9hZGRyX3RibCA9IHZtYWxsb2Moc2l6ZSk7Ci0JaWYgKCFwcF92aXJ0X2FkZHJfdGJsKSB7Ci0JCURQX05PVElDRShjZGV2LAotCQkJICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGNoYWluIHZpcnR1YWwgYWRkcmVzc2VzIHRhYmxlXG4iKTsKKwlwcF92aXJ0X2FkZHJfdGJsID0gdnphbGxvYyhzaXplKTsKKwlpZiAoIXBwX3ZpcnRfYWRkcl90YmwpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KLQltZW1zZXQocHBfdmlydF9hZGRyX3RibCwgMCwgc2l6ZSk7CiAKIAkvKiBUaGUgYWxsb2NhdGlvbiBvZiB0aGUgUEJMIHRhYmxlIGlzIGRvbmUgd2l0aCBpdHMgZnVsbCBzaXplLCBzaW5jZSBpdAogCSAqIGlzIGV4cGVjdGVkIHRvIGJlIHN1Y2Nlc3NpdmUuCkBAIC0yMDg3LDE5ICsyMTgwLDE1IEBACiAJCQkJCXNpemUsICZwX3BibF9waHlzLCBHRlBfS0VSTkVMKTsKIAlxZWRfY2hhaW5faW5pdF9wYmxfbWVtKHBfY2hhaW4sIHBfcGJsX3ZpcnQsIHBfcGJsX3BoeXMsCiAJCQkgICAgICAgcHBfdmlydF9hZGRyX3RibCk7Ci0JaWYgKCFwX3BibF92aXJ0KSB7Ci0JCURQX05PVElDRShjZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNoYWluIHBibCBtZW1vcnlcbiIpOworCWlmICghcF9wYmxfdmlydCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJZm9yIChpID0gMDsgaSA8IHBhZ2VfY250OyBpKyspIHsKIAkJcF92aXJ0ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZjZGV2LT5wZGV2LT5kZXYsCiAJCQkJCSAgICBRRURfQ0hBSU5fUEFHRV9TSVpFLAogCQkJCQkgICAgJnBfcGh5cywgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcF92aXJ0KSB7Ci0JCQlEUF9OT1RJQ0UoY2RldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBjaGFpbiBtZW1vcnlcbiIpOworCQlpZiAoIXBfdmlydCkKIAkJCXJldHVybiAtRU5PTUVNOwotCQl9CiAKIAkJaWYgKGkgPT0gMCkgewogCQkJcWVkX2NoYWluX2luaXRfbWVtKHBfY2hhaW4sIHBfdmlydCwgcF9waHlzKTsKQEAgLTIxMzQsNyArMjIyMyw4IEBACiAJcmMgPSBxZWRfY2hhaW5fYWxsb2Nfc2FuaXR5X2NoZWNrKGNkZXYsIGNudF90eXBlLCBlbGVtX3NpemUsIHBhZ2VfY250KTsKIAlpZiAocmMpIHsKIAkJRFBfTk9USUNFKGNkZXYsCi0JCQkgICJDYW5ub3QgYWxsb2NhdGUgYSBjaGFpbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHM6XG4iCisJCQkgICJDYW5ub3QgYWxsb2NhdGUgYSBjaGFpbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHM6XG4iKTsKKwkJRFBfTk9USUNFKGNkZXYsCiAJCQkgICJbdXNlX21vZGUgJWQsIG1vZGUgJWQsIGNudF90eXBlICVkLCBudW1fZWxlbXMgJWQsIGVsZW1fc2l6ZSAlenVdXG4iLAogCQkJICBpbnRlbmRlZF91c2UsIG1vZGUsIGNudF90eXBlLCBudW1fZWxlbXMsIGVsZW1fc2l6ZSk7CiAJCXJldHVybiByYzsKQEAgLTIxODMsOCArMjI3Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBxZWRfZndfdnBvcnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSB1OCBzcmNfaWQsIHU4ICpkc3RfaWQpCitpbnQgcWVkX2Z3X3Zwb3J0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1OCBzcmNfaWQsIHU4ICpkc3RfaWQpCiB7CiAJaWYgKHNyY19pZCA+PSBSRVNDX05VTShwX2h3Zm4sIFFFRF9WUE9SVCkpIHsKIAkJdTggbWluLCBtYXg7CkBAIC0yMjAzLDggKzIyOTIsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcWVkX2Z3X3Jzc19lbmcoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgIHU4IHNyY19pZCwgdTggKmRzdF9pZCkKK2ludCBxZWRfZndfcnNzX2VuZyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTggc3JjX2lkLCB1OCAqZHN0X2lkKQogewogCWlmIChzcmNfaWQgPj0gUkVTQ19OVU0ocF9od2ZuLCBRRURfUlNTX0VORykpIHsKIAkJdTggbWluLCBtYXg7CkBAIC0yMjIzLDYgKzIzMTEsOTggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgcWVkX2xsaF9tYWNfdG9fZmlsdGVyKHUzMiAqcF9oaWdoLCB1MzIgKnBfbG93LAorCQkJCSAgdTggKnBfZmlsdGVyKQoreworCSpwX2hpZ2ggPSBwX2ZpbHRlclsxXSB8IChwX2ZpbHRlclswXSA8PCA4KTsKKwkqcF9sb3cgPSBwX2ZpbHRlcls1XSB8IChwX2ZpbHRlcls0XSA8PCA4KSB8CisJCSAocF9maWx0ZXJbM10gPDwgMTYpIHwgKHBfZmlsdGVyWzJdIDw8IDI0KTsKK30KKworaW50IHFlZF9sbGhfYWRkX21hY19maWx0ZXIoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHU4ICpwX2ZpbHRlcikKK3sKKwl1MzIgaGlnaCA9IDAsIGxvdyA9IDAsIGVuOworCWludCBpOworCisJaWYgKCEoSVNfTUZfU0kocF9od2ZuKSB8fCBJU19NRl9ERUZBVUxUKHBfaHdmbikpKQorCQlyZXR1cm4gMDsKKworCXFlZF9sbGhfbWFjX3RvX2ZpbHRlcigmaGlnaCwgJmxvdywgcF9maWx0ZXIpOworCisJLyogRmluZCBhIGZyZWUgZW50cnkgYW5kIHV0aWxpemUgaXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfRU5fU0laRTsgaSsrKSB7CisJCWVuID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCQkgICAgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfRU4gKyBpICogc2l6ZW9mKHUzMikpOworCQlpZiAoZW4pCisJCQljb250aW51ZTsKKwkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsCisJCSAgICAgICBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9WQUxVRSArCisJCSAgICAgICAyICogaSAqIHNpemVvZih1MzIpLCBsb3cpOworCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwKKwkJICAgICAgIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1ZBTFVFICsKKwkJICAgICAgICgyICogaSArIDEpICogc2l6ZW9mKHUzMiksIGhpZ2gpOworCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwKKwkJICAgICAgIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX01PREUgKyBpICogc2l6ZW9mKHUzMiksIDApOworCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwKKwkJICAgICAgIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1BST1RPQ09MX1RZUEUgKworCQkgICAgICAgaSAqIHNpemVvZih1MzIpLCAwKTsKKwkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsCisJCSAgICAgICBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9FTiArIGkgKiBzaXplb2YodTMyKSwgMSk7CisJCWJyZWFrOworCX0KKwlpZiAoaSA+PSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9FTl9TSVpFKSB7CisJCURQX05PVElDRShwX2h3Zm4sCisJCQkgICJGYWlsZWQgdG8gZmluZCBhbiBlbXB0eSBMTEggZmlsdGVyIHRvIHV0aWxpemVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgTkVUSUZfTVNHX0hXLAorCQkgICAibWFjOiAlcE0gaXMgYWRkZWQgYXQgJWRcbiIsCisJCSAgIHBfZmlsdGVyLCBpKTsKKworCXJldHVybiAwOworfQorCit2b2lkIHFlZF9sbGhfcmVtb3ZlX21hY19maWx0ZXIoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1OCAqcF9maWx0ZXIpCit7CisJdTMyIGhpZ2ggPSAwLCBsb3cgPSAwOworCWludCBpOworCisJaWYgKCEoSVNfTUZfU0kocF9od2ZuKSB8fCBJU19NRl9ERUZBVUxUKHBfaHdmbikpKQorCQlyZXR1cm47CisKKwlxZWRfbGxoX21hY190b19maWx0ZXIoJmhpZ2gsICZsb3csIHBfZmlsdGVyKTsKKworCS8qIEZpbmQgdGhlIGVudHJ5IGFuZCBjbGVhbiBpdCAqLworCWZvciAoaSA9IDA7IGkgPCBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9FTl9TSVpFOyBpKyspIHsKKwkJaWYgKHFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkJICAgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfVkFMVUUgKworCQkJICAgMiAqIGkgKiBzaXplb2YodTMyKSkgIT0gbG93KQorCQkJY29udGludWU7CisJCWlmIChxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJCSAgIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1ZBTFVFICsKKwkJCSAgICgyICogaSArIDEpICogc2l6ZW9mKHUzMikpICE9IGhpZ2gpCisJCQljb250aW51ZTsKKworCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwKKwkJICAgICAgIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0VOICsgaSAqIHNpemVvZih1MzIpLCAwKTsKKwkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsCisJCSAgICAgICBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9WQUxVRSArIDIgKiBpICogc2l6ZW9mKHUzMiksIDApOworCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwKKwkJICAgICAgIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1ZBTFVFICsKKwkJICAgICAgICgyICogaSArIDEpICogc2l6ZW9mKHUzMiksIDApOworCisJCURQX1ZFUkJPU0UocF9od2ZuLCBORVRJRl9NU0dfSFcsCisJCQkgICAibWFjOiAlcE0gaXMgcmVtb3ZlZCBmcm9tICVkXG4iLAorCQkJICAgcF9maWx0ZXIsIGkpOworCQlicmVhazsKKwl9CisJaWYgKGkgPj0gTklHX1JFR19MTEhfRlVOQ19GSUxURVJfRU5fU0laRSkKKwkJRFBfTk9USUNFKHBfaHdmbiwgIlRyaWVkIHRvIHJlbW92ZSBhIG5vbi1jb25maWd1cmVkIGZpbHRlclxuIik7Cit9CisKIHN0YXRpYyBpbnQgcWVkX3NldF9jb2FsZXNjZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAogCQkJICAgIHUzMiBod19hZGRyLCB2b2lkICpwX2V0aF9xem9uZSwKIAkJCSAgICBzaXplX3QgZXRoX3F6b25lX3NpemUsIHU4IHRpbWVzZXQpCkBAIC0yMzg2LDggKzI1NjYsNyBAQAogICogMy4gdG90YWxfcmVxX21pbl9yYXRlIFthbGwgdnBvcnRzIG1pbiByYXRlIHN1bV0gc2hvdWxkbid0IGV4Y2VlZCBtaW5fcGZfcmF0ZS4KICAqLwogc3RhdGljIGludCBxZWRfaW5pdF93ZnFfcGFyYW0oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgICAgICB1MTYgdnBvcnRfaWQsIHUzMiByZXFfcmF0ZSwKLQkJCSAgICAgIHUzMiBtaW5fcGZfcmF0ZSkKKwkJCSAgICAgIHUxNiB2cG9ydF9pZCwgdTMyIHJlcV9yYXRlLCB1MzIgbWluX3BmX3JhdGUpCiB7CiAJdTMyIHRvdGFsX3JlcV9taW5fcmF0ZSA9IDAsIHRvdGFsX2xlZnRfcmF0ZSA9IDAsIGxlZnRfcmF0ZV9wZXJfdnAgPSAwOwogCWludCBub25fcmVxdWVzdGVkX2NvdW50ID0gMCwgcmVxX2NvdW50ID0gMCwgaSwgbnVtX3Zwb3J0czsKQEAgLTI0NzEsNyArMjY1MCw3IEBACiAKIAlyYyA9IHFlZF9pbml0X3dmcV9wYXJhbShwX2h3Zm4sIHZwX2lkLCByYXRlLCBwX2xpbmstPm1pbl9wZl9yYXRlKTsKIAotCWlmIChyYyA9PSAwKQorCWlmICghcmMpCiAJCXFlZF9jb25maWd1cmVfd2ZxX2Zvcl9hbGxfdnBvcnRzKHBfaHdmbiwgcF9wdHQsCiAJCQkJCQkgcF9saW5rLT5taW5fcGZfcmF0ZSk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGV2X2FwaS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGV2X2FwaS5oCmluZGV4IDM0M2JiMDMuLmI2NzExYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2Rldl9hcGkuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kZXZfYXBpLmgKQEAgLTMxMCw2ICszMTAsMjYgQEAKIAkJICAgdTggKmRzdF9pZCk7CiAKIC8qKgorICogQGJyaWVmIHFlZF9sbGhfYWRkX21hY19maWx0ZXIgLSBjb25maWd1cmVzIGEgTUFDIGZpbHRlciBpbiBsbGgKKyAqCisgKiBAcGFyYW0gcF9od2ZuCisgKiBAcGFyYW0gcF9wdHQKKyAqIEBwYXJhbSBwX2ZpbHRlciAtIE1BQyB0byBhZGQKKyAqLworaW50IHFlZF9sbGhfYWRkX21hY19maWx0ZXIoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHU4ICpwX2ZpbHRlcik7CisKKy8qKgorICogQGJyaWVmIHFlZF9sbGhfcmVtb3ZlX21hY19maWx0ZXIgLSByZW1vdmVzIGEgTUFDIGZpbHRlciBmcm9tIGxsaAorICoKKyAqIEBwYXJhbSBwX2h3Zm4KKyAqIEBwYXJhbSBwX3B0dAorICogQHBhcmFtIHBfZmlsdGVyIC0gTUFDIHRvIHJlbW92ZQorICovCit2b2lkIHFlZF9sbGhfcmVtb3ZlX21hY19maWx0ZXIoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1OCAqcF9maWx0ZXIpOworCisvKioKICAqICpAYnJpZWYgQ2xlYW51cCBvZiBwcmV2aW91cyBkcml2ZXIgcmVtYWlucyBwcmlvciB0byBsb2FkCiAgKgogICogQHBhcmFtIHBfaHdmbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaHNpLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9oc2kuaAppbmRleCA1OTI3ODQwLi43MmVlZTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9oc2kuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9oc2kuaApAQCAtNTM2LDYgKzUzNiwyNDcgQEAKIAlzdHJ1Y3QgcmVncGFpciB1c3Rvcm1fc3RfcGFkZGluZ1syXTsKIH07CiAKK2VudW0gY29yZV9lcnJvcl9oYW5kbGUgeworCUxMMl9EUk9QX1BBQ0tFVCwKKwlMTDJfRE9fTk9USElORywKKwlMTDJfQVNTRVJULAorCU1BWF9DT1JFX0VSUk9SX0hBTkRMRQorfTsKKworZW51bSBjb3JlX2V2ZW50X29wY29kZSB7CisJQ09SRV9FVkVOVF9UWF9RVUVVRV9TVEFSVCwKKwlDT1JFX0VWRU5UX1RYX1FVRVVFX1NUT1AsCisJQ09SRV9FVkVOVF9SWF9RVUVVRV9TVEFSVCwKKwlDT1JFX0VWRU5UX1JYX1FVRVVFX1NUT1AsCisJTUFYX0NPUkVfRVZFTlRfT1BDT0RFCit9OworCitlbnVtIGNvcmVfbDRfcHNldWRvX2NoZWNrc3VtX21vZGUgeworCUNPUkVfTDRfUFNFVURPX0NTVU1fQ09SUkVDVF9MRU5HVEgsCisJQ09SRV9MNF9QU0VVRE9fQ1NVTV9aRVJPX0xFTkdUSCwKKwlNQVhfQ09SRV9MNF9QU0VVRE9fQ0hFQ0tTVU1fTU9ERQorfTsKKworc3RydWN0IGNvcmVfbGwyX3BvcnRfc3RhdHMgeworCXN0cnVjdCByZWdwYWlyIGdzaV9pbnZhbGlkX2hkcjsKKwlzdHJ1Y3QgcmVncGFpciBnc2lfaW52YWxpZF9wa3RfbGVuZ3RoOworCXN0cnVjdCByZWdwYWlyIGdzaV91bnN1cHBvcnRlZF9wa3RfdHlwOworCXN0cnVjdCByZWdwYWlyIGdzaV9jcmNjaGtzbV9lcnJvcjsKK307CisKK3N0cnVjdCBjb3JlX2xsMl9wc3Rvcm1fcGVyX3F1ZXVlX3N0YXQgeworCXN0cnVjdCByZWdwYWlyIHNlbnRfdWNhc3RfYnl0ZXM7CisJc3RydWN0IHJlZ3BhaXIgc2VudF9tY2FzdF9ieXRlczsKKwlzdHJ1Y3QgcmVncGFpciBzZW50X2JjYXN0X2J5dGVzOworCXN0cnVjdCByZWdwYWlyIHNlbnRfdWNhc3RfcGt0czsKKwlzdHJ1Y3QgcmVncGFpciBzZW50X21jYXN0X3BrdHM7CisJc3RydWN0IHJlZ3BhaXIgc2VudF9iY2FzdF9wa3RzOworfTsKKworc3RydWN0IGNvcmVfbGwyX3J4X3Byb2QgeworCV9fbGUxNiBiZF9wcm9kOworCV9fbGUxNiBjcWVfcHJvZDsKKwlfX2xlMzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgY29yZV9sbDJfdHN0b3JtX3Blcl9xdWV1ZV9zdGF0IHsKKwlzdHJ1Y3QgcmVncGFpciBwYWNrZXRfdG9vX2JpZ19kaXNjYXJkOworCXN0cnVjdCByZWdwYWlyIG5vX2J1ZmZfZGlzY2FyZDsKK307CisKK3N0cnVjdCBjb3JlX2xsMl91c3Rvcm1fcGVyX3F1ZXVlX3N0YXQgeworCXN0cnVjdCByZWdwYWlyIHJjdl91Y2FzdF9ieXRlczsKKwlzdHJ1Y3QgcmVncGFpciByY3ZfbWNhc3RfYnl0ZXM7CisJc3RydWN0IHJlZ3BhaXIgcmN2X2JjYXN0X2J5dGVzOworCXN0cnVjdCByZWdwYWlyIHJjdl91Y2FzdF9wa3RzOworCXN0cnVjdCByZWdwYWlyIHJjdl9tY2FzdF9wa3RzOworCXN0cnVjdCByZWdwYWlyIHJjdl9iY2FzdF9wa3RzOworfTsKKworZW51bSBjb3JlX3JhbXJvZF9jbWRfaWQgeworCUNPUkVfUkFNUk9EX1VOVVNFRCwKKwlDT1JFX1JBTVJPRF9SWF9RVUVVRV9TVEFSVCwKKwlDT1JFX1JBTVJPRF9UWF9RVUVVRV9TVEFSVCwKKwlDT1JFX1JBTVJPRF9SWF9RVUVVRV9TVE9QLAorCUNPUkVfUkFNUk9EX1RYX1FVRVVFX1NUT1AsCisJTUFYX0NPUkVfUkFNUk9EX0NNRF9JRAorfTsKKworZW51bSBjb3JlX3JvY2VfZmxhdm9yX3R5cGUgeworCUNPUkVfUk9DRSwKKwlDT1JFX1JST0NFLAorCU1BWF9DT1JFX1JPQ0VfRkxBVk9SX1RZUEUKK307CisKK3N0cnVjdCBjb3JlX3J4X2FjdGlvbl9vbl9lcnJvciB7CisJdTggZXJyb3JfdHlwZTsKKyNkZWZpbmUgQ09SRV9SWF9BQ1RJT05fT05fRVJST1JfUEFDS0VUX1RPT19CSUdfTUFTSwkweDMKKyNkZWZpbmUgQ09SRV9SWF9BQ1RJT05fT05fRVJST1JfUEFDS0VUX1RPT19CSUdfU0hJRlQgMAorI2RlZmluZSBDT1JFX1JYX0FDVElPTl9PTl9FUlJPUl9OT19CVUZGX01BU0sJMHgzCisjZGVmaW5lIENPUkVfUlhfQUNUSU9OX09OX0VSUk9SX05PX0JVRkZfU0hJRlQJMgorI2RlZmluZSBDT1JFX1JYX0FDVElPTl9PTl9FUlJPUl9SRVNFUlZFRF9NQVNLCTB4RgorI2RlZmluZSBDT1JFX1JYX0FDVElPTl9PTl9FUlJPUl9SRVNFUlZFRF9TSElGVAk0Cit9OworCitzdHJ1Y3QgY29yZV9yeF9iZCB7CisJc3RydWN0IHJlZ3BhaXIgYWRkcjsKKwlfX2xlMTYgcmVzZXJ2ZWRbNF07Cit9OworCitzdHJ1Y3QgY29yZV9yeF9iZF93aXRoX2J1ZmZfbGVuIHsKKwlzdHJ1Y3QgcmVncGFpciBhZGRyOworCV9fbGUxNiBidWZmX2xlbmd0aDsKKwlfX2xlMTYgcmVzZXJ2ZWRbM107Cit9OworCit1bmlvbiBjb3JlX3J4X2JkX3VuaW9uIHsKKwlzdHJ1Y3QgY29yZV9yeF9iZCByeF9iZDsKKwlzdHJ1Y3QgY29yZV9yeF9iZF93aXRoX2J1ZmZfbGVuIHJ4X2JkX3dpdGhfbGVuOworfTsKKworc3RydWN0IGNvcmVfcnhfY3FlX29wYXF1ZV9kYXRhIHsKKwlfX2xlMzIgZGF0YVsyXTsKK307CisKK2VudW0gY29yZV9yeF9jcWVfdHlwZSB7CisJQ09SRV9SWF9DUUVfSUxMSUdBTF9UWVBFLAorCUNPUkVfUlhfQ1FFX1RZUEVfUkVHVUxBUiwKKwlDT1JFX1JYX0NRRV9UWVBFX0dTSV9PRkZMT0FELAorCUNPUkVfUlhfQ1FFX1RZUEVfU0xPV19QQVRILAorCU1BWF9DT1JFX1JYX0NRRV9UWVBFCit9OworCitzdHJ1Y3QgY29yZV9yeF9mYXN0X3BhdGhfY3FlIHsKKwl1OCB0eXBlOworCXU4IHBsYWNlbWVudF9vZmZzZXQ7CisJc3RydWN0IHBhcnNpbmdfYW5kX2Vycl9mbGFncyBwYXJzZV9mbGFnczsKKwlfX2xlMTYgcGFja2V0X2xlbmd0aDsKKwlfX2xlMTYgdmxhbjsKKwlzdHJ1Y3QgY29yZV9yeF9jcWVfb3BhcXVlX2RhdGEgb3BhcXVlX2RhdGE7CisJX19sZTMyIHJlc2VydmVkWzRdOworfTsKKworc3RydWN0IGNvcmVfcnhfZ3NpX29mZmxvYWRfY3FlIHsKKwl1OCB0eXBlOworCXU4IGRhdGFfbGVuZ3RoX2Vycm9yOworCXN0cnVjdCBwYXJzaW5nX2FuZF9lcnJfZmxhZ3MgcGFyc2VfZmxhZ3M7CisJX19sZTE2IGRhdGFfbGVuZ3RoOworCV9fbGUxNiB2bGFuOworCV9fbGUzMiBzcmNfbWFjX2FkZHJoaTsKKwlfX2xlMTYgc3JjX21hY19hZGRybG87CisJdTggcmVzZXJ2ZWQxWzJdOworCV9fbGUzMiBnaWRfZHN0WzRdOworfTsKKworc3RydWN0IGNvcmVfcnhfc2xvd19wYXRoX2NxZSB7CisJdTggdHlwZTsKKwl1OCByYW1yb2RfY21kX2lkOworCV9fbGUxNiBlY2hvOworCV9fbGUzMiByZXNlcnZlZDFbN107Cit9OworCit1bmlvbiBjb3JlX3J4X2NxZV91bmlvbiB7CisJc3RydWN0IGNvcmVfcnhfZmFzdF9wYXRoX2NxZSByeF9jcWVfZnA7CisJc3RydWN0IGNvcmVfcnhfZ3NpX29mZmxvYWRfY3FlIHJ4X2NxZV9nc2k7CisJc3RydWN0IGNvcmVfcnhfc2xvd19wYXRoX2NxZSByeF9jcWVfc3A7Cit9OworCitzdHJ1Y3QgY29yZV9yeF9zdGFydF9yYW1yb2RfZGF0YSB7CisJc3RydWN0IHJlZ3BhaXIgYmRfYmFzZTsKKwlzdHJ1Y3QgcmVncGFpciBjcWVfcGJsX2FkZHI7CisJX19sZTE2IG10dTsKKwlfX2xlMTYgc2JfaWQ7CisJdTggc2JfaW5kZXg7CisJdTggY29tcGxldGVfY3FlX2ZsZzsKKwl1OCBjb21wbGV0ZV9ldmVudF9mbGc7CisJdTggZHJvcF90dGwwX2ZsZzsKKwlfX2xlMTYgbnVtX29mX3BibF9wYWdlczsKKwl1OCBpbm5lcl92bGFuX3JlbW92YWxfZW47CisJdTggcXVldWVfaWQ7CisJdTggbWFpbl9mdW5jX3F1ZXVlOworCXU4IG1mX3NpX2JjYXN0X2FjY2VwdF9hbGw7CisJdTggbWZfc2lfbWNhc3RfYWNjZXB0X2FsbDsKKwlzdHJ1Y3QgY29yZV9yeF9hY3Rpb25fb25fZXJyb3IgYWN0aW9uX29uX2Vycm9yOworCXU4IGdzaV9vZmZsb2FkX2ZsYWc7CisJdTggcmVzZXJ2ZWRbN107Cit9OworCitzdHJ1Y3QgY29yZV9yeF9zdG9wX3JhbXJvZF9kYXRhIHsKKwl1OCBjb21wbGV0ZV9jcWVfZmxnOworCXU4IGNvbXBsZXRlX2V2ZW50X2ZsZzsKKwl1OCBxdWV1ZV9pZDsKKwl1OCByZXNlcnZlZDE7CisJX19sZTE2IHJlc2VydmVkMlsyXTsKK307CisKK3N0cnVjdCBjb3JlX3R4X2JkX2ZsYWdzIHsKKwl1OCBhc19iaXRmaWVsZDsKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19GT1JDRV9WTEFOX01PREVfTUFTSwkweDEKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19GT1JDRV9WTEFOX01PREVfU0hJRlQJMAorI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX1ZMQU5fSU5TRVJUSU9OX01BU0sJMHgxCisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfVkxBTl9JTlNFUlRJT05fU0hJRlQJMQorI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX1NUQVJUX0JEX01BU0sJMHgxCisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfU1RBUlRfQkRfU0hJRlQJMgorI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX0lQX0NTVU1fTUFTSwkweDEKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19JUF9DU1VNX1NISUZUCTMKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19MNF9DU1VNX01BU0sJMHgxCisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfTDRfQ1NVTV9TSElGVAk0CisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfSVBWNl9FWFRfTUFTSwkweDEKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19JUFY2X0VYVF9TSElGVAk1CisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfTDRfUFJPVE9DT0xfTUFTSwkweDEKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19MNF9QUk9UT0NPTF9TSElGVAk2CisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfTDRfUFNFVURPX0NTVU1fTU9ERV9NQVNLCTB4MQorI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX0w0X1BTRVVET19DU1VNX01PREVfU0hJRlQgNworI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX1JPQ0VfRkxBVl9NQVNLCQkweDEKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19ST0NFX0ZMQVZfU0hJRlQJMTIKKworfTsKKworc3RydWN0IGNvcmVfdHhfYmQgeworCXN0cnVjdCByZWdwYWlyIGFkZHI7CisJX19sZTE2IG5ieXRlczsKKwlfX2xlMTYgbndfdmxhbl9vcl9sYl9lY2hvOworCXU4IGJpdGZpZWxkMDsKKyNkZWZpbmUgQ09SRV9UWF9CRF9OQkRTX01BU0sJMHhGCisjZGVmaW5lIENPUkVfVFhfQkRfTkJEU19TSElGVAkwCisjZGVmaW5lIENPUkVfVFhfQkRfUk9DRV9GTEFWX01BU0sJMHgxCisjZGVmaW5lIENPUkVfVFhfQkRfUk9DRV9GTEFWX1NISUZUCTQKKyNkZWZpbmUgQ09SRV9UWF9CRF9SRVNFUlZFRDBfTUFTSwkweDcKKyNkZWZpbmUgQ09SRV9UWF9CRF9SRVNFUlZFRDBfU0hJRlQJNQorCXN0cnVjdCBjb3JlX3R4X2JkX2ZsYWdzIGJkX2ZsYWdzOworCV9fbGUxNiBiaXRmaWVsZDE7CisjZGVmaW5lIENPUkVfVFhfQkRfTDRfSERSX09GRlNFVF9XX01BU0sJMHgzRkZGCisjZGVmaW5lIENPUkVfVFhfQkRfTDRfSERSX09GRlNFVF9XX1NISUZUIDAKKyNkZWZpbmUgQ09SRV9UWF9CRF9UWF9EU1RfTUFTSwkweDEKKyNkZWZpbmUgQ09SRV9UWF9CRF9UWF9EU1RfU0hJRlQJMTQKKyNkZWZpbmUgQ09SRV9UWF9CRF9SRVNFUlZFRDFfTUFTSwkweDEKKyNkZWZpbmUgQ09SRV9UWF9CRF9SRVNFUlZFRDFfU0hJRlQJMTUKK307CisKK2VudW0gY29yZV90eF9kZXN0IHsKKwlDT1JFX1RYX0RFU1RfTlcsCisJQ09SRV9UWF9ERVNUX0xCLAorCU1BWF9DT1JFX1RYX0RFU1QKK307CisKK3N0cnVjdCBjb3JlX3R4X3N0YXJ0X3JhbXJvZF9kYXRhIHsKKwlzdHJ1Y3QgcmVncGFpciBwYmxfYmFzZV9hZGRyOworCV9fbGUxNiBtdHU7CisJX19sZTE2IHNiX2lkOworCXU4IHNiX2luZGV4OworCXU4IHN0YXRzX2VuOworCXU4IHN0YXRzX2lkOworCXU4IGNvbm5fdHlwZTsKKwlfX2xlMTYgcGJsX3NpemU7CisJX19sZTE2IHFtX3BxX2lkOworCXU4IGdzaV9vZmZsb2FkX2ZsYWc7CisJdTggcmVzcnZlZFszXTsKK307CisKK3N0cnVjdCBjb3JlX3R4X3N0b3BfcmFtcm9kX2RhdGEgeworCV9fbGUzMiByZXNlcnZlZDBbMl07Cit9OworCiBzdHJ1Y3QgZXRoX21zdG9ybV9wZXJfcGZfc3RhdCB7CiAJc3RydWN0IHJlZ3BhaXIgZ3JlX2Rpc2NhcmRfcGt0czsKIAlzdHJ1Y3QgcmVncGFpciB2eGxhbl9kaXNjYXJkX3BrdHM7CkBAIC02MzYsOSArODc3LDMzIEBACiB9OwogCiAvKiBNc3Rvcm0gbm9uLXRyaWdnZXJpbmcgVkYgem9uZSAqLworZW51bSBtYWxpY2lvdXNfdmZfZXJyb3JfaWQgeworCU1BTElDSU9VU19WRl9OT19FUlJPUiwKKwlWRl9QRl9DSEFOTkVMX05PVF9SRUFEWSwKKwlWRl9aT05FX01TR19OT1RfVkFMSUQsCisJVkZfWk9ORV9GVU5DX05PVF9FTkFCTEVELAorCUVUSF9QQUNLRVRfVE9PX1NNQUxMLAorCUVUSF9JTExFR0FMX1ZMQU5fTU9ERSwKKwlFVEhfTVRVX1ZJT0xBVElPTiwKKwlFVEhfSUxMRUdBTF9JTkJBTkRfVEFHUywKKwlFVEhfVkxBTl9JTlNFUlRfQU5EX0lOQkFORF9WTEFOLAorCUVUSF9JTExFR0FMX05CRFMsCisJRVRIX0ZJUlNUX0JEX1dPX1NPUCwKKwlFVEhfSU5TVUZGSUNJRU5UX0JEUywKKwlFVEhfSUxMRUdBTF9MU09fSERSX05CRFMsCisJRVRIX0lMTEVHQUxfTFNPX01TUywKKwlFVEhfWkVST19TSVpFX0JELAorCUVUSF9JTExFR0FMX0xTT19IRFJfTEVOLAorCUVUSF9JTlNVRkZJQ0lFTlRfUEFZTE9BRCwKKwlFVEhfRURQTV9PVVRfT0ZfU1lOQywKKwlFVEhfVFVOTl9JUFY2X0VYVF9OQkRfRVJSLAorCUVUSF9DT05UUk9MX1BBQ0tFVF9WSU9MQVRJT04sCisJTUFYX01BTElDSU9VU19WRl9FUlJPUl9JRAorfTsKKwogc3RydWN0IG1zdG9ybV9ub25fdHJpZ2dlcl92Zl96b25lIHsKIAlzdHJ1Y3QgZXRoX21zdG9ybV9wZXJfcXVldWVfc3RhdCBldGhfcXVldWVfc3RhdDsKLQlzdHJ1Y3QgZXRoX3J4X3Byb2RfZGF0YSBldGhfcnhfcXVldWVfcHJvZHVjZXJzW0VUSF9NQVhfTlVNX1JYX1FVRVVFU19QRVJfVkZdOworCXN0cnVjdCBldGhfcnhfcHJvZF9kYXRhIGV0aF9yeF9xdWV1ZV9wcm9kdWNlcnNbRVRIX01BWF9OVU1fUlhfUVVFVUVTX1BFUl9WRl9RVUFEXTsKIH07CiAKIC8qIE1zdG9ybSBWRiB6b25lICovCkBAIC03MDUsMTMgKzk3MCwxNyBAQAogCiBzdHJ1Y3QgcHJvdG9jb2xfZGNiX2RhdGEgewogCXU4IGRjYl9lbmFibGVfZmxhZzsKKwl1OCByZXNlcnZlZF9hOwogCXU4IGRjYl9wcmlvcml0eTsKIAl1OCBkY2JfdGM7Ci0JdTggcmVzZXJ2ZWQ7CisJdTggcmVzZXJ2ZWRfYjsKKwl1OCByZXNlcnZlZDA7CiB9OwogCiBzdHJ1Y3QgcGZfdXBkYXRlX3R1bm5lbF9jb25maWcgewogCXU4IHVwZGF0ZV9yeF9wZl9jbHNzOworCXU4IHVwZGF0ZV9yeF9kZWZfdWNhc3RfY2xzczsKKwl1OCB1cGRhdGVfcnhfZGVmX25vbl91Y2FzdF9jbHNzOwogCXU4IHVwZGF0ZV90eF9wZl9jbHNzOwogCXU4IHNldF92eGxhbl91ZHBfcG9ydF9mbGc7CiAJdTggc2V0X2dlbmV2ZV91ZHBfcG9ydF9mbGc7CkBAIC03MjcsNyArOTk2LDcgQEAKIAl1OCB0dW5uZWxfY2xzc19pcGdyZTsKIAlfX2xlMTYgdnhsYW5fdWRwX3BvcnQ7CiAJX19sZTE2IGdlbmV2ZV91ZHBfcG9ydDsKLQlfX2xlMTYgcmVzZXJ2ZWRbM107CisJX19sZTE2IHJlc2VydmVkWzJdOwogfTsKIAogc3RydWN0IHBmX3VwZGF0ZV9yYW1yb2RfZGF0YSB7CkBAIC03MzYsMTYgKzEwMDUsMTcgQEAKIAl1OCB1cGRhdGVfZmNvZV9kY2JfZGF0YV9mbGFnOwogCXU4IHVwZGF0ZV9pc2NzaV9kY2JfZGF0YV9mbGFnOwogCXU4IHVwZGF0ZV9yb2NlX2RjYl9kYXRhX2ZsYWc7CisJdTggdXBkYXRlX3Jyb2NlX2RjYl9kYXRhX2ZsYWc7CiAJdTggdXBkYXRlX2l3YXJwX2RjYl9kYXRhX2ZsYWc7CiAJdTggdXBkYXRlX21mX3ZsYW5fZmxhZzsKLQl1OCByZXNlcnZlZDsKIAlzdHJ1Y3QgcHJvdG9jb2xfZGNiX2RhdGEgZXRoX2RjYl9kYXRhOwogCXN0cnVjdCBwcm90b2NvbF9kY2JfZGF0YSBmY29lX2RjYl9kYXRhOwogCXN0cnVjdCBwcm90b2NvbF9kY2JfZGF0YSBpc2NzaV9kY2JfZGF0YTsKIAlzdHJ1Y3QgcHJvdG9jb2xfZGNiX2RhdGEgcm9jZV9kY2JfZGF0YTsKKwlzdHJ1Y3QgcHJvdG9jb2xfZGNiX2RhdGEgcnJvY2VfZGNiX2RhdGE7CiAJc3RydWN0IHByb3RvY29sX2RjYl9kYXRhIGl3YXJwX2RjYl9kYXRhOwogCV9fbGUxNiBtZl92bGFuOwotCV9fbGUxNiByZXNlcnZlZDI7CisJX19sZTE2IHJlc2VydmVkOwogCXN0cnVjdCBwZl91cGRhdGVfdHVubmVsX2NvbmZpZyB0dW5uZWxfY29uZmlnOwogfTsKIApAQCAtNzY2LDEwICsxMDM2LDE0IEBACiAJTUFYX1BST1RPQ09MX1ZFUlNJT05fQVJSQVlfS0VZCiB9OwogCi0vKiBQc3Rvcm0gbm9uLXRyaWdnZXJpbmcgVkYgem9uZSAqLworc3RydWN0IHJkbWFfc2VudF9zdGF0cyB7CisJc3RydWN0IHJlZ3BhaXIgc2VudF9ieXRlczsKKwlzdHJ1Y3QgcmVncGFpciBzZW50X3BrdHM7Cit9OworCiBzdHJ1Y3QgcHN0b3JtX25vbl90cmlnZ2VyX3ZmX3pvbmUgewogCXN0cnVjdCBldGhfcHN0b3JtX3Blcl9xdWV1ZV9zdGF0IGV0aF9xdWV1ZV9zdGF0OwotCXN0cnVjdCByZWdwYWlyIHJlc2VydmVkWzJdOworCXN0cnVjdCByZG1hX3NlbnRfc3RhdHMgcmRtYV9zdGF0czsKIH07CiAKIC8qIFBzdG9ybSBWRiB6b25lICovCkBAIC03ODYsNyArMTA2MCwxMSBAQAogCV9fbGUxNiBlY2hvOwogfTsKIAotLyogU2xvd3BhdGggRWxlbWVudCAoU1BRRSkgKi8KK3N0cnVjdCByZG1hX3Jjdl9zdGF0cyB7CisJc3RydWN0IHJlZ3BhaXIgcmN2X2J5dGVzOworCXN0cnVjdCByZWdwYWlyIHJjdl9wa3RzOworfTsKKwogc3RydWN0IHNsb3dfcGF0aF9lbGVtZW50IHsKIAlzdHJ1Y3QgcmFtcm9kX2hlYWRlciBoZHI7CiAJc3RydWN0IHJlZ3BhaXIgZGF0YV9wdHI7CkBAIC03OTQsNyArMTA3Miw3IEBACiAKIC8qIFRzdG9ybSBub24tdHJpZ2dlcmluZyBWRiB6b25lICovCiBzdHJ1Y3QgdHN0b3JtX25vbl90cmlnZ2VyX3ZmX3pvbmUgewotCXN0cnVjdCByZWdwYWlyIHJlc2VydmVkWzJdOworCXN0cnVjdCByZG1hX3Jjdl9zdGF0cyByZG1hX3N0YXRzOwogfTsKIAogc3RydWN0IHRzdG9ybV9wZXJfcG9ydF9zdGF0IHsKQEAgLTgwMiw5ICsxMDgwLDE0IEBACiAJc3RydWN0IHJlZ3BhaXIgbWFjX2Vycm9yX2Rpc2NhcmQ7CiAJc3RydWN0IHJlZ3BhaXIgbWZ0YWdfZmlsdGVyX2Rpc2NhcmQ7CiAJc3RydWN0IHJlZ3BhaXIgZXRoX21hY19maWx0ZXJfZGlzY2FyZDsKLQlzdHJ1Y3QgcmVncGFpciByZXNlcnZlZFs1XTsKKwlzdHJ1Y3QgcmVncGFpciBsbDJfbWFjX2ZpbHRlcl9kaXNjYXJkOworCXN0cnVjdCByZWdwYWlyIGxsMl9jb25uX2Rpc2FibGVkX2Rpc2NhcmQ7CisJc3RydWN0IHJlZ3BhaXIgaXNjc2lfaXJyZWd1bGFyX3BrdDsKKwlzdHJ1Y3QgcmVncGFpciByZXNlcnZlZDsKKwlzdHJ1Y3QgcmVncGFpciByb2NlX2lycmVndWxhcl9wa3Q7CiAJc3RydWN0IHJlZ3BhaXIgZXRoX2lycmVndWxhcl9wa3Q7Ci0Jc3RydWN0IHJlZ3BhaXIgcmVzZXJ2ZWQxWzJdOworCXN0cnVjdCByZWdwYWlyIHJlc2VydmVkMTsKKwlzdHJ1Y3QgcmVncGFpciBwcmVyb2NlX2lycmVndWxhcl9wa3Q7CiAJc3RydWN0IHJlZ3BhaXIgZXRoX2dyZV90dW5uX2ZpbHRlcl9kaXNjYXJkOwogCXN0cnVjdCByZWdwYWlyIGV0aF92eGxhbl90dW5uX2ZpbHRlcl9kaXNjYXJkOwogCXN0cnVjdCByZWdwYWlyIGV0aF9nZW5ldmVfdHVubl9maWx0ZXJfZGlzY2FyZDsKQEAgLTg3MCw3ICsxMTUzLDEzIEBACiAJX19sZTMyIHJlc2VydmVkMjsKIH07CiAKLS8qIEF0dGVudGlvbnMgc3RhdHVzIGJsb2NrICovCitlbnVtIHZmX3pvbmVfc2l6ZV9tb2RlIHsKKwlWRl9aT05FX1NJWkVfTU9ERV9ERUZBVUxULAorCVZGX1pPTkVfU0laRV9NT0RFX0RPVUJMRSwKKwlWRl9aT05FX1NJWkVfTU9ERV9RVUFELAorCU1BWF9WRl9aT05FX1NJWkVfTU9ERQorfTsKKwogc3RydWN0IGF0dGVuX3N0YXR1c19ibG9jayB7CiAJX19sZTMyIGF0dGVuX2JpdHM7CiAJX19sZTMyIGF0dGVuX2FjazsKQEAgLTE0NDIsMTMgKzE3MzEsNiBAQAogCU1BWF9CSU5fREJHX0JVRkZFUl9UWVBFCiB9OwogCi0vKiBDaGlwIElEcyAqLwotZW51bSBjaGlwX2lkcyB7Ci0JQ0hJUF9SRVNFUlZFRCwKLQlDSElQX0JCX0IwLAotCUNISVBfUkVTRVJWRUQyLAotCU1BWF9DSElQX0lEUwotfTsKIAogLyogQXR0ZW50aW9uIGJpdCBtYXBwaW5nICovCiBzdHJ1Y3QgZGJnX2F0dG5fYml0X21hcHBpbmcgewpAQCAtMTUyNyw2ICsxODA5LDM3MSBAQAogCU1BWF9EQkdfQVRUTl9UWVBFCiB9OwogCisvKiBjb25kaXRpb24gaGVhZGVyIGZvciByZWdpc3RlcnMgZHVtcCAqLworc3RydWN0IGRiZ19kdW1wX2NvbmRfaGRyIHsKKwlzdHJ1Y3QgZGJnX21vZGVfaGRyIG1vZGU7IC8qIE1vZGUgaGVhZGVyICovCisJdTggYmxvY2tfaWQ7IC8qIGJsb2NrIElEICovCisJdTggZGF0YV9zaXplOyAvKiBzaXplIGluIGR3b3JkcyBvZiB0aGUgZGF0YSBmb2xsb3dpbmcgdGhpcyBoZWFkZXIgKi8KK307CisKKy8qIG1lbW9yeSBkYXRhIGZvciByZWdpc3RlcnMgZHVtcCAqLworc3RydWN0IGRiZ19kdW1wX21lbSB7CisJX19sZTMyIGR3b3JkMDsKKyNkZWZpbmUgREJHX0RVTVBfTUVNX0FERFJFU1NfTUFTSyAgICAgICAweEZGRkZGRgorI2RlZmluZSBEQkdfRFVNUF9NRU1fQUREUkVTU19TSElGVCAgICAgIDAKKyNkZWZpbmUgREJHX0RVTVBfTUVNX01FTV9HUk9VUF9JRF9NQVNLICAweEZGCisjZGVmaW5lIERCR19EVU1QX01FTV9NRU1fR1JPVVBfSURfU0hJRlQgMjQKKwlfX2xlMzIgZHdvcmQxOworI2RlZmluZSBEQkdfRFVNUF9NRU1fTEVOR1RIX01BU0sgICAgICAgIDB4RkZGRkZGCisjZGVmaW5lIERCR19EVU1QX01FTV9MRU5HVEhfU0hJRlQgICAgICAgMAorI2RlZmluZSBEQkdfRFVNUF9NRU1fUkVTRVJWRURfTUFTSyAgICAgIDB4RkYKKyNkZWZpbmUgREJHX0RVTVBfTUVNX1JFU0VSVkVEX1NISUZUICAgICAyNAorfTsKKworLyogcmVnaXN0ZXIgZGF0YSBmb3IgcmVnaXN0ZXJzIGR1bXAgKi8KK3N0cnVjdCBkYmdfZHVtcF9yZWcgeworCV9fbGUzMiBkYXRhOworI2RlZmluZSBEQkdfRFVNUF9SRUdfQUREUkVTU19NQVNLICAweEZGRkZGRiAvKiByZWdpc3RlciBhZGRyZXNzIChpbiBkd29yZHMpICovCisjZGVmaW5lIERCR19EVU1QX1JFR19BRERSRVNTX1NISUZUIDAKKyNkZWZpbmUgREJHX0RVTVBfUkVHX0xFTkdUSF9NQVNLICAgMHhGRiAvKiByZWdpc3RlciBzaXplIChpbiBkd29yZHMpICovCisjZGVmaW5lIERCR19EVU1QX1JFR19MRU5HVEhfU0hJRlQgIDI0Cit9OworCisvKiBzcGxpdCBoZWFkZXIgZm9yIHJlZ2lzdGVycyBkdW1wICovCitzdHJ1Y3QgZGJnX2R1bXBfc3BsaXRfaGRyIHsKKwlfX2xlMzIgaGRyOworI2RlZmluZSBEQkdfRFVNUF9TUExJVF9IRFJfREFUQV9TSVpFX01BU0sgICAgICAweEZGRkZGRgorI2RlZmluZSBEQkdfRFVNUF9TUExJVF9IRFJfREFUQV9TSVpFX1NISUZUICAgICAwCisjZGVmaW5lIERCR19EVU1QX1NQTElUX0hEUl9TUExJVF9UWVBFX0lEX01BU0sgIDB4RkYKKyNkZWZpbmUgREJHX0RVTVBfU1BMSVRfSERSX1NQTElUX1RZUEVfSURfU0hJRlQgMjQKK307CisKKy8qIGNvbmRpdGlvbiBoZWFkZXIgZm9yIGlkbGUgY2hlY2sgKi8KK3N0cnVjdCBkYmdfaWRsZV9jaGtfY29uZF9oZHIgeworCXN0cnVjdCBkYmdfbW9kZV9oZHIgbW9kZTsgLyogTW9kZSBoZWFkZXIgKi8KKwlfX2xlMTYgZGF0YV9zaXplOyAvKiBzaXplIGluIGR3b3JkcyBvZiB0aGUgZGF0YSBmb2xsb3dpbmcgdGhpcyBoZWFkZXIgKi8KK307CisKKy8qIElkbGUgQ2hlY2sgY29uZGl0aW9uIHJlZ2lzdGVyICovCitzdHJ1Y3QgZGJnX2lkbGVfY2hrX2NvbmRfcmVnIHsKKwlfX2xlMzIgZGF0YTsKKyNkZWZpbmUgREJHX0lETEVfQ0hLX0NPTkRfUkVHX0FERFJFU1NfTUFTSyAgIDB4RkZGRkZGCisjZGVmaW5lIERCR19JRExFX0NIS19DT05EX1JFR19BRERSRVNTX1NISUZUICAwCisjZGVmaW5lIERCR19JRExFX0NIS19DT05EX1JFR19CTE9DS19JRF9NQVNLICAweEZGCisjZGVmaW5lIERCR19JRExFX0NIS19DT05EX1JFR19CTE9DS19JRF9TSElGVCAyNAorCV9fbGUxNiBudW1fZW50cmllczsgLyogbnVtYmVyIG9mIHJlZ2lzdGVycyBlbnRyaWVzIHRvIGNoZWNrICovCisJdTggZW50cnlfc2l6ZTsgLyogc2l6ZSBvZiByZWdpc3RlcnMgZW50cnkgKGluIGR3b3JkcykgKi8KKwl1OCBzdGFydF9lbnRyeTsgLyogaW5kZXggb2YgdGhlIGZpcnN0IGVudHJ5IHRvIGNoZWNrICovCit9OworCisvKiBJZGxlIENoZWNrIGluZm8gcmVnaXN0ZXIgKi8KK3N0cnVjdCBkYmdfaWRsZV9jaGtfaW5mb19yZWcgeworCV9fbGUzMiBkYXRhOworI2RlZmluZSBEQkdfSURMRV9DSEtfSU5GT19SRUdfQUREUkVTU19NQVNLICAgMHhGRkZGRkYKKyNkZWZpbmUgREJHX0lETEVfQ0hLX0lORk9fUkVHX0FERFJFU1NfU0hJRlQgIDAKKyNkZWZpbmUgREJHX0lETEVfQ0hLX0lORk9fUkVHX0JMT0NLX0lEX01BU0sgIDB4RkYKKyNkZWZpbmUgREJHX0lETEVfQ0hLX0lORk9fUkVHX0JMT0NLX0lEX1NISUZUIDI0CisJX19sZTE2IHNpemU7IC8qIHJlZ2lzdGVyIHNpemUgaW4gZHdvcmRzICovCisJc3RydWN0IGRiZ19tb2RlX2hkciBtb2RlOyAvKiBNb2RlIGhlYWRlciAqLworfTsKKworLyogSWRsZSBDaGVjayByZWdpc3RlciAqLwordW5pb24gZGJnX2lkbGVfY2hrX3JlZyB7CisJc3RydWN0IGRiZ19pZGxlX2Noa19jb25kX3JlZyBjb25kX3JlZzsgLyogY29uZGl0aW9uIHJlZ2lzdGVyICovCisJc3RydWN0IGRiZ19pZGxlX2Noa19pbmZvX3JlZyBpbmZvX3JlZzsgLyogaW5mbyByZWdpc3RlciAqLworfTsKKworLyogSWRsZSBDaGVjayByZXN1bHQgaGVhZGVyICovCitzdHJ1Y3QgZGJnX2lkbGVfY2hrX3Jlc3VsdF9oZHIgeworCV9fbGUxNiBydWxlX2lkOyAvKiBGYWlsaW5nIHJ1bGUgaW5kZXggKi8KKwlfX2xlMTYgbWVtX2VudHJ5X2lkOyAvKiBGYWlsaW5nIG1lbW9yeSBlbnRyeSBpbmRleCAqLworCXU4IG51bV9kdW1wZWRfY29uZF9yZWdzOyAvKiBudW1iZXIgb2YgZHVtcGVkIGNvbmRpdGlvbiByZWdpc3RlcnMgKi8KKwl1OCBudW1fZHVtcGVkX2luZm9fcmVnczsgLyogbnVtYmVyIG9mIGR1bXBlZCBjb25kaXRpb24gcmVnaXN0ZXJzICovCisJdTggc2V2ZXJpdHk7IC8qIGZyb20gZGJnX2lkbGVfY2hrX3NldmVyaXR5X3R5cGVzIGVudW0gKi8KKwl1OCByZXNlcnZlZDsKK307CisKKy8qIElkbGUgQ2hlY2sgcmVzdWx0IHJlZ2lzdGVyIGhlYWRlciAqLworc3RydWN0IGRiZ19pZGxlX2Noa19yZXN1bHRfcmVnX2hkciB7CisJdTggZGF0YTsKKyNkZWZpbmUgREJHX0lETEVfQ0hLX1JFU1VMVF9SRUdfSERSX0lTX01FTV9NQVNLICAweDEKKyNkZWZpbmUgREJHX0lETEVfQ0hLX1JFU1VMVF9SRUdfSERSX0lTX01FTV9TSElGVCAwCisjZGVmaW5lIERCR19JRExFX0NIS19SRVNVTFRfUkVHX0hEUl9SRUdfSURfTUFTSyAgMHg3RgorI2RlZmluZSBEQkdfSURMRV9DSEtfUkVTVUxUX1JFR19IRFJfUkVHX0lEX1NISUZUIDEKKwl1OCBzdGFydF9lbnRyeTsgLyogaW5kZXggb2YgdGhlIGZpcnN0IGNoZWNrZWQgZW50cnkgKi8KKwlfX2xlMTYgc2l6ZTsgLyogcmVnaXN0ZXIgc2l6ZSBpbiBkd29yZHMgKi8KK307CisKKy8qIElkbGUgQ2hlY2sgcnVsZSAqLworc3RydWN0IGRiZ19pZGxlX2Noa19ydWxlIHsKKwlfX2xlMTYgcnVsZV9pZDsgLyogSWRsZSBDaGVjayBydWxlIElEICovCisJdTggc2V2ZXJpdHk7IC8qIHZhbHVlIGZyb20gZGJnX2lkbGVfY2hrX3NldmVyaXR5X3R5cGVzIGVudW0gKi8KKwl1OCBjb25kX2lkOyAvKiBDb25kaXRpb24gSUQgKi8KKwl1OCBudW1fY29uZF9yZWdzOyAvKiBudW1iZXIgb2YgY29uZGl0aW9uIHJlZ2lzdGVycyAqLworCXU4IG51bV9pbmZvX3JlZ3M7IC8qIG51bWJlciBvZiBpbmZvIHJlZ2lzdGVycyAqLworCXU4IG51bV9pbW1zOyAvKiBudW1iZXIgb2YgaW1tZWRpYXRlcyBpbiB0aGUgY29uZGl0aW9uICovCisJdTggcmVzZXJ2ZWQxOworCV9fbGUxNiByZWdfb2Zmc2V0OyAvKiBvZmZzZXQgb2YgdGhpcyBydWxlcyByZWdpc3RlcnMgaW4gdGhlIGlkbGUgY2hlY2sKKwkJCSAgICAqIHJlZ2lzdGVyIGFycmF5IChpbiBkYmdfaWRsZV9jaGtfcmVnIHVuaXRzKS4KKwkJCSAgICAqLworCV9fbGUxNiBpbW1fb2Zmc2V0OyAvKiBvZmZzZXQgb2YgdGhpcyBydWxlcyBpbW1lZGlhdGUgdmFsdWVzIGluIHRoZQorCQkJICAgICogaW1tZWRpYXRlIHZhbHVlcyBhcnJheSAoaW4gZHdvcmRzKS4KKwkJCSAgICAqLworfTsKKworLyogSWRsZSBDaGVjayBydWxlIHBhcnNpbmcgZGF0YSAqLworc3RydWN0IGRiZ19pZGxlX2Noa19ydWxlX3BhcnNpbmdfZGF0YSB7CisJX19sZTMyIGRhdGE7CisjZGVmaW5lIERCR19JRExFX0NIS19SVUxFX1BBUlNJTkdfREFUQV9IQVNfRldfTVNHX01BU0sgIDB4MQorI2RlZmluZSBEQkdfSURMRV9DSEtfUlVMRV9QQVJTSU5HX0RBVEFfSEFTX0ZXX01TR19TSElGVCAwCisjZGVmaW5lIERCR19JRExFX0NIS19SVUxFX1BBUlNJTkdfREFUQV9TVFJfT0ZGU0VUX01BU0sgIDB4N0ZGRkZGRkYKKyNkZWZpbmUgREJHX0lETEVfQ0hLX1JVTEVfUEFSU0lOR19EQVRBX1NUUl9PRkZTRVRfU0hJRlQgMQorfTsKKworLyogaWRsZSBjaGVjayBzZXZlcml0eSB0eXBlcyAqLworZW51bSBkYmdfaWRsZV9jaGtfc2V2ZXJpdHlfdHlwZXMgeworCS8qIGlkbGUgY2hlY2sgZmFpbHVyZSBzaG91bGQgY2F1c2UgYW4gZXJyb3IgKi8KKwlJRExFX0NIS19TRVZFUklUWV9FUlJPUiwKKwkvKiBpZGxlIGNoZWNrIGZhaWx1cmUgc2hvdWxkIGNhdXNlIGFuIGVycm9yIG9ubHkgaWYgdGhlcmVzIG5vIHRyYWZmaWMgKi8KKwlJRExFX0NIS19TRVZFUklUWV9FUlJPUl9OT19UUkFGRklDLAorCS8qIGlkbGUgY2hlY2sgZmFpbHVyZSBzaG91bGQgY2F1c2UgYSB3YXJuaW5nICovCisJSURMRV9DSEtfU0VWRVJJVFlfV0FSTklORywKKwlNQVhfREJHX0lETEVfQ0hLX1NFVkVSSVRZX1RZUEVTCit9OworCisvKiBEZWJ1ZyBCdXMgYmxvY2sgZGF0YSAqLworc3RydWN0IGRiZ19idXNfYmxvY2tfZGF0YSB7CisJdTggZW5hYmxlZDsgLyogSW5kaWNhdGVzIGlmIHRoZSBibG9jayBpcyBlbmFibGVkIGZvciByZWNvcmRpbmcgKDAvMSkgKi8KKwl1OCBod19pZDsgLyogSFcgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBibG9jayAqLworCXU4IGxpbmVfbnVtOyAvKiBEZWJ1ZyBsaW5lIG51bWJlciB0byBzZWxlY3QgKi8KKwl1OCByaWdodF9zaGlmdDsgLyogTnVtYmVyIG9mIHVuaXRzIHRvICByaWdodCB0aGUgZGVidWcgZGF0YSAoMC0zKSAqLworCXU4IGN5Y2xlX2VuOyAvKiA0LWJpdCB2YWx1ZTogYml0IGkgc2V0IC0+IHVuaXQgaSBpcyBlbmFibGVkLiAqLworCXU4IGZvcmNlX3ZhbGlkOyAvKiA0LWJpdCB2YWx1ZTogYml0IGkgc2V0IC0+IHVuaXQgaSBpcyBmb3JjZWQgdmFsaWQuICovCisJdTggZm9yY2VfZnJhbWU7IC8qIDQtYml0IHZhbHVlOiBiaXQgaSBzZXQgLT4gdW5pdCBpIGZyYW1lIGJpdCBpcyBmb3JjZWQuCisJCQkgKi8KKwl1OCByZXNlcnZlZDsKK307CisKKy8qIERlYnVnIEJ1cyBDbGllbnRzICovCitlbnVtIGRiZ19idXNfY2xpZW50cyB7CisJREJHX0JVU19DTElFTlRfUkJDTiwKKwlEQkdfQlVTX0NMSUVOVF9SQkNQLAorCURCR19CVVNfQ0xJRU5UX1JCQ1IsCisJREJHX0JVU19DTElFTlRfUkJDVCwKKwlEQkdfQlVTX0NMSUVOVF9SQkNVLAorCURCR19CVVNfQ0xJRU5UX1JCQ0YsCisJREJHX0JVU19DTElFTlRfUkJDWCwKKwlEQkdfQlVTX0NMSUVOVF9SQkNTLAorCURCR19CVVNfQ0xJRU5UX1JCQ0gsCisJREJHX0JVU19DTElFTlRfUkJDWiwKKwlEQkdfQlVTX0NMSUVOVF9PVEhFUl9FTkdJTkUsCisJREJHX0JVU19DTElFTlRfVElNRVNUQU1QLAorCURCR19CVVNfQ0xJRU5UX0NQVSwKKwlEQkdfQlVTX0NMSUVOVF9SQkNZLAorCURCR19CVVNfQ0xJRU5UX1JCQ1EsCisJREJHX0JVU19DTElFTlRfUkJDTSwKKwlEQkdfQlVTX0NMSUVOVF9SQkNCLAorCURCR19CVVNfQ0xJRU5UX1JCQ1csCisJREJHX0JVU19DTElFTlRfUkJDViwKKwlNQVhfREJHX0JVU19DTElFTlRTCit9OworCisvKiBEZWJ1ZyBCdXMgbWVtb3J5IGFkZHJlc3MgKi8KK3N0cnVjdCBkYmdfYnVzX21lbV9hZGRyIHsKKwlfX2xlMzIgbG87CisJX19sZTMyIGhpOworfTsKKworLyogRGVidWcgQnVzIFBDSSBidWZmZXIgZGF0YSAqLworc3RydWN0IGRiZ19idXNfcGNpX2J1Zl9kYXRhIHsKKwlzdHJ1Y3QgZGJnX2J1c19tZW1fYWRkciBwaHlzX2FkZHI7IC8qIFBDSSBidWZmZXIgcGh5c2ljYWwgYWRkcmVzcyAqLworCXN0cnVjdCBkYmdfYnVzX21lbV9hZGRyIHZpcnRfYWRkcjsgLyogUENJIGJ1ZmZlciB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlfX2xlMzIgc2l6ZTsgLyogUENJIGJ1ZmZlciBzaXplIGluIGJ5dGVzICovCit9OworCisvKiBEZWJ1ZyBCdXMgU3Rvcm0gRUlEIHJhbmdlIGZpbHRlciBwYXJhbXMgKi8KK3N0cnVjdCBkYmdfYnVzX3N0b3JtX2VpZF9yYW5nZV9wYXJhbXMgeworCXU4IG1pbjsgLyogTWluaW1hbCBldmVudCBJRCB0byBmaWx0ZXIgb24gKi8KKwl1OCBtYXg7IC8qIE1heGltYWwgZXZlbnQgSUQgdG8gZmlsdGVyIG9uICovCit9OworCisvKiBEZWJ1ZyBCdXMgU3Rvcm0gRUlEIG1hc2sgZmlsdGVyIHBhcmFtcyAqLworc3RydWN0IGRiZ19idXNfc3Rvcm1fZWlkX21hc2tfcGFyYW1zIHsKKwl1OCB2YWw7IC8qIEV2ZW50IElEIHZhbHVlICovCisJdTggbWFzazsgLyogRXZlbnQgSUQgbWFzay4gMXMgaW4gdGhlIG1hc2sgPSBkb250IGNhcmUgYml0cy4gKi8KK307CisKKy8qIERlYnVnIEJ1cyBTdG9ybSBFSUQgZmlsdGVyIHBhcmFtcyAqLwordW5pb24gZGJnX2J1c19zdG9ybV9laWRfcGFyYW1zIHsKKwlzdHJ1Y3QgZGJnX2J1c19zdG9ybV9laWRfcmFuZ2VfcGFyYW1zIHJhbmdlOworCXN0cnVjdCBkYmdfYnVzX3N0b3JtX2VpZF9tYXNrX3BhcmFtcyBtYXNrOworfTsKKworLyogRGVidWcgQnVzIFN0b3JtIGRhdGEgKi8KK3N0cnVjdCBkYmdfYnVzX3N0b3JtX2RhdGEgeworCXU4IGZhc3RfZW5hYmxlZDsKKwl1OCBmYXN0X21vZGU7CisJdTggc2xvd19lbmFibGVkOworCXU4IHNsb3dfbW9kZTsKKwl1OCBod19pZDsKKwl1OCBlaWRfZmlsdGVyX2VuOworCXU4IGVpZF9yYW5nZV9ub3RfbWFzazsKKwl1OCBjaWRfZmlsdGVyX2VuOworCXVuaW9uIGRiZ19idXNfc3Rvcm1fZWlkX3BhcmFtcyBlaWRfZmlsdGVyX3BhcmFtczsKKwlfX2xlMTYgcmVzZXJ2ZWQ7CisJX19sZTMyIGNpZDsKK307CisKKy8qIERlYnVnIEJ1cyBkYXRhICovCitzdHJ1Y3QgZGJnX2J1c19kYXRhIHsKKwlfX2xlMzIgYXBwX3ZlcnNpb247IC8qIFRoZSB0b29scyB2ZXJzaW9uIG51bWJlciBvZiB0aGUgYXBwbGljYXRpb24gKi8KKwl1OCBzdGF0ZTsgLyogVGhlIGN1cnJlbnQgZGVidWcgYnVzIHN0YXRlICovCisJdTggaHdfZHdvcmRzOyAvKiBIVyBkd29yZHMgcGVyIGN5Y2xlICovCisJdTggbmV4dF9od19pZDsgLyogTmV4dCBIVyBJRCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYW4gaW5wdXQgKi8KKwl1OCBudW1fZW5hYmxlZF9ibG9ja3M7IC8qIE51bWJlciBvZiBibG9ja3MgZW5hYmxlZCBmb3IgcmVjb3JkaW5nICovCisJdTggbnVtX2VuYWJsZWRfc3Rvcm1zOyAvKiBOdW1iZXIgb2YgU3Rvcm1zIGVuYWJsZWQgZm9yIHJlY29yZGluZyAqLworCXU4IHRhcmdldDsgLyogT3V0cHV0IHRhcmdldCAqLworCXU4IG5leHRfdHJpZ2dlcl9zdGF0ZTsgLyogSUQgb2YgbmV4dCB0cmlnZ2VyIHN0YXRlIHRvIGJlIGFkZGVkICovCisJdTggbmV4dF9jb25zdHJhaW50X2lkOyAvKiBJRCBvZiBuZXh0IGZpbHRlci90cmlnZ2VyIGNvbnN0cmFpbnQgdG8gYmUKKwkJCQkqIGFkZGVkLgorCQkJCSovCisJdTggb25lX3Nob3RfZW47IC8qIEluZGljYXRlcyBpZiBvbmUtc2hvdCBtb2RlIGlzIGVuYWJsZWQgKDAvMSkgKi8KKwl1OCBncmNfaW5wdXRfZW47IC8qIEluZGljYXRlcyBpZiBHUkMgcmVjb3JkaW5nIGlzIGVuYWJsZWQgKDAvMSkgKi8KKwl1OCB0aW1lc3RhbXBfaW5wdXRfZW47IC8qIEluZGljYXRlcyBpZiB0aW1lc3RhbXAgcmVjb3JkaW5nIGlzIGVuYWJsZWQKKwkJCQkqICgwLzEpLgorCQkJCSovCisJdTggZmlsdGVyX2VuOyAvKiBJbmRpY2F0ZXMgaWYgdGhlIHJlY29yZGluZyBmaWx0ZXIgaXMgZW5hYmxlZCAoMC8xKSAqLworCXU4IHRyaWdnZXJfZW47IC8qIEluZGljYXRlcyBpZiB0aGUgcmVjb3JkaW5nIHRyaWdnZXIgaXMgZW5hYmxlZCAoMC8xKSAqLworCXU4IGFkZGluZ19maWx0ZXI7IC8qIElmIHRydWUsIHRoZSBuZXh0IGFkZGVkIGNvbnN0cmFpbnQgYmVsb25nIHRvIHRoZQorCQkJICAgKiBmaWx0ZXIuIE90aGVyd2lzZSwgaXQgYmVsb25ncyB0byB0aGUgbGFzdCBhZGRlZAorCQkJICAgKiB0cmlnZ2VyIHN0YXRlLiBWYWxpZCBvbmx5IGlmIGVpdGhlciBmaWx0ZXIgb3IKKwkJCSAgICogdHJpZ2dlcnMgYXJlIGVuYWJsZWQuCisJCQkgICAqLworCXU4IGZpbHRlcl9wcmVfdHJpZ2dlcjsgLyogSW5kaWNhdGVzIGlmIHRoZSByZWNvcmRpbmcgZmlsdGVyIHNob3VsZCBiZQorCQkJCSogYXBwbGllZCBiZWZvcmUgdGhlIHRyaWdnZXIuIFZhbGlkIG9ubHkgaWYgYm90aAorCQkJCSogZmlsdGVyIGFuZCB0cmlnZ2VyIGFyZSBlbmFibGVkICgwLzEpLgorCQkJCSovCisJdTggZmlsdGVyX3Bvc3RfdHJpZ2dlcjsgLyogSW5kaWNhdGVzIGlmIHRoZSByZWNvcmRpbmcgZmlsdGVyIHNob3VsZCBiZQorCQkJCSAqIGFwcGxpZWQgYWZ0ZXIgdGhlIHRyaWdnZXIuIFZhbGlkIG9ubHkgaWYgYm90aAorCQkJCSAqIGZpbHRlciBhbmQgdHJpZ2dlciBhcmUgZW5hYmxlZCAoMC8xKS4KKwkJCQkgKi8KKwl1OCB1bmlmeV9pbnB1dHM7IC8qIElmIHRydWUsIGFsbCBpbnB1dHMgYXJlIGFzc29jaWF0ZWQgd2l0aCBIVyBJRCAwLgorCQkJICAqIE90aGVyd2lzZSwgZWFjaCBpbnB1dCBpcyBhc3NpZ25lZCBhIGRpZmZlcmVudCBIVyBJRAorCQkJICAqICgwLzEpLgorCQkJICAqLworCXU4IHJjdl9mcm9tX290aGVyX2VuZ2luZTsgLyogSW5kaWNhdGVzIGlmIHRoZSBvdGhlciBlbmdpbmUgc2VuZHMgaXQgTlcKKwkJCQkgICAqIHJlY29yZGluZyB0byB0aGlzIGVuZ2luZSAoMC8xKS4KKwkJCQkgICAqLworCXN0cnVjdCBkYmdfYnVzX3BjaV9idWZfZGF0YSBwY2lfYnVmOyAvKiBEZWJ1ZyBCdXMgUENJIGJ1ZmZlciBkYXRhLiBWYWxpZAorCQkJCQkgICAgICAqIG9ubHkgd2hlbiB0aGUgdGFyZ2V0IGlzCisJCQkJCSAgICAgICogREJHX0JVU19UQVJHRVRfSURfUENJLgorCQkJCQkgICAgICAqLworCV9fbGUxNiByZXNlcnZlZDsKKwlzdHJ1Y3QgZGJnX2J1c19ibG9ja19kYXRhIGJsb2Nrc1s4MF07LyogRGVidWcgQnVzIGRhdGEgZm9yIGVhY2ggYmxvY2sgKi8KKwlzdHJ1Y3QgZGJnX2J1c19zdG9ybV9kYXRhIHN0b3Jtc1s2XTsgLyogRGVidWcgQnVzIGRhdGEgZm9yIGVhY2ggYmxvY2sgKi8KK307CisKKy8qIERlYnVnIGJ1cyBmcmFtZSBtb2RlcyAqLworZW51bSBkYmdfYnVzX2ZyYW1lX21vZGVzIHsKKwlEQkdfQlVTX0ZSQU1FX01PREVfMEhXXzRTVCA9IDAsIC8qIDAgSFcgZHdvcmRzLCA0IFN0b3JtIGR3b3JkcyAqLworCURCR19CVVNfRlJBTUVfTU9ERV80SFdfMFNUID0gMywgLyogNCBIVyBkd29yZHMsIDAgU3Rvcm0gZHdvcmRzICovCisJREJHX0JVU19GUkFNRV9NT0RFXzhIV18wU1QgPSA0LCAvKiA4IEhXIGR3b3JkcywgMCBTdG9ybSBkd29yZHMgKi8KKwlNQVhfREJHX0JVU19GUkFNRV9NT0RFUworfTsKKworLyogRGVidWcgYnVzIHN0YXRlcyAqLworZW51bSBkYmdfYnVzX3N0YXRlcyB7CisJREJHX0JVU19TVEFURV9JRExFLCAvKiBkZWJ1ZyBidXMgaWRsZSBzdGF0ZSAobm90IHJlY29yZGluZykgKi8KKwlEQkdfQlVTX1NUQVRFX1JFQURZLCAvKiBkZWJ1ZyBidXMgaXMgcmVhZHkgZm9yIGNvbmZpZ3VyYXRpb24gYW5kCisJCQkgICAgICAqIHJlY29yZGluZy4KKwkJCSAgICAgICovCisJREJHX0JVU19TVEFURV9SRUNPUkRJTkcsIC8qIGRlYnVnIGJ1cyBpcyBjdXJyZW50bHkgcmVjb3JkaW5nICovCisJREJHX0JVU19TVEFURV9TVE9QUEVELCAvKiBkZWJ1ZyBidXMgcmVjb3JkaW5nIGhhcyBzdG9wcGVkICovCisJTUFYX0RCR19CVVNfU1RBVEVTCit9OworCisvKiBEZWJ1ZyBidXMgdGFyZ2V0IElEcyAqLworZW51bSBkYmdfYnVzX3RhcmdldHMgeworCS8qIHJlY29yZHMgZGVidWcgYnVzIHRvIERCRyBibG9jayBpbnRlcm5hbCBidWZmZXIgKi8KKwlEQkdfQlVTX1RBUkdFVF9JRF9JTlRfQlVGLAorCS8qIHJlY29yZHMgZGVidWcgYnVzIHRvIHRoZSBOVyAqLworCURCR19CVVNfVEFSR0VUX0lEX05JRywKKwkvKiByZWNvcmRzIGRlYnVnIGJ1cyB0byBhIFBDSSBidWZmZXIgKi8KKwlEQkdfQlVTX1RBUkdFVF9JRF9QQ0ksCisJTUFYX0RCR19CVVNfVEFSR0VUUworfTsKKworLyogR1JDIER1bXAgZGF0YSAqLworc3RydWN0IGRiZ19ncmNfZGF0YSB7CisJX19sZTMyIHBhcmFtX3ZhbFs0MF07IC8qIFZhbHVlIG9mIGVhY2ggR1JDIHBhcmFtZXRlci4gQXJyYXkgc2l6ZSBtdXN0CisJCQkgICAgICAgKiBtYXRjaCB0aGUgZW51bSBkYmdfZ3JjX3BhcmFtcy4KKwkJCSAgICAgICAqLworCXU4IHBhcmFtX3NldF9ieV91c2VyWzQwXTsgLyogSW5kaWNhdGVzIGZvciBlYWNoIEdSQyBwYXJhbWV0ZXIgaWYgaXQgd2FzCisJCQkJICAgKiBzZXQgYnkgdGhlIHVzZXIgKDAvMSkuIEFycmF5IHNpemUgbXVzdAorCQkJCSAgICogbWF0Y2ggdGhlIGVudW0gZGJnX2dyY19wYXJhbXMuCisJCQkJICAgKi8KK307CisKKy8qIERlYnVnIEdSQyBwYXJhbXMgKi8KK2VudW0gZGJnX2dyY19wYXJhbXMgeworCURCR19HUkNfUEFSQU1fRFVNUF9UU1RPUk0sIC8qIGR1bXAgVHN0b3JtIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX01TVE9STSwgLyogZHVtcCBNc3Rvcm0gbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfVVNUT1JNLCAvKiBkdW1wIFVzdG9ybSBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9YU1RPUk0sIC8qIGR1bXAgWHN0b3JtIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX1lTVE9STSwgLyogZHVtcCBZc3Rvcm0gbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfUFNUT1JNLCAvKiBkdW1wIFBzdG9ybSBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9SRUdTLCAvKiBkdW1wIG5vbi1tZW1vcnkgcmVnaXN0ZXJzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX1JBTSwgLyogZHVtcCBTdG9ybSBpbnRlcm5hbCBSQU1zICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX1BCVUYsIC8qIGR1bXAgU3Rvcm0gcGFzc2l2ZSBidWZmZXIgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfSU9SLCAvKiBkdW1wIFN0b3JtIElPUnMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfVkZDLCAvKiBkdW1wIFZGQyBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9DTV9DVFgsIC8qIGR1bXAgQ00gY29udGV4dHMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfUFhQLCAvKiBkdW1wIFBYUCBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9SU1MsIC8qIGR1bXAgUlNTIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX0NBVSwgLyogZHVtcCBDQVUgbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfUU0sIC8qIGR1bXAgUU0gbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfTUNQLCAvKiBkdW1wIE1DUCBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fUkVTRVJWRUQsIC8qIHJlc2VydmVkICovCisJREJHX0dSQ19QQVJBTV9EVU1QX0NGQywgLyogZHVtcCBDRkMgbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfSUdVLCAvKiBkdW1wIElHVSBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9CUkIsIC8qIGR1bXAgQlJCIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX0JUQiwgLyogZHVtcCBCVEIgbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfQk1CLCAvKiBkdW1wIEJNQiBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9OSUcsIC8qIGR1bXAgTklHIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX01VTEQsIC8qIGR1bXAgTVVMRCBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9QUlMsIC8qIGR1bXAgUFJTIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX0RNQUUsIC8qIGR1bXAgUFJTIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX1RNLCAvKiBkdW1wIFRNICh0aW1lcnMpIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX1NETSwgLyogZHVtcCBTRE0gbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfRElGLCAvKiBkdW1wIERJRiBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9TVEFUSUMsIC8qIGR1bXAgc3RhdGljIGRlYnVnIGRhdGEgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX1VOU1RBTEwsIC8qIHVuLXN0YWxsIFN0b3JtcyBhZnRlciBkdW1wICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9OVU1fTENJRFMsIC8qIG51bWJlciBvZiBMQ0lEcyAoMC4uMzIwKSAqLworCURCR19HUkNfUEFSQU1fTlVNX0xUSURTLCAvKiBudW1iZXIgb2YgTFRJRHMgKDAuLjMyMCkgKi8KKwkvKiBwcmVzZXQ6IGV4Y2x1ZGUgYWxsIG1lbW9yaWVzIGZyb20gZHVtcCAoMSBvbmx5KSAqLworCURCR19HUkNfUEFSQU1fRVhDTFVERV9BTEwsCisJLyogcHJlc2V0OiBpbmNsdWRlIG1lbW9yaWVzIGZvciBjcmFzaCBkdW1wICgxIG9ubHkpICovCisJREJHX0dSQ19QQVJBTV9DUkFTSCwKKwkvKiBwZXJmb3JtIGR1bXAgb25seSBpZiBNRlcgaXMgcmVzcG9uZGluZyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fUEFSSVRZX1NBRkUsCisJREJHX0dSQ19QQVJBTV9EVU1QX0NNLCAvKiBkdW1wIENNIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX1BIWSwgLyogZHVtcCBQSFkgbWVtb3JpZXMgKDAvMSkgKi8KKwlNQVhfREJHX0dSQ19QQVJBTVMKK307CisKKy8qIERlYnVnIHJlc2V0IHJlZ2lzdGVycyAqLworZW51bSBkYmdfcmVzZXRfcmVncyB7CisJREJHX1JFU0VUX1JFR19NSVNDU19QTF9VQSwKKwlEQkdfUkVTRVRfUkVHX01JU0NTX1BMX0hWLAorCURCR19SRVNFVF9SRUdfTUlTQ1NfUExfSFZfMiwKKwlEQkdfUkVTRVRfUkVHX01JU0NfUExfVUEsCisJREJHX1JFU0VUX1JFR19NSVNDX1BMX0hWLAorCURCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwKKwlEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsCisJREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WQVVYLAorCU1BWF9EQkdfUkVTRVRfUkVHUworfTsKKwogLyogRGVidWcgc3RhdHVzIGNvZGVzICovCiBlbnVtIGRiZ19zdGF0dXMgewogCURCR19TVEFUVVNfT0ssCkBAIC0xNTc5LDkgKzIyMjYsNDUgQEAKIAlEQkdfU1RBVFVTX1JFR19GSUZPX0JBRF9EQVRBLAogCURCR19TVEFUVVNfUFJPVEVDVElPTl9PVkVSUklERV9CQURfREFUQSwKIAlEQkdfU1RBVFVTX0RCR19BUlJBWV9OT1RfU0VULAorCURCR19TVEFUVVNfTVVMVElfQkxPQ0tTX1dJVEhfRklMVEVSLAogCU1BWF9EQkdfU1RBVFVTCiB9OwogCisvKiBEZWJ1ZyBTdG9ybXMgSURzICovCitlbnVtIGRiZ19zdG9ybXMgeworCURCR19UU1RPUk1fSUQsCisJREJHX01TVE9STV9JRCwKKwlEQkdfVVNUT1JNX0lELAorCURCR19YU1RPUk1fSUQsCisJREJHX1lTVE9STV9JRCwKKwlEQkdfUFNUT1JNX0lELAorCU1BWF9EQkdfU1RPUk1TCit9OworCisvKiBJZGxlIENoZWNrIGRhdGEgKi8KK3N0cnVjdCBpZGxlX2Noa19kYXRhIHsKKwlfX2xlMzIgYnVmX3NpemU7IC8qIElkbGUgY2hlY2sgYnVmZmVyIHNpemUgaW4gZHdvcmRzICovCisJdTggYnVmX3NpemVfc2V0OyAvKiBJbmRpY2F0ZXMgaWYgdGhlIGlkbGUgY2hlY2sgYnVmZmVyIHNpemUgd2FzIHNldAorCQkJICAqICgwLzEpLgorCQkJICAqLworCXU4IHJlc2VydmVkMTsKKwlfX2xlMTYgcmVzZXJ2ZWQyOworfTsKKworLyogRGVidWcgVG9vbHMgZGF0YSAocGVyIEhXIGZ1bmN0aW9uKSAqLworc3RydWN0IGRiZ190b29sc19kYXRhIHsKKwlzdHJ1Y3QgZGJnX2dyY19kYXRhIGdyYzsgLyogR1JDIER1bXAgZGF0YSAqLworCXN0cnVjdCBkYmdfYnVzX2RhdGEgYnVzOyAvKiBEZWJ1ZyBCdXMgZGF0YSAqLworCXN0cnVjdCBpZGxlX2Noa19kYXRhIGlkbGVfY2hrOyAvKiBJZGxlIENoZWNrIGRhdGEgKi8KKwl1OCBtb2RlX2VuYWJsZVs0MF07IC8qIEluZGljYXRlcyBpZiBhIG1vZGUgaXMgZW5hYmxlZCAoMC8xKSAqLworCXU4IGJsb2NrX2luX3Jlc2V0WzgwXTsgLyogSW5kaWNhdGVzIGlmIGEgYmxvY2sgaXMgaW4gcmVzZXQgc3RhdGUgKDAvMSkuCisJCQkJKi8KKwl1OCBjaGlwX2lkOyAvKiBDaGlwIElEIChmcm9tIGVudW0gY2hpcF9pZHMpICovCisJdTggcGxhdGZvcm1faWQ7IC8qIFBsYXRmb3JtIElEIChmcm9tIGVudW0gcGxhdGZvcm1faWRzKSAqLworCXU4IGluaXRpYWxpemVkOyAvKiBJbmRpY2F0ZXMgaWYgdGhlIGRhdGEgd2FzIGluaXRpYWxpemVkICovCisJdTggcmVzZXJ2ZWQ7Cit9OworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBIU0kgSW5pdCBGdW5jdGlvbnMgY29uc3RhbnRzICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNTg5LDcgKzIyNzIsNDEgQEAKIC8qIE51bWJlciBvZiBWTEFOIHByaW9yaXRpZXMgKi8KICNkZWZpbmUgTlVNX09GX1ZMQU5fUFJJT1JJVElFUwk4CiAKLS8qIFFNIHBlci1wb3J0IGluaXQgcGFyYW1ldGVycyAqLworc3RydWN0IGluaXRfYnJiX3JhbV9yZXEgeworCV9fbGUzMiBndXJhbnRlZWRfcGVyX3RjOworCV9fbGUzMiBoZWFkcm9vbV9wZXJfdGM7CisJX19sZTMyIG1pbl9wa3Rfc2l6ZTsKKwlfX2xlMzIgbWF4X3BvcnRzX3Blcl9lbmdpbmU7CisJdTggbnVtX2FjdGl2ZV90Y3NbTUFYX05VTV9QT1JUU107Cit9OworCitzdHJ1Y3QgaW5pdF9ldHNfdGNfcmVxIHsKKwl1OCB1c2Vfc3A7CisJdTggdXNlX3dmcTsKKwlfX2xlMTYgd2VpZ2h0OworfTsKKworc3RydWN0IGluaXRfZXRzX3JlcSB7CisJX19sZTMyIG10dTsKKwlzdHJ1Y3QgaW5pdF9ldHNfdGNfcmVxIHRjX3JlcVtOVU1fT0ZfVENTXTsKK307CisKK3N0cnVjdCBpbml0X25pZ19sYl9ybF9yZXEgeworCV9fbGUxNiBsYl9tYWNfcmF0ZTsKKwlfX2xlMTYgbGJfcmF0ZTsKKwlfX2xlMzIgbXR1OworCV9fbGUxNiB0Y19yYXRlW05VTV9PRl9QSFlTX1RDU107Cit9OworCitzdHJ1Y3QgaW5pdF9uaWdfcHJpX3RjX21hcF9lbnRyeSB7CisJdTggdGNfaWQ7CisJdTggdmFsaWQ7Cit9OworCitzdHJ1Y3QgaW5pdF9uaWdfcHJpX3RjX21hcF9yZXEgeworCXN0cnVjdCBpbml0X25pZ19wcmlfdGNfbWFwX2VudHJ5IHByaVtOVU1fT0ZfVkxBTl9QUklPUklUSUVTXTsKK307CisKIHN0cnVjdCBpbml0X3FtX3BvcnRfcGFyYW1zIHsKIAl1OCBhY3RpdmU7CiAJdTggYWN0aXZlX3BoeXNfdGNzOwpAQCAtMTYxOSw3ICsyMzM2LDcgQEAKIAogLyogV2lkdGggb2YgR1JDIGFkZHJlc3MgaW4gYml0cyAoYWRkcmVzc2VzIGFyZSBzcGVjaWZpZWQgaW4gZHdvcmRzKSAqLwogI2RlZmluZSBHUkNfQUREUl9CSVRTCTIzCi0jZGVmaW5lIE1BWF9HUkNfQUREUgkoKDEgPDwgR1JDX0FERFJfQklUUykgLSAxKQorI2RlZmluZSBNQVhfR1JDX0FERFIJKEJJVChHUkNfQUREUl9CSVRTKSAtIDEpCiAKIC8qIGluZGljYXRlcyBhbiBpbml0IHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gYW55IHBoYXNlIElEICovCiAjZGVmaW5lIEFOWV9QSEFTRV9JRAkweGZmZmYKQEAgLTE2MjcsMTUgKzIzNDQsNTAgQEAKIC8qIE1heCBzaXplIGluIGR3b3JkcyBvZiBhIHppcHBlZCBhcnJheSAqLwogI2RlZmluZSBNQVhfWklQUEVEX1NJWkUJODE5MgogCitzdHJ1Y3QgZndfYXNzZXJ0c19yYW1fc2VjdGlvbiB7CisJX19sZTE2IHNlY3Rpb25fcmFtX2xpbmVfb2Zmc2V0OworCV9fbGUxNiBzZWN0aW9uX3JhbV9saW5lX3NpemU7CisJdTggbGlzdF9kd29yZF9vZmZzZXQ7CisJdTggbGlzdF9lbGVtZW50X2R3b3JkX3NpemU7CisJdTggbGlzdF9udW1fZWxlbWVudHM7CisJdTggbGlzdF9uZXh0X2luZGV4X2R3b3JkX29mZnNldDsKK307CisKK3N0cnVjdCBmd192ZXJfbnVtIHsKKwl1OCBtYWpvcjsgLyogRmlybXdhcmUgbWFqb3IgdmVyc2lvbiBudW1iZXIgKi8KKwl1OCBtaW5vcjsgLyogRmlybXdhcmUgbWlub3IgdmVyc2lvbiBudW1iZXIgKi8KKwl1OCByZXY7IC8qIEZpcm13YXJlIHJldmlzaW9uIHZlcnNpb24gbnVtYmVyICovCisJdTggZW5nOyAvKiBGaXJtd2FyZSBlbmdpbmVlcmluZyB2ZXJzaW9uIG51bWJlciAoZm9yIGJvb3RsZWcgdmVyc2lvbnMpICovCit9OworCitzdHJ1Y3QgZndfdmVyX2luZm8geworCV9fbGUxNiB0b29sc192ZXI7IC8qIFRvb2xzIHZlcnNpb24gbnVtYmVyICovCisJdTggaW1hZ2VfaWQ7IC8qIEZXIGltYWdlIElEIChlLmcuIG1haW4pICovCisJdTggcmVzZXJ2ZWQxOworCXN0cnVjdCBmd192ZXJfbnVtIG51bTsgLyogRlcgdmVyc2lvbiBudW1iZXIgKi8KKwlfX2xlMzIgdGltZXN0YW1wOyAvKiBGVyBUaW1lc3RhbXAgaW4gdW5peCB0aW1lICAoc2VjLiBzaW5jZSAxOTcwKSAqLworCV9fbGUzMiByZXNlcnZlZDI7Cit9OworCitzdHJ1Y3QgZndfaW5mbyB7CisJc3RydWN0IGZ3X3Zlcl9pbmZvIHZlcjsKKwlzdHJ1Y3QgZndfYXNzZXJ0c19yYW1fc2VjdGlvbiBmd19hc3NlcnRzX3NlY3Rpb247Cit9OworCitzdHJ1Y3QgZndfaW5mb19sb2NhdGlvbiB7CisJX19sZTMyIGdyY19hZGRyOworCV9fbGUzMiBzaXplOworfTsKKwogZW51bSBpbml0X21vZGVzIHsKIAlNT0RFX1JFU0VSVkVELAogCU1PREVfQkJfQjAsCi0JTU9ERV9SRVNFUlZFRDIsCisJTU9ERV9LMiwKIAlNT0RFX0FTSUMsCisJTU9ERV9SRVNFUlZFRDIsCiAJTU9ERV9SRVNFUlZFRDMsCiAJTU9ERV9SRVNFUlZFRDQsCiAJTU9ERV9SRVNFUlZFRDUsCi0JTU9ERV9SRVNFUlZFRDYsCiAJTU9ERV9TRiwKIAlNT0RFX01GX1NELAogCU1PREVfTUZfU0ksCkBAIC0xNjQ0LDcgKzIzOTYsNyBAQAogCU1PREVfUE9SVFNfUEVSX0VOR180LAogCU1PREVfMTAwRywKIAlNT0RFXzQwRywKLQlNT0RFX1JFU0VSVkVENywKKwlNT0RFX1JFU0VSVkVENiwKIAlNQVhfSU5JVF9NT0RFUwogfTsKIApAQCAtMTY3NCwxMSArMjQyNiwxMSBAQAogCiAvKiBiaW5hcnkgaW5pdCBidWZmZXIgdHlwZXMgKi8KIGVudW0gYmluX2luaXRfYnVmZmVyX3R5cGUgewotCUJJTl9CVUZfRldfVkVSX0lORk8sCisJQklOX0JVRl9JTklUX0ZXX1ZFUl9JTkZPLAogCUJJTl9CVUZfSU5JVF9DTUQsCiAJQklOX0JVRl9JTklUX1ZBTCwKIAlCSU5fQlVGX0lOSVRfTU9ERV9UUkVFLAotCUJJTl9CVUZfSVJPLAorCUJJTl9CVUZfSU5JVF9JUk8sCiAJTUFYX0JJTl9JTklUX0JVRkZFUl9UWVBFCiB9OwogCkBAIC0xOTAyLDggKzI2NTQsMjc2IEBACiAJX19sZTE2IHNpemU7CiB9OwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUHVibGljIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqCi0gKiBAYnJpZWYgcWVkX2RiZ19wcmludF9hdHRuIC0gUHJpbnRzIGF0dGVudGlvbiByZWdpc3RlcnMgdmFsdWVzIGluIHRoZSBzcGVjaWZpZWQgcmVzdWx0cyBzdHJ1Y3QuCisgKiBAYnJpZWYgcWVkX2RiZ19zZXRfYmluX3B0ciAtIFNldHMgYSBwb2ludGVyIHRvIHRoZSBiaW5hcnkgZGF0YSB3aXRoIGRlYnVnCisgKglhcnJheXMuCisgKgorICogQHBhcmFtIGJpbl9wdHIgLSBhIHBvaW50ZXIgdG8gdGhlIGJpbmFyeSBkYXRhIHdpdGggZGVidWcgYXJyYXlzLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19zZXRfYmluX3B0cihjb25zdCB1OCAqIGNvbnN0IGJpbl9wdHIpOworLyoqCisgKiBAYnJpZWYgcWVkX2RiZ19ncmNfZ2V0X2R1bXBfYnVmX3NpemUgLSBSZXR1cm5zIHRoZSByZXF1aXJlZCBidWZmZXIgc2l6ZSBmb3IKKyAqCUdSQyBEdW1wLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIHBfcHR0IC0gUHR0IHdpbmRvdyB1c2VkIGZvciB3cml0aW5nIHRoZSByZWdpc3RlcnMuCisgKiBAcGFyYW0gYnVmX3NpemUgLSBPVVQ6IHJlcXVpcmVkIGJ1ZmZlciBzaXplIChpbiBkd29yZHMpIGZvciB0aGUgR1JDIER1bXAKKyAqCWRhdGEuCisgKgorICogQHJldHVybiBlcnJvciBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKKyAqCS0gdGhlIHZlcnNpb24gd2Fzbid0IHNldAorICogT3RoZXJ3aXNlLCByZXR1cm5zIG9rLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19ncmNfZ2V0X2R1bXBfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJICAgICAgdTMyICpidWZfc2l6ZSk7CisvKioKKyAqIEBicmllZiBxZWRfZGJnX2dyY19kdW1wIC0gRHVtcHMgR1JDIGRhdGEgaW50byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBwX3B0dCAtIFB0dCB3aW5kb3cgdXNlZCBmb3Igd3JpdGluZyB0aGUgcmVnaXN0ZXJzLgorICogQHBhcmFtIGR1bXBfYnVmIC0gUG9pbnRlciB0byB3cml0ZSB0aGUgY29sbGVjdGVkIEdSQyBkYXRhIGludG8uCisgKiBAcGFyYW0gYnVmX3NpemVfaW5fZHdvcmRzIC0gU2l6ZSBvZiB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBpbiBkd29yZHMuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBPVVQ6IG51bWJlciBvZiBkdW1wZWQgZHdvcmRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6CisgKgktIHRoZSB2ZXJzaW9uIHdhc24ndCBzZXQKKyAqCS0gdGhlIHNwZWNpZmllZCBkdW1wIGJ1ZmZlciBpcyB0b28gc21hbGwKKyAqIE90aGVyd2lzZSwgcmV0dXJucyBvay4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfZ3JjX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgdTMyICpkdW1wX2J1ZiwKKwkJCQkgdTMyIGJ1Zl9zaXplX2luX2R3b3JkcywKKwkJCQkgdTMyICpudW1fZHVtcGVkX2R3b3Jkcyk7CisvKioKKyAqIEBicmllZiBxZWRfZGJnX2lkbGVfY2hrX2dldF9kdW1wX2J1Zl9zaXplIC0gUmV0dXJucyB0aGUgcmVxdWlyZWQgYnVmZmVyIHNpemUKKyAqCWZvciBpZGxlIGNoZWNrIHJlc3VsdHMuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gcF9wdHQgLSBQdHQgd2luZG93IHVzZWQgZm9yIHdyaXRpbmcgdGhlIHJlZ2lzdGVycy4KKyAqIEBwYXJhbSBidWZfc2l6ZSAtIE9VVDogcmVxdWlyZWQgYnVmZmVyIHNpemUgKGluIGR3b3JkcykgZm9yIHRoZSBpZGxlIGNoZWNrCisgKglkYXRhLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6CisgKgktIHRoZSB2ZXJzaW9uIHdhc24ndCBzZXQKKyAqIE90aGVyd2lzZSwgcmV0dXJucyBvay4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfaWRsZV9jaGtfZ2V0X2R1bXBfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCQkgICB1MzIgKmJ1Zl9zaXplKTsKKy8qKgorICogQGJyaWVmIHFlZF9kYmdfaWRsZV9jaGtfZHVtcCAtIFBlcmZvcm1zIGlkbGUgY2hlY2sgYW5kIHdyaXRlcyB0aGUgcmVzdWx0cworICoJaW50byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBwX3B0dCAtIFB0dCB3aW5kb3cgdXNlZCBmb3Igd3JpdGluZyB0aGUgcmVnaXN0ZXJzLgorICogQHBhcmFtIGR1bXBfYnVmIC0gUG9pbnRlciB0byB3cml0ZSB0aGUgaWRsZSBjaGVjayBkYXRhIGludG8uCisgKiBAcGFyYW0gYnVmX3NpemVfaW5fZHdvcmRzIC0gU2l6ZSBvZiB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBpbiBkd29yZHMuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBPVVQ6IG51bWJlciBvZiBkdW1wZWQgZHdvcmRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6CisgKgktIHRoZSB2ZXJzaW9uIHdhc24ndCBzZXQKKyAqCS0gdGhlIHNwZWNpZmllZCBidWZmZXIgaXMgdG9vIHNtYWxsCisgKiBPdGhlcndpc2UsIHJldHVybnMgb2suCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2lkbGVfY2hrX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJICAgICAgdTMyIGJ1Zl9zaXplX2luX2R3b3JkcywKKwkJCQkgICAgICB1MzIgKm51bV9kdW1wZWRfZHdvcmRzKTsKKy8qKgorICogQGJyaWVmIHFlZF9kYmdfbWNwX3RyYWNlX2dldF9kdW1wX2J1Zl9zaXplIC0gUmV0dXJucyB0aGUgcmVxdWlyZWQgYnVmZmVyIHNpemUKKyAqCWZvciBtY3AgdHJhY2UgcmVzdWx0cy4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBwX3B0dCAtIFB0dCB3aW5kb3cgdXNlZCBmb3Igd3JpdGluZyB0aGUgcmVnaXN0ZXJzLgorICogQHBhcmFtIGJ1Zl9zaXplIC0gT1VUOiByZXF1aXJlZCBidWZmZXIgc2l6ZSAoaW4gZHdvcmRzKSBmb3IgbWNwIHRyYWNlIGRhdGEuCisgKgorICogQHJldHVybiBlcnJvciBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKKyAqCS0gdGhlIHZlcnNpb24gd2Fzbid0IHNldAorICoJLSB0aGUgdHJhY2UgZGF0YSBpbiBNQ1Agc2NyYXRjaHBhZCBjb250YWluIGFuIGludmFsaWQgc2lnbmF0dXJlCisgKgktIHRoZSBidW5kbGUgSUQgaW4gTlZSQU0gaXMgaW52YWxpZAorICoJLSB0aGUgdHJhY2UgbWV0YSBkYXRhIGNhbm5vdCBiZSBmb3VuZCAoaW4gTlZSQU0gb3IgaW1hZ2UgZmlsZSkKKyAqIE90aGVyd2lzZSwgcmV0dXJucyBvay4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfbWNwX3RyYWNlX2dldF9kdW1wX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJCSAgICB1MzIgKmJ1Zl9zaXplKTsKKy8qKgorICogQGJyaWVmIHFlZF9kYmdfbWNwX3RyYWNlX2R1bXAgLSBQZXJmb3JtcyBtY3AgdHJhY2UgYW5kIHdyaXRlcyB0aGUgcmVzdWx0cworICoJaW50byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBwX3B0dCAtIFB0dCB3aW5kb3cgdXNlZCBmb3Igd3JpdGluZyB0aGUgcmVnaXN0ZXJzLgorICogQHBhcmFtIGR1bXBfYnVmIC0gUG9pbnRlciB0byB3cml0ZSB0aGUgbWNwIHRyYWNlIGRhdGEgaW50by4KKyAqIEBwYXJhbSBidWZfc2l6ZV9pbl9kd29yZHMgLSBTaXplIG9mIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGluIGR3b3Jkcy4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIE9VVDogbnVtYmVyIG9mIGR1bXBlZCBkd29yZHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKKyAqCS0gdGhlIHZlcnNpb24gd2Fzbid0IHNldAorICoJLSB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBpcyB0b28gc21hbGwKKyAqCS0gdGhlIHRyYWNlIGRhdGEgaW4gTUNQIHNjcmF0Y2hwYWQgY29udGFpbiBhbiBpbnZhbGlkIHNpZ25hdHVyZQorICoJLSB0aGUgYnVuZGxlIElEIGluIE5WUkFNIGlzIGludmFsaWQKKyAqCS0gdGhlIHRyYWNlIG1ldGEgZGF0YSBjYW5ub3QgYmUgZm91bmQgKGluIE5WUkFNIG9yIGltYWdlIGZpbGUpCisgKgktIHRoZSB0cmFjZSBtZXRhIGRhdGEgY2Fubm90IGJlIHJlYWQgKGZyb20gTlZSQU0gb3IgaW1hZ2UgZmlsZSkKKyAqIE90aGVyd2lzZSwgcmV0dXJucyBvay4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfbWNwX3RyYWNlX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkgICAgICAgdTMyIGJ1Zl9zaXplX2luX2R3b3JkcywKKwkJCQkgICAgICAgdTMyICpudW1fZHVtcGVkX2R3b3Jkcyk7CisvKioKKyAqIEBicmllZiBxZWRfZGJnX3JlZ19maWZvX2dldF9kdW1wX2J1Zl9zaXplIC0gUmV0dXJucyB0aGUgcmVxdWlyZWQgYnVmZmVyIHNpemUKKyAqCWZvciBncmMgdHJhY2UgZmlmbyByZXN1bHRzLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIHBfcHR0IC0gUHR0IHdpbmRvdyB1c2VkIGZvciB3cml0aW5nIHRoZSByZWdpc3RlcnMuCisgKiBAcGFyYW0gYnVmX3NpemUgLSBPVVQ6IHJlcXVpcmVkIGJ1ZmZlciBzaXplIChpbiBkd29yZHMpIGZvciByZWcgZmlmbyBkYXRhLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6CisgKgktIHRoZSB2ZXJzaW9uIHdhc24ndCBzZXQKKyAqIE90aGVyd2lzZSwgcmV0dXJucyBvay4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfcmVnX2ZpZm9fZ2V0X2R1bXBfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCQkgICB1MzIgKmJ1Zl9zaXplKTsKKy8qKgorICogQGJyaWVmIHFlZF9kYmdfcmVnX2ZpZm9fZHVtcCAtIFJlYWRzIHRoZSByZWcgZmlmbyBhbmQgd3JpdGVzIHRoZSByZXN1bHRzIGludG8KKyAqCXRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIHBfcHR0IC0gUHR0IHdpbmRvdyB1c2VkIGZvciB3cml0aW5nIHRoZSByZWdpc3RlcnMuCisgKiBAcGFyYW0gZHVtcF9idWYgLSBQb2ludGVyIHRvIHdyaXRlIHRoZSByZWcgZmlmbyBkYXRhIGludG8uCisgKiBAcGFyYW0gYnVmX3NpemVfaW5fZHdvcmRzIC0gU2l6ZSBvZiB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBpbiBkd29yZHMuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBPVVQ6IG51bWJlciBvZiBkdW1wZWQgZHdvcmRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6CisgKgktIHRoZSB2ZXJzaW9uIHdhc24ndCBzZXQKKyAqCS0gdGhlIHNwZWNpZmllZCBidWZmZXIgaXMgdG9vIHNtYWxsCisgKgktIERNQUUgdHJhbnNhY3Rpb24gZmFpbGVkCisgKiBPdGhlcndpc2UsIHJldHVybnMgb2suCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX3JlZ19maWZvX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJICAgICAgdTMyIGJ1Zl9zaXplX2luX2R3b3JkcywKKwkJCQkgICAgICB1MzIgKm51bV9kdW1wZWRfZHdvcmRzKTsKKy8qKgorICogQGJyaWVmIHFlZF9kYmdfaWd1X2ZpZm9fZ2V0X2R1bXBfYnVmX3NpemUgLSBSZXR1cm5zIHRoZSByZXF1aXJlZCBidWZmZXIgc2l6ZQorICoJZm9yIHRoZSBJR1UgZmlmbyByZXN1bHRzLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIHBfcHR0IC0gUHR0IHdpbmRvdyB1c2VkIGZvciB3cml0aW5nIHRoZSByZWdpc3RlcnMuCisgKiBAcGFyYW0gYnVmX3NpemUgLSBPVVQ6IHJlcXVpcmVkIGJ1ZmZlciBzaXplIChpbiBkd29yZHMpIGZvciB0aGUgSUdVIGZpZm8KKyAqCWRhdGEuCisgKgorICogQHJldHVybiBlcnJvciBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKKyAqCS0gdGhlIHZlcnNpb24gd2Fzbid0IHNldAorICogT3RoZXJ3aXNlLCByZXR1cm5zIG9rLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19pZ3VfZmlmb19nZXRfZHVtcF9idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJCSAgIHUzMiAqYnVmX3NpemUpOworLyoqCisgKiBAYnJpZWYgcWVkX2RiZ19pZ3VfZmlmb19kdW1wIC0gUmVhZHMgdGhlIElHVSBmaWZvIGFuZCB3cml0ZXMgdGhlIHJlc3VsdHMgaW50bworICoJdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gcF9wdHQgLSBQdHQgd2luZG93IHVzZWQgZm9yIHdyaXRpbmcgdGhlIHJlZ2lzdGVycy4KKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIFBvaW50ZXIgdG8gd3JpdGUgdGhlIElHVSBmaWZvIGRhdGEgaW50by4KKyAqIEBwYXJhbSBidWZfc2l6ZV9pbl9kd29yZHMgLSBTaXplIG9mIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGluIGR3b3Jkcy4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIE9VVDogbnVtYmVyIG9mIGR1bXBlZCBkd29yZHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKKyAqCS0gdGhlIHZlcnNpb24gd2Fzbid0IHNldAorICoJLSB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBpcyB0b28gc21hbGwKKyAqCS0gRE1BRSB0cmFuc2FjdGlvbiBmYWlsZWQKKyAqIE90aGVyd2lzZSwgcmV0dXJucyBvay4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfaWd1X2ZpZm9fZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkgICAgICB1MzIgYnVmX3NpemVfaW5fZHdvcmRzLAorCQkJCSAgICAgIHUzMiAqbnVtX2R1bXBlZF9kd29yZHMpOworLyoqCisgKiBAYnJpZWYgcWVkX2RiZ19wcm90ZWN0aW9uX292ZXJyaWRlX2dldF9kdW1wX2J1Zl9zaXplIC0gUmV0dXJucyB0aGUgcmVxdWlyZWQKKyAqCWJ1ZmZlciBzaXplIGZvciBwcm90ZWN0aW9uIG92ZXJyaWRlIHdpbmRvdyByZXN1bHRzLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIHBfcHR0IC0gUHR0IHdpbmRvdyB1c2VkIGZvciB3cml0aW5nIHRoZSByZWdpc3RlcnMuCisgKiBAcGFyYW0gYnVmX3NpemUgLSBPVVQ6IHJlcXVpcmVkIGJ1ZmZlciBzaXplIChpbiBkd29yZHMpIGZvciBwcm90ZWN0aW9uCisgKglvdmVycmlkZSBkYXRhLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6CisgKgktIHRoZSB2ZXJzaW9uIHdhc24ndCBzZXQKKyAqIE90aGVyd2lzZSwgcmV0dXJucyBvay4KKyAqLworZW51bSBkYmdfc3RhdHVzCitxZWRfZGJnX3Byb3RlY3Rpb25fb3ZlcnJpZGVfZ2V0X2R1bXBfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJICAgICAgdTMyICpidWZfc2l6ZSk7CisvKioKKyAqIEBicmllZiBxZWRfZGJnX3Byb3RlY3Rpb25fb3ZlcnJpZGVfZHVtcCAtIFJlYWRzIHByb3RlY3Rpb24gb3ZlcnJpZGUgd2luZG93CisgKgllbnRyaWVzIGFuZCB3cml0ZXMgdGhlIHJlc3VsdHMgaW50byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBwX3B0dCAtIFB0dCB3aW5kb3cgdXNlZCBmb3Igd3JpdGluZyB0aGUgcmVnaXN0ZXJzLgorICogQHBhcmFtIGR1bXBfYnVmIC0gUG9pbnRlciB0byB3cml0ZSB0aGUgcHJvdGVjdGlvbiBvdmVycmlkZSBkYXRhIGludG8uCisgKiBAcGFyYW0gYnVmX3NpemVfaW5fZHdvcmRzIC0gU2l6ZSBvZiB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBpbiBkd29yZHMuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBPVVQ6IG51bWJlciBvZiBkdW1wZWQgZHdvcmRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6CisgKgktIHRoZSB2ZXJzaW9uIHdhc24ndCBzZXQKKyAqCS0gdGhlIHNwZWNpZmllZCBidWZmZXIgaXMgdG9vIHNtYWxsCisgKgktIERNQUUgdHJhbnNhY3Rpb24gZmFpbGVkCisgKiBPdGhlcndpc2UsIHJldHVybnMgb2suCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX3Byb3RlY3Rpb25fb3ZlcnJpZGVfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCQkgdTMyICpkdW1wX2J1ZiwKKwkJCQkJCSB1MzIgYnVmX3NpemVfaW5fZHdvcmRzLAorCQkJCQkJIHUzMiAqbnVtX2R1bXBlZF9kd29yZHMpOworLyoqCisgKiBAYnJpZWYgcWVkX2RiZ19md19hc3NlcnRzX2dldF9kdW1wX2J1Zl9zaXplIC0gUmV0dXJucyB0aGUgcmVxdWlyZWQgYnVmZmVyCisgKglzaXplIGZvciBGVyBBc3NlcnRzIHJlc3VsdHMuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gcF9wdHQgLSBQdHQgd2luZG93IHVzZWQgZm9yIHdyaXRpbmcgdGhlIHJlZ2lzdGVycy4KKyAqIEBwYXJhbSBidWZfc2l6ZSAtIE9VVDogcmVxdWlyZWQgYnVmZmVyIHNpemUgKGluIGR3b3JkcykgZm9yIEZXIEFzc2VydHMgZGF0YS4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOgorICoJLSB0aGUgdmVyc2lvbiB3YXNuJ3Qgc2V0CisgKiBPdGhlcndpc2UsIHJldHVybnMgb2suCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2Z3X2Fzc2VydHNfZ2V0X2R1bXBfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJCSAgICAgdTMyICpidWZfc2l6ZSk7CisvKioKKyAqIEBicmllZiBxZWRfZGJnX2Z3X2Fzc2VydHNfZHVtcCAtIFJlYWRzIHRoZSBGVyBBc3NlcnRzIGFuZCB3cml0ZXMgdGhlIHJlc3VsdHMKKyAqCWludG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gcF9wdHQgLSBQdHQgd2luZG93IHVzZWQgZm9yIHdyaXRpbmcgdGhlIHJlZ2lzdGVycy4KKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIFBvaW50ZXIgdG8gd3JpdGUgdGhlIEZXIEFzc2VydHMgZGF0YSBpbnRvLgorICogQHBhcmFtIGJ1Zl9zaXplX2luX2R3b3JkcyAtIFNpemUgb2YgdGhlIHNwZWNpZmllZCBidWZmZXIgaW4gZHdvcmRzLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gT1VUOiBudW1iZXIgb2YgZHVtcGVkIGR3b3Jkcy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOgorICoJLSB0aGUgdmVyc2lvbiB3YXNuJ3Qgc2V0CisgKgktIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGlzIHRvbyBzbWFsbAorICogT3RoZXJ3aXNlLCByZXR1cm5zIG9rLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19md19hc3NlcnRzX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCXN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJdTMyICpkdW1wX2J1ZiwKKwkJCQkJdTMyIGJ1Zl9zaXplX2luX2R3b3JkcywKKwkJCQkJdTMyICpudW1fZHVtcGVkX2R3b3Jkcyk7CisvKioKKyAqIEBicmllZiBxZWRfZGJnX3ByaW50X2F0dG4gLSBQcmludHMgYXR0ZW50aW9uIHJlZ2lzdGVycyB2YWx1ZXMgaW4gdGhlCisgKglzcGVjaWZpZWQgcmVzdWx0cyBzdHJ1Y3QuCiAgKgogICogQHBhcmFtIHBfaHdmbgogICogQHBhcmFtIHJlc3VsdHMgLSBQb2ludGVyIHRvIHRoZSBhdHRlbnRpb24gcmVhZCByZXN1bHRzCkBAIC0xOTE1LDQ3ICsyOTM1LDI0MSBAQAogZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfcHJpbnRfYXR0bihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJCQkgICBzdHJ1Y3QgZGJnX2F0dG5fYmxvY2tfcmVzdWx0ICpyZXN1bHRzKTsKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAjZGVmaW5lIE1BWF9OQU1FX0xFTgkxNgogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUHVibGljIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgcWVkX2RiZ191c2VyX3NldF9iaW5fcHRyIC0gU2V0cyBhIHBvaW50ZXIgdG8gdGhlIGJpbmFyeSBkYXRhIHdpdGgKKyAqCWRlYnVnIGFycmF5cy4KKyAqCisgKiBAcGFyYW0gYmluX3B0ciAtIGEgcG9pbnRlciB0byB0aGUgYmluYXJ5IGRhdGEgd2l0aCBkZWJ1ZyBhcnJheXMuCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX3VzZXJfc2V0X2Jpbl9wdHIoY29uc3QgdTggKiBjb25zdCBiaW5fcHRyKTsKKy8qKgorICogQGJyaWVmIHFlZF9kYmdfZ2V0X3N0YXR1c19zdHIgLSBSZXR1cm5zIGEgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIHN0YXR1cy4KKyAqCisgKiBAcGFyYW0gc3RhdHVzIC0gYSBkZWJ1ZyBzdGF0dXMgY29kZS4KKyAqCisgKiBAcmV0dXJuIGEgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIHN0YXR1cworICovCitjb25zdCBjaGFyICpxZWRfZGJnX2dldF9zdGF0dXNfc3RyKGVudW0gZGJnX3N0YXR1cyBzdGF0dXMpOworLyoqCisgKiBAYnJpZWYgcWVkX2dldF9pZGxlX2Noa19yZXN1bHRzX2J1Zl9zaXplIC0gUmV0dXJucyB0aGUgcmVxdWlyZWQgYnVmZmVyIHNpemUKKyAqCWZvciBpZGxlIGNoZWNrIHJlc3VsdHMgKGluIGJ5dGVzKS4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIGlkbGUgY2hlY2sgZHVtcCBidWZmZXIuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBudW1iZXIgb2YgZHdvcmRzIHRoYXQgd2VyZSBkdW1wZWQuCisgKiBAcGFyYW0gcmVzdWx0c19idWZfc2l6ZSAtIE9VVDogcmVxdWlyZWQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSBmb3IgdGhlIHBhcnNlZAorICoJcmVzdWx0cy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIHRoZSBwYXJzaW5nIGZhaWxzLCBvayBvdGhlcndpc2UuCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZ2V0X2lkbGVfY2hrX3Jlc3VsdHNfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgIHUzMiAqZHVtcF9idWYsCisJCQkJCQkgIHUzMiAgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCQkgIHUzMiAqcmVzdWx0c19idWZfc2l6ZSk7CisvKioKKyAqIEBicmllZiBxZWRfcHJpbnRfaWRsZV9jaGtfcmVzdWx0cyAtIFByaW50cyBpZGxlIGNoZWNrIHJlc3VsdHMKKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIGlkbGUgY2hlY2sgZHVtcCBidWZmZXIuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBudW1iZXIgb2YgZHdvcmRzIHRoYXQgd2VyZSBkdW1wZWQuCisgKiBAcGFyYW0gcmVzdWx0c19idWYgLSBidWZmZXIgZm9yIHByaW50aW5nIHRoZSBpZGxlIGNoZWNrIHJlc3VsdHMuCisgKiBAcGFyYW0gbnVtX2Vycm9ycyAtIE9VVDogbnVtYmVyIG9mIGVycm9ycyBmb3VuZCBpbiBpZGxlIGNoZWNrLgorICogQHBhcmFtIG51bV93YXJuaW5ncyAtIE9VVDogbnVtYmVyIG9mIHdhcm5pbmdzIGZvdW5kIGluIGlkbGUgY2hlY2suCisgKgorICogQHJldHVybiBlcnJvciBpZiB0aGUgcGFyc2luZyBmYWlscywgb2sgb3RoZXJ3aXNlLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX3ByaW50X2lkbGVfY2hrX3Jlc3VsdHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgIHUzMiAqZHVtcF9idWYsCisJCQkJCSAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJICAgY2hhciAqcmVzdWx0c19idWYsCisJCQkJCSAgIHUzMiAqbnVtX2Vycm9ycywKKwkJCQkJICAgdTMyICpudW1fd2FybmluZ3MpOworLyoqCisgKiBAYnJpZWYgcWVkX2dldF9tY3BfdHJhY2VfcmVzdWx0c19idWZfc2l6ZSAtIFJldHVybnMgdGhlIHJlcXVpcmVkIGJ1ZmZlciBzaXplCisgKglmb3IgTUNQIFRyYWNlIHJlc3VsdHMgKGluIGJ5dGVzKS4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIE1DUCBUcmFjZSBkdW1wIGJ1ZmZlci4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIG51bWJlciBvZiBkd29yZHMgdGhhdCB3ZXJlIGR1bXBlZC4KKyAqIEBwYXJhbSByZXN1bHRzX2J1Zl9zaXplIC0gT1VUOiByZXF1aXJlZCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIGZvciB0aGUgcGFyc2VkCisgKglyZXN1bHRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgdGhlIHBhcnNpbmcgZmFpbHMsIG9rIG90aGVyd2lzZS4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9nZXRfbWNwX3RyYWNlX3Jlc3VsdHNfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkJICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkJICAgdTMyICpyZXN1bHRzX2J1Zl9zaXplKTsKKy8qKgorICogQGJyaWVmIHFlZF9wcmludF9tY3BfdHJhY2VfcmVzdWx0cyAtIFByaW50cyBNQ1AgVHJhY2UgcmVzdWx0cworICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIGR1bXBfYnVmIC0gbWNwIHRyYWNlIGR1bXAgYnVmZmVyLCBzdGFydGluZyBmcm9tIHRoZSBoZWFkZXIuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBudW1iZXIgb2YgZHdvcmRzIHRoYXQgd2VyZSBkdW1wZWQuCisgKiBAcGFyYW0gcmVzdWx0c19idWYgLSBidWZmZXIgZm9yIHByaW50aW5nIHRoZSBtY3AgdHJhY2UgcmVzdWx0cy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIHRoZSBwYXJzaW5nIGZhaWxzLCBvayBvdGhlcndpc2UuCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfcHJpbnRfbWNwX3RyYWNlX3Jlc3VsdHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkgICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgICAgY2hhciAqcmVzdWx0c19idWYpOworLyoqCisgKiBAYnJpZWYgcWVkX2dldF9yZWdfZmlmb19yZXN1bHRzX2J1Zl9zaXplIC0gUmV0dXJucyB0aGUgcmVxdWlyZWQgYnVmZmVyIHNpemUKKyAqCWZvciByZWdfZmlmbyByZXN1bHRzIChpbiBieXRlcykuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gZHVtcF9idWYgLSByZWcgZmlmbyBkdW1wIGJ1ZmZlci4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIG51bWJlciBvZiBkd29yZHMgdGhhdCB3ZXJlIGR1bXBlZC4KKyAqIEBwYXJhbSByZXN1bHRzX2J1Zl9zaXplIC0gT1VUOiByZXF1aXJlZCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIGZvciB0aGUgcGFyc2VkCisgKglyZXN1bHRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgdGhlIHBhcnNpbmcgZmFpbHMsIG9rIG90aGVyd2lzZS4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9nZXRfcmVnX2ZpZm9fcmVzdWx0c19idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJCSAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkJICB1MzIgKnJlc3VsdHNfYnVmX3NpemUpOworLyoqCisgKiBAYnJpZWYgcWVkX3ByaW50X3JlZ19maWZvX3Jlc3VsdHMgLSBQcmludHMgcmVnIGZpZm8gcmVzdWx0cworICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIGR1bXBfYnVmIC0gcmVnIGZpZm8gZHVtcCBidWZmZXIsIHN0YXJ0aW5nIGZyb20gdGhlIGhlYWRlci4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIG51bWJlciBvZiBkd29yZHMgdGhhdCB3ZXJlIGR1bXBlZC4KKyAqIEBwYXJhbSByZXN1bHRzX2J1ZiAtIGJ1ZmZlciBmb3IgcHJpbnRpbmcgdGhlIHJlZyBmaWZvIHJlc3VsdHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiB0aGUgcGFyc2luZyBmYWlscywgb2sgb3RoZXJ3aXNlLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX3ByaW50X3JlZ19maWZvX3Jlc3VsdHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgIHUzMiAqZHVtcF9idWYsCisJCQkJCSAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJICAgY2hhciAqcmVzdWx0c19idWYpOworLyoqCisgKiBAYnJpZWYgcWVkX2dldF9pZ3VfZmlmb19yZXN1bHRzX2J1Zl9zaXplIC0gUmV0dXJucyB0aGUgcmVxdWlyZWQgYnVmZmVyIHNpemUKKyAqCWZvciBpZ3VfZmlmbyByZXN1bHRzIChpbiBieXRlcykuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gZHVtcF9idWYgLSBJR1UgZmlmbyBkdW1wIGJ1ZmZlci4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIG51bWJlciBvZiBkd29yZHMgdGhhdCB3ZXJlIGR1bXBlZC4KKyAqIEBwYXJhbSByZXN1bHRzX2J1Zl9zaXplIC0gT1VUOiByZXF1aXJlZCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIGZvciB0aGUgcGFyc2VkCisgKglyZXN1bHRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgdGhlIHBhcnNpbmcgZmFpbHMsIG9rIG90aGVyd2lzZS4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9nZXRfaWd1X2ZpZm9fcmVzdWx0c19idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJCSAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkJICB1MzIgKnJlc3VsdHNfYnVmX3NpemUpOworLyoqCisgKiBAYnJpZWYgcWVkX3ByaW50X2lndV9maWZvX3Jlc3VsdHMgLSBQcmludHMgSUdVIGZpZm8gcmVzdWx0cworICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIGR1bXBfYnVmIC0gSUdVIGZpZm8gZHVtcCBidWZmZXIsIHN0YXJ0aW5nIGZyb20gdGhlIGhlYWRlci4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIG51bWJlciBvZiBkd29yZHMgdGhhdCB3ZXJlIGR1bXBlZC4KKyAqIEBwYXJhbSByZXN1bHRzX2J1ZiAtIGJ1ZmZlciBmb3IgcHJpbnRpbmcgdGhlIElHVSBmaWZvIHJlc3VsdHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiB0aGUgcGFyc2luZyBmYWlscywgb2sgb3RoZXJ3aXNlLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX3ByaW50X2lndV9maWZvX3Jlc3VsdHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgIHUzMiAqZHVtcF9idWYsCisJCQkJCSAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJICAgY2hhciAqcmVzdWx0c19idWYpOworLyoqCisgKiBAYnJpZWYgcWVkX2dldF9wcm90ZWN0aW9uX292ZXJyaWRlX3Jlc3VsdHNfYnVmX3NpemUgLSBSZXR1cm5zIHRoZSByZXF1aXJlZAorICoJYnVmZmVyIHNpemUgZm9yIHByb3RlY3Rpb24gb3ZlcnJpZGUgcmVzdWx0cyAoaW4gYnl0ZXMpLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIGR1bXBfYnVmIC0gcHJvdGVjdGlvbiBvdmVycmlkZSBkdW1wIGJ1ZmZlci4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIG51bWJlciBvZiBkd29yZHMgdGhhdCB3ZXJlIGR1bXBlZC4KKyAqIEBwYXJhbSByZXN1bHRzX2J1Zl9zaXplIC0gT1VUOiByZXF1aXJlZCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIGZvciB0aGUgcGFyc2VkCisgKglyZXN1bHRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgdGhlIHBhcnNpbmcgZmFpbHMsIG9rIG90aGVyd2lzZS4KKyAqLworZW51bSBkYmdfc3RhdHVzCitxZWRfZ2V0X3Byb3RlY3Rpb25fb3ZlcnJpZGVfcmVzdWx0c19idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkgICAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJICAgICB1MzIgKnJlc3VsdHNfYnVmX3NpemUpOworLyoqCisgKiBAYnJpZWYgcWVkX3ByaW50X3Byb3RlY3Rpb25fb3ZlcnJpZGVfcmVzdWx0cyAtIFByaW50cyBwcm90ZWN0aW9uIG92ZXJyaWRlCisgKglyZXN1bHRzLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIGR1bXBfYnVmIC0gcHJvdGVjdGlvbiBvdmVycmlkZSBkdW1wIGJ1ZmZlciwgc3RhcnRpbmcgZnJvbSB0aGUgaGVhZGVyLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gbnVtYmVyIG9mIGR3b3JkcyB0aGF0IHdlcmUgZHVtcGVkLgorICogQHBhcmFtIHJlc3VsdHNfYnVmIC0gYnVmZmVyIGZvciBwcmludGluZyB0aGUgcmVnIGZpZm8gcmVzdWx0cy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIHRoZSBwYXJzaW5nIGZhaWxzLCBvayBvdGhlcndpc2UuCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfcHJpbnRfcHJvdGVjdGlvbl9vdmVycmlkZV9yZXN1bHRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJCSAgICAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJCSAgICAgIGNoYXIgKnJlc3VsdHNfYnVmKTsKKy8qKgorICogQGJyaWVmIHFlZF9nZXRfZndfYXNzZXJ0c19yZXN1bHRzX2J1Zl9zaXplIC0gUmV0dXJucyB0aGUgcmVxdWlyZWQgYnVmZmVyIHNpemUKKyAqCWZvciBGVyBBc3NlcnRzIHJlc3VsdHMgKGluIGJ5dGVzKS4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIEZXIEFzc2VydHMgZHVtcCBidWZmZXIuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBudW1iZXIgb2YgZHdvcmRzIHRoYXQgd2VyZSBkdW1wZWQuCisgKiBAcGFyYW0gcmVzdWx0c19idWZfc2l6ZSAtIE9VVDogcmVxdWlyZWQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSBmb3IgdGhlIHBhcnNlZAorICoJcmVzdWx0cy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIHRoZSBwYXJzaW5nIGZhaWxzLCBvayBvdGhlcndpc2UuCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZ2V0X2Z3X2Fzc2VydHNfcmVzdWx0c19idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkJICAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJCSAgICB1MzIgKnJlc3VsdHNfYnVmX3NpemUpOworLyoqCisgKiBAYnJpZWYgcWVkX3ByaW50X2Z3X2Fzc2VydHNfcmVzdWx0cyAtIFByaW50cyBGVyBBc3NlcnRzIHJlc3VsdHMKKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIEZXIEFzc2VydHMgZHVtcCBidWZmZXIsIHN0YXJ0aW5nIGZyb20gdGhlIGhlYWRlci4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIG51bWJlciBvZiBkd29yZHMgdGhhdCB3ZXJlIGR1bXBlZC4KKyAqIEBwYXJhbSByZXN1bHRzX2J1ZiAtIGJ1ZmZlciBmb3IgcHJpbnRpbmcgdGhlIEZXIEFzc2VydHMgcmVzdWx0cy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIHRoZSBwYXJzaW5nIGZhaWxzLCBvayBvdGhlcndpc2UuCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfcHJpbnRfZndfYXNzZXJ0c19yZXN1bHRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJCSAgICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgICAgIGNoYXIgKnJlc3VsdHNfYnVmKTsKIC8qIFdpbiAyICovCi0jZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfSUdVX0NNRCBcCi0JMHgwMGYwMDBVTAorI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX0lHVV9DTUQJMHgwMGYwMDBVTAogCiAvKiBXaW4gMyAqLwotI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX1RTRE1fUkFNIFwKLQkweDAxMDAwMFVMCisjZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfVFNETV9SQU0JMHgwMTAwMDBVTAogCiAvKiBXaW4gNCAqLwotI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX01TRE1fUkFNIFwKLQkweDAxMTAwMFVMCisjZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfTVNETV9SQU0JMHgwMTEwMDBVTAogCiAvKiBXaW4gNSAqLwotI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX01TRE1fUkFNXzEwMjQgXAotCTB4MDEyMDAwVUwKKyNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19NU0RNX1JBTV8xMDI0CTB4MDEyMDAwVUwKIAogLyogV2luIDYgKi8KLSNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19VU0RNX1JBTSBcCi0JMHgwMTMwMDBVTAorI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX1VTRE1fUkFNCTB4MDEzMDAwVUwKIAogLyogV2luIDcgKi8KLSNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19VU0RNX1JBTV8xMDI0IFwKLQkweDAxNDAwMFVMCisjZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfVVNETV9SQU1fMTAyNAkweDAxNDAwMFVMCiAKIC8qIFdpbiA4ICovCi0jZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfVVNETV9SQU1fMjA0OCBcCi0JMHgwMTUwMDBVTAorI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX1VTRE1fUkFNXzIwNDgJMHgwMTUwMDBVTAogCiAvKiBXaW4gOSAqLwotI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX1hTRE1fUkFNIFwKLQkweDAxNjAwMFVMCisjZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfWFNETV9SQU0JMHgwMTYwMDBVTAogCiAvKiBXaW4gMTAgKi8KLSNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19ZU0RNX1JBTSBcCi0JMHgwMTcwMDBVTAorI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX1lTRE1fUkFNCTB4MDE3MDAwVUwKIAogLyogV2luIDExICovCi0jZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfUFNETV9SQU0gXAotCTB4MDE4MDAwVUwKKyNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19QU0RNX1JBTQkweDAxODAwMFVMCiAKIC8qKgogICogQGJyaWVmIHFlZF9xbV9wZl9tZW1fc2l6ZSAtIHByZXBhcmUgUU0gSUxUIHNpemVzCkBAIC0yMDAzLDcgKzMyMTcsNyBAQAogCXUxNiBudW1fdmZfcHFzOwogCXU4IHN0YXJ0X3Zwb3J0OwogCXU4IG51bV92cG9ydHM7Ci0JdTggcGZfd2ZxOworCXUxNiBwZl93ZnE7CiAJdTMyIHBmX3JsOwogCXN0cnVjdCBpbml0X3FtX3BxX3BhcmFtcyAqcHFfcGFyYW1zOwogCXN0cnVjdCBpbml0X3FtX3Zwb3J0X3BhcmFtcyAqdnBvcnRfcGFyYW1zOwpAQCAtMjEzOCw2ICszMzUyLDkgQEAKICNkZWZpbmUJVFNUT1JNX1BPUlRfU1RBVF9PRkZTRVQocG9ydF9pZCkgXAogCShJUk9bMV0uYmFzZSArICgocG9ydF9pZCkgKiBJUk9bMV0ubTEpKQogI2RlZmluZQlUU1RPUk1fUE9SVF9TVEFUX1NJWkUJCQkJKElST1sxXS5zaXplKQorI2RlZmluZSBUU1RPUk1fTEwyX1BPUlRfU1RBVF9PRkZTRVQocG9ydF9pZCkgXAorCShJUk9bMl0uYmFzZSArICgocG9ydF9pZCkgKiBJUk9bMl0ubTEpKQorI2RlZmluZSBUU1RPUk1fTEwyX1BPUlRfU1RBVF9TSVpFCQkJKElST1syXS5zaXplKQogI2RlZmluZQlVU1RPUk1fVkZfUEZfQ0hBTk5FTF9SRUFEWV9PRkZTRVQodmZfaWQpIFwKIAkoSVJPWzNdLmJhc2UgKyAoKHZmX2lkKSAqIElST1szXS5tMSkpCiAjZGVmaW5lCVVTVE9STV9WRl9QRl9DSEFOTkVMX1JFQURZX1NJWkUJCQkoSVJPWzNdLnNpemUpCkBAIC0yMTUzLDQyICszMzcwLDkwIEBACiAjZGVmaW5lCVVTVE9STV9DT01NT05fUVVFVUVfQ09OU19PRkZTRVQocXVldWVfem9uZV9pZCkgXAogCShJUk9bN10uYmFzZSArICgocXVldWVfem9uZV9pZCkgKiBJUk9bN10ubTEpKQogI2RlZmluZQlVU1RPUk1fQ09NTU9OX1FVRVVFX0NPTlNfU0laRQkJCShJUk9bN10uc2l6ZSkKKyNkZWZpbmUgVFNUT1JNX0xMMl9SWF9QUk9EU19PRkZTRVQoY29yZV9yeF9xdWV1ZV9pZCkgXAorCShJUk9bMTRdLmJhc2UgKwkoKGNvcmVfcnhfcXVldWVfaWQpICogSVJPWzE0XS5tMSkpCisjZGVmaW5lIFRTVE9STV9MTDJfUlhfUFJPRFNfU0laRQkJCShJUk9bMTRdLnNpemUpCisjZGVmaW5lIENPUkVfTEwyX1RTVE9STV9QRVJfUVVFVUVfU1RBVF9PRkZTRVQoY29yZV9yeF9xdWV1ZV9pZCkgXAorCShJUk9bMTVdLmJhc2UgKyAoKGNvcmVfcnhfcXVldWVfaWQpICogSVJPWzE1XS5tMSkpCisjZGVmaW5lIENPUkVfTEwyX1RTVE9STV9QRVJfUVVFVUVfU1RBVF9TSVpFCQkoSVJPWzE1XS5zaXplKQorI2RlZmluZSBDT1JFX0xMMl9VU1RPUk1fUEVSX1FVRVVFX1NUQVRfT0ZGU0VUKGNvcmVfcnhfcXVldWVfaWQpIFwKKwkoSVJPWzE2XS5iYXNlICsJKChjb3JlX3J4X3F1ZXVlX2lkKSAqIElST1sxNl0ubTEpKQorI2RlZmluZSBDT1JFX0xMMl9VU1RPUk1fUEVSX1FVRVVFX1NUQVRfU0laRQkJKElST1sxNl0uc2l6ZSkKKyNkZWZpbmUgQ09SRV9MTDJfUFNUT1JNX1BFUl9RVUVVRV9TVEFUX09GRlNFVChjb3JlX3R4X3N0YXRzX2lkKSBcCisJKElST1sxN10uYmFzZSArCSgoY29yZV90eF9zdGF0c19pZCkgKiBJUk9bMTddLm0xKSkKKyNkZWZpbmUgQ09SRV9MTDJfUFNUT1JNX1BFUl9RVUVVRV9TVEFUX1NJWkUJKElST1sxN10uCXNpemUpCiAjZGVmaW5lCU1TVE9STV9RVUVVRV9TVEFUX09GRlNFVChzdGF0X2NvdW50ZXJfaWQpIFwKIAkoSVJPWzE4XS5iYXNlICsgKChzdGF0X2NvdW50ZXJfaWQpICogSVJPWzE4XS5tMSkpCiAjZGVmaW5lCU1TVE9STV9RVUVVRV9TVEFUX1NJWkUJCQkJKElST1sxOF0uc2l6ZSkKICNkZWZpbmUJTVNUT1JNX0VUSF9QRl9QUk9EU19PRkZTRVQocXVldWVfaWQpIFwKIAkoSVJPWzE5XS5iYXNlICsgKChxdWV1ZV9pZCkgKiBJUk9bMTldLm0xKSkKICNkZWZpbmUJTVNUT1JNX0VUSF9QRl9QUk9EU19TSVpFCQkJKElST1sxOV0uc2l6ZSkKLSNkZWZpbmUJTVNUT1JNX1RQQV9USU1FT1VUX1VTX09GRlNFVAkJCShJUk9bMjBdLmJhc2UpCi0jZGVmaW5lCU1TVE9STV9UUEFfVElNRU9VVF9VU19TSVpFCQkJKElST1syMF0uc2l6ZSkKKyNkZWZpbmUgTVNUT1JNX0VUSF9WRl9QUk9EU19PRkZTRVQodmZfaWQsIHZmX3F1ZXVlX2lkKSBcCisJKElST1syMF0uYmFzZSArCSgodmZfaWQpICogSVJPWzIwXS5tMSkgKyAoKHZmX3F1ZXVlX2lkKSAqIElST1syMF0ubTIpKQorI2RlZmluZSBNU1RPUk1fRVRIX1ZGX1BST0RTX1NJWkUJCQkoSVJPWzIwXS5zaXplKQorI2RlZmluZQlNU1RPUk1fVFBBX1RJTUVPVVRfVVNfT0ZGU0VUCQkJKElST1syMV0uYmFzZSkKKyNkZWZpbmUJTVNUT1JNX1RQQV9USU1FT1VUX1VTX1NJWkUJCQkoSVJPWzIxXS5zaXplKQogI2RlZmluZQlNU1RPUk1fRVRIX1BGX1NUQVRfT0ZGU0VUKHBmX2lkKSBcCi0JKElST1syMV0uYmFzZSArICgocGZfaWQpICogSVJPWzIxXS5tMSkpCisJKElST1syMl0uYmFzZSArICgocGZfaWQpICogSVJPWzIyXS5tMSkpCiAjZGVmaW5lCU1TVE9STV9FVEhfUEZfU1RBVF9TSVpFCQkJCShJUk9bMjFdLnNpemUpCiAjZGVmaW5lCVVTVE9STV9RVUVVRV9TVEFUX09GRlNFVChzdGF0X2NvdW50ZXJfaWQpIFwKLQkoSVJPWzIyXS5iYXNlICsgKChzdGF0X2NvdW50ZXJfaWQpICogSVJPWzIyXS5tMSkpCi0jZGVmaW5lCVVTVE9STV9RVUVVRV9TVEFUX1NJWkUJCQkJKElST1syMl0uc2l6ZSkKKwkoSVJPWzIzXS5iYXNlICsgKChzdGF0X2NvdW50ZXJfaWQpICogSVJPWzIzXS5tMSkpCisjZGVmaW5lCVVTVE9STV9RVUVVRV9TVEFUX1NJWkUJCQkJKElST1syM10uc2l6ZSkKICNkZWZpbmUJVVNUT1JNX0VUSF9QRl9TVEFUX09GRlNFVChwZl9pZCkgXAotCShJUk9bMjNdLmJhc2UgKyAoKHBmX2lkKSAqIElST1syM10ubTEpKQotI2RlZmluZQlVU1RPUk1fRVRIX1BGX1NUQVRfU0laRQkJCQkoSVJPWzIzXS5zaXplKQorCShJUk9bMjRdLmJhc2UgKyAoKHBmX2lkKSAqIElST1syNF0ubTEpKQorI2RlZmluZQlVU1RPUk1fRVRIX1BGX1NUQVRfU0laRQkJCQkoSVJPWzI0XS5zaXplKQogI2RlZmluZQlQU1RPUk1fUVVFVUVfU1RBVF9PRkZTRVQoc3RhdF9jb3VudGVyX2lkKSBcCi0JKElST1syNF0uYmFzZSArICgoc3RhdF9jb3VudGVyX2lkKSAqIElST1syNF0ubTEpKQotI2RlZmluZQlQU1RPUk1fUVVFVUVfU1RBVF9TSVpFCQkJCShJUk9bMjRdLnNpemUpCisJKElST1syNV0uYmFzZSArICgoc3RhdF9jb3VudGVyX2lkKSAqIElST1syNV0ubTEpKQorI2RlZmluZQlQU1RPUk1fUVVFVUVfU1RBVF9TSVpFCQkJCShJUk9bMjVdLnNpemUpCiAjZGVmaW5lCVBTVE9STV9FVEhfUEZfU1RBVF9PRkZTRVQocGZfaWQpIFwKLQkoSVJPWzI1XS5iYXNlICsgKChwZl9pZCkgKiBJUk9bMjVdLm0xKSkKLSNkZWZpbmUJUFNUT1JNX0VUSF9QRl9TVEFUX1NJWkUJCQkJKElST1syNV0uc2l6ZSkKKwkoSVJPWzI2XS5iYXNlICsgKChwZl9pZCkgKiBJUk9bMjZdLm0xKSkKKyNkZWZpbmUJUFNUT1JNX0VUSF9QRl9TVEFUX1NJWkUJCQkJKElST1syNl0uc2l6ZSkKICNkZWZpbmUJUFNUT1JNX0NUTF9GUkFNRV9FVEhUWVBFX09GRlNFVChldGh0eXBlKSBcCi0JKElST1syNl0uYmFzZSArICgoZXRodHlwZSkgKiBJUk9bMjZdLm0xKSkKLSNkZWZpbmUJUFNUT1JNX0NUTF9GUkFNRV9FVEhUWVBFX1NJWkUJCQkoSVJPWzI2XS5zaXplKQotI2RlZmluZQlUU1RPUk1fRVRIX1BSU19JTlBVVF9PRkZTRVQJCQkoSVJPWzI3XS5iYXNlKQotI2RlZmluZQlUU1RPUk1fRVRIX1BSU19JTlBVVF9TSVpFCQkJKElST1syN10uc2l6ZSkKKwkoSVJPWzI3XS5iYXNlICsgKChldGh0eXBlKSAqIElST1syN10ubTEpKQorI2RlZmluZQlQU1RPUk1fQ1RMX0ZSQU1FX0VUSFRZUEVfU0laRQkJCShJUk9bMjddLnNpemUpCisjZGVmaW5lCVRTVE9STV9FVEhfUFJTX0lOUFVUX09GRlNFVAkJCShJUk9bMjhdLmJhc2UpCisjZGVmaW5lCVRTVE9STV9FVEhfUFJTX0lOUFVUX1NJWkUJCQkoSVJPWzI4XS5zaXplKQogI2RlZmluZQlFVEhfUlhfUkFURV9MSU1JVF9PRkZTRVQocGZfaWQpIFwKLQkoSVJPWzI4XS5iYXNlICsgKChwZl9pZCkgKiBJUk9bMjhdLm0xKSkKLSNkZWZpbmUJRVRIX1JYX1JBVEVfTElNSVRfU0laRQkJCQkoSVJPWzI4XS5zaXplKQorCShJUk9bMjldLmJhc2UgKyAoKHBmX2lkKSAqIElST1syOV0ubTEpKQorI2RlZmluZQlFVEhfUlhfUkFURV9MSU1JVF9TSVpFCQkJCShJUk9bMjldLnNpemUpCiAjZGVmaW5lCVhTVE9STV9FVEhfUVVFVUVfWk9ORV9PRkZTRVQocXVldWVfaWQpIFwKLQkoSVJPWzI5XS5iYXNlICsgKChxdWV1ZV9pZCkgKiBJUk9bMjldLm0xKSkKLSNkZWZpbmUJWFNUT1JNX0VUSF9RVUVVRV9aT05FX1NJWkUJCQkoSVJPWzI5XS5zaXplKQorCShJUk9bMzBdLmJhc2UgKyAoKHF1ZXVlX2lkKSAqIElST1szMF0ubTEpKQorI2RlZmluZQlYU1RPUk1fRVRIX1FVRVVFX1pPTkVfU0laRQkJCShJUk9bMzBdLnNpemUpCisjZGVmaW5lIFRTVE9STV9TQ1NJX0NNRFFfQ09OU19PRkZTRVQoY21kcV9xdWV1ZV9pZCkgXAorCShJUk9bMzRdLmJhc2UgKwkoKGNtZHFfcXVldWVfaWQpICogSVJPWzM0XS5tMSkpCisjZGVmaW5lIFRTVE9STV9TQ1NJX0NNRFFfQ09OU19TSVpFCQkJCShJUk9bMzRdLnNpemUpCisjZGVmaW5lIFRTVE9STV9TQ1NJX0JEUV9FWFRfUFJPRF9PRkZTRVQoZnVuY19pZCwgYmRxX2lkKSBcCisJKElST1szNV0uYmFzZSArCSgoZnVuY19pZCkgKiBJUk9bMzVdLm0xKSArICgoYmRxX2lkKSAqIElST1szNV0ubTIpKQorI2RlZmluZSBUU1RPUk1fU0NTSV9CRFFfRVhUX1BST0RfU0laRQkJCQkoSVJPWzM1XS5zaXplKQorI2RlZmluZSBNU1RPUk1fU0NTSV9CRFFfRVhUX1BST0RfT0ZGU0VUKGZ1bmNfaWQsIGJkcV9pZCkgXAorCShJUk9bMzZdLmJhc2UgKwkoKGZ1bmNfaWQpICogSVJPWzM2XS5tMSkgKyAoKGJkcV9pZCkgKiBJUk9bMzZdLm0yKSkKKyNkZWZpbmUgTVNUT1JNX1NDU0lfQkRRX0VYVF9QUk9EX1NJWkUJCQkJKElST1szNl0uc2l6ZSkKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1JYX1NUQVRTX09GRlNFVChwZl9pZCkgXAorCShJUk9bMzddLmJhc2UgKwkoKHBmX2lkKSAqIElST1szN10ubTEpKQorI2RlZmluZSBUU1RPUk1fSVNDU0lfUlhfU1RBVFNfU0laRQkJCQkoSVJPWzM3XS5zaXplKQorI2RlZmluZSBNU1RPUk1fSVNDU0lfUlhfU1RBVFNfT0ZGU0VUKHBmX2lkKSBcCisJKElST1szOF0uYmFzZSArCSgocGZfaWQpICogSVJPWzM4XS5tMSkpCisjZGVmaW5lIE1TVE9STV9JU0NTSV9SWF9TVEFUU19TSVpFCQkJCShJUk9bMzhdLnNpemUpCisjZGVmaW5lIFVTVE9STV9JU0NTSV9SWF9TVEFUU19PRkZTRVQocGZfaWQpIFwKKwkoSVJPWzM5XS5iYXNlICsJKChwZl9pZCkgKiBJUk9bMzldLm0xKSkKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX1JYX1NUQVRTX1NJWkUJCQkJKElST1szOV0uc2l6ZSkKKyNkZWZpbmUgWFNUT1JNX0lTQ1NJX1RYX1NUQVRTX09GRlNFVChwZl9pZCkgXAorCShJUk9bNDBdLmJhc2UgKwkoKHBmX2lkKSAqIElST1s0MF0ubTEpKQorI2RlZmluZSBYU1RPUk1fSVNDU0lfVFhfU1RBVFNfU0laRQkJCQkoSVJPWzQwXS5zaXplKQorI2RlZmluZSBZU1RPUk1fSVNDU0lfVFhfU1RBVFNfT0ZGU0VUKHBmX2lkKSBcCisJKElST1s0MV0uYmFzZSArCSgocGZfaWQpICogSVJPWzQxXS5tMSkpCisjZGVmaW5lIFlTVE9STV9JU0NTSV9UWF9TVEFUU19TSVpFCQkJCShJUk9bNDFdLnNpemUpCisjZGVmaW5lIFBTVE9STV9JU0NTSV9UWF9TVEFUU19PRkZTRVQocGZfaWQpIFwKKwkoSVJPWzQyXS5iYXNlICsJKChwZl9pZCkgKiBJUk9bNDJdLm0xKSkKKyNkZWZpbmUgUFNUT1JNX0lTQ1NJX1RYX1NUQVRTX1NJWkUJCQkJKElST1s0Ml0uc2l6ZSkKKyNkZWZpbmUgUFNUT1JNX1JETUFfUVVFVUVfU1RBVF9PRkZTRVQocmRtYV9zdGF0X2NvdW50ZXJfaWQpIFwKKwkoSVJPWzQ1XS5iYXNlICsJKChyZG1hX3N0YXRfY291bnRlcl9pZCkgKiBJUk9bNDVdLm0xKSkKKyNkZWZpbmUgUFNUT1JNX1JETUFfUVVFVUVfU1RBVF9TSVpFCQkJCShJUk9bNDVdLnNpemUpCisjZGVmaW5lIFRTVE9STV9SRE1BX1FVRVVFX1NUQVRfT0ZGU0VUKHJkbWFfc3RhdF9jb3VudGVyX2lkKSBcCisJKElST1s0Nl0uYmFzZSArCSgocmRtYV9zdGF0X2NvdW50ZXJfaWQpICogSVJPWzQ2XS5tMSkpCisjZGVmaW5lIFRTVE9STV9SRE1BX1FVRVVFX1NUQVRfU0laRQkJCQkoSVJPWzQ2XS5zaXplKQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlybyBpcm9fYXJyWzQ2XSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXJvIGlyb19hcnJbNDddID0gewogCXsweDAsIDB4MCwgMHgwLCAweDAsIDB4OH0sCiAJezB4NGNiMCwgMHg3OCwgMHgwLCAweDAsIDB4Nzh9LAogCXsweDYzMTgsIDB4MjAsIDB4MCwgMHgwLCAweDIwfSwKQEAgLTIyMDEsMjAgKzM0NjYsMjEgQEAKIAl7MHgzZGYwLCAweDAsIDB4MCwgMHgwLCAweDc4fSwKIAl7MHgyOWIwLCAweDAsIDB4MCwgMHgwLCAweDc4fSwKIAl7MHg0YzM4LCAweDAsIDB4MCwgMHgwLCAweDc4fSwKLQl7MHg0YTQ4LCAweDAsIDB4MCwgMHgwLCAweDc4fSwKKwl7MHg0OTkwLCAweDAsIDB4MCwgMHgwLCAweDc4fSwKIAl7MHg3ZTQ4LCAweDAsIDB4MCwgMHgwLCAweDc4fSwKIAl7MHhhMjgsIDB4OCwgMHgwLCAweDAsIDB4OH0sCiAJezB4NjBmOCwgMHgxMCwgMHgwLCAweDAsIDB4MTB9LAogCXsweGI4MjAsIDB4MzAsIDB4MCwgMHgwLCAweDMwfSwKIAl7MHg5NWI4LCAweDMwLCAweDAsIDB4MCwgMHgzMH0sCi0JezB4NGMxOCwgMHg4MCwgMHgwLCAweDAsIDB4NDB9LAorCXsweDRiNjAsIDB4ODAsIDB4MCwgMHgwLCAweDQwfSwKIAl7MHgxZjgsIDB4NCwgMHgwLCAweDAsIDB4NH0sCi0JezB4YzlhOCwgMHgwLCAweDAsIDB4MCwgMHg0fSwKLQl7MHg0YzU4LCAweDgwLCAweDAsIDB4MCwgMHgyMH0sCisJezB4NTNhMCwgMHg4MCwgMHg0LCAweDAsIDB4NH0sCisJezB4YzhmMCwgMHgwLCAweDAsIDB4MCwgMHg0fSwKKwl7MHg0YmEwLCAweDgwLCAweDAsIDB4MCwgMHgyMH0sCiAJezB4ODA1MCwgMHg0MCwgMHgwLCAweDAsIDB4MzB9LAogCXsweGU3NzAsIDB4NjAsIDB4MCwgMHgwLCAweDYwfSwKIAl7MHgyYjQ4LCAweDgwLCAweDAsIDB4MCwgMHgzOH0sCi0JezB4ZGY4OCwgMHg3OCwgMHgwLCAweDAsIDB4Nzh9LAorCXsweGYxODgsIDB4NzgsIDB4MCwgMHgwLCAweDc4fSwKIAl7MHgxZjgsIDB4NCwgMHgwLCAweDAsIDB4NH0sCiAJezB4YWNmMCwgMHgwLCAweDAsIDB4MCwgMHhmMH0sCiAJezB4YWRlMCwgMHg4LCAweDAsIDB4MCwgMHg4fSwKQEAgLTIyMjYsNDU1ICszNDkyLDQ1NyBAQAogCXsweDIwMCwgMHgxMCwgMHg4LCAweDAsIDB4OH0sCiAJezB4Yjc4LCAweDEwLCAweDgsIDB4MCwgMHgyfSwKIAl7MHhkODg4LCAweDM4LCAweDAsIDB4MCwgMHgyNH0sCi0JezB4MTIxMjAsIDB4MTAsIDB4MCwgMHgwLCAweDh9LAotCXsweDExYjIwLCAweDM4LCAweDAsIDB4MCwgMHgxOH0sCisJezB4MTJjMzgsIDB4MTAsIDB4MCwgMHgwLCAweDh9LAorCXsweDExYWEwLCAweDM4LCAweDAsIDB4MCwgMHgxOH0sCiAJezB4YThjMCwgMHgzMCwgMHgwLCAweDAsIDB4MTB9LAogCXsweDg2ZjgsIDB4MjgsIDB4MCwgMHgwLCAweDE4fSwKLQl7MHhlZmY4LCAweDEwLCAweDAsIDB4MCwgMHgxMH0sCisJezB4MTAxZjgsIDB4MTAsIDB4MCwgMHgwLCAweDEwfSwKIAl7MHhkZDA4LCAweDQ4LCAweDAsIDB4MCwgMHgzOH0sCi0JezB4ZjQ2MCwgMHgyMCwgMHgwLCAweDAsIDB4MjB9LAorCXsweDEwNjYwLCAweDIwLCAweDAsIDB4MCwgMHgyMH0sCiAJezB4MmI4MCwgMHg4MCwgMHgwLCAweDAsIDB4MTB9LAogCXsweDUwMDAsIDB4MTAsIDB4MCwgMHgwLCAweDEwfSwKIH07CiAKIC8qIFJ1bnRpbWUgYXJyYXkgb2Zmc2V0cyAqLwotI2RlZmluZSBET1JRX1JFR19QRl9NQVhfSUNJRF8wX1JUX09GRlNFVCAwCi0jZGVmaW5lIERPUlFfUkVHX1BGX01BWF9JQ0lEXzFfUlRfT0ZGU0VUIDEKLSNkZWZpbmUgRE9SUV9SRUdfUEZfTUFYX0lDSURfMl9SVF9PRkZTRVQgMgotI2RlZmluZSBET1JRX1JFR19QRl9NQVhfSUNJRF8zX1JUX09GRlNFVCAzCi0jZGVmaW5lIERPUlFfUkVHX1BGX01BWF9JQ0lEXzRfUlRfT0ZGU0VUIDQKLSNkZWZpbmUgRE9SUV9SRUdfUEZfTUFYX0lDSURfNV9SVF9PRkZTRVQgNQotI2RlZmluZSBET1JRX1JFR19QRl9NQVhfSUNJRF82X1JUX09GRlNFVCA2Ci0jZGVmaW5lIERPUlFfUkVHX1BGX01BWF9JQ0lEXzdfUlRfT0ZGU0VUIDcKLSNkZWZpbmUgRE9SUV9SRUdfVkZfTUFYX0lDSURfMF9SVF9PRkZTRVQgOAotI2RlZmluZSBET1JRX1JFR19WRl9NQVhfSUNJRF8xX1JUX09GRlNFVCA5Ci0jZGVmaW5lIERPUlFfUkVHX1ZGX01BWF9JQ0lEXzJfUlRfT0ZGU0VUIDEwCi0jZGVmaW5lIERPUlFfUkVHX1ZGX01BWF9JQ0lEXzNfUlRfT0ZGU0VUIDExCi0jZGVmaW5lIERPUlFfUkVHX1ZGX01BWF9JQ0lEXzRfUlRfT0ZGU0VUIDEyCi0jZGVmaW5lIERPUlFfUkVHX1ZGX01BWF9JQ0lEXzVfUlRfT0ZGU0VUIDEzCi0jZGVmaW5lIERPUlFfUkVHX1ZGX01BWF9JQ0lEXzZfUlRfT0ZGU0VUIDE0Ci0jZGVmaW5lIERPUlFfUkVHX1ZGX01BWF9JQ0lEXzdfUlRfT0ZGU0VUIDE1Ci0jZGVmaW5lIERPUlFfUkVHX1BGX1dBS0VfQUxMX1JUX09GRlNFVCAxNgotI2RlZmluZSBET1JRX1JFR19UQUcxX0VUSEVSVFlQRV9SVF9PRkZTRVQgMTcKLSNkZWZpbmUgSUdVX1JFR19QRl9DT05GSUdVUkFUSU9OX1JUX09GRlNFVCAxOAotI2RlZmluZSBJR1VfUkVHX1ZGX0NPTkZJR1VSQVRJT05fUlRfT0ZGU0VUIDE5Ci0jZGVmaW5lIElHVV9SRUdfQVRUTl9NU0dfQUREUl9MX1JUX09GRlNFVCAyMAotI2RlZmluZSBJR1VfUkVHX0FUVE5fTVNHX0FERFJfSF9SVF9PRkZTRVQgMjEKLSNkZWZpbmUgSUdVX1JFR19MRUFESU5HX0VER0VfTEFUQ0hfUlRfT0ZGU0VUIDIyCi0jZGVmaW5lIElHVV9SRUdfVFJBSUxJTkdfRURHRV9MQVRDSF9SVF9PRkZTRVQgMjMKLSNkZWZpbmUgQ0FVX1JFR19DUUVfQUdHX1VOSVRfU0laRV9SVF9PRkZTRVQgMjQKLSNkZWZpbmUgQ0FVX1JFR19TQl9WQVJfTUVNT1JZX1JUX09GRlNFVCA3NjEKLSNkZWZpbmUgQ0FVX1JFR19TQl9WQVJfTUVNT1JZX1JUX1NJWkUgNzM2Ci0jZGVmaW5lIENBVV9SRUdfU0JfVkFSX01FTU9SWV9SVF9PRkZTRVQgNzYxCi0jZGVmaW5lIENBVV9SRUdfU0JfVkFSX01FTU9SWV9SVF9TSVpFIDczNgotI2RlZmluZSBDQVVfUkVHX1NCX0FERFJfTUVNT1JZX1JUX09GRlNFVCAxNDk3Ci0jZGVmaW5lIENBVV9SRUdfU0JfQUREUl9NRU1PUllfUlRfU0laRSA3MzYKLSNkZWZpbmUgQ0FVX1JFR19QSV9NRU1PUllfUlRfT0ZGU0VUIDIyMzMKLSNkZWZpbmUgQ0FVX1JFR19QSV9NRU1PUllfUlRfU0laRSA0NDE2Ci0jZGVmaW5lIFBSU19SRUdfU0VBUkNIX1JFU1BfSU5JVElBVE9SX1RZUEVfUlRfT0ZGU0VUIDY2NDkKLSNkZWZpbmUgUFJTX1JFR19UQVNLX0lEX01BWF9JTklUSUFUT1JfUEZfUlRfT0ZGU0VUIDY2NTAKLSNkZWZpbmUgUFJTX1JFR19UQVNLX0lEX01BWF9JTklUSUFUT1JfVkZfUlRfT0ZGU0VUIDY2NTEKLSNkZWZpbmUgUFJTX1JFR19UQVNLX0lEX01BWF9UQVJHRVRfUEZfUlRfT0ZGU0VUIDY2NTIKLSNkZWZpbmUgUFJTX1JFR19UQVNLX0lEX01BWF9UQVJHRVRfVkZfUlRfT0ZGU0VUIDY2NTMKLSNkZWZpbmUgUFJTX1JFR19TRUFSQ0hfVENQX1JUX09GRlNFVCA2NjU0Ci0jZGVmaW5lIFBSU19SRUdfU0VBUkNIX0ZDT0VfUlRfT0ZGU0VUIDY2NTUKLSNkZWZpbmUgUFJTX1JFR19TRUFSQ0hfUk9DRV9SVF9PRkZTRVQgNjY1NgotI2RlZmluZSBQUlNfUkVHX1JPQ0VfREVTVF9RUF9NQVhfVkZfUlRfT0ZGU0VUIDY2NTcKLSNkZWZpbmUgUFJTX1JFR19ST0NFX0RFU1RfUVBfTUFYX1BGX1JUX09GRlNFVCA2NjU4Ci0jZGVmaW5lIFBSU19SRUdfU0VBUkNIX09QRU5GTE9XX1JUX09GRlNFVCA2NjU5Ci0jZGVmaW5lIFBSU19SRUdfU0VBUkNIX05PTl9JUF9BU19PUEVORkxPV19SVF9PRkZTRVQgNjY2MAotI2RlZmluZSBQUlNfUkVHX09QRU5GTE9XX1NVUFBPUlRfT05MWV9LTk9XTl9PVkVSX0lQX1JUX09GRlNFVCA2NjYxCi0jZGVmaW5lIFBSU19SRUdfT1BFTkZMT1dfU0VBUkNIX0tFWV9NQVNLX1JUX09GRlNFVCA2NjYyCi0jZGVmaW5lIFBSU19SRUdfVEFHX0VUSEVSVFlQRV8wX1JUX09GRlNFVCA2NjYzCi0jZGVmaW5lIFBSU19SRUdfTElHSFRfTDJfRVRIRVJUWVBFX0VOX1JUX09GRlNFVCA2NjY0Ci0jZGVmaW5lIFNSQ19SRUdfRklSU1RGUkVFX1JUX09GRlNFVCA2NjY1Ci0jZGVmaW5lIFNSQ19SRUdfRklSU1RGUkVFX1JUX1NJWkUgMgotI2RlZmluZSBTUkNfUkVHX0xBU1RGUkVFX1JUX09GRlNFVCA2NjY3Ci0jZGVmaW5lIFNSQ19SRUdfTEFTVEZSRUVfUlRfU0laRSAyCi0jZGVmaW5lIFNSQ19SRUdfQ09VTlRGUkVFX1JUX09GRlNFVCA2NjY5Ci0jZGVmaW5lIFNSQ19SRUdfTlVNQkVSX0hBU0hfQklUU19SVF9PRkZTRVQgNjY3MAotI2RlZmluZSBQU1dSUTJfUkVHX0NEVVRfUF9TSVpFX1JUX09GRlNFVCA2NjcxCi0jZGVmaW5lIFBTV1JRMl9SRUdfQ0RVQ19QX1NJWkVfUlRfT0ZGU0VUIDY2NzIKLSNkZWZpbmUgUFNXUlEyX1JFR19UTV9QX1NJWkVfUlRfT0ZGU0VUIDY2NzMKLSNkZWZpbmUgUFNXUlEyX1JFR19RTV9QX1NJWkVfUlRfT0ZGU0VUIDY2NzQKLSNkZWZpbmUgUFNXUlEyX1JFR19TUkNfUF9TSVpFX1JUX09GRlNFVCA2Njc1Ci0jZGVmaW5lIFBTV1JRMl9SRUdfVFNETV9QX1NJWkVfUlRfT0ZGU0VUIDY2NzYKLSNkZWZpbmUgUFNXUlEyX1JFR19UTV9GSVJTVF9JTFRfUlRfT0ZGU0VUIDY2NzcKLSNkZWZpbmUgUFNXUlEyX1JFR19UTV9MQVNUX0lMVF9SVF9PRkZTRVQgNjY3OAotI2RlZmluZSBQU1dSUTJfUkVHX1FNX0ZJUlNUX0lMVF9SVF9PRkZTRVQgNjY3OQotI2RlZmluZSBQU1dSUTJfUkVHX1FNX0xBU1RfSUxUX1JUX09GRlNFVCA2NjgwCi0jZGVmaW5lIFBTV1JRMl9SRUdfU1JDX0ZJUlNUX0lMVF9SVF9PRkZTRVQgNjY4MQotI2RlZmluZSBQU1dSUTJfUkVHX1NSQ19MQVNUX0lMVF9SVF9PRkZTRVQgNjY4MgotI2RlZmluZSBQU1dSUTJfUkVHX0NEVUNfRklSU1RfSUxUX1JUX09GRlNFVCA2NjgzCi0jZGVmaW5lIFBTV1JRMl9SRUdfQ0RVQ19MQVNUX0lMVF9SVF9PRkZTRVQgNjY4NAotI2RlZmluZSBQU1dSUTJfUkVHX0NEVVRfRklSU1RfSUxUX1JUX09GRlNFVCA2Njg1Ci0jZGVmaW5lIFBTV1JRMl9SRUdfQ0RVVF9MQVNUX0lMVF9SVF9PRkZTRVQgNjY4NgotI2RlZmluZSBQU1dSUTJfUkVHX1RTRE1fRklSU1RfSUxUX1JUX09GRlNFVCA2Njg3Ci0jZGVmaW5lIFBTV1JRMl9SRUdfVFNETV9MQVNUX0lMVF9SVF9PRkZTRVQgNjY4OAotI2RlZmluZSBQU1dSUTJfUkVHX1RNX05VTUJFUl9PRl9QRl9CTE9DS1NfUlRfT0ZGU0VUIDY2ODkKLSNkZWZpbmUgUFNXUlEyX1JFR19DRFVUX05VTUJFUl9PRl9QRl9CTE9DS1NfUlRfT0ZGU0VUIDY2OTAKLSNkZWZpbmUgUFNXUlEyX1JFR19DRFVDX05VTUJFUl9PRl9QRl9CTE9DS1NfUlRfT0ZGU0VUIDY2OTEKLSNkZWZpbmUgUFNXUlEyX1JFR19UTV9WRl9CTE9DS1NfUlRfT0ZGU0VUIDY2OTIKLSNkZWZpbmUgUFNXUlEyX1JFR19DRFVUX1ZGX0JMT0NLU19SVF9PRkZTRVQgNjY5MwotI2RlZmluZSBQU1dSUTJfUkVHX0NEVUNfVkZfQkxPQ0tTX1JUX09GRlNFVCA2Njk0Ci0jZGVmaW5lIFBTV1JRMl9SRUdfVE1fQkxPQ0tTX0ZBQ1RPUl9SVF9PRkZTRVQgNjY5NQotI2RlZmluZSBQU1dSUTJfUkVHX0NEVVRfQkxPQ0tTX0ZBQ1RPUl9SVF9PRkZTRVQgNjY5NgotI2RlZmluZSBQU1dSUTJfUkVHX0NEVUNfQkxPQ0tTX0ZBQ1RPUl9SVF9PRkZTRVQgNjY5NwotI2RlZmluZSBQU1dSUTJfUkVHX1ZGX0JBU0VfUlRfT0ZGU0VUIDY2OTgKLSNkZWZpbmUgUFNXUlEyX1JFR19WRl9MQVNUX0lMVF9SVF9PRkZTRVQgNjY5OQotI2RlZmluZSBQU1dSUTJfUkVHX1dSX01CUzBfUlRfT0ZGU0VUIDY3MDAKLSNkZWZpbmUgUFNXUlEyX1JFR19SRF9NQlMwX1JUX09GRlNFVCA2NzAxCi0jZGVmaW5lIFBTV1JRMl9SRUdfRFJBTV9BTElHTl9XUl9SVF9PRkZTRVQgNjcwMgotI2RlZmluZSBQU1dSUTJfUkVHX0RSQU1fQUxJR05fUkRfUlRfT0ZGU0VUIDY3MDMKLSNkZWZpbmUgUFNXUlEyX1JFR19JTFRfTUVNT1JZX1JUX09GRlNFVCA2NzA0Ci0jZGVmaW5lIFBTV1JRMl9SRUdfSUxUX01FTU9SWV9SVF9TSVpFIDIyMDAwCi0jZGVmaW5lIFBHTFVFX1JFR19CX1ZGX0JBU0VfUlRfT0ZGU0VUIDI4NzA0Ci0jZGVmaW5lIFBHTFVFX1JFR19CX0NBQ0hFX0xJTkVfU0laRV9SVF9PRkZTRVQgMjg3MDUKLSNkZWZpbmUgUEdMVUVfUkVHX0JfUEZfQkFSMF9TSVpFX1JUX09GRlNFVCAyODcwNgotI2RlZmluZSBQR0xVRV9SRUdfQl9QRl9CQVIxX1NJWkVfUlRfT0ZGU0VUIDI4NzA3Ci0jZGVmaW5lIFBHTFVFX1JFR19CX1ZGX0JBUjFfU0laRV9SVF9PRkZTRVQgMjg3MDgKLSNkZWZpbmUgVE1fUkVHX1ZGX0VOQUJMRV9DT05OX1JUX09GRlNFVCAyODcwOQotI2RlZmluZSBUTV9SRUdfUEZfRU5BQkxFX0NPTk5fUlRfT0ZGU0VUIDI4NzEwCi0jZGVmaW5lIFRNX1JFR19QRl9FTkFCTEVfVEFTS19SVF9PRkZTRVQgMjg3MTEKLSNkZWZpbmUgVE1fUkVHX0dST1VQX1NJWkVfUkVTT0xVVElPTl9DT05OX1JUX09GRlNFVCAyODcxMgotI2RlZmluZSBUTV9SRUdfR1JPVVBfU0laRV9SRVNPTFVUSU9OX1RBU0tfUlRfT0ZGU0VUIDI4NzEzCi0jZGVmaW5lIFRNX1JFR19DT05GSUdfQ09OTl9NRU1fUlRfT0ZGU0VUIDI4NzE0Ci0jZGVmaW5lIFRNX1JFR19DT05GSUdfQ09OTl9NRU1fUlRfU0laRSA0MTYKLSNkZWZpbmUgVE1fUkVHX0NPTkZJR19UQVNLX01FTV9SVF9PRkZTRVQgMjkxMzAKLSNkZWZpbmUgVE1fUkVHX0NPTkZJR19UQVNLX01FTV9SVF9TSVpFIDUxMgotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFXzBfUlRfT0ZGU0VUIDI5NjQyCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVfMV9SVF9PRkZTRVQgMjk2NDMKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRV8yX1JUX09GRlNFVCAyOTY0NAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMF9SVF9PRkZTRVQgMjk2NDUKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzFfUlRfT0ZGU0VUIDI5NjQ2Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yX1JUX09GRlNFVCAyOTY0NwotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfM19SVF9PRkZTRVQgMjk2NDgKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzRfUlRfT0ZGU0VUIDI5NjQ5Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81X1JUX09GRlNFVCAyOTY1MAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNl9SVF9PRkZTRVQgMjk2NTEKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzdfUlRfT0ZGU0VUIDI5NjUyCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF84X1JUX09GRlNFVCAyOTY1MwotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfOV9SVF9PRkZTRVQgMjk2NTQKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzEwX1JUX09GRlNFVCAyOTY1NQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTFfUlRfT0ZGU0VUIDI5NjU2Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xMl9SVF9PRkZTRVQgMjk2NTcKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzEzX1JUX09GRlNFVCAyOTY1OAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTRfUlRfT0ZGU0VUIDI5NjU5Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xNV9SVF9PRkZTRVQgMjk2NjAKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzE2X1JUX09GRlNFVCAyOTY2MQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTdfUlRfT0ZGU0VUIDI5NjYyCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xOF9SVF9PRkZTRVQgMjk2NjMKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzE5X1JUX09GRlNFVCAyOTY2NAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjBfUlRfT0ZGU0VUIDI5NjY1Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yMV9SVF9PRkZTRVQgMjk2NjYKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzIyX1JUX09GRlNFVCAyOTY2NwotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjNfUlRfT0ZGU0VUIDI5NjY4Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yNF9SVF9PRkZTRVQgMjk2NjkKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzI1X1JUX09GRlNFVCAyOTY3MAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjZfUlRfT0ZGU0VUIDI5NjcxCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yN19SVF9PRkZTRVQgMjk2NzIKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzI4X1JUX09GRlNFVCAyOTY3MwotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjlfUlRfT0ZGU0VUIDI5Njc0Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zMF9SVF9PRkZTRVQgMjk2NzUKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzMxX1JUX09GRlNFVCAyOTY3NgotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzJfUlRfT0ZGU0VUIDI5Njc3Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zM19SVF9PRkZTRVQgMjk2NzgKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzM0X1JUX09GRlNFVCAyOTY3OQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzVfUlRfT0ZGU0VUIDI5NjgwCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zNl9SVF9PRkZTRVQgMjk2ODEKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzM3X1JUX09GRlNFVCAyOTY4MgotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzhfUlRfT0ZGU0VUIDI5NjgzCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zOV9SVF9PRkZTRVQgMjk2ODQKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQwX1JUX09GRlNFVCAyOTY4NQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDFfUlRfT0ZGU0VUIDI5Njg2Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80Ml9SVF9PRkZTRVQgMjk2ODcKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQzX1JUX09GRlNFVCAyOTY4OAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDRfUlRfT0ZGU0VUIDI5Njg5Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80NV9SVF9PRkZTRVQgMjk2OTAKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQ2X1JUX09GRlNFVCAyOTY5MQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDdfUlRfT0ZGU0VUIDI5NjkyCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80OF9SVF9PRkZTRVQgMjk2OTMKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQ5X1JUX09GRlNFVCAyOTY5NAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTBfUlRfT0ZGU0VUIDI5Njk1Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81MV9SVF9PRkZTRVQgMjk2OTYKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzUyX1JUX09GRlNFVCAyOTY5NwotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTNfUlRfT0ZGU0VUIDI5Njk4Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81NF9SVF9PRkZTRVQgMjk2OTkKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzU1X1JUX09GRlNFVCAyOTcwMAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTZfUlRfT0ZGU0VUIDI5NzAxCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81N19SVF9PRkZTRVQgMjk3MDIKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzU4X1JUX09GRlNFVCAyOTcwMwotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTlfUlRfT0ZGU0VUIDI5NzA0Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF82MF9SVF9PRkZTRVQgMjk3MDUKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzYxX1JUX09GRlNFVCAyOTcwNgotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNjJfUlRfT0ZGU0VUIDI5NzA3Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF82M19SVF9PRkZTRVQgMjk3MDgKLSNkZWZpbmUgUU1fUkVHX0JBU0VBRERST1RIRVJQUV9SVF9PRkZTRVQgMjk3MDkKLSNkZWZpbmUgUU1fUkVHX0JBU0VBRERST1RIRVJQUV9SVF9TSVpFIDEyOAotI2RlZmluZSBRTV9SRUdfVk9RQ1JETElORV9SVF9PRkZTRVQgMjk4MzcKLSNkZWZpbmUgUU1fUkVHX1ZPUUNSRExJTkVfUlRfU0laRSAyMAotI2RlZmluZSBRTV9SRUdfVk9RSU5JVENSRExJTkVfUlRfT0ZGU0VUIDI5ODU3Ci0jZGVmaW5lIFFNX1JFR19WT1FJTklUQ1JETElORV9SVF9TSVpFIDIwCi0jZGVmaW5lIFFNX1JFR19BRlVMTFFNQllQVEhSUEZXRlFfUlRfT0ZGU0VUIDI5ODc3Ci0jZGVmaW5lIFFNX1JFR19BRlVMTFFNQllQVEhSVlBXRlFfUlRfT0ZGU0VUIDI5ODc4Ci0jZGVmaW5lIFFNX1JFR19BRlVMTFFNQllQVEhSUEZSTF9SVF9PRkZTRVQgMjk4NzkKLSNkZWZpbmUgUU1fUkVHX0FGVUxMUU1CWVBUSFJHTEJMUkxfUlRfT0ZGU0VUIDI5ODgwCi0jZGVmaW5lIFFNX1JFR19BRlVMTE9QUlROU1RDQ1JETUFTS19SVF9PRkZTRVQgMjk4ODEKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMF9SVF9PRkZTRVQgMjk4ODIKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMV9SVF9PRkZTRVQgMjk4ODMKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMl9SVF9PRkZTRVQgMjk4ODQKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfM19SVF9PRkZTRVQgMjk4ODUKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfNF9SVF9PRkZTRVQgMjk4ODYKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfNV9SVF9PRkZTRVQgMjk4ODcKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfNl9SVF9PRkZTRVQgMjk4ODgKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfN19SVF9PRkZTRVQgMjk4ODkKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfOF9SVF9PRkZTRVQgMjk4OTAKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfOV9SVF9PRkZTRVQgMjk4OTEKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMTBfUlRfT0ZGU0VUIDI5ODkyCi0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzExX1JUX09GRlNFVCAyOTg5MwotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8xMl9SVF9PRkZTRVQgMjk4OTQKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMTNfUlRfT0ZGU0VUIDI5ODk1Ci0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzE0X1JUX09GRlNFVCAyOTg5NgotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8xNV9SVF9PRkZTRVQgMjk4OTcKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSR1JQV0VJR0hUXzBfUlRfT0ZGU0VUIDI5ODk4Ci0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUkdSUFdFSUdIVF8xX1JUX09GRlNFVCAyOTg5OQotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJHUlBXRUlHSFRfMl9SVF9PRkZTRVQgMjk5MDAKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSR1JQV0VJR0hUXzNfUlRfT0ZGU0VUIDI5OTAxCi0jZGVmaW5lIFFNX1JFR19XUlJUWEdSUFdFSUdIVF8wX1JUX09GRlNFVCAyOTkwMgotI2RlZmluZSBRTV9SRUdfV1JSVFhHUlBXRUlHSFRfMV9SVF9PRkZTRVQgMjk5MDMKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMF9SVF9PRkZTRVQgMjk5MDQKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMV9SVF9PRkZTRVQgMjk5MDUKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMl9SVF9PRkZTRVQgMjk5MDYKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfM19SVF9PRkZTRVQgMjk5MDcKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNF9SVF9PRkZTRVQgMjk5MDgKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNV9SVF9PRkZTRVQgMjk5MDkKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNl9SVF9PRkZTRVQgMjk5MTAKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfN19SVF9PRkZTRVQgMjk5MTEKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfOF9SVF9PRkZTRVQgMjk5MTIKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfOV9SVF9PRkZTRVQgMjk5MTMKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTBfUlRfT0ZGU0VUIDI5OTE0Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzExX1JUX09GRlNFVCAyOTkxNQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xMl9SVF9PRkZTRVQgMjk5MTYKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTNfUlRfT0ZGU0VUIDI5OTE3Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzE0X1JUX09GRlNFVCAyOTkxOAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xNV9SVF9PRkZTRVQgMjk5MTkKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTZfUlRfT0ZGU0VUIDI5OTIwCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzE3X1JUX09GRlNFVCAyOTkyMQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xOF9SVF9PRkZTRVQgMjk5MjIKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTlfUlRfT0ZGU0VUIDI5OTIzCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzIwX1JUX09GRlNFVCAyOTkyNAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yMV9SVF9PRkZTRVQgMjk5MjUKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjJfUlRfT0ZGU0VUIDI5OTI2Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzIzX1JUX09GRlNFVCAyOTkyNwotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yNF9SVF9PRkZTRVQgMjk5MjgKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjVfUlRfT0ZGU0VUIDI5OTI5Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzI2X1JUX09GRlNFVCAyOTkzMAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yN19SVF9PRkZTRVQgMjk5MzEKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjhfUlRfT0ZGU0VUIDI5OTMyCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzI5X1JUX09GRlNFVCAyOTkzMwotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zMF9SVF9PRkZTRVQgMjk5MzQKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzFfUlRfT0ZGU0VUIDI5OTM1Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzMyX1JUX09GRlNFVCAyOTkzNgotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zM19SVF9PRkZTRVQgMjk5MzcKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzRfUlRfT0ZGU0VUIDI5OTM4Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzM1X1JUX09GRlNFVCAyOTkzOQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zNl9SVF9PRkZTRVQgMjk5NDAKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzdfUlRfT0ZGU0VUIDI5OTQxCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzM4X1JUX09GRlNFVCAyOTk0MgotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zOV9SVF9PRkZTRVQgMjk5NDMKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDBfUlRfT0ZGU0VUIDI5OTQ0Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQxX1JUX09GRlNFVCAyOTk0NQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80Ml9SVF9PRkZTRVQgMjk5NDYKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDNfUlRfT0ZGU0VUIDI5OTQ3Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQ0X1JUX09GRlNFVCAyOTk0OAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80NV9SVF9PRkZTRVQgMjk5NDkKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDZfUlRfT0ZGU0VUIDI5OTUwCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQ3X1JUX09GRlNFVCAyOTk1MQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80OF9SVF9PRkZTRVQgMjk5NTIKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDlfUlRfT0ZGU0VUIDI5OTUzCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzUwX1JUX09GRlNFVCAyOTk1NAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81MV9SVF9PRkZTRVQgMjk5NTUKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTJfUlRfT0ZGU0VUIDI5OTU2Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzUzX1JUX09GRlNFVCAyOTk1NwotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81NF9SVF9PRkZTRVQgMjk5NTgKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTVfUlRfT0ZGU0VUIDI5OTU5Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzU2X1JUX09GRlNFVCAyOTk2MAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81N19SVF9PRkZTRVQgMjk5NjEKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNThfUlRfT0ZGU0VUIDI5OTYyCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzU5X1JUX09GRlNFVCAyOTk2MwotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl82MF9SVF9PRkZTRVQgMjk5NjQKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNjFfUlRfT0ZGU0VUIDI5OTY1Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzYyX1JUX09GRlNFVCAyOTk2NgotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl82M19SVF9PRkZTRVQgMjk5NjcKLSNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMF9SVF9PRkZTRVQgMjk5NjgKLSNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMV9SVF9PRkZTRVQgMjk5NjkKLSNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMl9SVF9PRkZTRVQgMjk5NzAKLSNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfM19SVF9PRkZTRVQgMjk5NzEKLSNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfNF9SVF9PRkZTRVQgMjk5NzIKLSNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfNV9SVF9PRkZTRVQgMjk5NzMKLSNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfNl9SVF9PRkZTRVQgMjk5NzQKLSNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfN19SVF9PRkZTRVQgMjk5NzUKLSNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfOF9SVF9PRkZTRVQgMjk5NzYKLSNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfOV9SVF9PRkZTRVQgMjk5NzcKLSNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMTBfUlRfT0ZGU0VUIDI5OTc4Ci0jZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzExX1JUX09GRlNFVCAyOTk3OQotI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8xMl9SVF9PRkZTRVQgMjk5ODAKLSNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMTNfUlRfT0ZGU0VUIDI5OTgxCi0jZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzE0X1JUX09GRlNFVCAyOTk4MgotI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8xNV9SVF9PRkZTRVQgMjk5ODMKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRF8wX1JUX09GRlNFVCAyOTk4NAotI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EXzFfUlRfT0ZGU0VUIDI5OTg1Ci0jZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RUSU1FUl8wX1JUX09GRlNFVCAyOTk4NgotI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EVElNRVJfMV9SVF9PRkZTRVQgMjk5ODcKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFNFTF8wX1JUX09GRlNFVCAyOTk4OAotI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EU0VMXzFfUlRfT0ZGU0VUIDI5OTg5Ci0jZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RTRUxfMl9SVF9PRkZTRVQgMjk5OTAKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFNFTF8zX1JUX09GRlNFVCAyOTk5MQotI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EU0VMXzRfUlRfT0ZGU0VUIDI5OTkyCi0jZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RTRUxfNV9SVF9PRkZTRVQgMjk5OTMKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFNFTF82X1JUX09GRlNFVCAyOTk5NAotI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EU0VMXzdfUlRfT0ZGU0VUIDI5OTk1Ci0jZGVmaW5lIFFNX1JFR19STEdMQkxJTkNWQUxfUlRfT0ZGU0VUIDI5OTk2Ci0jZGVmaW5lIFFNX1JFR19STEdMQkxJTkNWQUxfUlRfU0laRSAyNTYKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTFVQUEVSQk9VTkRfUlRfT0ZGU0VUIDMwMjUyCi0jZGVmaW5lIFFNX1JFR19STEdMQkxVUFBFUkJPVU5EX1JUX1NJWkUgMjU2Ci0jZGVmaW5lIFFNX1JFR19STEdMQkxDUkRfUlRfT0ZGU0VUIDMwNTA4Ci0jZGVmaW5lIFFNX1JFR19STEdMQkxDUkRfUlRfU0laRSAyNTYKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTEVOQUJMRV9SVF9PRkZTRVQgMzA3NjQKLSNkZWZpbmUgUU1fUkVHX1JMUEZQRVJJT0RfUlRfT0ZGU0VUIDMwNzY1Ci0jZGVmaW5lIFFNX1JFR19STFBGUEVSSU9EVElNRVJfUlRfT0ZGU0VUIDMwNzY2Ci0jZGVmaW5lIFFNX1JFR19STFBGSU5DVkFMX1JUX09GRlNFVCAzMDc2NwotI2RlZmluZSBRTV9SRUdfUkxQRklOQ1ZBTF9SVF9TSVpFIDE2Ci0jZGVmaW5lIFFNX1JFR19STFBGVVBQRVJCT1VORF9SVF9PRkZTRVQgMzA3ODMKLSNkZWZpbmUgUU1fUkVHX1JMUEZVUFBFUkJPVU5EX1JUX1NJWkUgMTYKLSNkZWZpbmUgUU1fUkVHX1JMUEZDUkRfUlRfT0ZGU0VUIDMwNzk5Ci0jZGVmaW5lIFFNX1JFR19STFBGQ1JEX1JUX1NJWkUgMTYKLSNkZWZpbmUgUU1fUkVHX1JMUEZFTkFCTEVfUlRfT0ZGU0VUIDMwODE1Ci0jZGVmaW5lIFFNX1JFR19STFBGVk9RRU5BQkxFX1JUX09GRlNFVCAzMDgxNgotI2RlZmluZSBRTV9SRUdfV0ZRUEZXRUlHSFRfUlRfT0ZGU0VUIDMwODE3Ci0jZGVmaW5lIFFNX1JFR19XRlFQRldFSUdIVF9SVF9TSVpFIDE2Ci0jZGVmaW5lIFFNX1JFR19XRlFQRlVQUEVSQk9VTkRfUlRfT0ZGU0VUIDMwODMzCi0jZGVmaW5lIFFNX1JFR19XRlFQRlVQUEVSQk9VTkRfUlRfU0laRSAxNgotI2RlZmluZSBRTV9SRUdfV0ZRUEZDUkRfUlRfT0ZGU0VUIDMwODQ5Ci0jZGVmaW5lIFFNX1JFR19XRlFQRkNSRF9SVF9TSVpFIDE2MAotI2RlZmluZSBRTV9SRUdfV0ZRUEZFTkFCTEVfUlRfT0ZGU0VUIDMxMDA5Ci0jZGVmaW5lIFFNX1JFR19XRlFWUEVOQUJMRV9SVF9PRkZTRVQgMzEwMTAKLSNkZWZpbmUgUU1fUkVHX0JBU0VBRERSVFhQUV9SVF9PRkZTRVQgMzEwMTEKLSNkZWZpbmUgUU1fUkVHX0JBU0VBRERSVFhQUV9SVF9TSVpFIDUxMgotI2RlZmluZSBRTV9SRUdfVFhQUU1BUF9SVF9PRkZTRVQgMzE1MjMKLSNkZWZpbmUgUU1fUkVHX1RYUFFNQVBfUlRfU0laRSA1MTIKLSNkZWZpbmUgUU1fUkVHX1dGUVZQV0VJR0hUX1JUX09GRlNFVCAzMjAzNQotI2RlZmluZSBRTV9SRUdfV0ZRVlBXRUlHSFRfUlRfU0laRSA1MTIKLSNkZWZpbmUgUU1fUkVHX1dGUVZQQ1JEX1JUX09GRlNFVCAzMjU0NwotI2RlZmluZSBRTV9SRUdfV0ZRVlBDUkRfUlRfU0laRSA1MTIKLSNkZWZpbmUgUU1fUkVHX1dGUVZQTUFQX1JUX09GRlNFVCAzMzA1OQotI2RlZmluZSBRTV9SRUdfV0ZRVlBNQVBfUlRfU0laRSA1MTIKLSNkZWZpbmUgUU1fUkVHX1dGUVBGQ1JEX01TQl9SVF9PRkZTRVQgMzM1NzEKLSNkZWZpbmUgUU1fUkVHX1dGUVBGQ1JEX01TQl9SVF9TSVpFIDE2MAotI2RlZmluZSBOSUdfUkVHX1RBR19FVEhFUlRZUEVfMF9SVF9PRkZTRVQgMzM3MzEKLSNkZWZpbmUgTklHX1JFR19PVVRFUl9UQUdfVkFMVUVfTElTVDBfUlRfT0ZGU0VUIDMzNzMyCi0jZGVmaW5lIE5JR19SRUdfT1VURVJfVEFHX1ZBTFVFX0xJU1QxX1JUX09GRlNFVCAzMzczMwotI2RlZmluZSBOSUdfUkVHX09VVEVSX1RBR19WQUxVRV9MSVNUMl9SVF9PRkZTRVQgMzM3MzQKLSNkZWZpbmUgTklHX1JFR19PVVRFUl9UQUdfVkFMVUVfTElTVDNfUlRfT0ZGU0VUIDMzNzM1Ci0jZGVmaW5lIE5JR19SRUdfT1VURVJfVEFHX1ZBTFVFX01BU0tfUlRfT0ZGU0VUIDMzNzM2Ci0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfVEFHTUFDX0NMU19UWVBFX1JUX09GRlNFVCAzMzczNwotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX1RBR19FTl9SVF9PRkZTRVQgMzM3MzgKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19UQUdfRU5fUlRfU0laRSA0Ci0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfVEFHX0hEUl9TRUxfUlRfT0ZGU0VUIDMzNzQyCi0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfVEFHX0hEUl9TRUxfUlRfU0laRSA0Ci0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfVEFHX1ZBTFVFX1JUX09GRlNFVCAzMzc0NgotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX1RBR19WQUxVRV9SVF9TSVpFIDQKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19OT19UQUdfUlRfT0ZGU0VUIDMzNzUwCi0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1ZBTFVFX1JUX09GRlNFVCAzMzc1MQotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9WQUxVRV9SVF9TSVpFIDMyCi0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0VOX1JUX09GRlNFVCAzMzc4MwotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9FTl9SVF9TSVpFIDE2Ci0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX01PREVfUlRfT0ZGU0VUIDMzNzk5Ci0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX01PREVfUlRfU0laRSAxNgotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9QUk9UT0NPTF9UWVBFX1JUX09GRlNFVCAzMzgxNQotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9QUk9UT0NPTF9UWVBFX1JUX1NJWkUgMTYKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfSERSX1NFTF9SVF9PRkZTRVQgMzM4MzEKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfSERSX1NFTF9SVF9TSVpFIDE2Ci0jZGVmaW5lIE5JR19SRUdfVFhfRURQTV9DVFJMX1JUX09GRlNFVCAzMzg0NwotI2RlZmluZSBOSUdfUkVHX1JPQ0VfRFVQTElDQVRFX1RPX0hPU1RfUlRfT0ZGU0VUIDMzODQ4Ci0jZGVmaW5lIENEVV9SRUdfQ0lEX0FERFJfUEFSQU1TX1JUX09GRlNFVCAzMzg0OQotI2RlZmluZSBDRFVfUkVHX1NFR01FTlQwX1BBUkFNU19SVF9PRkZTRVQgMzM4NTAKLSNkZWZpbmUgQ0RVX1JFR19TRUdNRU5UMV9QQVJBTVNfUlRfT0ZGU0VUIDMzODUxCi0jZGVmaW5lIENEVV9SRUdfUEZfU0VHMF9UWVBFX09GRlNFVF9SVF9PRkZTRVQgMzM4NTIKLSNkZWZpbmUgQ0RVX1JFR19QRl9TRUcxX1RZUEVfT0ZGU0VUX1JUX09GRlNFVCAzMzg1MwotI2RlZmluZSBDRFVfUkVHX1BGX1NFRzJfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUIDMzODU0Ci0jZGVmaW5lIENEVV9SRUdfUEZfU0VHM19UWVBFX09GRlNFVF9SVF9PRkZTRVQgMzM4NTUKLSNkZWZpbmUgQ0RVX1JFR19QRl9GTF9TRUcwX1RZUEVfT0ZGU0VUX1JUX09GRlNFVCAzMzg1NgotI2RlZmluZSBDRFVfUkVHX1BGX0ZMX1NFRzFfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUIDMzODU3Ci0jZGVmaW5lIENEVV9SRUdfUEZfRkxfU0VHMl9UWVBFX09GRlNFVF9SVF9PRkZTRVQgMzM4NTgKLSNkZWZpbmUgQ0RVX1JFR19QRl9GTF9TRUczX1RZUEVfT0ZGU0VUX1JUX09GRlNFVCAzMzg1OQotI2RlZmluZSBDRFVfUkVHX1ZGX1NFR19UWVBFX09GRlNFVF9SVF9PRkZTRVQgMzM4NjAKLSNkZWZpbmUgQ0RVX1JFR19WRl9GTF9TRUdfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUIDMzODYxCi0jZGVmaW5lIFBCRl9SRUdfVEFHX0VUSEVSVFlQRV8wX1JUX09GRlNFVCAzMzg2MgotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TSVpFX1JUX09GRlNFVCAzMzg2MwotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTBfUlRfT0ZGU0VUIDMzODY0Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMF9SVF9PRkZTRVQgMzM4NjUKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMF9SVF9PRkZTRVQgMzM4NjYKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExX1JUX09GRlNFVCAzMzg2NwotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTFfUlRfT0ZGU0VUIDMzODY4Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTFfUlRfT0ZGU0VUIDMzODY5Ci0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMl9SVF9PRkZTRVQgMzM4NzAKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1EyX1JUX09GRlNFVCAzMzg3MQotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1EyX1JUX09GRlNFVCAzMzg3MgotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTNfUlRfT0ZGU0VUIDMzODczCi0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RM19SVF9PRkZTRVQgMzM4NzQKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RM19SVF9PRkZTRVQgMzM4NzUKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1E0X1JUX09GRlNFVCAzMzg3NgotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTRfUlRfT0ZGU0VUIDMzODc3Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTRfUlRfT0ZGU0VUIDMzODc4Ci0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RNV9SVF9PRkZTRVQgMzM4NzkKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1E1X1JUX09GRlNFVCAzMzg4MAotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1E1X1JUX09GRlNFVCAzMzg4MQotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTZfUlRfT0ZGU0VUIDMzODgyCi0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RNl9SVF9PRkZTRVQgMzM4ODMKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RNl9SVF9PRkZTRVQgMzM4ODQKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1E3X1JUX09GRlNFVCAzMzg4NQotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTdfUlRfT0ZGU0VUIDMzODg2Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTdfUlRfT0ZGU0VUIDMzODg3Ci0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9ROF9SVF9PRkZTRVQgMzM4ODgKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1E4X1JUX09GRlNFVCAzMzg4OQotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1E4X1JUX09GRlNFVCAzMzg5MAotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTlfUlRfT0ZGU0VUIDMzODkxCi0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9ROV9SVF9PRkZTRVQgMzM4OTIKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9ROV9SVF9PRkZTRVQgMzM4OTMKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExMF9SVF9PRkZTRVQgMzM4OTQKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExMF9SVF9PRkZTRVQgMzM4OTUKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTBfUlRfT0ZGU0VUIDMzODk2Ci0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTFfUlRfT0ZGU0VUIDMzODk3Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTFfUlRfT0ZGU0VUIDMzODk4Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTExX1JUX09GRlNFVCAzMzg5OQotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTEyX1JUX09GRlNFVCAzMzkwMAotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTEyX1JUX09GRlNFVCAzMzkwMQotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExMl9SVF9PRkZTRVQgMzM5MDIKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExM19SVF9PRkZTRVQgMzM5MDMKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExM19SVF9PRkZTRVQgMzM5MDQKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTNfUlRfT0ZGU0VUIDMzOTA1Ci0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTRfUlRfT0ZGU0VUIDMzOTA2Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTRfUlRfT0ZGU0VUIDMzOTA3Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTE0X1JUX09GRlNFVCAzMzkwOAotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTE1X1JUX09GRlNFVCAzMzkwOQotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTE1X1JUX09GRlNFVCAzMzkxMAotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExNV9SVF9PRkZTRVQgMzM5MTEKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExNl9SVF9PRkZTRVQgMzM5MTIKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExNl9SVF9PRkZTRVQgMzM5MTMKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTZfUlRfT0ZGU0VUIDMzOTE0Ci0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTdfUlRfT0ZGU0VUIDMzOTE1Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTdfUlRfT0ZGU0VUIDMzOTE2Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTE3X1JUX09GRlNFVCAzMzkxNwotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTE4X1JUX09GRlNFVCAzMzkxOAotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTE4X1JUX09GRlNFVCAzMzkxOQotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExOF9SVF9PRkZTRVQgMzM5MjAKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExOV9SVF9PRkZTRVQgMzM5MjEKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExOV9SVF9PRkZTRVQgMzM5MjIKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTlfUlRfT0ZGU0VUIDMzOTIzCi0jZGVmaW5lIFhDTV9SRUdfQ09OX1BIWV9RM19SVF9PRkZTRVQgMzM5MjQKKyNkZWZpbmUgRE9SUV9SRUdfUEZfTUFYX0lDSURfMF9SVF9PRkZTRVQJMAorI2RlZmluZSBET1JRX1JFR19QRl9NQVhfSUNJRF8xX1JUX09GRlNFVAkxCisjZGVmaW5lIERPUlFfUkVHX1BGX01BWF9JQ0lEXzJfUlRfT0ZGU0VUCTIKKyNkZWZpbmUgRE9SUV9SRUdfUEZfTUFYX0lDSURfM19SVF9PRkZTRVQJMworI2RlZmluZSBET1JRX1JFR19QRl9NQVhfSUNJRF80X1JUX09GRlNFVAk0CisjZGVmaW5lIERPUlFfUkVHX1BGX01BWF9JQ0lEXzVfUlRfT0ZGU0VUCTUKKyNkZWZpbmUgRE9SUV9SRUdfUEZfTUFYX0lDSURfNl9SVF9PRkZTRVQJNgorI2RlZmluZSBET1JRX1JFR19QRl9NQVhfSUNJRF83X1JUX09GRlNFVAk3CisjZGVmaW5lIERPUlFfUkVHX1ZGX01BWF9JQ0lEXzBfUlRfT0ZGU0VUCTgKKyNkZWZpbmUgRE9SUV9SRUdfVkZfTUFYX0lDSURfMV9SVF9PRkZTRVQJOQorI2RlZmluZSBET1JRX1JFR19WRl9NQVhfSUNJRF8yX1JUX09GRlNFVAkxMAorI2RlZmluZSBET1JRX1JFR19WRl9NQVhfSUNJRF8zX1JUX09GRlNFVAkxMQorI2RlZmluZSBET1JRX1JFR19WRl9NQVhfSUNJRF80X1JUX09GRlNFVAkxMgorI2RlZmluZSBET1JRX1JFR19WRl9NQVhfSUNJRF81X1JUX09GRlNFVAkxMworI2RlZmluZSBET1JRX1JFR19WRl9NQVhfSUNJRF82X1JUX09GRlNFVAkxNAorI2RlZmluZSBET1JRX1JFR19WRl9NQVhfSUNJRF83X1JUX09GRlNFVAkxNQorI2RlZmluZSBET1JRX1JFR19QRl9XQUtFX0FMTF9SVF9PRkZTRVQJMTYKKyNkZWZpbmUgRE9SUV9SRUdfVEFHMV9FVEhFUlRZUEVfUlRfT0ZGU0VUCTE3CisjZGVmaW5lIElHVV9SRUdfUEZfQ09ORklHVVJBVElPTl9SVF9PRkZTRVQJMTgKKyNkZWZpbmUgSUdVX1JFR19WRl9DT05GSUdVUkFUSU9OX1JUX09GRlNFVAkxOQorI2RlZmluZSBJR1VfUkVHX0FUVE5fTVNHX0FERFJfTF9SVF9PRkZTRVQJMjAKKyNkZWZpbmUgSUdVX1JFR19BVFROX01TR19BRERSX0hfUlRfT0ZGU0VUCTIxCisjZGVmaW5lIElHVV9SRUdfTEVBRElOR19FREdFX0xBVENIX1JUX09GRlNFVAkyMgorI2RlZmluZSBJR1VfUkVHX1RSQUlMSU5HX0VER0VfTEFUQ0hfUlRfT0ZGU0VUCTIzCisjZGVmaW5lIENBVV9SRUdfQ1FFX0FHR19VTklUX1NJWkVfUlRfT0ZGU0VUCTI0CisjZGVmaW5lIENBVV9SRUdfU0JfVkFSX01FTU9SWV9SVF9PRkZTRVQJNzYxCisjZGVmaW5lIENBVV9SRUdfU0JfVkFSX01FTU9SWV9SVF9TSVpFCTczNgorI2RlZmluZSBDQVVfUkVHX1NCX1ZBUl9NRU1PUllfUlRfT0ZGU0VUCTc2MQorI2RlZmluZSBDQVVfUkVHX1NCX1ZBUl9NRU1PUllfUlRfU0laRQk3MzYKKyNkZWZpbmUgQ0FVX1JFR19TQl9BRERSX01FTU9SWV9SVF9PRkZTRVQJMTQ5NworI2RlZmluZSBDQVVfUkVHX1NCX0FERFJfTUVNT1JZX1JUX1NJWkUJNzM2CisjZGVmaW5lIENBVV9SRUdfUElfTUVNT1JZX1JUX09GRlNFVAkyMjMzCisjZGVmaW5lIENBVV9SRUdfUElfTUVNT1JZX1JUX1NJWkUJNDQxNgorI2RlZmluZSBQUlNfUkVHX1NFQVJDSF9SRVNQX0lOSVRJQVRPUl9UWVBFX1JUX09GRlNFVAk2NjQ5CisjZGVmaW5lIFBSU19SRUdfVEFTS19JRF9NQVhfSU5JVElBVE9SX1BGX1JUX09GRlNFVAk2NjUwCisjZGVmaW5lIFBSU19SRUdfVEFTS19JRF9NQVhfSU5JVElBVE9SX1ZGX1JUX09GRlNFVAk2NjUxCisjZGVmaW5lIFBSU19SRUdfVEFTS19JRF9NQVhfVEFSR0VUX1BGX1JUX09GRlNFVAk2NjUyCisjZGVmaW5lIFBSU19SRUdfVEFTS19JRF9NQVhfVEFSR0VUX1ZGX1JUX09GRlNFVAk2NjUzCisjZGVmaW5lIFBSU19SRUdfU0VBUkNIX1RDUF9SVF9PRkZTRVQJNjY1NAorI2RlZmluZSBQUlNfUkVHX1NFQVJDSF9GQ09FX1JUX09GRlNFVAk2NjU1CisjZGVmaW5lIFBSU19SRUdfU0VBUkNIX1JPQ0VfUlRfT0ZGU0VUCTY2NTYKKyNkZWZpbmUgUFJTX1JFR19ST0NFX0RFU1RfUVBfTUFYX1ZGX1JUX09GRlNFVAk2NjU3CisjZGVmaW5lIFBSU19SRUdfUk9DRV9ERVNUX1FQX01BWF9QRl9SVF9PRkZTRVQJNjY1OAorI2RlZmluZSBQUlNfUkVHX1NFQVJDSF9PUEVORkxPV19SVF9PRkZTRVQJNjY1OQorI2RlZmluZSBQUlNfUkVHX1NFQVJDSF9OT05fSVBfQVNfT1BFTkZMT1dfUlRfT0ZGU0VUCTY2NjAKKyNkZWZpbmUgUFJTX1JFR19PUEVORkxPV19TVVBQT1JUX09OTFlfS05PV05fT1ZFUl9JUF9SVF9PRkZTRVQJNjY2MQorI2RlZmluZSBQUlNfUkVHX09QRU5GTE9XX1NFQVJDSF9LRVlfTUFTS19SVF9PRkZTRVQJNjY2MgorI2RlZmluZSBQUlNfUkVHX1RBR19FVEhFUlRZUEVfMF9SVF9PRkZTRVQJNjY2MworI2RlZmluZSBQUlNfUkVHX0xJR0hUX0wyX0VUSEVSVFlQRV9FTl9SVF9PRkZTRVQJNjY2NAorI2RlZmluZSBTUkNfUkVHX0ZJUlNURlJFRV9SVF9PRkZTRVQJNjY2NQorI2RlZmluZSBTUkNfUkVHX0ZJUlNURlJFRV9SVF9TSVpFCTIKKyNkZWZpbmUgU1JDX1JFR19MQVNURlJFRV9SVF9PRkZTRVQJNjY2NworI2RlZmluZSBTUkNfUkVHX0xBU1RGUkVFX1JUX1NJWkUJMgorI2RlZmluZSBTUkNfUkVHX0NPVU5URlJFRV9SVF9PRkZTRVQJNjY2OQorI2RlZmluZSBTUkNfUkVHX05VTUJFUl9IQVNIX0JJVFNfUlRfT0ZGU0VUCTY2NzAKKyNkZWZpbmUgUFNXUlEyX1JFR19DRFVUX1BfU0laRV9SVF9PRkZTRVQJNjY3MQorI2RlZmluZSBQU1dSUTJfUkVHX0NEVUNfUF9TSVpFX1JUX09GRlNFVAk2NjcyCisjZGVmaW5lIFBTV1JRMl9SRUdfVE1fUF9TSVpFX1JUX09GRlNFVAk2NjczCisjZGVmaW5lIFBTV1JRMl9SRUdfUU1fUF9TSVpFX1JUX09GRlNFVAk2Njc0CisjZGVmaW5lIFBTV1JRMl9SRUdfU1JDX1BfU0laRV9SVF9PRkZTRVQJNjY3NQorI2RlZmluZSBQU1dSUTJfUkVHX1RTRE1fUF9TSVpFX1JUX09GRlNFVAk2Njc2CisjZGVmaW5lIFBTV1JRMl9SRUdfVE1fRklSU1RfSUxUX1JUX09GRlNFVAk2Njc3CisjZGVmaW5lIFBTV1JRMl9SRUdfVE1fTEFTVF9JTFRfUlRfT0ZGU0VUCTY2NzgKKyNkZWZpbmUgUFNXUlEyX1JFR19RTV9GSVJTVF9JTFRfUlRfT0ZGU0VUCTY2NzkKKyNkZWZpbmUgUFNXUlEyX1JFR19RTV9MQVNUX0lMVF9SVF9PRkZTRVQJNjY4MAorI2RlZmluZSBQU1dSUTJfUkVHX1NSQ19GSVJTVF9JTFRfUlRfT0ZGU0VUCTY2ODEKKyNkZWZpbmUgUFNXUlEyX1JFR19TUkNfTEFTVF9JTFRfUlRfT0ZGU0VUCTY2ODIKKyNkZWZpbmUgUFNXUlEyX1JFR19DRFVDX0ZJUlNUX0lMVF9SVF9PRkZTRVQJNjY4MworI2RlZmluZSBQU1dSUTJfUkVHX0NEVUNfTEFTVF9JTFRfUlRfT0ZGU0VUCTY2ODQKKyNkZWZpbmUgUFNXUlEyX1JFR19DRFVUX0ZJUlNUX0lMVF9SVF9PRkZTRVQJNjY4NQorI2RlZmluZSBQU1dSUTJfUkVHX0NEVVRfTEFTVF9JTFRfUlRfT0ZGU0VUCTY2ODYKKyNkZWZpbmUgUFNXUlEyX1JFR19UU0RNX0ZJUlNUX0lMVF9SVF9PRkZTRVQJNjY4NworI2RlZmluZSBQU1dSUTJfUkVHX1RTRE1fTEFTVF9JTFRfUlRfT0ZGU0VUCTY2ODgKKyNkZWZpbmUgUFNXUlEyX1JFR19UTV9OVU1CRVJfT0ZfUEZfQkxPQ0tTX1JUX09GRlNFVAk2Njg5CisjZGVmaW5lIFBTV1JRMl9SRUdfQ0RVVF9OVU1CRVJfT0ZfUEZfQkxPQ0tTX1JUX09GRlNFVAk2NjkwCisjZGVmaW5lIFBTV1JRMl9SRUdfQ0RVQ19OVU1CRVJfT0ZfUEZfQkxPQ0tTX1JUX09GRlNFVAk2NjkxCisjZGVmaW5lIFBTV1JRMl9SRUdfVE1fVkZfQkxPQ0tTX1JUX09GRlNFVAk2NjkyCisjZGVmaW5lIFBTV1JRMl9SRUdfQ0RVVF9WRl9CTE9DS1NfUlRfT0ZGU0VUCTY2OTMKKyNkZWZpbmUgUFNXUlEyX1JFR19DRFVDX1ZGX0JMT0NLU19SVF9PRkZTRVQJNjY5NAorI2RlZmluZSBQU1dSUTJfUkVHX1RNX0JMT0NLU19GQUNUT1JfUlRfT0ZGU0VUCTY2OTUKKyNkZWZpbmUgUFNXUlEyX1JFR19DRFVUX0JMT0NLU19GQUNUT1JfUlRfT0ZGU0VUCTY2OTYKKyNkZWZpbmUgUFNXUlEyX1JFR19DRFVDX0JMT0NLU19GQUNUT1JfUlRfT0ZGU0VUCTY2OTcKKyNkZWZpbmUgUFNXUlEyX1JFR19WRl9CQVNFX1JUX09GRlNFVAk2Njk4CisjZGVmaW5lIFBTV1JRMl9SRUdfVkZfTEFTVF9JTFRfUlRfT0ZGU0VUCTY2OTkKKyNkZWZpbmUgUFNXUlEyX1JFR19XUl9NQlMwX1JUX09GRlNFVAk2NzAwCisjZGVmaW5lIFBTV1JRMl9SRUdfUkRfTUJTMF9SVF9PRkZTRVQJNjcwMQorI2RlZmluZSBQU1dSUTJfUkVHX0RSQU1fQUxJR05fV1JfUlRfT0ZGU0VUCTY3MDIKKyNkZWZpbmUgUFNXUlEyX1JFR19EUkFNX0FMSUdOX1JEX1JUX09GRlNFVAk2NzAzCisjZGVmaW5lIFBTV1JRMl9SRUdfSUxUX01FTU9SWV9SVF9PRkZTRVQJNjcwNAorI2RlZmluZSBQU1dSUTJfUkVHX0lMVF9NRU1PUllfUlRfU0laRQkyMjAwMAorI2RlZmluZSBQR0xVRV9SRUdfQl9WRl9CQVNFX1JUX09GRlNFVAkyODcwNAorI2RlZmluZSBQR0xVRV9SRUdfQl9NU0RNX09GRlNFVF9NQVNLX0JfUlRfT0ZGU0VUCTI4NzA1CisjZGVmaW5lIFBHTFVFX1JFR19CX01TRE1fVkZfU0hJRlRfQl9SVF9PRkZTRVQJMjg3MDYKKyNkZWZpbmUgUEdMVUVfUkVHX0JfQ0FDSEVfTElORV9TSVpFX1JUX09GRlNFVAkyODcwNworI2RlZmluZSBQR0xVRV9SRUdfQl9QRl9CQVIwX1NJWkVfUlRfT0ZGU0VUCTI4NzA4CisjZGVmaW5lIFBHTFVFX1JFR19CX1BGX0JBUjFfU0laRV9SVF9PRkZTRVQJMjg3MDkKKyNkZWZpbmUgUEdMVUVfUkVHX0JfVkZfQkFSMV9TSVpFX1JUX09GRlNFVAkyODcxMAorI2RlZmluZSBUTV9SRUdfVkZfRU5BQkxFX0NPTk5fUlRfT0ZGU0VUCTI4NzExCisjZGVmaW5lIFRNX1JFR19QRl9FTkFCTEVfQ09OTl9SVF9PRkZTRVQJMjg3MTIKKyNkZWZpbmUgVE1fUkVHX1BGX0VOQUJMRV9UQVNLX1JUX09GRlNFVAkyODcxMworI2RlZmluZSBUTV9SRUdfR1JPVVBfU0laRV9SRVNPTFVUSU9OX0NPTk5fUlRfT0ZGU0VUCTI4NzE0CisjZGVmaW5lIFRNX1JFR19HUk9VUF9TSVpFX1JFU09MVVRJT05fVEFTS19SVF9PRkZTRVQJMjg3MTUKKyNkZWZpbmUgVE1fUkVHX0NPTkZJR19DT05OX01FTV9SVF9PRkZTRVQJMjg3MTYKKyNkZWZpbmUgVE1fUkVHX0NPTkZJR19DT05OX01FTV9SVF9TSVpFCTQxNgorI2RlZmluZSBUTV9SRUdfQ09ORklHX1RBU0tfTUVNX1JUX09GRlNFVAkyOTEzMgorI2RlZmluZSBUTV9SRUdfQ09ORklHX1RBU0tfTUVNX1JUX1NJWkUJNTEyCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVfMF9SVF9PRkZTRVQJMjk2NDQKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRV8xX1JUX09GRlNFVAkyOTY0NQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFXzJfUlRfT0ZGU0VUCTI5NjQ2CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8wX1JUX09GRlNFVAkyOTY0NworI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMV9SVF9PRkZTRVQJMjk2NDgKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzJfUlRfT0ZGU0VUCTI5NjQ5CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zX1JUX09GRlNFVAkyOTY1MAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNF9SVF9PRkZTRVQJMjk2NTEKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzVfUlRfT0ZGU0VUCTI5NjUyCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF82X1JUX09GRlNFVAkyOTY1MworI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfN19SVF9PRkZTRVQJMjk2NTQKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzhfUlRfT0ZGU0VUCTI5NjU1CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF85X1JUX09GRlNFVAkyOTY1NgorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTBfUlRfT0ZGU0VUCTI5NjU3CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xMV9SVF9PRkZTRVQJMjk2NTgKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzEyX1JUX09GRlNFVAkyOTY1OQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTNfUlRfT0ZGU0VUCTI5NjYwCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xNF9SVF9PRkZTRVQJMjk2NjEKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzE1X1JUX09GRlNFVAkyOTY2MgorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTZfUlRfT0ZGU0VUCTI5NjYzCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xN19SVF9PRkZTRVQJMjk2NjQKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzE4X1JUX09GRlNFVAkyOTY2NQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTlfUlRfT0ZGU0VUCTI5NjY2CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yMF9SVF9PRkZTRVQJMjk2NjcKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzIxX1JUX09GRlNFVAkyOTY2OAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjJfUlRfT0ZGU0VUCTI5NjY5CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yM19SVF9PRkZTRVQJMjk2NzAKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzI0X1JUX09GRlNFVAkyOTY3MQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjVfUlRfT0ZGU0VUCTI5NjcyCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yNl9SVF9PRkZTRVQJMjk2NzMKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzI3X1JUX09GRlNFVAkyOTY3NAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjhfUlRfT0ZGU0VUCTI5Njc1CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yOV9SVF9PRkZTRVQJMjk2NzYKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzMwX1JUX09GRlNFVAkyOTY3NworI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzFfUlRfT0ZGU0VUCTI5Njc4CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zMl9SVF9PRkZTRVQJMjk2NzkKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzMzX1JUX09GRlNFVAkyOTY4MAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzRfUlRfT0ZGU0VUCTI5NjgxCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zNV9SVF9PRkZTRVQJMjk2ODIKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzM2X1JUX09GRlNFVAkyOTY4MworI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzdfUlRfT0ZGU0VUCTI5Njg0CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zOF9SVF9PRkZTRVQJMjk2ODUKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzM5X1JUX09GRlNFVAkyOTY4NgorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDBfUlRfT0ZGU0VUCTI5Njg3CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80MV9SVF9PRkZTRVQJMjk2ODgKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQyX1JUX09GRlNFVAkyOTY4OQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDNfUlRfT0ZGU0VUCTI5NjkwCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80NF9SVF9PRkZTRVQJMjk2OTEKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQ1X1JUX09GRlNFVAkyOTY5MgorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDZfUlRfT0ZGU0VUCTI5NjkzCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80N19SVF9PRkZTRVQJMjk2OTQKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQ4X1JUX09GRlNFVAkyOTY5NQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDlfUlRfT0ZGU0VUCTI5Njk2CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81MF9SVF9PRkZTRVQJMjk2OTcKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzUxX1JUX09GRlNFVAkyOTY5OAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTJfUlRfT0ZGU0VUCTI5Njk5CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81M19SVF9PRkZTRVQJMjk3MDAKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzU0X1JUX09GRlNFVAkyOTcwMQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTVfUlRfT0ZGU0VUCTI5NzAyCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81Nl9SVF9PRkZTRVQJMjk3MDMKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzU3X1JUX09GRlNFVAkyOTcwNAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNThfUlRfT0ZGU0VUCTI5NzA1CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81OV9SVF9PRkZTRVQJMjk3MDYKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzYwX1JUX09GRlNFVAkyOTcwNworI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNjFfUlRfT0ZGU0VUCTI5NzA4CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF82Ml9SVF9PRkZTRVQJMjk3MDkKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzYzX1JUX09GRlNFVAkyOTcxMAorI2RlZmluZSBRTV9SRUdfQkFTRUFERFJPVEhFUlBRX1JUX09GRlNFVAkyOTcxMQorI2RlZmluZSBRTV9SRUdfQkFTRUFERFJPVEhFUlBRX1JUX1NJWkUJMTI4CisjZGVmaW5lIFFNX1JFR19WT1FDUkRMSU5FX1JUX09GRlNFVAkyOTgzOQorI2RlZmluZSBRTV9SRUdfVk9RQ1JETElORV9SVF9TSVpFCTIwCisjZGVmaW5lIFFNX1JFR19WT1FJTklUQ1JETElORV9SVF9PRkZTRVQJMjk4NTkKKyNkZWZpbmUgUU1fUkVHX1ZPUUlOSVRDUkRMSU5FX1JUX1NJWkUJMjAKKyNkZWZpbmUgUU1fUkVHX0FGVUxMUU1CWVBUSFJQRldGUV9SVF9PRkZTRVQJMjk4NzkKKyNkZWZpbmUgUU1fUkVHX0FGVUxMUU1CWVBUSFJWUFdGUV9SVF9PRkZTRVQJMjk4ODAKKyNkZWZpbmUgUU1fUkVHX0FGVUxMUU1CWVBUSFJQRlJMX1JUX09GRlNFVAkyOTg4MQorI2RlZmluZSBRTV9SRUdfQUZVTExRTUJZUFRIUkdMQkxSTF9SVF9PRkZTRVQJMjk4ODIKKyNkZWZpbmUgUU1fUkVHX0FGVUxMT1BSVE5TVENDUkRNQVNLX1JUX09GRlNFVAkyOTg4MworI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8wX1JUX09GRlNFVAkyOTg4NAorI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8xX1JUX09GRlNFVAkyOTg4NQorI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8yX1JUX09GRlNFVAkyOTg4NgorI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8zX1JUX09GRlNFVAkyOTg4NworI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF80X1JUX09GRlNFVAkyOTg4OAorI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF81X1JUX09GRlNFVAkyOTg4OQorI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF82X1JUX09GRlNFVAkyOTg5MAorI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF83X1JUX09GRlNFVAkyOTg5MQorI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF84X1JUX09GRlNFVAkyOTg5MgorI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF85X1JUX09GRlNFVAkyOTg5MworI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8xMF9SVF9PRkZTRVQJMjk4OTQKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMTFfUlRfT0ZGU0VUCTI5ODk1CisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzEyX1JUX09GRlNFVAkyOTg5NgorI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8xM19SVF9PRkZTRVQJMjk4OTcKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMTRfUlRfT0ZGU0VUCTI5ODk4CisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzE1X1JUX09GRlNFVAkyOTg5OQorI2RlZmluZSBRTV9SRUdfV1JST1RIRVJHUlBXRUlHSFRfMF9SVF9PRkZTRVQJMjk5MDAKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSR1JQV0VJR0hUXzFfUlRfT0ZGU0VUCTI5OTAxCisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUkdSUFdFSUdIVF8yX1JUX09GRlNFVAkyOTkwMgorI2RlZmluZSBRTV9SRUdfV1JST1RIRVJHUlBXRUlHSFRfM19SVF9PRkZTRVQJMjk5MDMKKyNkZWZpbmUgUU1fUkVHX1dSUlRYR1JQV0VJR0hUXzBfUlRfT0ZGU0VUCTI5OTA0CisjZGVmaW5lIFFNX1JFR19XUlJUWEdSUFdFSUdIVF8xX1JUX09GRlNFVAkyOTkwNQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8wX1JUX09GRlNFVAkyOTkwNgorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xX1JUX09GRlNFVAkyOTkwNworI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yX1JUX09GRlNFVAkyOTkwOAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zX1JUX09GRlNFVAkyOTkwOQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80X1JUX09GRlNFVAkyOTkxMAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81X1JUX09GRlNFVAkyOTkxMQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl82X1JUX09GRlNFVAkyOTkxMgorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl83X1JUX09GRlNFVAkyOTkxMworI2RlZmluZSBRTV9SRUdfUFFUWDJQRl84X1JUX09GRlNFVAkyOTkxNAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl85X1JUX09GRlNFVAkyOTkxNQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xMF9SVF9PRkZTRVQJMjk5MTYKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTFfUlRfT0ZGU0VUCTI5OTE3CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzEyX1JUX09GRlNFVAkyOTkxOAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xM19SVF9PRkZTRVQJMjk5MTkKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTRfUlRfT0ZGU0VUCTI5OTIwCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzE1X1JUX09GRlNFVAkyOTkyMQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xNl9SVF9PRkZTRVQJMjk5MjIKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTdfUlRfT0ZGU0VUCTI5OTIzCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzE4X1JUX09GRlNFVAkyOTkyNAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xOV9SVF9PRkZTRVQJMjk5MjUKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjBfUlRfT0ZGU0VUCTI5OTI2CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzIxX1JUX09GRlNFVAkyOTkyNworI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yMl9SVF9PRkZTRVQJMjk5MjgKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjNfUlRfT0ZGU0VUCTI5OTI5CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzI0X1JUX09GRlNFVAkyOTkzMAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yNV9SVF9PRkZTRVQJMjk5MzEKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjZfUlRfT0ZGU0VUCTI5OTMyCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzI3X1JUX09GRlNFVAkyOTkzMworI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yOF9SVF9PRkZTRVQJMjk5MzQKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjlfUlRfT0ZGU0VUCTI5OTM1CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzMwX1JUX09GRlNFVAkyOTkzNgorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zMV9SVF9PRkZTRVQJMjk5MzcKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzJfUlRfT0ZGU0VUCTI5OTM4CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzMzX1JUX09GRlNFVAkyOTkzOQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zNF9SVF9PRkZTRVQJMjk5NDAKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzVfUlRfT0ZGU0VUCTI5OTQxCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzM2X1JUX09GRlNFVAkyOTk0MgorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zN19SVF9PRkZTRVQJMjk5NDMKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzhfUlRfT0ZGU0VUCTI5OTQ0CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzM5X1JUX09GRlNFVAkyOTk0NQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80MF9SVF9PRkZTRVQJMjk5NDYKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDFfUlRfT0ZGU0VUCTI5OTQ3CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQyX1JUX09GRlNFVAkyOTk0OAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80M19SVF9PRkZTRVQJMjk5NDkKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDRfUlRfT0ZGU0VUCTI5OTUwCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQ1X1JUX09GRlNFVAkyOTk1MQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80Nl9SVF9PRkZTRVQJMjk5NTIKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDdfUlRfT0ZGU0VUCTI5OTUzCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQ4X1JUX09GRlNFVAkyOTk1NAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80OV9SVF9PRkZTRVQJMjk5NTUKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTBfUlRfT0ZGU0VUCTI5OTU2CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzUxX1JUX09GRlNFVAkyOTk1NworI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81Ml9SVF9PRkZTRVQJMjk5NTgKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTNfUlRfT0ZGU0VUCTI5OTU5CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzU0X1JUX09GRlNFVAkyOTk2MAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81NV9SVF9PRkZTRVQJMjk5NjEKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTZfUlRfT0ZGU0VUCTI5OTYyCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzU3X1JUX09GRlNFVAkyOTk2MworI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81OF9SVF9PRkZTRVQJMjk5NjQKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTlfUlRfT0ZGU0VUCTI5OTY1CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzYwX1JUX09GRlNFVAkyOTk2NgorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl82MV9SVF9PRkZTRVQJMjk5NjcKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNjJfUlRfT0ZGU0VUCTI5OTY4CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzYzX1JUX09GRlNFVAkyOTk2OQorI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8wX1JUX09GRlNFVAkyOTk3MAorI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8xX1JUX09GRlNFVAkyOTk3MQorI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8yX1JUX09GRlNFVAkyOTk3MgorI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8zX1JUX09GRlNFVAkyOTk3MworI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl80X1JUX09GRlNFVAkyOTk3NAorI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl81X1JUX09GRlNFVAkyOTk3NQorI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl82X1JUX09GRlNFVAkyOTk3NgorI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl83X1JUX09GRlNFVAkyOTk3NworI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl84X1JUX09GRlNFVAkyOTk3OAorI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl85X1JUX09GRlNFVAkyOTk3OQorI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8xMF9SVF9PRkZTRVQJMjk5ODAKKyNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMTFfUlRfT0ZGU0VUCTI5OTgxCisjZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzEyX1JUX09GRlNFVAkyOTk4MgorI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8xM19SVF9PRkZTRVQJMjk5ODMKKyNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMTRfUlRfT0ZGU0VUCTI5OTg0CisjZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzE1X1JUX09GRlNFVAkyOTk4NQorI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EXzBfUlRfT0ZGU0VUCTI5OTg2CisjZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RfMV9SVF9PRkZTRVQJMjk5ODcKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFRJTUVSXzBfUlRfT0ZGU0VUCTI5OTg4CisjZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RUSU1FUl8xX1JUX09GRlNFVAkyOTk4OQorI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EU0VMXzBfUlRfT0ZGU0VUCTI5OTkwCisjZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RTRUxfMV9SVF9PRkZTRVQJMjk5OTEKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFNFTF8yX1JUX09GRlNFVAkyOTk5MgorI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EU0VMXzNfUlRfT0ZGU0VUCTI5OTkzCisjZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RTRUxfNF9SVF9PRkZTRVQJMjk5OTQKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFNFTF81X1JUX09GRlNFVAkyOTk5NQorI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EU0VMXzZfUlRfT0ZGU0VUCTI5OTk2CisjZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RTRUxfN19SVF9PRkZTRVQJMjk5OTcKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTElOQ1ZBTF9SVF9PRkZTRVQJMjk5OTgKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTElOQ1ZBTF9SVF9TSVpFCTI1NgorI2RlZmluZSBRTV9SRUdfUkxHTEJMVVBQRVJCT1VORF9SVF9PRkZTRVQJMzAyNTQKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTFVQUEVSQk9VTkRfUlRfU0laRQkyNTYKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTENSRF9SVF9PRkZTRVQJMzA1MTAKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTENSRF9SVF9TSVpFCTI1NgorI2RlZmluZSBRTV9SRUdfUkxHTEJMRU5BQkxFX1JUX09GRlNFVAkzMDc2NgorI2RlZmluZSBRTV9SRUdfUkxQRlBFUklPRF9SVF9PRkZTRVQJMzA3NjcKKyNkZWZpbmUgUU1fUkVHX1JMUEZQRVJJT0RUSU1FUl9SVF9PRkZTRVQJMzA3NjgKKyNkZWZpbmUgUU1fUkVHX1JMUEZJTkNWQUxfUlRfT0ZGU0VUCTMwNzY5CisjZGVmaW5lIFFNX1JFR19STFBGSU5DVkFMX1JUX1NJWkUJMTYKKyNkZWZpbmUgUU1fUkVHX1JMUEZVUFBFUkJPVU5EX1JUX09GRlNFVAkzMDc4NQorI2RlZmluZSBRTV9SRUdfUkxQRlVQUEVSQk9VTkRfUlRfU0laRQkxNgorI2RlZmluZSBRTV9SRUdfUkxQRkNSRF9SVF9PRkZTRVQJMzA4MDEKKyNkZWZpbmUgUU1fUkVHX1JMUEZDUkRfUlRfU0laRQkxNgorI2RlZmluZSBRTV9SRUdfUkxQRkVOQUJMRV9SVF9PRkZTRVQJMzA4MTcKKyNkZWZpbmUgUU1fUkVHX1JMUEZWT1FFTkFCTEVfUlRfT0ZGU0VUCTMwODE4CisjZGVmaW5lIFFNX1JFR19XRlFQRldFSUdIVF9SVF9PRkZTRVQJMzA4MTkKKyNkZWZpbmUgUU1fUkVHX1dGUVBGV0VJR0hUX1JUX1NJWkUJMTYKKyNkZWZpbmUgUU1fUkVHX1dGUVBGVVBQRVJCT1VORF9SVF9PRkZTRVQJMzA4MzUKKyNkZWZpbmUgUU1fUkVHX1dGUVBGVVBQRVJCT1VORF9SVF9TSVpFCTE2CisjZGVmaW5lIFFNX1JFR19XRlFQRkNSRF9SVF9PRkZTRVQJMzA4NTEKKyNkZWZpbmUgUU1fUkVHX1dGUVBGQ1JEX1JUX1NJWkUJMTYwCisjZGVmaW5lIFFNX1JFR19XRlFQRkVOQUJMRV9SVF9PRkZTRVQJMzEwMTEKKyNkZWZpbmUgUU1fUkVHX1dGUVZQRU5BQkxFX1JUX09GRlNFVAkzMTAxMgorI2RlZmluZSBRTV9SRUdfQkFTRUFERFJUWFBRX1JUX09GRlNFVAkzMTAxMworI2RlZmluZSBRTV9SRUdfQkFTRUFERFJUWFBRX1JUX1NJWkUJNTEyCisjZGVmaW5lIFFNX1JFR19UWFBRTUFQX1JUX09GRlNFVAkzMTUyNQorI2RlZmluZSBRTV9SRUdfVFhQUU1BUF9SVF9TSVpFCTUxMgorI2RlZmluZSBRTV9SRUdfV0ZRVlBXRUlHSFRfUlRfT0ZGU0VUCTMyMDM3CisjZGVmaW5lIFFNX1JFR19XRlFWUFdFSUdIVF9SVF9TSVpFCTUxMgorI2RlZmluZSBRTV9SRUdfV0ZRVlBDUkRfUlRfT0ZGU0VUCTMyNTQ5CisjZGVmaW5lIFFNX1JFR19XRlFWUENSRF9SVF9TSVpFCTUxMgorI2RlZmluZSBRTV9SRUdfV0ZRVlBNQVBfUlRfT0ZGU0VUCTMzMDYxCisjZGVmaW5lIFFNX1JFR19XRlFWUE1BUF9SVF9TSVpFCTUxMgorI2RlZmluZSBRTV9SRUdfV0ZRUEZDUkRfTVNCX1JUX09GRlNFVAkzMzU3MworI2RlZmluZSBRTV9SRUdfV0ZRUEZDUkRfTVNCX1JUX1NJWkUJMTYwCisjZGVmaW5lIE5JR19SRUdfVEFHX0VUSEVSVFlQRV8wX1JUX09GRlNFVAkzMzczMworI2RlZmluZSBOSUdfUkVHX09VVEVSX1RBR19WQUxVRV9MSVNUMF9SVF9PRkZTRVQJMzM3MzQKKyNkZWZpbmUgTklHX1JFR19PVVRFUl9UQUdfVkFMVUVfTElTVDFfUlRfT0ZGU0VUCTMzNzM1CisjZGVmaW5lIE5JR19SRUdfT1VURVJfVEFHX1ZBTFVFX0xJU1QyX1JUX09GRlNFVAkzMzczNgorI2RlZmluZSBOSUdfUkVHX09VVEVSX1RBR19WQUxVRV9MSVNUM19SVF9PRkZTRVQJMzM3MzcKKyNkZWZpbmUgTklHX1JFR19PVVRFUl9UQUdfVkFMVUVfTUFTS19SVF9PRkZTRVQJMzM3MzgKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19UQUdNQUNfQ0xTX1RZUEVfUlRfT0ZGU0VUCTMzNzM5CisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfVEFHX0VOX1JUX09GRlNFVAkzMzc0MAorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX1RBR19FTl9SVF9TSVpFCTQKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19UQUdfSERSX1NFTF9SVF9PRkZTRVQJMzM3NDQKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19UQUdfSERSX1NFTF9SVF9TSVpFCTQKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19UQUdfVkFMVUVfUlRfT0ZGU0VUCTMzNzQ4CisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfVEFHX1ZBTFVFX1JUX1NJWkUJNAorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX05PX1RBR19SVF9PRkZTRVQJMzM3NTIKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfVkFMVUVfUlRfT0ZGU0VUCTMzNzUzCisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1ZBTFVFX1JUX1NJWkUJMzIKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfRU5fUlRfT0ZGU0VUCTMzNzg1CisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0VOX1JUX1NJWkUJMTYKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfTU9ERV9SVF9PRkZTRVQJMzM4MDEKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfTU9ERV9SVF9TSVpFCTE2CisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1BST1RPQ09MX1RZUEVfUlRfT0ZGU0VUCTMzODE3CisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1BST1RPQ09MX1RZUEVfUlRfU0laRQkxNgorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9IRFJfU0VMX1JUX09GRlNFVAkzMzgzMworI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9IRFJfU0VMX1JUX1NJWkUJMTYKKyNkZWZpbmUgTklHX1JFR19UWF9FRFBNX0NUUkxfUlRfT0ZGU0VUCTMzODQ5CisjZGVmaW5lIE5JR19SRUdfUk9DRV9EVVBMSUNBVEVfVE9fSE9TVF9SVF9PRkZTRVQJMzM4NTAKKyNkZWZpbmUgQ0RVX1JFR19DSURfQUREUl9QQVJBTVNfUlRfT0ZGU0VUCTMzODUxCisjZGVmaW5lIENEVV9SRUdfU0VHTUVOVDBfUEFSQU1TX1JUX09GRlNFVAkzMzg1MgorI2RlZmluZSBDRFVfUkVHX1NFR01FTlQxX1BBUkFNU19SVF9PRkZTRVQJMzM4NTMKKyNkZWZpbmUgQ0RVX1JFR19QRl9TRUcwX1RZUEVfT0ZGU0VUX1JUX09GRlNFVAkzMzg1NAorI2RlZmluZSBDRFVfUkVHX1BGX1NFRzFfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUCTMzODU1CisjZGVmaW5lIENEVV9SRUdfUEZfU0VHMl9UWVBFX09GRlNFVF9SVF9PRkZTRVQJMzM4NTYKKyNkZWZpbmUgQ0RVX1JFR19QRl9TRUczX1RZUEVfT0ZGU0VUX1JUX09GRlNFVAkzMzg1NworI2RlZmluZSBDRFVfUkVHX1BGX0ZMX1NFRzBfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUCTMzODU4CisjZGVmaW5lIENEVV9SRUdfUEZfRkxfU0VHMV9UWVBFX09GRlNFVF9SVF9PRkZTRVQJMzM4NTkKKyNkZWZpbmUgQ0RVX1JFR19QRl9GTF9TRUcyX1RZUEVfT0ZGU0VUX1JUX09GRlNFVAkzMzg2MAorI2RlZmluZSBDRFVfUkVHX1BGX0ZMX1NFRzNfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUCTMzODYxCisjZGVmaW5lIENEVV9SRUdfVkZfU0VHX1RZUEVfT0ZGU0VUX1JUX09GRlNFVAkzMzg2MgorI2RlZmluZSBDRFVfUkVHX1ZGX0ZMX1NFR19UWVBFX09GRlNFVF9SVF9PRkZTRVQJMzM4NjMKKyNkZWZpbmUgUEJGX1JFR19UQUdfRVRIRVJUWVBFXzBfUlRfT0ZGU0VUCTMzODY0CisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NJWkVfUlRfT0ZGU0VUCTMzODY1CisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMF9SVF9PRkZTRVQJMzM4NjYKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1EwX1JUX09GRlNFVAkzMzg2NworI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1EwX1JUX09GRlNFVAkzMzg2OAorI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTFfUlRfT0ZGU0VUCTMzODY5CisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMV9SVF9PRkZTRVQJMzM4NzAKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMV9SVF9PRkZTRVQJMzM4NzEKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1EyX1JUX09GRlNFVAkzMzg3MgorI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTJfUlRfT0ZGU0VUCTMzODczCisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTJfUlRfT0ZGU0VUCTMzODc0CisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RM19SVF9PRkZTRVQJMzM4NzUKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1EzX1JUX09GRlNFVAkzMzg3NgorI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1EzX1JUX09GRlNFVAkzMzg3NworI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTRfUlRfT0ZGU0VUCTMzODc4CisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RNF9SVF9PRkZTRVQJMzM4NzkKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RNF9SVF9PRkZTRVQJMzM4ODAKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1E1X1JUX09GRlNFVAkzMzg4MQorI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTVfUlRfT0ZGU0VUCTMzODgyCisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTVfUlRfT0ZGU0VUCTMzODgzCisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RNl9SVF9PRkZTRVQJMzM4ODQKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1E2X1JUX09GRlNFVAkzMzg4NQorI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1E2X1JUX09GRlNFVAkzMzg4NgorI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTdfUlRfT0ZGU0VUCTMzODg3CisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RN19SVF9PRkZTRVQJMzM4ODgKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RN19SVF9PRkZTRVQJMzM4ODkKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1E4X1JUX09GRlNFVAkzMzg5MAorI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUThfUlRfT0ZGU0VUCTMzODkxCisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUThfUlRfT0ZGU0VUCTMzODkyCisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9ROV9SVF9PRkZTRVQJMzM4OTMKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1E5X1JUX09GRlNFVAkzMzg5NAorI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1E5X1JUX09GRlNFVAkzMzg5NQorI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTEwX1JUX09GRlNFVAkzMzg5NgorI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTEwX1JUX09GRlNFVAkzMzg5NworI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExMF9SVF9PRkZTRVQJMzM4OTgKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExMV9SVF9PRkZTRVQJMzM4OTkKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExMV9SVF9PRkZTRVQJMzM5MDAKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTFfUlRfT0ZGU0VUCTMzOTAxCisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTJfUlRfT0ZGU0VUCTMzOTAyCisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTJfUlRfT0ZGU0VUCTMzOTAzCisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTEyX1JUX09GRlNFVAkzMzkwNAorI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTEzX1JUX09GRlNFVAkzMzkwNQorI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTEzX1JUX09GRlNFVAkzMzkwNgorI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExM19SVF9PRkZTRVQJMzM5MDcKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExNF9SVF9PRkZTRVQJMzM5MDgKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExNF9SVF9PRkZTRVQJMzM5MDkKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTRfUlRfT0ZGU0VUCTMzOTEwCisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTVfUlRfT0ZGU0VUCTMzOTExCisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTVfUlRfT0ZGU0VUCTMzOTEyCisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTE1X1JUX09GRlNFVAkzMzkxMworI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTE2X1JUX09GRlNFVAkzMzkxNAorI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTE2X1JUX09GRlNFVAkzMzkxNQorI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExNl9SVF9PRkZTRVQJMzM5MTYKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExN19SVF9PRkZTRVQJMzM5MTcKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExN19SVF9PRkZTRVQJMzM5MTgKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTdfUlRfT0ZGU0VUCTMzOTE5CisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMThfUlRfT0ZGU0VUCTMzOTIwCisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMThfUlRfT0ZGU0VUCTMzOTIxCisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTE4X1JUX09GRlNFVAkzMzkyMgorI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTE5X1JUX09GRlNFVAkzMzkyMworI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTE5X1JUX09GRlNFVAkzMzkyNAorI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExOV9SVF9PRkZTRVQJMzM5MjUKKyNkZWZpbmUgWENNX1JFR19DT05fUEhZX1EzX1JUX09GRlNFVAkzMzkyNgogCi0jZGVmaW5lIFJVTlRJTUVfQVJSQVlfU0laRSAzMzkyNQorI2RlZmluZSBSVU5USU1FX0FSUkFZX1NJWkUgMzM5MjcKIAogLyogVGhlIGV0aCBzdG9ybSBjb250ZXh0IGZvciB0aGUgVHN0b3JtICovCiBzdHJ1Y3QgdHN0b3JtX2V0aF9jb25uX3N0X2N0eCB7CkBAIC0zMjAxLDcgKzQ0NjksMzEgQEAKIAlzdHJ1Y3QgbXN0b3JtX2V0aF9jb25uX3N0X2N0eCBtc3Rvcm1fc3RfY29udGV4dDsKIH07CiAKLS8qIG9wY29kZXMgZm9yIHRoZSBldmVudCByaW5nICovCitlbnVtIGV0aF9lcnJvcl9jb2RlIHsKKwlFVEhfT0sgPSAweDAwLAorCUVUSF9GSUxURVJTX01BQ19BRERfRkFJTF9GVUxMLAorCUVUSF9GSUxURVJTX01BQ19BRERfRkFJTF9GVUxMX01UVDIsCisJRVRIX0ZJTFRFUlNfTUFDX0FERF9GQUlMX0RVUF9NVFQyLAorCUVUSF9GSUxURVJTX01BQ19BRERfRkFJTF9EVVBfU1RUMiwKKwlFVEhfRklMVEVSU19NQUNfREVMX0ZBSUxfTk9GLAorCUVUSF9GSUxURVJTX01BQ19ERUxfRkFJTF9OT0ZfTVRUMiwKKwlFVEhfRklMVEVSU19NQUNfREVMX0ZBSUxfTk9GX1NUVDIsCisJRVRIX0ZJTFRFUlNfTUFDX0FERF9GQUlMX1pFUk9fTUFDLAorCUVUSF9GSUxURVJTX1ZMQU5fQUREX0ZBSUxfRlVMTCwKKwlFVEhfRklMVEVSU19WTEFOX0FERF9GQUlMX0RVUCwKKwlFVEhfRklMVEVSU19WTEFOX0RFTF9GQUlMX05PRiwKKwlFVEhfRklMVEVSU19WTEFOX0RFTF9GQUlMX05PRl9UVDEsCisJRVRIX0ZJTFRFUlNfUEFJUl9BRERfRkFJTF9EVVAsCisJRVRIX0ZJTFRFUlNfUEFJUl9BRERfRkFJTF9GVUxMLAorCUVUSF9GSUxURVJTX1BBSVJfQUREX0ZBSUxfRlVMTF9NQUMsCisJRVRIX0ZJTFRFUlNfUEFJUl9ERUxfRkFJTF9OT0YsCisJRVRIX0ZJTFRFUlNfUEFJUl9ERUxfRkFJTF9OT0ZfVFQxLAorCUVUSF9GSUxURVJTX1BBSVJfQUREX0ZBSUxfWkVST19NQUMsCisJRVRIX0ZJTFRFUlNfVk5JX0FERF9GQUlMX0ZVTEwsCisJRVRIX0ZJTFRFUlNfVk5JX0FERF9GQUlMX0RVUCwKKwlNQVhfRVRIX0VSUk9SX0NPREUKK307CisKIGVudW0gZXRoX2V2ZW50X29wY29kZSB7CiAJRVRIX0VWRU5UX1VOVVNFRCwKIAlFVEhfRVZFTlRfVlBPUlRfU1RBUlQsCkBAIC0zMjY5LDcgKzQ1NjEsMTMgQEAKIAlNQVhfRVRIX0ZJTFRFUl9UWVBFCiB9OwogCi0vKiBFdGhlcm5ldCBSYW1yb2QgQ29tbWFuZCBJRHMgKi8KK2VudW0gZXRoX2lwdjRfZnJhZ190eXBlIHsKKwlFVEhfSVBWNF9OT1RfRlJBRywKKwlFVEhfSVBWNF9GSVJTVF9GUkFHLAorCUVUSF9JUFY0X05PTl9GSVJTVF9GUkFHLAorCU1BWF9FVEhfSVBWNF9GUkFHX1RZUEUKK307CisKIGVudW0gZXRoX3JhbXJvZF9jbWRfaWQgewogCUVUSF9SQU1ST0RfVU5VU0VELAogCUVUSF9SQU1ST0RfVlBPUlRfU1RBUlQsCkBAIC0zNDUxLDggKzQ3NDksOCBAQAogCXU4IHRvZ2dsZV92YWw7CiAKIAl1OCB2Zl9yeF9wcm9kX2luZGV4OwotCi0JdTggcmVzZXJ2ZWRbNl07CisJdTggdmZfcnhfcHJvZF91c2Vfem9uZV9hOworCXU4IHJlc2VydmVkWzVdOwogCV9fbGUxNiByZXNlcnZlZDE7CiAJc3RydWN0IHJlZ3BhaXIgY3FlX3BibF9hZGRyOwogCXN0cnVjdCByZWdwYWlyIGJkX2Jhc2U7CkBAIC0zNTI2LDEwICs0ODI0LDExIEBACiAJX19sZTE2IHB4cF9zdF9pbmRleDsKIAlfX2xlMTYgY29tcF9hZ2dfc2l6ZTsKIAlfX2xlMTYgcXVldWVfem9uZV9pZDsKLQlfX2xlMTYgdGVzdF9kdXBfY291bnQ7CisJX19sZTE2IHJlc2VydmVkMjsKIAlfX2xlMTYgcGJsX3NpemU7CiAJX19sZTE2IHR4X3F1ZXVlX2lkOwotCisJX19sZTE2IHNhbWVfYXNfbGFzdF9pZDsKKwlfX2xlMTYgcmVzZXJ2ZWRbM107CiAJc3RydWN0IHJlZ3BhaXIgcGJsX2Jhc2VfYWRkcjsKIAlzdHJ1Y3QgcmVncGFpciBiZF9jb25zX2FkZHJlc3M7CiB9OwpAQCAtNDkyNiw4ICs2MjI1LDggQEAKICNkZWZpbmUgUk9DRV9DUkVBVEVfUVBfUkVTUF9SQU1ST0RfREFUQV9TUlFfRkxHX1NISUZUICAgICAgICAgICAgIDUKICNkZWZpbmUgUk9DRV9DUkVBVEVfUVBfUkVTUF9SQU1ST0RfREFUQV9FMkVfRkxPV19DT05UUk9MX0VOX01BU0sgIDB4MQogI2RlZmluZSBST0NFX0NSRUFURV9RUF9SRVNQX1JBTVJPRF9EQVRBX0UyRV9GTE9XX0NPTlRST0xfRU5fU0hJRlQgNgotI2RlZmluZSBST0NFX0NSRUFURV9RUF9SRVNQX1JBTVJPRF9EQVRBX1JFU0VSVkVEMF9NQVNLICAgICAgICAgICAgMHgxCi0jZGVmaW5lIFJPQ0VfQ1JFQVRFX1FQX1JFU1BfUkFNUk9EX0RBVEFfUkVTRVJWRUQwX1NISUZUICAgICAgICAgICA3CisjZGVmaW5lIFJPQ0VfQ1JFQVRFX1FQX1JFU1BfUkFNUk9EX0RBVEFfUkVTRVJWRURfS0VZX0VOX01BU0sJMHgxCisjZGVmaW5lIFJPQ0VfQ1JFQVRFX1FQX1JFU1BfUkFNUk9EX0RBVEFfUkVTRVJWRURfS0VZX0VOX1NISUZUCTcKICNkZWZpbmUgUk9DRV9DUkVBVEVfUVBfUkVTUF9SQU1ST0RfREFUQV9QUklfTUFTSyAgICAgICAgICAgICAgICAgIDB4NwogI2RlZmluZSBST0NFX0NSRUFURV9RUF9SRVNQX1JBTVJPRF9EQVRBX1BSSV9TSElGVCAgICAgICAgICAgICAgICAgOAogI2RlZmluZSBST0NFX0NSRUFURV9RUF9SRVNQX1JBTVJPRF9EQVRBX01JTl9STlJfTkFLX1RJTUVSX01BU0sgICAgMHgxRgpAQCAtNDk4OCw2ICs2Mjg3LDEwIEBACiAJTUFYX1JPQ0VfRVZFTlRfT1BDT0RFCiB9OwogCitzdHJ1Y3Qgcm9jZV9pbml0X2Z1bmNfcmFtcm9kX2RhdGEgeworCXN0cnVjdCByZG1hX2luaXRfZnVuY19yYW1yb2RfZGF0YSByZG1hOworfTsKKwogc3RydWN0IHJvY2VfbW9kaWZ5X3FwX3JlcV9yYW1yb2RfZGF0YSB7CiAJX19sZTE2IGZsYWdzOwogI2RlZmluZSBST0NFX01PRElGWV9RUF9SRVFfUkFNUk9EX0RBVEFfTU9WRV9UT19FUlJfRkxHX01BU0sgICAgICAweDEKQEAgLTY2MzksNiArNzk0MiwzNSBAQAogCV9fbGUzMiByZWcyOwogCV9fbGUzMiByZWczOwogfTsKKworI2RlZmluZSBNRldfVFJBQ0VfU0lHTkFUVVJFICAgICAweDI1MDcxOTQ2CisKKy8qIFRoZSB0cmFjZSBpbiB0aGUgYnVmZmVyICovCisjZGVmaW5lIE1GV19UUkFDRV9FVkVOVElEX01BU0sgICAgICAgICAgMHgwMGZmZmYKKyNkZWZpbmUgTUZXX1RSQUNFX1BSTV9TSVpFX01BU0sgICAgICAgICAweDBmMDAwMAorI2RlZmluZSBNRldfVFJBQ0VfUFJNX1NJWkVfU0hJRlQgICAgICAgIDE2CisjZGVmaW5lIE1GV19UUkFDRV9FTlRSWV9TSVpFICAgICAgICAgICAgMworCitzdHJ1Y3QgbWNwX3RyYWNlIHsKKwl1MzIgc2lnbmF0dXJlOwkJLyogSGVscCB0byBpZGVudGlmeSB0aGF0IHRoZSB0cmFjZSBpcyB2YWxpZCAqLworCXUzMiBzaXplOwkJLyogdGhlIHNpemUgb2YgdGhlIHRyYWNlIGJ1ZmZlciBpbiBieXRlcyAqLworCXUzMiBjdXJyX2xldmVsOwkJLyogMiAtIGFsbCB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlcgorCQkJCSAqIDEgLSBkZWJ1ZyB0cmFjZSB3aWxsIG5vdCBiZSB3cml0dGVuCisJCQkJICogMCAtIGp1c3QgZXJyb3JzIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgYnVmZmVyCisJCQkJICovCisJdTMyIG1vZHVsZXNfbWFza1syXTsJLyogYSBiaXQgcGVyIG1vZHVsZSwgMSBtZWFucyB3cml0ZSBpdCwgMCBtZWFucworCQkJCSAqIG1hc2sgaXQuCisJCQkJICovCisKKwkvKiBXYXJuaW5nOiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGFyZSBhc3N1bWVkIHRvIGJlIDMyYml0cyBhcyB0aGV5IGFyZQorCSAqIHVzZWQgb25seSBpbiB0aGUgTUZXLgorCSAqLworCXUzMiB0cmFjZV9wcm9kOyAvKiBUaGUgbmV4dCB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhpcyBvZmZzZXQgKi8KKwl1MzIgdHJhY2Vfb2xkZXN0OyAvKiBUaGUgb2xkZXN0IHZhbGlkIHRyYWNlIHN0YXJ0cyBhdCB0aGlzIG9mZnNldAorCQkJICAgKiAodXN1YWxseSB2ZXJ5IGNsb3NlIGFmdGVyIHRoZSBjdXJyZW50IHByb2R1Y2VyKS4KKwkJCSAgICovCit9OworCiAjZGVmaW5lIFZGX01BWF9TVEFUSUMgMTkyCiAKICNkZWZpbmUgTUNQX0dMT0JfUEFUSF9NQVgJMgpAQCAtNjY0Niw2ICs3OTc4LDcgQEAKICNkZWZpbmUgTUNQX0dMT0JfUE9SVF9NQVgJNAogI2RlZmluZSBNQ1BfR0xPQl9GVU5DX01BWAkxNgogCit0eXBlZGVmIHUzMiBvZmZzaXplX3Q7CQkvKiBJbiBEV09SRFMgISEhICovCiAvKiBPZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBNQ1Agc2NyYXRjaHBhZCAqLwogI2RlZmluZSBPRkZTSVpFX09GRlNFVF9TSElGVAkwCiAjZGVmaW5lIE9GRlNJWkVfT0ZGU0VUX01BU0sJMHgwMDAwZmZmZgpAQCAtNjg1MCw2ICs4MTgzLDE0IEBACiAjZGVmaW5lIERDQlhfQVBQX1NGX1NISUZUCQk4CiAjZGVmaW5lIERDQlhfQVBQX1NGX0VUSFRZUEUJCTAKICNkZWZpbmUgRENCWF9BUFBfU0ZfUE9SVAkJMQorI2RlZmluZSBEQ0JYX0FQUF9TRl9JRUVFX01BU0sJCTB4MDAwMGYwMDAKKyNkZWZpbmUgRENCWF9BUFBfU0ZfSUVFRV9TSElGVAkJMTIKKyNkZWZpbmUgRENCWF9BUFBfU0ZfSUVFRV9SRVNFUlZFRAkwCisjZGVmaW5lIERDQlhfQVBQX1NGX0lFRUVfRVRIVFlQRQkxCisjZGVmaW5lIERDQlhfQVBQX1NGX0lFRUVfVENQX1BPUlQJMgorI2RlZmluZSBEQ0JYX0FQUF9TRl9JRUVFX1VEUF9QT1JUCTMKKyNkZWZpbmUgRENCWF9BUFBfU0ZfSUVFRV9UQ1BfVURQX1BPUlQJNAorCiAjZGVmaW5lIERDQlhfQVBQX1BST1RPQ09MX0lEX01BU0sJMHhmZmZmMDAwMAogI2RlZmluZSBEQ0JYX0FQUF9QUk9UT0NPTF9JRF9TSElGVAkxNgogfTsKQEAgLTcyMjgsOCArODU2OSwxOSBAQAogI2RlZmluZSBEUlZfTVNHX0NPREVfTklHX0RSQUlOCQkJMHgzMDAwMDAwMAogI2RlZmluZSBEUlZfTVNHX0NPREVfVkZfRElTQUJMRURfRE9ORQkJMHhjMDAwMDAwMAogI2RlZmluZSBEUlZfTVNHX0NPREVfQ0ZHX1ZGX01TSVgJCTB4YzAwMTAwMDAKKyNkZWZpbmUgRFJWX01TR19DT0RFX05WTV9HRVRfRklMRV9BVFQJCTB4MDAwMzAwMDAKKyNkZWZpbmUgRFJWX01TR19DT0RFX05WTV9SRUFEX05WUkFNCQkweDAwMDUwMDAwCiAjZGVmaW5lIERSVl9NU0dfQ09ERV9NQ1BfUkVTRVQJCQkweDAwMDkwMDAwCiAjZGVmaW5lIERSVl9NU0dfQ09ERV9TRVRfVkVSU0lPTgkJMHgwMDBmMDAwMAorI2RlZmluZSBEUlZfTVNHX0NPREVfTUNQX0hBTFQgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorCisjZGVmaW5lIERSVl9NU0dfQ09ERV9HRVRfU1RBVFMgICAgICAgICAgICAgICAgICAweDAwMTMwMDAwCisjZGVmaW5lIERSVl9NU0dfQ09ERV9TVEFUU19UWVBFX0xBTiAgICAgICAgICAgICAxCisjZGVmaW5lIERSVl9NU0dfQ09ERV9TVEFUU19UWVBFX0ZDT0UgICAgICAgICAgICAyCisjZGVmaW5lIERSVl9NU0dfQ09ERV9TVEFUU19UWVBFX0lTQ1NJICAgICAgICAgICAzCisjZGVmaW5lIERSVl9NU0dfQ09ERV9TVEFUU19UWVBFX1JETUEgICAgICAgICAgICA0CisKKyNkZWZpbmUgRFJWX01TR19DT0RFX01BU0tfUEFSSVRJRVMgICAgICAgICAgICAgIDB4MDAxYTAwMDAKIAogI2RlZmluZSBEUlZfTVNHX0NPREVfQklTVF9URVNUCQkJMHgwMDFlMDAwMAogI2RlZmluZSBEUlZfTVNHX0NPREVfU0VUX0xFRF9NT0RFCQkweDAwMjAwMDAwCkBAIC03MjQwLDYgKzg1OTIsOSBAQAogI2RlZmluZSBEUlZfTUJfUEFSQU1fVU5MT0FEX1dPTF9NQ1AJCTB4MDAwMDAwMDEKICNkZWZpbmUgRFJWX01CX1BBUkFNX0RDQlhfTk9USUZZX01BU0sJCTB4MDAwMDAwRkYKICNkZWZpbmUgRFJWX01CX1BBUkFNX0RDQlhfTk9USUZZX1NISUZUCQkzCisKKyNkZWZpbmUgRFJWX01CX1BBUkFNX05WTV9MRU5fU0hJRlQJCTI0CisKICNkZWZpbmUgRFJWX01CX1BBUkFNX0NGR19WRl9NU0lYX1ZGX0lEX1NISUZUCTAKICNkZWZpbmUgRFJWX01CX1BBUkFNX0NGR19WRl9NU0lYX1ZGX0lEX01BU0sJMHgwMDAwMDBGRgogI2RlZmluZSBEUlZfTUJfUEFSQU1fQ0ZHX1ZGX01TSVhfU0JfTlVNX1NISUZUCTgKQEAgLTcyNzcsNiArODYzMiw4IEBACiAjZGVmaW5lIEZXX01TR19DT0RFX0RSVl9VTkxPQURfRlVOQ1RJT04JCTB4MjAxMzAwMDAKICNkZWZpbmUgRldfTVNHX0NPREVfRFJWX1VOTE9BRF9ET05FCQkweDIxMTAwMDAwCiAjZGVmaW5lIEZXX01TR19DT0RFX0RSVl9DRkdfVkZfTVNJWF9ET05FCTB4YjAwMTAwMDAKKworI2RlZmluZSBGV19NU0dfQ09ERV9OVk1fT0sJCQkweDAwMDEwMDAwCiAjZGVmaW5lIEZXX01TR19DT0RFX09LCQkJCTB4MDAxNjAwMDAKIAogI2RlZmluZSBGV19NU0dfU0VRX05VTUJFUl9NQVNLCQkJMHgwMDAwZmZmZgpAQCAtNzMwNywxMCArODY2NCwxMCBAQAogCU1GV19EUlZfTVNHX1JFU0VSVkVENCwKIAlNRldfRFJWX01TR19CV19VUERBVEUsCiAJTUZXX0RSVl9NU0dfQldfVVBEQVRFNSwKLQlNRldfRFJWX01TR19CV19VUERBVEU2LAotCU1GV19EUlZfTVNHX0JXX1VQREFURTcsCi0JTUZXX0RSVl9NU0dfQldfVVBEQVRFOCwKLQlNRldfRFJWX01TR19CV19VUERBVEU5LAorCU1GV19EUlZfTVNHX0dFVF9MQU5fU1RBVFMsCisJTUZXX0RSVl9NU0dfR0VUX0ZDT0VfU1RBVFMsCisJTUZXX0RSVl9NU0dfR0VUX0lTQ1NJX1NUQVRTLAorCU1GV19EUlZfTVNHX0dFVF9SRE1BX1NUQVRTLAogCU1GV19EUlZfTVNHX0JXX1VQREFURTEwLAogCU1GV19EUlZfTVNHX1RSQU5TQ0VJVkVSX1NUQVRFX0NIQU5HRSwKIAlNRldfRFJWX01TR19CV19VUERBVEUxMSwKQEAgLTc1MTMsNCArODg3MCwxMDEgQEAKIAlzdHJ1Y3QgbnZtX2NmZzFfcG9ydCBwb3J0W01DUF9HTE9CX1BPUlRfTUFYXTsKIAlzdHJ1Y3QgbnZtX2NmZzFfZnVuYyBmdW5jW01DUF9HTE9CX0ZVTkNfTUFYXTsKIH07CisKK2VudW0gc3BhZF9zZWN0aW9ucyB7CisJU1BBRF9TRUNUSU9OX1RSQUNFLAorCVNQQURfU0VDVElPTl9OVk1fQ0ZHLAorCVNQQURfU0VDVElPTl9QVUJMSUMsCisJU1BBRF9TRUNUSU9OX1BSSVZBVEUsCisJU1BBRF9TRUNUSU9OX01BWAorfTsKKworI2RlZmluZSBNQ1BfVFJBQ0VfU0laRSAgICAgICAgICAyMDQ4CS8qIDJrYiAqLworCisvKiBUaGlzIHNlY3Rpb24gaXMgbG9jYXRlZCBhdCBhIGZpeGVkIGxvY2F0aW9uIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgKiBzY3JhdGNocGFkLCB0byBlbnN1cmUgdGhhdCB0aGUgTUNQIHRyYWNlIGlzIG5vdCBydW4gb3ZlciBkdXJpbmcgTUZXIHVwZ3JhZGUuCisgKiBBbGwgdGhlIHJlc3Qgb2YgZGF0YSBoYXMgYSBmbG9hdGluZyBsb2NhdGlvbiB3aGljaCBkaWZmZXJzIGZyb20gdmVyc2lvbiB0bworICogdmVyc2lvbiwgYW5kIGlzIHBvaW50ZWQgYnkgdGhlIG1jcF9tZXRhX2RhdGEgYmVsb3cuCisgKiBNb3Jlb3ZlciwgdGhlIHNwYWRfbGF5b3V0IHNlY3Rpb24gaXMgcGFydCBvZiB0aGUgTUZXIGZpcm13YXJlLCBhbmQgaXMgbG9hZGVkCisgKiB3aXRoIGl0IGZyb20gbnZyYW0gaW4gb3JkZXIgdG8gY2xlYXIgdGhpcyBwb3J0aW9uLgorICovCitzdHJ1Y3Qgc3RhdGljX2luaXQgeworCXUzMiBudW1fc2VjdGlvbnM7CisJb2Zmc2l6ZV90IHNlY3Rpb25zW1NQQURfU0VDVElPTl9NQVhdOworI2RlZmluZSBTRUNUSU9OKF9zZWNfKSAoKigob2Zmc2l6ZV90ICopKFNUUlVDVF9PRkZTRVQoc2VjdGlvbnNbX3NlY19dKSkpKQorCisJc3RydWN0IG1jcF90cmFjZSB0cmFjZTsKKyNkZWZpbmUgTUNQX1RSQUNFX1AgKChzdHJ1Y3QgbWNwX3RyYWNlICopKFNUUlVDVF9PRkZTRVQodHJhY2UpKSkKKwl1OCB0cmFjZV9idWZmZXJbTUNQX1RSQUNFX1NJWkVdOworI2RlZmluZSBNQ1BfVFJBQ0VfQlVGICgodTggKikoU1RSVUNUX09GRlNFVCh0cmFjZV9idWZmZXIpKSkKKwkvKiBydW5uaW5nX21mdyBoYXMgdGhlIHNhbWUgZGVmaW5pdGlvbiBhcyBpbiBudm1fbWFwLmguCisJICogVGhpcyBiaXQgaW5kaWNhdGUgYm90aCB0aGUgcnVubmluZyBkaXIsIGFuZCB0aGUgcnVubmluZyBidW5kbGUuCisJICogSXQgaXMgc2V0IG9uY2Ugd2hlbiB0aGUgTElNIGlzIGxvYWRlZC4KKwkgKi8KKwl1MzIgcnVubmluZ19tZnc7CisjZGVmaW5lIFJVTk5JTkdfTUZXICgqKCh1MzIgKikoU1RSVUNUX09GRlNFVChydW5uaW5nX21mdykpKSkKKwl1MzIgYnVpbGRfdGltZTsKKyNkZWZpbmUgTUZXX0JVSUxEX1RJTUUgKCooKHUzMiAqKShTVFJVQ1RfT0ZGU0VUKGJ1aWxkX3RpbWUpKSkpCisJdTMyIHJlc2V0X3R5cGU7CisjZGVmaW5lIFJFU0VUX1RZUEUgKCooKHUzMiAqKShTVFJVQ1RfT0ZGU0VUKHJlc2V0X3R5cGUpKSkpCisJdTMyIG1md19zZWN1cmVfbW9kZTsKKyNkZWZpbmUgTUZXX1NFQ1VSRV9NT0RFICgqKCh1MzIgKikoU1RSVUNUX09GRlNFVChtZndfc2VjdXJlX21vZGUpKSkpCisJdTE2IHBtZV9zdGF0dXNfcGZfYml0bWFwOworI2RlZmluZSBQTUVfU1RBVFVTX1BGX0JJVE1BUCAoKigodTE2ICopKFNUUlVDVF9PRkZTRVQocG1lX3N0YXR1c19wZl9iaXRtYXApKSkpCisJdTE2IHBtZV9lbmFibGVfcGZfYml0bWFwOworI2RlZmluZSBQTUVfRU5BQkxFX1BGX0JJVE1BUCAoKigodTE2ICopKFNUUlVDVF9PRkZTRVQocG1lX2VuYWJsZV9wZl9iaXRtYXApKSkpCisJdTMyIG1pbV9udm1fYWRkcjsKKwl1MzIgbWltX3N0YXJ0X2FkZHI7CisJdTMyIGFoX3BjaWVfbGlua19wYXJhbXM7CisjZGVmaW5lIEFIX1BDSUVfTElOS19QQVJBTVNfTElOS19TUEVFRF9NQVNLICAgICAoMHgwMDAwMDBmZikKKyNkZWZpbmUgQUhfUENJRV9MSU5LX1BBUkFNU19MSU5LX1NQRUVEX1NISUZUICAgICgwKQorI2RlZmluZSBBSF9QQ0lFX0xJTktfUEFSQU1TX0xJTktfV0lEVEhfTUFTSyAgICAgKDB4MDAwMGZmMDApCisjZGVmaW5lIEFIX1BDSUVfTElOS19QQVJBTVNfTElOS19XSURUSF9TSElGVCAgICAoOCkKKyNkZWZpbmUgQUhfUENJRV9MSU5LX1BBUkFNU19BU1BNX01PREVfTUFTSyAgICAgICgweDAwZmYwMDAwKQorI2RlZmluZSBBSF9QQ0lFX0xJTktfUEFSQU1TX0FTUE1fTU9ERV9TSElGVCAgICAgKDE2KQorI2RlZmluZSBBSF9QQ0lFX0xJTktfUEFSQU1TX0FTUE1fQ0FQX01BU0sgICAgICAgKDB4ZmYwMDAwMDApCisjZGVmaW5lIEFIX1BDSUVfTElOS19QQVJBTVNfQVNQTV9DQVBfU0hJRlQgICAgICAoMjQpCisjZGVmaW5lIEFIX1BDSUVfTElOS19QQVJBTVMgKCooKHUzMiAqKShTVFJVQ1RfT0ZGU0VUKGFoX3BjaWVfbGlua19wYXJhbXMpKSkpCisKKwl1MzIgcnNydl9wZXJzaXN0WzVdOwkvKiBQZXJzaXN0IHJlc2VydmVkIGZvciBNRlcgdXBncmFkZXMgKi8KK307CisKK2VudW0gbnZtX2ltYWdlX3R5cGUgeworCU5WTV9UWVBFX1RJTTEgPSAweDAxLAorCU5WTV9UWVBFX1RJTTIgPSAweDAyLAorCU5WTV9UWVBFX01JTTEgPSAweDAzLAorCU5WTV9UWVBFX01JTTIgPSAweDA0LAorCU5WTV9UWVBFX01CQSA9IDB4MDUsCisJTlZNX1RZUEVfTU9EVUxFU19QTiA9IDB4MDYsCisJTlZNX1RZUEVfVlBEID0gMHgwNywKKwlOVk1fVFlQRV9NRldfVFJBQ0UxID0gMHgwOCwKKwlOVk1fVFlQRV9NRldfVFJBQ0UyID0gMHgwOSwKKwlOVk1fVFlQRV9OVk1fQ0ZHMSA9IDB4MGEsCisJTlZNX1RZUEVfTDJCID0gMHgwYiwKKwlOVk1fVFlQRV9ESVIxID0gMHgwYywKKwlOVk1fVFlQRV9FQUdMRV9GVzEgPSAweDBkLAorCU5WTV9UWVBFX0ZBTENPTl9GVzEgPSAweDBlLAorCU5WTV9UWVBFX1BDSUVfRlcxID0gMHgwZiwKKwlOVk1fVFlQRV9IV19TRVQgPSAweDEwLAorCU5WTV9UWVBFX0xJTSA9IDB4MTEsCisJTlZNX1RZUEVfQVZTX0ZXMSA9IDB4MTIsCisJTlZNX1RZUEVfRElSMiA9IDB4MTMsCisJTlZNX1RZUEVfQ0NNID0gMHgxNCwKKwlOVk1fVFlQRV9FQUdMRV9GVzIgPSAweDE1LAorCU5WTV9UWVBFX0ZBTENPTl9GVzIgPSAweDE2LAorCU5WTV9UWVBFX1BDSUVfRlcyID0gMHgxNywKKwlOVk1fVFlQRV9BVlNfRlcyID0gMHgxOCwKKwlOVk1fVFlQRV9JTklUX0hXID0gMHgxOSwKKwlOVk1fVFlQRV9ERUZBVUxUX0NGRyA9IDB4MWEsCisJTlZNX1RZUEVfTURVTVAgPSAweDFiLAorCU5WTV9UWVBFX01FVEEgPSAweDFjLAorCU5WTV9UWVBFX0lTQ1NJX0NGRyA9IDB4MWQsCisJTlZNX1RZUEVfRkNPRV9DRkcgPSAweDFmLAorCU5WTV9UWVBFX0VUSF9QSFlfRlcxID0gMHgyMCwKKwlOVk1fVFlQRV9FVEhfUEhZX0ZXMiA9IDB4MjEsCisJTlZNX1RZUEVfTUFYLAorfTsKKworI2RlZmluZSBESVJfSURfMSAgICAoMCkKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9ody5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaHcuYwppbmRleCBlMTc4ODUzLi42ZTRmYWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9ody5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2h3LmMKQEAgLTQ0LDggKzQ0LDcgQEAKIAogaW50IHFlZF9wdHRfcG9vbF9hbGxvYyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbikKIHsKLQlzdHJ1Y3QgcWVkX3B0dF9wb29sICpwX3Bvb2wgPSBrbWFsbG9jKHNpemVvZigqcF9wb29sKSwKLQkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHFlZF9wdHRfcG9vbCAqcF9wb29sID0ga21hbGxvYyhzaXplb2YoKnBfcG9vbCksIEdGUF9LRVJORUwpOwogCWludCBpOwogCiAJaWYgKCFwX3Bvb2wpCkBAIC0xMTMsMTYgKzExMiwxNCBAQAogCXJldHVybiBOVUxMOwogfQogCi12b2lkIHFlZF9wdHRfcmVsZWFzZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCit2b2lkIHFlZF9wdHRfcmVsZWFzZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCXNwaW5fbG9ja19iaCgmcF9od2ZuLT5wX3B0dF9wb29sLT5sb2NrKTsKIAlsaXN0X2FkZCgmcF9wdHQtPmxpc3RfZW50cnksICZwX2h3Zm4tPnBfcHR0X3Bvb2wtPmZyZWVfbGlzdCk7CiAJc3Bpbl91bmxvY2tfYmgoJnBfaHdmbi0+cF9wdHRfcG9vbC0+bG9jayk7CiB9CiAKLXUzMiBxZWRfcHR0X2dldF9od19hZGRyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJc3RydWN0IHFlZF9wdHQgKnBfcHR0KQordTMyIHFlZF9wdHRfZ2V0X2h3X2FkZHIoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKIHsKIAkvKiBUaGUgSFcgaXMgdXNpbmcgRFdPUkRTIGFuZCB3ZSBuZWVkIHRvIHRyYW5zbGF0ZSBpdCB0byBCeXRlcyAqLwogCXJldHVybiBsZTMyX3RvX2NwdShwX3B0dC0+cHhwLm9mZnNldCkgPDwgMjsKQEAgLTE0MSw4ICsxMzgsNyBAQAogfQogCiB2b2lkIHFlZF9wdHRfc2V0X3dpbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCi0JCSAgICAgdTMyIG5ld19od19hZGRyKQorCQkgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTMyIG5ld19od19hZGRyKQogewogCXUzMiBwcmV2X2h3X2FkZHI7CiAKQEAgLTE2Niw4ICsxNjIsNyBAQAogfQogCiBzdGF0aWMgdTMyIHFlZF9zZXRfcHR0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkgICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkgICAgICAgdTMyIGh3X2FkZHIpCisJCSAgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiBod19hZGRyKQogewogCXUzMiB3aW5faHdfYWRkciA9IHFlZF9wdHRfZ2V0X2h3X2FkZHIocF9od2ZuLCBwX3B0dCk7CiAJdTMyIG9mZnNldDsKQEAgLTIyNCwxMCArMjE5LDcgQEAKIAogc3RhdGljIHZvaWQgcWVkX21lbWNweV9odyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkJICB2b2lkICphZGRyLAotCQkJICB1MzIgaHdfYWRkciwKLQkJCSAgc2l6ZV90IG4sCi0JCQkgIGJvb2wgdG9fZGV2aWNlKQorCQkJICB2b2lkICphZGRyLCB1MzIgaHdfYWRkciwgc2l6ZV90IG4sIGJvb2wgdG9fZGV2aWNlKQogewogCXUzMiBkd19jb3VudCwgKmhvc3RfYWRkciwgaHdfb2Zmc2V0OwogCXNpemVfdCBxdW90YSwgZG9uZSA9IDA7CkBAIC0yNTksOCArMjUxLDcgQEAKIH0KIAogdm9pZCBxZWRfbWVtY3B5X2Zyb20oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkgICAgIHZvaWQgKmRlc3QsIHUzMiBod19hZGRyLCBzaXplX3QgbikKKwkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHZvaWQgKmRlc3QsIHUzMiBod19hZGRyLCBzaXplX3QgbikKIHsKIAlEUF9WRVJCT1NFKHBfaHdmbiwgTkVUSUZfTVNHX0hXLAogCQkgICAiaHdfYWRkciAweCV4LCBkZXN0ICVwIGh3X2FkZHIgMHgleCwgc2l6ZSAlbHVcbiIsCkBAIC0yNzAsOCArMjYxLDcgQEAKIH0KIAogdm9pZCBxZWRfbWVtY3B5X3RvKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCi0JCSAgIHUzMiBod19hZGRyLCB2b2lkICpzcmMsIHNpemVfdCBuKQorCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiBod19hZGRyLCB2b2lkICpzcmMsIHNpemVfdCBuKQogewogCURQX1ZFUkJPU0UocF9od2ZuLCBORVRJRl9NU0dfSFcsCiAJCSAgICJod19hZGRyIDB4JXgsIGh3X2FkZHIgMHgleCwgc3JjICVwIHNpemUgJWx1XG4iLApAQCAtMjgwLDkgKzI3MCw3IEBACiAJcWVkX21lbWNweV9odyhwX2h3Zm4sIHBfcHR0LCBzcmMsIGh3X2FkZHIsIG4sIHRydWUpOwogfQogCi12b2lkIHFlZF9maWRfcHJldGVuZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCi0JCSAgICAgdTE2IGZpZCkKK3ZvaWQgcWVkX2ZpZF9wcmV0ZW5kKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUxNiBmaWQpCiB7CiAJdTE2IGNvbnRyb2wgPSAwOwogCkBAIC0zMDksOCArMjk3LDcgQEAKIH0KIAogdm9pZCBxZWRfcG9ydF9wcmV0ZW5kKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCi0JCSAgICAgIHU4IHBvcnRfaWQpCisJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTggcG9ydF9pZCkKIHsKIAl1MTYgY29udHJvbCA9IDA7CiAKQEAgLTMyNiw4ICszMTMsNyBAQAogCSAgICAgICAqKHUzMiAqKSZwX3B0dC0+cHhwLnByZXRlbmQpOwogfQogCi12b2lkIHFlZF9wb3J0X3VucHJldGVuZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCXN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3ZvaWQgcWVkX3BvcnRfdW5wcmV0ZW5kKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCiB7CiAJdTE2IGNvbnRyb2wgPSAwOwogCkBAIC00MjksMjggKzQxNSwyNyBAQAogCXJldHVybiBETUFFX1JFR19HT19DMCArIChpZHggPDwgMik7CiB9CiAKLXN0YXRpYyBpbnQKLXFlZF9kbWFlX3Bvc3RfY29tbWFuZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQorc3RhdGljIGludCBxZWRfZG1hZV9wb3N0X2NvbW1hbmQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKIHsKLQlzdHJ1Y3QgZG1hZV9jbWQgKmNvbW1hbmQgPSBwX2h3Zm4tPmRtYWVfaW5mby5wX2RtYWVfY21kOworCXN0cnVjdCBkbWFlX2NtZCAqcF9jb21tYW5kID0gcF9od2ZuLT5kbWFlX2luZm8ucF9kbWFlX2NtZDsKIAl1OCBpZHhfY21kID0gcF9od2ZuLT5kbWFlX2luZm8uY2hhbm5lbCwgaTsKIAlpbnQgcWVkX3N0YXR1cyA9IDA7CiAKIAkvKiB2ZXJpZnkgYWRkcmVzcyBpcyBub3QgTlVMTCAqLwotCWlmICgoKChjb21tYW5kLT5kc3RfYWRkcl9sbyA9PSAwKSAmJiAoY29tbWFuZC0+ZHN0X2FkZHJfaGkgPT0gMCkpIHx8Ci0JICAgICAoKGNvbW1hbmQtPnNyY19hZGRyX2xvID09IDApICYmIChjb21tYW5kLT5zcmNfYWRkcl9oaSA9PSAwKSkpKSB7CisJaWYgKCgoKCFwX2NvbW1hbmQtPmRzdF9hZGRyX2xvKSAmJiAoIXBfY29tbWFuZC0+ZHN0X2FkZHJfaGkpKSB8fAorCSAgICAgKCghcF9jb21tYW5kLT5zcmNfYWRkcl9sbykgJiYgKCFwX2NvbW1hbmQtPnNyY19hZGRyX2hpKSkpKSB7CiAJCURQX05PVElDRShwX2h3Zm4sCiAJCQkgICJzb3VyY2Ugb3IgZGVzdGluYXRpb24gYWRkcmVzcyAwIGlkeF9jbWQ9JWRcbiIKIAkJCSAgIm9wY29kZSA9IFsweCUwOHgsMHglMDR4XSBsZW49MHgleCBzcmM9MHgleDoleCBkc3Q9MHgleDoleFxuIiwKLQkJCSAgIGlkeF9jbWQsCi0JCQkgICBsZTMyX3RvX2NwdShjb21tYW5kLT5vcGNvZGUpLAotCQkJICAgbGUxNl90b19jcHUoY29tbWFuZC0+b3Bjb2RlX2IpLAotCQkJICAgbGUxNl90b19jcHUoY29tbWFuZC0+bGVuZ3RoX2R3KSwKLQkJCSAgIGxlMzJfdG9fY3B1KGNvbW1hbmQtPnNyY19hZGRyX2hpKSwKLQkJCSAgIGxlMzJfdG9fY3B1KGNvbW1hbmQtPnNyY19hZGRyX2xvKSwKLQkJCSAgIGxlMzJfdG9fY3B1KGNvbW1hbmQtPmRzdF9hZGRyX2hpKSwKLQkJCSAgIGxlMzJfdG9fY3B1KGNvbW1hbmQtPmRzdF9hZGRyX2xvKSk7CisJCQkgIGlkeF9jbWQsCisJCQkgIGxlMzJfdG9fY3B1KHBfY29tbWFuZC0+b3Bjb2RlKSwKKwkJCSAgbGUxNl90b19jcHUocF9jb21tYW5kLT5vcGNvZGVfYiksCisJCQkgIGxlMTZfdG9fY3B1KHBfY29tbWFuZC0+bGVuZ3RoX2R3KSwKKwkJCSAgbGUzMl90b19jcHUocF9jb21tYW5kLT5zcmNfYWRkcl9oaSksCisJCQkgIGxlMzJfdG9fY3B1KHBfY29tbWFuZC0+c3JjX2FkZHJfbG8pLAorCQkJICBsZTMyX3RvX2NwdShwX2NvbW1hbmQtPmRzdF9hZGRyX2hpKSwKKwkJCSAgbGUzMl90b19jcHUocF9jb21tYW5kLT5kc3RfYWRkcl9sbykpOwogCiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTQ1OSwxMyArNDQ0LDEzIEBACiAJCSAgIE5FVElGX01TR19IVywKIAkJICAgIlBvc3RpbmcgRE1BRSBjb21tYW5kIFtpZHggJWRdOiBvcGNvZGUgPSBbMHglMDh4LDB4JTA0eF0gbGVuPTB4JXggc3JjPTB4JXg6JXggZHN0PTB4JXg6JXhcbiIsCiAJCSAgIGlkeF9jbWQsCi0JCSAgIGxlMzJfdG9fY3B1KGNvbW1hbmQtPm9wY29kZSksCi0JCSAgIGxlMTZfdG9fY3B1KGNvbW1hbmQtPm9wY29kZV9iKSwKLQkJICAgbGUxNl90b19jcHUoY29tbWFuZC0+bGVuZ3RoX2R3KSwKLQkJICAgbGUzMl90b19jcHUoY29tbWFuZC0+c3JjX2FkZHJfaGkpLAotCQkgICBsZTMyX3RvX2NwdShjb21tYW5kLT5zcmNfYWRkcl9sbyksCi0JCSAgIGxlMzJfdG9fY3B1KGNvbW1hbmQtPmRzdF9hZGRyX2hpKSwKLQkJICAgbGUzMl90b19jcHUoY29tbWFuZC0+ZHN0X2FkZHJfbG8pKTsKKwkJICAgbGUzMl90b19jcHUocF9jb21tYW5kLT5vcGNvZGUpLAorCQkgICBsZTE2X3RvX2NwdShwX2NvbW1hbmQtPm9wY29kZV9iKSwKKwkJICAgbGUxNl90b19jcHUocF9jb21tYW5kLT5sZW5ndGhfZHcpLAorCQkgICBsZTMyX3RvX2NwdShwX2NvbW1hbmQtPnNyY19hZGRyX2hpKSwKKwkJICAgbGUzMl90b19jcHUocF9jb21tYW5kLT5zcmNfYWRkcl9sbyksCisJCSAgIGxlMzJfdG9fY3B1KHBfY29tbWFuZC0+ZHN0X2FkZHJfaGkpLAorCQkgICBsZTMyX3RvX2NwdShwX2NvbW1hbmQtPmRzdF9hZGRyX2xvKSk7CiAKIAkvKiBDb3B5IHRoZSBjb21tYW5kIHRvIERNQUUgLSBuZWVkIHRvIGRvIGl0IGJlZm9yZSBldmVyeSBjYWxsCiAJICogZm9yIHNvdXJjZS9kZXN0IGFkZHJlc3Mgbm8gcmVzZXQuCkBAIC00NzUsNyArNDYwLDcgQEAKIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgRE1BRV9DTURfU0laRTsgaSsrKSB7CiAJCXUzMiBkYXRhID0gKGkgPCBETUFFX0NNRF9TSVpFX1RPX0ZJTEwpID8KLQkJCSAgICooKCh1MzIgKiljb21tYW5kKSArIGkpIDogMDsKKwkJCSAgICooKCh1MzIgKilwX2NvbW1hbmQpICsgaSkgOiAwOwogCiAJCXFlZF93cihwX2h3Zm4sIHBfcHR0LAogCQkgICAgICAgRE1BRV9SRUdfQ01EX01FTSArCkBAIC00ODMsOSArNDY4LDcgQEAKIAkJICAgICAgIChpICogc2l6ZW9mKHUzMikpLCBkYXRhKTsKIAl9CiAKLQlxZWRfd3IocF9od2ZuLCBwX3B0dCwKLQkgICAgICAgcWVkX2RtYWVfaWR4X3RvX2dvX2NtZChpZHhfY21kKSwKLQkgICAgICAgRE1BRV9HT19WQUxVRSk7CisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIHFlZF9kbWFlX2lkeF90b19nb19jbWQoaWR4X2NtZCksIERNQUVfR09fVkFMVUUpOwogCiAJcmV0dXJuIHFlZF9zdGF0dXM7CiB9CkBAIC00OTgsMzEgKzQ4MSwyMyBAQAogCXUzMiAqKnBfY29tcCA9ICZwX2h3Zm4tPmRtYWVfaW5mby5wX2NvbXBsZXRpb25fd29yZDsKIAogCSpwX2NvbXAgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAotCQkJCSAgICAgc2l6ZW9mKHUzMiksCi0JCQkJICAgICBwX2FkZHIsCi0JCQkJICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoISpwX2NvbXApIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBgcF9jb21wbGV0aW9uX3dvcmQnXG4iKTsKKwkJCQkgICAgIHNpemVvZih1MzIpLCBwX2FkZHIsIEdGUF9LRVJORUwpOworCWlmICghKnBfY29tcCkKIAkJZ290byBlcnI7Ci0JfQogCiAJcF9hZGRyID0gJnBfaHdmbi0+ZG1hZV9pbmZvLmRtYWVfY21kX3BoeXNfYWRkcjsKIAkqcF9jbWQgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAogCQkJCSAgICBzaXplb2Yoc3RydWN0IGRtYWVfY21kKSwKIAkJCQkgICAgcF9hZGRyLCBHRlBfS0VSTkVMKTsKLQlpZiAoISpwX2NtZCkgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGBzdHJ1Y3QgZG1hZV9jbWQnXG4iKTsKKwlpZiAoISpwX2NtZCkKIAkJZ290byBlcnI7Ci0JfQogCiAJcF9hZGRyID0gJnBfaHdmbi0+ZG1hZV9pbmZvLmludGVybWVkaWF0ZV9idWZmZXJfcGh5c19hZGRyOwogCSpwX2J1ZmYgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAogCQkJCSAgICAgc2l6ZW9mKHUzMikgKiBETUFFX01BWF9SV19TSVpFLAogCQkJCSAgICAgcF9hZGRyLCBHRlBfS0VSTkVMKTsKLQlpZiAoISpwX2J1ZmYpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBgaW50ZXJtZWRpYXRlX2J1ZmZlcidcbiIpOworCWlmICghKnBfYnVmZikKIAkJZ290byBlcnI7Ci0JfQogCiAJcF9od2ZuLT5kbWFlX2luZm8uY2hhbm5lbCA9IHBfaHdmbi0+cmVsX3BmX2lkOwogCkBAIC01NDMsOCArNTE4LDcgQEAKIAkJcF9waHlzID0gcF9od2ZuLT5kbWFlX2luZm8uY29tcGxldGlvbl93b3JkX3BoeXNfYWRkcjsKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAogCQkJCSAgc2l6ZW9mKHUzMiksCi0JCQkJICBwX2h3Zm4tPmRtYWVfaW5mby5wX2NvbXBsZXRpb25fd29yZCwKLQkJCQkgIHBfcGh5cyk7CisJCQkJICBwX2h3Zm4tPmRtYWVfaW5mby5wX2NvbXBsZXRpb25fd29yZCwgcF9waHlzKTsKIAkJcF9od2ZuLT5kbWFlX2luZm8ucF9jb21wbGV0aW9uX3dvcmQgPSBOVUxMOwogCX0KIApAQCAtNTUyLDggKzUyNiw3IEBACiAJCXBfcGh5cyA9IHBfaHdmbi0+ZG1hZV9pbmZvLmRtYWVfY21kX3BoeXNfYWRkcjsKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAogCQkJCSAgc2l6ZW9mKHN0cnVjdCBkbWFlX2NtZCksCi0JCQkJICBwX2h3Zm4tPmRtYWVfaW5mby5wX2RtYWVfY21kLAotCQkJCSAgcF9waHlzKTsKKwkJCQkgIHBfaHdmbi0+ZG1hZV9pbmZvLnBfZG1hZV9jbWQsIHBfcGh5cyk7CiAJCXBfaHdmbi0+ZG1hZV9pbmZvLnBfZG1hZV9jbWQgPSBOVUxMOwogCX0KIApAQCAtNTcxLDkgKzU0NCw3IEBACiAKIHN0YXRpYyBpbnQgcWVkX2RtYWVfb3BlcmF0aW9uX3dhaXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4pCiB7Ci0JdTMyIHdhaXRfY250ID0gMDsKLQl1MzIgd2FpdF9jbnRfbGltaXQgPSAxMDAwMDsKLQorCXUzMiB3YWl0X2NudF9saW1pdCA9IDEwMDAwLCB3YWl0X2NudCA9IDA7CiAJaW50IHFlZF9zdGF0dXMgPSAwOwogCiAJYmFycmllcigpOwpAQCAtNjA2LDcgKzU3Nyw3IEBACiAJCQkJCSAgdTY0IGRzdF9hZGRyLAogCQkJCQkgIHU4IHNyY190eXBlLAogCQkJCQkgIHU4IGRzdF90eXBlLAotCQkJCQkgIHUzMiBsZW5ndGgpCisJCQkJCSAgdTMyIGxlbmd0aF9kdykKIHsKIAlkbWFfYWRkcl90IHBoeXMgPSBwX2h3Zm4tPmRtYWVfaW5mby5pbnRlcm1lZGlhdGVfYnVmZmVyX3BoeXNfYWRkcjsKIAlzdHJ1Y3QgZG1hZV9jbWQgKmNtZCA9IHBfaHdmbi0+ZG1hZV9pbmZvLnBfZG1hZV9jbWQ7CkBAIC02MjQsNyArNTk1LDcgQEAKIAkJY21kLT5zcmNfYWRkcl9sbyA9IGNwdV90b19sZTMyKGxvd2VyXzMyX2JpdHMocGh5cykpOwogCQltZW1jcHkoJnBfaHdmbi0+ZG1hZV9pbmZvLnBfaW50ZXJtZWRpYXRlX2J1ZmZlclswXSwKIAkJICAgICAgICh2b2lkICopKHVpbnRwdHJfdClzcmNfYWRkciwKLQkJICAgICAgIGxlbmd0aCAqIHNpemVvZih1MzIpKTsKKwkJICAgICAgIGxlbmd0aF9kdyAqIHNpemVvZih1MzIpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02NDUsNyArNjE2LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JY21kLT5sZW5ndGhfZHcgPSBjcHVfdG9fbGUxNigodTE2KWxlbmd0aCk7CisJY21kLT5sZW5ndGhfZHcgPSBjcHVfdG9fbGUxNigodTE2KWxlbmd0aF9kdyk7CiAKIAlxZWRfZG1hZV9wb3N0X2NvbW1hbmQocF9od2ZuLCBwX3B0dCk7CiAKQEAgLTY1NCwxNiArNjI1LDE0IEBACiAJaWYgKHFlZF9zdGF0dXMpIHsKIAkJRFBfTk9USUNFKHBfaHdmbiwKIAkJCSAgInFlZF9kbWFlX2hvc3QyZ3JjOiBXYWl0IEZhaWxlZC4gc291cmNlX2FkZHIgMHglbGx4LCBncmNfYWRkciAweCVsbHgsIHNpemVfaW5fZHdvcmRzIDB4JXhcbiIsCi0JCQkgIHNyY19hZGRyLAotCQkJICBkc3RfYWRkciwKLQkJCSAgbGVuZ3RoKTsKKwkJCSAgc3JjX2FkZHIsIGRzdF9hZGRyLCBsZW5ndGhfZHcpOwogCQlyZXR1cm4gcWVkX3N0YXR1czsKIAl9CiAKIAlpZiAoZHN0X3R5cGUgPT0gUUVEX0RNQUVfQUREUkVTU19IT1NUX1ZJUlQpCiAJCW1lbWNweSgodm9pZCAqKSh1aW50cHRyX3QpKGRzdF9hZGRyKSwKIAkJICAgICAgICZwX2h3Zm4tPmRtYWVfaW5mby5wX2ludGVybWVkaWF0ZV9idWZmZXJbMF0sCi0JCSAgICAgICBsZW5ndGggKiBzaXplb2YodTMyKSk7CisJCSAgICAgICBsZW5ndGhfZHcgKiBzaXplb2YodTMyKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTczMCwxMCArNjk5LDcgQEAKIAkJaWYgKHFlZF9zdGF0dXMpIHsKIAkJCURQX05PVElDRShwX2h3Zm4sCiAJCQkJICAicWVkX2RtYWVfZXhlY3V0ZV9zdWJfb3BlcmF0aW9uIEZhaWxlZCB3aXRoIGVycm9yIDB4JXguIHNvdXJjZV9hZGRyIDB4JWxseCwgZGVzdGluYXRpb24gYWRkciAweCVsbHgsIHNpemVfaW5fZHdvcmRzIDB4JXhcbiIsCi0JCQkJICBxZWRfc3RhdHVzLAotCQkJCSAgc3JjX2FkZHIsCi0JCQkJICBkc3RfYWRkciwKLQkJCQkgIGxlbmd0aF9jdXIpOworCQkJCSAgcWVkX3N0YXR1cywgc3JjX2FkZHIsIGRzdF9hZGRyLCBsZW5ndGhfY3VyKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNzQzLDEwICs3MDksNyBAQAogCiBpbnQgcWVkX2RtYWVfaG9zdDJncmMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJICAgICAgdTY0IHNvdXJjZV9hZGRyLAotCQkgICAgICB1MzIgZ3JjX2FkZHIsCi0JCSAgICAgIHUzMiBzaXplX2luX2R3b3JkcywKLQkJICAgICAgdTMyIGZsYWdzKQorCQkgIHU2NCBzb3VyY2VfYWRkciwgdTMyIGdyY19hZGRyLCB1MzIgc2l6ZV9pbl9kd29yZHMsIHUzMiBmbGFncykKIHsKIAl1MzIgZ3JjX2FkZHJfaW5fZHcgPSBncmNfYWRkciAvIHNpemVvZih1MzIpOwogCXN0cnVjdCBxZWRfZG1hZV9wYXJhbXMgcGFyYW1zOwpAQCAtNzY4LDkgKzczMSwxMCBAQAogCXJldHVybiByYzsKIH0KIAotaW50Ci1xZWRfZG1hZV9ncmMyaG9zdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgZ3JjX2FkZHIsCi0JCSAgZG1hX2FkZHJfdCBkZXN0X2FkZHIsIHUzMiBzaXplX2luX2R3b3JkcywgdTMyIGZsYWdzKQoraW50IHFlZF9kbWFlX2dyYzJob3N0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCSAgICAgIHUzMiBncmNfYWRkciwKKwkJICAgICAgZG1hX2FkZHJfdCBkZXN0X2FkZHIsIHUzMiBzaXplX2luX2R3b3JkcywgdTMyIGZsYWdzKQogewogCXUzMiBncmNfYWRkcl9pbl9kdyA9IGdyY19hZGRyIC8gc2l6ZW9mKHUzMik7CiAJc3RydWN0IHFlZF9kbWFlX3BhcmFtcyBwYXJhbXM7CkBAIC03OTEsMTIgKzc1NSwxMSBAQAogCXJldHVybiByYzsKIH0KIAotaW50Ci1xZWRfZG1hZV9ob3N0Mmhvc3Qoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJICAgZG1hX2FkZHJfdCBzb3VyY2VfYWRkciwKLQkJICAgZG1hX2FkZHJfdCBkZXN0X2FkZHIsCi0JCSAgIHUzMiBzaXplX2luX2R3b3Jkcywgc3RydWN0IHFlZF9kbWFlX3BhcmFtcyAqcF9wYXJhbXMpCitpbnQgcWVkX2RtYWVfaG9zdDJob3N0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkgICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkgICAgICAgZG1hX2FkZHJfdCBzb3VyY2VfYWRkciwKKwkJICAgICAgIGRtYV9hZGRyX3QgZGVzdF9hZGRyLAorCQkgICAgICAgdTMyIHNpemVfaW5fZHdvcmRzLCBzdHJ1Y3QgcWVkX2RtYWVfcGFyYW1zICpwX3BhcmFtcykKIHsKIAlpbnQgcmM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2luaXRfb3BzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9pbml0X29wcy5jCmluZGV4IDk4NjZhMjAuLmQ1NjdiYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2luaXRfb3BzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaW5pdF9vcHMuYwpAQCAtNTksMTcgKzU5LDE0IEBACiAJCXBfaHdmbi0+cnRfZGF0YS5iX3ZhbGlkW2ldID0gZmFsc2U7CiB9CiAKLXZvaWQgcWVkX2luaXRfc3RvcmVfcnRfcmVnKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICAgdTMyIHJ0X29mZnNldCwKLQkJCSAgIHUzMiB2YWwpCit2b2lkIHFlZF9pbml0X3N0b3JlX3J0X3JlZyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTMyIHJ0X29mZnNldCwgdTMyIHZhbCkKIHsKIAlwX2h3Zm4tPnJ0X2RhdGEuaW5pdF92YWxbcnRfb2Zmc2V0XSA9IHZhbDsKIAlwX2h3Zm4tPnJ0X2RhdGEuYl92YWxpZFtydF9vZmZzZXRdID0gdHJ1ZTsKIH0KIAogdm9pZCBxZWRfaW5pdF9zdG9yZV9ydF9hZ2coc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgICB1MzIgcnRfb2Zmc2V0LCB1MzIgKnBfdmFsLAotCQkJICAgc2l6ZV90IHNpemUpCisJCQkgICB1MzIgcnRfb2Zmc2V0LCB1MzIgKnBfdmFsLCBzaXplX3Qgc2l6ZSkKIHsKIAlzaXplX3QgaTsKIApAQCAtODEsMTAgKzc4LDcgQEAKIAogc3RhdGljIGludCBxZWRfaW5pdF9ydChzdHJ1Y3QgcWVkX2h3Zm4JKnBfaHdmbiwKIAkJICAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJICAgICAgIHUzMiBhZGRyLAotCQkgICAgICAgdTE2IHJ0X29mZnNldCwKLQkJICAgICAgIHUxNiBzaXplLAotCQkgICAgICAgYm9vbCBiX211c3RfZG1hZSkKKwkJICAgICAgIHUzMiBhZGRyLCB1MTYgcnRfb2Zmc2V0LCB1MTYgc2l6ZSwgYm9vbCBiX211c3RfZG1hZSkKIHsKIAl1MzIgKnBfaW5pdF92YWwgPSAmcF9od2ZuLT5ydF9kYXRhLmluaXRfdmFsW3J0X29mZnNldF07CiAJYm9vbCAqcF92YWxpZCA9ICZwX2h3Zm4tPnJ0X2RhdGEuYl92YWxpZFtydF9vZmZzZXRdOwpAQCAtMTAyLDggKzk2LDcgQEAKIAkJICogc2ltcGx5IHdyaXRlIHRoZSBkYXRhIGluc3RlYWQgb2YgdXNpbmcgZG1hZS4KIAkJICovCiAJCWlmICghYl9tdXN0X2RtYWUpIHsKLQkJCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBhZGRyICsgKGkgPDwgMiksCi0JCQkgICAgICAgcF9pbml0X3ZhbFtpXSk7CisJCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwgYWRkciArIChpIDw8IDIpLCBwX2luaXRfdmFsW2ldKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTExNSw3ICsxMDgsNyBAQAogCQlyYyA9IHFlZF9kbWFlX2hvc3QyZ3JjKHBfaHdmbiwgcF9wdHQsCiAJCQkJICAgICAgICh1aW50cHRyX3QpKHBfaW5pdF92YWwgKyBpKSwKIAkJCQkgICAgICAgYWRkciArIChpIDw8IDIpLCBzZWdtZW50LCAwKTsKLQkJaWYgKHJjICE9IDApCisJCWlmIChyYykKIAkJCXJldHVybiByYzsKIAogCQkvKiBKdW1wIG92ZXIgdGhlIGVudGlyZSBzZWdtZW50LCBpbmNsdWRpbmcgaW52YWxpZCBlbnRyeSAqLwpAQCAtMTgyLDkgKzE3NSw3IEBACiAKIHN0YXRpYyBpbnQgcWVkX2luaXRfZmlsbF9kbWFlKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkJICAgICAgdTMyIGFkZHIsCi0JCQkgICAgICB1MzIgZmlsbCwKLQkJCSAgICAgIHUzMiBmaWxsX2NvdW50KQorCQkJICAgICAgdTMyIGFkZHIsIHUzMiBmaWxsLCB1MzIgZmlsbF9jb3VudCkKIHsKIAlzdGF0aWMgdTMyIHplcm9fYnVmZmVyW0RNQUVfTUFYX1JXX1NJWkVdOwogCkBAIC0xOTksMTUgKzE5MCwxMiBAQAogCiAJcmV0dXJuIHFlZF9kbWFlX2hvc3QyZ3JjKHBfaHdmbiwgcF9wdHQsCiAJCQkJICh1aW50cHRyX3QpKCZ6ZXJvX2J1ZmZlclswXSksCi0JCQkJIGFkZHIsIGZpbGxfY291bnQsCi0JCQkJIFFFRF9ETUFFX0ZMQUdfUldfUkVQTF9TUkMpOworCQkJCSBhZGRyLCBmaWxsX2NvdW50LCBRRURfRE1BRV9GTEFHX1JXX1JFUExfU1JDKTsKIH0KIAogc3RhdGljIHZvaWQgcWVkX2luaXRfZmlsbChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkJICB1MzIgYWRkciwKLQkJCSAgdTMyIGZpbGwsCi0JCQkgIHUzMiBmaWxsX2NvdW50KQorCQkJICB1MzIgYWRkciwgdTMyIGZpbGwsIHUzMiBmaWxsX2NvdW50KQogewogCXUzMiBpOwogCkBAIC0yMTgsMTIgKzIwNiwxMiBAQAogc3RhdGljIGludCBxZWRfaW5pdF9jbWRfYXJyYXkoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCiAJCQkgICAgICBzdHJ1Y3QgaW5pdF93cml0ZV9vcCAqY21kLAotCQkJICAgICAgYm9vbCBiX211c3RfZG1hZSwKLQkJCSAgICAgIGJvb2wgYl9jYW5fZG1hZSkKKwkJCSAgICAgIGJvb2wgYl9tdXN0X2RtYWUsIGJvb2wgYl9jYW5fZG1hZSkKIHsKKwl1MzIgZG1hZV9hcnJheV9vZmZzZXQgPSBsZTMyX3RvX2NwdShjbWQtPmFyZ3MuYXJyYXlfb2Zmc2V0KTsKIAl1MzIgZGF0YSA9IGxlMzJfdG9fY3B1KGNtZC0+ZGF0YSk7CiAJdTMyIGFkZHIgPSBHRVRfRklFTEQoZGF0YSwgSU5JVF9XUklURV9PUF9BRERSRVNTKSA8PCAyOwotCXUzMiBkbWFlX2FycmF5X29mZnNldCA9IGxlMzJfdG9fY3B1KGNtZC0+YXJncy5hcnJheV9vZmZzZXQpOworCiAJdTMyIG9mZnNldCwgb3V0cHV0X2xlbiwgaW5wdXRfbGVuLCBtYXhfc2l6ZTsKIAlzdHJ1Y3QgcWVkX2RldiAqY2RldiA9IHBfaHdmbi0+Y2RldjsKIAl1bmlvbiBpbml0X2FycmF5X2hkciAqaGRyOwpAQCAtMjMzLDggKzIyMSw3IEBACiAKIAlhcnJheV9kYXRhID0gY2Rldi0+ZndfZGF0YS0+YXJyX2RhdGE7CiAKLQloZHIgPSAodW5pb24gaW5pdF9hcnJheV9oZHIgKikoYXJyYXlfZGF0YSArCi0JCQkJICAgICAgIGRtYWVfYXJyYXlfb2Zmc2V0KTsKKwloZHIgPSAodW5pb24gaW5pdF9hcnJheV9oZHIgKikoYXJyYXlfZGF0YSArIGRtYWVfYXJyYXlfb2Zmc2V0KTsKIAlkYXRhID0gbGUzMl90b19jcHUoaGRyLT5yYXcuZGF0YSk7CiAJc3dpdGNoIChHRVRfRklFTEQoZGF0YSwgSU5JVF9BUlJBWV9SQVdfSERSX1RZUEUpKSB7CiAJY2FzZSBJTklUX0FSUl9aSVBQRUQ6CkBAIC0yOTAsMTMgKzI3NywxMiBAQAogLyogaW5pdF9vcHMgd3JpdGUgY29tbWFuZCAqLwogc3RhdGljIGludCBxZWRfaW5pdF9jbWRfd3Ioc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCi0JCQkgICBzdHJ1Y3QgaW5pdF93cml0ZV9vcCAqY21kLAotCQkJICAgYm9vbCBiX2Nhbl9kbWFlKQorCQkJICAgc3RydWN0IGluaXRfd3JpdGVfb3AgKnBfY21kLCBib29sIGJfY2FuX2RtYWUpCiB7Ci0JdTMyIGRhdGEgPSBsZTMyX3RvX2NwdShjbWQtPmRhdGEpOwotCXUzMiBhZGRyID0gR0VUX0ZJRUxEKGRhdGEsIElOSVRfV1JJVEVfT1BfQUREUkVTUykgPDwgMjsKKwl1MzIgZGF0YSA9IGxlMzJfdG9fY3B1KHBfY21kLT5kYXRhKTsKIAlib29sIGJfbXVzdF9kbWFlID0gR0VUX0ZJRUxEKGRhdGEsIElOSVRfV1JJVEVfT1BfV0lERV9CVVMpOwotCXVuaW9uIGluaXRfd3JpdGVfYXJncyAqYXJnID0gJmNtZC0+YXJnczsKKwl1MzIgYWRkciA9IEdFVF9GSUVMRChkYXRhLCBJTklUX1dSSVRFX09QX0FERFJFU1MpIDw8IDI7CisJdW5pb24gaW5pdF93cml0ZV9hcmdzICphcmcgPSAmcF9jbWQtPmFyZ3M7CiAJaW50IHJjID0gMDsKIAogCS8qIFNhbml0aXplICovCkBAIC0zMDksMjAgKzI5NSwxOCBAQAogCiAJc3dpdGNoIChHRVRfRklFTEQoZGF0YSwgSU5JVF9XUklURV9PUF9TT1VSQ0UpKSB7CiAJY2FzZSBJTklUX1NSQ19JTkxJTkU6Ci0JCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBhZGRyLAotCQkgICAgICAgbGUzMl90b19jcHUoYXJnLT5pbmxpbmVfdmFsKSk7CisJCWRhdGEgPSBsZTMyX3RvX2NwdShwX2NtZC0+YXJncy5pbmxpbmVfdmFsKTsKKwkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAljYXNlIElOSVRfU1JDX1pFUk9TOgotCQlpZiAoYl9tdXN0X2RtYWUgfHwKLQkJICAgIChiX2Nhbl9kbWFlICYmIChsZTMyX3RvX2NwdShhcmctPnplcm9zX2NvdW50KSA+PSA2NCkpKQotCQkJcmMgPSBxZWRfaW5pdF9maWxsX2RtYWUocF9od2ZuLCBwX3B0dCwgYWRkciwgMCwKLQkJCQkJCWxlMzJfdG9fY3B1KGFyZy0+emVyb3NfY291bnQpKTsKKwkJZGF0YSA9IGxlMzJfdG9fY3B1KHBfY21kLT5hcmdzLnplcm9zX2NvdW50KTsKKwkJaWYgKGJfbXVzdF9kbWFlIHx8IChiX2Nhbl9kbWFlICYmIChkYXRhID49IDY0KSkpCisJCQlyYyA9IHFlZF9pbml0X2ZpbGxfZG1hZShwX2h3Zm4sIHBfcHR0LCBhZGRyLCAwLCBkYXRhKTsKIAkJZWxzZQotCQkJcWVkX2luaXRfZmlsbChwX2h3Zm4sIHBfcHR0LCBhZGRyLCAwLAotCQkJCSAgICAgIGxlMzJfdG9fY3B1KGFyZy0+emVyb3NfY291bnQpKTsKKwkJCXFlZF9pbml0X2ZpbGwocF9od2ZuLCBwX3B0dCwgYWRkciwgMCwgZGF0YSk7CiAJCWJyZWFrOwogCWNhc2UgSU5JVF9TUkNfQVJSQVk6Ci0JCXJjID0gcWVkX2luaXRfY21kX2FycmF5KHBfaHdmbiwgcF9wdHQsIGNtZCwKKwkJcmMgPSBxZWRfaW5pdF9jbWRfYXJyYXkocF9od2ZuLCBwX3B0dCwgcF9jbWQsCiAJCQkJCWJfbXVzdF9kbWFlLCBiX2Nhbl9kbWFlKTsKIAkJYnJlYWs7CiAJY2FzZSBJTklUX1NSQ19SVU5USU1FOgpAQCAtMzUzLDggKzMzNyw3IEBACiAKIC8qIGluaXRfb3BzIHJlYWQvcG9sbCBjb21tYW5kcyAqLwogc3RhdGljIHZvaWQgcWVkX2luaXRfY21kX3JkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJCSAgICBzdHJ1Y3QgaW5pdF9yZWFkX29wICpjbWQpCisJCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCBzdHJ1Y3QgaW5pdF9yZWFkX29wICpjbWQpCiB7CiAJYm9vbCAoKmNvbXBfY2hlY2spKHUzMiB2YWwsIHUzMiBleHBlY3RlZF92YWwpOwogCXUzMiBkZWxheSA9IFFFRF9JTklUX1BPTExfUEVSSU9EX1VTLCB2YWw7CkBAIC00MTIsMzUgKzM5NSwzMyBAQAogfQogCiBzdGF0aWMgdTggcWVkX2luaXRfY21kX21vZGVfbWF0Y2goc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkJICB1MTYgKm9mZnNldCwKLQkJCQkgIGludCBtb2RlcykKKwkJCQkgIHUxNiAqcF9vZmZzZXQsIGludCBtb2RlcykKIHsKIAlzdHJ1Y3QgcWVkX2RldiAqY2RldiA9IHBfaHdmbi0+Y2RldjsKIAljb25zdCB1OCAqbW9kZXNfdHJlZV9idWY7CiAJdTggYXJnMSwgYXJnMiwgdHJlZV92YWw7CiAKIAltb2Rlc190cmVlX2J1ZiA9IGNkZXYtPmZ3X2RhdGEtPm1vZGVzX3RyZWVfYnVmOwotCXRyZWVfdmFsID0gbW9kZXNfdHJlZV9idWZbKCpvZmZzZXQpKytdOworCXRyZWVfdmFsID0gbW9kZXNfdHJlZV9idWZbKCpwX29mZnNldCkrK107CiAJc3dpdGNoICh0cmVlX3ZhbCkgewogCWNhc2UgSU5JVF9NT0RFX09QX05PVDoKLQkJcmV0dXJuIHFlZF9pbml0X2NtZF9tb2RlX21hdGNoKHBfaHdmbiwgb2Zmc2V0LCBtb2RlcykgXiAxOworCQlyZXR1cm4gcWVkX2luaXRfY21kX21vZGVfbWF0Y2gocF9od2ZuLCBwX29mZnNldCwgbW9kZXMpIF4gMTsKIAljYXNlIElOSVRfTU9ERV9PUF9PUjoKLQkJYXJnMQk9IHFlZF9pbml0X2NtZF9tb2RlX21hdGNoKHBfaHdmbiwgb2Zmc2V0LCBtb2Rlcyk7Ci0JCWFyZzIJPSBxZWRfaW5pdF9jbWRfbW9kZV9tYXRjaChwX2h3Zm4sIG9mZnNldCwgbW9kZXMpOworCQlhcmcxID0gcWVkX2luaXRfY21kX21vZGVfbWF0Y2gocF9od2ZuLCBwX29mZnNldCwgbW9kZXMpOworCQlhcmcyID0gcWVkX2luaXRfY21kX21vZGVfbWF0Y2gocF9od2ZuLCBwX29mZnNldCwgbW9kZXMpOwogCQlyZXR1cm4gYXJnMSB8IGFyZzI7CiAJY2FzZSBJTklUX01PREVfT1BfQU5EOgotCQlhcmcxCT0gcWVkX2luaXRfY21kX21vZGVfbWF0Y2gocF9od2ZuLCBvZmZzZXQsIG1vZGVzKTsKLQkJYXJnMgk9IHFlZF9pbml0X2NtZF9tb2RlX21hdGNoKHBfaHdmbiwgb2Zmc2V0LCBtb2Rlcyk7CisJCWFyZzEgPSBxZWRfaW5pdF9jbWRfbW9kZV9tYXRjaChwX2h3Zm4sIHBfb2Zmc2V0LCBtb2Rlcyk7CisJCWFyZzIgPSBxZWRfaW5pdF9jbWRfbW9kZV9tYXRjaChwX2h3Zm4sIHBfb2Zmc2V0LCBtb2Rlcyk7CiAJCXJldHVybiBhcmcxICYgYXJnMjsKIAlkZWZhdWx0OgogCQl0cmVlX3ZhbCAtPSBNQVhfSU5JVF9NT0RFX09QUzsKLQkJcmV0dXJuIChtb2RlcyAmICgxIDw8IHRyZWVfdmFsKSkgPyAxIDogMDsKKwkJcmV0dXJuIChtb2RlcyAmIEJJVCh0cmVlX3ZhbCkpID8gMSA6IDA7CiAJfQogfQogCiBzdGF0aWMgdTMyIHFlZF9pbml0X2NtZF9tb2RlKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICAgICBzdHJ1Y3QgaW5pdF9pZl9tb2RlX29wICpwX2NtZCwKLQkJCSAgICAgaW50IG1vZGVzKQorCQkJICAgICBzdHJ1Y3QgaW5pdF9pZl9tb2RlX29wICpwX2NtZCwgaW50IG1vZGVzKQogewogCXUxNiBvZmZzZXQgPSBsZTE2X3RvX2NwdShwX2NtZC0+bW9kZXNfYnVmX29mZnNldCk7CiAKQEAgLTQ1Myw4ICs0MzQsNyBAQAogCiBzdGF0aWMgdTMyIHFlZF9pbml0X2NtZF9waGFzZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJCSAgICAgIHN0cnVjdCBpbml0X2lmX3BoYXNlX29wICpwX2NtZCwKLQkJCSAgICAgIHUzMiBwaGFzZSwKLQkJCSAgICAgIHUzMiBwaGFzZV9pZCkKKwkJCSAgICAgIHUzMiBwaGFzZSwgdTMyIHBoYXNlX2lkKQogewogCXUzMiBkYXRhID0gbGUzMl90b19jcHUocF9jbWQtPnBoYXNlX2RhdGEpOwogCXUzMiBvcF9kYXRhID0gbGUzMl90b19jcHUocF9jbWQtPm9wX2RhdGEpOwpAQCAtNDY4LDEwICs0NDgsNyBAQAogfQogCiBpbnQgcWVkX2luaXRfcnVuKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkgaW50IHBoYXNlLAotCQkgaW50IHBoYXNlX2lkLAotCQkgaW50IG1vZGVzKQorCQkgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCBpbnQgcGhhc2UsIGludCBwaGFzZV9pZCwgaW50IG1vZGVzKQogewogCXN0cnVjdCBxZWRfZGV2ICpjZGV2ID0gcF9od2ZuLT5jZGV2OwogCXUzMiBjbWRfbnVtLCBudW1faW5pdF9vcHM7CkBAIC00ODMsMTAgKzQ2MCw4IEBACiAJaW5pdF9vcHMgPSBjZGV2LT5md19kYXRhLT5pbml0X29wczsKIAogCXBfaHdmbi0+dW56aXBfYnVmID0ga3phbGxvYyhNQVhfWklQUEVEX1NJWkUgKiA0LCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBfaHdmbi0+dW56aXBfYnVmKSB7Ci0JCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgdW56aXAgYnVmZmVyXG4iKTsKKwlpZiAoIXBfaHdmbi0+dW56aXBfYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlmb3IgKGNtZF9udW0gPSAwOyBjbWRfbnVtIDwgbnVtX2luaXRfb3BzOyBjbWRfbnVtKyspIHsKIAkJdW5pb24gaW5pdF9vcCAqY21kID0gJmluaXRfb3BzW2NtZF9udW1dOwpAQCAtNTU3LDcgKzUzMiw3IEBACiAJLyogRmlyc3QgRHdvcmQgY29udGFpbnMgbWV0YWRhdGEgYW5kIHNob3VsZCBiZSBza2lwcGVkICovCiAJYnVmX2hkciA9IChzdHJ1Y3QgYmluX2J1ZmZlcl9oZHIgKikoZGF0YSArIHNpemVvZih1MzIpKTsKIAotCW9mZnNldCA9IGJ1Zl9oZHJbQklOX0JVRl9GV19WRVJfSU5GT10ub2Zmc2V0OworCW9mZnNldCA9IGJ1Zl9oZHJbQklOX0JVRl9JTklUX0ZXX1ZFUl9JTkZPXS5vZmZzZXQ7CiAJZnctPmZ3X3Zlcl9pbmZvID0gKHN0cnVjdCBmd192ZXJfaW5mbyAqKShkYXRhICsgb2Zmc2V0KTsKIAogCW9mZnNldCA9IGJ1Zl9oZHJbQklOX0JVRl9JTklUX0NNRF0ub2Zmc2V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaW50LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9pbnQuYwppbmRleCA4ZmE1MGZhLi4yYWRlZGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9pbnQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9pbnQuYwpAQCAtMTc3NSwxMCArMTc3NSw5IEBACiB9OwogCiBzdGF0aWMgaW5saW5lIHUxNiBxZWRfYXR0bl91cGRhdGVfaWR4KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJCSAgICAgIHN0cnVjdCBxZWRfc2JfYXR0bl9pbmZvICAgKnBfc2JfZGVzYykKKwkJCQkgICAgICBzdHJ1Y3QgcWVkX3NiX2F0dG5faW5mbyAqcF9zYl9kZXNjKQogewotCXUxNiAgICAgcmMgPSAwOwotCXUxNiAgICAgaW5kZXg7CisJdTE2IHJjID0gMCwgaW5kZXg7CiAKIAkvKiBNYWtlIGNlcnRhaW4gSFcgd3JpdGUgdG9vayBhZmZlY3QgKi8KIAltbWlvd2IoKTsKQEAgLTE4MDIsMTUgKzE4MDEsMTMgQEAKICAqICBAcGFyYW0gYXNzZXJ0ZWRfYml0cyBuZXdseSBhc3NlcnRlZCBiaXRzCiAgKiAgQHJldHVybiBpbnQKICAqLwotc3RhdGljIGludCBxZWRfaW50X2Fzc2VydGlvbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgICAgdTE2IGFzc2VydGVkX2JpdHMpCitzdGF0aWMgaW50IHFlZF9pbnRfYXNzZXJ0aW9uKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1MTYgYXNzZXJ0ZWRfYml0cykKIHsKIAlzdHJ1Y3QgcWVkX3NiX2F0dG5faW5mbyAqc2JfYXR0bl9zdyA9IHBfaHdmbi0+cF9zYl9hdHRuOwogCXUzMiBpZ3VfbWFzazsKIAogCS8qIE1hc2sgdGhlIHNvdXJjZSBvZiB0aGUgYXR0ZW50aW9uIGluIHRoZSBJR1UgKi8KLQlpZ3VfbWFzayA9IHFlZF9yZChwX2h3Zm4sIHBfaHdmbi0+cF9kcGNfcHR0LAotCQkJICBJR1VfUkVHX0FUVEVOVElPTl9FTkFCTEUpOworCWlndV9tYXNrID0gcWVkX3JkKHBfaHdmbiwgcF9od2ZuLT5wX2RwY19wdHQsIElHVV9SRUdfQVRURU5USU9OX0VOQUJMRSk7CiAJRFBfVkVSQk9TRShwX2h3Zm4sIE5FVElGX01TR19JTlRSLCAiSUdVIG1hc2s6IDB4JTA4eCAtLT4gMHglMDh4XG4iLAogCQkgICBpZ3VfbWFzaywgaWd1X21hc2sgJiB+KGFzc2VydGVkX2JpdHMgJiBBVFROX0JJVFNfTUFTS0FCTEUpKTsKIAlpZ3VfbWFzayAmPSB+KGFzc2VydGVkX2JpdHMgJiBBVFROX0JJVFNfTUFTS0FCTEUpOwpAQCAtMjA0MSw3ICsyMDM4LDcgQEAKIAkJCXN0cnVjdCBhZXVfaW52ZXJ0X3JlZ19iaXQgKnBfYml0ID0gJnBfYWV1LT5iaXRzW2pdOwogCiAJCQlpZiAoKHBfYml0LT5mbGFncyAmIEFUVEVOVElPTl9QQVJJVFkpICYmCi0JCQkgICAgISEocGFyaXRpZXMgJiAoMSA8PCBiaXRfaWR4KSkpCisJCQkgICAgISEocGFyaXRpZXMgJiBCSVQoYml0X2lkeCkpKQogCQkJCXFlZF9pbnRfZGVhc3NlcnRpb25fcGFyaXR5KHBfaHdmbiwgcF9iaXQsCiAJCQkJCQkJICAgYml0X2lkeCk7CiAKQEAgLTIxMTQsOCArMjExMSw3IEBACiAJCQkJICAgIH4oKHUzMilkZWFzc2VydGVkX2JpdHMpKTsKIAogCS8qIFVubWFzayBkZWFzc2VydGVkIGF0dGVudGlvbnMgaW4gSUdVICovCi0JYWV1X21hc2sgPSBxZWRfcmQocF9od2ZuLCBwX2h3Zm4tPnBfZHBjX3B0dCwKLQkJCSAgSUdVX1JFR19BVFRFTlRJT05fRU5BQkxFKTsKKwlhZXVfbWFzayA9IHFlZF9yZChwX2h3Zm4sIHBfaHdmbi0+cF9kcGNfcHR0LCBJR1VfUkVHX0FUVEVOVElPTl9FTkFCTEUpOwogCWFldV9tYXNrIHw9IChkZWFzc2VydGVkX2JpdHMgJiBBVFROX0JJVFNfTUFTS0FCTEUpOwogCXFlZF93cihwX2h3Zm4sIHBfaHdmbi0+cF9kcGNfcHR0LCBJR1VfUkVHX0FUVEVOVElPTl9FTkFCTEUsIGFldV9tYXNrKTsKIApAQCAtMjE2MCw4ICsyMTU2LDcgQEAKIAkJCWluZGV4LCBhdHRuX2JpdHMsIGF0dG5fYWNrcywgYXNzZXJ0ZWRfYml0cywKIAkJCWRlYXNzZXJ0ZWRfYml0cywgcF9zYl9hdHRuX3N3LT5rbm93bl9hdHRuKTsKIAl9IGVsc2UgaWYgKGFzc2VydGVkX2JpdHMgPT0gMHgxMDApIHsKLQkJRFBfSU5GTyhwX2h3Zm4sCi0JCQkiTUZXIGluZGljYXRpb24gdmlhIGF0dGVudGlvblxuIik7CisJCURQX0lORk8ocF9od2ZuLCAiTUZXIGluZGljYXRpb24gdmlhIGF0dGVudGlvblxuIik7CiAJfSBlbHNlIHsKIAkJRFBfVkVSQk9TRShwX2h3Zm4sIE5FVElGX01TR19JTlRSLAogCQkJICAgIk1GVyBpbmRpY2F0aW9uIFtkZWFzc2VydGlvbl1cbiIpOwpAQCAtMjE3MywxOCArMjE2OCwxNCBAQAogCQkJcmV0dXJuIHJjOwogCX0KIAotCWlmIChkZWFzc2VydGVkX2JpdHMpIHsKKwlpZiAoZGVhc3NlcnRlZF9iaXRzKQogCQlyYyA9IHFlZF9pbnRfZGVhc3NlcnRpb24ocF9od2ZuLCBkZWFzc2VydGVkX2JpdHMpOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7Ci0JfQogCiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgdm9pZCBxZWRfc2JfYWNrX2F0dG4oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgICAgdm9pZCBfX2lvbWVtICppZ3VfYWRkciwKLQkJCSAgICB1MzIgYWNrX2NvbnMpCisJCQkgICAgdm9pZCBfX2lvbWVtICppZ3VfYWRkciwgdTMyIGFja19jb25zKQogewogCXN0cnVjdCBpZ3VfcHJvZF9jb25zX3VwZGF0ZSBpZ3VfYWNrID0geyAwIH07CiAKQEAgLTIyNDIsOSArMjIzMyw4IEBACiAKIAkvKiBHYXRoZXIgSW50ZXJydXB0cy9BdHRlbnRpb25zIGluZm9ybWF0aW9uICovCiAJaWYgKCFzYl9pbmZvLT5zYl92aXJ0KSB7Ci0JCURQX0VSUigKLQkJCXBfaHdmbi0+Y2RldiwKLQkJCSJJbnRlcnJ1cHQgU3RhdHVzIGJsb2NrIGlzIE5VTEwgLSBjYW5ub3QgY2hlY2sgZm9yIG5ldyBpbnRlcnJ1cHRzIVxuIik7CisJCURQX0VSUihwX2h3Zm4tPmNkZXYsCisJCSAgICAgICAiSW50ZXJydXB0IFN0YXR1cyBibG9jayBpcyBOVUxMIC0gY2Fubm90IGNoZWNrIGZvciBuZXcgaW50ZXJydXB0cyFcbiIpOwogCX0gZWxzZSB7CiAJCXUzMiB0bXBfaW5kZXggPSBzYl9pbmZvLT5zYl9hY2s7CiAKQEAgLTIyNTUsOSArMjI0NSw4IEBACiAJfQogCiAJaWYgKCFzYl9hdHRuIHx8ICFzYl9hdHRuLT5zYl9hdHRuKSB7Ci0JCURQX0VSUigKLQkJCXBfaHdmbi0+Y2RldiwKLQkJCSJBdHRlbnRpb25zIFN0YXR1cyBibG9jayBpcyBOVUxMIC0gY2Fubm90IGNoZWNrIGZvciBuZXcgYXR0ZW50aW9ucyFcbiIpOworCQlEUF9FUlIocF9od2ZuLT5jZGV2LAorCQkgICAgICAgIkF0dGVudGlvbnMgU3RhdHVzIGJsb2NrIGlzIE5VTEwgLSBjYW5ub3QgY2hlY2sgZm9yIG5ldyBhdHRlbnRpb25zIVxuIik7CiAJfSBlbHNlIHsKIAkJdTE2IHRtcF9pbmRleCA9IHNiX2F0dG4tPmluZGV4OwogCkBAIC0yMzEzLDggKzIzMDIsNyBAQAogCWlmIChwX3NiLT5zYl9hdHRuKQogCQlkbWFfZnJlZV9jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsCiAJCQkJICBTQl9BVFROX0FMSUdORURfU0laRShwX2h3Zm4pLAotCQkJCSAgcF9zYi0+c2JfYXR0biwKLQkJCQkgIHBfc2ItPnNiX3BoeXMpOworCQkJCSAgcF9zYi0+c2JfYXR0biwgcF9zYi0+c2JfcGh5cyk7CiAJa2ZyZWUocF9zYik7CiB9CiAKQEAgLTIzMzcsOCArMjMyNSw3IEBACiAKIHN0YXRpYyB2b2lkIHFlZF9pbnRfc2JfYXR0bl9pbml0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkJCSBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCi0JCQkJIHZvaWQgKnNiX3ZpcnRfYWRkciwKLQkJCQkgZG1hX2FkZHJfdCBzYl9waHlfYWRkcikKKwkJCQkgdm9pZCAqc2JfdmlydF9hZGRyLCBkbWFfYWRkcl90IHNiX3BoeV9hZGRyKQogewogCXN0cnVjdCBxZWRfc2JfYXR0bl9pbmZvICpzYl9pbmZvID0gcF9od2ZuLT5wX3NiX2F0dG47CiAJaW50IGksIGosIGs7CkBAIC0yMzc4LDE1ICsyMzY1LDEzIEBACiB7CiAJc3RydWN0IHFlZF9kZXYgKmNkZXYgPSBwX2h3Zm4tPmNkZXY7CiAJc3RydWN0IHFlZF9zYl9hdHRuX2luZm8gKnBfc2I7Ci0Jdm9pZCAqcF92aXJ0OwogCWRtYV9hZGRyX3QgcF9waHlzID0gMDsKKwl2b2lkICpwX3ZpcnQ7CiAKIAkvKiBTQiBzdHJ1Y3QgKi8KIAlwX3NiID0ga21hbGxvYyhzaXplb2YoKnBfc2IpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBfc2IpIHsKLQkJRFBfTk9USUNFKGNkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgYHN0cnVjdCBxZWRfc2JfYXR0bl9pbmZvJ1xuIik7CisJaWYgKCFwX3NiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAkvKiBTQiByaW5nICAqLwogCXBfdmlydCA9IGRtYV9hbGxvY19jb2hlcmVudCgmY2Rldi0+cGRldi0+ZGV2LApAQCAtMjM5NCw3ICsyMzc5LDYgQEAKIAkJCQkgICAgJnBfcGh5cywgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIXBfdmlydCkgewotCQlEUF9OT1RJQ0UoY2RldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzdGF0dXMgYmxvY2sgKGF0dGVudGlvbnMpXG4iKTsKIAkJa2ZyZWUocF9zYik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTI0MTIsOSArMjM5Niw3IEBACiAKIHZvaWQgcWVkX2luaXRfY2F1X3NiX2VudHJ5KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkJICAgc3RydWN0IGNhdV9zYl9lbnRyeSAqcF9zYl9lbnRyeSwKLQkJCSAgIHU4IHBmX2lkLAotCQkJICAgdTE2IHZmX251bWJlciwKLQkJCSAgIHU4IHZmX3ZhbGlkKQorCQkJICAgdTggcGZfaWQsIHUxNiB2Zl9udW1iZXIsIHU4IHZmX3ZhbGlkKQogewogCXN0cnVjdCBxZWRfZGV2ICpjZGV2ID0gcF9od2ZuLT5jZGV2OwogCXUzMiBjYXVfc3RhdGU7CkBAIC0yNDI4LDEyICsyNDEwLDYgQEAKIAlTRVRfRklFTEQocF9zYl9lbnRyeS0+cGFyYW1zLCBDQVVfU0JfRU5UUllfU0JfVElNRVNFVDAsIDB4N0YpOwogCVNFVF9GSUVMRChwX3NiX2VudHJ5LT5wYXJhbXMsIENBVV9TQl9FTlRSWV9TQl9USU1FU0VUMSwgMHg3Rik7CiAKLQkvKiBzZXR0aW5nIHRoZSB0aW1lIHJlc3VsdGlvbiB0byBhIGZpeGVkIHZhbHVlICggPSAxKSAqLwotCVNFVF9GSUVMRChwX3NiX2VudHJ5LT5wYXJhbXMsIENBVV9TQl9FTlRSWV9USU1FUl9SRVMwLAotCQkgIFFFRF9DQVVfREVGX1JYX1RJTUVSX1JFUyk7Ci0JU0VUX0ZJRUxEKHBfc2JfZW50cnktPnBhcmFtcywgQ0FVX1NCX0VOVFJZX1RJTUVSX1JFUzEsCi0JCSAgUUVEX0NBVV9ERUZfVFhfVElNRVJfUkVTKTsKLQogCWNhdV9zdGF0ZSA9IENBVV9IQ19ESVNBQkxFX1NUQVRFOwogCiAJaWYgKGNkZXYtPmludF9jb2FsZXNjaW5nX21vZGUgPT0gUUVEX0NPQUxfTU9ERV9FTkFCTEUpIHsKQEAgLTI0NjgsOSArMjQ0NCw3IEBACiB2b2lkIHFlZF9pbnRfY2F1X2NvbmZfc2Ioc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCQkgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAogCQkJIGRtYV9hZGRyX3Qgc2JfcGh5cywKLQkJCSB1MTYgaWd1X3NiX2lkLAotCQkJIHUxNiB2Zl9udW1iZXIsCi0JCQkgdTggdmZfdmFsaWQpCisJCQkgdTE2IGlndV9zYl9pZCwgdTE2IHZmX251bWJlciwgdTggdmZfdmFsaWQpCiB7CiAJc3RydWN0IGNhdV9zYl9lbnRyeSBzYl9lbnRyeTsKIApAQCAtMjUxNCw4ICsyNDg4LDcgQEAKIAkJCXRpbWVyX3JlcyA9IDI7CiAJCXRpbWVzZXQgPSAodTgpKHBfaHdmbi0+Y2Rldi0+cnhfY29hbGVzY2VfdXNlY3MgPj4gdGltZXJfcmVzKTsKIAkJcWVkX2ludF9jYXVfY29uZl9waShwX2h3Zm4sIHBfcHR0LCBpZ3Vfc2JfaWQsIFJYX1BJLAotCQkJCSAgICBRRURfQ09BTF9SWF9TVEFURV9NQUNISU5FLAotCQkJCSAgICB0aW1lc2V0KTsKKwkJCQkgICAgUUVEX0NPQUxfUlhfU1RBVEVfTUFDSElORSwgdGltZXNldCk7CiAKIAkJaWYgKHBfaHdmbi0+Y2Rldi0+dHhfY29hbGVzY2VfdXNlY3MgPD0gMHg3RikKIAkJCXRpbWVyX3JlcyA9IDA7CkBAIC0yNTQxLDggKzI1MTQsNyBAQAogCQkJIHU4IHRpbWVzZXQpCiB7CiAJc3RydWN0IGNhdV9waV9lbnRyeSBwaV9lbnRyeTsKLQl1MzIgc2Jfb2Zmc2V0OwotCXUzMiBwaV9vZmZzZXQ7CisJdTMyIHNiX29mZnNldCwgcGlfb2Zmc2V0OwogCiAJaWYgKElTX1ZGKHBfaHdmbi0+Y2RldikpCiAJCXJldHVybjsKQEAgLTI1NjksOCArMjU0MSw3IEBACiB9CiAKIHZvaWQgcWVkX2ludF9zYl9zZXR1cChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkgICAgICBzdHJ1Y3QgcWVkX3NiX2luZm8gKnNiX2luZm8pCisJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgc3RydWN0IHFlZF9zYl9pbmZvICpzYl9pbmZvKQogewogCS8qIHplcm8gc3RhdHVzIGJsb2NrIGFuZCBhY2sgY291bnRlciAqLwogCXNiX2luZm8tPnNiX2FjayA9IDA7CkBAIC0yNTkwLDggKzI1NjEsNyBAQAogICoKICAqIEByZXR1cm4gdTE2CiAgKi8KLXN0YXRpYyB1MTYgcWVkX2dldF9pZ3Vfc2JfaWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgICAgIHUxNiBzYl9pZCkKK3N0YXRpYyB1MTYgcWVkX2dldF9pZ3Vfc2JfaWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHUxNiBzYl9pZCkKIHsKIAl1MTYgaWd1X3NiX2lkOwogCkBAIC0yNjAzLDggKzI1NzMsMTIgQEAKIAllbHNlCiAJCWlndV9zYl9pZCA9IHFlZF92Zl9nZXRfaWd1X3NiX2lkKHBfaHdmbiwgc2JfaWQpOwogCi0JRFBfVkVSQk9TRShwX2h3Zm4sIE5FVElGX01TR19JTlRSLCAiU0IgWyVzXSBpbmRleCBpcyAweCUwNHhcbiIsCi0JCSAgIChzYl9pZCA9PSBRRURfU1BfU0JfSUQpID8gIkRTQiIgOiAibm9uLURTQiIsIGlndV9zYl9pZCk7CisJaWYgKHNiX2lkID09IFFFRF9TUF9TQl9JRCkKKwkJRFBfVkVSQk9TRShwX2h3Zm4sIE5FVElGX01TR19JTlRSLAorCQkJICAgIlNsb3dwYXRoIFNCIGluZGV4IGluIElHVSBpcyAweCUwNHhcbiIsIGlndV9zYl9pZCk7CisJZWxzZQorCQlEUF9WRVJCT1NFKHBfaHdmbiwgTkVUSUZfTVNHX0lOVFIsCisJCQkgICAiU0IgWyUwNHhdIDwtLT4gSUdVIFNCIFslMDR4XVxuIiwgc2JfaWQsIGlndV9zYl9pZCk7CiAKIAlyZXR1cm4gaWd1X3NiX2lkOwogfQpAQCAtMjYxMiw5ICsyNTg2LDcgQEAKIGludCBxZWRfaW50X3NiX2luaXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCiAJCSAgICBzdHJ1Y3QgcWVkX3NiX2luZm8gKnNiX2luZm8sCi0JCSAgICB2b2lkICpzYl92aXJ0X2FkZHIsCi0JCSAgICBkbWFfYWRkcl90IHNiX3BoeV9hZGRyLAotCQkgICAgdTE2IHNiX2lkKQorCQkgICAgdm9pZCAqc2JfdmlydF9hZGRyLCBkbWFfYWRkcl90IHNiX3BoeV9hZGRyLCB1MTYgc2JfaWQpCiB7CiAJc2JfaW5mby0+c2JfdmlydCA9IHNiX3ZpcnRfYWRkcjsKIAlzYl9pbmZvLT5zYl9waHlzID0gc2JfcGh5X2FkZHI7CkBAIC0yNjUwLDggKzI2MjIsNyBAQAogfQogCiBpbnQgcWVkX2ludF9zYl9yZWxlYXNlKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkgICAgICAgc3RydWN0IHFlZF9zYl9pbmZvICpzYl9pbmZvLAotCQkgICAgICAgdTE2IHNiX2lkKQorCQkgICAgICAgc3RydWN0IHFlZF9zYl9pbmZvICpzYl9pbmZvLCB1MTYgc2JfaWQpCiB7CiAJaWYgKHNiX2lkID09IFFFRF9TUF9TQl9JRCkgewogCQlEUF9FUlIocF9od2ZuLCAiRG8gTm90IGZyZWUgc3Agc2IgdXNpbmcgdGhpcyBmdW5jdGlvbiIpOwpAQCAtMjY4NSw4ICsyNjU2LDcgQEAKIAlrZnJlZShwX3NiKTsKIH0KIAotc3RhdGljIGludCBxZWRfaW50X3NwX3NiX2FsbG9jKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3N0YXRpYyBpbnQgcWVkX2ludF9zcF9zYl9hbGxvYyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCXN0cnVjdCBxZWRfc2Jfc3BfaW5mbyAqcF9zYjsKIAlkbWFfYWRkcl90IHBfcGh5cyA9IDA7CkBAIC0yNjk0LDE3ICsyNjY0LDE0IEBACiAKIAkvKiBTQiBzdHJ1Y3QgKi8KIAlwX3NiID0ga21hbGxvYyhzaXplb2YoKnBfc2IpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBfc2IpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBgc3RydWN0IHFlZF9zYl9pbmZvJ1xuIik7CisJaWYgKCFwX3NiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAkvKiBTQiByaW5nICAqLwogCXBfdmlydCA9IGRtYV9hbGxvY19jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsCiAJCQkJICAgIFNCX0FMSUdORURfU0laRShwX2h3Zm4pLAogCQkJCSAgICAmcF9waHlzLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBfdmlydCkgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHN0YXR1cyBibG9ja1xuIik7CiAJCWtmcmVlKHBfc2IpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yNzIxLDkgKzI2ODgsNyBAQAogCiBpbnQgcWVkX2ludF9yZWdpc3Rlcl9jYihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJCXFlZF9pbnRfY29tcF9jYl90IGNvbXBfY2IsCi0JCQl2b2lkICpjb29raWUsCi0JCQl1OCAqc2JfaWR4LAotCQkJX19sZTE2ICoqcF9md19jb25zKQorCQkJdm9pZCAqY29va2llLCB1OCAqc2JfaWR4LCBfX2xlMTYgKipwX2Z3X2NvbnMpCiB7CiAJc3RydWN0IHFlZF9zYl9zcF9pbmZvICpwX3NwX3NiID0gcF9od2ZuLT5wX3NwX3NiOwogCWludCByYyA9IC1FTk9NRU07CkBAIC0yNzY0LDggKzI3MjksNyBAQAogfQogCiB2b2lkIHFlZF9pbnRfaWd1X2VuYWJsZV9pbnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkJICAgIGVudW0gcWVkX2ludF9tb2RlIGludF9tb2RlKQorCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgZW51bSBxZWRfaW50X21vZGUgaW50X21vZGUpCiB7CiAJdTMyIGlndV9wZl9jb25mID0gSUdVX1BGX0NPTkZfRlVOQ19FTiB8IElHVV9QRl9DT05GX0FUVE5fQklUX0VOOwogCkBAIC0yODA5LDcgKzI3NzMsNyBAQAogCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBNSVNDX1JFR19BRVVfTUFTS19BVFROX0lHVSwgMHhmZik7CiAJaWYgKChpbnRfbW9kZSAhPSBRRURfSU5UX01PREVfSU5UQSkgfHwgSVNfTEVBRF9IV0ZOKHBfaHdmbikpIHsKIAkJcmMgPSBxZWRfc2xvd3BhdGhfaXJxX3JlcShwX2h3Zm4pOwotCQlpZiAocmMgIT0gMCkgeworCQlpZiAocmMpIHsKIAkJCURQX05PVElDRShwX2h3Zm4sICJTbG93cGF0aCBJUlEgcmVxdWVzdCBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTI4MjIsOCArMjc4Niw3IEBACiAJcmV0dXJuIHJjOwogfQogCi12b2lkIHFlZF9pbnRfaWd1X2Rpc2FibGVfaW50KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCit2b2lkIHFlZF9pbnRfaWd1X2Rpc2FibGVfaW50KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCiB7CiAJcF9od2ZuLT5iX2ludF9lbmFibGVkID0gMDsKIApAQCAtMjk1MCwxMyArMjkxMywxMSBAQAogCQkJCQlwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZCwgYl9zZXQpOwogfQogCi1zdGF0aWMgdTMyIHFlZF9pbnRfaWd1X3JlYWRfY2FtX2Jsb2NrKHN0cnVjdCBxZWRfaHdmbgkqcF9od2ZuLAotCQkJCSAgICAgIHN0cnVjdCBxZWRfcHR0CSpwX3B0dCwKLQkJCQkgICAgICB1MTYJCXNiX2lkKQorc3RhdGljIHUzMiBxZWRfaW50X2lndV9yZWFkX2NhbV9ibG9jayhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUxNiBzYl9pZCkKIHsKIAl1MzIgdmFsID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsCi0JCQkgSUdVX1JFR19NQVBQSU5HX01FTU9SWSArCi0JCQkgc2l6ZW9mKHUzMikgKiBzYl9pZCk7CisJCQkgSUdVX1JFR19NQVBQSU5HX01FTU9SWSArIHNpemVvZih1MzIpICogc2JfaWQpOwogCXN0cnVjdCBxZWRfaWd1X2Jsb2NrICpwX2Jsb2NrOwogCiAJcF9ibG9jayA9ICZwX2h3Zm4tPmh3X2luZm8ucF9pZ3VfaW5mby0+aWd1X21hcC5pZ3VfYmxvY2tzW3NiX2lkXTsKQEAgLTI5ODMsOCArMjk0NCw3IEBACiAJcmV0dXJuIHZhbDsKIH0KIAotaW50IHFlZF9pbnRfaWd1X3JlYWRfY2FtKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK2ludCBxZWRfaW50X2lndV9yZWFkX2NhbShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCXN0cnVjdCBxZWRfaWd1X2luZm8gKnBfaWd1X2luZm87CiAJdTMyIHZhbCwgbWluX3ZmID0gMCwgbWF4X3ZmID0gMDsKQEAgLTI5OTMsNyArMjk1Myw2IEBACiAJdTE2IHByZXZfc2JfaWQgPSAweEZGOwogCiAJcF9od2ZuLT5od19pbmZvLnBfaWd1X2luZm8gPSBremFsbG9jKHNpemVvZigqcF9pZ3VfaW5mbyksIEdGUF9LRVJORUwpOwotCiAJaWYgKCFwX2h3Zm4tPmh3X2luZm8ucF9pZ3VfaW5mbykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTMxMDQsMjIgKzMwNjMsMTkgQEAKICAqLwogdm9pZCBxZWRfaW50X2lndV9pbml0X3J0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuKQogewotCXUzMiBpZ3VfcGZfY29uZiA9IDA7Ci0KLQlpZ3VfcGZfY29uZiB8PSBJR1VfUEZfQ09ORl9GVU5DX0VOOworCXUzMiBpZ3VfcGZfY29uZiA9IElHVV9QRl9DT05GX0ZVTkNfRU47CiAKIAlTVE9SRV9SVF9SRUcocF9od2ZuLCBJR1VfUkVHX1BGX0NPTkZJR1VSQVRJT05fUlRfT0ZGU0VULCBpZ3VfcGZfY29uZik7CiB9CiAKIHU2NCBxZWRfaW50X2lndV9yZWFkX3Npc3JfcmVnKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuKQogewotCXU2NCBpbnRyX3N0YXR1cyA9IDA7Ci0JdTMyIGludHJfc3RhdHVzX2xvID0gMDsKLQl1MzIgaW50cl9zdGF0dXNfaGkgPSAwOwogCXUzMiBsc2JfaWd1X2NtZF9hZGRyID0gSUdVX1JFR19TSVNSX01EUENfV01BU0tfTFNCX1VQUEVSIC0KIAkJCSAgICAgICBJR1VfQ01EX0lOVF9BQ0tfQkFTRTsKIAl1MzIgbXNiX2lndV9jbWRfYWRkciA9IElHVV9SRUdfU0lTUl9NRFBDX1dNQVNLX01TQl9VUFBFUiAtCiAJCQkgICAgICAgSUdVX0NNRF9JTlRfQUNLX0JBU0U7CisJdTMyIGludHJfc3RhdHVzX2hpID0gMCwgaW50cl9zdGF0dXNfbG8gPSAwOworCXU2NCBpbnRyX3N0YXR1cyA9IDA7CiAKIAlpbnRyX3N0YXR1c19sbyA9IFJFR19SRChwX2h3Zm4sCiAJCQkJR1RUX0JBUjBfTUFQX1JFR19JR1VfQ01EICsKQEAgLTMxNTMsMjYgKzMxMDksMjAgQEAKIAlrZnJlZShwX2h3Zm4tPnNwX2RwYyk7CiB9CiAKLWludCBxZWRfaW50X2FsbG9jKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK2ludCBxZWRfaW50X2FsbG9jKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCiB7CiAJaW50IHJjID0gMDsKIAogCXJjID0gcWVkX2ludF9zcF9kcGNfYWxsb2MocF9od2ZuKTsKLQlpZiAocmMpIHsKLQkJRFBfRVJSKHBfaHdmbi0+Y2RldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzcCBkcGMgbWVtXG4iKTsKKwlpZiAocmMpCiAJCXJldHVybiByYzsKLQl9CisKIAlyYyA9IHFlZF9pbnRfc3Bfc2JfYWxsb2MocF9od2ZuLCBwX3B0dCk7Ci0JaWYgKHJjKSB7Ci0JCURQX0VSUihwX2h3Zm4tPmNkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgc3Agc2IgbWVtXG4iKTsKKwlpZiAocmMpCiAJCXJldHVybiByYzsKLQl9CisKIAlyYyA9IHFlZF9pbnRfc2JfYXR0bl9hbGxvYyhwX2h3Zm4sIHBfcHR0KTsKLQlpZiAocmMpIHsKLQkJRFBfRVJSKHBfaHdmbi0+Y2RldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzYiBhdHRuIG1lbVxuIik7Ci0JCXJldHVybiByYzsKLQl9CisKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTMxODMsOCArMzEzMyw3IEBACiAJcWVkX2ludF9zcF9kcGNfZnJlZShwX2h3Zm4pOwogfQogCi12b2lkIHFlZF9pbnRfc2V0dXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3ZvaWQgcWVkX2ludF9zZXR1cChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCXFlZF9pbnRfc2Jfc2V0dXAocF9od2ZuLCBwX3B0dCwgJnBfaHdmbi0+cF9zcF9zYi0+c2JfaW5mbyk7CiAJcWVkX2ludF9zYl9hdHRuX3NldHVwKHBfaHdmbiwgcF9wdHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfbDIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2wyLmMKaW5kZXggNDAxZTczOC4uZGRkNDEwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfbDIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9sMi5jCkBAIC01Miw3ICs1Miw3IEBACiAJdTE2IHJ4X21vZGUgPSAwOwogCiAJcmMgPSBxZWRfZndfdnBvcnQocF9od2ZuLCBwX3BhcmFtcy0+dnBvcnRfaWQsICZhYnNfdnBvcnRfaWQpOwotCWlmIChyYyAhPSAwKQorCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCiAJbWVtc2V0KCZpbml0X2RhdGEsIDAsIHNpemVvZihpbml0X2RhdGEpKTsKQEAgLTgwLDggKzgwLDcgQEAKIAlwX3JhbXJvZC0+cnhfbW9kZS5zdGF0ZSA9IGNwdV90b19sZTE2KHJ4X21vZGUpOwogCiAJLyogVFBBIHJlbGF0ZWQgZmllbGRzICovCi0JbWVtc2V0KCZwX3JhbXJvZC0+dHBhX3BhcmFtLCAwLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGV0aF92cG9ydF90cGFfcGFyYW0pKTsKKwltZW1zZXQoJnBfcmFtcm9kLT50cGFfcGFyYW0sIDAsIHNpemVvZihzdHJ1Y3QgZXRoX3Zwb3J0X3RwYV9wYXJhbSkpOwogCiAJcF9yYW1yb2QtPnRwYV9wYXJhbS5tYXhfYnVmZl9udW0gPSBwX3BhcmFtcy0+bWF4X2J1ZmZlcnNfcGVyX2NxZTsKIApAQCAtMTAyLDYgKzEwMSw5IEBACiAKIAlwX3JhbXJvZC0+dHhfc3dpdGNoaW5nX2VuID0gcF9wYXJhbXMtPnR4X3N3aXRjaGluZzsKIAorCXBfcmFtcm9kLT5jdGxfZnJhbWVfbWFjX2NoZWNrX2VuID0gISFwX3BhcmFtcy0+Y2hlY2tfbWFjOworCXBfcmFtcm9kLT5jdGxfZnJhbWVfZXRodHlwZV9jaGVja19lbiA9ICEhcF9wYXJhbXMtPmNoZWNrX2V0aHR5cGU7CisKIAkvKiBTb2Z0d2FyZSBGdW5jdGlvbiBJRCBpbiBod2ZuIChQRnMgYXJlIDAgLSAxNSwgVkZzIGFyZSAxNiAtIDEzNSkgKi8KIAlwX3JhbXJvZC0+c3dfZmlkID0gcWVkX2NvbmNyZXRlX3RvX3N3X2ZpZChwX2h3Zm4tPmNkZXYsCiAJCQkJCQkgIHBfcGFyYW1zLT5jb25jcmV0ZV9maWQpOwpAQCAtMTA5LDggKzExMSw4IEBACiAJcmV0dXJuIHFlZF9zcHFfcG9zdChwX2h3Zm4sIHBfZW50LCBOVUxMKTsKIH0KIAotaW50IHFlZF9zcF92cG9ydF9zdGFydChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICAgICAgIHN0cnVjdCBxZWRfc3BfdnBvcnRfc3RhcnRfcGFyYW1zICpwX3BhcmFtcykKK3N0YXRpYyBpbnQgcWVkX3NwX3Zwb3J0X3N0YXJ0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICAgc3RydWN0IHFlZF9zcF92cG9ydF9zdGFydF9wYXJhbXMgKnBfcGFyYW1zKQogewogCWlmIChJU19WRihwX2h3Zm4tPmNkZXYpKSB7CiAJCXJldHVybiBxZWRfdmZfcGZfdnBvcnRfc3RhcnQocF9od2ZuLCBwX3BhcmFtcy0+dnBvcnRfaWQsCkBAIC0zMDYsMTQgKzMwOCwxNCBAQAogCW1lbXNldCgmcF9yYW1yb2QtPmFwcHJveF9tY2FzdC5iaW5zLCAwLAogCSAgICAgICBzaXplb2YocF9yYW1yb2QtPmFwcHJveF9tY2FzdC5iaW5zKSk7CiAKLQlpZiAocF9wYXJhbXMtPnVwZGF0ZV9hcHByb3hfbWNhc3RfZmxnKSB7Ci0JCXBfcmFtcm9kLT5jb21tb24udXBkYXRlX2FwcHJveF9tY2FzdF9mbGcgPSAxOwotCQlmb3IgKGkgPSAwOyBpIDwgRVRIX01VTFRJQ0FTVF9NQUNfQklOU19JTl9SRUdTOyBpKyspIHsKLQkJCXUzMiAqcF9iaW5zID0gKHUzMiAqKXBfcGFyYW1zLT5iaW5zOwotCQkJX19sZTMyIHZhbCA9IGNwdV90b19sZTMyKHBfYmluc1tpXSk7CisJaWYgKCFwX3BhcmFtcy0+dXBkYXRlX2FwcHJveF9tY2FzdF9mbGcpCisJCXJldHVybjsKIAotCQkJcF9yYW1yb2QtPmFwcHJveF9tY2FzdC5iaW5zW2ldID0gdmFsOwotCQl9CisJcF9yYW1yb2QtPmNvbW1vbi51cGRhdGVfYXBwcm94X21jYXN0X2ZsZyA9IDE7CisJZm9yIChpID0gMDsgaSA8IEVUSF9NVUxUSUNBU1RfTUFDX0JJTlNfSU5fUkVHUzsgaSsrKSB7CisJCXUzMiAqcF9iaW5zID0gKHUzMiAqKXBfcGFyYW1zLT5iaW5zOworCisJCXBfcmFtcm9kLT5hcHByb3hfbWNhc3QuYmluc1tpXSA9IGNwdV90b19sZTMyKHBfYmluc1tpXSk7CiAJfQogfQogCkBAIC0zMzYsNyArMzM4LDcgQEAKIAl9CiAKIAlyYyA9IHFlZF9md192cG9ydChwX2h3Zm4sIHBfcGFyYW1zLT52cG9ydF9pZCwgJmFic192cG9ydF9pZCk7Ci0JaWYgKHJjICE9IDApCisJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKIAltZW1zZXQoJmluaXRfZGF0YSwgMCwgc2l6ZW9mKGluaXRfZGF0YSkpOwpAQCAtMzYxLDggKzM2Myw4IEBACiAJcF9jbW4tPnR4X2FjdGl2ZV9mbGcgPSBwX3BhcmFtcy0+dnBvcnRfYWN0aXZlX3R4X2ZsZzsKIAlwX2Ntbi0+dXBkYXRlX3R4X2FjdGl2ZV9mbGcgPSBwX3BhcmFtcy0+dXBkYXRlX3Zwb3J0X2FjdGl2ZV90eF9mbGc7CiAJcF9jbW4tPmFjY2VwdF9hbnlfdmxhbiA9IHBfcGFyYW1zLT5hY2NlcHRfYW55X3ZsYW47Ci0JcF9jbW4tPnVwZGF0ZV9hY2NlcHRfYW55X3ZsYW5fZmxnID0KLQkJCXBfcGFyYW1zLT51cGRhdGVfYWNjZXB0X2FueV92bGFuX2ZsZzsKKwl2YWwgPSBwX3BhcmFtcy0+dXBkYXRlX2FjY2VwdF9hbnlfdmxhbl9mbGc7CisJcF9jbW4tPnVwZGF0ZV9hY2NlcHRfYW55X3ZsYW5fZmxnID0gdmFsOwogCiAJcF9jbW4tPmlubmVyX3ZsYW5fcmVtb3ZhbF9lbiA9IHBfcGFyYW1zLT5pbm5lcl92bGFuX3JlbW92YWxfZmxnOwogCXZhbCA9IHBfcGFyYW1zLT51cGRhdGVfaW5uZXJfdmxhbl9yZW1vdmFsX2ZsZzsKQEAgLTQxMSw3ICs0MTMsNyBAQAogCQlyZXR1cm4gcWVkX3ZmX3BmX3Zwb3J0X3N0b3AocF9od2ZuKTsKIAogCXJjID0gcWVkX2Z3X3Zwb3J0KHBfaHdmbiwgdnBvcnRfaWQsICZhYnNfdnBvcnRfaWQpOwotCWlmIChyYyAhPSAwKQorCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCiAJbWVtc2V0KCZpbml0X2RhdGEsIDAsIHNpemVvZihpbml0X2RhdGEpKTsKQEAgLTQ3Niw3ICs0NzgsNyBAQAogCiAJCXJjID0gcWVkX3NwX3Zwb3J0X3VwZGF0ZShwX2h3Zm4sICZ2cG9ydF91cGRhdGVfcGFyYW1zLAogCQkJCQkgY29tcF9tb2RlLCBwX2NvbXBfZGF0YSk7Ci0JCWlmIChyYyAhPSAwKSB7CisJCWlmIChyYykgewogCQkJRFBfRVJSKGNkZXYsICJVcGRhdGUgcnhfbW9kZSBmYWlsZWQgJWRcbiIsIHJjKTsKIAkJCXJldHVybiByYzsKIAkJfQpAQCAtNTExLDExICs1MTMsMTIgQEAKIGludCBxZWRfc3BfZXRoX3J4cV9zdGFydF9yYW1yb2Qoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCQkJdTE2IG9wYXF1ZV9maWQsCiAJCQkJdTMyIGNpZCwKLQkJCQlzdHJ1Y3QgcWVkX3F1ZXVlX3N0YXJ0X2NvbW1vbl9wYXJhbXMgKnBhcmFtcywKKwkJCQlzdHJ1Y3QgcWVkX3F1ZXVlX3N0YXJ0X2NvbW1vbl9wYXJhbXMgKnBfcGFyYW1zLAogCQkJCXU4IHN0YXRzX2lkLAogCQkJCXUxNiBiZF9tYXhfYnl0ZXMsCiAJCQkJZG1hX2FkZHJfdCBiZF9jaGFpbl9waHlzX2FkZHIsCi0JCQkJZG1hX2FkZHJfdCBjcWVfcGJsX2FkZHIsIHUxNiBjcWVfcGJsX3NpemUpCisJCQkJZG1hX2FkZHJfdCBjcWVfcGJsX2FkZHIsCisJCQkJdTE2IGNxZV9wYmxfc2l6ZSwgYm9vbCBiX3VzZV96b25lX2FfcHJvZCkKIHsKIAlzdHJ1Y3QgcnhfcXVldWVfc3RhcnRfcmFtcm9kX2RhdGEgKnBfcmFtcm9kID0gTlVMTDsKIAlzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQgPSBOVUxMOwpAQCAtNTI2LDIzICs1MjksMjMgQEAKIAlpbnQgcmMgPSAtRUlOVkFMOwogCiAJLyogU3RvcmUgaW5mb3JtYXRpb24gZm9yIHRoZSBzdG9wICovCi0JcF9yeF9jaWQJCT0gJnBfaHdmbi0+cF9yeF9jaWRzW3BhcmFtcy0+cXVldWVfaWRdOwotCXBfcnhfY2lkLT5jaWQJCT0gY2lkOwotCXBfcnhfY2lkLT5vcGFxdWVfZmlkCT0gb3BhcXVlX2ZpZDsKLQlwX3J4X2NpZC0+dnBvcnRfaWQJPSBwYXJhbXMtPnZwb3J0X2lkOworCXBfcnhfY2lkID0gJnBfaHdmbi0+cF9yeF9jaWRzW3BfcGFyYW1zLT5xdWV1ZV9pZF07CisJcF9yeF9jaWQtPmNpZCA9IGNpZDsKKwlwX3J4X2NpZC0+b3BhcXVlX2ZpZCA9IG9wYXF1ZV9maWQ7CisJcF9yeF9jaWQtPnZwb3J0X2lkID0gcF9wYXJhbXMtPnZwb3J0X2lkOwogCi0JcmMgPSBxZWRfZndfdnBvcnQocF9od2ZuLCBwYXJhbXMtPnZwb3J0X2lkLCAmYWJzX3Zwb3J0X2lkKTsKLQlpZiAocmMgIT0gMCkKKwlyYyA9IHFlZF9md192cG9ydChwX2h3Zm4sIHBfcGFyYW1zLT52cG9ydF9pZCwgJmFic192cG9ydF9pZCk7CisJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlyYyA9IHFlZF9md19sMl9xdWV1ZShwX2h3Zm4sIHBhcmFtcy0+cXVldWVfaWQsICZhYnNfcnhfcV9pZCk7Ci0JaWYgKHJjICE9IDApCisJcmMgPSBxZWRfZndfbDJfcXVldWUocF9od2ZuLCBwX3BhcmFtcy0+cXVldWVfaWQsICZhYnNfcnhfcV9pZCk7CisJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKIAlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19TUCwKIAkJICAgIm9wYXF1ZV9maWQ9MHgleCwgY2lkPTB4JXgsIHJ4X3FpZD0weCV4LCB2cG9ydF9pZD0weCV4LCBzYl9pZD0weCV4XG4iLAotCQkgICBvcGFxdWVfZmlkLCBjaWQsIHBhcmFtcy0+cXVldWVfaWQsIHBhcmFtcy0+dnBvcnRfaWQsCi0JCSAgIHBhcmFtcy0+c2IpOworCQkgICBvcGFxdWVfZmlkLAorCQkgICBjaWQsIHBfcGFyYW1zLT5xdWV1ZV9pZCwgcF9wYXJhbXMtPnZwb3J0X2lkLCBwX3BhcmFtcy0+c2IpOwogCiAJLyogR2V0IFNQUSBlbnRyeSAqLwogCW1lbXNldCgmaW5pdF9kYXRhLCAwLCBzaXplb2YoaW5pdF9kYXRhKSk7CkBAIC01NTgsMjQgKzU2MSwyOCBAQAogCiAJcF9yYW1yb2QgPSAmcF9lbnQtPnJhbXJvZC5yeF9xdWV1ZV9zdGFydDsKIAotCXBfcmFtcm9kLT5zYl9pZAkJCT0gY3B1X3RvX2xlMTYocGFyYW1zLT5zYik7Ci0JcF9yYW1yb2QtPnNiX2luZGV4CQk9IHBhcmFtcy0+c2JfaWR4OwotCXBfcmFtcm9kLT52cG9ydF9pZAkJPSBhYnNfdnBvcnRfaWQ7Ci0JcF9yYW1yb2QtPnN0YXRzX2NvdW50ZXJfaWQJPSBzdGF0c19pZDsKLQlwX3JhbXJvZC0+cnhfcXVldWVfaWQJCT0gY3B1X3RvX2xlMTYoYWJzX3J4X3FfaWQpOwotCXBfcmFtcm9kLT5jb21wbGV0ZV9jcWVfZmxnCT0gMDsKLQlwX3JhbXJvZC0+Y29tcGxldGVfZXZlbnRfZmxnCT0gMTsKKwlwX3JhbXJvZC0+c2JfaWQgPSBjcHVfdG9fbGUxNihwX3BhcmFtcy0+c2IpOworCXBfcmFtcm9kLT5zYl9pbmRleCA9IHBfcGFyYW1zLT5zYl9pZHg7CisJcF9yYW1yb2QtPnZwb3J0X2lkID0gYWJzX3Zwb3J0X2lkOworCXBfcmFtcm9kLT5zdGF0c19jb3VudGVyX2lkID0gc3RhdHNfaWQ7CisJcF9yYW1yb2QtPnJ4X3F1ZXVlX2lkID0gY3B1X3RvX2xlMTYoYWJzX3J4X3FfaWQpOworCXBfcmFtcm9kLT5jb21wbGV0ZV9jcWVfZmxnID0gMDsKKwlwX3JhbXJvZC0+Y29tcGxldGVfZXZlbnRfZmxnID0gMTsKIAotCXBfcmFtcm9kLT5iZF9tYXhfYnl0ZXMJPSBjcHVfdG9fbGUxNihiZF9tYXhfYnl0ZXMpOworCXBfcmFtcm9kLT5iZF9tYXhfYnl0ZXMgPSBjcHVfdG9fbGUxNihiZF9tYXhfYnl0ZXMpOwogCURNQV9SRUdQQUlSX0xFKHBfcmFtcm9kLT5iZF9iYXNlLCBiZF9jaGFpbl9waHlzX2FkZHIpOwogCi0JcF9yYW1yb2QtPm51bV9vZl9wYmxfcGFnZXMJPSBjcHVfdG9fbGUxNihjcWVfcGJsX3NpemUpOworCXBfcmFtcm9kLT5udW1fb2ZfcGJsX3BhZ2VzID0gY3B1X3RvX2xlMTYoY3FlX3BibF9zaXplKTsKIAlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+Y3FlX3BibF9hZGRyLCBjcWVfcGJsX2FkZHIpOwogCi0JcF9yYW1yb2QtPnZmX3J4X3Byb2RfaW5kZXggPSBwYXJhbXMtPnZmX3FpZDsKLQlpZiAocGFyYW1zLT52Zl9xaWQpCisJaWYgKHBfcGFyYW1zLT52Zl9xaWQgfHwgYl91c2Vfem9uZV9hX3Byb2QpIHsKKwkJcF9yYW1yb2QtPnZmX3J4X3Byb2RfaW5kZXggPSBwX3BhcmFtcy0+dmZfcWlkOwogCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19TUCwKLQkJCSAgICJRdWV1ZSBpcyBtZWFudCBmb3IgVkYgcnhxWyUwNHhdXG4iLCBwYXJhbXMtPnZmX3FpZCk7CisJCQkgICAiUXVldWUlcyBpcyBtZWFudCBmb3IgVkYgcnhxWyUwMnhdXG4iLAorCQkJICAgYl91c2Vfem9uZV9hX3Byb2QgPyAiIFtsZWdhY3ldIiA6ICIiLAorCQkJICAgcF9wYXJhbXMtPnZmX3FpZCk7CisJCXBfcmFtcm9kLT52Zl9yeF9wcm9kX3VzZV96b25lX2EgPSBiX3VzZV96b25lX2FfcHJvZDsKKwl9CiAKIAlyZXR1cm4gcWVkX3NwcV9wb3N0KHBfaHdmbiwgcF9lbnQsIE5VTEwpOwogfQpAQCAtNTgzLDcgKzU5MCw3IEBACiBzdGF0aWMgaW50CiBxZWRfc3BfZXRoX3J4X3F1ZXVlX3N0YXJ0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkJICB1MTYgb3BhcXVlX2ZpZCwKLQkJCSAgc3RydWN0IHFlZF9xdWV1ZV9zdGFydF9jb21tb25fcGFyYW1zICpwYXJhbXMsCisJCQkgIHN0cnVjdCBxZWRfcXVldWVfc3RhcnRfY29tbW9uX3BhcmFtcyAqcF9wYXJhbXMsCiAJCQkgIHUxNiBiZF9tYXhfYnl0ZXMsCiAJCQkgIGRtYV9hZGRyX3QgYmRfY2hhaW5fcGh5c19hZGRyLAogCQkJICBkbWFfYWRkcl90IGNxZV9wYmxfYWRkciwKQEAgLTU5NywyMCArNjA0LDIwIEBACiAKIAlpZiAoSVNfVkYocF9od2ZuLT5jZGV2KSkgewogCQlyZXR1cm4gcWVkX3ZmX3BmX3J4cV9zdGFydChwX2h3Zm4sCi0JCQkJCSAgIHBhcmFtcy0+cXVldWVfaWQsCi0JCQkJCSAgIHBhcmFtcy0+c2IsCi0JCQkJCSAgIHBhcmFtcy0+c2JfaWR4LAorCQkJCQkgICBwX3BhcmFtcy0+cXVldWVfaWQsCisJCQkJCSAgIHBfcGFyYW1zLT5zYiwKKwkJCQkJICAgKHU4KXBfcGFyYW1zLT5zYl9pZHgsCiAJCQkJCSAgIGJkX21heF9ieXRlcywKIAkJCQkJICAgYmRfY2hhaW5fcGh5c19hZGRyLAogCQkJCQkgICBjcWVfcGJsX2FkZHIsIGNxZV9wYmxfc2l6ZSwgcHBfcHJvZCk7CiAJfQogCi0JcmMgPSBxZWRfZndfbDJfcXVldWUocF9od2ZuLCBwYXJhbXMtPnF1ZXVlX2lkLCAmYWJzX2wyX3F1ZXVlKTsKLQlpZiAocmMgIT0gMCkKKwlyYyA9IHFlZF9md19sMl9xdWV1ZShwX2h3Zm4sIHBfcGFyYW1zLT5xdWV1ZV9pZCwgJmFic19sMl9xdWV1ZSk7CisJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlyYyA9IHFlZF9md192cG9ydChwX2h3Zm4sIHBhcmFtcy0+dnBvcnRfaWQsICZhYnNfc3RhdHNfaWQpOwotCWlmIChyYyAhPSAwKQorCXJjID0gcWVkX2Z3X3Zwb3J0KHBfaHdmbiwgcF9wYXJhbXMtPnZwb3J0X2lkLCAmYWJzX3N0YXRzX2lkKTsKKwlpZiAocmMpCiAJCXJldHVybiByYzsKIAogCSpwcF9wcm9kID0gKHU4IF9faW9tZW0gKilwX2h3Zm4tPnJlZ3ZpZXcgKwpAQCAtNjIyLDkgKzYyOSw4IEBACiAJCQkgICh1MzIgKikoJmluaXRfcHJvZF92YWwpKTsKIAogCS8qIEFsbG9jYXRlIGEgQ0lEIGZvciB0aGUgcXVldWUgKi8KLQlwX3J4X2NpZCA9ICZwX2h3Zm4tPnBfcnhfY2lkc1twYXJhbXMtPnF1ZXVlX2lkXTsKLQlyYyA9IHFlZF9jeHRfYWNxdWlyZV9jaWQocF9od2ZuLCBQUk9UT0NPTElEX0VUSCwKLQkJCQkgJnBfcnhfY2lkLT5jaWQpOworCXBfcnhfY2lkID0gJnBfaHdmbi0+cF9yeF9jaWRzW3BfcGFyYW1zLT5xdWV1ZV9pZF07CisJcmMgPSBxZWRfY3h0X2FjcXVpcmVfY2lkKHBfaHdmbiwgUFJPVE9DT0xJRF9FVEgsICZwX3J4X2NpZC0+Y2lkKTsKIAlpZiAocmMpIHsKIAkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhY3F1aXJlIGNpZFxuIik7CiAJCXJldHVybiByYzsKQEAgLTYzNCwxNCArNjQwLDEzIEBACiAJcmMgPSBxZWRfc3BfZXRoX3J4cV9zdGFydF9yYW1yb2QocF9od2ZuLAogCQkJCQkgb3BhcXVlX2ZpZCwKIAkJCQkJIHBfcnhfY2lkLT5jaWQsCi0JCQkJCSBwYXJhbXMsCisJCQkJCSBwX3BhcmFtcywKIAkJCQkJIGFic19zdGF0c19pZCwKIAkJCQkJIGJkX21heF9ieXRlcywKIAkJCQkJIGJkX2NoYWluX3BoeXNfYWRkciwKLQkJCQkJIGNxZV9wYmxfYWRkciwKLQkJCQkJIGNxZV9wYmxfc2l6ZSk7CisJCQkJCSBjcWVfcGJsX2FkZHIsIGNxZV9wYmxfc2l6ZSwgZmFsc2UpOwogCi0JaWYgKHJjICE9IDApCisJaWYgKHJjKQogCQlxZWRfc3BfcmVsZWFzZV9xdWV1ZV9jaWQocF9od2ZuLCBwX3J4X2NpZCk7CiAKIAlyZXR1cm4gcmM7CkBAIC03ODgsMjEgKzc5MywyMCBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcF9yYW1yb2QJCT0gJnBfZW50LT5yYW1yb2QudHhfcXVldWVfc3RhcnQ7Ci0JcF9yYW1yb2QtPnZwb3J0X2lkCT0gYWJzX3Zwb3J0X2lkOworCXBfcmFtcm9kID0gJnBfZW50LT5yYW1yb2QudHhfcXVldWVfc3RhcnQ7CisJcF9yYW1yb2QtPnZwb3J0X2lkID0gYWJzX3Zwb3J0X2lkOwogCi0JcF9yYW1yb2QtPnNiX2lkCQkJPSBjcHVfdG9fbGUxNihwX3BhcmFtcy0+c2IpOwotCXBfcmFtcm9kLT5zYl9pbmRleAkJPSBwX3BhcmFtcy0+c2JfaWR4OwotCXBfcmFtcm9kLT5zdGF0c19jb3VudGVyX2lkCT0gc3RhdHNfaWQ7CisJcF9yYW1yb2QtPnNiX2lkID0gY3B1X3RvX2xlMTYocF9wYXJhbXMtPnNiKTsKKwlwX3JhbXJvZC0+c2JfaW5kZXggPSBwX3BhcmFtcy0+c2JfaWR4OworCXBfcmFtcm9kLT5zdGF0c19jb3VudGVyX2lkID0gc3RhdHNfaWQ7CiAKLQlwX3JhbXJvZC0+cXVldWVfem9uZV9pZAkJPSBjcHVfdG9fbGUxNihhYnNfdHhfcV9pZCk7Ci0JcF9yYW1yb2QtPnBibF9zaXplCQk9IGNwdV90b19sZTE2KHBibF9zaXplKTsKKwlwX3JhbXJvZC0+cXVldWVfem9uZV9pZCA9IGNwdV90b19sZTE2KGFic190eF9xX2lkKTsKKworCXBfcmFtcm9kLT5wYmxfc2l6ZSA9IGNwdV90b19sZTE2KHBibF9zaXplKTsKIAlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+cGJsX2Jhc2VfYWRkciwgcGJsX2FkZHIpOwogCi0JcHFfaWQJCQk9IHFlZF9nZXRfcW1fcHEocF9od2ZuLAotCQkJCQkJUFJPVE9DT0xJRF9FVEgsCi0JCQkJCQlwX3BxX3BhcmFtcyk7Ci0JcF9yYW1yb2QtPnFtX3BxX2lkCT0gY3B1X3RvX2xlMTYocHFfaWQpOworCXBxX2lkID0gcWVkX2dldF9xbV9wcShwX2h3Zm4sIFBST1RPQ09MSURfRVRILCBwX3BxX3BhcmFtcyk7CisJcF9yYW1yb2QtPnFtX3BxX2lkID0gY3B1X3RvX2xlMTYocHFfaWQpOwogCiAJcmV0dXJuIHFlZF9zcHFfcG9zdChwX2h3Zm4sIHBfZW50LCBOVUxMKTsKIH0KQEAgLTgzNiw4ICs4NDAsNyBAQAogCW1lbXNldCgmcHFfcGFyYW1zLCAwLCBzaXplb2YocHFfcGFyYW1zKSk7CiAKIAkvKiBBbGxvY2F0ZSBhIENJRCBmb3IgdGhlIHF1ZXVlICovCi0JcmMgPSBxZWRfY3h0X2FjcXVpcmVfY2lkKHBfaHdmbiwgUFJPVE9DT0xJRF9FVEgsCi0JCQkJICZwX3R4X2NpZC0+Y2lkKTsKKwlyYyA9IHFlZF9jeHRfYWNxdWlyZV9jaWQocF9od2ZuLCBQUk9UT0NPTElEX0VUSCwgJnBfdHhfY2lkLT5jaWQpOwogCWlmIChyYykgewogCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFjcXVpcmUgY2lkXG4iKTsKIAkJcmV0dXJuIHJjOwpAQCAtODk2LDggKzg5OSw3IEBACiAJcmV0dXJuIHFlZF9zcF9yZWxlYXNlX3F1ZXVlX2NpZChwX2h3Zm4sIHBfdHhfY2lkKTsKIH0KIAotc3RhdGljIGVudW0gZXRoX2ZpbHRlcl9hY3Rpb24KLXFlZF9maWx0ZXJfYWN0aW9uKGVudW0gcWVkX2ZpbHRlcl9vcGNvZGUgb3Bjb2RlKQorc3RhdGljIGVudW0gZXRoX2ZpbHRlcl9hY3Rpb24gcWVkX2ZpbHRlcl9hY3Rpb24oZW51bSBxZWRfZmlsdGVyX29wY29kZSBvcGNvZGUpCiB7CiAJZW51bSBldGhfZmlsdGVyX2FjdGlvbiBhY3Rpb24gPSBNQVhfRVRIX0ZJTFRFUl9BQ1RJT047CiAKQEAgLTEwMzMsMTkgKzEwMzUsMTkgQEAKIAkJcF9maXJzdF9maWx0ZXItPnZuaSA9IGNwdV90b19sZTMyKHBfZmlsdGVyX2NtZC0+dm5pKTsKIAogCWlmIChwX2ZpbHRlcl9jbWQtPm9wY29kZSA9PSBRRURfRklMVEVSX01PVkUpIHsKLQkJcF9zZWNvbmRfZmlsdGVyLT50eXBlCQk9IHBfZmlyc3RfZmlsdGVyLT50eXBlOwotCQlwX3NlY29uZF9maWx0ZXItPm1hY19tc2IJPSBwX2ZpcnN0X2ZpbHRlci0+bWFjX21zYjsKLQkJcF9zZWNvbmRfZmlsdGVyLT5tYWNfbWlkCT0gcF9maXJzdF9maWx0ZXItPm1hY19taWQ7Ci0JCXBfc2Vjb25kX2ZpbHRlci0+bWFjX2xzYgk9IHBfZmlyc3RfZmlsdGVyLT5tYWNfbHNiOwotCQlwX3NlY29uZF9maWx0ZXItPnZsYW5faWQJPSBwX2ZpcnN0X2ZpbHRlci0+dmxhbl9pZDsKLQkJcF9zZWNvbmRfZmlsdGVyLT52bmkJCT0gcF9maXJzdF9maWx0ZXItPnZuaTsKKwkJcF9zZWNvbmRfZmlsdGVyLT50eXBlID0gcF9maXJzdF9maWx0ZXItPnR5cGU7CisJCXBfc2Vjb25kX2ZpbHRlci0+bWFjX21zYiA9IHBfZmlyc3RfZmlsdGVyLT5tYWNfbXNiOworCQlwX3NlY29uZF9maWx0ZXItPm1hY19taWQgPSBwX2ZpcnN0X2ZpbHRlci0+bWFjX21pZDsKKwkJcF9zZWNvbmRfZmlsdGVyLT5tYWNfbHNiID0gcF9maXJzdF9maWx0ZXItPm1hY19sc2I7CisJCXBfc2Vjb25kX2ZpbHRlci0+dmxhbl9pZCA9IHBfZmlyc3RfZmlsdGVyLT52bGFuX2lkOworCQlwX3NlY29uZF9maWx0ZXItPnZuaSA9IHBfZmlyc3RfZmlsdGVyLT52bmk7CiAKIAkJcF9maXJzdF9maWx0ZXItPmFjdGlvbiA9IEVUSF9GSUxURVJfQUNUSU9OX1JFTU9WRTsKIAogCQlwX2ZpcnN0X2ZpbHRlci0+dnBvcnRfaWQgPSB2cG9ydF90b19yZW1vdmVfZnJvbTsKIAotCQlwX3NlY29uZF9maWx0ZXItPmFjdGlvbgkJPSBFVEhfRklMVEVSX0FDVElPTl9BREQ7Ci0JCXBfc2Vjb25kX2ZpbHRlci0+dnBvcnRfaWQJPSB2cG9ydF90b19hZGRfdG87CisJCXBfc2Vjb25kX2ZpbHRlci0+YWN0aW9uID0gRVRIX0ZJTFRFUl9BQ1RJT05fQUREOworCQlwX3NlY29uZF9maWx0ZXItPnZwb3J0X2lkID0gdnBvcnRfdG9fYWRkX3RvOwogCX0gZWxzZSBpZiAocF9maWx0ZXJfY21kLT5vcGNvZGUgPT0gUUVEX0ZJTFRFUl9SRVBMQUNFKSB7CiAJCXBfZmlyc3RfZmlsdGVyLT52cG9ydF9pZCA9IHZwb3J0X3RvX2FkZF90bzsKIAkJbWVtY3B5KHBfc2Vjb25kX2ZpbHRlciwgcF9maXJzdF9maWx0ZXIsCkBAIC0xMDg2LDcgKzEwODgsNyBAQAogCXJjID0gcWVkX2ZpbHRlcl91Y2FzdF9jb21tb24ocF9od2ZuLCBvcGFxdWVfZmlkLCBwX2ZpbHRlcl9jbWQsCiAJCQkJICAgICAmcF9yYW1yb2QsICZwX2VudCwKIAkJCQkgICAgIGNvbXBfbW9kZSwgcF9jb21wX2RhdGEpOwotCWlmIChyYyAhPSAwKSB7CisJaWYgKHJjKSB7CiAJCURQX0VSUihwX2h3Zm4sICJVbmkuIGZpbHRlciBjb21tYW5kIGZhaWxlZCAlZFxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQpAQCAtMTA5NCwxMCArMTA5Niw4IEBACiAJcF9oZWFkZXItPmFzc2VydF9vbl9lcnJvciA9IHBfZmlsdGVyX2NtZC0+YXNzZXJ0X29uX2Vycm9yOwogCiAJcmMgPSBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgTlVMTCk7Ci0JaWYgKHJjICE9IDApIHsKLQkJRFBfRVJSKHBfaHdmbiwKLQkJICAgICAgICJVbmljYXN0IGZpbHRlciBBREQgY29tbWFuZCBmYWlsZWQgJWRcbiIsCi0JCSAgICAgICByYyk7CisJaWYgKHJjKSB7CisJCURQX0VSUihwX2h3Zm4sICJVbmljYXN0IGZpbHRlciBBREQgY29tbWFuZCBmYWlsZWQgJWRcbiIsIHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KIApAQCAtMTEzNiwxNSArMTEzNiwxMCBAQAogICogUmV0dXJuOgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB1MzIgcWVkX2NhbGNfY3JjMzJjKHU4ICpjcmMzMl9wYWNrZXQsCi0JCQkgICB1MzIgY3JjMzJfbGVuZ3RoLAotCQkJICAgdTMyIGNyYzMyX3NlZWQsCi0JCQkgICB1OCBjb21wbGVtZW50KQorCQkJICAgdTMyIGNyYzMyX2xlbmd0aCwgdTMyIGNyYzMyX3NlZWQsIHU4IGNvbXBsZW1lbnQpCiB7Ci0JdTMyIGJ5dGUgPSAwOwotCXUzMiBiaXQgPSAwOwotCXU4IG1zYiA9IDA7Ci0JdTggY3VycmVudF9ieXRlID0gMDsKLQl1MzIgY3JjMzJfcmVzdWx0ID0gY3JjMzJfc2VlZDsKKwl1MzIgYnl0ZSA9IDAsIGJpdCA9IDAsIGNyYzMyX3Jlc3VsdCA9IGNyYzMyX3NlZWQ7CisJdTggbXNiID0gMCwgY3VycmVudF9ieXRlID0gMDsKIAogCWlmICgoIWNyYzMyX3BhY2tldCkgfHwKIAkgICAgKGNyYzMyX2xlbmd0aCA9PSAwKSB8fApAQCAtMTE2NCw5ICsxMTU5LDcgQEAKIAlyZXR1cm4gY3JjMzJfcmVzdWx0OwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiBxZWRfY3JjMzJjX2xlKHUzMiBzZWVkLAotCQkJCXU4ICptYWMsCi0JCQkJdTMyIGxlbikKK3N0YXRpYyB1MzIgcWVkX2NyYzMyY19sZSh1MzIgc2VlZCwgdTggKm1hYywgdTMyIGxlbikKIHsKIAl1MzIgcGFja2V0X2J1ZlsyXSA9IHsgMCB9OwogCkBAIC0xMTk2LDE3ICsxMTg5LDE0IEBACiAJdTggYWJzX3Zwb3J0X2lkID0gMDsKIAlpbnQgcmMsIGk7CiAKLQlpZiAocF9maWx0ZXJfY21kLT5vcGNvZGUgPT0gUUVEX0ZJTFRFUl9BREQpIHsKKwlpZiAocF9maWx0ZXJfY21kLT5vcGNvZGUgPT0gUUVEX0ZJTFRFUl9BREQpCiAJCXJjID0gcWVkX2Z3X3Zwb3J0KHBfaHdmbiwgcF9maWx0ZXJfY21kLT52cG9ydF90b19hZGRfdG8sCiAJCQkJICAmYWJzX3Zwb3J0X2lkKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOwotCX0gZWxzZSB7CisJZWxzZQogCQlyYyA9IHFlZF9md192cG9ydChwX2h3Zm4sIHBfZmlsdGVyX2NtZC0+dnBvcnRfdG9fcmVtb3ZlX2Zyb20sCiAJCQkJICAmYWJzX3Zwb3J0X2lkKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOwotCX0KKwlpZiAocmMpCisJCXJldHVybiByYzsKIAogCS8qIEdldCBTUFEgZW50cnkgKi8KIAltZW1zZXQoJmluaXRfZGF0YSwgMCwgc2l6ZW9mKGluaXRfZGF0YSkpOwpAQCAtMTI0NCwxMSArMTIzNCwxMSBAQAogCiAJCS8qIENvbnZlcnQgdG8gY29ycmVjdCBlbmRpYW5pdHkgKi8KIAkJZm9yIChpID0gMDsgaSA8IEVUSF9NVUxUSUNBU1RfTUFDX0JJTlNfSU5fUkVHUzsgaSsrKSB7CisJCQlzdHJ1Y3QgdnBvcnRfdXBkYXRlX3JhbXJvZF9tY2FzdCAqcF9yYW1yb2RfYmluczsKIAkJCXUzMiAqcF9iaW5zID0gKHUzMiAqKWJpbnM7Ci0JCQlzdHJ1Y3QgdnBvcnRfdXBkYXRlX3JhbXJvZF9tY2FzdCAqYXBwcm94X21jYXN0OwogCi0JCQlhcHByb3hfbWNhc3QgPSAmcF9yYW1yb2QtPmFwcHJveF9tY2FzdDsKLQkJCWFwcHJveF9tY2FzdC0+Ymluc1tpXSA9IGNwdV90b19sZTMyKHBfYmluc1tpXSk7CisJCQlwX3JhbXJvZF9iaW5zID0gJnBfcmFtcm9kLT5hcHByb3hfbWNhc3Q7CisJCQlwX3JhbXJvZF9iaW5zLT5iaW5zW2ldID0gY3B1X3RvX2xlMzIocF9iaW5zW2ldKTsKIAkJfQogCX0KIApAQCAtMTI4Niw4ICsxMjc2LDcgQEAKIAkJcmMgPSBxZWRfc3BfZXRoX2ZpbHRlcl9tY2FzdChwX2h3Zm4sCiAJCQkJCSAgICAgb3BhcXVlX2ZpZCwKIAkJCQkJICAgICBwX2ZpbHRlcl9jbWQsCi0JCQkJCSAgICAgY29tcF9tb2RlLAotCQkJCQkgICAgIHBfY29tcF9kYXRhKTsKKwkJCQkJICAgICBjb21wX21vZGUsIHBfY29tcF9kYXRhKTsKIAl9CiAJcmV0dXJuIHJjOwogfQpAQCAtMTMxNCw5ICsxMzAzLDggQEAKIAkJcmMgPSBxZWRfc3BfZXRoX2ZpbHRlcl91Y2FzdChwX2h3Zm4sCiAJCQkJCSAgICAgb3BhcXVlX2ZpZCwKIAkJCQkJICAgICBwX2ZpbHRlcl9jbWQsCi0JCQkJCSAgICAgY29tcF9tb2RlLAotCQkJCQkgICAgIHBfY29tcF9kYXRhKTsKLQkJaWYgKHJjICE9IDApCisJCQkJCSAgICAgY29tcF9tb2RlLCBwX2NvbXBfZGF0YSk7CisJCWlmIChyYykKIAkJCWJyZWFrOwogCX0KIApAQCAtMTU5MCw4ICsxNTc4LDcgQEAKIAl9CiB9CiAKLXZvaWQgcWVkX2dldF92cG9ydF9zdGF0cyhzdHJ1Y3QgcWVkX2RldiAqY2RldiwKLQkJCSBzdHJ1Y3QgcWVkX2V0aF9zdGF0cyAqc3RhdHMpCit2b2lkIHFlZF9nZXRfdnBvcnRfc3RhdHMoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHN0cnVjdCBxZWRfZXRoX3N0YXRzICpzdGF0cykKIHsKIAl1MzIgaTsKIApAQCAtMTY5OCw2ICsxNjg1LDggQEAKIAkJcWVkX3ZmX2dldF9udW1fdmxhbl9maWx0ZXJzKCZjZGV2LT5od2Zuc1swXSwKIAkJCQkJICAgICZpbmZvLT5udW1fdmxhbl9maWx0ZXJzKTsKIAkJcWVkX3ZmX2dldF9wb3J0X21hYygmY2Rldi0+aHdmbnNbMF0sIGluZm8tPnBvcnRfbWFjKTsKKworCQlpbmZvLT5pc19sZWdhY3kgPSAhIWNkZXYtPmh3Zm5zWzBdLnZmX2lvdl9pbmZvLT5iX3ByZV9mcF9oc2k7CiAJfQogCiAJcWVkX2ZpbGxfZGV2X2luZm8oY2RldiwgJmluZm8tPmNvbW1vbik7CkBAIC0xNzY2LDggKzE3NTUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHFlZF9zdG9wX3Zwb3J0KHN0cnVjdCBxZWRfZGV2ICpjZGV2LAotCQkJICB1OCB2cG9ydF9pZCkKK3N0YXRpYyBpbnQgcWVkX3N0b3BfdnBvcnQoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHU4IHZwb3J0X2lkKQogewogCWludCByYywgaTsKIApAQCAtMTc3NSw4ICsxNzYzLDcgQEAKIAkJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4gPSAmY2Rldi0+aHdmbnNbaV07CiAKIAkJcmMgPSBxZWRfc3BfdnBvcnRfc3RvcChwX2h3Zm4sCi0JCQkJICAgICAgIHBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkLAotCQkJCSAgICAgICB2cG9ydF9pZCk7CisJCQkJICAgICAgIHBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkLCB2cG9ydF9pZCk7CiAKIAkJaWYgKHJjKSB7CiAJCQlEUF9FUlIoY2RldiwgIkZhaWxlZCB0byBzdG9wIFZQT1JUXG4iKTsKQEAgLTE4MDEsMTAgKzE3ODgsOCBAQAogCiAJLyogVHJhbnNsYXRlIHByb3RvY29sIHBhcmFtcyBpbnRvIHNwIHBhcmFtcyAqLwogCXNwX3BhcmFtcy52cG9ydF9pZCA9IHBhcmFtcy0+dnBvcnRfaWQ7Ci0Jc3BfcGFyYW1zLnVwZGF0ZV92cG9ydF9hY3RpdmVfcnhfZmxnID0KLQkJcGFyYW1zLT51cGRhdGVfdnBvcnRfYWN0aXZlX2ZsZzsKLQlzcF9wYXJhbXMudXBkYXRlX3Zwb3J0X2FjdGl2ZV90eF9mbGcgPQotCQlwYXJhbXMtPnVwZGF0ZV92cG9ydF9hY3RpdmVfZmxnOworCXNwX3BhcmFtcy51cGRhdGVfdnBvcnRfYWN0aXZlX3J4X2ZsZyA9IHBhcmFtcy0+dXBkYXRlX3Zwb3J0X2FjdGl2ZV9mbGc7CisJc3BfcGFyYW1zLnVwZGF0ZV92cG9ydF9hY3RpdmVfdHhfZmxnID0gcGFyYW1zLT51cGRhdGVfdnBvcnRfYWN0aXZlX2ZsZzsKIAlzcF9wYXJhbXMudnBvcnRfYWN0aXZlX3J4X2ZsZyA9IHBhcmFtcy0+dnBvcnRfYWN0aXZlX2ZsZzsKIAlzcF9wYXJhbXMudnBvcnRfYWN0aXZlX3R4X2ZsZyA9IHBhcmFtcy0+dnBvcnRfYWN0aXZlX2ZsZzsKIAlzcF9wYXJhbXMudXBkYXRlX3R4X3N3aXRjaGluZ19mbGcgPSBwYXJhbXMtPnVwZGF0ZV90eF9zd2l0Y2hpbmdfZmxnOwpAQCAtMTgxNyw4ICsxODAyLDcgQEAKIAkgKiBXZSBuZWVkIHRvIHJlLWZpeCB0aGUgcnNzIHZhbHVlcyBwZXIgZW5naW5lIGZvciBDTVQuCiAJICovCiAJaWYgKGNkZXYtPm51bV9od2ZucyA+IDEgJiYgcGFyYW1zLT51cGRhdGVfcnNzX2ZsZykgewotCQlzdHJ1Y3QgcWVkX3VwZGF0ZV92cG9ydF9yc3NfcGFyYW1zICpyc3MgPQotCQkJJnBhcmFtcy0+cnNzX3BhcmFtczsKKwkJc3RydWN0IHFlZF91cGRhdGVfdnBvcnRfcnNzX3BhcmFtcyAqcnNzID0gJnBhcmFtcy0+cnNzX3BhcmFtczsKIAkJaW50IGssIG1heCA9IDA7CiAKIAkJLyogRmluZCBsYXJnZXN0IGVudHJ5LCBzaW5jZSBpdCdzIHBvc3NpYmxlIFJTUyBuZWVkcyB0bwpAQCAtMTg2MSw4ICsxODQ1LDggQEAKIAkJICAgICAgIFFFRF9SU1NfSU5EX1RBQkxFX1NJWkUgKiBzaXplb2YodTE2KSk7CiAJCW1lbWNweShzcF9yc3NfcGFyYW1zLnJzc19rZXksIHBhcmFtcy0+cnNzX3BhcmFtcy5yc3Nfa2V5LAogCQkgICAgICAgUUVEX1JTU19LRVlfU0laRSAqIHNpemVvZih1MzIpKTsKKwkJc3BfcGFyYW1zLnJzc19wYXJhbXMgPSAmc3BfcnNzX3BhcmFtczsKIAl9Ci0Jc3BfcGFyYW1zLnJzc19wYXJhbXMgPSAmc3BfcnNzX3BhcmFtczsKIAogCWZvcl9lYWNoX2h3Zm4oY2RldiwgaSkgewogCQlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiA9ICZjZGV2LT5od2Zuc1tpXTsKQEAgLTE4OTMsOCArMTg3Nyw4IEBACiAJCQkgdTE2IGNxZV9wYmxfc2l6ZSwKIAkJCSB2b2lkIF9faW9tZW0gKipwcF9wcm9kKQogewotCWludCByYywgaHdmbl9pbmRleDsKIAlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbjsKKwlpbnQgcmMsIGh3Zm5faW5kZXg7CiAKIAlod2ZuX2luZGV4ID0gcGFyYW1zLT5yc3NfaWQgJSBjZGV2LT5udW1faHdmbnM7CiAJcF9od2ZuID0gJmNkZXYtPmh3Zm5zW2h3Zm5faW5kZXhdOwpAQCAtMTkzNSw4ICsxOTE5LDcgQEAKIAogCXJjID0gcWVkX3NwX2V0aF9yeF9xdWV1ZV9zdG9wKHBfaHdmbiwKIAkJCQkgICAgICBwYXJhbXMtPnJ4X3F1ZXVlX2lkIC8gY2Rldi0+bnVtX2h3Zm5zLAotCQkJCSAgICAgIHBhcmFtcy0+ZXFfY29tcGxldGlvbl9vbmx5LAotCQkJCSAgICAgIGZhbHNlKTsKKwkJCQkgICAgICBwYXJhbXMtPmVxX2NvbXBsZXRpb25fb25seSwgZmFsc2UpOwogCWlmIChyYykgewogCQlEUF9FUlIoY2RldiwgIkZhaWxlZCB0byBzdG9wIFJYUSMlZFxuIiwgcGFyYW1zLT5yeF9xdWV1ZV9pZCk7CiAJCXJldHVybiByYzsKQEAgLTIwNDcsMTEgKzIwMzAsMTEgQEAKIAogCW1lbXNldCgmYWNjZXB0X2ZsYWdzLCAwLCBzaXplb2YoYWNjZXB0X2ZsYWdzKSk7CiAKLQlhY2NlcHRfZmxhZ3MudXBkYXRlX3J4X21vZGVfY29uZmlnCT0gMTsKLQlhY2NlcHRfZmxhZ3MudXBkYXRlX3R4X21vZGVfY29uZmlnCT0gMTsKLQlhY2NlcHRfZmxhZ3MucnhfYWNjZXB0X2ZpbHRlcgkJPSBRRURfQUNDRVBUX1VDQVNUX01BVENIRUQgfAotCQkJCQkJICBRRURfQUNDRVBUX01DQVNUX01BVENIRUQgfAotCQkJCQkJICBRRURfQUNDRVBUX0JDQVNUOworCWFjY2VwdF9mbGFncy51cGRhdGVfcnhfbW9kZV9jb25maWcgPSAxOworCWFjY2VwdF9mbGFncy51cGRhdGVfdHhfbW9kZV9jb25maWcgPSAxOworCWFjY2VwdF9mbGFncy5yeF9hY2NlcHRfZmlsdGVyID0gUUVEX0FDQ0VQVF9VQ0FTVF9NQVRDSEVEIHwKKwkJCQkJUUVEX0FDQ0VQVF9NQ0FTVF9NQVRDSEVEIHwKKwkJCQkJUUVEX0FDQ0VQVF9CQ0FTVDsKIAlhY2NlcHRfZmxhZ3MudHhfYWNjZXB0X2ZpbHRlciA9IFFFRF9BQ0NFUFRfVUNBU1RfTUFUQ0hFRCB8CiAJCQkJCVFFRF9BQ0NFUFRfTUNBU1RfTUFUQ0hFRCB8CiAJCQkJCVFFRF9BQ0NFUFRfQkNBU1Q7CkBAIC0yMDcyLDkgKzIwNTUsOCBAQAogCXN0cnVjdCBxZWRfZmlsdGVyX3VjYXN0IHVjYXN0OwogCiAJaWYgKCFwYXJhbXMtPnZsYW5fdmFsaWQgJiYgIXBhcmFtcy0+bWFjX3ZhbGlkKSB7Ci0JCURQX05PVElDRSgKLQkJCWNkZXYsCi0JCQkiVHJpZWQgY29uZmlndXJpbmcgYSB1bmljYXN0IGZpbHRlciwgYnV0IGJvdGggTUFDIGFuZCBWTEFOIGFyZSBub3Qgc2V0XG4iKTsKKwkJRFBfTk9USUNFKGNkZXYsCisJCQkgICJUcmllZCBjb25maWd1cmluZyBhIHVuaWNhc3QgZmlsdGVyLCBidXQgYm90aCBNQUMgYW5kIFZMQU4gYXJlIG5vdCBzZXRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIxMzUsOCArMjExNyw3IEBACiAJZm9yIChpID0gMDsgaSA8IG1jYXN0Lm51bV9tY19hZGRyczsgaSsrKQogCQlldGhlcl9hZGRyX2NvcHkobWNhc3QubWFjW2ldLCBwYXJhbXMtPm1hY1tpXSk7CiAKLQlyZXR1cm4gcWVkX2ZpbHRlcl9tY2FzdF9jbWQoY2RldiwgJm1jYXN0LAotCQkJCSAgICBRRURfU1BRX01PREVfQ0IsIE5VTEwpOworCXJldHVybiBxZWRfZmlsdGVyX21jYXN0X2NtZChjZGV2LCAmbWNhc3QsIFFFRF9TUFFfTU9ERV9DQiwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbnQgcWVkX2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IHFlZF9kZXYgKmNkZXYsCkBAIC0yMTUzLDE1ICsyMTM0LDEzIEBACiAJCWFjY2VwdF9mbGFncyA9IHBhcmFtcy0+ZmlsdGVyLmFjY2VwdF9mbGFnczsKIAkJcmV0dXJuIHFlZF9jb25maWd1cmVfZmlsdGVyX3J4X21vZGUoY2RldiwgYWNjZXB0X2ZsYWdzKTsKIAlkZWZhdWx0OgotCQlEUF9OT1RJQ0UoY2RldiwgIlVua25vd24gZmlsdGVyIHR5cGUgJWRcbiIsCi0JCQkgIChpbnQpcGFyYW1zLT50eXBlKTsKKwkJRFBfTk9USUNFKGNkZXYsICJVbmtub3duIGZpbHRlciB0eXBlICVkXG4iLCAoaW50KXBhcmFtcy0+dHlwZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIH0KIAogc3RhdGljIGludCBxZWRfZnBfY3FlX2NvbXBsZXRpb24oc3RydWN0IHFlZF9kZXYgKmRldiwKLQkJCQkgdTggcnNzX2lkLAotCQkJCSBzdHJ1Y3QgZXRoX3Nsb3dfcGF0aF9yeF9jcWUgKmNxZSkKKwkJCQkgdTggcnNzX2lkLCBzdHJ1Y3QgZXRoX3Nsb3dfcGF0aF9yeF9jcWUgKmNxZSkKIHsKIAlyZXR1cm4gcWVkX2V0aF9jcWVfY29tcGxldGlvbigmZGV2LT5od2Zuc1tyc3NfaWQgJSBkZXYtPm51bV9od2Zuc10sCiAJCQkJICAgICAgY3FlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2wyLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9sMi5oCmluZGV4IDAwMjExNDUuLmU0OTVkNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2wyLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfbDIuaApAQCAtMTAyLDYgKzEwMiw4IEBACiAJdTE2IG9wYXF1ZV9maWQ7CiAJdTggdnBvcnRfaWQ7CiAJdTE2IG10dTsKKwlib29sIGNoZWNrX21hYzsKKwlib29sIGNoZWNrX2V0aHR5cGU7CiB9OwogCiBpbnQgcWVkX3NwX2V0aF92cG9ydF9zdGFydChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKQEAgLTIxMyw2ICsyMTUsOCBAQAogCQkJICAgIGVudW0gc3BxX21vZGUgY29tcF9tb2RlLAogCQkJICAgIHN0cnVjdCBxZWRfc3BxX2NvbXBfY2IgKnBfY29tcF9kYXRhKTsKIAordm9pZCBxZWRfZ2V0X3Zwb3J0X3N0YXRzKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBzdHJ1Y3QgcWVkX2V0aF9zdGF0cyAqc3RhdHMpOworCiBpbnQgcWVkX3NwX2V0aF92cG9ydF9zdGFydChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJCSAgIHN0cnVjdCBxZWRfc3BfdnBvcnRfc3RhcnRfcGFyYW1zICpwX3BhcmFtcyk7CiAKQEAgLTIyMyw3ICsyMjcsOCBAQAogCQkJCXU4IHN0YXRzX2lkLAogCQkJCXUxNiBiZF9tYXhfYnl0ZXMsCiAJCQkJZG1hX2FkZHJfdCBiZF9jaGFpbl9waHlzX2FkZHIsCi0JCQkJZG1hX2FkZHJfdCBjcWVfcGJsX2FkZHIsIHUxNiBjcWVfcGJsX3NpemUpOworCQkJCWRtYV9hZGRyX3QgY3FlX3BibF9hZGRyLAorCQkJCXUxNiBjcWVfcGJsX3NpemUsIGJvb2wgYl91c2Vfem9uZV9hX3Byb2QpOwogCiBpbnQgcWVkX3NwX2V0aF90eHFfc3RhcnRfcmFtcm9kKHN0cnVjdCBxZWRfaHdmbiAgKnBfaHdmbiwKIAkJCQl1MTYgIG9wYXF1ZV9maWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9sbDIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2xsMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZGIxMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9sbDIuYwpAQCAtMCwwICsxLDE3OTIgQEAKKy8qIFFMb2dpYyBxZWQgTklDIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBRTG9naWMgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCisgKiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3FlZC9xZWRfbGwyX2lmLmg+CisjaW5jbHVkZSAicWVkLmgiCisjaW5jbHVkZSAicWVkX2N4dC5oIgorI2luY2x1ZGUgInFlZF9kZXZfYXBpLmgiCisjaW5jbHVkZSAicWVkX2hzaS5oIgorI2luY2x1ZGUgInFlZF9ody5oIgorI2luY2x1ZGUgInFlZF9pbnQuaCIKKyNpbmNsdWRlICJxZWRfbGwyLmgiCisjaW5jbHVkZSAicWVkX21jcC5oIgorI2luY2x1ZGUgInFlZF9yZWdfYWRkci5oIgorI2luY2x1ZGUgInFlZF9zcC5oIgorCisjZGVmaW5lIFFFRF9MTDJfUlhfUkVHSVNURVJFRChsbDIpCSgobGwyKS0+cnhfcXVldWUuYl9jYl9yZWdpc3RyZWQpCisjZGVmaW5lIFFFRF9MTDJfVFhfUkVHSVNURVJFRChsbDIpCSgobGwyKS0+dHhfcXVldWUuYl9jYl9yZWdpc3RyZWQpCisKKyNkZWZpbmUgUUVEX0xMMl9UWF9TSVpFICgyNTYpCisjZGVmaW5lIFFFRF9MTDJfUlhfU0laRSAoNDA5NikKKworc3RydWN0IHFlZF9jYl9sbDJfaW5mbyB7CisJaW50IHJ4X2NudDsKKwl1MzIgcnhfc2l6ZTsKKwl1OCBoYW5kbGU7CisJYm9vbCBmcmFnc19tYXBwZWQ7CisKKwkvKiBMb2NrIHByb3RlY3RpbmcgTEwyIGJ1ZmZlciBsaXN0cyBpbiBzbGVlcGxlc3MgY29udGV4dCAqLworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwljb25zdCBzdHJ1Y3QgcWVkX2xsMl9jYl9vcHMgKmNiczsKKwl2b2lkICpjYl9jb29raWU7Cit9OworCitzdHJ1Y3QgcWVkX2xsMl9idWZmZXIgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl2b2lkICpkYXRhOworCWRtYV9hZGRyX3QgcGh5c19hZGRyOworfTsKKworc3RhdGljIHZvaWQgcWVkX2xsMmJfY29tcGxldGVfdHhfcGFja2V0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQl1OCBjb25uZWN0aW9uX2hhbmRsZSwKKwkJCQkJdm9pZCAqY29va2llLAorCQkJCQlkbWFfYWRkcl90IGZpcnN0X2ZyYWdfYWRkciwKKwkJCQkJYm9vbCBiX2xhc3RfZnJhZ21lbnQsCisJCQkJCWJvb2wgYl9sYXN0X3BhY2tldCkKK3sKKwlzdHJ1Y3QgcWVkX2RldiAqY2RldiA9IHBfaHdmbi0+Y2RldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gY29va2llOworCisJLyogQWxsIHdlIG5lZWQgdG8gZG8gaXMgcmVsZWFzZSB0aGUgbWFwcGluZyAqLworCWRtYV91bm1hcF9zaW5nbGUoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LCBmaXJzdF9mcmFnX2FkZHIsCisJCQkgc2tiX2hlYWRsZW4oc2tiKSwgRE1BX1RPX0RFVklDRSk7CisKKwlpZiAoY2Rldi0+bGwyLT5jYnMgJiYgY2Rldi0+bGwyLT5jYnMtPnR4X2NiKQorCQljZGV2LT5sbDItPmNicy0+dHhfY2IoY2Rldi0+bGwyLT5jYl9jb29raWUsIHNrYiwKKwkJCQkgICAgICBiX2xhc3RfZnJhZ21lbnQpOworCisJaWYgKGNkZXYtPmxsMi0+ZnJhZ3NfbWFwcGVkKQorCQkvKiBDYXNlIHdoZXJlIG1hcHBlZCBmcmFncyB3ZXJlIHJlY2VpdmVkLCBuZWVkIHRvCisJCSAqIGZyZWUgc2tiIHdpdGggbnJfZnJhZ3MgbWFya2VkIGFzIDAKKwkJICovCisJCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSAwOworCisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKK30KKworc3RhdGljIGludCBxZWRfbGwyX2FsbG9jX2J1ZmZlcihzdHJ1Y3QgcWVkX2RldiAqY2RldiwKKwkJCQl1OCAqKmRhdGEsIGRtYV9hZGRyX3QgKnBoeXNfYWRkcikKK3sKKwkqZGF0YSA9IGttYWxsb2MoY2Rldi0+bGwyLT5yeF9zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoISgqZGF0YSkpIHsKKwkJRFBfSU5GTyhjZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIExMMiBidWZmZXIgZGF0YVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCSpwaHlzX2FkZHIgPSBkbWFfbWFwX3NpbmdsZSgmY2Rldi0+cGRldi0+ZGV2LAorCQkJCSAgICAoKCpkYXRhKSArIE5FVF9TS0JfUEFEKSwKKwkJCQkgICAgY2Rldi0+bGwyLT5yeF9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcigmY2Rldi0+cGRldi0+ZGV2LCAqcGh5c19hZGRyKSkgeworCQlEUF9JTkZPKGNkZXYsICJGYWlsZWQgdG8gbWFwIExMMiBidWZmZXIgZGF0YVxuIik7CisJCWtmcmVlKCgqZGF0YSkpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxZWRfbGwyX2RlYWxsb2NfYnVmZmVyKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJCSBzdHJ1Y3QgcWVkX2xsMl9idWZmZXIgKmJ1ZmZlcikKK3sKKwlzcGluX2xvY2tfYmgoJmNkZXYtPmxsMi0+bG9jayk7CisKKwlkbWFfdW5tYXBfc2luZ2xlKCZjZGV2LT5wZGV2LT5kZXYsIGJ1ZmZlci0+cGh5c19hZGRyLAorCQkJIGNkZXYtPmxsMi0+cnhfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKKwlrZnJlZShidWZmZXItPmRhdGEpOworCWxpc3RfZGVsKCZidWZmZXItPmxpc3QpOworCisJY2Rldi0+bGwyLT5yeF9jbnQtLTsKKwlpZiAoIWNkZXYtPmxsMi0+cnhfY250KQorCQlEUF9JTkZPKGNkZXYsICJBbGwgTEwyIGVudHJpZXMgd2VyZSByZW1vdmVkXG4iKTsKKworCXNwaW5fdW5sb2NrX2JoKCZjZGV2LT5sbDItPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHFlZF9sbDJfa2lsbF9idWZmZXJzKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCXN0cnVjdCBxZWRfbGwyX2J1ZmZlciAqYnVmZmVyLCAqdG1wX2J1ZmZlcjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShidWZmZXIsIHRtcF9idWZmZXIsICZjZGV2LT5sbDItPmxpc3QsIGxpc3QpCisJCXFlZF9sbDJfZGVhbGxvY19idWZmZXIoY2RldiwgYnVmZmVyKTsKK30KKwordm9pZCBxZWRfbGwyYl9jb21wbGV0ZV9yeF9wYWNrZXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJIHU4IGNvbm5lY3Rpb25faGFuZGxlLAorCQkJCSBzdHJ1Y3QgcWVkX2xsMl9yeF9wYWNrZXQgKnBfcGt0LAorCQkJCSBzdHJ1Y3QgY29yZV9yeF9mYXN0X3BhdGhfY3FlICpwX2NxZSwKKwkJCQkgYm9vbCBiX2xhc3RfcGFja2V0KQoreworCXUxNiBwYWNrZXRfbGVuZ3RoID0gbGUxNl90b19jcHUocF9jcWUtPnBhY2tldF9sZW5ndGgpOworCXN0cnVjdCBxZWRfbGwyX2J1ZmZlciAqYnVmZmVyID0gcF9wa3QtPmNvb2tpZTsKKwlzdHJ1Y3QgcWVkX2RldiAqY2RldiA9IHBfaHdmbi0+Y2RldjsKKwl1MTYgdmxhbiA9IGxlMTZfdG9fY3B1KHBfY3FlLT52bGFuKTsKKwl1MzIgb3BhcXVlX2RhdGFfMCwgb3BhcXVlX2RhdGFfMTsKKwl1OCBwYWQgPSBwX2NxZS0+cGxhY2VtZW50X29mZnNldDsKKwlkbWFfYWRkcl90IG5ld19waHlzX2FkZHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlib29sIHJldXNlID0gZmFsc2U7CisJaW50IHJjID0gLUVJTlZBTDsKKwl1OCAqbmV3X2RhdGE7CisKKwlvcGFxdWVfZGF0YV8wID0gbGUzMl90b19jcHUocF9jcWUtPm9wYXF1ZV9kYXRhLmRhdGFbMF0pOworCW9wYXF1ZV9kYXRhXzEgPSBsZTMyX3RvX2NwdShwX2NxZS0+b3BhcXVlX2RhdGEuZGF0YVsxXSk7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwKKwkJICAgKE5FVElGX01TR19SWF9TVEFUVVMgfCBRRURfTVNHX1NUT1JBR0UgfCBORVRJRl9NU0dfUEtUREFUQSksCisJCSAgICJHb3QgYW4gTEwyIFJ4IGNvbXBsZXRpb246IFtCdWZmZXIgYXQgcGh5cyAweCVsbHgsIG9mZnNldCAweCUwMnhdIExlbmd0aCAweCUwNHggUGFyc2VfZmxhZ3MgMHglMDR4IHZsYW4gMHglMDR4IE9wYXF1ZSBkYXRhIFsweCUwOHg6MHglMDh4XVxuIiwKKwkJICAgKHU2NClwX3BrdC0+cnhfYnVmX2FkZHIsIHBhZCwgcGFja2V0X2xlbmd0aCwKKwkJICAgbGUxNl90b19jcHUocF9jcWUtPnBhcnNlX2ZsYWdzLmZsYWdzKSwgdmxhbiwKKwkJICAgb3BhcXVlX2RhdGFfMCwgb3BhcXVlX2RhdGFfMSk7CisKKwlpZiAoKGNkZXYtPmRwX21vZHVsZSAmIE5FVElGX01TR19QS1REQVRBKSAmJiBidWZmZXItPmRhdGEpIHsKKwkJcHJpbnRfaGV4X2R1bXAoS0VSTl9JTkZPLCAiIiwKKwkJCSAgICAgICBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCAxLAorCQkJICAgICAgIGJ1ZmZlci0+ZGF0YSwgcGFja2V0X2xlbmd0aCwgZmFsc2UpOworCX0KKworCS8qIERldGVybWluZSBpZiBkYXRhIGlzIHZhbGlkICovCisJaWYgKHBhY2tldF9sZW5ndGggPCBFVEhfSExFTikKKwkJcmV1c2UgPSB0cnVlOworCisJLyogQWxsb2NhdGUgYSByZXBsYWNlbWVudCBmb3IgYnVmZmVyOyBSZXVzZSB1cG9uIGZhaWx1cmUgKi8KKwlpZiAoIXJldXNlKQorCQlyYyA9IHFlZF9sbDJfYWxsb2NfYnVmZmVyKHBfaHdmbi0+Y2RldiwgJm5ld19kYXRhLAorCQkJCQkgICZuZXdfcGh5c19hZGRyKTsKKworCS8qIElmIG5lZWQgdG8gcmV1c2Ugb3IgdGhlcmUncyBubyByZXBsYWNlbWVudCBidWZmZXIsIHJlcG9zdCB0aGlzICovCisJaWYgKHJjKQorCQlnb3RvIG91dF9wb3N0OworCisJc2tiID0gYnVpbGRfc2tiKGJ1ZmZlci0+ZGF0YSwgMCk7CisJaWYgKCFza2IpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9wb3N0OworCX0KKworCXBhZCArPSBORVRfU0tCX1BBRDsKKwlza2JfcmVzZXJ2ZShza2IsIHBhZCk7CisJc2tiX3B1dChza2IsIHBhY2tldF9sZW5ndGgpOworCXNrYl9jaGVja3N1bV9ub25lX2Fzc2VydChza2IpOworCisJLyogR2V0IHBhcml0YWwgZXRoZXJuZXQgaW5mb3JtYXRpb24gaW5zdGVhZCBvZiBldGhfdHlwZV90cmFucygpLAorCSAqIFNpbmNlIHdlIGRvbid0IGhhdmUgYW4gYXNzb2NpYXRlZCBuZXRfZGV2aWNlLgorCSAqLworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJc2tiLT5wcm90b2NvbCA9IGV0aF9oZHIoc2tiKS0+aF9wcm90bzsKKworCS8qIFBhc3MgU0tCIG9ud2FyZCAqLworCWlmIChjZGV2LT5sbDItPmNicyAmJiBjZGV2LT5sbDItPmNicy0+cnhfY2IpIHsKKwkJaWYgKHZsYW4pCisJCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgaHRvbnMoRVRIX1BfODAyMVEpLCB2bGFuKTsKKwkJY2Rldi0+bGwyLT5jYnMtPnJ4X2NiKGNkZXYtPmxsMi0+Y2JfY29va2llLCBza2IsCisJCQkJICAgICAgb3BhcXVlX2RhdGFfMCwgb3BhcXVlX2RhdGFfMSk7CisJfQorCisJLyogVXBkYXRlIEJ1ZmZlciBpbmZvcm1hdGlvbiBhbmQgdXBkYXRlIEZXIHByb2R1Y2VyICovCisJYnVmZmVyLT5kYXRhID0gbmV3X2RhdGE7CisJYnVmZmVyLT5waHlzX2FkZHIgPSBuZXdfcGh5c19hZGRyOworCitvdXRfcG9zdDoKKwlyYyA9IHFlZF9sbDJfcG9zdF9yeF9idWZmZXIoUUVEX0xFQURJTkdfSFdGTihjZGV2KSwgY2Rldi0+bGwyLT5oYW5kbGUsCisJCQkJICAgIGJ1ZmZlci0+cGh5c19hZGRyLCAwLCAgYnVmZmVyLCAxKTsKKworCWlmIChyYykKKwkJcWVkX2xsMl9kZWFsbG9jX2J1ZmZlcihjZGV2LCBidWZmZXIpOworfQorCitzdGF0aWMgc3RydWN0IHFlZF9sbDJfaW5mbyAqX19xZWRfbGwyX2hhbmRsZV9zYW5pdHkoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICAgdTggY29ubmVjdGlvbl9oYW5kbGUsCisJCQkJCQkgICAgYm9vbCBiX2xvY2ssCisJCQkJCQkgICAgYm9vbCBiX29ubHlfYWN0aXZlKQoreworCXN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm4sICpwX3JldCA9IE5VTEw7CisKKwlpZiAoY29ubmVjdGlvbl9oYW5kbGUgPj0gUUVEX01BWF9OVU1fT0ZfTEwyX0NPTk5FQ1RJT05TKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghcF9od2ZuLT5wX2xsMl9pbmZvKQorCQlyZXR1cm4gTlVMTDsKKworCXBfbGwyX2Nvbm4gPSAmcF9od2ZuLT5wX2xsMl9pbmZvW2Nvbm5lY3Rpb25faGFuZGxlXTsKKworCWlmIChiX29ubHlfYWN0aXZlKSB7CisJCWlmIChiX2xvY2spCisJCQltdXRleF9sb2NrKCZwX2xsMl9jb25uLT5tdXRleCk7CisJCWlmIChwX2xsMl9jb25uLT5iX2FjdGl2ZSkKKwkJCXBfcmV0ID0gcF9sbDJfY29ubjsKKwkJaWYgKGJfbG9jaykKKwkJCW11dGV4X3VubG9jaygmcF9sbDJfY29ubi0+bXV0ZXgpOworCX0gZWxzZSB7CisJCXBfcmV0ID0gcF9sbDJfY29ubjsKKwl9CisKKwlyZXR1cm4gcF9yZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcWVkX2xsMl9pbmZvICpxZWRfbGwyX2hhbmRsZV9zYW5pdHkoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgIHU4IGNvbm5lY3Rpb25faGFuZGxlKQoreworCXJldHVybiBfX3FlZF9sbDJfaGFuZGxlX3Nhbml0eShwX2h3Zm4sIGNvbm5lY3Rpb25faGFuZGxlLCBmYWxzZSwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcWVkX2xsMl9pbmZvICpxZWRfbGwyX2hhbmRsZV9zYW5pdHlfbG9jayhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgICAgICB1OCBjb25uZWN0aW9uX2hhbmRsZSkKK3sKKwlyZXR1cm4gX19xZWRfbGwyX2hhbmRsZV9zYW5pdHkocF9od2ZuLCBjb25uZWN0aW9uX2hhbmRsZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcWVkX2xsMl9pbmZvICpxZWRfbGwyX2hhbmRsZV9zYW5pdHlfaW5hY3RpdmUoc3RydWN0IHFlZF9od2ZuCisJCQkJCQkJICAgKnBfaHdmbiwKKwkJCQkJCQkgICB1OCBjb25uZWN0aW9uX2hhbmRsZSkKK3sKKwlyZXR1cm4gX19xZWRfbGwyX2hhbmRsZV9zYW5pdHkocF9od2ZuLCBjb25uZWN0aW9uX2hhbmRsZSwgZmFsc2UsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQgcWVkX2xsMl90eHFfZmx1c2goc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHU4IGNvbm5lY3Rpb25faGFuZGxlKQoreworCWJvb2wgYl9sYXN0X3BhY2tldCA9IGZhbHNlLCBiX2xhc3RfZnJhZyA9IGZhbHNlOworCXN0cnVjdCBxZWRfbGwyX3R4X3BhY2tldCAqcF9wa3QgPSBOVUxMOworCXN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm47CisJc3RydWN0IHFlZF9sbDJfdHhfcXVldWUgKnBfdHg7CisJZG1hX2FkZHJfdCB0eF9mcmFnOworCisJcF9sbDJfY29ubiA9IHFlZF9sbDJfaGFuZGxlX3Nhbml0eV9pbmFjdGl2ZShwX2h3Zm4sIGNvbm5lY3Rpb25faGFuZGxlKTsKKwlpZiAoIXBfbGwyX2Nvbm4pCisJCXJldHVybjsKKworCXBfdHggPSAmcF9sbDJfY29ubi0+dHhfcXVldWU7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnBfdHgtPmFjdGl2ZV9kZXNjcSkpIHsKKwkJcF9wa3QgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwX3R4LT5hY3RpdmVfZGVzY3EsCisJCQkJCSBzdHJ1Y3QgcWVkX2xsMl90eF9wYWNrZXQsIGxpc3RfZW50cnkpOworCQlpZiAoIXBfcGt0KQorCQkJYnJlYWs7CisKKwkJbGlzdF9kZWwoJnBfcGt0LT5saXN0X2VudHJ5KTsKKwkJYl9sYXN0X3BhY2tldCA9IGxpc3RfZW1wdHkoJnBfdHgtPmFjdGl2ZV9kZXNjcSk7CisJCWxpc3RfYWRkX3RhaWwoJnBfcGt0LT5saXN0X2VudHJ5LCAmcF90eC0+ZnJlZV9kZXNjcSk7CisJCXBfdHgtPmN1cl9jb21wbGV0aW5nX3BhY2tldCA9ICpwX3BrdDsKKwkJcF90eC0+Y3VyX2NvbXBsZXRpbmdfYmRfaWR4ID0gMTsKKwkJYl9sYXN0X2ZyYWcgPSBwX3R4LT5jdXJfY29tcGxldGluZ19iZF9pZHggPT0gcF9wa3QtPmJkX3VzZWQ7CisJCXR4X2ZyYWcgPSBwX3BrdC0+YmRzX3NldFswXS50eF9mcmFnOworCQlpZiAocF9sbDJfY29ubi0+Z3NpX2VuYWJsZSkKKwkJCXFlZF9sbDJiX3JlbGVhc2VfdHhfZ3NpX3BhY2tldChwX2h3Zm4sCisJCQkJCQkgICAgICAgcF9sbDJfY29ubi0+bXlfaWQsCisJCQkJCQkgICAgICAgcF9wa3QtPmNvb2tpZSwKKwkJCQkJCSAgICAgICB0eF9mcmFnLAorCQkJCQkJICAgICAgIGJfbGFzdF9mcmFnLAorCQkJCQkJICAgICAgIGJfbGFzdF9wYWNrZXQpOworCQllbHNlCisJCQlxZWRfbGwyYl9jb21wbGV0ZV90eF9wYWNrZXQocF9od2ZuLAorCQkJCQkJICAgIHBfbGwyX2Nvbm4tPm15X2lkLAorCQkJCQkJICAgIHBfcGt0LT5jb29raWUsCisJCQkJCQkgICAgdHhfZnJhZywKKwkJCQkJCSAgICBiX2xhc3RfZnJhZywKKwkJCQkJCSAgICBiX2xhc3RfcGFja2V0KTsKKworCX0KK30KKworc3RhdGljIGludCBxZWRfbGwyX3R4cV9jb21wbGV0aW9uKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB2b2lkICpwX2Nvb2tpZSkKK3sKKwlzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uID0gcF9jb29raWU7CisJc3RydWN0IHFlZF9sbDJfdHhfcXVldWUgKnBfdHggPSAmcF9sbDJfY29ubi0+dHhfcXVldWU7CisJdTE2IG5ld19pZHggPSAwLCBudW1fYmRzID0gMCwgbnVtX2Jkc19pbl9wYWNrZXQgPSAwOworCXN0cnVjdCBxZWRfbGwyX3R4X3BhY2tldCAqcF9wa3Q7CisJYm9vbCBiX2xhc3RfZnJhZyA9IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZG1hX2FkZHJfdCB0eF9mcmFnOworCWludCByYyA9IC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcF90eC0+bG9jaywgZmxhZ3MpOworCWlmIChwX3R4LT5iX2NvbXBsZXRpbmdfcGFja2V0KSB7CisJCXJjID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwluZXdfaWR4ID0gbGUxNl90b19jcHUoKnBfdHgtPnBfZndfY29ucyk7CisJbnVtX2JkcyA9ICgoczE2KW5ld19pZHggLSAoczE2KXBfdHgtPmJkc19pZHgpOworCXdoaWxlIChudW1fYmRzKSB7CisJCWlmIChsaXN0X2VtcHR5KCZwX3R4LT5hY3RpdmVfZGVzY3EpKQorCQkJZ290byBvdXQ7CisKKwkJcF9wa3QgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwX3R4LT5hY3RpdmVfZGVzY3EsCisJCQkJCSBzdHJ1Y3QgcWVkX2xsMl90eF9wYWNrZXQsIGxpc3RfZW50cnkpOworCQlpZiAoIXBfcGt0KQorCQkJZ290byBvdXQ7CisKKwkJcF90eC0+Yl9jb21wbGV0aW5nX3BhY2tldCA9IHRydWU7CisJCXBfdHgtPmN1cl9jb21wbGV0aW5nX3BhY2tldCA9ICpwX3BrdDsKKwkJbnVtX2Jkc19pbl9wYWNrZXQgPSBwX3BrdC0+YmRfdXNlZDsKKwkJbGlzdF9kZWwoJnBfcGt0LT5saXN0X2VudHJ5KTsKKworCQlpZiAobnVtX2JkcyA8IG51bV9iZHNfaW5fcGFja2V0KSB7CisJCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJCSAgIlJlc3Qgb2YgQkRzIGRvZXMgbm90IGNvdmVyIHdob2xlIHBhY2tldFxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCW51bV9iZHMgLT0gbnVtX2Jkc19pbl9wYWNrZXQ7CisJCXBfdHgtPmJkc19pZHggKz0gbnVtX2Jkc19pbl9wYWNrZXQ7CisJCXdoaWxlIChudW1fYmRzX2luX3BhY2tldC0tKQorCQkJcWVkX2NoYWluX2NvbnN1bWUoJnBfdHgtPnR4cV9jaGFpbik7CisKKwkJcF90eC0+Y3VyX2NvbXBsZXRpbmdfYmRfaWR4ID0gMTsKKwkJYl9sYXN0X2ZyYWcgPSBwX3R4LT5jdXJfY29tcGxldGluZ19iZF9pZHggPT0gcF9wa3QtPmJkX3VzZWQ7CisJCWxpc3RfYWRkX3RhaWwoJnBfcGt0LT5saXN0X2VudHJ5LCAmcF90eC0+ZnJlZV9kZXNjcSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcF90eC0+bG9jaywgZmxhZ3MpOworCQl0eF9mcmFnID0gcF9wa3QtPmJkc19zZXRbMF0udHhfZnJhZzsKKwkJaWYgKHBfbGwyX2Nvbm4tPmdzaV9lbmFibGUpCisJCQlxZWRfbGwyYl9jb21wbGV0ZV90eF9nc2lfcGFja2V0KHBfaHdmbiwKKwkJCQkJCQlwX2xsMl9jb25uLT5teV9pZCwKKwkJCQkJCQlwX3BrdC0+Y29va2llLAorCQkJCQkJCXR4X2ZyYWcsCisJCQkJCQkJYl9sYXN0X2ZyYWcsICFudW1fYmRzKTsKKwkJZWxzZQorCQkJcWVkX2xsMmJfY29tcGxldGVfdHhfcGFja2V0KHBfaHdmbiwKKwkJCQkJCSAgICBwX2xsMl9jb25uLT5teV9pZCwKKwkJCQkJCSAgICBwX3BrdC0+Y29va2llLAorCQkJCQkJICAgIHR4X2ZyYWcsCisJCQkJCQkgICAgYl9sYXN0X2ZyYWcsICFudW1fYmRzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBfdHgtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlwX3R4LT5iX2NvbXBsZXRpbmdfcGFja2V0ID0gZmFsc2U7CisJcmMgPSAwOworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBfdHgtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK3FlZF9sbDJfcnhxX2NvbXBsZXRpb25fZ3NpKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfaW5mbywKKwkJCSAgIHVuaW9uIGNvcmVfcnhfY3FlX3VuaW9uICpwX2NxZSwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgbG9ja19mbGFncywgYm9vbCBiX2xhc3RfY3FlKQoreworCXN0cnVjdCBxZWRfbGwyX3J4X3F1ZXVlICpwX3J4ID0gJnBfbGwyX2luZm8tPnJ4X3F1ZXVlOworCXN0cnVjdCBxZWRfbGwyX3J4X3BhY2tldCAqcF9wa3QgPSBOVUxMOworCXUxNiBwYWNrZXRfbGVuZ3RoLCBwYXJzZV9mbGFncywgdmxhbjsKKwl1MzIgc3JjX21hY19hZGRyaGk7CisJdTE2IHNyY19tYWNfYWRkcmxvOworCisJaWYgKCFsaXN0X2VtcHR5KCZwX3J4LT5hY3RpdmVfZGVzY3EpKQorCQlwX3BrdCA9IGxpc3RfZmlyc3RfZW50cnkoJnBfcngtPmFjdGl2ZV9kZXNjcSwKKwkJCQkJIHN0cnVjdCBxZWRfbGwyX3J4X3BhY2tldCwgbGlzdF9lbnRyeSk7CisJaWYgKCFwX3BrdCkgeworCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAiR1NJIFJ4IGNvbXBsZXRpb24gYnV0IGFjdGl2ZV9kZXNjcSBpcyBlbXB0eVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWxpc3RfZGVsKCZwX3BrdC0+bGlzdF9lbnRyeSk7CisJcGFyc2VfZmxhZ3MgPSBsZTE2X3RvX2NwdShwX2NxZS0+cnhfY3FlX2dzaS5wYXJzZV9mbGFncy5mbGFncyk7CisJcGFja2V0X2xlbmd0aCA9IGxlMTZfdG9fY3B1KHBfY3FlLT5yeF9jcWVfZ3NpLmRhdGFfbGVuZ3RoKTsKKwl2bGFuID0gbGUxNl90b19jcHUocF9jcWUtPnJ4X2NxZV9nc2kudmxhbik7CisJc3JjX21hY19hZGRyaGkgPSBsZTMyX3RvX2NwdShwX2NxZS0+cnhfY3FlX2dzaS5zcmNfbWFjX2FkZHJoaSk7CisJc3JjX21hY19hZGRybG8gPSBsZTE2X3RvX2NwdShwX2NxZS0+cnhfY3FlX2dzaS5zcmNfbWFjX2FkZHJsbyk7CisJaWYgKHFlZF9jaGFpbl9jb25zdW1lKCZwX3J4LT5yeHFfY2hhaW4pICE9IHBfcGt0LT5yeHFfYmQpCisJCURQX05PVElDRShwX2h3Zm4sCisJCQkgICJNaXNtYXRjaCBiZXR3ZWVuIGFjdGl2ZV9kZXNjcSBhbmQgdGhlIExMMiBSeCBjaGFpblxuIik7CisJbGlzdF9hZGRfdGFpbCgmcF9wa3QtPmxpc3RfZW50cnksICZwX3J4LT5mcmVlX2Rlc2NxKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBfcngtPmxvY2ssIGxvY2tfZmxhZ3MpOworCXFlZF9sbDJiX2NvbXBsZXRlX3J4X2dzaV9wYWNrZXQocF9od2ZuLAorCQkJCQlwX2xsMl9pbmZvLT5teV9pZCwKKwkJCQkJcF9wa3QtPmNvb2tpZSwKKwkJCQkJcF9wa3QtPnJ4X2J1Zl9hZGRyLAorCQkJCQlwYWNrZXRfbGVuZ3RoLAorCQkJCQlwX2NxZS0+cnhfY3FlX2dzaS5kYXRhX2xlbmd0aF9lcnJvciwKKwkJCQkJcGFyc2VfZmxhZ3MsCisJCQkJCXZsYW4sCisJCQkJCXNyY19tYWNfYWRkcmhpLAorCQkJCQlzcmNfbWFjX2FkZHJsbywgYl9sYXN0X2NxZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBfcngtPmxvY2ssIGxvY2tfZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWVkX2xsMl9yeHFfY29tcGxldGlvbl9yZWcoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICAgc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfY29ubiwKKwkJCQkgICAgICB1bmlvbiBjb3JlX3J4X2NxZV91bmlvbiAqcF9jcWUsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzLAorCQkJCSAgICAgIGJvb2wgYl9sYXN0X2NxZSkKK3sKKwlzdHJ1Y3QgcWVkX2xsMl9yeF9xdWV1ZSAqcF9yeCA9ICZwX2xsMl9jb25uLT5yeF9xdWV1ZTsKKwlzdHJ1Y3QgcWVkX2xsMl9yeF9wYWNrZXQgKnBfcGt0ID0gTlVMTDsKKworCWlmICghbGlzdF9lbXB0eSgmcF9yeC0+YWN0aXZlX2Rlc2NxKSkKKwkJcF9wa3QgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwX3J4LT5hY3RpdmVfZGVzY3EsCisJCQkJCSBzdHJ1Y3QgcWVkX2xsMl9yeF9wYWNrZXQsIGxpc3RfZW50cnkpOworCWlmICghcF9wa3QpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCSAgIkxMMiBSeCBjb21wbGV0aW9uIGJ1dCBhY3RpdmVfZGVzY3EgaXMgZW1wdHlcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbGlzdF9kZWwoJnBfcGt0LT5saXN0X2VudHJ5KTsKKworCWlmIChxZWRfY2hhaW5fY29uc3VtZSgmcF9yeC0+cnhxX2NoYWluKSAhPSBwX3BrdC0+cnhxX2JkKQorCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAiTWlzbWF0Y2ggYmV0d2VlbiBhY3RpdmVfZGVzY3EgYW5kIHRoZSBMTDIgUnggY2hhaW5cbiIpOworCWxpc3RfYWRkX3RhaWwoJnBfcGt0LT5saXN0X2VudHJ5LCAmcF9yeC0+ZnJlZV9kZXNjcSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwX3J4LT5sb2NrLCBsb2NrX2ZsYWdzKTsKKwlxZWRfbGwyYl9jb21wbGV0ZV9yeF9wYWNrZXQocF9od2ZuLCBwX2xsMl9jb25uLT5teV9pZCwKKwkJCQkgICAgcF9wa3QsICZwX2NxZS0+cnhfY3FlX2ZwLCBiX2xhc3RfY3FlKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcF9yeC0+bG9jaywgbG9ja19mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxZWRfbGwyX3J4cV9jb21wbGV0aW9uKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB2b2lkICpjb29raWUpCit7CisJc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfY29ubiA9IGNvb2tpZTsKKwlzdHJ1Y3QgcWVkX2xsMl9yeF9xdWV1ZSAqcF9yeCA9ICZwX2xsMl9jb25uLT5yeF9xdWV1ZTsKKwl1bmlvbiBjb3JlX3J4X2NxZV91bmlvbiAqY3FlID0gTlVMTDsKKwl1MTYgY3FfbmV3X2lkeCA9IDAsIGNxX29sZF9pZHggPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWludCByYyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcF9yeC0+bG9jaywgZmxhZ3MpOworCWNxX25ld19pZHggPSBsZTE2X3RvX2NwdSgqcF9yeC0+cF9md19jb25zKTsKKwljcV9vbGRfaWR4ID0gcWVkX2NoYWluX2dldF9jb25zX2lkeCgmcF9yeC0+cmNxX2NoYWluKTsKKworCXdoaWxlIChjcV9uZXdfaWR4ICE9IGNxX29sZF9pZHgpIHsKKwkJYm9vbCBiX2xhc3RfY3FlID0gKGNxX25ld19pZHggPT0gY3Ffb2xkX2lkeCk7CisKKwkJY3FlID0gcWVkX2NoYWluX2NvbnN1bWUoJnBfcngtPnJjcV9jaGFpbik7CisJCWNxX29sZF9pZHggPSBxZWRfY2hhaW5fZ2V0X2NvbnNfaWR4KCZwX3J4LT5yY3FfY2hhaW4pOworCisJCURQX1ZFUkJPU0UocF9od2ZuLAorCQkJICAgUUVEX01TR19MTDIsCisJCQkgICAiTEwyIFtzdy4gY29ucyAlMDR4LCBmdy4gYXQgJTA0eF0gLSBHb3QgUGFja2V0IG9mIHR5cGUgJTAyeFxuIiwKKwkJCSAgIGNxX29sZF9pZHgsIGNxX25ld19pZHgsIGNxZS0+cnhfY3FlX3NwLnR5cGUpOworCisJCXN3aXRjaCAoY3FlLT5yeF9jcWVfc3AudHlwZSkgeworCQljYXNlIENPUkVfUlhfQ1FFX1RZUEVfU0xPV19QQVRIOgorCQkJRFBfTk9USUNFKHBfaHdmbiwgIkxMMiAtIHVuZXhwZWN0ZWQgUnggQ1FFIHNsb3dwYXRoXG4iKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIENPUkVfUlhfQ1FFX1RZUEVfR1NJX09GRkxPQUQ6CisJCQlyYyA9IHFlZF9sbDJfcnhxX2NvbXBsZXRpb25fZ3NpKHBfaHdmbiwgcF9sbDJfY29ubiwKKwkJCQkJCQljcWUsIGZsYWdzLCBiX2xhc3RfY3FlKTsKKwkJCWJyZWFrOworCQljYXNlIENPUkVfUlhfQ1FFX1RZUEVfUkVHVUxBUjoKKwkJCXJjID0gcWVkX2xsMl9yeHFfY29tcGxldGlvbl9yZWcocF9od2ZuLCBwX2xsMl9jb25uLAorCQkJCQkJCWNxZSwgZmxhZ3MsIGJfbGFzdF9jcWUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyYyA9IC1FSU87CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwX3J4LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworfQorCit2b2lkIHFlZF9sbDJfcnhxX2ZsdXNoKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1OCBjb25uZWN0aW9uX2hhbmRsZSkKK3sKKwlzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uID0gTlVMTDsKKwlzdHJ1Y3QgcWVkX2xsMl9yeF9wYWNrZXQgKnBfcGt0ID0gTlVMTDsKKwlzdHJ1Y3QgcWVkX2xsMl9yeF9xdWV1ZSAqcF9yeDsKKworCXBfbGwyX2Nvbm4gPSBxZWRfbGwyX2hhbmRsZV9zYW5pdHlfaW5hY3RpdmUocF9od2ZuLCBjb25uZWN0aW9uX2hhbmRsZSk7CisJaWYgKCFwX2xsMl9jb25uKQorCQlyZXR1cm47CisKKwlwX3J4ID0gJnBfbGwyX2Nvbm4tPnJ4X3F1ZXVlOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZwX3J4LT5hY3RpdmVfZGVzY3EpKSB7CisJCWRtYV9hZGRyX3QgcnhfYnVmX2FkZHI7CisJCXZvaWQgKmNvb2tpZTsKKwkJYm9vbCBiX2xhc3Q7CisKKwkJcF9wa3QgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwX3J4LT5hY3RpdmVfZGVzY3EsCisJCQkJCSBzdHJ1Y3QgcWVkX2xsMl9yeF9wYWNrZXQsIGxpc3RfZW50cnkpOworCQlpZiAoIXBfcGt0KQorCQkJYnJlYWs7CisKKwkJbGlzdF9kZWwoJnBfcGt0LT5saXN0X2VudHJ5KTsKKwkJbGlzdF9hZGRfdGFpbCgmcF9wa3QtPmxpc3RfZW50cnksICZwX3J4LT5mcmVlX2Rlc2NxKTsKKworCQlyeF9idWZfYWRkciA9IHBfcGt0LT5yeF9idWZfYWRkcjsKKwkJY29va2llID0gcF9wa3QtPmNvb2tpZTsKKworCQliX2xhc3QgPSBsaXN0X2VtcHR5KCZwX3J4LT5hY3RpdmVfZGVzY3EpOworCX0KK30KKworc3RhdGljIGludCBxZWRfc3BfbGwyX3J4X3F1ZXVlX3N0YXJ0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfY29ubiwKKwkJCQkgICAgIHU4IGFjdGlvbl9vbl9lcnJvcikKK3sKKwllbnVtIHFlZF9sbDJfY29ubl90eXBlIGNvbm5fdHlwZSA9IHBfbGwyX2Nvbm4tPmNvbm5fdHlwZTsKKwlzdHJ1Y3QgcWVkX2xsMl9yeF9xdWV1ZSAqcF9yeCA9ICZwX2xsMl9jb25uLT5yeF9xdWV1ZTsKKwlzdHJ1Y3QgY29yZV9yeF9zdGFydF9yYW1yb2RfZGF0YSAqcF9yYW1yb2QgPSBOVUxMOworCXN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudCA9IE5VTEw7CisJc3RydWN0IHFlZF9zcF9pbml0X2RhdGEgaW5pdF9kYXRhOworCXUxNiBjcWVfcGJsX3NpemU7CisJaW50IHJjID0gMDsKKworCS8qIEdldCBTUFEgZW50cnkgKi8KKwltZW1zZXQoJmluaXRfZGF0YSwgMCwgc2l6ZW9mKGluaXRfZGF0YSkpOworCWluaXRfZGF0YS5jaWQgPSBwX2xsMl9jb25uLT5jaWQ7CisJaW5pdF9kYXRhLm9wYXF1ZV9maWQgPSBwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZDsKKwlpbml0X2RhdGEuY29tcF9tb2RlID0gUUVEX1NQUV9NT0RFX0VCTE9DSzsKKworCXJjID0gcWVkX3NwX2luaXRfcmVxdWVzdChwX2h3Zm4sICZwX2VudCwKKwkJCQkgQ09SRV9SQU1ST0RfUlhfUVVFVUVfU1RBUlQsCisJCQkJIFBST1RPQ09MSURfQ09SRSwgJmluaXRfZGF0YSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwX3JhbXJvZCA9ICZwX2VudC0+cmFtcm9kLmNvcmVfcnhfcXVldWVfc3RhcnQ7CisKKwlwX3JhbXJvZC0+c2JfaWQgPSBjcHVfdG9fbGUxNihxZWRfaW50X2dldF9zcF9zYl9pZChwX2h3Zm4pKTsKKwlwX3JhbXJvZC0+c2JfaW5kZXggPSBwX3J4LT5yeF9zYl9pbmRleDsKKwlwX3JhbXJvZC0+Y29tcGxldGVfZXZlbnRfZmxnID0gMTsKKworCXBfcmFtcm9kLT5tdHUgPSBjcHVfdG9fbGUxNihwX2xsMl9jb25uLT5tdHUpOworCURNQV9SRUdQQUlSX0xFKHBfcmFtcm9kLT5iZF9iYXNlLAorCQkgICAgICAgcF9yeC0+cnhxX2NoYWluLnBfcGh5c19hZGRyKTsKKwljcWVfcGJsX3NpemUgPSAodTE2KXFlZF9jaGFpbl9nZXRfcGFnZV9jbnQoJnBfcngtPnJjcV9jaGFpbik7CisJcF9yYW1yb2QtPm51bV9vZl9wYmxfcGFnZXMgPSBjcHVfdG9fbGUxNihjcWVfcGJsX3NpemUpOworCURNQV9SRUdQQUlSX0xFKHBfcmFtcm9kLT5jcWVfcGJsX2FkZHIsCisJCSAgICAgICBxZWRfY2hhaW5fZ2V0X3BibF9waHlzKCZwX3J4LT5yY3FfY2hhaW4pKTsKKworCXBfcmFtcm9kLT5kcm9wX3R0bDBfZmxnID0gcF9sbDJfY29ubi0+cnhfZHJvcF90dGwwX2ZsZzsKKwlwX3JhbXJvZC0+aW5uZXJfdmxhbl9yZW1vdmFsX2VuID0gcF9sbDJfY29ubi0+cnhfdmxhbl9yZW1vdmFsX2VuOworCXBfcmFtcm9kLT5xdWV1ZV9pZCA9IHBfbGwyX2Nvbm4tPnF1ZXVlX2lkOworCXBfcmFtcm9kLT5tYWluX2Z1bmNfcXVldWUgPSAxOworCisJaWYgKChJU19NRl9ERUZBVUxUKHBfaHdmbikgfHwgSVNfTUZfU0kocF9od2ZuKSkgJiYKKwkgICAgcF9yYW1yb2QtPm1haW5fZnVuY19xdWV1ZSAmJiAoY29ubl90eXBlICE9IFFFRF9MTDJfVFlQRV9ST0NFKSkgeworCQlwX3JhbXJvZC0+bWZfc2lfYmNhc3RfYWNjZXB0X2FsbCA9IDE7CisJCXBfcmFtcm9kLT5tZl9zaV9tY2FzdF9hY2NlcHRfYWxsID0gMTsKKwl9IGVsc2UgeworCQlwX3JhbXJvZC0+bWZfc2lfYmNhc3RfYWNjZXB0X2FsbCA9IDA7CisJCXBfcmFtcm9kLT5tZl9zaV9tY2FzdF9hY2NlcHRfYWxsID0gMDsKKwl9CisKKwlwX3JhbXJvZC0+YWN0aW9uX29uX2Vycm9yLmVycm9yX3R5cGUgPSBhY3Rpb25fb25fZXJyb3I7CisJcF9yYW1yb2QtPmdzaV9vZmZsb2FkX2ZsYWcgPSBwX2xsMl9jb25uLT5nc2lfZW5hYmxlOworCXJldHVybiBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3NwX2xsMl90eF9xdWV1ZV9zdGFydChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgIHN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm4pCit7CisJZW51bSBxZWRfbGwyX2Nvbm5fdHlwZSBjb25uX3R5cGUgPSBwX2xsMl9jb25uLT5jb25uX3R5cGU7CisJc3RydWN0IHFlZF9sbDJfdHhfcXVldWUgKnBfdHggPSAmcF9sbDJfY29ubi0+dHhfcXVldWU7CisJc3RydWN0IGNvcmVfdHhfc3RhcnRfcmFtcm9kX2RhdGEgKnBfcmFtcm9kID0gTlVMTDsKKwlzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQgPSBOVUxMOworCXN0cnVjdCBxZWRfc3BfaW5pdF9kYXRhIGluaXRfZGF0YTsKKwl1bmlvbiBxZWRfcW1fcHFfcGFyYW1zIHBxX3BhcmFtczsKKwl1MTYgcHFfaWQgPSAwLCBwYmxfc2l6ZTsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJaWYgKCFRRURfTEwyX1RYX1JFR0lTVEVSRUQocF9sbDJfY29ubikpCisJCXJldHVybiAwOworCisJLyogR2V0IFNQUSBlbnRyeSAqLworCW1lbXNldCgmaW5pdF9kYXRhLCAwLCBzaXplb2YoaW5pdF9kYXRhKSk7CisJaW5pdF9kYXRhLmNpZCA9IHBfbGwyX2Nvbm4tPmNpZDsKKwlpbml0X2RhdGEub3BhcXVlX2ZpZCA9IHBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkOworCWluaXRfZGF0YS5jb21wX21vZGUgPSBRRURfU1BRX01PREVfRUJMT0NLOworCisJcmMgPSBxZWRfc3BfaW5pdF9yZXF1ZXN0KHBfaHdmbiwgJnBfZW50LAorCQkJCSBDT1JFX1JBTVJPRF9UWF9RVUVVRV9TVEFSVCwKKwkJCQkgUFJPVE9DT0xJRF9DT1JFLCAmaW5pdF9kYXRhKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBfcmFtcm9kID0gJnBfZW50LT5yYW1yb2QuY29yZV90eF9xdWV1ZV9zdGFydDsKKworCXBfcmFtcm9kLT5zYl9pZCA9IGNwdV90b19sZTE2KHFlZF9pbnRfZ2V0X3NwX3NiX2lkKHBfaHdmbikpOworCXBfcmFtcm9kLT5zYl9pbmRleCA9IHBfdHgtPnR4X3NiX2luZGV4OworCXBfcmFtcm9kLT5tdHUgPSBjcHVfdG9fbGUxNihwX2xsMl9jb25uLT5tdHUpOworCXBfbGwyX2Nvbm4tPnR4X3N0YXRzX2VuID0gMTsKKwlwX3JhbXJvZC0+c3RhdHNfZW4gPSBwX2xsMl9jb25uLT50eF9zdGF0c19lbjsKKwlwX3JhbXJvZC0+c3RhdHNfaWQgPSBwX2xsMl9jb25uLT50eF9zdGF0c19pZDsKKworCURNQV9SRUdQQUlSX0xFKHBfcmFtcm9kLT5wYmxfYmFzZV9hZGRyLAorCQkgICAgICAgcWVkX2NoYWluX2dldF9wYmxfcGh5cygmcF90eC0+dHhxX2NoYWluKSk7CisJcGJsX3NpemUgPSBxZWRfY2hhaW5fZ2V0X3BhZ2VfY250KCZwX3R4LT50eHFfY2hhaW4pOworCXBfcmFtcm9kLT5wYmxfc2l6ZSA9IGNwdV90b19sZTE2KHBibF9zaXplKTsKKworCW1lbXNldCgmcHFfcGFyYW1zLCAwLCBzaXplb2YocHFfcGFyYW1zKSk7CisJcHFfcGFyYW1zLmNvcmUudGMgPSBwX2xsMl9jb25uLT50eF90YzsKKwlwcV9pZCA9IHFlZF9nZXRfcW1fcHEocF9od2ZuLCBQUk9UT0NPTElEX0NPUkUsICZwcV9wYXJhbXMpOworCXBfcmFtcm9kLT5xbV9wcV9pZCA9IGNwdV90b19sZTE2KHBxX2lkKTsKKworCXN3aXRjaCAoY29ubl90eXBlKSB7CisJY2FzZSBRRURfTEwyX1RZUEVfSVNDU0k6CisJY2FzZSBRRURfTEwyX1RZUEVfSVNDU0lfT09POgorCQlwX3JhbXJvZC0+Y29ubl90eXBlID0gUFJPVE9DT0xJRF9JU0NTSTsKKwkJYnJlYWs7CisJY2FzZSBRRURfTEwyX1RZUEVfUk9DRToKKwkJcF9yYW1yb2QtPmNvbm5fdHlwZSA9IFBST1RPQ09MSURfUk9DRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcF9yYW1yb2QtPmNvbm5fdHlwZSA9IFBST1RPQ09MSURfRVRIOworCQlEUF9OT1RJQ0UocF9od2ZuLCAiVW5rbm93biBjb25uZWN0aW9uIHR5cGU6ICVkXG4iLCBjb25uX3R5cGUpOworCX0KKworCXBfcmFtcm9kLT5nc2lfb2ZmbG9hZF9mbGFnID0gcF9sbDJfY29ubi0+Z3NpX2VuYWJsZTsKKwlyZXR1cm4gcWVkX3NwcV9wb3N0KHBfaHdmbiwgcF9lbnQsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHFlZF9zcF9sbDJfcnhfcXVldWVfc3RvcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfY29ubikKK3sKKwlzdHJ1Y3QgY29yZV9yeF9zdG9wX3JhbXJvZF9kYXRhICpwX3JhbXJvZCA9IE5VTEw7CisJc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50ID0gTlVMTDsKKwlzdHJ1Y3QgcWVkX3NwX2luaXRfZGF0YSBpbml0X2RhdGE7CisJaW50IHJjID0gLUVJTlZBTDsKKworCS8qIEdldCBTUFEgZW50cnkgKi8KKwltZW1zZXQoJmluaXRfZGF0YSwgMCwgc2l6ZW9mKGluaXRfZGF0YSkpOworCWluaXRfZGF0YS5jaWQgPSBwX2xsMl9jb25uLT5jaWQ7CisJaW5pdF9kYXRhLm9wYXF1ZV9maWQgPSBwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZDsKKwlpbml0X2RhdGEuY29tcF9tb2RlID0gUUVEX1NQUV9NT0RFX0VCTE9DSzsKKworCXJjID0gcWVkX3NwX2luaXRfcmVxdWVzdChwX2h3Zm4sICZwX2VudCwKKwkJCQkgQ09SRV9SQU1ST0RfUlhfUVVFVUVfU1RPUCwKKwkJCQkgUFJPVE9DT0xJRF9DT1JFLCAmaW5pdF9kYXRhKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBfcmFtcm9kID0gJnBfZW50LT5yYW1yb2QuY29yZV9yeF9xdWV1ZV9zdG9wOworCisJcF9yYW1yb2QtPmNvbXBsZXRlX2V2ZW50X2ZsZyA9IDE7CisJcF9yYW1yb2QtPnF1ZXVlX2lkID0gcF9sbDJfY29ubi0+cXVldWVfaWQ7CisKKwlyZXR1cm4gcWVkX3NwcV9wb3N0KHBfaHdmbiwgcF9lbnQsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHFlZF9zcF9sbDJfdHhfcXVldWVfc3RvcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfY29ubikKK3sKKwlzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQgPSBOVUxMOworCXN0cnVjdCBxZWRfc3BfaW5pdF9kYXRhIGluaXRfZGF0YTsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJLyogR2V0IFNQUSBlbnRyeSAqLworCW1lbXNldCgmaW5pdF9kYXRhLCAwLCBzaXplb2YoaW5pdF9kYXRhKSk7CisJaW5pdF9kYXRhLmNpZCA9IHBfbGwyX2Nvbm4tPmNpZDsKKwlpbml0X2RhdGEub3BhcXVlX2ZpZCA9IHBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkOworCWluaXRfZGF0YS5jb21wX21vZGUgPSBRRURfU1BRX01PREVfRUJMT0NLOworCisJcmMgPSBxZWRfc3BfaW5pdF9yZXF1ZXN0KHBfaHdmbiwgJnBfZW50LAorCQkJCSBDT1JFX1JBTVJPRF9UWF9RVUVVRV9TVE9QLAorCQkJCSBQUk9UT0NPTElEX0NPUkUsICZpbml0X2RhdGEpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIHFlZF9zcHFfcG9zdChwX2h3Zm4sIHBfZW50LCBOVUxMKTsKK30KKworc3RhdGljIGludAorcWVkX2xsMl9hY3F1aXJlX2Nvbm5lY3Rpb25fcngoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgICBzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9pbmZvLCB1MTYgcnhfbnVtX2Rlc2MpCit7CisJc3RydWN0IHFlZF9sbDJfcnhfcGFja2V0ICpwX2Rlc2NxOworCXUzMiBjYXBhY2l0eTsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFyeF9udW1fZGVzYykKKwkJZ290byBvdXQ7CisKKwlyYyA9IHFlZF9jaGFpbl9hbGxvYyhwX2h3Zm4tPmNkZXYsCisJCQkgICAgIFFFRF9DSEFJTl9VU0VfVE9fQ09OU1VNRV9QUk9EVUNFLAorCQkJICAgICBRRURfQ0hBSU5fTU9ERV9ORVhUX1BUUiwKKwkJCSAgICAgUUVEX0NIQUlOX0NOVF9UWVBFX1UxNiwKKwkJCSAgICAgcnhfbnVtX2Rlc2MsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgY29yZV9yeF9iZCksCisJCQkgICAgICZwX2xsMl9pbmZvLT5yeF9xdWV1ZS5yeHFfY2hhaW4pOworCWlmIChyYykgeworCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGxsMiByeHEgY2hhaW5cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwljYXBhY2l0eSA9IHFlZF9jaGFpbl9nZXRfY2FwYWNpdHkoJnBfbGwyX2luZm8tPnJ4X3F1ZXVlLnJ4cV9jaGFpbik7CisJcF9kZXNjcSA9IGtjYWxsb2MoY2FwYWNpdHksIHNpemVvZihzdHJ1Y3QgcWVkX2xsMl9yeF9wYWNrZXQpLAorCQkJICBHRlBfS0VSTkVMKTsKKwlpZiAoIXBfZGVzY3EpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGxsMiBSeCBkZXNjXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCXBfbGwyX2luZm8tPnJ4X3F1ZXVlLmRlc2NxX2FycmF5ID0gcF9kZXNjcTsKKworCXJjID0gcWVkX2NoYWluX2FsbG9jKHBfaHdmbi0+Y2RldiwKKwkJCSAgICAgUUVEX0NIQUlOX1VTRV9UT19DT05TVU1FX1BST0RVQ0UsCisJCQkgICAgIFFFRF9DSEFJTl9NT0RFX1BCTCwKKwkJCSAgICAgUUVEX0NIQUlOX0NOVF9UWVBFX1UxNiwKKwkJCSAgICAgcnhfbnVtX2Rlc2MsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgY29yZV9yeF9mYXN0X3BhdGhfY3FlKSwKKwkJCSAgICAgJnBfbGwyX2luZm8tPnJ4X3F1ZXVlLnJjcV9jaGFpbik7CisJaWYgKHJjKSB7CisJCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgbGwyIHJjcSBjaGFpblxuIik7CisJCWdvdG8gb3V0OworCX0KKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX0xMMiwKKwkJICAgIkFsbG9jYXRlZCBMTDIgUnhxIFtUeXBlICUwOHhdIHdpdGggMHglMDh4IGJ1ZmZlcnNcbiIsCisJCSAgIHBfbGwyX2luZm8tPmNvbm5fdHlwZSwgcnhfbnVtX2Rlc2MpOworCitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHFlZF9sbDJfYWNxdWlyZV9jb25uZWN0aW9uX3R4KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfaW5mbywKKwkJCQkJIHUxNiB0eF9udW1fZGVzYykKK3sKKwlzdHJ1Y3QgcWVkX2xsMl90eF9wYWNrZXQgKnBfZGVzY3E7CisJdTMyIGNhcGFjaXR5OworCWludCByYyA9IDA7CisKKwlpZiAoIXR4X251bV9kZXNjKQorCQlnb3RvIG91dDsKKworCXJjID0gcWVkX2NoYWluX2FsbG9jKHBfaHdmbi0+Y2RldiwKKwkJCSAgICAgUUVEX0NIQUlOX1VTRV9UT19DT05TVU1FX1BST0RVQ0UsCisJCQkgICAgIFFFRF9DSEFJTl9NT0RFX1BCTCwKKwkJCSAgICAgUUVEX0NIQUlOX0NOVF9UWVBFX1UxNiwKKwkJCSAgICAgdHhfbnVtX2Rlc2MsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgY29yZV90eF9iZCksCisJCQkgICAgICZwX2xsMl9pbmZvLT50eF9xdWV1ZS50eHFfY2hhaW4pOworCWlmIChyYykKKwkJZ290byBvdXQ7CisKKwljYXBhY2l0eSA9IHFlZF9jaGFpbl9nZXRfY2FwYWNpdHkoJnBfbGwyX2luZm8tPnR4X3F1ZXVlLnR4cV9jaGFpbik7CisJcF9kZXNjcSA9IGtjYWxsb2MoY2FwYWNpdHksIHNpemVvZihzdHJ1Y3QgcWVkX2xsMl90eF9wYWNrZXQpLAorCQkJICBHRlBfS0VSTkVMKTsKKwlpZiAoIXBfZGVzY3EpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJcF9sbDJfaW5mby0+dHhfcXVldWUuZGVzY3FfYXJyYXkgPSBwX2Rlc2NxOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfTEwyLAorCQkgICAiQWxsb2NhdGVkIExMMiBUeHEgW1R5cGUgJTA4eF0gd2l0aCAweCUwOHggYnVmZmVyc1xuIiwKKwkJICAgcF9sbDJfaW5mby0+Y29ubl90eXBlLCB0eF9udW1fZGVzYyk7CisKK291dDoKKwlpZiAocmMpCisJCURQX05PVElDRShwX2h3Zm4sCisJCQkgICJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIFR4IExMMiB3aXRoIDB4JTA4eCBidWZmZXJzXG4iLAorCQkJICB0eF9udW1fZGVzYyk7CisJcmV0dXJuIHJjOworfQorCitpbnQgcWVkX2xsMl9hY3F1aXJlX2Nvbm5lY3Rpb24oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgICAgc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9wYXJhbXMsCisJCQkgICAgICAgdTE2IHJ4X251bV9kZXNjLAorCQkJICAgICAgIHUxNiB0eF9udW1fZGVzYywKKwkJCSAgICAgICB1OCAqcF9jb25uZWN0aW9uX2hhbmRsZSkKK3sKKwlxZWRfaW50X2NvbXBfY2JfdCBjb21wX3J4X2NiLCBjb21wX3R4X2NiOworCXN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2luZm8gPSBOVUxMOworCWludCByYzsKKwl1OCBpOworCisJaWYgKCFwX2Nvbm5lY3Rpb25faGFuZGxlIHx8ICFwX2h3Zm4tPnBfbGwyX2luZm8pCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRmluZCBhIGZyZWUgY29ubmVjdGlvbiB0byBiZSB1c2VkICovCisJZm9yIChpID0gMDsgKGkgPCBRRURfTUFYX05VTV9PRl9MTDJfQ09OTkVDVElPTlMpOyBpKyspIHsKKwkJbXV0ZXhfbG9jaygmcF9od2ZuLT5wX2xsMl9pbmZvW2ldLm11dGV4KTsKKwkJaWYgKHBfaHdmbi0+cF9sbDJfaW5mb1tpXS5iX2FjdGl2ZSkgeworCQkJbXV0ZXhfdW5sb2NrKCZwX2h3Zm4tPnBfbGwyX2luZm9baV0ubXV0ZXgpOworCQkJY29udGludWU7CisJCX0KKworCQlwX2h3Zm4tPnBfbGwyX2luZm9baV0uYl9hY3RpdmUgPSB0cnVlOworCQlwX2xsMl9pbmZvID0gJnBfaHdmbi0+cF9sbDJfaW5mb1tpXTsKKwkJbXV0ZXhfdW5sb2NrKCZwX2h3Zm4tPnBfbGwyX2luZm9baV0ubXV0ZXgpOworCQlicmVhazsKKwl9CisJaWYgKCFwX2xsMl9pbmZvKQorCQlyZXR1cm4gLUVCVVNZOworCisJcF9sbDJfaW5mby0+Y29ubl90eXBlID0gcF9wYXJhbXMtPmNvbm5fdHlwZTsKKwlwX2xsMl9pbmZvLT5tdHUgPSBwX3BhcmFtcy0+bXR1OworCXBfbGwyX2luZm8tPnJ4X2Ryb3BfdHRsMF9mbGcgPSBwX3BhcmFtcy0+cnhfZHJvcF90dGwwX2ZsZzsKKwlwX2xsMl9pbmZvLT5yeF92bGFuX3JlbW92YWxfZW4gPSBwX3BhcmFtcy0+cnhfdmxhbl9yZW1vdmFsX2VuOworCXBfbGwyX2luZm8tPnR4X3RjID0gcF9wYXJhbXMtPnR4X3RjOworCXBfbGwyX2luZm8tPnR4X2Rlc3QgPSBwX3BhcmFtcy0+dHhfZGVzdDsKKwlwX2xsMl9pbmZvLT5haV9lcnJfcGFja2V0X3Rvb19iaWcgPSBwX3BhcmFtcy0+YWlfZXJyX3BhY2tldF90b29fYmlnOworCXBfbGwyX2luZm8tPmFpX2Vycl9ub19idWYgPSBwX3BhcmFtcy0+YWlfZXJyX25vX2J1ZjsKKwlwX2xsMl9pbmZvLT5nc2lfZW5hYmxlID0gcF9wYXJhbXMtPmdzaV9lbmFibGU7CisKKwlyYyA9IHFlZF9sbDJfYWNxdWlyZV9jb25uZWN0aW9uX3J4KHBfaHdmbiwgcF9sbDJfaW5mbywgcnhfbnVtX2Rlc2MpOworCWlmIChyYykKKwkJZ290byBxX2FsbG9jYXRlX2ZhaWw7CisKKwlyYyA9IHFlZF9sbDJfYWNxdWlyZV9jb25uZWN0aW9uX3R4KHBfaHdmbiwgcF9sbDJfaW5mbywgdHhfbnVtX2Rlc2MpOworCWlmIChyYykKKwkJZ290byBxX2FsbG9jYXRlX2ZhaWw7CisKKwkvKiBSZWdpc3RlciBjYWxsYmFja3MgZm9yIHRoZSBSeC9UeCBxdWV1ZXMgKi8KKwljb21wX3J4X2NiID0gcWVkX2xsMl9yeHFfY29tcGxldGlvbjsKKwljb21wX3R4X2NiID0gcWVkX2xsMl90eHFfY29tcGxldGlvbjsKKworCWlmIChyeF9udW1fZGVzYykgeworCQlxZWRfaW50X3JlZ2lzdGVyX2NiKHBfaHdmbiwgY29tcF9yeF9jYiwKKwkJCQkgICAgJnBfaHdmbi0+cF9sbDJfaW5mb1tpXSwKKwkJCQkgICAgJnBfbGwyX2luZm8tPnJ4X3F1ZXVlLnJ4X3NiX2luZGV4LAorCQkJCSAgICAmcF9sbDJfaW5mby0+cnhfcXVldWUucF9md19jb25zKTsKKwkJcF9sbDJfaW5mby0+cnhfcXVldWUuYl9jYl9yZWdpc3RyZWQgPSB0cnVlOworCX0KKworCWlmICh0eF9udW1fZGVzYykgeworCQlxZWRfaW50X3JlZ2lzdGVyX2NiKHBfaHdmbiwKKwkJCQkgICAgY29tcF90eF9jYiwKKwkJCQkgICAgJnBfaHdmbi0+cF9sbDJfaW5mb1tpXSwKKwkJCQkgICAgJnBfbGwyX2luZm8tPnR4X3F1ZXVlLnR4X3NiX2luZGV4LAorCQkJCSAgICAmcF9sbDJfaW5mby0+dHhfcXVldWUucF9md19jb25zKTsKKwkJcF9sbDJfaW5mby0+dHhfcXVldWUuYl9jYl9yZWdpc3RyZWQgPSB0cnVlOworCX0KKworCSpwX2Nvbm5lY3Rpb25faGFuZGxlID0gaTsKKwlyZXR1cm4gcmM7CisKK3FfYWxsb2NhdGVfZmFpbDoKKwlxZWRfbGwyX3JlbGVhc2VfY29ubmVjdGlvbihwX2h3Zm4sIGkpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50IHFlZF9sbDJfZXN0YWJsaXNoX2Nvbm5lY3Rpb25fcngoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgIHN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm4pCit7CisJdTggYWN0aW9uX29uX2Vycm9yID0gMDsKKworCWlmICghUUVEX0xMMl9SWF9SRUdJU1RFUkVEKHBfbGwyX2Nvbm4pKQorCQlyZXR1cm4gMDsKKworCURJUkVDVF9SRUdfV1IocF9sbDJfY29ubi0+cnhfcXVldWUuc2V0X3Byb2RfYWRkciwgMHgwKTsKKworCVNFVF9GSUVMRChhY3Rpb25fb25fZXJyb3IsCisJCSAgQ09SRV9SWF9BQ1RJT05fT05fRVJST1JfUEFDS0VUX1RPT19CSUcsCisJCSAgcF9sbDJfY29ubi0+YWlfZXJyX3BhY2tldF90b29fYmlnKTsKKwlTRVRfRklFTEQoYWN0aW9uX29uX2Vycm9yLAorCQkgIENPUkVfUlhfQUNUSU9OX09OX0VSUk9SX05PX0JVRkYsIHBfbGwyX2Nvbm4tPmFpX2Vycl9ub19idWYpOworCisJcmV0dXJuIHFlZF9zcF9sbDJfcnhfcXVldWVfc3RhcnQocF9od2ZuLCBwX2xsMl9jb25uLCBhY3Rpb25fb25fZXJyb3IpOworfQorCitpbnQgcWVkX2xsMl9lc3RhYmxpc2hfY29ubmVjdGlvbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTggY29ubmVjdGlvbl9oYW5kbGUpCit7CisJc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfY29ubjsKKwlzdHJ1Y3QgcWVkX2xsMl9yeF9xdWV1ZSAqcF9yeDsKKwlzdHJ1Y3QgcWVkX2xsMl90eF9xdWV1ZSAqcF90eDsKKwlpbnQgcmMgPSAtRUlOVkFMOworCXUzMiBpLCBjYXBhY2l0eTsKKwl1OCBxaWQ7CisKKwlwX2xsMl9jb25uID0gcWVkX2xsMl9oYW5kbGVfc2FuaXR5X2xvY2socF9od2ZuLCBjb25uZWN0aW9uX2hhbmRsZSk7CisJaWYgKCFwX2xsMl9jb25uKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwX3J4ID0gJnBfbGwyX2Nvbm4tPnJ4X3F1ZXVlOworCXBfdHggPSAmcF9sbDJfY29ubi0+dHhfcXVldWU7CisKKwlxZWRfY2hhaW5fcmVzZXQoJnBfcngtPnJ4cV9jaGFpbik7CisJcWVkX2NoYWluX3Jlc2V0KCZwX3J4LT5yY3FfY2hhaW4pOworCUlOSVRfTElTVF9IRUFEKCZwX3J4LT5hY3RpdmVfZGVzY3EpOworCUlOSVRfTElTVF9IRUFEKCZwX3J4LT5mcmVlX2Rlc2NxKTsKKwlJTklUX0xJU1RfSEVBRCgmcF9yeC0+cG9zdGluZ19kZXNjcSk7CisJc3Bpbl9sb2NrX2luaXQoJnBfcngtPmxvY2spOworCWNhcGFjaXR5ID0gcWVkX2NoYWluX2dldF9jYXBhY2l0eSgmcF9yeC0+cnhxX2NoYWluKTsKKwlmb3IgKGkgPSAwOyBpIDwgY2FwYWNpdHk7IGkrKykKKwkJbGlzdF9hZGRfdGFpbCgmcF9yeC0+ZGVzY3FfYXJyYXlbaV0ubGlzdF9lbnRyeSwKKwkJCSAgICAgICZwX3J4LT5mcmVlX2Rlc2NxKTsKKwkqcF9yeC0+cF9md19jb25zID0gMDsKKworCXFlZF9jaGFpbl9yZXNldCgmcF90eC0+dHhxX2NoYWluKTsKKwlJTklUX0xJU1RfSEVBRCgmcF90eC0+YWN0aXZlX2Rlc2NxKTsKKwlJTklUX0xJU1RfSEVBRCgmcF90eC0+ZnJlZV9kZXNjcSk7CisJSU5JVF9MSVNUX0hFQUQoJnBfdHgtPnNlbmRpbmdfZGVzY3EpOworCXNwaW5fbG9ja19pbml0KCZwX3R4LT5sb2NrKTsKKwljYXBhY2l0eSA9IHFlZF9jaGFpbl9nZXRfY2FwYWNpdHkoJnBfdHgtPnR4cV9jaGFpbik7CisJZm9yIChpID0gMDsgaSA8IGNhcGFjaXR5OyBpKyspCisJCWxpc3RfYWRkX3RhaWwoJnBfdHgtPmRlc2NxX2FycmF5W2ldLmxpc3RfZW50cnksCisJCQkgICAgICAmcF90eC0+ZnJlZV9kZXNjcSk7CisJcF90eC0+Y3VyX2NvbXBsZXRpbmdfYmRfaWR4ID0gMDsKKwlwX3R4LT5iZHNfaWR4ID0gMDsKKwlwX3R4LT5iX2NvbXBsZXRpbmdfcGFja2V0ID0gZmFsc2U7CisJcF90eC0+Y3VyX3NlbmRfcGFja2V0ID0gTlVMTDsKKwlwX3R4LT5jdXJfc2VuZF9mcmFnX251bSA9IDA7CisJcF90eC0+Y3VyX2NvbXBsZXRpbmdfZnJhZ19udW0gPSAwOworCSpwX3R4LT5wX2Z3X2NvbnMgPSAwOworCisJcWVkX2N4dF9hY3F1aXJlX2NpZChwX2h3Zm4sIFBST1RPQ09MSURfQ09SRSwgJnBfbGwyX2Nvbm4tPmNpZCk7CisKKwlxaWQgPSBwX2h3Zm4tPmh3X2luZm8ucmVzY19zdGFydFtRRURfTEwyX1FVRVVFXSArIGNvbm5lY3Rpb25faGFuZGxlOworCXBfbGwyX2Nvbm4tPnF1ZXVlX2lkID0gcWlkOworCXBfbGwyX2Nvbm4tPnR4X3N0YXRzX2lkID0gcWlkOworCXBfcngtPnNldF9wcm9kX2FkZHIgPSAodTggX19pb21lbSAqKXBfaHdmbi0+cmVndmlldyArCisJCQkJCSAgICBHVFRfQkFSMF9NQVBfUkVHX1RTRE1fUkFNICsKKwkJCQkJICAgIFRTVE9STV9MTDJfUlhfUFJPRFNfT0ZGU0VUKHFpZCk7CisJcF90eC0+ZG9vcmJlbGxfYWRkciA9ICh1OCBfX2lvbWVtICopcF9od2ZuLT5kb29yYmVsbHMgKworCQkJCQkgICAgcWVkX2RiX2FkZHIocF9sbDJfY29ubi0+Y2lkLAorCQkJCQkJCURRX0RFTVNfTEVHQUNZKTsKKworCXJjID0gcWVkX2xsMl9lc3RhYmxpc2hfY29ubmVjdGlvbl9yeChwX2h3Zm4sIHBfbGwyX2Nvbm4pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBxZWRfc3BfbGwyX3R4X3F1ZXVlX3N0YXJ0KHBfaHdmbiwgcF9sbDJfY29ubik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAocF9od2ZuLT5od19pbmZvLnBlcnNvbmFsaXR5ICE9IFFFRF9QQ0lfRVRIX1JPQ0UpCisJCXFlZF93cihwX2h3Zm4sIHBfaHdmbi0+cF9tYWluX3B0dCwgUFJTX1JFR19VU0VfTElHSFRfTDIsIDEpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBxZWRfbGwyX3Bvc3RfcnhfYnVmZmVyX25vdGlmeV9mdyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgICBzdHJ1Y3QgcWVkX2xsMl9yeF9xdWV1ZSAqcF9yeCwKKwkJCQkJICAgICBzdHJ1Y3QgcWVkX2xsMl9yeF9wYWNrZXQgKnBfY3VycCkKK3sKKwlzdHJ1Y3QgcWVkX2xsMl9yeF9wYWNrZXQgKnBfcG9zdGluZ19wYWNrZXQgPSBOVUxMOworCXN0cnVjdCBjb3JlX2xsMl9yeF9wcm9kIHJ4X3Byb2QgPSB7IDAsIDAsIDAgfTsKKwlib29sIGJfbm90aWZ5X2Z3ID0gZmFsc2U7CisJdTE2IGJkX3Byb2QsIGNxX3Byb2Q7CisKKwkvKiBUaGlzIGhhbmRsZXMgdGhlIGZsdXNoaW5nIG9mIGFscmVhZHkgcG9zdGVkIGJ1ZmZlcnMgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnBfcngtPnBvc3RpbmdfZGVzY3EpKSB7CisJCXBfcG9zdGluZ19wYWNrZXQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwX3J4LT5wb3N0aW5nX2Rlc2NxLAorCQkJCQkJICAgIHN0cnVjdCBxZWRfbGwyX3J4X3BhY2tldCwKKwkJCQkJCSAgICBsaXN0X2VudHJ5KTsKKwkJbGlzdF9kZWwoJnBfcG9zdGluZ19wYWNrZXQtPmxpc3RfZW50cnkpOworCQlsaXN0X2FkZF90YWlsKCZwX3Bvc3RpbmdfcGFja2V0LT5saXN0X2VudHJ5LAorCQkJICAgICAgJnBfcngtPmFjdGl2ZV9kZXNjcSk7CisJCWJfbm90aWZ5X2Z3ID0gdHJ1ZTsKKwl9CisKKwkvKiBUaGlzIGhhbmRsZXMgdGhlIHN1cHBsaWVkIHBhY2tldCBbaWYgdGhlcmUgaXMgb25lXSAqLworCWlmIChwX2N1cnApIHsKKwkJbGlzdF9hZGRfdGFpbCgmcF9jdXJwLT5saXN0X2VudHJ5LCAmcF9yeC0+YWN0aXZlX2Rlc2NxKTsKKwkJYl9ub3RpZnlfZncgPSB0cnVlOworCX0KKworCWlmICghYl9ub3RpZnlfZncpCisJCXJldHVybjsKKworCWJkX3Byb2QgPSBxZWRfY2hhaW5fZ2V0X3Byb2RfaWR4KCZwX3J4LT5yeHFfY2hhaW4pOworCWNxX3Byb2QgPSBxZWRfY2hhaW5fZ2V0X3Byb2RfaWR4KCZwX3J4LT5yY3FfY2hhaW4pOworCXJ4X3Byb2QuYmRfcHJvZCA9IGNwdV90b19sZTE2KGJkX3Byb2QpOworCXJ4X3Byb2QuY3FlX3Byb2QgPSBjcHVfdG9fbGUxNihjcV9wcm9kKTsKKwlESVJFQ1RfUkVHX1dSKHBfcngtPnNldF9wcm9kX2FkZHIsICooKHUzMiAqKSZyeF9wcm9kKSk7Cit9CisKK2ludCBxZWRfbGwyX3Bvc3RfcnhfYnVmZmVyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgdTggY29ubmVjdGlvbl9oYW5kbGUsCisJCQkgICBkbWFfYWRkcl90IGFkZHIsCisJCQkgICB1MTYgYnVmX2xlbiwgdm9pZCAqY29va2llLCB1OCBub3RpZnlfZncpCit7CisJc3RydWN0IGNvcmVfcnhfYmRfd2l0aF9idWZmX2xlbiAqcF9jdXJiID0gTlVMTDsKKwlzdHJ1Y3QgcWVkX2xsMl9yeF9wYWNrZXQgKnBfY3VycCA9IE5VTEw7CisJc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfY29ubjsKKwlzdHJ1Y3QgcWVkX2xsMl9yeF9xdWV1ZSAqcF9yeDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgKnBfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJcF9sbDJfY29ubiA9IHFlZF9sbDJfaGFuZGxlX3Nhbml0eShwX2h3Zm4sIGNvbm5lY3Rpb25faGFuZGxlKTsKKwlpZiAoIXBfbGwyX2Nvbm4pCisJCXJldHVybiAtRUlOVkFMOworCXBfcnggPSAmcF9sbDJfY29ubi0+cnhfcXVldWU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcF9yeC0+bG9jaywgZmxhZ3MpOworCWlmICghbGlzdF9lbXB0eSgmcF9yeC0+ZnJlZV9kZXNjcSkpCisJCXBfY3VycCA9IGxpc3RfZmlyc3RfZW50cnkoJnBfcngtPmZyZWVfZGVzY3EsCisJCQkJCSAgc3RydWN0IHFlZF9sbDJfcnhfcGFja2V0LCBsaXN0X2VudHJ5KTsKKwlpZiAocF9jdXJwKSB7CisJCWlmIChxZWRfY2hhaW5fZ2V0X2VsZW1fbGVmdCgmcF9yeC0+cnhxX2NoYWluKSAmJgorCQkgICAgcWVkX2NoYWluX2dldF9lbGVtX2xlZnQoJnBfcngtPnJjcV9jaGFpbikpIHsKKwkJCXBfZGF0YSA9IHFlZF9jaGFpbl9wcm9kdWNlKCZwX3J4LT5yeHFfY2hhaW4pOworCQkJcF9jdXJiID0gKHN0cnVjdCBjb3JlX3J4X2JkX3dpdGhfYnVmZl9sZW4gKilwX2RhdGE7CisJCQlxZWRfY2hhaW5fcHJvZHVjZSgmcF9yeC0+cmNxX2NoYWluKTsKKwkJfQorCX0KKworCS8qIElmIHdlJ3JlIGxhY2tpbmcgZW50aXJlcywgbGV0J3MgdHJ5IHRvIGZsdXNoIGJ1ZmZlcnMgdG8gRlcgKi8KKwlpZiAoIXBfY3VycCB8fCAhcF9jdXJiKSB7CisJCXJjID0gLUVCVVNZOworCQlwX2N1cnAgPSBOVUxMOworCQlnb3RvIG91dF9ub3RpZnk7CisJfQorCisJLyogV2UgaGF2ZSBhbiBSeCBwYWNrZXQgd2UgY2FuIGZpbGwgKi8KKwlETUFfUkVHUEFJUl9MRShwX2N1cmItPmFkZHIsIGFkZHIpOworCXBfY3VyYi0+YnVmZl9sZW5ndGggPSBjcHVfdG9fbGUxNihidWZfbGVuKTsKKwlwX2N1cnAtPnJ4X2J1Zl9hZGRyID0gYWRkcjsKKwlwX2N1cnAtPmNvb2tpZSA9IGNvb2tpZTsKKwlwX2N1cnAtPnJ4cV9iZCA9IHBfY3VyYjsKKwlwX2N1cnAtPmJ1Zl9sZW5ndGggPSBidWZfbGVuOworCWxpc3RfZGVsKCZwX2N1cnAtPmxpc3RfZW50cnkpOworCisJLyogQ2hlY2sgaWYgd2Ugb25seSB3YW50IHRvIGVucXVldWUgdGhpcyBwYWNrZXQgd2l0aG91dCBpbmZvcm1pbmcgRlcgKi8KKwlpZiAoIW5vdGlmeV9mdykgeworCQlsaXN0X2FkZF90YWlsKCZwX2N1cnAtPmxpc3RfZW50cnksICZwX3J4LT5wb3N0aW5nX2Rlc2NxKTsKKwkJZ290byBvdXQ7CisJfQorCitvdXRfbm90aWZ5OgorCXFlZF9sbDJfcG9zdF9yeF9idWZmZXJfbm90aWZ5X2Z3KHBfaHdmbiwgcF9yeCwgcF9jdXJwKTsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwX3J4LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBxZWRfbGwyX3ByZXBhcmVfdHhfcGFja2V0X3NldChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICBzdHJ1Y3QgcWVkX2xsMl90eF9xdWV1ZSAqcF90eCwKKwkJCQkJICBzdHJ1Y3QgcWVkX2xsMl90eF9wYWNrZXQgKnBfY3VycCwKKwkJCQkJICB1OCBudW1fb2ZfYmRzLAorCQkJCQkgIGRtYV9hZGRyX3QgZmlyc3RfZnJhZywKKwkJCQkJICB1MTYgZmlyc3RfZnJhZ19sZW4sIHZvaWQgKnBfY29va2llLAorCQkJCQkgIHU4IG5vdGlmeV9mdykKK3sKKwlsaXN0X2RlbCgmcF9jdXJwLT5saXN0X2VudHJ5KTsKKwlwX2N1cnAtPmNvb2tpZSA9IHBfY29va2llOworCXBfY3VycC0+YmRfdXNlZCA9IG51bV9vZl9iZHM7CisJcF9jdXJwLT5ub3RpZnlfZncgPSBub3RpZnlfZnc7CisJcF90eC0+Y3VyX3NlbmRfcGFja2V0ID0gcF9jdXJwOworCXBfdHgtPmN1cl9zZW5kX2ZyYWdfbnVtID0gMDsKKworCXBfY3VycC0+YmRzX3NldFtwX3R4LT5jdXJfc2VuZF9mcmFnX251bV0udHhfZnJhZyA9IGZpcnN0X2ZyYWc7CisJcF9jdXJwLT5iZHNfc2V0W3BfdHgtPmN1cl9zZW5kX2ZyYWdfbnVtXS5mcmFnX2xlbiA9IGZpcnN0X2ZyYWdfbGVuOworCXBfdHgtPmN1cl9zZW5kX2ZyYWdfbnVtKys7Cit9CisKK3N0YXRpYyB2b2lkIHFlZF9sbDJfcHJlcGFyZV90eF9wYWNrZXRfc2V0X2JkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgIHN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyLAorCQkJCQkgICAgIHN0cnVjdCBxZWRfbGwyX3R4X3BhY2tldCAqcF9jdXJwLAorCQkJCQkgICAgIHU4IG51bV9vZl9iZHMsCisJCQkJCSAgICAgZW51bSBjb3JlX3R4X2Rlc3QgdHhfZGVzdCwKKwkJCQkJICAgICB1MTYgdmxhbiwKKwkJCQkJICAgICB1OCBiZF9mbGFncywKKwkJCQkJICAgICB1MTYgbDRfaGRyX29mZnNldF93LAorCQkJCQkgICAgIGVudW0gY29yZV9yb2NlX2ZsYXZvcl90eXBlIHR5cGUsCisJCQkJCSAgICAgZG1hX2FkZHJfdCBmaXJzdF9mcmFnLAorCQkJCQkgICAgIHUxNiBmaXJzdF9mcmFnX2xlbikKK3sKKwlzdHJ1Y3QgcWVkX2NoYWluICpwX3R4X2NoYWluID0gJnBfbGwyLT50eF9xdWV1ZS50eHFfY2hhaW47CisJdTE2IHByb2RfaWR4ID0gcWVkX2NoYWluX2dldF9wcm9kX2lkeChwX3R4X2NoYWluKTsKKwlzdHJ1Y3QgY29yZV90eF9iZCAqc3RhcnRfYmQgPSBOVUxMOworCXUxNiBmcmFnX2lkeDsKKworCXN0YXJ0X2JkID0gKHN0cnVjdCBjb3JlX3R4X2JkICopcWVkX2NoYWluX3Byb2R1Y2UocF90eF9jaGFpbik7CisJc3RhcnRfYmQtPm53X3ZsYW5fb3JfbGJfZWNobyA9IGNwdV90b19sZTE2KHZsYW4pOworCVNFVF9GSUVMRChzdGFydF9iZC0+Yml0ZmllbGQxLCBDT1JFX1RYX0JEX0w0X0hEUl9PRkZTRVRfVywKKwkJICBjcHVfdG9fbGUxNihsNF9oZHJfb2Zmc2V0X3cpKTsKKwlTRVRfRklFTEQoc3RhcnRfYmQtPmJpdGZpZWxkMSwgQ09SRV9UWF9CRF9UWF9EU1QsIHR4X2Rlc3QpOworCXN0YXJ0X2JkLT5iZF9mbGFncy5hc19iaXRmaWVsZCA9IGJkX2ZsYWdzOworCXN0YXJ0X2JkLT5iZF9mbGFncy5hc19iaXRmaWVsZCB8PSBDT1JFX1RYX0JEX0ZMQUdTX1NUQVJUX0JEX01BU0sgPDwKKwkgICAgQ09SRV9UWF9CRF9GTEFHU19TVEFSVF9CRF9TSElGVDsKKwlTRVRfRklFTEQoc3RhcnRfYmQtPmJpdGZpZWxkMCwgQ09SRV9UWF9CRF9OQkRTLCBudW1fb2ZfYmRzKTsKKwlETUFfUkVHUEFJUl9MRShzdGFydF9iZC0+YWRkciwgZmlyc3RfZnJhZyk7CisJc3RhcnRfYmQtPm5ieXRlcyA9IGNwdV90b19sZTE2KGZpcnN0X2ZyYWdfbGVuKTsKKworCVNFVF9GSUVMRChzdGFydF9iZC0+YmRfZmxhZ3MuYXNfYml0ZmllbGQsIENPUkVfVFhfQkRfRkxBR1NfUk9DRV9GTEFWLAorCQkgIHR5cGUpOworCisJRFBfVkVSQk9TRShwX2h3Zm4sCisJCSAgIChORVRJRl9NU0dfVFhfUVVFVUVEIHwgUUVEX01TR19MTDIpLAorCQkgICAiTEwyIFtxIDB4JTAyeCBjaWQgMHglMDh4IHR5cGUgMHglMDh4XSBUeCBQcm9kdWNlciBhdCBbMHglMDR4XSAtIHNldCB3aXRoIGEgJTA0eCBieXRlcyAlMDJ4IEJEcyBidWZmZXIgYXQgJTA4eDolMDh4XG4iLAorCQkgICBwX2xsMi0+cXVldWVfaWQsCisJCSAgIHBfbGwyLT5jaWQsCisJCSAgIHBfbGwyLT5jb25uX3R5cGUsCisJCSAgIHByb2RfaWR4LAorCQkgICBmaXJzdF9mcmFnX2xlbiwKKwkJICAgbnVtX29mX2JkcywKKwkJICAgbGUzMl90b19jcHUoc3RhcnRfYmQtPmFkZHIuaGkpLAorCQkgICBsZTMyX3RvX2NwdShzdGFydF9iZC0+YWRkci5sbykpOworCisJaWYgKHBfbGwyLT50eF9xdWV1ZS5jdXJfc2VuZF9mcmFnX251bSA9PSBudW1fb2ZfYmRzKQorCQlyZXR1cm47CisKKwkvKiBOZWVkIHRvIHByb3ZpZGUgdGhlIHBhY2tldCB3aXRoIGFkZGl0aW9uYWwgQkRzIGZvciBmcmFncyAqLworCWZvciAoZnJhZ19pZHggPSBwX2xsMi0+dHhfcXVldWUuY3VyX3NlbmRfZnJhZ19udW07CisJICAgICBmcmFnX2lkeCA8IG51bV9vZl9iZHM7IGZyYWdfaWR4KyspIHsKKwkJc3RydWN0IGNvcmVfdHhfYmQgKipwX2JkID0gJnBfY3VycC0+YmRzX3NldFtmcmFnX2lkeF0udHhxX2JkOworCisJCSpwX2JkID0gKHN0cnVjdCBjb3JlX3R4X2JkICopcWVkX2NoYWluX3Byb2R1Y2UocF90eF9jaGFpbik7CisJCSgqcF9iZCktPmJkX2ZsYWdzLmFzX2JpdGZpZWxkID0gMDsKKwkJKCpwX2JkKS0+Yml0ZmllbGQxID0gMDsKKwkJKCpwX2JkKS0+Yml0ZmllbGQwID0gMDsKKwkJcF9jdXJwLT5iZHNfc2V0W2ZyYWdfaWR4XS50eF9mcmFnID0gMDsKKwkJcF9jdXJwLT5iZHNfc2V0W2ZyYWdfaWR4XS5mcmFnX2xlbiA9IDA7CisJfQorfQorCisvKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hpbGUgdGhlIFR4cSBzcGlubG9jayBpcyBiZWluZyBoZWxkICovCitzdGF0aWMgdm9pZCBxZWRfbGwyX3R4X3BhY2tldF9ub3RpZnkoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICBzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uKQoreworCWJvb2wgYl9ub3RpZnkgPSBwX2xsMl9jb25uLT50eF9xdWV1ZS5jdXJfc2VuZF9wYWNrZXQtPm5vdGlmeV9mdzsKKwlzdHJ1Y3QgcWVkX2xsMl90eF9xdWV1ZSAqcF90eCA9ICZwX2xsMl9jb25uLT50eF9xdWV1ZTsKKwlzdHJ1Y3QgcWVkX2xsMl90eF9wYWNrZXQgKnBfcGt0ID0gTlVMTDsKKwlzdHJ1Y3QgY29yZV9kYl9kYXRhIGRiX21zZyA9IHsgMCwgMCwgMCB9OworCXUxNiBiZF9wcm9kOworCisJLyogSWYgdGhlcmUgYXJlIG1pc3NpbmcgQkRzLCBkb24ndCBkbyBhbnl0aGluZyBub3cgKi8KKwlpZiAocF9sbDJfY29ubi0+dHhfcXVldWUuY3VyX3NlbmRfZnJhZ19udW0gIT0KKwkgICAgcF9sbDJfY29ubi0+dHhfcXVldWUuY3VyX3NlbmRfcGFja2V0LT5iZF91c2VkKQorCQlyZXR1cm47CisKKwkvKiBQdXNoIHRoZSBjdXJyZW50IHBhY2tldCB0byB0aGUgbGlzdCBhbmQgY2xlYW4gYWZ0ZXIgaXQgKi8KKwlsaXN0X2FkZF90YWlsKCZwX2xsMl9jb25uLT50eF9xdWV1ZS5jdXJfc2VuZF9wYWNrZXQtPmxpc3RfZW50cnksCisJCSAgICAgICZwX2xsMl9jb25uLT50eF9xdWV1ZS5zZW5kaW5nX2Rlc2NxKTsKKwlwX2xsMl9jb25uLT50eF9xdWV1ZS5jdXJfc2VuZF9wYWNrZXQgPSBOVUxMOworCXBfbGwyX2Nvbm4tPnR4X3F1ZXVlLmN1cl9zZW5kX2ZyYWdfbnVtID0gMDsKKworCS8qIE5vdGlmeSBGVyBvZiBwYWNrZXQgb25seSBpZiByZXF1ZXN0ZWQgdG8gKi8KKwlpZiAoIWJfbm90aWZ5KQorCQlyZXR1cm47CisKKwliZF9wcm9kID0gcWVkX2NoYWluX2dldF9wcm9kX2lkeCgmcF9sbDJfY29ubi0+dHhfcXVldWUudHhxX2NoYWluKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmcF90eC0+c2VuZGluZ19kZXNjcSkpIHsKKwkJcF9wa3QgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwX3R4LT5zZW5kaW5nX2Rlc2NxLAorCQkJCQkgc3RydWN0IHFlZF9sbDJfdHhfcGFja2V0LCBsaXN0X2VudHJ5KTsKKwkJaWYgKCFwX3BrdCkKKwkJCWJyZWFrOworCisJCWxpc3RfZGVsKCZwX3BrdC0+bGlzdF9lbnRyeSk7CisJCWxpc3RfYWRkX3RhaWwoJnBfcGt0LT5saXN0X2VudHJ5LCAmcF90eC0+YWN0aXZlX2Rlc2NxKTsKKwl9CisKKwlTRVRfRklFTEQoZGJfbXNnLnBhcmFtcywgQ09SRV9EQl9EQVRBX0RFU1QsIERCX0RFU1RfWENNKTsKKwlTRVRfRklFTEQoZGJfbXNnLnBhcmFtcywgQ09SRV9EQl9EQVRBX0FHR19DTUQsIERCX0FHR19DTURfU0VUKTsKKwlTRVRfRklFTEQoZGJfbXNnLnBhcmFtcywgQ09SRV9EQl9EQVRBX0FHR19WQUxfU0VMLAorCQkgIERRX1hDTV9DT1JFX1RYX0JEX1BST0RfQ01EKTsKKwlkYl9tc2cuYWdnX2ZsYWdzID0gRFFfWENNX0NPUkVfRFFfQ0ZfQ01EOworCWRiX21zZy5zcHFfcHJvZCA9IGNwdV90b19sZTE2KGJkX3Byb2QpOworCisJLyogTWFrZSBzdXJlIHRoZSBCRHMgZGF0YSBpcyB1cGRhdGVkIGJlZm9yZSByaW5naW5nIHRoZSBkb29yYmVsbCAqLworCXdtYigpOworCisJRElSRUNUX1JFR19XUihwX3R4LT5kb29yYmVsbF9hZGRyLCAqKCh1MzIgKikmZGJfbXNnKSk7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwKKwkJICAgKE5FVElGX01TR19UWF9RVUVVRUQgfCBRRURfTVNHX0xMMiksCisJCSAgICJMTDIgW3EgMHglMDJ4IGNpZCAweCUwOHggdHlwZSAweCUwOHhdIERvb3JiZWxsZWQgW3Byb2R1Y2VyIDB4JTA0eF1cbiIsCisJCSAgIHBfbGwyX2Nvbm4tPnF1ZXVlX2lkLAorCQkgICBwX2xsMl9jb25uLT5jaWQsIHBfbGwyX2Nvbm4tPmNvbm5fdHlwZSwgZGJfbXNnLnNwcV9wcm9kKTsKK30KKworaW50IHFlZF9sbDJfcHJlcGFyZV90eF9wYWNrZXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgICB1OCBjb25uZWN0aW9uX2hhbmRsZSwKKwkJCSAgICAgIHU4IG51bV9vZl9iZHMsCisJCQkgICAgICB1MTYgdmxhbiwKKwkJCSAgICAgIHU4IGJkX2ZsYWdzLAorCQkJICAgICAgdTE2IGw0X2hkcl9vZmZzZXRfdywKKwkJCSAgICAgIGVudW0gcWVkX2xsMl9yb2NlX2ZsYXZvcl90eXBlIHFlZF9yb2NlX2ZsYXZvciwKKwkJCSAgICAgIGRtYV9hZGRyX3QgZmlyc3RfZnJhZywKKwkJCSAgICAgIHUxNiBmaXJzdF9mcmFnX2xlbiwgdm9pZCAqY29va2llLCB1OCBub3RpZnlfZncpCit7CisJc3RydWN0IHFlZF9sbDJfdHhfcGFja2V0ICpwX2N1cnAgPSBOVUxMOworCXN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm4gPSBOVUxMOworCWVudW0gY29yZV9yb2NlX2ZsYXZvcl90eXBlIHJvY2VfZmxhdm9yOworCXN0cnVjdCBxZWRfbGwyX3R4X3F1ZXVlICpwX3R4OworCXN0cnVjdCBxZWRfY2hhaW4gKnBfdHhfY2hhaW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAwOworCisJcF9sbDJfY29ubiA9IHFlZF9sbDJfaGFuZGxlX3Nhbml0eShwX2h3Zm4sIGNvbm5lY3Rpb25faGFuZGxlKTsKKwlpZiAoIXBfbGwyX2Nvbm4pCisJCXJldHVybiAtRUlOVkFMOworCXBfdHggPSAmcF9sbDJfY29ubi0+dHhfcXVldWU7CisJcF90eF9jaGFpbiA9ICZwX3R4LT50eHFfY2hhaW47CisKKwlpZiAobnVtX29mX2JkcyA+IENPUkVfTEwyX1RYX01BWF9CRFNfUEVSX1BBQ0tFVCkKKwkJcmV0dXJuIC1FSU87CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcF90eC0+bG9jaywgZmxhZ3MpOworCWlmIChwX3R4LT5jdXJfc2VuZF9wYWNrZXQpIHsKKwkJcmMgPSAtRUVYSVNUOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBHZXQgZW50cnksIGJ1dCBvbmx5IGlmIHdlIGhhdmUgdHggZWxlbWVudHMgZm9yIGl0ICovCisJaWYgKCFsaXN0X2VtcHR5KCZwX3R4LT5mcmVlX2Rlc2NxKSkKKwkJcF9jdXJwID0gbGlzdF9maXJzdF9lbnRyeSgmcF90eC0+ZnJlZV9kZXNjcSwKKwkJCQkJICBzdHJ1Y3QgcWVkX2xsMl90eF9wYWNrZXQsIGxpc3RfZW50cnkpOworCWlmIChwX2N1cnAgJiYgcWVkX2NoYWluX2dldF9lbGVtX2xlZnQocF90eF9jaGFpbikgPCBudW1fb2ZfYmRzKQorCQlwX2N1cnAgPSBOVUxMOworCisJaWYgKCFwX2N1cnApIHsKKwkJcmMgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChxZWRfcm9jZV9mbGF2b3IgPT0gUUVEX0xMMl9ST0NFKSB7CisJCXJvY2VfZmxhdm9yID0gQ09SRV9ST0NFOworCX0gZWxzZSBpZiAocWVkX3JvY2VfZmxhdm9yID09IFFFRF9MTDJfUlJPQ0UpIHsKKwkJcm9jZV9mbGF2b3IgPSBDT1JFX1JST0NFOworCX0gZWxzZSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogUHJlcGFyZSBwYWNrZXQgYW5kIEJELCBhbmQgcGVyaGFwcyBzZW5kIGEgZG9vcmJlbGwgdG8gRlcgKi8KKwlxZWRfbGwyX3ByZXBhcmVfdHhfcGFja2V0X3NldChwX2h3Zm4sIHBfdHgsIHBfY3VycCwKKwkJCQkgICAgICBudW1fb2ZfYmRzLCBmaXJzdF9mcmFnLAorCQkJCSAgICAgIGZpcnN0X2ZyYWdfbGVuLCBjb29raWUsIG5vdGlmeV9mdyk7CisJcWVkX2xsMl9wcmVwYXJlX3R4X3BhY2tldF9zZXRfYmQocF9od2ZuLCBwX2xsMl9jb25uLCBwX2N1cnAsCisJCQkJCSBudW1fb2ZfYmRzLCBDT1JFX1RYX0RFU1RfTlcsCisJCQkJCSB2bGFuLCBiZF9mbGFncywgbDRfaGRyX29mZnNldF93LAorCQkJCQkgcm9jZV9mbGF2b3IsCisJCQkJCSBmaXJzdF9mcmFnLCBmaXJzdF9mcmFnX2xlbik7CisKKwlxZWRfbGwyX3R4X3BhY2tldF9ub3RpZnkocF9od2ZuLCBwX2xsMl9jb25uKTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBfdHgtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxZWRfbGwyX3NldF9mcmFnbWVudF9vZl90eF9wYWNrZXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICAgdTggY29ubmVjdGlvbl9oYW5kbGUsCisJCQkJICAgICAgZG1hX2FkZHJfdCBhZGRyLCB1MTYgbmJ5dGVzKQoreworCXN0cnVjdCBxZWRfbGwyX3R4X3BhY2tldCAqcF9jdXJfc2VuZF9wYWNrZXQgPSBOVUxMOworCXN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm4gPSBOVUxMOworCXUxNiBjdXJfc2VuZF9mcmFnX251bSA9IDA7CisJc3RydWN0IGNvcmVfdHhfYmQgKnBfYmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXBfbGwyX2Nvbm4gPSBxZWRfbGwyX2hhbmRsZV9zYW5pdHkocF9od2ZuLCBjb25uZWN0aW9uX2hhbmRsZSk7CisJaWYgKCFwX2xsMl9jb25uKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghcF9sbDJfY29ubi0+dHhfcXVldWUuY3VyX3NlbmRfcGFja2V0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBfY3VyX3NlbmRfcGFja2V0ID0gcF9sbDJfY29ubi0+dHhfcXVldWUuY3VyX3NlbmRfcGFja2V0OworCWN1cl9zZW5kX2ZyYWdfbnVtID0gcF9sbDJfY29ubi0+dHhfcXVldWUuY3VyX3NlbmRfZnJhZ19udW07CisKKwlpZiAoY3VyX3NlbmRfZnJhZ19udW0gPj0gcF9jdXJfc2VuZF9wYWNrZXQtPmJkX3VzZWQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRmlsbCB0aGUgQkQgaW5mb3JtYXRpb24sIGFuZCBwb3NzaWJseSBub3RpZnkgRlcgKi8KKwlwX2JkID0gcF9jdXJfc2VuZF9wYWNrZXQtPmJkc19zZXRbY3VyX3NlbmRfZnJhZ19udW1dLnR4cV9iZDsKKwlETUFfUkVHUEFJUl9MRShwX2JkLT5hZGRyLCBhZGRyKTsKKwlwX2JkLT5uYnl0ZXMgPSBjcHVfdG9fbGUxNihuYnl0ZXMpOworCXBfY3VyX3NlbmRfcGFja2V0LT5iZHNfc2V0W2N1cl9zZW5kX2ZyYWdfbnVtXS50eF9mcmFnID0gYWRkcjsKKwlwX2N1cl9zZW5kX3BhY2tldC0+YmRzX3NldFtjdXJfc2VuZF9mcmFnX251bV0uZnJhZ19sZW4gPSBuYnl0ZXM7CisKKwlwX2xsMl9jb25uLT50eF9xdWV1ZS5jdXJfc2VuZF9mcmFnX251bSsrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBfbGwyX2Nvbm4tPnR4X3F1ZXVlLmxvY2ssIGZsYWdzKTsKKwlxZWRfbGwyX3R4X3BhY2tldF9ub3RpZnkocF9od2ZuLCBwX2xsMl9jb25uKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwX2xsMl9jb25uLT50eF9xdWV1ZS5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHFlZF9sbDJfdGVybWluYXRlX2Nvbm5lY3Rpb24oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHU4IGNvbm5lY3Rpb25faGFuZGxlKQoreworCXN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm4gPSBOVUxMOworCWludCByYyA9IC1FSU5WQUw7CisKKwlwX2xsMl9jb25uID0gcWVkX2xsMl9oYW5kbGVfc2FuaXR5X2xvY2socF9od2ZuLCBjb25uZWN0aW9uX2hhbmRsZSk7CisJaWYgKCFwX2xsMl9jb25uKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFN0b3AgVHggJiBSeCBvZiBjb25uZWN0aW9uLCBpZiBuZWVkZWQgKi8KKwlpZiAoUUVEX0xMMl9UWF9SRUdJU1RFUkVEKHBfbGwyX2Nvbm4pKSB7CisJCXJjID0gcWVkX3NwX2xsMl90eF9xdWV1ZV9zdG9wKHBfaHdmbiwgcF9sbDJfY29ubik7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwkJcWVkX2xsMl90eHFfZmx1c2gocF9od2ZuLCBjb25uZWN0aW9uX2hhbmRsZSk7CisJfQorCisJaWYgKFFFRF9MTDJfUlhfUkVHSVNURVJFRChwX2xsMl9jb25uKSkgeworCQlyYyA9IHFlZF9zcF9sbDJfcnhfcXVldWVfc3RvcChwX2h3Zm4sIHBfbGwyX2Nvbm4pOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJCXFlZF9sbDJfcnhxX2ZsdXNoKHBfaHdmbiwgY29ubmVjdGlvbl9oYW5kbGUpOworCX0KKworCXJldHVybiByYzsKK30KKwordm9pZCBxZWRfbGwyX3JlbGVhc2VfY29ubmVjdGlvbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTggY29ubmVjdGlvbl9oYW5kbGUpCit7CisJc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfY29ubiA9IE5VTEw7CisKKwlwX2xsMl9jb25uID0gcWVkX2xsMl9oYW5kbGVfc2FuaXR5KHBfaHdmbiwgY29ubmVjdGlvbl9oYW5kbGUpOworCWlmICghcF9sbDJfY29ubikKKwkJcmV0dXJuOworCisJaWYgKFFFRF9MTDJfUlhfUkVHSVNURVJFRChwX2xsMl9jb25uKSkgeworCQlwX2xsMl9jb25uLT5yeF9xdWV1ZS5iX2NiX3JlZ2lzdHJlZCA9IGZhbHNlOworCQlxZWRfaW50X3VucmVnaXN0ZXJfY2IocF9od2ZuLCBwX2xsMl9jb25uLT5yeF9xdWV1ZS5yeF9zYl9pbmRleCk7CisJfQorCisJaWYgKFFFRF9MTDJfVFhfUkVHSVNURVJFRChwX2xsMl9jb25uKSkgeworCQlwX2xsMl9jb25uLT50eF9xdWV1ZS5iX2NiX3JlZ2lzdHJlZCA9IGZhbHNlOworCQlxZWRfaW50X3VucmVnaXN0ZXJfY2IocF9od2ZuLCBwX2xsMl9jb25uLT50eF9xdWV1ZS50eF9zYl9pbmRleCk7CisJfQorCisJa2ZyZWUocF9sbDJfY29ubi0+dHhfcXVldWUuZGVzY3FfYXJyYXkpOworCXFlZF9jaGFpbl9mcmVlKHBfaHdmbi0+Y2RldiwgJnBfbGwyX2Nvbm4tPnR4X3F1ZXVlLnR4cV9jaGFpbik7CisKKwlrZnJlZShwX2xsMl9jb25uLT5yeF9xdWV1ZS5kZXNjcV9hcnJheSk7CisJcWVkX2NoYWluX2ZyZWUocF9od2ZuLT5jZGV2LCAmcF9sbDJfY29ubi0+cnhfcXVldWUucnhxX2NoYWluKTsKKwlxZWRfY2hhaW5fZnJlZShwX2h3Zm4tPmNkZXYsICZwX2xsMl9jb25uLT5yeF9xdWV1ZS5yY3FfY2hhaW4pOworCisJcWVkX2N4dF9yZWxlYXNlX2NpZChwX2h3Zm4sIHBfbGwyX2Nvbm4tPmNpZCk7CisKKwltdXRleF9sb2NrKCZwX2xsMl9jb25uLT5tdXRleCk7CisJcF9sbDJfY29ubi0+Yl9hY3RpdmUgPSBmYWxzZTsKKwltdXRleF91bmxvY2soJnBfbGwyX2Nvbm4tPm11dGV4KTsKK30KKworc3RydWN0IHFlZF9sbDJfaW5mbyAqcWVkX2xsMl9hbGxvYyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbikKK3sKKwlzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uZWN0aW9uczsKKwl1OCBpOworCisJLyogQWxsb2NhdGUgTEwyJ3Mgc2V0IHN0cnVjdCAqLworCXBfbGwyX2Nvbm5lY3Rpb25zID0ga2NhbGxvYyhRRURfTUFYX05VTV9PRl9MTDJfQ09OTkVDVElPTlMsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgcWVkX2xsMl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwX2xsMl9jb25uZWN0aW9ucykgeworCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGBzdHJ1Y3QgcWVkX2xsMidcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgUUVEX01BWF9OVU1fT0ZfTEwyX0NPTk5FQ1RJT05TOyBpKyspCisJCXBfbGwyX2Nvbm5lY3Rpb25zW2ldLm15X2lkID0gaTsKKworCXJldHVybiBwX2xsMl9jb25uZWN0aW9uczsKK30KKwordm9pZCBxZWRfbGwyX3NldHVwKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkgICBzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uZWN0aW9ucykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBRRURfTUFYX05VTV9PRl9MTDJfQ09OTkVDVElPTlM7IGkrKykKKwkJbXV0ZXhfaW5pdCgmcF9sbDJfY29ubmVjdGlvbnNbaV0ubXV0ZXgpOworfQorCit2b2lkIHFlZF9sbDJfZnJlZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJICBzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uZWN0aW9ucykKK3sKKwlrZnJlZShwX2xsMl9jb25uZWN0aW9ucyk7Cit9CisKK3N0YXRpYyB2b2lkIF9xZWRfbGwyX2dldF90c3RhdHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCXN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm4sCisJCQkJc3RydWN0IHFlZF9sbDJfc3RhdHMgKnBfc3RhdHMpCit7CisJc3RydWN0IGNvcmVfbGwyX3RzdG9ybV9wZXJfcXVldWVfc3RhdCB0c3RhdHM7CisJdTggcWlkID0gcF9sbDJfY29ubi0+cXVldWVfaWQ7CisJdTMyIHRzdGF0c19hZGRyOworCisJbWVtc2V0KCZ0c3RhdHMsIDAsIHNpemVvZih0c3RhdHMpKTsKKwl0c3RhdHNfYWRkciA9IEJBUjBfTUFQX1JFR19UU0RNX1JBTSArCisJCSAgICAgIENPUkVfTEwyX1RTVE9STV9QRVJfUVVFVUVfU1RBVF9PRkZTRVQocWlkKTsKKwlxZWRfbWVtY3B5X2Zyb20ocF9od2ZuLCBwX3B0dCwgJnRzdGF0cywgdHN0YXRzX2FkZHIsIHNpemVvZih0c3RhdHMpKTsKKworCXBfc3RhdHMtPnBhY2tldF90b29fYmlnX2Rpc2NhcmQgPQorCQkJSElMT182NF9SRUdQQUlSKHRzdGF0cy5wYWNrZXRfdG9vX2JpZ19kaXNjYXJkKTsKKwlwX3N0YXRzLT5ub19idWZmX2Rpc2NhcmQgPSBISUxPXzY0X1JFR1BBSVIodHN0YXRzLm5vX2J1ZmZfZGlzY2FyZCk7Cit9CisKK3N0YXRpYyB2b2lkIF9xZWRfbGwyX2dldF91c3RhdHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCXN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm4sCisJCQkJc3RydWN0IHFlZF9sbDJfc3RhdHMgKnBfc3RhdHMpCit7CisJc3RydWN0IGNvcmVfbGwyX3VzdG9ybV9wZXJfcXVldWVfc3RhdCB1c3RhdHM7CisJdTggcWlkID0gcF9sbDJfY29ubi0+cXVldWVfaWQ7CisJdTMyIHVzdGF0c19hZGRyOworCisJbWVtc2V0KCZ1c3RhdHMsIDAsIHNpemVvZih1c3RhdHMpKTsKKwl1c3RhdHNfYWRkciA9IEJBUjBfTUFQX1JFR19VU0RNX1JBTSArCisJCSAgICAgIENPUkVfTEwyX1VTVE9STV9QRVJfUVVFVUVfU1RBVF9PRkZTRVQocWlkKTsKKwlxZWRfbWVtY3B5X2Zyb20ocF9od2ZuLCBwX3B0dCwgJnVzdGF0cywgdXN0YXRzX2FkZHIsIHNpemVvZih1c3RhdHMpKTsKKworCXBfc3RhdHMtPnJjdl91Y2FzdF9ieXRlcyA9IEhJTE9fNjRfUkVHUEFJUih1c3RhdHMucmN2X3VjYXN0X2J5dGVzKTsKKwlwX3N0YXRzLT5yY3ZfbWNhc3RfYnl0ZXMgPSBISUxPXzY0X1JFR1BBSVIodXN0YXRzLnJjdl9tY2FzdF9ieXRlcyk7CisJcF9zdGF0cy0+cmN2X2JjYXN0X2J5dGVzID0gSElMT182NF9SRUdQQUlSKHVzdGF0cy5yY3ZfYmNhc3RfYnl0ZXMpOworCXBfc3RhdHMtPnJjdl91Y2FzdF9wa3RzID0gSElMT182NF9SRUdQQUlSKHVzdGF0cy5yY3ZfdWNhc3RfcGt0cyk7CisJcF9zdGF0cy0+cmN2X21jYXN0X3BrdHMgPSBISUxPXzY0X1JFR1BBSVIodXN0YXRzLnJjdl9tY2FzdF9wa3RzKTsKKwlwX3N0YXRzLT5yY3ZfYmNhc3RfcGt0cyA9IEhJTE9fNjRfUkVHUEFJUih1c3RhdHMucmN2X2JjYXN0X3BrdHMpOworfQorCitzdGF0aWMgdm9pZCBfcWVkX2xsMl9nZXRfcHN0YXRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCXN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQlzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uLAorCQkJCXN0cnVjdCBxZWRfbGwyX3N0YXRzICpwX3N0YXRzKQoreworCXN0cnVjdCBjb3JlX2xsMl9wc3Rvcm1fcGVyX3F1ZXVlX3N0YXQgcHN0YXRzOworCXU4IHN0YXRzX2lkID0gcF9sbDJfY29ubi0+dHhfc3RhdHNfaWQ7CisJdTMyIHBzdGF0c19hZGRyOworCisJbWVtc2V0KCZwc3RhdHMsIDAsIHNpemVvZihwc3RhdHMpKTsKKwlwc3RhdHNfYWRkciA9IEJBUjBfTUFQX1JFR19QU0RNX1JBTSArCisJCSAgICAgIENPUkVfTEwyX1BTVE9STV9QRVJfUVVFVUVfU1RBVF9PRkZTRVQoc3RhdHNfaWQpOworCXFlZF9tZW1jcHlfZnJvbShwX2h3Zm4sIHBfcHR0LCAmcHN0YXRzLCBwc3RhdHNfYWRkciwgc2l6ZW9mKHBzdGF0cykpOworCisJcF9zdGF0cy0+c2VudF91Y2FzdF9ieXRlcyA9IEhJTE9fNjRfUkVHUEFJUihwc3RhdHMuc2VudF91Y2FzdF9ieXRlcyk7CisJcF9zdGF0cy0+c2VudF9tY2FzdF9ieXRlcyA9IEhJTE9fNjRfUkVHUEFJUihwc3RhdHMuc2VudF9tY2FzdF9ieXRlcyk7CisJcF9zdGF0cy0+c2VudF9iY2FzdF9ieXRlcyA9IEhJTE9fNjRfUkVHUEFJUihwc3RhdHMuc2VudF9iY2FzdF9ieXRlcyk7CisJcF9zdGF0cy0+c2VudF91Y2FzdF9wa3RzID0gSElMT182NF9SRUdQQUlSKHBzdGF0cy5zZW50X3VjYXN0X3BrdHMpOworCXBfc3RhdHMtPnNlbnRfbWNhc3RfcGt0cyA9IEhJTE9fNjRfUkVHUEFJUihwc3RhdHMuc2VudF9tY2FzdF9wa3RzKTsKKwlwX3N0YXRzLT5zZW50X2JjYXN0X3BrdHMgPSBISUxPXzY0X1JFR1BBSVIocHN0YXRzLnNlbnRfYmNhc3RfcGt0cyk7Cit9CisKK2ludCBxZWRfbGwyX2dldF9zdGF0cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJICAgICAgdTggY29ubmVjdGlvbl9oYW5kbGUsIHN0cnVjdCBxZWRfbGwyX3N0YXRzICpwX3N0YXRzKQoreworCXN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm4gPSBOVUxMOworCXN0cnVjdCBxZWRfcHR0ICpwX3B0dDsKKworCW1lbXNldChwX3N0YXRzLCAwLCBzaXplb2YoKnBfc3RhdHMpKTsKKworCWlmICgoY29ubmVjdGlvbl9oYW5kbGUgPj0gUUVEX01BWF9OVU1fT0ZfTEwyX0NPTk5FQ1RJT05TKSB8fAorCSAgICAhcF9od2ZuLT5wX2xsMl9pbmZvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBfbGwyX2Nvbm4gPSAmcF9od2ZuLT5wX2xsMl9pbmZvW2Nvbm5lY3Rpb25faGFuZGxlXTsKKworCXBfcHR0ID0gcWVkX3B0dF9hY3F1aXJlKHBfaHdmbik7CisJaWYgKCFwX3B0dCkgeworCQlEUF9FUlIocF9od2ZuLCAiRmFpbGVkIHRvIGFjcXVpcmUgcHR0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJX3FlZF9sbDJfZ2V0X3RzdGF0cyhwX2h3Zm4sIHBfcHR0LCBwX2xsMl9jb25uLCBwX3N0YXRzKTsKKwlfcWVkX2xsMl9nZXRfdXN0YXRzKHBfaHdmbiwgcF9wdHQsIHBfbGwyX2Nvbm4sIHBfc3RhdHMpOworCWlmIChwX2xsMl9jb25uLT50eF9zdGF0c19lbikKKwkJX3FlZF9sbDJfZ2V0X3BzdGF0cyhwX2h3Zm4sIHBfcHR0LCBwX2xsMl9jb25uLCBwX3N0YXRzKTsKKworCXFlZF9wdHRfcmVsZWFzZShwX2h3Zm4sIHBfcHR0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWVkX2xsMl9yZWdpc3Rlcl9jYl9vcHMoc3RydWN0IHFlZF9kZXYgKmNkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBxZWRfbGwyX2NiX29wcyAqb3BzLAorCQkJCSAgICB2b2lkICpjb29raWUpCit7CisJY2Rldi0+bGwyLT5jYnMgPSBvcHM7CisJY2Rldi0+bGwyLT5jYl9jb29raWUgPSBjb29raWU7Cit9CisKK3N0YXRpYyBpbnQgcWVkX2xsMl9zdGFydChzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IHFlZF9sbDJfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHFlZF9sbDJfaW5mbyBsbDJfaW5mbzsKKwlzdHJ1Y3QgcWVkX2xsMl9idWZmZXIgKmJ1ZmZlcjsKKwllbnVtIHFlZF9sbDJfY29ubl90eXBlIGNvbm5fdHlwZTsKKwlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQ7CisJaW50IHJjLCBpOworCisJLyogSW5pdGlhbGl6ZSBMTDIgbG9ja3MgJiBsaXN0cyAqLworCUlOSVRfTElTVF9IRUFEKCZjZGV2LT5sbDItPmxpc3QpOworCXNwaW5fbG9ja19pbml0KCZjZGV2LT5sbDItPmxvY2spOworCWNkZXYtPmxsMi0+cnhfc2l6ZSA9IE5FVF9TS0JfUEFEICsgRVRIX0hMRU4gKworCQkJICAgICBMMV9DQUNIRV9CWVRFUyArIHBhcmFtcy0+bXR1OworCWNkZXYtPmxsMi0+ZnJhZ3NfbWFwcGVkID0gcGFyYW1zLT5mcmFnc19tYXBwZWQ7CisKKwkvKkFsbG9jYXRlIG1lbW9yeSBmb3IgTEwyICovCisJRFBfSU5GTyhjZGV2LCAiQWxsb2NhdGluZyBMTDIgYnVmZmVycyBvZiBzaXplICUwOHggYnl0ZXNcbiIsCisJCWNkZXYtPmxsMi0+cnhfc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IFFFRF9MTDJfUlhfU0laRTsgaSsrKSB7CisJCWJ1ZmZlciA9IGt6YWxsb2Moc2l6ZW9mKCpidWZmZXIpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidWZmZXIpIHsKKwkJCURQX0lORk8oY2RldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBMTDIgYnVmZmVyc1xuIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlyYyA9IHFlZF9sbDJfYWxsb2NfYnVmZmVyKGNkZXYsICh1OCAqKikmYnVmZmVyLT5kYXRhLAorCQkJCQkgICZidWZmZXItPnBoeXNfYWRkcik7CisJCWlmIChyYykgeworCQkJa2ZyZWUoYnVmZmVyKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWxpc3RfYWRkX3RhaWwoJmJ1ZmZlci0+bGlzdCwgJmNkZXYtPmxsMi0+bGlzdCk7CisJfQorCisJc3dpdGNoIChRRURfTEVBRElOR19IV0ZOKGNkZXYpLT5od19pbmZvLnBlcnNvbmFsaXR5KSB7CisJY2FzZSBRRURfUENJX0lTQ1NJOgorCQljb25uX3R5cGUgPSBRRURfTEwyX1RZUEVfSVNDU0k7CisJCWJyZWFrOworCWNhc2UgUUVEX1BDSV9FVEhfUk9DRToKKwkJY29ubl90eXBlID0gUUVEX0xMMl9UWVBFX1JPQ0U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNvbm5fdHlwZSA9IFFFRF9MTDJfVFlQRV9URVNUOworCX0KKworCS8qIFByZXBhcmUgdGhlIHRlbXBvcmFyeSBsbDIgaW5mb3JtYXRpb24gKi8KKwltZW1zZXQoJmxsMl9pbmZvLCAwLCBzaXplb2YobGwyX2luZm8pKTsKKwlsbDJfaW5mby5jb25uX3R5cGUgPSBjb25uX3R5cGU7CisJbGwyX2luZm8ubXR1ID0gcGFyYW1zLT5tdHU7CisJbGwyX2luZm8ucnhfZHJvcF90dGwwX2ZsZyA9IHBhcmFtcy0+ZHJvcF90dGwwX3BhY2tldHM7CisJbGwyX2luZm8ucnhfdmxhbl9yZW1vdmFsX2VuID0gcGFyYW1zLT5yeF92bGFuX3N0cmlwcGluZzsKKwlsbDJfaW5mby50eF90YyA9IDA7CisJbGwyX2luZm8udHhfZGVzdCA9IENPUkVfVFhfREVTVF9OVzsKKwlsbDJfaW5mby5nc2lfZW5hYmxlID0gMTsKKworCXJjID0gcWVkX2xsMl9hY3F1aXJlX2Nvbm5lY3Rpb24oUUVEX0xFQURJTkdfSFdGTihjZGV2KSwgJmxsMl9pbmZvLAorCQkJCQlRRURfTEwyX1JYX1NJWkUsIFFFRF9MTDJfVFhfU0laRSwKKwkJCQkJJmNkZXYtPmxsMi0+aGFuZGxlKTsKKwlpZiAocmMpIHsKKwkJRFBfSU5GTyhjZGV2LCAiRmFpbGVkIHRvIGFjcXVpcmUgTEwyIGNvbm5lY3Rpb25cbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmMgPSBxZWRfbGwyX2VzdGFibGlzaF9jb25uZWN0aW9uKFFFRF9MRUFESU5HX0hXRk4oY2RldiksCisJCQkJCSAgY2Rldi0+bGwyLT5oYW5kbGUpOworCWlmIChyYykgeworCQlEUF9JTkZPKGNkZXYsICJGYWlsZWQgdG8gZXN0YWJsaXNoIExMMiBjb25uZWN0aW9uXG4iKTsKKwkJZ290byByZWxlYXNlX2ZhaWw7CisJfQorCisJLyogUG9zdCBhbGwgUnggYnVmZmVycyB0byBGVyAqLworCXNwaW5fbG9ja19iaCgmY2Rldi0+bGwyLT5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ1ZmZlciwgJmNkZXYtPmxsMi0+bGlzdCwgbGlzdCkgeworCQlyYyA9IHFlZF9sbDJfcG9zdF9yeF9idWZmZXIoUUVEX0xFQURJTkdfSFdGTihjZGV2KSwKKwkJCQkJICAgIGNkZXYtPmxsMi0+aGFuZGxlLAorCQkJCQkgICAgYnVmZmVyLT5waHlzX2FkZHIsIDAsIGJ1ZmZlciwgMSk7CisJCWlmIChyYykgeworCQkJRFBfSU5GTyhjZGV2LAorCQkJCSJGYWlsZWQgdG8gcG9zdCBhbiBSeCBidWZmZXI7IERlbGV0aW5nIGl0XG4iKTsKKwkJCWRtYV91bm1hcF9zaW5nbGUoJmNkZXYtPnBkZXYtPmRldiwgYnVmZmVyLT5waHlzX2FkZHIsCisJCQkJCSBjZGV2LT5sbDItPnJ4X3NpemUsIERNQV9GUk9NX0RFVklDRSk7CisJCQlrZnJlZShidWZmZXItPmRhdGEpOworCQkJbGlzdF9kZWwoJmJ1ZmZlci0+bGlzdCk7CisJCQlrZnJlZShidWZmZXIpOworCQl9IGVsc2UgeworCQkJY2Rldi0+bGwyLT5yeF9jbnQrKzsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmY2Rldi0+bGwyLT5sb2NrKTsKKworCWlmICghY2Rldi0+bGwyLT5yeF9jbnQpIHsKKwkJRFBfSU5GTyhjZGV2LCAiRmFpbGVkIHBhc3NpbmcgZXZlbiBhIHNpbmdsZSBSeCBidWZmZXJcbiIpOworCQlnb3RvIHJlbGVhc2VfdGVybWluYXRlOworCX0KKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihwYXJhbXMtPmxsMl9tYWNfYWRkcmVzcykpIHsKKwkJRFBfSU5GTyhjZGV2LCAiSW52YWxpZCBFdGhlcm5ldCBhZGRyZXNzXG4iKTsKKwkJZ290byByZWxlYXNlX3Rlcm1pbmF0ZTsKKwl9CisKKwlwX3B0dCA9IHFlZF9wdHRfYWNxdWlyZShRRURfTEVBRElOR19IV0ZOKGNkZXYpKTsKKwlpZiAoIXBfcHR0KSB7CisJCURQX0lORk8oY2RldiwgIkZhaWxlZCB0byBhY3F1aXJlIFBUVFxuIik7CisJCWdvdG8gcmVsZWFzZV90ZXJtaW5hdGU7CisJfQorCisJcmMgPSBxZWRfbGxoX2FkZF9tYWNfZmlsdGVyKFFFRF9MRUFESU5HX0hXRk4oY2RldiksIHBfcHR0LAorCQkJCSAgICBwYXJhbXMtPmxsMl9tYWNfYWRkcmVzcyk7CisJcWVkX3B0dF9yZWxlYXNlKFFFRF9MRUFESU5HX0hXRk4oY2RldiksIHBfcHR0KTsKKwlpZiAocmMpIHsKKwkJRFBfRVJSKGNkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgTExIIGZpbHRlclxuIik7CisJCWdvdG8gcmVsZWFzZV90ZXJtaW5hdGVfYWxsOworCX0KKworCWV0aGVyX2FkZHJfY29weShjZGV2LT5sbDJfbWFjX2FkZHJlc3MsIHBhcmFtcy0+bGwyX21hY19hZGRyZXNzKTsKKworCXJldHVybiAwOworCityZWxlYXNlX3Rlcm1pbmF0ZV9hbGw6CisKK3JlbGVhc2VfdGVybWluYXRlOgorCXFlZF9sbDJfdGVybWluYXRlX2Nvbm5lY3Rpb24oUUVEX0xFQURJTkdfSFdGTihjZGV2KSwgY2Rldi0+bGwyLT5oYW5kbGUpOworcmVsZWFzZV9mYWlsOgorCXFlZF9sbDJfcmVsZWFzZV9jb25uZWN0aW9uKFFFRF9MRUFESU5HX0hXRk4oY2RldiksIGNkZXYtPmxsMi0+aGFuZGxlKTsKK2ZhaWw6CisJcWVkX2xsMl9raWxsX2J1ZmZlcnMoY2Rldik7CisJY2Rldi0+bGwyLT5oYW5kbGUgPSBRRURfTEwyX1VOVVNFRF9IQU5ETEU7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgcWVkX2xsMl9zdG9wKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCXN0cnVjdCBxZWRfcHR0ICpwX3B0dDsKKwlpbnQgcmM7CisKKwlpZiAoY2Rldi0+bGwyLT5oYW5kbGUgPT0gUUVEX0xMMl9VTlVTRURfSEFORExFKQorCQlyZXR1cm4gMDsKKworCXBfcHR0ID0gcWVkX3B0dF9hY3F1aXJlKFFFRF9MRUFESU5HX0hXRk4oY2RldikpOworCWlmICghcF9wdHQpIHsKKwkJRFBfSU5GTyhjZGV2LCAiRmFpbGVkIHRvIGFjcXVpcmUgUFRUXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXFlZF9sbGhfcmVtb3ZlX21hY19maWx0ZXIoUUVEX0xFQURJTkdfSFdGTihjZGV2KSwgcF9wdHQsCisJCQkJICBjZGV2LT5sbDJfbWFjX2FkZHJlc3MpOworCXFlZF9wdHRfcmVsZWFzZShRRURfTEVBRElOR19IV0ZOKGNkZXYpLCBwX3B0dCk7CisJZXRoX3plcm9fYWRkcihjZGV2LT5sbDJfbWFjX2FkZHJlc3MpOworCisJcmMgPSBxZWRfbGwyX3Rlcm1pbmF0ZV9jb25uZWN0aW9uKFFFRF9MRUFESU5HX0hXRk4oY2RldiksCisJCQkJCSAgY2Rldi0+bGwyLT5oYW5kbGUpOworCWlmIChyYykKKwkJRFBfSU5GTyhjZGV2LCAiRmFpbGVkIHRvIHRlcm1pbmF0ZSBMTDIgY29ubmVjdGlvblxuIik7CisKKwlxZWRfbGwyX2tpbGxfYnVmZmVycyhjZGV2KTsKKworCXFlZF9sbDJfcmVsZWFzZV9jb25uZWN0aW9uKFFFRF9MRUFESU5HX0hXRk4oY2RldiksIGNkZXYtPmxsMi0+aGFuZGxlKTsKKwljZGV2LT5sbDItPmhhbmRsZSA9IFFFRF9MTDJfVU5VU0VEX0hBTkRMRTsKKworCXJldHVybiByYzsKK2ZhaWw6CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgcWVkX2xsMl9zdGFydF94bWl0KHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWNvbnN0IHNrYl9mcmFnX3QgKmZyYWc7CisJaW50IHJjID0gLUVJTlZBTCwgaTsKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisJdTE2IHZsYW4gPSAwOworCXU4IGZsYWdzID0gMDsKKworCWlmICh1bmxpa2VseShza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9OT05FKSkgeworCQlEUF9JTkZPKGNkZXYsICJDYW5ub3QgdHJhbnNtaXQgYSBjaGVja3N1bWVkIHBhY2tldFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgxICsgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA+IENPUkVfTEwyX1RYX01BWF9CRFNfUEVSX1BBQ0tFVCkgeworCQlEUF9FUlIoY2RldiwgIkNhbm5vdCB0cmFuc21pdCBhIHBhY2tldCB3aXRoICVkIGZyYWdtZW50c1xuIiwKKwkJICAgICAgIDEgKyBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKCZjZGV2LT5wZGV2LT5kZXYsIHNrYi0+ZGF0YSwKKwkJCQkgc2tiLT5sZW4sIERNQV9UT19ERVZJQ0UpOworCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcigmY2Rldi0+cGRldi0+ZGV2LCBtYXBwaW5nKSkpIHsKKwkJRFBfTk9USUNFKGNkZXYsICJTS0IgbWFwcGluZyBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBSZXF1ZXN0IEhXIHRvIGNhbGN1bGF0ZSBJUCBjc3VtICovCisJaWYgKCEoKHZsYW5fZ2V0X3Byb3RvY29sKHNrYikgPT0gaHRvbnMoRVRIX1BfSVBWNikpICYmCisJICAgICAgaXB2Nl9oZHIoc2tiKS0+bmV4dGhkciA9PSBORVhUSERSX0lQVjYpKQorCQlmbGFncyB8PSBCSVQoQ09SRV9UWF9CRF9GTEFHU19JUF9DU1VNX1NISUZUKTsKKworCWlmIChza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKSB7CisJCXZsYW4gPSBza2Jfdmxhbl90YWdfZ2V0KHNrYik7CisJCWZsYWdzIHw9IEJJVChDT1JFX1RYX0JEX0ZMQUdTX1ZMQU5fSU5TRVJUSU9OX1NISUZUKTsKKwl9CisKKwlyYyA9IHFlZF9sbDJfcHJlcGFyZV90eF9wYWNrZXQoUUVEX0xFQURJTkdfSFdGTihjZGV2KSwKKwkJCQkgICAgICAgY2Rldi0+bGwyLT5oYW5kbGUsCisJCQkJICAgICAgIDEgKyBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzLAorCQkJCSAgICAgICB2bGFuLCBmbGFncywgMCwgMCAvKiBSb0NFIEZMQVZPUiAqLywKKwkJCQkgICAgICAgbWFwcGluZywgc2tiLT5sZW4sIHNrYiwgMSk7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKKwkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQlpZiAoIWNkZXYtPmxsMi0+ZnJhZ3NfbWFwcGVkKSB7CisJCQltYXBwaW5nID0gc2tiX2ZyYWdfZG1hX21hcCgmY2Rldi0+cGRldi0+ZGV2LCBmcmFnLCAwLAorCQkJCQkJICAgc2tiX2ZyYWdfc2l6ZShmcmFnKSwKKwkJCQkJCSAgIERNQV9UT19ERVZJQ0UpOworCisJCQlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IoJmNkZXYtPnBkZXYtPmRldiwKKwkJCQkJCSAgICAgICBtYXBwaW5nKSkpIHsKKwkJCQlEUF9OT1RJQ0UoY2RldiwKKwkJCQkJICAiVW5hYmxlIHRvIG1hcCBmcmFnIC0gZHJvcHBpbmcgcGFja2V0XG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW1hcHBpbmcgPSBwYWdlX3RvX3BoeXMoc2tiX2ZyYWdfcGFnZShmcmFnKSkgfAorCQkJICAgIGZyYWctPnBhZ2Vfb2Zmc2V0OworCQl9CisKKwkJcmMgPSBxZWRfbGwyX3NldF9mcmFnbWVudF9vZl90eF9wYWNrZXQoUUVEX0xFQURJTkdfSFdGTihjZGV2KSwKKwkJCQkJCSAgICAgICBjZGV2LT5sbDItPmhhbmRsZSwKKwkJCQkJCSAgICAgICBtYXBwaW5nLAorCQkJCQkJICAgICAgIHNrYl9mcmFnX3NpemUoZnJhZykpOworCisJCS8qIGlmIGZhaWxlZCBub3QgbXVjaCB0byBkbyBoZXJlLCBwYXJ0aWFsIHBhY2tldCBoYXMgYmVlbiBwb3N0ZWQKKwkJICogd2UgY2FuJ3QgZnJlZSBtZW1vcnksIHdpbGwgbmVlZCB0byB3YWl0IGZvciBjb21wbGV0aW9uLgorCQkgKi8KKwkJaWYgKHJjKQorCQkJZ290byBlcnIyOworCX0KKworCXJldHVybiAwOworCitlcnI6CisJZG1hX3VubWFwX3NpbmdsZSgmY2Rldi0+cGRldi0+ZGV2LCBtYXBwaW5nLCBza2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7CisKK2VycjI6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHFlZF9sbDJfc3RhdHMoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHN0cnVjdCBxZWRfbGwyX3N0YXRzICpzdGF0cykKK3sKKwlpZiAoIWNkZXYtPmxsMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gcWVkX2xsMl9nZXRfc3RhdHMoUUVEX0xFQURJTkdfSFdGTihjZGV2KSwKKwkJCQkgY2Rldi0+bGwyLT5oYW5kbGUsIHN0YXRzKTsKK30KKworY29uc3Qgc3RydWN0IHFlZF9sbDJfb3BzIHFlZF9sbDJfb3BzX3Bhc3MgPSB7CisJLnN0YXJ0ID0gJnFlZF9sbDJfc3RhcnQsCisJLnN0b3AgPSAmcWVkX2xsMl9zdG9wLAorCS5zdGFydF94bWl0ID0gJnFlZF9sbDJfc3RhcnRfeG1pdCwKKwkucmVnaXN0ZXJfY2Jfb3BzID0gJnFlZF9sbDJfcmVnaXN0ZXJfY2Jfb3BzLAorCS5nZXRfc3RhdHMgPSAmcWVkX2xsMl9zdGF0cywKK307CisKK2ludCBxZWRfbGwyX2FsbG9jX2lmKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCWNkZXYtPmxsMiA9IGt6YWxsb2Moc2l6ZW9mKCpjZGV2LT5sbDIpLCBHRlBfS0VSTkVMKTsKKwlyZXR1cm4gY2Rldi0+bGwyID8gMCA6IC1FTk9NRU07Cit9CisKK3ZvaWQgcWVkX2xsMl9kZWFsbG9jX2lmKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCWtmcmVlKGNkZXYtPmxsMik7CisJY2Rldi0+bGwyID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2xsMi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfbGwyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhNWRjMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2xsMi5oCkBAIC0wLDAgKzEsMzE2IEBACisvKiBRTG9naWMgcWVkIE5JQyBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaWZuZGVmIF9RRURfTEwyX0gKKyNkZWZpbmUgX1FFRF9MTDJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9xZWQvcWVkX2NoYWluLmg+CisjaW5jbHVkZSA8bGludXgvcWVkL3FlZF9sbDJfaWYuaD4KKyNpbmNsdWRlICJxZWQuaCIKKyNpbmNsdWRlICJxZWRfaHNpLmgiCisjaW5jbHVkZSAicWVkX3NwLmgiCisKKyNkZWZpbmUgUUVEX01BWF9OVU1fT0ZfTEwyX0NPTk5FQ1RJT05TICAgICAgICAgICAgICAgICAgICAoNCkKKworZW51bSBxZWRfbGwyX3JvY2VfZmxhdm9yX3R5cGUgeworCVFFRF9MTDJfUk9DRSwKKwlRRURfTEwyX1JST0NFLAorCU1BWF9RRURfTEwyX1JPQ0VfRkxBVk9SX1RZUEUKK307CisKK2VudW0gcWVkX2xsMl9jb25uX3R5cGUgeworCVFFRF9MTDJfVFlQRV9SRVNFUlZFRCwKKwlRRURfTEwyX1RZUEVfSVNDU0ksCisJUUVEX0xMMl9UWVBFX1RFU1QsCisJUUVEX0xMMl9UWVBFX0lTQ1NJX09PTywKKwlRRURfTEwyX1RZUEVfUkVTRVJWRUQyLAorCVFFRF9MTDJfVFlQRV9ST0NFLAorCVFFRF9MTDJfVFlQRV9SRVNFUlZFRDMsCisJTUFYX1FFRF9MTDJfUlhfQ09OTl9UWVBFCit9OworCitzdHJ1Y3QgcWVkX2xsMl9yeF9wYWNrZXQgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9lbnRyeTsKKwlzdHJ1Y3QgY29yZV9yeF9iZF93aXRoX2J1ZmZfbGVuICpyeHFfYmQ7CisJZG1hX2FkZHJfdCByeF9idWZfYWRkcjsKKwl1MTYgYnVmX2xlbmd0aDsKKwl2b2lkICpjb29raWU7CisJdTggcGxhY2VtZW50X29mZnNldDsKKwl1MTYgcGFyc2VfZmxhZ3M7CisJdTE2IHBhY2tldF9sZW5ndGg7CisJdTE2IHZsYW47CisJdTMyIG9wYXF1ZV9kYXRhWzJdOworfTsKKworc3RydWN0IHFlZF9sbDJfdHhfcGFja2V0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfZW50cnk7CisJdTE2IGJkX3VzZWQ7CisJdTE2IHZsYW47CisJdTE2IGw0X2hkcl9vZmZzZXRfdzsKKwl1OCBiZF9mbGFnczsKKwlib29sIG5vdGlmeV9mdzsKKwl2b2lkICpjb29raWU7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY29yZV90eF9iZCAqdHhxX2JkOworCQlkbWFfYWRkcl90IHR4X2ZyYWc7CisJCXUxNiBmcmFnX2xlbjsKKwl9IGJkc19zZXRbRVRIX1RYX01BWF9CRFNfUEVSX05PTl9MU09fUEFDS0VUXTsKK307CisKK3N0cnVjdCBxZWRfbGwyX3J4X3F1ZXVlIHsKKwkvKiBMb2NrIHByb3RlY3RpbmcgdGhlIFJ4IHF1ZXVlIG1hbmlwdWxhdGlvbiAqLworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgcWVkX2NoYWluIHJ4cV9jaGFpbjsKKwlzdHJ1Y3QgcWVkX2NoYWluIHJjcV9jaGFpbjsKKwl1OCByeF9zYl9pbmRleDsKKwlib29sIGJfY2JfcmVnaXN0cmVkOworCV9fbGUxNiAqcF9md19jb25zOworCXN0cnVjdCBsaXN0X2hlYWQgYWN0aXZlX2Rlc2NxOworCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9kZXNjcTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBvc3RpbmdfZGVzY3E7CisJc3RydWN0IHFlZF9sbDJfcnhfcGFja2V0ICpkZXNjcV9hcnJheTsKKwl2b2lkIF9faW9tZW0gKnNldF9wcm9kX2FkZHI7Cit9OworCitzdHJ1Y3QgcWVkX2xsMl90eF9xdWV1ZSB7CisJLyogTG9jayBwcm90ZWN0aW5nIHRoZSBUeCBxdWV1ZSBtYW5pcHVsYXRpb24gKi8KKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHFlZF9jaGFpbiB0eHFfY2hhaW47CisJdTggdHhfc2JfaW5kZXg7CisJYm9vbCBiX2NiX3JlZ2lzdHJlZDsKKwlfX2xlMTYgKnBfZndfY29uczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGFjdGl2ZV9kZXNjcTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfZGVzY3E7CisJc3RydWN0IGxpc3RfaGVhZCBzZW5kaW5nX2Rlc2NxOworCXN0cnVjdCBxZWRfbGwyX3R4X3BhY2tldCAqZGVzY3FfYXJyYXk7CisJc3RydWN0IHFlZF9sbDJfdHhfcGFja2V0ICpjdXJfc2VuZF9wYWNrZXQ7CisJc3RydWN0IHFlZF9sbDJfdHhfcGFja2V0IGN1cl9jb21wbGV0aW5nX3BhY2tldDsKKwl1MTYgY3VyX2NvbXBsZXRpbmdfYmRfaWR4OworCXZvaWQgX19pb21lbSAqZG9vcmJlbGxfYWRkcjsKKwl1MTYgYmRzX2lkeDsKKwl1MTYgY3VyX3NlbmRfZnJhZ19udW07CisJdTE2IGN1cl9jb21wbGV0aW5nX2ZyYWdfbnVtOworCWJvb2wgYl9jb21wbGV0aW5nX3BhY2tldDsKK307CisKK3N0cnVjdCBxZWRfbGwyX2luZm8geworCS8qIExvY2sgcHJvdGVjdGluZyB0aGUgc3RhdGUgb2YgTEwyICovCisJc3RydWN0IG11dGV4IG11dGV4OworCWVudW0gcWVkX2xsMl9jb25uX3R5cGUgY29ubl90eXBlOworCXUzMiBjaWQ7CisJdTggbXlfaWQ7CisJdTggcXVldWVfaWQ7CisJdTggdHhfc3RhdHNfaWQ7CisJYm9vbCBiX2FjdGl2ZTsKKwl1MTYgbXR1OworCXU4IHJ4X2Ryb3BfdHRsMF9mbGc7CisJdTggcnhfdmxhbl9yZW1vdmFsX2VuOworCXU4IHR4X3RjOworCWVudW0gY29yZV90eF9kZXN0IHR4X2Rlc3Q7CisJZW51bSBjb3JlX2Vycm9yX2hhbmRsZSBhaV9lcnJfcGFja2V0X3Rvb19iaWc7CisJZW51bSBjb3JlX2Vycm9yX2hhbmRsZSBhaV9lcnJfbm9fYnVmOworCXU4IHR4X3N0YXRzX2VuOworCXN0cnVjdCBxZWRfbGwyX3J4X3F1ZXVlIHJ4X3F1ZXVlOworCXN0cnVjdCBxZWRfbGwyX3R4X3F1ZXVlIHR4X3F1ZXVlOworCXU4IGdzaV9lbmFibGU7Cit9OworCisvKioKKyAqIEBicmllZiBxZWRfbGwyX2FjcXVpcmVfY29ubmVjdGlvbiAtIGFsbG9jYXRlIHJlc291cmNlcywKKyAqICAgICAgICBzdGFydHMgcnggJiB0eCAoaWYgcmVsZXZhbnQpIHF1ZXVlcyBwYWlyLiBQcm92aWRlcworICogICAgICAgIGNvbm5lY2lvbiBoYW5kbGVyIGFzIG91dHB1dCBwYXJhbWV0ZXIuCisgKgorICogQHBhcmFtIHBfaHdmbgorICogQHBhcmFtIHBfcGFyYW1zCQlDb250YWluIHZhcmlvdXMgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzCisgKiBAcGFyYW0gcnhfbnVtX2Rlc2MKKyAqIEBwYXJhbSB0eF9udW1fZGVzYworICoKKyAqIEBwYXJhbSBwX2Nvbm5lY3Rpb25faGFuZGxlICBPdXRwdXQgY29udGFpbmVyIGZvciBMTDIgY29ubmVjdGlvbidzIGhhbmRsZQorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBmYWlsdXJlIG90aGVyd2lzZQorICovCitpbnQgcWVkX2xsMl9hY3F1aXJlX2Nvbm5lY3Rpb24oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgICAgc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9wYXJhbXMsCisJCQkgICAgICAgdTE2IHJ4X251bV9kZXNjLAorCQkJICAgICAgIHUxNiB0eF9udW1fZGVzYywKKwkJCSAgICAgICB1OCAqcF9jb25uZWN0aW9uX2hhbmRsZSk7CisKKy8qKgorICogQGJyaWVmIHFlZF9sbDJfZXN0YWJsaXNoX2Nvbm5lY3Rpb24gLSBzdGFydCBwcmV2aW91c2x5CisgKiAgICAgICAgYWxsb2NhdGVkIExMMiBxdWV1ZXMgcGFpcgorICoKKyAqIEBwYXJhbSBwX2h3Zm4KKyAqIEBwYXJhbSBwX3B0dAorICogQHBhcmFtIGNvbm5lY3Rpb25faGFuZGxlCUxMMiBjb25uZWN0aW9uJ3MgaGFuZGxlIG9idGFpbmVkIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWVkX2xsMl9yZXF1aXJlX2Nvbm5lY3Rpb24KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgZmFpbHVyZSBvdGhlcndpc2UKKyAqLworaW50IHFlZF9sbDJfZXN0YWJsaXNoX2Nvbm5lY3Rpb24oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHU4IGNvbm5lY3Rpb25faGFuZGxlKTsKKworLyoqCisgKiBAYnJpZWYgcWVkX2xsMl9wb3N0X3J4X2J1ZmZlcnMgLSBzdWJtaXQgYnVmZmVycyB0byBMTDIgUnggcXVldWUuCisgKgorICogQHBhcmFtIHBfaHdmbgorICogQHBhcmFtIGNvbm5lY3Rpb25faGFuZGxlCUxMMiBjb25uZWN0aW9uJ3MgaGFuZGxlIG9idGFpbmVkIGZyb20KKyAqCQkJCXFlZF9sbDJfcmVxdWlyZV9jb25uZWN0aW9uCisgKiBAcGFyYW0gYWRkcgkJCXJ4IChwaHlzaWNhbCBhZGRyZXNzKSBidWZmZXJzIHRvIHN1Ym1pdAorICogQHBhcmFtIGNvb2tpZQorICogQHBhcmFtIG5vdGlmeV9mdwkJcHJvZHVjZSBjb3JyZXNwb25kaW5nIFJ4IEJEIGltbWVkaWF0ZWx5CisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGZhaWx1cmUgb3RoZXJ3aXNlCisgKi8KK2ludCBxZWRfbGwyX3Bvc3RfcnhfYnVmZmVyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgdTggY29ubmVjdGlvbl9oYW5kbGUsCisJCQkgICBkbWFfYWRkcl90IGFkZHIsCisJCQkgICB1MTYgYnVmX2xlbiwgdm9pZCAqY29va2llLCB1OCBub3RpZnlfZncpOworCisvKioKKyAqIEBicmllZiBxZWRfbGwyX3ByZXBhcmVfdHhfcGFja2V0IC0gcmVxdWVzdCBmb3Igc3RhcnQgVHggQkQKKyAqCQkJCSAgICAgIHRvIHByZXBhcmUgVHggcGFja2V0IHN1Ym1pc3Npb24gdG8gRlcuCisgKgorICogQHBhcmFtIHBfaHdmbgorICogQHBhcmFtIGNvbm5lY3Rpb25faGFuZGxlCUxMMiBjb25uZWN0aW9uJ3MgaGFuZGxlIG9idGFpbmVkIGZyb20KKyAqCQkJCXFlZF9sbDJfcmVxdWlyZV9jb25uZWN0aW9uCisgKiBAcGFyYW0gbnVtX29mX2JkcwkJYSBudW1iZXIgb2YgcmVxdWVzdGVkIEJEIGVxdWFscyBhIG51bWJlciBvZgorICoJCQkJZnJhZ21lbnRzIGluIFR4IHBhY2tldAorICogQHBhcmFtIHZsYW4JCQlWTEFOIHRvIGluc2VydCB0byBwYWNrZXQgKGlmIGluc2VydGlvbiBzZXQpCisgKiBAcGFyYW0gYmRfZmxhZ3MKKyAqIEBwYXJhbSBsNF9oZHJfb2Zmc2V0X3cJTDQgSGVhZGVyIE9mZnNldCBmcm9tIHN0YXJ0IG9mIHBhY2tldAorICoJCQkJKGluIHdvcmRzKS4gVGhpcyBpcyBuZWVkZWQgaWYgYm90aCBsNF9jc3VtCisgKgkJCQlhbmQgaXB2Nl9leHQgYXJlIHNldAorICogQHBhcmFtIGZpcnN0X2ZyYWcKKyAqIEBwYXJhbSBmaXJzdF9mcmFnX2xlbgorICogQHBhcmFtIGNvb2tpZQorICoKKyAqIEBwYXJhbSBub3RpZnlfZncKKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgZmFpbHVyZSBvdGhlcndpc2UKKyAqLworaW50IHFlZF9sbDJfcHJlcGFyZV90eF9wYWNrZXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgICB1OCBjb25uZWN0aW9uX2hhbmRsZSwKKwkJCSAgICAgIHU4IG51bV9vZl9iZHMsCisJCQkgICAgICB1MTYgdmxhbiwKKwkJCSAgICAgIHU4IGJkX2ZsYWdzLAorCQkJICAgICAgdTE2IGw0X2hkcl9vZmZzZXRfdywKKwkJCSAgICAgIGVudW0gcWVkX2xsMl9yb2NlX2ZsYXZvcl90eXBlIHFlZF9yb2NlX2ZsYXZvciwKKwkJCSAgICAgIGRtYV9hZGRyX3QgZmlyc3RfZnJhZywKKwkJCSAgICAgIHUxNiBmaXJzdF9mcmFnX2xlbiwgdm9pZCAqY29va2llLCB1OCBub3RpZnlfZncpOworCisvKioKKyAqIEBicmllZiBxZWRfbGwyX3JlbGVhc2VfY29ubmVjdGlvbiAtCXJlbGVhc2VzIHJlc291cmNlcworICoJCQkJCWFsbG9jYXRlZCBmb3IgTEwyIGNvbm5lY3Rpb24KKyAqCisgKiBAcGFyYW0gcF9od2ZuCisgKiBAcGFyYW0gY29ubmVjdGlvbl9oYW5kbGUJCUxMMiBjb25uZWN0aW9uJ3MgaGFuZGxlIG9idGFpbmVkIGZyb20KKyAqCQkJCQlxZWRfbGwyX3JlcXVpcmVfY29ubmVjdGlvbgorICovCit2b2lkIHFlZF9sbDJfcmVsZWFzZV9jb25uZWN0aW9uKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1OCBjb25uZWN0aW9uX2hhbmRsZSk7CisKKy8qKgorICogQGJyaWVmIHFlZF9sbDJfc2V0X2ZyYWdtZW50X29mX3R4X3BhY2tldCAtCXByb3ZpZGVzIGZyYWdtZW50cyB0byBmaWxsCisgKgkJCQkJCVR4IEJEIG9mIEJEcyByZXF1ZXN0ZWQgYnkKKyAqCQkJCQkJcWVkX2xsMl9wcmVwYXJlX3R4X3BhY2tldAorICoKKyAqIEBwYXJhbSBwX2h3Zm4KKyAqIEBwYXJhbSBjb25uZWN0aW9uX2hhbmRsZQkJCUxMMiBjb25uZWN0aW9uJ3MgaGFuZGxlCisgKgkJCQkJCW9idGFpbmVkIGZyb20KKyAqCQkJCQkJcWVkX2xsMl9yZXF1aXJlX2Nvbm5lY3Rpb24KKyAqIEBwYXJhbSBhZGRyCisgKiBAcGFyYW0gbmJ5dGVzCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGZhaWx1cmUgb3RoZXJ3aXNlCisgKi8KK2ludCBxZWRfbGwyX3NldF9mcmFnbWVudF9vZl90eF9wYWNrZXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICAgdTggY29ubmVjdGlvbl9oYW5kbGUsCisJCQkJICAgICAgZG1hX2FkZHJfdCBhZGRyLCB1MTYgbmJ5dGVzKTsKKworLyoqCisgKiBAYnJpZWYgcWVkX2xsMl90ZXJtaW5hdGVfY29ubmVjdGlvbiAtCXN0b3BzIFR4L1J4IHF1ZXVlcworICoKKyAqCisgKiBAcGFyYW0gcF9od2ZuCisgKiBAcGFyYW0gY29ubmVjdGlvbl9oYW5kbGUJCQlMTDIgY29ubmVjdGlvbidzIGhhbmRsZQorICoJCQkJCQlvYnRhaW5lZCBmcm9tCisgKgkJCQkJCXFlZF9sbDJfcmVxdWlyZV9jb25uZWN0aW9uCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGZhaWx1cmUgb3RoZXJ3aXNlCisgKi8KK2ludCBxZWRfbGwyX3Rlcm1pbmF0ZV9jb25uZWN0aW9uKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1OCBjb25uZWN0aW9uX2hhbmRsZSk7CisKKy8qKgorICogQGJyaWVmIHFlZF9sbDJfZ2V0X3N0YXRzIC0JZ2V0IExMMiBxdWV1ZSdzIHN0YXRpc3RpY3MKKyAqCisgKgorICogQHBhcmFtIHBfaHdmbgorICogQHBhcmFtIGNvbm5lY3Rpb25faGFuZGxlCUxMMiBjb25uZWN0aW9uJ3MgaGFuZGxlIG9idGFpbmVkIGZyb20KKyAqCQkJCXFlZF9sbDJfcmVxdWlyZV9jb25uZWN0aW9uCisgKiBAcGFyYW0gcF9zdGF0cworICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBmYWlsdXJlIG90aGVyd2lzZQorICovCitpbnQgcWVkX2xsMl9nZXRfc3RhdHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCSAgICAgIHU4IGNvbm5lY3Rpb25faGFuZGxlLCBzdHJ1Y3QgcWVkX2xsMl9zdGF0cyAqcF9zdGF0cyk7CisKKy8qKgorICogQGJyaWVmIHFlZF9sbDJfYWxsb2MgLSBBbGxvY2F0ZXMgTEwyIGNvbm5lY3Rpb25zIHNldAorICoKKyAqIEBwYXJhbSBwX2h3Zm4KKyAqCisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gYWxvY2F0ZWQgcWVkX2xsMl9pbmZvIG9yIE5VTEwKKyAqLworc3RydWN0IHFlZF9sbDJfaW5mbyAqcWVkX2xsMl9hbGxvYyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbik7CisKKy8qKgorICogQGJyaWVmIHFlZF9sbDJfc2V0dXAgLSBJbml0cyBMTDIgY29ubmVjdGlvbnMgc2V0CisgKgorICogQHBhcmFtIHBfaHdmbgorICogQHBhcmFtIHBfbGwyX2Nvbm5lY3Rpb25zCisgKgorICovCit2b2lkIHFlZF9sbDJfc2V0dXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCSAgIHN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm5lY3Rpb25zKTsKKworLyoqCisgKiBAYnJpZWYgcWVkX2xsMl9mcmVlIC0gUmVsZWFzZXMgTEwyIGNvbm5lY3Rpb25zIHNldAorICoKKyAqIEBwYXJhbSBwX2h3Zm4KKyAqIEBwYXJhbSBwX2xsMl9jb25uZWN0aW9ucworICoKKyAqLwordm9pZCBxZWRfbGwyX2ZyZWUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCSAgc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfY29ubmVjdGlvbnMpOwordm9pZCBxZWRfbGwyYl9jb21wbGV0ZV9yeF9nc2lfcGFja2V0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgdTggY29ubmVjdGlvbl9oYW5kbGUsCisJCQkJICAgICB2b2lkICpjb29raWUsCisJCQkJICAgICBkbWFfYWRkcl90IHJ4X2J1Zl9hZGRyLAorCQkJCSAgICAgdTE2IGRhdGFfbGVuZ3RoLAorCQkJCSAgICAgdTggZGF0YV9sZW5ndGhfZXJyb3IsCisJCQkJICAgICB1MTYgcGFyc2VfZmxhZ3MsCisJCQkJICAgICB1MTYgdmxhbiwKKwkJCQkgICAgIHUzMiBzcmNfbWFjX2FkZHJfaGksCisJCQkJICAgICB1MTYgc3JjX21hY19hZGRyX2xvLCBib29sIGJfbGFzdF9wYWNrZXQpOwordm9pZCBxZWRfbGwyYl9jb21wbGV0ZV90eF9nc2lfcGFja2V0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgdTggY29ubmVjdGlvbl9oYW5kbGUsCisJCQkJICAgICB2b2lkICpjb29raWUsCisJCQkJICAgICBkbWFfYWRkcl90IGZpcnN0X2ZyYWdfYWRkciwKKwkJCQkgICAgIGJvb2wgYl9sYXN0X2ZyYWdtZW50LCBib29sIGJfbGFzdF9wYWNrZXQpOwordm9pZCBxZWRfbGwyYl9yZWxlYXNlX3R4X2dzaV9wYWNrZXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgIHU4IGNvbm5lY3Rpb25faGFuZGxlLAorCQkJCSAgICB2b2lkICpjb29raWUsCisJCQkJICAgIGRtYV9hZGRyX3QgZmlyc3RfZnJhZ19hZGRyLAorCQkJCSAgICBib29sIGJfbGFzdF9mcmFnbWVudCwgYm9vbCBiX2xhc3RfcGFja2V0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfbWFpbi5jCmluZGV4IGM3ZGMzNGIuLjRlZTMxNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9tYWluLmMKQEAgLTIyLDE1ICsyMiwyMiBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3FlZC9xZWRfaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9xZWQvcWVkX2xsMl9pZi5oPgogCiAjaW5jbHVkZSAicWVkLmgiCiAjaW5jbHVkZSAicWVkX3NyaW92LmgiCiAjaW5jbHVkZSAicWVkX3NwLmgiCiAjaW5jbHVkZSAicWVkX2Rldl9hcGkuaCIKKyNpbmNsdWRlICJxZWRfbGwyLmgiCiAjaW5jbHVkZSAicWVkX21jcC5oIgogI2luY2x1ZGUgInFlZF9ody5oIgogI2luY2x1ZGUgInFlZF9zZWxmdGVzdC5oIgogCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSU5GSU5JQkFORF9RRURSKQorI2RlZmluZSBRRURfUk9DRV9RUFMJCQkoODE5MikKKyNkZWZpbmUgUUVEX1JPQ0VfRFBJUwkJCSg4KQorI2VuZGlmCisKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSA9CiAJIlFMb2dpYyBGYXN0TGluUSA0eHh4eCBDb3JlIE1vZHVsZSBxZWQgIiBEUlZfTU9EVUxFX1ZFUlNJT04gIlxuIjsKIApAQCAtNTEsOCArNTgsNiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBxZWRfaW5pdCh2b2lkKQogewotCXByX25vdGljZSgicWVkX2luaXQgY2FsbGVkXG4iKTsKLQogCXByX2luZm8oIiVzIiwgdmVyc2lvbik7CiAKIAlyZXR1cm4gMDsKQEAgLTEwNiw4ICsxMTEsNyBAQAogLyogUGVyZm9ybXMgUENJIGluaXRpYWxpemF0aW9ucyBhcyB3ZWxsIGFzIGluaXRpYWxpemluZyBQQ0ktcmVsYXRlZCBwYXJhbWV0ZXJzCiAgKiBpbiB0aGUgZGV2aWNlIHN0cnVjdHJ1ZS4gUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KICAqLwotc3RhdGljIGludCBxZWRfaW5pdF9wY2koc3RydWN0IHFlZF9kZXYgKmNkZXYsCi0JCQlzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyBpbnQgcWVkX2luaXRfcGNpKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAl1OCByZXZfaWQ7CiAJaW50IHJjOwpAQCAtMjA3LDggKzIxMSw4IEBACiAJZGV2X2luZm8tPnBjaV9tZW1fc3RhcnQgPSBjZGV2LT5wY2lfcGFyYW1zLm1lbV9zdGFydDsKIAlkZXZfaW5mby0+cGNpX21lbV9lbmQgPSBjZGV2LT5wY2lfcGFyYW1zLm1lbV9lbmQ7CiAJZGV2X2luZm8tPnBjaV9pcnEgPSBjZGV2LT5wY2lfcGFyYW1zLmlycTsKLQlkZXZfaW5mby0+cmRtYV9zdXBwb3J0ZWQgPQotCSAgICAoY2Rldi0+aHdmbnNbMF0uaHdfaW5mby5wZXJzb25hbGl0eSA9PSBRRURfUENJX0VUSF9ST0NFKTsKKwlkZXZfaW5mby0+cmRtYV9zdXBwb3J0ZWQgPSAoY2Rldi0+aHdmbnNbMF0uaHdfaW5mby5wZXJzb25hbGl0eSA9PQorCQkJCSAgICBRRURfUENJX0VUSF9ST0NFKTsKIAlkZXZfaW5mby0+aXNfbWZfZGVmYXVsdCA9IElTX01GX0RFRkFVTFQoJmNkZXYtPmh3Zm5zWzBdKTsKIAlldGhlcl9hZGRyX2NvcHkoZGV2X2luZm8tPmh3X21hYywgY2Rldi0+aHdmbnNbMF0uaHdfaW5mby5od19tYWNfYWRkcik7CiAKQEAgLTI2Myw4ICsyNjcsNyBAQAogfQogCiAvKiBTZXRzIHRoZSByZXF1ZXN0ZWQgcG93ZXIgc3RhdGUgKi8KLXN0YXRpYyBpbnQgcWVkX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcWVkX2RldiAqY2RldiwKLQkJCSAgICAgICBwY2lfcG93ZXJfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgcWVkX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcWVkX2RldiAqY2RldiwgcGNpX3Bvd2VyX3Qgc3RhdGUpCiB7CiAJaWYgKCFjZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTM2Niw4ICszNjksOCBAQAogCQlEUF9OT1RJQ0UoY2RldiwKIAkJCSAgIlRyeWluZyB0byBlbmFibGUgTVNJLVggd2l0aCBsZXNzIHZlY3RvcnMgKCVkIG91dCBvZiAlZClcbiIsCiAJCQkgIGNudCwgaW50X3BhcmFtcy0+aW4ubnVtX3ZlY3RvcnMpOwotCQlyYyA9IHBjaV9lbmFibGVfbXNpeF9leGFjdChjZGV2LT5wZGV2LAotCQkJCQkgICBpbnRfcGFyYW1zLT5tc2l4X3RhYmxlLCBjbnQpOworCQlyYyA9IHBjaV9lbmFibGVfbXNpeF9leGFjdChjZGV2LT5wZGV2LCBpbnRfcGFyYW1zLT5tc2l4X3RhYmxlLAorCQkJCQkgICBjbnQpOwogCQlpZiAoIXJjKQogCQkJcmMgPSBjbnQ7CiAJfQpAQCAtNDM5LDYgKzQ0MiwxMSBAQAogCX0KIAogb3V0OgorCWlmICghcmMpCisJCURQX0lORk8oY2RldiwgIlVzaW5nICVzIGludGVycnVwdHNcbiIsCisJCQlpbnRfcGFyYW1zLT5vdXQuaW50X21vZGUgPT0gUUVEX0lOVF9NT0RFX0lOVEEgPworCQkJIklOVGEiIDogaW50X3BhcmFtcy0+b3V0LmludF9tb2RlID09IFFFRF9JTlRfTU9ERV9NU0kgPworCQkJIk1TSSIgOiAiTVNJWCIpOwogCWNkZXYtPmludF9jb2FsZXNjaW5nX21vZGUgPSBRRURfQ09BTF9NT0RFX0VOQUJMRTsKIAogCXJldHVybiByYzsKQEAgLTUxNCwxOSArNTIyLDE4IEBACiBpbnQgcWVkX3Nsb3dwYXRoX2lycV9yZXEoc3RydWN0IHFlZF9od2ZuICpod2ZuKQogewogCXN0cnVjdCBxZWRfZGV2ICpjZGV2ID0gaHdmbi0+Y2RldjsKKwl1MzIgaW50X21vZGU7CiAJaW50IHJjID0gMDsKIAl1OCBpZDsKIAotCWlmIChjZGV2LT5pbnRfcGFyYW1zLm91dC5pbnRfbW9kZSA9PSBRRURfSU5UX01PREVfTVNJWCkgeworCWludF9tb2RlID0gY2Rldi0+aW50X3BhcmFtcy5vdXQuaW50X21vZGU7CisJaWYgKGludF9tb2RlID09IFFFRF9JTlRfTU9ERV9NU0lYKSB7CiAJCWlkID0gaHdmbi0+bXlfaWQ7CiAJCXNucHJpbnRmKGh3Zm4tPm5hbWUsIE5BTUVfU0laRSwgInNwLSVkLSUwMng6JTAyeC4lMDJ4IiwKIAkJCSBpZCwgY2Rldi0+cGRldi0+YnVzLT5udW1iZXIsCiAJCQkgUENJX1NMT1QoY2Rldi0+cGRldi0+ZGV2Zm4pLCBod2ZuLT5hYnNfcGZfaWQpOwogCQlyYyA9IHJlcXVlc3RfaXJxKGNkZXYtPmludF9wYXJhbXMubXNpeF90YWJsZVtpZF0udmVjdG9yLAogCQkJCSBxZWRfbXNpeF9zcF9pbnQsIDAsIGh3Zm4tPm5hbWUsIGh3Zm4tPnNwX2RwYyk7Ci0JCWlmICghcmMpCi0JCQlEUF9WRVJCT1NFKGh3Zm4sIChORVRJRl9NU0dfSU5UUiB8IFFFRF9NU0dfU1ApLAotCQkJCSAgICJSZXF1ZXN0ZWQgc2xvd3BhdGggTVNJLVhcbiIpOwogCX0gZWxzZSB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCkBAIC01NDEsNiArNTQ4LDEzIEBACiAJCQkJIGZsYWdzLCBjZGV2LT5uYW1lLCBjZGV2KTsKIAl9CiAKKwlpZiAocmMpCisJCURQX05PVElDRShjZGV2LCAicmVxdWVzdF9pcnEgZmFpbGVkLCByYyA9ICVkXG4iLCByYyk7CisJZWxzZQorCQlEUF9WRVJCT1NFKGh3Zm4sIChORVRJRl9NU0dfSU5UUiB8IFFFRF9NU0dfU1ApLAorCQkJICAgIlJlcXVlc3RlZCBzbG93cGF0aCAlc1xuIiwKKwkJCSAgIChpbnRfbW9kZSA9PSBRRURfSU5UX01PREVfTVNJWCkgPyAiTVNJLVgiIDogIklSUSIpOworCiAJcmV0dXJuIHJjOwogfQogCkBAIC01ODEsNiArNTk1LDggQEAKIAkJfQogCX0KIAorCXFlZF9kYmdfcGZfZXhpdChjZGV2KTsKKwogCXJldHVybiByYzsKIH0KIApAQCAtNTk5LDcgKzYxNSwxNiBAQAogCiBzdGF0aWMgaW50IHFlZF9uaWNfc2V0dXAoc3RydWN0IHFlZF9kZXYgKmNkZXYpCiB7Ci0JaW50IHJjOworCWludCByYywgaTsKKworCS8qIERldGVybWluZSBpZiBpbnRlcmZhY2UgaXMgZ29pbmcgdG8gcmVxdWlyZSBMTDIgKi8KKwlpZiAoUUVEX0xFQURJTkdfSFdGTihjZGV2KS0+aHdfaW5mby5wZXJzb25hbGl0eSAhPSBRRURfUENJX0VUSCkgeworCQlmb3IgKGkgPSAwOyBpIDwgY2Rldi0+bnVtX2h3Zm5zOyBpKyspIHsKKwkJCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gJmNkZXYtPmh3Zm5zW2ldOworCisJCQlwX2h3Zm4tPnVzaW5nX2xsMiA9IHRydWU7CisJCX0KKwl9CiAKIAlyYyA9IHFlZF9yZXNjX2FsbG9jKGNkZXYpOwogCWlmIChyYykKQEAgLTY1Nyw2ICs2ODIsOSBAQAogCQkJCSAgZW51bSBxZWRfaW50X21vZGUgaW50X21vZGUpCiB7CiAJc3RydWN0IHFlZF9zYl9jbnRfaW5mbyBzYl9jbnRfaW5mbzsKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JTkZJTklCQU5EX1FFRFIpCisJaW50IG51bV9sMl9xdWV1ZXM7CisjZW5kaWYKIAlpbnQgcmM7CiAJaW50IGk7CiAKQEAgLTY4Nyw2ICs3MTUsMzEgQEAKIAljZGV2LT5pbnRfcGFyYW1zLmZwX21zaXhfY250ID0gY2Rldi0+aW50X3BhcmFtcy5vdXQubnVtX3ZlY3RvcnMgLQogCQkJCSAgICAgICBjZGV2LT5udW1faHdmbnM7CiAKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JTkZJTklCQU5EX1FFRFIpCisJbnVtX2wyX3F1ZXVlcyA9IDA7CisJZm9yX2VhY2hfaHdmbihjZGV2LCBpKQorCQludW1fbDJfcXVldWVzICs9IEZFQVRfTlVNKCZjZGV2LT5od2Zuc1tpXSwgUUVEX1BGX0wyX1FVRSk7CisKKwlEUF9WRVJCT1NFKGNkZXYsIFFFRF9NU0dfUkRNQSwKKwkJICAgImNkZXYtPmludF9wYXJhbXMuZnBfbXNpeF9jbnQ9JWQgbnVtX2wyX3F1ZXVlcz0lZFxuIiwKKwkJICAgY2Rldi0+aW50X3BhcmFtcy5mcF9tc2l4X2NudCwgbnVtX2wyX3F1ZXVlcyk7CisKKwlpZiAoY2Rldi0+aW50X3BhcmFtcy5mcF9tc2l4X2NudCA+IG51bV9sMl9xdWV1ZXMpIHsKKwkJY2Rldi0+aW50X3BhcmFtcy5yZG1hX21zaXhfY250ID0KKwkJCShjZGV2LT5pbnRfcGFyYW1zLmZwX21zaXhfY250IC0gbnVtX2wyX3F1ZXVlcykKKwkJCS8gY2Rldi0+bnVtX2h3Zm5zOworCQljZGV2LT5pbnRfcGFyYW1zLnJkbWFfbXNpeF9iYXNlID0KKwkJCWNkZXYtPmludF9wYXJhbXMuZnBfbXNpeF9iYXNlICsgbnVtX2wyX3F1ZXVlczsKKwkJY2Rldi0+aW50X3BhcmFtcy5mcF9tc2l4X2NudCA9IG51bV9sMl9xdWV1ZXM7CisJfSBlbHNlIHsKKwkJY2Rldi0+aW50X3BhcmFtcy5yZG1hX21zaXhfY250ID0gMDsKKwl9CisKKwlEUF9WRVJCT1NFKGNkZXYsIFFFRF9NU0dfUkRNQSwgInJvY2VfbXNpeF9jbnQ9JWQgcm9jZV9tc2l4X2Jhc2U9JWRcbiIsCisJCSAgIGNkZXYtPmludF9wYXJhbXMucmRtYV9tc2l4X2NudCwKKwkJICAgY2Rldi0+aW50X3BhcmFtcy5yZG1hX21zaXhfYmFzZSk7CisjZW5kaWYKKwogCXJldHVybiAwOwogfQogCkBAIC03OTAsNiArODQzLDEzIEBACiB7CiAJaW50IGk7CiAKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JTkZJTklCQU5EX1FFRFIpCisJcGFyYW1zLT5yZG1hX3BmX3BhcmFtcy5udW1fcXBzID0gUUVEX1JPQ0VfUVBTOworCXBhcmFtcy0+cmRtYV9wZl9wYXJhbXMubWluX2RwaXMgPSBRRURfUk9DRV9EUElTOworCS8qIGRpdmlkZSBieSAzIHRoZSBNUnMgdG8gYXZvaWQgTUYgSUxUIG92ZXJmbG93ICovCisJcGFyYW1zLT5yZG1hX3BmX3BhcmFtcy5udW1fbXJzID0gUkRNQV9NQVhfVElEUzsKKwlwYXJhbXMtPnJkbWFfcGZfcGFyYW1zLmdsX3BpID0gUUVEX1JPQ0VfUFJPVE9DT0xfSU5ERVg7CisjZW5kaWYKIAlmb3IgKGkgPSAwOyBpIDwgY2Rldi0+bnVtX2h3Zm5zOyBpKyspIHsKIAkJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4gPSAmY2Rldi0+aHdmbnNbaV07CiAKQEAgLTgzNCwxMyArODk0LDEzIEBACiAJaWYgKElTX1BGKGNkZXYpKSB7CiAJCS8qIEFsbG9jYXRlIHN0cmVhbSBmb3IgdW56aXBwaW5nICovCiAJCXJjID0gcWVkX2FsbG9jX3N0cmVhbV9tZW0oY2Rldik7Ci0JCWlmIChyYykgewotCQkJRFBfTk9USUNFKGNkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgc3RyZWFtIG1lbW9yeVxuIik7CisJCWlmIChyYykKIAkJCWdvdG8gZXJyMjsKLQkJfQogCiAJCS8qIEZpcnN0IER3b3JkIHVzZWQgdG8gZGlmZnJlbnRpYXRlIGJldHdlZW4gdmFyaW91cyBzb3VyY2VzICovCiAJCWRhdGEgPSBjZGV2LT5maXJtd2FyZS0+ZGF0YSArIHNpemVvZih1MzIpOworCisJCXFlZF9kYmdfcGZfaW5pdChjZGV2KTsKIAl9CiAKIAltZW1zZXQoJnR1bm5faW5mbywgMCwgc2l6ZW9mKHR1bm5faW5mbykpOwpAQCAtODY0LDYgKzkyNCwxMiBAQAogCURQX0lORk8oY2RldiwKIAkJIkhXIGluaXRpYWxpemF0aW9uIGFuZCBmdW5jdGlvbiBzdGFydCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKIAorCS8qIEFsbG9jYXRlIExMMiBpbnRlcmZhY2UgaWYgbmVlZGVkICovCisJaWYgKFFFRF9MRUFESU5HX0hXRk4oY2RldiktPnVzaW5nX2xsMikgeworCQlyYyA9IHFlZF9sbDJfYWxsb2NfaWYoY2Rldik7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyMzsKKwl9CiAJaWYgKElTX1BGKGNkZXYpKSB7CiAJCWh3Zm4gPSBRRURfTEVBRElOR19IV0ZOKGNkZXYpOwogCQlkcnZfdmVyc2lvbi52ZXJzaW9uID0gKHBhcmFtcy0+ZHJ2X21ham9yIDw8IDI0KSB8CkBAIC04ODQsNiArOTUwLDggQEAKIAogCXJldHVybiAwOwogCitlcnIzOgorCXFlZF9od19zdG9wKGNkZXYpOwogZXJyMjoKIAlxZWRfaHdfdGltZXJzX3N0b3BfYWxsKGNkZXYpOwogCWlmIChJU19QRihjZGV2KSkKQEAgLTkwNiw2ICs5NzQsOCBAQAogCWlmICghY2RldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlxZWRfbGwyX2RlYWxsb2NfaWYoY2Rldik7CisKIAlpZiAoSVNfUEYoY2RldikpIHsKIAkJcWVkX2ZyZWVfc3RyZWFtX21lbShjZGV2KTsKIAkJaWYgKElTX1FFRF9FVEhfSUYoY2RldikpCkBAIC05NzQsOCArMTA0NCw3IEBACiB9CiAKIHN0YXRpYyB1MzIgcWVkX3NiX3JlbGVhc2Uoc3RydWN0IHFlZF9kZXYgKmNkZXYsCi0JCQkgIHN0cnVjdCBxZWRfc2JfaW5mbyAqc2JfaW5mbywKLQkJCSAgdTE2IHNiX2lkKQorCQkJICBzdHJ1Y3QgcWVkX3NiX2luZm8gKnNiX2luZm8sIHUxNiBzYl9pZCkKIHsKIAlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbjsKIAlpbnQgaHdmbl9pbmRleDsKQEAgLTEwMjUsMjAgKzEwOTQsMjMgQEAKIAkJbGlua19wYXJhbXMtPnNwZWVkLmF1dG9uZWcgPSBwYXJhbXMtPmF1dG9uZWc7CiAJaWYgKHBhcmFtcy0+b3ZlcnJpZGVfZmxhZ3MgJiBRRURfTElOS19PVkVSUklERV9TUEVFRF9BRFZfU1BFRURTKSB7CiAJCWxpbmtfcGFyYW1zLT5zcGVlZC5hZHZlcnRpc2VkX3NwZWVkcyA9IDA7Ci0JCWlmICgocGFyYW1zLT5hZHZfc3BlZWRzICYgU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmKSB8fAotCQkgICAgKHBhcmFtcy0+YWR2X3NwZWVkcyAmIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCkpCisJCWlmICgocGFyYW1zLT5hZHZfc3BlZWRzICYgUUVEX0xNXzEwMDBiYXNlVF9IYWxmX0JJVCkgfHwKKwkJICAgIChwYXJhbXMtPmFkdl9zcGVlZHMgJiBRRURfTE1fMTAwMGJhc2VUX0Z1bGxfQklUKSkKIAkJCWxpbmtfcGFyYW1zLT5zcGVlZC5hZHZlcnRpc2VkX3NwZWVkcyB8PQotCQkJCU5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS18xRzsKLQkJaWYgKHBhcmFtcy0+YWR2X3NwZWVkcyAmIFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsKQorCQkJICAgIE5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS18xRzsKKwkJaWYgKHBhcmFtcy0+YWR2X3NwZWVkcyAmIFFFRF9MTV8xMDAwMGJhc2VLUl9GdWxsX0JJVCkKIAkJCWxpbmtfcGFyYW1zLT5zcGVlZC5hZHZlcnRpc2VkX3NwZWVkcyB8PQotCQkJCU5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS18xMEc7Ci0JCWlmIChwYXJhbXMtPmFkdl9zcGVlZHMgJiBTVVBQT1JURURfNDAwMDBiYXNlTFI0X0Z1bGwpCisJCQkgICAgTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLXzEwRzsKKwkJaWYgKHBhcmFtcy0+YWR2X3NwZWVkcyAmIFFFRF9MTV8yNTAwMGJhc2VLUl9GdWxsX0JJVCkKIAkJCWxpbmtfcGFyYW1zLT5zcGVlZC5hZHZlcnRpc2VkX3NwZWVkcyB8PQotCQkJCU5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS180MEc7Ci0JCWlmIChwYXJhbXMtPmFkdl9zcGVlZHMgJiAwKQorCQkJICAgIE5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS18yNUc7CisJCWlmIChwYXJhbXMtPmFkdl9zcGVlZHMgJiBRRURfTE1fNDAwMDBiYXNlTFI0X0Z1bGxfQklUKQogCQkJbGlua19wYXJhbXMtPnNwZWVkLmFkdmVydGlzZWRfc3BlZWRzIHw9Ci0JCQkJTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLXzUwRzsKLQkJaWYgKHBhcmFtcy0+YWR2X3NwZWVkcyAmIDApCisJCQkgICAgTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLXzQwRzsKKwkJaWYgKHBhcmFtcy0+YWR2X3NwZWVkcyAmIFFFRF9MTV81MDAwMGJhc2VLUjJfRnVsbF9CSVQpCisJCQlsaW5rX3BhcmFtcy0+c3BlZWQuYWR2ZXJ0aXNlZF9zcGVlZHMgfD0KKwkJCSAgICBOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfNTBHOworCQlpZiAocGFyYW1zLT5hZHZfc3BlZWRzICYgUUVEX0xNXzEwMDAwMGJhc2VLUjRfRnVsbF9CSVQpCiAJCQlsaW5rX3BhcmFtcy0+c3BlZWQuYWR2ZXJ0aXNlZF9zcGVlZHMgfD0KIAkJCSAgICBOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfQkJfMTAwRzsKIAl9CkBAIC0xMTY4LDUwICsxMjQwLDU2IEBACiAJCWlmX2xpbmstPmxpbmtfdXAgPSB0cnVlOwogCiAJLyogVE9ETyAtIGF0IHRoZSBtb21lbnQgYXNzdW1lIHN1cHBvcnRlZCBhbmQgYWR2ZXJ0aXNlZCBzcGVlZCBlcXVhbCAqLwotCWlmX2xpbmstPnN1cHBvcnRlZF9jYXBzID0gU1VQUE9SVEVEX0ZJQlJFOworCWlmX2xpbmstPnN1cHBvcnRlZF9jYXBzID0gUUVEX0xNX0ZJQlJFX0JJVDsKIAlpZiAocGFyYW1zLnNwZWVkLmF1dG9uZWcpCi0JCWlmX2xpbmstPnN1cHBvcnRlZF9jYXBzIHw9IFNVUFBPUlRFRF9BdXRvbmVnOworCQlpZl9saW5rLT5zdXBwb3J0ZWRfY2FwcyB8PSBRRURfTE1fQXV0b25lZ19CSVQ7CiAJaWYgKHBhcmFtcy5wYXVzZS5hdXRvbmVnIHx8CiAJICAgIChwYXJhbXMucGF1c2UuZm9yY2VkX3J4ICYmIHBhcmFtcy5wYXVzZS5mb3JjZWRfdHgpKQotCQlpZl9saW5rLT5zdXBwb3J0ZWRfY2FwcyB8PSBTVVBQT1JURURfQXN5bV9QYXVzZTsKKwkJaWZfbGluay0+c3VwcG9ydGVkX2NhcHMgfD0gUUVEX0xNX0FzeW1fUGF1c2VfQklUOwogCWlmIChwYXJhbXMucGF1c2UuYXV0b25lZyB8fCBwYXJhbXMucGF1c2UuZm9yY2VkX3J4IHx8CiAJICAgIHBhcmFtcy5wYXVzZS5mb3JjZWRfdHgpCi0JCWlmX2xpbmstPnN1cHBvcnRlZF9jYXBzIHw9IFNVUFBPUlRFRF9QYXVzZTsKKwkJaWZfbGluay0+c3VwcG9ydGVkX2NhcHMgfD0gUUVEX0xNX1BhdXNlX0JJVDsKIAogCWlmX2xpbmstPmFkdmVydGlzZWRfY2FwcyA9IGlmX2xpbmstPnN1cHBvcnRlZF9jYXBzOwogCWlmIChwYXJhbXMuc3BlZWQuYWR2ZXJ0aXNlZF9zcGVlZHMgJgogCSAgICBOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfMUcpCi0JCWlmX2xpbmstPmFkdmVydGlzZWRfY2FwcyB8PSBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYgfAotCQkJCQkgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGw7CisJCWlmX2xpbmstPmFkdmVydGlzZWRfY2FwcyB8PSBRRURfTE1fMTAwMGJhc2VUX0hhbGZfQklUIHwKKwkJICAgIFFFRF9MTV8xMDAwYmFzZVRfRnVsbF9CSVQ7CiAJaWYgKHBhcmFtcy5zcGVlZC5hZHZlcnRpc2VkX3NwZWVkcyAmCiAJICAgIE5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS18xMEcpCi0JCWlmX2xpbmstPmFkdmVydGlzZWRfY2FwcyB8PSBTVVBQT1JURURfMTAwMDBiYXNlS1JfRnVsbDsKKwkJaWZfbGluay0+YWR2ZXJ0aXNlZF9jYXBzIHw9IFFFRF9MTV8xMDAwMGJhc2VLUl9GdWxsX0JJVDsKIAlpZiAocGFyYW1zLnNwZWVkLmFkdmVydGlzZWRfc3BlZWRzICYKLQkJTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLXzQwRykKLQkJaWZfbGluay0+YWR2ZXJ0aXNlZF9jYXBzIHw9IFNVUFBPUlRFRF80MDAwMGJhc2VMUjRfRnVsbDsKKwkgICAgTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLXzI1RykKKwkJaWZfbGluay0+YWR2ZXJ0aXNlZF9jYXBzIHw9IFFFRF9MTV8yNTAwMGJhc2VLUl9GdWxsX0JJVDsKIAlpZiAocGFyYW1zLnNwZWVkLmFkdmVydGlzZWRfc3BlZWRzICYKLQkJTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLXzUwRykKLQkJaWZfbGluay0+YWR2ZXJ0aXNlZF9jYXBzIHw9IDA7CisJICAgIE5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS180MEcpCisJCWlmX2xpbmstPmFkdmVydGlzZWRfY2FwcyB8PSBRRURfTE1fNDAwMDBiYXNlTFI0X0Z1bGxfQklUOworCWlmIChwYXJhbXMuc3BlZWQuYWR2ZXJ0aXNlZF9zcGVlZHMgJgorCSAgICBOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfNTBHKQorCQlpZl9saW5rLT5hZHZlcnRpc2VkX2NhcHMgfD0gUUVEX0xNXzUwMDAwYmFzZUtSMl9GdWxsX0JJVDsKIAlpZiAocGFyYW1zLnNwZWVkLmFkdmVydGlzZWRfc3BlZWRzICYKIAkgICAgTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLX0JCXzEwMEcpCi0JCWlmX2xpbmstPmFkdmVydGlzZWRfY2FwcyB8PSAwOworCQlpZl9saW5rLT5hZHZlcnRpc2VkX2NhcHMgfD0gUUVEX0xNXzEwMDAwMGJhc2VLUjRfRnVsbF9CSVQ7CiAKIAlpZiAobGlua19jYXBzLnNwZWVkX2NhcGFiaWxpdGllcyAmCiAJICAgIE5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS18xRykKLQkJaWZfbGluay0+c3VwcG9ydGVkX2NhcHMgfD0gU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmIHwKLQkJCQkJICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsOworCQlpZl9saW5rLT5zdXBwb3J0ZWRfY2FwcyB8PSBRRURfTE1fMTAwMGJhc2VUX0hhbGZfQklUIHwKKwkJICAgIFFFRF9MTV8xMDAwYmFzZVRfRnVsbF9CSVQ7CiAJaWYgKGxpbmtfY2Fwcy5zcGVlZF9jYXBhYmlsaXRpZXMgJgogCSAgICBOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfMTBHKQotCQlpZl9saW5rLT5zdXBwb3J0ZWRfY2FwcyB8PSBTVVBQT1JURURfMTAwMDBiYXNlS1JfRnVsbDsKKwkJaWZfbGluay0+c3VwcG9ydGVkX2NhcHMgfD0gUUVEX0xNXzEwMDAwYmFzZUtSX0Z1bGxfQklUOwogCWlmIChsaW5rX2NhcHMuc3BlZWRfY2FwYWJpbGl0aWVzICYKLQkJTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLXzQwRykKLQkJaWZfbGluay0+c3VwcG9ydGVkX2NhcHMgfD0gU1VQUE9SVEVEXzQwMDAwYmFzZUxSNF9GdWxsOworCSAgICBOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfMjVHKQorCQlpZl9saW5rLT5zdXBwb3J0ZWRfY2FwcyB8PSBRRURfTE1fMjUwMDBiYXNlS1JfRnVsbF9CSVQ7CiAJaWYgKGxpbmtfY2Fwcy5zcGVlZF9jYXBhYmlsaXRpZXMgJgotCQlOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfNTBHKQotCQlpZl9saW5rLT5zdXBwb3J0ZWRfY2FwcyB8PSAwOworCSAgICBOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfNDBHKQorCQlpZl9saW5rLT5zdXBwb3J0ZWRfY2FwcyB8PSBRRURfTE1fNDAwMDBiYXNlTFI0X0Z1bGxfQklUOworCWlmIChsaW5rX2NhcHMuc3BlZWRfY2FwYWJpbGl0aWVzICYKKwkgICAgTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLXzUwRykKKwkJaWZfbGluay0+c3VwcG9ydGVkX2NhcHMgfD0gUUVEX0xNXzUwMDAwYmFzZUtSMl9GdWxsX0JJVDsKIAlpZiAobGlua19jYXBzLnNwZWVkX2NhcGFiaWxpdGllcyAmCiAJICAgIE5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS19CQl8xMDBHKQotCQlpZl9saW5rLT5zdXBwb3J0ZWRfY2FwcyB8PSAwOworCQlpZl9saW5rLT5zdXBwb3J0ZWRfY2FwcyB8PSBRRURfTE1fMTAwMDAwYmFzZUtSNF9GdWxsX0JJVDsKIAogCWlmIChsaW5rLmxpbmtfdXApCiAJCWlmX2xpbmstPnNwZWVkID0gbGluay5zcGVlZDsKQEAgLTEyMzEsMzMgKzEzMDksMjkgQEAKIAkJaWZfbGluay0+cGF1c2VfY29uZmlnIHw9IFFFRF9MSU5LX1BBVVNFX1RYX0VOQUJMRTsKIAogCS8qIExpbmsgcGFydG5lciBjYXBhYmlsaXRpZXMgKi8KLQlpZiAobGluay5wYXJ0bmVyX2Fkdl9zcGVlZCAmCi0JICAgIFFFRF9MSU5LX1BBUlRORVJfU1BFRURfMUdfSEQpCi0JCWlmX2xpbmstPmxwX2NhcHMgfD0gU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmOwotCWlmIChsaW5rLnBhcnRuZXJfYWR2X3NwZWVkICYKLQkgICAgUUVEX0xJTktfUEFSVE5FUl9TUEVFRF8xR19GRCkKLQkJaWZfbGluay0+bHBfY2FwcyB8PSBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGw7Ci0JaWYgKGxpbmsucGFydG5lcl9hZHZfc3BlZWQgJgotCSAgICBRRURfTElOS19QQVJUTkVSX1NQRUVEXzEwRykKLQkJaWZfbGluay0+bHBfY2FwcyB8PSBTVVBQT1JURURfMTAwMDBiYXNlS1JfRnVsbDsKLQlpZiAobGluay5wYXJ0bmVyX2Fkdl9zcGVlZCAmCi0JICAgIFFFRF9MSU5LX1BBUlRORVJfU1BFRURfNDBHKQotCQlpZl9saW5rLT5scF9jYXBzIHw9IFNVUFBPUlRFRF80MDAwMGJhc2VMUjRfRnVsbDsKLQlpZiAobGluay5wYXJ0bmVyX2Fkdl9zcGVlZCAmCi0JICAgIFFFRF9MSU5LX1BBUlRORVJfU1BFRURfNTBHKQotCQlpZl9saW5rLT5scF9jYXBzIHw9IDA7Ci0JaWYgKGxpbmsucGFydG5lcl9hZHZfc3BlZWQgJgotCSAgICBRRURfTElOS19QQVJUTkVSX1NQRUVEXzEwMEcpCi0JCWlmX2xpbmstPmxwX2NhcHMgfD0gMDsKKwlpZiAobGluay5wYXJ0bmVyX2Fkdl9zcGVlZCAmIFFFRF9MSU5LX1BBUlRORVJfU1BFRURfMUdfSEQpCisJCWlmX2xpbmstPmxwX2NhcHMgfD0gUUVEX0xNXzEwMDBiYXNlVF9IYWxmX0JJVDsKKwlpZiAobGluay5wYXJ0bmVyX2Fkdl9zcGVlZCAmIFFFRF9MSU5LX1BBUlRORVJfU1BFRURfMUdfRkQpCisJCWlmX2xpbmstPmxwX2NhcHMgfD0gUUVEX0xNXzEwMDBiYXNlVF9GdWxsX0JJVDsKKwlpZiAobGluay5wYXJ0bmVyX2Fkdl9zcGVlZCAmIFFFRF9MSU5LX1BBUlRORVJfU1BFRURfMTBHKQorCQlpZl9saW5rLT5scF9jYXBzIHw9IFFFRF9MTV8xMDAwMGJhc2VLUl9GdWxsX0JJVDsKKwlpZiAobGluay5wYXJ0bmVyX2Fkdl9zcGVlZCAmIFFFRF9MSU5LX1BBUlRORVJfU1BFRURfMjVHKQorCQlpZl9saW5rLT5scF9jYXBzIHw9IFFFRF9MTV8yNTAwMGJhc2VLUl9GdWxsX0JJVDsKKwlpZiAobGluay5wYXJ0bmVyX2Fkdl9zcGVlZCAmIFFFRF9MSU5LX1BBUlRORVJfU1BFRURfNDBHKQorCQlpZl9saW5rLT5scF9jYXBzIHw9IFFFRF9MTV80MDAwMGJhc2VMUjRfRnVsbF9CSVQ7CisJaWYgKGxpbmsucGFydG5lcl9hZHZfc3BlZWQgJiBRRURfTElOS19QQVJUTkVSX1NQRUVEXzUwRykKKwkJaWZfbGluay0+bHBfY2FwcyB8PSBRRURfTE1fNTAwMDBiYXNlS1IyX0Z1bGxfQklUOworCWlmIChsaW5rLnBhcnRuZXJfYWR2X3NwZWVkICYgUUVEX0xJTktfUEFSVE5FUl9TUEVFRF8xMDBHKQorCQlpZl9saW5rLT5scF9jYXBzIHw9IFFFRF9MTV8xMDAwMDBiYXNlS1I0X0Z1bGxfQklUOwogCiAJaWYgKGxpbmsuYW5fY29tcGxldGUpCi0JCWlmX2xpbmstPmxwX2NhcHMgfD0gU1VQUE9SVEVEX0F1dG9uZWc7CisJCWlmX2xpbmstPmxwX2NhcHMgfD0gUUVEX0xNX0F1dG9uZWdfQklUOwogCiAJaWYgKGxpbmsucGFydG5lcl9hZHZfcGF1c2UpCi0JCWlmX2xpbmstPmxwX2NhcHMgfD0gU1VQUE9SVEVEX1BhdXNlOworCQlpZl9saW5rLT5scF9jYXBzIHw9IFFFRF9MTV9QYXVzZV9CSVQ7CiAJaWYgKGxpbmsucGFydG5lcl9hZHZfcGF1c2UgPT0gUUVEX0xJTktfUEFSVE5FUl9BU1lNTUVUUklDX1BBVVNFIHx8CiAJICAgIGxpbmsucGFydG5lcl9hZHZfcGF1c2UgPT0gUUVEX0xJTktfUEFSVE5FUl9CT1RIX1BBVVNFKQotCQlpZl9saW5rLT5scF9jYXBzIHw9IFNVUFBPUlRFRF9Bc3ltX1BhdXNlOworCQlpZl9saW5rLT5scF9jYXBzIHw9IFFFRF9MTV9Bc3ltX1BhdXNlX0JJVDsKIH0KIAogc3RhdGljIHZvaWQgcWVkX2dldF9jdXJyZW50X2xpbmsoc3RydWN0IHFlZF9kZXYgKmNkZXYsCkBAIC0xMzg1LDkgKzE0NTksMzIgQEAKIAkuZ2V0X2xpbmsgPSAmcWVkX2dldF9jdXJyZW50X2xpbmssCiAJLmRyYWluID0gJnFlZF9kcmFpbiwKIAkudXBkYXRlX21zZ2x2bCA9ICZxZWRfaW5pdF9kcCwKKwkuZGJnX2FsbF9kYXRhID0gJnFlZF9kYmdfYWxsX2RhdGEsCisJLmRiZ19hbGxfZGF0YV9zaXplID0gJnFlZF9kYmdfYWxsX2RhdGFfc2l6ZSwKIAkuY2hhaW5fYWxsb2MgPSAmcWVkX2NoYWluX2FsbG9jLAogCS5jaGFpbl9mcmVlID0gJnFlZF9jaGFpbl9mcmVlLAogCS5nZXRfY29hbGVzY2UgPSAmcWVkX2dldF9jb2FsZXNjZSwKIAkuc2V0X2NvYWxlc2NlID0gJnFlZF9zZXRfY29hbGVzY2UsCiAJLnNldF9sZWQgPSAmcWVkX3NldF9sZWQsCiB9OworCit2b2lkIHFlZF9nZXRfcHJvdG9jb2xfc3RhdHMoc3RydWN0IHFlZF9kZXYgKmNkZXYsCisJCQkgICAgZW51bSBxZWRfbWNwX3Byb3RvY29sX3R5cGUgdHlwZSwKKwkJCSAgICB1bmlvbiBxZWRfbWNwX3Byb3RvY29sX3N0YXRzICpzdGF0cykKK3sKKwlzdHJ1Y3QgcWVkX2V0aF9zdGF0cyBldGhfc3RhdHM7CisKKwltZW1zZXQoc3RhdHMsIDAsIHNpemVvZigqc3RhdHMpKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgUUVEX01DUF9MQU5fU1RBVFM6CisJCXFlZF9nZXRfdnBvcnRfc3RhdHMoY2RldiwgJmV0aF9zdGF0cyk7CisJCXN0YXRzLT5sYW5fc3RhdHMudWNhc3RfcnhfcGt0cyA9IGV0aF9zdGF0cy5yeF91Y2FzdF9wa3RzOworCQlzdGF0cy0+bGFuX3N0YXRzLnVjYXN0X3R4X3BrdHMgPSBldGhfc3RhdHMudHhfdWNhc3RfcGt0czsKKwkJc3RhdHMtPmxhbl9zdGF0cy5mY3NfZXJyID0gLTE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURQX0VSUihjZGV2LCAiSW52YWxpZCBwcm90b2NvbCB0eXBlID0gJWRcbiIsIHR5cGUpOworCQlyZXR1cm47CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfbWNwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9tY3AuYwppbmRleCBhMjQwZjI2Li5iZGM5YmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9tY3AuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9tY3AuYwpAQCAtNTQsOCArNTQsNyBAQAogCXJldHVybiB0cnVlOwogfQogCi12b2lkIHFlZF9tY3BfY21kX3BvcnRfaW5pdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3ZvaWQgcWVkX21jcF9jbWRfcG9ydF9pbml0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCiB7CiAJdTMyIGFkZHIgPSBTRUNUSU9OX09GRlNJWkVfQUREUihwX2h3Zm4tPm1jcF9pbmZvLT5wdWJsaWNfYmFzZSwKIAkJCQkJUFVCTElDX1BPUlQpOwpAQCAtNjgsOCArNjcsNyBAQAogCQkgICBwX2h3Zm4tPm1jcF9pbmZvLT5wb3J0X2FkZHIsIE1GV19QT1JUKHBfaHdmbikpOwogfQogCi12b2lkIHFlZF9tY3BfcmVhZF9tYihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCit2b2lkIHFlZF9tY3BfcmVhZF9tYihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCXUzMiBsZW5ndGggPSBNRldfRFJWX01TR19NQVhfRFdPUkRTKHBfaHdmbi0+bWNwX2luZm8tPm1md19tYl9sZW5ndGgpOwogCXUzMiB0bXAsIGk7CkBAIC05OSw4ICs5Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcWVkX2xvYWRfbWNwX29mZnNldHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkJc3RydWN0IHFlZF9wdHQgKnBfcHR0KQorc3RhdGljIGludCBxZWRfbG9hZF9tY3Bfb2Zmc2V0cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCXN0cnVjdCBxZWRfbWNwX2luZm8gKnBfaW5mbyA9IHBfaHdmbi0+bWNwX2luZm87CiAJdTMyIGRydl9tYl9vZmZzaXplLCBtZndfbWJfb2Zmc2l6ZTsKQEAgLTE0Myw4ICsxNDAsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcWVkX21jcF9jbWRfaW5pdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCitpbnQgcWVkX21jcF9jbWRfaW5pdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCXN0cnVjdCBxZWRfbWNwX2luZm8gKnBfaW5mbzsKIAl1MzIgc2l6ZTsKQEAgLTE2NSw5ICsxNjEsNyBAQAogCiAJc2l6ZSA9IE1GV19EUlZfTVNHX01BWF9EV09SRFMocF9pbmZvLT5tZndfbWJfbGVuZ3RoKSAqIHNpemVvZih1MzIpOwogCXBfaW5mby0+bWZ3X21iX2N1ciA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JcF9pbmZvLT5tZndfbWJfc2hhZG93ID0KLQkJa3phbGxvYyhzaXplb2YodTMyKSAqIE1GV19EUlZfTVNHX01BWF9EV09SRFMoCi0JCQkJcF9pbmZvLT5tZndfbWJfbGVuZ3RoKSwgR0ZQX0tFUk5FTCk7CisJcF9pbmZvLT5tZndfbWJfc2hhZG93ID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBfaW5mby0+bWZ3X21iX3NoYWRvdyB8fCAhcF9pbmZvLT5tZndfbWJfYWRkcikKIAkJZ290byBlcnI7CiAKQEAgLTE3Nyw3ICsxNzEsNiBAQAogCXJldHVybiAwOwogCiBlcnI6Ci0JRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtY3AgbWVtb3J5XG4iKTsKIAlxZWRfbWNwX2ZyZWUocF9od2ZuKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KQEAgLTE4OSw4ICsxODIsNyBAQAogICogYWNjZXNzIGlzIGFjaGlldmVkIGJ5IHNldHRpbmcgYSBibG9ja2luZyBmbGFnLCB3aGljaCB3aWxsIGZhaWwgb3RoZXIKICAqIGNvbXBldGluZyBjb250ZXh0cyB0byBzZW5kIHRoZWlyIG1haWxib3hlcy4KICAqLwotc3RhdGljIGludCBxZWRfbWNwX21iX2xvY2soc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgICB1MzIgY21kKQorc3RhdGljIGludCBxZWRfbWNwX21iX2xvY2soc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHUzMiBjbWQpCiB7CiAJc3Bpbl9sb2NrX2JoKCZwX2h3Zm4tPm1jcF9pbmZvLT5sb2NrKTsKIApAQCAtMjIxLDE1ICsyMTMsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcWVkX21jcF9tYl91bmxvY2soc3RydWN0IHFlZF9od2ZuCSpwX2h3Zm4sCi0JCQkgICAgICB1MzIJCWNtZCkKK3N0YXRpYyB2b2lkIHFlZF9tY3BfbWJfdW5sb2NrKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1MzIgY21kKQogewogCWlmIChjbWQgIT0gRFJWX01TR19DT0RFX0xPQURfUkVRICYmIGNtZCAhPSBEUlZfTVNHX0NPREVfVU5MT0FEX1JFUSkKIAkJc3Bpbl91bmxvY2tfYmgoJnBfaHdmbi0+bWNwX2luZm8tPmxvY2spOwogfQogCi1pbnQgcWVkX21jcF9yZXNldChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCitpbnQgcWVkX21jcF9yZXNldChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCXUzMiBzZXEgPSArK3BfaHdmbi0+bWNwX2luZm8tPmRydl9tYl9zZXE7CiAJdTggZGVsYXkgPSBDSElQX01DUF9SRVNQX0lURVJfVVM7CkBAIC0zMjYsNyArMzE2LDggQEAKIAkJKm9fbWNwX3BhcmFtID0gRFJWX01CX1JEKHBfaHdmbiwgcF9wdHQsIGZ3X21iX3BhcmFtKTsKIAl9IGVsc2UgewogCQkvKiBGVyBCVUchICovCi0JCURQX0VSUihwX2h3Zm4sICJNRlcgZmFpbGVkIHRvIHJlc3BvbmQhXG4iKTsKKwkJRFBfRVJSKHBfaHdmbiwgIk1GVyBmYWlsZWQgdG8gcmVzcG9uZCBbY21kIDB4JXggcGFyYW0gMHgleF1cbiIsCisJCSAgICAgICBjbWQsIHBhcmFtKTsKIAkJKm9fbWNwX3Jlc3AgPSAwOwogCQlyYyA9IC1FQUdBSU47CiAJfQpAQCAtMzQyLDcgKzMzMyw3IEBACiAKIAkvKiBNQ1Agbm90IGluaXRpYWxpemVkICovCiAJaWYgKCFxZWRfbWNwX2lzX2luaXQocF9od2ZuKSkgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAiTUZXIGlzIG5vdCBpbml0aWFsaXplZCAhXG4iKTsKKwkJRFBfTk9USUNFKHBfaHdmbiwgIk1GVyBpcyBub3QgaW5pdGlhbGl6ZWQhXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTM5OCw5ICszODksMzYgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IHFlZF9tY3BfbnZtX3JkX2NtZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJICAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJICAgICAgIHUzMiBjbWQsCisJCSAgICAgICB1MzIgcGFyYW0sCisJCSAgICAgICB1MzIgKm9fbWNwX3Jlc3AsCisJCSAgICAgICB1MzIgKm9fbWNwX3BhcmFtLCB1MzIgKm9fdHhuX3NpemUsIHUzMiAqb19idWYpCit7CisJc3RydWN0IHFlZF9tY3BfbWJfcGFyYW1zIG1iX3BhcmFtczsKKwl1bmlvbiBkcnZfdW5pb25fZGF0YSB1bmlvbl9kYXRhOworCWludCByYzsKKworCW1lbXNldCgmbWJfcGFyYW1zLCAwLCBzaXplb2YobWJfcGFyYW1zKSk7CisJbWJfcGFyYW1zLmNtZCA9IGNtZDsKKwltYl9wYXJhbXMucGFyYW0gPSBwYXJhbTsKKwltYl9wYXJhbXMucF9kYXRhX2RzdCA9ICZ1bmlvbl9kYXRhOworCXJjID0gcWVkX21jcF9jbWRfYW5kX3VuaW9uKHBfaHdmbiwgcF9wdHQsICZtYl9wYXJhbXMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJKm9fbWNwX3Jlc3AgPSBtYl9wYXJhbXMubWNwX3Jlc3A7CisJKm9fbWNwX3BhcmFtID0gbWJfcGFyYW1zLm1jcF9wYXJhbTsKKworCSpvX3R4bl9zaXplID0gKm9fbWNwX3BhcmFtOworCW1lbWNweShvX2J1ZiwgJnVuaW9uX2RhdGEucmF3X2RhdGEsICpvX3R4bl9zaXplKTsKKworCXJldHVybiAwOworfQorCiBpbnQgcWVkX21jcF9sb2FkX3JlcShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCi0JCSAgICAgdTMyICpwX2xvYWRfY29kZSkKKwkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiAqcF9sb2FkX2NvZGUpCiB7CiAJc3RydWN0IHFlZF9kZXYgKmNkZXYgPSBwX2h3Zm4tPmNkZXY7CiAJc3RydWN0IHFlZF9tY3BfbWJfcGFyYW1zIG1iX3BhcmFtczsKQEAgLTUyNyw4ICs1NDUsNyBAQAogCQkgICAiUmVjZWl2ZWQgdHJhbnNjZWl2ZXIgc3RhdGUgdXBkYXRlIFsweCUwOHhdIGZyb20gbWZ3IFtBZGRyIDB4JXhdXG4iLAogCQkgICB0cmFuc2NlaXZlcl9zdGF0ZSwKIAkJICAgKHUzMikocF9od2ZuLT5tY3BfaW5mby0+cG9ydF9hZGRyICsKLQkJCSBvZmZzZXRvZihzdHJ1Y3QgcHVibGljX3BvcnQsCi0JCQkJICB0cmFuc2NlaXZlcl9kYXRhKSkpOworCQkJICBvZmZzZXRvZihzdHJ1Y3QgcHVibGljX3BvcnQsIHRyYW5zY2VpdmVyX2RhdGEpKSk7CiAKIAl0cmFuc2NlaXZlcl9zdGF0ZSA9IEdFVF9GSUVMRCh0cmFuc2NlaXZlcl9zdGF0ZSwKIAkJCQkgICAgICBFVEhfVFJBTlNDRUlWRVJfU1RBVEUpOwpAQCAtNTQwLDggKzU1Nyw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHFlZF9tY3BfaGFuZGxlX2xpbmtfY2hhbmdlKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJCSAgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCi0JCQkJICAgICAgIGJvb2wgYl9yZXNldCkKKwkJCQkgICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCBib29sIGJfcmVzZXQpCiB7CiAJc3RydWN0IHFlZF9tY3BfbGlua19zdGF0ZSAqcF9saW5rOwogCXU4IG1heF9idywgbWluX2J3OwpAQCAtNTU3LDggKzU3Myw3IEBACiAJCQkgICAiUmVjZWl2ZWQgbGluayB1cGRhdGUgWzB4JTA4eF0gZnJvbSBtZncgW0FkZHIgMHgleF1cbiIsCiAJCQkgICBzdGF0dXMsCiAJCQkgICAodTMyKShwX2h3Zm4tPm1jcF9pbmZvLT5wb3J0X2FkZHIgKwotCQkJCSBvZmZzZXRvZihzdHJ1Y3QgcHVibGljX3BvcnQsCi0JCQkJCSAgbGlua19zdGF0dXMpKSk7CisJCQkJIG9mZnNldG9mKHN0cnVjdCBwdWJsaWNfcG9ydCwgbGlua19zdGF0dXMpKSk7CiAJfSBlbHNlIHsKIAkJRFBfVkVSQk9TRShwX2h3Zm4sIE5FVElGX01TR19MSU5LLAogCQkJICAgIlJlc2V0dGluZyBsaW5rIGluZGljYXRpb25zXG4iKTsKQEAgLTYzNSw2ICs2NTAsOSBAQAogCQkoc3RhdHVzICYgTElOS19TVEFUVVNfTElOS19QQVJUTkVSXzIwR19DQVBBQkxFKSA/CiAJCVFFRF9MSU5LX1BBUlRORVJfU1BFRURfMjBHIDogMDsKIAlwX2xpbmstPnBhcnRuZXJfYWR2X3NwZWVkIHw9CisJCShzdGF0dXMgJiBMSU5LX1NUQVRVU19MSU5LX1BBUlRORVJfMjVHX0NBUEFCTEUpID8KKwkJUUVEX0xJTktfUEFSVE5FUl9TUEVFRF8yNUcgOiAwOworCXBfbGluay0+cGFydG5lcl9hZHZfc3BlZWQgfD0KIAkJKHN0YXR1cyAmIExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl80MEdfQ0FQQUJMRSkgPwogCQlRRURfTElOS19QQVJUTkVSX1NQRUVEXzQwRyA6IDA7CiAJcF9saW5rLT5wYXJ0bmVyX2Fkdl9zcGVlZCB8PQpAQCAtNzIyLDYgKzc0MCw0OCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBxZWRfbWNwX3NlbmRfcHJvdG9jb2xfc3RhdHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCXN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJZW51bSBNRldfRFJWX01TR19UWVBFIHR5cGUpCit7CisJZW51bSBxZWRfbWNwX3Byb3RvY29sX3R5cGUgc3RhdHNfdHlwZTsKKwl1bmlvbiBxZWRfbWNwX3Byb3RvY29sX3N0YXRzIHN0YXRzOworCXN0cnVjdCBxZWRfbWNwX21iX3BhcmFtcyBtYl9wYXJhbXM7CisJdW5pb24gZHJ2X3VuaW9uX2RhdGEgdW5pb25fZGF0YTsKKwl1MzIgaHNpX3BhcmFtOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBNRldfRFJWX01TR19HRVRfTEFOX1NUQVRTOgorCQlzdGF0c190eXBlID0gUUVEX01DUF9MQU5fU1RBVFM7CisJCWhzaV9wYXJhbSA9IERSVl9NU0dfQ09ERV9TVEFUU19UWVBFX0xBTjsKKwkJYnJlYWs7CisJY2FzZSBNRldfRFJWX01TR19HRVRfRkNPRV9TVEFUUzoKKwkJc3RhdHNfdHlwZSA9IFFFRF9NQ1BfRkNPRV9TVEFUUzsKKwkJaHNpX3BhcmFtID0gRFJWX01TR19DT0RFX1NUQVRTX1RZUEVfRkNPRTsKKwkJYnJlYWs7CisJY2FzZSBNRldfRFJWX01TR19HRVRfSVNDU0lfU1RBVFM6CisJCXN0YXRzX3R5cGUgPSBRRURfTUNQX0lTQ1NJX1NUQVRTOworCQloc2lfcGFyYW0gPSBEUlZfTVNHX0NPREVfU1RBVFNfVFlQRV9JU0NTSTsKKwkJYnJlYWs7CisJY2FzZSBNRldfRFJWX01TR19HRVRfUkRNQV9TVEFUUzoKKwkJc3RhdHNfdHlwZSA9IFFFRF9NQ1BfUkRNQV9TVEFUUzsKKwkJaHNpX3BhcmFtID0gRFJWX01TR19DT0RFX1NUQVRTX1RZUEVfUkRNQTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFBfTk9USUNFKHBfaHdmbiwgIkludmFsaWQgcHJvdG9jb2wgdHlwZSAlZFxuIiwgdHlwZSk7CisJCXJldHVybjsKKwl9CisKKwlxZWRfZ2V0X3Byb3RvY29sX3N0YXRzKHBfaHdmbi0+Y2Rldiwgc3RhdHNfdHlwZSwgJnN0YXRzKTsKKworCW1lbXNldCgmbWJfcGFyYW1zLCAwLCBzaXplb2YobWJfcGFyYW1zKSk7CisJbWJfcGFyYW1zLmNtZCA9IERSVl9NU0dfQ09ERV9HRVRfU1RBVFM7CisJbWJfcGFyYW1zLnBhcmFtID0gaHNpX3BhcmFtOworCW1lbWNweSgmdW5pb25fZGF0YSwgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKTsKKwltYl9wYXJhbXMucF9kYXRhX3NyYyA9ICZ1bmlvbl9kYXRhOworCXFlZF9tY3BfY21kX2FuZF91bmlvbihwX2h3Zm4sIHBfcHR0LCAmbWJfcGFyYW1zKTsKK30KKwogc3RhdGljIHZvaWQgcWVkX3JlYWRfcGZfYmFuZHdpZHRoKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkJCSAgc3RydWN0IHB1YmxpY19mdW5jICpwX3NobWVtX2luZm8pCiB7CkBAIC03NTIsOCArODEyLDcgQEAKIAogc3RhdGljIHUzMiBxZWRfbWNwX2dldF9zaG1lbV9mdW5jKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkJCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkJCSAgc3RydWN0IHB1YmxpY19mdW5jICpwX2RhdGEsCi0JCQkJICBpbnQgcGZpZCkKKwkJCQkgIHN0cnVjdCBwdWJsaWNfZnVuYyAqcF9kYXRhLCBpbnQgcGZpZCkKIHsKIAl1MzIgYWRkciA9IFNFQ1RJT05fT0ZGU0laRV9BRERSKHBfaHdmbi0+bWNwX2luZm8tPnB1YmxpY19iYXNlLAogCQkJCQlQVUJMSUNfRlVOQyk7CkBAIC03NjMsNTEgKzgyMiwyMCBAQAogCiAJbWVtc2V0KHBfZGF0YSwgMCwgc2l6ZW9mKCpwX2RhdGEpKTsKIAotCXNpemUgPSBtaW5fdCh1MzIsIHNpemVvZigqcF9kYXRhKSwKLQkJICAgICBRRURfU0VDVElPTl9TSVpFKG1md19wYXRoX29mZnNpemUpKTsKKwlzaXplID0gbWluX3QodTMyLCBzaXplb2YoKnBfZGF0YSksIFFFRF9TRUNUSU9OX1NJWkUobWZ3X3BhdGhfb2Zmc2l6ZSkpOwogCWZvciAoaSA9IDA7IGkgPCBzaXplIC8gc2l6ZW9mKHUzMik7IGkrKykKIAkJKCh1MzIgKilwX2RhdGEpW2ldID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsCiAJCQkJCSAgICBmdW5jX2FkZHIgKyAoaSA8PCAyKSk7CiAJcmV0dXJuIHNpemU7CiB9CiAKLWludCBxZWRfaHdfaW5pdF9maXJzdF9ldGgoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTggKnBfcGYpCi17Ci0Jc3RydWN0IHB1YmxpY19mdW5jIHNobWVtX2luZm87Ci0JaW50IGk7Ci0KLQkvKiBGaW5kIGZpcnN0IEV0aGVybmV0IGludGVyZmFjZSBpbiBwb3J0ICovCi0JZm9yIChpID0gMDsgaSA8IE5VTV9PRl9FTkdfUEZTKHBfaHdmbi0+Y2Rldik7Ci0JICAgICBpICs9IHBfaHdmbi0+Y2Rldi0+bnVtX3BvcnRzX2luX2VuZ2luZXMpIHsKLQkJcWVkX21jcF9nZXRfc2htZW1fZnVuYyhwX2h3Zm4sIHBfcHR0LCAmc2htZW1faW5mbywKLQkJCQkgICAgICAgTUNQX1BGX0lEX0JZX1JFTChwX2h3Zm4sIGkpKTsKLQotCQlpZiAoc2htZW1faW5mby5jb25maWcgJiBGVU5DX01GX0NGR19GVU5DX0hJREUpCi0JCQljb250aW51ZTsKLQotCQlpZiAoKHNobWVtX2luZm8uY29uZmlnICYgRlVOQ19NRl9DRkdfUFJPVE9DT0xfTUFTSykgPT0KLQkJICAgIEZVTkNfTUZfQ0ZHX1BST1RPQ09MX0VUSEVSTkVUKSB7Ci0JCQkqcF9wZiA9ICh1OClpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlEUF9OT1RJQ0UocF9od2ZuLAotCQkgICJGYWlsZWQgdG8gZmluZCBvbiBwb3J0IGFuIGV0aGVybmV0IGludGVyZmFjZSBpbiBNRl9TSSBtb2RlXG4iKTsKLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgdm9pZCBxZWRfbWNwX3VwZGF0ZV9idyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3N0YXRpYyB2b2lkIHFlZF9tY3BfdXBkYXRlX2J3KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCiB7CiAJc3RydWN0IHFlZF9tY3BfZnVuY3Rpb25faW5mbyAqcF9pbmZvOwogCXN0cnVjdCBwdWJsaWNfZnVuYyBzaG1lbV9pbmZvOwogCXUzMiByZXNwID0gMCwgcGFyYW0gPSAwOwogCi0JcWVkX21jcF9nZXRfc2htZW1fZnVuYyhwX2h3Zm4sIHBfcHR0LCAmc2htZW1faW5mbywKLQkJCSAgICAgICBNQ1BfUEZfSUQocF9od2ZuKSk7CisJcWVkX21jcF9nZXRfc2htZW1fZnVuYyhwX2h3Zm4sIHBfcHR0LCAmc2htZW1faW5mbywgTUNQX1BGX0lEKHBfaHdmbikpOwogCiAJcWVkX3JlYWRfcGZfYmFuZHdpZHRoKHBfaHdmbiwgJnNobWVtX2luZm8pOwogCkBAIC04NjcsNiArODk1LDEyIEBACiAJCWNhc2UgTUZXX0RSVl9NU0dfVFJBTlNDRUlWRVJfU1RBVEVfQ0hBTkdFOgogCQkJcWVkX21jcF9oYW5kbGVfdHJhbnNjZWl2ZXJfY2hhbmdlKHBfaHdmbiwgcF9wdHQpOwogCQkJYnJlYWs7CisJCWNhc2UgTUZXX0RSVl9NU0dfR0VUX0xBTl9TVEFUUzoKKwkJY2FzZSBNRldfRFJWX01TR19HRVRfRkNPRV9TVEFUUzoKKwkJY2FzZSBNRldfRFJWX01TR19HRVRfSVNDU0lfU1RBVFM6CisJCWNhc2UgTUZXX0RSVl9NU0dfR0VUX1JETUFfU1RBVFM6CisJCQlxZWRfbWNwX3NlbmRfcHJvdG9jb2xfc3RhdHMocF9od2ZuLCBwX3B0dCwgaSk7CisJCQlicmVhazsKIAkJY2FzZSBNRldfRFJWX01TR19CV19VUERBVEU6CiAJCQlxZWRfbWNwX3VwZGF0ZV9idyhwX2h3Zm4sIHBfcHR0KTsKIAkJCWJyZWFrOwpAQCAtOTQwLDggKzk3NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBxZWRfbWNwX2dldF9tZWRpYV90eXBlKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAotCQkJICAgdTMyICpwX21lZGlhX3R5cGUpCitpbnQgcWVkX21jcF9nZXRfbWVkaWFfdHlwZShzdHJ1Y3QgcWVkX2RldiAqY2RldiwgdTMyICpwX21lZGlhX3R5cGUpCiB7CiAJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4gPSAmY2Rldi0+aHdmbnNbMF07CiAJc3RydWN0IHFlZF9wdHQgICpwX3B0dDsKQEAgLTk1MCw3ICs5ODMsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICghcWVkX21jcF9pc19pbml0KHBfaHdmbikpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIk1GVyBpcyBub3QgaW5pdGlhbGl6ZWQgIVxuIik7CisJCURQX05PVElDRShwX2h3Zm4sICJNRlcgaXMgbm90IGluaXRpYWxpemVkIVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC0xMDAzLDE1ICsxMDM2LDEzIEBACiAJc3RydWN0IHFlZF9tY3BfZnVuY3Rpb25faW5mbyAqaW5mbzsKIAlzdHJ1Y3QgcHVibGljX2Z1bmMgc2htZW1faW5mbzsKIAotCXFlZF9tY3BfZ2V0X3NobWVtX2Z1bmMocF9od2ZuLCBwX3B0dCwgJnNobWVtX2luZm8sCi0JCQkgICAgICAgTUNQX1BGX0lEKHBfaHdmbikpOworCXFlZF9tY3BfZ2V0X3NobWVtX2Z1bmMocF9od2ZuLCBwX3B0dCwgJnNobWVtX2luZm8sIE1DUF9QRl9JRChwX2h3Zm4pKTsKIAlpbmZvID0gJnBfaHdmbi0+bWNwX2luZm8tPmZ1bmNfaW5mbzsKIAogCWluZm8tPnBhdXNlX29uX2hvc3QgPSAoc2htZW1faW5mby5jb25maWcgJgogCQkJICAgICAgIEZVTkNfTUZfQ0ZHX1BBVVNFX09OX0hPU1RfUklORykgPyAxIDogMDsKIAotCWlmIChxZWRfbWNwX2dldF9zaG1lbV9wcm90byhwX2h3Zm4sICZzaG1lbV9pbmZvLAotCQkJCSAgICAmaW5mby0+cHJvdG9jb2wpKSB7CisJaWYgKHFlZF9tY3BfZ2V0X3NobWVtX3Byb3RvKHBfaHdmbiwgJnNobWVtX2luZm8sICZpbmZvLT5wcm90b2NvbCkpIHsKIAkJRFBfRVJSKHBfaHdmbiwgIlVua25vd24gcGVyc29uYWxpdHkgJTA4eFxuIiwKIAkJICAgICAgICh1MzIpKHNobWVtX2luZm8uY29uZmlnICYgRlVOQ19NRl9DRkdfUFJPVE9DT0xfTUFTSykpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEwNzIsMTUgKzExMDMsMTMgQEAKIAlyZXR1cm4gJnBfaHdmbi0+bWNwX2luZm8tPmxpbmtfY2FwYWJpbGl0aWVzOwogfQogCi1pbnQgcWVkX21jcF9kcmFpbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCitpbnQgcWVkX21jcF9kcmFpbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCXUzMiByZXNwID0gMCwgcGFyYW0gPSAwOwogCWludCByYzsKIAogCXJjID0gcWVkX21jcF9jbWQocF9od2ZuLCBwX3B0dCwKLQkJCSBEUlZfTVNHX0NPREVfTklHX0RSQUlOLCAxMDAwLAotCQkJICZyZXNwLCAmcGFyYW0pOworCQkJIERSVl9NU0dfQ09ERV9OSUdfRFJBSU4sIDEwMDAsICZyZXNwLCAmcGFyYW0pOwogCiAJLyogV2FpdCBmb3IgdGhlIGRyYWluIHRvIGNvbXBsZXRlIGJlZm9yZSByZXR1cm5pbmcgKi8KIAltc2xlZXAoMTAyMCk7CkBAIC0xMDg5LDggKzExMTgsNyBAQAogfQogCiBpbnQgcWVkX21jcF9nZXRfZmxhc2hfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJCSAgIHUzMiAqcF9mbGFzaF9zaXplKQorCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgKnBfZmxhc2hfc2l6ZSkKIHsKIAl1MzIgZmxhc2hfc2l6ZTsKIApAQCAtMTE1Myw4ICsxMTgxLDggQEAKIAlwX2Rydl92ZXJzaW9uID0gJnVuaW9uX2RhdGEuZHJ2X3ZlcnNpb247CiAJcF9kcnZfdmVyc2lvbi0+dmVyc2lvbiA9IHBfdmVyLT52ZXJzaW9uOwogCi0JZm9yIChpID0gMDsgaSA8IE1DUF9EUlZfVkVSX1NUUl9TSVpFIC0gMTsgaSArPSA0KSB7Ci0JCXZhbCA9IGNwdV90b19iZTMyKHBfdmVyLT5uYW1lW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgKE1DUF9EUlZfVkVSX1NUUl9TSVpFIC0gNCkgLyBzaXplb2YodTMyKTsgaSsrKSB7CisJCXZhbCA9IGNwdV90b19iZTMyKCooKHUzMiAqKSZwX3Zlci0+bmFtZVtpICogc2l6ZW9mKHUzMildKSk7CiAJCSooX19iZTMyICopJnBfZHJ2X3ZlcnNpb24tPm5hbWVbaSAqIHNpemVvZih1MzIpXSA9IHZhbDsKIAl9CiAKQEAgLTExNjgsOCArMTE5NiwzNSBAQAogCXJldHVybiByYzsKIH0KIAotaW50IHFlZF9tY3Bfc2V0X2xlZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkgICAgZW51bSBxZWRfbGVkX21vZGUgbW9kZSkKK2ludCBxZWRfbWNwX2hhbHQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3sKKwl1MzIgcmVzcCA9IDAsIHBhcmFtID0gMDsKKwlpbnQgcmM7CisKKwlyYyA9IHFlZF9tY3BfY21kKHBfaHdmbiwgcF9wdHQsIERSVl9NU0dfQ09ERV9NQ1BfSEFMVCwgMCwgJnJlc3AsCisJCQkgJnBhcmFtKTsKKwlpZiAocmMpCisJCURQX0VSUihwX2h3Zm4sICJNQ1AgcmVzcG9uc2UgZmFpbHVyZSwgYWJvcnRpbmdcbiIpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgcWVkX21jcF9yZXN1bWUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3sKKwl1MzIgdmFsdWUsIGNwdV9tb2RlOworCisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIE1DUF9SRUdfQ1BVX1NUQVRFLCAweGZmZmZmZmZmKTsKKworCXZhbHVlID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsIE1DUF9SRUdfQ1BVX01PREUpOworCXZhbHVlICY9IH5NQ1BfUkVHX0NQVV9NT0RFX1NPRlRfSEFMVDsKKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgTUNQX1JFR19DUFVfTU9ERSwgdmFsdWUpOworCWNwdV9tb2RlID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsIE1DUF9SRUdfQ1BVX01PREUpOworCisJcmV0dXJuIChjcHVfbW9kZSAmIE1DUF9SRUdfQ1BVX01PREVfU09GVF9IQUxUKSA/IC1FQUdBSU4gOiAwOworfQorCitpbnQgcWVkX21jcF9zZXRfbGVkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCBlbnVtIHFlZF9sZWRfbW9kZSBtb2RlKQogewogCXUzMiByZXNwID0gMCwgcGFyYW0gPSAwLCBkcnZfbWJfcGFyYW07CiAJaW50IHJjOwpAQCAtMTE5NSw2ICsxMjUwLDI3IEBACiAJcmV0dXJuIHJjOwogfQogCitpbnQgcWVkX21jcF9tYXNrX3Bhcml0aWVzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiBtYXNrX3Bhcml0aWVzKQoreworCXUzMiByZXNwID0gMCwgcGFyYW0gPSAwOworCWludCByYzsKKworCXJjID0gcWVkX21jcF9jbWQocF9od2ZuLCBwX3B0dCwgRFJWX01TR19DT0RFX01BU0tfUEFSSVRJRVMsCisJCQkgbWFza19wYXJpdGllcywgJnJlc3AsICZwYXJhbSk7CisKKwlpZiAocmMpIHsKKwkJRFBfRVJSKHBfaHdmbiwKKwkJICAgICAgICJNQ1AgcmVzcG9uc2UgZmFpbHVyZSBmb3IgbWFzayBwYXJpdGllcywgYWJvcnRpbmdcbiIpOworCX0gZWxzZSBpZiAocmVzcCAhPSBGV19NU0dfQ09ERV9PSykgeworCQlEUF9FUlIocF9od2ZuLAorCQkgICAgICAgIk1DUCBkaWQgbm90IGFja25vd2xlZGdlIG1hc2sgcGFyaXR5IHJlcXVlc3QuIE9sZCBNRlc/XG4iKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByYzsKK30KKwogaW50IHFlZF9tY3BfYmlzdF9yZWdpc3Rlcl90ZXN0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCiB7CiAJdTMyIGRydl9tYl9wYXJhbSA9IDAsIHJzcCwgcGFyYW07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9tY3AuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX21jcC5oCmluZGV4IDdmMzE5YWEuLmRmZjUyMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX21jcC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX21jcC5oCkBAIC02MCw5ICs2MCwxMCBAQAogI2RlZmluZSBRRURfTElOS19QQVJUTkVSX1NQRUVEXzFHX0ZEICAgIEJJVCgxKQogI2RlZmluZSBRRURfTElOS19QQVJUTkVSX1NQRUVEXzEwRyAgICAgIEJJVCgyKQogI2RlZmluZSBRRURfTElOS19QQVJUTkVSX1NQRUVEXzIwRyAgICAgIEJJVCgzKQotI2RlZmluZSBRRURfTElOS19QQVJUTkVSX1NQRUVEXzQwRyAgICAgIEJJVCg0KQotI2RlZmluZSBRRURfTElOS19QQVJUTkVSX1NQRUVEXzUwRyAgICAgIEJJVCg1KQotI2RlZmluZSBRRURfTElOS19QQVJUTkVSX1NQRUVEXzEwMEcgICAgIEJJVCg2KQorI2RlZmluZSBRRURfTElOS19QQVJUTkVSX1NQRUVEXzI1RyAgICAgIEJJVCg0KQorI2RlZmluZSBRRURfTElOS19QQVJUTkVSX1NQRUVEXzQwRyAgICAgIEJJVCg1KQorI2RlZmluZSBRRURfTElOS19QQVJUTkVSX1NQRUVEXzUwRyAgICAgIEJJVCg2KQorI2RlZmluZSBRRURfTElOS19QQVJUTkVSX1NQRUVEXzEwMEcgICAgIEJJVCg3KQogCXUzMiAgICAgcGFydG5lcl9hZHZfc3BlZWQ7CiAKIAlib29sICAgIHBhcnRuZXJfdHhfZmxvd19jdHJsX2VuOwpAQCAtMTA1LDYgKzEwNiw0NyBAQAogCXU4CW5hbWVbTUNQX0RSVl9WRVJfU1RSX1NJWkUgLSA0XTsKIH07CiAKK3N0cnVjdCBxZWRfbWNwX2xhbl9zdGF0cyB7CisJdTY0IHVjYXN0X3J4X3BrdHM7CisJdTY0IHVjYXN0X3R4X3BrdHM7CisJdTMyIGZjc19lcnI7Cit9OworCitzdHJ1Y3QgcWVkX21jcF9mY29lX3N0YXRzIHsKKwl1NjQgcnhfcGt0czsKKwl1NjQgdHhfcGt0czsKKwl1MzIgZmNzX2VycjsKKwl1MzIgbG9naW5fZmFpbHVyZTsKK307CisKK3N0cnVjdCBxZWRfbWNwX2lzY3NpX3N0YXRzIHsKKwl1NjQgcnhfcGR1czsKKwl1NjQgdHhfcGR1czsKKwl1NjQgcnhfYnl0ZXM7CisJdTY0IHR4X2J5dGVzOworfTsKKworc3RydWN0IHFlZF9tY3BfcmRtYV9zdGF0cyB7CisJdTY0IHJ4X3BrdHM7CisJdTY0IHR4X3BrdHM7CisJdTY0IHJ4X2J5dGVzOworCXU2NCB0eF9ieXRzOworfTsKKworZW51bSBxZWRfbWNwX3Byb3RvY29sX3R5cGUgeworCVFFRF9NQ1BfTEFOX1NUQVRTLAorCVFFRF9NQ1BfRkNPRV9TVEFUUywKKwlRRURfTUNQX0lTQ1NJX1NUQVRTLAorCVFFRF9NQ1BfUkRNQV9TVEFUUworfTsKKwordW5pb24gcWVkX21jcF9wcm90b2NvbF9zdGF0cyB7CisJc3RydWN0IHFlZF9tY3BfbGFuX3N0YXRzIGxhbl9zdGF0czsKKwlzdHJ1Y3QgcWVkX21jcF9mY29lX3N0YXRzIGZjb2Vfc3RhdHM7CisJc3RydWN0IHFlZF9tY3BfaXNjc2lfc3RhdHMgaXNjc2lfc3RhdHM7CisJc3RydWN0IHFlZF9tY3BfcmRtYV9zdGF0cyByZG1hX3N0YXRzOworfTsKKwogLyoqCiAgKiBAYnJpZWYgLSByZXR1cm5zIHRoZSBsaW5rIHBhcmFtcyBvZiB0aGUgaHcgZnVuY3Rpb24KICAqCkBAIC00MjYsNiArNDY4LDI5IEBACiAJCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0KTsKIAogLyoqCisgKiBAYnJpZWYgLSBTZW5kcyBhbiBOVk0gcmVhZCBjb21tYW5kIHJlcXVlc3QgdG8gdGhlIE1GVyB0byBnZXQKKyAqICAgICAgICBhIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gcF9od2ZuCisgKiBAcGFyYW0gcF9wdHQKKyAqIEBwYXJhbSBjbWQgLSBDb21tYW5kOiBEUlZfTVNHX0NPREVfTlZNX0dFVF9GSUxFX0RBVEEgb3IKKyAqICAgICAgICAgICAgRFJWX01TR19DT0RFX05WTV9SRUFEX05WUkFNIGNvbW1hbmRzCisgKiBAcGFyYW0gcGFyYW0gLSBbMDoyM10gLSBPZmZzZXQgWzI0OjMxXSAtIFNpemUKKyAqIEBwYXJhbSBvX21jcF9yZXNwIC0gTUNQIHJlc3BvbnNlCisgKiBAcGFyYW0gb19tY3BfcGFyYW0gLSBNQ1AgcmVzcG9uc2UgcGFyYW0KKyAqIEBwYXJhbSBvX3R4bl9zaXplIC0gIEJ1ZmZlciBzaXplIG91dHB1dAorICogQHBhcmFtIG9fYnVmIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIHJldHVybmVkIGJ5IHRoZSBNRlcuCisgKgorICogQHBhcmFtIHJldHVybiAwIHVwb24gc3VjY2Vzcy4KKyAqLworaW50IHFlZF9tY3BfbnZtX3JkX2NtZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJICAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJICAgICAgIHUzMiBjbWQsCisJCSAgICAgICB1MzIgcGFyYW0sCisJCSAgICAgICB1MzIgKm9fbWNwX3Jlc3AsCisJCSAgICAgICB1MzIgKm9fbWNwX3BhcmFtLCB1MzIgKm9fdHhuX3NpemUsIHUzMiAqb19idWYpOworCisvKioKICAqIEBicmllZiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgTUZXIG9iamVjdHMgW3VuZGVyIG1jcF9pbmZvXSBhcmUgYWNjZXNzaWJsZQogICoKICAqIEBwYXJhbSBwX2h3Zm4KQEAgLTQ0Nyw2ICs1MTIsMjYgQEAKIGludCBxZWRfbWNwX2NvbmZpZ192Zl9tc2l4KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1OCB2Zl9pZCwgdTggbnVtKTsKIAorLyoqCisgKiBAYnJpZWYgLSBIYWx0IHRoZSBNQ1AuCisgKgorICogQHBhcmFtIHBfaHdmbgorICogQHBhcmFtIHBfcHR0CisgKgorICogQHBhcmFtIHJldHVybiAwIHVwb24gc3VjY2Vzcy4KKyAqLworaW50IHFlZF9tY3BfaGFsdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KTsKKworLyoqCisgKiBAYnJpZWYgLSBXYWtlIHVwIHRoZSBNQ1AuCisgKgorICogQHBhcmFtIHBfaHdmbgorICogQHBhcmFtIHBfcHR0CisgKgorICogQHBhcmFtIHJldHVybiAwIHVwb24gc3VjY2Vzcy4KKyAqLworaW50IHFlZF9tY3BfcmVzdW1lKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpOworCiBpbnQgcWVkX2NvbmZpZ3VyZV9wZl9taW5fYmFuZHdpZHRoKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB1OCBtaW5fYncpOwogaW50IHFlZF9jb25maWd1cmVfcGZfbWF4X2JhbmR3aWR0aChzdHJ1Y3QgcWVkX2RldiAqY2RldiwgdTggbWF4X2J3KTsKIGludCBfX3FlZF9jb25maWd1cmVfcGZfbWF4X2JhbmR3aWR0aChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKQEAgLTQ1OCw2ICs1NDMsNyBAQAogCQkJCSAgICAgc3RydWN0IHFlZF9tY3BfbGlua19zdGF0ZSAqcF9saW5rLAogCQkJCSAgICAgdTggbWluX2J3KTsKIAotaW50IHFlZF9od19pbml0X2ZpcnN0X2V0aChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1OCAqcF9wZik7CitpbnQgcWVkX21jcF9tYXNrX3Bhcml0aWVzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiBtYXNrX3Bhcml0aWVzKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9yZWdfYWRkci5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfcmVnX2FkZHIuaAppbmRleCBmNmI4NmNhLi5iNDE0YTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9yZWdfYWRkci5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3JlZ19hZGRyLmgKQEAgLTExNiw4ICsxMTYsMTQgQEAKIAkweDEwMDljNFVMCiAjZGVmaW5lICBRTV9SRUdfUEZfRU4gXAogCTB4MmYyZWE0VUwKKyNkZWZpbmUgVENGQ19SRUdfV0VBS19FTkFCTEVfVkYgXAorCTB4MmQwNzA0VUwKICNkZWZpbmUgIFRDRkNfUkVHX1NUUk9OR19FTkFCTEVfUEYgXAogCTB4MmQwNzA4VUwKKyNkZWZpbmUgIFRDRkNfUkVHX1NUUk9OR19FTkFCTEVfVkYgXAorCTB4MmQwNzBjVUwKKyNkZWZpbmUgQ0NGQ19SRUdfV0VBS19FTkFCTEVfVkYgXAorCTB4MmUwNzA0VUwKICNkZWZpbmUgIENDRkNfUkVHX1NUUk9OR19FTkFCTEVfUEYgXAogCTB4MmUwNzA4VUwKICNkZWZpbmUgIFBHTFVFX0JfUkVHX1BHTF9BRERSXzg4X0YwIFwKQEAgLTIwMiw2ICsyMDgsMjYgQEAKIAkweDUwMTk2Y1VMCiAjZGVmaW5lIE5JR19SRUdfTExIX0NMU19UWVBFX0RVQUxNT0RFIFwKIAkweDUwMTk2NFVMCisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1ZBTFVFIFwKKwkweDUwMWEwMFVMCisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1ZBTFVFX1NJWkUgXAorCTMyCisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0VOIFwKKwkweDUwMWE4MFVMCisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0VOX1NJWkUJXAorCTE2CisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX01PREUgXAorCTB4NTAxYWMwVUwKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfTU9ERV9TSVpFIFwKKwkxNgorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9QUk9UT0NPTF9UWVBFIFwKKwkweDUwMWIwMFVMCisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1BST1RPQ09MX1RZUEVfU0laRSBcCisJMTYKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfSERSX1NFTAlcCisJMHg1MDFiNDBVTAorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9IRFJfU0VMX1NJWkUgXAorCTE2CiAjZGVmaW5lICBOQ1NJX1JFR19DT05GSUcJXAogCTB4MDQwMjAwVUwKICNkZWZpbmUgIFBCRl9SRUdfSU5JVCBcCkBAIC0yNTgsNiArMjg0LDggQEAKIAkweDFmMGExY1VMCiAjZGVmaW5lIFBSU19SRUdfUk9DRV9ERVNUX1FQX01BWF9QRiBcCiAJMHgxZjA0MzBVTAorI2RlZmluZSBQUlNfUkVHX1VTRV9MSUdIVF9MMiBcCisJMHgxZjA5NmNVTAogI2RlZmluZSAgUFNETV9SRUdfRU5BQkxFX0lOMSBcCiAJMHhmYTAwMDRVTAogI2RlZmluZSAgUFNFTV9SRUdfRU5BQkxFX0lOIFwKQEAgLTUyMSw0ICs1NDksOTEwIEBACiAKICNkZWZpbmUgUU1fUkVHX1dGUVBGV0VJR0hUCTB4MmY0ZTgwVUwKICNkZWZpbmUgUU1fUkVHX1dGUVZQV0VJR0hUCTB4MmZhMDAwVUwKKworI2RlZmluZSBQR0xDU19SRUdfREJHX1NFTEVDVCBcCisJMHgwMDFkMTRVTAorI2RlZmluZSBQR0xDU19SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgwMDFkMThVTAorI2RlZmluZSBQR0xDU19SRUdfREJHX1NISUZUIFwKKwkweDAwMWQxY1VMCisjZGVmaW5lIFBHTENTX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4MDAxZDIwVUwKKyNkZWZpbmUgUEdMQ1NfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHgwMDFkMjRVTAorI2RlZmluZSBNSVNDX1JFR19SRVNFVF9QTF9QREFfVk1BSU5fMSBcCisJMHgwMDgwNzBVTAorI2RlZmluZSBNSVNDX1JFR19SRVNFVF9QTF9QREFfVk1BSU5fMiBcCisJMHgwMDgwODBVTAorI2RlZmluZSBNSVNDX1JFR19SRVNFVF9QTF9QREFfVkFVWCBcCisJMHgwMDgwOTBVTAorI2RlZmluZSBNSVNDU19SRUdfUkVTRVRfUExfVUEgXAorCTB4MDA5MDUwVUwKKyNkZWZpbmUgTUlTQ1NfUkVHX1JFU0VUX1BMX0hWIFwKKwkweDAwOTA2MFVMCisjZGVmaW5lIE1JU0NTX1JFR19SRVNFVF9QTF9IVl8yCVwKKwkweDAwOTE1MFVMCisjZGVmaW5lIERNQUVfUkVHX0RCR19TRUxFQ1QgXAorCTB4MDBjNTEwVUwKKyNkZWZpbmUgRE1BRV9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgwMGM1MTRVTAorI2RlZmluZSBETUFFX1JFR19EQkdfU0hJRlQgXAorCTB4MDBjNTE4VUwKKyNkZWZpbmUgRE1BRV9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDAwYzUxY1VMCisjZGVmaW5lIERNQUVfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHgwMGM1MjBVTAorI2RlZmluZSBOQ1NJX1JFR19EQkdfU0VMRUNUIFwKKwkweDA0MDQ3NFVMCisjZGVmaW5lIE5DU0lfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MDQwNDc4VUwKKyNkZWZpbmUgTkNTSV9SRUdfREJHX1NISUZUIFwKKwkweDA0MDQ3Y1VMCisjZGVmaW5lIE5DU0lfUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgwNDA0ODBVTAorI2RlZmluZSBOQ1NJX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MDQwNDg0VUwKKyNkZWZpbmUgR1JDX1JFR19EQkdfU0VMRUNUIFwKKwkweDA1MDBhNFVMCisjZGVmaW5lIEdSQ19SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgwNTAwYThVTAorI2RlZmluZSBHUkNfUkVHX0RCR19TSElGVCBcCisJMHgwNTAwYWNVTAorI2RlZmluZSBHUkNfUkVHX0RCR19GT1JDRV9WQUxJRAlcCisJMHgwNTAwYjBVTAorI2RlZmluZSBHUkNfUkVHX0RCR19GT1JDRV9GUkFNRQlcCisJMHgwNTAwYjRVTAorI2RlZmluZSBVTUFDX1JFR19EQkdfU0VMRUNUIFwKKwkweDA1MTA5NFVMCisjZGVmaW5lIFVNQUNfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MDUxMDk4VUwKKyNkZWZpbmUgVU1BQ19SRUdfREJHX1NISUZUIFwKKwkweDA1MTA5Y1VMCisjZGVmaW5lIFVNQUNfUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgwNTEwYTBVTAorI2RlZmluZSBVTUFDX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MDUxMGE0VUwKKyNkZWZpbmUgTUNQMl9SRUdfREJHX1NFTEVDVCBcCisJMHgwNTI0MDBVTAorI2RlZmluZSBNQ1AyX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDA1MjQwNFVMCisjZGVmaW5lIE1DUDJfUkVHX0RCR19TSElGVCBcCisJMHgwNTI0MDhVTAorI2RlZmluZSBNQ1AyX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4MDUyNDQwVUwKKyNkZWZpbmUgTUNQMl9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDA1MjQ0NFVMCisjZGVmaW5lIFBDSUVfUkVHX0RCR19TRUxFQ1QgXAorCTB4MDU0N2U4VUwKKyNkZWZpbmUgUENJRV9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgwNTQ3ZWNVTAorI2RlZmluZSBQQ0lFX1JFR19EQkdfU0hJRlQgXAorCTB4MDU0N2YwVUwKKyNkZWZpbmUgUENJRV9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDA1NDdmNFVMCisjZGVmaW5lIFBDSUVfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHgwNTQ3ZjhVTAorI2RlZmluZSBET1JRX1JFR19EQkdfU0VMRUNUIFwKKwkweDEwMGFkMFVMCisjZGVmaW5lIERPUlFfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MTAwYWQ0VUwKKyNkZWZpbmUgRE9SUV9SRUdfREJHX1NISUZUIFwKKwkweDEwMGFkOFVMCisjZGVmaW5lIERPUlFfUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgxMDBhZGNVTAorI2RlZmluZSBET1JRX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MTAwYWUwVUwKKyNkZWZpbmUgSUdVX1JFR19EQkdfU0VMRUNUIFwKKwkweDE4MTU3OFVMCisjZGVmaW5lIElHVV9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgxODE1N2NVTAorI2RlZmluZSBJR1VfUkVHX0RCR19TSElGVCBcCisJMHgxODE1ODBVTAorI2RlZmluZSBJR1VfUkVHX0RCR19GT1JDRV9WQUxJRAlcCisJMHgxODE1ODRVTAorI2RlZmluZSBJR1VfUkVHX0RCR19GT1JDRV9GUkFNRQlcCisJMHgxODE1ODhVTAorI2RlZmluZSBDQVVfUkVHX0RCR19TRUxFQ1QgXAorCTB4MWMwZWE4VUwKKyNkZWZpbmUgQ0FVX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDFjMGVhY1VMCisjZGVmaW5lIENBVV9SRUdfREJHX1NISUZUIFwKKwkweDFjMGViMFVMCisjZGVmaW5lIENBVV9SRUdfREJHX0ZPUkNFX1ZBTElECVwKKwkweDFjMGViNFVMCisjZGVmaW5lIENBVV9SRUdfREJHX0ZPUkNFX0ZSQU1FCVwKKwkweDFjMGViOFVMCisjZGVmaW5lIFBSU19SRUdfREJHX1NFTEVDVCBcCisJMHgxZjBiNmNVTAorI2RlZmluZSBQUlNfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MWYwYjcwVUwKKyNkZWZpbmUgUFJTX1JFR19EQkdfU0hJRlQgXAorCTB4MWYwYjc0VUwKKyNkZWZpbmUgUFJTX1JFR19EQkdfRk9SQ0VfVkFMSUQJXAorCTB4MWYwYmEwVUwKKyNkZWZpbmUgUFJTX1JFR19EQkdfRk9SQ0VfRlJBTUUJXAorCTB4MWYwYmE0VUwKKyNkZWZpbmUgQ05JR19SRUdfREJHX1NFTEVDVF9LMiBcCisJMHgyMTgyNTRVTAorI2RlZmluZSBDTklHX1JFR19EQkdfRFdPUkRfRU5BQkxFX0syIFwKKwkweDIxODI1OFVMCisjZGVmaW5lIENOSUdfUkVHX0RCR19TSElGVF9LMiBcCisJMHgyMTgyNWNVTAorI2RlZmluZSBDTklHX1JFR19EQkdfRk9SQ0VfVkFMSURfSzIgXAorCTB4MjE4MjYwVUwKKyNkZWZpbmUgQ05JR19SRUdfREJHX0ZPUkNFX0ZSQU1FX0syIFwKKwkweDIxODI2NFVMCisjZGVmaW5lIFBSTV9SRUdfREJHX1NFTEVDVCBcCisJMHgyMzA2YThVTAorI2RlZmluZSBQUk1fUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MjMwNmFjVUwKKyNkZWZpbmUgUFJNX1JFR19EQkdfU0hJRlQgXAorCTB4MjMwNmIwVUwKKyNkZWZpbmUgUFJNX1JFR19EQkdfRk9SQ0VfVkFMSUQJXAorCTB4MjMwNmI0VUwKKyNkZWZpbmUgUFJNX1JFR19EQkdfRk9SQ0VfRlJBTUUJXAorCTB4MjMwNmI4VUwKKyNkZWZpbmUgU1JDX1JFR19EQkdfU0VMRUNUIFwKKwkweDIzODcwMFVMCisjZGVmaW5lIFNSQ19SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgyMzg3MDRVTAorI2RlZmluZSBTUkNfUkVHX0RCR19TSElGVCBcCisJMHgyMzg3MDhVTAorI2RlZmluZSBTUkNfUkVHX0RCR19GT1JDRV9WQUxJRAlcCisJMHgyMzg3MGNVTAorI2RlZmluZSBTUkNfUkVHX0RCR19GT1JDRV9GUkFNRQlcCisJMHgyMzg3MTBVTAorI2RlZmluZSBSU1NfUkVHX0RCR19TRUxFQ1QgXAorCTB4MjM4YzRjVUwKKyNkZWZpbmUgUlNTX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDIzOGM1MFVMCisjZGVmaW5lIFJTU19SRUdfREJHX1NISUZUIFwKKwkweDIzOGM1NFVMCisjZGVmaW5lIFJTU19SRUdfREJHX0ZPUkNFX1ZBTElECVwKKwkweDIzOGM1OFVMCisjZGVmaW5lIFJTU19SRUdfREJHX0ZPUkNFX0ZSQU1FCVwKKwkweDIzOGM1Y1VMCisjZGVmaW5lIFJQQl9SRUdfREJHX1NFTEVDVCBcCisJMHgyM2M3MjhVTAorI2RlZmluZSBSUEJfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MjNjNzJjVUwKKyNkZWZpbmUgUlBCX1JFR19EQkdfU0hJRlQgXAorCTB4MjNjNzMwVUwKKyNkZWZpbmUgUlBCX1JFR19EQkdfRk9SQ0VfVkFMSUQJXAorCTB4MjNjNzM0VUwKKyNkZWZpbmUgUlBCX1JFR19EQkdfRk9SQ0VfRlJBTUUJXAorCTB4MjNjNzM4VUwKKyNkZWZpbmUgUFNXUlEyX1JFR19EQkdfU0VMRUNUIFwKKwkweDI0MDEwMFVMCisjZGVmaW5lIFBTV1JRMl9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgyNDAxMDRVTAorI2RlZmluZSBQU1dSUTJfUkVHX0RCR19TSElGVCBcCisJMHgyNDAxMDhVTAorI2RlZmluZSBQU1dSUTJfUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgyNDAxMGNVTAorI2RlZmluZSBQU1dSUTJfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHgyNDAxMTBVTAorI2RlZmluZSBQU1dSUV9SRUdfREJHX1NFTEVDVCBcCisJMHgyODAwMjBVTAorI2RlZmluZSBQU1dSUV9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgyODAwMjRVTAorI2RlZmluZSBQU1dSUV9SRUdfREJHX1NISUZUIFwKKwkweDI4MDAyOFVMCisjZGVmaW5lIFBTV1JRX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4MjgwMDJjVUwKKyNkZWZpbmUgUFNXUlFfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHgyODAwMzBVTAorI2RlZmluZSBQU1dXUl9SRUdfREJHX1NFTEVDVCBcCisJMHgyOWEwODRVTAorI2RlZmluZSBQU1dXUl9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgyOWEwODhVTAorI2RlZmluZSBQU1dXUl9SRUdfREJHX1NISUZUIFwKKwkweDI5YTA4Y1VMCisjZGVmaW5lIFBTV1dSX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4MjlhMDkwVUwKKyNkZWZpbmUgUFNXV1JfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHgyOWEwOTRVTAorI2RlZmluZSBQU1dSRF9SRUdfREJHX1NFTEVDVCBcCisJMHgyOWMwNDBVTAorI2RlZmluZSBQU1dSRF9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgyOWMwNDRVTAorI2RlZmluZSBQU1dSRF9SRUdfREJHX1NISUZUIFwKKwkweDI5YzA0OFVMCisjZGVmaW5lIFBTV1JEX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4MjljMDRjVUwKKyNkZWZpbmUgUFNXUkRfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHgyOWMwNTBVTAorI2RlZmluZSBQU1dSRDJfUkVHX0RCR19TRUxFQ1QgXAorCTB4MjlkNDAwVUwKKyNkZWZpbmUgUFNXUkQyX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDI5ZDQwNFVMCisjZGVmaW5lIFBTV1JEMl9SRUdfREJHX1NISUZUIFwKKwkweDI5ZDQwOFVMCisjZGVmaW5lIFBTV1JEMl9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDI5ZDQwY1VMCisjZGVmaW5lIFBTV1JEMl9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDI5ZDQxMFVMCisjZGVmaW5lIFBTV0hTVDJfUkVHX0RCR19TRUxFQ1QgXAorCTB4MjllMDU4VUwKKyNkZWZpbmUgUFNXSFNUMl9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgyOWUwNWNVTAorI2RlZmluZSBQU1dIU1QyX1JFR19EQkdfU0hJRlQgXAorCTB4MjllMDYwVUwKKyNkZWZpbmUgUFNXSFNUMl9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDI5ZTA2NFVMCisjZGVmaW5lIFBTV0hTVDJfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHgyOWUwNjhVTAorI2RlZmluZSBQU1dIU1RfUkVHX0RCR19TRUxFQ1QgXAorCTB4MmEwMTAwVUwKKyNkZWZpbmUgUFNXSFNUX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDJhMDEwNFVMCisjZGVmaW5lIFBTV0hTVF9SRUdfREJHX1NISUZUIFwKKwkweDJhMDEwOFVMCisjZGVmaW5lIFBTV0hTVF9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDJhMDEwY1VMCisjZGVmaW5lIFBTV0hTVF9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDJhMDExMFVMCisjZGVmaW5lIFBHTFVFX0JfUkVHX0RCR19TRUxFQ1QgXAorCTB4MmE4NDAwVUwKKyNkZWZpbmUgUEdMVUVfQl9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgyYTg0MDRVTAorI2RlZmluZSBQR0xVRV9CX1JFR19EQkdfU0hJRlQgXAorCTB4MmE4NDA4VUwKKyNkZWZpbmUgUEdMVUVfQl9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDJhODQwY1VMCisjZGVmaW5lIFBHTFVFX0JfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHgyYTg0MTBVTAorI2RlZmluZSBUTV9SRUdfREJHX1NFTEVDVCBcCisJMHgyYzA3YThVTAorI2RlZmluZSBUTV9SRUdfREJHX0RXT1JEX0VOQUJMRQlcCisJMHgyYzA3YWNVTAorI2RlZmluZSBUTV9SRUdfREJHX1NISUZUIFwKKwkweDJjMDdiMFVMCisjZGVmaW5lIFRNX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4MmMwN2I0VUwKKyNkZWZpbmUgVE1fUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHgyYzA3YjhVTAorI2RlZmluZSBUQ0ZDX1JFR19EQkdfU0VMRUNUIFwKKwkweDJkMDUwMFVMCisjZGVmaW5lIFRDRkNfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MmQwNTA0VUwKKyNkZWZpbmUgVENGQ19SRUdfREJHX1NISUZUIFwKKwkweDJkMDUwOFVMCisjZGVmaW5lIFRDRkNfUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgyZDA1MGNVTAorI2RlZmluZSBUQ0ZDX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MmQwNTEwVUwKKyNkZWZpbmUgQ0NGQ19SRUdfREJHX1NFTEVDVCBcCisJMHgyZTA1MDBVTAorI2RlZmluZSBDQ0ZDX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDJlMDUwNFVMCisjZGVmaW5lIENDRkNfUkVHX0RCR19TSElGVCBcCisJMHgyZTA1MDhVTAorI2RlZmluZSBDQ0ZDX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4MmUwNTBjVUwKKyNkZWZpbmUgQ0NGQ19SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDJlMDUxMFVMCisjZGVmaW5lIFFNX1JFR19EQkdfU0VMRUNUIFwKKwkweDJmMmU3NFVMCisjZGVmaW5lIFFNX1JFR19EQkdfRFdPUkRfRU5BQkxFCVwKKwkweDJmMmU3OFVMCisjZGVmaW5lIFFNX1JFR19EQkdfU0hJRlQgXAorCTB4MmYyZTdjVUwKKyNkZWZpbmUgUU1fUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgyZjJlODBVTAorI2RlZmluZSBRTV9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDJmMmU4NFVMCisjZGVmaW5lIFJESUZfUkVHX0RCR19TRUxFQ1QgXAorCTB4MzAwNTAwVUwKKyNkZWZpbmUgUkRJRl9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgzMDA1MDRVTAorI2RlZmluZSBSRElGX1JFR19EQkdfU0hJRlQgXAorCTB4MzAwNTA4VUwKKyNkZWZpbmUgUkRJRl9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDMwMDUwY1VMCisjZGVmaW5lIFJESUZfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHgzMDA1MTBVTAorI2RlZmluZSBURElGX1JFR19EQkdfU0VMRUNUIFwKKwkweDMxMDUwMFVMCisjZGVmaW5lIFRESUZfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MzEwNTA0VUwKKyNkZWZpbmUgVERJRl9SRUdfREJHX1NISUZUIFwKKwkweDMxMDUwOFVMCisjZGVmaW5lIFRESUZfUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgzMTA1MGNVTAorI2RlZmluZSBURElGX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MzEwNTEwVUwKKyNkZWZpbmUgQlJCX1JFR19EQkdfU0VMRUNUIFwKKwkweDM0MGVkMFVMCisjZGVmaW5lIEJSQl9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgzNDBlZDRVTAorI2RlZmluZSBCUkJfUkVHX0RCR19TSElGVCBcCisJMHgzNDBlZDhVTAorI2RlZmluZSBCUkJfUkVHX0RCR19GT1JDRV9WQUxJRAlcCisJMHgzNDBlZGNVTAorI2RlZmluZSBCUkJfUkVHX0RCR19GT1JDRV9GUkFNRQlcCisJMHgzNDBlZTBVTAorI2RlZmluZSBYWUxEX1JFR19EQkdfU0VMRUNUIFwKKwkweDRjMTYwMFVMCisjZGVmaW5lIFhZTERfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4NGMxNjA0VUwKKyNkZWZpbmUgWFlMRF9SRUdfREJHX1NISUZUIFwKKwkweDRjMTYwOFVMCisjZGVmaW5lIFhZTERfUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHg0YzE2MGNVTAorI2RlZmluZSBYWUxEX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4NGMxNjEwVUwKKyNkZWZpbmUgWVVMRF9SRUdfREJHX1NFTEVDVCBcCisJMHg0Yzk2MDBVTAorI2RlZmluZSBZVUxEX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDRjOTYwNFVMCisjZGVmaW5lIFlVTERfUkVHX0RCR19TSElGVCBcCisJMHg0Yzk2MDhVTAorI2RlZmluZSBZVUxEX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4NGM5NjBjVUwKKyNkZWZpbmUgWVVMRF9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDRjOTYxMFVMCisjZGVmaW5lIFRNTERfUkVHX0RCR19TRUxFQ1QgXAorCTB4NGQxNjAwVUwKKyNkZWZpbmUgVE1MRF9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHg0ZDE2MDRVTAorI2RlZmluZSBUTUxEX1JFR19EQkdfU0hJRlQgXAorCTB4NGQxNjA4VUwKKyNkZWZpbmUgVE1MRF9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDRkMTYwY1VMCisjZGVmaW5lIFRNTERfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHg0ZDE2MTBVTAorI2RlZmluZSBNVUxEX1JFR19EQkdfU0VMRUNUIFwKKwkweDRlMTYwMFVMCisjZGVmaW5lIE1VTERfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4NGUxNjA0VUwKKyNkZWZpbmUgTVVMRF9SRUdfREJHX1NISUZUIFwKKwkweDRlMTYwOFVMCisjZGVmaW5lIE1VTERfUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHg0ZTE2MGNVTAorI2RlZmluZSBNVUxEX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4NGUxNjEwVUwKKyNkZWZpbmUgTklHX1JFR19EQkdfU0VMRUNUIFwKKwkweDUwMjE0MFVMCisjZGVmaW5lIE5JR19SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHg1MDIxNDRVTAorI2RlZmluZSBOSUdfUkVHX0RCR19TSElGVCBcCisJMHg1MDIxNDhVTAorI2RlZmluZSBOSUdfUkVHX0RCR19GT1JDRV9WQUxJRAlcCisJMHg1MDIxNGNVTAorI2RlZmluZSBOSUdfUkVHX0RCR19GT1JDRV9GUkFNRQlcCisJMHg1MDIxNTBVTAorI2RlZmluZSBCTUJfUkVHX0RCR19TRUxFQ1QgXAorCTB4NTQwYTdjVUwKKyNkZWZpbmUgQk1CX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDU0MGE4MFVMCisjZGVmaW5lIEJNQl9SRUdfREJHX1NISUZUIFwKKwkweDU0MGE4NFVMCisjZGVmaW5lIEJNQl9SRUdfREJHX0ZPUkNFX1ZBTElECVwKKwkweDU0MGE4OFVMCisjZGVmaW5lIEJNQl9SRUdfREJHX0ZPUkNFX0ZSQU1FCVwKKwkweDU0MGE4Y1VMCisjZGVmaW5lIFBUVV9SRUdfREJHX1NFTEVDVCBcCisJMHg1NjAxMDBVTAorI2RlZmluZSBQVFVfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4NTYwMTA0VUwKKyNkZWZpbmUgUFRVX1JFR19EQkdfU0hJRlQgXAorCTB4NTYwMTA4VUwKKyNkZWZpbmUgUFRVX1JFR19EQkdfRk9SQ0VfVkFMSUQJXAorCTB4NTYwMTBjVUwKKyNkZWZpbmUgUFRVX1JFR19EQkdfRk9SQ0VfRlJBTUUJXAorCTB4NTYwMTEwVUwKKyNkZWZpbmUgQ0RVX1JFR19EQkdfU0VMRUNUIFwKKwkweDU4MDcwNFVMCisjZGVmaW5lIENEVV9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHg1ODA3MDhVTAorI2RlZmluZSBDRFVfUkVHX0RCR19TSElGVCBcCisJMHg1ODA3MGNVTAorI2RlZmluZSBDRFVfUkVHX0RCR19GT1JDRV9WQUxJRAlcCisJMHg1ODA3MTBVTAorI2RlZmluZSBDRFVfUkVHX0RCR19GT1JDRV9GUkFNRQlcCisJMHg1ODA3MTRVTAorI2RlZmluZSBXT0xfUkVHX0RCR19TRUxFQ1QgXAorCTB4NjAwMTQwVUwKKyNkZWZpbmUgV09MX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDYwMDE0NFVMCisjZGVmaW5lIFdPTF9SRUdfREJHX1NISUZUIFwKKwkweDYwMDE0OFVMCisjZGVmaW5lIFdPTF9SRUdfREJHX0ZPUkNFX1ZBTElECVwKKwkweDYwMDE0Y1VMCisjZGVmaW5lIFdPTF9SRUdfREJHX0ZPUkNFX0ZSQU1FCVwKKwkweDYwMDE1MFVMCisjZGVmaW5lIEJNQk5fUkVHX0RCR19TRUxFQ1QgXAorCTB4NjEwMTQwVUwKKyNkZWZpbmUgQk1CTl9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHg2MTAxNDRVTAorI2RlZmluZSBCTUJOX1JFR19EQkdfU0hJRlQgXAorCTB4NjEwMTQ4VUwKKyNkZWZpbmUgQk1CTl9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDYxMDE0Y1VMCisjZGVmaW5lIEJNQk5fUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHg2MTAxNTBVTAorI2RlZmluZSBOV01fUkVHX0RCR19TRUxFQ1QgXAorCTB4ODAwMGVjVUwKKyNkZWZpbmUgTldNX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDgwMDBmMFVMCisjZGVmaW5lIE5XTV9SRUdfREJHX1NISUZUIFwKKwkweDgwMDBmNFVMCisjZGVmaW5lIE5XTV9SRUdfREJHX0ZPUkNFX1ZBTElECVwKKwkweDgwMDBmOFVMCisjZGVmaW5lIE5XTV9SRUdfREJHX0ZPUkNFX0ZSQU1FCVwKKwkweDgwMDBmY1VMCisjZGVmaW5lIFBCRl9SRUdfREJHX1NFTEVDVCBcCisJMHhkODAwNjBVTAorI2RlZmluZSBQQkZfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4ZDgwMDY0VUwKKyNkZWZpbmUgUEJGX1JFR19EQkdfU0hJRlQgXAorCTB4ZDgwMDY4VUwKKyNkZWZpbmUgUEJGX1JFR19EQkdfRk9SQ0VfVkFMSUQJXAorCTB4ZDgwMDZjVUwKKyNkZWZpbmUgUEJGX1JFR19EQkdfRk9SQ0VfRlJBTUUJXAorCTB4ZDgwMDcwVUwKKyNkZWZpbmUgUEJGX1BCMV9SRUdfREJHX1NFTEVDVCBcCisJMHhkYTA3MjhVTAorI2RlZmluZSBQQkZfUEIxX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweGRhMDcyY1VMCisjZGVmaW5lIFBCRl9QQjFfUkVHX0RCR19TSElGVCBcCisJMHhkYTA3MzBVTAorI2RlZmluZSBQQkZfUEIxX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4ZGEwNzM0VUwKKyNkZWZpbmUgUEJGX1BCMV9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweGRhMDczOFVMCisjZGVmaW5lIFBCRl9QQjJfUkVHX0RCR19TRUxFQ1QgXAorCTB4ZGE0NzI4VUwKKyNkZWZpbmUgUEJGX1BCMl9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHhkYTQ3MmNVTAorI2RlZmluZSBQQkZfUEIyX1JFR19EQkdfU0hJRlQgXAorCTB4ZGE0NzMwVUwKKyNkZWZpbmUgUEJGX1BCMl9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweGRhNDczNFVMCisjZGVmaW5lIFBCRl9QQjJfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHhkYTQ3MzhVTAorI2RlZmluZSBCVEJfUkVHX0RCR19TRUxFQ1QgXAorCTB4ZGIwOGM4VUwKKyNkZWZpbmUgQlRCX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweGRiMDhjY1VMCisjZGVmaW5lIEJUQl9SRUdfREJHX1NISUZUIFwKKwkweGRiMDhkMFVMCisjZGVmaW5lIEJUQl9SRUdfREJHX0ZPUkNFX1ZBTElECVwKKwkweGRiMDhkNFVMCisjZGVmaW5lIEJUQl9SRUdfREJHX0ZPUkNFX0ZSQU1FCVwKKwkweGRiMDhkOFVMCisjZGVmaW5lIFhTRE1fUkVHX0RCR19TRUxFQ1QgXAorCTB4ZjgwZTI4VUwKKyNkZWZpbmUgWFNETV9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHhmODBlMmNVTAorI2RlZmluZSBYU0RNX1JFR19EQkdfU0hJRlQgXAorCTB4ZjgwZTMwVUwKKyNkZWZpbmUgWFNETV9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweGY4MGUzNFVMCisjZGVmaW5lIFhTRE1fUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHhmODBlMzhVTAorI2RlZmluZSBZU0RNX1JFR19EQkdfU0VMRUNUIFwKKwkweGY5MGUyOFVMCisjZGVmaW5lIFlTRE1fUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4ZjkwZTJjVUwKKyNkZWZpbmUgWVNETV9SRUdfREJHX1NISUZUIFwKKwkweGY5MGUzMFVMCisjZGVmaW5lIFlTRE1fUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHhmOTBlMzRVTAorI2RlZmluZSBZU0RNX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4ZjkwZTM4VUwKKyNkZWZpbmUgUFNETV9SRUdfREJHX1NFTEVDVCBcCisJMHhmYTBlMjhVTAorI2RlZmluZSBQU0RNX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweGZhMGUyY1VMCisjZGVmaW5lIFBTRE1fUkVHX0RCR19TSElGVCBcCisJMHhmYTBlMzBVTAorI2RlZmluZSBQU0RNX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4ZmEwZTM0VUwKKyNkZWZpbmUgUFNETV9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweGZhMGUzOFVMCisjZGVmaW5lIFRTRE1fUkVHX0RCR19TRUxFQ1QgXAorCTB4ZmIwZTI4VUwKKyNkZWZpbmUgVFNETV9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHhmYjBlMmNVTAorI2RlZmluZSBUU0RNX1JFR19EQkdfU0hJRlQgXAorCTB4ZmIwZTMwVUwKKyNkZWZpbmUgVFNETV9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweGZiMGUzNFVMCisjZGVmaW5lIFRTRE1fUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHhmYjBlMzhVTAorI2RlZmluZSBNU0RNX1JFR19EQkdfU0VMRUNUIFwKKwkweGZjMGUyOFVMCisjZGVmaW5lIE1TRE1fUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4ZmMwZTJjVUwKKyNkZWZpbmUgTVNETV9SRUdfREJHX1NISUZUIFwKKwkweGZjMGUzMFVMCisjZGVmaW5lIE1TRE1fUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHhmYzBlMzRVTAorI2RlZmluZSBNU0RNX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4ZmMwZTM4VUwKKyNkZWZpbmUgVVNETV9SRUdfREJHX1NFTEVDVCBcCisJMHhmZDBlMjhVTAorI2RlZmluZSBVU0RNX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweGZkMGUyY1VMCisjZGVmaW5lIFVTRE1fUkVHX0RCR19TSElGVCBcCisJMHhmZDBlMzBVTAorI2RlZmluZSBVU0RNX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4ZmQwZTM0VUwKKyNkZWZpbmUgVVNETV9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweGZkMGUzOFVMCisjZGVmaW5lIFhDTV9SRUdfREJHX1NFTEVDVCBcCisJMHgxMDAwMDQwVUwKKyNkZWZpbmUgWENNX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDEwMDAwNDRVTAorI2RlZmluZSBYQ01fUkVHX0RCR19TSElGVCBcCisJMHgxMDAwMDQ4VUwKKyNkZWZpbmUgWENNX1JFR19EQkdfRk9SQ0VfVkFMSUQJXAorCTB4MTAwMDA0Y1VMCisjZGVmaW5lIFhDTV9SRUdfREJHX0ZPUkNFX0ZSQU1FCVwKKwkweDEwMDAwNTBVTAorI2RlZmluZSBZQ01fUkVHX0RCR19TRUxFQ1QgXAorCTB4MTA4MDA0MFVMCisjZGVmaW5lIFlDTV9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgxMDgwMDQ0VUwKKyNkZWZpbmUgWUNNX1JFR19EQkdfU0hJRlQgXAorCTB4MTA4MDA0OFVMCisjZGVmaW5lIFlDTV9SRUdfREJHX0ZPUkNFX1ZBTElECVwKKwkweDEwODAwNGNVTAorI2RlZmluZSBZQ01fUkVHX0RCR19GT1JDRV9GUkFNRQlcCisJMHgxMDgwMDUwVUwKKyNkZWZpbmUgUENNX1JFR19EQkdfU0VMRUNUIFwKKwkweDExMDAwNDBVTAorI2RlZmluZSBQQ01fUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MTEwMDA0NFVMCisjZGVmaW5lIFBDTV9SRUdfREJHX1NISUZUIFwKKwkweDExMDAwNDhVTAorI2RlZmluZSBQQ01fUkVHX0RCR19GT1JDRV9WQUxJRAlcCisJMHgxMTAwMDRjVUwKKyNkZWZpbmUgUENNX1JFR19EQkdfRk9SQ0VfRlJBTUUJXAorCTB4MTEwMDA1MFVMCisjZGVmaW5lIFRDTV9SRUdfREJHX1NFTEVDVCBcCisJMHgxMTgwMDQwVUwKKyNkZWZpbmUgVENNX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDExODAwNDRVTAorI2RlZmluZSBUQ01fUkVHX0RCR19TSElGVCBcCisJMHgxMTgwMDQ4VUwKKyNkZWZpbmUgVENNX1JFR19EQkdfRk9SQ0VfVkFMSUQJXAorCTB4MTE4MDA0Y1VMCisjZGVmaW5lIFRDTV9SRUdfREJHX0ZPUkNFX0ZSQU1FCVwKKwkweDExODAwNTBVTAorI2RlZmluZSBNQ01fUkVHX0RCR19TRUxFQ1QgXAorCTB4MTIwMDA0MFVMCisjZGVmaW5lIE1DTV9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgxMjAwMDQ0VUwKKyNkZWZpbmUgTUNNX1JFR19EQkdfU0hJRlQgXAorCTB4MTIwMDA0OFVMCisjZGVmaW5lIE1DTV9SRUdfREJHX0ZPUkNFX1ZBTElECVwKKwkweDEyMDAwNGNVTAorI2RlZmluZSBNQ01fUkVHX0RCR19GT1JDRV9GUkFNRQlcCisJMHgxMjAwMDUwVUwKKyNkZWZpbmUgVUNNX1JFR19EQkdfU0VMRUNUIFwKKwkweDEyODAwNTBVTAorI2RlZmluZSBVQ01fUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MTI4MDA1NFVMCisjZGVmaW5lIFVDTV9SRUdfREJHX1NISUZUIFwKKwkweDEyODAwNThVTAorI2RlZmluZSBVQ01fUkVHX0RCR19GT1JDRV9WQUxJRAlcCisJMHgxMjgwMDVjVUwKKyNkZWZpbmUgVUNNX1JFR19EQkdfRk9SQ0VfRlJBTUUJXAorCTB4MTI4MDA2MFVMCisjZGVmaW5lIFhTRU1fUkVHX0RCR19TRUxFQ1QgXAorCTB4MTQwMTUyOFVMCisjZGVmaW5lIFhTRU1fUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MTQwMTUyY1VMCisjZGVmaW5lIFhTRU1fUkVHX0RCR19TSElGVCBcCisJMHgxNDAxNTMwVUwKKyNkZWZpbmUgWFNFTV9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDE0MDE1MzRVTAorI2RlZmluZSBYU0VNX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MTQwMTUzOFVMCisjZGVmaW5lIFlTRU1fUkVHX0RCR19TRUxFQ1QgXAorCTB4MTUwMTUyOFVMCisjZGVmaW5lIFlTRU1fUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MTUwMTUyY1VMCisjZGVmaW5lIFlTRU1fUkVHX0RCR19TSElGVCBcCisJMHgxNTAxNTMwVUwKKyNkZWZpbmUgWVNFTV9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDE1MDE1MzRVTAorI2RlZmluZSBZU0VNX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MTUwMTUzOFVMCisjZGVmaW5lIFBTRU1fUkVHX0RCR19TRUxFQ1QgXAorCTB4MTYwMTUyOFVMCisjZGVmaW5lIFBTRU1fUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MTYwMTUyY1VMCisjZGVmaW5lIFBTRU1fUkVHX0RCR19TSElGVCBcCisJMHgxNjAxNTMwVUwKKyNkZWZpbmUgUFNFTV9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDE2MDE1MzRVTAorI2RlZmluZSBQU0VNX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MTYwMTUzOFVMCisjZGVmaW5lIFRTRU1fUkVHX0RCR19TRUxFQ1QgXAorCTB4MTcwMTUyOFVMCisjZGVmaW5lIFRTRU1fUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MTcwMTUyY1VMCisjZGVmaW5lIFRTRU1fUkVHX0RCR19TSElGVCBcCisJMHgxNzAxNTMwVUwKKyNkZWZpbmUgVFNFTV9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDE3MDE1MzRVTAorI2RlZmluZSBUU0VNX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MTcwMTUzOFVMCisjZGVmaW5lIE1TRU1fUkVHX0RCR19TRUxFQ1QgXAorCTB4MTgwMTUyOFVMCisjZGVmaW5lIE1TRU1fUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MTgwMTUyY1VMCisjZGVmaW5lIE1TRU1fUkVHX0RCR19TSElGVCBcCisJMHgxODAxNTMwVUwKKyNkZWZpbmUgTVNFTV9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDE4MDE1MzRVTAorI2RlZmluZSBNU0VNX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MTgwMTUzOFVMCisjZGVmaW5lIFVTRU1fUkVHX0RCR19TRUxFQ1QgXAorCTB4MTkwMTUyOFVMCisjZGVmaW5lIFVTRU1fUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MTkwMTUyY1VMCisjZGVmaW5lIFVTRU1fUkVHX0RCR19TSElGVCBcCisJMHgxOTAxNTMwVUwKKyNkZWZpbmUgVVNFTV9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDE5MDE1MzRVTAorI2RlZmluZSBVU0VNX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MTkwMTUzOFVMCisjZGVmaW5lIFBDSUVfUkVHX0RCR19DT01NT05fU0VMRUNUIFwKKwkweDA1NDM5OFVMCisjZGVmaW5lIFBDSUVfUkVHX0RCR19DT01NT05fRFdPUkRfRU5BQkxFIFwKKwkweDA1NDM5Y1VMCisjZGVmaW5lIFBDSUVfUkVHX0RCR19DT01NT05fU0hJRlQgXAorCTB4MDU0M2EwVUwKKyNkZWZpbmUgUENJRV9SRUdfREJHX0NPTU1PTl9GT1JDRV9WQUxJRAlcCisJMHgwNTQzYTRVTAorI2RlZmluZSBQQ0lFX1JFR19EQkdfQ09NTU9OX0ZPUkNFX0ZSQU1FCVwKKwkweDA1NDNhOFVMCisjZGVmaW5lIE1JU0NfUkVHX1JFU0VUX1BMX1VBIFwKKwkweDAwODA1MFVMCisjZGVmaW5lIE1JU0NfUkVHX1JFU0VUX1BMX0hWIFwKKwkweDAwODA2MFVMCisjZGVmaW5lIFhDTV9SRUdfQ1RYX1JCQ19BQ0NTIFwKKwkweDEwMDE4MDBVTAorI2RlZmluZSBYQ01fUkVHX0FHR19DT05fQ1RYIFwKKwkweDEwMDE4MDRVTAorI2RlZmluZSBYQ01fUkVHX1NNX0NPTl9DVFggXAorCTB4MTAwMTgwOFVMCisjZGVmaW5lIFlDTV9SRUdfQ1RYX1JCQ19BQ0NTIFwKKwkweDEwODE4MDBVTAorI2RlZmluZSBZQ01fUkVHX0FHR19DT05fQ1RYIFwKKwkweDEwODE4MDRVTAorI2RlZmluZSBZQ01fUkVHX0FHR19UQVNLX0NUWCBcCisJMHgxMDgxODA4VUwKKyNkZWZpbmUgWUNNX1JFR19TTV9DT05fQ1RYIFwKKwkweDEwODE4MGNVTAorI2RlZmluZSBZQ01fUkVHX1NNX1RBU0tfQ1RYIFwKKwkweDEwODE4MTBVTAorI2RlZmluZSBQQ01fUkVHX0NUWF9SQkNfQUNDUyBcCisJMHgxMTAxNDQwVUwKKyNkZWZpbmUgUENNX1JFR19TTV9DT05fQ1RYIFwKKwkweDExMDE0NDRVTAorI2RlZmluZSBUQ01fUkVHX0NUWF9SQkNfQUNDUyBcCisJMHgxMTgxNGMwVUwKKyNkZWZpbmUgVENNX1JFR19BR0dfQ09OX0NUWCBcCisJMHgxMTgxNGM0VUwKKyNkZWZpbmUgVENNX1JFR19BR0dfVEFTS19DVFggXAorCTB4MTE4MTRjOFVMCisjZGVmaW5lIFRDTV9SRUdfU01fQ09OX0NUWCBcCisJMHgxMTgxNGNjVUwKKyNkZWZpbmUgVENNX1JFR19TTV9UQVNLX0NUWCBcCisJMHgxMTgxNGQwVUwKKyNkZWZpbmUgTUNNX1JFR19DVFhfUkJDX0FDQ1MgXAorCTB4MTIwMTgwMFVMCisjZGVmaW5lIE1DTV9SRUdfQUdHX0NPTl9DVFggXAorCTB4MTIwMTgwNFVMCisjZGVmaW5lIE1DTV9SRUdfQUdHX1RBU0tfQ1RYIFwKKwkweDEyMDE4MDhVTAorI2RlZmluZSBNQ01fUkVHX1NNX0NPTl9DVFggXAorCTB4MTIwMTgwY1VMCisjZGVmaW5lIE1DTV9SRUdfU01fVEFTS19DVFggXAorCTB4MTIwMTgxMFVMCisjZGVmaW5lIFVDTV9SRUdfQ1RYX1JCQ19BQ0NTIFwKKwkweDEyODE3MDBVTAorI2RlZmluZSBVQ01fUkVHX0FHR19DT05fQ1RYIFwKKwkweDEyODE3MDRVTAorI2RlZmluZSBVQ01fUkVHX0FHR19UQVNLX0NUWCBcCisJMHgxMjgxNzA4VUwKKyNkZWZpbmUgVUNNX1JFR19TTV9DT05fQ1RYIFwKKwkweDEyODE3MGNVTAorI2RlZmluZSBVQ01fUkVHX1NNX1RBU0tfQ1RYIFwKKwkweDEyODE3MTBVTAorI2RlZmluZSBYU0VNX1JFR19TTE9XX0RCR19FTVBUWQlcCisJMHgxNDAxMTQwVUwKKyNkZWZpbmUgWFNFTV9SRUdfU1lOQ19EQkdfRU1QVFkJXAorCTB4MTQwMTE2MFVMCisjZGVmaW5lIFhTRU1fUkVHX1NMT1dfREJHX0FDVElWRSBcCisJMHgxNDAxNDAwVUwKKyNkZWZpbmUgWFNFTV9SRUdfU0xPV19EQkdfTU9ERSBcCisJMHgxNDAxNDA0VUwKKyNkZWZpbmUgWFNFTV9SRUdfREJHX0ZSQU1FX01PREUJXAorCTB4MTQwMTQwOFVMCisjZGVmaW5lIFhTRU1fUkVHX0RCR19NT0RFMV9DRkcgXAorCTB4MTQwMTQyMFVMCisjZGVmaW5lIFhTRU1fUkVHX0ZBU1RfTUVNT1JZIFwKKwkweDE0NDAwMDBVTAorI2RlZmluZSBZU0VNX1JFR19TWU5DX0RCR19FTVBUWQlcCisJMHgxNTAxMTYwVUwKKyNkZWZpbmUgWVNFTV9SRUdfU0xPV19EQkdfQUNUSVZFIFwKKwkweDE1MDE0MDBVTAorI2RlZmluZSBZU0VNX1JFR19TTE9XX0RCR19NT0RFIFwKKwkweDE1MDE0MDRVTAorI2RlZmluZSBZU0VNX1JFR19EQkdfRlJBTUVfTU9ERQlcCisJMHgxNTAxNDA4VUwKKyNkZWZpbmUgWVNFTV9SRUdfREJHX01PREUxX0NGRyBcCisJMHgxNTAxNDIwVUwKKyNkZWZpbmUgWVNFTV9SRUdfRkFTVF9NRU1PUlkgXAorCTB4MTU0MDAwMFVMCisjZGVmaW5lIFBTRU1fUkVHX1NMT1dfREJHX0VNUFRZCVwKKwkweDE2MDExNDBVTAorI2RlZmluZSBQU0VNX1JFR19TWU5DX0RCR19FTVBUWQlcCisJMHgxNjAxMTYwVUwKKyNkZWZpbmUgUFNFTV9SRUdfU0xPV19EQkdfQUNUSVZFIFwKKwkweDE2MDE0MDBVTAorI2RlZmluZSBQU0VNX1JFR19TTE9XX0RCR19NT0RFIFwKKwkweDE2MDE0MDRVTAorI2RlZmluZSBQU0VNX1JFR19EQkdfRlJBTUVfTU9ERQlcCisJMHgxNjAxNDA4VUwKKyNkZWZpbmUgUFNFTV9SRUdfREJHX01PREUxX0NGRyBcCisJMHgxNjAxNDIwVUwKKyNkZWZpbmUgUFNFTV9SRUdfRkFTVF9NRU1PUlkgXAorCTB4MTY0MDAwMFVMCisjZGVmaW5lIFRTRU1fUkVHX1NMT1dfREJHX0VNUFRZCVwKKwkweDE3MDExNDBVTAorI2RlZmluZSBUU0VNX1JFR19TWU5DX0RCR19FTVBUWQlcCisJMHgxNzAxMTYwVUwKKyNkZWZpbmUgVFNFTV9SRUdfU0xPV19EQkdfQUNUSVZFIFwKKwkweDE3MDE0MDBVTAorI2RlZmluZSBUU0VNX1JFR19TTE9XX0RCR19NT0RFIFwKKwkweDE3MDE0MDRVTAorI2RlZmluZSBUU0VNX1JFR19EQkdfRlJBTUVfTU9ERQlcCisJMHgxNzAxNDA4VUwKKyNkZWZpbmUgVFNFTV9SRUdfREJHX01PREUxX0NGRyBcCisJMHgxNzAxNDIwVUwKKyNkZWZpbmUgVFNFTV9SRUdfRkFTVF9NRU1PUlkgXAorCTB4MTc0MDAwMFVMCisjZGVmaW5lIE1TRU1fUkVHX1NMT1dfREJHX0VNUFRZCVwKKwkweDE4MDExNDBVTAorI2RlZmluZSBNU0VNX1JFR19TWU5DX0RCR19FTVBUWQlcCisJMHgxODAxMTYwVUwKKyNkZWZpbmUgTVNFTV9SRUdfU0xPV19EQkdfQUNUSVZFIFwKKwkweDE4MDE0MDBVTAorI2RlZmluZSBNU0VNX1JFR19TTE9XX0RCR19NT0RFIFwKKwkweDE4MDE0MDRVTAorI2RlZmluZSBNU0VNX1JFR19EQkdfRlJBTUVfTU9ERQlcCisJMHgxODAxNDA4VUwKKyNkZWZpbmUgTVNFTV9SRUdfREJHX01PREUxX0NGRyBcCisJMHgxODAxNDIwVUwKKyNkZWZpbmUgTVNFTV9SRUdfRkFTVF9NRU1PUlkgXAorCTB4MTg0MDAwMFVMCisjZGVmaW5lIFVTRU1fUkVHX1NMT1dfREJHX0VNUFRZCVwKKwkweDE5MDExNDBVTAorI2RlZmluZSBVU0VNX1JFR19TWU5DX0RCR19FTVBUWQlcCisJMHgxOTAxMTYwVUwKKyNkZWZpbmUgVVNFTV9SRUdfU0xPV19EQkdfQUNUSVZFIFwKKwkweDE5MDE0MDBVTAorI2RlZmluZSBVU0VNX1JFR19TTE9XX0RCR19NT0RFIFwKKwkweDE5MDE0MDRVTAorI2RlZmluZSBVU0VNX1JFR19EQkdfRlJBTUVfTU9ERQlcCisJMHgxOTAxNDA4VUwKKyNkZWZpbmUgVVNFTV9SRUdfREJHX01PREUxX0NGRyBcCisJMHgxOTAxNDIwVUwKKyNkZWZpbmUgVVNFTV9SRUdfRkFTVF9NRU1PUlkgXAorCTB4MTk0MDAwMFVMCisjZGVmaW5lIFNFTV9GQVNUX1JFR19JTlRfUkFNIFwKKwkweDAyMDAwMFVMCisjZGVmaW5lIFNFTV9GQVNUX1JFR19JTlRfUkFNX1NJWkUgXAorCTIwNDgwCisjZGVmaW5lIEdSQ19SRUdfVFJBQ0VfRklGT19WQUxJRF9EQVRBIFwKKwkweDA1MDA2NFVMCisjZGVmaW5lIEdSQ19SRUdfTlVNQkVSX1ZBTElEX09WRVJSSURFX1dJTkRPVyBcCisJMHgwNTA0MGNVTAorI2RlZmluZSBHUkNfUkVHX1BST1RFQ1RJT05fT1ZFUlJJREVfV0lORE9XIFwKKwkweDA1MDUwMFVMCisjZGVmaW5lIElHVV9SRUdfRVJST1JfSEFORExJTkdfTUVNT1JZIFwKKwkweDE4MTUyMFVMCisjZGVmaW5lIE1DUF9SRUdfQ1BVX01PREUgXAorCTB4ZTA1MDAwVUwKKyNkZWZpbmUgTUNQX1JFR19DUFVfTU9ERV9TT0ZUX0hBTFQgXAorCQkoMHgxIDw8IDEwKQorI2RlZmluZSBCUkJfUkVHX0JJR19SQU1fQUREUkVTUyBcCisJMHgzNDA4MDBVTAorI2RlZmluZSBCUkJfUkVHX0JJR19SQU1fREFUQSBcCisJMHgzNDE1MDBVTAorI2RlZmluZSBTRU1fRkFTVF9SRUdfU1RBTExfMCBcCisJMHgwMDA0ODhVTAorI2RlZmluZSBTRU1fRkFTVF9SRUdfU1RBTExFRCBcCisJMHgwMDA0OTRVTAorI2RlZmluZSBCVEJfUkVHX0JJR19SQU1fQUREUkVTUyBcCisJMHhkYjA4MDBVTAorI2RlZmluZSBCVEJfUkVHX0JJR19SQU1fREFUQSBcCisJMHhkYjBjMDBVTAorI2RlZmluZSBCTUJfUkVHX0JJR19SQU1fQUREUkVTUyBcCisJMHg1NDA4MDBVTAorI2RlZmluZSBCTUJfUkVHX0JJR19SQU1fREFUQSBcCisJMHg1NDBmMDBVTAorI2RlZmluZSBTRU1fRkFTVF9SRUdfU1RPUk1fUkVHX0ZJTEUgXAorCTB4MDA4MDAwVUwKKyNkZWZpbmUgUlNTX1JFR19SU1NfUkFNX0FERFIgXAorCTB4MjM4YzMwVUwKKyNkZWZpbmUgTUlTQ1NfUkVHX0JMT0NLXzI1NkJfRU4gXAorCTB4MDA5MDc0VUwKKyNkZWZpbmUgTUNQX1JFR19TQ1JBVENIX1NJWkUgXAorCTU3MzQ0CisjZGVmaW5lIE1DUF9SRUdfQ1BVX1JFR19GSUxFIFwKKwkweGUwNTIwMFVMCisjZGVmaW5lIE1DUF9SRUdfQ1BVX1JFR19GSUxFX1NJWkUgXAorCTMyCisjZGVmaW5lIERCR19SRUdfREVCVUdfVEFSR0VUIFwKKwkweDAxMDA1Y1VMCisjZGVmaW5lIERCR19SRUdfRlVMTF9NT0RFIFwKKwkweDAxMDA2MFVMCisjZGVmaW5lIERCR19SRUdfQ0FMRU5EQVJfT1VUX0RBVEEgXAorCTB4MDEwNDgwVUwKKyNkZWZpbmUgR1JDX1JFR19UUkFDRV9GSUZPIFwKKwkweDA1MDA2OFVMCisjZGVmaW5lIElHVV9SRUdfRVJST1JfSEFORExJTkdfREFUQV9WQUxJRCBcCisJMHgxODE1MzBVTAorI2RlZmluZSBEQkdfUkVHX0RCR19CTE9DS19PTiBcCisJMHgwMTA0NTRVTAorI2RlZmluZSBEQkdfUkVHX0ZSQU1JTkdfTU9ERSBcCisJMHgwMTAwNThVTAorI2RlZmluZSBTRU1fRkFTVF9SRUdfVkZDX0RBVEFfV1IgXAorCTB4MDAwYjQwVUwKKyNkZWZpbmUgU0VNX0ZBU1RfUkVHX1ZGQ19BRERSIFwKKwkweDAwMGI0NFVMCisjZGVmaW5lIFNFTV9GQVNUX1JFR19WRkNfREFUQV9SRCBcCisJMHgwMDBiNDhVTAorI2RlZmluZSBSU1NfUkVHX1JTU19SQU1fREFUQSBcCisJMHgyMzhjMjBVTAorI2RlZmluZSBNSVNDX1JFR19CTE9DS18yNTZCX0VOIFwKKwkweDAwOGMxNFVMCisjZGVmaW5lIE5XU19SRUdfTldTX0NNVQlcCisJMHg3MjAwMDBVTAorI2RlZmluZSBQSFlfTldfSVBfUkVHX1BIWTBfVE9QX1RCVVNfQUREUl83XzAgXAorCTB4MDAwNjgwVUwKKyNkZWZpbmUgUEhZX05XX0lQX1JFR19QSFkwX1RPUF9UQlVTX0FERFJfMTVfOCBcCisJMHgwMDA2ODRVTAorI2RlZmluZSBQSFlfTldfSVBfUkVHX1BIWTBfVE9QX1RCVVNfREFUQV83XzAgXAorCTB4MDAwNmMwVUwKKyNkZWZpbmUgUEhZX05XX0lQX1JFR19QSFkwX1RPUF9UQlVTX0RBVEFfMTFfOCBcCisJMHgwMDA2YzRVTAorI2RlZmluZSBNU19SRUdfTVNfQ01VIFwKKwkweDZhNDAwMFVMCisjZGVmaW5lIFBIWV9TR01JSV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMwIFwKKwkweDAwMDIwOFVMCisjZGVmaW5lIFBIWV9TR01JSV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMyIFwKKwkweDAwMDIxMFVMCisjZGVmaW5lIFBIWV9TR01JSV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMxIFwKKwkweDAwMDIwY1VMCisjZGVmaW5lIFBIWV9TR01JSV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMzIFwKKwkweDAwMDIxNFVMCisjZGVmaW5lIFBIWV9QQ0lFX0lQX1JFR19BSEJfQ01VX0NTUl8wX1gxMzAgXAorCTB4MDAwMjA4VUwKKyNkZWZpbmUgUEhZX1BDSUVfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMSBcCisJMHgwMDAyMGNVTAorI2RlZmluZSBQSFlfUENJRV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMyIFwKKwkweDAwMDIxMFVMCisjZGVmaW5lIFBIWV9QQ0lFX0lQX1JFR19BSEJfQ01VX0NTUl8wX1gxMzMgXAorCTB4MDAwMjE0VUwKKyNkZWZpbmUgUEhZX1BDSUVfUkVHX1BIWTAgXAorCTB4NjIwMDAwVUwKKyNkZWZpbmUgUEhZX1BDSUVfUkVHX1BIWTEgXAorCTB4NjI0MDAwVUwKKyNkZWZpbmUgTklHX1JFR19ST0NFX0RVUExJQ0FURV9UT19IT1NUIDB4NTA4OGYwVUwKKyNkZWZpbmUgUFJTX1JFR19MSUdIVF9MMl9FVEhFUlRZUEVfRU4gMHgxZjA5NjhVTAorI2RlZmluZSBOSUdfUkVHX0xMSF9FTkdfQ0xTX0VOR19JRF9UQkwgMHg1MDFiOTBVTAorI2RlZmluZSBET1JRX1JFR19QRl9EUE1fRU5BQkxFIDB4MTAwNTEwVUwKKyNkZWZpbmUgRE9SUV9SRUdfUEZfSUNJRF9CSVRfU0hJRlRfTk9STQkweDEwMDQ0OFVMCisjZGVmaW5lIERPUlFfUkVHX1BGX01JTl9BRERSX1JFRzEgMHgxMDA0MDBVTAorI2RlZmluZSBET1JRX1JFR19QRl9EUElfQklUX1NISUZUIDB4MTAwNDUwVUwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfcm9jZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfcm9jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNDMwMDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9yb2NlLmMKQEAgLTAsMCArMSwyOTU0IEBACisvKiBRTG9naWMgcWVkIE5JQyBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2ICBRTG9naWMgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9xZWQvcWVkX3JvY2VfaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9xZWQvcWVkX3JvY2VfaWYuaD4KKyNpbmNsdWRlICJxZWQuaCIKKyNpbmNsdWRlICJxZWRfY3h0LmgiCisjaW5jbHVkZSAicWVkX2hzaS5oIgorI2luY2x1ZGUgInFlZF9ody5oIgorI2luY2x1ZGUgInFlZF9pbml0X29wcy5oIgorI2luY2x1ZGUgInFlZF9pbnQuaCIKKyNpbmNsdWRlICJxZWRfbGwyLmgiCisjaW5jbHVkZSAicWVkX21jcC5oIgorI2luY2x1ZGUgInFlZF9yZWdfYWRkci5oIgorI2luY2x1ZGUgInFlZF9zcC5oIgorI2luY2x1ZGUgInFlZF9yb2NlLmgiCisjaW5jbHVkZSAicWVkX2xsMi5oIgorCit2b2lkIHFlZF9hc3luY19yb2NlX2V2ZW50KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICBzdHJ1Y3QgZXZlbnRfcmluZ19lbnRyeSAqcF9lcWUpCit7CisJc3RydWN0IHFlZF9yZG1hX2luZm8gKnBfcmRtYV9pbmZvID0gcF9od2ZuLT5wX3JkbWFfaW5mbzsKKworCXBfcmRtYV9pbmZvLT5ldmVudHMuYWZmaWxpYXRlZF9ldmVudChwX3JkbWFfaW5mby0+ZXZlbnRzLmNvbnRleHQsCisJCQkJCSAgICAgcF9lcWUtPm9wY29kZSwgJnBfZXFlLT5kYXRhKTsKK30KKworc3RhdGljIGludCBxZWRfcmRtYV9ibWFwX2FsbG9jKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICAgIHN0cnVjdCBxZWRfYm1hcCAqYm1hcCwgdTMyIG1heF9jb3VudCkKK3sKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAibWF4X2NvdW50ID0gJTA4eFxuIiwgbWF4X2NvdW50KTsKKworCWJtYXAtPm1heF9jb3VudCA9IG1heF9jb3VudDsKKworCWJtYXAtPmJpdG1hcCA9IGt6YWxsb2MoQklUU19UT19MT05HUyhtYXhfY291bnQpICogc2l6ZW9mKGxvbmcpLAorCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghYm1hcC0+Yml0bWFwKSB7CisJCURQX05PVElDRShwX2h3Zm4sCisJCQkgICJxZWQgYm1hcCBhbGxvYyBmYWlsZWQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgKGJpdG1hcClcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiQWxsb2NhdGVkIGJpdG1hcCAlcFxuIiwKKwkJICAgYm1hcC0+Yml0bWFwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxZWRfcmRtYV9ibWFwX2FsbG9jX2lkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgc3RydWN0IHFlZF9ibWFwICpibWFwLCB1MzIgKmlkX251bSkKK3sKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiYm1hcCA9ICVwXG4iLCBibWFwKTsKKworCSppZF9udW0gPSBmaW5kX2ZpcnN0X3plcm9fYml0KGJtYXAtPmJpdG1hcCwgYm1hcC0+bWF4X2NvdW50KTsKKworCWlmICgqaWRfbnVtID49IGJtYXAtPm1heF9jb3VudCkgeworCQlEUF9OT1RJQ0UocF9od2ZuLCAibm8gaWQgYXZhaWxhYmxlIG1heF9jb3VudD0lZFxuIiwKKwkJCSAgYm1hcC0+bWF4X2NvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJX19zZXRfYml0KCppZF9udW0sIGJtYXAtPmJpdG1hcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWVkX2JtYXBfcmVsZWFzZV9pZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQlzdHJ1Y3QgcWVkX2JtYXAgKmJtYXAsIHUzMiBpZF9udW0pCit7CisJYm9vbCBiX2FjcXVpcmVkOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgImlkX251bSA9ICUwOHgiLCBpZF9udW0pOworCWlmIChpZF9udW0gPj0gYm1hcC0+bWF4X2NvdW50KQorCQlyZXR1cm47CisKKwliX2FjcXVpcmVkID0gdGVzdF9hbmRfY2xlYXJfYml0KGlkX251bSwgYm1hcC0+Yml0bWFwKTsKKwlpZiAoIWJfYWNxdWlyZWQpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwgIklEICVkIGFscmVhZHkgcmVsZWFzZWRcbiIsIGlkX251bSk7CisJCXJldHVybjsKKwl9Cit9CisKK3UzMiBxZWRfcmRtYV9nZXRfc2JfaWQodm9pZCAqcF9od2ZuLCB1MzIgcmVsX3NiX2lkKQoreworCS8qIEZpcnN0IHNiIGlkIGZvciBSb0NFIGlzIGFmdGVyIGFsbCB0aGUgbDIgc2IgKi8KKwlyZXR1cm4gRkVBVF9OVU0oKHN0cnVjdCBxZWRfaHdmbiAqKXBfaHdmbiwgUUVEX1BGX0wyX1FVRSkgKyByZWxfc2JfaWQ7Cit9CisKK3UzMiBxZWRfcmRtYV9xdWVyeV9jYXVfdGltZXJfcmVzKHZvaWQgKnJkbWFfY3h0KQoreworCXJldHVybiBRRURfQ0FVX0RFRl9SWF9USU1FUl9SRVM7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JkbWFfYWxsb2Moc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCSAgc3RydWN0IHFlZF9yZG1hX3N0YXJ0X2luX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBxZWRfcmRtYV9pbmZvICpwX3JkbWFfaW5mbzsKKwl1MzIgbnVtX2NvbnMsIG51bV90YXNrczsKKwlpbnQgcmMgPSAtRU5PTUVNOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIkFsbG9jYXRpbmcgUkRNQVxuIik7CisKKwkvKiBBbGxvY2F0ZSBhIHN0cnVjdCB3aXRoIGN1cnJlbnQgcGYgcmRtYSBpbmZvICovCisJcF9yZG1hX2luZm8gPSBremFsbG9jKHNpemVvZigqcF9yZG1hX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBfcmRtYV9pbmZvKSB7CisJCURQX05PVElDRShwX2h3Zm4sCisJCQkgICJxZWQgcmRtYSBhbGxvYyBmYWlsZWQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgKHJkbWEgaW5mbykuIHJjID0gJWRcbiIsCisJCQkgIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXBfaHdmbi0+cF9yZG1hX2luZm8gPSBwX3JkbWFfaW5mbzsKKwlwX3JkbWFfaW5mby0+cHJvdG8gPSBQUk9UT0NPTElEX1JPQ0U7CisKKwludW1fY29ucyA9IHFlZF9jeHRfZ2V0X3Byb3RvX2NpZF9jb3VudChwX2h3Zm4sIHBfcmRtYV9pbmZvLT5wcm90bywgMCk7CisKKwlwX3JkbWFfaW5mby0+bnVtX3FwcyA9IG51bV9jb25zIC8gMjsKKworCW51bV90YXNrcyA9IHFlZF9jeHRfZ2V0X3Byb3RvX3RpZF9jb3VudChwX2h3Zm4sIFBST1RPQ09MSURfUk9DRSk7CisKKwkvKiBFYWNoIE1SIHVzZXMgYSBzaW5nbGUgdGFzayAqLworCXBfcmRtYV9pbmZvLT5udW1fbXJzID0gbnVtX3Rhc2tzOworCisJLyogUXVldWUgem9uZSBsaW5lcyBhcmUgc2hhcmVkIGJldHdlZW4gUm9DRSBhbmQgTDIgaW4gc3VjaCBhIHdheSB0aGF0CisJICogdGhleSBjYW4gYmUgdXNlZCBieSBlYWNoIHdpdGhvdXQgb2JzdHJ1Y3RpbmcgdGhlIG90aGVyLgorCSAqLworCXBfcmRtYV9pbmZvLT5xdWV1ZV96b25lX2Jhc2UgPSAodTE2KUZFQVRfTlVNKHBfaHdmbiwgUUVEX0wyX1FVRVVFKTsKKworCS8qIEFsbG9jYXRlIGEgc3RydWN0IHdpdGggZGV2aWNlIHBhcmFtcyBhbmQgZmlsbCBpdCAqLworCXBfcmRtYV9pbmZvLT5kZXYgPSBremFsbG9jKHNpemVvZigqcF9yZG1hX2luZm8tPmRldiksIEdGUF9LRVJORUwpOworCWlmICghcF9yZG1hX2luZm8tPmRldikgeworCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAicWVkIHJkbWEgYWxsb2MgZmFpbGVkOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IChyZG1hIGluZm8gZGV2KS4gcmMgPSAlZFxuIiwKKwkJCSAgcmMpOworCQlnb3RvIGZyZWVfcmRtYV9pbmZvOworCX0KKworCS8qIEFsbG9jYXRlIGEgc3RydWN0IHdpdGggcG9ydCBwYXJhbXMgYW5kIGZpbGwgaXQgKi8KKwlwX3JkbWFfaW5mby0+cG9ydCA9IGt6YWxsb2Moc2l6ZW9mKCpwX3JkbWFfaW5mby0+cG9ydCksIEdGUF9LRVJORUwpOworCWlmICghcF9yZG1hX2luZm8tPnBvcnQpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCSAgInFlZCByZG1hIGFsbG9jIGZhaWxlZDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSAocmRtYSBpbmZvIHBvcnQpLiByYyA9ICVkXG4iLAorCQkJICByYyk7CisJCWdvdG8gZnJlZV9yZG1hX2RldjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBiaXQgbWFwIGZvciBwZCdzICovCisJcmMgPSBxZWRfcmRtYV9ibWFwX2FsbG9jKHBfaHdmbiwgJnBfcmRtYV9pbmZvLT5wZF9tYXAsIFJETUFfTUFYX1BEUyk7CisJaWYgKHJjKSB7CisJCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsCisJCQkgICAiRmFpbGVkIHRvIGFsbG9jYXRlIHBkX21hcCwgcmMgPSAlZFxuIiwKKwkJCSAgIHJjKTsKKwkJZ290byBmcmVlX3JkbWFfcG9ydDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBEUEkgYml0bWFwICovCisJcmMgPSBxZWRfcmRtYV9ibWFwX2FsbG9jKHBfaHdmbiwgJnBfcmRtYV9pbmZvLT5kcGlfbWFwLAorCQkJCSBwX2h3Zm4tPmRwaV9jb3VudCk7CisJaWYgKHJjKSB7CisJCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsCisJCQkgICAiRmFpbGVkIHRvIGFsbG9jYXRlIERQSSBiaXRtYXAsIHJjID0gJWRcbiIsIHJjKTsKKwkJZ290byBmcmVlX3BkX21hcDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBiaXRtYXAgZm9yIGNxJ3MuIFRoZSBtYXhpbXVtIG51bWJlciBvZiBDUXMgaXMgYm91bmRlZCB0bworCSAqIHR3aWNlIHRoZSBudW1iZXIgb2YgUVBzLgorCSAqLworCXJjID0gcWVkX3JkbWFfYm1hcF9hbGxvYyhwX2h3Zm4sICZwX3JkbWFfaW5mby0+Y3FfbWFwLAorCQkJCSBwX3JkbWFfaW5mby0+bnVtX3FwcyAqIDIpOworCWlmIChyYykgeworCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLAorCQkJICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBjcSBiaXRtYXAsIHJjID0gJWRcbiIsIHJjKTsKKwkJZ290byBmcmVlX2RwaV9tYXA7CisJfQorCisJLyogQWxsb2NhdGUgYml0bWFwIGZvciB0b2dnbGUgYml0IGZvciBjcSBpY2lkcworCSAqIFdlIHRvZ2dsZSB0aGUgYml0IGV2ZXJ5IHRpbWUgd2UgY3JlYXRlIG9yIHJlc2l6ZSBjcSBmb3IgYSBnaXZlbiBpY2lkLgorCSAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBDUXMgaXMgYm91bmRlZCB0byAgdHdpY2UgdGhlIG51bWJlciBvZiBRUHMuCisJICovCisJcmMgPSBxZWRfcmRtYV9ibWFwX2FsbG9jKHBfaHdmbiwgJnBfcmRtYV9pbmZvLT50b2dnbGVfYml0cywKKwkJCQkgcF9yZG1hX2luZm8tPm51bV9xcHMgKiAyKTsKKwlpZiAocmMpIHsKKwkJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwKKwkJCSAgICJGYWlsZWQgdG8gYWxsb2NhdGUgdG9vZ2xlIGJpdHMsIHJjID0gJWRcbiIsIHJjKTsKKwkJZ290byBmcmVlX2NxX21hcDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBiaXRtYXAgZm9yIGl0aWRzICovCisJcmMgPSBxZWRfcmRtYV9ibWFwX2FsbG9jKHBfaHdmbiwgJnBfcmRtYV9pbmZvLT50aWRfbWFwLAorCQkJCSBwX3JkbWFfaW5mby0+bnVtX21ycyk7CisJaWYgKHJjKSB7CisJCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsCisJCQkgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGl0aWRzIGJpdG1hcHMsIHJjID0gJWRcbiIsIHJjKTsKKwkJZ290byBmcmVlX3RvZ2dsZV9tYXA7CisJfQorCisJLyogQWxsb2NhdGUgYml0bWFwIGZvciBjaWRzIHVzZWQgZm9yIHFwcy4gKi8KKwlyYyA9IHFlZF9yZG1hX2JtYXBfYWxsb2MocF9od2ZuLCAmcF9yZG1hX2luZm8tPmNpZF9tYXAsIG51bV9jb25zKTsKKwlpZiAocmMpIHsKKwkJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwKKwkJCSAgICJGYWlsZWQgdG8gYWxsb2NhdGUgY2lkIGJpdG1hcCwgcmMgPSAlZFxuIiwgcmMpOworCQlnb3RvIGZyZWVfdGlkX21hcDsKKwl9CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiQWxsb2NhdGlvbiBzdWNjZXNzZnVsXG4iKTsKKwlyZXR1cm4gMDsKKworZnJlZV90aWRfbWFwOgorCWtmcmVlKHBfcmRtYV9pbmZvLT50aWRfbWFwLmJpdG1hcCk7CitmcmVlX3RvZ2dsZV9tYXA6CisJa2ZyZWUocF9yZG1hX2luZm8tPnRvZ2dsZV9iaXRzLmJpdG1hcCk7CitmcmVlX2NxX21hcDoKKwlrZnJlZShwX3JkbWFfaW5mby0+Y3FfbWFwLmJpdG1hcCk7CitmcmVlX2RwaV9tYXA6CisJa2ZyZWUocF9yZG1hX2luZm8tPmRwaV9tYXAuYml0bWFwKTsKK2ZyZWVfcGRfbWFwOgorCWtmcmVlKHBfcmRtYV9pbmZvLT5wZF9tYXAuYml0bWFwKTsKK2ZyZWVfcmRtYV9wb3J0OgorCWtmcmVlKHBfcmRtYV9pbmZvLT5wb3J0KTsKK2ZyZWVfcmRtYV9kZXY6CisJa2ZyZWUocF9yZG1hX2luZm8tPmRldik7CitmcmVlX3JkbWFfaW5mbzoKKwlrZnJlZShwX3JkbWFfaW5mbyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgcWVkX3JkbWFfcmVzY19mcmVlKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuKQoreworCXN0cnVjdCBxZWRfcmRtYV9pbmZvICpwX3JkbWFfaW5mbyA9IHBfaHdmbi0+cF9yZG1hX2luZm87CisKKwlrZnJlZShwX3JkbWFfaW5mby0+Y2lkX21hcC5iaXRtYXApOworCWtmcmVlKHBfcmRtYV9pbmZvLT50aWRfbWFwLmJpdG1hcCk7CisJa2ZyZWUocF9yZG1hX2luZm8tPnRvZ2dsZV9iaXRzLmJpdG1hcCk7CisJa2ZyZWUocF9yZG1hX2luZm8tPmNxX21hcC5iaXRtYXApOworCWtmcmVlKHBfcmRtYV9pbmZvLT5kcGlfbWFwLmJpdG1hcCk7CisJa2ZyZWUocF9yZG1hX2luZm8tPnBkX21hcC5iaXRtYXApOworCisJa2ZyZWUocF9yZG1hX2luZm8tPnBvcnQpOworCWtmcmVlKHBfcmRtYV9pbmZvLT5kZXYpOworCisJa2ZyZWUocF9yZG1hX2luZm8pOworfQorCitzdGF0aWMgdm9pZCBxZWRfcmRtYV9mcmVlKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuKQoreworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJGcmVlaW5nIFJETUFcbiIpOworCisJcWVkX3JkbWFfcmVzY19mcmVlKHBfaHdmbik7Cit9CisKK3N0YXRpYyB2b2lkIHFlZF9yZG1hX2dldF9ndWlkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1OCAqZ3VpZCkKK3sKKwlndWlkWzBdID0gcF9od2ZuLT5od19pbmZvLmh3X21hY19hZGRyWzBdIF4gMjsKKwlndWlkWzFdID0gcF9od2ZuLT5od19pbmZvLmh3X21hY19hZGRyWzFdOworCWd1aWRbMl0gPSBwX2h3Zm4tPmh3X2luZm8uaHdfbWFjX2FkZHJbMl07CisJZ3VpZFszXSA9IDB4ZmY7CisJZ3VpZFs0XSA9IDB4ZmU7CisJZ3VpZFs1XSA9IHBfaHdmbi0+aHdfaW5mby5od19tYWNfYWRkclszXTsKKwlndWlkWzZdID0gcF9od2ZuLT5od19pbmZvLmh3X21hY19hZGRyWzRdOworCWd1aWRbN10gPSBwX2h3Zm4tPmh3X2luZm8uaHdfbWFjX2FkZHJbNV07Cit9CisKK3N0YXRpYyB2b2lkIHFlZF9yZG1hX2luaXRfZXZlbnRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSBzdHJ1Y3QgcWVkX3JkbWFfc3RhcnRfaW5fcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHFlZF9yZG1hX2V2ZW50cyAqZXZlbnRzOworCisJZXZlbnRzID0gJnBfaHdmbi0+cF9yZG1hX2luZm8tPmV2ZW50czsKKworCWV2ZW50cy0+dW5hZmZpbGlhdGVkX2V2ZW50ID0gcGFyYW1zLT5ldmVudHMtPnVuYWZmaWxpYXRlZF9ldmVudDsKKwlldmVudHMtPmFmZmlsaWF0ZWRfZXZlbnQgPSBwYXJhbXMtPmV2ZW50cy0+YWZmaWxpYXRlZF9ldmVudDsKKwlldmVudHMtPmNvbnRleHQgPSBwYXJhbXMtPmV2ZW50cy0+Y29udGV4dDsKK30KKworc3RhdGljIHZvaWQgcWVkX3JkbWFfaW5pdF9kZXZpbmZvKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgc3RydWN0IHFlZF9yZG1hX3N0YXJ0X2luX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBxZWRfcmRtYV9kZXZpY2UgKmRldiA9IHBfaHdmbi0+cF9yZG1hX2luZm8tPmRldjsKKwlzdHJ1Y3QgcWVkX2RldiAqY2RldiA9IHBfaHdmbi0+Y2RldjsKKwl1MzIgcGNpX3N0YXR1c19jb250cm9sOworCXUzMiBudW1fcXBzOworCisJLyogVmVuZG9yIHNwZWNpZmljIGluZm9ybWF0aW9uICovCisJZGV2LT52ZW5kb3JfaWQgPSBjZGV2LT52ZW5kb3JfaWQ7CisJZGV2LT52ZW5kb3JfcGFydF9pZCA9IGNkZXYtPmRldmljZV9pZDsKKwlkZXYtPmh3X3ZlciA9IDA7CisJZGV2LT5md192ZXIgPSAoRldfTUFKT1JfVkVSU0lPTiA8PCAyNCkgfCAoRldfTUlOT1JfVkVSU0lPTiA8PCAxNikgfAorCQkgICAgICAoRldfUkVWSVNJT05fVkVSU0lPTiA8PCA4KSB8IChGV19FTkdJTkVFUklOR19WRVJTSU9OKTsKKworCXFlZF9yZG1hX2dldF9ndWlkKHBfaHdmbiwgKHU4ICopJmRldi0+c3lzX2ltYWdlX2d1aWQpOworCWRldi0+bm9kZV9ndWlkID0gZGV2LT5zeXNfaW1hZ2VfZ3VpZDsKKworCWRldi0+bWF4X3NnZSA9IG1pbl90KHUzMiwgUkRNQV9NQVhfU0dFX1BFUl9TUV9XUUUsCisJCQkgICAgIFJETUFfTUFYX1NHRV9QRVJfUlFfV1FFKTsKKworCWlmIChjZGV2LT5yZG1hX21heF9zZ2UpCisJCWRldi0+bWF4X3NnZSA9IG1pbl90KHUzMiwgY2Rldi0+cmRtYV9tYXhfc2dlLCBkZXYtPm1heF9zZ2UpOworCisJZGV2LT5tYXhfaW5saW5lID0gUk9DRV9SRVFfTUFYX0lOTElORV9EQVRBX1NJWkU7CisKKwlkZXYtPm1heF9pbmxpbmUgPSAoY2Rldi0+cmRtYV9tYXhfaW5saW5lKSA/CisJCQkgIG1pbl90KHUzMiwgY2Rldi0+cmRtYV9tYXhfaW5saW5lLCBkZXYtPm1heF9pbmxpbmUpIDoKKwkJCSAgZGV2LT5tYXhfaW5saW5lOworCisJZGV2LT5tYXhfd3FlID0gUUVEX1JETUFfTUFYX1dRRTsKKwlkZXYtPm1heF9jbnEgPSAodTgpRkVBVF9OVU0ocF9od2ZuLCBRRURfUkRNQV9DTlEpOworCisJLyogVGhlIG51bWJlciBvZiBRUHMgbWF5IGJlIGhpZ2hlciB0aGFuIFFFRF9ST0NFX01BWF9RUFMsIGJlY2F1c2UKKwkgKiBpdCBpcyB1cC1hbGlnbmVkIHRvIDE2IGFuZCB0aGVuIHRvIElMVCBwYWdlIHNpemUgd2l0aGluIHFlZCBjeHQuCisJICogVGhpcyBpcyBPSyBpbiB0ZXJtcyBvZiBJTFQgYnV0IHdlIGRvbid0IHdhbnQgdG8gY29uZmlndXJlIHRoZSBGVworCSAqIGFib3ZlIGl0cyBhYmlsaXRpZXMKKwkgKi8KKwludW1fcXBzID0gUk9DRV9NQVhfUVBTOworCW51bV9xcHMgPSBtaW5fdCh1NjQsIG51bV9xcHMsIHBfaHdmbi0+cF9yZG1hX2luZm8tPm51bV9xcHMpOworCWRldi0+bWF4X3FwID0gbnVtX3FwczsKKworCS8qIENRcyB1c2VzIHRoZSBzYW1lIGljaWRzIHRoYXQgUVBzIHVzZSBoZW5jZSB0aGV5IGFyZSBsaW1pdGVkIGJ5IHRoZQorCSAqIG51bWJlciBvZiBpY2lkcy4gVGhlcmUgYXJlIHR3byBpY2lkcyBwZXIgUVAuCisJICovCisJZGV2LT5tYXhfY3EgPSBudW1fcXBzICogMjsKKworCS8qIFRoZSBudW1iZXIgb2YgbXJzIGlzIHNtYWxsZXIgYnkgMSBzaW5jZSB0aGUgZmlyc3QgaXMgcmVzZXJ2ZWQgKi8KKwlkZXYtPm1heF9tciA9IHBfaHdmbi0+cF9yZG1hX2luZm8tPm51bV9tcnMgLSAxOworCWRldi0+bWF4X21yX3NpemUgPSBRRURfUkRNQV9NQVhfTVJfU0laRTsKKworCS8qIFRoZSBtYXhpbXVtIENRRSBjYXBhY2l0eSBwZXIgQ1Egc3VwcG9ydGVkLgorCSAqIG1heCBudW1iZXIgb2YgY3FlcyB3aWxsIGJlIGluIHR3byBsYXllciBwYmwsCisJICogOCBpcyB0aGUgcG9pbnRlciBzaXplIGluIGJ5dGVzCisJICogMzIgaXMgdGhlIHNpemUgb2YgY3EgZWxlbWVudCBpbiBieXRlcworCSAqLworCWlmIChwYXJhbXMtPmNxX21vZGUgPT0gUUVEX1JETUFfQ1FfTU9ERV8zMl9CSVRTKQorCQlkZXYtPm1heF9jcWUgPSBRRURfUkRNQV9NQVhfQ1FFXzMyX0JJVDsKKwllbHNlCisJCWRldi0+bWF4X2NxZSA9IFFFRF9SRE1BX01BWF9DUUVfMTZfQklUOworCisJZGV2LT5tYXhfbXcgPSAwOworCWRldi0+bWF4X2ZtciA9IFFFRF9SRE1BX01BWF9GTVI7CisJZGV2LT5tYXhfbXJfbXdfZm1yX3BibCA9IChQQUdFX1NJWkUgLyA4KSAqIChQQUdFX1NJWkUgLyA4KTsKKwlkZXYtPm1heF9tcl9td19mbXJfc2l6ZSA9IGRldi0+bWF4X21yX213X2Ztcl9wYmwgKiBQQUdFX1NJWkU7CisJZGV2LT5tYXhfcGtleSA9IFFFRF9SRE1BX01BWF9QX0tFWTsKKworCWRldi0+bWF4X3FwX3Jlc3BfcmRfYXRvbWljX3Jlc2MgPSBSRE1BX1JJTkdfUEFHRV9TSVpFIC8KKwkJCQkJICAoUkRNQV9SRVNQX1JEX0FUT01JQ19FTE1fU0laRSAqIDIpOworCWRldi0+bWF4X3FwX3JlcV9yZF9hdG9taWNfcmVzYyA9IFJETUFfUklOR19QQUdFX1NJWkUgLworCQkJCQkgUkRNQV9SRVFfUkRfQVRPTUlDX0VMTV9TSVpFOworCWRldi0+bWF4X2Rldl9yZXNwX3JkX2F0b21pY19yZXNjID0gZGV2LT5tYXhfcXBfcmVzcF9yZF9hdG9taWNfcmVzYyAqCisJCQkJCSAgIHBfaHdmbi0+cF9yZG1hX2luZm8tPm51bV9xcHM7CisJZGV2LT5wYWdlX3NpemVfY2FwcyA9IFFFRF9SRE1BX1BBR0VfU0laRV9DQVBTOworCWRldi0+ZGV2X2Fja19kZWxheSA9IFFFRF9SRE1BX0FDS19ERUxBWTsKKwlkZXYtPm1heF9wZCA9IFJETUFfTUFYX1BEUzsKKwlkZXYtPm1heF9haCA9IHBfaHdmbi0+cF9yZG1hX2luZm8tPm51bV9xcHM7CisJZGV2LT5tYXhfc3RhdHNfcXVldWVzID0gKHU4KVJFU0NfTlVNKHBfaHdmbiwgUUVEX1JETUFfU1RBVFNfUVVFVUUpOworCisJLyogU2V0IGNhcGFibGl0aWVzICovCisJZGV2LT5kZXZfY2FwcyA9IDA7CisJU0VUX0ZJRUxEKGRldi0+ZGV2X2NhcHMsIFFFRF9SRE1BX0RFVl9DQVBfUk5SX05BSywgMSk7CisJU0VUX0ZJRUxEKGRldi0+ZGV2X2NhcHMsIFFFRF9SRE1BX0RFVl9DQVBfUE9SVF9BQ1RJVkVfRVZFTlQsIDEpOworCVNFVF9GSUVMRChkZXYtPmRldl9jYXBzLCBRRURfUkRNQV9ERVZfQ0FQX1BPUlRfQ0hBTkdFX0VWRU5ULCAxKTsKKwlTRVRfRklFTEQoZGV2LT5kZXZfY2FwcywgUUVEX1JETUFfREVWX0NBUF9SRVNJWkVfQ1EsIDEpOworCVNFVF9GSUVMRChkZXYtPmRldl9jYXBzLCBRRURfUkRNQV9ERVZfQ0FQX0JBU0VfTUVNT1JZX0VYVCwgMSk7CisJU0VUX0ZJRUxEKGRldi0+ZGV2X2NhcHMsIFFFRF9SRE1BX0RFVl9DQVBfQkFTRV9RVUVVRV9FWFQsIDEpOworCVNFVF9GSUVMRChkZXYtPmRldl9jYXBzLCBRRURfUkRNQV9ERVZfQ0FQX1pCVkEsIDEpOworCVNFVF9GSUVMRChkZXYtPmRldl9jYXBzLCBRRURfUkRNQV9ERVZfQ0FQX0xPQ0FMX0lOVl9GRU5DRSwgMSk7CisKKwkvKiBDaGVjayBhdG9taWMgb3BlcmF0aW9ucyBzdXBwb3J0IGluIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlLiAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChjZGV2LT5wZGV2LAorCQkJICAgICAgY2Rldi0+cGRldi0+cGNpZV9jYXAgKyBQQ0lfRVhQX0RFVkNUTDIsCisJCQkgICAgICAmcGNpX3N0YXR1c19jb250cm9sKTsKKworCWlmIChwY2lfc3RhdHVzX2NvbnRyb2wgJiBQQ0lfRVhQX0RFVkNUTDJfTFRSX0VOKQorCQlTRVRfRklFTEQoZGV2LT5kZXZfY2FwcywgUUVEX1JETUFfREVWX0NBUF9BVE9NSUNfT1AsIDEpOworfQorCitzdGF0aWMgdm9pZCBxZWRfcmRtYV9pbml0X3BvcnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4pCit7CisJc3RydWN0IHFlZF9yZG1hX3BvcnQgKnBvcnQgPSBwX2h3Zm4tPnBfcmRtYV9pbmZvLT5wb3J0OworCXN0cnVjdCBxZWRfcmRtYV9kZXZpY2UgKmRldiA9IHBfaHdmbi0+cF9yZG1hX2luZm8tPmRldjsKKworCXBvcnQtPnBvcnRfc3RhdGUgPSBwX2h3Zm4tPm1jcF9pbmZvLT5saW5rX291dHB1dC5saW5rX3VwID8KKwkJCSAgIFFFRF9SRE1BX1BPUlRfVVAgOiBRRURfUkRNQV9QT1JUX0RPV047CisKKwlwb3J0LT5tYXhfbXNnX3NpemUgPSBtaW5fdCh1NjQsCisJCQkJICAgKGRldi0+bWF4X21yX213X2Ztcl9zaXplICoKKwkJCQkgICAgcF9od2ZuLT5jZGV2LT5yZG1hX21heF9zZ2UpLAorCQkJCSAgIEJJVCgzMSkpOworCisJcG9ydC0+cGtleV9iYWRfY291bnRlciA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JkbWFfaW5pdF9odyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQoreworCXUzMiBsbDJfZXRoZXJ0eXBlX2VuOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIkluaXRpYWxpemluZyBIV1xuIik7CisJcF9od2ZuLT5iX3JkbWFfZW5hYmxlZF9pbl9wcnMgPSBmYWxzZTsKKworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBQUlNfUkVHX1JPQ0VfREVTVF9RUF9NQVhfUEYsIDApOworCisJcF9od2ZuLT5yZG1hX3Byc19zZWFyY2hfcmVnID0gUFJTX1JFR19TRUFSQ0hfUk9DRTsKKworCS8qIFdlIGRlbGF5IHdyaXRpbmcgdG8gdGhpcyByZWcgdW50aWwgZmlyc3QgY2lkIGlzIGFsbG9jYXRlZC4gU2VlCisJICogcWVkX2N4dF9keW5hbWljX2lsdF9hbGxvYyBmdW5jdGlvbiBmb3IgbW9yZSBkZXRhaWxzCisJICovCisJbGwyX2V0aGVydHlwZV9lbiA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LCBQUlNfUkVHX0xJR0hUX0wyX0VUSEVSVFlQRV9FTik7CisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIFBSU19SRUdfTElHSFRfTDJfRVRIRVJUWVBFX0VOLAorCSAgICAgICAobGwyX2V0aGVydHlwZV9lbiB8IDB4MDEpKTsKKworCWlmIChxZWRfY3h0X2dldF9wcm90b19jaWRfc3RhcnQocF9od2ZuLCBQUk9UT0NPTElEX1JPQ0UpICUgMikgeworCQlEUF9OT1RJQ0UocF9od2ZuLCAiVGhlIGZpcnN0IFJvQ0UncyBjaWQgc2hvdWxkIGJlIGV2ZW5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiSW5pdGlhbGl6aW5nIEhXIC0gRG9uZVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JkbWFfc3RhcnRfZncoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgIHN0cnVjdCBxZWRfcmRtYV9zdGFydF9pbl9wYXJhbXMgKnBhcmFtcywKKwkJCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQoreworCXN0cnVjdCByZG1hX2luaXRfZnVuY19yYW1yb2RfZGF0YSAqcF9yYW1yb2Q7CisJc3RydWN0IHFlZF9yZG1hX2NucV9wYXJhbXMgKnBfY25xX3BibF9saXN0OworCXN0cnVjdCByZG1hX2luaXRfZnVuY19oZHIgKnBfcGFyYW1zX2hlYWRlcjsKKwlzdHJ1Y3QgcmRtYV9jbnFfcGFyYW1zICpwX2NucV9wYXJhbXM7CisJc3RydWN0IHFlZF9zcF9pbml0X2RhdGEgaW5pdF9kYXRhOworCXN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudDsKKwl1MzIgY25xX2lkLCBzYl9pZDsKKwlpbnQgcmM7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiU3RhcnRpbmcgRldcbiIpOworCisJLyogU2F2ZSB0aGUgbnVtYmVyIG9mIGNucXMgZm9yIHRoZSBmdW5jdGlvbiBjbG9zZSByYW1yb2QgKi8KKwlwX2h3Zm4tPnBfcmRtYV9pbmZvLT5udW1fY25xcyA9IHBhcmFtcy0+ZGVzaXJlZF9jbnE7CisKKwkvKiBHZXQgU1BRIGVudHJ5ICovCisJbWVtc2V0KCZpbml0X2RhdGEsIDAsIHNpemVvZihpbml0X2RhdGEpKTsKKwlpbml0X2RhdGEub3BhcXVlX2ZpZCA9IHBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkOworCWluaXRfZGF0YS5jb21wX21vZGUgPSBRRURfU1BRX01PREVfRUJMT0NLOworCisJcmMgPSBxZWRfc3BfaW5pdF9yZXF1ZXN0KHBfaHdmbiwgJnBfZW50LCBSRE1BX1JBTVJPRF9GVU5DX0lOSVQsCisJCQkJIHBfaHdmbi0+cF9yZG1hX2luZm8tPnByb3RvLCAmaW5pdF9kYXRhKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBfcmFtcm9kID0gJnBfZW50LT5yYW1yb2Qucm9jZV9pbml0X2Z1bmMucmRtYTsKKworCXBfcGFyYW1zX2hlYWRlciA9ICZwX3JhbXJvZC0+cGFyYW1zX2hlYWRlcjsKKwlwX3BhcmFtc19oZWFkZXItPmNucV9zdGFydF9vZmZzZXQgPSAodTgpUkVTQ19TVEFSVChwX2h3Zm4sCisJCQkJCQkJICAgUUVEX1JETUFfQ05RX1JBTSk7CisJcF9wYXJhbXNfaGVhZGVyLT5udW1fY25xcyA9IHBhcmFtcy0+ZGVzaXJlZF9jbnE7CisKKwlpZiAocGFyYW1zLT5jcV9tb2RlID09IFFFRF9SRE1BX0NRX01PREVfMTZfQklUUykKKwkJcF9wYXJhbXNfaGVhZGVyLT5jcV9yaW5nX21vZGUgPSAxOworCWVsc2UKKwkJcF9wYXJhbXNfaGVhZGVyLT5jcV9yaW5nX21vZGUgPSAwOworCisJZm9yIChjbnFfaWQgPSAwOyBjbnFfaWQgPCBwYXJhbXMtPmRlc2lyZWRfY25xOyBjbnFfaWQrKykgeworCQlzYl9pZCA9IHFlZF9yZG1hX2dldF9zYl9pZChwX2h3Zm4sIGNucV9pZCk7CisJCXBfY25xX3BhcmFtcyA9ICZwX3JhbXJvZC0+Y25xX3BhcmFtc1tjbnFfaWRdOworCQlwX2NucV9wYmxfbGlzdCA9ICZwYXJhbXMtPmNucV9wYmxfbGlzdFtjbnFfaWRdOworCQlwX2NucV9wYXJhbXMtPnNiX251bSA9CisJCQljcHVfdG9fbGUxNihwX2h3Zm4tPnNic19pbmZvW3NiX2lkXS0+aWd1X3NiX2lkKTsKKworCQlwX2NucV9wYXJhbXMtPnNiX2luZGV4ID0gcF9od2ZuLT5wZl9wYXJhbXMucmRtYV9wZl9wYXJhbXMuZ2xfcGk7CisJCXBfY25xX3BhcmFtcy0+bnVtX3BibF9wYWdlcyA9IHBfY25xX3BibF9saXN0LT5udW1fcGJsX3BhZ2VzOworCisJCURNQV9SRUdQQUlSX0xFKHBfY25xX3BhcmFtcy0+cGJsX2Jhc2VfYWRkciwKKwkJCSAgICAgICBwX2NucV9wYmxfbGlzdC0+cGJsX3B0cik7CisKKwkJLyogd2UgYXNzdW1lIGhlcmUgdGhhdCBjbnFfaWQgYW5kIHF6X29mZnNldCBhcmUgdGhlIHNhbWUgKi8KKwkJcF9jbnFfcGFyYW1zLT5xdWV1ZV96b25lX251bSA9CisJCQljcHVfdG9fbGUxNihwX2h3Zm4tPnBfcmRtYV9pbmZvLT5xdWV1ZV96b25lX2Jhc2UgKworCQkJCSAgICBjbnFfaWQpOworCX0KKworCXJldHVybiBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JkbWFfcmVzZXJ2ZV9sa2V5KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuKQoreworCXN0cnVjdCBxZWRfcmRtYV9kZXZpY2UgKmRldiA9IHBfaHdmbi0+cF9yZG1hX2luZm8tPmRldjsKKworCS8qIFRoZSBmaXJzdCBEUEkgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBLZXJuZWwgKi8KKwlfX3NldF9iaXQoMCwgcF9od2ZuLT5wX3JkbWFfaW5mby0+ZHBpX21hcC5iaXRtYXApOworCisJLyogVGlkIDAgd2lsbCBiZSB1c2VkIGFzIHRoZSBrZXkgZm9yICJyZXNlcnZlZCBNUiIuCisJICogVGhlIGRyaXZlciBzaG91bGQgYWxsb2NhdGUgbWVtb3J5IGZvciBpdCBzbyBpdCBjYW4gYmUgbG9hZGVkIGJ1dCBubworCSAqIHJhbXJvZCBzaG91bGQgYmUgcGFzc2VkIG9uIGl0LgorCSAqLworCXFlZF9yZG1hX2FsbG9jX3RpZChwX2h3Zm4sICZkZXYtPnJlc2VydmVkX2xrZXkpOworCWlmIChkZXYtPnJlc2VydmVkX2xrZXkgIT0gUkRNQV9SRVNFUlZFRF9MS0VZKSB7CisJCURQX05PVElDRShwX2h3Zm4sCisJCQkgICJSZXNlcnZlZCBsa2V5IHNob3VsZCBiZSBlcXVhbCB0byBSRE1BX1JFU0VSVkVEX0xLRVlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxZWRfcmRtYV9zZXR1cChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJICBzdHJ1Y3QgcWVkX3JkbWFfc3RhcnRfaW5fcGFyYW1zICpwYXJhbXMpCit7CisJaW50IHJjOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIlJETUEgc2V0dXBcbiIpOworCisJc3Bpbl9sb2NrX2luaXQoJnBfaHdmbi0+cF9yZG1hX2luZm8tPmxvY2spOworCisJcWVkX3JkbWFfaW5pdF9kZXZpbmZvKHBfaHdmbiwgcGFyYW1zKTsKKwlxZWRfcmRtYV9pbml0X3BvcnQocF9od2ZuKTsKKwlxZWRfcmRtYV9pbml0X2V2ZW50cyhwX2h3Zm4sIHBhcmFtcyk7CisKKwlyYyA9IHFlZF9yZG1hX3Jlc2VydmVfbGtleShwX2h3Zm4pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBxZWRfcmRtYV9pbml0X2h3KHBfaHdmbiwgcF9wdHQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIHFlZF9yZG1hX3N0YXJ0X2Z3KHBfaHdmbiwgcGFyYW1zLCBwX3B0dCk7Cit9CisKK2ludCBxZWRfcmRtYV9zdG9wKHZvaWQgKnJkbWFfY3h0KQoreworCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gKHN0cnVjdCBxZWRfaHdmbiAqKXJkbWFfY3h0OworCXN0cnVjdCByZG1hX2Nsb3NlX2Z1bmNfcmFtcm9kX2RhdGEgKnBfcmFtcm9kOworCXN0cnVjdCBxZWRfc3BfaW5pdF9kYXRhIGluaXRfZGF0YTsKKwlzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQ7CisJc3RydWN0IHFlZF9wdHQgKnBfcHR0OworCXUzMiBsbDJfZXRoZXJ0eXBlX2VuOworCWludCByYyA9IC1FQlVTWTsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJSRE1BIHN0b3BcbiIpOworCisJcF9wdHQgPSBxZWRfcHR0X2FjcXVpcmUocF9od2ZuKTsKKwlpZiAoIXBfcHR0KSB7CisJCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJGYWlsZWQgdG8gYWNxdWlyZSBQVFRcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogRGlzYWJsZSBSb0NFIHNlYXJjaCAqLworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBwX2h3Zm4tPnJkbWFfcHJzX3NlYXJjaF9yZWcsIDApOworCXBfaHdmbi0+Yl9yZG1hX2VuYWJsZWRfaW5fcHJzID0gZmFsc2U7CisKKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgUFJTX1JFR19ST0NFX0RFU1RfUVBfTUFYX1BGLCAwKTsKKworCWxsMl9ldGhlcnR5cGVfZW4gPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwgUFJTX1JFR19MSUdIVF9MMl9FVEhFUlRZUEVfRU4pOworCisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIFBSU19SRUdfTElHSFRfTDJfRVRIRVJUWVBFX0VOLAorCSAgICAgICAobGwyX2V0aGVydHlwZV9lbiAmIDB4RkZGRSkpOworCisJcWVkX3B0dF9yZWxlYXNlKHBfaHdmbiwgcF9wdHQpOworCisJLyogR2V0IFNQUSBlbnRyeSAqLworCW1lbXNldCgmaW5pdF9kYXRhLCAwLCBzaXplb2YoaW5pdF9kYXRhKSk7CisJaW5pdF9kYXRhLm9wYXF1ZV9maWQgPSBwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZDsKKwlpbml0X2RhdGEuY29tcF9tb2RlID0gUUVEX1NQUV9NT0RFX0VCTE9DSzsKKworCS8qIFN0b3AgUm9DRSAqLworCXJjID0gcWVkX3NwX2luaXRfcmVxdWVzdChwX2h3Zm4sICZwX2VudCwgUkRNQV9SQU1ST0RfRlVOQ19DTE9TRSwKKwkJCQkgcF9od2ZuLT5wX3JkbWFfaW5mby0+cHJvdG8sICZpbml0X2RhdGEpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisKKwlwX3JhbXJvZCA9ICZwX2VudC0+cmFtcm9kLnJkbWFfY2xvc2VfZnVuYzsKKworCXBfcmFtcm9kLT5udW1fY25xcyA9IHBfaHdmbi0+cF9yZG1hX2luZm8tPm51bV9jbnFzOworCXBfcmFtcm9kLT5jbnFfc3RhcnRfb2Zmc2V0ID0gKHU4KVJFU0NfU1RBUlQocF9od2ZuLCBRRURfUkRNQV9DTlFfUkFNKTsKKworCXJjID0gcWVkX3NwcV9wb3N0KHBfaHdmbiwgcF9lbnQsIE5VTEwpOworCitvdXQ6CisJcWVkX3JkbWFfZnJlZShwX2h3Zm4pOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIlJETUEgc3RvcCBkb25lLCByYyA9ICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCitpbnQgcWVkX3JkbWFfYWRkX3VzZXIodm9pZCAqcmRtYV9jeHQsCisJCSAgICAgIHN0cnVjdCBxZWRfcmRtYV9hZGRfdXNlcl9vdXRfcGFyYW1zICpvdXRfcGFyYW1zKQoreworCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gKHN0cnVjdCBxZWRfaHdmbiAqKXJkbWFfY3h0OworCXUzMiBkcGlfc3RhcnRfb2Zmc2V0OworCXUzMiByZXR1cm5lZF9pZCA9IDA7CisJaW50IHJjOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIkFkZGluZyBVc2VyXG4iKTsKKworCS8qIEFsbG9jYXRlIERQSSAqLworCXNwaW5fbG9ja19iaCgmcF9od2ZuLT5wX3JkbWFfaW5mby0+bG9jayk7CisJcmMgPSBxZWRfcmRtYV9ibWFwX2FsbG9jX2lkKHBfaHdmbiwgJnBfaHdmbi0+cF9yZG1hX2luZm8tPmRwaV9tYXAsCisJCQkJICAgICZyZXR1cm5lZF9pZCk7CisJc3Bpbl91bmxvY2tfYmgoJnBfaHdmbi0+cF9yZG1hX2luZm8tPmxvY2spOworCisJb3V0X3BhcmFtcy0+ZHBpID0gKHUxNilyZXR1cm5lZF9pZDsKKworCS8qIENhbGN1bGF0ZSB0aGUgY29ycmVzcG9uZGluZyBEUEkgYWRkcmVzcyAqLworCWRwaV9zdGFydF9vZmZzZXQgPSBwX2h3Zm4tPmRwaV9zdGFydF9vZmZzZXQ7CisKKwlvdXRfcGFyYW1zLT5kcGlfYWRkciA9ICh1NjQpKCh1OCBfX2lvbWVtICopcF9od2ZuLT5kb29yYmVsbHMgKworCQkJCSAgICAgZHBpX3N0YXJ0X29mZnNldCArCisJCQkJICAgICAoKG91dF9wYXJhbXMtPmRwaSkgKiBwX2h3Zm4tPmRwaV9zaXplKSk7CisKKwlvdXRfcGFyYW1zLT5kcGlfcGh5c19hZGRyID0gcF9od2ZuLT5jZGV2LT5kYl9waHlzX2FkZHIgKworCQkJCSAgICBkcGlfc3RhcnRfb2Zmc2V0ICsKKwkJCQkgICAgKChvdXRfcGFyYW1zLT5kcGkpICogcF9od2ZuLT5kcGlfc2l6ZSk7CisKKwlvdXRfcGFyYW1zLT5kcGlfc2l6ZSA9IHBfaHdmbi0+ZHBpX3NpemU7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiQWRkaW5nIHVzZXIgLSBkb25lLCByYyA9ICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgcWVkX3JkbWFfcG9ydCAqcWVkX3JkbWFfcXVlcnlfcG9ydCh2b2lkICpyZG1hX2N4dCkKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiA9IChzdHJ1Y3QgcWVkX2h3Zm4gKilyZG1hX2N4dDsKKwlzdHJ1Y3QgcWVkX3JkbWFfcG9ydCAqcF9wb3J0ID0gcF9od2ZuLT5wX3JkbWFfaW5mby0+cG9ydDsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJSRE1BIFF1ZXJ5IHBvcnRcbiIpOworCisJLyogTGluayBtYXkgaGF2ZSBjaGFuZ2VkICovCisJcF9wb3J0LT5wb3J0X3N0YXRlID0gcF9od2ZuLT5tY3BfaW5mby0+bGlua19vdXRwdXQubGlua191cCA/CisJCQkgICAgIFFFRF9SRE1BX1BPUlRfVVAgOiBRRURfUkRNQV9QT1JUX0RPV047CisKKwlwX3BvcnQtPmxpbmtfc3BlZWQgPSBwX2h3Zm4tPm1jcF9pbmZvLT5saW5rX291dHB1dC5zcGVlZDsKKworCXJldHVybiBwX3BvcnQ7Cit9CisKK3N0cnVjdCBxZWRfcmRtYV9kZXZpY2UgKnFlZF9yZG1hX3F1ZXJ5X2RldmljZSh2b2lkICpyZG1hX2N4dCkKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiA9IChzdHJ1Y3QgcWVkX2h3Zm4gKilyZG1hX2N4dDsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJRdWVyeSBkZXZpY2VcbiIpOworCisJLyogUmV0dXJuIHN0cnVjdCB3aXRoIGRldmljZSBwYXJhbWV0ZXJzICovCisJcmV0dXJuIHBfaHdmbi0+cF9yZG1hX2luZm8tPmRldjsKK30KKwordm9pZCBxZWRfcmRtYV9mcmVlX3RpZCh2b2lkICpyZG1hX2N4dCwgdTMyIGl0aWQpCit7CisJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4gPSAoc3RydWN0IHFlZF9od2ZuICopcmRtYV9jeHQ7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiaXRpZCA9ICUwOHhcbiIsIGl0aWQpOworCisJc3Bpbl9sb2NrX2JoKCZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5sb2NrKTsKKwlxZWRfYm1hcF9yZWxlYXNlX2lkKHBfaHdmbiwgJnBfaHdmbi0+cF9yZG1hX2luZm8tPnRpZF9tYXAsIGl0aWQpOworCXNwaW5fdW5sb2NrX2JoKCZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5sb2NrKTsKK30KKworaW50IHFlZF9yZG1hX2FsbG9jX3RpZCh2b2lkICpyZG1hX2N4dCwgdTMyICppdGlkKQoreworCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gKHN0cnVjdCBxZWRfaHdmbiAqKXJkbWFfY3h0OworCWludCByYzsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJBbGxvY2F0ZSBUSURcbiIpOworCisJc3Bpbl9sb2NrX2JoKCZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5sb2NrKTsKKwlyYyA9IHFlZF9yZG1hX2JtYXBfYWxsb2NfaWQocF9od2ZuLAorCQkJCSAgICAmcF9od2ZuLT5wX3JkbWFfaW5mby0+dGlkX21hcCwgaXRpZCk7CisJc3Bpbl91bmxvY2tfYmgoJnBfaHdmbi0+cF9yZG1hX2luZm8tPmxvY2spOworCWlmIChyYykKKwkJZ290byBvdXQ7CisKKwlyYyA9IHFlZF9jeHRfZHluYW1pY19pbHRfYWxsb2MocF9od2ZuLCBRRURfRUxFTV9UQVNLLCAqaXRpZCk7CitvdXQ6CisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIkFsbG9jYXRlIFRJRCAtIGRvbmUsIHJjID0gJWRcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgcWVkX3JkbWFfY25xX3Byb2RfdXBkYXRlKHZvaWQgKnJkbWFfY3h0LCB1OCBxel9vZmZzZXQsIHUxNiBwcm9kKQoreworCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuOworCXUxNiBxel9udW07CisJdTMyIGFkZHI7CisKKwlwX2h3Zm4gPSAoc3RydWN0IHFlZF9od2ZuICopcmRtYV9jeHQ7CisJcXpfbnVtID0gcF9od2ZuLT5wX3JkbWFfaW5mby0+cXVldWVfem9uZV9iYXNlICsgcXpfb2Zmc2V0OworCWFkZHIgPSBHVFRfQkFSMF9NQVBfUkVHX1VTRE1fUkFNICsKKwkgICAgICAgVVNUT1JNX0NPTU1PTl9RVUVVRV9DT05TX09GRlNFVChxel9udW0pOworCisJUkVHX1dSMTYocF9od2ZuLCBhZGRyLCBwcm9kKTsKKworCS8qIGtlZXAgcHJvZCB1cGRhdGVzIG9yZGVyZWQgKi8KKwl3bWIoKTsKK30KKworc3RhdGljIGludCBxZWRfZmlsbF9yZG1hX2Rldl9pbmZvKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJCSAgc3RydWN0IHFlZF9kZXZfcmRtYV9pbmZvICppbmZvKQoreworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKworCWluZm8tPnJkbWFfdHlwZSA9IFFFRF9SRE1BX1RZUEVfUk9DRTsKKworCXFlZF9maWxsX2Rldl9pbmZvKGNkZXYsICZpbmZvLT5jb21tb24pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JkbWFfZ2V0X3NiX3N0YXJ0KHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCWludCBmZWF0X251bTsKKworCWlmIChjZGV2LT5udW1faHdmbnMgPiAxKQorCQlmZWF0X251bSA9IEZFQVRfTlVNKFFFRF9MRUFESU5HX0hXRk4oY2RldiksIFFFRF9QRl9MMl9RVUUpOworCWVsc2UKKwkJZmVhdF9udW0gPSBGRUFUX05VTShRRURfTEVBRElOR19IV0ZOKGNkZXYpLCBRRURfUEZfTDJfUVVFKSAqCisJCQkgICBjZGV2LT5udW1faHdmbnM7CisKKwlyZXR1cm4gZmVhdF9udW07Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JkbWFfZ2V0X21pbl9jbnFfbXNpeChzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwlpbnQgbl9jbnEgPSBGRUFUX05VTShRRURfTEVBRElOR19IV0ZOKGNkZXYpLCBRRURfUkRNQV9DTlEpOworCWludCBuX21zaXggPSBjZGV2LT5pbnRfcGFyYW1zLnJkbWFfbXNpeF9jbnQ7CisKKwlyZXR1cm4gbWluX3QoaW50LCBuX2NucSwgbl9tc2l4KTsKK30KKworc3RhdGljIGludCBxZWRfcmRtYV9zZXRfaW50KHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB1MTYgY250KQoreworCWludCBsaW1pdCA9IDA7CisKKwkvKiBNYXJrIHRoZSBmYXN0cGF0aCBhcyBmcmVlL3VzZWQgKi8KKwljZGV2LT5pbnRfcGFyYW1zLmZwX2luaXRpYWxpemVkID0gY250ID8gdHJ1ZSA6IGZhbHNlOworCisJaWYgKGNkZXYtPmludF9wYXJhbXMub3V0LmludF9tb2RlICE9IFFFRF9JTlRfTU9ERV9NU0lYKSB7CisJCURQX0VSUihjZGV2LAorCQkgICAgICAgInFlZCByb2NlIHN1cHBvcnRzIG9ubHkgTVNJLVggaW50ZXJydXB0cyAoZGV0ZWN0ZWQgJWQpLlxuIiwKKwkJICAgICAgIGNkZXYtPmludF9wYXJhbXMub3V0LmludF9tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmIChjZGV2LT5pbnRfcGFyYW1zLmZwX21zaXhfY250KSB7CisJCWxpbWl0ID0gY2Rldi0+aW50X3BhcmFtcy5yZG1hX21zaXhfY250OworCX0KKworCWlmICghbGltaXQpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIG1pbl90KGludCwgY250LCBsaW1pdCk7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JkbWFfZ2V0X2ludChzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IHFlZF9pbnRfaW5mbyAqaW5mbykKK3sKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisKKwlpZiAoIWNkZXYtPmludF9wYXJhbXMuZnBfaW5pdGlhbGl6ZWQpIHsKKwkJRFBfSU5GTyhjZGV2LAorCQkJIlByb3RvY29sIGRyaXZlciByZXF1ZXN0ZWQgaW50ZXJydXB0IGluZm9ybWF0aW9uLCBidXQgaXRzIHN1cHBvcnQgaXMgbm90IHlldCBjb25maWd1cmVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNkZXYtPmludF9wYXJhbXMub3V0LmludF9tb2RlID09IFFFRF9JTlRfTU9ERV9NU0lYKSB7CisJCWludCBtc2l4X2Jhc2UgPSBjZGV2LT5pbnRfcGFyYW1zLnJkbWFfbXNpeF9iYXNlOworCisJCWluZm8tPm1zaXhfY250ID0gY2Rldi0+aW50X3BhcmFtcy5yZG1hX21zaXhfY250OworCQlpbmZvLT5tc2l4ID0gJmNkZXYtPmludF9wYXJhbXMubXNpeF90YWJsZVttc2l4X2Jhc2VdOworCisJCURQX1ZFUkJPU0UoY2RldiwgUUVEX01TR19SRE1BLCAibXNpeF9jbnQgPSAlZCBtc2l4X2Jhc2U9JWRcbiIsCisJCQkgICBpbmZvLT5tc2l4X2NudCwgbXNpeF9iYXNlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHFlZF9yZG1hX2FsbG9jX3BkKHZvaWQgKnJkbWFfY3h0LCB1MTYgKnBkKQoreworCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gKHN0cnVjdCBxZWRfaHdmbiAqKXJkbWFfY3h0OworCXUzMiByZXR1cm5lZF9pZDsKKwlpbnQgcmM7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiQWxsb2MgUERcbiIpOworCisJLyogQWxsb2NhdGVzIGFuIHVudXNlZCBwcm90ZWN0aW9uIGRvbWFpbiAqLworCXNwaW5fbG9ja19iaCgmcF9od2ZuLT5wX3JkbWFfaW5mby0+bG9jayk7CisJcmMgPSBxZWRfcmRtYV9ibWFwX2FsbG9jX2lkKHBfaHdmbiwKKwkJCQkgICAgJnBfaHdmbi0+cF9yZG1hX2luZm8tPnBkX21hcCwgJnJldHVybmVkX2lkKTsKKwlzcGluX3VubG9ja19iaCgmcF9od2ZuLT5wX3JkbWFfaW5mby0+bG9jayk7CisKKwkqcGQgPSAodTE2KXJldHVybmVkX2lkOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIkFsbG9jIFBEIC0gZG9uZSwgcmMgPSAlZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKwordm9pZCBxZWRfcmRtYV9mcmVlX3BkKHZvaWQgKnJkbWFfY3h0LCB1MTYgcGQpCit7CisJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4gPSAoc3RydWN0IHFlZF9od2ZuICopcmRtYV9jeHQ7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAicGQgPSAlMDh4XG4iLCBwZCk7CisKKwkvKiBSZXR1cm5zIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgcHJvdGVjdGlvbiBkb21haW4gZm9yIHJldXNlICovCisJc3Bpbl9sb2NrX2JoKCZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5sb2NrKTsKKwlxZWRfYm1hcF9yZWxlYXNlX2lkKHBfaHdmbiwgJnBfaHdmbi0+cF9yZG1hX2luZm8tPnBkX21hcCwgcGQpOworCXNwaW5fdW5sb2NrX2JoKCZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5sb2NrKTsKK30KKworc3RhdGljIGVudW0gcWVkX3JkbWFfdG9nZ2xlX2JpdAorcWVkX3JkbWFfdG9nZ2xlX2JpdF9jcmVhdGVfcmVzaXplX2NxKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1MTYgaWNpZCkKK3sKKwlzdHJ1Y3QgcWVkX3JkbWFfaW5mbyAqcF9pbmZvID0gcF9od2ZuLT5wX3JkbWFfaW5mbzsKKwllbnVtIHFlZF9yZG1hX3RvZ2dsZV9iaXQgdG9nZ2xlX2JpdDsKKwl1MzIgYm1hcF9pZDsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJpY2lkID0gJTA4eFxuIiwgaWNpZCk7CisKKwkvKiB0aGUgZnVuY3Rpb24gdG9nZ2xlIHRoZSBiaXQgdGhhdCBpcyByZWxhdGVkIHRvIGEgZ2l2ZW4gaWNpZAorCSAqIGFuZCByZXR1cm5zIHRoZSBuZXcgdG9nZ2xlIGJpdCdzIHZhbHVlCisJICovCisJYm1hcF9pZCA9IGljaWQgLSBxZWRfY3h0X2dldF9wcm90b19jaWRfc3RhcnQocF9od2ZuLCBwX2luZm8tPnByb3RvKTsKKworCXNwaW5fbG9ja19iaCgmcF9pbmZvLT5sb2NrKTsKKwl0b2dnbGVfYml0ID0gIXRlc3RfYW5kX2NoYW5nZV9iaXQoYm1hcF9pZCwKKwkJCQkJICBwX2luZm8tPnRvZ2dsZV9iaXRzLmJpdG1hcCk7CisJc3Bpbl91bmxvY2tfYmgoJnBfaW5mby0+bG9jayk7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiUUVEX1JETUFfVE9HR0xFX0JJVF89ICVkXG4iLAorCQkgICB0b2dnbGVfYml0KTsKKworCXJldHVybiB0b2dnbGVfYml0OworfQorCitpbnQgcWVkX3JkbWFfY3JlYXRlX2NxKHZvaWQgKnJkbWFfY3h0LAorCQkgICAgICAgc3RydWN0IHFlZF9yZG1hX2NyZWF0ZV9jcV9pbl9wYXJhbXMgKnBhcmFtcywgdTE2ICppY2lkKQoreworCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gKHN0cnVjdCBxZWRfaHdmbiAqKXJkbWFfY3h0OworCXN0cnVjdCBxZWRfcmRtYV9pbmZvICpwX2luZm8gPSBwX2h3Zm4tPnBfcmRtYV9pbmZvOworCXN0cnVjdCByZG1hX2NyZWF0ZV9jcV9yYW1yb2RfZGF0YSAqcF9yYW1yb2Q7CisJZW51bSBxZWRfcmRtYV90b2dnbGVfYml0IHRvZ2dsZV9iaXQ7CisJc3RydWN0IHFlZF9zcF9pbml0X2RhdGEgaW5pdF9kYXRhOworCXN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudDsKKwl1MzIgcmV0dXJuZWRfaWQsIHN0YXJ0X2NpZDsKKwlpbnQgcmM7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiY3FfaGFuZGxlID0gJTA4eCUwOHhcbiIsCisJCSAgIHBhcmFtcy0+Y3FfaGFuZGxlX2hpLCBwYXJhbXMtPmNxX2hhbmRsZV9sbyk7CisKKwkvKiBBbGxvY2F0ZSBpY2lkICovCisJc3Bpbl9sb2NrX2JoKCZwX2luZm8tPmxvY2spOworCXJjID0gcWVkX3JkbWFfYm1hcF9hbGxvY19pZChwX2h3Zm4sCisJCQkJICAgICZwX2luZm8tPmNxX21hcCwgJnJldHVybmVkX2lkKTsKKwlzcGluX3VubG9ja19iaCgmcF9pbmZvLT5sb2NrKTsKKworCWlmIChyYykgeworCQlEUF9OT1RJQ0UocF9od2ZuLCAiQ2FuJ3QgY3JlYXRlIENRLCByYyA9ICVkXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlzdGFydF9jaWQgPSBxZWRfY3h0X2dldF9wcm90b19jaWRfc3RhcnQocF9od2ZuLAorCQkJCQkJcF9pbmZvLT5wcm90byk7CisJKmljaWQgPSByZXR1cm5lZF9pZCArIHN0YXJ0X2NpZDsKKworCS8qIENoZWNrIGlmIGljaWQgcmVxdWlyZXMgYSBwYWdlIGFsbG9jYXRpb24gKi8KKwlyYyA9IHFlZF9jeHRfZHluYW1pY19pbHRfYWxsb2MocF9od2ZuLCBRRURfRUxFTV9DWFQsICppY2lkKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJLyogR2V0IFNQUSBlbnRyeSAqLworCW1lbXNldCgmaW5pdF9kYXRhLCAwLCBzaXplb2YoaW5pdF9kYXRhKSk7CisJaW5pdF9kYXRhLmNpZCA9ICppY2lkOworCWluaXRfZGF0YS5vcGFxdWVfZmlkID0gcF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQ7CisJaW5pdF9kYXRhLmNvbXBfbW9kZSA9IFFFRF9TUFFfTU9ERV9FQkxPQ0s7CisKKwkvKiBTZW5kIGNyZWF0ZSBDUSByYW1yb2QgKi8KKwlyYyA9IHFlZF9zcF9pbml0X3JlcXVlc3QocF9od2ZuLCAmcF9lbnQsCisJCQkJIFJETUFfUkFNUk9EX0NSRUFURV9DUSwKKwkJCQkgcF9pbmZvLT5wcm90bywgJmluaXRfZGF0YSk7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCXBfcmFtcm9kID0gJnBfZW50LT5yYW1yb2QucmRtYV9jcmVhdGVfY3E7CisKKwlwX3JhbXJvZC0+Y3FfaGFuZGxlLmhpID0gY3B1X3RvX2xlMzIocGFyYW1zLT5jcV9oYW5kbGVfaGkpOworCXBfcmFtcm9kLT5jcV9oYW5kbGUubG8gPSBjcHVfdG9fbGUzMihwYXJhbXMtPmNxX2hhbmRsZV9sbyk7CisJcF9yYW1yb2QtPmRwaSA9IGNwdV90b19sZTE2KHBhcmFtcy0+ZHBpKTsKKwlwX3JhbXJvZC0+aXNfdHdvX2xldmVsX3BibCA9IHBhcmFtcy0+cGJsX3R3b19sZXZlbDsKKwlwX3JhbXJvZC0+bWF4X2NxZXMgPSBjcHVfdG9fbGUzMihwYXJhbXMtPmNxX3NpemUpOworCURNQV9SRUdQQUlSX0xFKHBfcmFtcm9kLT5wYmxfYWRkciwgcGFyYW1zLT5wYmxfcHRyKTsKKwlwX3JhbXJvZC0+cGJsX251bV9wYWdlcyA9IGNwdV90b19sZTE2KHBhcmFtcy0+cGJsX251bV9wYWdlcyk7CisJcF9yYW1yb2QtPmNucV9pZCA9ICh1OClSRVNDX1NUQVJUKHBfaHdmbiwgUUVEX1JETUFfQ05RX1JBTSkgKworCQkJICAgcGFyYW1zLT5jbnFfaWQ7CisJcF9yYW1yb2QtPmludF90aW1lb3V0ID0gcGFyYW1zLT5pbnRfdGltZW91dDsKKworCS8qIHRvZ2dsZSB0aGUgYml0IGZvciBldmVyeSByZXNpemUgb3IgY3JlYXRlIGNxIGZvciBhIGdpdmVuIGljaWQgKi8KKwl0b2dnbGVfYml0ID0gcWVkX3JkbWFfdG9nZ2xlX2JpdF9jcmVhdGVfcmVzaXplX2NxKHBfaHdmbiwgKmljaWQpOworCisJcF9yYW1yb2QtPnRvZ2dsZV9iaXQgPSB0b2dnbGVfYml0OworCisJcmMgPSBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgTlVMTCk7CisJaWYgKHJjKSB7CisJCS8qIHJlc3RvcmUgdG9nZ2xlIGJpdCAqLworCQlxZWRfcmRtYV90b2dnbGVfYml0X2NyZWF0ZV9yZXNpemVfY3EocF9od2ZuLCAqaWNpZCk7CisJCWdvdG8gZXJyOworCX0KKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJDcmVhdGVkIENRLCByYyA9ICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworCitlcnI6CisJLyogcmVsZWFzZSBhbGxvY2F0ZWQgaWNpZCAqLworCXFlZF9ibWFwX3JlbGVhc2VfaWQocF9od2ZuLCAmcF9pbmZvLT5jcV9tYXAsIHJldHVybmVkX2lkKTsKKwlEUF9OT1RJQ0UocF9od2ZuLCAiQ3JlYXRlIENRIGZhaWxlZCwgcmMgPSAlZFxuIiwgcmMpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgcWVkX3JkbWFfcmVzaXplX2NxKHZvaWQgKnJkbWFfY3h0LAorCQkgICAgICAgc3RydWN0IHFlZF9yZG1hX3Jlc2l6ZV9jcV9pbl9wYXJhbXMgKmluX3BhcmFtcywKKwkJICAgICAgIHN0cnVjdCBxZWRfcmRtYV9yZXNpemVfY3Ffb3V0X3BhcmFtcyAqb3V0X3BhcmFtcykKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiA9IChzdHJ1Y3QgcWVkX2h3Zm4gKilyZG1hX2N4dDsKKwlzdHJ1Y3QgcmRtYV9yZXNpemVfY3Ffb3V0cHV0X3BhcmFtcyAqcF9yYW1yb2RfcmVzOworCXN0cnVjdCByZG1hX3Jlc2l6ZV9jcV9yYW1yb2RfZGF0YSAqcF9yYW1yb2Q7CisJZW51bSBxZWRfcmRtYV90b2dnbGVfYml0IHRvZ2dsZV9iaXQ7CisJc3RydWN0IHFlZF9zcF9pbml0X2RhdGEgaW5pdF9kYXRhOworCXN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudDsKKwlkbWFfYWRkcl90IHJhbXJvZF9yZXNfcGh5czsKKwl1OCBmd19yZXR1cm5fY29kZTsKKwlpbnQgcmMgPSAtRU5PTUVNOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgImljaWQgPSAlMDh4XG4iLCBpbl9wYXJhbXMtPmljaWQpOworCisJcF9yYW1yb2RfcmVzID0KKwkgICAgKHN0cnVjdCByZG1hX3Jlc2l6ZV9jcV9vdXRwdXRfcGFyYW1zICopCisJICAgIGRtYV9hbGxvY19jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCByZG1hX3Jlc2l6ZV9jcV9vdXRwdXRfcGFyYW1zKSwKKwkJCSAgICAgICAmcmFtcm9kX3Jlc19waHlzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBfcmFtcm9kX3JlcykgeworCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAicWVkIHJlc2l6ZSBjcSBmYWlsZWQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgKHJhbXJvZClcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogR2V0IFNQUSBlbnRyeSAqLworCW1lbXNldCgmaW5pdF9kYXRhLCAwLCBzaXplb2YoaW5pdF9kYXRhKSk7CisJaW5pdF9kYXRhLmNpZCA9IGluX3BhcmFtcy0+aWNpZDsKKwlpbml0X2RhdGEub3BhcXVlX2ZpZCA9IHBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkOworCWluaXRfZGF0YS5jb21wX21vZGUgPSBRRURfU1BRX01PREVfRUJMT0NLOworCisJcmMgPSBxZWRfc3BfaW5pdF9yZXF1ZXN0KHBfaHdmbiwgJnBfZW50LAorCQkJCSBSRE1BX1JBTVJPRF9SRVNJWkVfQ1EsCisJCQkJIHBfaHdmbi0+cF9yZG1hX2luZm8tPnByb3RvLCAmaW5pdF9kYXRhKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJcF9yYW1yb2QgPSAmcF9lbnQtPnJhbXJvZC5yZG1hX3Jlc2l6ZV9jcTsKKworCXBfcmFtcm9kLT5mbGFncyA9IDA7CisKKwkvKiB0b2dnbGUgdGhlIGJpdCBmb3IgZXZlcnkgcmVzaXplIG9yIGNyZWF0ZSBjcSBmb3IgYSBnaXZlbiBpY2lkICovCisJdG9nZ2xlX2JpdCA9IHFlZF9yZG1hX3RvZ2dsZV9iaXRfY3JlYXRlX3Jlc2l6ZV9jcShwX2h3Zm4sCisJCQkJCQkJICBpbl9wYXJhbXMtPmljaWQpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBSRE1BX1JFU0laRV9DUV9SQU1ST0RfREFUQV9UT0dHTEVfQklULCB0b2dnbGVfYml0KTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUkRNQV9SRVNJWkVfQ1FfUkFNUk9EX0RBVEFfSVNfVFdPX0xFVkVMX1BCTCwKKwkJICBpbl9wYXJhbXMtPnBibF90d29fbGV2ZWwpOworCisJcF9yYW1yb2QtPnBibF9sb2dfcGFnZV9zaXplID0gaW5fcGFyYW1zLT5wYmxfcGFnZV9zaXplX2xvZyAtIDEyOworCXBfcmFtcm9kLT5wYmxfbnVtX3BhZ2VzID0gY3B1X3RvX2xlMTYoaW5fcGFyYW1zLT5wYmxfbnVtX3BhZ2VzKTsKKwlwX3JhbXJvZC0+bWF4X2NxZXMgPSBjcHVfdG9fbGUzMihpbl9wYXJhbXMtPmNxX3NpemUpOworCURNQV9SRUdQQUlSX0xFKHBfcmFtcm9kLT5wYmxfYWRkciwgaW5fcGFyYW1zLT5wYmxfcHRyKTsKKwlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+b3V0cHV0X3BhcmFtc19hZGRyLCByYW1yb2RfcmVzX3BoeXMpOworCisJcmMgPSBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgJmZ3X3JldHVybl9jb2RlKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJaWYgKGZ3X3JldHVybl9jb2RlICE9IFJETUFfUkVUVVJOX09LKSB7CisJCURQX05PVElDRShwX2h3Zm4sICJmd19yZXR1cm5fY29kZSA9ICVkXG4iLCBmd19yZXR1cm5fY29kZSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJb3V0X3BhcmFtcy0+cHJvZCA9IGxlMzJfdG9fY3B1KHBfcmFtcm9kX3Jlcy0+b2xkX2NxX3Byb2QpOworCW91dF9wYXJhbXMtPmNvbnMgPSBsZTMyX3RvX2NwdShwX3JhbXJvZF9yZXMtPm9sZF9jcV9jb25zKTsKKworCWRtYV9mcmVlX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKKwkJCSAgc2l6ZW9mKHN0cnVjdCByZG1hX3Jlc2l6ZV9jcV9vdXRwdXRfcGFyYW1zKSwKKwkJCSAgcF9yYW1yb2RfcmVzLCByYW1yb2RfcmVzX3BoeXMpOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIlJlc2l6ZWQgQ1EsIHJjID0gJWRcbiIsIHJjKTsKKworCXJldHVybiByYzsKKworZXJyOglkbWFfZnJlZV9jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsCisJCQkgIHNpemVvZihzdHJ1Y3QgcmRtYV9yZXNpemVfY3Ffb3V0cHV0X3BhcmFtcyksCisJCQkgIHBfcmFtcm9kX3JlcywgcmFtcm9kX3Jlc19waHlzKTsKKwlEUF9OT1RJQ0UocF9od2ZuLCAiUmVzaXplZCBDUSwgRmFpbGVkIC0gcmMgPSAlZFxuIiwgcmMpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgcWVkX3JkbWFfZGVzdHJveV9jcSh2b2lkICpyZG1hX2N4dCwKKwkJCXN0cnVjdCBxZWRfcmRtYV9kZXN0cm95X2NxX2luX3BhcmFtcyAqaW5fcGFyYW1zLAorCQkJc3RydWN0IHFlZF9yZG1hX2Rlc3Ryb3lfY3Ffb3V0X3BhcmFtcyAqb3V0X3BhcmFtcykKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiA9IChzdHJ1Y3QgcWVkX2h3Zm4gKilyZG1hX2N4dDsKKwlzdHJ1Y3QgcmRtYV9kZXN0cm95X2NxX291dHB1dF9wYXJhbXMgKnBfcmFtcm9kX3JlczsKKwlzdHJ1Y3QgcmRtYV9kZXN0cm95X2NxX3JhbXJvZF9kYXRhICpwX3JhbXJvZDsKKwlzdHJ1Y3QgcWVkX3NwX2luaXRfZGF0YSBpbml0X2RhdGE7CisJc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50OworCWRtYV9hZGRyX3QgcmFtcm9kX3Jlc19waHlzOworCWludCByYyA9IC1FTk9NRU07CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiaWNpZCA9ICUwOHhcbiIsIGluX3BhcmFtcy0+aWNpZCk7CisKKwlwX3JhbXJvZF9yZXMgPQorCSAgICAoc3RydWN0IHJkbWFfZGVzdHJveV9jcV9vdXRwdXRfcGFyYW1zICopCisJICAgIGRtYV9hbGxvY19jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCByZG1hX2Rlc3Ryb3lfY3Ffb3V0cHV0X3BhcmFtcyksCisJCQkgICAgICAgJnJhbXJvZF9yZXNfcGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKCFwX3JhbXJvZF9yZXMpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCSAgInFlZCBkZXN0cm95IGNxIGZhaWxlZDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSAocmFtcm9kKVxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBHZXQgU1BRIGVudHJ5ICovCisJbWVtc2V0KCZpbml0X2RhdGEsIDAsIHNpemVvZihpbml0X2RhdGEpKTsKKwlpbml0X2RhdGEuY2lkID0gaW5fcGFyYW1zLT5pY2lkOworCWluaXRfZGF0YS5vcGFxdWVfZmlkID0gcF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQ7CisJaW5pdF9kYXRhLmNvbXBfbW9kZSA9IFFFRF9TUFFfTU9ERV9FQkxPQ0s7CisKKwkvKiBTZW5kIGRlc3Ryb3kgQ1EgcmFtcm9kICovCisJcmMgPSBxZWRfc3BfaW5pdF9yZXF1ZXN0KHBfaHdmbiwgJnBfZW50LAorCQkJCSBSRE1BX1JBTVJPRF9ERVNUUk9ZX0NRLAorCQkJCSBwX2h3Zm4tPnBfcmRtYV9pbmZvLT5wcm90bywgJmluaXRfZGF0YSk7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCXBfcmFtcm9kID0gJnBfZW50LT5yYW1yb2QucmRtYV9kZXN0cm95X2NxOworCURNQV9SRUdQQUlSX0xFKHBfcmFtcm9kLT5vdXRwdXRfcGFyYW1zX2FkZHIsIHJhbXJvZF9yZXNfcGh5cyk7CisKKwlyYyA9IHFlZF9zcHFfcG9zdChwX2h3Zm4sIHBfZW50LCBOVUxMKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJb3V0X3BhcmFtcy0+bnVtX2NxX25vdGlmID0gbGUxNl90b19jcHUocF9yYW1yb2RfcmVzLT5jbnFfbnVtKTsKKworCWRtYV9mcmVlX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKKwkJCSAgc2l6ZW9mKHN0cnVjdCByZG1hX2Rlc3Ryb3lfY3Ffb3V0cHV0X3BhcmFtcyksCisJCQkgIHBfcmFtcm9kX3JlcywgcmFtcm9kX3Jlc19waHlzKTsKKworCS8qIEZyZWUgaWNpZCAqLworCXNwaW5fbG9ja19iaCgmcF9od2ZuLT5wX3JkbWFfaW5mby0+bG9jayk7CisKKwlxZWRfYm1hcF9yZWxlYXNlX2lkKHBfaHdmbiwKKwkJCSAgICAmcF9od2ZuLT5wX3JkbWFfaW5mby0+Y3FfbWFwLAorCQkJICAgIChpbl9wYXJhbXMtPmljaWQgLQorCQkJICAgICBxZWRfY3h0X2dldF9wcm90b19jaWRfc3RhcnQocF9od2ZuLAorCQkJCQkJCSBwX2h3Zm4tPgorCQkJCQkJCSBwX3JkbWFfaW5mby0+cHJvdG8pKSk7CisKKwlzcGluX3VubG9ja19iaCgmcF9od2ZuLT5wX3JkbWFfaW5mby0+bG9jayk7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiRGVzdHJveWVkIENRLCByYyA9ICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworCitlcnI6CWRtYV9mcmVlX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKKwkJCSAgc2l6ZW9mKHN0cnVjdCByZG1hX2Rlc3Ryb3lfY3Ffb3V0cHV0X3BhcmFtcyksCisJCQkgIHBfcmFtcm9kX3JlcywgcmFtcm9kX3Jlc19waHlzKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgcWVkX3JkbWFfc2V0X2Z3X21hYyh1MTYgKnBfZndfbWFjLCB1OCAqcF9xZWRfbWFjKQoreworCXBfZndfbWFjWzBdID0gY3B1X3RvX2xlMTYoKHBfcWVkX21hY1swXSA8PCA4KSArIHBfcWVkX21hY1sxXSk7CisJcF9md19tYWNbMV0gPSBjcHVfdG9fbGUxNigocF9xZWRfbWFjWzJdIDw8IDgpICsgcF9xZWRfbWFjWzNdKTsKKwlwX2Z3X21hY1syXSA9IGNwdV90b19sZTE2KChwX3FlZF9tYWNbNF0gPDwgOCkgKyBwX3FlZF9tYWNbNV0pOworfQorCitzdGF0aWMgdm9pZCBxZWRfcmRtYV9jb3B5X2dpZHMoc3RydWN0IHFlZF9yZG1hX3FwICpxcCwgX19sZTMyICpzcmNfZ2lkLAorCQkJICAgICAgIF9fbGUzMiAqZHN0X2dpZCkKK3sKKwl1MzIgaTsKKworCWlmIChxcC0+cm9jZV9tb2RlID09IFJPQ0VfVjJfSVBWNCkgeworCQkvKiBUaGUgSVB2NCBhZGRyZXNzZXMgc2hhbGwgYmUgYWxpZ25lZCB0byB0aGUgaGlnaGVzdCB3b3JkLgorCQkgKiBUaGUgbG93ZXIgd29yZHMgbXVzdCBiZSB6ZXJvLgorCQkgKi8KKwkJbWVtc2V0KHNyY19naWQsIDAsIHNpemVvZih1bmlvbiBxZWRfZ2lkKSk7CisJCW1lbXNldChkc3RfZ2lkLCAwLCBzaXplb2YodW5pb24gcWVkX2dpZCkpOworCQlzcmNfZ2lkWzNdID0gY3B1X3RvX2xlMzIocXAtPnNnaWQuaXB2NF9hZGRyKTsKKwkJZHN0X2dpZFszXSA9IGNwdV90b19sZTMyKHFwLT5kZ2lkLmlwdjRfYWRkcik7CisJfSBlbHNlIHsKKwkJLyogR0lEcyBhbmQgSVB2NiBhZGRyZXNzZXMgY29pbmNpZGUgaW4gbG9jYXRpb24gYW5kIHNpemUgKi8KKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocXAtPnNnaWQuZHdvcmRzKTsgaSsrKSB7CisJCQlzcmNfZ2lkW2ldID0gY3B1X3RvX2xlMzIocXAtPnNnaWQuZHdvcmRzW2ldKTsKKwkJCWRzdF9naWRbaV0gPSBjcHVfdG9fbGUzMihxcC0+ZGdpZC5kd29yZHNbaV0pOworCQl9CisJfQorfQorCitzdGF0aWMgZW51bSByb2NlX2ZsYXZvciBxZWRfcm9jZV9tb2RlX3RvX2ZsYXZvcihlbnVtIHJvY2VfbW9kZSByb2NlX21vZGUpCit7CisJZW51bSByb2NlX2ZsYXZvciBmbGF2b3I7CisKKwlzd2l0Y2ggKHJvY2VfbW9kZSkgeworCWNhc2UgUk9DRV9WMToKKwkJZmxhdm9yID0gUExBSU5fUk9DRTsKKwkJYnJlYWs7CisJY2FzZSBST0NFX1YyX0lQVjQ6CisJCWZsYXZvciA9IFJST0NFX0lQVjQ7CisJCWJyZWFrOworCWNhc2UgUk9DRV9WMl9JUFY2OgorCQlmbGF2b3IgPSBST0NFX1YyX0lQVjY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZsYXZvciA9IE1BWF9ST0NFX01PREU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZmxhdm9yOworfQorCitpbnQgcWVkX3JvY2VfYWxsb2NfY2lkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1MTYgKmNpZCkKK3sKKwlzdHJ1Y3QgcWVkX3JkbWFfaW5mbyAqcF9yZG1hX2luZm8gPSBwX2h3Zm4tPnBfcmRtYV9pbmZvOworCXUzMiByZXNwb25kZXJfaWNpZDsKKwl1MzIgcmVxdWVzdGVyX2ljaWQ7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2JoKCZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5sb2NrKTsKKwlyYyA9IHFlZF9yZG1hX2JtYXBfYWxsb2NfaWQocF9od2ZuLCAmcF9yZG1hX2luZm8tPmNpZF9tYXAsCisJCQkJICAgICZyZXNwb25kZXJfaWNpZCk7CisJaWYgKHJjKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZwX3JkbWFfaW5mby0+bG9jayk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IHFlZF9yZG1hX2JtYXBfYWxsb2NfaWQocF9od2ZuLCAmcF9yZG1hX2luZm8tPmNpZF9tYXAsCisJCQkJICAgICZyZXF1ZXN0ZXJfaWNpZCk7CisKKwlzcGluX3VubG9ja19iaCgmcF9yZG1hX2luZm8tPmxvY2spOworCWlmIChyYykKKwkJZ290byBlcnI7CisKKwkvKiB0aGUgdHdvIGljaWQncyBzaG91bGQgYmUgYWRqYWNlbnQgKi8KKwlpZiAoKHJlcXVlc3Rlcl9pY2lkIC0gcmVzcG9uZGVyX2ljaWQpICE9IDEpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSB0d28gYWRqYWNlbnQgcXAncydcbiIpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCXJlc3BvbmRlcl9pY2lkICs9IHFlZF9jeHRfZ2V0X3Byb3RvX2NpZF9zdGFydChwX2h3Zm4sCisJCQkJCQkgICAgICBwX3JkbWFfaW5mby0+cHJvdG8pOworCXJlcXVlc3Rlcl9pY2lkICs9IHFlZF9jeHRfZ2V0X3Byb3RvX2NpZF9zdGFydChwX2h3Zm4sCisJCQkJCQkgICAgICBwX3JkbWFfaW5mby0+cHJvdG8pOworCisJLyogSWYgdGhlc2UgaWNpZHMgcmVxdWlyZSBhIG5ldyBJTFQgbGluZSBhbGxvY2F0ZSBETUEtYWJsZSBjb250ZXh0IGZvcgorCSAqIGFuIElMVCBwYWdlCisJICovCisJcmMgPSBxZWRfY3h0X2R5bmFtaWNfaWx0X2FsbG9jKHBfaHdmbiwgUUVEX0VMRU1fQ1hULCByZXNwb25kZXJfaWNpZCk7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCXJjID0gcWVkX2N4dF9keW5hbWljX2lsdF9hbGxvYyhwX2h3Zm4sIFFFRF9FTEVNX0NYVCwgcmVxdWVzdGVyX2ljaWQpOworCWlmIChyYykKKwkJZ290byBlcnI7CisKKwkqY2lkID0gKHUxNilyZXNwb25kZXJfaWNpZDsKKwlyZXR1cm4gcmM7CisKK2VycjoKKwlzcGluX2xvY2tfYmgoJnBfcmRtYV9pbmZvLT5sb2NrKTsKKwlxZWRfYm1hcF9yZWxlYXNlX2lkKHBfaHdmbiwgJnBfcmRtYV9pbmZvLT5jaWRfbWFwLCByZXNwb25kZXJfaWNpZCk7CisJcWVkX2JtYXBfcmVsZWFzZV9pZChwX2h3Zm4sICZwX3JkbWFfaW5mby0+Y2lkX21hcCwgcmVxdWVzdGVyX2ljaWQpOworCisJc3Bpbl91bmxvY2tfYmgoJnBfcmRtYV9pbmZvLT5sb2NrKTsKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLAorCQkgICAiQWxsb2NhdGUgQ0lEIC0gZmFpbGVkLCByYyA9ICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHFlZF9yb2NlX3NwX2NyZWF0ZV9yZXNwb25kZXIoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCXN0cnVjdCBxZWRfcmRtYV9xcCAqcXApCit7CisJc3RydWN0IHJvY2VfY3JlYXRlX3FwX3Jlc3BfcmFtcm9kX2RhdGEgKnBfcmFtcm9kOworCXN0cnVjdCBxZWRfc3BfaW5pdF9kYXRhIGluaXRfZGF0YTsKKwl1bmlvbiBxZWRfcW1fcHFfcGFyYW1zIHFtX3BhcmFtczsKKwllbnVtIHJvY2VfZmxhdm9yIHJvY2VfZmxhdm9yOworCXN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudDsKKwl1MTYgcGh5c2ljYWxfcXVldWUwID0gMDsKKwlpbnQgcmM7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiaWNpZCA9ICUwOHhcbiIsIHFwLT5pY2lkKTsKKworCS8qIEFsbG9jYXRlIERNQS1hYmxlIG1lbW9yeSBmb3IgSVJRICovCisJcXAtPmlycV9udW1fcGFnZXMgPSAxOworCXFwLT5pcnEgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAorCQkJCSAgICAgUkRNQV9SSU5HX1BBR0VfU0laRSwKKwkJCQkgICAgICZxcC0+aXJxX3BoeXNfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxcC0+aXJxKSB7CisJCXJjID0gLUVOT01FTTsKKwkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCSAgInFlZCBjcmVhdGUgcmVzcG9uZGVyIGZhaWxlZDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSAoaXJxKS4gcmMgPSAlZFxuIiwKKwkJCSAgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogR2V0IFNQUSBlbnRyeSAqLworCW1lbXNldCgmaW5pdF9kYXRhLCAwLCBzaXplb2YoaW5pdF9kYXRhKSk7CisJaW5pdF9kYXRhLmNpZCA9IHFwLT5pY2lkOworCWluaXRfZGF0YS5vcGFxdWVfZmlkID0gcF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQ7CisJaW5pdF9kYXRhLmNvbXBfbW9kZSA9IFFFRF9TUFFfTU9ERV9FQkxPQ0s7CisKKwlyYyA9IHFlZF9zcF9pbml0X3JlcXVlc3QocF9od2ZuLCAmcF9lbnQsIFJPQ0VfUkFNUk9EX0NSRUFURV9RUCwKKwkJCQkgUFJPVE9DT0xJRF9ST0NFLCAmaW5pdF9kYXRhKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJcF9yYW1yb2QgPSAmcF9lbnQtPnJhbXJvZC5yb2NlX2NyZWF0ZV9xcF9yZXNwOworCisJcF9yYW1yb2QtPmZsYWdzID0gMDsKKworCXJvY2VfZmxhdm9yID0gcWVkX3JvY2VfbW9kZV90b19mbGF2b3IocXAtPnJvY2VfbW9kZSk7CisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX0NSRUFURV9RUF9SRVNQX1JBTVJPRF9EQVRBX1JPQ0VfRkxBVk9SLCByb2NlX2ZsYXZvcik7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfQ1JFQVRFX1FQX1JFU1BfUkFNUk9EX0RBVEFfUkRNQV9SRF9FTiwKKwkJICBxcC0+aW5jb21pbmdfcmRtYV9yZWFkX2VuKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9DUkVBVEVfUVBfUkVTUF9SQU1ST0RfREFUQV9SRE1BX1dSX0VOLAorCQkgIHFwLT5pbmNvbWluZ19yZG1hX3dyaXRlX2VuKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9DUkVBVEVfUVBfUkVTUF9SQU1ST0RfREFUQV9BVE9NSUNfRU4sCisJCSAgcXAtPmluY29taW5nX2F0b21pY19lbik7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfQ1JFQVRFX1FQX1JFU1BfUkFNUk9EX0RBVEFfRTJFX0ZMT1dfQ09OVFJPTF9FTiwKKwkJICBxcC0+ZTJlX2Zsb3dfY29udHJvbF9lbik7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfQ1JFQVRFX1FQX1JFU1BfUkFNUk9EX0RBVEFfU1JRX0ZMRywgcXAtPnVzZV9zcnEpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX0NSRUFURV9RUF9SRVNQX1JBTVJPRF9EQVRBX1JFU0VSVkVEX0tFWV9FTiwKKwkJICBxcC0+Zm1yX2FuZF9yZXNlcnZlZF9sa2V5KTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9DUkVBVEVfUVBfUkVTUF9SQU1ST0RfREFUQV9NSU5fUk5SX05BS19USU1FUiwKKwkJICBxcC0+bWluX3Jucl9uYWtfdGltZXIpOworCisJcF9yYW1yb2QtPm1heF9pcmQgPSBxcC0+bWF4X3JkX2F0b21pY19yZXNwOworCXBfcmFtcm9kLT50cmFmZmljX2NsYXNzID0gcXAtPnRyYWZmaWNfY2xhc3NfdG9zOworCXBfcmFtcm9kLT5ob3BfbGltaXQgPSBxcC0+aG9wX2xpbWl0X3R0bDsKKwlwX3JhbXJvZC0+aXJxX251bV9wYWdlcyA9IHFwLT5pcnFfbnVtX3BhZ2VzOworCXBfcmFtcm9kLT5wX2tleSA9IGNwdV90b19sZTE2KHFwLT5wa2V5KTsKKwlwX3JhbXJvZC0+Zmxvd19sYWJlbCA9IGNwdV90b19sZTMyKHFwLT5mbG93X2xhYmVsKTsKKwlwX3JhbXJvZC0+ZHN0X3FwX2lkID0gY3B1X3RvX2xlMzIocXAtPmRlc3RfcXApOworCXBfcmFtcm9kLT5tdHUgPSBjcHVfdG9fbGUxNihxcC0+bXR1KTsKKwlwX3JhbXJvZC0+aW5pdGlhbF9wc24gPSBjcHVfdG9fbGUzMihxcC0+cnFfcHNuKTsKKwlwX3JhbXJvZC0+cGQgPSBjcHVfdG9fbGUxNihxcC0+cGQpOworCXBfcmFtcm9kLT5ycV9udW1fcGFnZXMgPSBjcHVfdG9fbGUxNihxcC0+cnFfbnVtX3BhZ2VzKTsKKwlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+cnFfcGJsX2FkZHIsIHFwLT5ycV9wYmxfcHRyKTsKKwlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+aXJxX3BibF9hZGRyLCBxcC0+aXJxX3BoeXNfYWRkcik7CisJcWVkX3JkbWFfY29weV9naWRzKHFwLCBwX3JhbXJvZC0+c3JjX2dpZCwgcF9yYW1yb2QtPmRzdF9naWQpOworCXBfcmFtcm9kLT5xcF9oYW5kbGVfZm9yX2FzeW5jLmhpID0gY3B1X3RvX2xlMzIocXAtPnFwX2hhbmRsZV9hc3luYy5oaSk7CisJcF9yYW1yb2QtPnFwX2hhbmRsZV9mb3JfYXN5bmMubG8gPSBjcHVfdG9fbGUzMihxcC0+cXBfaGFuZGxlX2FzeW5jLmxvKTsKKwlwX3JhbXJvZC0+cXBfaGFuZGxlX2Zvcl9jcWUuaGkgPSBjcHVfdG9fbGUzMihxcC0+cXBfaGFuZGxlLmhpKTsKKwlwX3JhbXJvZC0+cXBfaGFuZGxlX2Zvcl9jcWUubG8gPSBjcHVfdG9fbGUzMihxcC0+cXBfaGFuZGxlLmxvKTsKKwlwX3JhbXJvZC0+c3RhdHNfY291bnRlcl9pZCA9IHBfaHdmbi0+cmVsX3BmX2lkOworCXBfcmFtcm9kLT5jcV9jaWQgPSBjcHVfdG9fbGUzMigocF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQgPDwgMTYpIHwKKwkJCQkgICAgICAgcXAtPnJxX2NxX2lkKTsKKworCW1lbXNldCgmcW1fcGFyYW1zLCAwLCBzaXplb2YocW1fcGFyYW1zKSk7CisJcW1fcGFyYW1zLnJvY2UucXBpZCA9IHFwLT5pY2lkID4+IDE7CisJcGh5c2ljYWxfcXVldWUwID0gcWVkX2dldF9xbV9wcShwX2h3Zm4sIFBST1RPQ09MSURfUk9DRSwgJnFtX3BhcmFtcyk7CisKKwlwX3JhbXJvZC0+cGh5c2ljYWxfcXVldWUwID0gY3B1X3RvX2xlMTYocGh5c2ljYWxfcXVldWUwKTsKKwlwX3JhbXJvZC0+ZHBpID0gY3B1X3RvX2xlMTYocXAtPmRwaSk7CisKKwlxZWRfcmRtYV9zZXRfZndfbWFjKHBfcmFtcm9kLT5yZW1vdGVfbWFjX2FkZHIsIHFwLT5yZW1vdGVfbWFjX2FkZHIpOworCXFlZF9yZG1hX3NldF9md19tYWMocF9yYW1yb2QtPmxvY2FsX21hY19hZGRyLCBxcC0+bG9jYWxfbWFjX2FkZHIpOworCisJcF9yYW1yb2QtPnVkcF9zcmNfcG9ydCA9IHFwLT51ZHBfc3JjX3BvcnQ7CisJcF9yYW1yb2QtPnZsYW5faWQgPSBjcHVfdG9fbGUxNihxcC0+dmxhbl9pZCk7CisJcF9yYW1yb2QtPnNycV9pZC5zcnFfaWR4ID0gY3B1X3RvX2xlMTYocXAtPnNycV9pZCk7CisJcF9yYW1yb2QtPnNycV9pZC5vcGFxdWVfZmlkID0gY3B1X3RvX2xlMTYocF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQpOworCisJcF9yYW1yb2QtPnN0YXRzX2NvdW50ZXJfaWQgPSBSRVNDX1NUQVJUKHBfaHdmbiwgUUVEX1JETUFfU1RBVFNfUVVFVUUpICsKKwkJCQkgICAgIHFwLT5zdGF0c19xdWV1ZTsKKworCXJjID0gcWVkX3NwcV9wb3N0KHBfaHdmbiwgcF9lbnQsIE5VTEwpOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgInJjID0gJWQgcGh5c2ljYWxfcXVldWUwID0gMHgleFxuIiwKKwkJICAgcmMsIHBoeXNpY2FsX3F1ZXVlMCk7CisKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJcXAtPnJlc3Bfb2ZmbG9hZGVkID0gdHJ1ZTsKKworCXJldHVybiByYzsKKworZXJyOgorCURQX05PVElDRShwX2h3Zm4sICJjcmVhdGUgcmVzcG9uZGVyIC0gZmFpbGVkLCByYyA9ICVkXG4iLCByYyk7CisJZG1hX2ZyZWVfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAorCQkJICBxcC0+aXJxX251bV9wYWdlcyAqIFJETUFfUklOR19QQUdFX1NJWkUsCisJCQkgIHFwLT5pcnEsIHFwLT5pcnFfcGh5c19hZGRyKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBxZWRfcm9jZV9zcF9jcmVhdGVfcmVxdWVzdGVyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQlzdHJ1Y3QgcWVkX3JkbWFfcXAgKnFwKQoreworCXN0cnVjdCByb2NlX2NyZWF0ZV9xcF9yZXFfcmFtcm9kX2RhdGEgKnBfcmFtcm9kOworCXN0cnVjdCBxZWRfc3BfaW5pdF9kYXRhIGluaXRfZGF0YTsKKwl1bmlvbiBxZWRfcW1fcHFfcGFyYW1zIHFtX3BhcmFtczsKKwllbnVtIHJvY2VfZmxhdm9yIHJvY2VfZmxhdm9yOworCXN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudDsKKwl1MTYgcGh5c2ljYWxfcXVldWUwID0gMDsKKwlpbnQgcmM7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiaWNpZCA9ICUwOHhcbiIsIHFwLT5pY2lkKTsKKworCS8qIEFsbG9jYXRlIERNQS1hYmxlIG1lbW9yeSBmb3IgT1JRICovCisJcXAtPm9ycV9udW1fcGFnZXMgPSAxOworCXFwLT5vcnEgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAorCQkJCSAgICAgUkRNQV9SSU5HX1BBR0VfU0laRSwKKwkJCQkgICAgICZxcC0+b3JxX3BoeXNfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxcC0+b3JxKSB7CisJCXJjID0gLUVOT01FTTsKKwkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCSAgInFlZCBjcmVhdGUgcmVxdWVzdGVyIGZhaWxlZDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSAob3JxKS4gcmMgPSAlZFxuIiwKKwkJCSAgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogR2V0IFNQUSBlbnRyeSAqLworCW1lbXNldCgmaW5pdF9kYXRhLCAwLCBzaXplb2YoaW5pdF9kYXRhKSk7CisJaW5pdF9kYXRhLmNpZCA9IHFwLT5pY2lkICsgMTsKKwlpbml0X2RhdGEub3BhcXVlX2ZpZCA9IHBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkOworCWluaXRfZGF0YS5jb21wX21vZGUgPSBRRURfU1BRX01PREVfRUJMT0NLOworCisJcmMgPSBxZWRfc3BfaW5pdF9yZXF1ZXN0KHBfaHdmbiwgJnBfZW50LAorCQkJCSBST0NFX1JBTVJPRF9DUkVBVEVfUVAsCisJCQkJIFBST1RPQ09MSURfUk9DRSwgJmluaXRfZGF0YSk7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCXBfcmFtcm9kID0gJnBfZW50LT5yYW1yb2Qucm9jZV9jcmVhdGVfcXBfcmVxOworCisJcF9yYW1yb2QtPmZsYWdzID0gMDsKKworCXJvY2VfZmxhdm9yID0gcWVkX3JvY2VfbW9kZV90b19mbGF2b3IocXAtPnJvY2VfbW9kZSk7CisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX0NSRUFURV9RUF9SRVFfUkFNUk9EX0RBVEFfUk9DRV9GTEFWT1IsIHJvY2VfZmxhdm9yKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9DUkVBVEVfUVBfUkVRX1JBTVJPRF9EQVRBX0ZNUl9BTkRfUkVTRVJWRURfRU4sCisJCSAgcXAtPmZtcl9hbmRfcmVzZXJ2ZWRfbGtleSk7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfQ1JFQVRFX1FQX1JFUV9SQU1ST0RfREFUQV9TSUdOQUxFRF9DT01QLCBxcC0+c2lnbmFsX2FsbCk7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfQ1JFQVRFX1FQX1JFUV9SQU1ST0RfREFUQV9FUlJfUkVUUllfQ05ULCBxcC0+cmV0cnlfY250KTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9DUkVBVEVfUVBfUkVRX1JBTVJPRF9EQVRBX1JOUl9OQUtfQ05ULAorCQkgIHFwLT5ybnJfcmV0cnlfY250KTsKKworCXBfcmFtcm9kLT5tYXhfb3JkID0gcXAtPm1heF9yZF9hdG9taWNfcmVxOworCXBfcmFtcm9kLT50cmFmZmljX2NsYXNzID0gcXAtPnRyYWZmaWNfY2xhc3NfdG9zOworCXBfcmFtcm9kLT5ob3BfbGltaXQgPSBxcC0+aG9wX2xpbWl0X3R0bDsKKwlwX3JhbXJvZC0+b3JxX251bV9wYWdlcyA9IHFwLT5vcnFfbnVtX3BhZ2VzOworCXBfcmFtcm9kLT5wX2tleSA9IGNwdV90b19sZTE2KHFwLT5wa2V5KTsKKwlwX3JhbXJvZC0+Zmxvd19sYWJlbCA9IGNwdV90b19sZTMyKHFwLT5mbG93X2xhYmVsKTsKKwlwX3JhbXJvZC0+ZHN0X3FwX2lkID0gY3B1X3RvX2xlMzIocXAtPmRlc3RfcXApOworCXBfcmFtcm9kLT5hY2tfdGltZW91dF92YWwgPSBjcHVfdG9fbGUzMihxcC0+YWNrX3RpbWVvdXQpOworCXBfcmFtcm9kLT5tdHUgPSBjcHVfdG9fbGUxNihxcC0+bXR1KTsKKwlwX3JhbXJvZC0+aW5pdGlhbF9wc24gPSBjcHVfdG9fbGUzMihxcC0+c3FfcHNuKTsKKwlwX3JhbXJvZC0+cGQgPSBjcHVfdG9fbGUxNihxcC0+cGQpOworCXBfcmFtcm9kLT5zcV9udW1fcGFnZXMgPSBjcHVfdG9fbGUxNihxcC0+c3FfbnVtX3BhZ2VzKTsKKwlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+c3FfcGJsX2FkZHIsIHFwLT5zcV9wYmxfcHRyKTsKKwlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+b3JxX3BibF9hZGRyLCBxcC0+b3JxX3BoeXNfYWRkcik7CisJcWVkX3JkbWFfY29weV9naWRzKHFwLCBwX3JhbXJvZC0+c3JjX2dpZCwgcF9yYW1yb2QtPmRzdF9naWQpOworCXBfcmFtcm9kLT5xcF9oYW5kbGVfZm9yX2FzeW5jLmhpID0gY3B1X3RvX2xlMzIocXAtPnFwX2hhbmRsZV9hc3luYy5oaSk7CisJcF9yYW1yb2QtPnFwX2hhbmRsZV9mb3JfYXN5bmMubG8gPSBjcHVfdG9fbGUzMihxcC0+cXBfaGFuZGxlX2FzeW5jLmxvKTsKKwlwX3JhbXJvZC0+cXBfaGFuZGxlX2Zvcl9jcWUuaGkgPSBjcHVfdG9fbGUzMihxcC0+cXBfaGFuZGxlLmhpKTsKKwlwX3JhbXJvZC0+cXBfaGFuZGxlX2Zvcl9jcWUubG8gPSBjcHVfdG9fbGUzMihxcC0+cXBfaGFuZGxlLmxvKTsKKwlwX3JhbXJvZC0+c3RhdHNfY291bnRlcl9pZCA9IHBfaHdmbi0+cmVsX3BmX2lkOworCXBfcmFtcm9kLT5jcV9jaWQgPSBjcHVfdG9fbGUzMigocF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQgPDwgMTYpIHwKKwkJCQkgICAgICAgcXAtPnNxX2NxX2lkKTsKKworCW1lbXNldCgmcW1fcGFyYW1zLCAwLCBzaXplb2YocW1fcGFyYW1zKSk7CisJcW1fcGFyYW1zLnJvY2UucXBpZCA9IHFwLT5pY2lkID4+IDE7CisJcGh5c2ljYWxfcXVldWUwID0gcWVkX2dldF9xbV9wcShwX2h3Zm4sIFBST1RPQ09MSURfUk9DRSwgJnFtX3BhcmFtcyk7CisKKwlwX3JhbXJvZC0+cGh5c2ljYWxfcXVldWUwID0gY3B1X3RvX2xlMTYocGh5c2ljYWxfcXVldWUwKTsKKwlwX3JhbXJvZC0+ZHBpID0gY3B1X3RvX2xlMTYocXAtPmRwaSk7CisKKwlxZWRfcmRtYV9zZXRfZndfbWFjKHBfcmFtcm9kLT5yZW1vdGVfbWFjX2FkZHIsIHFwLT5yZW1vdGVfbWFjX2FkZHIpOworCXFlZF9yZG1hX3NldF9md19tYWMocF9yYW1yb2QtPmxvY2FsX21hY19hZGRyLCBxcC0+bG9jYWxfbWFjX2FkZHIpOworCisJcF9yYW1yb2QtPnVkcF9zcmNfcG9ydCA9IHFwLT51ZHBfc3JjX3BvcnQ7CisJcF9yYW1yb2QtPnZsYW5faWQgPSBjcHVfdG9fbGUxNihxcC0+dmxhbl9pZCk7CisJcF9yYW1yb2QtPnN0YXRzX2NvdW50ZXJfaWQgPSBSRVNDX1NUQVJUKHBfaHdmbiwgUUVEX1JETUFfU1RBVFNfUVVFVUUpICsKKwkJCQkgICAgIHFwLT5zdGF0c19xdWV1ZTsKKworCXJjID0gcWVkX3NwcV9wb3N0KHBfaHdmbiwgcF9lbnQsIE5VTEwpOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgInJjID0gJWRcbiIsIHJjKTsKKworCWlmIChyYykKKwkJZ290byBlcnI7CisKKwlxcC0+cmVxX29mZmxvYWRlZCA9IHRydWU7CisKKwlyZXR1cm4gcmM7CisKK2VycjoKKwlEUF9OT1RJQ0UocF9od2ZuLCAiQ3JlYXRlIHJlcXVlc3RlZCAtIGZhaWxlZCwgcmMgPSAlZFxuIiwgcmMpOworCWRtYV9mcmVlX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKKwkJCSAgcXAtPm9ycV9udW1fcGFnZXMgKiBSRE1BX1JJTkdfUEFHRV9TSVpFLAorCQkJICBxcC0+b3JxLCBxcC0+b3JxX3BoeXNfYWRkcik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHFlZF9yb2NlX3NwX21vZGlmeV9yZXNwb25kZXIoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCXN0cnVjdCBxZWRfcmRtYV9xcCAqcXAsCisJCQkJCWJvb2wgbW92ZV90b19lcnIsIHUzMiBtb2RpZnlfZmxhZ3MpCit7CisJc3RydWN0IHJvY2VfbW9kaWZ5X3FwX3Jlc3BfcmFtcm9kX2RhdGEgKnBfcmFtcm9kOworCXN0cnVjdCBxZWRfc3BfaW5pdF9kYXRhIGluaXRfZGF0YTsKKwlzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQ7CisJaW50IHJjOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgImljaWQgPSAlMDh4XG4iLCBxcC0+aWNpZCk7CisKKwlpZiAobW92ZV90b19lcnIgJiYgIXFwLT5yZXNwX29mZmxvYWRlZCkKKwkJcmV0dXJuIDA7CisKKwkvKiBHZXQgU1BRIGVudHJ5ICovCisJbWVtc2V0KCZpbml0X2RhdGEsIDAsIHNpemVvZihpbml0X2RhdGEpKTsKKwlpbml0X2RhdGEuY2lkID0gcXAtPmljaWQ7CisJaW5pdF9kYXRhLm9wYXF1ZV9maWQgPSBwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZDsKKwlpbml0X2RhdGEuY29tcF9tb2RlID0gUUVEX1NQUV9NT0RFX0VCTE9DSzsKKworCXJjID0gcWVkX3NwX2luaXRfcmVxdWVzdChwX2h3Zm4sICZwX2VudCwKKwkJCQkgUk9DRV9FVkVOVF9NT0RJRllfUVAsCisJCQkJIFBST1RPQ09MSURfUk9DRSwgJmluaXRfZGF0YSk7CisJaWYgKHJjKSB7CisJCURQX05PVElDRShwX2h3Zm4sICJyYyA9ICVkXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlwX3JhbXJvZCA9ICZwX2VudC0+cmFtcm9kLnJvY2VfbW9kaWZ5X3FwX3Jlc3A7CisKKwlwX3JhbXJvZC0+ZmxhZ3MgPSAwOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX01PRElGWV9RUF9SRVNQX1JBTVJPRF9EQVRBX01PVkVfVE9fRVJSX0ZMRywgbW92ZV90b19lcnIpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX01PRElGWV9RUF9SRVNQX1JBTVJPRF9EQVRBX1JETUFfUkRfRU4sCisJCSAgcXAtPmluY29taW5nX3JkbWFfcmVhZF9lbik7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfTU9ESUZZX1FQX1JFU1BfUkFNUk9EX0RBVEFfUkRNQV9XUl9FTiwKKwkJICBxcC0+aW5jb21pbmdfcmRtYV93cml0ZV9lbik7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfTU9ESUZZX1FQX1JFU1BfUkFNUk9EX0RBVEFfQVRPTUlDX0VOLAorCQkgIHFwLT5pbmNvbWluZ19hdG9taWNfZW4pOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX0NSRUFURV9RUF9SRVNQX1JBTVJPRF9EQVRBX0UyRV9GTE9XX0NPTlRST0xfRU4sCisJCSAgcXAtPmUyZV9mbG93X2NvbnRyb2xfZW4pOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX01PRElGWV9RUF9SRVNQX1JBTVJPRF9EQVRBX1JETUFfT1BTX0VOX0ZMRywKKwkJICBHRVRfRklFTEQobW9kaWZ5X2ZsYWdzLAorCQkJICAgIFFFRF9SRE1BX01PRElGWV9RUF9WQUxJRF9SRE1BX09QU19FTikpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX01PRElGWV9RUF9SRVNQX1JBTVJPRF9EQVRBX1BfS0VZX0ZMRywKKwkJICBHRVRfRklFTEQobW9kaWZ5X2ZsYWdzLCBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfUEtFWSkpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX01PRElGWV9RUF9SRVNQX1JBTVJPRF9EQVRBX0FERFJFU1NfVkVDVE9SX0ZMRywKKwkJICBHRVRfRklFTEQobW9kaWZ5X2ZsYWdzLAorCQkJICAgIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9BRERSRVNTX1ZFQ1RPUikpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX01PRElGWV9RUF9SRVNQX1JBTVJPRF9EQVRBX01BWF9JUkRfRkxHLAorCQkgIEdFVF9GSUVMRChtb2RpZnlfZmxhZ3MsCisJCQkgICAgUUVEX1JETUFfTU9ESUZZX1FQX1ZBTElEX01BWF9SRF9BVE9NSUNfUkVTUCkpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX01PRElGWV9RUF9SRVNQX1JBTVJPRF9EQVRBX01JTl9STlJfTkFLX1RJTUVSX0ZMRywKKwkJICBHRVRfRklFTEQobW9kaWZ5X2ZsYWdzLAorCQkJICAgIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9NSU5fUk5SX05BS19USU1FUikpOworCisJcF9yYW1yb2QtPmZpZWxkcyA9IDA7CisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5maWVsZHMsCisJCSAgUk9DRV9NT0RJRllfUVBfUkVTUF9SQU1ST0RfREFUQV9NSU5fUk5SX05BS19USU1FUiwKKwkJICBxcC0+bWluX3Jucl9uYWtfdGltZXIpOworCisJcF9yYW1yb2QtPm1heF9pcmQgPSBxcC0+bWF4X3JkX2F0b21pY19yZXNwOworCXBfcmFtcm9kLT50cmFmZmljX2NsYXNzID0gcXAtPnRyYWZmaWNfY2xhc3NfdG9zOworCXBfcmFtcm9kLT5ob3BfbGltaXQgPSBxcC0+aG9wX2xpbWl0X3R0bDsKKwlwX3JhbXJvZC0+cF9rZXkgPSBjcHVfdG9fbGUxNihxcC0+cGtleSk7CisJcF9yYW1yb2QtPmZsb3dfbGFiZWwgPSBjcHVfdG9fbGUzMihxcC0+Zmxvd19sYWJlbCk7CisJcF9yYW1yb2QtPm10dSA9IGNwdV90b19sZTE2KHFwLT5tdHUpOworCXFlZF9yZG1hX2NvcHlfZ2lkcyhxcCwgcF9yYW1yb2QtPnNyY19naWQsIHBfcmFtcm9kLT5kc3RfZ2lkKTsKKwlyYyA9IHFlZF9zcHFfcG9zdChwX2h3Zm4sIHBfZW50LCBOVUxMKTsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJNb2RpZnkgcmVzcG9uZGVyLCByYyA9ICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHFlZF9yb2NlX3NwX21vZGlmeV9yZXF1ZXN0ZXIoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCXN0cnVjdCBxZWRfcmRtYV9xcCAqcXAsCisJCQkJCWJvb2wgbW92ZV90b19zcWQsCisJCQkJCWJvb2wgbW92ZV90b19lcnIsIHUzMiBtb2RpZnlfZmxhZ3MpCit7CisJc3RydWN0IHJvY2VfbW9kaWZ5X3FwX3JlcV9yYW1yb2RfZGF0YSAqcF9yYW1yb2Q7CisJc3RydWN0IHFlZF9zcF9pbml0X2RhdGEgaW5pdF9kYXRhOworCXN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudDsKKwlpbnQgcmM7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiaWNpZCA9ICUwOHhcbiIsIHFwLT5pY2lkKTsKKworCWlmIChtb3ZlX3RvX2VyciAmJiAhKHFwLT5yZXFfb2ZmbG9hZGVkKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBHZXQgU1BRIGVudHJ5ICovCisJbWVtc2V0KCZpbml0X2RhdGEsIDAsIHNpemVvZihpbml0X2RhdGEpKTsKKwlpbml0X2RhdGEuY2lkID0gcXAtPmljaWQgKyAxOworCWluaXRfZGF0YS5vcGFxdWVfZmlkID0gcF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQ7CisJaW5pdF9kYXRhLmNvbXBfbW9kZSA9IFFFRF9TUFFfTU9ERV9FQkxPQ0s7CisKKwlyYyA9IHFlZF9zcF9pbml0X3JlcXVlc3QocF9od2ZuLCAmcF9lbnQsCisJCQkJIFJPQ0VfRVZFTlRfTU9ESUZZX1FQLAorCQkJCSBQUk9UT0NPTElEX1JPQ0UsICZpbml0X2RhdGEpOworCWlmIChyYykgeworCQlEUF9OT1RJQ0UocF9od2ZuLCAicmMgPSAlZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcF9yYW1yb2QgPSAmcF9lbnQtPnJhbXJvZC5yb2NlX21vZGlmeV9xcF9yZXE7CisKKwlwX3JhbXJvZC0+ZmxhZ3MgPSAwOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX01PRElGWV9RUF9SRVFfUkFNUk9EX0RBVEFfTU9WRV9UT19FUlJfRkxHLCBtb3ZlX3RvX2Vycik7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfTU9ESUZZX1FQX1JFUV9SQU1ST0RfREFUQV9NT1ZFX1RPX1NRRF9GTEcsIG1vdmVfdG9fc3FkKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9NT0RJRllfUVBfUkVRX1JBTVJPRF9EQVRBX0VOX1NRRF9BU1lOQ19OT1RJRlksCisJCSAgcXAtPnNxZF9hc3luYyk7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfTU9ESUZZX1FQX1JFUV9SQU1ST0RfREFUQV9QX0tFWV9GTEcsCisJCSAgR0VUX0ZJRUxEKG1vZGlmeV9mbGFncywgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1BLRVkpKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9NT0RJRllfUVBfUkVRX1JBTVJPRF9EQVRBX0FERFJFU1NfVkVDVE9SX0ZMRywKKwkJICBHRVRfRklFTEQobW9kaWZ5X2ZsYWdzLAorCQkJICAgIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9BRERSRVNTX1ZFQ1RPUikpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX01PRElGWV9RUF9SRVFfUkFNUk9EX0RBVEFfTUFYX09SRF9GTEcsCisJCSAgR0VUX0ZJRUxEKG1vZGlmeV9mbGFncywKKwkJCSAgICBRRURfUkRNQV9NT0RJRllfUVBfVkFMSURfTUFYX1JEX0FUT01JQ19SRVEpKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9NT0RJRllfUVBfUkVRX1JBTVJPRF9EQVRBX1JOUl9OQUtfQ05UX0ZMRywKKwkJICBHRVRfRklFTEQobW9kaWZ5X2ZsYWdzLAorCQkJICAgIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9STlJfUkVUUllfQ05UKSk7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfTU9ESUZZX1FQX1JFUV9SQU1ST0RfREFUQV9FUlJfUkVUUllfQ05UX0ZMRywKKwkJICBHRVRfRklFTEQobW9kaWZ5X2ZsYWdzLCBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfUkVUUllfQ05UKSk7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfTU9ESUZZX1FQX1JFUV9SQU1ST0RfREFUQV9BQ0tfVElNRU9VVF9GTEcsCisJCSAgR0VUX0ZJRUxEKG1vZGlmeV9mbGFncywKKwkJCSAgICBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfQUNLX1RJTUVPVVQpKTsKKworCXBfcmFtcm9kLT5maWVsZHMgPSAwOworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmllbGRzLAorCQkgIFJPQ0VfTU9ESUZZX1FQX1JFUV9SQU1ST0RfREFUQV9FUlJfUkVUUllfQ05ULCBxcC0+cmV0cnlfY250KTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmllbGRzLAorCQkgIFJPQ0VfTU9ESUZZX1FQX1JFUV9SQU1ST0RfREFUQV9STlJfTkFLX0NOVCwKKwkJICBxcC0+cm5yX3JldHJ5X2NudCk7CisKKwlwX3JhbXJvZC0+bWF4X29yZCA9IHFwLT5tYXhfcmRfYXRvbWljX3JlcTsKKwlwX3JhbXJvZC0+dHJhZmZpY19jbGFzcyA9IHFwLT50cmFmZmljX2NsYXNzX3RvczsKKwlwX3JhbXJvZC0+aG9wX2xpbWl0ID0gcXAtPmhvcF9saW1pdF90dGw7CisJcF9yYW1yb2QtPnBfa2V5ID0gY3B1X3RvX2xlMTYocXAtPnBrZXkpOworCXBfcmFtcm9kLT5mbG93X2xhYmVsID0gY3B1X3RvX2xlMzIocXAtPmZsb3dfbGFiZWwpOworCXBfcmFtcm9kLT5hY2tfdGltZW91dF92YWwgPSBjcHVfdG9fbGUzMihxcC0+YWNrX3RpbWVvdXQpOworCXBfcmFtcm9kLT5tdHUgPSBjcHVfdG9fbGUxNihxcC0+bXR1KTsKKwlxZWRfcmRtYV9jb3B5X2dpZHMocXAsIHBfcmFtcm9kLT5zcmNfZ2lkLCBwX3JhbXJvZC0+ZHN0X2dpZCk7CisJcmMgPSBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgTlVMTCk7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiTW9kaWZ5IHJlcXVlc3RlciwgcmMgPSAlZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBxZWRfcm9jZV9zcF9kZXN0cm95X3FwX3Jlc3BvbmRlcihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgIHN0cnVjdCBxZWRfcmRtYV9xcCAqcXAsCisJCQkJCSAgICB1MzIgKm51bV9pbnZhbGlkYXRlZF9tdykKK3sKKwlzdHJ1Y3Qgcm9jZV9kZXN0cm95X3FwX3Jlc3Bfb3V0cHV0X3BhcmFtcyAqcF9yYW1yb2RfcmVzOworCXN0cnVjdCByb2NlX2Rlc3Ryb3lfcXBfcmVzcF9yYW1yb2RfZGF0YSAqcF9yYW1yb2Q7CisJc3RydWN0IHFlZF9zcF9pbml0X2RhdGEgaW5pdF9kYXRhOworCXN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudDsKKwlkbWFfYWRkcl90IHJhbXJvZF9yZXNfcGh5czsKKwlpbnQgcmM7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiaWNpZCA9ICUwOHhcbiIsIHFwLT5pY2lkKTsKKworCWlmICghcXAtPnJlc3Bfb2ZmbG9hZGVkKQorCQlyZXR1cm4gMDsKKworCS8qIEdldCBTUFEgZW50cnkgKi8KKwltZW1zZXQoJmluaXRfZGF0YSwgMCwgc2l6ZW9mKGluaXRfZGF0YSkpOworCWluaXRfZGF0YS5jaWQgPSBxcC0+aWNpZDsKKwlpbml0X2RhdGEub3BhcXVlX2ZpZCA9IHBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkOworCWluaXRfZGF0YS5jb21wX21vZGUgPSBRRURfU1BRX01PREVfRUJMT0NLOworCisJcmMgPSBxZWRfc3BfaW5pdF9yZXF1ZXN0KHBfaHdmbiwgJnBfZW50LAorCQkJCSBST0NFX1JBTVJPRF9ERVNUUk9ZX1FQLAorCQkJCSBQUk9UT0NPTElEX1JPQ0UsICZpbml0X2RhdGEpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcF9yYW1yb2QgPSAmcF9lbnQtPnJhbXJvZC5yb2NlX2Rlc3Ryb3lfcXBfcmVzcDsKKworCXBfcmFtcm9kX3JlcyA9IChzdHJ1Y3Qgcm9jZV9kZXN0cm95X3FwX3Jlc3Bfb3V0cHV0X3BhcmFtcyAqKQorCSAgICBkbWFfYWxsb2NfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LCBzaXplb2YoKnBfcmFtcm9kX3JlcyksCisJCQkgICAgICAgJnJhbXJvZF9yZXNfcGh5cywgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXBfcmFtcm9kX3JlcykgeworCQlyYyA9IC1FTk9NRU07CisJCURQX05PVElDRShwX2h3Zm4sCisJCQkgICJxZWQgZGVzdHJveSByZXNwb25kZXIgZmFpbGVkOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IChyYW1yb2QpLiByYyA9ICVkXG4iLAorCQkJICByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+b3V0cHV0X3BhcmFtc19hZGRyLCByYW1yb2RfcmVzX3BoeXMpOworCisJcmMgPSBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgTlVMTCk7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCSpudW1faW52YWxpZGF0ZWRfbXcgPSBsZTMyX3RvX2NwdShwX3JhbXJvZF9yZXMtPm51bV9pbnZhbGlkYXRlZF9tdyk7CisKKwkvKiBGcmVlIElSUSAtIG9ubHkgaWYgcmFtcm9kIHN1Y2NlZWRlZCwgaW4gY2FzZSBGVyBpcyBzdGlsbCB1c2luZyBpdCAqLworCWRtYV9mcmVlX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKKwkJCSAgcXAtPmlycV9udW1fcGFnZXMgKiBSRE1BX1JJTkdfUEFHRV9TSVpFLAorCQkJICBxcC0+aXJxLCBxcC0+aXJxX3BoeXNfYWRkcik7CisKKwlxcC0+cmVzcF9vZmZsb2FkZWQgPSBmYWxzZTsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJEZXN0cm95IHJlc3BvbmRlciwgcmMgPSAlZFxuIiwgcmMpOworCitlcnI6CisJZG1hX2ZyZWVfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAorCQkJICBzaXplb2Yoc3RydWN0IHJvY2VfZGVzdHJveV9xcF9yZXNwX291dHB1dF9wYXJhbXMpLAorCQkJICBwX3JhbXJvZF9yZXMsIHJhbXJvZF9yZXNfcGh5cyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JvY2Vfc3BfZGVzdHJveV9xcF9yZXF1ZXN0ZXIoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICBzdHJ1Y3QgcWVkX3JkbWFfcXAgKnFwLAorCQkJCQkgICAgdTMyICpudW1fYm91bmRfbXcpCit7CisJc3RydWN0IHJvY2VfZGVzdHJveV9xcF9yZXFfb3V0cHV0X3BhcmFtcyAqcF9yYW1yb2RfcmVzOworCXN0cnVjdCByb2NlX2Rlc3Ryb3lfcXBfcmVxX3JhbXJvZF9kYXRhICpwX3JhbXJvZDsKKwlzdHJ1Y3QgcWVkX3NwX2luaXRfZGF0YSBpbml0X2RhdGE7CisJc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50OworCWRtYV9hZGRyX3QgcmFtcm9kX3Jlc19waHlzOworCWludCByYyA9IC1FTk9NRU07CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiaWNpZCA9ICUwOHhcbiIsIHFwLT5pY2lkKTsKKworCWlmICghcXAtPnJlcV9vZmZsb2FkZWQpCisJCXJldHVybiAwOworCisJcF9yYW1yb2RfcmVzID0gKHN0cnVjdCByb2NlX2Rlc3Ryb3lfcXBfcmVxX291dHB1dF9wYXJhbXMgKikKKwkJICAgICAgIGRtYV9hbGxvY19jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsCisJCQkJCSAgc2l6ZW9mKCpwX3JhbXJvZF9yZXMpLAorCQkJCQkgICZyYW1yb2RfcmVzX3BoeXMsIEdGUF9LRVJORUwpOworCWlmICghcF9yYW1yb2RfcmVzKSB7CisJCURQX05PVElDRShwX2h3Zm4sCisJCQkgICJxZWQgZGVzdHJveSByZXF1ZXN0ZXIgZmFpbGVkOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IChyYW1yb2QpXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIEdldCBTUFEgZW50cnkgKi8KKwltZW1zZXQoJmluaXRfZGF0YSwgMCwgc2l6ZW9mKGluaXRfZGF0YSkpOworCWluaXRfZGF0YS5jaWQgPSBxcC0+aWNpZCArIDE7CisJaW5pdF9kYXRhLm9wYXF1ZV9maWQgPSBwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZDsKKwlpbml0X2RhdGEuY29tcF9tb2RlID0gUUVEX1NQUV9NT0RFX0VCTE9DSzsKKworCXJjID0gcWVkX3NwX2luaXRfcmVxdWVzdChwX2h3Zm4sICZwX2VudCwgUk9DRV9SQU1ST0RfREVTVFJPWV9RUCwKKwkJCQkgUFJPVE9DT0xJRF9ST0NFLCAmaW5pdF9kYXRhKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJcF9yYW1yb2QgPSAmcF9lbnQtPnJhbXJvZC5yb2NlX2Rlc3Ryb3lfcXBfcmVxOworCURNQV9SRUdQQUlSX0xFKHBfcmFtcm9kLT5vdXRwdXRfcGFyYW1zX2FkZHIsIHJhbXJvZF9yZXNfcGh5cyk7CisKKwlyYyA9IHFlZF9zcHFfcG9zdChwX2h3Zm4sIHBfZW50LCBOVUxMKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJKm51bV9ib3VuZF9tdyA9IGxlMzJfdG9fY3B1KHBfcmFtcm9kX3Jlcy0+bnVtX2JvdW5kX213KTsKKworCS8qIEZyZWUgT1JRIC0gb25seSBpZiByYW1yb2Qgc3VjY2VlZGVkLCBpbiBjYXNlIEZXIGlzIHN0aWxsIHVzaW5nIGl0ICovCisJZG1hX2ZyZWVfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAorCQkJICBxcC0+b3JxX251bV9wYWdlcyAqIFJETUFfUklOR19QQUdFX1NJWkUsCisJCQkgIHFwLT5vcnEsIHFwLT5vcnFfcGh5c19hZGRyKTsKKworCXFwLT5yZXFfb2ZmbG9hZGVkID0gZmFsc2U7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiRGVzdHJveSByZXF1ZXN0ZXIsIHJjID0gJWRcbiIsIHJjKTsKKworZXJyOgorCWRtYV9mcmVlX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwgc2l6ZW9mKCpwX3JhbXJvZF9yZXMpLAorCQkJICBwX3JhbXJvZF9yZXMsIHJhbXJvZF9yZXNfcGh5cyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxZWRfcm9jZV9xdWVyeV9xcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJICAgICAgc3RydWN0IHFlZF9yZG1hX3FwICpxcCwKKwkJICAgICAgc3RydWN0IHFlZF9yZG1hX3F1ZXJ5X3FwX291dF9wYXJhbXMgKm91dF9wYXJhbXMpCit7CisJc3RydWN0IHJvY2VfcXVlcnlfcXBfcmVzcF9vdXRwdXRfcGFyYW1zICpwX3Jlc3BfcmFtcm9kX3JlczsKKwlzdHJ1Y3Qgcm9jZV9xdWVyeV9xcF9yZXFfb3V0cHV0X3BhcmFtcyAqcF9yZXFfcmFtcm9kX3JlczsKKwlzdHJ1Y3Qgcm9jZV9xdWVyeV9xcF9yZXNwX3JhbXJvZF9kYXRhICpwX3Jlc3BfcmFtcm9kOworCXN0cnVjdCByb2NlX3F1ZXJ5X3FwX3JlcV9yYW1yb2RfZGF0YSAqcF9yZXFfcmFtcm9kOworCXN0cnVjdCBxZWRfc3BfaW5pdF9kYXRhIGluaXRfZGF0YTsKKwlkbWFfYWRkcl90IHJlc3BfcmFtcm9kX3Jlc19waHlzOworCWRtYV9hZGRyX3QgcmVxX3JhbXJvZF9yZXNfcGh5czsKKwlzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQ7CisJYm9vbCBycV9lcnJfc3RhdGU7CisJYm9vbCBzcV9lcnJfc3RhdGU7CisJYm9vbCBzcV9kcmFpbmluZzsKKwlpbnQgcmMgPSAtRU5PTUVNOworCisJaWYgKCghKHFwLT5yZXNwX29mZmxvYWRlZCkpICYmICghKHFwLT5yZXFfb2ZmbG9hZGVkKSkpIHsKKwkJLyogV2UgY2FuJ3Qgc2VuZCByYW1yb2QgdG8gdGhlIGZ3IHNpbmNlIHRoaXMgcXAgd2Fzbid0IG9mZmxvYWRlZAorCQkgKiB0byB0aGUgZncgeWV0CisJCSAqLworCQlvdXRfcGFyYW1zLT5kcmFpbmluZyA9IGZhbHNlOworCQlvdXRfcGFyYW1zLT5ycV9wc24gPSBxcC0+cnFfcHNuOworCQlvdXRfcGFyYW1zLT5zcV9wc24gPSBxcC0+c3FfcHNuOworCQlvdXRfcGFyYW1zLT5zdGF0ZSA9IHFwLT5jdXJfc3RhdGU7CisKKwkJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIk5vIFFQcyBhcyBubyBvZmZsb2FkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEocXAtPnJlc3Bfb2ZmbG9hZGVkKSkgeworCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAiVGhlIHJlc3BvbmRlcidzIHFwIHNob3VsZCBiZSBvZmZsb2RlZCBiZWZvcmUgcmVxdWVzdGVyJ3NcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBTZW5kIGEgcXVlcnkgcmVzcG9uZGVyIHJhbXJvZCB0byBGVyB0byBnZXQgUlEtUFNOIGFuZCBzdGF0ZSAqLworCXBfcmVzcF9yYW1yb2RfcmVzID0gKHN0cnVjdCByb2NlX3F1ZXJ5X3FwX3Jlc3Bfb3V0cHV0X3BhcmFtcyAqKQorCSAgICBkbWFfYWxsb2NfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAorCQkJICAgICAgIHNpemVvZigqcF9yZXNwX3JhbXJvZF9yZXMpLAorCQkJICAgICAgICZyZXNwX3JhbXJvZF9yZXNfcGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKCFwX3Jlc3BfcmFtcm9kX3JlcykgeworCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAicWVkIHF1ZXJ5IHFwIGZhaWxlZDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSAocmFtcm9kKVxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBHZXQgU1BRIGVudHJ5ICovCisJbWVtc2V0KCZpbml0X2RhdGEsIDAsIHNpemVvZihpbml0X2RhdGEpKTsKKwlpbml0X2RhdGEuY2lkID0gcXAtPmljaWQ7CisJaW5pdF9kYXRhLm9wYXF1ZV9maWQgPSBwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZDsKKwlpbml0X2RhdGEuY29tcF9tb2RlID0gUUVEX1NQUV9NT0RFX0VCTE9DSzsKKwlyYyA9IHFlZF9zcF9pbml0X3JlcXVlc3QocF9od2ZuLCAmcF9lbnQsIFJPQ0VfUkFNUk9EX1FVRVJZX1FQLAorCQkJCSBQUk9UT0NPTElEX1JPQ0UsICZpbml0X2RhdGEpOworCWlmIChyYykKKwkJZ290byBlcnJfcmVzcDsKKworCXBfcmVzcF9yYW1yb2QgPSAmcF9lbnQtPnJhbXJvZC5yb2NlX3F1ZXJ5X3FwX3Jlc3A7CisJRE1BX1JFR1BBSVJfTEUocF9yZXNwX3JhbXJvZC0+b3V0cHV0X3BhcmFtc19hZGRyLCByZXNwX3JhbXJvZF9yZXNfcGh5cyk7CisKKwlyYyA9IHFlZF9zcHFfcG9zdChwX2h3Zm4sIHBfZW50LCBOVUxMKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX3Jlc3A7CisKKwlkbWFfZnJlZV9jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsIHNpemVvZigqcF9yZXNwX3JhbXJvZF9yZXMpLAorCQkJICBwX3Jlc3BfcmFtcm9kX3JlcywgcmVzcF9yYW1yb2RfcmVzX3BoeXMpOworCisJb3V0X3BhcmFtcy0+cnFfcHNuID0gbGUzMl90b19jcHUocF9yZXNwX3JhbXJvZF9yZXMtPnBzbik7CisJcnFfZXJyX3N0YXRlID0gR0VUX0ZJRUxEKGxlMzJfdG9fY3B1KHBfcmVzcF9yYW1yb2RfcmVzLT5lcnJfZmxhZyksCisJCQkJIFJPQ0VfUVVFUllfUVBfUkVTUF9PVVRQVVRfUEFSQU1TX0VSUk9SX0ZMRyk7CisKKwlpZiAoIShxcC0+cmVxX29mZmxvYWRlZCkpIHsKKwkJLyogRG9uJ3Qgc2VuZCBxdWVyeSBxcCBmb3IgdGhlIHJlcXVlc3RlciAqLworCQlvdXRfcGFyYW1zLT5zcV9wc24gPSBxcC0+c3FfcHNuOworCQlvdXRfcGFyYW1zLT5kcmFpbmluZyA9IGZhbHNlOworCisJCWlmIChycV9lcnJfc3RhdGUpCisJCQlxcC0+Y3VyX3N0YXRlID0gUUVEX1JPQ0VfUVBfU1RBVEVfRVJSOworCisJCW91dF9wYXJhbXMtPnN0YXRlID0gcXAtPmN1cl9zdGF0ZTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBTZW5kIGEgcXVlcnkgcmVxdWVzdGVyIHJhbXJvZCB0byBGVyB0byBnZXQgU1EtUFNOIGFuZCBzdGF0ZSAqLworCXBfcmVxX3JhbXJvZF9yZXMgPSAoc3RydWN0IHJvY2VfcXVlcnlfcXBfcmVxX291dHB1dF9wYXJhbXMgKikKKwkJCSAgIGRtYV9hbGxvY19jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsCisJCQkJCSAgICAgIHNpemVvZigqcF9yZXFfcmFtcm9kX3JlcyksCisJCQkJCSAgICAgICZyZXFfcmFtcm9kX3Jlc19waHlzLAorCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXBfcmVxX3JhbXJvZF9yZXMpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAicWVkIHF1ZXJ5IHFwIGZhaWxlZDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSAocmFtcm9kKVxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBHZXQgU1BRIGVudHJ5ICovCisJaW5pdF9kYXRhLmNpZCA9IHFwLT5pY2lkICsgMTsKKwlyYyA9IHFlZF9zcF9pbml0X3JlcXVlc3QocF9od2ZuLCAmcF9lbnQsIFJPQ0VfUkFNUk9EX1FVRVJZX1FQLAorCQkJCSBQUk9UT0NPTElEX1JPQ0UsICZpbml0X2RhdGEpOworCWlmIChyYykKKwkJZ290byBlcnJfcmVxOworCisJcF9yZXFfcmFtcm9kID0gJnBfZW50LT5yYW1yb2Qucm9jZV9xdWVyeV9xcF9yZXE7CisJRE1BX1JFR1BBSVJfTEUocF9yZXFfcmFtcm9kLT5vdXRwdXRfcGFyYW1zX2FkZHIsIHJlcV9yYW1yb2RfcmVzX3BoeXMpOworCisJcmMgPSBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgTlVMTCk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9yZXE7CisKKwlkbWFfZnJlZV9jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsIHNpemVvZigqcF9yZXFfcmFtcm9kX3JlcyksCisJCQkgIHBfcmVxX3JhbXJvZF9yZXMsIHJlcV9yYW1yb2RfcmVzX3BoeXMpOworCisJb3V0X3BhcmFtcy0+c3FfcHNuID0gbGUzMl90b19jcHUocF9yZXFfcmFtcm9kX3Jlcy0+cHNuKTsKKwlzcV9lcnJfc3RhdGUgPSBHRVRfRklFTEQobGUzMl90b19jcHUocF9yZXFfcmFtcm9kX3Jlcy0+ZmxhZ3MpLAorCQkJCSBST0NFX1FVRVJZX1FQX1JFUV9PVVRQVVRfUEFSQU1TX0VSUl9GTEcpOworCXNxX2RyYWluaW5nID0KKwkJR0VUX0ZJRUxEKGxlMzJfdG9fY3B1KHBfcmVxX3JhbXJvZF9yZXMtPmZsYWdzKSwKKwkJCSAgUk9DRV9RVUVSWV9RUF9SRVFfT1VUUFVUX1BBUkFNU19TUV9EUkFJTklOR19GTEcpOworCisJb3V0X3BhcmFtcy0+ZHJhaW5pbmcgPSBmYWxzZTsKKworCWlmIChycV9lcnJfc3RhdGUpCisJCXFwLT5jdXJfc3RhdGUgPSBRRURfUk9DRV9RUF9TVEFURV9FUlI7CisJZWxzZSBpZiAoc3FfZXJyX3N0YXRlKQorCQlxcC0+Y3VyX3N0YXRlID0gUUVEX1JPQ0VfUVBfU1RBVEVfU1FFOworCWVsc2UgaWYgKHNxX2RyYWluaW5nKQorCQlvdXRfcGFyYW1zLT5kcmFpbmluZyA9IHRydWU7CisJb3V0X3BhcmFtcy0+c3RhdGUgPSBxcC0+Y3VyX3N0YXRlOworCisJcmV0dXJuIDA7CisKK2Vycl9yZXE6CisJZG1hX2ZyZWVfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LCBzaXplb2YoKnBfcmVxX3JhbXJvZF9yZXMpLAorCQkJICBwX3JlcV9yYW1yb2RfcmVzLCByZXFfcmFtcm9kX3Jlc19waHlzKTsKKwlyZXR1cm4gcmM7CitlcnJfcmVzcDoKKwlkbWFfZnJlZV9jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsIHNpemVvZigqcF9yZXNwX3JhbXJvZF9yZXMpLAorCQkJICBwX3Jlc3BfcmFtcm9kX3JlcywgcmVzcF9yYW1yb2RfcmVzX3BoeXMpOworCXJldHVybiByYzsKK30KKworaW50IHFlZF9yb2NlX2Rlc3Ryb3lfcXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcmRtYV9xcCAqcXApCit7CisJdTMyIG51bV9pbnZhbGlkYXRlZF9tdyA9IDA7CisJdTMyIG51bV9ib3VuZF9tdyA9IDA7CisJdTMyIHN0YXJ0X2NpZDsKKwlpbnQgcmM7CisKKwkvKiBEZXN0cm95cyB0aGUgc3BlY2lmaWVkIFFQICovCisJaWYgKChxcC0+Y3VyX3N0YXRlICE9IFFFRF9ST0NFX1FQX1NUQVRFX1JFU0VUKSAmJgorCSAgICAocXAtPmN1cl9zdGF0ZSAhPSBRRURfUk9DRV9RUF9TVEFURV9FUlIpICYmCisJICAgIChxcC0+Y3VyX3N0YXRlICE9IFFFRF9ST0NFX1FQX1NUQVRFX0lOSVQpKSB7CisJCURQX05PVElDRShwX2h3Zm4sCisJCQkgICJRUCBtdXN0IGJlIGluIGVycm9yLCByZXNldCBvciBpbml0IHN0YXRlIGJlZm9yZSBkZXN0cm95aW5nIGl0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBxZWRfcm9jZV9zcF9kZXN0cm95X3FwX3Jlc3BvbmRlcihwX2h3Zm4sIHFwLCAmbnVtX2ludmFsaWRhdGVkX213KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIFNlbmQgZGVzdHJveSByZXF1ZXN0ZXIgcmFtcm9kICovCisJcmMgPSBxZWRfcm9jZV9zcF9kZXN0cm95X3FwX3JlcXVlc3RlcihwX2h3Zm4sIHFwLCAmbnVtX2JvdW5kX213KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChudW1faW52YWxpZGF0ZWRfbXcgIT0gbnVtX2JvdW5kX213KSB7CisJCURQX05PVElDRShwX2h3Zm4sCisJCQkgICJudW1iZXIgb2YgaW52YWxpZGF0ZSBtZW1vcnkgd2luZG93cyBpcyBkaWZmZXJlbnQgZnJvbSBib3VuZGVkIG9uZXNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfYmgoJnBfaHdmbi0+cF9yZG1hX2luZm8tPmxvY2spOworCisJc3RhcnRfY2lkID0gcWVkX2N4dF9nZXRfcHJvdG9fY2lkX3N0YXJ0KHBfaHdmbiwKKwkJCQkJCXBfaHdmbi0+cF9yZG1hX2luZm8tPnByb3RvKTsKKworCS8qIFJlbGVhc2UgcmVzcG9uZGVyJ3MgaWNpZCAqLworCXFlZF9ibWFwX3JlbGVhc2VfaWQocF9od2ZuLCAmcF9od2ZuLT5wX3JkbWFfaW5mby0+Y2lkX21hcCwKKwkJCSAgICBxcC0+aWNpZCAtIHN0YXJ0X2NpZCk7CisKKwkvKiBSZWxlYXNlIHJlcXVlc3RlcidzIGljaWQgKi8KKwlxZWRfYm1hcF9yZWxlYXNlX2lkKHBfaHdmbiwgJnBfaHdmbi0+cF9yZG1hX2luZm8tPmNpZF9tYXAsCisJCQkgICAgcXAtPmljaWQgKyAxIC0gc3RhcnRfY2lkKTsKKworCXNwaW5fdW5sb2NrX2JoKCZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitpbnQgcWVkX3JkbWFfcXVlcnlfcXAodm9pZCAqcmRtYV9jeHQsCisJCSAgICAgIHN0cnVjdCBxZWRfcmRtYV9xcCAqcXAsCisJCSAgICAgIHN0cnVjdCBxZWRfcmRtYV9xdWVyeV9xcF9vdXRfcGFyYW1zICpvdXRfcGFyYW1zKQoreworCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gKHN0cnVjdCBxZWRfaHdmbiAqKXJkbWFfY3h0OworCWludCByYzsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJpY2lkID0gJTA4eFxuIiwgcXAtPmljaWQpOworCisJLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIGZpbGxlZCBpbiBmcm9tIHFwIGFuZCBub3QgRlcgYXMgdGhleSBjYW4ndAorCSAqIGJlIG1vZGlmaWVkIGJ5IEZXCisJICovCisJb3V0X3BhcmFtcy0+bXR1ID0gcXAtPm10dTsKKwlvdXRfcGFyYW1zLT5kZXN0X3FwID0gcXAtPmRlc3RfcXA7CisJb3V0X3BhcmFtcy0+aW5jb21pbmdfYXRvbWljX2VuID0gcXAtPmluY29taW5nX2F0b21pY19lbjsKKwlvdXRfcGFyYW1zLT5lMmVfZmxvd19jb250cm9sX2VuID0gcXAtPmUyZV9mbG93X2NvbnRyb2xfZW47CisJb3V0X3BhcmFtcy0+aW5jb21pbmdfcmRtYV9yZWFkX2VuID0gcXAtPmluY29taW5nX3JkbWFfcmVhZF9lbjsKKwlvdXRfcGFyYW1zLT5pbmNvbWluZ19yZG1hX3dyaXRlX2VuID0gcXAtPmluY29taW5nX3JkbWFfd3JpdGVfZW47CisJb3V0X3BhcmFtcy0+ZGdpZCA9IHFwLT5kZ2lkOworCW91dF9wYXJhbXMtPmZsb3dfbGFiZWwgPSBxcC0+Zmxvd19sYWJlbDsKKwlvdXRfcGFyYW1zLT5ob3BfbGltaXRfdHRsID0gcXAtPmhvcF9saW1pdF90dGw7CisJb3V0X3BhcmFtcy0+dHJhZmZpY19jbGFzc190b3MgPSBxcC0+dHJhZmZpY19jbGFzc190b3M7CisJb3V0X3BhcmFtcy0+dGltZW91dCA9IHFwLT5hY2tfdGltZW91dDsKKwlvdXRfcGFyYW1zLT5ybnJfcmV0cnkgPSBxcC0+cm5yX3JldHJ5X2NudDsKKwlvdXRfcGFyYW1zLT5yZXRyeV9jbnQgPSBxcC0+cmV0cnlfY250OworCW91dF9wYXJhbXMtPm1pbl9ybnJfbmFrX3RpbWVyID0gcXAtPm1pbl9ybnJfbmFrX3RpbWVyOworCW91dF9wYXJhbXMtPnBrZXlfaW5kZXggPSAwOworCW91dF9wYXJhbXMtPm1heF9yZF9hdG9taWMgPSBxcC0+bWF4X3JkX2F0b21pY19yZXE7CisJb3V0X3BhcmFtcy0+bWF4X2Rlc3RfcmRfYXRvbWljID0gcXAtPm1heF9yZF9hdG9taWNfcmVzcDsKKwlvdXRfcGFyYW1zLT5zcWRfYXN5bmMgPSBxcC0+c3FkX2FzeW5jOworCisJcmMgPSBxZWRfcm9jZV9xdWVyeV9xcChwX2h3Zm4sIHFwLCBvdXRfcGFyYW1zKTsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJRdWVyeSBRUCwgcmMgPSAlZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworaW50IHFlZF9yZG1hX2Rlc3Ryb3lfcXAodm9pZCAqcmRtYV9jeHQsIHN0cnVjdCBxZWRfcmRtYV9xcCAqcXApCit7CisJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4gPSAoc3RydWN0IHFlZF9od2ZuICopcmRtYV9jeHQ7CisJaW50IHJjID0gMDsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJpY2lkID0gJTA4eFxuIiwgcXAtPmljaWQpOworCisJcmMgPSBxZWRfcm9jZV9kZXN0cm95X3FwKHBfaHdmbiwgcXApOworCisJLyogZnJlZSBxcCBwYXJhbXMgc3RydWN0ICovCisJa2ZyZWUocXApOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIlFQIGRlc3Ryb3llZFxuIik7CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgcWVkX3JkbWFfcXAgKgorcWVkX3JkbWFfY3JlYXRlX3FwKHZvaWQgKnJkbWFfY3h0LAorCQkgICBzdHJ1Y3QgcWVkX3JkbWFfY3JlYXRlX3FwX2luX3BhcmFtcyAqaW5fcGFyYW1zLAorCQkgICBzdHJ1Y3QgcWVkX3JkbWFfY3JlYXRlX3FwX291dF9wYXJhbXMgKm91dF9wYXJhbXMpCit7CisJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4gPSAoc3RydWN0IHFlZF9od2ZuICopcmRtYV9jeHQ7CisJc3RydWN0IHFlZF9yZG1hX3FwICpxcDsKKwl1OCBtYXhfc3RhdHNfcXVldWVzOworCWludCByYzsKKworCWlmICghcmRtYV9jeHQgfHwgIWluX3BhcmFtcyB8fCAhb3V0X3BhcmFtcyB8fCAhcF9od2ZuLT5wX3JkbWFfaW5mbykgeworCQlEUF9FUlIocF9od2ZuLT5jZGV2LAorCQkgICAgICAgInFlZCByb2NlIGNyZWF0ZSBxcCBmYWlsZWQgZHVlIHRvIE5VTEwgZW50cnkgKHJkbWFfY3h0PSVwLCBpbj0lcCwgb3V0PSVwLCByb2NlX2luZm89P1xuIiwKKwkJICAgICAgIHJkbWFfY3h0LCBpbl9wYXJhbXMsIG91dF9wYXJhbXMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLAorCQkgICAicWVkIHJkbWEgY3JlYXRlIHFwIGNhbGxlZCB3aXRoIHFwX2hhbmRsZSA9ICUwOHglMDh4XG4iLAorCQkgICBpbl9wYXJhbXMtPnFwX2hhbmRsZV9oaSwgaW5fcGFyYW1zLT5xcF9oYW5kbGVfbG8pOworCisJLyogU29tZSBzYW5pdHkgY2hlY2tzLi4uICovCisJbWF4X3N0YXRzX3F1ZXVlcyA9IHBfaHdmbi0+cF9yZG1hX2luZm8tPmRldi0+bWF4X3N0YXRzX3F1ZXVlczsKKwlpZiAoaW5fcGFyYW1zLT5zdGF0c19xdWV1ZSA+PSBtYXhfc3RhdHNfcXVldWVzKSB7CisJCURQX0VSUihwX2h3Zm4tPmNkZXYsCisJCSAgICAgICAicWVkIHJkbWEgY3JlYXRlIHFwIGZhaWxlZCBkdWUgdG8gaW52YWxpZCBzdGF0aXN0aWNzIHF1ZXVlICVkLiBtYXhpbXVtIGlzICVkXG4iLAorCQkgICAgICAgaW5fcGFyYW1zLT5zdGF0c19xdWV1ZSwgbWF4X3N0YXRzX3F1ZXVlcyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXFwID0ga3phbGxvYyhzaXplb2YoKnFwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxcCkgeworCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHFlZF9yZG1hX3FwXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmMgPSBxZWRfcm9jZV9hbGxvY19jaWQocF9od2ZuLCAmcXAtPmljaWQpOworCXFwLT5xcGlkID0gKCgweEZGIDw8IDE2KSB8IHFwLT5pY2lkKTsKKworCURQX0lORk8ocF9od2ZuLCAiUk9DRSBxcGlkPSV4XG4iLCBxcC0+cXBpZCk7CisKKwlpZiAocmMpIHsKKwkJa2ZyZWUocXApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlxcC0+Y3VyX3N0YXRlID0gUUVEX1JPQ0VfUVBfU1RBVEVfUkVTRVQ7CisJcXAtPnFwX2hhbmRsZS5oaSA9IGNwdV90b19sZTMyKGluX3BhcmFtcy0+cXBfaGFuZGxlX2hpKTsKKwlxcC0+cXBfaGFuZGxlLmxvID0gY3B1X3RvX2xlMzIoaW5fcGFyYW1zLT5xcF9oYW5kbGVfbG8pOworCXFwLT5xcF9oYW5kbGVfYXN5bmMuaGkgPSBjcHVfdG9fbGUzMihpbl9wYXJhbXMtPnFwX2hhbmRsZV9hc3luY19oaSk7CisJcXAtPnFwX2hhbmRsZV9hc3luYy5sbyA9IGNwdV90b19sZTMyKGluX3BhcmFtcy0+cXBfaGFuZGxlX2FzeW5jX2xvKTsKKwlxcC0+dXNlX3NycSA9IGluX3BhcmFtcy0+dXNlX3NycTsKKwlxcC0+c2lnbmFsX2FsbCA9IGluX3BhcmFtcy0+c2lnbmFsX2FsbDsKKwlxcC0+Zm1yX2FuZF9yZXNlcnZlZF9sa2V5ID0gaW5fcGFyYW1zLT5mbXJfYW5kX3Jlc2VydmVkX2xrZXk7CisJcXAtPnBkID0gaW5fcGFyYW1zLT5wZDsKKwlxcC0+ZHBpID0gaW5fcGFyYW1zLT5kcGk7CisJcXAtPnNxX2NxX2lkID0gaW5fcGFyYW1zLT5zcV9jcV9pZDsKKwlxcC0+c3FfbnVtX3BhZ2VzID0gaW5fcGFyYW1zLT5zcV9udW1fcGFnZXM7CisJcXAtPnNxX3BibF9wdHIgPSBpbl9wYXJhbXMtPnNxX3BibF9wdHI7CisJcXAtPnJxX2NxX2lkID0gaW5fcGFyYW1zLT5ycV9jcV9pZDsKKwlxcC0+cnFfbnVtX3BhZ2VzID0gaW5fcGFyYW1zLT5ycV9udW1fcGFnZXM7CisJcXAtPnJxX3BibF9wdHIgPSBpbl9wYXJhbXMtPnJxX3BibF9wdHI7CisJcXAtPnNycV9pZCA9IGluX3BhcmFtcy0+c3JxX2lkOworCXFwLT5yZXFfb2ZmbG9hZGVkID0gZmFsc2U7CisJcXAtPnJlc3Bfb2ZmbG9hZGVkID0gZmFsc2U7CisJcXAtPmUyZV9mbG93X2NvbnRyb2xfZW4gPSBxcC0+dXNlX3NycSA/IGZhbHNlIDogdHJ1ZTsKKwlxcC0+c3RhdHNfcXVldWUgPSBpbl9wYXJhbXMtPnN0YXRzX3F1ZXVlOworCisJb3V0X3BhcmFtcy0+aWNpZCA9IHFwLT5pY2lkOworCW91dF9wYXJhbXMtPnFwX2lkID0gcXAtPnFwaWQ7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiQ3JlYXRlIFFQLCByYyA9ICVkXG4iLCByYyk7CisJcmV0dXJuIHFwOworfQorCitzdGF0aWMgaW50IHFlZF9yb2NlX21vZGlmeV9xcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICAgIHN0cnVjdCBxZWRfcmRtYV9xcCAqcXAsCisJCQkgICAgICBlbnVtIHFlZF9yb2NlX3FwX3N0YXRlIHByZXZfc3RhdGUsCisJCQkgICAgICBzdHJ1Y3QgcWVkX3JkbWFfbW9kaWZ5X3FwX2luX3BhcmFtcyAqcGFyYW1zKQoreworCXUzMiBudW1faW52YWxpZGF0ZWRfbXcgPSAwLCBudW1fYm91bmRfbXcgPSAwOworCWludCByYyA9IDA7CisKKwkvKiBQZXJmb3JtIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc3RhdGUgYW5kIHRoZQorCSAqIG5leHQgc3RhdGUKKwkgKi8KKwlpZiAoKChwcmV2X3N0YXRlID09IFFFRF9ST0NFX1FQX1NUQVRFX0lOSVQpIHx8CisJICAgICAocHJldl9zdGF0ZSA9PSBRRURfUk9DRV9RUF9TVEFURV9SRVNFVCkpICYmCisJICAgIChxcC0+Y3VyX3N0YXRlID09IFFFRF9ST0NFX1FQX1NUQVRFX1JUUikpIHsKKwkJLyogSW5pdC0+UlRSIG9yIFJlc2V0LT5SVFIgKi8KKwkJcmMgPSBxZWRfcm9jZV9zcF9jcmVhdGVfcmVzcG9uZGVyKHBfaHdmbiwgcXApOworCQlyZXR1cm4gcmM7CisJfSBlbHNlIGlmICgocHJldl9zdGF0ZSA9PSBRRURfUk9DRV9RUF9TVEFURV9SVFIpICYmCisJCSAgIChxcC0+Y3VyX3N0YXRlID09IFFFRF9ST0NFX1FQX1NUQVRFX1JUUykpIHsKKwkJLyogUlRSLT4gUlRTICovCisJCXJjID0gcWVkX3JvY2Vfc3BfY3JlYXRlX3JlcXVlc3RlcihwX2h3Zm4sIHFwKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCS8qIFNlbmQgbW9kaWZ5IHJlc3BvbmRlciByYW1yb2QgKi8KKwkJcmMgPSBxZWRfcm9jZV9zcF9tb2RpZnlfcmVzcG9uZGVyKHBfaHdmbiwgcXAsIGZhbHNlLAorCQkJCQkJICBwYXJhbXMtPm1vZGlmeV9mbGFncyk7CisJCXJldHVybiByYzsKKwl9IGVsc2UgaWYgKChwcmV2X3N0YXRlID09IFFFRF9ST0NFX1FQX1NUQVRFX1JUUykgJiYKKwkJICAgKHFwLT5jdXJfc3RhdGUgPT0gUUVEX1JPQ0VfUVBfU1RBVEVfUlRTKSkgeworCQkvKiBSVFMtPlJUUyAqLworCQlyYyA9IHFlZF9yb2NlX3NwX21vZGlmeV9yZXNwb25kZXIocF9od2ZuLCBxcCwgZmFsc2UsCisJCQkJCQkgIHBhcmFtcy0+bW9kaWZ5X2ZsYWdzKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCXJjID0gcWVkX3JvY2Vfc3BfbW9kaWZ5X3JlcXVlc3RlcihwX2h3Zm4sIHFwLCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgIHBhcmFtcy0+bW9kaWZ5X2ZsYWdzKTsKKwkJcmV0dXJuIHJjOworCX0gZWxzZSBpZiAoKHByZXZfc3RhdGUgPT0gUUVEX1JPQ0VfUVBfU1RBVEVfUlRTKSAmJgorCQkgICAocXAtPmN1cl9zdGF0ZSA9PSBRRURfUk9DRV9RUF9TVEFURV9TUUQpKSB7CisJCS8qIFJUUy0+U1FEICovCisJCXJjID0gcWVkX3JvY2Vfc3BfbW9kaWZ5X3JlcXVlc3RlcihwX2h3Zm4sIHFwLCB0cnVlLCBmYWxzZSwKKwkJCQkJCSAgcGFyYW1zLT5tb2RpZnlfZmxhZ3MpOworCQlyZXR1cm4gcmM7CisJfSBlbHNlIGlmICgocHJldl9zdGF0ZSA9PSBRRURfUk9DRV9RUF9TVEFURV9TUUQpICYmCisJCSAgIChxcC0+Y3VyX3N0YXRlID09IFFFRF9ST0NFX1FQX1NUQVRFX1NRRCkpIHsKKwkJLyogU1FELT5TUUQgKi8KKwkJcmMgPSBxZWRfcm9jZV9zcF9tb2RpZnlfcmVzcG9uZGVyKHBfaHdmbiwgcXAsIGZhbHNlLAorCQkJCQkJICBwYXJhbXMtPm1vZGlmeV9mbGFncyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlyYyA9IHFlZF9yb2NlX3NwX21vZGlmeV9yZXF1ZXN0ZXIocF9od2ZuLCBxcCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICBwYXJhbXMtPm1vZGlmeV9mbGFncyk7CisJCXJldHVybiByYzsKKwl9IGVsc2UgaWYgKChwcmV2X3N0YXRlID09IFFFRF9ST0NFX1FQX1NUQVRFX1NRRCkgJiYKKwkJICAgKHFwLT5jdXJfc3RhdGUgPT0gUUVEX1JPQ0VfUVBfU1RBVEVfUlRTKSkgeworCQkvKiBTUUQtPlJUUyAqLworCQlyYyA9IHFlZF9yb2NlX3NwX21vZGlmeV9yZXNwb25kZXIocF9od2ZuLCBxcCwgZmFsc2UsCisJCQkJCQkgIHBhcmFtcy0+bW9kaWZ5X2ZsYWdzKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCXJjID0gcWVkX3JvY2Vfc3BfbW9kaWZ5X3JlcXVlc3RlcihwX2h3Zm4sIHFwLCBmYWxzZSwgZmFsc2UsCisJCQkJCQkgIHBhcmFtcy0+bW9kaWZ5X2ZsYWdzKTsKKworCQlyZXR1cm4gcmM7CisJfSBlbHNlIGlmIChxcC0+Y3VyX3N0YXRlID09IFFFRF9ST0NFX1FQX1NUQVRFX0VSUiB8fAorCQkgICBxcC0+Y3VyX3N0YXRlID09IFFFRF9ST0NFX1FQX1NUQVRFX1NRRSkgeworCQkvKiAtPkVSUiAqLworCQlyYyA9IHFlZF9yb2NlX3NwX21vZGlmeV9yZXNwb25kZXIocF9od2ZuLCBxcCwgdHJ1ZSwKKwkJCQkJCSAgcGFyYW1zLT5tb2RpZnlfZmxhZ3MpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJcmMgPSBxZWRfcm9jZV9zcF9tb2RpZnlfcmVxdWVzdGVyKHBfaHdmbiwgcXAsIGZhbHNlLCB0cnVlLAorCQkJCQkJICBwYXJhbXMtPm1vZGlmeV9mbGFncyk7CisJCXJldHVybiByYzsKKwl9IGVsc2UgaWYgKHFwLT5jdXJfc3RhdGUgPT0gUUVEX1JPQ0VfUVBfU1RBVEVfUkVTRVQpIHsKKwkJLyogQW55IHN0YXRlIC0+IFJFU0VUICovCisKKwkJcmMgPSBxZWRfcm9jZV9zcF9kZXN0cm95X3FwX3Jlc3BvbmRlcihwX2h3Zm4sIHFwLAorCQkJCQkJICAgICAgJm51bV9pbnZhbGlkYXRlZF9tdyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlyYyA9IHFlZF9yb2NlX3NwX2Rlc3Ryb3lfcXBfcmVxdWVzdGVyKHBfaHdmbiwgcXAsCisJCQkJCQkgICAgICAmbnVtX2JvdW5kX213KTsKKworCQlpZiAobnVtX2ludmFsaWRhdGVkX213ICE9IG51bV9ib3VuZF9tdykgeworCQkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCQkgICJudW1iZXIgb2YgaW52YWxpZGF0ZSBtZW1vcnkgd2luZG93cyBpcyBkaWZmZXJlbnQgZnJvbSBib3VuZGVkIG9uZXNcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiMFxuIik7CisJfQorCisJcmV0dXJuIHJjOworfQorCitpbnQgcWVkX3JkbWFfbW9kaWZ5X3FwKHZvaWQgKnJkbWFfY3h0LAorCQkgICAgICAgc3RydWN0IHFlZF9yZG1hX3FwICpxcCwKKwkJICAgICAgIHN0cnVjdCBxZWRfcmRtYV9tb2RpZnlfcXBfaW5fcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4gPSAoc3RydWN0IHFlZF9od2ZuICopcmRtYV9jeHQ7CisJZW51bSBxZWRfcm9jZV9xcF9zdGF0ZSBwcmV2X3N0YXRlOworCWludCByYyA9IDA7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiaWNpZCA9ICUwOHggcGFyYW1zLT5uZXdfc3RhdGU9JWRcbiIsCisJCSAgIHFwLT5pY2lkLCBwYXJhbXMtPm5ld19zdGF0ZSk7CisKKwlpZiAocmMpIHsKKwkJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgInJjID0gJWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlmIChHRVRfRklFTEQocGFyYW1zLT5tb2RpZnlfZmxhZ3MsCisJCSAgICAgIFFFRF9SRE1BX01PRElGWV9RUF9WQUxJRF9SRE1BX09QU19FTikpIHsKKwkJcXAtPmluY29taW5nX3JkbWFfcmVhZF9lbiA9IHBhcmFtcy0+aW5jb21pbmdfcmRtYV9yZWFkX2VuOworCQlxcC0+aW5jb21pbmdfcmRtYV93cml0ZV9lbiA9IHBhcmFtcy0+aW5jb21pbmdfcmRtYV93cml0ZV9lbjsKKwkJcXAtPmluY29taW5nX2F0b21pY19lbiA9IHBhcmFtcy0+aW5jb21pbmdfYXRvbWljX2VuOworCX0KKworCS8qIFVwZGF0ZSBRUCBzdHJ1Y3R1cmUgd2l0aCB0aGUgdXBkYXRlZCB2YWx1ZXMgKi8KKwlpZiAoR0VUX0ZJRUxEKHBhcmFtcy0+bW9kaWZ5X2ZsYWdzLCBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfUk9DRV9NT0RFKSkKKwkJcXAtPnJvY2VfbW9kZSA9IHBhcmFtcy0+cm9jZV9tb2RlOworCWlmIChHRVRfRklFTEQocGFyYW1zLT5tb2RpZnlfZmxhZ3MsIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9QS0VZKSkKKwkJcXAtPnBrZXkgPSBwYXJhbXMtPnBrZXk7CisJaWYgKEdFVF9GSUVMRChwYXJhbXMtPm1vZGlmeV9mbGFncywKKwkJICAgICAgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX0UyRV9GTE9XX0NPTlRST0xfRU4pKQorCQlxcC0+ZTJlX2Zsb3dfY29udHJvbF9lbiA9IHBhcmFtcy0+ZTJlX2Zsb3dfY29udHJvbF9lbjsKKwlpZiAoR0VUX0ZJRUxEKHBhcmFtcy0+bW9kaWZ5X2ZsYWdzLCBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfREVTVF9RUCkpCisJCXFwLT5kZXN0X3FwID0gcGFyYW1zLT5kZXN0X3FwOworCWlmIChHRVRfRklFTEQocGFyYW1zLT5tb2RpZnlfZmxhZ3MsCisJCSAgICAgIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9BRERSRVNTX1ZFQ1RPUikpIHsKKwkJLyogSW5kaWNhdGVzIHRoYXQgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZDoKKwkJICogVHJhZmZpYyBjbGFzcywgZmxvdyBsYWJlbCwgaG9wIGxpbWl0LCBzb3VyY2UgR0lELAorCQkgKiBkZXN0aW5hdGlvbiBHSUQsIGxvb3BiYWNrIGluZGljYXRvcgorCQkgKi8KKwkJcXAtPnRyYWZmaWNfY2xhc3NfdG9zID0gcGFyYW1zLT50cmFmZmljX2NsYXNzX3RvczsKKwkJcXAtPmZsb3dfbGFiZWwgPSBwYXJhbXMtPmZsb3dfbGFiZWw7CisJCXFwLT5ob3BfbGltaXRfdHRsID0gcGFyYW1zLT5ob3BfbGltaXRfdHRsOworCisJCXFwLT5zZ2lkID0gcGFyYW1zLT5zZ2lkOworCQlxcC0+ZGdpZCA9IHBhcmFtcy0+ZGdpZDsKKwkJcXAtPnVkcF9zcmNfcG9ydCA9IDA7CisJCXFwLT52bGFuX2lkID0gcGFyYW1zLT52bGFuX2lkOworCQlxcC0+bXR1ID0gcGFyYW1zLT5tdHU7CisJCXFwLT5sYl9pbmRpY2F0aW9uID0gcGFyYW1zLT5sYl9pbmRpY2F0aW9uOworCQltZW1jcHkoKHU4ICopJnFwLT5yZW1vdGVfbWFjX2FkZHJbMF0sCisJCSAgICAgICAodTggKikmcGFyYW1zLT5yZW1vdGVfbWFjX2FkZHJbMF0sIEVUSF9BTEVOKTsKKwkJaWYgKHBhcmFtcy0+dXNlX2xvY2FsX21hYykgeworCQkJbWVtY3B5KCh1OCAqKSZxcC0+bG9jYWxfbWFjX2FkZHJbMF0sCisJCQkgICAgICAgKHU4ICopJnBhcmFtcy0+bG9jYWxfbWFjX2FkZHJbMF0sIEVUSF9BTEVOKTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweSgodTggKikmcXAtPmxvY2FsX21hY19hZGRyWzBdLAorCQkJICAgICAgICh1OCAqKSZwX2h3Zm4tPmh3X2luZm8uaHdfbWFjX2FkZHIsIEVUSF9BTEVOKTsKKwkJfQorCX0KKwlpZiAoR0VUX0ZJRUxEKHBhcmFtcy0+bW9kaWZ5X2ZsYWdzLCBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfUlFfUFNOKSkKKwkJcXAtPnJxX3BzbiA9IHBhcmFtcy0+cnFfcHNuOworCWlmIChHRVRfRklFTEQocGFyYW1zLT5tb2RpZnlfZmxhZ3MsIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9TUV9QU04pKQorCQlxcC0+c3FfcHNuID0gcGFyYW1zLT5zcV9wc247CisJaWYgKEdFVF9GSUVMRChwYXJhbXMtPm1vZGlmeV9mbGFncywKKwkJICAgICAgUUVEX1JETUFfTU9ESUZZX1FQX1ZBTElEX01BWF9SRF9BVE9NSUNfUkVRKSkKKwkJcXAtPm1heF9yZF9hdG9taWNfcmVxID0gcGFyYW1zLT5tYXhfcmRfYXRvbWljX3JlcTsKKwlpZiAoR0VUX0ZJRUxEKHBhcmFtcy0+bW9kaWZ5X2ZsYWdzLAorCQkgICAgICBRRURfUkRNQV9NT0RJRllfUVBfVkFMSURfTUFYX1JEX0FUT01JQ19SRVNQKSkKKwkJcXAtPm1heF9yZF9hdG9taWNfcmVzcCA9IHBhcmFtcy0+bWF4X3JkX2F0b21pY19yZXNwOworCWlmIChHRVRfRklFTEQocGFyYW1zLT5tb2RpZnlfZmxhZ3MsCisJCSAgICAgIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9BQ0tfVElNRU9VVCkpCisJCXFwLT5hY2tfdGltZW91dCA9IHBhcmFtcy0+YWNrX3RpbWVvdXQ7CisJaWYgKEdFVF9GSUVMRChwYXJhbXMtPm1vZGlmeV9mbGFncywgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1JFVFJZX0NOVCkpCisJCXFwLT5yZXRyeV9jbnQgPSBwYXJhbXMtPnJldHJ5X2NudDsKKwlpZiAoR0VUX0ZJRUxEKHBhcmFtcy0+bW9kaWZ5X2ZsYWdzLAorCQkgICAgICBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfUk5SX1JFVFJZX0NOVCkpCisJCXFwLT5ybnJfcmV0cnlfY250ID0gcGFyYW1zLT5ybnJfcmV0cnlfY250OworCWlmIChHRVRfRklFTEQocGFyYW1zLT5tb2RpZnlfZmxhZ3MsCisJCSAgICAgIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9NSU5fUk5SX05BS19USU1FUikpCisJCXFwLT5taW5fcm5yX25ha190aW1lciA9IHBhcmFtcy0+bWluX3Jucl9uYWtfdGltZXI7CisKKwlxcC0+c3FkX2FzeW5jID0gcGFyYW1zLT5zcWRfYXN5bmM7CisKKwlwcmV2X3N0YXRlID0gcXAtPmN1cl9zdGF0ZTsKKwlpZiAoR0VUX0ZJRUxEKHBhcmFtcy0+bW9kaWZ5X2ZsYWdzLAorCQkgICAgICBRRURfUkRNQV9NT0RJRllfUVBfVkFMSURfTkVXX1NUQVRFKSkgeworCQlxcC0+Y3VyX3N0YXRlID0gcGFyYW1zLT5uZXdfc3RhdGU7CisJCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJxcC0+Y3VyX3N0YXRlPSVkXG4iLAorCQkJICAgcXAtPmN1cl9zdGF0ZSk7CisJfQorCisJcmMgPSBxZWRfcm9jZV9tb2RpZnlfcXAocF9od2ZuLCBxcCwgcHJldl9zdGF0ZSwgcGFyYW1zKTsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJNb2RpZnkgUVAsIHJjID0gJWRcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxZWRfcmRtYV9yZWdpc3Rlcl90aWQodm9pZCAqcmRtYV9jeHQsCisJCQkgIHN0cnVjdCBxZWRfcmRtYV9yZWdpc3Rlcl90aWRfaW5fcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4gPSAoc3RydWN0IHFlZF9od2ZuICopcmRtYV9jeHQ7CisJc3RydWN0IHJkbWFfcmVnaXN0ZXJfdGlkX3JhbXJvZF9kYXRhICpwX3JhbXJvZDsKKwlzdHJ1Y3QgcWVkX3NwX2luaXRfZGF0YSBpbml0X2RhdGE7CisJc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50OworCWVudW0gcmRtYV90aWRfdHlwZSB0aWRfdHlwZTsKKwl1OCBmd19yZXR1cm5fY29kZTsKKwlpbnQgcmM7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiaXRpZCA9ICUwOHhcbiIsIHBhcmFtcy0+aXRpZCk7CisKKwkvKiBHZXQgU1BRIGVudHJ5ICovCisJbWVtc2V0KCZpbml0X2RhdGEsIDAsIHNpemVvZihpbml0X2RhdGEpKTsKKwlpbml0X2RhdGEub3BhcXVlX2ZpZCA9IHBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkOworCWluaXRfZGF0YS5jb21wX21vZGUgPSBRRURfU1BRX01PREVfRUJMT0NLOworCisJcmMgPSBxZWRfc3BfaW5pdF9yZXF1ZXN0KHBfaHdmbiwgJnBfZW50LCBSRE1BX1JBTVJPRF9SRUdJU1RFUl9NUiwKKwkJCQkgcF9od2ZuLT5wX3JkbWFfaW5mby0+cHJvdG8sICZpbml0X2RhdGEpOworCWlmIChyYykgeworCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAicmMgPSAlZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKHBfaHdmbi0+cF9yZG1hX2luZm8tPmxhc3RfdGlkIDwgcGFyYW1zLT5pdGlkKQorCQlwX2h3Zm4tPnBfcmRtYV9pbmZvLT5sYXN0X3RpZCA9IHBhcmFtcy0+aXRpZDsKKworCXBfcmFtcm9kID0gJnBfZW50LT5yYW1yb2QucmRtYV9yZWdpc3Rlcl90aWQ7CisKKwlwX3JhbXJvZC0+ZmxhZ3MgPSAwOworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUkRNQV9SRUdJU1RFUl9USURfUkFNUk9EX0RBVEFfVFdPX0xFVkVMX1BCTCwKKwkJICBwYXJhbXMtPnBibF90d29fbGV2ZWwpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBSRE1BX1JFR0lTVEVSX1RJRF9SQU1ST0RfREFUQV9aRVJPX0JBU0VELCBwYXJhbXMtPnpidmEpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBSRE1BX1JFR0lTVEVSX1RJRF9SQU1ST0RfREFUQV9QSFlfTVIsIHBhcmFtcy0+cGh5X21yKTsKKworCS8qIERvbid0IGluaXRpYWxpemUgRC9DIGZpZWxkLCBhcyBpdCBtYXkgb3ZlcnJpZGUgb3RoZXIgYml0cy4gKi8KKwlpZiAoIShwYXJhbXMtPnRpZF90eXBlID09IFFFRF9SRE1BX1RJRF9GTVIpICYmICEocGFyYW1zLT5kbWFfbXIpKQorCQlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkJICBSRE1BX1JFR0lTVEVSX1RJRF9SQU1ST0RfREFUQV9QQUdFX1NJWkVfTE9HLAorCQkJICBwYXJhbXMtPnBhZ2Vfc2l6ZV9sb2cgLSAxMik7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJETUFfUkVHSVNURVJfVElEX1JBTVJPRF9EQVRBX01BWF9JRCwKKwkJICBwX2h3Zm4tPnBfcmRtYV9pbmZvLT5sYXN0X3RpZCk7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJETUFfUkVHSVNURVJfVElEX1JBTVJPRF9EQVRBX1JFTU9URV9SRUFELAorCQkgIHBhcmFtcy0+cmVtb3RlX3JlYWQpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBSRE1BX1JFR0lTVEVSX1RJRF9SQU1ST0RfREFUQV9SRU1PVEVfV1JJVEUsCisJCSAgcGFyYW1zLT5yZW1vdGVfd3JpdGUpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBSRE1BX1JFR0lTVEVSX1RJRF9SQU1ST0RfREFUQV9SRU1PVEVfQVRPTUlDLAorCQkgIHBhcmFtcy0+cmVtb3RlX2F0b21pYyk7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJETUFfUkVHSVNURVJfVElEX1JBTVJPRF9EQVRBX0xPQ0FMX1dSSVRFLAorCQkgIHBhcmFtcy0+bG9jYWxfd3JpdGUpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBSRE1BX1JFR0lTVEVSX1RJRF9SQU1ST0RfREFUQV9MT0NBTF9SRUFELCBwYXJhbXMtPmxvY2FsX3JlYWQpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBSRE1BX1JFR0lTVEVSX1RJRF9SQU1ST0RfREFUQV9FTkFCTEVfTVdfQklORCwKKwkJICBwYXJhbXMtPm13X2JpbmQpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFnczEsCisJCSAgUkRNQV9SRUdJU1RFUl9USURfUkFNUk9EX0RBVEFfUEJMX1BBR0VfU0laRV9MT0csCisJCSAgcGFyYW1zLT5wYmxfcGFnZV9zaXplX2xvZyAtIDEyKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MyLAorCQkgIFJETUFfUkVHSVNURVJfVElEX1JBTVJPRF9EQVRBX0RNQV9NUiwgcGFyYW1zLT5kbWFfbXIpOworCisJc3dpdGNoIChwYXJhbXMtPnRpZF90eXBlKSB7CisJY2FzZSBRRURfUkRNQV9USURfUkVHSVNURVJFRF9NUjoKKwkJdGlkX3R5cGUgPSBSRE1BX1RJRF9SRUdJU1RFUkVEX01SOworCQlicmVhazsKKwljYXNlIFFFRF9SRE1BX1RJRF9GTVI6CisJCXRpZF90eXBlID0gUkRNQV9USURfRk1SOworCQlicmVhazsKKwljYXNlIFFFRF9SRE1BX1RJRF9NV19UWVBFMToKKwkJdGlkX3R5cGUgPSBSRE1BX1RJRF9NV19UWVBFMTsKKwkJYnJlYWs7CisJY2FzZSBRRURfUkRNQV9USURfTVdfVFlQRTJBOgorCQl0aWRfdHlwZSA9IFJETUFfVElEX01XX1RZUEUyQTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAicmMgPSAlZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MxLAorCQkgIFJETUFfUkVHSVNURVJfVElEX1JBTVJPRF9EQVRBX1RJRF9UWVBFLCB0aWRfdHlwZSk7CisKKwlwX3JhbXJvZC0+aXRpZCA9IGNwdV90b19sZTMyKHBhcmFtcy0+aXRpZCk7CisJcF9yYW1yb2QtPmtleSA9IHBhcmFtcy0+a2V5OworCXBfcmFtcm9kLT5wZCA9IGNwdV90b19sZTE2KHBhcmFtcy0+cGQpOworCXBfcmFtcm9kLT5sZW5ndGhfaGkgPSAodTgpKHBhcmFtcy0+bGVuZ3RoID4+IDMyKTsKKwlwX3JhbXJvZC0+bGVuZ3RoX2xvID0gRE1BX0xPX0xFKHBhcmFtcy0+bGVuZ3RoKTsKKwlpZiAocGFyYW1zLT56YnZhKSB7CisJCS8qIExvd2VyIDMyIGJpdHMgb2YgdGhlIHJlZ2lzdGVyZWQgTVIgYWRkcmVzcy4KKwkJICogSW4gY2FzZSBvZiB6ZXJvIGJhc2VkIE1SLCB3aWxsIGhvbGQgRkJPCisJCSAqLworCQlwX3JhbXJvZC0+dmEuaGkgPSAwOworCQlwX3JhbXJvZC0+dmEubG8gPSBjcHVfdG9fbGUzMihwYXJhbXMtPmZibyk7CisJfSBlbHNlIHsKKwkJRE1BX1JFR1BBSVJfTEUocF9yYW1yb2QtPnZhLCBwYXJhbXMtPnZhZGRyKTsKKwl9CisJRE1BX1JFR1BBSVJfTEUocF9yYW1yb2QtPnBibF9iYXNlLCBwYXJhbXMtPnBibF9wdHIpOworCisJLyogRElGICovCisJaWYgKHBhcmFtcy0+ZGlmX2VuYWJsZWQpIHsKKwkJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFnczIsCisJCQkgIFJETUFfUkVHSVNURVJfVElEX1JBTVJPRF9EQVRBX0RJRl9PTl9IT1NUX0ZMRywgMSk7CisJCURNQV9SRUdQQUlSX0xFKHBfcmFtcm9kLT5kaWZfZXJyb3JfYWRkciwKKwkJCSAgICAgICBwYXJhbXMtPmRpZl9lcnJvcl9hZGRyKTsKKwkJRE1BX1JFR1BBSVJfTEUocF9yYW1yb2QtPmRpZl9ydW50X2FkZHIsIHBhcmFtcy0+ZGlmX3J1bnRfYWRkcik7CisJfQorCisJcmMgPSBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgJmZ3X3JldHVybl9jb2RlKTsKKworCWlmIChmd19yZXR1cm5fY29kZSAhPSBSRE1BX1JFVFVSTl9PSykgeworCQlEUF9OT1RJQ0UocF9od2ZuLCAiZndfcmV0dXJuX2NvZGUgPSAlZFxuIiwgZndfcmV0dXJuX2NvZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiUmVnaXN0ZXIgVElELCByYyA9ICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCitpbnQgcWVkX3JkbWFfZGVyZWdpc3Rlcl90aWQodm9pZCAqcmRtYV9jeHQsIHUzMiBpdGlkKQoreworCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gKHN0cnVjdCBxZWRfaHdmbiAqKXJkbWFfY3h0OworCXN0cnVjdCByZG1hX2RlcmVnaXN0ZXJfdGlkX3JhbXJvZF9kYXRhICpwX3JhbXJvZDsKKwlzdHJ1Y3QgcWVkX3NwX2luaXRfZGF0YSBpbml0X2RhdGE7CisJc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50OworCXN0cnVjdCBxZWRfcHR0ICpwX3B0dDsKKwl1OCBmd19yZXR1cm5fY29kZTsKKwlpbnQgcmM7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiaXRpZCA9ICUwOHhcbiIsIGl0aWQpOworCisJLyogR2V0IFNQUSBlbnRyeSAqLworCW1lbXNldCgmaW5pdF9kYXRhLCAwLCBzaXplb2YoaW5pdF9kYXRhKSk7CisJaW5pdF9kYXRhLm9wYXF1ZV9maWQgPSBwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZDsKKwlpbml0X2RhdGEuY29tcF9tb2RlID0gUUVEX1NQUV9NT0RFX0VCTE9DSzsKKworCXJjID0gcWVkX3NwX2luaXRfcmVxdWVzdChwX2h3Zm4sICZwX2VudCwgUkRNQV9SQU1ST0RfREVSRUdJU1RFUl9NUiwKKwkJCQkgcF9od2ZuLT5wX3JkbWFfaW5mby0+cHJvdG8sICZpbml0X2RhdGEpOworCWlmIChyYykgeworCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAicmMgPSAlZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcF9yYW1yb2QgPSAmcF9lbnQtPnJhbXJvZC5yZG1hX2RlcmVnaXN0ZXJfdGlkOworCXBfcmFtcm9kLT5pdGlkID0gY3B1X3RvX2xlMzIoaXRpZCk7CisKKwlyYyA9IHFlZF9zcHFfcG9zdChwX2h3Zm4sIHBfZW50LCAmZndfcmV0dXJuX2NvZGUpOworCWlmIChyYykgeworCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAicmMgPSAlZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKGZ3X3JldHVybl9jb2RlID09IFJETUFfUkVUVVJOX0RFUkVHSVNURVJfTVJfQkFEX1NUQVRFX0VSUikgeworCQlEUF9OT1RJQ0UocF9od2ZuLCAiZndfcmV0dXJuX2NvZGUgPSAlZFxuIiwgZndfcmV0dXJuX2NvZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKGZ3X3JldHVybl9jb2RlID09IFJETUFfUkVUVVJOX05JR19EUkFJTl9SRVEpIHsKKwkJLyogQml0IGluZGljYXRpbmcgdGhhdCB0aGUgVElEIGlzIGluIHVzZSBhbmQgYSBuaWcgZHJhaW4gaXMKKwkJICogcmVxdWlyZWQgYmVmb3JlIHNlbmRpbmcgdGhlIHJhbXJvZCBhZ2FpbgorCQkgKi8KKwkJcF9wdHQgPSBxZWRfcHR0X2FjcXVpcmUocF9od2ZuKTsKKwkJaWYgKCFwX3B0dCkgeworCQkJcmMgPSAtRUJVU1k7CisJCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLAorCQkJCSAgICJGYWlsZWQgdG8gYWNxdWlyZSBQVFRcbiIpOworCQkJcmV0dXJuIHJjOworCQl9CisKKwkJcmMgPSBxZWRfbWNwX2RyYWluKHBfaHdmbiwgcF9wdHQpOworCQlpZiAocmMpIHsKKwkJCXFlZF9wdHRfcmVsZWFzZShwX2h3Zm4sIHBfcHR0KTsKKwkJCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsCisJCQkJICAgIkRyYWluIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlxZWRfcHR0X3JlbGVhc2UocF9od2ZuLCBwX3B0dCk7CisKKwkJLyogUmVzZW5kIHRoZSByYW1yb2QgKi8KKwkJcmMgPSBxZWRfc3BfaW5pdF9yZXF1ZXN0KHBfaHdmbiwgJnBfZW50LAorCQkJCQkgUkRNQV9SQU1ST0RfREVSRUdJU1RFUl9NUiwKKwkJCQkJIHBfaHdmbi0+cF9yZG1hX2luZm8tPnByb3RvLAorCQkJCQkgJmluaXRfZGF0YSk7CisJCWlmIChyYykgeworCQkJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwKKwkJCQkgICAiRmFpbGVkIHRvIGluaXQgc3AtZWxlbWVudFxuIik7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlyYyA9IHFlZF9zcHFfcG9zdChwX2h3Zm4sIHBfZW50LCAmZndfcmV0dXJuX2NvZGUpOworCQlpZiAocmMpIHsKKwkJCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsCisJCQkJICAgIlJhbXJvZCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIHJjOworCQl9CisKKwkJaWYgKGZ3X3JldHVybl9jb2RlICE9IFJETUFfUkVUVVJOX09LKSB7CisJCQlEUF9OT1RJQ0UocF9od2ZuLCAiZndfcmV0dXJuX2NvZGUgPSAlZFxuIiwKKwkJCQkgIGZ3X3JldHVybl9jb2RlKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJEZS1yZWdpc3RlcmVkIFRJRCwgcmMgPSAlZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgKnFlZF9yZG1hX2dldF9yZG1hX2N0eChzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwlyZXR1cm4gUUVEX0xFQURJTkdfSFdGTihjZGV2KTsKK30KKworc3RhdGljIHZvaWQgcWVkX3JkbWFfZHBtX2NvbmYoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gKHBfaHdmbi0+ZGNieF9ub19lZHBtIHx8IHBfaHdmbi0+ZGJfYmFyX25vX2VkcG0pID8gMCA6IDE7CisKKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgRE9SUV9SRUdfUEZfRFBNX0VOQUJMRSwgdmFsKTsKKwlEUF9WRVJCT1NFKHBfaHdmbiwgKFFFRF9NU0dfRENCIHwgUUVEX01TR19SRE1BKSwKKwkJICAgIkNoYW5naW5nIERQTV9FTiBzdGF0ZSB0byAlZCAoRENCWD0lZCwgREJfQkFSPSVkKVxuIiwKKwkJICAgdmFsLCBwX2h3Zm4tPmRjYnhfbm9fZWRwbSwgcF9od2ZuLT5kYl9iYXJfbm9fZWRwbSk7Cit9CisKK3ZvaWQgcWVkX3JkbWFfZHBtX2JhcihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQoreworCXBfaHdmbi0+ZGJfYmFyX25vX2VkcG0gPSB0cnVlOworCisJcWVkX3JkbWFfZHBtX2NvbmYocF9od2ZuLCBwX3B0dCk7Cit9CisKK2ludCBxZWRfcmRtYV9zdGFydCh2b2lkICpyZG1hX2N4dCwgc3RydWN0IHFlZF9yZG1hX3N0YXJ0X2luX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gKHN0cnVjdCBxZWRfaHdmbiAqKXJkbWFfY3h0OworCXN0cnVjdCBxZWRfcHR0ICpwX3B0dDsKKwlpbnQgcmMgPSAtRUJVU1k7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLAorCQkgICAiZGVzaXJlZF9jbnEgPSAlMDh4XG4iLCBwYXJhbXMtPmRlc2lyZWRfY25xKTsKKworCXBfcHR0ID0gcWVkX3B0dF9hY3F1aXJlKHBfaHdmbik7CisJaWYgKCFwX3B0dCkKKwkJZ290byBlcnI7CisKKwlyYyA9IHFlZF9yZG1hX2FsbG9jKHBfaHdmbiwgcF9wdHQsIHBhcmFtcyk7CisJaWYgKHJjKQorCQlnb3RvIGVycjE7CisKKwlyYyA9IHFlZF9yZG1hX3NldHVwKHBfaHdmbiwgcF9wdHQsIHBhcmFtcyk7CisJaWYgKHJjKQorCQlnb3RvIGVycjI7CisKKwlxZWRfcHR0X3JlbGVhc2UocF9od2ZuLCBwX3B0dCk7CisKKwlyZXR1cm4gcmM7CisKK2VycjI6CisJcWVkX3JkbWFfZnJlZShwX2h3Zm4pOworZXJyMToKKwlxZWRfcHR0X3JlbGVhc2UocF9od2ZuLCBwX3B0dCk7CitlcnI6CisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIlJETUEgc3RhcnQgLSBlcnJvciwgcmMgPSAlZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBxZWRfcmRtYV9pbml0KHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJIHN0cnVjdCBxZWRfcmRtYV9zdGFydF9pbl9wYXJhbXMgKnBhcmFtcykKK3sKKwlyZXR1cm4gcWVkX3JkbWFfc3RhcnQoUUVEX0xFQURJTkdfSFdGTihjZGV2KSwgcGFyYW1zKTsKK30KKwordm9pZCBxZWRfcmRtYV9yZW1vdmVfdXNlcih2b2lkICpyZG1hX2N4dCwgdTE2IGRwaSkKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiA9IChzdHJ1Y3QgcWVkX2h3Zm4gKilyZG1hX2N4dDsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJkcGkgPSAlMDh4XG4iLCBkcGkpOworCisJc3Bpbl9sb2NrX2JoKCZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5sb2NrKTsKKwlxZWRfYm1hcF9yZWxlYXNlX2lkKHBfaHdmbiwgJnBfaHdmbi0+cF9yZG1hX2luZm8tPmRwaV9tYXAsIGRwaSk7CisJc3Bpbl91bmxvY2tfYmgoJnBfaHdmbi0+cF9yZG1hX2luZm8tPmxvY2spOworfQorCit2b2lkIHFlZF9sbDJiX2NvbXBsZXRlX3R4X2dzaV9wYWNrZXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICB1OCBjb25uZWN0aW9uX2hhbmRsZSwKKwkJCQkgICAgIHZvaWQgKmNvb2tpZSwKKwkJCQkgICAgIGRtYV9hZGRyX3QgZmlyc3RfZnJhZ19hZGRyLAorCQkJCSAgICAgYm9vbCBiX2xhc3RfZnJhZ21lbnQsIGJvb2wgYl9sYXN0X3BhY2tldCkKK3sKKwlzdHJ1Y3QgcWVkX3JvY2VfbGwyX3BhY2tldCAqcGFja2V0ID0gY29va2llOworCXN0cnVjdCBxZWRfcm9jZV9sbDJfaW5mbyAqcm9jZV9sbDIgPSBwX2h3Zm4tPmxsMjsKKworCXJvY2VfbGwyLT5jYnMudHhfY2Iocm9jZV9sbDItPmNiX2Nvb2tpZSwgcGFja2V0KTsKK30KKwordm9pZCBxZWRfbGwyYl9yZWxlYXNlX3R4X2dzaV9wYWNrZXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgIHU4IGNvbm5lY3Rpb25faGFuZGxlLAorCQkJCSAgICB2b2lkICpjb29raWUsCisJCQkJICAgIGRtYV9hZGRyX3QgZmlyc3RfZnJhZ19hZGRyLAorCQkJCSAgICBib29sIGJfbGFzdF9mcmFnbWVudCwgYm9vbCBiX2xhc3RfcGFja2V0KQoreworCXFlZF9sbDJiX2NvbXBsZXRlX3R4X2dzaV9wYWNrZXQocF9od2ZuLCBjb25uZWN0aW9uX2hhbmRsZSwKKwkJCQkJY29va2llLCBmaXJzdF9mcmFnX2FkZHIsCisJCQkJCWJfbGFzdF9mcmFnbWVudCwgYl9sYXN0X3BhY2tldCk7Cit9CisKK3ZvaWQgcWVkX2xsMmJfY29tcGxldGVfcnhfZ3NpX3BhY2tldChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgIHU4IGNvbm5lY3Rpb25faGFuZGxlLAorCQkJCSAgICAgdm9pZCAqY29va2llLAorCQkJCSAgICAgZG1hX2FkZHJfdCByeF9idWZfYWRkciwKKwkJCQkgICAgIHUxNiBkYXRhX2xlbmd0aCwKKwkJCQkgICAgIHU4IGRhdGFfbGVuZ3RoX2Vycm9yLAorCQkJCSAgICAgdTE2IHBhcnNlX2ZsYWdzLAorCQkJCSAgICAgdTE2IHZsYW4sCisJCQkJICAgICB1MzIgc3JjX21hY19hZGRyX2hpLAorCQkJCSAgICAgdTE2IHNyY19tYWNfYWRkcl9sbywgYm9vbCBiX2xhc3RfcGFja2V0KQoreworCXN0cnVjdCBxZWRfcm9jZV9sbDJfaW5mbyAqcm9jZV9sbDIgPSBwX2h3Zm4tPmxsMjsKKwlzdHJ1Y3QgcWVkX3JvY2VfbGwyX3J4X3BhcmFtcyBwYXJhbXM7CisJc3RydWN0IHFlZF9kZXYgKmNkZXYgPSBwX2h3Zm4tPmNkZXY7CisJc3RydWN0IHFlZF9yb2NlX2xsMl9wYWNrZXQgcGt0OworCisJRFBfVkVSQk9TRShjZGV2LAorCQkgICBRRURfTVNHX0xMMiwKKwkJICAgInJvY2UgbGwyIHJ4IGNvbXBsZXRlOiBidXNfYWRkcj0lcCwgbGVuPSVkLCBkYXRhX2xlbl9lcnI9JWRcbiIsCisJCSAgICh2b2lkICopKHVpbnRwdHJfdClyeF9idWZfYWRkciwKKwkJICAgZGF0YV9sZW5ndGgsIGRhdGFfbGVuZ3RoX2Vycm9yKTsKKworCW1lbXNldCgmcGt0LCAwLCBzaXplb2YocGt0KSk7CisJcGt0Lm5fc2VnID0gMTsKKwlwa3QucGF5bG9hZFswXS5iYWRkciA9IHJ4X2J1Zl9hZGRyOworCXBrdC5wYXlsb2FkWzBdLmxlbiA9IGRhdGFfbGVuZ3RoOworCisJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKKwlwYXJhbXMudmxhbl9pZCA9IHZsYW47CisJKigodTMyICopJnBhcmFtcy5zbWFjWzBdKSA9IG50b2hsKHNyY19tYWNfYWRkcl9oaSk7CisJKigodTE2ICopJnBhcmFtcy5zbWFjWzRdKSA9IG50b2hzKHNyY19tYWNfYWRkcl9sbyk7CisKKwlpZiAoZGF0YV9sZW5ndGhfZXJyb3IpIHsKKwkJRFBfRVJSKGNkZXYsCisJCSAgICAgICAicm9jZSBsbDIgcnggY29tcGxldGU6IGRhdGEgbGVuZ3RoIGVycm9yICVkLCBsZW5ndGg9JWRcbiIsCisJCSAgICAgICBkYXRhX2xlbmd0aF9lcnJvciwgZGF0YV9sZW5ndGgpOworCQlwYXJhbXMucmMgPSAtRUlOVkFMOworCX0KKworCXJvY2VfbGwyLT5jYnMucnhfY2Iocm9jZV9sbDItPmNiX2Nvb2tpZSwgJnBrdCwgJnBhcmFtcyk7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JvY2VfbGwyX3NldF9tYWNfZmlsdGVyKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJCSAgICAgICB1OCAqb2xkX21hY19hZGRyZXNzLAorCQkJCSAgICAgICB1OCAqbmV3X21hY19hZGRyZXNzKQoreworCXN0cnVjdCBxZWRfaHdmbiAqaHdmbiA9IFFFRF9MRUFESU5HX0hXRk4oY2Rldik7CisJc3RydWN0IHFlZF9wdHQgKnBfcHR0OworCWludCByYyA9IDA7CisKKwlpZiAoIWh3Zm4tPmxsMiB8fCBod2ZuLT5sbDItPmhhbmRsZSA9PSBRRURfTEwyX1VOVVNFRF9IQU5ETEUpIHsKKwkJRFBfRVJSKGNkZXYsCisJCSAgICAgICAicWVkIHJvY2UgbWFjIGZpbHRlciBmYWlsZWQgLSByb2NlX2luZm8vbGwyIE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwX3B0dCA9IHFlZF9wdHRfYWNxdWlyZShRRURfTEVBRElOR19IV0ZOKGNkZXYpKTsKKwlpZiAoIXBfcHR0KSB7CisJCURQX0VSUihjZGV2LAorCQkgICAgICAgInFlZCByb2NlIGxsMiBtYWMgZmlsdGVyIHNldDogZmFpbGVkIHRvIGFjcXVpcmUgUFRUXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmaHdmbi0+bGwyLT5sb2NrKTsKKwlpZiAob2xkX21hY19hZGRyZXNzKQorCQlxZWRfbGxoX3JlbW92ZV9tYWNfZmlsdGVyKFFFRF9MRUFESU5HX0hXRk4oY2RldiksIHBfcHR0LAorCQkJCQkgIG9sZF9tYWNfYWRkcmVzcyk7CisJaWYgKG5ld19tYWNfYWRkcmVzcykKKwkJcmMgPSBxZWRfbGxoX2FkZF9tYWNfZmlsdGVyKFFFRF9MRUFESU5HX0hXRk4oY2RldiksIHBfcHR0LAorCQkJCQkgICAgbmV3X21hY19hZGRyZXNzKTsKKwltdXRleF91bmxvY2soJmh3Zm4tPmxsMi0+bG9jayk7CisKKwlxZWRfcHR0X3JlbGVhc2UoUUVEX0xFQURJTkdfSFdGTihjZGV2KSwgcF9wdHQpOworCisJaWYgKHJjKQorCQlEUF9FUlIoY2RldiwKKwkJICAgICAgICJxZWQgcm9jZSBsbDIgbWFjIGZpbHRlciBzZXQ6IGZhaWxlZCB0byBhZGQgbWFjIGZpbHRlclxuIik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JvY2VfbGwyX3N0YXJ0KHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJICAgICAgc3RydWN0IHFlZF9yb2NlX2xsMl9wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKmh3Zm4gPSBRRURfTEVBRElOR19IV0ZOKGNkZXYpOworCXN0cnVjdCBxZWRfcm9jZV9sbDJfaW5mbyAqcm9jZV9sbDI7CisJc3RydWN0IHFlZF9sbDJfaW5mbyBsbDJfcGFyYW1zOworCWludCByYzsKKworCWlmICghcGFyYW1zKSB7CisJCURQX0VSUihjZGV2LCAicWVkIHJvY2UgbGwyIHN0YXJ0OiBmYWlsZWQgZHVlIHRvIE5VTEwgcGFyYW1zXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghcGFyYW1zLT5jYnMudHhfY2IgfHwgIXBhcmFtcy0+Y2JzLnJ4X2NiKSB7CisJCURQX0VSUihjZGV2LAorCQkgICAgICAgInFlZCByb2NlIGxsMiBzdGFydDogZmFpbGVkIGR1ZSB0byBOVUxMIHR4L3J4LiB0eF9jYj0lcCwgcnhfY2I9JXBcbiIsCisJCSAgICAgICBwYXJhbXMtPmNicy50eF9jYiwgcGFyYW1zLT5jYnMucnhfY2IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKHBhcmFtcy0+bWFjX2FkZHJlc3MpKSB7CisJCURQX0VSUihjZGV2LAorCQkgICAgICAgInFlZCByb2NlIGxsMiBzdGFydDogZmFpbGVkIGR1ZSB0byBpbnZhbGlkIEV0aGVybmV0IGFkZHJlc3MgJXBNXG4iLAorCQkgICAgICAgcGFyYW1zLT5tYWNfYWRkcmVzcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEluaXRpYWxpemUgKi8KKwlyb2NlX2xsMiA9IGt6YWxsb2Moc2l6ZW9mKCpyb2NlX2xsMiksIEdGUF9BVE9NSUMpOworCWlmICghcm9jZV9sbDIpIHsKKwkJRFBfRVJSKGNkZXYsICJxZWQgcm9jZSBsbDIgc3RhcnQ6IGZhaWxlZCBtZW1vcnkgYWxsb2NhdGlvblxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocm9jZV9sbDIsIDAsIHNpemVvZigqcm9jZV9sbDIpKTsKKwlyb2NlX2xsMi0+aGFuZGxlID0gUUVEX0xMMl9VTlVTRURfSEFORExFOworCXJvY2VfbGwyLT5jYnMgPSBwYXJhbXMtPmNiczsKKwlyb2NlX2xsMi0+Y2JfY29va2llID0gcGFyYW1zLT5jYl9jb29raWU7CisJbXV0ZXhfaW5pdCgmcm9jZV9sbDItPmxvY2spOworCisJbWVtc2V0KCZsbDJfcGFyYW1zLCAwLCBzaXplb2YobGwyX3BhcmFtcykpOworCWxsMl9wYXJhbXMuY29ubl90eXBlID0gUUVEX0xMMl9UWVBFX1JPQ0U7CisJbGwyX3BhcmFtcy5tdHUgPSBwYXJhbXMtPm10dTsKKwlsbDJfcGFyYW1zLnJ4X2Ryb3BfdHRsMF9mbGcgPSB0cnVlOworCWxsMl9wYXJhbXMucnhfdmxhbl9yZW1vdmFsX2VuID0gZmFsc2U7CisJbGwyX3BhcmFtcy50eF9kZXN0ID0gQ09SRV9UWF9ERVNUX05XOworCWxsMl9wYXJhbXMuYWlfZXJyX3BhY2tldF90b29fYmlnID0gTEwyX0RST1BfUEFDS0VUOworCWxsMl9wYXJhbXMuYWlfZXJyX25vX2J1ZiA9IExMMl9EUk9QX1BBQ0tFVDsKKwlsbDJfcGFyYW1zLmdzaV9lbmFibGUgPSB0cnVlOworCisJcmMgPSBxZWRfbGwyX2FjcXVpcmVfY29ubmVjdGlvbihRRURfTEVBRElOR19IV0ZOKGNkZXYpLCAmbGwyX3BhcmFtcywKKwkJCQkJcGFyYW1zLT5tYXhfcnhfYnVmZmVycywKKwkJCQkJcGFyYW1zLT5tYXhfdHhfYnVmZmVycywKKwkJCQkJJnJvY2VfbGwyLT5oYW5kbGUpOworCWlmIChyYykgeworCQlEUF9FUlIoY2RldiwKKwkJICAgICAgICJxZWQgcm9jZSBsbDIgc3RhcnQ6IGZhaWxlZCB0byBhY3F1aXJlIExMMiBjb25uZWN0aW9uIChyYz0lZClcbiIsCisJCSAgICAgICByYyk7CisJCWdvdG8gZXJyOworCX0KKworCXJjID0gcWVkX2xsMl9lc3RhYmxpc2hfY29ubmVjdGlvbihRRURfTEVBRElOR19IV0ZOKGNkZXYpLAorCQkJCQkgIHJvY2VfbGwyLT5oYW5kbGUpOworCWlmIChyYykgeworCQlEUF9FUlIoY2RldiwKKwkJICAgICAgICJxZWQgcm9jZSBsbDIgc3RhcnQ6IGZhaWxlZCB0byBlc3RhYmxpc2ggTEwyIGNvbm5lY3Rpb24gKHJjPSVkKVxuIiwKKwkJICAgICAgIHJjKTsKKwkJZ290byBlcnIxOworCX0KKworCWh3Zm4tPmxsMiA9IHJvY2VfbGwyOworCisJcmMgPSBxZWRfcm9jZV9sbDJfc2V0X21hY19maWx0ZXIoY2RldiwgTlVMTCwgcGFyYW1zLT5tYWNfYWRkcmVzcyk7CisJaWYgKHJjKSB7CisJCWh3Zm4tPmxsMiA9IE5VTEw7CisJCWdvdG8gZXJyMjsKKwl9CisJZXRoZXJfYWRkcl9jb3B5KHJvY2VfbGwyLT5tYWNfYWRkcmVzcywgcGFyYW1zLT5tYWNfYWRkcmVzcyk7CisKKwlyZXR1cm4gMDsKKworZXJyMjoKKwlxZWRfbGwyX3Rlcm1pbmF0ZV9jb25uZWN0aW9uKFFFRF9MRUFESU5HX0hXRk4oY2RldiksIHJvY2VfbGwyLT5oYW5kbGUpOworZXJyMToKKwlxZWRfbGwyX3JlbGVhc2VfY29ubmVjdGlvbihRRURfTEVBRElOR19IV0ZOKGNkZXYpLCByb2NlX2xsMi0+aGFuZGxlKTsKK2VycjoKKwlrZnJlZShyb2NlX2xsMik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHFlZF9yb2NlX2xsMl9zdG9wKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCXN0cnVjdCBxZWRfaHdmbiAqaHdmbiA9IFFFRF9MRUFESU5HX0hXRk4oY2Rldik7CisJc3RydWN0IHFlZF9yb2NlX2xsMl9pbmZvICpyb2NlX2xsMiA9IGh3Zm4tPmxsMjsKKwlpbnQgcmM7CisKKwlpZiAoIWNkZXYpIHsKKwkJRFBfRVJSKGNkZXYsICJxZWQgcm9jZSBsbDIgc3RvcDogaW52YWxpZCBjZGV2XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJvY2VfbGwyLT5oYW5kbGUgPT0gUUVEX0xMMl9VTlVTRURfSEFORExFKSB7CisJCURQX0VSUihjZGV2LCAicWVkIHJvY2UgbGwyIHN0b3A6IGNhbm5vdCBzdG9wIGFuIHVudXNlZCBMTDJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiByZW1vdmUgTEwyIE1BQyBhZGRyZXNzIGZpbHRlciAqLworCXJjID0gcWVkX3JvY2VfbGwyX3NldF9tYWNfZmlsdGVyKGNkZXYsIHJvY2VfbGwyLT5tYWNfYWRkcmVzcywgTlVMTCk7CisJZXRoX3plcm9fYWRkcihyb2NlX2xsMi0+bWFjX2FkZHJlc3MpOworCisJcmMgPSBxZWRfbGwyX3Rlcm1pbmF0ZV9jb25uZWN0aW9uKFFFRF9MRUFESU5HX0hXRk4oY2RldiksCisJCQkJCSAgcm9jZV9sbDItPmhhbmRsZSk7CisJaWYgKHJjKQorCQlEUF9FUlIoY2RldiwKKwkJICAgICAgICJxZWQgcm9jZSBsbDIgc3RvcDogZmFpbGVkIHRvIHRlcm1pbmF0ZSBMTDIgY29ubmVjdGlvbiAocmM9JWQpXG4iLAorCQkgICAgICAgcmMpOworCisJcWVkX2xsMl9yZWxlYXNlX2Nvbm5lY3Rpb24oUUVEX0xFQURJTkdfSFdGTihjZGV2KSwgcm9jZV9sbDItPmhhbmRsZSk7CisKKwlyb2NlX2xsMi0+aGFuZGxlID0gUUVEX0xMMl9VTlVTRURfSEFORExFOworCisJa2ZyZWUocm9jZV9sbDIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHFlZF9yb2NlX2xsMl90eChzdHJ1Y3QgcWVkX2RldiAqY2RldiwKKwkJCSAgIHN0cnVjdCBxZWRfcm9jZV9sbDJfcGFja2V0ICpwa3QsCisJCQkgICBzdHJ1Y3QgcWVkX3JvY2VfbGwyX3R4X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBxZWRfaHdmbiAqaHdmbiA9IFFFRF9MRUFESU5HX0hXRk4oY2Rldik7CisJc3RydWN0IHFlZF9yb2NlX2xsMl9pbmZvICpyb2NlX2xsMiA9IGh3Zm4tPmxsMjsKKwllbnVtIHFlZF9sbDJfcm9jZV9mbGF2b3JfdHlwZSBxZWRfcm9jZV9mbGF2b3I7CisJdTggZmxhZ3MgPSAwOworCWludCByYzsKKwlpbnQgaTsKKworCWlmICghY2RldiB8fCAhcGt0IHx8ICFwYXJhbXMpIHsKKwkJRFBfRVJSKGNkZXYsCisJCSAgICAgICAicm9jZSBsbDIgdHg6IGZhaWxlZCB0eCBiZWNhdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIE5VTEwgLSBkcnY9JXAsIHBrdD0lcCwgcGFyYW1zPSVwXG4iLAorCQkgICAgICAgY2RldiwgcGt0LCBwYXJhbXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlxZWRfcm9jZV9mbGF2b3IgPSAocGt0LT5yb2NlX21vZGUgPT0gUk9DRV9WMSkgPyBRRURfTEwyX1JPQ0UKKwkJCQkJCSAgICAgIDogUUVEX0xMMl9SUk9DRTsKKworCWlmIChwa3QtPnJvY2VfbW9kZSA9PSBST0NFX1YyX0lQVjQpCisJCWZsYWdzIHw9IEJJVChDT1JFX1RYX0JEX0ZMQUdTX0lQX0NTVU1fU0hJRlQpOworCisJLyogVHggaGVhZGVyICovCisJcmMgPSBxZWRfbGwyX3ByZXBhcmVfdHhfcGFja2V0KFFFRF9MRUFESU5HX0hXRk4oY2RldiksIHJvY2VfbGwyLT5oYW5kbGUsCisJCQkJICAgICAgIDEgKyBwa3QtPm5fc2VnLCAwLCBmbGFncywgMCwKKwkJCQkgICAgICAgcWVkX3JvY2VfZmxhdm9yLCBwa3QtPmhlYWRlci5iYWRkciwKKwkJCQkgICAgICAgcGt0LT5oZWFkZXIubGVuLCBwa3QsIDEpOworCWlmIChyYykgeworCQlEUF9FUlIoY2RldiwgInJvY2UgbGwyIHR4OiBoZWFkZXIgZmFpbGVkIChyYz0lZClcbiIsIHJjKTsKKwkJcmV0dXJuIFFFRF9ST0NFX1RYX0hFQURfRkFJTFVSRTsKKwl9CisKKwkvKiBUeCBwYXlsb2FkICovCisJZm9yIChpID0gMDsgaSA8IHBrdC0+bl9zZWc7IGkrKykgeworCQlyYyA9IHFlZF9sbDJfc2V0X2ZyYWdtZW50X29mX3R4X3BhY2tldChRRURfTEVBRElOR19IV0ZOKGNkZXYpLAorCQkJCQkJICAgICAgIHJvY2VfbGwyLT5oYW5kbGUsCisJCQkJCQkgICAgICAgcGt0LT5wYXlsb2FkW2ldLmJhZGRyLAorCQkJCQkJICAgICAgIHBrdC0+cGF5bG9hZFtpXS5sZW4pOworCQlpZiAocmMpIHsKKwkJCS8qIElmIGZhaWxlZCBub3QgbXVjaCB0byBkbyBoZXJlLCBwYXJ0aWFsIHBhY2tldCBoYXMKKwkJCSAqIGJlZW4gcG9zdGVkICogd2UgY2FuJ3QgZnJlZSBtZW1vcnksIHdpbGwgbmVlZCB0byB3YWl0CisJCQkgKiBmb3IgY29tcGxldGlvbgorCQkJICovCisJCQlEUF9FUlIoY2RldiwKKwkJCSAgICAgICAicm9jZSBsbDIgdHg6IHBheWxvYWQgZmFpbGVkIChyYz0lZClcbiIsIHJjKTsKKwkJCXJldHVybiBRRURfUk9DRV9UWF9GUkFHX0ZBSUxVUkU7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxZWRfcm9jZV9sbDJfcG9zdF9yeF9idWZmZXIoc3RydWN0IHFlZF9kZXYgKmNkZXYsCisJCQkJICAgICAgIHN0cnVjdCBxZWRfcm9jZV9sbDJfYnVmZmVyICpidWYsCisJCQkJICAgICAgIHU2NCBjb29raWUsIHU4IG5vdGlmeV9mdykKK3sKKwlyZXR1cm4gcWVkX2xsMl9wb3N0X3J4X2J1ZmZlcihRRURfTEVBRElOR19IV0ZOKGNkZXYpLAorCQkJCSAgICAgIFFFRF9MRUFESU5HX0hXRk4oY2RldiktPmxsMi0+aGFuZGxlLAorCQkJCSAgICAgIGJ1Zi0+YmFkZHIsIGJ1Zi0+bGVuLAorCQkJCSAgICAgICh2b2lkICopKHVpbnRwdHJfdCljb29raWUsIG5vdGlmeV9mdyk7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JvY2VfbGwyX3N0YXRzKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBzdHJ1Y3QgcWVkX2xsMl9zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IHFlZF9od2ZuICpod2ZuID0gUUVEX0xFQURJTkdfSFdGTihjZGV2KTsKKwlzdHJ1Y3QgcWVkX3JvY2VfbGwyX2luZm8gKnJvY2VfbGwyID0gaHdmbi0+bGwyOworCisJcmV0dXJuIHFlZF9sbDJfZ2V0X3N0YXRzKFFFRF9MRUFESU5HX0hXRk4oY2RldiksCisJCQkJIHJvY2VfbGwyLT5oYW5kbGUsIHN0YXRzKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBxZWRfcmRtYV9vcHMgcWVkX3JkbWFfb3BzX3Bhc3MgPSB7CisJLmNvbW1vbiA9ICZxZWRfY29tbW9uX29wc19wYXNzLAorCS5maWxsX2Rldl9pbmZvID0gJnFlZF9maWxsX3JkbWFfZGV2X2luZm8sCisJLnJkbWFfZ2V0X3JkbWFfY3R4ID0gJnFlZF9yZG1hX2dldF9yZG1hX2N0eCwKKwkucmRtYV9pbml0ID0gJnFlZF9yZG1hX2luaXQsCisJLnJkbWFfYWRkX3VzZXIgPSAmcWVkX3JkbWFfYWRkX3VzZXIsCisJLnJkbWFfcmVtb3ZlX3VzZXIgPSAmcWVkX3JkbWFfcmVtb3ZlX3VzZXIsCisJLnJkbWFfc3RvcCA9ICZxZWRfcmRtYV9zdG9wLAorCS5yZG1hX3F1ZXJ5X3BvcnQgPSAmcWVkX3JkbWFfcXVlcnlfcG9ydCwKKwkucmRtYV9xdWVyeV9kZXZpY2UgPSAmcWVkX3JkbWFfcXVlcnlfZGV2aWNlLAorCS5yZG1hX2dldF9zdGFydF9zYiA9ICZxZWRfcmRtYV9nZXRfc2Jfc3RhcnQsCisJLnJkbWFfZ2V0X3JkbWFfaW50ID0gJnFlZF9yZG1hX2dldF9pbnQsCisJLnJkbWFfc2V0X3JkbWFfaW50ID0gJnFlZF9yZG1hX3NldF9pbnQsCisJLnJkbWFfZ2V0X21pbl9jbnFfbXNpeCA9ICZxZWRfcmRtYV9nZXRfbWluX2NucV9tc2l4LAorCS5yZG1hX2NucV9wcm9kX3VwZGF0ZSA9ICZxZWRfcmRtYV9jbnFfcHJvZF91cGRhdGUsCisJLnJkbWFfYWxsb2NfcGQgPSAmcWVkX3JkbWFfYWxsb2NfcGQsCisJLnJkbWFfZGVhbGxvY19wZCA9ICZxZWRfcmRtYV9mcmVlX3BkLAorCS5yZG1hX2NyZWF0ZV9jcSA9ICZxZWRfcmRtYV9jcmVhdGVfY3EsCisJLnJkbWFfZGVzdHJveV9jcSA9ICZxZWRfcmRtYV9kZXN0cm95X2NxLAorCS5yZG1hX2NyZWF0ZV9xcCA9ICZxZWRfcmRtYV9jcmVhdGVfcXAsCisJLnJkbWFfbW9kaWZ5X3FwID0gJnFlZF9yZG1hX21vZGlmeV9xcCwKKwkucmRtYV9xdWVyeV9xcCA9ICZxZWRfcmRtYV9xdWVyeV9xcCwKKwkucmRtYV9kZXN0cm95X3FwID0gJnFlZF9yZG1hX2Rlc3Ryb3lfcXAsCisJLnJkbWFfYWxsb2NfdGlkID0gJnFlZF9yZG1hX2FsbG9jX3RpZCwKKwkucmRtYV9mcmVlX3RpZCA9ICZxZWRfcmRtYV9mcmVlX3RpZCwKKwkucmRtYV9yZWdpc3Rlcl90aWQgPSAmcWVkX3JkbWFfcmVnaXN0ZXJfdGlkLAorCS5yZG1hX2RlcmVnaXN0ZXJfdGlkID0gJnFlZF9yZG1hX2RlcmVnaXN0ZXJfdGlkLAorCS5yb2NlX2xsMl9zdGFydCA9ICZxZWRfcm9jZV9sbDJfc3RhcnQsCisJLnJvY2VfbGwyX3N0b3AgPSAmcWVkX3JvY2VfbGwyX3N0b3AsCisJLnJvY2VfbGwyX3R4ID0gJnFlZF9yb2NlX2xsMl90eCwKKwkucm9jZV9sbDJfcG9zdF9yeF9idWZmZXIgPSAmcWVkX3JvY2VfbGwyX3Bvc3RfcnhfYnVmZmVyLAorCS5yb2NlX2xsMl9zZXRfbWFjX2ZpbHRlciA9ICZxZWRfcm9jZV9sbDJfc2V0X21hY19maWx0ZXIsCisJLnJvY2VfbGwyX3N0YXRzID0gJnFlZF9yb2NlX2xsMl9zdGF0cywKK307CisKK2NvbnN0IHN0cnVjdCBxZWRfcmRtYV9vcHMgKnFlZF9nZXRfcmRtYV9vcHMoKQoreworCXJldHVybiAmcWVkX3JkbWFfb3BzX3Bhc3M7Cit9CitFWFBPUlRfU1lNQk9MKHFlZF9nZXRfcmRtYV9vcHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfcm9jZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfcm9jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMDkxZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9yb2NlLmgKQEAgLTAsMCArMSwyMTYgQEAKKy8qIFFMb2dpYyBxZWQgTklDIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgIFFMb2dpYyBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9RRURfUk9DRV9ICisjZGVmaW5lIF9RRURfUk9DRV9ICisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcWVkL3FlZF9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L3FlZC9xZWRfcm9jZV9pZi5oPgorI2luY2x1ZGUgInFlZC5oIgorI2luY2x1ZGUgInFlZF9kZXZfYXBpLmgiCisjaW5jbHVkZSAicWVkX2hzaS5oIgorI2luY2x1ZGUgInFlZF9sbDIuaCIKKworI2RlZmluZSBRRURfUkRNQV9NQVhfRk1SICAgICAgICAgICAgICAgICAgICAoUkRNQV9NQVhfVElEUykKKyNkZWZpbmUgUUVEX1JETUFfTUFYX1BfS0VZICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIFFFRF9SRE1BX01BWF9XUUUgICAgICAgICAgICAgICAgICAgICgweDdGRkYpCisjZGVmaW5lIFFFRF9SRE1BX01BWF9TUlFfV1FFX0VMRU0gICAgICAgICAgICgweDdGRkYpCisjZGVmaW5lIFFFRF9SRE1BX1BBR0VfU0laRV9DQVBTICAgICAgICAgICAgICgweEZGRkZGMDAwKQorI2RlZmluZSBRRURfUkRNQV9BQ0tfREVMQVkgICAgICAgICAgICAgICAgICAoMTUpCisjZGVmaW5lIFFFRF9SRE1BX01BWF9NUl9TSVpFICAgICAgICAgICAgICAgICgweDEwMDAwMDAwMDAwVUxMKQorI2RlZmluZSBRRURfUkRNQV9NQVhfQ1FTICAgICAgICAgICAgICAgICAgICAoUkRNQV9NQVhfQ1FTKQorI2RlZmluZSBRRURfUkRNQV9NQVhfTVJTICAgICAgICAgICAgICAgICAgICAoUkRNQV9NQVhfVElEUykKKy8qIEFkZCAxIGZvciBoZWFkZXIgZWxlbWVudCAqLworI2RlZmluZSBRRURfUkRNQV9NQVhfU1JRX0VMRU1fUEVSX1dRRQkgICAgKFJETUFfTUFYX1NHRV9QRVJfUlFfV1FFICsgMSkKKyNkZWZpbmUgUUVEX1JETUFfTUFYX1NHRV9QRVJfU1JRX1dRRSAgICAgICAgKFJETUFfTUFYX1NHRV9QRVJfUlFfV1FFKQorI2RlZmluZSBRRURfUkRNQV9TUlFfV1FFX0VMRU1fU0laRSAgICAgICAgICAoMTYpCisjZGVmaW5lIFFFRF9SRE1BX01BWF9TUlFTICAgICAgICAgICAgICAgICAgICgzMiAqIDEwMjQpCisKKyNkZWZpbmUgUUVEX1JETUFfTUFYX0NRRV8zMl9CSVQgICAgICAgICAgICAgKDB4N0ZGRkZGRkYgLSAxKQorI2RlZmluZSBRRURfUkRNQV9NQVhfQ1FFXzE2X0JJVCAgICAgICAgICAgICAoMHg3RkZGIC0gMSkKKworZW51bSBxZWRfcmRtYV90b2dnbGVfYml0IHsKKwlRRURfUkRNQV9UT0dHTEVfQklUX0NMRUFSID0gMCwKKwlRRURfUkRNQV9UT0dHTEVfQklUX1NFVCA9IDEKK307CisKK3N0cnVjdCBxZWRfYm1hcCB7CisJdW5zaWduZWQgbG9uZyAqYml0bWFwOworCXUzMiBtYXhfY291bnQ7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfaW5mbyB7CisJLyogc3BpbiBsb2NrIHRvIHByb3RlY3QgYml0bWFwcyAqLworCXNwaW5sb2NrX3QgbG9jazsKKworCXN0cnVjdCBxZWRfYm1hcCBjcV9tYXA7CisJc3RydWN0IHFlZF9ibWFwIHBkX21hcDsKKwlzdHJ1Y3QgcWVkX2JtYXAgdGlkX21hcDsKKwlzdHJ1Y3QgcWVkX2JtYXAgcXBfbWFwOworCXN0cnVjdCBxZWRfYm1hcCBzcnFfbWFwOworCXN0cnVjdCBxZWRfYm1hcCBjaWRfbWFwOworCXN0cnVjdCBxZWRfYm1hcCBkcGlfbWFwOworCXN0cnVjdCBxZWRfYm1hcCB0b2dnbGVfYml0czsKKwlzdHJ1Y3QgcWVkX3JkbWFfZXZlbnRzIGV2ZW50czsKKwlzdHJ1Y3QgcWVkX3JkbWFfZGV2aWNlICpkZXY7CisJc3RydWN0IHFlZF9yZG1hX3BvcnQgKnBvcnQ7CisJdTMyIGxhc3RfdGlkOworCXU4IG51bV9jbnFzOworCXUzMiBudW1fcXBzOworCXUzMiBudW1fbXJzOworCXUxNiBxdWV1ZV96b25lX2Jhc2U7CisJZW51bSBwcm90b2NvbF90eXBlIHByb3RvOworfTsKKworc3RydWN0IHFlZF9yZG1hX3Jlc2l6ZV9jcV9pbl9wYXJhbXMgeworCXUxNiBpY2lkOworCXUzMiBjcV9zaXplOworCWJvb2wgcGJsX3R3b19sZXZlbDsKKwl1NjQgcGJsX3B0cjsKKwl1MTYgcGJsX251bV9wYWdlczsKKwl1OCBwYmxfcGFnZV9zaXplX2xvZzsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9yZXNpemVfY3Ffb3V0X3BhcmFtcyB7CisJdTMyIHByb2Q7CisJdTMyIGNvbnM7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfcmVzaXplX2NucV9pbl9wYXJhbXMgeworCXUzMiBjbnFfaWQ7CisJdTMyIHBibF9wYWdlX3NpemVfbG9nOworCXU2NCBwYmxfcHRyOworfTsKKworc3RydWN0IHFlZF9yZG1hX3FwIHsKKwlzdHJ1Y3QgcmVncGFpciBxcF9oYW5kbGU7CisJc3RydWN0IHJlZ3BhaXIgcXBfaGFuZGxlX2FzeW5jOworCXUzMiBxcGlkOworCXUxNiBpY2lkOworCWVudW0gcWVkX3JvY2VfcXBfc3RhdGUgY3VyX3N0YXRlOworCWJvb2wgdXNlX3NycTsKKwlib29sIHNpZ25hbF9hbGw7CisJYm9vbCBmbXJfYW5kX3Jlc2VydmVkX2xrZXk7CisKKwlib29sIGluY29taW5nX3JkbWFfcmVhZF9lbjsKKwlib29sIGluY29taW5nX3JkbWFfd3JpdGVfZW47CisJYm9vbCBpbmNvbWluZ19hdG9taWNfZW47CisJYm9vbCBlMmVfZmxvd19jb250cm9sX2VuOworCisJdTE2IHBkOworCXUxNiBwa2V5OworCXUzMiBkZXN0X3FwOworCXUxNiBtdHU7CisJdTE2IHNycV9pZDsKKwl1OCB0cmFmZmljX2NsYXNzX3RvczsKKwl1OCBob3BfbGltaXRfdHRsOworCXUxNiBkcGk7CisJdTMyIGZsb3dfbGFiZWw7CisJYm9vbCBsYl9pbmRpY2F0aW9uOworCXUxNiB2bGFuX2lkOworCXUzMiBhY2tfdGltZW91dDsKKwl1OCByZXRyeV9jbnQ7CisJdTggcm5yX3JldHJ5X2NudDsKKwl1OCBtaW5fcm5yX25ha190aW1lcjsKKwlib29sIHNxZF9hc3luYzsKKwl1bmlvbiBxZWRfZ2lkIHNnaWQ7CisJdW5pb24gcWVkX2dpZCBkZ2lkOworCWVudW0gcm9jZV9tb2RlIHJvY2VfbW9kZTsKKwl1MTYgdWRwX3NyY19wb3J0OworCXU4IHN0YXRzX3F1ZXVlOworCisJLyogcmVxdWVzZXRlciAqLworCXU4IG1heF9yZF9hdG9taWNfcmVxOworCXUzMiBzcV9wc247CisJdTE2IHNxX2NxX2lkOworCXUxNiBzcV9udW1fcGFnZXM7CisJZG1hX2FkZHJfdCBzcV9wYmxfcHRyOworCXZvaWQgKm9ycTsKKwlkbWFfYWRkcl90IG9ycV9waHlzX2FkZHI7CisJdTggb3JxX251bV9wYWdlczsKKwlib29sIHJlcV9vZmZsb2FkZWQ7CisKKwkvKiByZXNwb25kZXIgKi8KKwl1OCBtYXhfcmRfYXRvbWljX3Jlc3A7CisJdTMyIHJxX3BzbjsKKwl1MTYgcnFfY3FfaWQ7CisJdTE2IHJxX251bV9wYWdlczsKKwlkbWFfYWRkcl90IHJxX3BibF9wdHI7CisJdm9pZCAqaXJxOworCWRtYV9hZGRyX3QgaXJxX3BoeXNfYWRkcjsKKwl1OCBpcnFfbnVtX3BhZ2VzOworCWJvb2wgcmVzcF9vZmZsb2FkZWQ7CisKKwl1OCByZW1vdGVfbWFjX2FkZHJbNl07CisJdTggbG9jYWxfbWFjX2FkZHJbNl07CisKKwl2b2lkICpzaGFyZWRfcXVldWU7CisJZG1hX2FkZHJfdCBzaGFyZWRfcXVldWVfcGh5c19hZGRyOworfTsKKworaW50CitxZWRfcmRtYV9hZGRfdXNlcih2b2lkICpyZG1hX2N4dCwKKwkJICBzdHJ1Y3QgcWVkX3JkbWFfYWRkX3VzZXJfb3V0X3BhcmFtcyAqb3V0X3BhcmFtcyk7CitpbnQgcWVkX3JkbWFfYWxsb2NfcGQodm9pZCAqcmRtYV9jeHQsIHUxNiAqcGQpOworaW50IHFlZF9yZG1hX2FsbG9jX3RpZCh2b2lkICpyZG1hX2N4dCwgdTMyICp0aWQpOworaW50IHFlZF9yZG1hX2RlcmVnaXN0ZXJfdGlkKHZvaWQgKnJkbWFfY3h0LCB1MzIgdGlkKTsKK3ZvaWQgcWVkX3JkbWFfZnJlZV90aWQodm9pZCAqcmRtYV9jeHQsIHUzMiB0aWQpOworc3RydWN0IHFlZF9yZG1hX2RldmljZSAqcWVkX3JkbWFfcXVlcnlfZGV2aWNlKHZvaWQgKnJkbWFfY3h0KTsKK3N0cnVjdCBxZWRfcmRtYV9wb3J0ICpxZWRfcmRtYV9xdWVyeV9wb3J0KHZvaWQgKnJkbWFfY3h0KTsKK2ludAorcWVkX3JkbWFfcmVnaXN0ZXJfdGlkKHZvaWQgKnJkbWFfY3h0LAorCQkgICAgICBzdHJ1Y3QgcWVkX3JkbWFfcmVnaXN0ZXJfdGlkX2luX3BhcmFtcyAqcGFyYW1zKTsKK3ZvaWQgcWVkX3JkbWFfcmVtb3ZlX3VzZXIodm9pZCAqcmRtYV9jeHQsIHUxNiBkcGkpOworaW50IHFlZF9yZG1hX3N0YXJ0KHZvaWQgKnBfaHdmbiwgc3RydWN0IHFlZF9yZG1hX3N0YXJ0X2luX3BhcmFtcyAqcGFyYW1zKTsKK2ludCBxZWRfcmRtYV9zdG9wKHZvaWQgKnJkbWFfY3h0KTsKK3UzMiBxZWRfcmRtYV9nZXRfc2JfaWQodm9pZCAqcF9od2ZuLCB1MzIgcmVsX3NiX2lkKTsKK3UzMiBxZWRfcmRtYV9xdWVyeV9jYXVfdGltZXJfcmVzKHZvaWQgKnBfaHdmbik7Cit2b2lkIHFlZF9yZG1hX2NucV9wcm9kX3VwZGF0ZSh2b2lkICpyZG1hX2N4dCwgdTggY25xX2luZGV4LCB1MTYgcHJvZCk7Cit2b2lkIHFlZF9yZG1hX3Jlc2NfZnJlZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbik7Cit2b2lkIHFlZF9hc3luY19yb2NlX2V2ZW50KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICBzdHJ1Y3QgZXZlbnRfcmluZ19lbnRyeSAqcF9lcWUpOworaW50IHFlZF9yZG1hX2Rlc3Ryb3lfcXAodm9pZCAqcmRtYV9jeHQsIHN0cnVjdCBxZWRfcmRtYV9xcCAqcXApOworaW50IHFlZF9yZG1hX21vZGlmeV9xcCh2b2lkICpyZG1hX2N4dCwgc3RydWN0IHFlZF9yZG1hX3FwICpxcCwKKwkJICAgICAgIHN0cnVjdCBxZWRfcmRtYV9tb2RpZnlfcXBfaW5fcGFyYW1zICpwYXJhbXMpOworaW50IHFlZF9yZG1hX3F1ZXJ5X3FwKHZvaWQgKnJkbWFfY3h0LCBzdHJ1Y3QgcWVkX3JkbWFfcXAgKnFwLAorCQkgICAgICBzdHJ1Y3QgcWVkX3JkbWFfcXVlcnlfcXBfb3V0X3BhcmFtcyAqb3V0X3BhcmFtcyk7CisKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JTkZJTklCQU5EX1FFRFIpCit2b2lkIHFlZF9yZG1hX2RwbV9iYXIoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCk7CisjZWxzZQordm9pZCBxZWRfcmRtYV9kcG1fYmFyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpIHt9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfc2VsZnRlc3QuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NlbGZ0ZXN0LmMKaW5kZXggYTM0MmJmZS4uOWI3Njc4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfc2VsZnRlc3QuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9zZWxmdGVzdC5jCkBAIC0yLDYgKzIsNyBAQAogI2luY2x1ZGUgInFlZF9kZXZfYXBpLmgiCiAjaW5jbHVkZSAicWVkX21jcC5oIgogI2luY2x1ZGUgInFlZF9zcC5oIgorI2luY2x1ZGUgInFlZF9zZWxmdGVzdC5oIgogCiBpbnQgcWVkX3NlbGZ0ZXN0X21lbW9yeShzdHJ1Y3QgcWVkX2RldiAqY2RldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NwLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9zcC5oCmluZGV4IGE1NDg1MDQuLjY1MmM5MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NwLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfc3AuaApAQCAtNjEsNiArNjEsMTAgQEAKIAlzdHJ1Y3QgdnBvcnRfc3RhcnRfcmFtcm9kX2RhdGEgdnBvcnRfc3RhcnQ7CiAJc3RydWN0IHZwb3J0X3N0b3BfcmFtcm9kX2RhdGEgdnBvcnRfc3RvcDsKIAlzdHJ1Y3QgdnBvcnRfdXBkYXRlX3JhbXJvZF9kYXRhIHZwb3J0X3VwZGF0ZTsKKwlzdHJ1Y3QgY29yZV9yeF9zdGFydF9yYW1yb2RfZGF0YSBjb3JlX3J4X3F1ZXVlX3N0YXJ0OworCXN0cnVjdCBjb3JlX3J4X3N0b3BfcmFtcm9kX2RhdGEgY29yZV9yeF9xdWV1ZV9zdG9wOworCXN0cnVjdCBjb3JlX3R4X3N0YXJ0X3JhbXJvZF9kYXRhIGNvcmVfdHhfcXVldWVfc3RhcnQ7CisJc3RydWN0IGNvcmVfdHhfc3RvcF9yYW1yb2RfZGF0YSBjb3JlX3R4X3F1ZXVlX3N0b3A7CiAJc3RydWN0IHZwb3J0X2ZpbHRlcl91cGRhdGVfcmFtcm9kX2RhdGEgdnBvcnRfZmlsdGVyX3VwZGF0ZTsKIAogCXN0cnVjdCByZG1hX2luaXRfZnVuY19yYW1yb2RfZGF0YSByZG1hX2luaXRfZnVuYzsKQEAgLTgxLDYgKzg1LDcgQEAKIAlzdHJ1Y3QgcmRtYV9zcnFfY3JlYXRlX3JhbXJvZF9kYXRhIHJkbWFfY3JlYXRlX3NycTsKIAlzdHJ1Y3QgcmRtYV9zcnFfZGVzdHJveV9yYW1yb2RfZGF0YSByZG1hX2Rlc3Ryb3lfc3JxOwogCXN0cnVjdCByZG1hX3NycV9tb2RpZnlfcmFtcm9kX2RhdGEgcmRtYV9tb2RpZnlfc3JxOworCXN0cnVjdCByb2NlX2luaXRfZnVuY19yYW1yb2RfZGF0YSByb2NlX2luaXRfZnVuYzsKIAogCXN0cnVjdCBpc2NzaV9zbG93X3BhdGhfaGRyIGlzY3NpX2VtcHR5OwogCXN0cnVjdCBpc2NzaV9pbml0X3JhbXJvZF9wYXJhbXMgaXNjc2lfaW5pdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NwX2NvbW1hbmRzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9zcF9jb21tYW5kcy5jCmluZGV4IGE1MmYzZmMuLjI4ODhlYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NwX2NvbW1hbmRzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfc3BfY29tbWFuZHMuYwpAQCAtMjUsOSArMjUsNyBAQAogCiBpbnQgcWVkX3NwX2luaXRfcmVxdWVzdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJCXN0cnVjdCBxZWRfc3BxX2VudHJ5ICoqcHBfZW50LAotCQkJdTggY21kLAotCQkJdTggcHJvdG9jb2wsCi0JCQlzdHJ1Y3QgcWVkX3NwX2luaXRfZGF0YSAqcF9kYXRhKQorCQkJdTggY21kLCB1OCBwcm90b2NvbCwgc3RydWN0IHFlZF9zcF9pbml0X2RhdGEgKnBfZGF0YSkKIHsKIAl1MzIgb3BhcXVlX2NpZCA9IHBfZGF0YS0+b3BhcXVlX2ZpZCA8PCAxNiB8IHBfZGF0YS0+Y2lkOwogCXN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudCA9IE5VTEw7CkBAIC0zOCw3ICszNiw3IEBACiAKIAlyYyA9IHFlZF9zcHFfZ2V0X2VudHJ5KHBfaHdmbiwgcHBfZW50KTsKIAotCWlmIChyYyAhPSAwKQorCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCiAJcF9lbnQgPSAqcHBfZW50OwpAQCAtMzIxLDggKzMxOSw3IEBACiAKIAlyYyA9IHFlZF9zcF9pbml0X3JlcXVlc3QocF9od2ZuLCAmcF9lbnQsCiAJCQkJIENPTU1PTl9SQU1ST0RfUEZfU1RBUlQsCi0JCQkJIFBST1RPQ09MSURfQ09NTU9OLAotCQkJCSAmaW5pdF9kYXRhKTsKKwkJCQkgUFJPVE9DT0xJRF9DT01NT04sICZpbml0X2RhdGEpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCkBAIC0zNTYsOCArMzUzLDcgQEAKIAlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+Y29uc29saWRfcV9wYmxfYWRkciwKIAkJICAgICAgIHBfaHdmbi0+cF9jb25zcS0+Y2hhaW4ucGJsLnBfcGh5c190YWJsZSk7CiAKLQlxZWRfdHVubl9zZXRfcGZfc3RhcnRfcGFyYW1zKHBfaHdmbiwgcF90dW5uLAotCQkJCSAgICAgJnBfcmFtcm9kLT50dW5uZWxfY29uZmlnKTsKKwlxZWRfdHVubl9zZXRfcGZfc3RhcnRfcGFyYW1zKHBfaHdmbiwgcF90dW5uLCAmcF9yYW1yb2QtPnR1bm5lbF9jb25maWcpOwogCiAJaWYgKElTX01GX1NJKHBfaHdmbikpCiAJCXBfcmFtcm9kLT5hbGxvd19ucGFyX3R4X3N3aXRjaGluZyA9IGFsbG93X25wYXJfdHhfc3dpdGNoOwpAQCAtMzg5LDggKzM4NSw3IEBACiAKIAlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19TUFEsCiAJCSAgICJTZXR0aW5nIGV2ZW50X3Jpbmdfc2IgW2lkICUwNHggaW5kZXggJTAyeF0sIG91dGVyX3RhZyBbJWRdXG4iLAotCQkgICBzYiwgc2JfaW5kZXgsCi0JCSAgIHBfcmFtcm9kLT5vdXRlcl90YWcpOworCQkgICBzYiwgc2JfaW5kZXgsIHBfcmFtcm9kLT5vdXRlcl90YWcpOwogCiAJcmMgPSBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgTlVMTCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NwcS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfc3BxLmMKaW5kZXggZDczNDU2ZS4uY2FmZjQxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfc3BxLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfc3BxLmMKQEAgLTI4LDYgKzI4LDkgQEAKICNpbmNsdWRlICJxZWRfcmVnX2FkZHIuaCIKICNpbmNsdWRlICJxZWRfc3AuaCIKICNpbmNsdWRlICJxZWRfc3Jpb3YuaCIKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JTkZJTklCQU5EX1FFRFIpCisjaW5jbHVkZSAicWVkX3JvY2UuaCIKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFN0cnVjdHVyZXMgJiBEZWZpbml0aW9ucwpAQCAtNDEsOCArNDQsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgcWVkX3NwcV9ibG9ja2luZ19jYihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJCQl2b2lkICpjb29raWUsCi0JCQkJdW5pb24gZXZlbnRfcmluZ19kYXRhICpkYXRhLAotCQkJCXU4IGZ3X3JldHVybl9jb2RlKQorCQkJCXVuaW9uIGV2ZW50X3JpbmdfZGF0YSAqZGF0YSwgdTggZndfcmV0dXJuX2NvZGUpCiB7CiAJc3RydWN0IHFlZF9zcHFfY29tcF9kb25lICpjb21wX2RvbmU7CiAKQEAgLTEwOSw5ICsxMTEsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTUFEgZW50cmllcyBpbm5lciBBUEkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQKLXFlZF9zcHFfZmlsbF9lbnRyeShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICAgc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50KQorc3RhdGljIGludCBxZWRfc3BxX2ZpbGxfZW50cnkoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgICBzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQpCiB7CiAJcF9lbnQtPmZsYWdzID0gMDsKIApAQCAtMTg5LDggKzE5MCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgcWVkX3NwcV9od19wb3N0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICAgc3RydWN0IHFlZF9zcHEgKnBfc3BxLAotCQkJICAgc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50KQorCQkJICAgc3RydWN0IHFlZF9zcHEgKnBfc3BxLCBzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQpCiB7CiAJc3RydWN0IHFlZF9jaGFpbiAqcF9jaGFpbiA9ICZwX2h3Zm4tPnBfc3BxLT5jaGFpbjsKIAl1MTYgZWNobyA9IHFlZF9jaGFpbl9nZXRfcHJvZF9pZHgocF9jaGFpbik7CkBAIC0yNDAsNiArMjQwLDExIEBACiAJCQkgICBzdHJ1Y3QgZXZlbnRfcmluZ19lbnRyeSAqcF9lcWUpCiB7CiAJc3dpdGNoIChwX2VxZS0+cHJvdG9jb2xfaWQpIHsKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JTkZJTklCQU5EX1FFRFIpCisJY2FzZSBQUk9UT0NPTElEX1JPQ0U6CisJCXFlZF9hc3luY19yb2NlX2V2ZW50KHBfaHdmbiwgcF9lcWUpOworCQlyZXR1cm4gMDsKKyNlbmRpZgogCWNhc2UgUFJPVE9DT0xJRF9DT01NT046CiAJCXJldHVybiBxZWRfc3Jpb3ZfZXFlX2V2ZW50KHBfaHdmbiwKIAkJCQkJICAgcF9lcWUtPm9wY29kZSwKQEAgLTI1NSw4ICsyNjAsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBFUSBBUEkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcWVkX2VxX3Byb2RfdXBkYXRlKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJdTE2IHByb2QpCit2b2lkIHFlZF9lcV9wcm9kX3VwZGF0ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTE2IHByb2QpCiB7CiAJdTMyIGFkZHIgPSBHVFRfQkFSMF9NQVBfUkVHX1VTRE1fUkFNICsKIAkJICAgVVNUT1JNX0VRRV9DT05TX09GRlNFVChwX2h3Zm4tPnJlbF9wZl9pZCk7CkBAIC0yNjcsOSArMjcxLDcgQEAKIAltbWlvd2IoKTsKIH0KIAotaW50IHFlZF9lcV9jb21wbGV0aW9uKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkgICAgICB2b2lkICpjb29raWUpCi0KK2ludCBxZWRfZXFfY29tcGxldGlvbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdm9pZCAqY29va2llKQogewogCXN0cnVjdCBxZWRfZXEgKnBfZXEgPSBjb29raWU7CiAJc3RydWN0IHFlZF9jaGFpbiAqcF9jaGFpbiA9ICZwX2VxLT5jaGFpbjsKQEAgLTMyMywxNyArMzI1LDE0IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdHJ1Y3QgcWVkX2VxICpxZWRfZXFfYWxsb2Moc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgICAgdTE2IG51bV9lbGVtKQorc3RydWN0IHFlZF9lcSAqcWVkX2VxX2FsbG9jKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1MTYgbnVtX2VsZW0pCiB7CiAJc3RydWN0IHFlZF9lcSAqcF9lcTsKIAogCS8qIEFsbG9jYXRlIEVRIHN0cnVjdCAqLwogCXBfZXEgPSBremFsbG9jKHNpemVvZigqcF9lcSksIEdGUF9LRVJORUwpOwotCWlmICghcF9lcSkgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGBzdHJ1Y3QgcWVkX2VxJ1xuIik7CisJaWYgKCFwX2VxKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBFUSBjaGFpbiovCiAJaWYgKHFlZF9jaGFpbl9hbGxvYyhwX2h3Zm4tPmNkZXYsCkBAIC0zNDIsMTcgKzM0MSwxMiBAQAogCQkJICAgIFFFRF9DSEFJTl9DTlRfVFlQRV9VMTYsCiAJCQkgICAgbnVtX2VsZW0sCiAJCQkgICAgc2l6ZW9mKHVuaW9uIGV2ZW50X3JpbmdfZWxlbWVudCksCi0JCQkgICAgJnBfZXEtPmNoYWluKSkgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGVxIGNoYWluXG4iKTsKKwkJCSAgICAmcF9lcS0+Y2hhaW4pKQogCQlnb3RvIGVxX2FsbG9jYXRlX2ZhaWw7Ci0JfQogCiAJLyogcmVnaXN0ZXIgRVEgY29tcGxldGlvbiBvbiB0aGUgU1AgU0IgKi8KLQlxZWRfaW50X3JlZ2lzdGVyX2NiKHBfaHdmbiwKLQkJCSAgICBxZWRfZXFfY29tcGxldGlvbiwKLQkJCSAgICBwX2VxLAotCQkJICAgICZwX2VxLT5lcV9zYl9pbmRleCwKLQkJCSAgICAmcF9lcS0+cF9md19jb25zKTsKKwlxZWRfaW50X3JlZ2lzdGVyX2NiKHBfaHdmbiwgcWVkX2VxX2NvbXBsZXRpb24sCisJCQkgICAgcF9lcSwgJnBfZXEtPmVxX3NiX2luZGV4LCAmcF9lcS0+cF9md19jb25zKTsKIAogCXJldHVybiBwX2VxOwogCkBAIC0zNjEsMTQgKzM1NSwxMiBAQAogCXJldHVybiBOVUxMOwogfQogCi12b2lkIHFlZF9lcV9zZXR1cChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICBzdHJ1Y3QgcWVkX2VxICpwX2VxKQordm9pZCBxZWRfZXFfc2V0dXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfZXEgKnBfZXEpCiB7CiAJcWVkX2NoYWluX3Jlc2V0KCZwX2VxLT5jaGFpbik7CiB9CiAKLXZvaWQgcWVkX2VxX2ZyZWUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSBzdHJ1Y3QgcWVkX2VxICpwX2VxKQordm9pZCBxZWRfZXFfZnJlZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9lcSAqcF9lcSkKIHsKIAlpZiAoIXBfZXEpCiAJCXJldHVybjsKQEAgLTM3OSwxMCArMzcxLDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ1FFIEFQSSAtIG1hbmlwdWxhdGUgRVEgZnVuY3Rpb25hbGl0eQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBxZWRfY3FlX2NvbXBsZXRpb24oCi0Jc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0Jc3RydWN0IGV0aF9zbG93X3BhdGhfcnhfY3FlICpjcWUsCi0JZW51bSBwcm90b2NvbF90eXBlIHByb3RvY29sKQorc3RhdGljIGludCBxZWRfY3FlX2NvbXBsZXRpb24oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgICBzdHJ1Y3QgZXRoX3Nsb3dfcGF0aF9yeF9jcWUgKmNxZSwKKwkJCSAgICAgIGVudW0gcHJvdG9jb2xfdHlwZSBwcm90b2NvbCkKIHsKIAlpZiAoSVNfVkYocF9od2ZuLT5jZGV2KSkKIAkJcmV0dXJuIDA7CkBAIC00NjMsMTIgKzQ1NCw5IEBACiAJdTMyIGNhcGFjaXR5OwogCiAJLyogU1BRIHN0cnVjdCAqLwotCXBfc3BxID0KLQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHFlZF9zcHEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBfc3BxKSB7Ci0JCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgYHN0cnVjdCBxZWRfc3BxJ1xuIik7CisJcF9zcHEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcWVkX3NwcSksIEdGUF9LRVJORUwpOworCWlmICghcF9zcHEpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCS8qIFNQUSByaW5nICAqLwogCWlmIChxZWRfY2hhaW5fYWxsb2MocF9od2ZuLT5jZGV2LApAQCAtNDc3LDE4ICs0NjUsMTQgQEAKIAkJCSAgICBRRURfQ0hBSU5fQ05UX1RZUEVfVTE2LAogCQkJICAgIDAsICAgLyogTi9BIHdoZW4gdGhlIG1vZGUgaXMgU0lOR0xFICovCiAJCQkgICAgc2l6ZW9mKHN0cnVjdCBzbG93X3BhdGhfZWxlbWVudCksCi0JCQkgICAgJnBfc3BxLT5jaGFpbikpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzcHEgY2hhaW5cbiIpOworCQkJICAgICZwX3NwcS0+Y2hhaW4pKQogCQlnb3RvIHNwcV9hbGxvY2F0ZV9mYWlsOwotCX0KIAogCS8qIGFsbG9jYXRlIGFuZCBmaWxsIHRoZSBTUFEgZWxlbWVudHMgKGluY2wuIHJhbXJvZCBkYXRhIGxpc3QpICovCiAJY2FwYWNpdHkgPSBxZWRfY2hhaW5fZ2V0X2NhcGFjaXR5KCZwX3NwcS0+Y2hhaW4pOwogCXBfdmlydCA9IGRtYV9hbGxvY19jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsCi0JCQkJICAgIGNhcGFjaXR5ICoKLQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBxZWRfc3BxX2VudHJ5KSwKKwkJCQkgICAgY2FwYWNpdHkgKiBzaXplb2Yoc3RydWN0IHFlZF9zcHFfZW50cnkpLAogCQkJCSAgICAmcF9waHlzLCBHRlBfS0VSTkVMKTsKLQogCWlmICghcF92aXJ0KQogCQlnb3RvIHNwcV9hbGxvY2F0ZV9mYWlsOwogCkBAIC01MjUsOSArNTA5LDcgQEAKIAlrZnJlZShwX3NwcSk7CiB9CiAKLWludAotcWVkX3NwcV9nZXRfZW50cnkoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgc3RydWN0IHFlZF9zcHFfZW50cnkgKipwcF9lbnQpCitpbnQgcWVkX3NwcV9nZXRfZW50cnkoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfc3BxX2VudHJ5ICoqcHBfZW50KQogewogCXN0cnVjdCBxZWRfc3BxICpwX3NwcSA9IHBfaHdmbi0+cF9zcHE7CiAJc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50ID0gTlVMTDsKQEAgLTUzOCwxNCArNTIwLDE1IEBACiAJaWYgKGxpc3RfZW1wdHkoJnBfc3BxLT5mcmVlX3Bvb2wpKSB7CiAJCXBfZW50ID0ga3phbGxvYyhzaXplb2YoKnBfZW50KSwgR0ZQX0FUT01JQyk7CiAJCWlmICghcF9lbnQpIHsKKwkJCURQX05PVElDRShwX2h3Zm4sCisJCQkJICAiRmFpbGVkIHRvIGFsbG9jYXRlIGFuIFNQUSBlbnRyeSBmb3IgYSBwZW5kaW5nIHJhbXJvZFxuIik7CiAJCQlyYyA9IC1FTk9NRU07CiAJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0KIAkJcF9lbnQtPnF1ZXVlID0gJnBfc3BxLT51bmxpbWl0ZWRfcGVuZGluZzsKIAl9IGVsc2UgewogCQlwX2VudCA9IGxpc3RfZmlyc3RfZW50cnkoJnBfc3BxLT5mcmVlX3Bvb2wsCi0JCQkJCSBzdHJ1Y3QgcWVkX3NwcV9lbnRyeSwKLQkJCQkJIGxpc3QpOworCQkJCQkgc3RydWN0IHFlZF9zcHFfZW50cnksIGxpc3QpOwogCQlsaXN0X2RlbCgmcF9lbnQtPmxpc3QpOwogCQlwX2VudC0+cXVldWUgPSAmcF9zcHEtPnBlbmRpbmc7CiAJfQpAQCAtNTY0LDggKzU0Nyw3IEBACiAJbGlzdF9hZGRfdGFpbCgmcF9lbnQtPmxpc3QsICZwX2h3Zm4tPnBfc3BxLT5mcmVlX3Bvb2wpOwogfQogCi12b2lkIHFlZF9zcHFfcmV0dXJuX2VudHJ5KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICBzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQpCit2b2lkIHFlZF9zcHFfcmV0dXJuX2VudHJ5KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQpCiB7CiAJc3Bpbl9sb2NrX2JoKCZwX2h3Zm4tPnBfc3BxLT5sb2NrKTsKIAlfX3FlZF9zcHFfcmV0dXJuX2VudHJ5KHBfaHdmbiwgcF9lbnQpOwpAQCAtNTg2LDEwICs1NjgsOSBAQAogICoKICAqIEByZXR1cm4gaW50CiAgKi8KLXN0YXRpYyBpbnQKLXFlZF9zcHFfYWRkX2VudHJ5KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkgIHN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudCwKLQkJICBlbnVtIHNwcV9wcmlvcml0eSBwcmlvcml0eSkKK3N0YXRpYyBpbnQgcWVkX3NwcV9hZGRfZW50cnkoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgIHN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudCwKKwkJCSAgICAgZW51bSBzcHFfcHJpb3JpdHkgcHJpb3JpdHkpCiB7CiAJc3RydWN0IHFlZF9zcHEgKnBfc3BxID0gcF9od2ZuLT5wX3NwcTsKIApAQCAtNjA0LDggKzU4NSw3IEBACiAJCQlzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbjI7CiAKIAkJCXBfZW4yID0gbGlzdF9maXJzdF9lbnRyeSgmcF9zcHEtPmZyZWVfcG9vbCwKLQkJCQkJCSBzdHJ1Y3QgcWVkX3NwcV9lbnRyeSwKLQkJCQkJCSBsaXN0KTsKKwkJCQkJCSBzdHJ1Y3QgcWVkX3NwcV9lbnRyeSwgbGlzdCk7CiAJCQlsaXN0X2RlbCgmcF9lbjItPmxpc3QpOwogCiAJCQkvKiBDb3B5IHRoZSByaW5nIGVsZW1lbnQgcGh5c2ljYWwgcG9pbnRlciB0byB0aGUgbmV3CkBAIC02NTUsOCArNjM1LDcgQEAKICogUG9zdGluZyBuZXcgUmFtcm9kcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGludCBxZWRfc3BxX3Bvc3RfbGlzdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKLQkJCSAgICAgdTMyIGtlZXBfcmVzZXJ2ZSkKKwkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgdTMyIGtlZXBfcmVzZXJ2ZSkKIHsKIAlzdHJ1Y3QgcWVkX3NwcSAqcF9zcHEgPSBwX2h3Zm4tPnBfc3BxOwogCWludCByYzsKQEAgLTY5MCw4ICs2NjksNyBAQAogCQkJYnJlYWs7CiAKIAkJcF9lbnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwX3NwcS0+dW5saW1pdGVkX3BlbmRpbmcsCi0JCQkJCSBzdHJ1Y3QgcWVkX3NwcV9lbnRyeSwKLQkJCQkJIGxpc3QpOworCQkJCQkgc3RydWN0IHFlZF9zcHFfZW50cnksIGxpc3QpOwogCQlpZiAoIXBfZW50KQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTcwNSw4ICs2ODMsNyBAQAogfQogCiBpbnQgcWVkX3NwcV9wb3N0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkgc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50LAotCQkgdTggKmZ3X3JldHVybl9jb2RlKQorCQkgc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50LCB1OCAqZndfcmV0dXJuX2NvZGUpCiB7CiAJaW50IHJjID0gMDsKIAlzdHJ1Y3QgcWVkX3NwcSAqcF9zcHEgPSBwX2h3Zm4gPyBwX2h3Zm4tPnBfc3BxIDogTlVMTDsKQEAgLTgwMyw4ICs3ODAsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNwaW5fbG9ja19iaCgmcF9zcHEtPmxvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwX2VudCwgdG1wLCAmcF9zcHEtPmNvbXBsZXRpb25fcGVuZGluZywKLQkJCQkgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwX2VudCwgdG1wLCAmcF9zcHEtPmNvbXBsZXRpb25fcGVuZGluZywgbGlzdCkgewogCQlpZiAocF9lbnQtPmVsZW0uaGRyLmVjaG8gPT0gZWNobykgewogCQkJdTE2IHBvcyA9IGxlMTZfdG9fY3B1KGVjaG8pICUgU1BRX1JJTkdfU0laRTsKIApAQCAtODQ2LDE1ICs4MjIsMjIgQEAKIAogCWlmICghZm91bmQpIHsKIAkJRFBfTk9USUNFKHBfaHdmbiwKLQkJCSAgIkZhaWxlZCB0byBmaW5kIGFuIGVudHJ5IHRoaXMgRVFFIGNvbXBsZXRlc1xuIik7CisJCQkgICJGYWlsZWQgdG8gZmluZCBhbiBlbnRyeSB0aGlzIEVRRSBbZWNobyAlMDR4XSBjb21wbGV0ZXNcbiIsCisJCQkgIGxlMTZfdG9fY3B1KGVjaG8pKTsKIAkJcmV0dXJuIC1FRVhJU1Q7CiAJfQogCi0JRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfU1BRLCAiQ29tcGxldGU6IGZ1bmMgJXAgY29va2llICVwKVxuIiwKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19TUFEsCisJCSAgICJDb21wbGV0ZSBFUUUgW2VjaG8gJTA0eF06IGZ1bmMgJXAgY29va2llICVwKVxuIiwKKwkJICAgbGUxNl90b19jcHUoZWNobyksCiAJCSAgIHBfZW50LT5jb21wX2NiLmZ1bmN0aW9uLCBwX2VudC0+Y29tcF9jYi5jb29raWUpOwogCWlmIChmb3VuZC0+Y29tcF9jYi5mdW5jdGlvbikKIAkJZm91bmQtPmNvbXBfY2IuZnVuY3Rpb24ocF9od2ZuLCBmb3VuZC0+Y29tcF9jYi5jb29raWUsIHBfZGF0YSwKIAkJCQkJZndfcmV0dXJuX2NvZGUpOworCWVsc2UKKwkJRFBfVkVSQk9TRShwX2h3Zm4sCisJCQkgICBRRURfTVNHX1NQUSwKKwkJCSAgICJHb3QgYSBjb21wbGV0aW9uIHdpdGhvdXQgYSBjYWxsYmFjayBmdW5jdGlvblxuIik7CiAKIAlpZiAoKGZvdW5kLT5jb21wX21vZGUgIT0gUUVEX1NQUV9NT0RFX0VCTE9DSykgfHwKIAkgICAgKGZvdW5kLT5xdWV1ZSA9PSAmcF9zcHEtPnVubGltaXRlZF9wZW5kaW5nKSkKQEAgLTg3OCwxMCArODYxLDggQEAKIAogCS8qIEFsbG9jYXRlIENvbnNRIHN0cnVjdCAqLwogCXBfY29uc3EgPSBremFsbG9jKHNpemVvZigqcF9jb25zcSksIEdGUF9LRVJORUwpOwotCWlmICghcF9jb25zcSkgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGBzdHJ1Y3QgcWVkX2NvbnNxJ1xuIik7CisJaWYgKCFwX2NvbnNxKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBFUSBjaGFpbiovCiAJaWYgKHFlZF9jaGFpbl9hbGxvYyhwX2h3Zm4tPmNkZXYsCkBAIC04ODksMTAgKzg3MCw4IEBACiAJCQkgICAgUUVEX0NIQUlOX01PREVfUEJMLAogCQkJICAgIFFFRF9DSEFJTl9DTlRfVFlQRV9VMTYsCiAJCQkgICAgUUVEX0NIQUlOX1BBR0VfU0laRSAvIDB4ODAsCi0JCQkgICAgMHg4MCwgJnBfY29uc3EtPmNoYWluKSkgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNvbnNxIGNoYWluIik7CisJCQkgICAgMHg4MCwgJnBfY29uc3EtPmNoYWluKSkKIAkJZ290byBjb25zcV9hbGxvY2F0ZV9mYWlsOwotCX0KIAogCXJldHVybiBwX2NvbnNxOwogCkBAIC05MDEsMTQgKzg4MCwxMiBAQAogCXJldHVybiBOVUxMOwogfQogCi12b2lkIHFlZF9jb25zcV9zZXR1cChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICAgICBzdHJ1Y3QgcWVkX2NvbnNxICpwX2NvbnNxKQordm9pZCBxZWRfY29uc3Ffc2V0dXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfY29uc3EgKnBfY29uc3EpCiB7CiAJcWVkX2NoYWluX3Jlc2V0KCZwX2NvbnNxLT5jaGFpbik7CiB9CiAKLXZvaWQgcWVkX2NvbnNxX2ZyZWUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgICBzdHJ1Y3QgcWVkX2NvbnNxICpwX2NvbnNxKQordm9pZCBxZWRfY29uc3FfZnJlZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9jb25zcSAqcF9jb25zcSkKIHsKIAlpZiAoIXBfY29uc3EpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NyaW92LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9zcmlvdi5jCmluZGV4IDE1Mzk5ZGEuLmQyZDY2MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NyaW92LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfc3Jpb3YuYwpAQCAtNjAsNyArNjAsOCBAQAogCX0KIAogCWZwX21pbm9yID0gcF92Zi0+YWNxdWlyZS52ZmRldl9pbmZvLmV0aF9mcF9oc2lfbWlub3I7Ci0JaWYgKGZwX21pbm9yID4gRVRIX0hTSV9WRVJfTUlOT1IpIHsKKwlpZiAoZnBfbWlub3IgPiBFVEhfSFNJX1ZFUl9NSU5PUiAmJgorCSAgICBmcF9taW5vciAhPSBFVEhfSFNJX1ZFUl9OT19QS1RfTEVOX1RVTk4pIHsKIAkJRFBfVkVSQk9TRShwX2h3Zm4sCiAJCQkgICBRRURfTVNHX0lPViwKIAkJCSAgICJWRiBbJWRdIC0gUmVxdWVzdGVkIGZwIGhzaSAlMDJ4LiUwMnggd2hpY2ggaXMgc2xpZ2h0bHkgbmV3ZXIgdGhhbiBQRidzICUwMnguJTAyeDsgQ29uZmlndXJpbmcgUEZzIHZlcnNpb25cbiIsCkBAIC0xMDcsOCArMTA4LDggQEAKIAlyZXR1cm4gcWVkX3NwcV9wb3N0KHBfaHdmbiwgcF9lbnQsIE5VTEwpOwogfQogCi1ib29sIHFlZF9pb3ZfaXNfdmFsaWRfdmZpZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgIGludCByZWxfdmZfaWQsIGJvb2wgYl9lbmFibGVkX29ubHkpCitzdGF0aWMgYm9vbCBxZWRfaW92X2lzX3ZhbGlkX3ZmaWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICBpbnQgcmVsX3ZmX2lkLCBib29sIGJfZW5hYmxlZF9vbmx5KQogewogCWlmICghcF9od2ZuLT5wZl9pb3ZfaW5mbykgewogCQlEUF9OT1RJQ0UocF9od2ZuLT5jZGV2LCAiTm8gaW92IGluZm9cbiIpOwpAQCAtMTg1LDggKzE4Niw4IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1pbnQgcWVkX2lvdl9wb3N0X3ZmX2J1bGxldGluKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICAgICBpbnQgdmZpZCwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQorc3RhdGljIGludCBxZWRfaW92X3Bvc3RfdmZfYnVsbGV0aW4oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgIGludCB2ZmlkLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCiB7CiAJc3RydWN0IHFlZF9idWxsZXRpbl9jb250ZW50ICpwX2J1bGxldGluOwogCWludCBjcmNfc2l6ZSA9IHNpemVvZihwX2J1bGxldGluLT5jcmMpOwpAQCAtNDU0LDEwICs0NTUsOCBAQAogCX0KIAogCXBfc3Jpb3YgPSBremFsbG9jKHNpemVvZigqcF9zcmlvdiksIEdGUF9LRVJORUwpOwotCWlmICghcF9zcmlvdikgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGBzdHJ1Y3QgcWVkX3NyaW92J1xuIik7CisJaWYgKCFwX3NyaW92KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlwX2h3Zm4tPnBmX2lvdl9pbmZvID0gcF9zcmlvdjsKIApAQCAtNTA2LDEwICs1MDUsOSBAQAogCiAJLyogQWxsb2NhdGUgYSBuZXcgc3RydWN0IGZvciBJT1YgaW5mb3JtYXRpb24gKi8KIAljZGV2LT5wX2lvdl9pbmZvID0ga3phbGxvYyhzaXplb2YoKmNkZXYtPnBfaW92X2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNkZXYtPnBfaW92X2luZm8pIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIkNhbid0IHN1cHBvcnQgSU9WIGR1ZSB0byBsYWNrIG9mIG1lbW9yeVxuIik7CisJaWYgKCFjZGV2LT5wX2lvdl9pbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CisKIAljZGV2LT5wX2lvdl9pbmZvLT5wb3MgPSBwb3M7CiAKIAlyYyA9IHFlZF9pb3ZfcGNpX2NmZ19pbmZvKGNkZXYpOwpAQCAtNTc1LDcgKzU3Myw3IEBACiAJfQogfQogCi12b2lkIHFlZF9pb3Zfc2V0X3Zmc190b19kaXNhYmxlKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB1OCB0b19kaXNhYmxlKQorc3RhdGljIHZvaWQgcWVkX2lvdl9zZXRfdmZzX3RvX2Rpc2FibGUoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHU4IHRvX2Rpc2FibGUpCiB7CiAJdTE2IGk7CiAKQEAgLTY5OSw3ICs2OTcsNyBAQAogCQkJCSZxem9uZV9pZCk7CiAKIAkJcmVnX2FkZHIgPSBQU1dIU1RfUkVHX1pPTkVfUEVSTUlTU0lPTl9UQUJMRSArIHF6b25lX2lkICogNDsKLQkJdmFsID0gZW5hYmxlID8gKHZmLT5hYnNfdmZfaWQgfCAoMSA8PCA4KSkgOiAwOworCQl2YWwgPSBlbmFibGUgPyAodmYtPmFic192Zl9pZCB8IEJJVCg4KSkgOiAwOwogCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwgcmVnX2FkZHIsIHZhbCk7CiAJfQogfQpAQCAtMTA5MCwxMyArMTA4OCwxMyBAQAogCiAJLyogUHJlcGFyZSByZXNwb25zZSBmb3IgYWxsIGV4dGVuZGVkIHRsdnMgaWYgdGhleSBhcmUgZm91bmQgYnkgUEYgKi8KIAlmb3IgKGkgPSAwOyBpIDwgUUVEX0lPVl9WUF9VUERBVEVfTUFYOyBpKyspIHsKLQkJaWYgKCEodGx2c19tYXNrICYgKDEgPDwgaSkpKQorCQlpZiAoISh0bHZzX21hc2sgJiBCSVQoaSkpKQogCQkJY29udGludWU7CiAKIAkJcmVzcCA9IHFlZF9hZGRfdGx2KHBfaHdmbiwgJnBfbWJ4LT5vZmZzZXQsCiAJCQkJICAgcWVkX2lvdl92cG9ydF90b190bHYocF9od2ZuLCBpKSwgc2l6ZSk7CiAKLQkJaWYgKHRsdnNfYWNjZXB0ZWQgJiAoMSA8PCBpKSkKKwkJaWYgKHRsdnNfYWNjZXB0ZWQgJiBCSVQoaSkpCiAJCQlyZXNwLT5oZHIuc3RhdHVzID0gc3RhdHVzOwogCQllbHNlCiAJCQlyZXNwLT5oZHIuc3RhdHVzID0gUEZWRl9TVEFUVVNfTk9UX1NVUFBPUlRFRDsKQEAgLTExMzIsOSArMTEzMCwxMCBAQAogCXFlZF9pb3Zfc2VuZF9yZXNwb25zZShwX2h3Zm4sIHBfcHR0LCB2Zl9pbmZvLCBsZW5ndGgsIHN0YXR1cyk7CiB9CiAKLXN0cnVjdCBxZWRfcHVibGljX3ZmX2luZm8gKnFlZF9pb3ZfZ2V0X3B1YmxpY192Zl9pbmZvKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJCQkJICAgICAgdTE2IHJlbGF0aXZlX3ZmX2lkLAotCQkJCQkJICAgICAgYm9vbCBiX2VuYWJsZWRfb25seSkKK3N0YXRpYyBzdHJ1Y3QKK3FlZF9wdWJsaWNfdmZfaW5mbyAqcWVkX2lvdl9nZXRfcHVibGljX3ZmX2luZm8oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICAgICB1MTYgcmVsYXRpdmVfdmZfaWQsCisJCQkJCSAgICAgICBib29sIGJfZW5hYmxlZF9vbmx5KQogewogCXN0cnVjdCBxZWRfdmZfaW5mbyAqdmYgPSBOVUxMOwogCkBAIC0xMTQ1LDcgKzExNDQsNyBAQAogCXJldHVybiAmdmYtPnBfdmZfaW5mbzsKIH0KIAotdm9pZCBxZWRfaW92X2NsZWFuX3ZmKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1OCB2ZmlkKQorc3RhdGljIHZvaWQgcWVkX2lvdl9jbGVhbl92ZihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTggdmZpZCkKIHsKIAlzdHJ1Y3QgcWVkX3B1YmxpY192Zl9pbmZvICp2Zl9pbmZvOwogCkBAIC0xMjQxLDYgKzEyNDAsMTYgQEAKIAkJCSAgIHBfcmVxLT5udW1fdmxhbl9maWx0ZXJzLAogCQkJICAgcF9yZXNwLT5udW1fdmxhbl9maWx0ZXJzLAogCQkJICAgcF9yZXEtPm51bV9tY19maWx0ZXJzLCBwX3Jlc3AtPm51bV9tY19maWx0ZXJzKTsKKworCQkvKiBTb21lIGxlZ2FjeSBPU2VzIGFyZSBpbmNhcGFibGUgb2YgY29ycmVjdGx5IGhhbmRsaW5nIHRoaXMKKwkJICogZmFpbHVyZS4KKwkJICovCisJCWlmICgocF92Zi0+YWNxdWlyZS52ZmRldl9pbmZvLmV0aF9mcF9oc2lfbWlub3IgPT0KKwkJICAgICBFVEhfSFNJX1ZFUl9OT19QS1RfTEVOX1RVTk4pICYmCisJCSAgICAocF92Zi0+YWNxdWlyZS52ZmRldl9pbmZvLm9zX3R5cGUgPT0KKwkJICAgICBWRlBGX0FDUVVJUkVfT1NfV0lORE9XUykpCisJCQlyZXR1cm4gUEZWRl9TVEFUVVNfU1VDQ0VTUzsKKwogCQlyZXR1cm4gUEZWRl9TVEFUVVNfTk9fUkVTT1VSQ0U7CiAJfQogCkBAIC0xMjgwLDIyICsxMjg5LDQyIEBACiAKIAltZW1zZXQocmVzcCwgMCwgc2l6ZW9mKCpyZXNwKSk7CiAKKwkvKiBXcml0ZSB0aGUgUEYgdmVyc2lvbiBzbyB0aGF0IFZGIHdvdWxkIGtub3cgd2hpY2ggdmVyc2lvbgorCSAqIGlzIHN1cHBvcnRlZCAtIG1pZ2h0IGJlIGxhdGVyIG92ZXJyaWRlbi4gVGhpcyBndWFyYW50ZWVzIHRoYXQKKwkgKiBWRiBjb3VsZCByZWNvZ25pemUgbGVnYWN5IFBGIGJhc2VkIG9uIGxhY2sgb2YgdmVyc2lvbnMgaW4gcmVwbHkuCisJICovCisJcGZkZXZfaW5mby0+bWFqb3JfZnBfaHNpID0gRVRIX0hTSV9WRVJfTUFKT1I7CisJcGZkZXZfaW5mby0+bWlub3JfZnBfaHNpID0gRVRIX0hTSV9WRVJfTUlOT1I7CisKKwlpZiAodmYtPnN0YXRlICE9IFZGX0ZSRUUgJiYgdmYtPnN0YXRlICE9IFZGX1NUT1BQRUQpIHsKKwkJRFBfVkVSQk9TRShwX2h3Zm4sCisJCQkgICBRRURfTVNHX0lPViwKKwkJCSAgICJWRlslZF0gc2VudCBBQ1FVSVJFIGJ1dCBpcyBhbHJlYWR5IGluIHN0YXRlICVkIC0gZmFpbCByZXF1ZXN0XG4iLAorCQkJICAgdmYtPmFic192Zl9pZCwgdmYtPnN0YXRlKTsKKwkJZ290byBvdXQ7CisJfQorCiAJLyogVmFsaWRhdGUgRlcgY29tcGF0aWJpbGl0eSAqLwogCWlmIChyZXEtPnZmZGV2X2luZm8uZXRoX2ZwX2hzaV9tYWpvciAhPSBFVEhfSFNJX1ZFUl9NQUpPUikgewotCQlEUF9JTkZPKHBfaHdmbiwKLQkJCSJWRlslZF0gbmVlZHMgZmFzdHBhdGggSFNJICUwMnguJTAyeCwgd2hpY2ggaXMgaW5jb21wYXRpYmxlIHdpdGggbG9hZGVkIEZXJ3MgZmFzcGF0aCBIU0kgJTAyeC4lMDJ4XG4iLAotCQkJdmYtPmFic192Zl9pZCwKLQkJCXJlcS0+dmZkZXZfaW5mby5ldGhfZnBfaHNpX21ham9yLAotCQkJcmVxLT52ZmRldl9pbmZvLmV0aF9mcF9oc2lfbWlub3IsCi0JCQlFVEhfSFNJX1ZFUl9NQUpPUiwgRVRIX0hTSV9WRVJfTUlOT1IpOworCQlpZiAocmVxLT52ZmRldl9pbmZvLmNhcGFiaWxpdGllcyAmCisJCSAgICBWRlBGX0FDUVVJUkVfQ0FQX1BSRV9GUF9IU0kpIHsKKwkJCXN0cnVjdCB2Zl9wZl92ZmRldl9pbmZvICpwX3ZmZGV2ID0gJnJlcS0+dmZkZXZfaW5mbzsKIAotCQkvKiBXcml0ZSB0aGUgUEYgdmVyc2lvbiBzbyB0aGF0IFZGIHdvdWxkIGtub3cgd2hpY2ggdmVyc2lvbgotCQkgKiBpcyBzdXBwb3J0ZWQuCi0JCSAqLwotCQlwZmRldl9pbmZvLT5tYWpvcl9mcF9oc2kgPSBFVEhfSFNJX1ZFUl9NQUpPUjsKLQkJcGZkZXZfaW5mby0+bWlub3JfZnBfaHNpID0gRVRIX0hTSV9WRVJfTUlOT1I7CisJCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19JT1YsCisJCQkJICAgIlZGWyVkXSBpcyBwcmUtZmFzdHBhdGggSFNJXG4iLAorCQkJCSAgIHZmLT5hYnNfdmZfaWQpOworCQkJcF92ZmRldi0+ZXRoX2ZwX2hzaV9tYWpvciA9IEVUSF9IU0lfVkVSX01BSk9SOworCQkJcF92ZmRldi0+ZXRoX2ZwX2hzaV9taW5vciA9IEVUSF9IU0lfVkVSX05PX1BLVF9MRU5fVFVOTjsKKwkJfSBlbHNlIHsKKwkJCURQX0lORk8ocF9od2ZuLAorCQkJCSJWRlslZF0gbmVlZHMgZmFzdHBhdGggSFNJICUwMnguJTAyeCwgd2hpY2ggaXMgaW5jb21wYXRpYmxlIHdpdGggbG9hZGVkIEZXJ3MgZmFzcGF0aCBIU0kgJTAyeC4lMDJ4XG4iLAorCQkJCXZmLT5hYnNfdmZfaWQsCisJCQkJcmVxLT52ZmRldl9pbmZvLmV0aF9mcF9oc2lfbWFqb3IsCisJCQkJcmVxLT52ZmRldl9pbmZvLmV0aF9mcF9oc2lfbWlub3IsCisJCQkJRVRIX0hTSV9WRVJfTUFKT1IsIEVUSF9IU0lfVkVSX01JTk9SKTsKIAotCQlnb3RvIG91dDsKKwkJCWdvdG8gb3V0OworCQl9CiAJfQogCiAJLyogT24gMTAwZyBQRnMsIHByZXZlbnQgb2xkIFZGcyBmcm9tIGxvYWRpbmcgKi8KQEAgLTEzMzQsOCArMTM2MywxMSBAQAogCXBmZGV2X2luZm8tPmZ3X21pbm9yID0gRldfTUlOT1JfVkVSU0lPTjsKIAlwZmRldl9pbmZvLT5md19yZXYgPSBGV19SRVZJU0lPTl9WRVJTSU9OOwogCXBmZGV2X2luZm8tPmZ3X2VuZyA9IEZXX0VOR0lORUVSSU5HX1ZFUlNJT047Ci0JcGZkZXZfaW5mby0+bWlub3JfZnBfaHNpID0gbWluX3QodTgsCi0JCQkJCSBFVEhfSFNJX1ZFUl9NSU5PUiwKKworCS8qIEluY29ycmVjdCB3aGVuIGxlZ2FjeSwgYnV0IGRvZXNuJ3QgbWF0dGVyIGFzIGxlZ2FjeSBpc24ndCByZWFkaW5nCisJICogdGhpcyBmaWVsZC4KKwkgKi8KKwlwZmRldl9pbmZvLT5taW5vcl9mcF9oc2kgPSBtaW5fdCh1OCwgRVRIX0hTSV9WRVJfTUlOT1IsCiAJCQkJCSByZXEtPnZmZGV2X2luZm8uZXRoX2ZwX2hzaV9taW5vcik7CiAJcGZkZXZfaW5mby0+b3NfdHlwZSA9IFZGUEZfQUNRVUlSRV9PU19MSU5VWDsKIAlxZWRfbWNwX2dldF9tZndfdmVyKHBfaHdmbiwgcF9wdHQsICZwZmRldl9pbmZvLT5tZndfdmVyLCBOVUxMKTsKQEAgLTE0MzgsMTQgKzE0NzAsMTEgQEAKIAogCQlmaWx0ZXIudHlwZSA9IFFFRF9GSUxURVJfVkxBTjsKIAkJZmlsdGVyLnZsYW4gPSBwX3ZmLT5zaGFkb3dfY29uZmlnLnZsYW5zW2ldLnZpZDsKLQkJRFBfVkVSQk9TRShwX2h3Zm4sCi0JCQkgICBRRURfTVNHX0lPViwKKwkJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfSU9WLAogCQkJICAgIlJlY29uZmlndXJpbmcgVkxBTiBbMHglMDR4XSBmb3IgVkYgWyUwNHhdXG4iLAogCQkJICAgZmlsdGVyLnZsYW4sIHBfdmYtPnJlbGF0aXZlX3ZmX2lkKTsKLQkJcmMgPSBxZWRfc3BfZXRoX2ZpbHRlcl91Y2FzdChwX2h3Zm4sCi0JCQkJCSAgICAgcF92Zi0+b3BhcXVlX2ZpZCwKLQkJCQkJICAgICAmZmlsdGVyLAotCQkJCQkgICAgIFFFRF9TUFFfTU9ERV9DQiwgTlVMTCk7CisJCXJjID0gcWVkX3NwX2V0aF9maWx0ZXJfdWNhc3QocF9od2ZuLCBwX3ZmLT5vcGFxdWVfZmlkLAorCQkJCQkgICAgICZmaWx0ZXIsIFFFRF9TUFFfTU9ERV9DQiwgTlVMTCk7CiAJCWlmIChyYykgewogCQkJRFBfTk9USUNFKHBfaHdmbiwKIAkJCQkgICJGYWlsZWQgdG8gY29uZmlndXJlIFZMQU4gWyUwNHhdIHRvIFZGIFslMDR4XVxuIiwKQEAgLTE0NjMsNyArMTQ5Miw3IEBACiB7CiAJaW50IHJjID0gMDsKIAotCWlmICgoZXZlbnRzICYgKDEgPDwgVkxBTl9BRERSX0ZPUkNFRCkpICYmCisJaWYgKChldmVudHMgJiBCSVQoVkxBTl9BRERSX0ZPUkNFRCkpICYmCiAJICAgICEocF92Zi0+Y29uZmlndXJlZF9mZWF0dXJlcyAmICgxIDw8IFZMQU5fQUREUl9GT1JDRUQpKSkKIAkJcmMgPSBxZWRfaW92X3JlY29uZmlndXJlX3VuaWNhc3RfdmxhbihwX2h3Zm4sIHBfdmYpOwogCkBAIC0xNDc5LDcgKzE1MDgsNyBAQAogCWlmICghcF92Zi0+dnBvcnRfaW5zdGFuY2UpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGV2ZW50cyAmICgxIDw8IE1BQ19BRERSX0ZPUkNFRCkpIHsKKwlpZiAoZXZlbnRzICYgQklUKE1BQ19BRERSX0ZPUkNFRCkpIHsKIAkJLyogU2luY2UgdGhlcmUncyBubyB3YXkgW2N1cnJlbnRseV0gb2YgcmVtb3ZpbmcgdGhlIE1BQywKIAkJICogd2UgY2FuIGFsd2F5cyBhc3N1bWUgdGhpcyBtZWFucyB3ZSBuZWVkIHRvIGZvcmNlIGl0LgogCQkgKi8KQEAgLTE1MDIsNyArMTUzMSw3IEBACiAJCXBfdmYtPmNvbmZpZ3VyZWRfZmVhdHVyZXMgfD0gMSA8PCBNQUNfQUREUl9GT1JDRUQ7CiAJfQogCi0JaWYgKGV2ZW50cyAmICgxIDw8IFZMQU5fQUREUl9GT1JDRUQpKSB7CisJaWYgKGV2ZW50cyAmIEJJVChWTEFOX0FERFJfRk9SQ0VEKSkgewogCQlzdHJ1Y3QgcWVkX3NwX3Zwb3J0X3VwZGF0ZV9wYXJhbXMgdnBvcnRfdXBkYXRlOwogCQl1OCByZW1vdmFsOwogCQlpbnQgaTsKQEAgLTE1NzIsNyArMTYwMSw3IEBACiAJCWlmIChmaWx0ZXIudmxhbikKIAkJCXBfdmYtPmNvbmZpZ3VyZWRfZmVhdHVyZXMgfD0gMSA8PCBWTEFOX0FERFJfRk9SQ0VEOwogCQllbHNlCi0JCQlwX3ZmLT5jb25maWd1cmVkX2ZlYXR1cmVzICY9IH4oMSA8PCBWTEFOX0FERFJfRk9SQ0VEKTsKKwkJCXBfdmYtPmNvbmZpZ3VyZWRfZmVhdHVyZXMgJj0gfkJJVChWTEFOX0FERFJfRk9SQ0VEKTsKIAl9CiAKIAkvKiBJZiBmb3JjZWQgZmVhdHVyZXMgYXJlIHRlcm1pbmF0ZWQsIHdlIG5lZWQgdG8gY29uZmlndXJlIHRoZSBzaGFkb3cKQEAgLTE2MTksOCArMTY0OCw3IEBACiAKIAkJcWVkX2ludF9jYXVfY29uZl9zYihwX2h3Zm4sIHBfcHR0LAogCQkJCSAgICBzdGFydC0+c2JfYWRkcltzYl9pZF0sCi0JCQkJICAgIHZmLT5pZ3Vfc2JzW3NiX2lkXSwKLQkJCQkgICAgdmYtPmFic192Zl9pZCwgMSk7CisJCQkJICAgIHZmLT5pZ3Vfc2JzW3NiX2lkXSwgdmYtPmFic192Zl9pZCwgMSk7CiAJfQogCXFlZF9pb3ZfZW5hYmxlX3ZmX3RyYWZmaWMocF9od2ZuLCBwX3B0dCwgdmYpOwogCkBAIC0xNjMyLDcgKzE2NjAsNyBAQAogCSAqIHZmcyB0aGF0IHdvdWxkIHN0aWxsIGJlIGZpbmUsIHNpbmNlIHRoZXkgcGFzc2VkICcwJyBhcyBwYWRkaW5nXS4KIAkgKi8KIAlwX2JpdG1hcCA9ICZ2Zl9pbmZvLT5idWxsZXRpbi5wX3ZpcnQtPnZhbGlkX2JpdG1hcDsKLQlpZiAoISgqcF9iaXRtYXAgJiAoMSA8PCBWRlBGX0JVTExFVElOX1VOVEFHR0VEX0RFRkFVTFRfRk9SQ0VEKSkpIHsKKwlpZiAoISgqcF9iaXRtYXAgJiBCSVQoVkZQRl9CVUxMRVRJTl9VTlRBR0dFRF9ERUZBVUxUX0ZPUkNFRCkpKSB7CiAJCXU4IHZmX3JlcSA9IHN0YXJ0LT5vbmx5X3VudGFnZ2VkOwogCiAJCXZmX2luZm8tPmJ1bGxldGluLnBfdmlydC0+ZGVmYXVsdF9vbmx5X3VudGFnZ2VkID0gdmZfcmVxOwpAQCAtMTY1MCw5ICsxNjc4LDEwIEBACiAJcGFyYW1zLnZwb3J0X2lkID0gdmYtPnZwb3J0X2lkOwogCXBhcmFtcy5tYXhfYnVmZmVyc19wZXJfY3FlID0gc3RhcnQtPm1heF9idWZmZXJzX3Blcl9jcWU7CiAJcGFyYW1zLm10dSA9IHZmLT5tdHU7CisJcGFyYW1zLmNoZWNrX21hYyA9IHRydWU7CiAKIAlyYyA9IHFlZF9zcF9ldGhfdnBvcnRfc3RhcnQocF9od2ZuLCAmcGFyYW1zKTsKLQlpZiAocmMgIT0gMCkgeworCWlmIChyYykgewogCQlEUF9FUlIocF9od2ZuLAogCQkgICAgICAgInFlZF9pb3ZfdmZfbWJ4X3N0YXJ0X3Zwb3J0IHJldHVybmVkIGVycm9yICVkXG4iLCByYyk7CiAJCXN0YXR1cyA9IFBGVkZfU1RBVFVTX0ZBSUxVUkU7CkBAIC0xNjc5LDcgKzE3MDgsNyBAQAogCXZmLT5zcG9vZl9jaGsgPSBmYWxzZTsKIAogCXJjID0gcWVkX3NwX3Zwb3J0X3N0b3AocF9od2ZuLCB2Zi0+b3BhcXVlX2ZpZCwgdmYtPnZwb3J0X2lkKTsKLQlpZiAocmMgIT0gMCkgeworCWlmIChyYykgewogCQlEUF9FUlIocF9od2ZuLCAicWVkX2lvdl92Zl9tYnhfc3RvcF92cG9ydCByZXR1cm5lZCBlcnJvciAlZFxuIiwKIAkJICAgICAgIHJjKTsKIAkJc3RhdHVzID0gUEZWRl9TVEFUVVNfRkFJTFVSRTsKQEAgLTE2OTUsMjEgKzE3MjQsMzIgQEAKIAogc3RhdGljIHZvaWQgcWVkX2lvdl92Zl9tYnhfc3RhcnRfcnhxX3Jlc3Aoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCQkJCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkJCQkgIHN0cnVjdCBxZWRfdmZfaW5mbyAqdmYsIHU4IHN0YXR1cykKKwkJCQkJICBzdHJ1Y3QgcWVkX3ZmX2luZm8gKnZmLAorCQkJCQkgIHU4IHN0YXR1cywgYm9vbCBiX2xlZ2FjeSkKIHsKIAlzdHJ1Y3QgcWVkX2lvdl92Zl9tYnggKm1ieCA9ICZ2Zi0+dmZfbWJ4OwogCXN0cnVjdCBwZnZmX3N0YXJ0X3F1ZXVlX3Jlc3BfdGx2ICpwX3RsdjsKIAlzdHJ1Y3QgdmZwZl9zdGFydF9yeHFfdGx2ICpyZXE7CisJdTE2IGxlbmd0aDsKIAogCW1ieC0+b2Zmc2V0ID0gKHU4ICopbWJ4LT5yZXBseV92aXJ0OwogCisJLyogVGFraW5nIGEgYmlnZ2VyIHN0cnVjdCBpbnN0ZWFkIG9mIGFkZGluZyBhIFRMViB0byBsaXN0IHdhcyBhCisJICogbWlzdGFrZSwgYnV0IG9uZSB3aGljaCB3ZSdyZSBub3cgc3R1Y2sgd2l0aCwgYXMgc29tZSBvbGRlcgorCSAqIGNsaWVudHMgYXNzdW1lIHRoZSBzaXplIG9mIHRoZSBwcmV2aW91cyByZXNwb25zZS4KKwkgKi8KKwlpZiAoIWJfbGVnYWN5KQorCQlsZW5ndGggPSBzaXplb2YoKnBfdGx2KTsKKwllbHNlCisJCWxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgcGZ2Zl9kZWZfcmVzcF90bHYpOworCiAJcF90bHYgPSBxZWRfYWRkX3RsdihwX2h3Zm4sICZtYngtPm9mZnNldCwgQ0hBTk5FTF9UTFZfU1RBUlRfUlhRLAotCQkJICAgIHNpemVvZigqcF90bHYpKTsKKwkJCSAgICBsZW5ndGgpOwogCXFlZF9hZGRfdGx2KHBfaHdmbiwgJm1ieC0+b2Zmc2V0LCBDSEFOTkVMX1RMVl9MSVNUX0VORCwKIAkJICAgIHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9saXN0X2VuZF90bHYpKTsKIAogCS8qIFVwZGF0ZSB0aGUgVExWIHdpdGggdGhlIHJlc3BvbnNlICovCi0JaWYgKHN0YXR1cyA9PSBQRlZGX1NUQVRVU19TVUNDRVNTKSB7CisJaWYgKChzdGF0dXMgPT0gUEZWRl9TVEFUVVNfU1VDQ0VTUykgJiYgIWJfbGVnYWN5KSB7CiAJCXJlcSA9ICZtYngtPnJlcV92aXJ0LT5zdGFydF9yeHE7CiAJCXBfdGx2LT5vZmZzZXQgPSBQWFBfVkZfQkFSMF9TVEFSVF9NU0RNX1pPTkVfQiArCiAJCQkJb2Zmc2V0b2Yoc3RydWN0IG1zdG9ybV92Zl96b25lLApAQCAtMTcxNyw3ICsxNzU3LDcgQEAKIAkJCQlzaXplb2Yoc3RydWN0IGV0aF9yeF9wcm9kX2RhdGEpICogcmVxLT5yeF9xaWQ7CiAJfQogCi0JcWVkX2lvdl9zZW5kX3Jlc3BvbnNlKHBfaHdmbiwgcF9wdHQsIHZmLCBzaXplb2YoKnBfdGx2KSwgc3RhdHVzKTsKKwlxZWRfaW92X3NlbmRfcmVzcG9uc2UocF9od2ZuLCBwX3B0dCwgdmYsIGxlbmd0aCwgc3RhdHVzKTsKIH0KIAogc3RhdGljIHZvaWQgcWVkX2lvdl92Zl9tYnhfc3RhcnRfcnhxKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLApAQCAtMTcyOCw2ICsxNzY4LDcgQEAKIAlzdHJ1Y3QgcWVkX2lvdl92Zl9tYnggKm1ieCA9ICZ2Zi0+dmZfbWJ4OwogCXU4IHN0YXR1cyA9IFBGVkZfU1RBVFVTX05PX1JFU09VUkNFOwogCXN0cnVjdCB2ZnBmX3N0YXJ0X3J4cV90bHYgKnJlcTsKKwlib29sIGJfbGVnYWN5X3ZmID0gZmFsc2U7CiAJaW50IHJjOwogCiAJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKQEAgLTE3NDMsMTMgKzE3ODQsMjcgQEAKIAlwYXJhbXMuc2IgPSByZXEtPmh3X3NiOwogCXBhcmFtcy5zYl9pZHggPSByZXEtPnNiX2luZGV4OwogCisJLyogTGVnYWN5IFZGcyBoYXZlIHRoZWlyIFByb2R1Y2VycyBpbiBhIGRpZmZlcmVudCBsb2NhdGlvbiwgd2hpY2ggdGhleQorCSAqIGNhbGN1bGF0ZSBvbiB0aGVpciBvd24gYW5kIGNsZWFuIHRoZSBwcm9kdWNlciBwcmlvciB0byB0aGlzLgorCSAqLworCWlmICh2Zi0+YWNxdWlyZS52ZmRldl9pbmZvLmV0aF9mcF9oc2lfbWlub3IgPT0KKwkgICAgRVRIX0hTSV9WRVJfTk9fUEtUX0xFTl9UVU5OKSB7CisJCWJfbGVnYWN5X3ZmID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlSRUdfV1IocF9od2ZuLAorCQkgICAgICAgR1RUX0JBUjBfTUFQX1JFR19NU0RNX1JBTSArCisJCSAgICAgICBNU1RPUk1fRVRIX1ZGX1BST0RTX09GRlNFVCh2Zi0+YWJzX3ZmX2lkLCByZXEtPnJ4X3FpZCksCisJCSAgICAgICAwKTsKKwl9CisKIAlyYyA9IHFlZF9zcF9ldGhfcnhxX3N0YXJ0X3JhbXJvZChwX2h3Zm4sIHZmLT5vcGFxdWVfZmlkLAogCQkJCQkgdmYtPnZmX3F1ZXVlc1tyZXEtPnJ4X3FpZF0uZndfY2lkLAogCQkJCQkgJnBhcmFtcywKIAkJCQkJIHZmLT5hYnNfdmZfaWQgKyAweDEwLAogCQkJCQkgcmVxLT5iZF9tYXhfYnl0ZXMsCiAJCQkJCSByZXEtPnJ4cV9hZGRyLAotCQkJCQkgcmVxLT5jcWVfcGJsX2FkZHIsIHJlcS0+Y3FlX3BibF9zaXplKTsKKwkJCQkJIHJlcS0+Y3FlX3BibF9hZGRyLCByZXEtPmNxZV9wYmxfc2l6ZSwKKwkJCQkJIGJfbGVnYWN5X3ZmKTsKIAogCWlmIChyYykgewogCQlzdGF0dXMgPSBQRlZGX1NUQVRVU19GQUlMVVJFOwpAQCAtMTc2MCw3ICsxODE1LDcgQEAKIAl9CiAKIG91dDoKLQlxZWRfaW92X3ZmX21ieF9zdGFydF9yeHFfcmVzcChwX2h3Zm4sIHBfcHR0LCB2Ziwgc3RhdHVzKTsKKwlxZWRfaW92X3ZmX21ieF9zdGFydF9yeHFfcmVzcChwX2h3Zm4sIHBfcHR0LCB2Ziwgc3RhdHVzLCBiX2xlZ2FjeV92Zik7CiB9CiAKIHN0YXRpYyB2b2lkIHFlZF9pb3ZfdmZfbWJ4X3N0YXJ0X3R4cV9yZXNwKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLApAQCAtMTc2OSwyMyArMTgyNCwzOCBAQAogewogCXN0cnVjdCBxZWRfaW92X3ZmX21ieCAqbWJ4ID0gJnBfdmYtPnZmX21ieDsKIAlzdHJ1Y3QgcGZ2Zl9zdGFydF9xdWV1ZV9yZXNwX3RsdiAqcF90bHY7CisJYm9vbCBiX2xlZ2FjeSA9IGZhbHNlOworCXUxNiBsZW5ndGg7CiAKIAltYngtPm9mZnNldCA9ICh1OCAqKW1ieC0+cmVwbHlfdmlydDsKIAorCS8qIFRha2luZyBhIGJpZ2dlciBzdHJ1Y3QgaW5zdGVhZCBvZiBhZGRpbmcgYSBUTFYgdG8gbGlzdCB3YXMgYQorCSAqIG1pc3Rha2UsIGJ1dCBvbmUgd2hpY2ggd2UncmUgbm93IHN0dWNrIHdpdGgsIGFzIHNvbWUgb2xkZXIKKwkgKiBjbGllbnRzIGFzc3VtZSB0aGUgc2l6ZSBvZiB0aGUgcHJldmlvdXMgcmVzcG9uc2UuCisJICovCisJaWYgKHBfdmYtPmFjcXVpcmUudmZkZXZfaW5mby5ldGhfZnBfaHNpX21pbm9yID09CisJICAgIEVUSF9IU0lfVkVSX05PX1BLVF9MRU5fVFVOTikKKwkJYl9sZWdhY3kgPSB0cnVlOworCisJaWYgKCFiX2xlZ2FjeSkKKwkJbGVuZ3RoID0gc2l6ZW9mKCpwX3Rsdik7CisJZWxzZQorCQlsZW5ndGggPSBzaXplb2Yoc3RydWN0IHBmdmZfZGVmX3Jlc3BfdGx2KTsKKwogCXBfdGx2ID0gcWVkX2FkZF90bHYocF9od2ZuLCAmbWJ4LT5vZmZzZXQsIENIQU5ORUxfVExWX1NUQVJUX1RYUSwKLQkJCSAgICBzaXplb2YoKnBfdGx2KSk7CisJCQkgICAgbGVuZ3RoKTsKIAlxZWRfYWRkX3RsdihwX2h3Zm4sICZtYngtPm9mZnNldCwgQ0hBTk5FTF9UTFZfTElTVF9FTkQsCiAJCSAgICBzaXplb2Yoc3RydWN0IGNoYW5uZWxfbGlzdF9lbmRfdGx2KSk7CiAKIAkvKiBVcGRhdGUgdGhlIFRMViB3aXRoIHRoZSByZXNwb25zZSAqLwotCWlmIChzdGF0dXMgPT0gUEZWRl9TVEFUVVNfU1VDQ0VTUykgeworCWlmICgoc3RhdHVzID09IFBGVkZfU1RBVFVTX1NVQ0NFU1MpICYmICFiX2xlZ2FjeSkgewogCQl1MTYgcWlkID0gbWJ4LT5yZXFfdmlydC0+c3RhcnRfdHhxLnR4X3FpZDsKIAotCQlwX3Rsdi0+b2Zmc2V0ID0gcWVkX2RiX2FkZHIocF92Zi0+dmZfcXVldWVzW3FpZF0uZndfY2lkLAotCQkJCQkgICAgRFFfREVNU19MRUdBQ1kpOworCQlwX3Rsdi0+b2Zmc2V0ID0gcWVkX2RiX2FkZHJfdmYocF92Zi0+dmZfcXVldWVzW3FpZF0uZndfY2lkLAorCQkJCQkgICAgICAgRFFfREVNU19MRUdBQ1kpOwogCX0KIAotCXFlZF9pb3Zfc2VuZF9yZXNwb25zZShwX2h3Zm4sIHBfcHR0LCBwX3ZmLCBzaXplb2YoKnBfdGx2KSwgc3RhdHVzKTsKKwlxZWRfaW92X3NlbmRfcmVzcG9uc2UocF9od2ZuLCBwX3B0dCwgcF92ZiwgbGVuZ3RoLCBzdGF0dXMpOwogfQogCiBzdGF0aWMgdm9pZCBxZWRfaW92X3ZmX21ieF9zdGFydF90eHEoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCkBAIC0yMDQ1LDcgKzIxMTUsNyBAQAogCXBfdmYtPnNoYWRvd19jb25maWcuaW5uZXJfdmxhbl9yZW1vdmFsID0gcF92bGFuX3Rsdi0+cmVtb3ZlX3ZsYW47CiAKIAkvKiBJZ25vcmUgdGhlIFZGIHJlcXVlc3QgaWYgd2UncmUgZm9yY2luZyBhIHZsYW4gKi8KLQlpZiAoIShwX3ZmLT5jb25maWd1cmVkX2ZlYXR1cmVzICYgKDEgPDwgVkxBTl9BRERSX0ZPUkNFRCkpKSB7CisJaWYgKCEocF92Zi0+Y29uZmlndXJlZF9mZWF0dXJlcyAmIEJJVChWTEFOX0FERFJfRk9SQ0VEKSkpIHsKIAkJcF9kYXRhLT51cGRhdGVfaW5uZXJfdmxhbl9yZW1vdmFsX2ZsZyA9IDE7CiAJCXBfZGF0YS0+aW5uZXJfdmxhbl9yZW1vdmFsX2ZsZyA9IHBfdmxhbl90bHYtPnJlbW92ZV92bGFuOwogCX0KQEAgLTIzNDAsNyArMjQxMCw3IEBACiAJLyogSW4gZm9yY2VkIG1vZGUsIHdlJ3JlIHdpbGxpbmcgdG8gcmVtb3ZlIGVudHJpZXMgLSBidXQgd2UgZG9uJ3QgYWRkCiAJICogbmV3IG9uZXMuCiAJICovCi0JaWYgKHBfdmYtPmJ1bGxldGluLnBfdmlydC0+dmFsaWRfYml0bWFwICYgKDEgPDwgVkxBTl9BRERSX0ZPUkNFRCkpCisJaWYgKHBfdmYtPmJ1bGxldGluLnBfdmlydC0+dmFsaWRfYml0bWFwICYgQklUKFZMQU5fQUREUl9GT1JDRUQpKQogCQlyZXR1cm4gMDsKIAogCWlmIChwX3BhcmFtcy0+b3Bjb2RlID09IFFFRF9GSUxURVJfQUREIHx8CkBAIC0yMzc0LDcgKzI0NDQsNyBAQAogCWludCBpOwogCiAJLyogSWYgd2UncmUgaW4gZm9yY2VkLW1vZGUsIHdlIGRvbid0IGFsbG93IGFueSBjaGFuZ2UgKi8KLQlpZiAocF92Zi0+YnVsbGV0aW4ucF92aXJ0LT52YWxpZF9iaXRtYXAgJiAoMSA8PCBNQUNfQUREUl9GT1JDRUQpKQorCWlmIChwX3ZmLT5idWxsZXRpbi5wX3ZpcnQtPnZhbGlkX2JpdG1hcCAmIEJJVChNQUNfQUREUl9GT1JDRUQpKQogCQlyZXR1cm4gMDsKIAogCS8qIEZpcnN0IHJlbW92ZSBlbnRyaWVzIGFuZCB0aGVuIGFkZCBuZXcgb25lcyAqLwpAQCAtMjQ0MSw4ICsyNTExLDggQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBxZWRfaW92X2Noa191Y2FzdChzdHJ1Y3QgcWVkX2h3Zm4gKmh3Zm4sCi0JCSAgICAgIGludCB2ZmlkLCBzdHJ1Y3QgcWVkX2ZpbHRlcl91Y2FzdCAqcGFyYW1zKQorc3RhdGljIGludCBxZWRfaW92X2Noa191Y2FzdChzdHJ1Y3QgcWVkX2h3Zm4gKmh3Zm4sCisJCQkgICAgIGludCB2ZmlkLCBzdHJ1Y3QgcWVkX2ZpbHRlcl91Y2FzdCAqcGFyYW1zKQogewogCXN0cnVjdCBxZWRfcHVibGljX3ZmX2luZm8gKnZmOwogCkBAIC0yNTA5LDcgKzI1NzksNyBAQAogCX0KIAogCS8qIERldGVybWluZSBpZiB0aGUgdW5pY2FzdCBmaWx0ZXJpbmcgaXMgYWNjZXB0aWJsZSBieSBQRiAqLwotCWlmICgocF9idWxsZXRpbi0+dmFsaWRfYml0bWFwICYgKDEgPDwgVkxBTl9BRERSX0ZPUkNFRCkpICYmCisJaWYgKChwX2J1bGxldGluLT52YWxpZF9iaXRtYXAgJiBCSVQoVkxBTl9BRERSX0ZPUkNFRCkpICYmCiAJICAgIChwYXJhbXMudHlwZSA9PSBRRURfRklMVEVSX1ZMQU4gfHwKIAkgICAgIHBhcmFtcy50eXBlID09IFFFRF9GSUxURVJfTUFDX1ZMQU4pKSB7CiAJCS8qIE9uY2UgVkxBTiBpcyBmb3JjZWQgb3IgUFZJRCBpcyBzZXQsIGRvIG5vdCBhbGxvdwpAQCAtMjUyMSw3ICsyNTkxLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKChwX2J1bGxldGluLT52YWxpZF9iaXRtYXAgJiAoMSA8PCBNQUNfQUREUl9GT1JDRUQpKSAmJgorCWlmICgocF9idWxsZXRpbi0+dmFsaWRfYml0bWFwICYgQklUKE1BQ19BRERSX0ZPUkNFRCkpICYmCiAJICAgIChwYXJhbXMudHlwZSA9PSBRRURfRklMVEVSX01BQyB8fAogCSAgICAgcGFyYW1zLnR5cGUgPT0gUUVEX0ZJTFRFUl9NQUNfVkxBTikpIHsKIAkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKHBfYnVsbGV0aW4tPm1hYywgcGFyYW1zLm1hYykgfHwKQEAgLTI3NDksNyArMjgxOSw3IEBACiAJCS8qIE1hcmsgVkYgZm9yIGFjayBhbmQgY2xlYW4gcGVuZGluZyBzdGF0ZSAqLwogCQlpZiAocF92Zi0+c3RhdGUgPT0gVkZfUkVTRVQpCiAJCQlwX3ZmLT5zdGF0ZSA9IFZGX1NUT1BQRUQ7Ci0JCWFja192ZnNbdmZpZCAvIDMyXSB8PSAoMSA8PCAodmZpZCAlIDMyKSk7CisJCWFja192ZnNbdmZpZCAvIDMyXSB8PSBCSVQoKHZmaWQgJSAzMikpOwogCQlwX2h3Zm4tPnBmX2lvdl9pbmZvLT5wZW5kaW5nX2ZscltyZWxfdmZfaWQgLyA2NF0gJj0KIAkJICAgIH4oMVVMTCA8PCAocmVsX3ZmX2lkICUgNjQpKTsKIAkJcF9od2ZuLT5wZl9pb3ZfaW5mby0+cGVuZGluZ19ldmVudHNbcmVsX3ZmX2lkIC8gNjRdICY9CkBAIC0yNzU5LDcgKzI4MjksOCBAQAogCXJldHVybiByYzsKIH0KIAotaW50IHFlZF9pb3ZfdmZfZmxyX2NsZWFudXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3N0YXRpYyBpbnQKK3FlZF9pb3ZfdmZfZmxyX2NsZWFudXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKIHsKIAl1MzIgYWNrX3Zmc1tWRl9NQVhfU1RBVElDIC8gMzJdOwogCWludCByYyA9IDA7CkBAIC0yODA1LDcgKzI4NzYsNyBAQAogCQkJY29udGludWU7CiAKIAkJdmZpZCA9IHBfdmYtPmFic192Zl9pZDsKLQkJaWYgKCgxIDw8ICh2ZmlkICUgMzIpKSAmIHBfZGlzYWJsZWRfdmZzW3ZmaWQgLyAzMl0pIHsKKwkJaWYgKEJJVCgodmZpZCAlIDMyKSkgJiBwX2Rpc2FibGVkX3Zmc1t2ZmlkIC8gMzJdKSB7CiAJCQl1NjQgKnBfZmxyID0gcF9od2ZuLT5wZl9pb3ZfaW5mby0+cGVuZGluZ19mbHI7CiAJCQl1MTYgcmVsX3ZmX2lkID0gcF92Zi0+cmVsYXRpdmVfdmZfaWQ7CiAKQEAgLTI5NDYsNyArMzAxNyw3IEBACiAJfQogfQogCi12b2lkIHFlZF9pb3ZfcGZfYWRkX3BlbmRpbmdfZXZlbnRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1OCB2ZmlkKQorc3RhdGljIHZvaWQgcWVkX2lvdl9wZl9hZGRfcGVuZGluZ19ldmVudHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHU4IHZmaWQpCiB7CiAJdTY0IGFkZF9iaXQgPSAxVUxMIDw8ICh2ZmlkICUgNjQpOwogCkBAIC0zMDY0LDE0ICszMTM1LDEzIEBACiAKIAl2Zl9pbmZvLT5idWxsZXRpbi5wX3ZpcnQtPnZhbGlkX2JpdG1hcCB8PSBmZWF0dXJlOwogCS8qIEZvcmNlZCBNQUMgd2lsbCBkaXNhYmxlIE1BQ19BRERSICovCi0JdmZfaW5mby0+YnVsbGV0aW4ucF92aXJ0LT52YWxpZF9iaXRtYXAgJj0KLQkJCQl+KDEgPDwgVkZQRl9CVUxMRVRJTl9NQUNfQUREUik7CisJdmZfaW5mby0+YnVsbGV0aW4ucF92aXJ0LT52YWxpZF9iaXRtYXAgJj0gfkJJVChWRlBGX0JVTExFVElOX01BQ19BRERSKTsKIAogCXFlZF9pb3ZfY29uZmlndXJlX3Zwb3J0X2ZvcmNlZChwX2h3Zm4sIHZmX2luZm8sIGZlYXR1cmUpOwogfQogCi12b2lkIHFlZF9pb3ZfYnVsbGV0aW5fc2V0X2ZvcmNlZF92bGFuKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJCSAgICAgIHUxNiBwdmlkLCBpbnQgdmZpZCkKK3N0YXRpYyB2b2lkIHFlZF9pb3ZfYnVsbGV0aW5fc2V0X2ZvcmNlZF92bGFuKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgIHUxNiBwdmlkLCBpbnQgdmZpZCkKIHsKIAlzdHJ1Y3QgcWVkX3ZmX2luZm8gKnZmX2luZm87CiAJdTY0IGZlYXR1cmU7CkBAIC0zMTA0LDcgKzMxNzQsNyBAQAogCXJldHVybiAhIXBfdmZfaW5mby0+dnBvcnRfaW5zdGFuY2U7CiB9CiAKLWJvb2wgcWVkX2lvdl9pc192Zl9zdG9wcGVkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBpbnQgdmZpZCkKK3N0YXRpYyBib29sIHFlZF9pb3ZfaXNfdmZfc3RvcHBlZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgaW50IHZmaWQpCiB7CiAJc3RydWN0IHFlZF92Zl9pbmZvICpwX3ZmX2luZm87CiAKQEAgLTMxMjYsNyArMzE5Niw3IEBACiAJcmV0dXJuIHZmX2luZm8tPnNwb29mX2NoazsKIH0KIAotaW50IHFlZF9pb3Zfc3Bvb2ZjaGtfc2V0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBpbnQgdmZpZCwgYm9vbCB2YWwpCitzdGF0aWMgaW50IHFlZF9pb3Zfc3Bvb2ZjaGtfc2V0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBpbnQgdmZpZCwgYm9vbCB2YWwpCiB7CiAJc3RydWN0IHFlZF92Zl9pbmZvICp2ZjsKIAlpbnQgcmMgPSAtRUlOVkFMOwpAQCAtMzE2MywxMyArMzIzMywxNCBAQAogCWlmICghcF92ZiB8fCAhcF92Zi0+YnVsbGV0aW4ucF92aXJ0KQogCQlyZXR1cm4gTlVMTDsKIAotCWlmICghKHBfdmYtPmJ1bGxldGluLnBfdmlydC0+dmFsaWRfYml0bWFwICYgKDEgPDwgTUFDX0FERFJfRk9SQ0VEKSkpCisJaWYgKCEocF92Zi0+YnVsbGV0aW4ucF92aXJ0LT52YWxpZF9iaXRtYXAgJiBCSVQoTUFDX0FERFJfRk9SQ0VEKSkpCiAJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuIHBfdmYtPmJ1bGxldGluLnBfdmlydC0+bWFjOwogfQogCi11MTYgcWVkX2lvdl9idWxsZXRpbl9nZXRfZm9yY2VkX3ZsYW4oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHUxNiByZWxfdmZfaWQpCitzdGF0aWMgdTE2CitxZWRfaW92X2J1bGxldGluX2dldF9mb3JjZWRfdmxhbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTE2IHJlbF92Zl9pZCkKIHsKIAlzdHJ1Y3QgcWVkX3ZmX2luZm8gKnBfdmY7CiAKQEAgLTMxNzcsNyArMzI0OCw3IEBACiAJaWYgKCFwX3ZmIHx8ICFwX3ZmLT5idWxsZXRpbi5wX3ZpcnQpCiAJCXJldHVybiAwOwogCi0JaWYgKCEocF92Zi0+YnVsbGV0aW4ucF92aXJ0LT52YWxpZF9iaXRtYXAgJiAoMSA8PCBWTEFOX0FERFJfRk9SQ0VEKSkpCisJaWYgKCEocF92Zi0+YnVsbGV0aW4ucF92aXJ0LT52YWxpZF9iaXRtYXAgJiBCSVQoVkxBTl9BRERSX0ZPUkNFRCkpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBwX3ZmLT5idWxsZXRpbi5wX3ZpcnQtPnB2aWQ7CkBAIC0zMjAxLDcgKzMyNzIsOCBAQAogCXJldHVybiBxZWRfaW5pdF92cG9ydF9ybChwX2h3Zm4sIHBfcHR0LCBhYnNfdnBfaWQsICh1MzIpdmFsKTsKIH0KIAotaW50IHFlZF9pb3ZfY29uZmlndXJlX21pbl90eF9yYXRlKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBpbnQgdmZpZCwgdTMyIHJhdGUpCitzdGF0aWMgaW50CitxZWRfaW92X2NvbmZpZ3VyZV9taW5fdHhfcmF0ZShzdHJ1Y3QgcWVkX2RldiAqY2RldiwgaW50IHZmaWQsIHUzMiByYXRlKQogewogCXN0cnVjdCBxZWRfdmZfaW5mbyAqdmY7CiAJdTggdnBvcnRfaWQ7CkBAIC0zNzYwLDcgKzM4MzIsOCBAQAogCXFlZF9wdHRfcmVsZWFzZShod2ZuLCBwdHQpOwogfQogCi12b2lkIHFlZF9pb3ZfcGZfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBxZWRfaW92X3BmX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorCiB7CiAJc3RydWN0IHFlZF9od2ZuICpod2ZuID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBxZWRfaHdmbiwKIAkJCQkJICAgICBpb3ZfdGFzay53b3JrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3ZmLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF92Zi5jCmluZGV4IDliNzgwYjMuLmFiZjViZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3ZmLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfdmYuYwpAQCAtNDYsNiArNDYsMTcgQEAKIAlyZXR1cm4gcF90bHY7CiB9CiAKK3N0YXRpYyB2b2lkIHFlZF92Zl9wZl9yZXFfZW5kKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBpbnQgcmVxX3N0YXR1cykKK3sKKwl1bmlvbiBwZnZmX3RsdnMgKnJlc3AgPSBwX2h3Zm4tPnZmX2lvdl9pbmZvLT5wZjJ2Zl9yZXBseTsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX0lPViwKKwkJICAgIlZGIHJlcXVlc3Qgc3RhdHVzID0gMHgleCwgUEYgcmVwbHkgc3RhdHVzID0gMHgleFxuIiwKKwkJICAgcmVxX3N0YXR1cywgcmVzcC0+ZGVmYXVsdF9yZXNwLmhkci5zdGF0dXMpOworCisJbXV0ZXhfdW5sb2NrKCYocF9od2ZuLT52Zl9pb3ZfaW5mby0+bXV0ZXgpKTsKK30KKwogc3RhdGljIGludCBxZWRfc2VuZF9tc2cycGYoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHU4ICpkb25lLCB1MzIgcmVzcF9zaXplKQogewogCXVuaW9uIHZmcGZfdGx2cyAqcF9yZXEgPSBwX2h3Zm4tPnZmX2lvdl9pbmZvLT52ZjJwZl9yZXF1ZXN0OwpAQCAtMTAzLDE2ICsxMTQsMTIgQEAKIAkJCSAgICJWRiA8LS0gUEYgVGltZW91dCBbVHlwZSAlZF1cbiIsCiAJCQkgICBwX3JlcS0+Zmlyc3RfdGx2LnRsLnR5cGUpOwogCQlyYyA9IC1FQlVTWTsKLQkJZ290byBleGl0OwogCX0gZWxzZSB7CiAJCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX0lPViwKIAkJCSAgICJQRiByZXNwb25zZTogJWQgW1R5cGUgJWRdXG4iLAogCQkJICAgKmRvbmUsIHBfcmVxLT5maXJzdF90bHYudGwudHlwZSk7CiAJfQogCi1leGl0OgotCW11dGV4X3VubG9jaygmKHBfaHdmbi0+dmZfaW92X2luZm8tPm11dGV4KSk7Ci0KIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTE5MSw2ICsxOTgsOSBAQAogCQlEUF9WRVJCT1NFKHBfaHdmbiwKIAkJCSAgIFFFRF9NU0dfSU9WLCAiYXR0ZW1wdGluZyB0byBhY3F1aXJlIHJlc291cmNlc1xuIik7CiAKKwkJLyogQ2xlYXIgcmVzcG9uc2UgYnVmZmVyLCBhcyB0aGlzIG1pZ2h0IGJlIGEgcmUtc2VuZCAqLworCQltZW1zZXQocF9pb3YtPnBmMnZmX3JlcGx5LCAwLCBzaXplb2YodW5pb24gcGZ2Zl90bHZzKSk7CisKIAkJLyogc2VuZCBhY3F1aXJlIHJlcXVlc3QgKi8KIAkJcmMgPSBxZWRfc2VuZF9tc2cycGYocF9od2ZuLCAmcmVzcC0+aGRyLnN0YXR1cywgc2l6ZW9mKCpyZXNwKSk7CiAJCWlmIChyYykKQEAgLTIwNSw5ICsyMTUsMTIgQEAKIAkJCS8qIFBGIGFncmVlcyB0byBhbGxvY2F0ZSBvdXIgcmVzb3VyY2VzICovCiAJCQlpZiAoIShyZXNwLT5wZmRldl9pbmZvLmNhcGFiaWxpdGllcyAmCiAJCQkgICAgICBQRlZGX0FDUVVJUkVfQ0FQX1BPU1RfRldfT1ZFUlJJREUpKSB7Ci0JCQkJRFBfSU5GTyhwX2h3Zm4sCi0JCQkJCSJQRiBpcyB1c2luZyBvbGQgaW5jb21wYXRpYmxlIGRyaXZlcjsgRWl0aGVyIGRvd25ncmFkZSBkcml2ZXIgb3IgcmVxdWVzdCBwcm92aWRlciB0byB1cGRhdGUgaHlwZXJ2aXNvciB2ZXJzaW9uXG4iKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkvKiBJdCdzIHBvc3NpYmxlIGxlZ2FjeSBQRiBtaXN0YWtlbmx5IGFjY2VwdGVkOworCQkJCSAqIGJ1dCB3ZSBkb24ndCBjYXJlIC0gc2ltcGx5IG1hcmsgaXQgYXMKKwkJCQkgKiBsZWdhY3kgYW5kIGNvbnRpbnVlLgorCQkJCSAqLworCQkJCXJlcS0+dmZkZXZfaW5mby5jYXBhYmlsaXRpZXMgfD0KKwkJCQkgICAgVkZQRl9BQ1FVSVJFX0NBUF9QUkVfRlBfSFNJOwogCQkJfQogCQkJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfSU9WLCAicmVzb3VyY2VzIGFjcXVpcmVkXG4iKTsKIAkJCXJlc291cmNlc19hY3F1aXJlZCA9IHRydWU7CkBAIC0yMTUsMjcgKzIyOCw1NSBAQAogCQkJICAgYXR0ZW1wdHMgPCBWRl9BQ1FVSVJFX1RIUkVTSCkgewogCQkJcWVkX3ZmX3BmX2FjcXVpcmVfcmVkdWNlX3Jlc2MocF9od2ZuLCBwX3Jlc2MsCiAJCQkJCQkgICAgICAmcmVzcC0+cmVzYyk7CisJCX0gZWxzZSBpZiAocmVzcC0+aGRyLnN0YXR1cyA9PSBQRlZGX1NUQVRVU19OT1RfU1VQUE9SVEVEKSB7CisJCQlpZiAocGZkZXZfaW5mby0+bWFqb3JfZnBfaHNpICYmCisJCQkgICAgKHBmZGV2X2luZm8tPm1ham9yX2ZwX2hzaSAhPSBFVEhfSFNJX1ZFUl9NQUpPUikpIHsKKwkJCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJCQkgICJQRiB1c2VzIGFuIGluY29tcGF0aWJsZSBmYXN0cGF0aCBIU0kgJTAyeC4lMDJ4IFtWRiByZXF1aXJlcyAlMDJ4LiUwMnhdLiBQbGVhc2UgY2hhbmdlIHRvIGEgVkYgZHJpdmVyIHVzaW5nICUwMngueHguXG4iLAorCQkJCQkgIHBmZGV2X2luZm8tPm1ham9yX2ZwX2hzaSwKKwkJCQkJICBwZmRldl9pbmZvLT5taW5vcl9mcF9oc2ksCisJCQkJCSAgRVRIX0hTSV9WRVJfTUFKT1IsCisJCQkJCSAgRVRIX0hTSV9WRVJfTUlOT1IsCisJCQkJCSAgcGZkZXZfaW5mby0+bWFqb3JfZnBfaHNpKTsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJZ290byBleGl0OworCQkJfQogCi0JCQkvKiBDbGVhciByZXNwb25zZSBidWZmZXIgKi8KLQkJCW1lbXNldChwX2lvdi0+cGYydmZfcmVwbHksIDAsIHNpemVvZih1bmlvbiBwZnZmX3RsdnMpKTsKLQkJfSBlbHNlIGlmICgocmVzcC0+aGRyLnN0YXR1cyA9PSBQRlZGX1NUQVRVU19OT1RfU1VQUE9SVEVEKSAmJgotCQkJICAgcGZkZXZfaW5mby0+bWFqb3JfZnBfaHNpICYmCi0JCQkgICAocGZkZXZfaW5mby0+bWFqb3JfZnBfaHNpICE9IEVUSF9IU0lfVkVSX01BSk9SKSkgewotCQkJRFBfTk9USUNFKHBfaHdmbiwKLQkJCQkgICJQRiB1c2VzIGFuIGluY29tcGF0aWJsZSBmYXN0cGF0aCBIU0kgJTAyeC4lMDJ4IFtWRiByZXF1aXJlcyAlMDJ4LiUwMnhdLiBQbGVhc2UgY2hhbmdlIHRvIGEgVkYgZHJpdmVyIHVzaW5nICUwMngueHguXG4iLAotCQkJCSAgcGZkZXZfaW5mby0+bWFqb3JfZnBfaHNpLAotCQkJCSAgcGZkZXZfaW5mby0+bWlub3JfZnBfaHNpLAotCQkJCSAgRVRIX0hTSV9WRVJfTUFKT1IsCi0JCQkJICBFVEhfSFNJX1ZFUl9NSU5PUiwgcGZkZXZfaW5mby0+bWFqb3JfZnBfaHNpKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCFwZmRldl9pbmZvLT5tYWpvcl9mcF9oc2kpIHsKKwkJCQlpZiAocmVxLT52ZmRldl9pbmZvLmNhcGFiaWxpdGllcyAmCisJCQkJICAgIFZGUEZfQUNRVUlSRV9DQVBfUFJFX0ZQX0hTSSkgeworCQkJCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJCQkJICAiUEYgdXNlcyB2ZXJ5IG9sZCBkcml2ZXJzLiBQbGVhc2UgY2hhbmdlIHRvIGEgVkYgZHJpdmVyIHVzaW5nIG5vIGxhdGVyIHRoYW4gOC44LngueC5cbiIpOworCQkJCQlyYyA9IC1FSU5WQUw7CisJCQkJCWdvdG8gZXhpdDsKKwkJCQl9IGVsc2UgeworCQkJCQlEUF9JTkZPKHBfaHdmbiwKKwkJCQkJCSJQRiBpcyBvbGQgLSB0cnkgcmUtYWNxdWlyZSB0byBzZWUgaWYgaXQgc3VwcG9ydHMgRlctdmVyc2lvbiBvdmVycmlkZVxuIik7CisJCQkJCXJlcS0+dmZkZXZfaW5mby5jYXBhYmlsaXRpZXMgfD0KKwkJCQkJICAgIFZGUEZfQUNRVUlSRV9DQVBfUFJFX0ZQX0hTSTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCisJCQkvKiBJZiBQRi9WRiBhcmUgdXNpbmcgc2FtZSBNYWpvciwgUEYgbXVzdCBoYXZlIGhhZAorCQkJICogaXQncyByZWFzb25zLiBTaW1wbHkgZmFpbC4KKwkJCSAqLworCQkJRFBfTk9USUNFKHBfaHdmbiwgIlBGIHJlamVjdGVkIGFjcXVpc2l0aW9uIGJ5IFZGXG4iKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gZXhpdDsKIAkJfSBlbHNlIHsKIAkJCURQX0VSUihwX2h3Zm4sCiAJCQkgICAgICAgIlBGIHJldHVybmVkIGVycm9yICVkIHRvIFZGIGFjcXVpc2l0aW9uIHJlcXVlc3RcbiIsCiAJCQkgICAgICAgcmVzcC0+aGRyLnN0YXR1cyk7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKKwkJCXJjID0gLUVBR0FJTjsKKwkJCWdvdG8gZXhpdDsKIAkJfQogCX0KIAorCS8qIE1hcmsgdGhlIFBGIGFzIGxlZ2FjeSwgaWYgbmVlZGVkICovCisJaWYgKHJlcS0+dmZkZXZfaW5mby5jYXBhYmlsaXRpZXMgJiBWRlBGX0FDUVVJUkVfQ0FQX1BSRV9GUF9IU0kpCisJCXBfaW92LT5iX3ByZV9mcF9oc2kgPSB0cnVlOworCiAJLyogVXBkYXRlIGJ1bGxldGluIGJvYXJkIHNpemUgd2l0aCByZXNwb25zZSBmcm9tIFBGICovCiAJcF9pb3YtPmJ1bGxldGluLnNpemUgPSByZXNwLT5idWxsZXRpbl9zaXplOwogCkBAIC0yNTMsMTQgKzI5NCwxOCBAQAogCQl9CiAJfQogCi0JaWYgKEVUSF9IU0lfVkVSX01JTk9SICYmCisJaWYgKCFwX2lvdi0+Yl9wcmVfZnBfaHNpICYmCisJICAgIEVUSF9IU0lfVkVSX01JTk9SICYmCiAJICAgIChyZXNwLT5wZmRldl9pbmZvLm1pbm9yX2ZwX2hzaSA8IEVUSF9IU0lfVkVSX01JTk9SKSkgewogCQlEUF9JTkZPKHBfaHdmbiwKIAkJCSJQRiBpcyB1c2luZyBvbGRlciBmYXN0cGF0aCBIU0k7ICUwMnguJTAyeCBpcyBjb25maWd1cmVkXG4iLAogCQkJRVRIX0hTSV9WRVJfTUFKT1IsIHJlc3AtPnBmZGV2X2luZm8ubWlub3JfZnBfaHNpKTsKIAl9CiAKLQlyZXR1cm4gMDsKK2V4aXQ6CisJcWVkX3ZmX3BmX3JlcV9lbmQocF9od2ZuLCByYyk7CisKKwlyZXR1cm4gcmM7CiB9CiAKIGludCBxZWRfdmZfaHdfcHJlcGFyZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbikKQEAgLTI4NiwzMSArMzMxLDIzIEBACiAKIAkvKiBBbGxvY2F0ZSB2ZiBzcmlvdiBpbmZvICovCiAJcF9pb3YgPSBremFsbG9jKHNpemVvZigqcF9pb3YpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBfaW92KSB7Ci0JCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgYHN0cnVjdCBxZWRfc3Jpb3YnXG4iKTsKKwlpZiAoIXBfaW92KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAkvKiBBbGxvY2F0ZSB2ZjJwZiBtc2cgKi8KIAlwX2lvdi0+dmYycGZfcmVxdWVzdCA9IGRtYV9hbGxvY19jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsCiAJCQkJCQkgIHNpemVvZih1bmlvbiB2ZnBmX3RsdnMpLAogCQkJCQkJICAmcF9pb3YtPnZmMnBmX3JlcXVlc3RfcGh5cywKIAkJCQkJCSAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwX2lvdi0+dmYycGZfcmVxdWVzdCkgewotCQlEUF9OT1RJQ0UocF9od2ZuLAotCQkJICAiRmFpbGVkIHRvIGFsbG9jYXRlIGB2ZjJwZl9yZXF1ZXN0JyBETUEgbWVtb3J5XG4iKTsKKwlpZiAoIXBfaW92LT52ZjJwZl9yZXF1ZXN0KQogCQlnb3RvIGZyZWVfcF9pb3Y7Ci0JfQogCiAJcF9pb3YtPnBmMnZmX3JlcGx5ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKIAkJCQkJCXNpemVvZih1bmlvbiBwZnZmX3RsdnMpLAogCQkJCQkJJnBfaW92LT5wZjJ2Zl9yZXBseV9waHlzLAogCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwX2lvdi0+cGYydmZfcmVwbHkpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwKLQkJCSAgIkZhaWxlZCB0byBhbGxvY2F0ZSBgcGYydmZfcmVwbHknIERNQSBtZW1vcnlcbiIpOworCWlmICghcF9pb3YtPnBmMnZmX3JlcGx5KQogCQlnb3RvIGZyZWVfdmYycGZfcmVxdWVzdDsKLQl9CiAKIAlEUF9WRVJCT1NFKHBfaHdmbiwKIAkJICAgUUVEX01TR19JT1YsCkBAIC0zNDcsNiArMzg0LDkgQEAKIAogCXJldHVybiAtRU5PTUVNOwogfQorI2RlZmluZSBUU1RPUk1fUVpPTkVfU1RBUlQgICBQWFBfVkZfQkFSMF9TVEFSVF9TRE1fWk9ORV9BCisjZGVmaW5lIE1TVE9STV9RWk9ORV9TVEFSVChkZXYpICAgKFRTVE9STV9RWk9ORV9TVEFSVCArCVwKKwkJCQkgICAoVFNUT1JNX1FaT05FX1NJWkUgKiBOVU1fT0ZfTDJfUVVFVUVTKGRldikpKQogCiBpbnQgcWVkX3ZmX3BmX3J4cV9zdGFydChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJCXU4IHJ4X3FpZCwKQEAgLTM3NCw2ICs0MTQsMjEgQEAKIAlyZXEtPmJkX21heF9ieXRlcyA9IGJkX21heF9ieXRlczsKIAlyZXEtPnN0YXRfaWQgPSAtMTsKIAorCS8qIElmIFBGIGlzIGxlZ2FjeSwgd2UnbGwgbmVlZCB0byBjYWxjdWxhdGUgcHJvZHVjZXJzIG91cnNlbHZlcworCSAqIGFzIHdlbGwgYXMgY2xlYW4gdGhlbS4KKwkgKi8KKwlpZiAocHBfcHJvZCAmJiBwX2lvdi0+Yl9wcmVfZnBfaHNpKSB7CisJCXU4IGh3X3FpZCA9IHBfaW92LT5hY3F1aXJlX3Jlc3AucmVzYy5od19xaWRbcnhfcWlkXTsKKwkJdTMyIGluaXRfcHJvZF92YWwgPSAwOworCisJCSpwcF9wcm9kID0gKHU4IF9faW9tZW0gKilwX2h3Zm4tPnJlZ3ZpZXcgKworCQkJCQkgTVNUT1JNX1FaT05FX1NUQVJUKHBfaHdmbi0+Y2RldikgKworCQkJCQkgaHdfcWlkICogTVNUT1JNX1FaT05FX1NJWkU7CisKKwkJLyogSW5pdCB0aGUgcmNxLCByeCBiZCBhbmQgcnggc2dlIChpZiB2YWxpZCkgcHJvZHVjZXJzIHRvIDAgKi8KKwkJX19pbnRlcm5hbF9yYW1fd3IocF9od2ZuLCAqcHBfcHJvZCwgc2l6ZW9mKHUzMiksCisJCQkJICAodTMyICopKCZpbml0X3Byb2RfdmFsKSk7CisJfQogCS8qIGFkZCBsaXN0IHRlcm1pbmF0aW9uIHRsdiAqLwogCXFlZF9hZGRfdGx2KHBfaHdmbiwgJnBfaW92LT5vZmZzZXQsCiAJCSAgICBDSEFOTkVMX1RMVl9MSVNUX0VORCwgc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2xpc3RfZW5kX3RsdikpOwpAQCAtMzgxLDEzICs0MzYsMTUgQEAKIAlyZXNwID0gJnBfaW92LT5wZjJ2Zl9yZXBseS0+cXVldWVfc3RhcnQ7CiAJcmMgPSBxZWRfc2VuZF9tc2cycGYocF9od2ZuLCAmcmVzcC0+aGRyLnN0YXR1cywgc2l6ZW9mKCpyZXNwKSk7CiAJaWYgKHJjKQotCQlyZXR1cm4gcmM7CisJCWdvdG8gZXhpdDsKIAotCWlmIChyZXNwLT5oZHIuc3RhdHVzICE9IFBGVkZfU1RBVFVTX1NVQ0NFU1MpCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChyZXNwLT5oZHIuc3RhdHVzICE9IFBGVkZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQogCiAJLyogTGVhcm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHByb2R1Y2VyIGZyb20gdGhlIHJlc3BvbnNlICovCi0JaWYgKHBwX3Byb2QpIHsKKwlpZiAocHBfcHJvZCAmJiAhcF9pb3YtPmJfcHJlX2ZwX2hzaSkgewogCQl1MzIgaW5pdF9wcm9kX3ZhbCA9IDA7CiAKIAkJKnBwX3Byb2QgPSAodTggX19pb21lbSAqKXBfaHdmbi0+cmVndmlldyArIHJlc3AtPm9mZnNldDsKQEAgLTM5OSw2ICs0NTYsOCBAQAogCQlfX2ludGVybmFsX3JhbV93cihwX2h3Zm4sICpwcF9wcm9kLCBzaXplb2YodTMyKSwKIAkJCQkgICh1MzIgKikmaW5pdF9wcm9kX3ZhbCk7CiAJfQorZXhpdDoKKwlxZWRfdmZfcGZfcmVxX2VuZChwX2h3Zm4sIHJjKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTQyNCwxMCArNDgzLDE1IEBACiAJcmVzcCA9ICZwX2lvdi0+cGYydmZfcmVwbHktPmRlZmF1bHRfcmVzcDsKIAlyYyA9IHFlZF9zZW5kX21zZzJwZihwX2h3Zm4sICZyZXNwLT5oZHIuc3RhdHVzLCBzaXplb2YoKnJlc3ApKTsKIAlpZiAocmMpCi0JCXJldHVybiByYzsKKwkJZ290byBleGl0OwogCi0JaWYgKHJlc3AtPmhkci5zdGF0dXMgIT0gUEZWRl9TVEFUVVNfU1VDQ0VTUykKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJlc3AtPmhkci5zdGF0dXMgIT0gUEZWRl9TVEFUVVNfU1VDQ0VTUykgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKK2V4aXQ6CisJcWVkX3ZmX3BmX3JlcV9lbmQocF9od2ZuLCByYyk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC00NzAsMTMgKzUzNCwyNyBAQAogCX0KIAogCWlmIChwcF9kb29yYmVsbCkgewotCQkqcHBfZG9vcmJlbGwgPSAodTggX19pb21lbSAqKXBfaHdmbi0+ZG9vcmJlbGxzICsgcmVzcC0+b2Zmc2V0OworCQkvKiBNb2Rlcm4gUEZzIHByb3ZpZGUgdGhlIGFjdHVhbCBvZmZzZXRzLCB3aGlsZSBsZWdhY3kKKwkJICogcHJvdmlkZWQgb25seSB0aGUgcXVldWUgaWQuCisJCSAqLworCQlpZiAoIXBfaW92LT5iX3ByZV9mcF9oc2kpIHsKKwkJCSpwcF9kb29yYmVsbCA9ICh1OCBfX2lvbWVtICopcF9od2ZuLT5kb29yYmVsbHMgKworCQkJCQkJICAgICByZXNwLT5vZmZzZXQ7CisJCX0gZWxzZSB7CisJCQl1OCBjaWQgPSBwX2lvdi0+YWNxdWlyZV9yZXNwLnJlc2MuY2lkW3R4X3F1ZXVlX2lkXTsKKwkJCXUzMiBkYl9hZGRyOworCisJCQlkYl9hZGRyID0gcWVkX2RiX2FkZHJfdmYoY2lkLCBEUV9ERU1TX0xFR0FDWSk7CisJCQkqcHBfZG9vcmJlbGwgPSAodTggX19pb21lbSAqKXBfaHdmbi0+ZG9vcmJlbGxzICsKKwkJCQkJCSAgICAgZGJfYWRkcjsKKwkJfQogCiAJCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX0lPViwKIAkJCSAgICJUeHFbMHglMDJ4XTogZG9vcmJlbGwgYXQgJXAgW29mZnNldCAweCUwOHhdXG4iLAogCQkJICAgdHhfcXVldWVfaWQsICpwcF9kb29yYmVsbCwgcmVzcC0+b2Zmc2V0KTsKIAl9CiBleGl0OgorCXFlZF92Zl9wZl9yZXFfZW5kKHBfaHdmbiwgcmMpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtNTAxLDEwICs1NzksMTUgQEAKIAlyZXNwID0gJnBfaW92LT5wZjJ2Zl9yZXBseS0+ZGVmYXVsdF9yZXNwOwogCXJjID0gcWVkX3NlbmRfbXNnMnBmKHBfaHdmbiwgJnJlc3AtPmhkci5zdGF0dXMsIHNpemVvZigqcmVzcCkpOwogCWlmIChyYykKLQkJcmV0dXJuIHJjOworCQlnb3RvIGV4aXQ7CiAKLQlpZiAocmVzcC0+aGRyLnN0YXR1cyAhPSBQRlZGX1NUQVRVU19TVUNDRVNTKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocmVzcC0+aGRyLnN0YXR1cyAhPSBQRlZGX1NUQVRVU19TVUNDRVNTKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworZXhpdDoKKwlxZWRfdmZfcGZfcmVxX2VuZChwX2h3Zm4sIHJjKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTU0MywxMCArNjI2LDE1IEBACiAJcmVzcCA9ICZwX2lvdi0+cGYydmZfcmVwbHktPmRlZmF1bHRfcmVzcDsKIAlyYyA9IHFlZF9zZW5kX21zZzJwZihwX2h3Zm4sICZyZXNwLT5oZHIuc3RhdHVzLCBzaXplb2YoKnJlc3ApKTsKIAlpZiAocmMpCi0JCXJldHVybiByYzsKKwkJZ290byBleGl0OwogCi0JaWYgKHJlc3AtPmhkci5zdGF0dXMgIT0gUEZWRl9TVEFUVVNfU1VDQ0VTUykKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJlc3AtPmhkci5zdGF0dXMgIT0gUEZWRl9TVEFUVVNfU1VDQ0VTUykgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKK2V4aXQ6CisJcWVkX3ZmX3BmX3JlcV9lbmQocF9od2ZuLCByYyk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC01NjcsMTAgKzY1NSwxNSBAQAogCiAJcmMgPSBxZWRfc2VuZF9tc2cycGYocF9od2ZuLCAmcmVzcC0+aGRyLnN0YXR1cywgc2l6ZW9mKCpyZXNwKSk7CiAJaWYgKHJjKQotCQlyZXR1cm4gcmM7CisJCWdvdG8gZXhpdDsKIAotCWlmIChyZXNwLT5oZHIuc3RhdHVzICE9IFBGVkZfU1RBVFVTX1NVQ0NFU1MpCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChyZXNwLT5oZHIuc3RhdHVzICE9IFBGVkZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCitleGl0OgorCXFlZF92Zl9wZl9yZXFfZW5kKHBfaHdmbiwgcmMpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtNzcwLDEzICs4NjMsMTggQEAKIAogCXJjID0gcWVkX3NlbmRfbXNnMnBmKHBfaHdmbiwgJnJlc3AtPmhkci5zdGF0dXMsIHJlc3Bfc2l6ZSk7CiAJaWYgKHJjKQotCQlyZXR1cm4gcmM7CisJCWdvdG8gZXhpdDsKIAotCWlmIChyZXNwLT5oZHIuc3RhdHVzICE9IFBGVkZfU1RBVFVTX1NVQ0NFU1MpCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChyZXNwLT5oZHIuc3RhdHVzICE9IFBGVkZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQogCiAJcWVkX3ZmX2hhbmRsZV92cF91cGRhdGVfdGx2c19yZXNwKHBfaHdmbiwgcF9wYXJhbXMpOwogCitleGl0OgorCXFlZF92Zl9wZl9yZXFfZW5kKHBfaHdmbiwgcmMpOworCiAJcmV0dXJuIHJjOwogfQogCkBAIC03OTcsMTQgKzg5NSwxOSBAQAogCXJlc3AgPSAmcF9pb3YtPnBmMnZmX3JlcGx5LT5kZWZhdWx0X3Jlc3A7CiAJcmMgPSBxZWRfc2VuZF9tc2cycGYocF9od2ZuLCAmcmVzcC0+aGRyLnN0YXR1cywgc2l6ZW9mKCpyZXNwKSk7CiAJaWYgKHJjKQotCQlyZXR1cm4gcmM7CisJCWdvdG8gZXhpdDsKIAotCWlmIChyZXNwLT5oZHIuc3RhdHVzICE9IFBGVkZfU1RBVFVTX1NVQ0NFU1MpCi0JCXJldHVybiAtRUFHQUlOOworCWlmIChyZXNwLT5oZHIuc3RhdHVzICE9IFBGVkZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmMgPSAtRUFHQUlOOworCQlnb3RvIGV4aXQ7CisJfQogCiAJcF9od2ZuLT5iX2ludF9lbmFibGVkID0gMDsKIAotCXJldHVybiAwOworZXhpdDoKKwlxZWRfdmZfcGZfcmVxX2VuZChwX2h3Zm4sIHJjKTsKKworCXJldHVybiByYzsKIH0KIAogaW50IHFlZF92Zl9wZl9yZWxlYXNlKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuKQpAQCAtODI4LDYgKzkzMSw4IEBACiAJaWYgKCFyYyAmJiByZXNwLT5oZHIuc3RhdHVzICE9IFBGVkZfU1RBVFVTX1NVQ0NFU1MpCiAJCXJjID0gLUVBR0FJTjsKIAorCXFlZF92Zl9wZl9yZXFfZW5kKHBfaHdmbiwgcmMpOworCiAJcF9od2ZuLT5iX2ludF9lbmFibGVkID0gMDsKIAogCWlmIChwX2lvdi0+dmYycGZfcmVxdWVzdCkKQEAgLTg5NiwxMiArMTAwMSwxNyBAQAogCXJlc3AgPSAmcF9pb3YtPnBmMnZmX3JlcGx5LT5kZWZhdWx0X3Jlc3A7CiAJcmMgPSBxZWRfc2VuZF9tc2cycGYocF9od2ZuLCAmcmVzcC0+aGRyLnN0YXR1cywgc2l6ZW9mKCpyZXNwKSk7CiAJaWYgKHJjKQotCQlyZXR1cm4gcmM7CisJCWdvdG8gZXhpdDsKIAotCWlmIChyZXNwLT5oZHIuc3RhdHVzICE9IFBGVkZfU1RBVFVTX1NVQ0NFU1MpCi0JCXJldHVybiAtRUFHQUlOOworCWlmIChyZXNwLT5oZHIuc3RhdHVzICE9IFBGVkZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmMgPSAtRUFHQUlOOworCQlnb3RvIGV4aXQ7CisJfQogCi0JcmV0dXJuIDA7CitleGl0OgorCXFlZF92Zl9wZl9yZXFfZW5kKHBfaHdmbiwgcmMpOworCisJcmV0dXJuIHJjOwogfQogCiBpbnQgcWVkX3ZmX3BmX2ludF9jbGVhbnVwKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuKQpAQCAtOTIwLDEyICsxMDMwLDE3IEBACiAKIAlyYyA9IHFlZF9zZW5kX21zZzJwZihwX2h3Zm4sICZyZXNwLT5oZHIuc3RhdHVzLCBzaXplb2YoKnJlc3ApKTsKIAlpZiAocmMpCi0JCXJldHVybiByYzsKKwkJZ290byBleGl0OwogCi0JaWYgKHJlc3AtPmhkci5zdGF0dXMgIT0gUEZWRl9TVEFUVVNfU1VDQ0VTUykKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJlc3AtPmhkci5zdGF0dXMgIT0gUEZWRl9TVEFUVVNfU1VDQ0VTUykgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CiAKLQlyZXR1cm4gMDsKK2V4aXQ6CisJcWVkX3ZmX3BmX3JlcV9lbmQocF9od2ZuLCByYyk7CisKKwlyZXR1cm4gcmM7CiB9CiAKIHUxNiBxZWRfdmZfZ2V0X2lndV9zYl9pZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTE2IHNiX2lkKQpAQCAtMTA3MSw4ICsxMTg2LDggQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgcWVkX3ZmX2J1bGxldGluX2dldF9mb3JjZWRfbWFjKHN0cnVjdCBxZWRfaHdmbiAqaHdmbiwKLQkJCQkgICAgdTggKmRzdF9tYWMsIHU4ICpwX2lzX2ZvcmNlZCkKK3N0YXRpYyBib29sIHFlZF92Zl9idWxsZXRpbl9nZXRfZm9yY2VkX21hYyhzdHJ1Y3QgcWVkX2h3Zm4gKmh3Zm4sCisJCQkJCSAgIHU4ICpkc3RfbWFjLCB1OCAqcF9pc19mb3JjZWQpCiB7CiAJc3RydWN0IHFlZF9idWxsZXRpbl9jb250ZW50ICpidWxsZXRpbjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfdmYuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3ZmLmgKaW5kZXggYjIzY2U1OC4uMzVkYjdhMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3ZmLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfdmYuaApAQCAtODYsNyArODYsNyBAQAogCXN0cnVjdCB2ZnBmX2ZpcnN0X3RsdiBmaXJzdF90bHY7CiAKIAlzdHJ1Y3QgdmZfcGZfdmZkZXZfaW5mbyB7Ci0jZGVmaW5lIFZGUEZfQUNRVUlSRV9DQVBfT0JTT0xFVEUJKDEgPDwgMCkKKyNkZWZpbmUgVkZQRl9BQ1FVSVJFX0NBUF9QUkVfRlBfSFNJICAgICAoMSA8PCAwKSAvKiBWRiBwcmUtRlAgaHNpIHZlcnNpb24gKi8KICNkZWZpbmUgVkZQRl9BQ1FVSVJFX0NBUF8xMDBHCQkoMSA8PCAxKSAvKiBWRiBjYW4gc3VwcG9ydCAxMDBnICovCiAJCXU2NCBjYXBhYmlsaXRpZXM7CiAJCXU4IGZ3X21ham9yOwpAQCAtNTUxLDYgKzU1MSwxMSBAQAogCiAJLyogd2Ugc2V0IGFzaWRlIGEgY29weSBvZiB0aGUgYWNxdWlyZSByZXNwb25zZSAqLwogCXN0cnVjdCBwZnZmX2FjcXVpcmVfcmVzcF90bHYgYWNxdWlyZV9yZXNwOworCisJLyogSW4gY2FzZSBQRiBvcmlnaW5hdGVzIHByaW9yIHRvIHRoZSBmcC1oc2kgdmVyc2lvbiBjb21wYXJpc29uLAorCSAqIHRoaXMgaGFzIHRvIGJlIHByb3BhZ2F0ZWQgYXMgaXQgYWZmZWN0cyB0aGUgZmFzdHBhdGguCisJICovCisJYm9vbCBiX3ByZV9mcF9oc2k7CiB9OwogCiAjaWZkZWYgQ09ORklHX1FFRF9TUklPVgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZGUvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkZS9NYWtlZmlsZQppbmRleCA3NGE0OTg1Li4yOGRjNTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkZS9NYWtlZmlsZQpAQCAtMiwzICsyLDQgQEAKIAogcWVkZS15IDo9IHFlZGVfbWFpbi5vIHFlZGVfZXRodG9vbC5vCiBxZWRlLSQoQ09ORklHX0RDQikgKz0gcWVkZV9kY2JubC5vCitxZWRlLSQoQ09ORklHX0lORklOSUJBTkRfUUVEUikgKz0gcWVkZV9yb2NlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWRlL3FlZGUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWRlL3FlZGUuaAppbmRleCAwMmIwNmQ0Li4yOGMwZTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkZS9xZWRlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZGUvcWVkZS5oCkBAIC0yNSw3ICsyNSw3IEBACiAKICNkZWZpbmUgUUVERV9NQUpPUl9WRVJTSU9OCQk4CiAjZGVmaW5lIFFFREVfTUlOT1JfVkVSU0lPTgkJMTAKLSNkZWZpbmUgUUVERV9SRVZJU0lPTl9WRVJTSU9OCQkxCisjZGVmaW5lIFFFREVfUkVWSVNJT05fVkVSU0lPTgkJOQogI2RlZmluZSBRRURFX0VOR0lORUVSSU5HX1ZFUlNJT04JMjAKICNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OIF9fc3RyaW5naWZ5KFFFREVfTUFKT1JfVkVSU0lPTikgIi4iCVwKIAkJX19zdHJpbmdpZnkoUUVERV9NSU5PUl9WRVJTSU9OKSAiLiIJCVwKQEAgLTM2LDYgKzM2LDggQEAKIAogc3RydWN0IHFlZGVfc3RhdHMgewogCXU2NCBub19idWZmX2Rpc2NhcmRzOworCXU2NCBwYWNrZXRfdG9vX2JpZ19kaXNjYXJkOworCXU2NCB0dGwwX2Rpc2NhcmQ7CiAJdTY0IHJ4X3VjYXN0X2J5dGVzOwogCXU2NCByeF9tY2FzdF9ieXRlczsKIAl1NjQgcnhfYmNhc3RfYnl0ZXM7CkBAIC0xMDQsNiArMTA2LDEzIEBACiAJYm9vbCBjb25maWd1cmVkOwogfTsKIAorc3RydWN0IHFlZGVfcmRtYV9kZXYgeworCXN0cnVjdCBxZWRyX2RldiAqcWVkcl9kZXY7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJvY2VfZXZlbnRfbGlzdDsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcm9jZV93cTsKK307CisKIHN0cnVjdCBxZWRlX2RldiB7CiAJc3RydWN0IHFlZF9kZXYJCQkqY2RldjsKIAlzdHJ1Y3QgbmV0X2RldmljZQkJKm5kZXY7CkBAIC0xMjQsMTYgKzEzMywyMiBAQAogCQkJCSAoZWRldiktPmRldl9pbmZvLm51bV90YykKIAogCXN0cnVjdCBxZWRlX2Zhc3RwYXRoCQkqZnBfYXJyYXk7Ci0JdTE2CQkJCXJlcV9yc3M7Ci0JdTE2CQkJCW51bV9yc3M7CisJdTgJCQkJcmVxX251bV90eDsKKwl1OAkJCQlmcF9udW1fdHg7CisJdTgJCQkJcmVxX251bV9yeDsKKwl1OAkJCQlmcF9udW1fcng7CisJdTE2CQkJCXJlcV9xdWV1ZXM7CisJdTE2CQkJCW51bV9xdWV1ZXM7CiAJdTgJCQkJbnVtX3RjOwotI2RlZmluZSBRRURFX1JTU19DTlQoZWRldikJCSgoZWRldiktPm51bV9yc3MpCi0jZGVmaW5lIFFFREVfVFNTX0NOVChlZGV2KQkJKChlZGV2KS0+bnVtX3JzcyAqCVwKLQkJCQkJIChlZGV2KS0+bnVtX3RjKQotI2RlZmluZSBRRURFX1RTU19JRFgoZWRldiwgdHhxaWR4KQkoKHR4cWlkeCkgJSAoZWRldiktPm51bV9yc3MpCi0jZGVmaW5lIFFFREVfVENfSURYKGVkZXYsIHR4cWlkeCkJKCh0eHFpZHgpIC8gKGVkZXYpLT5udW1fcnNzKQorI2RlZmluZSBRRURFX1FVRVVFX0NOVChlZGV2KQkoKGVkZXYpLT5udW1fcXVldWVzKQorI2RlZmluZSBRRURFX1JTU19DT1VOVChlZGV2KQkoKGVkZXYpLT5udW1fcXVldWVzIC0gKGVkZXYpLT5mcF9udW1fdHgpCisjZGVmaW5lIFFFREVfVFNTX0NPVU5UKGVkZXYpCSgoKGVkZXYpLT5udW1fcXVldWVzIC0gKGVkZXYpLT5mcF9udW1fcngpICogXAorCQkJCSAoZWRldiktPm51bV90YykKKyNkZWZpbmUgUUVERV9UWF9JRFgoZWRldiwgdHhxaWR4KQkoKGVkZXYpLT5mcF9udW1fcnggKyAodHhxaWR4KSAlIFwKKwkJCQkJIFFFREVfVFNTX0NPVU5UKGVkZXYpKQorI2RlZmluZSBRRURFX1RDX0lEWChlZGV2LCB0eHFpZHgpCSgodHhxaWR4KSAvIFFFREVfVFNTX0NPVU5UKGVkZXYpKQogI2RlZmluZSBRRURFX1RYX1FVRVVFKGVkZXYsIHR4cWlkeCkJXAotCSgmKGVkZXYpLT5mcF9hcnJheVtRRURFX1RTU19JRFgoKGVkZXYpLCAodHhxaWR4KSldLnR4cXNbUUVERV9UQ19JRFgoIFwKKwkoJihlZGV2KS0+ZnBfYXJyYXlbUUVERV9UWF9JRFgoKGVkZXYpLCAodHhxaWR4KSldLnR4cXNbUUVERV9UQ19JRFgoXAogCQkJCQkJCShlZGV2KSwgKHR4cWlkeCkpXSkKIAogCXN0cnVjdCBxZWRfaW50X2luZm8JCWludF9pbmZvOwpAQCAtMTc3LDYgKzE5Miw4IEBACiAJdW5zaWduZWQgbG9uZwkJCXNwX2ZsYWdzOwogCXUxNgkJCQl2eGxhbl9kc3RfcG9ydDsKIAl1MTYJCQkJZ2VuZXZlX2RzdF9wb3J0OworCisJc3RydWN0IHFlZGVfcmRtYV9kZXYJCXJkbWFfaW5mbzsKIH07CiAKIGVudW0gUUVERV9TVEFURSB7CkBAIC0yMzUsNiArMjUyLDcgQEAKIAl1MTYJCQludW1fcnhfYnVmZmVyczsKIAl1MTYJCQlyeHFfaWQ7CiAKKwl1NjQJCQlyY3ZfcGt0czsKIAl1NjQJCQlyeF9od19lcnJvcnM7CiAJdTY0CQkJcnhfYWxsb2NfZXJyb3JzOwogCXU2NAkJCXJ4X2lwX2ZyYWdzOwpAQCAtMjYzLDYgKzI4MSwxMCBAQAogCXVuaW9uIGRiX3Byb2QJCXR4X2RiOwogCiAJdTE2CQkJbnVtX3R4X2J1ZmZlcnM7CisJdTY0CQkJeG1pdF9wa3RzOworCXU2NAkJCXN0b3BwZWRfY250OworCisJYm9vbAkJCWlzX2xlZ2FjeTsKIH07CiAKICNkZWZpbmUgQkRfVU5NQVBfQUREUihiZCkJCUhJTE9fVTY0KGxlMzJfdG9fY3B1KChiZCktPmFkZHIuaGkpLCBcCkBAIC0yNzcsNyArMjk5LDExIEBACiAKIHN0cnVjdCBxZWRlX2Zhc3RwYXRoIHsKIAlzdHJ1Y3QgcWVkZV9kZXYJKmVkZXY7Ci0JdTgJCQlyc3NfaWQ7CisjZGVmaW5lIFFFREVfRkFTVFBBVEhfVFgJQklUKDApCisjZGVmaW5lIFFFREVfRkFTVFBBVEhfUlgJQklUKDEpCisjZGVmaW5lIFFFREVfRkFTVFBBVEhfQ09NQklORUQJKFFFREVfRkFTVFBBVEhfVFggfCBRRURFX0ZBU1RQQVRIX1JYKQorCXU4CQkJdHlwZTsKKwl1OAkJCWlkOwogCXN0cnVjdCBuYXBpX3N0cnVjdAluYXBpOwogCXN0cnVjdCBxZWRfc2JfaW5mbwkqc2JfaW5mbzsKIAlzdHJ1Y3QgcWVkZV9yeF9xdWV1ZQkqcnhxOwpAQCAtMzM3LDYgKzM2Myw2IEBACiAKICNkZWZpbmUgUUVERV9NSU5fUEtUX0xFTgk2NAogI2RlZmluZSBRRURFX1JYX0hEUl9TSVpFCTI1NgotI2RlZmluZQlmb3JfZWFjaF9yc3MoaSkgZm9yIChpID0gMDsgaSA8IGVkZXYtPm51bV9yc3M7IGkrKykKKyNkZWZpbmUJZm9yX2VhY2hfcXVldWUoaSkgZm9yIChpID0gMDsgaSA8IGVkZXYtPm51bV9xdWV1ZXM7IGkrKykKIAogI2VuZGlmIC8qIF9RRURFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkZS9xZWRlX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWRlL3FlZGVfZXRodG9vbC5jCmluZGV4IGY4NDkyY2EuLjI1YTliMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWRlL3FlZGVfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWRlL3FlZGVfZXRodG9vbC5jCkBAIC0zNSw2ICszNSw3IEBACiAJdTY0IG9mZnNldDsKIAljaGFyIHN0cmluZ1tFVEhfR1NUUklOR19MRU5dOwogfSBxZWRlX3Jxc3RhdHNfYXJyW10gPSB7CisJUUVERV9SUVNUQVQocmN2X3BrdHMpLAogCVFFREVfUlFTVEFUKHJ4X2h3X2Vycm9ycyksCiAJUUVERV9SUVNUQVQocnhfYWxsb2NfZXJyb3JzKSwKIAlRRURFX1JRU1RBVChyeF9pcF9mcmFncyksCkBAIC00NCw2ICs0NSwyNCBAQAogI2RlZmluZSBRRURFX1JRU1RBVFNfREFUQShkZXYsIHNpbmRleCwgcnFpbmRleCkgXAogCSgqKCh1NjQgKikoKChjaGFyICopKGRldi0+ZnBfYXJyYXlbKHJxaW5kZXgpXS5yeHEpKSArXAogCQkgICAgcWVkZV9ycXN0YXRzX2Fyclsoc2luZGV4KV0ub2Zmc2V0KSkpCisjZGVmaW5lIFFFREVfVFFTVEFUX09GRlNFVChzdGF0X25hbWUpIFwKKwkob2Zmc2V0b2Yoc3RydWN0IHFlZGVfdHhfcXVldWUsIHN0YXRfbmFtZSkpCisjZGVmaW5lIFFFREVfVFFTVEFUX1NUUklORyhzdGF0X25hbWUpICgjc3RhdF9uYW1lKQorI2RlZmluZSBRRURFX1RRU1RBVChzdGF0X25hbWUpIFwKKwl7UUVERV9UUVNUQVRfT0ZGU0VUKHN0YXRfbmFtZSksIFFFREVfVFFTVEFUX1NUUklORyhzdGF0X25hbWUpfQorI2RlZmluZSBRRURFX05VTV9UUVNUQVRTIEFSUkFZX1NJWkUocWVkZV90cXN0YXRzX2FycikKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXU2NCBvZmZzZXQ7CisJY2hhciBzdHJpbmdbRVRIX0dTVFJJTkdfTEVOXTsKK30gcWVkZV90cXN0YXRzX2FycltdID0geworCVFFREVfVFFTVEFUKHhtaXRfcGt0cyksCisJUUVERV9UUVNUQVQoc3RvcHBlZF9jbnQpLAorfTsKKworI2RlZmluZSBRRURFX1RRU1RBVFNfREFUQShkZXYsIHNpbmRleCwgdHNzaWQsIHRjaWQpIFwKKwkoKigodTY0ICopKCgodm9pZCAqKSgmZGV2LT5mcF9hcnJheVt0c3NpZF0udHhxc1t0Y2lkXSkpICtcCisJCSAgIHFlZGVfdHFzdGF0c19hcnJbKHNpbmRleCldLm9mZnNldCkpKQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAl1NjQgb2Zmc2V0OwogCWNoYXIgc3RyaW5nW0VUSF9HU1RSSU5HX0xFTl07CkBAIC0xMDcsNiArMTI2LDggQEAKIAlRRURFX1BGX1NUQVQobWZ0YWdfZmlsdGVyX2Rpc2NhcmRzKSwKIAlRRURFX1BGX1NUQVQobWFjX2ZpbHRlcl9kaXNjYXJkcyksCiAJUUVERV9TVEFUKHR4X2Vycl9kcm9wX3BrdHMpLAorCVFFREVfU1RBVCh0dGwwX2Rpc2NhcmQpLAorCVFFREVfU1RBVChwYWNrZXRfdG9vX2JpZ19kaXNjYXJkKSwKIAogCVFFREVfU1RBVChjb2FsZXNjZWRfcGt0cyksCiAJUUVERV9TVEFUKGNvYWxlc2NlZF9ldmVudHMpLApAQCAtMTUxLDE3ICsxNzIsMjkgQEAKIHsKIAlpbnQgaSwgaiwgazsKIAorCWZvciAoaSA9IDAsIGsgPSAwOyBpIDwgUUVERV9RVUVVRV9DTlQoZWRldik7IGkrKykgeworCQlpbnQgdGM7CisKKwkJZm9yIChqID0gMDsgaiA8IFFFREVfTlVNX1JRU1RBVFM7IGorKykKKwkJCXNwcmludGYoYnVmICsgKGsgKyBqKSAqIEVUSF9HU1RSSU5HX0xFTiwKKwkJCQkiJWQ6ICAgJXMiLCBpLCBxZWRlX3Jxc3RhdHNfYXJyW2pdLnN0cmluZyk7CisJCWsgKz0gUUVERV9OVU1fUlFTVEFUUzsKKwkJZm9yICh0YyA9IDA7IHRjIDwgZWRldi0+bnVtX3RjOyB0YysrKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgUUVERV9OVU1fVFFTVEFUUzsgaisrKQorCQkJCXNwcmludGYoYnVmICsgKGsgKyBqKSAqIEVUSF9HU1RSSU5HX0xFTiwKKwkJCQkJIiVkLiVkOiAlcyIsIGksIHRjLAorCQkJCQlxZWRlX3Rxc3RhdHNfYXJyW2pdLnN0cmluZyk7CisJCQlrICs9IFFFREVfTlVNX1RRU1RBVFM7CisJCX0KKwl9CisKIAlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IFFFREVfTlVNX1NUQVRTOyBpKyspIHsKIAkJaWYgKElTX1ZGKGVkZXYpICYmIHFlZGVfc3RhdHNfYXJyW2ldLnBmX29ubHkpCiAJCQljb250aW51ZTsKLQkJc3RyY3B5KGJ1ZiArIGogKiBFVEhfR1NUUklOR19MRU4sCisJCXN0cmNweShidWYgKyAoayArIGopICogRVRIX0dTVFJJTkdfTEVOLAogCQkgICAgICAgcWVkZV9zdGF0c19hcnJbaV0uc3RyaW5nKTsKIAkJaisrOwogCX0KLQotCWZvciAoayA9IDA7IGsgPCBRRURFX05VTV9SUVNUQVRTOyBrKyssIGorKykKLQkJc3RyY3B5KGJ1ZiArIGogKiBFVEhfR1NUUklOR19MRU4sCi0JCSAgICAgICBxZWRlX3Jxc3RhdHNfYXJyW2tdLnN0cmluZyk7CiB9CiAKIHN0YXRpYyB2b2lkIHFlZGVfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0cmluZ3NldCwgdTggKmJ1ZikKQEAgLTE5NywxOSArMjMwLDMwIEBACiAKIAltdXRleF9sb2NrKCZlZGV2LT5xZWRlX2xvY2spOwogCisJZm9yIChxaWQgPSAwOyBxaWQgPCBRRURFX1FVRVVFX0NOVChlZGV2KTsgcWlkKyspIHsKKwkJaW50IHRjOworCisJCWlmIChlZGV2LT5mcF9hcnJheVtxaWRdLnR5cGUgJiBRRURFX0ZBU1RQQVRIX1JYKSB7CisJCQlmb3IgKHNpZHggPSAwOyBzaWR4IDwgUUVERV9OVU1fUlFTVEFUUzsgc2lkeCsrKQorCQkJCWJ1ZltjbnQrK10gPSBRRURFX1JRU1RBVFNfREFUQShlZGV2LCBzaWR4LCBxaWQpOworCQl9CisKKwkJaWYgKGVkZXYtPmZwX2FycmF5W3FpZF0udHlwZSAmIFFFREVfRkFTVFBBVEhfVFgpIHsKKwkJCWZvciAodGMgPSAwOyB0YyA8IGVkZXYtPm51bV90YzsgdGMrKykgeworCQkJCWZvciAoc2lkeCA9IDA7IHNpZHggPCBRRURFX05VTV9UUVNUQVRTOyBzaWR4KyspCisJCQkJCWJ1ZltjbnQrK10gPSBRRURFX1RRU1RBVFNfREFUQShlZGV2LAorCQkJCQkJCQkgICAgICAgc2lkeCwKKwkJCQkJCQkJICAgICAgIHFpZCwgdGMpOworCQkJfQorCQl9CisJfQorCiAJZm9yIChzaWR4ID0gMDsgc2lkeCA8IFFFREVfTlVNX1NUQVRTOyBzaWR4KyspIHsKIAkJaWYgKElTX1ZGKGVkZXYpICYmIHFlZGVfc3RhdHNfYXJyW3NpZHhdLnBmX29ubHkpCiAJCQljb250aW51ZTsKIAkJYnVmW2NudCsrXSA9IFFFREVfU1RBVFNfREFUQShlZGV2LCBzaWR4KTsKIAl9CiAKLQlmb3IgKHNpZHggPSAwOyBzaWR4IDwgUUVERV9OVU1fUlFTVEFUUzsgc2lkeCsrKSB7Ci0JCWJ1ZltjbnRdID0gMDsKLQkJZm9yIChxaWQgPSAwOyBxaWQgPCBlZGV2LT5udW1fcnNzOyBxaWQrKykKLQkJCWJ1ZltjbnRdICs9IFFFREVfUlFTVEFUU19EQVRBKGVkZXYsIHNpZHgsIHFpZCk7Ci0JCWNudCsrOwotCX0KLQogCW11dGV4X3VubG9jaygmZWRldi0+cWVkZV9sb2NrKTsKIH0KIApAQCAtMjI3LDcgKzI3MSw4IEBACiAJCQkJaWYgKHFlZGVfc3RhdHNfYXJyW2ldLnBmX29ubHkpCiAJCQkJCW51bV9zdGF0cy0tOwogCQl9Ci0JCXJldHVybiBudW1fc3RhdHMgKyBRRURFX05VTV9SUVNUQVRTOworCQlyZXR1cm4gbnVtX3N0YXRzICsgUUVERV9SU1NfQ09VTlQoZWRldikgKiBRRURFX05VTV9SUVNUQVRTICsKKwkJICAgICAgIFFFREVfVFNTX0NPVU5UKGVkZXYpICogUUVERV9OVU1fVFFTVEFUUyAqIGVkZXYtPm51bV90YzsKIAljYXNlIEVUSF9TU19QUklWX0ZMQUdTOgogCQlyZXR1cm4gUUVERV9QUklfRkxBR19MRU47CiAJY2FzZSBFVEhfU1NfVEVTVDoKQEAgLTI0OSw3OCArMjk0LDE1MCBAQAogCXJldHVybiAoISEoZWRldi0+ZGV2X2luZm8uY29tbW9uLm51bV9od2ZucyA+IDEpKSA8PCBRRURFX1BSSV9GTEFHX0NNVDsKIH0KIAotc3RhdGljIGludCBxZWRlX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3N0cnVjdCBxZWRlX2xpbmtfbW9kZV9tYXBwaW5nIHsKKwl1MzIgcWVkX2xpbmtfbW9kZTsKKwl1MzIgZXRodG9vbF9saW5rX21vZGU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHFlZGVfbGlua19tb2RlX21hcHBpbmcgcWVkX2xtX21hcFtdID0geworCXtRRURfTE1fRklCUkVfQklULCBFVEhUT09MX0xJTktfTU9ERV9GSUJSRV9CSVR9LAorCXtRRURfTE1fQXV0b25lZ19CSVQsIEVUSFRPT0xfTElOS19NT0RFX0F1dG9uZWdfQklUfSwKKwl7UUVEX0xNX0FzeW1fUGF1c2VfQklULCBFVEhUT09MX0xJTktfTU9ERV9Bc3ltX1BhdXNlX0JJVH0sCisJe1FFRF9MTV9QYXVzZV9CSVQsIEVUSFRPT0xfTElOS19NT0RFX1BhdXNlX0JJVH0sCisJe1FFRF9MTV8xMDAwYmFzZVRfSGFsZl9CSVQsIEVUSFRPT0xfTElOS19NT0RFXzEwMDBiYXNlVF9IYWxmX0JJVH0sCisJe1FFRF9MTV8xMDAwYmFzZVRfRnVsbF9CSVQsIEVUSFRPT0xfTElOS19NT0RFXzEwMDBiYXNlVF9GdWxsX0JJVH0sCisJe1FFRF9MTV8xMDAwMGJhc2VLUl9GdWxsX0JJVCwgRVRIVE9PTF9MSU5LX01PREVfMTAwMDBiYXNlS1JfRnVsbF9CSVR9LAorCXtRRURfTE1fMjUwMDBiYXNlS1JfRnVsbF9CSVQsIEVUSFRPT0xfTElOS19NT0RFXzI1MDAwYmFzZUtSX0Z1bGxfQklUfSwKKwl7UUVEX0xNXzQwMDAwYmFzZUxSNF9GdWxsX0JJVCwgRVRIVE9PTF9MSU5LX01PREVfNDAwMDBiYXNlTFI0X0Z1bGxfQklUfSwKKwl7UUVEX0xNXzUwMDAwYmFzZUtSMl9GdWxsX0JJVCwgRVRIVE9PTF9MSU5LX01PREVfNTAwMDBiYXNlS1IyX0Z1bGxfQklUfSwKKwl7UUVEX0xNXzEwMDAwMGJhc2VLUjRfRnVsbF9CSVQsCisJIEVUSFRPT0xfTElOS19NT0RFXzEwMDAwMGJhc2VLUjRfRnVsbF9CSVR9LAorfTsKKworI2RlZmluZSBRRURFX0RSVl9UT19FVEhUT09MX0NBUFMoY2FwcywgbGtfa3NldHRpbmdzLCBuYW1lKQlcCit7CQkJCQkJCQlcCisJaW50IGk7CQkJCQkJCVwKKwkJCQkJCQkJXAorCWZvciAoaSA9IDA7IGkgPCBRRURfTE1fQ09VTlQ7IGkrKykgewkJCVwKKwkJaWYgKChjYXBzKSAmIChxZWRfbG1fbWFwW2ldLnFlZF9saW5rX21vZGUpKQlcCisJCQlfX3NldF9iaXQocWVkX2xtX21hcFtpXS5ldGh0b29sX2xpbmtfbW9kZSxcCisJCQkJICBsa19rc2V0dGluZ3MtPmxpbmtfbW9kZXMubmFtZSk7IFwKKwl9CQkJCQkJCVwKK30KKworI2RlZmluZSBRRURFX0VUSFRPT0xfVE9fRFJWX0NBUFMoY2FwcywgbGtfa3NldHRpbmdzLCBuYW1lKQlcCit7CQkJCQkJCQlcCisJaW50IGk7CQkJCQkJCVwKKwkJCQkJCQkJXAorCWZvciAoaSA9IDA7IGkgPCBRRURfTE1fQ09VTlQ7IGkrKykgewkJCVwKKwkJaWYgKHRlc3RfYml0KHFlZF9sbV9tYXBbaV0uZXRodG9vbF9saW5rX21vZGUsCVwKKwkJCSAgICAgbGtfa3NldHRpbmdzLT5saW5rX21vZGVzLm5hbWUpKQlcCisJCQljYXBzIHw9IHFlZF9sbV9tYXBbaV0ucWVkX2xpbmtfbW9kZTsJXAorCX0JCQkJCQkJXAorfQorCitzdGF0aWMgaW50IHFlZGVfZ2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKKwlzdHJ1Y3QgZXRodG9vbF9saW5rX3NldHRpbmdzICpiYXNlID0gJmNtZC0+YmFzZTsKIAlzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBxZWRfbGlua19vdXRwdXQgY3VycmVudF9saW5rOwogCiAJbWVtc2V0KCZjdXJyZW50X2xpbmssIDAsIHNpemVvZihjdXJyZW50X2xpbmspKTsKIAllZGV2LT5vcHMtPmNvbW1vbi0+Z2V0X2xpbmsoZWRldi0+Y2RldiwgJmN1cnJlbnRfbGluayk7CiAKLQljbWQtPnN1cHBvcnRlZCA9IGN1cnJlbnRfbGluay5zdXBwb3J0ZWRfY2FwczsKLQljbWQtPmFkdmVydGlzaW5nID0gY3VycmVudF9saW5rLmFkdmVydGlzZWRfY2FwczsKKwlldGh0b29sX2xpbmtfa3NldHRpbmdzX3plcm9fbGlua19tb2RlKGNtZCwgc3VwcG9ydGVkKTsKKwlRRURFX0RSVl9UT19FVEhUT09MX0NBUFMoY3VycmVudF9saW5rLnN1cHBvcnRlZF9jYXBzLCBjbWQsIHN1cHBvcnRlZCkKKworCWV0aHRvb2xfbGlua19rc2V0dGluZ3NfemVyb19saW5rX21vZGUoY21kLCBhZHZlcnRpc2luZyk7CisJUUVERV9EUlZfVE9fRVRIVE9PTF9DQVBTKGN1cnJlbnRfbGluay5hZHZlcnRpc2VkX2NhcHMsIGNtZCwgYWR2ZXJ0aXNpbmcpCisKKwlldGh0b29sX2xpbmtfa3NldHRpbmdzX3plcm9fbGlua19tb2RlKGNtZCwgbHBfYWR2ZXJ0aXNpbmcpOworCVFFREVfRFJWX1RPX0VUSFRPT0xfQ0FQUyhjdXJyZW50X2xpbmsubHBfY2FwcywgY21kLCBscF9hZHZlcnRpc2luZykKKwogCWlmICgoZWRldi0+c3RhdGUgPT0gUUVERV9TVEFURV9PUEVOKSAmJiAoY3VycmVudF9saW5rLmxpbmtfdXApKSB7Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsIGN1cnJlbnRfbGluay5zcGVlZCk7Ci0JCWNtZC0+ZHVwbGV4ID0gY3VycmVudF9saW5rLmR1cGxleDsKKwkJYmFzZS0+c3BlZWQgPSBjdXJyZW50X2xpbmsuc3BlZWQ7CisJCWJhc2UtPmR1cGxleCA9IGN1cnJlbnRfbGluay5kdXBsZXg7CiAJfSBlbHNlIHsKLQkJY21kLT5kdXBsZXggPSBEVVBMRVhfVU5LTk9XTjsKLQkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgU1BFRURfVU5LTk9XTik7CisJCWJhc2UtPnNwZWVkID0gU1BFRURfVU5LTk9XTjsKKwkJYmFzZS0+ZHVwbGV4ID0gRFVQTEVYX1VOS05PV047CiAJfQotCWNtZC0+cG9ydCA9IGN1cnJlbnRfbGluay5wb3J0OwotCWNtZC0+YXV0b25lZyA9IChjdXJyZW50X2xpbmsuYXV0b25lZykgPyBBVVRPTkVHX0VOQUJMRSA6Ci0JCQkJCQlBVVRPTkVHX0RJU0FCTEU7Ci0JY21kLT5scF9hZHZlcnRpc2luZyA9IGN1cnJlbnRfbGluay5scF9jYXBzOworCWJhc2UtPnBvcnQgPSBjdXJyZW50X2xpbmsucG9ydDsKKwliYXNlLT5hdXRvbmVnID0gKGN1cnJlbnRfbGluay5hdXRvbmVnKSA/IEFVVE9ORUdfRU5BQkxFIDoKKwkJCUFVVE9ORUdfRElTQUJMRTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHFlZGVfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIGludCBxZWRlX3NldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CisJY29uc3Qgc3RydWN0IGV0aHRvb2xfbGlua19zZXR0aW5ncyAqYmFzZSA9ICZjbWQtPmJhc2U7CiAJc3RydWN0IHFlZGVfZGV2ICplZGV2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgcWVkX2xpbmtfb3V0cHV0IGN1cnJlbnRfbGluazsKIAlzdHJ1Y3QgcWVkX2xpbmtfcGFyYW1zIHBhcmFtczsKLQl1MzIgc3BlZWQ7CiAKIAlpZiAoIWVkZXYtPm9wcyB8fCAhZWRldi0+b3BzLT5jb21tb24tPmNhbl9saW5rX2NoYW5nZShlZGV2LT5jZGV2KSkgewotCQlEUF9JTkZPKGVkZXYsCi0JCQkiTGluayBzZXR0aW5ncyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgY2hhbmdlZFxuIik7CisJCURQX0lORk8oZWRldiwgIkxpbmsgc2V0dGluZ3MgYXJlIG5vdCBhbGxvd2VkIHRvIGJlIGNoYW5nZWRcbiIpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQotCiAJbWVtc2V0KCZjdXJyZW50X2xpbmssIDAsIHNpemVvZihjdXJyZW50X2xpbmspKTsKIAltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOwogCWVkZXYtPm9wcy0+Y29tbW9uLT5nZXRfbGluayhlZGV2LT5jZGV2LCAmY3VycmVudF9saW5rKTsKIAotCXNwZWVkID0gZXRodG9vbF9jbWRfc3BlZWQoY21kKTsKIAlwYXJhbXMub3ZlcnJpZGVfZmxhZ3MgfD0gUUVEX0xJTktfT1ZFUlJJREVfU1BFRURfQURWX1NQRUVEUzsKIAlwYXJhbXMub3ZlcnJpZGVfZmxhZ3MgfD0gUUVEX0xJTktfT1ZFUlJJREVfU1BFRURfQVVUT05FRzsKLQlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJaWYgKGJhc2UtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKIAkJcGFyYW1zLmF1dG9uZWcgPSB0cnVlOwogCQlwYXJhbXMuZm9yY2VkX3NwZWVkID0gMDsKLQkJcGFyYW1zLmFkdl9zcGVlZHMgPSBjbWQtPmFkdmVydGlzaW5nOwotCX0gZWxzZSB7IC8qIGZvcmNlZCBzcGVlZCAqLworCQlRRURFX0VUSFRPT0xfVE9fRFJWX0NBUFMocGFyYW1zLmFkdl9zcGVlZHMsIGNtZCwgYWR2ZXJ0aXNpbmcpCisJfSBlbHNlIHsJCS8qIGZvcmNlZCBzcGVlZCAqLwogCQlwYXJhbXMub3ZlcnJpZGVfZmxhZ3MgfD0gUUVEX0xJTktfT1ZFUlJJREVfU1BFRURfRk9SQ0VEX1NQRUVEOwogCQlwYXJhbXMuYXV0b25lZyA9IGZhbHNlOwotCQlwYXJhbXMuZm9yY2VkX3NwZWVkID0gc3BlZWQ7Ci0JCXN3aXRjaCAoc3BlZWQpIHsKKwkJcGFyYW1zLmZvcmNlZF9zcGVlZCA9IGJhc2UtPnNwZWVkOworCQlzd2l0Y2ggKGJhc2UtPnNwZWVkKSB7CiAJCWNhc2UgU1BFRURfMTAwMDA6CiAJCQlpZiAoIShjdXJyZW50X2xpbmsuc3VwcG9ydGVkX2NhcHMgJgotCQkJICAgIFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsKSkgeworCQkJICAgICAgUUVEX0xNXzEwMDAwYmFzZUtSX0Z1bGxfQklUKSkgewogCQkJCURQX0lORk8oZWRldiwgIjEwRyBzcGVlZCBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KLQkJCXBhcmFtcy5hZHZfc3BlZWRzID0gU1VQUE9SVEVEXzEwMDAwYmFzZUtSX0Z1bGw7CisJCQlwYXJhbXMuYWR2X3NwZWVkcyA9IFFFRF9MTV8xMDAwMGJhc2VLUl9GdWxsX0JJVDsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzI1MDAwOgorCQkJaWYgKCEoY3VycmVudF9saW5rLnN1cHBvcnRlZF9jYXBzICYKKwkJCSAgICAgIFFFRF9MTV8yNTAwMGJhc2VLUl9GdWxsX0JJVCkpIHsKKwkJCQlEUF9JTkZPKGVkZXYsICIyNUcgc3BlZWQgbm90IHN1cHBvcnRlZFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlwYXJhbXMuYWR2X3NwZWVkcyA9IFFFRF9MTV8yNTAwMGJhc2VLUl9GdWxsX0JJVDsKIAkJCWJyZWFrOwogCQljYXNlIFNQRUVEXzQwMDAwOgogCQkJaWYgKCEoY3VycmVudF9saW5rLnN1cHBvcnRlZF9jYXBzICYKLQkJCSAgICBTVVBQT1JURURfNDAwMDBiYXNlTFI0X0Z1bGwpKSB7CisJCQkgICAgICBRRURfTE1fNDAwMDBiYXNlTFI0X0Z1bGxfQklUKSkgewogCQkJCURQX0lORk8oZWRldiwgIjQwRyBzcGVlZCBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KLQkJCXBhcmFtcy5hZHZfc3BlZWRzID0gU1VQUE9SVEVEXzQwMDAwYmFzZUxSNF9GdWxsOworCQkJcGFyYW1zLmFkdl9zcGVlZHMgPSBRRURfTE1fNDAwMDBiYXNlTFI0X0Z1bGxfQklUOworCQkJYnJlYWs7CisJCWNhc2UgU1BFRURfNTAwMDA6CisJCQlpZiAoIShjdXJyZW50X2xpbmsuc3VwcG9ydGVkX2NhcHMgJgorCQkJICAgICAgUUVEX0xNXzUwMDAwYmFzZUtSMl9GdWxsX0JJVCkpIHsKKwkJCQlEUF9JTkZPKGVkZXYsICI1MEcgc3BlZWQgbm90IHN1cHBvcnRlZFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlwYXJhbXMuYWR2X3NwZWVkcyA9IFFFRF9MTV81MDAwMGJhc2VLUjJfRnVsbF9CSVQ7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8xMDAwMDA6CisJCQlpZiAoIShjdXJyZW50X2xpbmsuc3VwcG9ydGVkX2NhcHMgJgorCQkJICAgICAgUUVEX0xNXzEwMDAwMGJhc2VLUjRfRnVsbF9CSVQpKSB7CisJCQkJRFBfSU5GTyhlZGV2LCAiMTAwRyBzcGVlZCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXBhcmFtcy5hZHZfc3BlZWRzID0gUUVEX0xNXzEwMDAwMGJhc2VLUjRfRnVsbF9CSVQ7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCURQX0lORk8oZWRldiwgIlVuc3VwcG9ydGVkIHNwZWVkICV1XG4iLCBzcGVlZCk7CisJCQlEUF9JTkZPKGVkZXYsICJVbnN1cHBvcnRlZCBzcGVlZCAldVxuIiwgYmFzZS0+c3BlZWQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0zNjgsOCArNDg1LDcgQEAKIHsKIAlzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAotCXJldHVybiAoKHUzMillZGV2LT5kcF9sZXZlbCA8PCBRRURfTE9HX0xFVkVMX1NISUZUKSB8Ci0JICAgICAgIGVkZXYtPmRwX21vZHVsZTsKKwlyZXR1cm4gKCh1MzIpZWRldi0+ZHBfbGV2ZWwgPDwgUUVEX0xPR19MRVZFTF9TSElGVCkgfCBlZGV2LT5kcF9tb2R1bGU7CiB9CiAKIHN0YXRpYyB2b2lkIHFlZGVfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB1MzIgbGV2ZWwpCkBAIC0zOTMsOCArNTA5LDcgQEAKIAlzdHJ1Y3QgcWVkX2xpbmtfcGFyYW1zIGxpbmtfcGFyYW1zOwogCiAJaWYgKCFlZGV2LT5vcHMgfHwgIWVkZXYtPm9wcy0+Y29tbW9uLT5jYW5fbGlua19jaGFuZ2UoZWRldi0+Y2RldikpIHsKLQkJRFBfSU5GTyhlZGV2LAotCQkJIkxpbmsgc2V0dGluZ3MgYXJlIG5vdCBhbGxvd2VkIHRvIGJlIGNoYW5nZWRcbiIpOworCQlEUF9JTkZPKGVkZXYsICJMaW5rIHNldHRpbmdzIGFyZSBub3QgYWxsb3dlZCB0byBiZSBjaGFuZ2VkXG4iKTsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIApAQCAtNDY3LDcgKzU4Miw3IEBACiAKIAlyeGMgPSAodTE2KWNvYWwtPnJ4X2NvYWxlc2NlX3VzZWNzOwogCXR4YyA9ICh1MTYpY29hbC0+dHhfY29hbGVzY2VfdXNlY3M7Ci0JZm9yX2VhY2hfcnNzKGkpIHsKKwlmb3JfZWFjaF9xdWV1ZShpKSB7CiAJCXNiX2lkID0gZWRldi0+ZnBfYXJyYXlbaV0uc2JfaW5mby0+aWd1X3NiX2lkOwogCQlyYyA9IGVkZXYtPm9wcy0+Y29tbW9uLT5zZXRfY29hbGVzY2UoZWRldi0+Y2RldiwgcnhjLCB0eGMsCiAJCQkJCQkgICAgICh1OClpLCBzYl9pZCk7CkBAIC01NjMsNyArNjc4LDcgQEAKIAltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOwogCXBhcmFtcy5vdmVycmlkZV9mbGFncyB8PSBRRURfTElOS19PVkVSUklERV9QQVVTRV9DT05GSUc7CiAJaWYgKGVwYXVzZS0+YXV0b25lZykgewotCQlpZiAoIShjdXJyZW50X2xpbmsuc3VwcG9ydGVkX2NhcHMgJiBTVVBQT1JURURfQXV0b25lZykpIHsKKwkJaWYgKCEoY3VycmVudF9saW5rLnN1cHBvcnRlZF9jYXBzICYgUUVEX0xNX0F1dG9uZWdfQklUKSkgewogCQkJRFBfSU5GTyhlZGV2LCAiYXV0b25lZyBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC01ODAsNiArNjk1LDI4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHFlZGVfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkgIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsIHZvaWQgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCXJlZ3MtPnZlcnNpb24gPSAwOworCW1lbXNldChidWZmZXIsIDAsIHJlZ3MtPmxlbik7CisKKwlpZiAoZWRldi0+b3BzICYmIGVkZXYtPm9wcy0+Y29tbW9uKQorCQllZGV2LT5vcHMtPmNvbW1vbi0+ZGJnX2FsbF9kYXRhKGVkZXYtPmNkZXYsIGJ1ZmZlcik7Cit9CisKK3N0YXRpYyBpbnQgcWVkZV9nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IHFlZGVfZGV2ICplZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlpZiAoZWRldi0+b3BzICYmIGVkZXYtPm9wcy0+Y29tbW9uKQorCQlyZXR1cm4gZWRldi0+b3BzLT5jb21tb24tPmRiZ19hbGxfZGF0YV9zaXplKGVkZXYtPmNkZXYpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKIHN0YXRpYyB2b2lkIHFlZGVfdXBkYXRlX210dShzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsIHVuaW9uIHFlZGVfcmVsb2FkX2FyZ3MgKmFyZ3MpCiB7CiAJZWRldi0+bmRldi0+bXR1ID0gYXJncy0+bXR1OwpAQCAtNjE5LDQ1ICs3NTYsNzAgQEAKIAlzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJY2hhbm5lbHMtPm1heF9jb21iaW5lZCA9IFFFREVfTUFYX1JTU19DTlQoZWRldik7Ci0JY2hhbm5lbHMtPmNvbWJpbmVkX2NvdW50ID0gUUVERV9SU1NfQ05UKGVkZXYpOworCWNoYW5uZWxzLT5jb21iaW5lZF9jb3VudCA9IFFFREVfUVVFVUVfQ05UKGVkZXYpIC0gZWRldi0+ZnBfbnVtX3R4IC0KKwkJCQkJZWRldi0+ZnBfbnVtX3J4OworCWNoYW5uZWxzLT50eF9jb3VudCA9IGVkZXYtPmZwX251bV90eDsKKwljaGFubmVscy0+cnhfY291bnQgPSBlZGV2LT5mcF9udW1fcng7CiB9CiAKIHN0YXRpYyBpbnQgcWVkZV9zZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICAgc3RydWN0IGV0aHRvb2xfY2hhbm5lbHMgKmNoYW5uZWxzKQogewogCXN0cnVjdCBxZWRlX2RldiAqZWRldiA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIGNvdW50OwogCiAJRFBfVkVSQk9TRShlZGV2LCAoTkVUSUZfTVNHX0lGVVAgfCBORVRJRl9NU0dfSUZET1dOKSwKIAkJICAgInNldC1jaGFubmVscyBjb21tYW5kIHBhcmFtZXRlcnM6IHJ4ID0gJWQsIHR4ID0gJWQsIG90aGVyID0gJWQsIGNvbWJpbmVkID0gJWRcbiIsCiAJCSAgIGNoYW5uZWxzLT5yeF9jb3VudCwgY2hhbm5lbHMtPnR4X2NvdW50LAogCQkgICBjaGFubmVscy0+b3RoZXJfY291bnQsIGNoYW5uZWxzLT5jb21iaW5lZF9jb3VudCk7CiAKLQkvKiBXZSBkb24ndCBzdXBwb3J0IHNlcGFyYXRlIHJ4IC8gdHgsIG5vciBgb3RoZXInIGNoYW5uZWxzLiAqLwotCWlmIChjaGFubmVscy0+cnhfY291bnQgfHwgY2hhbm5lbHMtPnR4X2NvdW50IHx8Ci0JICAgIGNoYW5uZWxzLT5vdGhlcl9jb3VudCB8fCAoY2hhbm5lbHMtPmNvbWJpbmVkX2NvdW50ID09IDApIHx8Ci0JICAgIChjaGFubmVscy0+Y29tYmluZWRfY291bnQgPiBRRURFX01BWF9SU1NfQ05UKGVkZXYpKSkgeworCWNvdW50ID0gY2hhbm5lbHMtPnJ4X2NvdW50ICsgY2hhbm5lbHMtPnR4X2NvdW50ICsKKwkJCWNoYW5uZWxzLT5jb21iaW5lZF9jb3VudDsKKworCS8qIFdlIGRvbid0IHN1cHBvcnQgYG90aGVyJyBjaGFubmVscyAqLworCWlmIChjaGFubmVscy0+b3RoZXJfY291bnQpIHsKIAkJRFBfVkVSQk9TRShlZGV2LCAoTkVUSUZfTVNHX0lGVVAgfCBORVRJRl9NU0dfSUZET1dOKSwKIAkJCSAgICJjb21tYW5kIHBhcmFtZXRlcnMgbm90IHN1cHBvcnRlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmICghKGNoYW5uZWxzLT5jb21iaW5lZF9jb3VudCB8fCAoY2hhbm5lbHMtPnJ4X2NvdW50ICYmCisJCQkJCSAgIGNoYW5uZWxzLT50eF9jb3VudCkpKSB7CisJCURQX1ZFUkJPU0UoZWRldiwgKE5FVElGX01TR19JRlVQIHwgTkVUSUZfTVNHX0lGRE9XTiksCisJCQkgICAibmVlZCB0byByZXF1ZXN0IGF0IGxlYXN0IG9uZSB0cmFuc21pdCBhbmQgb25lIHJlY2VpdmUgY2hhbm5lbFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjb3VudCA+IFFFREVfTUFYX1JTU19DTlQoZWRldikpIHsKKwkJRFBfVkVSQk9TRShlZGV2LCAoTkVUSUZfTVNHX0lGVVAgfCBORVRJRl9NU0dfSUZET1dOKSwKKwkJCSAgICJyZXF1ZXN0ZWQgY2hhbm5lbHMgPSAlZCBtYXggc3VwcG9ydGVkIGNoYW5uZWxzID0gJWRcbiIsCisJCQkgICBjb3VudCwgUUVERV9NQVhfUlNTX0NOVChlZGV2KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCS8qIENoZWNrIGlmIHRoZXJlIHdhcyBhIGNoYW5nZSBpbiB0aGUgYWN0aXZlIHBhcmFtZXRlcnMgKi8KLQlpZiAoY2hhbm5lbHMtPmNvbWJpbmVkX2NvdW50ID09IFFFREVfUlNTX0NOVChlZGV2KSkgeworCWlmICgoY291bnQgPT0gUUVERV9RVUVVRV9DTlQoZWRldikpICYmCisJICAgIChjaGFubmVscy0+dHhfY291bnQgPT0gZWRldi0+ZnBfbnVtX3R4KSAmJgorCSAgICAoY2hhbm5lbHMtPnJ4X2NvdW50ID09IGVkZXYtPmZwX251bV9yeCkpIHsKIAkJRFBfVkVSQk9TRShlZGV2LCAoTkVUSUZfTVNHX0lGVVAgfCBORVRJRl9NU0dfSUZET1dOKSwKIAkJCSAgICJObyBjaGFuZ2UgaW4gYWN0aXZlIHBhcmFtZXRlcnNcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiBXZSBuZWVkIHRoZSBudW1iZXIgb2YgcXVldWVzIHRvIGJlIGRpdmlzaWJsZSBiZXR3ZWVuIHRoZSBod2ZucyAqLwotCWlmIChjaGFubmVscy0+Y29tYmluZWRfY291bnQgJSBlZGV2LT5kZXZfaW5mby5jb21tb24ubnVtX2h3Zm5zKSB7CisJaWYgKChjb3VudCAlIGVkZXYtPmRldl9pbmZvLmNvbW1vbi5udW1faHdmbnMpIHx8CisJICAgIChjaGFubmVscy0+dHhfY291bnQgJSBlZGV2LT5kZXZfaW5mby5jb21tb24ubnVtX2h3Zm5zKSB8fAorCSAgICAoY2hhbm5lbHMtPnJ4X2NvdW50ICUgZWRldi0+ZGV2X2luZm8uY29tbW9uLm51bV9od2ZucykpIHsKIAkJRFBfVkVSQk9TRShlZGV2LCAoTkVUSUZfTVNHX0lGVVAgfCBORVRJRl9NU0dfSUZET1dOKSwKLQkJCSAgICJOdW1iZXIgb2YgY2hhbm5lbHMgbXVzdCBiZSBkaXZpc2FibGUgYnkgJTA0eFxuIiwKKwkJCSAgICJOdW1iZXIgb2YgY2hhbm5lbHMgbXVzdCBiZSBkaXZpc2libGUgYnkgJTA0eFxuIiwKIAkJCSAgIGVkZXYtPmRldl9pbmZvLmNvbW1vbi5udW1faHdmbnMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBTZXQgbnVtYmVyIG9mIHF1ZXVlcyBhbmQgcmVsb2FkIGlmIG5lY2Vzc2FyeSAqLwotCWVkZXYtPnJlcV9yc3MgPSBjaGFubmVscy0+Y29tYmluZWRfY291bnQ7CisJZWRldi0+cmVxX3F1ZXVlcyA9IGNvdW50OworCWVkZXYtPnJlcV9udW1fdHggPSBjaGFubmVscy0+dHhfY291bnQ7CisJZWRldi0+cmVxX251bV9yeCA9IGNoYW5uZWxzLT5yeF9jb3VudDsKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKQogCQlxZWRlX3JlbG9hZChlZGV2LCBOVUxMLCBOVUxMKTsKIApAQCAtNzI3LDcgKzg4OSw3IEBACiAKIAlzd2l0Y2ggKGluZm8tPmNtZCkgewogCWNhc2UgRVRIVE9PTF9HUlhSSU5HUzoKLQkJaW5mby0+ZGF0YSA9IGVkZXYtPm51bV9yc3M7CisJCWluZm8tPmRhdGEgPSBRRURFX1JTU19DT1VOVChlZGV2KTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBFVEhUT09MX0dSWEZIOgogCQlyZXR1cm4gcWVkZV9nZXRfcnNzX2ZsYWdzKGVkZXYsIGluZm8pOwpAQCAtOTMwLDcgKzEwOTIsNyBAQAogCWlmICghbmV0aWZfcnVubmluZyhlZGV2LT5uZGV2KSkKIAkJcmV0dXJuOwogCi0JZm9yX2VhY2hfcnNzKGkpIHsKKwlmb3JfZWFjaF9xdWV1ZShpKSB7CiAJCS8qIFVwZGF0ZSBhbmQgcmVlbmFibGUgaW50ZXJydXB0cyAqLwogCQlxZWRfc2JfYWNrKGVkZXYtPmZwX2FycmF5W2ldLnNiX2luZm8sIElHVV9JTlRfRU5BQkxFLCAxKTsKIAkJbmFwaV9lbmFibGUoJmVkZXYtPmZwX2FycmF5W2ldLm5hcGkpOwpAQCAtOTQyLDcgKzExMDQsNyBAQAogewogCWludCBpOwogCi0JZm9yX2VhY2hfcnNzKGkpIHsKKwlmb3JfZWFjaF9xdWV1ZShpKSB7CiAJCW5hcGlfZGlzYWJsZSgmZWRldi0+ZnBfYXJyYXlbaV0ubmFwaSk7CiAJCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLwogCQlxZWRfc2JfYWNrKGVkZXYtPmZwX2FycmF5W2ldLnNiX2luZm8sIElHVV9JTlRfRElTQUJMRSwgMCk7CkBAIC05NTIsMTEgKzExMTQsMjMgQEAKIHN0YXRpYyBpbnQgcWVkZV9zZWxmdGVzdF90cmFuc21pdF90cmFmZmljKHN0cnVjdCBxZWRlX2RldiAqZWRldiwKIAkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBxZWRlX3R4X3F1ZXVlICp0eHEgPSAmZWRldi0+ZnBfYXJyYXlbMF0udHhxc1swXTsKKwlzdHJ1Y3QgcWVkZV90eF9xdWV1ZSAqdHhxID0gTlVMTDsKIAlzdHJ1Y3QgZXRoX3R4XzFzdF9iZCAqZmlyc3RfYmQ7CiAJZG1hX2FkZHJfdCBtYXBwaW5nOwogCWludCBpLCBpZHgsIHZhbDsKIAorCWZvcl9lYWNoX3F1ZXVlKGkpIHsKKwkJaWYgKGVkZXYtPmZwX2FycmF5W2ldLnR5cGUgJiBRRURFX0ZBU1RQQVRIX1RYKSB7CisJCQl0eHEgPSBlZGV2LT5mcF9hcnJheVtpXS50eHFzOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIXR4cSkgeworCQlEUF9OT1RJQ0UoZWRldiwgIlR4IHBhdGggaXMgbm90IGF2YWlsYWJsZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKIAkvKiBGaWxsIHRoZSBlbnRyeSBpbiB0aGUgU1cgcmluZyBhbmQgdGhlIEJEcyBpbiB0aGUgRlcgcmluZyAqLwogCWlkeCA9IHR4cS0+c3dfdHhfcHJvZCAmIE5VTV9UWF9CRFNfTUFYOwogCXR4cS0+c3dfdHhfcmluZ1tpZHhdLnNrYiA9IHNrYjsKQEAgLTEwMjAsMTQgKzExOTQsMjYgQEAKIAogc3RhdGljIGludCBxZWRlX3NlbGZ0ZXN0X3JlY2VpdmVfdHJhZmZpYyhzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYpCiB7Ci0Jc3RydWN0IHFlZGVfcnhfcXVldWUgKnJ4cSA9IGVkZXYtPmZwX2FycmF5WzBdLnJ4cTsKIAl1MTYgaHdfY29tcF9jb25zLCBzd19jb21wX2NvbnMsIHN3X3J4X2luZGV4LCBsZW47CiAJc3RydWN0IGV0aF9mYXN0X3BhdGhfcnhfcmVnX2NxZSAqZnBfY3FlOworCXN0cnVjdCBxZWRlX3J4X3F1ZXVlICpyeHEgPSBOVUxMOwogCXN0cnVjdCBzd19yeF9kYXRhICpzd19yeF9kYXRhOwogCXVuaW9uIGV0aF9yeF9jcWUgKmNxZTsKIAl1OCAqZGF0YV9wdHI7CiAJaW50IGk7CiAKKwlmb3JfZWFjaF9xdWV1ZShpKSB7CisJCWlmIChlZGV2LT5mcF9hcnJheVtpXS50eXBlICYgUUVERV9GQVNUUEFUSF9SWCkgeworCQkJcnhxID0gZWRldi0+ZnBfYXJyYXlbaV0ucnhxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIXJ4cSkgeworCQlEUF9OT1RJQ0UoZWRldiwgIlJ4IHBhdGggaXMgbm90IGF2YWlsYWJsZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKIAkvKiBUaGUgcGFja2V0IGlzIGV4cGVjdGVkIHRvIHJlY2VpdmUgb24gcngtcXVldWUgMCBldmVuIHRob3VnaCBSU1MgaXMKIAkgKiBlbmFibGVkLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHF1ZXVlIDAgaXMgY29uZmlndXJlZCBhcyB0aGUgZGVmYXVsdAogCSAqIHF1ZXVlIGFuZCB0aGF0IHRoZSBsb29wYmFjayB0cmFmZmljIGlzIG5vdCBJUC4KQEAgLTEyMjgsOSArMTQxNCwxMSBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHFlZGVfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9zZXR0aW5ncyA9IHFlZGVfZ2V0X3NldHRpbmdzLAotCS5zZXRfc2V0dGluZ3MgPSBxZWRlX3NldF9zZXR0aW5ncywKKwkuZ2V0X2xpbmtfa3NldHRpbmdzID0gcWVkZV9nZXRfbGlua19rc2V0dGluZ3MsCisJLnNldF9saW5rX2tzZXR0aW5ncyA9IHFlZGVfc2V0X2xpbmtfa3NldHRpbmdzLAogCS5nZXRfZHJ2aW5mbyA9IHFlZGVfZ2V0X2RydmluZm8sCisJLmdldF9yZWdzX2xlbiA9IHFlZGVfZ2V0X3JlZ3NfbGVuLAorCS5nZXRfcmVncyA9IHFlZGVfZ2V0X3JlZ3MsCiAJLmdldF9tc2dsZXZlbCA9IHFlZGVfZ2V0X21zZ2xldmVsLAogCS5zZXRfbXNnbGV2ZWwgPSBxZWRlX3NldF9tc2dsZXZlbCwKIAkubndheV9yZXNldCA9IHFlZGVfbndheV9yZXNldCwKQEAgLTEyNjAsNyArMTQ0OCw3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHFlZGVfdmZfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9zZXR0aW5ncyA9IHFlZGVfZ2V0X3NldHRpbmdzLAorCS5nZXRfbGlua19rc2V0dGluZ3MgPSBxZWRlX2dldF9saW5rX2tzZXR0aW5ncywKIAkuZ2V0X2RydmluZm8gPSBxZWRlX2dldF9kcnZpbmZvLAogCS5nZXRfbXNnbGV2ZWwgPSBxZWRlX2dldF9tc2dsZXZlbCwKIAkuc2V0X21zZ2xldmVsID0gcWVkZV9zZXRfbXNnbGV2ZWwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkZS9xZWRlX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWRlL3FlZGVfbWFpbi5jCmluZGV4IGU0YmQwMmUuLjM0MzAzOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWRlL3FlZGVfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWRlL3FlZGVfbWFpbi5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotCisjaW5jbHVkZSA8bGludXgvcWVkL3FlZGVfcm9jZS5oPgogI2luY2x1ZGUgInFlZGUuaCIKIAogc3RhdGljIGNoYXIgdmVyc2lvbltdID0KQEAgLTEwMCw3ICsxMDAsOCBAQAogc3RhdGljIHZvaWQgcWVkZV9saW5rX3VwZGF0ZSh2b2lkICpkZXYsIHN0cnVjdCBxZWRfbGlua19vdXRwdXQgKmxpbmspOwogCiAjaWZkZWYgQ09ORklHX1FFRF9TUklPVgotc3RhdGljIGludCBxZWRlX3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MpCitzdGF0aWMgaW50IHFlZGVfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcywKKwkJCSAgICBfX2JlMTYgdmxhbl9wcm90bykKIHsKIAlzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIApAQCAtMTA5LDYgKzExMCw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmICh2bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFRKSkKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisKIAlEUF9WRVJCT1NFKGVkZXYsIFFFRF9NU0dfSU9WLCAiU2V0dGluZyBWbGFuIDB4JTA0eCB0byBWRiBbJWRdXG4iLAogCQkgICB2bGFuLCB2Zik7CiAKQEAgLTE4OSw4ICsxOTMsNyBAQAogCXN0cnVjdCBldGh0b29sX2RydmluZm8gZHJ2aW5mbzsKIAlzdHJ1Y3QgcWVkZV9kZXYgKmVkZXY7CiAKLQkvKiBDdXJyZW50bHkgb25seSBzdXBwb3J0IG5hbWUgY2hhbmdlICovCi0JaWYgKGV2ZW50ICE9IE5FVERFVl9DSEFOR0VOQU1FKQorCWlmIChldmVudCAhPSBORVRERVZfQ0hBTkdFTkFNRSAmJiBldmVudCAhPSBORVRERVZfQ0hBTkdFQUREUikKIAkJZ290byBkb25lOwogCiAJLyogQ2hlY2sgd2hldGhlciB0aGlzIGlzIGEgcWVkZSBkZXZpY2UgKi8KQEAgLTIwMywxMSArMjA2LDE4IEBACiAJCWdvdG8gZG9uZTsKIAllZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAKLQkvKiBOb3RpZnkgcWVkIG9mIHRoZSBuYW1lIGNoYW5nZSAqLwotCWlmICghZWRldi0+b3BzIHx8ICFlZGV2LT5vcHMtPmNvbW1vbikKLQkJZ290byBkb25lOwotCWVkZXYtPm9wcy0+Y29tbW9uLT5zZXRfaWQoZWRldi0+Y2RldiwgZWRldi0+bmRldi0+bmFtZSwKLQkJCQkgICJxZWRlIik7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX0NIQU5HRU5BTUU6CisJCS8qIE5vdGlmeSBxZWQgb2YgdGhlIG5hbWUgY2hhbmdlICovCisJCWlmICghZWRldi0+b3BzIHx8ICFlZGV2LT5vcHMtPmNvbW1vbikKKwkJCWdvdG8gZG9uZTsKKwkJZWRldi0+b3BzLT5jb21tb24tPnNldF9pZChlZGV2LT5jZGV2LCBlZGV2LT5uZGV2LT5uYW1lLCAicWVkZSIpOworCQlicmVhazsKKwljYXNlIE5FVERFVl9DSEFOR0VBRERSOgorCQllZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJCXFlZGVfcm9jZV9ldmVudF9jaGFuZ2VhZGRyKGVkZXYpOworCQlicmVhazsKKwl9CiAKIGRvbmU6CiAJcmV0dXJuIE5PVElGWV9ET05FOwpAQCAtMjIyLDcgKzIzMiw3IEBACiB7CiAJaW50IHJldDsKIAotCXByX25vdGljZSgicWVkZV9pbml0OiAlc1xuIiwgdmVyc2lvbik7CisJcHJfaW5mbygicWVkZV9pbml0OiAlc1xuIiwgdmVyc2lvbik7CiAKIAlxZWRfb3BzID0gcWVkX2dldF9ldGhfb3BzKCk7CiAJaWYgKCFxZWRfb3BzKSB7CkBAIC0yNTMsNyArMjYzLDggQEAKIAogc3RhdGljIHZvaWQgX19leGl0IHFlZGVfY2xlYW51cCh2b2lkKQogewotCXByX25vdGljZSgicWVkZV9jbGVhbnVwIGNhbGxlZFxuIik7CisJaWYgKGRlYnVnICYgUUVEX0xPR19JTkZPX01BU0spCisJCXByX2luZm8oInFlZGVfY2xlYW51cCBjYWxsZWRcbiIpOwogCiAJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnFlZGVfbmV0ZGV2X25vdGlmaWVyKTsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnFlZGVfcGNpX2RyaXZlcik7CkBAIC0yNzAsOCArMjgxLDcgQEAKIAogLyogVW5tYXAgdGhlIGRhdGEgYW5kIGZyZWUgc2tiICovCiBzdGF0aWMgaW50IHFlZGVfZnJlZV90eF9wa3Qoc3RydWN0IHFlZGVfZGV2ICplZGV2LAotCQkJICAgIHN0cnVjdCBxZWRlX3R4X3F1ZXVlICp0eHEsCi0JCQkgICAgaW50ICpsZW4pCisJCQkgICAgc3RydWN0IHFlZGVfdHhfcXVldWUgKnR4cSwgaW50ICpsZW4pCiB7CiAJdTE2IGlkeCA9IHR4cS0+c3dfdHhfY29ucyAmIE5VTV9UWF9CRFNfTUFYOwogCXN0cnVjdCBza19idWZmICpza2IgPSB0eHEtPnN3X3R4X3JpbmdbaWR4XS5za2I7CkBAIC0zMjksOCArMzM5LDcgQEAKIHN0YXRpYyB2b2lkIHFlZGVfZnJlZV9mYWlsZWRfdHhfcGt0KHN0cnVjdCBxZWRlX2RldiAqZWRldiwKIAkJCQkgICAgc3RydWN0IHFlZGVfdHhfcXVldWUgKnR4cSwKIAkJCQkgICAgc3RydWN0IGV0aF90eF8xc3RfYmQgKmZpcnN0X2JkLAotCQkJCSAgICBpbnQgbmJkLAotCQkJCSAgICBib29sIGRhdGFfc3BsaXQpCisJCQkJICAgIGludCBuYmQsIGJvb2wgZGF0YV9zcGxpdCkKIHsKIAl1MTYgaWR4ID0gdHhxLT5zd190eF9wcm9kICYgTlVNX1RYX0JEU19NQVg7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4cS0+c3dfdHhfcmluZ1tpZHhdLnNrYjsKQEAgLTMzOSw4ICszNDgsNyBAQAogCiAJLyogUmV0dXJuIHByb2QgdG8gaXRzIHBvc2l0aW9uIGJlZm9yZSB0aGlzIHNrYiB3YXMgaGFuZGxlZCAqLwogCXFlZF9jaGFpbl9zZXRfcHJvZCgmdHhxLT50eF9wYmwsCi0JCQkgICBsZTE2X3RvX2NwdSh0eHEtPnR4X2RiLmRhdGEuYmRfcHJvZCksCi0JCQkgICBmaXJzdF9iZCk7CisJCQkgICBsZTE2X3RvX2NwdSh0eHEtPnR4X2RiLmRhdGEuYmRfcHJvZCksIGZpcnN0X2JkKTsKIAogCWZpcnN0X2JkID0gKHN0cnVjdCBldGhfdHhfMXN0X2JkICopcWVkX2NoYWluX3Byb2R1Y2UoJnR4cS0+dHhfcGJsKTsKIApAQCAtMzY2LDggKzM3NCw3IEBACiAKIAkvKiBSZXR1cm4gYWdhaW4gcHJvZCB0byBpdHMgcG9zaXRpb24gYmVmb3JlIHRoaXMgc2tiIHdhcyBoYW5kbGVkICovCiAJcWVkX2NoYWluX3NldF9wcm9kKCZ0eHEtPnR4X3BibCwKLQkJCSAgIGxlMTZfdG9fY3B1KHR4cS0+dHhfZGIuZGF0YS5iZF9wcm9kKSwKLQkJCSAgIGZpcnN0X2JkKTsKKwkJCSAgIGxlMTZfdG9fY3B1KHR4cS0+dHhfZGIuZGF0YS5iZF9wcm9kKSwgZmlyc3RfYmQpOwogCiAJLyogRnJlZSBza2IgKi8KIAlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwpAQCAtMzc2LDggKzM4Myw3IEBACiB9CiAKIHN0YXRpYyB1MzIgcWVkZV94bWl0X3R5cGUoc3RydWN0IHFlZGVfZGV2ICplZGV2LAotCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICBpbnQgKmlwdjZfZXh0KQorCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKmlwdjZfZXh0KQogewogCXUzMiByYyA9IFhNSVRfTDRfQ1NVTTsKIAlfX2JlMTYgbDNfcHJvdG87CkBAIC00MzQsMTUgKzQ0MCwxMyBAQAogfQogCiBzdGF0aWMgaW50IG1hcF9mcmFnX3RvX2JkKHN0cnVjdCBxZWRlX2RldiAqZWRldiwKLQkJCSAgc2tiX2ZyYWdfdCAqZnJhZywKLQkJCSAgc3RydWN0IGV0aF90eF9iZCAqYmQpCisJCQkgIHNrYl9mcmFnX3QgKmZyYWcsIHN0cnVjdCBldGhfdHhfYmQgKmJkKQogewogCWRtYV9hZGRyX3QgbWFwcGluZzsKIAogCS8qIE1hcCBza2Igbm9uLWxpbmVhciBmcmFnIGRhdGEgZm9yIERNQSAqLwogCW1hcHBpbmcgPSBza2JfZnJhZ19kbWFfbWFwKCZlZGV2LT5wZGV2LT5kZXYsIGZyYWcsIDAsCi0JCQkJICAgc2tiX2ZyYWdfc2l6ZShmcmFnKSwKLQkJCQkgICBETUFfVE9fREVWSUNFKTsKKwkJCQkgICBza2JfZnJhZ19zaXplKGZyYWcpLCBETUFfVE9fREVWSUNFKTsKIAlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IoJmVkZXYtPnBkZXYtPmRldiwgbWFwcGluZykpKSB7CiAJCURQX05PVElDRShlZGV2LCAiVW5hYmxlIHRvIG1hcCBmcmFnIC0gZHJvcHBpbmcgcGFja2V0XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01MDQsOSArNTA4LDggQEAKIH0KIAogLyogTWFpbiB0cmFuc21pdCBmdW5jdGlvbiAqLwotc3RhdGljCi1uZXRkZXZfdHhfdCBxZWRlX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3N0YXRpYyBuZXRkZXZfdHhfdCBxZWRlX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpuZXRkZXZfdHhxOwpAQCAtNTI2LDEyICs1MjksMTEgQEAKIAogCS8qIEdldCB0eC1xdWV1ZSBjb250ZXh0IGFuZCBuZXRkZXYgaW5kZXggKi8KIAl0eHFfaW5kZXggPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKLQlXQVJOX09OKHR4cV9pbmRleCA+PSBRRURFX1RTU19DTlQoZWRldikpOworCVdBUk5fT04odHhxX2luZGV4ID49IFFFREVfVFNTX0NPVU5UKGVkZXYpKTsKIAl0eHEgPSBRRURFX1RYX1FVRVVFKGVkZXYsIHR4cV9pbmRleCk7CiAJbmV0ZGV2X3R4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUobmRldiwgdHhxX2luZGV4KTsKIAotCVdBUk5fT04ocWVkX2NoYWluX2dldF9lbGVtX2xlZnQoJnR4cS0+dHhfcGJsKSA8Ci0JCQkgICAgICAgKE1BWF9TS0JfRlJBR1MgKyAxKSk7CisJV0FSTl9PTihxZWRfY2hhaW5fZ2V0X2VsZW1fbGVmdCgmdHhxLT50eF9wYmwpIDwgKE1BWF9TS0JfRlJBR1MgKyAxKSk7CiAKIAl4bWl0X3R5cGUgPSBxZWRlX3htaXRfdHlwZShlZGV2LCBza2IsICZpcHY2X2V4dCk7CiAKQEAgLTYwNiw2ICs2MDgsMTQgQEAKIAkJCSAgICAxIDw8IEVUSF9UWF9EQVRBXzFTVF9CRF9UVU5OX0ZMQUdfU0hJRlQ7CiAJCX0KIAorCQkvKiBMZWdhY3kgRlcgaGFkIGZsaXBwZWQgYmVoYXZpb3IgaW4gcmVnYXJkIHRvIHRoaXMgYml0IC0KKwkJICogSS5lLiwgbmVlZGVkIHRvIHNldCB0byBwcmV2ZW50IEZXIGZyb20gdG91Y2hpbmcgZW5jYXBzdWxhdGVkCisJCSAqIHBhY2tldHMgd2hlbiBpdCBkaWRuJ3QgbmVlZCB0by4KKwkJICovCisJCWlmICh1bmxpa2VseSh0eHEtPmlzX2xlZ2FjeSkpCisJCQlmaXJzdF9iZC0+ZGF0YS5iaXRmaWVsZHMgXj0KKwkJCSAgICAxIDw8IEVUSF9UWF9EQVRBXzFTVF9CRF9UVU5OX0ZMQUdfU0hJRlQ7CisKIAkJLyogSWYgdGhlIHBhY2tldCBpcyBJUHY2IHdpdGggZXh0ZW5zaW9uIGhlYWRlciwgaW5kaWNhdGUgdGhhdAogCQkgKiB0byBGVyBhbmQgcGFzcyBmZXcgcGFyYW1zLCBzaW5jZSB0aGUgZGV2aWNlIGNyYWNrZXIgZG9lc24ndAogCQkgKiBzdXBwb3J0IHBhcnNpbmcgSVB2NiB3aXRoIGV4dGVuc2lvbiBoZWFkZXIvcy4KQEAgLTcyMiwxMiArNzMyLDE2IEBACiAJdHhxLT50eF9kYi5kYXRhLmJkX3Byb2QgPQogCQljcHVfdG9fbGUxNihxZWRfY2hhaW5fZ2V0X3Byb2RfaWR4KCZ0eHEtPnR4X3BibCkpOwogCi0JaWYgKCFza2ItPnhtaXRfbW9yZSB8fCBuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKG5ldGRldl90eHEpKQorCWlmICghc2tiLT54bWl0X21vcmUgfHwgbmV0aWZfeG1pdF9zdG9wcGVkKG5ldGRldl90eHEpKQogCQlxZWRlX3VwZGF0ZV90eF9wcm9kdWNlcih0eHEpOwogCiAJaWYgKHVubGlrZWx5KHFlZF9jaGFpbl9nZXRfZWxlbV9sZWZ0KCZ0eHEtPnR4X3BibCkKIAkJICAgICAgPCAoTUFYX1NLQl9GUkFHUyArIDEpKSkgeworCQlpZiAoc2tiLT54bWl0X21vcmUpCisJCQlxZWRlX3VwZGF0ZV90eF9wcm9kdWNlcih0eHEpOworCiAJCW5ldGlmX3R4X3N0b3BfcXVldWUobmV0ZGV2X3R4cSk7CisJCXR4cS0+c3RvcHBlZF9jbnQrKzsKIAkJRFBfVkVSQk9TRShlZGV2LCBORVRJRl9NU0dfVFhfUVVFVUVELAogCQkJICAgIlN0b3AgcXVldWUgd2FzIGNhbGxlZFxuIik7CiAJCS8qIHBhaXJlZCBtZW1vcnkgYmFycmllciBpcyBpbiBxZWRlX3R4X2ludCgpLCB3ZSBoYXZlIHRvIGtlZXAKQEAgLTc2MSw4ICs3NzUsNyBAQAogCXJldHVybiBod19iZF9jb25zICE9IHFlZF9jaGFpbl9nZXRfY29uc19pZHgoJnR4cS0+dHhfcGJsKTsKIH0KIAotc3RhdGljIGludCBxZWRlX3R4X2ludChzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsCi0JCSAgICAgICBzdHJ1Y3QgcWVkZV90eF9xdWV1ZSAqdHhxKQorc3RhdGljIGludCBxZWRlX3R4X2ludChzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsIHN0cnVjdCBxZWRlX3R4X3F1ZXVlICp0eHEpCiB7CiAJc3RydWN0IG5ldGRldl9xdWV1ZSAqbmV0ZGV2X3R4cTsKIAl1MTYgaHdfYmRfY29uczsKQEAgLTc4OCw2ICs4MDEsNyBAQAogCQlieXRlc19jb21wbCArPSBsZW47CiAJCXBrdHNfY29tcGwrKzsKIAkJdHhxLT5zd190eF9jb25zKys7CisJCXR4cS0+eG1pdF9wa3RzKys7CiAJfQogCiAJbmV0ZGV2X3R4X2NvbXBsZXRlZF9xdWV1ZShuZXRkZXZfdHhxLCBwa3RzX2NvbXBsLCBieXRlc19jb21wbCk7CkBAIC05NjAsOCArOTc0LDcgQEAKIAogc3RhdGljIHUzMiBxZWRlX2dldF9yeGhhc2goc3RydWN0IHFlZGVfZGV2ICplZGV2LAogCQkJICAgdTggYml0ZmllbGRzLAotCQkJICAgX19sZTMyIHJzc19oYXNoLAotCQkJICAgZW51bSBwa3RfaGFzaF90eXBlcyAqcnhoYXNoX3R5cGUpCisJCQkgICBfX2xlMzIgcnNzX2hhc2gsIGVudW0gcGt0X2hhc2hfdHlwZXMgKnJ4aGFzaF90eXBlKQogewogCWVudW0gcnNzX2hhc2hfdHlwZSBodHlwZTsKIApAQCAtOTkwLDEyICsxMDAzLDEwIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBxZWRlX3NrYl9yZWNlaXZlKHN0cnVjdCBxZWRlX2RldiAqZWRldiwKIAkJCQkgICAgc3RydWN0IHFlZGVfZmFzdHBhdGggKmZwLAotCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICB1MTYgdmxhbl90YWcpCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIHUxNiB2bGFuX3RhZykKIHsKIAlpZiAodmxhbl90YWcpCi0JCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCBodG9ucyhFVEhfUF84MDIxUSksCi0JCQkJICAgICAgIHZsYW5fdGFnKTsKKwkJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIGh0b25zKEVUSF9QXzgwMjFRKSwgdmxhbl90YWcpOwogCiAJbmFwaV9ncm9fcmVjZWl2ZSgmZnAtPm5hcGksIHNrYik7CiB9CkBAIC0xMDE4LDggKzEwMjksNyBAQAogCiBzdGF0aWMgaW50IHFlZGVfZmlsbF9mcmFnX3NrYihzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsCiAJCQkgICAgICBzdHJ1Y3QgcWVkZV9yeF9xdWV1ZSAqcnhxLAotCQkJICAgICAgdTggdHBhX2FnZ19pbmRleCwKLQkJCSAgICAgIHUxNiBsZW5fb25fYmQpCisJCQkgICAgICB1OCB0cGFfYWdnX2luZGV4LCB1MTYgbGVuX29uX2JkKQogewogCXN0cnVjdCBzd19yeF9kYXRhICpjdXJyZW50X2JkID0gJnJ4cS0+c3dfcnhfcmluZ1tyeHEtPnN3X3J4X2NvbnMgJgogCQkJCQkJCSBOVU1fUlhfQkRTX01BWF07CkBAIC0xMjA2LDcgKzEyMTYsNyBAQAogI2VuZGlmCiAKIHNlbmRfc2tiOgotCXNrYl9yZWNvcmRfcnhfcXVldWUoc2tiLCBmcC0+cnNzX2lkKTsKKwlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgZnAtPnJ4cS0+cnhxX2lkKTsKIAlxZWRlX3NrYl9yZWNlaXZlKGVkZXYsIGZwLCBza2IsIHZsYW5fdGFnKTsKIH0KIApAQCAtMTQxMCw3ICsxNDIwLDcgQEAKIAogCQlpZiAodW5saWtlbHkoY3FlX3R5cGUgPT0gRVRIX1JYX0NRRV9UWVBFX1NMT1dfUEFUSCkpIHsKIAkJCWVkZXYtPm9wcy0+ZXRoX2NxZV9jb21wbGV0aW9uKAotCQkJCQllZGV2LT5jZGV2LCBmcC0+cnNzX2lkLAorCQkJCQllZGV2LT5jZGV2LCBmcC0+aWQsCiAJCQkJCShzdHJ1Y3QgZXRoX3Nsb3dfcGF0aF9yeF9jcWUgKiljcWUpOwogCQkJZ290byBuZXh0X2NxZTsKIAkJfQpAQCAtMTQ2Nyw3ICsxNDc3LDcgQEAKIAkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihlZGV2LT5uZGV2LCBRRURFX1JYX0hEUl9TSVpFKTsKIAkJaWYgKHVubGlrZWx5KCFza2IpKSB7CiAJCQlEUF9OT1RJQ0UoZWRldiwKLQkJCQkgICJCdWlsZF9za2IgZmFpbGVkLCBkcm9wcGluZyBpbmNvbWluZyBwYWNrZXRcbiIpOworCQkJCSAgInNrYiBhbGxvY2F0aW9uIGZhaWxlZCwgZHJvcHBpbmcgaW5jb21pbmcgcGFja2V0XG4iKTsKIAkJCXFlZGVfcmVjeWNsZV9yeF9iZF9yaW5nKHJ4cSwgZWRldiwgZnBfY3FlLT5iZF9udW0pOwogCQkJcnhxLT5yeF9hbGxvY19lcnJvcnMrKzsKIAkJCWdvdG8gbmV4dF9jcWU7CkBAIC0xNTc1LDE0ICsxNTg1LDEzIEBACiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGVkZXYtPm5kZXYpOwogCiAJCXJ4X2hhc2ggPSBxZWRlX2dldF9yeGhhc2goZWRldiwgZnBfY3FlLT5iaXRmaWVsZHMsCi0JCQkJCSAgZnBfY3FlLT5yc3NfaGFzaCwKLQkJCQkJICAmcnhoYXNoX3R5cGUpOworCQkJCQkgIGZwX2NxZS0+cnNzX2hhc2gsICZyeGhhc2hfdHlwZSk7CiAKIAkJc2tiX3NldF9oYXNoKHNrYiwgcnhfaGFzaCwgcnhoYXNoX3R5cGUpOwogCiAJCXFlZGVfc2V0X3NrYl9jc3VtKHNrYiwgY3N1bV9mbGFnKTsKIAotCQlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgZnAtPnJzc19pZCk7CisJCXNrYl9yZWNvcmRfcnhfcXVldWUoc2tiLCBmcC0+cnhxLT5yeHFfaWQpOwogCiAJCXFlZGVfc2tiX3JlY2VpdmUoZWRldiwgZnAsIHNrYiwgbGUxNl90b19jcHUoZnBfY3FlLT52bGFuX3RhZykpOwogbmV4dF9yeF9vbmx5OgpAQCAtMTYwMSw2ICsxNjEwLDggQEAKIAkvKiBVcGRhdGUgcHJvZHVjZXJzICovCiAJcWVkZV91cGRhdGVfcnhfcHJvZChlZGV2LCByeHEpOwogCisJcnhxLT5yY3ZfcGt0cyArPSByeF9wa3Q7CisKIAlyZXR1cm4gcnhfcGt0OwogfQogCkBAIC0xNjEzLDEwICsxNjI0LDEyIEBACiAJdTggdGM7CiAKIAlmb3IgKHRjID0gMDsgdGMgPCBlZGV2LT5udW1fdGM7IHRjKyspCi0JCWlmIChxZWRlX3R4cV9oYXNfd29yaygmZnAtPnR4cXNbdGNdKSkKKwkJaWYgKGxpa2VseShmcC0+dHlwZSAmIFFFREVfRkFTVFBBVEhfVFgpICYmCisJCSAgICBxZWRlX3R4cV9oYXNfd29yaygmZnAtPnR4cXNbdGNdKSkKIAkJCXFlZGVfdHhfaW50KGVkZXYsICZmcC0+dHhxc1t0Y10pOwogCi0Jcnhfd29ya19kb25lID0gcWVkZV9oYXNfcnhfd29yayhmcC0+cnhxKSA/CisJcnhfd29ya19kb25lID0gKGxpa2VseShmcC0+dHlwZSAmIFFFREVfRkFTVFBBVEhfUlgpICYmCisJCQlxZWRlX2hhc19yeF93b3JrKGZwLT5yeHEpKSA/CiAJCQlxZWRlX3J4X2ludChmcCwgYnVkZ2V0KSA6IDA7CiAJaWYgKHJ4X3dvcmtfZG9uZSA8IGJ1ZGdldCkgewogCQlxZWRfc2JfdXBkYXRlX3NiX2lkeChmcC0+c2JfaW5mbyk7CkBAIC0xNjM2LDggKzE2NDksMTAgQEAKIAkJcm1iKCk7CiAKIAkJLyogRmFsbCBvdXQgZnJvbSB0aGUgTkFQSSBsb29wIGlmIG5lZWRlZCAqLwotCQlpZiAoIShxZWRlX2hhc19yeF93b3JrKGZwLT5yeHEpIHx8Ci0JCSAgICAgIHFlZGVfaGFzX3R4X3dvcmsoZnApKSkgeworCQlpZiAoISgobGlrZWx5KGZwLT50eXBlICYgUUVERV9GQVNUUEFUSF9SWCkgJiYKKwkJICAgICAgIHFlZGVfaGFzX3J4X3dvcmsoZnAtPnJ4cSkpIHx8CisJCSAgICAgIChsaWtlbHkoZnAtPnR5cGUgJiBRRURFX0ZBU1RQQVRIX1RYKSAmJgorCQkgICAgICAgcWVkZV9oYXNfdHhfd29yayhmcCkpKSkgewogCQkJbmFwaV9jb21wbGV0ZShuYXBpKTsKIAogCQkJLyogVXBkYXRlIGFuZCByZWVuYWJsZSBpbnRlcnJ1cHRzICovCkBAIC0xNzA4LDYgKzE3MjMsOCBAQAogCiAJZWRldi0+b3BzLT5nZXRfdnBvcnRfc3RhdHMoZWRldi0+Y2RldiwgJnN0YXRzKTsKIAllZGV2LT5zdGF0cy5ub19idWZmX2Rpc2NhcmRzID0gc3RhdHMubm9fYnVmZl9kaXNjYXJkczsKKwllZGV2LT5zdGF0cy5wYWNrZXRfdG9vX2JpZ19kaXNjYXJkID0gc3RhdHMucGFja2V0X3Rvb19iaWdfZGlzY2FyZDsKKwllZGV2LT5zdGF0cy50dGwwX2Rpc2NhcmQgPSBzdGF0cy50dGwwX2Rpc2NhcmQ7CiAJZWRldi0+c3RhdHMucnhfdWNhc3RfYnl0ZXMgPSBzdGF0cy5yeF91Y2FzdF9ieXRlczsKIAllZGV2LT5zdGF0cy5yeF9tY2FzdF9ieXRlcyA9IHN0YXRzLnJ4X21jYXN0X2J5dGVzOwogCWVkZXYtPnN0YXRzLnJ4X2JjYXN0X2J5dGVzID0gc3RhdHMucnhfYmNhc3RfYnl0ZXM7CkBAIC0xNzg3LDkgKzE4MDQsOSBAQAogCWVkZXYtPnN0YXRzLnR4X21hY19jdHJsX2ZyYW1lcyA9IHN0YXRzLnR4X21hY19jdHJsX2ZyYW1lczsKIH0KIAotc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqcWVkZV9nZXRfc3RhdHM2NCgKLQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCitzdGF0aWMKK3N0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqcWVkZV9nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQogewogCXN0cnVjdCBxZWRlX2RldiAqZWRldiA9IG5ldGRldl9wcml2KGRldik7CiAKQEAgLTIxMDMsMTQgKzIxMjAsMTMgQEAKIAkJfQogCiAJCURQX1ZFUkJPU0UoZWRldiwgTkVUSUZfTVNHX0lGRE9XTiwKLQkJCSAgICJtYXJrZWQgdmxhbiAlZCBhcyBub24tY29uZmlndXJlZFxuIiwKLQkJCSAgIHZsYW4tPnZpZCk7CisJCQkgICAibWFya2VkIHZsYW4gJWQgYXMgbm9uLWNvbmZpZ3VyZWRcbiIsIHZsYW4tPnZpZCk7CiAJfQogCiAJZWRldi0+YWNjZXB0X2FueV92bGFuID0gZmFsc2U7CiB9CiAKLWludCBxZWRlX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKK3N0YXRpYyBpbnQgcWVkZV9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IHFlZGVfZGV2ICplZGV2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAluZXRkZXZfZmVhdHVyZXNfdCBjaGFuZ2VzID0gZmVhdHVyZXMgXiBkZXYtPmZlYXR1cmVzOwpAQCAtMjE0Niw3ICsyMTYyLDcgQEAKIAogCQllZGV2LT52eGxhbl9kc3RfcG9ydCA9IHRfcG9ydDsKIAotCQlEUF9WRVJCT1NFKGVkZXYsIFFFRF9NU0dfREVCVUcsICJBZGRlZCB2eGxhbiBwb3J0PSVkIiwKKwkJRFBfVkVSQk9TRShlZGV2LCBRRURfTVNHX0RFQlVHLCAiQWRkZWQgdnhsYW4gcG9ydD0lZFxuIiwKIAkJCSAgIHRfcG9ydCk7CiAKIAkJc2V0X2JpdChRRURFX1NQX1ZYTEFOX1BPUlRfQ09ORklHLCAmZWRldi0+c3BfZmxhZ3MpOwpAQCAtMjE1Nyw3ICsyMTczLDcgQEAKIAogCQllZGV2LT5nZW5ldmVfZHN0X3BvcnQgPSB0X3BvcnQ7CiAKLQkJRFBfVkVSQk9TRShlZGV2LCBRRURfTVNHX0RFQlVHLCAiQWRkZWQgZ2VuZXZlIHBvcnQ9JWQiLAorCQlEUF9WRVJCT1NFKGVkZXYsIFFFRF9NU0dfREVCVUcsICJBZGRlZCBnZW5ldmUgcG9ydD0lZFxuIiwKIAkJCSAgIHRfcG9ydCk7CiAJCXNldF9iaXQoUUVERV9TUF9HRU5FVkVfUE9SVF9DT05GSUcsICZlZGV2LT5zcF9mbGFncyk7CiAJCWJyZWFrOwpAQCAtMjE4MSw3ICsyMTk3LDcgQEAKIAogCQllZGV2LT52eGxhbl9kc3RfcG9ydCA9IDA7CiAKLQkJRFBfVkVSQk9TRShlZGV2LCBRRURfTVNHX0RFQlVHLCAiRGVsZXRlZCB2eGxhbiBwb3J0PSVkIiwKKwkJRFBfVkVSQk9TRShlZGV2LCBRRURfTVNHX0RFQlVHLCAiRGVsZXRlZCB2eGxhbiBwb3J0PSVkXG4iLAogCQkJICAgdF9wb3J0KTsKIAogCQlzZXRfYml0KFFFREVfU1BfVlhMQU5fUE9SVF9DT05GSUcsICZlZGV2LT5zcF9mbGFncyk7CkBAIC0yMTkyLDcgKzIyMDgsNyBAQAogCiAJCWVkZXYtPmdlbmV2ZV9kc3RfcG9ydCA9IDA7CiAKLQkJRFBfVkVSQk9TRShlZGV2LCBRRURfTVNHX0RFQlVHLCAiRGVsZXRlZCBnZW5ldmUgcG9ydD0lZCIsCisJCURQX1ZFUkJPU0UoZWRldiwgUUVEX01TR19ERUJVRywgIkRlbGV0ZWQgZ2VuZXZlIHBvcnQ9JWRcbiIsCiAJCQkgICB0X3BvcnQpOwogCQlzZXRfYml0KFFFREVfU1BfR0VORVZFX1BPUlRfQ09ORklHLCAmZWRldi0+c3BfZmxhZ3MpOwogCQlicmVhazsKQEAgLTIyMzcsMTUgKzIyNTMsMTMgQEAKIHN0YXRpYyBzdHJ1Y3QgcWVkZV9kZXYgKnFlZGVfYWxsb2NfZXRoZXJkZXYoc3RydWN0IHFlZF9kZXYgKmNkZXYsCiAJCQkJCSAgICBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkJICAgIHN0cnVjdCBxZWRfZGV2X2V0aF9pbmZvICppbmZvLAotCQkJCQkgICAgdTMyIGRwX21vZHVsZSwKLQkJCQkJICAgIHU4IGRwX2xldmVsKQorCQkJCQkgICAgdTMyIGRwX21vZHVsZSwgdTggZHBfbGV2ZWwpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAJc3RydWN0IHFlZGVfZGV2ICplZGV2OwogCiAJbmRldiA9IGFsbG9jX2V0aGVyZGV2X21xcyhzaXplb2YoKmVkZXYpLAotCQkJCSAgaW5mby0+bnVtX3F1ZXVlcywKLQkJCQkgIGluZm8tPm51bV9xdWV1ZXMpOworCQkJCSAgaW5mby0+bnVtX3F1ZXVlcywgaW5mby0+bnVtX3F1ZXVlcyk7CiAJaWYgKCFuZGV2KSB7CiAJCXByX2VycigiZXRoZXJkZXYgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTIyNjEsNiArMjI3NSw5IEBACiAJZWRldi0+cV9udW1fcnhfYnVmZmVycyA9IE5VTV9SWF9CRFNfREVGOwogCWVkZXYtPnFfbnVtX3R4X2J1ZmZlcnMgPSBOVU1fVFhfQkRTX0RFRjsKIAorCURQX0lORk8oZWRldiwgIkFsbG9jYXRlZCBuZXRkZXYgd2l0aCAlZCB0eCBxdWV1ZXMgYW5kICVkIHJ4IHF1ZXVlc1xuIiwKKwkJaW5mby0+bnVtX3F1ZXVlcywgaW5mby0+bnVtX3F1ZXVlcyk7CisKIAlTRVRfTkVUREVWX0RFVihuZGV2LCAmcGRldi0+ZGV2KTsKIAogCW1lbXNldCgmZWRldi0+c3RhdHMsIDAsIHNpemVvZihlZGV2LT5zdGF0cykpOwpAQCAtMjM0OSw3ICsyMzY2LDcgQEAKIAkJc3RydWN0IHFlZGVfZmFzdHBhdGggKmZwOwogCQlpbnQgaTsKIAotCQlmb3JfZWFjaF9yc3MoaSkgeworCQlmb3JfZWFjaF9xdWV1ZShpKSB7CiAJCQlmcCA9ICZlZGV2LT5mcF9hcnJheVtpXTsKIAogCQkJa2ZyZWUoZnAtPnNiX2luZm8pOwpAQCAtMjM1OCwyMiArMjM3NSwzMyBAQAogCQl9CiAJCWtmcmVlKGVkZXYtPmZwX2FycmF5KTsKIAl9Ci0JZWRldi0+bnVtX3JzcyA9IDA7CisKKwllZGV2LT5udW1fcXVldWVzID0gMDsKKwllZGV2LT5mcF9udW1fdHggPSAwOworCWVkZXYtPmZwX251bV9yeCA9IDA7CiB9CiAKIHN0YXRpYyBpbnQgcWVkZV9hbGxvY19mcF9hcnJheShzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYpCiB7CisJdTggZnBfY29tYmluZWQsIGZwX3J4ID0gZWRldi0+ZnBfbnVtX3J4OwogCXN0cnVjdCBxZWRlX2Zhc3RwYXRoICpmcDsKIAlpbnQgaTsKIAotCWVkZXYtPmZwX2FycmF5ID0ga2NhbGxvYyhRRURFX1JTU19DTlQoZWRldiksCisJZWRldi0+ZnBfYXJyYXkgPSBrY2FsbG9jKFFFREVfUVVFVUVfQ05UKGVkZXYpLAogCQkJCSBzaXplb2YoKmVkZXYtPmZwX2FycmF5KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlZGV2LT5mcF9hcnJheSkgewogCQlEUF9OT1RJQ0UoZWRldiwgImZwIGFycmF5IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCi0JZm9yX2VhY2hfcnNzKGkpIHsKKwlmcF9jb21iaW5lZCA9IFFFREVfUVVFVUVfQ05UKGVkZXYpIC0gZnBfcnggLSBlZGV2LT5mcF9udW1fdHg7CisKKwkvKiBBbGxvY2F0ZSB0aGUgRlAgZWxlbWVudHMgZm9yIFJ4IHF1ZXVlcyBmb2xsb3dlZCBieSBjb21iaW5lZCBhbmQgdGhlbgorCSAqIHRoZSBUeC4gVGhpcyBvcmRlcmluZyBzaG91bGQgYmUgbWFpbnRhaW5lZCBzbyB0aGF0IHRoZSByZXNwZWN0aXZlCisJICogcXVldWVzIChSeCBvciBUeCkgd2lsbCBiZSB0b2dldGhlciBpbiB0aGUgZmFzdHBhdGggYXJyYXkgYW5kIHRoZQorCSAqIGFzc29jaWF0ZWQgaWRzIHdpbGwgYmUgc2VxdWVudGlhbC4KKwkgKi8KKwlmb3JfZWFjaF9xdWV1ZShpKSB7CiAJCWZwID0gJmVkZXYtPmZwX2FycmF5W2ldOwogCiAJCWZwLT5zYl9pbmZvID0ga2NhbGxvYygxLCBzaXplb2YoKmZwLT5zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CkBAIC0yMzgyLDE2ICsyNDEwLDMzIEBACiAJCQlnb3RvIGVycjsKIAkJfQogCi0JCWZwLT5yeHEgPSBrY2FsbG9jKDEsIHNpemVvZigqZnAtPnJ4cSksIEdGUF9LRVJORUwpOwotCQlpZiAoIWZwLT5yeHEpIHsKLQkJCURQX05PVElDRShlZGV2LCAiUlhRIHN0cnVjdCBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JCQlnb3RvIGVycjsKKwkJaWYgKGZwX3J4KSB7CisJCQlmcC0+dHlwZSA9IFFFREVfRkFTVFBBVEhfUlg7CisJCQlmcF9yeC0tOworCQl9IGVsc2UgaWYgKGZwX2NvbWJpbmVkKSB7CisJCQlmcC0+dHlwZSA9IFFFREVfRkFTVFBBVEhfQ09NQklORUQ7CisJCQlmcF9jb21iaW5lZC0tOworCQl9IGVsc2UgeworCQkJZnAtPnR5cGUgPSBRRURFX0ZBU1RQQVRIX1RYOwogCQl9CiAKLQkJZnAtPnR4cXMgPSBrY2FsbG9jKGVkZXYtPm51bV90Yywgc2l6ZW9mKCpmcC0+dHhxcyksIEdGUF9LRVJORUwpOwotCQlpZiAoIWZwLT50eHFzKSB7Ci0JCQlEUF9OT1RJQ0UoZWRldiwgIlRYUSBhcnJheSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JCQlnb3RvIGVycjsKKwkJaWYgKGZwLT50eXBlICYgUUVERV9GQVNUUEFUSF9UWCkgeworCQkJZnAtPnR4cXMgPSBrY2FsbG9jKGVkZXYtPm51bV90Yywgc2l6ZW9mKCpmcC0+dHhxcyksCisJCQkJCSAgIEdGUF9LRVJORUwpOworCQkJaWYgKCFmcC0+dHhxcykgeworCQkJCURQX05PVElDRShlZGV2LAorCQkJCQkgICJUWFEgYXJyYXkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQl9CisKKwkJaWYgKGZwLT50eXBlICYgUUVERV9GQVNUUEFUSF9SWCkgeworCQkJZnAtPnJ4cSA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpmcC0+cnhxKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWZwLT5yeHEpIHsKKwkJCQlEUF9OT1RJQ0UoZWRldiwKKwkJCQkJICAiUlhRIHN0cnVjdCBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCQkJZ290byBlcnI7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTI0NTMsNyArMjQ5OCw3IEBACiAJCQlib29sIGlzX3ZmLCBlbnVtIHFlZGVfcHJvYmVfbW9kZSBtb2RlKQogewogCXN0cnVjdCBxZWRfcHJvYmVfcGFyYW1zIHByb2JlX3BhcmFtczsKLQlzdHJ1Y3QgcWVkX3Nsb3dwYXRoX3BhcmFtcyBwYXJhbXM7CisJc3RydWN0IHFlZF9zbG93cGF0aF9wYXJhbXMgc3BfcGFyYW1zOwogCXN0cnVjdCBxZWRfZGV2X2V0aF9pbmZvIGRldl9pbmZvOwogCXN0cnVjdCBxZWRlX2RldiAqZWRldjsKIAlzdHJ1Y3QgcWVkX2RldiAqY2RldjsKQEAgLTI0NzYsMTQgKzI1MjEsMTQgQEAKIAlxZWRlX3VwZGF0ZV9wZl9wYXJhbXMoY2Rldik7CiAKIAkvKiBTdGFydCB0aGUgU2xvd3BhdGgtcHJvY2VzcyAqLwotCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2Yoc3RydWN0IHFlZF9zbG93cGF0aF9wYXJhbXMpKTsKLQlwYXJhbXMuaW50X21vZGUgPSBRRURfSU5UX01PREVfTVNJWDsKLQlwYXJhbXMuZHJ2X21ham9yID0gUUVERV9NQUpPUl9WRVJTSU9OOwotCXBhcmFtcy5kcnZfbWlub3IgPSBRRURFX01JTk9SX1ZFUlNJT047Ci0JcGFyYW1zLmRydl9yZXYgPSBRRURFX1JFVklTSU9OX1ZFUlNJT047Ci0JcGFyYW1zLmRydl9lbmcgPSBRRURFX0VOR0lORUVSSU5HX1ZFUlNJT047Ci0Jc3RybGNweShwYXJhbXMubmFtZSwgInFlZGUgTEFOIiwgUUVEX0RSVl9WRVJfU1RSX1NJWkUpOwotCXJjID0gcWVkX29wcy0+Y29tbW9uLT5zbG93cGF0aF9zdGFydChjZGV2LCAmcGFyYW1zKTsKKwltZW1zZXQoJnNwX3BhcmFtcywgMCwgc2l6ZW9mKHNwX3BhcmFtcykpOworCXNwX3BhcmFtcy5pbnRfbW9kZSA9IFFFRF9JTlRfTU9ERV9NU0lYOworCXNwX3BhcmFtcy5kcnZfbWFqb3IgPSBRRURFX01BSk9SX1ZFUlNJT047CisJc3BfcGFyYW1zLmRydl9taW5vciA9IFFFREVfTUlOT1JfVkVSU0lPTjsKKwlzcF9wYXJhbXMuZHJ2X3JldiA9IFFFREVfUkVWSVNJT05fVkVSU0lPTjsKKwlzcF9wYXJhbXMuZHJ2X2VuZyA9IFFFREVfRU5HSU5FRVJJTkdfVkVSU0lPTjsKKwlzdHJsY3B5KHNwX3BhcmFtcy5uYW1lLCAicWVkZSBMQU4iLCBRRURfRFJWX1ZFUl9TVFJfU0laRSk7CisJcmMgPSBxZWRfb3BzLT5jb21tb24tPnNsb3dwYXRoX3N0YXJ0KGNkZXYsICZzcF9wYXJhbXMpOwogCWlmIChyYykgewogCQlwcl9ub3RpY2UoIkNhbm5vdCBzdGFydCBzbG93cGF0aFxuIik7CiAJCWdvdG8gZXJyMTsKQEAgLTI1MDYsMTAgKzI1NTEsMTQgQEAKIAogCXFlZGVfaW5pdF9uZGV2KGVkZXYpOwogCisJcmMgPSBxZWRlX3JvY2VfZGV2X2FkZChlZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyMzsKKwogCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGVkZXYtPm5kZXYpOwogCWlmIChyYykgewogCQlEUF9OT1RJQ0UoZWRldiwgIkNhbm5vdCByZWdpc3RlciBuZXQtZGV2aWNlXG4iKTsKLQkJZ290byBlcnIzOworCQlnb3RvIGVycjQ7CiAJfQogCiAJZWRldi0+b3BzLT5jb21tb24tPnNldF9pZChjZGV2LCBlZGV2LT5uZGV2LT5uYW1lLCBEUlZfTU9EVUxFX1ZFUlNJT04pOwpAQCAtMjUxNyw3ICsyNTY2LDggQEAKIAllZGV2LT5vcHMtPnJlZ2lzdGVyX29wcyhjZGV2LCAmcWVkZV9sbF9vcHMsIGVkZXYpOwogCiAjaWZkZWYgQ09ORklHX0RDQgotCXFlZGVfc2V0X2RjYm5sX29wcyhlZGV2LT5uZGV2KTsKKwlpZiAoIUlTX1ZGKGVkZXYpKQorCQlxZWRlX3NldF9kY2JubF9vcHMoZWRldi0+bmRldik7CiAjZW5kaWYKIAogCUlOSVRfREVMQVlFRF9XT1JLKCZlZGV2LT5zcF90YXNrLCBxZWRlX3NwX3Rhc2spOwpAQCAtMjUyOCw2ICsyNTc4LDggQEAKIAogCXJldHVybiAwOwogCitlcnI0OgorCXFlZGVfcm9jZV9kZXZfcmVtb3ZlKGVkZXYpOwogZXJyMzoKIAlmcmVlX25ldGRldihlZGV2LT5uZGV2KTsKIGVycjI6CkBAIC0yNTc0LDggKzI2MjYsMTEgQEAKIAlEUF9JTkZPKGVkZXYsICJTdGFydGluZyBxZWRlX3JlbW92ZVxuIik7CiAKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmVkZXYtPnNwX3Rhc2spOworCiAJdW5yZWdpc3Rlcl9uZXRkZXYobmRldik7CiAKKwlxZWRlX3JvY2VfZGV2X3JlbW92ZShlZGV2KTsKKwogCWVkZXYtPm9wcy0+Y29tbW9uLT5zZXRfcG93ZXJfc3RhdGUoY2RldiwgUENJX0QwKTsKIAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKQEAgLTI1ODYsNyArMjY0MSw3IEBACiAJcWVkX29wcy0+Y29tbW9uLT5zbG93cGF0aF9zdG9wKGNkZXYpOwogCXFlZF9vcHMtPmNvbW1vbi0+cmVtb3ZlKGNkZXYpOwogCi0JcHJfbm90aWNlKCJFbmRpbmcgc3VjY2Vzc2Z1bGx5IHFlZGVfcmVtb3ZlXG4iKTsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiRW5kaW5nIHFlZGVfcmVtb3ZlIHN1Y2Nlc3NmdWxseVxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIHFlZGVfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQpAQCAtMjYwNSw4ICsyNjYwLDggQEAKIAl1MTYgcnNzX251bTsKIAogCS8qIFNldHVwIHF1ZXVlcyBhY2NvcmRpbmcgdG8gcG9zc2libGUgcmVzb3VyY2VzKi8KLQlpZiAoZWRldi0+cmVxX3JzcykKLQkJcnNzX251bSA9IGVkZXYtPnJlcV9yc3M7CisJaWYgKGVkZXYtPnJlcV9xdWV1ZXMpCisJCXJzc19udW0gPSBlZGV2LT5yZXFfcXVldWVzOwogCWVsc2UKIAkJcnNzX251bSA9IG5ldGlmX2dldF9udW1fZGVmYXVsdF9yc3NfcXVldWVzKCkgKgogCQkJICBlZGV2LT5kZXZfaW5mby5jb21tb24ubnVtX2h3Zm5zOwpAQCAtMjYxNiwxMSArMjY3MSwxNSBAQAogCXJjID0gZWRldi0+b3BzLT5jb21tb24tPnNldF9mcF9pbnQoZWRldi0+Y2RldiwgcnNzX251bSk7CiAJaWYgKHJjID4gMCkgewogCQkvKiBNYW5hZ2VkIHRvIHJlcXVlc3QgaW50ZXJydXB0cyBmb3Igb3VyIHF1ZXVlcyAqLwotCQllZGV2LT5udW1fcnNzID0gcmM7CisJCWVkZXYtPm51bV9xdWV1ZXMgPSByYzsKIAkJRFBfSU5GTyhlZGV2LCAiTWFuYWdlZCAlZCBbb2YgJWRdIFJTUyBxdWV1ZXNcbiIsCi0JCQlRRURFX1JTU19DTlQoZWRldiksIHJzc19udW0pOworCQkJUUVERV9RVUVVRV9DTlQoZWRldiksIHJzc19udW0pOwogCQlyYyA9IDA7CiAJfQorCisJZWRldi0+ZnBfbnVtX3R4ID0gZWRldi0+cmVxX251bV90eDsKKwllZGV2LT5mcF9udW1fcnggPSBlZGV2LT5yZXFfbnVtX3J4OworCiAJcmV0dXJuIHJjOwogfQogCkBAIC0yNjM0LDE2ICsyNjkzLDE0IEBACiAKIC8qIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGZhc3QtcGF0aCBzdGF0dXMgYmxvY2sgbWVtb3J5ICovCiBzdGF0aWMgaW50IHFlZGVfYWxsb2NfbWVtX3NiKHN0cnVjdCBxZWRlX2RldiAqZWRldiwKLQkJCSAgICAgc3RydWN0IHFlZF9zYl9pbmZvICpzYl9pbmZvLAotCQkJICAgICB1MTYgc2JfaWQpCisJCQkgICAgIHN0cnVjdCBxZWRfc2JfaW5mbyAqc2JfaW5mbywgdTE2IHNiX2lkKQogewogCXN0cnVjdCBzdGF0dXNfYmxvY2sgKnNiX3ZpcnQ7CiAJZG1hX2FkZHJfdCBzYl9waHlzOwogCWludCByYzsKIAogCXNiX3ZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmVkZXYtPnBkZXYtPmRldiwKLQkJCQkgICAgIHNpemVvZigqc2JfdmlydCksCi0JCQkJICAgICAmc2JfcGh5cywgR0ZQX0tFUk5FTCk7CisJCQkJICAgICBzaXplb2YoKnNiX3ZpcnQpLCAmc2JfcGh5cywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYl92aXJ0KSB7CiAJCURQX0VSUihlZGV2LCAiU3RhdHVzIGJsb2NrIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0yNjc1LDE2ICsyNzMyLDE1IEBACiAJCWRhdGEgPSByeF9idWYtPmRhdGE7CiAKIAkJZG1hX3VubWFwX3BhZ2UoJmVkZXYtPnBkZXYtPmRldiwKLQkJCSAgICAgICByeF9idWYtPm1hcHBpbmcsCi0JCQkgICAgICAgUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQkJICAgICAgIHJ4X2J1Zi0+bWFwcGluZywgUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwogCiAJCXJ4X2J1Zi0+ZGF0YSA9IE5VTEw7CiAJCV9fZnJlZV9wYWdlKGRhdGEpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgcWVkZV9mcmVlX3NnZV9tZW0oc3RydWN0IHFlZGVfZGV2ICplZGV2LAotCQkJICAgICAgc3RydWN0IHFlZGVfcnhfcXVldWUgKnJ4cSkgeworc3RhdGljIHZvaWQgcWVkZV9mcmVlX3NnZV9tZW0oc3RydWN0IHFlZGVfZGV2ICplZGV2LCBzdHJ1Y3QgcWVkZV9yeF9xdWV1ZSAqcnhxKQorewogCWludCBpOwogCiAJaWYgKGVkZXYtPmdyb19kaXNhYmxlKQpAQCAtMjcwMyw4ICsyNzU5LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHFlZGVfZnJlZV9tZW1fcnhxKHN0cnVjdCBxZWRlX2RldiAqZWRldiwKLQkJCSAgICAgIHN0cnVjdCBxZWRlX3J4X3F1ZXVlICpyeHEpCitzdGF0aWMgdm9pZCBxZWRlX2ZyZWVfbWVtX3J4cShzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsIHN0cnVjdCBxZWRlX3J4X3F1ZXVlICpyeHEpCiB7CiAJcWVkZV9mcmVlX3NnZV9tZW0oZWRldiwgcnhxKTsKIApAQCAtMjcyNiw5ICsyNzgxLDYgQEAKIAlzdHJ1Y3QgZXRoX3J4X2JkICpyeF9iZDsKIAlkbWFfYWRkcl90IG1hcHBpbmc7CiAJc3RydWN0IHBhZ2UgKmRhdGE7Ci0JdTE2IHJ4X2J1Zl9zaXplOwotCi0JcnhfYnVmX3NpemUgPSByeHEtPnJ4X2J1Zl9zaXplOwogCiAJZGF0YSA9IGFsbG9jX3BhZ2VzKEdGUF9BVE9NSUMsIDApOwogCWlmICh1bmxpa2VseSghZGF0YSkpIHsKQEAgLTI3NjMsOCArMjgxNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcWVkZV9hbGxvY19zZ2VfbWVtKHN0cnVjdCBxZWRlX2RldiAqZWRldiwKLQkJCSAgICAgIHN0cnVjdCBxZWRlX3J4X3F1ZXVlICpyeHEpCitzdGF0aWMgaW50IHFlZGVfYWxsb2Nfc2dlX21lbShzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsIHN0cnVjdCBxZWRlX3J4X3F1ZXVlICpyeHEpCiB7CiAJZG1hX2FkZHJfdCBtYXBwaW5nOwogCWludCBpOwpAQCAtMjgxMSwxNSArMjg2MiwxNCBAQAogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhbGwgbWVtb3J5IG5lZWRlZCBwZXIgUnggcXVldWUgKi8KLXN0YXRpYyBpbnQgcWVkZV9hbGxvY19tZW1fcnhxKHN0cnVjdCBxZWRlX2RldiAqZWRldiwKLQkJCSAgICAgIHN0cnVjdCBxZWRlX3J4X3F1ZXVlICpyeHEpCitzdGF0aWMgaW50IHFlZGVfYWxsb2NfbWVtX3J4cShzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsIHN0cnVjdCBxZWRlX3J4X3F1ZXVlICpyeHEpCiB7CiAJaW50IGksIHJjLCBzaXplOwogCiAJcnhxLT5udW1fcnhfYnVmZmVycyA9IGVkZXYtPnFfbnVtX3J4X2J1ZmZlcnM7CiAKLQlyeHEtPnJ4X2J1Zl9zaXplID0gTkVUX0lQX0FMSUdOICsgRVRIX09WRVJIRUFEICsKLQkJCSAgIGVkZXYtPm5kZXYtPm10dTsKKwlyeHEtPnJ4X2J1Zl9zaXplID0gTkVUX0lQX0FMSUdOICsgRVRIX09WRVJIRUFEICsgZWRldi0+bmRldi0+bXR1OworCiAJaWYgKHJ4cS0+cnhfYnVmX3NpemUgPiBQQUdFX1NJWkUpCiAJCXJ4cS0+cnhfYnVmX3NpemUgPSBQQUdFX1NJWkU7CiAKQEAgLTI4NzMsOCArMjkyMyw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBxZWRlX2ZyZWVfbWVtX3R4cShzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsCi0JCQkgICAgICBzdHJ1Y3QgcWVkZV90eF9xdWV1ZSAqdHhxKQorc3RhdGljIHZvaWQgcWVkZV9mcmVlX21lbV90eHEoc3RydWN0IHFlZGVfZGV2ICplZGV2LCBzdHJ1Y3QgcWVkZV90eF9xdWV1ZSAqdHhxKQogewogCS8qIEZyZWUgdGhlIHBhcmFsbGVsIFNXIHJpbmcgKi8KIAlrZnJlZSh0eHEtPnN3X3R4X3JpbmcpOwpAQCAtMjg4NCw4ICsyOTMzLDcgQEAKIH0KIAogLyogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYWxsIG1lbW9yeSBuZWVkZWQgcGVyIFR4IHF1ZXVlICovCi1zdGF0aWMgaW50IHFlZGVfYWxsb2NfbWVtX3R4cShzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsCi0JCQkgICAgICBzdHJ1Y3QgcWVkZV90eF9xdWV1ZSAqdHhxKQorc3RhdGljIGludCBxZWRlX2FsbG9jX21lbV90eHEoc3RydWN0IHFlZGVfZGV2ICplZGV2LCBzdHJ1Y3QgcWVkZV90eF9xdWV1ZSAqdHhxKQogewogCWludCBzaXplLCByYzsKIAl1bmlvbiBldGhfdHhfYmRfdHlwZXMgKnBfdmlydDsKQEAgLTI5MTcsNDEgKzI5NjUsNDUgQEAKIH0KIAogLyogVGhpcyBmdW5jdGlvbiBmcmVlcyBhbGwgbWVtb3J5IG9mIGEgc2luZ2xlIGZwICovCi1zdGF0aWMgdm9pZCBxZWRlX2ZyZWVfbWVtX2ZwKHN0cnVjdCBxZWRlX2RldiAqZWRldiwKLQkJCSAgICAgc3RydWN0IHFlZGVfZmFzdHBhdGggKmZwKQorc3RhdGljIHZvaWQgcWVkZV9mcmVlX21lbV9mcChzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsIHN0cnVjdCBxZWRlX2Zhc3RwYXRoICpmcCkKIHsKIAlpbnQgdGM7CiAKIAlxZWRlX2ZyZWVfbWVtX3NiKGVkZXYsIGZwLT5zYl9pbmZvKTsKIAotCXFlZGVfZnJlZV9tZW1fcnhxKGVkZXYsIGZwLT5yeHEpOworCWlmIChmcC0+dHlwZSAmIFFFREVfRkFTVFBBVEhfUlgpCisJCXFlZGVfZnJlZV9tZW1fcnhxKGVkZXYsIGZwLT5yeHEpOwogCi0JZm9yICh0YyA9IDA7IHRjIDwgZWRldi0+bnVtX3RjOyB0YysrKQotCQlxZWRlX2ZyZWVfbWVtX3R4cShlZGV2LCAmZnAtPnR4cXNbdGNdKTsKKwlpZiAoZnAtPnR5cGUgJiBRRURFX0ZBU1RQQVRIX1RYKQorCQlmb3IgKHRjID0gMDsgdGMgPCBlZGV2LT5udW1fdGM7IHRjKyspCisJCQlxZWRlX2ZyZWVfbWVtX3R4cShlZGV2LCAmZnAtPnR4cXNbdGNdKTsKIH0KIAogLyogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYWxsIG1lbW9yeSBuZWVkZWQgZm9yIGEgc2luZ2xlIGZwIChpLmUuIGFuIGVudGl0eQotICogd2hpY2ggY29udGFpbnMgc3RhdHVzIGJsb2NrLCBvbmUgcnggcXVldWUgYW5kIG11bHRpcGxlIHBlci1UQyB0eCBxdWV1ZXMuCisgKiB3aGljaCBjb250YWlucyBzdGF0dXMgYmxvY2ssIG9uZSByeCBxdWV1ZSBhbmQvb3IgbXVsdGlwbGUgcGVyLVRDIHR4IHF1ZXVlcy4KICAqLwotc3RhdGljIGludCBxZWRlX2FsbG9jX21lbV9mcChzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsCi0JCQkgICAgIHN0cnVjdCBxZWRlX2Zhc3RwYXRoICpmcCkKK3N0YXRpYyBpbnQgcWVkZV9hbGxvY19tZW1fZnAoc3RydWN0IHFlZGVfZGV2ICplZGV2LCBzdHJ1Y3QgcWVkZV9mYXN0cGF0aCAqZnApCiB7CiAJaW50IHJjLCB0YzsKIAotCXJjID0gcWVkZV9hbGxvY19tZW1fc2IoZWRldiwgZnAtPnNiX2luZm8sIGZwLT5yc3NfaWQpOworCXJjID0gcWVkZV9hbGxvY19tZW1fc2IoZWRldiwgZnAtPnNiX2luZm8sIGZwLT5pZCk7CiAJaWYgKHJjKQogCQlnb3RvIGVycjsKIAotCXJjID0gcWVkZV9hbGxvY19tZW1fcnhxKGVkZXYsIGZwLT5yeHEpOwotCWlmIChyYykKLQkJZ290byBlcnI7Ci0KLQlmb3IgKHRjID0gMDsgdGMgPCBlZGV2LT5udW1fdGM7IHRjKyspIHsKLQkJcmMgPSBxZWRlX2FsbG9jX21lbV90eHEoZWRldiwgJmZwLT50eHFzW3RjXSk7CisJaWYgKGZwLT50eXBlICYgUUVERV9GQVNUUEFUSF9SWCkgeworCQlyYyA9IHFlZGVfYWxsb2NfbWVtX3J4cShlZGV2LCBmcC0+cnhxKTsKIAkJaWYgKHJjKQogCQkJZ290byBlcnI7CiAJfQogCisJaWYgKGZwLT50eXBlICYgUUVERV9GQVNUUEFUSF9UWCkgeworCQlmb3IgKHRjID0gMDsgdGMgPCBlZGV2LT5udW1fdGM7IHRjKyspIHsKKwkJCXJjID0gcWVkZV9hbGxvY19tZW1fdHhxKGVkZXYsICZmcC0+dHhxc1t0Y10pOworCQkJaWYgKHJjKQorCQkJCWdvdG8gZXJyOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiBlcnI6CiAJcmV0dXJuIHJjOwpAQCAtMjk2MSw3ICszMDEzLDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvcl9lYWNoX3JzcyhpKSB7CisJZm9yX2VhY2hfcXVldWUoaSkgewogCQlzdHJ1Y3QgcWVkZV9mYXN0cGF0aCAqZnAgPSAmZWRldi0+ZnBfYXJyYXlbaV07CiAKIAkJcWVkZV9mcmVlX21lbV9mcChlZGV2LCBmcCk7CkBAIC0yOTcxLDE2ICszMDIzLDE2IEBACiAvKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhbGwgcWVkZSBtZW1vcnkgYXQgTklDIGxvYWQuICovCiBzdGF0aWMgaW50IHFlZGVfYWxsb2NfbWVtX2xvYWQoc3RydWN0IHFlZGVfZGV2ICplZGV2KQogewotCWludCByYyA9IDAsIHJzc19pZDsKKwlpbnQgcmMgPSAwLCBxdWV1ZV9pZDsKIAotCWZvciAocnNzX2lkID0gMDsgcnNzX2lkIDwgUUVERV9SU1NfQ05UKGVkZXYpOyByc3NfaWQrKykgewotCQlzdHJ1Y3QgcWVkZV9mYXN0cGF0aCAqZnAgPSAmZWRldi0+ZnBfYXJyYXlbcnNzX2lkXTsKKwlmb3IgKHF1ZXVlX2lkID0gMDsgcXVldWVfaWQgPCBRRURFX1FVRVVFX0NOVChlZGV2KTsgcXVldWVfaWQrKykgeworCQlzdHJ1Y3QgcWVkZV9mYXN0cGF0aCAqZnAgPSAmZWRldi0+ZnBfYXJyYXlbcXVldWVfaWRdOwogCiAJCXJjID0gcWVkZV9hbGxvY19tZW1fZnAoZWRldiwgZnApOwogCQlpZiAocmMpIHsKIAkJCURQX0VSUihlZGV2LAogCQkJICAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBmYXN0cGF0aCAtIHJzcyBpZCA9ICVkXG4iLAotCQkJICAgICAgIHJzc19pZCk7CisJCQkgICAgICAgcXVldWVfaWQpOwogCQkJcWVkZV9mcmVlX21lbV9sb2FkKGVkZXYpOwogCQkJcmV0dXJuIHJjOwogCQl9CkBAIC0yOTkyLDMwICszMDQ0LDM4IEBACiAvKiBUaGlzIGZ1bmN0aW9uIGluaXRzIGZwIGNvbnRlbnQgYW5kIHJlc2V0cyB0aGUgU0IsIFJYUSBhbmQgVFhRIHN0cnVjdHVyZXMgKi8KIHN0YXRpYyB2b2lkIHFlZGVfaW5pdF9mcChzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYpCiB7Ci0JaW50IHJzc19pZCwgdHhxX2luZGV4LCB0YzsKKwlpbnQgcXVldWVfaWQsIHJ4cV9pbmRleCA9IDAsIHR4cV9pbmRleCA9IDAsIHRjOwogCXN0cnVjdCBxZWRlX2Zhc3RwYXRoICpmcDsKIAotCWZvcl9lYWNoX3Jzcyhyc3NfaWQpIHsKLQkJZnAgPSAmZWRldi0+ZnBfYXJyYXlbcnNzX2lkXTsKKwlmb3JfZWFjaF9xdWV1ZShxdWV1ZV9pZCkgeworCQlmcCA9ICZlZGV2LT5mcF9hcnJheVtxdWV1ZV9pZF07CiAKIAkJZnAtPmVkZXYgPSBlZGV2OwotCQlmcC0+cnNzX2lkID0gcnNzX2lkOworCQlmcC0+aWQgPSBxdWV1ZV9pZDsKIAogCQltZW1zZXQoKHZvaWQgKikmZnAtPm5hcGksIDAsIHNpemVvZihmcC0+bmFwaSkpOwogCiAJCW1lbXNldCgodm9pZCAqKWZwLT5zYl9pbmZvLCAwLCBzaXplb2YoKmZwLT5zYl9pbmZvKSk7CiAKLQkJbWVtc2V0KCh2b2lkICopZnAtPnJ4cSwgMCwgc2l6ZW9mKCpmcC0+cnhxKSk7Ci0JCWZwLT5yeHEtPnJ4cV9pZCA9IHJzc19pZDsKKwkJaWYgKGZwLT50eXBlICYgUUVERV9GQVNUUEFUSF9SWCkgeworCQkJbWVtc2V0KCh2b2lkICopZnAtPnJ4cSwgMCwgc2l6ZW9mKCpmcC0+cnhxKSk7CisJCQlmcC0+cnhxLT5yeHFfaWQgPSByeHFfaW5kZXgrKzsKKwkJfQogCi0JCW1lbXNldCgodm9pZCAqKWZwLT50eHFzLCAwLCAoZWRldi0+bnVtX3RjICogc2l6ZW9mKCpmcC0+dHhxcykpKTsKLQkJZm9yICh0YyA9IDA7IHRjIDwgZWRldi0+bnVtX3RjOyB0YysrKSB7Ci0JCQl0eHFfaW5kZXggPSB0YyAqIFFFREVfUlNTX0NOVChlZGV2KSArIHJzc19pZDsKLQkJCWZwLT50eHFzW3RjXS5pbmRleCA9IHR4cV9pbmRleDsKKwkJaWYgKGZwLT50eXBlICYgUUVERV9GQVNUUEFUSF9UWCkgeworCQkJbWVtc2V0KCh2b2lkICopZnAtPnR4cXMsIDAsCisJCQkgICAgICAgKGVkZXYtPm51bV90YyAqIHNpemVvZigqZnAtPnR4cXMpKSk7CisJCQlmb3IgKHRjID0gMDsgdGMgPCBlZGV2LT5udW1fdGM7IHRjKyspIHsKKwkJCQlmcC0+dHhxc1t0Y10uaW5kZXggPSB0eHFfaW5kZXggKworCQkJCSAgICB0YyAqIFFFREVfVFNTX0NPVU5UKGVkZXYpOworCQkJCWlmIChlZGV2LT5kZXZfaW5mby5pc19sZWdhY3kpCisJCQkJCWZwLT50eHFzW3RjXS5pc19sZWdhY3kgPSB0cnVlOworCQkJfQorCQkJdHhxX2luZGV4Kys7CiAJCX0KIAogCQlzbnByaW50ZihmcC0+bmFtZSwgc2l6ZW9mKGZwLT5uYW1lKSwgIiVzLWZwLSVkIiwKLQkJCSBlZGV2LT5uZGV2LT5uYW1lLCByc3NfaWQpOworCQkJIGVkZXYtPm5kZXYtPm5hbWUsIHF1ZXVlX2lkKTsKIAl9CiAKIAllZGV2LT5ncm9fZGlzYWJsZSA9ICEoZWRldi0+bmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0dSTyk7CkBAIC0zMDI1LDEyICszMDg1LDEzIEBACiB7CiAJaW50IHJjID0gMDsKIAotCXJjID0gbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhlZGV2LT5uZGV2LCBRRURFX1RTU19DTlQoZWRldikpOworCXJjID0gbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhlZGV2LT5uZGV2LCBRRURFX1RTU19DT1VOVChlZGV2KSk7CiAJaWYgKHJjKSB7CiAJCURQX05PVElDRShlZGV2LCAiRmFpbGVkIHRvIHNldCByZWFsIG51bWJlciBvZiBUeCBxdWV1ZXNcbiIpOwogCQlyZXR1cm4gcmM7CiAJfQotCXJjID0gbmV0aWZfc2V0X3JlYWxfbnVtX3J4X3F1ZXVlcyhlZGV2LT5uZGV2LCBRRURFX1JTU19DTlQoZWRldikpOworCisJcmMgPSBuZXRpZl9zZXRfcmVhbF9udW1fcnhfcXVldWVzKGVkZXYtPm5kZXYsIFFFREVfUlNTX0NPVU5UKGVkZXYpKTsKIAlpZiAocmMpIHsKIAkJRFBfTk9USUNFKGVkZXYsICJGYWlsZWQgdG8gc2V0IHJlYWwgbnVtYmVyIG9mIFJ4IHF1ZXVlc1xuIik7CiAJCXJldHVybiByYzsKQEAgLTMwNDMsNyArMzEwNCw3IEBACiB7CiAJaW50IGk7CiAKLQlmb3JfZWFjaF9yc3MoaSkgeworCWZvcl9lYWNoX3F1ZXVlKGkpIHsKIAkJbmFwaV9kaXNhYmxlKCZlZGV2LT5mcF9hcnJheVtpXS5uYXBpKTsKIAogCQluZXRpZl9uYXBpX2RlbCgmZWRldi0+ZnBfYXJyYXlbaV0ubmFwaSk7CkBAIC0zMDU1LDcgKzMxMTYsNyBAQAogCWludCBpOwogCiAJLyogQWRkIE5BUEkgb2JqZWN0cyAqLwotCWZvcl9lYWNoX3JzcyhpKSB7CisJZm9yX2VhY2hfcXVldWUoaSkgewogCQluZXRpZl9uYXBpX2FkZChlZGV2LT5uZGV2LCAmZWRldi0+ZnBfYXJyYXlbaV0ubmFwaSwKIAkJCSAgICAgICBxZWRlX3BvbGwsIE5BUElfUE9MTF9XRUlHSFQpOwogCQluYXBpX2VuYWJsZSgmZWRldi0+ZnBfYXJyYXlbaV0ubmFwaSk7CkBAIC0zMDg0LDE0ICszMTQ1LDE0IEBACiAJaW50IGksIHJjOwogCiAJLyogU2FuaXRpemUgbnVtYmVyIG9mIGludGVycnVwdHMgPT0gbnVtYmVyIG9mIHByZXBhcmVkIFJTUyBxdWV1ZXMgKi8KLQlpZiAoUUVERV9SU1NfQ05UKGVkZXYpID4gZWRldi0+aW50X2luZm8ubXNpeF9jbnQpIHsKKwlpZiAoUUVERV9RVUVVRV9DTlQoZWRldikgPiBlZGV2LT5pbnRfaW5mby5tc2l4X2NudCkgewogCQlEUF9FUlIoZWRldiwKIAkJICAgICAgICJJbnRlcnJ1cHQgbWlzbWF0Y2g6ICVkIFJTUyBxdWV1ZXMgPiAlZCBNU0kteCB2ZWN0b3JzXG4iLAotCQkgICAgICAgUUVERV9SU1NfQ05UKGVkZXYpLCBlZGV2LT5pbnRfaW5mby5tc2l4X2NudCk7CisJCSAgICAgICBRRURFX1FVRVVFX0NOVChlZGV2KSwgZWRldi0+aW50X2luZm8ubXNpeF9jbnQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgUUVERV9SU1NfQ05UKGVkZXYpOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgUUVERV9RVUVVRV9DTlQoZWRldik7IGkrKykgewogCQlyYyA9IHJlcXVlc3RfaXJxKGVkZXYtPmludF9pbmZvLm1zaXhbaV0udmVjdG9yLAogCQkJCSBxZWRlX21zaXhfZnBfaW50LCAwLCBlZGV2LT5mcF9hcnJheVtpXS5uYW1lLAogCQkJCSAmZWRldi0+ZnBfYXJyYXlbaV0pOwpAQCAtMzEzNiwxOCArMzE5NywxNyBAQAogCiAJCS8qIHFlZCBzaG91bGQgbGVhcm4gcmVjZWl2ZSB0aGUgUlNTIGlkcyBhbmQgY2FsbGJhY2tzICovCiAJCW9wcyA9IGVkZXYtPm9wcy0+Y29tbW9uOwotCQlmb3IgKGkgPSAwOyBpIDwgUUVERV9SU1NfQ05UKGVkZXYpOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBRRURFX1FVRVVFX0NOVChlZGV2KTsgaSsrKQogCQkJb3BzLT5zaW1kX2hhbmRsZXJfY29uZmlnKGVkZXYtPmNkZXYsCiAJCQkJCQkgJmVkZXYtPmZwX2FycmF5W2ldLCBpLAogCQkJCQkJIHFlZGVfc2ltZF9mcF9oYW5kbGVyKTsKLQkJZWRldi0+aW50X2luZm8udXNlZF9jbnQgPSBRRURFX1JTU19DTlQoZWRldik7CisJCWVkZXYtPmludF9pbmZvLnVzZWRfY250ID0gUUVERV9RVUVVRV9DTlQoZWRldik7CiAJfQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHFlZGVfZHJhaW5fdHhxKHN0cnVjdCBxZWRlX2RldiAqZWRldiwKLQkJCSAgc3RydWN0IHFlZGVfdHhfcXVldWUgKnR4cSwKLQkJCSAgYm9vbCBhbGxvd19kcmFpbikKKwkJCSAgc3RydWN0IHFlZGVfdHhfcXVldWUgKnR4cSwgYm9vbCBhbGxvd19kcmFpbikKIHsKIAlpbnQgcmMsIGNudCA9IDEwMDA7CiAKQEAgLTMxOTksNDUgKzMyNTksNTMgQEAKIAl9CiAKIAkvKiBGbHVzaCBUeCBxdWV1ZXMuIElmIG5lZWRlZCwgcmVxdWVzdCBkcmFpbiBmcm9tIE1DUCAqLwotCWZvcl9lYWNoX3JzcyhpKSB7CisJZm9yX2VhY2hfcXVldWUoaSkgewogCQlzdHJ1Y3QgcWVkZV9mYXN0cGF0aCAqZnAgPSAmZWRldi0+ZnBfYXJyYXlbaV07CiAKLQkJZm9yICh0YyA9IDA7IHRjIDwgZWRldi0+bnVtX3RjOyB0YysrKSB7Ci0JCQlzdHJ1Y3QgcWVkZV90eF9xdWV1ZSAqdHhxID0gJmZwLT50eHFzW3RjXTsKKwkJaWYgKGZwLT50eXBlICYgUUVERV9GQVNUUEFUSF9UWCkgeworCQkJZm9yICh0YyA9IDA7IHRjIDwgZWRldi0+bnVtX3RjOyB0YysrKSB7CisJCQkJc3RydWN0IHFlZGVfdHhfcXVldWUgKnR4cSA9ICZmcC0+dHhxc1t0Y107CiAKLQkJCXJjID0gcWVkZV9kcmFpbl90eHEoZWRldiwgdHhxLCB0cnVlKTsKLQkJCWlmIChyYykKLQkJCQlyZXR1cm4gcmM7CisJCQkJcmMgPSBxZWRlX2RyYWluX3R4cShlZGV2LCB0eHEsIHRydWUpOworCQkJCWlmIChyYykKKwkJCQkJcmV0dXJuIHJjOworCQkJfQogCQl9CiAJfQogCi0JLyogU3RvcCBhbGwgUXVldWVzIGluIHJldmVyc2Ugb3JkZXIqLwotCWZvciAoaSA9IFFFREVfUlNTX0NOVChlZGV2KSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJLyogU3RvcCBhbGwgUXVldWVzIGluIHJldmVyc2Ugb3JkZXIgKi8KKwlmb3IgKGkgPSBRRURFX1FVRVVFX0NOVChlZGV2KSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAJCXN0cnVjdCBxZWRfc3RvcF9yeHFfcGFyYW1zIHJ4X3BhcmFtczsKIAotCQkvKiBTdG9wIHRoZSBUeCBRdWV1ZShzKSovCi0JCWZvciAodGMgPSAwOyB0YyA8IGVkZXYtPm51bV90YzsgdGMrKykgewotCQkJc3RydWN0IHFlZF9zdG9wX3R4cV9wYXJhbXMgdHhfcGFyYW1zOworCQkvKiBTdG9wIHRoZSBUeCBRdWV1ZShzKSAqLworCQlpZiAoZWRldi0+ZnBfYXJyYXlbaV0udHlwZSAmIFFFREVfRkFTVFBBVEhfVFgpIHsKKwkJCWZvciAodGMgPSAwOyB0YyA8IGVkZXYtPm51bV90YzsgdGMrKykgeworCQkJCXN0cnVjdCBxZWRfc3RvcF90eHFfcGFyYW1zIHR4X3BhcmFtczsKKwkJCQl1OCB2YWw7CiAKLQkJCXR4X3BhcmFtcy5yc3NfaWQgPSBpOwotCQkJdHhfcGFyYW1zLnR4X3F1ZXVlX2lkID0gdGMgKiBRRURFX1JTU19DTlQoZWRldikgKyBpOwotCQkJcmMgPSBlZGV2LT5vcHMtPnFfdHhfc3RvcChjZGV2LCAmdHhfcGFyYW1zKTsKLQkJCWlmIChyYykgewotCQkJCURQX0VSUihlZGV2LCAiRmFpbGVkIHRvIHN0b3AgVFhRICMlZFxuIiwKLQkJCQkgICAgICAgdHhfcGFyYW1zLnR4X3F1ZXVlX2lkKTsKLQkJCQlyZXR1cm4gcmM7CisJCQkJdHhfcGFyYW1zLnJzc19pZCA9IGk7CisJCQkJdmFsID0gZWRldi0+ZnBfYXJyYXlbaV0udHhxc1t0Y10uaW5kZXg7CisJCQkJdHhfcGFyYW1zLnR4X3F1ZXVlX2lkID0gdmFsOworCQkJCXJjID0gZWRldi0+b3BzLT5xX3R4X3N0b3AoY2RldiwgJnR4X3BhcmFtcyk7CisJCQkJaWYgKHJjKSB7CisJCQkJCURQX0VSUihlZGV2LCAiRmFpbGVkIHRvIHN0b3AgVFhRICMlZFxuIiwKKwkJCQkJICAgICAgIHR4X3BhcmFtcy50eF9xdWV1ZV9pZCk7CisJCQkJCXJldHVybiByYzsKKwkJCQl9CiAJCQl9CiAJCX0KIAotCQkvKiBTdG9wIHRoZSBSeCBRdWV1ZSovCi0JCW1lbXNldCgmcnhfcGFyYW1zLCAwLCBzaXplb2YocnhfcGFyYW1zKSk7Ci0JCXJ4X3BhcmFtcy5yc3NfaWQgPSBpOwotCQlyeF9wYXJhbXMucnhfcXVldWVfaWQgPSBpOworCQkvKiBTdG9wIHRoZSBSeCBRdWV1ZSAqLworCQlpZiAoZWRldi0+ZnBfYXJyYXlbaV0udHlwZSAmIFFFREVfRkFTVFBBVEhfUlgpIHsKKwkJCW1lbXNldCgmcnhfcGFyYW1zLCAwLCBzaXplb2YocnhfcGFyYW1zKSk7CisJCQlyeF9wYXJhbXMucnNzX2lkID0gaTsKKwkJCXJ4X3BhcmFtcy5yeF9xdWV1ZV9pZCA9IGVkZXYtPmZwX2FycmF5W2ldLnJ4cS0+cnhxX2lkOwogCi0JCXJjID0gZWRldi0+b3BzLT5xX3J4X3N0b3AoY2RldiwgJnJ4X3BhcmFtcyk7Ci0JCWlmIChyYykgewotCQkJRFBfRVJSKGVkZXYsICJGYWlsZWQgdG8gc3RvcCBSWFEgIyVkXG4iLCBpKTsKLQkJCXJldHVybiByYzsKKwkJCXJjID0gZWRldi0+b3BzLT5xX3J4X3N0b3AoY2RldiwgJnJ4X3BhcmFtcyk7CisJCQlpZiAocmMpIHsKKwkJCQlEUF9FUlIoZWRldiwgIkZhaWxlZCB0byBzdG9wIFJYUSAjJWRcbiIsIGkpOworCQkJCXJldHVybiByYzsKKwkJCX0KIAkJfQogCX0KIApAQCAtMzI2MCw3ICszMzI4LDcgQEAKIAlzdHJ1Y3QgcWVkX3N0YXJ0X3Zwb3J0X3BhcmFtcyBzdGFydCA9IHswfTsKIAlib29sIHJlc2V0X3Jzc19pbmRpciA9IGZhbHNlOwogCi0JaWYgKCFlZGV2LT5udW1fcnNzKSB7CisJaWYgKCFlZGV2LT5udW1fcXVldWVzKSB7CiAJCURQX0VSUihlZGV2LAogCQkgICAgICAgIkNhbm5vdCB1cGRhdGUgVi1WUE9SVCBhcyBhY3RpdmUgYXMgdGhlcmUgYXJlIG5vIFJ4IHF1ZXVlc1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzI4NCw1MCArMzM1Miw2NiBAQAogCQkgICAiU3RhcnQgdnBvcnQgcmFtcm9kIHBhc3NlZCwgdnBvcnRfaWQgPSAlZCwgTVRVID0gJWQsIHZsYW5fcmVtb3ZhbF9lbiA9ICVkXG4iLAogCQkgICBzdGFydC52cG9ydF9pZCwgZWRldi0+bmRldi0+bXR1ICsgMHhlLCB2bGFuX3JlbW92YWxfZW4pOwogCi0JZm9yX2VhY2hfcnNzKGkpIHsKKwlmb3JfZWFjaF9xdWV1ZShpKSB7CiAJCXN0cnVjdCBxZWRlX2Zhc3RwYXRoICpmcCA9ICZlZGV2LT5mcF9hcnJheVtpXTsKLQkJZG1hX2FkZHJfdCBwaHlzX3RhYmxlID0gZnAtPnJ4cS0+cnhfY29tcF9yaW5nLnBibC5wX3BoeXNfdGFibGU7CisJCWRtYV9hZGRyX3QgcF9waHlzX3RhYmxlOworCQl1MzIgcGFnZV9jbnQ7CiAKLQkJbWVtc2V0KCZxX3BhcmFtcywgMCwgc2l6ZW9mKHFfcGFyYW1zKSk7Ci0JCXFfcGFyYW1zLnJzc19pZCA9IGk7Ci0JCXFfcGFyYW1zLnF1ZXVlX2lkID0gaTsKLQkJcV9wYXJhbXMudnBvcnRfaWQgPSAwOwotCQlxX3BhcmFtcy5zYiA9IGZwLT5zYl9pbmZvLT5pZ3Vfc2JfaWQ7Ci0JCXFfcGFyYW1zLnNiX2lkeCA9IFJYX1BJOwotCi0JCXJjID0gZWRldi0+b3BzLT5xX3J4X3N0YXJ0KGNkZXYsICZxX3BhcmFtcywKLQkJCQkJICAgZnAtPnJ4cS0+cnhfYnVmX3NpemUsCi0JCQkJCSAgIGZwLT5yeHEtPnJ4X2JkX3JpbmcucF9waHlzX2FkZHIsCi0JCQkJCSAgIHBoeXNfdGFibGUsCi0JCQkJCSAgIGZwLT5yeHEtPnJ4X2NvbXBfcmluZy5wYWdlX2NudCwKLQkJCQkJICAgJmZwLT5yeHEtPmh3X3J4cV9wcm9kX2FkZHIpOwotCQlpZiAocmMpIHsKLQkJCURQX0VSUihlZGV2LCAiU3RhcnQgUlhRICMlZCBmYWlsZWQgJWRcbiIsIGksIHJjKTsKLQkJCXJldHVybiByYzsKLQkJfQotCi0JCWZwLT5yeHEtPmh3X2NvbnNfcHRyID0gJmZwLT5zYl9pbmZvLT5zYl92aXJ0LT5waV9hcnJheVtSWF9QSV07Ci0KLQkJcWVkZV91cGRhdGVfcnhfcHJvZChlZGV2LCBmcC0+cnhxKTsKLQotCQlmb3IgKHRjID0gMDsgdGMgPCBlZGV2LT5udW1fdGM7IHRjKyspIHsKLQkJCXN0cnVjdCBxZWRlX3R4X3F1ZXVlICp0eHEgPSAmZnAtPnR4cXNbdGNdOwotCQkJaW50IHR4cV9pbmRleCA9IHRjICogUUVERV9SU1NfQ05UKGVkZXYpICsgaTsKKwkJaWYgKGZwLT50eXBlICYgUUVERV9GQVNUUEFUSF9SWCkgeworCQkJc3RydWN0IHFlZGVfcnhfcXVldWUgKnJ4cSA9IGZwLT5yeHE7CisJCQlfX2xlMTYgKnZhbDsKIAogCQkJbWVtc2V0KCZxX3BhcmFtcywgMCwgc2l6ZW9mKHFfcGFyYW1zKSk7CiAJCQlxX3BhcmFtcy5yc3NfaWQgPSBpOwotCQkJcV9wYXJhbXMucXVldWVfaWQgPSB0eHFfaW5kZXg7CisJCQlxX3BhcmFtcy5xdWV1ZV9pZCA9IHJ4cS0+cnhxX2lkOworCQkJcV9wYXJhbXMudnBvcnRfaWQgPSAwOworCQkJcV9wYXJhbXMuc2IgPSBmcC0+c2JfaW5mby0+aWd1X3NiX2lkOworCQkJcV9wYXJhbXMuc2JfaWR4ID0gUlhfUEk7CisKKwkJCXBfcGh5c190YWJsZSA9CisJCQkgICAgcWVkX2NoYWluX2dldF9wYmxfcGh5cygmcnhxLT5yeF9jb21wX3JpbmcpOworCQkJcGFnZV9jbnQgPSBxZWRfY2hhaW5fZ2V0X3BhZ2VfY250KCZyeHEtPnJ4X2NvbXBfcmluZyk7CisKKwkJCXJjID0gZWRldi0+b3BzLT5xX3J4X3N0YXJ0KGNkZXYsICZxX3BhcmFtcywKKwkJCQkJCSAgIHJ4cS0+cnhfYnVmX3NpemUsCisJCQkJCQkgICByeHEtPnJ4X2JkX3JpbmcucF9waHlzX2FkZHIsCisJCQkJCQkgICBwX3BoeXNfdGFibGUsCisJCQkJCQkgICBwYWdlX2NudCwKKwkJCQkJCSAgICZyeHEtPmh3X3J4cV9wcm9kX2FkZHIpOworCQkJaWYgKHJjKSB7CisJCQkJRFBfRVJSKGVkZXYsICJTdGFydCBSWFEgIyVkIGZhaWxlZCAlZFxuIiwgaSwKKwkJCQkgICAgICAgcmMpOworCQkJCXJldHVybiByYzsKKwkJCX0KKworCQkJdmFsID0gJmZwLT5zYl9pbmZvLT5zYl92aXJ0LT5waV9hcnJheVtSWF9QSV07CisJCQlyeHEtPmh3X2NvbnNfcHRyID0gdmFsOworCisJCQlxZWRlX3VwZGF0ZV9yeF9wcm9kKGVkZXYsIHJ4cSk7CisJCX0KKworCQlpZiAoIShmcC0+dHlwZSAmIFFFREVfRkFTVFBBVEhfVFgpKQorCQkJY29udGludWU7CisKKwkJZm9yICh0YyA9IDA7IHRjIDwgZWRldi0+bnVtX3RjOyB0YysrKSB7CisJCQlzdHJ1Y3QgcWVkZV90eF9xdWV1ZSAqdHhxID0gJmZwLT50eHFzW3RjXTsKKworCQkJcF9waHlzX3RhYmxlID0gcWVkX2NoYWluX2dldF9wYmxfcGh5cygmdHhxLT50eF9wYmwpOworCQkJcGFnZV9jbnQgPSBxZWRfY2hhaW5fZ2V0X3BhZ2VfY250KCZ0eHEtPnR4X3BibCk7CisKKwkJCW1lbXNldCgmcV9wYXJhbXMsIDAsIHNpemVvZihxX3BhcmFtcykpOworCQkJcV9wYXJhbXMucnNzX2lkID0gaTsKKwkJCXFfcGFyYW1zLnF1ZXVlX2lkID0gdHhxLT5pbmRleDsKIAkJCXFfcGFyYW1zLnZwb3J0X2lkID0gMDsKIAkJCXFfcGFyYW1zLnNiID0gZnAtPnNiX2luZm8tPmlndV9zYl9pZDsKIAkJCXFfcGFyYW1zLnNiX2lkeCA9IFRYX1BJKHRjKTsKIAogCQkJcmMgPSBlZGV2LT5vcHMtPnFfdHhfc3RhcnQoY2RldiwgJnFfcGFyYW1zLAotCQkJCQkJICAgdHhxLT50eF9wYmwucGJsLnBfcGh5c190YWJsZSwKLQkJCQkJCSAgIHR4cS0+dHhfcGJsLnBhZ2VfY250LAorCQkJCQkJICAgcF9waHlzX3RhYmxlLCBwYWdlX2NudCwKIAkJCQkJCSAgICZ0eHEtPmRvb3JiZWxsX2FkZHIpOwogCQkJaWYgKHJjKSB7CiAJCQkJRFBfRVJSKGVkZXYsICJTdGFydCBUWFEgIyVkIGZhaWxlZCAlZFxuIiwKLQkJCQkgICAgICAgdHhxX2luZGV4LCByYyk7CisJCQkJICAgICAgIHR4cS0+aW5kZXgsIHJjKTsKIAkJCQlyZXR1cm4gcmM7CiAJCQl9CiAKQEAgLTMzNTgsMTMgKzM0NDIsMTMgQEAKIAl9CiAKIAkvKiBGaWxsIHN0cnVjdCB3aXRoIFJTUyBwYXJhbXMgKi8KLQlpZiAoUUVERV9SU1NfQ05UKGVkZXYpID4gMSkgeworCWlmIChRRURFX1JTU19DT1VOVChlZGV2KSA+IDEpIHsKIAkJdnBvcnRfdXBkYXRlX3BhcmFtcy51cGRhdGVfcnNzX2ZsZyA9IDE7CiAKIAkJLyogTmVlZCB0byB2YWxpZGF0ZSBjdXJyZW50IFJTUyBjb25maWcgdXNlcyB2YWxpZCBlbnRyaWVzICovCiAJCWZvciAoaSA9IDA7IGkgPCBRRURfUlNTX0lORF9UQUJMRV9TSVpFOyBpKyspIHsKIAkJCWlmIChlZGV2LT5yc3NfcGFyYW1zLnJzc19pbmRfdGFibGVbaV0gPj0KLQkJCSAgICBlZGV2LT5udW1fcnNzKSB7CisJCQkgICAgUUVERV9SU1NfQ09VTlQoZWRldikpIHsKIAkJCQlyZXNldF9yc3NfaW5kaXIgPSB0cnVlOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMzM3Nyw3ICszNDYxLDcgQEAKIAkJCWZvciAoaSA9IDA7IGkgPCBRRURfUlNTX0lORF9UQUJMRV9TSVpFOyBpKyspIHsKIAkJCQl1MTYgaW5kaXJfdmFsOwogCi0JCQkJdmFsID0gUUVERV9SU1NfQ05UKGVkZXYpOworCQkJCXZhbCA9IFFFREVfUlNTX0NPVU5UKGVkZXYpOwogCQkJCWluZGlyX3ZhbCA9IGV0aHRvb2xfcnhmaF9pbmRpcl9kZWZhdWx0KGksIHZhbCk7CiAJCQkJZWRldi0+cnNzX3BhcmFtcy5yc3NfaW5kX3RhYmxlW2ldID0gaW5kaXJfdmFsOwogCQkJfQpAQCAtMzQ0Myw2ICszNTI3LDcgQEAKIAogCURQX0lORk8oZWRldiwgIlN0YXJ0aW5nIHFlZGUgdW5sb2FkXG4iKTsKIAorCXFlZGVfcm9jZV9kZXZfZXZlbnRfY2xvc2UoZWRldik7CiAJbXV0ZXhfbG9jaygmZWRldi0+cWVkZV9sb2NrKTsKIAllZGV2LT5zdGF0ZSA9IFFFREVfU1RBVEVfQ0xPU0VEOwogCkBAIC0zNTA2LDcgKzM1OTEsNyBAQAogCWlmIChyYykKIAkJZ290byBlcnIxOwogCURQX0lORk8oZWRldiwgIkFsbG9jYXRlZCAlZCBSU1MgcXVldWVzIG9uICVkIFRDL3NcbiIsCi0JCVFFREVfUlNTX0NOVChlZGV2KSwgZWRldi0+bnVtX3RjKTsKKwkJUUVERV9RVUVVRV9DTlQoZWRldiksIGVkZXYtPm51bV90Yyk7CiAKIAlyYyA9IHFlZGVfc2V0X3JlYWxfbnVtX3F1ZXVlcyhlZGV2KTsKIAlpZiAocmMpCkBAIC0zNTQzLDYgKzM2MjgsNyBAQAogCS8qIFF1ZXJ5IHdoZXRoZXIgbGluayBpcyBhbHJlYWR5LXVwICovCiAJbWVtc2V0KCZsaW5rX291dHB1dCwgMCwgc2l6ZW9mKGxpbmtfb3V0cHV0KSk7CiAJZWRldi0+b3BzLT5jb21tb24tPmdldF9saW5rKGVkZXYtPmNkZXYsICZsaW5rX291dHB1dCk7CisJcWVkZV9yb2NlX2Rldl9ldmVudF9vcGVuKGVkZXYpOwogCXFlZGVfbGlua191cGRhdGUoZWRldiwgJmxpbmtfb3V0cHV0KTsKIAogCURQX0lORk8oZWRldiwgIkVuZGluZyBzdWNjZXNzZnVsbHkgcWVkZSBsb2FkXG4iKTsKQEAgLTM1NTksNyArMzY0NSw5IEBACiBlcnIxOgogCWVkZXYtPm9wcy0+Y29tbW9uLT5zZXRfZnBfaW50KGVkZXYtPmNkZXYsIDApOwogCXFlZGVfZnJlZV9mcF9hcnJheShlZGV2KTsKLQllZGV2LT5udW1fcnNzID0gMDsKKwllZGV2LT5udW1fcXVldWVzID0gMDsKKwllZGV2LT5mcF9udW1fdHggPSAwOworCWVkZXYtPmZwX251bV9yeCA9IDA7CiBlcnIwOgogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWRlL3FlZGVfcm9jZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZGUvcWVkZV9yb2NlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg2N2Y5NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWRlL3FlZGVfcm9jZS5jCkBAIC0wLDAgKzEsMzE0IEBACisvKiBRTG9naWMgcWVkciBOSUMgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiAgUUxvZ2ljIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZCAvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9xZWQvcWVkZV9yb2NlLmg+CisjaW5jbHVkZSAicWVkZS5oIgorCitzdGF0aWMgc3RydWN0IHFlZHJfZHJpdmVyICpxZWRyX2RydjsKK3N0YXRpYyBMSVNUX0hFQUQocWVkcl9kZXZfbGlzdCk7CitzdGF0aWMgREVGSU5FX01VVEVYKHFlZHJfZGV2X2xpc3RfbG9jayk7CisKK2Jvb2wgcWVkZV9yb2NlX3N1cHBvcnRlZChzdHJ1Y3QgcWVkZV9kZXYgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5kZXZfaW5mby5jb21tb24ucmRtYV9zdXBwb3J0ZWQ7Cit9CisKK3N0YXRpYyB2b2lkIF9xZWRlX3JvY2VfZGV2X2FkZChzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYpCit7CisJaWYgKCFxZWRyX2RydikKKwkJcmV0dXJuOworCisJZWRldi0+cmRtYV9pbmZvLnFlZHJfZGV2ID0gcWVkcl9kcnYtPmFkZChlZGV2LT5jZGV2LCBlZGV2LT5wZGV2LAorCQkJCQkJIGVkZXYtPm5kZXYpOworfQorCitzdGF0aWMgaW50IHFlZGVfcm9jZV9jcmVhdGVfd3Eoc3RydWN0IHFlZGVfZGV2ICplZGV2KQoreworCUlOSVRfTElTVF9IRUFEKCZlZGV2LT5yZG1hX2luZm8ucm9jZV9ldmVudF9saXN0KTsKKwllZGV2LT5yZG1hX2luZm8ucm9jZV93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJyb2NlX3dxIik7CisJaWYgKCFlZGV2LT5yZG1hX2luZm8ucm9jZV93cSkgeworCQlEUF9OT1RJQ0UoZWRldiwgInFlZHI6IENvdWxkIG5vdCBjcmVhdGUgd29ya3F1ZXVlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHFlZGVfcm9jZV9jbGVhbnVwX2V2ZW50KHN0cnVjdCBxZWRlX2RldiAqZWRldikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmVkZXYtPnJkbWFfaW5mby5yb2NlX2V2ZW50X2xpc3Q7CisJc3RydWN0IHFlZGVfcm9jZV9ldmVudF93b3JrICpldmVudF9ub2RlOworCisJZmx1c2hfd29ya3F1ZXVlKGVkZXYtPnJkbWFfaW5mby5yb2NlX3dxKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJZXZlbnRfbm9kZSA9IGxpc3RfZW50cnkoaGVhZC0+bmV4dCwgc3RydWN0IHFlZGVfcm9jZV9ldmVudF93b3JrLAorCQkJCQlsaXN0KTsKKwkJY2FuY2VsX3dvcmtfc3luYygmZXZlbnRfbm9kZS0+d29yayk7CisJCWxpc3RfZGVsKCZldmVudF9ub2RlLT5saXN0KTsKKwkJa2ZyZWUoZXZlbnRfbm9kZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBxZWRlX3JvY2VfZGVzdHJveV93cShzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYpCit7CisJcWVkZV9yb2NlX2NsZWFudXBfZXZlbnQoZWRldik7CisJZGVzdHJveV93b3JrcXVldWUoZWRldi0+cmRtYV9pbmZvLnJvY2Vfd3EpOworfQorCitpbnQgcWVkZV9yb2NlX2Rldl9hZGQoc3RydWN0IHFlZGVfZGV2ICplZGV2KQoreworCWludCByYyA9IDA7CisKKwlpZiAocWVkZV9yb2NlX3N1cHBvcnRlZChlZGV2KSkgeworCQlyYyA9IHFlZGVfcm9jZV9jcmVhdGVfd3EoZWRldik7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlJTklUX0xJU1RfSEVBRCgmZWRldi0+cmRtYV9pbmZvLmVudHJ5KTsKKwkJbXV0ZXhfbG9jaygmcWVkcl9kZXZfbGlzdF9sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmZWRldi0+cmRtYV9pbmZvLmVudHJ5LCAmcWVkcl9kZXZfbGlzdCk7CisJCV9xZWRlX3JvY2VfZGV2X2FkZChlZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZxZWRyX2Rldl9saXN0X2xvY2spOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX3FlZGVfcm9jZV9kZXZfcmVtb3ZlKHN0cnVjdCBxZWRlX2RldiAqZWRldikKK3sKKwlpZiAocWVkcl9kcnYgJiYgcWVkcl9kcnYtPnJlbW92ZSAmJiBlZGV2LT5yZG1hX2luZm8ucWVkcl9kZXYpCisJCXFlZHJfZHJ2LT5yZW1vdmUoZWRldi0+cmRtYV9pbmZvLnFlZHJfZGV2KTsKKwllZGV2LT5yZG1hX2luZm8ucWVkcl9kZXYgPSBOVUxMOworfQorCit2b2lkIHFlZGVfcm9jZV9kZXZfcmVtb3ZlKHN0cnVjdCBxZWRlX2RldiAqZWRldikKK3sKKwlpZiAoIXFlZGVfcm9jZV9zdXBwb3J0ZWQoZWRldikpCisJCXJldHVybjsKKworCXFlZGVfcm9jZV9kZXN0cm95X3dxKGVkZXYpOworCW11dGV4X2xvY2soJnFlZHJfZGV2X2xpc3RfbG9jayk7CisJX3FlZGVfcm9jZV9kZXZfcmVtb3ZlKGVkZXYpOworCWxpc3RfZGVsKCZlZGV2LT5yZG1hX2luZm8uZW50cnkpOworCW11dGV4X3VubG9jaygmcWVkcl9kZXZfbGlzdF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgX3FlZGVfcm9jZV9kZXZfb3BlbihzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYpCit7CisJaWYgKHFlZHJfZHJ2ICYmIGVkZXYtPnJkbWFfaW5mby5xZWRyX2RldiAmJiBxZWRyX2Rydi0+bm90aWZ5KQorCQlxZWRyX2Rydi0+bm90aWZ5KGVkZXYtPnJkbWFfaW5mby5xZWRyX2RldiwgUUVERV9VUCk7Cit9CisKK3N0YXRpYyB2b2lkIHFlZGVfcm9jZV9kZXZfb3BlbihzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYpCit7CisJaWYgKCFxZWRlX3JvY2Vfc3VwcG9ydGVkKGVkZXYpKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZxZWRyX2Rldl9saXN0X2xvY2spOworCV9xZWRlX3JvY2VfZGV2X29wZW4oZWRldik7CisJbXV0ZXhfdW5sb2NrKCZxZWRyX2Rldl9saXN0X2xvY2spOworfQorCitzdGF0aWMgdm9pZCBfcWVkZV9yb2NlX2Rldl9jbG9zZShzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYpCit7CisJaWYgKHFlZHJfZHJ2ICYmIGVkZXYtPnJkbWFfaW5mby5xZWRyX2RldiAmJiBxZWRyX2Rydi0+bm90aWZ5KQorCQlxZWRyX2Rydi0+bm90aWZ5KGVkZXYtPnJkbWFfaW5mby5xZWRyX2RldiwgUUVERV9ET1dOKTsKK30KKworc3RhdGljIHZvaWQgcWVkZV9yb2NlX2Rldl9jbG9zZShzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYpCit7CisJaWYgKCFxZWRlX3JvY2Vfc3VwcG9ydGVkKGVkZXYpKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZxZWRyX2Rldl9saXN0X2xvY2spOworCV9xZWRlX3JvY2VfZGV2X2Nsb3NlKGVkZXYpOworCW11dGV4X3VubG9jaygmcWVkcl9kZXZfbGlzdF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgcWVkZV9yb2NlX2Rldl9zaHV0ZG93bihzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYpCit7CisJaWYgKCFxZWRlX3JvY2Vfc3VwcG9ydGVkKGVkZXYpKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZxZWRyX2Rldl9saXN0X2xvY2spOworCWlmIChxZWRyX2RydiAmJiBlZGV2LT5yZG1hX2luZm8ucWVkcl9kZXYgJiYgcWVkcl9kcnYtPm5vdGlmeSkKKwkJcWVkcl9kcnYtPm5vdGlmeShlZGV2LT5yZG1hX2luZm8ucWVkcl9kZXYsIFFFREVfQ0xPU0UpOworCW11dGV4X3VubG9jaygmcWVkcl9kZXZfbGlzdF9sb2NrKTsKK30KKworaW50IHFlZGVfcm9jZV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHFlZHJfZHJpdmVyICpkcnYpCit7CisJc3RydWN0IHFlZGVfZGV2ICplZGV2OworCXU4IHFlZHJfY291bnRlciA9IDA7CisKKwltdXRleF9sb2NrKCZxZWRyX2Rldl9saXN0X2xvY2spOworCWlmIChxZWRyX2RydikgeworCQltdXRleF91bmxvY2soJnFlZHJfZGV2X2xpc3RfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlxZWRyX2RydiA9IGRydjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZWRldiwgJnFlZHJfZGV2X2xpc3QsIHJkbWFfaW5mby5lbnRyeSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKworCQlxZWRyX2NvdW50ZXIrKzsKKwkJX3FlZGVfcm9jZV9kZXZfYWRkKGVkZXYpOworCQluZGV2ID0gZWRldi0+bmRldjsKKwkJaWYgKG5ldGlmX3J1bm5pbmcobmRldikgJiYgbmV0aWZfb3Blcl91cChuZGV2KSkKKwkJCV9xZWRlX3JvY2VfZGV2X29wZW4oZWRldik7CisJfQorCW11dGV4X3VubG9jaygmcWVkcl9kZXZfbGlzdF9sb2NrKTsKKworCURQX0lORk8oZWRldiwgInFlZHI6IGRpc2NvdmVyZWQgYW5kIHJlZ2lzdGVyZWQgJWQgUm9DRSBmdW5jc1xuIiwKKwkJcWVkcl9jb3VudGVyKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChxZWRlX3JvY2VfcmVnaXN0ZXJfZHJpdmVyKTsKKwordm9pZCBxZWRlX3JvY2VfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHFlZHJfZHJpdmVyICpkcnYpCit7CisJc3RydWN0IHFlZGVfZGV2ICplZGV2OworCisJbXV0ZXhfbG9jaygmcWVkcl9kZXZfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVkZXYsICZxZWRyX2Rldl9saXN0LCByZG1hX2luZm8uZW50cnkpIHsKKwkJaWYgKGVkZXYtPnJkbWFfaW5mby5xZWRyX2RldikKKwkJCV9xZWRlX3JvY2VfZGV2X3JlbW92ZShlZGV2KTsKKwl9CisJcWVkcl9kcnYgPSBOVUxMOworCW11dGV4X3VubG9jaygmcWVkcl9kZXZfbGlzdF9sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0wocWVkZV9yb2NlX3VucmVnaXN0ZXJfZHJpdmVyKTsKKworc3RhdGljIHZvaWQgcWVkZV9yb2NlX2NoYW5nZWFkZHIoc3RydWN0IHFlZGVfZGV2ICplZGV2KQoreworCWlmICghcWVkZV9yb2NlX3N1cHBvcnRlZChlZGV2KSkKKwkJcmV0dXJuOworCisJaWYgKHFlZHJfZHJ2ICYmIGVkZXYtPnJkbWFfaW5mby5xZWRyX2RldiAmJiBxZWRyX2Rydi0+bm90aWZ5KQorCQlxZWRyX2Rydi0+bm90aWZ5KGVkZXYtPnJkbWFfaW5mby5xZWRyX2RldiwgUUVERV9DSEFOR0VfQUREUik7Cit9CisKK3N0cnVjdCBxZWRlX3JvY2VfZXZlbnRfd29yayAqcWVkZV9yb2NlX2dldF9mcmVlX2V2ZW50X25vZGUoc3RydWN0IHFlZGVfZGV2CisJCQkJCQkJICAgKmVkZXYpCit7CisJc3RydWN0IHFlZGVfcm9jZV9ldmVudF93b3JrICpldmVudF9ub2RlID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0X25vZGUgPSBOVUxMOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKworCWxpc3RfZm9yX2VhY2gobGlzdF9ub2RlLCAmZWRldi0+cmRtYV9pbmZvLnJvY2VfZXZlbnRfbGlzdCkgeworCQlldmVudF9ub2RlID0gbGlzdF9lbnRyeShsaXN0X25vZGUsIHN0cnVjdCBxZWRlX3JvY2VfZXZlbnRfd29yaywKKwkJCQkJbGlzdCk7CisJCWlmICghd29ya19wZW5kaW5nKCZldmVudF9ub2RlLT53b3JrKSkgeworCQkJZm91bmQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKSB7CisJCWV2ZW50X25vZGUgPSBremFsbG9jKHNpemVvZigqZXZlbnRfbm9kZSksIEdGUF9LRVJORUwpOworCQlpZiAoIWV2ZW50X25vZGUpIHsKKwkJCURQX05PVElDRShlZGV2LAorCQkJCSAgInFlZHI6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJvY2Ugd29ya1xuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlsaXN0X2FkZF90YWlsKCZldmVudF9ub2RlLT5saXN0LAorCQkJICAgICAgJmVkZXYtPnJkbWFfaW5mby5yb2NlX2V2ZW50X2xpc3QpOworCX0KKworCXJldHVybiBldmVudF9ub2RlOworfQorCitzdGF0aWMgdm9pZCBxZWRlX3JvY2VfaGFuZGxlX2V2ZW50KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcWVkZV9yb2NlX2V2ZW50X3dvcmsgKmV2ZW50X25vZGU7CisJZW51bSBxZWRlX3JvY2VfZXZlbnQgZXZlbnQ7CisJc3RydWN0IHFlZGVfZGV2ICplZGV2OworCisJZXZlbnRfbm9kZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcWVkZV9yb2NlX2V2ZW50X3dvcmssIHdvcmspOworCWV2ZW50ID0gZXZlbnRfbm9kZS0+ZXZlbnQ7CisJZWRldiA9IGV2ZW50X25vZGUtPnB0cjsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFFFREVfVVA6CisJCXFlZGVfcm9jZV9kZXZfb3BlbihlZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBRRURFX0RPV046CisJCXFlZGVfcm9jZV9kZXZfY2xvc2UoZWRldik7CisJCWJyZWFrOworCWNhc2UgUUVERV9DTE9TRToKKwkJcWVkZV9yb2NlX2Rldl9zaHV0ZG93bihlZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBRRURFX0NIQU5HRV9BRERSOgorCQlxZWRlX3JvY2VfY2hhbmdlYWRkcihlZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFBfTk9USUNFKGVkZXYsICJJbnZhbGlkIHJvY2UgZXZlbnQgJWQiLCBldmVudCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBxZWRlX3JvY2VfYWRkX2V2ZW50KHN0cnVjdCBxZWRlX2RldiAqZWRldiwKKwkJCQllbnVtIHFlZGVfcm9jZV9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgcWVkZV9yb2NlX2V2ZW50X3dvcmsgKmV2ZW50X25vZGU7CisKKwlpZiAoIWVkZXYtPnJkbWFfaW5mby5xZWRyX2RldikKKwkJcmV0dXJuOworCisJZXZlbnRfbm9kZSA9IHFlZGVfcm9jZV9nZXRfZnJlZV9ldmVudF9ub2RlKGVkZXYpOworCWlmICghZXZlbnRfbm9kZSkKKwkJcmV0dXJuOworCisJZXZlbnRfbm9kZS0+ZXZlbnQgPSBldmVudDsKKwlldmVudF9ub2RlLT5wdHIgPSBlZGV2OworCisJSU5JVF9XT1JLKCZldmVudF9ub2RlLT53b3JrLCBxZWRlX3JvY2VfaGFuZGxlX2V2ZW50KTsKKwlxdWV1ZV93b3JrKGVkZXYtPnJkbWFfaW5mby5yb2NlX3dxLCAmZXZlbnRfbm9kZS0+d29yayk7Cit9CisKK3ZvaWQgcWVkZV9yb2NlX2Rldl9ldmVudF9vcGVuKHN0cnVjdCBxZWRlX2RldiAqZWRldikKK3sKKwlxZWRlX3JvY2VfYWRkX2V2ZW50KGVkZXYsIFFFREVfVVApOworfQorCit2b2lkIHFlZGVfcm9jZV9kZXZfZXZlbnRfY2xvc2Uoc3RydWN0IHFlZGVfZGV2ICplZGV2KQoreworCXFlZGVfcm9jZV9hZGRfZXZlbnQoZWRldiwgUUVERV9ET1dOKTsKK30KKwordm9pZCBxZWRlX3JvY2VfZXZlbnRfY2hhbmdlYWRkcihzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYpCit7CisJcWVkZV9yb2NlX2FkZF9ldmVudChlZGV2LCBRRURFX0NIQU5HRV9BRERSKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pYy5oCmluZGV4IGZkOTczZjQuLjQ5YmFkMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWMuaApAQCAtMzcsOCArMzcsOCBAQAogCiAjZGVmaW5lIF9RTENOSUNfTElOVVhfTUFKT1IgNQogI2RlZmluZSBfUUxDTklDX0xJTlVYX01JTk9SIDMKLSNkZWZpbmUgX1FMQ05JQ19MSU5VWF9TVUJWRVJTSU9OIDY0Ci0jZGVmaW5lIFFMQ05JQ19MSU5VWF9WRVJTSU9OSUQgICI1LjMuNjQiCisjZGVmaW5lIF9RTENOSUNfTElOVVhfU1VCVkVSU0lPTiA2NQorI2RlZmluZSBRTENOSUNfTElOVVhfVkVSU0lPTklEICAiNS4zLjY1IgogI2RlZmluZSBRTENOSUNfRFJWX0lEQ19WRVIgIDB4MDEKICNkZWZpbmUgUUxDTklDX0RSSVZFUl9WRVJTSU9OICAoKF9RTENOSUNfTElOVVhfTUFKT1IgPDwgMTYpIHxcCiAJCSAoX1FMQ05JQ19MSU5VWF9NSU5PUiA8PCA4KSB8IChfUUxDTklDX0xJTlVYX1NVQlZFUlNJT04pKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfaW8uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX2lvLmMKaW5kZXggODdjNjQyZC4uZmVkZDczNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfaW8uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19pby5jCkBAIC0xMDIsNyArMTAyLDYgQEAKICNkZWZpbmUgUUxDTklDX1JFU1BPTlNFX0RFU0MJMHgwNQogI2RlZmluZSBRTENOSUNfTFJPX0RFU0MgIAkweDEyCiAKLSNkZWZpbmUgUUxDTklDX1RYX1BPTExfQlVER0VUCQkxMjgKICNkZWZpbmUgUUxDTklDX1RDUF9IRFJfU0laRQkJMjAKICNkZWZpbmUgUUxDTklDX1RDUF9UU19PUFRJT05fU0laRQkxMgogI2RlZmluZSBRTENOSUNfRkVUQ0hfUklOR19JRChoYW5kbGUpCSgoaGFuZGxlKSA+PiA2MykKQEAgLTIwMDgsNyArMjAwNyw2IEBACiAJc3RydWN0IHFsY25pY19ob3N0X3R4X3JpbmcgKnR4X3Jpbmc7CiAJc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyOwogCi0JYnVkZ2V0ID0gUUxDTklDX1RYX1BPTExfQlVER0VUOwogCXR4X3JpbmcgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IHFsY25pY19ob3N0X3R4X3JpbmcsIG5hcGkpOwogCWFkYXB0ZXIgPSB0eF9yaW5nLT5hZGFwdGVyOwogCXdvcmtfZG9uZSA9IHFsY25pY19wcm9jZXNzX2NtZF9yaW5nKGFkYXB0ZXIsIHR4X3JpbmcsIGJ1ZGdldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19tYWluLmMKaW5kZXggM2ViZWYyNy4uM2FlMzk2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX21haW4uYwpAQCAtNDMyLDE4ICs0MzIsMTkgQEAKIAogc3RhdGljIGludCBxbGNuaWNfZmRiX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKm5jYiwKIAkJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQlzdHJ1Y3QgbmV0X2RldmljZSAqZmlsdGVyX2RldiwgaW50IGlkeCkKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpmaWx0ZXJfZGV2LCBpbnQgKmlkeCkKIHsKIAlzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBlcnIgPSAwOwogCiAJaWYgKCFhZGFwdGVyLT5mZGJfbWFjX2xlYXJuKQogCQlyZXR1cm4gbmRvX2RmbHRfZmRiX2R1bXAoc2tiLCBuY2IsIG5ldGRldiwgZmlsdGVyX2RldiwgaWR4KTsKIAogCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiBRTENOSUNfRVNXSVRDSF9FTkFCTEVEKSB8fAogCSAgICBxbGNuaWNfc3Jpb3ZfY2hlY2soYWRhcHRlcikpCi0JCWlkeCA9IG5kb19kZmx0X2ZkYl9kdW1wKHNrYiwgbmNiLCBuZXRkZXYsIGZpbHRlcl9kZXYsIGlkeCk7CisJCWVyciA9IG5kb19kZmx0X2ZkYl9kdW1wKHNrYiwgbmNiLCBuZXRkZXYsIGZpbHRlcl9kZXYsIGlkeCk7CiAKLQlyZXR1cm4gaWR4OworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIHFsY25pY184Mnh4X2NhbmNlbF9pZGNfd29yayhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfc3Jpb3YuaAppbmRleCAwMTdkOGMyYy4uNWYzMjc2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfc3Jpb3YuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdi5oCkBAIC0xNTYsMTAgKzE1Niw4IEBACiAJc3BpbmxvY2tfdAkJCXZsYW5fbGlzdF9sb2NrOwkvKiBMb2NrIGZvciBWTEFOIGxpc3QgKi8KIH07CiAKLXN0cnVjdCBxbGNuaWNfYXN5bmNfd29ya19saXN0IHsKK3N0cnVjdCBxbGNuaWNfYXN5bmNfY21kIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CXdvcms7Ci0Jdm9pZAkJCSpwdHI7CiAJc3RydWN0IHFsY25pY19jbWRfYXJncwkqY21kOwogfTsKIApAQCAtMTY4LDcgKzE2NiwxMCBAQAogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpiY190cmFuc193cTsKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYmNfYXN5bmNfd3E7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJjX2Zscl93cTsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWFzeW5jX2xpc3Q7CisJc3RydWN0IHFsY25pY19hZGFwdGVyCSphZGFwdGVyOworCXN0cnVjdCBsaXN0X2hlYWQJYXN5bmNfY21kX2xpc3Q7CisJc3RydWN0IHdvcmtfc3RydWN0CXZmX2FzeW5jX3dvcms7CisJc3BpbmxvY2tfdAkJcXVldWVfbG9jazsgLyogYXN5bmNfY21kX2xpc3QgcXVldWUgbG9jayAqLwogfTsKIAogc3RydWN0IHFsY25pY19zcmlvdiB7CkBAIC0yMzcsNyArMjM4LDcgQEAKIGludCBxbGNuaWNfc3Jpb3Zfc2V0X3ZmX3R4X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50LCBpbnQsIGludCk7CiBpbnQgcWxjbmljX3NyaW92X2dldF92Zl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50ICwKIAkJCSAgICAgICBzdHJ1Y3QgaWZsYV92Zl9pbmZvICopOwotaW50IHFsY25pY19zcmlvdl9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIHUxNiwgdTgpOworaW50IHFsY25pY19zcmlvdl9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIHUxNiwgdTgsIF9fYmUxNik7CiBpbnQgcWxjbmljX3NyaW92X3NldF92Zl9zcG9vZmNoayhzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIGJvb2wpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBxbGNuaWNfc3Jpb3ZfcGZfZGlzYWJsZShzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpIHt9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdl9jb21tb24uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX3NyaW92X2NvbW1vbi5jCmluZGV4IDczMjdiNzIuLmQ3MTA3MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX3NyaW92X2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX3NyaW92X2NvbW1vbi5jCkBAIC0yOSw2ICsyOSw3IEBACiAjZGVmaW5lIFFMQ184M1hYX1ZGX1JFU0VUX0ZBSUxfVEhSRVNICTgKICNkZWZpbmUgUUxDX0JDX0NNRF9NQVhfUkVUUllfQ05UCTUKIAorc3RhdGljIHZvaWQgcWxjbmljX3NyaW92X2hhbmRsZV9hc3luY19pc3N1ZV9jbWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHN0YXRpYyB2b2lkIHFsY25pY19zcmlvdl92Zl9mcmVlX21hY19saXN0KHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqKTsKIHN0YXRpYyBpbnQgcWxjbmljX3NyaW92X2FsbG9jX2JjX21ieF9hcmdzKHN0cnVjdCBxbGNuaWNfY21kX2FyZ3MgKiwgdTMyKTsKIHN0YXRpYyB2b2lkIHFsY25pY19zcmlvdl92Zl9wb2xsX2Rldl9zdGF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CkBAIC0xNzcsNyArMTc4LDEwIEBACiAJfQogCiAJYmMtPmJjX2FzeW5jX3dxID0gIHdxOwotCUlOSVRfTElTVF9IRUFEKCZiYy0+YXN5bmNfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJjLT5hc3luY19jbWRfbGlzdCk7CisJSU5JVF9XT1JLKCZiYy0+dmZfYXN5bmNfd29yaywgcWxjbmljX3NyaW92X2hhbmRsZV9hc3luY19pc3N1ZV9jbWQpOworCXNwaW5fbG9ja19pbml0KCZiYy0+cXVldWVfbG9jayk7CisJYmMtPmFkYXB0ZXIgPSBhZGFwdGVyOwogCiAJZm9yIChpID0gMDsgaSA8IG51bV92ZnM7IGkrKykgewogCQl2ZiA9ICZzcmlvdi0+dmZfaW5mb1tpXTsKQEAgLTE1MTcsMTcgKzE1MjEsMjEgQEAKIAogdm9pZCBxbGNuaWNfc3Jpb3ZfY2xlYW51cF9hc3luY19saXN0KHN0cnVjdCBxbGNuaWNfYmFja19jaGFubmVsICpiYykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmJjLT5hc3luY19saXN0OwotCXN0cnVjdCBxbGNuaWNfYXN5bmNfd29ya19saXN0ICplbnRyeTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmJjLT5hc3luY19jbWRfbGlzdDsKKwlzdHJ1Y3QgcWxjbmljX2FzeW5jX2NtZCAqZW50cnk7CiAKIAlmbHVzaF93b3JrcXVldWUoYmMtPmJjX2FzeW5jX3dxKTsKKwljYW5jZWxfd29ya19zeW5jKCZiYy0+dmZfYXN5bmNfd29yayk7CisKKwlzcGluX2xvY2soJmJjLT5xdWV1ZV9sb2NrKTsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKLQkJZW50cnkgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIHN0cnVjdCBxbGNuaWNfYXN5bmNfd29ya19saXN0LAorCQllbnRyeSA9IGxpc3RfZW50cnkoaGVhZC0+bmV4dCwgc3RydWN0IHFsY25pY19hc3luY19jbWQsCiAJCQkJICAgbGlzdCk7Ci0JCWNhbmNlbF93b3JrX3N5bmMoJmVudHJ5LT53b3JrKTsKIAkJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKwkJa2ZyZWUoZW50cnktPmNtZCk7CiAJCWtmcmVlKGVudHJ5KTsKIAl9CisJc3Bpbl91bmxvY2soJmJjLT5xdWV1ZV9sb2NrKTsKIH0KIAogdm9pZCBxbGNuaWNfc3Jpb3ZfdmZfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCkBAIC0xNTg3LDU3ICsxNTk1LDY0IEBACiAKIHN0YXRpYyB2b2lkIHFsY25pY19zcmlvdl9oYW5kbGVfYXN5bmNfaXNzdWVfY21kKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgcWxjbmljX2FzeW5jX3dvcmtfbGlzdCAqZW50cnk7Ci0Jc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBxbGNuaWNfYXN5bmNfY21kICplbnRyeSwgKnRtcDsKKwlzdHJ1Y3QgcWxjbmljX2JhY2tfY2hhbm5lbCAqYmM7CiAJc3RydWN0IHFsY25pY19jbWRfYXJncyAqY21kOworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisJTElTVF9IRUFEKGRlbF9saXN0KTsKIAotCWVudHJ5ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBxbGNuaWNfYXN5bmNfd29ya19saXN0LCB3b3JrKTsKLQlhZGFwdGVyID0gZW50cnktPnB0cjsKLQljbWQgPSBlbnRyeS0+Y21kOwotCV9fcWxjbmljX3NyaW92X2lzc3VlX2NtZChhZGFwdGVyLCBjbWQpOworCWJjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBxbGNuaWNfYmFja19jaGFubmVsLCB2Zl9hc3luY193b3JrKTsKKwloZWFkID0gJmJjLT5hc3luY19jbWRfbGlzdDsKKworCXNwaW5fbG9jaygmYmMtPnF1ZXVlX2xvY2spOworCWxpc3Rfc3BsaWNlX2luaXQoaGVhZCwgJmRlbF9saXN0KTsKKwlzcGluX3VubG9jaygmYmMtPnF1ZXVlX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCB0bXAsICZkZWxfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmZW50cnktPmxpc3QpOworCQljbWQgPSBlbnRyeS0+Y21kOworCQlfX3FsY25pY19zcmlvdl9pc3N1ZV9jbWQoYmMtPmFkYXB0ZXIsIGNtZCk7CisJCWtmcmVlKGVudHJ5KTsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoaGVhZCkpCisJCXF1ZXVlX3dvcmsoYmMtPmJjX2FzeW5jX3dxLCAmYmMtPnZmX2FzeW5jX3dvcmspOworCiAJcmV0dXJuOwogfQogCi1zdGF0aWMgc3RydWN0IHFsY25pY19hc3luY193b3JrX2xpc3QgKgotcWxjbmljX3NyaW92X2dldF9mcmVlX25vZGVfYXN5bmNfd29yayhzdHJ1Y3QgcWxjbmljX2JhY2tfY2hhbm5lbCAqYmMpCitzdGF0aWMgc3RydWN0IHFsY25pY19hc3luY19jbWQgKgorcWxjbmljX3NyaW92X2FsbG9jX2FzeW5jX2NtZChzdHJ1Y3QgcWxjbmljX2JhY2tfY2hhbm5lbCAqYmMsCisJCQkgICAgIHN0cnVjdCBxbGNuaWNfY21kX2FyZ3MgKmNtZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlOwotCXN0cnVjdCBxbGNuaWNfYXN5bmNfd29ya19saXN0ICplbnRyeSA9IE5VTEw7Ci0JdTggZW1wdHkgPSAwOworCXN0cnVjdCBxbGNuaWNfYXN5bmNfY21kICplbnRyeSA9IE5VTEw7CiAKLQlsaXN0X2Zvcl9lYWNoKG5vZGUsICZiYy0+YXN5bmNfbGlzdCkgewotCQllbnRyeSA9IGxpc3RfZW50cnkobm9kZSwgc3RydWN0IHFsY25pY19hc3luY193b3JrX2xpc3QsIGxpc3QpOwotCQlpZiAoIXdvcmtfcGVuZGluZygmZW50cnktPndvcmspKSB7Ci0JCQllbXB0eSA9IDE7Ci0JCQlicmVhazsKLQkJfQotCX0KKwllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9BVE9NSUMpOworCWlmICghZW50cnkpCisJCXJldHVybiBOVUxMOwogCi0JaWYgKCFlbXB0eSkgewotCQllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxbGNuaWNfYXN5bmNfd29ya19saXN0KSwKLQkJCQlHRlBfQVRPTUlDKTsKLQkJaWYgKGVudHJ5ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsICZiYy0+YXN5bmNfbGlzdCk7Ci0JfQorCWVudHJ5LT5jbWQgPSBjbWQ7CisKKwlzcGluX2xvY2soJmJjLT5xdWV1ZV9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bGlzdCwgJmJjLT5hc3luY19jbWRfbGlzdCk7CisJc3Bpbl91bmxvY2soJmJjLT5xdWV1ZV9sb2NrKTsKIAogCXJldHVybiBlbnRyeTsKIH0KIAogc3RhdGljIHZvaWQgcWxjbmljX3NyaW92X3NjaGVkdWxlX2FzeW5jX2NtZChzdHJ1Y3QgcWxjbmljX2JhY2tfY2hhbm5lbCAqYmMsCi0JCQkJCSAgICB3b3JrX2Z1bmNfdCBmdW5jLCB2b2lkICpkYXRhLAogCQkJCQkgICAgc3RydWN0IHFsY25pY19jbWRfYXJncyAqY21kKQogewotCXN0cnVjdCBxbGNuaWNfYXN5bmNfd29ya19saXN0ICplbnRyeSA9IE5VTEw7CisJc3RydWN0IHFsY25pY19hc3luY19jbWQgKmVudHJ5ID0gTlVMTDsKIAotCWVudHJ5ID0gcWxjbmljX3NyaW92X2dldF9mcmVlX25vZGVfYXN5bmNfd29yayhiYyk7Ci0JaWYgKCFlbnRyeSkKKwllbnRyeSA9IHFsY25pY19zcmlvdl9hbGxvY19hc3luY19jbWQoYmMsIGNtZCk7CisJaWYgKCFlbnRyeSkgeworCQlxbGNuaWNfZnJlZV9tYnhfYXJncyhjbWQpOworCQlrZnJlZShjbWQpOwogCQlyZXR1cm47CisJfQogCi0JZW50cnktPnB0ciA9IGRhdGE7Ci0JZW50cnktPmNtZCA9IGNtZDsKLQlJTklUX1dPUksoJmVudHJ5LT53b3JrLCBmdW5jKTsKLQlxdWV1ZV93b3JrKGJjLT5iY19hc3luY193cSwgJmVudHJ5LT53b3JrKTsKKwlxdWV1ZV93b3JrKGJjLT5iY19hc3luY193cSwgJmJjLT52Zl9hc3luY193b3JrKTsKIH0KIAogc3RhdGljIGludCBxbGNuaWNfc3Jpb3ZfYXN5bmNfaXNzdWVfY21kKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwKQEAgLTE2NDksOCArMTY2NCw4IEBACiAJaWYgKGFkYXB0ZXItPm5lZWRfZndfcmVzZXQpCiAJCXJldHVybiAtRUlPOwogCi0JcWxjbmljX3NyaW92X3NjaGVkdWxlX2FzeW5jX2NtZChiYywgcWxjbmljX3NyaW92X2hhbmRsZV9hc3luY19pc3N1ZV9jbWQsCi0JCQkJCWFkYXB0ZXIsIGNtZCk7CisJcWxjbmljX3NyaW92X3NjaGVkdWxlX2FzeW5jX2NtZChiYywgY21kKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdl9wZi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfc3Jpb3ZfcGYuYwppbmRleCBhZmQ2ODdlLi41MGVhYWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdl9wZi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX3NyaW92X3BmLmMKQEAgLTE5MTUsNyArMTkxNSw3IEBACiB9CiAKIGludCBxbGNuaWNfc3Jpb3Zfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLAotCQkJICAgICB1MTYgdmxhbiwgdTggcW9zKQorCQkJICAgICB1MTYgdmxhbiwgdTggcW9zLCBfX2JlMTYgdmxhbl9wcm90bykKIHsKIAlzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBxbGNuaWNfc3Jpb3YgKnNyaW92ID0gYWRhcHRlci0+YWh3LT5zcmlvdjsKQEAgLTE5MjgsNiArMTkyOCw5IEBACiAJaWYgKHZmID49IHNyaW92LT5udW1fdmZzIHx8IHFvcyA+IDcpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKHZsYW5fcHJvdG8gIT0gaHRvbnMoRVRIX1BfODAyMVEpKQorCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKKwogCWlmICh2bGFuID4gTUFYX1ZMQU5fSUQpIHsKIAkJbmV0ZGV2X2VycihuZXRkZXYsCiAJCQkgICAiSW52YWxpZCBWTEFOIElELCBhbGxvd2VkIHJhbmdlIGlzIFswIC0gJWRdXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL0tjb25maWcKaW5kZXggYTc2ZTM4MC4uOWJhNTY4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9LY29uZmlnCkBAIC0yNCw0ICsyNCwxNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgcWNhc3BpLgogCitjb25maWcgUUNPTV9FTUFDCisJdHJpc3RhdGUgIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBFTUFDIEdpZ2FiaXQgRXRoZXJuZXQgc3VwcG9ydCIKKwlzZWxlY3QgQ1JDMzIKKwlzZWxlY3QgUEhZTElCCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIFF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBHaWdhYml0CisJICBFdGhlcm5ldCBNZWRpYSBBY2Nlc3MgQ29udHJvbGxlciAoRU1BQykuIFRoZSBjb250cm9sbGVyCisJICBzdXBwb3J0cyBJRUVFIDgwMi4zLTIwMDIsIGhhbGYtZHVwbGV4IG1vZGUgYXQgMTAvMTAwIE1iL3MsCisJICBmdWxsLWR1cGxleCBtb2RlIGF0IDEwLzEwMC8xMDAwTWIvcywgV2FrZSBPbiBMQU4gKFdPTCkgZm9yCisJICBsb3cgcG93ZXIsIFJlY2VpdmUtU2lkZSBTY2FsaW5nIChSU1MpLCBhbmQgSUVFRSAxNTg4LTIwMDgKKwkgIFByZWNpc2lvbiBDbG9jayBTeW5jaHJvbml6YXRpb24gUHJvdG9jb2wuCisKIGVuZGlmICMgTkVUX1ZFTkRPUl9RVUFMQ09NTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9NYWtlZmlsZQppbmRleCA5ZGEyZDc1Li5hYWNiMGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9NYWtlZmlsZQpAQCAtNCwzICs0LDUgQEAKIAogb2JqLSQoQ09ORklHX1FDQTcwMDApICs9IHFjYXNwaS5vCiBxY2FzcGktb2JqcyA6PSBxY2Ffc3BpLm8gcWNhX2ZyYW1pbmcubyBxY2FfN2subyBxY2FfZGVidWcubworCitvYmoteSArPSBlbWFjLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlZTE0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIEVNQUMgR2lnYWJpdCBFdGhlcm5ldCBkcml2ZXIKKyMKKworb2JqLSQoQ09ORklHX1FDT01fRU1BQykgKz0gcWNvbS1lbWFjLm8KKworcWNvbS1lbWFjLW9ianMgOj0gZW1hYy5vIGVtYWMtbWFjLm8gZW1hYy1waHkubyBlbWFjLXNnbWlpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1tYWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1tYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTc5NjhlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLW1hYy5jCkBAIC0wLDAgKzEsMTUyOCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyogUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIEVNQUMgRXRoZXJuZXQgQ29udHJvbGxlciBNQUMgbGF5ZXIgc3VwcG9ydAorICovCisKKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X2NoZWNrc3VtLmg+CisjaW5jbHVkZSAiZW1hYy5oIgorI2luY2x1ZGUgImVtYWMtc2dtaWkuaCIKKworLyogRU1BQyBiYXNlIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgRU1BQ19NQUNfQ1RSTAkJCTB4MDAxNDgwCisjZGVmaW5lIEVNQUNfV09MX0NUUkwwCQkJMHgwMDE0YTAKKyNkZWZpbmUgRU1BQ19SU1NfS0VZMAkJCTB4MDAxNGIwCisjZGVmaW5lIEVNQUNfSDFUUERfQkFTRV9BRERSX0xPCQkweDAwMTRlMAorI2RlZmluZSBFTUFDX0gyVFBEX0JBU0VfQUREUl9MTwkJMHgwMDE0ZTQKKyNkZWZpbmUgRU1BQ19IM1RQRF9CQVNFX0FERFJfTE8JCTB4MDAxNGU4CisjZGVmaW5lIEVNQUNfSU5URVJfU1JBTV9QQVJUOQkJMHgwMDE1MzQKKyNkZWZpbmUgRU1BQ19ERVNDX0NUUkxfMAkJMHgwMDE1NDAKKyNkZWZpbmUgRU1BQ19ERVNDX0NUUkxfMQkJMHgwMDE1NDQKKyNkZWZpbmUgRU1BQ19ERVNDX0NUUkxfMgkJMHgwMDE1NTAKKyNkZWZpbmUgRU1BQ19ERVNDX0NUUkxfMTAJCTB4MDAxNTU0CisjZGVmaW5lIEVNQUNfREVTQ19DVFJMXzEyCQkweDAwMTU1OAorI2RlZmluZSBFTUFDX0RFU0NfQ1RSTF8xMwkJMHgwMDE1NWMKKyNkZWZpbmUgRU1BQ19ERVNDX0NUUkxfMwkJMHgwMDE1NjAKKyNkZWZpbmUgRU1BQ19ERVNDX0NUUkxfNAkJMHgwMDE1NjQKKyNkZWZpbmUgRU1BQ19ERVNDX0NUUkxfNQkJMHgwMDE1NjgKKyNkZWZpbmUgRU1BQ19ERVNDX0NUUkxfMTQJCTB4MDAxNTZjCisjZGVmaW5lIEVNQUNfREVTQ19DVFJMXzE1CQkweDAwMTU3MAorI2RlZmluZSBFTUFDX0RFU0NfQ1RSTF8xNgkJMHgwMDE1NzQKKyNkZWZpbmUgRU1BQ19ERVNDX0NUUkxfNgkJMHgwMDE1NzgKKyNkZWZpbmUgRU1BQ19ERVNDX0NUUkxfOAkJMHgwMDE1ODAKKyNkZWZpbmUgRU1BQ19ERVNDX0NUUkxfOQkJMHgwMDE1ODQKKyNkZWZpbmUgRU1BQ19ERVNDX0NUUkxfMTEJCTB4MDAxNTg4CisjZGVmaW5lIEVNQUNfVFhRX0NUUkxfMAkJCTB4MDAxNTkwCisjZGVmaW5lIEVNQUNfVFhRX0NUUkxfMQkJCTB4MDAxNTk0CisjZGVmaW5lIEVNQUNfVFhRX0NUUkxfMgkJCTB4MDAxNTk4CisjZGVmaW5lIEVNQUNfUlhRX0NUUkxfMAkJCTB4MDAxNWEwCisjZGVmaW5lIEVNQUNfUlhRX0NUUkxfMQkJCTB4MDAxNWE0CisjZGVmaW5lIEVNQUNfUlhRX0NUUkxfMgkJCTB4MDAxNWE4CisjZGVmaW5lIEVNQUNfUlhRX0NUUkxfMwkJCTB4MDAxNWFjCisjZGVmaW5lIEVNQUNfQkFTRV9DUFVfTlVNQkVSCQkweDAwMTViOAorI2RlZmluZSBFTUFDX0RNQV9DVFJMCQkJMHgwMDE1YzAKKyNkZWZpbmUgRU1BQ19NQUlMQk9YXzAJCQkweDAwMTVlMAorI2RlZmluZSBFTUFDX01BSUxCT1hfNQkJCTB4MDAxNWU0CisjZGVmaW5lIEVNQUNfTUFJTEJPWF82CQkJMHgwMDE1ZTgKKyNkZWZpbmUgRU1BQ19NQUlMQk9YXzEzCQkJMHgwMDE1ZWMKKyNkZWZpbmUgRU1BQ19NQUlMQk9YXzIJCQkweDAwMTVmNAorI2RlZmluZSBFTUFDX01BSUxCT1hfMwkJCTB4MDAxNWY4CisjZGVmaW5lIEVNQUNfTUFJTEJPWF8xMQkJCTB4MDAxNjBjCisjZGVmaW5lIEVNQUNfQVhJX01BU1RfQ1RSTAkJMHgwMDE2MTAKKyNkZWZpbmUgRU1BQ19NQUlMQk9YXzEyCQkJMHgwMDE2MTQKKyNkZWZpbmUgRU1BQ19NQUlMQk9YXzkJCQkweDAwMTYxOAorI2RlZmluZSBFTUFDX01BSUxCT1hfMTAJCQkweDAwMTYxYworI2RlZmluZSBFTUFDX0FUSFJfSEVBREVSX0NUUkwJCTB4MDAxNjIwCisjZGVmaW5lIEVNQUNfQ0xLX0dBVEVfQ1RSTAkJMHgwMDE4MTQKKyNkZWZpbmUgRU1BQ19NSVNDX0NUUkwJCQkweDAwMTk5MAorI2RlZmluZSBFTUFDX01BSUxCT1hfNwkJCTB4MDAxOWUwCisjZGVmaW5lIEVNQUNfTUFJTEJPWF84CQkJMHgwMDE5ZTQKKyNkZWZpbmUgRU1BQ19NQUlMQk9YXzE1CQkJMHgwMDFiZDQKKyNkZWZpbmUgRU1BQ19NQUlMQk9YXzE2CQkJMHgwMDFiZDgKKworLyogRU1BQ19NQUNfQ1RSTCAqLworI2RlZmluZSBTSU5HTEVfUEFVU0VfTU9ERSAgICAgICAJMHgxMDAwMDAwMAorI2RlZmluZSBERUJVR19NT0RFICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgQlJPQURfRU4gICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIE1VTFRJX0FMTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBSWF9DSEtTVU1fRU4gICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgSFVHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIFNQRUVEKHgpCQkJKCgoeCkgJiAweDMpIDw8IDIwKQorI2RlZmluZSBTUEVFRF9NQVNLCQkJU1BFRUQoMHgzKQorI2RlZmluZSBTSU1SICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgVFBBVVNFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFBST01fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBWTEFOX1NUUklQICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgUFJMRU5fQk1TSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzYzAwCisjZGVmaW5lIFBSTEVOX1NIRlQgICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgSFVHRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEZMQ0hLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBQQ1JDRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQ1JDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEZVTExEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBNQUNfTFBfRU4gICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgUlhGQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFRYRkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBSWEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgVFhFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisKKworLyogRU1BQ19XT0xfQ1RSTDAgKi8KKyNkZWZpbmUgTEtfQ0hHX1BNRQkJCTB4MjAKKyNkZWZpbmUgTEtfQ0hHX0VOCQkJMHgxMAorI2RlZmluZSBNR19GUkFNRV9QTUUJCQkweDgKKyNkZWZpbmUgTUdfRlJBTUVfRU4JCQkweDQKKyNkZWZpbmUgV0tfRlJBTUVfRU4JCQkweDEKKworLyogRU1BQ19ERVNDX0NUUkxfMyAqLworI2RlZmluZSBSRkRfUklOR19TSVpFX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZgorCisvKiBFTUFDX0RFU0NfQ1RSTF80ICovCisjZGVmaW5lIFJYX0JVRkZFUl9TSVpFX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisKKy8qIEVNQUNfREVTQ19DVFJMXzYgKi8KKyNkZWZpbmUgUlJEX1JJTkdfU0laRV9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYKKworLyogRU1BQ19ERVNDX0NUUkxfOSAqLworI2RlZmluZSBUUERfUklOR19TSVpFX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorCisvKiBFTUFDX1RYUV9DVFJMXzAgKi8KKyNkZWZpbmUgTlVNX1RYRl9CVVJTVF9QUkVGX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgTlVNX1RYRl9CVVJTVF9QUkVGX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgTFNfODAyM19TUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgVFhRX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgVFhRX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgSVBfT1BfU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgTlVNX1RQRF9CVVJTVF9QUkVGX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGYKKyNkZWZpbmUgTlVNX1RQRF9CVVJTVF9QUkVGX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRU1BQ19UWFFfQ1RSTF8xICovCisjZGVmaW5lIEpVTUJPX1RBU0tfT0ZGTE9BRF9USFJFU0hPTERfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgIDB4N2ZmCisKKy8qIEVNQUNfVFhRX0NUUkxfMiAqLworI2RlZmluZSBUWEZfSFdNX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmMDAwMAorI2RlZmluZSBUWEZfTFdNX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZgorCisvKiBFTUFDX1JYUV9DVFJMXzAgKi8KKyNkZWZpbmUgUlhRX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgzMSkKKyNkZWZpbmUgQ1VUX1RIUlVfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgzMCkKKyNkZWZpbmUgUlNTX0hBU0hfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyOSkKKyNkZWZpbmUgTlVNX1JGRF9CVVJTVF9QUkVGX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNmMDAwMDAKKyNkZWZpbmUgTlVNX1JGRF9CVVJTVF9QUkVGX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgSURUX1RBQkxFX1NJWkVfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWZmMDAKKyNkZWZpbmUgSURUX1RBQkxFX1NJWkVfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgU1BfSVBWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKworLyogRU1BQ19SWFFfQ1RSTF8xICovCisjZGVmaW5lIEpVTUJPXzFLQUhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmMDAwCisjZGVmaW5lIEpVTUJPXzFLQUhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFJGRF9QUkVGX0xPV19USCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIFJGRF9QUkVGX0xPV19USFJFU0hPTERfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmMwCisjZGVmaW5lIFJGRF9QUkVGX0xPV19USFJFU0hPTERfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFJGRF9QUkVGX1VQX1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIFJGRF9QUkVGX1VQX1RIUkVTSE9MRF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNmCisjZGVmaW5lIFJGRF9QUkVGX1VQX1RIUkVTSE9MRF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVNQUNfUlhRX0NUUkxfMiAqLworI2RlZmluZSBSWEZfRE9GX1RIUkVTRkhPTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFhMAorI2RlZmluZSBSWEZfRE9GX1RIUkVTSE9MRF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmMDAwMAorI2RlZmluZSBSWEZfRE9GX1RIUkVTSE9MRF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBSWEZfVU9GX1RIUkVTRkhPTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiZQorI2RlZmluZSBSWEZfVU9GX1RIUkVTSE9MRF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZgorI2RlZmluZSBSWEZfVU9GX1RIUkVTSE9MRF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBFTUFDX1JYUV9DVFJMXzMgKi8KKyNkZWZpbmUgUlhEX1RJTUVSX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgUlhEX1RIUkVTSE9MRF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYKKyNkZWZpbmUgUlhEX1RIUkVTSE9MRF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRU1BQ19ETUFfQ1RSTCAqLworI2RlZmluZSBETUFXX0RMWV9DTlRfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmMDAwMAorI2RlZmluZSBETUFXX0RMWV9DTlRfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBETUFSX0RMWV9DTlRfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZjgwMAorI2RlZmluZSBETUFSX0RMWV9DTlRfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBETUFSX1JFUV9QUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMAorI2RlZmluZSBSRUdXUkJMRU5fQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MAorI2RlZmluZSBSRUdXUkJMRU5fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBSRUdSREJMRU5fQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MAorI2RlZmluZSBSRUdSREJMRU5fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBPVVRfT1JERVJfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBFTkhfT1JERVJfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBJTl9PUkRFUl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorCisvKiBFTUFDX01BSUxCT1hfMTMgKi8KKyNkZWZpbmUgUkZEM19QUk9DX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZjAwMDAKKyNkZWZpbmUgUkZEM19QUk9DX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgUkZEM19QUk9EX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYKKyNkZWZpbmUgUkZEM19QUk9EX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRU1BQ19NQUlMQk9YXzIgKi8KKyNkZWZpbmUgTlRQRF9DT05TX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgTlRQRF9DT05TX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKworLyogRU1BQ19NQUlMQk9YXzMgKi8KKyNkZWZpbmUgUkZEMF9DT05TX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYKKyNkZWZpbmUgUkZEMF9DT05TX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRU1BQ19NQUlMQk9YXzExICovCisjZGVmaW5lIEgzVFBEX1BST0RfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIEgzVFBEX1BST0RfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisKKy8qIEVNQUNfQVhJX01BU1RfQ1RSTCAqLworI2RlZmluZSBEQVRBX0JZVEVfU1dBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OAorI2RlZmluZSBNQVhfQk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBNQVhfQlRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorCisvKiBFTUFDX01BSUxCT1hfMTIgKi8KKyNkZWZpbmUgSDNUUERfQ09OU19JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgSDNUUERfQ09OU19JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKworLyogRU1BQ19NQUlMQk9YXzkgKi8KKyNkZWZpbmUgSDJUUERfUFJPRF9JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKKyNkZWZpbmUgSDJUUERfUFJPRF9JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRU1BQ19NQUlMQk9YXzEwICovCisjZGVmaW5lIEgxVFBEX0NPTlNfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIEgxVFBEX0NPTlNfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEgyVFBEX0NPTlNfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisjZGVmaW5lIEgyVFBEX0NPTlNfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVNQUNfQVRIUl9IRUFERVJfQ1RSTCAqLworI2RlZmluZSBIRUFERVJfQ05UX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBIRUFERVJfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorCisvKiBFTUFDX01BSUxCT1hfMCAqLworI2RlZmluZSBSRkQwX1BST0NfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmMDAwMAorI2RlZmluZSBSRkQwX1BST0NfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBSRkQwX1BST0RfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZgorI2RlZmluZSBSRkQwX1BST0RfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBFTUFDX01BSUxCT1hfNSAqLworI2RlZmluZSBSRkQxX1BST0NfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmMDAwMAorI2RlZmluZSBSRkQxX1BST0NfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBSRkQxX1BST0RfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZgorI2RlZmluZSBSRkQxX1BST0RfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBFTUFDX01JU0NfQ1RSTCAqLworI2RlZmluZSBSWF9VTkNQTF9JTlRfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorCisvKiBFTUFDX01BSUxCT1hfNyAqLworI2RlZmluZSBSRkQyX0NPTlNfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmMDAwMAorI2RlZmluZSBSRkQyX0NPTlNfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBSRkQxX0NPTlNfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZgorI2RlZmluZSBSRkQxX0NPTlNfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBFTUFDX01BSUxCT1hfOCAqLworI2RlZmluZSBSRkQzX0NPTlNfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZgorI2RlZmluZSBSRkQzX0NPTlNfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBFTUFDX01BSUxCT1hfMTUgKi8KKyNkZWZpbmUgTlRQRF9QUk9EX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKKyNkZWZpbmUgTlRQRF9QUk9EX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRU1BQ19NQUlMQk9YXzE2ICovCisjZGVmaW5lIEgxVFBEX1BST0RfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisjZGVmaW5lIEgxVFBEX1BST0RfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgUlhRMF9SU1NfSFNUWVBfSVBWNl9UQ1BfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgUlhRMF9SU1NfSFNUWVBfSVBWNl9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgUlhRMF9SU1NfSFNUWVBfSVBWNF9UQ1BfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgUlhRMF9SU1NfSFNUWVBfSVBWNF9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKworLyogRU1BQ19FTUFDX1dSQVBQRVJfVFhfVFNfSU5YICovCisjZGVmaW5lIEVNQUNfV1JBUFBFUl9UWF9UU19FTVBUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMzEpCisjZGVmaW5lIEVNQUNfV1JBUFBFUl9UWF9UU19JTlhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisKK3N0cnVjdCBlbWFjX3NrYl9jYiB7CisJdTMyICAgICAgICAgICB0cGRfaWR4OworCXVuc2lnbmVkIGxvbmcgamlmZmllczsKK307CisKKyNkZWZpbmUgRU1BQ19TS0JfQ0Ioc2tiKQkoKHN0cnVjdCBlbWFjX3NrYl9jYiAqKShza2IpLT5jYikKKyNkZWZpbmUgRU1BQ19SU1NfSURUX1NJWkUJMjU2CisjZGVmaW5lIEpVTUJPXzFLQUgJCTB4NAorI2RlZmluZSBSWERfVEgJCQkweDEwMAorI2RlZmluZSBFTUFDX1RQRF9MQVNUX0ZSQUdNRU5UCTB4ODAwMDAwMDAKKyNkZWZpbmUgRU1BQ19UUERfVFNUQU1QX1NBVkUJMHg4MDAwMDAwMAorCisvKiBFTUFDIEVycm9ycyBpbiBlbWFjX3JyZC53b3JkWzNdICovCisjZGVmaW5lIEVNQUNfUlJEX0w0RgkJQklUKDE0KQorI2RlZmluZSBFTUFDX1JSRF9JUEYJCUJJVCgxNSkKKyNkZWZpbmUgRU1BQ19SUkRfQ1JDCQlCSVQoMjEpCisjZGVmaW5lIEVNQUNfUlJEX0ZBRQkJQklUKDIyKQorI2RlZmluZSBFTUFDX1JSRF9UUk4JCUJJVCgyMykKKyNkZWZpbmUgRU1BQ19SUkRfUk5UCQlCSVQoMjQpCisjZGVmaW5lIEVNQUNfUlJEX0lOQwkJQklUKDI1KQorI2RlZmluZSBFTUFDX1JSRF9GT1YJCUJJVCgyOSkKKyNkZWZpbmUgRU1BQ19SUkRfTEVOCQlCSVQoMzApCisKKy8qIEVycm9yIGJpdHMgdGhhdCB3aWxsIHJlc3VsdCBpbiBhIHJlY2VpdmVkIGZyYW1lIGJlaW5nIGRpc2NhcmRlZCAqLworI2RlZmluZSBFTUFDX1JSRF9FUlJPUiAoRU1BQ19SUkRfSVBGIHwgRU1BQ19SUkRfQ1JDIHwgRU1BQ19SUkRfRkFFIHwgXAorCQkJRU1BQ19SUkRfVFJOIHwgRU1BQ19SUkRfUk5UIHwgRU1BQ19SUkRfSU5DIHwgXAorCQkJRU1BQ19SUkRfRk9WIHwgRU1BQ19SUkRfTEVOKQorI2RlZmluZSBFTUFDX1JSRF9TVEFUU19EV19JRFggMworCisjZGVmaW5lIEVNQUNfUlJEKFJYUSwgU0laRSwgSURYKQkoKFJYUSktPnJyZC52X2FkZHIgKyAoU0laRSAqIChJRFgpKSkKKyNkZWZpbmUgRU1BQ19SRkQoUlhRLCBTSVpFLCBJRFgpCSgoUlhRKS0+cmZkLnZfYWRkciArIChTSVpFICogKElEWCkpKQorI2RlZmluZSBFTUFDX1RQRChUWFEsIFNJWkUsIElEWCkJKChUWFEpLT50cGQudl9hZGRyICsgKFNJWkUgKiAoSURYKSkpCisKKyNkZWZpbmUgR0VUX1JGRF9CVUZGRVIoUlhRLCBJRFgpCSgmKChSWFEpLT5yZmQucmZidWZmWyhJRFgpXSkpCisjZGVmaW5lIEdFVF9UUERfQlVGRkVSKFJUUSwgSURYKQkoJigoUlRRKS0+dHBkLnRwYnVmZlsoSURYKV0pKQorCisjZGVmaW5lIEVNQUNfVFhfUE9MTF9IV1RYVFNUQU1QX1RIUkVTSE9MRAk4CisKKyNkZWZpbmUgSVNSX1JYX1BLVCAgICAgIChcCisJUlhfUEtUX0lOVDAgICAgIHxcCisJUlhfUEtUX0lOVDEgICAgIHxcCisJUlhfUEtUX0lOVDIgICAgIHxcCisJUlhfUEtUX0lOVDMpCisKKyNkZWZpbmUgRU1BQ19NQUNfSVJRX1JFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkiY29yZTAiCisKK3ZvaWQgZW1hY19tYWNfbXVsdGljYXN0X2FkZHJfc2V0KHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsIHU4ICphZGRyKQoreworCXUzMiBjcmMzMiwgYml0LCByZWcsIG10YTsKKworCS8qIENhbGN1bGF0ZSB0aGUgQ1JDIG9mIHRoZSBNQUMgYWRkcmVzcyAqLworCWNyYzMyID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBhZGRyKTsKKworCS8qIFRoZSBIQVNIIFRhYmxlIGlzIGFuIGFycmF5IG9mIDIgMzItYml0IHJlZ2lzdGVycy4gSXQgaXMKKwkgKiB0cmVhdGVkIGxpa2UgYW4gYXJyYXkgb2YgNjQgYml0cyAoQml0QXJyYXlbaGFzaF92YWx1ZV0pLgorCSAqIFVzZSB0aGUgdXBwZXIgNiBiaXRzIG9mIHRoZSBhYm92ZSBDUkMgYXMgdGhlIGhhc2ggdmFsdWUuCisJICovCisJcmVnID0gKGNyYzMyID4+IDMxKSAmIDB4MTsKKwliaXQgPSAoY3JjMzIgPj4gMjYpICYgMHgxRjsKKworCW10YSA9IHJlYWRsKGFkcHQtPmJhc2UgKyBFTUFDX0hBU0hfVEFCX1JFRzAgKyAocmVnIDw8IDIpKTsKKwltdGEgfD0gQklUKGJpdCk7CisJd3JpdGVsKG10YSwgYWRwdC0+YmFzZSArIEVNQUNfSEFTSF9UQUJfUkVHMCArIChyZWcgPDwgMikpOworfQorCit2b2lkIGVtYWNfbWFjX211bHRpY2FzdF9hZGRyX2NsZWFyKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJd3JpdGVsKDAsIGFkcHQtPmJhc2UgKyBFTUFDX0hBU0hfVEFCX1JFRzApOworCXdyaXRlbCgwLCBhZHB0LT5iYXNlICsgRU1BQ19IQVNIX1RBQl9SRUcxKTsKK30KKworLyogZGVmaW5pdGlvbnMgZm9yIFJTUyAqLworI2RlZmluZSBFTUFDX1JTU19LRVkoX2ksIF90eXBlKSBcCisJCShFTUFDX1JTU19LRVkwICsgKChfaSkgKiBzaXplb2YoX3R5cGUpKSkKKyNkZWZpbmUgRU1BQ19SU1NfVEJMKF9pLCBfdHlwZSkgXAorCQkoRU1BQ19JRFRfVEFCTEUwICsgKChfaSkgKiBzaXplb2YoX3R5cGUpKSkKKworLyogQ29uZmlnIE1BQyBtb2RlcyAqLwordm9pZCBlbWFjX21hY19tb2RlX2NvbmZpZyhzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZHB0LT5uZXRkZXY7CisJdTMyIG1hYzsKKworCW1hYyA9IHJlYWRsKGFkcHQtPmJhc2UgKyBFTUFDX01BQ19DVFJMKTsKKwltYWMgJj0gfihWTEFOX1NUUklQIHwgUFJPTV9NT0RFIHwgTVVMVElfQUxMIHwgTUFDX0xQX0VOKTsKKworCWlmIChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlgpCisJCW1hYyB8PSBWTEFOX1NUUklQOworCisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJbWFjIHw9IFBST01fTU9ERTsKKworCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCQltYWMgfD0gTVVMVElfQUxMOworCisJd3JpdGVsKG1hYywgYWRwdC0+YmFzZSArIEVNQUNfTUFDX0NUUkwpOworfQorCisvKiBDb25maWcgZGVzY3JpcHRvciByaW5ncyAqLworc3RhdGljIHZvaWQgZW1hY19tYWNfZG1hX3JpbmdzX2NvbmZpZyhzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB0cGRfcV9vZmZzZXRbXSA9IHsKKwkJRU1BQ19ERVNDX0NUUkxfOCwgICAgICAgIEVNQUNfSDFUUERfQkFTRV9BRERSX0xPLAorCQlFTUFDX0gyVFBEX0JBU0VfQUREUl9MTywgRU1BQ19IM1RQRF9CQVNFX0FERFJfTE99OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCByZmRfcV9vZmZzZXRbXSA9IHsKKwkJRU1BQ19ERVNDX0NUUkxfMiwgICAgICAgIEVNQUNfREVTQ19DVFJMXzEwLAorCQlFTUFDX0RFU0NfQ1RSTF8xMiwgICAgICAgRU1BQ19ERVNDX0NUUkxfMTN9OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBycmRfcV9vZmZzZXRbXSA9IHsKKwkJRU1BQ19ERVNDX0NUUkxfNSwgICAgICAgIEVNQUNfREVTQ19DVFJMXzE0LAorCQlFTUFDX0RFU0NfQ1RSTF8xNSwgICAgICAgRU1BQ19ERVNDX0NUUkxfMTZ9OworCisJLyogVFBEIChUcmFuc21pdCBQYWNrZXQgRGVzY3JpcHRvcikgKi8KKwl3cml0ZWwodXBwZXJfMzJfYml0cyhhZHB0LT50eF9xLnRwZC5kbWFfYWRkciksCisJICAgICAgIGFkcHQtPmJhc2UgKyBFTUFDX0RFU0NfQ1RSTF8xKTsKKworCXdyaXRlbChsb3dlcl8zMl9iaXRzKGFkcHQtPnR4X3EudHBkLmRtYV9hZGRyKSwKKwkgICAgICAgYWRwdC0+YmFzZSArIHRwZF9xX29mZnNldFswXSk7CisKKwl3cml0ZWwoYWRwdC0+dHhfcS50cGQuY291bnQgJiBUUERfUklOR19TSVpFX0JNU0ssCisJICAgICAgIGFkcHQtPmJhc2UgKyBFTUFDX0RFU0NfQ1RSTF85KTsKKworCS8qIFJGRCAoUmVjZWl2ZSBGcmVlIERlc2NyaXB0b3IpICYgUlJEIChSZWNlaXZlIFJldHVybiBEZXNjcmlwdG9yKSAqLworCXdyaXRlbCh1cHBlcl8zMl9iaXRzKGFkcHQtPnJ4X3EucmZkLmRtYV9hZGRyKSwKKwkgICAgICAgYWRwdC0+YmFzZSArIEVNQUNfREVTQ19DVFJMXzApOworCisJd3JpdGVsKGxvd2VyXzMyX2JpdHMoYWRwdC0+cnhfcS5yZmQuZG1hX2FkZHIpLAorCSAgICAgICBhZHB0LT5iYXNlICsgcmZkX3Ffb2Zmc2V0WzBdKTsKKwl3cml0ZWwobG93ZXJfMzJfYml0cyhhZHB0LT5yeF9xLnJyZC5kbWFfYWRkciksCisJICAgICAgIGFkcHQtPmJhc2UgKyBycmRfcV9vZmZzZXRbMF0pOworCisJd3JpdGVsKGFkcHQtPnJ4X3EucmZkLmNvdW50ICYgUkZEX1JJTkdfU0laRV9CTVNLLAorCSAgICAgICBhZHB0LT5iYXNlICsgRU1BQ19ERVNDX0NUUkxfMyk7CisJd3JpdGVsKGFkcHQtPnJ4X3EucnJkLmNvdW50ICYgUlJEX1JJTkdfU0laRV9CTVNLLAorCSAgICAgICBhZHB0LT5iYXNlICsgRU1BQ19ERVNDX0NUUkxfNik7CisKKwl3cml0ZWwoYWRwdC0+cnhidWZfc2l6ZSAmIFJYX0JVRkZFUl9TSVpFX0JNU0ssCisJICAgICAgIGFkcHQtPmJhc2UgKyBFTUFDX0RFU0NfQ1RSTF80KTsKKworCXdyaXRlbCgwLCBhZHB0LT5iYXNlICsgRU1BQ19ERVNDX0NUUkxfMTEpOworCisJLyogTG9hZCBhbGwgb2YgdGhlIGJhc2UgYWRkcmVzc2VzIGFib3ZlIGFuZCBlbnN1cmUgdGhhdCB0cmlnZ2VyaW5nIEhXIHRvCisJICogcmVhZCByaW5nIHBvaW50ZXJzIGlzIGZsdXNoZWQKKwkgKi8KKwl3cml0ZWwoMSwgYWRwdC0+YmFzZSArIEVNQUNfSU5URVJfU1JBTV9QQVJUOSk7Cit9CisKKy8qIENvbmZpZyB0cmFuc21pdCBwYXJhbWV0ZXJzICovCitzdGF0aWMgdm9pZCBlbWFjX21hY190eF9jb25maWcoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwl1MzIgdmFsOworCisJd3JpdGVsKChFTUFDX01BWF9UWF9PRkZMT0FEX1RIUkVTSCA+PiAzKSAmCisJICAgICAgIEpVTUJPX1RBU0tfT0ZGTE9BRF9USFJFU0hPTERfQk1TSywgYWRwdC0+YmFzZSArIEVNQUNfVFhRX0NUUkxfMSk7CisKKwl2YWwgPSAoYWRwdC0+dHBkX2J1cnN0IDw8IE5VTV9UUERfQlVSU1RfUFJFRl9TSEZUKSAmCisJICAgICAgIE5VTV9UUERfQlVSU1RfUFJFRl9CTVNLOworCisJdmFsIHw9IFRYUV9NT0RFIHwgTFNfODAyM19TUDsKKwl2YWwgfD0gKDB4MDEwMCA8PCBOVU1fVFhGX0JVUlNUX1BSRUZfU0hGVCkgJgorCQlOVU1fVFhGX0JVUlNUX1BSRUZfQk1TSzsKKworCXdyaXRlbCh2YWwsIGFkcHQtPmJhc2UgKyBFTUFDX1RYUV9DVFJMXzApOworCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmJhc2UgKyBFTUFDX1RYUV9DVFJMXzIsCisJCQkgIChUWEZfSFdNX0JNU0sgfCBUWEZfTFdNX0JNU0spLCAwKTsKK30KKworLyogQ29uZmlnIHJlY2VpdmUgcGFyYW1ldGVycyAqLworc3RhdGljIHZvaWQgZW1hY19tYWNfcnhfY29uZmlnKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IChhZHB0LT5yZmRfYnVyc3QgPDwgTlVNX1JGRF9CVVJTVF9QUkVGX1NIRlQpICYKKwkgICAgICAgTlVNX1JGRF9CVVJTVF9QUkVGX0JNU0s7CisJdmFsIHw9IChTUF9JUFY2IHwgQ1VUX1RIUlVfRU4pOworCisJd3JpdGVsKHZhbCwgYWRwdC0+YmFzZSArIEVNQUNfUlhRX0NUUkxfMCk7CisKKwl2YWwgPSByZWFkbChhZHB0LT5iYXNlICsgRU1BQ19SWFFfQ1RSTF8xKTsKKwl2YWwgJj0gfihKVU1CT18xS0FIX0JNU0sgfCBSRkRfUFJFRl9MT1dfVEhSRVNIT0xEX0JNU0sgfAorCQkgUkZEX1BSRUZfVVBfVEhSRVNIT0xEX0JNU0spOworCXZhbCB8PSAoSlVNQk9fMUtBSCA8PCBKVU1CT18xS0FIX1NIRlQpIHwKKwkJKFJGRF9QUkVGX0xPV19USCA8PCBSRkRfUFJFRl9MT1dfVEhSRVNIT0xEX1NIRlQpIHwKKwkJKFJGRF9QUkVGX1VQX1RIICA8PCBSRkRfUFJFRl9VUF9USFJFU0hPTERfU0hGVCk7CisJd3JpdGVsKHZhbCwgYWRwdC0+YmFzZSArIEVNQUNfUlhRX0NUUkxfMSk7CisKKwl2YWwgPSByZWFkbChhZHB0LT5iYXNlICsgRU1BQ19SWFFfQ1RSTF8yKTsKKwl2YWwgJj0gfihSWEZfRE9GX1RIUkVTSE9MRF9CTVNLIHwgUlhGX1VPRl9USFJFU0hPTERfQk1TSyk7CisJdmFsIHw9IChSWEZfRE9GX1RIUkVTRkhPTEQgIDw8IFJYRl9ET0ZfVEhSRVNIT0xEX1NIRlQpIHwKKwkJKFJYRl9VT0ZfVEhSRVNGSE9MRCA8PCBSWEZfVU9GX1RIUkVTSE9MRF9TSEZUKTsKKwl3cml0ZWwodmFsLCBhZHB0LT5iYXNlICsgRU1BQ19SWFFfQ1RSTF8yKTsKKworCXZhbCA9IHJlYWRsKGFkcHQtPmJhc2UgKyBFTUFDX1JYUV9DVFJMXzMpOworCXZhbCAmPSB+KFJYRF9USU1FUl9CTVNLIHwgUlhEX1RIUkVTSE9MRF9CTVNLKTsKKwl2YWwgfD0gUlhEX1RIIDw8IFJYRF9USFJFU0hPTERfU0hGVDsKKwl3cml0ZWwodmFsLCBhZHB0LT5iYXNlICsgRU1BQ19SWFFfQ1RSTF8zKTsKK30KKworLyogQ29uZmlnIGRtYSAqLworc3RhdGljIHZvaWQgZW1hY19tYWNfZG1hX2NvbmZpZyhzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXUzMiBkbWFfY3RybCA9IERNQVJfUkVRX1BSSTsKKworCXN3aXRjaCAoYWRwdC0+ZG1hX29yZGVyKSB7CisJY2FzZSBlbWFjX2RtYV9vcmRfaW46CisJCWRtYV9jdHJsIHw9IElOX09SREVSX01PREU7CisJCWJyZWFrOworCWNhc2UgZW1hY19kbWFfb3JkX2VuaDoKKwkJZG1hX2N0cmwgfD0gRU5IX09SREVSX01PREU7CisJCWJyZWFrOworCWNhc2UgZW1hY19kbWFfb3JkX291dDoKKwkJZG1hX2N0cmwgfD0gT1VUX09SREVSX01PREU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWRtYV9jdHJsIHw9ICgoKHUzMilhZHB0LT5kbWFyX2Jsb2NrKSA8PCBSRUdSREJMRU5fU0hGVCkgJgorCQkJCQkJUkVHUkRCTEVOX0JNU0s7CisJZG1hX2N0cmwgfD0gKCgodTMyKWFkcHQtPmRtYXdfYmxvY2spIDw8IFJFR1dSQkxFTl9TSEZUKSAmCisJCQkJCQlSRUdXUkJMRU5fQk1TSzsKKwlkbWFfY3RybCB8PSAoKCh1MzIpYWRwdC0+ZG1hcl9kbHlfY250KSA8PCBETUFSX0RMWV9DTlRfU0hGVCkgJgorCQkJCQkJRE1BUl9ETFlfQ05UX0JNU0s7CisJZG1hX2N0cmwgfD0gKCgodTMyKWFkcHQtPmRtYXdfZGx5X2NudCkgPDwgRE1BV19ETFlfQ05UX1NIRlQpICYKKwkJCQkJCURNQVdfRExZX0NOVF9CTVNLOworCisJLyogY29uZmlnIERNQSBhbmQgZW5zdXJlIHRoYXQgY29uZmlndXJhdGlvbiBpcyBmbHVzaGVkIHRvIEhXICovCisJd3JpdGVsKGRtYV9jdHJsLCBhZHB0LT5iYXNlICsgRU1BQ19ETUFfQ1RSTCk7Cit9CisKKy8qIHNldCBNQUMgYWRkcmVzcyAqLworc3RhdGljIHZvaWQgZW1hY19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwgdTggKmFkZHIpCit7CisJdTMyIHN0YTsKKworCS8qIGZvciBleGFtcGxlOiAwMC1BMC1DNi0xMS0yMi0zMworCSAqIDA8LS0+QzYxMTIyMzMsIDE8LS0+MDBBMC4KKwkgKi8KKworCS8qIGxvdyAzMmJpdCB3b3JkICovCisJc3RhID0gKCgodTMyKWFkZHJbMl0pIDw8IDI0KSB8ICgoKHUzMilhZGRyWzNdKSA8PCAxNikgfAorCSAgICAgICgoKHUzMilhZGRyWzRdKSA8PCA4KSAgfCAoKCh1MzIpYWRkcls1XSkpOworCXdyaXRlbChzdGEsIGFkcHQtPmJhc2UgKyBFTUFDX01BQ19TVEFfQUREUjApOworCisJLyogaGlnaHQgMzJiaXQgd29yZCAqLworCXN0YSA9ICgoKHUzMilhZGRyWzBdKSA8PCA4KSB8ICh1MzIpYWRkclsxXTsKKwl3cml0ZWwoc3RhLCBhZHB0LT5iYXNlICsgRU1BQ19NQUNfU1RBX0FERFIxKTsKK30KKworc3RhdGljIHZvaWQgZW1hY19tYWNfY29uZmlnKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkcHQtPm5ldGRldjsKKwl1bnNpZ25lZCBpbnQgbWF4X2ZyYW1lOworCXUzMiB2YWw7CisKKwllbWFjX3NldF9tYWNfYWRkcmVzcyhhZHB0LCBuZXRkZXYtPmRldl9hZGRyKTsKKworCW1heF9mcmFtZSA9IG5ldGRldi0+bXR1ICsgRVRIX0hMRU4gKyBFVEhfRkNTX0xFTiArIFZMQU5fSExFTjsKKwlhZHB0LT5yeGJ1Zl9zaXplID0gbmV0ZGV2LT5tdHUgPiBFTUFDX0RFRl9SWF9CVUZfU0laRSA/CisJCUFMSUdOKG1heF9mcmFtZSwgOCkgOiBFTUFDX0RFRl9SWF9CVUZfU0laRTsKKworCWVtYWNfbWFjX2RtYV9yaW5nc19jb25maWcoYWRwdCk7CisKKwl3cml0ZWwobmV0ZGV2LT5tdHUgKyBFVEhfSExFTiArIFZMQU5fSExFTiArIEVUSF9GQ1NfTEVOLAorCSAgICAgICBhZHB0LT5iYXNlICsgRU1BQ19NQVhfRlJBTV9MRU5fQ1RSTCk7CisKKwllbWFjX21hY190eF9jb25maWcoYWRwdCk7CisJZW1hY19tYWNfcnhfY29uZmlnKGFkcHQpOworCWVtYWNfbWFjX2RtYV9jb25maWcoYWRwdCk7CisKKwl2YWwgPSByZWFkbChhZHB0LT5iYXNlICsgRU1BQ19BWElfTUFTVF9DVFJMKTsKKwl2YWwgJj0gfihEQVRBX0JZVEVfU1dBUCB8IE1BWF9CT1VORCk7CisJdmFsIHw9IE1BWF9CVFlQRTsKKwl3cml0ZWwodmFsLCBhZHB0LT5iYXNlICsgRU1BQ19BWElfTUFTVF9DVFJMKTsKKwl3cml0ZWwoMCwgYWRwdC0+YmFzZSArIEVNQUNfQ0xLX0dBVEVfQ1RSTCk7CisJd3JpdGVsKFJYX1VOQ1BMX0lOVF9FTiwgYWRwdC0+YmFzZSArIEVNQUNfTUlTQ19DVFJMKTsKK30KKwordm9pZCBlbWFjX21hY19yZXNldChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCWVtYWNfbWFjX3N0b3AoYWRwdCk7CisKKwllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5iYXNlICsgRU1BQ19ETUFfTUFTX0NUUkwsIDAsIFNPRlRfUlNUKTsKKwl1c2xlZXBfcmFuZ2UoMTAwLCAxNTApOyAvKiByZXNldCBtYXkgdGFrZSB1cCB0byAxMDB1c2VjICovCisKKwkvKiBpbnRlcnJ1cHQgY2xlYXItb24tcmVhZCAqLworCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmJhc2UgKyBFTUFDX0RNQV9NQVNfQ1RSTCwgMCwgSU5UX1JEX0NMUl9FTik7Cit9CisKK3ZvaWQgZW1hY19tYWNfc3RhcnQoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gYWRwdC0+cGh5ZGV2OworCXUzMiBtYWMsIGNzcjE7CisKKwkvKiBlbmFibGUgdHggcXVldWUgKi8KKwllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5iYXNlICsgRU1BQ19UWFFfQ1RSTF8wLCAwLCBUWFFfRU4pOworCisJLyogZW5hYmxlIHJ4IHF1ZXVlICovCisJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+YmFzZSArIEVNQUNfUlhRX0NUUkxfMCwgMCwgUlhRX0VOKTsKKworCS8qIGVuYWJsZSBtYWMgY29udHJvbCAqLworCW1hYyA9IHJlYWRsKGFkcHQtPmJhc2UgKyBFTUFDX01BQ19DVFJMKTsKKwljc3IxID0gcmVhZGwoYWRwdC0+Y3NyICsgRU1BQ19FTUFDX1dSQVBQRVJfQ1NSMSk7CisKKwltYWMgfD0gVFhFTiB8IFJYRU47ICAgICAvKiBlbmFibGUgUlgvVFggKi8KKworCS8qIFdlIGRvbid0IGhhdmUgZXRodG9vbCBzdXBwb3J0IHlldCwgc28gZm9yY2UgZmxvdy1jb250cm9sIG1vZGUKKwkgKiB0byAnZnVsbCcgYWx3YXlzLgorCSAqLworCW1hYyB8PSBUWEZDIHwgUlhGQzsKKworCS8qIHNldHVwIGxpbmsgc3BlZWQgKi8KKwltYWMgJj0gflNQRUVEX01BU0s7CisJaWYgKHBoeWRldi0+c3BlZWQgPT0gU1BFRURfMTAwMCkgeworCQltYWMgfD0gU1BFRUQoMik7CisJCWNzcjEgfD0gRlJFUV9NT0RFOworCX0gZWxzZSB7CisJCW1hYyB8PSBTUEVFRCgxKTsKKwkJY3NyMSAmPSB+RlJFUV9NT0RFOworCX0KKworCWlmIChwaHlkZXYtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJbWFjIHw9IEZVTExEOworCWVsc2UKKwkJbWFjICY9IH5GVUxMRDsKKworCS8qIG90aGVyIHBhcmFtZXRlcnMgKi8KKwltYWMgfD0gKENSQ0UgfCBQQ1JDRSk7CisJbWFjIHw9ICgoYWRwdC0+cHJlYW1ibGUgPDwgUFJMRU5fU0hGVCkgJiBQUkxFTl9CTVNLKTsKKwltYWMgfD0gQlJPQURfRU47CisJbWFjIHw9IEZMQ0hLOworCW1hYyAmPSB+UlhfQ0hLU1VNX0VOOworCW1hYyAmPSB+KEhVR0VOIHwgVkxBTl9TVFJJUCB8IFRQQVVTRSB8IFNJTVIgfCBIVUdFIHwgTVVMVElfQUxMIHwKKwkJIERFQlVHX01PREUgfCBTSU5HTEVfUEFVU0VfTU9ERSk7CisKKwl3cml0ZWxfcmVsYXhlZChjc3IxLCBhZHB0LT5jc3IgKyBFTUFDX0VNQUNfV1JBUFBFUl9DU1IxKTsKKworCXdyaXRlbF9yZWxheGVkKG1hYywgYWRwdC0+YmFzZSArIEVNQUNfTUFDX0NUUkwpOworCisJLyogZW5hYmxlIGludGVycnVwdCByZWFkIGNsZWFyLCBsb3cgcG93ZXIgc2xlZXAgbW9kZSBhbmQKKwkgKiB0aGUgaXJxIG1vZGVyYXRvcnMKKwkgKi8KKworCXdyaXRlbF9yZWxheGVkKGFkcHQtPmlycV9tb2QsIGFkcHQtPmJhc2UgKyBFTUFDX0lSUV9NT0RfVElNX0lOSVQpOworCXdyaXRlbF9yZWxheGVkKElOVF9SRF9DTFJfRU4gfCBMUFdfTU9ERSB8IElSUV9NT0RFUkFUT1JfRU4gfAorCQkJSVJRX01PREVSQVRPUjJfRU4sIGFkcHQtPmJhc2UgKyBFTUFDX0RNQV9NQVNfQ1RSTCk7CisKKwllbWFjX21hY19tb2RlX2NvbmZpZyhhZHB0KTsKKworCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmJhc2UgKyBFTUFDX0FUSFJfSEVBREVSX0NUUkwsCisJCQkgIChIRUFERVJfRU5BQkxFIHwgSEVBREVSX0NOVF9FTiksIDApOworCisJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+Y3NyICsgRU1BQ19FTUFDX1dSQVBQRVJfQ1NSMiwgMCwgV09MX0VOKTsKK30KKwordm9pZCBlbWFjX21hY19zdG9wKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+YmFzZSArIEVNQUNfUlhRX0NUUkxfMCwgUlhRX0VOLCAwKTsKKwllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5iYXNlICsgRU1BQ19UWFFfQ1RSTF8wLCBUWFFfRU4sIDApOworCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmJhc2UgKyBFTUFDX01BQ19DVFJMLCBUWEVOIHwgUlhFTiwgMCk7CisJdXNsZWVwX3JhbmdlKDEwMDAsIDEwNTApOyAvKiBzdG9wcGluZyBtYWMgbWF5IHRha2UgdXB0byAxbXNlYyAqLworfQorCisvKiBGcmVlIGFsbCBkZXNjcmlwdG9ycyBvZiBnaXZlbiB0cmFuc21pdCBxdWV1ZSAqLworc3RhdGljIHZvaWQgZW1hY190eF9xX2Rlc2NzX2ZyZWUoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgZW1hY190eF9xdWV1ZSAqdHhfcSA9ICZhZHB0LT50eF9xOworCXVuc2lnbmVkIGludCBpOworCXNpemVfdCBzaXplOworCisJLyogcmluZyBhbHJlYWR5IGNsZWFyZWQsIG5vdGhpbmcgdG8gZG8gKi8KKwlpZiAoIXR4X3EtPnRwZC50cGJ1ZmYpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCB0eF9xLT50cGQuY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgZW1hY19idWZmZXIgKnRwYnVmID0gR0VUX1RQRF9CVUZGRVIodHhfcSwgaSk7CisKKwkJaWYgKHRwYnVmLT5kbWFfYWRkcikgeworCQkJZG1hX3VubWFwX3NpbmdsZShhZHB0LT5uZXRkZXYtPmRldi5wYXJlbnQsCisJCQkJCSB0cGJ1Zi0+ZG1hX2FkZHIsIHRwYnVmLT5sZW5ndGgsCisJCQkJCSBETUFfVE9fREVWSUNFKTsKKwkJCXRwYnVmLT5kbWFfYWRkciA9IDA7CisJCX0KKwkJaWYgKHRwYnVmLT5za2IpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KHRwYnVmLT5za2IpOworCQkJdHBidWYtPnNrYiA9IE5VTEw7CisJCX0KKwl9CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBlbWFjX2J1ZmZlcikgKiB0eF9xLT50cGQuY291bnQ7CisJbWVtc2V0KHR4X3EtPnRwZC50cGJ1ZmYsIDAsIHNpemUpOworCisJLyogY2xlYXIgdGhlIGRlc2NyaXB0b3IgcmluZyAqLworCW1lbXNldCh0eF9xLT50cGQudl9hZGRyLCAwLCB0eF9xLT50cGQuc2l6ZSk7CisKKwl0eF9xLT50cGQuY29uc3VtZV9pZHggPSAwOworCXR4X3EtPnRwZC5wcm9kdWNlX2lkeCA9IDA7Cit9CisKKy8qIEZyZWUgYWxsIGRlc2NyaXB0b3JzIG9mIGdpdmVuIHJlY2VpdmUgcXVldWUgKi8KK3N0YXRpYyB2b2lkIGVtYWNfcnhfcV9mcmVlX2Rlc2NzKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gYWRwdC0+bmV0ZGV2LT5kZXYucGFyZW50OworCXN0cnVjdCBlbWFjX3J4X3F1ZXVlICpyeF9xID0gJmFkcHQtPnJ4X3E7CisJdW5zaWduZWQgaW50IGk7CisJc2l6ZV90IHNpemU7CisKKwkvKiByaW5nIGFscmVhZHkgY2xlYXJlZCwgbm90aGluZyB0byBkbyAqLworCWlmICghcnhfcS0+cmZkLnJmYnVmZikKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHJ4X3EtPnJmZC5jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBlbWFjX2J1ZmZlciAqcmZidWYgPSBHRVRfUkZEX0JVRkZFUihyeF9xLCBpKTsKKworCQlpZiAocmZidWYtPmRtYV9hZGRyKSB7CisJCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgcmZidWYtPmRtYV9hZGRyLCByZmJ1Zi0+bGVuZ3RoLAorCQkJCQkgRE1BX0ZST01fREVWSUNFKTsKKwkJCXJmYnVmLT5kbWFfYWRkciA9IDA7CisJCX0KKwkJaWYgKHJmYnVmLT5za2IpIHsKKwkJCWRldl9rZnJlZV9za2IocmZidWYtPnNrYik7CisJCQlyZmJ1Zi0+c2tiID0gTlVMTDsKKwkJfQorCX0KKworCXNpemUgPSAgc2l6ZW9mKHN0cnVjdCBlbWFjX2J1ZmZlcikgKiByeF9xLT5yZmQuY291bnQ7CisJbWVtc2V0KHJ4X3EtPnJmZC5yZmJ1ZmYsIDAsIHNpemUpOworCisJLyogY2xlYXIgdGhlIGRlc2NyaXB0b3IgcmluZ3MgKi8KKwltZW1zZXQocnhfcS0+cnJkLnZfYWRkciwgMCwgcnhfcS0+cnJkLnNpemUpOworCXJ4X3EtPnJyZC5wcm9kdWNlX2lkeCA9IDA7CisJcnhfcS0+cnJkLmNvbnN1bWVfaWR4ID0gMDsKKworCW1lbXNldChyeF9xLT5yZmQudl9hZGRyLCAwLCByeF9xLT5yZmQuc2l6ZSk7CisJcnhfcS0+cmZkLnByb2R1Y2VfaWR4ID0gMDsKKwlyeF9xLT5yZmQuY29uc3VtZV9pZHggPSAwOworfQorCisvKiBGcmVlIGFsbCBidWZmZXJzIGFzc29jaWF0ZWQgd2l0aCBnaXZlbiB0cmFuc21pdCBxdWV1ZSAqLworc3RhdGljIHZvaWQgZW1hY190eF9xX2J1ZnNfZnJlZShzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBlbWFjX3R4X3F1ZXVlICp0eF9xID0gJmFkcHQtPnR4X3E7CisKKwllbWFjX3R4X3FfZGVzY3NfZnJlZShhZHB0KTsKKworCWtmcmVlKHR4X3EtPnRwZC50cGJ1ZmYpOworCXR4X3EtPnRwZC50cGJ1ZmYgPSBOVUxMOworCXR4X3EtPnRwZC52X2FkZHIgPSBOVUxMOworCXR4X3EtPnRwZC5kbWFfYWRkciA9IDA7CisJdHhfcS0+dHBkLnNpemUgPSAwOworfQorCisvKiBBbGxvY2F0ZSBUWCBkZXNjcmlwdG9yIHJpbmcgZm9yIHRoZSBnaXZlbiB0cmFuc21pdCBxdWV1ZSAqLworc3RhdGljIGludCBlbWFjX3R4X3FfZGVzY19hbGxvYyhzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LAorCQkJCXN0cnVjdCBlbWFjX3R4X3F1ZXVlICp0eF9xKQoreworCXN0cnVjdCBlbWFjX3JpbmdfaGVhZGVyICpyaW5nX2hlYWRlciA9ICZhZHB0LT5yaW5nX2hlYWRlcjsKKwlzaXplX3Qgc2l6ZTsKKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGVtYWNfYnVmZmVyKSAqIHR4X3EtPnRwZC5jb3VudDsKKwl0eF9xLT50cGQudHBidWZmID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR4X3EtPnRwZC50cGJ1ZmYpCisJCXJldHVybiAtRU5PTUVNOworCisJdHhfcS0+dHBkLnNpemUgPSB0eF9xLT50cGQuY291bnQgKiAoYWRwdC0+dHBkX3NpemUgKiA0KTsKKwl0eF9xLT50cGQuZG1hX2FkZHIgPSByaW5nX2hlYWRlci0+ZG1hX2FkZHIgKyByaW5nX2hlYWRlci0+dXNlZDsKKwl0eF9xLT50cGQudl9hZGRyID0gcmluZ19oZWFkZXItPnZfYWRkciArIHJpbmdfaGVhZGVyLT51c2VkOworCXJpbmdfaGVhZGVyLT51c2VkICs9IEFMSUdOKHR4X3EtPnRwZC5zaXplLCA4KTsKKwl0eF9xLT50cGQucHJvZHVjZV9pZHggPSAwOworCXR4X3EtPnRwZC5jb25zdW1lX2lkeCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyogRnJlZSBhbGwgYnVmZmVycyBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4gdHJhbnNtaXQgcXVldWUgKi8KK3N0YXRpYyB2b2lkIGVtYWNfcnhfcV9idWZzX2ZyZWUoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgZW1hY19yeF9xdWV1ZSAqcnhfcSA9ICZhZHB0LT5yeF9xOworCisJZW1hY19yeF9xX2ZyZWVfZGVzY3MoYWRwdCk7CisKKwlrZnJlZShyeF9xLT5yZmQucmZidWZmKTsKKwlyeF9xLT5yZmQucmZidWZmICAgPSBOVUxMOworCisJcnhfcS0+cmZkLnZfYWRkciAgID0gTlVMTDsKKwlyeF9xLT5yZmQuZG1hX2FkZHIgPSAwOworCXJ4X3EtPnJmZC5zaXplICAgICA9IDA7CisKKwlyeF9xLT5ycmQudl9hZGRyICAgPSBOVUxMOworCXJ4X3EtPnJyZC5kbWFfYWRkciA9IDA7CisJcnhfcS0+cnJkLnNpemUgICAgID0gMDsKK30KKworLyogQWxsb2NhdGUgUlggZGVzY3JpcHRvciByaW5ncyBmb3IgdGhlIGdpdmVuIHJlY2VpdmUgcXVldWUgKi8KK3N0YXRpYyBpbnQgZW1hY19yeF9kZXNjc19hbGxvYyhzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBlbWFjX3JpbmdfaGVhZGVyICpyaW5nX2hlYWRlciA9ICZhZHB0LT5yaW5nX2hlYWRlcjsKKwlzdHJ1Y3QgZW1hY19yeF9xdWV1ZSAqcnhfcSA9ICZhZHB0LT5yeF9xOworCXNpemVfdCBzaXplOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZW1hY19idWZmZXIpICogcnhfcS0+cmZkLmNvdW50OworCXJ4X3EtPnJmZC5yZmJ1ZmYgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghcnhfcS0+cmZkLnJmYnVmZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyeF9xLT5ycmQuc2l6ZSA9IHJ4X3EtPnJyZC5jb3VudCAqIChhZHB0LT5ycmRfc2l6ZSAqIDQpOworCXJ4X3EtPnJmZC5zaXplID0gcnhfcS0+cmZkLmNvdW50ICogKGFkcHQtPnJmZF9zaXplICogNCk7CisKKwlyeF9xLT5ycmQuZG1hX2FkZHIgPSByaW5nX2hlYWRlci0+ZG1hX2FkZHIgKyByaW5nX2hlYWRlci0+dXNlZDsKKwlyeF9xLT5ycmQudl9hZGRyICAgPSByaW5nX2hlYWRlci0+dl9hZGRyICsgcmluZ19oZWFkZXItPnVzZWQ7CisJcmluZ19oZWFkZXItPnVzZWQgKz0gQUxJR04ocnhfcS0+cnJkLnNpemUsIDgpOworCisJcnhfcS0+cmZkLmRtYV9hZGRyID0gcmluZ19oZWFkZXItPmRtYV9hZGRyICsgcmluZ19oZWFkZXItPnVzZWQ7CisJcnhfcS0+cmZkLnZfYWRkciAgID0gcmluZ19oZWFkZXItPnZfYWRkciArIHJpbmdfaGVhZGVyLT51c2VkOworCXJpbmdfaGVhZGVyLT51c2VkICs9IEFMSUdOKHJ4X3EtPnJmZC5zaXplLCA4KTsKKworCXJ4X3EtPnJyZC5wcm9kdWNlX2lkeCA9IDA7CisJcnhfcS0+cnJkLmNvbnN1bWVfaWR4ID0gMDsKKworCXJ4X3EtPnJmZC5wcm9kdWNlX2lkeCA9IDA7CisJcnhfcS0+cmZkLmNvbnN1bWVfaWR4ID0gMDsKKworCXJldHVybiAwOworfQorCisvKiBBbGxvY2F0ZSBhbGwgVFggYW5kIFJYIGRlc2NyaXB0b3IgcmluZ3MgKi8KK2ludCBlbWFjX21hY19yeF90eF9yaW5nc19hbGxvY19hbGwoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgZW1hY19yaW5nX2hlYWRlciAqcmluZ19oZWFkZXIgPSAmYWRwdC0+cmluZ19oZWFkZXI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gYWRwdC0+bmV0ZGV2LT5kZXYucGFyZW50OworCXVuc2lnbmVkIGludCBudW1fdHhfZGVzY3MgPSBhZHB0LT50eF9kZXNjX2NudDsKKwl1bnNpZ25lZCBpbnQgbnVtX3J4X2Rlc2NzID0gYWRwdC0+cnhfZGVzY19jbnQ7CisJaW50IHJldDsKKworCWFkcHQtPnR4X3EudHBkLmNvdW50ID0gYWRwdC0+dHhfZGVzY19jbnQ7CisKKwlhZHB0LT5yeF9xLnJyZC5jb3VudCA9IGFkcHQtPnJ4X2Rlc2NfY250OworCWFkcHQtPnJ4X3EucmZkLmNvdW50ID0gYWRwdC0+cnhfZGVzY19jbnQ7CisKKwkvKiBSaW5nIERNQSBidWZmZXIuIEVhY2ggcmluZyBtYXkgbmVlZCB1cCB0byA4IGJ5dGVzIGZvciBhbGlnbm1lbnQsCisJICogaGVuY2UgdGhlIGFkZGl0aW9uYWwgcGFkZGluZyBieXRlcyBhcmUgYWxsb2NhdGVkLgorCSAqLworCXJpbmdfaGVhZGVyLT5zaXplID0gbnVtX3R4X2Rlc2NzICogKGFkcHQtPnRwZF9zaXplICogNCkgKworCQkJICAgIG51bV9yeF9kZXNjcyAqIChhZHB0LT5yZmRfc2l6ZSAqIDQpICsKKwkJCSAgICBudW1fcnhfZGVzY3MgKiAoYWRwdC0+cnJkX3NpemUgKiA0KSArCisJCQkgICAgOCArIDIgKiA4OyAvKiA4IGJ5dGUgcGVyIG9uZSBUeCBhbmQgdHdvIFJ4IHJpbmdzICovCisKKwlyaW5nX2hlYWRlci0+dXNlZCA9IDA7CisJcmluZ19oZWFkZXItPnZfYWRkciA9IGRtYV96YWxsb2NfY29oZXJlbnQoZGV2LCByaW5nX2hlYWRlci0+c2l6ZSwKKwkJCQkJCSAmcmluZ19oZWFkZXItPmRtYV9hZGRyLAorCQkJCQkJIEdGUF9LRVJORUwpOworCWlmICghcmluZ19oZWFkZXItPnZfYWRkcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyaW5nX2hlYWRlci0+dXNlZCA9IEFMSUdOKHJpbmdfaGVhZGVyLT5kbWFfYWRkciwgOCkgLQorCQkJCQkJCXJpbmdfaGVhZGVyLT5kbWFfYWRkcjsKKworCXJldCA9IGVtYWNfdHhfcV9kZXNjX2FsbG9jKGFkcHQsICZhZHB0LT50eF9xKTsKKwlpZiAocmV0KSB7CisJCW5ldGRldl9lcnIoYWRwdC0+bmV0ZGV2LCAiZXJyb3I6IFR4IFF1ZXVlIGFsbG9jIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2FsbG9jX3R4OworCX0KKworCXJldCA9IGVtYWNfcnhfZGVzY3NfYWxsb2MoYWRwdCk7CisJaWYgKHJldCkgeworCQluZXRkZXZfZXJyKGFkcHQtPm5ldGRldiwgImVycm9yOiBSeCBRdWV1ZSBhbGxvYyBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9hbGxvY19yeDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2FsbG9jX3J4OgorCWVtYWNfdHhfcV9idWZzX2ZyZWUoYWRwdCk7CitlcnJfYWxsb2NfdHg6CisJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCByaW5nX2hlYWRlci0+c2l6ZSwKKwkJCSAgcmluZ19oZWFkZXItPnZfYWRkciwgcmluZ19oZWFkZXItPmRtYV9hZGRyKTsKKworCXJpbmdfaGVhZGVyLT52X2FkZHIgICA9IE5VTEw7CisJcmluZ19oZWFkZXItPmRtYV9hZGRyID0gMDsKKwlyaW5nX2hlYWRlci0+c2l6ZSAgICAgPSAwOworCXJpbmdfaGVhZGVyLT51c2VkICAgICA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBGcmVlIGFsbCBUWCBhbmQgUlggZGVzY3JpcHRvciByaW5ncyAqLwordm9pZCBlbWFjX21hY19yeF90eF9yaW5nc19mcmVlX2FsbChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBlbWFjX3JpbmdfaGVhZGVyICpyaW5nX2hlYWRlciA9ICZhZHB0LT5yaW5nX2hlYWRlcjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhZHB0LT5uZXRkZXYtPmRldi5wYXJlbnQ7CisKKwllbWFjX3R4X3FfYnVmc19mcmVlKGFkcHQpOworCWVtYWNfcnhfcV9idWZzX2ZyZWUoYWRwdCk7CisKKwlkbWFfZnJlZV9jb2hlcmVudChkZXYsIHJpbmdfaGVhZGVyLT5zaXplLAorCQkJICByaW5nX2hlYWRlci0+dl9hZGRyLCByaW5nX2hlYWRlci0+ZG1hX2FkZHIpOworCisJcmluZ19oZWFkZXItPnZfYWRkciAgID0gTlVMTDsKKwlyaW5nX2hlYWRlci0+ZG1hX2FkZHIgPSAwOworCXJpbmdfaGVhZGVyLT5zaXplICAgICA9IDA7CisJcmluZ19oZWFkZXItPnVzZWQgICAgID0gMDsKK30KKworLyogSW5pdGlhbGl6ZSBkZXNjcmlwdG9yIHJpbmdzICovCitzdGF0aWMgdm9pZCBlbWFjX21hY19yeF90eF9yaW5nX3Jlc2V0X2FsbChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXVuc2lnbmVkIGludCBpOworCisJYWRwdC0+dHhfcS50cGQucHJvZHVjZV9pZHggPSAwOworCWFkcHQtPnR4X3EudHBkLmNvbnN1bWVfaWR4ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgYWRwdC0+dHhfcS50cGQuY291bnQ7IGkrKykKKwkJYWRwdC0+dHhfcS50cGQudHBidWZmW2ldLmRtYV9hZGRyID0gMDsKKworCWFkcHQtPnJ4X3EucnJkLnByb2R1Y2VfaWR4ID0gMDsKKwlhZHB0LT5yeF9xLnJyZC5jb25zdW1lX2lkeCA9IDA7CisJYWRwdC0+cnhfcS5yZmQucHJvZHVjZV9pZHggPSAwOworCWFkcHQtPnJ4X3EucmZkLmNvbnN1bWVfaWR4ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgYWRwdC0+cnhfcS5yZmQuY291bnQ7IGkrKykKKwkJYWRwdC0+cnhfcS5yZmQucmZidWZmW2ldLmRtYV9hZGRyID0gMDsKK30KKworLyogUHJvZHVjZSBuZXcgcmVjZWl2ZSBmcmVlIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyB2b2lkIGVtYWNfbWFjX3J4X3JmZF9jcmVhdGUoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwKKwkJCQkgICBzdHJ1Y3QgZW1hY19yeF9xdWV1ZSAqcnhfcSwKKwkJCQkgICBkbWFfYWRkcl90IGFkZHIpCit7CisJdTMyICpod19yZmQgPSBFTUFDX1JGRChyeF9xLCBhZHB0LT5yZmRfc2l6ZSwgcnhfcS0+cmZkLnByb2R1Y2VfaWR4KTsKKworCSooaHdfcmZkKyspID0gbG93ZXJfMzJfYml0cyhhZGRyKTsKKwkqaHdfcmZkID0gdXBwZXJfMzJfYml0cyhhZGRyKTsKKworCWlmICgrK3J4X3EtPnJmZC5wcm9kdWNlX2lkeCA9PSByeF9xLT5yZmQuY291bnQpCisJCXJ4X3EtPnJmZC5wcm9kdWNlX2lkeCA9IDA7Cit9CisKKy8qIEZpbGwgdXAgcmVjZWl2ZSBxdWV1ZSdzIFJGRCB3aXRoIHByZWFsbG9jYXRlZCByZWNlaXZlIGJ1ZmZlcnMgKi8KK3N0YXRpYyB2b2lkIGVtYWNfbWFjX3J4X2Rlc2NzX3JlZmlsbChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LAorCQkJCSAgICBzdHJ1Y3QgZW1hY19yeF9xdWV1ZSAqcnhfcSkKK3sKKwlzdHJ1Y3QgZW1hY19idWZmZXIgKmN1cnJfcnhidWY7CisJc3RydWN0IGVtYWNfYnVmZmVyICpuZXh0X3J4YnVmOworCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisJdTMyIG5leHRfcHJvZHVjZV9pZHg7CisKKwluZXh0X3Byb2R1Y2VfaWR4ID0gcnhfcS0+cmZkLnByb2R1Y2VfaWR4ICsgMTsKKwlpZiAobmV4dF9wcm9kdWNlX2lkeCA9PSByeF9xLT5yZmQuY291bnQpCisJCW5leHRfcHJvZHVjZV9pZHggPSAwOworCisJY3Vycl9yeGJ1ZiA9IEdFVF9SRkRfQlVGRkVSKHJ4X3EsIHJ4X3EtPnJmZC5wcm9kdWNlX2lkeCk7CisJbmV4dF9yeGJ1ZiA9IEdFVF9SRkRfQlVGRkVSKHJ4X3EsIG5leHRfcHJvZHVjZV9pZHgpOworCisJLyogdGhpcyBhbHdheXMgaGFzIGEgYmxhbmsgcnhfYnVmZmVyKi8KKwl3aGlsZSAoIW5leHRfcnhidWYtPmRtYV9hZGRyKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWludCByZXQ7CisKKwkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbihhZHB0LT5uZXRkZXYsIGFkcHQtPnJ4YnVmX3NpemUpOworCQlpZiAoIXNrYikKKwkJCWJyZWFrOworCisJCWN1cnJfcnhidWYtPmRtYV9hZGRyID0KKwkJCWRtYV9tYXBfc2luZ2xlKGFkcHQtPm5ldGRldi0+ZGV2LnBhcmVudCwgc2tiLT5kYXRhLAorCQkJCSAgICAgICBjdXJyX3J4YnVmLT5sZW5ndGgsIERNQV9GUk9NX0RFVklDRSk7CisJCXJldCA9IGRtYV9tYXBwaW5nX2Vycm9yKGFkcHQtPm5ldGRldi0+ZGV2LnBhcmVudCwKKwkJCQkJY3Vycl9yeGJ1Zi0+ZG1hX2FkZHIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlicmVhazsKKwkJfQorCQljdXJyX3J4YnVmLT5za2IgPSBza2I7CisJCWN1cnJfcnhidWYtPmxlbmd0aCA9IGFkcHQtPnJ4YnVmX3NpemU7CisKKwkJZW1hY19tYWNfcnhfcmZkX2NyZWF0ZShhZHB0LCByeF9xLCBjdXJyX3J4YnVmLT5kbWFfYWRkcik7CisJCW5leHRfcHJvZHVjZV9pZHggPSByeF9xLT5yZmQucHJvZHVjZV9pZHggKyAxOworCQlpZiAobmV4dF9wcm9kdWNlX2lkeCA9PSByeF9xLT5yZmQuY291bnQpCisJCQluZXh0X3Byb2R1Y2VfaWR4ID0gMDsKKworCQljdXJyX3J4YnVmID0gR0VUX1JGRF9CVUZGRVIocnhfcSwgcnhfcS0+cmZkLnByb2R1Y2VfaWR4KTsKKwkJbmV4dF9yeGJ1ZiA9IEdFVF9SRkRfQlVGRkVSKHJ4X3EsIG5leHRfcHJvZHVjZV9pZHgpOworCQljb3VudCsrOworCX0KKworCWlmIChjb3VudCkgeworCQl1MzIgcHJvZF9pZHggPSAocnhfcS0+cmZkLnByb2R1Y2VfaWR4IDw8IHJ4X3EtPnByb2R1Y2Vfc2hpZnQpICYKKwkJCQlyeF9xLT5wcm9kdWNlX21hc2s7CisJCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmJhc2UgKyByeF9xLT5wcm9kdWNlX3JlZywKKwkJCQkgIHJ4X3EtPnByb2R1Y2VfbWFzaywgcHJvZF9pZHgpOworCX0KK30KKworc3RhdGljIHZvaWQgZW1hY19hZGp1c3RfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBuZXRkZXYtPnBoeWRldjsKKworCWlmIChwaHlkZXYtPmxpbmspCisJCWVtYWNfbWFjX3N0YXJ0KGFkcHQpOworCWVsc2UKKwkJZW1hY19tYWNfc3RvcChhZHB0KTsKKworCXBoeV9wcmludF9zdGF0dXMocGh5ZGV2KTsKK30KKworLyogQnJpbmd1cCB0aGUgaW50ZXJmYWNlL0hXICovCitpbnQgZW1hY19tYWNfdXAoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRwdC0+bmV0ZGV2OworCXN0cnVjdCBlbWFjX2lycQkqaXJxID0gJmFkcHQtPmlycTsKKwlpbnQgcmV0OworCisJZW1hY19tYWNfcnhfdHhfcmluZ19yZXNldF9hbGwoYWRwdCk7CisJZW1hY19tYWNfY29uZmlnKGFkcHQpOworCisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLT5pcnEsIGVtYWNfaXNyLCAwLCBFTUFDX01BQ19JUlFfUkVTLCBpcnEpOworCWlmIChyZXQpIHsKKwkJbmV0ZGV2X2VycihhZHB0LT5uZXRkZXYsICJjb3VsZCBub3QgcmVxdWVzdCAlcyBpcnFcbiIsCisJCQkgICBFTUFDX01BQ19JUlFfUkVTKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwllbWFjX21hY19yeF9kZXNjc19yZWZpbGwoYWRwdCwgJmFkcHQtPnJ4X3EpOworCisJcmV0ID0gcGh5X2Nvbm5lY3RfZGlyZWN0KG5ldGRldiwgYWRwdC0+cGh5ZGV2LCBlbWFjX2FkanVzdF9saW5rLAorCQkJCSBQSFlfSU5URVJGQUNFX01PREVfU0dNSUkpOworCWlmIChyZXQpIHsKKwkJbmV0ZGV2X2VycihhZHB0LT5uZXRkZXYsICJjb3VsZCBub3QgY29ubmVjdCBwaHlcbiIpOworCQlmcmVlX2lycShpcnEtPmlycSwgaXJxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBlbmFibGUgbWFjIGlycSAqLworCXdyaXRlbCgodTMyKX5ESVNfSU5ULCBhZHB0LT5iYXNlICsgRU1BQ19JTlRfU1RBVFVTKTsKKwl3cml0ZWwoYWRwdC0+aXJxLm1hc2ssIGFkcHQtPmJhc2UgKyBFTUFDX0lOVF9NQVNLKTsKKworCWFkcHQtPnBoeWRldi0+aXJxID0gUEhZX0lHTk9SRV9JTlRFUlJVUFQ7CisJcGh5X3N0YXJ0KGFkcHQtPnBoeWRldik7CisKKwluYXBpX2VuYWJsZSgmYWRwdC0+cnhfcS5uYXBpKTsKKwluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEJyaW5nIGRvd24gdGhlIGludGVyZmFjZS9IVyAqLwordm9pZCBlbWFjX21hY19kb3duKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkcHQtPm5ldGRldjsKKworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwluYXBpX2Rpc2FibGUoJmFkcHQtPnJ4X3EubmFwaSk7CisKKwlwaHlfc3RvcChhZHB0LT5waHlkZXYpOworCXBoeV9kaXNjb25uZWN0KGFkcHQtPnBoeWRldik7CisKKwkvKiBkaXNhYmxlIG1hYyBpcnEgKi8KKwl3cml0ZWwoRElTX0lOVCwgYWRwdC0+YmFzZSArIEVNQUNfSU5UX1NUQVRVUyk7CisJd3JpdGVsKDAsIGFkcHQtPmJhc2UgKyBFTUFDX0lOVF9NQVNLKTsKKwlzeW5jaHJvbml6ZV9pcnEoYWRwdC0+aXJxLmlycSk7CisJZnJlZV9pcnEoYWRwdC0+aXJxLmlycSwgJmFkcHQtPmlycSk7CisKKwllbWFjX21hY19yZXNldChhZHB0KTsKKworCWVtYWNfdHhfcV9kZXNjc19mcmVlKGFkcHQpOworCW5ldGRldl9yZXNldF9xdWV1ZShhZHB0LT5uZXRkZXYpOworCWVtYWNfcnhfcV9mcmVlX2Rlc2NzKGFkcHQpOworfQorCisvKiBDb25zdW1lIG5leHQgcmVjZWl2ZWQgcGFja2V0IGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBib29sIGVtYWNfcnhfcHJvY2Vzc19ycmQoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwKKwkJCQlzdHJ1Y3QgZW1hY19yeF9xdWV1ZSAqcnhfcSwKKwkJCQlzdHJ1Y3QgZW1hY19ycmQgKnJyZCkKK3sKKwl1MzIgKmh3X3JyZCA9IEVNQUNfUlJEKHJ4X3EsIGFkcHQtPnJyZF9zaXplLCByeF9xLT5ycmQuY29uc3VtZV9pZHgpOworCisJcnJkLT53b3JkWzNdID0gKihod19ycmQgKyAzKTsKKworCWlmICghUlJEX1VQRFQocnJkKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcnJkLT53b3JkWzRdID0gMDsKKwlycmQtPndvcmRbNV0gPSAwOworCisJcnJkLT53b3JkWzBdID0gKihod19ycmQrKyk7CisJcnJkLT53b3JkWzFdID0gKihod19ycmQrKyk7CisJcnJkLT53b3JkWzJdID0gKihod19ycmQrKyk7CisKKwlpZiAodW5saWtlbHkoUlJEX05PUihycmQpICE9IDEpKSB7CisJCW5ldGRldl9lcnIoYWRwdC0+bmV0ZGV2LAorCQkJICAgImVycm9yOiBtdWx0aS1SRkQgbm90IHN1cHBvcnQgeWV0ISBub3I6JWx1XG4iLAorCQkJICAgUlJEX05PUihycmQpKTsKKwl9CisKKwkvKiBtYXJrIHJyZCBhcyBwcm9jZXNzZWQgKi8KKwlSUkRfVVBEVF9TRVQocnJkLCAwKTsKKwkqaHdfcnJkID0gcnJkLT53b3JkWzNdOworCisJaWYgKCsrcnhfcS0+cnJkLmNvbnN1bWVfaWR4ID09IHJ4X3EtPnJyZC5jb3VudCkKKwkJcnhfcS0+cnJkLmNvbnN1bWVfaWR4ID0gMDsKKworCXJldHVybiB0cnVlOworfQorCisvKiBQcm9kdWNlIG5ldyB0cmFuc21pdCBkZXNjcmlwdG9yICovCitzdGF0aWMgdm9pZCBlbWFjX3R4X3RwZF9jcmVhdGUoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwKKwkJCSAgICAgICBzdHJ1Y3QgZW1hY190eF9xdWV1ZSAqdHhfcSwgc3RydWN0IGVtYWNfdHBkICp0cGQpCit7CisJdTMyICpod190cGQ7CisKKwl0eF9xLT50cGQubGFzdF9wcm9kdWNlX2lkeCA9IHR4X3EtPnRwZC5wcm9kdWNlX2lkeDsKKwlod190cGQgPSBFTUFDX1RQRCh0eF9xLCBhZHB0LT50cGRfc2l6ZSwgdHhfcS0+dHBkLnByb2R1Y2VfaWR4KTsKKworCWlmICgrK3R4X3EtPnRwZC5wcm9kdWNlX2lkeCA9PSB0eF9xLT50cGQuY291bnQpCisJCXR4X3EtPnRwZC5wcm9kdWNlX2lkeCA9IDA7CisKKwkqKGh3X3RwZCsrKSA9IHRwZC0+d29yZFswXTsKKwkqKGh3X3RwZCsrKSA9IHRwZC0+d29yZFsxXTsKKwkqKGh3X3RwZCsrKSA9IHRwZC0+d29yZFsyXTsKKwkqaHdfdHBkID0gdHBkLT53b3JkWzNdOworfQorCisvKiBNYXJrIHRoZSBsYXN0IHRyYW5zbWl0IGRlc2NyaXB0b3IgYXMgc3VjaCAoZm9yIHRoZSB0cmFuc21pdCBwYWNrZXQpICovCitzdGF0aWMgdm9pZCBlbWFjX3R4X3RwZF9tYXJrX2xhc3Qoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwKKwkJCQkgIHN0cnVjdCBlbWFjX3R4X3F1ZXVlICp0eF9xKQoreworCXUzMiAqaHdfdHBkID0KKwkJRU1BQ19UUEQodHhfcSwgYWRwdC0+dHBkX3NpemUsIHR4X3EtPnRwZC5sYXN0X3Byb2R1Y2VfaWR4KTsKKwl1MzIgdG1wX3RwZDsKKworCXRtcF90cGQgPSAqKGh3X3RwZCArIDEpOworCXRtcF90cGQgfD0gRU1BQ19UUERfTEFTVF9GUkFHTUVOVDsKKwkqKGh3X3RwZCArIDEpID0gdG1wX3RwZDsKK30KKworc3RhdGljIHZvaWQgZW1hY19yeF9yZmRfY2xlYW4oc3RydWN0IGVtYWNfcnhfcXVldWUgKnJ4X3EsIHN0cnVjdCBlbWFjX3JyZCAqcnJkKQoreworCXN0cnVjdCBlbWFjX2J1ZmZlciAqcmZidWYgPSByeF9xLT5yZmQucmZidWZmOworCXUzMiBjb25zdW1lX2lkeCA9IFJSRF9TSShycmQpOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IFJSRF9OT1IocnJkKTsgaSsrKSB7CisJCXJmYnVmW2NvbnN1bWVfaWR4XS5za2IgPSBOVUxMOworCQlpZiAoKytjb25zdW1lX2lkeCA9PSByeF9xLT5yZmQuY291bnQpCisJCQljb25zdW1lX2lkeCA9IDA7CisJfQorCisJcnhfcS0+cmZkLmNvbnN1bWVfaWR4ID0gY29uc3VtZV9pZHg7CisJcnhfcS0+cmZkLnByb2Nlc3NfaWR4ID0gY29uc3VtZV9pZHg7Cit9CisKKy8qIFB1c2ggdGhlIHJlY2VpdmVkIHNrYiB0byB1cHBlciBsYXllcnMgKi8KK3N0YXRpYyB2b2lkIGVtYWNfcmVjZWl2ZV9za2Ioc3RydWN0IGVtYWNfcnhfcXVldWUgKnJ4X3EsCisJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIHUxNiB2bGFuX3RhZywgYm9vbCB2bGFuX2ZsYWcpCit7CisJaWYgKHZsYW5fZmxhZykgeworCQl1MTYgdmxhbjsKKworCQlFTUFDX1RBR19UT19WTEFOKHZsYW5fdGFnLCB2bGFuKTsKKwkJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIGh0b25zKEVUSF9QXzgwMjFRKSwgdmxhbik7CisJfQorCisJbmFwaV9ncm9fcmVjZWl2ZSgmcnhfcS0+bmFwaSwgc2tiKTsKK30KKworLyogUHJvY2VzcyByZWNlaXZlIGV2ZW50ICovCit2b2lkIGVtYWNfbWFjX3J4X3Byb2Nlc3Moc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwgc3RydWN0IGVtYWNfcnhfcXVldWUgKnJ4X3EsCisJCQkgaW50ICpudW1fcGt0cywgaW50IG1heF9wa3RzKQoreworCXUzMiBwcm9jX2lkeCwgaHdfY29uc3VtZV9pZHgsIG51bV9jb25zdW1lX3BrdHM7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiAgPSBhZHB0LT5uZXRkZXY7CisJc3RydWN0IGVtYWNfYnVmZmVyICpyZmJ1ZjsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCXN0cnVjdCBlbWFjX3JyZCBycmQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MzIgcmVnOworCisJcmVnID0gcmVhZGxfcmVsYXhlZChhZHB0LT5iYXNlICsgcnhfcS0+Y29uc3VtZV9yZWcpOworCisJaHdfY29uc3VtZV9pZHggPSAocmVnICYgcnhfcS0+Y29uc3VtZV9tYXNrKSA+PiByeF9xLT5jb25zdW1lX3NoaWZ0OworCW51bV9jb25zdW1lX3BrdHMgPSAoaHdfY29uc3VtZV9pZHggPj0gcnhfcS0+cnJkLmNvbnN1bWVfaWR4KSA/CisJCShod19jb25zdW1lX2lkeCAtICByeF9xLT5ycmQuY29uc3VtZV9pZHgpIDoKKwkJKGh3X2NvbnN1bWVfaWR4ICsgcnhfcS0+cnJkLmNvdW50IC0gcnhfcS0+cnJkLmNvbnN1bWVfaWR4KTsKKworCWRvIHsKKwkJaWYgKCFudW1fY29uc3VtZV9wa3RzKQorCQkJYnJlYWs7CisKKwkJaWYgKCFlbWFjX3J4X3Byb2Nlc3NfcnJkKGFkcHQsIHJ4X3EsICZycmQpKQorCQkJYnJlYWs7CisKKwkJaWYgKGxpa2VseShSUkRfTk9SKCZycmQpID09IDEpKSB7CisJCQkvKiBnb29kIHJlY2VpdmUgKi8KKwkJCXJmYnVmID0gR0VUX1JGRF9CVUZGRVIocnhfcSwgUlJEX1NJKCZycmQpKTsKKwkJCWRtYV91bm1hcF9zaW5nbGUoYWRwdC0+bmV0ZGV2LT5kZXYucGFyZW50LAorCQkJCQkgcmZidWYtPmRtYV9hZGRyLCByZmJ1Zi0+bGVuZ3RoLAorCQkJCQkgRE1BX0ZST01fREVWSUNFKTsKKwkJCXJmYnVmLT5kbWFfYWRkciA9IDA7CisJCQlza2IgPSByZmJ1Zi0+c2tiOworCQl9IGVsc2UgeworCQkJbmV0ZGV2X2VycihhZHB0LT5uZXRkZXYsCisJCQkJICAgImVycm9yOiBtdWx0aS1SRkQgbm90IHN1cHBvcnQgeWV0IVxuIik7CisJCQlicmVhazsKKwkJfQorCQllbWFjX3J4X3JmZF9jbGVhbihyeF9xLCAmcnJkKTsKKwkJbnVtX2NvbnN1bWVfcGt0cy0tOworCQljb3VudCsrOworCisJCS8qIER1ZSB0byBhIEhXIGlzc3VlIGluIEw0IGNoZWNrIHN1bSBkZXRlY3Rpb24gKFVEUC9UQ1AgZnJhZ3MKKwkJICogd2l0aCBERiBzZXQgYXJlIG1hcmtlZCBhcyBlcnJvciksIGRyb3AgcGFja2V0cyBiYXNlZCBvbiB0aGUKKwkJICogZXJyb3IgbWFzayByYXRoZXIgdGhhbiB0aGUgc3VtbWFyeSBiaXQgKGlnbm9yaW5nIEw0RiBlcnJvcnMpCisJCSAqLworCQlpZiAocnJkLndvcmRbRU1BQ19SUkRfU1RBVFNfRFdfSURYXSAmIEVNQUNfUlJEX0VSUk9SKSB7CisJCQluZXRpZl9kYmcoYWRwdCwgcnhfc3RhdHVzLCBhZHB0LT5uZXRkZXYsCisJCQkJICAiRHJvcCBlcnJvciBwYWNrZXRbUlJEOiAweCV4OjB4JXg6MHgleDoweCV4XVxuIiwKKwkJCQkgIHJyZC53b3JkWzBdLCBycmQud29yZFsxXSwKKwkJCQkgIHJyZC53b3JkWzJdLCBycmQud29yZFszXSk7CisKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc2tiX3B1dChza2IsIFJSRF9QS1RfU0laRSgmcnJkKSAtIEVUSF9GQ1NfTEVOKTsKKwkJc2tiLT5kZXYgPSBuZXRkZXY7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsKKwkJaWYgKG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkKKwkJCXNrYi0+aXBfc3VtbWVkID0gUlJEX0w0RigmcnJkKSA/CisJCQkJCSAgQ0hFQ0tTVU1fTk9ORSA6IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQllbHNlCisJCQlza2JfY2hlY2tzdW1fbm9uZV9hc3NlcnQoc2tiKTsKKworCQllbWFjX3JlY2VpdmVfc2tiKHJ4X3EsIHNrYiwgKHUxNilSUkRfQ1ZBTE5fVEFHKCZycmQpLAorCQkJCSAoYm9vbClSUkRfQ1ZUQUcoJnJyZCkpOworCisJCW5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCSgqbnVtX3BrdHMpKys7CisJfSB3aGlsZSAoKm51bV9wa3RzIDwgbWF4X3BrdHMpOworCisJaWYgKGNvdW50KSB7CisJCXByb2NfaWR4ID0gKHJ4X3EtPnJmZC5wcm9jZXNzX2lkeCA8PCByeF9xLT5wcm9jZXNzX3NoZnQpICYKKwkJCQlyeF9xLT5wcm9jZXNzX21hc2s7CisJCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmJhc2UgKyByeF9xLT5wcm9jZXNzX3JlZywKKwkJCQkgIHJ4X3EtPnByb2Nlc3NfbWFzaywgcHJvY19pZHgpOworCQllbWFjX21hY19yeF9kZXNjc19yZWZpbGwoYWRwdCwgcnhfcSk7CisJfQorfQorCisvKiBnZXQgdGhlIG51bWJlciBvZiBmcmVlIHRyYW5zbWl0IGRlc2NyaXB0b3JzICovCitzdGF0aWMgdW5zaWduZWQgaW50IGVtYWNfdHBkX251bV9mcmVlX2Rlc2NzKHN0cnVjdCBlbWFjX3R4X3F1ZXVlICp0eF9xKQoreworCXUzMiBwcm9kdWNlX2lkeCA9IHR4X3EtPnRwZC5wcm9kdWNlX2lkeDsKKwl1MzIgY29uc3VtZV9pZHggPSB0eF9xLT50cGQuY29uc3VtZV9pZHg7CisKKwlyZXR1cm4gKGNvbnN1bWVfaWR4ID4gcHJvZHVjZV9pZHgpID8KKwkJKGNvbnN1bWVfaWR4IC0gcHJvZHVjZV9pZHggLSAxKSA6CisJCSh0eF9xLT50cGQuY291bnQgKyBjb25zdW1lX2lkeCAtIHByb2R1Y2VfaWR4IC0gMSk7Cit9CisKKy8qIFByb2Nlc3MgdHJhbnNtaXQgZXZlbnQgKi8KK3ZvaWQgZW1hY19tYWNfdHhfcHJvY2VzcyhzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LCBzdHJ1Y3QgZW1hY190eF9xdWV1ZSAqdHhfcSkKK3sKKwl1MzIgcmVnID0gcmVhZGxfcmVsYXhlZChhZHB0LT5iYXNlICsgdHhfcS0+Y29uc3VtZV9yZWcpOworCXUzMiBod19jb25zdW1lX2lkeCwgcGt0c19jb21wbCA9IDAsIGJ5dGVzX2NvbXBsID0gMDsKKwlzdHJ1Y3QgZW1hY19idWZmZXIgKnRwYnVmOworCisJaHdfY29uc3VtZV9pZHggPSAocmVnICYgdHhfcS0+Y29uc3VtZV9tYXNrKSA+PiB0eF9xLT5jb25zdW1lX3NoaWZ0OworCisJd2hpbGUgKHR4X3EtPnRwZC5jb25zdW1lX2lkeCAhPSBod19jb25zdW1lX2lkeCkgeworCQl0cGJ1ZiA9IEdFVF9UUERfQlVGRkVSKHR4X3EsIHR4X3EtPnRwZC5jb25zdW1lX2lkeCk7CisJCWlmICh0cGJ1Zi0+ZG1hX2FkZHIpIHsKKwkJCWRtYV91bm1hcF9zaW5nbGUoYWRwdC0+bmV0ZGV2LT5kZXYucGFyZW50LAorCQkJCQkgdHBidWYtPmRtYV9hZGRyLCB0cGJ1Zi0+bGVuZ3RoLAorCQkJCQkgRE1BX1RPX0RFVklDRSk7CisJCQl0cGJ1Zi0+ZG1hX2FkZHIgPSAwOworCQl9CisKKwkJaWYgKHRwYnVmLT5za2IpIHsKKwkJCXBrdHNfY29tcGwrKzsKKwkJCWJ5dGVzX2NvbXBsICs9IHRwYnVmLT5za2ItPmxlbjsKKwkJCWRldl9rZnJlZV9za2JfaXJxKHRwYnVmLT5za2IpOworCQkJdHBidWYtPnNrYiA9IE5VTEw7CisJCX0KKworCQlpZiAoKyt0eF9xLT50cGQuY29uc3VtZV9pZHggPT0gdHhfcS0+dHBkLmNvdW50KQorCQkJdHhfcS0+dHBkLmNvbnN1bWVfaWR4ID0gMDsKKwl9CisKKwluZXRkZXZfY29tcGxldGVkX3F1ZXVlKGFkcHQtPm5ldGRldiwgcGt0c19jb21wbCwgYnl0ZXNfY29tcGwpOworCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoYWRwdC0+bmV0ZGV2KSkKKwkJaWYgKGVtYWNfdHBkX251bV9mcmVlX2Rlc2NzKHR4X3EpID4gKE1BWF9TS0JfRlJBR1MgKyAxKSkKKwkJCW5ldGlmX3dha2VfcXVldWUoYWRwdC0+bmV0ZGV2KTsKK30KKworLyogSW5pdGlhbGl6ZSBhbGwgcXVldWUgZGF0YSBzdHJ1Y3R1cmVzICovCit2b2lkIGVtYWNfbWFjX3J4X3R4X3JpbmdfaW5pdF9hbGwoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgIHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJYWRwdC0+cnhfcS5uZXRkZXYgPSBhZHB0LT5uZXRkZXY7CisKKwlhZHB0LT5yeF9xLnByb2R1Y2VfcmVnICA9IEVNQUNfTUFJTEJPWF8wOworCWFkcHQtPnJ4X3EucHJvZHVjZV9tYXNrID0gUkZEMF9QUk9EX0lEWF9CTVNLOworCWFkcHQtPnJ4X3EucHJvZHVjZV9zaGlmdCA9IFJGRDBfUFJPRF9JRFhfU0hGVDsKKworCWFkcHQtPnJ4X3EucHJvY2Vzc19yZWcgID0gRU1BQ19NQUlMQk9YXzA7CisJYWRwdC0+cnhfcS5wcm9jZXNzX21hc2sgPSBSRkQwX1BST0NfSURYX0JNU0s7CisJYWRwdC0+cnhfcS5wcm9jZXNzX3NoZnQgPSBSRkQwX1BST0NfSURYX1NIRlQ7CisKKwlhZHB0LT5yeF9xLmNvbnN1bWVfcmVnICA9IEVNQUNfTUFJTEJPWF8zOworCWFkcHQtPnJ4X3EuY29uc3VtZV9tYXNrID0gUkZEMF9DT05TX0lEWF9CTVNLOworCWFkcHQtPnJ4X3EuY29uc3VtZV9zaGlmdCA9IFJGRDBfQ09OU19JRFhfU0hGVDsKKworCWFkcHQtPnJ4X3EuaXJxICAgICAgICAgID0gJmFkcHQtPmlycTsKKwlhZHB0LT5yeF9xLmludHIgICAgICAgICA9IGFkcHQtPmlycS5tYXNrICYgSVNSX1JYX1BLVDsKKworCWFkcHQtPnR4X3EucHJvZHVjZV9yZWcgID0gRU1BQ19NQUlMQk9YXzE1OworCWFkcHQtPnR4X3EucHJvZHVjZV9tYXNrID0gTlRQRF9QUk9EX0lEWF9CTVNLOworCWFkcHQtPnR4X3EucHJvZHVjZV9zaGlmdCA9IE5UUERfUFJPRF9JRFhfU0hGVDsKKworCWFkcHQtPnR4X3EuY29uc3VtZV9yZWcgID0gRU1BQ19NQUlMQk9YXzI7CisJYWRwdC0+dHhfcS5jb25zdW1lX21hc2sgPSBOVFBEX0NPTlNfSURYX0JNU0s7CisJYWRwdC0+dHhfcS5jb25zdW1lX3NoaWZ0ID0gTlRQRF9DT05TX0lEWF9TSEZUOworfQorCisvKiBGaWxsIHVwIHRyYW5zbWl0IGRlc2NyaXB0b3JzIHdpdGggVFNPIGFuZCBDaGVja3N1bSBvZmZsb2FkIGluZm9ybWF0aW9uICovCitzdGF0aWMgaW50IGVtYWNfdHNvX2NzdW0oc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwKKwkJCSBzdHJ1Y3QgZW1hY190eF9xdWV1ZSAqdHhfcSwKKwkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJIHN0cnVjdCBlbWFjX3RwZCAqdHBkKQoreworCXVuc2lnbmVkIGludCBoZHJfbGVuOworCWludCByZXQ7CisKKwlpZiAoc2tiX2lzX2dzbyhza2IpKSB7CisJCWlmIChza2JfaGVhZGVyX2Nsb25lZChza2IpKSB7CisJCQlyZXQgPSBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQyk7CisJCQlpZiAodW5saWtlbHkocmV0KSkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKSB7CisJCQl1MzIgcGt0X2xlbiA9ICgodW5zaWduZWQgY2hhciAqKWlwX2hkcihza2IpIC0gc2tiLT5kYXRhKQorCQkJCSAgICAgICArIG50b2hzKGlwX2hkcihza2IpLT50b3RfbGVuKTsKKwkJCWlmIChza2ItPmxlbiA+IHBrdF9sZW4pCisJCQkJcHNrYl90cmltKHNrYiwgcGt0X2xlbik7CisJCX0KKworCQloZHJfbGVuID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArIHRjcF9oZHJsZW4oc2tiKTsKKwkJaWYgKHVubGlrZWx5KHNrYi0+bGVuID09IGhkcl9sZW4pKSB7CisJCQkvKiB3ZSBvbmx5IG5lZWQgdG8gZG8gY3N1bSAqLworCQkJbmV0aWZfd2FybihhZHB0LCB0eF9lcnIsIGFkcHQtPm5ldGRldiwKKwkJCQkgICAidHNvIG5vdCBuZWVkZWQgZm9yIHBhY2tldCB3aXRoIDAgZGF0YVxuIik7CisJCQlnb3RvIGRvX2NzdW07CisJCX0KKworCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSAmIFNLQl9HU09fVENQVjQpIHsKKwkJCWlwX2hkcihza2IpLT5jaGVjayA9IDA7CisJCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0KKwkJCQl+Y3N1bV90Y3B1ZHBfbWFnaWMoaXBfaGRyKHNrYiktPnNhZGRyLAorCQkJCQkJICAgaXBfaGRyKHNrYiktPmRhZGRyLAorCQkJCQkJICAgMCwgSVBQUk9UT19UQ1AsIDApOworCQkJVFBEX0lQVjRfU0VUKHRwZCwgMSk7CisJCX0KKworCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSAmIFNLQl9HU09fVENQVjYpIHsKKwkJCS8qIGlwdjYgdHNvIG5lZWQgYW4gZXh0cmEgdHBkICovCisJCQlzdHJ1Y3QgZW1hY190cGQgZXh0cmFfdHBkOworCisJCQltZW1zZXQodHBkLCAwLCBzaXplb2YoKnRwZCkpOworCQkJbWVtc2V0KCZleHRyYV90cGQsIDAsIHNpemVvZihleHRyYV90cGQpKTsKKworCQkJaXB2Nl9oZHIoc2tiKS0+cGF5bG9hZF9sZW4gPSAwOworCQkJdGNwX2hkcihza2IpLT5jaGVjayA9CisJCQkJfmNzdW1faXB2Nl9tYWdpYygmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCisJCQkJCQkgJmlwdjZfaGRyKHNrYiktPmRhZGRyLAorCQkJCQkJIDAsIElQUFJPVE9fVENQLCAwKTsKKwkJCVRQRF9QS1RfTEVOX1NFVCgmZXh0cmFfdHBkLCBza2ItPmxlbik7CisJCQlUUERfTFNPX1NFVCgmZXh0cmFfdHBkLCAxKTsKKwkJCVRQRF9MU09WX1NFVCgmZXh0cmFfdHBkLCAxKTsKKwkJCWVtYWNfdHhfdHBkX2NyZWF0ZShhZHB0LCB0eF9xLCAmZXh0cmFfdHBkKTsKKwkJCVRQRF9MU09WX1NFVCh0cGQsIDEpOworCQl9CisKKwkJVFBEX0xTT19TRVQodHBkLCAxKTsKKwkJVFBEX1RDUEhEUl9PRkZTRVRfU0VUKHRwZCwgc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSk7CisJCVRQRF9NU1NfU0VUKHRwZCwgc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSk7CisJCXJldHVybiAwOworCX0KKworZG9fY3N1bToKKwlpZiAobGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpKSB7CisJCXVuc2lnbmVkIGludCBjc3MsIGNzbzsKKworCQljc28gPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOworCQlpZiAodW5saWtlbHkoY3NvICYgMHgxKSkgeworCQkJbmV0ZGV2X2VycihhZHB0LT5uZXRkZXYsCisJCQkJICAgImVycm9yOiBwYXlsb2FkIG9mZnNldCBzaG91bGQgYmUgZXZlblxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQljc3MgPSBjc28gKyBza2ItPmNzdW1fb2Zmc2V0OworCisJCVRQRF9QQVlMT0FEX09GRlNFVF9TRVQodHBkLCBjc28gPj4gMSk7CisJCVRQRF9DWFNVTV9PRkZTRVRfU0VUKHRwZCwgY3NzID4+IDEpOworCQlUUERfQ1NYX1NFVCh0cGQsIDEpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBGaWxsIHVwIHRyYW5zbWl0IGRlc2NyaXB0b3JzICovCitzdGF0aWMgdm9pZCBlbWFjX3R4X2ZpbGxfdHBkKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsCisJCQkgICAgIHN0cnVjdCBlbWFjX3R4X3F1ZXVlICp0eF9xLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBzdHJ1Y3QgZW1hY190cGQgKnRwZCkKK3sKKwl1bnNpZ25lZCBpbnQgbnJfZnJhZ3MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCXVuc2lnbmVkIGludCBmaXJzdCA9IHR4X3EtPnRwZC5wcm9kdWNlX2lkeDsKKwl1bnNpZ25lZCBpbnQgbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKKwlzdHJ1Y3QgZW1hY19idWZmZXIgKnRwYnVmID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgbWFwcGVkX2xlbiA9IDA7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgcmV0OworCisJLyogaWYgTGFyZ2UgU2VnbWVudCBPZmZsb2FkIGlzIChpbiBUQ1AgU2VnbWVudGF0aW9uIE9mZmxvYWQgc3RydWN0KSAqLworCWlmIChUUERfTFNPKHRwZCkpIHsKKwkJbWFwcGVkX2xlbiA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKyB0Y3BfaGRybGVuKHNrYik7CisKKwkJdHBidWYgPSBHRVRfVFBEX0JVRkZFUih0eF9xLCB0eF9xLT50cGQucHJvZHVjZV9pZHgpOworCQl0cGJ1Zi0+bGVuZ3RoID0gbWFwcGVkX2xlbjsKKwkJdHBidWYtPmRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUoYWRwdC0+bmV0ZGV2LT5kZXYucGFyZW50LAorCQkJCQkJIHNrYi0+ZGF0YSwgdHBidWYtPmxlbmd0aCwKKwkJCQkJCSBETUFfVE9fREVWSUNFKTsKKwkJcmV0ID0gZG1hX21hcHBpbmdfZXJyb3IoYWRwdC0+bmV0ZGV2LT5kZXYucGFyZW50LAorCQkJCQl0cGJ1Zi0+ZG1hX2FkZHIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQlUUERfQlVGRkVSX0FERFJfTF9TRVQodHBkLCBsb3dlcl8zMl9iaXRzKHRwYnVmLT5kbWFfYWRkcikpOworCQlUUERfQlVGRkVSX0FERFJfSF9TRVQodHBkLCB1cHBlcl8zMl9iaXRzKHRwYnVmLT5kbWFfYWRkcikpOworCQlUUERfQlVGX0xFTl9TRVQodHBkLCB0cGJ1Zi0+bGVuZ3RoKTsKKwkJZW1hY190eF90cGRfY3JlYXRlKGFkcHQsIHR4X3EsIHRwZCk7CisJCWNvdW50Kys7CisJfQorCisJaWYgKG1hcHBlZF9sZW4gPCBsZW4pIHsKKwkJdHBidWYgPSBHRVRfVFBEX0JVRkZFUih0eF9xLCB0eF9xLT50cGQucHJvZHVjZV9pZHgpOworCQl0cGJ1Zi0+bGVuZ3RoID0gbGVuIC0gbWFwcGVkX2xlbjsKKwkJdHBidWYtPmRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUoYWRwdC0+bmV0ZGV2LT5kZXYucGFyZW50LAorCQkJCQkJIHNrYi0+ZGF0YSArIG1hcHBlZF9sZW4sCisJCQkJCQkgdHBidWYtPmxlbmd0aCwgRE1BX1RPX0RFVklDRSk7CisJCXJldCA9IGRtYV9tYXBwaW5nX2Vycm9yKGFkcHQtPm5ldGRldi0+ZGV2LnBhcmVudCwKKwkJCQkJdHBidWYtPmRtYV9hZGRyKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJVFBEX0JVRkZFUl9BRERSX0xfU0VUKHRwZCwgbG93ZXJfMzJfYml0cyh0cGJ1Zi0+ZG1hX2FkZHIpKTsKKwkJVFBEX0JVRkZFUl9BRERSX0hfU0VUKHRwZCwgdXBwZXJfMzJfYml0cyh0cGJ1Zi0+ZG1hX2FkZHIpKTsKKwkJVFBEX0JVRl9MRU5fU0VUKHRwZCwgdHBidWYtPmxlbmd0aCk7CisJCWVtYWNfdHhfdHBkX2NyZWF0ZShhZHB0LCB0eF9xLCB0cGQpOworCQljb3VudCsrOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7CisJCXN0cnVjdCBza2JfZnJhZ19zdHJ1Y3QgKmZyYWc7CisKKwkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCisJCXRwYnVmID0gR0VUX1RQRF9CVUZGRVIodHhfcSwgdHhfcS0+dHBkLnByb2R1Y2VfaWR4KTsKKwkJdHBidWYtPmxlbmd0aCA9IGZyYWctPnNpemU7CisJCXRwYnVmLT5kbWFfYWRkciA9IGRtYV9tYXBfcGFnZShhZHB0LT5uZXRkZXYtPmRldi5wYXJlbnQsCisJCQkJCSAgICAgICBmcmFnLT5wYWdlLnAsIGZyYWctPnBhZ2Vfb2Zmc2V0LAorCQkJCQkgICAgICAgdHBidWYtPmxlbmd0aCwgRE1BX1RPX0RFVklDRSk7CisJCXJldCA9IGRtYV9tYXBwaW5nX2Vycm9yKGFkcHQtPm5ldGRldi0+ZGV2LnBhcmVudCwKKwkJCQkJdHBidWYtPmRtYV9hZGRyKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJVFBEX0JVRkZFUl9BRERSX0xfU0VUKHRwZCwgbG93ZXJfMzJfYml0cyh0cGJ1Zi0+ZG1hX2FkZHIpKTsKKwkJVFBEX0JVRkZFUl9BRERSX0hfU0VUKHRwZCwgdXBwZXJfMzJfYml0cyh0cGJ1Zi0+ZG1hX2FkZHIpKTsKKwkJVFBEX0JVRl9MRU5fU0VUKHRwZCwgdHBidWYtPmxlbmd0aCk7CisJCWVtYWNfdHhfdHBkX2NyZWF0ZShhZHB0LCB0eF9xLCB0cGQpOworCQljb3VudCsrOworCX0KKworCS8qIFRoZSBsYXN0IHRwZCAqLworCXdtYigpOworCWVtYWNfdHhfdHBkX21hcmtfbGFzdChhZHB0LCB0eF9xKTsKKworCS8qIFRoZSBsYXN0IGJ1ZmZlciBpbmZvIGNvbnRhaW4gdGhlIHNrYiBhZGRyZXNzLAorCSAqIHNvIGl0IHdpbGwgYmUgZnJlZWQgYWZ0ZXIgdW5tYXAKKwkgKi8KKwl0cGJ1Zi0+c2tiID0gc2tiOworCisJcmV0dXJuOworCitlcnJvcjoKKwkvKiBPbmUgb2YgdGhlIG1lbW9yeSBtYXBwaW5ncyBmYWlsZWQsIHNvIHVuZG8gZXZlcnl0aGluZyAqLworCXR4X3EtPnRwZC5wcm9kdWNlX2lkeCA9IGZpcnN0OworCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJdHBidWYgPSBHRVRfVFBEX0JVRkZFUih0eF9xLCBmaXJzdCk7CisJCWRtYV91bm1hcF9wYWdlKGFkcHQtPm5ldGRldi0+ZGV2LnBhcmVudCwgdHBidWYtPmRtYV9hZGRyLAorCQkJICAgICAgIHRwYnVmLT5sZW5ndGgsIERNQV9UT19ERVZJQ0UpOworCQl0cGJ1Zi0+ZG1hX2FkZHIgPSAwOworCQl0cGJ1Zi0+bGVuZ3RoID0gMDsKKworCQlpZiAoKytmaXJzdCA9PSB0eF9xLT50cGQuY291bnQpCisJCQlmaXJzdCA9IDA7CisJfQorCisJZGV2X2tmcmVlX3NrYihza2IpOworfQorCisvKiBUcmFuc21pdCB0aGUgcGFja2V0IHVzaW5nIHNwZWNpZmllZCB0cmFuc21pdCBxdWV1ZSAqLworaW50IGVtYWNfbWFjX3R4X2J1Zl9zZW5kKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsIHN0cnVjdCBlbWFjX3R4X3F1ZXVlICp0eF9xLAorCQkJIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGVtYWNfdHBkIHRwZDsKKwl1MzIgcHJvZF9pZHg7CisKKwltZW1zZXQoJnRwZCwgMCwgc2l6ZW9mKHRwZCkpOworCisJaWYgKGVtYWNfdHNvX2NzdW0oYWRwdCwgdHhfcSwgc2tiLCAmdHBkKSAhPSAwKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiBORVRERVZfVFhfT0s7CisJfQorCisJaWYgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpIHsKKwkJdTE2IHRhZzsKKworCQlFTUFDX1ZMQU5fVE9fVEFHKHNrYl92bGFuX3RhZ19nZXQoc2tiKSwgdGFnKTsKKwkJVFBEX0NWTEFOX1RBR19TRVQoJnRwZCwgdGFnKTsKKwkJVFBEX0lOU1RDX1NFVCgmdHBkLCAxKTsKKwl9CisKKwlpZiAoc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikgIT0gRVRIX0hMRU4pCisJCVRQRF9UWVBfU0VUKCZ0cGQsIDEpOworCisJZW1hY190eF9maWxsX3RwZChhZHB0LCB0eF9xLCBza2IsICZ0cGQpOworCisJbmV0ZGV2X3NlbnRfcXVldWUoYWRwdC0+bmV0ZGV2LCBza2ItPmxlbik7CisKKwkvKiBNYWtlIHN1cmUgdGhlIGFyZSBlbm91Z2ggZnJlZSBkZXNjcmlwdG9ycyB0byBob2xkIG9uZQorCSAqIG1heGltdW0tc2l6ZWQgU0tCLiAgV2UgbmVlZCBvbmUgZGVzYyBmb3IgZWFjaCBmcmFnbWVudCwKKwkgKiBvbmUgZm9yIHRoZSBjaGVja3N1bSAoZW1hY190c29fY3N1bSksIG9uZSBmb3IgVFNPLCBhbmQKKwkgKiBhbmQgb25lIGZvciB0aGUgU0tCIGhlYWRlci4KKwkgKi8KKwlpZiAoZW1hY190cGRfbnVtX2ZyZWVfZGVzY3ModHhfcSkgPCAoTUFYX1NLQl9GUkFHUyArIDMpKQorCQluZXRpZl9zdG9wX3F1ZXVlKGFkcHQtPm5ldGRldik7CisKKwkvKiB1cGRhdGUgcHJvZHVjZSBpZHggKi8KKwlwcm9kX2lkeCA9ICh0eF9xLT50cGQucHJvZHVjZV9pZHggPDwgdHhfcS0+cHJvZHVjZV9zaGlmdCkgJgorCQkgICAgdHhfcS0+cHJvZHVjZV9tYXNrOworCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmJhc2UgKyB0eF9xLT5wcm9kdWNlX3JlZywKKwkJCSAgdHhfcS0+cHJvZHVjZV9tYXNrLCBwcm9kX2lkeCk7CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLW1hYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLW1hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYWEyNGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtbWFjLmgKQEAgLTAsMCArMSwyNDggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qIEVNQUMgRE1BIEhXIGVuZ2luZSB1c2VzIHRocmVlIHJpbmdzOgorICogVHg6CisgKiAgIFRQRDogVHJhbnNtaXQgUGFja2V0IERlc2NyaXB0b3IgcmluZy4KKyAqIFJ4OgorICogICBSRkQ6IFJlY2VpdmUgRnJlZSBEZXNjcmlwdG9yIHJpbmcuCisgKiAgICAgUmluZyBvZiBkZXNjcmlwdG9ycyB3aXRoIGVtcHR5IGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJ5IFJ4IEhXLgorICogICBSUkQ6IFJlY2VpdmUgUmV0dXJuIERlc2NyaXB0b3IgcmluZy4KKyAqICAgICBSaW5nIG9mIGRlc2NyaXB0b3JzIHdpdGggYnVmZmVycyBmaWxsZWQgd2l0aCByZWNlaXZlZCBkYXRhLgorICovCisKKyNpZm5kZWYgX0VNQUNfSFdfSF8KKyNkZWZpbmUgX0VNQUNfSFdfSF8KKworLyogRU1BQ19DU1IgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBFTUFDX0VNQUNfV1JBUFBFUl9DU1IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMAorI2RlZmluZSBFTUFDX0VNQUNfV1JBUFBFUl9DU1IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNAorI2RlZmluZSBFTUFDX0VNQUNfV1JBUFBFUl9UWF9UU19MTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwNAorI2RlZmluZSBFTUFDX0VNQUNfV1JBUFBFUl9UWF9UU19ISSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwOAorI2RlZmluZSBFTUFDX0VNQUNfV1JBUFBFUl9UWF9UU19JTlggICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwYworCisvKiBETUEgT3JkZXIgU2V0dGluZ3MgKi8KK2VudW0gZW1hY19kbWFfb3JkZXIgeworCWVtYWNfZG1hX29yZF9pbiA9IDEsCisJZW1hY19kbWFfb3JkX2VuaCA9IDIsCisJZW1hY19kbWFfb3JkX291dCA9IDQKK307CisKK2VudW0gZW1hY19kbWFfcmVxX2Jsb2NrIHsKKwllbWFjX2RtYV9yZXFfMTI4ID0gMCwKKwllbWFjX2RtYV9yZXFfMjU2ID0gMSwKKwllbWFjX2RtYV9yZXFfNTEyID0gMiwKKwllbWFjX2RtYV9yZXFfMTAyNCA9IDMsCisJZW1hY19kbWFfcmVxXzIwNDggPSA0LAorCWVtYWNfZG1hX3JlcV80MDk2ID0gNQorfTsKKworLyogUmV0dXJucyB0aGUgdmFsdWUgb2YgYml0cyBpZHguLi5pZHgrbl9iaXRzICovCisjZGVmaW5lIEJJVFNfR0VUKHZhbCwgbG8sIGhpKSAoKGxlMzJfdG9fY3B1KHZhbCkgJiBHRU5NQVNLKChoaSksIChsbykpKSA+PiBsbykKKyNkZWZpbmUgQklUU19TRVQodmFsLCBsbywgaGksIG5ld192YWwpIFwKKwl2YWwgPSBjcHVfdG9fbGUzMigobGUzMl90b19jcHUodmFsKSAmICh+R0VOTUFTSygoaGkpLCAobG8pKSkpIHwJXAorCQkoKChuZXdfdmFsKSA8PCAobG8pKSAmIEdFTk1BU0soKGhpKSwgKGxvKSkpKQorCisvKiBSUkQgKFJlY2VpdmUgUmV0dXJuIERlc2NyaXB0b3IpICovCitzdHJ1Y3QgZW1hY19ycmQgeworCXUzMgl3b3JkWzZdOworCisvKiBudW1iZXIgb2YgUkZEICovCisjZGVmaW5lIFJSRF9OT1IocnJkKQkJCUJJVFNfR0VUKChycmQpLT53b3JkWzBdLCAxNiwgMTkpCisvKiBzdGFydCBjb25zdW1lciBpbmRleCBvZiByZmQtcmluZyAqLworI2RlZmluZSBSUkRfU0kocnJkKQkJCUJJVFNfR0VUKChycmQpLT53b3JkWzBdLCAyMCwgMzEpCisvKiB2bGFuLXRhZyAoQ1ZJRCwgQ0ZJIGFuZCBQUkkpICovCisjZGVmaW5lIFJSRF9DVkFMTl9UQUcocnJkKQkJQklUU19HRVQoKHJyZCktPndvcmRbMl0sIDAsIDE1KQorLyogbGVuZ3RoIG9mIHRoZSBwYWNrZXQgKi8KKyNkZWZpbmUgUlJEX1BLVF9TSVpFKHJyZCkJCUJJVFNfR0VUKChycmQpLT53b3JkWzNdLCAwLCAxMykKKy8qIEw0KFRDUC9VRFApIGNoZWNrc3VtIGZhaWxlZCAqLworI2RlZmluZSBSUkRfTDRGKHJyZCkJCQlCSVRTX0dFVCgocnJkKS0+d29yZFszXSwgMTQsIDE0KQorLyogdmxhbiB0YWdnZWQgKi8KKyNkZWZpbmUgUlJEX0NWVEFHKHJyZCkJCQlCSVRTX0dFVCgocnJkKS0+d29yZFszXSwgMTYsIDE2KQorLyogV2hlbiBzZXQsIGluZGljYXRlcyB0aGF0IHRoZSBkZXNjcmlwdG9yIGlzIHVwZGF0ZWQgYnkgdGhlIElQIGNvcmUuCisgKiBXaGVuIGNsZWFyZWQsIGluZGljYXRlcyB0aGF0IHRoZSBkZXNjcmlwdG9yIGlzIGludmFsaWQuCisgKi8KKyNkZWZpbmUgUlJEX1VQRFQocnJkKQkJCUJJVFNfR0VUKChycmQpLT53b3JkWzNdLCAzMSwgMzEpCisjZGVmaW5lIFJSRF9VUERUX1NFVChycmQsIHZhbCkJCUJJVFNfU0VUKChycmQpLT53b3JkWzNdLCAzMSwgMzEsIHZhbCkKKy8qIHRpbWVzdGFtcCBsb3cgKi8KKyNkZWZpbmUgUlJEX1RTX0xPVyhycmQpCQkJQklUU19HRVQoKHJyZCktPndvcmRbNF0sIDAsIDI5KQorLyogdGltZXN0YW1wIGhpZ2ggKi8KKyNkZWZpbmUgUlJEX1RTX0hJKHJyZCkJCQlsZTMyX3RvX2NwdSgocnJkKS0+d29yZFs1XSkKK307CisKKy8qIFRQRCAoVHJhbnNtaXQgUGFja2V0IERlc2NyaXB0b3IpICovCitzdHJ1Y3QgZW1hY190cGQgeworCXUzMgkJCQl3b3JkWzRdOworCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2YgdGhlIHRyYW5zbWl0IHBhY2tldC4gKGluY2x1ZGUgNC1ieXRlIENSQykgKi8KKyNkZWZpbmUgVFBEX0JVRl9MRU5fU0VUKHRwZCwgdmFsKQlCSVRTX1NFVCgodHBkKS0+d29yZFswXSwgMCwgMTUsIHZhbCkKKy8qIEN1c3RvbSBDaGVja3N1bSBPZmZsb2FkOiBXaGVuIHNldCwgYXNrIElQIGNvcmUgdG8gb2ZmbG9hZCBjdXN0b20gY2hlY2tzdW0gKi8KKyNkZWZpbmUgVFBEX0NTWF9TRVQodHBkLCB2YWwpCQlCSVRTX1NFVCgodHBkKS0+d29yZFsxXSwgOCwgOCwgdmFsKQorLyogVENQIExhcmdlIFNlbmQgT2ZmbG9hZDogV2hlbiBzZXQsIGFzayBJUCBjb3JlIHRvIGRvIG9mZmxvYWQgVENQIExhcmdlIFNlbmQgKi8KKyNkZWZpbmUgVFBEX0xTTyh0cGQpCQkJQklUU19HRVQoKHRwZCktPndvcmRbMV0sIDEyLCAxMikKKyNkZWZpbmUgVFBEX0xTT19TRVQodHBkLCB2YWwpCQlCSVRTX1NFVCgodHBkKS0+d29yZFsxXSwgMTIsIDEyLCB2YWwpCisvKiAgTGFyZ2UgU2VuZCBPZmZsb2FkIFZlcnNpb246IFdoZW4gc2V0LCBpbmRpY2F0ZXMgdGhpcyBpcyBhbiBMU092MgorICogKGZvciBib3RoIElQdjQgYW5kIElQdjYpLiBXaGVuIGNsZWFyZWQsIGluZGljYXRlcyB0aGlzIGlzIGFuIExTT3YxCisgKiAob25seSBmb3IgSVB2NCkuCisgKi8KKyNkZWZpbmUgVFBEX0xTT1ZfU0VUKHRwZCwgdmFsKQkJQklUU19TRVQoKHRwZCktPndvcmRbMV0sIDEzLCAxMywgdmFsKQorLyogSVB2NCBwYWNrZXQ6IFdoZW4gc2V0LCBpbmRpY2F0ZXMgdGhpcyBpcyBhbiAgSVB2NCBwYWNrZXQsIHRoaXMgYml0IGlzIG9ubHkKKyAqIGZvciBMU09WMiBmb3JtYXQuCisgKi8KKyNkZWZpbmUgVFBEX0lQVjRfU0VUKHRwZCwgdmFsKQkJQklUU19TRVQoKHRwZCktPndvcmRbMV0sIDE2LCAxNiwgdmFsKQorLyogMDogRXRoZXJuZXQgICBmcmFtZSAoREErU0ErVFlQRStEQVRBK0NSQykKKyAqIDE6IElFRUUgODAyLjMgZnJhbWUgKERBK1NBK0xFTitEU0FQK1NTQVArQ1RMK09SRytUWVBFK0RBVEErQ1JDKQorICovCisjZGVmaW5lIFRQRF9UWVBfU0VUKHRwZCwgdmFsKQkJQklUU19TRVQoKHRwZCktPndvcmRbMV0sIDE3LCAxNywgdmFsKQorLyogTG93LTMyYml0IEJ1ZmZlciBBZGRyZXNzICovCisjZGVmaW5lIFRQRF9CVUZGRVJfQUREUl9MX1NFVCh0cGQsIHZhbCkJKCh0cGQpLT53b3JkWzJdID0gY3B1X3RvX2xlMzIodmFsKSkKKy8qIENWTEFOIFRhZyB0byBiZSBpbnNlcnRlZCBpZiBJTlNfVkxBTl9UQUcgaXMgc2V0LCBDVkxBTiBUUElEIGJhc2VkIG9uIGdsb2JhbAorICogcmVnaXN0ZXIgY29uZmlndXJhdGlvbi4KKyAqLworI2RlZmluZSBUUERfQ1ZMQU5fVEFHX1NFVCh0cGQsIHZhbCkJQklUU19TRVQoKHRwZCktPndvcmRbM10sIDAsIDE1LCB2YWwpCisvKiAgSW5zZXJ0IENWbGFuIFRhZzogV2hlbiBzZXQsIGFzayBNQUMgdG8gaW5zZXJ0IENWTEFOIFRBRyB0byBvdXRnb2luZyBwYWNrZXQKKyAqLworI2RlZmluZSBUUERfSU5TVENfU0VUKHRwZCwgdmFsKQkJQklUU19TRVQoKHRwZCktPndvcmRbM10sIDE3LCAxNywgdmFsKQorLyogSGlnaC0xNGJpdCBCdWZmZXIgQWRkcmVzcywgU28sIHRoZSA2NGItYml0IGFkZHJlc3MgaXMKKyAqIHtERVNDX0NUUkxfMTFfVFhfREFUQV9ISUFERFJbMTc6MF0sKHJlZ2lzdGVyKSBCVUZGRVJfQUREUl9ILCBCVUZGRVJfQUREUl9MfQorICovCisjZGVmaW5lIFRQRF9CVUZGRVJfQUREUl9IX1NFVCh0cGQsIHZhbCkJQklUU19TRVQoKHRwZCktPndvcmRbM10sIDE4LCAzMCwgdmFsKQorLyogRm9ybWF0IEQuIFdvcmQgb2Zmc2V0IGZyb20gdGhlIDFzdCBieXRlIG9mIHRoaXMgcGFja2V0IHRvIHN0YXJ0IHRvIGNhbGN1bGF0ZQorICogdGhlIGN1c3RvbSBjaGVja3N1bS4KKyAqLworI2RlZmluZSBUUERfUEFZTE9BRF9PRkZTRVRfU0VUKHRwZCwgdmFsKSBCSVRTX1NFVCgodHBkKS0+d29yZFsxXSwgMCwgNywgdmFsKQorLyogIEZvcm1hdCBELiBXb3JkIG9mZnNldCBmcm9tIHRoZSAxc3QgYnl0ZSBvZiB0aGlzIHBhY2tldCB0byBmaWxsIHRoZSBjdXN0b20KKyAqIGNoZWNrc3VtIHRvCisgKi8KKyNkZWZpbmUgVFBEX0NYU1VNX09GRlNFVF9TRVQodHBkLCB2YWwpCUJJVFNfU0VUKCh0cGQpLT53b3JkWzFdLCAxOCwgMjUsIHZhbCkKKworLyogRm9ybWF0IEMuIFRDUCBIZWFkZXIgb2Zmc2V0IGZyb20gdGhlIDFzdCBieXRlIG9mIHRoaXMgcGFja2V0LiAoYnl0ZSB1bml0KSAqLworI2RlZmluZSBUUERfVENQSERSX09GRlNFVF9TRVQodHBkLCB2YWwpCUJJVFNfU0VUKCh0cGQpLT53b3JkWzFdLCAwLCA3LCB2YWwpCisvKiBGb3JtYXQgQy4gTVNTIChNYXhpbXVtIFNlZ21lbnQgU2l6ZSkgZ290IGZyb20gdGhlIHByb3RvY29sIGxheWVyLiAoYnl0ZSB1bml0KQorICovCisjZGVmaW5lIFRQRF9NU1NfU0VUKHRwZCwgdmFsKQkJQklUU19TRVQoKHRwZCktPndvcmRbMV0sIDE4LCAzMCwgdmFsKQorLyogcGFja2V0IGxlbmd0aCBpbiBleHQgdHBkICovCisjZGVmaW5lIFRQRF9QS1RfTEVOX1NFVCh0cGQsIHZhbCkJKCh0cGQpLT53b3JkWzJdID0gY3B1X3RvX2xlMzIodmFsKSkKK307CisKKy8qIGVtYWNfcmluZ19oZWFkZXIgcmVwcmVzZW50cyBhIHNpbmdsZSwgY29udGlndW91cyBibG9jayBvZiBETUEgc3BhY2UKKyAqIG1hcHBlZCBmb3IgdGhlIHRocmVlIGRlc2NyaXB0b3IgcmluZ3MgKHRwZCwgcmZkLCBycmQpCisgKi8KK3N0cnVjdCBlbWFjX3JpbmdfaGVhZGVyIHsKKwl2b2lkCQkJKnZfYWRkcjsJLyogdmlydHVhbCBhZGRyZXNzICovCisJZG1hX2FkZHJfdAkJZG1hX2FkZHI7CS8qIGRtYSBhZGRyZXNzICovCisJc2l6ZV90CQkJc2l6ZTsJCS8qIGxlbmd0aCBpbiBieXRlcyAqLworCXNpemVfdAkJCXVzZWQ7Cit9OworCisvKiBlbWFjX2J1ZmZlciBpcyB3cmFwcGVyIGFyb3VuZCBhIHBvaW50ZXIgdG8gYSBzb2NrZXQgYnVmZmVyCisgKiBzbyBhIERNQSBoYW5kbGUgY2FuIGJlIHN0b3JlZCBhbG9uZyB3aXRoIHRoZSBza2IKKyAqLworc3RydWN0IGVtYWNfYnVmZmVyIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjsJCS8qIHNvY2tldCBidWZmZXIgKi8KKwl1MTYJCQlsZW5ndGg7CQkvKiByeCBidWZmZXIgbGVuZ3RoICovCisJZG1hX2FkZHJfdAkJZG1hX2FkZHI7CS8qIGRtYSBhZGRyZXNzICovCit9OworCisvKiByZWNlaXZlIGZyZWUgZGVzY3JpcHRvciAocmZkKSByaW5nICovCitzdHJ1Y3QgZW1hY19yZmRfcmluZyB7CisJc3RydWN0IGVtYWNfYnVmZmVyCSpyZmJ1ZmY7CisJdTMyCQkJKnZfYWRkcjsJLyogdmlydHVhbCBhZGRyZXNzICovCisJZG1hX2FkZHJfdAkJZG1hX2FkZHI7CS8qIGRtYSBhZGRyZXNzICovCisJc2l6ZV90CQkJc2l6ZTsJCS8qIGxlbmd0aCBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludAkJY291bnQ7CQkvKiBudW1iZXIgb2YgZGVzYyBpbiB0aGUgcmluZyAqLworCXVuc2lnbmVkIGludAkJcHJvZHVjZV9pZHg7CisJdW5zaWduZWQgaW50CQlwcm9jZXNzX2lkeDsKKwl1bnNpZ25lZCBpbnQJCWNvbnN1bWVfaWR4OwkvKiB1bnVzZWQgKi8KK307CisKKy8qIFJlY2VpdmUgUmV0dXJuIERlc2NpcHRvciAoUlJEKSByaW5nICovCitzdHJ1Y3QgZW1hY19ycmRfcmluZyB7CisJdTMyCQkJKnZfYWRkcjsJLyogdmlydHVhbCBhZGRyZXNzICovCisJZG1hX2FkZHJfdAkJZG1hX2FkZHI7CS8qIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwlzaXplX3QJCQlzaXplOwkJLyogbGVuZ3RoIGluIGJ5dGVzICovCisJdW5zaWduZWQgaW50CQljb3VudDsJCS8qIG51bWJlciBvZiBkZXNjIGluIHRoZSByaW5nICovCisJdW5zaWduZWQgaW50CQlwcm9kdWNlX2lkeDsJLyogdW51c2VkICovCisJdW5zaWduZWQgaW50CQljb25zdW1lX2lkeDsKK307CisKKy8qIFJ4IHF1ZXVlICovCitzdHJ1Y3QgZW1hY19yeF9xdWV1ZSB7CisJc3RydWN0IG5ldF9kZXZpY2UJKm5ldGRldjsJLyogbmV0ZGV2IHJpbmcgYmVsb25ncyB0byAqLworCXN0cnVjdCBlbWFjX3JyZF9yaW5nCXJyZDsKKwlzdHJ1Y3QgZW1hY19yZmRfcmluZwlyZmQ7CisJc3RydWN0IG5hcGlfc3RydWN0CW5hcGk7CisJc3RydWN0IGVtYWNfaXJxCQkqaXJxOworCisJdTMyCQkJaW50cjsKKwl1MzIJCQlwcm9kdWNlX21hc2s7CisJdTMyCQkJcHJvY2Vzc19tYXNrOworCXUzMgkJCWNvbnN1bWVfbWFzazsKKworCXUxNgkJCXByb2R1Y2VfcmVnOworCXUxNgkJCXByb2Nlc3NfcmVnOworCXUxNgkJCWNvbnN1bWVfcmVnOworCisJdTgJCQlwcm9kdWNlX3NoaWZ0OworCXU4CQkJcHJvY2Vzc19zaGZ0OworCXU4CQkJY29uc3VtZV9zaGlmdDsKK307CisKKy8qIFRyYW5zaW1pdCBQYWNrZXQgRGVzY3JpcHRvciAodHBkKSByaW5nICovCitzdHJ1Y3QgZW1hY190cGRfcmluZyB7CisJc3RydWN0IGVtYWNfYnVmZmVyCSp0cGJ1ZmY7CisJdTMyCQkJKnZfYWRkcjsJLyogdmlydHVhbCBhZGRyZXNzICovCisJZG1hX2FkZHJfdAkJZG1hX2FkZHI7CS8qIGRtYSBhZGRyZXNzICovCisKKwlzaXplX3QJCQlzaXplOwkJLyogbGVuZ3RoIGluIGJ5dGVzICovCisJdW5zaWduZWQgaW50CQljb3VudDsJCS8qIG51bWJlciBvZiBkZXNjIGluIHRoZSByaW5nICovCisJdW5zaWduZWQgaW50CQlwcm9kdWNlX2lkeDsKKwl1bnNpZ25lZCBpbnQJCWNvbnN1bWVfaWR4OworCXVuc2lnbmVkIGludAkJbGFzdF9wcm9kdWNlX2lkeDsKK307CisKKy8qIFR4IHF1ZXVlICovCitzdHJ1Y3QgZW1hY190eF9xdWV1ZSB7CisJc3RydWN0IGVtYWNfdHBkX3JpbmcJdHBkOworCisJdTMyCQkJcHJvZHVjZV9tYXNrOworCXUzMgkJCWNvbnN1bWVfbWFzazsKKworCXUxNgkJCW1heF9wYWNrZXRzOwkvKiBtYXggcGFja2V0cyBwZXIgaW50ZXJydXB0ICovCisJdTE2CQkJcHJvZHVjZV9yZWc7CisJdTE2CQkJY29uc3VtZV9yZWc7CisKKwl1OAkJCXByb2R1Y2Vfc2hpZnQ7CisJdTgJCQljb25zdW1lX3NoaWZ0OworfTsKKworc3RydWN0IGVtYWNfYWRhcHRlcjsKKworaW50ICBlbWFjX21hY191cChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KTsKK3ZvaWQgZW1hY19tYWNfZG93bihzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KTsKK3ZvaWQgZW1hY19tYWNfcmVzZXQoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCk7Cit2b2lkIGVtYWNfbWFjX3N0YXJ0KHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpOwordm9pZCBlbWFjX21hY19zdG9wKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpOwordm9pZCBlbWFjX21hY19tb2RlX2NvbmZpZyhzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KTsKK3ZvaWQgZW1hY19tYWNfcnhfcHJvY2VzcyhzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LCBzdHJ1Y3QgZW1hY19yeF9xdWV1ZSAqcnhfcSwKKwkJCSBpbnQgKm51bV9wa3RzLCBpbnQgbWF4X3BrdHMpOworaW50IGVtYWNfbWFjX3R4X2J1Zl9zZW5kKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsIHN0cnVjdCBlbWFjX3R4X3F1ZXVlICp0eF9xLAorCQkJIHN0cnVjdCBza19idWZmICpza2IpOwordm9pZCBlbWFjX21hY190eF9wcm9jZXNzKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsIHN0cnVjdCBlbWFjX3R4X3F1ZXVlICp0eF9xKTsKK3ZvaWQgZW1hY19tYWNfcnhfdHhfcmluZ19pbml0X2FsbChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSAgc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCk7CitpbnQgIGVtYWNfbWFjX3J4X3R4X3JpbmdzX2FsbG9jX2FsbChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KTsKK3ZvaWQgZW1hY19tYWNfcnhfdHhfcmluZ3NfZnJlZV9hbGwoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCk7Cit2b2lkIGVtYWNfbWFjX211bHRpY2FzdF9hZGRyX2NsZWFyKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpOwordm9pZCBlbWFjX21hY19tdWx0aWNhc3RfYWRkcl9zZXQoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwgdTggKmFkZHIpOworCisjZW5kaWYgLypfRU1BQ19IV19IXyovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtcGh5LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtcGh5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE0ZTkwZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1waHkuYwpAQCAtMCwwICsxLDIyNyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyogUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIEVNQUMgUEhZIENvbnRyb2xsZXIgZHJpdmVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX21kaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSAiZW1hYy5oIgorI2luY2x1ZGUgImVtYWMtbWFjLmgiCisjaW5jbHVkZSAiZW1hYy1waHkuaCIKKyNpbmNsdWRlICJlbWFjLXNnbWlpLmgiCisKKy8qIEVNQUMgYmFzZSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIEVNQUNfTURJT19DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNDE0CisjZGVmaW5lIEVNQUNfUEhZX1NUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNDE4CisjZGVmaW5lIEVNQUNfTURJT19FWF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNDQwCisKKy8qIEVNQUNfTURJT19DVFJMICovCisjZGVmaW5lIE1ESU9fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMzApCisjZGVmaW5lIE1ESU9fUFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMjkpCisjZGVmaW5lIE1ESU9fQVBfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMjgpCisjZGVmaW5lIE1ESU9fQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMjcpCisjZGVmaW5lIE1ESU9fQ0xLX1NFTF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MDAwMDAwCisjZGVmaW5lIE1ESU9fQ0xLX1NFTF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIE1ESU9fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMjMpCisjZGVmaW5lIFNVUF9QUkVBTUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMjIpCisjZGVmaW5lIE1ESU9fUkRfTldSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMjEpCisjZGVmaW5lIE1ESU9fUkVHX0FERFJfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWYwMDAwCisjZGVmaW5lIE1ESU9fUkVHX0FERFJfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIE1ESU9fREFUQV9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisjZGVmaW5lIE1ESU9fREFUQV9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVNQUNfUEhZX1NUUyAqLworI2RlZmluZSBQSFlfQUREUl9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFmMDAwMAorI2RlZmluZSBQSFlfQUREUl9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorCisjZGVmaW5lIE1ESU9fQ0xLXzI1XzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1ESU9fQ0xLXzI1XzI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisKKyNkZWZpbmUgTURJT19XQUlUX1RJTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAKKworI2RlZmluZSBFTUFDX0xJTktfU1BFRURfREVGQVVMVCAoXAorCQlFTUFDX0xJTktfU1BFRURfMTBfSEFMRiAgfFwKKwkJRU1BQ19MSU5LX1NQRUVEXzEwX0ZVTEwgIHxcCisJCUVNQUNfTElOS19TUEVFRF8xMDBfSEFMRiB8XAorCQlFTUFDX0xJTktfU1BFRURfMTAwX0ZVTEwgfFwKKwkJRU1BQ19MSU5LX1NQRUVEXzFHQl9GVUxMKQorCisvKioKKyAqIGVtYWNfcGh5X21kaW9fYXV0b3BvbGxfZGlzYWJsZSgpIC0gZGlzYWJsZSBtZGlvIGF1dG9wb2xsCisgKiBAYWRwdDogdGhlIGVtYWMgYWRhcHRlcgorICoKKyAqIFRoZSBhdXRvcG9sbCBmZWF0dXJlIHRha2VzIG92ZXIgdGhlIE1ESU8gYnVzLiAgSW4gb3JkZXIgZm9yCisgKiB0aGUgUEhZIGRyaXZlciB0byBiZSBhYmxlIHRvIHRhbGsgdG8gdGhlIFBIWSBvdmVyIHRoZSBNRElPCisgKiBidXMsIHdlIG5lZWQgdG8gdGVtcG9yYXJpbHkgZGlzYWJsZSB0aGUgYXV0b3BvbGwgZmVhdHVyZS4KKyAqLworc3RhdGljIGludCBlbWFjX3BoeV9tZGlvX2F1dG9wb2xsX2Rpc2FibGUoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwl1MzIgdmFsOworCisJLyogZGlzYWJsZSBhdXRvcG9sbCAqLworCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmJhc2UgKyBFTUFDX01ESU9fQ1RSTCwgTURJT19BUF9FTiwgMCk7CisKKwkvKiB3YWl0IGZvciBhbnkgbWRpbyBwb2xsaW5nIHRvIGNvbXBsZXRlICovCisJaWYgKCFyZWFkbF9wb2xsX3RpbWVvdXQoYWRwdC0+YmFzZSArIEVNQUNfTURJT19DVFJMLCB2YWwsCisJCQkJISh2YWwgJiBNRElPX0JVU1kpLCAxMDAsIE1ESU9fV0FJVF9USU1FUyAqIDEwMCkpCisJCXJldHVybiAwOworCisJLyogZmFpbGVkIHRvIGRpc2FibGU7IGVuc3VyZSBpdCBpcyBlbmFibGVkIGJlZm9yZSByZXR1cm5pbmcgKi8KKwllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5iYXNlICsgRU1BQ19NRElPX0NUUkwsIDAsIE1ESU9fQVBfRU4pOworCisJcmV0dXJuIC1FQlVTWTsKK30KKworLyoqCisgKiBlbWFjX3BoeV9tZGlvX2F1dG9wb2xsX2Rpc2FibGUoKSAtIGRpc2FibGUgbWRpbyBhdXRvcG9sbAorICogQGFkcHQ6IHRoZSBlbWFjIGFkYXB0ZXIKKyAqCisgKiBUaGUgRU1BQyBoYXMgdGhlIGFiaWxpdHkgdG8gcG9sbCB0aGUgZXh0ZXJuYWwgUEhZIG9uIHRoZSBNRElPCisgKiBidXMgZm9yIGxpbmsgc3RhdGUgY2hhbmdlcy4gIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgdGhlCisgKiBkcml2ZXIgdG8gcG9sbCB0aGUgcGh5LiAgSWYgaWYgdGhlIGxpbmsgc3RhdGUgZG9lcyBjaGFuZ2UsCisgKiB0aGUgRU1BQyBpc3N1ZXMgYW4gaW50ZXJydXB0IG9uIGJlaGFsZiBvZiB0aGUgUEhZLgorICovCitzdGF0aWMgdm9pZCBlbWFjX3BoeV9tZGlvX2F1dG9wb2xsX2VuYWJsZShzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmJhc2UgKyBFTUFDX01ESU9fQ1RSTCwgMCwgTURJT19BUF9FTik7Cit9CisKK3N0YXRpYyBpbnQgZW1hY19tZGlvX3JlYWQoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IGFkZHIsIGludCByZWdudW0pCit7CisJc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCA9IGJ1cy0+cHJpdjsKKwl1MzIgcmVnOworCWludCByZXQ7CisKKwlyZXQgPSBlbWFjX3BoeV9tZGlvX2F1dG9wb2xsX2Rpc2FibGUoYWRwdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmJhc2UgKyBFTUFDX1BIWV9TVFMsIFBIWV9BRERSX0JNU0ssCisJCQkgIChhZGRyIDw8IFBIWV9BRERSX1NIRlQpKTsKKworCXJlZyA9IFNVUF9QUkVBTUJMRSB8CisJICAgICAgKChNRElPX0NMS18yNV80IDw8IE1ESU9fQ0xLX1NFTF9TSEZUKSAmIE1ESU9fQ0xLX1NFTF9CTVNLKSB8CisJICAgICAgKChyZWdudW0gPDwgTURJT19SRUdfQUREUl9TSEZUKSAmIE1ESU9fUkVHX0FERFJfQk1TSykgfAorCSAgICAgIE1ESU9fU1RBUlQgfCBNRElPX1JEX05XUjsKKworCXdyaXRlbChyZWcsIGFkcHQtPmJhc2UgKyBFTUFDX01ESU9fQ1RSTCk7CisKKwlpZiAocmVhZGxfcG9sbF90aW1lb3V0KGFkcHQtPmJhc2UgKyBFTUFDX01ESU9fQ1RSTCwgcmVnLAorCQkJICAgICAgICEocmVnICYgKE1ESU9fU1RBUlQgfCBNRElPX0JVU1kpKSwKKwkJCSAgICAgICAxMDAsIE1ESU9fV0FJVF9USU1FUyAqIDEwMCkpCisJCXJldCA9IC1FSU87CisJZWxzZQorCQlyZXQgPSAocmVnID4+IE1ESU9fREFUQV9TSEZUKSAmIE1ESU9fREFUQV9CTVNLOworCisJZW1hY19waHlfbWRpb19hdXRvcG9sbF9lbmFibGUoYWRwdCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVtYWNfbWRpb193cml0ZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgYWRkciwgaW50IHJlZ251bSwgdTE2IHZhbCkKK3sKKwlzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0ID0gYnVzLT5wcml2OworCXUzMiByZWc7CisJaW50IHJldDsKKworCXJldCA9IGVtYWNfcGh5X21kaW9fYXV0b3BvbGxfZGlzYWJsZShhZHB0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+YmFzZSArIEVNQUNfUEhZX1NUUywgUEhZX0FERFJfQk1TSywKKwkJCSAgKGFkZHIgPDwgUEhZX0FERFJfU0hGVCkpOworCisJcmVnID0gU1VQX1BSRUFNQkxFIHwKKwkJKChNRElPX0NMS18yNV80IDw8IE1ESU9fQ0xLX1NFTF9TSEZUKSAmIE1ESU9fQ0xLX1NFTF9CTVNLKSB8CisJCSgocmVnbnVtIDw8IE1ESU9fUkVHX0FERFJfU0hGVCkgJiBNRElPX1JFR19BRERSX0JNU0spIHwKKwkJKCh2YWwgPDwgTURJT19EQVRBX1NIRlQpICYgTURJT19EQVRBX0JNU0spIHwKKwkJTURJT19TVEFSVDsKKworCXdyaXRlbChyZWcsIGFkcHQtPmJhc2UgKyBFTUFDX01ESU9fQ1RSTCk7CisKKwlpZiAocmVhZGxfcG9sbF90aW1lb3V0KGFkcHQtPmJhc2UgKyBFTUFDX01ESU9fQ1RSTCwgcmVnLAorCQkJICAgICAgICEocmVnICYgKE1ESU9fU1RBUlQgfCBNRElPX0JVU1kpKSwgMTAwLAorCQkJICAgICAgIE1ESU9fV0FJVF9USU1FUyAqIDEwMCkpCisJCXJldCA9IC1FSU87CisKKwllbWFjX3BoeV9tZGlvX2F1dG9wb2xsX2VuYWJsZShhZHB0KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIENvbmZpZ3VyZSB0aGUgTURJTyBidXMgYW5kIGNvbm5lY3QgdGhlIGV4dGVybmFsIFBIWSAqLworaW50IGVtYWNfcGh5X2NvbmZpZyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgbWlpX2J1cyAqbWlpX2J1czsKKwlpbnQgcmV0OworCisJLyogQ3JlYXRlIHRoZSBtaWlfYnVzIG9iamVjdCBmb3IgdGFsa2luZyB0byB0aGUgTURJTyBidXMgKi8KKwlhZHB0LT5taWlfYnVzID0gbWlpX2J1cyA9IGRldm1fbWRpb2J1c19hbGxvYygmcGRldi0+ZGV2KTsKKwlpZiAoIW1paV9idXMpCisJCXJldHVybiAtRU5PTUVNOworCisJbWlpX2J1cy0+bmFtZSA9ICJlbWFjLW1kaW8iOworCXNucHJpbnRmKG1paV9idXMtPmlkLCBNSUlfQlVTX0lEX1NJWkUsICIlcyIsIHBkZXYtPm5hbWUpOworCW1paV9idXMtPnJlYWQgPSBlbWFjX21kaW9fcmVhZDsKKwltaWlfYnVzLT53cml0ZSA9IGVtYWNfbWRpb193cml0ZTsKKwltaWlfYnVzLT5wYXJlbnQgPSAmcGRldi0+ZGV2OworCW1paV9idXMtPnByaXYgPSBhZHB0OworCisJaWYgKGhhc19hY3BpX2NvbXBhbmlvbigmcGRldi0+ZGV2KSkgeworCQl1MzIgcGh5X2FkZHI7CisKKwkJcmV0ID0gbWRpb2J1c19yZWdpc3RlcihtaWlfYnVzKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IHJlZ2lzdGVyIG1kaW8gYnVzXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0ID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKCZwZGV2LT5kZXYsICJwaHktY2hhbm5lbCIsCisJCQkJCSAgICAgICAmcGh5X2FkZHIpOworCQlpZiAocmV0KQorCQkJLyogSWYgd2UgY2FuJ3QgcmVhZCBhIHZhbGlkIHBoeSBhZGRyZXNzLCB0aGVuIGFzc3VtZQorCQkJICogdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBwaHkgb24gdGhpcyBtZGlvIGJ1cy4KKwkJCSAqLworCQkJYWRwdC0+cGh5ZGV2ID0gcGh5X2ZpbmRfZmlyc3QobWlpX2J1cyk7CisJCWVsc2UKKwkJCWFkcHQtPnBoeWRldiA9IG1kaW9idXNfZ2V0X3BoeShtaWlfYnVzLCBwaHlfYWRkcik7CisKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBoeV9ucDsKKworCQlyZXQgPSBvZl9tZGlvYnVzX3JlZ2lzdGVyKG1paV9idXMsIG5wKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IHJlZ2lzdGVyIG1kaW8gYnVzXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlwaHlfbnAgPSBvZl9wYXJzZV9waGFuZGxlKG5wLCAicGh5LWhhbmRsZSIsIDApOworCQlhZHB0LT5waHlkZXYgPSBvZl9waHlfZmluZF9kZXZpY2UocGh5X25wKTsKKwl9CisKKwlpZiAoIWFkcHQtPnBoeWRldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZmluZCBleHRlcm5hbCBwaHlcbiIpOworCQltZGlvYnVzX3VucmVnaXN0ZXIobWlpX2J1cyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChhZHB0LT5waHlkZXYtPmRydikKKwkJcGh5X2F0dGFjaGVkX3ByaW50KGFkcHQtPnBoeWRldiwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1waHkuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1waHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWYzNzAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLXBoeS5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI2lmbmRlZiBfRU1BQ19QSFlfSF8KKyNkZWZpbmUgX0VNQUNfUEhZX0hfCisKK3R5cGVkZWYgaW50ICgqZW1hY19zZ21paV9pbml0aWFsaXplKShzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KTsKKworLyoqIGVtYWNfcGh5IC0gaW50ZXJuYWwgZW1hYyBwaHkKKyAqIEBiYXNlIGJhc2UgYWRkcmVzcworICogQGRpZ2l0YWwgcGVyLWxhbmUgZGlnaXRhbCBibG9jaworICogQGluaXRpYWxpemUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKyAqLworc3RydWN0IGVtYWNfcGh5IHsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworCXZvaWQgX19pb21lbQkJKmRpZ2l0YWw7CisJZW1hY19zZ21paV9pbml0aWFsaXplCWluaXRpYWxpemU7Cit9OworCitzdHJ1Y3QgZW1hY19hZGFwdGVyOworCitpbnQgZW1hY19waHlfY29uZmlnKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpOworCisjZW5kaWYgLyogX0VNQUNfUEhZX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtc2dtaWkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1zZ21paS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YzFiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtc2dtaWkuYwpAQCAtMCwwICsxLDc4NCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyogUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIEVNQUMgU0dNSUkgQ29udHJvbGxlciBkcml2ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlICJlbWFjLmgiCisjaW5jbHVkZSAiZW1hYy1tYWMuaCIKKyNpbmNsdWRlICJlbWFjLXNnbWlpLmgiCisKKy8qIEVNQUNfUVNFUkRFUyByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fU1lTX0NMS19DVFJMCQkweDAwMDAwMAorI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX1BMTF9DTlRSTAkJMHgwMDAwMTQKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9QTExfSVBfU0VUSQkJMHgwMDAwMTgKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9QTExfQ1BfU0VUSQkJMHgwMDAwMjQKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9QTExfSVBfU0VUUAkJMHgwMDAwMjgKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9QTExfQ1BfU0VUUAkJMHgwMDAwMmMKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9TWVNDTEtfRU5fU0VMCQkweDAwMDAzOAorI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX1JFU0VUU01fQ05UUkwJCTB4MDAwMDQwCisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fUExMTE9DS19DTVAxCQkweDAwMDA0NAorI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX1BMTExPQ0tfQ01QMgkJMHgwMDAwNDgKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9QTExMT0NLX0NNUDMJCTB4MDAwMDRjCisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fUExMTE9DS19DTVBfRU4JCTB4MDAwMDUwCisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fREVDX1NUQVJUMQkJMHgwMDAwNjQKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9ESVZfRlJBQ19TVEFSVDEJMHgwMDAwOTgKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9ESVZfRlJBQ19TVEFSVDIJMHgwMDAwOWMKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9ESVZfRlJBQ19TVEFSVDMJMHgwMDAwYTAKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9ERUNfU1RBUlQyCQkweDAwMDBhNAorI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX1BMTF9DUkNUUkwJCTB4MDAwMGFjCisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fUkVTRVRfU00JCTB4MDAwMGJjCisjZGVmaW5lIEVNQUNfUVNFUkRFU19UWF9CSVNUX01PREVfTEFORU5PCTB4MDAwMTAwCisjZGVmaW5lIEVNQUNfUVNFUkRFU19UWF9UWF9FTVBfUE9TVDFfTFZMCTB4MDAwMTA4CisjZGVmaW5lIEVNQUNfUVNFUkRFU19UWF9UWF9EUlZfTFZMCQkweDAwMDEwYworI2RlZmluZSBFTUFDX1FTRVJERVNfVFhfTEFORV9NT0RFCQkweDAwMDE1MAorI2RlZmluZSBFTUFDX1FTRVJERVNfVFhfVFJBTl9EUlZSX0VNUF9FTgkweDAwMDE3MAorI2RlZmluZSBFTUFDX1FTRVJERVNfUlhfQ0RSX0NPTlRST0wJCTB4MDAwMjAwCisjZGVmaW5lIEVNQUNfUVNFUkRFU19SWF9DRFJfQ09OVFJPTDIJCTB4MDAwMjEwCisjZGVmaW5lIEVNQUNfUVNFUkRFU19SWF9SWF9FUV9HQUlOMTIJCTB4MDAwMjMwCisKKy8qIEVNQUNfU0dNSUkgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9TRVJERVNfU1RBUlQJCTB4MDAwMDAwCisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX0NNTl9QV1JfQ1RSTAkJMHgwMDAwMDQKKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfUlhfUFdSX0NUUkwJCTB4MDAwMDA4CisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX1RYX1BXUl9DVFJMCQkweDAwMDAwQworI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9MQU5FX0NUUkwxCQkweDAwMDAxOAorI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9BVVRPTkVHX0NGRzIJCTB4MDAwMDQ4CisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX0NEUl9DVFJMMAkJMHgwMDAwNTgKKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfU1BFRURfQ0ZHMQkJMHgwMDAwNzQKKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfUE9XX0RXTl9DVFJMMAkJMHgwMDAwODAKKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfUkVTRVRfQ1RSTAkJMHgwMDAwYTgKKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfSVJRX0NNRAkJCTB4MDAwMGFjCisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX0lOVEVSUlVQVF9DTEVBUgkJMHgwMDAwYjAKKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfSU5URVJSVVBUX01BU0sJCTB4MDAwMGI0CisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX0lOVEVSUlVQVF9TVEFUVVMJCTB4MDAwMGI4CisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX1JYX0NIS19TVEFUVVMJCTB4MDAwMGQ0CisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX0FVVE9ORUcwX1NUQVRVUwkJMHgwMDAwZTAKKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfQVVUT05FRzFfU1RBVFVTCQkweDAwMDBlNAorCisvKiBFTUFDX1FTRVJERVNfQ09NX1BMTF9JUF9TRVRJICovCisjZGVmaW5lIFBMTF9JUFNFVEkoeCkJCQkJKCh4KSAmIDB4M2YpCisKKy8qIEVNQUNfUVNFUkRFU19DT01fUExMX0NQX1NFVEkgKi8KKyNkZWZpbmUgUExMX0NQU0VUSSh4KQkJCQkoKHgpICYgMHhmZikKKworLyogRU1BQ19RU0VSREVTX0NPTV9QTExfSVBfU0VUUCAqLworI2RlZmluZSBQTExfSVBTRVRQKHgpCQkJCSgoeCkgJiAweDNmKQorCisvKiBFTUFDX1FTRVJERVNfQ09NX1BMTF9DUF9TRVRQICovCisjZGVmaW5lIFBMTF9DUFNFVFAoeCkJCQkJKCh4KSAmIDB4MWYpCisKKy8qIEVNQUNfUVNFUkRFU19DT01fUExMX0NSQ1RSTCAqLworI2RlZmluZSBQTExfUkNUUkwoeCkJCQkJKCgoeCkgJiAweGYpIDw8IDQpCisjZGVmaW5lIFBMTF9DQ1RSTCh4KQkJCQkoKHgpICYgMHhmKQorCisvKiBTR01JSSB2MiBQSFkgcmVnaXN0ZXJzIHBlciBsYW5lICovCisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX0xOX09GRlNFVAkJMHgwNDAwCisKKy8qIFNHTUlJIHYyIGRpZ2l0YWwgbGFuZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9EUlZSX0NUUkwwCQkweDAwQworI2RlZmluZSBFTUFDX1NHTUlJX0xOX0RSVlJfVEFQX0VOCQkweDAxOAorI2RlZmluZSBFTUFDX1NHTUlJX0xOX1RYX01BUkdJTklORwkJMHgwMUMKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9UWF9QUkUJCQkweDAyMAorI2RlZmluZSBFTUFDX1NHTUlJX0xOX1RYX1BPU1QJCQkweDAyNAorI2RlZmluZSBFTUFDX1NHTUlJX0xOX1RYX0JBTkRfTU9ERQkJMHgwNjAKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9MQU5FX01PREUJCQkweDA2NAorI2RlZmluZSBFTUFDX1NHTUlJX0xOX1BBUkFMTEVMX1JBVEUJCTB4MDc4CisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fQ01MX0NUUkxfTU9ERTAJCTB4MEI4CisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fTUlYRVJfQ1RSTF9NT0RFMAkJMHgwRDAKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9WR0FfSU5JVFZBTAkJMHgxMzQKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9VQ0RSX0ZPX0dBSU5fTU9ERTAJMHgxN0MKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9VQ0RSX1NPX0dBSU5fTU9ERTAJMHgxODgKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9VQ0RSX1NPX0NPTkZJRwkJMHgxOTQKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9SWF9CQU5ECQkJMHgxOUMKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9SWF9SQ1ZSX1BBVEgxX01PREUwCTB4MUI4CisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fUlNNX0NPTkZJRwkJMHgxRjAKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9TSUdERVRfRU5BQkxFUwkJMHgyMjQKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9TSUdERVRfQ05UUkwJCTB4MjI4CisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fU0lHREVUX0RFR0xJVENIX0NOVFJMCTB4MjJDCisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fUlhfRU5fU0lHTkFMCQkweDJBMAorI2RlZmluZSBFTUFDX1NHTUlJX0xOX1JYX01JU0NfQ05UUkwwCQkweDJBQworI2RlZmluZSBFTUFDX1NHTUlJX0xOX0RSVlJfTE9HSUNfQ0xLRElWCQkweDJCQworCisvKiBTR01JSSB2MiBkaWdpdGFsIGxhbmUgcmVnaXN0ZXIgdmFsdWVzICovCisjZGVmaW5lIFVDRFJfU1RFUF9CWV9UV09fTU9ERTAJCQlCSVQoNykKKyNkZWZpbmUgVUNEUl94T19HQUlOX01PREUoeCkJCQkoKHgpICYgMHg3ZikKKyNkZWZpbmUgVUNEUl9FTkFCTEUJCQkJQklUKDYpCisjZGVmaW5lIFVDRFJfU09fU0FUVVJBVElPTih4KQkJCSgoeCkgJiAweDNmKQorI2RlZmluZSBTSUdERVRfTFBfQllQX1BTNAkJCUJJVCg3KQorI2RlZmluZSBTSUdERVRfRU5fUFMwX1RPX1BTMgkJCUJJVCg2KQorI2RlZmluZSBFTl9BQ0NPVVBMRVZDTV9TV19NVVgJCQlCSVQoNSkKKyNkZWZpbmUgRU5fQUNDT1VQTEVWQ01fU1cJCQlCSVQoNCkKKyNkZWZpbmUgUlhfU1lOQ19FTgkJCQlCSVQoMykKKyNkZWZpbmUgUlhURVJNX0hJR0haX1BTNQkJCUJJVCgyKQorI2RlZmluZSBTSUdERVRfRU5fUFMzCQkJCUJJVCgxKQorI2RlZmluZSBFTl9BQ0NPVVBMRV9WQ01fUFMzCQkJQklUKDApCisjZGVmaW5lIFVGU19NT0RFCQkJCUJJVCg1KQorI2RlZmluZSBUWFZBTF9WQUxJRF9JTklUCQkJQklUKDQpCisjZGVmaW5lIFRYVkFMX1ZBTElEX01VWAkJCQlCSVQoMykKKyNkZWZpbmUgVFhWQUxfVkFMSUQJCQkJQklUKDIpCisjZGVmaW5lIFVTQjNQMV9NT0RFCQkJCUJJVCgxKQorI2RlZmluZSBLUl9QQ0lHRU4zX01PREUJCQkJQklUKDApCisjZGVmaW5lIFBSRV9FTgkJCQkJQklUKDMpCisjZGVmaW5lIFBPU1RfRU4JCQkJCUJJVCgyKQorI2RlZmluZSBNQUlOX0VOX01VWAkJCQlCSVQoMSkKKyNkZWZpbmUgTUFJTl9FTgkJCQkJQklUKDApCisjZGVmaW5lIFRYX01BUkdJTklOR19NVVgJCQlCSVQoNikKKyNkZWZpbmUgVFhfTUFSR0lOSU5HKHgpCQkJCSgoeCkgJiAweDNmKQorI2RlZmluZSBUWF9QUkVfTVVYCQkJCUJJVCg2KQorI2RlZmluZSBUWF9QUkUoeCkJCQkJKCh4KSAmIDB4M2YpCisjZGVmaW5lIFRYX1BPU1RfTVVYCQkJCUJJVCg2KQorI2RlZmluZSBUWF9QT1NUKHgpCQkJCSgoeCkgJiAweDNmKQorI2RlZmluZSBDTUxfR0VBUl9NT0RFKHgpCQkJKCgoeCkgJiA3KSA8PCAzKQorI2RlZmluZSBDTUwyQ01PU19JQk9PU1RfTU9ERSh4KQkJCSgoeCkgJiA3KQorI2RlZmluZSBNSVhFUl9MT0FEQl9NT0RFKHgpCQkJKCgoeCkgJiAweGYpIDw8IDIpCisjZGVmaW5lIE1JWEVSX0RBVEFSQVRFX01PREUoeCkJCQkoKHgpICYgMykKKyNkZWZpbmUgVkdBX1RIUkVTSF9ERkUoeCkJCQkoKHgpICYgMHgzZikKKyNkZWZpbmUgU0lHREVUX0xQX0JZUF9QUzBfVE9fUFMyCQlCSVQoNSkKKyNkZWZpbmUgU0lHREVUX0xQX0JZUF9NVVgJCQlCSVQoNCkKKyNkZWZpbmUgU0lHREVUX0xQX0JZUAkJCQlCSVQoMykKKyNkZWZpbmUgU0lHREVUX0VOX01VWAkJCQlCSVQoMikKKyNkZWZpbmUgU0lHREVUX0VOCQkJCUJJVCgxKQorI2RlZmluZSBTSUdERVRfRkxUX0JZUAkJCQlCSVQoMCkKKyNkZWZpbmUgU0lHREVUX0xWTCh4KQkJCQkoKCh4KSAmIDB4ZikgPDwgNCkKKyNkZWZpbmUgU0lHREVUX0JXX0NUUkwoeCkJCQkoKHgpICYgMHhmKQorI2RlZmluZSBTSUdERVRfREVHTElUQ0hfQ1RSTCh4KQkJCSgoKHgpICYgMHhmKSA8PCAxKQorI2RlZmluZSBTSUdERVRfREVHTElUQ0hfQllQCQkJQklUKDApCisjZGVmaW5lIElOVkVSVF9QQ1NfUlhfQ0xLCQkJQklUKDcpCisjZGVmaW5lIFBXTV9FTgkJCQkJQklUKDYpCisjZGVmaW5lIFJYQklBU19TRUwoeCkJCQkJKCgoeCkgJiAweDMpIDw8IDQpCisjZGVmaW5lIEVCREFDX1NJR04JCQkJQklUKDMpCisjZGVmaW5lIEVEQUNfU0lHTgkJCQlCSVQoMikKKyNkZWZpbmUgRU5fQVVYVEFQMVNJR05fSU5WRVJUCQkJQklUKDEpCisjZGVmaW5lIEVOX0RBQ19DSE9QUElORwkJCQlCSVQoMCkKKyNkZWZpbmUgRFJWUl9MT0dJQ19DTEtfRU4JCQlCSVQoNCkKKyNkZWZpbmUgRFJWUl9MT0dJQ19DTEtfRElWKHgpCQkJKCh4KSAmIDB4ZikKKyNkZWZpbmUgUEFSQUxMRUxfUkFURV9NT0RFMih4KQkJCSgoKHgpICYgMHgzKSA8PCA0KQorI2RlZmluZSBQQVJBTExFTF9SQVRFX01PREUxKHgpCQkJKCgoeCkgJiAweDMpIDw8IDIpCisjZGVmaW5lIFBBUkFMTEVMX1JBVEVfTU9ERTAoeCkJCQkoKHgpICYgMHgzKQorI2RlZmluZSBCQU5EX01PREUyKHgpCQkJCSgoKHgpICYgMHgzKSA8PCA0KQorI2RlZmluZSBCQU5EX01PREUxKHgpCQkJCSgoKHgpICYgMHgzKSA8PCAyKQorI2RlZmluZSBCQU5EX01PREUwKHgpCQkJCSgoeCkgJiAweDMpCisjZGVmaW5lIExBTkVfU1lOQ19NT0RFCQkJCUJJVCg1KQorI2RlZmluZSBMQU5FX01PREUoeCkJCQkJKCh4KSAmIDB4MWYpCisjZGVmaW5lIENEUl9QRF9TRUxfTU9ERTAoeCkJCQkoKCh4KSAmIDB4MykgPDwgNSkKKyNkZWZpbmUgRU5fRExMX01PREUwCQkJCUJJVCg0KQorI2RlZmluZSBFTl9JUV9EQ0NfTU9ERTAJCQkJQklUKDMpCisjZGVmaW5lIEVOX0lRQ0FMX01PREUwCQkJCUJJVCgyKQorI2RlZmluZSBFTl9RUEFUSF9NT0RFMAkJCQlCSVQoMSkKKyNkZWZpbmUgRU5fRVBBVEhfTU9ERTAJCQkJQklUKDApCisjZGVmaW5lIEZPUkNFX1RTWU5DX0FDSwkJCQlCSVQoNykKKyNkZWZpbmUgRk9SQ0VfQ01OX0FDSwkJCQlCSVQoNikKKyNkZWZpbmUgRk9SQ0VfQ01OX1JFQURZCQkJCUJJVCg1KQorI2RlZmluZSBFTl9SQ0xLX0RFR0xJVENICQkJQklUKDQpCisjZGVmaW5lIEJZUEFTU19SU01fQ0RSX1JFU0VUCQkJQklUKDMpCisjZGVmaW5lIEJZUEFTU19SU01fVFNZTkMJCQlCSVQoMikKKyNkZWZpbmUgQllQQVNTX1JTTV9TQU1QX0NBTAkJCUJJVCgxKQorI2RlZmluZSBCWVBBU1NfUlNNX0RMTF9DQUwJCQlCSVQoMCkKKworLyogRU1BQ19RU0VSREVTX0NPTV9TWVNfQ0xLX0NUUkwgKi8KKyNkZWZpbmUgU1lTQ0xLX0NNCQkJCUJJVCg0KQorI2RlZmluZSBTWVNDTEtfQUNfQ09VUExFCQkJQklUKDMpCisKKy8qIEVNQUNfUVNFUkRFU19DT01fUExMX0NOVFJMICovCisjZGVmaW5lIE9DUF9FTgkJCQkJQklUKDUpCisjZGVmaW5lIFBMTF9ESVZfRkZFTgkJCQlCSVQoMikKKyNkZWZpbmUgUExMX0RJVl9PUkQJCQkJQklUKDEpCisKKy8qIEVNQUNfUVNFUkRFU19DT01fU1lTQ0xLX0VOX1NFTCAqLworI2RlZmluZSBTWVNDTEtfU0VMX0NNT1MJCQkJQklUKDMpCisKKy8qIEVNQUNfUVNFUkRFU19DT01fUkVTRVRTTV9DTlRSTCAqLworI2RlZmluZSBGUlFfVFVORV9NT0RFCQkJCUJJVCg0KQorCisvKiBFTUFDX1FTRVJERVNfQ09NX1BMTExPQ0tfQ01QX0VOICovCisjZGVmaW5lIFBMTExPQ0tfQ01QX0VOCQkJCUJJVCgwKQorCisvKiBFTUFDX1FTRVJERVNfQ09NX0RFQ19TVEFSVDEgKi8KKyNkZWZpbmUgREVDX1NUQVJUMV9NVVgJCQkJQklUKDcpCisjZGVmaW5lIERFQ19TVEFSVDEoeCkJCQkJKCh4KSAmIDB4N2YpCisKKy8qIEVNQUNfUVNFUkRFU19DT01fRElWX0ZSQUNfU1RBUlQxICogRU1BQ19RU0VSREVTX0NPTV9ESVZfRlJBQ19TVEFSVDIgKi8KKyNkZWZpbmUgRElWX0ZSQUNfU1RBUlRfTVVYCQkJQklUKDcpCisjZGVmaW5lIERJVl9GUkFDX1NUQVJUKHgpCQkJKCh4KSAmIDB4N2YpCisKKy8qIEVNQUNfUVNFUkRFU19DT01fRElWX0ZSQUNfU1RBUlQzICovCisjZGVmaW5lIERJVl9GUkFDX1NUQVJUM19NVVgJCQlCSVQoNCkKKyNkZWZpbmUgRElWX0ZSQUNfU1RBUlQzKHgpCQkJKCh4KSAmIDB4ZikKKworLyogRU1BQ19RU0VSREVTX0NPTV9ERUNfU1RBUlQyICovCisjZGVmaW5lIERFQ19TVEFSVDJfTVVYCQkJCUJJVCgxKQorI2RlZmluZSBERUNfU1RBUlQyCQkJCUJJVCgwKQorCisvKiBFTUFDX1FTRVJERVNfQ09NX1JFU0VUX1NNICovCisjZGVmaW5lIFJFQURZCQkJCQlCSVQoNSkKKworLyogRU1BQ19RU0VSREVTX1RYX1RYX0VNUF9QT1NUMV9MVkwgKi8KKyNkZWZpbmUgVFhfRU1QX1BPU1QxX0xWTF9NVVgJCQlCSVQoNSkKKyNkZWZpbmUgVFhfRU1QX1BPU1QxX0xWTCh4KQkJCSgoeCkgJiAweDFmKQorI2RlZmluZSBUWF9FTVBfUE9TVDFfTFZMX0JNU0sJCQkweDFmCisjZGVmaW5lIFRYX0VNUF9QT1NUMV9MVkxfU0hGVAkJCTAKKworLyogRU1BQ19RU0VSREVTX1RYX1RYX0RSVl9MVkwgKi8KKyNkZWZpbmUgVFhfRFJWX0xWTF9NVVgJCQkJQklUKDQpCisjZGVmaW5lIFRYX0RSVl9MVkwoeCkJCQkJKCh4KSAmIDB4ZikKKworLyogRU1BQ19RU0VSREVTX1RYX1RSQU5fRFJWUl9FTVBfRU4gKi8KKyNkZWZpbmUgRU1QX0VOX01VWAkJCQlCSVQoMSkKKyNkZWZpbmUgRU1QX0VOCQkJCQlCSVQoMCkKKworLyogRU1BQ19RU0VSREVTX1JYX0NEUl9DT05UUk9MICYgRU1BQ19RU0VSREVTX1JYX0NEUl9DT05UUk9MMiAqLworI2RlZmluZSBIQldfUERfRU4JCQkJQklUKDcpCisjZGVmaW5lIFNFQ09ORE9SREVSRU5BQkxFCQkJQklUKDYpCisjZGVmaW5lIEZJUlNUT1JERVJfVEhSRVNIKHgpCQkJKCgoeCkgJiAweDcpIDw8IDMpCisjZGVmaW5lIFNFQ09ORE9SREVSR0FJTih4KQkJCSgoeCkgJiAweDcpCisKKy8qIEVNQUNfUVNFUkRFU19SWF9SWF9FUV9HQUlOMTIgKi8KKyNkZWZpbmUgUlhfRVFfR0FJTjIoeCkJCQkJKCgoeCkgJiAweGYpIDw8IDQpCisjZGVmaW5lIFJYX0VRX0dBSU4xKHgpCQkJCSgoeCkgJiAweGYpCisKKy8qIEVNQUNfU0dNSUlfUEhZX1NFUkRFU19TVEFSVCAqLworI2RlZmluZSBTRVJERVNfU1RBUlQJCQkJQklUKDApCisKKy8qIEVNQUNfU0dNSUlfUEhZX0NNTl9QV1JfQ1RSTCAqLworI2RlZmluZSBCSUFTX0VOCQkJCQlCSVQoNikKKyNkZWZpbmUgUExMX0VOCQkJCQlCSVQoNSkKKyNkZWZpbmUgU1lTQ0xLX0VOCQkJCUJJVCg0KQorI2RlZmluZSBDTEtCVUZfTF9FTgkJCQlCSVQoMykKKyNkZWZpbmUgUExMX1RYQ0xLX0VOCQkJCUJJVCgxKQorI2RlZmluZSBQTExfUlhDTEtfRU4JCQkJQklUKDApCisKKy8qIEVNQUNfU0dNSUlfUEhZX1JYX1BXUl9DVFJMICovCisjZGVmaW5lIEwwX1JYX1NJR0RFVF9FTgkJCQlCSVQoNykKKyNkZWZpbmUgTDBfUlhfVEVSTV9NT0RFKHgpCQkJKCgoeCkgJiAzKSA8PCA0KQorI2RlZmluZSBMMF9SWF9JX0VOCQkJCUJJVCgxKQorCisvKiBFTUFDX1NHTUlJX1BIWV9UWF9QV1JfQ1RSTCAqLworI2RlZmluZSBMMF9UWF9FTgkJCQlCSVQoNSkKKyNkZWZpbmUgTDBfQ0xLQlVGX0VOCQkJCUJJVCg0KQorI2RlZmluZSBMMF9UUkFOX0JJQVNfRU4JCQkJQklUKDEpCisKKy8qIEVNQUNfU0dNSUlfUEhZX0xBTkVfQ1RSTDEgKi8KKyNkZWZpbmUgTDBfUlhfRVFVQUxJWkVfRU5BQkxFCQkJQklUKDYpCisjZGVmaW5lIEwwX1JFU0VUX1RTWU5DX0VOCQkJQklUKDQpCisjZGVmaW5lIEwwX0RSVl9MVkwoeCkJCQkJKCh4KSAmIDB4ZikKKworLyogRU1BQ19TR01JSV9QSFlfQVVUT05FR19DRkcyICovCisjZGVmaW5lIEZPUkNFX0FOX1RYX0NGRwkJCQlCSVQoNSkKKyNkZWZpbmUgRk9SQ0VfQU5fUlhfQ0ZHCQkJCUJJVCg0KQorI2RlZmluZSBBTl9FTkFCTEUJCQkJQklUKDApCisKKy8qIEVNQUNfU0dNSUlfUEhZX1NQRUVEX0NGRzEgKi8KKyNkZWZpbmUgRFVQTEVYX01PREUJCQkJQklUKDQpCisjZGVmaW5lIFNQRE1PREVfMTAwMAkJCQlCSVQoMSkKKyNkZWZpbmUgU1BETU9ERV8xMDAJCQkJQklUKDApCisjZGVmaW5lIFNQRE1PREVfMTAJCQkJMAorI2RlZmluZSBTUERNT0RFX0JNU0sJCQkJMworI2RlZmluZSBTUERNT0RFX1NIRlQJCQkJMAorCisvKiBFTUFDX1NHTUlJX1BIWV9QT1dfRFdOX0NUUkwwICovCisjZGVmaW5lIFBXUkROX0IJCQkJCUJJVCgwKQorI2RlZmluZSBDRFJfTUFYX0NOVCh4KQkJCQkoKHgpICYgMHhmZikKKworLyogRU1BQ19RU0VSREVTX1RYX0JJU1RfTU9ERV9MQU5FTk8gKi8KKyNkZWZpbmUgQklTVF9MQU5FX05VTUJFUih4KQkJCSgoKHgpICYgMykgPDwgNSkKKyNkZWZpbmUgQklTVE1PREUoeCkJCQkJKCh4KSAmIDB4MWYpCisKKy8qIEVNQUNfUVNFUkRFU19DT01fUExMTE9DS19DTVB4ICovCisjZGVmaW5lIFBMTExPQ0tfQ01QKHgpCQkJCSgoeCkgJiAweGZmKQorCisvKiBFTUFDX1NHTUlJX1BIWV9SRVNFVF9DVFJMICovCisjZGVmaW5lIFBIWV9TV19SRVNFVAkJCQlCSVQoMCkKKworLyogRU1BQ19TR01JSV9QSFlfSVJRX0NNRCAqLworI2RlZmluZSBJUlFfR0xPQkFMX0NMRUFSCQkJQklUKDApCisKKy8qIEVNQUNfU0dNSUlfUEhZX0lOVEVSUlVQVF9NQVNLICovCisjZGVmaW5lIERFQ09ERV9DT0RFX0VSUgkJCQlCSVQoNykKKyNkZWZpbmUgREVDT0RFX0RJU1BfRVJSCQkJCUJJVCg2KQorI2RlZmluZSBQTExfVU5MT0NLCQkJCUJJVCg1KQorI2RlZmluZSBBTl9JTExFR0FMX1RFUk0JCQkJQklUKDQpCisjZGVmaW5lIFNZTkNfRkFJTAkJCQlCSVQoMykKKyNkZWZpbmUgQU5fU1RBUlQJCQkJQklUKDIpCisjZGVmaW5lIEFOX0VORAkJCQkJQklUKDEpCisjZGVmaW5lIEFOX1JFUVVFU1QJCQkJQklUKDApCisKKyNkZWZpbmUgU0dNSUlfUEhZX0lSUV9DTFJfV0FJVF9USU1FCQkxMAorCisjZGVmaW5lIFNHTUlJX1BIWV9JTlRFUlJVUFRfRVJSIChcCisJREVDT0RFX0NPREVfRVJSICAgICAgICAgfFwKKwlERUNPREVfRElTUF9FUlIpCisKKyNkZWZpbmUgU0dNSUlfSVNSX0FOX01BU0sgICAgICAgKFwKKwlBTl9SRVFVRVNUICAgICAgICAgICAgICB8XAorCUFOX1NUQVJUICAgICAgICAgICAgICAgIHxcCisJQU5fRU5EICAgICAgICAgICAgICAgICAgfFwKKwlBTl9JTExFR0FMX1RFUk0gICAgICAgICB8XAorCVBMTF9VTkxPQ0sgICAgICAgICAgICAgIHxcCisJU1lOQ19GQUlMKQorCisjZGVmaW5lIFNHTUlJX0lTUl9NQVNLICAgICAgICAgIChcCisJU0dNSUlfUEhZX0lOVEVSUlVQVF9FUlIgfFwKKwlTR01JSV9JU1JfQU5fTUFTSykKKworLyogU0dNSUkgVFhfQ09ORklHICovCisjZGVmaW5lIFRYQ0ZHX0xJTksJCQkJMHg4MDAwCisjZGVmaW5lIFRYQ0ZHX01PREVfQk1TSwkJCQkweDFjMDAKKyNkZWZpbmUgVFhDRkdfMTAwMF9GVUxMCQkJCTB4MTgwMAorI2RlZmluZSBUWENGR18xMDBfRlVMTAkJCQkweDE0MDAKKyNkZWZpbmUgVFhDRkdfMTAwX0hBTEYJCQkJMHgwNDAwCisjZGVmaW5lIFRYQ0ZHXzEwX0ZVTEwJCQkJMHgxMDAwCisjZGVmaW5lIFRYQ0ZHXzEwX0hBTEYJCQkJMHgwMDAwCisKKyNkZWZpbmUgU0VSREVTX1NUQVJUX1dBSVRfVElNRVMJCQkxMDAKKworc3RydWN0IGVtYWNfcmVnX3dyaXRlIHsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXUzMiB2YWw7Cit9OworCitzdGF0aWMgdm9pZCBlbWFjX3JlZ193cml0ZV9hbGwodm9pZCBfX2lvbWVtICpiYXNlLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBlbWFjX3JlZ193cml0ZSAqaXRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyArK2l0ciwgKytpKQorCQl3cml0ZWwoaXRyLT52YWwsIGJhc2UgKyBpdHItPm9mZnNldCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZW1hY19yZWdfd3JpdGUgcGh5c2ljYWxfY29kaW5nX3N1YmxheWVyX3Byb2dyYW1taW5nX3YxW10gPSB7CisJe0VNQUNfU0dNSUlfUEhZX0NEUl9DVFJMMCwgQ0RSX01BWF9DTlQoMTUpfSwKKwl7RU1BQ19TR01JSV9QSFlfUE9XX0RXTl9DVFJMMCwgUFdSRE5fQn0sCisJe0VNQUNfU0dNSUlfUEhZX0NNTl9QV1JfQ1RSTCwKKwkJQklBU19FTiB8IFNZU0NMS19FTiB8IENMS0JVRl9MX0VOIHwgUExMX1RYQ0xLX0VOIHwgUExMX1JYQ0xLX0VOfSwKKwl7RU1BQ19TR01JSV9QSFlfVFhfUFdSX0NUUkwsIEwwX1RYX0VOIHwgTDBfQ0xLQlVGX0VOIHwgTDBfVFJBTl9CSUFTX0VOfSwKKwl7RU1BQ19TR01JSV9QSFlfUlhfUFdSX0NUUkwsCisJCUwwX1JYX1NJR0RFVF9FTiB8IEwwX1JYX1RFUk1fTU9ERSgxKSB8IEwwX1JYX0lfRU59LAorCXtFTUFDX1NHTUlJX1BIWV9DTU5fUFdSX0NUUkwsCisJCUJJQVNfRU4gfCBQTExfRU4gfCBTWVNDTEtfRU4gfCBDTEtCVUZfTF9FTiB8IFBMTF9UWENMS19FTiB8CisJCVBMTF9SWENMS19FTn0sCisJe0VNQUNfU0dNSUlfUEhZX0xBTkVfQ1RSTDEsCisJCUwwX1JYX0VRVUFMSVpFX0VOQUJMRSB8IEwwX1JFU0VUX1RTWU5DX0VOIHwgTDBfRFJWX0xWTCgxNSl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbWFjX3JlZ193cml0ZSBzeXNjbGtfcmVmY2xrX3NldHRpbmdbXSA9IHsKKwl7RU1BQ19RU0VSREVTX0NPTV9TWVNDTEtfRU5fU0VMLCBTWVNDTEtfU0VMX0NNT1N9LAorCXtFTUFDX1FTRVJERVNfQ09NX1NZU19DTEtfQ1RSTCwJU1lTQ0xLX0NNIHwgU1lTQ0xLX0FDX0NPVVBMRX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVtYWNfcmVnX3dyaXRlIHBsbF9zZXR0aW5nW10gPSB7CisJe0VNQUNfUVNFUkRFU19DT01fUExMX0lQX1NFVEksIFBMTF9JUFNFVEkoMSl9LAorCXtFTUFDX1FTRVJERVNfQ09NX1BMTF9DUF9TRVRJLCBQTExfQ1BTRVRJKDU5KX0sCisJe0VNQUNfUVNFUkRFU19DT01fUExMX0lQX1NFVFAsIFBMTF9JUFNFVFAoMTApfSwKKwl7RU1BQ19RU0VSREVTX0NPTV9QTExfQ1BfU0VUUCwgUExMX0NQU0VUUCg5KX0sCisJe0VNQUNfUVNFUkRFU19DT01fUExMX0NSQ1RSTCwgUExMX1JDVFJMKDE1KSB8IFBMTF9DQ1RSTCgxMSl9LAorCXtFTUFDX1FTRVJERVNfQ09NX1BMTF9DTlRSTCwgT0NQX0VOIHwgUExMX0RJVl9GRkVOIHwgUExMX0RJVl9PUkR9LAorCXtFTUFDX1FTRVJERVNfQ09NX0RFQ19TVEFSVDEsIERFQ19TVEFSVDFfTVVYIHwgREVDX1NUQVJUMSgyKX0sCisJe0VNQUNfUVNFUkRFU19DT01fREVDX1NUQVJUMiwgREVDX1NUQVJUMl9NVVggfCBERUNfU1RBUlQyfSwKKwl7RU1BQ19RU0VSREVTX0NPTV9ESVZfRlJBQ19TVEFSVDEsCisJCURJVl9GUkFDX1NUQVJUX01VWCB8IERJVl9GUkFDX1NUQVJUKDg1KX0sCisJe0VNQUNfUVNFUkRFU19DT01fRElWX0ZSQUNfU1RBUlQyLAorCQlESVZfRlJBQ19TVEFSVF9NVVggfCBESVZfRlJBQ19TVEFSVCg0Mil9LAorCXtFTUFDX1FTRVJERVNfQ09NX0RJVl9GUkFDX1NUQVJUMywKKwkJRElWX0ZSQUNfU1RBUlQzX01VWCB8IERJVl9GUkFDX1NUQVJUMygzKX0sCisJe0VNQUNfUVNFUkRFU19DT01fUExMTE9DS19DTVAxLCBQTExMT0NLX0NNUCg0Myl9LAorCXtFTUFDX1FTRVJERVNfQ09NX1BMTExPQ0tfQ01QMiwgUExMTE9DS19DTVAoMTA0KX0sCisJe0VNQUNfUVNFUkRFU19DT01fUExMTE9DS19DTVAzLCBQTExMT0NLX0NNUCgwKX0sCisJe0VNQUNfUVNFUkRFU19DT01fUExMTE9DS19DTVBfRU4sIFBMTExPQ0tfQ01QX0VOfSwKKwl7RU1BQ19RU0VSREVTX0NPTV9SRVNFVFNNX0NOVFJMLCBGUlFfVFVORV9NT0RFfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZW1hY19yZWdfd3JpdGUgY2RyX3NldHRpbmdbXSA9IHsKKwl7RU1BQ19RU0VSREVTX1JYX0NEUl9DT05UUk9MLAorCQlTRUNPTkRPUkRFUkVOQUJMRSB8IEZJUlNUT1JERVJfVEhSRVNIKDMpIHwgU0VDT05ET1JERVJHQUlOKDIpfSwKKwl7RU1BQ19RU0VSREVTX1JYX0NEUl9DT05UUk9MMiwKKwkJU0VDT05ET1JERVJFTkFCTEUgfCBGSVJTVE9SREVSX1RIUkVTSCgzKSB8IFNFQ09ORE9SREVSR0FJTig0KX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVtYWNfcmVnX3dyaXRlIHR4X3J4X3NldHRpbmdbXSA9IHsKKwl7RU1BQ19RU0VSREVTX1RYX0JJU1RfTU9ERV9MQU5FTk8sIDB9LAorCXtFTUFDX1FTRVJERVNfVFhfVFhfRFJWX0xWTCwgVFhfRFJWX0xWTF9NVVggfCBUWF9EUlZfTFZMKDE1KX0sCisJe0VNQUNfUVNFUkRFU19UWF9UUkFOX0RSVlJfRU1QX0VOLCBFTVBfRU5fTVVYIHwgRU1QX0VOfSwKKwl7RU1BQ19RU0VSREVTX1RYX1RYX0VNUF9QT1NUMV9MVkwsCisJCVRYX0VNUF9QT1NUMV9MVkxfTVVYIHwgVFhfRU1QX1BPU1QxX0xWTCgxKX0sCisJe0VNQUNfUVNFUkRFU19SWF9SWF9FUV9HQUlOMTIsIFJYX0VRX0dBSU4yKDE1KSB8IFJYX0VRX0dBSU4xKDE1KX0sCisJe0VNQUNfUVNFUkRFU19UWF9MQU5FX01PREUsIExBTkVfTU9ERSg4KX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVtYWNfcmVnX3dyaXRlIHNnbWlpX3YyX2xhbmVkW10gPSB7CisJLyogQ0RSIFNldHRpbmdzICovCisJe0VNQUNfU0dNSUlfTE5fVUNEUl9GT19HQUlOX01PREUwLAorCQlVQ0RSX1NURVBfQllfVFdPX01PREUwIHwgVUNEUl94T19HQUlOX01PREUoMTApfSwKKwl7RU1BQ19TR01JSV9MTl9VQ0RSX1NPX0dBSU5fTU9ERTAsIFVDRFJfeE9fR0FJTl9NT0RFKDYpfSwKKwl7RU1BQ19TR01JSV9MTl9VQ0RSX1NPX0NPTkZJRywgVUNEUl9FTkFCTEUgfCBVQ0RSX1NPX1NBVFVSQVRJT04oMTIpfSwKKworCS8qIFRYL1JYIFNldHRpbmdzICovCisJe0VNQUNfU0dNSUlfTE5fUlhfRU5fU0lHTkFMLCBTSUdERVRfTFBfQllQX1BTNCB8IFNJR0RFVF9FTl9QUzBfVE9fUFMyfSwKKworCXtFTUFDX1NHTUlJX0xOX0RSVlJfQ1RSTDAsIFRYVkFMX1ZBTElEX0lOSVQgfCBLUl9QQ0lHRU4zX01PREV9LAorCXtFTUFDX1NHTUlJX0xOX0RSVlJfVEFQX0VOLCBNQUlOX0VOfSwKKwl7RU1BQ19TR01JSV9MTl9UWF9NQVJHSU5JTkcsIFRYX01BUkdJTklOR19NVVggfCBUWF9NQVJHSU5JTkcoMjUpfSwKKwl7RU1BQ19TR01JSV9MTl9UWF9QUkUsIFRYX1BSRV9NVVh9LAorCXtFTUFDX1NHTUlJX0xOX1RYX1BPU1QsIFRYX1BPU1RfTVVYfSwKKworCXtFTUFDX1NHTUlJX0xOX0NNTF9DVFJMX01PREUwLAorCQlDTUxfR0VBUl9NT0RFKDEpIHwgQ01MMkNNT1NfSUJPT1NUX01PREUoMSl9LAorCXtFTUFDX1NHTUlJX0xOX01JWEVSX0NUUkxfTU9ERTAsCisJCU1JWEVSX0xPQURCX01PREUoMTIpIHwgTUlYRVJfREFUQVJBVEVfTU9ERSgxKX0sCisJe0VNQUNfU0dNSUlfTE5fVkdBX0lOSVRWQUwsIFZHQV9USFJFU0hfREZFKDMxKX0sCisJe0VNQUNfU0dNSUlfTE5fU0lHREVUX0VOQUJMRVMsCisJCVNJR0RFVF9MUF9CWVBfUFMwX1RPX1BTMiB8IFNJR0RFVF9GTFRfQllQfSwKKwl7RU1BQ19TR01JSV9MTl9TSUdERVRfQ05UUkwsIFNJR0RFVF9MVkwoOCl9LAorCisJe0VNQUNfU0dNSUlfTE5fU0lHREVUX0RFR0xJVENIX0NOVFJMLCBTSUdERVRfREVHTElUQ0hfQ1RSTCg0KX0sCisJe0VNQUNfU0dNSUlfTE5fUlhfTUlTQ19DTlRSTDAsIDB9LAorCXtFTUFDX1NHTUlJX0xOX0RSVlJfTE9HSUNfQ0xLRElWLAorCQlEUlZSX0xPR0lDX0NMS19FTiB8IERSVlJfTE9HSUNfQ0xLX0RJVig0KX0sCisKKwl7RU1BQ19TR01JSV9MTl9QQVJBTExFTF9SQVRFLCBQQVJBTExFTF9SQVRFX01PREUwKDEpfSwKKwl7RU1BQ19TR01JSV9MTl9UWF9CQU5EX01PREUsIEJBTkRfTU9ERTAoMil9LAorCXtFTUFDX1NHTUlJX0xOX1JYX0JBTkQsIEJBTkRfTU9ERTAoMyl9LAorCXtFTUFDX1NHTUlJX0xOX0xBTkVfTU9ERSwgTEFORV9NT0RFKDI2KX0sCisJe0VNQUNfU0dNSUlfTE5fUlhfUkNWUl9QQVRIMV9NT0RFMCwgQ0RSX1BEX1NFTF9NT0RFMCgzKX0sCisJe0VNQUNfU0dNSUlfTE5fUlNNX0NPTkZJRywgQllQQVNTX1JTTV9TQU1QX0NBTCB8IEJZUEFTU19SU01fRExMX0NBTH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVtYWNfcmVnX3dyaXRlIHBoeXNpY2FsX2NvZGluZ19zdWJsYXllcl9wcm9ncmFtbWluZ192MltdID0geworCXtFTUFDX1NHTUlJX1BIWV9QT1dfRFdOX0NUUkwwLCBQV1JETl9CfSwKKwl7RU1BQ19TR01JSV9QSFlfQ0RSX0NUUkwwLCBDRFJfTUFYX0NOVCgxNSl9LAorCXtFTUFDX1NHTUlJX1BIWV9UWF9QV1JfQ1RSTCwgMH0sCisJe0VNQUNfU0dNSUlfUEhZX0xBTkVfQ1RSTDEsIEwwX1JYX0VRVUFMSVpFX0VOQUJMRX0sCit9OworCitzdGF0aWMgaW50IGVtYWNfc2dtaWlfbGlua19pbml0KHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGFkcHQtPnBoeWRldjsKKwlzdHJ1Y3QgZW1hY19waHkgKnBoeSA9ICZhZHB0LT5waHk7CisJdTMyIHZhbDsKKworCXZhbCA9IHJlYWRsKHBoeS0+YmFzZSArIEVNQUNfU0dNSUlfUEhZX0FVVE9ORUdfQ0ZHMik7CisKKwlpZiAocGh5ZGV2LT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCXZhbCAmPSB+KEZPUkNFX0FOX1JYX0NGRyB8IEZPUkNFX0FOX1RYX0NGRyk7CisJCXZhbCB8PSBBTl9FTkFCTEU7CisJCXdyaXRlbCh2YWwsIHBoeS0+YmFzZSArIEVNQUNfU0dNSUlfUEhZX0FVVE9ORUdfQ0ZHMik7CisJfSBlbHNlIHsKKwkJdTMyIHNwZWVkX2NmZzsKKworCQlzd2l0Y2ggKHBoeWRldi0+c3BlZWQpIHsKKwkJY2FzZSBTUEVFRF8xMDoKKwkJCXNwZWVkX2NmZyA9IFNQRE1PREVfMTA7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8xMDA6CisJCQlzcGVlZF9jZmcgPSBTUERNT0RFXzEwMDsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzEwMDA6CisJCQlzcGVlZF9jZmcgPSBTUERNT0RFXzEwMDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKHBoeWRldi0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJc3BlZWRfY2ZnIHw9IERVUExFWF9NT0RFOworCisJCXZhbCAmPSB+QU5fRU5BQkxFOworCQl3cml0ZWwoc3BlZWRfY2ZnLCBwaHktPmJhc2UgKyBFTUFDX1NHTUlJX1BIWV9TUEVFRF9DRkcxKTsKKwkJd3JpdGVsKHZhbCwgcGh5LT5iYXNlICsgRU1BQ19TR01JSV9QSFlfQVVUT05FR19DRkcyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbWFjX3NnbWlpX2lycV9jbGVhcihzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LCB1MzIgaXJxX2JpdHMpCit7CisJc3RydWN0IGVtYWNfcGh5ICpwaHkgPSAmYWRwdC0+cGh5OworCXUzMiBzdGF0dXM7CisKKwl3cml0ZWxfcmVsYXhlZChpcnFfYml0cywgcGh5LT5iYXNlICsgRU1BQ19TR01JSV9QSFlfSU5URVJSVVBUX0NMRUFSKTsKKwl3cml0ZWxfcmVsYXhlZChJUlFfR0xPQkFMX0NMRUFSLCBwaHktPmJhc2UgKyBFTUFDX1NHTUlJX1BIWV9JUlFfQ01EKTsKKwkvKiBFbnN1cmUgaW50ZXJydXB0IGNsZWFyIGNvbW1hbmQgaXMgd3JpdHRlbiB0byBIVyAqLworCXdtYigpOworCisJLyogQWZ0ZXIgc2V0IHRoZSBJUlFfR0xPQkFMX0NMRUFSIGJpdCwgdGhlIHN0YXR1cyBjbGVhcmluZyBtdXN0CisJICogYmUgY29uZmlybWVkIGJlZm9yZSBjbGVhcmluZyB0aGUgYml0cyBpbiBvdGhlciByZWdpc3RlcnMuCisJICogSXQgdGFrZXMgYSBmZXcgY3ljbGVzIGZvciBodyB0byBjbGVhciB0aGUgaW50ZXJydXB0IHN0YXR1cy4KKwkgKi8KKwlpZiAocmVhZGxfcG9sbF90aW1lb3V0X2F0b21pYyhwaHktPmJhc2UgKworCQkJCSAgICAgIEVNQUNfU0dNSUlfUEhZX0lOVEVSUlVQVF9TVEFUVVMsCisJCQkJICAgICAgc3RhdHVzLCAhKHN0YXR1cyAmIGlycV9iaXRzKSwgMSwKKwkJCQkgICAgICBTR01JSV9QSFlfSVJRX0NMUl9XQUlUX1RJTUUpKSB7CisJCW5ldGRldl9lcnIoYWRwdC0+bmV0ZGV2LAorCQkJICAgImVycm9yOiBmYWlsZWQgY2xlYXIgU0dNSUkgaXJxOiBzdGF0dXM6MHgleCBiaXRzOjB4JXhcbiIsCisJCQkgICBzdGF0dXMsIGlycV9iaXRzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogRmluYWxpemUgY2xlYXJpbmcgcHJvY2VkdXJlICovCisJd3JpdGVsX3JlbGF4ZWQoMCwgcGh5LT5iYXNlICsgRU1BQ19TR01JSV9QSFlfSVJRX0NNRCk7CisJd3JpdGVsX3JlbGF4ZWQoMCwgcGh5LT5iYXNlICsgRU1BQ19TR01JSV9QSFlfSU5URVJSVVBUX0NMRUFSKTsKKworCS8qIEVuc3VyZSB0aGF0IGNsZWFyaW5nIHByb2NlZHVyZSBmaW5hbGl6YXRpb24gaXMgd3JpdHRlbiB0byBIVyAqLworCXdtYigpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlbWFjX3NnbWlpX2luaXRfdjEoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgZW1hY19waHkgKnBoeSA9ICZhZHB0LT5waHk7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldDsKKworCXJldCA9IGVtYWNfc2dtaWlfbGlua19pbml0KGFkcHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwllbWFjX3JlZ193cml0ZV9hbGwocGh5LT5iYXNlLCBwaHlzaWNhbF9jb2Rpbmdfc3VibGF5ZXJfcHJvZ3JhbW1pbmdfdjEsCisJCQkgICBBUlJBWV9TSVpFKHBoeXNpY2FsX2NvZGluZ19zdWJsYXllcl9wcm9ncmFtbWluZ192MSkpOworCWVtYWNfcmVnX3dyaXRlX2FsbChwaHktPmJhc2UsIHN5c2Nsa19yZWZjbGtfc2V0dGluZywKKwkJCSAgIEFSUkFZX1NJWkUoc3lzY2xrX3JlZmNsa19zZXR0aW5nKSk7CisJZW1hY19yZWdfd3JpdGVfYWxsKHBoeS0+YmFzZSwgcGxsX3NldHRpbmcsIEFSUkFZX1NJWkUocGxsX3NldHRpbmcpKTsKKwllbWFjX3JlZ193cml0ZV9hbGwocGh5LT5iYXNlLCBjZHJfc2V0dGluZywgQVJSQVlfU0laRShjZHJfc2V0dGluZykpOworCWVtYWNfcmVnX3dyaXRlX2FsbChwaHktPmJhc2UsIHR4X3J4X3NldHRpbmcsCisJCQkgICBBUlJBWV9TSVpFKHR4X3J4X3NldHRpbmcpKTsKKworCS8qIFBvd2VyIHVwIHRoZSBTZXIvRGVzIGVuZ2luZSAqLworCXdyaXRlbChTRVJERVNfU1RBUlQsIHBoeS0+YmFzZSArIEVNQUNfU0dNSUlfUEhZX1NFUkRFU19TVEFSVCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0VSREVTX1NUQVJUX1dBSVRfVElNRVM7IGkrKykgeworCQlpZiAocmVhZGwocGh5LT5iYXNlICsgRU1BQ19RU0VSREVTX0NPTV9SRVNFVF9TTSkgJiBSRUFEWSkKKwkJCWJyZWFrOworCQl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOworCX0KKworCWlmIChpID09IFNFUkRFU19TVEFSVF9XQUlUX1RJTUVTKSB7CisJCW5ldGRldl9lcnIoYWRwdC0+bmV0ZGV2LCAiZXJyb3I6IHNlci9kZXMgZmFpbGVkIHRvIHN0YXJ0XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCS8qIE1hc2sgb3V0IGFsbCB0aGUgU0dNSUkgSW50ZXJydXB0ICovCisJd3JpdGVsKDAsIHBoeS0+YmFzZSArIEVNQUNfU0dNSUlfUEhZX0lOVEVSUlVQVF9NQVNLKTsKKworCWVtYWNfc2dtaWlfaXJxX2NsZWFyKGFkcHQsIFNHTUlJX1BIWV9JTlRFUlJVUFRfRVJSKTsKKworCXJldHVybiAwOworfQorCitpbnQgZW1hY19zZ21paV9pbml0X3YyKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IGVtYWNfcGh5ICpwaHkgPSAmYWRwdC0+cGh5OworCXZvaWQgX19pb21lbSAqcGh5X3JlZ3MgPSBwaHktPmJhc2U7CisJdm9pZCBfX2lvbWVtICpsYW5lZCA9IHBoeS0+ZGlnaXRhbDsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIgbG5zdGF0dXM7CisJaW50IHJldDsKKworCXJldCA9IGVtYWNfc2dtaWlfbGlua19pbml0KGFkcHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBQQ1MgbGFuZS14IGluaXQgKi8KKwllbWFjX3JlZ193cml0ZV9hbGwocGh5LT5iYXNlLCBwaHlzaWNhbF9jb2Rpbmdfc3VibGF5ZXJfcHJvZ3JhbW1pbmdfdjIsCisJCQkgICBBUlJBWV9TSVpFKHBoeXNpY2FsX2NvZGluZ19zdWJsYXllcl9wcm9ncmFtbWluZ192MikpOworCisJLyogU0dNSUkgbGFuZS14IGluaXQgKi8KKwllbWFjX3JlZ193cml0ZV9hbGwocGh5LT5kaWdpdGFsLAorCQkJICAgc2dtaWlfdjJfbGFuZWQsIEFSUkFZX1NJWkUoc2dtaWlfdjJfbGFuZWQpKTsKKworCS8qIFBvd2VyIHVwIFBDUyBhbmQgc3RhcnQgcmVzZXQgbGFuZSBzdGF0ZSBtYWNoaW5lICovCisKKwl3cml0ZWwoMCwgcGh5X3JlZ3MgKyBFTUFDX1NHTUlJX1BIWV9SRVNFVF9DVFJMKTsKKwl3cml0ZWwoMSwgbGFuZWQgKyBTR01JSV9MTl9SU01fU1RBUlQpOworCisJLyogV2FpdCBmb3IgY19yZWFkeSBhc3NlcnRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0VSREVTX1NUQVJUX1dBSVRfVElNRVM7IGkrKykgeworCQlsbnN0YXR1cyA9IHJlYWRsKHBoeV9yZWdzICsgU0dNSUlfUEhZX0xOX0xBTkVfU1RBVFVTKTsKKwkJaWYgKGxuc3RhdHVzICYgQklUKDEpKQorCQkJYnJlYWs7CisJCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7CisJfQorCisJaWYgKGkgPT0gU0VSREVTX1NUQVJUX1dBSVRfVElNRVMpIHsKKwkJbmV0ZGV2X2VycihhZHB0LT5uZXRkZXYsICJTR01JSSBmYWlsZWQgdG8gc3RhcnRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBEaXNhYmxlIGRpZ2l0YWwgYW5kIFNFUkRFUyBsb29wYmFjayAqLworCXdyaXRlbCgwLCBwaHlfcmVncyArIFNHTUlJX1BIWV9MTl9CSVNUX0dFTjApOworCXdyaXRlbCgwLCBwaHlfcmVncyArIFNHTUlJX1BIWV9MTl9CSVNUX0dFTjIpOworCXdyaXRlbCgwLCBwaHlfcmVncyArIFNHTUlJX1BIWV9MTl9DRFJfQ1RSTDEpOworCisJLyogTWFzayBvdXQgYWxsIHRoZSBTR01JSSBJbnRlcnJ1cHQgKi8KKwl3cml0ZWwoMCwgcGh5X3JlZ3MgKyBFTUFDX1NHTUlJX1BIWV9JTlRFUlJVUFRfTUFTSyk7CisKKwllbWFjX3NnbWlpX2lycV9jbGVhcihhZHB0LCBTR01JSV9QSFlfSU5URVJSVVBUX0VSUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW1hY19zZ21paV9yZXNldF9wcmVwYXJlKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IGVtYWNfcGh5ICpwaHkgPSAmYWRwdC0+cGh5OworCXUzMiB2YWw7CisKKwkvKiBSZXNldCBQSFkgKi8KKwl2YWwgPSByZWFkbChwaHktPmJhc2UgKyBFTUFDX0VNQUNfV1JBUFBFUl9DU1IyKTsKKwl3cml0ZWwoKCh2YWwgJiB+UEhZX1JFU0VUKSB8IFBIWV9SRVNFVCksIHBoeS0+YmFzZSArCisJICAgICAgIEVNQUNfRU1BQ19XUkFQUEVSX0NTUjIpOworCS8qIEVuc3VyZSBwaHktcmVzZXQgY29tbWFuZCBpcyB3cml0dGVuIHRvIEhXIGJlZm9yZSB0aGUgcmVsZWFzZSBjbWQgKi8KKwltc2xlZXAoNTApOworCXZhbCA9IHJlYWRsKHBoeS0+YmFzZSArIEVNQUNfRU1BQ19XUkFQUEVSX0NTUjIpOworCXdyaXRlbCgodmFsICYgflBIWV9SRVNFVCksIHBoeS0+YmFzZSArIEVNQUNfRU1BQ19XUkFQUEVSX0NTUjIpOworCS8qIEVuc3VyZSBwaHktcmVzZXQgcmVsZWFzZSBjb21tYW5kIGlzIHdyaXR0ZW4gdG8gSFcgYmVmb3JlIGluaXRpYWxpemluZworCSAqIFNHTUlJCisJICovCisJbXNsZWVwKDUwKTsKK30KKwordm9pZCBlbWFjX3NnbWlpX3Jlc2V0KHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJaW50IHJldDsKKworCWNsa19zZXRfcmF0ZShhZHB0LT5jbGtbRU1BQ19DTEtfSElHSF9TUEVFRF0sIDE5MjAwMDAwKTsKKwllbWFjX3NnbWlpX3Jlc2V0X3ByZXBhcmUoYWRwdCk7CisKKwlyZXQgPSBhZHB0LT5waHkuaW5pdGlhbGl6ZShhZHB0KTsKKwlpZiAocmV0KQorCQluZXRkZXZfZXJyKGFkcHQtPm5ldGRldiwKKwkJCSAgICJjb3VsZCBub3QgcmVpbml0aWFsaXplIGludGVybmFsIFBIWSAoZXJyb3I9JWkpXG4iLAorCQkJICAgcmV0KTsKKworCWNsa19zZXRfcmF0ZShhZHB0LT5jbGtbRU1BQ19DTEtfSElHSF9TUEVFRF0sIDEyNTAwMDAwMCk7Cit9CisKK3N0YXRpYyBpbnQgZW1hY19zZ21paV9hY3BpX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIG1hdGNoX3RhYmxlW10gPSB7CisJCXsKKwkJCS5pZCA9ICJRQ09NODA3MSIsCisJCQkuZHJpdmVyX2RhdGEgPSAoa2VybmVsX3Vsb25nX3QpZW1hY19zZ21paV9pbml0X3YyLAorCQl9LAorCQl7fQorCX07CisJY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkICppZCA9IGFjcGlfbWF0Y2hfZGV2aWNlKG1hdGNoX3RhYmxlLCBkZXYpOworCWVtYWNfc2dtaWlfaW5pdGlhbGl6ZSAqaW5pdGlhbGl6ZSA9IGRhdGE7CisKKwlpZiAoaWQpCisJCSppbml0aWFsaXplID0gKGVtYWNfc2dtaWlfaW5pdGlhbGl6ZSlpZC0+ZHJpdmVyX2RhdGE7CisKKwlyZXR1cm4gISFpZDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZW1hY19zZ21paV9kdF9tYXRjaFtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAicWNvbSxmc205OTAwLWVtYWMtc2dtaWkiLAorCQkuZGF0YSA9IGVtYWNfc2dtaWlfaW5pdF92MSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAicWNvbSxxZGYyNDMyLWVtYWMtc2dtaWkiLAorCQkuZGF0YSA9IGVtYWNfc2dtaWlfaW5pdF92MiwKKwl9LAorCXt9Cit9OworCitpbnQgZW1hY19zZ21paV9jb25maWcoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzZ21paV9wZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZW1hY19waHkgKnBoeSA9ICZhZHB0LT5waHk7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldDsKKworCWlmIChoYXNfYWNwaV9jb21wYW5pb24oJnBkZXYtPmRldikpIHsKKwkJc3RydWN0IGRldmljZSAqZGV2OworCisJCWRldiA9IGRldmljZV9maW5kX2NoaWxkKCZwZGV2LT5kZXYsICZwaHktPmluaXRpYWxpemUsCisJCQkJCWVtYWNfc2dtaWlfYWNwaV9tYXRjaCk7CisKKwkJaWYgKCFkZXYpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBmaW5kIGludGVybmFsIHBoeSBub2RlXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJc2dtaWlfcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCX0gZWxzZSB7CisJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJCW5wID0gb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwgImludGVybmFsLXBoeSIsIDApOworCQlpZiAoIW5wKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtaXNzaW5nIGludGVybmFsLXBoeSBwcm9wZXJ0eVxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCXNnbWlpX3BkZXYgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKG5wKTsKKwkJaWYgKCFzZ21paV9wZGV2KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpbnZhbGlkIGludGVybmFsLXBoeSBwcm9wZXJ0eVxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKGVtYWNfc2dtaWlfZHRfbWF0Y2gsICZzZ21paV9wZGV2LT5kZXYpOworCQlpZiAoIW1hdGNoKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bnJlY29nbml6ZWQgaW50ZXJuYWwgcGh5IG5vZGVcbiIpOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyb3JfcHV0X2RldmljZTsKKwkJfQorCisJCXBoeS0+aW5pdGlhbGl6ZSA9IChlbWFjX3NnbWlpX2luaXRpYWxpemUpbWF0Y2gtPmRhdGE7CisJfQorCisJLyogQmFzZSBhZGRyZXNzIGlzIHRoZSBmaXJzdCBhZGRyZXNzICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHNnbWlpX3BkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yX3B1dF9kZXZpY2U7CisJfQorCisJcGh5LT5iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghcGh5LT5iYXNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcHV0X2RldmljZTsKKwl9CisKKwkvKiB2MiBTR01JSSBoYXMgYSBwZXItbGFuZSBkaWdpdGFsIGRpZ2l0YWwsIHNvIHBhcnNlIGl0IGlmIGl0IGV4aXN0cyAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShzZ21paV9wZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7CisJaWYgKHJlcykgeworCQlwaHktPmRpZ2l0YWwgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJCWlmICghcGh5LT5kaWdpdGFsKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnJvcl91bm1hcF9iYXNlOworCQl9CisJfQorCisJcmV0ID0gcGh5LT5pbml0aWFsaXplKGFkcHQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBXZSd2ZSByZW1hcHBlZCB0aGUgYWRkcmVzc2VzLCBzbyB3ZSBkb24ndCBuZWVkIHRoZSBkZXZpY2UgYW55CisJICogbW9yZS4gIG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUoKSBzYXlzIHdlIHNob3VsZCByZWxlYXNlIGl0LgorCSAqLworCXB1dF9kZXZpY2UoJnNnbWlpX3BkZXYtPmRldik7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJaWYgKHBoeS0+ZGlnaXRhbCkKKwkJaW91bm1hcChwaHktPmRpZ2l0YWwpOworZXJyb3JfdW5tYXBfYmFzZToKKwlpb3VubWFwKHBoeS0+YmFzZSk7CitlcnJvcl9wdXRfZGV2aWNlOgorCXB1dF9kZXZpY2UoJnNnbWlpX3BkZXYtPmRldik7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLXNnbWlpLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtc2dtaWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTc5MjEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLXNnbWlpLmgKQEAgLTAsMCArMSwyNCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfRU1BQ19TR01JSV9IXworI2RlZmluZSBfRU1BQ19TR01JSV9IXworCitzdHJ1Y3QgZW1hY19hZGFwdGVyOworc3RydWN0IHBsYXRmb3JtX2RldmljZTsKKworaW50IGVtYWNfc2dtaWlfaW5pdF92MShzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KTsKK2ludCBlbWFjX3NnbWlpX2luaXRfdjIoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCk7CitpbnQgZW1hY19zZ21paV9jb25maWcoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCk7Cit2b2lkIGVtYWNfc2dtaWlfcmVzZXQoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmYzYjJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLmMKQEAgLTAsMCArMSw3NTUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qIFF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBFTUFDIEdpZ2FiaXQgRXRoZXJuZXQgRHJpdmVyICovCisKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgImVtYWMuaCIKKyNpbmNsdWRlICJlbWFjLW1hYy5oIgorI2luY2x1ZGUgImVtYWMtcGh5LmgiCisjaW5jbHVkZSAiZW1hYy1zZ21paS5oIgorCisjZGVmaW5lIEVNQUNfTVNHX0RFRkFVTFQgKE5FVElGX01TR19EUlYgfCBORVRJRl9NU0dfUFJPQkUgfCBORVRJRl9NU0dfTElOSyB8ICBcCisJCU5FVElGX01TR19USU1FUiB8IE5FVElGX01TR19JRkRPV04gfCBORVRJRl9NU0dfSUZVUCkKKworI2RlZmluZSBFTUFDX1JSRF9TSVpFCQkJCQkgICAgIDQKKy8qIFRoZSBSUkQgc2l6ZSBpZiB0aW1lc3RhbXBpbmcgaXMgZW5hYmxlZDogKi8KKyNkZWZpbmUgRU1BQ19UU19SUkRfU0laRQkJCQkgICAgIDYKKyNkZWZpbmUgRU1BQ19UUERfU0laRQkJCQkJICAgICA0CisjZGVmaW5lIEVNQUNfUkZEX1NJWkUJCQkJCSAgICAgMgorCisjZGVmaW5lIFJFR19NQUNfUlhfU1RBVFVTX0JJTgkJIEVNQUNfUlhNQUNfU1RBVENfUkVHMAorI2RlZmluZSBSRUdfTUFDX1JYX1NUQVRVU19FTkQJCUVNQUNfUlhNQUNfU1RBVENfUkVHMjIKKyNkZWZpbmUgUkVHX01BQ19UWF9TVEFUVVNfQklOCQkgRU1BQ19UWE1BQ19TVEFUQ19SRUcwCisjZGVmaW5lIFJFR19NQUNfVFhfU1RBVFVTX0VORAkJRU1BQ19UWE1BQ19TVEFUQ19SRUcyNAorCisjZGVmaW5lIFJYUTBfTlVNX1JGRF9QUkVGX0RFRgkJCQkgICAgIDgKKyNkZWZpbmUgVFhRMF9OVU1fVFBEX1BSRUZfREVGCQkJCSAgICAgNQorCisjZGVmaW5lIEVNQUNfUFJFQU1CTEVfREVGCQkJCSAgICAgNworCisjZGVmaW5lIERNQVJfRExZX0NOVF9ERUYJCQkJICAgIDE1CisjZGVmaW5lIERNQVdfRExZX0NOVF9ERUYJCQkJICAgICA0CisKKyNkZWZpbmUgSU1SX05PUk1BTF9NQVNLICAgICAgICAgKFwKKwkJSVNSX0VSUk9SICAgICAgIHxcCisJCUlTUl9HUEhZX0xJTksgICB8XAorCQlJU1JfVFhfUEtUICAgICAgfFwKKwkJR1BIWV9XQUtFVVBfSU5UKQorCisjZGVmaW5lIElNUl9FWFRFTkRFRF9NQVNLICAgICAgIChcCisJCVNXX01BTl9JTlQgICAgICB8XAorCQlJU1JfT1ZFUiAgICAgICAgfFwKKwkJSVNSX0VSUk9SICAgICAgIHxcCisJCUlTUl9HUEhZX0xJTksgICB8XAorCQlJU1JfVFhfUEtUICAgICAgfFwKKwkJR1BIWV9XQUtFVVBfSU5UKQorCisjZGVmaW5lIElTUl9UWF9QS1QgICAgICAoXAorCVRYX1BLVF9JTlQgICAgICB8XAorCVRYX1BLVF9JTlQxICAgICB8XAorCVRYX1BLVF9JTlQyICAgICB8XAorCVRYX1BLVF9JTlQzKQorCisjZGVmaW5lIElTUl9HUEhZX0xJTksgICAgICAgIChcCisJR1BIWV9MSU5LX1VQX0lOVCAgICAgfFwKKwlHUEhZX0xJTktfRE9XTl9JTlQpCisKKyNkZWZpbmUgSVNSX09WRVIgICAgICAgIChcCisJUkZEMF9VUl9JTlQgICAgIHxcCisJUkZEMV9VUl9JTlQgICAgIHxcCisJUkZEMl9VUl9JTlQgICAgIHxcCisJUkZEM19VUl9JTlQgICAgIHxcCisJUkZENF9VUl9JTlQgICAgIHxcCisJUlhGX09GX0lOVCAgICAgIHxcCisJVFhGX1VSX0lOVCkKKworI2RlZmluZSBJU1JfRVJST1IgICAgICAgKFwKKwlETUFSX1RPX0lOVCAgICAgfFwKKwlETUFXX1RPX0lOVCAgICAgfFwKKwlUWFFfVE9fSU5UKQorCisvKiBpbiBzeW5jIHdpdGggZW51bSBlbWFjX2Nsa19pZCAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBlbWFjX2Nsa19uYW1lW10gPSB7CisJImF4aV9jbGsiLCAiY2ZnX2FoYl9jbGsiLCAiaGlnaF9zcGVlZF9jbGsiLCAibWRpb19jbGsiLCAidHhfY2xrIiwKKwkicnhfY2xrIiwgInN5c19jbGsiCit9OworCit2b2lkIGVtYWNfcmVnX3VwZGF0ZTMyKHZvaWQgX19pb21lbSAqYWRkciwgdTMyIG1hc2ssIHUzMiB2YWwpCit7CisJdTMyIGRhdGEgPSByZWFkbChhZGRyKTsKKworCXdyaXRlbCgoKGRhdGEgJiB+bWFzaykgfCB2YWwpLCBhZGRyKTsKK30KKworLyogcmVpbml0aWFsaXplICovCitpbnQgZW1hY19yZWluaXRfbG9ja2VkKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmFkcHQtPnJlc2V0X2xvY2spOworCisJZW1hY19tYWNfZG93bihhZHB0KTsKKwllbWFjX3NnbWlpX3Jlc2V0KGFkcHQpOworCXJldCA9IGVtYWNfbWFjX3VwKGFkcHQpOworCisJbXV0ZXhfdW5sb2NrKCZhZHB0LT5yZXNldF9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIE5BUEkgKi8KK3N0YXRpYyBpbnQgZW1hY19uYXBpX3J0eChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCit7CisJc3RydWN0IGVtYWNfcnhfcXVldWUgKnJ4X3EgPQorCQljb250YWluZXJfb2YobmFwaSwgc3RydWN0IGVtYWNfcnhfcXVldWUsIG5hcGkpOworCXN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQgPSBuZXRkZXZfcHJpdihyeF9xLT5uZXRkZXYpOworCXN0cnVjdCBlbWFjX2lycSAqaXJxID0gcnhfcS0+aXJxOworCWludCB3b3JrX2RvbmUgPSAwOworCisJZW1hY19tYWNfcnhfcHJvY2VzcyhhZHB0LCByeF9xLCAmd29ya19kb25lLCBidWRnZXQpOworCisJaWYgKHdvcmtfZG9uZSA8IGJ1ZGdldCkgeworCQluYXBpX2NvbXBsZXRlKG5hcGkpOworCisJCWlycS0+bWFzayB8PSByeF9xLT5pbnRyOworCQl3cml0ZWwoaXJxLT5tYXNrLCBhZHB0LT5iYXNlICsgRU1BQ19JTlRfTUFTSyk7CisJfQorCisJcmV0dXJuIHdvcmtfZG9uZTsKK30KKworLyogVHJhbnNtaXQgdGhlIHBhY2tldCAqLworc3RhdGljIGludCBlbWFjX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXJldHVybiBlbWFjX21hY190eF9idWZfc2VuZChhZHB0LCAmYWRwdC0+dHhfcSwgc2tiKTsKK30KKworaXJxcmV0dXJuX3QgZW1hY19pc3IoaW50IF9pcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGVtYWNfaXJxICppcnEgPSBkYXRhOworCXN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQgPQorCQljb250YWluZXJfb2YoaXJxLCBzdHJ1Y3QgZW1hY19hZGFwdGVyLCBpcnEpOworCXN0cnVjdCBlbWFjX3J4X3F1ZXVlICpyeF9xID0gJmFkcHQtPnJ4X3E7CisJdTMyIGlzciwgc3RhdHVzOworCisJLyogZGlzYWJsZSB0aGUgaW50ZXJydXB0ICovCisJd3JpdGVsKDAsIGFkcHQtPmJhc2UgKyBFTUFDX0lOVF9NQVNLKTsKKworCWlzciA9IHJlYWRsX3JlbGF4ZWQoYWRwdC0+YmFzZSArIEVNQUNfSU5UX1NUQVRVUyk7CisKKwlzdGF0dXMgPSBpc3IgJiBpcnEtPm1hc2s7CisJaWYgKHN0YXR1cyA9PSAwKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAoc3RhdHVzICYgSVNSX0VSUk9SKSB7CisJCW5ldGlmX3dhcm4oYWRwdCwgIGludHIsIGFkcHQtPm5ldGRldiwKKwkJCSAgICJ3YXJuaW5nOiBlcnJvciBpcnEgc3RhdHVzIDB4JWx4XG4iLAorCQkJICAgc3RhdHVzICYgSVNSX0VSUk9SKTsKKwkJLyogcmVzZXQgTUFDICovCisJCXNjaGVkdWxlX3dvcmsoJmFkcHQtPndvcmtfdGhyZWFkKTsKKwl9CisKKwkvKiBTY2hlZHVsZSB0aGUgbmFwaSBmb3IgcmVjZWl2ZSBxdWV1ZSB3aXRoIGludGVycnVwdAorCSAqIHN0YXR1cyBiaXQgc2V0CisJICovCisJaWYgKHN0YXR1cyAmIHJ4X3EtPmludHIpIHsKKwkJaWYgKG5hcGlfc2NoZWR1bGVfcHJlcCgmcnhfcS0+bmFwaSkpIHsKKwkJCWlycS0+bWFzayAmPSB+cnhfcS0+aW50cjsKKwkJCV9fbmFwaV9zY2hlZHVsZSgmcnhfcS0+bmFwaSk7CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzICYgVFhfUEtUX0lOVCkKKwkJZW1hY19tYWNfdHhfcHJvY2VzcyhhZHB0LCAmYWRwdC0+dHhfcSk7CisKKwlpZiAoc3RhdHVzICYgSVNSX09WRVIpCisJCW5ldF93YXJuX3JhdGVsaW1pdGVkKCJ3YXJuaW5nOiBUWC9SWCBvdmVyZmxvd1xuIik7CisKKwkvKiBsaW5rIGV2ZW50ICovCisJaWYgKHN0YXR1cyAmIElTUl9HUEhZX0xJTkspCisJCXBoeV9tYWNfaW50ZXJydXB0KGFkcHQtPnBoeWRldiwgISEoc3RhdHVzICYgR1BIWV9MSU5LX1VQX0lOVCkpOworCitleGl0OgorCS8qIGVuYWJsZSB0aGUgaW50ZXJydXB0ICovCisJd3JpdGVsKGlycS0+bWFzaywgYWRwdC0+YmFzZSArIEVNQUNfSU5UX01BU0spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBDb25maWd1cmUgVkxBTiB0YWcgc3RyaXAvaW5zZXJ0IGZlYXR1cmUgKi8KK3N0YXRpYyBpbnQgZW1hY19zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCit7CisJbmV0ZGV2X2ZlYXR1cmVzX3QgY2hhbmdlZCA9IGZlYXR1cmVzIF4gbmV0ZGV2LT5mZWF0dXJlczsKKwlzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCS8qIFdlIG9ubHkgbmVlZCB0byByZXByb2dyYW0gdGhlIGhhcmR3YXJlIGlmIHRoZSBWTEFOIHRhZyBmZWF0dXJlcworCSAqIGhhdmUgY2hhbmdlZCwgYW5kIGlmIGl0J3MgYWxyZWFkeSBydW5uaW5nLgorCSAqLworCWlmICghKGNoYW5nZWQgJiAoTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfCBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWCkpKQorCQlyZXR1cm4gMDsKKworCWlmICghbmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlyZXR1cm4gMDsKKworCS8qIGVtYWNfbWFjX21vZGVfY29uZmlnKCkgdXNlcyBuZXRkZXYtPmZlYXR1cmVzIHRvIGNvbmZpZ3VyZSB0aGUgRU1BQywKKwkgKiBzbyBtYWtlIHN1cmUgaXQncyBzZXQgZmlyc3QuCisJICovCisJbmV0ZGV2LT5mZWF0dXJlcyA9IGZlYXR1cmVzOworCisJcmV0dXJuIGVtYWNfcmVpbml0X2xvY2tlZChhZHB0KTsKK30KKworLyogQ29uZmlndXJlIE11bHRpY2FzdCBhbmQgUHJvbWlzY3VvdXMgbW9kZXMgKi8KK3N0YXRpYyB2b2lkIGVtYWNfcnhfbW9kZV9zZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOworCisJZW1hY19tYWNfbW9kZV9jb25maWcoYWRwdCk7CisKKwkvKiB1cGRhdGUgbXVsdGljYXN0IGFkZHJlc3MgZmlsdGVyaW5nICovCisJZW1hY19tYWNfbXVsdGljYXN0X2FkZHJfY2xlYXIoYWRwdCk7CisJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIG5ldGRldikKKwkJZW1hY19tYWNfbXVsdGljYXN0X2FkZHJfc2V0KGFkcHQsIGhhLT5hZGRyKTsKK30KKworLyogQ2hhbmdlIHRoZSBNYXhpbXVtIFRyYW5zZmVyIFVuaXQgKE1UVSkgKi8KK3N0YXRpYyBpbnQgZW1hY19jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBuZXdfbXR1KQoreworCXVuc2lnbmVkIGludCBtYXhfZnJhbWUgPSBuZXdfbXR1ICsgRVRIX0hMRU4gKyBFVEhfRkNTX0xFTiArIFZMQU5fSExFTjsKKwlzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWlmICgobWF4X2ZyYW1lIDwgRU1BQ19NSU5fRVRIX0ZSQU1FX1NJWkUpIHx8CisJICAgIChtYXhfZnJhbWUgPiBFTUFDX01BWF9FVEhfRlJBTUVfU0laRSkpIHsKKwkJbmV0ZGV2X2VycihhZHB0LT5uZXRkZXYsICJlcnJvcjogaW52YWxpZCBNVFUgc2V0dGluZ1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW5ldGlmX2luZm8oYWRwdCwgaHcsIGFkcHQtPm5ldGRldiwKKwkJICAgImNoYW5naW5nIE1UVSBmcm9tICVkIHRvICVkXG4iLCBuZXRkZXYtPm10dSwKKwkJICAgbmV3X210dSk7CisJbmV0ZGV2LT5tdHUgPSBuZXdfbXR1OworCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJcmV0dXJuIGVtYWNfcmVpbml0X2xvY2tlZChhZHB0KTsKKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2hlbiB0aGUgbmV0d29yayBpbnRlcmZhY2UgaXMgbWFkZSBhY3RpdmUgKi8KK3N0YXRpYyBpbnQgZW1hY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IHJldDsKKworCS8qIGFsbG9jYXRlIHJ4L3R4IGRtYSBidWZmZXIgJiBkZXNjcmlwdG9ycyAqLworCXJldCA9IGVtYWNfbWFjX3J4X3R4X3JpbmdzX2FsbG9jX2FsbChhZHB0KTsKKwlpZiAocmV0KSB7CisJCW5ldGRldl9lcnIoYWRwdC0+bmV0ZGV2LCAiZXJyb3IgYWxsb2NhdGluZyByeC90eCByaW5nc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZW1hY19tYWNfdXAoYWRwdCk7CisJaWYgKHJldCkgeworCQllbWFjX21hY19yeF90eF9yaW5nc19mcmVlX2FsbChhZHB0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwllbWFjX21hY19zdGFydChhZHB0KTsKKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2hlbiB0aGUgbmV0d29yayBpbnRlcmZhY2UgaXMgZGlzYWJsZWQgKi8KK3N0YXRpYyBpbnQgZW1hY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJbXV0ZXhfbG9jaygmYWRwdC0+cmVzZXRfbG9jayk7CisKKwllbWFjX21hY19kb3duKGFkcHQpOworCWVtYWNfbWFjX3J4X3R4X3JpbmdzX2ZyZWVfYWxsKGFkcHQpOworCisJbXV0ZXhfdW5sb2NrKCZhZHB0LT5yZXNldF9sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKiBSZXNwb25kIHRvIGEgVFggaGFuZyAqLworc3RhdGljIHZvaWQgZW1hY190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlzY2hlZHVsZV93b3JrKCZhZHB0LT53b3JrX3RocmVhZCk7Cit9CisKKy8qIElPQ1RMIHN1cHBvcnQgZm9yIHRoZSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQgZW1hY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIW5ldGRldi0+cGh5ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBwaHlfbWlpX2lvY3RsKG5ldGRldi0+cGh5ZGV2LCBpZnIsIGNtZCk7Cit9CisKKy8qIFByb3ZpZGUgbmV0d29yayBzdGF0aXN0aWNzIGluZm8gZm9yIHRoZSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKmVtYWNfZ2V0X3N0YXRzNjQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkJCSAgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpuZXRfc3RhdHMpCit7CisJc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdW5zaWduZWQgaW50IGFkZHIgPSBSRUdfTUFDX1JYX1NUQVRVU19CSU47CisJc3RydWN0IGVtYWNfc3RhdHMgKnN0YXRzID0gJmFkcHQtPnN0YXRzOworCXU2NCAqc3RhdHNfaXRyID0gJmFkcHQtPnN0YXRzLnJ4X29rOworCXUzMiB2YWw7CisKKwlzcGluX2xvY2soJnN0YXRzLT5sb2NrKTsKKworCXdoaWxlIChhZGRyIDw9IFJFR19NQUNfUlhfU1RBVFVTX0VORCkgeworCQl2YWwgPSByZWFkbF9yZWxheGVkKGFkcHQtPmJhc2UgKyBhZGRyKTsKKwkJKnN0YXRzX2l0ciArPSB2YWw7CisJCXN0YXRzX2l0cisrOworCQlhZGRyICs9IHNpemVvZih1MzIpOworCX0KKworCS8qIGFkZGl0aW9uYWwgcnggc3RhdHVzICovCisJdmFsID0gcmVhZGxfcmVsYXhlZChhZHB0LT5iYXNlICsgRU1BQ19SWE1BQ19TVEFUQ19SRUcyMyk7CisJYWRwdC0+c3RhdHMucnhfY3JjX2FsaWduICs9IHZhbDsKKwl2YWwgPSByZWFkbF9yZWxheGVkKGFkcHQtPmJhc2UgKyBFTUFDX1JYTUFDX1NUQVRDX1JFRzI0KTsKKwlhZHB0LT5zdGF0cy5yeF9qYWJiZXJzICs9IHZhbDsKKworCS8qIHVwZGF0ZSB0eCBzdGF0dXMgKi8KKwlhZGRyID0gUkVHX01BQ19UWF9TVEFUVVNfQklOOworCXN0YXRzX2l0ciA9ICZhZHB0LT5zdGF0cy50eF9vazsKKworCXdoaWxlIChhZGRyIDw9IFJFR19NQUNfVFhfU1RBVFVTX0VORCkgeworCQl2YWwgPSByZWFkbF9yZWxheGVkKGFkcHQtPmJhc2UgKyBhZGRyKTsKKwkJKnN0YXRzX2l0ciArPSB2YWw7CisJCSsrc3RhdHNfaXRyOworCQlhZGRyICs9IHNpemVvZih1MzIpOworCX0KKworCS8qIGFkZGl0aW9uYWwgdHggc3RhdHVzICovCisJdmFsID0gcmVhZGxfcmVsYXhlZChhZHB0LT5iYXNlICsgRU1BQ19UWE1BQ19TVEFUQ19SRUcyNSk7CisJYWRwdC0+c3RhdHMudHhfY29sICs9IHZhbDsKKworCS8qIHJldHVybiBwYXJzZWQgc3RhdGlzdGljcyAqLworCW5ldF9zdGF0cy0+cnhfcGFja2V0cyA9IHN0YXRzLT5yeF9vazsKKwluZXRfc3RhdHMtPnR4X3BhY2tldHMgPSBzdGF0cy0+dHhfb2s7CisJbmV0X3N0YXRzLT5yeF9ieXRlcyA9IHN0YXRzLT5yeF9ieXRlX2NudDsKKwluZXRfc3RhdHMtPnR4X2J5dGVzID0gc3RhdHMtPnR4X2J5dGVfY250OworCW5ldF9zdGF0cy0+bXVsdGljYXN0ID0gc3RhdHMtPnJ4X21jYXN0OworCW5ldF9zdGF0cy0+Y29sbGlzaW9ucyA9IHN0YXRzLT50eF8xX2NvbCArIHN0YXRzLT50eF8yX2NvbCAqIDIgKworCQkJCXN0YXRzLT50eF9sYXRlX2NvbCArIHN0YXRzLT50eF9hYm9ydF9jb2w7CisKKwluZXRfc3RhdHMtPnJ4X2Vycm9ycyA9IHN0YXRzLT5yeF9mcmFnICsgc3RhdHMtPnJ4X2Zjc19lcnIgKworCQkJICAgICAgIHN0YXRzLT5yeF9sZW5fZXJyICsgc3RhdHMtPnJ4X3N6X292ICsKKwkJCSAgICAgICBzdGF0cy0+cnhfYWxpZ25fZXJyOworCW5ldF9zdGF0cy0+cnhfZmlmb19lcnJvcnMgPSBzdGF0cy0+cnhfcnhmX292OworCW5ldF9zdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyA9IHN0YXRzLT5yeF9sZW5fZXJyOworCW5ldF9zdGF0cy0+cnhfY3JjX2Vycm9ycyA9IHN0YXRzLT5yeF9mY3NfZXJyOworCW5ldF9zdGF0cy0+cnhfZnJhbWVfZXJyb3JzID0gc3RhdHMtPnJ4X2FsaWduX2VycjsKKwluZXRfc3RhdHMtPnJ4X292ZXJfZXJyb3JzID0gc3RhdHMtPnJ4X3J4Zl9vdjsKKwluZXRfc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnMgPSBzdGF0cy0+cnhfcnhmX292OworCisJbmV0X3N0YXRzLT50eF9lcnJvcnMgPSBzdGF0cy0+dHhfbGF0ZV9jb2wgKyBzdGF0cy0+dHhfYWJvcnRfY29sICsKKwkJCSAgICAgICBzdGF0cy0+dHhfdW5kZXJydW4gKyBzdGF0cy0+dHhfdHJ1bmM7CisJbmV0X3N0YXRzLT50eF9maWZvX2Vycm9ycyA9IHN0YXRzLT50eF91bmRlcnJ1bjsKKwluZXRfc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzID0gc3RhdHMtPnR4X2Fib3J0X2NvbDsKKwluZXRfc3RhdHMtPnR4X3dpbmRvd19lcnJvcnMgPSBzdGF0cy0+dHhfbGF0ZV9jb2w7CisKKwlzcGluX3VubG9jaygmc3RhdHMtPmxvY2spOworCisJcmV0dXJuIG5ldF9zdGF0czsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBlbWFjX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IGVtYWNfb3BlbiwKKwkubmRvX3N0b3AJCT0gZW1hY19jbG9zZSwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3N0YXJ0X3htaXQJCT0gZW1hY19zdGFydF94bWl0LAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAorCS5uZG9fY2hhbmdlX210dQkJPSBlbWFjX2NoYW5nZV9tdHUsCisJLm5kb19kb19pb2N0bAkJPSBlbWFjX2lvY3RsLAorCS5uZG9fdHhfdGltZW91dAkJPSBlbWFjX3R4X3RpbWVvdXQsCisJLm5kb19nZXRfc3RhdHM2NAk9IGVtYWNfZ2V0X3N0YXRzNjQsCisJLm5kb19zZXRfZmVhdHVyZXMgICAgICAgPSBlbWFjX3NldF9mZWF0dXJlcywKKwkubmRvX3NldF9yeF9tb2RlICAgICAgICA9IGVtYWNfcnhfbW9kZV9zZXQsCit9OworCisvKiBXYXRjaGRvZyB0YXNrIHJvdXRpbmUsIGNhbGxlZCB0byByZWluaXRpYWxpemUgdGhlIEVNQUMgKi8KK3N0YXRpYyB2b2lkIGVtYWNfd29ya190aHJlYWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGVtYWNfYWRhcHRlciwgd29ya190aHJlYWQpOworCisJZW1hY19yZWluaXRfbG9ja2VkKGFkcHQpOworfQorCisvKiBJbml0aWFsaXplIHZhcmlvdXMgZGF0YSBzdHJ1Y3R1cmVzICAqLworc3RhdGljIHZvaWQgZW1hY19pbml0X2FkYXB0ZXIoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwl1MzIgcmVnOworCisJLyogZGVzY3JpcHRvcnMgKi8KKwlhZHB0LT50eF9kZXNjX2NudCA9IEVNQUNfREVGX1RYX0RFU0NTOworCWFkcHQtPnJ4X2Rlc2NfY250ID0gRU1BQ19ERUZfUlhfREVTQ1M7CisKKwkvKiBkbWEgKi8KKwlhZHB0LT5kbWFfb3JkZXIgPSBlbWFjX2RtYV9vcmRfb3V0OworCWFkcHQtPmRtYXJfYmxvY2sgPSBlbWFjX2RtYV9yZXFfNDA5NjsKKwlhZHB0LT5kbWF3X2Jsb2NrID0gZW1hY19kbWFfcmVxXzEyODsKKwlhZHB0LT5kbWFyX2RseV9jbnQgPSBETUFSX0RMWV9DTlRfREVGOworCWFkcHQtPmRtYXdfZGx5X2NudCA9IERNQVdfRExZX0NOVF9ERUY7CisJYWRwdC0+dHBkX2J1cnN0ID0gVFhRMF9OVU1fVFBEX1BSRUZfREVGOworCWFkcHQtPnJmZF9idXJzdCA9IFJYUTBfTlVNX1JGRF9QUkVGX0RFRjsKKworCS8qIGlycSBtb2RlcmF0b3IgKi8KKwlyZWcgPSAoKEVNQUNfREVGX1JYX0lSUV9NT0QgPj4gMSkgPDwgSVJRX01PREVSQVRPUjJfSU5JVF9TSEZUKSB8CisJICAgICAgKChFTUFDX0RFRl9UWF9JUlFfTU9EID4+IDEpIDw8IElSUV9NT0RFUkFUT1JfSU5JVF9TSEZUKTsKKwlhZHB0LT5pcnFfbW9kID0gcmVnOworCisJLyogb3RoZXJzICovCisJYWRwdC0+cHJlYW1ibGUgPSBFTUFDX1BSRUFNQkxFX0RFRjsKK30KKworLyogR2V0IHRoZSBjbG9jayAqLworc3RhdGljIGludCBlbWFjX2Nsa3NfZ2V0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkgc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBFTUFDX0NMS19DTlQ7IGkrKykgeworCQlzdHJ1Y3QgY2xrICpjbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgZW1hY19jbGtfbmFtZVtpXSk7CisKKwkJaWYgKElTX0VSUihjbGspKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJImNvdWxkIG5vdCBjbGFpbSBjbG9jayAlcyAoZXJyb3I9JWxpKVxuIiwKKwkJCQllbWFjX2Nsa19uYW1lW2ldLCBQVFJfRVJSKGNsaykpOworCisJCQlyZXR1cm4gUFRSX0VSUihjbGspOworCQl9CisKKwkJYWRwdC0+Y2xrW2ldID0gY2xrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBJbml0aWFsaXplIGNsb2NrcyAqLworc3RhdGljIGludCBlbWFjX2Nsa3NfcGhhc2UxX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZW1hY19jbGtzX2dldChwZGV2LCBhZHB0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGFkcHQtPmNsa1tFTUFDX0NMS19BWEldKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGFkcHQtPmNsa1tFTUFDX0NMS19DRkdfQUhCXSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNsa19zZXRfcmF0ZShhZHB0LT5jbGtbRU1BQ19DTEtfSElHSF9TUEVFRF0sIDE5MjAwMDAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGNsa19wcmVwYXJlX2VuYWJsZShhZHB0LT5jbGtbRU1BQ19DTEtfSElHSF9TUEVFRF0pOworfQorCisvKiBFbmFibGUgY2xvY2tzOyBuZWVkcyBlbWFjX2Nsa3NfcGhhc2UxX2luaXQgdG8gYmUgY2FsbGVkIGJlZm9yZSAqLworc3RhdGljIGludCBlbWFjX2Nsa3NfcGhhc2UyX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gY2xrX3NldF9yYXRlKGFkcHQtPmNsa1tFTUFDX0NMS19UWF0sIDEyNTAwMDAwMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShhZHB0LT5jbGtbRU1BQ19DTEtfVFhdKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2xrX3NldF9yYXRlKGFkcHQtPmNsa1tFTUFDX0NMS19ISUdIX1NQRUVEXSwgMTI1MDAwMDAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2xrX3NldF9yYXRlKGFkcHQtPmNsa1tFTUFDX0NMS19NRElPXSwgMjUwMDAwMDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoYWRwdC0+Y2xrW0VNQUNfQ0xLX01ESU9dKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGFkcHQtPmNsa1tFTUFDX0NMS19SWF0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY2xrX3ByZXBhcmVfZW5hYmxlKGFkcHQtPmNsa1tFTUFDX0NMS19TWVNdKTsKK30KKworc3RhdGljIHZvaWQgZW1hY19jbGtzX3RlYXJkb3duKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBFTUFDX0NMS19DTlQ7IGkrKykKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFkcHQtPmNsa1tpXSk7Cit9CisKKy8qIEdldCB0aGUgcmVzb3VyY2VzICovCitzdGF0aWMgaW50IGVtYWNfcHJvYmVfcmVzb3VyY2VzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRwdC0+bmV0ZGV2OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWNoYXIgbWFkZHJbRVRIX0FMRU5dOworCWludCByZXQgPSAwOworCisJLyogZ2V0IG1hYyBhZGRyZXNzICovCisJaWYgKGRldmljZV9nZXRfbWFjX2FkZHJlc3MoJnBkZXYtPmRldiwgbWFkZHIsIEVUSF9BTEVOKSkKKwkJZXRoZXJfYWRkcl9jb3B5KG5ldGRldi0+ZGV2X2FkZHIsIG1hZGRyKTsKKwllbHNlCisJCWV0aF9od19hZGRyX3JhbmRvbShuZXRkZXYpOworCisJLyogQ29yZSAwIGludGVycnVwdCAqLworCXJldCA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJImVycm9yOiBtaXNzaW5nIGNvcmUwIGlycSByZXNvdXJjZSAoZXJyb3I9JWkpXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlhZHB0LT5pcnEuaXJxID0gcmV0OworCisJLyogYmFzZSByZWdpc3RlciBhZGRyZXNzICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlhZHB0LT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihhZHB0LT5iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoYWRwdC0+YmFzZSk7CisKKwkvKiBDU1IgcmVnaXN0ZXIgYWRkcmVzcyAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7CisJYWRwdC0+Y3NyID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihhZHB0LT5jc3IpKQorCQlyZXR1cm4gUFRSX0VSUihhZHB0LT5jc3IpOworCisJbmV0ZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZylhZHB0LT5iYXNlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGVtYWNfZHRfbWF0Y2hbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gInFjb20sZnNtOTkwMC1lbWFjIiwKKwl9LAorCXt9Cit9OworCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQUNQSSkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgZW1hY19hY3BpX21hdGNoW10gPSB7CisJeworCQkuaWQgPSAiUUNPTTgwNzAiLAorCX0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIGVtYWNfYWNwaV9tYXRjaCk7CisjZW5kaWYKKworc3RhdGljIGludCBlbWFjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0OworCXN0cnVjdCBlbWFjX3BoeSAqcGh5OworCXUxNiBkZXZpZCwgcmV2aWQ7CisJdTMyIHJlZzsKKwlpbnQgcmV0OworCisJLyogVGhlIEVNQUMgaXRzZWxmIGlzIGNhcGFibGUgb2YgNjQtYml0IERNQSwgc28gdHJ5IHRoYXQgZmlyc3QuICovCisJcmV0ID0gZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVudCgmcGRldi0+ZGV2LCBETUFfQklUX01BU0soNjQpKTsKKwlpZiAocmV0KSB7CisJCS8qIFNvbWUgcGxhdGZvcm1zIG1heSByZXN0cmljdCB0aGUgRU1BQydzIGFkZHJlc3MgYnVzIHRvIGxlc3MKKwkJICogdGhlbiB0aGUgc2l6ZSBvZiBERFIuIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byB0cnkgYQorCQkgKiBzbWFsbGVyIG1hc2suICBXZSBjb3VsZCB0cnkgZXZlcnkgcG9zc2libGUgc21hbGxlciBtYXNrLAorCQkgKiBidXQgdGhhdCdzIG92ZXJraWxsLiAgSW5zdGVhZCwganVzdCBmYWxsIHRvIDMyLWJpdCwgd2hpY2gKKwkJICogc2hvdWxkIGFsd2F5cyB3b3JrLgorCQkgKi8KKwkJcmV0ID0gZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVudCgmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IHNldCBETUEgbWFza1xuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBlbWFjX2FkYXB0ZXIpKTsKKwlpZiAoIW5ldGRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgbmV0ZGV2KTsKKwlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZwZGV2LT5kZXYpOworCisJYWRwdCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJYWRwdC0+bmV0ZGV2ID0gbmV0ZGV2OworCWFkcHQtPm1zZ19lbmFibGUgPSBFTUFDX01TR19ERUZBVUxUOworCisJcGh5ID0gJmFkcHQtPnBoeTsKKworCW11dGV4X2luaXQoJmFkcHQtPnJlc2V0X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZhZHB0LT5zdGF0cy5sb2NrKTsKKworCWFkcHQtPmlycS5tYXNrID0gUlhfUEtUX0lOVDAgfCBJTVJfTk9STUFMX01BU0s7CisKKwlyZXQgPSBlbWFjX3Byb2JlX3Jlc291cmNlcyhwZGV2LCBhZHB0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl91bmRvX25ldGRldjsKKworCS8qIGluaXRpYWxpemUgY2xvY2tzICovCisJcmV0ID0gZW1hY19jbGtzX3BoYXNlMV9pbml0KHBkZXYsIGFkcHQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGluaXRpYWxpemUgY2xvY2tzXG4iKTsKKwkJZ290byBlcnJfdW5kb19uZXRkZXY7CisJfQorCisJbmV0ZGV2LT53YXRjaGRvZ190aW1lbyA9IEVNQUNfV0FUQ0hET0dfVElNRTsKKwluZXRkZXYtPmlycSA9IGFkcHQtPmlycS5pcnE7CisKKwlhZHB0LT5ycmRfc2l6ZSA9IEVNQUNfUlJEX1NJWkU7CisJYWRwdC0+dHBkX3NpemUgPSBFTUFDX1RQRF9TSVpFOworCWFkcHQtPnJmZF9zaXplID0gRU1BQ19SRkRfU0laRTsKKworCW5ldGRldi0+bmV0ZGV2X29wcyA9ICZlbWFjX25ldGRldl9vcHM7CisKKwllbWFjX2luaXRfYWRhcHRlcihhZHB0KTsKKworCS8qIGluaXQgZXh0ZXJuYWwgcGh5ICovCisJcmV0ID0gZW1hY19waHlfY29uZmlnKHBkZXYsIGFkcHQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3VuZG9fY2xvY2tzOworCisJLyogaW5pdCBpbnRlcm5hbCBzZ21paSBwaHkgKi8KKwlyZXQgPSBlbWFjX3NnbWlpX2NvbmZpZyhwZGV2LCBhZHB0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl91bmRvX21kaW9idXM7CisKKwkvKiBlbmFibGUgY2xvY2tzICovCisJcmV0ID0gZW1hY19jbGtzX3BoYXNlMl9pbml0KHBkZXYsIGFkcHQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGluaXRpYWxpemUgY2xvY2tzXG4iKTsKKwkJZ290byBlcnJfdW5kb19tZGlvYnVzOworCX0KKworCWVtYWNfbWFjX3Jlc2V0KGFkcHQpOworCisJLyogc2V0IGh3IGZlYXR1cmVzICovCisJbmV0ZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0hXX0NTVU0gfCBORVRJRl9GX1JYQ1NVTSB8CisJCQlORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPNiB8IE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYIHwKKwkJCU5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYOworCW5ldGRldi0+aHdfZmVhdHVyZXMgPSBuZXRkZXYtPmZlYXR1cmVzOworCisJbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0hXX0NTVU0gfAorCQkJCSBORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPNjsKKworCUlOSVRfV09SSygmYWRwdC0+d29ya190aHJlYWQsIGVtYWNfd29ya190aHJlYWQpOworCisJLyogSW5pdGlhbGl6ZSBxdWV1ZXMgKi8KKwllbWFjX21hY19yeF90eF9yaW5nX2luaXRfYWxsKHBkZXYsIGFkcHQpOworCisJbmV0aWZfbmFwaV9hZGQobmV0ZGV2LCAmYWRwdC0+cnhfcS5uYXBpLCBlbWFjX25hcGlfcnR4LAorCQkgICAgICAgTkFQSV9QT0xMX1dFSUdIVCk7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCByZWdpc3RlciBuZXQgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfdW5kb19uYXBpOworCX0KKworCXJlZyA9ICByZWFkbF9yZWxheGVkKGFkcHQtPmJhc2UgKyBFTUFDX0RNQV9NQVNfQ1RSTCk7CisJZGV2aWQgPSAocmVnICYgREVWX0lEX05VTV9CTVNLKSAgPj4gREVWX0lEX05VTV9TSEZUOworCXJldmlkID0gKHJlZyAmIERFVl9SRVZfTlVNX0JNU0spID4+IERFVl9SRVZfTlVNX1NIRlQ7CisJcmVnID0gcmVhZGxfcmVsYXhlZChhZHB0LT5iYXNlICsgRU1BQ19DT1JFX0hXX1ZFUlNJT04pOworCisJbmV0aWZfaW5mbyhhZHB0LCBwcm9iZSwgbmV0ZGV2LAorCQkgICAiaGFyZHdhcmUgaWQgJWQuJWQsIGhhcmR3YXJlIHZlcnNpb24gJWQuJWQuJWRcbiIsCisJCSAgIGRldmlkLCByZXZpZCwKKwkJICAgKHJlZyAmIE1BSk9SX0JNU0spID4+IE1BSk9SX1NIRlQsCisJCSAgIChyZWcgJiBNSU5PUl9CTVNLKSA+PiBNSU5PUl9TSEZULAorCQkgICAocmVnICYgU1RFUF9CTVNLKSAgPj4gU1RFUF9TSEZUKTsKKworCXJldHVybiAwOworCitlcnJfdW5kb19uYXBpOgorCW5ldGlmX25hcGlfZGVsKCZhZHB0LT5yeF9xLm5hcGkpOworZXJyX3VuZG9fbWRpb2J1czoKKwltZGlvYnVzX3VucmVnaXN0ZXIoYWRwdC0+bWlpX2J1cyk7CitlcnJfdW5kb19jbG9ja3M6CisJZW1hY19jbGtzX3RlYXJkb3duKGFkcHQpOworZXJyX3VuZG9fbmV0ZGV2OgorCWZyZWVfbmV0ZGV2KG5ldGRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVtYWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisJbmV0aWZfbmFwaV9kZWwoJmFkcHQtPnJ4X3EubmFwaSk7CisKKwllbWFjX2Nsa3NfdGVhcmRvd24oYWRwdCk7CisKKwltZGlvYnVzX3VucmVnaXN0ZXIoYWRwdC0+bWlpX2J1cyk7CisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKKworCWlmIChhZHB0LT5waHkuZGlnaXRhbCkKKwkJaW91bm1hcChhZHB0LT5waHkuZGlnaXRhbCk7CisJaW91bm1hcChhZHB0LT5waHkuYmFzZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZW1hY19wbGF0Zm9ybV9kcml2ZXIgPSB7CisJLnByb2JlCT0gZW1hY19wcm9iZSwKKwkucmVtb3ZlCT0gZW1hY19yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJCT0gInFjb20tZW1hYyIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGVtYWNfZHRfbWF0Y2gsCisJCS5hY3BpX21hdGNoX3RhYmxlID0gQUNQSV9QVFIoZW1hY19hY3BpX21hdGNoKSwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihlbWFjX3BsYXRmb3JtX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cWNvbS1lbWFjIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNzZlNmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMuaApAQCAtMCwwICsxLDMzNSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfRU1BQ19IXworI2RlZmluZSBfRU1BQ19IXworCisjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSAiZW1hYy1tYWMuaCIKKyNpbmNsdWRlICJlbWFjLXBoeS5oIgorCisvKiBFTUFDIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBFTUFDX0RNQV9NQVNfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTQwMAorI2RlZmluZSBFTUFDX0lSUV9NT0RfVElNX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTQwOAorI2RlZmluZSBFTUFDX0JMS19JRExFX1NUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTQwYworI2RlZmluZSBFTUFDX1BIWV9MSU5LX0RFTEFZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTQxYworI2RlZmluZSBFTUFDX1NZU19BTElWX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTQzNAorI2RlZmluZSBFTUFDX01BQ19JUEdJRkdfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTQ4NAorI2RlZmluZSBFTUFDX01BQ19TVEFfQUREUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTQ4OAorI2RlZmluZSBFTUFDX01BQ19TVEFfQUREUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTQ4YworI2RlZmluZSBFTUFDX0hBU0hfVEFCX1JFRzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTQ5MAorI2RlZmluZSBFTUFDX0hBU0hfVEFCX1JFRzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTQ5NAorI2RlZmluZSBFTUFDX01BQ19IQUxGX0RQTFhfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTQ5OAorI2RlZmluZSBFTUFDX01BWF9GUkFNX0xFTl9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTQ5YworI2RlZmluZSBFTUFDX0lOVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTYwMAorI2RlZmluZSBFTUFDX0lOVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTYwNAorI2RlZmluZSBFTUFDX1JYTUFDX1NUQVRDX1JFRzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTcwMAorI2RlZmluZSBFTUFDX1JYTUFDX1NUQVRDX1JFRzIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTc1OAorI2RlZmluZSBFTUFDX1RYTUFDX1NUQVRDX1JFRzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTc2MAorI2RlZmluZSBFTUFDX1RYTUFDX1NUQVRDX1JFRzI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTdjMAorI2RlZmluZSBFTUFDX0NPUkVfSFdfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTk3NAorI2RlZmluZSBFTUFDX0lEVF9UQUJMRTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMWIwMAorI2RlZmluZSBFTUFDX1JYTUFDX1NUQVRDX1JFRzIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMWJjOAorI2RlZmluZSBFTUFDX1JYTUFDX1NUQVRDX1JFRzI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMWJjYworI2RlZmluZSBFTUFDX1RYTUFDX1NUQVRDX1JFRzI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMWJkMAorI2RlZmluZSBFTUFDX0lOVDFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMWJmMAorI2RlZmluZSBFTUFDX0lOVDFfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMWJmNAorI2RlZmluZSBFTUFDX0lOVDJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMWJmOAorI2RlZmluZSBFTUFDX0lOVDJfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMWJmYworI2RlZmluZSBFTUFDX0lOVDNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMWMwMAorI2RlZmluZSBFTUFDX0lOVDNfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMWMwNAorCisvKiBFTUFDX0RNQV9NQVNfQ1RSTCAqLworI2RlZmluZSBERVZfSURfTlVNX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZjAwMDAwMAorI2RlZmluZSBERVZfSURfTlVNX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBERVZfUkVWX05VTV9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmMDAwMAorI2RlZmluZSBERVZfUkVWX05VTV9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBJTlRfUkRfQ0xSX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBJUlFfTU9ERVJBVE9SMl9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMAorI2RlZmluZSBJUlFfTU9ERVJBVE9SX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMAorI2RlZmluZSBMUFdfQ0xLX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBMUFdfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBMUFdfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBTT0ZUX1JTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorCisvKiBFTUFDX0lSUV9NT0RfVElNX0lOSVQgKi8KKyNkZWZpbmUgSVJRX01PREVSQVRPUjJfSU5JVF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgSVJRX01PREVSQVRPUjJfSU5JVF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgSVJRX01PREVSQVRPUl9JTklUX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKKyNkZWZpbmUgSVJRX01PREVSQVRPUl9JTklUX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRU1BQ19JTlRfU1RBVFVTICovCisjZGVmaW5lIERJU19JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMzEpCisjZGVmaW5lIFBUUF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMzApCisjZGVmaW5lIFJGRDRfVVJfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMjkpCisjZGVmaW5lIFRYX1BLVF9JTlQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMjYpCisjZGVmaW5lIFRYX1BLVF9JTlQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMjUpCisjZGVmaW5lIFRYX1BLVF9JTlQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMjQpCisjZGVmaW5lIFJYX1BLVF9JTlQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMTkpCisjZGVmaW5lIFJYX1BLVF9JTlQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMTgpCisjZGVmaW5lIFJYX1BLVF9JTlQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMTcpCisjZGVmaW5lIFJYX1BLVF9JTlQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMTYpCisjZGVmaW5lIFRYX1BLVF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMTUpCisjZGVmaW5lIFRYUV9UT19JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMTQpCisjZGVmaW5lIEdQSFlfV0FLRVVQX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMTMpCisjZGVmaW5lIEdQSFlfTElOS19ET1dOX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMTIpCisjZGVmaW5lIEdQSFlfTElOS19VUF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMTEpCisjZGVmaW5lIERNQVdfVE9fSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMTApCisjZGVmaW5lIERNQVJfVE9fSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDkpCisjZGVmaW5lIFRYRl9VUl9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDgpCisjZGVmaW5lIFJGRDNfVVJfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIFJGRDJfVVJfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDYpCisjZGVmaW5lIFJGRDFfVVJfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDUpCisjZGVmaW5lIFJGRDBfVVJfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDQpCisjZGVmaW5lIFJYRl9PRl9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDMpCisjZGVmaW5lIFNXX01BTl9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDIpCisKKy8qIEVNQUNfTUFJTEJPWF82ICovCisjZGVmaW5lIFJGRDJfUFJPQ19JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYwMDAwCisjZGVmaW5lIFJGRDJfUFJPQ19JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFJGRDJfUFJPRF9JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmCisjZGVmaW5lIFJGRDJfUFJPRF9JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVNQUNfQ09SRV9IV19WRVJTSU9OICovCisjZGVmaW5lIE1BSk9SX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGYwMDAwMDAwCisjZGVmaW5lIE1BSk9SX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4CisjZGVmaW5lIE1JTk9SX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYwMDAwCisjZGVmaW5lIE1JTk9SX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFNURVBfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisjZGVmaW5lIFNURVBfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVNQUNfRU1BQ19XUkFQUEVSX0NTUjEgKi8KKyNkZWZpbmUgVFhfSU5EWF9GSUZPX1NZTkNfUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyMykKKyNkZWZpbmUgVFhfVFNfRklGT19TWU5DX1JTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyMikKKyNkZWZpbmUgUlhfVFNfRklGTzJfU1lOQ19SU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyMSkKKyNkZWZpbmUgUlhfVFNfRklGTzFfU1lOQ19SU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyMCkKKyNkZWZpbmUgVFhfVFNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgxNikKKyNkZWZpbmUgRElTXzE1ODhfQ0xLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgxMSkKKyNkZWZpbmUgRlJFUV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoOSkKKyNkZWZpbmUgRU5BQkxFX1JSRF9USU1FU1RBTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMykKKworLyogRU1BQ19FTUFDX1dSQVBQRVJfQ1NSMiAqLworI2RlZmluZSBIRFJJVkVfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMAorI2RlZmluZSBIRFJJVkVfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBTTEJfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCg5KQorI2RlZmluZSBQTEJfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCg4KQorI2RlZmluZSBXT0xfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgzKQorI2RlZmluZSBQSFlfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgwKQorCisjZGVmaW5lIEVNQUNfREVWX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisKKy8qIFNHTUlJIHYyIHBlciBsYW5lIHJlZ2lzdGVycyAqLworI2RlZmluZSBTR01JSV9MTl9SU01fU1RBUlQgICAgICAgICAgICAgMHgwMjlDCisKKy8qIFNHTUlJIHYyIFBIWSBjb21tb24gcmVnaXN0ZXJzICovCisjZGVmaW5lIFNHTUlJX1BIWV9DTU5fQ1RSTCAgICAgICAgICAgIDB4MDQwOAorI2RlZmluZSBTR01JSV9QSFlfQ01OX1JFU0VUX0NUUkwgICAgICAweDA0MTAKKworLyogU0dNSUkgdjIgUEhZIHJlZ2lzdGVycyBwZXIgbGFuZSAqLworI2RlZmluZSBTR01JSV9QSFlfTE5fT0ZGU0VUICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBTR01JSV9QSFlfTE5fTEFORV9TVEFUVVMgICAgIDB4MDBEQworI2RlZmluZSBTR01JSV9QSFlfTE5fQklTVF9HRU4wICAgICAgIDB4MDA4QworI2RlZmluZSBTR01JSV9QSFlfTE5fQklTVF9HRU4xICAgICAgIDB4MDA5MAorI2RlZmluZSBTR01JSV9QSFlfTE5fQklTVF9HRU4yICAgICAgIDB4MDA5NAorI2RlZmluZSBTR01JSV9QSFlfTE5fQklTVF9HRU4zICAgICAgIDB4MDA5OAorI2RlZmluZSBTR01JSV9QSFlfTE5fQ0RSX0NUUkwxICAgICAgIDB4MDA1QworCitlbnVtIGVtYWNfY2xrX2lkIHsKKwlFTUFDX0NMS19BWEksCisJRU1BQ19DTEtfQ0ZHX0FIQiwKKwlFTUFDX0NMS19ISUdIX1NQRUVELAorCUVNQUNfQ0xLX01ESU8sCisJRU1BQ19DTEtfVFgsCisJRU1BQ19DTEtfUlgsCisJRU1BQ19DTEtfU1lTLAorCUVNQUNfQ0xLX0NOVAorfTsKKworI2RlZmluZSBFTUFDX0xJTktfU1BFRURfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBFTUFDX0xJTktfU1BFRURfMTBfSEFMRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBFTUFDX0xJTktfU1BFRURfMTBfRlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBFTUFDX0xJTktfU1BFRURfMTAwX0hBTEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBFTUFDX0xJTktfU1BFRURfMTAwX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgzKQorI2RlZmluZSBFTUFDX0xJTktfU1BFRURfMUdCX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCg1KQorCisjZGVmaW5lIEVNQUNfTUFYX1NFVFVQX0xOS19DWUNMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwCisKKy8qIFdha2UgT24gTGFuICovCisjZGVmaW5lIEVNQUNfV09MX1BIWSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgLyogUEhZIFN0YXR1cyBDaGFuZ2UgKi8KKyNkZWZpbmUgRU1BQ19XT0xfTUFHSUMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAvKiBNYWdpYyBQYWNrZXQgKi8KKworc3RydWN0IGVtYWNfc3RhdHMgeworCS8qIHJ4ICovCisJdTY0IHJ4X29rOyAgICAgICAgICAgICAgLyogZ29vZCBwYWNrZXRzICovCisJdTY0IHJ4X2JjYXN0OyAgICAgICAgICAgLyogZ29vZCBicm9hZGNhc3QgcGFja2V0cyAqLworCXU2NCByeF9tY2FzdDsgICAgICAgICAgIC8qIGdvb2QgbXVsdGljYXN0IHBhY2tldHMgKi8KKwl1NjQgcnhfcGF1c2U7ICAgICAgICAgICAvKiBwYXVzZSBwYWNrZXQgKi8KKwl1NjQgcnhfY3RybDsgICAgICAgICAgICAvKiBjb250cm9sIHBhY2tldHMgb3RoZXIgdGhhbiBwYXVzZSBmcmFtZS4gKi8KKwl1NjQgcnhfZmNzX2VycjsgICAgICAgICAvKiBwYWNrZXRzIHdpdGggYmFkIEZDUy4gKi8KKwl1NjQgcnhfbGVuX2VycjsgICAgICAgICAvKiBwYWNrZXRzIHdpdGggbGVuZ3RoIG1pc21hdGNoICovCisJdTY0IHJ4X2J5dGVfY250OyAgICAgICAgLyogZ29vZCBieXRlcyBjb3VudCAod2l0aG91dCBGQ1MpICovCisJdTY0IHJ4X3J1bnQ7ICAgICAgICAgICAgLyogcnVudCBwYWNrZXRzICovCisJdTY0IHJ4X2ZyYWc7ICAgICAgICAgICAgLyogZnJhZ21lbnQgY291bnQgKi8KKwl1NjQgcnhfc3pfNjQ7CSAgICAgICAgLyogcGFja2V0cyB0aGF0IGFyZSA2NCBieXRlcyAqLworCXU2NCByeF9zel82NV8xMjc7ICAgICAgIC8qIHBhY2tldHMgdGhhdCBhcmUgNjUtMTI3IGJ5dGVzICovCisJdTY0IHJ4X3N6XzEyOF8yNTU7ICAgICAgLyogcGFja2V0cyB0aGF0IGFyZSAxMjgtMjU1IGJ5dGVzICovCisJdTY0IHJ4X3N6XzI1Nl81MTE7ICAgICAgLyogcGFja2V0cyB0aGF0IGFyZSAyNTYtNTExIGJ5dGVzICovCisJdTY0IHJ4X3N6XzUxMl8xMDIzOyAgICAgLyogcGFja2V0cyB0aGF0IGFyZSA1MTItMTAyMyBieXRlcyAqLworCXU2NCByeF9zel8xMDI0XzE1MTg7ICAgIC8qIHBhY2tldHMgdGhhdCBhcmUgMTAyNC0xNTE4IGJ5dGVzICovCisJdTY0IHJ4X3N6XzE1MTlfbWF4OyAgICAgLyogcGFja2V0cyB0aGF0IGFyZSAxNTE5LU1UVSBieXRlcyovCisJdTY0IHJ4X3N6X292OyAgICAgICAgICAgLyogcGFja2V0cyB0aGF0IGFyZSA+TVRVIGJ5dGVzICh0cnVuY2F0ZWQpICovCisJdTY0IHJ4X3J4Zl9vdjsgICAgICAgICAgLyogcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBSWCBGSUZPIG92ZXJmbG93ICovCisJdTY0IHJ4X2FsaWduX2VycjsgICAgICAgLyogYWxpZ25tZW50IGVycm9ycyAqLworCXU2NCByeF9iY2FzdF9ieXRlX2NudDsgIC8qIGJyb2FkY2FzdCBwYWNrZXRzIGJ5dGUgY291bnQgKHdpdGhvdXQgRkNTKSAqLworCXU2NCByeF9tY2FzdF9ieXRlX2NudDsgIC8qIG11bHRpY2FzdCBwYWNrZXRzIGJ5dGUgY291bnQgKHdpdGhvdXQgRkNTKSAqLworCXU2NCByeF9lcnJfYWRkcjsgICAgICAgIC8qIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gYWRkcmVzcyBmaWx0ZXJpbmcgKi8KKwl1NjQgcnhfY3JjX2FsaWduOyAgICAgICAvKiBDUkMgYWxpZ24gZXJyb3JzICovCisJdTY0IHJ4X2phYmJlcnM7ICAgICAgICAgLyogamFiYmVycyAqLworCisJLyogdHggKi8KKwl1NjQgdHhfb2s7ICAgICAgICAgICAgICAvKiBnb29kIHBhY2tldHMgKi8KKwl1NjQgdHhfYmNhc3Q7ICAgICAgICAgICAvKiBnb29kIGJyb2FkY2FzdCBwYWNrZXRzICovCisJdTY0IHR4X21jYXN0OyAgICAgICAgICAgLyogZ29vZCBtdWx0aWNhc3QgcGFja2V0cyAqLworCXU2NCB0eF9wYXVzZTsgICAgICAgICAgIC8qIHBhdXNlIHBhY2tldHMgKi8KKwl1NjQgdHhfZXhjX2RlZmVyOyAgICAgICAvKiBwYWNrZXRzIHdpdGggZXhjZXNzaXZlIGRlZmVycmFsICovCisJdTY0IHR4X2N0cmw7ICAgICAgICAgICAgLyogY29udHJvbCBwYWNrZXRzIG90aGVyIHRoYW4gcGF1c2UgZnJhbWUgKi8KKwl1NjQgdHhfZGVmZXI7ICAgICAgICAgICAvKiBwYWNrZXRzIHRoYXQgYXJlIGRlZmVycmVkLiAqLworCXU2NCB0eF9ieXRlX2NudDsgICAgICAgIC8qIGdvb2QgYnl0ZXMgY291bnQgKHdpdGhvdXQgRkNTKSAqLworCXU2NCB0eF9zel82NDsgICAgICAgICAgIC8qIHBhY2tldHMgdGhhdCBhcmUgNjQgYnl0ZXMgKi8KKwl1NjQgdHhfc3pfNjVfMTI3OyAgICAgICAvKiBwYWNrZXRzIHRoYXQgYXJlIDY1LTEyNyBieXRlcyAqLworCXU2NCB0eF9zel8xMjhfMjU1OyAgICAgIC8qIHBhY2tldHMgdGhhdCBhcmUgMTI4LTI1NSBieXRlcyAqLworCXU2NCB0eF9zel8yNTZfNTExOyAgICAgIC8qIHBhY2tldHMgdGhhdCBhcmUgMjU2LTUxMSBieXRlcyAqLworCXU2NCB0eF9zel81MTJfMTAyMzsgICAgIC8qIHBhY2tldHMgdGhhdCBhcmUgNTEyLTEwMjMgYnl0ZXMgKi8KKwl1NjQgdHhfc3pfMTAyNF8xNTE4OyAgICAvKiBwYWNrZXRzIHRoYXQgYXJlIDEwMjQtMTUxOCBieXRlcyAqLworCXU2NCB0eF9zel8xNTE5X21heDsgICAgIC8qIHBhY2tldHMgdGhhdCBhcmUgMTUxOS1NVFUgYnl0ZXMgKi8KKwl1NjQgdHhfMV9jb2w7ICAgICAgICAgICAvKiBwYWNrZXRzIHNpbmdsZSBwcmlvciBjb2xsaXNpb24gKi8KKwl1NjQgdHhfMl9jb2w7ICAgICAgICAgICAvKiBwYWNrZXRzIHdpdGggbXVsdGlwbGUgcHJpb3IgY29sbGlzaW9ucyAqLworCXU2NCB0eF9sYXRlX2NvbDsgICAgICAgIC8qIHBhY2tldHMgd2l0aCBsYXRlIGNvbGxpc2lvbnMgKi8KKwl1NjQgdHhfYWJvcnRfY29sOyAgICAgICAvKiBwYWNrZXRzIGFib3J0ZWQgZHVlIHRvIGV4Y2VzcyBjb2xsaXNpb25zICovCisJdTY0IHR4X3VuZGVycnVuOyAgICAgICAgLyogcGFja2V0cyBhYm9ydGVkIGR1ZSB0byBGSUZPIHVuZGVycnVuICovCisJdTY0IHR4X3JkX2VvcDsgICAgICAgICAgLyogY291bnQgb2YgcmVhZHMgYmV5b25kIEVPUCAqLworCXU2NCB0eF9sZW5fZXJyOyAgICAgICAgIC8qIHBhY2tldHMgd2l0aCBsZW5ndGggbWlzbWF0Y2ggKi8KKwl1NjQgdHhfdHJ1bmM7ICAgICAgICAgICAvKiBwYWNrZXRzIHRydW5jYXRlZCBkdWUgdG8gc2l6ZSA+TVRVICovCisJdTY0IHR4X2JjYXN0X2J5dGU7ICAgICAgLyogYnJvYWRjYXN0IHBhY2tldHMgYnl0ZSBjb3VudCAod2l0aG91dCBGQ1MpICovCisJdTY0IHR4X21jYXN0X2J5dGU7ICAgICAgLyogbXVsdGljYXN0IHBhY2tldHMgYnl0ZSBjb3VudCAod2l0aG91dCBGQ1MpICovCisJdTY0IHR4X2NvbDsgICAgICAgICAgICAgLyogY29sbGlzaW9ucyAqLworCisJc3BpbmxvY2tfdCBsb2NrOwkvKiBwcmV2ZW50IG11bHRpcGxlIHNpbXVsdGFuZW91cyByZWFkZXJzICovCit9OworCisvKiBSU1MgaHN0eXBlIERlZmluaXRpb25zICovCisjZGVmaW5lIEVNQUNfUlNTX0hTVFlQX0lQVjRfRU4JCQkJICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRU1BQ19SU1NfSFNUWVBfVENQNF9FTgkJCQkgICAgMHgwMDAwMDAwMgorI2RlZmluZSBFTUFDX1JTU19IU1RZUF9JUFY2X0VOCQkJCSAgICAweDAwMDAwMDA0CisjZGVmaW5lIEVNQUNfUlNTX0hTVFlQX1RDUDZfRU4JCQkJICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRU1BQ19SU1NfSFNUWVBfQUxMX0VOIChcCisJCUVNQUNfUlNTX0hTVFlQX0lQVjRfRU4gICB8XAorCQlFTUFDX1JTU19IU1RZUF9UQ1A0X0VOICAgfFwKKwkJRU1BQ19SU1NfSFNUWVBfSVBWNl9FTiAgIHxcCisJCUVNQUNfUlNTX0hTVFlQX1RDUDZfRU4pCisKKyNkZWZpbmUgRU1BQ19WTEFOX1RPX1RBRyhfdmxhbiwgX3RhZykgXAorCQkoX3RhZyA9ICAoKCgoX3ZsYW4pID4+IDgpICYgMHhGRikgfCAoKChfdmxhbikgJiAweEZGKSA8PCA4KSkpCisKKyNkZWZpbmUgRU1BQ19UQUdfVE9fVkxBTihfdGFnLCBfdmxhbikgXAorCQkoX3ZsYW4gPSAoKCgoX3RhZykgPj4gOCkgJiAweEZGKSB8ICgoKF90YWcpICYgMHhGRikgPDwgOCkpKQorCisjZGVmaW5lIEVNQUNfREVGX1JYX0JVRl9TSVpFCQkJCQkgIDE1MzYKKyNkZWZpbmUgRU1BQ19NQVhfSlVNQk9fUEtUX1NJWkUJCQkJICAgICg5ICogMTAyNCkKKyNkZWZpbmUgRU1BQ19NQVhfVFhfT0ZGTE9BRF9USFJFU0gJCQkgICAgKDkgKiAxMDI0KQorCisjZGVmaW5lIEVNQUNfTUFYX0VUSF9GUkFNRV9TSVpFCQkgICAgICAgRU1BQ19NQVhfSlVNQk9fUEtUX1NJWkUKKyNkZWZpbmUgRU1BQ19NSU5fRVRIX0ZSQU1FX1NJWkUJCQkJCSAgICA2OAorCisjZGVmaW5lIEVNQUNfREVGX1RYX1FVRVVFUwkJCQkJICAgICAxCisjZGVmaW5lIEVNQUNfREVGX1JYX1FVRVVFUwkJCQkJICAgICAxCisKKyNkZWZpbmUgRU1BQ19NSU5fVFhfREVTQ1MJCQkJCSAgIDEyOAorI2RlZmluZSBFTUFDX01JTl9SWF9ERVNDUwkJCQkJICAgMTI4CisKKyNkZWZpbmUgRU1BQ19NQVhfVFhfREVTQ1MJCQkJCSAxNjM4MworI2RlZmluZSBFTUFDX01BWF9SWF9ERVNDUwkJCQkJICAyMDQ3CisKKyNkZWZpbmUgRU1BQ19ERUZfVFhfREVTQ1MJCQkJCSAgIDUxMgorI2RlZmluZSBFTUFDX0RFRl9SWF9ERVNDUwkJCQkJICAgMjU2CisKKyNkZWZpbmUgRU1BQ19ERUZfUlhfSVJRX01PRAkJCQkJICAgMjUwCisjZGVmaW5lIEVNQUNfREVGX1RYX0lSUV9NT0QJCQkJCSAgIDI1MAorCisjZGVmaW5lIEVNQUNfV0FUQ0hET0dfVElNRQkJCQkgICAgICAoNSAqIEhaKQorCisvKiBieSBkZWZhdWx0IGNoZWNrIGxpbmsgZXZlcnkgNCBzZWNvbmRzICovCisjZGVmaW5lIEVNQUNfVFJZX0xJTktfVElNRU9VVAkJCQkgICAgICAoNCAqIEhaKQorCisvKiBlbWFjX2lycSBwZXItZGV2aWNlIChwZXItYWRhcHRlcikgaXJxIHByb3BlcnRpZXMuCisgKiBAaXJxOglpcnEgbnVtYmVyLgorICogQG1hc2sJbWFzayB0byB1c2Ugb3ZlciBzdGF0dXMgcmVnaXN0ZXIuCisgKi8KK3N0cnVjdCBlbWFjX2lycSB7CisJdW5zaWduZWQgaW50CWlycTsKKwl1MzIJCW1hc2s7Cit9OworCisvKiBUaGUgZGV2aWNlJ3MgbWFpbiBkYXRhIHN0cnVjdHVyZSAqLworc3RydWN0IGVtYWNfYWRhcHRlciB7CisJc3RydWN0IG5ldF9kZXZpY2UJCSpuZXRkZXY7CisJc3RydWN0IG1paV9idXMJCQkqbWlpX2J1czsKKwlzdHJ1Y3QgcGh5X2RldmljZQkJKnBoeWRldjsKKworCXZvaWQgX19pb21lbQkJCSpiYXNlOworCXZvaWQgX19pb21lbQkJCSpjc3I7CisKKwlzdHJ1Y3QgZW1hY19waHkJCQlwaHk7CisJc3RydWN0IGVtYWNfc3RhdHMJCXN0YXRzOworCisJc3RydWN0IGVtYWNfaXJxCQkJaXJxOworCXN0cnVjdCBjbGsJCQkqY2xrW0VNQUNfQ0xLX0NOVF07CisKKwkvKiBBbGwgRGVzY3JpcHRvciBtZW1vcnkgKi8KKwlzdHJ1Y3QgZW1hY19yaW5nX2hlYWRlcgkJcmluZ19oZWFkZXI7CisJc3RydWN0IGVtYWNfdHhfcXVldWUJCXR4X3E7CisJc3RydWN0IGVtYWNfcnhfcXVldWUJCXJ4X3E7CisJdW5zaWduZWQgaW50CQkJdHhfZGVzY19jbnQ7CisJdW5zaWduZWQgaW50CQkJcnhfZGVzY19jbnQ7CisJdW5zaWduZWQgaW50CQkJcnJkX3NpemU7IC8qIGluIHF1YWQgd29yZHMgKi8KKwl1bnNpZ25lZCBpbnQJCQlyZmRfc2l6ZTsgLyogaW4gcXVhZCB3b3JkcyAqLworCXVuc2lnbmVkIGludAkJCXRwZF9zaXplOyAvKiBpbiBxdWFkIHdvcmRzICovCisKKwl1bnNpZ25lZCBpbnQJCQlyeGJ1Zl9zaXplOworCisJLyogUmluZyBwYXJhbWV0ZXIgKi8KKwl1OAkJCQl0cGRfYnVyc3Q7CisJdTgJCQkJcmZkX2J1cnN0OworCXVuc2lnbmVkIGludAkJCWRtYXdfZGx5X2NudDsKKwl1bnNpZ25lZCBpbnQJCQlkbWFyX2RseV9jbnQ7CisJZW51bSBlbWFjX2RtYV9yZXFfYmxvY2sJCWRtYXJfYmxvY2s7CisJZW51bSBlbWFjX2RtYV9yZXFfYmxvY2sJCWRtYXdfYmxvY2s7CisJZW51bSBlbWFjX2RtYV9vcmRlcgkJZG1hX29yZGVyOworCisJdTMyCQkJCWlycV9tb2Q7CisJdTMyCQkJCXByZWFtYmxlOworCisJc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrX3RocmVhZDsKKworCXUxNgkJCQltc2dfZW5hYmxlOworCisJc3RydWN0IG11dGV4CQkJcmVzZXRfbG9jazsKK307CisKK2ludCBlbWFjX3JlaW5pdF9sb2NrZWQoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCk7Cit2b2lkIGVtYWNfcmVnX3VwZGF0ZTMyKHZvaWQgX19pb21lbSAqYWRkciwgdTMyIG1hc2ssIHUzMiB2YWwpOworaXJxcmV0dXJuX3QgZW1hY19pc3IoaW50IGlycSwgdm9pZCAqZGF0YSk7CisKKyNlbmRpZiAvKiBfRU1BQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmRjL3I2MDQwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZGMvcjYwNDAuYwppbmRleCBjYjI5ZWUyLi41ZWY1ZDcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZGMvcjYwNDAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZGMvcjYwNDAuYwpAQCAtMTA2MiwxNCArMTA2MiwxMiBAQAogCS8qIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSBzdXBwb3J0ZWQgKi8KIAllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCWlmIChlcnIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiMzItYml0IFBDSSBETUEgYWRkcmVzc2VzIgotCQkJCSJub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjYXJkXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiMzItYml0IFBDSSBETUEgYWRkcmVzc2VzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNhcmRcbiIpOwogCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9kZXY7CiAJfQogCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIjMyLWJpdCBQQ0kgRE1BIGFkZHJlc3NlcyIKLQkJCQkibm90IHN1cHBvcnRlZCBieSB0aGUgY2FyZFxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIjMyLWJpdCBQQ0kgRE1BIGFkZHJlc3NlcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjYXJkXG4iKTsKIAkJZ290byBlcnJfb3V0X2Rpc2FibGVfZGV2OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVhbHRlay84MTM5Y3AuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvODEzOWNwLmMKaW5kZXggZGVhZTEwZC4uNTI5N2JmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVhbHRlay84MTM5Y3AuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZWFsdGVrLzgxMzljcC5jCkBAIC00NjcsOCArNDY3LDggQEAKIAl1bnNpZ25lZCBpbnQgcnhfdGFpbCA9IGNwLT5yeF90YWlsOwogCWludCByeDsKIAotcnhfc3RhdHVzX2xvb3A6CiAJcnggPSAwOworcnhfc3RhdHVzX2xvb3A6CiAJY3B3MTYoSW50clN0YXR1cywgY3BfcnhfaW50cl9tYXNrKTsKIAogCXdoaWxlIChyeCA8IGJ1ZGdldCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9LY29uZmlnCmluZGV4IDRmMTMyY2YuLjg1ZWM0NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL0tjb25maWcKQEAgLTI3LDcgKzI3LDcgQEAKIAkgIFJlbmVzYXMgU3VwZXJIIEV0aGVybmV0IGRldmljZSBkcml2ZXIuCiAJICBUaGlzIGRyaXZlciBzdXBwb3J0aW5nIENQVXMgYXJlOgogCQktIFNINzYxOSwgU0g3NzEwLCBTSDc3MTIsIFNINzcyNCwgU0g3NzM0LCBTSDc3NjMsIFNINzc1NywKLQkJICBSOEE3NzQwLCBSOEE3Nzd4IGFuZCBSOEE3Nzl4LgorCQkgIFI4QTc3NDAsIFI4QTc3NHgsIFI4QTc3N3ggYW5kIFI4QTc3OXguCiAKIGNvbmZpZyBSQVZCCiAJdHJpc3RhdGUgIlJlbmVzYXMgRXRoZXJuZXQgQVZCIHN1cHBvcnQiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3JhdmIuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvcmF2Yi5oCmluZGV4IDRlNWQ1ZTkuLmYxMTA5NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvcmF2Yi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvcmF2Yi5oCkBAIC0xMDExLDcgKzEwMTEsNiBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCS8qIE1JSSB0cmFuc2NlaXZlciBzZWN0aW9uLiAqLwogCXN0cnVjdCBtaWlfYnVzICptaWlfYnVzOwkvKiBNRElPIGJ1cyBjb250cm9sICovCi0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsJLyogUEhZIGRldmljZSBjb250cm9sICovCiAJaW50IGxpbms7CiAJcGh5X2ludGVyZmFjZV90IHBoeV9pbnRlcmZhY2U7CiAJaW50IG1zZ19lbmFibGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3JhdmJfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9yYXZiX21haW4uYwppbmRleCAxZTFjYzBmLi42MzA1MzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3JhdmJfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvcmF2Yl9tYWluLmMKQEAgLTk0Miw3ICs5NDIsNyBAQAogc3RhdGljIHZvaWQgcmF2Yl9hZGp1c3RfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3QgcmF2Yl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHByaXYtPnBoeWRldjsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gbmRldi0+cGh5ZGV2OwogCWJvb2wgbmV3X3N0YXRlID0gZmFsc2U7CiAKIAlpZiAocGh5ZGV2LT5saW5rKSB7CkBAIC0xMDMyLDQ4ICsxMDMyLDQ3IEBACiAKIAlwaHlfYXR0YWNoZWRfaW5mbyhwaHlkZXYpOwogCi0JcHJpdi0+cGh5ZGV2ID0gcGh5ZGV2OwotCiAJcmV0dXJuIDA7CiB9CiAKIC8qIFBIWSBjb250cm9sIHN0YXJ0IGZ1bmN0aW9uICovCiBzdGF0aWMgaW50IHJhdmJfcGh5X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewotCXN0cnVjdCByYXZiX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlpbnQgZXJyb3I7CiAKIAllcnJvciA9IHJhdmJfcGh5X2luaXQobmRldik7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQlwaHlfc3RhcnQocHJpdi0+cGh5ZGV2KTsKKwlwaHlfc3RhcnQobmRldi0+cGh5ZGV2KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJhdmJfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCitzdGF0aWMgaW50IHJhdmJfZ2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJCSAgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJc3RydWN0IHJhdmJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwogCWludCBlcnJvciA9IC1FTk9ERVY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChwcml2LT5waHlkZXYpIHsKKwlpZiAobmRldi0+cGh5ZGV2KSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCWVycm9yID0gcGh5X2V0aHRvb2xfZ3NldChwcml2LT5waHlkZXYsIGVjbWQpOworCQllcnJvciA9IHBoeV9ldGh0b29sX2tzZXR0aW5nc19nZXQobmRldi0+cGh5ZGV2LCBjbWQpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJfQogCiAJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgaW50IHJhdmJfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCitzdGF0aWMgaW50IHJhdmJfc2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJc3RydWN0IHJhdmJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVycm9yOwogCi0JaWYgKCFwcml2LT5waHlkZXYpCisJaWYgKCFuZGV2LT5waHlkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKQEAgLTEwODEsMTEgKzEwODAsMTEgQEAKIAkvKiBEaXNhYmxlIFRYIGFuZCBSWCAqLwogCXJhdmJfcmN2X3NuZF9kaXNhYmxlKG5kZXYpOwogCi0JZXJyb3IgPSBwaHlfZXRodG9vbF9zc2V0KHByaXYtPnBoeWRldiwgZWNtZCk7CisJZXJyb3IgPSBwaHlfZXRodG9vbF9rc2V0dGluZ3Nfc2V0KG5kZXYtPnBoeWRldiwgY21kKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyb3JfZXhpdDsKIAotCWlmIChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJaWYgKGNtZC0+YmFzZS5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCiAJCXByaXYtPmR1cGxleCA9IDE7CiAJZWxzZQogCQlwcml2LT5kdXBsZXggPSAwOwpAQCAtMTExMCw5ICsxMTA5LDkgQEAKIAlpbnQgZXJyb3IgPSAtRU5PREVWOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAocHJpdi0+cGh5ZGV2KSB7CisJaWYgKG5kZXYtPnBoeWRldikgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQllcnJvciA9IHBoeV9zdGFydF9hbmVnKHByaXYtPnBoeWRldik7CisJCWVycm9yID0gcGh5X3N0YXJ0X2FuZWcobmRldi0+cGh5ZGV2KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCX0KIApAQCAtMTMwOSw4ICsxMzA4LDYgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyByYXZiX2V0aHRvb2xfb3BzID0gewotCS5nZXRfc2V0dGluZ3MJCT0gcmF2Yl9nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncwkJPSByYXZiX3NldF9zZXR0aW5ncywKIAkubndheV9yZXNldAkJPSByYXZiX253YXlfcmVzZXQsCiAJLmdldF9tc2dsZXZlbAkJPSByYXZiX2dldF9tc2dsZXZlbCwKIAkuc2V0X21zZ2xldmVsCQk9IHJhdmJfc2V0X21zZ2xldmVsLApAQCAtMTMyMSw2ICsxMzE4LDggQEAKIAkuZ2V0X3JpbmdwYXJhbQkJPSByYXZiX2dldF9yaW5ncGFyYW0sCiAJLnNldF9yaW5ncGFyYW0JCT0gcmF2Yl9zZXRfcmluZ3BhcmFtLAogCS5nZXRfdHNfaW5mbwkJPSByYXZiX2dldF90c19pbmZvLAorCS5nZXRfbGlua19rc2V0dGluZ3MJPSByYXZiX2dldF9saW5rX2tzZXR0aW5ncywKKwkuc2V0X2xpbmtfa3NldHRpbmdzCT0gcmF2Yl9zZXRfbGlua19rc2V0dGluZ3MsCiB9OwogCiBzdGF0aWMgaW5saW5lIGludCByYXZiX2hvb2tfaXJxKHVuc2lnbmVkIGludCBpcnEsIGlycV9oYW5kbGVyX3QgaGFuZGxlciwKQEAgLTE2NjEsMTAgKzE2NjAsOSBAQAogCX0KIAogCS8qIFBIWSBkaXNjb25uZWN0ICovCi0JaWYgKHByaXYtPnBoeWRldikgewotCQlwaHlfc3RvcChwcml2LT5waHlkZXYpOwotCQlwaHlfZGlzY29ubmVjdChwcml2LT5waHlkZXYpOwotCQlwcml2LT5waHlkZXYgPSBOVUxMOworCWlmIChuZGV2LT5waHlkZXYpIHsKKwkJcGh5X3N0b3AobmRldi0+cGh5ZGV2KTsKKwkJcGh5X2Rpc2Nvbm5lY3QobmRldi0+cGh5ZGV2KTsKIAl9CiAKIAlpZiAocHJpdi0+Y2hpcF9pZCAhPSBSQ0FSX0dFTjIpIHsKQEAgLTE3NTMsOCArMTc1MSw3IEBACiAvKiBpb2N0bCB0byBkZXZpY2UgZnVuY3Rpb24gKi8KIHN0YXRpYyBpbnQgcmF2Yl9kb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGlmcmVxICpyZXEsIGludCBjbWQpCiB7Ci0Jc3RydWN0IHJhdmJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBwcml2LT5waHlkZXY7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IG5kZXYtPnBoeWRldjsKIAogCWlmICghbmV0aWZfcnVubmluZyhuZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xODc2LDYgKzE4NzMsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgcmF2Yl9zZXRfY29uZmlnX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IHJhdmJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJaWYgKHByaXYtPmNoaXBfaWQgPT0gUkNBUl9HRU4yKSB7CisJCXJhdmJfbW9kaWZ5KG5kZXYsIENDQywgQ0NDX09QQywgQ0NDX09QQ19DT05GSUcpOworCQkvKiBTZXQgQ1NFTCB2YWx1ZSAqLworCQlyYXZiX21vZGlmeShuZGV2LCBDQ0MsIENDQ19DU0VMLCBDQ0NfQ1NFTF9IUEIpOworCX0gZWxzZSB7CisJCXJhdmJfbW9kaWZ5KG5kZXYsIENDQywgQ0NDX09QQywgQ0NDX09QQ19DT05GSUcgfAorCQkJICAgIENDQ19HQUMgfCBDQ0NfQ1NFTF9IUEIpOworCX0KK30KKwogc3RhdGljIGludCByYXZiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwpAQCAtMTk3OCwxNCArMTk4OSw3IEBACiAJbmRldi0+ZXRodG9vbF9vcHMgPSAmcmF2Yl9ldGh0b29sX29wczsKIAogCS8qIFNldCBBVkIgY29uZmlnIG1vZGUgKi8KLQlpZiAoY2hpcF9pZCA9PSBSQ0FSX0dFTjIpIHsKLQkJcmF2Yl9tb2RpZnkobmRldiwgQ0NDLCBDQ0NfT1BDLCBDQ0NfT1BDX0NPTkZJRyk7Ci0JCS8qIFNldCBDU0VMIHZhbHVlICovCi0JCXJhdmJfbW9kaWZ5KG5kZXYsIENDQywgQ0NDX0NTRUwsIENDQ19DU0VMX0hQQik7Ci0JfSBlbHNlIHsKLQkJcmF2Yl9tb2RpZnkobmRldiwgQ0NDLCBDQ0NfT1BDLCBDQ0NfT1BDX0NPTkZJRyB8Ci0JCQkgICAgQ0NDX0dBQyB8IENDQ19DU0VMX0hQQik7Ci0JfQorCXJhdmJfc2V0X2NvbmZpZ19tb2RlKG5kZXYpOwogCiAJLyogU2V0IEdUSSB2YWx1ZSAqLwogCWVycm9yID0gcmF2Yl9zZXRfZ3RpKG5kZXYpOwpAQCAtMjA5Niw4ICsyMTAwLDU1IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgcmF2Yl9ydW50aW1lX25vcChzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIHJhdmJfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKSB7CisJCW5ldGlmX2RldmljZV9kZXRhY2gobmRldik7CisJCXJldCA9IHJhdmJfY2xvc2UobmRldik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCByYXZiX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgcmF2Yl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaW50IHJldCA9IDA7CisKKwkvKiBBbGwgcmVnaXN0ZXIgaGF2ZSBiZWVuIHJlc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorCSAqIFJlc3RvcmUgYWxsIHJlZ2lzdGVycyB3aGljaCB3aGVyZSBzZXR1cCBhdCBwcm9iZSB0aW1lIGFuZAorCSAqIHJlb3BlbiBkZXZpY2UgaWYgaXQgd2FzIHJ1bm5pbmcgYmVmb3JlIHN5c3RlbSBzdXNwZW5kZWQuCisJICovCisKKwkvKiBTZXQgQVZCIGNvbmZpZyBtb2RlICovCisJcmF2Yl9zZXRfY29uZmlnX21vZGUobmRldik7CisKKwkvKiBTZXQgR1RJIHZhbHVlICovCisJcmV0ID0gcmF2Yl9zZXRfZ3RpKG5kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBSZXF1ZXN0IEdUSSBsb2FkaW5nICovCisJcmF2Yl9tb2RpZnkobmRldiwgR0NDUiwgR0NDUl9MVEksIEdDQ1JfTFRJKTsKKworCS8qIFJlc3RvcmUgZGVzY3JpcHRvciBiYXNlIGFkZHJlc3MgdGFibGUgKi8KKwlyYXZiX3dyaXRlKG5kZXYsIHByaXYtPmRlc2NfYmF0X2RtYSwgREJBVCk7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZGV2KSkgeworCQlyZXQgPSByYXZiX29wZW4obmRldik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChuZGV2KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIHJhdmJfcnVudGltZV9ub3Aoc3RydWN0IGRldmljZSAqZGV2KQogewogCS8qIFJ1bnRpbWUgUE0gY2FsbGJhY2sgc2hhcmVkIGJldHdlZW4gLT5ydW50aW1lX3N1c3BlbmQoKQogCSAqIGFuZCAtPnJ1bnRpbWVfcmVzdW1lKCkuIFNpbXBseSByZXR1cm5zIHN1Y2Nlc3MuCkBAIC0yMTEwLDIwICsyMTYxLDE2IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyByYXZiX2Rldl9wbV9vcHMgPSB7CisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMocmF2Yl9zdXNwZW5kLCByYXZiX3Jlc3VtZSkKIAlTRVRfUlVOVElNRV9QTV9PUFMocmF2Yl9ydW50aW1lX25vcCwgcmF2Yl9ydW50aW1lX25vcCwgTlVMTCkKIH07CiAKLSNkZWZpbmUgUkFWQl9QTV9PUFMgKCZyYXZiX2Rldl9wbV9vcHMpCi0jZWxzZQotI2RlZmluZSBSQVZCX1BNX09QUyBOVUxMCi0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcmF2Yl9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IHJhdmJfcHJvYmUsCiAJLnJlbW92ZQkJPSByYXZiX3JlbW92ZSwKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJyYXZiIiwKLQkJLnBtCT0gUkFWQl9QTV9PUFMsCisJCS5wbQk9ICZyYXZiX2Rldl9wbV9vcHMsCiAJCS5vZl9tYXRjaF90YWJsZSA9IHJhdmJfbWF0Y2hfdGFibGUsCiAJfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3NoX2V0aC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9zaF9ldGguYwppbmRleCA3OTlkNThkLi4wNWIwZGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3NoX2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmMKQEAgLTIwMSw5ICsyMDEsMTQgQEAKIAogCVtBUlNUUl0JCT0gMHgwMDAwLAogCVtUU1VfQ1RSU1RdCT0gMHgwMDA0LAorCVtUU1VfRldTTENdCT0gMHgwMDM4LAogCVtUU1VfVlRBRzBdCT0gMHgwMDU4LAogCVtUU1VfQURTQlNZXQk9IDB4MDA2MCwKIAlbVFNVX1RFTl0JPSAweDAwNjQsCisJW1RTVV9QT1NUMV0JPSAweDAwNzAsCisJW1RTVV9QT1NUMl0JPSAweDAwNzQsCisJW1RTVV9QT1NUM10JPSAweDAwNzgsCisJW1RTVV9QT1NUNF0JPSAweDAwN2MsCiAJW1RTVV9BRFJIMF0JPSAweDAxMDAsCiAKIAlbVFhOTENSMF0JPSAweDAwODAsCkBAIC0xNzIzLDcgKzE3MjgsNyBAQAogc3RhdGljIHZvaWQgc2hfZXRoX2FkanVzdF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewogCXN0cnVjdCBzaF9ldGhfcHJpdmF0ZSAqbWRwID0gbmV0ZGV2X3ByaXYobmRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IG1kcC0+cGh5ZGV2OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBuZGV2LT5waHlkZXY7CiAJaW50IG5ld19zdGF0ZSA9IDA7CiAKIAlpZiAocGh5ZGV2LT5saW5rKSB7CkBAIC0xODAwLDUxICsxODA1LDQ4IEBACiAKIAlwaHlfYXR0YWNoZWRfaW5mbyhwaHlkZXYpOwogCi0JbWRwLT5waHlkZXYgPSBwaHlkZXY7Ci0KIAlyZXR1cm4gMDsKIH0KIAogLyogUEhZIGNvbnRyb2wgc3RhcnQgZnVuY3Rpb24gKi8KIHN0YXRpYyBpbnQgc2hfZXRoX3BoeV9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKLQlzdHJ1Y3Qgc2hfZXRoX3ByaXZhdGUgKm1kcCA9IG5ldGRldl9wcml2KG5kZXYpOwogCWludCByZXQ7CiAKIAlyZXQgPSBzaF9ldGhfcGh5X2luaXQobmRldik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXBoeV9zdGFydChtZHAtPnBoeWRldik7CisJcGh5X3N0YXJ0KG5kZXYtPnBoeWRldik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzaF9ldGhfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3N0YXRpYyBpbnQgc2hfZXRoX2dldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCQkgICAgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJc3RydWN0IHNoX2V0aF9wcml2YXRlICptZHAgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKLQlpZiAoIW1kcC0+cGh5ZGV2KQorCWlmICghbmRldi0+cGh5ZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtZHAtPmxvY2ssIGZsYWdzKTsKLQlyZXQgPSBwaHlfZXRodG9vbF9nc2V0KG1kcC0+cGh5ZGV2LCBlY21kKTsKKwlyZXQgPSBwaHlfZXRodG9vbF9rc2V0dGluZ3NfZ2V0KG5kZXYtPnBoeWRldiwgY21kKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZHAtPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgc2hfZXRoX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCitzdGF0aWMgaW50IHNoX2V0aF9zZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCXN0cnVjdCBzaF9ldGhfcHJpdmF0ZSAqbWRwID0gbmV0ZGV2X3ByaXYobmRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCi0JaWYgKCFtZHAtPnBoeWRldikKKwlpZiAoIW5kZXYtPnBoeWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWRwLT5sb2NrLCBmbGFncyk7CkBAIC0xODUyLDExICsxODU0LDExIEBACiAJLyogZGlzYWJsZSB0eCBhbmQgcnggKi8KIAlzaF9ldGhfcmN2X3NuZF9kaXNhYmxlKG5kZXYpOwogCi0JcmV0ID0gcGh5X2V0aHRvb2xfc3NldChtZHAtPnBoeWRldiwgZWNtZCk7CisJcmV0ID0gcGh5X2V0aHRvb2xfa3NldHRpbmdzX3NldChuZGV2LT5waHlkZXYsIGNtZCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9leGl0OwogCi0JaWYgKGVjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwlpZiAoY21kLT5iYXNlLmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKIAkJbWRwLT5kdXBsZXggPSAxOwogCWVsc2UKIAkJbWRwLT5kdXBsZXggPSAwOwpAQCAtMjA2NywxMSArMjA2OSwxMSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAotCWlmICghbWRwLT5waHlkZXYpCisJaWYgKCFuZGV2LT5waHlkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1kcC0+bG9jaywgZmxhZ3MpOwotCXJldCA9IHBoeV9zdGFydF9hbmVnKG1kcC0+cGh5ZGV2KTsKKwlyZXQgPSBwaHlfc3RhcnRfYW5lZyhuZGV2LT5waHlkZXYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kcC0+bG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHJldDsKQEAgLTIxOTgsOCArMjIwMCw2IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgc2hfZXRoX2V0aHRvb2xfb3BzID0gewotCS5nZXRfc2V0dGluZ3MJPSBzaF9ldGhfZ2V0X3NldHRpbmdzLAotCS5zZXRfc2V0dGluZ3MJPSBzaF9ldGhfc2V0X3NldHRpbmdzLAogCS5nZXRfcmVnc19sZW4JPSBzaF9ldGhfZ2V0X3JlZ3NfbGVuLAogCS5nZXRfcmVncwk9IHNoX2V0aF9nZXRfcmVncywKIAkubndheV9yZXNldAk9IHNoX2V0aF9ud2F5X3Jlc2V0LApAQCAtMjIxMSw2ICsyMjExLDggQEAKIAkuZ2V0X3NzZXRfY291bnQgICAgID0gc2hfZXRoX2dldF9zc2V0X2NvdW50LAogCS5nZXRfcmluZ3BhcmFtCT0gc2hfZXRoX2dldF9yaW5ncGFyYW0sCiAJLnNldF9yaW5ncGFyYW0JPSBzaF9ldGhfc2V0X3JpbmdwYXJhbSwKKwkuZ2V0X2xpbmtfa3NldHRpbmdzID0gc2hfZXRoX2dldF9saW5rX2tzZXR0aW5ncywKKwkuc2V0X2xpbmtfa3NldHRpbmdzID0gc2hfZXRoX3NldF9saW5rX2tzZXR0aW5ncywKIH07CiAKIC8qIG5ldHdvcmsgZGV2aWNlIG9wZW4gZnVuY3Rpb24gKi8KQEAgLTI0MDgsMTAgKzI0MTAsOSBAQAogCXNoX2V0aF9kZXZfZXhpdChuZGV2KTsKIAogCS8qIFBIWSBEaXNjb25uZWN0ICovCi0JaWYgKG1kcC0+cGh5ZGV2KSB7Ci0JCXBoeV9zdG9wKG1kcC0+cGh5ZGV2KTsKLQkJcGh5X2Rpc2Nvbm5lY3QobWRwLT5waHlkZXYpOwotCQltZHAtPnBoeWRldiA9IE5VTEw7CisJaWYgKG5kZXYtPnBoeWRldikgeworCQlwaHlfc3RvcChuZGV2LT5waHlkZXYpOworCQlwaHlfZGlzY29ubmVjdChuZGV2LT5waHlkZXYpOwogCX0KIAogCWZyZWVfaXJxKG5kZXYtPmlycSwgbmRldik7CkBAIC0yNDI5LDggKzI0MzAsNyBAQAogLyogaW9jdGwgdG8gZGV2aWNlIGZ1bmN0aW9uICovCiBzdGF0aWMgaW50IHNoX2V0aF9kb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKIHsKLQlzdHJ1Y3Qgc2hfZXRoX3ByaXZhdGUgKm1kcCA9IG5ldGRldl9wcml2KG5kZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBtZHAtPnBoeWRldjsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gbmRldi0+cGh5ZGV2OwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKG5kZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI3ODYsNiArMjc4Niw4IEBACiB7CiAJaWYgKHNoX2V0aF9pc19yel9mYXN0X2V0aGVyKG1kcCkpIHsKIAkJc2hfZXRoX3RzdV93cml0ZShtZHAsIDAsIFRTVV9URU4pOyAvKiBEaXNhYmxlIGFsbCBDQU0gZW50cnkgKi8KKwkJc2hfZXRoX3RzdV93cml0ZShtZHAsIFRTVV9GV1NMQ19QT1NURU5VIHwgVFNVX0ZXU0xDX1BPU1RFTkwsCisJCQkJIFRTVV9GV1NMQyk7CS8qIEVuYWJsZSBQT1NUIHJlZ2lzdGVycyAqLwogCQlyZXR1cm47CiAJfQogCkBAIC0yOTU3LDYgKzI5NTksOCBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzaF9ldGhfbWF0Y2hfdGFibGVbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsZ2V0aGVyLXI4YTc3NDAiLCAuZGF0YSA9ICZyOGE3NzQwX2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsZXRoZXItcjhhNzc0MyIsIC5kYXRhID0gJnI4YTc3OXhfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxldGhlci1yOGE3NzQ1IiwgLmRhdGEgPSAmcjhhNzc5eF9kYXRhIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLGV0aGVyLXI4YTc3NzgiLCAuZGF0YSA9ICZyOGE3Nzd4X2RhdGEgfSwKIAl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsZXRoZXItcjhhNzc3OSIsIC5kYXRhID0gJnI4YTc3N3hfZGF0YSB9LAogCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxldGhlci1yOGE3NzkwIiwgLmRhdGEgPSAmcjhhNzc5eF9kYXRhIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3NoX2V0aC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9zaF9ldGguaAppbmRleCBjNjIzODBlLi5kMDUwZjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3NoX2V0aC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmgKQEAgLTUxOCw3ICs1MTgsNiBAQAogCS8qIE1JSSB0cmFuc2NlaXZlciBzZWN0aW9uLiAqLwogCXUzMiBwaHlfaWQ7CQkJLyogUEhZIElEICovCiAJc3RydWN0IG1paV9idXMgKm1paV9idXM7CS8qIE1ESU8gYnVzIGNvbnRyb2wgKi8KLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OwkvKiBQSFkgZGV2aWNlIGNvbnRyb2wgKi8KIAlpbnQgbGluazsKIAlwaHlfaW50ZXJmYWNlX3QgcGh5X2ludGVyZmFjZTsKIAlpbnQgbXNnX2VuYWJsZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JvY2tlci9yb2NrZXIuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JvY2tlci9yb2NrZXIuaAppbmRleCAxYWI5OTVmLi4yZWI5YjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yb2NrZXIvcm9ja2VyLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcm9ja2VyL3JvY2tlci5oCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPG5ldC9uZWlnaGJvdXIuaD4KICNpbmNsdWRlIDxuZXQvc3dpdGNoZGV2Lmg+CiAKQEAgLTUyLDYgKzUzLDkgQEAKIAlzdHJ1Y3Qgcm9ja2VyX2RtYV9yaW5nX2luZm8gcnhfcmluZzsKIH07CiAKK3N0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnRfZGV2X2xvd2VyX2ZpbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHN0cnVjdCByb2NrZXIgKnJvY2tlcik7CisKIHN0cnVjdCByb2NrZXJfd29ybGRfb3BzOwogCiBzdHJ1Y3Qgcm9ja2VyIHsKQEAgLTY2LDYgKzcwLDcgQEAKIAlzcGlubG9ja190IGNtZF9yaW5nX2xvY2s7CQkvKiBmb3IgY21kIHJpbmcgYWNjZXNzZXMgKi8KIAlzdHJ1Y3Qgcm9ja2VyX2RtYV9yaW5nX2luZm8gY21kX3Jpbmc7CiAJc3RydWN0IHJvY2tlcl9kbWFfcmluZ19pbmZvIGV2ZW50X3Jpbmc7CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGZpYl9uYjsKIAlzdHJ1Y3Qgcm9ja2VyX3dvcmxkX29wcyAqd29wczsKIAl2b2lkICp3cHJpdjsKIH07CkBAIC0xMTcsMTEgKzEyMiw2IEBACiAJaW50ICgqcG9ydF9vYmpfdmxhbl9kdW1wKShjb25zdCBzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LAogCQkJCSAgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF92bGFuICp2bGFuLAogCQkJCSAgc3dpdGNoZGV2X29ial9kdW1wX2NiX3QgKmNiKTsKLQlpbnQgKCpwb3J0X29ial9maWI0X2FkZCkoc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCwKLQkJCQkgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgKmZpYjQsCi0JCQkJIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKTsKLQlpbnQgKCpwb3J0X29ial9maWI0X2RlbCkoc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCwKLQkJCQkgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgKmZpYjQpOwogCWludCAoKnBvcnRfb2JqX2ZkYl9hZGQpKHN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQsCiAJCQkJY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYiwKIAkJCQlzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucyk7CkBAIC0xNDEsNiArMTQxLDExIEBACiAJaW50ICgqcG9ydF9ldl9tYWNfdmxhbl9zZWVuKShzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LAogCQkJCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwKIAkJCQkgICAgIF9fYmUxNiB2bGFuX2lkKTsKKwlpbnQgKCpmaWI0X2FkZCkoc3RydWN0IHJvY2tlciAqcm9ja2VyLAorCQkJY29uc3Qgc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvICpmZW5faW5mbyk7CisJaW50ICgqZmliNF9kZWwpKHN0cnVjdCByb2NrZXIgKnJvY2tlciwKKwkJCWNvbnN0IHN0cnVjdCBmaWJfZW50cnlfbm90aWZpZXJfaW5mbyAqZmVuX2luZm8pOworCXZvaWQgKCpmaWI0X2Fib3J0KShzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIpOwogfTsKIAogZXh0ZXJuIHN0cnVjdCByb2NrZXJfd29ybGRfb3BzIHJvY2tlcl9vZmRwYV9vcHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yb2NrZXIvcm9ja2VyX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JvY2tlci9yb2NrZXJfbWFpbi5jCmluZGV4IGYwYjA5YjAuLjU0MjRmYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JvY2tlci9yb2NrZXJfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JvY2tlci9yb2NrZXJfbWFpbi5jCkBAIC0xNjI1LDI5ICsxNjI1LDYgQEAKIH0KIAogc3RhdGljIGludAotcm9ja2VyX3dvcmxkX3BvcnRfb2JqX2ZpYjRfYWRkKHN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgKmZpYjQsCi0JCQkgICAgICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCi17Ci0Jc3RydWN0IHJvY2tlcl93b3JsZF9vcHMgKndvcHMgPSByb2NrZXJfcG9ydC0+cm9ja2VyLT53b3BzOwotCi0JaWYgKCF3b3BzLT5wb3J0X29ial9maWI0X2FkZCkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCXJldHVybiB3b3BzLT5wb3J0X29ial9maWI0X2FkZChyb2NrZXJfcG9ydCwgZmliNCwgdHJhbnMpOwotfQotCi1zdGF0aWMgaW50Ci1yb2NrZXJfd29ybGRfcG9ydF9vYmpfZmliNF9kZWwoc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9pcHY0X2ZpYiAqZmliNCkKLXsKLQlzdHJ1Y3Qgcm9ja2VyX3dvcmxkX29wcyAqd29wcyA9IHJvY2tlcl9wb3J0LT5yb2NrZXItPndvcHM7Ci0KLQlpZiAoIXdvcHMtPnBvcnRfb2JqX2ZpYjRfZGVsKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JcmV0dXJuIHdvcHMtPnBvcnRfb2JqX2ZpYjRfZGVsKHJvY2tlcl9wb3J0LCBmaWI0KTsKLX0KLQotc3RhdGljIGludAogcm9ja2VyX3dvcmxkX3BvcnRfb2JqX2ZkYl9hZGQoc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCwKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCiAJCQkgICAgICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKQEAgLTE3MzMsNiArMTcxMCwzNCBAQAogCXJldHVybiB3b3BzLT5wb3J0X2V2X21hY192bGFuX3NlZW4ocm9ja2VyX3BvcnQsIGFkZHIsIHZsYW5faWQpOwogfQogCitzdGF0aWMgaW50IHJvY2tlcl93b3JsZF9maWI0X2FkZChzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIsCisJCQkJIGNvbnN0IHN0cnVjdCBmaWJfZW50cnlfbm90aWZpZXJfaW5mbyAqZmVuX2luZm8pCit7CisJc3RydWN0IHJvY2tlcl93b3JsZF9vcHMgKndvcHMgPSByb2NrZXItPndvcHM7CisKKwlpZiAoIXdvcHMtPmZpYjRfYWRkKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gd29wcy0+ZmliNF9hZGQocm9ja2VyLCBmZW5faW5mbyk7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2VyX3dvcmxkX2ZpYjRfZGVsKHN0cnVjdCByb2NrZXIgKnJvY2tlciwKKwkJCQkgY29uc3Qgc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvICpmZW5faW5mbykKK3sKKwlzdHJ1Y3Qgcm9ja2VyX3dvcmxkX29wcyAqd29wcyA9IHJvY2tlci0+d29wczsKKworCWlmICghd29wcy0+ZmliNF9kZWwpCisJCXJldHVybiAwOworCXJldHVybiB3b3BzLT5maWI0X2RlbChyb2NrZXIsIGZlbl9pbmZvKTsKK30KKworc3RhdGljIHZvaWQgcm9ja2VyX3dvcmxkX2ZpYjRfYWJvcnQoc3RydWN0IHJvY2tlciAqcm9ja2VyKQoreworCXN0cnVjdCByb2NrZXJfd29ybGRfb3BzICp3b3BzID0gcm9ja2VyLT53b3BzOworCisJaWYgKHdvcHMtPmZpYjRfYWJvcnQpCisJCXdvcHMtPmZpYjRfYWJvcnQocm9ja2VyKTsKK30KKwogLyoqKioqKioqKioqKioqKioqCiAgKiBOZXQgZGV2aWNlIG9wcwogICoqKioqKioqKioqKioqKioqLwpAQCAtMjA5NiwxMSArMjEwMSw2IEBACiAJCQkJCQkgICAgIFNXSVRDSERFVl9PQkpfUE9SVF9WTEFOKG9iaiksCiAJCQkJCQkgICAgIHRyYW5zKTsKIAkJYnJlYWs7Ci0JY2FzZSBTV0lUQ0hERVZfT0JKX0lEX0lQVjRfRklCOgotCQllcnIgPSByb2NrZXJfd29ybGRfcG9ydF9vYmpfZmliNF9hZGQocm9ja2VyX3BvcnQsCi0JCQkJCQkgICAgIFNXSVRDSERFVl9PQkpfSVBWNF9GSUIob2JqKSwKLQkJCQkJCSAgICAgdHJhbnMpOwotCQlicmVhazsKIAljYXNlIFNXSVRDSERFVl9PQkpfSURfUE9SVF9GREI6CiAJCWVyciA9IHJvY2tlcl93b3JsZF9wb3J0X29ial9mZGJfYWRkKHJvY2tlcl9wb3J0LAogCQkJCQkJICAgIFNXSVRDSERFVl9PQkpfUE9SVF9GREIob2JqKSwKQEAgLTIxMjUsMTAgKzIxMjUsNiBAQAogCQllcnIgPSByb2NrZXJfd29ybGRfcG9ydF9vYmpfdmxhbl9kZWwocm9ja2VyX3BvcnQsCiAJCQkJCQkgICAgIFNXSVRDSERFVl9PQkpfUE9SVF9WTEFOKG9iaikpOwogCQlicmVhazsKLQljYXNlIFNXSVRDSERFVl9PQkpfSURfSVBWNF9GSUI6Ci0JCWVyciA9IHJvY2tlcl93b3JsZF9wb3J0X29ial9maWI0X2RlbChyb2NrZXJfcG9ydCwKLQkJCQkJCSAgICAgU1dJVENIREVWX09CSl9JUFY0X0ZJQihvYmopKTsKLQkJYnJlYWs7CiAJY2FzZSBTV0lUQ0hERVZfT0JKX0lEX1BPUlRfRkRCOgogCQllcnIgPSByb2NrZXJfd29ybGRfcG9ydF9vYmpfZmRiX2RlbChyb2NrZXJfcG9ydCwKIAkJCQkJCSAgICBTV0lUQ0hERVZfT0JKX1BPUlRfRkRCKG9iaikpOwpAQCAtMjE3NSw2ICsyMTcxLDMxIEBACiAJLnN3aXRjaGRldl9wb3J0X29ial9kdW1wCT0gcm9ja2VyX3BvcnRfb2JqX2R1bXAsCiB9OwogCitzdGF0aWMgaW50IHJvY2tlcl9yb3V0ZXJfZmliX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJICAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCByb2NrZXIgKnJvY2tlciA9IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IHJvY2tlciwgZmliX25iKTsKKwlzdHJ1Y3QgZmliX2VudHJ5X25vdGlmaWVyX2luZm8gKmZlbl9pbmZvID0gcHRyOworCWludCBlcnI7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBGSUJfRVZFTlRfRU5UUllfQUREOgorCQllcnIgPSByb2NrZXJfd29ybGRfZmliNF9hZGQocm9ja2VyLCBmZW5faW5mbyk7CisJCWlmIChlcnIpCisJCQlyb2NrZXJfd29ybGRfZmliNF9hYm9ydChyb2NrZXIpOworCQllbHNlCisJCWJyZWFrOworCWNhc2UgRklCX0VWRU5UX0VOVFJZX0RFTDoKKwkJcm9ja2VyX3dvcmxkX2ZpYjRfZGVsKHJvY2tlciwgZmVuX2luZm8pOworCQlicmVhazsKKwljYXNlIEZJQl9FVkVOVF9SVUxFX0FERDogLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBGSUJfRVZFTlRfUlVMRV9ERUw6CisJCXJvY2tlcl93b3JsZF9maWI0X2Fib3J0KHJvY2tlcik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKgogICogZXRodG9vbCBpbnRlcmZhY2UKICAqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI0MTIsNyArMjQzMyw3IEBACiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgcm9ja2VyX3BvcnQtPmRldik7CiAKIAlpZiAocnhfZmxhZ3MgJiBST0NLRVJfUlhfRkxBR1NfRldEX09GRkxPQUQpCi0JCXNrYi0+b2ZmbG9hZF9md2RfbWFyayA9IHJvY2tlcl9wb3J0LT5kZXYtPm9mZmxvYWRfZndkX21hcms7CisJCXNrYi0+b2ZmbG9hZF9md2RfbWFyayA9IDE7CiAKIAlyb2NrZXJfcG9ydC0+ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJcm9ja2VyX3BvcnQtPmRldi0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CkBAIC0yNzQwLDYgKzI3NjEsOSBAQAogCQlnb3RvIGVycl9wcm9iZV9wb3J0czsKIAl9CiAKKwlyb2NrZXItPmZpYl9uYi5ub3RpZmllcl9jYWxsID0gcm9ja2VyX3JvdXRlcl9maWJfZXZlbnQ7CisJcmVnaXN0ZXJfZmliX25vdGlmaWVyKCZyb2NrZXItPmZpYl9uYik7CisKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiUm9ja2VyIHN3aXRjaCB3aXRoIGlkICUqcGhOXG4iLAogCQkgKGludClzaXplb2Yocm9ja2VyLT5ody5pZCksICZyb2NrZXItPmh3LmlkKTsKIApAQCAtMjc3MSw2ICsyNzk1LDcgQEAKIHsKIAlzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKKwl1bnJlZ2lzdGVyX2ZpYl9ub3RpZmllcigmcm9ja2VyLT5maWJfbmIpOwogCXJvY2tlcl93cml0ZTMyKHJvY2tlciwgQ09OVFJPTCwgUk9DS0VSX0NPTlRST0xfUkVTRVQpOwogCXJvY2tlcl9yZW1vdmVfcG9ydHMocm9ja2VyKTsKIAlmcmVlX2lycShyb2NrZXJfbXNpeF92ZWN0b3Iocm9ja2VyLCBST0NLRVJfTVNJWF9WRUNfRVZFTlQpLCByb2NrZXIpOwpAQCAtMjc5OSw2ICsyODI0LDM3IEBACiAJcmV0dXJuIGRldi0+bmV0ZGV2X29wcyA9PSAmcm9ja2VyX3BvcnRfbmV0ZGV2X29wczsKIH0KIAorc3RhdGljIGJvb2wgcm9ja2VyX3BvcnRfZGV2X2NoZWNrX3VuZGVyKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCByb2NrZXIgKnJvY2tlcikKK3sKKwlzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0OworCisJaWYgKCFyb2NrZXJfcG9ydF9kZXZfY2hlY2soZGV2KSkKKwkJcmV0dXJuIGZhbHNlOworCisJcm9ja2VyX3BvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCWlmIChyb2NrZXJfcG9ydC0+cm9ja2VyICE9IHJvY2tlcikKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnRfZGV2X2xvd2VyX2ZpbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHN0cnVjdCByb2NrZXIgKnJvY2tlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbG93ZXJfZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7CisKKwlpZiAocm9ja2VyX3BvcnRfZGV2X2NoZWNrX3VuZGVyKGRldiwgcm9ja2VyKSkKKwkJcmV0dXJuIG5ldGRldl9wcml2KGRldik7CisKKwluZXRkZXZfZm9yX2VhY2hfYWxsX2xvd2VyX2RldihkZXYsIGxvd2VyX2RldiwgaXRlcikgeworCQlpZiAocm9ja2VyX3BvcnRfZGV2X2NoZWNrX3VuZGVyKGxvd2VyX2Rldiwgcm9ja2VyKSkKKwkJCXJldHVybiBuZXRkZXZfcHJpdihsb3dlcl9kZXYpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIGludCByb2NrZXJfbmV0ZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkLAogCQkJCSAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcm9ja2VyL3JvY2tlcl9vZmRwYS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcm9ja2VyL3JvY2tlcl9vZmRwYS5jCmluZGV4IDFjYTc5NjMuLjQzMWE2MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JvY2tlci9yb2NrZXJfb2ZkcGEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yb2NrZXIvcm9ja2VyX29mZHBhLmMKQEAgLTk5LDYgKzk5LDcgQEAKIAlzdHJ1Y3Qgb2ZkcGFfZmxvd190Ymxfa2V5IGtleTsKIAlzaXplX3Qga2V5X2xlbjsKIAl1MzIga2V5X2NyYzMyOyAvKiBrZXkgKi8KKwlzdHJ1Y3QgZmliX2luZm8gKmZpOwogfTsKIAogc3RydWN0IG9mZHBhX2dyb3VwX3RibF9lbnRyeSB7CkBAIC0xODksNiArMTkwLDcgQEAKIAlzcGlubG9ja190IG5laWdoX3RibF9sb2NrOwkJLyogZm9yIG5laWdoIHRibCBhY2Nlc3NlcyAqLwogCXUzMiBuZWlnaF90YmxfbmV4dF9pbmRleDsKIAl1bnNpZ25lZCBsb25nIGFnZWluZ190aW1lOworCWJvb2wgZmliX2Fib3J0ZWQ7CiB9OwogCiBzdHJ1Y3Qgb2ZkcGFfcG9ydCB7CkBAIC0xMDQzLDcgKzEwNDUsOCBAQAogCQkJCQkgX19iZTE2IGV0aF90eXBlLCBfX2JlMzIgZHN0LAogCQkJCQkgX19iZTMyIGRzdF9tYXNrLCB1MzIgcHJpb3JpdHksCiAJCQkJCSBlbnVtIHJvY2tlcl9vZl9kcGFfdGFibGVfaWQgZ290b190YmwsCi0JCQkJCSB1MzIgZ3JvdXBfaWQsIGludCBmbGFncykKKwkJCQkJIHUzMiBncm91cF9pZCwgc3RydWN0IGZpYl9pbmZvICpmaSwKKwkJCQkJIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgb2ZkcGFfZmxvd190YmxfZW50cnkgKmVudHJ5OwogCkBAIC0xMDYwLDYgKzEwNjMsNyBAQAogCWVudHJ5LT5rZXkudWNhc3Rfcm91dGluZy5ncm91cF9pZCA9IGdyb3VwX2lkOwogCWVudHJ5LT5rZXlfbGVuID0gb2Zmc2V0b2Yoc3RydWN0IG9mZHBhX2Zsb3dfdGJsX2tleSwKIAkJCQkgIHVjYXN0X3JvdXRpbmcuZ3JvdXBfaWQpOworCWVudHJ5LT5maSA9IGZpOwogCiAJcmV0dXJuIG9mZHBhX2Zsb3dfdGJsX2RvKG9mZHBhX3BvcnQsIHRyYW5zLCBmbGFncywgZW50cnkpOwogfQpAQCAtMTQyNSw3ICsxNDI5LDcgQEAKIAkJCQkJCSAgICBldGhfdHlwZSwgaXBfYWRkciwKIAkJCQkJCSAgICBpbmV0X21ha2VfbWFzaygzMiksCiAJCQkJCQkgICAgcHJpb3JpdHksIGdvdG9fdGJsLAotCQkJCQkJICAgIGdyb3VwX2lkLCBmbGFncyk7CisJCQkJCQkgICAgZ3JvdXBfaWQsIE5VTEwsIGZsYWdzKTsKIAogCQlpZiAoZXJyKQogCQkJbmV0ZGV2X2VycihvZmRwYV9wb3J0LT5kZXYsICJFcnJvciAoJWQpIC8zMiB1bmljYXN0IHJvdXRlICVwSTQgZ3JvdXAgMHglMDh4XG4iLApAQCAtMjM5MCw3ICsyMzk0LDcgQEAKIAogc3RhdGljIGludCBvZmRwYV9wb3J0X2ZpYl9pcHY0KHN0cnVjdCBvZmRwYV9wb3J0ICpvZmRwYV9wb3J0LAogCQkJICAgICAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zLCBfX2JlMzIgZHN0LAotCQkJICAgICAgIGludCBkc3RfbGVuLCBjb25zdCBzdHJ1Y3QgZmliX2luZm8gKmZpLAorCQkJICAgICAgIGludCBkc3RfbGVuLCBzdHJ1Y3QgZmliX2luZm8gKmZpLAogCQkJICAgICAgIHUzMiB0Yl9pZCwgaW50IGZsYWdzKQogewogCWNvbnN0IHN0cnVjdCBmaWJfbmggKm5oOwpAQCAtMjQyNiw3ICsyNDMwLDcgQEAKIAogCWVyciA9IG9mZHBhX2Zsb3dfdGJsX3VjYXN0NF9yb3V0aW5nKG9mZHBhX3BvcnQsIHRyYW5zLCBldGhfdHlwZSwgZHN0LAogCQkJCQkgICAgZHN0X21hc2ssIHByaW9yaXR5LCBnb3RvX3RibCwKLQkJCQkJICAgIGdyb3VwX2lkLCBmbGFncyk7CisJCQkJCSAgICBncm91cF9pZCwgZmksIGZsYWdzKTsKIAlpZiAoZXJyKQogCQluZXRkZXZfZXJyKG9mZHBhX3BvcnQtPmRldiwgIkVycm9yICglZCkgSVB2NCByb3V0ZSAlcEk0XG4iLAogCQkJICAgZXJyLCAmZHN0KTsKQEAgLTI1NTgsNyArMjU2Miw2IEBACiAJc3RydWN0IG9mZHBhX3BvcnQgKm9mZHBhX3BvcnQgPSByb2NrZXJfcG9ydC0+d3ByaXY7CiAJaW50IGVycjsKIAotCXN3aXRjaGRldl9wb3J0X2Z3ZF9tYXJrX3NldChvZmRwYV9wb3J0LT5kZXYsIE5VTEwsIGZhbHNlKTsKIAlyb2NrZXJfcG9ydF9zZXRfbGVhcm5pbmcocm9ja2VyX3BvcnQsCiAJCQkJICEhKG9mZHBhX3BvcnQtPmJycG9ydF9mbGFncyAmIEJSX0xFQVJOSU5HKSk7CiAKQEAgLTI3MTksMjggKzI3MjIsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgb2ZkcGFfcG9ydF9vYmpfZmliNF9hZGQoc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCwKLQkJCQkgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9pcHY0X2ZpYiAqZmliNCwKLQkJCQkgICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKLXsKLQlzdHJ1Y3Qgb2ZkcGFfcG9ydCAqb2ZkcGFfcG9ydCA9IHJvY2tlcl9wb3J0LT53cHJpdjsKLQotCXJldHVybiBvZmRwYV9wb3J0X2ZpYl9pcHY0KG9mZHBhX3BvcnQsIHRyYW5zLAotCQkJCSAgIGh0b25sKGZpYjQtPmRzdCksIGZpYjQtPmRzdF9sZW4sCi0JCQkJICAgZmliNC0+ZmksIGZpYjQtPnRiX2lkLCAwKTsKLX0KLQotc3RhdGljIGludCBvZmRwYV9wb3J0X29ial9maWI0X2RlbChzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliICpmaWI0KQotewotCXN0cnVjdCBvZmRwYV9wb3J0ICpvZmRwYV9wb3J0ID0gcm9ja2VyX3BvcnQtPndwcml2OwotCi0JcmV0dXJuIG9mZHBhX3BvcnRfZmliX2lwdjQob2ZkcGFfcG9ydCwgTlVMTCwKLQkJCQkgICBodG9ubChmaWI0LT5kc3QpLCBmaWI0LT5kc3RfbGVuLAotCQkJCSAgIGZpYjQtPmZpLCBmaWI0LT50Yl9pZCwKLQkJCQkgICBPRkRQQV9PUF9GTEFHX1JFTU9WRSk7Ci19Ci0KIHN0YXRpYyBpbnQgb2ZkcGFfcG9ydF9vYmpfZmRiX2FkZChzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LAogCQkJCSAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYiwKIAkJCQkgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQpAQCAtMjgxNyw3ICsyNzk4LDYgQEAKIAkJb2ZkcGFfcG9ydF9pbnRlcm5hbF92bGFuX2lkX2dldChvZmRwYV9wb3J0LCBicmlkZ2UtPmlmaW5kZXgpOwogCiAJb2ZkcGFfcG9ydC0+YnJpZGdlX2RldiA9IGJyaWRnZTsKLQlzd2l0Y2hkZXZfcG9ydF9md2RfbWFya19zZXQob2ZkcGFfcG9ydC0+ZGV2LCBicmlkZ2UsIHRydWUpOwogCiAJcmV0dXJuIG9mZHBhX3BvcnRfdmxhbl9hZGQob2ZkcGFfcG9ydCwgTlVMTCwgT0ZEUEFfVU5UQUdHRURfVklELCAwKTsKIH0KQEAgLTI4MzYsOCArMjgxNiw2IEBACiAJCW9mZHBhX3BvcnRfaW50ZXJuYWxfdmxhbl9pZF9nZXQob2ZkcGFfcG9ydCwKIAkJCQkJCW9mZHBhX3BvcnQtPmRldi0+aWZpbmRleCk7CiAKLQlzd2l0Y2hkZXZfcG9ydF9md2RfbWFya19zZXQob2ZkcGFfcG9ydC0+ZGV2LCBvZmRwYV9wb3J0LT5icmlkZ2VfZGV2LAotCQkJCSAgICBmYWxzZSk7CiAJb2ZkcGFfcG9ydC0+YnJpZGdlX2RldiA9IE5VTEw7CiAKIAllcnIgPSBvZmRwYV9wb3J0X3ZsYW5fYWRkKG9mZHBhX3BvcnQsIE5VTEwsIE9GRFBBX1VOVEFHR0VEX1ZJRCwgMCk7CkBAIC0yOTI2LDYgKzI5MDQsODIgQEAKIAlyZXR1cm4gb2ZkcGFfcG9ydF9mZGIob2ZkcGFfcG9ydCwgTlVMTCwgYWRkciwgdmxhbl9pZCwgZmxhZ3MpOwogfQogCitzdGF0aWMgc3RydWN0IG9mZHBhX3BvcnQgKm9mZHBhX3BvcnRfZGV2X2xvd2VyX2ZpbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCSAgICBzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIpCit7CisJc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydDsKKworCXJvY2tlcl9wb3J0ID0gcm9ja2VyX3BvcnRfZGV2X2xvd2VyX2ZpbmQoZGV2LCByb2NrZXIpOworCXJldHVybiByb2NrZXJfcG9ydCA/IHJvY2tlcl9wb3J0LT53cHJpdiA6IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgb2ZkcGFfZmliNF9hZGQoc3RydWN0IHJvY2tlciAqcm9ja2VyLAorCQkJICBjb25zdCBzdHJ1Y3QgZmliX2VudHJ5X25vdGlmaWVyX2luZm8gKmZlbl9pbmZvKQoreworCXN0cnVjdCBvZmRwYSAqb2ZkcGEgPSByb2NrZXItPndwcml2OworCXN0cnVjdCBvZmRwYV9wb3J0ICpvZmRwYV9wb3J0OworCWludCBlcnI7CisKKwlpZiAob2ZkcGEtPmZpYl9hYm9ydGVkKQorCQlyZXR1cm4gMDsKKwlvZmRwYV9wb3J0ID0gb2ZkcGFfcG9ydF9kZXZfbG93ZXJfZmluZChmZW5faW5mby0+ZmktPmZpYl9kZXYsIHJvY2tlcik7CisJaWYgKCFvZmRwYV9wb3J0KQorCQlyZXR1cm4gMDsKKwllcnIgPSBvZmRwYV9wb3J0X2ZpYl9pcHY0KG9mZHBhX3BvcnQsIE5VTEwsIGh0b25sKGZlbl9pbmZvLT5kc3QpLAorCQkJCSAgZmVuX2luZm8tPmRzdF9sZW4sIGZlbl9pbmZvLT5maSwKKwkJCQkgIGZlbl9pbmZvLT50Yl9pZCwgMCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlmaWJfaW5mb19vZmZsb2FkX2luYyhmZW5faW5mby0+ZmkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9mZHBhX2ZpYjRfZGVsKHN0cnVjdCByb2NrZXIgKnJvY2tlciwKKwkJCSAgY29uc3Qgc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvICpmZW5faW5mbykKK3sKKwlzdHJ1Y3Qgb2ZkcGEgKm9mZHBhID0gcm9ja2VyLT53cHJpdjsKKwlzdHJ1Y3Qgb2ZkcGFfcG9ydCAqb2ZkcGFfcG9ydDsKKworCWlmIChvZmRwYS0+ZmliX2Fib3J0ZWQpCisJCXJldHVybiAwOworCW9mZHBhX3BvcnQgPSBvZmRwYV9wb3J0X2Rldl9sb3dlcl9maW5kKGZlbl9pbmZvLT5maS0+ZmliX2Rldiwgcm9ja2VyKTsKKwlpZiAoIW9mZHBhX3BvcnQpCisJCXJldHVybiAwOworCWZpYl9pbmZvX29mZmxvYWRfZGVjKGZlbl9pbmZvLT5maSk7CisJcmV0dXJuIG9mZHBhX3BvcnRfZmliX2lwdjQob2ZkcGFfcG9ydCwgTlVMTCwgaHRvbmwoZmVuX2luZm8tPmRzdCksCisJCQkJICAgZmVuX2luZm8tPmRzdF9sZW4sIGZlbl9pbmZvLT5maSwKKwkJCQkgICBmZW5faW5mby0+dGJfaWQsIE9GRFBBX09QX0ZMQUdfUkVNT1ZFKTsKK30KKworc3RhdGljIHZvaWQgb2ZkcGFfZmliNF9hYm9ydChzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIpCit7CisJc3RydWN0IG9mZHBhICpvZmRwYSA9IHJvY2tlci0+d3ByaXY7CisJc3RydWN0IG9mZHBhX3BvcnQgKm9mZHBhX3BvcnQ7CisJc3RydWN0IG9mZHBhX2Zsb3dfdGJsX2VudHJ5ICpmbG93X2VudHJ5OworCXN0cnVjdCBobGlzdF9ub2RlICp0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgYmt0OworCisJaWYgKG9mZHBhLT5maWJfYWJvcnRlZCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9mZHBhLT5mbG93X3RibF9sb2NrLCBmbGFncyk7CisJaGFzaF9mb3JfZWFjaF9zYWZlKG9mZHBhLT5mbG93X3RibCwgYmt0LCB0bXAsIGZsb3dfZW50cnksIGVudHJ5KSB7CisJCWlmIChmbG93X2VudHJ5LT5rZXkudGJsX2lkICE9CisJCSAgICBST0NLRVJfT0ZfRFBBX1RBQkxFX0lEX1VOSUNBU1RfUk9VVElORykKKwkJCWNvbnRpbnVlOworCQlvZmRwYV9wb3J0ID0gb2ZkcGFfcG9ydF9kZXZfbG93ZXJfZmluZChmbG93X2VudHJ5LT5maS0+ZmliX2RldiwKKwkJCQkJCSAgICAgICByb2NrZXIpOworCQlpZiAoIW9mZHBhX3BvcnQpCisJCQljb250aW51ZTsKKwkJZmliX2luZm9fb2ZmbG9hZF9kZWMoZmxvd19lbnRyeS0+ZmkpOworCQlvZmRwYV9mbG93X3RibF9kZWwob2ZkcGFfcG9ydCwgTlVMTCwgT0ZEUEFfT1BfRkxBR19SRU1PVkUsCisJCQkJICAgZmxvd19lbnRyeSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9mZHBhLT5mbG93X3RibF9sb2NrLCBmbGFncyk7CisJb2ZkcGEtPmZpYl9hYm9ydGVkID0gdHJ1ZTsKK30KKwogc3RydWN0IHJvY2tlcl93b3JsZF9vcHMgcm9ja2VyX29mZHBhX29wcyA9IHsKIAkua2luZCA9ICJvZmRwYSIsCiAJLnByaXZfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgb2ZkcGEpLApAQCAtMjk0NSw4ICsyOTk5LDYgQEAKIAkucG9ydF9vYmpfdmxhbl9hZGQgPSBvZmRwYV9wb3J0X29ial92bGFuX2FkZCwKIAkucG9ydF9vYmpfdmxhbl9kZWwgPSBvZmRwYV9wb3J0X29ial92bGFuX2RlbCwKIAkucG9ydF9vYmpfdmxhbl9kdW1wID0gb2ZkcGFfcG9ydF9vYmpfdmxhbl9kdW1wLAotCS5wb3J0X29ial9maWI0X2FkZCA9IG9mZHBhX3BvcnRfb2JqX2ZpYjRfYWRkLAotCS5wb3J0X29ial9maWI0X2RlbCA9IG9mZHBhX3BvcnRfb2JqX2ZpYjRfZGVsLAogCS5wb3J0X29ial9mZGJfYWRkID0gb2ZkcGFfcG9ydF9vYmpfZmRiX2FkZCwKIAkucG9ydF9vYmpfZmRiX2RlbCA9IG9mZHBhX3BvcnRfb2JqX2ZkYl9kZWwsCiAJLnBvcnRfb2JqX2ZkYl9kdW1wID0gb2ZkcGFfcG9ydF9vYmpfZmRiX2R1bXAsCkBAIC0yOTU1LDQgKzMwMDcsNyBAQAogCS5wb3J0X25laWdoX3VwZGF0ZSA9IG9mZHBhX3BvcnRfbmVpZ2hfdXBkYXRlLAogCS5wb3J0X25laWdoX2Rlc3Ryb3kgPSBvZmRwYV9wb3J0X25laWdoX2Rlc3Ryb3ksCiAJLnBvcnRfZXZfbWFjX3ZsYW5fc2VlbiA9IG9mZHBhX3BvcnRfZXZfbWFjX3ZsYW5fc2VlbiwKKwkuZmliNF9hZGQgPSBvZmRwYV9maWI0X2FkZCwKKwkuZmliNF9kZWwgPSBvZmRwYV9maWI0X2RlbCwKKwkuZmliNF9hYm9ydCA9IG9mZHBhX2ZpYjRfYWJvcnQsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmMTAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZjEwLmMKaW5kZXggZjY1OGZlZS4uMDAyNzlkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmMTAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWYxMC5jCkBAIC0xNzcsNyArMTc3LDcgQEAKIAogc3RhdGljIGludCBlZnhfZWYxMF9pbml0X2RhdGFwYXRoX2NhcHMoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKLQlNQ0RJX0RFQ0xBUkVfQlVGKG91dGJ1ZiwgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfT1VUX0xFTik7CisJTUNESV9ERUNMQVJFX0JVRihvdXRidWYsIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9MRU4pOwogCXN0cnVjdCBlZnhfZWYxMF9uaWNfZGF0YSAqbmljX2RhdGEgPSBlZngtPm5pY19kYXRhOwogCXNpemVfdCBvdXRsZW47CiAJaW50IHJjOwpAQCAtMTg4LDcgKzE4OCw3IEBACiAJCQkgIG91dGJ1Ziwgc2l6ZW9mKG91dGJ1ZiksICZvdXRsZW4pOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwotCWlmIChvdXRsZW4gPCBzaXplb2Yob3V0YnVmKSkgeworCWlmIChvdXRsZW4gPCBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19PVVRfTEVOKSB7CiAJCW5ldGlmX2VycihlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAogCQkJICAidW5hYmxlIHRvIHJlYWQgZGF0YXBhdGggZmlybXdhcmUgY2FwYWJpbGl0aWVzXG4iKTsKIAkJcmV0dXJuIC1FSU87CkBAIC0xOTcsNiArMTk3LDEyIEBACiAJbmljX2RhdGEtPmRhdGFwYXRoX2NhcHMgPQogCQlNQ0RJX0RXT1JEKG91dGJ1ZiwgR0VUX0NBUEFCSUxJVElFU19PVVRfRkxBR1MxKTsKIAorCWlmIChvdXRsZW4gPj0gTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX0xFTikKKwkJbmljX2RhdGEtPmRhdGFwYXRoX2NhcHMyID0gTUNESV9EV09SRChvdXRidWYsCisJCQkJR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfRkxBR1MyKTsKKwllbHNlCisJCW5pY19kYXRhLT5kYXRhcGF0aF9jYXBzMiA9IDA7CisKIAkvKiByZWNvcmQgdGhlIERQQ1BVIGZpcm13YXJlIElEcyB0byBkZXRlcm1pbmUgVkVCIHZzd2l0Y2hpbmcgc3VwcG9ydC4KIAkgKi8KIAluaWNfZGF0YS0+cnhfZHBjcHVfZndfaWQgPQpAQCAtMjI3LDYgKzIzMywxMTYgQEAKIAlyZXR1cm4gcmMgPiAwID8gcmMgOiAtRVJBTkdFOwogfQogCitzdGF0aWMgaW50IGVmeF9lZjEwX2dldF90aW1lcl93b3JrYXJvdW5kcyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQoreworCXN0cnVjdCBlZnhfZWYxMF9uaWNfZGF0YSAqbmljX2RhdGEgPSBlZngtPm5pY19kYXRhOworCXVuc2lnbmVkIGludCBpbXBsZW1lbnRlZDsKKwl1bnNpZ25lZCBpbnQgZW5hYmxlZDsKKwlpbnQgcmM7CisKKwluaWNfZGF0YS0+d29ya2Fyb3VuZF8zNTM4OCA9IGZhbHNlOworCW5pY19kYXRhLT53b3JrYXJvdW5kXzYxMjY1ID0gZmFsc2U7CisKKwlyYyA9IGVmeF9tY2RpX2dldF93b3JrYXJvdW5kcyhlZngsICZpbXBsZW1lbnRlZCwgJmVuYWJsZWQpOworCisJaWYgKHJjID09IC1FTk9TWVMpIHsKKwkJLyogRmlybXdhcmUgd2l0aG91dCBHRVRfV09SS0FST1VORFMgLSBub3QgYSBwcm9ibGVtLiAqLworCQlyYyA9IDA7CisJfSBlbHNlIGlmIChyYyA9PSAwKSB7CisJCS8qIEJ1ZzYxMjY1IHdvcmthcm91bmQgaXMgYWx3YXlzIGVuYWJsZWQgaWYgaW1wbGVtZW50ZWQuICovCisJCWlmIChlbmFibGVkICYgTUNfQ01EX0dFVF9XT1JLQVJPVU5EU19PVVRfQlVHNjEyNjUpCisJCQluaWNfZGF0YS0+d29ya2Fyb3VuZF82MTI2NSA9IHRydWU7CisKKwkJaWYgKGVuYWJsZWQgJiBNQ19DTURfR0VUX1dPUktBUk9VTkRTX09VVF9CVUczNTM4OCkgeworCQkJbmljX2RhdGEtPndvcmthcm91bmRfMzUzODggPSB0cnVlOworCQl9IGVsc2UgaWYgKGltcGxlbWVudGVkICYgTUNfQ01EX0dFVF9XT1JLQVJPVU5EU19PVVRfQlVHMzUzODgpIHsKKwkJCS8qIFdvcmthcm91bmQgaXMgaW1wbGVtZW50ZWQgYnV0IG5vdCBlbmFibGVkLgorCQkJICogVHJ5IHRvIGVuYWJsZSBpdC4KKwkJCSAqLworCQkJcmMgPSBlZnhfbWNkaV9zZXRfd29ya2Fyb3VuZChlZngsCisJCQkJCQkgICAgIE1DX0NNRF9XT1JLQVJPVU5EX0JVRzM1Mzg4LAorCQkJCQkJICAgICB0cnVlLCBOVUxMKTsKKwkJCWlmIChyYyA9PSAwKQorCQkJCW5pY19kYXRhLT53b3JrYXJvdW5kXzM1Mzg4ID0gdHJ1ZTsKKwkJCS8qIElmIHdlIGZhaWxlZCB0byBzZXQgdGhlIHdvcmthcm91bmQganVzdCBjYXJyeSBvbi4gKi8KKwkJCXJjID0gMDsKKwkJfQorCX0KKworCW5ldGlmX2RiZyhlZngsIHByb2JlLCBlZngtPm5ldF9kZXYsCisJCSAgIndvcmthcm91bmQgZm9yIGJ1ZyAzNTM4OCBpcyAlc2FibGVkXG4iLAorCQkgIG5pY19kYXRhLT53b3JrYXJvdW5kXzM1Mzg4ID8gImVuIiA6ICJkaXMiKTsKKwluZXRpZl9kYmcoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LAorCQkgICJ3b3JrYXJvdW5kIGZvciBidWcgNjEyNjUgaXMgJXNhYmxlZFxuIiwKKwkJICBuaWNfZGF0YS0+d29ya2Fyb3VuZF82MTI2NSA/ICJlbiIgOiAiZGlzIik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGVmeF9lZjEwX3Byb2Nlc3NfdGltZXJfY29uZmlnKHN0cnVjdCBlZnhfbmljICplZngsCisJCQkJCSAgY29uc3QgZWZ4X2R3b3JkX3QgKmRhdGEpCit7CisJdW5zaWduZWQgaW50IG1heF9jb3VudDsKKworCWlmIChFRlhfRUYxMF9XT1JLQVJPVU5EXzYxMjY1KGVmeCkpIHsKKwkJZWZ4LT50aW1lcl9xdWFudHVtX25zID0gTUNESV9EV09SRChkYXRhLAorCQkJR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfTUNESV9UTVJfU1RFUF9OUyk7CisJCWVmeC0+dGltZXJfbWF4X25zID0gTUNESV9EV09SRChkYXRhLAorCQkJR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfTUNESV9UTVJfTUFYX05TKTsKKwl9IGVsc2UgaWYgKEVGWF9FRjEwX1dPUktBUk9VTkRfMzUzODgoZWZ4KSkgeworCQllZngtPnRpbWVyX3F1YW50dW1fbnMgPSBNQ0RJX0RXT1JEKGRhdGEsCisJCQlHRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9CVUczNTM4OF9UTVJfTlNfUEVSX0NPVU5UKTsKKwkJbWF4X2NvdW50ID0gTUNESV9EV09SRChkYXRhLAorCQkJR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfQlVHMzUzODhfVE1SX01BWF9DT1VOVCk7CisJCWVmeC0+dGltZXJfbWF4X25zID0gbWF4X2NvdW50ICogZWZ4LT50aW1lcl9xdWFudHVtX25zOworCX0gZWxzZSB7CisJCWVmeC0+dGltZXJfcXVhbnR1bV9ucyA9IE1DRElfRFdPUkQoZGF0YSwKKwkJCUdFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX1RNUl9SRUdfTlNfUEVSX0NPVU5UKTsKKwkJbWF4X2NvdW50ID0gTUNESV9EV09SRChkYXRhLAorCQkJR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfVE1SX1JFR19NQVhfQ09VTlQpOworCQllZngtPnRpbWVyX21heF9ucyA9IG1heF9jb3VudCAqIGVmeC0+dGltZXJfcXVhbnR1bV9uczsKKwl9CisKKwluZXRpZl9kYmcoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LAorCQkgICJnb3QgdGltZXIgcHJvcGVydGllcyBmcm9tIE1DOiBxdWFudHVtICV1IG5zOyBtYXggJXUgbnNcbiIsCisJCSAgZWZ4LT50aW1lcl9xdWFudHVtX25zLCBlZngtPnRpbWVyX21heF9ucyk7Cit9CisKK3N0YXRpYyBpbnQgZWZ4X2VmMTBfZ2V0X3RpbWVyX2NvbmZpZyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQoreworCU1DRElfREVDTEFSRV9CVUYob3V0YnVmLCBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfTEVOKTsKKwlpbnQgcmM7CisKKwlyYyA9IGVmeF9lZjEwX2dldF90aW1lcl93b3JrYXJvdW5kcyhlZngpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBlZnhfbWNkaV9ycGNfcXVpZXQoZWZ4LCBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFUywgTlVMTCwgMCwKKwkJCQlvdXRidWYsIHNpemVvZihvdXRidWYpLCBOVUxMKTsKKworCWlmIChyYyA9PSAwKSB7CisJCWVmeF9lZjEwX3Byb2Nlc3NfdGltZXJfY29uZmlnKGVmeCwgb3V0YnVmKTsKKwl9IGVsc2UgaWYgKHJjID09IC1FTk9TWVMgfHwgcmMgPT0gLUVQRVJNKSB7CisJCS8qIE5vdCBhdmFpbGFibGUgLSBmYWxsIGJhY2sgdG8gSHVudGluZ3RvbiBkZWZhdWx0cy4gKi8KKwkJdW5zaWduZWQgaW50IHF1YW50dW07CisKKwkJcmMgPSBlZnhfZWYxMF9nZXRfc3lzY2xrX2ZyZXEoZWZ4KTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQlxdWFudHVtID0gMTUzNjAwMCAvIHJjOyAvKiAxNTM2IGN5Y2xlcyAqLworCQllZngtPnRpbWVyX3F1YW50dW1fbnMgPSBxdWFudHVtOworCQllZngtPnRpbWVyX21heF9ucyA9IGVmeC0+dHlwZS0+dGltZXJfcGVyaW9kX21heCAqIHF1YW50dW07CisJCXJjID0gMDsKKwl9IGVsc2UgeworCQllZnhfbWNkaV9kaXNwbGF5X2Vycm9yKGVmeCwgTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVMsCisJCQkJICAgICAgIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9MRU4sCisJCQkJICAgICAgIE5VTEwsIDAsIHJjKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKIHN0YXRpYyBpbnQgZWZ4X2VmMTBfZ2V0X21hY19hZGRyZXNzX3BmKHN0cnVjdCBlZnhfbmljICplZngsIHU4ICptYWNfYWRkcmVzcykKIHsKIAlNQ0RJX0RFQ0xBUkVfQlVGKG91dGJ1ZiwgTUNfQ01EX0dFVF9NQUNfQUREUkVTU0VTX09VVF9MRU4pOwpAQCAtNTI3LDMyICs2NDMsOSBAQAogCWlmIChyYykKIAkJZ290byBmYWlsNTsKIAotCXJjID0gZWZ4X2VmMTBfZ2V0X3N5c2Nsa19mcmVxKGVmeCk7CisJcmMgPSBlZnhfZWYxMF9nZXRfdGltZXJfY29uZmlnKGVmeCk7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBmYWlsNTsKLQllZngtPnRpbWVyX3F1YW50dW1fbnMgPSAxNTM2MDAwIC8gcmM7IC8qIDE1MzYgY3ljbGVzICovCi0KLQkvKiBDaGVjayB3aGV0aGVyIGZpcm13YXJlIHN1cHBvcnRzIGJ1ZyAzNTM4OCB3b3JrYXJvdW5kLgotCSAqIEZpcnN0IHRyeSB0byBlbmFibGUgaXQsIHRoZW4gaWYgd2UgZ2V0IEVQRVJNLCBqdXN0Ci0JICogYXNrIGlmIGl0J3MgYWxyZWFkeSBlbmFibGVkCi0JICovCi0JcmMgPSBlZnhfbWNkaV9zZXRfd29ya2Fyb3VuZChlZngsIE1DX0NNRF9XT1JLQVJPVU5EX0JVRzM1Mzg4LCB0cnVlLCBOVUxMKTsKLQlpZiAocmMgPT0gMCkgewotCQluaWNfZGF0YS0+d29ya2Fyb3VuZF8zNTM4OCA9IHRydWU7Ci0JfSBlbHNlIGlmIChyYyA9PSAtRVBFUk0pIHsKLQkJdW5zaWduZWQgaW50IGVuYWJsZWQ7Ci0KLQkJcmMgPSBlZnhfbWNkaV9nZXRfd29ya2Fyb3VuZHMoZWZ4LCBOVUxMLCAmZW5hYmxlZCk7Ci0JCWlmIChyYykKLQkJCWdvdG8gZmFpbDM7Ci0JCW5pY19kYXRhLT53b3JrYXJvdW5kXzM1Mzg4ID0gZW5hYmxlZCAmCi0JCQlNQ19DTURfR0VUX1dPUktBUk9VTkRTX09VVF9CVUczNTM4ODsKLQl9IGVsc2UgaWYgKHJjICE9IC1FTk9TWVMgJiYgcmMgIT0gLUVOT0VOVCkgewotCQlnb3RvIGZhaWw1OwotCX0KLQluZXRpZl9kYmcoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LAotCQkgICJ3b3JrYXJvdW5kIGZvciBidWcgMzUzODggaXMgJXNhYmxlZFxuIiwKLQkJICBuaWNfZGF0YS0+d29ya2Fyb3VuZF8zNTM4OCA/ICJlbiIgOiAiZGlzIik7CiAKIAlyYyA9IGVmeF9tY2RpX21vbl9wcm9iZShlZngpOwogCWlmIChyYyAmJiByYyAhPSAtRVBFUk0pCkBAIC0xNDQwLDkgKzE1MzMsMTAgQEAKIAkJCSAgICAgICAoMVVMTCA8PCBHRU5FUklDX1NUQVRfcnhfbm9kZXNjX3RydW5jKSB8CVwKIAkJCSAgICAgICAoMVVMTCA8PCBHRU5FUklDX1NUQVRfcnhfbm9za2JfZHJvcHMpKQogCi0vKiBUaGVzZSBzdGF0aXN0aWNzIGFyZSBvbmx5IHByb3ZpZGVkIGJ5IHRoZSAxMEcgTUFDLiAgRm9yIGEgMTBHLzQwRwotICogc3dpdGNoYWJsZSBwb3J0IHdlIGRvIG5vdCBleHBvc2UgdGhlc2UgYmVjYXVzZSB0aGV5IG1pZ2h0IG5vdAotICogaW5jbHVkZSBhbGwgdGhlIHBhY2tldHMgdGhleSBzaG91bGQuCisvKiBPbiA3MDAwIHNlcmllcyBOSUNzLCB0aGVzZSBzdGF0aXN0aWNzIGFyZSBvbmx5IHByb3ZpZGVkIGJ5IHRoZSAxMEcgTUFDLgorICogRm9yIGEgMTBHLzQwRyBzd2l0Y2hhYmxlIHBvcnQgd2UgZG8gbm90IGV4cG9zZSB0aGVzZSBiZWNhdXNlIHRoZXkgbWlnaHQKKyAqIG5vdCBpbmNsdWRlIGFsbCB0aGUgcGFja2V0cyB0aGV5IHNob3VsZC4KKyAqIE9uIDgwMDAgc2VyaWVzIE5JQ3MgdGhlc2Ugc3RhdGlzdGljcyBhcmUgYWx3YXlzIHByb3ZpZGVkLgogICovCiAjZGVmaW5lIEhVTlRfMTBHX09OTFlfU1RBVF9NQVNLICgoMVVMTCA8PCBFRjEwX1NUQVRfcG9ydF90eF9jb250cm9sKSB8CVwKIAkJCQkgKDFVTEwgPDwgRUYxMF9TVEFUX3BvcnRfdHhfbHQ2NCkgfAlcCkBAIC0xNDg4LDEwICsxNTgyLDE1IEBACiAJICAgICAgMSA8PCBNQ19DTURfRFJWX0FUVEFDSF9FWFRfT1VUX0ZMQUdfTElOS0NUUkwpKQogCQlyZXR1cm4gMDsKIAotCWlmIChwb3J0X2NhcHMgJiAoMSA8PCBNQ19DTURfUEhZX0NBUF80MDAwMEZEWF9MQk4pKQorCWlmIChwb3J0X2NhcHMgJiAoMSA8PCBNQ19DTURfUEhZX0NBUF80MDAwMEZEWF9MQk4pKSB7CiAJCXJhd19tYXNrIHw9IEhVTlRfNDBHX0VYVFJBX1NUQVRfTUFTSzsKLQllbHNlCisJCS8qIDgwMDAgc2VyaWVzIGhhdmUgZXZlcnl0aGluZyBldmVuIGF0IDQwRyAqLworCQlpZiAobmljX2RhdGEtPmRhdGFwYXRoX2NhcHMyICYKKwkJICAgICgxIDw8IE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9NQUNfU1RBVFNfNDBHX1RYX1NJWkVfQklOU19MQk4pKQorCQkJcmF3X21hc2sgfD0gSFVOVF8xMEdfT05MWV9TVEFUX01BU0s7CisJfSBlbHNlIHsKIAkJcmF3X21hc2sgfD0gSFVOVF8xMEdfT05MWV9TVEFUX01BU0s7CisJfQogCiAJaWYgKG5pY19kYXRhLT5kYXRhcGF0aF9jYXBzICYKIAkgICAgKDEgPDwgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfT1VUX1BNX0FORF9SWERQX0NPVU5URVJTX0xCTikpCkBAIC0xNTE3LDEzICsxNjE2LDE0IEBACiAJfQogCiAjaWYgQklUU19QRVJfTE9ORyA9PSA2NAorCUJVSUxEX0JVR19PTihCSVRTX1RPX0xPTkdTKEVGMTBfU1RBVF9DT1VOVCkgIT0gMik7CiAJbWFza1swXSA9IHJhd19tYXNrWzBdOwogCW1hc2tbMV0gPSByYXdfbWFza1sxXTsKICNlbHNlCisJQlVJTERfQlVHX09OKEJJVFNfVE9fTE9OR1MoRUYxMF9TVEFUX0NPVU5UKSAhPSAzKTsKIAltYXNrWzBdID0gcmF3X21hc2tbMF0gJiAweGZmZmZmZmZmOwogCW1hc2tbMV0gPSByYXdfbWFza1swXSA+PiAzMjsKIAltYXNrWzJdID0gcmF3X21hc2tbMV0gJiAweGZmZmZmZmZmOwotCW1hc2tbM10gPSByYXdfbWFza1sxXSA+PiAzMjsKICNlbmRpZgogfQogCkBAIC0xNjE2LDcgKzE3MTYsNiBAQAogCWVmeF9lZjEwX2dldF9zdGF0X21hc2soZWZ4LCBtYXNrKTsKIAogCWRtYV9zdGF0cyA9IGVmeC0+c3RhdHNfYnVmZmVyLmFkZHI7Ci0JbmljX2RhdGEgPSBlZngtPm5pY19kYXRhOwogCiAJZ2VuZXJhdGlvbl9lbmQgPSBkbWFfc3RhdHNbTUNfQ01EX01BQ19HRU5FUkFUSU9OX0VORF07CiAJaWYgKGdlbmVyYXRpb25fZW5kID09IEVGWF9NQ19TVEFUU19HRU5FUkFUSU9OX0lOVkFMSUQpCkBAIC0xNzQzLDI3ICsxODQyLDQzIEBACiBzdGF0aWMgdm9pZCBlZnhfZWYxMF9wdXNoX2lycV9tb2RlcmF0aW9uKHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gY2hhbm5lbC0+ZWZ4OwotCXVuc2lnbmVkIGludCBtb2RlLCB2YWx1ZTsKKwl1bnNpZ25lZCBpbnQgbW9kZSwgdXNlY3M7CiAJZWZ4X2R3b3JkX3QgdGltZXJfY21kOwogCi0JaWYgKGNoYW5uZWwtPmlycV9tb2RlcmF0aW9uKSB7CisJaWYgKGNoYW5uZWwtPmlycV9tb2RlcmF0aW9uX3VzKSB7CiAJCW1vZGUgPSAzOwotCQl2YWx1ZSA9IGNoYW5uZWwtPmlycV9tb2RlcmF0aW9uIC0gMTsKKwkJdXNlY3MgPSBjaGFubmVsLT5pcnFfbW9kZXJhdGlvbl91czsKIAl9IGVsc2UgewogCQltb2RlID0gMDsKLQkJdmFsdWUgPSAwOworCQl1c2VjcyA9IDA7CiAJfQogCi0JaWYgKEVGWF9FRjEwX1dPUktBUk9VTkRfMzUzODgoZWZ4KSkgeworCWlmIChFRlhfRUYxMF9XT1JLQVJPVU5EXzYxMjY1KGVmeCkpIHsKKwkJTUNESV9ERUNMQVJFX0JVRihpbmJ1ZiwgTUNfQ01EX1NFVF9FVlFfVE1SX0lOX0xFTik7CisJCXVuc2lnbmVkIGludCBucyA9IHVzZWNzICogMTAwMDsKKworCQlNQ0RJX1NFVF9EV09SRChpbmJ1ZiwgU0VUX0VWUV9UTVJfSU5fSU5TVEFOQ0UsCisJCQkgICAgICAgY2hhbm5lbC0+Y2hhbm5lbCk7CisJCU1DRElfU0VUX0RXT1JEKGluYnVmLCBTRVRfRVZRX1RNUl9JTl9UTVJfTE9BRF9SRVFfTlMsIG5zKTsKKwkJTUNESV9TRVRfRFdPUkQoaW5idWYsIFNFVF9FVlFfVE1SX0lOX1RNUl9SRUxPQURfUkVRX05TLCBucyk7CisJCU1DRElfU0VUX0RXT1JEKGluYnVmLCBTRVRfRVZRX1RNUl9JTl9UTVJfTU9ERSwgbW9kZSk7CisKKwkJZWZ4X21jZGlfcnBjX2FzeW5jKGVmeCwgTUNfQ01EX1NFVF9FVlFfVE1SLAorCQkJCSAgIGluYnVmLCBzaXplb2YoaW5idWYpLCAwLCBOVUxMLCAwKTsKKwl9IGVsc2UgaWYgKEVGWF9FRjEwX1dPUktBUk9VTkRfMzUzODgoZWZ4KSkgeworCQl1bnNpZ25lZCBpbnQgdGlja3MgPSBlZnhfdXNlY3NfdG9fdGlja3MoZWZ4LCB1c2Vjcyk7CisKIAkJRUZYX1BPUFVMQVRFX0RXT1JEXzModGltZXJfY21kLCBFUkZfRERfRVZRX0lORF9USU1FUl9GTEFHUywKIAkJCQkgICAgIEVGRV9ERF9FVlFfSU5EX1RJTUVSX0ZMQUdTLAogCQkJCSAgICAgRVJGX0REX0VWUV9JTkRfVElNRVJfTU9ERSwgbW9kZSwKLQkJCQkgICAgIEVSRl9ERF9FVlFfSU5EX1RJTUVSX1ZBTCwgdmFsdWUpOworCQkJCSAgICAgRVJGX0REX0VWUV9JTkRfVElNRVJfVkFMLCB0aWNrcyk7CiAJCWVmeF93cml0ZWRfcGFnZShlZngsICZ0aW1lcl9jbWQsIEVSX0REX0VWUV9JTkRJUkVDVCwKIAkJCQljaGFubmVsLT5jaGFubmVsKTsKIAl9IGVsc2UgeworCQl1bnNpZ25lZCBpbnQgdGlja3MgPSBlZnhfdXNlY3NfdG9fdGlja3MoZWZ4LCB1c2Vjcyk7CisKIAkJRUZYX1BPUFVMQVRFX0RXT1JEXzIodGltZXJfY21kLCBFUkZfRFpfVENfVElNRVJfTU9ERSwgbW9kZSwKLQkJCQkgICAgIEVSRl9EWl9UQ19USU1FUl9WQUwsIHZhbHVlKTsKKwkJCQkgICAgIEVSRl9EWl9UQ19USU1FUl9WQUwsIHRpY2tzKTsKIAkJZWZ4X3dyaXRlZF9wYWdlKGVmeCwgJnRpbWVyX2NtZCwgRVJfRFpfRVZRX1RNUiwKIAkJCQljaGFubmVsLT5jaGFubmVsKTsKIAl9CkBAIC0xOTM0LDE0ICsyMDQ5LDE4IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgdm9pZCBlZnhfZWYxMF9pcnFfdGVzdF9nZW5lcmF0ZShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQorc3RhdGljIGludCBlZnhfZWYxMF9pcnFfdGVzdF9nZW5lcmF0ZShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewogCU1DRElfREVDTEFSRV9CVUYoaW5idWYsIE1DX0NNRF9UUklHR0VSX0lOVEVSUlVQVF9JTl9MRU4pOwogCisJaWYgKGVmeF9tY2RpX3NldF93b3JrYXJvdW5kKGVmeCwgTUNfQ01EX1dPUktBUk9VTkRfQlVHNDE3NTAsIHRydWUsCisJCQkJICAgIE5VTEwpID09IDApCisJCXJldHVybiAtRU5PVFNVUFA7CisKIAlCVUlMRF9CVUdfT04oTUNfQ01EX1RSSUdHRVJfSU5URVJSVVBUX09VVF9MRU4gIT0gMCk7CiAKIAlNQ0RJX1NFVF9EV09SRChpbmJ1ZiwgVFJJR0dFUl9JTlRFUlJVUFRfSU5fSU5UUl9MRVZFTCwgZWZ4LT5pcnFfbGV2ZWwpOwotCSh2b2lkKSBlZnhfbWNkaV9ycGMoZWZ4LCBNQ19DTURfVFJJR0dFUl9JTlRFUlJVUFQsCisJcmV0dXJuIGVmeF9tY2RpX3JwYyhlZngsIE1DX0NNRF9UUklHR0VSX0lOVEVSUlVQVCwKIAkJCSAgICBpbmJ1Ziwgc2l6ZW9mKGluYnVmKSwgTlVMTCwgMCwgTlVMTCk7CiB9CiAKQEAgLTI1MzUsMTMgKzI2NTQsMTIgQEAKIHN0YXRpYyBpbnQgZWZ4X2VmMTBfZXZfaW5pdChzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJTUNESV9ERUNMQVJFX0JVRihpbmJ1ZiwKLQkJCSBNQ19DTURfSU5JVF9FVlFfSU5fTEVOKEVGWF9NQVhfRVZRX1NJWkUgKiA4IC8KLQkJCQkJCUVGWF9CVUZfU0laRSkpOwotCU1DRElfREVDTEFSRV9CVUYob3V0YnVmLCBNQ19DTURfSU5JVF9FVlFfT1VUX0xFTik7CisJCQkgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0xFTihFRlhfTUFYX0VWUV9TSVpFICogOCAvCisJCQkJCQkgICBFRlhfQlVGX1NJWkUpKTsKKwlNQ0RJX0RFQ0xBUkVfQlVGKG91dGJ1ZiwgTUNfQ01EX0lOSVRfRVZRX1YyX09VVF9MRU4pOwogCXNpemVfdCBlbnRyaWVzID0gY2hhbm5lbC0+ZXZlbnRxLmJ1Zi5sZW4gLyBFRlhfQlVGX1NJWkU7CiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IGNoYW5uZWwtPmVmeDsKIAlzdHJ1Y3QgZWZ4X2VmMTBfbmljX2RhdGEgKm5pY19kYXRhOwotCWJvb2wgc3VwcG9ydHNfcnhfbWVyZ2U7CiAJc2l6ZV90IGlubGVuLCBvdXRsZW47CiAJdW5zaWduZWQgaW50IGVuYWJsZWQsIGltcGxlbWVudGVkOwogCWRtYV9hZGRyX3QgZG1hX2FkZHI7CkBAIC0yNTQ5LDkgKzI2NjcsNiBAQAogCWludCBpOwogCiAJbmljX2RhdGEgPSBlZngtPm5pY19kYXRhOwotCXN1cHBvcnRzX3J4X21lcmdlID0KLQkJISEobmljX2RhdGEtPmRhdGFwYXRoX2NhcHMgJgotCQkgICAxIDw8IE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX09VVF9SWF9CQVRDSElOR19MQk4pOwogCiAJLyogRmlsbCBldmVudCBxdWV1ZSB3aXRoIGFsbCBvbmVzIChpLmUuIGVtcHR5IGV2ZW50cykgKi8KIAltZW1zZXQoY2hhbm5lbC0+ZXZlbnRxLmJ1Zi5hZGRyLCAweGZmLCBjaGFubmVsLT5ldmVudHEuYnVmLmxlbik7CkBAIC0yNTYwLDExICsyNjc1LDYgQEAKIAlNQ0RJX1NFVF9EV09SRChpbmJ1ZiwgSU5JVF9FVlFfSU5fSU5TVEFOQ0UsIGNoYW5uZWwtPmNoYW5uZWwpOwogCS8qIElOSVRfRVZRIGV4cGVjdHMgaW5kZXggaW4gdmVjdG9yIHRhYmxlLCBub3QgYWJzb2x1dGUgKi8KIAlNQ0RJX1NFVF9EV09SRChpbmJ1ZiwgSU5JVF9FVlFfSU5fSVJRX05VTSwgY2hhbm5lbC0+Y2hhbm5lbCk7Ci0JTUNESV9QT1BVTEFURV9EV09SRF80KGluYnVmLCBJTklUX0VWUV9JTl9GTEFHUywKLQkJCSAgICAgIElOSVRfRVZRX0lOX0ZMQUdfSU5URVJSVVBUSU5HLCAxLAotCQkJICAgICAgSU5JVF9FVlFfSU5fRkxBR19SWF9NRVJHRSwgMSwKLQkJCSAgICAgIElOSVRfRVZRX0lOX0ZMQUdfVFhfTUVSR0UsIDEsCi0JCQkgICAgICBJTklUX0VWUV9JTl9GTEFHX0NVVF9USFJVLCAhc3VwcG9ydHNfcnhfbWVyZ2UpOwogCU1DRElfU0VUX0RXT1JEKGluYnVmLCBJTklUX0VWUV9JTl9UTVJfTU9ERSwKIAkJICAgICAgIE1DX0NNRF9JTklUX0VWUV9JTl9UTVJfTU9ERV9ESVMpOwogCU1DRElfU0VUX0RXT1JEKGluYnVmLCBJTklUX0VWUV9JTl9UTVJfTE9BRCwgMCk7CkBAIC0yNTczLDYgKzI2ODMsMjcgQEAKIAkJICAgICAgIE1DX0NNRF9JTklUX0VWUV9JTl9DT1VOVF9NT0RFX0RJUyk7CiAJTUNESV9TRVRfRFdPUkQoaW5idWYsIElOSVRfRVZRX0lOX0NPVU5UX1RIUlNITEQsIDApOwogCisJaWYgKG5pY19kYXRhLT5kYXRhcGF0aF9jYXBzMiAmCisJICAgIDEgPDwgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX0lOSVRfRVZRX1YyX0xCTikgeworCQkvKiBVc2UgdGhlIG5ldyBnZW5lcmljIGFwcHJvYWNoIHRvIHNwZWNpZnlpbmcgZXZlbnQgcXVldWUKKwkJICogY29uZmlndXJhdGlvbiwgcmVxdWVzdGluZyBsb3dlciBsYXRlbmN5IG9yIGhpZ2hlciB0aHJvdWdocHV0LgorCQkgKiBUaGUgb3B0aW9ucyB0aGF0IGFjdHVhbGx5IGdldCB1c2VkIGFwcGVhciBpbiB0aGUgb3V0cHV0LgorCQkgKi8KKwkJTUNESV9QT1BVTEFURV9EV09SRF8yKGluYnVmLCBJTklUX0VWUV9WMl9JTl9GTEFHUywKKwkJCQkgICAgICBJTklUX0VWUV9WMl9JTl9GTEFHX0lOVEVSUlVQVElORywgMSwKKwkJCQkgICAgICBJTklUX0VWUV9WMl9JTl9GTEFHX1RZUEUsCisJCQkJICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfVFlQRV9BVVRPKTsKKwl9IGVsc2UgeworCQlib29sIGN1dF90aHJ1ID0gIShuaWNfZGF0YS0+ZGF0YXBhdGhfY2FwcyAmCisJCQkxIDw8IE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX09VVF9SWF9CQVRDSElOR19MQk4pOworCisJCU1DRElfUE9QVUxBVEVfRFdPUkRfNChpbmJ1ZiwgSU5JVF9FVlFfSU5fRkxBR1MsCisJCQkJICAgICAgSU5JVF9FVlFfSU5fRkxBR19JTlRFUlJVUFRJTkcsIDEsCisJCQkJICAgICAgSU5JVF9FVlFfSU5fRkxBR19SWF9NRVJHRSwgMSwKKwkJCQkgICAgICBJTklUX0VWUV9JTl9GTEFHX1RYX01FUkdFLCAxLAorCQkJCSAgICAgIElOSVRfRVZRX0lOX0ZMQUdfQ1VUX1RIUlUsIGN1dF90aHJ1KTsKKwl9CisKIAlkbWFfYWRkciA9IGNoYW5uZWwtPmV2ZW50cS5idWYuZG1hX2FkZHI7CiAJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7ICsraSkgewogCQlNQ0RJX1NFVF9BUlJBWV9RV09SRChpbmJ1ZiwgSU5JVF9FVlFfSU5fRE1BX0FERFIsIGksIGRtYV9hZGRyKTsKQEAgLTI1ODMsNiArMjcxNCwxMyBAQAogCiAJcmMgPSBlZnhfbWNkaV9ycGMoZWZ4LCBNQ19DTURfSU5JVF9FVlEsIGluYnVmLCBpbmxlbiwKIAkJCSAgb3V0YnVmLCBzaXplb2Yob3V0YnVmKSwgJm91dGxlbik7CisKKwlpZiAob3V0bGVuID49IE1DX0NNRF9JTklUX0VWUV9WMl9PVVRfTEVOKQorCQluZXRpZl9kYmcoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCSAgIkNoYW5uZWwgJWQgdXNpbmcgZXZlbnQgcXVldWUgZmxhZ3MgJTA4eFxuIiwKKwkJCSAgY2hhbm5lbC0+Y2hhbm5lbCwKKwkJCSAgTUNESV9EV09SRChvdXRidWYsIElOSVRfRVZRX1YyX09VVF9GTEFHUykpOworCiAJLyogSVJRIHJldHVybiBpcyBpZ25vcmVkICovCiAJaWYgKGNoYW5uZWwtPmNoYW5uZWwgfHwgcmMpCiAJCXJldHVybiByYzsKQEAgLTI1OTAsOCArMjcyOCw4IEBACiAJLyogU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgZXZlbnQgcXVldWUgb24gY2hhbm5lbCAwICovCiAJcmMgPSBlZnhfbWNkaV9nZXRfd29ya2Fyb3VuZHMoZWZ4LCAmaW1wbGVtZW50ZWQsICZlbmFibGVkKTsKIAlpZiAocmMgPT0gLUVOT1NZUykgewotCQkvKiBHRVRfV09SS0FST1VORFMgd2FzIGltcGxlbWVudGVkIGJlZm9yZSB0aGUgYnVnMjY4MDcKLQkJICogd29ya2Fyb3VuZCwgdGh1cyB0aGUgbGF0dGVyIG11c3QgYmUgdW5hdmFpbGFibGUgaW4gdGhpcyBmdworCQkvKiBHRVRfV09SS0FST1VORFMgd2FzIGltcGxlbWVudGVkIGJlZm9yZSB0aGlzIHdvcmthcm91bmQsCisJCSAqIHRodXMgaXQgbXVzdCBiZSB1bmF2YWlsYWJsZSBpbiB0aGlzIGZpcm13YXJlLgogCQkgKi8KIAkJbmljX2RhdGEtPndvcmthcm91bmRfMjY4MDcgPSBmYWxzZTsKIAkJcmMgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5jCmluZGV4IDE0YjgyMWIuLjNjZjM1NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmMKQEAgLTI4MSw2ICsyODEsMjcgQEAKICAqIE5BUEkgZ3VhcmFudGVlcyBzZXJpYWxpc2F0aW9uIG9mIHBvbGxzIG9mIHRoZSBzYW1lIGRldmljZSwgd2hpY2gKICAqIHByb3ZpZGVzIHRoZSBndWFyYW50ZWUgcmVxdWlyZWQgYnkgZWZ4X3Byb2Nlc3NfY2hhbm5lbCgpLgogICovCitzdGF0aWMgdm9pZCBlZnhfdXBkYXRlX2lycV9tb2Qoc3RydWN0IGVmeF9uaWMgKmVmeCwgc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsKQoreworCWludCBzdGVwID0gZWZ4LT5pcnFfbW9kX3N0ZXBfdXM7CisKKwlpZiAoY2hhbm5lbC0+aXJxX21vZF9zY29yZSA8IGlycV9hZGFwdF9sb3dfdGhyZXNoKSB7CisJCWlmIChjaGFubmVsLT5pcnFfbW9kZXJhdGlvbl91cyA+IHN0ZXApIHsKKwkJCWNoYW5uZWwtPmlycV9tb2RlcmF0aW9uX3VzIC09IHN0ZXA7CisJCQllZngtPnR5cGUtPnB1c2hfaXJxX21vZGVyYXRpb24oY2hhbm5lbCk7CisJCX0KKwl9IGVsc2UgaWYgKGNoYW5uZWwtPmlycV9tb2Rfc2NvcmUgPiBpcnFfYWRhcHRfaGlnaF90aHJlc2gpIHsKKwkJaWYgKGNoYW5uZWwtPmlycV9tb2RlcmF0aW9uX3VzIDwKKwkJICAgIGVmeC0+aXJxX3J4X21vZGVyYXRpb25fdXMpIHsKKwkJCWNoYW5uZWwtPmlycV9tb2RlcmF0aW9uX3VzICs9IHN0ZXA7CisJCQllZngtPnR5cGUtPnB1c2hfaXJxX21vZGVyYXRpb24oY2hhbm5lbCk7CisJCX0KKwl9CisKKwljaGFubmVsLT5pcnFfY291bnQgPSAwOworCWNoYW5uZWwtPmlycV9tb2Rfc2NvcmUgPSAwOworfQorCiBzdGF0aWMgaW50IGVmeF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKIHsKIAlzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwgPQpAQCAtMzAxLDIyICszMjIsNyBAQAogCQlpZiAoZWZ4X2NoYW5uZWxfaGFzX3J4X3F1ZXVlKGNoYW5uZWwpICYmCiAJCSAgICBlZngtPmlycV9yeF9hZGFwdGl2ZSAmJgogCQkgICAgdW5saWtlbHkoKytjaGFubmVsLT5pcnFfY291bnQgPT0gMTAwMCkpIHsKLQkJCWlmICh1bmxpa2VseShjaGFubmVsLT5pcnFfbW9kX3Njb3JlIDwKLQkJCQkgICAgIGlycV9hZGFwdF9sb3dfdGhyZXNoKSkgewotCQkJCWlmIChjaGFubmVsLT5pcnFfbW9kZXJhdGlvbiA+IDEpIHsKLQkJCQkJY2hhbm5lbC0+aXJxX21vZGVyYXRpb24gLT0gMTsKLQkJCQkJZWZ4LT50eXBlLT5wdXNoX2lycV9tb2RlcmF0aW9uKGNoYW5uZWwpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAodW5saWtlbHkoY2hhbm5lbC0+aXJxX21vZF9zY29yZSA+Ci0JCQkJCSAgICBpcnFfYWRhcHRfaGlnaF90aHJlc2gpKSB7Ci0JCQkJaWYgKGNoYW5uZWwtPmlycV9tb2RlcmF0aW9uIDwKLQkJCQkgICAgZWZ4LT5pcnFfcnhfbW9kZXJhdGlvbikgewotCQkJCQljaGFubmVsLT5pcnFfbW9kZXJhdGlvbiArPSAxOwotCQkJCQllZngtPnR5cGUtPnB1c2hfaXJxX21vZGVyYXRpb24oY2hhbm5lbCk7Ci0JCQkJfQotCQkJfQotCQkJY2hhbm5lbC0+aXJxX2NvdW50ID0gMDsKLQkJCWNoYW5uZWwtPmlycV9tb2Rfc2NvcmUgPSAwOworCQkJZWZ4X3VwZGF0ZV9pcnFfbW9kKGVmeCwgY2hhbm5lbCk7CiAJCX0KIAogCQllZnhfZmlsdGVyX3Jmc19leHBpcmUoY2hhbm5lbCk7CkBAIC0xNzAzLDYgKzE3MDksNyBAQAogCW5ldGlmX3NldF9yZWFsX251bV9yeF9xdWV1ZXMoZWZ4LT5uZXRfZGV2LCBlZngtPm5fcnhfY2hhbm5lbHMpOwogCiAJLyogSW5pdGlhbGlzZSB0aGUgaW50ZXJydXB0IG1vZGVyYXRpb24gc2V0dGluZ3MgKi8KKwllZngtPmlycV9tb2Rfc3RlcF91cyA9IERJVl9ST1VORF9VUChlZngtPnRpbWVyX3F1YW50dW1fbnMsIDEwMDApOwogCWVmeF9pbml0X2lycV9tb2RlcmF0aW9uKGVmeCwgdHhfaXJxX21vZF91c2VjLCByeF9pcnFfbW9kX3VzZWMsIHRydWUsCiAJCQkJdHJ1ZSk7CiAKQEAgLTE5NDksMTQgKzE5NTYsMjEgQEAKICAqIEludGVycnVwdCBtb2RlcmF0aW9uCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGlycV9tb2RfdGlja3ModW5zaWduZWQgaW50IHVzZWNzLCB1bnNpZ25lZCBpbnQgcXVhbnR1bV9ucykKK3Vuc2lnbmVkIGludCBlZnhfdXNlY3NfdG9fdGlja3Moc3RydWN0IGVmeF9uaWMgKmVmeCwgdW5zaWduZWQgaW50IHVzZWNzKQogewogCWlmICh1c2VjcyA9PSAwKQogCQlyZXR1cm4gMDsKLQlpZiAodXNlY3MgKiAxMDAwIDwgcXVhbnR1bV9ucykKKwlpZiAodXNlY3MgKiAxMDAwIDwgZWZ4LT50aW1lcl9xdWFudHVtX25zKQogCQlyZXR1cm4gMTsgLyogbmV2ZXIgcm91bmQgZG93biB0byAwICovCi0JcmV0dXJuIHVzZWNzICogMTAwMCAvIHF1YW50dW1fbnM7CisJcmV0dXJuIHVzZWNzICogMTAwMCAvIGVmeC0+dGltZXJfcXVhbnR1bV9uczsKK30KKwordW5zaWduZWQgaW50IGVmeF90aWNrc190b191c2VjcyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCB1bnNpZ25lZCBpbnQgdGlja3MpCit7CisJLyogV2UgbXVzdCByb3VuZCB1cCB3aGVuIGNvbnZlcnRpbmcgdGlja3MgdG8gbWljcm9zZWNvbmRzCisJICogYmVjYXVzZSB3ZSByb3VuZCBkb3duIHdoZW4gY29udmVydGluZyB0aGUgb3RoZXIgd2F5LgorCSAqLworCXJldHVybiBESVZfUk9VTkRfVVAodGlja3MgKiBlZngtPnRpbWVyX3F1YW50dW1fbnMsIDEwMDApOwogfQogCiAvKiBTZXQgaW50ZXJydXB0IG1vZGVyYXRpb24gcGFyYW1ldGVycyAqLwpAQCAtMTk2NSwyMSArMTk3OSwxNiBAQAogCQkJICAgIGJvb2wgcnhfbWF5X292ZXJyaWRlX3R4KQogewogCXN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbDsKLQl1bnNpZ25lZCBpbnQgaXJxX21vZF9tYXggPSBESVZfUk9VTkRfVVAoZWZ4LT50eXBlLT50aW1lcl9wZXJpb2RfbWF4ICoKLQkJCQkJCWVmeC0+dGltZXJfcXVhbnR1bV9ucywKLQkJCQkJCTEwMDApOwotCXVuc2lnbmVkIGludCB0eF90aWNrczsKLQl1bnNpZ25lZCBpbnQgcnhfdGlja3M7CisJdW5zaWduZWQgaW50IHRpbWVyX21heF91czsKIAogCUVGWF9BU1NFUlRfUkVTRVRfU0VSSUFMSVNFRChlZngpOwogCi0JaWYgKHR4X3VzZWNzID4gaXJxX21vZF9tYXggfHwgcnhfdXNlY3MgPiBpcnFfbW9kX21heCkKKwl0aW1lcl9tYXhfdXMgPSBlZngtPnRpbWVyX21heF9ucyAvIDEwMDA7CisKKwlpZiAodHhfdXNlY3MgPiB0aW1lcl9tYXhfdXMgfHwgcnhfdXNlY3MgPiB0aW1lcl9tYXhfdXMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdHhfdGlja3MgPSBpcnFfbW9kX3RpY2tzKHR4X3VzZWNzLCBlZngtPnRpbWVyX3F1YW50dW1fbnMpOwotCXJ4X3RpY2tzID0gaXJxX21vZF90aWNrcyhyeF91c2VjcywgZWZ4LT50aW1lcl9xdWFudHVtX25zKTsKLQotCWlmICh0eF90aWNrcyAhPSByeF90aWNrcyAmJiBlZngtPnR4X2NoYW5uZWxfb2Zmc2V0ID09IDAgJiYKKwlpZiAodHhfdXNlY3MgIT0gcnhfdXNlY3MgJiYgZWZ4LT50eF9jaGFubmVsX29mZnNldCA9PSAwICYmCiAJICAgICFyeF9tYXlfb3ZlcnJpZGVfdHgpIHsKIAkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsICJDaGFubmVscyBhcmUgc2hhcmVkLiAiCiAJCQkgICJSWCBhbmQgVFggSVJRIG1vZGVyYXRpb24gbXVzdCBiZSBlcXVhbFxuIik7CkBAIC0xOTg3LDEyICsxOTk2LDEyIEBACiAJfQogCiAJZWZ4LT5pcnFfcnhfYWRhcHRpdmUgPSByeF9hZGFwdGl2ZTsKLQllZngtPmlycV9yeF9tb2RlcmF0aW9uID0gcnhfdGlja3M7CisJZWZ4LT5pcnFfcnhfbW9kZXJhdGlvbl91cyA9IHJ4X3VzZWNzOwogCWVmeF9mb3JfZWFjaF9jaGFubmVsKGNoYW5uZWwsIGVmeCkgewogCQlpZiAoZWZ4X2NoYW5uZWxfaGFzX3J4X3F1ZXVlKGNoYW5uZWwpKQotCQkJY2hhbm5lbC0+aXJxX21vZGVyYXRpb24gPSByeF90aWNrczsKKwkJCWNoYW5uZWwtPmlycV9tb2RlcmF0aW9uX3VzID0gcnhfdXNlY3M7CiAJCWVsc2UgaWYgKGVmeF9jaGFubmVsX2hhc190eF9xdWV1ZXMoY2hhbm5lbCkpCi0JCQljaGFubmVsLT5pcnFfbW9kZXJhdGlvbiA9IHR4X3RpY2tzOworCQkJY2hhbm5lbC0+aXJxX21vZGVyYXRpb25fdXMgPSB0eF91c2VjczsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTIwMDEsMjYgKzIwMTAsMjEgQEAKIHZvaWQgZWZ4X2dldF9pcnFfbW9kZXJhdGlvbihzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCB1bnNpZ25lZCBpbnQgKnR4X3VzZWNzLAogCQkJICAgIHVuc2lnbmVkIGludCAqcnhfdXNlY3MsIGJvb2wgKnJ4X2FkYXB0aXZlKQogewotCS8qIFdlIG11c3Qgcm91bmQgdXAgd2hlbiBjb252ZXJ0aW5nIHRpY2tzIHRvIG1pY3Jvc2Vjb25kcwotCSAqIGJlY2F1c2Ugd2Ugcm91bmQgZG93biB3aGVuIGNvbnZlcnRpbmcgdGhlIG90aGVyIHdheS4KLQkgKi8KLQogCSpyeF9hZGFwdGl2ZSA9IGVmeC0+aXJxX3J4X2FkYXB0aXZlOwotCSpyeF91c2VjcyA9IERJVl9ST1VORF9VUChlZngtPmlycV9yeF9tb2RlcmF0aW9uICoKLQkJCQkgZWZ4LT50aW1lcl9xdWFudHVtX25zLAotCQkJCSAxMDAwKTsKKwkqcnhfdXNlY3MgPSBlZngtPmlycV9yeF9tb2RlcmF0aW9uX3VzOwogCiAJLyogSWYgY2hhbm5lbHMgYXJlIHNoYXJlZCBiZXR3ZWVuIFJYIGFuZCBUWCwgc28gaXMgSVJRCiAJICogbW9kZXJhdGlvbi4gIE90aGVyd2lzZSwgSVJRIG1vZGVyYXRpb24gaXMgdGhlIHNhbWUgZm9yIGFsbAogCSAqIFRYIGNoYW5uZWxzIGFuZCBpcyBub3QgYWRhcHRpdmUuCiAJICovCi0JaWYgKGVmeC0+dHhfY2hhbm5lbF9vZmZzZXQgPT0gMCkKKwlpZiAoZWZ4LT50eF9jaGFubmVsX29mZnNldCA9PSAwKSB7CiAJCSp0eF91c2VjcyA9ICpyeF91c2VjczsKLQllbHNlCi0JCSp0eF91c2VjcyA9IERJVl9ST1VORF9VUCgKLQkJCWVmeC0+Y2hhbm5lbFtlZngtPnR4X2NoYW5uZWxfb2Zmc2V0XS0+aXJxX21vZGVyYXRpb24gKgotCQkJZWZ4LT50aW1lcl9xdWFudHVtX25zLAotCQkJMTAwMCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGVmeF9jaGFubmVsICp0eF9jaGFubmVsOworCisJCXR4X2NoYW5uZWwgPSBlZngtPmNoYW5uZWxbZWZ4LT50eF9jaGFubmVsX29mZnNldF07CisJCSp0eF91c2VjcyA9IHR4X2NoYW5uZWwtPmlycV9tb2RlcmF0aW9uX3VzOworCX0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMjU5LDggKzIyNjMsMTggQEAKIAlyYyA9IGVmeF9jaGVja19kaXNhYmxlZChlZngpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwotCWlmIChuZXdfbXR1ID4gRUZYX01BWF9NVFUpCisJaWYgKG5ld19tdHUgPiBFRlhfTUFYX01UVSkgeworCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCSAgIlJlcXVlc3RlZCBNVFUgb2YgJWQgdG9vIGJpZyAobWF4OiAlZClcbiIsCisJCQkgIG5ld19tdHUsIEVGWF9NQVhfTVRVKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChuZXdfbXR1IDwgRUZYX01JTl9NVFUpIHsKKwkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkgICJSZXF1ZXN0ZWQgTVRVIG9mICVkIHRvbyBzbWFsbCAobWluOiAlZClcbiIsCisJCQkgIG5ld19tdHUsIEVGWF9NSU5fTVRVKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJbmV0aWZfZGJnKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsICJjaGFuZ2luZyBNVFUgdG8gJWRcbiIsIG5ld19tdHUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmgKaW5kZXggYzNhZTczOS4uMzQyYWUxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguaApAQCAtMjA0LDYgKzIwNCw4IEBACiAKIC8qIEdsb2JhbCAqLwogdm9pZCBlZnhfc2NoZWR1bGVfcmVzZXQoc3RydWN0IGVmeF9uaWMgKmVmeCwgZW51bSByZXNldF90eXBlIHR5cGUpOwordW5zaWduZWQgaW50IGVmeF91c2Vjc190b190aWNrcyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCB1bnNpZ25lZCBpbnQgdXNlY3MpOwordW5zaWduZWQgaW50IGVmeF90aWNrc190b191c2VjcyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCB1bnNpZ25lZCBpbnQgdGlja3MpOwogaW50IGVmeF9pbml0X2lycV9tb2RlcmF0aW9uKHN0cnVjdCBlZnhfbmljICplZngsIHVuc2lnbmVkIGludCB0eF91c2VjcywKIAkJCSAgICB1bnNpZ25lZCBpbnQgcnhfdXNlY3MsIGJvb2wgcnhfYWRhcHRpdmUsCiAJCQkgICAgYm9vbCByeF9tYXlfb3ZlcnJpZGVfdHgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhbGNvbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhbGNvbi5jCmluZGV4IGQ3OTBjYjguLjFhNzA5MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYWxjb24uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFsY29uLmMKQEAgLTM3OCwxMiArMzc4LDE1IEBACiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IGNoYW5uZWwtPmVmeDsKIAogCS8qIFNldCB0aW1lciByZWdpc3RlciAqLwotCWlmIChjaGFubmVsLT5pcnFfbW9kZXJhdGlvbikgeworCWlmIChjaGFubmVsLT5pcnFfbW9kZXJhdGlvbl91cykgeworCQl1bnNpZ25lZCBpbnQgdGlja3M7CisKKwkJdGlja3MgPSBlZnhfdXNlY3NfdG9fdGlja3MoZWZ4LCBjaGFubmVsLT5pcnFfbW9kZXJhdGlvbl91cyk7CiAJCUVGWF9QT1BVTEFURV9EV09SRF8yKHRpbWVyX2NtZCwKIAkJCQkgICAgIEZSRl9BQl9UQ19USU1FUl9NT0RFLAogCQkJCSAgICAgRkZFX0JCX1RJTUVSX01PREVfSU5UX0hMRE9GRiwKIAkJCQkgICAgIEZSRl9BQl9UQ19USU1FUl9WQUwsCi0JCQkJICAgICBjaGFubmVsLT5pcnFfbW9kZXJhdGlvbiAtIDEpOworCQkJCSAgICAgdGlja3MgLSAxKTsKIAl9IGVsc2UgewogCQlFRlhfUE9QVUxBVEVfRFdPUkRfMih0aW1lcl9jbWQsCiAJCQkJICAgICBGUkZfQUJfVENfVElNRVJfTU9ERSwKQEAgLTIzNzMsNiArMjM3Niw4IEBACiAJCQkgICAgIEVGWF9NQVhfQ0hBTk5FTFMpOwogCWVmeC0+bWF4X3R4X2NoYW5uZWxzID0gZWZ4LT5tYXhfY2hhbm5lbHM7CiAJZWZ4LT50aW1lcl9xdWFudHVtX25zID0gNDk2ODsgLyogNjIxIGN5Y2xlcyAqLworCWVmeC0+dGltZXJfbWF4X25zID0gZWZ4LT50eXBlLT50aW1lcl9wZXJpb2RfbWF4ICoKKwkJCSAgICBlZngtPnRpbWVyX3F1YW50dW1fbnM7CiAKIAkvKiBJbml0aWFsaXNlIEkyQyBhZGFwdGVyICovCiAJYm9hcmQgPSBmYWxjb25fYm9hcmQoZWZ4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYWxjb25fYm9hcmRzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFsY29uX2JvYXJkcy5jCmluZGV4IDE3MzZmNGIuLmY2ODgzYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYWxjb25fYm9hcmRzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhbGNvbl9ib2FyZHMuYwpAQCAtNjQsNyArNjQsNyBAQAogI2RlZmluZSBMTTg3X0FMQVJNX1RFTVBfSU5UCQkweDEwCiAjZGVmaW5lIExNODdfQUxBUk1fVEVNUF9FWFQxCQkweDIwCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TRU5TT1JTX0xNODcpIHx8IGRlZmluZWQoQ09ORklHX1NFTlNPUlNfTE04N19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU0VOU09SU19MTTg3KQogCiBzdGF0aWMgaW50IGVmeF9wb2tlX2xtODcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY29uc3QgdTggKnJlZ192YWx1ZXMpCiB7CkBAIC00NTUsNyArNDU1LDcgQEAKIAlzdHJ1Y3QgZmFsY29uX2JvYXJkICpib2FyZCA9IGZhbGNvbl9ib2FyZChlZngpOwogCWludCByYzsKIAotI2lmIGRlZmluZWQoQ09ORklHX1NFTlNPUlNfTE05MCkgfHwgZGVmaW5lZChDT05GSUdfU0VOU09SU19MTTkwX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19TRU5TT1JTX0xNOTApCiAJYm9hcmQtPmh3bW9uX2NsaWVudCA9CiAJCWkyY19uZXdfZGV2aWNlKCZib2FyZC0+aTJjX2FkYXAsICZzZmU0MDAxX2h3bW9uX2luZm8pOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYXJjaC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhcmNoLmMKaW5kZXggNGM4MzczOS4uNDc2MmVjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhcmNoLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhcmNoLmMKQEAgLTE0NzcsOSArMTQ3NywxMCBAQAogICogSW50ZXJydXB0IG11c3QgYWxyZWFkeSBoYXZlIGJlZW4gZW5hYmxlZCwgb3RoZXJ3aXNlIG5hc3R5IHRoaW5ncwogICogbWF5IGhhcHBlbi4KICAqLwotdm9pZCBlZnhfZmFyY2hfaXJxX3Rlc3RfZ2VuZXJhdGUoc3RydWN0IGVmeF9uaWMgKmVmeCkKK2ludCBlZnhfZmFyY2hfaXJxX3Rlc3RfZ2VuZXJhdGUoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKIAllZnhfZmFyY2hfaW50ZXJydXB0cyhlZngsIHRydWUsIHRydWUpOworCXJldHVybiAwOwogfQogCiAvKiBQcm9jZXNzIGEgZmF0YWwgaW50ZXJydXB0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbWNkaS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL21jZGkuYwppbmRleCBkMjhlN2RkLi4yNDE1MjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbWNkaS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9tY2RpLmMKQEAgLTU0OCw3ICs1NDgsMTAgQEAKIAkJZWZ4X21jZGlfZGlzcGxheV9lcnJvcihlZngsIGFzeW5jLT5jbWQsIGFzeW5jLT5pbmxlbiwgZXJyYnVmLAogCQkJCSAgICAgICBlcnJfbGVuLCByYyk7CiAJfQotCWFzeW5jLT5jb21wbGV0ZShlZngsIGFzeW5jLT5jb29raWUsIHJjLCBvdXRidWYsIGRhdGFfbGVuKTsKKworCWlmIChhc3luYy0+Y29tcGxldGUpCisJCWFzeW5jLT5jb21wbGV0ZShlZngsIGFzeW5jLT5jb29raWUsIHJjLCBvdXRidWYsCisJCQkJbWluKGFzeW5jLT5vdXRsZW4sIGRhdGFfbGVuKSk7CiAJa2ZyZWUoYXN5bmMpOwogCiAJZWZ4X21jZGlfcmVsZWFzZShtY2RpKTsKQEAgLTExNTMsNyArMTE1Niw4IEBACiAJICogYWNxdWlyZWQgbG9ja3MgaW4gdGhlIHdyb25nIG9yZGVyLgogCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhc3luYywgbmV4dCwgJm1jZGktPmFzeW5jX2xpc3QsIGxpc3QpIHsKLQkJYXN5bmMtPmNvbXBsZXRlKGVmeCwgYXN5bmMtPmNvb2tpZSwgLUVORVRET1dOLCBOVUxMLCAwKTsKKwkJaWYgKGFzeW5jLT5jb21wbGV0ZSkKKwkJCWFzeW5jLT5jb21wbGV0ZShlZngsIGFzeW5jLT5jb29raWUsIC1FTkVURE9XTiwgTlVMTCwgMCk7CiAJCWxpc3RfZGVsKCZhc3luYy0+bGlzdCk7CiAJCWtmcmVlKGFzeW5jKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbWNkaV9wY29sLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbWNkaV9wY29sLmgKaW5kZXggYzlhNWIwMC4uY2NjZWFmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL21jZGlfcGNvbC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9tY2RpX3Bjb2wuaApAQCAtMjY0NSwxNiArMjY0NSwyMCBAQAogI2RlZmluZSAgICAgICAgICBNQ19DTURfUE9MTF9CSVNUX01FTV9CVVNfTUMgMHgwCiAvKiBlbnVtOiBDU1IgSVJFRyBidXMuICovCiAjZGVmaW5lICAgICAgICAgIE1DX0NNRF9QT0xMX0JJU1RfTUVNX0JVU19DU1IgMHgxCi0vKiBlbnVtOiBSWCBEUENQVSBidXMuICovCisvKiBlbnVtOiBSWDAgRFBDUFUgYnVzLiAqLwogI2RlZmluZSAgICAgICAgICBNQ19DTURfUE9MTF9CSVNUX01FTV9CVVNfRFBDUFVfUlggMHgyCiAvKiBlbnVtOiBUWDAgRFBDUFUgYnVzLiAqLwogI2RlZmluZSAgICAgICAgICBNQ19DTURfUE9MTF9CSVNUX01FTV9CVVNfRFBDUFVfVFgwIDB4MwogLyogZW51bTogVFgxIERQQ1BVIGJ1cy4gKi8KICNkZWZpbmUgICAgICAgICAgTUNfQ01EX1BPTExfQklTVF9NRU1fQlVTX0RQQ1BVX1RYMSAweDQKLS8qIGVudW06IFJYIERJQ1BVIGJ1cy4gKi8KKy8qIGVudW06IFJYMCBESUNQVSBidXMuICovCiAjZGVmaW5lICAgICAgICAgIE1DX0NNRF9QT0xMX0JJU1RfTUVNX0JVU19ESUNQVV9SWCAweDUKIC8qIGVudW06IFRYIERJQ1BVIGJ1cy4gKi8KICNkZWZpbmUgICAgICAgICAgTUNfQ01EX1BPTExfQklTVF9NRU1fQlVTX0RJQ1BVX1RYIDB4NgorLyogZW51bTogUlgxIERQQ1BVIGJ1cy4gKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX1BPTExfQklTVF9NRU1fQlVTX0RQQ1BVX1JYMSAweDcKKy8qIGVudW06IFJYMSBESUNQVSBidXMuICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9QT0xMX0JJU1RfTUVNX0JVU19ESUNQVV9SWDEgMHg4CiAvKiBQYXR0ZXJuIHdyaXR0ZW4gdG8gUkFNIC8gcmVnaXN0ZXIgKi8KICNkZWZpbmUgICAgICAgTUNfQ01EX1BPTExfQklTVF9PVVRfTUVNX0VYUEVDVF9PRlNUIDE2CiAvKiBBY3R1YWwgdmFsdWUgcmVhZCBmcm9tIFJBTSAvIHJlZ2lzdGVyICovCkBAIC0zNjEyLDYgKzM2MTYsOCBAQAogI2RlZmluZSAgICAgICAgTUNfQ01EX05WUkFNX0lORk9fT1VUX1BST1RFQ1RFRF9XSURUSCAxCiAjZGVmaW5lICAgICAgICBNQ19DTURfTlZSQU1fSU5GT19PVVRfVExWX0xCTiAxCiAjZGVmaW5lICAgICAgICBNQ19DTURfTlZSQU1fSU5GT19PVVRfVExWX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9OVlJBTV9JTkZPX09VVF9DTUFDX0xCTiA2CisjZGVmaW5lICAgICAgICBNQ19DTURfTlZSQU1fSU5GT19PVVRfQ01BQ19XSURUSCAxCiAjZGVmaW5lICAgICAgICBNQ19DTURfTlZSQU1fSU5GT19PVVRfQV9CX0xCTiA3CiAjZGVmaW5lICAgICAgICBNQ19DTURfTlZSQU1fSU5GT19PVVRfQV9CX1dJRFRIIDEKICNkZWZpbmUgICAgICAgTUNfQ01EX05WUkFNX0lORk9fT1VUX1BIWVNERVZfT0ZTVCAxNgpAQCAtNDM4OSw2ICs0Mzk1LDggQEAKICAqIHRoZSBjb21tYW5kIHdpbGwgZmFpbCB3aXRoIE1DX0NNRF9FUlJfRklMVEVSU19QUkVTRU5ULgogICovCiAjZGVmaW5lICAgICAgICAgIE1DX0NNRF9XT1JLQVJPVU5EX0JVRzI2ODA3IDB4NgorLyogZW51bTogQnVnIDYxMjY1IHdvcmsgYXJvdW5kIChicm9rZW4gRVZRIFRNUiB3cml0ZXMpLiAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfV09SS0FST1VORF9CVUc2MTI2NSAweDcKIC8qIDAgPSBkaXNhYmxlIHRoZSB3b3JrYXJvdW5kIGluZGljYXRlZCBieSBUWVBFOyBhbnkgbm9uLXplcm8gdmFsdWUgPSBlbmFibGUKICAqIHRoZSB3b3JrYXJvdW5kCiAgKi8KQEAgLTQ0MTMsNyArNDQyMSw2IEBACiAgKiAoR0VUX1BIWV9DRkdfT1VUX01FRElBX1RZUEUpOyB0aGUgdmFsaWQgJ3BhZ2UgbnVtYmVyJyBpbnB1dCB2YWx1ZXMsIGFuZCB0aGUKICAqIG91dHB1dCBkYXRhLCBhcmUgaW50ZXJwcmV0ZWQgb24gYSBwZXItdHlwZSBiYXNpcy4gRm9yIFNGUCs6IFBBR0U9MCBvciAxCiAgKiByZXR1cm5zIGEgMTI4LWJ5dGUgYmxvY2sgcmVhZCBmcm9tIG1vZHVsZSBJMkMgYWRkcmVzcyAweEEwIG9mZnNldCAwIG9yIDB4ODAuCi0gKiBBbnl0aGluZyBlbHNlOiBjdXJyZW50bHkgdW5kZWZpbmVkLiBMb2NrcyByZXF1aXJlZDogTm9uZS4gUmV0dXJuIGNvZGU6IDAuCiAgKi8KICNkZWZpbmUgTUNfQ01EX0dFVF9QSFlfTUVESUFfSU5GTyAweDRiCiAKQEAgLTU0NzksNiArNTQ4Niw4IEBACiAjZGVmaW5lICAgICAgICBMSUNFTlNFRF9WM19GRUFUVVJFU19UWF9TTklGRl9XSURUSCAxCiAjZGVmaW5lICAgICAgICBMSUNFTlNFRF9WM19GRUFUVVJFU19QUk9YWV9GSUxURVJfT1BTX0xCTiA4CiAjZGVmaW5lICAgICAgICBMSUNFTlNFRF9WM19GRUFUVVJFU19QUk9YWV9GSUxURVJfT1BTX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIExJQ0VOU0VEX1YzX0ZFQVRVUkVTX0VWRU5UX0NVVF9USFJPVUdIX0xCTiA5CisjZGVmaW5lICAgICAgICBMSUNFTlNFRF9WM19GRUFUVVJFU19FVkVOVF9DVVRfVEhST1VHSF9XSURUSCAxCiAjZGVmaW5lICAgICAgIExJQ0VOU0VEX1YzX0ZFQVRVUkVTX01BU0tfTEJOIDAKICNkZWZpbmUgICAgICAgTElDRU5TRURfVjNfRkVBVFVSRVNfTUFTS19XSURUSCA2NAogCkBAIC01NjM0LDYgKzU2NDMsMTA5IEBACiAvKiBPbmx5IHZhbGlkIGlmIElOVFJGTEFHIHdhcyB0cnVlICovCiAjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9PVVRfSVJRX09GU1QgMAogCisvKiBNQ19DTURfSU5JVF9FVlFfVjJfSU4gbXNncmVxdWVzdCAqLworI2RlZmluZSAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fTEVOTUlOIDQ0CisjZGVmaW5lICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9MRU5NQVggNTQ4CisjZGVmaW5lICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9MRU4obnVtKSAoMzYrOCoobnVtKSkKKy8qIFNpemUsIGluIGVudHJpZXMgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX1NJWkVfT0ZTVCAwCisvKiBEZXNpcmVkIGluc3RhbmNlLiBNdXN0IGJlIHNldCB0byBhIHNwZWNpZmljIGluc3RhbmNlLCB3aGljaCBpcyBhIGZ1bmN0aW9uCisgKiBsb2NhbCBxdWV1ZSBpbmRleC4KKyAqLworI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fSU5TVEFOQ0VfT0ZTVCA0CisvKiBUaGUgaW5pdGlhbCB0aW1lciB2YWx1ZS4gVGhlIGxvYWQgdmFsdWUgaXMgaWdub3JlZCBpZiB0aGUgdGltZXIgbW9kZSBpcyBESVMuCisgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX1RNUl9MT0FEX09GU1QgOAorLyogVGhlIHJlbG9hZCB2YWx1ZSBpcyBpZ25vcmVkIGluIG9uZS1zaG90IG1vZGVzICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9UTVJfUkVMT0FEX09GU1QgMTIKKy8qIHRiZCAqLworI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR1NfT0ZTVCAxNgorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfSU5URVJSVVBUSU5HX0xCTiAwCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19JTlRFUlJVUFRJTkdfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfUlBUUl9ET1NfTEJOIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX1JQVFJfRE9TX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX0lOVF9BUk1EX0xCTiAyCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19JTlRfQVJNRF9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19DVVRfVEhSVV9MQk4gMworI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfQ1VUX1RIUlVfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfUlhfTUVSR0VfTEJOIDQKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX1JYX01FUkdFX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX1RYX01FUkdFX0xCTiA1CisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19UWF9NRVJHRV9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19VU0VfVElNRVJfTEJOIDYKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX1VTRV9USU1FUl9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19UWVBFX0xCTiA3CisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19UWVBFX1dJRFRIIDQKKy8qIGVudW06IEFsbCBpbml0aWFsaXNhdGlvbiBmbGFncyBzcGVjaWZpZWQgYnkgaG9zdC4gKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfVFlQRV9NQU5VQUwgMHgwCisvKiBlbnVtOiBNRURGT1JEIG9ubHkuIENlcnRhaW4gaW5pdGlhbGlzYXRpb24gZmxhZ3Mgc3BlY2lmaWVkIGJ5IGhvc3QgbWF5IGJlCisgKiBvdmVyLXJpZGRlbiBieSBmaXJtd2FyZSBiYXNlZCBvbiBsaWNlbnNlcyBhbmQgZmlybXdhcmUgdmFyaWFudCBpbiBvcmRlciB0bworICogcHJvdmlkZSB0aGUgbG93ZXN0IGxhdGVuY3kgYWNoaWV2YWJsZS4gU2VlCisgKiBNQ19DTURfSU5JVF9FVlFfVjIvTUNfQ01EX0lOSVRfRVZRX1YyX09VVC9GTEFHUyBmb3IgbGlzdCBvZiBhZmZlY3RlZCBmbGFncy4KKyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19UWVBFX0xPV19MQVRFTkNZIDB4MQorLyogZW51bTogTUVERk9SRCBvbmx5LiBDZXJ0YWluIGluaXRpYWxpc2F0aW9uIGZsYWdzIHNwZWNpZmllZCBieSBob3N0IG1heSBiZQorICogb3Zlci1yaWRkZW4gYnkgZmlybXdhcmUgYmFzZWQgb24gbGljZW5zZXMgYW5kIGZpcm13YXJlIHZhcmlhbnQgaW4gb3JkZXIgdG8KKyAqIHByb3ZpZGUgdGhlIGJlc3QgdGhyb3VnaHB1dCBhY2hpZXZhYmxlLiBTZWUKKyAqIE1DX0NNRF9JTklUX0VWUV9WMi9NQ19DTURfSU5JVF9FVlFfVjJfT1VUL0ZMQUdTIGZvciBsaXN0IG9mIGFmZmVjdGVkIGZsYWdzLgorICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX1RZUEVfVEhST1VHSFBVVCAweDIKKy8qIGVudW06IE1FREZPUkQgb25seS4gQ2VydGFpbiBpbml0aWFsaXNhdGlvbiBmbGFncyBtYXkgYmUgb3Zlci1yaWRkZW4gYnkKKyAqIGZpcm13YXJlIGJhc2VkIG9uIGxpY2Vuc2VzIGFuZCBmaXJtd2FyZSB2YXJpYW50LiBTZWUKKyAqIE1DX0NNRF9JTklUX0VWUV9WMi9NQ19DTURfSU5JVF9FVlFfVjJfT1VUL0ZMQUdTIGZvciBsaXN0IG9mIGFmZmVjdGVkIGZsYWdzLgorICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX1RZUEVfQVVUTyAweDMKKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX1RNUl9NT0RFX09GU1QgMjAKKy8qIGVudW06IERpc2FibGVkICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9UTVJfTU9ERV9ESVMgMHgwCisvKiBlbnVtOiBJbW1lZGlhdGUgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX1RNUl9JTU1FRF9TVEFSVCAweDEKKy8qIGVudW06IFRyaWdnZXJlZCAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fVE1SX1RSSUdfU1RBUlQgMHgyCisvKiBlbnVtOiBIb2xkLW9mZiAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fVE1SX0lOVF9ITERPRkYgMHgzCisvKiBUYXJnZXQgRVZRIGZvciB3YWtldXBzIGlmIGluIHdha2V1cCBtb2RlLiAqLworI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fVEFSR0VUX0VWUV9PRlNUIDI0CisvKiBUYXJnZXQgaW50ZXJydXB0IGlmIGluIGludGVycnVwdGluZyBtb2RlIChub3RlIHVuaW9uIHdpdGggdGFyZ2V0IEVWUSkuIFVzZQorICogTUNfQ01EX1JFU09VUkNFX0lOU1RBTkNFX0FOWSB1bmxlc3MgYSBzcGVjaWZpYyBvbmUgcmVxdWlyZWQgZm9yIHRlc3QKKyAqIHB1cnBvc2VzLgorICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9JUlFfTlVNX09GU1QgMjQKKy8qIEV2ZW50IENvdW50ZXIgTW9kZS4gKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0NPVU5UX01PREVfT0ZTVCAyOAorLyogZW51bTogRGlzYWJsZWQgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0NPVU5UX01PREVfRElTIDB4MAorLyogZW51bTogRGlzYWJsZWQgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0NPVU5UX01PREVfUlggMHgxCisvKiBlbnVtOiBEaXNhYmxlZCAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fQ09VTlRfTU9ERV9UWCAweDIKKy8qIGVudW06IERpc2FibGVkICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9DT1VOVF9NT0RFX1JYVFggMHgzCisvKiBFdmVudCBxdWV1ZSBwYWNrZXQgY291bnQgdGhyZXNob2xkLiAqLworI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fQ09VTlRfVEhSU0hMRF9PRlNUIDMyCisvKiA2NC1iaXQgYWRkcmVzcyBvZiA0ayBvZiA0ay1hbGlnbmVkIGhvc3QgbWVtb3J5IGJ1ZmZlciAqLworI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRE1BX0FERFJfT0ZTVCAzNgorI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRE1BX0FERFJfTEVOIDgKKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0RNQV9BRERSX0xPX09GU1QgMzYKKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0RNQV9BRERSX0hJX09GU1QgNDAKKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0RNQV9BRERSX01JTk5VTSAxCisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9ETUFfQUREUl9NQVhOVU0gNjQKKworLyogTUNfQ01EX0lOSVRfRVZRX1YyX09VVCBtc2dyZXNwb25zZSAqLworI2RlZmluZSAgICBNQ19DTURfSU5JVF9FVlFfVjJfT1VUX0xFTiA4CisvKiBPbmx5IHZhbGlkIGlmIElOVFJGTEFHIHdhcyB0cnVlICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9PVVRfSVJRX09GU1QgMAorLyogQWN0dWFsIGNvbmZpZ3VyYXRpb24gYXBwbGllZCBvbiB0aGUgY2FyZCAqLworI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfT1VUX0ZMQUdTX09GU1QgNAorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX09VVF9GTEFHX0NVVF9USFJVX0xCTiAwCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfT1VUX0ZMQUdfQ1VUX1RIUlVfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX09VVF9GTEFHX1JYX01FUkdFX0xCTiAxCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfT1VUX0ZMQUdfUlhfTUVSR0VfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX09VVF9GTEFHX1RYX01FUkdFX0xCTiAyCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfT1VUX0ZMQUdfVFhfTUVSR0VfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX09VVF9GTEFHX1JYUV9GT1JDRV9FVl9NRVJHSU5HX0xCTiAzCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfT1VUX0ZMQUdfUlhRX0ZPUkNFX0VWX01FUkdJTkdfV0lEVEggMQorCiAvKiBRVUVVRV9DUkNfTU9ERSBzdHJ1Y3R1cmVkZWYgKi8KICNkZWZpbmUgICAgUVVFVUVfQ1JDX01PREVfTEVOIDEKICNkZWZpbmUgICAgICAgUVVFVUVfQ1JDX01PREVfTU9ERV9MQk4gMApAQCAtNTY5Nyw4ICs1ODA5LDggQEAKICNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX1JYUV9JTl9GTEFHX1BSRUZJWF9XSURUSCAxCiAjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9SWFFfSU5fRkxBR19ESVNBQkxFX1NDQVRURVJfTEJOIDkKICNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX1JYUV9JTl9GTEFHX0RJU0FCTEVfU0NBVFRFUl9XSURUSCAxCi0jZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9SWFFfSU5fRkxBR19GT1JDRV9FVl9NRVJHSU5HX0xCTiAxMAotI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfUlhRX0lOX0ZMQUdfRk9SQ0VfRVZfTUVSR0lOR19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9SWFFfSU5fVU5VU0VEX0xCTiAxMAorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfUlhRX0lOX1VOVVNFRF9XSURUSCAxCiAvKiBPd25lciBJRCB0byB1c2UgaWYgaW4gYnVmZmVyIG1vZGUgKHplcm8gaWYgcGh5c2ljYWwpICovCiAjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX1JYUV9JTl9PV05FUl9JRF9PRlNUIDIwCiAvKiBUaGUgcG9ydCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHYtYWRhcHRvciB3aGljaCBzaG91bGQgY29udGFpbiB0aGlzIERNQVEuICovCkBAIC03ODU0LDYgKzc5NjYsMjAgQEAKICNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9FVkVOVF9DVVRfVEhST1VHSF9XSURUSCAxCiAjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfUlhfQ1VUX1RIUk9VR0hfTEJOIDQKICNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9SWF9DVVRfVEhST1VHSF9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfVFhfVkZJRk9fVUxMX01PREVfTEJOIDUKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9UWF9WRklGT19VTExfTU9ERV9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfTUFDX1NUQVRTXzQwR19UWF9TSVpFX0JJTlNfTEJOIDYKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9NQUNfU1RBVFNfNDBHX1RYX1NJWkVfQklOU19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfSU5JVF9FVlFfVjJfTEJOIDcKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9JTklUX0VWUV9WMl9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfVFhfTUFDX1RJTUVTVEFNUElOR19MQk4gOAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX1RYX01BQ19USU1FU1RBTVBJTkdfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX1RYX1RJTUVTVEFNUF9MQk4gOQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX1RYX1RJTUVTVEFNUF9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfUlhfU05JRkZfTEJOIDEwCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfUlhfU05JRkZfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX1RYX1NOSUZGX0xCTiAxMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX1RYX1NOSUZGX1dJRFRIIDEKIC8qIE51bWJlciBvZiBGQVRTT3YyIGNvbnRleHRzIHBlciBkYXRhcGF0aCBzdXBwb3J0ZWQgYnkgdGhpcyBOSUMuIE5vdCBwcmVzZW50CiAgKiBvbiBvbGRlciBmaXJtd2FyZSAoY2hlY2sgdGhlIGxlbmd0aCkuCiAgKi8KQEAgLTc5MTAsNiArODAzNiwyODggQEAKICNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX1NJWkVfUElPX0JVRkZfT0ZTVCA3MAogI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfU0laRV9QSU9fQlVGRl9MRU4gMgogCisvKiBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVQgbXNncmVzcG9uc2UgKi8KKyNkZWZpbmUgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0xFTiA3MworLyogRmlyc3Qgd29yZCBvZiBmbGFncy4gKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0ZMQUdTMV9PRlNUIDAKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9WUE9SVF9SRUNPTkZJR1VSRV9MQk4gMworI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1ZQT1JUX1JFQ09ORklHVVJFX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9TVFJJUElOR19MQk4gNAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1NUUklQSU5HX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9WQURBUFRPUl9RVUVSWV9MQk4gNQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1ZBREFQVE9SX1FVRVJZX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9FVkJfUE9SVF9WTEFOX1JFU1RSSUNUX0xCTiA2CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfRVZCX1BPUlRfVkxBTl9SRVNUUklDVF9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfRFJWX0FUVEFDSF9QUkVCT09UX0xCTiA3CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfRFJWX0FUVEFDSF9QUkVCT09UX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9GT1JDRV9FVkVOVF9NRVJHSU5HX0xCTiA4CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfRk9SQ0VfRVZFTlRfTUVSR0lOR19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfU0VUX01BQ19FTkhBTkNFRF9MQk4gOQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1NFVF9NQUNfRU5IQU5DRURfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1VOS05PV05fVUNBU1RfRFNUX0ZJTFRFUl9BTFdBWVNfTVVMVElfUkVDSVBJRU5UX0xCTiAxMAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1VOS05PV05fVUNBU1RfRFNUX0ZJTFRFUl9BTFdBWVNfTVVMVElfUkVDSVBJRU5UX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9WQURBUFRPUl9QRVJNSVRfU0VUX01BQ19XSEVOX0ZJTFRFUlNfSU5TVEFMTEVEX0xCTiAxMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1ZBREFQVE9SX1BFUk1JVF9TRVRfTUFDX1dIRU5fRklMVEVSU19JTlNUQUxMRURfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX01BQ19TRUNVUklUWV9GSUxURVJJTkdfTEJOIDEyCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfTUFDX1NFQ1VSSVRZX0ZJTFRFUklOR19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfQURESVRJT05BTF9SU1NfTU9ERVNfTEJOIDEzCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfQURESVRJT05BTF9SU1NfTU9ERVNfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1FCQl9MQk4gMTQKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9RQkJfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX1BBQ0tFRF9TVFJFQU1fVkFSX0JVRkZFUlNfTEJOIDE1CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfUEFDS0VEX1NUUkVBTV9WQVJfQlVGRkVSU19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfUlNTX0xJTUlURURfTEJOIDE2CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfUlNTX0xJTUlURURfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX1BBQ0tFRF9TVFJFQU1fTEJOIDE3CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfUEFDS0VEX1NUUkVBTV9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfSU5DTFVERV9GQ1NfTEJOIDE4CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfSU5DTFVERV9GQ1NfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1ZMQU5fSU5TRVJUSU9OX0xCTiAxOQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1ZMQU5fSU5TRVJUSU9OX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9WTEFOX1NUUklQUElOR19MQk4gMjAKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9WTEFOX1NUUklQUElOR19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfVFNPX0xCTiAyMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1RTT19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfUFJFRklYX0xFTl8wX0xCTiAyMgorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX1BSRUZJWF9MRU5fMF9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfUFJFRklYX0xFTl8xNF9MQk4gMjMKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9QUkVGSVhfTEVOXzE0X1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9USU1FU1RBTVBfTEJOIDI0CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfVElNRVNUQU1QX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9CQVRDSElOR19MQk4gMjUKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9CQVRDSElOR19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfTUNBU1RfRklMVEVSX0NIQUlOSU5HX0xCTiAyNgorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX01DQVNUX0ZJTFRFUl9DSEFJTklOR19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUE1fQU5EX1JYRFBfQ09VTlRFUlNfTEJOIDI3CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUE1fQU5EX1JYRFBfQ09VTlRFUlNfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX0RJU0FCTEVfU0NBVFRFUl9MQk4gMjgKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9ESVNBQkxFX1NDQVRURVJfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX01DQVNUX1VEUF9MT09QQkFDS19MQk4gMjkKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9NQ0FTVF9VRFBfTE9PUEJBQ0tfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0VWQl9MQk4gMzAKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9FVkJfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1ZYTEFOX05WR1JFX0xCTiAzMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1ZYTEFOX05WR1JFX1dJRFRIIDEKKy8qIFJ4RFBDUFUgZmlybXdhcmUgaWQuICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9EUENQVV9GV19JRF9PRlNUIDQKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX0RQQ1BVX0ZXX0lEX0xFTiAyCisvKiBlbnVtOiBTdGFuZGFyZCBSWERQIGZpcm13YXJlICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWERQICAweDAKKy8qIGVudW06IExvdyBsYXRlbmN5IFJYRFAgZmlybXdhcmUgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYRFBfTE9XX0xBVEVOQ1kgIDB4MQorLyogZW51bTogUGFja2VkIHN0cmVhbSBSWERQIGZpcm13YXJlICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWERQX1BBQ0tFRF9TVFJFQU0gIDB4MgorLyogZW51bTogQklTVCBSWERQIGZpcm13YXJlICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWERQX0JJU1QgIDB4MTBhCisvKiBlbnVtOiBSWERQIFRlc3QgZmlybXdhcmUgaW1hZ2UgMSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhEUF9URVNUX0ZXX1RPX01DX0NVVF9USFJPVUdIICAweDEwMQorLyogZW51bTogUlhEUCBUZXN0IGZpcm13YXJlIGltYWdlIDIgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYRFBfVEVTVF9GV19UT19NQ19TVE9SRV9GT1JXQVJEICAweDEwMgorLyogZW51bTogUlhEUCBUZXN0IGZpcm13YXJlIGltYWdlIDMgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYRFBfVEVTVF9GV19UT19NQ19TVE9SRV9GT1JXQVJEX0ZJUlNUICAweDEwMworLyogZW51bTogUlhEUCBUZXN0IGZpcm13YXJlIGltYWdlIDQgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYRFBfVEVTVF9FVkVSWV9FVkVOVF9CQVRDSEFCTEUgIDB4MTA0CisvKiBlbnVtOiBSWERQIFRlc3QgZmlybXdhcmUgaW1hZ2UgNSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhEUF9URVNUX0JBQ0tQUkVTU1VSRSAgMHgxMDUKKy8qIGVudW06IFJYRFAgVGVzdCBmaXJtd2FyZSBpbWFnZSA2ICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWERQX1RFU1RfRldfUEFDS0VUX0VESVRTICAweDEwNgorLyogZW51bTogUlhEUCBUZXN0IGZpcm13YXJlIGltYWdlIDcgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYRFBfVEVTVF9GV19SWF9IRFJfU1BMSVQgIDB4MTA3CisvKiBlbnVtOiBSWERQIFRlc3QgZmlybXdhcmUgaW1hZ2UgOCAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhEUF9URVNUX0ZXX0RJU0FCTEVfREwgIDB4MTA4CisvKiBlbnVtOiBSWERQIFRlc3QgZmlybXdhcmUgaW1hZ2UgOSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhEUF9URVNUX0ZXX0RPT1JCRUxMX0RFTEFZICAweDEwYgorLyogVHhEUENQVSBmaXJtd2FyZSBpZC4gKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX0RQQ1BVX0ZXX0lEX09GU1QgNgorI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfRFBDUFVfRldfSURfTEVOIDIKKy8qIGVudW06IFN0YW5kYXJkIFRYRFAgZmlybXdhcmUgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYRFAgIDB4MAorLyogZW51bTogTG93IGxhdGVuY3kgVFhEUCBmaXJtd2FyZSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhEUF9MT1dfTEFURU5DWSAgMHgxCisvKiBlbnVtOiBIaWdoIHBhY2tldCByYXRlIFRYRFAgZmlybXdhcmUgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYRFBfSElHSF9QQUNLRVRfUkFURSAgMHgzCisvKiBlbnVtOiBCSVNUIFRYRFAgZmlybXdhcmUgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYRFBfQklTVCAgMHgxMmQKKy8qIGVudW06IFRYRFAgVGVzdCBmaXJtd2FyZSBpbWFnZSAxICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWERQX1RFU1RfRldfVFNPX0VESVQgIDB4MTAxCisvKiBlbnVtOiBUWERQIFRlc3QgZmlybXdhcmUgaW1hZ2UgMiAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhEUF9URVNUX0ZXX1BBQ0tFVF9FRElUUyAgMHgxMDIKKy8qIGVudW06IFRYRFAgQ1NSIGJ1cyB0ZXN0IGZpcm13YXJlICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWERQX1RFU1RfRldfQ1NSICAweDEwMworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhQRF9GV19WRVJTSU9OX09GU1QgOAorI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhQRF9GV19WRVJTSU9OX0xFTiAyCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhQRF9GV19WRVJTSU9OX1JFVl9MQk4gMAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYUERfRldfVkVSU0lPTl9SRVZfV0lEVEggMTIKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWFBEX0ZXX1ZFUlNJT05fVFlQRV9MQk4gMTIKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWFBEX0ZXX1ZFUlNJT05fVFlQRV9XSURUSCA0CisvKiBlbnVtOiByZXNlcnZlZCB2YWx1ZSAtIGRvIG5vdCB1c2UgKG1heSBpbmRpY2F0ZSBhbHRlcm5hdGl2ZSBpbnRlcnByZXRhdGlvbgorICogb2YgUkVWIGZpZWxkIGluIGZ1dHVyZSkKKyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhQRF9GV19UWVBFX1JFU0VSVkVEICAweDAKKy8qIGVudW06IFRyaXZpYWwgUlggUEQgZmlybXdhcmUgZm9yIGVhcmx5IEh1bnRpbmd0b24gZGV2ZWxvcG1lbnQgKEh1bnRpbmd0b24KKyAqIGRldmVsb3BtZW50IG9ubHkpCisgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYUERfRldfVFlQRV9GSVJTVF9QS1QgIDB4MQorLyogZW51bTogUlggUEQgZmlybXdhcmUgd2l0aCBhcHByb3hpbWF0ZWx5IFNpZW5hLWNvbXBhdGlibGUgYmVoYXZpb3VyCisgKiAoSHVudGluZ3RvbiBkZXZlbG9wbWVudCBvbmx5KQorICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWFBEX0ZXX1RZUEVfU0lFTkFfQ09NUEFUICAweDIKKy8qIGVudW06IFZpcnR1YWwgc3dpdGNoaW5nIChmdWxsIGZlYXR1cmUpIFJYIFBEIHByb2R1Y3Rpb24gZmlybXdhcmUgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYUERfRldfVFlQRV9WU1dJVENIICAweDMKKy8qIGVudW06IHNpZW5hX2NvbXBhdCB2YXJpYW50IFJYIFBEIGZpcm13YXJlIHVzaW5nIFBNIHJhdGhlciB0aGFuIE1BQworICogKEh1bnRpbmd0b24gZGV2ZWxvcG1lbnQgb25seSkKKyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhQRF9GV19UWVBFX1NJRU5BX0NPTVBBVF9QTSAgMHg0CisvKiBlbnVtOiBMb3cgbGF0ZW5jeSBSWCBQRCBwcm9kdWN0aW9uIGZpcm13YXJlICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWFBEX0ZXX1RZUEVfTE9XX0xBVEVOQ1kgIDB4NQorLyogZW51bTogUGFja2VkIHN0cmVhbSBSWCBQRCBwcm9kdWN0aW9uIGZpcm13YXJlICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWFBEX0ZXX1RZUEVfUEFDS0VEX1NUUkVBTSAgMHg2CisvKiBlbnVtOiBSWCBQRCBmaXJtd2FyZSBoYW5kbGluZyBsYXllciAyIG9ubHkgZm9yIGhpZ2ggcGFja2V0IHJhdGUgcGVyZm9ybWFuY2UKKyAqIHRlc3RzIChNZWRmb3JkIGRldmVsb3BtZW50IG9ubHkpCisgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYUERfRldfVFlQRV9MQVlFUjJfUEVSRiAgMHg3CisvKiBlbnVtOiBSdWxlcyBlbmdpbmUgUlggUEQgcHJvZHVjdGlvbiBmaXJtd2FyZSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhQRF9GV19UWVBFX1JVTEVTX0VOR0lORSAgMHg4CisvKiBlbnVtOiBSWCBQRCBmaXJtd2FyZSBmb3IgR1VFIHBhcnNpbmcgcHJvdG90eXBlIChNZWRmb3JkIGRldmVsb3BtZW50IG9ubHkpICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWFBEX0ZXX1RZUEVfVEVTVEZXX0dVRV9QUk9UT1RZUEUgIDB4ZQorLyogZW51bTogUlggUEQgZmlybXdhcmUgcGFyc2luZyBidXQgbm90IGZpbHRlcmluZyBuZXR3b3JrIG92ZXJsYXkgdHVubmVsCisgKiBlbmNhcHN1bGF0aW9ucyAoTWVkZm9yZCBkZXZlbG9wbWVudCBvbmx5KQorICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWFBEX0ZXX1RZUEVfVEVTVEZXX0VOQ0FQX1BBUlNJTkdfT05MWSAgMHhmCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWFBEX0ZXX1ZFUlNJT05fT0ZTVCAxMAorI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhQRF9GV19WRVJTSU9OX0xFTiAyCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhQRF9GV19WRVJTSU9OX1JFVl9MQk4gMAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYUERfRldfVkVSU0lPTl9SRVZfV0lEVEggMTIKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWFBEX0ZXX1ZFUlNJT05fVFlQRV9MQk4gMTIKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWFBEX0ZXX1ZFUlNJT05fVFlQRV9XSURUSCA0CisvKiBlbnVtOiByZXNlcnZlZCB2YWx1ZSAtIGRvIG5vdCB1c2UgKG1heSBpbmRpY2F0ZSBhbHRlcm5hdGl2ZSBpbnRlcnByZXRhdGlvbgorICogb2YgUkVWIGZpZWxkIGluIGZ1dHVyZSkKKyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhQRF9GV19UWVBFX1JFU0VSVkVEICAweDAKKy8qIGVudW06IFRyaXZpYWwgVFggUEQgZmlybXdhcmUgZm9yIGVhcmx5IEh1bnRpbmd0b24gZGV2ZWxvcG1lbnQgKEh1bnRpbmd0b24KKyAqIGRldmVsb3BtZW50IG9ubHkpCisgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYUERfRldfVFlQRV9GSVJTVF9QS1QgIDB4MQorLyogZW51bTogVFggUEQgZmlybXdhcmUgd2l0aCBhcHByb3hpbWF0ZWx5IFNpZW5hLWNvbXBhdGlibGUgYmVoYXZpb3VyCisgKiAoSHVudGluZ3RvbiBkZXZlbG9wbWVudCBvbmx5KQorICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWFBEX0ZXX1RZUEVfU0lFTkFfQ09NUEFUICAweDIKKy8qIGVudW06IFZpcnR1YWwgc3dpdGNoaW5nIChmdWxsIGZlYXR1cmUpIFRYIFBEIHByb2R1Y3Rpb24gZmlybXdhcmUgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYUERfRldfVFlQRV9WU1dJVENIICAweDMKKy8qIGVudW06IHNpZW5hX2NvbXBhdCB2YXJpYW50IFRYIFBEIGZpcm13YXJlIHVzaW5nIFBNIHJhdGhlciB0aGFuIE1BQworICogKEh1bnRpbmd0b24gZGV2ZWxvcG1lbnQgb25seSkKKyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhQRF9GV19UWVBFX1NJRU5BX0NPTVBBVF9QTSAgMHg0CisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWFBEX0ZXX1RZUEVfTE9XX0xBVEVOQ1kgIDB4NSAvKiBlbnVtICovCisvKiBlbnVtOiBUWCBQRCBmaXJtd2FyZSBoYW5kbGluZyBsYXllciAyIG9ubHkgZm9yIGhpZ2ggcGFja2V0IHJhdGUgcGVyZm9ybWFuY2UKKyAqIHRlc3RzIChNZWRmb3JkIGRldmVsb3BtZW50IG9ubHkpCisgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYUERfRldfVFlQRV9MQVlFUjJfUEVSRiAgMHg3CisvKiBlbnVtOiBSdWxlcyBlbmdpbmUgVFggUEQgcHJvZHVjdGlvbiBmaXJtd2FyZSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhQRF9GV19UWVBFX1JVTEVTX0VOR0lORSAgMHg4CisvKiBlbnVtOiBSWCBQRCBmaXJtd2FyZSBmb3IgR1VFIHBhcnNpbmcgcHJvdG90eXBlIChNZWRmb3JkIGRldmVsb3BtZW50IG9ubHkpICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWFBEX0ZXX1RZUEVfVEVTVEZXX0dVRV9QUk9UT1RZUEUgIDB4ZQorLyogSGFyZHdhcmUgY2FwYWJpbGl0aWVzIG9mIE5JQyAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfSFdfQ0FQQUJJTElUSUVTX09GU1QgMTIKKy8qIExpY2Vuc2VkIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfTElDRU5TRV9DQVBBQklMSVRJRVNfT0ZTVCAxNgorLyogU2Vjb25kIHdvcmQgb2YgZmxhZ3MuIE5vdCBwcmVzZW50IG9uIG9sZGVyIGZpcm13YXJlIChjaGVjayB0aGUgbGVuZ3RoKS4gKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0ZMQUdTMl9PRlNUIDIwCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfVFNPX1YyX0xCTiAwCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfVFNPX1YyX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9UU09fVjJfRU5DQVBfTEJOIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9UU09fVjJfRU5DQVBfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0VWUV9USU1FUl9DVFJMX0xCTiAyCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfRVZRX1RJTUVSX0NUUkxfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0VWRU5UX0NVVF9USFJPVUdIX0xCTiAzCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfRVZFTlRfQ1VUX1RIUk9VR0hfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX0NVVF9USFJPVUdIX0xCTiA0CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfQ1VUX1RIUk9VR0hfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1ZGSUZPX1VMTF9NT0RFX0xCTiA1CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfVkZJRk9fVUxMX01PREVfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX01BQ19TVEFUU180MEdfVFhfU0laRV9CSU5TX0xCTiA2CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfTUFDX1NUQVRTXzQwR19UWF9TSVpFX0JJTlNfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0lOSVRfRVZRX1YyX0xCTiA3CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfSU5JVF9FVlFfVjJfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX01BQ19USU1FU1RBTVBJTkdfTEJOIDgKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9NQUNfVElNRVNUQU1QSU5HX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9USU1FU1RBTVBfTEJOIDkKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9USU1FU1RBTVBfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX1NOSUZGX0xCTiAxMAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX1NOSUZGX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9TTklGRl9MQk4gMTEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9TTklGRl9XSURUSCAxCisvKiBOdW1iZXIgb2YgRkFUU092MiBjb250ZXh0cyBwZXIgZGF0YXBhdGggc3VwcG9ydGVkIGJ5IHRoaXMgTklDLiBOb3QgcHJlc2VudAorICogb24gb2xkZXIgZmlybXdhcmUgKGNoZWNrIHRoZSBsZW5ndGgpLgorICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9UU09fVjJfTl9DT05URVhUU19PRlNUIDI0CisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9UU09fVjJfTl9DT05URVhUU19MRU4gMgorLyogT25lIGJ5dGUgcGVyIFBGIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiB0aGUgZXh0ZXJuYWwgcG9ydCBhc3NpZ25lZCB0byB0aGlzCisgKiBQRiwgaW5kZXhlZCBieSBQRiBudW1iZXIuIFNwZWNpYWwgdmFsdWVzIGluZGljYXRlIHRoYXQgYSBQRiBpcyBlaXRoZXIgbm90CisgKiBwcmVzZW50IG9yIG5vdCBhc3NpZ25lZC4KKyAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUEZTX1RPX1BPUlRTX0FTU0lHTk1FTlRfT0ZTVCAyNgorI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUEZTX1RPX1BPUlRTX0FTU0lHTk1FTlRfTEVOIDEKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1BGU19UT19QT1JUU19BU1NJR05NRU5UX05VTSAxNgorLyogZW51bTogVGhlIGNhbGxlciBpcyBub3QgcGVybWl0dGVkIHRvIGFjY2VzcyBpbmZvcm1hdGlvbiBvbiB0aGlzIFBGLiAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfQUNDRVNTX05PVF9QRVJNSVRURUQgIDB4ZmYKKy8qIGVudW06IFBGIGRvZXMgbm90IGV4aXN0LiAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUEZfTk9UX1BSRVNFTlQgIDB4ZmUKKy8qIGVudW06IFBGIGRvZXMgZXhpc3QgYnV0IGlzIG5vdCBhc3NpZ25lZCB0byBhbnkgZXh0ZXJuYWwgcG9ydC4gKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1BGX05PVF9BU1NJR05FRCAgMHhmZAorLyogZW51bTogVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBQRiBpcyBhc3NpZ25lZCwgYnV0IGl0IGNhbm5vdCBiZSBleHByZXNzZWQKKyAqIGluIHRoaXMgZmllbGQuIEl0IGlzIGludGVuZGVkIGZvciBhIHBvc3NpYmxlIGZ1dHVyZSBzaXR1YXRpb24gd2hlcmUgYSBtb3JlCisgKiBjb21wbGV4IHNjaGVtZSBvZiBQRnMgdG8gcG9ydHMgbWFwcGluZyBpcyBiZWluZyB1c2VkLiBUaGUgZnV0dXJlIGRyaXZlcgorICogc2hvdWxkIGxvb2sgZm9yIGEgbmV3IGZpZWxkIHN1cHBvcnRpbmcgdGhlIG5ldyBzY2hlbWUuIFRoZSBjdXJyZW50L29sZAorICogZHJpdmVyIHNob3VsZCB0cmVhdCB0aGlzIHZhbHVlIGFzIFBGX05PVF9BU1NJR05FRC4KKyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfSU5DT01QQVRJQkxFX0FTU0lHTk1FTlQgIDB4ZmMKKy8qIE9uZSBieXRlIHBlciBQRiBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgaXRzIFZGcywgaW5kZXhlZCBieSBQRiBudW1iZXIuIEEKKyAqIHNwZWNpYWwgdmFsdWUgaW5kaWNhdGVzIHRoYXQgYSBQRiBpcyBub3QgcHJlc2VudC4KKyAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfTlVNX1ZGU19QRVJfUEZfT0ZTVCA0MgorI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfTlVNX1ZGU19QRVJfUEZfTEVOIDEKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX05VTV9WRlNfUEVSX1BGX05VTSAxNgorLyogZW51bTogVGhlIGNhbGxlciBpcyBub3QgcGVybWl0dGVkIHRvIGFjY2VzcyBpbmZvcm1hdGlvbiBvbiB0aGlzIFBGLiAqLworLyogICAgICAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfQUNDRVNTX05PVF9QRVJNSVRURUQgIDB4ZmYgKi8KKy8qIGVudW06IFBGIGRvZXMgbm90IGV4aXN0LiAqLworLyogICAgICAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUEZfTk9UX1BSRVNFTlQgIDB4ZmUgKi8KKy8qIE51bWJlciBvZiBWSXMgYXZhaWxhYmxlIGZvciBlYWNoIGV4dGVybmFsIHBvcnQgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX05VTV9WSVNfUEVSX1BPUlRfT0ZTVCA1OAorI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfTlVNX1ZJU19QRVJfUE9SVF9MRU4gMgorI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfTlVNX1ZJU19QRVJfUE9SVF9OVU0gNAorLyogU2l6ZSBvZiBSWCBkZXNjcmlwdG9yIGNhY2hlIGV4cHJlc3NlZCBhcyBiaW5hcnkgbG9nYXJpdGhtIFRoZSBhY3R1YWwgc2l6ZQorICogZXF1YWxzICgyIF4gUlhfREVTQ19DQUNIRV9TSVpFKQorICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9ERVNDX0NBQ0hFX1NJWkVfT0ZTVCA2NgorI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfREVTQ19DQUNIRV9TSVpFX0xFTiAxCisvKiBTaXplIG9mIFRYIGRlc2NyaXB0b3IgY2FjaGUgZXhwcmVzc2VkIGFzIGJpbmFyeSBsb2dhcml0aG0gVGhlIGFjdHVhbCBzaXplCisgKiBlcXVhbHMgKDIgXiBUWF9ERVNDX0NBQ0hFX1NJWkUpCisgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX0RFU0NfQ0FDSEVfU0laRV9PRlNUIDY3CisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9ERVNDX0NBQ0hFX1NJWkVfTEVOIDEKKy8qIFRvdGFsIG51bWJlciBvZiBhdmFpbGFibGUgUElPIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX05VTV9QSU9fQlVGRlNfT0ZTVCA2OAorI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfTlVNX1BJT19CVUZGU19MRU4gMgorLyogU2l6ZSBvZiBhIHNpbmdsZSBQSU8gYnVmZmVyICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9TSVpFX1BJT19CVUZGX09GU1QgNzAKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1NJWkVfUElPX0JVRkZfTEVOIDIKKy8qIE9uIGNoaXBzIGxhdGVyIHRoYW4gTWVkZm9yZCB0aGUgYW1vdW50IG9mIGFkZHJlc3Mgc3BhY2UgYXNzaWduZWQgdG8gZWFjaCBWSQorICogaXMgY29uZmlndXJhYmxlLiBUaGlzIGlzIGEgZ2xvYmFsIHNldHRpbmcgdGhhdCB0aGUgZHJpdmVyIG11c3QgcXVlcnkgdG8KKyAqIGRpc2NvdmVyIHRoZSBWSSB0byBhZGRyZXNzIG1hcHBpbmcuIEN1dC10aHJvdWdoIFBJTyAoQ1RQSU8pIGluIG5vdCBhdmFpbGFibGUKKyAqIHdpdGggOGsgVkkgd2luZG93cy4KKyAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVklfV0lORE9XX01PREVfT0ZTVCA3MgorI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVklfV0lORE9XX01PREVfTEVOIDEKKy8qIGVudW06IEVhY2ggVkkgb2NjdXBpZXMgOGsgYXMgb24gSHVudGluZ3RvbiBhbmQgTWVkZm9yZC4gUElPIGlzIGF0IG9mZnNldCA0ay4KKyAqIENUUElPIGlzIG5vdCBtYXBwZWQuCisgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1ZJX1dJTkRPV19NT0RFXzhLICAgMHgwCisvKiBlbnVtOiBFYWNoIFZJIG9jY3VwaWVzIDE2ay4gUElPIGlzIGF0IG9mZnNldCA0ay4gQ1RQSU8gaXMgYXQgb2Zmc2V0IDEyay4gKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1ZJX1dJTkRPV19NT0RFXzE2SyAgMHgxCisvKiBlbnVtOiBFYWNoIFZJIG9jY3VwaWVzIDY0ay4gUElPIGlzIGF0IG9mZnNldCA0ay4gQ1RQSU8gaXMgYXQgb2Zmc2V0IDEyay4gKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1ZJX1dJTkRPV19NT0RFXzY0SyAgMHgyCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogTUNfQ01EX1YyX0VYVE4KQEAgLTkwMjYsNyArOTQzNCw3IEBACiAgKi8KICNkZWZpbmUgTUNfQ01EX0dFVF9SWERQX0NPTkZJRyAweGMyCiAKLSNkZWZpbmUgTUNfQ01EXzB4YzJfUFJJVklMRUdFX0NURyBTUklPVl9DVEdfQURNSU4KKyNkZWZpbmUgTUNfQ01EXzB4YzJfUFJJVklMRUdFX0NURyBTUklPVl9DVEdfR0VORVJBTAogCiAvKiBNQ19DTURfR0VUX1JYRFBfQ09ORklHX0lOIG1zZ3JlcXVlc3QgKi8KICNkZWZpbmUgICAgTUNfQ01EX0dFVF9SWERQX0NPTkZJR19JTl9MRU4gMApAQCAtMTAxMjUsNyArMTA1MzMsOSBAQAogICogdGhhdCB0aGlzIG9wZXJhdGlvbiByZXR1cm5zIGEgemVyby1sZW5ndGggcmVzcG9uc2UKICAqLwogI2RlZmluZSAgICAgICAgICBNQ19DTURfTElDRU5TSU5HX1YzX0lOX09QX1VQREFURV9MSUNFTlNFICAweDAKLS8qIGVudW06IHJlcG9ydCBjb3VudHMgb2YgaW5zdGFsbGVkIGxpY2Vuc2VzICovCisvKiBlbnVtOiByZXBvcnQgY291bnRzIG9mIGluc3RhbGxlZCBsaWNlbnNlcyBSZXR1cm5zIEVBR0FJTiBpZiBsaWNlbnNlCisgKiBwcm9jZXNzaW5nICh1cGRhdGluZykgaGFzIGJlZW4gc3RhcnRlZCBidXQgbm90IHlldCBjb21wbGV0ZWQuCisgKi8KICNkZWZpbmUgICAgICAgICAgTUNfQ01EX0xJQ0VOU0lOR19WM19JTl9PUF9SRVBPUlRfTElDRU5TRSAgMHgxCiAKIC8qIE1DX0NNRF9MSUNFTlNJTkdfVjNfT1VUIG1zZ3Jlc3BvbnNlICovCkBAIC0xMDc2Myw2ICsxMTE3Myw4IEBACiAjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfV09SS0FST1VORFNfT1VUX0JVRzQyMDA4IDB4MjAKIC8qIGVudW06IEJ1ZyAyNjgwNyBmZWF0dXJlcyBwcmVzZW50IGluIGZpcm13YXJlIChtdWx0aWNhc3QgZmlsdGVyIGNoYWluaW5nKSAqLwogI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX1dPUktBUk9VTkRTX09VVF9CVUcyNjgwNyAweDQwCisvKiBlbnVtOiBCdWcgNjEyNjUgd29yayBhcm91bmQgKGJyb2tlbiBFVlEgVE1SIHdyaXRlcykuICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfV09SS0FST1VORFNfT1VUX0JVRzYxMjY1IDB4ODAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMTI4MCwyMiArMTE2OTIsMTEwIEBACiAjZGVmaW5lIE1DX0NNRF8weDExOF9QUklWSUxFR0VfQ1RHIFNSSU9WX0NUR19BRE1JTgogCiAvKiBNQ19DTURfUlhfQkFMQU5DSU5HX0lOIG1zZ3JlcXVlc3QgKi8KLSNkZWZpbmUgICAgTUNfQ01EX1JYX0JBTEFOQ0lOR19JTl9MRU4gNAorI2RlZmluZSAgICBNQ19DTURfUlhfQkFMQU5DSU5HX0lOX0xFTiAxNgogLyogVGhlIFJYIHBvcnQgd2hvc2UgdXBjb252ZXJ0ZXIgdGFibGUgd2lsbCBiZSBtb2RpZmllZCAqLwogI2RlZmluZSAgICAgICBNQ19DTURfUlhfQkFMQU5DSU5HX0lOX1BPUlRfT0ZTVCAwCi0jZGVmaW5lICAgICAgIE1DX0NNRF9SWF9CQUxBTkNJTkdfSU5fUE9SVF9MRU4gMQogLyogVGhlIFZMQU4gcHJpb3JpdHkgYXNzb2NpYXRlZCB0byB0aGUgdGFibGUgaW5kZXggYW5kIHZGSUZPICovCi0jZGVmaW5lICAgICAgIE1DX0NNRF9SWF9CQUxBTkNJTkdfSU5fUFJJT1JJVFlfT0ZTVCAxCi0jZGVmaW5lICAgICAgIE1DX0NNRF9SWF9CQUxBTkNJTkdfSU5fUFJJT1JJVFlfTEVOIDEKKyNkZWZpbmUgICAgICAgTUNfQ01EX1JYX0JBTEFOQ0lOR19JTl9QUklPUklUWV9PRlNUIDQKIC8qIFRoZSByZXN1bHRpbmcgYml0IG9mIFNSQ15EU1QgZm9yIGluZGV4aW5nIHRoZSB0YWJsZSAqLwotI2RlZmluZSAgICAgICBNQ19DTURfUlhfQkFMQU5DSU5HX0lOX1NSQ19EU1RfT0ZTVCAyCi0jZGVmaW5lICAgICAgIE1DX0NNRF9SWF9CQUxBTkNJTkdfSU5fU1JDX0RTVF9MRU4gMQorI2RlZmluZSAgICAgICBNQ19DTURfUlhfQkFMQU5DSU5HX0lOX1NSQ19EU1RfT0ZTVCA4CiAvKiBUaGUgUlggZW5naW5lIHRvIHdoaWNoIHRoZSB2RklGTyBpbiB0aGUgdGFibGUgZW50cnkgd2lsbCBwb2ludCB0byAqLwotI2RlZmluZSAgICAgICBNQ19DTURfUlhfQkFMQU5DSU5HX0lOX0VOR19PRlNUIDMKLSNkZWZpbmUgICAgICAgTUNfQ01EX1JYX0JBTEFOQ0lOR19JTl9FTkdfTEVOIDEKKyNkZWZpbmUgICAgICAgTUNfQ01EX1JYX0JBTEFOQ0lOR19JTl9FTkdfT0ZTVCAxMgogCiAvKiBNQ19DTURfUlhfQkFMQU5DSU5HX09VVCBtc2dyZXNwb25zZSAqLwogI2RlZmluZSAgICBNQ19DTURfUlhfQkFMQU5DSU5HX09VVF9MRU4gMAogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNQ19DTURfU0VUX0VWUV9UTVIKKyAqIFVwZGF0ZSB0aGUgdGltZXIgbG9hZCwgdGltZXIgcmVsb2FkIGFuZCB0aW1lciBtb2RlIHZhbHVlcyBmb3IgYSBnaXZlbiBFVlEuCisgKiBUaGUgcmVxdWVzdGVkIHRpbWVyIHZhbHVlcyAoaW4gVE1SX0xPQURfUkVRX05TIGFuZCBUTVJfUkVMT0FEX1JFUV9OUykgd2lsbAorICogYmUgcm91bmRlZCB1cCB0byB0aGUgZ3JhbnVsYXJpdHkgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSwgdGhlbiB0cnVuY2F0ZWQKKyAqIHRvIHRoZSByYW5nZSBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlLiBUaGUgcmVzdWx0aW5nIHZhbHVlIGFmdGVyIHRoZQorICogcm91bmRpbmcgYW5kIHRydW5jYXRpb24gd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyIChpbiBUTVJfTE9BRF9BQ1RfTlMKKyAqIGFuZCBUTVJfUkVMT0FEX0FDVF9OUykuCisgKi8KKyNkZWZpbmUgTUNfQ01EX1NFVF9FVlFfVE1SIDB4MTIwCisKKyNkZWZpbmUgTUNfQ01EXzB4MTIwX1BSSVZJTEVHRV9DVEcgU1JJT1ZfQ1RHX0dFTkVSQUwKKworLyogTUNfQ01EX1NFVF9FVlFfVE1SX0lOIG1zZ3JlcXVlc3QgKi8KKyNkZWZpbmUgICAgTUNfQ01EX1NFVF9FVlFfVE1SX0lOX0xFTiAxNgorLyogRnVuY3Rpb24tcmVsYXRpdmUgcXVldWUgaW5zdGFuY2UgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX1NFVF9FVlFfVE1SX0lOX0lOU1RBTkNFX09GU1QgMAorLyogUmVxdWVzdGVkIHZhbHVlIGZvciB0aW1lciBsb2FkIChpbiBuYW5vc2Vjb25kcykgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX1NFVF9FVlFfVE1SX0lOX1RNUl9MT0FEX1JFUV9OU19PRlNUIDQKKy8qIFJlcXVlc3RlZCB2YWx1ZSBmb3IgdGltZXIgcmVsb2FkIChpbiBuYW5vc2Vjb25kcykgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX1NFVF9FVlFfVE1SX0lOX1RNUl9SRUxPQURfUkVRX05TX09GU1QgOAorLyogVGltZXIgbW9kZS4gTWVhbmluZ3MgYXMgcGVyIEVWUV9UTVJfUkVHLlRDX1RJTUVSX1ZBTCAqLworI2RlZmluZSAgICAgICBNQ19DTURfU0VUX0VWUV9UTVJfSU5fVE1SX01PREVfT0ZTVCAxMgorI2RlZmluZSAgICAgICAgICBNQ19DTURfU0VUX0VWUV9UTVJfSU5fVElNRVJfTU9ERV9ESVMgIDB4MCAvKiBlbnVtICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9TRVRfRVZRX1RNUl9JTl9USU1FUl9NT0RFX0lNTUVEX1NUQVJUICAweDEgLyogZW51bSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfU0VUX0VWUV9UTVJfSU5fVElNRVJfTU9ERV9UUklHX1NUQVJUICAweDIgLyogZW51bSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfU0VUX0VWUV9UTVJfSU5fVElNRVJfTU9ERV9JTlRfSExET0ZGICAweDMgLyogZW51bSAqLworCisvKiBNQ19DTURfU0VUX0VWUV9UTVJfT1VUIG1zZ3Jlc3BvbnNlICovCisjZGVmaW5lICAgIE1DX0NNRF9TRVRfRVZRX1RNUl9PVVRfTEVOIDgKKy8qIEFjdHVhbCB2YWx1ZSBmb3IgdGltZXIgbG9hZCAoaW4gbmFub3NlY29uZHMpICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9TRVRfRVZRX1RNUl9PVVRfVE1SX0xPQURfQUNUX05TX09GU1QgMAorLyogQWN0dWFsIHZhbHVlIGZvciB0aW1lciByZWxvYWQgKGluIG5hbm9zZWNvbmRzKSAqLworI2RlZmluZSAgICAgICBNQ19DTURfU0VUX0VWUV9UTVJfT1VUX1RNUl9SRUxPQURfQUNUX05TX09GU1QgNAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTCisgKiBRdWVyeSBwcm9wZXJ0aWVzIGFib3V0IHRoZSBldmVudCBxdWV1ZSB0aW1lcnMuCisgKi8KKyNkZWZpbmUgTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVMgMHgxMjIKKworI2RlZmluZSBNQ19DTURfMHgxMjJfUFJJVklMRUdFX0NURyBTUklPVl9DVEdfR0VORVJBTAorCisvKiBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFU19JTiBtc2dyZXF1ZXN0ICovCisjZGVmaW5lICAgIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTX0lOX0xFTiAwCisKKy8qIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVCBtc2dyZXNwb25zZSAqLworI2RlZmluZSAgICBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfTEVOIDM2CisvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX0ZMQUdTX09GU1QgMAorLyogRm9yIHRpbWVycyB1cGRhdGVkIHZpYSB3cml0ZXMgdG8gRVZRX1RNUl9SRUcsIHRoaXMgaXMgdGhlIHRpbWUgaW50ZXJ2YWwgKGluCisgKiBuYW5vc2Vjb25kcykgZm9yIGVhY2ggaW5jcmVtZW50IG9mIHRoZSB0aW1lciBsb2FkL3JlbG9hZCBjb3VudC4gVGhlCisgKiByZXF1ZXN0ZWQgZHVyYXRpb24gb2YgYSB0aW1lciBpcyB0aGlzIHZhbHVlIG11bHRpcGxpZWQgYnkgdGhlIHRpbWVyCisgKiBsb2FkL3JlbG9hZCBjb3VudC4KKyAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfVE1SX1JFR19OU19QRVJfQ09VTlRfT0ZTVCA0CisvKiBGb3IgdGltZXJzIHVwZGF0ZWQgdmlhIHdyaXRlcyB0byBFVlFfVE1SX1JFRywgdGhpcyBpcyB0aGUgbWF4aW11bSB2YWx1ZQorICogYWxsb3dlZCBmb3IgdGltZXIgbG9hZC9yZWxvYWQgY291bnRzLgorICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9UTVJfUkVHX01BWF9DT1VOVF9PRlNUIDgKKy8qIEZvciB0aW1lcnMgdXBkYXRlZCB2aWEgd3JpdGVzIHRvIEVWUV9UTVJfUkVHLCB0aW1lciBsb2FkL3JlbG9hZCBjb3VudHMgbm90IGEKKyAqIG11bHRpcGxlIG9mIHRoaXMgc3RlcCBzaXplIHdpbGwgYmUgcm91bmRlZCBpbiBhbiBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkCisgKiBtYW5uZXIuCisgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX1RNUl9SRUdfU1RFUF9PRlNUIDEyCisvKiBNYXhpbXVtIHRpbWVyIGR1cmF0aW9uIChpbiBuYW5vc2Vjb25kcykgZm9yIHRpbWVycyB1cGRhdGVkIHZpYSBNQ0RJLiBPbmx5CisgKiBtZWFuaW5nZnVsIGlmIE1DX0NNRF9TRVRfRVZRX1RNUiBpcyBpbXBsZW1lbnRlZC4KKyAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfTUNESV9UTVJfTUFYX05TX09GU1QgMTYKKy8qIFRpbWVyIGR1cmF0aW9ucyByZXF1ZXN0ZWQgdmlhIE1DREkgdGhhdCBhcmUgbm90IGEgbXVsdGlwbGUgb2YgdGhpcyBzdGVwIHNpemUKKyAqIHdpbGwgYmUgcm91bmRlZCB1cC4gT25seSBtZWFuaW5nZnVsIGlmIE1DX0NNRF9TRVRfRVZRX1RNUiBpcyBpbXBsZW1lbnRlZC4KKyAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfTUNESV9UTVJfU1RFUF9OU19PRlNUIDIwCisvKiBGb3IgdGltZXJzIHVwZGF0ZWQgdXNpbmcgdGhlIGJ1ZzM1Mzg4IHdvcmthcm91bmQsIHRoaXMgaXMgdGhlIHRpbWUgaW50ZXJ2YWwKKyAqIChpbiBuYW5vc2Vjb25kcykgZm9yIGVhY2ggaW5jcmVtZW50IG9mIHRoZSB0aW1lciBsb2FkL3JlbG9hZCBjb3VudC4gVGhlCisgKiByZXF1ZXN0ZWQgZHVyYXRpb24gb2YgYSB0aW1lciBpcyB0aGlzIHZhbHVlIG11bHRpcGxpZWQgYnkgdGhlIHRpbWVyCisgKiBsb2FkL3JlbG9hZCBjb3VudC4gVGhpcyBmaWVsZCBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgdGhlIGJ1ZzM1Mzg4IHdvcmthcm91bmQKKyAqIGlzIGVuYWJsZWQuCisgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX0JVRzM1Mzg4X1RNUl9OU19QRVJfQ09VTlRfT0ZTVCAyNAorLyogRm9yIHRpbWVycyB1cGRhdGVkIHVzaW5nIHRoZSBidWczNTM4OCB3b3JrYXJvdW5kLCB0aGlzIGlzIHRoZSBtYXhpbXVtIHZhbHVlCisgKiBhbGxvd2VkIGZvciB0aW1lciBsb2FkL3JlbG9hZCBjb3VudHMuIFRoaXMgZmllbGQgaXMgb25seSBtZWFuaW5nZnVsIGlmIHRoZQorICogYnVnMzUzODggd29ya2Fyb3VuZCBpcyBlbmFibGVkLgorICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9CVUczNTM4OF9UTVJfTUFYX0NPVU5UX09GU1QgMjgKKy8qIEZvciB0aW1lcnMgdXBkYXRlZCB1c2luZyB0aGUgYnVnMzUzODggd29ya2Fyb3VuZCwgdGltZXIgbG9hZC9yZWxvYWQgY291bnRzCisgKiBub3QgYSBtdWx0aXBsZSBvZiB0aGlzIHN0ZXAgc2l6ZSB3aWxsIGJlIHJvdW5kZWQgaW4gYW4gaW1wbGVtZW50YXRpb24KKyAqIGRlZmluZWQgbWFubmVyLiBUaGlzIGZpZWxkIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB0aGUgYnVnMzUzODggd29ya2Fyb3VuZCBpcworICogZW5hYmxlZC4KKyAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfQlVHMzUzODhfVE1SX1NURVBfT0ZTVCAzMgogCiAjZW5kaWYgLyogTUNESV9QQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9uZXRfZHJpdmVyLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbmV0X2RyaXZlci5oCmluZGV4IDlmZjA2MmEuLjk5ZDhjODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9uZXRfZHJpdmVyLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL25ldF9kcml2ZXIuaApAQCAtNzYsNiArNzYsOSBAQAogLyogTWF4aW11bSBwb3NzaWJsZSBNVFUgdGhlIGRyaXZlciBzdXBwb3J0cyAqLwogI2RlZmluZSBFRlhfTUFYX01UVSAoOSAqIDEwMjQpCiAKKy8qIE1pbmltdW0gTVRVLCBmcm9tIFJGQzc5MSAoSVApICovCisjZGVmaW5lIEVGWF9NSU5fTVRVIDY4CisKIC8qIFNpemUgb2YgYW4gUlggc2NhdHRlciBidWZmZXIuICBTbWFsbCBlbm91Z2ggdG8gcGFjayAyIGludG8gYSA0SyBwYWdlLAogICogYW5kIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjYWNoZSBsaW5lIHNpemUuCiAgKi8KQEAgLTM5Miw3ICszOTUsNyBAQAogICogQGV2ZW50cV9pbml0OiBFdmVudCBxdWV1ZSBpbml0aWFsaXNlZCBmbGFnCiAgKiBAZW5hYmxlZDogQ2hhbm5lbCBlbmFibGVkIGluZGljYXRvcgogICogQGlycTogSVJRIG51bWJlciAoTVNJIGFuZCBNU0ktWCBvbmx5KQotICogQGlycV9tb2RlcmF0aW9uOiBJUlEgbW9kZXJhdGlvbiB2YWx1ZSAoaW4gaGFyZHdhcmUgdGlja3MpCisgKiBAaXJxX21vZGVyYXRpb25fdXM6IElSUSBtb2RlcmF0aW9uIHZhbHVlIChpbiBtaWNyb3NlY29uZHMpCiAgKiBAbmFwaV9kZXY6IE5ldCBkZXZpY2UgdXNlZCB3aXRoIE5BUEkKICAqIEBuYXBpX3N0cjogTkFQSSBjb250cm9sIHN0cnVjdHVyZQogICogQHN0YXRlOiBzdGF0ZSBmb3IgTkFQSSB2cyBidXN5IHBvbGxpbmcKQEAgLTQzMyw3ICs0MzYsNyBAQAogCWJvb2wgZXZlbnRxX2luaXQ7CiAJYm9vbCBlbmFibGVkOwogCWludCBpcnE7Ci0JdW5zaWduZWQgaW50IGlycV9tb2RlcmF0aW9uOworCXVuc2lnbmVkIGludCBpcnFfbW9kZXJhdGlvbl91czsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmFwaV9kZXY7CiAJc3RydWN0IG5hcGlfc3RydWN0IG5hcGlfc3RyOwogI2lmZGVmIENPTkZJR19ORVRfUlhfQlVTWV9QT0xMCkBAIC04MTAsOCArODEzLDEwIEBACiAgKiBAbWVtYmFzZTogTWVtb3J5IEJBUiB2YWx1ZQogICogQGludGVycnVwdF9tb2RlOiBJbnRlcnJ1cHQgbW9kZQogICogQHRpbWVyX3F1YW50dW1fbnM6IEludGVycnVwdCB0aW1lciBxdWFudHVtLCBpbiBuYW5vc2Vjb25kcworICogQHRpbWVyX21heF9uczogSW50ZXJydXB0IHRpbWVyIG1heGltdW0gdmFsdWUsIGluIG5hbm9zZWNvbmRzCiAgKiBAaXJxX3J4X2FkYXB0aXZlOiBBZGFwdGl2ZSBJUlEgbW9kZXJhdGlvbiBlbmFibGVkIGZvciBSWCBldmVudCBxdWV1ZXMKLSAqIEBpcnFfcnhfbW9kZXJhdGlvbjogSVJRIG1vZGVyYXRpb24gdGltZSBmb3IgUlggZXZlbnQgcXVldWVzCisgKiBAaXJxX3J4X21vZF9zdGVwX3VzOiBTdGVwIHNpemUgZm9yIElSUSBtb2RlcmF0aW9uIGZvciBSWCBldmVudCBxdWV1ZXMKKyAqIEBpcnFfcnhfbW9kZXJhdGlvbl91czogSVJRIG1vZGVyYXRpb24gdGltZSBmb3IgUlggZXZlbnQgcXVldWVzCiAgKiBAbXNnX2VuYWJsZTogTG9nIG1lc3NhZ2UgZW5hYmxlIGZsYWdzCiAgKiBAc3RhdGU6IERldmljZSBzdGF0ZSBudW1iZXIgKCVTVEFURV8qKS4gU2VyaWFsaXNlZCBieSB0aGUgcnRubF9sb2NrLgogICogQHJlc2V0X3BlbmRpbmc6IEJpdG1hc2sgZm9yIHBlbmRpbmcgcmVzZXRzCkBAIC05NDAsOCArOTQ1LDEwIEBACiAKIAllbnVtIGVmeF9pbnRfbW9kZSBpbnRlcnJ1cHRfbW9kZTsKIAl1bnNpZ25lZCBpbnQgdGltZXJfcXVhbnR1bV9uczsKKwl1bnNpZ25lZCBpbnQgdGltZXJfbWF4X25zOwogCWJvb2wgaXJxX3J4X2FkYXB0aXZlOwotCXVuc2lnbmVkIGludCBpcnFfcnhfbW9kZXJhdGlvbjsKKwl1bnNpZ25lZCBpbnQgaXJxX21vZF9zdGVwX3VzOworCXVuc2lnbmVkIGludCBpcnFfcnhfbW9kZXJhdGlvbl91czsKIAl1MzIgbXNnX2VuYWJsZTsKIAogCWVudW0gbmljX3N0YXRlIHN0YXRlOwpAQCAtMTI3MSw3ICsxMjc4LDcgQEAKIAlpbnQgKCptY2RpX3BvbGxfcmVib290KShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIAl2b2lkICgqbWNkaV9yZWJvb3RfZGV0ZWN0ZWQpKHN0cnVjdCBlZnhfbmljICplZngpOwogCXZvaWQgKCppcnFfZW5hYmxlX21hc3Rlcikoc3RydWN0IGVmeF9uaWMgKmVmeCk7Ci0Jdm9pZCAoKmlycV90ZXN0X2dlbmVyYXRlKShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKKwlpbnQgKCppcnFfdGVzdF9nZW5lcmF0ZSkoc3RydWN0IGVmeF9uaWMgKmVmeCk7CiAJdm9pZCAoKmlycV9kaXNhYmxlX25vbl9ldikoc3RydWN0IGVmeF9uaWMgKmVmeCk7CiAJaXJxcmV0dXJuX3QgKCppcnFfaGFuZGxlX21zaSkoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIAlpcnFyZXR1cm5fdCAoKmlycV9oYW5kbGVfbGVnYWN5KShpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL25pYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL25pYy5jCmluZGV4IDg5YjgzZTUuLmFhMTk0NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9uaWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbmljLmMKQEAgLTY2LDExICs2NiwxMSBAQAogCWNoYW5uZWwtPmVmeC0+dHlwZS0+ZXZfdGVzdF9nZW5lcmF0ZShjaGFubmVsKTsKIH0KIAotdm9pZCBlZnhfbmljX2lycV90ZXN0X3N0YXJ0KHN0cnVjdCBlZnhfbmljICplZngpCitpbnQgZWZ4X25pY19pcnFfdGVzdF9zdGFydChzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewogCWVmeC0+bGFzdF9pcnFfY3B1ID0gLTE7CiAJc21wX3dtYigpOwotCWVmeC0+dHlwZS0+aXJxX3Rlc3RfZ2VuZXJhdGUoZWZ4KTsKKwlyZXR1cm4gZWZ4LT50eXBlLT5pcnFfdGVzdF9nZW5lcmF0ZShlZngpOwogfQogCiAvKiBIb29rIGludGVycnVwdCBoYW5kbGVyKHMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbmljLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbmljLmgKaW5kZXggOTY5NDRjMy4uNzNiZWU3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL25pYy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9uaWMuaApAQCAtNTA3LDEwICs1MDcsMTMgQEAKICAqIEBzdGF0czogSGFyZHdhcmUgc3RhdGlzdGljcwogICogQHdvcmthcm91bmRfMzUzODg6IEZsYWc6IGZpcm13YXJlIHN1cHBvcnRzIHdvcmthcm91bmQgZm9yIGJ1ZyAzNTM4OAogICogQHdvcmthcm91bmRfMjY4MDc6IEZsYWc6IGZpcm13YXJlIHN1cHBvcnRzIHdvcmthcm91bmQgZm9yIGJ1ZyAyNjgwNworICogQHdvcmthcm91bmRfNjEyNjU6IEZsYWc6IGZpcm13YXJlIHN1cHBvcnRzIHdvcmthcm91bmQgZm9yIGJ1ZyA2MTI2NQogICogQG11c3RfY2hlY2tfZGF0YXBhdGhfY2FwczogRmxhZzogQGRhdGFwYXRoX2NhcHMgbmVlZHMgdG8gYmUgcmV2YWxpZGF0ZWQKICAqCWFmdGVyIE1DIHJlYm9vdAogICogQGRhdGFwYXRoX2NhcHM6IENhcGFiaWxpdGllcyBvZiBkYXRhcGF0aCBmaXJtd2FyZSAoRkxBR1MxIGZpZWxkIG9mCiAgKgklTUNfQ01EX0dFVF9DQVBBQklMSVRJRVMgcmVzcG9uc2UpCisgKiBAZGF0YXBhdGhfY2FwczI6IEZ1cnRoZXIgQ2FwYWJpbGl0aWVzIG9mIGRhdGFwYXRoIGZpcm13YXJlIChGTEFHUzIgZmllbGQgb2YKKyAqICVNQ19DTURfR0VUX0NBUEFCSUxJVElFUyByZXNwb25zZSkKICAqIEByeF9kcGNwdV9md19pZDogRmlybXdhcmUgSUQgb2YgdGhlIFJ4RFBDUFUKICAqIEB0eF9kcGNwdV9md19pZDogRmlybXdhcmUgSUQgb2YgdGhlIFR4RFBDUFUKICAqIEB2cG9ydF9pZDogVGhlIGZ1bmN0aW9uJ3MgdnBvcnQgSUQsIG9ubHkgcmVsZXZhbnQgZm9yIFBGcwpAQCAtNTQwLDggKzU0MywxMCBAQAogCXU2NCBzdGF0c1tFRjEwX1NUQVRfQ09VTlRdOwogCWJvb2wgd29ya2Fyb3VuZF8zNTM4ODsKIAlib29sIHdvcmthcm91bmRfMjY4MDc7CisJYm9vbCB3b3JrYXJvdW5kXzYxMjY1OwogCWJvb2wgbXVzdF9jaGVja19kYXRhcGF0aF9jYXBzOwogCXUzMiBkYXRhcGF0aF9jYXBzOworCXUzMiBkYXRhcGF0aF9jYXBzMjsKIAl1bnNpZ25lZCBpbnQgcnhfZHBjcHVfZndfaWQ7CiAJdW5zaWduZWQgaW50IHR4X2RwY3B1X2Z3X2lkOwogCXVuc2lnbmVkIGludCB2cG9ydF9pZDsKQEAgLTc0MSwxMiArNzQ2LDEyIEBACiAKIC8qIEludGVycnVwdHMgKi8KIGludCBlZnhfbmljX2luaXRfaW50ZXJydXB0KHN0cnVjdCBlZnhfbmljICplZngpOwotdm9pZCBlZnhfbmljX2lycV90ZXN0X3N0YXJ0KHN0cnVjdCBlZnhfbmljICplZngpOworaW50IGVmeF9uaWNfaXJxX3Rlc3Rfc3RhcnQoc3RydWN0IGVmeF9uaWMgKmVmeCk7CiB2b2lkIGVmeF9uaWNfZmluaV9pbnRlcnJ1cHQoc3RydWN0IGVmeF9uaWMgKmVmeCk7CiAKIC8qIEZhbGNvbi9TaWVuYSBpbnRlcnJ1cHRzICovCiB2b2lkIGVmeF9mYXJjaF9pcnFfZW5hYmxlX21hc3RlcihzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKLXZvaWQgZWZ4X2ZhcmNoX2lycV90ZXN0X2dlbmVyYXRlKHN0cnVjdCBlZnhfbmljICplZngpOworaW50IGVmeF9mYXJjaF9pcnFfdGVzdF9nZW5lcmF0ZShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIHZvaWQgZWZ4X2ZhcmNoX2lycV9kaXNhYmxlX21hc3RlcihzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIGlycXJldHVybl90IGVmeF9mYXJjaF9tc2lfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiBpcnFyZXR1cm5fdCBlZnhfZmFyY2hfbGVnYWN5X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3B0cC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3B0cC5jCmluZGV4IGM3NzFlMGEuLjc3YTUzNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9wdHAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvcHRwLmMKQEAgLTEyNjksMTMgKzEyNjksMTMgQEAKIAkJaWYgKElTX0VSUihwdHAtPnBoY19jbG9jaykpIHsKIAkJCXJjID0gUFRSX0VSUihwdHAtPnBoY19jbG9jayk7CiAJCQlnb3RvIGZhaWwzOwotCQl9Ci0KLQkJSU5JVF9XT1JLKCZwdHAtPnBwc193b3JrLCBlZnhfcHRwX3Bwc193b3JrZXIpOwotCQlwdHAtPnBwc193b3Jrd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgic2ZjX3BwcyIpOwotCQlpZiAoIXB0cC0+cHBzX3dvcmt3cSkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBmYWlsNDsKKwkJfSBlbHNlIGlmIChwdHAtPnBoY19jbG9jaykgeworCQkJSU5JVF9XT1JLKCZwdHAtPnBwc193b3JrLCBlZnhfcHRwX3Bwc193b3JrZXIpOworCQkJcHRwLT5wcHNfd29ya3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInNmY19wcHMiKTsKKwkJCWlmICghcHRwLT5wcHNfd29ya3dxKSB7CisJCQkJcmMgPSAtRU5PTUVNOworCQkJCWdvdG8gZmFpbDQ7CisJCQl9CiAJCX0KIAl9CiAJcHRwLT5uaWNfdHNfZW5hYmxlZCA9IGZhbHNlOwpAQCAtMTMwNiw3ICsxMzA2LDcgQEAKIHsKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gY2hhbm5lbC0+ZWZ4OwogCi0JY2hhbm5lbC0+aXJxX21vZGVyYXRpb24gPSAwOworCWNoYW5uZWwtPmlycV9tb2RlcmF0aW9uX3VzID0gMDsKIAljaGFubmVsLT5yeF9xdWV1ZS5jb3JlX2luZGV4ID0gMDsKIAogCXJldHVybiBlZnhfcHRwX3Byb2JlKGVmeCwgY2hhbm5lbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2VsZnRlc3QuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zZWxmdGVzdC5jCmluZGV4IDlkNzg4MzAuLmNkMzhiNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zZWxmdGVzdC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zZWxmdGVzdC5jCkBAIC0xMzUsMTEgKzEzNSwxOSBAQAogewogCXVuc2lnbmVkIGxvbmcgdGltZW91dCwgd2FpdDsKIAlpbnQgY3B1OworCWludCByYzsKIAogCW5ldGlmX2RiZyhlZngsIGRydiwgZWZ4LT5uZXRfZGV2LCAidGVzdGluZyBpbnRlcnJ1cHRzXG4iKTsKIAl0ZXN0cy0+aW50ZXJydXB0ID0gLTE7CiAKLQllZnhfbmljX2lycV90ZXN0X3N0YXJ0KGVmeCk7CisJcmMgPSBlZnhfbmljX2lycV90ZXN0X3N0YXJ0KGVmeCk7CisJaWYgKHJjID09IC1FTk9UU1VQUCkgeworCQluZXRpZl9kYmcoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCSAgImRpcmVjdCBpbnRlcnJ1cHQgdGVzdGluZyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJdGVzdHMtPmludGVycnVwdCA9IDA7CisJCXJldHVybiAwOworCX0KKwogCXRpbWVvdXQgPSBqaWZmaWVzICsgSVJRX1RJTUVPVVQ7CiAJd2FpdCA9IDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zZWxmdGVzdC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NlbGZ0ZXN0LmgKaW5kZXggMDA5ZGJlOC4uMzJhNDI3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NlbGZ0ZXN0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NlbGZ0ZXN0LmgKQEAgLTI4LDcgKzI4LDcgQEAKIAogLyogRWZ4IHNlbGYgdGVzdCByZXN1bHRzCiAgKiBGb3IgZmllbGRzIHdoaWNoIGFyZSBub3QgY291bnRlcnMsIDEgaW5kaWNhdGVzIHN1Y2Nlc3MgYW5kIC0xCi0gKiBpbmRpY2F0ZXMgZmFpbHVyZS4KKyAqIGluZGljYXRlcyBmYWlsdXJlOyAwIGluZGljYXRlcyB0ZXN0IGNvdWxkIG5vdCBiZSBydW4uCiAgKi8KIHN0cnVjdCBlZnhfc2VsZl90ZXN0cyB7CiAJLyogb25saW5lIHRlc3RzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2llbmEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zaWVuYS5jCmluZGV4IDIyMTliNTQuLjA0ZWQxYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zaWVuYS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zaWVuYS5jCkBAIC0zNCwxOSArMzQsMjQgQEAKIAogc3RhdGljIHZvaWQgc2llbmFfcHVzaF9pcnFfbW9kZXJhdGlvbihzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwpCiB7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IGNoYW5uZWwtPmVmeDsKIAllZnhfZHdvcmRfdCB0aW1lcl9jbWQ7CiAKLQlpZiAoY2hhbm5lbC0+aXJxX21vZGVyYXRpb24pCisJaWYgKGNoYW5uZWwtPmlycV9tb2RlcmF0aW9uX3VzKSB7CisJCXVuc2lnbmVkIGludCB0aWNrczsKKworCQl0aWNrcyA9IGVmeF91c2Vjc190b190aWNrcyhlZngsIGNoYW5uZWwtPmlycV9tb2RlcmF0aW9uX3VzKTsKIAkJRUZYX1BPUFVMQVRFX0RXT1JEXzIodGltZXJfY21kLAogCQkJCSAgICAgRlJGX0NaX1RDX1RJTUVSX01PREUsCiAJCQkJICAgICBGRkVfQ1pfVElNRVJfTU9ERV9JTlRfSExET0ZGLAogCQkJCSAgICAgRlJGX0NaX1RDX1RJTUVSX1ZBTCwKLQkJCQkgICAgIGNoYW5uZWwtPmlycV9tb2RlcmF0aW9uIC0gMSk7Ci0JZWxzZQorCQkJCSAgICAgdGlja3MgLSAxKTsKKwl9IGVsc2UgewogCQlFRlhfUE9QVUxBVEVfRFdPUkRfMih0aW1lcl9jbWQsCiAJCQkJICAgICBGUkZfQ1pfVENfVElNRVJfTU9ERSwKIAkJCQkgICAgIEZGRV9DWl9USU1FUl9NT0RFX0RJUywKIAkJCQkgICAgIEZSRl9DWl9UQ19USU1FUl9WQUwsIDApOworCX0KIAllZnhfd3JpdGVkX3BhZ2VfbG9ja2VkKGNoYW5uZWwtPmVmeCwgJnRpbWVyX2NtZCwgRlJfQlpfVElNRVJfQ09NTUFORF9QMCwKIAkJCSAgICAgICBjaGFubmVsLT5jaGFubmVsKTsKIH0KQEAgLTIyMiw2ICsyMjcsOSBAQAogCWVmeC0+dGltZXJfcXVhbnR1bV9ucyA9CiAJCShjYXBzICYgKDEgPDwgTUNfQ01EX0NBUEFCSUxJVElFU19UVVJCT19BQ1RJVkVfTEJOKSkgPwogCQkzMDcyIDogNjE0NDsgLyogNzY4IGN5Y2xlcyAqLworCWVmeC0+dGltZXJfbWF4X25zID0gZWZ4LT50eXBlLT50aW1lcl9wZXJpb2RfbWF4ICoKKwkJCSAgICBlZngtPnRpbWVyX3F1YW50dW1fbnM7CisKIAlyZXR1cm4gcmM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zcmlvdi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NyaW92LmMKaW5kZXggODE2YzQ0Ni4uOWFiY2Y0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NyaW92LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NyaW92LmMKQEAgLTIyLDcgKzIyLDcgQEAKIH0KIAogaW50IGVmeF9zcmlvdl9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgaW50IHZmX2ksIHUxNiB2bGFuLAotCQkJICB1OCBxb3MpCisJCQkgIHU4IHFvcywgX19iZTE2IHZsYW5fcHJvdG8pCiB7CiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCkBAIC0zMSw2ICszMSw5IEBACiAJCSAgICAocW9zICYgfihWTEFOX1BSSU9fTUFTSyA+PiBWTEFOX1BSSU9fU0hJRlQpKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCisJCWlmICh2bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFRKSkKKwkJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCiAJCXJldHVybiBlZngtPnR5cGUtPnNyaW92X3NldF92Zl92bGFuKGVmeCwgdmZfaSwgdmxhbiwgcW9zKTsKIAl9IGVsc2UgewogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc3Jpb3YuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zcmlvdi5oCmluZGV4IDQwMGRmNTIuLmJhMTc2MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zcmlvdi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zcmlvdi5oCkBAIC0xNiw3ICsxNiw3IEBACiAKIGludCBlZnhfc3Jpb3Zfc2V0X3ZmX21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgaW50IHZmX2ksIHU4ICptYWMpOwogaW50IGVmeF9zcmlvdl9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgaW50IHZmX2ksIHUxNiB2bGFuLAotCQkJICB1OCBxb3MpOworCQkJICB1OCBxb3MsIF9fYmUxNiB2bGFuX3Byb3RvKTsKIGludCBlZnhfc3Jpb3Zfc2V0X3ZmX3Nwb29mY2hrKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBpbnQgdmZfaSwKIAkJCSAgICAgIGJvb2wgc3Bvb2ZjaGspOwogaW50IGVmeF9zcmlvdl9nZXRfdmZfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBpbnQgdmZfaSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy93b3JrYXJvdW5kcy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3dvcmthcm91bmRzLmgKaW5kZXggMjMxMGI3NS4uMzUxY2QxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3dvcmthcm91bmRzLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3dvcmthcm91bmRzLmgKQEAgLTUwLDQgKzUwLDggQEAKICNkZWZpbmUgRUZYX1dPUktBUk9VTkRfMzUzODgoZWZ4KQkJCQkJXAogCShlZnhfbmljX3JldihlZngpID09IEVGWF9SRVZfSFVOVF9BMCAmJiBFRlhfRUYxMF9XT1JLQVJPVU5EXzM1Mzg4KGVmeCkpCiAKKy8qIE1vZGVyYXRpb24gdGltZXIgYWNjZXNzIG11c3QgZ28gdGhyb3VnaCBNQ0RJICovCisjZGVmaW5lIEVGWF9FRjEwX1dPUktBUk9VTkRfNjEyNjUoZWZ4KQkJCQkJXAorCSgoKHN0cnVjdCBlZnhfZWYxMF9uaWNfZGF0YSAqKWVmeC0+bmljX2RhdGEpLT53b3JrYXJvdW5kXzYxMjY1KQorCiAjZW5kaWYgLyogRUZYX1dPUktBUk9VTkRTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Npcy9zaXM5MDAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Npcy9zaXM5MDAuYwppbmRleCA5NTAwMWVlNC4uNmY4NTI3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lzL3NpczkwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Npcy9zaXM5MDAuYwpAQCAtMTQyNiw3ICsxNDI2LDcgQEAKIAkJcnhfZmxhZ3MgfD0gUnhBVFg7CiAJfQogCi0jaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVkxBTl84MDIxUSkKIAkvKiBDYW4gYWNjZXB0IEp1bWJvIHBhY2tldCAqLwogCXJ4X2ZsYWdzIHw9IFJ4QUpBQjsKICNlbmRpZgpAQCAtMTc1MCw3ICsxNzUwLDcgQEAKIAkJZGF0YV9zaXplID0gcnhfc3RhdHVzICYgRFNJWkU7CiAJCXJ4X3NpemUgPSBkYXRhX3NpemUgLSBDUkNfU0laRTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1ZMQU5fODAyMVEpCiAJCS8qIGBgVE9PTE9ORycnIGZsYWcgbWVhbnMganVtYm8gcGFja2V0IHJlY2VpdmVkLiAqLwogCQlpZiAoKHJ4X3N0YXR1cyAmIFRPT0xPTkcpICYmIGRhdGFfc2l6ZSA8PSBNQVhfRlJBTUVfU0laRSkKIAkJCXJ4X3N0YXR1cyAmPSAofiAoKHVuc2lnbmVkIGludClUT09MT05HKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zaXMvc2lzOTAwLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zaXMvc2lzOTAwLmgKaW5kZXggN2Q0MzBkMy4uZjBkYTNkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lzL3NpczkwMC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Npcy9zaXM5MDAuaApAQCAtMzEwLDcgKzMxMCw3IEBACiAjZGVmaW5lIENSQ19TSVpFICAgICAgICAgICAgICAgIDQKICNkZWZpbmUgTUFDX0hFQURFUl9TSVpFICAgICAgICAgMTQKIAotI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1ZMQU5fODAyMVEpCiAjZGVmaW5lIE1BWF9GUkFNRV9TSVpFICAoMTUxOCArIDQpCiAjZWxzZQogI2RlZmluZSBNQVhfRlJBTUVfU0laRSAgMTUxOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbWM5MXguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21jOTF4LmMKaW5kZXggNzI2YjgwZi4uNzMyMTI1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbWM5MXguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3NtYzkxeC5jCkBAIC0yMjc1LDYgKzIyNzUsMTMgQEAKIAlpZiAocGQpIHsKIAkJbWVtY3B5KCZscC0+Y2ZnLCBwZCwgc2l6ZW9mKGxwLT5jZmcpKTsKIAkJbHAtPmlvX3NoaWZ0ID0gU01DOTFYX0lPX1NISUZUKGxwLT5jZmcuZmxhZ3MpOworCisJCWlmICghU01DXzhCSVQobHApICYmICFTTUNfMTZCSVQobHApKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJImF0IGxlYXN0IG9uZSBvZiA4LWJpdCBvciAxNi1iaXQgYWNjZXNzIHN1cHBvcnQgaXMgcmVxdWlyZWQuXG4iKTsKKwkJCXJldCA9IC1FTlhJTzsKKwkJCWdvdG8gb3V0X2ZyZWVfbmV0ZGV2OworCQl9CiAJfQogCiAjaWYgSVNfQlVJTFRJTihDT05GSUdfT0YpCkBAIC0yMzE2LDYgKzIzMjMsOSBAQAogCQl9IGVsc2UgewogCQkJbHAtPmNmZy5mbGFncyB8PSBTTUM5MVhfVVNFXzE2QklUOwogCQl9CisJCWlmICghZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKCZwZGV2LT5kZXYsICJyZWctc2hpZnQiLAorCQkJCQkgICAgICAmdmFsKSkKKwkJCWxwLT5pb19zaGlmdCA9IHZhbDsKIAl9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbWM5MXguaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21jOTF4LmgKaW5kZXggMWE1NWM3OS4uZWE4NDY1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbWM5MXguaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3NtYzkxeC5oCkBAIC0zNyw2ICszNywyNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtYzkxeC5oPgogCiAvKgorICogQW55IDE2LWJpdCBhY2Nlc3MgaXMgcGVyZm9ybWVkIHdpdGggdHdvIDgtYml0IGFjY2Vzc2VzIGlmIHRoZSBoYXJkd2FyZQorICogY2FuJ3QgZG8gaXQgZGlyZWN0bHkuIE1vc3QgcmVnaXN0ZXJzIGFyZSAxNi1iaXQgc28gdGhvc2UgYXJlIG1hbmRhdG9yeS4KKyAqLworI2RlZmluZSBTTUNfb3V0d19iKHgsIGEsIHIpCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJdW5zaWduZWQgaW50IF9fdmFsMTYgPSAoeCk7CQkJCVwKKwkJdW5zaWduZWQgaW50IF9fcmVnID0gKHIpOwkJCQlcCisJCVNNQ19vdXRiKF9fdmFsMTYsIGEsIF9fcmVnKTsJCQkJXAorCQlTTUNfb3V0YihfX3ZhbDE2ID4+IDgsIGEsIF9fcmVnICsgKDEgPDwgU01DX0lPX1NISUZUKSk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFNNQ19pbndfYihhLCByKQkJCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkJdW5zaWduZWQgaW50IF9fdmFsMTY7CQkJCQlcCisJCXVuc2lnbmVkIGludCBfX3JlZyA9IHI7CQkJCQlcCisJCV9fdmFsMTYgID0gU01DX2luYihhLCBfX3JlZyk7CQkJCVwKKwkJX192YWwxNiB8PSBTTUNfaW5iKGEsIF9fcmVnICsgKDEgPDwgU01DX0lPX1NISUZUKSkgPDwgODsgXAorCQlfX3ZhbDE2OwkJCQkJCVwKKwl9KQorCisvKgogICogRGVmaW5lIHlvdXIgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGJ1cyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgaGVyZS4KICAqLwogCkBAIC01NSwxMCArNzYsMzAgQEAKICNkZWZpbmUgU01DX0lPX1NISUZUCQkobHAtPmlvX3NoaWZ0KQogCiAjZGVmaW5lIFNNQ19pbmIoYSwgcikJCXJlYWRiKChhKSArIChyKSkKLSNkZWZpbmUgU01DX2ludyhhLCByKQkJcmVhZHcoKGEpICsgKHIpKQorI2RlZmluZSBTTUNfaW53KGEsIHIpCQkJCQkJCVwKKwkoewkJCQkJCQkJXAorCQl1bnNpZ25lZCBpbnQgX19zbWNfciA9IHI7CQkJCVwKKwkJU01DXzE2QklUKGxwKSA/IHJlYWR3KChhKSArIF9fc21jX3IpIDoJCQlcCisJCVNNQ184QklUKGxwKSA/IFNNQ19pbndfYihhLCBfX3NtY19yKSA6CQkJXAorCQkoeyBCVUcoKTsgMDsgfSk7CQkJCQlcCisJfSkKKwogI2RlZmluZSBTTUNfaW5sKGEsIHIpCQlyZWFkbCgoYSkgKyAocikpCiAjZGVmaW5lIFNNQ19vdXRiKHYsIGEsIHIpCXdyaXRlYih2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19vdXR3KHYsIGEsIHIpCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJdW5zaWduZWQgaW50IF9fdiA9IHYsIF9fc21jX3IgPSByOwkJCVwKKwkJaWYgKFNNQ18xNkJJVChscCkpCQkJCQlcCisJCQlfX1NNQ19vdXR3KF9fdiwgYSwgX19zbWNfcik7CQkJXAorCQllbHNlIGlmIChTTUNfOEJJVChscCkpCQkJCQlcCisJCQlTTUNfb3V0d19iKF9fdiwgYSwgX19zbWNfcik7CQkJXAorCQllbHNlCQkJCQkJCVwKKwkJCUJVRygpOwkJCQkJCVwKKwl9IHdoaWxlICgwKQorCiAjZGVmaW5lIFNNQ19vdXRsKHYsIGEsIHIpCXdyaXRlbCh2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19pbnNiKGEsIHIsIHAsIGwpCXJlYWRzYigoYSkgKyAociksIHAsIGwpCisjZGVmaW5lIFNNQ19vdXRzYihhLCByLCBwLCBsKQl3cml0ZXNiKChhKSArIChyKSwgcCwgbCkKICNkZWZpbmUgU01DX2luc3coYSwgciwgcCwgbCkJcmVhZHN3KChhKSArIChyKSwgcCwgbCkKICNkZWZpbmUgU01DX291dHN3KGEsIHIsIHAsIGwpCXdyaXRlc3coKGEpICsgKHIpLCBwLCBsKQogI2RlZmluZSBTTUNfaW5zbChhLCByLCBwLCBsKQlyZWFkc2woKGEpICsgKHIpLCBwLCBsKQpAQCAtNjYsNyArMTA3LDcgQEAKICNkZWZpbmUgU01DX0lSUV9GTEFHUwkJKC0xKQkvKiBmcm9tIHJlc291cmNlICovCiAKIC8qIFdlIGFjdHVhbGx5IGNhbid0IHdyaXRlIGhhbGZ3b3JkcyBwcm9wZXJseSBpZiBub3Qgd29yZCBhbGlnbmVkICovCi1zdGF0aWMgaW5saW5lIHZvaWQgU01DX291dHcodTE2IHZhbCwgdm9pZCBfX2lvbWVtICppb2FkZHIsIGludCByZWcpCitzdGF0aWMgaW5saW5lIHZvaWQgX19TTUNfb3V0dyh1MTYgdmFsLCB2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IHJlZykKIHsKIAlpZiAoKG1hY2hpbmVfaXNfbWFpbnN0b25lKCkgfHwgbWFjaGluZV9pc19zdGFyZ2F0ZTIoKSB8fAogCSAgICAgbWFjaGluZV9pc19weGFfaWRwKCkpICYmIHJlZyAmIDIpIHsKQEAgLTQxNiwyNCArNDU3LDggQEAKIAogI2lmICEgU01DX0NBTl9VU0VfMTZCSVQKIAotLyoKLSAqIEFueSAxNi1iaXQgYWNjZXNzIGlzIHBlcmZvcm1lZCB3aXRoIHR3byA4LWJpdCBhY2Nlc3NlcyBpZiB0aGUgaGFyZHdhcmUKLSAqIGNhbid0IGRvIGl0IGRpcmVjdGx5LiBNb3N0IHJlZ2lzdGVycyBhcmUgMTYtYml0IHNvIHRob3NlIGFyZSBtYW5kYXRvcnkuCi0gKi8KLSNkZWZpbmUgU01DX291dHcoeCwgaW9hZGRyLCByZWcpCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQl1bnNpZ25lZCBpbnQgX192YWwxNiA9ICh4KTsJCQkJXAotCQlTTUNfb3V0YiggX192YWwxNiwgaW9hZGRyLCByZWcgKTsJCQlcCi0JCVNNQ19vdXRiKCBfX3ZhbDE2ID4+IDgsIGlvYWRkciwgcmVnICsgKDEgPDwgU01DX0lPX1NISUZUKSk7XAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIFNNQ19pbncoaW9hZGRyLCByZWcpCQkJCQkJXAotCSh7CQkJCQkJCQlcCi0JCXVuc2lnbmVkIGludCBfX3ZhbDE2OwkJCQkJXAotCQlfX3ZhbDE2ID0gIFNNQ19pbmIoIGlvYWRkciwgcmVnICk7CQkJXAotCQlfX3ZhbDE2IHw9IFNNQ19pbmIoIGlvYWRkciwgcmVnICsgKDEgPDwgU01DX0lPX1NISUZUKSkgPDwgODsgXAotCQlfX3ZhbDE2OwkJCQkJCVwKLQl9KQotCisjZGVmaW5lIFNNQ19vdXR3KHgsIGlvYWRkciwgcmVnKQlTTUNfb3V0d19iKHgsIGlvYWRkciwgcmVnKQorI2RlZmluZSBTTUNfaW53KGlvYWRkciwgcmVnKQkJU01DX2lud19iKGlvYWRkciwgcmVnKQogI2RlZmluZSBTTUNfaW5zdyhhLCByLCBwLCBsKQkJQlVHKCkKICNkZWZpbmUgU01DX291dHN3KGEsIHIsIHAsIGwpCQlCVUcoKQogCkBAIC00NDUsNyArNDcwLDkgQEAKICNlbmRpZgogCiAjaWYgISBTTUNfQ0FOX1VTRV84QklUCisjdW5kZWYgU01DX2luYgogI2RlZmluZSBTTUNfaW5iKGlvYWRkciwgcmVnKQkJKHsgQlVHKCk7IDA7IH0pCisjdW5kZWYgU01DX291dGIKICNkZWZpbmUgU01DX291dGIoeCwgaW9hZGRyLCByZWcpCUJVRygpCiAjZGVmaW5lIFNNQ19pbnNiKGEsIHIsIHAsIGwpCQlCVUcoKQogI2RlZmluZSBTTUNfb3V0c2IoYSwgciwgcCwgbCkJCUJVRygpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3Ntc2M5MTF4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3Ntc2M5MTF4LmMKaW5kZXggY2EzMTM0NS4uZTliODU3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbXNjOTExeC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21zYzkxMXguYwpAQCAtNjIsNiArNjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvcGVydHkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CiAKICNpbmNsdWRlICJzbXNjOTExeC5oIgogCkBAIC0xNDcsNiArMTQ4LDkgQEAKIAkvKiByZWd1bGF0b3JzICovCiAJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgc3VwcGxpZXNbU01TQzkxMVhfTlVNX1NVUFBMSUVTXTsKIAorCS8qIFJlc2V0IEdQSU8gKi8KKwlzdHJ1Y3QgZ3Bpb19kZXNjICpyZXNldF9ncGlvZDsKKwogCS8qIGNsb2NrICovCiAJc3RydWN0IGNsayAqY2xrOwogfTsKQEAgLTQzOCw2ICs0NDIsMTEgQEAKIAkJbmV0ZGV2X2VycihuZGV2LCAiY291bGRuJ3QgZ2V0IHJlZ3VsYXRvcnMgJWRcbiIsCiAJCQkJcmV0KTsKIAorCS8qIFJlcXVlc3Qgb3B0aW9uYWwgUkVTRVQgR1BJTyAqLworCXBkYXRhLT5yZXNldF9ncGlvZCA9IGRldm1fZ3Bpb2RfZ2V0X29wdGlvbmFsKCZwZGV2LT5kZXYsCisJCQkJCQkgICAgICJyZXNldCIsCisJCQkJCQkgICAgIEdQSU9EX09VVF9MT1cpOworCiAJLyogUmVxdWVzdCBjbG9jayAqLwogCXBkYXRhLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOwogCWlmIChJU19FUlIocGRhdGEtPmNsaykpCkBAIC0xMDk5LDE1ICsxMTA4LDggQEAKIAkJZ290byBlcnJfb3V0X2ZyZWVfYnVzXzI7CiAJfQogCi0JaWYgKHNtc2M5MTF4X21paV9wcm9iZShkZXYpIDwgMCkgewotCQlTTVNDX1dBUk4ocGRhdGEsIHByb2JlLCAiRXJyb3IgcmVnaXN0ZXJpbmcgbWlpIGJ1cyIpOwotCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9idXNfMzsKLQl9Ci0KIAlyZXR1cm4gMDsKIAotZXJyX291dF91bnJlZ2lzdGVyX2J1c18zOgotCW1kaW9idXNfdW5yZWdpc3RlcihwZGF0YS0+bWlpX2J1cyk7CiBlcnJfb3V0X2ZyZWVfYnVzXzI6CiAJbWRpb2J1c19mcmVlKHBkYXRhLT5taWlfYnVzKTsKIGVycl9vdXRfMToKQEAgLTE1MTQsMjMgKzE1MTYsOTAgQEAKIAlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIElOVF9TVFMsIDB4RkZGRkZGRkYpOwogfQogCitzdGF0aWMgaXJxcmV0dXJuX3Qgc21zYzkxMXhfaXJxaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3Qgc21zYzkxMXhfZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBpbnRzdHMgPSBzbXNjOTExeF9yZWdfcmVhZChwZGF0YSwgSU5UX1NUUyk7CisJdTMyIGludGVuID0gc21zYzkxMXhfcmVnX3JlYWQocGRhdGEsIElOVF9FTik7CisJaW50IHNlcnZpY2VkID0gSVJRX05PTkU7CisJdTMyIHRlbXA7CisKKwlpZiAodW5saWtlbHkoaW50c3RzICYgaW50ZW4gJiBJTlRfU1RTX1NXX0lOVF8pKSB7CisJCXRlbXAgPSBzbXNjOTExeF9yZWdfcmVhZChwZGF0YSwgSU5UX0VOKTsKKwkJdGVtcCAmPSAofklOVF9FTl9TV19JTlRfRU5fKTsKKwkJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBJTlRfRU4sIHRlbXApOworCQlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIElOVF9TVFMsIElOVF9TVFNfU1dfSU5UXyk7CisJCXBkYXRhLT5zb2Z0d2FyZV9pcnFfc2lnbmFsID0gMTsKKwkJc21wX3dtYigpOworCQlzZXJ2aWNlZCA9IElSUV9IQU5ETEVEOworCX0KKworCWlmICh1bmxpa2VseShpbnRzdHMgJiBpbnRlbiAmIElOVF9TVFNfUlhTVE9QX0lOVF8pKSB7CisJCS8qIENhbGxlZCB3aGVuIHRoZXJlIGlzIGEgbXVsdGljYXN0IHVwZGF0ZSBzY2hlZHVsZWQgYW5kCisJCSAqIGl0IGlzIG5vdyBzYWZlIHRvIGNvbXBsZXRlIHRoZSB1cGRhdGUgKi8KKwkJU01TQ19UUkFDRShwZGF0YSwgaW50ciwgIlJYIFN0b3AgaW50ZXJydXB0Iik7CisJCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgSU5UX1NUUywgSU5UX1NUU19SWFNUT1BfSU5UXyk7CisJCWlmIChwZGF0YS0+bXVsdGljYXN0X3VwZGF0ZV9wZW5kaW5nKQorCQkJc21zYzkxMXhfcnhfbXVsdGljYXN0X3VwZGF0ZV93b3JrYXJvdW5kKHBkYXRhKTsKKwkJc2VydmljZWQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoaW50c3RzICYgaW50ZW4gJiBJTlRfU1RTX1RERkFfKSB7CisJCXRlbXAgPSBzbXNjOTExeF9yZWdfcmVhZChwZGF0YSwgRklGT19JTlQpOworCQl0ZW1wIHw9IEZJRk9fSU5UX1RYX0FWQUlMX0xFVkVMXzsKKwkJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBGSUZPX0lOVCwgdGVtcCk7CisJCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgSU5UX1NUUywgSU5UX1NUU19UREZBXyk7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJc2VydmljZWQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAodW5saWtlbHkoaW50c3RzICYgaW50ZW4gJiBJTlRfU1RTX1JYRV8pKSB7CisJCVNNU0NfVFJBQ0UocGRhdGEsIGludHIsICJSWCBFcnJvciBpbnRlcnJ1cHQiKTsKKwkJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBJTlRfU1RTLCBJTlRfU1RTX1JYRV8pOworCQlzZXJ2aWNlZCA9IElSUV9IQU5ETEVEOworCX0KKworCWlmIChsaWtlbHkoaW50c3RzICYgaW50ZW4gJiBJTlRfU1RTX1JTRkxfKSkgeworCQlpZiAobGlrZWx5KG5hcGlfc2NoZWR1bGVfcHJlcCgmcGRhdGEtPm5hcGkpKSkgeworCQkJLyogRGlzYWJsZSBSeCBpbnRlcnJ1cHRzICovCisJCQl0ZW1wID0gc21zYzkxMXhfcmVnX3JlYWQocGRhdGEsIElOVF9FTik7CisJCQl0ZW1wICY9ICh+SU5UX0VOX1JTRkxfRU5fKTsKKwkJCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgSU5UX0VOLCB0ZW1wKTsKKwkJCS8qIFNjaGVkdWxlIGEgTkFQSSBwb2xsICovCisJCQlfX25hcGlfc2NoZWR1bGUoJnBkYXRhLT5uYXBpKTsKKwkJfSBlbHNlIHsKKwkJCVNNU0NfV0FSTihwZGF0YSwgcnhfZXJyLCAibmFwaV9zY2hlZHVsZV9wcmVwIGZhaWxlZCIpOworCQl9CisJCXNlcnZpY2VkID0gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIHNlcnZpY2VkOworfQorCiBzdGF0aWMgaW50IHNtc2M5MTF4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc21zYzkxMXhfZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGludCB0aW1lb3V0OwogCXVuc2lnbmVkIGludCB0ZW1wOwogCXVuc2lnbmVkIGludCBpbnRjZmc7CisJaW50IHJldHZhbDsKKwlpbnQgaXJxX2ZsYWdzOwogCi0JLyogaWYgdGhlIHBoeSBpcyBub3QgeWV0IHJlZ2lzdGVyZWQsIHJldHJ5IGxhdGVyKi8KKwkvKiBmaW5kIGFuZCBzdGFydCB0aGUgZ2l2ZW4gcGh5ICovCiAJaWYgKCFkZXYtPnBoeWRldikgewotCQlTTVNDX1dBUk4ocGRhdGEsIGh3LCAicGh5X2RldiBpcyBOVUxMIik7Ci0JCXJldHVybiAtRUFHQUlOOworCQlyZXR2YWwgPSBzbXNjOTExeF9taWlfcHJvYmUoZGV2KTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCVNNU0NfV0FSTihwZGF0YSwgcHJvYmUsICJFcnJvciBzdGFydGluZyBwaHkiKTsKKwkJCWdvdG8gb3V0OworCQl9CiAJfQogCiAJLyogUmVzZXQgdGhlIExBTjkxMXggKi8KLQlpZiAoc21zYzkxMXhfc29mdF9yZXNldChwZGF0YSkpIHsKKwlyZXR2YWwgPSBzbXNjOTExeF9zb2Z0X3Jlc2V0KHBkYXRhKTsKKwlpZiAocmV0dmFsKSB7CiAJCVNNU0NfV0FSTihwZGF0YSwgaHcsICJzb2Z0IHJlc2V0IGZhaWxlZCIpOwotCQlyZXR1cm4gLUVJTzsKKwkJZ290byBtaWlfZnJlZV9vdXQ7CiAJfQogCiAJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBIV19DRkcsIDB4MDAwNTAwMDApOwpAQCAtMTU4Niw2ICsxNjU1LDE1IEBACiAJcGRhdGEtPnNvZnR3YXJlX2lycV9zaWduYWwgPSAwOwogCXNtcF93bWIoKTsKIAorCWlycV9mbGFncyA9IGlycV9nZXRfdHJpZ2dlcl90eXBlKGRldi0+aXJxKTsKKwlyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgc21zYzkxMXhfaXJxaGFuZGxlciwKKwkJCSAgICAgaXJxX2ZsYWdzIHwgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCVNNU0NfV0FSTihwZGF0YSwgcHJvYmUsCisJCQkgICJVbmFibGUgdG8gY2xhaW0gcmVxdWVzdGVkIGlycTogJWQiLCBkZXYtPmlycSk7CisJCWdvdG8gbWlpX2ZyZWVfb3V0OworCX0KKwogCXRlbXAgPSBzbXNjOTExeF9yZWdfcmVhZChwZGF0YSwgSU5UX0VOKTsKIAl0ZW1wIHw9IElOVF9FTl9TV19JTlRfRU5fOwogCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgSU5UX0VOLCB0ZW1wKTsKQEAgLTE2MDAsNyArMTY3OCw4IEBACiAJaWYgKCFwZGF0YS0+c29mdHdhcmVfaXJxX3NpZ25hbCkgewogCQluZXRkZXZfd2FybihkZXYsICJJU1IgZmFpbGVkIHNpZ25hbGluZyB0ZXN0IChJUlEgJWQpXG4iLAogCQkJICAgIGRldi0+aXJxKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gaXJxX3N0b3Bfb3V0OwogCX0KIAlTTVNDX1RSQUNFKHBkYXRhLCBpZnVwLCAiSVJRIGhhbmRsZXIgcGFzc2VkIHRlc3QgdXNpbmcgSVJRICVkIiwKIAkJICAgZGV2LT5pcnEpOwpAQCAtMTY0Niw2ICsxNzI1LDE0IEBACiAKIAluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogCXJldHVybiAwOworCitpcnFfc3RvcF9vdXQ6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CittaWlfZnJlZV9vdXQ6CisJcGh5X2Rpc2Nvbm5lY3QoZGV2LT5waHlkZXYpOworCWRldi0+cGh5ZGV2ID0gTlVMTDsKK291dDoKKwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKiBFbnRyeSBwb2ludCBmb3Igc3RvcHBpbmcgdGhlIGludGVyZmFjZSAqLwpAQCAtMTY2Nyw5ICsxNzU0LDE1IEBACiAJZGV2LT5zdGF0cy5yeF9kcm9wcGVkICs9IHNtc2M5MTF4X3JlZ19yZWFkKHBkYXRhLCBSWF9EUk9QKTsKIAlzbXNjOTExeF90eF91cGRhdGVfdHhjb3VudGVycyhkZXYpOwogCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKIAkvKiBCcmluZyB0aGUgUEhZIGRvd24gKi8KLQlpZiAoZGV2LT5waHlkZXYpCisJaWYgKGRldi0+cGh5ZGV2KSB7CiAJCXBoeV9zdG9wKGRldi0+cGh5ZGV2KTsKKwkJcGh5X2Rpc2Nvbm5lY3QoZGV2LT5waHlkZXYpOworCQlkZXYtPnBoeWRldiA9IE5VTEw7CisJfQorCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAKIAlTTVNDX1RSQUNFKHBkYXRhLCBpZmRvd24sICJJbnRlcmZhY2Ugc3RvcHBlZCIpOwogCXJldHVybiAwOwpAQCAtMTgxMSw2NyArMTkwNCw2IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRhdGEtPm1hY19sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBzbXNjOTExeF9pcnFoYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOwotCXN0cnVjdCBzbXNjOTExeF9kYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KGRldik7Ci0JdTMyIGludHN0cyA9IHNtc2M5MTF4X3JlZ19yZWFkKHBkYXRhLCBJTlRfU1RTKTsKLQl1MzIgaW50ZW4gPSBzbXNjOTExeF9yZWdfcmVhZChwZGF0YSwgSU5UX0VOKTsKLQlpbnQgc2VydmljZWQgPSBJUlFfTk9ORTsKLQl1MzIgdGVtcDsKLQotCWlmICh1bmxpa2VseShpbnRzdHMgJiBpbnRlbiAmIElOVF9TVFNfU1dfSU5UXykpIHsKLQkJdGVtcCA9IHNtc2M5MTF4X3JlZ19yZWFkKHBkYXRhLCBJTlRfRU4pOwotCQl0ZW1wICY9ICh+SU5UX0VOX1NXX0lOVF9FTl8pOwotCQlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIElOVF9FTiwgdGVtcCk7Ci0JCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgSU5UX1NUUywgSU5UX1NUU19TV19JTlRfKTsKLQkJcGRhdGEtPnNvZnR3YXJlX2lycV9zaWduYWwgPSAxOwotCQlzbXBfd21iKCk7Ci0JCXNlcnZpY2VkID0gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JaWYgKHVubGlrZWx5KGludHN0cyAmIGludGVuICYgSU5UX1NUU19SWFNUT1BfSU5UXykpIHsKLQkJLyogQ2FsbGVkIHdoZW4gdGhlcmUgaXMgYSBtdWx0aWNhc3QgdXBkYXRlIHNjaGVkdWxlZCBhbmQKLQkJICogaXQgaXMgbm93IHNhZmUgdG8gY29tcGxldGUgdGhlIHVwZGF0ZSAqLwotCQlTTVNDX1RSQUNFKHBkYXRhLCBpbnRyLCAiUlggU3RvcCBpbnRlcnJ1cHQiKTsKLQkJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBJTlRfU1RTLCBJTlRfU1RTX1JYU1RPUF9JTlRfKTsKLQkJaWYgKHBkYXRhLT5tdWx0aWNhc3RfdXBkYXRlX3BlbmRpbmcpCi0JCQlzbXNjOTExeF9yeF9tdWx0aWNhc3RfdXBkYXRlX3dvcmthcm91bmQocGRhdGEpOwotCQlzZXJ2aWNlZCA9IElSUV9IQU5ETEVEOwotCX0KLQotCWlmIChpbnRzdHMgJiBpbnRlbiAmIElOVF9TVFNfVERGQV8pIHsKLQkJdGVtcCA9IHNtc2M5MTF4X3JlZ19yZWFkKHBkYXRhLCBGSUZPX0lOVCk7Ci0JCXRlbXAgfD0gRklGT19JTlRfVFhfQVZBSUxfTEVWRUxfOwotCQlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIEZJRk9fSU5ULCB0ZW1wKTsKLQkJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBJTlRfU1RTLCBJTlRfU1RTX1RERkFfKTsKLQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwotCQlzZXJ2aWNlZCA9IElSUV9IQU5ETEVEOwotCX0KLQotCWlmICh1bmxpa2VseShpbnRzdHMgJiBpbnRlbiAmIElOVF9TVFNfUlhFXykpIHsKLQkJU01TQ19UUkFDRShwZGF0YSwgaW50ciwgIlJYIEVycm9yIGludGVycnVwdCIpOwotCQlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIElOVF9TVFMsIElOVF9TVFNfUlhFXyk7Ci0JCXNlcnZpY2VkID0gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JaWYgKGxpa2VseShpbnRzdHMgJiBpbnRlbiAmIElOVF9TVFNfUlNGTF8pKSB7Ci0JCWlmIChsaWtlbHkobmFwaV9zY2hlZHVsZV9wcmVwKCZwZGF0YS0+bmFwaSkpKSB7Ci0JCQkvKiBEaXNhYmxlIFJ4IGludGVycnVwdHMgKi8KLQkJCXRlbXAgPSBzbXNjOTExeF9yZWdfcmVhZChwZGF0YSwgSU5UX0VOKTsKLQkJCXRlbXAgJj0gKH5JTlRfRU5fUlNGTF9FTl8pOwotCQkJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBJTlRfRU4sIHRlbXApOwotCQkJLyogU2NoZWR1bGUgYSBOQVBJIHBvbGwgKi8KLQkJCV9fbmFwaV9zY2hlZHVsZSgmcGRhdGEtPm5hcGkpOwotCQl9IGVsc2UgewotCQkJU01TQ19XQVJOKHBkYXRhLCByeF9lcnIsICJuYXBpX3NjaGVkdWxlX3ByZXAgZmFpbGVkIik7Ci0JCX0KLQkJc2VydmljZWQgPSBJUlFfSEFORExFRDsKLQl9Ci0KLQlyZXR1cm4gc2VydmljZWQ7Ci19Ci0KICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogc3RhdGljIHZvaWQgc21zYzkxMXhfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CkBAIC0yMjkxLDE2ICsyMzIzLDE0IEBACiAJcGRhdGEgPSBuZXRkZXZfcHJpdihkZXYpOwogCUJVR19PTighcGRhdGEpOwogCUJVR19PTighcGRhdGEtPmlvYWRkcik7Ci0JQlVHX09OKCFkZXYtPnBoeWRldik7CisJV0FSTl9PTihkZXYtPnBoeWRldik7CiAKIAlTTVNDX1RSQUNFKHBkYXRhLCBpZmRvd24sICJTdG9wcGluZyBkcml2ZXIiKTsKIAotCXBoeV9kaXNjb25uZWN0KGRldi0+cGh5ZGV2KTsKIAltZGlvYnVzX3VucmVnaXN0ZXIocGRhdGEtPm1paV9idXMpOwogCW1kaW9idXNfZnJlZShwZGF0YS0+bWlpX2J1cyk7CiAKIAl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwotCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCiAJCQkJCSAgICJzbXNjOTExeC1tZW1vcnkiKTsKIAlpZiAoIXJlcykKQEAgLTIzODUsOCArMjQxNSw3IEBACiAJc3RydWN0IHNtc2M5MTF4X2RhdGEgKnBkYXRhOwogCXN0cnVjdCBzbXNjOTExeF9wbGF0Zm9ybV9jb25maWcgKmNvbmZpZyA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CiAJc3RydWN0IHJlc291cmNlICpyZXM7Ci0JdW5zaWduZWQgaW50IGludGNmZyA9IDA7Ci0JaW50IHJlc19zaXplLCBpcnEsIGlycV9mbGFnczsKKwlpbnQgcmVzX3NpemUsIGlycTsKIAlpbnQgcmV0dmFsOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwKQEAgLTI0MjUsNyArMjQ1NCw2IEBACiAKIAlwZGF0YSA9IG5ldGRldl9wcml2KGRldik7CiAJZGV2LT5pcnEgPSBpcnE7Ci0JaXJxX2ZsYWdzID0gaXJxX2dldF90cmlnZ2VyX3R5cGUoaXJxKTsKIAlwZGF0YS0+aW9hZGRyID0gaW9yZW1hcF9ub2NhY2hlKHJlcy0+c3RhcnQsIHJlc19zaXplKTsKIAogCXBkYXRhLT5kZXYgPSBkZXY7CkBAIC0yNDcyLDQxICsyNTAwLDIxIEBACiAJaWYgKHJldHZhbCA8IDApCiAJCWdvdG8gb3V0X2Rpc2FibGVfcmVzb3VyY2VzOwogCi0JLyogY29uZmlndXJlIGlycSBwb2xhcml0eSBhbmQgdHlwZSBiZWZvcmUgY29ubmVjdGluZyBpc3IgKi8KLQlpZiAocGRhdGEtPmNvbmZpZy5pcnFfcG9sYXJpdHkgPT0gU01TQzkxMVhfSVJRX1BPTEFSSVRZX0FDVElWRV9ISUdIKQotCQlpbnRjZmcgfD0gSU5UX0NGR19JUlFfUE9MXzsKLQotCWlmIChwZGF0YS0+Y29uZmlnLmlycV90eXBlID09IFNNU0M5MTFYX0lSUV9UWVBFX1BVU0hfUFVMTCkKLQkJaW50Y2ZnIHw9IElOVF9DRkdfSVJRX1RZUEVfOwotCi0Jc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBJTlRfQ0ZHLCBpbnRjZmcpOwotCi0JLyogRW5zdXJlIGludGVycnVwdHMgYXJlIGdsb2JhbGx5IGRpc2FibGVkIGJlZm9yZSBjb25uZWN0aW5nIElTUiAqLwotCXNtc2M5MTF4X2Rpc2FibGVfaXJxX2NoaXAoZGV2KTsKLQotCXJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBzbXNjOTExeF9pcnFoYW5kbGVyLAotCQkJICAgICBpcnFfZmxhZ3MgfCBJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYpOwotCWlmIChyZXR2YWwpIHsKLQkJU01TQ19XQVJOKHBkYXRhLCBwcm9iZSwKLQkJCSAgIlVuYWJsZSB0byBjbGFpbSByZXF1ZXN0ZWQgaXJxOiAlZCIsIGRldi0+aXJxKTsKLQkJZ290byBvdXRfZGlzYWJsZV9yZXNvdXJjZXM7Ci0JfQotCiAJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAotCXJldHZhbCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmIChyZXR2YWwpIHsKLQkJU01TQ19XQVJOKHBkYXRhLCBwcm9iZSwgIkVycm9yICVpIHJlZ2lzdGVyaW5nIGRldmljZSIsIHJldHZhbCk7Ci0JCWdvdG8gb3V0X2ZyZWVfaXJxOwotCX0gZWxzZSB7Ci0JCVNNU0NfVFJBQ0UocGRhdGEsIHByb2JlLAotCQkJICAgIk5ldHdvcmsgaW50ZXJmYWNlOiBcIiVzXCIiLCBkZXYtPm5hbWUpOwotCX0KLQogCXJldHZhbCA9IHNtc2M5MTF4X21paV9pbml0KHBkZXYsIGRldik7CiAJaWYgKHJldHZhbCkgewogCQlTTVNDX1dBUk4ocGRhdGEsIHByb2JlLCAiRXJyb3IgJWkgaW5pdGlhbGlzaW5nIG1paSIsIHJldHZhbCk7Ci0JCWdvdG8gb3V0X3VucmVnaXN0ZXJfbmV0ZGV2XzU7CisJCWdvdG8gb3V0X2Rpc2FibGVfcmVzb3VyY2VzOworCX0KKworCXJldHZhbCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXR2YWwpIHsKKwkJU01TQ19XQVJOKHBkYXRhLCBwcm9iZSwgIkVycm9yICVpIHJlZ2lzdGVyaW5nIGRldmljZSIsIHJldHZhbCk7CisJCWdvdG8gb3V0X2Rpc2FibGVfcmVzb3VyY2VzOworCX0gZWxzZSB7CisJCVNNU0NfVFJBQ0UocGRhdGEsIHByb2JlLAorCQkJICAgIk5ldHdvcmsgaW50ZXJmYWNlOiBcIiVzXCIiLCBkZXYtPm5hbWUpOwogCX0KIAogCXNwaW5fbG9ja19pcnEoJnBkYXRhLT5tYWNfbG9jayk7CkBAIC0yNTQ0LDEwICsyNTUyLDYgQEAKIAogCXJldHVybiAwOwogCi1vdXRfdW5yZWdpc3Rlcl9uZXRkZXZfNToKLQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwotb3V0X2ZyZWVfaXJxOgotCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogb3V0X2Rpc2FibGVfcmVzb3VyY2VzOgogCXBtX3J1bnRpbWVfcHV0KCZwZGV2LT5kZXYpOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9LY29uZmlnCmluZGV4IDhmMDZhNjYuLmM3MzJiOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvS2NvbmZpZwpAQCAtMTA0LDYgKzEwNCwxOCBAQAogCSAgZGV2aWNlIGRyaXZlci4gVGhpcyBkcml2ZXIgaXMgdXNlZCBvbiBmb3IgdGhlIFNUaSBzZXJpZXMKIAkgIFNPQ3MgR01BQyBldGhlcm5ldCBjb250cm9sbGVyLgogCitjb25maWcgRFdNQUNfU1RNMzIKKwl0cmlzdGF0ZSAiU1RNMzIgRFdNQUMgc3VwcG9ydCIKKwlkZWZhdWx0IEFSQ0hfU1RNMzIKKwlkZXBlbmRzIG9uIE9GICYmIEhBU19JT01FTQorCXNlbGVjdCBNRkRfU1lTQ09OCisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3IgZXRoZXJuZXQgY29udHJvbGxlciBvbiBTVE0zMiBTT0NzLgorCisJICBUaGlzIHNlbGVjdHMgU1RNMzIgU29DIGdsdWUgbGF5ZXIgc3VwcG9ydCBmb3IgdGhlIHN0bW1hYworCSAgZGV2aWNlIGRyaXZlci4gVGhpcyBkcml2ZXIgaXMgdXNlZCBvbiBmb3IgdGhlIFNUTTMyIHNlcmllcworCSAgU09DcyBHTUFDIGV0aGVybmV0IGNvbnRyb2xsZXIuCisKIGNvbmZpZyBEV01BQ19TVU5YSQogCXRyaXN0YXRlICJBbGx3aW5uZXIgR01BQyBzdXBwb3J0IgogCWRlZmF1bHQgQVJDSF9TVU5YSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9NYWtlZmlsZQppbmRleCA0NGI2MzBjLi5mMGM5Mzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9NYWtlZmlsZQpAQCAtMTMsNiArMTMsNyBAQAogb2JqLSQoQ09ORklHX0RXTUFDX1JPQ0tDSElQKQkrPSBkd21hYy1yay5vCiBvYmotJChDT05GSUdfRFdNQUNfU09DRlBHQSkJKz0gZHdtYWMtYWx0ci1zb2NmcGdhLm8KIG9iai0kKENPTkZJR19EV01BQ19TVEkpCQkrPSBkd21hYy1zdGkubworb2JqLSQoQ09ORklHX0RXTUFDX1NUTTMyKQkrPSBkd21hYy1zdG0zMi5vCiBvYmotJChDT05GSUdfRFdNQUNfU1VOWEkpCSs9IGR3bWFjLXN1bnhpLm8KIG9iai0kKENPTkZJR19EV01BQ19HRU5FUklDKQkrPSBkd21hYy1nZW5lcmljLm8KIHN0bW1hYy1wbGF0Zm9ybS1vYmpzOj0gc3RtbWFjX3BsYXRmb3JtLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvY29tbW9uLmgKaW5kZXggMjUzM2I5MS4uZDMyOTJjNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2NvbW1vbi5oCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RtbWFjLmg+CiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVkxBTl84MDIxUSkKICNkZWZpbmUgU1RNTUFDX1ZMQU5fVEFHX1VTRUQKICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2R3bWFjLXJrLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYy1yay5jCmluZGV4IDkyMTA1OTEuLjM3NDBhNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2R3bWFjLXJrLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWMtcmsuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KIAogI2luY2x1ZGUgInN0bW1hY19wbGF0Zm9ybS5oIgogCkBAIC0zMDEsNiArMzAyLDExOCBAQAogCS5zZXRfcm1paV9zcGVlZCA9IHJrMzI4OF9zZXRfcm1paV9zcGVlZCwKIH07CiAKKyNkZWZpbmUgUkszMzY2X0dSRl9TT0NfQ09ONgkweDA0MTgKKyNkZWZpbmUgUkszMzY2X0dSRl9TT0NfQ09ONwkweDA0MWMKKworLyogUkszMzY2X0dSRl9TT0NfQ09ONiAqLworI2RlZmluZSBSSzMzNjZfR01BQ19QSFlfSU5URl9TRUxfUkdNSUkJKEdSRl9CSVQoOSkgfCBHUkZfQ0xSX0JJVCgxMCkgfCBcCisJCQkJCSBHUkZfQ0xSX0JJVCgxMSkpCisjZGVmaW5lIFJLMzM2Nl9HTUFDX1BIWV9JTlRGX1NFTF9STUlJCShHUkZfQ0xSX0JJVCg5KSB8IEdSRl9DTFJfQklUKDEwKSB8IFwKKwkJCQkJIEdSRl9CSVQoMTEpKQorI2RlZmluZSBSSzMzNjZfR01BQ19GTE9XX0NUUkwJCUdSRl9CSVQoOCkKKyNkZWZpbmUgUkszMzY2X0dNQUNfRkxPV19DVFJMX0NMUglHUkZfQ0xSX0JJVCg4KQorI2RlZmluZSBSSzMzNjZfR01BQ19TUEVFRF8xME0JCUdSRl9DTFJfQklUKDcpCisjZGVmaW5lIFJLMzM2Nl9HTUFDX1NQRUVEXzEwME0JCUdSRl9CSVQoNykKKyNkZWZpbmUgUkszMzY2X0dNQUNfUk1JSV9DTEtfMjVNCUdSRl9CSVQoMykKKyNkZWZpbmUgUkszMzY2X0dNQUNfUk1JSV9DTEtfMl81TQlHUkZfQ0xSX0JJVCgzKQorI2RlZmluZSBSSzMzNjZfR01BQ19DTEtfMTI1TQkJKEdSRl9DTFJfQklUKDQpIHwgR1JGX0NMUl9CSVQoNSkpCisjZGVmaW5lIFJLMzM2Nl9HTUFDX0NMS18yNU0JCShHUkZfQklUKDQpIHwgR1JGX0JJVCg1KSkKKyNkZWZpbmUgUkszMzY2X0dNQUNfQ0xLXzJfNU0JCShHUkZfQ0xSX0JJVCg0KSB8IEdSRl9CSVQoNSkpCisjZGVmaW5lIFJLMzM2Nl9HTUFDX1JNSUlfTU9ERQkJR1JGX0JJVCg2KQorI2RlZmluZSBSSzMzNjZfR01BQ19STUlJX01PREVfQ0xSCUdSRl9DTFJfQklUKDYpCisKKy8qIFJLMzM2Nl9HUkZfU09DX0NPTjcgKi8KKyNkZWZpbmUgUkszMzY2X0dNQUNfVFhDTEtfRExZX0VOQUJMRQlHUkZfQklUKDcpCisjZGVmaW5lIFJLMzM2Nl9HTUFDX1RYQ0xLX0RMWV9ESVNBQkxFCUdSRl9DTFJfQklUKDcpCisjZGVmaW5lIFJLMzM2Nl9HTUFDX1JYQ0xLX0RMWV9FTkFCTEUJR1JGX0JJVCgxNSkKKyNkZWZpbmUgUkszMzY2X0dNQUNfUlhDTEtfRExZX0RJU0FCTEUJR1JGX0NMUl9CSVQoMTUpCisjZGVmaW5lIFJLMzM2Nl9HTUFDX0NMS19SWF9ETF9DRkcodmFsKQlISVdPUkRfVVBEQVRFKHZhbCwgMHg3RiwgOCkKKyNkZWZpbmUgUkszMzY2X0dNQUNfQ0xLX1RYX0RMX0NGRyh2YWwpCUhJV09SRF9VUERBVEUodmFsLCAweDdGLCAwKQorCitzdGF0aWMgdm9pZCByazMzNjZfc2V0X3RvX3JnbWlpKHN0cnVjdCBya19wcml2X2RhdGEgKmJzcF9wcml2LAorCQkJCWludCB0eF9kZWxheSwgaW50IHJ4X2RlbGF5KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZic3BfcHJpdi0+cGRldi0+ZGV2OworCisJaWYgKElTX0VSUihic3BfcHJpdi0+Z3JmKSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiBNaXNzaW5nIHJvY2tjaGlwLGdyZiBwcm9wZXJ0eVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJcmVnbWFwX3dyaXRlKGJzcF9wcml2LT5ncmYsIFJLMzM2Nl9HUkZfU09DX0NPTjYsCisJCSAgICAgUkszMzY2X0dNQUNfUEhZX0lOVEZfU0VMX1JHTUlJIHwKKwkJICAgICBSSzMzNjZfR01BQ19STUlJX01PREVfQ0xSKTsKKwlyZWdtYXBfd3JpdGUoYnNwX3ByaXYtPmdyZiwgUkszMzY2X0dSRl9TT0NfQ09ONywKKwkJICAgICBSSzMzNjZfR01BQ19SWENMS19ETFlfRU5BQkxFIHwKKwkJICAgICBSSzMzNjZfR01BQ19UWENMS19ETFlfRU5BQkxFIHwKKwkJICAgICBSSzMzNjZfR01BQ19DTEtfUlhfRExfQ0ZHKHJ4X2RlbGF5KSB8CisJCSAgICAgUkszMzY2X0dNQUNfQ0xLX1RYX0RMX0NGRyh0eF9kZWxheSkpOworfQorCitzdGF0aWMgdm9pZCByazMzNjZfc2V0X3RvX3JtaWkoc3RydWN0IHJrX3ByaXZfZGF0YSAqYnNwX3ByaXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmJzcF9wcml2LT5wZGV2LT5kZXY7CisKKwlpZiAoSVNfRVJSKGJzcF9wcml2LT5ncmYpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IE1pc3Npbmcgcm9ja2NoaXAsZ3JmIHByb3BlcnR5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlyZWdtYXBfd3JpdGUoYnNwX3ByaXYtPmdyZiwgUkszMzY2X0dSRl9TT0NfQ09ONiwKKwkJICAgICBSSzMzNjZfR01BQ19QSFlfSU5URl9TRUxfUk1JSSB8IFJLMzM2Nl9HTUFDX1JNSUlfTU9ERSk7Cit9CisKK3N0YXRpYyB2b2lkIHJrMzM2Nl9zZXRfcmdtaWlfc3BlZWQoc3RydWN0IHJrX3ByaXZfZGF0YSAqYnNwX3ByaXYsIGludCBzcGVlZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYnNwX3ByaXYtPnBkZXYtPmRldjsKKworCWlmIChJU19FUlIoYnNwX3ByaXYtPmdyZikpIHsKKwkJZGV2X2VycihkZXYsICIlczogTWlzc2luZyByb2NrY2hpcCxncmYgcHJvcGVydHlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzcGVlZCA9PSAxMCkKKwkJcmVnbWFwX3dyaXRlKGJzcF9wcml2LT5ncmYsIFJLMzM2Nl9HUkZfU09DX0NPTjYsCisJCQkgICAgIFJLMzM2Nl9HTUFDX0NMS18yXzVNKTsKKwllbHNlIGlmIChzcGVlZCA9PSAxMDApCisJCXJlZ21hcF93cml0ZShic3BfcHJpdi0+Z3JmLCBSSzMzNjZfR1JGX1NPQ19DT042LAorCQkJICAgICBSSzMzNjZfR01BQ19DTEtfMjVNKTsKKwllbHNlIGlmIChzcGVlZCA9PSAxMDAwKQorCQlyZWdtYXBfd3JpdGUoYnNwX3ByaXYtPmdyZiwgUkszMzY2X0dSRl9TT0NfQ09ONiwKKwkJCSAgICAgUkszMzY2X0dNQUNfQ0xLXzEyNU0pOworCWVsc2UKKwkJZGV2X2VycihkZXYsICJ1bmtub3duIHNwZWVkIHZhbHVlIGZvciBSR01JSSEgc3BlZWQ9JWQiLCBzcGVlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHJrMzM2Nl9zZXRfcm1paV9zcGVlZChzdHJ1Y3QgcmtfcHJpdl9kYXRhICpic3BfcHJpdiwgaW50IHNwZWVkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZic3BfcHJpdi0+cGRldi0+ZGV2OworCisJaWYgKElTX0VSUihic3BfcHJpdi0+Z3JmKSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiBNaXNzaW5nIHJvY2tjaGlwLGdyZiBwcm9wZXJ0eVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKHNwZWVkID09IDEwKSB7CisJCXJlZ21hcF93cml0ZShic3BfcHJpdi0+Z3JmLCBSSzMzNjZfR1JGX1NPQ19DT042LAorCQkJICAgICBSSzMzNjZfR01BQ19STUlJX0NMS18yXzVNIHwKKwkJCSAgICAgUkszMzY2X0dNQUNfU1BFRURfMTBNKTsKKwl9IGVsc2UgaWYgKHNwZWVkID09IDEwMCkgeworCQlyZWdtYXBfd3JpdGUoYnNwX3ByaXYtPmdyZiwgUkszMzY2X0dSRl9TT0NfQ09ONiwKKwkJCSAgICAgUkszMzY2X0dNQUNfUk1JSV9DTEtfMjVNIHwKKwkJCSAgICAgUkszMzY2X0dNQUNfU1BFRURfMTAwTSk7CisJfSBlbHNlIHsKKwkJZGV2X2VycihkZXYsICJ1bmtub3duIHNwZWVkIHZhbHVlIGZvciBSTUlJISBzcGVlZD0lZCIsIHNwZWVkKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmtfZ21hY19vcHMgcmszMzY2X29wcyA9IHsKKwkuc2V0X3RvX3JnbWlpID0gcmszMzY2X3NldF90b19yZ21paSwKKwkuc2V0X3RvX3JtaWkgPSByazMzNjZfc2V0X3RvX3JtaWksCisJLnNldF9yZ21paV9zcGVlZCA9IHJrMzM2Nl9zZXRfcmdtaWlfc3BlZWQsCisJLnNldF9ybWlpX3NwZWVkID0gcmszMzY2X3NldF9ybWlpX3NwZWVkLAorfTsKKwogI2RlZmluZSBSSzMzNjhfR1JGX1NPQ19DT04xNQkweDA0M2MKICNkZWZpbmUgUkszMzY4X0dSRl9TT0NfQ09OMTYJMHgwNDQwCiAKQEAgLTQxMyw2ICs1MjYsMTE4IEBACiAJLnNldF9ybWlpX3NwZWVkID0gcmszMzY4X3NldF9ybWlpX3NwZWVkLAogfTsKIAorI2RlZmluZSBSSzMzOTlfR1JGX1NPQ19DT041CTB4YzIxNAorI2RlZmluZSBSSzMzOTlfR1JGX1NPQ19DT042CTB4YzIxOAorCisvKiBSSzMzOTlfR1JGX1NPQ19DT041ICovCisjZGVmaW5lIFJLMzM5OV9HTUFDX1BIWV9JTlRGX1NFTF9SR01JSQkoR1JGX0JJVCg5KSB8IEdSRl9DTFJfQklUKDEwKSB8IFwKKwkJCQkJIEdSRl9DTFJfQklUKDExKSkKKyNkZWZpbmUgUkszMzk5X0dNQUNfUEhZX0lOVEZfU0VMX1JNSUkJKEdSRl9DTFJfQklUKDkpIHwgR1JGX0NMUl9CSVQoMTApIHwgXAorCQkJCQkgR1JGX0JJVCgxMSkpCisjZGVmaW5lIFJLMzM5OV9HTUFDX0ZMT1dfQ1RSTAkJR1JGX0JJVCg4KQorI2RlZmluZSBSSzMzOTlfR01BQ19GTE9XX0NUUkxfQ0xSCUdSRl9DTFJfQklUKDgpCisjZGVmaW5lIFJLMzM5OV9HTUFDX1NQRUVEXzEwTQkJR1JGX0NMUl9CSVQoNykKKyNkZWZpbmUgUkszMzk5X0dNQUNfU1BFRURfMTAwTQkJR1JGX0JJVCg3KQorI2RlZmluZSBSSzMzOTlfR01BQ19STUlJX0NMS18yNU0JR1JGX0JJVCgzKQorI2RlZmluZSBSSzMzOTlfR01BQ19STUlJX0NMS18yXzVNCUdSRl9DTFJfQklUKDMpCisjZGVmaW5lIFJLMzM5OV9HTUFDX0NMS18xMjVNCQkoR1JGX0NMUl9CSVQoNCkgfCBHUkZfQ0xSX0JJVCg1KSkKKyNkZWZpbmUgUkszMzk5X0dNQUNfQ0xLXzI1TQkJKEdSRl9CSVQoNCkgfCBHUkZfQklUKDUpKQorI2RlZmluZSBSSzMzOTlfR01BQ19DTEtfMl81TQkJKEdSRl9DTFJfQklUKDQpIHwgR1JGX0JJVCg1KSkKKyNkZWZpbmUgUkszMzk5X0dNQUNfUk1JSV9NT0RFCQlHUkZfQklUKDYpCisjZGVmaW5lIFJLMzM5OV9HTUFDX1JNSUlfTU9ERV9DTFIJR1JGX0NMUl9CSVQoNikKKworLyogUkszMzk5X0dSRl9TT0NfQ09ONiAqLworI2RlZmluZSBSSzMzOTlfR01BQ19UWENMS19ETFlfRU5BQkxFCUdSRl9CSVQoNykKKyNkZWZpbmUgUkszMzk5X0dNQUNfVFhDTEtfRExZX0RJU0FCTEUJR1JGX0NMUl9CSVQoNykKKyNkZWZpbmUgUkszMzk5X0dNQUNfUlhDTEtfRExZX0VOQUJMRQlHUkZfQklUKDE1KQorI2RlZmluZSBSSzMzOTlfR01BQ19SWENMS19ETFlfRElTQUJMRQlHUkZfQ0xSX0JJVCgxNSkKKyNkZWZpbmUgUkszMzk5X0dNQUNfQ0xLX1JYX0RMX0NGRyh2YWwpCUhJV09SRF9VUERBVEUodmFsLCAweDdGLCA4KQorI2RlZmluZSBSSzMzOTlfR01BQ19DTEtfVFhfRExfQ0ZHKHZhbCkJSElXT1JEX1VQREFURSh2YWwsIDB4N0YsIDApCisKK3N0YXRpYyB2b2lkIHJrMzM5OV9zZXRfdG9fcmdtaWkoc3RydWN0IHJrX3ByaXZfZGF0YSAqYnNwX3ByaXYsCisJCQkJaW50IHR4X2RlbGF5LCBpbnQgcnhfZGVsYXkpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmJzcF9wcml2LT5wZGV2LT5kZXY7CisKKwlpZiAoSVNfRVJSKGJzcF9wcml2LT5ncmYpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IE1pc3Npbmcgcm9ja2NoaXAsZ3JmIHByb3BlcnR5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlyZWdtYXBfd3JpdGUoYnNwX3ByaXYtPmdyZiwgUkszMzk5X0dSRl9TT0NfQ09ONSwKKwkJICAgICBSSzMzOTlfR01BQ19QSFlfSU5URl9TRUxfUkdNSUkgfAorCQkgICAgIFJLMzM5OV9HTUFDX1JNSUlfTU9ERV9DTFIpOworCXJlZ21hcF93cml0ZShic3BfcHJpdi0+Z3JmLCBSSzMzOTlfR1JGX1NPQ19DT042LAorCQkgICAgIFJLMzM5OV9HTUFDX1JYQ0xLX0RMWV9FTkFCTEUgfAorCQkgICAgIFJLMzM5OV9HTUFDX1RYQ0xLX0RMWV9FTkFCTEUgfAorCQkgICAgIFJLMzM5OV9HTUFDX0NMS19SWF9ETF9DRkcocnhfZGVsYXkpIHwKKwkJICAgICBSSzMzOTlfR01BQ19DTEtfVFhfRExfQ0ZHKHR4X2RlbGF5KSk7Cit9CisKK3N0YXRpYyB2b2lkIHJrMzM5OV9zZXRfdG9fcm1paShzdHJ1Y3QgcmtfcHJpdl9kYXRhICpic3BfcHJpdikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYnNwX3ByaXYtPnBkZXYtPmRldjsKKworCWlmIChJU19FUlIoYnNwX3ByaXYtPmdyZikpIHsKKwkJZGV2X2VycihkZXYsICIlczogTWlzc2luZyByb2NrY2hpcCxncmYgcHJvcGVydHlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXJlZ21hcF93cml0ZShic3BfcHJpdi0+Z3JmLCBSSzMzOTlfR1JGX1NPQ19DT041LAorCQkgICAgIFJLMzM5OV9HTUFDX1BIWV9JTlRGX1NFTF9STUlJIHwgUkszMzk5X0dNQUNfUk1JSV9NT0RFKTsKK30KKworc3RhdGljIHZvaWQgcmszMzk5X3NldF9yZ21paV9zcGVlZChzdHJ1Y3QgcmtfcHJpdl9kYXRhICpic3BfcHJpdiwgaW50IHNwZWVkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZic3BfcHJpdi0+cGRldi0+ZGV2OworCisJaWYgKElTX0VSUihic3BfcHJpdi0+Z3JmKSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiBNaXNzaW5nIHJvY2tjaGlwLGdyZiBwcm9wZXJ0eVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKHNwZWVkID09IDEwKQorCQlyZWdtYXBfd3JpdGUoYnNwX3ByaXYtPmdyZiwgUkszMzk5X0dSRl9TT0NfQ09ONSwKKwkJCSAgICAgUkszMzk5X0dNQUNfQ0xLXzJfNU0pOworCWVsc2UgaWYgKHNwZWVkID09IDEwMCkKKwkJcmVnbWFwX3dyaXRlKGJzcF9wcml2LT5ncmYsIFJLMzM5OV9HUkZfU09DX0NPTjUsCisJCQkgICAgIFJLMzM5OV9HTUFDX0NMS18yNU0pOworCWVsc2UgaWYgKHNwZWVkID09IDEwMDApCisJCXJlZ21hcF93cml0ZShic3BfcHJpdi0+Z3JmLCBSSzMzOTlfR1JGX1NPQ19DT041LAorCQkJICAgICBSSzMzOTlfR01BQ19DTEtfMTI1TSk7CisJZWxzZQorCQlkZXZfZXJyKGRldiwgInVua25vd24gc3BlZWQgdmFsdWUgZm9yIFJHTUlJISBzcGVlZD0lZCIsIHNwZWVkKTsKK30KKworc3RhdGljIHZvaWQgcmszMzk5X3NldF9ybWlpX3NwZWVkKHN0cnVjdCBya19wcml2X2RhdGEgKmJzcF9wcml2LCBpbnQgc3BlZWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmJzcF9wcml2LT5wZGV2LT5kZXY7CisKKwlpZiAoSVNfRVJSKGJzcF9wcml2LT5ncmYpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IE1pc3Npbmcgcm9ja2NoaXAsZ3JmIHByb3BlcnR5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3BlZWQgPT0gMTApIHsKKwkJcmVnbWFwX3dyaXRlKGJzcF9wcml2LT5ncmYsIFJLMzM5OV9HUkZfU09DX0NPTjUsCisJCQkgICAgIFJLMzM5OV9HTUFDX1JNSUlfQ0xLXzJfNU0gfAorCQkJICAgICBSSzMzOTlfR01BQ19TUEVFRF8xME0pOworCX0gZWxzZSBpZiAoc3BlZWQgPT0gMTAwKSB7CisJCXJlZ21hcF93cml0ZShic3BfcHJpdi0+Z3JmLCBSSzMzOTlfR1JGX1NPQ19DT041LAorCQkJICAgICBSSzMzOTlfR01BQ19STUlJX0NMS18yNU0gfAorCQkJICAgICBSSzMzOTlfR01BQ19TUEVFRF8xMDBNKTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGRldiwgInVua25vd24gc3BlZWQgdmFsdWUgZm9yIFJNSUkhIHNwZWVkPSVkIiwgc3BlZWQpOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBya19nbWFjX29wcyByazMzOTlfb3BzID0geworCS5zZXRfdG9fcmdtaWkgPSByazMzOTlfc2V0X3RvX3JnbWlpLAorCS5zZXRfdG9fcm1paSA9IHJrMzM5OV9zZXRfdG9fcm1paSwKKwkuc2V0X3JnbWlpX3NwZWVkID0gcmszMzk5X3NldF9yZ21paV9zcGVlZCwKKwkuc2V0X3JtaWlfc3BlZWQgPSByazMzOTlfc2V0X3JtaWlfc3BlZWQsCit9OworCiBzdGF0aWMgaW50IGdtYWNfY2xrX2luaXQoc3RydWN0IHJrX3ByaXZfZGF0YSAqYnNwX3ByaXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmJzcF9wcml2LT5wZGV2LT5kZXY7CkBAIC02MjksNiArODU0LDE2IEBACiAJCQkJCQkJInJvY2tjaGlwLGdyZiIpOwogCWJzcF9wcml2LT5wZGV2ID0gcGRldjsKIAorCWdtYWNfY2xrX2luaXQoYnNwX3ByaXYpOworCisJcmV0dXJuIGJzcF9wcml2OworfQorCitzdGF0aWMgaW50IHJrX2dtYWNfcG93ZXJ1cChzdHJ1Y3QgcmtfcHJpdl9kYXRhICpic3BfcHJpdikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZic3BfcHJpdi0+cGRldi0+ZGV2OworCiAJLypybWlpIG9yIHJnbWlpKi8KIAlpZiAoYnNwX3ByaXYtPnBoeV9pZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUkpIHsKIAkJZGV2X2luZm8oZGV2LCAiaW5pdCBmb3IgUkdNSUlcbiIpOwpAQCAtNjQxLDE1ICs4NzYsNiBAQAogCQlkZXZfZXJyKGRldiwgIk5PIGludGVyZmFjZSBkZWZpbmVkIVxuIik7CiAJfQogCi0JZ21hY19jbGtfaW5pdChic3BfcHJpdik7Ci0KLQlyZXR1cm4gYnNwX3ByaXY7Ci19Ci0KLXN0YXRpYyBpbnQgcmtfZ21hY19wb3dlcnVwKHN0cnVjdCBya19wcml2X2RhdGEgKmJzcF9wcml2KQotewotCWludCByZXQ7Ci0KIAlyZXQgPSBwaHlfcG93ZXJfb24oYnNwX3ByaXYsIHRydWUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC02NTgsMTEgKzg4NCwxOSBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBya19nbWFjX3Bvd2VyZG93bihzdHJ1Y3QgcmtfcHJpdl9kYXRhICpnbWFjKQogeworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZnbWFjLT5wZGV2LT5kZXY7CisKKwlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7CisJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CisKIAlwaHlfcG93ZXJfb24oZ21hYywgZmFsc2UpOwogCWdtYWNfY2xrX2VuYWJsZShnbWFjLCBmYWxzZSk7CiB9CkBAIC03NjAsNyArOTk0LDkgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJrX2dtYWNfZHdtYWNfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzIyOC1nbWFjIiwgLmRhdGEgPSAmcmszMjI4X29wcyB9LAogCXsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMjg4LWdtYWMiLCAuZGF0YSA9ICZyazMyODhfb3BzIH0sCisJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzNjYtZ21hYyIsIC5kYXRhID0gJnJrMzM2Nl9vcHMgfSwKIAl7IC5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzM2OC1nbWFjIiwgLmRhdGEgPSAmcmszMzY4X29wcyB9LAorCXsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LWdtYWMiLCAuZGF0YSA9ICZyazMzOTlfb3BzIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcmtfZ21hY19kd21hY19tYXRjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYy1zdG0zMi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWMtc3RtMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWE5MjZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWMtc3RtMzIuYwpAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIGR3bWFjLXN0bTMyLmMgLSBEV01BQyBTcGVjaWZpYyBHbHVlIGxheWVyIGZvciBTVE0zMiBNQ1UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIEFsZXhhbmRyZSBUb3JndWUgMjAxNQorICogQXV0aG9yOiAgQWxleGFuZHJlIFRvcmd1ZSA8YWxleGFuZHJlLnRvcmd1ZUBnbWFpbC5jb20+CisgKiBMaWNlbnNlIHRlcm1zOiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIHZlcnNpb24gMgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0bW1hYy5oPgorCisjaW5jbHVkZSAic3RtbWFjX3BsYXRmb3JtLmgiCisKKyNkZWZpbmUgTUlJX1BIWV9TRUxfTUFTSwlCSVQoMjMpCisKK3N0cnVjdCBzdG0zMl9kd21hYyB7CisJc3RydWN0IGNsayAqY2xrX3R4OworCXN0cnVjdCBjbGsgKmNsa19yeDsKKwl1MzIgbW9kZV9yZWc7CQkvKiBNQUMgZ2x1ZS1sb2dpYyBtb2RlIHJlZ2lzdGVyICovCisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXUzMiBzcGVlZDsKK307CisKK3N0YXRpYyBpbnQgc3RtMzJfZHdtYWNfaW5pdChzdHJ1Y3QgcGxhdF9zdG1tYWNlbmV0X2RhdGEgKnBsYXRfZGF0KQoreworCXN0cnVjdCBzdG0zMl9kd21hYyAqZHdtYWMgPSBwbGF0X2RhdC0+YnNwX3ByaXY7CisJdTMyIHJlZyA9IGR3bWFjLT5tb2RlX3JlZzsKKwl1MzIgdmFsOworCWludCByZXQ7CisKKwl2YWwgPSAocGxhdF9kYXQtPmludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfTUlJKSA/IDAgOiAxOworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkd21hYy0+cmVnbWFwLCByZWcsIE1JSV9QSFlfU0VMX01BU0ssIHZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkd21hYy0+Y2xrX3R4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGR3bWFjLT5jbGtfcngpOworCWlmIChyZXQpCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShkd21hYy0+Y2xrX3R4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHN0bTMyX2R3bWFjX2Nsa19kaXNhYmxlKHN0cnVjdCBzdG0zMl9kd21hYyAqZHdtYWMpCit7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGR3bWFjLT5jbGtfdHgpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShkd21hYy0+Y2xrX3J4KTsKK30KKworc3RhdGljIGludCBzdG0zMl9kd21hY19wYXJzZV9kYXRhKHN0cnVjdCBzdG0zMl9kd21hYyAqZHdtYWMsCisJCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKKwlpbnQgZXJyOworCisJLyogIEdldCBUWC9SWCBjbG9ja3MgKi8KKwlkd21hYy0+Y2xrX3R4ID0gZGV2bV9jbGtfZ2V0KGRldiwgIm1hYy1jbGstdHgiKTsKKwlpZiAoSVNfRVJSKGR3bWFjLT5jbGtfdHgpKSB7CisJCWRldl9lcnIoZGV2LCAiTm8gdHggY2xvY2sgcHJvdmlkZWQuLi5cbiIpOworCQlyZXR1cm4gUFRSX0VSUihkd21hYy0+Y2xrX3R4KTsKKwl9CisJZHdtYWMtPmNsa19yeCA9IGRldm1fY2xrX2dldChkZXYsICJtYWMtY2xrLXJ4Iik7CisJaWYgKElTX0VSUihkd21hYy0+Y2xrX3J4KSkgeworCQlkZXZfZXJyKGRldiwgIk5vIHJ4IGNsb2NrIHByb3ZpZGVkLi4uXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZHdtYWMtPmNsa19yeCk7CisJfQorCisJLyogR2V0IG1vZGUgcmVnaXN0ZXIgKi8KKwlkd21hYy0+cmVnbWFwID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfcGhhbmRsZShucCwgInN0LHN5c2NvbiIpOworCWlmIChJU19FUlIoZHdtYWMtPnJlZ21hcCkpCisJCXJldHVybiBQVFJfRVJSKGR3bWFjLT5yZWdtYXApOworCisJZXJyID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgobnAsICJzdCxzeXNjb24iLCAxLCAmZHdtYWMtPm1vZGVfcmVnKTsKKwlpZiAoZXJyKQorCQlkZXZfZXJyKGRldiwgIkNhbid0IGdldCBzeXNjb25maWcgbW9kZSBvZmZzZXQgKCVkKVxuIiwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc3RtMzJfZHdtYWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcGxhdF9zdG1tYWNlbmV0X2RhdGEgKnBsYXRfZGF0OworCXN0cnVjdCBzdG1tYWNfcmVzb3VyY2VzIHN0bW1hY19yZXM7CisJc3RydWN0IHN0bTMyX2R3bWFjICpkd21hYzsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RtbWFjX2dldF9wbGF0Zm9ybV9yZXNvdXJjZXMocGRldiwgJnN0bW1hY19yZXMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlwbGF0X2RhdCA9IHN0bW1hY19wcm9iZV9jb25maWdfZHQocGRldiwgJnN0bW1hY19yZXMubWFjKTsKKwlpZiAoSVNfRVJSKHBsYXRfZGF0KSkKKwkJcmV0dXJuIFBUUl9FUlIocGxhdF9kYXQpOworCisJZHdtYWMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkd21hYyksIEdGUF9LRVJORUwpOworCWlmICghZHdtYWMpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gc3RtMzJfZHdtYWNfcGFyc2VfZGF0YShkd21hYywgJnBkZXYtPmRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gcGFyc2UgT0YgZGF0YVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcGxhdF9kYXQtPmJzcF9wcml2ID0gZHdtYWM7CisKKwlyZXQgPSBzdG0zMl9kd21hY19pbml0KHBsYXRfZGF0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc3RtbWFjX2R2cl9wcm9iZSgmcGRldi0+ZGV2LCBwbGF0X2RhdCwgJnN0bW1hY19yZXMpOworCWlmIChyZXQpCisJCXN0bTMyX2R3bWFjX2Nsa19kaXNhYmxlKGR3bWFjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3RtMzJfZHdtYWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgcmV0ID0gc3RtbWFjX2R2cl9yZW1vdmUoJnBkZXYtPmRldik7CisKKwlzdG0zMl9kd21hY19jbGtfZGlzYWJsZShwcml2LT5wbGF0LT5ic3BfcHJpdik7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IHN0bTMyX2R3bWFjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaW50IHJldDsKKworCXJldCA9IHN0bW1hY19zdXNwZW5kKGRldik7CisJc3RtMzJfZHdtYWNfY2xrX2Rpc2FibGUocHJpdi0+cGxhdC0+YnNwX3ByaXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzdG0zMl9kd21hY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaW50IHJldDsKKworCXJldCA9IHN0bTMyX2R3bWFjX2luaXQocHJpdi0+cGxhdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHN0bW1hY19yZXN1bWUoZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhzdG0zMl9kd21hY19wbV9vcHMsCisJc3RtMzJfZHdtYWNfc3VzcGVuZCwgc3RtMzJfZHdtYWNfcmVzdW1lKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3RtMzJfZHdtYWNfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInN0LHN0bTMyLWR3bWFjIn0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3RtMzJfZHdtYWNfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdG0zMl9kd21hY19kcml2ZXIgPSB7CisJLnByb2JlICA9IHN0bTMyX2R3bWFjX3Byb2JlLAorCS5yZW1vdmUgPSBzdG0zMl9kd21hY19yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gInN0bTMyLWR3bWFjIiwKKwkJLnBtCQk9ICZzdG0zMl9kd21hY19wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IHN0bTMyX2R3bWFjX21hdGNoLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzdG0zMl9kd21hY19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJBbGV4YW5kcmUgVG9yZ3VlIDxhbGV4YW5kcmUudG9yZ3VlQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU1RNaWNyb2VsZWN0cm9uaWNzIE1DVSBEV01BQyBTcGVjaWZpYyBHbHVlIGxheWVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYzEwMDBfY29yZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWMxMDAwX2NvcmUuYwppbmRleCBjYmVmZTllLi43ZGY0ZmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYzEwMDBfY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2R3bWFjMTAwMF9jb3JlLmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogCQludW1oYXNocmVncyA9IDg7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKCJTVE1NQUM6IGVyciBpbiBzZXR0aW5nIG11bGl0Y2FzdCBmaWx0ZXJcbiIpOworCQlwcl9kZWJ1ZygiU1RNTUFDOiBlcnIgaW4gc2V0dGluZyBtdWx0aWNhc3QgZmlsdGVyXG4iKTsKIAkJcmV0dXJuOwogCQlicmVhazsKIAl9CkBAIC0yNjEsNyArMjYxLDcgQEAKIAl9CiAJaWYgKG1vZGUgJiBXQUtFX1VDQVNUKSB7CiAJCXByX2RlYnVnKCJHTUFDOiBXT0wgb24gZ2xvYmFsIHVuaWNhc3RcbiIpOwotCQlwbXQgfD0gZ2xvYmFsX3VuaWNhc3Q7CisJCXBtdCB8PSBwb3dlcl9kb3duIHwgZ2xvYmFsX3VuaWNhc3QgfCB3YWtlX3VwX2ZyYW1lX2VuOwogCX0KIAogCXdyaXRlbChwbXQsIGlvYWRkciArIEdNQUNfUE1UKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2R3bWFjNF9jb3JlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYzRfY29yZS5jCmluZGV4IGRmNTU4MGQuLjUxMDE5YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2R3bWFjNF9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWM0X2NvcmUuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAJfQogCWlmIChtb2RlICYgV0FLRV9VQ0FTVCkgewogCQlwcl9kZWJ1ZygiR01BQzogV09MIG9uIGdsb2JhbCB1bmljYXN0XG4iKTsKLQkJcG10IHw9IGdsb2JhbF91bmljYXN0OworCQlwbXQgfD0gcG93ZXJfZG93biB8IGdsb2JhbF91bmljYXN0IHwgd2FrZV91cF9mcmFtZV9lbjsKIAl9CiAKIAl3cml0ZWwocG10LCBpb2FkZHIgKyBHTUFDX1BNVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfcGxhdGZvcm0uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19wbGF0Zm9ybS5jCmluZGV4IDc1NmJiNTQuLjBhMGQ2YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19wbGF0Zm9ybS5jCkBAIC0yNjUsNiArMjY1LDcgQEAKIAkgKiBvbmNlIG5lZWRlZCBvbiBvdGhlciBwbGF0Zm9ybXMuCiAJICovCiAJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAic3Qsc3BlYXI2MDAtZ21hYyIpIHx8CisJCW9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAic25wcyxkd21hYy0zLjUwYSIpIHx8CiAJCW9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAic25wcyxkd21hYy0zLjcwYSIpIHx8CiAJCW9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAic25wcyxkd21hYyIpKSB7CiAJCS8qIE5vdGUgdGhhdCB0aGUgbWF4LWZyYW1lLXNpemUgcGFyYW1ldGVyIGFzIGRlZmluZWQgaW4gdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfcHRwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfcHRwLmMKaW5kZXggMTcwYTE4Yi4uNmUzYjgyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX3B0cC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19wdHAuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJaWYgKElTX0VSUihwcml2LT5wdHBfY2xvY2spKSB7CiAJCXByaXYtPnB0cF9jbG9jayA9IE5VTEw7CiAJCXByX2VycigicHRwX2Nsb2NrX3JlZ2lzdGVyKCkgZmFpbGVkIG9uICVzXG4iLCBwcml2LT5kZXYtPm5hbWUpOwotCX0gZWxzZQorCX0gZWxzZSBpZiAocHJpdi0+cHRwX2Nsb2NrKQogCQlwcl9kZWJ1ZygiQWRkZWQgUFRQIEhXIGNsb2NrIHN1Y2Nlc3NmdWxseSBvbiAlc1xuIiwKIAkJCSBwcml2LT5kZXYtPm5hbWUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zeW5vcHN5cy9kd2NfZXRoX3Fvcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3lub3BzeXMvZHdjX2V0aF9xb3MuYwppbmRleCA5ZjE1OWE3Li4wZDAwNTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zeW5vcHN5cy9kd2NfZXRoX3Fvcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N5bm9wc3lzL2R3Y19ldGhfcW9zLmMKQEAgLTEyNDYsNyArMTI0Niw3IEBACiAJbHAtPm1paV9idXMtPnJlYWQgID0gJmR3Y2Vxb3NfbWRpb19yZWFkOwogCWxwLT5taWlfYnVzLT53cml0ZSA9ICZkd2NlcW9zX21kaW9fd3JpdGU7CiAJbHAtPm1paV9idXMtPnByaXYgPSBscDsKLQlscC0+bWlpX2J1cy0+cGFyZW50ID0gJmxwLT5uZGV2LT5kZXY7CisJbHAtPm1paV9idXMtPnBhcmVudCA9ICZscC0+cGRldi0+ZGV2OwogCiAJb2ZfYWRkcmVzc190b19yZXNvdXJjZShscC0+cGRldi0+ZGV2Lm9mX25vZGUsIDAsICZyZXMpOwogCXNucHJpbnRmKGxwLT5taWlfYnVzLT5pZCwgTUlJX0JVU19JRF9TSVpFLCAiJS44bGx4IiwKQEAgLTE2MjIsMTMgKzE2MjIsNyBAQAogCQlEV0NFUU9TX01NQ19DVFJMX1JTVE9OUkQpOwogCWR3Y2Vxb3NfZW5hYmxlX21tY19pbnRlcnJ1cHQobHApOwogCi0JLyogRW5hYmxlIEludGVycnVwdHMgKi8KLQlkd2NlcW9zX3dyaXRlKGxwLCBSRUdfRFdDRVFPU19ETUFfQ0gwX0lFLAotCQkgICAgICBEV0NFUU9TX0RNQV9DSDBfSUVfTklFIHwKLQkJICAgICAgRFdDRVFPU19ETUFfQ0gwX0lFX1JJRSB8IERXQ0VRT1NfRE1BX0NIMF9JRV9USUUgfAotCQkgICAgICBEV0NFUU9TX0RNQV9DSDBfSUVfQUlFIHwKLQkJICAgICAgRFdDRVFPU19ETUFfQ0gwX0lFX0ZCRUUpOwotCisJZHdjZXFvc193cml0ZShscCwgUkVHX0RXQ0VRT1NfRE1BX0NIMF9JRSwgMCk7CiAJZHdjZXFvc193cml0ZShscCwgUkVHX0RXQ0VRT1NfTUFDX0lFLCAwKTsKIAogCWR3Y2Vxb3Nfd3JpdGUobHAsIFJFR19EV0NFUU9TX01BQ19DRkcsIERXQ0VRT1NfTUFDX0NGR19JUEMgfApAQCAtMTkwNSw2ICsxODk5LDE1IEBACiAJbmV0aWZfc3RhcnRfcXVldWUobmRldik7CiAJdGFza2xldF9lbmFibGUoJmxwLT50eF9iZHJlY2xhaW1fdGFza2xldCk7CiAKKwkvKiBFbmFibGUgSW50ZXJydXB0cyAtLSBkbyB0aGlzIG9ubHkgYWZ0ZXIgd2UgZW5hYmxlIE5BUEkgYW5kIHRoZQorCSAqIHRhc2tsZXQuCisJICovCisJZHdjZXFvc193cml0ZShscCwgUkVHX0RXQ0VRT1NfRE1BX0NIMF9JRSwKKwkJICAgICAgRFdDRVFPU19ETUFfQ0gwX0lFX05JRSB8CisJCSAgICAgIERXQ0VRT1NfRE1BX0NIMF9JRV9SSUUgfCBEV0NFUU9TX0RNQV9DSDBfSUVfVElFIHwKKwkJICAgICAgRFdDRVFPU19ETUFfQ0gwX0lFX0FJRSB8CisJCSAgICAgIERXQ0VRT1NfRE1BX0NIMF9JRV9GQkVFKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yNzQwLDcgKzI3NDMsNyBAQAogCWxwLT5tc2dfZW5hYmxlID0gbXNnbGV2ZWw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZHdjZXFvc19ldGh0b29sX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgZHdjZXFvc19ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2RydmluZm8gICAgPSBkd2NlcW9zX2dldF9kcnZpbmZvLAogCS5nZXRfbGluayAgICAgICA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCiAJLmdldF9wYXVzZXBhcmFtID0gZHdjZXFvc19nZXRfcGF1c2VwYXJhbSwKQEAgLTI3NTgsNyArMjc2MSw3IEBACiAJLnNldF9saW5rX2tzZXR0aW5ncyA9IHBoeV9ldGh0b29sX3NldF9saW5rX2tzZXR0aW5ncywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbmV0ZGV2X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbmV0ZGV2X29wcyA9IHsKIAkubmRvX29wZW4JCT0gZHdjZXFvc19vcGVuLAogCS5uZG9fc3RvcAkJPSBkd2NlcW9zX3N0b3AsCiAJLm5kb19zdGFydF94bWl0CQk9IGR3Y2Vxb3Nfc3RhcnRfeG1pdCwKQEAgLTI4NTAsMjUgKzI4NTMsMTcgQEAKIAogCW5kZXYtPmZlYXR1cmVzID0gbmRldi0+aHdfZmVhdHVyZXM7CiAKLQluZXRpZl9uYXBpX2FkZChuZGV2LCAmbHAtPm5hcGksIGR3Y2Vxb3NfcnhfcG9sbCwgTkFQSV9QT0xMX1dFSUdIVCk7Ci0KLQlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobmRldik7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgYWJvcnRpbmcuXG4iKTsKLQkJZ290byBlcnJfb3V0X2Nsa19kaXNfYXBlcjsKLQl9Ci0KIAlscC0+cGh5X3JlZl9jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInBoeV9yZWZfY2xrIik7CiAJaWYgKElTX0VSUihscC0+cGh5X3JlZl9jbGspKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInBoeV9yZWZfY2xrIGNsb2NrIG5vdCBmb3VuZC5cbiIpOwogCQlyZXQgPSBQVFJfRVJSKGxwLT5waHlfcmVmX2Nsayk7Ci0JCWdvdG8gZXJyX291dF91bnJlZ2lzdGVyX25ldGRldjsKKwkJZ290byBlcnJfb3V0X2Nsa19kaXNfYXBlcjsKIAl9CiAKIAlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUobHAtPnBoeV9yZWZfY2xrKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBlbmFibGUgZGV2aWNlIGNsb2NrLlxuIik7Ci0JCWdvdG8gZXJyX291dF91bnJlZ2lzdGVyX25ldGRldjsKKwkJZ290byBlcnJfb3V0X2Nsa19kaXNfYXBlcjsKIAl9CiAKIAlscC0+cGh5X25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKGxwLT5wZGV2LT5kZXYub2Zfbm9kZSwKQEAgLTI4NzcsNyArMjg3Miw3IEBACiAJCXJldCA9IG9mX3BoeV9yZWdpc3Rlcl9maXhlZF9saW5rKGxwLT5wZGV2LT5kZXYub2Zfbm9kZSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpbnZhbGlkIGZpeGVkLWxpbmsiKTsKLQkJCWdvdG8gZXJyX291dF91bnJlZ2lzdGVyX2Nsa19ub3RpZmllcjsKKwkJCWdvdG8gZXJyX291dF9jbGtfZGlzX3BoeTsKIAkJfQogCiAJCWxwLT5waHlfbm9kZSA9IG9mX25vZGVfZ2V0KGxwLT5wZGV2LT5kZXYub2Zfbm9kZSk7CkBAIC0yODg2LDcgKzI4ODEsNyBAQAogCXJldCA9IG9mX2dldF9waHlfbW9kZShscC0+cGRldi0+ZGV2Lm9mX25vZGUpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmxwLT5wZGV2LT5kZXYsICJlcnJvciBpbiBnZXR0aW5nIHBoeSBpL2ZcbiIpOwotCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9jbGtfbm90aWZpZXI7CisJCWdvdG8gZXJyX291dF9jbGtfZGlzX3BoeTsKIAl9CiAKIAlscC0+cGh5X2ludGVyZmFjZSA9IHJldDsKQEAgLTI4OTQsMTQgKzI4ODksMTQgQEAKIAlyZXQgPSBkd2NlcW9zX21paV9pbml0KGxwKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmxwLT5wZGV2LT5kZXYsICJlcnJvciBpbiBkd2NlcW9zX21paV9pbml0XG4iKTsKLQkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXJfY2xrX25vdGlmaWVyOworCQlnb3RvIGVycl9vdXRfY2xrX2Rpc19waHk7CiAJfQogCiAJcmV0ID0gZHdjZXFvc19taWlfcHJvYmUobmRldik7CiAJaWYgKHJldCAhPSAwKSB7CiAJCW5ldGRldl9lcnIobmRldiwgIm1paV9wcm9iZSBmYWlsLlxuIik7CiAJCXJldCA9IC1FTlhJTzsKLQkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXJfY2xrX25vdGlmaWVyOworCQlnb3RvIGVycl9vdXRfY2xrX2Rpc19waHk7CiAJfQogCiAJZHdjZXFvc19zZXRfdW1hY19hZGRyKGxwLCBscC0+bmRldi0+ZGV2X2FkZHIsIDApOwpAQCAtMjkxOSw3ICsyOTE0LDcgQEAKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmxwLT5wZGV2LT5kZXYsICJVbmFibGUgdG8gcmV0cmlldmUgRFQsIGVycm9yICVkXG4iLAogCQkJcmV0KTsKLQkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXJfY2xrX25vdGlmaWVyOworCQlnb3RvIGVycl9vdXRfY2xrX2Rpc19waHk7CiAJfQogCWRldl9pbmZvKCZscC0+cGRldi0+ZGV2LCAicGRldi0+aWQgJWQsIGJhc2VhZGRyIDB4JTA4bHgsIGlycSAlZFxuIiwKIAkJIHBkZXYtPmlkLCBuZGV2LT5iYXNlX2FkZHIsIG5kZXYtPmlycSk7CkBAIC0yOTI5LDE4ICsyOTI0LDI0IEBACiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZscC0+cGRldi0+ZGV2LCAiVW5hYmxlIHRvIHJlcXVlc3QgSVJRICVkLCBlcnJvciAlZFxuIiwKIAkJCW5kZXYtPmlycSwgcmV0KTsKLQkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXJfY2xrX25vdGlmaWVyOworCQlnb3RvIGVycl9vdXRfY2xrX2Rpc19waHk7CiAJfQogCiAJaWYgKG5ldGlmX21zZ19wcm9iZShscCkpCiAJCW5ldGRldl9kYmcobmRldiwgIm5ldF9sb2NhbEAlcFxuIiwgbHApOwogCisJbmV0aWZfbmFwaV9hZGQobmRldiwgJmxwLT5uYXBpLCBkd2NlcW9zX3J4X3BvbGwsIE5BUElfUE9MTF9XRUlHSFQpOworCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsIGFib3J0aW5nLlxuIik7CisJCQlnb3RvIGVycl9vdXRfY2xrX2Rpc19waHk7CisJfQorCiAJcmV0dXJuIDA7CiAKLWVycl9vdXRfdW5yZWdpc3Rlcl9jbGtfbm90aWZpZXI6CitlcnJfb3V0X2Nsa19kaXNfcGh5OgogCWNsa19kaXNhYmxlX3VucHJlcGFyZShscC0+cGh5X3JlZl9jbGspOwotZXJyX291dF91bnJlZ2lzdGVyX25ldGRldjoKLQl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKIGVycl9vdXRfY2xrX2Rpc19hcGVyOgogCWNsa19kaXNhYmxlX3VucHJlcGFyZShscC0+YXBiX3BjbGspOwogZXJyX291dF9mcmVlX25ldGRldjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RlaHV0aS90ZWh1dGkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RlaHV0aS90ZWh1dGkuYwppbmRleCA3NDUyYjVmLi43MTA4YzY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90ZWh1dGkvdGVodXRpLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGVodXRpL3RlaHV0aS5jCkBAIC0xOTg3LDcgKzE5ODcsNyBAQAogCWlmICgocmVhZGwobmljLT5yZWdzICsgRlBHQV9WRVIpICYgMHhGRkYpID49IDM3OCkgewogCQllcnIgPSBwY2lfZW5hYmxlX21zaShwZGV2KTsKIAkJaWYgKGVycikKLQkJCXByX2VycigiQ2FuJ3QgZW5lYmxlIG1zaS4gZXJyb3IgaXMgJWRcbiIsIGVycik7CisJCQlwcl9lcnIoIkNhbid0IGVuYWJsZSBtc2kuIGVycm9yIGlzICVkXG4iLCBlcnIpOwogCQllbHNlCiAJCQluaWMtPmlycV90eXBlID0gSVJRX01TSTsKIAl9IGVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2NwbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcG1hYy5jCmluZGV4IGQzMDBkNTMuLmZhMGNmZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2NwbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3BtYWMuYwpAQCAtNTQ2LDcgKzU0Niw4IEBACiAKIHN0YXRpYyBpbnQgY3BtYWNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCWludCBxdWV1ZSwgbGVuOworCWludCBxdWV1ZTsKKwl1bnNpZ25lZCBpbnQgbGVuOwogCXN0cnVjdCBjcG1hY19kZXNjICpkZXNjOwogCXN0cnVjdCBjcG1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtNTU2LDcgKzU1Nyw3IEBACiAJaWYgKHVubGlrZWx5KHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKSkpCiAJCXJldHVybiBORVRERVZfVFhfT0s7CiAKLQlsZW4gPSBtYXgoc2tiLT5sZW4sIEVUSF9aTEVOKTsKKwlsZW4gPSBtYXhfdCh1bnNpZ25lZCBpbnQsIHNrYi0+bGVuLCBFVEhfWkxFTik7CiAJcXVldWUgPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKIAluZXRpZl9zdG9wX3N1YnF1ZXVlKGRldiwgcXVldWUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcHN3LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcHN3LmMKaW5kZXggYzUxZjM0Ni4uYzZjZmYzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3Bzdy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2Nwc3cuYwpAQCAtMTI0LDcgKzEyNCw3IEBACiAKICNkZWZpbmUgUlhfUFJJT1JJVFlfTUFQUElORwkweDc2NTQzMjEwCiAjZGVmaW5lIFRYX1BSSU9SSVRZX01BUFBJTkcJMHgzMzIyMTEwMAotI2RlZmluZSBDUERNQV9UWF9QUklPUklUWV9NQVAJMHg3NjU0MzIxMAorI2RlZmluZSBDUERNQV9UWF9QUklPUklUWV9NQVAJMHgwMTIzNDU2NwogCiAjZGVmaW5lIENQU1dfVkxBTl9BV0FSRQkJQklUKDEpCiAjZGVmaW5lIENQU1dfQUxFX1ZMQU5fQVdBUkUJMQpAQCAtMTQwLDkgKzE0MCwxMSBAQAogI2RlZmluZSBDUFNXX0NNSU5UTUFYX0lOVFZMCSgxMDAwIC8gQ1BTV19DTUlOVE1JTl9DTlQpCiAjZGVmaW5lIENQU1dfQ01JTlRNSU5fSU5UVkwJKCgxMDAwIC8gQ1BTV19DTUlOVE1BWF9DTlQpICsgMSkKIAotI2RlZmluZSBjcHN3X3NsYXZlX2luZGV4KHByaXYpCQkJCVwKLQkJKChwcml2LT5kYXRhLmR1YWxfZW1hYykgPyBwcml2LT5lbWFjX3BvcnQgOglcCi0JCXByaXYtPmRhdGEuYWN0aXZlX3NsYXZlKQorI2RlZmluZSBjcHN3X3NsYXZlX2luZGV4KGNwc3csIHByaXYpCQkJCVwKKwkJKChjcHN3LT5kYXRhLmR1YWxfZW1hYykgPyBwcml2LT5lbWFjX3BvcnQgOglcCisJCWNwc3ctPmRhdGEuYWN0aXZlX3NsYXZlKQorI2RlZmluZSBJUlFfTlVNCQkJMgorI2RlZmluZSBDUFNXX01BWF9RVUVVRVMJCTgKIAogc3RhdGljIGludCBkZWJ1Z19sZXZlbDsKIG1vZHVsZV9wYXJhbShkZWJ1Z19sZXZlbCwgaW50LCAwKTsKQEAgLTM2MywzOCArMzY1LDQxIEBACiAJX19yYXdfd3JpdGVsKHZhbCwgc2xhdmUtPnJlZ3MgKyBvZmZzZXQpOwogfQogCi1zdHJ1Y3QgY3Bzd19wcml2IHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCQkqcGRldjsKLQlzdHJ1Y3QgbmV0X2RldmljZQkJKm5kZXY7Ci0Jc3RydWN0IG5hcGlfc3RydWN0CQluYXBpX3J4OwotCXN0cnVjdCBuYXBpX3N0cnVjdAkJbmFwaV90eDsKK3N0cnVjdCBjcHN3X2NvbW1vbiB7CiAJc3RydWN0IGRldmljZQkJCSpkZXY7CiAJc3RydWN0IGNwc3dfcGxhdGZvcm1fZGF0YQlkYXRhOworCXN0cnVjdCBuYXBpX3N0cnVjdAkJbmFwaV9yeDsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QJCW5hcGlfdHg7CiAJc3RydWN0IGNwc3dfc3NfcmVncyBfX2lvbWVtCSpyZWdzOwogCXN0cnVjdCBjcHN3X3dyX3JlZ3MgX19pb21lbQkqd3JfcmVnczsKIAl1OCBfX2lvbWVtCQkJKmh3X3N0YXRzOwogCXN0cnVjdCBjcHN3X2hvc3RfcmVncyBfX2lvbWVtCSpob3N0X3BvcnRfcmVnczsKLQl1MzIJCQkJbXNnX2VuYWJsZTsKIAl1MzIJCQkJdmVyc2lvbjsKIAl1MzIJCQkJY29hbF9pbnR2bDsKIAl1MzIJCQkJYnVzX2ZyZXFfbWh6OwogCWludAkJCQlyeF9wYWNrZXRfbWF4OwotCXN0cnVjdCBjbGsJCQkqY2xrOwotCXU4CQkJCW1hY19hZGRyW0VUSF9BTEVOXTsKIAlzdHJ1Y3QgY3Bzd19zbGF2ZQkJKnNsYXZlczsKIAlzdHJ1Y3QgY3BkbWFfY3RscgkJKmRtYTsKLQlzdHJ1Y3QgY3BkbWFfY2hhbgkJKnR4Y2gsICpyeGNoOworCXN0cnVjdCBjcGRtYV9jaGFuCQkqdHhjaFtDUFNXX01BWF9RVUVVRVNdOworCXN0cnVjdCBjcGRtYV9jaGFuCQkqcnhjaFtDUFNXX01BWF9RVUVVRVNdOwogCXN0cnVjdCBjcHN3X2FsZQkJCSphbGU7Ci0JYm9vbAkJCQlyeF9wYXVzZTsKLQlib29sCQkJCXR4X3BhdXNlOwogCWJvb2wJCQkJcXVpcmtfaXJxOwogCWJvb2wJCQkJcnhfaXJxX2Rpc2FibGVkOwogCWJvb2wJCQkJdHhfaXJxX2Rpc2FibGVkOwotCS8qIHNuYXBzaG90IG9mIElSUSBudW1iZXJzICovCi0JdTMyIGlycXNfdGFibGVbNF07Ci0JdTMyIG51bV9pcnFzOwotCXN0cnVjdCBjcHRzICpjcHRzOworCXUzMiBpcnFzX3RhYmxlW0lSUV9OVU1dOworCXN0cnVjdCBjcHRzCQkJKmNwdHM7CisJaW50CQkJCXJ4X2NoX251bSwgdHhfY2hfbnVtOworfTsKKworc3RydWN0IGNwc3dfcHJpdiB7CisJc3RydWN0IG5ldF9kZXZpY2UJCSpuZGV2OworCXN0cnVjdCBkZXZpY2UJCQkqZGV2OworCXUzMgkJCQltc2dfZW5hYmxlOworCXU4CQkJCW1hY19hZGRyW0VUSF9BTEVOXTsKKwlib29sCQkJCXJ4X3BhdXNlOworCWJvb2wJCQkJdHhfcGF1c2U7CiAJdTMyIGVtYWNfcG9ydDsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3c7CiB9OwogCiBzdHJ1Y3QgY3Bzd19zdGF0cyB7CkBAIC00NTUsMTA4ICs0NjAsOTIgQEAKIAl7ICJSeCBTdGFydCBvZiBGcmFtZSBPdmVycnVucyIsIENQU1dfU1RBVChyeHNvZm92ZXJydW5zKSB9LAogCXsgIlJ4IE1pZGRsZSBvZiBGcmFtZSBPdmVycnVucyIsIENQU1dfU1RBVChyeG1vZm92ZXJydW5zKSB9LAogCXsgIlJ4IERNQSBPdmVycnVucyIsIENQU1dfU1RBVChyeGRtYW92ZXJydW5zKSB9LAotCXsgIlJ4IERNQSBjaGFuOiBoZWFkX2VucXVldWUiLCBDUERNQV9SWF9TVEFUKGhlYWRfZW5xdWV1ZSkgfSwKLQl7ICJSeCBETUEgY2hhbjogdGFpbF9lbnF1ZXVlIiwgQ1BETUFfUlhfU1RBVCh0YWlsX2VucXVldWUpIH0sCi0JeyAiUnggRE1BIGNoYW46IHBhZF9lbnF1ZXVlIiwgQ1BETUFfUlhfU1RBVChwYWRfZW5xdWV1ZSkgfSwKLQl7ICJSeCBETUEgY2hhbjogbWlzcXVldWVkIiwgQ1BETUFfUlhfU1RBVChtaXNxdWV1ZWQpIH0sCi0JeyAiUnggRE1BIGNoYW46IGRlc2NfYWxsb2NfZmFpbCIsIENQRE1BX1JYX1NUQVQoZGVzY19hbGxvY19mYWlsKSB9LAotCXsgIlJ4IERNQSBjaGFuOiBwYWRfYWxsb2NfZmFpbCIsIENQRE1BX1JYX1NUQVQocGFkX2FsbG9jX2ZhaWwpIH0sCi0JeyAiUnggRE1BIGNoYW46IHJ1bnRfcmVjZWl2ZV9idWYiLCBDUERNQV9SWF9TVEFUKHJ1bnRfcmVjZWl2ZV9idWZmKSB9LAotCXsgIlJ4IERNQSBjaGFuOiBydW50X3RyYW5zbWl0X2J1ZiIsIENQRE1BX1JYX1NUQVQocnVudF90cmFuc21pdF9idWZmKSB9LAotCXsgIlJ4IERNQSBjaGFuOiBlbXB0eV9kZXF1ZXVlIiwgQ1BETUFfUlhfU1RBVChlbXB0eV9kZXF1ZXVlKSB9LAotCXsgIlJ4IERNQSBjaGFuOiBidXN5X2RlcXVldWUiLCBDUERNQV9SWF9TVEFUKGJ1c3lfZGVxdWV1ZSkgfSwKLQl7ICJSeCBETUEgY2hhbjogZ29vZF9kZXF1ZXVlIiwgQ1BETUFfUlhfU1RBVChnb29kX2RlcXVldWUpIH0sCi0JeyAiUnggRE1BIGNoYW46IHJlcXVldWUiLCBDUERNQV9SWF9TVEFUKHJlcXVldWUpIH0sCi0JeyAiUnggRE1BIGNoYW46IHRlYXJkb3duX2RlcXVldWUiLCBDUERNQV9SWF9TVEFUKHRlYXJkb3duX2RlcXVldWUpIH0sCi0JeyAiVHggRE1BIGNoYW46IGhlYWRfZW5xdWV1ZSIsIENQRE1BX1RYX1NUQVQoaGVhZF9lbnF1ZXVlKSB9LAotCXsgIlR4IERNQSBjaGFuOiB0YWlsX2VucXVldWUiLCBDUERNQV9UWF9TVEFUKHRhaWxfZW5xdWV1ZSkgfSwKLQl7ICJUeCBETUEgY2hhbjogcGFkX2VucXVldWUiLCBDUERNQV9UWF9TVEFUKHBhZF9lbnF1ZXVlKSB9LAotCXsgIlR4IERNQSBjaGFuOiBtaXNxdWV1ZWQiLCBDUERNQV9UWF9TVEFUKG1pc3F1ZXVlZCkgfSwKLQl7ICJUeCBETUEgY2hhbjogZGVzY19hbGxvY19mYWlsIiwgQ1BETUFfVFhfU1RBVChkZXNjX2FsbG9jX2ZhaWwpIH0sCi0JeyAiVHggRE1BIGNoYW46IHBhZF9hbGxvY19mYWlsIiwgQ1BETUFfVFhfU1RBVChwYWRfYWxsb2NfZmFpbCkgfSwKLQl7ICJUeCBETUEgY2hhbjogcnVudF9yZWNlaXZlX2J1ZiIsIENQRE1BX1RYX1NUQVQocnVudF9yZWNlaXZlX2J1ZmYpIH0sCi0JeyAiVHggRE1BIGNoYW46IHJ1bnRfdHJhbnNtaXRfYnVmIiwgQ1BETUFfVFhfU1RBVChydW50X3RyYW5zbWl0X2J1ZmYpIH0sCi0JeyAiVHggRE1BIGNoYW46IGVtcHR5X2RlcXVldWUiLCBDUERNQV9UWF9TVEFUKGVtcHR5X2RlcXVldWUpIH0sCi0JeyAiVHggRE1BIGNoYW46IGJ1c3lfZGVxdWV1ZSIsIENQRE1BX1RYX1NUQVQoYnVzeV9kZXF1ZXVlKSB9LAotCXsgIlR4IERNQSBjaGFuOiBnb29kX2RlcXVldWUiLCBDUERNQV9UWF9TVEFUKGdvb2RfZGVxdWV1ZSkgfSwKLQl7ICJUeCBETUEgY2hhbjogcmVxdWV1ZSIsIENQRE1BX1RYX1NUQVQocmVxdWV1ZSkgfSwKLQl7ICJUeCBETUEgY2hhbjogdGVhcmRvd25fZGVxdWV1ZSIsIENQRE1BX1RYX1NUQVQodGVhcmRvd25fZGVxdWV1ZSkgfSwKIH07CiAKLSNkZWZpbmUgQ1BTV19TVEFUU19MRU4JQVJSQVlfU0laRShjcHN3X2dzdHJpbmdzX3N0YXRzKQorc3RhdGljIGNvbnN0IHN0cnVjdCBjcHN3X3N0YXRzIGNwc3dfZ3N0cmluZ3NfY2hfc3RhdHNbXSA9IHsKKwl7ICJoZWFkX2VucXVldWUiLCBDUERNQV9SWF9TVEFUKGhlYWRfZW5xdWV1ZSkgfSwKKwl7ICJ0YWlsX2VucXVldWUiLCBDUERNQV9SWF9TVEFUKHRhaWxfZW5xdWV1ZSkgfSwKKwl7ICJwYWRfZW5xdWV1ZSIsIENQRE1BX1JYX1NUQVQocGFkX2VucXVldWUpIH0sCisJeyAibWlzcXVldWVkIiwgQ1BETUFfUlhfU1RBVChtaXNxdWV1ZWQpIH0sCisJeyAiZGVzY19hbGxvY19mYWlsIiwgQ1BETUFfUlhfU1RBVChkZXNjX2FsbG9jX2ZhaWwpIH0sCisJeyAicGFkX2FsbG9jX2ZhaWwiLCBDUERNQV9SWF9TVEFUKHBhZF9hbGxvY19mYWlsKSB9LAorCXsgInJ1bnRfcmVjZWl2ZV9idWYiLCBDUERNQV9SWF9TVEFUKHJ1bnRfcmVjZWl2ZV9idWZmKSB9LAorCXsgInJ1bnRfdHJhbnNtaXRfYnVmIiwgQ1BETUFfUlhfU1RBVChydW50X3RyYW5zbWl0X2J1ZmYpIH0sCisJeyAiZW1wdHlfZGVxdWV1ZSIsIENQRE1BX1JYX1NUQVQoZW1wdHlfZGVxdWV1ZSkgfSwKKwl7ICJidXN5X2RlcXVldWUiLCBDUERNQV9SWF9TVEFUKGJ1c3lfZGVxdWV1ZSkgfSwKKwl7ICJnb29kX2RlcXVldWUiLCBDUERNQV9SWF9TVEFUKGdvb2RfZGVxdWV1ZSkgfSwKKwl7ICJyZXF1ZXVlIiwgQ1BETUFfUlhfU1RBVChyZXF1ZXVlKSB9LAorCXsgInRlYXJkb3duX2RlcXVldWUiLCBDUERNQV9SWF9TVEFUKHRlYXJkb3duX2RlcXVldWUpIH0sCit9OwogCi0jZGVmaW5lIG5hcGlfdG9fcHJpdihuYXBpKQljb250YWluZXJfb2YobmFwaSwgc3RydWN0IGNwc3dfcHJpdiwgbmFwaSkKKyNkZWZpbmUgQ1BTV19TVEFUU19DT01NT05fTEVOCUFSUkFZX1NJWkUoY3Bzd19nc3RyaW5nc19zdGF0cykKKyNkZWZpbmUgQ1BTV19TVEFUU19DSF9MRU4JQVJSQVlfU0laRShjcHN3X2dzdHJpbmdzX2NoX3N0YXRzKQorCisjZGVmaW5lIG5kZXZfdG9fY3BzdyhuZGV2KSAoKChzdHJ1Y3QgY3Bzd19wcml2ICopbmV0ZGV2X3ByaXYobmRldikpLT5jcHN3KQorI2RlZmluZSBuYXBpX3RvX2Nwc3cobmFwaSkJY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBjcHN3X2NvbW1vbiwgbmFwaSkKICNkZWZpbmUgZm9yX2VhY2hfc2xhdmUocHJpdiwgZnVuYywgYXJnLi4uKQkJCQlcCiAJZG8gewkJCQkJCQkJXAogCQlzdHJ1Y3QgY3Bzd19zbGF2ZSAqc2xhdmU7CQkJCVwKKwkJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gKHByaXYpLT5jcHN3OwkJXAogCQlpbnQgbjsJCQkJCQkJXAotCQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpCQkJCVwKLQkJCShmdW5jKSgocHJpdiktPnNsYXZlcyArIHByaXYtPmVtYWNfcG9ydCwgIyNhcmcpO1wKKwkJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKQkJCQlcCisJCQkoZnVuYykoKGNwc3cpLT5zbGF2ZXMgKyBwcml2LT5lbWFjX3BvcnQsICMjYXJnKTtcCiAJCWVsc2UJCQkJCQkJXAotCQkJZm9yIChuID0gKHByaXYpLT5kYXRhLnNsYXZlcywJCQlcCi0JCQkJCXNsYXZlID0gKHByaXYpLT5zbGF2ZXM7CQlcCisJCQlmb3IgKG4gPSBjcHN3LT5kYXRhLnNsYXZlcywJCQlcCisJCQkJCXNsYXZlID0gY3Bzdy0+c2xhdmVzOwkJXAogCQkJCQluOyBuLS0pCQkJCVwKIAkJCQkoZnVuYykoc2xhdmUrKywgIyNhcmcpOwkJCVwKIAl9IHdoaWxlICgwKQotI2RlZmluZSBjcHN3X2dldF9zbGF2ZV9uZGV2KHByaXYsIF9fc2xhdmVfbm9fXykJCQkJXAotCSgoX19zbGF2ZV9ub19fIDwgcHJpdi0+ZGF0YS5zbGF2ZXMpID8JCQkJXAotCQlwcml2LT5zbGF2ZXNbX19zbGF2ZV9ub19fXS5uZGV2IDogTlVMTCkKLSNkZWZpbmUgY3Bzd19nZXRfc2xhdmVfcHJpdihwcml2LCBfX3NsYXZlX25vX18pCQkJCVwKLQkoKChfX3NsYXZlX25vX18gPCBwcml2LT5kYXRhLnNsYXZlcykgJiYJCQkJXAotCQkocHJpdi0+c2xhdmVzW19fc2xhdmVfbm9fX10ubmRldikpID8JCQlcCi0JCW5ldGRldl9wcml2KHByaXYtPnNsYXZlc1tfX3NsYXZlX25vX19dLm5kZXYpIDogTlVMTCkJXAogCi0jZGVmaW5lIGNwc3dfZHVhbF9lbWFjX3NyY19wb3J0X2RldGVjdChzdGF0dXMsIHByaXYsIG5kZXYsIHNrYikJCVwKKyNkZWZpbmUgY3Bzd19kdWFsX2VtYWNfc3JjX3BvcnRfZGV0ZWN0KGNwc3csIHN0YXR1cywgbmRldiwgc2tiKQkJXAogCWRvIHsJCQkJCQkJCVwKLQkJaWYgKCFwcml2LT5kYXRhLmR1YWxfZW1hYykJCQkJXAorCQlpZiAoIWNwc3ctPmRhdGEuZHVhbF9lbWFjKQkJCQlcCiAJCQlicmVhazsJCQkJCQlcCiAJCWlmIChDUERNQV9SWF9TT1VSQ0VfUE9SVChzdGF0dXMpID09IDEpIHsJCVwKLQkJCW5kZXYgPSBjcHN3X2dldF9zbGF2ZV9uZGV2KHByaXYsIDApOwkJXAotCQkJcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwkJCVwKKwkJCW5kZXYgPSBjcHN3LT5zbGF2ZXNbMF0ubmRldjsJCQlcCiAJCQlza2ItPmRldiA9IG5kZXY7CQkJCVwKIAkJfSBlbHNlIGlmIChDUERNQV9SWF9TT1VSQ0VfUE9SVChzdGF0dXMpID09IDIpIHsJCVwKLQkJCW5kZXYgPSBjcHN3X2dldF9zbGF2ZV9uZGV2KHByaXYsIDEpOwkJXAotCQkJcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwkJCVwKKwkJCW5kZXYgPSBjcHN3LT5zbGF2ZXNbMV0ubmRldjsJCQlcCiAJCQlza2ItPmRldiA9IG5kZXY7CQkJCVwKIAkJfQkJCQkJCQlcCiAJfSB3aGlsZSAoMCkKLSNkZWZpbmUgY3Bzd19hZGRfbWNhc3QocHJpdiwgYWRkcikJCQkJCVwKKyNkZWZpbmUgY3Bzd19hZGRfbWNhc3QoY3BzdywgcHJpdiwgYWRkcikJCQkJXAogCWRvIHsJCQkJCQkJCVwKLQkJaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKSB7CQkJCVwKLQkJCXN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSA9IHByaXYtPnNsYXZlcyArCVwKKwkJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKSB7CQkJCVwKKwkJCXN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSA9IGNwc3ctPnNsYXZlcyArCVwKIAkJCQkJCXByaXYtPmVtYWNfcG9ydDsJXAotCQkJaW50IHNsYXZlX3BvcnQgPSBjcHN3X2dldF9zbGF2ZV9wb3J0KHByaXYsCVwKKwkJCWludCBzbGF2ZV9wb3J0ID0gY3Bzd19nZXRfc2xhdmVfcG9ydCgJCVwKIAkJCQkJCXNsYXZlLT5zbGF2ZV9udW0pOwlcCi0JCQljcHN3X2FsZV9hZGRfbWNhc3QocHJpdi0+YWxlLCBhZGRyLAkJXAorCQkJY3Bzd19hbGVfYWRkX21jYXN0KGNwc3ctPmFsZSwgYWRkciwJCVwKIAkJCQkxIDw8IHNsYXZlX3BvcnQgfCBBTEVfUE9SVF9IT1NULAlcCiAJCQkJQUxFX1ZMQU4sIHNsYXZlLT5wb3J0X3ZsYW4sIDApOwkJXAogCQl9IGVsc2UgewkJCQkJCVwKLQkJCWNwc3dfYWxlX2FkZF9tY2FzdChwcml2LT5hbGUsIGFkZHIsCQlcCisJCQljcHN3X2FsZV9hZGRfbWNhc3QoY3Bzdy0+YWxlLCBhZGRyLAkJXAogCQkJCUFMRV9BTExfUE9SVFMsCQkJCVwKIAkJCQkwLCAwLCAwKTsJCQkJXAogCQl9CQkJCQkJCVwKIAl9IHdoaWxlICgwKQogCi1zdGF0aWMgaW5saW5lIGludCBjcHN3X2dldF9zbGF2ZV9wb3J0KHN0cnVjdCBjcHN3X3ByaXYgKnByaXYsIHUzMiBzbGF2ZV9udW0pCitzdGF0aWMgaW5saW5lIGludCBjcHN3X2dldF9zbGF2ZV9wb3J0KHUzMiBzbGF2ZV9udW0pCiB7CiAJcmV0dXJuIHNsYXZlX251bSArIDE7CiB9CiAKIHN0YXRpYyB2b2lkIGNwc3dfc2V0X3Byb21pc2Npb3VzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBib29sIGVuYWJsZSkKIHsKLQlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0Jc3RydWN0IGNwc3dfYWxlICphbGUgPSBwcml2LT5hbGU7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gbmRldl90b19jcHN3KG5kZXYpOworCXN0cnVjdCBjcHN3X2FsZSAqYWxlID0gY3Bzdy0+YWxlOwogCWludCBpOwogCi0JaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKSB7CisJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKSB7CiAJCWJvb2wgZmxhZyA9IGZhbHNlOwogCiAJCS8qIEVuYWJsaW5nIHByb21pc2N1b3VzIG1vZGUgZm9yIG9uZSBpbnRlcmZhY2Ugd2lsbCBiZQogCQkgKiBjb21tb24gZm9yIGJvdGggdGhlIGludGVyZmFjZSBhcyB0aGUgaW50ZXJmYWNlIHNoYXJlcwogCQkgKiB0aGUgc2FtZSBoYXJkd2FyZSByZXNvdXJjZS4KIAkJICovCi0JCWZvciAoaSA9IDA7IGkgPCBwcml2LT5kYXRhLnNsYXZlczsgaSsrKQotCQkJaWYgKHByaXYtPnNsYXZlc1tpXS5uZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQlmb3IgKGkgPSAwOyBpIDwgY3Bzdy0+ZGF0YS5zbGF2ZXM7IGkrKykKKwkJCWlmIChjcHN3LT5zbGF2ZXNbaV0ubmRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKIAkJCQlmbGFnID0gdHJ1ZTsKIAogCQlpZiAoIWVuYWJsZSAmJiBmbGFnKSB7CkBAIC01NzksNyArNTY4LDcgQEAKIAkJCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWjsKIAogCQkJLyogRGlzYWJsZSBMZWFybiBmb3IgYWxsIHBvcnRzIChob3N0IGlzIHBvcnQgMCBhbmQgc2xhdmVzIGFyZSBwb3J0IDEgYW5kIHVwICovCi0JCQlmb3IgKGkgPSAwOyBpIDw9IHByaXYtPmRhdGEuc2xhdmVzOyBpKyspIHsKKwkJCWZvciAoaSA9IDA7IGkgPD0gY3Bzdy0+ZGF0YS5zbGF2ZXM7IGkrKykgewogCQkJCWNwc3dfYWxlX2NvbnRyb2xfc2V0KGFsZSwgaSwKIAkJCQkJCSAgICAgQUxFX1BPUlRfTk9MRUFSTiwgMSk7CiAJCQkJY3Bzd19hbGVfY29udHJvbF9zZXQoYWxlLCBpLApAQCAtNjA2LDcgKzU5NSw3IEBACiAJCQljcHN3X2FsZV9jb250cm9sX3NldChhbGUsIDAsIEFMRV9QMF9VTklfRkxPT0QsIDApOwogCiAJCQkvKiBFbmFibGUgTGVhcm4gZm9yIGFsbCBwb3J0cyAoaG9zdCBpcyBwb3J0IDAgYW5kIHNsYXZlcyBhcmUgcG9ydCAxIGFuZCB1cCAqLwotCQkJZm9yIChpID0gMDsgaSA8PSBwcml2LT5kYXRhLnNsYXZlczsgaSsrKSB7CisJCQlmb3IgKGkgPSAwOyBpIDw9IGNwc3ctPmRhdGEuc2xhdmVzOyBpKyspIHsKIAkJCQljcHN3X2FsZV9jb250cm9sX3NldChhbGUsIGksCiAJCQkJCQkgICAgIEFMRV9QT1JUX05PTEVBUk4sIDApOwogCQkJCWNwc3dfYWxlX2NvbnRyb2xfc2V0KGFsZSwgaSwKQEAgLTYyMCwxNyArNjA5LDE4IEBACiBzdGF0aWMgdm9pZCBjcHN3X25kb19zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKIAlpbnQgdmlkOwogCi0JaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKQotCQl2aWQgPSBwcml2LT5zbGF2ZXNbcHJpdi0+ZW1hY19wb3J0XS5wb3J0X3ZsYW47CisJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKQorCQl2aWQgPSBjcHN3LT5zbGF2ZXNbcHJpdi0+ZW1hY19wb3J0XS5wb3J0X3ZsYW47CiAJZWxzZQotCQl2aWQgPSBwcml2LT5kYXRhLmRlZmF1bHRfdmxhbjsKKwkJdmlkID0gY3Bzdy0+ZGF0YS5kZWZhdWx0X3ZsYW47CiAKIAlpZiAobmRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewogCQkvKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLwogCQljcHN3X3NldF9wcm9taXNjaW91cyhuZGV2LCB0cnVlKTsKLQkJY3Bzd19hbGVfc2V0X2FsbG11bHRpKHByaXYtPmFsZSwgSUZGX0FMTE1VTFRJKTsKKwkJY3Bzd19hbGVfc2V0X2FsbG11bHRpKGNwc3ctPmFsZSwgSUZGX0FMTE1VTFRJKTsKIAkJcmV0dXJuOwogCX0gZWxzZSB7CiAJCS8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSAqLwpAQCAtNjM4LDUxICs2MjgsNTQgQEAKIAl9CiAKIAkvKiBSZXN0b3JlIGFsbG11bHRpIG9uIHZsYW5zIGlmIG5lY2Vzc2FyeSAqLwotCWNwc3dfYWxlX3NldF9hbGxtdWx0aShwcml2LT5hbGUsIHByaXYtPm5kZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKTsKKwljcHN3X2FsZV9zZXRfYWxsbXVsdGkoY3Bzdy0+YWxlLCBwcml2LT5uZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSk7CiAKIAkvKiBDbGVhciBhbGwgbWNhc3QgZnJvbSBBTEUgKi8KLQljcHN3X2FsZV9mbHVzaF9tdWx0aWNhc3QocHJpdi0+YWxlLCBBTEVfQUxMX1BPUlRTLCB2aWQpOworCWNwc3dfYWxlX2ZsdXNoX211bHRpY2FzdChjcHN3LT5hbGUsIEFMRV9BTExfUE9SVFMsIHZpZCk7CiAKIAlpZiAoIW5ldGRldl9tY19lbXB0eShuZGV2KSkgewogCQlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwogCiAJCS8qIHByb2dyYW0gbXVsdGljYXN0IGFkZHJlc3MgbGlzdCBpbnRvIEFMRSByZWdpc3RlciAqLwogCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgbmRldikgewotCQkJY3Bzd19hZGRfbWNhc3QocHJpdiwgKHU4ICopaGEtPmFkZHIpOworCQkJY3Bzd19hZGRfbWNhc3QoY3BzdywgcHJpdiwgKHU4ICopaGEtPmFkZHIpOwogCQl9CiAJfQogfQogCi1zdGF0aWMgdm9pZCBjcHN3X2ludHJfZW5hYmxlKHN0cnVjdCBjcHN3X3ByaXYgKnByaXYpCitzdGF0aWMgdm9pZCBjcHN3X2ludHJfZW5hYmxlKHN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdykKIHsKLQlfX3Jhd193cml0ZWwoMHhGRiwgJnByaXYtPndyX3JlZ3MtPnR4X2VuKTsKLQlfX3Jhd193cml0ZWwoMHhGRiwgJnByaXYtPndyX3JlZ3MtPnJ4X2VuKTsKKwlfX3Jhd193cml0ZWwoMHhGRiwgJmNwc3ctPndyX3JlZ3MtPnR4X2VuKTsKKwlfX3Jhd193cml0ZWwoMHhGRiwgJmNwc3ctPndyX3JlZ3MtPnJ4X2VuKTsKIAotCWNwZG1hX2N0bHJfaW50X2N0cmwocHJpdi0+ZG1hLCB0cnVlKTsKKwljcGRtYV9jdGxyX2ludF9jdHJsKGNwc3ctPmRtYSwgdHJ1ZSk7CiAJcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBjcHN3X2ludHJfZGlzYWJsZShzdHJ1Y3QgY3Bzd19wcml2ICpwcml2KQorc3RhdGljIHZvaWQgY3Bzd19pbnRyX2Rpc2FibGUoc3RydWN0IGNwc3dfY29tbW9uICpjcHN3KQogewotCV9fcmF3X3dyaXRlbCgwLCAmcHJpdi0+d3JfcmVncy0+dHhfZW4pOwotCV9fcmF3X3dyaXRlbCgwLCAmcHJpdi0+d3JfcmVncy0+cnhfZW4pOworCV9fcmF3X3dyaXRlbCgwLCAmY3Bzdy0+d3JfcmVncy0+dHhfZW4pOworCV9fcmF3X3dyaXRlbCgwLCAmY3Bzdy0+d3JfcmVncy0+cnhfZW4pOwogCi0JY3BkbWFfY3Rscl9pbnRfY3RybChwcml2LT5kbWEsIGZhbHNlKTsKKwljcGRtYV9jdGxyX2ludF9jdHJsKGNwc3ctPmRtYSwgZmFsc2UpOwogCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgY3Bzd190eF9oYW5kbGVyKHZvaWQgKnRva2VuLCBpbnQgbGVuLCBpbnQgc3RhdHVzKQogeworCXN0cnVjdCBuZXRkZXZfcXVldWUJKnR4cTsKIAlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYiA9IHRva2VuOwogCXN0cnVjdCBuZXRfZGV2aWNlCSpuZGV2ID0gc2tiLT5kZXY7Ci0Jc3RydWN0IGNwc3dfcHJpdgkqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbgkqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKIAogCS8qIENoZWNrIHdoZXRoZXIgdGhlIHF1ZXVlIGlzIHN0b3BwZWQgZHVlIHRvIHN0YWxsZWQgdHggZG1hLCBpZiB0aGUKIAkgKiBxdWV1ZSBpcyBzdG9wcGVkIHRoZW4gc3RhcnQgdGhlIHF1ZXVlIGFzIHdlIGhhdmUgZnJlZSBkZXNjIGZvciB0eAogCSAqLwotCWlmICh1bmxpa2VseShuZXRpZl9xdWV1ZV9zdG9wcGVkKG5kZXYpKSkKLQkJbmV0aWZfd2FrZV9xdWV1ZShuZGV2KTsKLQljcHRzX3R4X3RpbWVzdGFtcChwcml2LT5jcHRzLCBza2IpOworCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUobmRldiwgc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYikpOworCWlmICh1bmxpa2VseShuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKHR4cSkpKQorCQluZXRpZl90eF93YWtlX3F1ZXVlKHR4cSk7CisKKwljcHRzX3R4X3RpbWVzdGFtcChjcHN3LT5jcHRzLCBza2IpOwogCW5kZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAluZGV2LT5zdGF0cy50eF9ieXRlcyArPSBsZW47CiAJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKQEAgLTY5MCwyMiArNjgzLDIzIEBACiAKIHN0YXRpYyB2b2lkIGNwc3dfcnhfaGFuZGxlcih2b2lkICp0b2tlbiwgaW50IGxlbiwgaW50IHN0YXR1cykKIHsKKwlzdHJ1Y3QgY3BkbWFfY2hhbgkqY2g7CiAJc3RydWN0IHNrX2J1ZmYJCSpza2IgPSB0b2tlbjsKIAlzdHJ1Y3Qgc2tfYnVmZgkJKm5ld19za2I7CiAJc3RydWN0IG5ldF9kZXZpY2UJKm5kZXYgPSBza2ItPmRldjsKLQlzdHJ1Y3QgY3Bzd19wcml2CSpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJaW50CQkJcmV0ID0gMDsKKwlzdHJ1Y3QgY3Bzd19jb21tb24JKmNwc3cgPSBuZGV2X3RvX2Nwc3cobmRldik7CiAKLQljcHN3X2R1YWxfZW1hY19zcmNfcG9ydF9kZXRlY3Qoc3RhdHVzLCBwcml2LCBuZGV2LCBza2IpOworCWNwc3dfZHVhbF9lbWFjX3NyY19wb3J0X2RldGVjdChjcHN3LCBzdGF0dXMsIG5kZXYsIHNrYik7CiAKIAlpZiAodW5saWtlbHkoc3RhdHVzIDwgMCkgfHwgdW5saWtlbHkoIW5ldGlmX3J1bm5pbmcobmRldikpKSB7CiAJCWJvb2wgbmRldl9zdGF0dXMgPSBmYWxzZTsKLQkJc3RydWN0IGNwc3dfc2xhdmUgKnNsYXZlID0gcHJpdi0+c2xhdmVzOworCQlzdHJ1Y3QgY3Bzd19zbGF2ZSAqc2xhdmUgPSBjcHN3LT5zbGF2ZXM7CiAJCWludCBuOwogCi0JCWlmIChwcml2LT5kYXRhLmR1YWxfZW1hYykgeworCQlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpIHsKIAkJCS8qIEluIGR1YWwgZW1hYyBtb2RlIGNoZWNrIGZvciBhbGwgaW50ZXJmYWNlcyAqLwotCQkJZm9yIChuID0gcHJpdi0+ZGF0YS5zbGF2ZXM7IG47IG4tLSwgc2xhdmUrKykKKwkJCWZvciAobiA9IGNwc3ctPmRhdGEuc2xhdmVzOyBuOyBuLS0sIHNsYXZlKyspCiAJCQkJaWYgKG5ldGlmX3J1bm5pbmcoc2xhdmUtPm5kZXYpKQogCQkJCQluZGV2X3N0YXR1cyA9IHRydWU7CiAJCX0KQEAgLTcyNiw5NiArNzIwLDEzMiBAQAogCQlyZXR1cm47CiAJfQogCi0JbmV3X3NrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24obmRldiwgcHJpdi0+cnhfcGFja2V0X21heCk7CisJbmV3X3NrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24obmRldiwgY3Bzdy0+cnhfcGFja2V0X21heCk7CiAJaWYgKG5ld19za2IpIHsKKwkJc2tiX2NvcHlfcXVldWVfbWFwcGluZyhuZXdfc2tiLCBza2IpOwogCQlza2JfcHV0KHNrYiwgbGVuKTsKLQkJY3B0c19yeF90aW1lc3RhbXAocHJpdi0+Y3B0cywgc2tiKTsKKwkJY3B0c19yeF90aW1lc3RhbXAoY3Bzdy0+Y3B0cywgc2tiKTsKIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmRldik7CiAJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CiAJCW5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKIAkJbmRldi0+c3RhdHMucnhfcGFja2V0cysrOworCQlrbWVtbGVha19ub3RfbGVhayhuZXdfc2tiKTsKIAl9IGVsc2UgewogCQluZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCW5ld19za2IgPSBza2I7CiAJfQogCiByZXF1ZXVlOgotCXJldCA9IGNwZG1hX2NoYW5fc3VibWl0KHByaXYtPnJ4Y2gsIG5ld19za2IsIG5ld19za2ItPmRhdGEsCi0JCQlza2JfdGFpbHJvb20obmV3X3NrYiksIDApOworCWlmIChuZXRpZl9kb3JtYW50KG5kZXYpKSB7CisJCWRldl9rZnJlZV9za2JfYW55KG5ld19za2IpOworCQlyZXR1cm47CisJfQorCisJY2ggPSBjcHN3LT5yeGNoW3NrYl9nZXRfcXVldWVfbWFwcGluZyhuZXdfc2tiKV07CisJcmV0ID0gY3BkbWFfY2hhbl9zdWJtaXQoY2gsIG5ld19za2IsIG5ld19za2ItPmRhdGEsCisJCQkJc2tiX3RhaWxyb29tKG5ld19za2IpLCAwKTsKIAlpZiAoV0FSTl9PTihyZXQgPCAwKSkKIAkJZGV2X2tmcmVlX3NrYl9hbnkobmV3X3NrYik7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBjcHN3X3R4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0Jc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IGRldl9pZDsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBkZXZfaWQ7CiAKLQl3cml0ZWwoMCwgJnByaXYtPndyX3JlZ3MtPnR4X2VuKTsKLQljcGRtYV9jdGxyX2VvaShwcml2LT5kbWEsIENQRE1BX0VPSV9UWCk7CisJd3JpdGVsKDAsICZjcHN3LT53cl9yZWdzLT50eF9lbik7CisJY3BkbWFfY3Rscl9lb2koY3Bzdy0+ZG1hLCBDUERNQV9FT0lfVFgpOwogCi0JaWYgKHByaXYtPnF1aXJrX2lycSkgewotCQlkaXNhYmxlX2lycV9ub3N5bmMocHJpdi0+aXJxc190YWJsZVsxXSk7Ci0JCXByaXYtPnR4X2lycV9kaXNhYmxlZCA9IHRydWU7CisJaWYgKGNwc3ctPnF1aXJrX2lycSkgeworCQlkaXNhYmxlX2lycV9ub3N5bmMoY3Bzdy0+aXJxc190YWJsZVsxXSk7CisJCWNwc3ctPnR4X2lycV9kaXNhYmxlZCA9IHRydWU7CiAJfQogCi0JbmFwaV9zY2hlZHVsZSgmcHJpdi0+bmFwaV90eCk7CisJbmFwaV9zY2hlZHVsZSgmY3Bzdy0+bmFwaV90eCk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgY3Bzd19yeF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBkZXZfaWQ7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gZGV2X2lkOwogCi0JY3BkbWFfY3Rscl9lb2kocHJpdi0+ZG1hLCBDUERNQV9FT0lfUlgpOwotCXdyaXRlbCgwLCAmcHJpdi0+d3JfcmVncy0+cnhfZW4pOworCWNwZG1hX2N0bHJfZW9pKGNwc3ctPmRtYSwgQ1BETUFfRU9JX1JYKTsKKwl3cml0ZWwoMCwgJmNwc3ctPndyX3JlZ3MtPnJ4X2VuKTsKIAotCWlmIChwcml2LT5xdWlya19pcnEpIHsKLQkJZGlzYWJsZV9pcnFfbm9zeW5jKHByaXYtPmlycXNfdGFibGVbMF0pOwotCQlwcml2LT5yeF9pcnFfZGlzYWJsZWQgPSB0cnVlOworCWlmIChjcHN3LT5xdWlya19pcnEpIHsKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKGNwc3ctPmlycXNfdGFibGVbMF0pOworCQljcHN3LT5yeF9pcnFfZGlzYWJsZWQgPSB0cnVlOwogCX0KIAotCW5hcGlfc2NoZWR1bGUoJnByaXYtPm5hcGlfcngpOworCW5hcGlfc2NoZWR1bGUoJmNwc3ctPm5hcGlfcngpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogc3RhdGljIGludCBjcHN3X3R4X3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpX3R4LCBpbnQgYnVkZ2V0KQogewotCXN0cnVjdCBjcHN3X3ByaXYJKnByaXYgPSBuYXBpX3RvX3ByaXYobmFwaV90eCk7Ci0JaW50CQkJbnVtX3R4OworCXUzMgkJCWNoX21hcDsKKwlpbnQJCQludW1fdHgsIGNoOworCXN0cnVjdCBjcHN3X2NvbW1vbgkqY3BzdyA9IG5hcGlfdG9fY3BzdyhuYXBpX3R4KTsKIAotCW51bV90eCA9IGNwZG1hX2NoYW5fcHJvY2Vzcyhwcml2LT50eGNoLCBidWRnZXQpOwotCWlmIChudW1fdHggPCBidWRnZXQpIHsKLQkJbmFwaV9jb21wbGV0ZShuYXBpX3R4KTsKLQkJd3JpdGVsKDB4ZmYsICZwcml2LT53cl9yZWdzLT50eF9lbik7Ci0JCWlmIChwcml2LT5xdWlya19pcnEgJiYgcHJpdi0+dHhfaXJxX2Rpc2FibGVkKSB7Ci0JCQlwcml2LT50eF9pcnFfZGlzYWJsZWQgPSBmYWxzZTsKLQkJCWVuYWJsZV9pcnEocHJpdi0+aXJxc190YWJsZVsxXSk7CisJLyogcHJvY2VzcyBldmVyeSB1bnByb2Nlc3NlZCBjaGFubmVsICovCisJY2hfbWFwID0gY3BkbWFfY3RybF90eGNoc19zdGF0ZShjcHN3LT5kbWEpOworCWZvciAoY2ggPSAwLCBudW1fdHggPSAwOyBudW1fdHggPCBidWRnZXQ7IGNoX21hcCA+Pj0gMSwgY2grKykgeworCQlpZiAoIWNoX21hcCkgeworCQkJY2hfbWFwID0gY3BkbWFfY3RybF90eGNoc19zdGF0ZShjcHN3LT5kbWEpOworCQkJaWYgKCFjaF9tYXApCisJCQkJYnJlYWs7CisKKwkJCWNoID0gMDsKIAkJfQorCisJCWlmICghKGNoX21hcCAmIDB4MDEpKQorCQkJY29udGludWU7CisKKwkJbnVtX3R4ICs9IGNwZG1hX2NoYW5fcHJvY2VzcyhjcHN3LT50eGNoW2NoXSwgYnVkZ2V0IC0gbnVtX3R4KTsKIAl9CiAKLQlpZiAobnVtX3R4KQotCQljcHN3X2RiZyhwcml2LCBpbnRyLCAicG9sbCAlZCB0eCBwa3RzXG4iLCBudW1fdHgpOworCWlmIChudW1fdHggPCBidWRnZXQpIHsKKwkJbmFwaV9jb21wbGV0ZShuYXBpX3R4KTsKKwkJd3JpdGVsKDB4ZmYsICZjcHN3LT53cl9yZWdzLT50eF9lbik7CisJCWlmIChjcHN3LT5xdWlya19pcnEgJiYgY3Bzdy0+dHhfaXJxX2Rpc2FibGVkKSB7CisJCQljcHN3LT50eF9pcnFfZGlzYWJsZWQgPSBmYWxzZTsKKwkJCWVuYWJsZV9pcnEoY3Bzdy0+aXJxc190YWJsZVsxXSk7CisJCX0KKwl9CiAKIAlyZXR1cm4gbnVtX3R4OwogfQogCiBzdGF0aWMgaW50IGNwc3dfcnhfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGlfcngsIGludCBidWRnZXQpCiB7Ci0Jc3RydWN0IGNwc3dfcHJpdgkqcHJpdiA9IG5hcGlfdG9fcHJpdihuYXBpX3J4KTsKLQlpbnQJCQludW1fcng7CisJdTMyCQkJY2hfbWFwOworCWludAkJCW51bV9yeCwgY2g7CisJc3RydWN0IGNwc3dfY29tbW9uCSpjcHN3ID0gbmFwaV90b19jcHN3KG5hcGlfcngpOwogCi0JbnVtX3J4ID0gY3BkbWFfY2hhbl9wcm9jZXNzKHByaXYtPnJ4Y2gsIGJ1ZGdldCk7Ci0JaWYgKG51bV9yeCA8IGJ1ZGdldCkgewotCQluYXBpX2NvbXBsZXRlKG5hcGlfcngpOwotCQl3cml0ZWwoMHhmZiwgJnByaXYtPndyX3JlZ3MtPnJ4X2VuKTsKLQkJaWYgKHByaXYtPnF1aXJrX2lycSAmJiBwcml2LT5yeF9pcnFfZGlzYWJsZWQpIHsKLQkJCXByaXYtPnJ4X2lycV9kaXNhYmxlZCA9IGZhbHNlOwotCQkJZW5hYmxlX2lycShwcml2LT5pcnFzX3RhYmxlWzBdKTsKKwkvKiBwcm9jZXNzIGV2ZXJ5IHVucHJvY2Vzc2VkIGNoYW5uZWwgKi8KKwljaF9tYXAgPSBjcGRtYV9jdHJsX3J4Y2hzX3N0YXRlKGNwc3ctPmRtYSk7CisJZm9yIChjaCA9IDAsIG51bV9yeCA9IDA7IG51bV9yeCA8IGJ1ZGdldDsgY2hfbWFwID4+PSAxLCBjaCsrKSB7CisJCWlmICghY2hfbWFwKSB7CisJCQljaF9tYXAgPSBjcGRtYV9jdHJsX3J4Y2hzX3N0YXRlKGNwc3ctPmRtYSk7CisJCQlpZiAoIWNoX21hcCkKKwkJCQlicmVhazsKKworCQkJY2ggPSAwOwogCQl9CisKKwkJaWYgKCEoY2hfbWFwICYgMHgwMSkpCisJCQljb250aW51ZTsKKworCQludW1fcnggKz0gY3BkbWFfY2hhbl9wcm9jZXNzKGNwc3ctPnJ4Y2hbY2hdLCBidWRnZXQgLSBudW1fcngpOwogCX0KIAotCWlmIChudW1fcngpCi0JCWNwc3dfZGJnKHByaXYsIGludHIsICJwb2xsICVkIHJ4IHBrdHNcbiIsIG51bV9yeCk7CisJaWYgKG51bV9yeCA8IGJ1ZGdldCkgeworCQluYXBpX2NvbXBsZXRlKG5hcGlfcngpOworCQl3cml0ZWwoMHhmZiwgJmNwc3ctPndyX3JlZ3MtPnJ4X2VuKTsKKwkJaWYgKGNwc3ctPnF1aXJrX2lycSAmJiBjcHN3LT5yeF9pcnFfZGlzYWJsZWQpIHsKKwkJCWNwc3ctPnJ4X2lycV9kaXNhYmxlZCA9IGZhbHNlOworCQkJZW5hYmxlX2lycShjcHN3LT5pcnFzX3RhYmxlWzBdKTsKKwkJfQorCX0KIAogCXJldHVybiBudW1fcng7CiB9CkBAIC04NDksMTcgKzg3OSwxOCBAQAogCXN0cnVjdCBwaHlfZGV2aWNlCSpwaHkgPSBzbGF2ZS0+cGh5OwogCXUzMgkJCW1hY19jb250cm9sID0gMDsKIAl1MzIJCQlzbGF2ZV9wb3J0OworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CiAKIAlpZiAoIXBoeSkKIAkJcmV0dXJuOwogCi0Jc2xhdmVfcG9ydCA9IGNwc3dfZ2V0X3NsYXZlX3BvcnQocHJpdiwgc2xhdmUtPnNsYXZlX251bSk7CisJc2xhdmVfcG9ydCA9IGNwc3dfZ2V0X3NsYXZlX3BvcnQoc2xhdmUtPnNsYXZlX251bSk7CiAKIAlpZiAocGh5LT5saW5rKSB7Ci0JCW1hY19jb250cm9sID0gcHJpdi0+ZGF0YS5tYWNfY29udHJvbDsKKwkJbWFjX2NvbnRyb2wgPSBjcHN3LT5kYXRhLm1hY19jb250cm9sOwogCiAJCS8qIGVuYWJsZSBmb3J3YXJkaW5nICovCi0JCWNwc3dfYWxlX2NvbnRyb2xfc2V0KHByaXYtPmFsZSwgc2xhdmVfcG9ydCwKKwkJY3Bzd19hbGVfY29udHJvbF9zZXQoY3Bzdy0+YWxlLCBzbGF2ZV9wb3J0LAogCQkJCSAgICAgQUxFX1BPUlRfU1RBVEUsIEFMRV9QT1JUX1NUQVRFX0ZPUldBUkQpOwogCiAJCWlmIChwaHktPnNwZWVkID09IDEwMDApCkBAIC04ODMsNyArOTE0LDcgQEAKIAl9IGVsc2UgewogCQltYWNfY29udHJvbCA9IDA7CiAJCS8qIGRpc2FibGUgZm9yd2FyZGluZyAqLwotCQljcHN3X2FsZV9jb250cm9sX3NldChwcml2LT5hbGUsIHNsYXZlX3BvcnQsCisJCWNwc3dfYWxlX2NvbnRyb2xfc2V0KGNwc3ctPmFsZSwgc2xhdmVfcG9ydCwKIAkJCQkgICAgIEFMRV9QT1JUX1NUQVRFLCBBTEVfUE9SVF9TVEFURV9ESVNBQkxFKTsKIAl9CiAKQEAgLTkwNSwxOSArOTM2LDE5IEBACiAJaWYgKGxpbmspIHsKIAkJbmV0aWZfY2Fycmllcl9vbihuZGV2KTsKIAkJaWYgKG5ldGlmX3J1bm5pbmcobmRldikpCi0JCQluZXRpZl93YWtlX3F1ZXVlKG5kZXYpOworCQkJbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKG5kZXYpOwogCX0gZWxzZSB7CiAJCW5ldGlmX2NhcnJpZXJfb2ZmKG5kZXYpOwotCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMobmRldik7CiAJfQogfQogCiBzdGF0aWMgaW50IGNwc3dfZ2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAogCQkJCXN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjb2FsKQogewotCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBuZGV2X3RvX2Nwc3cobmRldik7CiAKLQljb2FsLT5yeF9jb2FsZXNjZV91c2VjcyA9IHByaXYtPmNvYWxfaW50dmw7CisJY29hbC0+cnhfY29hbGVzY2VfdXNlY3MgPSBjcHN3LT5jb2FsX2ludHZsOwogCXJldHVybiAwOwogfQogCkBAIC05MzAsMTEgKzk2MSwxMiBAQAogCXUzMiBwcmVzY2FsZSA9IDA7CiAJdTMyIGFkZG5sX2R2ZHIgPSAxOwogCXUzMiBjb2FsX2ludHZsID0gMDsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OwogCiAJY29hbF9pbnR2bCA9IGNvYWwtPnJ4X2NvYWxlc2NlX3VzZWNzOwogCi0JaW50X2N0cmwgPSAgcmVhZGwoJnByaXYtPndyX3JlZ3MtPmludF9jb250cm9sKTsKLQlwcmVzY2FsZSA9IHByaXYtPmJ1c19mcmVxX21oeiAqIDQ7CisJaW50X2N0cmwgPSAgcmVhZGwoJmNwc3ctPndyX3JlZ3MtPmludF9jb250cm9sKTsKKwlwcmVzY2FsZSA9IGNwc3ctPmJ1c19mcmVxX21oeiAqIDQ7CiAKIAlpZiAoIWNvYWwtPnJ4X2NvYWxlc2NlX3VzZWNzKSB7CiAJCWludF9jdHJsICY9IH4oQ1BTV19JTlRQUkVTQ0FMRV9NQVNLIHwgQ1BTV19JTlRQQUNFRU4pOwpAQCAtOTYyLDUzICs5OTQsNjkgQEAKIAl9CiAKIAludW1faW50ZXJydXB0cyA9ICgxMDAwICogYWRkbmxfZHZkcikgLyBjb2FsX2ludHZsOwotCXdyaXRlbChudW1faW50ZXJydXB0cywgJnByaXYtPndyX3JlZ3MtPnJ4X2ltYXgpOwotCXdyaXRlbChudW1faW50ZXJydXB0cywgJnByaXYtPndyX3JlZ3MtPnR4X2ltYXgpOworCXdyaXRlbChudW1faW50ZXJydXB0cywgJmNwc3ctPndyX3JlZ3MtPnJ4X2ltYXgpOworCXdyaXRlbChudW1faW50ZXJydXB0cywgJmNwc3ctPndyX3JlZ3MtPnR4X2ltYXgpOwogCiAJaW50X2N0cmwgfD0gQ1BTV19JTlRQQUNFRU47CiAJaW50X2N0cmwgJj0gKH5DUFNXX0lOVFBSRVNDQUxFX01BU0spOwogCWludF9jdHJsIHw9IChwcmVzY2FsZSAmIENQU1dfSU5UUFJFU0NBTEVfTUFTSyk7CiAKIHVwZGF0ZV9yZXR1cm46Ci0Jd3JpdGVsKGludF9jdHJsLCAmcHJpdi0+d3JfcmVncy0+aW50X2NvbnRyb2wpOworCXdyaXRlbChpbnRfY3RybCwgJmNwc3ctPndyX3JlZ3MtPmludF9jb250cm9sKTsKIAogCWNwc3dfbm90aWNlKHByaXYsIHRpbWVyLCAiU2V0IGNvYWxlc2NlIHRvICVkIHVzZWNzLlxuIiwgY29hbF9pbnR2bCk7Ci0JaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKSB7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBwcml2LT5kYXRhLnNsYXZlczsgaSsrKSB7Ci0JCQlwcml2ID0gbmV0ZGV2X3ByaXYocHJpdi0+c2xhdmVzW2ldLm5kZXYpOwotCQkJcHJpdi0+Y29hbF9pbnR2bCA9IGNvYWxfaW50dmw7Ci0JCX0KLQl9IGVsc2UgewotCQlwcml2LT5jb2FsX2ludHZsID0gY29hbF9pbnR2bDsKLQl9CisJY3Bzdy0+Y29hbF9pbnR2bCA9IGNvYWxfaW50dmw7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBjcHN3X2dldF9zc2V0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBpbnQgc3NldCkKIHsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBuZGV2X3RvX2Nwc3cobmRldik7CisKIAlzd2l0Y2ggKHNzZXQpIHsKIAljYXNlIEVUSF9TU19TVEFUUzoKLQkJcmV0dXJuIENQU1dfU1RBVFNfTEVOOworCQlyZXR1cm4gKENQU1dfU1RBVFNfQ09NTU9OX0xFTiArCisJCSAgICAgICAoY3Bzdy0+cnhfY2hfbnVtICsgY3Bzdy0+dHhfY2hfbnVtKSAqCisJCSAgICAgICBDUFNXX1NUQVRTX0NIX0xFTik7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIH0KIAorc3RhdGljIHZvaWQgY3Bzd19hZGRfY2hfc3RyaW5ncyh1OCAqKnAsIGludCBjaF9udW0sIGludCByeF9kaXIpCit7CisJaW50IGNoX3N0YXRzX2xlbjsKKwlpbnQgbGluZTsKKwlpbnQgaTsKKworCWNoX3N0YXRzX2xlbiA9IENQU1dfU1RBVFNfQ0hfTEVOICogY2hfbnVtOworCWZvciAoaSA9IDA7IGkgPCBjaF9zdGF0c19sZW47IGkrKykgeworCQlsaW5lID0gaSAlIENQU1dfU1RBVFNfQ0hfTEVOOworCQlzbnByaW50ZigqcCwgRVRIX0dTVFJJTkdfTEVOLAorCQkJICIlcyBETUEgY2hhbiAlZDogJXMiLCByeF9kaXIgPyAiUngiIDogIlR4IiwKKwkJCSBpIC8gQ1BTV19TVEFUU19DSF9MRU4sCisJCQkgY3Bzd19nc3RyaW5nc19jaF9zdGF0c1tsaW5lXS5zdGF0X3N0cmluZyk7CisJCSpwICs9IEVUSF9HU1RSSU5HX0xFTjsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGNwc3dfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQogeworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKIAl1OCAqcCA9IGRhdGE7CiAJaW50IGk7CiAKIAlzd2l0Y2ggKHN0cmluZ3NldCkgewogCWNhc2UgRVRIX1NTX1NUQVRTOgotCQlmb3IgKGkgPSAwOyBpIDwgQ1BTV19TVEFUU19MRU47IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgQ1BTV19TVEFUU19DT01NT05fTEVOOyBpKyspIHsKIAkJCW1lbWNweShwLCBjcHN3X2dzdHJpbmdzX3N0YXRzW2ldLnN0YXRfc3RyaW5nLAogCQkJICAgICAgIEVUSF9HU1RSSU5HX0xFTik7CiAJCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKIAkJfQorCisJCWNwc3dfYWRkX2NoX3N0cmluZ3MoJnAsIGNwc3ctPnJ4X2NoX251bSwgMSk7CisJCWNwc3dfYWRkX2NoX3N0cmluZ3MoJnAsIGNwc3ctPnR4X2NoX251bSwgMCk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTEwMTYsODYgKzEwNjQsNzggQEAKIHN0YXRpYyB2b2lkIGNwc3dfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCiAJCQkJICAgIHN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywgdTY0ICpkYXRhKQogewotCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3QgY3BkbWFfY2hhbl9zdGF0cyByeF9zdGF0czsKLQlzdHJ1Y3QgY3BkbWFfY2hhbl9zdGF0cyB0eF9zdGF0czsKLQl1MzIgdmFsOwogCXU4ICpwOwotCWludCBpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKKwlzdHJ1Y3QgY3BkbWFfY2hhbl9zdGF0cyBjaF9zdGF0czsKKwlpbnQgaSwgbCwgY2g7CiAKIAkvKiBDb2xsZWN0IERhdmluY2kgQ1BETUEgc3RhdHMgZm9yIFJ4IGFuZCBUeCBDaGFubmVsICovCi0JY3BkbWFfY2hhbl9nZXRfc3RhdHMocHJpdi0+cnhjaCwgJnJ4X3N0YXRzKTsKLQljcGRtYV9jaGFuX2dldF9zdGF0cyhwcml2LT50eGNoLCAmdHhfc3RhdHMpOworCWZvciAobCA9IDA7IGwgPCBDUFNXX1NUQVRTX0NPTU1PTl9MRU47IGwrKykKKwkJZGF0YVtsXSA9IHJlYWRsKGNwc3ctPmh3X3N0YXRzICsKKwkJCQljcHN3X2dzdHJpbmdzX3N0YXRzW2xdLnN0YXRfb2Zmc2V0KTsKIAotCWZvciAoaSA9IDA7IGkgPCBDUFNXX1NUQVRTX0xFTjsgaSsrKSB7Ci0JCXN3aXRjaCAoY3Bzd19nc3RyaW5nc19zdGF0c1tpXS50eXBlKSB7Ci0JCWNhc2UgQ1BTV19TVEFUUzoKLQkJCXZhbCA9IHJlYWRsKHByaXYtPmh3X3N0YXRzICsKLQkJCQkgICAgY3Bzd19nc3RyaW5nc19zdGF0c1tpXS5zdGF0X29mZnNldCk7Ci0JCQlkYXRhW2ldID0gdmFsOwotCQkJYnJlYWs7CisJZm9yIChjaCA9IDA7IGNoIDwgY3Bzdy0+cnhfY2hfbnVtOyBjaCsrKSB7CisJCWNwZG1hX2NoYW5fZ2V0X3N0YXRzKGNwc3ctPnJ4Y2hbY2hdLCAmY2hfc3RhdHMpOworCQlmb3IgKGkgPSAwOyBpIDwgQ1BTV19TVEFUU19DSF9MRU47IGkrKywgbCsrKSB7CisJCQlwID0gKHU4ICopJmNoX3N0YXRzICsKKwkJCQljcHN3X2dzdHJpbmdzX2NoX3N0YXRzW2ldLnN0YXRfb2Zmc2V0OworCQkJZGF0YVtsXSA9ICoodTMyICopcDsKKwkJfQorCX0KIAotCQljYXNlIENQRE1BX1JYX1NUQVRTOgotCQkJcCA9ICh1OCAqKSZyeF9zdGF0cyArCi0JCQkJY3Bzd19nc3RyaW5nc19zdGF0c1tpXS5zdGF0X29mZnNldDsKLQkJCWRhdGFbaV0gPSAqKHUzMiAqKXA7Ci0JCQlicmVhazsKLQotCQljYXNlIENQRE1BX1RYX1NUQVRTOgotCQkJcCA9ICh1OCAqKSZ0eF9zdGF0cyArCi0JCQkJY3Bzd19nc3RyaW5nc19zdGF0c1tpXS5zdGF0X29mZnNldDsKLQkJCWRhdGFbaV0gPSAqKHUzMiAqKXA7Ci0JCQlicmVhazsKKwlmb3IgKGNoID0gMDsgY2ggPCBjcHN3LT50eF9jaF9udW07IGNoKyspIHsKKwkJY3BkbWFfY2hhbl9nZXRfc3RhdHMoY3Bzdy0+dHhjaFtjaF0sICZjaF9zdGF0cyk7CisJCWZvciAoaSA9IDA7IGkgPCBDUFNXX1NUQVRTX0NIX0xFTjsgaSsrLCBsKyspIHsKKwkJCXAgPSAodTggKikmY2hfc3RhdHMgKworCQkJCWNwc3dfZ3N0cmluZ3NfY2hfc3RhdHNbaV0uc3RhdF9vZmZzZXQ7CisJCQlkYXRhW2xdID0gKih1MzIgKilwOwogCQl9CiAJfQogfQogCi1zdGF0aWMgaW50IGNwc3dfY29tbW9uX3Jlc191c2FnZV9zdGF0ZShzdHJ1Y3QgY3Bzd19wcml2ICpwcml2KQorc3RhdGljIGludCBjcHN3X2NvbW1vbl9yZXNfdXNhZ2Vfc3RhdGUoc3RydWN0IGNwc3dfY29tbW9uICpjcHN3KQogewogCXUzMiBpOwogCXUzMiB1c2FnZV9jb3VudCA9IDA7CiAKLQlpZiAoIXByaXYtPmRhdGEuZHVhbF9lbWFjKQorCWlmICghY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpCiAJCXJldHVybiAwOwogCi0JZm9yIChpID0gMDsgaSA8IHByaXYtPmRhdGEuc2xhdmVzOyBpKyspCi0JCWlmIChwcml2LT5zbGF2ZXNbaV0ub3Blbl9zdGF0KQorCWZvciAoaSA9IDA7IGkgPCBjcHN3LT5kYXRhLnNsYXZlczsgaSsrKQorCQlpZiAoY3Bzdy0+c2xhdmVzW2ldLm9wZW5fc3RhdCkKIAkJCXVzYWdlX2NvdW50Kys7CiAKIAlyZXR1cm4gdXNhZ2VfY291bnQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNwc3dfdHhfcGFja2V0X3N1Ym1pdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW5saW5lIGludCBjcHN3X3R4X3BhY2tldF9zdWJtaXQoc3RydWN0IGNwc3dfcHJpdiAqcHJpdiwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJc3RydWN0IGNwZG1hX2NoYW4gKnR4Y2gpCiB7Ci0JaWYgKCFwcml2LT5kYXRhLmR1YWxfZW1hYykKLQkJcmV0dXJuIGNwZG1hX2NoYW5fc3VibWl0KHByaXYtPnR4Y2gsIHNrYiwgc2tiLT5kYXRhLAotCQkJCSAgc2tiLT5sZW4sIDApOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CiAKLQlpZiAobmRldiA9PSBjcHN3X2dldF9zbGF2ZV9uZGV2KHByaXYsIDApKQotCQlyZXR1cm4gY3BkbWFfY2hhbl9zdWJtaXQocHJpdi0+dHhjaCwgc2tiLCBza2ItPmRhdGEsCi0JCQkJICBza2ItPmxlbiwgMSk7Ci0JZWxzZQotCQlyZXR1cm4gY3BkbWFfY2hhbl9zdWJtaXQocHJpdi0+dHhjaCwgc2tiLCBza2ItPmRhdGEsCi0JCQkJICBza2ItPmxlbiwgMik7CisJcmV0dXJuIGNwZG1hX2NoYW5fc3VibWl0KHR4Y2gsIHNrYiwgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwkJCQkgcHJpdi0+ZW1hY19wb3J0ICsgY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY3Bzd19hZGRfZHVhbF9lbWFjX2RlZl9hbGVfZW50cmllcygKIAkJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiwgc3RydWN0IGNwc3dfc2xhdmUgKnNsYXZlLAogCQl1MzIgc2xhdmVfcG9ydCkKIHsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OwogCXUzMiBwb3J0X21hc2sgPSAxIDw8IHNsYXZlX3BvcnQgfCBBTEVfUE9SVF9IT1NUOwogCi0JaWYgKHByaXYtPnZlcnNpb24gPT0gQ1BTV19WRVJTSU9OXzEpCisJaWYgKGNwc3ctPnZlcnNpb24gPT0gQ1BTV19WRVJTSU9OXzEpCiAJCXNsYXZlX3dyaXRlKHNsYXZlLCBzbGF2ZS0+cG9ydF92bGFuLCBDUFNXMV9QT1JUX1ZMQU4pOwogCWVsc2UKIAkJc2xhdmVfd3JpdGUoc2xhdmUsIHNsYXZlLT5wb3J0X3ZsYW4sIENQU1cyX1BPUlRfVkxBTik7Ci0JY3Bzd19hbGVfYWRkX3ZsYW4ocHJpdi0+YWxlLCBzbGF2ZS0+cG9ydF92bGFuLCBwb3J0X21hc2ssCisJY3Bzd19hbGVfYWRkX3ZsYW4oY3Bzdy0+YWxlLCBzbGF2ZS0+cG9ydF92bGFuLCBwb3J0X21hc2ssCiAJCQkgIHBvcnRfbWFzaywgcG9ydF9tYXNrLCAwKTsKLQljcHN3X2FsZV9hZGRfbWNhc3QocHJpdi0+YWxlLCBwcml2LT5uZGV2LT5icm9hZGNhc3QsCisJY3Bzd19hbGVfYWRkX21jYXN0KGNwc3ctPmFsZSwgcHJpdi0+bmRldi0+YnJvYWRjYXN0LAogCQkJICAgcG9ydF9tYXNrLCBBTEVfVkxBTiwgc2xhdmUtPnBvcnRfdmxhbiwgMCk7Ci0JY3Bzd19hbGVfYWRkX3VjYXN0KHByaXYtPmFsZSwgcHJpdi0+bWFjX2FkZHIsCi0JCUhPU1RfUE9SVF9OVU0sIEFMRV9WTEFOIHwgQUxFX1NFQ1VSRSwgc2xhdmUtPnBvcnRfdmxhbik7CisJY3Bzd19hbGVfYWRkX3VjYXN0KGNwc3ctPmFsZSwgcHJpdi0+bWFjX2FkZHIsCisJCQkgICBIT1NUX1BPUlRfTlVNLCBBTEVfVkxBTiB8CisJCQkgICBBTEVfU0VDVVJFLCBzbGF2ZS0+cG9ydF92bGFuKTsKIH0KIAogc3RhdGljIHZvaWQgc29mdF9yZXNldF9zbGF2ZShzdHJ1Y3QgY3Bzd19zbGF2ZSAqc2xhdmUpCkBAIC0xMTA5LDEzICsxMTQ5LDE0IEBACiBzdGF0aWMgdm9pZCBjcHN3X3NsYXZlX29wZW4oc3RydWN0IGNwc3dfc2xhdmUgKnNsYXZlLCBzdHJ1Y3QgY3Bzd19wcml2ICpwcml2KQogewogCXUzMiBzbGF2ZV9wb3J0OworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CiAKIAlzb2Z0X3Jlc2V0X3NsYXZlKHNsYXZlKTsKIAogCS8qIHNldHVwIHByaW9yaXR5IG1hcHBpbmcgKi8KIAlfX3Jhd193cml0ZWwoUlhfUFJJT1JJVFlfTUFQUElORywgJnNsYXZlLT5zbGl2ZXItPnJ4X3ByaV9tYXApOwogCi0Jc3dpdGNoIChwcml2LT52ZXJzaW9uKSB7CisJc3dpdGNoIChjcHN3LT52ZXJzaW9uKSB7CiAJY2FzZSBDUFNXX1ZFUlNJT05fMToKIAkJc2xhdmVfd3JpdGUoc2xhdmUsIFRYX1BSSU9SSVRZX01BUFBJTkcsIENQU1cxX1RYX1BSSV9NQVApOwogCQlicmVhazsKQEAgLTExMjcsMTcgKzExNjgsMTcgQEAKIAl9CiAKIAkvKiBzZXR1cCBtYXggcGFja2V0IHNpemUsIGFuZCBtYWMgYWRkcmVzcyAqLwotCV9fcmF3X3dyaXRlbChwcml2LT5yeF9wYWNrZXRfbWF4LCAmc2xhdmUtPnNsaXZlci0+cnhfbWF4bGVuKTsKKwlfX3Jhd193cml0ZWwoY3Bzdy0+cnhfcGFja2V0X21heCwgJnNsYXZlLT5zbGl2ZXItPnJ4X21heGxlbik7CiAJY3Bzd19zZXRfc2xhdmVfbWFjKHNsYXZlLCBwcml2KTsKIAogCXNsYXZlLT5tYWNfY29udHJvbCA9IDA7CS8qIG5vIGxpbmsgeWV0ICovCiAKLQlzbGF2ZV9wb3J0ID0gY3Bzd19nZXRfc2xhdmVfcG9ydChwcml2LCBzbGF2ZS0+c2xhdmVfbnVtKTsKKwlzbGF2ZV9wb3J0ID0gY3Bzd19nZXRfc2xhdmVfcG9ydChzbGF2ZS0+c2xhdmVfbnVtKTsKIAotCWlmIChwcml2LT5kYXRhLmR1YWxfZW1hYykKKwlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpCiAJCWNwc3dfYWRkX2R1YWxfZW1hY19kZWZfYWxlX2VudHJpZXMocHJpdiwgc2xhdmUsIHNsYXZlX3BvcnQpOwogCWVsc2UKLQkJY3Bzd19hbGVfYWRkX21jYXN0KHByaXYtPmFsZSwgcHJpdi0+bmRldi0+YnJvYWRjYXN0LAorCQljcHN3X2FsZV9hZGRfbWNhc3QoY3Bzdy0+YWxlLCBwcml2LT5uZGV2LT5icm9hZGNhc3QsCiAJCQkJICAgMSA8PCBzbGF2ZV9wb3J0LCAwLCAwLCBBTEVfTUNBU1RfRldEXzIpOwogCiAJaWYgKHNsYXZlLT5kYXRhLT5waHlfbm9kZSkgewpAQCAtMTE2Nyw4MSArMTIwOCwxMjEgQEAKIAlwaHlfc3RhcnQoc2xhdmUtPnBoeSk7CiAKIAkvKiBDb25maWd1cmUgR01JSV9TRUwgcmVnaXN0ZXIgKi8KLQljcHN3X3BoeV9zZWwoJnByaXYtPnBkZXYtPmRldiwgc2xhdmUtPnBoeS0+aW50ZXJmYWNlLCBzbGF2ZS0+c2xhdmVfbnVtKTsKKwljcHN3X3BoeV9zZWwoY3Bzdy0+ZGV2LCBzbGF2ZS0+cGh5LT5pbnRlcmZhY2UsIHNsYXZlLT5zbGF2ZV9udW0pOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY3Bzd19hZGRfZGVmYXVsdF92bGFuKHN0cnVjdCBjcHN3X3ByaXYgKnByaXYpCiB7Ci0JY29uc3QgaW50IHZsYW4gPSBwcml2LT5kYXRhLmRlZmF1bHRfdmxhbjsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OworCWNvbnN0IGludCB2bGFuID0gY3Bzdy0+ZGF0YS5kZWZhdWx0X3ZsYW47CiAJdTMyIHJlZzsKIAlpbnQgaTsKIAlpbnQgdW5yZWdfbWNhc3RfbWFzazsKIAotCXJlZyA9IChwcml2LT52ZXJzaW9uID09IENQU1dfVkVSU0lPTl8xKSA/IENQU1cxX1BPUlRfVkxBTiA6CisJcmVnID0gKGNwc3ctPnZlcnNpb24gPT0gQ1BTV19WRVJTSU9OXzEpID8gQ1BTVzFfUE9SVF9WTEFOIDoKIAkgICAgICAgQ1BTVzJfUE9SVF9WTEFOOwogCi0Jd3JpdGVsKHZsYW4sICZwcml2LT5ob3N0X3BvcnRfcmVncy0+cG9ydF92bGFuKTsKKwl3cml0ZWwodmxhbiwgJmNwc3ctPmhvc3RfcG9ydF9yZWdzLT5wb3J0X3ZsYW4pOwogCi0JZm9yIChpID0gMDsgaSA8IHByaXYtPmRhdGEuc2xhdmVzOyBpKyspCi0JCXNsYXZlX3dyaXRlKHByaXYtPnNsYXZlcyArIGksIHZsYW4sIHJlZyk7CisJZm9yIChpID0gMDsgaSA8IGNwc3ctPmRhdGEuc2xhdmVzOyBpKyspCisJCXNsYXZlX3dyaXRlKGNwc3ctPnNsYXZlcyArIGksIHZsYW4sIHJlZyk7CiAKIAlpZiAocHJpdi0+bmRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCiAJCXVucmVnX21jYXN0X21hc2sgPSBBTEVfQUxMX1BPUlRTOwogCWVsc2UKIAkJdW5yZWdfbWNhc3RfbWFzayA9IEFMRV9QT1JUXzEgfCBBTEVfUE9SVF8yOwogCi0JY3Bzd19hbGVfYWRkX3ZsYW4ocHJpdi0+YWxlLCB2bGFuLCBBTEVfQUxMX1BPUlRTLAorCWNwc3dfYWxlX2FkZF92bGFuKGNwc3ctPmFsZSwgdmxhbiwgQUxFX0FMTF9QT1JUUywKIAkJCSAgQUxFX0FMTF9QT1JUUywgQUxFX0FMTF9QT1JUUywKIAkJCSAgdW5yZWdfbWNhc3RfbWFzayk7CiB9CiAKIHN0YXRpYyB2b2lkIGNwc3dfaW5pdF9ob3N0X3BvcnQoc3RydWN0IGNwc3dfcHJpdiAqcHJpdikKIHsKLQl1MzIgY29udHJvbF9yZWc7CiAJdTMyIGZpZm9fbW9kZTsKKwl1MzIgY29udHJvbF9yZWc7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKIAogCS8qIHNvZnQgcmVzZXQgdGhlIGNvbnRyb2xsZXIgYW5kIGluaXRpYWxpemUgYWxlICovCi0Jc29mdF9yZXNldCgiY3BzdyIsICZwcml2LT5yZWdzLT5zb2Z0X3Jlc2V0KTsKLQljcHN3X2FsZV9zdGFydChwcml2LT5hbGUpOworCXNvZnRfcmVzZXQoImNwc3ciLCAmY3Bzdy0+cmVncy0+c29mdF9yZXNldCk7CisJY3Bzd19hbGVfc3RhcnQoY3Bzdy0+YWxlKTsKIAogCS8qIHN3aXRjaCB0byB2bGFuIHVuYXdhcmUgbW9kZSAqLwotCWNwc3dfYWxlX2NvbnRyb2xfc2V0KHByaXYtPmFsZSwgSE9TVF9QT1JUX05VTSwgQUxFX1ZMQU5fQVdBUkUsCisJY3Bzd19hbGVfY29udHJvbF9zZXQoY3Bzdy0+YWxlLCBIT1NUX1BPUlRfTlVNLCBBTEVfVkxBTl9BV0FSRSwKIAkJCSAgICAgQ1BTV19BTEVfVkxBTl9BV0FSRSk7Ci0JY29udHJvbF9yZWcgPSByZWFkbCgmcHJpdi0+cmVncy0+Y29udHJvbCk7CisJY29udHJvbF9yZWcgPSByZWFkbCgmY3Bzdy0+cmVncy0+Y29udHJvbCk7CiAJY29udHJvbF9yZWcgfD0gQ1BTV19WTEFOX0FXQVJFOwotCXdyaXRlbChjb250cm9sX3JlZywgJnByaXYtPnJlZ3MtPmNvbnRyb2wpOwotCWZpZm9fbW9kZSA9IChwcml2LT5kYXRhLmR1YWxfZW1hYykgPyBDUFNXX0ZJRk9fRFVBTF9NQUNfTU9ERSA6CisJd3JpdGVsKGNvbnRyb2xfcmVnLCAmY3Bzdy0+cmVncy0+Y29udHJvbCk7CisJZmlmb19tb2RlID0gKGNwc3ctPmRhdGEuZHVhbF9lbWFjKSA/IENQU1dfRklGT19EVUFMX01BQ19NT0RFIDoKIAkJICAgICBDUFNXX0ZJRk9fTk9STUFMX01PREU7Ci0Jd3JpdGVsKGZpZm9fbW9kZSwgJnByaXYtPmhvc3RfcG9ydF9yZWdzLT50eF9pbl9jdGwpOworCXdyaXRlbChmaWZvX21vZGUsICZjcHN3LT5ob3N0X3BvcnRfcmVncy0+dHhfaW5fY3RsKTsKIAogCS8qIHNldHVwIGhvc3QgcG9ydCBwcmlvcml0eSBtYXBwaW5nICovCiAJX19yYXdfd3JpdGVsKENQRE1BX1RYX1BSSU9SSVRZX01BUCwKLQkJICAgICAmcHJpdi0+aG9zdF9wb3J0X3JlZ3MtPmNwZG1hX3R4X3ByaV9tYXApOwotCV9fcmF3X3dyaXRlbCgwLCAmcHJpdi0+aG9zdF9wb3J0X3JlZ3MtPmNwZG1hX3J4X2NoYW5fbWFwKTsKKwkJICAgICAmY3Bzdy0+aG9zdF9wb3J0X3JlZ3MtPmNwZG1hX3R4X3ByaV9tYXApOworCV9fcmF3X3dyaXRlbCgwLCAmY3Bzdy0+aG9zdF9wb3J0X3JlZ3MtPmNwZG1hX3J4X2NoYW5fbWFwKTsKIAotCWNwc3dfYWxlX2NvbnRyb2xfc2V0KHByaXYtPmFsZSwgSE9TVF9QT1JUX05VTSwKKwljcHN3X2FsZV9jb250cm9sX3NldChjcHN3LT5hbGUsIEhPU1RfUE9SVF9OVU0sCiAJCQkgICAgIEFMRV9QT1JUX1NUQVRFLCBBTEVfUE9SVF9TVEFURV9GT1JXQVJEKTsKIAotCWlmICghcHJpdi0+ZGF0YS5kdWFsX2VtYWMpIHsKLQkJY3Bzd19hbGVfYWRkX3VjYXN0KHByaXYtPmFsZSwgcHJpdi0+bWFjX2FkZHIsIEhPU1RfUE9SVF9OVU0sCisJaWYgKCFjcHN3LT5kYXRhLmR1YWxfZW1hYykgeworCQljcHN3X2FsZV9hZGRfdWNhc3QoY3Bzdy0+YWxlLCBwcml2LT5tYWNfYWRkciwgSE9TVF9QT1JUX05VTSwKIAkJCQkgICAwLCAwKTsKLQkJY3Bzd19hbGVfYWRkX21jYXN0KHByaXYtPmFsZSwgcHJpdi0+bmRldi0+YnJvYWRjYXN0LAorCQljcHN3X2FsZV9hZGRfbWNhc3QoY3Bzdy0+YWxlLCBwcml2LT5uZGV2LT5icm9hZGNhc3QsCiAJCQkJICAgQUxFX1BPUlRfSE9TVCwgMCwgMCwgQUxFX01DQVNUX0ZXRF8yKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGNwc3dfc2xhdmVfc3RvcChzdHJ1Y3QgY3Bzd19zbGF2ZSAqc2xhdmUsIHN0cnVjdCBjcHN3X3ByaXYgKnByaXYpCitzdGF0aWMgaW50IGNwc3dfZmlsbF9yeF9jaGFubmVscyhzdHJ1Y3QgY3Bzd19wcml2ICpwcml2KQoreworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgY2hfYnVmX251bTsKKwlpbnQgY2gsIGksIHJldDsKKworCWZvciAoY2ggPSAwOyBjaCA8IGNwc3ctPnJ4X2NoX251bTsgY2grKykgeworCQljaF9idWZfbnVtID0gY3BkbWFfY2hhbl9nZXRfcnhfYnVmX251bShjcHN3LT5yeGNoW2NoXSk7CisJCWZvciAoaSA9IDA7IGkgPCBjaF9idWZfbnVtOyBpKyspIHsKKwkJCXNrYiA9IF9fbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbihwcml2LT5uZGV2LAorCQkJCQkJCSAgY3Bzdy0+cnhfcGFja2V0X21heCwKKwkJCQkJCQkgIEdGUF9LRVJORUwpOworCQkJaWYgKCFza2IpIHsKKwkJCQljcHN3X2Vycihwcml2LCBpZnVwLCAiY2Fubm90IGFsbG9jYXRlIHNrYlxuIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisKKwkJCXNrYl9zZXRfcXVldWVfbWFwcGluZyhza2IsIGNoKTsKKwkJCXJldCA9IGNwZG1hX2NoYW5fc3VibWl0KGNwc3ctPnJ4Y2hbY2hdLCBza2IsIHNrYi0+ZGF0YSwKKwkJCQkJCXNrYl90YWlscm9vbShza2IpLCAwKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJY3Bzd19lcnIocHJpdiwgaWZ1cCwKKwkJCQkJICJjYW5ub3Qgc3VibWl0IHNrYiB0byBjaGFubmVsICVkIHJ4LCBlcnJvciAlZFxuIiwKKwkJCQkJIGNoLCByZXQpOworCQkJCWtmcmVlX3NrYihza2IpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlrbWVtbGVha19ub3RfbGVhayhza2IpOworCQl9CisKKwkJY3Bzd19pbmZvKHByaXYsIGlmdXAsICJjaCAlZCByeCwgc3VibWl0dGVkICVkIGRlc2NyaXB0b3JzXG4iLAorCQkJICBjaCwgY2hfYnVmX251bSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNwc3dfc2xhdmVfc3RvcChzdHJ1Y3QgY3Bzd19zbGF2ZSAqc2xhdmUsIHN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdykKIHsKIAl1MzIgc2xhdmVfcG9ydDsKIAotCXNsYXZlX3BvcnQgPSBjcHN3X2dldF9zbGF2ZV9wb3J0KHByaXYsIHNsYXZlLT5zbGF2ZV9udW0pOworCXNsYXZlX3BvcnQgPSBjcHN3X2dldF9zbGF2ZV9wb3J0KHNsYXZlLT5zbGF2ZV9udW0pOwogCiAJaWYgKCFzbGF2ZS0+cGh5KQogCQlyZXR1cm47CiAJcGh5X3N0b3Aoc2xhdmUtPnBoeSk7CiAJcGh5X2Rpc2Nvbm5lY3Qoc2xhdmUtPnBoeSk7CiAJc2xhdmUtPnBoeSA9IE5VTEw7Ci0JY3Bzd19hbGVfY29udHJvbF9zZXQocHJpdi0+YWxlLCBzbGF2ZV9wb3J0LAorCWNwc3dfYWxlX2NvbnRyb2xfc2V0KGNwc3ctPmFsZSwgc2xhdmVfcG9ydCwKIAkJCSAgICAgQUxFX1BPUlRfU1RBVEUsIEFMRV9QT1JUX1NUQVRFX0RJU0FCTEUpOwogCXNvZnRfcmVzZXRfc2xhdmUoc2xhdmUpOwogfQpAQCAtMTI0OSwxMTQgKzEzMzAsMTExIEBACiBzdGF0aWMgaW50IGNwc3dfbmRvX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotCWludCBpLCByZXQ7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKKwlpbnQgcmV0OwogCXUzMiByZWc7CiAKLQlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKCZwcml2LT5wZGV2LT5kZXYpOworCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoY3Bzdy0+ZGV2KTsKIAlpZiAocmV0IDwgMCkgewotCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJnByaXYtPnBkZXYtPmRldik7CisJCXBtX3J1bnRpbWVfcHV0X25vaWRsZShjcHN3LT5kZXYpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmICghY3Bzd19jb21tb25fcmVzX3VzYWdlX3N0YXRlKHByaXYpKQotCQljcHN3X2ludHJfZGlzYWJsZShwcml2KTsKKwlpZiAoIWNwc3dfY29tbW9uX3Jlc191c2FnZV9zdGF0ZShjcHN3KSkKKwkJY3Bzd19pbnRyX2Rpc2FibGUoY3Bzdyk7CiAJbmV0aWZfY2Fycmllcl9vZmYobmRldik7CiAKLQlyZWcgPSBwcml2LT52ZXJzaW9uOworCS8qIE5vdGlmeSB0aGUgc3RhY2sgb2YgdGhlIGFjdHVhbCBxdWV1ZSBjb3VudHMuICovCisJcmV0ID0gbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhuZGV2LCBjcHN3LT50eF9jaF9udW0pOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihwcml2LT5kZXYsICJjYW5ub3Qgc2V0IHJlYWwgbnVtYmVyIG9mIHR4IHF1ZXVlc1xuIik7CisJCWdvdG8gZXJyX2NsZWFudXA7CisJfQorCisJcmV0ID0gbmV0aWZfc2V0X3JlYWxfbnVtX3J4X3F1ZXVlcyhuZGV2LCBjcHN3LT5yeF9jaF9udW0pOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihwcml2LT5kZXYsICJjYW5ub3Qgc2V0IHJlYWwgbnVtYmVyIG9mIHJ4IHF1ZXVlc1xuIik7CisJCWdvdG8gZXJyX2NsZWFudXA7CisJfQorCisJcmVnID0gY3Bzdy0+dmVyc2lvbjsKIAogCWRldl9pbmZvKHByaXYtPmRldiwgImluaXRpYWxpemluZyBjcHN3IHZlcnNpb24gJWQuJWQgKCVkKVxuIiwKIAkJIENQU1dfTUFKT1JfVkVSU0lPTihyZWcpLCBDUFNXX01JTk9SX1ZFUlNJT04ocmVnKSwKIAkJIENQU1dfUlRMX1ZFUlNJT04ocmVnKSk7CiAKIAkvKiBpbml0aWFsaXplIGhvc3QgYW5kIHNsYXZlIHBvcnRzICovCi0JaWYgKCFjcHN3X2NvbW1vbl9yZXNfdXNhZ2Vfc3RhdGUocHJpdikpCisJaWYgKCFjcHN3X2NvbW1vbl9yZXNfdXNhZ2Vfc3RhdGUoY3BzdykpCiAJCWNwc3dfaW5pdF9ob3N0X3BvcnQocHJpdik7CiAJZm9yX2VhY2hfc2xhdmUocHJpdiwgY3Bzd19zbGF2ZV9vcGVuLCBwcml2KTsKIAogCS8qIEFkZCBkZWZhdWx0IFZMQU4gKi8KLQlpZiAoIXByaXYtPmRhdGEuZHVhbF9lbWFjKQorCWlmICghY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpCiAJCWNwc3dfYWRkX2RlZmF1bHRfdmxhbihwcml2KTsKIAllbHNlCi0JCWNwc3dfYWxlX2FkZF92bGFuKHByaXYtPmFsZSwgcHJpdi0+ZGF0YS5kZWZhdWx0X3ZsYW4sCisJCWNwc3dfYWxlX2FkZF92bGFuKGNwc3ctPmFsZSwgY3Bzdy0+ZGF0YS5kZWZhdWx0X3ZsYW4sCiAJCQkJICBBTEVfQUxMX1BPUlRTLCBBTEVfQUxMX1BPUlRTLCAwLCAwKTsKIAotCWlmICghY3Bzd19jb21tb25fcmVzX3VzYWdlX3N0YXRlKHByaXYpKSB7Ci0JCXN0cnVjdCBjcHN3X3ByaXYgKnByaXZfc2wwID0gY3Bzd19nZXRfc2xhdmVfcHJpdihwcml2LCAwKTsKLQkJaW50IGJ1Zl9udW07Ci0KKwlpZiAoIWNwc3dfY29tbW9uX3Jlc191c2FnZV9zdGF0ZShjcHN3KSkgewogCQkvKiBzZXR1cCB0eCBkbWEgdG8gZml4ZWQgcHJpbyBhbmQgemVybyBvZmZzZXQgKi8KLQkJY3BkbWFfY29udHJvbF9zZXQocHJpdi0+ZG1hLCBDUERNQV9UWF9QUklPX0ZJWEVELCAxKTsKLQkJY3BkbWFfY29udHJvbF9zZXQocHJpdi0+ZG1hLCBDUERNQV9SWF9CVUZGRVJfT0ZGU0VULCAwKTsKKwkJY3BkbWFfY29udHJvbF9zZXQoY3Bzdy0+ZG1hLCBDUERNQV9UWF9QUklPX0ZJWEVELCAxKTsKKwkJY3BkbWFfY29udHJvbF9zZXQoY3Bzdy0+ZG1hLCBDUERNQV9SWF9CVUZGRVJfT0ZGU0VULCAwKTsKIAogCQkvKiBkaXNhYmxlIHByaW9yaXR5IGVsZXZhdGlvbiAqLwotCQlfX3Jhd193cml0ZWwoMCwgJnByaXYtPnJlZ3MtPnB0eXBlKTsKKwkJX19yYXdfd3JpdGVsKDAsICZjcHN3LT5yZWdzLT5wdHlwZSk7CiAKIAkJLyogZW5hYmxlIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBvbmx5IG9uIGFsbCBwb3J0cyAqLwotCQlfX3Jhd193cml0ZWwoMHg3LCAmcHJpdi0+cmVncy0+c3RhdF9wb3J0X2VuKTsKKwkJX19yYXdfd3JpdGVsKDB4NywgJmNwc3ctPnJlZ3MtPnN0YXRfcG9ydF9lbik7CiAKIAkJLyogRW5hYmxlIGludGVybmFsIGZpZm8gZmxvdyBjb250cm9sICovCi0JCXdyaXRlbCgweDcsICZwcml2LT5yZWdzLT5mbG93X2NvbnRyb2wpOworCQl3cml0ZWwoMHg3LCAmY3Bzdy0+cmVncy0+Zmxvd19jb250cm9sKTsKIAotCQluYXBpX2VuYWJsZSgmcHJpdl9zbDAtPm5hcGlfcngpOwotCQluYXBpX2VuYWJsZSgmcHJpdl9zbDAtPm5hcGlfdHgpOworCQluYXBpX2VuYWJsZSgmY3Bzdy0+bmFwaV9yeCk7CisJCW5hcGlfZW5hYmxlKCZjcHN3LT5uYXBpX3R4KTsKIAotCQlpZiAocHJpdl9zbDAtPnR4X2lycV9kaXNhYmxlZCkgewotCQkJcHJpdl9zbDAtPnR4X2lycV9kaXNhYmxlZCA9IGZhbHNlOwotCQkJZW5hYmxlX2lycShwcml2LT5pcnFzX3RhYmxlWzFdKTsKKwkJaWYgKGNwc3ctPnR4X2lycV9kaXNhYmxlZCkgeworCQkJY3Bzdy0+dHhfaXJxX2Rpc2FibGVkID0gZmFsc2U7CisJCQllbmFibGVfaXJxKGNwc3ctPmlycXNfdGFibGVbMV0pOwogCQl9CiAKLQkJaWYgKHByaXZfc2wwLT5yeF9pcnFfZGlzYWJsZWQpIHsKLQkJCXByaXZfc2wwLT5yeF9pcnFfZGlzYWJsZWQgPSBmYWxzZTsKLQkJCWVuYWJsZV9pcnEocHJpdi0+aXJxc190YWJsZVswXSk7CisJCWlmIChjcHN3LT5yeF9pcnFfZGlzYWJsZWQpIHsKKwkJCWNwc3ctPnJ4X2lycV9kaXNhYmxlZCA9IGZhbHNlOworCQkJZW5hYmxlX2lycShjcHN3LT5pcnFzX3RhYmxlWzBdKTsKIAkJfQogCi0JCWJ1Zl9udW0gPSBjcGRtYV9jaGFuX2dldF9yeF9idWZfbnVtKHByaXYtPmRtYSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBidWZfbnVtOyBpKyspIHsKLQkJCXN0cnVjdCBza19idWZmICpza2I7CisJCXJldCA9IGNwc3dfZmlsbF9yeF9jaGFubmVscyhwcml2KTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycl9jbGVhbnVwOwogCi0JCQlyZXQgPSAtRU5PTUVNOwotCQkJc2tiID0gX19uZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKHByaXYtPm5kZXYsCi0JCQkJCXByaXYtPnJ4X3BhY2tldF9tYXgsIEdGUF9LRVJORUwpOwotCQkJaWYgKCFza2IpCi0JCQkJZ290byBlcnJfY2xlYW51cDsKLQkJCXJldCA9IGNwZG1hX2NoYW5fc3VibWl0KHByaXYtPnJ4Y2gsIHNrYiwgc2tiLT5kYXRhLAotCQkJCQlza2JfdGFpbHJvb20oc2tiKSwgMCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCWtmcmVlX3NrYihza2IpOwotCQkJCWdvdG8gZXJyX2NsZWFudXA7Ci0JCQl9Ci0JCX0KLQkJLyogY29udGludWUgZXZlbiBpZiB3ZSBkaWRuJ3QgbWFuYWdlIHRvIHN1Ym1pdCBhbGwKLQkJICogcmVjZWl2ZSBkZXNjcwotCQkgKi8KLQkJY3Bzd19pbmZvKHByaXYsIGlmdXAsICJzdWJtaXR0ZWQgJWQgcnggZGVzY3JpcHRvcnNcbiIsIGkpOwotCi0JCWlmIChjcHRzX3JlZ2lzdGVyKCZwcml2LT5wZGV2LT5kZXYsIHByaXYtPmNwdHMsCi0JCQkJICBwcml2LT5kYXRhLmNwdHNfY2xvY2tfbXVsdCwKLQkJCQkgIHByaXYtPmRhdGEuY3B0c19jbG9ja19zaGlmdCkpCisJCWlmIChjcHRzX3JlZ2lzdGVyKGNwc3ctPmRldiwgY3Bzdy0+Y3B0cywKKwkJCQkgIGNwc3ctPmRhdGEuY3B0c19jbG9ja19tdWx0LAorCQkJCSAgY3Bzdy0+ZGF0YS5jcHRzX2Nsb2NrX3NoaWZ0KSkKIAkJCWRldl9lcnIocHJpdi0+ZGV2LCAiZXJyb3IgcmVnaXN0ZXJpbmcgY3B0cyBkZXZpY2VcbiIpOwogCiAJfQogCiAJLyogRW5hYmxlIEludGVycnVwdCBwYWNpbmcgaWYgY29uZmlndXJlZCAqLwotCWlmIChwcml2LT5jb2FsX2ludHZsICE9IDApIHsKKwlpZiAoY3Bzdy0+Y29hbF9pbnR2bCAhPSAwKSB7CiAJCXN0cnVjdCBldGh0b29sX2NvYWxlc2NlIGNvYWw7CiAKLQkJY29hbC5yeF9jb2FsZXNjZV91c2VjcyA9IHByaXYtPmNvYWxfaW50dmw7CisJCWNvYWwucnhfY29hbGVzY2VfdXNlY3MgPSBjcHN3LT5jb2FsX2ludHZsOwogCQljcHN3X3NldF9jb2FsZXNjZShuZGV2LCAmY29hbCk7CiAJfQogCi0JY3BkbWFfY3Rscl9zdGFydChwcml2LT5kbWEpOwotCWNwc3dfaW50cl9lbmFibGUocHJpdik7CisJY3BkbWFfY3Rscl9zdGFydChjcHN3LT5kbWEpOworCWNwc3dfaW50cl9lbmFibGUoY3Bzdyk7CiAKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpCi0JCXByaXYtPnNsYXZlc1twcml2LT5lbWFjX3BvcnRdLm9wZW5fc3RhdCA9IHRydWU7CisJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKQorCQljcHN3LT5zbGF2ZXNbcHJpdi0+ZW1hY19wb3J0XS5vcGVuX3N0YXQgPSB0cnVlOworCisJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhuZGV2KTsKKwogCXJldHVybiAwOwogCiBlcnJfY2xlYW51cDoKLQljcGRtYV9jdGxyX3N0b3AocHJpdi0+ZG1hKTsKLQlmb3JfZWFjaF9zbGF2ZShwcml2LCBjcHN3X3NsYXZlX3N0b3AsIHByaXYpOwotCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnByaXYtPnBkZXYtPmRldik7CisJY3BkbWFfY3Rscl9zdG9wKGNwc3ctPmRtYSk7CisJZm9yX2VhY2hfc2xhdmUocHJpdiwgY3Bzd19zbGF2ZV9zdG9wLCBjcHN3KTsKKwlwbV9ydW50aW1lX3B1dF9zeW5jKGNwc3ctPmRldik7CiAJbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+bmRldik7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTEzNjQsMjUgKzE0NDIsMjQgQEAKIHN0YXRpYyBpbnQgY3Bzd19uZG9fc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKIAogCWNwc3dfaW5mbyhwcml2LCBpZmRvd24sICJzaHV0dGluZyBkb3duIGNwc3cgZGV2aWNlXG4iKTsKLQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPm5kZXYpOworCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhwcml2LT5uZGV2KTsKIAluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZGV2KTsKIAotCWlmIChjcHN3X2NvbW1vbl9yZXNfdXNhZ2Vfc3RhdGUocHJpdikgPD0gMSkgewotCQlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2X3NsMCA9IGNwc3dfZ2V0X3NsYXZlX3ByaXYocHJpdiwgMCk7Ci0KLQkJbmFwaV9kaXNhYmxlKCZwcml2X3NsMC0+bmFwaV9yeCk7Ci0JCW5hcGlfZGlzYWJsZSgmcHJpdl9zbDAtPm5hcGlfdHgpOwotCQljcHRzX3VucmVnaXN0ZXIocHJpdi0+Y3B0cyk7Ci0JCWNwc3dfaW50cl9kaXNhYmxlKHByaXYpOwotCQljcGRtYV9jdGxyX3N0b3AocHJpdi0+ZG1hKTsKLQkJY3Bzd19hbGVfc3RvcChwcml2LT5hbGUpOworCWlmIChjcHN3X2NvbW1vbl9yZXNfdXNhZ2Vfc3RhdGUoY3BzdykgPD0gMSkgeworCQluYXBpX2Rpc2FibGUoJmNwc3ctPm5hcGlfcngpOworCQluYXBpX2Rpc2FibGUoJmNwc3ctPm5hcGlfdHgpOworCQljcHRzX3VucmVnaXN0ZXIoY3Bzdy0+Y3B0cyk7CisJCWNwc3dfaW50cl9kaXNhYmxlKGNwc3cpOworCQljcGRtYV9jdGxyX3N0b3AoY3Bzdy0+ZG1hKTsKKwkJY3Bzd19hbGVfc3RvcChjcHN3LT5hbGUpOwogCX0KLQlmb3JfZWFjaF9zbGF2ZShwcml2LCBjcHN3X3NsYXZlX3N0b3AsIHByaXYpOwotCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnByaXYtPnBkZXYtPmRldik7Ci0JaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKQotCQlwcml2LT5zbGF2ZXNbcHJpdi0+ZW1hY19wb3J0XS5vcGVuX3N0YXQgPSBmYWxzZTsKKwlmb3JfZWFjaF9zbGF2ZShwcml2LCBjcHN3X3NsYXZlX3N0b3AsIGNwc3cpOworCXBtX3J1bnRpbWVfcHV0X3N5bmMoY3Bzdy0+ZGV2KTsKKwlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpCisJCWNwc3ctPnNsYXZlc1twcml2LT5lbWFjX3BvcnRdLm9wZW5fc3RhdCA9IGZhbHNlOwogCXJldHVybiAwOwogfQogCkBAIC0xMzkwLDcgKzE0NjcsMTAgQEAKIAkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotCWludCByZXQ7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKKwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHE7CisJc3RydWN0IGNwZG1hX2NoYW4gKnR4Y2g7CisJaW50IHJldCwgcV9pZHg7CiAKIAluZXRpZl90cmFuc191cGRhdGUobmRldik7CiAKQEAgLTE0MDEsMTIgKzE0ODEsMTcgQEAKIAl9CiAKIAlpZiAoc2tiX3NoaW5mbyhza2IpLT50eF9mbGFncyAmIFNLQlRYX0hXX1RTVEFNUCAmJgotCQkJCXByaXYtPmNwdHMtPnR4X2VuYWJsZSkKKwkJCQljcHN3LT5jcHRzLT50eF9lbmFibGUpCiAJCXNrYl9zaGluZm8oc2tiKS0+dHhfZmxhZ3MgfD0gU0tCVFhfSU5fUFJPR1JFU1M7CiAKIAlza2JfdHhfdGltZXN0YW1wKHNrYik7CiAKLQlyZXQgPSBjcHN3X3R4X3BhY2tldF9zdWJtaXQobmRldiwgcHJpdiwgc2tiKTsKKwlxX2lkeCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOworCWlmIChxX2lkeCA+PSBjcHN3LT50eF9jaF9udW0pCisJCXFfaWR4ID0gcV9pZHggJSBjcHN3LT50eF9jaF9udW07CisKKwl0eGNoID0gY3Bzdy0+dHhjaFtxX2lkeF07CisJcmV0ID0gY3Bzd190eF9wYWNrZXRfc3VibWl0KHByaXYsIHNrYiwgdHhjaCk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewogCQljcHN3X2Vycihwcml2LCB0eF9lcnIsICJkZXNjIHN1Ym1pdCBmYWlsZWRcbiIpOwogCQlnb3RvIGZhaWw7CkBAIC0xNDE1LDI0ICsxNTAwLDI3IEBACiAJLyogSWYgdGhlcmUgaXMgbm8gbW9yZSB0eCBkZXNjIGxlZnQgZnJlZSB0aGVuIHdlIG5lZWQgdG8KIAkgKiB0ZWxsIHRoZSBrZXJuZWwgdG8gc3RvcCBzZW5kaW5nIHVzIHR4IGZyYW1lcy4KIAkgKi8KLQlpZiAodW5saWtlbHkoIWNwZG1hX2NoZWNrX2ZyZWVfdHhfZGVzYyhwcml2LT50eGNoKSkpCi0JCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJaWYgKHVubGlrZWx5KCFjcGRtYV9jaGVja19mcmVlX3R4X2Rlc2ModHhjaCkpKSB7CisJCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUobmRldiwgcV9pZHgpOworCQluZXRpZl90eF9zdG9wX3F1ZXVlKHR4cSk7CisJfQogCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIGZhaWw6CiAJbmRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwotCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShuZGV2LCBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSk7CisJbmV0aWZfdHhfc3RvcF9xdWV1ZSh0eHEpOwogCXJldHVybiBORVRERVZfVFhfQlVTWTsKIH0KIAogI2lmZGVmIENPTkZJR19USV9DUFRTCiAKLXN0YXRpYyB2b2lkIGNwc3dfaHd0c3RhbXBfdjEoc3RydWN0IGNwc3dfcHJpdiAqcHJpdikKK3N0YXRpYyB2b2lkIGNwc3dfaHd0c3RhbXBfdjEoc3RydWN0IGNwc3dfY29tbW9uICpjcHN3KQogewotCXN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSA9ICZwcml2LT5zbGF2ZXNbcHJpdi0+ZGF0YS5hY3RpdmVfc2xhdmVdOworCXN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSA9ICZjcHN3LT5zbGF2ZXNbY3Bzdy0+ZGF0YS5hY3RpdmVfc2xhdmVdOwogCXUzMiB0c19lbiwgc2VxX2lkOwogCi0JaWYgKCFwcml2LT5jcHRzLT50eF9lbmFibGUgJiYgIXByaXYtPmNwdHMtPnJ4X2VuYWJsZSkgeworCWlmICghY3Bzdy0+Y3B0cy0+dHhfZW5hYmxlICYmICFjcHN3LT5jcHRzLT5yeF9lbmFibGUpIHsKIAkJc2xhdmVfd3JpdGUoc2xhdmUsIDAsIENQU1cxX1RTX0NUTCk7CiAJCXJldHVybjsKIAl9CkBAIC0xNDQwLDEwICsxNTI4LDEwIEBACiAJc2VxX2lkID0gKDMwIDw8IENQU1dfVjFfU0VRX0lEX09GU19TSElGVCkgfCBFVEhfUF8xNTg4OwogCXRzX2VuID0gRVZFTlRfTVNHX0JJVFMgPDwgQ1BTV19WMV9NU0dfVFlQRV9PRlM7CiAKLQlpZiAocHJpdi0+Y3B0cy0+dHhfZW5hYmxlKQorCWlmIChjcHN3LT5jcHRzLT50eF9lbmFibGUpCiAJCXRzX2VuIHw9IENQU1dfVjFfVFNfVFhfRU47CiAKLQlpZiAocHJpdi0+Y3B0cy0+cnhfZW5hYmxlKQorCWlmIChjcHN3LT5jcHRzLT5yeF9lbmFibGUpCiAJCXRzX2VuIHw9IENQU1dfVjFfVFNfUlhfRU47CiAKIAlzbGF2ZV93cml0ZShzbGF2ZSwgdHNfZW4sIENQU1cxX1RTX0NUTCk7CkBAIC0xNDUzLDMyICsxNTQxLDMzIEBACiBzdGF0aWMgdm9pZCBjcHN3X2h3dHN0YW1wX3YyKHN0cnVjdCBjcHN3X3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IGNwc3dfc2xhdmUgKnNsYXZlOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CiAJdTMyIGN0cmwsIG10eXBlOwogCi0JaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKQotCQlzbGF2ZSA9ICZwcml2LT5zbGF2ZXNbcHJpdi0+ZW1hY19wb3J0XTsKKwlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpCisJCXNsYXZlID0gJmNwc3ctPnNsYXZlc1twcml2LT5lbWFjX3BvcnRdOwogCWVsc2UKLQkJc2xhdmUgPSAmcHJpdi0+c2xhdmVzW3ByaXYtPmRhdGEuYWN0aXZlX3NsYXZlXTsKKwkJc2xhdmUgPSAmY3Bzdy0+c2xhdmVzW2Nwc3ctPmRhdGEuYWN0aXZlX3NsYXZlXTsKIAogCWN0cmwgPSBzbGF2ZV9yZWFkKHNsYXZlLCBDUFNXMl9DT05UUk9MKTsKLQlzd2l0Y2ggKHByaXYtPnZlcnNpb24pIHsKKwlzd2l0Y2ggKGNwc3ctPnZlcnNpb24pIHsKIAljYXNlIENQU1dfVkVSU0lPTl8yOgogCQljdHJsICY9IH5DVFJMX1YyX0FMTF9UU19NQVNLOwogCi0JCWlmIChwcml2LT5jcHRzLT50eF9lbmFibGUpCisJCWlmIChjcHN3LT5jcHRzLT50eF9lbmFibGUpCiAJCQljdHJsIHw9IENUUkxfVjJfVFhfVFNfQklUUzsKIAotCQlpZiAocHJpdi0+Y3B0cy0+cnhfZW5hYmxlKQorCQlpZiAoY3Bzdy0+Y3B0cy0+cnhfZW5hYmxlKQogCQkJY3RybCB8PSBDVFJMX1YyX1JYX1RTX0JJVFM7CiAJCWJyZWFrOwogCWNhc2UgQ1BTV19WRVJTSU9OXzM6CiAJZGVmYXVsdDoKIAkJY3RybCAmPSB+Q1RSTF9WM19BTExfVFNfTUFTSzsKIAotCQlpZiAocHJpdi0+Y3B0cy0+dHhfZW5hYmxlKQorCQlpZiAoY3Bzdy0+Y3B0cy0+dHhfZW5hYmxlKQogCQkJY3RybCB8PSBDVFJMX1YzX1RYX1RTX0JJVFM7CiAKLQkJaWYgKHByaXYtPmNwdHMtPnJ4X2VuYWJsZSkKKwkJaWYgKGNwc3ctPmNwdHMtPnJ4X2VuYWJsZSkKIAkJCWN0cmwgfD0gQ1RSTF9WM19SWF9UU19CSVRTOwogCQlicmVhazsKIAl9CkBAIC0xNDg3LDE4ICsxNTc2LDE5IEBACiAKIAlzbGF2ZV93cml0ZShzbGF2ZSwgbXR5cGUsIENQU1cyX1RTX1NFUV9NVFlQRSk7CiAJc2xhdmVfd3JpdGUoc2xhdmUsIGN0cmwsIENQU1cyX0NPTlRST0wpOwotCV9fcmF3X3dyaXRlbChFVEhfUF8xNTg4LCAmcHJpdi0+cmVncy0+dHNfbHR5cGUpOworCV9fcmF3X3dyaXRlbChFVEhfUF8xNTg4LCAmY3Bzdy0+cmVncy0+dHNfbHR5cGUpOwogfQogCiBzdGF0aWMgaW50IGNwc3dfaHd0c3RhbXBfc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyKQogewogCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBjcHRzICpjcHRzID0gcHJpdi0+Y3B0czsKIAlzdHJ1Y3QgaHd0c3RhbXBfY29uZmlnIGNmZzsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OworCXN0cnVjdCBjcHRzICpjcHRzID0gY3Bzdy0+Y3B0czsKIAotCWlmIChwcml2LT52ZXJzaW9uICE9IENQU1dfVkVSU0lPTl8xICYmCi0JICAgIHByaXYtPnZlcnNpb24gIT0gQ1BTV19WRVJTSU9OXzIgJiYKLQkgICAgcHJpdi0+dmVyc2lvbiAhPSBDUFNXX1ZFUlNJT05fMykKKwlpZiAoY3Bzdy0+dmVyc2lvbiAhPSBDUFNXX1ZFUlNJT05fMSAmJgorCSAgICBjcHN3LT52ZXJzaW9uICE9IENQU1dfVkVSU0lPTl8yICYmCisJICAgIGNwc3ctPnZlcnNpb24gIT0gQ1BTV19WRVJTSU9OXzMpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCBpZnItPmlmcl9kYXRhLCBzaXplb2YoY2ZnKSkpCkBAIC0xNTM4LDkgKzE2MjgsOSBAQAogCiAJY3B0cy0+dHhfZW5hYmxlID0gY2ZnLnR4X3R5cGUgPT0gSFdUU1RBTVBfVFhfT047CiAKLQlzd2l0Y2ggKHByaXYtPnZlcnNpb24pIHsKKwlzd2l0Y2ggKGNwc3ctPnZlcnNpb24pIHsKIAljYXNlIENQU1dfVkVSU0lPTl8xOgotCQljcHN3X2h3dHN0YW1wX3YxKHByaXYpOworCQljcHN3X2h3dHN0YW1wX3YxKGNwc3cpOwogCQlicmVhazsKIAljYXNlIENQU1dfVkVSU0lPTl8yOgogCWNhc2UgQ1BTV19WRVJTSU9OXzM6CkBAIC0xNTU1LDEzICsxNjQ1LDEzIEBACiAKIHN0YXRpYyBpbnQgY3Bzd19od3RzdGFtcF9nZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIpCiB7Ci0Jc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGNwdHMgKmNwdHMgPSBwcml2LT5jcHRzOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IG5kZXZfdG9fY3BzdyhkZXYpOworCXN0cnVjdCBjcHRzICpjcHRzID0gY3Bzdy0+Y3B0czsKIAlzdHJ1Y3QgaHd0c3RhbXBfY29uZmlnIGNmZzsKIAotCWlmIChwcml2LT52ZXJzaW9uICE9IENQU1dfVkVSU0lPTl8xICYmCi0JICAgIHByaXYtPnZlcnNpb24gIT0gQ1BTV19WRVJTSU9OXzIgJiYKLQkgICAgcHJpdi0+dmVyc2lvbiAhPSBDUFNXX1ZFUlNJT05fMykKKwlpZiAoY3Bzdy0+dmVyc2lvbiAhPSBDUFNXX1ZFUlNJT05fMSAmJgorCSAgICBjcHN3LT52ZXJzaW9uICE9IENQU1dfVkVSU0lPTl8yICYmCisJICAgIGNwc3ctPnZlcnNpb24gIT0gQ1BTV19WRVJTSU9OXzMpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWNmZy5mbGFncyA9IDA7CkBAIC0xNTc3LDcgKzE2NjcsOCBAQAogc3RhdGljIGludCBjcHN3X25kb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJlcSwgaW50IGNtZCkKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgc2xhdmVfbm8gPSBjcHN3X3NsYXZlX2luZGV4KHByaXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CisJaW50IHNsYXZlX25vID0gY3Bzd19zbGF2ZV9pbmRleChjcHN3LCBwcml2KTsKIAogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE1OTEsMjcgKzE2ODIsMzMgQEAKICNlbmRpZgogCX0KIAotCWlmICghcHJpdi0+c2xhdmVzW3NsYXZlX25vXS5waHkpCisJaWYgKCFjcHN3LT5zbGF2ZXNbc2xhdmVfbm9dLnBoeSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCXJldHVybiBwaHlfbWlpX2lvY3RsKHByaXYtPnNsYXZlc1tzbGF2ZV9ub10ucGh5LCByZXEsIGNtZCk7CisJcmV0dXJuIHBoeV9taWlfaW9jdGwoY3Bzdy0+c2xhdmVzW3NsYXZlX25vXS5waHksIHJlcSwgY21kKTsKIH0KIAogc3RhdGljIHZvaWQgY3Bzd19uZG9fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKKwlpbnQgY2g7CiAKIAljcHN3X2Vycihwcml2LCB0eF9lcnIsICJ0cmFuc21pdCB0aW1lb3V0LCByZXN0YXJ0aW5nIGRtYVxuIik7CiAJbmRldi0+c3RhdHMudHhfZXJyb3JzKys7Ci0JY3Bzd19pbnRyX2Rpc2FibGUocHJpdik7Ci0JY3BkbWFfY2hhbl9zdG9wKHByaXYtPnR4Y2gpOwotCWNwZG1hX2NoYW5fc3RhcnQocHJpdi0+dHhjaCk7Ci0JY3Bzd19pbnRyX2VuYWJsZShwcml2KTsKKwljcHN3X2ludHJfZGlzYWJsZShjcHN3KTsKKwlmb3IgKGNoID0gMDsgY2ggPCBjcHN3LT50eF9jaF9udW07IGNoKyspIHsKKwkJY3BkbWFfY2hhbl9zdG9wKGNwc3ctPnR4Y2hbY2hdKTsKKwkJY3BkbWFfY2hhbl9zdGFydChjcHN3LT50eGNoW2NoXSk7CisJfQorCisJY3Bzd19pbnRyX2VuYWJsZShjcHN3KTsKIH0KIAogc3RhdGljIGludCBjcHN3X25kb19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKnApCiB7CiAJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKilwOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CiAJaW50IGZsYWdzID0gMDsKIAl1MTYgdmlkID0gMDsKIAlpbnQgcmV0OwpAQCAtMTYxOSwyNyArMTcxNiwyNyBAQAogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCi0JcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmcHJpdi0+cGRldi0+ZGV2KTsKKwlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKGNwc3ctPmRldik7CiAJaWYgKHJldCA8IDApIHsKLQkJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZwcml2LT5wZGV2LT5kZXYpOworCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoY3Bzdy0+ZGV2KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpIHsKLQkJdmlkID0gcHJpdi0+c2xhdmVzW3ByaXYtPmVtYWNfcG9ydF0ucG9ydF92bGFuOworCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykgeworCQl2aWQgPSBjcHN3LT5zbGF2ZXNbcHJpdi0+ZW1hY19wb3J0XS5wb3J0X3ZsYW47CiAJCWZsYWdzID0gQUxFX1ZMQU47CiAJfQogCi0JY3Bzd19hbGVfZGVsX3VjYXN0KHByaXYtPmFsZSwgcHJpdi0+bWFjX2FkZHIsIEhPU1RfUE9SVF9OVU0sCisJY3Bzd19hbGVfZGVsX3VjYXN0KGNwc3ctPmFsZSwgcHJpdi0+bWFjX2FkZHIsIEhPU1RfUE9SVF9OVU0sCiAJCQkgICBmbGFncywgdmlkKTsKLQljcHN3X2FsZV9hZGRfdWNhc3QocHJpdi0+YWxlLCBhZGRyLT5zYV9kYXRhLCBIT1NUX1BPUlRfTlVNLAorCWNwc3dfYWxlX2FkZF91Y2FzdChjcHN3LT5hbGUsIGFkZHItPnNhX2RhdGEsIEhPU1RfUE9SVF9OVU0sCiAJCQkgICBmbGFncywgdmlkKTsKIAogCW1lbWNweShwcml2LT5tYWNfYWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOwogCW1lbWNweShuZGV2LT5kZXZfYWRkciwgcHJpdi0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKIAlmb3JfZWFjaF9zbGF2ZShwcml2LCBjcHN3X3NldF9zbGF2ZV9tYWMsIHByaXYpOwogCi0JcG1fcnVudGltZV9wdXQoJnByaXYtPnBkZXYtPmRldik7CisJcG1fcnVudGltZV9wdXQoY3Bzdy0+ZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTY0NywxMiArMTc0NCwxMiBAQAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiBzdGF0aWMgdm9pZCBjcHN3X25kb19wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0Jc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKIAotCWNwc3dfaW50cl9kaXNhYmxlKHByaXYpOwotCWNwc3dfcnhfaW50ZXJydXB0KHByaXYtPmlycXNfdGFibGVbMF0sIHByaXYpOwotCWNwc3dfdHhfaW50ZXJydXB0KHByaXYtPmlycXNfdGFibGVbMV0sIHByaXYpOwotCWNwc3dfaW50cl9lbmFibGUocHJpdik7CisJY3Bzd19pbnRyX2Rpc2FibGUoY3Bzdyk7CisJY3Bzd19yeF9pbnRlcnJ1cHQoY3Bzdy0+aXJxc190YWJsZVswXSwgY3Bzdyk7CisJY3Bzd190eF9pbnRlcnJ1cHQoY3Bzdy0+aXJxc190YWJsZVsxXSwgY3Bzdyk7CisJY3Bzd19pbnRyX2VuYWJsZShjcHN3KTsKIH0KICNlbmRpZgogCkBAIC0xNjYyLDggKzE3NTksOSBAQAogCWludCByZXQ7CiAJaW50IHVucmVnX21jYXN0X21hc2sgPSAwOwogCXUzMiBwb3J0X21hc2s7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKIAotCWlmIChwcml2LT5kYXRhLmR1YWxfZW1hYykgeworCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykgewogCQlwb3J0X21hc2sgPSAoMSA8PCAocHJpdi0+ZW1hY19wb3J0ICsgMSkpIHwgQUxFX1BPUlRfSE9TVDsKIAogCQlpZiAocHJpdi0+bmRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCkBAIC0xNjc3LDI3ICsxNzc1LDI3IEBACiAJCQl1bnJlZ19tY2FzdF9tYXNrID0gQUxFX1BPUlRfMSB8IEFMRV9QT1JUXzI7CiAJfQogCi0JcmV0ID0gY3Bzd19hbGVfYWRkX3ZsYW4ocHJpdi0+YWxlLCB2aWQsIHBvcnRfbWFzaywgMCwgcG9ydF9tYXNrLAorCXJldCA9IGNwc3dfYWxlX2FkZF92bGFuKGNwc3ctPmFsZSwgdmlkLCBwb3J0X21hc2ssIDAsIHBvcnRfbWFzaywKIAkJCQl1bnJlZ19tY2FzdF9tYXNrKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBjcHN3X2FsZV9hZGRfdWNhc3QocHJpdi0+YWxlLCBwcml2LT5tYWNfYWRkciwKKwlyZXQgPSBjcHN3X2FsZV9hZGRfdWNhc3QoY3Bzdy0+YWxlLCBwcml2LT5tYWNfYWRkciwKIAkJCQkgSE9TVF9QT1JUX05VTSwgQUxFX1ZMQU4sIHZpZCk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGNsZWFuX3ZpZDsKIAotCXJldCA9IGNwc3dfYWxlX2FkZF9tY2FzdChwcml2LT5hbGUsIHByaXYtPm5kZXYtPmJyb2FkY2FzdCwKKwlyZXQgPSBjcHN3X2FsZV9hZGRfbWNhc3QoY3Bzdy0+YWxlLCBwcml2LT5uZGV2LT5icm9hZGNhc3QsCiAJCQkJIHBvcnRfbWFzaywgQUxFX1ZMQU4sIHZpZCwgMCk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGNsZWFuX3ZsYW5fdWNhc3Q7CiAJcmV0dXJuIDA7CiAKIGNsZWFuX3ZsYW5fdWNhc3Q6Ci0JY3Bzd19hbGVfZGVsX3VjYXN0KHByaXYtPmFsZSwgcHJpdi0+bWFjX2FkZHIsCisJY3Bzd19hbGVfZGVsX3VjYXN0KGNwc3ctPmFsZSwgcHJpdi0+bWFjX2FkZHIsCiAJCQkgICBIT1NUX1BPUlRfTlVNLCBBTEVfVkxBTiwgdmlkKTsKIGNsZWFuX3ZpZDoKLQljcHN3X2FsZV9kZWxfdmxhbihwcml2LT5hbGUsIHZpZCwgMCk7CisJY3Bzd19hbGVfZGVsX3ZsYW4oY3Bzdy0+YWxlLCB2aWQsIDApOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE3MDUsMjYgKzE4MDMsMjcgQEAKIAkJCQkgICAgX19iZTE2IHByb3RvLCB1MTYgdmlkKQogewogCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OwogCWludCByZXQ7CiAKLQlpZiAodmlkID09IHByaXYtPmRhdGEuZGVmYXVsdF92bGFuKQorCWlmICh2aWQgPT0gY3Bzdy0+ZGF0YS5kZWZhdWx0X3ZsYW4pCiAJCXJldHVybiAwOwogCi0JcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmcHJpdi0+cGRldi0+ZGV2KTsKKwlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKGNwc3ctPmRldik7CiAJaWYgKHJldCA8IDApIHsKLQkJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZwcml2LT5wZGV2LT5kZXYpOworCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoY3Bzdy0+ZGV2KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpIHsKKwlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpIHsKIAkJLyogSW4gZHVhbCBFTUFDLCByZXNlcnZlZCBWTEFOIGlkIHNob3VsZCBub3QgYmUgdXNlZCBmb3IKIAkJICogY3JlYXRpbmcgVkxBTiBpbnRlcmZhY2VzIGFzIHRoaXMgY2FuIGJyZWFrIHRoZSBkdWFsCiAJCSAqIEVNQUMgcG9ydCBzZXBhcmF0aW9uCiAJCSAqLwogCQlpbnQgaTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+ZGF0YS5zbGF2ZXM7IGkrKykgewotCQkJaWYgKHZpZCA9PSBwcml2LT5zbGF2ZXNbaV0ucG9ydF92bGFuKQorCQlmb3IgKGkgPSAwOyBpIDwgY3Bzdy0+ZGF0YS5zbGF2ZXM7IGkrKykgeworCQkJaWYgKHZpZCA9PSBjcHN3LT5zbGF2ZXNbaV0ucG9ydF92bGFuKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMTczMiw3ICsxODMxLDcgQEAKIAlkZXZfaW5mbyhwcml2LT5kZXYsICJBZGRpbmcgdmxhbmlkICVkIHRvIHZsYW4gZmlsdGVyXG4iLCB2aWQpOwogCXJldCA9IGNwc3dfYWRkX3ZsYW5fYWxlX2VudHJ5KHByaXYsIHZpZCk7CiAKLQlwbV9ydW50aW1lX3B1dCgmcHJpdi0+cGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dChjcHN3LT5kZXYpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE3NDAsMzkgKzE4MzksNDAgQEAKIAkJCQkgICAgIF9fYmUxNiBwcm90bywgdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKIAlpbnQgcmV0OwogCi0JaWYgKHZpZCA9PSBwcml2LT5kYXRhLmRlZmF1bHRfdmxhbikKKwlpZiAodmlkID09IGNwc3ctPmRhdGEuZGVmYXVsdF92bGFuKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJnByaXYtPnBkZXYtPmRldik7CisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhjcHN3LT5kZXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmcHJpdi0+cGRldi0+ZGV2KTsKKwkJcG1fcnVudGltZV9wdXRfbm9pZGxlKGNwc3ctPmRldik7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKSB7CisJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKSB7CiAJCWludCBpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBwcml2LT5kYXRhLnNsYXZlczsgaSsrKSB7Ci0JCQlpZiAodmlkID09IHByaXYtPnNsYXZlc1tpXS5wb3J0X3ZsYW4pCisJCWZvciAoaSA9IDA7IGkgPCBjcHN3LT5kYXRhLnNsYXZlczsgaSsrKSB7CisJCQlpZiAodmlkID09IGNwc3ctPnNsYXZlc1tpXS5wb3J0X3ZsYW4pCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CiAKIAlkZXZfaW5mbyhwcml2LT5kZXYsICJyZW1vdmluZyB2bGFuaWQgJWQgZnJvbSB2bGFuIGZpbHRlclxuIiwgdmlkKTsKLQlyZXQgPSBjcHN3X2FsZV9kZWxfdmxhbihwcml2LT5hbGUsIHZpZCwgMCk7CisJcmV0ID0gY3Bzd19hbGVfZGVsX3ZsYW4oY3Bzdy0+YWxlLCB2aWQsIDApOwogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IGNwc3dfYWxlX2RlbF91Y2FzdChwcml2LT5hbGUsIHByaXYtPm1hY19hZGRyLAorCXJldCA9IGNwc3dfYWxlX2RlbF91Y2FzdChjcHN3LT5hbGUsIHByaXYtPm1hY19hZGRyLAogCQkJCSBIT1NUX1BPUlRfTlVNLCBBTEVfVkxBTiwgdmlkKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBjcHN3X2FsZV9kZWxfbWNhc3QocHJpdi0+YWxlLCBwcml2LT5uZGV2LT5icm9hZGNhc3QsCisJcmV0ID0gY3Bzd19hbGVfZGVsX21jYXN0KGNwc3ctPmFsZSwgcHJpdi0+bmRldi0+YnJvYWRjYXN0LAogCQkJCSAwLCBBTEVfVkxBTiwgdmlkKTsKLQlwbV9ydW50aW1lX3B1dCgmcHJpdi0+cGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dChjcHN3LT5kZXYpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE3OTUsMzEgKzE4OTUsMzIgQEAKIAogc3RhdGljIGludCBjcHN3X2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKLQlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gbmRldl90b19jcHN3KG5kZXYpOwogCi0JcmV0dXJuIHByaXYtPmRhdGEuYWxlX2VudHJpZXMgKiBBTEVfRU5UUllfV09SRFMgKiBzaXplb2YodTMyKTsKKwlyZXR1cm4gY3Bzdy0+ZGF0YS5hbGVfZW50cmllcyAqIEFMRV9FTlRSWV9XT1JEUyAqIHNpemVvZih1MzIpOwogfQogCiBzdGF0aWMgdm9pZCBjcHN3X2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAogCQkJICBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpwKQogewotCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAl1MzIgKnJlZyA9IHA7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gbmRldl90b19jcHN3KG5kZXYpOwogCiAJLyogdXBkYXRlIENQU1cgSVAgdmVyc2lvbiAqLwotCXJlZ3MtPnZlcnNpb24gPSBwcml2LT52ZXJzaW9uOworCXJlZ3MtPnZlcnNpb24gPSBjcHN3LT52ZXJzaW9uOwogCi0JY3Bzd19hbGVfZHVtcChwcml2LT5hbGUsIHJlZyk7CisJY3Bzd19hbGVfZHVtcChjcHN3LT5hbGUsIHJlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIGNwc3dfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCiAJCQkgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGNwc3ctPmRldik7CiAKIAlzdHJsY3B5KGluZm8tPmRyaXZlciwgImNwc3ciLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CiAJc3RybGNweShpbmZvLT52ZXJzaW9uLCAiMS4wIiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKLQlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwcml2LT5wZGV2LT5uYW1lLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwZGV2LT5uYW1lLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAogc3RhdGljIHUzMiBjcHN3X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKQEAgLTE4MzgsNyArMTkzOSw3IEBACiAJCQkgICAgc3RydWN0IGV0aHRvb2xfdHNfaW5mbyAqaW5mbykKIHsKICNpZmRlZiBDT05GSUdfVElfQ1BUUwotCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBuZGV2X3RvX2Nwc3cobmRldik7CiAKIAlpbmZvLT5zb190aW1lc3RhbXBpbmcgPQogCQlTT0ZfVElNRVNUQU1QSU5HX1RYX0hBUkRXQVJFIHwKQEAgLTE4NDcsNyArMTk0OCw3IEBACiAJCVNPRl9USU1FU1RBTVBJTkdfUlhfU09GVFdBUkUgfAogCQlTT0ZfVElNRVNUQU1QSU5HX1NPRlRXQVJFIHwKIAkJU09GX1RJTUVTVEFNUElOR19SQVdfSEFSRFdBUkU7Ci0JaW5mby0+cGhjX2luZGV4ID0gcHJpdi0+Y3B0cy0+cGhjX2luZGV4OworCWluZm8tPnBoY19pbmRleCA9IGNwc3ctPmNwdHMtPnBoY19pbmRleDsKIAlpbmZvLT50eF90eXBlcyA9CiAJCSgxIDw8IEhXVFNUQU1QX1RYX09GRikgfAogCQkoMSA8PCBIV1RTVEFNUF9UWF9PTik7CkBAIC0xODcwLDEwICsxOTcxLDExIEBACiAJCQkgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0JaW50IHNsYXZlX25vID0gY3Bzd19zbGF2ZV9pbmRleChwcml2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OworCWludCBzbGF2ZV9ubyA9IGNwc3dfc2xhdmVfaW5kZXgoY3BzdywgcHJpdik7CiAKLQlpZiAocHJpdi0+c2xhdmVzW3NsYXZlX25vXS5waHkpCi0JCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KHByaXYtPnNsYXZlc1tzbGF2ZV9ub10ucGh5LCBlY21kKTsKKwlpZiAoY3Bzdy0+c2xhdmVzW3NsYXZlX25vXS5waHkpCisJCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KGNwc3ctPnNsYXZlc1tzbGF2ZV9ub10ucGh5LCBlY21kKTsKIAllbHNlCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KQEAgLTE4ODEsMTAgKzE5ODMsMTEgQEAKIHN0YXRpYyBpbnQgY3Bzd19zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0JaW50IHNsYXZlX25vID0gY3Bzd19zbGF2ZV9pbmRleChwcml2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OworCWludCBzbGF2ZV9ubyA9IGNwc3dfc2xhdmVfaW5kZXgoY3BzdywgcHJpdik7CiAKLQlpZiAocHJpdi0+c2xhdmVzW3NsYXZlX25vXS5waHkpCi0JCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KHByaXYtPnNsYXZlc1tzbGF2ZV9ub10ucGh5LCBlY21kKTsKKwlpZiAoY3Bzdy0+c2xhdmVzW3NsYXZlX25vXS5waHkpCisJCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KGNwc3ctPnNsYXZlc1tzbGF2ZV9ub10ucGh5LCBlY21kKTsKIAllbHNlCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KQEAgLTE4OTIsMjIgKzE5OTUsMjQgQEAKIHN0YXRpYyB2b2lkIGNwc3dfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQogewogCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlpbnQgc2xhdmVfbm8gPSBjcHN3X3NsYXZlX2luZGV4KHByaXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CisJaW50IHNsYXZlX25vID0gY3Bzd19zbGF2ZV9pbmRleChjcHN3LCBwcml2KTsKIAogCXdvbC0+c3VwcG9ydGVkID0gMDsKIAl3b2wtPndvbG9wdHMgPSAwOwogCi0JaWYgKHByaXYtPnNsYXZlc1tzbGF2ZV9ub10ucGh5KQotCQlwaHlfZXRodG9vbF9nZXRfd29sKHByaXYtPnNsYXZlc1tzbGF2ZV9ub10ucGh5LCB3b2wpOworCWlmIChjcHN3LT5zbGF2ZXNbc2xhdmVfbm9dLnBoeSkKKwkJcGh5X2V0aHRvb2xfZ2V0X3dvbChjcHN3LT5zbGF2ZXNbc2xhdmVfbm9dLnBoeSwgd29sKTsKIH0KIAogc3RhdGljIGludCBjcHN3X3NldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0JaW50IHNsYXZlX25vID0gY3Bzd19zbGF2ZV9pbmRleChwcml2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OworCWludCBzbGF2ZV9ubyA9IGNwc3dfc2xhdmVfaW5kZXgoY3BzdywgcHJpdik7CiAKLQlpZiAocHJpdi0+c2xhdmVzW3NsYXZlX25vXS5waHkpCi0JCXJldHVybiBwaHlfZXRodG9vbF9zZXRfd29sKHByaXYtPnNsYXZlc1tzbGF2ZV9ub10ucGh5LCB3b2wpOworCWlmIChjcHN3LT5zbGF2ZXNbc2xhdmVfbm9dLnBoeSkKKwkJcmV0dXJuIHBoeV9ldGh0b29sX3NldF93b2woY3Bzdy0+c2xhdmVzW3NsYXZlX25vXS5waHksIHdvbCk7CiAJZWxzZQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CkBAIC0xOTM4LDEyICsyMDQzLDEzIEBACiBzdGF0aWMgaW50IGNwc3dfZXRodG9vbF9vcF9iZWdpbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKIAlpbnQgcmV0OwogCi0JcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmcHJpdi0+cGRldi0+ZGV2KTsKKwlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKGNwc3ctPmRldik7CiAJaWYgKHJldCA8IDApIHsKIAkJY3Bzd19lcnIocHJpdiwgZHJ2LCAiZXRodG9vbCBiZWdpbiBmYWlsZWQgJWRcbiIsIHJldCk7Ci0JCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmcHJpdi0+cGRldi0+ZGV2KTsKKwkJcG1fcnVudGltZV9wdXRfbm9pZGxlKGNwc3ctPmRldik7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTE5NTQsMTEgKzIwNjAsMTg1IEBACiAJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwogCWludCByZXQ7CiAKLQlyZXQgPSBwbV9ydW50aW1lX3B1dCgmcHJpdi0+cGRldi0+ZGV2KTsKKwlyZXQgPSBwbV9ydW50aW1lX3B1dChwcml2LT5jcHN3LT5kZXYpOwogCWlmIChyZXQgPCAwKQogCQljcHN3X2Vycihwcml2LCBkcnYsICJldGh0b29sIGNvbXBsZXRlIGZhaWxlZCAlZFxuIiwgcmV0KTsKIH0KIAorc3RhdGljIHZvaWQgY3Bzd19nZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9jaGFubmVscyAqY2gpCit7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gbmRldl90b19jcHN3KG5kZXYpOworCisJY2gtPm1heF9jb21iaW5lZCA9IDA7CisJY2gtPm1heF9yeCA9IENQU1dfTUFYX1FVRVVFUzsKKwljaC0+bWF4X3R4ID0gQ1BTV19NQVhfUVVFVUVTOworCWNoLT5tYXhfb3RoZXIgPSAwOworCWNoLT5vdGhlcl9jb3VudCA9IDA7CisJY2gtPnJ4X2NvdW50ID0gY3Bzdy0+cnhfY2hfbnVtOworCWNoLT50eF9jb3VudCA9IGNwc3ctPnR4X2NoX251bTsKKwljaC0+Y29tYmluZWRfY291bnQgPSAwOworfQorCitzdGF0aWMgaW50IGNwc3dfY2hlY2tfY2hfc2V0dGluZ3Moc3RydWN0IGNwc3dfY29tbW9uICpjcHN3LAorCQkJCSAgc3RydWN0IGV0aHRvb2xfY2hhbm5lbHMgKmNoKQoreworCWlmIChjaC0+Y29tYmluZWRfY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogdmVyaWZ5IHdlIGhhdmUgYXQgbGVhc3Qgb25lIGNoYW5uZWwgaW4gZWFjaCBkaXJlY3Rpb24gKi8KKwlpZiAoIWNoLT5yeF9jb3VudCB8fCAhY2gtPnR4X2NvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjaC0+cnhfY291bnQgPiBjcHN3LT5kYXRhLmNoYW5uZWxzIHx8CisJICAgIGNoLT50eF9jb3VudCA+IGNwc3ctPmRhdGEuY2hhbm5lbHMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3Bzd191cGRhdGVfY2hhbm5lbHNfcmVzKHN0cnVjdCBjcHN3X3ByaXYgKnByaXYsIGludCBjaF9udW0sIGludCByeCkKK3sKKwlpbnQgKCpwb2xsKShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKiwgaW50KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OworCXZvaWQgKCpoYW5kbGVyKSh2b2lkICosIGludCwgaW50KTsKKwlzdHJ1Y3QgY3BkbWFfY2hhbiAqKmNoYW47CisJaW50IHJldCwgKmNoOworCisJaWYgKHJ4KSB7CisJCWNoID0gJmNwc3ctPnJ4X2NoX251bTsKKwkJY2hhbiA9IGNwc3ctPnJ4Y2g7CisJCWhhbmRsZXIgPSBjcHN3X3J4X2hhbmRsZXI7CisJCXBvbGwgPSBjcHN3X3J4X3BvbGw7CisJfSBlbHNlIHsKKwkJY2ggPSAmY3Bzdy0+dHhfY2hfbnVtOworCQljaGFuID0gY3Bzdy0+dHhjaDsKKwkJaGFuZGxlciA9IGNwc3dfdHhfaGFuZGxlcjsKKwkJcG9sbCA9IGNwc3dfdHhfcG9sbDsKKwl9CisKKwl3aGlsZSAoKmNoIDwgY2hfbnVtKSB7CisJCWNoYW5bKmNoXSA9IGNwZG1hX2NoYW5fY3JlYXRlKGNwc3ctPmRtYSwgKmNoLCBoYW5kbGVyLCByeCk7CisKKwkJaWYgKElTX0VSUihjaGFuWypjaF0pKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hhblsqY2hdKTsKKworCQlpZiAoIWNoYW5bKmNoXSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNwc3dfaW5mbyhwcml2LCBpZnVwLCAiY3JlYXRlZCBuZXcgJWQgJXMgY2hhbm5lbFxuIiwgKmNoLAorCQkJICAocnggPyAicngiIDogInR4IikpOworCQkoKmNoKSsrOworCX0KKworCXdoaWxlICgqY2ggPiBjaF9udW0pIHsKKwkJKCpjaCktLTsKKworCQlyZXQgPSBjcGRtYV9jaGFuX2Rlc3Ryb3koY2hhblsqY2hdKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJY3Bzd19pbmZvKHByaXYsIGlmdXAsICJkZXN0cm95ZWQgJWQgJXMgY2hhbm5lbFxuIiwgKmNoLAorCQkJICAocnggPyAicngiIDogInR4IikpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwc3dfdXBkYXRlX2NoYW5uZWxzKHN0cnVjdCBjcHN3X3ByaXYgKnByaXYsCisJCQkJc3RydWN0IGV0aHRvb2xfY2hhbm5lbHMgKmNoKQoreworCWludCByZXQ7CisKKwlyZXQgPSBjcHN3X3VwZGF0ZV9jaGFubmVsc19yZXMocHJpdiwgY2gtPnJ4X2NvdW50LCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY3Bzd191cGRhdGVfY2hhbm5lbHNfcmVzKHByaXYsIGNoLT50eF9jb3VudCwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwc3dfc2V0X2NoYW5uZWxzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9jaGFubmVscyAqY2hzKQoreworCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OworCXN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZTsKKwlpbnQgaSwgcmV0OworCisJcmV0ID0gY3Bzd19jaGVja19jaF9zZXR0aW5ncyhjcHN3LCBjaHMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogRGlzYWJsZSBOQVBJIHNjaGVkdWxpbmcgKi8KKwljcHN3X2ludHJfZGlzYWJsZShjcHN3KTsKKworCS8qIFN0b3AgYWxsIHRyYW5zbWl0IHF1ZXVlcyBmb3IgZXZlcnkgbmV0d29yayBkZXZpY2UuCisJICogRGlzYWJsZSByZS11c2luZyByeCBkZXNjcmlwdG9ycyB3aXRoIGRvcm1hbnRfb24uCisJICovCisJZm9yIChpID0gY3Bzdy0+ZGF0YS5zbGF2ZXMsIHNsYXZlID0gY3Bzdy0+c2xhdmVzOyBpOyBpLS0sIHNsYXZlKyspIHsKKwkJaWYgKCEoc2xhdmUtPm5kZXYgJiYgbmV0aWZfcnVubmluZyhzbGF2ZS0+bmRldikpKQorCQkJY29udGludWU7CisKKwkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKHNsYXZlLT5uZGV2KTsKKwkJbmV0aWZfZG9ybWFudF9vbihzbGF2ZS0+bmRldik7CisJfQorCisJLyogSGFuZGxlIHJlc3Qgb2YgdHggcGFja2V0cyBhbmQgc3RvcCBjcGRtYSBjaGFubmVscyAqLworCWNwZG1hX2N0bHJfc3RvcChjcHN3LT5kbWEpOworCXJldCA9IGNwc3dfdXBkYXRlX2NoYW5uZWxzKHByaXYsIGNocyk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlmb3IgKGkgPSBjcHN3LT5kYXRhLnNsYXZlcywgc2xhdmUgPSBjcHN3LT5zbGF2ZXM7IGk7IGktLSwgc2xhdmUrKykgeworCQlpZiAoIShzbGF2ZS0+bmRldiAmJiBuZXRpZl9ydW5uaW5nKHNsYXZlLT5uZGV2KSkpCisJCQljb250aW51ZTsKKworCQkvKiBJbmZvcm0gc3RhY2sgYWJvdXQgbmV3IGNvdW50IG9mIHF1ZXVlcyAqLworCQlyZXQgPSBuZXRpZl9zZXRfcmVhbF9udW1fdHhfcXVldWVzKHNsYXZlLT5uZGV2LAorCQkJCQkJICAgY3Bzdy0+dHhfY2hfbnVtKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihwcml2LT5kZXYsICJjYW5ub3Qgc2V0IHJlYWwgbnVtYmVyIG9mIHR4IHF1ZXVlc1xuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCXJldCA9IG5ldGlmX3NldF9yZWFsX251bV9yeF9xdWV1ZXMoc2xhdmUtPm5kZXYsCisJCQkJCQkgICBjcHN3LT5yeF9jaF9udW0pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHByaXYtPmRldiwgImNhbm5vdCBzZXQgcmVhbCBudW1iZXIgb2YgcnggcXVldWVzXG4iKTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJLyogRW5hYmxlIHJ4IHBhY2tldHMgaGFuZGxpbmcgKi8KKwkJbmV0aWZfZG9ybWFudF9vZmYoc2xhdmUtPm5kZXYpOworCX0KKworCWlmIChjcHN3X2NvbW1vbl9yZXNfdXNhZ2Vfc3RhdGUoY3BzdykpIHsKKwkJcmV0ID0gY3Bzd19maWxsX3J4X2NoYW5uZWxzKHByaXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisKKwkJLyogQWZ0ZXIgdGhpcyByZWNlaXZlIGlzIHN0YXJ0ZWQgKi8KKwkJY3BkbWFfY3Rscl9zdGFydChjcHN3LT5kbWEpOworCQljcHN3X2ludHJfZW5hYmxlKGNwc3cpOworCX0KKworCS8qIFJlc3VtZSB0cmFuc21pdCBmb3IgZXZlcnkgYWZmZWN0ZWQgaW50ZXJmYWNlICovCisJZm9yIChpID0gY3Bzdy0+ZGF0YS5zbGF2ZXMsIHNsYXZlID0gY3Bzdy0+c2xhdmVzOyBpOyBpLS0sIHNsYXZlKyspIHsKKwkJaWYgKCEoc2xhdmUtPm5kZXYgJiYgbmV0aWZfcnVubmluZyhzbGF2ZS0+bmRldikpKQorCQkJY29udGludWU7CisJCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMoc2xhdmUtPm5kZXYpOworCX0KKwlyZXR1cm4gMDsKK2VycjoKKwlkZXZfZXJyKHByaXYtPmRldiwgImNhbm5vdCB1cGRhdGUgY2hhbm5lbHMgbnVtYmVyLCBjbG9zaW5nIGRldmljZVxuIik7CisJZGV2X2Nsb3NlKG5kZXYpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgY3Bzd19ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2RydmluZm8JPSBjcHN3X2dldF9kcnZpbmZvLAogCS5nZXRfbXNnbGV2ZWwJPSBjcHN3X2dldF9tc2dsZXZlbCwKQEAgLTE5ODAsMTQgKzIyNjAsMTYgQEAKIAkuZ2V0X3JlZ3MJPSBjcHN3X2dldF9yZWdzLAogCS5iZWdpbgkJPSBjcHN3X2V0aHRvb2xfb3BfYmVnaW4sCiAJLmNvbXBsZXRlCT0gY3Bzd19ldGh0b29sX29wX2NvbXBsZXRlLAorCS5nZXRfY2hhbm5lbHMJPSBjcHN3X2dldF9jaGFubmVscywKKwkuc2V0X2NoYW5uZWxzCT0gY3Bzd19zZXRfY2hhbm5lbHMsCiB9OwogCi1zdGF0aWMgdm9pZCBjcHN3X3NsYXZlX2luaXQoc3RydWN0IGNwc3dfc2xhdmUgKnNsYXZlLCBzdHJ1Y3QgY3Bzd19wcml2ICpwcml2LAorc3RhdGljIHZvaWQgY3Bzd19zbGF2ZV9pbml0KHN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSwgc3RydWN0IGNwc3dfY29tbW9uICpjcHN3LAogCQkJICAgIHUzMiBzbGF2ZV9yZWdfb2ZzLCB1MzIgc2xpdmVyX3JlZ19vZnMpCiB7Ci0Jdm9pZCBfX2lvbWVtCQkqcmVncyA9IHByaXYtPnJlZ3M7CisJdm9pZCBfX2lvbWVtCQkqcmVncyA9IGNwc3ctPnJlZ3M7CiAJaW50CQkJc2xhdmVfbnVtID0gc2xhdmUtPnNsYXZlX251bTsKLQlzdHJ1Y3QgY3Bzd19zbGF2ZV9kYXRhCSpkYXRhID0gcHJpdi0+ZGF0YS5zbGF2ZV9kYXRhICsgc2xhdmVfbnVtOworCXN0cnVjdCBjcHN3X3NsYXZlX2RhdGEJKmRhdGEgPSBjcHN3LT5kYXRhLnNsYXZlX2RhdGEgKyBzbGF2ZV9udW07CiAKIAlzbGF2ZS0+ZGF0YQk9IGRhdGE7CiAJc2xhdmUtPnJlZ3MJPSByZWdzICsgc2xhdmVfcmVnX29mczsKQEAgLTIxNTgsNzEgKzI0NDAsNTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjcHN3X3Byb2JlX2R1YWxfZW1hYyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkJCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYpCitzdGF0aWMgaW50IGNwc3dfcHJvYmVfZHVhbF9lbWFjKHN0cnVjdCBjcHN3X3ByaXYgKnByaXYpCiB7Ci0Jc3RydWN0IGNwc3dfcGxhdGZvcm1fZGF0YQkqZGF0YSA9ICZwcml2LT5kYXRhOworCXN0cnVjdCBjcHN3X2NvbW1vbgkJKmNwc3cgPSBwcml2LT5jcHN3OworCXN0cnVjdCBjcHN3X3BsYXRmb3JtX2RhdGEJKmRhdGEgPSAmY3Bzdy0+ZGF0YTsKIAlzdHJ1Y3QgbmV0X2RldmljZQkJKm5kZXY7CiAJc3RydWN0IGNwc3dfcHJpdgkJKnByaXZfc2wyOwotCWludCByZXQgPSAwLCBpOworCWludCByZXQgPSAwOwogCi0JbmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgY3Bzd19wcml2KSk7CisJbmRldiA9IGFsbG9jX2V0aGVyZGV2X21xKHNpemVvZihzdHJ1Y3QgY3Bzd19wcml2KSwgQ1BTV19NQVhfUVVFVUVTKTsKIAlpZiAoIW5kZXYpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY3BzdzogZXJyb3IgYWxsb2NhdGluZyBuZXRfZGV2aWNlXG4iKTsKKwkJZGV2X2VycihjcHN3LT5kZXYsICJjcHN3OiBlcnJvciBhbGxvY2F0aW5nIG5ldF9kZXZpY2VcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlwcml2X3NsMiA9IG5ldGRldl9wcml2KG5kZXYpOwotCXByaXZfc2wyLT5kYXRhID0gKmRhdGE7Ci0JcHJpdl9zbDItPnBkZXYgPSBwZGV2OworCXByaXZfc2wyLT5jcHN3ID0gY3BzdzsKIAlwcml2X3NsMi0+bmRldiA9IG5kZXY7CiAJcHJpdl9zbDItPmRldiAgPSAmbmRldi0+ZGV2OwogCXByaXZfc2wyLT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQoZGVidWdfbGV2ZWwsIENQU1dfREVCVUcpOwotCXByaXZfc2wyLT5yeF9wYWNrZXRfbWF4ID0gbWF4KHJ4X3BhY2tldF9tYXgsIDEyOCk7CiAKIAlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihkYXRhLT5zbGF2ZV9kYXRhWzFdLm1hY19hZGRyKSkgewogCQltZW1jcHkocHJpdl9zbDItPm1hY19hZGRyLCBkYXRhLT5zbGF2ZV9kYXRhWzFdLm1hY19hZGRyLAogCQkJRVRIX0FMRU4pOwotCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiY3BzdzogRGV0ZWN0ZWQgTUFDSUQgPSAlcE1cbiIsIHByaXZfc2wyLT5tYWNfYWRkcik7CisJCWRldl9pbmZvKGNwc3ctPmRldiwgImNwc3c6IERldGVjdGVkIE1BQ0lEID0gJXBNXG4iLAorCQkJIHByaXZfc2wyLT5tYWNfYWRkcik7CiAJfSBlbHNlIHsKIAkJcmFuZG9tX2V0aGVyX2FkZHIocHJpdl9zbDItPm1hY19hZGRyKTsKLQkJZGV2X2luZm8oJnBkZXYtPmRldiwgImNwc3c6IFJhbmRvbSBNQUNJRCA9ICVwTVxuIiwgcHJpdl9zbDItPm1hY19hZGRyKTsKKwkJZGV2X2luZm8oY3Bzdy0+ZGV2LCAiY3BzdzogUmFuZG9tIE1BQ0lEID0gJXBNXG4iLAorCQkJIHByaXZfc2wyLT5tYWNfYWRkcik7CiAJfQogCW1lbWNweShuZGV2LT5kZXZfYWRkciwgcHJpdl9zbDItPm1hY19hZGRyLCBFVEhfQUxFTik7CiAKLQlwcml2X3NsMi0+c2xhdmVzID0gcHJpdi0+c2xhdmVzOwotCXByaXZfc2wyLT5jbGsgPSBwcml2LT5jbGs7Ci0KLQlwcml2X3NsMi0+Y29hbF9pbnR2bCA9IDA7Ci0JcHJpdl9zbDItPmJ1c19mcmVxX21oeiA9IHByaXYtPmJ1c19mcmVxX21oejsKLQotCXByaXZfc2wyLT5yZWdzID0gcHJpdi0+cmVnczsKLQlwcml2X3NsMi0+aG9zdF9wb3J0X3JlZ3MgPSBwcml2LT5ob3N0X3BvcnRfcmVnczsKLQlwcml2X3NsMi0+d3JfcmVncyA9IHByaXYtPndyX3JlZ3M7Ci0JcHJpdl9zbDItPmh3X3N0YXRzID0gcHJpdi0+aHdfc3RhdHM7Ci0JcHJpdl9zbDItPmRtYSA9IHByaXYtPmRtYTsKLQlwcml2X3NsMi0+dHhjaCA9IHByaXYtPnR4Y2g7Ci0JcHJpdl9zbDItPnJ4Y2ggPSBwcml2LT5yeGNoOwotCXByaXZfc2wyLT5hbGUgPSBwcml2LT5hbGU7CiAJcHJpdl9zbDItPmVtYWNfcG9ydCA9IDE7Ci0JcHJpdi0+c2xhdmVzWzFdLm5kZXYgPSBuZGV2OwotCXByaXZfc2wyLT5jcHRzID0gcHJpdi0+Y3B0czsKLQlwcml2X3NsMi0+dmVyc2lvbiA9IHByaXYtPnZlcnNpb247Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bnVtX2lycXM7IGkrKykgewotCQlwcml2X3NsMi0+aXJxc190YWJsZVtpXSA9IHByaXYtPmlycXNfdGFibGVbaV07Ci0JCXByaXZfc2wyLT5udW1faXJxcyA9IHByaXYtPm51bV9pcnFzOwotCX0KKwljcHN3LT5zbGF2ZXNbMV0ubmRldiA9IG5kZXY7CiAJbmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX0NUQUdfRklMVEVSOwogCiAJbmRldi0+bmV0ZGV2X29wcyA9ICZjcHN3X25ldGRldl9vcHM7CiAJbmRldi0+ZXRodG9vbF9vcHMgPSAmY3Bzd19ldGh0b29sX29wczsKIAogCS8qIHJlZ2lzdGVyIHRoZSBuZXR3b3JrIGRldmljZSAqLwotCVNFVF9ORVRERVZfREVWKG5kZXYsICZwZGV2LT5kZXYpOworCVNFVF9ORVRERVZfREVWKG5kZXYsIGNwc3ctPmRldik7CiAJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY3BzdzogZXJyb3IgcmVnaXN0ZXJpbmcgbmV0IGRldmljZVxuIik7CisJCWRldl9lcnIoY3Bzdy0+ZGV2LCAiY3BzdzogZXJyb3IgcmVnaXN0ZXJpbmcgbmV0IGRldmljZVxuIik7CiAJCWZyZWVfbmV0ZGV2KG5kZXYpOwogCQlyZXQgPSAtRU5PREVWOwogCX0KQEAgLTIyNzAsNiArMjUzMSw3IEBACiAKIHN0YXRpYyBpbnQgY3Bzd19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBjbGsJCQkqY2xrOwogCXN0cnVjdCBjcHN3X3BsYXRmb3JtX2RhdGEJKmRhdGE7CiAJc3RydWN0IG5ldF9kZXZpY2UJCSpuZGV2OwogCXN0cnVjdCBjcHN3X3ByaXYJCSpwcml2OwpAQCAtMjI4MCwxMCArMjU0MiwxNCBAQAogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQJKm9mX2lkOwogCXN0cnVjdCBncGlvX2Rlc2NzCQkqbW9kZTsKIAl1MzIgc2xhdmVfb2Zmc2V0LCBzbGl2ZXJfb2Zmc2V0LCBzbGF2ZV9zaXplOworCXN0cnVjdCBjcHN3X2NvbW1vbgkJKmNwc3c7CiAJaW50IHJldCA9IDAsIGk7CiAJaW50IGlycTsKIAotCW5kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGNwc3dfcHJpdikpOworCWNwc3cgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBjcHN3X2NvbW1vbiksIEdGUF9LRVJORUwpOworCWNwc3ctPmRldiA9ICZwZGV2LT5kZXY7CisKKwluZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKHN0cnVjdCBjcHN3X3ByaXYpLCBDUFNXX01BWF9RVUVVRVMpOwogCWlmICghbmRldikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJlcnJvciBhbGxvY2F0aW5nIG5ldF9kZXZpY2VcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIyOTEsMTMgKzI1NTcsMTMgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG5kZXYpOwogCXByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlwcml2LT5wZGV2ID0gcGRldjsKKwlwcml2LT5jcHN3ID0gY3BzdzsKIAlwcml2LT5uZGV2ID0gbmRldjsKIAlwcml2LT5kZXYgID0gJm5kZXYtPmRldjsKIAlwcml2LT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQoZGVidWdfbGV2ZWwsIENQU1dfREVCVUcpOwotCXByaXYtPnJ4X3BhY2tldF9tYXggPSBtYXgocnhfcGFja2V0X21heCwgMTI4KTsKLQlwcml2LT5jcHRzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgY3B0cyksIEdGUF9LRVJORUwpOwotCWlmICghcHJpdi0+Y3B0cykgeworCWNwc3ctPnJ4X3BhY2tldF9tYXggPSBtYXgocnhfcGFja2V0X21heCwgMTI4KTsKKwljcHN3LT5jcHRzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgY3B0cyksIEdGUF9LRVJORUwpOworCWlmICghY3Bzdy0+Y3B0cykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJlcnJvciBhbGxvY2F0aW5nIGNwdHNcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGNsZWFuX25kZXZfcmV0OwpAQCAtMjMxOCwxMiArMjU4NCwxNCBAQAogCS8qIFNlbGVjdCBkZWZhdWx0IHBpbiBzdGF0ZSAqLwogCXBpbmN0cmxfcG1fc2VsZWN0X2RlZmF1bHRfc3RhdGUoJnBkZXYtPmRldik7CiAKLQlpZiAoY3Bzd19wcm9iZV9kdCgmcHJpdi0+ZGF0YSwgcGRldikpIHsKKwlpZiAoY3Bzd19wcm9iZV9kdCgmY3Bzdy0+ZGF0YSwgcGRldikpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY3BzdzogcGxhdGZvcm0gZGF0YSBtaXNzaW5nXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBjbGVhbl9ydW50aW1lX2Rpc2FibGVfcmV0OwogCX0KLQlkYXRhID0gJnByaXYtPmRhdGE7CisJZGF0YSA9ICZjcHN3LT5kYXRhOworCWNwc3ctPnJ4X2NoX251bSA9IDE7CisJY3Bzdy0+dHhfY2hfbnVtID0gMTsKIAogCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKGRhdGEtPnNsYXZlX2RhdGFbMF0ubWFjX2FkZHIpKSB7CiAJCW1lbWNweShwcml2LT5tYWNfYWRkciwgZGF0YS0+c2xhdmVfZGF0YVswXS5tYWNfYWRkciwgRVRIX0FMRU4pOwpAQCAtMjMzNSwyNyArMjYwMywyNiBAQAogCiAJbWVtY3B5KG5kZXYtPmRldl9hZGRyLCBwcml2LT5tYWNfYWRkciwgRVRIX0FMRU4pOwogCi0JcHJpdi0+c2xhdmVzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJY3Bzdy0+c2xhdmVzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCiAJCQkJICAgIHNpemVvZihzdHJ1Y3QgY3Bzd19zbGF2ZSkgKiBkYXRhLT5zbGF2ZXMsCiAJCQkJICAgIEdGUF9LRVJORUwpOwotCWlmICghcHJpdi0+c2xhdmVzKSB7CisJaWYgKCFjcHN3LT5zbGF2ZXMpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBjbGVhbl9ydW50aW1lX2Rpc2FibGVfcmV0OwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+c2xhdmVzOyBpKyspCi0JCXByaXYtPnNsYXZlc1tpXS5zbGF2ZV9udW0gPSBpOworCQljcHN3LT5zbGF2ZXNbaV0uc2xhdmVfbnVtID0gaTsKIAotCXByaXYtPnNsYXZlc1swXS5uZGV2ID0gbmRldjsKKwljcHN3LT5zbGF2ZXNbMF0ubmRldiA9IG5kZXY7CiAJcHJpdi0+ZW1hY19wb3J0ID0gMDsKIAotCXByaXYtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiZmNrIik7Ci0JaWYgKElTX0VSUihwcml2LT5jbGspKSB7CisJY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJmY2siKTsKKwlpZiAoSVNfRVJSKGNsaykpIHsKIAkJZGV2X2Vycihwcml2LT5kZXYsICJmY2sgaXMgbm90IGZvdW5kXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBjbGVhbl9ydW50aW1lX2Rpc2FibGVfcmV0OwogCX0KLQlwcml2LT5jb2FsX2ludHZsID0gMDsKLQlwcml2LT5idXNfZnJlcV9taHogPSBjbGtfZ2V0X3JhdGUocHJpdi0+Y2xrKSAvIDEwMDAwMDA7CisJY3Bzdy0+YnVzX2ZyZXFfbWh6ID0gY2xrX2dldF9yYXRlKGNsaykgLyAxMDAwMDAwOwogCiAJc3NfcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlzc19yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHNzX3Jlcyk7CkBAIC0yMzYzLDcgKzI2MzAsNyBAQAogCQlyZXQgPSBQVFJfRVJSKHNzX3JlZ3MpOwogCQlnb3RvIGNsZWFuX3J1bnRpbWVfZGlzYWJsZV9yZXQ7CiAJfQotCXByaXYtPnJlZ3MgPSBzc19yZWdzOworCWNwc3ctPnJlZ3MgPSBzc19yZWdzOwogCiAJLyogTmVlZCB0byBlbmFibGUgY2xvY2tzIHdpdGggcnVudGltZSBQTSBhcGkgdG8gYWNjZXNzIG1vZHVsZQogCSAqIHJlZ2lzdGVycwpAQCAtMjM3MywyNCArMjY0MCwyNCBAQAogCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJnBkZXYtPmRldik7CiAJCWdvdG8gY2xlYW5fcnVudGltZV9kaXNhYmxlX3JldDsKIAl9Ci0JcHJpdi0+dmVyc2lvbiA9IHJlYWRsKCZwcml2LT5yZWdzLT5pZF92ZXIpOworCWNwc3ctPnZlcnNpb24gPSByZWFkbCgmY3Bzdy0+cmVncy0+aWRfdmVyKTsKIAlwbV9ydW50aW1lX3B1dF9zeW5jKCZwZGV2LT5kZXYpOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKLQlwcml2LT53cl9yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7Ci0JaWYgKElTX0VSUihwcml2LT53cl9yZWdzKSkgewotCQlyZXQgPSBQVFJfRVJSKHByaXYtPndyX3JlZ3MpOworCWNwc3ctPndyX3JlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGNwc3ctPndyX3JlZ3MpKSB7CisJCXJldCA9IFBUUl9FUlIoY3Bzdy0+d3JfcmVncyk7CiAJCWdvdG8gY2xlYW5fcnVudGltZV9kaXNhYmxlX3JldDsKIAl9CiAKIAltZW1zZXQoJmRtYV9wYXJhbXMsIDAsIHNpemVvZihkbWFfcGFyYW1zKSk7CiAJbWVtc2V0KCZhbGVfcGFyYW1zLCAwLCBzaXplb2YoYWxlX3BhcmFtcykpOwogCi0Jc3dpdGNoIChwcml2LT52ZXJzaW9uKSB7CisJc3dpdGNoIChjcHN3LT52ZXJzaW9uKSB7CiAJY2FzZSBDUFNXX1ZFUlNJT05fMToKLQkJcHJpdi0+aG9zdF9wb3J0X3JlZ3MgPSBzc19yZWdzICsgQ1BTVzFfSE9TVF9QT1JUX09GRlNFVDsKLQkJcHJpdi0+Y3B0cy0+cmVnICAgICAgPSBzc19yZWdzICsgQ1BTVzFfQ1BUU19PRkZTRVQ7Ci0JCXByaXYtPmh3X3N0YXRzCSAgICAgPSBzc19yZWdzICsgQ1BTVzFfSFdfU1RBVFM7CisJCWNwc3ctPmhvc3RfcG9ydF9yZWdzID0gc3NfcmVncyArIENQU1cxX0hPU1RfUE9SVF9PRkZTRVQ7CisJCWNwc3ctPmNwdHMtPnJlZyAgICAgID0gc3NfcmVncyArIENQU1cxX0NQVFNfT0ZGU0VUOworCQljcHN3LT5od19zdGF0cwkgICAgID0gc3NfcmVncyArIENQU1cxX0hXX1NUQVRTOwogCQlkbWFfcGFyYW1zLmRtYXJlZ3MgICA9IHNzX3JlZ3MgKyBDUFNXMV9DUERNQV9PRkZTRVQ7CiAJCWRtYV9wYXJhbXMudHhoZHAgICAgID0gc3NfcmVncyArIENQU1cxX1NUQVRFUkFNX09GRlNFVDsKIAkJYWxlX3BhcmFtcy5hbGVfcmVncyAgPSBzc19yZWdzICsgQ1BTVzFfQUxFX09GRlNFVDsKQEAgLTI0MDIsOSArMjY2OSw5IEBACiAJY2FzZSBDUFNXX1ZFUlNJT05fMjoKIAljYXNlIENQU1dfVkVSU0lPTl8zOgogCWNhc2UgQ1BTV19WRVJTSU9OXzQ6Ci0JCXByaXYtPmhvc3RfcG9ydF9yZWdzID0gc3NfcmVncyArIENQU1cyX0hPU1RfUE9SVF9PRkZTRVQ7Ci0JCXByaXYtPmNwdHMtPnJlZyAgICAgID0gc3NfcmVncyArIENQU1cyX0NQVFNfT0ZGU0VUOwotCQlwcml2LT5od19zdGF0cwkgICAgID0gc3NfcmVncyArIENQU1cyX0hXX1NUQVRTOworCQljcHN3LT5ob3N0X3BvcnRfcmVncyA9IHNzX3JlZ3MgKyBDUFNXMl9IT1NUX1BPUlRfT0ZGU0VUOworCQljcHN3LT5jcHRzLT5yZWcgICAgICA9IHNzX3JlZ3MgKyBDUFNXMl9DUFRTX09GRlNFVDsKKwkJY3Bzdy0+aHdfc3RhdHMJICAgICA9IHNzX3JlZ3MgKyBDUFNXMl9IV19TVEFUUzsKIAkJZG1hX3BhcmFtcy5kbWFyZWdzICAgPSBzc19yZWdzICsgQ1BTVzJfQ1BETUFfT0ZGU0VUOwogCQlkbWFfcGFyYW1zLnR4aGRwICAgICA9IHNzX3JlZ3MgKyBDUFNXMl9TVEFURVJBTV9PRkZTRVQ7CiAJCWFsZV9wYXJhbXMuYWxlX3JlZ3MgID0gc3NfcmVncyArIENQU1cyX0FMRV9PRkZTRVQ7CkBAIC0yNDE1LDEzICsyNjgyLDE0IEBACiAJCQkodTMyIF9fZm9yY2UpIHNzX3Jlcy0+c3RhcnQgKyBDUFNXMl9CRF9PRkZTRVQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIocHJpdi0+ZGV2LCAidW5rbm93biB2ZXJzaW9uIDB4JTA4eFxuIiwgcHJpdi0+dmVyc2lvbik7CisJCWRldl9lcnIocHJpdi0+ZGV2LCAidW5rbm93biB2ZXJzaW9uIDB4JTA4eFxuIiwgY3Bzdy0+dmVyc2lvbik7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gY2xlYW5fcnVudGltZV9kaXNhYmxlX3JldDsKIAl9Ci0JZm9yIChpID0gMDsgaSA8IHByaXYtPmRhdGEuc2xhdmVzOyBpKyspIHsKLQkJc3RydWN0IGNwc3dfc2xhdmUgKnNsYXZlID0gJnByaXYtPnNsYXZlc1tpXTsKLQkJY3Bzd19zbGF2ZV9pbml0KHNsYXZlLCBwcml2LCBzbGF2ZV9vZmZzZXQsIHNsaXZlcl9vZmZzZXQpOworCWZvciAoaSA9IDA7IGkgPCBjcHN3LT5kYXRhLnNsYXZlczsgaSsrKSB7CisJCXN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSA9ICZjcHN3LT5zbGF2ZXNbaV07CisKKwkJY3Bzd19zbGF2ZV9pbml0KHNsYXZlLCBjcHN3LCBzbGF2ZV9vZmZzZXQsIHNsaXZlcl9vZmZzZXQpOwogCQlzbGF2ZV9vZmZzZXQgICs9IHNsYXZlX3NpemU7CiAJCXNsaXZlcl9vZmZzZXQgKz0gU0xJVkVSX1NJWkU7CiAJfQpAQCAtMjQ0MSwxOSArMjcwOSwxNiBAQAogCWRtYV9wYXJhbXMuaGFzX2V4dF9yZWdzCQk9IHRydWU7CiAJZG1hX3BhcmFtcy5kZXNjX2h3X2FkZHIgICAgICAgICA9IGRtYV9wYXJhbXMuZGVzY19tZW1fcGh5czsKIAotCXByaXYtPmRtYSA9IGNwZG1hX2N0bHJfY3JlYXRlKCZkbWFfcGFyYW1zKTsKLQlpZiAoIXByaXYtPmRtYSkgeworCWNwc3ctPmRtYSA9IGNwZG1hX2N0bHJfY3JlYXRlKCZkbWFfcGFyYW1zKTsKKwlpZiAoIWNwc3ctPmRtYSkgewogCQlkZXZfZXJyKHByaXYtPmRldiwgImVycm9yIGluaXRpYWxpemluZyBkbWFcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGNsZWFuX3J1bnRpbWVfZGlzYWJsZV9yZXQ7CiAJfQogCi0JcHJpdi0+dHhjaCA9IGNwZG1hX2NoYW5fY3JlYXRlKHByaXYtPmRtYSwgdHhfY2hhbl9udW0oMCksCi0JCQkJICAgICAgIGNwc3dfdHhfaGFuZGxlcik7Ci0JcHJpdi0+cnhjaCA9IGNwZG1hX2NoYW5fY3JlYXRlKHByaXYtPmRtYSwgcnhfY2hhbl9udW0oMCksCi0JCQkJICAgICAgIGNwc3dfcnhfaGFuZGxlcik7Ci0KLQlpZiAoV0FSTl9PTighcHJpdi0+dHhjaCB8fCAhcHJpdi0+cnhjaCkpIHsKKwljcHN3LT50eGNoWzBdID0gY3BkbWFfY2hhbl9jcmVhdGUoY3Bzdy0+ZG1hLCAwLCBjcHN3X3R4X2hhbmRsZXIsIDApOworCWNwc3ctPnJ4Y2hbMF0gPSBjcGRtYV9jaGFuX2NyZWF0ZShjcHN3LT5kbWEsIDAsIGNwc3dfcnhfaGFuZGxlciwgMSk7CisJaWYgKFdBUk5fT04oIWNwc3ctPnJ4Y2hbMF0gfHwgIWNwc3ctPnR4Y2hbMF0pKSB7CiAJCWRldl9lcnIocHJpdi0+ZGV2LCAiZXJyb3IgaW5pdGlhbGl6aW5nIGRtYSBjaGFubmVsc1xuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gY2xlYW5fZG1hX3JldDsKQEAgLTI0NjQsOCArMjcyOSw4IEBACiAJYWxlX3BhcmFtcy5hbGVfZW50cmllcwkJPSBkYXRhLT5hbGVfZW50cmllczsKIAlhbGVfcGFyYW1zLmFsZV9wb3J0cwkJPSBkYXRhLT5zbGF2ZXM7CiAKLQlwcml2LT5hbGUgPSBjcHN3X2FsZV9jcmVhdGUoJmFsZV9wYXJhbXMpOwotCWlmICghcHJpdi0+YWxlKSB7CisJY3Bzdy0+YWxlID0gY3Bzd19hbGVfY3JlYXRlKCZhbGVfcGFyYW1zKTsKKwlpZiAoIWNwc3ctPmFsZSkgewogCQlkZXZfZXJyKHByaXYtPmRldiwgImVycm9yIGluaXRpYWxpemluZyBhbGUgZW5naW5lXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBjbGVhbl9kbWFfcmV0OwpAQCAtMjQ4Miw3ICsyNzQ3LDcgQEAKIAlpZiAob2ZfaWQpIHsKIAkJcGRldi0+aWRfZW50cnkgPSBvZl9pZC0+ZGF0YTsKIAkJaWYgKHBkZXYtPmlkX2VudHJ5LT5kcml2ZXJfZGF0YSkKLQkJCXByaXYtPnF1aXJrX2lycSA9IHRydWU7CisJCQljcHN3LT5xdWlya19pcnEgPSB0cnVlOwogCX0KIAogCS8qIEdyYWIgUlggYW5kIFRYIElSUXMuIE5vdGUgdGhhdCB3ZSBhbHNvIGhhdmUgUlhfVEhSRVNIT0xEIGFuZApAQCAtMjUwMCw5ICsyNzY1LDkgQEAKIAkJZ290byBjbGVhbl9hbGVfcmV0OwogCX0KIAotCXByaXYtPmlycXNfdGFibGVbMF0gPSBpcnE7CisJY3Bzdy0+aXJxc190YWJsZVswXSA9IGlycTsKIAlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgY3Bzd19yeF9pbnRlcnJ1cHQsCi0JCQkgICAgICAgMCwgZGV2X25hbWUoJnBkZXYtPmRldiksIHByaXYpOworCQkJICAgICAgIDAsIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBjcHN3KTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKHByaXYtPmRldiwgImVycm9yIGF0dGFjaGluZyBpcnEgKCVkKVxuIiwgcmV0KTsKIAkJZ290byBjbGVhbl9hbGVfcmV0OwpAQCAtMjUxNSwyMSArMjc4MCwyMCBAQAogCQlnb3RvIGNsZWFuX2FsZV9yZXQ7CiAJfQogCi0JcHJpdi0+aXJxc190YWJsZVsxXSA9IGlycTsKKwljcHN3LT5pcnFzX3RhYmxlWzFdID0gaXJxOwogCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCBjcHN3X3R4X2ludGVycnVwdCwKLQkJCSAgICAgICAwLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgcHJpdik7CisJCQkgICAgICAgMCwgZGV2X25hbWUoJnBkZXYtPmRldiksIGNwc3cpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIocHJpdi0+ZGV2LCAiZXJyb3IgYXR0YWNoaW5nIGlycSAoJWQpXG4iLCByZXQpOwogCQlnb3RvIGNsZWFuX2FsZV9yZXQ7CiAJfQotCXByaXYtPm51bV9pcnFzID0gMjsKIAogCW5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9DVEFHX0ZJTFRFUjsKIAogCW5kZXYtPm5ldGRldl9vcHMgPSAmY3Bzd19uZXRkZXZfb3BzOwogCW5kZXYtPmV0aHRvb2xfb3BzID0gJmNwc3dfZXRodG9vbF9vcHM7Ci0JbmV0aWZfbmFwaV9hZGQobmRldiwgJnByaXYtPm5hcGlfcngsIGNwc3dfcnhfcG9sbCwgQ1BTV19QT0xMX1dFSUdIVCk7Ci0JbmV0aWZfdHhfbmFwaV9hZGQobmRldiwgJnByaXYtPm5hcGlfdHgsIGNwc3dfdHhfcG9sbCwgQ1BTV19QT0xMX1dFSUdIVCk7CisJbmV0aWZfbmFwaV9hZGQobmRldiwgJmNwc3ctPm5hcGlfcngsIGNwc3dfcnhfcG9sbCwgQ1BTV19QT0xMX1dFSUdIVCk7CisJbmV0aWZfdHhfbmFwaV9hZGQobmRldiwgJmNwc3ctPm5hcGlfdHgsIGNwc3dfdHhfcG9sbCwgQ1BTV19QT0xMX1dFSUdIVCk7CiAKIAkvKiByZWdpc3RlciB0aGUgbmV0d29yayBkZXZpY2UgKi8KIAlTRVRfTkVUREVWX0RFVihuZGV2LCAmcGRldi0+ZGV2KTsKQEAgLTI1NDMsOCArMjgwNyw4IEBACiAJY3Bzd19ub3RpY2UocHJpdiwgcHJvYmUsICJpbml0aWFsaXplZCBkZXZpY2UgKHJlZ3MgJXBhLCBpcnEgJWQpXG4iLAogCQkgICAgJnNzX3Jlcy0+c3RhcnQsIG5kZXYtPmlycSk7CiAKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpIHsKLQkJcmV0ID0gY3Bzd19wcm9iZV9kdWFsX2VtYWMocGRldiwgcHJpdik7CisJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKSB7CisJCXJldCA9IGNwc3dfcHJvYmVfZHVhbF9lbWFjKHByaXYpOwogCQlpZiAocmV0KSB7CiAJCQljcHN3X2Vycihwcml2LCBwcm9iZSwgImVycm9yIHByb2JlIHNsYXZlIDIgZW1hYyBpbnRlcmZhY2VcbiIpOwogCQkJZ290byBjbGVhbl9hbGVfcmV0OwpAQCAtMjU1NCw5ICsyODE4LDkgQEAKIAlyZXR1cm4gMDsKIAogY2xlYW5fYWxlX3JldDoKLQljcHN3X2FsZV9kZXN0cm95KHByaXYtPmFsZSk7CisJY3Bzd19hbGVfZGVzdHJveShjcHN3LT5hbGUpOwogY2xlYW5fZG1hX3JldDoKLQljcGRtYV9jdGxyX2Rlc3Ryb3kocHJpdi0+ZG1hKTsKKwljcGRtYV9jdGxyX2Rlc3Ryb3koY3Bzdy0+ZG1hKTsKIGNsZWFuX3J1bnRpbWVfZGlzYWJsZV9yZXQ6CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogY2xlYW5fbmRldl9yZXQ6CkBAIC0yNTY3LDcgKzI4MzEsNyBAQAogc3RhdGljIGludCBjcHN3X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKIAlpbnQgcmV0OwogCiAJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmcGRldi0+ZGV2KTsKQEAgLTI1NzYsMTcgKzI4NDAsMTcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpCi0JCXVucmVnaXN0ZXJfbmV0ZGV2KGNwc3dfZ2V0X3NsYXZlX25kZXYocHJpdiwgMSkpOworCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoY3Bzdy0+c2xhdmVzWzFdLm5kZXYpOwogCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOwogCi0JY3Bzd19hbGVfZGVzdHJveShwcml2LT5hbGUpOwotCWNwZG1hX2N0bHJfZGVzdHJveShwcml2LT5kbWEpOworCWNwc3dfYWxlX2Rlc3Ryb3koY3Bzdy0+YWxlKTsKKwljcGRtYV9jdGxyX2Rlc3Ryb3koY3Bzdy0+ZG1hKTsKIAlvZl9wbGF0Zm9ybV9kZXBvcHVsYXRlKCZwZGV2LT5kZXYpOwogCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwotCWlmIChwcml2LT5kYXRhLmR1YWxfZW1hYykKLQkJZnJlZV9uZXRkZXYoY3Bzd19nZXRfc2xhdmVfbmRldihwcml2LCAxKSk7CisJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKQorCQlmcmVlX25ldGRldihjcHN3LT5zbGF2ZXNbMV0ubmRldik7CiAJZnJlZV9uZXRkZXYobmRldik7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNTk2LDE0ICsyODYwLDE0IEBACiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlCSpuZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGNwc3dfcHJpdgkqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbgkqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKIAotCWlmIChwcml2LT5kYXRhLmR1YWxfZW1hYykgeworCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykgewogCQlpbnQgaTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+ZGF0YS5zbGF2ZXM7IGkrKykgewotCQkJaWYgKG5ldGlmX3J1bm5pbmcocHJpdi0+c2xhdmVzW2ldLm5kZXYpKQotCQkJCWNwc3dfbmRvX3N0b3AocHJpdi0+c2xhdmVzW2ldLm5kZXYpOworCQlmb3IgKGkgPSAwOyBpIDwgY3Bzdy0+ZGF0YS5zbGF2ZXM7IGkrKykgeworCQkJaWYgKG5ldGlmX3J1bm5pbmcoY3Bzdy0+c2xhdmVzW2ldLm5kZXYpKQorCQkJCWNwc3dfbmRvX3N0b3AoY3Bzdy0+c2xhdmVzW2ldLm5kZXYpOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKG5ldGlmX3J1bm5pbmcobmRldikpCkBAIC0yNjExLDcgKzI4NzUsNyBAQAogCX0KIAogCS8qIFNlbGVjdCBzbGVlcCBwaW4gc3RhdGUgKi8KLQlwaW5jdHJsX3BtX3NlbGVjdF9zbGVlcF9zdGF0ZSgmcGRldi0+ZGV2KTsKKwlwaW5jdHJsX3BtX3NlbGVjdF9zbGVlcF9zdGF0ZShkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNjIwLDE3ICsyODg0LDE3IEBACiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlCSpuZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGNwc3dfcHJpdgkqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbgkqY3BzdyA9IG5ldGRldl9wcml2KG5kZXYpOwogCiAJLyogU2VsZWN0IGRlZmF1bHQgcGluIHN0YXRlICovCi0JcGluY3RybF9wbV9zZWxlY3RfZGVmYXVsdF9zdGF0ZSgmcGRldi0+ZGV2KTsKKwlwaW5jdHJsX3BtX3NlbGVjdF9kZWZhdWx0X3N0YXRlKGRldik7CiAKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpIHsKKwlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpIHsKIAkJaW50IGk7CiAKLQkJZm9yIChpID0gMDsgaSA8IHByaXYtPmRhdGEuc2xhdmVzOyBpKyspIHsKLQkJCWlmIChuZXRpZl9ydW5uaW5nKHByaXYtPnNsYXZlc1tpXS5uZGV2KSkKLQkJCQljcHN3X25kb19vcGVuKHByaXYtPnNsYXZlc1tpXS5uZGV2KTsKKwkJZm9yIChpID0gMDsgaSA8IGNwc3ctPmRhdGEuc2xhdmVzOyBpKyspIHsKKwkJCWlmIChuZXRpZl9ydW5uaW5nKGNwc3ctPnNsYXZlc1tpXS5uZGV2KSkKKwkJCQljcHN3X25kb19vcGVuKGNwc3ctPnNsYXZlc1tpXS5uZGV2KTsKIAkJfQogCX0gZWxzZSB7CiAJCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9jcGRtYS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9jcGRtYS5jCmluZGV4IDE5ZTVmMzIuLmMzZjM1ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfY3BkbWEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2NwZG1hLmMKQEAgLTg2LDcgKzg2LDcgQEAKIAl2b2lkIF9faW9tZW0JCSppb21hcDsJCS8qIGlvcmVtYXAgbWFwICovCiAJdm9pZAkJCSpjcHVtYXA7CS8qIGRtYV9hbGxvYyBtYXAgKi8KIAlpbnQJCQlkZXNjX3NpemUsIG1lbV9zaXplOwotCWludAkJCW51bV9kZXNjLCB1c2VkX2Rlc2M7CisJaW50CQkJbnVtX2Rlc2M7CiAJc3RydWN0IGRldmljZQkJKmRldjsKIAlzdHJ1Y3QgZ2VuX3Bvb2wJCSpnZW5fcG9vbDsKIH07CkBAIC0xMDQsNiArMTA0LDcgQEAKIAlzdHJ1Y3QgY3BkbWFfZGVzY19wb29sCSpwb29sOwogCXNwaW5sb2NrX3QJCWxvY2s7CiAJc3RydWN0IGNwZG1hX2NoYW4JKmNoYW5uZWxzWzIgKiBDUERNQV9NQVhfQ0hBTk5FTFNdOworCWludCBjaGFuX251bTsKIH07CiAKIHN0cnVjdCBjcGRtYV9jaGFuIHsKQEAgLTEyMyw2ICsxMjQsMTMgQEAKIAlpbnQJaW50X3NldCwgaW50X2NsZWFyLCB0ZDsKIH07CiAKKyNkZWZpbmUgdHhfY2hhbl9udW0oY2hhbikJKGNoYW4pCisjZGVmaW5lIHJ4X2NoYW5fbnVtKGNoYW4pCSgoY2hhbikgKyBDUERNQV9NQVhfQ0hBTk5FTFMpCisjZGVmaW5lIGlzX3J4X2NoYW4oY2hhbikJKChjaGFuKS0+Y2hhbl9udW0gPj0gQ1BETUFfTUFYX0NIQU5ORUxTKQorI2RlZmluZSBpc190eF9jaGFuKGNoYW4pCSghaXNfcnhfY2hhbihjaGFuKSkKKyNkZWZpbmUgX19jaGFuX2xpbmVhcihjaGFuX251bSkJKChjaGFuX251bSkgJiAoQ1BETUFfTUFYX0NIQU5ORUxTIC0gMSkpCisjZGVmaW5lIGNoYW5fbGluZWFyKGNoYW4pCV9fY2hhbl9saW5lYXIoKGNoYW4pLT5jaGFuX251bSkKKwogLyogVGhlIGZvbGxvd2luZyBtYWtlIGFjY2VzcyB0byBjb21tb24gY3BkbWFfY3RsciBwYXJhbXMgbW9yZSByZWFkYWJsZSAqLwogI2RlZmluZSBkbWFyZWdzCQlwYXJhbXMuZG1hcmVncwogI2RlZmluZSBudW1fY2hhbglwYXJhbXMubnVtX2NoYW4KQEAgLTE0OCw3ICsxNTYsMTAgQEAKIAlpZiAoIXBvb2wpCiAJCXJldHVybjsKIAotCVdBUk5fT04ocG9vbC0+dXNlZF9kZXNjKTsKKwlXQVJOKGdlbl9wb29sX3NpemUocG9vbC0+Z2VuX3Bvb2wpICE9IGdlbl9wb29sX2F2YWlsKHBvb2wtPmdlbl9wb29sKSwKKwkgICAgICJjcGRtYV9kZXNjX3Bvb2wgc2l6ZSAlZCAhPSBhdmFpbCAlZCIsCisJICAgICBnZW5fcG9vbF9zaXplKHBvb2wtPmdlbl9wb29sKSwKKwkgICAgIGdlbl9wb29sX2F2YWlsKHBvb2wtPmdlbl9wb29sKSk7CiAJaWYgKHBvb2wtPmNwdW1hcCkKIAkJZG1hX2ZyZWVfY29oZXJlbnQocG9vbC0+ZGV2LCBwb29sLT5tZW1fc2l6ZSwgcG9vbC0+Y3B1bWFwLAogCQkJCSAgcG9vbC0+cGh5cyk7CkBAIC0yMzIsMjEgKzI0MywxNCBAQAogc3RhdGljIHN0cnVjdCBjcGRtYV9kZXNjIF9faW9tZW0gKgogY3BkbWFfZGVzY19hbGxvYyhzdHJ1Y3QgY3BkbWFfZGVzY19wb29sICpwb29sKQogewotCXN0cnVjdCBjcGRtYV9kZXNjIF9faW9tZW0gKmRlc2MgPSBOVUxMOwotCi0JZGVzYyA9IChzdHJ1Y3QgY3BkbWFfZGVzYyBfX2lvbWVtICopZ2VuX3Bvb2xfYWxsb2MocG9vbC0+Z2VuX3Bvb2wsCi0JCQkJCQkJICAgcG9vbC0+ZGVzY19zaXplKTsKLQlpZiAoZGVzYykKLQkJcG9vbC0+dXNlZF9kZXNjKys7Ci0KLQlyZXR1cm4gZGVzYzsKKwlyZXR1cm4gKHN0cnVjdCBjcGRtYV9kZXNjIF9faW9tZW0gKikKKwkJZ2VuX3Bvb2xfYWxsb2MocG9vbC0+Z2VuX3Bvb2wsIHBvb2wtPmRlc2Nfc2l6ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNwZG1hX2Rlc2NfZnJlZShzdHJ1Y3QgY3BkbWFfZGVzY19wb29sICpwb29sLAogCQkJICAgIHN0cnVjdCBjcGRtYV9kZXNjIF9faW9tZW0gKmRlc2MsIGludCBudW1fZGVzYykKIHsKIAlnZW5fcG9vbF9mcmVlKHBvb2wtPmdlbl9wb29sLCAodW5zaWduZWQgbG9uZylkZXNjLCBwb29sLT5kZXNjX3NpemUpOwotCXBvb2wtPnVzZWRfZGVzYy0tOwogfQogCiBzdHJ1Y3QgY3BkbWFfY3RsciAqY3BkbWFfY3Rscl9jcmVhdGUoc3RydWN0IGNwZG1hX3BhcmFtcyAqcGFyYW1zKQpAQCAtMjYwLDYgKzI2NCw3IEBACiAJY3Rsci0+c3RhdGUgPSBDUERNQV9TVEFURV9JRExFOwogCWN0bHItPnBhcmFtcyA9ICpwYXJhbXM7CiAJY3Rsci0+ZGV2ID0gcGFyYW1zLT5kZXY7CisJY3Rsci0+Y2hhbl9udW0gPSAwOwogCXNwaW5fbG9ja19pbml0KCZjdGxyLT5sb2NrKTsKIAogCWN0bHItPnBvb2wgPSBjcGRtYV9kZXNjX3Bvb2xfY3JlYXRlKGN0bHItPmRldiwKQEAgLTMzNiwxMiArMzQxLDE0IEBACiAJfQogCiAJY3Rsci0+c3RhdGUgPSBDUERNQV9TVEFURV9URUFSRE9XTjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdGxyLT5sb2NrLCBmbGFncyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdGxyLT5jaGFubmVscyk7IGkrKykgewogCQlpZiAoY3Rsci0+Y2hhbm5lbHNbaV0pCiAJCQljcGRtYV9jaGFuX3N0b3AoY3Rsci0+Y2hhbm5lbHNbaV0pOwogCX0KIAorCXNwaW5fbG9ja19pcnFzYXZlKCZjdGxyLT5sb2NrLCBmbGFncyk7CiAJZG1hX3JlZ193cml0ZShjdGxyLCBDUERNQV9SWElOVE1BU0tDTEVBUiwgMHhmZmZmZmZmZik7CiAJZG1hX3JlZ193cml0ZShjdGxyLCBDUERNQV9UWElOVE1BU0tDTEVBUiwgMHhmZmZmZmZmZik7CiAKQEAgLTQwMywxMyArNDEwLDUyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcGRtYV9jdGxyX2VvaSk7CiAKLXN0cnVjdCBjcGRtYV9jaGFuICpjcGRtYV9jaGFuX2NyZWF0ZShzdHJ1Y3QgY3BkbWFfY3RsciAqY3RsciwgaW50IGNoYW5fbnVtLAotCQkJCSAgICAgY3BkbWFfaGFuZGxlcl9mbiBoYW5kbGVyKQordTMyIGNwZG1hX2N0cmxfcnhjaHNfc3RhdGUoc3RydWN0IGNwZG1hX2N0bHIgKmN0bHIpCiB7CisJcmV0dXJuIGRtYV9yZWdfcmVhZChjdGxyLCBDUERNQV9SWElOVFNUQVRNQVNLRUQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3BkbWFfY3RybF9yeGNoc19zdGF0ZSk7CisKK3UzMiBjcGRtYV9jdHJsX3R4Y2hzX3N0YXRlKHN0cnVjdCBjcGRtYV9jdGxyICpjdGxyKQoreworCXJldHVybiBkbWFfcmVnX3JlYWQoY3RsciwgQ1BETUFfVFhJTlRTVEFUTUFTS0VEKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNwZG1hX2N0cmxfdHhjaHNfc3RhdGUpOworCisvKioKKyAqIGNwZG1hX2NoYW5fc3BsaXRfcG9vbCAtIFNwbGl0cyBjdHJsIHBvb2wgYmV0d2VlbiBhbGwgY2hhbm5lbHMuCisgKiBIYXMgdG8gYmUgY2FsbGVkIHVuZGVyIGN0bHIgbG9jaworICovCitzdGF0aWMgdm9pZCBjcGRtYV9jaGFuX3NwbGl0X3Bvb2woc3RydWN0IGNwZG1hX2N0bHIgKmN0bHIpCit7CisJc3RydWN0IGNwZG1hX2Rlc2NfcG9vbCAqcG9vbCA9IGN0bHItPnBvb2w7CiAJc3RydWN0IGNwZG1hX2NoYW4gKmNoYW47Ci0JaW50IG9mZnNldCA9IChjaGFuX251bSAlIENQRE1BX01BWF9DSEFOTkVMUykgKiA0OworCWludCBjaF9kZXNjX251bTsKKwlpbnQgaTsKKworCWlmICghY3Rsci0+Y2hhbl9udW0pCisJCXJldHVybjsKKworCS8qIGNhbGN1bGF0ZSBhdmVyYWdlIHNpemUgb2YgcG9vbCBzbGljZSAqLworCWNoX2Rlc2NfbnVtID0gcG9vbC0+bnVtX2Rlc2MgLyBjdGxyLT5jaGFuX251bTsKKworCS8qIHNwbGl0IGN0bHIgcG9vbCAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGN0bHItPmNoYW5uZWxzKTsgaSsrKSB7CisJCWNoYW4gPSBjdGxyLT5jaGFubmVsc1tpXTsKKwkJaWYgKGNoYW4pCisJCQljaGFuLT5kZXNjX251bSA9IGNoX2Rlc2NfbnVtOworCX0KK30KKworc3RydWN0IGNwZG1hX2NoYW4gKmNwZG1hX2NoYW5fY3JlYXRlKHN0cnVjdCBjcGRtYV9jdGxyICpjdGxyLCBpbnQgY2hhbl9udW0sCisJCQkJICAgICBjcGRtYV9oYW5kbGVyX2ZuIGhhbmRsZXIsIGludCByeF90eXBlKQoreworCWludCBvZmZzZXQgPSBjaGFuX251bSAqIDQ7CisJc3RydWN0IGNwZG1hX2NoYW4gKmNoYW47CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWNoYW5fbnVtID0gcnhfdHlwZSA/IHJ4X2NoYW5fbnVtKGNoYW5fbnVtKSA6IHR4X2NoYW5fbnVtKGNoYW5fbnVtKTsKKwogCWlmIChfX2NoYW5fbGluZWFyKGNoYW5fbnVtKSA+PSBjdGxyLT5udW1fY2hhbikKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTQ1MSwxNCArNDk3LDI1IEBACiAJc3Bpbl9sb2NrX2luaXQoJmNoYW4tPmxvY2spOwogCiAJY3Rsci0+Y2hhbm5lbHNbY2hhbl9udW1dID0gY2hhbjsKKwljdGxyLT5jaGFuX251bSsrOworCisJY3BkbWFfY2hhbl9zcGxpdF9wb29sKGN0bHIpOworCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3Rsci0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBjaGFuOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3BkbWFfY2hhbl9jcmVhdGUpOwogCi1pbnQgY3BkbWFfY2hhbl9nZXRfcnhfYnVmX251bShzdHJ1Y3QgY3BkbWFfY3RsciAqY3RscikKK2ludCBjcGRtYV9jaGFuX2dldF9yeF9idWZfbnVtKHN0cnVjdCBjcGRtYV9jaGFuICpjaGFuKQogewotCXJldHVybiBjdGxyLT5wb29sLT5udW1fZGVzYyAvIDI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZGVzY19udW07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+bG9jaywgZmxhZ3MpOworCWRlc2NfbnVtID0gY2hhbi0+ZGVzY19udW07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGRlc2NfbnVtOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3BkbWFfY2hhbl9nZXRfcnhfYnVmX251bSk7CiAKQEAgLTQ3NSw2ICs1MzIsMTAgQEAKIAlpZiAoY2hhbi0+c3RhdGUgIT0gQ1BETUFfU1RBVEVfSURMRSkKIAkJY3BkbWFfY2hhbl9zdG9wKGNoYW4pOwogCWN0bHItPmNoYW5uZWxzW2NoYW4tPmNoYW5fbnVtXSA9IE5VTEw7CisJY3Rsci0+Y2hhbl9udW0tLTsKKworCWNwZG1hX2NoYW5fc3BsaXRfcG9vbChjdGxyKTsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0bHItPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfY3BkbWEuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfY3BkbWEuaAppbmRleCA0YjQ2Y2Q2Li5hMDdiMjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2NwZG1hLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9jcGRtYS5oCkBAIC0xNywxMyArMTcsNiBAQAogCiAjZGVmaW5lIENQRE1BX01BWF9DSEFOTkVMUwlCSVRTX1BFUl9MT05HCiAKLSNkZWZpbmUgdHhfY2hhbl9udW0oY2hhbikJKGNoYW4pCi0jZGVmaW5lIHJ4X2NoYW5fbnVtKGNoYW4pCSgoY2hhbikgKyBDUERNQV9NQVhfQ0hBTk5FTFMpCi0jZGVmaW5lIGlzX3J4X2NoYW4oY2hhbikJKChjaGFuKS0+Y2hhbl9udW0gPj0gQ1BETUFfTUFYX0NIQU5ORUxTKQotI2RlZmluZSBpc190eF9jaGFuKGNoYW4pCSghaXNfcnhfY2hhbihjaGFuKSkKLSNkZWZpbmUgX19jaGFuX2xpbmVhcihjaGFuX251bSkJKChjaGFuX251bSkgJiAoQ1BETUFfTUFYX0NIQU5ORUxTIC0gMSkpCi0jZGVmaW5lIGNoYW5fbGluZWFyKGNoYW4pCV9fY2hhbl9saW5lYXIoKGNoYW4pLT5jaGFuX251bSkKLQogI2RlZmluZSBDUERNQV9SWF9TT1VSQ0VfUE9SVChfX3N0YXR1c19fKQkoKF9fc3RhdHVzX18gPj4gMTYpICYgMHg3KQogCiAjZGVmaW5lIENQRE1BX0VPSV9SWF9USFJFU0gJMHgwCkBAIC03OSw4ICs3Miw4IEBACiBpbnQgY3BkbWFfY3Rscl9zdG9wKHN0cnVjdCBjcGRtYV9jdGxyICpjdGxyKTsKIAogc3RydWN0IGNwZG1hX2NoYW4gKmNwZG1hX2NoYW5fY3JlYXRlKHN0cnVjdCBjcGRtYV9jdGxyICpjdGxyLCBpbnQgY2hhbl9udW0sCi0JCQkJICAgICBjcGRtYV9oYW5kbGVyX2ZuIGhhbmRsZXIpOwotaW50IGNwZG1hX2NoYW5fZ2V0X3J4X2J1Zl9udW0oc3RydWN0IGNwZG1hX2N0bHIgKmN0bHIpOworCQkJCSAgICAgY3BkbWFfaGFuZGxlcl9mbiBoYW5kbGVyLCBpbnQgcnhfdHlwZSk7CitpbnQgY3BkbWFfY2hhbl9nZXRfcnhfYnVmX251bShzdHJ1Y3QgY3BkbWFfY2hhbiAqY2hhbik7CiBpbnQgY3BkbWFfY2hhbl9kZXN0cm95KHN0cnVjdCBjcGRtYV9jaGFuICpjaGFuKTsKIGludCBjcGRtYV9jaGFuX3N0YXJ0KHN0cnVjdCBjcGRtYV9jaGFuICpjaGFuKTsKIGludCBjcGRtYV9jaGFuX3N0b3Aoc3RydWN0IGNwZG1hX2NoYW4gKmNoYW4pOwpAQCAtOTQsNiArODcsOCBAQAogaW50IGNwZG1hX2N0bHJfaW50X2N0cmwoc3RydWN0IGNwZG1hX2N0bHIgKmN0bHIsIGJvb2wgZW5hYmxlKTsKIHZvaWQgY3BkbWFfY3Rscl9lb2koc3RydWN0IGNwZG1hX2N0bHIgKmN0bHIsIHUzMiB2YWx1ZSk7CiBpbnQgY3BkbWFfY2hhbl9pbnRfY3RybChzdHJ1Y3QgY3BkbWFfY2hhbiAqY2hhbiwgYm9vbCBlbmFibGUpOwordTMyIGNwZG1hX2N0cmxfcnhjaHNfc3RhdGUoc3RydWN0IGNwZG1hX2N0bHIgKmN0bHIpOwordTMyIGNwZG1hX2N0cmxfdHhjaHNfc3RhdGUoc3RydWN0IGNwZG1hX2N0bHIgKmN0bHIpOwogYm9vbCBjcGRtYV9jaGVja19mcmVlX3R4X2Rlc2Moc3RydWN0IGNwZG1hX2NoYW4gKmNoYW4pOwogCiBlbnVtIGNwZG1hX2NvbnRyb2wgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9lbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2VtYWMuYwppbmRleCA3MjdhNzlmLi4yZmQ5NGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2VtYWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2VtYWMuYwpAQCAtNTk3LDE0ICs1OTcsMTQgQEAKIH0KIAogLyoqCi0gKiBoYXNoX2FkZCAtIEhhc2ggZnVuY3Rpb24gdG8gYWRkIG1hYyBhZGRyIGZyb20gaGFzaCB0YWJsZQorICogZW1hY19oYXNoX2FkZCAtIEhhc2ggZnVuY3Rpb24gdG8gYWRkIG1hYyBhZGRyIGZyb20gaGFzaCB0YWJsZQogICogQHByaXY6IFRoZSBEYVZpbmNpIEVNQUMgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogICogQG1hY19hZGRyOiBtYWMgYWRkcmVzcyB0byBkZWxldGUgZnJvbSBoYXNoIHRhYmxlCiAgKgogICogQWRkcyBtYWMgYWRkcmVzcyB0byB0aGUgaW50ZXJuYWwgaGFzaCB0YWJsZQogICoKICAqLwotc3RhdGljIGludCBoYXNoX2FkZChzdHJ1Y3QgZW1hY19wcml2ICpwcml2LCB1OCAqbWFjX2FkZHIpCitzdGF0aWMgaW50IGVtYWNfaGFzaF9hZGQoc3RydWN0IGVtYWNfcHJpdiAqcHJpdiwgdTggKm1hY19hZGRyKQogewogCXN0cnVjdCBkZXZpY2UgKmVtYWNfZGV2ID0gJnByaXYtPm5kZXYtPmRldjsKIAl1MzIgcmMgPSAwOwpAQCAtNjEzLDcgKzYxMyw3IEBACiAKIAlpZiAoaGFzaF92YWx1ZSA+PSBFTUFDX05VTV9NVUxUSUNBU1RfQklUUykgewogCQlpZiAobmV0aWZfbXNnX2Rydihwcml2KSkgewotCQkJZGV2X2VycihlbWFjX2RldiwgIkRhVmluY2kgRU1BQzogaGFzaF9hZGQoKTogSW52YWxpZCAiXAorCQkJZGV2X2VycihlbWFjX2RldiwgIkRhVmluY2kgRU1BQzogZW1hY19oYXNoX2FkZCgpOiBJbnZhbGlkICJcCiAJCQkJIkhhc2ggJTA4eCwgc2hvdWxkIG5vdCBiZSBncmVhdGVyIHRoYW4gJTA4eCIsCiAJCQkJaGFzaF92YWx1ZSwgKEVNQUNfTlVNX01VTFRJQ0FTVF9CSVRTIC0gMSkpOwogCQl9CkBAIC02MzksMTQgKzYzOSwxNCBAQAogfQogCiAvKioKLSAqIGhhc2hfZGVsIC0gSGFzaCBmdW5jdGlvbiB0byBkZWxldGUgbWFjIGFkZHIgZnJvbSBoYXNoIHRhYmxlCisgKiBlbWFjX2hhc2hfZGVsIC0gSGFzaCBmdW5jdGlvbiB0byBkZWxldGUgbWFjIGFkZHIgZnJvbSBoYXNoIHRhYmxlCiAgKiBAcHJpdjogVGhlIERhVmluY2kgRU1BQyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAgKiBAbWFjX2FkZHI6IG1hYyBhZGRyZXNzIHRvIGRlbGV0ZSBmcm9tIGhhc2ggdGFibGUKICAqCiAgKiBSZW1vdmVzIG1hYyBhZGRyZXNzIGZyb20gdGhlIGludGVybmFsIGhhc2ggdGFibGUKICAqCiAgKi8KLXN0YXRpYyBpbnQgaGFzaF9kZWwoc3RydWN0IGVtYWNfcHJpdiAqcHJpdiwgdTggKm1hY19hZGRyKQorc3RhdGljIGludCBlbWFjX2hhc2hfZGVsKHN0cnVjdCBlbWFjX3ByaXYgKnByaXYsIHU4ICptYWNfYWRkcikKIHsKIAl1MzIgaGFzaF92YWx1ZTsKIAl1MzIgaGFzaF9iaXQ7CkBAIC02OTYsMTAgKzY5NiwxMCBAQAogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIEVNQUNfTVVMVElDQVNUX0FERDoKLQkJdXBkYXRlID0gaGFzaF9hZGQocHJpdiwgbWFjX2FkZHIpOworCQl1cGRhdGUgPSBlbWFjX2hhc2hfYWRkKHByaXYsIG1hY19hZGRyKTsKIAkJYnJlYWs7CiAJY2FzZSBFTUFDX01VTFRJQ0FTVF9ERUw6Ci0JCXVwZGF0ZSA9IGhhc2hfZGVsKHByaXYsIG1hY19hZGRyKTsKKwkJdXBkYXRlID0gZW1hY19oYXNoX2RlbChwcml2LCBtYWNfYWRkcik7CiAJCWJyZWFrOwogCWNhc2UgRU1BQ19BTExfTVVMVElfU0VUOgogCQl1cGRhdGUgPSAxOwpAQCAtMTg3MCwxMCArMTg3MCwxMCBAQAogCQlnb3RvIG5vX3BkYXRhOwogCX0KIAotCXByaXYtPnR4Y2hhbiA9IGNwZG1hX2NoYW5fY3JlYXRlKHByaXYtPmRtYSwgdHhfY2hhbl9udW0oRU1BQ19ERUZfVFhfQ0gpLAotCQkJCSAgICAgICBlbWFjX3R4X2hhbmRsZXIpOwotCXByaXYtPnJ4Y2hhbiA9IGNwZG1hX2NoYW5fY3JlYXRlKHByaXYtPmRtYSwgcnhfY2hhbl9udW0oRU1BQ19ERUZfUlhfQ0gpLAotCQkJCSAgICAgICBlbWFjX3J4X2hhbmRsZXIpOworCXByaXYtPnR4Y2hhbiA9IGNwZG1hX2NoYW5fY3JlYXRlKHByaXYtPmRtYSwgRU1BQ19ERUZfVFhfQ0gsCisJCQkJCSBlbWFjX3R4X2hhbmRsZXIsIDApOworCXByaXYtPnJ4Y2hhbiA9IGNwZG1hX2NoYW5fY3JlYXRlKHByaXYtPmRtYSwgRU1BQ19ERUZfUlhfQ0gsCisJCQkJCSBlbWFjX3J4X2hhbmRsZXIsIDEpOwogCWlmIChXQVJOX09OKCFwcml2LT50eGNoYW4gfHwgIXByaXYtPnJ4Y2hhbikpIHsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIG5vX2NwZG1hX2NoYW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90b3NoaWJhL3BzM19nZWxpY19uZXQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5jCmluZGV4IDc5ZjBlYzQuLmJjMjU4ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5jCkBAIC0xNzkxLDcgKzE3OTEsNyBAQAogCWdlbGljX2NhcmRfZnJlZV9jaGFpbihjYXJkLCBjYXJkLT50eF9jaGFpbi5oZWFkKTsKIGZhaWxfYWxsb2NfdHg6CiAJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKLQluZXRkZXYtPmlycSA9IE5PX0lSUTsKKwluZXRkZXYtPmlycSA9IDA7CiBmYWlsX3JlcXVlc3RfaXJxOgogCXBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveShkZXYsIGNhcmQtPmlycSk7CiBmYWlsX2FsbG9jX2lycToKQEAgLTE4NDMsNyArMTg0Myw3IEBACiAJbmV0ZGV2MCA9IGNhcmQtPm5ldGRldltHRUxJQ19QT1JUX0VUSEVSTkVUXzBdOwogCS8qIGRpc2Nvbm5lY3QgZXZlbnQgcG9ydCAqLwogCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7Ci0JbmV0ZGV2MC0+aXJxID0gTk9fSVJROworCW5ldGRldjAtPmlycSA9IDA7CiAJcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KGNhcmQtPmRldiwgY2FyZC0+aXJxKTsKIAogCXdhaXRfZXZlbnQoY2FyZC0+d2FpdHEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90dW5kcmEvdHNpMTA4X2V0aC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdHVuZHJhL3RzaTEwOF9ldGguYwppbmRleCAwMWE3NzE0Li44ZmQxMzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90dW5kcmEvdHNpMTA4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3R1bmRyYS90c2kxMDhfZXRoLmMKQEAgLTE2Niw2ICsxNjYsNyBAQAogCiBzdGF0aWMgdm9pZCB0c2kxMDhfdGltZWRfY2hlY2tlcih1bnNpZ25lZCBsb25nIGRldl9wdHIpOwogCisjaWZkZWYgREVCVUcKIHN0YXRpYyB2b2lkIGR1bXBfZXRoX29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCB0c2kxMDhfcHJ2X2RhdGEgKmRhdGEgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMTkwLDYgKzE5MSw3IEBACiAJICAgICAgIFRTSV9SRUFEKFRTSTEwOF9FQ19SWEVTVEFUKSwKIAkgICAgICAgVFNJX1JFQUQoVFNJMTA4X0VDX1JYRVJSKSwgZGF0YS0+cnhwZW5kaW5nKTsKIH0KKyNlbmRpZgogCiAvKiBTeW5jaHJvbml6YXRpb24gaXMgbmVlZGVkIGJldHdlZW4gdGhlIHRocmVhZCBhbmQgdXAvZG93biBldmVudHMuCiAgKiBOb3RlIHRoYXQgdGhlIFBIWSBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBzYW1lIHJlZ2lzdGVycyBmb3IgYm90aApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdmlhL3ZpYS12ZWxvY2l0eS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdmlhL3ZpYS12ZWxvY2l0eS5jCmluZGV4IGYzODY5NmMuLjkwOGU3MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3ZpYS92aWEtdmVsb2NpdHkuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC92aWEvdmlhLXZlbG9jaXR5LmMKQEAgLTE3MjQsMjQgKzE3MjQsMjEgQEAKIAkJc3RydWN0IHZlbG9jaXR5X3RkX2luZm8gKnRkaW5mbywgc3RydWN0IHR4X2Rlc2MgKnRkKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSB0ZGluZm8tPnNrYjsKKwlpbnQgaTsKIAogCS8qCiAJICoJRG9uJ3QgdW5tYXAgdGhlIHByZS1hbGxvY2F0ZWQgdHhfYnVmcwogCSAqLwotCWlmICh0ZGluZm8tPnNrYl9kbWEpIHsKLQkJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHRkaW5mby0+bnNrYl9kbWE7IGkrKykgeworCQlzaXplX3QgcGt0bGVuID0gbWF4X3Qoc2l6ZV90LCBza2ItPmxlbiwgRVRIX1pMRU4pOwogCi0JCWZvciAoaSA9IDA7IGkgPCB0ZGluZm8tPm5za2JfZG1hOyBpKyspIHsKLQkJCXNpemVfdCBwa3RsZW4gPSBtYXhfdChzaXplX3QsIHNrYi0+bGVuLCBFVEhfWkxFTik7CisJCS8qIEZvciBzY2F0dGVyLWdhdGhlciAqLworCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA+IDApCisJCQlwa3RsZW4gPSBtYXhfdChzaXplX3QsIHBrdGxlbiwKKwkJCQkgICAgICAgdGQtPnRkX2J1ZltpXS5zaXplICYgflREX1FVRVVFKTsKIAotCQkJLyogRm9yIHNjYXR0ZXItZ2F0aGVyICovCi0JCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA+IDApCi0JCQkJcGt0bGVuID0gbWF4X3Qoc2l6ZV90LCBwa3RsZW4sCi0JCQkJCQl0ZC0+dGRfYnVmW2ldLnNpemUgJiB+VERfUVVFVUUpOwotCi0JCQlkbWFfdW5tYXBfc2luZ2xlKHZwdHItPmRldiwgdGRpbmZvLT5za2JfZG1hW2ldLAotCQkJCQlsZTE2X3RvX2NwdShwa3RsZW4pLCBETUFfVE9fREVWSUNFKTsKLQkJfQorCQlkbWFfdW5tYXBfc2luZ2xlKHZwdHItPmRldiwgdGRpbmZvLT5za2JfZG1hW2ldLAorCQkJCSBsZTE2X3RvX2NwdShwa3RsZW4pLCBETUFfVE9fREVWSUNFKTsKIAl9CiAJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKIAl0ZGluZm8tPnNrYiA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC9LY29uZmlnCmluZGV4IDRmNWMwMjQuLjZkNjhjOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC9LY29uZmlnCkBAIC01LDcgKzUsNyBAQAogY29uZmlnIE5FVF9WRU5ET1JfWElMSU5YCiAJYm9vbCAiWGlsaW54IGRldmljZXMiCiAJZGVmYXVsdCB5Ci0JZGVwZW5kcyBvbiBQUEMgfHwgUFBDMzIgfHwgTUlDUk9CTEFaRSB8fCBBUkNIX1pZTlEKKwlkZXBlbmRzIG9uIFBQQyB8fCBQUEMzMiB8fCBNSUNST0JMQVpFIHx8IEFSQ0hfWllOUSB8fCBNSVBTCiAJLS0taGVscC0tLQogCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBiZWxvbmdpbmcgdG8gdGhpcyBjbGFzcywgc2F5IFkuCiAKQEAgLTE4LDcgKzE4LDcgQEAKIAogY29uZmlnIFhJTElOWF9FTUFDTElURQogCXRyaXN0YXRlICJYaWxpbnggMTAvMTAwIEV0aGVybmV0IExpdGUgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIChQUEMzMiB8fCBNSUNST0JMQVpFIHx8IEFSQ0hfWllOUSkKKwlkZXBlbmRzIG9uIFBQQzMyIHx8IE1JQ1JPQkxBWkUgfHwgQVJDSF9aWU5RIHx8IE1JUFMKIAlzZWxlY3QgUEhZTElCCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIDEwLzEwMCBFdGhlcm5ldCBMaXRlIGZyb20gWGlsaW54LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L3hpbGlueF9heGllbmV0X21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC94aWxpbnhfYXhpZW5ldF9tYWluLmMKaW5kZXggMzZlZTdhYi4uNjllMmE4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L3hpbGlueF9heGllbmV0X21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngveGlsaW54X2F4aWVuZXRfbWFpbi5jCkBAIC0xMjk3LDcgKzEyOTcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGF4aWVuZXRfZXRodG9vbF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGF4aWVuZXRfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvICAgID0gYXhpZW5ldF9ldGh0b29sc19nZXRfZHJ2aW5mbywKIAkuZ2V0X3JlZ3NfbGVuICAgPSBheGllbmV0X2V0aHRvb2xzX2dldF9yZWdzX2xlbiwKIAkuZ2V0X3JlZ3MgICAgICAgPSBheGllbmV0X2V0aHRvb2xzX2dldF9yZWdzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L3hpbGlueF9lbWFjbGl0ZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L3hpbGlueF9lbWFjbGl0ZS5jCmluZGV4IDNjZWU4NGEuLjkzZGMxMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC94aWxpbnhfZW1hY2xpdGUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngveGlsaW54X2VtYWNsaXRlLmMKQEAgLTExMzEsMTEgKzExMzEsMTMgQEAKIAlscC0+cnhfcGluZ19wb25nID0gZ2V0X2Jvb2wob2ZkZXYsICJ4bG54LHJ4LXBpbmctcG9uZyIpOwogCW1hY19hZGRyZXNzID0gb2ZfZ2V0X21hY19hZGRyZXNzKG9mZGV2LT5kZXYub2Zfbm9kZSk7CiAKLQlpZiAobWFjX2FkZHJlc3MpCisJaWYgKG1hY19hZGRyZXNzKSB7CiAJCS8qIFNldCB0aGUgTUFDIGFkZHJlc3MuICovCiAJCW1lbWNweShuZGV2LT5kZXZfYWRkciwgbWFjX2FkZHJlc3MsIEVUSF9BTEVOKTsKLQllbHNlCi0JCWRldl93YXJuKGRldiwgIk5vIE1BQyBhZGRyZXNzIGZvdW5kXG4iKTsKKwl9IGVsc2UgeworCQlkZXZfd2FybihkZXYsICJObyBNQUMgYWRkcmVzcyBmb3VuZCwgdXNpbmcgcmFuZG9tXG4iKTsKKwkJZXRoX2h3X2FkZHJfcmFuZG9tKG5kZXYpOworCX0KIAogCS8qIENsZWFyIHRoZSBUeCBDU1IncyBpbiBjYXNlIHRoaXMgaXMgYSByZXN0YXJ0ICovCiAJX19yYXdfd3JpdGVsKDAsIGxwLT5iYXNlX2FkZHIgKyBYRUxfVFNSX09GRlNFVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mamVzL2ZqZXNfbWFpbi5jIGIvZHJpdmVycy9uZXQvZmplcy9mamVzX21haW4uYwppbmRleCA5MDA2ODc3Li5lNDZiMWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mamVzL2ZqZXNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2ZqZXMvZmplc19tYWluLmMKQEAgLTk3LDcgKzk3LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGZqZXNfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gRFJWX05BTUUsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAogCX0sCiAJLnByb2JlID0gZmplc19wcm9iZSwKIAkucmVtb3ZlID0gZmplc19yZW1vdmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYwppbmRleCA1YTFlOTg1Li40NzBiM2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogCiAjZGVmaW5lIEFYMjVfNlBBQ0tfSEVBREVSX0xFTiAwCiAKLXN0YXRpYyB2b2lkIHNpeHBhY2tfZGVjb2RlKHN0cnVjdCBzaXhwYWNrICosIHVuc2lnbmVkIGNoYXJbXSwgaW50KTsKK3N0YXRpYyB2b2lkIHNpeHBhY2tfZGVjb2RlKHN0cnVjdCBzaXhwYWNrICosIGNvbnN0IHVuc2lnbmVkIGNoYXJbXSwgaW50KTsKIHN0YXRpYyBpbnQgZW5jb2RlX3NpeHBhY2sodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIGludCwgdW5zaWduZWQgY2hhcik7CiAKIC8qCkBAIC00MjgsNyArNDI4LDcgQEAKIAogLyoKICAqIEhhbmRsZSB0aGUgJ3JlY2VpdmVyIGRhdGEgcmVhZHknIGludGVycnVwdC4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSAndHR5X2lvJyBtb2R1bGUgaW4gdGhlIGtlcm5lbCB3aGVuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgdHR5IG1vZHVsZSBpbiB0aGUga2VybmVsIHdoZW4KICAqIGEgYmxvY2sgb2YgNnBhY2sgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCwgd2hpY2ggY2FuIG5vdyBiZSBkZWNhcHN1bGF0ZWQKICAqIGFuZCBzZW50IG9uIHRvIHNvbWUgSVAgbGF5ZXIgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KICAqLwpAQCAtNDM2LDcgKzQzNiw2IEBACiAJY29uc3QgdW5zaWduZWQgY2hhciAqY3AsIGNoYXIgKmZwLCBpbnQgY291bnQpCiB7CiAJc3RydWN0IHNpeHBhY2sgKnNwOwotCXVuc2lnbmVkIGNoYXIgYnVmWzUxMl07CiAJaW50IGNvdW50MTsKIAogCWlmICghY291bnQpCkBAIC00NDYsMTAgKzQ0NSw3IEBACiAJaWYgKCFzcCkKIAkJcmV0dXJuOwogCi0JbWVtY3B5KGJ1ZiwgY3AsIGNvdW50IDwgc2l6ZW9mKGJ1ZikgPyBjb3VudCA6IHNpemVvZihidWYpKTsKLQogCS8qIFJlYWQgdGhlIGNoYXJhY3RlcnMgb3V0IG9mIHRoZSBidWZmZXIgKi8KLQogCWNvdW50MSA9IGNvdW50OwogCXdoaWxlIChjb3VudCkgewogCQljb3VudC0tOwpAQCAtNDU5LDcgKzQ1NSw3IEBACiAJCQljb250aW51ZTsKIAkJfQogCX0KLQlzaXhwYWNrX2RlY29kZShzcCwgYnVmLCBjb3VudDEpOworCXNpeHBhY2tfZGVjb2RlKHNwLCBjcCwgY291bnQxKTsKIAogCXNwX3B1dChzcCk7CiAJdHR5X3VudGhyb3R0bGUodHR5KTsKQEAgLTk5Miw3ICs5ODgsNyBAQAogLyogZGVjb2RlIGEgNnBhY2sgcGFja2V0ICovCiAKIHN0YXRpYyB2b2lkCi1zaXhwYWNrX2RlY29kZShzdHJ1Y3Qgc2l4cGFjayAqc3AsIHVuc2lnbmVkIGNoYXIgKnByZV9yYnVmZiwgaW50IGNvdW50KQorc2l4cGFja19kZWNvZGUoc3RydWN0IHNpeHBhY2sgKnNwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwcmVfcmJ1ZmYsIGludCBjb3VudCkKIHsKIAl1bnNpZ25lZCBjaGFyIGluYnl0ZTsKIAlpbnQgY291bnQxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYnBxZXRoZXIuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JwcWV0aGVyLmMKaW5kZXggZDk1YTUwYS4uNjIyYWIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYnBxZXRoZXIuYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9icHFldGhlci5jCkBAIC00ODQsNyArNDg0LDcgQEAKIAlkZXYtPmZsYWdzICAgICAgPSAwOwogCWRldi0+ZmVhdHVyZXMJPSBORVRJRl9GX0xMVFg7CS8qIEFsbG93IHJlY3Vyc2lvbiAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfQVgyNSkgfHwgZGVmaW5lZChDT05GSUdfQVgyNV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQVgyNSkKIAlkZXYtPmhlYWRlcl9vcHMgICAgICA9ICZheDI1X2hlYWRlcl9vcHM7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHlwZXJ2L2h5cGVydl9uZXQuaCBiL2RyaXZlcnMvbmV0L2h5cGVydi9oeXBlcnZfbmV0LmgKaW5kZXggNDY3ZmI4Yi4uZjRmYmNiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHlwZXJ2L2h5cGVydl9uZXQuaAorKysgYi9kcml2ZXJzL25ldC9oeXBlcnYvaHlwZXJ2X25ldC5oCkBAIC04NCw4ICs4NCw2IEBACiAjZGVmaW5lIE5ESVNfUlNTX0hBU0hfU0VDUkVUX0tFWV9NQVhfU0laRV9SRVZJU0lPTl8yICAgNDAKIAogI2RlZmluZSBJVEFCX05VTSAxMjgKLSNkZWZpbmUgSEFTSF9LRVlMRU4gTkRJU19SU1NfSEFTSF9TRUNSRVRfS0VZX01BWF9TSVpFX1JFVklTSU9OXzIKLWV4dGVybiB1OCBuZXR2c2NfaGFzaF9rZXlbXTsKIAogc3RydWN0IG5kaXNfcmVjdl9zY2FsZV9wYXJhbSB7IC8qIE5ESVNfUkVDRUlWRV9TQ0FMRV9QQVJBTUVURVJTICovCiAJc3RydWN0IG5kaXNfb2JqX2hlYWRlciBoZHI7CkBAIC0xNzUsNyArMTczLDcgQEAKIHN0cnVjdCBybmRpc19tZXNzYWdlOwogc3RydWN0IG5ldHZzY19kZXZpY2U7CiBpbnQgbmV0dnNjX2RldmljZV9hZGQoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLCB2b2lkICphZGRpdGlvbmFsX2luZm8pOwotaW50IG5ldHZzY19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSk7Cit2b2lkIG5ldHZzY19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSk7CiBpbnQgbmV0dnNjX3NlbmQoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAogCQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0LAogCQlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSAqcm5kaXNfbXNnLApAQCAtNDM1LDcgKzQzMyw3IEBACiAgKi8KIHN0cnVjdCBudnNwXzFfbWVzc2FnZV9zZW5kX3JuZGlzX3BhY2tldCB7CiAJLyoKLQkgKiBUaGlzIGZpZWxkIGlzIHNwZWNpZmllZCBieSBSTklEUy4gVGhleSBhc3N1bWUgdGhlcmUncyB0d28gZGlmZmVyZW50CisJICogVGhpcyBmaWVsZCBpcyBzcGVjaWZpZWQgYnkgUk5ESVMuIFRoZXkgYXNzdW1lIHRoZXJlJ3MgdHdvIGRpZmZlcmVudAogCSAqIGNoYW5uZWxzIG9mIGNvbW11bmljYXRpb24uIEhvd2V2ZXIsIHRoZSBOZXR3b3JrIFZTUCBvbmx5IGhhcyBvbmUuCiAJICogVGhlcmVmb3JlLCB0aGUgY2hhbm5lbCB0cmF2ZWxzIHdpdGggdGhlIFJORElTIHBhY2tldC4KIAkgKi8KQEAgLTQ5MCw2ICs0ODgsNyBAQAogCQkJdTY0IHNyaW92OjE7CiAJCQl1NjQgaWVlZTgwMjFxOjE7CiAJCQl1NjQgY29ycmVsYXRpb25faWQ6MTsKKwkJCXU2NCB0ZWFtaW5nOjE7CiAJCX07CiAJfTsKIH0gX19wYWNrZWQ7CkBAIC01NzksNyArNTc4LDcgQEAKIAkvKiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHNlbmQgaW5kaXJlY3Rpb24gdGFibGUgKi8KIAl1MzIgY291bnQ7CiAKLQkvKiBUaGUgb2Zmc2V0IG9mIHRoZSBzZW5kIGluZGlyZWNpdG9uIHRhYmxlIGZyb20gdG9wIG9mIHRoaXMgc3RydWN0LgorCS8qIFRoZSBvZmZzZXQgb2YgdGhlIHNlbmQgaW5kaXJlY3Rpb24gdGFibGUgZnJvbSB0b3Agb2YgdGhpcyBzdHJ1Y3QuCiAJICogVGhlIHNlbmQgaW5kaXJlY3Rpb24gdGFibGUgdGVsbHMgd2hpY2ggY2hhbm5lbCB0byBwdXQgdGhlIHNlbmQKIAkgKiB0cmFmZmljIG9uLiBFYWNoIGVudHJ5IGlzIGEgY2hhbm5lbCBudW1iZXIuCiAJICovCkBAIC02MzMsMjMgKzYzMiw0MSBAQAogCXUzMiBjb3VudDsgLyogY291bnRlciBvZiBiYXRjaGVkIHBhY2tldHMgKi8KIH07CiAKK3N0cnVjdCByZWN2X2NvbXBfZGF0YSB7CisJdTY0IHRpZDsgLyogdHJhbnNhY3Rpb24gaWQgKi8KKwl1MzIgc3RhdHVzOworfTsKKworLyogTmV0dnNjIFJlY2VpdmUgU2xvdHMgTWF4ICovCisjZGVmaW5lIE5FVFZTQ19SRUNWU0xPVF9NQVggKE5FVFZTQ19SRUNFSVZFX0JVRkZFUl9TSVpFIC8gRVRIX0RBVEFfTEVOICsgMSkKKworc3RydWN0IG11bHRpX3JlY3ZfY29tcCB7CisJdm9pZCAqYnVmOyAvKiBxdWV1ZWQgcmVjZWl2ZSBjb21wbGV0aW9ucyAqLworCXUzMiBmaXJzdDsgLyogZmlyc3QgZGF0YSBlbnRyeSAqLworCXUzMiBuZXh0OyAvKiBuZXh0IGVudHJ5IGZvciB3cml0aW5nICovCit9OworCiBzdHJ1Y3QgbmV0dnNjX3N0YXRzIHsKIAl1NjQgcGFja2V0czsKIAl1NjQgYnl0ZXM7CisJdTY0IGJyb2FkY2FzdDsKKwl1NjQgbXVsdGljYXN0OwogCXN0cnVjdCB1NjRfc3RhdHNfc3luYyBzeW5jcDsKIH07CiAKK3N0cnVjdCBuZXR2c2NfZXRodG9vbF9zdGF0cyB7CisJdW5zaWduZWQgbG9uZyB0eF9zY2F0dGVyZWQ7CisJdW5zaWduZWQgbG9uZyB0eF9ub19tZW1vcnk7CisJdW5zaWduZWQgbG9uZyB0eF9ub19zcGFjZTsKKwl1bnNpZ25lZCBsb25nIHR4X3Rvb19iaWc7CisJdW5zaWduZWQgbG9uZyB0eF9idXN5OworfTsKKwogc3RydWN0IG5ldHZzY19yZWNvbmZpZyB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXUzMiBldmVudDsKIH07CiAKLXN0cnVjdCBnYXJwX3dyayB7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGR3cms7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0dnNjX2RldjsKLX07Ci0KIC8qIFRoZSBjb250ZXh0IG9mIHRoZSBuZXR2c2MgZGV2aWNlICAqLwogc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCB7CiAJLyogcG9pbnQgYmFjayB0byBvdXIgZGV2aWNlIGNvbnRleHQgKi8KQEAgLTY2Nyw3ICs2ODQsNiBAQAogCiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJdTMyIG1zZ19lbmFibGU7IC8qIGRlYnVnIGxldmVsICovCi0Jc3RydWN0IGdhcnBfd3JrIGd3cms7CiAKIAlzdHJ1Y3QgbmV0dnNjX3N0YXRzIF9fcGVyY3B1ICp0eF9zdGF0czsKIAlzdHJ1Y3QgbmV0dnNjX3N0YXRzIF9fcGVyY3B1ICpyeF9zdGF0czsKQEAgLTY3NSw5ICs2OTEsMTggQEAKIAkvKiBFdGh0b29sIHNldHRpbmdzICovCiAJdTggZHVwbGV4OwogCXUzMiBzcGVlZDsKKwlzdHJ1Y3QgbmV0dnNjX2V0aHRvb2xfc3RhdHMgZXRoX3N0YXRzOwogCiAJLyogdGhlIGRldmljZSBpcyBnb2luZyBhd2F5ICovCiAJYm9vbCBzdGFydF9yZW1vdmU7CisKKwkvKiBTdGF0ZSB0byBtYW5hZ2UgdGhlIGFzc29jaWF0ZWQgVkYgaW50ZXJmYWNlLiAqLworCXN0cnVjdCBuZXRfZGV2aWNlIF9fcmN1ICp2Zl9uZXRkZXY7CisKKwkvKiAxOiBhbGxvY2F0ZWQsIHNlcmlhbCBudW1iZXIgaXMgdmFsaWQuIDA6IG5vdCBhbGxvY2F0ZWQgKi8KKwl1MzIgdmZfYWxsb2M7CisJLyogU2VyaWFsIG51bWJlciBvZiB0aGUgVkYgdG8gdGVhbSB3aXRoICovCisJdTMyIHZmX3NlcmlhbDsKIH07CiAKIC8qIFBlciBuZXR2c2MgZGV2aWNlICovCkBAIC03MDksNyArNzM0LDYgQEAKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlIGNoYW5uZWxfaW5pdF9wa3Q7CiAKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlIHJldm9rZV9wYWNrZXQ7Ci0JLyogdW5zaWduZWQgY2hhciBId01hY0FkZHJbSFdfTUFDQUREUl9MRU5dOyAqLwogCiAJc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNobl90YWJsZVtWUlNTX0NIQU5ORUxfTUFYXTsKIAl1MzIgc2VuZF90YWJsZVtWUlNTX1NFTkRfVEFCX1NJWkVdOwpAQCAtNzMzLDE1ICs3NTcsMTAgQEAKIAl1MzIgbWF4X3BrdDsgLyogbWF4IG51bWJlciBvZiBwa3QgaW4gb25lIHNlbmQsIGUuZy4gOCAqLwogCXUzMiBwa3RfYWxpZ247IC8qIGFsaWdubWVudCBieXRlcywgZS5nLiA4ICovCiAKLQkvKiAxOiBhbGxvY2F0ZWQsIHNlcmlhbCBudW1iZXIgaXMgdmFsaWQuIDA6IG5vdCBhbGxvY2F0ZWQgKi8KLQl1MzIgdmZfYWxsb2M7Ci0JLyogU2VyaWFsIG51bWJlciBvZiB0aGUgVkYgdG8gdGVhbSB3aXRoICovCi0JdTMyIHZmX3NlcmlhbDsKKwlzdHJ1Y3QgbXVsdGlfcmVjdl9jb21wIG1yY1tWUlNTX0NIQU5ORUxfTUFYXTsKKwlhdG9taWNfdCBudW1fb3V0c3RhbmRpbmdfcmVjdnM7CisKIAlhdG9taWNfdCBvcGVuX2NudDsKLQkvKiBTdGF0ZSB0byBtYW5hZ2UgdGhlIGFzc29jaWF0ZWQgVkYgaW50ZXJmYWNlLiAqLwotCWJvb2wgdmZfaW5qZWN0OwotCXN0cnVjdCBuZXRfZGV2aWNlICp2Zl9uZXRkZXY7Ci0JYXRvbWljX3QgdmZfdXNlX2NudDsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5ldHZzY19kZXZpY2UgKgpAQCAtMTIxOSw3ICsxMjM4LDcgQEAKIAl1MzIgbmRpc19tc2dfdHlwZTsKIAogCS8qIFRvdGFsIGxlbmd0aCBvZiB0aGlzIG1lc3NhZ2UsIGZyb20gdGhlIGJlZ2lubmluZyAqLwotCS8qIG9mIHRoZSBzcnVjdCBybmRpc19tZXNzYWdlLCBpbiBieXRlcy4gKi8KKwkvKiBvZiB0aGUgc3RydWN0IHJuZGlzX21lc3NhZ2UsIGluIGJ5dGVzLiAqLwogCXUzMiBtc2dfbGVuOwogCiAJLyogQWN0dWFsIG1lc3NhZ2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2h5cGVydi9uZXR2c2MuYyBiL2RyaXZlcnMvbmV0L2h5cGVydi9uZXR2c2MuYwppbmRleCAyMGUwOTE3Li43MjBiNWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oeXBlcnYvbmV0dnNjLmMKKysrIGIvZHJpdmVycy9uZXQvaHlwZXJ2L25ldHZzYy5jCkBAIC01OSw3ICs1OSw2IEBACiAJCQkgICAgICAgVk1fUEtUX0RBVEFfSU5CQU5ELCAwKTsKIH0KIAotCiBzdGF0aWMgc3RydWN0IG5ldHZzY19kZXZpY2UgKmFsbG9jX25ldF9kZXZpY2Uodm9pZCkKIHsKIAlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKQEAgLTc0LDIxICs3MywyNiBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwluZXRfZGV2aWNlLT5tcmNbMF0uYnVmID0gdnphbGxvYyhORVRWU0NfUkVDVlNMT1RfTUFYICoKKwkJCQkJIHNpemVvZihzdHJ1Y3QgcmVjdl9jb21wX2RhdGEpKTsKKwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm5ldF9kZXZpY2UtPndhaXRfZHJhaW4pOwogCW5ldF9kZXZpY2UtPmRlc3Ryb3kgPSBmYWxzZTsKIAlhdG9taWNfc2V0KCZuZXRfZGV2aWNlLT5vcGVuX2NudCwgMCk7Ci0JYXRvbWljX3NldCgmbmV0X2RldmljZS0+dmZfdXNlX2NudCwgMCk7CiAJbmV0X2RldmljZS0+bWF4X3BrdCA9IFJORElTX01BWF9QS1RfREVGQVVMVDsKIAluZXRfZGV2aWNlLT5wa3RfYWxpZ24gPSBSTkRJU19QS1RfQUxJR05fREVGQVVMVDsKLQotCW5ldF9kZXZpY2UtPnZmX25ldGRldiA9IE5VTEw7Ci0JbmV0X2RldmljZS0+dmZfaW5qZWN0ID0gZmFsc2U7CisJaW5pdF9jb21wbGV0aW9uKCZuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfd2FpdCk7CiAKIAlyZXR1cm4gbmV0X2RldmljZTsKIH0KIAogc3RhdGljIHZvaWQgZnJlZV9uZXR2c2NfZGV2aWNlKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpudmRldikKIHsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBWUlNTX0NIQU5ORUxfTUFYOyBpKyspCisJCXZmcmVlKG52ZGV2LT5tcmNbaV0uYnVmKTsKKwogCWtmcmVlKG52ZGV2LT5jYl9idWZmZXIpOwogCWtmcmVlKG52ZGV2KTsKIH0KQEAgLTExMSwyMCArMTE1LDIwIEBACiAJCWdvdG8gZ2V0X2luX2VycjsKIAogCWlmIChuZXRfZGV2aWNlLT5kZXN0cm95ICYmCi0JCWF0b21pY19yZWFkKCZuZXRfZGV2aWNlLT5udW1fb3V0c3RhbmRpbmdfc2VuZHMpID09IDApCisJICAgIGF0b21pY19yZWFkKCZuZXRfZGV2aWNlLT5udW1fb3V0c3RhbmRpbmdfc2VuZHMpID09IDAgJiYKKwkgICAgYXRvbWljX3JlYWQoJm5ldF9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19yZWN2cykgPT0gMCkKIAkJbmV0X2RldmljZSA9IE5VTEw7CiAKIGdldF9pbl9lcnI6CiAJcmV0dXJuIG5ldF9kZXZpY2U7CiB9CiAKLQotc3RhdGljIGludCBuZXR2c2NfZGVzdHJveV9idWYoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQorc3RhdGljIHZvaWQgbmV0dnNjX2Rlc3Ryb3lfYnVmKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpyZXZva2VfcGFja2V0OwotCWludCByZXQgPSAwOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gaHZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSA9IG5ldF9kZXZpY2VfdG9fbmV0dnNjX2RldmljZShuZGV2KTsKKwlpbnQgcmV0OwogCiAJLyoKIAkgKiBJZiB3ZSBnb3QgYSBzZWN0aW9uIGNvdW50LCBpdCBtZWFucyB3ZSByZWNlaXZlZCBhCkBAIC0xNTQsNyArMTU4LDcgQEAKIAkJaWYgKHJldCAhPSAwKSB7CiAJCQluZXRkZXZfZXJyKG5kZXYsICJ1bmFibGUgdG8gc2VuZCAiCiAJCQkJInJldm9rZSByZWNlaXZlIGJ1ZmZlciB0byBuZXR2c3BcbiIpOwotCQkJcmV0dXJuIHJldDsKKwkJCXJldHVybjsKIAkJfQogCX0KIApAQCAtMTY5LDcgKzE3Myw3IEBACiAJCWlmIChyZXQgIT0gMCkgewogCQkJbmV0ZGV2X2VycihuZGV2LAogCQkJCSAgICJ1bmFibGUgdG8gdGVhcmRvd24gcmVjZWl2ZSBidWZmZXIncyBncGFkbFxuIik7Ci0JCQlyZXR1cm4gcmV0OworCQkJcmV0dXJuOwogCQl9CiAJCW5ldF9kZXZpY2UtPnJlY3ZfYnVmX2dwYWRsX2hhbmRsZSA9IDA7CiAJfQpAQCAtMjEzLDcgKzIxNyw3IEBACiAJCWlmIChyZXQgIT0gMCkgewogCQkJbmV0ZGV2X2VycihuZGV2LCAidW5hYmxlIHRvIHNlbmQgIgogCQkJCSAgICJyZXZva2Ugc2VuZCBidWZmZXIgdG8gbmV0dnNwXG4iKTsKLQkJCXJldHVybiByZXQ7CisJCQlyZXR1cm47CiAJCX0KIAl9CiAJLyogVGVhcmRvd24gdGhlIGdwYWRsIG9uIHRoZSB2c3AgZW5kICovCkBAIC0yMjcsNyArMjMxLDcgQEAKIAkJaWYgKHJldCAhPSAwKSB7CiAJCQluZXRkZXZfZXJyKG5kZXYsCiAJCQkJICAgInVuYWJsZSB0byB0ZWFyZG93biBzZW5kIGJ1ZmZlcidzIGdwYWRsXG4iKTsKLQkJCXJldHVybiByZXQ7CisJCQlyZXR1cm47CiAJCX0KIAkJbmV0X2RldmljZS0+c2VuZF9idWZfZ3BhZGxfaGFuZGxlID0gMDsKIAl9CkBAIC0yMzcsOCArMjQxLDYgQEAKIAkJbmV0X2RldmljZS0+c2VuZF9idWYgPSBOVUxMOwogCX0KIAlrZnJlZShuZXRfZGV2aWNlLT5zZW5kX3NlY3Rpb25fbWFwKTsKLQotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgbmV0dnNjX2luaXRfYnVmKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKQEAgLTI4MCw3ICsyODIsNiBAQAogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0KIAkvKiBOb3RpZnkgdGhlIE5ldFZzcCBvZiB0aGUgZ3BhZGwgaGFuZGxlICovCiAJaW5pdF9wYWNrZXQgPSAmbmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X3BrdDsKIApAQCAtNDA3LDcgKzQwOCw3IEBACiAJLyogU2VjdGlvbiBjb3VudCBpcyBzaW1wbHkgdGhlIHNpemUgZGl2aWRlZCBieSB0aGUgc2VjdGlvbiBzaXplLgogCSAqLwogCW5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9jbnQgPQotCQluZXRfZGV2aWNlLT5zZW5kX2J1Zl9zaXplL25ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9zaXplOworCQluZXRfZGV2aWNlLT5zZW5kX2J1Zl9zaXplIC8gbmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX3NpemU7CiAKIAlkZXZfaW5mbygmZGV2aWNlLT5kZXZpY2UsICJTZW5kIHNlY3Rpb24gc2l6ZTogJWQsIFNlY3Rpb24gY291bnQ6JWRcbiIsCiAJCSBuZXRfZGV2aWNlLT5zZW5kX3NlY3Rpb25fc2l6ZSwgbmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX2NudCk7CkBAIC00MTYsOCArNDE3LDggQEAKIAluZXRfZGV2aWNlLT5tYXBfd29yZHMgPSBESVZfUk9VTkRfVVAobmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX2NudCwKIAkJCQkJICAgICBCSVRTX1BFUl9MT05HKTsKIAotCW5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9tYXAgPQotCQlremFsbG9jKG5ldF9kZXZpY2UtPm1hcF93b3JkcyAqIHNpemVvZih1bG9uZyksIEdGUF9LRVJORUwpOworCW5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9tYXAgPSBrY2FsbG9jKG5ldF9kZXZpY2UtPm1hcF93b3JkcywKKwkJCQkJICAgICAgIHNpemVvZih1bG9uZyksIEdGUF9LRVJORUwpOwogCWlmIChuZXRfZGV2aWNlLT5zZW5kX3NlY3Rpb25fbWFwID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBjbGVhbnVwOwpAQCAtNDMyLDcgKzQzMyw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotCiAvKiBOZWdvdGlhdGUgTlZTUCBwcm90b2NvbCB2ZXJzaW9uICovCiBzdGF0aWMgaW50IG5lZ290aWF0ZV9udnNwX3ZlcihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCiAJCQkgICAgICBzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSwKQEAgLTQ3Miw5ICs0NzIsMTMgQEAKIAlpbml0X3BhY2tldC0+bXNnLnYyX21zZy5zZW5kX25kaXNfY29uZmlnLm10dSA9IG5kZXYtPm10dSArIEVUSF9ITEVOOwogCWluaXRfcGFja2V0LT5tc2cudjJfbXNnLnNlbmRfbmRpc19jb25maWcuY2FwYWJpbGl0eS5pZWVlODAyMXEgPSAxOwogCi0JaWYgKG52c3BfdmVyID49IE5WU1BfUFJPVE9DT0xfVkVSU0lPTl81KQorCWlmIChudnNwX3ZlciA+PSBOVlNQX1BST1RPQ09MX1ZFUlNJT05fNSkgewogCQlpbml0X3BhY2tldC0+bXNnLnYyX21zZy5zZW5kX25kaXNfY29uZmlnLmNhcGFiaWxpdHkuc3Jpb3YgPSAxOwogCisJCS8qIFRlYW1pbmcgYml0IGlzIG5lZWRlZCB0byByZWNlaXZlIGxpbmsgc3BlZWQgdXBkYXRlcyAqLworCQlpbml0X3BhY2tldC0+bXNnLnYyX21zZy5zZW5kX25kaXNfY29uZmlnLmNhcGFiaWxpdHkudGVhbWluZyA9IDE7CisJfQorCiAJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIGluaXRfcGFja2V0LAogCQkJCXNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwKIAkJCQkodW5zaWduZWQgbG9uZylpbml0X3BhY2tldCwKQEAgLTQ4OSw5ICs0OTMsMTAgQEAKIAlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlICppbml0X3BhY2tldDsKIAlpbnQgbmRpc192ZXJzaW9uOwotCXUzMiB2ZXJfbGlzdFtdID0geyBOVlNQX1BST1RPQ09MX1ZFUlNJT05fMSwgTlZTUF9QUk9UT0NPTF9WRVJTSU9OXzIsCisJY29uc3QgdTMyIHZlcl9saXN0W10gPSB7CisJCU5WU1BfUFJPVE9DT0xfVkVSU0lPTl8xLCBOVlNQX1BST1RPQ09MX1ZFUlNJT05fMiwKIAkJTlZTUF9QUk9UT0NPTF9WRVJTSU9OXzQsIE5WU1BfUFJPVE9DT0xfVkVSU0lPTl81IH07Ci0JaW50IGksIG51bV92ZXIgPSA0OyAvKiBudW1iZXIgb2YgZGlmZmVyZW50IE5WU1AgdmVyc2lvbnMgKi8KKwlpbnQgaTsKIAogCW5ldF9kZXZpY2UgPSBnZXRfb3V0Ym91bmRfbmV0X2RldmljZShkZXZpY2UpOwogCWlmICghbmV0X2RldmljZSkKQEAgLTUwMCw3ICs1MDUsNyBAQAogCWluaXRfcGFja2V0ID0gJm5ldF9kZXZpY2UtPmNoYW5uZWxfaW5pdF9wa3Q7CiAKIAkvKiBOZWdvdGlhdGUgdGhlIGxhdGVzdCBOVlNQIHByb3RvY29sIHN1cHBvcnRlZCAqLwotCWZvciAoaSA9IG51bV92ZXIgLSAxOyBpID49IDA7IGktLSkKKwlmb3IgKGkgPSBBUlJBWV9TSVpFKHZlcl9saXN0KSAtIDE7IGkgPj0gMDsgaS0tKQogCQlpZiAobmVnb3RpYXRlX252c3BfdmVyKGRldmljZSwgbmV0X2RldmljZSwgaW5pdF9wYWNrZXQsCiAJCQkJICAgICAgIHZlcl9saXN0W2ldKSAgPT0gMCkgewogCQkJbmV0X2RldmljZS0+bnZzcF92ZXJzaW9uID0gdmVyX2xpc3RbaV07CkBAIC01NTksNyArNTY0LDcgQEAKIC8qCiAgKiBuZXR2c2NfZGV2aWNlX3JlbW92ZSAtIENhbGxiYWNrIHdoZW4gdGhlIHJvb3QgYnVzIGRldmljZSBpcyByZW1vdmVkCiAgKi8KLWludCBuZXR2c2NfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCit2b2lkIG5ldHZzY19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGh2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmV0X2RldmljZV9jdHggPSBuZXRkZXZfcHJpdihuZGV2KTsKQEAgLTU4MSwxMCArNTg2LDggQEAKIAkvKiBSZWxlYXNlIGFsbCByZXNvdXJjZXMgKi8KIAl2ZnJlZShuZXRfZGV2aWNlLT5zdWJfY2JfYnVmKTsKIAlmcmVlX25ldHZzY19kZXZpY2UobmV0X2RldmljZSk7Ci0JcmV0dXJuIDA7CiB9CiAKLQogI2RlZmluZSBSSU5HX0FWQUlMX1BFUkNFTlRfSElXQVRFUiAyMAogI2RlZmluZSBSSU5HX0FWQUlMX1BFUkNFTlRfTE9XQVRFUiAxMAogCkBAIC02MDgsNzIgKzYxMSw3OSBAQAogCXN5bmNfY2hhbmdlX2JpdChpbmRleCwgbmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX21hcCk7CiB9CiAKK3N0YXRpYyB2b2lkIG5ldHZzY19zZW5kX3R4X2NvbXBsZXRlKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqaW5jb21pbmdfY2hhbm5lbCwKKwkJCQkgICAgc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvciAqcGFja2V0KQoreworCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikodW5zaWduZWQgbG9uZylwYWNrZXQtPnRyYW5zX2lkOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gaHZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZXRfZGV2aWNlX2N0eCA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsID0gZGV2aWNlLT5jaGFubmVsOworCWludCBudW1fb3V0c3RhbmRpbmdfc2VuZHM7CisJdTE2IHFfaWR4ID0gMDsKKwlpbnQgcXVldWVfc2VuZHM7CisKKwkvKiBOb3RpZnkgdGhlIGxheWVyIGFib3ZlIHVzICovCisJaWYgKGxpa2VseShza2IpKSB7CisJCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpudnNjX3BhY2tldAorCQkJPSAoc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKilza2ItPmNiOworCQl1MzIgc2VuZF9pbmRleCA9IG52c2NfcGFja2V0LT5zZW5kX2J1Zl9pbmRleDsKKworCQlpZiAoc2VuZF9pbmRleCAhPSBORVRWU0NfSU5WQUxJRF9JTkRFWCkKKwkJCW5ldHZzY19mcmVlX3NlbmRfc2xvdChuZXRfZGV2aWNlLCBzZW5kX2luZGV4KTsKKwkJcV9pZHggPSBudnNjX3BhY2tldC0+cV9pZHg7CisJCWNoYW5uZWwgPSBpbmNvbWluZ19jaGFubmVsOworCisJCWRldl9jb25zdW1lX3NrYl9hbnkoc2tiKTsKKwl9CisKKwludW1fb3V0c3RhbmRpbmdfc2VuZHMgPQorCQlhdG9taWNfZGVjX3JldHVybigmbmV0X2RldmljZS0+bnVtX291dHN0YW5kaW5nX3NlbmRzKTsKKwlxdWV1ZV9zZW5kcyA9IGF0b21pY19kZWNfcmV0dXJuKCZuZXRfZGV2aWNlLT5xdWV1ZV9zZW5kc1txX2lkeF0pOworCisJaWYgKG5ldF9kZXZpY2UtPmRlc3Ryb3kgJiYgbnVtX291dHN0YW5kaW5nX3NlbmRzID09IDApCisJCXdha2VfdXAoJm5ldF9kZXZpY2UtPndhaXRfZHJhaW4pOworCisJaWYgKG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQobmV0ZGV2X2dldF90eF9xdWV1ZShuZGV2LCBxX2lkeCkpICYmCisJICAgICFuZXRfZGV2aWNlX2N0eC0+c3RhcnRfcmVtb3ZlICYmCisJICAgIChodl9yaW5nYnVmX2F2YWlsX3BlcmNlbnQoJmNoYW5uZWwtPm91dGJvdW5kKSA+IFJJTkdfQVZBSUxfUEVSQ0VOVF9ISVdBVEVSIHx8CisJICAgICBxdWV1ZV9zZW5kcyA8IDEpKQorCQluZXRpZl90eF93YWtlX3F1ZXVlKG5ldGRldl9nZXRfdHhfcXVldWUobmRldiwgcV9pZHgpKTsKK30KKwogc3RhdGljIHZvaWQgbmV0dnNjX3NlbmRfY29tcGxldGlvbihzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSwKIAkJCQkgICBzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqaW5jb21pbmdfY2hhbm5lbCwKIAkJCQkgICBzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCiAJCQkJICAgc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IgKnBhY2tldCkKIHsKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpudnNwX3BhY2tldDsKLQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqbnZzY19wYWNrZXQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBodl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwotCXN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgKm5ldF9kZXZpY2VfY3R4ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0JdTMyIHNlbmRfaW5kZXg7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCW52c3BfcGFja2V0ID0gKHN0cnVjdCBudnNwX21lc3NhZ2UgKikoKHVuc2lnbmVkIGxvbmcpcGFja2V0ICsKLQkJCShwYWNrZXQtPm9mZnNldDggPDwgMykpOworCQkJCQkgICAgICAocGFja2V0LT5vZmZzZXQ4IDw8IDMpKTsKIAotCWlmICgobnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSA9PSBOVlNQX01TR19UWVBFX0lOSVRfQ09NUExFVEUpIHx8Ci0JICAgIChudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlID09Ci0JICAgICBOVlNQX01TRzFfVFlQRV9TRU5EX1JFQ1ZfQlVGX0NPTVBMRVRFKSB8fAotCSAgICAobnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSA9PQotCSAgICAgTlZTUF9NU0cxX1RZUEVfU0VORF9TRU5EX0JVRl9DT01QTEVURSkgfHwKLQkgICAgKG52c3BfcGFja2V0LT5oZHIubXNnX3R5cGUgPT0KLQkgICAgIE5WU1BfTVNHNV9UWVBFX1NVQkNIQU5ORUwpKSB7CisJc3dpdGNoIChudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlKSB7CisJY2FzZSBOVlNQX01TR19UWVBFX0lOSVRfQ09NUExFVEU6CisJY2FzZSBOVlNQX01TRzFfVFlQRV9TRU5EX1JFQ1ZfQlVGX0NPTVBMRVRFOgorCWNhc2UgTlZTUF9NU0cxX1RZUEVfU0VORF9TRU5EX0JVRl9DT01QTEVURToKKwljYXNlIE5WU1BfTVNHNV9UWVBFX1NVQkNIQU5ORUw6CiAJCS8qIENvcHkgdGhlIHJlc3BvbnNlIGJhY2sgKi8KIAkJbWVtY3B5KCZuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfcGt0LCBudnNwX3BhY2tldCwKIAkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7CiAJCWNvbXBsZXRlKCZuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfd2FpdCk7Ci0JfSBlbHNlIGlmIChudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlID09Ci0JCSAgIE5WU1BfTVNHMV9UWVBFX1NFTkRfUk5ESVNfUEtUX0NPTVBMRVRFKSB7Ci0JCWludCBudW1fb3V0c3RhbmRpbmdfc2VuZHM7Ci0JCXUxNiBxX2lkeCA9IDA7Ci0JCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsID0gZGV2aWNlLT5jaGFubmVsOwotCQlpbnQgcXVldWVfc2VuZHM7CisJCWJyZWFrOwogCi0JCS8qIEdldCB0aGUgc2VuZCBjb250ZXh0ICovCi0JCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSh1bnNpZ25lZCBsb25nKXBhY2tldC0+dHJhbnNfaWQ7CisJY2FzZSBOVlNQX01TRzFfVFlQRV9TRU5EX1JORElTX1BLVF9DT01QTEVURToKKwkJbmV0dnNjX3NlbmRfdHhfY29tcGxldGUobmV0X2RldmljZSwgaW5jb21pbmdfY2hhbm5lbCwKKwkJCQkJZGV2aWNlLCBwYWNrZXQpOworCQlicmVhazsKIAotCQkvKiBOb3RpZnkgdGhlIGxheWVyIGFib3ZlIHVzICovCi0JCWlmIChza2IpIHsKLQkJCW52c2NfcGFja2V0ID0gKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICopIHNrYi0+Y2I7Ci0JCQlzZW5kX2luZGV4ID0gbnZzY19wYWNrZXQtPnNlbmRfYnVmX2luZGV4OwotCQkJaWYgKHNlbmRfaW5kZXggIT0gTkVUVlNDX0lOVkFMSURfSU5ERVgpCi0JCQkJbmV0dnNjX2ZyZWVfc2VuZF9zbG90KG5ldF9kZXZpY2UsIHNlbmRfaW5kZXgpOwotCQkJcV9pZHggPSBudnNjX3BhY2tldC0+cV9pZHg7Ci0JCQljaGFubmVsID0gaW5jb21pbmdfY2hhbm5lbDsKLQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCX0KLQotCQludW1fb3V0c3RhbmRpbmdfc2VuZHMgPQotCQkJYXRvbWljX2RlY19yZXR1cm4oJm5ldF9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19zZW5kcyk7Ci0JCXF1ZXVlX3NlbmRzID0gYXRvbWljX2RlY19yZXR1cm4oJm5ldF9kZXZpY2UtPgotCQkJCQkJcXVldWVfc2VuZHNbcV9pZHhdKTsKLQotCQlpZiAobmV0X2RldmljZS0+ZGVzdHJveSAmJiBudW1fb3V0c3RhbmRpbmdfc2VuZHMgPT0gMCkKLQkJCXdha2VfdXAoJm5ldF9kZXZpY2UtPndhaXRfZHJhaW4pOwotCi0JCWlmIChuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKG5ldGRldl9nZXRfdHhfcXVldWUobmRldiwgcV9pZHgpKSAmJgotCQkgICAgIW5ldF9kZXZpY2VfY3R4LT5zdGFydF9yZW1vdmUgJiYKLQkJICAgIChodl9yaW5nYnVmX2F2YWlsX3BlcmNlbnQoJmNoYW5uZWwtPm91dGJvdW5kKSA+Ci0JCSAgICAgUklOR19BVkFJTF9QRVJDRU5UX0hJV0FURVIgfHwgcXVldWVfc2VuZHMgPCAxKSkKLQkJCQluZXRpZl90eF93YWtlX3F1ZXVlKG5ldGRldl9nZXRfdHhfcXVldWUoCi0JCQkJCQkgICAgbmRldiwgcV9pZHgpKTsKLQl9IGVsc2UgewotCQluZXRkZXZfZXJyKG5kZXYsICJVbmtub3duIHNlbmQgY29tcGxldGlvbiBwYWNrZXQgdHlwZS0gIgotCQkJICAgIiVkIHJlY2VpdmVkISFcbiIsIG52c3BfcGFja2V0LT5oZHIubXNnX3R5cGUpOworCWRlZmF1bHQ6CisJCW5ldGRldl9lcnIobmRldiwKKwkJCSAgICJVbmtub3duIHNlbmQgY29tcGxldGlvbiB0eXBlICVkIHJlY2VpdmVkISFcbiIsCisJCQkgICBudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlKTsKIAl9Ci0KIH0KIAogc3RhdGljIHUzMiBuZXR2c2NfZ2V0X25leHRfc2VuZF9zZWN0aW9uKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlKQpAQCAtODYzLDcgKzg3Myw3IEBACiAJCXN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7Ci0JaW50IHJldCA9IDAsIG1fcmV0ID0gMDsKKwlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqb3V0X2NoYW5uZWw7CiAJdTE2IHFfaWR4ID0gcGFja2V0LT5xX2lkeDsKIAl1MzIgcGt0bGVuID0gcGFja2V0LT50b3RhbF9kYXRhX2J1ZmxlbiwgbXNkX2xlbiA9IDA7CkBAIC05MzQsNyArOTQ0LDcgQEAKIAkJfQogCiAJCWlmIChtc2RwLT5za2IpCi0JCQlkZXZfa2ZyZWVfc2tiX2FueShtc2RwLT5za2IpOworCQkJZGV2X2NvbnN1bWVfc2tiX2FueShtc2RwLT5za2IpOwogCiAJCWlmICh4bWl0X21vcmUgJiYgIXBhY2tldC0+Y3BfcGFydGlhbCkgewogCQkJbXNkcC0+c2tiID0gc2tiOwpAQCAtOTUyLDggKzk2Miw4IEBACiAJfQogCiAJaWYgKG1zZF9zZW5kKSB7Ci0JCW1fcmV0ID0gbmV0dnNjX3NlbmRfcGt0KGRldmljZSwgbXNkX3NlbmQsIG5ldF9kZXZpY2UsCi0JCQkJCU5VTEwsIG1zZF9za2IpOworCQlpbnQgbV9yZXQgPSBuZXR2c2Nfc2VuZF9wa3QoZGV2aWNlLCBtc2Rfc2VuZCwgbmV0X2RldmljZSwKKwkJCQkJICAgIE5VTEwsIG1zZF9za2IpOwogCiAJCWlmIChtX3JldCAhPSAwKSB7CiAJCQluZXR2c2NfZnJlZV9zZW5kX3Nsb3QobmV0X2RldmljZSwKQEAgLTk3Miw0OSArOTgyLDEyMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIG5ldHZzY19zZW5kX3JlY3ZfY29tcGxldGlvbihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCi0JCQkJCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsLAotCQkJCQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSwKLQkJCQkJdTY0IHRyYW5zYWN0aW9uX2lkLCB1MzIgc3RhdHVzKQorc3RhdGljIGludCBuZXR2c2Nfc2VuZF9yZWN2X2NvbXBsZXRpb24oc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkJICAgICAgIHU2NCB0cmFuc2FjdGlvbl9pZCwgdTMyIHN0YXR1cykKIHsKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlIHJlY3Zjb21wTWVzc2FnZTsKLQlpbnQgcmV0cmllcyA9IDA7CiAJaW50IHJldDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGh2X2dldF9kcnZkYXRhKGRldmljZSk7CiAKIAlyZWN2Y29tcE1lc3NhZ2UuaGRyLm1zZ190eXBlID0KIAkJCQlOVlNQX01TRzFfVFlQRV9TRU5EX1JORElTX1BLVF9DT01QTEVURTsKIAogCXJlY3Zjb21wTWVzc2FnZS5tc2cudjFfbXNnLnNlbmRfcm5kaXNfcGt0X2NvbXBsZXRlLnN0YXR1cyA9IHN0YXR1czsKIAotcmV0cnlfc2VuZF9jbXBsdDoKIAkvKiBTZW5kIHRoZSBjb21wbGV0aW9uICovCiAJcmV0ID0gdm1idXNfc2VuZHBhY2tldChjaGFubmVsLCAmcmVjdmNvbXBNZXNzYWdlLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwgdHJhbnNhY3Rpb25faWQsCi0JCQkgICAgICAgVk1fUEtUX0NPTVAsIDApOwotCWlmIChyZXQgPT0gMCkgewotCQkvKiBzdWNjZXNzICovCi0JCS8qIG5vLW9wICovCi0JfSBlbHNlIGlmIChyZXQgPT0gLUVBR0FJTikgewotCQkvKiBubyBtb3JlIHJvb20uLi53YWl0IGEgYml0IGFuZCBhdHRlbXB0IHRvIHJldHJ5IDMgdGltZXMgKi8KLQkJcmV0cmllcysrOwotCQluZXRkZXZfZXJyKG5kZXYsICJ1bmFibGUgdG8gc2VuZCByZWNlaXZlIGNvbXBsZXRpb24gcGt0IgotCQkJIiAodGlkICVsbHgpLi4ucmV0cnlpbmcgJWRcbiIsIHRyYW5zYWN0aW9uX2lkLCByZXRyaWVzKTsKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZV9oZWFkZXIpICsgc2l6ZW9mKHUzMiksCisJCQkgICAgICAgdHJhbnNhY3Rpb25faWQsIFZNX1BLVF9DT01QLCAwKTsKIAotCQlpZiAocmV0cmllcyA8IDQpIHsKLQkJCXVkZWxheSgxMDApOwotCQkJZ290byByZXRyeV9zZW5kX2NtcGx0OwotCQl9IGVsc2UgewotCQkJbmV0ZGV2X2VycihuZGV2LCAidW5hYmxlIHRvIHNlbmQgcmVjZWl2ZSAiCi0JCQkJImNvbXBsZXRpb24gcGt0ICh0aWQgJWxseCkuLi5naXZlIHVwIHJldHJ5aW5nXG4iLAotCQkJCXRyYW5zYWN0aW9uX2lkKTsKLQkJfQotCX0gZWxzZSB7Ci0JCW5ldGRldl9lcnIobmRldiwgInVuYWJsZSB0byBzZW5kIHJlY2VpdmUgIgotCQkJImNvbXBsZXRpb24gcGt0IC0gJWxseFxuIiwgdHJhbnNhY3Rpb25faWQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3VudF9yZWN2X2NvbXBfc2xvdChzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbnZkZXYsIHUxNiBxX2lkeCwKKwkJCQkJdTMyICpmaWxsZWQsIHUzMiAqYXZhaWwpCit7CisJdTMyIGZpcnN0ID0gbnZkZXYtPm1yY1txX2lkeF0uZmlyc3Q7CisJdTMyIG5leHQgPSBudmRldi0+bXJjW3FfaWR4XS5uZXh0OworCisJKmZpbGxlZCA9IChmaXJzdCA+IG5leHQpID8gTkVUVlNDX1JFQ1ZTTE9UX01BWCAtIGZpcnN0ICsgbmV4dCA6CisJCSAgbmV4dCAtIGZpcnN0OworCisJKmF2YWlsID0gTkVUVlNDX1JFQ1ZTTE9UX01BWCAtICpmaWxsZWQgLSAxOworfQorCisvKiBSZWFkIHRoZSBmaXJzdCBmaWxsZWQgc2xvdCwgbm8gY2hhbmdlIHRvIGluZGV4ICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZWN2X2NvbXBfZGF0YSAqcmVhZF9yZWN2X2NvbXBfc2xvdChzdHJ1Y3QgbmV0dnNjX2RldmljZQorCQkJCQkJCSAqbnZkZXYsIHUxNiBxX2lkeCkKK3sKKwl1MzIgZmlsbGVkLCBhdmFpbDsKKworCWlmICghbnZkZXYtPm1yY1txX2lkeF0uYnVmKQorCQlyZXR1cm4gTlVMTDsKKworCWNvdW50X3JlY3ZfY29tcF9zbG90KG52ZGV2LCBxX2lkeCwgJmZpbGxlZCwgJmF2YWlsKTsKKwlpZiAoIWZpbGxlZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gbnZkZXYtPm1yY1txX2lkeF0uYnVmICsgbnZkZXYtPm1yY1txX2lkeF0uZmlyc3QgKgorCSAgICAgICBzaXplb2Yoc3RydWN0IHJlY3ZfY29tcF9kYXRhKTsKK30KKworLyogUHV0IHRoZSBmaXJzdCBmaWxsZWQgc2xvdCBiYWNrIHRvIGF2YWlsYWJsZSBwb29sICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3JlY3ZfY29tcF9zbG90KHN0cnVjdCBuZXR2c2NfZGV2aWNlICpudmRldiwgdTE2IHFfaWR4KQoreworCWludCBudW1fcmVjdjsKKworCW52ZGV2LT5tcmNbcV9pZHhdLmZpcnN0ID0gKG52ZGV2LT5tcmNbcV9pZHhdLmZpcnN0ICsgMSkgJQorCQkJCSAgTkVUVlNDX1JFQ1ZTTE9UX01BWDsKKworCW51bV9yZWN2ID0gYXRvbWljX2RlY19yZXR1cm4oJm52ZGV2LT5udW1fb3V0c3RhbmRpbmdfcmVjdnMpOworCisJaWYgKG52ZGV2LT5kZXN0cm95ICYmIG51bV9yZWN2ID09IDApCisJCXdha2VfdXAoJm52ZGV2LT53YWl0X2RyYWluKTsKK30KKworLyogQ2hlY2sgYW5kIHNlbmQgcGVuZGluZyByZWN2IGNvbXBsZXRpb25zICovCitzdGF0aWMgdm9pZCBuZXR2c2NfY2hrX3JlY3ZfY29tcChzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbnZkZXYsCisJCQkJIHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsLCB1MTYgcV9pZHgpCit7CisJc3RydWN0IHJlY3ZfY29tcF9kYXRhICpyY2Q7CisJaW50IHJldDsKKworCXdoaWxlICh0cnVlKSB7CisJCXJjZCA9IHJlYWRfcmVjdl9jb21wX3Nsb3QobnZkZXYsIHFfaWR4KTsKKwkJaWYgKCFyY2QpCisJCQlicmVhazsKKworCQlyZXQgPSBuZXR2c2Nfc2VuZF9yZWN2X2NvbXBsZXRpb24oY2hhbm5lbCwgcmNkLT50aWQsCisJCQkJCQkgIHJjZC0+c3RhdHVzKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCXB1dF9yZWN2X2NvbXBfc2xvdChudmRldiwgcV9pZHgpOwogCX0KIH0KIAorI2RlZmluZSBORVRWU0NfUkNEX1dBVEVSTUFSSyA4MAorCisvKiBHZXQgbmV4dCBhdmFpbGFibGUgc2xvdCAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVjdl9jb21wX2RhdGEgKmdldF9yZWN2X2NvbXBfc2xvdCgKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbnZkZXYsIHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsLCB1MTYgcV9pZHgpCit7CisJdTMyIGZpbGxlZCwgYXZhaWwsIG5leHQ7CisJc3RydWN0IHJlY3ZfY29tcF9kYXRhICpyY2Q7CisKKwlpZiAoIW52ZGV2LT5yZWN2X3NlY3Rpb24pCisJCXJldHVybiBOVUxMOworCisJaWYgKCFudmRldi0+bXJjW3FfaWR4XS5idWYpCisJCXJldHVybiBOVUxMOworCisJaWYgKGF0b21pY19yZWFkKCZudmRldi0+bnVtX291dHN0YW5kaW5nX3JlY3ZzKSA+CisJICAgIG52ZGV2LT5yZWN2X3NlY3Rpb24tPm51bV9zdWJfYWxsb2NzICogTkVUVlNDX1JDRF9XQVRFUk1BUksgLyAxMDApCisJCW5ldHZzY19jaGtfcmVjdl9jb21wKG52ZGV2LCBjaGFubmVsLCBxX2lkeCk7CisKKwljb3VudF9yZWN2X2NvbXBfc2xvdChudmRldiwgcV9pZHgsICZmaWxsZWQsICZhdmFpbCk7CisJaWYgKCFhdmFpbCkKKwkJcmV0dXJuIE5VTEw7CisKKwluZXh0ID0gbnZkZXYtPm1yY1txX2lkeF0ubmV4dDsKKwlyY2QgPSBudmRldi0+bXJjW3FfaWR4XS5idWYgKyBuZXh0ICogc2l6ZW9mKHN0cnVjdCByZWN2X2NvbXBfZGF0YSk7CisJbnZkZXYtPm1yY1txX2lkeF0ubmV4dCA9IChuZXh0ICsgMSkgJSBORVRWU0NfUkVDVlNMT1RfTUFYOworCisJYXRvbWljX2luYygmbnZkZXYtPm51bV9vdXRzdGFuZGluZ19yZWN2cyk7CisKKwlyZXR1cm4gcmNkOworfQorCiBzdGF0aWMgdm9pZCBuZXR2c2NfcmVjZWl2ZShzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSwKIAkJCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsLAogCQkJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLApAQCAtMTAyOSw2ICsxMTExLDkgQEAKIAlpbnQgY291bnQgPSAwOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gaHZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAl2b2lkICpkYXRhOworCWludCByZXQ7CisJc3RydWN0IHJlY3ZfY29tcF9kYXRhICpyY2Q7CisJdTE2IHFfaWR4ID0gY2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuc3ViX2NoYW5uZWxfaW5kZXg7CiAKIAkvKgogCSAqIEFsbCBpbmJvdW5kIHBhY2tldHMgb3RoZXIgdGhhbiBzZW5kIGNvbXBsZXRpb24gc2hvdWxkIGJlIHhmZXIgcGFnZQpAQCAtMTA3MywxMyArMTE1OCwyOSBAQAogCQkvKiBQYXNzIGl0IHRvIHRoZSB1cHBlciBsYXllciAqLwogCQlzdGF0dXMgPSBybmRpc19maWx0ZXJfcmVjZWl2ZShkZXZpY2UsIG5ldHZzY19wYWNrZXQsICZkYXRhLAogCQkJCQkgICAgICBjaGFubmVsKTsKLQogCX0KIAotCW5ldHZzY19zZW5kX3JlY3ZfY29tcGxldGlvbihkZXZpY2UsIGNoYW5uZWwsIG5ldF9kZXZpY2UsCi0JCQkJICAgIHZteGZlcnBhZ2VfcGFja2V0LT5kLnRyYW5zX2lkLCBzdGF0dXMpOwotfQorCWlmICghbmV0X2RldmljZS0+bXJjW3FfaWR4XS5idWYpIHsKKwkJcmV0ID0gbmV0dnNjX3NlbmRfcmVjdl9jb21wbGV0aW9uKGNoYW5uZWwsCisJCQkJCQkgIHZteGZlcnBhZ2VfcGFja2V0LT5kLnRyYW5zX2lkLAorCQkJCQkJICBzdGF0dXMpOworCQlpZiAocmV0KQorCQkJbmV0ZGV2X2VycihuZGV2LCAiUmVjdl9jb21wIHE6JWhkLCB0aWQ6JWxseCwgZXJyOiVkXG4iLAorCQkJCSAgIHFfaWR4LCB2bXhmZXJwYWdlX3BhY2tldC0+ZC50cmFuc19pZCwgcmV0KTsKKwkJcmV0dXJuOworCX0KIAorCXJjZCA9IGdldF9yZWN2X2NvbXBfc2xvdChuZXRfZGV2aWNlLCBjaGFubmVsLCBxX2lkeCk7CisKKwlpZiAoIXJjZCkgeworCQluZXRkZXZfZXJyKG5kZXYsICJSZWN2X2NvbXAgZnVsbCBidWYgcTolaGQsIHRpZDolbGx4XG4iLAorCQkJICAgcV9pZHgsIHZteGZlcnBhZ2VfcGFja2V0LT5kLnRyYW5zX2lkKTsKKwkJcmV0dXJuOworCX0KKworCXJjZC0+dGlkID0gdm14ZmVycGFnZV9wYWNrZXQtPmQudHJhbnNfaWQ7CisJcmNkLT5zdGF0dXMgPSBzdGF0dXM7Cit9CiAKIHN0YXRpYyB2b2lkIG5ldHZzY19zZW5kX3RhYmxlKHN0cnVjdCBodl9kZXZpY2UgKmhkZXYsCiAJCQkgICAgICBzdHJ1Y3QgbnZzcF9tZXNzYWdlICpudm1zZykKQEAgLTExMDYsMTYgKzEyMDcsMTYgQEAKIAkJbnZzY2Rldi0+c2VuZF90YWJsZVtpXSA9IHRhYltpXTsKIH0KIAotc3RhdGljIHZvaWQgbmV0dnNjX3NlbmRfdmYoc3RydWN0IG5ldHZzY19kZXZpY2UgKm52ZGV2LAorc3RhdGljIHZvaWQgbmV0dnNjX3NlbmRfdmYoc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmV0X2RldmljZV9jdHgsCiAJCQkgICBzdHJ1Y3QgbnZzcF9tZXNzYWdlICpudm1zZykKIHsKLQludmRldi0+dmZfYWxsb2MgPSBudm1zZy0+bXNnLnY0X21zZy52Zl9hc3NvYy5hbGxvY2F0ZWQ7Ci0JbnZkZXYtPnZmX3NlcmlhbCA9IG52bXNnLT5tc2cudjRfbXNnLnZmX2Fzc29jLnNlcmlhbDsKKwluZXRfZGV2aWNlX2N0eC0+dmZfYWxsb2MgPSBudm1zZy0+bXNnLnY0X21zZy52Zl9hc3NvYy5hbGxvY2F0ZWQ7CisJbmV0X2RldmljZV9jdHgtPnZmX3NlcmlhbCA9IG52bXNnLT5tc2cudjRfbXNnLnZmX2Fzc29jLnNlcmlhbDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIG5ldHZzY19yZWNlaXZlX2luYmFuZChzdHJ1Y3QgaHZfZGV2aWNlICpoZGV2LAotCQkJCQkgc3RydWN0IG5ldHZzY19kZXZpY2UgKm52ZGV2LAotCQkJCQkgc3RydWN0IG52c3BfbWVzc2FnZSAqbnZtc2cpCisJCQkJIHN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgKm5ldF9kZXZpY2VfY3R4LAorCQkJCSBzdHJ1Y3QgbnZzcF9tZXNzYWdlICpudm1zZykKIHsKIAlzd2l0Y2ggKG52bXNnLT5oZHIubXNnX3R5cGUpIHsKIAljYXNlIE5WU1BfTVNHNV9UWVBFX1NFTkRfSU5ESVJFQ1RJT05fVEFCTEU6CkBAIC0xMTIzLDcgKzEyMjQsNyBAQAogCQlicmVhazsKIAogCWNhc2UgTlZTUF9NU0c0X1RZUEVfU0VORF9WRl9BU1NPQ0lBVElPTjoKLQkJbmV0dnNjX3NlbmRfdmYobnZkZXYsIG52bXNnKTsKKwkJbmV0dnNjX3NlbmRfdmYobmV0X2RldmljZV9jdHgsIG52bXNnKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMTEzNiw2ICsxMjM3LDcgQEAKIAkJCQkgICBzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvciAqZGVzYykKIHsKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpudm1zZzsKKwlzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZXRfZGV2aWNlX2N0eCA9IG5ldGRldl9wcml2KG5kZXYpOwogCiAJbnZtc2cgPSAoc3RydWN0IG52c3BfbWVzc2FnZSAqKSgodW5zaWduZWQgbG9uZykKIAkJZGVzYyArIChkZXNjLT5vZmZzZXQ4IDw8IDMpKTsKQEAgLTExNTAsNyArMTI1Miw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBWTV9QS1RfREFUQV9JTkJBTkQ6Ci0JCW5ldHZzY19yZWNlaXZlX2luYmFuZChkZXZpY2UsIG5ldF9kZXZpY2UsIG52bXNnKTsKKwkJbmV0dnNjX3JlY2VpdmVfaW5iYW5kKGRldmljZSwgbmV0X2RldmljZV9jdHgsIG52bXNnKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMTE2MCwxMSArMTI2MiwxMSBAQAogCX0KIH0KIAotCiB2b2lkIG5ldHZzY19jaGFubmVsX2NiKHZvaWQgKmNvbnRleHQpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqKWNvbnRleHQ7CisJdTE2IHFfaWR4ID0gY2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuc3ViX2NoYW5uZWxfaW5kZXg7CiAJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOwogCXUzMiBieXRlc19yZWN2ZDsKQEAgLTEyMTYsOCArMTMxOCw2IEBACiAJCQkJCQkgICAgICAgbmRldiwKIAkJCQkJCSAgICAgICByZXF1ZXN0X2lkLAogCQkJCQkJICAgICAgIGRlc2MpOwotCi0KIAkJCX0gZWxzZSB7CiAJCQkJLyoKIAkJCQkgKiBXZSBhcmUgZG9uZSBmb3IgdGhpcyBwYXNzLgpAQCAtMTI0NCw3ICsxMzQ0LDggQEAKIAogCWlmIChidWZmZXJsZW4gPiBORVRWU0NfUEFDS0VUX1NJWkUpCiAJCWtmcmVlKGJ1ZmZlcik7Ci0JcmV0dXJuOworCisJbmV0dnNjX2Noa19yZWN2X2NvbXAobmV0X2RldmljZSwgY2hhbm5lbCwgcV9pZHgpOwogfQogCiAvKgpAQCAtMTI2Niw5ICsxMzY3LDYgQEAKIAogCW5ldF9kZXZpY2UtPnJpbmdfc2l6ZSA9IHJpbmdfc2l6ZTsKIAotCS8qIEluaXRpYWxpemUgdGhlIE5ldFZTQyBjaGFubmVsIGV4dGVuc2lvbiAqLwotCWluaXRfY29tcGxldGlvbigmbmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X3dhaXQpOwotCiAJc2V0X3Blcl9jaGFubmVsX3N0YXRlKGRldmljZS0+Y2hhbm5lbCwgbmV0X2RldmljZS0+Y2JfYnVmZmVyKTsKIAogCS8qIE9wZW4gdGhlIGNoYW5uZWwgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2h5cGVydi9uZXR2c2NfZHJ2LmMgYi9kcml2ZXJzL25ldC9oeXBlcnYvbmV0dnNjX2Rydi5jCmluZGV4IDQxYmQ5NTIuLjUyZWViMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2h5cGVydi9uZXR2c2NfZHJ2LmMKKysrIGIvZHJpdmVycy9uZXQvaHlwZXJ2L25ldHZzY19kcnYuYwpAQCAtNDAsNyArNDAsNiBAQAogCiAjaW5jbHVkZSAiaHlwZXJ2X25ldC5oIgogCi0KICNkZWZpbmUgUklOR19TSVpFX01JTiA2NAogI2RlZmluZSBMSU5LQ0hBTkdFX0lOVCAoMiAqIEhaKQogI2RlZmluZSBORVRWU0NfSFdfRkVBVFVSRVMJKE5FVElGX0ZfUlhDU1VNIHwgXApAQCAtMzU4LDE4ICszNTcsMTQgQEAKIAlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSAqcm5kaXNfbXNnOwogCXN0cnVjdCBybmRpc19wYWNrZXQgKnJuZGlzX3BrdDsKIAl1MzIgcm5kaXNfbXNnX3NpemU7Ci0JYm9vbCBpc3ZsYW47Ci0JYm9vbCBsaW5lYXIgPSBmYWxzZTsKIAlzdHJ1Y3Qgcm5kaXNfcGVyX3BhY2tldF9pbmZvICpwcGk7CiAJc3RydWN0IG5kaXNfdGNwX2lwX2NoZWNrc3VtX2luZm8gKmNzdW1faW5mbzsKLQlzdHJ1Y3QgbmRpc190Y3BfbHNvX2luZm8gKmxzb19pbmZvOwogCWludCAgaGRyX29mZnNldDsKIAl1MzIgbmV0X3RyYW5zX2luZm87CiAJdTMyIGhhc2g7CiAJdTMyIHNrYl9sZW5ndGg7CiAJc3RydWN0IGh2X3BhZ2VfYnVmZmVyIHBhZ2VfYnVmW01BWF9QQUdFX0JVRkZFUl9DT1VOVF07CiAJc3RydWN0IGh2X3BhZ2VfYnVmZmVyICpwYiA9IHBhZ2VfYnVmOwotCXN0cnVjdCBuZXR2c2Nfc3RhdHMgKnR4X3N0YXRzID0gdGhpc19jcHVfcHRyKG5ldF9kZXZpY2VfY3R4LT50eF9zdGF0cyk7CiAKIAkvKiBXZSB3aWxsIGF0bW9zdCBuZWVkIHR3byBwYWdlcyB0byBkZXNjcmliZSB0aGUgcm5kaXMKIAkgKiBoZWFkZXIuIFdlIGNhbiBvbmx5IHRyYW5zbWl0IE1BWF9QQUdFX0JVRkZFUl9DT1VOVCBudW1iZXIKQEAgLTM3NywyMiArMzcyLDIwIEBACiAJICogbW9yZSBwYWdlcyB3ZSB0cnkgbGluZWFyaXppbmcgaXQuCiAJICovCiAKLWNoZWNrX3NpemU6CiAJc2tiX2xlbmd0aCA9IHNrYi0+bGVuOwogCW51bV9kYXRhX3BncyA9IG5ldHZzY19nZXRfc2xvdHMoc2tiKSArIDI7Ci0JaWYgKG51bV9kYXRhX3BncyA+IE1BWF9QQUdFX0JVRkZFUl9DT1VOVCAmJiBsaW5lYXIpIHsKLQkJbmV0X2FsZXJ0X3JhdGVsaW1pdGVkKCJwYWNrZXQgdG9vIGJpZzogJXUgcGFnZXMgKCV1IGJ5dGVzKVxuIiwKLQkJCQkgICAgICBudW1fZGF0YV9wZ3MsIHNrYi0+bGVuKTsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBkcm9wOwotCX0gZWxzZSBpZiAobnVtX2RhdGFfcGdzID4gTUFYX1BBR0VfQlVGRkVSX0NPVU5UKSB7Ci0JCWlmIChza2JfbGluZWFyaXplKHNrYikpIHsKLQkJCW5ldF9hbGVydF9yYXRlbGltaXRlZCgiZmFpbGVkIHRvIGxpbmVhcml6ZSBza2JcbiIpOwotCQkJcmV0ID0gLUVOT01FTTsKKworCWlmICh1bmxpa2VseShudW1fZGF0YV9wZ3MgPiBNQVhfUEFHRV9CVUZGRVJfQ09VTlQpKSB7CisJCSsrbmV0X2RldmljZV9jdHgtPmV0aF9zdGF0cy50eF9zY2F0dGVyZWQ7CisKKwkJaWYgKHNrYl9saW5lYXJpemUoc2tiKSkKKwkJCWdvdG8gbm9fbWVtb3J5OworCisJCW51bV9kYXRhX3BncyA9IG5ldHZzY19nZXRfc2xvdHMoc2tiKSArIDI7CisJCWlmIChudW1fZGF0YV9wZ3MgPiBNQVhfUEFHRV9CVUZGRVJfQ09VTlQpIHsKKwkJCSsrbmV0X2RldmljZV9jdHgtPmV0aF9zdGF0cy50eF90b29fYmlnOwogCQkJZ290byBkcm9wOwogCQl9Ci0JCWxpbmVhciA9IHRydWU7Ci0JCWdvdG8gY2hlY2tfc2l6ZTsKIAl9CiAKIAkvKgpAQCAtNDAxLDE3ICszOTQsMTQgQEAKIAkgKiBzdHJ1Y3R1cmUuCiAJICovCiAJcmV0ID0gc2tiX2Nvd19oZWFkKHNrYiwgUk5ESVNfQU5EX1BQSV9TSVpFKTsKLQlpZiAocmV0KSB7Ci0JCW5ldGRldl9lcnIobmV0LCAidW5hYmxlIHRvIGFsbG9jIGh2X25ldHZzY19wYWNrZXRcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGRyb3A7Ci0JfQorCWlmIChyZXQpCisJCWdvdG8gbm9fbWVtb3J5OworCiAJLyogVXNlIHRoZSBza2IgY29udHJvbCBidWZmZXIgZm9yIGJ1aWxkaW5nIHVwIHRoZSBwYWNrZXQgKi8KIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0KSA+CiAJCQlGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGNiKSk7CiAJcGFja2V0ID0gKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICopc2tiLT5jYjsKIAotCiAJcGFja2V0LT5xX2lkeCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOwogCiAJcGFja2V0LT50b3RhbF9kYXRhX2J1ZmxlbiA9IHNrYi0+bGVuOwpAQCAtNDIwLDggKzQxMCw2IEBACiAKIAltZW1zZXQocm5kaXNfbXNnLCAwLCBSTkRJU19BTkRfUFBJX1NJWkUpOwogCi0JaXN2bGFuID0gc2tiLT52bGFuX3RjaSAmIFZMQU5fVEFHX1BSRVNFTlQ7Ci0KIAkvKiBBZGQgdGhlIHJuZGlzIGhlYWRlciAqLwogCXJuZGlzX21zZy0+bmRpc19tc2dfdHlwZSA9IFJORElTX01TR19QQUNLRVQ7CiAJcm5kaXNfbXNnLT5tc2dfbGVuID0gcGFja2V0LT50b3RhbF9kYXRhX2J1ZmxlbjsKQEAgLTQ0MCw3ICs0MjgsNyBAQAogCQkqKHUzMiAqKSgodm9pZCAqKXBwaSArIHBwaS0+cHBpX29mZnNldCkgPSBoYXNoOwogCX0KIAotCWlmIChpc3ZsYW4pIHsKKwlpZiAoc2tiX3ZsYW5fdGFnX3ByZXNlbnQoc2tiKSkgewogCQlzdHJ1Y3QgbmRpc19wa3RfODAyMXFfaW5mbyAqdmxhbjsKIAogCQlybmRpc19tc2dfc2l6ZSArPSBORElTX1ZMQU5fUFBJX1NJWkU7CkBAIC00NjEsOCArNDQ5LDM3IEBACiAJICogU2V0dXAgdGhlIHNlbmRzaWRlIGNoZWNrc3VtIG9mZmxvYWQgb25seSBpZiB0aGlzIGlzIG5vdCBhCiAJICogR1NPIHBhY2tldC4KIAkgKi8KLQlpZiAoc2tiX2lzX2dzbyhza2IpKQotCQlnb3RvIGRvX2xzbzsKKwlpZiAoc2tiX2lzX2dzbyhza2IpKSB7CisJCXN0cnVjdCBuZGlzX3RjcF9sc29faW5mbyAqbHNvX2luZm87CisKKwkJcm5kaXNfbXNnX3NpemUgKz0gTkRJU19MU09fUFBJX1NJWkU7CisJCXBwaSA9IGluaXRfcHBpX2RhdGEocm5kaXNfbXNnLCBORElTX0xTT19QUElfU0laRSwKKwkJCQkgICAgVENQX0xBUkdFU0VORF9QS1RJTkZPKTsKKworCQlsc29faW5mbyA9IChzdHJ1Y3QgbmRpc190Y3BfbHNvX2luZm8gKikoKHZvaWQgKilwcGkgKworCQkJCQkJCXBwaS0+cHBpX29mZnNldCk7CisKKwkJbHNvX2luZm8tPmxzb192Ml90cmFuc21pdC50eXBlID0gTkRJU19UQ1BfTEFSR0VfU0VORF9PRkZMT0FEX1YyX1RZUEU7CisJCWlmIChuZXRfdHJhbnNfaW5mbyAmIChJTkZPX0lQVjQgPDwgMTYpKSB7CisJCQlsc29faW5mby0+bHNvX3YyX3RyYW5zbWl0LmlwX3ZlcnNpb24gPQorCQkJCU5ESVNfVENQX0xBUkdFX1NFTkRfT0ZGTE9BRF9JUFY0OworCQkJaXBfaGRyKHNrYiktPnRvdF9sZW4gPSAwOworCQkJaXBfaGRyKHNrYiktPmNoZWNrID0gMDsKKwkJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPQorCQkJCX5jc3VtX3RjcHVkcF9tYWdpYyhpcF9oZHIoc2tiKS0+c2FkZHIsCisJCQkJCQkgICBpcF9oZHIoc2tiKS0+ZGFkZHIsIDAsIElQUFJPVE9fVENQLCAwKTsKKwkJfSBlbHNlIHsKKwkJCWxzb19pbmZvLT5sc29fdjJfdHJhbnNtaXQuaXBfdmVyc2lvbiA9CisJCQkJTkRJU19UQ1BfTEFSR0VfU0VORF9PRkZMT0FEX0lQVjY7CisJCQlpcHY2X2hkcihza2IpLT5wYXlsb2FkX2xlbiA9IDA7CisJCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0KKwkJCQl+Y3N1bV9pcHY2X21hZ2ljKCZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkJCSAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsIDAsIElQUFJPVE9fVENQLCAwKTsKKwkJfQorCQlsc29faW5mby0+bHNvX3YyX3RyYW5zbWl0LnRjcF9oZWFkZXJfb2Zmc2V0ID0gaGRyX29mZnNldDsKKwkJbHNvX2luZm8tPmxzb192Ml90cmFuc21pdC5tc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOworCQlnb3RvIGRvX3NlbmQ7CisJfQogCiAJaWYgKChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9OT05FKSB8fAogCSAgICAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpKQpAQCAtNDk1LDcgKzUxMiw3IEBACiAKIAkJcmV0ID0gc2tiX2Nvd19oZWFkKHNrYiwgMCk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIGRyb3A7CisJCQlnb3RvIG5vX21lbW9yeTsKIAogCQl1aCA9IHVkcF9oZHIoc2tiKTsKIAkJdWRwX2xlbiA9IG50b2hzKHVoLT5sZW4pOwpAQCAtNTA5LDM1ICs1MjYsNiBAQAogCiAJCWNzdW1faW5mby0+dHJhbnNtaXQudWRwX2NoZWNrc3VtID0gMDsKIAl9Ci0JZ290byBkb19zZW5kOwotCi1kb19sc286Ci0Jcm5kaXNfbXNnX3NpemUgKz0gTkRJU19MU09fUFBJX1NJWkU7Ci0JcHBpID0gaW5pdF9wcGlfZGF0YShybmRpc19tc2csIE5ESVNfTFNPX1BQSV9TSVpFLAotCQkJICAgIFRDUF9MQVJHRVNFTkRfUEtUSU5GTyk7Ci0KLQlsc29faW5mbyA9IChzdHJ1Y3QgbmRpc190Y3BfbHNvX2luZm8gKikoKHZvaWQgKilwcGkgKwotCQkJcHBpLT5wcGlfb2Zmc2V0KTsKLQotCWxzb19pbmZvLT5sc29fdjJfdHJhbnNtaXQudHlwZSA9IE5ESVNfVENQX0xBUkdFX1NFTkRfT0ZGTE9BRF9WMl9UWVBFOwotCWlmIChuZXRfdHJhbnNfaW5mbyAmIChJTkZPX0lQVjQgPDwgMTYpKSB7Ci0JCWxzb19pbmZvLT5sc29fdjJfdHJhbnNtaXQuaXBfdmVyc2lvbiA9Ci0JCQlORElTX1RDUF9MQVJHRV9TRU5EX09GRkxPQURfSVBWNDsKLQkJaXBfaGRyKHNrYiktPnRvdF9sZW4gPSAwOwotCQlpcF9oZHIoc2tiKS0+Y2hlY2sgPSAwOwotCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0KLQkJfmNzdW1fdGNwdWRwX21hZ2ljKGlwX2hkcihza2IpLT5zYWRkciwKLQkJCQkgICBpcF9oZHIoc2tiKS0+ZGFkZHIsIDAsIElQUFJPVE9fVENQLCAwKTsKLQl9IGVsc2UgewotCQlsc29faW5mby0+bHNvX3YyX3RyYW5zbWl0LmlwX3ZlcnNpb24gPQotCQkJTkRJU19UQ1BfTEFSR0VfU0VORF9PRkZMT0FEX0lQVjY7Ci0JCWlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuID0gMDsKLQkJdGNwX2hkcihza2IpLT5jaGVjayA9Ci0JCX5jc3VtX2lwdjZfbWFnaWMoJmlwdjZfaGRyKHNrYiktPnNhZGRyLAotCQkJCSZpcHY2X2hkcihza2IpLT5kYWRkciwgMCwgSVBQUk9UT19UQ1AsIDApOwotCX0KLQlsc29faW5mby0+bHNvX3YyX3RyYW5zbWl0LnRjcF9oZWFkZXJfb2Zmc2V0ID0gaGRyX29mZnNldDsKLQlsc29faW5mby0+bHNvX3YyX3RyYW5zbWl0Lm1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7CiAKIGRvX3NlbmQ6CiAJLyogU3RhcnQgZmlsbGluZyBpbiB0aGUgcGFnZSBidWZmZXJzIHdpdGggdGhlIHJuZGlzIGhkciAqLwpAQCAtNTUwLDIxICs1MzgsMzMgQEAKIAlza2JfdHhfdGltZXN0YW1wKHNrYik7CiAJcmV0ID0gbmV0dnNjX3NlbmQobmV0X2RldmljZV9jdHgtPmRldmljZV9jdHgsIHBhY2tldCwKIAkJCSAgcm5kaXNfbXNnLCAmcGIsIHNrYik7CisJaWYgKGxpa2VseShyZXQgPT0gMCkpIHsKKwkJc3RydWN0IG5ldHZzY19zdGF0cyAqdHhfc3RhdHMgPSB0aGlzX2NwdV9wdHIobmV0X2RldmljZV9jdHgtPnR4X3N0YXRzKTsKIAotZHJvcDoKLQlpZiAocmV0ID09IDApIHsKIAkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmdHhfc3RhdHMtPnN5bmNwKTsKIAkJdHhfc3RhdHMtPnBhY2tldHMrKzsKIAkJdHhfc3RhdHMtPmJ5dGVzICs9IHNrYl9sZW5ndGg7CiAJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZ0eF9zdGF0cy0+c3luY3ApOwotCX0gZWxzZSB7Ci0JCWlmIChyZXQgIT0gLUVBR0FJTikgewotCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJCW5ldC0+c3RhdHMudHhfZHJvcHBlZCsrOwotCQl9CisJCXJldHVybiBORVRERVZfVFhfT0s7CiAJfQogCi0JcmV0dXJuIChyZXQgPT0gLUVBR0FJTikgPyBORVRERVZfVFhfQlVTWSA6IE5FVERFVl9UWF9PSzsKKwlpZiAocmV0ID09IC1FQUdBSU4pIHsKKwkJKytuZXRfZGV2aWNlX2N0eC0+ZXRoX3N0YXRzLnR4X2J1c3k7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwlpZiAocmV0ID09IC1FTk9TUEMpCisJCSsrbmV0X2RldmljZV9jdHgtPmV0aF9zdGF0cy50eF9ub19zcGFjZTsKKworZHJvcDoKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCW5ldC0+c3RhdHMudHhfZHJvcHBlZCsrOworCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKKworbm9fbWVtb3J5OgorCSsrbmV0X2RldmljZV9jdHgtPmV0aF9zdGF0cy50eF9ub19tZW1vcnk7CisJZ290byBkcm9wOwogfQogCiAvKgpAQCAtNTc5LDE5ICs1NzksMzIgQEAKIAlzdHJ1Y3QgbmV0dnNjX3JlY29uZmlnICpldmVudDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogSGFuZGxlIGxpbmsgY2hhbmdlIHN0YXR1c2VzIG9ubHkgKi8KKwluZXQgPSBodl9nZXRfZHJ2ZGF0YShkZXZpY2Vfb2JqKTsKKworCWlmICghbmV0KQorCQlyZXR1cm47CisKKwluZGV2X2N0eCA9IG5ldGRldl9wcml2KG5ldCk7CisKKwkvKiBVcGRhdGUgdGhlIHBoeXNpY2FsIGxpbmsgc3BlZWQgd2hlbiBjaGFuZ2luZyB0byBhbm90aGVyIHZTd2l0Y2ggKi8KKwlpZiAoaW5kaWNhdGUtPnN0YXR1cyA9PSBSTkRJU19TVEFUVVNfTElOS19TUEVFRF9DSEFOR0UpIHsKKwkJdTMyIHNwZWVkOworCisJCXNwZWVkID0gKih1MzIgKikoKHZvaWQgKilpbmRpY2F0ZSArIGluZGljYXRlLT4KKwkJCQkgc3RhdHVzX2J1Zl9vZmZzZXQpIC8gMTAwMDA7CisJCW5kZXZfY3R4LT5zcGVlZCA9IHNwZWVkOworCQlyZXR1cm47CisJfQorCisJLyogSGFuZGxlIHRoZXNlIGxpbmsgY2hhbmdlIHN0YXR1c2VzIGJlbG93ICovCiAJaWYgKGluZGljYXRlLT5zdGF0dXMgIT0gUk5ESVNfU1RBVFVTX05FVFdPUktfQ0hBTkdFICYmCiAJICAgIGluZGljYXRlLT5zdGF0dXMgIT0gUk5ESVNfU1RBVFVTX01FRElBX0NPTk5FQ1QgJiYKIAkgICAgaW5kaWNhdGUtPnN0YXR1cyAhPSBSTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCkKIAkJcmV0dXJuOwogCi0JbmV0ID0gaHZfZ2V0X2RydmRhdGEoZGV2aWNlX29iaik7Ci0KLQlpZiAoIW5ldCB8fCBuZXQtPnJlZ19zdGF0ZSAhPSBORVRSRUdfUkVHSVNURVJFRCkKKwlpZiAobmV0LT5yZWdfc3RhdGUgIT0gTkVUUkVHX1JFR0lTVEVSRUQpCiAJCXJldHVybjsKIAotCW5kZXZfY3R4ID0gbmV0ZGV2X3ByaXYobmV0KTsKLQogCWV2ZW50ID0ga3phbGxvYyhzaXplb2YoKmV2ZW50KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFldmVudCkKIAkJcmV0dXJuOwpAQCAtNjA0LDcgKzYxNyw2IEBACiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZuZGV2X2N0eC0+ZHdvcmssIDApOwogfQogCi0KIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbmV0dnNjX2FsbG9jX3JlY3Zfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsCiAJCQkJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBhY2tldCwKIAkJCQlzdHJ1Y3QgbmRpc190Y3BfaXBfY2hlY2tzdW1faW5mbyAqY3N1bV9pbmZvLApAQCAtNjU1LDUwICs2NjcsMjMgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ID0gaHZfZ2V0X2RydmRhdGEoZGV2aWNlX29iaik7CiAJc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmV0X2RldmljZV9jdHggPSBuZXRkZXZfcHJpdihuZXQpOworCXN0cnVjdCBuZXRfZGV2aWNlICp2Zl9uZXRkZXY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqdmZfc2tiOwogCXN0cnVjdCBuZXR2c2Nfc3RhdHMgKnJ4X3N0YXRzOwotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXR2c2NfZGV2ID0gbmV0X2RldmljZV9jdHgtPm52ZGV2OwotCXUzMiBieXRlc19yZWN2ZCA9IHBhY2tldC0+dG90YWxfZGF0YV9idWZsZW47Ci0JaW50IHJldCA9IDA7CiAKLQlpZiAoIW5ldCB8fCBuZXQtPnJlZ19zdGF0ZSAhPSBORVRSRUdfUkVHSVNURVJFRCkKKwlpZiAobmV0LT5yZWdfc3RhdGUgIT0gTkVUUkVHX1JFR0lTVEVSRUQpCiAJCXJldHVybiBOVlNQX1NUQVRfRkFJTDsKIAotCWlmIChSRUFEX09OQ0UobmV0dnNjX2Rldi0+dmZfaW5qZWN0KSkgewotCQlhdG9taWNfaW5jKCZuZXR2c2NfZGV2LT52Zl91c2VfY250KTsKLQkJaWYgKCFSRUFEX09OQ0UobmV0dnNjX2Rldi0+dmZfaW5qZWN0KSkgewotCQkJLyoKLQkJCSAqIFdlIHJhY2VkOyBqdXN0IG1vdmUgb24uCi0JCQkgKi8KLQkJCWF0b21pY19kZWMoJm5ldHZzY19kZXYtPnZmX3VzZV9jbnQpOwotCQkJZ290byB2Zl9pbmplY3Rpb25fZG9uZTsKLQkJfQotCi0JCS8qCi0JCSAqIEluamVjdCB0aGlzIHBhY2tldCBpbnRvIHRoZSBWRiBpbmVyZmFjZS4KLQkJICogT24gSHlwZXItViwgbXVsdGljYXN0IGFuZCBicm9kY2FzdCBwYWNrZXRzCi0JCSAqIGFyZSBvbmx5IGRlbGl2ZXJlZCBvbiB0aGUgc3ludGhldGljIGludGVyZmFjZQotCQkgKiAoYWZ0ZXIgc3ViamVjdGluZyB0aGVzZSB0byBwb2xpY3kgZmlsdGVycyBvbgotCQkgKiB0aGUgaG9zdCkuIERlbGl2ZXIgdGhlc2UgdmlhIHRoZSBWRiBpbnRlcmZhY2UKLQkJICogaW4gdGhlIGd1ZXN0LgotCQkgKi8KLQkJdmZfc2tiID0gbmV0dnNjX2FsbG9jX3JlY3Zfc2tiKG5ldHZzY19kZXYtPnZmX25ldGRldiwgcGFja2V0LAotCQkJCQkgICAgICAgY3N1bV9pbmZvLCAqZGF0YSwgdmxhbl90Y2kpOwotCQlpZiAodmZfc2tiICE9IE5VTEwpIHsKLQkJCSsrbmV0dnNjX2Rldi0+dmZfbmV0ZGV2LT5zdGF0cy5yeF9wYWNrZXRzOwotCQkJbmV0dnNjX2Rldi0+dmZfbmV0ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBieXRlc19yZWN2ZDsKLQkJCW5ldGlmX3JlY2VpdmVfc2tiKHZmX3NrYik7Ci0JCX0gZWxzZSB7Ci0JCQkrK25ldC0+c3RhdHMucnhfZHJvcHBlZDsKLQkJCXJldCA9IE5WU1BfU1RBVF9GQUlMOwotCQl9Ci0JCWF0b21pY19kZWMoJm5ldHZzY19kZXYtPnZmX3VzZV9jbnQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotdmZfaW5qZWN0aW9uX2RvbmU6Ci0Jcnhfc3RhdHMgPSB0aGlzX2NwdV9wdHIobmV0X2RldmljZV9jdHgtPnJ4X3N0YXRzKTsKKwkvKgorCSAqIElmIG5lY2Vzc2FyeSwgaW5qZWN0IHRoaXMgcGFja2V0IGludG8gdGhlIFZGIGludGVyZmFjZS4KKwkgKiBPbiBIeXBlci1WLCBtdWx0aWNhc3QgYW5kIGJyb2RjYXN0IHBhY2tldHMgYXJlIG9ubHkgZGVsaXZlcmVkCisJICogdG8gdGhlIHN5bnRoZXRpYyBpbnRlcmZhY2UgKGFmdGVyIHN1YmplY3RpbmcgdGhlc2UgdG8KKwkgKiBwb2xpY3kgZmlsdGVycyBvbiB0aGUgaG9zdCkuIERlbGl2ZXIgdGhlc2UgdmlhIHRoZSBWRgorCSAqIGludGVyZmFjZSBpbiB0aGUgZ3Vlc3QuCisJICovCisJdmZfbmV0ZGV2ID0gcmN1X2RlcmVmZXJlbmNlKG5ldF9kZXZpY2VfY3R4LT52Zl9uZXRkZXYpOworCWlmICh2Zl9uZXRkZXYgJiYgKHZmX25ldGRldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQluZXQgPSB2Zl9uZXRkZXY7CiAKIAkvKiBBbGxvY2F0ZSBhIHNrYiAtIFRPRE8gZGlyZWN0IEkvTyB0byBwYWdlcz8gKi8KIAlza2IgPSBuZXR2c2NfYWxsb2NfcmVjdl9za2IobmV0LCBwYWNrZXQsIGNzdW1faW5mbywgKmRhdGEsIHZsYW5fdGNpKTsKQEAgLTcwNiwxMiArNjkxLDI1IEBACiAJCSsrbmV0LT5zdGF0cy5yeF9kcm9wcGVkOwogCQlyZXR1cm4gTlZTUF9TVEFUX0ZBSUw7CiAJfQotCXNrYl9yZWNvcmRfcnhfcXVldWUoc2tiLCBjaGFubmVsLT4KLQkJCSAgICBvZmZlcm1zZy5vZmZlci5zdWJfY2hhbm5lbF9pbmRleCk7CiAKKwlpZiAobmV0ICE9IHZmX25ldGRldikKKwkJc2tiX3JlY29yZF9yeF9xdWV1ZShza2IsCisJCQkJICAgIGNoYW5uZWwtPm9mZmVybXNnLm9mZmVyLnN1Yl9jaGFubmVsX2luZGV4KTsKKworCS8qCisJICogRXZlbiBpZiBpbmplY3RpbmcgdGhlIHBhY2tldCwgcmVjb3JkIHRoZSBzdGF0aXN0aWNzCisJICogb24gdGhlIHN5bnRoZXRpYyBkZXZpY2UgYmVjYXVzZSBtb2RpZnlpbmcgdGhlIFZGIGRldmljZQorCSAqIHN0YXRpc3RpY3Mgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkuCisJICovCisJcnhfc3RhdHMgPSB0aGlzX2NwdV9wdHIobmV0X2RldmljZV9jdHgtPnJ4X3N0YXRzKTsKIAl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9zdGF0cy0+c3luY3ApOwogCXJ4X3N0YXRzLT5wYWNrZXRzKys7CiAJcnhfc3RhdHMtPmJ5dGVzICs9IHBhY2tldC0+dG90YWxfZGF0YV9idWZsZW47CisKKwlpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfQlJPQURDQVNUKQorCQkrK3J4X3N0YXRzLT5icm9hZGNhc3Q7CisJZWxzZSBpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfTVVMVElDQVNUKQorCQkrK3J4X3N0YXRzLT5tdWx0aWNhc3Q7CiAJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnJ4X3N0YXRzLT5zeW5jcCk7CiAKIAkvKgpAQCAtNzI3LDggKzcyNSwxMiBAQAogc3RhdGljIHZvaWQgbmV0dnNjX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsCiAJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZXRfZGV2aWNlX2N0eCA9IG5ldGRldl9wcml2KG5ldCk7CisJc3RydWN0IGh2X2RldmljZSAqZGV2ID0gbmV0X2RldmljZV9jdHgtPmRldmljZV9jdHg7CisKIAlzdHJsY3B5KGluZm8tPmRyaXZlciwgS0JVSUxEX01PRE5BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKIAlzdHJsY3B5KGluZm8tPmZ3X3ZlcnNpb24sICJOL0EiLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHZtYnVzX2Rldl9uYW1lKGRldiksIHNpemVvZihpbmZvLT5idXNfaW5mbykpOwogfQogCiBzdGF0aWMgdm9pZCBuZXR2c2NfZ2V0X2NoYW5uZWxzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsCkBAIC05NTAsNyArOTUyLDcgQEAKIAkJCQkJCQkgICAgY3B1KTsKIAkJc3RydWN0IG5ldHZzY19zdGF0cyAqcnhfc3RhdHMgPSBwZXJfY3B1X3B0cihuZGV2X2N0eC0+cnhfc3RhdHMsCiAJCQkJCQkJICAgIGNwdSk7Ci0JCXU2NCB0eF9wYWNrZXRzLCB0eF9ieXRlcywgcnhfcGFja2V0cywgcnhfYnl0ZXM7CisJCXU2NCB0eF9wYWNrZXRzLCB0eF9ieXRlcywgcnhfcGFja2V0cywgcnhfYnl0ZXMsIHJ4X211bHRpY2FzdDsKIAkJdW5zaWduZWQgaW50IHN0YXJ0OwogCiAJCWRvIHsKQEAgLTk2MywxMiArOTY1LDE0IEBACiAJCQlzdGFydCA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbl9pcnEoJnJ4X3N0YXRzLT5zeW5jcCk7CiAJCQlyeF9wYWNrZXRzID0gcnhfc3RhdHMtPnBhY2tldHM7CiAJCQlyeF9ieXRlcyA9IHJ4X3N0YXRzLT5ieXRlczsKKwkJCXJ4X211bHRpY2FzdCA9IHJ4X3N0YXRzLT5tdWx0aWNhc3QgKyByeF9zdGF0cy0+YnJvYWRjYXN0OwogCQl9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnlfaXJxKCZyeF9zdGF0cy0+c3luY3AsIHN0YXJ0KSk7CiAKIAkJdC0+dHhfYnl0ZXMJKz0gdHhfYnl0ZXM7CiAJCXQtPnR4X3BhY2tldHMJKz0gdHhfcGFja2V0czsKIAkJdC0+cnhfYnl0ZXMJKz0gcnhfYnl0ZXM7CiAJCXQtPnJ4X3BhY2tldHMJKz0gcnhfcGFja2V0czsKKwkJdC0+bXVsdGljYXN0CSs9IHJ4X211bHRpY2FzdDsKIAl9CiAKIAl0LT50eF9kcm9wcGVkCT0gbmV0LT5zdGF0cy50eF9kcm9wcGVkOwpAQCAtMTAwNCw2ICsxMDA4LDUxIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJY2hhciBuYW1lW0VUSF9HU1RSSU5HX0xFTl07CisJdTE2IG9mZnNldDsKK30gbmV0dnNjX3N0YXRzW10gPSB7CisJeyAidHhfc2NhdHRlcmVkIiwgb2Zmc2V0b2Yoc3RydWN0IG5ldHZzY19ldGh0b29sX3N0YXRzLCB0eF9zY2F0dGVyZWQpIH0sCisJeyAidHhfbm9fbWVtb3J5IiwgIG9mZnNldG9mKHN0cnVjdCBuZXR2c2NfZXRodG9vbF9zdGF0cywgdHhfbm9fbWVtb3J5KSB9LAorCXsgInR4X25vX3NwYWNlIiwgIG9mZnNldG9mKHN0cnVjdCBuZXR2c2NfZXRodG9vbF9zdGF0cywgdHhfbm9fc3BhY2UpIH0sCisJeyAidHhfdG9vX2JpZyIsCSAgb2Zmc2V0b2Yoc3RydWN0IG5ldHZzY19ldGh0b29sX3N0YXRzLCB0eF90b29fYmlnKSB9LAorCXsgInR4X2J1c3kiLAkgIG9mZnNldG9mKHN0cnVjdCBuZXR2c2NfZXRodG9vbF9zdGF0cywgdHhfYnVzeSkgfSwKK307CisKK3N0YXRpYyBpbnQgbmV0dnNjX2dldF9zc2V0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdHJpbmdfc2V0KQoreworCXN3aXRjaCAoc3RyaW5nX3NldCkgeworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQlyZXR1cm4gQVJSQVlfU0laRShuZXR2c2Nfc3RhdHMpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIHZvaWQgbmV0dnNjX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZGMgPSBuZXRkZXZfcHJpdihkZXYpOworCWNvbnN0IHZvaWQgKm5kcyA9ICZuZGMtPmV0aF9zdGF0czsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG5ldHZzY19zdGF0cyk7IGkrKykKKwkJZGF0YVtpXSA9ICoodW5zaWduZWQgbG9uZyAqKShuZHMgKyBuZXR2c2Nfc3RhdHNbaV0ub2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgbmV0dnNjX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQoreworCWludCBpOworCisJc3dpdGNoIChzdHJpbmdzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobmV0dnNjX3N0YXRzKTsgaSsrKQorCQkJbWVtY3B5KGRhdGEgKyBpICogRVRIX0dTVFJJTkdfTEVOLAorCQkJICAgICAgIG5ldHZzY19zdGF0c1tpXS5uYW1lLCBFVEhfR1NUUklOR19MRU4pOworCQlicmVhazsKKwl9Cit9CisKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogc3RhdGljIHZvaWQgbmV0dnNjX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewpAQCAtMTAxNiw2ICsxMDY1LDkgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvCT0gbmV0dnNjX2dldF9kcnZpbmZvLAogCS5nZXRfbGluawk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9ldGh0b29sX3N0YXRzID0gbmV0dnNjX2dldF9ldGh0b29sX3N0YXRzLAorCS5nZXRfc3NldF9jb3VudCA9IG5ldHZzY19nZXRfc3NldF9jb3VudCwKKwkuZ2V0X3N0cmluZ3MJPSBuZXR2c2NfZ2V0X3N0cmluZ3MsCiAJLmdldF9jaGFubmVscyAgID0gbmV0dnNjX2dldF9jaGFubmVscywKIAkuc2V0X2NoYW5uZWxzICAgPSBuZXR2c2Nfc2V0X2NoYW5uZWxzLAogCS5nZXRfdHNfaW5mbwk9IGV0aHRvb2xfb3BfZ2V0X3RzX2luZm8sCkBAIC0xMTUwLDM2ICsxMjAyLDQ0IEBACiAJZnJlZV9uZXRkZXYobmV0ZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgbmV0dnNjX25vdGlmeV9wZWVycyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndyaykKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZ2V0X25ldHZzY19ieW1hYyhjb25zdCB1OCAqbWFjKQogewotCXN0cnVjdCBnYXJwX3dyayAqZ3dyazsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCi0JZ3dyayA9IGNvbnRhaW5lcl9vZih3cmssIHN0cnVjdCBnYXJwX3dyaywgZHdyayk7Ci0KLQluZXRkZXZfbm90aWZ5X3BlZXJzKGd3cmstPm5ldGRldik7Ci0KLQlhdG9taWNfZGVjKCZnd3JrLT5uZXR2c2NfZGV2LT52Zl91c2VfY250KTsKLX0KLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpnZXRfbmV0dnNjX25ldF9kZXZpY2UoY2hhciAqbWFjKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsICpmb3VuZCA9IE5VTEw7Ci0JaW50IHJ0bmxfbG9ja2VkOwotCi0JcnRubF9sb2NrZWQgPSBydG5sX3RyeWxvY2soKTsKKwlBU1NFUlRfUlROTCgpOwogCiAJZm9yX2VhY2hfbmV0ZGV2KCZpbml0X25ldCwgZGV2KSB7Ci0JCWlmIChtZW1jbXAoZGV2LT5kZXZfYWRkciwgbWFjLCBFVEhfQUxFTikgPT0gMCkgewotCQkJaWYgKGRldi0+bmV0ZGV2X29wcyAhPSAmZGV2aWNlX29wcykKLQkJCQljb250aW51ZTsKLQkJCWZvdW5kID0gZGV2OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKHJ0bmxfbG9ja2VkKQotCQlydG5sX3VubG9jaygpOworCQlpZiAoZGV2LT5uZXRkZXZfb3BzICE9ICZkZXZpY2Vfb3BzKQorCQkJY29udGludWU7CS8qIG5vdCBhIG5ldHZzYyBkZXZpY2UgKi8KIAotCXJldHVybiBmb3VuZDsKKwkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobWFjLCBkZXYtPnBlcm1fYWRkcikpCisJCQlyZXR1cm4gZGV2OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmdldF9uZXR2c2NfYnlyZWYoc3RydWN0IG5ldF9kZXZpY2UgKnZmX25ldGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJQVNTRVJUX1JUTkwoKTsKKworCWZvcl9lYWNoX25ldGRldigmaW5pdF9uZXQsIGRldikgeworCQlzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZXRfZGV2aWNlX2N0eDsKKworCQlpZiAoZGV2LT5uZXRkZXZfb3BzICE9ICZkZXZpY2Vfb3BzKQorCQkJY29udGludWU7CS8qIG5vdCBhIG5ldHZzYyBkZXZpY2UgKi8KKworCQluZXRfZGV2aWNlX2N0eCA9IG5ldGRldl9wcml2KGRldik7CisJCWlmIChuZXRfZGV2aWNlX2N0eC0+bnZkZXYgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOwkvKiBkZXZpY2UgaXMgcmVtb3ZlZCAqLworCisJCWlmIChydG5sX2RlcmVmZXJlbmNlKG5ldF9kZXZpY2VfY3R4LT52Zl9uZXRkZXYpID09IHZmX25ldGRldikKKwkJCXJldHVybiBkZXY7CS8qIGEgbWF0Y2ggKi8KKwl9CisKKwlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludCBuZXR2c2NfcmVnaXN0ZXJfdmYoc3RydWN0IG5ldF9kZXZpY2UgKnZmX25ldGRldikKQEAgLTExODcsOSArMTI0Nyw4IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAJc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmV0X2RldmljZV9jdHg7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldHZzY19kZXY7Ci0JY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzICpldGhfb3BzID0gdmZfbmV0ZGV2LT5ldGh0b29sX29wczsKIAotCWlmIChldGhfb3BzID09IE5VTEwgfHwgZXRoX29wcyA9PSAmZXRodG9vbF9vcHMpCisJaWYgKHZmX25ldGRldi0+YWRkcl9sZW4gIT0gRVRIX0FMRU4pCiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAogCS8qCkBAIC0xMTk3LDEzICsxMjU2LDEzIEBACiAJICogYXNzb2NpYXRlIHdpdGggdGhlIFZGIGludGVyZmFjZS4gSWYgd2UgZG9uJ3QgZmluZCBhIG1hdGNoaW5nCiAJICogc3ludGhldGljIGludGVyZmFjZSwgbW92ZSBvbi4KIAkgKi8KLQluZGV2ID0gZ2V0X25ldHZzY19uZXRfZGV2aWNlKHZmX25ldGRldi0+ZGV2X2FkZHIpOworCW5kZXYgPSBnZXRfbmV0dnNjX2J5bWFjKHZmX25ldGRldi0+cGVybV9hZGRyKTsKIAlpZiAoIW5kZXYpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAogCW5ldF9kZXZpY2VfY3R4ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJbmV0dnNjX2RldiA9IG5ldF9kZXZpY2VfY3R4LT5udmRldjsKLQlpZiAobmV0dnNjX2RldiA9PSBOVUxMKQorCWlmICghbmV0dnNjX2RldiB8fCBydG5sX2RlcmVmZXJlbmNlKG5ldF9kZXZpY2VfY3R4LT52Zl9uZXRkZXYpKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKIAluZXRkZXZfaW5mbyhuZGV2LCAiVkYgcmVnaXN0ZXJpbmc6ICVzXG4iLCB2Zl9uZXRkZXYtPm5hbWUpOwpAQCAtMTIxMSwzMyArMTI3MCwyNiBAQAogCSAqIFRha2UgYSByZWZlcmVuY2Ugb24gdGhlIG1vZHVsZS4KIAkgKi8KIAl0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSk7Ci0JbmV0dnNjX2Rldi0+dmZfbmV0ZGV2ID0gdmZfbmV0ZGV2OworCisJZGV2X2hvbGQodmZfbmV0ZGV2KTsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmV0X2RldmljZV9jdHgtPnZmX25ldGRldiwgdmZfbmV0ZGV2KTsKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCi0KIHN0YXRpYyBpbnQgbmV0dnNjX3ZmX3VwKHN0cnVjdCBuZXRfZGV2aWNlICp2Zl9uZXRkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldHZzY19kZXY7Ci0JY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzICpldGhfb3BzID0gdmZfbmV0ZGV2LT5ldGh0b29sX29wczsKIAlzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZXRfZGV2aWNlX2N0eDsKIAotCWlmIChldGhfb3BzID09ICZldGh0b29sX29wcykKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCi0JbmRldiA9IGdldF9uZXR2c2NfbmV0X2RldmljZSh2Zl9uZXRkZXYtPmRldl9hZGRyKTsKKwluZGV2ID0gZ2V0X25ldHZzY19ieXJlZih2Zl9uZXRkZXYpOwogCWlmICghbmRldikKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCiAJbmV0X2RldmljZV9jdHggPSBuZXRkZXZfcHJpdihuZGV2KTsKIAluZXR2c2NfZGV2ID0gbmV0X2RldmljZV9jdHgtPm52ZGV2OwogCi0JaWYgKChuZXR2c2NfZGV2ID09IE5VTEwpIHx8IChuZXR2c2NfZGV2LT52Zl9uZXRkZXYgPT0gTlVMTCkpCi0JCXJldHVybiBOT1RJRllfRE9ORTsKLQogCW5ldGRldl9pbmZvKG5kZXYsICJWRiB1cDogJXNcbiIsIHZmX25ldGRldi0+bmFtZSk7Ci0JbmV0dnNjX2Rldi0+dmZfaW5qZWN0ID0gdHJ1ZTsKIAogCS8qCiAJICogT3BlbiB0aGUgZGV2aWNlIGJlZm9yZSBzd2l0Y2hpbmcgZGF0YSBwYXRoLgpAQCAtMTI1Miw4NiArMTMwNCw1NCBAQAogCiAJbmV0aWZfY2Fycmllcl9vZmYobmRldik7CiAKLQkvKgotCSAqIE5vdyBub3RpZnkgcGVlcnMuIFdlIGFyZSBzY2hlZHVsaW5nIHdvcmsgdG8KLQkgKiBub3RpZnkgcGVlcnM7IHRha2UgYSByZWZlcmVuY2UgdG8gcHJldmVudAotCSAqIHRoZSBWRiBpbnRlcmZhY2UgZnJvbSB2YW5pc2hpbmcuCi0JICovCi0JYXRvbWljX2luYygmbmV0dnNjX2Rldi0+dmZfdXNlX2NudCk7Ci0JbmV0X2RldmljZV9jdHgtPmd3cmsubmV0ZGV2ID0gdmZfbmV0ZGV2OwotCW5ldF9kZXZpY2VfY3R4LT5nd3JrLm5ldHZzY19kZXYgPSBuZXR2c2NfZGV2OwotCXNjaGVkdWxlX3dvcmsoJm5ldF9kZXZpY2VfY3R4LT5nd3JrLmR3cmspOworCS8qIE5vdyBub3RpZnkgcGVlcnMgdGhyb3VnaCBWRiBkZXZpY2UuICovCisJY2FsbF9uZXRkZXZpY2Vfbm90aWZpZXJzKE5FVERFVl9OT1RJRllfUEVFUlMsIHZmX25ldGRldik7CiAKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCi0KIHN0YXRpYyBpbnQgbmV0dnNjX3ZmX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKnZmX25ldGRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0dnNjX2RldjsKIAlzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZXRfZGV2aWNlX2N0eDsKLQljb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgKmV0aF9vcHMgPSB2Zl9uZXRkZXYtPmV0aHRvb2xfb3BzOwogCi0JaWYgKGV0aF9vcHMgPT0gJmV0aHRvb2xfb3BzKQotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KLQluZGV2ID0gZ2V0X25ldHZzY19uZXRfZGV2aWNlKHZmX25ldGRldi0+ZGV2X2FkZHIpOworCW5kZXYgPSBnZXRfbmV0dnNjX2J5cmVmKHZmX25ldGRldik7CiAJaWYgKCFuZGV2KQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKIAluZXRfZGV2aWNlX2N0eCA9IG5ldGRldl9wcml2KG5kZXYpOwogCW5ldHZzY19kZXYgPSBuZXRfZGV2aWNlX2N0eC0+bnZkZXY7CiAKLQlpZiAoKG5ldHZzY19kZXYgPT0gTlVMTCkgfHwgKG5ldHZzY19kZXYtPnZmX25ldGRldiA9PSBOVUxMKSkKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCiAJbmV0ZGV2X2luZm8obmRldiwgIlZGIGRvd246ICVzXG4iLCB2Zl9uZXRkZXYtPm5hbWUpOwotCW5ldHZzY19kZXYtPnZmX2luamVjdCA9IGZhbHNlOwotCS8qCi0JICogV2FpdCBmb3IgY3VycmVudGx5IGFjdGl2ZSB1c2VycyB0bwotCSAqIGRyYWluIG91dC4KLQkgKi8KLQotCXdoaWxlIChhdG9taWNfcmVhZCgmbmV0dnNjX2Rldi0+dmZfdXNlX2NudCkgIT0gMCkKLQkJdWRlbGF5KDUwKTsKIAluZXR2c2Nfc3dpdGNoX2RhdGFwYXRoKG5kZXYsIGZhbHNlKTsKIAluZXRkZXZfaW5mbyhuZGV2LCAiRGF0YSBwYXRoIHN3aXRjaGVkIGZyb20gVkY6ICVzXG4iLCB2Zl9uZXRkZXYtPm5hbWUpOwogCXJuZGlzX2ZpbHRlcl9jbG9zZShuZXR2c2NfZGV2KTsKIAluZXRpZl9jYXJyaWVyX29uKG5kZXYpOwotCS8qCi0JICogTm90aWZ5IHBlZXJzLgotCSAqLwotCWF0b21pY19pbmMoJm5ldHZzY19kZXYtPnZmX3VzZV9jbnQpOwotCW5ldF9kZXZpY2VfY3R4LT5nd3JrLm5ldGRldiA9IG5kZXY7Ci0JbmV0X2RldmljZV9jdHgtPmd3cmsubmV0dnNjX2RldiA9IG5ldHZzY19kZXY7Ci0Jc2NoZWR1bGVfd29yaygmbmV0X2RldmljZV9jdHgtPmd3cmsuZHdyayk7CisKKwkvKiBOb3cgbm90aWZ5IHBlZXJzIHRocm91Z2ggbmV0dnNjIGRldmljZS4gKi8KKwljYWxsX25ldGRldmljZV9ub3RpZmllcnMoTkVUREVWX05PVElGWV9QRUVSUywgbmRldik7CiAKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCi0KIHN0YXRpYyBpbnQgbmV0dnNjX3VucmVnaXN0ZXJfdmYoc3RydWN0IG5ldF9kZXZpY2UgKnZmX25ldGRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0dnNjX2RldjsKLQljb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgKmV0aF9vcHMgPSB2Zl9uZXRkZXYtPmV0aHRvb2xfb3BzOwogCXN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgKm5ldF9kZXZpY2VfY3R4OwogCi0JaWYgKGV0aF9vcHMgPT0gJmV0aHRvb2xfb3BzKQotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KLQluZGV2ID0gZ2V0X25ldHZzY19uZXRfZGV2aWNlKHZmX25ldGRldi0+ZGV2X2FkZHIpOworCW5kZXYgPSBnZXRfbmV0dnNjX2J5cmVmKHZmX25ldGRldik7CiAJaWYgKCFuZGV2KQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKIAluZXRfZGV2aWNlX2N0eCA9IG5ldGRldl9wcml2KG5kZXYpOwogCW5ldHZzY19kZXYgPSBuZXRfZGV2aWNlX2N0eC0+bnZkZXY7Ci0JaWYgKG5ldHZzY19kZXYgPT0gTlVMTCkKLQkJcmV0dXJuIE5PVElGWV9ET05FOworCiAJbmV0ZGV2X2luZm8obmRldiwgIlZGIHVucmVnaXN0ZXJpbmc6ICVzXG4iLCB2Zl9uZXRkZXYtPm5hbWUpOwogCi0JbmV0dnNjX2Rldi0+dmZfbmV0ZGV2ID0gTlVMTDsKKwlSQ1VfSU5JVF9QT0lOVEVSKG5ldF9kZXZpY2VfY3R4LT52Zl9uZXRkZXYsIE5VTEwpOworCWRldl9wdXQodmZfbmV0ZGV2KTsKIAltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIAlyZXR1cm4gTk9USUZZX09LOwogfQpAQCAtMTM1Miw2ICsxMzcyLDggQEAKIAogCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldCk7CiAKKwluZXR2c2NfaW5pdF9zZXR0aW5ncyhuZXQpOworCiAJbmV0X2RldmljZV9jdHggPSBuZXRkZXZfcHJpdihuZXQpOwogCW5ldF9kZXZpY2VfY3R4LT5kZXZpY2VfY3R4ID0gZGV2OwogCW5ldF9kZXZpY2VfY3R4LT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQoZGVidWcsIGRlZmF1bHRfbXNnKTsKQEAgLTEzNzcsNyArMTM5OSw2IEBACiAKIAlJTklUX0RFTEFZRURfV09SSygmbmV0X2RldmljZV9jdHgtPmR3b3JrLCBuZXR2c2NfbGlua19jaGFuZ2UpOwogCUlOSVRfV09SSygmbmV0X2RldmljZV9jdHgtPndvcmssIGRvX3NldF9tdWx0aWNhc3QpOwotCUlOSVRfV09SSygmbmV0X2RldmljZV9jdHgtPmd3cmsuZHdyaywgbmV0dnNjX25vdGlmeV9wZWVycyk7CiAKIAlzcGluX2xvY2tfaW5pdCgmbmV0X2RldmljZV9jdHgtPmxvY2spOwogCUlOSVRfTElTVF9IRUFEKCZuZXRfZGV2aWNlX2N0eC0+cmVjb25maWdfZXZlbnRzKTsKQEAgLTE0MTAsOCArMTQzMSw2IEBACiAJbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhuZXQsIG52ZGV2LT5udW1fY2huKTsKIAluZXRpZl9zZXRfcmVhbF9udW1fcnhfcXVldWVzKG5ldCwgbnZkZXYtPm51bV9jaG4pOwogCi0JbmV0dnNjX2luaXRfc2V0dGluZ3MobmV0KTsKLQogCXJldCA9IHJlZ2lzdGVyX25ldGRldihuZXQpOwogCWlmIChyZXQgIT0gMCkgewogCQlwcl9lcnIoIlVuYWJsZSB0byByZWdpc3RlciBuZXRkZXYuXG4iKTsKQEAgLTE0MzUsNyArMTQ1NCw2IEBACiAJCXJldHVybiAwOwogCX0KIAotCiAJbmRldl9jdHggPSBuZXRkZXZfcHJpdihuZXQpOwogCW5ldF9kZXZpY2UgPSBuZGV2X2N0eC0+bnZkZXY7CiAKQEAgLTE0ODIsNyArMTUwMCw2IEBACiAJLnJlbW92ZSA9IG5ldHZzY19yZW1vdmUsCiB9OwogCi0KIC8qCiAgKiBPbiBIeXBlci1WLCBldmVyeSBWRiBpbnRlcmZhY2UgaXMgbWF0Y2hlZCB3aXRoIGEgY29ycmVzcG9uZGluZwogICogc3ludGhldGljIGludGVyZmFjZS4gVGhlIHN5bnRoZXRpYyBpbnRlcmZhY2UgaXMgcHJlc2VudGVkIGZpcnN0CkBAIC0xNDk0LDggKzE1MTEsMjEgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZXZlbnRfZGV2ID0gbmV0ZGV2X25vdGlmaWVyX2luZm9fdG9fZGV2KHB0cik7CiAKLQkvKiBBdm9pZCBWbGFuLCBCb25kaW5nIGRldiB3aXRoIHNhbWUgTUFDIHJlZ2lzdGVyaW5nIGFzIFZGICovCi0JaWYgKGV2ZW50X2Rldi0+cHJpdl9mbGFncyAmIChJRkZfODAyXzFRX1ZMQU4gfCBJRkZfQk9ORElORykpCisJLyogU2tpcCBvdXIgb3duIGV2ZW50cyAqLworCWlmIChldmVudF9kZXYtPm5ldGRldl9vcHMgPT0gJmRldmljZV9vcHMpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCS8qIEF2b2lkIG5vbi1FdGhlcm5ldCB0eXBlIGRldmljZXMgKi8KKwlpZiAoZXZlbnRfZGV2LT50eXBlICE9IEFSUEhSRF9FVEhFUikKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJLyogQXZvaWQgVmxhbiBkZXYgd2l0aCBzYW1lIE1BQyByZWdpc3RlcmluZyBhcyBWRiAqLworCWlmIChldmVudF9kZXYtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4pCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCS8qIEF2b2lkIEJvbmRpbmcgbWFzdGVyIGRldiB3aXRoIHNhbWUgTUFDIHJlZ2lzdGVyaW5nIGFzIFZGICovCisJaWYgKChldmVudF9kZXYtPnByaXZfZmxhZ3MgJiBJRkZfQk9ORElORykgJiYKKwkgICAgKGV2ZW50X2Rldi0+ZmxhZ3MgJiBJRkZfTUFTVEVSKSkKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCiAJc3dpdGNoIChldmVudCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHlwZXJ2L3JuZGlzX2ZpbHRlci5jIGIvZHJpdmVycy9uZXQvaHlwZXJ2L3JuZGlzX2ZpbHRlci5jCmluZGV4IDhlODMwZjcuLjkxOTVkNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2h5cGVydi9ybmRpc19maWx0ZXIuYworKysgYi9kcml2ZXJzL25ldC9oeXBlcnYvcm5kaXNfZmlsdGVyLmMKQEAgLTY2MywxMyArNjYzLDE0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdTggbmV0dnNjX2hhc2hfa2V5W0hBU0hfS0VZTEVOXSA9IHsKK3N0YXRpYyBjb25zdCB1OCBuZXR2c2NfaGFzaF9rZXlbXSA9IHsKIAkweDZkLCAweDVhLCAweDU2LCAweGRhLCAweDI1LCAweDViLCAweDBlLCAweGMyLAogCTB4NDEsIDB4NjcsIDB4MjUsIDB4M2QsIDB4NDMsIDB4YTMsIDB4OGYsIDB4YjAsCiAJMHhkMCwgMHhjYSwgMHgyYiwgMHhjYiwgMHhhZSwgMHg3YiwgMHgzMCwgMHhiNCwKIAkweDc3LCAweGNiLCAweDJkLCAweGEzLCAweDgwLCAweDMwLCAweGYyLCAweDBjLAogCTB4NmEsIDB4NDIsIDB4YjcsIDB4M2IsIDB4YmUsIDB4YWMsIDB4MDEsIDB4ZmEKIH07CisjZGVmaW5lIEhBU0hfS0VZTEVOIEFSUkFZX1NJWkUobmV0dnNjX2hhc2hfa2V5KQogCiBzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9zZXRfcnNzX3BhcmFtKHN0cnVjdCBybmRpc19kZXZpY2UgKnJkZXYsIGludCBudW1fcXVldWUpCiB7CkBAIC03MjAsNyArNzIxLDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgSEFTSF9LRVlMRU47IGkrKykKIAkJa2V5cFtpXSA9IG5ldHZzY19oYXNoX2tleVtpXTsKIAotCiAJcmV0ID0gcm5kaXNfZmlsdGVyX3NlbmRfcmVxdWVzdChyZGV2LCByZXF1ZXN0KTsKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gY2xlYW51cDsKQEAgLTczOCw3ICs3MzgsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLQogc3RhdGljIGludCBybmRpc19maWx0ZXJfcXVlcnlfZGV2aWNlX2xpbmtfc3RhdHVzKHN0cnVjdCBybmRpc19kZXZpY2UgKmRldikKIHsKIAl1MzIgc2l6ZSA9IHNpemVvZih1MzIpOwpAQCAtNzUyLDYgKzc1MSwyOCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX3F1ZXJ5X2xpbmtfc3BlZWQoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2KQoreworCXUzMiBzaXplID0gc2l6ZW9mKHUzMik7CisJdTMyIGxpbmtfc3BlZWQ7CisJc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmRjOworCWludCByZXQ7CisKKwlyZXQgPSBybmRpc19maWx0ZXJfcXVlcnlfZGV2aWNlKGRldiwgUk5ESVNfT0lEX0dFTl9MSU5LX1NQRUVELAorCQkJCQkmbGlua19zcGVlZCwgJnNpemUpOworCisJaWYgKCFyZXQpIHsKKwkJbmRjID0gbmV0ZGV2X3ByaXYoZGV2LT5uZGV2KTsKKworCQkvKiBUaGUgbGluayBzcGVlZCByZXBvcnRlZCBmcm9tIGhvc3QgaXMgaW4gMTAwYnBzIHVuaXQsIHNvCisJCSAqIHdlIGNvbnZlcnQgaXQgdG8gTWJwcyBoZXJlLgorCQkgKi8KKwkJbmRjLT5zcGVlZCA9IGxpbmtfc3BlZWQgLyAxMDAwMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiBpbnQgcm5kaXNfZmlsdGVyX3NldF9wYWNrZXRfZmlsdGVyKHN0cnVjdCBybmRpc19kZXZpY2UgKmRldiwgdTMyIG5ld19maWx0ZXIpCiB7CiAJc3RydWN0IHJuZGlzX3JlcXVlc3QgKnJlcXVlc3Q7CkBAIC03OTIsNyArODEzLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0KIHN0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX2luaXRfZGV2aWNlKHN0cnVjdCBybmRpc19kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgcm5kaXNfcmVxdWVzdCAqcmVxdWVzdDsKQEAgLTg3NSwxMSArODk1LDExIEBACiAKIAkvKiBXYWl0IGZvciBhbGwgc2VuZCBjb21wbGV0aW9ucyAqLwogCXdhaXRfZXZlbnQobnZkZXYtPndhaXRfZHJhaW4sCi0JCWF0b21pY19yZWFkKCZudmRldi0+bnVtX291dHN0YW5kaW5nX3NlbmRzKSA9PSAwKTsKKwkJICAgYXRvbWljX3JlYWQoJm52ZGV2LT5udW1fb3V0c3RhbmRpbmdfc2VuZHMpID09IDAgJiYKKwkJICAgYXRvbWljX3JlYWQoJm52ZGV2LT5udW1fb3V0c3RhbmRpbmdfcmVjdnMpID09IDApOwogCiAJaWYgKHJlcXVlc3QpCiAJCXB1dF9ybmRpc19yZXF1ZXN0KGRldiwgcmVxdWVzdCk7Ci0JcmV0dXJuOwogfQogCiBzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9vcGVuX2RldmljZShzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYpCkBAIC05MzEsNiArOTUxLDkgQEAKIAlzZXRfcGVyX2NoYW5uZWxfc3RhdGUobmV3X3NjLCBudnNjZGV2LT5zdWJfY2JfYnVmICsgKGNobl9pbmRleCAtIDEpICoKIAkJCSAgICAgIE5FVFZTQ19QQUNLRVRfU0laRSk7CiAKKwludnNjZGV2LT5tcmNbY2huX2luZGV4XS5idWYgPSB2emFsbG9jKE5FVFZTQ19SRUNWU0xPVF9NQVggKgorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHJlY3ZfY29tcF9kYXRhKSk7CisKIAlyZXQgPSB2bWJ1c19vcGVuKG5ld19zYywgbnZzY2Rldi0+cmluZ19zaXplICogUEFHRV9TSVpFLAogCQkJIG52c2NkZXYtPnJpbmdfc2l6ZSAqIFBBR0VfU0laRSwgTlVMTCwgMCwKIAkJCSBuZXR2c2NfY2hhbm5lbF9jYiwgbmV3X3NjKTsKQEAgLTk0Niw3ICs5NjksNyBAQAogfQogCiBpbnQgcm5kaXNfZmlsdGVyX2RldmljZV9hZGQoc3RydWN0IGh2X2RldmljZSAqZGV2LAotCQkJCSAgdm9pZCAqYWRkaXRpb25hbF9pbmZvKQorCQkJICAgIHZvaWQgKmFkZGl0aW9uYWxfaW5mbykKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQgPSBodl9nZXRfZHJ2ZGF0YShkZXYpOwpAQCAtMTAyOCw3ICsxMDUxLDYgQEAKIAlvZmZsb2Fkcy51ZHBfaXBfdjZfY3N1bSA9IE5ESVNfT0ZGTE9BRF9QQVJBTUVURVJTX1RYX1JYX0VOQUJMRUQ7CiAJb2ZmbG9hZHMubHNvX3YyX2lwdjQgPSBORElTX09GRkxPQURfUEFSQU1FVEVSU19MU09WMl9FTkFCTEVEOwogCi0KIAlyZXQgPSBybmRpc19maWx0ZXJfc2V0X29mZmxvYWRfcGFyYW1zKG5ldCwgJm9mZmxvYWRzKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9kZXZfcmVtdjsKQEAgLTEwNDQsNiArMTA2Niw4IEBACiAJaWYgKG5ldF9kZXZpY2UtPm52c3BfdmVyc2lvbiA8IE5WU1BfUFJPVE9DT0xfVkVSU0lPTl81KQogCQlyZXR1cm4gMDsKIAorCXJuZGlzX2ZpbHRlcl9xdWVyeV9saW5rX3NwZWVkKHJuZGlzX2RldmljZSk7CisKIAkvKiB2UlNTIHNldHVwICovCiAJbWVtc2V0KCZyc3NjYXAsIDAsIHJzc2NhcF9zaXplKTsKIAlyZXQgPSBybmRpc19maWx0ZXJfcXVlcnlfZGV2aWNlKHJuZGlzX2RldmljZSwKQEAgLTExNTIsNyArMTE3Niw2IEBACiAJbmV0dnNjX2RldmljZV9yZW1vdmUoZGV2KTsKIH0KIAotCiBpbnQgcm5kaXNfZmlsdGVyX29wZW4oc3RydWN0IG5ldHZzY19kZXZpY2UgKm52ZGV2KQogewogCWlmICghbnZkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pZWVlODAyMTU0L2Zha2VsYi5jIGIvZHJpdmVycy9uZXQvaWVlZTgwMjE1NC9mYWtlbGIuYwppbmRleCAwYmVjZjBhLi5lYzM4N2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZWVlODAyMTU0L2Zha2VsYi5jCisrKyBiL2RyaXZlcnMvbmV0L2llZWU4MDIxNTQvZmFrZWxiLmMKQEAgLTMwLDcgKzMwLDcgQEAKIHN0YXRpYyBpbnQgbnVtbGJzID0gMjsKIAogc3RhdGljIExJU1RfSEVBRChmYWtlbGJfcGh5cyk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGZha2VsYl9waHlzX2xvY2spOworc3RhdGljIERFRklORV9NVVRFWChmYWtlbGJfcGh5c19sb2NrKTsKIAogc3RhdGljIExJU1RfSEVBRChmYWtlbGJfaWZ1cF9waHlzKTsKIHN0YXRpYyBERUZJTkVfUldMT0NLKGZha2VsYl9pZnVwX3BoeXNfbG9jayk7CkBAIC0xODgsOSArMTg4LDkgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9yZWc7CiAKLQlzcGluX2xvY2soJmZha2VsYl9waHlzX2xvY2spOworCW11dGV4X2xvY2soJmZha2VsYl9waHlzX2xvY2spOwogCWxpc3RfYWRkX3RhaWwoJnBoeS0+bGlzdCwgJmZha2VsYl9waHlzKTsKLQlzcGluX3VubG9jaygmZmFrZWxiX3BoeXNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZmYWtlbGJfcGh5c19sb2NrKTsKIAogCXJldHVybiAwOwogCkBAIC0yMjIsMTAgKzIyMiwxMCBAQAogCXJldHVybiAwOwogCiBlcnJfc2xhdmU6Ci0Jc3Bpbl9sb2NrKCZmYWtlbGJfcGh5c19sb2NrKTsKKwltdXRleF9sb2NrKCZmYWtlbGJfcGh5c19sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGh5LCB0bXAsICZmYWtlbGJfcGh5cywgbGlzdCkKIAkJZmFrZWxiX2RlbChwaHkpOwotCXNwaW5fdW5sb2NrKCZmYWtlbGJfcGh5c19sb2NrKTsKKwltdXRleF91bmxvY2soJmZha2VsYl9waHlzX2xvY2spOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTIzMywxMCArMjMzLDEwIEBACiB7CiAJc3RydWN0IGZha2VsYl9waHkgKnBoeSwgKnRtcDsKIAotCXNwaW5fbG9jaygmZmFrZWxiX3BoeXNfbG9jayk7CisJbXV0ZXhfbG9jaygmZmFrZWxiX3BoeXNfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBoeSwgdG1wLCAmZmFrZWxiX3BoeXMsIGxpc3QpCiAJCWZha2VsYl9kZWwocGh5KTsKLQlzcGluX3VubG9jaygmZmFrZWxiX3BoeXNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZmYWtlbGJfcGh5c19sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXB2bGFuL2lwdmxhbi5oIGIvZHJpdmVycy9uZXQvaXB2bGFuL2lwdmxhbi5oCmluZGV4IDY5NWE1ZGMuLjdlMDczMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lwdmxhbi9pcHZsYW4uaAorKysgYi9kcml2ZXJzL25ldC9pcHZsYW4vaXB2bGFuLmgKQEAgLTIzLDExICsyMywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgorI2luY2x1ZGUgPG5ldC9sM21kZXYuaD4KIAogI2RlZmluZSBJUFZMQU5fRFJWCSJpcHZsYW4iCiAjZGVmaW5lIElQVl9EUlZfVkVSCSIwLjEiCkBAIC0xMjQsNCArMTI2LDggQEAKIAkJCQkgICBjb25zdCB2b2lkICppYWRkciwgYm9vbCBpc192Nik7CiBib29sIGlwdmxhbl9hZGRyX2J1c3koc3RydWN0IGlwdmxfcG9ydCAqcG9ydCwgdm9pZCAqaWFkZHIsIGJvb2wgaXNfdjYpOwogdm9pZCBpcHZsYW5faHRfYWRkcl9kZWwoc3RydWN0IGlwdmxfYWRkciAqYWRkcik7CitzdHJ1Y3Qgc2tfYnVmZiAqaXB2bGFuX2wzX3JjdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgdTE2IHByb3RvKTsKK3Vuc2lnbmVkIGludCBpcHZsYW5fbmZfaW5wdXQodm9pZCAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKTsKICNlbmRpZiAvKiBfX0lQVkxBTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcHZsYW4vaXB2bGFuX2NvcmUuYyBiL2RyaXZlcnMvbmV0L2lwdmxhbi9pcHZsYW5fY29yZS5jCmluZGV4IGI1Zjk1MTEuLmI0ZTk5MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lwdmxhbi9pcHZsYW5fY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L2lwdmxhbi9pcHZsYW5fY29yZS5jCkBAIC01NjAsNiArNTYwLDcgQEAKIAljYXNlIElQVkxBTl9NT0RFX0wyOgogCQlyZXR1cm4gaXB2bGFuX3htaXRfbW9kZV9sMihza2IsIGRldik7CiAJY2FzZSBJUFZMQU5fTU9ERV9MMzoKKwljYXNlIElQVkxBTl9NT0RFX0wzUzoKIAkJcmV0dXJuIGlwdmxhbl94bWl0X21vZGVfbDMoc2tiLCBkZXYpOwogCX0KIApAQCAtNjY0LDYgKzY2NSw4IEBACiAJCXJldHVybiBpcHZsYW5faGFuZGxlX21vZGVfbDIocHNrYiwgcG9ydCk7CiAJY2FzZSBJUFZMQU5fTU9ERV9MMzoKIAkJcmV0dXJuIGlwdmxhbl9oYW5kbGVfbW9kZV9sMyhwc2tiLCBwb3J0KTsKKwljYXNlIElQVkxBTl9NT0RFX0wzUzoKKwkJcmV0dXJuIFJYX0hBTkRMRVJfUEFTUzsKIAl9CiAKIAkvKiBTaG91bGQgbm90IHJlYWNoIGhlcmUgKi8KQEAgLTY3MiwzICs2NzUsOTQgQEAKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gUlhfSEFORExFUl9DT05TVU1FRDsKIH0KKworc3RhdGljIHN0cnVjdCBpcHZsX2FkZHIgKmlwdmxhbl9za2JfdG9fYWRkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXB2bF9hZGRyICphZGRyID0gTlVMTDsKKwlzdHJ1Y3QgaXB2bF9wb3J0ICpwb3J0OworCXZvaWQgKmx5cjNoOworCWludCBhZGRyX3R5cGU7CisKKwlpZiAoIWRldiB8fCAhbmV0aWZfaXNfaXB2bGFuX3BvcnQoZGV2KSkKKwkJZ290byBvdXQ7CisKKwlwb3J0ID0gaXB2bGFuX3BvcnRfZ2V0X3JjdShkZXYpOworCWlmICghcG9ydCB8fCBwb3J0LT5tb2RlICE9IElQVkxBTl9NT0RFX0wzUykKKwkJZ290byBvdXQ7CisKKwlseXIzaCA9IGlwdmxhbl9nZXRfTDNfaGRyKHNrYiwgJmFkZHJfdHlwZSk7CisJaWYgKCFseXIzaCkKKwkJZ290byBvdXQ7CisKKwlhZGRyID0gaXB2bGFuX2FkZHJfbG9va3VwKHBvcnQsIGx5cjNoLCBhZGRyX3R5cGUsIHRydWUpOworb3V0OgorCXJldHVybiBhZGRyOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqaXB2bGFuX2wzX3JjdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgdTE2IHByb3RvKQoreworCXN0cnVjdCBpcHZsX2FkZHIgKmFkZHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKnNkZXY7CisKKwlhZGRyID0gaXB2bGFuX3NrYl90b19hZGRyKHNrYiwgZGV2KTsKKwlpZiAoIWFkZHIpCisJCWdvdG8gb3V0OworCisJc2RldiA9IGFkZHItPm1hc3Rlci0+ZGV2OworCXN3aXRjaCAocHJvdG8pIHsKKwljYXNlIEFGX0lORVQ6CisJeworCQlpbnQgZXJyOworCQlzdHJ1Y3QgaXBoZHIgKmlwNGggPSBpcF9oZHIoc2tiKTsKKworCQllcnIgPSBpcF9yb3V0ZV9pbnB1dF9ub3JlZihza2IsIGlwNGgtPmRhZGRyLCBpcDRoLT5zYWRkciwKKwkJCQkJICAgaXA0aC0+dG9zLCBzZGV2KTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJfQorCWNhc2UgQUZfSU5FVDY6CisJeworCQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CisJCXN0cnVjdCBpcHY2aGRyICppcDZoID0gaXB2Nl9oZHIoc2tiKTsKKwkJaW50IGZsYWdzID0gUlQ2X0xPT0tVUF9GX0hBU19TQUREUjsKKwkJc3RydWN0IGZsb3dpNiBmbDYgPSB7CisJCQkuZmxvd2k2X2lpZiAgID0gc2Rldi0+aWZpbmRleCwKKwkJCS5kYWRkciAgICAgICAgPSBpcDZoLT5kYWRkciwKKwkJCS5zYWRkciAgICAgICAgPSBpcDZoLT5zYWRkciwKKwkJCS5mbG93bGFiZWwgICAgPSBpcDZfZmxvd2luZm8oaXA2aCksCisJCQkuZmxvd2k2X21hcmsgID0gc2tiLT5tYXJrLAorCQkJLmZsb3dpNl9wcm90byA9IGlwNmgtPm5leHRoZHIsCisJCX07CisKKwkJc2tiX2RzdF9kcm9wKHNrYik7CisJCWRzdCA9IGlwNl9yb3V0ZV9pbnB1dF9sb29rdXAoZGV2X25ldChzZGV2KSwgc2RldiwgJmZsNiwgZmxhZ3MpOworCQlza2JfZHN0X3NldChza2IsIGRzdCk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKK291dDoKKwlyZXR1cm4gc2tiOworfQorCit1bnNpZ25lZCBpbnQgaXB2bGFuX25mX2lucHV0KHZvaWQgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgaXB2bF9hZGRyICphZGRyOworCXVuc2lnbmVkIGludCBsZW47CisKKwlhZGRyID0gaXB2bGFuX3NrYl90b19hZGRyKHNrYiwgc2tiLT5kZXYpOworCWlmICghYWRkcikKKwkJZ290byBvdXQ7CisKKwlza2ItPmRldiA9IGFkZHItPm1hc3Rlci0+ZGV2OworCWxlbiA9IHNrYi0+bGVuICsgRVRIX0hMRU47CisJaXB2bGFuX2NvdW50X3J4KGFkZHItPm1hc3RlciwgbGVuLCB0cnVlLCBmYWxzZSk7CitvdXQ6CisJcmV0dXJuIE5GX0FDQ0VQVDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lwdmxhbi9pcHZsYW5fbWFpbi5jIGIvZHJpdmVycy9uZXQvaXB2bGFuL2lwdmxhbl9tYWluLmMKaW5kZXggMThiNGU4Yy4uZjQ0MmViMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXB2bGFuL2lwdmxhbl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvaXB2bGFuL2lwdmxhbl9tYWluLmMKQEAgLTksMjQgKzksODcgQEAKIAogI2luY2x1ZGUgImlwdmxhbi5oIgogCitzdGF0aWMgdTMyIGlwdmxfbmZfaG9va19yZWZjbnQgPSAwOworCitzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwdmxfbmZvcHNbXSBfX3JlYWRfbW9zdGx5ID0geworCXsKKwkJLmhvb2sgICAgID0gaXB2bGFuX25mX2lucHV0LAorCQkucGYgICAgICAgPSBORlBST1RPX0lQVjQsCisJCS5ob29rbnVtICA9IE5GX0lORVRfTE9DQUxfSU4sCisJCS5wcmlvcml0eSA9IElOVF9NQVgsCisJfSwKKwl7CisJCS5ob29rICAgICA9IGlwdmxhbl9uZl9pbnB1dCwKKwkJLnBmICAgICAgID0gTkZQUk9UT19JUFY2LAorCQkuaG9va251bSAgPSBORl9JTkVUX0xPQ0FMX0lOLAorCQkucHJpb3JpdHkgPSBJTlRfTUFYLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGwzbWRldl9vcHMgaXB2bF9sM21kZXZfb3BzIF9fcmVhZF9tb3N0bHkgPSB7CisJLmwzbWRldl9sM19yY3YgPSBpcHZsYW5fbDNfcmN2LAorfTsKKwogc3RhdGljIHZvaWQgaXB2bGFuX2FkanVzdF9tdHUoc3RydWN0IGlwdmxfZGV2ICppcHZsYW4sIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJaXB2bGFuLT5kZXYtPm10dSA9IGRldi0+bXR1IC0gaXB2bGFuLT5tdHVfYWRqOwogfQogCi1zdGF0aWMgdm9pZCBpcHZsYW5fc2V0X3BvcnRfbW9kZShzdHJ1Y3QgaXB2bF9wb3J0ICpwb3J0LCB1MTYgbnZhbCkKK3N0YXRpYyBpbnQgaXB2bGFuX3JlZ2lzdGVyX25mX2hvb2sodm9pZCkKK3sKKwlpbnQgZXJyID0gMDsKKworCWlmICghaXB2bF9uZl9ob29rX3JlZmNudCkgeworCQllcnIgPSBfbmZfcmVnaXN0ZXJfaG9va3MoaXB2bF9uZm9wcywgQVJSQVlfU0laRShpcHZsX25mb3BzKSk7CisJCWlmICghZXJyKQorCQkJaXB2bF9uZl9ob29rX3JlZmNudCA9IDE7CisJfSBlbHNlIHsKKwkJaXB2bF9uZl9ob29rX3JlZmNudCsrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGlwdmxhbl91bnJlZ2lzdGVyX25mX2hvb2sodm9pZCkKK3sKKwlXQVJOX09OKCFpcHZsX25mX2hvb2tfcmVmY250KTsKKworCWlwdmxfbmZfaG9va19yZWZjbnQtLTsKKwlpZiAoIWlwdmxfbmZfaG9va19yZWZjbnQpCisJCV9uZl91bnJlZ2lzdGVyX2hvb2tzKGlwdmxfbmZvcHMsIEFSUkFZX1NJWkUoaXB2bF9uZm9wcykpOworfQorCitzdGF0aWMgaW50IGlwdmxhbl9zZXRfcG9ydF9tb2RlKHN0cnVjdCBpcHZsX3BvcnQgKnBvcnQsIHUxNiBudmFsKQogewogCXN0cnVjdCBpcHZsX2RldiAqaXB2bGFuOworCXN0cnVjdCBuZXRfZGV2aWNlICptZGV2ID0gcG9ydC0+ZGV2OworCWludCBlcnIgPSAwOwogCisJQVNTRVJUX1JUTkwoKTsKIAlpZiAocG9ydC0+bW9kZSAhPSBudmFsKSB7CisJCWlmIChudmFsID09IElQVkxBTl9NT0RFX0wzUykgeworCQkJLyogTmV3IG1vZGUgaXMgTDNTICovCisJCQllcnIgPSBpcHZsYW5fcmVnaXN0ZXJfbmZfaG9vaygpOworCQkJaWYgKCFlcnIpIHsKKwkJCQltZGV2LT5sM21kZXZfb3BzID0gJmlwdmxfbDNtZGV2X29wczsKKwkJCQltZGV2LT5wcml2X2ZsYWdzIHw9IElGRl9MM01ERVZfTUFTVEVSOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIGVycjsKKwkJfSBlbHNlIGlmIChwb3J0LT5tb2RlID09IElQVkxBTl9NT0RFX0wzUykgeworCQkJLyogT2xkIG1vZGUgd2FzIEwzUyAqLworCQkJbWRldi0+cHJpdl9mbGFncyAmPSB+SUZGX0wzTURFVl9NQVNURVI7CisJCQlpcHZsYW5fdW5yZWdpc3Rlcl9uZl9ob29rKCk7CisJCQltZGV2LT5sM21kZXZfb3BzID0gTlVMTDsKKwkJfQogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlwdmxhbiwgJnBvcnQtPmlwdmxhbnMsIHBub2RlKSB7Ci0JCQlpZiAobnZhbCA9PSBJUFZMQU5fTU9ERV9MMykKKwkJCWlmIChudmFsID09IElQVkxBTl9NT0RFX0wzIHx8IG52YWwgPT0gSVBWTEFOX01PREVfTDNTKQogCQkJCWlwdmxhbi0+ZGV2LT5mbGFncyB8PSBJRkZfTk9BUlA7CiAJCQllbHNlCiAJCQkJaXB2bGFuLT5kZXYtPmZsYWdzICY9IH5JRkZfTk9BUlA7CiAJCX0KIAkJcG9ydC0+bW9kZSA9IG52YWw7CiAJfQorCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgaXB2bGFuX3BvcnRfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC03NCw2ICsxMzcsMTEgQEAKIAlzdHJ1Y3QgaXB2bF9wb3J0ICpwb3J0ID0gaXB2bGFuX3BvcnRfZ2V0X3J0bmwoZGV2KTsKIAogCWRldi0+cHJpdl9mbGFncyAmPSB+SUZGX0lQVkxBTl9NQVNURVI7CisJaWYgKHBvcnQtPm1vZGUgPT0gSVBWTEFOX01PREVfTDNTKSB7CisJCWRldi0+cHJpdl9mbGFncyAmPSB+SUZGX0wzTURFVl9NQVNURVI7CisJCWlwdmxhbl91bnJlZ2lzdGVyX25mX2hvb2soKTsKKwkJZGV2LT5sM21kZXZfb3BzID0gTlVMTDsKKwl9CiAJbmV0ZGV2X3J4X2hhbmRsZXJfdW5yZWdpc3RlcihkZXYpOwogCWNhbmNlbF93b3JrX3N5bmMoJnBvcnQtPndxKTsKIAlfX3NrYl9xdWV1ZV9wdXJnZSgmcG9ydC0+YmFja2xvZyk7CkBAIC0xMzIsNyArMjAwLDggQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcGh5X2RldiA9IGlwdmxhbi0+cGh5X2RldjsKIAlzdHJ1Y3QgaXB2bF9hZGRyICphZGRyOwogCi0JaWYgKGlwdmxhbi0+cG9ydC0+bW9kZSA9PSBJUFZMQU5fTU9ERV9MMykKKwlpZiAoaXB2bGFuLT5wb3J0LT5tb2RlID09IElQVkxBTl9NT0RFX0wzIHx8CisJICAgIGlwdmxhbi0+cG9ydC0+bW9kZSA9PSBJUFZMQU5fTU9ERV9MM1MpCiAJCWRldi0+ZmxhZ3MgfD0gSUZGX05PQVJQOwogCWVsc2UKIAkJZGV2LT5mbGFncyAmPSB+SUZGX05PQVJQOwpAQCAtMzcyLDEzICs0NDEsMTQgQEAKIHsKIAlzdHJ1Y3QgaXB2bF9kZXYgKmlwdmxhbiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGlwdmxfcG9ydCAqcG9ydCA9IGlwdmxhbl9wb3J0X2dldF9ydG5sKGlwdmxhbi0+cGh5X2Rldik7CisJaW50IGVyciA9IDA7CiAKIAlpZiAoZGF0YSAmJiBkYXRhW0lGTEFfSVBWTEFOX01PREVdKSB7CiAJCXUxNiBubW9kZSA9IG5sYV9nZXRfdTE2KGRhdGFbSUZMQV9JUFZMQU5fTU9ERV0pOwogCi0JCWlwdmxhbl9zZXRfcG9ydF9tb2RlKHBvcnQsIG5tb2RlKTsKKwkJZXJyID0gaXB2bGFuX3NldF9wb3J0X21vZGUocG9ydCwgbm1vZGUpOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgc2l6ZV90IGlwdmxhbl9ubF9nZXRzaXplKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC00NzMsMTAgKzU0MywxMyBAQAogCQl1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOwogCQlyZXR1cm4gZXJyOwogCX0KKwllcnIgPSBpcHZsYW5fc2V0X3BvcnRfbW9kZShwb3J0LCBtb2RlKTsKKwlpZiAoZXJyKSB7CisJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKGRldik7CisJCXJldHVybiBlcnI7CisJfQogCiAJbGlzdF9hZGRfdGFpbF9yY3UoJmlwdmxhbi0+cG5vZGUsICZwb3J0LT5pcHZsYW5zKTsKLQlpcHZsYW5fc2V0X3BvcnRfbW9kZShwb3J0LCBtb2RlKTsKLQogCW5ldGlmX3N0YWNrZWRfdHJhbnNmZXJfb3BlcnN0YXRlKHBoeV9kZXYsIGRldik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWNzZWMuYyBiL2RyaXZlcnMvbmV0L21hY3NlYy5jCmluZGV4IGQxM2U2ZTEuLjNlYTQ3ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY3NlYy5jCisrKyBiL2RyaXZlcnMvbmV0L21hY3NlYy5jCkBAIC0yNzAsNiArMjcwLDcgQEAKIAlzdHJ1Y3QgcGNwdV9zZWN5X3N0YXRzIF9fcGVyY3B1ICpzdGF0czsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHNlY3lzOwogCXN0cnVjdCBncm9fY2VsbHMgZ3JvX2NlbGxzOworCXVuc2lnbmVkIGludCBuZXN0X2xldmVsOwogfTsKIAogLyoqCkBAIC0yNjk5LDYgKzI3MDAsOCBAQAogCiAjZGVmaW5lIE1BQ1NFQ19GRUFUVVJFUyBcCiAJKE5FVElGX0ZfU0cgfCBORVRJRl9GX0hJR0hETUEgfCBORVRJRl9GX0ZSQUdMSVNUKQorc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBtYWNzZWNfbmV0ZGV2X2FkZHJfbG9ja19rZXk7CisKIHN0YXRpYyBpbnQgbWFjc2VjX2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG1hY3NlY19kZXYgKm1hY3NlYyA9IG1hY3NlY19wcml2KGRldik7CkBAIC0yOTEwLDYgKzI5MTMsMTMgQEAKIAlyZXR1cm4gbWFjc2VjX3ByaXYoZGV2KS0+cmVhbF9kZXYtPmlmaW5kZXg7CiB9CiAKKworc3RhdGljIGludCBtYWNzZWNfZ2V0X25lc3RfbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbWFjc2VjX3ByaXYoZGV2KS0+bmVzdF9sZXZlbDsKK30KKworCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG1hY3NlY19uZXRkZXZfb3BzID0gewogCS5uZG9faW5pdAkJPSBtYWNzZWNfZGV2X2luaXQsCiAJLm5kb191bmluaXQJCT0gbWFjc2VjX2Rldl91bmluaXQsCkBAIC0yOTIzLDYgKzI5MzMsNyBAQAogCS5uZG9fc3RhcnRfeG1pdAkJPSBtYWNzZWNfc3RhcnRfeG1pdCwKIAkubmRvX2dldF9zdGF0czY0CT0gbWFjc2VjX2dldF9zdGF0czY0LAogCS5uZG9fZ2V0X2lmbGluawkJPSBtYWNzZWNfZ2V0X2lmbGluaywKKwkubmRvX2dldF9sb2NrX3N1YmNsYXNzICA9IG1hY3NlY19nZXRfbmVzdF9sZXZlbCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2aWNlX3R5cGUgbWFjc2VjX3R5cGUgPSB7CkBAIC0yOTYyLDYgKzI5NzMsNyBAQAogCWRldi0+cHJpdl9mbGFncyB8PSBJRkZfTk9fUVVFVUU7CiAJZGV2LT5uZXRkZXZfb3BzID0gJm1hY3NlY19uZXRkZXZfb3BzOwogCWRldi0+ZGVzdHJ1Y3RvciA9IG1hY3NlY19mcmVlX25ldGRldjsKKwlTRVRfTkVUREVWX0RFVlRZUEUoZGV2LCAmbWFjc2VjX3R5cGUpOwogCiAJZXRoX3plcm9fYWRkcihkZXYtPmJyb2FkY2FzdCk7CiB9CkBAIC0zMDQ3LDIyICszMDU5LDMxIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBtYWNzZWNfY29tbW9uX2RlbGxpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgbWFjc2VjX2RldiAqbWFjc2VjID0gbWFjc2VjX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSBtYWNzZWMtPnJlYWxfZGV2OworCisJdW5yZWdpc3Rlcl9uZXRkZXZpY2VfcXVldWUoZGV2LCBoZWFkKTsKKwlsaXN0X2RlbF9yY3UoJm1hY3NlYy0+c2VjeXMpOworCW1hY3NlY19kZWxfZGV2KG1hY3NlYyk7CisJbmV0ZGV2X3VwcGVyX2Rldl91bmxpbmsocmVhbF9kZXYsIGRldik7CisKKwltYWNzZWNfZ2VuZXJhdGlvbisrOworfQorCiBzdGF0aWMgdm9pZCBtYWNzZWNfZGVsbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQogewogCXN0cnVjdCBtYWNzZWNfZGV2ICptYWNzZWMgPSBtYWNzZWNfcHJpdihkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IG1hY3NlYy0+cmVhbF9kZXY7CiAJc3RydWN0IG1hY3NlY19yeGhfZGF0YSAqcnhkID0gbWFjc2VjX2RhdGFfcnRubChyZWFsX2Rldik7CiAKLQltYWNzZWNfZ2VuZXJhdGlvbisrOworCW1hY3NlY19jb21tb25fZGVsbGluayhkZXYsIGhlYWQpOwogCi0JdW5yZWdpc3Rlcl9uZXRkZXZpY2VfcXVldWUoZGV2LCBoZWFkKTsKLQlsaXN0X2RlbF9yY3UoJm1hY3NlYy0+c2VjeXMpOwogCWlmIChsaXN0X2VtcHR5KCZyeGQtPnNlY3lzKSkgewogCQluZXRkZXZfcnhfaGFuZGxlcl91bnJlZ2lzdGVyKHJlYWxfZGV2KTsKIAkJa2ZyZWUocnhkKTsKIAl9Ci0KLQltYWNzZWNfZGVsX2RldihtYWNzZWMpOwogfQogCiBzdGF0aWMgaW50IHJlZ2lzdGVyX21hY3NlY19kZXYoc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2LApAQCAtMzE4MSw2ICszMjAyLDE2IEBACiAKIAlkZXZfaG9sZChyZWFsX2Rldik7CiAKKwltYWNzZWMtPm5lc3RfbGV2ZWwgPSBkZXZfZ2V0X25lc3RfbGV2ZWwocmVhbF9kZXYpICsgMTsKKwluZXRkZXZfbG9ja2RlcF9zZXRfY2xhc3NlcyhkZXYpOworCWxvY2tkZXBfc2V0X2NsYXNzX2FuZF9zdWJjbGFzcygmZGV2LT5hZGRyX2xpc3RfbG9jaywKKwkJCQkgICAgICAgJm1hY3NlY19uZXRkZXZfYWRkcl9sb2NrX2tleSwKKwkJCQkgICAgICAgbWFjc2VjX2dldF9uZXN0X2xldmVsKGRldikpOworCisJZXJyID0gbmV0ZGV2X3VwcGVyX2Rldl9saW5rKHJlYWxfZGV2LCBkZXYpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIHVucmVnaXN0ZXI7CisKIAkvKiBuZWVkIHRvIGJlIGFscmVhZHkgcmVnaXN0ZXJlZCBzbyB0aGF0IC0+aW5pdCBoYXMgcnVuIGFuZAogCSAqIHRoZSBNQUMgYWRkciBpcyBzZXQKIAkgKi8KQEAgLTMxOTMsMTIgKzMyMjQsMTIgQEAKIAogCWlmIChyeF9oYW5kbGVyICYmIHNjaV9leGlzdHMocmVhbF9kZXYsIHNjaSkpIHsKIAkJZXJyID0gLUVCVVNZOwotCQlnb3RvIHVucmVnaXN0ZXI7CisJCWdvdG8gdW5saW5rOwogCX0KIAogCWVyciA9IG1hY3NlY19hZGRfZGV2KGRldiwgc2NpLCBpY3ZfbGVuKTsKIAlpZiAoZXJyKQotCQlnb3RvIHVucmVnaXN0ZXI7CisJCWdvdG8gdW5saW5rOwogCiAJaWYgKGRhdGEpCiAJCW1hY3NlY19jaGFuZ2VsaW5rX2NvbW1vbihkZXYsIGRhdGEpOwpAQCAtMzIxMyw2ICszMjQ0LDggQEAKIAogZGVsX2RldjoKIAltYWNzZWNfZGVsX2RldihtYWNzZWMpOwordW5saW5rOgorCW5ldGRldl91cHBlcl9kZXZfdW5saW5rKHJlYWxfZGV2LCBkZXYpOwogdW5yZWdpc3RlcjoKIAl1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOwogCXJldHVybiBlcnI7CkBAIC0zMzgyLDggKzM0MTUsMTIgQEAKIAogCQlyeGQgPSBtYWNzZWNfZGF0YV9ydG5sKHJlYWxfZGV2KTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG0sIG4sICZyeGQtPnNlY3lzLCBzZWN5cykgewotCQkJbWFjc2VjX2RlbGxpbmsobS0+c2VjeS5uZXRkZXYsICZoZWFkKTsKKwkJCW1hY3NlY19jb21tb25fZGVsbGluayhtLT5zZWN5Lm5ldGRldiwgJmhlYWQpOwogCQl9CisKKwkJbmV0ZGV2X3J4X2hhbmRsZXJfdW5yZWdpc3RlcihyZWFsX2Rldik7CisJCWtmcmVlKHJ4ZCk7CisKIAkJdW5yZWdpc3Rlcl9uZXRkZXZpY2VfbWFueSgmaGVhZCk7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY3ZsYW4uYyBiL2RyaXZlcnMvbmV0L21hY3ZsYW4uYwppbmRleCBjZDliNTM4Li4zMjM0ZmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWN2bGFuLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjdmxhbi5jCkBAIC0xMzE1LDcgKzEzMTUsNyBAQAogCXZsYW4tPmRldiAgICAgID0gZGV2OwogCXZsYW4tPnBvcnQgICAgID0gcG9ydDsKIAl2bGFuLT5zZXRfZmVhdHVyZXMgPSBNQUNWTEFOX0ZFQVRVUkVTOwotCXZsYW4tPm5lc3RfbGV2ZWwgPSBkZXZfZ2V0X25lc3RfbGV2ZWwobG93ZXJkZXYsIG5ldGlmX2lzX21hY3ZsYW4pICsgMTsKKwl2bGFuLT5uZXN0X2xldmVsID0gZGV2X2dldF9uZXN0X2xldmVsKGxvd2VyZGV2KSArIDE7CiAKIAl2bGFuLT5tb2RlICAgICA9IE1BQ1ZMQU5fTU9ERV9WRVBBOwogCWlmIChkYXRhICYmIGRhdGFbSUZMQV9NQUNWTEFOX01PREVdKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjdnRhcC5jIGIvZHJpdmVycy9uZXQvbWFjdnRhcC5jCmluZGV4IGEzOGMwZGEuLjA3MGUzMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY3Z0YXAuYworKysgYi9kcml2ZXJzL25ldC9tYWN2dGFwLmMKQEAgLTI3NSw3ICsyNzUsNiBAQAogCXJ0bmxfdW5sb2NrKCk7CiAKIAlzeW5jaHJvbml6ZV9yY3UoKTsKLQlza2JfYXJyYXlfY2xlYW51cCgmcS0+c2tiX2FycmF5KTsKIAlzb2NrX3B1dCgmcS0+c2spOwogfQogCkBAIC01MzMsMTAgKzUzMiw4IEBACiBzdGF0aWMgdm9pZCBtYWN2dGFwX3NvY2tfZGVzdHJ1Y3Qoc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCBtYWN2dGFwX3F1ZXVlICpxID0gY29udGFpbmVyX29mKHNrLCBzdHJ1Y3QgbWFjdnRhcF9xdWV1ZSwgc2spOwotCXN0cnVjdCBza19idWZmICpza2I7CiAKLQl3aGlsZSAoKHNrYiA9IHNrYl9hcnJheV9jb25zdW1lKCZxLT5za2JfYXJyYXkpKSAhPSBOVUxMKQotCQlrZnJlZV9za2Ioc2tiKTsKKwlza2JfYXJyYXlfY2xlYW51cCgmcS0+c2tiX2FycmF5KTsKIH0KIAogc3RhdGljIGludCBtYWN2dGFwX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnCmluZGV4IDQ3YTY0MzQuLjUwNzhhMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnCkBAIC0xNSwxNjIgKzE1LDI3IEBACiBjb25maWcgU1dQSFkKIAlib29sCiAKLWNvbW1lbnQgIk1JSSBQSFkgZGV2aWNlIGRyaXZlcnMiCitjb21tZW50ICJNRElPIGJ1cyBkZXZpY2UgZHJpdmVycyIKIAotY29uZmlnIEFRVUFOVElBX1BIWQotICAgICAgICB0cmlzdGF0ZSAiRHJpdmVycyBmb3IgdGhlIEFxdWFudGlhIFBIWXMiCi0gICAgICAgIC0tLWhlbHAtLS0KLSAgICAgICAgICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIEFxdWFudGlhIEFRMTIwMiwgQVEyMTA0LCBBUVIxMDUsIEFRUjQwNQotCi1jb25maWcgQVQ4MDNYX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciBBdGhlcm9zIEFUODAzWCBQSFlzIgotCS0tLWhlbHAtLS0KLQkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgQVQ4MDMwIGFuZCBBVDgwMzUgbW9kZWwKLQotY29uZmlnIEFNRF9QSFkKLQl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgdGhlIEFNRCBQSFlzIgotCS0tLWhlbHAtLS0KLQkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgYW03OWM4NzQKLQotY29uZmlnIE1BUlZFTExfUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIE1hcnZlbGwgUEhZcyIKLQktLS1oZWxwLS0tCi0JICBDdXJyZW50bHkgaGFzIGEgZHJpdmVyIGZvciB0aGUgODhFMTAxMVMKLQkKLWNvbmZpZyBEQVZJQ09NX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciBEYXZpY29tIFBIWXMiCi0JLS0taGVscC0tLQotCSAgQ3VycmVudGx5IHN1cHBvcnRzIGRtOTE2MWUgYW5kIGRtOTEzMQotCi1jb25maWcgUVNFTUlfUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIFF1YWxpdHkgU2VtaWNvbmR1Y3RvciBQSFlzIgotCS0tLWhlbHAtLS0KLQkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgcXM2NjEyCi0KLWNvbmZpZyBMWFRfUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIHRoZSBJbnRlbCBMWFQgUEhZcyIKLQktLS1oZWxwLS0tCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIGx4dDk3MCwgbHh0OTcxCi0KLWNvbmZpZyBDSUNBREFfUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIHRoZSBDaWNhZGEgUEhZcyIKLQktLS1oZWxwLS0tCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIGNpczgyMDQKLQotY29uZmlnIFZJVEVTU0VfUEhZCi0gICAgICAgIHRyaXN0YXRlICJEcml2ZXJzIGZvciB0aGUgVml0ZXNzZSBQSFlzIgotICAgICAgICAtLS1oZWxwLS0tCi0gICAgICAgICAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSB2c2M4MjQ0Ci0KLWNvbmZpZyBURVJBTkVUSUNTX1BIWQotICAgICAgICB0cmlzdGF0ZSAiRHJpdmVycyBmb3IgdGhlIFRlcmFuZXRpY3MgUEhZcyIKLSAgICAgICAgLS0taGVscC0tLQotICAgICAgICAgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgVGVyYW5ldGljcyBUTjIwMjAKLQotY29uZmlnIFNNU0NfUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIFNNU0MgUEhZcyIKLQktLS1oZWxwLS0tCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIExBTjgzQzE4NSwgTEFOODE4NyBhbmQgTEFOODcwMCBQSFlzCi0KLWNvbmZpZyBCQ01fTkVUX1BIWUxJQgotCXRyaXN0YXRlCi0KLWNvbmZpZyBCUk9BRENPTV9QSFkKLQl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgQnJvYWRjb20gUEhZcyIKLQlzZWxlY3QgQkNNX05FVF9QSFlMSUIKLQktLS1oZWxwLS0tCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIEJDTTU0MTEsIEJDTTU0MjEsIEJDTTU0NjEsIEJDTTU0NjE2UywgQkNNNTQ2NCwKLQkgIEJDTTU0ODEgYW5kIEJDTTU0ODIgUEhZcy4KLQotY29uZmlnIEJDTV9DWUdOVVNfUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIEJyb2FkY29tIEN5Z251cyBTb0MgaW50ZXJuYWwgUEhZIgotCWRlcGVuZHMgb24gQVJDSF9CQ01fQ1lHTlVTIHx8IENPTVBJTEVfVEVTVAotCWRlcGVuZHMgb24gTURJT19CQ01fSVBST0MKLQlzZWxlY3QgQkNNX05FVF9QSFlMSUIKLQktLS1oZWxwLS0tCi0JICBUaGlzIFBIWSBkcml2ZXIgaXMgZm9yIHRoZSAxRyBpbnRlcm5hbCBQSFlzIG9mIHRoZSBCcm9hZGNvbQotCSAgQ3lnbnVzIEZhbWlseSBTb0MuCi0KLQkgIEN1cnJlbnRseSBzdXBwb3J0cyBpbnRlcm5hbCBQSFkncyB1c2VkIGluIHRoZSBCQ00xMTMwMCwKLQkgIEJDTTExMzIwLCBCQ00xMTM1MCwgQkNNMTEzNjAsIEJDTTU4MzAwLCBCQ001ODMwMiwKLQkgIEJDTTU4MzAzICYgQkNNNTgzMDUgQnJvYWRjb20gQ3lnbnVzIFNvQ3MuCi0KLWNvbmZpZyBCQ002M1hYX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciBCcm9hZGNvbSA2M3h4IFNPQ3MgaW50ZXJuYWwgUEhZIgotCWRlcGVuZHMgb24gQkNNNjNYWAotCXNlbGVjdCBCQ01fTkVUX1BIWUxJQgotCS0tLWhlbHAtLS0KLQkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgNjM0OCBhbmQgNjM1OCBQSFlzLgotCi1jb25maWcgQkNNN1hYWF9QSFkKLQl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgQnJvYWRjb20gN3h4eCBTT0NzIGludGVybmFsIFBIWXMiCi0Jc2VsZWN0IEJDTV9ORVRfUEhZTElCCi0JLS0taGVscC0tLQotCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBCQ003MzY2LCBCQ003NDM5LCBCQ003NDQ1LCBhbmQKLQkgIDQwbm0gYW5kIDY1bm0gZ2VuZXJhdGlvbiBvZiBCQ003eHh4IFNldCBUb3AgQm94IFNvQ3MuCi0KLWNvbmZpZyBCQ004N1hYX1BIWQotCXRyaXN0YXRlICJEcml2ZXIgZm9yIEJyb2FkY29tIEJDTTg3MDYgYW5kIEJDTTg3MjcgUEhZcyIKK2NvbmZpZyBNRElPX0JDTV9JUFJPQworCXRyaXN0YXRlICJCcm9hZGNvbSBpUHJvYyBNRElPIGJ1cyBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gQVJDSF9CQ01fSVBST0MgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0gJiYgT0ZfTURJTwogCWhlbHAKLQkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgQkNNODcwNiBhbmQgQkNNODcyNyAxMEcgRXRoZXJuZXQgUEhZcy4KKwkgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgZHJpdmVyIGZvciB0aGUgTURJTyBidXNzZXMgZm91bmQgaW4gdGhlCisJICBCcm9hZGNvbSBpUHJvYyBTb0Mncy4KIAotY29uZmlnIElDUExVU19QSFkKLQl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgSUNQbHVzIFBIWXMiCi0JLS0taGVscC0tLQotCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBJUDE3NUMgYW5kIElQMTAwMSBQSFlzLgotCi1jb25maWcgUkVBTFRFS19QSFkKLQl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgUmVhbHRlayBQSFlzIgotCS0tLWhlbHAtLS0KLQkgIFN1cHBvcnRzIHRoZSBSZWFsdGVrIDgyMXggUEhZLgotCi1jb25maWcgTkFUSU9OQUxfUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEhZcyIKLQktLS1oZWxwLS0tCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIERQODM4NjUgUEhZLgotCi1jb25maWcgU1RFMTBYUAotCXRyaXN0YXRlICJEcml2ZXIgZm9yIFNUTWljcm9lbGVjdHJvbmljcyBTVGUxMFhwIFBIWXMiCi0JLS0taGVscC0tLQotCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgU1RlMTAwcCBhbmQgU1RlMTAxcCBQSFlzLgotCi1jb25maWcgTFNJX0VUMTAxMUNfUEhZCi0JdHJpc3RhdGUgIkRyaXZlciBmb3IgTFNJIEVUMTAxMUMgUEhZIgotCS0tLWhlbHAtLS0KLQkgIFN1cHBvcnRzIHRoZSBMU0kgRVQxMDExQyBQSFkuCi0KLWNvbmZpZyBNSUNSRUxfUEhZCi0JdHJpc3RhdGUgIkRyaXZlciBmb3IgTWljcmVsIFBIWXMiCi0JLS0taGVscC0tLQotCSAgU3VwcG9ydHMgdGhlIEtTWjkwMjEsIFZTQzgyMDEsIEtTODAwMSBQSFlzLgotCi1jb25maWcgRFA4Mzg0OF9QSFkKLQl0cmlzdGF0ZSAiRHJpdmVyIGZvciBUZXhhcyBJbnN0cnVtZW50cyBEUDgzODQ4IFBIWSIKLQktLS1oZWxwLS0tCi0JICBTdXBwb3J0cyB0aGUgRFA4Mzg0OCBQSFkuCi0KLWNvbmZpZyBEUDgzODY3X1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciBUZXhhcyBJbnN0cnVtZW50cyBEUDgzODY3IEdpZ2FiaXQgUEhZIgotCS0tLWhlbHAtLS0KLQkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgRFA4Mzg2NyBQSFkuCi0KLWNvbmZpZyBNSUNST0NISVBfUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIE1pY3JvY2hpcCBQSFlzIgorY29uZmlnIE1ESU9fQkNNX1VOSU1BQworCXRyaXN0YXRlICJCcm9hZGNvbSBVbmlNQUMgTURJTyBidXMgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEhBU19JT01FTQogCWhlbHAKLQkgIFN1cHBvcnRzIHRoZSBMQU44OFhYIFBIWXMuCi0KLWNvbmZpZyBGSVhFRF9QSFkKLQl0cmlzdGF0ZSAiRHJpdmVyIGZvciBNRElPIEJ1cy9QSFkgZW11bGF0aW9uIHdpdGggZml4ZWQgc3BlZWQvbGluayBQSFlzIgotCWRlcGVuZHMgb24gUEhZTElCCi0Jc2VsZWN0IFNXUEhZCi0JLS0taGVscC0tLQotCSAgQWRkcyB0aGUgcGxhdGZvcm0gImZpeGVkIiBNRElPIEJ1cyB0byBjb3ZlciB0aGUgYm9hcmRzIHRoYXQgdXNlCi0JICBQSFlzIHRoYXQgYXJlIG5vdCBjb25uZWN0ZWQgdG8gdGhlIHJlYWwgTURJTyBidXMuCi0KLQkgIEN1cnJlbnRseSB0ZXN0ZWQgd2l0aCBtcGM4NjZhZHMgYW5kIG1wYzgzNDllLW1pdHguCisJICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGRyaXZlciBmb3IgdGhlIEJyb2FkY29tIFVuaU1BQyBNRElPIGJ1c3Nlcy4KKwkgIFRoaXMgaGFyZHdhcmUgY2FuIGJlIGZvdW5kIGluIHRoZSBCcm9hZGNvbSBHRU5FVCBFdGhlcm5ldCBNQUMKKwkgIGNvbnRyb2xsZXJzIGFzIHdlbGwgYXMgc29tZSBCcm9hZGNvbSBFdGhlcm5ldCBzd2l0Y2hlcyBzdWNoIGFzIHRoZQorCSAgU3RhcmZpZ2h0ZXIgMiBzd2l0Y2hlcy4KIAogY29uZmlnIE1ESU9fQklUQkFORwotCXRyaXN0YXRlICJTdXBwb3J0IGZvciBiaXRiYW5nZWQgTURJTyBidXNlcyIKKwl0cmlzdGF0ZSAiQml0YmFuZ2VkIE1ESU8gYnVzZXMiCiAJaGVscAogCSAgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyB0aGUgTURJTyBidXMgcHJvdG9jb2wgaW4gc29mdHdhcmUsCiAJICBmb3IgdXNlIGJ5IGxvdyBsZXZlbCBkcml2ZXJzIHRoYXQgZXhwb3J0IHRoZSBhYmlsaXR5IHRvCkBAIC0xNzgsNTQgKzQzLDYgQEAKIAogCSAgSWYgaW4gZG91YnQsIHNheSBOLgogCi1jb25maWcgTURJT19HUElPCi0JdHJpc3RhdGUgIlN1cHBvcnQgZm9yIEdQSU8gbGliLWJhc2VkIGJpdGJhbmdlZCBNRElPIGJ1c2VzIgotCWRlcGVuZHMgb24gTURJT19CSVRCQU5HICYmIEdQSU9MSUIKLQktLS1oZWxwLS0tCi0JICBTdXBwb3J0cyBHUElPIGxpYi1iYXNlZCBNRElPIGJ1c3Nlcy4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbWRpby1ncGlvLgotCi1jb25maWcgTURJT19DQVZJVU0KLQl0cmlzdGF0ZQotCi1jb25maWcgTURJT19PQ1RFT04KLQl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgTURJTyBidXNlcyBvbiBPY3Rlb24gYW5kIHNvbWUgVGh1bmRlclggU09DcyIKLQlkZXBlbmRzIG9uIDY0QklUCi0JZGVwZW5kcyBvbiBIQVNfSU9NRU0KLQlzZWxlY3QgTURJT19DQVZJVU0KLQloZWxwCi0JICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGRyaXZlciBmb3IgdGhlIE9jdGVvbiBhbmQgVGh1bmRlclggTURJTwotCSAgYnVzZXMuIEl0IGlzIHJlcXVpcmVkIGJ5IHRoZSBPY3Rlb24gYW5kIFRodW5kZXJYIGV0aGVybmV0IGRldmljZQotCSAgZHJpdmVycyBvbiBzb21lIHN5c3RlbXMuCi0KLWNvbmZpZyBNRElPX1RIVU5ERVIKLQl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgTURJTyBidXNlcyBvbiBUaHVuZGVyWCBTT0NzIgotCWRlcGVuZHMgb24gNjRCSVQKLQlkZXBlbmRzIG9uIFBDSQotCXNlbGVjdCBNRElPX0NBVklVTQotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNRElPIGludGVyZmFjZXMgZm91bmQgb24gQ2F2aXVtCi0JICBUaHVuZGVyWCBTb0NzIHdoZW4gdGhlIE1ESU8gYnVzIGRldmljZSBhcHBlYXJzIGFzIGEgUENJCi0JICBkZXZpY2UuCi0KLQotY29uZmlnIE1ESU9fU1VONEkKLQl0cmlzdGF0ZSAiQWxsd2lubmVyIHN1bjRpIE1ESU8gaW50ZXJmYWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUkNIX1NVTlhJCi0JaGVscAotCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1ESU8gaW50ZXJmYWNlIGZvdW5kIGluIHRoZSBuZXR3b3JrCi0JICBpbnRlcmZhY2UgdW5pdHMgb2YgdGhlIEFsbHdpbm5lciBTb0MgdGhhdCBoYXZlIGFuIEVNQUMgKEExMCwKLQkgIEExMiwgQTEwcywgZXRjLikKLQotY29uZmlnIE1ESU9fTU9YQVJUCi0gICAgICAgIHRyaXN0YXRlICJNT1hBIEFSVCBNRElPIGludGVyZmFjZSBzdXBwb3J0IgotICAgICAgICBkZXBlbmRzIG9uIEFSQ0hfTU9YQVJUCi0gICAgICAgIGhlbHAKLSAgICAgICAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTURJTyBpbnRlcmZhY2UgZm91bmQgaW4gdGhlIG5ldHdvcmsKLSAgICAgICAgICBpbnRlcmZhY2UgdW5pdHMgb2YgdGhlIE1PWEEgQVJUIFNvQwotCiBjb25maWcgTURJT19CVVNfTVVYCiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIE9GX01ESU8KQEAgLTIzNSw4ICs1MiwxOSBAQAogCSAgdG8gYSBwYXJlbnQgYnVzLiAgU3dpdGNoaW5nIGJldHdlZW4gY2hpbGQgYnVzc2VzIGlzIGRvbmUgYnkKIAkgIGRldmljZSBzcGVjaWZpYyBkcml2ZXJzLgogCitjb25maWcgTURJT19CVVNfTVVYX0JDTV9JUFJPQworCXRyaXN0YXRlICJCcm9hZGNvbSBpUHJvYyBiYXNlZCBNRElPIGJ1cyBtdWx0aXBsZXhlcnMiCisJZGVwZW5kcyBvbiBPRiAmJiBPRl9NRElPICYmIChBUkNIX0JDTV9JUFJPQyB8fCBDT01QSUxFX1RFU1QpCisJc2VsZWN0IE1ESU9fQlVTX01VWAorCWRlZmF1bHQgQVJDSF9CQ01fSVBST0MKKwloZWxwCisJICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGRyaXZlciBmb3IgTURJTyBidXMgbXVsdGlwbGV4ZXJzIGZvdW5kIGluCisJICBpUHJvYyBiYXNlZCBCcm9hZGNvbSBTb0NzLiBUaGlzIG11bHRpcGxleGVyIGNvbm5lY3RzIG9uZSBvZiBzZXZlcmFsCisJICBjaGlsZCBNRElPIGJ1cyB0byBhIHBhcmVudCBidXMuIEJ1c2VzIGNvdWxkIGJlIGludGVybmFsIGFzIHdlbGwgYXMKKwkgIGV4dGVybmFsIGFuZCBzZWxlY3Rpb24gbG9naWMgbGllcyBpbnNpZGUgdGhlIHNhbWUgbXVsdGlwbGV4ZXIuCisKIGNvbmZpZyBNRElPX0JVU19NVVhfR1BJTwotCXRyaXN0YXRlICJTdXBwb3J0IGZvciBHUElPIGNvbnRyb2xsZWQgTURJTyBidXMgbXVsdGlwbGV4ZXJzIgorCXRyaXN0YXRlICJHUElPIGNvbnRyb2xsZWQgTURJTyBidXMgbXVsdGlwbGV4ZXJzIgogCWRlcGVuZHMgb24gT0ZfR1BJTyAmJiBPRl9NRElPCiAJc2VsZWN0IE1ESU9fQlVTX01VWAogCWhlbHAKQEAgLTI0Niw3ICs3NCw3IEBACiAJICBzZWxlY3Rpb24gaXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgR1BJTyBsaW5lcy4KIAogY29uZmlnIE1ESU9fQlVTX01VWF9NTUlPUkVHCi0JdHJpc3RhdGUgIlN1cHBvcnQgZm9yIE1NSU8gZGV2aWNlLWNvbnRyb2xsZWQgTURJTyBidXMgbXVsdGlwbGV4ZXJzIgorCXRyaXN0YXRlICJNTUlPIGRldmljZS1jb250cm9sbGVkIE1ESU8gYnVzIG11bHRpcGxleGVycyIKIAlkZXBlbmRzIG9uIE9GX01ESU8gJiYgSEFTX0lPTUVNCiAJc2VsZWN0IE1ESU9fQlVTX01VWAogCWhlbHAKQEAgLTI1OCw0MSArODYsMTcgQEAKIAogCSAgQ3VycmVudGx5LCBvbmx5IDgtYml0IHJlZ2lzdGVycyBhcmUgc3VwcG9ydGVkLgogCi1jb25maWcgTURJT19CVVNfTVVYX0JDTV9JUFJPQwotCXRyaXN0YXRlICJTdXBwb3J0IGZvciBpUHJvYyBiYXNlZCBNRElPIGJ1cyBtdWx0aXBsZXhlcnMiCi0JZGVwZW5kcyBvbiBPRiAmJiBPRl9NRElPICYmIChBUkNIX0JDTV9JUFJPQyB8fCBDT01QSUxFX1RFU1QpCi0Jc2VsZWN0IE1ESU9fQlVTX01VWAotCWRlZmF1bHQgQVJDSF9CQ01fSVBST0MKLQloZWxwCi0JICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGRyaXZlciBmb3IgTURJTyBidXMgbXVsdGlwbGV4ZXJzIGZvdW5kIGluCi0JICBpUHJvYyBiYXNlZCBCcm9hZGNvbSBTb0NzLiBUaGlzIG11bHRpcGxleGVyIGNvbm5lY3RzIG9uZSBvZiBzZXZlcmFsCi0JICBjaGlsZCBNRElPIGJ1cyB0byBhIHBhcmVudCBidXMuIEJ1c2VzIGNvdWxkIGJlIGludGVybmFsIGFzIHdlbGwgYXMKLQkgIGV4dGVybmFsIGFuZCBzZWxlY3Rpb24gbG9naWMgbGllcyBpbnNpZGUgdGhlIHNhbWUgbXVsdGlwbGV4ZXIuCitjb25maWcgTURJT19DQVZJVU0KKwl0cmlzdGF0ZQogCi1jb25maWcgTURJT19CQ01fVU5JTUFDCi0JdHJpc3RhdGUgIkJyb2FkY29tIFVuaU1BQyBNRElPIGJ1cyBjb250cm9sbGVyIgotCWRlcGVuZHMgb24gSEFTX0lPTUVNCi0JaGVscAotCSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIHRoZSBCcm9hZGNvbSBVbmlNQUMgTURJTyBidXNzZXMuCi0JICBUaGlzIGhhcmR3YXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgQnJvYWRjb20gR0VORVQgRXRoZXJuZXQgTUFDCi0JICBjb250cm9sbGVycyBhcyB3ZWxsIGFzIHNvbWUgQnJvYWRjb20gRXRoZXJuZXQgc3dpdGNoZXMgc3VjaCBhcyB0aGUKLQkgIFN0YXJmaWdodGVyIDIgc3dpdGNoZXMuCi0KLWNvbmZpZyBNRElPX0JDTV9JUFJPQwotCXRyaXN0YXRlICJCcm9hZGNvbSBpUHJvYyBNRElPIGJ1cyBjb250cm9sbGVyIgotCWRlcGVuZHMgb24gQVJDSF9CQ01fSVBST0MgfHwgQ09NUElMRV9URVNUCi0JZGVwZW5kcyBvbiBIQVNfSU9NRU0gJiYgT0ZfTURJTwotCWhlbHAKLQkgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgZHJpdmVyIGZvciB0aGUgTURJTyBidXNzZXMgZm91bmQgaW4gdGhlCi0JICBCcm9hZGNvbSBpUHJvYyBTb0Mncy4KLQotY29uZmlnIElOVEVMX1hXQVlfUEhZCi0JdHJpc3RhdGUgIkRyaXZlciBmb3IgSW50ZWwgWFdBWSBQSFlzIgorY29uZmlnIE1ESU9fR1BJTworCXRyaXN0YXRlICJHUElPIGxpYi1iYXNlZCBiaXRiYW5nZWQgTURJTyBidXNlcyIKKwlkZXBlbmRzIG9uIE1ESU9fQklUQkFORyAmJiBHUElPTElCCiAJLS0taGVscC0tLQotCSAgU3VwcG9ydHMgdGhlIEludGVsIFhXQVkgKGZvcm1lciBMYW50aXEpIDExRyBhbmQgMjJFIFBIWXMuCi0JICBUaGVzZSBQSFlzIGFyZSBtYXJrZWQgYXMgc3RhbmRhbG9uZSBjaGlwcyB1bmRlciB0aGUgbmFtZXMKLQkgIFBFRiA3MDYxLCBQRUYgNzA3MSBhbmQgUEVGIDcwNzIgb3IgaW50ZWdyYXRlZCBpbnRvIHRoZSBJbnRlbAotCSAgU29DcyB4UlgyMDAsIHhSWDMwMCwgeFJYMzMwLCB4UlgzNTAgYW5kIHhSWDU1MC4KKwkgIFN1cHBvcnRzIEdQSU8gbGliLWJhc2VkIE1ESU8gYnVzc2VzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtZGlvLWdwaW8uCiAKIGNvbmZpZyBNRElPX0hJU0lfRkVNQUMKIAl0cmlzdGF0ZSAiSGlzaWxpY29uIEZFTUFDIE1ESU8gYnVzIGNvbnRyb2xsZXIiCkBAIC0zMDEsMTIgKzEwNSwyMjggQEAKIAkgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgZHJpdmVyIGZvciB0aGUgTURJTyBidXNzZXMgZm91bmQgaW4gdGhlCiAJICBIaXNpbGljb24gU29DIHRoYXQgaGF2ZSBhbiBGYXN0IEV0aGVybmV0IE1BQy4KIAorY29uZmlnIE1ESU9fTU9YQVJUCisgICAgICAgIHRyaXN0YXRlICJNT1hBIEFSVCBNRElPIGludGVyZmFjZSBzdXBwb3J0IgorICAgICAgICBkZXBlbmRzIG9uIEFSQ0hfTU9YQVJUCisgICAgICAgIGhlbHAKKyAgICAgICAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTURJTyBpbnRlcmZhY2UgZm91bmQgaW4gdGhlIG5ldHdvcmsKKyAgICAgICAgICBpbnRlcmZhY2UgdW5pdHMgb2YgdGhlIE1PWEEgQVJUIFNvQworCitjb25maWcgTURJT19PQ1RFT04KKwl0cmlzdGF0ZSAiT2N0ZW9uIGFuZCBzb21lIFRodW5kZXJYIFNPQ3MgTURJTyBidXNlcyIKKwlkZXBlbmRzIG9uIDY0QklUCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KKwlzZWxlY3QgTURJT19DQVZJVU0KKwloZWxwCisJICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGRyaXZlciBmb3IgdGhlIE9jdGVvbiBhbmQgVGh1bmRlclggTURJTworCSAgYnVzZXMuIEl0IGlzIHJlcXVpcmVkIGJ5IHRoZSBPY3Rlb24gYW5kIFRodW5kZXJYIGV0aGVybmV0IGRldmljZQorCSAgZHJpdmVycyBvbiBzb21lIHN5c3RlbXMuCisKK2NvbmZpZyBNRElPX1NVTjRJCisJdHJpc3RhdGUgIkFsbHdpbm5lciBzdW40aSBNRElPIGludGVyZmFjZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9TVU5YSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNRElPIGludGVyZmFjZSBmb3VuZCBpbiB0aGUgbmV0d29yaworCSAgaW50ZXJmYWNlIHVuaXRzIG9mIHRoZSBBbGx3aW5uZXIgU29DIHRoYXQgaGF2ZSBhbiBFTUFDIChBMTAsCisJICBBMTIsIEExMHMsIGV0Yy4pCisKK2NvbmZpZyBNRElPX1RIVU5ERVIKKwl0cmlzdGF0ZSAiVGh1bmRlclggU09DcyBNRElPIGJ1c2VzIgorCWRlcGVuZHMgb24gNjRCSVQKKwlkZXBlbmRzIG9uIFBDSQorCXNlbGVjdCBNRElPX0NBVklVTQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNRElPIGludGVyZmFjZXMgZm91bmQgb24gQ2F2aXVtCisJICBUaHVuZGVyWCBTb0NzIHdoZW4gdGhlIE1ESU8gYnVzIGRldmljZSBhcHBlYXJzIGFzIGEgUENJCisJICBkZXZpY2UuCisKIGNvbmZpZyBNRElPX1hHRU5FCiAJdHJpc3RhdGUgIkFQTSBYLUdlbmUgU29DIE1ESU8gYnVzIGNvbnRyb2xsZXIiCiAJaGVscAogCSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIHRoZSBNRElPIGJ1c3NlcyBmb3VuZCBpbiB0aGUKIAkgIEFQTSBYLUdlbmUgU29DJ3MuCiAKK2NvbW1lbnQgIk1JSSBQSFkgZGV2aWNlIGRyaXZlcnMiCisKK2NvbmZpZyBBTURfUEhZCisJdHJpc3RhdGUgIkFNRCBQSFlzIgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgYW03OWM4NzQKKworY29uZmlnIEFRVUFOVElBX1BIWQorICAgICAgICB0cmlzdGF0ZSAiQXF1YW50aWEgUEhZcyIKKyAgICAgICAgLS0taGVscC0tLQorICAgICAgICAgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgQXF1YW50aWEgQVExMjAyLCBBUTIxMDQsIEFRUjEwNSwgQVFSNDA1CisKK2NvbmZpZyBBVDgwM1hfUEhZCisJdHJpc3RhdGUgIkFUODAzWCBQSFlzIgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgQVQ4MDMwIGFuZCBBVDgwMzUgbW9kZWwKKworY29uZmlnIEJDTTYzWFhfUEhZCisJdHJpc3RhdGUgIkJyb2FkY29tIDYzeHggU09DcyBpbnRlcm5hbCBQSFkiCisJZGVwZW5kcyBvbiBCQ002M1hYCisJc2VsZWN0IEJDTV9ORVRfUEhZTElCCisJLS0taGVscC0tLQorCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSA2MzQ4IGFuZCA2MzU4IFBIWXMuCisKK2NvbmZpZyBCQ003WFhYX1BIWQorCXRyaXN0YXRlICJCcm9hZGNvbSA3eHh4IFNPQ3MgaW50ZXJuYWwgUEhZcyIKKwlzZWxlY3QgQkNNX05FVF9QSFlMSUIKKwktLS1oZWxwLS0tCisJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIEJDTTczNjYsIEJDTTc0MzksIEJDTTc0NDUsIGFuZAorCSAgNDBubSBhbmQgNjVubSBnZW5lcmF0aW9uIG9mIEJDTTd4eHggU2V0IFRvcCBCb3ggU29Dcy4KKworY29uZmlnIEJDTTg3WFhfUEhZCisJdHJpc3RhdGUgIkJyb2FkY29tIEJDTTg3MDYgYW5kIEJDTTg3MjcgUEhZcyIKKwloZWxwCisJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIEJDTTg3MDYgYW5kIEJDTTg3MjcgMTBHIEV0aGVybmV0IFBIWXMuCisKK2NvbmZpZyBCQ01fQ1lHTlVTX1BIWQorCXRyaXN0YXRlICJCcm9hZGNvbSBDeWdudXMgU29DIGludGVybmFsIFBIWSIKKwlkZXBlbmRzIG9uIEFSQ0hfQkNNX0NZR05VUyB8fCBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIE1ESU9fQkNNX0lQUk9DCisJc2VsZWN0IEJDTV9ORVRfUEhZTElCCisJLS0taGVscC0tLQorCSAgVGhpcyBQSFkgZHJpdmVyIGlzIGZvciB0aGUgMUcgaW50ZXJuYWwgUEhZcyBvZiB0aGUgQnJvYWRjb20KKwkgIEN5Z251cyBGYW1pbHkgU29DLgorCisJICBDdXJyZW50bHkgc3VwcG9ydHMgaW50ZXJuYWwgUEhZJ3MgdXNlZCBpbiB0aGUgQkNNMTEzMDAsCisJICBCQ00xMTMyMCwgQkNNMTEzNTAsIEJDTTExMzYwLCBCQ001ODMwMCwgQkNNNTgzMDIsCisJICBCQ001ODMwMyAmIEJDTTU4MzA1IEJyb2FkY29tIEN5Z251cyBTb0NzLgorCitjb25maWcgQkNNX05FVF9QSFlMSUIKKwl0cmlzdGF0ZQorCitjb25maWcgQlJPQURDT01fUEhZCisJdHJpc3RhdGUgIkJyb2FkY29tIFBIWXMiCisJc2VsZWN0IEJDTV9ORVRfUEhZTElCCisJLS0taGVscC0tLQorCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBCQ001NDExLCBCQ001NDIxLCBCQ001NDYxLCBCQ001NDYxNlMsIEJDTTU0NjQsCisJICBCQ001NDgxIGFuZCBCQ001NDgyIFBIWXMuCisKK2NvbmZpZyBDSUNBREFfUEhZCisJdHJpc3RhdGUgIkNpY2FkYSBQSFlzIgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgY2lzODIwNAorCitjb25maWcgREFWSUNPTV9QSFkKKwl0cmlzdGF0ZSAiRGF2aWNvbSBQSFlzIgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyBkbTkxNjFlIGFuZCBkbTkxMzEKKworY29uZmlnIERQODM4NDhfUEhZCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIERQODM4NDggUEhZIgorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnRzIHRoZSBEUDgzODQ4IFBIWS4KKworY29uZmlnIERQODM4NjdfUEhZCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIERQODM4NjcgR2lnYWJpdCBQSFkiCisJLS0taGVscC0tLQorCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBEUDgzODY3IFBIWS4KKworY29uZmlnIEZJWEVEX1BIWQorCXRyaXN0YXRlICJNRElPIEJ1cy9QSFkgZW11bGF0aW9uIHdpdGggZml4ZWQgc3BlZWQvbGluayBQSFlzIgorCWRlcGVuZHMgb24gUEhZTElCCisJc2VsZWN0IFNXUEhZCisJLS0taGVscC0tLQorCSAgQWRkcyB0aGUgcGxhdGZvcm0gImZpeGVkIiBNRElPIEJ1cyB0byBjb3ZlciB0aGUgYm9hcmRzIHRoYXQgdXNlCisJICBQSFlzIHRoYXQgYXJlIG5vdCBjb25uZWN0ZWQgdG8gdGhlIHJlYWwgTURJTyBidXMuCisKKwkgIEN1cnJlbnRseSB0ZXN0ZWQgd2l0aCBtcGM4NjZhZHMgYW5kIG1wYzgzNDllLW1pdHguCisKK2NvbmZpZyBJQ1BMVVNfUEhZCisJdHJpc3RhdGUgIklDUGx1cyBQSFlzIgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgSVAxNzVDIGFuZCBJUDEwMDEgUEhZcy4KKworY29uZmlnIElOVEVMX1hXQVlfUEhZCisJdHJpc3RhdGUgIkludGVsIFhXQVkgUEhZcyIKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0cyB0aGUgSW50ZWwgWFdBWSAoZm9ybWVyIExhbnRpcSkgMTFHIGFuZCAyMkUgUEhZcy4KKwkgIFRoZXNlIFBIWXMgYXJlIG1hcmtlZCBhcyBzdGFuZGFsb25lIGNoaXBzIHVuZGVyIHRoZSBuYW1lcworCSAgUEVGIDcwNjEsIFBFRiA3MDcxIGFuZCBQRUYgNzA3MiBvciBpbnRlZ3JhdGVkIGludG8gdGhlIEludGVsCisJICBTb0NzIHhSWDIwMCwgeFJYMzAwLCB4UlgzMzAsIHhSWDM1MCBhbmQgeFJYNTUwLgorCitjb25maWcgTFNJX0VUMTAxMUNfUEhZCisJdHJpc3RhdGUgIkxTSSBFVDEwMTFDIFBIWSIKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0cyB0aGUgTFNJIEVUMTAxMUMgUEhZLgorCitjb25maWcgTFhUX1BIWQorCXRyaXN0YXRlICJJbnRlbCBMWFQgUEhZcyIKKwktLS1oZWxwLS0tCisJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIGx4dDk3MCwgbHh0OTcxCisKK2NvbmZpZyBNQVJWRUxMX1BIWQorCXRyaXN0YXRlICJNYXJ2ZWxsIFBIWXMiCisJLS0taGVscC0tLQorCSAgQ3VycmVudGx5IGhhcyBhIGRyaXZlciBmb3IgdGhlIDg4RTEwMTFTCisKK2NvbmZpZyBNSUNSRUxfUEhZCisJdHJpc3RhdGUgIk1pY3JlbCBQSFlzIgorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnRzIHRoZSBLU1o5MDIxLCBWU0M4MjAxLCBLUzgwMDEgUEhZcy4KKworY29uZmlnIE1JQ1JPQ0hJUF9QSFkKKwl0cmlzdGF0ZSAiTWljcm9jaGlwIFBIWXMiCisJaGVscAorCSAgU3VwcG9ydHMgdGhlIExBTjg4WFggUEhZcy4KKworY29uZmlnIE1JQ1JPU0VNSV9QSFkKKwl0cmlzdGF0ZSAiTWljcm9zZW1pIFBIWXMiCisJLS0taGVscC0tLQorCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBWU0M4NTMxIGFuZCBWU0M4NTQxIFBIWXMKKworY29uZmlnIE5BVElPTkFMX1BIWQorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIFBIWXMiCisJLS0taGVscC0tLQorCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBEUDgzODY1IFBIWS4KKworY29uZmlnIFFTRU1JX1BIWQorCXRyaXN0YXRlICJRdWFsaXR5IFNlbWljb25kdWN0b3IgUEhZcyIKKwktLS1oZWxwLS0tCisJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIHFzNjYxMgorCitjb25maWcgUkVBTFRFS19QSFkKKwl0cmlzdGF0ZSAiUmVhbHRlayBQSFlzIgorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnRzIHRoZSBSZWFsdGVrIDgyMXggUEhZLgorCitjb25maWcgU01TQ19QSFkKKwl0cmlzdGF0ZSAiU01TQyBQSFlzIgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgTEFOODNDMTg1LCBMQU44MTg3IGFuZCBMQU44NzAwIFBIWXMKKworY29uZmlnIFNURTEwWFAKKwl0cmlzdGF0ZSAiU1RNaWNyb2VsZWN0cm9uaWNzIFNUZTEwWHAgUEhZcyIKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBTVGUxMDBwIGFuZCBTVGUxMDFwIFBIWXMuCisKK2NvbmZpZyBURVJBTkVUSUNTX1BIWQorICAgICAgICB0cmlzdGF0ZSAiVGVyYW5ldGljcyBQSFlzIgorICAgICAgICAtLS1oZWxwLS0tCisgICAgICAgICAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBUZXJhbmV0aWNzIFROMjAyMAorCitjb25maWcgVklURVNTRV9QSFkKKyAgICAgICAgdHJpc3RhdGUgIlZpdGVzc2UgUEhZcyIKKyAgICAgICAgLS0taGVscC0tLQorICAgICAgICAgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgdnNjODI0NAorCitjb25maWcgWElMSU5YX0dNSUkyUkdNSUkKKyAgICAgICB0cmlzdGF0ZSAiWGlsaW54IEdNSUkyUkdNSUkgY29udmVydGVyIGRyaXZlciIKKyAgICAgICAtLS1oZWxwLS0tCisgICAgICAgICBUaGlzIGRyaXZlciBzdXBwb3J0IHhpbGlueCBHTUlJIHRvIFJHTUlJIElQIGNvcmUgaXQgcHJvdmlkZXMKKyAgICAgICAgIHRoZSBSZWR1Y2VkIEdpZ2FiaXQgTWVkaWEgSW5kZXBlbmRlbnQgSW50ZXJmYWNlKFJHTUlJKSBiZXR3ZWVuCisgICAgICAgICBFdGhlcm5ldCBwaHlzaWNhbCBtZWRpYSBkZXZpY2VzIGFuZCB0aGUgR2lnYWJpdCBFdGhlcm5ldCBjb250cm9sbGVyLgorCitjb25maWcgTURJT19YR0VORQorCXRyaXN0YXRlICJBUE0gWC1HZW5lIFNvQyBNRElPIGJ1cyBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gQVJDSF9YR0VORSB8fCBDT01QSUxFX1RFU1QKKwloZWxwCisJICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGRyaXZlciBmb3IgdGhlIE1ESU8gYnVzc2VzIGZvdW5kIGluIHRoZQorCSAgQVBNIFgtR2VuZSBTb0Mncy4KKwogZW5kaWYgIyBQSFlMSUIKIAogY29uZmlnIE1JQ1JFTF9LUzg5OTVNQQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvcGh5L01ha2VmaWxlCmluZGV4IDUzNGRmYTcuLmU1ODY2N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9waHkvTWFrZWZpbGUKQEAgLTEsNTEgKzEsNTUgQEAKLSMgTWFrZWZpbGUgZm9yIExpbnV4IFBIWSBkcml2ZXJzCisjIE1ha2VmaWxlIGZvciBMaW51eCBQSFkgZHJpdmVycyBhbmQgTURJTyBidXMgZHJpdmVycwogCiBsaWJwaHkteQkJCTo9IHBoeS5vIHBoeV9kZXZpY2UubyBtZGlvX2J1cy5vIG1kaW9fZGV2aWNlLm8KIGxpYnBoeS0kKENPTkZJR19TV1BIWSkJCSs9IHN3cGh5Lm8KIAogb2JqLSQoQ09ORklHX1BIWUxJQikJCSs9IGxpYnBoeS5vCisKK29iai0kKENPTkZJR19NRElPX0JDTV9JUFJPQykJKz0gbWRpby1iY20taXByb2Mubworb2JqLSQoQ09ORklHX01ESU9fQkNNX1VOSU1BQykJKz0gbWRpby1iY20tdW5pbWFjLm8KK29iai0kKENPTkZJR19NRElPX0JJVEJBTkcpCSs9IG1kaW8tYml0YmFuZy5vCitvYmotJChDT05GSUdfTURJT19CVVNfTVVYKQkrPSBtZGlvLW11eC5vCitvYmotJChDT05GSUdfTURJT19CVVNfTVVYX0JDTV9JUFJPQykJKz0gbWRpby1tdXgtYmNtLWlwcm9jLm8KK29iai0kKENPTkZJR19NRElPX0JVU19NVVhfR1BJTykJKz0gbWRpby1tdXgtZ3Bpby5vCitvYmotJChDT05GSUdfTURJT19CVVNfTVVYX01NSU9SRUcpICs9IG1kaW8tbXV4LW1taW9yZWcubworb2JqLSQoQ09ORklHX01ESU9fQ0FWSVVNKQkrPSBtZGlvLWNhdml1bS5vCitvYmotJChDT05GSUdfTURJT19HUElPKQkJKz0gbWRpby1ncGlvLm8KK29iai0kKENPTkZJR19NRElPX0hJU0lfRkVNQUMpCSs9IG1kaW8taGlzaS1mZW1hYy5vCitvYmotJChDT05GSUdfTURJT19NT1hBUlQpCSs9IG1kaW8tbW94YXJ0Lm8KK29iai0kKENPTkZJR19NRElPX09DVEVPTikJKz0gbWRpby1vY3Rlb24ubworb2JqLSQoQ09ORklHX01ESU9fU1VONEkpCSs9IG1kaW8tc3VuNGkubworb2JqLSQoQ09ORklHX01ESU9fVEhVTkRFUikJKz0gbWRpby10aHVuZGVyLm8KK29iai0kKENPTkZJR19NRElPX1hHRU5FKQkrPSBtZGlvLXhnZW5lLm8KKworb2JqLSQoQ09ORklHX0FNRF9QSFkpCQkrPSBhbWQubwogb2JqLSQoQ09ORklHX0FRVUFOVElBX1BIWSkJKz0gYXF1YW50aWEubwotb2JqLSQoQ09ORklHX01BUlZFTExfUEhZKQkrPSBtYXJ2ZWxsLm8KLW9iai0kKENPTkZJR19EQVZJQ09NX1BIWSkJKz0gZGF2aWNvbS5vCi1vYmotJChDT05GSUdfQ0lDQURBX1BIWSkJKz0gY2ljYWRhLm8KLW9iai0kKENPTkZJR19MWFRfUEhZKQkJKz0gbHh0Lm8KLW9iai0kKENPTkZJR19RU0VNSV9QSFkpCQkrPSBxc2VtaS5vCi1vYmotJChDT05GSUdfU01TQ19QSFkpCQkrPSBzbXNjLm8KLW9iai0kKENPTkZJR19URVJBTkVUSUNTX1BIWSkJKz0gdGVyYW5ldGljcy5vCi1vYmotJChDT05GSUdfVklURVNTRV9QSFkpCSs9IHZpdGVzc2Uubwotb2JqLSQoQ09ORklHX0JDTV9ORVRfUEhZTElCKQkrPSBiY20tcGh5LWxpYi5vCi1vYmotJChDT05GSUdfQlJPQURDT01fUEhZKQkrPSBicm9hZGNvbS5vCitvYmotJChDT05GSUdfQVQ4MDNYX1BIWSkJKz0gYXQ4MDN4Lm8KIG9iai0kKENPTkZJR19CQ002M1hYX1BIWSkJKz0gYmNtNjN4eC5vCiBvYmotJChDT05GSUdfQkNNN1hYWF9QSFkpCSs9IGJjbTd4eHgubwogb2JqLSQoQ09ORklHX0JDTTg3WFhfUEhZKQkrPSBiY204N3h4Lm8KIG9iai0kKENPTkZJR19CQ01fQ1lHTlVTX1BIWSkJKz0gYmNtLWN5Z251cy5vCi1vYmotJChDT05GSUdfSUNQTFVTX1BIWSkJKz0gaWNwbHVzLm8KLW9iai0kKENPTkZJR19SRUFMVEVLX1BIWSkJKz0gcmVhbHRlay5vCi1vYmotJChDT05GSUdfTFNJX0VUMTAxMUNfUEhZKQkrPSBldDEwMTFjLm8KLW9iai0kKENPTkZJR19GSVhFRF9QSFkpCQkrPSBmaXhlZF9waHkubwotb2JqLSQoQ09ORklHX01ESU9fQklUQkFORykJKz0gbWRpby1iaXRiYW5nLm8KLW9iai0kKENPTkZJR19NRElPX0dQSU8pCQkrPSBtZGlvLWdwaW8ubwotb2JqLSQoQ09ORklHX05BVElPTkFMX1BIWSkJKz0gbmF0aW9uYWwubworb2JqLSQoQ09ORklHX0JDTV9ORVRfUEhZTElCKQkrPSBiY20tcGh5LWxpYi5vCitvYmotJChDT05GSUdfQlJPQURDT01fUEhZKQkrPSBicm9hZGNvbS5vCitvYmotJChDT05GSUdfQ0lDQURBX1BIWSkJKz0gY2ljYWRhLm8KK29iai0kKENPTkZJR19EQVZJQ09NX1BIWSkJKz0gZGF2aWNvbS5vCiBvYmotJChDT05GSUdfRFA4MzY0MF9QSFkpCSs9IGRwODM2NDAubwogb2JqLSQoQ09ORklHX0RQODM4NDhfUEhZKQkrPSBkcDgzODQ4Lm8KIG9iai0kKENPTkZJR19EUDgzODY3X1BIWSkJKz0gZHA4Mzg2Ny5vCi1vYmotJChDT05GSUdfU1RFMTBYUCkJCSs9IHN0ZTEwWHAubwotb2JqLSQoQ09ORklHX01JQ1JFTF9QSFkpCSs9IG1pY3JlbC5vCi1vYmotJChDT05GSUdfTURJT19PQ1RFT04pCSs9IG1kaW8tb2N0ZW9uLm8KLW9iai0kKENPTkZJR19NRElPX1RIVU5ERVIpCSs9IG1kaW8tdGh1bmRlci5vCi1vYmotJChDT05GSUdfTURJT19DQVZJVU0pCSs9IG1kaW8tY2F2aXVtLm8KLW9iai0kKENPTkZJR19NSUNSRUxfS1M4OTk1TUEpCSs9IHNwaV9rczg5OTUubwotb2JqLSQoQ09ORklHX0FUODAzWF9QSFkpCSs9IGF0ODAzeC5vCi1vYmotJChDT05GSUdfQU1EX1BIWSkJCSs9IGFtZC5vCi1vYmotJChDT05GSUdfTURJT19CVVNfTVVYKQkrPSBtZGlvLW11eC5vCi1vYmotJChDT05GSUdfTURJT19CVVNfTVVYX0dQSU8pCSs9IG1kaW8tbXV4LWdwaW8ubwotb2JqLSQoQ09ORklHX01ESU9fQlVTX01VWF9NTUlPUkVHKSArPSBtZGlvLW11eC1tbWlvcmVnLm8KLW9iai0kKENPTkZJR19NRElPX0JVU19NVVhfQkNNX0lQUk9DKQkrPSBtZGlvLW11eC1iY20taXByb2Mubwotb2JqLSQoQ09ORklHX01ESU9fU1VONEkpCSs9IG1kaW8tc3VuNGkubwotb2JqLSQoQ09ORklHX01ESU9fTU9YQVJUKQkrPSBtZGlvLW1veGFydC5vCi1vYmotJChDT05GSUdfTURJT19CQ01fVU5JTUFDKQkrPSBtZGlvLWJjbS11bmltYWMubwotb2JqLSQoQ09ORklHX01JQ1JPQ0hJUF9QSFkpCSs9IG1pY3JvY2hpcC5vCi1vYmotJChDT05GSUdfTURJT19CQ01fSVBST0MpCSs9IG1kaW8tYmNtLWlwcm9jLm8KK29iai0kKENPTkZJR19GSVhFRF9QSFkpCQkrPSBmaXhlZF9waHkubworb2JqLSQoQ09ORklHX0lDUExVU19QSFkpCSs9IGljcGx1cy5vCiBvYmotJChDT05GSUdfSU5URUxfWFdBWV9QSFkpCSs9IGludGVsLXh3YXkubwotb2JqLSQoQ09ORklHX01ESU9fSElTSV9GRU1BQykJKz0gbWRpby1oaXNpLWZlbWFjLm8KLW9iai0kKENPTkZJR19NRElPX1hHRU5FKQkrPSBtZGlvLXhnZW5lLm8KK29iai0kKENPTkZJR19MU0lfRVQxMDExQ19QSFkpCSs9IGV0MTAxMWMubworb2JqLSQoQ09ORklHX0xYVF9QSFkpCQkrPSBseHQubworb2JqLSQoQ09ORklHX01BUlZFTExfUEhZKQkrPSBtYXJ2ZWxsLm8KK29iai0kKENPTkZJR19NSUNSRUxfS1M4OTk1TUEpCSs9IHNwaV9rczg5OTUubworb2JqLSQoQ09ORklHX01JQ1JFTF9QSFkpCSs9IG1pY3JlbC5vCitvYmotJChDT05GSUdfTUlDUk9DSElQX1BIWSkJKz0gbWljcm9jaGlwLm8KK29iai0kKENPTkZJR19NSUNST1NFTUlfUEhZKQkrPSBtc2NjLm8KK29iai0kKENPTkZJR19OQVRJT05BTF9QSFkpCSs9IG5hdGlvbmFsLm8KK29iai0kKENPTkZJR19RU0VNSV9QSFkpCQkrPSBxc2VtaS5vCitvYmotJChDT05GSUdfUkVBTFRFS19QSFkpCSs9IHJlYWx0ZWsubworb2JqLSQoQ09ORklHX1NNU0NfUEhZKQkJKz0gc21zYy5vCitvYmotJChDT05GSUdfU1RFMTBYUCkJCSs9IHN0ZTEwWHAubworb2JqLSQoQ09ORklHX1RFUkFORVRJQ1NfUEhZKQkrPSB0ZXJhbmV0aWNzLm8KK29iai0kKENPTkZJR19WSVRFU1NFX1BIWSkJKz0gdml0ZXNzZS5vCitvYmotJChDT05GSUdfWElMSU5YX0dNSUkyUkdNSUkpICs9IHhpbGlueF9nbWlpMnJnbWlpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9tZGlvLXhnZW5lLmMgYi9kcml2ZXJzL25ldC9waHkvbWRpby14Z2VuZS5jCmluZGV4IDc3NTY3NDguLjkyYWYxODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9tZGlvLXhnZW5lLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L21kaW8teGdlbmUuYwpAQCAtNDI0LDEwICs0MjQsOCBAQAogCW1kaW9idXNfdW5yZWdpc3RlcihtZGlvX2J1cyk7CiAJbWRpb2J1c19mcmVlKG1kaW9fYnVzKTsKIAotCWlmIChkZXYtPm9mX25vZGUpIHsKLQkJaWYgKElTX0VSUihwZGF0YS0+Y2xrKSkKLQkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwZGF0YS0+Y2xrKTsKLQl9CisJaWYgKGRldi0+b2Zfbm9kZSkKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBkYXRhLT5jbGspOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvbWljcmVsLmMgYi9kcml2ZXJzL25ldC9waHkvbWljcmVsLmMKaW5kZXggMTg4MmQ5OC4uMDgxZGY2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L21pY3JlbC5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9taWNyZWwuYwpAQCAtNDM5LDYgKzQzOSwxMCBAQAogI2RlZmluZSBNSUlfS1NaOTAzMVJOX1RYX0RBVEFfUEFEX1NLRVcJNgogI2RlZmluZSBNSUlfS1NaOTAzMVJOX0NMS19QQURfU0tFVwk4CiAKKy8qIE1NRCBBZGRyZXNzIDB4MUMgKi8KKyNkZWZpbmUgTUlJX0tTWjkwMzFSTl9FRFBECQkweDIzCisjZGVmaW5lIE1JSV9LU1o5MDMxUk5fRURQRF9FTkFCTEUJQklUKDApCisKIHN0YXRpYyBpbnQga3N6OTAzMV9leHRlbmRlZF93cml0ZShzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2LAogCQkJCSAgdTggbW9kZSwgdTMyIGRldl9hZGRyLCB1MzIgcmVnbnVtLCB1MTYgdmFsKQogewpAQCAtNTEwLDYgKzUxNCwxOCBAQAogCXJldHVybiBnZW5waHlfcmVzdGFydF9hbmVnKHBoeWRldik7CiB9CiAKKy8qIEVuYWJsZSBlbmVyZ3ktZGV0ZWN0IHBvd2VyLWRvd24gbW9kZSAqLworc3RhdGljIGludCBrc3o5MDMxX2VuYWJsZV9lZHBkKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJaW50IHJlZzsKKworCXJlZyA9IGtzejkwMzFfZXh0ZW5kZWRfcmVhZChwaHlkZXYsIE9QX0RBVEEsIDB4MUMsIE1JSV9LU1o5MDMxUk5fRURQRCk7CisJaWYgKHJlZyA8IDApCisJCXJldHVybiByZWc7CisJcmV0dXJuIGtzejkwMzFfZXh0ZW5kZWRfd3JpdGUocGh5ZGV2LCBPUF9EQVRBLCAweDFDLCBNSUlfS1NaOTAzMVJOX0VEUEQsCisJCQkJICAgICAgcmVnIHwgTUlJX0tTWjkwMzFSTl9FRFBEX0VOQUJMRSk7Cit9CisKIHN0YXRpYyBpbnQga3N6OTAzMV9jb25maWdfaW5pdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogewogCWNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiA9ICZwaHlkZXYtPm1kaW8uZGV2OwpAQCAtNTI1LDYgKzU0MSwxMSBAQAogCX07CiAJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnRyb2xfc2tld3NbMl0gPSB7InR4ZW4tc2tldy1wcyIsICJyeGR2LXNrZXctcHMifTsKIAljb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXZfd2Fsa2VyOworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBrc3o5MDMxX2VuYWJsZV9lZHBkKHBoeWRldik7CisJaWYgKHJlc3VsdCA8IDApCisJCXJldHVybiByZXN1bHQ7CiAKIAkvKiBUaGUgTWljcmVsIGRyaXZlciBoYXMgYSBkZXByZWNhdGVkIG9wdGlvbiB0byBwbGFjZSBwaHkgT0YKIAkgKiBwcm9wZXJ0aWVzIGluIHRoZSBNQUMgbm9kZS4gV2FsayB1cCB0aGUgdHJlZSBvZiBkZXZpY2VzIHRvCkBAIC02NzcsMTcgKzY5OCwyOCBAQAogCQlkYXRhW2ldID0ga3N6cGh5X2dldF9zdGF0KHBoeWRldiwgaSk7CiB9CiAKK3N0YXRpYyBpbnQga3N6cGh5X3N1c3BlbmQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwkvKiBEaXNhYmxlIFBIWSBJbnRlcnJ1cHRzICovCisJaWYgKHBoeV9pbnRlcnJ1cHRfaXNfdmFsaWQocGh5ZGV2KSkgeworCQlwaHlkZXYtPmludGVycnVwdHMgPSBQSFlfSU5URVJSVVBUX0RJU0FCTEVEOworCQlpZiAocGh5ZGV2LT5kcnYtPmNvbmZpZ19pbnRyKQorCQkJcGh5ZGV2LT5kcnYtPmNvbmZpZ19pbnRyKHBoeWRldik7CisJfQorCisJcmV0dXJuIGdlbnBoeV9zdXNwZW5kKHBoeWRldik7Cit9CisKIHN0YXRpYyBpbnQga3N6cGh5X3Jlc3VtZShzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogewotCWludCB2YWx1ZTsKKwlnZW5waHlfcmVzdW1lKHBoeWRldik7CiAKLQltdXRleF9sb2NrKCZwaHlkZXYtPmxvY2spOwotCi0JdmFsdWUgPSBwaHlfcmVhZChwaHlkZXYsIE1JSV9CTUNSKTsKLQlwaHlfd3JpdGUocGh5ZGV2LCBNSUlfQk1DUiwgdmFsdWUgJiB+Qk1DUl9QRE9XTik7Ci0KLQlrc3pwaHlfY29uZmlnX2ludHIocGh5ZGV2KTsKLQltdXRleF91bmxvY2soJnBoeWRldi0+bG9jayk7CisJLyogRW5hYmxlIFBIWSBJbnRlcnJ1cHRzICovCisJaWYgKHBoeV9pbnRlcnJ1cHRfaXNfdmFsaWQocGh5ZGV2KSkgeworCQlwaHlkZXYtPmludGVycnVwdHMgPSBQSFlfSU5URVJSVVBUX0VOQUJMRUQ7CisJCWlmIChwaHlkZXYtPmRydi0+Y29uZmlnX2ludHIpCisJCQlwaHlkZXYtPmRydi0+Y29uZmlnX2ludHIocGh5ZGV2KTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTkwMCw3ICs5MzIsNyBAQAogCS5nZXRfc3NldF9jb3VudCA9IGtzenBoeV9nZXRfc3NldF9jb3VudCwKIAkuZ2V0X3N0cmluZ3MJPSBrc3pwaHlfZ2V0X3N0cmluZ3MsCiAJLmdldF9zdGF0cwk9IGtzenBoeV9nZXRfc3RhdHMsCi0JLnN1c3BlbmQJPSBnZW5waHlfc3VzcGVuZCwKKwkuc3VzcGVuZAk9IGtzenBoeV9zdXNwZW5kLAogCS5yZXN1bWUJCT0ga3N6cGh5X3Jlc3VtZSwKIH0sIHsKIAkucGh5X2lkCQk9IFBIWV9JRF9LU1o4MDYxLApAQCAtOTUzLDcgKzk4NSw3IEBACiAJLmdldF9zdHJpbmdzCT0ga3N6cGh5X2dldF9zdHJpbmdzLAogCS5nZXRfc3RhdHMJPSBrc3pwaHlfZ2V0X3N0YXRzLAogCS5zdXNwZW5kCT0gZ2VucGh5X3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBnZW5waHlfcmVzdW1lLAorCS5yZXN1bWUJCT0ga3N6cGh5X3Jlc3VtZSwKIH0sIHsKIAkucGh5X2lkCQk9IFBIWV9JRF9LU1o4ODczTUxMLAogCS5waHlfaWRfbWFzawk9IE1JQ1JFTF9QSFlfSURfTUFTSywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9taWNyb2NoaXAuYyBiL2RyaXZlcnMvbmV0L3BoeS9taWNyb2NoaXAuYwppbmRleCAxNWY4MjA2Li43YzAwZTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvbWljcm9jaGlwLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L21pY3JvY2hpcC5jCkBAIC01NSw3ICs1NSw3IEBACiAJcmV0dXJuIHJjIDwgMCA/IHJjIDogMDsKIH0KIAotaW50IGxhbjg4eHhfc3VzcGVuZChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQorc3RhdGljIGludCBsYW44OHh4X3N1c3BlbmQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKIAlzdHJ1Y3QgbGFuODh4eF9wcml2ICpwcml2ID0gcGh5ZGV2LT5wcml2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvbXNjYy5jIGIvZHJpdmVycy9uZXQvcGh5L21zY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTc1NzNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGh5L21zY2MuYwpAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIERyaXZlciBmb3IgTWljcm9zZW1pIFZTQzg1eHggUEhZcworICoKKyAqIEF1dGhvcjogTmFnYXJhanUgTGFra2FyYWp1CisgKiBMaWNlbnNlOiBEdWFsIE1JVC9HUEwKKyAqIENvcHlyaWdodCAoYykgMjAxNiBNaWNyb3NlbWkgQ29ycG9yYXRpb24KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWRpby5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvbmV0L21zY2MtcGh5LXZzYzg1MzEuaD4KKworZW51bSByZ21paV9yeF9jbG9ja19kZWxheSB7CisJUkdNSUlfUlhfQ0xLX0RFTEFZXzBfMl9OUyA9IDAsCisJUkdNSUlfUlhfQ0xLX0RFTEFZXzBfOF9OUyA9IDEsCisJUkdNSUlfUlhfQ0xLX0RFTEFZXzFfMV9OUyA9IDIsCisJUkdNSUlfUlhfQ0xLX0RFTEFZXzFfN19OUyA9IDMsCisJUkdNSUlfUlhfQ0xLX0RFTEFZXzJfMF9OUyA9IDQsCisJUkdNSUlfUlhfQ0xLX0RFTEFZXzJfM19OUyA9IDUsCisJUkdNSUlfUlhfQ0xLX0RFTEFZXzJfNl9OUyA9IDYsCisJUkdNSUlfUlhfQ0xLX0RFTEFZXzNfNF9OUyA9IDcKK307CisKKy8qIE1pY3Jvc2VtaSBWU0M4NXh4IFBIWSByZWdpc3RlcnMgKi8KKy8qIElFRUUgODAyLiBTdGQgUmVnaXN0ZXJzICovCisjZGVmaW5lIE1TQ0NfUEhZX0VYVF9QSFlfQ05UTF8xICAgICAgICAgICAyMworI2RlZmluZSBNQUNfSUZfU0VMRUNUSU9OX01BU0sgICAgICAgICAgICAgMHgxODAwCisjZGVmaW5lIE1BQ19JRl9TRUxFQ1RJT05fR01JSSAgICAgICAgICAgICAwCisjZGVmaW5lIE1BQ19JRl9TRUxFQ1RJT05fUk1JSSAgICAgICAgICAgICAxCisjZGVmaW5lIE1BQ19JRl9TRUxFQ1RJT05fUkdNSUkgICAgICAgICAgICAyCisjZGVmaW5lIE1BQ19JRl9TRUxFQ1RJT05fUE9TICAgICAgICAgICAgICAxMQorI2RlZmluZSBGQVJfRU5EX0xPT1BCQUNLX01PREVfTUFTSyAgICAgICAgMHgwMDA4CisKKyNkZWZpbmUgTUlJX1ZTQzg1WFhfSU5UX01BU0sJCSAgMjUKKyNkZWZpbmUgTUlJX1ZTQzg1WFhfSU5UX01BU0tfTUFTSwkgIDB4YTAwMAorI2RlZmluZSBNSUlfVlNDODVYWF9JTlRfU1RBVFVTCQkgIDI2CisKKyNkZWZpbmUgTVNDQ19QSFlfV09MX01BQ19DT05UUk9MICAgICAgICAgIDI3CisjZGVmaW5lIEVER0VfUkFURV9DTlRMX1BPUyAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEVER0VfUkFURV9DTlRMX01BU0sgICAgICAgICAgICAgICAweDAwRTAKKworI2RlZmluZSBNU0NDX0VYVF9QQUdFX0FDQ0VTUwkJICAzMQorI2RlZmluZSBNU0NDX1BIWV9QQUdFX1NUQU5EQVJECQkgIDB4MDAwMCAvKiBTdGFuZGFyZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTVNDQ19QSFlfUEFHRV9FWFRFTkRFRF8yCSAgMHgwMDAyIC8qIEV4dGVuZGVkIHJlZyAtIHBhZ2UgMiAqLworCisvKiBFeHRlbmRlZCBQYWdlIDIgUmVnaXN0ZXJzICovCisjZGVmaW5lIE1TQ0NfUEhZX1JHTUlJX0NOVEwJCSAgMjAKKyNkZWZpbmUgUkdNSUlfUlhfQ0xLX0RFTEFZX01BU0sJCSAgMHgwMDcwCisjZGVmaW5lIFJHTUlJX1JYX0NMS19ERUxBWV9QT1MJCSAgNAorCisvKiBNaWNyb3NlbWkgUEhZIElEJ3MgKi8KKyNkZWZpbmUgUEhZX0lEX1ZTQzg1MzEJCQkgIDB4MDAwNzA1NzAKKyNkZWZpbmUgUEhZX0lEX1ZTQzg1NDEJCQkgIDB4MDAwNzA3NzAKKworc3RydWN0IGVkZ2VfcmF0ZV90YWJsZSB7CisJdTE2IHZkZG1hYzsKKwlpbnQgc2xvd2Rvd25bTVNDQ19TTE9XRE9XTl9NQVhdOworfTsKKworc3RydWN0IGVkZ2VfcmF0ZV90YWJsZSBlZGdlX3RhYmxlW01TQ0NfVkRETUFDX01BWF0gPSB7CisJezMzMDAsIHsgMCwgLTIsIC00LCAgLTcsICAtMTAsIC0xNywgLTI5LCAtNTN9IH0sCisJezI1MDAsIHsgMCwgLTMsIC02LCAgLTEwLCAtMTQsIC0yMywgLTM3LCAtNjN9IH0sCisJezE4MDAsIHsgMCwgLTUsIC05LCAgLTE2LCAtMjMsIC0zNSwgLTUyLCAtNzZ9IH0sCisJezE1MDAsIHsgMCwgLTYsIC0xNCwgLTIxLCAtMjksIC00MiwgLTU4LCAtNzd9IH0sCit9OworCitzdHJ1Y3QgdnNjODUzMV9wcml2YXRlIHsKKwl1OCBlZGdlX3Nsb3dkb3duOworCXUxNiB2ZGRtYWM7Cit9OworCitzdGF0aWMgaW50IHZzYzg1eHhfcGh5X3BhZ2Vfc2V0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYsIHU4IHBhZ2UpCit7CisJaW50IHJjOworCisJcmMgPSBwaHlfd3JpdGUocGh5ZGV2LCBNU0NDX0VYVF9QQUdFX0FDQ0VTUywgcGFnZSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdTggZWRnZV9yYXRlX21hZ2ljX2dldCh1MTYgdmRkbWFjLAorCQkJICAgICAgaW50IHNsb3dkb3duKQoreworCWludCByYyA9IChNU0NDX1NMT1dET1dOX01BWCAtIDEpOworCXU4IHZkZDsKKwl1OCBzZDsKKworCWZvciAodmRkID0gMDsgdmRkIDwgTVNDQ19WRERNQUNfTUFYOyB2ZGQrKykgeworCQlpZiAoZWRnZV90YWJsZVt2ZGRdLnZkZG1hYyA9PSB2ZGRtYWMpIHsKKwkJCWZvciAoc2QgPSAwOyBzZCA8IE1TQ0NfU0xPV0RPV05fTUFYOyBzZCsrKSB7CisJCQkJaWYgKGVkZ2VfdGFibGVbdmRkXS5zbG93ZG93bltzZF0gPD0gc2xvd2Rvd24pIHsKKwkJCQkJcmMgPSAoTVNDQ19TTE9XRE9XTl9NQVggLSBzZCAtIDEpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdnNjODV4eF9lZGdlX3JhdGVfY250bF9zZXQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwKKwkJCQkgICAgICB1OCBlZGdlX3JhdGUpCit7CisJaW50IHJjOworCXUxNiByZWdfdmFsOworCisJbXV0ZXhfbG9jaygmcGh5ZGV2LT5sb2NrKTsKKwlyYyA9IHZzYzg1eHhfcGh5X3BhZ2Vfc2V0KHBoeWRldiwgTVNDQ19QSFlfUEFHRV9FWFRFTkRFRF8yKTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBvdXRfdW5sb2NrOworCXJlZ192YWwgPSBwaHlfcmVhZChwaHlkZXYsIE1TQ0NfUEhZX1dPTF9NQUNfQ09OVFJPTCk7CisJcmVnX3ZhbCAmPSB+KEVER0VfUkFURV9DTlRMX01BU0spOworCXJlZ192YWwgfD0gKGVkZ2VfcmF0ZSA8PCBFREdFX1JBVEVfQ05UTF9QT1MpOworCXJjID0gcGh5X3dyaXRlKHBoeWRldiwgTVNDQ19QSFlfV09MX01BQ19DT05UUk9MLCByZWdfdmFsKTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBvdXRfdW5sb2NrOworCXJjID0gdnNjODV4eF9waHlfcGFnZV9zZXQocGh5ZGV2LCBNU0NDX1BIWV9QQUdFX1NUQU5EQVJEKTsKKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJnBoeWRldi0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdnNjODV4eF9tYWNfaWZfc2V0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYsCisJCQkgICAgICBwaHlfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKQoreworCWludCByYzsKKwl1MTYgcmVnX3ZhbDsKKworCW11dGV4X2xvY2soJnBoeWRldi0+bG9jayk7CisJcmVnX3ZhbCA9IHBoeV9yZWFkKHBoeWRldiwgTVNDQ19QSFlfRVhUX1BIWV9DTlRMXzEpOworCXJlZ192YWwgJj0gfihNQUNfSUZfU0VMRUNUSU9OX01BU0spOworCXN3aXRjaCAoaW50ZXJmYWNlKSB7CisJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUk6CisJCXJlZ192YWwgfD0gKE1BQ19JRl9TRUxFQ1RJT05fUkdNSUkgPDwgTUFDX0lGX1NFTEVDVElPTl9QT1MpOworCQlicmVhazsKKwljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJOgorCQlyZWdfdmFsIHw9IChNQUNfSUZfU0VMRUNUSU9OX1JNSUkgPDwgTUFDX0lGX1NFTEVDVElPTl9QT1MpOworCQlicmVhazsKKwljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUk6CisJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfR01JSToKKwkJcmVnX3ZhbCB8PSAoTUFDX0lGX1NFTEVDVElPTl9HTUlJIDw8IE1BQ19JRl9TRUxFQ1RJT05fUE9TKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXJjID0gcGh5X3dyaXRlKHBoeWRldiwgTVNDQ19QSFlfRVhUX1BIWV9DTlRMXzEsIHJlZ192YWwpOworCWlmIChyYyAhPSAwKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlyYyA9IGdlbnBoeV9zb2Z0X3Jlc2V0KHBoeWRldik7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZwaHlkZXYtPmxvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHZzYzg1eHhfZGVmYXVsdF9jb25maWcoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlpbnQgcmM7CisJdTE2IHJlZ192YWw7CisKKwltdXRleF9sb2NrKCZwaHlkZXYtPmxvY2spOworCXJjID0gdnNjODV4eF9waHlfcGFnZV9zZXQocGh5ZGV2LCBNU0NDX1BIWV9QQUdFX0VYVEVOREVEXzIpOworCWlmIChyYyAhPSAwKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlyZWdfdmFsID0gcGh5X3JlYWQocGh5ZGV2LCBNU0NDX1BIWV9SR01JSV9DTlRMKTsKKwlyZWdfdmFsICY9IH4oUkdNSUlfUlhfQ0xLX0RFTEFZX01BU0spOworCXJlZ192YWwgfD0gKFJHTUlJX1JYX0NMS19ERUxBWV8xXzFfTlMgPDwgUkdNSUlfUlhfQ0xLX0RFTEFZX1BPUyk7CisJcGh5X3dyaXRlKHBoeWRldiwgTVNDQ19QSFlfUkdNSUlfQ05UTCwgcmVnX3ZhbCk7CisJcmMgPSB2c2M4NXh4X3BoeV9wYWdlX3NldChwaHlkZXYsIE1TQ0NfUEhZX1BBR0VfU1RBTkRBUkQpOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmcGh5ZGV2LT5sb2NrKTsKKworCXJldHVybiByYzsKK30KKworI2lmZGVmIENPTkZJR19PRl9NRElPCitzdGF0aWMgaW50IHZzYzg1MzFfb2ZfaW5pdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCByYzsKKwlzdHJ1Y3QgdnNjODUzMV9wcml2YXRlICp2c2M4NTMxID0gcGh5ZGV2LT5wcml2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwaHlkZXYtPm1kaW8uZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSA9IGRldi0+b2Zfbm9kZTsKKworCWlmICghb2Zfbm9kZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTE2KG9mX25vZGUsICJ2c2M4NTMxLHZkZG1hYyIsCisJCQkJICAmdnNjODUzMS0+dmRkbWFjKTsKKwlpZiAocmMgPT0gLUVJTlZBTCkKKwkJdnNjODUzMS0+dmRkbWFjID0gTVNDQ19WRERNQUNfMzMwMDsKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTgob2Zfbm9kZSwgInZzYzg1MzEsZWRnZS1zbG93ZG93biIsCisJCQkJICZ2c2M4NTMxLT5lZGdlX3Nsb3dkb3duKTsKKwlpZiAocmMgPT0gLUVJTlZBTCkKKwkJdnNjODUzMS0+ZWRnZV9zbG93ZG93biA9IDA7CisKKwlyYyA9IDA7CisJcmV0dXJuIHJjOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgdnNjODUzMV9vZl9pbml0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX09GX01ESU8gKi8KKworc3RhdGljIGludCB2c2M4NXh4X2NvbmZpZ19pbml0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJaW50IHJjOworCXN0cnVjdCB2c2M4NTMxX3ByaXZhdGUgKnZzYzg1MzEgPSBwaHlkZXYtPnByaXY7CisJdTggZWRnZV9yYXRlOworCisJcmMgPSB2c2M4NTMxX29mX2luaXQocGh5ZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gdnNjODV4eF9kZWZhdWx0X2NvbmZpZyhwaHlkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSB2c2M4NXh4X21hY19pZl9zZXQocGh5ZGV2LCBwaHlkZXYtPmludGVyZmFjZSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwllZGdlX3JhdGUgPSBlZGdlX3JhdGVfbWFnaWNfZ2V0KHZzYzg1MzEtPnZkZG1hYywKKwkJCQkJLShpbnQpdnNjODUzMS0+ZWRnZV9zbG93ZG93bik7CisJcmMgPSB2c2M4NXh4X2VkZ2VfcmF0ZV9jbnRsX3NldChwaHlkZXYsIGVkZ2VfcmF0ZSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IGdlbnBoeV9jb25maWdfaW5pdChwaHlkZXYpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHZzYzg1eHhfYWNrX2ludGVycnVwdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCByYyA9IDA7CisKKwlpZiAocGh5ZGV2LT5pbnRlcnJ1cHRzID09IFBIWV9JTlRFUlJVUFRfRU5BQkxFRCkKKwkJcmMgPSBwaHlfcmVhZChwaHlkZXYsIE1JSV9WU0M4NVhYX0lOVF9TVEFUVVMpOworCisJcmV0dXJuIChyYyA8IDApID8gcmMgOiAwOworfQorCitzdGF0aWMgaW50IHZzYzg1eHhfY29uZmlnX2ludHIoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlpbnQgcmM7CisKKwlpZiAocGh5ZGV2LT5pbnRlcnJ1cHRzID09IFBIWV9JTlRFUlJVUFRfRU5BQkxFRCkgeworCQlyYyA9IHBoeV93cml0ZShwaHlkZXYsIE1JSV9WU0M4NVhYX0lOVF9NQVNLLAorCQkJICAgICAgIE1JSV9WU0M4NVhYX0lOVF9NQVNLX01BU0spOworCX0gZWxzZSB7CisJCXJjID0gcGh5X3dyaXRlKHBoeWRldiwgTUlJX1ZTQzg1WFhfSU5UX01BU0ssIDApOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCQlyYyA9IHBoeV9yZWFkKHBoeWRldiwgTUlJX1ZTQzg1WFhfSU5UX1NUQVRVUyk7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHZzYzg1eHhfcHJvYmUoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlzdHJ1Y3QgdnNjODUzMV9wcml2YXRlICp2c2M4NTMxOworCisJdnNjODUzMSA9IGRldm1fa3phbGxvYygmcGh5ZGV2LT5tZGlvLmRldiwgc2l6ZW9mKCp2c2M4NTMxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2c2M4NTMxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBoeWRldi0+cHJpdiA9IHZzYzg1MzE7CisKKwlyZXR1cm4gMDsKK30KKworLyogTWljcm9zZW1pIFZTQzg1eHggUEhZcyAqLworc3RhdGljIHN0cnVjdCBwaHlfZHJpdmVyIHZzYzg1eHhfZHJpdmVyW10gPSB7Cit7CisJLnBoeV9pZAkJPSBQSFlfSURfVlNDODUzMSwKKwkubmFtZQkJPSAiTWljcm9zZW1pIFZTQzg1MzEiLAorCS5waHlfaWRfbWFzayAgICA9IDB4ZmZmZmZmZjAsCisJLmZlYXR1cmVzCT0gUEhZX0dCSVRfRkVBVFVSRVMsCisJLmZsYWdzCQk9IFBIWV9IQVNfSU5URVJSVVBULAorCS5zb2Z0X3Jlc2V0CT0gJmdlbnBoeV9zb2Z0X3Jlc2V0LAorCS5jb25maWdfaW5pdCAgICA9ICZ2c2M4NXh4X2NvbmZpZ19pbml0LAorCS5jb25maWdfYW5lZyAgICA9ICZnZW5waHlfY29uZmlnX2FuZWcsCisJLmFuZWdfZG9uZQk9ICZnZW5waHlfYW5lZ19kb25lLAorCS5yZWFkX3N0YXR1cyAgICA9ICZnZW5waHlfcmVhZF9zdGF0dXMsCisJLmFja19pbnRlcnJ1cHQgID0gJnZzYzg1eHhfYWNrX2ludGVycnVwdCwKKwkuY29uZmlnX2ludHIgICAgPSAmdnNjODV4eF9jb25maWdfaW50ciwKKwkuc3VzcGVuZAk9ICZnZW5waHlfc3VzcGVuZCwKKwkucmVzdW1lCQk9ICZnZW5waHlfcmVzdW1lLAorCS5wcm9iZSAgICAgICAgICA9ICZ2c2M4NXh4X3Byb2JlLAorfSwKK3sKKwkucGh5X2lkCQk9IFBIWV9JRF9WU0M4NTQxLAorCS5uYW1lCQk9ICJNaWNyb3NlbWkgVlNDODU0MSBTeW5jRSIsCisJLnBoeV9pZF9tYXNrICAgID0gMHhmZmZmZmZmMCwKKwkuZmVhdHVyZXMJPSBQSFlfR0JJVF9GRUFUVVJFUywKKwkuZmxhZ3MJCT0gUEhZX0hBU19JTlRFUlJVUFQsCisJLnNvZnRfcmVzZXQJPSAmZ2VucGh5X3NvZnRfcmVzZXQsCisJLmNvbmZpZ19pbml0ICAgID0gJnZzYzg1eHhfY29uZmlnX2luaXQsCisJLmNvbmZpZ19hbmVnICAgID0gJmdlbnBoeV9jb25maWdfYW5lZywKKwkuYW5lZ19kb25lCT0gJmdlbnBoeV9hbmVnX2RvbmUsCisJLnJlYWRfc3RhdHVzICAgID0gJmdlbnBoeV9yZWFkX3N0YXR1cywKKwkuYWNrX2ludGVycnVwdCAgPSAmdnNjODV4eF9hY2tfaW50ZXJydXB0LAorCS5jb25maWdfaW50ciAgICA9ICZ2c2M4NXh4X2NvbmZpZ19pbnRyLAorCS5zdXNwZW5kCT0gJmdlbnBoeV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gJmdlbnBoeV9yZXN1bWUsCisJLnByb2JlICAgICAgICAgID0gJnZzYzg1eHhfcHJvYmUsCit9CisKK307CisKK21vZHVsZV9waHlfZHJpdmVyKHZzYzg1eHhfZHJpdmVyKTsKKworc3RhdGljIHN0cnVjdCBtZGlvX2RldmljZV9pZCBfX21heWJlX3VudXNlZCB2c2M4NXh4X3RibFtdID0geworCXsgUEhZX0lEX1ZTQzg1MzEsIDB4ZmZmZmZmZjAsIH0sCisJeyBQSFlfSURfVlNDODU0MSwgMHhmZmZmZmZmMCwgfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUobWRpbywgdnNjODV4eF90YmwpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk1pY3Jvc2VtaSBWU0M4NXh4IFBIWSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk5hZ2FyYWp1IExha2thcmFqdSIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTUlUL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3BoeS5jIGIvZHJpdmVycy9uZXQvcGh5L3BoeS5jCmluZGV4IGM1ZGMyYzM2Li5jNmY2NjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L3BoeS5jCkBAIC03MjIsOCArNzIyLDEwIEBACiBpbnQgcGh5X3N0YXJ0X2ludGVycnVwdHMoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKIAlhdG9taWNfc2V0KCZwaHlkZXYtPmlycV9kaXNhYmxlLCAwKTsKLQlpZiAocmVxdWVzdF9pcnEocGh5ZGV2LT5pcnEsIHBoeV9pbnRlcnJ1cHQsIDAsICJwaHlfaW50ZXJydXB0IiwKLQkJCXBoeWRldikgPCAwKSB7CisJaWYgKHJlcXVlc3RfaXJxKHBoeWRldi0+aXJxLCBwaHlfaW50ZXJydXB0LAorCQkJCUlSUUZfU0hBUkVELAorCQkJCSJwaHlfaW50ZXJydXB0IiwKKwkJCQlwaHlkZXYpIDwgMCkgewogCQlwcl93YXJuKCIlczogQ2FuJ3QgZ2V0IElSUSAlZCAoUEhZKVxuIiwKIAkJCXBoeWRldi0+bWRpby5idXMtPm5hbWUsIHBoeWRldi0+aXJxKTsKIAkJcGh5ZGV2LT5pcnEgPSBQSFlfUE9MTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS94aWxpbnhfZ21paTJyZ21paS5jIGIvZHJpdmVycy9uZXQvcGh5L3hpbGlueF9nbWlpMnJnbWlpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1ZGQzOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BoeS94aWxpbnhfZ21paTJyZ21paS5jCkBAIC0wLDAgKzEsMTEyIEBACisvKiBYaWxpbnggR01JSTJSR01JSSBDb252ZXJ0ZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFhpbGlueCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFuZHJldyBMdW5uIDxhbmRyZXdAbHVubi5jaD4KKyAqCisgKiBBdXRob3I6IEFuZHJldyBMdW5uIDxhbmRyZXdAbHVubi5jaD4KKyAqIEF1dGhvcjogS2VkYXJlc3dhcmEgcmFvIEFwcGFuYSA8YXBwYW5hZEB4aWxpbnguY29tPgorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBkcml2ZXIgaXMgZGV2ZWxvcGVkIGZvciBYaWxpbnggR01JSTJSR01JSSBDb252ZXJ0ZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tZGlvLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbWRpby5oPgorCisjZGVmaW5lIFhJTElOWF9HTUlJMlJHTUlJX1JFRwkJMHgxMAorI2RlZmluZSBYSUxJTlhfR01JSTJSR01JSV9TUEVFRF9NQVNLCShCTUNSX1NQRUVEMTAwMCB8IEJNQ1JfU1BFRUQxMDApCisKK3N0cnVjdCBnbWlpMnJnbWlpIHsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldjsKKwlzdHJ1Y3QgcGh5X2RyaXZlciAqcGh5X2RydjsKKwlzdHJ1Y3QgcGh5X2RyaXZlciBjb252X3BoeV9kcnY7CisJaW50IGFkZHI7Cit9OworCitzdGF0aWMgaW50IHhnbWlpdG9yZ21paV9yZWFkX3N0YXR1cyhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCXN0cnVjdCBnbWlpMnJnbWlpICpwcml2ID0gcGh5ZGV2LT5wcml2OworCXUxNiB2YWwgPSAwOworCisJcHJpdi0+cGh5X2Rydi0+cmVhZF9zdGF0dXMocGh5ZGV2KTsKKworCXZhbCA9IG1kaW9idXNfcmVhZChwaHlkZXYtPm1kaW8uYnVzLCBwcml2LT5hZGRyLCBYSUxJTlhfR01JSTJSR01JSV9SRUcpOworCXZhbCAmPSBYSUxJTlhfR01JSTJSR01JSV9TUEVFRF9NQVNLOworCisJaWYgKHBoeWRldi0+c3BlZWQgPT0gU1BFRURfMTAwMCkKKwkJdmFsIHw9IEJNQ1JfU1BFRUQxMDAwOworCWVsc2UgaWYgKHBoeWRldi0+c3BlZWQgPT0gU1BFRURfMTAwKQorCQl2YWwgfD0gQk1DUl9TUEVFRDEwMDsKKwllbHNlCisJCXZhbCB8PSBCTUNSX1NQRUVEMTA7CisKKwltZGlvYnVzX3dyaXRlKHBoeWRldi0+bWRpby5idXMsIHByaXYtPmFkZHIsIFhJTElOWF9HTUlJMlJHTUlJX1JFRywgdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhnbWlpdG9yZ21paV9wcm9iZShzdHJ1Y3QgbWRpb19kZXZpY2UgKm1kaW9kZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJm1kaW9kZXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlLCAqcGh5X25vZGU7CisJc3RydWN0IGdtaWkycmdtaWkgKnByaXY7CisKKwlwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBoeV9ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgInBoeS1oYW5kbGUiLCAwKTsKKwlpZiAoIXBoeV9ub2RlKSB7CisJCWRldl9lcnIoZGV2LCAiQ291bGRuJ3QgcGFyc2UgcGh5LWhhbmRsZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXByaXYtPnBoeV9kZXYgPSBvZl9waHlfZmluZF9kZXZpY2UocGh5X25vZGUpOworCW9mX25vZGVfcHV0KHBoeV9ub2RlKTsKKwlpZiAoIXByaXYtPnBoeV9kZXYpIHsKKwkJZGV2X2luZm8oZGV2LCAiQ291bGRuJ3QgZmluZCBwaHlkZXZcbiIpOworCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwl9CisKKwlwcml2LT5hZGRyID0gbWRpb2Rldi0+YWRkcjsKKwlwcml2LT5waHlfZHJ2ID0gcHJpdi0+cGh5X2Rldi0+ZHJ2OworCW1lbWNweSgmcHJpdi0+Y29udl9waHlfZHJ2LCBwcml2LT5waHlfZGV2LT5kcnYsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgcGh5X2RyaXZlcikpOworCXByaXYtPmNvbnZfcGh5X2Rydi5yZWFkX3N0YXR1cyA9IHhnbWlpdG9yZ21paV9yZWFkX3N0YXR1czsKKwlwcml2LT5waHlfZGV2LT5wcml2ID0gcHJpdjsKKwlwcml2LT5waHlfZGV2LT5kcnYgPSAmcHJpdi0+Y29udl9waHlfZHJ2OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHhnbWlpdG9yZ21paV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAieGxueCxnbWlpLXRvLXJnbWlpLTEuMCIgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB4Z21paXRvcmdtaWlfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IG1kaW9fZHJpdmVyIHhnbWlpdG9yZ21paV9kcml2ZXIgPSB7CisJLnByb2JlCT0geGdtaWl0b3JnbWlpX3Byb2JlLAorCS5tZGlvZHJ2LmRyaXZlciA9IHsKKwkJLm5hbWUgPSAieGdtaWl0b3JnbWlpIiwKKwkJLm9mX21hdGNoX3RhYmxlID0geGdtaWl0b3JnbWlpX29mX21hdGNoLAorCX0sCit9OworCittZGlvX21vZHVsZV9kcml2ZXIoeGdtaWl0b3JnbWlpX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiWGlsaW54IEdNSUkyUkdNSUkgY29udmVydGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwL3BwcF9nZW5lcmljLmMgYi9kcml2ZXJzL25ldC9wcHAvcHBwX2dlbmVyaWMuYwppbmRleCBmMjI2ZGI0Li41NDg5YzBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHAvcHBwX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL25ldC9wcHAvcHBwX2dlbmVyaWMuYwpAQCAtMTEwMyw2ICsxMTAzLDE1IEBACiAJfQogCiAJY29uZi5maWxlID0gZmlsZTsKKworCS8qIERvbid0IHVzZSBkZXZpY2UgbmFtZSBnZW5lcmF0ZWQgYnkgdGhlIHJ0bmV0bGluayBsYXllciB3aGVuIGlmbmFtZQorCSAqIGlzbid0IHNwZWNpZmllZC4gTGV0IHBwcF9kZXZfY29uZmlndXJlKCkgc2V0IHRoZSBkZXZpY2UgbmFtZSB1c2luZworCSAqIHRoZSBQUFAgdW5pdCBpZGVudGlmZXIgYXMgc3VmZml4IChpLmUuIHBwcDx1bml0X2lkPikuIFRoaXMgYWxsb3dzCisJICogdXNlcnNwYWNlIHRvIGluZmVyIHRoZSBkZXZpY2UgbmFtZSB1c2luZyB0byB0aGUgUFBQSU9DR1VOSVQgaW9jdGwuCisJICovCisJaWYgKCF0YltJRkxBX0lGTkFNRV0pCisJCWNvbmYuaWZuYW1lX2lzX3NldCA9IGZhbHNlOworCiAJZXJyID0gcHBwX2Rldl9jb25maWd1cmUoc3JjX25ldCwgZGV2LCAmY29uZik7CiAKIG91dF91bmxvY2s6CkBAIC0xMzU0LDYgKzEzNjMsOCBAQAogCWRldi0+bmV0ZGV2X29wcyA9ICZwcHBfbmV0ZGV2X29wczsKIAlTRVRfTkVUREVWX0RFVlRZUEUoZGV2LCAmcHBwX3R5cGUpOwogCisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xMVFg7CisKIAlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IFBQUF9IRFJMRU47CiAJZGV2LT5tdHUgPSBQUFBfTVJVOwogCWRldi0+YWRkcl9sZW4gPSAwOwpAQCAtMTM2NywxMiArMTM3OCw4IEBACiAgKiBUcmFuc21pdC1zaWRlIHJvdXRpbmVzLgogICovCiAKLS8qCi0gKiBDYWxsZWQgdG8gZG8gYW55IHdvcmsgcXVldWVkIHVwIG9uIHRoZSB0cmFuc21pdCBzaWRlCi0gKiB0aGF0IGNhbiBub3cgYmUgZG9uZS4KLSAqLwotc3RhdGljIHZvaWQKLXBwcF94bWl0X3Byb2Nlc3Moc3RydWN0IHBwcCAqcHBwKQorLyogQ2FsbGVkIHRvIGRvIGFueSB3b3JrIHF1ZXVlZCB1cCBvbiB0aGUgdHJhbnNtaXQgc2lkZSB0aGF0IGNhbiBub3cgYmUgZG9uZSAqLworc3RhdGljIHZvaWQgX19wcHBfeG1pdF9wcm9jZXNzKHN0cnVjdCBwcHAgKnBwcCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCkBAIC0xMzkyLDYgKzEzOTksMzAgQEAKIAlwcHBfeG1pdF91bmxvY2socHBwKTsKIH0KIAorc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgcHBwX3htaXRfcmVjdXJzaW9uKTsKKworc3RhdGljIHZvaWQgcHBwX3htaXRfcHJvY2VzcyhzdHJ1Y3QgcHBwICpwcHApCit7CisJbG9jYWxfYmhfZGlzYWJsZSgpOworCisJaWYgKHVubGlrZWx5KF9fdGhpc19jcHVfcmVhZChwcHBfeG1pdF9yZWN1cnNpb24pKSkKKwkJZ290byBlcnI7CisKKwlfX3RoaXNfY3B1X2luYyhwcHBfeG1pdF9yZWN1cnNpb24pOworCV9fcHBwX3htaXRfcHJvY2VzcyhwcHApOworCV9fdGhpc19jcHVfZGVjKHBwcF94bWl0X3JlY3Vyc2lvbik7CisKKwlsb2NhbF9iaF9lbmFibGUoKTsKKworCXJldHVybjsKKworZXJyOgorCWxvY2FsX2JoX2VuYWJsZSgpOworCisJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJbmV0ZGV2X2VycihwcHAtPmRldiwgInJlY3Vyc2lvbiBkZXRlY3RlZFxuIik7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgogcGFkX2NvbXByZXNzX3NrYihzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0xODQ3LDExICsxODc4LDggQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfUFBQX01VTFRJTElOSyAqLwogCi0vKgotICogVHJ5IHRvIHNlbmQgZGF0YSBvdXQgb24gYSBjaGFubmVsLgotICovCi1zdGF0aWMgdm9pZAotcHBwX2NoYW5uZWxfcHVzaChzdHJ1Y3QgY2hhbm5lbCAqcGNoKQorLyogVHJ5IHRvIHNlbmQgZGF0YSBvdXQgb24gYSBjaGFubmVsICovCitzdGF0aWMgdm9pZCBfX3BwcF9jaGFubmVsX3B1c2goc3RydWN0IGNoYW5uZWwgKnBjaCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBwcHAgKnBwcDsKQEAgLTE4NzYsMTEgKzE5MDQsMjIgQEAKIAkJcmVhZF9sb2NrX2JoKCZwY2gtPnVwbCk7CiAJCXBwcCA9IHBjaC0+cHBwOwogCQlpZiAocHBwKQotCQkJcHBwX3htaXRfcHJvY2VzcyhwcHApOworCQkJX19wcHBfeG1pdF9wcm9jZXNzKHBwcCk7CiAJCXJlYWRfdW5sb2NrX2JoKCZwY2gtPnVwbCk7CiAJfQogfQogCitzdGF0aWMgdm9pZCBwcHBfY2hhbm5lbF9wdXNoKHN0cnVjdCBjaGFubmVsICpwY2gpCit7CisJbG9jYWxfYmhfZGlzYWJsZSgpOworCisJX190aGlzX2NwdV9pbmMocHBwX3htaXRfcmVjdXJzaW9uKTsKKwlfX3BwcF9jaGFubmVsX3B1c2gocGNoKTsKKwlfX3RoaXNfY3B1X2RlYyhwcHBfeG1pdF9yZWN1cnNpb24pOworCisJbG9jYWxfYmhfZW5hYmxlKCk7Cit9CisKIC8qCiAgKiBSZWNlaXZlLXNpZGUgcm91dGluZXMuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcC9wcHRwLmMgYi9kcml2ZXJzL25ldC9wcHAvcHB0cC5jCmluZGV4IGFlMDkwNWUuLjE5NTFiMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcC9wcHRwLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwL3BwdHAuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPG5ldC9pY21wLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L2dyZS5oPgorI2luY2x1ZGUgPG5ldC9wcHRwLmg+CiAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKQEAgLTUzLDQxICs1NCw2IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHBwcF9jaGFubmVsX29wcyBwcHRwX2NoYW5fb3BzOwogc3RhdGljIGNvbnN0IHN0cnVjdCBwcm90b19vcHMgcHB0cF9vcHM7CiAKLSNkZWZpbmUgUFBQX0xDUF9FQ0hPUkVRIDB4MDkKLSNkZWZpbmUgUFBQX0xDUF9FQ0hPUkVQIDB4MEEKLSNkZWZpbmUgU0NfUkNWX0JJVFMJKFNDX1JDVl9CN18xfFNDX1JDVl9CN18wfFNDX1JDVl9PRERQfFNDX1JDVl9FVk5QKQotCi0jZGVmaW5lIE1JU1NJTkdfV0lORE9XIDIwCi0jZGVmaW5lIFdSQVBQRUQoY3Vyc2VxLCBsYXN0c2VxKVwKLQkoKCgoY3Vyc2VxKSAmIDB4ZmZmZmZmMDApID09IDApICYmXAotCSgoKGxhc3RzZXEpICYgMHhmZmZmZmYwMCkgPT0gMHhmZmZmZmYwMCkpCi0KLSNkZWZpbmUgUFBUUF9HUkVfUFJPVE8gIDB4ODgwQgotI2RlZmluZSBQUFRQX0dSRV9WRVIgICAgMHgxCi0KLSNkZWZpbmUgUFBUUF9HUkVfRkxBR19DCTB4ODAKLSNkZWZpbmUgUFBUUF9HUkVfRkxBR19SCTB4NDAKLSNkZWZpbmUgUFBUUF9HUkVfRkxBR19LCTB4MjAKLSNkZWZpbmUgUFBUUF9HUkVfRkxBR19TCTB4MTAKLSNkZWZpbmUgUFBUUF9HUkVfRkxBR19BCTB4ODAKLQotI2RlZmluZSBQUFRQX0dSRV9JU19DKGYpICgoZikmUFBUUF9HUkVfRkxBR19DKQotI2RlZmluZSBQUFRQX0dSRV9JU19SKGYpICgoZikmUFBUUF9HUkVfRkxBR19SKQotI2RlZmluZSBQUFRQX0dSRV9JU19LKGYpICgoZikmUFBUUF9HUkVfRkxBR19LKQotI2RlZmluZSBQUFRQX0dSRV9JU19TKGYpICgoZikmUFBUUF9HUkVfRkxBR19TKQotI2RlZmluZSBQUFRQX0dSRV9JU19BKGYpICgoZikmUFBUUF9HUkVfRkxBR19BKQotCi0jZGVmaW5lIFBQVFBfSEVBREVSX09WRVJIRUFEICgyK3NpemVvZihzdHJ1Y3QgcHB0cF9ncmVfaGVhZGVyKSkKLXN0cnVjdCBwcHRwX2dyZV9oZWFkZXIgewotCXU4ICBmbGFnczsKLQl1OCAgdmVyOwotCV9fYmUxNiBwcm90b2NvbDsKLQlfX2JlMTYgcGF5bG9hZF9sZW47Ci0JX19iZTE2IGNhbGxfaWQ7Ci0JX19iZTMyIHNlcTsKLQlfX2JlMzIgYWNrOwotfSBfX3BhY2tlZDsKLQogc3RhdGljIHN0cnVjdCBwcHBveF9zb2NrICpsb29rdXBfY2hhbih1MTYgY2FsbF9pZCwgX19iZTMyIHNfYWRkcikKIHsKIAlzdHJ1Y3QgcHBwb3hfc29jayAqc29jazsKQEAgLTI0MCwxNiArMjA2LDE0IEBACiAJc2tiX3B1c2goc2tiLCBoZWFkZXJfbGVuKTsKIAloZHIgPSAoc3RydWN0IHBwdHBfZ3JlX2hlYWRlciAqKShza2ItPmRhdGEpOwogCi0JaGRyLT5mbGFncyAgICAgICA9IFBQVFBfR1JFX0ZMQUdfSzsKLQloZHItPnZlciAgICAgICAgID0gUFBUUF9HUkVfVkVSOwotCWhkci0+cHJvdG9jb2wgICAgPSBodG9ucyhQUFRQX0dSRV9QUk9UTyk7Ci0JaGRyLT5jYWxsX2lkICAgICA9IGh0b25zKG9wdC0+ZHN0X2FkZHIuY2FsbF9pZCk7CisJaGRyLT5ncmVfaGQuZmxhZ3MgPSBHUkVfS0VZIHwgR1JFX1ZFUlNJT05fMSB8IEdSRV9TRVE7CisJaGRyLT5ncmVfaGQucHJvdG9jb2wgPSBHUkVfUFJPVE9fUFBQOworCWhkci0+Y2FsbF9pZCA9IGh0b25zKG9wdC0+ZHN0X2FkZHIuY2FsbF9pZCk7CiAKLQloZHItPmZsYWdzICAgICAgfD0gUFBUUF9HUkVfRkxBR19TOwotCWhkci0+c2VxICAgICAgICAgPSBodG9ubCgrK29wdC0+c2VxX3NlbnQpOworCWhkci0+c2VxID0gaHRvbmwoKytvcHQtPnNlcV9zZW50KTsKIAlpZiAob3B0LT5hY2tfc2VudCAhPSBzZXFfcmVjdikJewogCQkvKiBzZW5kIGFjayB3aXRoIHRoaXMgbWVzc2FnZSAqLwotCQloZHItPnZlciB8PSBQUFRQX0dSRV9GTEFHX0E7CisJCWhkci0+Z3JlX2hkLmZsYWdzIHw9IEdSRV9BQ0s7CiAJCWhkci0+YWNrICA9IGh0b25sKHNlcV9yZWN2KTsKIAkJb3B0LT5hY2tfc2VudCA9IHNlcV9yZWN2OwogCX0KQEAgLTMxMiw3ICsyNzYsNyBAQAogCWhlYWRlcnNpemUgID0gc2l6ZW9mKCpoZWFkZXIpOwogCiAJLyogdGVzdCBpZiBhY2tub3dsZWRnZW1lbnQgcHJlc2VudCAqLwotCWlmIChQUFRQX0dSRV9JU19BKGhlYWRlci0+dmVyKSkgeworCWlmIChHUkVfSVNfQUNLKGhlYWRlci0+Z3JlX2hkLmZsYWdzKSkgewogCQlfX3UzMiBhY2s7CiAKIAkJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgaGVhZGVyc2l6ZSkpCkBAIC0zMjAsNyArMjg0LDcgQEAKIAkJaGVhZGVyID0gKHN0cnVjdCBwcHRwX2dyZV9oZWFkZXIgKikoc2tiLT5kYXRhKTsKIAogCQkvKiBhY2sgaW4gZGlmZmVyZW50IHBsYWNlIGlmIFMgPSAwICovCi0JCWFjayA9IFBQVFBfR1JFX0lTX1MoaGVhZGVyLT5mbGFncykgPyBoZWFkZXItPmFjayA6IGhlYWRlci0+c2VxOworCQlhY2sgPSBHUkVfSVNfU0VRKGhlYWRlci0+Z3JlX2hkLmZsYWdzKSA/IGhlYWRlci0+YWNrIDogaGVhZGVyLT5zZXE7CiAKIAkJYWNrID0gbnRvaGwoYWNrKTsKIApAQCAtMzMzLDcgKzI5Nyw3IEBACiAJCWhlYWRlcnNpemUgLT0gc2l6ZW9mKGhlYWRlci0+YWNrKTsKIAl9CiAJLyogdGVzdCBpZiBwYXlsb2FkIHByZXNlbnQgKi8KLQlpZiAoIVBQVFBfR1JFX0lTX1MoaGVhZGVyLT5mbGFncykpCisJaWYgKCFHUkVfSVNfU0VRKGhlYWRlci0+Z3JlX2hkLmZsYWdzKSkKIAkJZ290byBkcm9wOwogCiAJcGF5bG9hZF9sZW4gPSBudG9ocyhoZWFkZXItPnBheWxvYWRfbGVuKTsKQEAgLTM5NCwxMSArMzU4LDExIEBACiAKIAloZWFkZXIgPSAoc3RydWN0IHBwdHBfZ3JlX2hlYWRlciAqKXNrYi0+ZGF0YTsKIAotCWlmIChudG9ocyhoZWFkZXItPnByb3RvY29sKSAhPSBQUFRQX0dSRV9QUk9UTyB8fCAvKiBQUFRQLUdSRSBwcm90b2NvbCBmb3IgUFBUUCAqLwotCQlQUFRQX0dSRV9JU19DKGhlYWRlci0+ZmxhZ3MpIHx8ICAgICAgICAgICAgICAgIC8qIGZsYWcgQyBzaG91bGQgYmUgY2xlYXIgKi8KLQkJUFBUUF9HUkVfSVNfUihoZWFkZXItPmZsYWdzKSB8fCAgICAgICAgICAgICAgICAvKiBmbGFnIFIgc2hvdWxkIGJlIGNsZWFyICovCi0JCSFQUFRQX0dSRV9JU19LKGhlYWRlci0+ZmxhZ3MpIHx8ICAgICAgICAgICAgICAgLyogZmxhZyBLIHNob3VsZCBiZSBzZXQgKi8KLQkJKGhlYWRlci0+ZmxhZ3MmMHhGKSAhPSAwKSAgICAgICAgICAgICAgICAgICAgICAvKiByb3V0aW5nIGFuZCByZWN1cnNpb24gY3RybCA9IDAgKi8KKwlpZiAoaGVhZGVyLT5ncmVfaGQucHJvdG9jb2wgIT0gR1JFX1BST1RPX1BQUCB8fCAvKiBQUFRQLUdSRSBwcm90b2NvbCBmb3IgUFBUUCAqLworCQlHUkVfSVNfQ1NVTShoZWFkZXItPmdyZV9oZC5mbGFncykgfHwgICAgLyogZmxhZyBDU1VNIHNob3VsZCBiZSBjbGVhciAqLworCQlHUkVfSVNfUk9VVElORyhoZWFkZXItPmdyZV9oZC5mbGFncykgfHwgLyogZmxhZyBST1VUSU5HIHNob3VsZCBiZSBjbGVhciAqLworCQkhR1JFX0lTX0tFWShoZWFkZXItPmdyZV9oZC5mbGFncykgfHwgICAgLyogZmxhZyBLRVkgc2hvdWxkIGJlIHNldCAqLworCQkoaGVhZGVyLT5ncmVfaGQuZmxhZ3MgJiBHUkVfRkxBR1MpKSAgICAgLyogZmxhZyBSZWN1cnNpb24gQ3RybCBzaG91bGQgYmUgY2xlYXIgKi8KIAkJLyogaWYgaW52YWxpZCwgZGlzY2FyZCB0aGlzIHBhY2tldCAqLwogCQlnb3RvIGRyb3A7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RlYW0vdGVhbV9tb2RlX2xvYWRiYWxhbmNlLmMgYi9kcml2ZXJzL25ldC90ZWFtL3RlYW1fbW9kZV9sb2FkYmFsYW5jZS5jCmluZGV4IGNkYjE5YjMuLmIyMjhiZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RlYW0vdGVhbV9tb2RlX2xvYWRiYWxhbmNlLmMKKysrIGIvZHJpdmVycy9uZXQvdGVhbS90ZWFtX21vZGVfbG9hZGJhbGFuY2UuYwpAQCAtMTQsOSArMTQsMjMgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3RlYW0uaD4KIAorc3RhdGljIHJ4X2hhbmRsZXJfcmVzdWx0X3QgbGJfcmVjZWl2ZShzdHJ1Y3QgdGVhbSAqdGVhbSwgc3RydWN0IHRlYW1fcG9ydCAqcG9ydCwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmICh1bmxpa2VseShza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX1NMT1cpKSkgeworCQkvKiBMQUNQRFUgcGFja2V0cyBzaG91bGQgZ28gdG8gZXhhY3QgZGVsaXZlcnkgKi8KKwkJY29uc3QgdW5zaWduZWQgY2hhciAqZGVzdCA9IGV0aF9oZHIoc2tiKS0+aF9kZXN0OworCisJCWlmIChpc19saW5rX2xvY2FsX2V0aGVyX2FkZHIoZGVzdCkgJiYgZGVzdFs1XSA9PSAweDAyKQorCQkJcmV0dXJuIFJYX0hBTkRMRVJfRVhBQ1Q7CisJfQorCXJldHVybiBSWF9IQU5ETEVSX0FOT1RIRVI7Cit9CisKIHN0cnVjdCBsYl9wcml2OwogCiB0eXBlZGVmIHN0cnVjdCB0ZWFtX3BvcnQgKmxiX3NlbGVjdF90eF9wb3J0X2Z1bmNfdChzdHJ1Y3QgdGVhbSAqLApAQCAtNjUyLDYgKzY2Niw3IEBACiAJLnBvcnRfZW50ZXIJCT0gbGJfcG9ydF9lbnRlciwKIAkucG9ydF9sZWF2ZQkJPSBsYl9wb3J0X2xlYXZlLAogCS5wb3J0X2Rpc2FibGVkCQk9IGxiX3BvcnRfZGlzYWJsZWQsCisJLnJlY2VpdmUJCT0gbGJfcmVjZWl2ZSwKIAkudHJhbnNtaXQJCT0gbGJfdHJhbnNtaXQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dW4uYyBiL2RyaXZlcnMvbmV0L3R1bi5jCmluZGV4IDljOGI1YmMuLjgwOTNlMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bi5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bi5jCkBAIC03MzEsMTQgKzczMSw5IEBACiAJfQogCiAJYWxlbiA9IEVUSF9BTEVOICogdWYuY291bnQ7Ci0JYWRkciA9IGttYWxsb2MoYWxlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhZGRyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcihhZGRyLCBhcmcgKyBzaXplb2YodWYpLCBhbGVuKSkgewotCQllcnIgPSAtRUZBVUxUOwotCQlnb3RvIGRvbmU7Ci0JfQorCWFkZHIgPSBtZW1kdXBfdXNlcihhcmcgKyBzaXplb2YodWYpLCBhbGVuKTsKKwlpZiAoSVNfRVJSKGFkZHIpKQorCQlyZXR1cm4gUFRSX0VSUihhZGRyKTsKIAogCS8qIFRoZSBmaWx0ZXIgaXMgdXBkYXRlZCB3aXRob3V0IGhvbGRpbmcgYW55IGxvY2tzLiBXaGljaCBpcwogCSAqIHBlcmZlY3RseSBzYWZlLiBXZSBkaXNhYmxlIGl0IGZpcnN0IGFuZCBpbiB0aGUgd29yc3QKQEAgLTc1OCw3ICs3NTMsNyBAQAogCWZvciAoOyBuIDwgdWYuY291bnQ7IG4rKykgewogCQlpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGFkZHJbbl0udSkpIHsKIAkJCWVyciA9IDA7IC8qIG5vIGZpbHRlciAqLwotCQkJZ290byBkb25lOworCQkJZ290byBmcmVlX2FkZHI7CiAJCX0KIAkJYWRkcl9oYXNoX3NldChmaWx0ZXItPm1hc2ssIGFkZHJbbl0udSk7CiAJfQpAQCAtNzc0LDggKzc2OSw3IEBACiAKIAkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBleGFjdCBmaWx0ZXJzICovCiAJZXJyID0gbmV4YWN0OwotCi1kb25lOgorZnJlZV9hZGRyOgogCWtmcmVlKGFkZHIpOwogCXJldHVybiBlcnI7CiB9CkBAIC04OTQsMTEgKzg4OCw3IEBACiAJaWYgKHVubGlrZWx5KHNrYl9vcnBoYW5fZnJhZ3Moc2tiLCBHRlBfQVRPTUlDKSkpCiAJCWdvdG8gZHJvcDsKIAotCWlmIChza2ItPnNrICYmIHNrX2Z1bGxzb2NrKHNrYi0+c2spKSB7Ci0JCXNvY2tfdHhfdGltZXN0YW1wKHNrYi0+c2ssIHNrYi0+c2stPnNrX3RzZmxhZ3MsCi0JCQkJICAmc2tiX3NoaW5mbyhza2IpLT50eF9mbGFncyk7Ci0JCXN3X3R4X3RpbWVzdGFtcChza2IpOwotCX0KKwlza2JfdHhfdGltZXN0YW1wKHNrYik7CiAKIAkvKiBPcnBoYW4gdGhlIHNrYiAtIHJlcXVpcmVkIGFzIHdlIG1pZ2h0IGhhbmcgb24gdG8gaXQKIAkgKiBmb3IgaW5kZWZpbml0ZSB0aW1lLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2FzaXguaCBiL2RyaXZlcnMvbmV0L3VzYi9hc2l4LmgKaW5kZXggYTJkM2VhNi4uZDEwOTI0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2FzaXguaAorKysgYi9kcml2ZXJzL25ldC91c2IvYXNpeC5oCkBAIC00Niw2ICs0Niw3IEBACiAjZGVmaW5lIEFYX0NNRF9TRVRfU1dfTUlJCQkweDA2CiAjZGVmaW5lIEFYX0NNRF9SRUFEX01JSV9SRUcJCTB4MDcKICNkZWZpbmUgQVhfQ01EX1dSSVRFX01JSV9SRUcJCTB4MDgKKyNkZWZpbmUgQVhfQ01EX1NUQVRNTkdTVFNfUkVHCQkweDA5CiAjZGVmaW5lIEFYX0NNRF9TRVRfSFdfTUlJCQkweDBhCiAjZGVmaW5lIEFYX0NNRF9SRUFEX0VFUFJPTQkJMHgwYgogI2RlZmluZSBBWF9DTURfV1JJVEVfRUVQUk9NCQkweDBjCkBAIC03MSw2ICs3MiwxNyBAQAogI2RlZmluZSBBWF9DTURfU1dfUkVTRVQJCQkweDIwCiAjZGVmaW5lIEFYX0NNRF9TV19QSFlfU1RBVFVTCQkweDIxCiAjZGVmaW5lIEFYX0NNRF9TV19QSFlfU0VMRUNUCQkweDIyCisjZGVmaW5lIEFYX1FDVENUUkwJCQkweDJBCisKKyNkZWZpbmUgQVhfQ0hJUENPREVfTUFTSwkJMHg3MAorI2RlZmluZSBBWF9BWDg4NzcyX0NISVBDT0RFCQkweDAwCisjZGVmaW5lIEFYX0FYODg3NzJBX0NISVBDT0RFCQkweDEwCisjZGVmaW5lIEFYX0FYODg3NzJCX0NISVBDT0RFCQkweDIwCisjZGVmaW5lIEFYX0hPU1RfRU4JCQkweDAxCisKKyNkZWZpbmUgQVhfUEhZU0VMX1BTRUwJCQkweDAxCisjZGVmaW5lIEFYX1BIWVNFTF9TU01JSQkJCTAKKyNkZWZpbmUgQVhfUEhZU0VMX1NTRU4JCQkweDEwCiAKICNkZWZpbmUgQVhfUEhZX1NFTEVDVF9NQVNLCQkoQklUKDMpIHwgQklUKDIpKQogI2RlZmluZSBBWF9QSFlfU0VMRUNUX0lOVEVSTkFMCQkwCkBAIC0xNzMsNiArMTg1LDEwIEBACiB9OwogCiBzdHJ1Y3QgYXNpeF9jb21tb25fcHJpdmF0ZSB7CisJdm9pZCAoKnJlc3VtZSkoc3RydWN0IHVzYm5ldCAqZGV2KTsKKwl2b2lkICgqc3VzcGVuZCkoc3RydWN0IHVzYm5ldCAqZGV2KTsKKwl1MTYgcHJlc3ZkX3BoeV9hZHZlcnRpc2U7CisJdTE2IHByZXN2ZF9waHlfYm1jcjsKIAlzdHJ1Y3QgYXNpeF9yeF9maXh1cF9pbmZvIHJ4X2ZpeHVwX2luZm87CiB9OwogCkBAIC0xODIsMTAgKzE5OCwxMCBAQAogI2RlZmluZSBGTEFHX0VFUFJPTV9NQUMJCSgxVUwgPDwgMCkgIC8qIGluaXQgZGV2aWNlIE1BQyBmcm9tIGVlcHJvbSAqLwogCiBpbnQgYXNpeF9yZWFkX2NtZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGNtZCwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsCi0JCSAgdTE2IHNpemUsIHZvaWQgKmRhdGEpOworCQkgIHUxNiBzaXplLCB2b2lkICpkYXRhLCBpbnQgaW5fcG0pOwogCiBpbnQgYXNpeF93cml0ZV9jbWQoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCBjbWQsIHUxNiB2YWx1ZSwgdTE2IGluZGV4LAotCQkgICB1MTYgc2l6ZSwgdm9pZCAqZGF0YSk7CisJCSAgIHUxNiBzaXplLCB2b2lkICpkYXRhLCBpbnQgaW5fcG0pOwogCiB2b2lkIGFzaXhfd3JpdGVfY21kX2FzeW5jKHN0cnVjdCB1c2JuZXQgKmRldiwgdTggY21kLCB1MTYgdmFsdWUsCiAJCQkgIHUxNiBpbmRleCwgdTE2IHNpemUsIHZvaWQgKmRhdGEpOwpAQCAtMTk3LDI3ICsyMTMsMzEgQEAKIHN0cnVjdCBza19idWZmICphc2l4X3R4X2ZpeHVwKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIGdmcF90IGZsYWdzKTsKIAotaW50IGFzaXhfc2V0X3N3X21paShzdHJ1Y3QgdXNibmV0ICpkZXYpOwotaW50IGFzaXhfc2V0X2h3X21paShzdHJ1Y3QgdXNibmV0ICpkZXYpOworaW50IGFzaXhfc2V0X3N3X21paShzdHJ1Y3QgdXNibmV0ICpkZXYsIGludCBpbl9wbSk7CitpbnQgYXNpeF9zZXRfaHdfbWlpKHN0cnVjdCB1c2JuZXQgKmRldiwgaW50IGluX3BtKTsKIAogaW50IGFzaXhfcmVhZF9waHlfYWRkcihzdHJ1Y3QgdXNibmV0ICpkZXYsIGludCBpbnRlcm5hbCk7CiBpbnQgYXNpeF9nZXRfcGh5X2FkZHIoc3RydWN0IHVzYm5ldCAqZGV2KTsKIAotaW50IGFzaXhfc3dfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCBmbGFncyk7CitpbnQgYXNpeF9zd19yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGZsYWdzLCBpbnQgaW5fcG0pOwogCi11MTYgYXNpeF9yZWFkX3J4X2N0bChzdHJ1Y3QgdXNibmV0ICpkZXYpOwotaW50IGFzaXhfd3JpdGVfcnhfY3RsKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IG1vZGUpOwordTE2IGFzaXhfcmVhZF9yeF9jdGwoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgaW5fcG0pOworaW50IGFzaXhfd3JpdGVfcnhfY3RsKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IG1vZGUsIGludCBpbl9wbSk7CiAKLXUxNiBhc2l4X3JlYWRfbWVkaXVtX3N0YXR1cyhzdHJ1Y3QgdXNibmV0ICpkZXYpOwotaW50IGFzaXhfd3JpdGVfbWVkaXVtX21vZGUoc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgbW9kZSk7Cit1MTYgYXNpeF9yZWFkX21lZGl1bV9zdGF0dXMoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgaW5fcG0pOworaW50IGFzaXhfd3JpdGVfbWVkaXVtX21vZGUoc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgbW9kZSwgaW50IGluX3BtKTsKIAotaW50IGFzaXhfd3JpdGVfZ3BpbyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiB2YWx1ZSwgaW50IHNsZWVwKTsKK2ludCBhc2l4X3dyaXRlX2dwaW8oc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgdmFsdWUsIGludCBzbGVlcCwgaW50IGluX3BtKTsKIAogdm9pZCBhc2l4X3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCk7CiAKIGludCBhc2l4X21kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jKTsKIHZvaWQgYXNpeF9tZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwaHlfaWQsIGludCBsb2MsIGludCB2YWwpOwogCitpbnQgYXNpeF9tZGlvX3JlYWRfbm9wbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jKTsKK3ZvaWQgYXNpeF9tZGlvX3dyaXRlX25vcG0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IGxvYywKKwkJCSAgaW50IHZhbCk7CisKIHZvaWQgYXNpeF9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbGluZm8pOwogaW50IGFzaXhfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2xpbmZvKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2FzaXhfY29tbW9uLmMgYi9kcml2ZXJzL25ldC91c2IvYXNpeF9jb21tb24uYwppbmRleCA3ZGU1YWI1Li5mNzllYjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvYXNpeF9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC91c2IvYXNpeF9jb21tb24uYwpAQCAtMjIsMjQgKzIyLDQ5IEBACiAjaW5jbHVkZSAiYXNpeC5oIgogCiBpbnQgYXNpeF9yZWFkX2NtZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGNtZCwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsCi0JCSAgdTE2IHNpemUsIHZvaWQgKmRhdGEpCisJCSAgdTE2IHNpemUsIHZvaWQgKmRhdGEsIGludCBpbl9wbSkKIHsKIAlpbnQgcmV0OwotCXJldCA9IHVzYm5ldF9yZWFkX2NtZChkZXYsIGNtZCwKLQkJCSAgICAgICBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKLQkJCSAgICAgICB2YWx1ZSwgaW5kZXgsIGRhdGEsIHNpemUpOworCWludCAoKmZuKShzdHJ1Y3QgdXNibmV0ICosIHU4LCB1OCwgdTE2LCB1MTYsIHZvaWQgKiwgdTE2KTsKIAotCWlmIChyZXQgIT0gc2l6ZSAmJiByZXQgPj0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJQlVHX09OKCFkZXYpOworCisJaWYgKCFpbl9wbSkKKwkJZm4gPSB1c2JuZXRfcmVhZF9jbWQ7CisJZWxzZQorCQlmbiA9IHVzYm5ldF9yZWFkX2NtZF9ub3BtOworCisJcmV0ID0gZm4oZGV2LCBjbWQsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkgdmFsdWUsIGluZGV4LCBkYXRhLCBzaXplKTsKKworCWlmICh1bmxpa2VseShyZXQgPCAwKSkKKwkJbmV0ZGV2X3dhcm4oZGV2LT5uZXQsICJGYWlsZWQgdG8gcmVhZCByZWcgaW5kZXggMHglMDR4OiAlZFxuIiwKKwkJCSAgICBpbmRleCwgcmV0KTsKKwogCXJldHVybiByZXQ7CiB9CiAKIGludCBhc2l4X3dyaXRlX2NtZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGNtZCwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsCi0JCSAgIHUxNiBzaXplLCB2b2lkICpkYXRhKQorCQkgICB1MTYgc2l6ZSwgdm9pZCAqZGF0YSwgaW50IGluX3BtKQogewotCXJldHVybiB1c2JuZXRfd3JpdGVfY21kKGRldiwgY21kLAotCQkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKLQkJCQl2YWx1ZSwgaW5kZXgsIGRhdGEsIHNpemUpOworCWludCByZXQ7CisJaW50ICgqZm4pKHN0cnVjdCB1c2JuZXQgKiwgdTgsIHU4LCB1MTYsIHUxNiwgY29uc3Qgdm9pZCAqLCB1MTYpOworCisJQlVHX09OKCFkZXYpOworCisJaWYgKCFpbl9wbSkKKwkJZm4gPSB1c2JuZXRfd3JpdGVfY21kOworCWVsc2UKKwkJZm4gPSB1c2JuZXRfd3JpdGVfY21kX25vcG07CisKKwlyZXQgPSBmbihkZXYsIGNtZCwgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkgdmFsdWUsIGluZGV4LCBkYXRhLCBzaXplKTsKKworCWlmICh1bmxpa2VseShyZXQgPCAwKSkKKwkJbmV0ZGV2X3dhcm4oZGV2LT5uZXQsICJGYWlsZWQgdG8gd3JpdGUgcmVnIGluZGV4IDB4JTA0eDogJWRcbiIsCisJCQkgICAgaW5kZXgsIHJldCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiB2b2lkIGFzaXhfd3JpdGVfY21kX2FzeW5jKHN0cnVjdCB1c2JuZXQgKmRldiwgdTggY21kLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwKQEAgLTIyNSwxOSArMjUwLDIwIEBACiAJcmV0dXJuIHNrYjsKIH0KIAotaW50IGFzaXhfc2V0X3N3X21paShzdHJ1Y3QgdXNibmV0ICpkZXYpCitpbnQgYXNpeF9zZXRfc3dfbWlpKHN0cnVjdCB1c2JuZXQgKmRldiwgaW50IGluX3BtKQogewogCWludCByZXQ7Ci0JcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU0VUX1NXX01JSSwgMHgwMDAwLCAwLCAwLCBOVUxMKTsKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfU1dfTUlJLCAweDAwMDAsIDAsIDAsIE5VTEwsIGluX3BtKTsKKwogCWlmIChyZXQgPCAwKQogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRmFpbGVkIHRvIGVuYWJsZSBzb2Z0d2FyZSBNSUkgYWNjZXNzXG4iKTsKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXNpeF9zZXRfaHdfbWlpKHN0cnVjdCB1c2JuZXQgKmRldikKK2ludCBhc2l4X3NldF9od19taWkoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgaW5fcG0pCiB7CiAJaW50IHJldDsKLQlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfSFdfTUlJLCAweDAwMDAsIDAsIDAsIE5VTEwpOworCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NFVF9IV19NSUksIDB4MDAwMCwgMCwgMCwgTlVMTCwgaW5fcG0pOwogCWlmIChyZXQgPCAwKQogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRmFpbGVkIHRvIGVuYWJsZSBoYXJkd2FyZSBNSUkgYWNjZXNzXG4iKTsKIAlyZXR1cm4gcmV0OwpAQCAtMjQ3LDcgKzI3Myw3IEBACiB7CiAJaW50IG9mZnNldCA9IChpbnRlcm5hbCA/IDEgOiAwKTsKIAl1OCBidWZbMl07Ci0JaW50IHJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9QSFlfSUQsIDAsIDAsIDIsIGJ1Zik7CisJaW50IHJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9QSFlfSUQsIDAsIDAsIDIsIGJ1ZiwgMCk7CiAKIAluZXRkZXZfZGJnKGRldi0+bmV0LCAiYXNpeF9nZXRfcGh5X2FkZHIoKVxuIik7CiAKQEAgLTI3MCwyMSArMjk2LDIxIEBACiB9CiAKIAotaW50IGFzaXhfc3dfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCBmbGFncykKK2ludCBhc2l4X3N3X3Jlc2V0KHN0cnVjdCB1c2JuZXQgKmRldiwgdTggZmxhZ3MsIGludCBpbl9wbSkKIHsKIAlpbnQgcmV0OwogCi0gICAgICAgIHJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1JFU0VULCBmbGFncywgMCwgMCwgTlVMTCk7CisJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUkVTRVQsIGZsYWdzLCAwLCAwLCBOVUxMLCBpbl9wbSk7CiAJaWYgKHJldCA8IDApCiAJCW5ldGRldl9lcnIoZGV2LT5uZXQsICJGYWlsZWQgdG8gc2VuZCBzb2Z0d2FyZSByZXNldDogJTAyeFxuIiwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXUxNiBhc2l4X3JlYWRfcnhfY3RsKHN0cnVjdCB1c2JuZXQgKmRldikKK3UxNiBhc2l4X3JlYWRfcnhfY3RsKHN0cnVjdCB1c2JuZXQgKmRldiwgaW50IGluX3BtKQogewogCV9fbGUxNiB2OwotCWludCByZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfUlhfQ1RMLCAwLCAwLCAyLCAmdik7CisJaW50IHJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9SWF9DVEwsIDAsIDAsIDIsICZ2LCBpbl9wbSk7CiAKIAlpZiAocmV0IDwgMCkgewogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRXJyb3IgcmVhZGluZyBSWF9DVEwgcmVnaXN0ZXI6ICUwMnhcbiIsIHJldCk7CkBAIC0yOTUsMTIgKzMyMSwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBhc2l4X3dyaXRlX3J4X2N0bChzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiBtb2RlKQoraW50IGFzaXhfd3JpdGVfcnhfY3RsKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IG1vZGUsIGludCBpbl9wbSkKIHsKIAlpbnQgcmV0OwogCiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgImFzaXhfd3JpdGVfcnhfY3RsKCkgLSBtb2RlID0gMHglMDR4XG4iLCBtb2RlKTsKLQlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9SWF9DVEwsIG1vZGUsIDAsIDAsIE5VTEwpOworCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX1JYX0NUTCwgbW9kZSwgMCwgMCwgTlVMTCwgaW5fcG0pOwogCWlmIChyZXQgPCAwKQogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRmFpbGVkIHRvIHdyaXRlIFJYX0NUTCBtb2RlIHRvIDB4JTA0eDogJTAyeFxuIiwKIAkJCSAgIG1vZGUsIHJldCk7CkBAIC0zMDgsMTAgKzMzNCwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXUxNiBhc2l4X3JlYWRfbWVkaXVtX3N0YXR1cyhzdHJ1Y3QgdXNibmV0ICpkZXYpCit1MTYgYXNpeF9yZWFkX21lZGl1bV9zdGF0dXMoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgaW5fcG0pCiB7CiAJX19sZTE2IHY7Ci0JaW50IHJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9NRURJVU1fU1RBVFVTLCAwLCAwLCAyLCAmdik7CisJaW50IHJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9NRURJVU1fU1RBVFVTLAorCQkJCTAsIDAsIDIsICZ2LCBpbl9wbSk7CiAKIAlpZiAocmV0IDwgMCkgewogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRXJyb3IgcmVhZGluZyBNZWRpdW0gU3RhdHVzIHJlZ2lzdGVyOiAlMDJ4XG4iLApAQCAtMzIzLDEyICszNTAsMTMgQEAKIAogfQogCi1pbnQgYXNpeF93cml0ZV9tZWRpdW1fbW9kZShzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiBtb2RlKQoraW50IGFzaXhfd3JpdGVfbWVkaXVtX21vZGUoc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgbW9kZSwgaW50IGluX3BtKQogewogCWludCByZXQ7CiAKIAluZXRkZXZfZGJnKGRldi0+bmV0LCAiYXNpeF93cml0ZV9tZWRpdW1fbW9kZSgpIC0gbW9kZSA9IDB4JTA0eFxuIiwgbW9kZSk7Ci0JcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTUVESVVNX01PREUsIG1vZGUsIDAsIDAsIE5VTEwpOworCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX01FRElVTV9NT0RFLAorCQkJICAgICBtb2RlLCAwLCAwLCBOVUxMLCBpbl9wbSk7CiAJaWYgKHJldCA8IDApCiAJCW5ldGRldl9lcnIoZGV2LT5uZXQsICJGYWlsZWQgdG8gd3JpdGUgTWVkaXVtIE1vZGUgbW9kZSB0byAweCUwNHg6ICUwMnhcbiIsCiAJCQkgICBtb2RlLCByZXQpOwpAQCAtMzM2LDEyICszNjQsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXNpeF93cml0ZV9ncGlvKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IHZhbHVlLCBpbnQgc2xlZXApCitpbnQgYXNpeF93cml0ZV9ncGlvKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IHZhbHVlLCBpbnQgc2xlZXAsIGludCBpbl9wbSkKIHsKIAlpbnQgcmV0OwogCiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgImFzaXhfd3JpdGVfZ3BpbygpIC0gdmFsdWUgPSAweCUwNHhcbiIsIHZhbHVlKTsKLQlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9HUElPUywgdmFsdWUsIDAsIDAsIE5VTEwpOworCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX0dQSU9TLCB2YWx1ZSwgMCwgMCwgTlVMTCwgaW5fcG0pOwogCWlmIChyZXQgPCAwKQogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRmFpbGVkIHRvIHdyaXRlIEdQSU8gdmFsdWUgMHglMDR4OiAlMDJ4XG4iLAogCQkJICAgdmFsdWUsIHJldCk7CkBAIC0zOTgsMTYgKzQyNiwzMSBAQAogewogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJX19sZTE2IHJlczsKKwl1OCBzbXNyOworCWludCBpID0gMDsKKwlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmZGV2LT5waHlfbXV0ZXgpOwotCWFzaXhfc2V0X3N3X21paShkZXYpOworCWRvIHsKKwkJcmV0ID0gYXNpeF9zZXRfc3dfbWlpKGRldiwgMCk7CisJCWlmIChyZXQgPT0gLUVOT0RFVikKKwkJCWJyZWFrOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CisJCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfU1RBVE1OR1NUU19SRUcsCisJCQkJICAgIDAsIDAsIDEsICZzbXNyLCAwKTsKKwl9IHdoaWxlICghKHNtc3IgJiBBWF9IT1NUX0VOKSAmJiAoaSsrIDwgMzApICYmIChyZXQgIT0gLUVOT0RFVikpOworCWlmIChyZXQgPT0gLUVOT0RFVikgeworCQltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAlhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTUlJX1JFRywgcGh5X2lkLAotCQkJCShfX3UxNilsb2MsIDIsICZyZXMpOwotCWFzaXhfc2V0X2h3X21paShkZXYpOworCQkJCShfX3UxNilsb2MsIDIsICZyZXMsIDApOworCWFzaXhfc2V0X2h3X21paShkZXYsIDApOwogCW11dGV4X3VubG9jaygmZGV2LT5waHlfbXV0ZXgpOwogCiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgImFzaXhfbWRpb19yZWFkKCkgcGh5X2lkPTB4JTAyeCwgbG9jPTB4JTAyeCwgcmV0dXJucz0weCUwNHhcbiIsCi0JCSAgIHBoeV9pZCwgbG9jLCBsZTE2X3RvX2NwdShyZXMpKTsKKwkJCXBoeV9pZCwgbG9jLCBsZTE2X3RvX2NwdShyZXMpKTsKIAogCXJldHVybiBsZTE2X3RvX2NwdShyZXMpOwogfQpAQCAtNDE2LDEzICs0NTksOTUgQEAKIHsKIAlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCV9fbGUxNiByZXMgPSBjcHVfdG9fbGUxNih2YWwpOworCXU4IHNtc3I7CisJaW50IGkgPSAwOworCWludCByZXQ7CiAKIAluZXRkZXZfZGJnKGRldi0+bmV0LCAiYXNpeF9tZGlvX3dyaXRlKCkgcGh5X2lkPTB4JTAyeCwgbG9jPTB4JTAyeCwgdmFsPTB4JTA0eFxuIiwKLQkJICAgcGh5X2lkLCBsb2MsIHZhbCk7CisJCQlwaHlfaWQsIGxvYywgdmFsKTsKKwogCW11dGV4X2xvY2soJmRldi0+cGh5X211dGV4KTsKLQlhc2l4X3NldF9zd19taWkoZGV2KTsKLQlhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9NSUlfUkVHLCBwaHlfaWQsIChfX3UxNilsb2MsIDIsICZyZXMpOwotCWFzaXhfc2V0X2h3X21paShkZXYpOworCWRvIHsKKwkJcmV0ID0gYXNpeF9zZXRfc3dfbWlpKGRldiwgMCk7CisJCWlmIChyZXQgPT0gLUVOT0RFVikKKwkJCWJyZWFrOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CisJCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfU1RBVE1OR1NUU19SRUcsCisJCQkJICAgIDAsIDAsIDEsICZzbXNyLCAwKTsKKwl9IHdoaWxlICghKHNtc3IgJiBBWF9IT1NUX0VOKSAmJiAoaSsrIDwgMzApICYmIChyZXQgIT0gLUVOT0RFVikpOworCWlmIChyZXQgPT0gLUVOT0RFVikgeworCQltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKKwkJcmV0dXJuOworCX0KKworCWFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX01JSV9SRUcsIHBoeV9pZCwKKwkJICAgICAgIChfX3UxNilsb2MsIDIsICZyZXMsIDApOworCWFzaXhfc2V0X2h3X21paShkZXYsIDApOworCW11dGV4X3VubG9jaygmZGV2LT5waHlfbXV0ZXgpOworfQorCitpbnQgYXNpeF9tZGlvX3JlYWRfbm9wbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJX19sZTE2IHJlczsKKwl1OCBzbXNyOworCWludCBpID0gMDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZGV2LT5waHlfbXV0ZXgpOworCWRvIHsKKwkJcmV0ID0gYXNpeF9zZXRfc3dfbWlpKGRldiwgMSk7CisJCWlmIChyZXQgPT0gLUVOT0RFVikKKwkJCWJyZWFrOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CisJCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfU1RBVE1OR1NUU19SRUcsCisJCQkJICAgIDAsIDAsIDEsICZzbXNyLCAxKTsKKwl9IHdoaWxlICghKHNtc3IgJiBBWF9IT1NUX0VOKSAmJiAoaSsrIDwgMzApICYmIChyZXQgIT0gLUVOT0RFVikpOworCWlmIChyZXQgPT0gLUVOT0RFVikgeworCQltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTUlJX1JFRywgcGh5X2lkLAorCQkgICAgICAoX191MTYpbG9jLCAyLCAmcmVzLCAxKTsKKwlhc2l4X3NldF9od19taWkoZGV2LCAxKTsKKwltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKKworCW5ldGRldl9kYmcoZGV2LT5uZXQsICJhc2l4X21kaW9fcmVhZF9ub3BtKCkgcGh5X2lkPTB4JTAyeCwgbG9jPTB4JTAyeCwgcmV0dXJucz0weCUwNHhcbiIsCisJCQlwaHlfaWQsIGxvYywgbGUxNl90b19jcHUocmVzKSk7CisKKwlyZXR1cm4gbGUxNl90b19jcHUocmVzKTsKK30KKwordm9pZAorYXNpeF9tZGlvX3dyaXRlX25vcG0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IGxvYywgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCV9fbGUxNiByZXMgPSBjcHVfdG9fbGUxNih2YWwpOworCXU4IHNtc3I7CisJaW50IGkgPSAwOworCWludCByZXQ7CisKKwluZXRkZXZfZGJnKGRldi0+bmV0LCAiYXNpeF9tZGlvX3dyaXRlKCkgcGh5X2lkPTB4JTAyeCwgbG9jPTB4JTAyeCwgdmFsPTB4JTA0eFxuIiwKKwkJCXBoeV9pZCwgbG9jLCB2YWwpOworCisJbXV0ZXhfbG9jaygmZGV2LT5waHlfbXV0ZXgpOworCWRvIHsKKwkJcmV0ID0gYXNpeF9zZXRfc3dfbWlpKGRldiwgMSk7CisJCWlmIChyZXQgPT0gLUVOT0RFVikKKwkJCWJyZWFrOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CisJCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfU1RBVE1OR1NUU19SRUcsCisJCQkJICAgIDAsIDAsIDEsICZzbXNyLCAxKTsKKwl9IHdoaWxlICghKHNtc3IgJiBBWF9IT1NUX0VOKSAmJiAoaSsrIDwgMzApICYmIChyZXQgIT0gLUVOT0RFVikpOworCWlmIChyZXQgPT0gLUVOT0RFVikgeworCQltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKKwkJcmV0dXJuOworCX0KKworCWFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX01JSV9SRUcsIHBoeV9pZCwKKwkJICAgICAgIChfX3UxNilsb2MsIDIsICZyZXMsIDEpOworCWFzaXhfc2V0X2h3X21paShkZXYsIDEpOwogCW11dGV4X3VubG9jaygmZGV2LT5waHlfbXV0ZXgpOwogfQogCkBAIC00MzEsNyArNTU2LDggQEAKIAlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwogCXU4IG9wdDsKIAotCWlmIChhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTU9OSVRPUl9NT0RFLCAwLCAwLCAxLCAmb3B0KSA8IDApIHsKKwlpZiAoYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX01PTklUT1JfTU9ERSwKKwkJCSAgMCwgMCwgMSwgJm9wdCwgMCkgPCAwKSB7CiAJCXdvbGluZm8tPnN1cHBvcnRlZCA9IDA7CiAJCXdvbGluZm8tPndvbG9wdHMgPSAwOwogCQlyZXR1cm47CkBAIC00NTUsNyArNTgxLDcgQEAKIAkJb3B0IHw9IEFYX01PTklUT1JfTUFHSUM7CiAKIAlpZiAoYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTU9OSVRPUl9NT0RFLAotCQkJICAgICAgb3B0LCAwLCAwLCBOVUxMKSA8IDApCisJCQkgICAgICBvcHQsIDAsIDAsIE5VTEwsIDApIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gMDsKQEAgLTQ5MCw3ICs2MTYsNyBAQAogCS8qIGF4ODgxN3ggcmV0dXJucyAyIGJ5dGVzIGZyb20gZWVwcm9tIG9uIHJlYWQgKi8KIAlmb3IgKGkgPSBmaXJzdF93b3JkOyBpIDw9IGxhc3Rfd29yZDsgaSsrKSB7CiAJCWlmIChhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfRUVQUk9NLCBpLCAwLCAyLAotCQkJCSAgJihlZXByb21fYnVmZltpIC0gZmlyc3Rfd29yZF0pKSA8IDApIHsKKwkJCQkgICZlZXByb21fYnVmZltpIC0gZmlyc3Rfd29yZF0sIDApIDwgMCkgewogCQkJa2ZyZWUoZWVwcm9tX2J1ZmYpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KQEAgLTUzMSw3ICs2NTcsNyBAQAogCSAgIHRoZSBFRVBST00gKi8KIAlpZiAoZWVwcm9tLT5vZmZzZXQgJiAxKSB7CiAJCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9FRVBST00sIGZpcnN0X3dvcmQsIDAsIDIsCi0JCQkJICAgICYoZWVwcm9tX2J1ZmZbMF0pKTsKKwkJCQkgICAgJmVlcHJvbV9idWZmWzBdLCAwKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCW5ldGRldl9lcnIobmV0LCAiRmFpbGVkIHRvIHJlYWQgRUVQUk9NIGF0IG9mZnNldCAweCUwMnguXG4iLCBmaXJzdF93b3JkKTsKIAkJCWdvdG8gZnJlZTsKQEAgLTU0MCw3ICs2NjYsNyBAQAogCiAJaWYgKChlZXByb20tPm9mZnNldCArIGVlcHJvbS0+bGVuKSAmIDEpIHsKIAkJcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX0VFUFJPTSwgbGFzdF93b3JkLCAwLCAyLAotCQkJCSAgICAmKGVlcHJvbV9idWZmW2xhc3Rfd29yZCAtIGZpcnN0X3dvcmRdKSk7CisJCQkJICAgICZlZXByb21fYnVmZltsYXN0X3dvcmQgLSBmaXJzdF93b3JkXSwgMCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQluZXRkZXZfZXJyKG5ldCwgIkZhaWxlZCB0byByZWFkIEVFUFJPTSBhdCBvZmZzZXQgMHglMDJ4LlxuIiwgbGFzdF93b3JkKTsKIAkJCWdvdG8gZnJlZTsKQEAgLTU1MCw3ICs2NzYsNyBAQAogCW1lbWNweSgodTggKillZXByb21fYnVmZiArIChlZXByb20tPm9mZnNldCAmIDEpLCBkYXRhLCBlZXByb20tPmxlbik7CiAKIAkvKiB3cml0ZSBkYXRhIHRvIEVFUFJPTSAqLwotCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX0VOQUJMRSwgMHgwMDAwLCAwLCAwLCBOVUxMKTsKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9FTkFCTEUsIDB4MDAwMCwgMCwgMCwgTlVMTCwgMCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbmV0ZGV2X2VycihuZXQsICJGYWlsZWQgdG8gZW5hYmxlIEVFUFJPTSB3cml0ZVxuIik7CiAJCWdvdG8gZnJlZTsKQEAgLTU2MSw3ICs2ODcsNyBAQAogCQluZXRkZXZfZGJnKG5ldCwgIndyaXRlIHRvIEVFUFJPTSBhdCBvZmZzZXQgMHglMDJ4LCBkYXRhIDB4JTA0eFxuIiwKIAkJCSAgIGksIGVlcHJvbV9idWZmW2kgLSBmaXJzdF93b3JkXSk7CiAJCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX0VFUFJPTSwgaSwKLQkJCQkgICAgIGVlcHJvbV9idWZmW2kgLSBmaXJzdF93b3JkXSwgMCwgTlVMTCk7CisJCQkJICAgICBlZXByb21fYnVmZltpIC0gZmlyc3Rfd29yZF0sIDAsIE5VTEwsIDApOwogCQlpZiAocmV0IDwgMCkgewogCQkJbmV0ZGV2X2VycihuZXQsICJGYWlsZWQgdG8gd3JpdGUgRUVQUk9NIGF0IG9mZnNldCAweCUwMnguXG4iLAogCQkJCSAgIGkpOwpAQCAtNTcwLDcgKzY5Niw3IEBACiAJCW1zbGVlcCgyMCk7CiAJfQogCi0JcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfRElTQUJMRSwgMHgwMDAwLCAwLCAwLCBOVUxMKTsKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9ESVNBQkxFLCAweDAwMDAsIDAsIDAsIE5VTEwsIDApOwogCWlmIChyZXQgPCAwKSB7CiAJCW5ldGRldl9lcnIobmV0LCAiRmFpbGVkIHRvIGRpc2FibGUgRUVQUk9NIHdyaXRlXG4iKTsKIAkJZ290byBmcmVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2FzaXhfZGV2aWNlcy5jIGIvZHJpdmVycy9uZXQvdXNiL2FzaXhfZGV2aWNlcy5jCmluZGV4IDVjYWJlZmMuLmNjZTI0OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9hc2l4X2RldmljZXMuYworKysgYi9kcml2ZXJzL25ldC91c2IvYXNpeF9kZXZpY2VzLmMKQEAgLTM1LDYgKzM1LDE1IEBACiAKICNkZWZpbmUJUEhZX01PREVfUlRMODIxMUNMCTB4MDAwQwogCisjZGVmaW5lIEFYODg3NzJBX1BIWTE0SAkJMHgxNAorI2RlZmluZSBBWDg4NzcyQV9QSFkxNEhfREVGQVVMVCAweDQ0MkMKKworI2RlZmluZSBBWDg4NzcyQV9QSFkxNUgJCTB4MTUKKyNkZWZpbmUgQVg4ODc3MkFfUEhZMTVIX0RFRkFVTFQgMHgwM0M4CisKKyNkZWZpbmUgQVg4ODc3MkFfUEhZMTZICQkweDE2CisjZGVmaW5lIEFYODg3NzJBX1BIWTE2SF9ERUZBVUxUIDB4NDA0NAorCiBzdHJ1Y3QgYXg4ODE3Ml9pbnRfZGF0YSB7CiAJX19sZTE2IHJlczE7CiAJdTggbGluazsKQEAgLTc5LDYgKzg4LDggQEAKIAkvKiBQb2xsIGZvciB0aGUgcmFyZSBjYXNlIHRoZSBGVyBvciBwaHkgaXNuJ3QgcmVhZHkgeWV0LiAgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKIAkJcGh5X3JlZyA9IGFzaXhfbWRpb19yZWFkKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9QSFlTSUQxKTsKKwkJaWYgKHBoeV9yZWcgPCAwKQorCQkJcmV0dXJuIDA7CiAJCWlmIChwaHlfcmVnICE9IDAgJiYgcGh5X3JlZyAhPSAweEZGRkYpCiAJCQlicmVhazsKIAkJbWRlbGF5KDEpOwpAQCAtMTg0LDcgKzE5NSw3IEBACiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgImF4ODgxNzJfbGlua19yZXNldCgpIHNwZWVkOiAldSBkdXBsZXg6ICVkIHNldHRpbmcgbW9kZSB0byAweCUwNHhcbiIsCiAJCSAgIGV0aHRvb2xfY21kX3NwZWVkKCZlY21kKSwgZWNtZC5kdXBsZXgsIG1vZGUpOwogCi0JYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIG1vZGUpOworCWFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBtb2RlLCAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjAxLDYgKzIxMiwyOCBAQAogCS5uZG9fc2V0X3J4X21vZGUJPSBheDg4MTcyX3NldF9tdWx0aWNhc3QsCiB9OwogCitzdGF0aWMgdm9pZCBhc2l4X3BoeV9yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYsIHVuc2lnbmVkIGludCByZXNldF9iaXRzKQoreworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gNTAwMDsKKworCWFzaXhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQk1DUiwgcmVzZXRfYml0cyk7CisKKwkvKiBnaXZlIHBoeV9pZCBhIGNoYW5jZSB0byBwcm9jZXNzIHJlc2V0ICovCisJdWRlbGF5KDUwMCk7CisKKwkvKiBTZWUgSUVFRSA4MDIuMyAiMjIuMi40LjEuMSBSZXNldCI6IDUwMG1zIG1heCAqLworCXdoaWxlICh0aW1lb3V0LS0pIHsKKwkJaWYgKGFzaXhfbWRpb19yZWFkKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9CTUNSKQorCQkJCQkJCSYgQk1DUl9SRVNFVCkKKwkJCXVkZWxheSgxMDApOworCQllbHNlCisJCQlyZXR1cm47CisJfQorCisJbmV0ZGV2X2VycihkZXYtPm5ldCwgIkJNQ1JfUkVTRVQgdGltZW91dCBvbiBwaHlfaWQgJWRcbiIsCisJCSAgIGRldi0+bWlpLnBoeV9pZCk7Cit9CisKIHN0YXRpYyBpbnQgYXg4ODE3Ml9iaW5kKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJaW50IHJldCA9IDA7CkBAIC0yMTMsMTggKzI0NiwxOSBAQAogCS8qIFRvZ2dsZSB0aGUgR1BJT3MgaW4gYSBtYW51ZmFjdHVyZXIvbW9kZWwgc3BlY2lmaWMgd2F5ICovCiAJZm9yIChpID0gMjsgaSA+PSAwOyBpLS0pIHsKIAkJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfR1BJT1MsCi0JCQkJKGdwaW9fYml0cyA+PiAoaSAqIDgpKSAmIDB4ZmYsIDAsIDAsIE5VTEwpOworCQkJCShncGlvX2JpdHMgPj4gKGkgKiA4KSkgJiAweGZmLCAwLCAwLCBOVUxMLCAwKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAkJbXNsZWVwKDUpOwogCX0KIAotCXJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgMHg4MCk7CisJcmV0ID0gYXNpeF93cml0ZV9yeF9jdGwoZGV2LCAweDgwLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKIAkvKiBHZXQgdGhlIE1BQyBhZGRyZXNzICovCi0JcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYODgxNzJfQ01EX1JFQURfTk9ERV9JRCwgMCwgMCwgRVRIX0FMRU4sIGJ1Zik7CisJcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYODgxNzJfQ01EX1JFQURfTk9ERV9JRCwKKwkJCSAgICAwLCAwLCBFVEhfQUxFTiwgYnVmLCAwKTsKIAlpZiAocmV0IDwgMCkgewogCQluZXRkZXZfZGJnKGRldi0+bmV0LCAicmVhZCBBWF9DTURfUkVBRF9OT0RFX0lEIGZhaWxlZDogJWRcbiIsCiAJCQkgICByZXQpOwpAQCAtMjQ2LDcgKzI4MCw3IEBACiAJZGV2LT5uZXQtPm5lZWRlZF9oZWFkcm9vbSA9IDQ7IC8qIGNmIGFzaXhfdHhfZml4dXAoKSAqLwogCWRldi0+bmV0LT5uZWVkZWRfdGFpbHJvb20gPSA0OyAvKiBjZiBhc2l4X3R4X2ZpeHVwKCkgKi8KIAotCWFzaXhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisJYXNpeF9waHlfcmVzZXQoZGV2LCBCTUNSX1JFU0VUKTsKIAlhc2l4X21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0FEVkVSVElTRSwKIAkJQURWRVJUSVNFX0FMTCB8IEFEVkVSVElTRV9DU01BIHwgQURWRVJUSVNFX1BBVVNFX0NBUCk7CiAJbWlpX253YXlfcmVzdGFydCgmZGV2LT5taWkpOwpAQCAtMjkwLDcgKzMyNCw3IEBACiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgImF4ODg3NzJfbGlua19yZXNldCgpIHNwZWVkOiAldSBkdXBsZXg6ICVkIHNldHRpbmcgbW9kZSB0byAweCUwNHhcbiIsCiAJCSAgIGV0aHRvb2xfY21kX3NwZWVkKCZlY21kKSwgZWNtZC5kdXBsZXgsIG1vZGUpOwogCi0JYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIG1vZGUpOworCWFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBtb2RlLCAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjk4LDEwMCArMzMyLDExNSBAQAogc3RhdGljIGludCBheDg4NzcyX3Jlc2V0KHN0cnVjdCB1c2JuZXQgKmRldikKIHsKIAlzdHJ1Y3QgYXNpeF9kYXRhICpkYXRhID0gKHN0cnVjdCBhc2l4X2RhdGEgKikmZGV2LT5kYXRhOwotCWludCByZXQsIGVtYmRfcGh5OwotCXUxNiByeF9jdGw7CisJaW50IHJldDsKIAotCXJldCA9IGFzaXhfd3JpdGVfZ3BpbyhkZXYsCi0JCQlBWF9HUElPX1JTRSB8IEFYX0dQSU9fR1BPXzIgfCBBWF9HUElPX0dQTzJFTiwgNSk7CisJLyogUmV3cml0ZSBNQUMgYWRkcmVzcyAqLworCWV0aGVyX2FkZHJfY29weShkYXRhLT5tYWNfYWRkciwgZGV2LT5uZXQtPmRldl9hZGRyKTsKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9OT0RFX0lELCAwLCAwLAorCQkJICAgICBFVEhfQUxFTiwgZGF0YS0+bWFjX2FkZHIsIDApOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCWVtYmRfcGh5ID0gKChhc2l4X2dldF9waHlfYWRkcihkZXYpICYgMHgxZikgPT0gMHgxMCA/IDEgOiAwKTsKKwkvKiBTZXQgUlhfQ1RMIHRvIGRlZmF1bHQgdmFsdWVzIHdpdGggMmsgYnVmZmVyLCBhbmQgZW5hYmxlIGNhY3R1cyAqLworCXJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgQVhfREVGQVVMVF9SWF9DVEwsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKIAotCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1BIWV9TRUxFQ1QsIGVtYmRfcGh5LCAwLCAwLCBOVUxMKTsKKwlhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgQVg4ODc3Ml9NRURJVU1fREVGQVVMVCwgMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0dXJuIDA7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF4ODg3NzJfaHdfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgaW5fcG0pCit7CisJc3RydWN0IGFzaXhfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgYXNpeF9kYXRhICopJmRldi0+ZGF0YTsKKwlpbnQgcmV0LCBlbWJkX3BoeTsKKwl1MTYgcnhfY3RsOworCisJcmV0ID0gYXNpeF93cml0ZV9ncGlvKGRldiwgQVhfR1BJT19SU0UgfCBBWF9HUElPX0dQT18yIHwKKwkJCSAgICAgIEFYX0dQSU9fR1BPMkVOLCA1LCBpbl9wbSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJZW1iZF9waHkgPSAoKGRldi0+bWlpLnBoeV9pZCAmIDB4MWYpID09IDB4MTAgPyAxIDogMCk7CisKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TV19QSFlfU0VMRUNULCBlbWJkX3BoeSwKKwkJCSAgICAgMCwgMCwgTlVMTCwgaW5fcG0pOwogCWlmIChyZXQgPCAwKSB7CiAJCW5ldGRldl9kYmcoZGV2LT5uZXQsICJTZWxlY3QgUEhZICMxIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IGFzaXhfc3dfcmVzZXQoZGV2LCBBWF9TV1JFU0VUX0lQUEQgfCBBWF9TV1JFU0VUX1BSTCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JbXNsZWVwKDE1MCk7Ci0KLQlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9DTEVBUik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JbXNsZWVwKDE1MCk7Ci0KIAlpZiAoZW1iZF9waHkpIHsKLQkJcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfSVBSTCk7CisJCXJldCA9IGFzaXhfc3dfcmVzZXQoZGV2LCBBWF9TV1JFU0VUX0lQUEQsIGluX3BtKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKworCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKKworCQlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9DTEVBUiwgaW5fcG0pOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCisJCW1zbGVlcCg2MCk7CisKKwkJcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfSVBSTCB8IEFYX1NXUkVTRVRfUFJMLAorCQkJCSAgICBpbl9wbSk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CiAJfSBlbHNlIHsKLQkJcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfUFJURSk7CisJCXJldCA9IGFzaXhfc3dfcmVzZXQoZGV2LCBBWF9TV1JFU0VUX0lQUEQgfCBBWF9TV1JFU0VUX1BSTCwKKwkJCQkgICAgaW5fcG0pOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0OwogCX0KIAogCW1zbGVlcCgxNTApOwotCXJ4X2N0bCA9IGFzaXhfcmVhZF9yeF9jdGwoZGV2KTsKLQluZXRkZXZfZGJnKGRldi0+bmV0LCAiUlhfQ1RMIGlzIDB4JTA0eCBhZnRlciBzb2Z0d2FyZSByZXNldFxuIiwgcnhfY3RsKTsKLQlyZXQgPSBhc2l4X3dyaXRlX3J4X2N0bChkZXYsIDB4MDAwMCk7CisKKwlpZiAoaW5fcG0gJiYgKCFhc2l4X21kaW9fcmVhZF9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJCSAgIE1JSV9QSFlTSUQxKSkpeworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBhc2l4X3dyaXRlX3J4X2N0bChkZXYsIEFYX0RFRkFVTFRfUlhfQ1RMLCBpbl9wbSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcnhfY3RsID0gYXNpeF9yZWFkX3J4X2N0bChkZXYpOwotCW5ldGRldl9kYmcoZGV2LT5uZXQsICJSWF9DVEwgaXMgMHglMDR4IHNldHRpbmcgdG8gMHgwMDAwXG4iLCByeF9jdGwpOwotCi0JcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfUFJMKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0KLQltc2xlZXAoMTUwKTsKLQotCXJldCA9IGFzaXhfc3dfcmVzZXQoZGV2LCBBWF9TV1JFU0VUX0lQUkwgfCBBWF9TV1JFU0VUX1BSTCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JbXNsZWVwKDE1MCk7Ci0KLQlhc2l4X21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOwotCWFzaXhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQURWRVJUSVNFLAotCQkJQURWRVJUSVNFX0FMTCB8IEFEVkVSVElTRV9DU01BKTsKLQltaWlfbndheV9yZXN0YXJ0KCZkZXYtPm1paSk7Ci0KLQlyZXQgPSBhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgQVg4ODc3Ml9NRURJVU1fREVGQVVMVCk7CisJcmV0ID0gYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIEFYODg3NzJfTUVESVVNX0RFRkFVTFQsIGluX3BtKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9JUEcwLAotCQkJCUFYODg3NzJfSVBHMF9ERUZBVUxUIHwgQVg4ODc3Ml9JUEcxX0RFRkFVTFQsCi0JCQkJQVg4ODc3Ml9JUEcyX0RFRkFVTFQsIDAsIE5VTEwpOworCQkJICAgICBBWDg4NzcyX0lQRzBfREVGQVVMVCB8IEFYODg3NzJfSVBHMV9ERUZBVUxULAorCQkJICAgICBBWDg4NzcyX0lQRzJfREVGQVVMVCwgMCwgTlVMTCwgaW5fcG0pOwogCWlmIChyZXQgPCAwKSB7CiAJCW5ldGRldl9kYmcoZGV2LT5uZXQsICJXcml0ZSBJUEcsSVBHMSxJUEcyIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIAogCS8qIFJld3JpdGUgTUFDIGFkZHJlc3MgKi8KLQltZW1jcHkoZGF0YS0+bWFjX2FkZHIsIGRldi0+bmV0LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX05PREVfSUQsIDAsIDAsIEVUSF9BTEVOLAotCQkJCQkJCWRhdGEtPm1hY19hZGRyKTsKKwlldGhlcl9hZGRyX2NvcHkoZGF0YS0+bWFjX2FkZHIsIGRldi0+bmV0LT5kZXZfYWRkcik7CisJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTk9ERV9JRCwgMCwgMCwKKwkJCSAgICAgRVRIX0FMRU4sIGRhdGEtPm1hY19hZGRyLCBpbl9wbSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCiAJLyogU2V0IFJYX0NUTCB0byBkZWZhdWx0IHZhbHVlcyB3aXRoIDJrIGJ1ZmZlciwgYW5kIGVuYWJsZSBjYWN0dXMgKi8KLQlyZXQgPSBhc2l4X3dyaXRlX3J4X2N0bChkZXYsIEFYX0RFRkFVTFRfUlhfQ1RMKTsKKwlyZXQgPSBhc2l4X3dyaXRlX3J4X2N0bChkZXYsIEFYX0RFRkFVTFRfUlhfQ1RMLCBpbl9wbSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcnhfY3RsID0gYXNpeF9yZWFkX3J4X2N0bChkZXYpOworCXJ4X2N0bCA9IGFzaXhfcmVhZF9yeF9jdGwoZGV2LCBpbl9wbSk7CiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIlJYX0NUTCBpcyAweCUwNHggYWZ0ZXIgYWxsIGluaXRpYWxpemF0aW9uc1xuIiwKIAkJICAgcnhfY3RsKTsKIAotCXJ4X2N0bCA9IGFzaXhfcmVhZF9tZWRpdW1fc3RhdHVzKGRldik7CisJcnhfY3RsID0gYXNpeF9yZWFkX21lZGl1bV9zdGF0dXMoZGV2LCBpbl9wbSk7CiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwKIAkJICAgIk1lZGl1bSBTdGF0dXMgaXMgMHglMDR4IGFmdGVyIGFsbCBpbml0aWFsaXphdGlvbnNcbiIsCiAJCSAgIHJ4X2N0bCk7CkBAIC00MDAsNyArNDQ5LDE0MCBAQAogCiBvdXQ6CiAJcmV0dXJuIHJldDsKK30KIAorc3RhdGljIGludCBheDg4NzcyYV9od19yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYsIGludCBpbl9wbSkKK3sKKwlzdHJ1Y3QgYXNpeF9kYXRhICpkYXRhID0gKHN0cnVjdCBhc2l4X2RhdGEgKikmZGV2LT5kYXRhOworCWludCByZXQsIGVtYmRfcGh5OworCXUxNiByeF9jdGwsIHBoeTE0aCwgcGh5MTVoLCBwaHkxNmg7CisJdTggY2hpcGNvZGUgPSAwOworCisJcmV0ID0gYXNpeF93cml0ZV9ncGlvKGRldiwgQVhfR1BJT19SU0UsIDUsIGluX3BtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwllbWJkX3BoeSA9ICgoZGV2LT5taWkucGh5X2lkICYgMHgxZikgPT0gMHgxMCA/IDEgOiAwKTsKKworCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1BIWV9TRUxFQ1QsIGVtYmRfcGh5IHwKKwkJCSAgICAgQVhfUEhZU0VMX1NTRU4sIDAsIDAsIE5VTEwsIGluX3BtKTsKKwlpZiAocmV0IDwgMCkgeworCQluZXRkZXZfZGJnKGRldi0+bmV0LCAiU2VsZWN0IFBIWSAjMSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7CisKKwlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9JUFBEIHwgQVhfU1dSRVNFVF9JUFJMLCBpbl9wbSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7CisKKwlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9JUFJMLCBpbl9wbSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJbXNsZWVwKDE2MCk7CisKKwlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9DTEVBUiwgaW5fcG0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IGFzaXhfc3dfcmVzZXQoZGV2LCBBWF9TV1JFU0VUX0lQUkwsIGluX3BtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwltc2xlZXAoMjAwKTsKKworCWlmIChpbl9wbSAmJiAoIWFzaXhfbWRpb19yZWFkX25vcG0oZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwKKwkJCQkJICAgTUlJX1BIWVNJRDEpKSkgeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9TVEFUTU5HU1RTX1JFRywgMCwKKwkJCSAgICAwLCAxLCAmY2hpcGNvZGUsIGluX3BtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoKGNoaXBjb2RlICYgQVhfQ0hJUENPREVfTUFTSykgPT0gQVhfQVg4ODc3MkJfQ0hJUENPREUpIHsKKwkJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9RQ1RDVFJMLCAweDgwMDAsIDB4ODAwMSwKKwkJCQkgICAgIDAsIE5VTEwsIGluX3BtKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW5ldGRldl9kYmcoZGV2LT5uZXQsICJXcml0ZSBCUSBzZXR0aW5nIGZhaWxlZDogJWRcbiIsCisJCQkJICAgcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIGlmICgoY2hpcGNvZGUgJiBBWF9DSElQQ09ERV9NQVNLKSA9PSBBWF9BWDg4NzcyQV9DSElQQ09ERSkgeworCQkvKiBDaGVjayBpZiB0aGUgUEhZIHJlZ2lzdGVycyBoYXZlIGRlZmF1bHQgc2V0dGluZ3MgKi8KKwkJcGh5MTRoID0gYXNpeF9tZGlvX3JlYWRfbm9wbShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLAorCQkJCQkgICAgIEFYODg3NzJBX1BIWTE0SCk7CisJCXBoeTE1aCA9IGFzaXhfbWRpb19yZWFkX25vcG0oZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwKKwkJCQkJICAgICBBWDg4NzcyQV9QSFkxNUgpOworCQlwaHkxNmggPSBhc2l4X21kaW9fcmVhZF9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJCSAgICAgQVg4ODc3MkFfUEhZMTZIKTsKKworCQluZXRkZXZfZGJnKGRldi0+bmV0LAorCQkJICAgIjc3MmFfaHdfcmVzZXQ6IE1SMjA9MHgleCBNUjIxPTB4JXggTVIyMj0weCV4XG4iLAorCQkJICAgcGh5MTRoLCBwaHkxNWgsIHBoeTE2aCk7CisKKwkJLyogUmVzdG9yZSBQSFkgcmVnaXN0ZXJzIGRlZmF1bHQgc2V0dGluZyBpZiBub3QgKi8KKwkJaWYgKHBoeTE0aCAhPSBBWDg4NzcyQV9QSFkxNEhfREVGQVVMVCkKKwkJCWFzaXhfbWRpb193cml0ZV9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJCSAgICAgQVg4ODc3MkFfUEhZMTRILAorCQkJCQkgICAgIEFYODg3NzJBX1BIWTE0SF9ERUZBVUxUKTsKKwkJaWYgKHBoeTE1aCAhPSBBWDg4NzcyQV9QSFkxNUhfREVGQVVMVCkKKwkJCWFzaXhfbWRpb193cml0ZV9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJCSAgICAgQVg4ODc3MkFfUEhZMTVILAorCQkJCQkgICAgIEFYODg3NzJBX1BIWTE1SF9ERUZBVUxUKTsKKwkJaWYgKHBoeTE2aCAhPSBBWDg4NzcyQV9QSFkxNkhfREVGQVVMVCkKKwkJCWFzaXhfbWRpb193cml0ZV9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJCSAgICAgQVg4ODc3MkFfUEhZMTZILAorCQkJCQkgICAgIEFYODg3NzJBX1BIWTE2SF9ERUZBVUxUKTsKKwl9CisKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9JUEcwLAorCQkJCUFYODg3NzJfSVBHMF9ERUZBVUxUIHwgQVg4ODc3Ml9JUEcxX0RFRkFVTFQsCisJCQkJQVg4ODc3Ml9JUEcyX0RFRkFVTFQsIDAsIE5VTEwsIGluX3BtKTsKKwlpZiAocmV0IDwgMCkgeworCQluZXRkZXZfZGJnKGRldi0+bmV0LCAiV3JpdGUgSVBHLElQRzEsSVBHMiBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBSZXdyaXRlIE1BQyBhZGRyZXNzICovCisJbWVtY3B5KGRhdGEtPm1hY19hZGRyLCBkZXYtPm5ldC0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9OT0RFX0lELCAwLCAwLCBFVEhfQUxFTiwKKwkJCQkJCQlkYXRhLT5tYWNfYWRkciwgaW5fcG0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIFNldCBSWF9DVEwgdG8gZGVmYXVsdCB2YWx1ZXMgd2l0aCAyayBidWZmZXIsIGFuZCBlbmFibGUgY2FjdHVzICovCisJcmV0ID0gYXNpeF93cml0ZV9yeF9jdGwoZGV2LCBBWF9ERUZBVUxUX1JYX0NUTCwgaW5fcG0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IGFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBBWDg4NzcyX01FRElVTV9ERUZBVUxULCBpbl9wbSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBTZXQgUlhfQ1RMIHRvIGRlZmF1bHQgdmFsdWVzIHdpdGggMmsgYnVmZmVyLCBhbmQgZW5hYmxlIGNhY3R1cyAqLworCXJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgQVhfREVGQVVMVF9SWF9DVEwsIGluX3BtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyeF9jdGwgPSBhc2l4X3JlYWRfcnhfY3RsKGRldiwgaW5fcG0pOworCW5ldGRldl9kYmcoZGV2LT5uZXQsICJSWF9DVEwgaXMgMHglMDR4IGFmdGVyIGFsbCBpbml0aWFsaXphdGlvbnNcbiIsCisJCSAgIHJ4X2N0bCk7CisKKwlyeF9jdGwgPSBhc2l4X3JlYWRfbWVkaXVtX3N0YXR1cyhkZXYsIGluX3BtKTsKKwluZXRkZXZfZGJnKGRldi0+bmV0LAorCQkgICAiTWVkaXVtIFN0YXR1cyBpcyAweCUwNHggYWZ0ZXIgYWxsIGluaXRpYWxpemF0aW9uc1xuIiwKKwkJICAgcnhfY3RsKTsKKworCXJldHVybiAwOworCitvdXQ6CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBheDg4NzcyX25ldGRldl9vcHMgPSB7CkBAIC00MTUsMTEgKzU5Nyw5NyBAQAogCS5uZG9fc2V0X3J4X21vZGUgICAgICAgID0gYXNpeF9zZXRfbXVsdGljYXN0LAogfTsKIAorc3RhdGljIHZvaWQgYXg4ODc3Ml9zdXNwZW5kKHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlzdHJ1Y3QgYXNpeF9jb21tb25fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZHJpdmVyX3ByaXY7CisJdTE2IG1lZGl1bTsKKworCS8qIFN0b3AgTUFDIG9wZXJhdGlvbiAqLworCW1lZGl1bSA9IGFzaXhfcmVhZF9tZWRpdW1fc3RhdHVzKGRldiwgMCk7CisJbWVkaXVtICY9IH5BWF9NRURJVU1fUkU7CisJYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIG1lZGl1bSwgMCk7CisKKwluZXRkZXZfZGJnKGRldi0+bmV0LCAiYXg4ODc3Ml9zdXNwZW5kOiBtZWRpdW09MHglMDR4XG4iLAorCQkgICBhc2l4X3JlYWRfbWVkaXVtX3N0YXR1cyhkZXYsIDApKTsKKworCS8qIFByZXNlcnZlIEJNQ1IgZm9yIHJlc3RvcmluZyAqLworCXByaXYtPnByZXN2ZF9waHlfYm1jciA9CisJCWFzaXhfbWRpb19yZWFkX25vcG0oZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IpOworCisJLyogUHJlc2VydmUgQU5BUiBmb3IgcmVzdG9yaW5nICovCisJcHJpdi0+cHJlc3ZkX3BoeV9hZHZlcnRpc2UgPQorCQlhc2l4X21kaW9fcmVhZF9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9BRFZFUlRJU0UpOworfQorCitzdGF0aWMgaW50IGFzaXhfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgYXNpeF9jb21tb25fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZHJpdmVyX3ByaXY7CisKKwlpZiAocHJpdi0+c3VzcGVuZCkKKwkJcHJpdi0+c3VzcGVuZChkZXYpOworCisJcmV0dXJuIHVzYm5ldF9zdXNwZW5kKGludGYsIG1lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZCBheDg4NzcyX3Jlc3RvcmVfcGh5KHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlzdHJ1Y3QgYXNpeF9jb21tb25fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZHJpdmVyX3ByaXY7CisKKwlpZiAocHJpdi0+cHJlc3ZkX3BoeV9hZHZlcnRpc2UpIHsKKwkJLyogUmVzdG9yZSBBZHZlcnRpc2VtZW50IGNvbnRyb2wgcmVnICovCisJCWFzaXhfbWRpb193cml0ZV9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9BRFZFUlRJU0UsCisJCQkJICAgICBwcml2LT5wcmVzdmRfcGh5X2FkdmVydGlzZSk7CisKKwkJLyogUmVzdG9yZSBCTUNSICovCisJCWFzaXhfbWRpb193cml0ZV9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9CTUNSLAorCQkJCSAgICAgcHJpdi0+cHJlc3ZkX3BoeV9ibWNyKTsKKworCQltaWlfbndheV9yZXN0YXJ0KCZkZXYtPm1paSk7CisJCXByaXYtPnByZXN2ZF9waHlfYWR2ZXJ0aXNlID0gMDsKKwkJcHJpdi0+cHJlc3ZkX3BoeV9ibWNyID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF4ODg3NzJfcmVzdW1lKHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCWlmICghYXg4ODc3Ml9od19yZXNldChkZXYsIDEpKQorCQkJYnJlYWs7CisJYXg4ODc3Ml9yZXN0b3JlX3BoeShkZXYpOworfQorCitzdGF0aWMgdm9pZCBheDg4NzcyYV9yZXN1bWUoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlpZiAoIWF4ODg3NzJhX2h3X3Jlc2V0KGRldiwgMSkpCisJCQlicmVhazsKKwl9CisKKwlheDg4NzcyX3Jlc3RvcmVfcGh5KGRldik7Cit9CisKK3N0YXRpYyBpbnQgYXNpeF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgYXNpeF9jb21tb25fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZHJpdmVyX3ByaXY7CisKKwlpZiAocHJpdi0+cmVzdW1lKQorCQlwcml2LT5yZXN1bWUoZGV2KTsKKworCXJldHVybiB1c2JuZXRfcmVzdW1lKGludGYpOworfQorCiBzdGF0aWMgaW50IGF4ODg3NzJfYmluZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCWludCByZXQsIGVtYmRfcGh5LCBpOwotCXU4IGJ1ZltFVEhfQUxFTl07CisJaW50IHJldCwgaTsKKwl1OCBidWZbRVRIX0FMRU5dLCBjaGlwY29kZSA9IDA7CiAJdTMyIHBoeWlkOworCXN0cnVjdCBhc2l4X2NvbW1vbl9wcml2YXRlICpwcml2OwogCiAJdXNibmV0X2dldF9lbmRwb2ludHMoZGV2LGludGYpOwogCkBAIC00MjcsMTMgKzY5NSwxMyBAQAogCWlmIChkZXYtPmRyaXZlcl9pbmZvLT5kYXRhICYgRkxBR19FRVBST01fTUFDKSB7CiAJCWZvciAoaSA9IDA7IGkgPCAoRVRIX0FMRU4gPj4gMSk7IGkrKykgewogCQkJcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX0VFUFJPTSwgMHgwNCArIGksCi0JCQkJCTAsIDIsIGJ1ZiArIGkgKiAyKTsKKwkJCQkJICAgIDAsIDIsIGJ1ZiArIGkgKiAyLCAwKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWJyZWFrOwogCQl9CiAJfSBlbHNlIHsKIAkJcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX05PREVfSUQsCi0JCQkJMCwgMCwgRVRIX0FMRU4sIGJ1Zik7CisJCQkJMCwgMCwgRVRIX0FMRU4sIGJ1ZiwgMCk7CiAJfQogCiAJaWYgKHJldCA8IDApIHsKQEAgLTQ1NiwxNiArNzI0LDExIEBACiAJZGV2LT5uZXQtPm5lZWRlZF9oZWFkcm9vbSA9IDQ7IC8qIGNmIGFzaXhfdHhfZml4dXAoKSAqLwogCWRldi0+bmV0LT5uZWVkZWRfdGFpbHJvb20gPSA0OyAvKiBjZiBhc2l4X3R4X2ZpeHVwKCkgKi8KIAotCWVtYmRfcGh5ID0gKChkZXYtPm1paS5waHlfaWQgJiAweDFmKSA9PSAweDEwID8gMSA6IDApOworCWFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfU1RBVE1OR1NUU19SRUcsIDAsIDAsIDEsICZjaGlwY29kZSwgMCk7CisJY2hpcGNvZGUgJj0gQVhfQ0hJUENPREVfTUFTSzsKIAotCS8qIFJlc2V0IHRoZSBQSFkgdG8gbm9ybWFsIG9wZXJhdGlvbiBtb2RlICovCi0JcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUEhZX1NFTEVDVCwgZW1iZF9waHksIDAsIDAsIE5VTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCW5ldGRldl9kYmcoZGV2LT5uZXQsICJTZWxlY3QgUEhZICMxIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JYXg4ODc3Ml9yZXNldChkZXYpOworCShjaGlwY29kZSA9PSBBWF9BWDg4NzcyX0NISVBDT0RFKSA/IGF4ODg3NzJfaHdfcmVzZXQoZGV2LCAwKSA6CisJCQkJCSAgICBheDg4NzcyYV9od19yZXNldChkZXYsIDApOwogCiAJLyogUmVhZCBQSFlJRCByZWdpc3RlciAqQUZURVIqIHRoZSBQSFkgd2FzIHJlc2V0IHByb3Blcmx5ICovCiAJcGh5aWQgPSBhc2l4X2dldF9waHlpZChkZXYpOwpAQCAtNDgyLDYgKzc0NSwxOCBAQAogCWlmICghZGV2LT5kcml2ZXJfcHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlwcml2ID0gZGV2LT5kcml2ZXJfcHJpdjsKKworCXByaXYtPnByZXN2ZF9waHlfYm1jciA9IDA7CisJcHJpdi0+cHJlc3ZkX3BoeV9hZHZlcnRpc2UgPSAwOworCWlmIChjaGlwY29kZSA9PSBBWF9BWDg4NzcyX0NISVBDT0RFKSB7CisJCXByaXYtPnJlc3VtZSA9IGF4ODg3NzJfcmVzdW1lOworCQlwcml2LT5zdXNwZW5kID0gYXg4ODc3Ml9zdXNwZW5kOworCX0gZWxzZSB7CisJCXByaXYtPnJlc3VtZSA9IGF4ODg3NzJhX3Jlc3VtZTsKKwkJcHJpdi0+c3VzcGVuZCA9IGF4ODg3NzJfc3VzcGVuZDsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTkzLDEyICs4NjgsMTIgQEAKIAlpbnQgZ3BpbzAgPSAwOwogCXUzMiBwaHlpZDsKIAotCWFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9HUElPUywgMCwgMCwgMSwgJnN0YXR1cyk7CisJYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX0dQSU9TLCAwLCAwLCAxLCAmc3RhdHVzLCAwKTsKIAluZXRkZXZfZGJnKGRldi0+bmV0LCAiR1BJTyBTdGF0dXM6IDB4JTA0eFxuIiwgc3RhdHVzKTsKIAotCWFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX0VOQUJMRSwgMCwgMCwgMCwgTlVMTCk7Ci0JYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX0VFUFJPTSwgMHgwMDE3LCAwLCAyLCAmZWVwcm9tKTsKLQlhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9ESVNBQkxFLCAwLCAwLCAwLCBOVUxMKTsKKwlhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9FTkFCTEUsIDAsIDAsIDAsIE5VTEwsIDApOworCWFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9FRVBST00sIDB4MDAxNywgMCwgMiwgJmVlcHJvbSwgMCk7CisJYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfRElTQUJMRSwgMCwgMCwgMCwgTlVMTCwgMCk7CiAKIAluZXRkZXZfZGJnKGRldi0+bmV0LCAiRUVQUk9NIGluZGV4IDB4MTcgaXMgMHglMDR4XG4iLCBlZXByb20pOwogCkBAIC02MTQsMTUgKzg4OSwxNiBAQAogCW5ldGRldl9kYmcoZGV2LT5uZXQsICJHUElPMDogJWQsIFBoeU1vZGU6ICVkXG4iLCBncGlvMCwgZGF0YS0+cGh5bW9kZSk7CiAKIAkvKiBQb3dlciB1cCBleHRlcm5hbCBHaWdhUEhZIHRocm91Z2ggQVg4ODE3OCBHUElPIHBpbiAqLwotCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIEFYX0dQSU9fUlNFIHwgQVhfR1BJT19HUE9fMSB8IEFYX0dQSU9fR1BPMUVOLCA0MCk7CisJYXNpeF93cml0ZV9ncGlvKGRldiwgQVhfR1BJT19SU0UgfCBBWF9HUElPX0dQT18xIHwKKwkJCUFYX0dQSU9fR1BPMUVOLCA0MCwgMCk7CiAJaWYgKChsZTE2X3RvX2NwdShlZXByb20pID4+IDgpICE9IDEpIHsKLQkJYXNpeF93cml0ZV9ncGlvKGRldiwgMHgwMDNjLCAzMCk7Ci0JCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIDB4MDAxYywgMzAwKTsKLQkJYXNpeF93cml0ZV9ncGlvKGRldiwgMHgwMDNjLCAzMCk7CisJCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIDB4MDAzYywgMzAsIDApOworCQlhc2l4X3dyaXRlX2dwaW8oZGV2LCAweDAwMWMsIDMwMCwgMCk7CisJCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIDB4MDAzYywgMzAsIDApOwogCX0gZWxzZSB7CiAJCW5ldGRldl9kYmcoZGV2LT5uZXQsICJncGlvIHBoeW1vZGUgPT0gMSBwYXRoXG4iKTsKLQkJYXNpeF93cml0ZV9ncGlvKGRldiwgQVhfR1BJT19HUE8xRU4sIDMwKTsKLQkJYXNpeF93cml0ZV9ncGlvKGRldiwgQVhfR1BJT19HUE8xRU4gfCBBWF9HUElPX0dQT18xLCAzMCk7CisJCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIEFYX0dQSU9fR1BPMUVOLCAzMCwgMCk7CisJCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIEFYX0dQSU9fR1BPMUVOIHwgQVhfR1BJT19HUE9fMSwgMzAsIDApOwogCX0KIAogCS8qIFJlYWQgUEhZSUQgcmVnaXN0ZXIgKkFGVEVSKiBwb3dlcmluZyB1cCBQSFkgKi8KQEAgLTYzMCwxNSArOTA2LDE1IEBACiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIlBIWUlEPTB4JTA4eFxuIiwgcGh5aWQpOwogCiAJLyogU2V0IEFYODgxNzggdG8gZW5hYmxlIE1JSS9HTUlJL1JHTUlJIGludGVyZmFjZSBmb3IgZXh0ZXJuYWwgUEhZICovCi0JYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUEhZX1NFTEVDVCwgMCwgMCwgMCwgTlVMTCk7CisJYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUEhZX1NFTEVDVCwgMCwgMCwgMCwgTlVMTCwgMCk7CiAKLQlhc2l4X3N3X3Jlc2V0KGRldiwgMCk7CisJYXNpeF9zd19yZXNldChkZXYsIDAsIDApOwogCW1zbGVlcCgxNTApOwogCi0JYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfUFJMIHwgQVhfU1dSRVNFVF9JUFBEKTsKKwlhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9QUkwgfCBBWF9TV1JFU0VUX0lQUEQsIDApOwogCW1zbGVlcCgxNTApOwogCi0JYXNpeF93cml0ZV9yeF9jdGwoZGV2LCAwKTsKKwlhc2l4X3dyaXRlX3J4X2N0bChkZXYsIDAsIDApOwogCiAJaWYgKGRhdGEtPnBoeW1vZGUgPT0gUEhZX01PREVfTUFSVkVMTCkgewogCQltYXJ2ZWxsX3BoeV9pbml0KGRldik7CkBAIC02NDYsMjcgKzkyMiwyMyBAQAogCX0gZWxzZSBpZiAoZGF0YS0+cGh5bW9kZSA9PSBQSFlfTU9ERV9SVEw4MjExQ0wpCiAJCXJ0bDgyMTFjbF9waHlfaW5pdChkZXYpOwogCi0JYXNpeF9tZGlvX3dyaXRlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9CTUNSLAotCQkJQk1DUl9SRVNFVCB8IEJNQ1JfQU5FTkFCTEUpOworCWFzaXhfcGh5X3Jlc2V0KGRldiwgQk1DUl9SRVNFVCB8IEJNQ1JfQU5FTkFCTEUpOwogCWFzaXhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQURWRVJUSVNFLAogCQkJQURWRVJUSVNFX0FMTCB8IEFEVkVSVElTRV9DU01BIHwgQURWRVJUSVNFX1BBVVNFX0NBUCk7CiAJYXNpeF9tZGlvX3dyaXRlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9DVFJMMTAwMCwKIAkJCUFEVkVSVElTRV8xMDAwRlVMTCk7CiAKKwlhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgQVg4ODE3OF9NRURJVU1fREVGQVVMVCwgMCk7CiAJbWlpX253YXlfcmVzdGFydCgmZGV2LT5taWkpOwogCi0JcmV0ID0gYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIEFYODgxNzhfTUVESVVNX0RFRkFVTFQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCiAJLyogUmV3cml0ZSBNQUMgYWRkcmVzcyAqLwogCW1lbWNweShkYXRhLT5tYWNfYWRkciwgZGV2LT5uZXQtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTk9ERV9JRCwgMCwgMCwgRVRIX0FMRU4sCi0JCQkJCQkJZGF0YS0+bWFjX2FkZHIpOworCQkJCQkJCWRhdGEtPm1hY19hZGRyLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgQVhfREVGQVVMVF9SWF9DVEwpOworCXJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgQVhfREVGQVVMVF9SWF9DVEwsIDApOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC03MDQsNyArOTc2LDcgQEAKIAluZXRkZXZfZGJnKGRldi0+bmV0LCAiYXg4ODE3OF9saW5rX3Jlc2V0KCkgc3BlZWQ6ICV1IGR1cGxleDogJWQgc2V0dGluZyBtb2RlIHRvIDB4JTA0eFxuIiwKIAkJICAgc3BlZWQsIGVjbWQuZHVwbGV4LCBtb2RlKTsKIAotCWFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBtb2RlKTsKKwlhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgbW9kZSwgMCk7CiAKIAlpZiAoZGF0YS0+cGh5bW9kZSA9PSBQSFlfTU9ERV9NQVJWRUxMICYmIGRhdGEtPmxlZG1vZGUpCiAJCW1hcnZlbGxfbGVkX3N0YXR1cyhkZXYsIHNwZWVkKTsKQEAgLTczMywxNSArMTAwNSwxNSBAQAogCQltZmIgPSBBWF9SWF9DVExfTUZCXzE2Mzg0OwogCX0KIAotCXJ4Y3RsID0gYXNpeF9yZWFkX3J4X2N0bChkZXYpOwotCWFzaXhfd3JpdGVfcnhfY3RsKGRldiwgKHJ4Y3RsICYgfkFYX1JYX0NUTF9NRkJfMTYzODQpIHwgbWZiKTsKKwlyeGN0bCA9IGFzaXhfcmVhZF9yeF9jdGwoZGV2LCAwKTsKKwlhc2l4X3dyaXRlX3J4X2N0bChkZXYsIChyeGN0bCAmIH5BWF9SWF9DVExfTUZCXzE2Mzg0KSB8IG1mYiwgMCk7CiAKLQltZWRpdW0gPSBhc2l4X3JlYWRfbWVkaXVtX3N0YXR1cyhkZXYpOworCW1lZGl1bSA9IGFzaXhfcmVhZF9tZWRpdW1fc3RhdHVzKGRldiwgMCk7CiAJaWYgKGRldi0+bmV0LT5tdHUgPiAxNTAwKQogCQltZWRpdW0gfD0gQVhfTUVESVVNX0pGRTsKIAllbHNlCiAJCW1lZGl1bSAmPSB+QVhfTUVESVVNX0pGRTsKLQlhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgbWVkaXVtKTsKKwlhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgbWVkaXVtLCAwKTsKIAogCWlmIChkZXYtPnJ4X3VyYl9zaXplID4gb2xkX3J4X3VyYl9zaXplKQogCQl1c2JuZXRfdW5saW5rX3J4X3VyYnMoZGV2KTsKQEAgLTc5MCw3ICsxMDYyLDcgQEAKIAl1c2JuZXRfZ2V0X2VuZHBvaW50cyhkZXYsaW50Zik7CiAKIAkvKiBHZXQgdGhlIE1BQyBhZGRyZXNzICovCi0JcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX05PREVfSUQsIDAsIDAsIEVUSF9BTEVOLCBidWYpOworCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9OT0RFX0lELCAwLCAwLCBFVEhfQUxFTiwgYnVmLCAwKTsKIAlpZiAocmV0IDwgMCkgewogCQluZXRkZXZfZGJnKGRldi0+bmV0LCAiRmFpbGVkIHRvIHJlYWQgTUFDIGFkZHJlc3M6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwpAQCAtODExLDEwICsxMDgzLDEwIEBACiAJZGV2LT5uZXQtPmV0aHRvb2xfb3BzID0gJmF4ODgxNzhfZXRodG9vbF9vcHM7CiAKIAkvKiBCbGluayBMRURTIHNvIHVzZXJzIGtub3cgZHJpdmVyIHNhdyBkb25nbGUgKi8KLQlhc2l4X3N3X3Jlc2V0KGRldiwgMCk7CisJYXNpeF9zd19yZXNldChkZXYsIDAsIDApOwogCW1zbGVlcCgxNTApOwogCi0JYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfUFJMIHwgQVhfU1dSRVNFVF9JUFBEKTsKKwlhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9QUkwgfCBBWF9TV1JFU0VUX0lQUEQsIDApOwogCW1zbGVlcCgxNTApOwogCiAJLyogQXNpeCBmcmFtaW5nIHBhY2tzIG11bHRpcGxlIGV0aCBmcmFtZXMgaW50byBhIDJLIHVzYiBidWxrIHRyYW5zZmVyICovCkBAIC04NzcsNyArMTE0OSw3IEBACiAJLnVuYmluZCA9IGF4ODg3NzJfdW5iaW5kLAogCS5zdGF0dXMgPSBhc2l4X3N0YXR1cywKIAkubGlua19yZXNldCA9IGF4ODg3NzJfbGlua19yZXNldCwKLQkucmVzZXQgPSBheDg4NzcyX2xpbmtfcmVzZXQsCisJLnJlc2V0ID0gYXg4ODc3Ml9yZXNldCwKIAkuZmxhZ3MgPSBGTEFHX0VUSEVSIHwgRkxBR19GUkFNSU5HX0FYIHwgRkxBR19MSU5LX0lOVFIgfCBGTEFHX01VTFRJX1BBQ0tFVCwKIAkucnhfZml4dXAgPSBhc2l4X3J4X2ZpeHVwX2NvbW1vbiwKIAkudHhfZml4dXAgPSBhc2l4X3R4X2ZpeHVwLApAQCAtMTAwNSw3ICsxMjc3LDcgQEAKIH0sIHsKIAkvLyBMZW5vdm8gVTJMMTAwUCAxMC8xMDAKIAlVU0JfREVWSUNFICgweDE3ZWYsIDB4NzIwMyksCi0JLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZheDg4NzcyX2luZm8sCisJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJmF4ODg3NzJiX2luZm8sCiB9LCB7CiAJLy8gQVNJWCBBWDg4NzcyQiAxMC8xMDAKIAlVU0JfREVWSUNFICgweDBiOTUsIDB4NzcyYiksCkBAIC0xMDczLDcgKzEzNDUsNyBAQAogfSwgewogCS8vIEFzdXMgVVNCIEV0aGVybmV0IEFkYXB0ZXIKIAlVU0JfREVWSUNFICgweDBiOTUsIDB4N2UyYiksCi0JLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZheDg4NzcyX2luZm8sCisJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJmF4ODg3NzJiX2luZm8sCiB9LCB7CiAJLyogQVNJWCA4ODE3MmEgZGVtbyBib2FyZCAqLwogCVVTQl9ERVZJQ0UoMHgwYjk1LCAweDE3MmEpLApAQCAtMTA5NSw4ICsxMzY3LDggQEAKIAkubmFtZSA9CQlEUklWRVJfTkFNRSwKIAkuaWRfdGFibGUgPQlwcm9kdWN0cywKIAkucHJvYmUgPQl1c2JuZXRfcHJvYmUsCi0JLnN1c3BlbmQgPQl1c2JuZXRfc3VzcGVuZCwKLQkucmVzdW1lID0JdXNibmV0X3Jlc3VtZSwKKwkuc3VzcGVuZCA9CWFzaXhfc3VzcGVuZCwKKwkucmVzdW1lID0JYXNpeF9yZXN1bWUsCiAJLmRpc2Nvbm5lY3QgPQl1c2JuZXRfZGlzY29ubmVjdCwKIAkuc3VwcG9ydHNfYXV0b3N1c3BlbmQgPSAxLAogCS5kaXNhYmxlX2h1Yl9pbml0aWF0ZWRfbHBtID0gMSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9heDg4MTcyYS5jIGIvZHJpdmVycy9uZXQvdXNiL2F4ODgxNzJhLmMKaW5kZXggMTYzYTJjNS4uNDlhM2JjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2F4ODgxNzJhLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2F4ODgxNzJhLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAl9CiAKIAlpZiAobW9kZSAhPSBwcml2LT5vbGRtb2RlKSB7Ci0JCWFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBtb2RlKTsKKwkJYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIG1vZGUsIDApOwogCQlwcml2LT5vbGRtb2RlID0gbW9kZTsKIAkJbmV0ZGV2X2RiZyhuZXRkZXYsICJzcGVlZCAldSBkdXBsZXggJWQsIHNldHRpbmcgbW9kZSB0byAweCUwNHhcbiIsCiAJCQkgICBwaHlkZXYtPnNwZWVkLCBwaHlkZXYtPmR1cGxleCwgbW9kZSk7CkBAIC0xNzYsMTggKzE3NiwxOSBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9JUFBEKTsKKwlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9JUFBELCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnI7CiAKIAltc2xlZXAoMTUwKTsKLQlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9DTEVBUik7CisJcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfQ0xFQVIsIDApOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycjsKIAogCW1zbGVlcCgxNTApOwogCi0JcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIGVtYmRfcGh5ID8gQVhfU1dSRVNFVF9JUFJMIDogQVhfU1dSRVNFVF9JUFBEKTsKKwlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgZW1iZF9waHkgPyBBWF9TV1JFU0VUX0lQUkwgOiBBWF9TV1JFU0VUX0lQUEQsCisJCQkgICAgMCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyOwogCkBAIC0yMTMsNyArMjE0LDcgQEAKIAlkZXYtPmRyaXZlcl9wcml2ID0gcHJpdjsKIAogCS8qIEdldCB0aGUgTUFDIGFkZHJlc3MgKi8KLQlyZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTk9ERV9JRCwgMCwgMCwgRVRIX0FMRU4sIGJ1Zik7CisJcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX05PREVfSUQsIDAsIDAsIEVUSF9BTEVOLCBidWYsIDApOwogCWlmIChyZXQgPCAwKSB7CiAJCW5ldGRldl9lcnIoZGV2LT5uZXQsICJGYWlsZWQgdG8gcmVhZCBNQUMgYWRkcmVzczogJWRcbiIsIHJldCk7CiAJCWdvdG8gZnJlZTsKQEAgLTIyNCw3ICsyMjUsNyBAQAogCWRldi0+bmV0LT5ldGh0b29sX29wcyA9ICZheDg4MTcyYV9ldGh0b29sX29wczsKIAogCS8qIGFyZSB3ZSB1c2luZyB0aGUgaW50ZXJuYWwgb3IgdGhlIGV4dGVybmFsIHBoeT8gKi8KLQlyZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1NXX1BIWV9TVEFUVVMsIDAsIDAsIDEsIGJ1Zik7CisJcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9TV19QSFlfU1RBVFVTLCAwLCAwLCAxLCBidWYsIDApOwogCWlmIChyZXQgPCAwKSB7CiAJCW5ldGRldl9lcnIoZGV2LT5uZXQsICJGYWlsZWQgdG8gcmVhZCBzb2Z0d2FyZSBpbnRlcmZhY2Ugc2VsZWN0aW9uIHJlZ2lzdGVyOiAlZFxuIiwKIAkJCSAgIHJldCk7CkBAIC0zMDMsMjAgKzMwNCwyMCBAQAogCWF4ODgxNzJhX3Jlc2V0X3BoeShkZXYsIHByaXYtPnVzZV9lbWJkcGh5KTsKIAogCW1zbGVlcCgxNTApOwotCXJ4X2N0bCA9IGFzaXhfcmVhZF9yeF9jdGwoZGV2KTsKKwlyeF9jdGwgPSBhc2l4X3JlYWRfcnhfY3RsKGRldiwgMCk7CiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIlJYX0NUTCBpcyAweCUwNHggYWZ0ZXIgc29mdHdhcmUgcmVzZXRcbiIsIHJ4X2N0bCk7Ci0JcmV0ID0gYXNpeF93cml0ZV9yeF9jdGwoZGV2LCAweDAwMDApOworCXJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgMHgwMDAwLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQlyeF9jdGwgPSBhc2l4X3JlYWRfcnhfY3RsKGRldik7CisJcnhfY3RsID0gYXNpeF9yZWFkX3J4X2N0bChkZXYsIDApOwogCW5ldGRldl9kYmcoZGV2LT5uZXQsICJSWF9DVEwgaXMgMHglMDR4IHNldHRpbmcgdG8gMHgwMDAwXG4iLCByeF9jdGwpOwogCiAJbXNsZWVwKDE1MCk7CiAKIAlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9JUEcwLAogCQkJICAgICBBWDg4NzcyX0lQRzBfREVGQVVMVCB8IEFYODg3NzJfSVBHMV9ERUZBVUxULAotCQkJICAgICBBWDg4NzcyX0lQRzJfREVGQVVMVCwgMCwgTlVMTCk7CisJCQkgICAgIEFYODg3NzJfSVBHMl9ERUZBVUxULCAwLCBOVUxMLCAwKTsKIAlpZiAocmV0IDwgMCkgewogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiV3JpdGUgSVBHLElQRzEsSVBHMiBmYWlsZWQ6ICVkXG4iLCByZXQpOwogCQlnb3RvIG91dDsKQEAgLTMyNSwyMCArMzI2LDIwIEBACiAJLyogUmV3cml0ZSBNQUMgYWRkcmVzcyAqLwogCW1lbWNweShkYXRhLT5tYWNfYWRkciwgZGV2LT5uZXQtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTk9ERV9JRCwgMCwgMCwgRVRIX0FMRU4sCi0JCQkgICAgIGRhdGEtPm1hY19hZGRyKTsKKwkJCSAgICAgZGF0YS0+bWFjX2FkZHIsIDApOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAogCS8qIFNldCBSWF9DVEwgdG8gZGVmYXVsdCB2YWx1ZXMgd2l0aCAyayBidWZmZXIsIGFuZCBlbmFibGUgY2FjdHVzICovCi0JcmV0ID0gYXNpeF93cml0ZV9yeF9jdGwoZGV2LCBBWF9ERUZBVUxUX1JYX0NUTCk7CisJcmV0ID0gYXNpeF93cml0ZV9yeF9jdGwoZGV2LCBBWF9ERUZBVUxUX1JYX0NUTCwgMCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcnhfY3RsID0gYXNpeF9yZWFkX3J4X2N0bChkZXYpOworCXJ4X2N0bCA9IGFzaXhfcmVhZF9yeF9jdGwoZGV2LCAwKTsKIAluZXRkZXZfZGJnKGRldi0+bmV0LCAiUlhfQ1RMIGlzIDB4JTA0eCBhZnRlciBhbGwgaW5pdGlhbGl6YXRpb25zXG4iLAogCQkgICByeF9jdGwpOwogCi0JcnhfY3RsID0gYXNpeF9yZWFkX21lZGl1bV9zdGF0dXMoZGV2KTsKKwlyeF9jdGwgPSBhc2l4X3JlYWRfbWVkaXVtX3N0YXR1cyhkZXYsIDApOwogCW5ldGRldl9kYmcoZGV2LT5uZXQsICJNZWRpdW0gU3RhdHVzIGlzIDB4JTA0eCBhZnRlciBhbGwgaW5pdGlhbGl6YXRpb25zXG4iLAogCQkgICByeF9jdGwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvaHNvLmMgYi9kcml2ZXJzL25ldC91c2IvaHNvLmMKaW5kZXggNGI0NDU4Ni4uZTdiNTE2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2hzby5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9oc28uYwpAQCAtNTAsNiArNTAsOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTA4LDIzICsxMTAsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlYnVnZ2luZyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgRF9fKGx2bF8sIGZtdCwgYXJnLi4uKQkJCQlcCi0JZG8gewkJCQkJCVwKLQkJcHJpbnRrKGx2bF8gIlslZDolc106ICIgZm10ICJcbiIsCVwKLQkJICAgICAgIF9fTElORV9fLCBfX2Z1bmNfXywgIyMgYXJnKTsJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRF8obHZsLCBhcmdzLi4uKQkJCQlcCi0JZG8gewkJCQkJCVwKLQkJaWYgKGx2bCAmIGRlYnVnKQkJCVwKLQkJCURfXyhLRVJOX0lORk8sIGFyZ3MpOwkJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRDEoYXJncy4uLikJRF8oMHgwMSwgIyNhcmdzKQotI2RlZmluZSBEMihhcmdzLi4uKQlEXygweDAyLCAjI2FyZ3MpCi0jZGVmaW5lIEQzKGFyZ3MuLi4pCURfKDB4MDQsICMjYXJncykKLSNkZWZpbmUgRDQoYXJncy4uLikJRF8oMHgwOCwgIyNhcmdzKQotI2RlZmluZSBENShhcmdzLi4uKQlEXygweDEwLCAjI2FyZ3MpCisjZGVmaW5lIGhzb19kYmcobHZsLCBmbXQsIC4uLikJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICgobHZsKSAmIGRlYnVnKQkJCQkJCVwKKwkJcHJfaW5mbygiWyVkOiVzXSAiIGZtdCwJCQkJCVwKKwkJCV9fTElORV9fLCBfX2Z1bmNfXywgIyNfX1ZBX0FSR1NfXyk7CQlcCit9IHdoaWxlICgwKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBFbnVtZXJhdG9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02NDksNyArNjQwLDcgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VyaWFsX3RhYmxlX2xvY2ssIGZsYWdzKTsKIAotCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIGZyZWUgc2VyaWFsIGRldmljZXMgaW4gdGFibGVcbiIsIF9fZnVuY19fKTsKKwlwcl9lcnIoIiVzOiBubyBmcmVlIHNlcmlhbCBkZXZpY2VzIGluIHRhYmxlXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC03MDksNyArNzAwLDggQEAKIAl9CiAKIAkvKiBsb2cgYSBtZWFuaW5nZnVsIGV4cGxhbmF0aW9uIG9mIGFuIFVTQiBzdGF0dXMgKi8KLQlEMSgiJXM6IHJlY2VpdmVkIFVTQiBzdGF0dXMgLSAlcyAoJWQpIiwgZnVuY3Rpb24sIGV4cGxhbmF0aW9uLCBzdGF0dXMpOworCWhzb19kYmcoMHgxLCAiJXM6IHJlY2VpdmVkIFVTQiBzdGF0dXMgLSAlcyAoJWQpXG4iLAorCQlmdW5jdGlvbiwgZXhwbGFuYXRpb24sIHN0YXR1cyk7CiB9CiAKIC8qIE5ldHdvcmsgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLwpAQCAtODA4LDcgKzgwMCw3IEBACiAJRFVNUDEoc2tiLT5kYXRhLCBza2ItPmxlbik7CiAJLyogQ29weSBpdCBmcm9tIGtlcm5lbCBtZW1vcnkgdG8gT1VSIG1lbW9yeSAqLwogCW1lbWNweShvZGV2LT5tdXhfYnVsa190eF9idWYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCUQxKCJsZW46ICVkLyVkIiwgc2tiLT5sZW4sIE1VWF9CVUxLX1RYX0JVRl9TSVpFKTsKKwloc29fZGJnKDB4MSwgImxlbjogJWQvJWRcbiIsIHNrYi0+bGVuLCBNVVhfQlVMS19UWF9CVUZfU0laRSk7CiAKIAkvKiBGaWxsIGluIHRoZSBVUkIgZm9yIHNoaXBwaW5nIGl0IG91dC4gKi8KIAl1c2JfZmlsbF9idWxrX3VyYihvZGV2LT5tdXhfYnVsa190eF91cmIsCkBAIC04NzIsNyArODY0LDcgQEAKIAl1bnNpZ25lZCBjaGFyICp0bXBfcnhfYnVmOwogCiAJLyogbG9nIGlmIG5lZWRlZCAqLwotCUQxKCJSeCAlZCBieXRlcyIsIGNvdW50KTsKKwloc29fZGJnKDB4MSwgIlJ4ICVkIGJ5dGVzXG4iLCBjb3VudCk7CiAJRFVNUChpcF9wa3QsIG1pbigxMjgsIChpbnQpY291bnQpKTsKIAogCXdoaWxlIChjb3VudCkgewpAQCAtOTEyLDcgKzkwNCw3IEBACiAJCQkJCQkJCSAgICBmcmFtZV9sZW4pOwogCQkJCWlmICghb2Rldi0+c2tiX3J4X2J1ZikgewogCQkJCQkvKiBXZSBnb3Qgbm8gcmVjZWl2ZSBidWZmZXIuICovCi0JCQkJCUQxKCJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5Iik7CisJCQkJCWhzb19kYmcoMHgxLCAiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CiAJCQkJCW9kZXYtPnJ4X3BhcnNlX3N0YXRlID0gV0FJVF9TWU5DOwogCQkJCQljb250aW51ZTsKIAkJCQl9CkBAIC05NzIsMTEgKzk2NCwxMSBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBXQUlUX1NZTkM6Ci0JCQlEMSgiIFdfUyIpOworCQkJaHNvX2RiZygweDEsICIgV19TXG4iKTsKIAkJCWNvdW50ID0gMDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJRDEoIiAiKTsKKwkJCWhzb19kYmcoMHgxLCAiXG4iKTsKIAkJCWNvdW50LS07CiAJCQlicmVhazsKIAkJfQpAQCAtMTAyMCw3ICsxMDEyLDcgQEAKIAogCS8qIFNhbml0eSBjaGVjayAqLwogCWlmICghb2RldiB8fCAhdGVzdF9iaXQoSFNPX05FVF9SVU5OSU5HLCAmb2Rldi0+ZmxhZ3MpKSB7Ci0JCUQxKCJCVUxLIElOIGNhbGxiYWNrIGJ1dCBkcml2ZXIgaXMgbm90IGFjdGl2ZSEiKTsKKwkJaHNvX2RiZygweDEsICJCVUxLIElOIGNhbGxiYWNrIGJ1dCBkcml2ZXIgaXMgbm90IGFjdGl2ZSFcbiIpOwogCQlyZXR1cm47CiAJfQogCXVzYl9tYXJrX2xhc3RfYnVzeSh1cmItPmRldik7CkBAIC0xMTEyLDExICsxMTA0LDExIEBACiAJc3RydWN0IGhzb19zZXJpYWwgKnNlcmlhbCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKIAlpZiAoIXNlcmlhbCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyB0dHkgc3RydWN0dXJlcyIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlczogbm8gdHR5IHN0cnVjdHVyZXMiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKLQlENCgicG9ydCAlZCIsIHNlcmlhbC0+bWlub3IpOworCWhzb19kYmcoMHg4LCAicG9ydCAlZFxuIiwgc2VyaWFsLT5taW5vcik7CiAKIAkvKgogCSAqCUZpeCB1cCB1bnN1cHBvcnRlZCBiaXRzCkBAIC0xMjA1LDExICsxMTk3LDExIEBACiAJc3RydWN0IGhzb19zZXJpYWwgKnNlcmlhbCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlENCgiXG4tLS0gR290IHNlcmlhbF9yZWFkX2J1bGsgY2FsbGJhY2sgJTAyeCAtLS0iLCBzdGF0dXMpOworCWhzb19kYmcoMHg4LCAiLS0tIEdvdCBzZXJpYWxfcmVhZF9idWxrIGNhbGxiYWNrICUwMnggLS0tXG4iLCBzdGF0dXMpOwogCiAJLyogc2FuaXR5IGNoZWNrICovCiAJaWYgKCFzZXJpYWwpIHsKLQkJRDEoInNlcmlhbCA9PSBOVUxMIik7CisJCWhzb19kYmcoMHgxLCAic2VyaWFsID09IE5VTExcbiIpOwogCQlyZXR1cm47CiAJfQogCWlmIChzdGF0dXMpIHsKQEAgLTEyMTcsNyArMTIwOSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlEMSgiQWN0dWFsIGxlbmd0aCA9ICVkXG4iLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCWhzb19kYmcoMHgxLCAiQWN0dWFsIGxlbmd0aCA9ICVkXG4iLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCURVTVAxKHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCiAJLyogQW55b25lIGxpc3RlbmluZz8gKi8KQEAgLTEyNjYsNyArMTI1OCw3IEBACiAJaWYgKHNlcmlhbCA9PSBOVUxMIHx8IHNlcmlhbC0+bWFnaWMgIT0gSFNPX1NFUklBTF9NQUdJQykgewogCQlXQVJOX09OKDEpOwogCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKLQkJRDEoIkZhaWxlZCB0byBvcGVuIHBvcnQiKTsKKwkJaHNvX2RiZygweDEsICJGYWlsZWQgdG8gb3BlbiBwb3J0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMjc1LDcgKzEyNjcsNyBAQAogCWlmIChyZXN1bHQgPCAwKQogCQlnb3RvIGVycl9vdXQ7CiAKLQlEMSgiT3BlbmluZyAlZCIsIHNlcmlhbC0+bWlub3IpOworCWhzb19kYmcoMHgxLCAiT3BlbmluZyAlZFxuIiwgc2VyaWFsLT5taW5vcik7CiAKIAkvKiBzZXR1cCAqLwogCXR0eS0+ZHJpdmVyX2RhdGEgPSBzZXJpYWw7CkBAIC0xMjk4LDcgKzEyOTAsNyBAQAogCQkJa3JlZl9nZXQoJnNlcmlhbC0+cGFyZW50LT5yZWYpOwogCQl9CiAJfSBlbHNlIHsKLQkJRDEoIlBvcnQgd2FzIGFscmVhZHkgb3BlbiIpOworCQloc29fZGJnKDB4MSwgIlBvcnQgd2FzIGFscmVhZHkgb3BlblxuIik7CiAJfQogCiAJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHNlcmlhbC0+cGFyZW50LT5pbnRlcmZhY2UpOwpAQCAtMTMxNyw3ICsxMzA5LDcgQEAKIAlzdHJ1Y3QgaHNvX3NlcmlhbCAqc2VyaWFsID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1OCB1c2JfZ29uZTsKIAotCUQxKCJDbG9zaW5nIHNlcmlhbCBwb3J0Iik7CisJaHNvX2RiZygweDEsICJDbG9zaW5nIHNlcmlhbCBwb3J0XG4iKTsKIAogCS8qIE9wZW4gZmFpbGVkLCBubyBjbG9zZSBjbGVhbnVwIHJlcXVpcmVkICovCiAJaWYgKHNlcmlhbCA9PSBOVUxMKQpAQCAtMTM1Nyw3ICsxMzQ5LDcgQEAKIAogCS8qIHNhbml0eSBjaGVjayAqLwogCWlmIChzZXJpYWwgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZXJpYWwgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlwcl9lcnIoIiVzOiBzZXJpYWwgaXMgTlVMTFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTE0MTIsOCArMTQwNCw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChvbGQpCi0JCUQ1KCJUZXJtaW9zIGNhbGxlZCB3aXRoOiBjZmxhZ3MgbmV3WyVkXSAtIG9sZFslZF0iLAotCQkgICB0dHktPnRlcm1pb3MuY19jZmxhZywgb2xkLT5jX2NmbGFnKTsKKwkJaHNvX2RiZygweDE2LCAiVGVybWlvcyBjYWxsZWQgd2l0aDogY2ZsYWdzIG5ld1slZF0gLSBvbGRbJWRdXG4iLAorCQkJdHR5LT50ZXJtaW9zLmNfY2ZsYWcsIG9sZC0+Y19jZmxhZyk7CiAKIAkvKiB0aGUgYWN0dWFsIHNldHVwICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNlcmlhbC0+c2VyaWFsX2xvY2ssIGZsYWdzKTsKQEAgLTE2NDksNyArMTY0MSw3IEBACiAKIAkvKiBzYW5pdHkgY2hlY2sgKi8KIAlpZiAoIXNlcmlhbCkgewotCQlEMSgibm8gdHR5IHN0cnVjdHVyZXMiKTsKKwkJaHNvX2RiZygweDEsICJubyB0dHkgc3RydWN0dXJlc1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlzcGluX2xvY2tfaXJxKCZzZXJpYWwtPnNlcmlhbF9sb2NrKTsKQEAgLTE2ODIsNyArMTY3NCw3IEBACiAKIAkvKiBzYW5pdHkgY2hlY2sgKi8KIAlpZiAoIXNlcmlhbCkgewotCQlEMSgibm8gdHR5IHN0cnVjdHVyZXMiKTsKKwkJaHNvX2RiZygweDEsICJubyB0dHkgc3RydWN0dXJlc1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTcyMSw3ICsxNzEzLDcgQEAKIHsKIAlzdHJ1Y3QgaHNvX3NlcmlhbCAqc2VyaWFsID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpbnQgcmV0ID0gMDsKLQlENCgiSU9DVEwgY21kOiAlZCwgYXJnOiAlbGQiLCBjbWQsIGFyZyk7CisJaHNvX2RiZygweDgsICJJT0NUTCBjbWQ6ICVkLCBhcmc6ICVsZFxuIiwgY21kLCBhcmcpOwogCiAJaWYgKCFzZXJpYWwpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTc4Myw3ICsxNzc1LDcgQEAKIAogCS8qIFNhbml0eSBjaGVjayAqLwogCWlmICghc2VyaWFsIHx8ICFjdHJsX3VyYiB8fCAhY3RybF9yZXEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogV3JvbmcgYXJndW1lbnRzXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiJXM6IFdyb25nIGFyZ3VtZW50c1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE4MDgsOSArMTgwMCw5IEBACiAJCXBpcGUgPSB1c2Jfc25kY3RybHBpcGUoc2VyaWFsLT5wYXJlbnQtPnVzYiwgMCk7CiAJfQogCS8qIHN5c2xvZyAqLwotCUQyKCIlcyBjb21tYW5kICglMDJ4KSBsZW46ICVkLCBwb3J0OiAlZCIsCi0JICAgdHlwZSA9PSBVU0JfQ0RDX0dFVF9FTkNBUFNVTEFURURfUkVTUE9OU0UgPyAiUmVhZCIgOiAiV3JpdGUiLAotCSAgIGN0cmxfcmVxLT5iUmVxdWVzdFR5cGUsIGN0cmxfcmVxLT53TGVuZ3RoLCBwb3J0KTsKKwloc29fZGJnKDB4MiwgIiVzIGNvbW1hbmQgKCUwMngpIGxlbjogJWQsIHBvcnQ6ICVkXG4iLAorCQl0eXBlID09IFVTQl9DRENfR0VUX0VOQ0FQU1VMQVRFRF9SRVNQT05TRSA/ICJSZWFkIiA6ICJXcml0ZSIsCisJCWN0cmxfcmVxLT5iUmVxdWVzdFR5cGUsIGN0cmxfcmVxLT53TGVuZ3RoLCBwb3J0KTsKIAogCS8qIExvYWQgY3RybCB1cmIgKi8KIAljdHJsX3VyYi0+dHJhbnNmZXJfZmxhZ3MgPSAwOwpAQCAtMTg3NiwxMSArMTg2OCwxMSBAQAogCQloYW5kbGVfdXNiX2Vycm9yKHN0YXR1cywgX19mdW5jX18sIE5VTEwpOwogCQlyZXR1cm47CiAJfQotCUQ0KCJcbi0tLSBHb3QgaW50ciBjYWxsYmFjayAweCUwMlggLS0tIiwgc3RhdHVzKTsKKwloc29fZGJnKDB4OCwgIi0tLSBHb3QgaW50ciBjYWxsYmFjayAweCUwMlggLS0tXG4iLCBzdGF0dXMpOwogCiAJLyogd2hhdCByZXF1ZXN0PyAqLwogCXBvcnRfcmVxID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0JRDQoIiBwb3J0X3JlcSA9IDB4JS4yWFxuIiwgKnBvcnRfcmVxKTsKKwloc29fZGJnKDB4OCwgInBvcnRfcmVxID0gMHglLjJYXG4iLCAqcG9ydF9yZXEpOwogCS8qIGxvb3Agb3ZlciBhbGwgbXV4ZWQgcG9ydHMgdG8gZmluZCB0aGUgb25lIHNlbmRpbmcgdGhpcyAqLwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkJLyogbWF4IDggY2hhbm5lbHMgb24gTVVYICovCkBAIC0xODg4LDcgKzE4ODAsOCBAQAogCQkJc2VyaWFsID0gZ2V0X3NlcmlhbF9ieV9zaGFyZWRfaW50X2FuZF90eXBlKHNoYXJlZF9pbnQsCiAJCQkJCQkJCSAgICgxIDw8IGkpKTsKIAkJCWlmIChzZXJpYWwgIT0gTlVMTCkgewotCQkJCUQxKCJQZW5kaW5nIHJlYWQgaW50ZXJydXB0IG9uIHBvcnQgJWRcbiIsIGkpOworCQkJCWhzb19kYmcoMHgxLCAiUGVuZGluZyByZWFkIGludGVycnVwdCBvbiBwb3J0ICVkXG4iLAorCQkJCQlpKTsKIAkJCQlzcGluX2xvY2soJnNlcmlhbC0+c2VyaWFsX2xvY2spOwogCQkJCWlmIChzZXJpYWwtPnJ4X3N0YXRlID09IFJYX0lETEUgJiYKIAkJCQkJc2VyaWFsLT5wb3J0LmNvdW50ID4gMCkgewpAQCAtMTkwMCw4ICsxODkzLDggQEAKIAkJCQkJfSBlbHNlCiAJCQkJCQlzZXJpYWwtPnJ4X3N0YXRlID0gUlhfUEVORElORzsKIAkJCQl9IGVsc2UgewotCQkJCQlEMSgiQWxyZWFkeSBhIHJlYWQgcGVuZGluZyBvbiAiCi0JCQkJCSAgICJwb3J0ICVkIG9yIHBvcnQgbm90IG9wZW5cbiIsIGkpOworCQkJCQloc29fZGJnKDB4MSwgIkFscmVhZHkgYSByZWFkIHBlbmRpbmcgb24gcG9ydCAlZCBvciBwb3J0IG5vdCBvcGVuXG4iLAorCQkJCQkJaSk7CiAJCQkJfQogCQkJCXNwaW5fdW5sb2NrKCZzZXJpYWwtPnNlcmlhbF9sb2NrKTsKIAkJCX0KQEAgLTE5MzMsNyArMTkyNiw3IEBACiAKIAkvKiBzYW5pdHkgY2hlY2sgKi8KIAlpZiAoIXNlcmlhbCkgewotCQlEMSgic2VyaWFsID09IE5VTEwiKTsKKwkJaHNvX2RiZygweDEsICJzZXJpYWwgPT0gTlVMTFxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE5NDgsNyArMTk0MSw3IEBACiAJdHR5X3BvcnRfdHR5X3dha2V1cCgmc2VyaWFsLT5wb3J0KTsKIAloc29fa2lja190cmFuc21pdChzZXJpYWwpOwogCi0JRDEoIiAiKTsKKwloc29fZGJnKDB4MSwgIlxuIik7CiB9CiAKIC8qIGNhbGxlZCBmb3Igd3JpdGluZyBkaWFnIG9yIENTIHNlcmlhbCBwb3J0ICovCkBAIC0xOTk2LDggKzE5ODksOCBAQAogCiAJLyogd2hhdCByZXF1ZXN0PyAqLwogCXJlcSA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopKHVyYi0+c2V0dXBfcGFja2V0KTsKLQlENCgiXG4tLS0gR290IG11eGVkIGN0cmwgY2FsbGJhY2sgMHglMDJYIC0tLSIsIHN0YXR1cyk7Ci0JRDQoIkFjdHVhbCBsZW5ndGggb2YgdXJiID0gJWRcbiIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJaHNvX2RiZygweDgsICItLS0gR290IG11eGVkIGN0cmwgY2FsbGJhY2sgMHglMDJYIC0tLVxuIiwgc3RhdHVzKTsKKwloc29fZGJnKDB4OCwgIkFjdHVhbCBsZW5ndGggb2YgdXJiID0gJWRcbiIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJRFVNUDEodXJiLT50cmFuc2Zlcl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAKIAlpZiAocmVxLT5iUmVxdWVzdFR5cGUgPT0KQEAgLTIwMjMsNyArMjAxNiw3IEBACiAKIAkvKiBTYW5pdHkgY2hlY2sgKi8KIAlpZiAodXJiID09IE5VTEwgfHwgc2VyaWFsID09IE5VTEwpIHsKLQkJRDEoInNlcmlhbCA9IE5VTEwiKTsKKwkJaHNvX2RiZygweDEsICJzZXJpYWwgPSBOVUxMXG4iKTsKIAkJcmV0dXJuIC0yOwogCX0KIApAQCAtMjAzNSw3ICsyMDI4LDcgQEAKIAl9CiAKIAkvKiBQdXNoIGRhdGEgdG8gdHR5ICovCi0JRDEoImRhdGEgdG8gcHVzaCB0byB0dHkiKTsKKwloc29fZGJnKDB4MSwgImRhdGEgdG8gcHVzaCB0byB0dHlcbiIpOwogCWNvdW50ID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20oJnNlcmlhbC0+cG9ydCwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAlpZiAoY291bnQgPj0gdXJiLT5hY3R1YWxfbGVuZ3RoKSB7CiAJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcoJnNlcmlhbC0+cG9ydCwgdXJiLT50cmFuc2Zlcl9idWZmZXIsCkBAIC0yMzAwLDEwICsyMjkzLDggQEAKIAlzZXJpYWwtPnJ4X2RhdGFfbGVuZ3RoID0gcnhfc2l6ZTsKIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcnhfdXJiczsgaSsrKSB7CiAJCXNlcmlhbC0+cnhfdXJiW2ldID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFzZXJpYWwtPnJ4X3VyYltpXSkgewotCQkJZGV2X2VycihkZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgdXJiP1xuIik7CisJCWlmICghc2VyaWFsLT5yeF91cmJbaV0pCiAJCQlnb3RvIGV4aXQ7Ci0JCX0KIAkJc2VyaWFsLT5yeF91cmJbaV0tPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CiAJCXNlcmlhbC0+cnhfdXJiW2ldLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gMDsKIAkJc2VyaWFsLT5yeF9kYXRhW2ldID0ga3phbGxvYyhzZXJpYWwtPnJ4X2RhdGFfbGVuZ3RoLApAQCAtMjMxNCwxMCArMjMwNSw4IEBACiAKIAkvKiBUWCwgYWxsb2NhdGUgdXJiIGFuZCBpbml0aWFsaXplICovCiAJc2VyaWFsLT50eF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghc2VyaWFsLT50eF91cmIpIHsKLQkJZGV2X2VycihkZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgdXJiP1xuIik7CisJaWYgKCFzZXJpYWwtPnR4X3VyYikKIAkJZ290byBleGl0OwotCX0KIAlzZXJpYWwtPnR4X3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKIAlzZXJpYWwtPnR4X3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDA7CiAJLyogcHJlcGFyZSBvdXIgVFggYnVmZmVyICovCkBAIC0yNDE5LDcgKzI0MDgsNyBAQAogewogCXN0cnVjdCBoc29fbmV0ICpoc29fbmV0ID0gbmV0ZGV2X3ByaXYobmV0KTsKIAotCUQxKCJzaXplb2YgaHNvX25ldCBpcyAlZCIsIChpbnQpc2l6ZW9mKCpoc29fbmV0KSk7CisJaHNvX2RiZygweDEsICJzaXplb2YgaHNvX25ldCBpcyAlenVcbiIsIHNpemVvZigqaHNvX25ldCkpOwogCiAJLyogZmlsbCBpbiB0aGUgb3RoZXIgZmllbGRzICovCiAJbmV0LT5uZXRkZXZfb3BzID0gJmhzb19uZXRkZXZfb3BzOwpAQCAtMjU1NSwyMCArMjU0NCwxNiBAQAogCS8qIHN0YXJ0IGFsbG9jYXRpbmcgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTVVYX0JVTEtfUlhfQlVGX0NPVU5UOyBpKyspIHsKIAkJaHNvX25ldC0+bXV4X2J1bGtfcnhfdXJiX3Bvb2xbaV0gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQlpZiAoIWhzb19uZXQtPm11eF9idWxrX3J4X3VyYl9wb29sW2ldKSB7Ci0JCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSByeCB1cmJcbiIpOworCQlpZiAoIWhzb19uZXQtPm11eF9idWxrX3J4X3VyYl9wb29sW2ldKQogCQkJZ290byBleGl0OwotCQl9CiAJCWhzb19uZXQtPm11eF9idWxrX3J4X2J1Zl9wb29sW2ldID0ga3phbGxvYyhNVVhfQlVMS19SWF9CVUZfU0laRSwKIAkJCQkJCQkgICBHRlBfS0VSTkVMKTsKIAkJaWYgKCFoc29fbmV0LT5tdXhfYnVsa19yeF9idWZfcG9vbFtpXSkKIAkJCWdvdG8gZXhpdDsKIAl9CiAJaHNvX25ldC0+bXV4X2J1bGtfdHhfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWhzb19uZXQtPm11eF9idWxrX3R4X3VyYikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSB0eCB1cmJcbiIpOworCWlmICghaHNvX25ldC0+bXV4X2J1bGtfdHhfdXJiKQogCQlnb3RvIGV4aXQ7Ci0JfQogCWhzb19uZXQtPm11eF9idWxrX3R4X2J1ZiA9IGt6YWxsb2MoTVVYX0JVTEtfVFhfQlVGX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghaHNvX25ldC0+bXV4X2J1bGtfdHhfYnVmKQogCQlnb3RvIGV4aXQ7CkBAIC0yNzg3LDEwICsyNzcyLDggQEAKIAl9CiAKIAltdXgtPnNoYXJlZF9pbnRyX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtdXgtPnNoYXJlZF9pbnRyX3VyYikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBpbnRyIHVyYj9cbiIpOworCWlmICghbXV4LT5zaGFyZWRfaW50cl91cmIpCiAJCWdvdG8gZXhpdDsKLQl9CiAJbXV4LT5zaGFyZWRfaW50cl9idWYgPQogCQlremFsbG9jKGxlMTZfdG9fY3B1KG11eC0+aW50cl9lbmRwLT53TWF4UGFja2V0U2l6ZSksCiAJCQlHRlBfS0VSTkVMKTsKQEAgLTMyMzksNyArMzIyMiw3IEBACiAJaW50IHJlc3VsdDsKIAogCS8qIHB1dCBpdCBpbiB0aGUgbG9nICovCi0JcHJpbnRrKEtFUk5fSU5GTyAiaHNvOiAlc1xuIiwgdmVyc2lvbik7CisJcHJfaW5mbygiJXNcbiIsIHZlcnNpb24pOwogCiAJLyogSW5pdGlhbGlzZSB0aGUgc2VyaWFsIHRhYmxlIHNlbWFwaG9yZSBhbmQgdGFibGUgKi8KIAlzcGluX2xvY2tfaW5pdCgmc2VyaWFsX3RhYmxlX2xvY2spOwpAQCAtMzI3MCwxNiArMzI1MywxNSBAQAogCS8qIHJlZ2lzdGVyIHRoZSB0dHkgZHJpdmVyICovCiAJcmVzdWx0ID0gdHR5X3JlZ2lzdGVyX2RyaXZlcih0dHlfZHJ2KTsKIAlpZiAocmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMgLSB0dHlfcmVnaXN0ZXJfZHJpdmVyIGZhaWxlZCglZClcbiIsCi0JCQlfX2Z1bmNfXywgcmVzdWx0KTsKKwkJcHJfZXJyKCIlcyAtIHR0eV9yZWdpc3Rlcl9kcml2ZXIgZmFpbGVkKCVkKVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByZXN1bHQpOwogCQlnb3RvIGVycl9mcmVlX3R0eTsKIAl9CiAKIAkvKiByZWdpc3RlciB0aGlzIG1vZHVsZSBhcyBhbiB1c2IgZHJpdmVyICovCiAJcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZoc29fZHJpdmVyKTsKIAlpZiAocmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHJlZ2lzdGVyIGhzbyBkcml2ZXI/IGVycm9yOiAlZFxuIiwKLQkJCXJlc3VsdCk7CisJCXByX2VycigiQ291bGQgbm90IHJlZ2lzdGVyIGhzbyBkcml2ZXIgLSBlcnJvcjogJWRcbiIsIHJlc3VsdCk7CiAJCWdvdG8gZXJyX3VucmVnX3R0eTsKIAl9CiAKQEAgLTMyOTQsNyArMzI3Niw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBoc29fZXhpdCh2b2lkKQogewotCXByaW50ayhLRVJOX0lORk8gImhzbzogdW5sb2FkZWRcbiIpOworCXByX2luZm8oInVubG9hZGVkXG4iKTsKIAogCXR0eV91bnJlZ2lzdGVyX2RyaXZlcih0dHlfZHJ2KTsKIAlwdXRfdHR5X2RyaXZlcih0dHlfZHJ2KTsKQEAgLTMzMTEsNyArMzI5Myw3IEBACiBNT0RVTEVfTElDRU5TRShNT0RfTElDRU5TRSk7CiAKIC8qIGNoYW5nZSB0aGUgZGVidWcgbGV2ZWwgKGVnOiBpbnNtb2QgaHNvLmtvIGRlYnVnPTB4MDQpICovCi1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiTGV2ZWwgb2YgZGVidWcgWzB4MDEgfCAweDAyIHwgMHgwNCB8IDB4MDggfCAweDEwXSIpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImRlYnVnIGxldmVsIG1hc2sgWzB4MDEgfCAweDAyIHwgMHgwNCB8IDB4MDggfCAweDEwXSIpOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKIAogLyogc2V0IHRoZSBtYWpvciB0dHkgbnVtYmVyIChlZzogaW5zbW9kIGhzby5rbyB0dHlfbWFqb3I9MjQ1KSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2thd2V0aC5jIGIvZHJpdmVycy9uZXQvdXNiL2thd2V0aC5jCmluZGV4IDc3MDIxMmIuLjY2YjM0ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9rYXdldGguYworKysgYi9kcml2ZXJzL25ldC91c2Iva2F3ZXRoLmMKQEAgLTI2NSw4ICsyNjUsNiBAQAogCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmRyOwogCWludCByZXR2YWw7CiAKLQluZXRkZXZfZGJnKGthd2V0aC0+bmV0LCAia2F3ZXRoX2NvbnRyb2woKVxuIik7Ci0KIAlpZihpbl9pbnRlcnJ1cHQoKSkgewogCQluZXRkZXZfZGJnKGthd2V0aC0+bmV0LCAiaW5faW50ZXJydXB0KClcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMzAwLDggKzI5OCw2IEBACiB7CiAJaW50IHJldHZhbDsKIAotCW5ldGRldl9kYmcoa2F3ZXRoLT5uZXQsICJSZWFkaW5nIGthd2V0aCBjb25maWd1cmF0aW9uXG4iKTsKLQogCXJldHZhbCA9IGthd2V0aF9jb250cm9sKGthd2V0aCwKIAkJCQl1c2JfcmN2Y3RybHBpcGUoa2F3ZXRoLT5kZXYsIDApLAogCQkJCUtBV0VUSF9DT01NQU5EX0dFVF9FVEhFUk5FVF9ERVNDLApAQCAtNDUxLDggKzQ0Nyw2IEBACiAJa2F3ZXRoLT5maXJtd2FyZV9idWZbNl0gPSAweDAwOwogCWthd2V0aC0+ZmlybXdhcmVfYnVmWzddID0gMHgwMDsKIAotCW5ldGRldl9kYmcoa2F3ZXRoLT5uZXQsICJUcmlnZ2VyaW5nIGZpcm13YXJlXG4iKTsKLQogCXJldHVybiBrYXdldGhfY29udHJvbChrYXdldGgsCiAJCQkgICAgICB1c2Jfc25kY3RybHBpcGUoa2F3ZXRoLT5kZXYsIDApLAogCQkJICAgICAgS0FXRVRIX0NPTU1BTkRfU0NBTiwKQEAgLTQ3MSw3ICs0NjUsNiBAQAogewogCWludCByZXN1bHQ7CiAKLQluZXRkZXZfZGJnKGthd2V0aC0+bmV0LCAia2F3ZXRoX3Jlc2V0KCVwKVxuIiwga2F3ZXRoKTsKIAlyZXN1bHQgPSB1c2JfcmVzZXRfY29uZmlndXJhdGlvbihrYXdldGgtPmRldik7CiAJbWRlbGF5KDEwKTsKIApAQCAtNjg1LDggKzY3OCw2IEBACiAJc3RydWN0IGthd2V0aF9kZXZpY2UgKmthd2V0aCA9IG5ldGRldl9wcml2KG5ldCk7CiAJaW50IHJlczsKIAotCW5ldGRldl9kYmcoa2F3ZXRoLT5uZXQsICJPcGVuaW5nIG5ldHdvcmsgZGV2aWNlLlxuIik7Ci0KIAlyZXMgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2Uoa2F3ZXRoLT5pbnRmKTsKIAlpZiAocmVzKSB7CiAJCWRldl9lcnIoJmthd2V0aC0+aW50Zi0+ZGV2LCAiSW50ZXJmYWNlIGNhbm5vdCBiZSByZXN1bWVkLlxuIik7CkBAIC05NTEsNyArOTQyLDYgQEAKIAlzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqa2F3ZXRoID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGV2X2RiZygmaW50Zi0+ZGV2LCAiU3VzcGVuZGluZyBkZXZpY2VcbiIpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZrYXdldGgtPmRldmljZV9sb2NrLCBmbGFncyk7CiAJa2F3ZXRoLT5zdGF0dXMgfD0gS0FXRVRIX1NUQVRVU19TVVNQRU5ESU5HOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmthd2V0aC0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKQEAgLTk2OCw3ICs5NTgsNiBAQAogCXN0cnVjdCBrYXdldGhfZGV2aWNlICprYXdldGggPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkZXZfZGJnKCZpbnRmLT5kZXYsICJSZXN1bWluZyBkZXZpY2VcbiIpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZrYXdldGgtPmRldmljZV9sb2NrLCBmbGFncyk7CiAJa2F3ZXRoLT5zdGF0dXMgJj0gfktBV0VUSF9TVEFUVVNfU1VTUEVORElORzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrYXdldGgtPmRldmljZV9sb2NrLCBmbGFncyk7CkBAIC0xMDA5LDYgKzk5OCw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAljb25zdCBldGhfYWRkcl90IGJjYXN0X2FkZHIgPSB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfTsKIAlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgcnYgPSAtRUlPOwogCiAJZGV2X2RiZyhkZXYsCiAJCSJLYXdhc2FraSBEZXZpY2UgUHJvYmUgKERldmljZSBudW1iZXI6JWQpOiAweCU0LjR4OjB4JTQuNHg6MHglNC40eFxuIiwKQEAgLTEwMjksNiArMTAxOSw3IEBACiAJa2F3ZXRoID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlrYXdldGgtPmRldiA9IHVkZXY7CiAJa2F3ZXRoLT5uZXQgPSBuZXRkZXY7CisJa2F3ZXRoLT5pbnRmID0gaW50ZjsKIAogCXNwaW5fbG9ja19pbml0KCZrYXdldGgtPmRldmljZV9sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZrYXdldGgtPnRlcm1fd2FpdCk7CkBAIC0xMDQ4LDYgKzEwMzksMTAgQEAKIAkJLyogRG93bmxvYWQgdGhlIGZpcm13YXJlICovCiAJCWRldl9pbmZvKGRldiwgIkRvd25sb2FkaW5nIGZpcm13YXJlLi4uXG4iKTsKIAkJa2F3ZXRoLT5maXJtd2FyZV9idWYgPSAoX191OCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFrYXdldGgtPmZpcm13YXJlX2J1ZikgeworCQkJcnYgPSAtRU5PTUVNOworCQkJZ290byBlcnJfZnJlZV9uZXRkZXY7CisJCX0KIAkJaWYgKChyZXN1bHQgPSBrYXdldGhfZG93bmxvYWRfZmlybXdhcmUoa2F3ZXRoLAogCQkJCQkJICAgICAgImthd2V0aC9uZXdfY29kZS5iaW4iLAogCQkJCQkJICAgICAgMTAwLApAQCAtMTEzOSw4ICsxMTM0LDYgQEAKIAogCWRldl9kYmcoZGV2LCAiSW5pdGlhbGl6aW5nIG5ldCBkZXZpY2UuXG4iKTsKIAotCWthd2V0aC0+aW50ZiA9IGludGY7Ci0KIAlrYXdldGgtPnR4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFrYXdldGgtPnR4X3VyYikKIAkJZ290byBlcnJfZnJlZV9uZXRkZXY7CkBAIC0xMTg2LDggKzExNzksNiBAQAogCWRldl9pbmZvKGRldiwgImthd2V0aCBpbnRlcmZhY2UgY3JlYXRlZCBhdCAlc1xuIiwKIAkJIGthd2V0aC0+bmV0LT5uYW1lKTsKIAotCWRldl9kYmcoZGV2LCAiS2F3ZXRoIHByb2JlIHJldHVybmluZy5cbiIpOwotCiAJcmV0dXJuIDA7CiAKIGVycl9pbnRmZGF0YToKQEAgLTEyMDQsNyArMTE5NSw3IEBACiBlcnJfZnJlZV9uZXRkZXY6CiAJZnJlZV9uZXRkZXYobmV0ZGV2KTsKIAotCXJldHVybiAtRUlPOworCXJldHVybiBydjsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEyMTUsOCArMTIwNiw2IEBACiAJc3RydWN0IGthd2V0aF9kZXZpY2UgKmthd2V0aCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAotCWRldl9pbmZvKCZpbnRmLT5kZXYsICJVbnJlZ2lzdGVyaW5nXG4iKTsKLQogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CiAJaWYgKCFrYXdldGgpIHsKIAkJZGV2X3dhcm4oJmludGYtPmRldiwgInVucmVnaXN0ZXJpbmcgbm9uLWV4aXN0ZW50IGRldmljZVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvbGFuNzh4eC5jIGIvZHJpdmVycy9uZXQvdXNiL2xhbjc4eHguYwppbmRleCA2YTlkNDc0Li5kYjU1OGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvbGFuNzh4eC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9sYW43OHh4LmMKQEAgLTExNzksNyArMTE3OSw3IEBACiAgKiBOT1RFOiAgYW5ub3lpbmcgYXN5bW1ldHJ5OiAgaWYgaXQncyBhY3RpdmUsIHNjaGVkdWxlX3dvcmsoKSBmYWlscywKICAqIGJ1dCB0YXNrbGV0X3NjaGVkdWxlKCkgZG9lc24ndC4JaG9wZSB0aGUgZmFpbHVyZSBpcyByYXJlLgogICovCi12b2lkIGxhbjc4eHhfZGVmZXJfa2V2ZW50KHN0cnVjdCBsYW43OHh4X25ldCAqZGV2LCBpbnQgd29yaykKK3N0YXRpYyB2b2lkIGxhbjc4eHhfZGVmZXJfa2V2ZW50KHN0cnVjdCBsYW43OHh4X25ldCAqZGV2LCBpbnQgd29yaykKIHsKIAlzZXRfYml0KHdvcmssICZkZXYtPmZsYWdzKTsKIAlpZiAoIXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGV2LT53cSwgMCkpCkBAIC0xNDA2LDcgKzE0MDYsNyBAQAogCXJldHVybiBuZXQtPnBoeWRldi0+bGluazsKIH0KIAotaW50IGxhbjc4eHhfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQorc3RhdGljIGludCBsYW43OHh4X253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKIHsKIAlyZXR1cm4gcGh5X3N0YXJ0X2FuZWcobmV0LT5waHlkZXYpOwogfQpAQCAtMTk5Nyw3ICsxOTk3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGxhbjc4eHhfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHZvaWQgKnApCitzdGF0aWMgaW50IGxhbjc4eHhfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHZvaWQgKnApCiB7CiAJc3RydWN0IGxhbjc4eHhfbmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CkBAIC0yMzcxLDcgKzIzNzEsNyBAQAogCXJlbW92ZV93YWl0X3F1ZXVlKCZ1bmxpbmtfd2FrZXVwLCAmd2FpdCk7CiB9CiAKLWludCBsYW43OHh4X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3N0YXRpYyBpbnQgbGFuNzh4eF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCiB7CiAJc3RydWN0IGxhbjc4eHhfbmV0CQkqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKIApAQCAtMjUzMyw3ICsyNTMzLDggQEAKIAllbnRyeS0+c3RhdGUgPSBzdGF0ZTsKIH0KIAotbmV0ZGV2X3R4X3QgbGFuNzh4eF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCitzdGF0aWMgbmV0ZGV2X3R4X3QKK2xhbjc4eHhfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewogCXN0cnVjdCBsYW43OHh4X25ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IE5VTEw7CkBAIC0yNTYyLDcgKzI1NjMsOCBAQAogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKLWludCBsYW43OHh4X2dldF9lbmRwb2ludHMoc3RydWN0IGxhbjc4eHhfbmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIGludAorbGFuNzh4eF9nZXRfZW5kcG9pbnRzKHN0cnVjdCBsYW43OHh4X25ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlpbnQgdG1wOwogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdCA9IE5VTEw7CkBAIC0yNzAwLDcgKzI3MDIsNyBAQAogCX0KIH0KIAotdm9pZCBsYW43OHh4X3NrYl9yZXR1cm4oc3RydWN0IGxhbjc4eHhfbmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCBsYW43OHh4X3NrYl9yZXR1cm4oc3RydWN0IGxhbjc4eHhfbmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaW50CQlzdGF0dXM7CiAKQEAgLTMwMDIsMTAgKzMwMDQsOCBAQAogCiBnc29fc2tiOgogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF1cmIpIHsKLQkJbmV0aWZfZGJnKGRldiwgdHhfZXJyLCBkZXYtPm5ldCwgIm5vIHVyYlxuIik7CisJaWYgKCF1cmIpCiAJCWdvdG8gZHJvcDsKLQl9CiAKIAllbnRyeSA9IChzdHJ1Y3Qgc2tiX2RhdGEgKilza2ItPmNiOwogCWVudHJ5LT51cmIgPSB1cmI7CkBAIC0zMjg1LDcgKzMyODUsNyBAQAogCXVzYl9wdXRfZGV2KHVkZXYpOwogfQogCi12b2lkIGxhbjc4eHhfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQorc3RhdGljIHZvaWQgbGFuNzh4eF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCiB7CiAJc3RydWN0IGxhbjc4eHhfbmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwogCkBAIC0zNjA1LDcgKzM2MDUsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgbGFuNzh4eF9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3N0YXRpYyBpbnQgbGFuNzh4eF9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKIHsKIAlzdHJ1Y3QgbGFuNzh4eF9uZXQgKmRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJc3RydWN0IGxhbjc4eHhfcHJpdiAqcGRhdGEgPSAoc3RydWN0IGxhbjc4eHhfcHJpdiAqKShkZXYtPmRhdGFbMF0pOwpAQCAtMzcwMSw3ICszNzAxLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgbGFuNzh4eF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCitzdGF0aWMgaW50IGxhbjc4eHhfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCXN0cnVjdCBsYW43OHh4X25ldCAqZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMzc2OCw3ICszNzY4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGxhbjc4eHhfcmVzZXRfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIGludCBsYW43OHh4X3Jlc2V0X3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgbGFuNzh4eF9uZXQgKmRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMgYi9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5jCmluZGV4IDliYmUwMTYxLi4xNDM0ZTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMKQEAgLTExMjksNyArMTEyOSw4IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKHBlZ2FzdXNfY291bnQgPT0gMCkgewotCQlwZWdhc3VzX3dvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJwZWdhc3VzIik7CisJCXBlZ2FzdXNfd29ya3F1ZXVlID0gYWxsb2Nfd29ya3F1ZXVlKCJwZWdhc3VzIiwgV1FfTUVNX1JFQ0xBSU0sCisJCQkJCQkgICAgMCk7CiAJCWlmICghcGVnYXN1c193b3JrcXVldWUpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvcjgxNTIuYyBiL2RyaXZlcnMvbmV0L3VzYi9yODE1Mi5jCmluZGV4IGY0MWE4YWQuLjQ0ZDQzOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9yODE1Mi5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9yODE1Mi5jCkBAIC0zMiw3ICszMiw3IEBACiAjZGVmaW5lIE5FVE5FWFRfVkVSU0lPTgkJIjA4IgogCiAvKiBJbmZvcm1hdGlvbiBmb3IgbmV0ICovCi0jZGVmaW5lIE5FVF9WRVJTSU9OCQkiNSIKKyNkZWZpbmUgTkVUX1ZFUlNJT04JCSI2IgogCiAjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkidjEuIiBORVRORVhUX1ZFUlNJT04gIi4iIE5FVF9WRVJTSU9OCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIlJlYWx0ZWsgbGludXggbmljIG1haW50YWluZXJzIDxuaWNfc3dzZEByZWFsdGVrLmNvbT4iCkBAIC0xMDc2LDggKzEwNzYsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAlpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIgfHwgb2JqLT5zdHJpbmcubGVuZ3RoICE9IDB4MTcpIHsKIAkJbmV0aWZfd2Fybih0cCwgcHJvYmUsIHRwLT5uZXRkZXYsCi0JCQkgICAiSW52YWxpZCBidWZmZXIgd2hlbiByZWFkaW5nIHBhc3MtdGhydSBNQUMgYWRkcjogIgotCQkJICAgIiglZCwgJWQpXG4iLAorCQkJICAgIkludmFsaWQgYnVmZmVyIGZvciBwYXNzLXRocnUgTUFDIGFkZHI6ICglZCwgJWQpXG4iLAogCQkJICAgb2JqLT50eXBlLCBvYmotPnN0cmluZy5sZW5ndGgpOwogCQlnb3RvIGFtYWNvdXQ7CiAJfQpAQCAtMTA5MCw4ICsxMDg5LDggQEAKIAlyZXQgPSBoZXgyYmluKGJ1Ziwgb2JqLT5zdHJpbmcucG9pbnRlciArIDksIDYpOwogCWlmICghKHJldCA9PSAwICYmIGlzX3ZhbGlkX2V0aGVyX2FkZHIoYnVmKSkpIHsKIAkJbmV0aWZfd2Fybih0cCwgcHJvYmUsIHRwLT5uZXRkZXYsCi0JCQkgICAiSW52YWxpZCBNQUMgd2hlbiByZWFkaW5nIHBhc3MtdGhydSBNQUMgYWRkcjogIgotCQkJICAgIiVkLCAlcE1cbiIsIHJldCwgYnVmKTsKKwkJCSAgICJJbnZhbGlkIE1BQyBmb3IgcGFzcy10aHJ1IE1BQyBhZGRyOiAlZCwgJXBNXG4iLAorCQkJICAgcmV0LCBidWYpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGFtYWNvdXQ7CiAJfQpAQCAtMTExMSw5ICsxMTEwLDkgQEAKIAlzdHJ1Y3Qgc29ja2FkZHIgc2E7CiAJaW50IHJldDsKIAotCWlmICh0cC0+dmVyc2lvbiA9PSBSVExfVkVSXzAxKQorCWlmICh0cC0+dmVyc2lvbiA9PSBSVExfVkVSXzAxKSB7CiAJCXJldCA9IHBsYV9vY3BfcmVhZCh0cCwgUExBX0lEUiwgOCwgc2Euc2FfZGF0YSk7Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogaWYgdGhpcyBpcyBub3QgYW4gUlRMODE1My1BRCwgbm8gZUZ1c2UgbWFjIHBhc3MgdGhydSBzZXQsCiAJCSAqIG9yIHN5c3RlbSBkb2Vzbid0IHByb3ZpZGUgdmFsaWQgX1NCLkFNQUMgdGhpcyB3aWxsIGJlCiAJCSAqIGJlIGV4cGVjdGVkIHRvIG5vbi16ZXJvCkBAIC0yNTUyLDYgKzI1NTEsNzcgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCByODE1Ml9tbWRfaW5kaXJlY3Qoc3RydWN0IHI4MTUyICp0cCwgdTE2IGRldiwgdTE2IHJlZykKK3sKKwlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0FSLCBGVU5fQUREUiB8IGRldik7CisJb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9EQVRBLCByZWcpOworCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQVIsIEZVTl9EQVRBIHwgZGV2KTsKK30KKworc3RhdGljIHUxNiByODE1Ml9tbWRfcmVhZChzdHJ1Y3QgcjgxNTIgKnRwLCB1MTYgZGV2LCB1MTYgcmVnKQoreworCXUxNiBkYXRhOworCisJcjgxNTJfbW1kX2luZGlyZWN0KHRwLCBkZXYsIHJlZyk7CisJZGF0YSA9IG9jcF9yZWdfcmVhZCh0cCwgT0NQX0VFRV9EQVRBKTsKKwlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0FSLCAweDAwMDApOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIHI4MTUyX21tZF93cml0ZShzdHJ1Y3QgcjgxNTIgKnRwLCB1MTYgZGV2LCB1MTYgcmVnLCB1MTYgZGF0YSkKK3sKKwlyODE1Ml9tbWRfaW5kaXJlY3QodHAsIGRldiwgcmVnKTsKKwlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0RBVEEsIGRhdGEpOworCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQVIsIDB4MDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIHI4MTUyX2VlZV9lbihzdHJ1Y3QgcjgxNTIgKnRwLCBib29sIGVuYWJsZSkKK3sKKwl1MTYgY29uZmlnMSwgY29uZmlnMiwgY29uZmlnMzsKKwl1MzIgb2NwX2RhdGE7CisKKwlvY3BfZGF0YSA9IG9jcF9yZWFkX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX0VFRV9DUik7CisJY29uZmlnMSA9IG9jcF9yZWdfcmVhZCh0cCwgT0NQX0VFRV9DT05GSUcxKSAmIH5zZF9yaXNlX3RpbWVfbWFzazsKKwljb25maWcyID0gb2NwX3JlZ19yZWFkKHRwLCBPQ1BfRUVFX0NPTkZJRzIpOworCWNvbmZpZzMgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9FRUVfQ09ORklHMykgJiB+ZmFzdF9zbnJfbWFzazsKKworCWlmIChlbmFibGUpIHsKKwkJb2NwX2RhdGEgfD0gRUVFX1JYX0VOIHwgRUVFX1RYX0VOOworCQljb25maWcxIHw9IEVFRV8xMF9DQVAgfCBFRUVfTldBWV9FTiB8IFRYX1FVSUVUX0VOIHwgUlhfUVVJRVRfRU47CisJCWNvbmZpZzEgfD0gc2RfcmlzZV90aW1lKDEpOworCQljb25maWcyIHw9IFJHX0RBQ1FVSUVUX0VOIHwgUkdfTERWUVVJRVRfRU47CisJCWNvbmZpZzMgfD0gZmFzdF9zbnIoNDIpOworCX0gZWxzZSB7CisJCW9jcF9kYXRhICY9IH4oRUVFX1JYX0VOIHwgRUVFX1RYX0VOKTsKKwkJY29uZmlnMSAmPSB+KEVFRV8xMF9DQVAgfCBFRUVfTldBWV9FTiB8IFRYX1FVSUVUX0VOIHwKKwkJCSAgICAgUlhfUVVJRVRfRU4pOworCQljb25maWcxIHw9IHNkX3Jpc2VfdGltZSg3KTsKKwkJY29uZmlnMiAmPSB+KFJHX0RBQ1FVSUVUX0VOIHwgUkdfTERWUVVJRVRfRU4pOworCQljb25maWczIHw9IGZhc3Rfc25yKDUxMSk7CisJfQorCisJb2NwX3dyaXRlX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX0VFRV9DUiwgb2NwX2RhdGEpOworCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQ09ORklHMSwgY29uZmlnMSk7CisJb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9DT05GSUcyLCBjb25maWcyKTsKKwlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0NPTkZJRzMsIGNvbmZpZzMpOworfQorCitzdGF0aWMgdm9pZCByODE1MmJfZW5hYmxlX2VlZShzdHJ1Y3QgcjgxNTIgKnRwKQoreworCXI4MTUyX2VlZV9lbih0cCwgdHJ1ZSk7CisJcjgxNTJfbW1kX3dyaXRlKHRwLCBNRElPX01NRF9BTiwgTURJT19BTl9FRUVfQURWLCBNRElPX0VFRV8xMDBUWCk7Cit9CisKK3N0YXRpYyB2b2lkIHI4MTUyYl9lbmFibGVfZmMoc3RydWN0IHI4MTUyICp0cCkKK3sKKwl1MTYgYW5hcjsKKworCWFuYXIgPSByODE1Ml9tZGlvX3JlYWQodHAsIE1JSV9BRFZFUlRJU0UpOworCWFuYXIgfD0gQURWRVJUSVNFX1BBVVNFX0NBUCB8IEFEVkVSVElTRV9QQVVTRV9BU1lNOworCXI4MTUyX21kaW9fd3JpdGUodHAsIE1JSV9BRFZFUlRJU0UsIGFuYXIpOworfQorCiBzdGF0aWMgdm9pZCBydGw4MTUyX2Rpc2FibGUoc3RydWN0IHI4MTUyICp0cCkKIHsKIAlyODE1Ml9hbGRwc19lbih0cCwgZmFsc2UpOwpAQCAtMjU2MSwxMyArMjYzMSw5IEBACiAKIHN0YXRpYyB2b2lkIHI4MTUyYl9od19waHlfY2ZnKHN0cnVjdCByODE1MiAqdHApCiB7Ci0JdTE2IGRhdGE7Ci0KLQlkYXRhID0gcjgxNTJfbWRpb19yZWFkKHRwLCBNSUlfQk1DUik7Ci0JaWYgKGRhdGEgJiBCTUNSX1BET1dOKSB7Ci0JCWRhdGEgJj0gfkJNQ1JfUERPV047Ci0JCXI4MTUyX21kaW9fd3JpdGUodHAsIE1JSV9CTUNSLCBkYXRhKTsKLQl9CisJcjgxNTJiX2VuYWJsZV9lZWUodHApOworCXI4MTUyX2FsZHBzX2VuKHRwLCB0cnVlKTsKKwlyODE1MmJfZW5hYmxlX2ZjKHRwKTsKIAogCXNldF9iaXQoUEhZX1JFU0VULCAmdHAtPmZsYWdzKTsKIH0KQEAgLTI3MDEsMjAgKzI3NjcsNTIgQEAKIAlvY3Bfd3JpdGVfZHdvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1JDUiwgb2NwX2RhdGEpOwogfQogCitzdGF0aWMgdm9pZCByODE1M19hbGRwc19lbihzdHJ1Y3QgcjgxNTIgKnRwLCBib29sIGVuYWJsZSkKK3sKKwl1MTYgZGF0YTsKKworCWRhdGEgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9QT1dFUl9DRkcpOworCWlmIChlbmFibGUpIHsKKwkJZGF0YSB8PSBFTl9BTERQUzsKKwkJb2NwX3JlZ193cml0ZSh0cCwgT0NQX1BPV0VSX0NGRywgZGF0YSk7CisJfSBlbHNlIHsKKwkJZGF0YSAmPSB+RU5fQUxEUFM7CisJCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9QT1dFUl9DRkcsIGRhdGEpOworCQltc2xlZXAoMjApOworCX0KK30KKworc3RhdGljIHZvaWQgcjgxNTNfZWVlX2VuKHN0cnVjdCByODE1MiAqdHAsIGJvb2wgZW5hYmxlKQoreworCXUzMiBvY3BfZGF0YTsKKwl1MTYgY29uZmlnOworCisJb2NwX2RhdGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9FRUVfQ1IpOworCWNvbmZpZyA9IG9jcF9yZWdfcmVhZCh0cCwgT0NQX0VFRV9DRkcpOworCisJaWYgKGVuYWJsZSkgeworCQlvY3BfZGF0YSB8PSBFRUVfUlhfRU4gfCBFRUVfVFhfRU47CisJCWNvbmZpZyB8PSBFRUUxMF9FTjsKKwl9IGVsc2UgeworCQlvY3BfZGF0YSAmPSB+KEVFRV9SWF9FTiB8IEVFRV9UWF9FTik7CisJCWNvbmZpZyAmPSB+RUVFMTBfRU47CisJfQorCisJb2NwX3dyaXRlX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX0VFRV9DUiwgb2NwX2RhdGEpOworCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQ0ZHLCBjb25maWcpOworfQorCiBzdGF0aWMgdm9pZCByODE1M19od19waHlfY2ZnKHN0cnVjdCByODE1MiAqdHApCiB7CiAJdTMyIG9jcF9kYXRhOwogCXUxNiBkYXRhOwogCi0JaWYgKHRwLT52ZXJzaW9uID09IFJUTF9WRVJfMDMgfHwgdHAtPnZlcnNpb24gPT0gUlRMX1ZFUl8wNCB8fAotCSAgICB0cC0+dmVyc2lvbiA9PSBSVExfVkVSXzA1KQotCQlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfQURDX0NGRywgQ0tBRFNFTF9MIHwgQURDX0VOIHwgRU5fRU1JX0wpOworCS8qIGRpc2FibGUgQUxEUFMgYmVmb3JlIHVwZGF0aW5nIHRoZSBQSFkgcGFyYW1ldGVycyAqLworCXI4MTUzX2FsZHBzX2VuKHRwLCBmYWxzZSk7CiAKLQlkYXRhID0gcjgxNTJfbWRpb19yZWFkKHRwLCBNSUlfQk1DUik7Ci0JaWYgKGRhdGEgJiBCTUNSX1BET1dOKSB7Ci0JCWRhdGEgJj0gfkJNQ1JfUERPV047Ci0JCXI4MTUyX21kaW9fd3JpdGUodHAsIE1JSV9CTUNSLCBkYXRhKTsKLQl9CisJLyogZGlzYWJsZSBFRUUgYmVmb3JlIHVwZGF0aW5nIHRoZSBQSFkgcGFyYW1ldGVycyAqLworCXI4MTUzX2VlZV9lbih0cCwgZmFsc2UpOworCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQURWLCAwKTsKIAogCWlmICh0cC0+dmVyc2lvbiA9PSBSVExfVkVSXzAzKSB7CiAJCWRhdGEgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9FRUVfQ0ZHKTsKQEAgLTI3NDUsNiArMjg0MywxMiBAQAogCXNyYW1fd3JpdGUodHAsIFNSQU1fMTBNX0FNUDEsIDB4MDBhZik7CiAJc3JhbV93cml0ZSh0cCwgU1JBTV8xME1fQU1QMiwgMHgwMjA4KTsKIAorCXI4MTUzX2VlZV9lbih0cCwgdHJ1ZSk7CisJb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9BRFYsIE1ESU9fRUVFXzEwMDBUIHwgTURJT19FRUVfMTAwVFgpOworCisJcjgxNTNfYWxkcHNfZW4odHAsIHRydWUpOworCXI4MTUyYl9lbmFibGVfZmModHApOworCiAJc2V0X2JpdChQSFlfUkVTRVQsICZ0cC0+ZmxhZ3MpOwogfQogCkBAIC0yODY2LDIxICsyOTcwLDYgQEAKIAlvY3Bfd3JpdGVfZHdvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1JDUiwgb2NwX2RhdGEpOwogfQogCi1zdGF0aWMgdm9pZCByODE1M19hbGRwc19lbihzdHJ1Y3QgcjgxNTIgKnRwLCBib29sIGVuYWJsZSkKLXsKLQl1MTYgZGF0YTsKLQotCWRhdGEgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9QT1dFUl9DRkcpOwotCWlmIChlbmFibGUpIHsKLQkJZGF0YSB8PSBFTl9BTERQUzsKLQkJb2NwX3JlZ193cml0ZSh0cCwgT0NQX1BPV0VSX0NGRywgZGF0YSk7Ci0JfSBlbHNlIHsKLQkJZGF0YSAmPSB+RU5fQUxEUFM7Ci0JCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9QT1dFUl9DRkcsIGRhdGEpOwotCQltc2xlZXAoMjApOwotCX0KLX0KLQogc3RhdGljIHZvaWQgcnRsODE1M19kaXNhYmxlKHN0cnVjdCByODE1MiAqdHApCiB7CiAJcjgxNTNfYWxkcHNfZW4odHAsIGZhbHNlKTsKQEAgLTMyNDYsMTAzICszMzM1LDYgQEAKIAlyZXR1cm4gcmVzOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcjgxNTJfbW1kX2luZGlyZWN0KHN0cnVjdCByODE1MiAqdHAsIHUxNiBkZXYsIHUxNiByZWcpCi17Ci0Jb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9BUiwgRlVOX0FERFIgfCBkZXYpOwotCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfREFUQSwgcmVnKTsKLQlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0FSLCBGVU5fREFUQSB8IGRldik7Ci19Ci0KLXN0YXRpYyB1MTYgcjgxNTJfbW1kX3JlYWQoc3RydWN0IHI4MTUyICp0cCwgdTE2IGRldiwgdTE2IHJlZykKLXsKLQl1MTYgZGF0YTsKLQotCXI4MTUyX21tZF9pbmRpcmVjdCh0cCwgZGV2LCByZWcpOwotCWRhdGEgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9FRUVfREFUQSk7Ci0Jb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9BUiwgMHgwMDAwKTsKLQotCXJldHVybiBkYXRhOwotfQotCi1zdGF0aWMgdm9pZCByODE1Ml9tbWRfd3JpdGUoc3RydWN0IHI4MTUyICp0cCwgdTE2IGRldiwgdTE2IHJlZywgdTE2IGRhdGEpCi17Ci0JcjgxNTJfbW1kX2luZGlyZWN0KHRwLCBkZXYsIHJlZyk7Ci0Jb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9EQVRBLCBkYXRhKTsKLQlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0FSLCAweDAwMDApOwotfQotCi1zdGF0aWMgdm9pZCByODE1Ml9lZWVfZW4oc3RydWN0IHI4MTUyICp0cCwgYm9vbCBlbmFibGUpCi17Ci0JdTE2IGNvbmZpZzEsIGNvbmZpZzIsIGNvbmZpZzM7Ci0JdTMyIG9jcF9kYXRhOwotCi0Jb2NwX2RhdGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9FRUVfQ1IpOwotCWNvbmZpZzEgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9FRUVfQ09ORklHMSkgJiB+c2RfcmlzZV90aW1lX21hc2s7Ci0JY29uZmlnMiA9IG9jcF9yZWdfcmVhZCh0cCwgT0NQX0VFRV9DT05GSUcyKTsKLQljb25maWczID0gb2NwX3JlZ19yZWFkKHRwLCBPQ1BfRUVFX0NPTkZJRzMpICYgfmZhc3Rfc25yX21hc2s7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCW9jcF9kYXRhIHw9IEVFRV9SWF9FTiB8IEVFRV9UWF9FTjsKLQkJY29uZmlnMSB8PSBFRUVfMTBfQ0FQIHwgRUVFX05XQVlfRU4gfCBUWF9RVUlFVF9FTiB8IFJYX1FVSUVUX0VOOwotCQljb25maWcxIHw9IHNkX3Jpc2VfdGltZSgxKTsKLQkJY29uZmlnMiB8PSBSR19EQUNRVUlFVF9FTiB8IFJHX0xEVlFVSUVUX0VOOwotCQljb25maWczIHw9IGZhc3Rfc25yKDQyKTsKLQl9IGVsc2UgewotCQlvY3BfZGF0YSAmPSB+KEVFRV9SWF9FTiB8IEVFRV9UWF9FTik7Ci0JCWNvbmZpZzEgJj0gfihFRUVfMTBfQ0FQIHwgRUVFX05XQVlfRU4gfCBUWF9RVUlFVF9FTiB8Ci0JCQkgICAgIFJYX1FVSUVUX0VOKTsKLQkJY29uZmlnMSB8PSBzZF9yaXNlX3RpbWUoNyk7Ci0JCWNvbmZpZzIgJj0gfihSR19EQUNRVUlFVF9FTiB8IFJHX0xEVlFVSUVUX0VOKTsKLQkJY29uZmlnMyB8PSBmYXN0X3Nucig1MTEpOwotCX0KLQotCW9jcF93cml0ZV93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9FRUVfQ1IsIG9jcF9kYXRhKTsKLQlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0NPTkZJRzEsIGNvbmZpZzEpOwotCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQ09ORklHMiwgY29uZmlnMik7Ci0Jb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9DT05GSUczLCBjb25maWczKTsKLX0KLQotc3RhdGljIHZvaWQgcjgxNTJiX2VuYWJsZV9lZWUoc3RydWN0IHI4MTUyICp0cCkKLXsKLQlyODE1Ml9lZWVfZW4odHAsIHRydWUpOwotCXI4MTUyX21tZF93cml0ZSh0cCwgTURJT19NTURfQU4sIE1ESU9fQU5fRUVFX0FEViwgTURJT19FRUVfMTAwVFgpOwotfQotCi1zdGF0aWMgdm9pZCByODE1M19lZWVfZW4oc3RydWN0IHI4MTUyICp0cCwgYm9vbCBlbmFibGUpCi17Ci0JdTMyIG9jcF9kYXRhOwotCXUxNiBjb25maWc7Ci0KLQlvY3BfZGF0YSA9IG9jcF9yZWFkX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX0VFRV9DUik7Ci0JY29uZmlnID0gb2NwX3JlZ19yZWFkKHRwLCBPQ1BfRUVFX0NGRyk7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCW9jcF9kYXRhIHw9IEVFRV9SWF9FTiB8IEVFRV9UWF9FTjsKLQkJY29uZmlnIHw9IEVFRTEwX0VOOwotCX0gZWxzZSB7Ci0JCW9jcF9kYXRhICY9IH4oRUVFX1JYX0VOIHwgRUVFX1RYX0VOKTsKLQkJY29uZmlnICY9IH5FRUUxMF9FTjsKLQl9Ci0KLQlvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfRUVFX0NSLCBvY3BfZGF0YSk7Ci0Jb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9DRkcsIGNvbmZpZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHI4MTUzX2VuYWJsZV9lZWUoc3RydWN0IHI4MTUyICp0cCkKLXsKLQlyODE1M19lZWVfZW4odHAsIHRydWUpOwotCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQURWLCBNRElPX0VFRV8xMDAwVCB8IE1ESU9fRUVFXzEwMFRYKTsKLX0KLQotc3RhdGljIHZvaWQgcjgxNTJiX2VuYWJsZV9mYyhzdHJ1Y3QgcjgxNTIgKnRwKQotewotCXUxNiBhbmFyOwotCi0JYW5hciA9IHI4MTUyX21kaW9fcmVhZCh0cCwgTUlJX0FEVkVSVElTRSk7Ci0JYW5hciB8PSBBRFZFUlRJU0VfUEFVU0VfQ0FQIHwgQURWRVJUSVNFX1BBVVNFX0FTWU07Ci0JcjgxNTJfbWRpb193cml0ZSh0cCwgTUlJX0FEVkVSVElTRSwgYW5hcik7Ci19Ci0KIHN0YXRpYyB2b2lkIHJ0bF90YWxseV9yZXNldChzdHJ1Y3QgcjgxNTIgKnRwKQogewogCXUzMiBvY3BfZGF0YTsKQEAgLTMzNTUsMTAgKzMzNDcsMTcgQEAKIHN0YXRpYyB2b2lkIHI4MTUyYl9pbml0KHN0cnVjdCByODE1MiAqdHApCiB7CiAJdTMyIG9jcF9kYXRhOworCXUxNiBkYXRhOwogCiAJaWYgKHRlc3RfYml0KFJUTDgxNTJfVU5QTFVHLCAmdHAtPmZsYWdzKSkKIAkJcmV0dXJuOwogCisJZGF0YSA9IHI4MTUyX21kaW9fcmVhZCh0cCwgTUlJX0JNQ1IpOworCWlmIChkYXRhICYgQk1DUl9QRE9XTikgeworCQlkYXRhICY9IH5CTUNSX1BET1dOOworCQlyODE1Ml9tZGlvX3dyaXRlKHRwLCBNSUlfQk1DUiwgZGF0YSk7CisJfQorCiAJcjgxNTJfYWxkcHNfZW4odHAsIGZhbHNlKTsKIAogCWlmICh0cC0+dmVyc2lvbiA9PSBSVExfVkVSXzAxKSB7CkBAIC0zMzgwLDkgKzMzNzksNiBAQAogCQkgICBTUERXTl9SWERWX01TSyB8IFNQRFdOX0xJTktDSEdfTVNLOwogCW9jcF93cml0ZV93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9HUEhZX0lOVFJfSU1SLCBvY3BfZGF0YSk7CiAKLQlyODE1MmJfZW5hYmxlX2VlZSh0cCk7Ci0JcjgxNTJfYWxkcHNfZW4odHAsIHRydWUpOwotCXI4MTUyYl9lbmFibGVfZmModHApOwogCXJ0bF90YWxseV9yZXNldCh0cCk7CiAKIAkvKiBlbmFibGUgcnggYWdncmVnYXRpb24gKi8KQEAgLTMzOTQsMTIgKzMzOTAsMTIgQEAKIHN0YXRpYyB2b2lkIHI4MTUzX2luaXQoc3RydWN0IHI4MTUyICp0cCkKIHsKIAl1MzIgb2NwX2RhdGE7CisJdTE2IGRhdGE7CiAJaW50IGk7CiAKIAlpZiAodGVzdF9iaXQoUlRMODE1Ml9VTlBMVUcsICZ0cC0+ZmxhZ3MpKQogCQlyZXR1cm47CiAKLQlyODE1M19hbGRwc19lbih0cCwgZmFsc2UpOwogCXI4MTUzX3UxdTJlbih0cCwgZmFsc2UpOwogCiAJZm9yIChpID0gMDsgaSA8IDUwMDsgaSsrKSB7CkBAIC0zNDE2LDYgKzM0MTIsMjMgQEAKIAkJbXNsZWVwKDIwKTsKIAl9CiAKKwlpZiAodHAtPnZlcnNpb24gPT0gUlRMX1ZFUl8wMyB8fCB0cC0+dmVyc2lvbiA9PSBSVExfVkVSXzA0IHx8CisJICAgIHRwLT52ZXJzaW9uID09IFJUTF9WRVJfMDUpCisJCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9BRENfQ0ZHLCBDS0FEU0VMX0wgfCBBRENfRU4gfCBFTl9FTUlfTCk7CisKKwlkYXRhID0gcjgxNTJfbWRpb19yZWFkKHRwLCBNSUlfQk1DUik7CisJaWYgKGRhdGEgJiBCTUNSX1BET1dOKSB7CisJCWRhdGEgJj0gfkJNQ1JfUERPV047CisJCXI4MTUyX21kaW9fd3JpdGUodHAsIE1JSV9CTUNSLCBkYXRhKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNTAwOyBpKyspIHsKKwkJb2NwX2RhdGEgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9QSFlfU1RBVFVTKSAmIFBIWV9TVEFUX01BU0s7CisJCWlmIChvY3BfZGF0YSA9PSBQSFlfU1RBVF9MQU5fT04pCisJCQlicmVhazsKKwkJbXNsZWVwKDIwKTsKKwl9CisKIAl1c2JfZGlzYWJsZV9scG0odHAtPnVkZXYpOwogCXI4MTUzX3UycDNlbih0cCwgZmFsc2UpOwogCkBAIC0zNDgzLDkgKzM0OTYsNiBAQAogCW9jcF93cml0ZV93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9NQUNfUFdSX0NUUkwzLCAwKTsKIAlvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfTUFDX1BXUl9DVFJMNCwgMCk7CiAKLQlyODE1M19lbmFibGVfZWVlKHRwKTsKLQlyODE1M19hbGRwc19lbih0cCwgdHJ1ZSk7Ci0JcjgxNTJiX2VuYWJsZV9mYyh0cCk7CiAJcnRsX3RhbGx5X3Jlc2V0KHRwKTsKIAlyODE1M191MnAzZW4odHAsIHRydWUpOwogfQpAQCAtNDAzMiw3ICs0MDQyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgb3BzID0gewogCS5nZXRfZHJ2aW5mbyA9IHJ0bDgxNTJfZ2V0X2RydmluZm8sCiAJLmdldF9zZXR0aW5ncyA9IHJ0bDgxNTJfZ2V0X3NldHRpbmdzLAogCS5zZXRfc2V0dGluZ3MgPSBydGw4MTUyX3NldF9zZXR0aW5ncywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5jIGIvZHJpdmVycy9uZXQvdXNiL3Ntc2M5NXh4LmMKaW5kZXggZGM5ODlhOC4uODMxYWEzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL3Ntc2M5NXh4LmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL3Ntc2M5NXh4LmMKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlICJzbXNjOTV4eC5oIgogCiAjZGVmaW5lIFNNU0NfQ0hJUE5BTUUJCQkic21zYzk1eHgiCi0jZGVmaW5lIFNNU0NfRFJJVkVSX1ZFUlNJT04JCSIxLjAuNCIKKyNkZWZpbmUgU01TQ19EUklWRVJfVkVSU0lPTgkJIjEuMC41IgogI2RlZmluZSBIU19VU0JfUEtUX1NJWkUJCQkoNTEyKQogI2RlZmluZSBGU19VU0JfUEtUX1NJWkUJCQkoNjQpCiAjZGVmaW5lIERFRkFVTFRfSFNfQlVSU1RfQ0FQX1NJWkUJKDE2ICogMTAyNCArIDUgKiBIU19VU0JfUEtUX1NJWkUpCkBAIC02NCw2ICs2NCw3IEBACiAjZGVmaW5lIENBUlJJRVJfQ0hFQ0tfREVMQVkgKDIgKiBIWikKIAogc3RydWN0IHNtc2M5NXh4X3ByaXYgeworCXUzMiBjaGlwX2lkOwogCXUzMiBtYWNfY3I7CiAJdTMyIGhhc2hfaGk7CiAJdTMyIGhhc2hfbG87CkBAIC03MSw2ICs3Miw3IEBACiAJc3BpbmxvY2tfdCBtYWNfY3JfbG9jazsKIAl1OCBmZWF0dXJlczsKIAl1OCBzdXNwZW5kX2ZsYWdzOworCXU4IG1kaXhfY3RybDsKIAlib29sIGxpbmtfb2s7CiAJc3RydWN0IGRlbGF5ZWRfd29yayBjYXJyaWVyX2NoZWNrOwogCXN0cnVjdCB1c2JuZXQgKmRldjsKQEAgLTc4MiwxNCArNzg0LDExMyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgZ2V0X21kaXhfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwl1MzIgdmFsOworCWludCBidWY7CisKKwlidWYgPSBzbXNjOTV4eF9tZGlvX3JlYWQoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgU1BFQ0lBTF9DVFJMX1NUUyk7CisJaWYgKGJ1ZiAmIFNQRUNJQUxfQ1RSTF9TVFNfT1ZSUkRfQU1ESVhfKSB7CisJCWlmIChidWYgJiBTUEVDSUFMX0NUUkxfU1RTX0FNRElYX0VOQUJMRV8pCisJCQlyZXR1cm4gRVRIX1RQX01ESV9BVVRPOworCQllbHNlIGlmIChidWYgJiBTUEVDSUFMX0NUUkxfU1RTX0FNRElYX1NUQVRFXykKKwkJCXJldHVybiBFVEhfVFBfTURJX1g7CisJfSBlbHNlIHsKKwkJYnVmID0gc21zYzk1eHhfcmVhZF9yZWcoZGV2LCBTVFJBUF9TVEFUVVMsICZ2YWwpOworCQlpZiAodmFsICYgU1RSQVBfU1RBVFVTX0FNRElYX0VOXykKKwkJCXJldHVybiBFVEhfVFBfTURJX0FVVE87CisJfQorCisJcmV0dXJuIEVUSF9UUF9NREk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9tZGl4X3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBfX3U4IG1kaXhfY3RybCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCXN0cnVjdCBzbXNjOTV4eF9wcml2ICpwZGF0YSA9IChzdHJ1Y3Qgc21zYzk1eHhfcHJpdiAqKShkZXYtPmRhdGFbMF0pOworCWludCBidWY7CisKKwlpZiAoKHBkYXRhLT5jaGlwX2lkID09IElEX1JFVl9DSElQX0lEXzk1MDBBXykgfHwKKwkgICAgKHBkYXRhLT5jaGlwX2lkID09IElEX1JFVl9DSElQX0lEXzk1MzBfKSB8fAorCSAgICAocGRhdGEtPmNoaXBfaWQgPT0gSURfUkVWX0NISVBfSURfODk1MzBfKSB8fAorCSAgICAocGRhdGEtPmNoaXBfaWQgPT0gSURfUkVWX0NISVBfSURfOTczMF8pKSB7CisJCS8qIEV4dGVuZCBNYW51YWwgQXV0b01ESVggdGltZXIgZm9yIDk1MDBBLzk1MDBBaSAqLworCQlidWYgPSBzbXNjOTV4eF9tZGlvX3JlYWQoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwKKwkJCQkJIFBIWV9FRFBEX0NPTkZJRyk7CisJCWJ1ZiB8PSBQSFlfRURQRF9DT05GSUdfRVhUX0NST1NTT1ZFUl87CisJCXNtc2M5NXh4X21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwKKwkJCQkgICAgUEhZX0VEUERfQ09ORklHLCBidWYpOworCX0KKworCWlmIChtZGl4X2N0cmwgPT0gRVRIX1RQX01ESSkgeworCQlidWYgPSBzbXNjOTV4eF9tZGlvX3JlYWQoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwKKwkJCQkJIFNQRUNJQUxfQ1RSTF9TVFMpOworCQlidWYgfD0gU1BFQ0lBTF9DVFJMX1NUU19PVlJSRF9BTURJWF87CisJCWJ1ZiAmPSB+KFNQRUNJQUxfQ1RSTF9TVFNfQU1ESVhfRU5BQkxFXyB8CisJCQkgU1BFQ0lBTF9DVFJMX1NUU19BTURJWF9TVEFURV8pOworCQlzbXNjOTV4eF9tZGlvX3dyaXRlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJICAgIFNQRUNJQUxfQ1RSTF9TVFMsIGJ1Zik7CisJfSBlbHNlIGlmIChtZGl4X2N0cmwgPT0gRVRIX1RQX01ESV9YKSB7CisJCWJ1ZiA9IHNtc2M5NXh4X21kaW9fcmVhZChkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLAorCQkJCQkgU1BFQ0lBTF9DVFJMX1NUUyk7CisJCWJ1ZiB8PSBTUEVDSUFMX0NUUkxfU1RTX09WUlJEX0FNRElYXzsKKwkJYnVmICY9IH4oU1BFQ0lBTF9DVFJMX1NUU19BTURJWF9FTkFCTEVfIHwKKwkJCSBTUEVDSUFMX0NUUkxfU1RTX0FNRElYX1NUQVRFXyk7CisJCWJ1ZiB8PSBTUEVDSUFMX0NUUkxfU1RTX0FNRElYX1NUQVRFXzsKKwkJc21zYzk1eHhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLAorCQkJCSAgICBTUEVDSUFMX0NUUkxfU1RTLCBidWYpOworCX0gZWxzZSBpZiAobWRpeF9jdHJsID09IEVUSF9UUF9NRElfQVVUTykgeworCQlidWYgPSBzbXNjOTV4eF9tZGlvX3JlYWQoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwKKwkJCQkJIFNQRUNJQUxfQ1RSTF9TVFMpOworCQlidWYgJj0gflNQRUNJQUxfQ1RSTF9TVFNfT1ZSUkRfQU1ESVhfOworCQlidWYgJj0gfihTUEVDSUFMX0NUUkxfU1RTX0FNRElYX0VOQUJMRV8gfAorCQkJIFNQRUNJQUxfQ1RSTF9TVFNfQU1ESVhfU1RBVEVfKTsKKwkJYnVmIHw9IFNQRUNJQUxfQ1RSTF9TVFNfQU1ESVhfRU5BQkxFXzsKKwkJc21zYzk1eHhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLAorCQkJCSAgICBTUEVDSUFMX0NUUkxfU1RTLCBidWYpOworCX0KKwlwZGF0YS0+bWRpeF9jdHJsID0gbWRpeF9jdHJsOworfQorCitzdGF0aWMgaW50IHNtc2M5NXh4X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LAorCQkJCSBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCXN0cnVjdCBzbXNjOTV4eF9wcml2ICpwZGF0YSA9IChzdHJ1Y3Qgc21zYzk1eHhfcHJpdiAqKShkZXYtPmRhdGFbMF0pOworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSB1c2JuZXRfZ2V0X3NldHRpbmdzKG5ldCwgY21kKTsKKworCWNtZC0+ZXRoX3RwX21kaXggPSBwZGF0YS0+bWRpeF9jdHJsOworCWNtZC0+ZXRoX3RwX21kaXhfY3RybCA9IHBkYXRhLT5tZGl4X2N0cmw7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHNtc2M5NXh4X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LAorCQkJCSBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCXN0cnVjdCBzbXNjOTV4eF9wcml2ICpwZGF0YSA9IChzdHJ1Y3Qgc21zYzk1eHhfcHJpdiAqKShkZXYtPmRhdGFbMF0pOworCWludCByZXR2YWw7CisKKwlpZiAocGRhdGEtPm1kaXhfY3RybCAhPSBjbWQtPmV0aF90cF9tZGl4X2N0cmwpCisJCXNldF9tZGl4X3N0YXR1cyhuZXQsIGNtZC0+ZXRoX3RwX21kaXhfY3RybCk7CisKKwlyZXR2YWwgPSB1c2JuZXRfc2V0X3NldHRpbmdzKG5ldCwgY21kKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgc21zYzk1eHhfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9saW5rCT0gdXNibmV0X2dldF9saW5rLAogCS5ud2F5X3Jlc2V0CT0gdXNibmV0X253YXlfcmVzZXQsCiAJLmdldF9kcnZpbmZvCT0gdXNibmV0X2dldF9kcnZpbmZvLAogCS5nZXRfbXNnbGV2ZWwJPSB1c2JuZXRfZ2V0X21zZ2xldmVsLAogCS5zZXRfbXNnbGV2ZWwJPSB1c2JuZXRfc2V0X21zZ2xldmVsLAotCS5nZXRfc2V0dGluZ3MJPSB1c2JuZXRfZ2V0X3NldHRpbmdzLAotCS5zZXRfc2V0dGluZ3MJPSB1c2JuZXRfc2V0X3NldHRpbmdzLAorCS5nZXRfc2V0dGluZ3MJPSBzbXNjOTV4eF9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwk9IHNtc2M5NXh4X3NldF9zZXR0aW5ncywKIAkuZ2V0X2VlcHJvbV9sZW4JPSBzbXNjOTV4eF9ldGh0b29sX2dldF9lZXByb21fbGVuLAogCS5nZXRfZWVwcm9tCT0gc21zYzk1eHhfZXRodG9vbF9nZXRfZWVwcm9tLAogCS5zZXRfZWVwcm9tCT0gc21zYzk1eHhfZXRodG9vbF9zZXRfZWVwcm9tLApAQCAtMTE5NCw2ICsxMjk1LDggQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAl2YWwgPj49IDE2OworCXBkYXRhLT5jaGlwX2lkID0gdmFsOworCXBkYXRhLT5tZGl4X2N0cmwgPSBnZXRfbWRpeF9zdGF0dXMoZGV2LT5uZXQpOwogCiAJaWYgKCh2YWwgPT0gSURfUkVWX0NISVBfSURfOTUwMEFfKSB8fCAodmFsID09IElEX1JFVl9DSElQX0lEXzk1MzBfKSB8fAogCSAgICAodmFsID09IElEX1JFVl9DSElQX0lEXzg5NTMwXykgfHwgKHZhbCA9PSBJRF9SRVZfQ0hJUF9JRF85NzMwXykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2Ivc21zYzk1eHguaCBiL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5oCmluZGV4IDUyNmZhYTAuLjI5YTRkOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5oCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5oCkBAIC0xNDQsNiArMTQ0LDE0IEBACiAKICNkZWZpbmUgQlVSU1RfQ0FQCQkJKDB4MzgpCiAKKyNkZWZpbmUJU1RSQVBfU1RBVFVTCQkJKDB4M0MpCisjZGVmaW5lCVNUUkFQX1NUQVRVU19QV1JfU0VMXwkJKDB4MDAwMDAwMjApCisjZGVmaW5lCVNUUkFQX1NUQVRVU19BTURJWF9FTl8JCSgweDAwMDAwMDEwKQorI2RlZmluZQlTVFJBUF9TVEFUVVNfUE9SVF9TV0FQXwkJKDB4MDAwMDAwMDgpCisjZGVmaW5lCVNUUkFQX1NUQVRVU19FRVBfU0laRV8JCSgweDAwMDAwMDA0KQorI2RlZmluZQlTVFJBUF9TVEFUVVNfUk1UX1dLUF8JCSgweDAwMDAwMDAyKQorI2RlZmluZQlTVFJBUF9TVEFUVVNfRUVQX0RJU0FCTEVfCSgweDAwMDAwMDAxKQorCiAjZGVmaW5lIEdQSU9fV0FLRQkJCSgweDY0KQogCiAjZGVmaW5lIElOVF9FUF9DVEwJCQkoMHg2OCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi91c2JuZXQuYyBiL2RyaXZlcnMvbmV0L3VzYi91c2JuZXQuYwppbmRleCAzYmZiNTkyLi5kNTA3MWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL3VzYm5ldC5jCkBAIC0yMDYyLDExICsyMDYyLDggQEAKIAkJICAgY21kLCByZXF0eXBlLCB2YWx1ZSwgaW5kZXgsIHNpemUpOwogCiAJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXVyYikgewotCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRXJyb3IgYWxsb2NhdGluZyBVUkIgaW4iCi0JCQkgICAiICVzIVxuIiwgX19mdW5jX18pOworCWlmICghdXJiKQogCQlnb3RvIGZhaWw7Ci0JfQogCiAJaWYgKGRhdGEpIHsKIAkJYnVmID0ga21lbWR1cChkYXRhLCBzaXplLCBHRlBfQVRPTUlDKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZldGguYyBiL2RyaXZlcnMvbmV0L3ZldGguYwppbmRleCBmMzdhNmU2Li5mYmM4NTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92ZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdmV0aC5jCkBAIC0zMTMsNyArMzEzLDcgQEAKIH07CiAKICNkZWZpbmUgVkVUSF9GRUFUVVJFUyAoTkVUSUZfRl9TRyB8IE5FVElGX0ZfRlJBR0xJU1QgfCBORVRJRl9GX0hXX0NTVU0gfCBcCi0JCSAgICAgICBORVRJRl9GX1JYQ1NVTSB8IE5FVElGX0ZfSElHSERNQSB8IFwKKwkJICAgICAgIE5FVElGX0ZfUlhDU1VNIHwgTkVUSUZfRl9TQ1RQX0NSQyB8IE5FVElGX0ZfSElHSERNQSB8IFwKIAkJICAgICAgIE5FVElGX0ZfR1NPX1NPRlRXQVJFIHwgTkVUSUZfRl9HU09fRU5DQVBfQUxMIHwgXAogCQkgICAgICAgTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfCBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWCB8IFwKIAkJICAgICAgIE5FVElGX0ZfSFdfVkxBTl9TVEFHX1RYIHwgTkVUSUZfRl9IV19WTEFOX1NUQUdfUlggKQpAQCAtMzQwLDYgKzM0MCw3IEBACiAKIAlkZXYtPmh3X2ZlYXR1cmVzID0gVkVUSF9GRUFUVVJFUzsKIAlkZXYtPmh3X2VuY19mZWF0dXJlcyA9IFZFVEhfRkVBVFVSRVM7CisJZGV2LT5tcGxzX2ZlYXR1cmVzID0gTkVUSUZfRl9IV19DU1VNIHwgTkVUSUZfRl9HU09fU09GVFdBUkU7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMgYi9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKaW5kZXggMWI1ZjUzMS4uZmFkODRmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYwpAQCAtMTM4LDggKzEzOCw5IEBACiAJLyogRG9lcyB0aGUgYWZmaW5pdHkgaGludCBpcyBzZXQgZm9yIHZpcnRxdWV1ZXM/ICovCiAJYm9vbCBhZmZpbml0eV9oaW50X3NldDsKIAotCS8qIENQVSBob3QgcGx1ZyBub3RpZmllciAqLwotCXN0cnVjdCBub3RpZmllcl9ibG9jayBuYjsKKwkvKiBDUFUgaG90cGx1ZyBpbnN0YW5jZXMgZm9yIG9ubGluZSAmIGRlYWQgKi8KKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlOworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGVfZGVhZDsKIAogCS8qIENvbnRyb2wgVlEgYnVmZmVyczogcHJvdGVjdGVkIGJ5IHRoZSBydG5sIGxvY2sgKi8KIAlzdHJ1Y3QgdmlydGlvX25ldF9jdHJsX2hkciBjdHJsX2hkcjsKQEAgLTEyMzcsMjUgKzEyMzgsNTMgQEAKIAl2aS0+YWZmaW5pdHlfaGludF9zZXQgPSB0cnVlOwogfQogCi1zdGF0aWMgaW50IHZpcnRuZXRfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAotCQkJICAgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgdmlydG5ldF9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQogewotCXN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpID0gY29udGFpbmVyX29mKG5mYiwgc3RydWN0IHZpcnRuZXRfaW5mbywgbmIpOworCXN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgdmlydG5ldF9pbmZvLAorCQkJCQkJICAgbm9kZSk7CisJdmlydG5ldF9zZXRfYWZmaW5pdHkodmkpOworCXJldHVybiAwOworfQogCi0Jc3dpdGNoKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgotCWNhc2UgQ1BVX0RFQUQ6Ci0JCXZpcnRuZXRfc2V0X2FmZmluaXR5KHZpKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCQl2aXJ0bmV0X2NsZWFuX2FmZmluaXR5KHZpLCAobG9uZyloY3B1KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQorc3RhdGljIGludCB2aXJ0bmV0X2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQoreworCXN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgdmlydG5ldF9pbmZvLAorCQkJCQkJICAgbm9kZV9kZWFkKTsKKwl2aXJ0bmV0X3NldF9hZmZpbml0eSh2aSk7CisJcmV0dXJuIDA7Cit9CiAKLQlyZXR1cm4gTk9USUZZX09LOworc3RhdGljIGludCB2aXJ0bmV0X2NwdV9kb3duX3ByZXAodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCit7CisJc3RydWN0IHZpcnRuZXRfaW5mbyAqdmkgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCB2aXJ0bmV0X2luZm8sCisJCQkJCQkgICBub2RlKTsKKworCXZpcnRuZXRfY2xlYW5fYWZmaW5pdHkodmksIGNwdSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIGNwdWhwX3N0YXRlIHZpcnRpb25ldF9vbmxpbmU7CisKK3N0YXRpYyBpbnQgdmlydG5ldF9jcHVfbm90aWZfYWRkKHN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpKQoreworCWludCByZXQ7CisKKwlyZXQgPSBjcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2Vfbm9jYWxscyh2aXJ0aW9uZXRfb25saW5lLCAmdmktPm5vZGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlX25vY2FsbHMoQ1BVSFBfVklSVF9ORVRfREVBRCwKKwkJCQkJICAgICAgICZ2aS0+bm9kZV9kZWFkKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIHJldDsKKwljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyh2aXJ0aW9uZXRfb25saW5lLCAmdmktPm5vZGUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHZpcnRuZXRfY3B1X25vdGlmX3JlbW92ZShzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSkKK3sKKwljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyh2aXJ0aW9uZXRfb25saW5lLCAmdmktPm5vZGUpOworCWNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKENQVUhQX1ZJUlRfTkVUX0RFQUQsCisJCQkJCSAgICAmdmktPm5vZGVfZGVhZCk7CiB9CiAKIHN0YXRpYyB2b2lkIHZpcnRuZXRfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtMTg3OSw4ICsxOTA4LDcgQEAKIAogCXZpcnRpb19kZXZpY2VfcmVhZHkodmRldik7CiAKLQl2aS0+bmIubm90aWZpZXJfY2FsbCA9ICZ2aXJ0bmV0X2NwdV9jYWxsYmFjazsKLQllcnIgPSByZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJnZpLT5uYik7CisJZXJyID0gdmlydG5ldF9jcHVfbm90aWZfYWRkKHZpKTsKIAlpZiAoZXJyKSB7CiAJCXByX2RlYnVnKCJ2aXJ0aW9fbmV0OiByZWdpc3RlcmluZyBjcHUgbm90aWZpZXIgZmFpbGVkXG4iKTsKIAkJZ290byBmcmVlX3VucmVnaXN0ZXJfbmV0ZGV2OwpAQCAtMTkzNCw3ICsxOTYyLDcgQEAKIHsKIAlzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSA9IHZkZXYtPnByaXY7CiAKLQl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmdmktPm5iKTsKKwl2aXJ0bmV0X2NwdV9ub3RpZl9yZW1vdmUodmkpOwogCiAJLyogTWFrZSBzdXJlIG5vIHdvcmsgaGFuZGxlciBpcyBhY2Nlc3NpbmcgdGhlIGRldmljZS4gKi8KIAlmbHVzaF93b3JrKCZ2aS0+Y29uZmlnX3dvcmspOwpAQCAtMTk1Myw3ICsxOTgxLDcgQEAKIAlzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSA9IHZkZXYtPnByaXY7CiAJaW50IGk7CiAKLQl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmdmktPm5iKTsKKwl2aXJ0bmV0X2NwdV9ub3RpZl9yZW1vdmUodmkpOwogCiAJLyogTWFrZSBzdXJlIG5vIHdvcmsgaGFuZGxlciBpcyBhY2Nlc3NpbmcgdGhlIGRldmljZSAqLwogCWZsdXNoX3dvcmsoJnZpLT5jb25maWdfd29yayk7CkBAIC0xOTk3LDcgKzIwMjUsNyBAQAogCXZpcnRuZXRfc2V0X3F1ZXVlcyh2aSwgdmktPmN1cnJfcXVldWVfcGFpcnMpOwogCXJ0bmxfdW5sb2NrKCk7CiAKLQllcnIgPSByZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJnZpLT5uYik7CisJZXJyID0gdmlydG5ldF9jcHVfbm90aWZfYWRkKHZpKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yMDM5LDcgKzIwNjcsNDEgQEAKICNlbmRpZgogfTsKIAotbW9kdWxlX3ZpcnRpb19kcml2ZXIodmlydGlvX25ldF9kcml2ZXIpOworc3RhdGljIF9faW5pdCBpbnQgdmlydGlvX25ldF9kcml2ZXJfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9tdWx0aShDUFVIUF9BUF9PTkxJTkVfRFlOLCAiQVBfVklSVF9ORVRfT05MSU5FIiwKKwkJCQkgICAgICB2aXJ0bmV0X2NwdV9vbmxpbmUsCisJCQkJICAgICAgdmlydG5ldF9jcHVfZG93bl9wcmVwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJdmlydGlvbmV0X29ubGluZSA9IHJldDsKKwlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9tdWx0aShDUFVIUF9WSVJUX05FVF9ERUFELCAiVklSVF9ORVRfREVBRCIsCisJCQkJICAgICAgTlVMTCwgdmlydG5ldF9jcHVfZGVhZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZGVhZDsKKworICAgICAgICByZXQgPSByZWdpc3Rlcl92aXJ0aW9fZHJpdmVyKCZ2aXJ0aW9fbmV0X2RyaXZlcik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfdmlydGlvOworCXJldHVybiAwOworZXJyX3ZpcnRpbzoKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoQ1BVSFBfVklSVF9ORVRfREVBRCk7CitlcnJfZGVhZDoKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUodmlydGlvbmV0X29ubGluZSk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KHZpcnRpb19uZXRfZHJpdmVyX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgdmlydGlvX25ldF9kcml2ZXJfZXhpdCh2b2lkKQoreworCWNwdWhwX3JlbW92ZV9tdWx0aV9zdGF0ZShDUFVIUF9WSVJUX05FVF9ERUFEKTsKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUodmlydGlvbmV0X29ubGluZSk7CisJdW5yZWdpc3Rlcl92aXJ0aW9fZHJpdmVyKCZ2aXJ0aW9fbmV0X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh2aXJ0aW9fbmV0X2RyaXZlcl9leGl0KTsKIAogTU9EVUxFX0RFVklDRV9UQUJMRSh2aXJ0aW8sIGlkX3RhYmxlKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVmlydGlvIG5ldHdvcmsgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZHJ2LmMgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZHJ2LmMKaW5kZXggYzY4ZmU0OS4uYjU1NTRmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2Rydi5jCisrKyBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19kcnYuYwpAQCAtOTE0LDcgKzkxNCw5IEBACiB7CiAJc3RydWN0IFZteG5ldDNfVHhEYXRhRGVzYyAqdGRkOwogCi0JdGRkID0gdHEtPmRhdGFfcmluZy5iYXNlICsgdHEtPnR4X3JpbmcubmV4dDJmaWxsOworCXRkZCA9IChzdHJ1Y3QgVm14bmV0M19UeERhdGFEZXNjICopKCh1OCAqKXRxLT5kYXRhX3JpbmcuYmFzZSArCisJCQkJCSAgICB0cS0+dHhfcmluZy5uZXh0MmZpbGwgKgorCQkJCQkgICAgdHEtPnR4ZGF0YV9kZXNjX3NpemUpOwogCiAJbWVtY3B5KHRkZC0+ZGF0YSwgc2tiLT5kYXRhLCBjdHgtPmNvcHlfc2l6ZSk7CiAJbmV0ZGV2X2RiZyhhZGFwdGVyLT5uZXRkZXYsCkBAIC0xNjM5LDcgKzE2NDEsNyBAQAogCX0KIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIHZteG5ldDNfcnFfZGVzdHJveV9hbGxfcnhkYXRhcmluZyhzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKQogewogCWludCBpOwpAQCAtMzE4NCw3ICszMTg2LDYgQEAKIAogCW5ldGRldl9lcnIoYWRhcHRlci0+bmV0ZGV2LCAidHggaGFuZ1xuIik7CiAJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+d29yayk7Ci0JbmV0aWZfd2FrZV9xdWV1ZShhZGFwdGVyLT5uZXRkZXYpOwogfQogCiAKQEAgLTMyMTEsNiArMzIxMiw3IEBACiAJfQogCXJ0bmxfdW5sb2NrKCk7CiAKKwluZXRpZl93YWtlX3F1ZXVlKGFkYXB0ZXItPm5ldGRldik7CiAJY2xlYXJfYml0KFZNWE5FVDNfU1RBVEVfQklUX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2ludC5oIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2ludC5oCmluZGV4IDc0ZmMwMzAuLjdkYzM3YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19pbnQuaAorKysgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfaW50LmgKQEAgLTY5LDEwICs2OSwxMCBAQAogLyoKICAqIFZlcnNpb24gbnVtYmVycwogICovCi0jZGVmaW5lIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT05fU1RSSU5HICAgIjEuNC45LjAtayIKKyNkZWZpbmUgVk1YTkVUM19EUklWRVJfVkVSU0lPTl9TVFJJTkcgICAiMS40LmEuMC1rIgogCiAvKiBhIDMyLWJpdCBpbnQsIGVhY2ggYnl0ZSBlbmNvZGUgYSB2ZXJpb24gbnVtYmVyIGluIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT04gKi8KLSNkZWZpbmUgVk1YTkVUM19EUklWRVJfVkVSU0lPTl9OVU0gICAgICAweDAxMDQwOTAwCisjZGVmaW5lIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT05fTlVNICAgICAgMHgwMTA0MGEwMAogCiAjaWYgZGVmaW5lZChDT05GSUdfUENJX01TSSkKIAkvKiBSU1Mgb25seSBtYWtlcyBzZW5zZSBpZiBNU0ktWCBpcyBzdXBwb3J0ZWQuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92cmYuYyBiL2RyaXZlcnMvbmV0L3ZyZi5jCmluZGV4IDFjZTc0MjAuLjg1YzI3MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZyZi5jCisrKyBiL2RyaXZlcnMvbmV0L3ZyZi5jCkBAIC0zNyw5ICszNyw2IEBACiAjaW5jbHVkZSA8bmV0L2wzbWRldi5oPgogI2luY2x1ZGUgPG5ldC9maWJfcnVsZXMuaD4KIAotI2RlZmluZSBSVF9GTF9UT1Mob2xkZmxwNCkgXAotCSgob2xkZmxwNCktPmZsb3dpNF90b3MgJiAoSVBUT1NfUlRfTUFTSyB8IFJUT19PTkxJTkspKQotCiAjZGVmaW5lIERSVl9OQU1FCSJ2cmYiCiAjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjAiCiAKQEAgLTEzNyw2ICsxMzQsMjAgQEAKIH0KIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCitzdGF0aWMgaW50IHZyZl9pcDZfbG9jYWxfb3V0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2sgKnNrLAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBlcnI7CisKKwllcnIgPSBuZl9ob29rKE5GUFJPVE9fSVBWNiwgTkZfSU5FVF9MT0NBTF9PVVQsIG5ldCwKKwkJICAgICAgc2ssIHNrYiwgTlVMTCwgc2tiX2RzdChza2IpLT5kZXYsIGRzdF9vdXRwdXQpOworCisJaWYgKGxpa2VseShlcnIgPT0gMSkpCisJCWVyciA9IGRzdF9vdXRwdXQobmV0LCBzaywgc2tiKTsKKworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBuZXRkZXZfdHhfdCB2cmZfcHJvY2Vzc192Nl9vdXRib3VuZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtMTUxLDcgKzE2Miw3IEBACiAJCS5mbG93bGFiZWwgPSBpcDZfZmxvd2luZm8oaXBoKSwKIAkJLmZsb3dpNl9tYXJrID0gc2tiLT5tYXJrLAogCQkuZmxvd2k2X3Byb3RvID0gaXBoLT5uZXh0aGRyLAotCQkuZmxvd2k2X2ZsYWdzID0gRkxPV0lfRkxBR19MM01ERVZfU1JDIHwgRkxPV0lfRkxBR19TS0lQX05IX09JRiwKKwkJLmZsb3dpNl9mbGFncyA9IEZMT1dJX0ZMQUdfU0tJUF9OSF9PSUYsCiAJfTsKIAlpbnQgcmV0ID0gTkVUX1hNSVRfRFJPUDsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CkBAIC0yMDcsNyArMjE4LDcgQEAKIAkvKiBzdHJpcCB0aGUgZXRoZXJuZXQgaGVhZGVyIGFkZGVkIGZvciBwYXNzIHRocm91Z2ggVlJGIGRldmljZSAqLwogCV9fc2tiX3B1bGwoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSk7CiAKLQlyZXQgPSBpcDZfbG9jYWxfb3V0KG5ldCwgc2tiLT5zaywgc2tiKTsKKwlyZXQgPSB2cmZfaXA2X2xvY2FsX291dChuZXQsIHNrYi0+c2ssIHNrYik7CiAJaWYgKHVubGlrZWx5KG5ldF94bWl0X2V2YWwocmV0KSkpCiAJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJZWxzZQpAQCAtMjI3LDYgKzIzOCwyMCBAQAogfQogI2VuZGlmCiAKKy8qIGJhc2VkIG9uIGlwX2xvY2FsX291dDsgY2FuJ3QgdXNlIGl0IGIvYyB0aGUgZHN0IGlzIHN3aXRjaGVkIHBvaW50aW5nIHRvIHVzICovCitzdGF0aWMgaW50IHZyZl9pcF9sb2NhbF9vdXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gbmZfaG9vayhORlBST1RPX0lQVjQsIE5GX0lORVRfTE9DQUxfT1VULCBuZXQsIHNrLAorCQkgICAgICBza2IsIE5VTEwsIHNrYl9kc3Qoc2tiKS0+ZGV2LCBkc3Rfb3V0cHV0KTsKKwlpZiAobGlrZWx5KGVyciA9PSAxKSkKKwkJZXJyID0gZHN0X291dHB1dChuZXQsIHNrLCBza2IpOworCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIG5ldGRldl90eF90IHZyZl9wcm9jZXNzX3Y0X291dGJvdW5kKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICp2cmZfZGV2KQogewpAQCAtMjM3LDggKzI2Miw3IEBACiAJCS5mbG93aTRfb2lmID0gdnJmX2Rldi0+aWZpbmRleCwKIAkJLmZsb3dpNF9paWYgPSBMT09QQkFDS19JRklOREVYLAogCQkuZmxvd2k0X3RvcyA9IFJUX1RPUyhpcDRoLT50b3MpLAotCQkuZmxvd2k0X2ZsYWdzID0gRkxPV0lfRkxBR19BTllTUkMgfCBGTE9XSV9GTEFHX0wzTURFVl9TUkMgfAotCQkJCUZMT1dJX0ZMQUdfU0tJUF9OSF9PSUYsCisJCS5mbG93aTRfZmxhZ3MgPSBGTE9XSV9GTEFHX0FOWVNSQyB8IEZMT1dJX0ZMQUdfU0tJUF9OSF9PSUYsCiAJCS5kYWRkciA9IGlwNGgtPmRhZGRyLAogCX07CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldCh2cmZfZGV2KTsKQEAgLTI5Miw3ICszMTYsNyBAQAogCQkJCQkgICAgICAgUlRfU0NPUEVfTElOSyk7CiAJfQogCi0JcmV0ID0gaXBfbG9jYWxfb3V0KGRldl9uZXQoc2tiX2RzdChza2IpLT5kZXYpLCBza2ItPnNrLCBza2IpOworCXJldCA9IHZyZl9pcF9sb2NhbF9vdXQoZGV2X25ldChza2JfZHN0KHNrYiktPmRldiksIHNrYi0+c2ssIHNrYik7CiAJaWYgKHVubGlrZWx5KG5ldF94bWl0X2V2YWwocmV0KSkpCiAJCXZyZl9kZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCWVsc2UKQEAgLTM3Nyw2ICs0MDEsNDMgQEAKIAkJCSAgICAhKElQNkNCKHNrYiktPmZsYWdzICYgSVA2U0tCX1JFUk9VVEVEKSk7CiB9CiAKKy8qIHNldCBkc3Qgb24gc2tiIHRvIHNlbmQgcGFja2V0IHRvIHVzIHZpYSBkZXZfeG1pdCBwYXRoLiBBbGxvd3MKKyAqIHBhY2tldCB0byBnbyB0aHJvdWdoIGRldmljZSBiYXNlZCBmZWF0dXJlcyBzdWNoIGFzIHFkaXNjLCBuZXRmaWx0ZXIKKyAqIGhvb2tzIGFuZCBwYWNrZXQgc29ja2V0cyB3aXRoIHNrYi0+ZGV2IHNldCB0byB2cmYgZGV2aWNlLgorICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnZyZl9pcDZfb3V0KHN0cnVjdCBuZXRfZGV2aWNlICp2cmZfZGV2LAorCQkJCSAgIHN0cnVjdCBzb2NrICpzaywKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRfdnJmICp2cmYgPSBuZXRkZXZfcHJpdih2cmZfZGV2KTsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBOVUxMOworCXN0cnVjdCBydDZfaW5mbyAqcnQ2OworCisJLyogZG9uJ3QgZGl2ZXJ0IGxpbmsgc2NvcGUgcGFja2V0cyAqLworCWlmIChydDZfbmVlZF9zdHJpY3QoJmlwdjZfaGRyKHNrYiktPmRhZGRyKSkKKwkJcmV0dXJuIHNrYjsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCXJ0NiA9IHJjdV9kZXJlZmVyZW5jZSh2cmYtPnJ0Nik7CisJaWYgKGxpa2VseShydDYpKSB7CisJCWRzdCA9ICZydDYtPmRzdDsKKwkJZHN0X2hvbGQoZHN0KTsKKwl9CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmICh1bmxpa2VseSghZHN0KSkgeworCQl2cmZfdHhfZXJyb3IodnJmX2Rldiwgc2tiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2tiX2RzdF9kcm9wKHNrYik7CisJc2tiX2RzdF9zZXQoc2tiLCBkc3QpOworCisJcmV0dXJuIHNrYjsKK30KKwogLyogaG9sZGluZyBydG5sICovCiBzdGF0aWMgdm9pZCB2cmZfcnQ2X3JlbGVhc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF92cmYgKnZyZikKIHsKQEAgLTQ2Myw2ICs1MjQsMTMgQEAKIAlyZXR1cm4gcmM7CiB9CiAjZWxzZQorc3RhdGljIHN0cnVjdCBza19idWZmICp2cmZfaXA2X291dChzdHJ1Y3QgbmV0X2RldmljZSAqdnJmX2RldiwKKwkJCQkgICBzdHJ1Y3Qgc29jayAqc2ssCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiOworfQorCiBzdGF0aWMgdm9pZCB2cmZfcnQ2X3JlbGVhc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF92cmYgKnZyZikKIHsKIH0KQEAgLTUzMSw2ICs1OTksNTUgQEAKIAkJCSAgICAhKElQQ0Ioc2tiKS0+ZmxhZ3MgJiBJUFNLQl9SRVJPVVRFRCkpOwogfQogCisvKiBzZXQgZHN0IG9uIHNrYiB0byBzZW5kIHBhY2tldCB0byB1cyB2aWEgZGV2X3htaXQgcGF0aC4gQWxsb3dzCisgKiBwYWNrZXQgdG8gZ28gdGhyb3VnaCBkZXZpY2UgYmFzZWQgZmVhdHVyZXMgc3VjaCBhcyBxZGlzYywgbmV0ZmlsdGVyCisgKiBob29rcyBhbmQgcGFja2V0IHNvY2tldHMgd2l0aCBza2ItPmRldiBzZXQgdG8gdnJmIGRldmljZS4KKyAqLworc3RhdGljIHN0cnVjdCBza19idWZmICp2cmZfaXBfb3V0KHN0cnVjdCBuZXRfZGV2aWNlICp2cmZfZGV2LAorCQkJCSAgc3RydWN0IHNvY2sgKnNrLAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X3ZyZiAqdnJmID0gbmV0ZGV2X3ByaXYodnJmX2Rldik7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gTlVMTDsKKwlzdHJ1Y3QgcnRhYmxlICpydGg7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlydGggPSByY3VfZGVyZWZlcmVuY2UodnJmLT5ydGgpOworCWlmIChsaWtlbHkocnRoKSkgeworCQlkc3QgPSAmcnRoLT5kc3Q7CisJCWRzdF9ob2xkKGRzdCk7CisJfQorCisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAodW5saWtlbHkoIWRzdCkpIHsKKwkJdnJmX3R4X2Vycm9yKHZyZl9kZXYsIHNrYik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNrYl9kc3RfZHJvcChza2IpOworCXNrYl9kc3Rfc2V0KHNrYiwgZHN0KTsKKworCXJldHVybiBza2I7Cit9CisKKy8qIGNhbGxlZCB3aXRoIHJjdSBsb2NrIGhlbGQgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdnJmX2wzX291dChzdHJ1Y3QgbmV0X2RldmljZSAqdnJmX2RldiwKKwkJCQkgIHN0cnVjdCBzb2NrICpzaywKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICB1MTYgcHJvdG8pCit7CisJc3dpdGNoIChwcm90bykgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuIHZyZl9pcF9vdXQodnJmX2Rldiwgc2ssIHNrYik7CisJY2FzZSBBRl9JTkVUNjoKKwkJcmV0dXJuIHZyZl9pcDZfb3V0KHZyZl9kZXYsIHNrLCBza2IpOworCX0KKworCXJldHVybiBza2I7Cit9CisKIC8qIGhvbGRpbmcgcnRubCAqLwogc3RhdGljIHZvaWQgdnJmX3J0YWJsZV9yZWxlYXNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRfdnJmICp2cmYpCiB7CkBAIC03MjIsNjMgKzgzOSw2IEBACiAJcmV0dXJuIHZyZi0+dGJfaWQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcnRhYmxlICp2cmZfZ2V0X3J0YWJsZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICAgY29uc3Qgc3RydWN0IGZsb3dpNCAqZmw0KQotewotCXN0cnVjdCBydGFibGUgKnJ0aCA9IE5VTEw7Ci0KLQlpZiAoIShmbDQtPmZsb3dpNF9mbGFncyAmIEZMT1dJX0ZMQUdfTDNNREVWX1NSQykpIHsKLQkJc3RydWN0IG5ldF92cmYgKnZyZiA9IG5ldGRldl9wcml2KGRldik7Ci0KLQkJcmN1X3JlYWRfbG9jaygpOwotCi0JCXJ0aCA9IHJjdV9kZXJlZmVyZW5jZSh2cmYtPnJ0aCk7Ci0JCWlmIChsaWtlbHkocnRoKSkKLQkJCWRzdF9ob2xkKCZydGgtPmRzdCk7Ci0KLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JfQotCi0JcmV0dXJuIHJ0aDsKLX0KLQotLyogY2FsbGVkIHVuZGVyIHJjdV9yZWFkX2xvY2sgKi8KLXN0YXRpYyBpbnQgdnJmX2dldF9zYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZmxvd2k0ICpmbDQpCi17Ci0Jc3RydWN0IGZpYl9yZXN1bHQgcmVzID0geyAudGNsYXNzaWQgPSAwIH07Ci0Jc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOwotCXUzMiBvcmlnX3RvcyA9IGZsNC0+Zmxvd2k0X3RvczsKLQl1OCBmbGFncyA9IGZsNC0+Zmxvd2k0X2ZsYWdzOwotCXU4IHNjb3BlID0gZmw0LT5mbG93aTRfc2NvcGU7Ci0JdTggdG9zID0gUlRfRkxfVE9TKGZsNCk7Ci0JaW50IHJjOwotCi0JaWYgKHVubGlrZWx5KCFmbDQtPmRhZGRyKSkKLQkJcmV0dXJuIDA7Ci0KLQlmbDQtPmZsb3dpNF9mbGFncyB8PSBGTE9XSV9GTEFHX1NLSVBfTkhfT0lGOwotCWZsNC0+Zmxvd2k0X2lpZiA9IExPT1BCQUNLX0lGSU5ERVg7Ci0JLyogbWFrZSBzdXJlIG9pZiBpcyBzZXQgdG8gVlJGIGRldmljZSBmb3IgbG9va3VwICovCi0JZmw0LT5mbG93aTRfb2lmID0gZGV2LT5pZmluZGV4OwotCWZsNC0+Zmxvd2k0X3RvcyA9IHRvcyAmIElQVE9TX1JUX01BU0s7Ci0JZmw0LT5mbG93aTRfc2NvcGUgPSAoKHRvcyAmIFJUT19PTkxJTkspID8KLQkJCSAgICAgUlRfU0NPUEVfTElOSyA6IFJUX1NDT1BFX1VOSVZFUlNFKTsKLQotCXJjID0gZmliX2xvb2t1cChuZXQsIGZsNCwgJnJlcywgMCk7Ci0JaWYgKCFyYykgewotCQlpZiAocmVzLnR5cGUgPT0gUlROX0xPQ0FMKQotCQkJZmw0LT5zYWRkciA9IHJlcy5maS0+ZmliX3ByZWZzcmMgPyA6IGZsNC0+ZGFkZHI7Ci0JCWVsc2UKLQkJCWZpYl9zZWxlY3RfcGF0aChuZXQsICZyZXMsIGZsNCwgLTEpOwotCX0KLQotCWZsNC0+Zmxvd2k0X2ZsYWdzID0gZmxhZ3M7Ci0JZmw0LT5mbG93aTRfdG9zID0gb3JpZ190b3M7Ci0JZmw0LT5mbG93aTRfc2NvcGUgPSBzY29wZTsKLQotCXJldHVybiByYzsKLX0KLQogc3RhdGljIGludCB2cmZfcmN2X2ZpbmlzaChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlyZXR1cm4gMDsKQEAgLTk3MCwxMDYgKzEwMzAsNDQgQEAKIH0KIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCi1zdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqdnJmX2dldF9ydDZfZHN0KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCSBzdHJ1Y3QgZmxvd2k2ICpmbDYpCisvKiBzZW5kIHRvIGxpbmstbG9jYWwgb3IgbXVsdGljYXN0IGFkZHJlc3MgdmlhIGludGVyZmFjZSBlbnNsYXZlZCB0bworICogVlJGIGRldmljZS4gRm9yY2UgbG9va3VwIHRvIFZSRiB0YWJsZSB3aXRob3V0IGNoYW5naW5nIGZsb3cgc3RydWN0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICp2cmZfbGlua19zY29wZV9sb29rdXAoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgc3RydWN0IGZsb3dpNiAqZmw2KQogewotCWJvb2wgbmVlZF9zdHJpY3QgPSBydDZfbmVlZF9zdHJpY3QoJmZsNi0+ZGFkZHIpOwotCXN0cnVjdCBuZXRfdnJmICp2cmYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKKwlpbnQgZmxhZ3MgPSBSVDZfTE9PS1VQX0ZfSUZBQ0U7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gTlVMTDsKIAlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OwogCi0JLyogc2VuZCB0byBsaW5rLWxvY2FsIG9yIG11bHRpY2FzdCBhZGRyZXNzICovCi0JaWYgKG5lZWRfc3RyaWN0KSB7Ci0JCWludCBmbGFncyA9IFJUNl9MT09LVVBfRl9JRkFDRTsKLQotCQkvKiBWUkYgZGV2aWNlIGRvZXMgbm90IGhhdmUgYSBsaW5rLWxvY2FsIGFkZHJlc3MgYW5kCi0JCSAqIHNlbmRpbmcgcGFja2V0cyB0byBsaW5rLWxvY2FsIG9yIG1jYXN0IGFkZHJlc3NlcyBvdmVyCi0JCSAqIGEgVlJGIGRldmljZSBkb2VzIG5vdCBtYWtlIHNlbnNlCi0JCSAqLwotCQlpZiAoZmw2LT5mbG93aTZfb2lmID09IGRldi0+aWZpbmRleCkgewotCQkJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gJm5ldC0+aXB2Ni5pcDZfbnVsbF9lbnRyeS0+ZHN0OwotCi0JCQlkc3RfaG9sZChkc3QpOwotCQkJcmV0dXJuIGRzdDsKLQkJfQotCi0JCWlmICghaXB2Nl9hZGRyX2FueSgmZmw2LT5zYWRkcikpCi0JCQlmbGFncyB8PSBSVDZfTE9PS1VQX0ZfSEFTX1NBRERSOwotCi0JCXJ0ID0gdnJmX2lwNl9yb3V0ZV9sb29rdXAobmV0LCBkZXYsIGZsNiwgZmw2LT5mbG93aTZfb2lmLCBmbGFncyk7Ci0JCWlmIChydCkKLQkJCWRzdCA9ICZydC0+ZHN0OwotCi0JfSBlbHNlIGlmICghKGZsNi0+Zmxvd2k2X2ZsYWdzICYgRkxPV0lfRkxBR19MM01ERVZfU1JDKSkgewotCi0JCXJjdV9yZWFkX2xvY2soKTsKLQotCQlydCA9IHJjdV9kZXJlZmVyZW5jZSh2cmYtPnJ0Nik7Ci0JCWlmIChsaWtlbHkocnQpKSB7Ci0JCQlkc3QgPSAmcnQtPmRzdDsKLQkJCWRzdF9ob2xkKGRzdCk7Ci0JCX0KLQotCQlyY3VfcmVhZF91bmxvY2soKTsKKwkvKiBWUkYgZGV2aWNlIGRvZXMgbm90IGhhdmUgYSBsaW5rLWxvY2FsIGFkZHJlc3MgYW5kCisJICogc2VuZGluZyBwYWNrZXRzIHRvIGxpbmstbG9jYWwgb3IgbWNhc3QgYWRkcmVzc2VzIG92ZXIKKwkgKiBhIFZSRiBkZXZpY2UgZG9lcyBub3QgbWFrZSBzZW5zZQorCSAqLworCWlmIChmbDYtPmZsb3dpNl9vaWYgPT0gZGV2LT5pZmluZGV4KSB7CisJCWRzdCA9ICZuZXQtPmlwdjYuaXA2X251bGxfZW50cnktPmRzdDsKKwkJZHN0X2hvbGQoZHN0KTsKKwkJcmV0dXJuIGRzdDsKIAl9CiAKLQkvKiBtYWtlIHN1cmUgb2lmIGlzIHNldCB0byBWUkYgZGV2aWNlIGZvciBsb29rdXAgKi8KLQlpZiAoIW5lZWRfc3RyaWN0KQotCQlmbDYtPmZsb3dpNl9vaWYgPSBkZXYtPmlmaW5kZXg7CisJaWYgKCFpcHY2X2FkZHJfYW55KCZmbDYtPnNhZGRyKSkKKwkJZmxhZ3MgfD0gUlQ2X0xPT0tVUF9GX0hBU19TQUREUjsKKworCXJ0ID0gdnJmX2lwNl9yb3V0ZV9sb29rdXAobmV0LCBkZXYsIGZsNiwgZmw2LT5mbG93aTZfb2lmLCBmbGFncyk7CisJaWYgKHJ0KQorCQlkc3QgPSAmcnQtPmRzdDsKIAogCXJldHVybiBkc3Q7CiB9Ci0KLS8qIGNhbGxlZCB1bmRlciByY3VfcmVhZF9sb2NrICovCi1zdGF0aWMgaW50IHZyZl9nZXRfc2FkZHI2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKLQkJCSAgc3RydWN0IGZsb3dpNiAqZmw2KQotewotCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKLQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7Ci0Jc3RydWN0IHJ0Nl9pbmZvICpydDsKLQlpbnQgZXJyOwotCi0JaWYgKHJ0Nl9uZWVkX3N0cmljdCgmZmw2LT5kYWRkcikpIHsKLQkJcnQgPSB2cmZfaXA2X3JvdXRlX2xvb2t1cChuZXQsIGRldiwgZmw2LCBmbDYtPmZsb3dpNl9vaWYsCi0JCQkJCSAgUlQ2X0xPT0tVUF9GX0lGQUNFKTsKLQkJaWYgKHVubGlrZWx5KCFydCkpCi0JCQlyZXR1cm4gMDsKLQotCQlkc3QgPSAmcnQtPmRzdDsKLQl9IGVsc2UgewotCQlfX3U4IGZsYWdzID0gZmw2LT5mbG93aTZfZmxhZ3M7Ci0KLQkJZmw2LT5mbG93aTZfZmxhZ3MgfD0gRkxPV0lfRkxBR19MM01ERVZfU1JDOwotCQlmbDYtPmZsb3dpNl9mbGFncyB8PSBGTE9XSV9GTEFHX1NLSVBfTkhfT0lGOwotCi0JCWRzdCA9IGlwNl9yb3V0ZV9vdXRwdXQobmV0LCBzaywgZmw2KTsKLQkJcnQgPSAoc3RydWN0IHJ0Nl9pbmZvICopZHN0OwotCi0JCWZsNi0+Zmxvd2k2X2ZsYWdzID0gZmxhZ3M7Ci0JfQotCi0JZXJyID0gZHN0LT5lcnJvcjsKLQlpZiAoIWVycikgewotCQllcnIgPSBpcDZfcm91dGVfZ2V0X3NhZGRyKG5ldCwgcnQsICZmbDYtPmRhZGRyLAotCQkJCQkgIHNrID8gaW5ldDZfc2soc2spLT5zcmNwcmVmcyA6IDAsCi0JCQkJCSAgJmZsNi0+c2FkZHIpOwotCX0KLQotCWRzdF9yZWxlYXNlKGRzdCk7Ci0KLQlyZXR1cm4gZXJyOwotfQogI2VuZGlmCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbDNtZGV2X29wcyB2cmZfbDNtZGV2X29wcyA9IHsKIAkubDNtZGV2X2ZpYl90YWJsZQk9IHZyZl9maWJfdGFibGUsCi0JLmwzbWRldl9nZXRfcnRhYmxlCT0gdnJmX2dldF9ydGFibGUsCi0JLmwzbWRldl9nZXRfc2FkZHIJPSB2cmZfZ2V0X3NhZGRyLAogCS5sM21kZXZfbDNfcmN2CQk9IHZyZl9sM19yY3YsCisJLmwzbWRldl9sM19vdXQJCT0gdnJmX2wzX291dCwKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQotCS5sM21kZXZfZ2V0X3J0Nl9kc3QJPSB2cmZfZ2V0X3J0Nl9kc3QsCi0JLmwzbWRldl9nZXRfc2FkZHI2CT0gdnJmX2dldF9zYWRkcjYsCisJLmwzbWRldl9saW5rX3Njb3BlX2xvb2t1cCA9IHZyZl9saW5rX3Njb3BlX2xvb2t1cCwKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdnhsYW4uYyBiL2RyaXZlcnMvbmV0L3Z4bGFuLmMKaW5kZXggZGE0ZTNkNi4uZTdkMTY2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdnhsYW4uYworKysgYi9kcml2ZXJzL25ldC92eGxhbi5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvbmV0bnMvZ2VuZXJpYy5oPgogI2luY2x1ZGUgPG5ldC92eGxhbi5oPgotI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKICNpbmNsdWRlIDxuZXQvaXA2X3R1bm5lbC5oPgpAQCAtMjg4LDcgKzI4Nyw3IEBACiAKIAlpZiAoIW5ldF9lcShkZXZfbmV0KHZ4bGFuLT5kZXYpLCB2eGxhbi0+bmV0KSAmJgogCSAgICBubGFfcHV0X3MzMihza2IsIE5EQV9MSU5LX05FVE5TSUQsCi0JCQlwZWVybmV0MmlkX2FsbG9jKGRldl9uZXQodnhsYW4tPmRldiksIHZ4bGFuLT5uZXQpKSkKKwkJCXBlZXJuZXQyaWQoZGV2X25ldCh2eGxhbi0+ZGV2KSwgdnhsYW4tPm5ldCkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCWlmIChzZW5kX2V0aCAmJiBubGFfcHV0KHNrYiwgTkRBX0xMQUREUiwgRVRIX0FMRU4sICZmZGItPmV0aF9hZGRyKSkKQEAgLTg2MSwyMCArODYwLDIwIEBACiAvKiBEdW1wIGZvcndhcmRpbmcgdGFibGUgKi8KIHN0YXRpYyBpbnQgdnhsYW5fZmRiX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZmlsdGVyX2RldiwgaW50IGlkeCkKKwkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmZpbHRlcl9kZXYsIGludCAqaWR4KQogewogCXN0cnVjdCB2eGxhbl9kZXYgKnZ4bGFuID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBpbnQgaDsKKwlpbnQgZXJyID0gMDsKIAogCWZvciAoaCA9IDA7IGggPCBGREJfSEFTSF9TSVpFOyArK2gpIHsKIAkJc3RydWN0IHZ4bGFuX2ZkYiAqZjsKLQkJaW50IGVycjsKIAogCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZiwgJnZ4bGFuLT5mZGJfaGVhZFtoXSwgaGxpc3QpIHsKIAkJCXN0cnVjdCB2eGxhbl9yZHN0ICpyZDsKIAogCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocmQsICZmLT5yZW1vdGVzLCBsaXN0KSB7Ci0JCQkJaWYgKGlkeCA8IGNiLT5hcmdzWzBdKQorCQkJCWlmICgqaWR4IDwgY2ItPmFyZ3NbMl0pCiAJCQkJCWdvdG8gc2tpcDsKIAogCQkJCWVyciA9IHZ4bGFuX2ZkYl9pbmZvKHNrYiwgdnhsYW4sIGYsCkBAIC04ODIsMTcgKzg4MSwxNSBAQAogCQkJCQkJICAgICBjYi0+bmxoLT5ubG1zZ19zZXEsCiAJCQkJCQkgICAgIFJUTV9ORVdORUlHSCwKIAkJCQkJCSAgICAgTkxNX0ZfTVVMVEksIHJkKTsKLQkJCQlpZiAoZXJyIDwgMCkgewotCQkJCQljYi0+YXJnc1sxXSA9IGVycjsKKwkJCQlpZiAoZXJyIDwgMCkKIAkJCQkJZ290byBvdXQ7Ci0JCQkJfQogc2tpcDoKLQkJCQkrK2lkeDsKKwkJCQkqaWR4ICs9IDE7CiAJCQl9CiAJCX0KIAl9CiBvdXQ6Ci0JcmV0dXJuIGlkeDsKKwlyZXR1cm4gZXJyOwogfQogCiAvKiBXYXRjaCBpbmNvbWluZyBwYWNrZXRzIHRvIGxlYXJuIG1hcHBpbmcgYmV0d2VlbiBFdGhlcm5ldCBhZGRyZXNzCkBAIC0xMjk0LDcgKzEyOTEsNyBAQAogCQlzdHJ1Y3QgbWV0YWRhdGFfZHN0ICp0dW5fZHN0OwogCiAJCXR1bl9kc3QgPSB1ZHBfdHVuX3J4X2RzdChza2IsIHZ4bGFuX2dldF9za19mYW1pbHkodnMpLCBUVU5ORUxfS0VZLAotCQkJCQkgdnhsYW5fdm5pX3RvX3R1bl9pZCh2bmkpLCBzaXplb2YoKm1kKSk7CisJCQkJCSBrZXkzMl90b190dW5uZWxfaWQodm5pKSwgc2l6ZW9mKCptZCkpOwogCiAJCWlmICghdHVuX2RzdCkKIAkJCWdvdG8gZHJvcDsKQEAgLTE4MTEsNyArMTgwOCw3IEBACiAJZmw0LmZsb3dpNF9tYXJrID0gc2tiLT5tYXJrOwogCWZsNC5mbG93aTRfcHJvdG8gPSBJUFBST1RPX1VEUDsKIAlmbDQuZGFkZHIgPSBkYWRkcjsKLQlmbDQuc2FkZHIgPSB2eGxhbi0+Y2ZnLnNhZGRyLnNpbi5zaW5fYWRkci5zX2FkZHI7CisJZmw0LnNhZGRyID0gKnNhZGRyOwogCiAJcnQgPSBpcF9yb3V0ZV9vdXRwdXRfa2V5KHZ4bGFuLT5uZXQsICZmbDQpOwogCWlmICghSVNfRVJSKHJ0KSkgewpAQCAtMTg0Nyw3ICsxODQ0LDcgQEAKIAltZW1zZXQoJmZsNiwgMCwgc2l6ZW9mKGZsNikpOwogCWZsNi5mbG93aTZfb2lmID0gb2lmOwogCWZsNi5kYWRkciA9ICpkYWRkcjsKLQlmbDYuc2FkZHIgPSB2eGxhbi0+Y2ZnLnNhZGRyLnNpbjYuc2luNl9hZGRyOworCWZsNi5zYWRkciA9ICpzYWRkcjsKIAlmbDYuZmxvd2xhYmVsID0gaXA2X21ha2VfZmxvd2luZm8oUlRfVE9TKHRvcyksIGxhYmVsKTsKIAlmbDYuZmxvd2k2X21hcmsgPSBza2ItPm1hcms7CiAJZmw2LmZsb3dpNl9wcm90byA9IElQUFJPVE9fVURQOwpAQCAtMTkyMCw3ICsxOTE3LDggQEAKIAlzdHJ1Y3QgcnRhYmxlICpydCA9IE5VTEw7CiAJY29uc3Qgc3RydWN0IGlwaGRyICpvbGRfaXBoOwogCXVuaW9uIHZ4bGFuX2FkZHIgKmRzdDsKLQl1bmlvbiB2eGxhbl9hZGRyIHJlbW90ZV9pcDsKKwl1bmlvbiB2eGxhbl9hZGRyIHJlbW90ZV9pcCwgbG9jYWxfaXA7CisJdW5pb24gdnhsYW5fYWRkciAqc3JjOwogCXN0cnVjdCB2eGxhbl9tZXRhZGF0YSBfbWQ7CiAJc3RydWN0IHZ4bGFuX21ldGFkYXRhICptZCA9ICZfbWQ7CiAJX19iZTE2IHNyY19wb3J0ID0gMCwgZHN0X3BvcnQ7CkBAIC0xOTM4LDYgKzE5MzYsNyBAQAogCQlkc3RfcG9ydCA9IHJkc3QtPnJlbW90ZV9wb3J0ID8gcmRzdC0+cmVtb3RlX3BvcnQgOiB2eGxhbi0+Y2ZnLmRzdF9wb3J0OwogCQl2bmkgPSByZHN0LT5yZW1vdGVfdm5pOwogCQlkc3QgPSAmcmRzdC0+cmVtb3RlX2lwOworCQlzcmMgPSAmdnhsYW4tPmNmZy5zYWRkcjsKIAkJZHN0X2NhY2hlID0gJnJkc3QtPmRzdF9jYWNoZTsKIAl9IGVsc2UgewogCQlpZiAoIWluZm8pIHsKQEAgLTE5NDYsMTMgKzE5NDUsMTcgQEAKIAkJCWdvdG8gZHJvcDsKIAkJfQogCQlkc3RfcG9ydCA9IGluZm8tPmtleS50cF9kc3QgPyA6IHZ4bGFuLT5jZmcuZHN0X3BvcnQ7Ci0JCXZuaSA9IHZ4bGFuX3R1bl9pZF90b192bmkoaW5mby0+a2V5LnR1bl9pZCk7CisJCXZuaSA9IHR1bm5lbF9pZF90b19rZXkzMihpbmZvLT5rZXkudHVuX2lkKTsKIAkJcmVtb3RlX2lwLnNhLnNhX2ZhbWlseSA9IGlwX3R1bm5lbF9pbmZvX2FmKGluZm8pOwotCQlpZiAocmVtb3RlX2lwLnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUKQorCQlpZiAocmVtb3RlX2lwLnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CiAJCQlyZW1vdGVfaXAuc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZm8tPmtleS51LmlwdjQuZHN0OwotCQllbHNlCisJCQlsb2NhbF9pcC5zaW4uc2luX2FkZHIuc19hZGRyID0gaW5mby0+a2V5LnUuaXB2NC5zcmM7CisJCX0gZWxzZSB7CiAJCQlyZW1vdGVfaXAuc2luNi5zaW42X2FkZHIgPSBpbmZvLT5rZXkudS5pcHY2LmRzdDsKKwkJCWxvY2FsX2lwLnNpbjYuc2luNl9hZGRyID0gaW5mby0+a2V5LnUuaXB2Ni5zcmM7CisJCX0KIAkJZHN0ID0gJnJlbW90ZV9pcDsKKwkJc3JjID0gJmxvY2FsX2lwOwogCQlkc3RfY2FjaGUgPSAmaW5mby0+ZHN0X2NhY2hlOwogCX0KIApAQCAtMTk5MiwxNSArMTk5NSwxNCBAQAogCX0KIAogCWlmIChkc3QtPnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7Ci0JCV9fYmUzMiBzYWRkcjsKLQogCQlpZiAoIXZ4bGFuLT52bjRfc29jaykKIAkJCWdvdG8gZHJvcDsKIAkJc2sgPSB2eGxhbi0+dm40X3NvY2stPnNvY2stPnNrOwogCiAJCXJ0ID0gdnhsYW5fZ2V0X3JvdXRlKHZ4bGFuLCBza2IsCiAJCQkJICAgICByZHN0ID8gcmRzdC0+cmVtb3RlX2lmaW5kZXggOiAwLCB0b3MsCi0JCQkJICAgICBkc3QtPnNpbi5zaW5fYWRkci5zX2FkZHIsICZzYWRkciwKKwkJCQkgICAgIGRzdC0+c2luLnNpbl9hZGRyLnNfYWRkciwKKwkJCQkgICAgICZzcmMtPnNpbi5zaW5fYWRkci5zX2FkZHIsCiAJCQkJICAgICBkc3RfY2FjaGUsIGluZm8pOwogCQlpZiAoSVNfRVJSKHJ0KSkgewogCQkJbmV0ZGV2X2RiZyhkZXYsICJubyByb3V0ZSB0byAlcEk0XG4iLApAQCAtMjAxNyw3ICsyMDE5LDcgQEAKIAkJfQogCiAJCS8qIEJ5cGFzcyBlbmNhcHN1bGF0aW9uIGlmIHRoZSBkZXN0aW5hdGlvbiBpcyBsb2NhbCAqLwotCQlpZiAocnQtPnJ0X2ZsYWdzICYgUlRDRl9MT0NBTCAmJgorCQlpZiAoIWluZm8gJiYgcnQtPnJ0X2ZsYWdzICYgUlRDRl9MT0NBTCAmJgogCQkgICAgIShydC0+cnRfZmxhZ3MgJiAoUlRDRl9CUk9BRENBU1QgfCBSVENGX01VTFRJQ0FTVCkpKSB7CiAJCQlzdHJ1Y3QgdnhsYW5fZGV2ICpkc3RfdnhsYW47CiAKQEAgLTIwNDMsMTMgKzIwNDUsMTIgQEAKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIHhtaXRfdHhfZXJyb3I7CiAKLQkJdWRwX3R1bm5lbF94bWl0X3NrYihydCwgc2ssIHNrYiwgc2FkZHIsCisJCXVkcF90dW5uZWxfeG1pdF9za2IocnQsIHNrLCBza2IsIHNyYy0+c2luLnNpbl9hZGRyLnNfYWRkciwKIAkJCQkgICAgZHN0LT5zaW4uc2luX2FkZHIuc19hZGRyLCB0b3MsIHR0bCwgZGYsCiAJCQkJICAgIHNyY19wb3J0LCBkc3RfcG9ydCwgeG5ldCwgIXVkcF9zdW0pOwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJfSBlbHNlIHsKIAkJc3RydWN0IGRzdF9lbnRyeSAqbmRzdDsKLQkJc3RydWN0IGluNl9hZGRyIHNhZGRyOwogCQl1MzIgcnQ2aV9mbGFnczsKIAogCQlpZiAoIXZ4bGFuLT52bjZfc29jaykKQEAgLTIwNTgsNyArMjA1OSw4IEBACiAKIAkJbmRzdCA9IHZ4bGFuNl9nZXRfcm91dGUodnhsYW4sIHNrYiwKIAkJCQkJcmRzdCA/IHJkc3QtPnJlbW90ZV9pZmluZGV4IDogMCwgdG9zLAotCQkJCQlsYWJlbCwgJmRzdC0+c2luNi5zaW42X2FkZHIsICZzYWRkciwKKwkJCQkJbGFiZWwsICZkc3QtPnNpbjYuc2luNl9hZGRyLAorCQkJCQkmc3JjLT5zaW42LnNpbjZfYWRkciwKIAkJCQkJZHN0X2NhY2hlLCBpbmZvKTsKIAkJaWYgKElTX0VSUihuZHN0KSkgewogCQkJbmV0ZGV2X2RiZyhkZXYsICJubyByb3V0ZSB0byAlcEk2XG4iLApAQCAtMjA3Nyw3ICsyMDc5LDcgQEAKIAogCQkvKiBCeXBhc3MgZW5jYXBzdWxhdGlvbiBpZiB0aGUgZGVzdGluYXRpb24gaXMgbG9jYWwgKi8KIAkJcnQ2aV9mbGFncyA9ICgoc3RydWN0IHJ0Nl9pbmZvICopbmRzdCktPnJ0NmlfZmxhZ3M7Ci0JCWlmIChydDZpX2ZsYWdzICYgUlRGX0xPQ0FMICYmCisJCWlmICghaW5mbyAmJiBydDZpX2ZsYWdzICYgUlRGX0xPQ0FMICYmCiAJCSAgICAhKHJ0NmlfZmxhZ3MgJiAoUlRDRl9CUk9BRENBU1QgfCBSVENGX01VTFRJQ0FTVCkpKSB7CiAJCQlzdHJ1Y3QgdnhsYW5fZGV2ICpkc3RfdnhsYW47CiAKQEAgLTIxMDEsMTAgKzIxMDMsMTIgQEAKIAkJCQkgICAgICB2bmksIG1kLCBmbGFncywgdWRwX3N1bSk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlkc3RfcmVsZWFzZShuZHN0KTsKKwkJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJCQlyZXR1cm47CiAJCX0KIAkJdWRwX3R1bm5lbDZfeG1pdF9za2IobmRzdCwgc2ssIHNrYiwgZGV2LAotCQkJCSAgICAgJnNhZGRyLCAmZHN0LT5zaW42LnNpbjZfYWRkciwgdG9zLCB0dGwsCisJCQkJICAgICAmc3JjLT5zaW42LnNpbjZfYWRkciwKKwkJCQkgICAgICZkc3QtPnNpbjYuc2luNl9hZGRyLCB0b3MsIHR0bCwKIAkJCQkgICAgIGxhYmVsLCBzcmNfcG9ydCwgZHN0X3BvcnQsICF1ZHBfc3VtKTsKICNlbmRpZgogCX0KQEAgLTI3NzYsMTQgKzI3ODAsMTUgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbG93ZXJkZXYgPSBOVUxMOwogCiAJaWYgKGNvbmYtPmZsYWdzICYgVlhMQU5fRl9HUEUpIHsKLQkJaWYgKGNvbmYtPmZsYWdzICYgflZYTEFOX0ZfQUxMT1dFRF9HUEUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKIAkJLyogRm9yIG5vdywgYWxsb3cgR1BFIG9ubHkgdG9nZXRoZXIgd2l0aCBDT0xMRUNUX01FVEFEQVRBLgogCQkgKiBUaGlzIGNhbiBiZSByZWxheGVkIGxhdGVyOyBpbiBzdWNoIGNhc2UsIHRoZSBvdGhlciBzaWRlCiAJCSAqIG9mIHRoZSBQdFAgbGluayB3aWxsIGhhdmUgdG8gYmUgcHJvdmlkZWQuCiAJCSAqLwotCQlpZiAoIShjb25mLT5mbGFncyAmIFZYTEFOX0ZfQ09MTEVDVF9NRVRBREFUQSkpCisJCWlmICgoY29uZi0+ZmxhZ3MgJiB+VlhMQU5fRl9BTExPV0VEX0dQRSkgfHwKKwkJICAgICEoY29uZi0+ZmxhZ3MgJiBWWExBTl9GX0NPTExFQ1RfTUVUQURBVEEpKSB7CisJCQlwcl9pbmZvKCJ1bnN1cHBvcnRlZCBjb21iaW5hdGlvbiBvZiBleHRlbnNpb25zXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOworCQl9CiAKIAkJdnhsYW5fcmF3X3NldHVwKGRldik7CiAJfSBlbHNlIHsKQEAgLTI4MzYsNiArMjg0MSw5IEBACiAJCQlkZXYtPm10dSA9IGxvd2VyZGV2LT5tdHUgLSAodXNlX2lwdjYgPyBWWExBTjZfSEVBRFJPT00gOiBWWExBTl9IRUFEUk9PTSk7CiAKIAkJbmVlZGVkX2hlYWRyb29tID0gbG93ZXJkZXYtPmhhcmRfaGVhZGVyX2xlbjsKKwl9IGVsc2UgaWYgKHZ4bGFuX2FkZHJfbXVsdGljYXN0KCZkc3QtPnJlbW90ZV9pcCkpIHsKKwkJcHJfaW5mbygibXVsdGljYXN0IGRlc3RpbmF0aW9uIHJlcXVpcmVzIGludGVyZmFjZSB0byBiZSBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoY29uZi0+bXR1KSB7CkBAIC0yODY4LDggKzI4NzYsMTAgQEAKIAkJICAgICB0bXAtPmNmZy5zYWRkci5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpID09IHVzZV9pcHY2ICYmCiAJCSAgICB0bXAtPmNmZy5kc3RfcG9ydCA9PSB2eGxhbi0+Y2ZnLmRzdF9wb3J0ICYmCiAJCSAgICAodG1wLT5mbGFncyAmIFZYTEFOX0ZfUkNWX0ZMQUdTKSA9PQotCQkgICAgKHZ4bGFuLT5mbGFncyAmIFZYTEFOX0ZfUkNWX0ZMQUdTKSkKLQkJcmV0dXJuIC1FRVhJU1Q7CisJCSAgICAodnhsYW4tPmZsYWdzICYgVlhMQU5fRl9SQ1ZfRkxBR1MpKSB7CisJCQlwcl9pbmZvKCJkdXBsaWNhdGUgVk5JICV1XG4iLCBiZTMyX3RvX2NwdShjb25mLT52bmkpKTsKKwkJCXJldHVybiAtRUVYSVNUOworCQl9CiAJfQogCiAJZGV2LT5ldGh0b29sX29wcyA9ICZ2eGxhbl9ldGh0b29sX29wczsKQEAgLTI5MDMsNyArMjkxMyw2IEBACiAJCQkgc3RydWN0IG5sYXR0ciAqdGJbXSwgc3RydWN0IG5sYXR0ciAqZGF0YVtdKQogewogCXN0cnVjdCB2eGxhbl9jb25maWcgY29uZjsKLQlpbnQgZXJyOwogCiAJbWVtc2V0KCZjb25mLCAwLCBzaXplb2YoY29uZikpOwogCkBAIC0zMDEyLDI2ICszMDIxLDcgQEAKIAlpZiAodGJbSUZMQV9NVFVdKQogCQljb25mLm10dSA9IG5sYV9nZXRfdTMyKHRiW0lGTEFfTVRVXSk7CiAKLQllcnIgPSB2eGxhbl9kZXZfY29uZmlndXJlKHNyY19uZXQsIGRldiwgJmNvbmYpOwotCXN3aXRjaCAoZXJyKSB7Ci0JY2FzZSAtRU5PREVWOgotCQlwcl9pbmZvKCJpZmluZGV4ICVkIGRvZXMgbm90IGV4aXN0XG4iLCBjb25mLnJlbW90ZV9pZmluZGV4KTsKLQkJYnJlYWs7Ci0KLQljYXNlIC1FUEVSTToKLQkJcHJfaW5mbygiSVB2NiBpcyBkaXNhYmxlZCB2aWEgc3lzY3RsXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIC1FRVhJU1Q6Ci0JCXByX2luZm8oImR1cGxpY2F0ZSBWTkkgJXVcbiIsIGJlMzJfdG9fY3B1KGNvbmYudm5pKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSAtRUlOVkFMOgotCQlwcl9pbmZvKCJ1bnN1cHBvcnRlZCBjb21iaW5hdGlvbiBvZiBleHRlbnNpb25zXG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gdnhsYW5fZGV2X2NvbmZpZ3VyZShzcmNfbmV0LCBkZXYsICZjb25mKTsKIH0KIAogc3RhdGljIHZvaWQgdnhsYW5fZGVsbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2ZzbF91Y2NfaGRsYy5jIGIvZHJpdmVycy9uZXQvd2FuL2ZzbF91Y2NfaGRsYy5jCmluZGV4IDZmMDQ0NDUuLjVmYmY4M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9mc2xfdWNjX2hkbGMuYworKysgYi9kcml2ZXJzL25ldC93YW4vZnNsX3VjY19oZGxjLmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogCQkJCUFMSUdOTUVOVF9PRl9VQ0NfSERMQ19QUkFNKTsKIAogCWlmIChwcml2LT51Y2NfcHJhbV9vZmZzZXQgPCAwKSB7Ci0JCWRldl9lcnIocHJpdi0+ZGV2LCAiQ2FuIG5vdCBhbGxvY2F0ZSBNVVJBTSBmb3IgaGRsYyBwcmFtZXRlci5cbiIpOworCQlkZXZfZXJyKHByaXYtPmRldiwgIkNhbiBub3QgYWxsb2NhdGUgTVVSQU0gZm9yIGhkbGMgcGFyYW1ldGVyLlxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZnJlZV90eF9iZDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vc2JuaS5jIGIvZHJpdmVycy9uZXQvd2FuL3NibmkuYwppbmRleCBkOThjN2U1Li4zYTQyMWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vc2JuaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zYm5pLmMKQEAgLTU4Miw4ICs1ODIsOCBAQAogCiAKIC8qCi0gKiBSb3V0aW5lIHJldHVybnMgMSBpZiBpdCBuZWVkIHRvIGFja25vd2VsZWRnZSByZWNlaXZlZCBmcmFtZS4KLSAqIEVtcHR5IGZyYW1lIHJlY2VpdmVkIHdpdGhvdXQgZXJyb3JzIHdvbid0IGJlIGFja25vd2VsZWRnZWQuCisgKiBSb3V0aW5lIHJldHVybnMgMSBpZiBpdCBuZWVkcyB0byBhY2tub3dsZWRnZSByZWNlaXZlZCBmcmFtZS4KKyAqIEVtcHR5IGZyYW1lIHJlY2VpdmVkIHdpdGhvdXQgZXJyb3JzIHdvbid0IGJlIGFja25vd2xlZGdlZC4KICAqLwogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLW5vdGlmLmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLW5vdGlmLmMKaW5kZXggZmMxMzU1ZC4uNWQ0MjlmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi1ub3RpZi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2Itbm90aWYuYwpAQCAtMjA2LDcgKzIwNiw2IEBACiAJaTI0MDBtdS0+bm90aWZfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWkyNDAwbXUtPm5vdGlmX3VyYikgewogCQlyZXQgPSAtRU5PTUVNOwotCQlkZXZfZXJyKGRldiwgIm5vdGlmaWNhdGlvbjogY2Fubm90IGFsbG9jYXRlIFVSQlxuIik7CiAJCWdvdG8gZXJyb3JfYWxsb2NfdXJiOwogCX0KIAllcGQgPSB1c2JfZ2V0X2VwZChpMjQwMG11LT51c2JfaWZhY2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI1NTIzL2FyNTUyMy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2FyNTUyMy9hcjU1MjMuYwppbmRleCA4YWRlZDI0Li43YTYwZDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI1NTIzL2FyNTUyMy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjU1MjMvYXI1NTIzLmMKQEAgLTcwNiwxMCArNzA2LDggQEAKIAogCQlkYXRhLT5hciA9IGFyOwogCQlkYXRhLT51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQlpZiAoIWRhdGEtPnVyYikgewotCQkJYXI1NTIzX2VycihhciwgImNvdWxkIG5vdCBhbGxvY2F0ZSByeCBkYXRhIHVyYlxuIik7CisJCWlmICghZGF0YS0+dXJiKQogCQkJZ290byBlcnI7Ci0JCX0KIAkJbGlzdF9hZGRfdGFpbCgmZGF0YS0+bGlzdCwgJmFyLT5yeF9kYXRhX2ZyZWUpOwogCQlhdG9taWNfaW5jKCZhci0+cnhfZGF0YV9mcmVlX2NudCk7CiAJfQpAQCAtODI0LDcgKzgyMiw2IEBACiAKIAkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWFyNTUyM19lcnIoYXIsICJGYWlsZWQgdG8gYWxsb2NhdGUgVFggdXJiXG4iKTsKIAkJCWllZWU4MDIxMV9mcmVlX3R4c2tiKGFyLT5odywgc2tiKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC05NDksMTAgKzk0Niw4IEBACiAJaW5pdF9jb21wbGV0aW9uKCZjbWQtPmRvbmUpOwogCiAJY21kLT51cmJfdHggPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghY21kLT51cmJfdHgpIHsKLQkJYXI1NTIzX2VycihhciwgImNvdWxkIG5vdCBhbGxvY2F0ZSB1cmJcbiIpOworCWlmICghY21kLT51cmJfdHgpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAljbWQtPmJ1Zl90eCA9IHVzYl9hbGxvY19jb2hlcmVudChhci0+ZGV2LCBBUjU1MjNfTUFYX1RYQ01EU1osCiAJCQkJCSBHRlBfS0VSTkVMLAogCQkJCQkgJmNtZC0+dXJiX3R4LT50cmFuc2Zlcl9kbWEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9haGIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvYWhiLmMKaW5kZXggYWNlYzE2Yi4uNzY2YzYzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9haGIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2FoYi5jCkBAIC05MSw1OSArOTEsMzcgQEAKIHsKIAlzdHJ1Y3QgYXRoMTBrX2FoYiAqYXJfYWhiID0gYXRoMTBrX2FoYl9wcml2KGFyKTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JaW50IHJldDsKIAogCWRldiA9ICZhcl9haGItPnBkZXYtPmRldjsKIAotCWFyX2FoYi0+Y21kX2NsayA9IGNsa19nZXQoZGV2LCAid2lmaV93Y3NzX2NtZCIpOworCWFyX2FoYi0+Y21kX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJ3aWZpX3djc3NfY21kIik7CiAJaWYgKElTX0VSUl9PUl9OVUxMKGFyX2FoYi0+Y21kX2NsaykpIHsKIAkJYXRoMTBrX2VycihhciwgImZhaWxlZCB0byBnZXQgY21kIGNsazogJWxkXG4iLAogCQkJICAgUFRSX0VSUihhcl9haGItPmNtZF9jbGspKTsKLQkJcmV0ID0gYXJfYWhiLT5jbWRfY2xrID8gUFRSX0VSUihhcl9haGItPmNtZF9jbGspIDogLUVOT0RFVjsKLQkJZ290byBvdXQ7CisJCXJldHVybiBhcl9haGItPmNtZF9jbGsgPyBQVFJfRVJSKGFyX2FoYi0+Y21kX2NsaykgOiAtRU5PREVWOwogCX0KIAotCWFyX2FoYi0+cmVmX2NsayA9IGNsa19nZXQoZGV2LCAid2lmaV93Y3NzX3JlZiIpOworCWFyX2FoYi0+cmVmX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJ3aWZpX3djc3NfcmVmIik7CiAJaWYgKElTX0VSUl9PUl9OVUxMKGFyX2FoYi0+cmVmX2NsaykpIHsKIAkJYXRoMTBrX2VycihhciwgImZhaWxlZCB0byBnZXQgcmVmIGNsazogJWxkXG4iLAogCQkJICAgUFRSX0VSUihhcl9haGItPnJlZl9jbGspKTsKLQkJcmV0ID0gYXJfYWhiLT5yZWZfY2xrID8gUFRSX0VSUihhcl9haGItPnJlZl9jbGspIDogLUVOT0RFVjsKLQkJZ290byBlcnJfY21kX2Nsa19wdXQ7CisJCXJldHVybiBhcl9haGItPnJlZl9jbGsgPyBQVFJfRVJSKGFyX2FoYi0+cmVmX2NsaykgOiAtRU5PREVWOwogCX0KIAotCWFyX2FoYi0+cnRjX2NsayA9IGNsa19nZXQoZGV2LCAid2lmaV93Y3NzX3J0YyIpOworCWFyX2FoYi0+cnRjX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJ3aWZpX3djc3NfcnRjIik7CiAJaWYgKElTX0VSUl9PUl9OVUxMKGFyX2FoYi0+cnRjX2NsaykpIHsKIAkJYXRoMTBrX2VycihhciwgImZhaWxlZCB0byBnZXQgcnRjIGNsazogJWxkXG4iLAogCQkJICAgUFRSX0VSUihhcl9haGItPnJ0Y19jbGspKTsKLQkJcmV0ID0gYXJfYWhiLT5ydGNfY2xrID8gUFRSX0VSUihhcl9haGItPnJ0Y19jbGspIDogLUVOT0RFVjsKLQkJZ290byBlcnJfcmVmX2Nsa19wdXQ7CisJCXJldHVybiBhcl9haGItPnJ0Y19jbGsgPyBQVFJfRVJSKGFyX2FoYi0+cnRjX2NsaykgOiAtRU5PREVWOwogCX0KIAogCXJldHVybiAwOwotCi1lcnJfcmVmX2Nsa19wdXQ6Ci0JY2xrX3B1dChhcl9haGItPnJlZl9jbGspOwotCi1lcnJfY21kX2Nsa19wdXQ6Ci0JY2xrX3B1dChhcl9haGItPmNtZF9jbGspOwotCi1vdXQ6Ci0JcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgYXRoMTBrX2FoYl9jbG9ja19kZWluaXQoc3RydWN0IGF0aDEwayAqYXIpCiB7CiAJc3RydWN0IGF0aDEwa19haGIgKmFyX2FoYiA9IGF0aDEwa19haGJfcHJpdihhcik7CiAKLQlpZiAoIUlTX0VSUl9PUl9OVUxMKGFyX2FoYi0+Y21kX2NsaykpCi0JCWNsa19wdXQoYXJfYWhiLT5jbWRfY2xrKTsKLQotCWlmICghSVNfRVJSX09SX05VTEwoYXJfYWhiLT5yZWZfY2xrKSkKLQkJY2xrX3B1dChhcl9haGItPnJlZl9jbGspOwotCi0JaWYgKCFJU19FUlJfT1JfTlVMTChhcl9haGItPnJ0Y19jbGspKQotCQljbGtfcHV0KGFyX2FoYi0+cnRjX2Nsayk7Ci0KIAlhcl9haGItPmNtZF9jbGsgPSBOVUxMOwogCWFyX2FoYi0+cmVmX2NsayA9IE5VTEw7CiAJYXJfYWhiLT5ydGNfY2xrID0gTlVMTDsKQEAgLTIxMyw5MiArMTkxLDUxIEBACiB7CiAJc3RydWN0IGF0aDEwa19haGIgKmFyX2FoYiA9IGF0aDEwa19haGJfcHJpdihhcik7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCWludCByZXQ7CiAKIAlkZXYgPSAmYXJfYWhiLT5wZGV2LT5kZXY7CiAKLQlhcl9haGItPmNvcmVfY29sZF9yc3QgPSByZXNldF9jb250cm9sX2dldChkZXYsICJ3aWZpX2NvcmVfY29sZCIpOwotCWlmIChJU19FUlJfT1JfTlVMTChhcl9haGItPmNvcmVfY29sZF9yc3QpKSB7CisJYXJfYWhiLT5jb3JlX2NvbGRfcnN0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldChkZXYsICJ3aWZpX2NvcmVfY29sZCIpOworCWlmIChJU19FUlIoYXJfYWhiLT5jb3JlX2NvbGRfcnN0KSkgewogCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIGdldCBjb3JlIGNvbGQgcnN0IGN0cmw6ICVsZFxuIiwKIAkJCSAgIFBUUl9FUlIoYXJfYWhiLT5jb3JlX2NvbGRfcnN0KSk7Ci0JCXJldCA9IGFyX2FoYi0+Y29yZV9jb2xkX3JzdCA/Ci0JCQlQVFJfRVJSKGFyX2FoYi0+Y29yZV9jb2xkX3JzdCkgOiAtRU5PREVWOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIFBUUl9FUlIoYXJfYWhiLT5jb3JlX2NvbGRfcnN0KTsKIAl9CiAKLQlhcl9haGItPnJhZGlvX2NvbGRfcnN0ID0gcmVzZXRfY29udHJvbF9nZXQoZGV2LCAid2lmaV9yYWRpb19jb2xkIik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGFyX2FoYi0+cmFkaW9fY29sZF9yc3QpKSB7CisJYXJfYWhiLT5yYWRpb19jb2xkX3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAid2lmaV9yYWRpb19jb2xkIik7CisJaWYgKElTX0VSUihhcl9haGItPnJhZGlvX2NvbGRfcnN0KSkgewogCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIGdldCByYWRpbyBjb2xkIHJzdCBjdHJsOiAlbGRcbiIsCiAJCQkgICBQVFJfRVJSKGFyX2FoYi0+cmFkaW9fY29sZF9yc3QpKTsKLQkJcmV0ID0gYXJfYWhiLT5yYWRpb19jb2xkX3JzdCA/Ci0JCQlQVFJfRVJSKGFyX2FoYi0+cmFkaW9fY29sZF9yc3QpIDogLUVOT0RFVjsKLQkJZ290byBlcnJfY29yZV9jb2xkX3JzdF9wdXQ7CisJCXJldHVybiBQVFJfRVJSKGFyX2FoYi0+cmFkaW9fY29sZF9yc3QpOwogCX0KIAotCWFyX2FoYi0+cmFkaW9fd2FybV9yc3QgPSByZXNldF9jb250cm9sX2dldChkZXYsICJ3aWZpX3JhZGlvX3dhcm0iKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoYXJfYWhiLT5yYWRpb193YXJtX3JzdCkpIHsKKwlhcl9haGItPnJhZGlvX3dhcm1fcnN0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldChkZXYsICJ3aWZpX3JhZGlvX3dhcm0iKTsKKwlpZiAoSVNfRVJSKGFyX2FoYi0+cmFkaW9fd2FybV9yc3QpKSB7CiAJCWF0aDEwa19lcnIoYXIsICJmYWlsZWQgdG8gZ2V0IHJhZGlvIHdhcm0gcnN0IGN0cmw6ICVsZFxuIiwKIAkJCSAgIFBUUl9FUlIoYXJfYWhiLT5yYWRpb193YXJtX3JzdCkpOwotCQlyZXQgPSBhcl9haGItPnJhZGlvX3dhcm1fcnN0ID8KLQkJCVBUUl9FUlIoYXJfYWhiLT5yYWRpb193YXJtX3JzdCkgOiAtRU5PREVWOwotCQlnb3RvIGVycl9yYWRpb19jb2xkX3JzdF9wdXQ7CisJCXJldHVybiBQVFJfRVJSKGFyX2FoYi0+cmFkaW9fd2FybV9yc3QpOwogCX0KIAotCWFyX2FoYi0+cmFkaW9fc3JpZl9yc3QgPSByZXNldF9jb250cm9sX2dldChkZXYsICJ3aWZpX3JhZGlvX3NyaWYiKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoYXJfYWhiLT5yYWRpb19zcmlmX3JzdCkpIHsKKwlhcl9haGItPnJhZGlvX3NyaWZfcnN0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldChkZXYsICJ3aWZpX3JhZGlvX3NyaWYiKTsKKwlpZiAoSVNfRVJSKGFyX2FoYi0+cmFkaW9fc3JpZl9yc3QpKSB7CiAJCWF0aDEwa19lcnIoYXIsICJmYWlsZWQgdG8gZ2V0IHJhZGlvIHNyaWYgcnN0IGN0cmw6ICVsZFxuIiwKIAkJCSAgIFBUUl9FUlIoYXJfYWhiLT5yYWRpb19zcmlmX3JzdCkpOwotCQlyZXQgPSBhcl9haGItPnJhZGlvX3NyaWZfcnN0ID8KLQkJCVBUUl9FUlIoYXJfYWhiLT5yYWRpb19zcmlmX3JzdCkgOiAtRU5PREVWOwotCQlnb3RvIGVycl9yYWRpb193YXJtX3JzdF9wdXQ7CisJCXJldHVybiBQVFJfRVJSKGFyX2FoYi0+cmFkaW9fc3JpZl9yc3QpOwogCX0KIAotCWFyX2FoYi0+Y3B1X2luaXRfcnN0ID0gcmVzZXRfY29udHJvbF9nZXQoZGV2LCAid2lmaV9jcHVfaW5pdCIpOwotCWlmIChJU19FUlJfT1JfTlVMTChhcl9haGItPmNwdV9pbml0X3JzdCkpIHsKKwlhcl9haGItPmNwdV9pbml0X3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAid2lmaV9jcHVfaW5pdCIpOworCWlmIChJU19FUlIoYXJfYWhiLT5jcHVfaW5pdF9yc3QpKSB7CiAJCWF0aDEwa19lcnIoYXIsICJmYWlsZWQgdG8gZ2V0IGNwdSBpbml0IHJzdCBjdHJsOiAlbGRcbiIsCiAJCQkgICBQVFJfRVJSKGFyX2FoYi0+Y3B1X2luaXRfcnN0KSk7Ci0JCXJldCA9IGFyX2FoYi0+Y3B1X2luaXRfcnN0ID8KLQkJCVBUUl9FUlIoYXJfYWhiLT5jcHVfaW5pdF9yc3QpIDogLUVOT0RFVjsKLQkJZ290byBlcnJfcmFkaW9fc3JpZl9yc3RfcHV0OworCQlyZXR1cm4gUFRSX0VSUihhcl9haGItPmNwdV9pbml0X3JzdCk7CiAJfQogCiAJcmV0dXJuIDA7Ci0KLWVycl9yYWRpb19zcmlmX3JzdF9wdXQ6Ci0JcmVzZXRfY29udHJvbF9wdXQoYXJfYWhiLT5yYWRpb19zcmlmX3JzdCk7Ci0KLWVycl9yYWRpb193YXJtX3JzdF9wdXQ6Ci0JcmVzZXRfY29udHJvbF9wdXQoYXJfYWhiLT5yYWRpb193YXJtX3JzdCk7Ci0KLWVycl9yYWRpb19jb2xkX3JzdF9wdXQ6Ci0JcmVzZXRfY29udHJvbF9wdXQoYXJfYWhiLT5yYWRpb19jb2xkX3JzdCk7Ci0KLWVycl9jb3JlX2NvbGRfcnN0X3B1dDoKLQlyZXNldF9jb250cm9sX3B1dChhcl9haGItPmNvcmVfY29sZF9yc3QpOwotCi1vdXQ6Ci0JcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgYXRoMTBrX2FoYl9yc3RfY3RybF9kZWluaXQoc3RydWN0IGF0aDEwayAqYXIpCiB7CiAJc3RydWN0IGF0aDEwa19haGIgKmFyX2FoYiA9IGF0aDEwa19haGJfcHJpdihhcik7CiAKLQlpZiAoIUlTX0VSUl9PUl9OVUxMKGFyX2FoYi0+Y29yZV9jb2xkX3JzdCkpCi0JCXJlc2V0X2NvbnRyb2xfcHV0KGFyX2FoYi0+Y29yZV9jb2xkX3JzdCk7Ci0KLQlpZiAoIUlTX0VSUl9PUl9OVUxMKGFyX2FoYi0+cmFkaW9fY29sZF9yc3QpKQotCQlyZXNldF9jb250cm9sX3B1dChhcl9haGItPnJhZGlvX2NvbGRfcnN0KTsKLQotCWlmICghSVNfRVJSX09SX05VTEwoYXJfYWhiLT5yYWRpb193YXJtX3JzdCkpCi0JCXJlc2V0X2NvbnRyb2xfcHV0KGFyX2FoYi0+cmFkaW9fd2FybV9yc3QpOwotCi0JaWYgKCFJU19FUlJfT1JfTlVMTChhcl9haGItPnJhZGlvX3NyaWZfcnN0KSkKLQkJcmVzZXRfY29udHJvbF9wdXQoYXJfYWhiLT5yYWRpb19zcmlmX3JzdCk7Ci0KLQlpZiAoIUlTX0VSUl9PUl9OVUxMKGFyX2FoYi0+Y3B1X2luaXRfcnN0KSkKLQkJcmVzZXRfY29udHJvbF9wdXQoYXJfYWhiLT5jcHVfaW5pdF9yc3QpOwotCiAJYXJfYWhiLT5jb3JlX2NvbGRfcnN0ID0gTlVMTDsKIAlhcl9haGItPnJhZGlvX2NvbGRfcnN0ID0gTlVMTDsKIAlhcl9haGItPnJhZGlvX3dhcm1fcnN0ID0gTlVMTDsKQEAgLTQ2MiwxMyArMzk5LDEzIEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgYXRoMTBrX2FoYl9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IGF0aDEwayAqYXIgPSBhcmc7Ci0Jc3RydWN0IGF0aDEwa19wY2kgKmFyX3BjaSA9IGF0aDEwa19wY2lfcHJpdihhcik7CiAKIAlpZiAoIWF0aDEwa19wY2lfaXJxX3BlbmRpbmcoYXIpKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKIAlhdGgxMGtfcGNpX2Rpc2FibGVfYW5kX2NsZWFyX2xlZ2FjeV9pcnEoYXIpOwotCXRhc2tsZXRfc2NoZWR1bGUoJmFyX3BjaS0+aW50cl90cSk7CisJYXRoMTBrX3BjaV9pcnFfbXNpX2Z3X21hc2soYXIpOworCW5hcGlfc2NoZWR1bGUoJmFyLT5uYXBpKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTU3MiwxMiArNTA5LDEzIEBACiAJYXJfYWhiLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAibGVnYWN5Iik7CiAJaWYgKGFyX2FoYi0+aXJxIDwgMCkgewogCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIGdldCBpcnEgbnVtYmVyOiAlZFxuIiwgYXJfYWhiLT5pcnEpOworCQlyZXQgPSBhcl9haGItPmlycTsKIAkJZ290byBlcnJfY2xvY2tfZGVpbml0OwogCX0KIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk9PVCwgImlycTogJWRcbiIsIGFyX2FoYi0+aXJxKTsKIAotCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk9PVCwgIm1lbTogMHglcCBtZW1fbGVuOiAlbHUgZ2NjIG1lbTogMHglcCB0Y3NyX21lbTogMHglcFxuIiwKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0JPT1QsICJtZW06IDB4JXBLIG1lbV9sZW46ICVsdSBnY2MgbWVtOiAweCVwSyB0Y3NyX21lbTogMHglcEtcbiIsCiAJCSAgIGFyX2FoYi0+bWVtLCBhcl9haGItPm1lbV9sZW4sCiAJCSAgIGFyX2FoYi0+Z2NjX21lbSwgYXJfYWhiLT50Y3NyX21lbSk7CiAJcmV0dXJuIDA7CkBAIC03MTcsNiArNjU1LDkgQEAKIAlzeW5jaHJvbml6ZV9pcnEoYXJfYWhiLT5pcnEpOwogCiAJYXRoMTBrX3BjaV9mbHVzaChhcik7CisKKwluYXBpX3N5bmNocm9uaXplKCZhci0+bmFwaSk7CisJbmFwaV9kaXNhYmxlKCZhci0+bmFwaSk7CiB9CiAKIHN0YXRpYyBpbnQgYXRoMTBrX2FoYl9oaWZfcG93ZXJfdXAoc3RydWN0IGF0aDEwayAqYXIpCkBAIC03NDgsNiArNjg5LDcgQEAKIAkJYXRoMTBrX2VycihhciwgImNvdWxkIG5vdCB3YWtlIHVwIHRhcmdldCBDUFU6ICVkXG4iLCByZXQpOwogCQlnb3RvIGVycl9jZV9kZWluaXQ7CiAJfQorCW5hcGlfZW5hYmxlKCZhci0+bmFwaSk7CiAKIAlyZXR1cm4gMDsKIApAQCAtODMxLDcgKzc3Myw3IEBACiAJCWdvdG8gZXJyX3Jlc291cmNlX2RlaW5pdDsKIAl9CiAKLQlhdGgxMGtfcGNpX2luaXRfaXJxX3Rhc2tsZXRzKGFyKTsKKwlhdGgxMGtfcGNpX2luaXRfbmFwaShhcik7CiAKIAlyZXQgPSBhdGgxMGtfYWhiX3JlcXVlc3RfaXJxX2xlZ2FjeShhcik7CiAJaWYgKHJldCkKQEAgLTg0Niw2ICs3ODgsNyBAQAogCWNoaXBfaWQgPSBhdGgxMGtfYWhiX3NvY19yZWFkMzIoYXIsIFNPQ19DSElQX0lEX0FERFJFU1MpOwogCWlmIChjaGlwX2lkID09IDB4ZmZmZmZmZmYpIHsKIAkJYXRoMTBrX2VycihhciwgImZhaWxlZCB0byBnZXQgY2hpcCBpZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX2hhbHRfZGV2aWNlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ibWkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvYm1pLmMKaW5kZXggM2QyOWIwOC4uMjg3MmQzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ibWkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2JtaS5jCkBAIC0yMjEsNyArMjIxLDcgQEAKIAl1MzIgdHhsZW47CiAJaW50IHJldDsKIAotCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk1JLCAiYm1pIGx6IGRhdGEgYnVmZmVyIDB4JXAgbGVuZ3RoICVkXG4iLAorCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk1JLCAiYm1pIGx6IGRhdGEgYnVmZmVyIDB4JXBLIGxlbmd0aCAlZFxuIiwKIAkJICAgYnVmZmVyLCBsZW5ndGgpOwogCiAJaWYgKGFyLT5ibWkuZG9uZV9zZW50KSB7CkBAIC0yODcsNyArMjg3LDcgQEAKIAlpbnQgcmV0OwogCiAJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19CTUksCi0JCSAgICJibWkgZmFzdCBkb3dubG9hZCBhZGRyZXNzIDB4JXggYnVmZmVyIDB4JXAgbGVuZ3RoICVkXG4iLAorCQkgICAiYm1pIGZhc3QgZG93bmxvYWQgYWRkcmVzcyAweCV4IGJ1ZmZlciAweCVwSyBsZW5ndGggJWRcbiIsCiAJCSAgIGFkZHJlc3MsIGJ1ZmZlciwgbGVuZ3RoKTsKIAogCXJldCA9IGF0aDEwa19ibWlfbHpfc3RyZWFtX3N0YXJ0KGFyLCBhZGRyZXNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY2UuYwppbmRleCA5ZmI4ZDc0Li4wYjRkNzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jZS5jCkBAIC0zOSw3ICszOSw3IEBACiAgKiBjaG9vc2VzIHdoYXQgdG8gc2VuZCAoYnVmZmVyIGFkZHJlc3MsIGxlbmd0aCkuIFRoZSBkZXN0aW5hdGlvbgogICogc2lkZSBrZWVwcyBhIHN1cHBseSBvZiAiYW5vbnltb3VzIHJlY2VpdmUgYnVmZmVycyIgYXZhaWxhYmxlIGFuZAogICogaXQgaGFuZGxlcyBpbmNvbWluZyBkYXRhIGFzIGl0IGFycml2ZXMgKHdoZW4gdGhlIGRlc3RpbmF0aW9uCi0gKiByZWNpZXZlcyBhbiBpbnRlcnJ1cHQpLgorICogcmVjZWl2ZXMgYW4gaW50ZXJydXB0KS4KICAqCiAgKiBUaGUgc2VuZGVyIG1heSBzZW5kIGEgc2ltcGxlIGJ1ZmZlciAoYWRkcmVzcy9sZW5ndGgpIG9yIGl0IG1heQogICogc2VuZCBhIHNtYWxsIGxpc3Qgb2YgYnVmZmVycy4gIFdoZW4gYSBzbWFsbCBsaXN0IGlzIHNlbnQsIGhhcmR3YXJlCkBAIC00MzMsNiArNDMzLDEzIEBACiAJdW5zaWduZWQgaW50IG5lbnRyaWVzX21hc2sgPSBkZXN0X3JpbmctPm5lbnRyaWVzX21hc2s7CiAJdW5zaWduZWQgaW50IHdyaXRlX2luZGV4ID0gZGVzdF9yaW5nLT53cml0ZV9pbmRleDsKIAl1MzIgY3RybF9hZGRyID0gcGlwZS0+Y3RybF9hZGRyOworCXUzMiBjdXJfd3JpdGVfaWR4ID0gYXRoMTBrX2NlX2Rlc3RfcmluZ193cml0ZV9pbmRleF9nZXQoYXIsIGN0cmxfYWRkcik7CisKKwkvKiBQcmV2ZW50IENFIHJpbmcgc3R1Y2sgaXNzdWUgdGhhdCB3aWxsIG9jY3VyIHdoZW4gcmluZyBpcyBmdWxsLgorCSAqIE1ha2Ugc3VyZSB0aGF0IHdyaXRlIGluZGV4IGlzIDEgbGVzcyB0aGFuIHJlYWQgaW5kZXguCisJICovCisJaWYgKChjdXJfd3JpdGVfaWR4ICsgbmVudHJpZXMpICA9PSBkZXN0X3JpbmctPnN3X2luZGV4KQorCQluZW50cmllcyAtPSAxOwogCiAJd3JpdGVfaW5kZXggPSBDRV9SSU5HX0lEWF9BREQobmVudHJpZXNfbWFzaywgd3JpdGVfaW5kZXgsIG5lbnRyaWVzKTsKIAlhdGgxMGtfY2VfZGVzdF9yaW5nX3dyaXRlX2luZGV4X3NldChhciwgY3RybF9hZGRyLCB3cml0ZV9pbmRleCk7CkBAIC04NDAsNyArODQ3LDcgQEAKIAlhdGgxMGtfY2Vfc3JjX3JpbmdfaGlnaG1hcmtfc2V0KGFyLCBjdHJsX2FkZHIsIG5lbnRyaWVzKTsKIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk9PVCwKLQkJICAgImJvb3QgaW5pdCBjZSBzcmMgcmluZyBpZCAlZCBlbnRyaWVzICVkIGJhc2VfYWRkciAlcFxuIiwKKwkJICAgImJvb3QgaW5pdCBjZSBzcmMgcmluZyBpZCAlZCBlbnRyaWVzICVkIGJhc2VfYWRkciAlcEtcbiIsCiAJCSAgIGNlX2lkLCBuZW50cmllcywgc3JjX3JpbmctPmJhc2VfYWRkcl9vd25lcl9zcGFjZSk7CiAKIAlyZXR1cm4gMDsKQEAgLTg3NCw3ICs4ODEsNyBAQAogCWF0aDEwa19jZV9kZXN0X3JpbmdfaGlnaG1hcmtfc2V0KGFyLCBjdHJsX2FkZHIsIG5lbnRyaWVzKTsKIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk9PVCwKLQkJICAgImJvb3QgY2UgZGVzdCByaW5nIGlkICVkIGVudHJpZXMgJWQgYmFzZV9hZGRyICVwXG4iLAorCQkgICAiYm9vdCBjZSBkZXN0IHJpbmcgaWQgJWQgZW50cmllcyAlZCBiYXNlX2FkZHIgJXBLXG4iLAogCQkgICBjZV9pZCwgbmVudHJpZXMsIGRlc3RfcmluZy0+YmFzZV9hZGRyX293bmVyX3NwYWNlKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jb3JlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuYwppbmRleCBlODg5ODI5Li4yMWFlOGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuYwpAQCAtNjAsNyArNjAsNiBAQAogCQkub3RwX2V4ZV9wYXJhbSA9IDAsCiAJCS5jaGFubmVsX2NvdW50ZXJzX2ZyZXFfaHogPSA4ODAwMCwKIAkJLm1heF9wcm9iZV9yZXNwX2Rlc2NfdGhyZXMgPSAwLAotCQkuaHdfNGFkZHJfcGFkID0gQVRIMTBLX0hXXzRBRERSX1BBRF9BRlRFUiwKIAkJLmNhbF9kYXRhX2xlbiA9IDIxMTYsCiAJCS5mdyA9IHsKIAkJCS5kaXIgPSBRQ0E5ODhYX0hXXzJfMF9GV19ESVIsCkBAIC02OCw2ICs2Nyw4IEBACiAJCQkuYm9hcmRfc2l6ZSA9IFFDQTk4OFhfQk9BUkRfREFUQV9TWiwKIAkJCS5ib2FyZF9leHRfc2l6ZSA9IFFDQTk4OFhfQk9BUkRfRVhUX0RBVEFfU1osCiAJCX0sCisJCS5od19vcHMgPSAmcWNhOTg4eF9vcHMsCisJCS5kZWNhcF9hbGlnbl9ieXRlcyA9IDQsCiAJfSwKIAl7CiAJCS5pZCA9IFFDQTk4ODdfSFdfMV8wX1ZFUlNJT04sCkBAIC03OSw3ICs4MCw2IEBACiAJCS5vdHBfZXhlX3BhcmFtID0gMCwKIAkJLmNoYW5uZWxfY291bnRlcnNfZnJlcV9oeiA9IDg4MDAwLAogCQkubWF4X3Byb2JlX3Jlc3BfZGVzY190aHJlcyA9IDAsCi0JCS5od180YWRkcl9wYWQgPSBBVEgxMEtfSFdfNEFERFJfUEFEX0FGVEVSLAogCQkuY2FsX2RhdGFfbGVuID0gMjExNiwKIAkJLmZ3ID0gewogCQkJLmRpciA9IFFDQTk4ODdfSFdfMV8wX0ZXX0RJUiwKQEAgLTg3LDYgKzg3LDggQEAKIAkJCS5ib2FyZF9zaXplID0gUUNBOTg4N19CT0FSRF9EQVRBX1NaLAogCQkJLmJvYXJkX2V4dF9zaXplID0gUUNBOTg4N19CT0FSRF9FWFRfREFUQV9TWiwKIAkJfSwKKwkJLmh3X29wcyA9ICZxY2E5ODh4X29wcywKKwkJLmRlY2FwX2FsaWduX2J5dGVzID0gNCwKIAl9LAogCXsKIAkJLmlkID0gUUNBNjE3NF9IV18yXzFfVkVSU0lPTiwKQEAgLTEwNCw2ICsxMDYsOCBAQAogCQkJLmJvYXJkX3NpemUgPSBRQ0E2MTc0X0JPQVJEX0RBVEFfU1osCiAJCQkuYm9hcmRfZXh0X3NpemUgPSBRQ0E2MTc0X0JPQVJEX0VYVF9EQVRBX1NaLAogCQl9LAorCQkuaHdfb3BzID0gJnFjYTk4OHhfb3BzLAorCQkuZGVjYXBfYWxpZ25fYnl0ZXMgPSA0LAogCX0sCiAJewogCQkuaWQgPSBRQ0E2MTc0X0hXXzJfMV9WRVJTSU9OLApAQCAtMTE0LDcgKzExOCw2IEBACiAJCS5vdHBfZXhlX3BhcmFtID0gMCwKIAkJLmNoYW5uZWxfY291bnRlcnNfZnJlcV9oeiA9IDg4MDAwLAogCQkubWF4X3Byb2JlX3Jlc3BfZGVzY190aHJlcyA9IDAsCi0JCS5od180YWRkcl9wYWQgPSBBVEgxMEtfSFdfNEFERFJfUEFEX0FGVEVSLAogCQkuY2FsX2RhdGFfbGVuID0gODEyNCwKIAkJLmZ3ID0gewogCQkJLmRpciA9IFFDQTYxNzRfSFdfMl8xX0ZXX0RJUiwKQEAgLTEyMiw2ICsxMjUsOCBAQAogCQkJLmJvYXJkX3NpemUgPSBRQ0E2MTc0X0JPQVJEX0RBVEFfU1osCiAJCQkuYm9hcmRfZXh0X3NpemUgPSBRQ0E2MTc0X0JPQVJEX0VYVF9EQVRBX1NaLAogCQl9LAorCQkuaHdfb3BzID0gJnFjYTk4OHhfb3BzLAorCQkuZGVjYXBfYWxpZ25fYnl0ZXMgPSA0LAogCX0sCiAJewogCQkuaWQgPSBRQ0E2MTc0X0hXXzNfMF9WRVJTSU9OLApAQCAtMTMyLDcgKzEzNyw2IEBACiAJCS5vdHBfZXhlX3BhcmFtID0gMCwKIAkJLmNoYW5uZWxfY291bnRlcnNfZnJlcV9oeiA9IDg4MDAwLAogCQkubWF4X3Byb2JlX3Jlc3BfZGVzY190aHJlcyA9IDAsCi0JCS5od180YWRkcl9wYWQgPSBBVEgxMEtfSFdfNEFERFJfUEFEX0FGVEVSLAogCQkuY2FsX2RhdGFfbGVuID0gODEyNCwKIAkJLmZ3ID0gewogCQkJLmRpciA9IFFDQTYxNzRfSFdfM18wX0ZXX0RJUiwKQEAgLTE0MCw2ICsxNDQsOCBAQAogCQkJLmJvYXJkX3NpemUgPSBRQ0E2MTc0X0JPQVJEX0RBVEFfU1osCiAJCQkuYm9hcmRfZXh0X3NpemUgPSBRQ0E2MTc0X0JPQVJEX0VYVF9EQVRBX1NaLAogCQl9LAorCQkuaHdfb3BzID0gJnFjYTk4OHhfb3BzLAorCQkuZGVjYXBfYWxpZ25fYnl0ZXMgPSA0LAogCX0sCiAJewogCQkuaWQgPSBRQ0E2MTc0X0hXXzNfMl9WRVJTSU9OLApAQCAtMTUwLDcgKzE1Niw2IEBACiAJCS5vdHBfZXhlX3BhcmFtID0gMCwKIAkJLmNoYW5uZWxfY291bnRlcnNfZnJlcV9oeiA9IDg4MDAwLAogCQkubWF4X3Byb2JlX3Jlc3BfZGVzY190aHJlcyA9IDAsCi0JCS5od180YWRkcl9wYWQgPSBBVEgxMEtfSFdfNEFERFJfUEFEX0FGVEVSLAogCQkuY2FsX2RhdGFfbGVuID0gODEyNCwKIAkJLmZ3ID0gewogCQkJLyogdXNlcyBzYW1lIGJpbmFyaWVzIGFzIGh3My4wICovCkBAIC0xNTksNiArMTY0LDggQEAKIAkJCS5ib2FyZF9zaXplID0gUUNBNjE3NF9CT0FSRF9EQVRBX1NaLAogCQkJLmJvYXJkX2V4dF9zaXplID0gUUNBNjE3NF9CT0FSRF9FWFRfREFUQV9TWiwKIAkJfSwKKwkJLmh3X29wcyA9ICZxY2E5ODh4X29wcywKKwkJLmRlY2FwX2FsaWduX2J5dGVzID0gNCwKIAl9LAogCXsKIAkJLmlkID0gUUNBOTlYMF9IV18yXzBfREVWX1ZFUlNJT04sCkBAIC0xNzEsNyArMTc4LDYgQEAKIAkJLmNja19yYXRlX21hcF9yZXYyID0gdHJ1ZSwKIAkJLmNoYW5uZWxfY291bnRlcnNfZnJlcV9oeiA9IDE1MDAwMCwKIAkJLm1heF9wcm9iZV9yZXNwX2Rlc2NfdGhyZXMgPSAyNCwKLQkJLmh3XzRhZGRyX3BhZCA9IEFUSDEwS19IV180QUREUl9QQURfQkVGT1JFLAogCQkudHhfY2hhaW5fbWFzayA9IDB4ZiwKIAkJLnJ4X2NoYWluX21hc2sgPSAweGYsCiAJCS5tYXhfc3BhdGlhbF9zdHJlYW0gPSA0LApAQCAtMTgyLDYgKzE4OCw5IEBACiAJCQkuYm9hcmRfc2l6ZSA9IFFDQTk5WDBfQk9BUkRfREFUQV9TWiwKIAkJCS5ib2FyZF9leHRfc2l6ZSA9IFFDQTk5WDBfQk9BUkRfRVhUX0RBVEFfU1osCiAJCX0sCisJCS5zd19kZWNyeXB0X21jYXN0X21nbXQgPSB0cnVlLAorCQkuaHdfb3BzID0gJnFjYTk5eDBfb3BzLAorCQkuZGVjYXBfYWxpZ25fYnl0ZXMgPSAxLAogCX0sCiAJewogCQkuaWQgPSBRQ0E5OTg0X0hXXzFfMF9ERVZfVkVSU0lPTiwKQEAgLTE5NCw3ICsyMDMsNiBAQAogCQkuY2NrX3JhdGVfbWFwX3JldjIgPSB0cnVlLAogCQkuY2hhbm5lbF9jb3VudGVyc19mcmVxX2h6ID0gMTUwMDAwLAogCQkubWF4X3Byb2JlX3Jlc3BfZGVzY190aHJlcyA9IDI0LAotCQkuaHdfNGFkZHJfcGFkID0gQVRIMTBLX0hXXzRBRERSX1BBRF9CRUZPUkUsCiAJCS50eF9jaGFpbl9tYXNrID0gMHhmLAogCQkucnhfY2hhaW5fbWFzayA9IDB4ZiwKIAkJLm1heF9zcGF0aWFsX3N0cmVhbSA9IDQsCkBAIC0yMDUsNiArMjEzLDkgQEAKIAkJCS5ib2FyZF9zaXplID0gUUNBOTlYMF9CT0FSRF9EQVRBX1NaLAogCQkJLmJvYXJkX2V4dF9zaXplID0gUUNBOTlYMF9CT0FSRF9FWFRfREFUQV9TWiwKIAkJfSwKKwkJLnN3X2RlY3J5cHRfbWNhc3RfbWdtdCA9IHRydWUsCisJCS5od19vcHMgPSAmcWNhOTl4MF9vcHMsCisJCS5kZWNhcF9hbGlnbl9ieXRlcyA9IDEsCiAJfSwKIAl7CiAJCS5pZCA9IFFDQTk4ODhfSFdfMl8wX0RFVl9WRVJTSU9OLApAQCAtMjE2LDcgKzIyNyw2IEBACiAJCS5jb250aW51b3VzX2ZyYWdfZGVzYyA9IHRydWUsCiAJCS5jaGFubmVsX2NvdW50ZXJzX2ZyZXFfaHogPSAxNTAwMDAsCiAJCS5tYXhfcHJvYmVfcmVzcF9kZXNjX3RocmVzID0gMjQsCi0JCS5od180YWRkcl9wYWQgPSBBVEgxMEtfSFdfNEFERFJfUEFEX0JFRk9SRSwKIAkJLnR4X2NoYWluX21hc2sgPSAzLAogCQkucnhfY2hhaW5fbWFzayA9IDMsCiAJCS5tYXhfc3BhdGlhbF9zdHJlYW0gPSAyLApAQCAtMjI3LDYgKzIzNyw5IEBACiAJCQkuYm9hcmRfc2l6ZSA9IFFDQTk5WDBfQk9BUkRfREFUQV9TWiwKIAkJCS5ib2FyZF9leHRfc2l6ZSA9IFFDQTk5WDBfQk9BUkRfRVhUX0RBVEFfU1osCiAJCX0sCisJCS5zd19kZWNyeXB0X21jYXN0X21nbXQgPSB0cnVlLAorCQkuaHdfb3BzID0gJnFjYTk5eDBfb3BzLAorCQkuZGVjYXBfYWxpZ25fYnl0ZXMgPSAxLAogCX0sCiAJewogCQkuaWQgPSBRQ0E5Mzc3X0hXXzFfMF9ERVZfVkVSU0lPTiwKQEAgLTI0NCw2ICsyNTcsOCBAQAogCQkJLmJvYXJkX3NpemUgPSBRQ0E5Mzc3X0JPQVJEX0RBVEFfU1osCiAJCQkuYm9hcmRfZXh0X3NpemUgPSBRQ0E5Mzc3X0JPQVJEX0VYVF9EQVRBX1NaLAogCQl9LAorCQkuaHdfb3BzID0gJnFjYTk4OHhfb3BzLAorCQkuZGVjYXBfYWxpZ25fYnl0ZXMgPSA0LAogCX0sCiAJewogCQkuaWQgPSBRQ0E5Mzc3X0hXXzFfMV9ERVZfVkVSU0lPTiwKQEAgLTI2MSw2ICsyNzYsOCBAQAogCQkJLmJvYXJkX3NpemUgPSBRQ0E5Mzc3X0JPQVJEX0RBVEFfU1osCiAJCQkuYm9hcmRfZXh0X3NpemUgPSBRQ0E5Mzc3X0JPQVJEX0VYVF9EQVRBX1NaLAogCQl9LAorCQkuaHdfb3BzID0gJnFjYTk4OHhfb3BzLAorCQkuZGVjYXBfYWxpZ25fYnl0ZXMgPSA0LAogCX0sCiAJewogCQkuaWQgPSBRQ0E0MDE5X0hXXzFfMF9ERVZfVkVSU0lPTiwKQEAgLTI3NCw3ICsyOTEsNiBAQAogCQkuY2NrX3JhdGVfbWFwX3JldjIgPSB0cnVlLAogCQkuY2hhbm5lbF9jb3VudGVyc19mcmVxX2h6ID0gMTI1MDAwLAogCQkubWF4X3Byb2JlX3Jlc3BfZGVzY190aHJlcyA9IDI0LAotCQkuaHdfNGFkZHJfcGFkID0gQVRIMTBLX0hXXzRBRERSX1BBRF9CRUZPUkUsCiAJCS50eF9jaGFpbl9tYXNrID0gMHgzLAogCQkucnhfY2hhaW5fbWFzayA9IDB4MywKIAkJLm1heF9zcGF0aWFsX3N0cmVhbSA9IDIsCkBAIC0yODUsNiArMzAxLDkgQEAKIAkJCS5ib2FyZF9zaXplID0gUUNBNDAxOV9CT0FSRF9EQVRBX1NaLAogCQkJLmJvYXJkX2V4dF9zaXplID0gUUNBNDAxOV9CT0FSRF9FWFRfREFUQV9TWiwKIAkJfSwKKwkJLnN3X2RlY3J5cHRfbWNhc3RfbWdtdCA9IHRydWUsCisJCS5od19vcHMgPSAmcWNhOTl4MF9vcHMsCisJCS5kZWNhcF9hbGlnbl9ieXRlcyA9IDEsCiAJfSwKIH07CiAKQEAgLTMwNCw2ICszMjMsNyBAQAogCVtBVEgxMEtfRldfRkVBVFVSRV9NRlBfU1VQUE9SVF0gPSAibWZwIiwKIAlbQVRIMTBLX0ZXX0ZFQVRVUkVfUEVFUl9GTE9XX0NPTlRST0xdID0gInBlZXItZmxvdy1jdHJsIiwKIAlbQVRIMTBLX0ZXX0ZFQVRVUkVfQlRDT0VYX1BBUkFNXSA9ICJidGNvZXgtcGFyYW0iLAorCVtBVEgxMEtfRldfRkVBVFVSRV9TS0lQX05VTExfRlVOQ19XQVJdID0gInNraXAtbnVsbC1mdW5jLXdhciIsCiB9OwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGF0aDEwa19jb3JlX2dldF9md19mZWF0dXJlX3N0cihjaGFyICpidWYsCkBAIC02OTksNyArNzE5LDcgQEAKIAogCWlmICghYXItPnJ1bm5pbmdfZnctPmZ3X2ZpbGUub3RwX2RhdGEgfHwKIAkgICAgIWFyLT5ydW5uaW5nX2Z3LT5md19maWxlLm90cF9sZW4pIHsKLQkJYXRoMTBrX3dhcm4oYXIsICJOb3QgcnVubmluZyBvdHAsIGNhbGlicmF0aW9uIHdpbGwgYmUgaW5jb3JyZWN0IChvdHAtZGF0YSAlcCBvdHBfbGVuICV6ZCkhXG4iLAorCQlhdGgxMGtfd2FybihhciwgIk5vdCBydW5uaW5nIG90cCwgY2FsaWJyYXRpb24gd2lsbCBiZSBpbmNvcnJlY3QgKG90cC1kYXRhICVwSyBvdHBfbGVuICV6ZCkhXG4iLAogCQkJICAgIGFyLT5ydW5uaW5nX2Z3LT5md19maWxlLm90cF9kYXRhLAogCQkJICAgIGFyLT5ydW5uaW5nX2Z3LT5md19maWxlLm90cF9sZW4pOwogCQlyZXR1cm4gMDsKQEAgLTc0NSw3ICs3NjUsNyBAQAogCWRhdGEgPSBhci0+cnVubmluZ19mdy0+ZndfZmlsZS5maXJtd2FyZV9kYXRhOwogCWRhdGFfbGVuID0gYXItPnJ1bm5pbmdfZnctPmZ3X2ZpbGUuZmlybXdhcmVfbGVuOwogCi0JcmV0ID0gYXRoMTBrX3N3YXBfY29kZV9zZWdfY29uZmlndXJlKGFyKTsKKwlyZXQgPSBhdGgxMGtfc3dhcF9jb2RlX3NlZ19jb25maWd1cmUoYXIsICZhci0+cnVubmluZ19mdy0+ZndfZmlsZSk7CiAJaWYgKHJldCkgewogCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIGNvbmZpZ3VyZSBmdyBjb2RlIHN3YXA6ICVkXG4iLAogCQkJICAgcmV0KTsKQEAgLTc1Myw3ICs3NzMsNyBAQAogCX0KIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk9PVCwKLQkJICAgImJvb3QgdXBsb2FkaW5nIGZpcm13YXJlIGltYWdlICVwIGxlbiAlZFxuIiwKKwkJICAgImJvb3QgdXBsb2FkaW5nIGZpcm13YXJlIGltYWdlICVwSyBsZW4gJWRcbiIsCiAJCSAgIGRhdGEsIGRhdGFfbGVuKTsKIAogCXJldCA9IGF0aDEwa19ibWlfZmFzdF9kb3dubG9hZChhciwgYWRkcmVzcywgZGF0YSwgZGF0YV9sZW4pOwpAQCAtNzg3LDcgKzgwNyw3IEBACiAJaWYgKCFJU19FUlIoYXItPnByZV9jYWxfZmlsZSkpCiAJCXJlbGVhc2VfZmlybXdhcmUoYXItPnByZV9jYWxfZmlsZSk7CiAKLQlhdGgxMGtfc3dhcF9jb2RlX3NlZ19yZWxlYXNlKGFyKTsKKwlhdGgxMGtfc3dhcF9jb2RlX3NlZ19yZWxlYXNlKGFyLCAmYXItPm5vcm1hbF9tb2RlX2Z3LmZ3X2ZpbGUpOwogCiAJYXItPm5vcm1hbF9tb2RlX2Z3LmZ3X2ZpbGUub3RwX2RhdGEgPSBOVUxMOwogCWFyLT5ub3JtYWxfbW9kZV9mdy5md19maWxlLm90cF9sZW4gPSAwOwpAQCAtMTQ5NywxNCArMTUxNywxNCBAQAogCiAJaWVlZTgwMjExX3N0b3BfcXVldWVzKGFyLT5odyk7CiAJYXRoMTBrX2RyYWluX3R4KGFyKTsKLQljb21wbGV0ZV9hbGwoJmFyLT5zY2FuLnN0YXJ0ZWQpOwotCWNvbXBsZXRlX2FsbCgmYXItPnNjYW4uY29tcGxldGVkKTsKLQljb21wbGV0ZV9hbGwoJmFyLT5zY2FuLm9uX2NoYW5uZWwpOwotCWNvbXBsZXRlX2FsbCgmYXItPm9mZmNoYW5fdHhfY29tcGxldGVkKTsKLQljb21wbGV0ZV9hbGwoJmFyLT5pbnN0YWxsX2tleV9kb25lKTsKLQljb21wbGV0ZV9hbGwoJmFyLT52ZGV2X3NldHVwX2RvbmUpOwotCWNvbXBsZXRlX2FsbCgmYXItPnRoZXJtYWwud21pX3N5bmMpOwotCWNvbXBsZXRlX2FsbCgmYXItPmJzc19zdXJ2ZXlfZG9uZSk7CisJY29tcGxldGUoJmFyLT5zY2FuLnN0YXJ0ZWQpOworCWNvbXBsZXRlKCZhci0+c2Nhbi5jb21wbGV0ZWQpOworCWNvbXBsZXRlKCZhci0+c2Nhbi5vbl9jaGFubmVsKTsKKwljb21wbGV0ZSgmYXItPm9mZmNoYW5fdHhfY29tcGxldGVkKTsKKwljb21wbGV0ZSgmYXItPmluc3RhbGxfa2V5X2RvbmUpOworCWNvbXBsZXRlKCZhci0+dmRldl9zZXR1cF9kb25lKTsKKwljb21wbGV0ZSgmYXItPnRoZXJtYWwud21pX3N5bmMpOworCWNvbXBsZXRlKCZhci0+YnNzX3N1cnZleV9kb25lKTsKIAl3YWtlX3VwKCZhci0+aHR0LmVtcHR5X3R4X3dxKTsKIAl3YWtlX3VwKCZhci0+d21pLnR4X2NyZWRpdHNfd3EpOwogCXdha2VfdXAoJmFyLT5wZWVyX21hcHBpbmdfd3EpOwpAQCAtMTcwNSw2ICsxNzI1LDU1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYXRoMTBrX2NvcmVfcmVzZXRfcnhfZmlsdGVyKHN0cnVjdCBhdGgxMGsgKmFyKQoreworCWludCByZXQ7CisJaW50IHZkZXZfaWQ7CisJaW50IHZkZXZfdHlwZTsKKwlpbnQgdmRldl9zdWJ0eXBlOworCWNvbnN0IHU4ICp2ZGV2X2FkZHI7CisKKwl2ZGV2X2lkID0gMDsKKwl2ZGV2X3R5cGUgPSBXTUlfVkRFVl9UWVBFX1NUQTsKKwl2ZGV2X3N1YnR5cGUgPSBhdGgxMGtfd21pX2dldF92ZGV2X3N1YnR5cGUoYXIsIFdNSV9WREVWX1NVQlRZUEVfTk9ORSk7CisJdmRldl9hZGRyID0gYXItPm1hY19hZGRyOworCisJcmV0ID0gYXRoMTBrX3dtaV92ZGV2X2NyZWF0ZShhciwgdmRldl9pZCwgdmRldl90eXBlLCB2ZGV2X3N1YnR5cGUsCisJCQkJICAgICB2ZGV2X2FkZHIpOworCWlmIChyZXQpIHsKKwkJYXRoMTBrX2VycihhciwgImZhaWxlZCB0byBjcmVhdGUgZHVtbXkgdmRldjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYXRoMTBrX3dtaV92ZGV2X2RlbGV0ZShhciwgdmRldl9pZCk7CisJaWYgKHJldCkgeworCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIGRlbGV0ZSBkdW1teSB2ZGV2OiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBXTUkgYW5kIEhUVCBtYXkgdXNlIHNlcGFyYXRlIEhJRiBwaXBlcyBhbmQgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlCisJICogc2VyaWFsaXplZCBwcm9wZXJseSBpbXBsaWNpdGx5LgorCSAqCisJICogTW9yZW92ZXIgKG1vc3QpIFdNSSBjb21tYW5kcyBoYXZlIG5vIGV4cGxpY2l0IGFja25vd2xlZGdlcy4gSXQgaXMKKwkgKiBwb3NzaWJsZSB0byBpbmZlciBpdCBpbXBsaWNpdGx5IGJ5IHBva2luZyBmaXJtd2FyZSB3aXRoIGVjaG8KKwkgKiBjb21tYW5kIC0gZ2V0dGluZyBhIHJlcGx5IG1lYW5zIGFsbCBwcmVjZWRpbmcgY29tbWVudHMgaGF2ZSBiZWVuCisJICogKG1vc3RseSkgcHJvY2Vzc2VkLgorCSAqCisJICogSW4gY2FzZSBvZiB2ZGV2IGNyZWF0ZS9kZWxldGUgdGhpcyBpcyBzdWZmaWNpZW50LgorCSAqCisJICogV2l0aG91dCB0aGlzIGl0J3MgcG9zc2libGUgdG8gZW5kIHVwIHdpdGggYSByYWNlIHdoZW4gSFRUIFJ4IHJpbmcgaXMKKwkgKiBzdGFydGVkIGJlZm9yZSB2ZGV2IGNyZWF0ZS9kZWxldGUgaGFjayBpcyBjb21wbGV0ZSBhbGxvd2luZyBhIHNob3J0CisJICogd2luZG93IG9mIG9wcG9ydHVuaXR5IHRvIHJlY2VpdmUgKGFuZCBUeCBBQ0spIGEgYnVuY2ggb2YgZnJhbWVzLgorCSAqLworCXJldCA9IGF0aDEwa193bWlfYmFycmllcihhcik7CisJaWYgKHJldCkgeworCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIHBpbmcgZmlybXdhcmU6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCiBpbnQgYXRoMTBrX2NvcmVfc3RhcnQoc3RydWN0IGF0aDEwayAqYXIsIGVudW0gYXRoMTBrX2Zpcm13YXJlX21vZGUgbW9kZSwKIAkJICAgICAgY29uc3Qgc3RydWN0IGF0aDEwa19md19jb21wb25lbnRzICpmdykKIHsKQEAgLTE4NzIsNiArMTk0MSwyNSBAQAogCQlnb3RvIGVycl9oaWZfc3RvcDsKIAl9CiAKKwkvKiBTb21lIGZpcm13YXJlIHJldmlzaW9ucyBkbyBub3QgcHJvcGVybHkgc2V0IHVwIGhhcmR3YXJlIHJ4IGZpbHRlcgorCSAqIHJlZ2lzdGVycy4KKwkgKgorCSAqIEEga25vd24gZXhhbXBsZSBmcm9tIFFDQTk4ODAgYW5kIDEwLjIuNCBpcyB0aGF0IE1BQ19QQ1VfQUREUjFfTUFTSworCSAqIGlzIGZpbGxlZCB3aXRoIDBzIGluc3RlYWQgb2YgMXMgYWxsb3dpbmcgSFcgdG8gcmVzcG9uZCB3aXRoIEFDS3MgdG8KKwkgKiBhbnkgZnJhbWVzIHRoYXQgbWF0Y2hlcyBNQUNfUENVX1JYX0ZJTFRFUiB3aGljaCBpcyBhbHNvCisJICogbWlzY29uZmlndXJlZCB0byBhY2NlcHQgYW55dGhpbmcuCisJICoKKwkgKiBUaGUgQUREUjEgaXMgcHJvZ3JhbW1lZCB1c2luZyBpbnRlcm5hbCBmaXJtd2FyZSBzdHJ1Y3R1cmUgZmllbGQgYW5kCisJICogY2FuJ3QgYmUgKGVhc2lseS9zYW5lbHkpIHJlYWNoZWQgZnJvbSB0aGUgZHJpdmVyIGV4cGxpY2l0bHkuIEl0IGlzCisJICogcG9zc2libGUgdG8gaW1wbGljaXRseSBtYWtlIGl0IGNvcnJlY3QgYnkgY3JlYXRpbmcgYSBkdW1teSB2ZGV2IGFuZAorCSAqIHRoZW4gZGVsZXRpbmcgaXQuCisJICovCisJc3RhdHVzID0gYXRoMTBrX2NvcmVfcmVzZXRfcnhfZmlsdGVyKGFyKTsKKwlpZiAoc3RhdHVzKSB7CisJCWF0aDEwa19lcnIoYXIsICJmYWlsZWQgdG8gcmVzZXQgcnggZmlsdGVyOiAlZFxuIiwgc3RhdHVzKTsKKwkJZ290byBlcnJfaGlmX3N0b3A7CisJfQorCiAJLyogSWYgZmlybXdhcmUgaW5kaWNhdGVzIEZ1bGwgUnggUmVvcmRlciBzdXBwb3J0IGl0IG11c3QgYmUgdXNlZCBpbiBhCiAJICogc2xpZ2h0bHkgZGlmZmVyZW50IG1hbm5lci4gTGV0IEhUVCBjb2RlIGtub3cuCiAJICovCkBAIC0xODg0LDcgKzE5NzIsMTAgQEAKIAkJZ290byBlcnJfaGlmX3N0b3A7CiAJfQogCi0JYXItPmZyZWVfdmRldl9tYXAgPSAoMUxMIDw8IGFyLT5tYXhfbnVtX3ZkZXZzKSAtIDE7CisJaWYgKGFyLT5tYXhfbnVtX3ZkZXZzID49IDY0KQorCQlhci0+ZnJlZV92ZGV2X21hcCA9IDB4RkZGRkZGRkZGRkZGRkZGRkxMOworCWVsc2UKKwkJYXItPmZyZWVfdmRldl9tYXAgPSAoMUxMIDw8IGFyLT5tYXhfbnVtX3ZkZXZzKSAtIDE7CiAKIAlJTklUX0xJU1RfSEVBRCgmYXItPmFydmlmcyk7CiAKQEAgLTIwMzEsNyArMjEyMiw3IEBACiAJCWdvdG8gZXJyX2ZyZWVfZmlybXdhcmVfZmlsZXM7CiAJfQogCi0JcmV0ID0gYXRoMTBrX3N3YXBfY29kZV9zZWdfaW5pdChhcik7CisJcmV0ID0gYXRoMTBrX3N3YXBfY29kZV9zZWdfaW5pdChhciwgJmFyLT5ub3JtYWxfbW9kZV9mdy5md19maWxlKTsKIAlpZiAocmV0KSB7CiAJCWF0aDEwa19lcnIoYXIsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb2RlIHN3YXAgc2VnbWVudDogJWRcbiIsCiAJCQkgICByZXQpOwpAQCAtMjA3Miw2ICsyMTYzLDkgQEAKIAlzdHJ1Y3QgYXRoMTBrICphciA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRoMTBrLCByZWdpc3Rlcl93b3JrKTsKIAlpbnQgc3RhdHVzOwogCisJLyogcGVlciBzdGF0cyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0ICovCisJc2V0X2JpdChBVEgxMEtfRkxBR19QRUVSX1NUQVRTLCAmYXItPmRldl9mbGFncyk7CisKIAlzdGF0dXMgPSBhdGgxMGtfY29yZV9wcm9iZV9mdyhhcik7CiAJaWYgKHN0YXR1cykgewogCQlhdGgxMGtfZXJyKGFyLCAiY291bGQgbm90IHByb2JlIGZ3ICglZClcbiIsIHN0YXR1cyk7CkBAIC0yMjQ5LDYgKzIzNDMsOCBAQAogCUlOSVRfV09SSygmYXItPnJlZ2lzdGVyX3dvcmssIGF0aDEwa19jb3JlX3JlZ2lzdGVyX3dvcmspOwogCUlOSVRfV09SSygmYXItPnJlc3RhcnRfd29yaywgYXRoMTBrX2NvcmVfcmVzdGFydCk7CiAKKwlpbml0X2R1bW15X25ldGRldigmYXItPm5hcGlfZGV2KTsKKwogCXJldCA9IGF0aDEwa19kZWJ1Z19jcmVhdGUoYXIpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2ZyZWVfYXV4X3dxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jb3JlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuaAppbmRleCAzMGFlNWJmLi5kZGE0OWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuaApAQCAtNjUsNiArNjUsMTAgQEAKICNkZWZpbmUgQVRIMTBLX0tFRVBBTElWRV9NQVhfSURMRSAzODk1CiAjZGVmaW5lIEFUSDEwS19LRUVQQUxJVkVfTUFYX1VOUkVTUE9OU0lWRSAzOTAwCiAKKy8qIE5BUEkgcG9sbCBidWRnZXQgKi8KKyNkZWZpbmUgQVRIMTBLX05BUElfQlVER0VUICAgICAgNjQKKyNkZWZpbmUgQVRIMTBLX05BUElfUVVPVEFfTElNSVQgNjAKKwogc3RydWN0IGF0aDEwazsKIAogZW51bSBhdGgxMGtfYnVzIHsKQEAgLTE0Miw2ICsxNDYsNyBAQAogCWVudW0gYXRoMTBrX2h0Y19lcF9pZCBlaWQ7CiAJc3RydWN0IGNvbXBsZXRpb24gc2VydmljZV9yZWFkeTsKIAlzdHJ1Y3QgY29tcGxldGlvbiB1bmlmaWVkX3JlYWR5OworCXN0cnVjdCBjb21wbGV0aW9uIGJhcnJpZXI7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgdHhfY3JlZGl0c193cTsKIAlERUNMQVJFX0JJVE1BUChzdmNfbWFwLCBXTUlfU0VSVklDRV9NQVgpOwogCXN0cnVjdCB3bWlfY21kX21hcCAqY21kOwpAQCAtMTk2LDEwICsyMDEsMTAgQEAKIAogCS8qIFBERVYgc3RhdHMgKi8KIAlzMzIgY2hfbm9pc2VfZmxvb3I7Ci0JdTMyIHR4X2ZyYW1lX2NvdW50OwotCXUzMiByeF9mcmFtZV9jb3VudDsKLQl1MzIgcnhfY2xlYXJfY291bnQ7Ci0JdTMyIGN5Y2xlX2NvdW50OworCXUzMiB0eF9mcmFtZV9jb3VudDsgLyogQ3ljbGVzIHNwZW50IHRyYW5zbWl0dGluZyBmcmFtZXMgKi8KKwl1MzIgcnhfZnJhbWVfY291bnQ7IC8qIEN5Y2xlcyBzcGVudCByZWNlaXZpbmcgZnJhbWVzICovCisJdTMyIHJ4X2NsZWFyX2NvdW50OyAvKiBUb3RhbCBjaGFubmVsIGJ1c3kgdGltZSwgZXZpZGVudGx5ICovCisJdTMyIGN5Y2xlX2NvdW50OyAvKiBUb3RhbCBvbi1jaGFubmVsIHRpbWUgKi8KIAl1MzIgcGh5X2Vycl9jb3VudDsKIAl1MzIgY2hhbl90eF9wb3dlcjsKIAl1MzIgYWNrX3J4X2JhZDsKQEAgLTQ0MCw3ICs0NDUsNyBAQAogCXN0cnVjdCBjb21wbGV0aW9uIHRwY19jb21wbGV0ZTsKIAogCS8qIHByb3RlY3RlZCBieSBjb25mX211dGV4ICovCi0JdTMyIGZ3X2RiZ2xvZ19tYXNrOworCXU2NCBmd19kYmdsb2dfbWFzazsKIAl1MzIgZndfZGJnbG9nX2xldmVsOwogCXUzMiBwa3Rsb2dfZmlsdGVyOwogCXUzMiByZWdfYWRkcjsKQEAgLTU1MSw2ICs1NTYsMTMgQEAKIAkgKi8KIAlBVEgxMEtfRldfRkVBVFVSRV9CVENPRVhfUEFSQU0gPSAxNCwKIAorCS8qIE9sZGVyIGZpcm13YXJlIHdpdGggSFRUIGRlbGl2ZXJzIGluY29ycmVjdCB0eCBzdGF0dXMgZm9yIG51bGwgZnVuYworCSAqIGZyYW1lcyB0byBkcml2ZXIsIGJ1dCB0aGlzIGZpeGVkIGluIDEwLjIgYW5kIDEwLjQgZmlybXdhcmUgdmVyc2lvbnMuCisJICogQWxzbyB0aGlzIHdvcmthcm91bmQgcmVzdWx0cyBpbiByZXBvcnRpbmcgb2YgaW5jb3JyZWN0IG51bGwgZnVuYworCSAqIHN0YXR1cyBmb3IgMTAuNC4gVGhpcyBmbGFnIGlzIHVzZWQgdG8gc2tpcCB0aGUgd29ya2Fyb3VuZC4KKwkgKi8KKwlBVEgxMEtfRldfRkVBVFVSRV9TS0lQX05VTExfRlVOQ19XQVIgPSAxNSwKKwogCS8qIGtlZXAgbGFzdCAqLwogCUFUSDEwS19GV19GRUFUVVJFX0NPVU5ULAogfTsKQEAgLTY2Myw2ICs2NzUsMTUgQEAKIAogCWNvbnN0IHZvaWQgKmNvZGVzd2FwX2RhdGE7CiAJc2l6ZV90IGNvZGVzd2FwX2xlbjsKKworCS8qIFRoZSBvcmlnaW5hbCBpZGVhIG9mIHN0cnVjdCBhdGgxMGtfZndfZmlsZSB3YXMgdGhhdCBpdCBvbmx5CisJICogY29udGFpbnMgc3RydWN0IGZpcm13YXJlIGFuZCBwb2ludGVycyB0byB2YXJpb3VzIHBhcnRzIChhY3R1YWwKKwkgKiBmaXJtd2FyZSBiaW5hcnksIG90cCwgbWV0YWRhdGEgZXRjKSBvZiB0aGUgZmlsZS4gVGhpcyBzZWdfaW5mbworCSAqIGlzIGFjdHVhbGx5IGNyZWF0ZWQgc2VwYXJhdGUgYnV0IGFzIHRoaXMgaXMgdXNlZCBzaW1pbGFybHkgYXMKKwkgKiB0aGUgb3RoZXIgZmlybXdhcmUgY29tcG9uZW50cyBpdCdzIG1vcmUgY29udmVuaWVudCB0byBoYXZlIGl0CisJICogaGVyZS4KKwkgKi8KKwlzdHJ1Y3QgYXRoMTBrX3N3YXBfY29kZV9zZWdfaW5mbyAqZmlybXdhcmVfc3dhcF9jb2RlX3NlZ19pbmZvOwogfTsKIAogc3RydWN0IGF0aDEwa19md19jb21wb25lbnRzIHsKQEAgLTcxNSw1MyArNzM2LDcgQEAKIAlzdHJ1Y3QgYXRoMTBrX2h0YyBodGM7CiAJc3RydWN0IGF0aDEwa19odHQgaHR0OwogCi0Jc3RydWN0IGF0aDEwa19od19wYXJhbXMgewotCQl1MzIgaWQ7Ci0JCXUxNiBkZXZfaWQ7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0JCXUzMiBwYXRjaF9sb2FkX2FkZHI7Ci0JCWludCB1YXJ0X3BpbjsKLQkJdTMyIG90cF9leGVfcGFyYW07Ci0KLQkJLyogVHlwZSBvZiBodyBjeWNsZSBjb3VudGVyIHdyYXBhcm91bmQgbG9naWMsIGZvciBtb3JlIGluZm8KLQkJICogcmVmZXIgZW51bSBhdGgxMGtfaHdfY2Nfd3JhcGFyb3VuZF90eXBlLgotCQkgKi8KLQkJZW51bSBhdGgxMGtfaHdfY2Nfd3JhcGFyb3VuZF90eXBlIGNjX3dyYXBhcm91bmRfdHlwZTsKLQotCQkvKiBTb21lIG9mIGNoaXAgZXhwZWN0cyBmcmFnbWVudCBkZXNjcmlwdG9yIHRvIGJlIGNvbnRpbnVvdXMKLQkJICogbWVtb3J5IGZvciBhbnkgVFggb3BlcmF0aW9uLiBTZXQgY29udGludW91c19mcmFnX2Rlc2MgZmxhZwotCQkgKiBmb3IgdGhlIGhhcmR3YXJlIHdoaWNoIGhhdmUgc3VjaCByZXF1aXJlbWVudC4KLQkJICovCi0JCWJvb2wgY29udGludW91c19mcmFnX2Rlc2M7Ci0KLQkJLyogQ0NLIGhhcmR3YXJlIHJhdGUgdGFibGUgbWFwcGluZyBmb3IgdGhlIG5ld2VyIGNoaXBzZXRzCi0JCSAqIGxpa2UgUUNBOTlYMCwgUUNBNDAxOSBnb3QgcmV2aXNlZC4gVGhlIENDSyBoL3cgcmF0ZSB2YWx1ZXMKLQkJICogYXJlIGluIGEgcHJvcGVyIG9yZGVyIHdpdGggcmVzcGVjdCB0byB0aGUgcmF0ZS9wcmVhbWJsZQotCQkgKi8KLQkJYm9vbCBjY2tfcmF0ZV9tYXBfcmV2MjsKLQotCQl1MzIgY2hhbm5lbF9jb3VudGVyc19mcmVxX2h6OwotCi0JCS8qIE1nbXQgdHggZGVzY3JpcHRvcnMgdGhyZXNob2xkIGZvciBsaW1pdGluZyBwcm9iZSByZXNwb25zZQotCQkgKiBmcmFtZXMuCi0JCSAqLwotCQl1MzIgbWF4X3Byb2JlX3Jlc3BfZGVzY190aHJlczsKLQotCQkvKiBUaGUgcGFkZGluZyBieXRlcydzIGxvY2F0aW9uIGlzIGRpZmZlcmVudCBvbiB2YXJpb3VzIGNoaXBzICovCi0JCWVudW0gYXRoMTBrX2h3XzRhZGRyX3BhZCBod180YWRkcl9wYWQ7Ci0KLQkJdTMyIHR4X2NoYWluX21hc2s7Ci0JCXUzMiByeF9jaGFpbl9tYXNrOwotCQl1MzIgbWF4X3NwYXRpYWxfc3RyZWFtOwotCQl1MzIgY2FsX2RhdGFfbGVuOwotCi0JCXN0cnVjdCBhdGgxMGtfaHdfcGFyYW1zX2Z3IHsKLQkJCWNvbnN0IGNoYXIgKmRpcjsKLQkJCWNvbnN0IGNoYXIgKmJvYXJkOwotCQkJc2l6ZV90IGJvYXJkX3NpemU7Ci0JCQlzaXplX3QgYm9hcmRfZXh0X3NpemU7Ci0JCX0gZnc7Ci0JfSBod19wYXJhbXM7CisJc3RydWN0IGF0aDEwa19od19wYXJhbXMgaHdfcGFyYW1zOwogCiAJLyogY29udGFpbnMgdGhlIGZpcm13YXJlIGltYWdlcyB1c2VkIHdpdGggQVRIMTBLX0ZJUk1XQVJFX01PREVfTk9STUFMICovCiAJc3RydWN0IGF0aDEwa19md19jb21wb25lbnRzIG5vcm1hbF9tb2RlX2Z3OwpAQCAtNzc1LDEwICs3NTAsNiBAQAogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqY2FsX2ZpbGU7CiAKIAlzdHJ1Y3QgewotCQlzdHJ1Y3QgYXRoMTBrX3N3YXBfY29kZV9zZWdfaW5mbyAqZmlybXdhcmVfc3dhcF9jb2RlX3NlZ19pbmZvOwotCX0gc3dhcDsKLQotCXN0cnVjdCB7CiAJCXUzMiB2ZW5kb3I7CiAJCXUzMiBkZXZpY2U7CiAJCXUzMiBzdWJzeXN0ZW1fdmVuZG9yOwpAQCAtOTM2LDYgKzkwNywxMCBAQAogCXN0cnVjdCBhdGgxMGtfdGhlcm1hbCB0aGVybWFsOwogCXN0cnVjdCBhdGgxMGtfd293IHdvdzsKIAorCS8qIE5BUEkgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSBuYXBpX2RldjsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaTsKKwogCS8qIG11c3QgYmUgbGFzdCAqLwogCXU4IGRydl9wcml2WzBdIF9fYWxpZ25lZChzaXplb2Yodm9pZCAqKSk7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9kZWJ1Zy5jCmluZGV4IDhmMGZkNDEuLjgzMmRhNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvZGVidWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2RlYnVnLmMKQEAgLTEyMjgsOSArMTIyOCw5IEBACiB7CiAJc3RydWN0IGF0aDEwayAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgaW50IGxlbjsKLQljaGFyIGJ1Zls2NF07CisJY2hhciBidWZbOTZdOwogCi0JbGVuID0gc2NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIweCUwOHggJXVcbiIsCisJbGVuID0gc2NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIweCUxNmxseCAldVxuIiwKIAkJCWFyLT5kZWJ1Zy5md19kYmdsb2dfbWFzaywgYXItPmRlYnVnLmZ3X2RiZ2xvZ19sZXZlbCk7CiAKIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7CkBAIC0xMjQyLDE1ICsxMjQyLDE2IEBACiB7CiAJc3RydWN0IGF0aDEwayAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaW50IHJldDsKLQljaGFyIGJ1Zls2NF07Ci0JdW5zaWduZWQgaW50IGxvZ19sZXZlbCwgbWFzazsKKwljaGFyIGJ1Zls5Nl07CisJdW5zaWduZWQgaW50IGxvZ19sZXZlbDsKKwl1NjQgbWFzazsKIAogCXNpbXBsZV93cml0ZV90b19idWZmZXIoYnVmLCBzaXplb2YoYnVmKSAtIDEsIHBwb3MsIHVzZXJfYnVmLCBjb3VudCk7CiAKIAkvKiBtYWtlIHN1cmUgdGhhdCBidWYgaXMgbnVsbCB0ZXJtaW5hdGVkICovCiAJYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwogCi0JcmV0ID0gc3NjYW5mKGJ1ZiwgIiV4ICV1IiwgJm1hc2ssICZsb2dfbGV2ZWwpOworCXJldCA9IHNzY2FuZihidWYsICIlbGx4ICV1IiwgJm1hc2ssICZsb2dfbGV2ZWwpOwogCiAJaWYgKCFyZXQpCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odGMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHRjLmMKaW5kZXggNWIzYzZiYy4uMTc1YWFlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odGMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0Yy5jCkBAIC00NCw3ICs0NCw3IEBACiAJc2tiX2NiID0gQVRIMTBLX1NLQl9DQihza2IpOwogCW1lbXNldChza2JfY2IsIDAsIHNpemVvZigqc2tiX2NiKSk7CiAKLQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0hUQywgIiVzOiBza2IgJXBcbiIsIF9fZnVuY19fLCBza2IpOworCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfSFRDLCAiJXM6IHNrYiAlcEtcbiIsIF9fZnVuY19fLCBza2IpOwogCXJldHVybiBza2I7CiB9CiAKQEAgLTYyLDcgKzYyLDcgQEAKIHsKIAlzdHJ1Y3QgYXRoMTBrICphciA9IGVwLT5odGMtPmFyOwogCi0JYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19IVEMsICIlczogZXAgJWQgc2tiICVwXG4iLCBfX2Z1bmNfXywKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0hUQywgIiVzOiBlcCAlZCBza2IgJXBLXG4iLCBfX2Z1bmNfXywKIAkJICAgZXAtPmVpZCwgc2tiKTsKIAogCWF0aDEwa19odGNfcmVzdG9yZV90eF9za2IoZXAtPmh0Yywgc2tiKTsKQEAgLTQwNCw3ICs0MDQsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0hUQywgImh0YyByeCBjb21wbGV0aW9uIGVwICVkIHNrYiAlcFxuIiwKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0hUQywgImh0YyByeCBjb21wbGV0aW9uIGVwICVkIHNrYiAlcEtcbiIsCiAJCSAgIGVpZCwgc2tiKTsKIAllcC0+ZXBfb3BzLmVwX3J4X2NvbXBsZXRlKGFyLCBza2IpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHQuaAppbmRleCA0MzBhODNlLi4wZDJlZDA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHR0LmgKQEAgLTU5NSw3ICs1OTUsNyBAQAogCS8qIG9ubHkgYWNjZXB0IEVBUE9MIGZyYW1lcyAqLwogCUhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfVU5BVVRIX1BFRVIsCiAJSFRUX1JYX0lORF9NUERVX1NUQVRVU19PVVRfT0ZfU1lOQywKLQkvKiBOb24tZGF0YSBpbiBwcm9taXNjb3VzIG1vZGUgKi8KKwkvKiBOb24tZGF0YSBpbiBwcm9taXNjdW91cyBtb2RlICovCiAJSFRUX1JYX0lORF9NUERVX1NUQVRVU19NR01UX0NUUkwsCiAJSFRUX1JYX0lORF9NUERVX1NUQVRVU19US0lQX01JQ19FUlIsCiAJSFRUX1JYX0lORF9NUERVX1NUQVRVU19ERUNSWVBUX0VSUiwKQEAgLTkwMCw3ICs5MDAsNyBAQAogICogICAgIFB1cnBvc2U6IGluZGljYXRlIGhvdyBtYW55IDMyLWJpdCBpbnRlZ2VycyBmb2xsb3cgdGhlIG1lc3NhZ2UgaGVhZGVyCiAgKiAgIC0gTlVNX0NIQVJTCiAgKiAgICAgQml0cyAzMToxNgotICogICAgIFB1cnBvc2U6IGluZGljYXRlIGhvdyBtYW55IDgtYml0IGNoYXJhdGVycyBmb2xsb3cgdGhlIHNlcmllcyBvZiBpbnRlZ2VycworICogICAgIFB1cnBvc2U6IGluZGljYXRlIGhvdyBtYW55IDgtYml0IGNoYXJhY3RlcnMgZm9sbG93IHRoZSBzZXJpZXMgb2YgaW50ZWdlcnMKICAqLwogc3RydWN0IGh0dF9yeF90ZXN0IHsKIAl1OCBudW1faW50czsKQEAgLTEwNDIsMTAgKzEwNDIsMTAgQEAKIAkvKiBpbGxlZ2FsIHJhdGUgcGh5IGVycm9ycyAgKi8KIAlfX2xlMzIgaWxsZ2xfcmF0ZV9waHlfZXJyOwogCi0JLyogd2FsIHBkZXYgY29udGlub3VzIHhyZXRyeSAqLworCS8qIHdhbCBwZGV2IGNvbnRpbnVvdXMgeHJldHJ5ICovCiAJX19sZTMyIHBkZXZfY29udF94cmV0cnk7CiAKLQkvKiB3YWwgcGRldiBjb250aW5vdXMgeHJldHJ5ICovCisJLyogd2FsIHBkZXYgY29udGludW91cyB4cmV0cnkgKi8KIAlfX2xlMzIgcGRldl90eF90aW1lb3V0OwogCiAJLyogd2FsIHBkZXYgcmVzZXRzICAqLwpAQCAtMTY2NSw3ICsxNjY1LDYgQEAKIAogCS8qIFRoaXMgaXMgdXNlZCB0byBncm91cCB0eC9yeCBjb21wbGV0aW9ucyBzZXBhcmF0ZWx5IGFuZCBwcm9jZXNzIHRoZW0KIAkgKiBpbiBiYXRjaGVzIHRvIHJlZHVjZSBjYWNoZSBzdGFsbHMgKi8KLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdHhyeF9jb21wbF90YXNrOwogCXN0cnVjdCBza19idWZmX2hlYWQgcnhfY29tcGxfcTsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJ4X2luX29yZF9jb21wbF9xOwogCXN0cnVjdCBza19idWZmX2hlYWQgdHhfZmV0Y2hfaW5kX3E7CkBAIC0xNzk4LDUgKzE3OTcsNiBAQAogCQkgIHN0cnVjdCBza19idWZmICptc2R1KTsKIHZvaWQgYXRoMTBrX2h0dF9yeF9wa3Rsb2dfY29tcGxldGlvbl9oYW5kbGVyKHN0cnVjdCBhdGgxMGsgKmFyLAogCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpOworaW50IGF0aDEwa19odHRfdHhyeF9jb21wbF90YXNrKHN0cnVjdCBhdGgxMGsgKmFyLCBpbnQgYnVkZ2V0KTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dF9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHRfcnguYwppbmRleCA3OGRiNWQ2Li4wYjRjMTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dF9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHR0X3J4LmMKQEAgLTM0LDcgKzM0LDYgQEAKICNkZWZpbmUgSFRUX1JYX1JJTkdfUkVGSUxMX1JFU0NIRURfTVMgNQogCiBzdGF0aWMgaW50IGF0aDEwa19odHRfcnhfZ2V0X2NzdW1fc3RhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1zdGF0aWMgdm9pZCBhdGgxMGtfaHR0X3R4cnhfY29tcGxfdGFzayh1bnNpZ25lZCBsb25nIHB0cik7CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCiBhdGgxMGtfaHR0X3J4X2ZpbmRfc2tiX3BhZGRyKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgcGFkZHIpCkBAIC0yMjYsNyArMjI1LDYgQEAKIHZvaWQgYXRoMTBrX2h0dF9yeF9mcmVlKHN0cnVjdCBhdGgxMGtfaHR0ICpodHQpCiB7CiAJZGVsX3RpbWVyX3N5bmMoJmh0dC0+cnhfcmluZy5yZWZpbGxfcmV0cnlfdGltZXIpOwotCXRhc2tsZXRfa2lsbCgmaHR0LT50eHJ4X2NvbXBsX3Rhc2spOwogCiAJc2tiX3F1ZXVlX3B1cmdlKCZodHQtPnJ4X2NvbXBsX3EpOwogCXNrYl9xdWV1ZV9wdXJnZSgmaHR0LT5yeF9pbl9vcmRfY29tcGxfcSk7CkBAIC01MjAsOSArNTE4LDYgQEAKIAlza2JfcXVldWVfaGVhZF9pbml0KCZodHQtPnR4X2ZldGNoX2luZF9xKTsKIAlhdG9taWNfc2V0KCZodHQtPm51bV9tcGR1c19yZWFkeSwgMCk7CiAKLQl0YXNrbGV0X2luaXQoJmh0dC0+dHhyeF9jb21wbF90YXNrLCBhdGgxMGtfaHR0X3R4cnhfY29tcGxfdGFzaywKLQkJICAgICAodW5zaWduZWQgbG9uZylodHQpOwotCiAJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19CT09ULCAiaHR0IHJ4IHJpbmcgc2l6ZSAlZCBmaWxsX2xldmVsICVkXG4iLAogCQkgICBodHQtPnJ4X3Jpbmcuc2l6ZSwgaHR0LT5yeF9yaW5nLmZpbGxfbGV2ZWwpOwogCXJldHVybiAwOwpAQCAtOTMxLDcgKzkyNiw3IEBACiAJKnN0YXR1cyA9ICpyeF9zdGF0dXM7CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0RBVEEsCi0JCSAgICJyeCBza2IgJXAgbGVuICV1IHBlZXIgJXBNICVzICVzIHNuICV1ICVzJXMlcyVzJXMgJXNyYXRlX2lkeCAldSB2aHRfbnNzICV1IGZyZXEgJXUgYmFuZCAldSBmbGFnIDB4JWxseCBmY3MtZXJyICVpIG1pYy1lcnIgJWkgYW1zZHUtbW9yZSAlaVxuIiwKKwkJICAgInJ4IHNrYiAlcEsgbGVuICV1IHBlZXIgJXBNICVzICVzIHNuICV1ICVzJXMlcyVzJXMgJXNyYXRlX2lkeCAldSB2aHRfbnNzICV1IGZyZXEgJXUgYmFuZCAldSBmbGFnIDB4JWxseCBmY3MtZXJyICVpIG1pYy1lcnIgJWkgYW1zZHUtbW9yZSAlaVxuIiwKIAkJICAgc2tiLAogCQkgICBza2ItPmxlbiwKIAkJICAgaWVlZTgwMjExX2dldF9TQShoZHIpLApAQCAtOTU4LDcgKzk1Myw3IEBACiAJdHJhY2VfYXRoMTBrX3J4X2hkcihhciwgc2tiLT5kYXRhLCBza2ItPmxlbik7CiAJdHJhY2VfYXRoMTBrX3J4X3BheWxvYWQoYXIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCi0JaWVlZTgwMjExX3J4KGFyLT5odywgc2tiKTsKKwlpZWVlODAyMTFfcnhfbmFwaShhci0+aHcsIE5VTEwsIHNrYiwgJmFyLT5uYXBpKTsKIH0KIAogc3RhdGljIGludCBhdGgxMGtfaHR0X3J4X253aWZpX2hkcmxlbihzdHJ1Y3QgYXRoMTBrICphciwKQEAgLTEwNTYsOSArMTA1MSwxMSBAQAogCQkJCQkgIGNvbnN0IHU4IGZpcnN0X2hkcls2NF0pCiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwlzdHJ1Y3QgaHR0X3J4X2Rlc2MgKnJ4ZDsKIAlzaXplX3QgaGRyX2xlbjsKIAl1OCBkYVtFVEhfQUxFTl07CiAJdTggc2FbRVRIX0FMRU5dOworCWludCBsM19wYWRfYnl0ZXM7CiAKIAkvKiBEZWxpdmVyZWQgZGVjYXBwZWQgZnJhbWU6CiAJICogW253aWZpIDgwMi4xMSBoZWFkZXJdIDwtLSByZXBsYWNlZCB3aXRoIDgwMi4xMSBoZHIKQEAgLTEwNzIsMTkgKzEwNjksMTIgQEAKIAkgKi8KIAogCS8qIHB1bGwgZGVjYXBwZWQgaGVhZGVyIGFuZCBjb3B5IFNBICYgREEgKi8KLQlpZiAoKGFyLT5od19wYXJhbXMuaHdfNGFkZHJfcGFkID09IEFUSDEwS19IV180QUREUl9QQURfQkVGT1JFKSAmJgotCSAgICBpZWVlODAyMTFfaGFzX2E0KCgoc3RydWN0IGllZWU4MDIxMV9oZHIgKilmaXJzdF9oZHIpLT5mcmFtZV9jb250cm9sKSkgewotCQkvKiBUaGUgUUNBOTlYMCA0IGFkZHJlc3MgbW9kZSBwYWQgMiBieXRlcyBhdCB0aGUKLQkJICogYmVnaW5uaW5nIG9mIE1TRFUKLQkJICovCi0JCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKShtc2R1LT5kYXRhICsgMik7Ci0JCS8qIFRoZSBza2IgbGVuZ3RoIG5lZWQgYmUgZXh0ZW5kZWQgMiBhcyB0aGUgMiBieXRlcyBhdCB0aGUgdGFpbAotCQkgKiBiZSBleGNsdWRlZCBkdWUgdG8gdGhlIHBhZGRpbmcKLQkJICovCi0JCXNrYl9wdXQobXNkdSwgMik7Ci0JfSBlbHNlIHsKLQkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopKG1zZHUtPmRhdGEpOwotCX0KKwlyeGQgPSAodm9pZCAqKW1zZHUtPmRhdGEgLSBzaXplb2YoKnJ4ZCk7CisKKwlsM19wYWRfYnl0ZXMgPSBhdGgxMGtfcnhfZGVzY19nZXRfbDNfcGFkX2J5dGVzKCZhci0+aHdfcGFyYW1zLCByeGQpOworCXNrYl9wdXQobXNkdSwgbDNfcGFkX2J5dGVzKTsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKShtc2R1LT5kYXRhICsgbDNfcGFkX2J5dGVzKTsKIAogCWhkcl9sZW4gPSBhdGgxMGtfaHR0X3J4X253aWZpX2hkcmxlbihhciwgaGRyKTsKIAlldGhlcl9hZGRyX2NvcHkoZGEsIGllZWU4MDIxMV9nZXRfREEoaGRyKSk7CkBAIC0xMTEzLDYgKzExMDMsNyBAQAogCXNpemVfdCBoZHJfbGVuLCBjcnlwdG9fbGVuOwogCXZvaWQgKnJmYzEwNDI7CiAJYm9vbCBpc19maXJzdCwgaXNfbGFzdCwgaXNfYW1zZHU7CisJaW50IGJ5dGVzX2FsaWduZWQgPSBhci0+aHdfcGFyYW1zLmRlY2FwX2FsaWduX2J5dGVzOwogCiAJcnhkID0gKHZvaWQgKiltc2R1LT5kYXRhIC0gc2l6ZW9mKCpyeGQpOwogCWhkciA9ICh2b2lkICopcnhkLT5yeF9oZHJfc3RhdHVzOwpAQCAtMTEyOSw4ICsxMTIwLDggQEAKIAkJaGRyX2xlbiA9IGllZWU4MDIxMV9oZHJsZW4oaGRyLT5mcmFtZV9jb250cm9sKTsKIAkJY3J5cHRvX2xlbiA9IGF0aDEwa19odHRfcnhfY3J5cHRvX3BhcmFtX2xlbihhciwgZW5jdHlwZSk7CiAKLQkJcmZjMTA0MiArPSByb3VuZF91cChoZHJfbGVuLCA0KSArCi0JCQkgICByb3VuZF91cChjcnlwdG9fbGVuLCA0KTsKKwkJcmZjMTA0MiArPSByb3VuZF91cChoZHJfbGVuLCBieXRlc19hbGlnbmVkKSArCisJCQkgICByb3VuZF91cChjcnlwdG9fbGVuLCBieXRlc19hbGlnbmVkKTsKIAl9CiAKIAlpZiAoaXNfYW1zZHUpCkBAIC0xMTUxLDYgKzExNDIsOCBAQAogCXZvaWQgKnJmYzEwNDI7CiAJdTggZGFbRVRIX0FMRU5dOwogCXU4IHNhW0VUSF9BTEVOXTsKKwlpbnQgbDNfcGFkX2J5dGVzOworCXN0cnVjdCBodHRfcnhfZGVzYyAqcnhkOwogCiAJLyogRGVsaXZlcmVkIGRlY2FwcGVkIGZyYW1lOgogCSAqIFtldGggaGVhZGVyXSA8LS0gcmVwbGFjZWQgd2l0aCA4MDIuMTEgaGRyICYgcmZjMTA0Mi9sbGMKQEAgLTExNjEsNiArMTE1NCwxMSBAQAogCWlmIChXQVJOX09OX09OQ0UoIXJmYzEwNDIpKQogCQlyZXR1cm47CiAKKwlyeGQgPSAodm9pZCAqKW1zZHUtPmRhdGEgLSBzaXplb2YoKnJ4ZCk7CisJbDNfcGFkX2J5dGVzID0gYXRoMTBrX3J4X2Rlc2NfZ2V0X2wzX3BhZF9ieXRlcygmYXItPmh3X3BhcmFtcywgcnhkKTsKKwlza2JfcHV0KG1zZHUsIGwzX3BhZF9ieXRlcyk7CisJc2tiX3B1bGwobXNkdSwgbDNfcGFkX2J5dGVzKTsKKwogCS8qIHB1bGwgZGVjYXBwZWQgaGVhZGVyIGFuZCBjb3B5IFNBICYgREEgKi8KIAlldGggPSAoc3RydWN0IGV0aGhkciAqKW1zZHUtPmRhdGE7CiAJZXRoZXJfYWRkcl9jb3B5KGRhLCBldGgtPmhfZGVzdCk7CkBAIC0xMTkxLDYgKzExODksOCBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJc2l6ZV90IGhkcl9sZW47CisJaW50IGwzX3BhZF9ieXRlczsKKwlzdHJ1Y3QgaHR0X3J4X2Rlc2MgKnJ4ZDsKIAogCS8qIERlbGl2ZXJlZCBkZWNhcHBlZCBmcmFtZToKIAkgKiBbYW1zZHUgaGVhZGVyXSA8LS0gcmVwbGFjZWQgd2l0aCA4MDIuMTEgaGRyCkBAIC0xMTk4LDcgKzExOTgsMTEgQEAKIAkgKiBbcGF5bG9hZF0KIAkgKi8KIAotCXNrYl9wdWxsKG1zZHUsIHNpemVvZihzdHJ1Y3QgYW1zZHVfc3ViZnJhbWVfaGRyKSk7CisJcnhkID0gKHZvaWQgKiltc2R1LT5kYXRhIC0gc2l6ZW9mKCpyeGQpOworCWwzX3BhZF9ieXRlcyA9IGF0aDEwa19yeF9kZXNjX2dldF9sM19wYWRfYnl0ZXMoJmFyLT5od19wYXJhbXMsIHJ4ZCk7CisKKwlza2JfcHV0KG1zZHUsIGwzX3BhZF9ieXRlcyk7CisJc2tiX3B1bGwobXNkdSwgc2l6ZW9mKHN0cnVjdCBhbXNkdV9zdWJmcmFtZV9oZHIpICsgbDNfcGFkX2J5dGVzKTsKIAogCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWZpcnN0X2hkcjsKIAloZHJfbGVuID0gaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1lX2NvbnRyb2wpOwpAQCAtMTUyNSw5ICsxNTI5LDkgQEAKIHN0YXRpYyBpbnQgYXRoMTBrX2h0dF9yeF9oYW5kbGVfYW1zZHUoc3RydWN0IGF0aDEwa19odHQgKmh0dCkKIHsKIAlzdHJ1Y3QgYXRoMTBrICphciA9IGh0dC0+YXI7Ci0Jc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzIHJ4X3N0YXR1czsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHVzID0gJmh0dC0+cnhfc3RhdHVzOwogCXN0cnVjdCBza19idWZmX2hlYWQgYW1zZHU7Ci0JaW50IHJldDsKKwlpbnQgcmV0LCBudW1fbXNkdXM7CiAKIAlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJmFtc2R1KTsKIApAQCAtMTU0OSwxMyArMTU1MywxNCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWF0aDEwa19odHRfcnhfaF9wcGR1KGFyLCAmYW1zZHUsICZyeF9zdGF0dXMsIDB4ZmZmZik7CisJbnVtX21zZHVzID0gc2tiX3F1ZXVlX2xlbigmYW1zZHUpOworCWF0aDEwa19odHRfcnhfaF9wcGR1KGFyLCAmYW1zZHUsIHJ4X3N0YXR1cywgMHhmZmZmKTsKIAlhdGgxMGtfaHR0X3J4X2hfdW5jaGFpbihhciwgJmFtc2R1LCByZXQgPiAwKTsKLQlhdGgxMGtfaHR0X3J4X2hfZmlsdGVyKGFyLCAmYW1zZHUsICZyeF9zdGF0dXMpOwotCWF0aDEwa19odHRfcnhfaF9tcGR1KGFyLCAmYW1zZHUsICZyeF9zdGF0dXMpOwotCWF0aDEwa19odHRfcnhfaF9kZWxpdmVyKGFyLCAmYW1zZHUsICZyeF9zdGF0dXMpOworCWF0aDEwa19odHRfcnhfaF9maWx0ZXIoYXIsICZhbXNkdSwgcnhfc3RhdHVzKTsKKwlhdGgxMGtfaHR0X3J4X2hfbXBkdShhciwgJmFtc2R1LCByeF9zdGF0dXMpOworCWF0aDEwa19odHRfcnhfaF9kZWxpdmVyKGFyLCAmYW1zZHUsIHJ4X3N0YXR1cyk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gbnVtX21zZHVzOwogfQogCiBzdGF0aWMgdm9pZCBhdGgxMGtfaHR0X3J4X3Byb2NfcnhfaW5kKHN0cnVjdCBhdGgxMGtfaHR0ICpodHQsCkBAIC0xNTc5LDE1ICsxNTg0LDYgQEAKIAkJbXBkdV9jb3VudCArPSBtcGR1X3Jhbmdlc1tpXS5tcGR1X2NvdW50OwogCiAJYXRvbWljX2FkZChtcGR1X2NvdW50LCAmaHR0LT5udW1fbXBkdXNfcmVhZHkpOwotCi0JdGFza2xldF9zY2hlZHVsZSgmaHR0LT50eHJ4X2NvbXBsX3Rhc2spOwotfQotCi1zdGF0aWMgdm9pZCBhdGgxMGtfaHR0X3J4X2ZyYWdfaGFuZGxlcihzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0KQotewotCWF0b21pY19pbmMoJmh0dC0+bnVtX21wZHVzX3JlYWR5KTsKLQotCXRhc2tsZXRfc2NoZWR1bGUoJmh0dC0+dHhyeF9jb21wbF90YXNrKTsKIH0KIAogc3RhdGljIHZvaWQgYXRoMTBrX2h0dF9yeF90eF9jb21wbF9pbmQoc3RydWN0IGF0aDEwayAqYXIsCkBAIC0xNzcyLDE0ICsxNzY4LDE1IEBACiAJCQlSWF9GTEFHX01NSUNfU1RSSVBQRUQ7CiB9CiAKLXN0YXRpYyB2b2lkIGF0aDEwa19odHRfcnhfaF9yeF9vZmZsb2FkKHN0cnVjdCBhdGgxMGsgKmFyLAotCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQorc3RhdGljIGludCBhdGgxMGtfaHR0X3J4X2hfcnhfb2ZmbG9hZChzdHJ1Y3QgYXRoMTBrICphciwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQogewogCXN0cnVjdCBhdGgxMGtfaHR0ICpodHQgPSAmYXItPmh0dDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzID0gJmh0dC0+cnhfc3RhdHVzOwogCXN0cnVjdCBodHRfcnhfb2ZmbG9hZF9tc2R1ICpyeDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbXNkdTsKIAlzaXplX3Qgb2Zmc2V0OworCWludCBudW1fbXNkdSA9IDA7CiAKIAl3aGlsZSAoKG1zZHUgPSBfX3NrYl9kZXF1ZXVlKGxpc3QpKSkgewogCQkvKiBPZmZsb2FkZWQgZnJhbWVzIGRvbid0IGhhdmUgUnggZGVzY3JpcHRvci4gSW5zdGVhZCB0aGV5IGhhdmUKQEAgLTE4MTksMTAgKzE4MTYsMTIgQEAKIAkJYXRoMTBrX2h0dF9yeF9oX3J4X29mZmxvYWRfcHJvdChzdGF0dXMsIG1zZHUpOwogCQlhdGgxMGtfaHR0X3J4X2hfY2hhbm5lbChhciwgc3RhdHVzLCBOVUxMLCByeC0+dmRldl9pZCk7CiAJCWF0aDEwa19wcm9jZXNzX3J4KGFyLCBzdGF0dXMsIG1zZHUpOworCQludW1fbXNkdSsrOwogCX0KKwlyZXR1cm4gbnVtX21zZHU7CiB9CiAKLXN0YXRpYyB2b2lkIGF0aDEwa19odHRfcnhfaW5fb3JkX2luZChzdHJ1Y3QgYXRoMTBrICphciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgYXRoMTBrX2h0dF9yeF9pbl9vcmRfaW5kKHN0cnVjdCBhdGgxMGsgKmFyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBhdGgxMGtfaHR0ICpodHQgPSAmYXItPmh0dDsKIAlzdHJ1Y3QgaHR0X3Jlc3AgKnJlc3AgPSAodm9pZCAqKXNrYi0+ZGF0YTsKQEAgLTE4MzUsMTIgKzE4MzQsMTIgQEAKIAl1OCB0aWQ7CiAJYm9vbCBvZmZsb2FkOwogCWJvb2wgZnJhZzsKLQlpbnQgcmV0OworCWludCByZXQsIG51bV9tc2R1cyA9IDA7CiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZodHQtPnJ4X3JpbmcubG9jayk7CiAKIAlpZiAoaHR0LT5yeF9jb25mdXNlZCkKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVJTzsKIAogCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHJlc3AtPmhkcikpOwogCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHJlc3AtPnJ4X2luX29yZF9pbmQpKTsKQEAgLTE4NTksNyArMTg1OCw3IEBACiAKIAlpZiAoc2tiLT5sZW4gPCBtc2R1X2NvdW50ICogc2l6ZW9mKCpyZXNwLT5yeF9pbl9vcmRfaW5kLm1zZHVfZGVzY3MpKSB7CiAJCWF0aDEwa193YXJuKGFyLCAiZHJvcHBpbmcgaW52YWxpZCBpbiBvcmRlciByeCBpbmRpY2F0aW9uXG4iKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBUaGUgZXZlbnQgY2FuIGRlbGl2ZXIgbW9yZSB0aGFuIDEgQS1NU0RVLiBFYWNoIEEtTVNEVSBpcyBsYXRlcgpAQCAtMTg3MCwxNCArMTg2OSwxNCBAQAogCWlmIChyZXQgPCAwKSB7CiAJCWF0aDEwa193YXJuKGFyLCAiZmFpbGVkIHRvIHBvcCBwYWRkciBsaXN0OiAlZFxuIiwgcmV0KTsKIAkJaHR0LT5yeF9jb25mdXNlZCA9IHRydWU7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC1FSU87CiAJfQogCiAJLyogT2ZmbG9hZGVkIGZyYW1lcyBhcmUgdmVyeSBkaWZmZXJlbnQgYW5kIG5lZWQgdG8gYmUgaGFuZGxlZAogCSAqIHNlcGFyYXRlbHkuCiAJICovCiAJaWYgKG9mZmxvYWQpCi0JCWF0aDEwa19odHRfcnhfaF9yeF9vZmZsb2FkKGFyLCAmbGlzdCk7CisJCW51bV9tc2R1cyA9IGF0aDEwa19odHRfcnhfaF9yeF9vZmZsb2FkKGFyLCAmbGlzdCk7CiAKIAl3aGlsZSAoIXNrYl9xdWV1ZV9lbXB0eSgmbGlzdCkpIHsKIAkJX19za2JfcXVldWVfaGVhZF9pbml0KCZhbXNkdSk7CkBAIC0xODkwLDYgKzE4ODksNyBAQAogCQkJICogYmV0dGVyIHRvIHJlcG9ydCBzb21ldGhpbmcgdGhhbiBub3RoaW5nIHRob3VnaC4gVGhpcwogCQkJICogc2hvdWxkIHN0aWxsIGdpdmUgYW4gaWRlYSBhYm91dCByeCByYXRlIHRvIHRoZSB1c2VyLgogCQkJICovCisJCQludW1fbXNkdXMgKz0gc2tiX3F1ZXVlX2xlbigmYW1zZHUpOwogCQkJYXRoMTBrX2h0dF9yeF9oX3BwZHUoYXIsICZhbXNkdSwgc3RhdHVzLCB2ZGV2X2lkKTsKIAkJCWF0aDEwa19odHRfcnhfaF9maWx0ZXIoYXIsICZhbXNkdSwgc3RhdHVzKTsKIAkJCWF0aDEwa19odHRfcnhfaF9tcGR1KGFyLCAmYW1zZHUsIHN0YXR1cyk7CkBAIC0xOTAyLDkgKzE5MDIsMTAgQEAKIAkJCWF0aDEwa193YXJuKGFyLCAiZmFpbGVkIHRvIGV4dHJhY3QgYW1zZHU6ICVkXG4iLCByZXQpOwogCQkJaHR0LT5yeF9jb25mdXNlZCA9IHRydWU7CiAJCQlfX3NrYl9xdWV1ZV9wdXJnZSgmbGlzdCk7Ci0JCQlyZXR1cm47CisJCQlyZXR1cm4gLUVJTzsKIAkJfQogCX0KKwlyZXR1cm4gbnVtX21zZHVzOwogfQogCiBzdGF0aWMgdm9pZCBhdGgxMGtfaHR0X3J4X3R4X2ZldGNoX3Jlc3BfaWRfY29uZmlybShzdHJ1Y3QgYXRoMTBrICphciwKQEAgLTIyNjcsNyArMjI2OCw2IEBACiAJfQogCWNhc2UgSFRUX1QySF9NU0dfVFlQRV9UWF9DT01QTF9JTkQ6CiAJCWF0aDEwa19odHRfcnhfdHhfY29tcGxfaW5kKGh0dC0+YXIsIHNrYik7Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJmh0dC0+dHhyeF9jb21wbF90YXNrKTsKIAkJYnJlYWs7CiAJY2FzZSBIVFRfVDJIX01TR19UWVBFX1NFQ19JTkQ6IHsKIAkJc3RydWN0IGF0aDEwayAqYXIgPSBodHQtPmFyOwpAQCAtMjI4NCw3ICsyMjg0LDcgQEAKIAljYXNlIEhUVF9UMkhfTVNHX1RZUEVfUlhfRlJBR19JTkQ6IHsKIAkJYXRoMTBrX2RiZ19kdW1wKGFyLCBBVEgxMEtfREJHX0hUVF9EVU1QLCBOVUxMLCAiaHR0IGV2ZW50OiAiLAogCQkJCXNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCQlhdGgxMGtfaHR0X3J4X2ZyYWdfaGFuZGxlcihodHQpOworCQlhdG9taWNfaW5jKCZodHQtPm51bV9tcGR1c19yZWFkeSk7CiAJCWJyZWFrOwogCX0KIAljYXNlIEhUVF9UMkhfTVNHX1RZUEVfVEVTVDoKQEAgLTIzMjAsOCArMjMyMCw3IEBACiAJCWJyZWFrOwogCX0KIAljYXNlIEhUVF9UMkhfTVNHX1RZUEVfUlhfSU5fT1JEX1BBRERSX0lORDogewotCQlza2JfcXVldWVfdGFpbCgmaHR0LT5yeF9pbl9vcmRfY29tcGxfcSwgc2tiKTsKLQkJdGFza2xldF9zY2hlZHVsZSgmaHR0LT50eHJ4X2NvbXBsX3Rhc2spOworCQlfX3NrYl9xdWV1ZV90YWlsKCZodHQtPnJ4X2luX29yZF9jb21wbF9xLCBza2IpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCWNhc2UgSFRUX1QySF9NU0dfVFlQRV9UWF9DUkVESVRfVVBEQVRFX0lORDoKQEAgLTIzNDcsNyArMjM0Niw2IEBACiAJCQlicmVhazsKIAkJfQogCQlza2JfcXVldWVfdGFpbCgmaHR0LT50eF9mZXRjaF9pbmRfcSwgdHhfZmV0Y2hfaW5kKTsKLQkJdGFza2xldF9zY2hlZHVsZSgmaHR0LT50eHJ4X2NvbXBsX3Rhc2spOwogCQlicmVhazsKIAl9CiAJY2FzZSBIVFRfVDJIX01TR19UWVBFX1RYX0ZFVENIX0NPTkZJUk06CkBAIC0yMzc2LDI3ICsyMzc0LDc3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGF0aDEwa19odHRfcnhfcGt0bG9nX2NvbXBsZXRpb25faGFuZGxlcik7CiAKLXN0YXRpYyB2b2lkIGF0aDEwa19odHRfdHhyeF9jb21wbF90YXNrKHVuc2lnbmVkIGxvbmcgcHRyKQoraW50IGF0aDEwa19odHRfdHhyeF9jb21wbF90YXNrKHN0cnVjdCBhdGgxMGsgKmFyLCBpbnQgYnVkZ2V0KQogewotCXN0cnVjdCBhdGgxMGtfaHR0ICpodHQgPSAoc3RydWN0IGF0aDEwa19odHQgKilwdHI7Ci0Jc3RydWN0IGF0aDEwayAqYXIgPSBodHQtPmFyOworCXN0cnVjdCBhdGgxMGtfaHR0ICpodHQgPSAmYXItPmh0dDsKIAlzdHJ1Y3QgaHR0X3R4X2RvbmUgdHhfZG9uZSA9IHt9OwotCXN0cnVjdCBza19idWZmX2hlYWQgcnhfaW5kX3E7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCB0eF9pbmRfcTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IG51bV9tcGR1czsKKwlpbnQgcXVvdGEgPSAwLCBkb25lLCBudW1fcnhfbXNkdXM7CisJYm9vbCByZXNjaGVkX25hcGkgPSBmYWxzZTsKIAotCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcnhfaW5kX3EpOwogCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdHhfaW5kX3EpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh0dC0+cnhfaW5fb3JkX2NvbXBsX3EubG9jaywgZmxhZ3MpOwotCXNrYl9xdWV1ZV9zcGxpY2VfaW5pdCgmaHR0LT5yeF9pbl9vcmRfY29tcGxfcSwgJnJ4X2luZF9xKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodHQtPnJ4X2luX29yZF9jb21wbF9xLmxvY2ssIGZsYWdzKTsKKwkvKiBTaW5jZSBpbi1vcmQtaW5kIGNhbiBkZWxpdmVyIG1vcmUgdGhhbiAxIEEtTVNEVSBpbiBzaW5nbGUgZXZlbnQsCisJICogcHJvY2VzcyBpdCBmaXJzdCB0byB1dGlsaXplIGZ1bGwgYXZhaWxhYmxlIHF1b3RhLgorCSAqLworCXdoaWxlIChxdW90YSA8IGJ1ZGdldCkgeworCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZodHQtPnJ4X2luX29yZF9jb21wbF9xKSkKKwkJCWJyZWFrOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh0dC0+dHhfZmV0Y2hfaW5kX3EubG9jaywgZmxhZ3MpOwotCXNrYl9xdWV1ZV9zcGxpY2VfaW5pdCgmaHR0LT50eF9mZXRjaF9pbmRfcSwgJnR4X2luZF9xKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodHQtPnR4X2ZldGNoX2luZF9xLmxvY2ssIGZsYWdzKTsKKwkJc2tiID0gX19za2JfZGVxdWV1ZSgmaHR0LT5yeF9pbl9vcmRfY29tcGxfcSk7CisJCWlmICghc2tiKSB7CisJCQlyZXNjaGVkX25hcGkgPSB0cnVlOworCQkJZ290byBleGl0OworCQl9CisKKwkJc3Bpbl9sb2NrX2JoKCZodHQtPnJ4X3JpbmcubG9jayk7CisJCW51bV9yeF9tc2R1cyA9IGF0aDEwa19odHRfcnhfaW5fb3JkX2luZChhciwgc2tiKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmh0dC0+cnhfcmluZy5sb2NrKTsKKwkJaWYgKG51bV9yeF9tc2R1cyA8IDApIHsKKwkJCXJlc2NoZWRfbmFwaSA9IHRydWU7CisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlpZiAobnVtX3J4X21zZHVzID4gMCkKKwkJCXF1b3RhICs9IG51bV9yeF9tc2R1czsKKworCQlpZiAoKHF1b3RhID4gQVRIMTBLX05BUElfUVVPVEFfTElNSVQpICYmCisJCSAgICAhc2tiX3F1ZXVlX2VtcHR5KCZodHQtPnJ4X2luX29yZF9jb21wbF9xKSkgeworCQkJcmVzY2hlZF9uYXBpID0gdHJ1ZTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKworCXdoaWxlIChxdW90YSA8IGJ1ZGdldCkgeworCQkvKiBubyBtb3JlIGRhdGEgdG8gcmVjZWl2ZSAqLworCQlpZiAoIWF0b21pY19yZWFkKCZodHQtPm51bV9tcGR1c19yZWFkeSkpCisJCQlicmVhazsKKworCQludW1fcnhfbXNkdXMgPSBhdGgxMGtfaHR0X3J4X2hhbmRsZV9hbXNkdShodHQpOworCQlpZiAobnVtX3J4X21zZHVzIDwgMCkgeworCQkJcmVzY2hlZF9uYXBpID0gdHJ1ZTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCXF1b3RhICs9IG51bV9yeF9tc2R1czsKKwkJYXRvbWljX2RlYygmaHR0LT5udW1fbXBkdXNfcmVhZHkpOworCQlpZiAoKHF1b3RhID4gQVRIMTBLX05BUElfUVVPVEFfTElNSVQpICYmCisJCSAgICBhdG9taWNfcmVhZCgmaHR0LT5udW1fbXBkdXNfcmVhZHkpKSB7CisJCQlyZXNjaGVkX25hcGkgPSB0cnVlOworCQkJZ290byBleGl0OworCQl9CisJfQorCisJLyogRnJvbSBOQVBJIGRvY3VtZW50YXRpb246CisJICogIFRoZSBuYXBpIHBvbGwoKSBmdW5jdGlvbiBtYXkgYWxzbyBwcm9jZXNzIFRYIGNvbXBsZXRpb25zLCBpbiB3aGljaAorCSAqICBjYXNlIGlmIGl0IHByb2Nlc3NlcyB0aGUgZW50aXJlIFRYIHJpbmcgdGhlbiBpdCBzaG91bGQgY291bnQgdGhhdAorCSAqICB3b3JrIGFzIHRoZSByZXN0IG9mIHRoZSBidWRnZXQuCisJICovCisJaWYgKChxdW90YSA8IGJ1ZGdldCkgJiYgIWtmaWZvX2lzX2VtcHR5KCZodHQtPnR4ZG9uZV9maWZvKSkKKwkJcXVvdGEgPSBidWRnZXQ7CiAKIAkvKiBrZmlmb19nZXQ6IGNhbGxlZCBvbmx5IHdpdGhpbiB0eHJ4X3Rhc2tsZXQgc28gaXQncyBuZWF0bHkgc2VyaWFsaXplZC4KIAkgKiBGcm9tIGtmaWZvX2dldCgpIGRvY3VtZW50YXRpb246CkBAIC0yNDA2LDI3ICsyNDU0LDI0IEBACiAJd2hpbGUgKGtmaWZvX2dldCgmaHR0LT50eGRvbmVfZmlmbywgJnR4X2RvbmUpKQogCQlhdGgxMGtfdHhyeF90eF91bnJlZihodHQsICZ0eF9kb25lKTsKIAorCWF0aDEwa19tYWNfdHhfcHVzaF9wZW5kaW5nKGFyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodHQtPnR4X2ZldGNoX2luZF9xLmxvY2ssIGZsYWdzKTsKKwlza2JfcXVldWVfc3BsaWNlX2luaXQoJmh0dC0+dHhfZmV0Y2hfaW5kX3EsICZ0eF9pbmRfcSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHR0LT50eF9mZXRjaF9pbmRfcS5sb2NrLCBmbGFncyk7CisKIAl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJnR4X2luZF9xKSkpIHsKIAkJYXRoMTBrX2h0dF9yeF90eF9mZXRjaF9pbmQoYXIsIHNrYik7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJfQogCi0JbnVtX21wZHVzID0gYXRvbWljX3JlYWQoJmh0dC0+bnVtX21wZHVzX3JlYWR5KTsKLQotCXdoaWxlIChudW1fbXBkdXMpIHsKLQkJaWYgKGF0aDEwa19odHRfcnhfaGFuZGxlX2Ftc2R1KGh0dCkpCi0JCQlicmVhazsKLQotCQludW1fbXBkdXMtLTsKLQkJYXRvbWljX2RlYygmaHR0LT5udW1fbXBkdXNfcmVhZHkpOwotCX0KLQotCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmcnhfaW5kX3EpKSkgewotCQlzcGluX2xvY2tfYmgoJmh0dC0+cnhfcmluZy5sb2NrKTsKLQkJYXRoMTBrX2h0dF9yeF9pbl9vcmRfaW5kKGFyLCBza2IpOwotCQlzcGluX3VubG9ja19iaCgmaHR0LT5yeF9yaW5nLmxvY2spOwotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCX0KLQorZXhpdDoKIAlhdGgxMGtfaHR0X3J4X21zZHVfYnVmZl9yZXBsZW5pc2goaHR0KTsKKwkvKiBJbiBjYXNlIG9mIHJ4IGZhaWx1cmUgb3IgbW9yZSBkYXRhIHRvIHJlYWQsIHJlcG9ydCBidWRnZXQKKwkgKiB0byByZXNjaGVkdWxlIE5BUEkgcG9sbAorCSAqLworCWRvbmUgPSByZXNjaGVkX25hcGkgPyBidWRnZXQgOiBxdW90YTsKKworCXJldHVybiBkb25lOwogfQorRVhQT1JUX1NZTUJPTChhdGgxMGtfaHR0X3R4cnhfY29tcGxfdGFzayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dF90eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHRfdHguYwppbmRleCA3YzA3MmI2Li5hZTViMzNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dF90eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHR0X3R4LmMKQEAgLTM5MCw4ICszOTAsNiBAQAogewogCWludCBzaXplOwogCi0JdGFza2xldF9raWxsKCZodHQtPnR4cnhfY29tcGxfdGFzayk7Ci0KIAlpZHJfZm9yX2VhY2goJmh0dC0+cGVuZGluZ190eCwgYXRoMTBrX2h0dF90eF9jbGVhbl91cF9wZW5kaW5nLCBodHQtPmFyKTsKIAlpZHJfZGVzdHJveSgmaHR0LT5wZW5kaW5nX3R4KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ody5jCmluZGV4IGY5MDNkNDYuLjY3NWU3NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h3LmMKQEAgLTg1LDcgKzg1LDcgQEAKIAkuY2U3X2Jhc2VfYWRkcmVzcwkJCT0gMHgwMDA0YmMwMCwKIAkvKiBOb3RlOiBxY2E5OXgwIHN1cHBvcnRzIHVwdG8gMTIgQ29weSBFbmdpbmVzLiBPdGhlciB0aGFuIGFkZHJlc3Mgb2YKIAkgKiBDRTAgYW5kIENFMSBubyBvdGhlciBjb3B5IGVuZ2luZSBpcyBkaXJlY3RseSByZWZlcnJlZCBpbiB0aGUgY29kZS4KLQkgKiBJdCBpcyBub3QgcmVhbGx5IG5lY2Nlc3NhcnkgdG8gYXNzaWduIGFkZHJlc3MgZm9yIG5ld2x5IHN1cHBvcnRlZAorCSAqIEl0IGlzIG5vdCByZWFsbHkgbmVjZXNzYXJ5IHRvIGFzc2lnbiBhZGRyZXNzIGZvciBuZXdseSBzdXBwb3J0ZWQKIAkgKiBDRXMgaW4gdGhpcyBhZGRyZXNzIHRhYmxlLgogCSAqCUNvcHkgRW5naW5lCQlBZGRyZXNzCiAJICoJQ0U4CQkJMHgwMDA0YzAwMApAQCAtMjE5LDMgKzIxOSwxNiBAQAogCXN1cnZleS0+dGltZSA9IENDTlRfVE9fTVNFQyhhciwgY2MpOwogCXN1cnZleS0+dGltZV9idXN5ID0gQ0NOVF9UT19NU0VDKGFyLCByY2MpOwogfQorCitjb25zdCBzdHJ1Y3QgYXRoMTBrX2h3X29wcyBxY2E5ODh4X29wcyA9IHsKK307CisKK3N0YXRpYyBpbnQgYXRoMTBrX3FjYTk5eDBfcnhfZGVzY19nZXRfbDNfcGFkX2J5dGVzKHN0cnVjdCBodHRfcnhfZGVzYyAqcnhkKQoreworCXJldHVybiBNUyhfX2xlMzJfdG9fY3B1KHJ4ZC0+bXNkdV9lbmQucWNhOTl4MC5pbmZvMSksCisJCSAgUlhfTVNEVV9FTkRfSU5GTzFfTDNfSERSX1BBRCk7Cit9CisKK2NvbnN0IHN0cnVjdCBhdGgxMGtfaHdfb3BzIHFjYTk5eDBfb3BzID0geworCS5yeF9kZXNjX2dldF9sM19wYWRfYnl0ZXMgPSBhdGgxMGtfcWNhOTl4MF9yeF9kZXNjX2dldF9sM19wYWRfYnl0ZXMsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ody5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ody5oCmluZGV4IGUwMTRjZDcuLjYwMzhiNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h3LmgKQEAgLTI4NCw3ICsyODQsNyBAQAogI2RlZmluZSBRQ0FfUkVWXzkzNzcoYXIpICgoYXIpLT5od19yZXYgPT0gQVRIMTBLX0hXX1FDQTkzNzcpCiAjZGVmaW5lIFFDQV9SRVZfNDBYWChhcikgKChhciktPmh3X3JldiA9PSBBVEgxMEtfSFdfUUNBNDAxOSkKIAotLyogS25vd24gcGVjdWxhcml0aWVzOgorLyogS25vd24gcGVjdWxpYXJpdGllczoKICAqICAtIHJhdyBhcHBlYXJzIGluIG53aWZpIGRlY2FwLCByYXcgYW5kIG53aWZpIGFwcGVhciBpbiBldGhlcm5ldCBkZWNhcAogICogIC0gcmF3IGhhdmUgRkNTLCBud2lmaSBkb2Vzbid0CiAgKiAgLSBldGhlcm5ldCBmcmFtZXMgaGF2ZSA4MDIuMTEgaGVhZGVyIGRlY2FwcGVkIGFuZCBwYXJ0cyAoYmFzZSBoZHIsIGNpcGhlcgpAQCAtMzM4LDExICszMzgsNiBAQAogCUFUSDEwS19IV19SQVRFX1JFVjJfQ0NLX1NQXzExTSwKIH07CiAKLWVudW0gYXRoMTBrX2h3XzRhZGRyX3BhZCB7Ci0JQVRIMTBLX0hXXzRBRERSX1BBRF9BRlRFUiwKLQlBVEgxMEtfSFdfNEFERFJfUEFEX0JFRk9SRSwKLX07Ci0KIGVudW0gYXRoMTBrX2h3X2NjX3dyYXBhcm91bmRfdHlwZSB7CiAJQVRIMTBLX0hXX0NDX1dSQVBfRElTQUJMRUQgPSAwLAogCkBAIC0zNjMsNiArMzU4LDgwIEBACiAJQVRIMTBLX0hXX0NDX1dSQVBfU0hJRlRFRF9FQUNIID0gMiwKIH07CiAKK3N0cnVjdCBhdGgxMGtfaHdfcGFyYW1zIHsKKwl1MzIgaWQ7CisJdTE2IGRldl9pZDsKKwljb25zdCBjaGFyICpuYW1lOworCXUzMiBwYXRjaF9sb2FkX2FkZHI7CisJaW50IHVhcnRfcGluOworCXUzMiBvdHBfZXhlX3BhcmFtOworCisJLyogVHlwZSBvZiBodyBjeWNsZSBjb3VudGVyIHdyYXBhcm91bmQgbG9naWMsIGZvciBtb3JlIGluZm8KKwkgKiByZWZlciBlbnVtIGF0aDEwa19od19jY193cmFwYXJvdW5kX3R5cGUuCisJICovCisJZW51bSBhdGgxMGtfaHdfY2Nfd3JhcGFyb3VuZF90eXBlIGNjX3dyYXBhcm91bmRfdHlwZTsKKworCS8qIFNvbWUgb2YgY2hpcCBleHBlY3RzIGZyYWdtZW50IGRlc2NyaXB0b3IgdG8gYmUgY29udGludW91cworCSAqIG1lbW9yeSBmb3IgYW55IFRYIG9wZXJhdGlvbi4gU2V0IGNvbnRpbnVvdXNfZnJhZ19kZXNjIGZsYWcKKwkgKiBmb3IgdGhlIGhhcmR3YXJlIHdoaWNoIGhhdmUgc3VjaCByZXF1aXJlbWVudC4KKwkgKi8KKwlib29sIGNvbnRpbnVvdXNfZnJhZ19kZXNjOworCisJLyogQ0NLIGhhcmR3YXJlIHJhdGUgdGFibGUgbWFwcGluZyBmb3IgdGhlIG5ld2VyIGNoaXBzZXRzCisJICogbGlrZSBRQ0E5OVgwLCBRQ0E0MDE5IGdvdCByZXZpc2VkLiBUaGUgQ0NLIGgvdyByYXRlIHZhbHVlcworCSAqIGFyZSBpbiBhIHByb3BlciBvcmRlciB3aXRoIHJlc3BlY3QgdG8gdGhlIHJhdGUvcHJlYW1ibGUKKwkgKi8KKwlib29sIGNja19yYXRlX21hcF9yZXYyOworCisJdTMyIGNoYW5uZWxfY291bnRlcnNfZnJlcV9oejsKKworCS8qIE1nbXQgdHggZGVzY3JpcHRvcnMgdGhyZXNob2xkIGZvciBsaW1pdGluZyBwcm9iZSByZXNwb25zZQorCSAqIGZyYW1lcy4KKwkgKi8KKwl1MzIgbWF4X3Byb2JlX3Jlc3BfZGVzY190aHJlczsKKworCXUzMiB0eF9jaGFpbl9tYXNrOworCXUzMiByeF9jaGFpbl9tYXNrOworCXUzMiBtYXhfc3BhdGlhbF9zdHJlYW07CisJdTMyIGNhbF9kYXRhX2xlbjsKKworCXN0cnVjdCBhdGgxMGtfaHdfcGFyYW1zX2Z3IHsKKwkJY29uc3QgY2hhciAqZGlyOworCQljb25zdCBjaGFyICpib2FyZDsKKwkJc2l6ZV90IGJvYXJkX3NpemU7CisJCXNpemVfdCBib2FyZF9leHRfc2l6ZTsKKwl9IGZ3OworCisJLyogcWNhOTl4MCBmYW1pbHkgY2hpcHMgZGVsaXZlciBicm9hZGNhc3QvbXVsdGljYXN0IG1hbmFnZW1lbnQKKwkgKiBmcmFtZXMgZW5jcnlwdGVkIGFuZCBleHBlY3Qgc29mdHdhcmUgZG8gZGVjcnlwdGlvbi4KKwkgKi8KKwlib29sIHN3X2RlY3J5cHRfbWNhc3RfbWdtdDsKKworCWNvbnN0IHN0cnVjdCBhdGgxMGtfaHdfb3BzICpod19vcHM7CisKKwkvKiBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBmb3IgYWxpZ25tZW50IGluIHJ4X2hkcl9zdGF0dXMgb2YgcnggZGVzYy4gKi8KKwlpbnQgZGVjYXBfYWxpZ25fYnl0ZXM7Cit9OworCitzdHJ1Y3QgaHR0X3J4X2Rlc2M7CisKKy8qIERlZmluZXMgbmVlZGVkIGZvciBSeCBkZXNjcmlwdG9yIGFic3RyYWN0aW9uICovCitzdHJ1Y3QgYXRoMTBrX2h3X29wcyB7CisJaW50ICgqcnhfZGVzY19nZXRfbDNfcGFkX2J5dGVzKShzdHJ1Y3QgaHR0X3J4X2Rlc2MgKnJ4ZCk7Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IGF0aDEwa19od19vcHMgcWNhOTg4eF9vcHM7CitleHRlcm4gY29uc3Qgc3RydWN0IGF0aDEwa19od19vcHMgcWNhOTl4MF9vcHM7CisKK3N0YXRpYyBpbmxpbmUgaW50CithdGgxMGtfcnhfZGVzY19nZXRfbDNfcGFkX2J5dGVzKHN0cnVjdCBhdGgxMGtfaHdfcGFyYW1zICpodywKKwkJCQlzdHJ1Y3QgaHR0X3J4X2Rlc2MgKnJ4ZCkKK3sKKwlpZiAoaHctPmh3X29wcy0+cnhfZGVzY19nZXRfbDNfcGFkX2J5dGVzKQorCQlyZXR1cm4gaHctPmh3X29wcy0+cnhfZGVzY19nZXRfbDNfcGFkX2J5dGVzKHJ4ZCk7CisJcmV0dXJuIDA7Cit9CisKIC8qIFRhcmdldCBzcGVjaWZpYyBkZWZpbmVzIGZvciBNQUlOIGZpcm13YXJlICovCiAjZGVmaW5lIFRBUkdFVF9OVU1fVkRFVlMJCQk4CiAjZGVmaW5lIFRBUkdFVF9OVU1fUEVFUl9BU1QJCQkyCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL21hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9tYWMuYwppbmRleCAwYmJkMGEwLi43NjI5N2Q2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvbWFjLmMKQEAgLTgyNCw3ICs4MjQsNyBAQAogCQkgKi8KIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXItPnBlZXJfbWFwKTsgaSsrKSB7CiAJCQlpZiAoYXItPnBlZXJfbWFwW2ldID09IHBlZXIpIHsKLQkJCQlhdGgxMGtfd2FybihhciwgInJlbW92aW5nIHN0YWxlIHBlZXJfbWFwIGVudHJ5IGZvciAlcE0gKHB0ciAlcCBpZHggJWQpXG4iLAorCQkJCWF0aDEwa193YXJuKGFyLCAicmVtb3Zpbmcgc3RhbGUgcGVlcl9tYXAgZW50cnkgZm9yICVwTSAocHRyICVwSyBpZHggJWQpXG4iLAogCQkJCQkgICAgcGVlci0+YWRkciwgcGVlciwgaSk7CiAJCQkJYXItPnBlZXJfbWFwW2ldID0gTlVMTDsKIAkJCX0KQEAgLTI3OTMsNyArMjc5Myw3IEBACiAKIAlyZXQgPSBhdGgxMGtfd21pX3ZkZXZfZG93bihhciwgYXJ2aWYtPnZkZXZfaWQpOwogCWlmIChyZXQpCi0JCWF0aDEwa193YXJuKGFyLCAiZmFpZWxkIHRvIGRvd24gdmRldiAlaTogJWRcbiIsCisJCWF0aDEwa193YXJuKGFyLCAiZmFpbGVkIHRvIGRvd24gdmRldiAlaTogJWRcbiIsCiAJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAKIAlhcnZpZi0+ZGVmX3dlcF9rZXlfaWR4ID0gLTE7CkBAIC0zMjU1LDYgKzMyNTUsOCBAQAogCWlmIChhci0+aHR0LnRhcmdldF92ZXJzaW9uX21ham9yIDwgMyAmJgogCSAgICAoaWVlZTgwMjExX2lzX251bGxmdW5jKGZjKSB8fCBpZWVlODAyMTFfaXNfcW9zX251bGxmdW5jKGZjKSkgJiYKIAkgICAgIXRlc3RfYml0KEFUSDEwS19GV19GRUFUVVJFX0hBU19XTUlfTUdNVF9UWCwKKwkJICAgICAgYXItPnJ1bm5pbmdfZnctPmZ3X2ZpbGUuZndfZmVhdHVyZXMpICYmCisJICAgICF0ZXN0X2JpdChBVEgxMEtfRldfRkVBVFVSRV9TS0lQX05VTExfRlVOQ19XQVIsCiAJCSAgICAgIGFyLT5ydW5uaW5nX2Z3LT5md19maWxlLmZ3X2ZlYXR1cmVzKSkKIAkJcmV0dXJuIEFUSDEwS19IV19UWFJYX01HTVQ7CiAKQEAgLTM1MjQsNyArMzUyNiw3IEBACiAKIAlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX1RYX09GRkNIQU4pIHsKIAkJaWYgKCFhdGgxMGtfbWFjX3R4X2ZybV9oYXNfZnJlcShhcikpIHsKLQkJCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfTUFDLCAicXVldWVkIG9mZmNoYW5uZWwgc2tiICVwXG4iLAorCQkJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19NQUMsICJxdWV1ZWQgb2ZmY2hhbm5lbCBza2IgJXBLXG4iLAogCQkJCSAgIHNrYik7CiAKIAkJCXNrYl9xdWV1ZV90YWlsKCZhci0+b2ZmY2hhbl90eF9xdWV1ZSwgc2tiKTsKQEAgLTM1ODYsNyArMzU4OCw3IEBACiAKIAkJbXV0ZXhfbG9jaygmYXItPmNvbmZfbXV0ZXgpOwogCi0JCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfTUFDLCAibWFjIG9mZmNoYW5uZWwgc2tiICVwXG4iLAorCQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX01BQywgIm1hYyBvZmZjaGFubmVsIHNrYiAlcEtcbiIsCiAJCQkgICBza2IpOwogCiAJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKQEAgLTM2NDMsNyArMzY0NSw3IEBACiAJCXRpbWVfbGVmdCA9CiAJCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmYXItPm9mZmNoYW5fdHhfY29tcGxldGVkLCAzICogSFopOwogCQlpZiAodGltZV9sZWZ0ID09IDApCi0JCQlhdGgxMGtfd2FybihhciwgInRpbWVkIG91dCB3YWl0aW5nIGZvciBvZmZjaGFubmVsIHNrYiAlcFxuIiwKKwkJCWF0aDEwa193YXJuKGFyLCAidGltZWQgb3V0IHdhaXRpbmcgZm9yIG9mZmNoYW5uZWwgc2tiICVwS1xuIiwKIAkJCQkgICAgc2tiKTsKIAogCQlpZiAoIXBlZXIgJiYgdG1wX3BlZXJfY3JlYXRlZCkgewpAQCAtMzc3Nyw3ICszNzc5LDkgQEAKIAllbnVtIGF0aDEwa19od190eHJ4X21vZGUgdHhtb2RlOwogCWVudW0gYXRoMTBrX21hY190eF9wYXRoIHR4cGF0aDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJc2l6ZV90IHNrYl9sZW47CisJYm9vbCBpc19tZ210LCBpc19wcmVzcDsKIAlpbnQgcmV0OwogCiAJc3Bpbl9sb2NrX2JoKCZhci0+aHR0LnR4X2xvY2spOwpAQCAtMzgwMSw2ICszODA1LDIyIEBACiAJc2tiX2xlbiA9IHNrYi0+bGVuOwogCXR4bW9kZSA9IGF0aDEwa19tYWNfdHhfaF9nZXRfdHhtb2RlKGFyLCB2aWYsIHN0YSwgc2tiKTsKIAl0eHBhdGggPSBhdGgxMGtfbWFjX3R4X2hfZ2V0X3R4cGF0aChhciwgc2tiLCB0eG1vZGUpOworCWlzX21nbXQgPSAodHhwYXRoID09IEFUSDEwS19NQUNfVFhfSFRUX01HTVQpOworCisJaWYgKGlzX21nbXQpIHsKKwkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCQlpc19wcmVzcCA9IGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGhkci0+ZnJhbWVfY29udHJvbCk7CisKKwkJc3Bpbl9sb2NrX2JoKCZhci0+aHR0LnR4X2xvY2spOworCQlyZXQgPSBhdGgxMGtfaHR0X3R4X21nbXRfaW5jX3BlbmRpbmcoaHR0LCBpc19tZ210LCBpc19wcmVzcCk7CisKKwkJaWYgKHJldCkgeworCQkJYXRoMTBrX2h0dF90eF9kZWNfcGVuZGluZyhodHQpOworCQkJc3Bpbl91bmxvY2tfYmgoJmFyLT5odHQudHhfbG9jayk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZhci0+aHR0LnR4X2xvY2spOworCX0KIAogCXJldCA9IGF0aDEwa19tYWNfdHgoYXIsIHZpZiwgc3RhLCB0eG1vZGUsIHR4cGF0aCwgc2tiKTsKIAlpZiAodW5saWtlbHkocmV0KSkgewpAQCAtMzgwOCw2ICszODI4LDggQEAKIAogCQlzcGluX2xvY2tfYmgoJmFyLT5odHQudHhfbG9jayk7CiAJCWF0aDEwa19odHRfdHhfZGVjX3BlbmRpbmcoaHR0KTsKKwkJaWYgKGlzX21nbXQpCisJCQlhdGgxMGtfaHR0X3R4X21nbXRfZGVjX3BlbmRpbmcoaHR0KTsKIAkJc3Bpbl91bmxvY2tfYmgoJmFyLT5odHQudHhfbG9jayk7CiAKIAkJcmV0dXJuIHJldDsKQEAgLTM4OTQsNyArMzkxNiw3IEBACiAJCWFyLT5zY2FuLnJvY19mcmVxID0gMDsKIAkJYXRoMTBrX29mZmNoYW5fdHhfcHVyZ2UoYXIpOwogCQljYW5jZWxfZGVsYXllZF93b3JrKCZhci0+c2Nhbi50aW1lb3V0KTsKLQkJY29tcGxldGVfYWxsKCZhci0+c2Nhbi5jb21wbGV0ZWQpOworCQljb21wbGV0ZSgmYXItPnNjYW4uY29tcGxldGVkKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtNDEwMCwxMyArNDEyMiwyOSBAQAogewogCXN0cnVjdCBhdGgxMGsgKmFyID0gaHctPnByaXY7CiAJc3RydWN0IGF0aDEwa190eHEgKmFydHhxID0gKHZvaWQgKil0eHEtPmRydl9wcml2OworCXN0cnVjdCBpZWVlODAyMTFfdHhxICpmX3R4cTsKKwlzdHJ1Y3QgYXRoMTBrX3R4cSAqZl9hcnR4cTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbWF4ID0gMTY7CiAKIAlzcGluX2xvY2tfYmgoJmFyLT50eHFzX2xvY2spOwogCWlmIChsaXN0X2VtcHR5KCZhcnR4cS0+bGlzdCkpCiAJCWxpc3RfYWRkX3RhaWwoJmFydHhxLT5saXN0LCAmYXItPnR4cXMpOworCisJZl9hcnR4cSA9IGxpc3RfZmlyc3RfZW50cnkoJmFyLT50eHFzLCBzdHJ1Y3QgYXRoMTBrX3R4cSwgbGlzdCk7CisJZl90eHEgPSBjb250YWluZXJfb2YoKHZvaWQgKilmX2FydHhxLCBzdHJ1Y3QgaWVlZTgwMjExX3R4cSwgZHJ2X3ByaXYpOworCWxpc3RfZGVsX2luaXQoJmZfYXJ0eHEtPmxpc3QpOworCisJd2hpbGUgKGF0aDEwa19tYWNfdHhfY2FuX3B1c2goaHcsIGZfdHhxKSAmJiBtYXgtLSkgeworCQlyZXQgPSBhdGgxMGtfbWFjX3R4X3B1c2hfdHhxKGh3LCBmX3R4cSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisJaWYgKHJldCAhPSAtRU5PRU5UKQorCQlsaXN0X2FkZF90YWlsKCZmX2FydHhxLT5saXN0LCAmYXItPnR4cXMpOwogCXNwaW5fdW5sb2NrX2JoKCZhci0+dHhxc19sb2NrKTsKIAotCWF0aDEwa19tYWNfdHhfcHVzaF9wZW5kaW5nKGFyKTsKKwlhdGgxMGtfaHR0X3R4X3R4cV91cGRhdGUoaHcsIGZfdHhxKTsKIAlhdGgxMGtfaHR0X3R4X3R4cV91cGRhdGUoaHcsIHR4cSk7CiB9CiAKQEAgLTUxODYsNyArNTIyNCw3IEBACiAKIAlyZXQgPSBhdGgxMGtfbW9uaXRvcl9yZWNhbGMoYXIpOwogCWlmIChyZXQpCi0JCWF0aDEwa193YXJuKGFyLCAiZmFpbGVkIHRvIHJlY2FsYyBtb250aW9yOiAlZFxuIiwgcmV0KTsKKwkJYXRoMTBrX3dhcm4oYXIsICJmYWlsZWQgdG8gcmVjYWxjIG1vbml0b3I6ICVkXG4iLCByZXQpOwogCiAJbXV0ZXhfdW5sb2NrKCZhci0+Y29uZl9tdXRleCk7CiB9CkBAIC01OTg0LDggKzYwMjIsOCBAQAogCQkgKiBFeGlzdGluZyBzdGF0aW9uIGRlbGV0aW9uLgogCQkgKi8KIAkJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19NQUMsCi0JCQkgICAibWFjIHZkZXYgJWQgcGVlciBkZWxldGUgJXBNIChzdGEgZ29uZSlcbiIsCi0JCQkgICBhcnZpZi0+dmRldl9pZCwgc3RhLT5hZGRyKTsKKwkJCSAgICJtYWMgdmRldiAlZCBwZWVyIGRlbGV0ZSAlcE0gc3RhICVwSyAoc3RhIGdvbmUpXG4iLAorCQkJICAgYXJ2aWYtPnZkZXZfaWQsIHN0YS0+YWRkciwgc3RhKTsKIAogCQlyZXQgPSBhdGgxMGtfcGVlcl9kZWxldGUoYXIsIGFydmlmLT52ZGV2X2lkLCBzdGEtPmFkZHIpOwogCQlpZiAocmV0KQpAQCAtNjAwMSw3ICs2MDM5LDcgQEAKIAkJCQljb250aW51ZTsKIAogCQkJaWYgKHBlZXItPnN0YSA9PSBzdGEpIHsKLQkJCQlhdGgxMGtfd2FybihhciwgImZvdW5kIHN0YSBwZWVyICVwTSAocHRyICVwIGlkICVkKSBlbnRyeSBvbiB2ZGV2ICVpIGFmdGVyIGl0IHdhcyBzdXBwb3NlZGx5IHJlbW92ZWRcbiIsCisJCQkJYXRoMTBrX3dhcm4oYXIsICJmb3VuZCBzdGEgcGVlciAlcE0gKHB0ciAlcEsgaWQgJWQpIGVudHJ5IG9uIHZkZXYgJWkgYWZ0ZXIgaXQgd2FzIHN1cHBvc2VkbHkgcmVtb3ZlZFxuIiwKIAkJCQkJICAgIHN0YS0+YWRkciwgcGVlciwgaSwgYXJ2aWYtPnZkZXZfaWQpOwogCQkJCXBlZXItPnN0YSA9IE5VTEw7CiAKQEAgLTY1MzgsNyArNjU3Niw3IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlhdGgxMGtfbWFjX3VwZGF0ZV9ic3NfY2hhbl9zdXJ2ZXkoYXIsIHN1cnZleS0+Y2hhbm5lbCk7CisJYXRoMTBrX21hY191cGRhdGVfYnNzX2NoYW5fc3VydmV5KGFyLCAmc2JhbmQtPmNoYW5uZWxzW2lkeF0pOwogCiAJc3Bpbl9sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKIAltZW1jcHkoc3VydmV5LCBhcl9zdXJ2ZXksIHNpemVvZigqc3VydmV5KSk7CkBAIC03MTM0LDcgKzcxNzIsNyBAQAogCXN0cnVjdCBhdGgxMGsgKmFyID0gaHctPnByaXY7CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX01BQywKLQkJICAgIm1hYyBjaGFuY3R4IGFkZCBmcmVxICVodSB3aWR0aCAlZCBwdHIgJXBcbiIsCisJCSAgICJtYWMgY2hhbmN0eCBhZGQgZnJlcSAlaHUgd2lkdGggJWQgcHRyICVwS1xuIiwKIAkJICAgY3R4LT5kZWYuY2hhbi0+Y2VudGVyX2ZyZXEsIGN0eC0+ZGVmLndpZHRoLCBjdHgpOwogCiAJbXV0ZXhfbG9jaygmYXItPmNvbmZfbXV0ZXgpOwpAQCAtNzE1OCw3ICs3MTk2LDcgQEAKIAlzdHJ1Y3QgYXRoMTBrICphciA9IGh3LT5wcml2OwogCiAJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19NQUMsCi0JCSAgICJtYWMgY2hhbmN0eCByZW1vdmUgZnJlcSAlaHUgd2lkdGggJWQgcHRyICVwXG4iLAorCQkgICAibWFjIGNoYW5jdHggcmVtb3ZlIGZyZXEgJWh1IHdpZHRoICVkIHB0ciAlcEtcbiIsCiAJCSAgIGN0eC0+ZGVmLmNoYW4tPmNlbnRlcl9mcmVxLCBjdHgtPmRlZi53aWR0aCwgY3R4KTsKIAogCW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsKQEAgLTcyMjMsNyArNzI2MSw3IEBACiAJbXV0ZXhfbG9jaygmYXItPmNvbmZfbXV0ZXgpOwogCiAJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19NQUMsCi0JCSAgICJtYWMgY2hhbmN0eCBjaGFuZ2UgZnJlcSAlaHUgd2lkdGggJWQgcHRyICVwIGNoYW5nZWQgJXhcbiIsCisJCSAgICJtYWMgY2hhbmN0eCBjaGFuZ2UgZnJlcSAlaHUgd2lkdGggJWQgcHRyICVwSyBjaGFuZ2VkICV4XG4iLAogCQkgICBjdHgtPmRlZi5jaGFuLT5jZW50ZXJfZnJlcSwgY3R4LT5kZWYud2lkdGgsIGN0eCwgY2hhbmdlZCk7CiAKIAkvKiBUaGlzIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuIGJlY2F1c2UgY2hhbm5lbCBzd2l0Y2hpbmcgc2hvdWxkIHVzZQpAQCAtNzI4MSw3ICs3MzE5LDcgQEAKIAltdXRleF9sb2NrKCZhci0+Y29uZl9tdXRleCk7CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX01BQywKLQkJICAgIm1hYyBjaGFuY3R4IGFzc2lnbiBwdHIgJXAgdmRldl9pZCAlaVxuIiwKKwkJICAgIm1hYyBjaGFuY3R4IGFzc2lnbiBwdHIgJXBLIHZkZXZfaWQgJWlcbiIsCiAJCSAgIGN0eCwgYXJ2aWYtPnZkZXZfaWQpOwogCiAJaWYgKFdBUk5fT04oYXJ2aWYtPmlzX3N0YXJ0ZWQpKSB7CkBAIC03MzQyLDcgKzczODAsNyBAQAogCW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsKIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfTUFDLAotCQkgICAibWFjIGNoYW5jdHggdW5hc3NpZ24gcHRyICVwIHZkZXZfaWQgJWlcbiIsCisJCSAgICJtYWMgY2hhbmN0eCB1bmFzc2lnbiBwdHIgJXBLIHZkZXZfaWQgJWlcbiIsCiAJCSAgIGN0eCwgYXJ2aWYtPnZkZXZfaWQpOwogCiAJV0FSTl9PTighYXJ2aWYtPmlzX3N0YXJ0ZWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9wY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvcGNpLmMKaW5kZXggOWEyMmM0Ny4uMDQ1N2UzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3BjaS5jCkBAIC0xNTA2LDEyICsxNTA2LDEwIEBACiAJYXRoMTBrX2NlX3Blcl9lbmdpbmVfc2VydmljZShhciwgcGlwZSk7CiB9CiAKLXZvaWQgYXRoMTBrX3BjaV9raWxsX3Rhc2tsZXQoc3RydWN0IGF0aDEwayAqYXIpCitzdGF0aWMgdm9pZCBhdGgxMGtfcGNpX3J4X3JldHJ5X3N5bmMoc3RydWN0IGF0aDEwayAqYXIpCiB7CiAJc3RydWN0IGF0aDEwa19wY2kgKmFyX3BjaSA9IGF0aDEwa19wY2lfcHJpdihhcik7CiAKLQl0YXNrbGV0X2tpbGwoJmFyX3BjaS0+aW50cl90cSk7Ci0KIAlkZWxfdGltZXJfc3luYygmYXJfcGNpLT5yeF9wb3N0X3JldHJ5KTsKIH0KIApAQCAtMTU3MCw3ICsxNTY4LDcgQEAKIAkJCQkJCSB1bF9waXBlLCBkbF9waXBlKTsKIH0KIAotc3RhdGljIHZvaWQgYXRoMTBrX3BjaV9pcnFfbXNpX2Z3X21hc2soc3RydWN0IGF0aDEwayAqYXIpCit2b2lkIGF0aDEwa19wY2lfaXJxX21zaV9md19tYXNrKHN0cnVjdCBhdGgxMGsgKmFyKQogewogCXUzMiB2YWw7CiAKQEAgLTE2OTMsMTQgKzE2OTEsMTIgQEAKIHN0YXRpYyB2b2lkIGF0aDEwa19wY2lfdHhfcGlwZV9jbGVhbnVwKHN0cnVjdCBhdGgxMGtfcGNpX3BpcGUgKnBjaV9waXBlKQogewogCXN0cnVjdCBhdGgxMGsgKmFyOwotCXN0cnVjdCBhdGgxMGtfcGNpICphcl9wY2k7CiAJc3RydWN0IGF0aDEwa19jZV9waXBlICpjZV9waXBlOwogCXN0cnVjdCBhdGgxMGtfY2VfcmluZyAqY2VfcmluZzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBpOwogCiAJYXIgPSBwY2lfcGlwZS0+aGlmX2NlX3N0YXRlOwotCWFyX3BjaSA9IGF0aDEwa19wY2lfcHJpdihhcik7CiAJY2VfcGlwZSA9IHBjaV9waXBlLT5jZV9oZGw7CiAJY2VfcmluZyA9IGNlX3BpcGUtPnNyY19yaW5nOwogCkBAIC0xNzUzLDcgKzE3NDksNyBAQAogCiB2b2lkIGF0aDEwa19wY2lfZmx1c2goc3RydWN0IGF0aDEwayAqYXIpCiB7Ci0JYXRoMTBrX3BjaV9raWxsX3Rhc2tsZXQoYXIpOworCWF0aDEwa19wY2lfcnhfcmV0cnlfc3luYyhhcik7CiAJYXRoMTBrX3BjaV9idWZmZXJfY2xlYW51cChhcik7CiB9CiAKQEAgLTE3ODAsNiArMTc3Niw4IEBACiAJYXRoMTBrX3BjaV9pcnFfZGlzYWJsZShhcik7CiAJYXRoMTBrX3BjaV9pcnFfc3luYyhhcik7CiAJYXRoMTBrX3BjaV9mbHVzaChhcik7CisJbmFwaV9zeW5jaHJvbml6ZSgmYXItPm5hcGkpOworCW5hcGlfZGlzYWJsZSgmYXItPm5hcGkpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFyX3BjaS0+cHNfbG9jaywgZmxhZ3MpOwogCVdBUk5fT04oYXJfcGNpLT5wc193YWtlX3JlZmNvdW50ID4gMCk7CkBAIC0yNTMzLDYgKzI1MzEsNyBAQAogCQlhdGgxMGtfZXJyKGFyLCAiY291bGQgbm90IHdha2UgdXAgdGFyZ2V0IENQVTogJWRcbiIsIHJldCk7CiAJCWdvdG8gZXJyX2NlOwogCX0KKwluYXBpX2VuYWJsZSgmYXItPm5hcGkpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTI3MjUsNyArMjcyNCw3IEBACiAJcmV0dXJuIDA7CiAKIGVycl9mcmVlOgotCWtmcmVlKGRhdGEpOworCWtmcmVlKGNhbGRhdGEpOwogCiAJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC0yNzcyLDM1ICsyNzcxLDUzIEBACiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKLQlpZiAoYXJfcGNpLT5vcGVyX2lycV9tb2RlID09IEFUSDEwS19QQ0lfSVJRX0xFR0FDWSkgewotCQlpZiAoIWF0aDEwa19wY2lfaXJxX3BlbmRpbmcoYXIpKQotCQkJcmV0dXJuIElSUV9OT05FOworCWlmICgoYXJfcGNpLT5vcGVyX2lycV9tb2RlID09IEFUSDEwS19QQ0lfSVJRX0xFR0FDWSkgJiYKKwkgICAgIWF0aDEwa19wY2lfaXJxX3BlbmRpbmcoYXIpKQorCQlyZXR1cm4gSVJRX05PTkU7CiAKLQkJYXRoMTBrX3BjaV9kaXNhYmxlX2FuZF9jbGVhcl9sZWdhY3lfaXJxKGFyKTsKLQl9Ci0KLQl0YXNrbGV0X3NjaGVkdWxlKCZhcl9wY2ktPmludHJfdHEpOworCWF0aDEwa19wY2lfZGlzYWJsZV9hbmRfY2xlYXJfbGVnYWN5X2lycShhcik7CisJYXRoMTBrX3BjaV9pcnFfbXNpX2Z3X21hc2soYXIpOworCW5hcGlfc2NoZWR1bGUoJmFyLT5uYXBpKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHZvaWQgYXRoMTBrX3BjaV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyBpbnQgYXRoMTBrX3BjaV9uYXBpX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpjdHgsIGludCBidWRnZXQpCiB7Ci0Jc3RydWN0IGF0aDEwayAqYXIgPSAoc3RydWN0IGF0aDEwayAqKWRhdGE7Ci0Jc3RydWN0IGF0aDEwa19wY2kgKmFyX3BjaSA9IGF0aDEwa19wY2lfcHJpdihhcik7CisJc3RydWN0IGF0aDEwayAqYXIgPSBjb250YWluZXJfb2YoY3R4LCBzdHJ1Y3QgYXRoMTBrLCBuYXBpKTsKKwlpbnQgZG9uZSA9IDA7CiAKIAlpZiAoYXRoMTBrX3BjaV9oYXNfZndfY3Jhc2hlZChhcikpIHsKLQkJYXRoMTBrX3BjaV9pcnFfZGlzYWJsZShhcik7CiAJCWF0aDEwa19wY2lfZndfY3Jhc2hlZF9jbGVhcihhcik7CiAJCWF0aDEwa19wY2lfZndfY3Jhc2hlZF9kdW1wKGFyKTsKLQkJcmV0dXJuOworCQluYXBpX2NvbXBsZXRlKGN0eCk7CisJCXJldHVybiBkb25lOwogCX0KIAogCWF0aDEwa19jZV9wZXJfZW5naW5lX3NlcnZpY2VfYW55KGFyKTsKIAotCS8qIFJlLWVuYWJsZSBsZWdhY3kgaXJxIHRoYXQgd2FzIGRpc2FibGVkIGluIHRoZSBpcnEgaGFuZGxlciAqLwotCWlmIChhcl9wY2ktPm9wZXJfaXJxX21vZGUgPT0gQVRIMTBLX1BDSV9JUlFfTEVHQUNZKQorCWRvbmUgPSBhdGgxMGtfaHR0X3R4cnhfY29tcGxfdGFzayhhciwgYnVkZ2V0KTsKKworCWlmIChkb25lIDwgYnVkZ2V0KSB7CisJCW5hcGlfY29tcGxldGUoY3R4KTsKKwkJLyogSW4gY2FzZSBvZiBNU0ksIGl0IGlzIHBvc3NpYmxlIHRoYXQgaW50ZXJydXB0cyBhcmUgcmVjZWl2ZWQKKwkJICogd2hpbGUgTkFQSSBwb2xsIGlzIGlucHJvZ3Jlc3MuIFNvIHBlbmRpbmcgaW50ZXJydXB0cyB0aGF0IGFyZQorCQkgKiByZWNlaXZlZCBhZnRlciBwcm9jZXNzaW5nIGFsbCBjb3B5IGVuZ2luZSBwaXBlcyBieSBOQVBJIHBvbGwKKwkJICogd2lsbCBub3QgYmUgaGFuZGxlZCBhZ2Fpbi4gVGhpcyBpcyBjYXVzaW5nIGZhaWx1cmUgdG8KKwkJICogY29tcGxldGUgYm9vdCBzZXF1ZW5jZSBpbiB4ODYgcGxhdGZvcm0uIFNvIGJlZm9yZSBlbmFibGluZworCQkgKiBpbnRlcnJ1cHRzIHNhZmVyIHRvIGNoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdHMgZm9yCisJCSAqIGltbWVkaWF0ZSBzZXJ2aWNpbmcuCisJCSAqLworCQlpZiAoQ0VfSU5URVJSVVBUX1NVTU1BUlkoYXIpKSB7CisJCQluYXBpX3Jlc2NoZWR1bGUoY3R4KTsKKwkJCWdvdG8gb3V0OworCQl9CiAJCWF0aDEwa19wY2lfZW5hYmxlX2xlZ2FjeV9pcnEoYXIpOworCQlhdGgxMGtfcGNpX2lycV9tc2lfZndfdW5tYXNrKGFyKTsKKwl9CisKK291dDoKKwlyZXR1cm4gZG9uZTsKIH0KIAogc3RhdGljIGludCBhdGgxMGtfcGNpX3JlcXVlc3RfaXJxX21zaShzdHJ1Y3QgYXRoMTBrICphcikKQEAgLTI4NTgsMTEgKzI4NzUsMTAgQEAKIAlmcmVlX2lycShhcl9wY2ktPnBkZXYtPmlycSwgYXIpOwogfQogCi12b2lkIGF0aDEwa19wY2lfaW5pdF9pcnFfdGFza2xldHMoc3RydWN0IGF0aDEwayAqYXIpCit2b2lkIGF0aDEwa19wY2lfaW5pdF9uYXBpKHN0cnVjdCBhdGgxMGsgKmFyKQogewotCXN0cnVjdCBhdGgxMGtfcGNpICphcl9wY2kgPSBhdGgxMGtfcGNpX3ByaXYoYXIpOwotCi0JdGFza2xldF9pbml0KCZhcl9wY2ktPmludHJfdHEsIGF0aDEwa19wY2lfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpYXIpOworCW5ldGlmX25hcGlfYWRkKCZhci0+bmFwaV9kZXYsICZhci0+bmFwaSwgYXRoMTBrX3BjaV9uYXBpX3BvbGwsCisJCSAgICAgICBBVEgxMEtfTkFQSV9CVURHRVQpOwogfQogCiBzdGF0aWMgaW50IGF0aDEwa19wY2lfaW5pdF9pcnEoc3RydWN0IGF0aDEwayAqYXIpCkBAIC0yODcwLDcgKzI4ODYsNyBAQAogCXN0cnVjdCBhdGgxMGtfcGNpICphcl9wY2kgPSBhdGgxMGtfcGNpX3ByaXYoYXIpOwogCWludCByZXQ7CiAKLQlhdGgxMGtfcGNpX2luaXRfaXJxX3Rhc2tsZXRzKGFyKTsKKwlhdGgxMGtfcGNpX2luaXRfbmFwaShhcik7CiAKIAlpZiAoYXRoMTBrX3BjaV9pcnFfbW9kZSAhPSBBVEgxMEtfUENJX0lSUV9BVVRPKQogCQlhdGgxMGtfaW5mbyhhciwgImxpbWl0aW5nIGlycSBtb2RlIHRvOiAlZFxuIiwKQEAgLTMwNjIsNyArMzA3OCw3IEBACiAJCWdvdG8gZXJyX21hc3RlcjsKIAl9CiAKLQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0JPT1QsICJib290IHBjaV9tZW0gMHglcFxuIiwgYXJfcGNpLT5tZW0pOworCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk9PVCwgImJvb3QgcGNpX21lbSAweCVwS1xuIiwgYXJfcGNpLT5tZW0pOwogCXJldHVybiAwOwogCiBlcnJfbWFzdGVyOgpAQCAtMzEzMSw3ICszMTQ3LDggQEAKIAogdm9pZCBhdGgxMGtfcGNpX3JlbGVhc2VfcmVzb3VyY2Uoc3RydWN0IGF0aDEwayAqYXIpCiB7Ci0JYXRoMTBrX3BjaV9raWxsX3Rhc2tsZXQoYXIpOworCWF0aDEwa19wY2lfcnhfcmV0cnlfc3luYyhhcik7CisJbmV0aWZfbmFwaV9kZWwoJmFyLT5uYXBpKTsKIAlhdGgxMGtfcGNpX2NlX2RlaW5pdChhcik7CiAJYXRoMTBrX3BjaV9mcmVlX3BpcGVzKGFyKTsKIH0KQEAgLTMxNjIsNyArMzE3OSw2IEBACiAJCXBjaV9oYXJkX3Jlc2V0ID0gYXRoMTBrX3BjaV9xY2E5ODh4X2NoaXBfcmVzZXQ7CiAJCWJyZWFrOwogCWNhc2UgUUNBOTg4N18xXzBfREVWSUNFX0lEOgotCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiUUNBOTg4NyBzdXBwb3J0IGlzIHN0aWxsIGV4cGVyaW1lbnRhbCwgdGhlcmUgYXJlIGxpa2VseSBidWdzLiBZb3UgaGF2ZSBiZWVuIHdhcm5lZC5cbiIpOwogCQlod19yZXYgPSBBVEgxMEtfSFdfUUNBOTg4NzsKIAkJcGNpX3BzID0gZmFsc2U7CiAJCXBjaV9zb2Z0X3Jlc2V0ID0gYXRoMTBrX3BjaV93YXJtX3Jlc2V0OwpAQCAtMzI5OCw3ICszMzE0LDcgQEAKIAogZXJyX2ZyZWVfaXJxOgogCWF0aDEwa19wY2lfZnJlZV9pcnEoYXIpOwotCWF0aDEwa19wY2lfa2lsbF90YXNrbGV0KGFyKTsKKwlhdGgxMGtfcGNpX3J4X3JldHJ5X3N5bmMoYXIpOwogCiBlcnJfZGVpbml0X2lycToKIAlhdGgxMGtfcGNpX2RlaW5pdF9pcnEoYXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9wY2kuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvcGNpLmgKaW5kZXggNmVjYTFkZi4uOTg1NGFkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9wY2kuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3BjaS5oCkBAIC0xNzcsOCArMTc3LDYgQEAKIAkvKiBPcGVyYXRpbmcgaW50ZXJydXB0IG1vZGUgKi8KIAllbnVtIGF0aDEwa19wY2lfaXJxX21vZGUgb3Blcl9pcnFfbW9kZTsKIAotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpbnRyX3RxOwotCiAJc3RydWN0IGF0aDEwa19wY2lfcGlwZSBwaXBlX2luZm9bQ0VfQ09VTlRfTUFYXTsKIAogCS8qIENvcHkgRW5naW5lIHVzZWQgZm9yIERpYWdub3N0aWMgQWNjZXNzZXMgKi8KQEAgLTI5NCw4ICsyOTIsNyBAQAogdm9pZCBhdGgxMGtfcGNpX2ZyZWVfcGlwZXMoc3RydWN0IGF0aDEwayAqYXIpOwogdm9pZCBhdGgxMGtfcGNpX3J4X3JlcGxlbmlzaF9yZXRyeSh1bnNpZ25lZCBsb25nIHB0cik7CiB2b2lkIGF0aDEwa19wY2lfY2VfZGVpbml0KHN0cnVjdCBhdGgxMGsgKmFyKTsKLXZvaWQgYXRoMTBrX3BjaV9pbml0X2lycV90YXNrbGV0cyhzdHJ1Y3QgYXRoMTBrICphcik7Ci12b2lkIGF0aDEwa19wY2lfa2lsbF90YXNrbGV0KHN0cnVjdCBhdGgxMGsgKmFyKTsKK3ZvaWQgYXRoMTBrX3BjaV9pbml0X25hcGkoc3RydWN0IGF0aDEwayAqYXIpOwogaW50IGF0aDEwa19wY2lfaW5pdF9waXBlcyhzdHJ1Y3QgYXRoMTBrICphcik7CiBpbnQgYXRoMTBrX3BjaV9pbml0X2NvbmZpZyhzdHJ1Y3QgYXRoMTBrICphcik7CiB2b2lkIGF0aDEwa19wY2lfcnhfcG9zdChzdHJ1Y3QgYXRoMTBrICphcik7CkBAIC0zMDMsNiArMzAwLDcgQEAKIHZvaWQgYXRoMTBrX3BjaV9lbmFibGVfbGVnYWN5X2lycShzdHJ1Y3QgYXRoMTBrICphcik7CiBib29sIGF0aDEwa19wY2lfaXJxX3BlbmRpbmcoc3RydWN0IGF0aDEwayAqYXIpOwogdm9pZCBhdGgxMGtfcGNpX2Rpc2FibGVfYW5kX2NsZWFyX2xlZ2FjeV9pcnEoc3RydWN0IGF0aDEwayAqYXIpOwordm9pZCBhdGgxMGtfcGNpX2lycV9tc2lfZndfbWFzayhzdHJ1Y3QgYXRoMTBrICphcik7CiBpbnQgYXRoMTBrX3BjaV93YWl0X2Zvcl90YXJnZXRfaW5pdChzdHJ1Y3QgYXRoMTBrICphcik7CiBpbnQgYXRoMTBrX3BjaV9zZXR1cF9yZXNvdXJjZShzdHJ1Y3QgYXRoMTBrICphcik7CiB2b2lkIGF0aDEwa19wY2lfcmVsZWFzZV9yZXNvdXJjZShzdHJ1Y3QgYXRoMTBrICphcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3N3YXAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvc3dhcC5jCmluZGV4IDBjNWY1ODYuLmFkZjQ1OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvc3dhcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvc3dhcC5jCkBAIC0xMzQsMTcgKzEzNCwxOCBAQAogCXJldHVybiBzZWdfaW5mbzsKIH0KIAotaW50IGF0aDEwa19zd2FwX2NvZGVfc2VnX2NvbmZpZ3VyZShzdHJ1Y3QgYXRoMTBrICphcikKK2ludCBhdGgxMGtfc3dhcF9jb2RlX3NlZ19jb25maWd1cmUoc3RydWN0IGF0aDEwayAqYXIsCisJCQkJICAgY29uc3Qgc3RydWN0IGF0aDEwa19md19maWxlICpmd19maWxlKQogewogCWludCByZXQ7CiAJc3RydWN0IGF0aDEwa19zd2FwX2NvZGVfc2VnX2luZm8gKnNlZ19pbmZvID0gTlVMTDsKIAotCWlmICghYXItPnN3YXAuZmlybXdhcmVfc3dhcF9jb2RlX3NlZ19pbmZvKQorCWlmICghZndfZmlsZS0+ZmlybXdhcmVfc3dhcF9jb2RlX3NlZ19pbmZvKQogCQlyZXR1cm4gMDsKIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk9PVCwgImJvb3QgZm91bmQgZmlybXdhcmUgY29kZSBzd2FwIGJpbmFyeVxuIik7CiAKLQlzZWdfaW5mbyA9IGFyLT5zd2FwLmZpcm13YXJlX3N3YXBfY29kZV9zZWdfaW5mbzsKKwlzZWdfaW5mbyA9IGZ3X2ZpbGUtPmZpcm13YXJlX3N3YXBfY29kZV9zZWdfaW5mbzsKIAogCXJldCA9IGF0aDEwa19ibWlfd3JpdGVfbWVtb3J5KGFyLCBzZWdfaW5mby0+dGFyZ2V0X2FkZHIsCiAJCQkJICAgICAgJnNlZ19pbmZvLT5zZWdfaHdfaW5mbywKQEAgLTE1OCwyOCArMTU5LDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgYXRoMTBrX3N3YXBfY29kZV9zZWdfcmVsZWFzZShzdHJ1Y3QgYXRoMTBrICphcikKK3ZvaWQgYXRoMTBrX3N3YXBfY29kZV9zZWdfcmVsZWFzZShzdHJ1Y3QgYXRoMTBrICphciwKKwkJCQkgIHN0cnVjdCBhdGgxMGtfZndfZmlsZSAqZndfZmlsZSkKIHsKLQlhdGgxMGtfc3dhcF9jb2RlX3NlZ19mcmVlKGFyLCBhci0+c3dhcC5maXJtd2FyZV9zd2FwX2NvZGVfc2VnX2luZm8pOworCWF0aDEwa19zd2FwX2NvZGVfc2VnX2ZyZWUoYXIsIGZ3X2ZpbGUtPmZpcm13YXJlX3N3YXBfY29kZV9zZWdfaW5mbyk7CiAKIAkvKiBGSVhNRTogdGhlc2UgdHdvIGFzc2lnbm1lbnRzIGxvb2sgdG8gYmVpbiB3cm9uZyBwbGFjZSEgU2hvdWxkbid0CiAJICogdGhleSBiZSBpbiBhdGgxMGtfY29yZV9mcmVlX2Zpcm13YXJlX2ZpbGVzKCkgbGlrZSB0aGUgcmVzdD8KIAkgKi8KLQlhci0+bm9ybWFsX21vZGVfZncuZndfZmlsZS5jb2Rlc3dhcF9kYXRhID0gTlVMTDsKLQlhci0+bm9ybWFsX21vZGVfZncuZndfZmlsZS5jb2Rlc3dhcF9sZW4gPSAwOworCWZ3X2ZpbGUtPmNvZGVzd2FwX2RhdGEgPSBOVUxMOworCWZ3X2ZpbGUtPmNvZGVzd2FwX2xlbiA9IDA7CiAKLQlhci0+c3dhcC5maXJtd2FyZV9zd2FwX2NvZGVfc2VnX2luZm8gPSBOVUxMOworCWZ3X2ZpbGUtPmZpcm13YXJlX3N3YXBfY29kZV9zZWdfaW5mbyA9IE5VTEw7CiB9CiAKLWludCBhdGgxMGtfc3dhcF9jb2RlX3NlZ19pbml0KHN0cnVjdCBhdGgxMGsgKmFyKQoraW50IGF0aDEwa19zd2FwX2NvZGVfc2VnX2luaXQoc3RydWN0IGF0aDEwayAqYXIsIHN0cnVjdCBhdGgxMGtfZndfZmlsZSAqZndfZmlsZSkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBhdGgxMGtfc3dhcF9jb2RlX3NlZ19pbmZvICpzZWdfaW5mbzsKIAljb25zdCB2b2lkICpjb2Rlc3dhcF9kYXRhOwogCXNpemVfdCBjb2Rlc3dhcF9sZW47CiAKLQljb2Rlc3dhcF9kYXRhID0gYXItPm5vcm1hbF9tb2RlX2Z3LmZ3X2ZpbGUuY29kZXN3YXBfZGF0YTsKLQljb2Rlc3dhcF9sZW4gPSBhci0+bm9ybWFsX21vZGVfZncuZndfZmlsZS5jb2Rlc3dhcF9sZW47CisJY29kZXN3YXBfZGF0YSA9IGZ3X2ZpbGUtPmNvZGVzd2FwX2RhdGE7CisJY29kZXN3YXBfbGVuID0gZndfZmlsZS0+Y29kZXN3YXBfbGVuOwogCiAJaWYgKCFjb2Rlc3dhcF9sZW4gfHwgIWNvZGVzd2FwX2RhdGEpCiAJCXJldHVybiAwOwpAQCAtMjAwLDcgKzIwMiw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JYXItPnN3YXAuZmlybXdhcmVfc3dhcF9jb2RlX3NlZ19pbmZvID0gc2VnX2luZm87CisJZndfZmlsZS0+ZmlybXdhcmVfc3dhcF9jb2RlX3NlZ19pbmZvID0gc2VnX2luZm87CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvc3dhcC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9zd2FwLmgKaW5kZXggMzY5OTFjNy4uZjVkYzA0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9zd2FwLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9zd2FwLmgKQEAgLTIzLDYgKzIzLDggQEAKIC8qIEN1cnJlbnRseSBvbmx5IG9uZSBzd2FwIHNlZ21lbnQgaXMgc3VwcG9ydGVkICovCiAjZGVmaW5lIEFUSDEwS19TV0FQX0NPREVfU0VHX05VTV9TVVBQT1JURUQJMQogCitzdHJ1Y3QgYXRoMTBrX2Z3X2ZpbGU7CisKIHN0cnVjdCBhdGgxMGtfc3dhcF9jb2RlX3NlZ190bHYgewogCV9fbGUzMiBhZGRyZXNzOwogCV9fbGUzMiBsZW5ndGg7CkBAIC01OCw4ICs2MCwxMSBAQAogCWRtYV9hZGRyX3QgcGFkZHJbQVRIMTBLX1NXQVBfQ09ERV9TRUdfTlVNX1NVUFBPUlRFRF07CiB9OwogCi1pbnQgYXRoMTBrX3N3YXBfY29kZV9zZWdfY29uZmlndXJlKHN0cnVjdCBhdGgxMGsgKmFyKTsKLXZvaWQgYXRoMTBrX3N3YXBfY29kZV9zZWdfcmVsZWFzZShzdHJ1Y3QgYXRoMTBrICphcik7Ci1pbnQgYXRoMTBrX3N3YXBfY29kZV9zZWdfaW5pdChzdHJ1Y3QgYXRoMTBrICphcik7CitpbnQgYXRoMTBrX3N3YXBfY29kZV9zZWdfY29uZmlndXJlKHN0cnVjdCBhdGgxMGsgKmFyLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBhdGgxMGtfZndfZmlsZSAqZndfZmlsZSk7Cit2b2lkIGF0aDEwa19zd2FwX2NvZGVfc2VnX3JlbGVhc2Uoc3RydWN0IGF0aDEwayAqYXIsCisJCQkJICBzdHJ1Y3QgYXRoMTBrX2Z3X2ZpbGUgKmZ3X2ZpbGUpOworaW50IGF0aDEwa19zd2FwX2NvZGVfc2VnX2luaXQoc3RydWN0IGF0aDEwayAqYXIsCisJCQkgICAgICBzdHJ1Y3QgYXRoMTBrX2Z3X2ZpbGUgKmZ3X2ZpbGUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdGFyZ2FkZHJzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3RhcmdhZGRycy5oCmluZGV4IGFhZjUzYTguLmE0N2NhYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdGFyZ2FkZHJzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway90YXJnYWRkcnMuaApAQCAtNDA1LDcgKzQwNSw3IEBACiAgKiAxLiB0YXJnZXQgZmlybXdhcmUgd291bGQgY2hlY2sgbWFnaWMgbnVtYmVyIGFuZCBpZiBpdCdzIGEgbWF0Y2gsIGZpcm13YXJlCiAgKiAgICB3b3VsZCBjb25zaWRlciB0aGUgYml0c1swOjE1XSBhcmUgdmFsaWQgYW5kIGJhc2Ugb24gdGhhdCB0byBjYWxjdWxhdGUKICAqICAgIHRoZSBlbmQgb2YgRFJBTS4gRWFybHkgYWxsb2NhdGlvbiB3b3VsZCBiZSBsb2NhdGVkIGF0IHRoYXQgYXJlYSBhbmQKLSAqICAgIG1heSBiZSByZWNsYWltZWQgd2hlbiBuZWNlc2FyeQorICogICAgbWF5IGJlIHJlY2xhaW1lZCB3aGVuIG5lY2Vzc2FyeQogICogMi4gaWYgbm8gbWFnaWMgbnVtYmVyIGlzIGZvdW5kLCBlYXJseSBhbGxvY2F0aW9uIHdvdWxkIGhhcHBlbiBhdCAiX2VuZCIKICAqICAgIHN5bWJvbCBvZiBST00gd2hpY2ggaXMgbG9jYXRlZCBiZWZvcmUgdGhlIGFwcC1kYXRhIGFuZCBtaWdodCBOT1QgYmUKICAqICAgIHJlLWNsYWltYWJsZS4gSWYgdGhpcyBpcyBhZG9wdGVkLCBsaW5rIHNjcmlwdCBzaG91bGQga2VlcCB0aGlzIGluCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3Rlc3Rtb2RlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3Rlc3Rtb2RlLmMKaW5kZXggMTIwZjQyMy4uZWQ4NWY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway90ZXN0bW9kZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdGVzdG1vZGUuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgIndtaS5oIgogI2luY2x1ZGUgImhpZi5oIgogI2luY2x1ZGUgImh3LmgiCisjaW5jbHVkZSAiY29yZS5oIgogCiAjaW5jbHVkZSAidGVzdG1vZGVfaS5oIgogCkBAIC00NSw3ICs0Niw3IEBACiAJaW50IHJldDsKIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfVEVTVE1PREUsCi0JCSAgICJ0ZXN0bW9kZSBldmVudCB3bWkgY21kX2lkICVkIHNrYiAlcCBza2ItPmxlbiAlZFxuIiwKKwkJICAgInRlc3Rtb2RlIGV2ZW50IHdtaSBjbWRfaWQgJWQgc2tiICVwSyBza2ItPmxlbiAlZFxuIiwKIAkJICAgY21kX2lkLCBza2IsIHNrYi0+bGVuKTsKIAogCWF0aDEwa19kYmdfZHVtcChhciwgQVRIMTBLX0RCR19URVNUTU9ERSwgTlVMTCwgIiIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwpAQCAtMjQwLDYgKzI0MSwxOCBAQAogCQlnb3RvIGVycjsKIAl9CiAKKwlpZiAoYXItPnRlc3Rtb2RlLnV0Zl9tb2RlX2Z3LmZ3X2ZpbGUuY29kZXN3YXBfZGF0YSAmJgorCSAgICBhci0+dGVzdG1vZGUudXRmX21vZGVfZncuZndfZmlsZS5jb2Rlc3dhcF9sZW4pIHsKKwkJcmV0ID0gYXRoMTBrX3N3YXBfY29kZV9zZWdfaW5pdChhciwKKwkJCQkJCSZhci0+dGVzdG1vZGUudXRmX21vZGVfZncuZndfZmlsZSk7CisJCWlmIChyZXQpIHsKKwkJCWF0aDEwa193YXJuKGFyLAorCQkJCSAgICAiZmFpbGVkIHRvIGluaXQgdXRmIGNvZGUgc3dhcCBzZWdtZW50OiAlZFxuIiwKKwkJCQkgICAgcmV0KTsKKwkJCWdvdG8gZXJyX3JlbGVhc2VfdXRmX21vZGVfZnc7CisJCX0KKwl9CisKIAlzcGluX2xvY2tfYmgoJmFyLT5kYXRhX2xvY2spOwogCWFyLT50ZXN0bW9kZS51dGZfbW9uaXRvciA9IHRydWU7CiAJc3Bpbl91bmxvY2tfYmgoJmFyLT5kYXRhX2xvY2spOwpAQCAtMjc5LDYgKzI5MiwxMSBAQAogCWF0aDEwa19oaWZfcG93ZXJfZG93bihhcik7CiAKIGVycl9yZWxlYXNlX3V0Zl9tb2RlX2Z3OgorCWlmIChhci0+dGVzdG1vZGUudXRmX21vZGVfZncuZndfZmlsZS5jb2Rlc3dhcF9kYXRhICYmCisJICAgIGFyLT50ZXN0bW9kZS51dGZfbW9kZV9mdy5md19maWxlLmNvZGVzd2FwX2xlbikKKwkJYXRoMTBrX3N3YXBfY29kZV9zZWdfcmVsZWFzZShhciwKKwkJCQkJICAgICAmYXItPnRlc3Rtb2RlLnV0Zl9tb2RlX2Z3LmZ3X2ZpbGUpOworCiAJcmVsZWFzZV9maXJtd2FyZShhci0+dGVzdG1vZGUudXRmX21vZGVfZncuZndfZmlsZS5maXJtd2FyZSk7CiAJYXItPnRlc3Rtb2RlLnV0Zl9tb2RlX2Z3LmZ3X2ZpbGUuZmlybXdhcmUgPSBOVUxMOwogCkBAIC0zMDEsNiArMzE5LDExIEBACiAKIAlzcGluX3VubG9ja19iaCgmYXItPmRhdGFfbG9jayk7CiAKKwlpZiAoYXItPnRlc3Rtb2RlLnV0Zl9tb2RlX2Z3LmZ3X2ZpbGUuY29kZXN3YXBfZGF0YSAmJgorCSAgICBhci0+dGVzdG1vZGUudXRmX21vZGVfZncuZndfZmlsZS5jb2Rlc3dhcF9sZW4pCisJCWF0aDEwa19zd2FwX2NvZGVfc2VnX3JlbGVhc2UoYXIsCisJCQkJCSAgICAgJmFyLT50ZXN0bW9kZS51dGZfbW9kZV9mdy5md19maWxlKTsKKwogCXJlbGVhc2VfZmlybXdhcmUoYXItPnRlc3Rtb2RlLnV0Zl9tb2RlX2Z3LmZ3X2ZpbGUuZmlybXdhcmUpOwogCWFyLT50ZXN0bW9kZS51dGZfbW9kZV9mdy5md19maWxlLmZpcm13YXJlID0gTlVMTDsKIApAQCAtMzYwLDcgKzM4Myw3IEBACiAJY21kX2lkID0gbmxhX2dldF91MzIodGJbQVRIMTBLX1RNX0FUVFJfV01JX0NNRElEXSk7CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX1RFU1RNT0RFLAotCQkgICAidGVzdG1vZGUgY21kIHdtaSBjbWRfaWQgJWQgYnVmICVwIGJ1Zl9sZW4gJWRcbiIsCisJCSAgICJ0ZXN0bW9kZSBjbWQgd21pIGNtZF9pZCAlZCBidWYgJXBLIGJ1Zl9sZW4gJWRcbiIsCiAJCSAgIGNtZF9pZCwgYnVmLCBidWZfbGVuKTsKIAogCWF0aDEwa19kYmdfZHVtcChhciwgQVRIMTBLX0RCR19URVNUTU9ERSwgTlVMTCwgIiIsIGJ1ZiwgYnVmX2xlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3RoZXJtYWwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdGhlcm1hbC5jCmluZGV4IDQ0NGI1MmMuLjBhNDcyNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdGhlcm1hbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdGhlcm1hbC5jCkBAIC0xOTIsNyArMTkyLDcgQEAKIAogCS8qIEF2b2lkIGxpbmtpbmcgZXJyb3Igb24gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMsIEkKIAkgKiBndWVzcyBsaW51eC9od21vbi5oIGlzIG1pc3NpbmcgcHJvcGVyIHN0dWJzLiAqLwotCWlmICghY29uZmlnX2VuYWJsZWQoQ09ORklHX0hXTU9OKSkKKwlpZiAoIUlTX1JFQUNIQUJMRShDT05GSUdfSFdNT04pKQogCQlyZXR1cm4gMDsKIAogCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGFyLT5kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3R4cnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdHhyeC5jCmluZGV4IGIyOWE4NmEuLjk4NTJjNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdHhyeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdHhyeC5jCkBAIC00NCw3ICs0NCw3IEBACiAJY29tcGxldGUoJmFyLT5vZmZjaGFuX3R4X2NvbXBsZXRlZCk7CiAJYXItPm9mZmNoYW5fdHhfc2tiID0gTlVMTDsgLyoganVzdCBmb3Igc2FuaXR5ICovCiAKLQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0hUVCwgImNvbXBsZXRlZCBvZmZjaGFubmVsIHNrYiAlcFxuIiwgc2tiKTsKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0hUVCwgImNvbXBsZXRlZCBvZmZjaGFubmVsIHNrYiAlcEtcbiIsIHNrYik7CiBvdXQ6CiAJc3Bpbl91bmxvY2tfYmgoJmFyLT5kYXRhX2xvY2spOwogfQpAQCAtMTE5LDggKzExOSw2IEBACiAJaWVlZTgwMjExX3R4X3N0YXR1cyhodHQtPmFyLT5odywgbXNkdSk7CiAJLyogd2UgZG8gbm90IG93biB0aGUgbXNkdSBhbnltb3JlICovCiAKLQlhdGgxMGtfbWFjX3R4X3B1c2hfcGVuZGluZyhhcik7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWktb3BzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS1vcHMuaAppbmRleCA2NGViZDMwLi5jOWE4YmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS1vcHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS1vcHMuaApAQCAtNTEsNiArNTEsOCBAQAogCQkJICAgIHN0cnVjdCB3bWlfcm9hbV9ldl9hcmcgKmFyZyk7CiAJaW50ICgqcHVsbF93b3dfZXZlbnQpKHN0cnVjdCBhdGgxMGsgKmFyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgc3RydWN0IHdtaV93b3dfZXZfYXJnICphcmcpOworCWludCAoKnB1bGxfZWNob19ldikoc3RydWN0IGF0aDEwayAqYXIsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgc3RydWN0IHdtaV9lY2hvX2V2X2FyZyAqYXJnKTsKIAllbnVtIHdtaV90eGJmX2NvbmYgKCpnZXRfdHhiZl9jb25mX3NjaGVtZSkoc3RydWN0IGF0aDEwayAqYXIpOwogCiAJc3RydWN0IHNrX2J1ZmYgKigqZ2VuX3BkZXZfc3VzcGVuZCkoc3RydWN0IGF0aDEwayAqYXIsIHUzMiBzdXNwZW5kX29wdCk7CkBAIC0xMjMsNyArMTI1LDcgQEAKIAkJCQkJICAgICBlbnVtIHdtaV9mb3JjZV9md19oYW5nX3R5cGUgdHlwZSwKIAkJCQkJICAgICB1MzIgZGVsYXlfbXMpOwogCXN0cnVjdCBza19idWZmICooKmdlbl9tZ210X3R4KShzdHJ1Y3QgYXRoMTBrICphciwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0Jc3RydWN0IHNrX2J1ZmYgKigqZ2VuX2RiZ2xvZ19jZmcpKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgbW9kdWxlX2VuYWJsZSwKKwlzdHJ1Y3Qgc2tfYnVmZiAqKCpnZW5fZGJnbG9nX2NmZykoc3RydWN0IGF0aDEwayAqYXIsIHU2NCBtb2R1bGVfZW5hYmxlLAogCQkJCQkgIHUzMiBsb2dfbGV2ZWwpOwogCXN0cnVjdCBza19idWZmICooKmdlbl9wa3Rsb2dfZW5hYmxlKShzdHJ1Y3QgYXRoMTBrICphciwgdTMyIGZpbHRlcik7CiAJc3RydWN0IHNrX2J1ZmYgKigqZ2VuX3BrdGxvZ19kaXNhYmxlKShzdHJ1Y3QgYXRoMTBrICphcik7CkBAIC0xOTQsNiArMTk2LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqKCpnZW5fcGRldl9ic3NfY2hhbl9pbmZvX3JlcSkKIAkJCQkJKHN0cnVjdCBhdGgxMGsgKmFyLAogCQkJCQkgZW51bSB3bWlfYnNzX3N1cnZleV9yZXFfdHlwZSB0eXBlKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqKCpnZW5fZWNobykoc3RydWN0IGF0aDEwayAqYXIsIHUzMiB2YWx1ZSk7CiB9OwogCiBpbnQgYXRoMTBrX3dtaV9jbWRfc2VuZChzdHJ1Y3QgYXRoMTBrICphciwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGNtZF9pZCk7CkBAIC0zNDksNiArMzUyLDE2IEBACiAJcmV0dXJuIGFyLT53bWkub3BzLT5wdWxsX3dvd19ldmVudChhciwgc2tiLCBhcmcpOwogfQogCitzdGF0aWMgaW5saW5lIGludAorYXRoMTBrX3dtaV9wdWxsX2VjaG9fZXYoc3RydWN0IGF0aDEwayAqYXIsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3Qgd21pX2VjaG9fZXZfYXJnICphcmcpCit7CisJaWYgKCFhci0+d21pLm9wcy0+cHVsbF9lY2hvX2V2KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gYXItPndtaS5vcHMtPnB1bGxfZWNob19ldihhciwgc2tiLCBhcmcpOworfQorCiBzdGF0aWMgaW5saW5lIGVudW0gd21pX3R4YmZfY29uZgogYXRoMTBrX3dtaV9nZXRfdHhiZl9jb25mX3NjaGVtZShzdHJ1Y3QgYXRoMTBrICphcikKIHsKQEAgLTkzMiw3ICs5NDUsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludAotYXRoMTBrX3dtaV9kYmdsb2dfY2ZnKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgbW9kdWxlX2VuYWJsZSwgdTMyIGxvZ19sZXZlbCkKK2F0aDEwa193bWlfZGJnbG9nX2NmZyhzdHJ1Y3QgYXRoMTBrICphciwgdTY0IG1vZHVsZV9lbmFibGUsIHUzMiBsb2dfbGV2ZWwpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIApAQCAtMTM4Miw0ICsxMzk1LDIwIEBACiAJCQkJICAgd21pLT5jbWQtPnBkZXZfYnNzX2NoYW5faW5mb19yZXF1ZXN0X2NtZGlkKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK2F0aDEwa193bWlfZWNobyhzdHJ1Y3QgYXRoMTBrICphciwgdTMyIHZhbHVlKQoreworCXN0cnVjdCBhdGgxMGtfd21pICp3bWkgPSAmYXItPndtaTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJaWYgKCF3bWktPm9wcy0+Z2VuX2VjaG8pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXNrYiA9IHdtaS0+b3BzLT5nZW5fZWNobyhhciwgdmFsdWUpOworCWlmIChJU19FUlIoc2tiKSkKKwkJcmV0dXJuIFBUUl9FUlIoc2tiKTsKKworCXJldHVybiBhdGgxMGtfd21pX2NtZF9zZW5kKGFyLCBza2IsIHdtaS0+Y21kLT5lY2hvX2NtZGlkKTsKK30KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS10bHYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLXRsdi5jCmluZGV4IGUwOTMzN2UuLmU2NGY1OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLXRsdi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLXRsdi5jCkBAIC0xMjIzLDYgKzEyMjMsMzMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhdGgxMGtfd21pX3Rsdl9vcF9wdWxsX2VjaG9fZXYoc3RydWN0IGF0aDEwayAqYXIsCisJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICBzdHJ1Y3Qgd21pX2VjaG9fZXZfYXJnICphcmcpCit7CisJY29uc3Qgdm9pZCAqKnRiOworCWNvbnN0IHN0cnVjdCB3bWlfZWNob19ldmVudCAqZXY7CisJaW50IHJldDsKKworCXRiID0gYXRoMTBrX3dtaV90bHZfcGFyc2VfYWxsb2MoYXIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIEdGUF9BVE9NSUMpOworCWlmIChJU19FUlIodGIpKSB7CisJCXJldCA9IFBUUl9FUlIodGIpOworCQlhdGgxMGtfd2FybihhciwgImZhaWxlZCB0byBwYXJzZSB0bHY6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWV2ID0gdGJbV01JX1RMVl9UQUdfU1RSVUNUX0VDSE9fRVZFTlRdOworCWlmICghZXYpIHsKKwkJa2ZyZWUodGIpOworCQlyZXR1cm4gLUVQUk9UTzsKKwl9CisKKwlhcmctPnZhbHVlID0gZXYtPnZhbHVlOworCisJa2ZyZWUodGIpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgogYXRoMTBrX3dtaV90bHZfb3BfZ2VuX3BkZXZfc3VzcGVuZChzdHJ1Y3QgYXRoMTBrICphciwgdTMyIG9wdCkKIHsKQEAgLTI0NDEsNyArMjQ2OCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCi1hdGgxMGtfd21pX3Rsdl9vcF9nZW5fZGJnbG9nX2NmZyhzdHJ1Y3QgYXRoMTBrICphciwgdTMyIG1vZHVsZV9lbmFibGUsCithdGgxMGtfd21pX3Rsdl9vcF9nZW5fZGJnbG9nX2NmZyhzdHJ1Y3QgYXRoMTBrICphciwgdTY0IG1vZHVsZV9lbmFibGUsCiAJCQkJIHUzMiBsb2dfbGV2ZWwpIHsKIAlzdHJ1Y3Qgd21pX3Rsdl9kYmdsb2dfY21kICpjbWQ7CiAJc3RydWN0IHdtaV90bHYgKnRsdjsKQEAgLTMwODEsNiArMzEwOCwzNCBAQAogCXJldHVybiBza2I7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCithdGgxMGtfd21pX3Rsdl9vcF9nZW5fZWNobyhzdHJ1Y3QgYXRoMTBrICphciwgdTMyIHZhbHVlKQoreworCXN0cnVjdCB3bWlfZWNob19jbWQgKmNtZDsKKwlzdHJ1Y3Qgd21pX3RsdiAqdGx2OworCXN0cnVjdCBza19idWZmICpza2I7CisJdm9pZCAqcHRyOworCXNpemVfdCBsZW47CisKKwlsZW4gPSBzaXplb2YoKnRsdikgKyBzaXplb2YoKmNtZCk7CisJc2tiID0gYXRoMTBrX3dtaV9hbGxvY19za2IoYXIsIGxlbik7CisJaWYgKCFza2IpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJcHRyID0gKHZvaWQgKilza2ItPmRhdGE7CisJdGx2ID0gcHRyOworCXRsdi0+dGFnID0gX19jcHVfdG9fbGUxNihXTUlfVExWX1RBR19TVFJVQ1RfRUNIT19DTUQpOworCXRsdi0+bGVuID0gX19jcHVfdG9fbGUxNihzaXplb2YoKmNtZCkpOworCWNtZCA9ICh2b2lkICopdGx2LT52YWx1ZTsKKwljbWQtPnZhbHVlID0gY3B1X3RvX2xlMzIodmFsdWUpOworCisJcHRyICs9IHNpemVvZigqdGx2KTsKKwlwdHIgKz0gc2l6ZW9mKCpjbWQpOworCisJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19XTUksICJ3bWkgdGx2IGVjaG8gdmFsdWUgMHglMDh4XG4iLCB2YWx1ZSk7CisJcmV0dXJuIHNrYjsKK30KKwogLyoqKioqKioqKioqKioqKiovCiAvKiBUTFYgbWFwcGluZ3MgKi8KIC8qKioqKioqKioqKioqKioqLwpAQCAtMzQyOSw2ICszNDg0LDcgQEAKIAkucHVsbF9md19zdGF0cyA9IGF0aDEwa193bWlfdGx2X29wX3B1bGxfZndfc3RhdHMsCiAJLnB1bGxfcm9hbV9ldiA9IGF0aDEwa193bWlfdGx2X29wX3B1bGxfcm9hbV9ldiwKIAkucHVsbF93b3dfZXZlbnQgPSBhdGgxMGtfd21pX3Rsdl9vcF9wdWxsX3dvd19ldiwKKwkucHVsbF9lY2hvX2V2ID0gYXRoMTBrX3dtaV90bHZfb3BfcHVsbF9lY2hvX2V2LAogCS5nZXRfdHhiZl9jb25mX3NjaGVtZSA9IGF0aDEwa193bWlfdGx2X3R4YmZfY29uZl9zY2hlbWUsCiAKIAkuZ2VuX3BkZXZfc3VzcGVuZCA9IGF0aDEwa193bWlfdGx2X29wX2dlbl9wZGV2X3N1c3BlbmQsCkBAIC0zNDg1LDYgKzM1NDEsNyBAQAogCS5nZW5fYWRhcHRpdmVfcWNzID0gYXRoMTBrX3dtaV90bHZfb3BfZ2VuX2FkYXB0aXZlX3FjcywKIAkuZndfc3RhdHNfZmlsbCA9IGF0aDEwa193bWlfbWFpbl9vcF9md19zdGF0c19maWxsLAogCS5nZXRfdmRldl9zdWJ0eXBlID0gYXRoMTBrX3dtaV9vcF9nZXRfdmRldl9zdWJ0eXBlLAorCS5nZW5fZWNobyA9IGF0aDEwa193bWlfdGx2X29wX2dlbl9lY2hvLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB3bWlfcGVlcl9mbGFnc19tYXAgd21pX3Rsdl9wZWVyX2ZsYWdzX21hcCA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS5jCmluZGV4IGQyNDYyODguLjU0ZGY0MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWkuYwpAQCAtMjksNiArMjksOSBAQAogI2luY2x1ZGUgInAycC5oIgogI2luY2x1ZGUgImh3LmgiCiAKKyNkZWZpbmUgQVRIMTBLX1dNSV9CQVJSSUVSX0VDSE9fSUQgMHhCQTk5MUU5CisjZGVmaW5lIEFUSDEwS19XTUlfQkFSUklFUl9USU1FT1VUX0haICgzICogSFopCisKIC8qIE1BSU4gV01JIGNtZCB0cmFjayAqLwogc3RhdGljIHN0cnVjdCB3bWlfY21kX21hcCB3bWlfY21kX21hcCA9IHsKIAkuaW5pdF9jbWRpZCA9IFdNSV9JTklUX0NNRElELApAQCAtMTg3NCw3ICsxODc3LDcgQEAKIAlldGhlcl9hZGRyX2NvcHkoY21kLT5oZHIucGVlcl9tYWNhZGRyLmFkZHIsIGllZWU4MDIxMV9nZXRfREEoaGRyKSk7CiAJbWVtY3B5KGNtZC0+YnVmLCBtc2R1LT5kYXRhLCBtc2R1LT5sZW4pOwogCi0JYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19XTUksICJ3bWkgbWdtdCB0eCBza2IgJXAgbGVuICVkIGZ0eXBlICUwMnggc3R5cGUgJTAyeFxuIiwKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX1dNSSwgIndtaSBtZ210IHR4IHNrYiAlcEsgbGVuICVkIGZ0eXBlICUwMnggc3R5cGUgJTAyeFxuIiwKIAkJICAgbXNkdSwgc2tiLT5sZW4sIGZjICYgSUVFRTgwMjExX0ZDVExfRlRZUEUsCiAJCSAgIGZjICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpOwogCXRyYWNlX2F0aDEwa190eF9oZHIoYXIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwpAQCAtMjI0MCw2ICsyMjQzLDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBib29sIGF0aDEwa193bWlfcnhfaXNfZGVjcnlwdGVkKHN0cnVjdCBhdGgxMGsgKmFyLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyKQoreworCWlmICghaWVlZTgwMjExX2hhc19wcm90ZWN0ZWQoaGRyLT5mcmFtZV9jb250cm9sKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogRlcgZGVsaXZlcnMgV0VQIFNoYXJlZCBBdXRoIGZyYW1lIHdpdGggUHJvdGVjdGVkIEJpdCBzZXQgYW5kCisJICogZW5jcnlwdGVkIHBheWxvYWQuIEhvd2V2ZXIgaW4gY2FzZSBvZiBQTUYgaXQgZGVsaXZlcnMgZGVjcnlwdGVkCisJICogZnJhbWVzIHdpdGggUHJvdGVjdGVkIEJpdCBzZXQuCisJICovCisJaWYgKGllZWU4MDIxMV9pc19hdXRoKGhkci0+ZnJhbWVfY29udHJvbCkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIHFjYTk5eDAgYmFzZWQgRlcgZGVsaXZlcnMgYnJvYWRjYXN0IG9yIG11bHRpY2FzdCBtYW5hZ2VtZW50IGZyYW1lcworCSAqIChleDogZ3JvdXAgcHJpdmFjeSBhY3Rpb24gZnJhbWVzIGluIG1lc2gpIGFzIGVuY3J5cHRlZCBwYXlsb2FkLgorCSAqLworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihpZWVlODAyMTFfZ2V0X0RBKGhkcikpICYmCisJICAgIGFyLT5od19wYXJhbXMuc3dfZGVjcnlwdF9tY2FzdF9tZ210KQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwogaW50IGF0aDEwa193bWlfZXZlbnRfbWdtdF9yeChzdHJ1Y3QgYXRoMTBrICphciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3Qgd21pX21nbXRfcnhfZXZfYXJnIGFyZyA9IHt9OwpAQCAtMjMyNiwxMSArMjM1Miw3IEBACiAKIAlhdGgxMGtfd21pX2hhbmRsZV93ZXBfcmVhdXRoKGFyLCBza2IsIHN0YXR1cyk7CiAKLQkvKiBGVyBkZWxpdmVycyBXRVAgU2hhcmVkIEF1dGggZnJhbWUgd2l0aCBQcm90ZWN0ZWQgQml0IHNldCBhbmQKLQkgKiBlbmNyeXB0ZWQgcGF5bG9hZC4gSG93ZXZlciBpbiBjYXNlIG9mIFBNRiBpdCBkZWxpdmVycyBkZWNyeXB0ZWQKLQkgKiBmcmFtZXMgd2l0aCBQcm90ZWN0ZWQgQml0IHNldC4gKi8KLQlpZiAoaWVlZTgwMjExX2hhc19wcm90ZWN0ZWQoaGRyLT5mcmFtZV9jb250cm9sKSAmJgotCSAgICAhaWVlZTgwMjExX2lzX2F1dGgoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCWlmIChhdGgxMGtfd21pX3J4X2lzX2RlY3J5cHRlZChhciwgaGRyKSkgewogCQlzdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19ERUNSWVBURUQ7CiAKIAkJaWYgKCFpZWVlODAyMTFfaXNfYWN0aW9uKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKQEAgLTIzNDcsNyArMjM2OSw3IEBACiAJCWF0aDEwa19tYWNfaGFuZGxlX2JlYWNvbihhciwgc2tiKTsKIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfTUdNVCwKLQkJICAgImV2ZW50IG1nbXQgcnggc2tiICVwIGxlbiAlZCBmdHlwZSAlMDJ4IHN0eXBlICUwMnhcbiIsCisJCSAgICJldmVudCBtZ210IHJ4IHNrYiAlcEsgbGVuICVkIGZ0eXBlICUwMnggc3R5cGUgJTAyeFxuIiwKIAkJICAgc2tiLCBza2ItPmxlbiwKIAkJICAgZmMgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSwgZmMgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSk7CiAKQEAgLTI0OTUsNyArMjUxNywyMSBAQAogCiB2b2lkIGF0aDEwa193bWlfZXZlbnRfZWNobyhzdHJ1Y3QgYXRoMTBrICphciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX1dNSSwgIldNSV9FQ0hPX0VWRU5USURcbiIpOworCXN0cnVjdCB3bWlfZWNob19ldl9hcmcgYXJnID0ge307CisJaW50IHJldDsKKworCXJldCA9IGF0aDEwa193bWlfcHVsbF9lY2hvX2V2KGFyLCBza2IsICZhcmcpOworCWlmIChyZXQpIHsKKwkJYXRoMTBrX3dhcm4oYXIsICJmYWlsZWQgdG8gcGFyc2UgZWNobzogJWRcbiIsIHJldCk7CisJCXJldHVybjsKKwl9CisKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX1dNSSwKKwkJICAgIndtaSBldmVudCBlY2hvIHZhbHVlIDB4JTA4eFxuIiwKKwkJICAgbGUzMl90b19jcHUoYXJnLnZhbHVlKSk7CisKKwlpZiAobGUzMl90b19jcHUoYXJnLnZhbHVlKSA9PSBBVEgxMEtfV01JX0JBUlJJRVJfRUNIT19JRCkKKwkJY29tcGxldGUoJmFyLT53bWkuYmFycmllcik7CiB9CiAKIGludCBhdGgxMGtfd21pX2V2ZW50X2RlYnVnX21lc2coc3RydWN0IGF0aDEwayAqYXIsIHN0cnVjdCBza19idWZmICpza2IpCkBAIC0zNDc4LDYgKzM1MTQsMTIgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKKwkJLyogbWFjODAyMTEgd291bGQgaGF2ZSBhbHJlYWR5IGFza2VkIHVzIHRvIHN0b3AgYmVhY29uaW5nIGFuZAorCQkgKiBicmluZyB0aGUgdmRldiBkb3duLCBzbyBjb250aW51ZSBpbiB0aGF0IGNhc2UKKwkJICovCisJCWlmICghYXJ2aWYtPmlzX3VwKQorCQkJY29udGludWU7CisKIAkJLyogVGhlcmUgYXJlIG5vIGNvbXBsZXRpb25zIGZvciBiZWFjb25zIHNvIHdhaXQgZm9yIG5leHQgU1dCQQogCQkgKiBiZWZvcmUgdGVsbGluZyBtYWM4MDIxMSB0byBkZWNyZW1lbnQgQ1NBIGNvdW50ZXIKIAkJICoKQEAgLTM1MjcsNyArMzU2OSw2IEBACiAJCQkJYXRoMTBrX3dhcm4oYXIsICJmYWlsZWQgdG8gbWFwIGJlYWNvbjogJWRcbiIsCiAJCQkJCSAgICByZXQpOwogCQkJCWRldl9rZnJlZV9za2JfYW55KGJjbik7Ci0JCQkJcmV0ID0gLUVJTzsKIAkJCQlnb3RvIHNraXA7CiAJCQl9CiAKQEAgLTQ3OTIsNiArNDgzMywxNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGF0aDEwa193bWlfb3BfcHVsbF9lY2hvX2V2KHN0cnVjdCBhdGgxMGsgKmFyLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgc3RydWN0IHdtaV9lY2hvX2V2X2FyZyAqYXJnKQoreworCXN0cnVjdCB3bWlfZWNob19ldmVudCAqZXYgPSAodm9pZCAqKXNrYi0+ZGF0YTsKKworCWFyZy0+dmFsdWUgPSBldi0+dmFsdWU7CisKKwlyZXR1cm4gMDsKK30KKwogaW50IGF0aDEwa193bWlfZXZlbnRfcmVhZHkoc3RydWN0IGF0aDEwayAqYXIsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHdtaV9yZHlfZXZfYXJnIGFyZyA9IHt9OwpAQCAtNTEyNCw2ICs1MTc2LDcgQEAKIHsKIAlzdHJ1Y3Qgd21pX2NtZF9oZHIgKmNtZF9oZHI7CiAJZW51bSB3bWlfMTBfMl9ldmVudF9pZCBpZDsKKwlib29sIGNvbnN1bWVkOwogCiAJY21kX2hkciA9IChzdHJ1Y3Qgd21pX2NtZF9oZHIgKilza2ItPmRhdGE7CiAJaWQgPSBNUyhfX2xlMzJfdG9fY3B1KGNtZF9oZHItPmNtZF9pZCksIFdNSV9DTURfSERSX0NNRF9JRCk7CkBAIC01MTMzLDYgKzUxODYsMTggQEAKIAogCXRyYWNlX2F0aDEwa193bWlfZXZlbnQoYXIsIGlkLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAorCWNvbnN1bWVkID0gYXRoMTBrX3RtX2V2ZW50X3dtaShhciwgaWQsIHNrYik7CisKKwkvKiBSZWFkeSBldmVudCBtdXN0IGJlIGhhbmRsZWQgbm9ybWFsbHkgYWxzbyBpbiBVVEYgbW9kZSBzbyB0aGF0IHdlCisJICoga25vdyB0aGUgVVRGIGZpcm13YXJlIGhhcyBib290ZWQsIG90aGVycyB3ZSBhcmUganVzdCBieXBhc3MgV01JCisJICogZXZlbnRzIHRvIHRlc3Rtb2RlLgorCSAqLworCWlmIChjb25zdW1lZCAmJiBpZCAhPSBXTUlfMTBfMl9SRUFEWV9FVkVOVElEKSB7CisJCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfV01JLAorCQkJICAgIndtaSB0ZXN0bW9kZSBjb25zdW1lZCAweCV4XG4iLCBpZCk7CisJCWdvdG8gb3V0OworCX0KKwogCXN3aXRjaCAoaWQpIHsKIAljYXNlIFdNSV8xMF8yX01HTVRfUlhfRVZFTlRJRDoKIAkJYXRoMTBrX3dtaV9ldmVudF9tZ210X3J4KGFyLCBza2IpOwpAQCAtNTI0OCw2ICs1MzEzLDcgQEAKIHsKIAlzdHJ1Y3Qgd21pX2NtZF9oZHIgKmNtZF9oZHI7CiAJZW51bSB3bWlfMTBfNF9ldmVudF9pZCBpZDsKKwlib29sIGNvbnN1bWVkOwogCiAJY21kX2hkciA9IChzdHJ1Y3Qgd21pX2NtZF9oZHIgKilza2ItPmRhdGE7CiAJaWQgPSBNUyhfX2xlMzJfdG9fY3B1KGNtZF9oZHItPmNtZF9pZCksIFdNSV9DTURfSERSX0NNRF9JRCk7CkBAIC01MjU3LDYgKzUzMjMsMTggQEAKIAogCXRyYWNlX2F0aDEwa193bWlfZXZlbnQoYXIsIGlkLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAorCWNvbnN1bWVkID0gYXRoMTBrX3RtX2V2ZW50X3dtaShhciwgaWQsIHNrYik7CisKKwkvKiBSZWFkeSBldmVudCBtdXN0IGJlIGhhbmRsZWQgbm9ybWFsbHkgYWxzbyBpbiBVVEYgbW9kZSBzbyB0aGF0IHdlCisJICoga25vdyB0aGUgVVRGIGZpcm13YXJlIGhhcyBib290ZWQsIG90aGVycyB3ZSBhcmUganVzdCBieXBhc3MgV01JCisJICogZXZlbnRzIHRvIHRlc3Rtb2RlLgorCSAqLworCWlmIChjb25zdW1lZCAmJiBpZCAhPSBXTUlfMTBfNF9SRUFEWV9FVkVOVElEKSB7CisJCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfV01JLAorCQkJICAgIndtaSB0ZXN0bW9kZSBjb25zdW1lZCAweCV4XG4iLCBpZCk7CisJCWdvdG8gb3V0OworCX0KKwogCXN3aXRjaCAoaWQpIHsKIAljYXNlIFdNSV8xMF80X01HTVRfUlhfRVZFTlRJRDoKIAkJYXRoMTBrX3dtaV9ldmVudF9tZ210X3J4KGFyLCBza2IpOwpAQCAtNTMwNiw2ICs1Mzg0LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTUlfMTBfNF9XT1dfV0FLRVVQX0hPU1RfRVZFTlRJRDoKIAljYXNlIFdNSV8xMF80X1BFRVJfUkFURUNPREVfTElTVF9FVkVOVElEOgorCWNhc2UgV01JXzEwXzRfV0RTX1BFRVJfRVZFTlRJRDoKIAkJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19XTUksCiAJCQkgICAicmVjZWl2ZWQgZXZlbnQgaWQgJWQgbm90IGltcGxlbWVudGVkXG4iLCBpZCk7CiAJCWJyZWFrOwpAQCAtNjg2Myw3ICs2OTQyLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBza19idWZmICoKLWF0aDEwa193bWlfb3BfZ2VuX2RiZ2xvZ19jZmcoc3RydWN0IGF0aDEwayAqYXIsIHUzMiBtb2R1bGVfZW5hYmxlLAorYXRoMTBrX3dtaV9vcF9nZW5fZGJnbG9nX2NmZyhzdHJ1Y3QgYXRoMTBrICphciwgdTY0IG1vZHVsZV9lbmFibGUsCiAJCQkgICAgIHUzMiBsb2dfbGV2ZWwpCiB7CiAJc3RydWN0IHdtaV9kYmdsb2dfY2ZnX2NtZCAqY21kOwpAQCAtNjkwMSw2ICs2OTgwLDQ0IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCithdGgxMGtfd21pXzEwXzRfb3BfZ2VuX2RiZ2xvZ19jZmcoc3RydWN0IGF0aDEwayAqYXIsIHU2NCBtb2R1bGVfZW5hYmxlLAorCQkJCSAgdTMyIGxvZ19sZXZlbCkKK3sKKwlzdHJ1Y3Qgd21pXzEwXzRfZGJnbG9nX2NmZ19jbWQgKmNtZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUzMiBjZmc7CisKKwlza2IgPSBhdGgxMGtfd21pX2FsbG9jX3NrYihhciwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwljbWQgPSAoc3RydWN0IHdtaV8xMF80X2RiZ2xvZ19jZmdfY21kICopc2tiLT5kYXRhOworCisJaWYgKG1vZHVsZV9lbmFibGUpIHsKKwkJY2ZnID0gU00obG9nX2xldmVsLAorCQkJIEFUSDEwS19EQkdMT0dfQ0ZHX0xPR19MVkwpOworCX0gZWxzZSB7CisJCS8qIHNldCBiYWNrIGRlZmF1bHRzLCBhbGwgbW9kdWxlcyB3aXRoIFdBUk4gbGV2ZWwgKi8KKwkJY2ZnID0gU00oQVRIMTBLX0RCR0xPR19MRVZFTF9XQVJOLAorCQkJIEFUSDEwS19EQkdMT0dfQ0ZHX0xPR19MVkwpOworCQltb2R1bGVfZW5hYmxlID0gfjA7CisJfQorCisJY21kLT5tb2R1bGVfZW5hYmxlID0gX19jcHVfdG9fbGU2NChtb2R1bGVfZW5hYmxlKTsKKwljbWQtPm1vZHVsZV92YWxpZCA9IF9fY3B1X3RvX2xlNjQofjApOworCWNtZC0+Y29uZmlnX2VuYWJsZSA9IF9fY3B1X3RvX2xlMzIoY2ZnKTsKKwljbWQtPmNvbmZpZ192YWxpZCA9IF9fY3B1X3RvX2xlMzIoQVRIMTBLX0RCR0xPR19DRkdfTE9HX0xWTF9NQVNLKTsKKworCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfV01JLAorCQkgICAid21pIGRiZ2xvZyBjZmcgbW9kdWxlcyAweCUwMTZsbHggMHglMDE2bGx4IGNvbmZpZyAlMDh4ICUwOHhcbiIsCisJCSAgIF9fbGU2NF90b19jcHUoY21kLT5tb2R1bGVfZW5hYmxlKSwKKwkJICAgX19sZTY0X3RvX2NwdShjbWQtPm1vZHVsZV92YWxpZCksCisJCSAgIF9fbGUzMl90b19jcHUoY21kLT5jb25maWdfZW5hYmxlKSwKKwkJICAgX19sZTMyX3RvX2NwdShjbWQtPmNvbmZpZ192YWxpZCkpOworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCiBhdGgxMGtfd21pX29wX2dlbl9wa3Rsb2dfZW5hYmxlKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgZXZfYml0bWFwKQogewogCXN0cnVjdCB3bWlfcGRldl9wa3Rsb2dfZW5hYmxlX2NtZCAqY21kOwpAQCAtNzY0OSw2ICs3NzY2LDQ4IEBACiAJcmV0dXJuIHNrYjsKIH0KIAorc3RhdGljIHN0cnVjdCBza19idWZmICoKK2F0aDEwa193bWlfb3BfZ2VuX2VjaG8oc3RydWN0IGF0aDEwayAqYXIsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgd21pX2VjaG9fY21kICpjbWQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IGF0aDEwa193bWlfYWxsb2Nfc2tiKGFyLCBzaXplb2YoKmNtZCkpOworCWlmICghc2tiKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWNtZCA9IChzdHJ1Y3Qgd21pX2VjaG9fY21kICopc2tiLT5kYXRhOworCWNtZC0+dmFsdWUgPSBjcHVfdG9fbGUzMih2YWx1ZSk7CisKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX1dNSSwKKwkJICAgIndtaSBlY2hvIHZhbHVlIDB4JTA4eFxuIiwgdmFsdWUpOworCXJldHVybiBza2I7Cit9CisKK2ludAorYXRoMTBrX3dtaV9iYXJyaWVyKHN0cnVjdCBhdGgxMGsgKmFyKQoreworCWludCByZXQ7CisJaW50IHRpbWVfbGVmdDsKKworCXNwaW5fbG9ja19iaCgmYXItPmRhdGFfbG9jayk7CisJcmVpbml0X2NvbXBsZXRpb24oJmFyLT53bWkuYmFycmllcik7CisJc3Bpbl91bmxvY2tfYmgoJmFyLT5kYXRhX2xvY2spOworCisJcmV0ID0gYXRoMTBrX3dtaV9lY2hvKGFyLCBBVEgxMEtfV01JX0JBUlJJRVJfRUNIT19JRCk7CisJaWYgKHJldCkgeworCQlhdGgxMGtfd2FybihhciwgImZhaWxlZCB0byBzdWJtaXQgd21pIGVjaG86ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXRpbWVfbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmYXItPndtaS5iYXJyaWVyLAorCQkJCQkJQVRIMTBLX1dNSV9CQVJSSUVSX1RJTUVPVVRfSFopOworCWlmICghdGltZV9sZWZ0KQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHdtaV9vcHMgd21pX29wcyA9IHsKIAkucnggPSBhdGgxMGtfd21pX29wX3J4LAogCS5tYXBfc3ZjID0gd21pX21haW5fc3ZjX21hcCwKQEAgLTc2NjUsNiArNzgyNCw3IEBACiAJLnB1bGxfcmR5ID0gYXRoMTBrX3dtaV9vcF9wdWxsX3JkeV9ldiwKIAkucHVsbF9md19zdGF0cyA9IGF0aDEwa193bWlfbWFpbl9vcF9wdWxsX2Z3X3N0YXRzLAogCS5wdWxsX3JvYW1fZXYgPSBhdGgxMGtfd21pX29wX3B1bGxfcm9hbV9ldiwKKwkucHVsbF9lY2hvX2V2ID0gYXRoMTBrX3dtaV9vcF9wdWxsX2VjaG9fZXYsCiAKIAkuZ2VuX3BkZXZfc3VzcGVuZCA9IGF0aDEwa193bWlfb3BfZ2VuX3BkZXZfc3VzcGVuZCwKIAkuZ2VuX3BkZXZfcmVzdW1lID0gYXRoMTBrX3dtaV9vcF9nZW5fcGRldl9yZXN1bWUsCkBAIC03NzA5LDYgKzc4NjksNyBAQAogCS5nZW5fZGVsYmFfc2VuZCA9IGF0aDEwa193bWlfb3BfZ2VuX2RlbGJhX3NlbmQsCiAJLmZ3X3N0YXRzX2ZpbGwgPSBhdGgxMGtfd21pX21haW5fb3BfZndfc3RhdHNfZmlsbCwKIAkuZ2V0X3ZkZXZfc3VidHlwZSA9IGF0aDEwa193bWlfb3BfZ2V0X3ZkZXZfc3VidHlwZSwKKwkuZ2VuX2VjaG8gPSBhdGgxMGtfd21pX29wX2dlbl9lY2hvLAogCS8qIC5nZW5fYmNuX3RtcGwgbm90IGltcGxlbWVudGVkICovCiAJLyogLmdlbl9wcmJfdG1wbCBub3QgaW1wbGVtZW50ZWQgKi8KIAkvKiAuZ2VuX3AycF9nb19iY25faWUgbm90IGltcGxlbWVudGVkICovCkBAIC03NzM4LDYgKzc4OTksNyBAQAogCS5wdWxsX3BoeWVyciA9IGF0aDEwa193bWlfb3BfcHVsbF9waHllcnJfZXYsCiAJLnB1bGxfcmR5ID0gYXRoMTBrX3dtaV9vcF9wdWxsX3JkeV9ldiwKIAkucHVsbF9yb2FtX2V2ID0gYXRoMTBrX3dtaV9vcF9wdWxsX3JvYW1fZXYsCisJLnB1bGxfZWNob19ldiA9IGF0aDEwa193bWlfb3BfcHVsbF9lY2hvX2V2LAogCiAJLmdlbl9wZGV2X3N1c3BlbmQgPSBhdGgxMGtfd21pX29wX2dlbl9wZGV2X3N1c3BlbmQsCiAJLmdlbl9wZGV2X3Jlc3VtZSA9IGF0aDEwa193bWlfb3BfZ2VuX3BkZXZfcmVzdW1lLApAQCAtNzc3Nyw2ICs3OTM5LDcgQEAKIAkuZ2VuX2RlbGJhX3NlbmQgPSBhdGgxMGtfd21pX29wX2dlbl9kZWxiYV9zZW5kLAogCS5md19zdGF0c19maWxsID0gYXRoMTBrX3dtaV8xMHhfb3BfZndfc3RhdHNfZmlsbCwKIAkuZ2V0X3ZkZXZfc3VidHlwZSA9IGF0aDEwa193bWlfb3BfZ2V0X3ZkZXZfc3VidHlwZSwKKwkuZ2VuX2VjaG8gPSBhdGgxMGtfd21pX29wX2dlbl9lY2hvLAogCS8qIC5nZW5fYmNuX3RtcGwgbm90IGltcGxlbWVudGVkICovCiAJLyogLmdlbl9wcmJfdG1wbCBub3QgaW1wbGVtZW50ZWQgKi8KIAkvKiAuZ2VuX3AycF9nb19iY25faWUgbm90IGltcGxlbWVudGVkICovCkBAIC03Nzk2LDYgKzc5NTksNyBAQAogCS5wdWxsX3N2Y19yZHkgPSBhdGgxMGtfd21pXzEweF9vcF9wdWxsX3N2Y19yZHlfZXYsCiAJLmdlbl9wZGV2X3NldF9yZCA9IGF0aDEwa193bWlfMTB4X29wX2dlbl9wZGV2X3NldF9yZCwKIAkuZ2VuX3N0YXJ0X3NjYW4gPSBhdGgxMGtfd21pXzEweF9vcF9nZW5fc3RhcnRfc2NhbiwKKwkuZ2VuX2VjaG8gPSBhdGgxMGtfd21pX29wX2dlbl9lY2hvLAogCiAJLnB1bGxfc2NhbiA9IGF0aDEwa193bWlfb3BfcHVsbF9zY2FuX2V2LAogCS5wdWxsX21nbXRfcnggPSBhdGgxMGtfd21pX29wX3B1bGxfbWdtdF9yeF9ldiwKQEAgLTc4MDcsNiArNzk3MSw3IEBACiAJLnB1bGxfcGh5ZXJyID0gYXRoMTBrX3dtaV9vcF9wdWxsX3BoeWVycl9ldiwKIAkucHVsbF9yZHkgPSBhdGgxMGtfd21pX29wX3B1bGxfcmR5X2V2LAogCS5wdWxsX3JvYW1fZXYgPSBhdGgxMGtfd21pX29wX3B1bGxfcm9hbV9ldiwKKwkucHVsbF9lY2hvX2V2ID0gYXRoMTBrX3dtaV9vcF9wdWxsX2VjaG9fZXYsCiAKIAkuZ2VuX3BkZXZfc3VzcGVuZCA9IGF0aDEwa193bWlfb3BfZ2VuX3BkZXZfc3VzcGVuZCwKIAkuZ2VuX3BkZXZfcmVzdW1lID0gYXRoMTBrX3dtaV9vcF9nZW5fcGRldl9yZXN1bWUsCkBAIC03ODYyLDYgKzgwMjcsNyBAQAogCS5wdWxsX3N2Y19yZHkgPSBhdGgxMGtfd21pXzEweF9vcF9wdWxsX3N2Y19yZHlfZXYsCiAJLmdlbl9wZGV2X3NldF9yZCA9IGF0aDEwa193bWlfMTB4X29wX2dlbl9wZGV2X3NldF9yZCwKIAkuZ2VuX3N0YXJ0X3NjYW4gPSBhdGgxMGtfd21pXzEweF9vcF9nZW5fc3RhcnRfc2NhbiwKKwkuZ2VuX2VjaG8gPSBhdGgxMGtfd21pX29wX2dlbl9lY2hvLAogCiAJLnB1bGxfc2NhbiA9IGF0aDEwa193bWlfb3BfcHVsbF9zY2FuX2V2LAogCS5wdWxsX21nbXRfcnggPSBhdGgxMGtfd21pX29wX3B1bGxfbWdtdF9yeF9ldiwKQEAgLTc4NzMsNiArODAzOSw3IEBACiAJLnB1bGxfcGh5ZXJyID0gYXRoMTBrX3dtaV9vcF9wdWxsX3BoeWVycl9ldiwKIAkucHVsbF9yZHkgPSBhdGgxMGtfd21pX29wX3B1bGxfcmR5X2V2LAogCS5wdWxsX3JvYW1fZXYgPSBhdGgxMGtfd21pX29wX3B1bGxfcm9hbV9ldiwKKwkucHVsbF9lY2hvX2V2ID0gYXRoMTBrX3dtaV9vcF9wdWxsX2VjaG9fZXYsCiAKIAkuZ2VuX3BkZXZfc3VzcGVuZCA9IGF0aDEwa193bWlfb3BfZ2VuX3BkZXZfc3VzcGVuZCwKIAkuZ2VuX3BkZXZfcmVzdW1lID0gYXRoMTBrX3dtaV9vcF9nZW5fcGRldl9yZXN1bWUsCkBAIC03OTY4LDcgKzgxMzUsNyBAQAogCS5nZW5fcGRldl9zZXRfd21tID0gYXRoMTBrX3dtaV9vcF9nZW5fcGRldl9zZXRfd21tLAogCS5nZW5fZm9yY2VfZndfaGFuZyA9IGF0aDEwa193bWlfb3BfZ2VuX2ZvcmNlX2Z3X2hhbmcsCiAJLmdlbl9tZ210X3R4ID0gYXRoMTBrX3dtaV9vcF9nZW5fbWdtdF90eCwKLQkuZ2VuX2RiZ2xvZ19jZmcgPSBhdGgxMGtfd21pX29wX2dlbl9kYmdsb2dfY2ZnLAorCS5nZW5fZGJnbG9nX2NmZyA9IGF0aDEwa193bWlfMTBfNF9vcF9nZW5fZGJnbG9nX2NmZywKIAkuZ2VuX3BrdGxvZ19lbmFibGUgPSBhdGgxMGtfd21pX29wX2dlbl9wa3Rsb2dfZW5hYmxlLAogCS5nZW5fcGt0bG9nX2Rpc2FibGUgPSBhdGgxMGtfd21pX29wX2dlbl9wa3Rsb2dfZGlzYWJsZSwKIAkuZ2VuX3BkZXZfc2V0X3F1aWV0X21vZGUgPSBhdGgxMGtfd21pX29wX2dlbl9wZGV2X3NldF9xdWlldF9tb2RlLApAQCAtNzk4MCwxMCArODE0NywxMiBAQAogCS5leHRfcmVzb3VyY2VfY29uZmlnID0gYXRoMTBrX3dtaV8xMF80X2V4dF9yZXNvdXJjZV9jb25maWcsCiAKIAkvKiBzaGFyZWQgd2l0aCAxMC4yICovCisJLnB1bGxfZWNob19ldiA9IGF0aDEwa193bWlfb3BfcHVsbF9lY2hvX2V2LAogCS5nZW5fcmVxdWVzdF9zdGF0cyA9IGF0aDEwa193bWlfb3BfZ2VuX3JlcXVlc3Rfc3RhdHMsCiAJLmdlbl9wZGV2X2dldF90ZW1wZXJhdHVyZSA9IGF0aDEwa193bWlfMTBfMl9vcF9nZW5fcGRldl9nZXRfdGVtcGVyYXR1cmUsCiAJLmdldF92ZGV2X3N1YnR5cGUgPSBhdGgxMGtfd21pXzEwXzRfb3BfZ2V0X3ZkZXZfc3VidHlwZSwKIAkuZ2VuX3BkZXZfYnNzX2NoYW5faW5mb19yZXEgPSBhdGgxMGtfd21pXzEwXzJfb3BfZ2VuX3BkZXZfYnNzX2NoYW5faW5mbywKKwkuZ2VuX2VjaG8gPSBhdGgxMGtfd21pX29wX2dlbl9lY2hvLAogfTsKIAogaW50IGF0aDEwa193bWlfYXR0YWNoKHN0cnVjdCBhdGgxMGsgKmFyKQpAQCAtODAzNiw2ICs4MjA1LDcgQEAKIAogCWluaXRfY29tcGxldGlvbigmYXItPndtaS5zZXJ2aWNlX3JlYWR5KTsKIAlpbml0X2NvbXBsZXRpb24oJmFyLT53bWkudW5pZmllZF9yZWFkeSk7CisJaW5pdF9jb21wbGV0aW9uKCZhci0+d21pLmJhcnJpZXIpOwogCiAJSU5JVF9XT1JLKCZhci0+c3ZjX3JkeV93b3JrLCBhdGgxMGtfd21pX2V2ZW50X3NlcnZpY2VfcmVhZHlfd29yayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS5oCmluZGV4IDNlZjQ2ODguLjFiMjQzYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWkuaApAQCAtNTUsNyArNTUsNyBAQAogICogICAgdHlwZS4KICAqCiAgKiA2LiBDb21tZW50IGVhY2ggcGFyYW1ldGVyIHBhcnQgb2YgdGhlIFdNSSBjb21tYW5kL2V2ZW50IHN0cnVjdHVyZSBieQotICogICAgdXNpbmcgdGhlIDIgc3RhcnMgYXQgdGhlIGJlZ2luaW5nIG9mIEMgY29tbWVudCBpbnN0ZWFkIG9mIG9uZSBzdGFyIHRvCisgKiAgICB1c2luZyB0aGUgMiBzdGFycyBhdCB0aGUgYmVnaW5uaW5nIG9mIEMgY29tbWVudCBpbnN0ZWFkIG9mIG9uZSBzdGFyIHRvCiAgKiAgICBlbmFibGUgSFRNTCBkb2N1bWVudCBnZW5lcmF0aW9uIHVzaW5nIERveHlnZW4uCiAgKgogICovCkBAIC0xODAsNiArMTgwLDcgQEAKIAlXTUlfU0VSVklDRV9NRVNIX05PTl8xMVMsCiAJV01JX1NFUlZJQ0VfUEVFUl9TVEFUUywKIAlXTUlfU0VSVklDRV9SRVNUUlRfQ0hOTF9TVVBQT1JULAorCVdNSV9TRVJWSUNFX1BFUklPRElDX0NIQU5fU1RBVF9TVVBQT1JULAogCVdNSV9TRVJWSUNFX1RYX01PREVfUFVTSF9PTkxZLAogCVdNSV9TRVJWSUNFX1RYX01PREVfUFVTSF9QVUxMLAogCVdNSV9TRVJWSUNFX1RYX01PREVfRFlOQU1JQywKQEAgLTMwNSw2ICszMDYsNyBAQAogCVdNSV8xMF80X1NFUlZJQ0VfUkVTVFJUX0NITkxfU1VQUE9SVCwKIAlXTUlfMTBfNF9TRVJWSUNFX1BFRVJfU1RBVFMsCiAJV01JXzEwXzRfU0VSVklDRV9NRVNIXzExUywKKwlXTUlfMTBfNF9TRVJWSUNFX1BFUklPRElDX0NIQU5fU1RBVF9TVVBQT1JULAogCVdNSV8xMF80X1NFUlZJQ0VfVFhfTU9ERV9QVVNIX09OTFksCiAJV01JXzEwXzRfU0VSVklDRV9UWF9NT0RFX1BVU0hfUFVMTCwKIAlXTUlfMTBfNF9TRVJWSUNFX1RYX01PREVfRFlOQU1JQywKQEAgLTQwMiw2ICs0MDQsNyBAQAogCVNWQ1NUUihXTUlfU0VSVklDRV9NRVNIX05PTl8xMVMpOwogCVNWQ1NUUihXTUlfU0VSVklDRV9QRUVSX1NUQVRTKTsKIAlTVkNTVFIoV01JX1NFUlZJQ0VfUkVTVFJUX0NITkxfU1VQUE9SVCk7CisJU1ZDU1RSKFdNSV9TRVJWSUNFX1BFUklPRElDX0NIQU5fU1RBVF9TVVBQT1JUKTsKIAlTVkNTVFIoV01JX1NFUlZJQ0VfVFhfTU9ERV9QVVNIX09OTFkpOwogCVNWQ1NUUihXTUlfU0VSVklDRV9UWF9NT0RFX1BVU0hfUFVMTCk7CiAJU1ZDU1RSKFdNSV9TRVJWSUNFX1RYX01PREVfRFlOQU1JQyk7CkBAIC02NTIsNiArNjU1LDggQEAKIAkgICAgICAgV01JX1NFUlZJQ0VfUEVFUl9TVEFUUywgbGVuKTsKIAlTVkNNQVAoV01JXzEwXzRfU0VSVklDRV9NRVNIXzExUywKIAkgICAgICAgV01JX1NFUlZJQ0VfTUVTSF8xMVMsIGxlbik7CisJU1ZDTUFQKFdNSV8xMF80X1NFUlZJQ0VfUEVSSU9ESUNfQ0hBTl9TVEFUX1NVUFBPUlQsCisJICAgICAgIFdNSV9TRVJWSUNFX1BFUklPRElDX0NIQU5fU1RBVF9TVVBQT1JULCBsZW4pOwogCVNWQ01BUChXTUlfMTBfNF9TRVJWSUNFX1RYX01PREVfUFVTSF9PTkxZLAogCSAgICAgICBXTUlfU0VSVklDRV9UWF9NT0RFX1BVU0hfT05MWSwgbGVuKTsKIAlTVkNNQVAoV01JXzEwXzRfU0VSVklDRV9UWF9NT0RFX1BVU0hfUFVMTCwKQEAgLTIwODIsNyArMjA4Nyw3IEBACiAJICogSW4gb2ZmbG9hZCBtb2RlIHRhcmdldCBzdXBwb3J0cyBmZWF0dXJlcyBsaWtlIFdPVywgY2hhdHRlciBhbmQKIAkgKiBvdGhlciBwcm90b2NvbCBvZmZsb2Fkcy4gSW4gb3JkZXIgdG8gc3VwcG9ydCB0aGVtIHNvbWUKIAkgKiBmdW5jdGlvbmFsaXRpZXMgbGlrZSByZW9yZGVyIGJ1ZmZlcmluZywgUE4gY2hlY2tpbmcgbmVlZCB0byBiZQotCSAqIGRvbmUgaW4gdGFyZ2V0LiBUaGlzIGRldGVybWluZXMgbWF4aW11bSBudW1iZXIgb2YgcGVlcnMgc3Vwb3J0ZWQKKwkgKiBkb25lIGluIHRhcmdldC4gVGhpcyBkZXRlcm1pbmVzIG1heGltdW0gbnVtYmVyIG9mIHBlZXJzIHN1cHBvcnRlZAogCSAqIGJ5IHRhcmdldCBpbiBvZmZsb2FkIG1vZGUKIAkgKi8KIAlfX2xlMzIgbnVtX29mZmxvYWRfcGVlcnM7CkBAIC0yMjYzLDcgKzIyNjgsNyBAQAogCSAqIE1heC4gbnVtYmVyIG9mIFR4IGZyYWdtZW50cyBwZXIgTVNEVQogCSAqICBUaGlzIHBhcmFtZXRlciBjb250cm9scyB0aGUgbWF4IG51bWJlciBvZiBUeCBmcmFnbWVudHMgcGVyIE1TRFUuCiAJICogIFRoaXMgaXMgc2VudCBieSB0aGUgdGFyZ2V0IGFzIHBhcnQgb2YgdGhlIFdNSV9TRVJWSUNFX1JFQURZIGV2ZW50Ci0JICogIGFuZCBpcyBvdmVycmlkZW4gYnkgdGhlIE9TIHNoaW0gYXMgcmVxdWlyZWQuCisJICogIGFuZCBpcyBvdmVycmlkZGVuIGJ5IHRoZSBPUyBzaGltIGFzIHJlcXVpcmVkLgogCSAqLwogCV9fbGUzMiBtYXhfZnJhZ19lbnRyaWVzOwogfSBfX3BhY2tlZDsKQEAgLTI0NDUsNyArMjQ1MCw3IEBACiAJICogTWF4LiBudW1iZXIgb2YgVHggZnJhZ21lbnRzIHBlciBNU0RVCiAJICogIFRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHRoZSBtYXggbnVtYmVyIG9mIFR4IGZyYWdtZW50cyBwZXIgTVNEVS4KIAkgKiAgVGhpcyBpcyBzZW50IGJ5IHRoZSB0YXJnZXQgYXMgcGFydCBvZiB0aGUgV01JX1NFUlZJQ0VfUkVBRFkgZXZlbnQKLQkgKiAgYW5kIGlzIG92ZXJyaWRlbiBieSB0aGUgT1Mgc2hpbSBhcyByZXF1aXJlZC4KKwkgKiAgYW5kIGlzIG92ZXJyaWRkZW4gYnkgdGhlIE9TIHNoaW0gYXMgcmVxdWlyZWQuCiAJICovCiAJX19sZTMyIG1heF9mcmFnX2VudHJpZXM7CiB9IF9fcGFja2VkOwpAQCAtMjczOSw3ICsyNzQ0LDcgQEAKIAlzdHJ1Y3Qgd21pX2hvc3RfbWVtX2NodW5rcyBtZW1fY2h1bmtzOwogfSBfX3BhY2tlZDsKIAotLyogXzEweCBzdHVjdHVyZSBpcyBmcm9tIDEwLlggRlcgQVBJICovCisvKiBfMTB4IHN0cnVjdHVyZSBpcyBmcm9tIDEwLlggRlcgQVBJICovCiBzdHJ1Y3Qgd21pX2luaXRfY21kXzEweCB7CiAJc3RydWN0IHdtaV9yZXNvdXJjZV9jb25maWdfMTB4IHJlc291cmNlX2NvbmZpZzsKIAlzdHJ1Y3Qgd21pX2hvc3RfbWVtX2NodW5rcyBtZW1fY2h1bmtzOwpAQCAtMzk2Miw3ICszOTY3LDcgQEAKIAkvKiBpbGxlZ2FsIHJhdGUgcGh5IGVycm9ycyAgKi8KIAlfX2xlMzIgaWxsZ2xfcmF0ZV9waHlfZXJyOwogCi0JLyogd2FsIHBkZXYgY29udGlub3VzIHhyZXRyeSAqLworCS8qIHdhbCBwZGV2IGNvbnRpbnVvdXMgeHJldHJ5ICovCiAJX19sZTMyIHBkZXZfY29udF94cmV0cnk7CiAKIAkvKiB3YWwgcGRldiBjb250aW5vdXMgeHJldHJ5ICovCkBAIC00MjE3LDEwICs0MjIyLDEwIEBACiAgKi8KIHN0cnVjdCB3bWlfcGRldl9zdGF0c19iYXNlIHsKIAlfX2xlMzIgY2hhbl9uZjsKLQlfX2xlMzIgdHhfZnJhbWVfY291bnQ7Ci0JX19sZTMyIHJ4X2ZyYW1lX2NvdW50OwotCV9fbGUzMiByeF9jbGVhcl9jb3VudDsKLQlfX2xlMzIgY3ljbGVfY291bnQ7CisJX19sZTMyIHR4X2ZyYW1lX2NvdW50OyAvKiBDeWNsZXMgc3BlbnQgdHJhbnNtaXR0aW5nIGZyYW1lcyAqLworCV9fbGUzMiByeF9mcmFtZV9jb3VudDsgLyogQ3ljbGVzIHNwZW50IHJlY2VpdmluZyBmcmFtZXMgKi8KKwlfX2xlMzIgcnhfY2xlYXJfY291bnQ7IC8qIFRvdGFsIGNoYW5uZWwgYnVzeSB0aW1lLCBldmlkZW50bHkgKi8KKwlfX2xlMzIgY3ljbGVfY291bnQ7IC8qIFRvdGFsIG9uLWNoYW5uZWwgdGltZSAqLwogCV9fbGUzMiBwaHlfZXJyX2NvdW50OwogCV9fbGUzMiBjaGFuX3R4X3B3cjsKIH0gX19wYWNrZWQ7CkBAIC00NDU2LDkgKzQ0NjEsOSBAQAogCV9fbGUzMiBmbGFnczsKIAkvKiBzc2lkIGZpZWxkLiBPbmx5IHZhbGlkIGZvciBBUC9HTy9JQlNTL0JUQW1wIFZERVYgdHlwZS4gKi8KIAlzdHJ1Y3Qgd21pX3NzaWQgc3NpZDsKLQkvKiBiZWFjb24vcHJvYmUgcmVwb25zZSB4bWl0IHJhdGUuIEFwcGxpY2FibGUgZm9yIFNvZnRBUC4gKi8KKwkvKiBiZWFjb24vcHJvYmUgcmVzcG9uc2UgeG1pdCByYXRlLiBBcHBsaWNhYmxlIGZvciBTb2Z0QVAuICovCiAJX19sZTMyIGJjbl90eF9yYXRlOwotCS8qIGJlYWNvbi9wcm9iZSByZXBvbnNlIHhtaXQgcG93ZXIuIEFwcGxpY2FibGUgZm9yIFNvZnRBUC4gKi8KKwkvKiBiZWFjb24vcHJvYmUgcmVzcG9uc2UgeG1pdCBwb3dlci4gQXBwbGljYWJsZSBmb3IgU29mdEFQLiAqLwogCV9fbGUzMiBiY25fdHhfcG93ZXI7CiAJLyogbnVtYmVyIG9mIHAycCBOT0EgZGVzY3JpcHRvcihzKSBmcm9tIHNjYW4gZW50cnkgKi8KIAlfX2xlMzIgbnVtX25vYV9kZXNjcmlwdG9yczsKQEAgLTQ2ODYsNyArNDY5MSw3IEBACiAJV01JX1ZERVZfUEFSQU1fQkVBQ09OX0lOVEVSVkFMLAogCS8qIExpc3RlbiBpbnRlcnZhbCBpbiBUVXMgKi8KIAlXTUlfVkRFVl9QQVJBTV9MSVNURU5fSU5URVJWQUwsCi0JLyogbXV0aWNhc3QgcmF0ZSBpbiBNYnBzICovCisJLyogbXVsdGljYXN0IHJhdGUgaW4gTWJwcyAqLwogCVdNSV9WREVWX1BBUkFNX01VTFRJQ0FTVF9SQVRFLAogCS8qIG1hbmFnZW1lbnQgZnJhbWUgcmF0ZSBpbiBNYnBzICovCiAJV01JX1ZERVZfUEFSQU1fTUdNVF9UWF9SQVRFLApAQCAtNDgxNyw3ICs0ODIyLDcgQEAKIAlXTUlfMTBYX1ZERVZfUEFSQU1fQkVBQ09OX0lOVEVSVkFMLAogCS8qIExpc3RlbiBpbnRlcnZhbCBpbiBUVXMgKi8KIAlXTUlfMTBYX1ZERVZfUEFSQU1fTElTVEVOX0lOVEVSVkFMLAotCS8qIG11dGljYXN0IHJhdGUgaW4gTWJwcyAqLworCS8qIG11bHRpY2FzdCByYXRlIGluIE1icHMgKi8KIAlXTUlfMTBYX1ZERVZfUEFSQU1fTVVMVElDQVNUX1JBVEUsCiAJLyogbWFuYWdlbWVudCBmcmFtZSByYXRlIGluIE1icHMgKi8KIAlXTUlfMTBYX1ZERVZfUEFSQU1fTUdNVF9UWF9SQVRFLApAQCAtNTA2Miw3ICs1MDY3LDcgQEAKIH0gX19wYWNrZWQ7CiAKIC8qIFZERVYgc3RhcnQgcmVzcG9uc2Ugc3RhdHVzIGNvZGVzICovCi0vKiBWREVWIHN1Y2Nlc2Z1bGx5IHN0YXJ0ZWQgKi8KKy8qIFZERVYgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgKi8KICNkZWZpbmUgV01JX0lOSUZJRURfVkRFVl9TVEFSVF9SRVNQT05TRV9TVEFUVVNfU1VDQ0VTUwkweDAKIAogLyogcmVxdWVzdGVkIFZERVYgbm90IGZvdW5kICovCkBAIC01Mzc4LDcgKzUzODMsNyBAQAogI2RlZmluZSBXTUlfVUFQU0RfQUNfVFlQRV9UUklHIDEKIAogI2RlZmluZSBXTUlfVUFQU0RfQUNfQklUX01BU0soYWMsIHR5cGUpIFwKLQkoKHR5cGUgPT0gIFdNSV9VQVBTRF9BQ19UWVBFX0RFTEkpID8gKDEgPDwgKGFjIDw8IDEpKSA6ICgxIDw8ICgoYWMgPDwgMSkgKyAxKSkpCisJKHR5cGUgPT0gV01JX1VBUFNEX0FDX1RZUEVfREVMSSA/IDEgPDwgKGFjIDw8IDEpIDogMSA8PCAoKGFjIDw8IDEpICsgMSkpCiAKIGVudW0gd21pX3N0YV9wc19wYXJhbV91YXBzZCB7CiAJV01JX1NUQV9QU19VQVBTRF9BQzBfREVMSVZFUllfRU4gPSAoMSA8PCAwKSwKQEAgLTYxNjksNiArNjE3NCwyMCBAQAogCV9fbGUzMiBjb25maWdfdmFsaWQ7CiB9IF9fcGFja2VkOwogCitzdHJ1Y3Qgd21pXzEwXzRfZGJnbG9nX2NmZ19jbWQgeworCS8qIGJpdG1hc2sgdG8gaG9sZCBtb2QgaWQgY29uZmlnKi8KKwlfX2xlNjQgbW9kdWxlX2VuYWJsZTsKKworCS8qIHNlZSBBVEgxMEtfREJHTE9HX0NGR18gKi8KKwlfX2xlMzIgY29uZmlnX2VuYWJsZTsKKworCS8qIG1hc2sgb2YgbW9kdWxlIGlkIGJpdHMgdG8gYmUgY2hhbmdlZCAqLworCV9fbGU2NCBtb2R1bGVfdmFsaWQ7CisKKwkvKiBtYXNrIG9mIGNvbmZpZyBiaXRzIHRvIGJlIGNoYW5nZWQsIHNlZSBBVEgxMEtfREJHTE9HX0NGR18gKi8KKwlfX2xlMzIgY29uZmlnX3ZhbGlkOworfSBfX3BhY2tlZDsKKwogZW51bSB3bWlfcm9hbV9yZWFzb24gewogCVdNSV9ST0FNX1JFQVNPTl9CRVRURVJfQVAgPSAxLAogCVdNSV9ST0FNX1JFQVNPTl9CRUFDT05fTUlTUyA9IDIsCkBAIC02Mjk2LDYgKzYzMTUsMTAgQEAKIAlfX2xlMzIgcnNzaTsKIH07CiAKK3N0cnVjdCB3bWlfZWNob19ldl9hcmcgeworCV9fbGUzMiB2YWx1ZTsKK307CisKIHN0cnVjdCB3bWlfcGRldl90ZW1wZXJhdHVyZV9ldmVudCB7CiAJLyogdGVtcGVyYXR1cmUgdmFsdWUgaW4gQ2VsY2l1cyBkZWdyZWUgKi8KIAlfX2xlMzIgdGVtcGVyYXR1cmU7CkBAIC02NjI0LDUgKzY2NDcsNiBAQAogCQkJCSAgICAgIGNoYXIgKmJ1Zik7CiBpbnQgYXRoMTBrX3dtaV9vcF9nZXRfdmRldl9zdWJ0eXBlKHN0cnVjdCBhdGgxMGsgKmFyLAogCQkJCSAgIGVudW0gd21pX3ZkZXZfc3VidHlwZSBzdWJ0eXBlKTsKK2ludCBhdGgxMGtfd21pX2JhcnJpZXIoc3RydWN0IGF0aDEwayAqYXIpOwogCiAjZW5kaWYgLyogX1dNSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVidWcuYwppbmRleCA5MjlkN2NjLi40ZjhkOWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVidWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVidWcuYwpAQCAtOTA5LDcgKzkwOSw3IEBACiAJc3RydWN0IGF0aDVrX2h3ICphaCA9IGlub2RlLT5pX3ByaXZhdGU7CiAJYm9vbCByZXM7CiAJaW50IGksIHJldDsKLQl1MzIgZWVzaXplOworCXUzMiBlZXNpemU7CS8qIE5COiBpbiAxNi1iaXQgd29yZHMgKi8KIAl1MTYgdmFsLCAqYnVmOwogCiAJLyogR2V0IGVlcHJvbSBzaXplICovCkBAIC05MzIsNyArOTMyLDcgQEAKIAogCS8qIENyZWF0ZSBidWZmZXIgYW5kIHJlYWQgaW4gZWVwcm9tICovCiAKLQlidWYgPSB2bWFsbG9jKGVlc2l6ZSk7CisJYnVmID0gdm1hbGxvYyhlZXNpemUgKiAyKTsKIAlpZiAoIWJ1ZikgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKQEAgLTk1Miw3ICs5NTIsNyBAQAogCX0KIAogCWVwLT5idWYgPSBidWY7Ci0JZXAtPmxlbiA9IGk7CisJZXAtPmxlbiA9IGVlc2l6ZSAqIDI7CiAKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKWVwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NmZzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NmZzgwMjExLmMKaW5kZXggNzJlMmVjNi4uYjdmZTBhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuYwpAQCAtMTQ0OSwxNCArMTQ0OSwxNCBAQAogCQlyZXR1cm4gLUVJTzsKIAogCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSkgewotCQlhci0+dHhfcHdyID0gMDsKKwkJYXItPnR4X3B3ciA9IDI1NTsKIAogCQlpZiAoYXRoNmtsX3dtaV9nZXRfdHhfcHdyX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgpICE9IDApIHsKIAkJCWF0aDZrbF9lcnIoImF0aDZrbF93bWlfZ2V0X3R4X3B3cl9jbWQgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXItPmV2ZW50X3dxLCBhci0+dHhfcHdyICE9IDAsCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGFyLT5ldmVudF93cSwgYXItPnR4X3B3ciAhPSAyNTUsCiAJCQkJCQkgNSAqIEhaKTsKIAogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2hpZi5jCmluZGV4IDE4YzA3MDguLmQxOTQyNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9oaWYuYwpAQCAtNjQsNyArNjQsNyBAQAogfQogRVhQT1JUX1NZTUJPTChhdGg2a2xfaGlmX3J3X2NvbXBfaGFuZGxlcik7CiAKLSNkZWZpbmUgUkVHX0RVTVBfQ09VTlRfQVI2MDAzICAgNjAKKyNkZWZpbmUgUkVHSVNURVJfRFVNUF9DT1VOVCAgICAgNjAKICNkZWZpbmUgUkVHSVNURVJfRFVNUF9MRU5fTUFYICAgNjAKIAogc3RhdGljIHZvaWQgYXRoNmtsX2hpZl9kdW1wX2Z3X2NyYXNoKHN0cnVjdCBhdGg2a2wgKmFyKQpAQCAtNzMsOSArNzMsNiBAQAogCXUzMiBpLCBhZGRyZXNzLCByZWdkdW1wX2FkZHIgPSAwOwogCWludCByZXQ7CiAKLQlpZiAoYXItPnRhcmdldF90eXBlICE9IFRBUkdFVF9UWVBFX0FSNjAwMykKLQkJcmV0dXJuOwotCiAJLyogdGhlIHJlZyBkdW1wIHBvaW50ZXIgaXMgY29waWVkIHRvIHRoZSBob3N0IGludGVyZXN0IGFyZWEgKi8KIAlhZGRyZXNzID0gYXRoNmtsX2dldF9oaV9pdGVtX2FkZHIoYXIsIEhJX0lURU0oaGlfZmFpbHVyZV9zdGF0ZSkpOwogCWFkZHJlc3MgPSBUQVJHX1ZUT1AoYXItPnRhcmdldF90eXBlLCBhZGRyZXNzKTsKQEAgLTk1LDcgKzkyLDcgQEAKIAogCS8qIGZldGNoIHJlZ2lzdGVyIGR1bXAgZGF0YSAqLwogCXJldCA9IGF0aDZrbF9kaWFnX3JlYWQoYXIsIHJlZ2R1bXBfYWRkciwgKHU4ICopJnJlZ2R1bXBfdmFsWzBdLAotCQkJCSAgUkVHX0RVTVBfQ09VTlRfQVI2MDAzICogKHNpemVvZih1MzIpKSk7CisJCQkJICBSRUdJU1RFUl9EVU1QX0NPVU5UICogKHNpemVvZih1MzIpKSk7CiAJaWYgKHJldCkgewogCQlhdGg2a2xfd2FybigiZmFpbGVkIHRvIGdldCByZWdpc3RlciBkdW1wOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuOwpAQCAtMTA1LDkgKzEwMiw5IEBACiAJYXRoNmtsX2luZm8oImh3IDB4JXggZncgJXNcbiIsIGFyLT53aXBoeS0+aHdfdmVyc2lvbiwKIAkJICAgIGFyLT53aXBoeS0+ZndfdmVyc2lvbik7CiAKLQlCVUlMRF9CVUdfT04oUkVHX0RVTVBfQ09VTlRfQVI2MDAzICUgNCk7CisJQlVJTERfQlVHX09OKFJFR0lTVEVSX0RVTVBfQ09VTlQgJSA0KTsKIAotCWZvciAoaSA9IDA7IGkgPCBSRUdfRFVNUF9DT1VOVF9BUjYwMDM7IGkgKz0gNCkgeworCWZvciAoaSA9IDA7IGkgPCBSRUdJU1RFUl9EVU1QX0NPVU5UOyBpICs9IDQpIHsKIAkJYXRoNmtsX2luZm8oIiVkOiAweCU4Ljh4IDB4JTguOHggMHglOC44eCAweCU4Ljh4XG4iLAogCQkJICAgIGksCiAJCQkgICAgbGUzMl90b19jcHUocmVnZHVtcF92YWxbaV0pLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC93bWkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvd21pLmMKaW5kZXggYjhjZjA0ZC4uM2ZkMWNjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC93bWkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3dtaS5jCkBAIC0zNTIwLDcgKzM1MjAsNyBAQAogCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX0FQX1NFVF9QVkJfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogaW50IGF0aDZrbF93bWlfc2V0X3J4X2ZyYW1lX2Zvcm1hdF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9LY29uZmlnCmluZGV4IGY2OGNiMDAuLjhmMjMxYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9LY29uZmlnCkBAIC0xODAsNyArMTgwLDcgQEAKIGNvbmZpZyBBVEg5S19IV1JORwogCWJvb2wgIlJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBBVEg5SyAmJiAoSFdfUkFORE9NID0geSB8fCBIV19SQU5ET00gPSBBVEg5SykKLQlkZWZhdWx0IHkKKwlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCiAJICBUaGlzIG9wdGlvbiBpbmNvcnBvcmF0ZXMgdGhlIEFEQyByZWdpc3RlciBvdXRwdXQgYXMgYSBzb3VyY2Ugb2YKIAkgIHJhbmRvbW5lc3MgaW50byBMaW51eCBlbnRyb3B5IHBvb2wgKC9kZXYvdXJhbmRvbSBhbmQgL2Rldi9yYW5kb20pCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI1MDA4X3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyNTAwOF9waHkuYwppbmRleCAxYjI3MWI5Li44ZWVhOGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI1MDA4X3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjUwMDhfcGh5LmMKQEAgLTI2MCw4ICsyNjAsOCBAQAogCWludCBjdXJfYmluOwogCWludCB1cHBlciwgbG93ZXIsIGN1cl92aXRfbWFzazsKIAlpbnQgaTsKLQlpbnQ4X3QgbWFza19tWzEyM107Ci0JaW50OF90IG1hc2tfcFsxMjNdOworCWludDhfdCBtYXNrX21bMTIzXSA9IHswfTsKKwlpbnQ4X3QgbWFza19wWzEyM10gPSB7MH07CiAJaW50OF90IG1hc2tfYW10OwogCWludCB0bXBfbWFzazsKIAlzdGF0aWMgY29uc3QgaW50IHBpbG90X21hc2tfcmVnWzRdID0gewpAQCAtMjc0LDkgKzI3NCw2IEBACiAJfTsKIAlzdGF0aWMgY29uc3QgaW50IGluY1s0XSA9IHsgMCwgMTAwLCAwLCAwIH07CiAKLQltZW1zZXQoJm1hc2tfbSwgMCwgc2l6ZW9mKGludDhfdCkgKiAxMjMpOwotCW1lbXNldCgmbWFza19wLCAwLCBzaXplb2YoaW50OF90KSAqIDEyMyk7Ci0KIAljdXJfYmluID0gLTYwMDA7CiAJdXBwZXIgPSBiaW4gKyAxMDA7CiAJbG93ZXIgPSBiaW4gLSAxMDA7CkBAIC0zMDIsNyArMjk5LDcgQEAKIAl1cHBlciA9IGJpbiArIDEyMDsKIAlsb3dlciA9IGJpbiAtIDEyMDsKIAotCWZvciAoaSA9IDA7IGkgPCAxMjM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1hc2tfbSk7IGkrKykgewogCQlpZiAoKGN1cl92aXRfbWFzayA+IGxvd2VyKSAmJiAoY3VyX3ZpdF9tYXNrIDwgdXBwZXIpKSB7CiAJCQkvKiB3b3JrYXJvdW5kIGZvciBnY2MgYnVnICMzNzAxNCAqLwogCQkJdm9sYXRpbGUgaW50IHRtcF92ID0gYWJzKGN1cl92aXRfbWFzayAtIGJpbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYwppbmRleCA1YmQyY2JhLi4wODYwN2Q3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmMKQEAgLTMyNTIsNyArMzI1Miw4IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbWRhdGFfc2l6ZSAvIDI7IGkrKywgZGF0YSsrKQotCQlhdGg5a19od19udnJhbV9yZWFkKGFoLCBpLCBkYXRhKTsKKwkJaWYgKCFhdGg5a19od19udnJhbV9yZWFkKGFoLCBpLCBkYXRhKSkKKwkJCXJldHVybiAtRUlPOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMjgyLDcgKzMyODMsOCBAQAogCWlmIChhdGg5a19od191c2VfZmxhc2goYWgpKSB7CiAJCXU4IHR4cng7CiAKLQkJYXI5MzAwX2VlcHJvbV9yZXN0b3JlX2ZsYXNoKGFoLCBtcHRyLCBtZGF0YV9zaXplKTsKKwkJaWYgKGFyOTMwMF9lZXByb21fcmVzdG9yZV9mbGFzaChhaCwgbXB0ciwgbWRhdGFfc2l6ZSkpCisJCQlyZXR1cm4gLUVJTzsKIAogCQkvKiBjaGVjayBpZiBlZXByb20gY29udGFpbnMgdmFsaWQgZGF0YSAqLwogCQllZXAgPSAoc3RydWN0IGFyOTMwMF9lZXByb20gKikgbXB0cjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ncGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZ3Bpby5jCmluZGV4IDQ5MGY3NGQuLmRkYjI4ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ncGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2dwaW8uYwpAQCAtMjIsNyArMjIsNyBAQAogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0xFRFMKIAotdm9pZCBhdGhfZmlsbF9sZWRfcGluKHN0cnVjdCBhdGhfc29mdGMgKnNjKQorc3RhdGljIHZvaWQgYXRoX2ZpbGxfbGVkX3BpbihzdHJ1Y3QgYXRoX3NvZnRjICpzYykKIHsKIAlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYwppbmRleCBkMWQwYzA2Li4xNGIxM2YwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYwpAQCAtMjQ4Miw2ICsyNDgyLDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJYXRoOWtfZ3Bpb19jYXBfaW5pdChhaCk7CisKIAlpZiAoQVJfU1JFVl85NDg1KGFoKSB8fAogCSAgICBBUl9TUkVWXzkyODUoYWgpIHx8CiAJICAgIEFSX1NSRVZfOTMzMChhaCkgfHwKQEAgLTI1MzEsOCArMjUzMyw2IEBACiAJZWxzZQogCQlwQ2FwLT5od19jYXBzICY9IH5BVEg5S19IV19DQVBfSFQ7CiAKLQlhdGg5a19ncGlvX2NhcF9pbml0KGFoKTsKLQogCWlmIChBUl9TUkVWXzkxNjBfMTBfT1JfTEFURVIoYWgpIHx8IEFSX1NSRVZfOTEwMChhaCkpCiAJCXBDYXAtPnJ0c19hZ2dyX2xpbWl0ID0gQVRIX0FNUERVX0xJTUlUX01BWDsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYwppbmRleCBhMzk0NjIyLi5lOWYzMmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMKQEAgLTcxOCw5ICs3MTgsMTIgQEAKIAlpZiAoIWF0aF9jb21wbGV0ZV9yZXNldChzYywgZmFsc2UpKQogCQlhaC0+cmVzZXRfcG93ZXJfb24gPSBmYWxzZTsKIAotCWlmIChhaC0+bGVkX3BpbiA+PSAwKQorCWlmIChhaC0+bGVkX3BpbiA+PSAwKSB7CiAJCWF0aDlrX2h3X3NldF9ncGlvKGFoLCBhaC0+bGVkX3BpbiwKIAkJCQkgIChhaC0+Y29uZmlnLmxlZF9hY3RpdmVfaGlnaCkgPyAxIDogMCk7CisJCWF0aDlrX2h3X2dwaW9fcmVxdWVzdF9vdXQoYWgsIGFoLT5sZWRfcGluLCBOVUxMLAorCQkJCQkgIEFSX0dQSU9fT1VUUFVUX01VWF9BU19PVVRQVVQpOworCX0KIAogCS8qCiAJICogUmVzZXQga2V5IGNhY2hlIHRvIHNhbmUgZGVmYXVsdHMgKGFsbCBlbnRyaWVzIGNsZWFyZWQpIGluc3RlYWQgb2YKQEAgLTg2NCw5ICs4NjcsMTEgQEAKIAogCXNwaW5fbG9ja19iaCgmc2MtPnNjX3BjdV9sb2NrKTsKIAotCWlmIChhaC0+bGVkX3BpbiA+PSAwKQorCWlmIChhaC0+bGVkX3BpbiA+PSAwKSB7CiAJCWF0aDlrX2h3X3NldF9ncGlvKGFoLCBhaC0+bGVkX3BpbiwKIAkJCQkgIChhaC0+Y29uZmlnLmxlZF9hY3RpdmVfaGlnaCkgPyAwIDogMSk7CisJCWF0aDlrX2h3X2dwaW9fcmVxdWVzdF9pbihhaCwgYWgtPmxlZF9waW4sIE5VTEwpOworCX0KIAogCWF0aF9wcmVwYXJlX3Jlc2V0KHNjKTsKIApAQCAtOTE5LDcgKzkyNCw3IEBACiAJfSBlbHNlIHsKIAkJaWYgKGl0ZXJfZGF0YS0+cHJpbWFyeV9iZWFjb25fdmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQICYmCiAJCSAgICB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCi0JCWl0ZXJfZGF0YS0+cHJpbWFyeV9iZWFjb25fdmlmID0gdmlmOworCQkJaXRlcl9kYXRhLT5wcmltYXJ5X2JlYWNvbl92aWYgPSB2aWY7CiAJfQogCiAJaXRlcl9kYXRhLT5iZWFjb25zID0gdHJ1ZTsKQEAgLTExNTQsNiArMTE1OSw3IEBACiAJCWJvb2wgY2hhbmdlZCA9IChpdGVyX2RhdGEucHJpbWFyeV9zdGEgIT0gY3R4LT5wcmltYXJ5X3N0YSk7CiAKIAkJaWYgKGl0ZXJfZGF0YS5wcmltYXJ5X3N0YSkgeworCQkJaXRlcl9kYXRhLnByaW1hcnlfYmVhY29uX3ZpZiA9IGl0ZXJfZGF0YS5wcmltYXJ5X3N0YTsKIAkJCWl0ZXJfZGF0YS5iZWFjb25zID0gdHJ1ZTsKIAkJCWF0aDlrX3NldF9hc3NvY19zdGF0ZShzYywgaXRlcl9kYXRhLnByaW1hcnlfc3RhLAogCQkJCQkgICAgICBjaGFuZ2VkKTsKQEAgLTE1NjMsMTMgKzE1NjksMTMgQEAKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCk7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAob2xkX3N0YXRlID09IElFRUU4MDIxMV9TVEFfQVVUSCAmJgotCSAgICBuZXdfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9BU1NPQykgeworCWlmIChvbGRfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9OT1RFWElTVCAmJgorCSAgICBuZXdfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9OT05FKSB7CiAJCXJldCA9IGF0aDlrX3N0YV9hZGQoaHcsIHZpZiwgc3RhKTsKIAkJYXRoX2RiZyhjb21tb24sIENPTkZJRywKIAkJCSJBZGQgc3RhdGlvbjogJXBNXG4iLCBzdGEtPmFkZHIpOwotCX0gZWxzZSBpZiAob2xkX3N0YXRlID09IElFRUU4MDIxMV9TVEFfQVNTT0MgJiYKLQkJICAgbmV3X3N0YXRlID09IElFRUU4MDIxMV9TVEFfQVVUSCkgeworCX0gZWxzZSBpZiAob2xkX3N0YXRlID09IElFRUU4MDIxMV9TVEFfTk9ORSAmJgorCQkgICBuZXdfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9OT1RFWElTVCkgewogCQlyZXQgPSBhdGg5a19zdGFfcmVtb3ZlKGh3LCB2aWYsIHN0YSk7CiAJCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsCiAJCQkiUmVtb3ZlIHN0YXRpb246ICVwTVxuIiwgc3RhLT5hZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jCmluZGV4IDhkZGQ2MDQuLjUyYmZiYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYwpAQCAtNTAsOSArNTAsMTEgQEAKIHN0YXRpYyB2b2lkIGF0aF90eF9zZW5kX25vcm1hbChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSwKIAkJCSAgICAgICBzdHJ1Y3QgYXRoX2F0eF90aWQgKnRpZCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBzdGF0aWMgdm9pZCBhdGhfdHhfY29tcGxldGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgaW50IHR4X2ZsYWdzLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxKTsKKwkJCSAgICBpbnQgdHhfZmxhZ3MsIHN0cnVjdCBhdGhfdHhxICp0eHEsCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7CiBzdGF0aWMgdm9pZCBhdGhfdHhfY29tcGxldGVfYnVmKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX2J1ZiAqYmYsCiAJCQkJc3RydWN0IGF0aF90eHEgKnR4cSwgc3RydWN0IGxpc3RfaGVhZCAqYmZfcSwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAogCQkJCXN0cnVjdCBhdGhfdHhfc3RhdHVzICp0cywgaW50IHR4b2spOwogc3RhdGljIHZvaWQgYXRoX3R4X3R4cWFkZGJ1ZihzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSwKIAkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgYm9vbCBpbnRlcm5hbCk7CkBAIC03Nyw2ICs3OSwyMiBAQAogLyogQWdncmVnYXRpb24gbG9naWMgKi8KIC8qKioqKioqKioqKioqKioqKioqKiovCiAKK3N0YXRpYyB2b2lkIGF0aF90eF9zdGF0dXMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEgPSBpbmZvLT5zdGF0dXMuc3RhdHVzX2RyaXZlcl9kYXRhWzBdOworCisJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9SRVFfVFhfU1RBVFVTKSB7CisJCWllZWU4MDIxMV90eF9zdGF0dXMoaHcsIHNrYik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3RhKQorCQlpZWVlODAyMTFfdHhfc3RhdHVzX25vc2tiKGh3LCBzdGEsIGluZm8pOworCisJZGV2X2tmcmVlX3NrYihza2IpOworfQorCiB2b2lkIGF0aF90eHFfbG9jayhzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSkKIAlfX2FjcXVpcmVzKCZ0eHEtPmF4cV9sb2NrKQogewpAQCAtOTIsNiArMTEwLDcgQEAKIHZvaWQgYXRoX3R4cV91bmxvY2tfY29tcGxldGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfdHhxICp0eHEpCiAJX19yZWxlYXNlcygmdHhxLT5heHFfbG9jaykKIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHNjLT5odzsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHE7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIApAQCAtMTAwLDcgKzExOSw3IEBACiAJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCiAJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZxKSkpCi0JCWllZWU4MDIxMV90eF9zdGF0dXMoc2MtPmh3LCBza2IpOworCQlhdGhfdHhfc3RhdHVzKGh3LCBza2IpOwogfQogCiBzdGF0aWMgdm9pZCBhdGhfdHhfcXVldWVfdGlkKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxLApAQCAtMjUzLDcgKzI3Miw3IEBACiAJCX0KIAogCQlsaXN0X2FkZF90YWlsKCZiZi0+bGlzdCwgJmJmX2hlYWQpOwotCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgJnRzLCAwKTsKKwkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsIE5VTEwsICZ0cywgMCk7CiAJfQogCiAJaWYgKHNlbmRiYXIpIHsKQEAgLTMxOCwxMiArMzM3LDEyIEBACiAJCWJmID0gZmktPmJmOwogCiAJCWlmICghYmYpIHsKLQkJCWF0aF90eF9jb21wbGV0ZShzYywgc2tiLCBBVEhfVFhfRVJST1IsIHR4cSk7CisJCQlhdGhfdHhfY29tcGxldGUoc2MsIHNrYiwgQVRIX1RYX0VSUk9SLCB0eHEsIE5VTEwpOwogCQkJY29udGludWU7CiAJCX0KIAogCQlsaXN0X2FkZF90YWlsKCZiZi0+bGlzdCwgJmJmX2hlYWQpOwotCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgJnRzLCAwKTsKKwkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsIE5VTEwsICZ0cywgMCk7CiAJfQogfQogCkBAIC00MjYsMTUgKzQ0NSwxNCBAQAogCiBzdGF0aWMgdm9pZCBhdGhfdHhfY29tcGxldGVfYWdncihzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSwKIAkJCQkgc3RydWN0IGF0aF9idWYgKmJmLCBzdHJ1Y3QgbGlzdF9oZWFkICpiZl9xLAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCSBzdHJ1Y3QgYXRoX2F0eF90aWQgKnRpZCwKIAkJCQkgc3RydWN0IGF0aF90eF9zdGF0dXMgKnRzLCBpbnQgdHhvaykKIHsKIAlzdHJ1Y3QgYXRoX25vZGUgKmFuID0gTlVMTDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBzYy0+aHc7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm87Ci0Jc3RydWN0IGF0aF9hdHhfdGlkICp0aWQgPSBOVUxMOwogCXN0cnVjdCBhdGhfYnVmICpiZl9uZXh0LCAqYmZfbGFzdCA9IGJmLT5iZl9sYXN0YmY7CiAJc3RydWN0IGxpc3RfaGVhZCBiZl9oZWFkOwogCXN0cnVjdCBza19idWZmX2hlYWQgYmZfcGVuZGluZzsKQEAgLTQ2MCwxMiArNDc4LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgdHMtPnRzX3JhdGVpbmRleDsgaSsrKQogCQlyZXRyaWVzICs9IHJhdGVzW2ldLmNvdW50OwogCi0JcmN1X3JlYWRfbG9jaygpOwotCi0Jc3RhID0gaWVlZTgwMjExX2ZpbmRfc3RhX2J5X2lmYWRkcihodywgaGRyLT5hZGRyMSwgaGRyLT5hZGRyMik7CiAJaWYgKCFzdGEpIHsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0KIAkJSU5JVF9MSVNUX0hFQUQoJmJmX2hlYWQpOwogCQl3aGlsZSAoYmYpIHsKIAkJCWJmX25leHQgPSBiZi0+YmZfbmV4dDsKQEAgLTQ3Myw3ICs0ODYsNyBAQAogCQkJaWYgKCFiZi0+YmZfc3RhdGUuc3RhbGUgfHwgYmZfbmV4dCAhPSBOVUxMKQogCQkJCWxpc3RfbW92ZV90YWlsKCZiZi0+bGlzdCwgJmJmX2hlYWQpOwogCi0JCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgdHMsIDApOworCQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsIE5VTEwsIHRzLCAwKTsKIAogCQkJYmYgPSBiZl9uZXh0OwogCQl9CkBAIC00ODEsNyArNDk0LDYgQEAKIAl9CiAKIAlhbiA9IChzdHJ1Y3QgYXRoX25vZGUgKilzdGEtPmRydl9wcml2OwotCXRpZCA9IGF0aF9nZXRfc2tiX3RpZChzYywgYW4sIHNrYik7CiAJc2VxX2ZpcnN0ID0gdGlkLT5zZXFfc3RhcnQ7CiAJaXNiYSA9IHRzLT50c19mbGFncyAmIEFUSDlLX1RYX0JBOwogCkBAIC01ODMsNyArNTk1LDcgQEAKIAkJCQkJCQkJdHMpOwogCQkJfQogCi0JCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgdHMsCisJCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgc3RhLCB0cywKIAkJCQkhdHhmYWlsKTsKIAkJfSBlbHNlIHsKIAkJCWlmICh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUVVNfRU9TUCkgewpAQCAtNjA0LDcgKzYxNiw4IEBACiAJCQkJCWF0aF90eF91cGRhdGVfYmF3KHNjLCB0aWQsIHNlcW5vKTsKIAogCQkJCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLAotCQkJCQkJCSAgICAmYmZfaGVhZCwgdHMsIDApOworCQkJCQkJCSAgICAmYmZfaGVhZCwgTlVMTCwgdHMsCisJCQkJCQkJICAgIDApOwogCQkJCQliYXJfaW5kZXggPSBtYXhfdChpbnQsIGJhcl9pbmRleCwKIAkJCQkJCUFUSF9CQV9JTkRFWChzZXFfZmlyc3QsIHNlcW5vKSk7CiAJCQkJCWJyZWFrOwpAQCAtNjQ4LDggKzY2MSw2IEBACiAJCWF0aF90eHFfbG9jayhzYywgdHhxKTsKIAl9CiAKLQlyY3VfcmVhZF91bmxvY2soKTsKLQogCWlmIChuZWVkcmVzZXQpCiAJCWF0aDlrX3F1ZXVlX3Jlc2V0KHNjLCBSRVNFVF9UWVBFX1RYX0VSUk9SKTsKIH0KQEAgLTY2NCw3ICs2NzUsMTEgQEAKIAkJCQkgIHN0cnVjdCBhdGhfdHhfc3RhdHVzICp0cywgc3RydWN0IGF0aF9idWYgKmJmLAogCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqYmZfaGVhZCkKIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHNjLT5odzsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CisJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXN0cnVjdCBhdGhfYXR4X3RpZCAqdGlkID0gTlVMTDsKIAlib29sIHR4b2ssIGZsdXNoOwogCiAJdHhvayA9ICEodHMtPnRzX3N0YXR1cyAmIEFUSDlLX1RYRVJSX01BU0spOwpAQCAtNjc3LDYgKzY5MiwxNiBAQAogCiAJdHMtPmR1cmF0aW9uID0gYXRoOWtfaHdfZ2V0X2R1cmF0aW9uKHNjLT5zY19haCwgYmYtPmJmX2Rlc2MsCiAJCQkJCSAgICAgdHMtPnRzX3JhdGVpbmRleCk7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgYmYtPmJmX21wZHUtPmRhdGE7CisJc3RhID0gaWVlZTgwMjExX2ZpbmRfc3RhX2J5X2lmYWRkcihodywgaGRyLT5hZGRyMSwgaGRyLT5hZGRyMik7CisJaWYgKHN0YSkgeworCQlzdHJ1Y3QgYXRoX25vZGUgKmFuID0gKHN0cnVjdCBhdGhfbm9kZSAqKXN0YS0+ZHJ2X3ByaXY7CisJCXRpZCA9IGF0aF9nZXRfc2tiX3RpZChzYywgYW4sIGJmLT5iZl9tcGR1KTsKKwkJaWYgKHRzLT50c19zdGF0dXMgJiAoQVRIOUtfVFhFUlJfRklMVCB8IEFUSDlLX1RYRVJSX1hSRVRSWSkpCisJCQl0aWQtPmNsZWFyX3BzX2ZpbHRlciA9IHRydWU7CisJfQorCiAJaWYgKCFiZl9pc2FtcGR1KGJmKSkgewogCQlpZiAoIWZsdXNoKSB7CiAJCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihiZi0+YmZfbXBkdSk7CkBAIC02ODUsOSArNzEwLDkgQEAKIAkJCWF0aF90eF9yY19zdGF0dXMoc2MsIGJmLCB0cywgMSwgdHhvayA/IDAgOiAxLCB0eG9rKTsKIAkJCWF0aF9keW5hY2tfc2FtcGxlX3R4X3RzKHNjLT5zY19haCwgYmYtPmJmX21wZHUsIHRzKTsKIAkJfQotCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCBiZl9oZWFkLCB0cywgdHhvayk7CisJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsIGJmX2hlYWQsIHN0YSwgdHMsIHR4b2spOwogCX0gZWxzZQotCQlhdGhfdHhfY29tcGxldGVfYWdncihzYywgdHhxLCBiZiwgYmZfaGVhZCwgdHMsIHR4b2spOworCQlhdGhfdHhfY29tcGxldGVfYWdncihzYywgdHhxLCBiZiwgYmZfaGVhZCwgc3RhLCB0aWQsIHRzLCB0eG9rKTsKIAogCWlmICghZmx1c2gpCiAJCWF0aF90eHFfc2NoZWR1bGUoc2MsIHR4cSk7CkBAIC05MjMsNyArOTQ4LDcgQEAKIAkJCWxpc3RfYWRkKCZiZi0+bGlzdCwgJmJmX2hlYWQpOwogCQkJX19za2JfdW5saW5rKHNrYiwgKnEpOwogCQkJYXRoX3R4X3VwZGF0ZV9iYXcoc2MsIHRpZCwgc2Vxbm8pOwotCQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsICZ0cywgMCk7CisJCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgTlVMTCwgJnRzLCAwKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTE4MzIsNiArMTg1Nyw3IEBACiAgKi8KIHZvaWQgYXRoX2RyYWludHhxKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxKQogeworCXJjdV9yZWFkX2xvY2soKTsKIAlhdGhfdHhxX2xvY2soc2MsIHR4cSk7CiAKIAlpZiAoc2MtPnNjX2FoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfRURNQSkgewpAQCAtMTg1MCw2ICsxODc2LDcgQEAKIAlhdGhfZHJhaW5fdHhxX2xpc3Qoc2MsIHR4cSwgJnR4cS0+YXhxX3EpOwogCiAJYXRoX3R4cV91bmxvY2tfY29tcGxldGUoc2MsIHR4cSk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIGJvb2wgYXRoX2RyYWluX2FsbF90eHEoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCkBAIC0yNDcyLDcgKzI0OTksOCBAQAogLyoqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZCBhdGhfdHhfY29tcGxldGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgaW50IHR4X2ZsYWdzLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxKQorCQkJICAgIGludCB0eF9mbGFncywgc3RydWN0IGF0aF90eHEgKnR4cSwKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQogewogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCk7CkBAIC0yNDkyLDE1ICsyNTIwLDE3IEBACiAJCQl0eF9pbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7CiAJfQogCi0JcGFkcG9zID0gaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1lX2NvbnRyb2wpOwotCXBhZHNpemUgPSBwYWRwb3MgJiAzOwotCWlmIChwYWRzaXplICYmIHNrYi0+bGVuPnBhZHBvcytwYWRzaXplKSB7Ci0JCS8qCi0JCSAqIFJlbW92ZSBNQUMgaGVhZGVyIHBhZGRpbmcgYmVmb3JlIGdpdmluZyB0aGUgZnJhbWUgYmFjayB0bwotCQkgKiBtYWM4MDIxMS4KLQkJICovCi0JCW1lbW1vdmUoc2tiLT5kYXRhICsgcGFkc2l6ZSwgc2tiLT5kYXRhLCBwYWRwb3MpOwotCQlza2JfcHVsbChza2IsIHBhZHNpemUpOworCWlmICh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfUkVRX1RYX1NUQVRVUykgeworCQlwYWRwb3MgPSBpZWVlODAyMTFfaGRybGVuKGhkci0+ZnJhbWVfY29udHJvbCk7CisJCXBhZHNpemUgPSBwYWRwb3MgJiAzOworCQlpZiAocGFkc2l6ZSAmJiBza2ItPmxlbj5wYWRwb3MrcGFkc2l6ZSkgeworCQkJLyoKKwkJCSAqIFJlbW92ZSBNQUMgaGVhZGVyIHBhZGRpbmcgYmVmb3JlIGdpdmluZyB0aGUgZnJhbWUgYmFjayB0bworCQkJICogbWFjODAyMTEuCisJCQkgKi8KKwkJCW1lbW1vdmUoc2tiLT5kYXRhICsgcGFkc2l6ZSwgc2tiLT5kYXRhLCBwYWRwb3MpOworCQkJc2tiX3B1bGwoc2tiLCBwYWRzaXplKTsKKwkJfQogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzYy0+c2NfcG1fbG9jaywgZmxhZ3MpOwpAQCAtMjUxNSwxMiArMjU0NSwxNCBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYy0+c2NfcG1fbG9jaywgZmxhZ3MpOwogCi0JX19za2JfcXVldWVfdGFpbCgmdHhxLT5jb21wbGV0ZV9xLCBza2IpOwogCWF0aF90eHFfc2tiX2RvbmUoc2MsIHR4cSwgc2tiKTsKKwl0eF9pbmZvLT5zdGF0dXMuc3RhdHVzX2RyaXZlcl9kYXRhWzBdID0gc3RhOworCV9fc2tiX3F1ZXVlX3RhaWwoJnR4cS0+Y29tcGxldGVfcSwgc2tiKTsKIH0KIAogc3RhdGljIHZvaWQgYXRoX3R4X2NvbXBsZXRlX2J1ZihzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9idWYgKmJmLAogCQkJCXN0cnVjdCBhdGhfdHhxICp0eHEsIHN0cnVjdCBsaXN0X2hlYWQgKmJmX3EsCisJCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKIAkJCQlzdHJ1Y3QgYXRoX3R4X3N0YXR1cyAqdHMsIGludCB0eG9rKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSBiZi0+YmZfbXBkdTsKQEAgLTI1NDgsNyArMjU4MCw3IEBACiAJCQljb21wbGV0ZSgmc2MtPnBhcHJkX2NvbXBsZXRlKTsKIAl9IGVsc2UgewogCQlhdGhfZGVidWdfc3RhdF90eChzYywgYmYsIHRzLCB0eHEsIHR4X2ZsYWdzKTsKLQkJYXRoX3R4X2NvbXBsZXRlKHNjLCBza2IsIHR4X2ZsYWdzLCB0eHEpOworCQlhdGhfdHhfY29tcGxldGUoc2MsIHNrYiwgdHhfZmxhZ3MsIHR4cSwgc3RhKTsKIAl9CiBza2lwX3R4X2NvbXBsZXRlOgogCS8qIEF0IHRoaXMgcG9pbnQsIHNrYiAoYmYtPmJmX21wZHUpIGlzIGNvbnN1bWVkLi4ubWFrZSBzdXJlIHdlIGRvbid0CkBAIC0yNzAwLDEwICsyNzMyLDEyIEBACiAJdTMyIHFjdW1hc2sgPSAoKDEgPDwgQVRIOUtfTlVNX1RYX1FVRVVFUykgLSAxKSAmIGFoLT5pbnRyX3R4cXM7CiAJaW50IGk7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yIChpID0gMDsgaSA8IEFUSDlLX05VTV9UWF9RVUVVRVM7IGkrKykgewogCQlpZiAoQVRIX1RYUV9TRVRVUChzYywgaSkgJiYgKHFjdW1hc2sgJiAoMSA8PCBpKSkpCiAJCQlhdGhfdHhfcHJvY2Vzc3Eoc2MsICZzYy0+dHgudHhxW2ldKTsKIAl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIHZvaWQgYXRoX3R4X2VkbWFfdGFza2xldChzdHJ1Y3QgYXRoX3NvZnRjICpzYykKQEAgLTI3MTcsNiArMjc1MSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqZmlmb19saXN0OwogCWludCBzdGF0dXM7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yICg7OykgewogCQlpZiAodGVzdF9iaXQoQVRIX09QX0hXX1JFU0VULCAmY29tbW9uLT5vcF9mbGFncykpCiAJCQlicmVhazsKQEAgLTI3ODcsNiArMjgyMiw3IEBACiAJCWF0aF90eF9wcm9jZXNzX2J1ZmZlcihzYywgdHhxLCAmdHMsIGJmLCAmYmZfaGVhZCk7CiAJCWF0aF90eHFfdW5sb2NrX2NvbXBsZXRlKHNjLCB0eHEpOwogCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2RlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvZGVidWcuYwppbmRleCA2ODA4ZGI0Li5lYzNhNjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvZGVidWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvZGVidWcuYwpAQCAtNzUsNyArNzUsOCBAQAogCiAJaWYgKCFhcikKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JZGZvcHMgPSBjb250YWluZXJfb2YoZmlsZS0+Zl9vcCwgc3RydWN0IGNhcmw5MTcwX2RlYnVnZnNfZm9wcywgZm9wcyk7CisJZGZvcHMgPSBjb250YWluZXJfb2YoZGVidWdmc19yZWFsX2ZvcHMoZmlsZSksCisJCQkgICAgIHN0cnVjdCBjYXJsOTE3MF9kZWJ1Z2ZzX2ZvcHMsIGZvcHMpOwogCiAJaWYgKCFkZm9wcy0+cmVhZCkKIAkJcmV0dXJuIC1FTk9TWVM7CkBAIC0xMjcsNyArMTI4LDggQEAKIAogCWlmICghYXIpCiAJCXJldHVybiAtRU5PREVWOwotCWRmb3BzID0gY29udGFpbmVyX29mKGZpbGUtPmZfb3AsIHN0cnVjdCBjYXJsOTE3MF9kZWJ1Z2ZzX2ZvcHMsIGZvcHMpOworCWRmb3BzID0gY29udGFpbmVyX29mKGRlYnVnZnNfcmVhbF9mb3BzKGZpbGUpLAorCQkJICAgICBzdHJ1Y3QgY2FybDkxNzBfZGVidWdmc19mb3BzLCBmb3BzKTsKIAogCWlmICghZGZvcHMtPndyaXRlKQogCQlyZXR1cm4gLUVOT1NZUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC91c2IuYwppbmRleCA3Njg0MmU2Li45OWFiMjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3VzYi5jCkBAIC02NzAsNiArNjcwLDcgQEAKIAlhci0+cmVhZGxlbiA9IG91dGxlbjsKIAlzcGluX3VubG9ja19iaCgmYXItPmNtZF9sb2NrKTsKIAorCXJlaW5pdF9jb21wbGV0aW9uKCZhci0+Y21kX3dhaXQpOwogCWVyciA9IF9fY2FybDkxNzBfZXhlY19jbWQoYXIsICZhci0+Y21kLCBmYWxzZSk7CiAKIAlpZiAoIShjbWQgJiBDQVJMOTE3MF9DTURfQVNZTkNfRkxBRykpIHsKQEAgLTc3OCwxMCArNzc5LDcgQEAKIAlzcGluX2xvY2tfYmgoJmFyLT5jbWRfbG9jayk7CiAJYXItPnJlYWRsZW4gPSAwOwogCXNwaW5fdW5sb2NrX2JoKCZhci0+Y21kX2xvY2spOwotCWNvbXBsZXRlX2FsbCgmYXItPmNtZF93YWl0KTsKLQotCS8qIFRoaXMgaXMgcmVxdWlyZWQgdG8gcHJldmVudCBhbiBlYXJseSBjb21wbGV0aW9uIG9uIF9zdGFydCAqLwotCXJlaW5pdF9jb21wbGV0aW9uKCZhci0+Y21kX3dhaXQpOworCWNvbXBsZXRlKCZhci0+Y21kX3dhaXQpOwogCiAJLyoKIAkgKiBOb3RlOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Rmc19wYXR0ZXJuX2RldGVjdG9yLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvZGZzX3BhdHRlcm5fZGV0ZWN0b3IuYwppbmRleCAyZjgxMzZkLi40MTAwZmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvZGZzX3BhdHRlcm5fZGV0ZWN0b3IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvZGZzX3BhdHRlcm5fZGV0ZWN0b3IuYwpAQCAtMzM4LDcgKzMzOCw3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGZzX3BhdHRlcm5fZGV0ZWN0b3IgZGVmYXVsdF9kcGQgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGRmc19wYXR0ZXJuX2RldGVjdG9yIGRlZmF1bHRfZHBkID0gewogCS5leGl0CQk9IGRwZF9leGl0LAogCS5zZXRfZGZzX2RvbWFpbgk9IGRwZF9zZXRfZG9tYWluLAogCS5hZGRfcHVsc2UJPSBkcGRfYWRkX3B1bHNlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvY2ZnODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2NmZzgwMjExLmMKaW5kZXggZjBlMTE3NS4uZDExNzI0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9jZmc4MDIxMS5jCkBAIC0zNTQsMTAgKzM1NCwxMyBAQAogCXdpbF9kYmdfbWlzYyh3aWwsICIlcygpLCB3ZGV2PTB4JXAgaWZ0eXBlPSVkXG4iLAogCQkgICAgIF9fZnVuY19fLCB3ZGV2LCB3ZGV2LT5pZnR5cGUpOwogCisJbXV0ZXhfbG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CiAJaWYgKHdpbC0+c2Nhbl9yZXF1ZXN0KSB7CiAJCXdpbF9lcnIod2lsLCAiQWxyZWFkeSBzY2FubmluZ1xuIik7CisJCW11dGV4X3VubG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KKwltdXRleF91bmxvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOwogCiAJLyogY2hlY2sgd2UgYXJlIGNsaWVudCBzaWRlICovCiAJc3dpdGNoICh3ZGV2LT5pZnR5cGUpIHsKQEAgLTc2MCwxNCArNzYzLDExIEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgc3RydWN0IHdpbF90aWRfY3J5cHRvX3J4X3NpbmdsZSAqCi13aWxfZmluZF9jcnlwdG9fY3R4KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgdTgga2V5X2luZGV4LAotCQkgICAgZW51bSB3bWlfa2V5X3VzYWdlIGtleV91c2FnZSwgY29uc3QgdTggKm1hY19hZGRyKQorc3RhdGljIHN0cnVjdCB3aWxfc3RhX2luZm8gKgord2lsX2ZpbmRfc3RhX2J5X2tleV91c2FnZShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsCisJCQkgIGVudW0gd21pX2tleV91c2FnZSBrZXlfdXNhZ2UsIGNvbnN0IHU4ICptYWNfYWRkcikKIHsKIAlpbnQgY2lkID0gLUVJTlZBTDsKLQlpbnQgdGlkID0gMDsKLQlzdHJ1Y3Qgd2lsX3N0YV9pbmZvICpzOwotCXN0cnVjdCB3aWxfdGlkX2NyeXB0b19yeCAqYzsKIAogCWlmIChrZXlfdXNhZ2UgPT0gV01JX0tFWV9VU0VfVFhfR1JPVVApCiAJCXJldHVybiBOVUxMOyAvKiBub3QgbmVlZGVkICovCkBAIC03NzgsMTggKzc3OCw3MiBAQAogCWVsc2UgaWYgKGtleV91c2FnZSA9PSBXTUlfS0VZX1VTRV9SWF9HUk9VUCkKIAkJY2lkID0gd2lsX2ZpbmRfY2lkX2J5X2lkeCh3aWwsIDApOwogCWlmIChjaWQgPCAwKSB7Ci0JCXdpbF9lcnIod2lsLCAiTm8gQ0lEIGZvciAlcE0gJXNbJWRdXG4iLCBtYWNfYWRkciwKLQkJCWtleV91c2FnZV9zdHJba2V5X3VzYWdlXSwga2V5X2luZGV4KTsKKwkJd2lsX2Vycih3aWwsICJObyBDSUQgZm9yICVwTSAlc1xuIiwgbWFjX2FkZHIsCisJCQlrZXlfdXNhZ2Vfc3RyW2tleV91c2FnZV0pOwogCQlyZXR1cm4gRVJSX1BUUihjaWQpOwogCX0KIAotCXMgPSAmd2lsLT5zdGFbY2lkXTsKLQlpZiAoa2V5X3VzYWdlID09IFdNSV9LRVlfVVNFX1BBSVJXSVNFKQotCQljID0gJnMtPnRpZF9jcnlwdG9fcnhbdGlkXTsKLQllbHNlCi0JCWMgPSAmcy0+Z3JvdXBfY3J5cHRvX3J4OworCXJldHVybiAmd2lsLT5zdGFbY2lkXTsKK30KIAotCXJldHVybiAmYy0+a2V5X2lkW2tleV9pbmRleF07CitzdGF0aWMgdm9pZCB3aWxfc2V0X2NyeXB0b19yeCh1OCBrZXlfaW5kZXgsIGVudW0gd21pX2tleV91c2FnZSBrZXlfdXNhZ2UsCisJCQkgICAgICBzdHJ1Y3Qgd2lsX3N0YV9pbmZvICpjcywKKwkJCSAgICAgIHN0cnVjdCBrZXlfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHdpbF90aWRfY3J5cHRvX3J4X3NpbmdsZSAqY2M7CisJaW50IHRpZDsKKworCWlmICghY3MpCisJCXJldHVybjsKKworCXN3aXRjaCAoa2V5X3VzYWdlKSB7CisJY2FzZSBXTUlfS0VZX1VTRV9QQUlSV0lTRToKKwkJZm9yICh0aWQgPSAwOyB0aWQgPCBXSUxfU1RBX1RJRF9OVU07IHRpZCsrKSB7CisJCQljYyA9ICZjcy0+dGlkX2NyeXB0b19yeFt0aWRdLmtleV9pZFtrZXlfaW5kZXhdOworCQkJaWYgKHBhcmFtcy0+c2VxKQorCQkJCW1lbWNweShjYy0+cG4sIHBhcmFtcy0+c2VxLAorCQkJCSAgICAgICBJRUVFODAyMTFfR0NNUF9QTl9MRU4pOworCQkJZWxzZQorCQkJCW1lbXNldChjYy0+cG4sIDAsIElFRUU4MDIxMV9HQ01QX1BOX0xFTik7CisJCQljYy0+a2V5X3NldCA9IHRydWU7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXTUlfS0VZX1VTRV9SWF9HUk9VUDoKKwkJY2MgPSAmY3MtPmdyb3VwX2NyeXB0b19yeC5rZXlfaWRba2V5X2luZGV4XTsKKwkJaWYgKHBhcmFtcy0+c2VxKQorCQkJbWVtY3B5KGNjLT5wbiwgcGFyYW1zLT5zZXEsIElFRUU4MDIxMV9HQ01QX1BOX0xFTik7CisJCWVsc2UKKwkJCW1lbXNldChjYy0+cG4sIDAsIElFRUU4MDIxMV9HQ01QX1BOX0xFTik7CisJCWNjLT5rZXlfc2V0ID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCB3aWxfZGVsX3J4X2tleSh1OCBrZXlfaW5kZXgsIGVudW0gd21pX2tleV91c2FnZSBrZXlfdXNhZ2UsCisJCQkgICBzdHJ1Y3Qgd2lsX3N0YV9pbmZvICpjcykKK3sKKwlzdHJ1Y3Qgd2lsX3RpZF9jcnlwdG9fcnhfc2luZ2xlICpjYzsKKwlpbnQgdGlkOworCisJaWYgKCFjcykKKwkJcmV0dXJuOworCisJc3dpdGNoIChrZXlfdXNhZ2UpIHsKKwljYXNlIFdNSV9LRVlfVVNFX1BBSVJXSVNFOgorCQlmb3IgKHRpZCA9IDA7IHRpZCA8IFdJTF9TVEFfVElEX05VTTsgdGlkKyspIHsKKwkJCWNjID0gJmNzLT50aWRfY3J5cHRvX3J4W3RpZF0ua2V5X2lkW2tleV9pbmRleF07CisJCQljYy0+a2V5X3NldCA9IGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2UgV01JX0tFWV9VU0VfUlhfR1JPVVA6CisJCWNjID0gJmNzLT5ncm91cF9jcnlwdG9fcngua2V5X2lkW2tleV9pbmRleF07CisJCWNjLT5rZXlfc2V0ID0gZmFsc2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KIH0KIAogc3RhdGljIGludCB3aWxfY2ZnODAyMTFfYWRkX2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LApAQCAtODAxLDI0ICs4NTUsMjYgQEAKIAlpbnQgcmM7CiAJc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsID0gd2lwaHlfdG9fd2lsKHdpcGh5KTsKIAllbnVtIHdtaV9rZXlfdXNhZ2Uga2V5X3VzYWdlID0gd2lsX2RldGVjdF9rZXlfdXNhZ2Uod2lsLCBwYWlyd2lzZSk7Ci0Jc3RydWN0IHdpbF90aWRfY3J5cHRvX3J4X3NpbmdsZSAqY2MgPSB3aWxfZmluZF9jcnlwdG9fY3R4KHdpbCwKLQkJCQkJCQkJICBrZXlfaW5kZXgsCi0JCQkJCQkJCSAga2V5X3VzYWdlLAotCQkJCQkJCQkgIG1hY19hZGRyKTsKKwlzdHJ1Y3Qgd2lsX3N0YV9pbmZvICpjcyA9IHdpbF9maW5kX3N0YV9ieV9rZXlfdXNhZ2Uod2lsLCBrZXlfdXNhZ2UsCisJCQkJCQkJICAgIG1hY19hZGRyKTsKKworCWlmICghcGFyYW1zKSB7CisJCXdpbF9lcnIod2lsLCAiTlVMTCBwYXJhbXNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAl3aWxfZGJnX21pc2Mod2lsLCAiJXMoJXBNICVzWyVkXSBQTiAlKnBoTilcbiIsIF9fZnVuY19fLAogCQkgICAgIG1hY19hZGRyLCBrZXlfdXNhZ2Vfc3RyW2tleV91c2FnZV0sIGtleV9pbmRleCwKIAkJICAgICBwYXJhbXMtPnNlcV9sZW4sIHBhcmFtcy0+c2VxKTsKIAotCWlmIChJU19FUlIoY2MpKSB7CisJaWYgKElTX0VSUihjcykpIHsKIAkJd2lsX2Vycih3aWwsICJOb3QgY29ubmVjdGVkLCAlcyglcE0gJXNbJWRdIFBOICUqcGhOKVxuIiwKIAkJCV9fZnVuY19fLCBtYWNfYWRkciwga2V5X3VzYWdlX3N0cltrZXlfdXNhZ2VdLCBrZXlfaW5kZXgsCiAJCQlwYXJhbXMtPnNlcV9sZW4sIHBhcmFtcy0+c2VxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGNjKQotCQljYy0+a2V5X3NldCA9IGZhbHNlOworCXdpbF9kZWxfcnhfa2V5KGtleV9pbmRleCwga2V5X3VzYWdlLCBjcyk7CiAKIAlpZiAocGFyYW1zLT5zZXEgJiYgcGFyYW1zLT5zZXFfbGVuICE9IElFRUU4MDIxMV9HQ01QX1BOX0xFTikgewogCQl3aWxfZXJyKHdpbCwKQEAgLTgzMSwxMyArODg3LDggQEAKIAogCXJjID0gd21pX2FkZF9jaXBoZXJfa2V5KHdpbCwga2V5X2luZGV4LCBtYWNfYWRkciwgcGFyYW1zLT5rZXlfbGVuLAogCQkJCXBhcmFtcy0+a2V5LCBrZXlfdXNhZ2UpOwotCWlmICgocmMgPT0gMCkgJiYgY2MpIHsKLQkJaWYgKHBhcmFtcy0+c2VxKQotCQkJbWVtY3B5KGNjLT5wbiwgcGFyYW1zLT5zZXEsIElFRUU4MDIxMV9HQ01QX1BOX0xFTik7Ci0JCWVsc2UKLQkJCW1lbXNldChjYy0+cG4sIDAsIElFRUU4MDIxMV9HQ01QX1BOX0xFTik7Ci0JCWNjLT5rZXlfc2V0ID0gdHJ1ZTsKLQl9CisJaWYgKCFyYykKKwkJd2lsX3NldF9jcnlwdG9fcngoa2V5X2luZGV4LCBrZXlfdXNhZ2UsIGNzLCBwYXJhbXMpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtODQ5LDIwICs5MDAsMTggQEAKIHsKIAlzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwgPSB3aXBoeV90b193aWwod2lwaHkpOwogCWVudW0gd21pX2tleV91c2FnZSBrZXlfdXNhZ2UgPSB3aWxfZGV0ZWN0X2tleV91c2FnZSh3aWwsIHBhaXJ3aXNlKTsKLQlzdHJ1Y3Qgd2lsX3RpZF9jcnlwdG9fcnhfc2luZ2xlICpjYyA9IHdpbF9maW5kX2NyeXB0b19jdHgod2lsLAotCQkJCQkJCQkgIGtleV9pbmRleCwKLQkJCQkJCQkJICBrZXlfdXNhZ2UsCi0JCQkJCQkJCSAgbWFjX2FkZHIpOworCXN0cnVjdCB3aWxfc3RhX2luZm8gKmNzID0gd2lsX2ZpbmRfc3RhX2J5X2tleV91c2FnZSh3aWwsIGtleV91c2FnZSwKKwkJCQkJCQkgICAgbWFjX2FkZHIpOwogCiAJd2lsX2RiZ19taXNjKHdpbCwgIiVzKCVwTSAlc1slZF0pXG4iLCBfX2Z1bmNfXywgbWFjX2FkZHIsCiAJCSAgICAga2V5X3VzYWdlX3N0cltrZXlfdXNhZ2VdLCBrZXlfaW5kZXgpOwogCi0JaWYgKElTX0VSUihjYykpCisJaWYgKElTX0VSUihjcykpCiAJCXdpbF9pbmZvKHdpbCwgIk5vdCBjb25uZWN0ZWQsICVzKCVwTSAlc1slZF0pXG4iLCBfX2Z1bmNfXywKIAkJCSBtYWNfYWRkciwga2V5X3VzYWdlX3N0cltrZXlfdXNhZ2VdLCBrZXlfaW5kZXgpOwogCi0JaWYgKCFJU19FUlJfT1JfTlVMTChjYykpCi0JCWNjLT5rZXlfc2V0ID0gZmFsc2U7CisJaWYgKCFJU19FUlJfT1JfTlVMTChjcykpCisJCXdpbF9kZWxfcnhfa2V5KGtleV9pbmRleCwga2V5X3VzYWdlLCBjcyk7CiAKIAlyZXR1cm4gd21pX2RlbF9jaXBoZXJfa2V5KHdpbCwga2V5X2luZGV4LCBtYWNfYWRkciwga2V5X3VzYWdlKTsKIH0KQEAgLTEzNjMsMjMgKzE0MTIsMTYgQEAKIAkJCQkJIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpCiB7CiAJc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsID0gd2lwaHlfdG9fd2lsKHdpcGh5KTsKLQl1OCBzdGFydGVkOworCXN0cnVjdCB3aWxfcDJwX2luZm8gKnAycCA9ICZ3aWwtPnAycDsKKworCWlmICghcDJwLT5wMnBfZGV2X3N0YXJ0ZWQpCisJCXJldHVybjsKIAogCXdpbF9kYmdfbWlzYyh3aWwsICIlczogZW50ZXJlZFxuIiwgX19mdW5jX18pOwogCW11dGV4X2xvY2soJndpbC0+bXV0ZXgpOwotCXN0YXJ0ZWQgPSB3aWxfcDJwX3N0b3BfZGlzY292ZXJ5KHdpbCk7Ci0JaWYgKHN0YXJ0ZWQgJiYgd2lsLT5zY2FuX3JlcXVlc3QpIHsKLQkJc3RydWN0IGNmZzgwMjExX3NjYW5faW5mbyBpbmZvID0gewotCQkJLmFib3J0ZWQgPSB0cnVlLAotCQl9OwotCi0JCWNmZzgwMjExX3NjYW5fZG9uZSh3aWwtPnNjYW5fcmVxdWVzdCwgJmluZm8pOwotCQl3aWwtPnNjYW5fcmVxdWVzdCA9IE5VTEw7Ci0JCXdpbC0+cmFkaW9fd2RldiA9IHdpbC0+d2RldjsKLQl9CisJd2lsX3AycF9zdG9wX3JhZGlvX29wZXJhdGlvbnMod2lsKTsKKwlwMnAtPnAycF9kZXZfc3RhcnRlZCA9IDA7CiAJbXV0ZXhfdW5sb2NrKCZ3aWwtPm11dGV4KTsKLQotCXdpbC0+cDJwLnAycF9kZXZfc3RhcnRlZCA9IDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2ZnODAyMTFfb3BzIHdpbF9jZmc4MDIxMV9vcHMgPSB7CkBAIC0xNDY0LDE0ICsxNTA2LDggQEAKIAlzZXRfd2lwaHlfZGV2KHdkZXYtPndpcGh5LCBkZXYpOwogCXdpbF93aXBoeV9pbml0KHdkZXYtPndpcGh5KTsKIAotCXJjID0gd2lwaHlfcmVnaXN0ZXIod2Rldi0+d2lwaHkpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gb3V0X2ZhaWxlZF9yZWc7Ci0KIAlyZXR1cm4gd2RldjsKIAotb3V0X2ZhaWxlZF9yZWc6Ci0Jd2lwaHlfZnJlZSh3ZGV2LT53aXBoeSk7CiBvdXQ6CiAJa2ZyZWUod2Rldik7CiAKQEAgLTE0ODcsNyArMTUyMyw2IEBACiAJaWYgKCF3ZGV2KQogCQlyZXR1cm47CiAKLQl3aXBoeV91bnJlZ2lzdGVyKHdkZXYtPndpcGh5KTsKIAl3aXBoeV9mcmVlKHdkZXYtPndpcGh5KTsKIAlrZnJlZSh3ZGV2KTsKIH0KQEAgLTE0OTgsMTEgKzE1MzMsMTEgQEAKIAogCW11dGV4X2xvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOwogCXAycF93ZGV2ID0gd2lsLT5wMnBfd2RldjsKKwl3aWwtPnAycF93ZGV2ID0gTlVMTDsKKwl3aWwtPnJhZGlvX3dkZXYgPSB3aWxfdG9fd2Rldih3aWwpOworCW11dGV4X3VubG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CiAJaWYgKHAycF93ZGV2KSB7Ci0JCXdpbC0+cDJwX3dkZXYgPSBOVUxMOwotCQl3aWwtPnJhZGlvX3dkZXYgPSB3aWxfdG9fd2Rldih3aWwpOwogCQljZmc4MDIxMV91bnJlZ2lzdGVyX3dkZXYocDJwX3dkZXYpOwogCQlrZnJlZShwMnBfd2Rldik7CiAJfQotCW11dGV4X3VubG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9kZWJ1Z2ZzLmMKaW5kZXggYTgwOThiNC4uNWU0MDU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2RlYnVnZnMuYwpAQCAtMTU1Myw2ICsxNTUzLDU2IEBACiAJLm9wZW4gID0gc2ltcGxlX29wZW4sCiB9OwogCisvKi0tLS0tLS0tLUZXIGNhcGFiaWxpdGllcy0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHdpbF9md19jYXBhYmlsaXRpZXNfZGVidWdmc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwgPSBzLT5wcml2YXRlOworCisJc2VxX3ByaW50ZihzLCAiZndfY2FwYWJpbGl0aWVzIDogJSpwYlxuIiwgV01JX0ZXX0NBUEFCSUxJVFlfTUFYLAorCQkgICB3aWwtPmZ3X2NhcGFiaWxpdGllcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3aWxfZndfY2FwYWJpbGl0aWVzX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCB3aWxfZndfY2FwYWJpbGl0aWVzX2RlYnVnZnNfc2hvdywKKwkJCSAgIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzX2Z3X2NhcGFiaWxpdGllcyA9IHsKKwkub3BlbgkJPSB3aWxfZndfY2FwYWJpbGl0aWVzX3NlcV9vcGVuLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCit9OworCisvKi0tLS0tLS0tLUZXIHZlcnNpb24tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCB3aWxfZndfdmVyc2lvbl9kZWJ1Z2ZzX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCA9IHMtPnByaXZhdGU7CisKKwlpZiAod2lsLT5md192ZXJzaW9uWzBdKQorCQlzZXFfcHJpbnRmKHMsICIlc1xuIiwgd2lsLT5md192ZXJzaW9uKTsKKwllbHNlCisJCXNlcV9wdXRzKHMsICJOL0FcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2lsX2Z3X3ZlcnNpb25fc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHdpbF9md192ZXJzaW9uX2RlYnVnZnNfc2hvdywKKwkJCSAgIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzX2Z3X3ZlcnNpb24gPSB7CisJLm9wZW4JCT0gd2lsX2Z3X3ZlcnNpb25fc2VxX29wZW4sCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKK307CisKIC8qLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgdm9pZCB3aWw2MjEwX2RlYnVnZnNfaW5pdF9ibG9icyhzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsCiAJCQkJICAgICAgIHN0cnVjdCBkZW50cnkgKmRiZykKQEAgLTE2MDMsNiArMTY1Myw4IEBACiAJeyJyZWNvdmVyeSIsCVNfSVJVR08gfCBTX0lXVVNSLAkmZm9wc19yZWNvdmVyeX0sCiAJeyJsZWRfY2ZnIiwJU19JUlVHTyB8IFNfSVdVU1IsCSZmb3BzX2xlZF9jZmd9LAogCXsibGVkX2JsaW5rX3RpbWUiLAlTX0lSVUdPIHwgU19JV1VTUiwJJmZvcHNfbGVkX2JsaW5rX3RpbWV9LAorCXsiZndfY2FwYWJpbGl0aWVzIiwJU19JUlVHTywJJmZvcHNfZndfY2FwYWJpbGl0aWVzfSwKKwl7ImZ3X3ZlcnNpb24iLAlTX0lSVUdPLAkJJmZvcHNfZndfdmVyc2lvbn0sCiB9OwogCiBzdGF0aWMgdm9pZCB3aWw2MjEwX2RlYnVnZnNfaW5pdF9maWxlcyhzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsCkBAIC0xNjQzLDcgKzE2OTUsNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBkYmdfb2ZmIGRiZ193aWxfb2ZmW10gPSB7CiAJV0lMX0ZJRUxEKHByaXZhY3ksCVNfSVJVR08sCQlkb2ZmX3UzMiksCiAJV0lMX0ZJRUxEKHN0YXR1c1swXSwJU19JUlVHTyB8IFNfSVdVU1IsCWRvZmZfdWxvbmcpLAotCVdJTF9GSUVMRChmd192ZXJzaW9uLAlTX0lSVUdPLAkJZG9mZl91MzIpLAogCVdJTF9GSUVMRChod192ZXJzaW9uLAlTX0lSVUdPLAkJZG9mZl94MzIpLAogCVdJTF9GSUVMRChyZWNvdmVyeV9jb3VudCwgU19JUlVHTywJCWRvZmZfdTMyKSwKIAlXSUxfRklFTEQoYXBfaXNvbGF0ZSwJU19JUlVHTywJCWRvZmZfdTMyKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2Z3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9mdy5oCmluZGV4IDdhMmM2YzEuLjJmMmI5MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2Z3LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZncuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTQgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE0LDIwMTYgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogICoKICAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQpAQCAtNTgsNiArNTgsMTUgQEAKIAl1OCBkYXRhWzBdOyAvKiBmcmVlLWZvcm0gZGF0YSBbZGF0YV9zaXplXSwgc2VlIGFib3ZlICovCiB9IF9fcGFja2VkOwogCisvKiBGVyBjYXBhYmlsaXRpZXMgZW5jb2RlZCBpbnNpZGUgYSBjb21tZW50IHJlY29yZCAqLworI2RlZmluZSBXSUxfRldfQ0FQQUJJTElUSUVTX01BR0lDICgweGFiY2RkY2JhKQorc3RydWN0IHdpbF9md19yZWNvcmRfY2FwYWJpbGl0aWVzIHsgLyogdHlwZSA9PSB3aWxfZndfdHlwZV9jb21tZW50ICovCisJLyogaWRlbnRpZmllcyBjYXBhYmlsaXRpZXMgcmVjb3JkICovCisJX19sZTMyIG1hZ2ljOworCS8qIGNhcGFiaWxpdGllcyAodmFyaWFibGUgc2l6ZSksIHNlZSBlbnVtIHdtaV9md19jYXBhYmlsaXR5ICovCisJdTggY2FwYWJpbGl0aWVzWzBdOworfTsKKwogLyogcGVyZm9ybSBhY3Rpb24KICAqIGRhdGFfc2l6ZSA9IEBoZWFkLnNpemUgLSBvZmZzZXRvZihzdHJ1Y3Qgd2lsX2Z3X3JlY29yZF9hY3Rpb24sIGRhdGEpCiAgKi8KQEAgLTkzLDYgKzEwMiw5IEBACiAvKiBmaWxlIGhlYWRlcgogICogRmlyc3QgcmVjb3JkIG9mIGV2ZXJ5IGZpbGUKICAqLworLyogdGhlIEZXIHZlcnNpb24gcHJlZml4IGluIHRoZSBjb21tZW50ICovCisjZGVmaW5lIFdJTF9GV19WRVJTSU9OX1BSRUZJWCAiRlcgdmVyc2lvbjogIgorI2RlZmluZSBXSUxfRldfVkVSU0lPTl9QUkVGSVhfTEVOIChzaXplb2YoV0lMX0ZXX1ZFUlNJT05fUFJFRklYKSAtIDEpCiBzdHJ1Y3Qgd2lsX2Z3X3JlY29yZF9maWxlX2hlYWRlciB7CiAJX19sZTMyIHNpZ25hdHVyZSA7IC8qIFdpbG9jaXR5IHNpZ25hdHVyZSAqLwogCV9fbGUzMiByZXNlcnZlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2Z3X2luYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZndfaW5jLmMKaW5kZXggZDMwNjU3ZS4uOGY0MGViMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZndfaW5jLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZndfaW5jLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogICoKICAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQpAQCAtMTE4LDYgKzExOCwxMiBAQAogCXJldHVybiAoaW50KWRsZW47CiB9CiAKK3N0YXRpYyBpbnQgZndfaWdub3JlX3NlY3Rpb24oc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgICBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBmd19oYW5kbGVfY29tbWVudChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IHZvaWQgKmRhdGEsCiAJCQkgICAgIHNpemVfdCBzaXplKQogewpAQCAtMTI2LDYgKzEzMiwyNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50Citmd19oYW5kbGVfY2FwYWJpbGl0aWVzKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJICAgICAgIHNpemVfdCBzaXplKQoreworCWNvbnN0IHN0cnVjdCB3aWxfZndfcmVjb3JkX2NhcGFiaWxpdGllcyAqcmVjID0gZGF0YTsKKwlzaXplX3QgY2FwYV9zaXplOworCisJaWYgKHNpemUgPCBzaXplb2YoKnJlYykgfHwKKwkgICAgbGUzMl90b19jcHUocmVjLT5tYWdpYykgIT0gV0lMX0ZXX0NBUEFCSUxJVElFU19NQUdJQykKKwkJcmV0dXJuIDA7CisKKwljYXBhX3NpemUgPSBzaXplIC0gb2Zmc2V0b2Yoc3RydWN0IHdpbF9md19yZWNvcmRfY2FwYWJpbGl0aWVzLAorCQkJCSAgICBjYXBhYmlsaXRpZXMpOworCWJpdG1hcF96ZXJvKHdpbC0+ZndfY2FwYWJpbGl0aWVzLCBXTUlfRldfQ0FQQUJJTElUWV9NQVgpOworCW1lbWNweSh3aWwtPmZ3X2NhcGFiaWxpdGllcywgcmVjLT5jYXBhYmlsaXRpZXMsCisJICAgICAgIG1pbihzaXplb2Yod2lsLT5md19jYXBhYmlsaXRpZXMpLCBjYXBhX3NpemUpKTsKKwl3aWxfaGV4X2R1bXBfZncoIkNBUEEiLCBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCAxLAorCQkJcmVjLT5jYXBhYmlsaXRpZXMsIGNhcGFfc2l6ZSwgZmFsc2UpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGZ3X2hhbmRsZV9kYXRhKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgY29uc3Qgdm9pZCAqZGF0YSwKIAkJCSAgc2l6ZV90IHNpemUpCiB7CkBAIC0xOTYsNiArMjIzLDEzIEBACiAJd2lsX2hleF9kdW1wX2Z3KCIiLCBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCAxLCBkLT5jb21tZW50LAogCQkJc2l6ZW9mKGQtPmNvbW1lbnQpLCB0cnVlKTsKIAorCWlmICghbWVtY21wKGQtPmNvbW1lbnQsIFdJTF9GV19WRVJTSU9OX1BSRUZJWCwKKwkJICAgIFdJTF9GV19WRVJTSU9OX1BSRUZJWF9MRU4pKQorCQltZW1jcHkod2lsLT5md192ZXJzaW9uLAorCQkgICAgICAgZC0+Y29tbWVudCArIFdJTF9GV19WRVJTSU9OX1BSRUZJWF9MRU4sCisJCSAgICAgICBtaW4oc2l6ZW9mKGQtPmNvbW1lbnQpIC0gV0lMX0ZXX1ZFUlNJT05fUFJFRklYX0xFTiwKKwkJCSAgIHNpemVvZih3aWwtPmZ3X3ZlcnNpb24pIC0gMSkpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM4Myw0MiArNDE3LDUxIEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogCWludCB0eXBlOwotCWludCAoKmhhbmRsZXIpKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCWludCAoKmxvYWRfaGFuZGxlcikoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgIHNpemVfdCBzaXplKTsKKwlpbnQgKCpwYXJzZV9oYW5kbGVyKShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgICAgIHNpemVfdCBzaXplKTsKIH0gd2lsX2Z3X2hhbmRsZXJzW10gPSB7Ci0Je3dpbF9md190eXBlX2NvbW1lbnQsIGZ3X2hhbmRsZV9jb21tZW50fSwKLQl7d2lsX2Z3X3R5cGVfZGF0YSwgZndfaGFuZGxlX2RhdGF9LAotCXt3aWxfZndfdHlwZV9maWxsLCBmd19oYW5kbGVfZmlsbH0sCisJe3dpbF9md190eXBlX2NvbW1lbnQsIGZ3X2hhbmRsZV9jb21tZW50LCBmd19oYW5kbGVfY2FwYWJpbGl0aWVzfSwKKwl7d2lsX2Z3X3R5cGVfZGF0YSwgZndfaGFuZGxlX2RhdGEsIGZ3X2lnbm9yZV9zZWN0aW9ufSwKKwl7d2lsX2Z3X3R5cGVfZmlsbCwgZndfaGFuZGxlX2ZpbGwsIGZ3X2lnbm9yZV9zZWN0aW9ufSwKIAkvKiB3aWxfZndfdHlwZV9hY3Rpb24gKi8KIAkvKiB3aWxfZndfdHlwZV92ZXJpZnkgKi8KLQl7d2lsX2Z3X3R5cGVfZmlsZV9oZWFkZXIsIGZ3X2hhbmRsZV9maWxlX2hlYWRlcn0sCi0Je3dpbF9md190eXBlX2RpcmVjdF93cml0ZSwgZndfaGFuZGxlX2RpcmVjdF93cml0ZX0sCi0Je3dpbF9md190eXBlX2dhdGV3YXlfZGF0YSwgZndfaGFuZGxlX2dhdGV3YXlfZGF0YX0sCi0Je3dpbF9md190eXBlX2dhdGV3YXlfZGF0YTQsIGZ3X2hhbmRsZV9nYXRld2F5X2RhdGE0fSwKKwl7d2lsX2Z3X3R5cGVfZmlsZV9oZWFkZXIsIGZ3X2hhbmRsZV9maWxlX2hlYWRlciwKKwkJZndfaGFuZGxlX2ZpbGVfaGVhZGVyfSwKKwl7d2lsX2Z3X3R5cGVfZGlyZWN0X3dyaXRlLCBmd19oYW5kbGVfZGlyZWN0X3dyaXRlLCBmd19pZ25vcmVfc2VjdGlvbn0sCisJe3dpbF9md190eXBlX2dhdGV3YXlfZGF0YSwgZndfaGFuZGxlX2dhdGV3YXlfZGF0YSwgZndfaWdub3JlX3NlY3Rpb259LAorCXt3aWxfZndfdHlwZV9nYXRld2F5X2RhdGE0LCBmd19oYW5kbGVfZ2F0ZXdheV9kYXRhNCwKKwkJZndfaWdub3JlX3NlY3Rpb259LAogfTsKIAogc3RhdGljIGludCB3aWxfZndfaGFuZGxlX3JlY29yZChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGludCB0eXBlLAotCQkJCWNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQorCQkJCWNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIGxvYWQpCiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3aWxfZndfaGFuZGxlcnMpOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3aWxfZndfaGFuZGxlcnMpOyBpKyspCiAJCWlmICh3aWxfZndfaGFuZGxlcnNbaV0udHlwZSA9PSB0eXBlKQotCQkJcmV0dXJuIHdpbF9md19oYW5kbGVyc1tpXS5oYW5kbGVyKHdpbCwgZGF0YSwgc2l6ZSk7Ci0JfQorCQkJcmV0dXJuIGxvYWQgPworCQkJCXdpbF9md19oYW5kbGVyc1tpXS5sb2FkX2hhbmRsZXIoCisJCQkJCXdpbCwgZGF0YSwgc2l6ZSkgOgorCQkJCXdpbF9md19oYW5kbGVyc1tpXS5wYXJzZV9oYW5kbGVyKAorCQkJCQl3aWwsIGRhdGEsIHNpemUpOwogCiAJd2lsX2Vycl9mdyh3aWwsICJ1bmtub3duIHJlY29yZCB0eXBlOiAlZFxuIiwgdHlwZSk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIC8qKgotICogd2lsX2Z3X2xvYWQgLSBsb2FkIEZXIGludG8gZGV2aWNlCi0gKgotICogTG9hZCB0aGUgRlcgYW5kIHVDb2RlIGNvZGUgYW5kIGRhdGEgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlCi0gKiBtZW1vcnkgcmVnaW9ucworICogd2lsX2Z3X3Byb2Nlc3MgLSBwcm9jZXNzIHNlY3Rpb24gZnJvbSBGVyBmaWxlCisgKiBpZiBsb2FkIGlzIHRydWU6IExvYWQgdGhlIEZXIGFuZCB1Q29kZSBjb2RlIGFuZCBkYXRhIHRvIHRoZQorICogY29ycmVzcG9uZGluZyBkZXZpY2UgbWVtb3J5IHJlZ2lvbnMsCisgKiBvdGhlcndpc2Ugb25seSBwYXJzZSBhbmQgbG9vayBmb3IgY2FwYWJpbGl0aWVzCiAgKgogICogUmV0dXJuIGVycm9yIGNvZGUKICAqLwotc3RhdGljIGludCB3aWxfZndfbG9hZChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQorc3RhdGljIGludCB3aWxfZndfcHJvY2VzcyhzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgIHNpemVfdCBzaXplLCBib29sIGxvYWQpCiB7CiAJaW50IHJjID0gMDsKIAljb25zdCBzdHJ1Y3Qgd2lsX2Z3X3JlY29yZF9oZWFkICpoZHI7CkBAIC00MzcsNyArNDgwLDcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCXJjID0gd2lsX2Z3X2hhbmRsZV9yZWNvcmQod2lsLCBsZTE2X3RvX2NwdShoZHItPnR5cGUpLAotCQkJCQkgICZoZHJbMV0sIGhkcl9zeik7CisJCQkJCSAgJmhkclsxXSwgaGRyX3N6LCBsb2FkKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwogCX0KQEAgLTQ1NiwxMyArNDk5LDE2IEBACiB9CiAKIC8qKgotICogd2lsX3JlcXVlc3RfZmlybXdhcmUgLSBSZXF1ZXN0IGZpcm13YXJlIGFuZCBsb2FkIHRvIGRldmljZQorICogd2lsX3JlcXVlc3RfZmlybXdhcmUgLSBSZXF1ZXN0IGZpcm13YXJlCiAgKgotICogUmVxdWVzdCBmaXJtd2FyZSBpbWFnZSBmcm9tIHRoZSBmaWxlIGFuZCBsb2FkIGl0IHRvIGRldmljZQorICogUmVxdWVzdCBmaXJtd2FyZSBpbWFnZSBmcm9tIHRoZSBmaWxlCisgKiBJZiBsb2FkIGlzIHRydWUsIGxvYWQgZmlybXdhcmUgdG8gZGV2aWNlLCBvdGhlcndpc2UKKyAqIG9ubHkgcGFyc2UgYW5kIGV4dHJhY3QgY2FwYWJpbGl0aWVzCiAgKgogICogUmV0dXJuIGVycm9yIGNvZGUKICAqLwotaW50IHdpbF9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgY29uc3QgY2hhciAqbmFtZSkKK2ludCB3aWxfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgYm9vbCBsb2FkKQogewogCWludCByYywgcmMxOwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CkBAIC00ODIsNyArNTI4LDcgQEAKIAkJCXJjID0gcmMxOwogCQkJZ290byBvdXQ7CiAJCX0KLQkJcmMgPSB3aWxfZndfbG9hZCh3aWwsIGQsIHJjMSk7CisJCXJjID0gd2lsX2Z3X3Byb2Nlc3Mod2lsLCBkLCByYzEsIGxvYWQpOwogCQlpZiAocmMgPCAwKQogCQkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvaW50ZXJydXB0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9pbnRlcnJ1cHQuYwppbmRleCAwMTFlNzQxLi42NDA0NmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9pbnRlcnJ1cHQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9pbnRlcnJ1cHQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCiAgKgogICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCkBAIC0xMDEsNyArMTAxLDcgQEAKIAkgICAgICBtYXNrX2hhbHAgPyBXSUw2MjEwX0lSUV9ESVNBQkxFIDogV0lMNjIxMF9JUlFfRElTQUJMRV9OT19IQUxQKTsKIH0KIAotc3RhdGljIHZvaWQgd2lsNjIxMF9tYXNrX2hhbHAoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQordm9pZCB3aWw2MjEwX21hc2tfaGFscChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpCiB7CiAJd2lsX2RiZ19pcnEod2lsLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCkBAIC01MDMsNiArNTAzLDEzIEBACiAJCQkJb2Zmc2V0b2Yoc3RydWN0IFJHRl9JQ1IsIElDUikpOwogCQl1MzIgaW12X21pc2MgPSB3aWxfcih3aWwsIFJHRl9ETUFfRVBfTUlTQ19JQ1IgKwogCQkJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IFJHRl9JQ1IsIElNVikpOworCisJCS8qIEhBTFAgaW50ZXJydXB0IGNhbiBiZSB1bm1hc2tlZCB3aGVuIG1pc2MgaW50ZXJydXB0cyBhcmUKKwkJICogbWFza2VkCisJCSAqLworCQlpZiAoaWNyX21pc2MgJiBCSVRfRE1BX0VQX01JU0NfSUNSX0hBTFApCisJCQlyZXR1cm4gMDsKKwogCQl3aWxfZXJyKHdpbCwgIklSUSB3aGVuIGl0IHNob3VsZCBiZSBtYXNrZWQ6IHBzZXVkbyAweCUwOHhcbiIKIAkJCQkiUnggICBpY206aWNyOmltdiAweCUwOHggMHglMDh4IDB4JTA4eFxuIgogCQkJCSJUeCAgIGljbTppY3I6aW12IDB4JTA4eCAweCUwOHggMHglMDh4XG4iCkBAIC01OTIsNyArNTk5LDcgQEAKIAogdm9pZCB3aWw2MjEwX3NldF9oYWxwKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKIHsKLQl3aWxfZGJnX21pc2Mod2lsLCAiJXMoKVxuIiwgX19mdW5jX18pOworCXdpbF9kYmdfaXJxKHdpbCwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAogCXdpbF93KHdpbCwgUkdGX0RNQV9FUF9NSVNDX0lDUiArIG9mZnNldG9mKHN0cnVjdCBSR0ZfSUNSLCBJQ1MpLAogCSAgICAgIEJJVF9ETUFfRVBfTUlTQ19JQ1JfSEFMUCk7CkBAIC02MDAsNyArNjA3LDcgQEAKIAogdm9pZCB3aWw2MjEwX2NsZWFyX2hhbHAoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQogewotCXdpbF9kYmdfbWlzYyh3aWwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisJd2lsX2RiZ19pcnEod2lsLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCiAJd2lsX3cod2lsLCBSR0ZfRE1BX0VQX01JU0NfSUNSICsgb2Zmc2V0b2Yoc3RydWN0IFJHRl9JQ1IsIElDUiksCiAJICAgICAgQklUX0RNQV9FUF9NSVNDX0lDUl9IQUxQKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL21haW4uYwppbmRleCA0YmM5MmU1Li5lNzEzMGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvbWFpbi5jCkBAIC0yMzIsNiArMjMyLDkgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHdpbF90b19uZGV2KHdpbCk7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IHdpbC0+d2RldjsKIAorCWlmICh1bmxpa2VseSghbmRldikpCisJCXJldHVybjsKKwogCW1pZ2h0X3NsZWVwKCk7CiAJd2lsX2luZm8od2lsLCAiJXMoYnNzaWQ9JXBNLCByZWFzb249JWQsIGV2JXMpXG4iLCBfX2Z1bmNfXywgYnNzaWQsCiAJCSByZWFzb25fY29kZSwgZnJvbV9ldmVudCA/ICIrIiA6ICItIik7CkBAIC04NDksNiArODUyLDcgQEAKIAliaXRtYXBfemVybyh3aWwtPnN0YXR1cywgd2lsX3N0YXR1c19sYXN0KTsKIAltdXRleF91bmxvY2soJndpbC0+d21pX211dGV4KTsKIAorCW11dGV4X2xvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOwogCWlmICh3aWwtPnNjYW5fcmVxdWVzdCkgewogCQlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9pbmZvIGluZm8gPSB7CiAJCQkuYWJvcnRlZCA9IHRydWUsCkBAIC04NjAsNiArODY0LDcgQEAKIAkJY2ZnODAyMTFfc2Nhbl9kb25lKHdpbC0+c2Nhbl9yZXF1ZXN0LCAmaW5mbyk7CiAJCXdpbC0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKIAl9CisJbXV0ZXhfdW5sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKIAogCXdpbF9tYXNrX2lycSh3aWwpOwogCkBAIC04ODgsMTEgKzg5MywxMiBAQAogCQkJIFdJTF9GVzJfTkFNRSk7CiAKIAkJd2lsX2hhbHRfY3B1KHdpbCk7CisJCW1lbXNldCh3aWwtPmZ3X3ZlcnNpb24sIDAsIHNpemVvZih3aWwtPmZ3X3ZlcnNpb24pKTsKIAkJLyogTG9hZGluZyBmL3cgZnJvbSB0aGUgZmlsZSAqLwotCQlyYyA9IHdpbF9yZXF1ZXN0X2Zpcm13YXJlKHdpbCwgV0lMX0ZXX05BTUUpOworCQlyYyA9IHdpbF9yZXF1ZXN0X2Zpcm13YXJlKHdpbCwgV0lMX0ZXX05BTUUsIHRydWUpOwogCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7Ci0JCXJjID0gd2lsX3JlcXVlc3RfZmlybXdhcmUod2lsLCBXSUxfRlcyX05BTUUpOworCQlyYyA9IHdpbF9yZXF1ZXN0X2Zpcm13YXJlKHdpbCwgV0lMX0ZXMl9OQU1FLCB0cnVlKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwogCkBAIC0xMDM1LDEwICsxMDQxLDEwIEBACiAKIGludCBfX3dpbF9kb3duKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKIHsKLQlpbnQgcmM7Ci0KIAlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJndpbC0+bXV0ZXgpKTsKIAorCXNldF9iaXQod2lsX3N0YXR1c19yZXNldHRpbmcsIHdpbC0+c3RhdHVzKTsKKwogCWlmICh3aWwtPnBsYXRmb3JtX29wcy5idXNfcmVxdWVzdCkKIAkJd2lsLT5wbGF0Zm9ybV9vcHMuYnVzX3JlcXVlc3Qod2lsLT5wbGF0Zm9ybV9oYW5kbGUsIDApOwogCkBAIC0xMDUwLDggKzEwNTYsOSBAQAogCX0KIAl3aWxfZW5hYmxlX2lycSh3aWwpOwogCi0JKHZvaWQpd2lsX3AycF9zdG9wX2Rpc2NvdmVyeSh3aWwpOworCXdpbF9wMnBfc3RvcF9yYWRpb19vcGVyYXRpb25zKHdpbCk7CiAKKwltdXRleF9sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKIAlpZiAod2lsLT5zY2FuX3JlcXVlc3QpIHsKIAkJc3RydWN0IGNmZzgwMjExX3NjYW5faW5mbyBpbmZvID0gewogCQkJLmFib3J0ZWQgPSB0cnVlLApAQCAtMTA2MywxOCArMTA3MCw3IEBACiAJCWNmZzgwMjExX3NjYW5fZG9uZSh3aWwtPnNjYW5fcmVxdWVzdCwgJmluZm8pOwogCQl3aWwtPnNjYW5fcmVxdWVzdCA9IE5VTEw7CiAJfQotCi0JaWYgKHRlc3RfYml0KHdpbF9zdGF0dXNfZndjb25uZWN0ZWQsIHdpbC0+c3RhdHVzKSB8fAotCSAgICB0ZXN0X2JpdCh3aWxfc3RhdHVzX2Z3Y29ubmVjdGluZywgd2lsLT5zdGF0dXMpKSB7Ci0KLQkJbXV0ZXhfdW5sb2NrKCZ3aWwtPm11dGV4KTsKLQkJcmMgPSB3bWlfY2FsbCh3aWwsIFdNSV9ESVNDT05ORUNUX0NNRElELCBOVUxMLCAwLAotCQkJICAgICAgV01JX0RJU0NPTk5FQ1RfRVZFTlRJRCwgTlVMTCwgMCwKLQkJCSAgICAgIFdJTDYyMTBfRElTQ09OTkVDVF9UT19NUyk7Ci0JCW11dGV4X2xvY2soJndpbC0+bXV0ZXgpOwotCQlpZiAocmMpCi0JCQl3aWxfZXJyKHdpbCwgInRpbWVvdXQgd2FpdGluZyBmb3IgZGlzY29ubmVjdFxuIik7Ci0JfQorCW11dGV4X3VubG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CiAKIAl3aWxfcmVzZXQod2lsLCBmYWxzZSk7CiAKQEAgLTExMTgsMjMgKzExMTQsMjYgQEAKIAogCW11dGV4X2xvY2soJndpbC0+aGFscC5sb2NrKTsKIAotCXdpbF9kYmdfbWlzYyh3aWwsICIlczogc3RhcnQsIEhBTFAgcmVmX2NudCAoJWQpXG4iLCBfX2Z1bmNfXywKLQkJICAgICB3aWwtPmhhbHAucmVmX2NudCk7CisJd2lsX2RiZ19pcnEod2lsLCAiJXM6IHN0YXJ0LCBIQUxQIHJlZl9jbnQgKCVkKVxuIiwgX19mdW5jX18sCisJCSAgICB3aWwtPmhhbHAucmVmX2NudCk7CiAKIAlpZiAoKyt3aWwtPmhhbHAucmVmX2NudCA9PSAxKSB7CiAJCXdpbDYyMTBfc2V0X2hhbHAod2lsKTsKIAkJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJndpbC0+aGFscC5jb21wLCB0b19qaWZmaWVzKTsKLQkJaWYgKCFyYykKKwkJaWYgKCFyYykgewogCQkJd2lsX2Vycih3aWwsICIlczogSEFMUCB2b3RlIHRpbWVkIG91dFxuIiwgX19mdW5jX18pOwotCQllbHNlCi0JCQl3aWxfZGJnX21pc2Mod2lsLAotCQkJCSAgICAgIiVzOiBIQUxQIHZvdGUgY29tcGxldGVkIGFmdGVyICVkIG1zXG4iLAotCQkJCSAgICAgX19mdW5jX18sCi0JCQkJICAgICBqaWZmaWVzX3RvX21zZWNzKHRvX2ppZmZpZXMgLSByYykpOworCQkJLyogTWFzayBIQUxQIGFzIGRvbmUgaW4gY2FzZSB0aGUgaW50ZXJydXB0IGlzIHJhaXNlZCAqLworCQkJd2lsNjIxMF9tYXNrX2hhbHAod2lsKTsKKwkJfSBlbHNlIHsKKwkJCXdpbF9kYmdfaXJxKHdpbCwKKwkJCQkgICAgIiVzOiBIQUxQIHZvdGUgY29tcGxldGVkIGFmdGVyICVkIG1zXG4iLAorCQkJCSAgICBfX2Z1bmNfXywKKwkJCQkgICAgamlmZmllc190b19tc2Vjcyh0b19qaWZmaWVzIC0gcmMpKTsKKwkJfQogCX0KIAotCXdpbF9kYmdfbWlzYyh3aWwsICIlczogZW5kLCBIQUxQIHJlZl9jbnQgKCVkKVxuIiwgX19mdW5jX18sCi0JCSAgICAgd2lsLT5oYWxwLnJlZl9jbnQpOworCXdpbF9kYmdfaXJxKHdpbCwgIiVzOiBlbmQsIEhBTFAgcmVmX2NudCAoJWQpXG4iLCBfX2Z1bmNfXywKKwkJICAgIHdpbC0+aGFscC5yZWZfY250KTsKIAogCW11dGV4X3VubG9jaygmd2lsLT5oYWxwLmxvY2spOwogfQpAQCAtMTE0NSwxNiArMTE0NCwxNiBAQAogCiAJbXV0ZXhfbG9jaygmd2lsLT5oYWxwLmxvY2spOwogCi0Jd2lsX2RiZ19taXNjKHdpbCwgIiVzOiBzdGFydCwgSEFMUCByZWZfY250ICglZClcbiIsIF9fZnVuY19fLAotCQkgICAgIHdpbC0+aGFscC5yZWZfY250KTsKKwl3aWxfZGJnX2lycSh3aWwsICIlczogc3RhcnQsIEhBTFAgcmVmX2NudCAoJWQpXG4iLCBfX2Z1bmNfXywKKwkJICAgIHdpbC0+aGFscC5yZWZfY250KTsKIAogCWlmICgtLXdpbC0+aGFscC5yZWZfY250ID09IDApIHsKIAkJd2lsNjIxMF9jbGVhcl9oYWxwKHdpbCk7Ci0JCXdpbF9kYmdfbWlzYyh3aWwsICIlczogSEFMUCB1bnZvdGVcbiIsIF9fZnVuY19fKTsKKwkJd2lsX2RiZ19pcnEod2lsLCAiJXM6IEhBTFAgdW52b3RlXG4iLCBfX2Z1bmNfXyk7CiAJfQogCi0Jd2lsX2RiZ19taXNjKHdpbCwgIiVzOiBlbmQsIEhBTFAgcmVmX2NudCAoJWQpXG4iLCBfX2Z1bmNfXywKLQkJICAgICB3aWwtPmhhbHAucmVmX2NudCk7CisJd2lsX2RiZ19pcnEod2lsLCAiJXM6IGVuZCwgSEFMUCByZWZfY250ICglZClcbiIsIF9fZnVuY19fLAorCQkgICAgd2lsLT5oYWxwLnJlZl9jbnQpOwogCiAJbXV0ZXhfdW5sb2NrKCZ3aWwtPmhhbHAubG9jayk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9uZXRkZXYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL25ldGRldi5jCmluZGV4IDA5ODQwOTc1Li42MWRlNWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9uZXRkZXYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9uZXRkZXYuYwpAQCAtMTc5LDEzICsxNzksNiBAQAogCVNFVF9ORVRERVZfREVWKG5kZXYsIHdpcGh5X2Rldih3ZGV2LT53aXBoeSkpOwogCXdkZXYtPm5ldGRldiA9IG5kZXY7CiAKLQluZXRpZl9uYXBpX2FkZChuZGV2LCAmd2lsLT5uYXBpX3J4LCB3aWw2MjEwX25ldGRldl9wb2xsX3J4LAotCQkgICAgICAgV0lMNjIxMF9OQVBJX0JVREdFVCk7Ci0JbmV0aWZfdHhfbmFwaV9hZGQobmRldiwgJndpbC0+bmFwaV90eCwgd2lsNjIxMF9uZXRkZXZfcG9sbF90eCwKLQkJICAgICAgIFdJTDYyMTBfTkFQSV9CVURHRVQpOwotCi0JbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5kZXYpOwotCiAJcmV0dXJuIHdpbDsKIAogIG91dF9wcml2OgpAQCAtMjE2LDI1ICsyMDksNDggQEAKIAogaW50IHdpbF9pZl9hZGQoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQogeworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSB3aWxfdG9fd2Rldih3aWwpOworCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3ZGV2LT53aXBoeTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHdpbF90b19uZGV2KHdpbCk7CiAJaW50IHJjOwogCi0Jd2lsX2RiZ19taXNjKHdpbCwgIiVzKClcbiIsIF9fZnVuY19fKTsKKwl3aWxfZGJnX21pc2Mod2lsLCAiZW50ZXJlZCIpOworCisJc3RybGNweSh3aXBoeS0+ZndfdmVyc2lvbiwgd2lsLT5md192ZXJzaW9uLCBzaXplb2Yod2lwaHktPmZ3X3ZlcnNpb24pKTsKKworCXJjID0gd2lwaHlfcmVnaXN0ZXIod2lwaHkpOworCWlmIChyYyA8IDApIHsKKwkJd2lsX2Vycih3aWwsICJmYWlsZWQgdG8gcmVnaXN0ZXIgd2lwaHksIGVyciAlZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJbmV0aWZfbmFwaV9hZGQobmRldiwgJndpbC0+bmFwaV9yeCwgd2lsNjIxMF9uZXRkZXZfcG9sbF9yeCwKKwkJICAgICAgIFdJTDYyMTBfTkFQSV9CVURHRVQpOworCW5ldGlmX3R4X25hcGlfYWRkKG5kZXYsICZ3aWwtPm5hcGlfdHgsIHdpbDYyMTBfbmV0ZGV2X3BvbGxfdHgsCisJCQkgIFdJTDYyMTBfTkFQSV9CVURHRVQpOworCisJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5kZXYpOwogCiAJcmMgPSByZWdpc3Rlcl9uZXRkZXYobmRldik7CiAJaWYgKHJjIDwgMCkgewogCQlkZXZfZXJyKCZuZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgbmV0ZGV2OiAlZFxuIiwgcmMpOwotCQlyZXR1cm4gcmM7CisJCWdvdG8gb3V0X3dpcGh5OwogCX0KIAogCXJldHVybiAwOworCitvdXRfd2lwaHk6CisJd2lwaHlfdW5yZWdpc3Rlcih3ZGV2LT53aXBoeSk7CisJcmV0dXJuIHJjOwogfQogCiB2b2lkIHdpbF9pZl9yZW1vdmUoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gd2lsX3RvX25kZXYod2lsKTsKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gd2lsX3RvX3dkZXYod2lsKTsKIAogCXdpbF9kYmdfbWlzYyh3aWwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKIAl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKKwl3aXBoeV91bnJlZ2lzdGVyKHdkZXYtPndpcGh5KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3AycC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcDJwLmMKaW5kZXggZTBmOGFhMC4uNDA4Nzc4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcDJwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcDJwLmMKQEAgLTI2MywzICsyNjMsNDkgQEAKIAkJbXV0ZXhfdW5sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKIAl9CiB9CisKK3ZvaWQgd2lsX3AycF9zdG9wX3JhZGlvX29wZXJhdGlvbnMoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQoreworCXN0cnVjdCB3aWxfcDJwX2luZm8gKnAycCA9ICZ3aWwtPnAycDsKKwlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9pbmZvIGluZm8gPSB7CisJCS5hYm9ydGVkID0gdHJ1ZSwKKwl9OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmd2lsLT5tdXRleCk7CisKKwltdXRleF9sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKKworCWlmICh3aWwtPnJhZGlvX3dkZXYgIT0gd2lsLT5wMnBfd2RldikKKwkJZ290byBvdXQ7CisKKwlpZiAoIXAycC0+ZGlzY292ZXJ5X3N0YXJ0ZWQpIHsKKwkJLyogUmVndWxhciBzY2FuIG9uIHRoZSBwMnAgZGV2aWNlICovCisJCWlmICh3aWwtPnNjYW5fcmVxdWVzdCAmJgorCQkgICAgd2lsLT5zY2FuX3JlcXVlc3QtPndkZXYgPT0gd2lsLT5wMnBfd2RldikgeworCQkJY2ZnODAyMTFfc2Nhbl9kb25lKHdpbC0+c2Nhbl9yZXF1ZXN0LCAmaW5mbyk7CisJCQl3aWwtPnNjYW5fcmVxdWVzdCA9IE5VTEw7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCisJLyogU2VhcmNoIG9yIGxpc3RlbiBvbiBwMnAgZGV2aWNlICovCisJbXV0ZXhfdW5sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKKwl3aWxfcDJwX3N0b3BfZGlzY292ZXJ5KHdpbCk7CisJbXV0ZXhfbG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CisKKwlpZiAod2lsLT5zY2FuX3JlcXVlc3QpIHsKKwkJLyogc2VhcmNoICovCisJCWNmZzgwMjExX3NjYW5fZG9uZSh3aWwtPnNjYW5fcmVxdWVzdCwgJmluZm8pOworCQl3aWwtPnNjYW5fcmVxdWVzdCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogbGlzdGVuICovCisJCWNmZzgwMjExX3JlbWFpbl9vbl9jaGFubmVsX2V4cGlyZWQod2lsLT5yYWRpb193ZGV2LAorCQkJCQkJICAgcDJwLT5jb29raWUsCisJCQkJCQkgICAmcDJwLT5saXN0ZW5fY2hhbiwKKwkJCQkJCSAgIEdGUF9LRVJORUwpOworCX0KKworb3V0OgorCXdpbC0+cmFkaW9fd2RldiA9IHdpbC0+d2RldjsKKwltdXRleF91bmxvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcGNpZV9idXMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3BjaWVfYnVzLmMKaW5kZXggN2I1YzQyMi4uNDQ3NDZjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcGNpZV9idXMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9wY2llX2J1cy5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgIndpbDYyMTAuaCIKKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KIAogc3RhdGljIGJvb2wgdXNlX21zaSA9IHRydWU7CiBtb2R1bGVfcGFyYW0odXNlX21zaSwgYm9vbCwgU19JUlVHTyk7CkBAIC0zOCw2ICszOSw3IEBACiAJdTMyIHJldl9pZCA9IHdpbF9yKHdpbCwgUkdGX1VTRVJfSlRBR19ERVZfSUQpOwogCiAJYml0bWFwX3plcm8od2lsLT5od19jYXBhYmlsaXRpZXMsIGh3X2NhcGFiaWxpdHlfbGFzdCk7CisJYml0bWFwX3plcm8od2lsLT5md19jYXBhYmlsaXRpZXMsIFdNSV9GV19DQVBBQklMSVRZX01BWCk7CiAKIAlzd2l0Y2ggKHJldl9pZCkgewogCWNhc2UgSlRBR19ERVZfSURfU1BBUlJPV19CMDoKQEAgLTUxLDYgKzUzLDkgQEAKIAl9CiAKIAl3aWxfaW5mbyh3aWwsICJCb2FyZCBoYXJkd2FyZSBpcyAlc1xuIiwgd2lsLT5od19uYW1lKTsKKworCS8qIGV4dHJhY3QgRlcgY2FwYWJpbGl0aWVzIGZyb20gZmlsZSB3aXRob3V0IGxvYWRpbmcgdGhlIEZXICovCisJd2lsX3JlcXVlc3RfZmlybXdhcmUod2lsLCBXSUxfRldfTkFNRSwgZmFsc2UpOwogfQogCiB2b2lkIHdpbF9kaXNhYmxlX2lycShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpCkBAIC0yOTMsNiArMjk4LDkgQEAKICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAogCXdpbDYyMTBfZGVidWdmc19yZW1vdmUod2lsKTsKKwlydG5sX2xvY2soKTsKKwl3aWxfcDJwX3dkZXZfZnJlZSh3aWwpOworCXJ0bmxfdW5sb2NrKCk7CiAJd2lsX2lmX3JlbW92ZSh3aWwpOwogCXdpbF9pZl9wY2llX2Rpc2FibGUod2lsKTsKIAlwY2lfaW91bm1hcChwZGV2LCBjc3IpOwpAQCAtMzAwLDcgKzMwOCw2IEBACiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCWlmICh3aWwtPnBsYXRmb3JtX29wcy51bmluaXQpCiAJCXdpbC0+cGxhdGZvcm1fb3BzLnVuaW5pdCh3aWwtPnBsYXRmb3JtX2hhbmRsZSk7Ci0Jd2lsX3AycF93ZGV2X2ZyZWUod2lsKTsKIAl3aWxfaWZfZnJlZSh3aWwpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC90eHJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC90eHJ4LmMKaW5kZXggZjJmNmE0MC4uNGMzODUyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvdHhyeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3R4cnguYwpAQCAtODczLDkgKzg3MywxMiBAQAogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQotCXZyaW5nLT5od3RhaWwgPSBsZTMyX3RvX2NwdShyZXBseS5jbWQudHhfdnJpbmdfdGFpbF9wdHIpOwogCisJc3Bpbl9sb2NrX2JoKCZ0eGRhdGEtPmxvY2spOworCXZyaW5nLT5od3RhaWwgPSBsZTMyX3RvX2NwdShyZXBseS5jbWQudHhfdnJpbmdfdGFpbF9wdHIpOwogCXR4ZGF0YS0+ZW5hYmxlZCA9IDE7CisJc3Bpbl91bmxvY2tfYmgoJnR4ZGF0YS0+bG9jayk7CisKIAlpZiAodHhkYXRhLT5kb3QxeF9vcGVuICYmIChhZ2dfd3NpemUgPj0gMCkpCiAJCXdpbF9hZGRiYV90eF9yZXF1ZXN0KHdpbCwgaWQsIGFnZ193c2l6ZSk7CiAKQEAgLTk1MCw5ICs5NTMsMTEgQEAKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dF9mcmVlOwogCX0KLQl2cmluZy0+aHd0YWlsID0gbGUzMl90b19jcHUocmVwbHkuY21kLnR4X3ZyaW5nX3RhaWxfcHRyKTsKIAorCXNwaW5fbG9ja19iaCgmdHhkYXRhLT5sb2NrKTsKKwl2cmluZy0+aHd0YWlsID0gbGUzMl90b19jcHUocmVwbHkuY21kLnR4X3ZyaW5nX3RhaWxfcHRyKTsKIAl0eGRhdGEtPmVuYWJsZWQgPSAxOworCXNwaW5fdW5sb2NrX2JoKCZ0eGRhdGEtPmxvY2spOwogCiAJcmV0dXJuIDA7CiAgb3V0X2ZyZWU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93aWw2MjEwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93aWw2MjEwLmgKaW5kZXggZWNhYjRhZi4uYTk0OWNkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvd2lsNjIxMC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dpbDYyMTAuaApAQCAtMTcsNiArMTcsNyBAQAogI2lmbmRlZiBfX1dJTDYyMTBfSF9fCiAjZGVmaW5lIF9fV0lMNjIxMF9IX18KIAorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KQEAgLTU3NiwxMCArNTc3LDExIEBACiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldjsKIAl2b2lkIF9faW9tZW0gKmNzcjsKIAlERUNMQVJFX0JJVE1BUChzdGF0dXMsIHdpbF9zdGF0dXNfbGFzdCk7Ci0JdTMyIGZ3X3ZlcnNpb247CisJdTggZndfdmVyc2lvbltFVEhUT09MX0ZXVkVSU19MRU5dOwogCXUzMiBod192ZXJzaW9uOwogCWNvbnN0IGNoYXIgKmh3X25hbWU7CiAJREVDTEFSRV9CSVRNQVAoaHdfY2FwYWJpbGl0aWVzLCBod19jYXBhYmlsaXR5X2xhc3QpOworCURFQ0xBUkVfQklUTUFQKGZ3X2NhcGFiaWxpdGllcywgV01JX0ZXX0NBUEFCSUxJVFlfTUFYKTsKIAl1OCBuX21pZHM7IC8qIG51bWJlciBvZiBhZGRpdGlvbmFsIE1JRHMgYXMgcmVwb3J0ZWQgYnkgRlcgKi8KIAl1MzIgcmVjb3ZlcnlfY291bnQ7IC8qIG51bSBvZiBGVyByZWNvdmVyeSBhdHRlbXB0cyBpbiBhIHNob3J0IHRpbWUgKi8KIAl1MzIgcmVjb3Zlcnlfc3RhdGU7IC8qIEZXIHJlY292ZXJ5IHN0YXRlIG1hY2hpbmUgKi8KQEAgLTY1Nyw3ICs2NTksNyBAQAogCiAJLyogUDJQX0RFVklDRSB2aWYgKi8KIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICpwMnBfd2RldjsKLQlzdHJ1Y3QgbXV0ZXggcDJwX3dkZXZfbXV0ZXg7IC8qIHByb3RlY3QgQHAycF93ZGV2ICovCisJc3RydWN0IG11dGV4IHAycF93ZGV2X211dGV4OyAvKiBwcm90ZWN0IEBwMnBfd2RldiBhbmQgQHNjYW5fcmVxdWVzdCAqLwogCXN0cnVjdCB3aXJlbGVzc19kZXYgKnJhZGlvX3dkZXY7CiAKIAkvKiBIaWdoIEFjY2VzcyBMYXRlbmN5IFBvbGljeSB2b3RpbmcgKi8KQEAgLTgyOCw2ICs4MzAsNyBAQAogdm9pZCB3aWxfY29uZmlndXJlX2ludGVycnVwdF9tb2RlcmF0aW9uKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCk7CiB2b2lkIHdpbF9kaXNhYmxlX2lycShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpOwogdm9pZCB3aWxfZW5hYmxlX2lycShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpOwordm9pZCB3aWw2MjEwX21hc2tfaGFscChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpOwogCiAvKiBQMlAgKi8KIGJvb2wgd2lsX3AycF9pc19zb2NpYWxfc2NhbihzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXF1ZXN0KTsKQEAgLTg0MCw2ICs4NDMsNyBAQAogaW50IHdpbF9wMnBfY2FuY2VsX2xpc3RlbihzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIHU2NCBjb29raWUpOwogdm9pZCB3aWxfcDJwX2xpc3Rlbl9leHBpcmVkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiB2b2lkIHdpbF9wMnBfc2VhcmNoX2V4cGlyZWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3ZvaWQgd2lsX3AycF9zdG9wX3JhZGlvX29wZXJhdGlvbnMoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKTsKIAogLyogV01JIGZvciBQMlAgKi8KIGludCB3bWlfcDJwX2NmZyhzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGludCBjaGFubmVsLCBpbnQgYmkpOwpAQCAtODkzLDcgKzg5Nyw4IEBACiBpbnQgd2lsX2lmdHlwZV9ubDJ3bWkoZW51bSBubDgwMjExX2lmdHlwZSB0eXBlKTsKIAogaW50IHdpbF9pb2N0bChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIHZvaWQgX191c2VyICpkYXRhLCBpbnQgY21kKTsKLWludCB3aWxfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IGNoYXIgKm5hbWUpOworaW50IHdpbF9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSBib29sIGxvYWQpOwogCiBpbnQgd2lsX2Nhbl9zdXNwZW5kKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgYm9vbCBpc19ydW50aW1lKTsKIGludCB3aWxfc3VzcGVuZChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGJvb2wgaXNfcnVudGltZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93bWkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5jCmluZGV4IDRkOTI1NDEuLmZhZTRmMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5jCkBAIC0zMTIsMTQgKzMxMiwxNCBAQAogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSB3aWwtPndkZXY7CiAJc3RydWN0IHdtaV9yZWFkeV9ldmVudCAqZXZ0ID0gZDsKIAotCXdpbC0+ZndfdmVyc2lvbiA9IGxlMzJfdG9fY3B1KGV2dC0+c3dfdmVyc2lvbik7CiAJd2lsLT5uX21pZHMgPSBldnQtPm51bW9mX2FkZGl0aW9uYWxfbWlkczsKIAotCXdpbF9pbmZvKHdpbCwgIkZXIHZlci4gJWQ7IE1BQyAlcE07ICVkIE1JRCdzXG4iLCB3aWwtPmZ3X3ZlcnNpb24sCisJd2lsX2luZm8od2lsLCAiRlcgdmVyLiAlcyhTVyAlZCk7IE1BQyAlcE07ICVkIE1JRCdzXG4iLAorCQkgd2lsLT5md192ZXJzaW9uLCBsZTMyX3RvX2NwdShldnQtPnN3X3ZlcnNpb24pLAogCQkgZXZ0LT5tYWMsIHdpbC0+bl9taWRzKTsKIAkvKiBpZ25vcmUgTUFDIGFkZHJlc3MsIHdlIGFscmVhZHkgaGF2ZSBpdCBmcm9tIHRoZSBib290IGxvYWRlciAqLwotCXNucHJpbnRmKHdkZXYtPndpcGh5LT5md192ZXJzaW9uLCBzaXplb2Yod2Rldi0+d2lwaHktPmZ3X3ZlcnNpb24pLAotCQkgIiVkIiwgd2lsLT5md192ZXJzaW9uKTsKKwlzdHJsY3B5KHdkZXYtPndpcGh5LT5md192ZXJzaW9uLCB3aWwtPmZ3X3ZlcnNpb24sCisJCXNpemVvZih3ZGV2LT53aXBoeS0+ZndfdmVyc2lvbikpOwogCiAJd2lsX3NldF9yZWNvdmVyeV9zdGF0ZSh3aWwsIGZ3X3JlY292ZXJ5X2lkbGUpOwogCXNldF9iaXQod2lsX3N0YXR1c19md3JlYWR5LCB3aWwtPnN0YXR1cyk7CkBAIC00MjQsNiArNDI0LDcgQEAKIHN0YXRpYyB2b2lkIHdtaV9ldnRfc2Nhbl9jb21wbGV0ZShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGludCBpZCwKIAkJCQkgIHZvaWQgKmQsIGludCBsZW4pCiB7CisJbXV0ZXhfbG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CiAJaWYgKHdpbC0+c2Nhbl9yZXF1ZXN0KSB7CiAJCXN0cnVjdCB3bWlfc2Nhbl9jb21wbGV0ZV9ldmVudCAqZGF0YSA9IGQ7CiAJCXN0cnVjdCBjZmc4MDIxMV9zY2FuX2luZm8gaW5mbyA9IHsKQEAgLTQzNSwxNCArNDM2LDEzIEBACiAJCQkgICAgIHdpbC0+c2Nhbl9yZXF1ZXN0LCBpbmZvLmFib3J0ZWQpOwogCiAJCWRlbF90aW1lcl9zeW5jKCZ3aWwtPnNjYW5fdGltZXIpOwotCQltdXRleF9sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKIAkJY2ZnODAyMTFfc2Nhbl9kb25lKHdpbC0+c2Nhbl9yZXF1ZXN0LCAmaW5mbyk7CiAJCXdpbC0+cmFkaW9fd2RldiA9IHdpbC0+d2RldjsKLQkJbXV0ZXhfdW5sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKIAkJd2lsLT5zY2FuX3JlcXVlc3QgPSBOVUxMOwogCX0gZWxzZSB7CiAJCXdpbF9lcnIod2lsLCAiU0NBTl9DT01QTEVURSB3aGlsZSBub3Qgc2Nhbm5pbmdcbiIpOwogCX0KKwltdXRleF91bmxvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOwogfQogCiBzdGF0aWMgdm9pZCB3bWlfZXZ0X2Nvbm5lY3Qoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBpbnQgaWQsIHZvaWQgKmQsIGludCBsZW4pCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93bWkuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5oCmluZGV4IDY4NWZlMGQuLmY0MzBlOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5oCkBAIC00Niw2ICs0NiwxNiBAQAogCU1JRF9CUk9BRENBU1QJCT0gMHhGRiwKIH07CiAKKy8qIEZXIGNhcGFiaWxpdHkgSURzCisgKiBFYWNoIElEIG1hcHMgdG8gYSBiaXQgaW4gYSAzMi1iaXQgYml0bWFzayB2YWx1ZSBwcm92aWRlZCBieSB0aGUgRlcgdG8KKyAqIHRoZSBob3N0CisgKi8KK2VudW0gd21pX2Z3X2NhcGFiaWxpdHkgeworCVdNSV9GV19DQVBBQklMSVRZX0ZUTQkJPSAwLAorCVdNSV9GV19DQVBBQklMSVRZX1BTX0NPTkZJRwk9IDEsCisJV01JX0ZXX0NBUEFCSUxJVFlfTUFYLAorfTsKKwogLyogV01JX0NNRF9IRFIgKi8KIHN0cnVjdCB3bWlfY21kX2hkciB7CiAJdTggbWlkOwpAQCAtMTIwLDYgKzEzMCw4IEBACiAJV01JX0JGX1NNX01HTVRfQ01ESUQJCQk9IDB4ODM4LAogCVdNSV9CRl9SWFNTX01HTVRfQ01ESUQJCQk9IDB4ODM5LAogCVdNSV9CRl9UUklHX0NNRElECQkJPSAweDgzQSwKKwlXTUlfTElOS19NQUlOVEFJTl9DRkdfV1JJVEVfQ01ESUQJPSAweDg0MiwKKwlXTUlfTElOS19NQUlOVEFJTl9DRkdfUkVBRF9DTURJRAk9IDB4ODQzLAogCVdNSV9TRVRfU0VDVE9SU19DTURJRAkJCT0gMHg4NDksCiAJV01JX01BSU5UQUlOX1BBVVNFX0NNRElECQk9IDB4ODUwLAogCVdNSV9NQUlOVEFJTl9SRVNVTUVfQ01ESUQJCT0gMHg4NTEsCkBAIC0xMzQsMTAgKzE0NiwxNSBAQAogCVdNSV9CRl9DVFJMX0NNRElECQkJPSAweDg2MiwKIAlXTUlfTk9USUZZX1JFUV9DTURJRAkJCT0gMHg4NjMsCiAJV01JX0dFVF9TVEFUVVNfQ01ESUQJCQk9IDB4ODY0LAorCVdNSV9HRVRfUkZfU1RBVFVTX0NNRElECQkJPSAweDg2NiwKKwlXTUlfR0VUX0JBU0VCQU5EX1RZUEVfQ01ESUQJCT0gMHg4NjcsCiAJV01JX1VOSVRfVEVTVF9DTURJRAkJCT0gMHg5MDAsCiAJV01JX0hJQ0NVUF9DTURJRAkJCT0gMHg5MDEsCiAJV01JX0ZMQVNIX1JFQURfQ01ESUQJCQk9IDB4OTAyLAogCVdNSV9GTEFTSF9XUklURV9DTURJRAkJCT0gMHg5MDMsCisJLyogUG93ZXIgbWFuYWdlbWVudCAqLworCVdNSV9UUkFGRklDX0RFRkVSUkFMX0NNRElECQk9IDB4OTA0LAorCVdNSV9UUkFGRklDX1JFU1VNRV9DTURJRAkJPSAweDkwNSwKIAkvKiBQMlAgKi8KIAlXTUlfUDJQX0NGR19DTURJRAkJCT0gMHg5MTAsCiAJV01JX1BPUlRfQUxMT0NBVEVfQ01ESUQJCQk9IDB4OTExLApAQCAtMTUwLDYgKzE2NywyNiBAQAogCVdNSV9QQ1BfU1RBUlRfQ01ESUQJCQk9IDB4OTE4LAogCVdNSV9QQ1BfU1RPUF9DTURJRAkJCT0gMHg5MTksCiAJV01JX0dFVF9QQ1BfRkFDVE9SX0NNRElECQk9IDB4OTFCLAorCS8qIFBvd2VyIFNhdmUgQ29uZmlndXJhdGlvbiBDb21tYW5kcyAqLworCVdNSV9QU19ERVZfUFJPRklMRV9DRkdfQ01ESUQJCT0gMHg5MUMsCisJLyogTm90IHN1cHBvcnRlZCB5ZXQgKi8KKwlXTUlfUFNfREVWX0NGR19DTURJRAkJCT0gMHg5MUQsCisJLyogTm90IHN1cHBvcnRlZCB5ZXQgKi8KKwlXTUlfUFNfREVWX0NGR19SRUFEX0NNRElECQk9IDB4OTFFLAorCS8qIFBlciBNQUMgUG93ZXIgU2F2ZSBDb25maWd1cmF0aW9uIGNvbW1hbmRzCisJICogTm90IHN1cHBvcnRlZCB5ZXQKKwkgKi8KKwlXTUlfUFNfTUlEX0NGR19DTURJRAkJCT0gMHg5MUYsCisJLyogTm90IHN1cHBvcnRlZCB5ZXQgKi8KKwlXTUlfUFNfTUlEX0NGR19SRUFEX0NNRElECQk9IDB4OTIwLAorCVdNSV9SU19DRkdfQ01ESUQJCQk9IDB4OTIxLAorCVdNSV9HRVRfREVUQUlMRURfUlNfUkVTX0NNRElECQk9IDB4OTIyLAorCVdNSV9BT0FfTUVBU19DTURJRAkJCT0gMHg5MjMsCisJV01JX1RPRl9TRVNTSU9OX1NUQVJUX0NNRElECQk9IDB4OTkxLAorCVdNSV9UT0ZfR0VUX0NBUEFCSUxJVElFU19DTURJRAkJPSAweDk5MiwKKwlXTUlfVE9GX1NFVF9MQ1JfQ01ESUQJCQk9IDB4OTkzLAorCVdNSV9UT0ZfU0VUX0xDSV9DTURJRAkJCT0gMHg5OTQsCisJV01JX1RPRl9DSEFOTkVMX0lORk9fQ01ESUQJCT0gMHg5OTUsCiAJV01JX1NFVF9NQUNfQUREUkVTU19DTURJRAkJPSAweEYwMDMsCiAJV01JX0FCT1JUX1NDQU5fQ01ESUQJCQk9IDB4RjAwNywKIAlXTUlfU0VUX1BST01JU0NVT1VTX01PREVfQ01ESUQJCT0gMHhGMDQxLApAQCAtMjkxLDkgKzMyOCw4IEBACiAvKiBXTUlfU1RBUlRfU0NBTl9DTURJRCAqLwogc3RydWN0IHdtaV9zdGFydF9zY2FuX2NtZCB7CiAJdTggZGlyZWN0X3NjYW5fbWFjX2FkZHJbV01JX01BQ19MRU5dOwotCS8qIERNRyBCZWFjb24gZnJhbWUgaXMgdHJhbnNtaXR0ZWQgZHVyaW5nIGFjdGl2ZSBzY2FubmluZyAqLworCS8qIHJ1biBzY2FuIHdpdGggZGlzY292ZXJ5IGJlYWNvbi4gUmVsZXZhbnQgZm9yIEFDVElWRSBzY2FuIG9ubHkuICovCiAJdTggZGlzY292ZXJ5X21vZGU7Ci0JLyogcmVzZXJ2ZWQgKi8KIAl1OCByZXNlcnZlZDsKIAkvKiBNYXggZHVyYXRpb24gaW4gdGhlIGhvbWUgY2hhbm5lbChtcykgKi8KIAlfX2xlMzIgZHdlbGxfdGltZTsKQEAgLTQ1Myw2ICs0ODksMTIgQEAKIAl1OCByZXNlcnZlZFszXTsKIH0gX19wYWNrZWQ7CiAKKy8qIFdNSV9UUkFGRklDX0RFRkVSUkFMX0NNRElEICovCitzdHJ1Y3Qgd21pX3RyYWZmaWNfZGVmZXJyYWxfY21kIHsKKwkvKiBCaXQgdmVjdG9yOiBiaXRbMF0gLSB3YWtlIG9uIFVuaWNhc3QsIGJpdFsxXSAtIHdha2Ugb24gQnJvYWRjYXN0ICovCisJdTggd2FrZXVwX3RyaWdnZXI7Cit9IF9fcGFja2VkOworCiAvKiBXTUlfUDJQX0NGR19DTURJRCAqLwogZW51bSB3bWlfZGlzY292ZXJ5X21vZGUgewogCVdNSV9ESVNDT1ZFUllfTU9ERV9OT05fT0ZGTE9BRAk9IDB4MDAsCkBAIC04MTgsODUgKzg2MCwxOTMgQEAKIAlfX2xlNjQgbWVtX2Jhc2U7CiB9IF9fcGFja2VkOwogCitlbnVtIHdtaV9hb2FfbWVhc190eXBlIHsKKwlXTUlfQU9BX1BIQVNFX01FQVMJPSAweDAwLAorCVdNSV9BT0FfUEhBU0VfQU1QX01FQVMJPSAweDAxLAorfTsKKworLyogV01JX0FPQV9NRUFTX0NNRElEICovCitzdHJ1Y3Qgd21pX2FvYV9tZWFzX2NtZCB7CisJdTggbWFjX2FkZHJbV01JX01BQ19MRU5dOworCS8qIGNoYW5uZWxzIElEczoKKwkgKiAwIC0gNTgzMjAgTUh6CisJICogMSAtIDYwNDgwIE1IegorCSAqIDIgLSA2MjY0MCBNSHoKKwkgKi8KKwl1OCBjaGFubmVsOworCS8qIGVudW0gd21pX2FvYV9tZWFzX3R5cGUgKi8KKwl1OCBhb2FfbWVhc190eXBlOworCV9fbGUzMiBtZWFzX3JmX21hc2s7Cit9IF9fcGFja2VkOworCitlbnVtIHdtaV90b2ZfYnVyc3RfZHVyYXRpb24geworCVdNSV9UT0ZfQlVSU1RfRFVSQVRJT05fMjUwX1VTRUMJCT0gMiwKKwlXTUlfVE9GX0JVUlNUX0RVUkFUSU9OXzUwMF9VU0VDCQk9IDMsCisJV01JX1RPRl9CVVJTVF9EVVJBVElPTl8xX01TRUMJCT0gNCwKKwlXTUlfVE9GX0JVUlNUX0RVUkFUSU9OXzJfTVNFQwkJPSA1LAorCVdNSV9UT0ZfQlVSU1RfRFVSQVRJT05fNF9NU0VDCQk9IDYsCisJV01JX1RPRl9CVVJTVF9EVVJBVElPTl84X01TRUMJCT0gNywKKwlXTUlfVE9GX0JVUlNUX0RVUkFUSU9OXzE2X01TRUMJCT0gOCwKKwlXTUlfVE9GX0JVUlNUX0RVUkFUSU9OXzMyX01TRUMJCT0gOSwKKwlXTUlfVE9GX0JVUlNUX0RVUkFUSU9OXzY0X01TRUMJCT0gMTAsCisJV01JX1RPRl9CVVJTVF9EVVJBVElPTl8xMjhfTVNFQwkJPSAxMSwKKwlXTUlfVE9GX0JVUlNUX0RVUkFUSU9OX05PX1BSRUZFUkVOQ0VTCT0gMTUsCit9OworCitlbnVtIHdtaV90b2Zfc2Vzc2lvbl9zdGFydF9mbGFncyB7CisJV01JX1RPRl9TRVNTSU9OX1NUQVJUX0ZMQUdfU0VDVVJFRAk9IDB4MSwKKwlXTUlfVE9GX1NFU1NJT05fU1RBUlRfRkxBR19BU0FQCQk9IDB4MiwKKwlXTUlfVE9GX1NFU1NJT05fU1RBUlRfRkxBR19MQ0lfUkVRCT0gMHg0LAorCVdNSV9UT0ZfU0VTU0lPTl9TVEFSVF9GTEFHX0xDUl9SRVEJPSAweDgsCit9OworCisvKiBXTUlfVE9GX1NFU1NJT05fU1RBUlRfQ01ESUQgKi8KK3N0cnVjdCB3bWlfZnRtX2Rlc3RfaW5mbyB7CisJdTggY2hhbm5lbDsKKwkvKiB3bWlfdG9mX3Nlc3Npb25fc3RhcnRfZmxhZ3NfZSAqLworCXU4IGZsYWdzOworCXU4IGluaXRpYWxfdG9rZW47CisJdTggbnVtX29mX2Z0bV9wZXJfYnVyc3Q7CisJdTggbnVtX29mX2J1cnN0c19leHA7CisJLyogd21pX3RvZl9idXJzdF9kdXJhdGlvbl9lICovCisJdTggYnVyc3RfZHVyYXRpb247CisJLyogQnVyc3QgUGVyaW9kIGluZGljYXRlIGludGVydmFsIGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIGJ1cnN0CisJICogaW5zdGFuY2VzLCBpbiB1bml0cyBvZiAxMDAgbXMKKwkgKi8KKwlfX2xlMTYgYnVyc3RfcGVyaW9kOworCXU4IGRzdF9tYWNbV01JX01BQ19MRU5dOworCV9fbGUxNiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9UT0ZfU0VTU0lPTl9TVEFSVF9DTURJRCAqLworc3RydWN0IHdtaV90b2Zfc2Vzc2lvbl9zdGFydF9jbWQgeworCV9fbGUzMiBzZXNzaW9uX2lkOworCXU4IG51bV9vZl9hb2FfbWVhc3VyZXM7CisJdTggYW9hX3R5cGU7CisJX19sZTE2IG51bV9vZl9kZXN0OworCXU4IHJlc2VydmVkWzRdOworCXN0cnVjdCB3bWlfZnRtX2Rlc3RfaW5mbyBmdG1fZGVzdF9pbmZvWzBdOworfSBfX3BhY2tlZDsKKworZW51bSB3bWlfdG9mX2NoYW5uZWxfaW5mb19yZXBvcnRfdHlwZSB7CisJV01JX1RPRl9DSEFOTkVMX0lORk9fVFlQRV9DSVIJCQk9IDB4MSwKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19UWVBFX1JTU0kJCQk9IDB4MiwKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19UWVBFX1NOUgkJCT0gMHg0LAorCVdNSV9UT0ZfQ0hBTk5FTF9JTkZPX1RZUEVfREVCVUdfREFUQQkJPSAweDgsCisJV01JX1RPRl9DSEFOTkVMX0lORk9fVFlQRV9WRU5ET1JfU1BFQ0lGSUMJPSAweDEwLAorfTsKKworLyogV01JX1RPRl9DSEFOTkVMX0lORk9fQ01ESUQgKi8KK3N0cnVjdCB3bWlfdG9mX2NoYW5uZWxfaW5mb19jbWQgeworCS8qIHdtaV90b2ZfY2hhbm5lbF9pbmZvX3JlcG9ydF90eXBlX2UgKi8KKwlfX2xlMzIgY2hhbm5lbF9pbmZvX3JlcG9ydF9yZXF1ZXN0OworfSBfX3BhY2tlZDsKKwogLyogV01JIEV2ZW50cwogICogTGlzdCBvZiBFdmVudHMgKHRhcmdldCB0byBob3N0KQogICovCiBlbnVtIHdtaV9ldmVudF9pZCB7Ci0JV01JX1JFQURZX0VWRU5USUQJCQk9IDB4MTAwMSwKLQlXTUlfQ09OTkVDVF9FVkVOVElECQkJPSAweDEwMDIsCi0JV01JX0RJU0NPTk5FQ1RfRVZFTlRJRAkJCT0gMHgxMDAzLAotCVdNSV9TQ0FOX0NPTVBMRVRFX0VWRU5USUQJCT0gMHgxMDBBLAotCVdNSV9SRVBPUlRfU1RBVElTVElDU19FVkVOVElECQk9IDB4MTAwQiwKLQlXTUlfUkRfTUVNX1JTUF9FVkVOVElECQkJPSAweDE4MDAsCi0JV01JX0ZXX1JFQURZX0VWRU5USUQJCQk9IDB4MTgwMSwKLQlXTUlfRVhJVF9GQVNUX01FTV9BQ0NfTU9ERV9FVkVOVElECT0gMHgyMDAsCi0JV01JX0VDSE9fUlNQX0VWRU5USUQJCQk9IDB4MTgwMywKLQlXTUlfRlNfVFVORV9ET05FX0VWRU5USUQJCT0gMHgxODBBLAotCVdNSV9DT1JSX01FQVNVUkVfRVZFTlRJRAkJPSAweDE4MEIsCi0JV01JX1JFQURfUlNTSV9FVkVOVElECQkJPSAweDE4MEMsCi0JV01JX1RFTVBfU0VOU0VfRE9ORV9FVkVOVElECQk9IDB4MTgwRSwKLQlXTUlfRENfQ0FMSUJfRE9ORV9FVkVOVElECQk9IDB4MTgwRiwKLQlXTUlfSVFfVFhfQ0FMSUJfRE9ORV9FVkVOVElECQk9IDB4MTgxMSwKLQlXTUlfSVFfUlhfQ0FMSUJfRE9ORV9FVkVOVElECQk9IDB4MTgxMiwKLQlXTUlfU0VUX1dPUktfTU9ERV9ET05FX0VWRU5USUQJCT0gMHgxODE1LAotCVdNSV9MT19MRUFLQUdFX0NBTElCX0RPTkVfRVZFTlRJRAk9IDB4MTgxNiwKLQlXTUlfTUFSTE9OX1JfUkVBRF9ET05FX0VWRU5USUQJCT0gMHgxODE4LAotCVdNSV9NQVJMT05fUl9XUklURV9ET05FX0VWRU5USUQJCT0gMHgxODE5LAotCVdNSV9NQVJMT05fUl9UWFJYX1NFTF9ET05FX0VWRU5USUQJPSAweDE4MUEsCi0JV01JX1NJTEVOVF9SU1NJX0NBTElCX0RPTkVfRVZFTlRJRAk9IDB4MTgxRCwKLQlXTUlfUkZfUlhfVEVTVF9ET05FX0VWRU5USUQJCT0gMHgxODFFLAotCVdNSV9DRkdfUlhfQ0hBSU5fRE9ORV9FVkVOVElECQk9IDB4MTgyMCwKLQlXTUlfVlJJTkdfQ0ZHX0RPTkVfRVZFTlRJRAkJPSAweDE4MjEsCi0JV01JX0JBX1NUQVRVU19FVkVOVElECQkJPSAweDE4MjMsCi0JV01JX1JDUF9BRERCQV9SRVFfRVZFTlRJRAkJPSAweDE4MjQsCi0JV01JX1JDUF9BRERCQV9SRVNQX1NFTlRfRVZFTlRJRAkJPSAweDE4MjUsCi0JV01JX0RFTEJBX0VWRU5USUQJCQk9IDB4MTgyNiwKLQlXTUlfR0VUX1NTSURfRVZFTlRJRAkJCT0gMHgxODI4LAotCVdNSV9HRVRfUENQX0NIQU5ORUxfRVZFTlRJRAkJPSAweDE4MkEsCi0JV01JX1NXX1RYX0NPTVBMRVRFX0VWRU5USUQJCT0gMHgxODJCLAotCVdNSV9SRUFEX01BQ19SWFFfRVZFTlRJRAkJPSAweDE4MzAsCi0JV01JX1JFQURfTUFDX1RYUV9FVkVOVElECQk9IDB4MTgzMSwKLQlXTUlfV1JJVEVfTUFDX1JYUV9FVkVOVElECQk9IDB4MTgzMiwKLQlXTUlfV1JJVEVfTUFDX1RYUV9FVkVOVElECQk9IDB4MTgzMywKLQlXTUlfV1JJVEVfTUFDX1hRX0ZJRUxEX0VWRU5USUQJCT0gMHgxODM0LAotCVdNSV9CRUFNRk9STUlOR19NR01UX0RPTkVfRVZFTlRJRAk9IDB4MTgzNiwKLQlXTUlfQkZfVFhTU19NR01UX0RPTkVfRVZFTlRJRAkJPSAweDE4MzcsCi0JV01JX0JGX1JYU1NfTUdNVF9ET05FX0VWRU5USUQJCT0gMHgxODM5LAotCVdNSV9SU19NR01UX0RPTkVfRVZFTlRJRAkJPSAweDE4NTIsCi0JV01JX1JGX01HTVRfU1RBVFVTX0VWRU5USUQJCT0gMHgxODUzLAotCVdNSV9USEVSTUFMX1RIUk9UVExJTkdfU1RBVFVTX0VWRU5USUQJPSAweDE4NTUsCi0JV01JX0JGX1NNX01HTVRfRE9ORV9FVkVOVElECQk9IDB4MTgzOCwKLQlXTUlfUlhfTUdNVF9QQUNLRVRfRVZFTlRJRAkJPSAweDE4NDAsCi0JV01JX1RYX01HTVRfUEFDS0VUX0VWRU5USUQJCT0gMHgxODQxLAotCVdNSV9PVFBfUkVBRF9SRVNVTFRfRVZFTlRJRAkJPSAweDE4NTYsCi0JV01JX0xFRF9DRkdfRE9ORV9FVkVOVElECQk9IDB4MTg1OCwKKwlXTUlfUkVBRFlfRVZFTlRJRAkJCQk9IDB4MTAwMSwKKwlXTUlfQ09OTkVDVF9FVkVOVElECQkJCT0gMHgxMDAyLAorCVdNSV9ESVNDT05ORUNUX0VWRU5USUQJCQkJPSAweDEwMDMsCisJV01JX1NDQU5fQ09NUExFVEVfRVZFTlRJRAkJCT0gMHgxMDBBLAorCVdNSV9SRVBPUlRfU1RBVElTVElDU19FVkVOVElECQkJPSAweDEwMEIsCisJV01JX1JEX01FTV9SU1BfRVZFTlRJRAkJCQk9IDB4MTgwMCwKKwlXTUlfRldfUkVBRFlfRVZFTlRJRAkJCQk9IDB4MTgwMSwKKwlXTUlfRVhJVF9GQVNUX01FTV9BQ0NfTU9ERV9FVkVOVElECQk9IDB4MjAwLAorCVdNSV9FQ0hPX1JTUF9FVkVOVElECQkJCT0gMHgxODAzLAorCVdNSV9GU19UVU5FX0RPTkVfRVZFTlRJRAkJCT0gMHgxODBBLAorCVdNSV9DT1JSX01FQVNVUkVfRVZFTlRJRAkJCT0gMHgxODBCLAorCVdNSV9SRUFEX1JTU0lfRVZFTlRJRAkJCQk9IDB4MTgwQywKKwlXTUlfVEVNUF9TRU5TRV9ET05FX0VWRU5USUQJCQk9IDB4MTgwRSwKKwlXTUlfRENfQ0FMSUJfRE9ORV9FVkVOVElECQkJPSAweDE4MEYsCisJV01JX0lRX1RYX0NBTElCX0RPTkVfRVZFTlRJRAkJCT0gMHgxODExLAorCVdNSV9JUV9SWF9DQUxJQl9ET05FX0VWRU5USUQJCQk9IDB4MTgxMiwKKwlXTUlfU0VUX1dPUktfTU9ERV9ET05FX0VWRU5USUQJCQk9IDB4MTgxNSwKKwlXTUlfTE9fTEVBS0FHRV9DQUxJQl9ET05FX0VWRU5USUQJCT0gMHgxODE2LAorCVdNSV9NQVJMT05fUl9SRUFEX0RPTkVfRVZFTlRJRAkJCT0gMHgxODE4LAorCVdNSV9NQVJMT05fUl9XUklURV9ET05FX0VWRU5USUQJCQk9IDB4MTgxOSwKKwlXTUlfTUFSTE9OX1JfVFhSWF9TRUxfRE9ORV9FVkVOVElECQk9IDB4MTgxQSwKKwlXTUlfU0lMRU5UX1JTU0lfQ0FMSUJfRE9ORV9FVkVOVElECQk9IDB4MTgxRCwKKwlXTUlfUkZfUlhfVEVTVF9ET05FX0VWRU5USUQJCQk9IDB4MTgxRSwKKwlXTUlfQ0ZHX1JYX0NIQUlOX0RPTkVfRVZFTlRJRAkJCT0gMHgxODIwLAorCVdNSV9WUklOR19DRkdfRE9ORV9FVkVOVElECQkJPSAweDE4MjEsCisJV01JX0JBX1NUQVRVU19FVkVOVElECQkJCT0gMHgxODIzLAorCVdNSV9SQ1BfQUREQkFfUkVRX0VWRU5USUQJCQk9IDB4MTgyNCwKKwlXTUlfUkNQX0FEREJBX1JFU1BfU0VOVF9FVkVOVElECQkJPSAweDE4MjUsCisJV01JX0RFTEJBX0VWRU5USUQJCQkJPSAweDE4MjYsCisJV01JX0dFVF9TU0lEX0VWRU5USUQJCQkJPSAweDE4MjgsCisJV01JX0dFVF9QQ1BfQ0hBTk5FTF9FVkVOVElECQkJPSAweDE4MkEsCisJV01JX1NXX1RYX0NPTVBMRVRFX0VWRU5USUQJCQk9IDB4MTgyQiwKKwlXTUlfUkVBRF9NQUNfUlhRX0VWRU5USUQJCQk9IDB4MTgzMCwKKwlXTUlfUkVBRF9NQUNfVFhRX0VWRU5USUQJCQk9IDB4MTgzMSwKKwlXTUlfV1JJVEVfTUFDX1JYUV9FVkVOVElECQkJPSAweDE4MzIsCisJV01JX1dSSVRFX01BQ19UWFFfRVZFTlRJRAkJCT0gMHgxODMzLAorCVdNSV9XUklURV9NQUNfWFFfRklFTERfRVZFTlRJRAkJCT0gMHgxODM0LAorCVdNSV9CRUFNRk9STUlOR19NR01UX0RPTkVfRVZFTlRJRAkJPSAweDE4MzYsCisJV01JX0JGX1RYU1NfTUdNVF9ET05FX0VWRU5USUQJCQk9IDB4MTgzNywKKwlXTUlfQkZfUlhTU19NR01UX0RPTkVfRVZFTlRJRAkJCT0gMHgxODM5LAorCVdNSV9SU19NR01UX0RPTkVfRVZFTlRJRAkJCT0gMHgxODUyLAorCVdNSV9SRl9NR01UX1NUQVRVU19FVkVOVElECQkJPSAweDE4NTMsCisJV01JX1RIRVJNQUxfVEhST1RUTElOR19TVEFUVVNfRVZFTlRJRAkJPSAweDE4NTUsCisJV01JX0JGX1NNX01HTVRfRE9ORV9FVkVOVElECQkJPSAweDE4MzgsCisJV01JX1JYX01HTVRfUEFDS0VUX0VWRU5USUQJCQk9IDB4MTg0MCwKKwlXTUlfVFhfTUdNVF9QQUNLRVRfRVZFTlRJRAkJCT0gMHgxODQxLAorCVdNSV9MSU5LX01BSU5UQUlOX0NGR19XUklURV9ET05FX0VWRU5USUQJPSAweDE4NDIsCisJV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1JFQURfRE9ORV9FVkVOVElECQk9IDB4MTg0MywKKwlXTUlfT1RQX1JFQURfUkVTVUxUX0VWRU5USUQJCQk9IDB4MTg1NiwKKwlXTUlfTEVEX0NGR19ET05FX0VWRU5USUQJCQk9IDB4MTg1OCwKIAkvKiBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGV2ZW50cyAqLwotCVdNSV9EQVRBX1BPUlRfT1BFTl9FVkVOVElECQk9IDB4MTg2MCwKLQlXTUlfV0JFX0xJTktfRE9XTl9FVkVOVElECQk9IDB4MTg2MSwKLQlXTUlfQkZfQ1RSTF9ET05FX0VWRU5USUQJCT0gMHgxODYyLAotCVdNSV9OT1RJRllfUkVRX0RPTkVfRVZFTlRJRAkJPSAweDE4NjMsCi0JV01JX0dFVF9TVEFUVVNfRE9ORV9FVkVOVElECQk9IDB4MTg2NCwKLQlXTUlfVlJJTkdfRU5fRVZFTlRJRAkJCT0gMHgxODY1LAotCVdNSV9VTklUX1RFU1RfRVZFTlRJRAkJCT0gMHgxOTAwLAotCVdNSV9GTEFTSF9SRUFEX0RPTkVfRVZFTlRJRAkJPSAweDE5MDIsCi0JV01JX0ZMQVNIX1dSSVRFX0RPTkVfRVZFTlRJRAkJPSAweDE5MDMsCisJV01JX0RBVEFfUE9SVF9PUEVOX0VWRU5USUQJCQk9IDB4MTg2MCwKKwlXTUlfV0JFX0xJTktfRE9XTl9FVkVOVElECQkJPSAweDE4NjEsCisJV01JX0JGX0NUUkxfRE9ORV9FVkVOVElECQkJPSAweDE4NjIsCisJV01JX05PVElGWV9SRVFfRE9ORV9FVkVOVElECQkJPSAweDE4NjMsCisJV01JX0dFVF9TVEFUVVNfRE9ORV9FVkVOVElECQkJPSAweDE4NjQsCisJV01JX1ZSSU5HX0VOX0VWRU5USUQJCQkJPSAweDE4NjUsCisJV01JX0dFVF9SRl9TVEFUVVNfRVZFTlRJRAkJCT0gMHgxODY2LAorCVdNSV9HRVRfQkFTRUJBTkRfVFlQRV9FVkVOVElECQkJPSAweDE4NjcsCisJV01JX1VOSVRfVEVTVF9FVkVOVElECQkJCT0gMHgxOTAwLAorCVdNSV9GTEFTSF9SRUFEX0RPTkVfRVZFTlRJRAkJCT0gMHgxOTAyLAorCVdNSV9GTEFTSF9XUklURV9ET05FX0VWRU5USUQJCQk9IDB4MTkwMywKKwkvKiBQb3dlciBtYW5hZ2VtZW50ICovCisJV01JX1RSQUZGSUNfREVGRVJSQUxfRVZFTlRJRAkJCT0gMHgxOTA0LAorCVdNSV9UUkFGRklDX1JFU1VNRV9FVkVOVElECQkJPSAweDE5MDUsCiAJLyogUDJQICovCi0JV01JX1AyUF9DRkdfRE9ORV9FVkVOVElECQk9IDB4MTkxMCwKLQlXTUlfUE9SVF9BTExPQ0FURURfRVZFTlRJRAkJPSAweDE5MTEsCi0JV01JX1BPUlRfREVMRVRFRF9FVkVOVElECQk9IDB4MTkxMiwKLQlXTUlfTElTVEVOX1NUQVJURURfRVZFTlRJRAkJPSAweDE5MTQsCi0JV01JX1NFQVJDSF9TVEFSVEVEX0VWRU5USUQJCT0gMHgxOTE1LAotCVdNSV9ESVNDT1ZFUllfU1RBUlRFRF9FVkVOVElECQk9IDB4MTkxNiwKLQlXTUlfRElTQ09WRVJZX1NUT1BQRURfRVZFTlRJRAkJPSAweDE5MTcsCi0JV01JX1BDUF9TVEFSVEVEX0VWRU5USUQJCQk9IDB4MTkxOCwKLQlXTUlfUENQX1NUT1BQRURfRVZFTlRJRAkJCT0gMHgxOTE5LAotCVdNSV9QQ1BfRkFDVE9SX0VWRU5USUQJCQk9IDB4MTkxQSwKLQlXTUlfU0VUX0NIQU5ORUxfRVZFTlRJRAkJCT0gMHg5MDAwLAotCVdNSV9BU1NPQ19SRVFfRVZFTlRJRAkJCT0gMHg5MDAxLAotCVdNSV9FQVBPTF9SWF9FVkVOVElECQkJPSAweDkwMDIsCi0JV01JX01BQ19BRERSX1JFU1BfRVZFTlRJRAkJPSAweDkwMDMsCi0JV01JX0ZXX1ZFUl9FVkVOVElECQkJPSAweDkwMDQsCi0JV01JX0FDU19QQVNTSVZFX1NDQU5fQ09NUExFVEVfRVZFTlRJRAk9IDB4OTAwNSwKKwlXTUlfUDJQX0NGR19ET05FX0VWRU5USUQJCQk9IDB4MTkxMCwKKwlXTUlfUE9SVF9BTExPQ0FURURfRVZFTlRJRAkJCT0gMHgxOTExLAorCVdNSV9QT1JUX0RFTEVURURfRVZFTlRJRAkJCT0gMHgxOTEyLAorCVdNSV9MSVNURU5fU1RBUlRFRF9FVkVOVElECQkJPSAweDE5MTQsCisJV01JX1NFQVJDSF9TVEFSVEVEX0VWRU5USUQJCQk9IDB4MTkxNSwKKwlXTUlfRElTQ09WRVJZX1NUQVJURURfRVZFTlRJRAkJCT0gMHgxOTE2LAorCVdNSV9ESVNDT1ZFUllfU1RPUFBFRF9FVkVOVElECQkJPSAweDE5MTcsCisJV01JX1BDUF9TVEFSVEVEX0VWRU5USUQJCQkJPSAweDE5MTgsCisJV01JX1BDUF9TVE9QUEVEX0VWRU5USUQJCQkJPSAweDE5MTksCisJV01JX1BDUF9GQUNUT1JfRVZFTlRJRAkJCQk9IDB4MTkxQSwKKwkvKiBQb3dlciBTYXZlIENvbmZpZ3VyYXRpb24gRXZlbnRzICovCisJV01JX1BTX0RFVl9QUk9GSUxFX0NGR19FVkVOVElECQkJPSAweDE5MUMsCisJLyogTm90IHN1cHBvcnRlZCB5ZXQgKi8KKwlXTUlfUFNfREVWX0NGR19FVkVOVElECQkJCT0gMHgxOTFELAorCS8qIE5vdCBzdXBwb3J0ZWQgeWV0ICovCisJV01JX1BTX0RFVl9DRkdfUkVBRF9FVkVOVElECQkJPSAweDE5MUUsCisJLyogTm90IHN1cHBvcnRlZCB5ZXQgKi8KKwlXTUlfUFNfTUlEX0NGR19FVkVOVElECQkJCT0gMHgxOTFGLAorCS8qIE5vdCBzdXBwb3J0ZWQgeWV0ICovCisJV01JX1BTX01JRF9DRkdfUkVBRF9FVkVOVElECQkJPSAweDE5MjAsCisJV01JX1JTX0NGR19ET05FX0VWRU5USUQJCQkJPSAweDE5MjEsCisJV01JX0dFVF9ERVRBSUxFRF9SU19SRVNfRVZFTlRJRAkJCT0gMHgxOTIyLAorCVdNSV9BT0FfTUVBU19FVkVOVElECQkJCT0gMHgxOTIzLAorCVdNSV9UT0ZfU0VTU0lPTl9FTkRfRVZFTlRJRAkJCT0gMHgxOTkxLAorCVdNSV9UT0ZfR0VUX0NBUEFCSUxJVElFU19FVkVOVElECQk9IDB4MTk5MiwKKwlXTUlfVE9GX1NFVF9MQ1JfRVZFTlRJRAkJCQk9IDB4MTk5MywKKwlXTUlfVE9GX1NFVF9MQ0lfRVZFTlRJRAkJCQk9IDB4MTk5NCwKKwlXTUlfVE9GX0ZUTV9QRVJfREVTVF9SRVNfRVZFTlRJRAkJPSAweDE5OTUsCisJV01JX1RPRl9DSEFOTkVMX0lORk9fRVZFTlRJRAkJCT0gMHgxOTk2LAorCVdNSV9TRVRfQ0hBTk5FTF9FVkVOVElECQkJCT0gMHg5MDAwLAorCVdNSV9BU1NPQ19SRVFfRVZFTlRJRAkJCQk9IDB4OTAwMSwKKwlXTUlfRUFQT0xfUlhfRVZFTlRJRAkJCQk9IDB4OTAwMiwKKwlXTUlfTUFDX0FERFJfUkVTUF9FVkVOVElECQkJPSAweDkwMDMsCisJV01JX0ZXX1ZFUl9FVkVOVElECQkJCT0gMHg5MDA0LAorCVdNSV9BQ1NfUEFTU0lWRV9TQ0FOX0NPTVBMRVRFX0VWRU5USUQJCT0gMHg5MDA1LAogfTsKIAogLyogRXZlbnRzIGRhdGEgc3RydWN0dXJlcyAqLwpAQCAtOTQzLDEwICsxMDkzLDg1IEBACiAKIC8qIFdNSV9GV19WRVJfRVZFTlRJRCAqLwogc3RydWN0IHdtaV9md192ZXJfZXZlbnQgewotCXU4IG1ham9yOwotCXU4IG1pbm9yOwotCV9fbGUxNiBzdWJtaW5vcjsKLQlfX2xlMTYgYnVpbGQ7CisJLyogRlcgaW1hZ2UgdmVyc2lvbiAqLworCV9fbGUzMiBmd19tYWpvcjsKKwlfX2xlMzIgZndfbWlub3I7CisJX19sZTMyIGZ3X3N1Ym1pbm9yOworCV9fbGUzMiBmd19idWlsZDsKKwkvKiBGVyBpbWFnZSBidWlsZCB0aW1lIHN0YW1wICovCisJX19sZTMyIGhvdXI7CisJX19sZTMyIG1pbnV0ZTsKKwlfX2xlMzIgc2Vjb25kOworCV9fbGUzMiBkYXk7CisJX19sZTMyIG1vbnRoOworCV9fbGUzMiB5ZWFyOworCS8qIEJvb3QgTG9hZGVyIGltYWdlIHZlcnNpb24gKi8KKwlfX2xlMzIgYmxfbWFqb3I7CisJX19sZTMyIGJsX21pbm9yOworCV9fbGUzMiBibF9zdWJtaW5vcjsKKwlfX2xlMzIgYmxfYnVpbGQ7CisJLyogVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBGVyBjYXBhYmlsaWVzIGFycmF5ICovCisJdTggZndfY2FwYWJpbGl0aWVzX2xlbjsKKwl1OCByZXNlcnZlZFszXTsKKwkvKiBGVyBjYXBhYmlsaXRpZXMgaW5mbworCSAqIE11c3QgYmUgdGhlIGxhc3QgbWVtYmVyIG9mIHRoZSBzdHJ1Y3QKKwkgKi8KKwlfX2xlMzIgZndfY2FwYWJpbGl0aWVzWzBdOworfSBfX3BhY2tlZDsKKworLyogV01JX0dFVF9SRl9TVEFUVVNfRVZFTlRJRCAqLworZW51bSByZl90eXBlIHsKKwlSRl9VTktOT1dOCT0gMHgwMCwKKwlSRl9NQVJMT04JPSAweDAxLAorCVJGX1NQQVJST1cJPSAweDAyLAorfTsKKworLyogV01JX0dFVF9SRl9TVEFUVVNfRVZFTlRJRCAqLworZW51bSBib2FyZF9maWxlX3JmX3R5cGUgeworCUJGX1JGX01BUkxPTgk9IDB4MDAsCisJQkZfUkZfU1BBUlJPVwk9IDB4MDEsCit9OworCisvKiBXTUlfR0VUX1JGX1NUQVRVU19FVkVOVElEICovCitlbnVtIHJmX3N0YXR1cyB7CisJUkZfT0sJCQk9IDB4MDAsCisJUkZfTk9fQ09NTQkJPSAweDAxLAorCVJGX1dST05HX0JPQVJEX0ZJTEUJPSAweDAyLAorfTsKKworLyogV01JX0dFVF9SRl9TVEFUVVNfRVZFTlRJRCAqLworc3RydWN0IHdtaV9nZXRfcmZfc3RhdHVzX2V2ZW50IHsKKwkvKiBlbnVtIHJmX3R5cGUgKi8KKwlfX2xlMzIgcmZfdHlwZTsKKwkvKiBhdHRhY2hlZCBSRnMgYml0IHZlY3RvciAqLworCV9fbGUzMiBhdHRhY2hlZF9yZl92ZWN0b3I7CisJLyogZW5hYmxlZCBSRnMgYml0IHZlY3RvciAqLworCV9fbGUzMiBlbmFibGVkX3JmX3ZlY3RvcjsKKwkvKiBlbnVtIHJmX3N0YXR1cywgcmVmZXJzIHRvIGVuYWJsZWQgUkZzICovCisJdTggcmZfc3RhdHVzWzMyXTsKKwkvKiBlbnVtIGJvYXJkIGZpbGUgUkYgdHlwZSAqLworCV9fbGUzMiBib2FyZF9maWxlX3JmX3R5cGU7CisJLyogYm9hcmQgZmlsZSBwbGF0Zm9ybSB0eXBlICovCisJX19sZTMyIGJvYXJkX2ZpbGVfcGxhdGZvcm1fdHlwZTsKKwkvKiBib2FyZCBmaWxlIHZlcnNpb24gKi8KKwlfX2xlMzIgYm9hcmRfZmlsZV92ZXJzaW9uOworCV9fbGUzMiByZXNlcnZlZFsyXTsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9HRVRfQkFTRUJBTkRfVFlQRV9FVkVOVElEICovCitlbnVtIGJhc2ViYW5kX3R5cGUgeworCUJBU0VCQU5EX1VOS05PV04JPSAweDAwLAorCUJBU0VCQU5EX1NQQVJST1dfTV9BMAk9IDB4MDMsCisJQkFTRUJBTkRfU1BBUlJPV19NX0ExCT0gMHgwNCwKKwlCQVNFQkFORF9TUEFSUk9XX01fQjAJPSAweDA1LAorCUJBU0VCQU5EX1NQQVJST1dfTV9DMAk9IDB4MDYsCisJQkFTRUJBTkRfU1BBUlJPV19NX0QwCT0gMHgwNywKK307CisKKy8qIFdNSV9HRVRfQkFTRUJBTkRfVFlQRV9FVkVOVElEICovCitzdHJ1Y3Qgd21pX2dldF9iYXNlYmFuZF90eXBlX2V2ZW50IHsKKwkvKiBlbnVtIGJhc2ViYW5kX3R5cGUgKi8KKwlfX2xlMzIgYmFzZWJhbmRfdHlwZTsKIH0gX19wYWNrZWQ7CiAKIC8qIFdNSV9NQUNfQUREUl9SRVNQX0VWRU5USUQgKi8KQEAgLTE0MTAsNCArMTYzNSw1NTMgQEAKIAlfX2xlMzIgc3RhdHVzOwogfSBfX3BhY2tlZDsKIAorI2RlZmluZSBXTUlfTlVNX01DUwkoMTMpCisKKy8qIFJhdGUgc2VhcmNoIHBhcmFtZXRlcnMgY29uZmlndXJhdGlvbiBwZXIgY29ubmVjdGlvbiAqLworc3RydWN0IHdtaV9yc19jZmcgeworCS8qIFRoZSBtYXhpbWFsIGFsbG93ZWQgUEVSIGZvciBlYWNoIE1DUworCSAqIE1DUyB3aWxsIGJlIGNvbnNpZGVyZWQgYXMgZmFpbGVkIGlmIFBFUiBkdXJpbmcgUlMgaXMgaGlnaGVyCisJICovCisJdTggcGVyX3RocmVzaG9sZFtXTUlfTlVNX01DU107CisJLyogTnVtYmVyIG9mIE1QRFVzIGZvciBlYWNoIE1DUworCSAqIHRoaXMgaXMgdGhlIG1pbmltYWwgc3RhdGlzdGljIHJlcXVpcmVkIHRvIG1ha2UgYW4gZWR1Y2F0ZWQKKwkgKiBkZWNpc2lvbgorCSAqLworCXU4IG1pbl9mcmFtZV9jbnRbV01JX05VTV9NQ1NdOworCS8qIHN0b3AgdGhyZXNob2xkIFswLTEwMF0gKi8KKwl1OCBzdG9wX3RoOworCS8qIE1DUzEgc3RvcCB0aHJlc2hvbGQgWzAtMTAwXSAqLworCXU4IG1jczFfZmFpbF90aDsKKwl1OCBtYXhfYmFja19mYWlsdXJlX3RoOworCS8qIERlYnVnIGZlYXR1cmUgZm9yIGRpc2FibGluZyBpbnRlcm5hbCBSUyB0cmlnZ2VyICh3aGljaCBpcworCSAqIGN1cnJlbnRseSB0cmlnZ2VyZWQgYnkgQkYgRG9uZSkKKwkgKi8KKwl1OCBkYmdfZGlzYWJsZV9pbnRlcm5hbF90cmlnZ2VyOworCV9fbGUzMiBiYWNrX2ZhaWx1cmVfbWFzazsKKwlfX2xlMzIgbWNzX2VuX3ZlYzsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9SU19DRkdfQ01ESUQgKi8KK3N0cnVjdCB3bWlfcnNfY2ZnX2NtZCB7CisJLyogY29ubmVjdGlvbiBpZCAqLworCXU4IGNpZDsKKwkvKiBlbmFibGUgb3IgZGlzYWJsZSByYXRlIHNlYXJjaCAqLworCXU4IHJzX2VuYWJsZTsKKwkvKiByYXRlIHNlYXJjaCBjb25maWd1cmF0aW9uICovCisJc3RydWN0IHdtaV9yc19jZmcgcnNfY2ZnOworfSBfX3BhY2tlZDsKKworLyogV01JX1JTX0NGR19ET05FX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfcnNfY2ZnX2RvbmVfZXZlbnQgeworCXU4IGNpZDsKKwkvKiBlbnVtIHdtaV9md19zdGF0dXMgKi8KKwl1OCBzdGF0dXM7CisJdTggcmVzZXJ2ZWRbMl07Cit9IF9fcGFja2VkOworCisvKiBXTUlfR0VUX0RFVEFJTEVEX1JTX1JFU19DTURJRCAqLworc3RydWN0IHdtaV9nZXRfZGV0YWlsZWRfcnNfcmVzX2NtZCB7CisJLyogY29ubmVjdGlvbiBpZCAqLworCXU4IGNpZDsKKwl1OCByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKKy8qIFJTIHJlc3VsdHMgc3RhdHVzICovCitlbnVtIHdtaV9yc19yZXN1bHRzX3N0YXR1cyB7CisJV01JX1JTX1JFU19WQUxJRAk9IDB4MDAsCisJV01JX1JTX1JFU19JTlZBTElECT0gMHgwMSwKK307CisKKy8qIFJhdGUgc2VhcmNoIHJlc3VsdHMgKi8KK3N0cnVjdCB3bWlfcnNfcmVzdWx0cyB7CisJLyogbnVtYmVyIG9mIHNlbnQgTVBEVXMgKi8KKwl1OCBudW1fb2ZfdHhfcGt0W1dNSV9OVU1fTUNTXTsKKwkvKiBudW1iZXIgb2Ygbm9uLWFja2VkIE1QRFVzICovCisJdTggbnVtX29mX25vbl9hY2tlZF9wa3RbV01JX05VTV9NQ1NdOworCS8qIFJTIHRpbWVzdGFtcCAqLworCV9fbGUzMiB0c2Y7CisJLyogUlMgc2VsZWN0ZWQgTUNTICovCisJdTggbWNzOworfSBfX3BhY2tlZDsKKworLyogV01JX0dFVF9ERVRBSUxFRF9SU19SRVNfRVZFTlRJRCAqLworc3RydWN0IHdtaV9nZXRfZGV0YWlsZWRfcnNfcmVzX2V2ZW50IHsKKwl1OCBjaWQ7CisJLyogZW51bSB3bWlfcnNfcmVzdWx0c19zdGF0dXMgKi8KKwl1OCBzdGF0dXM7CisJLyogZGV0YWlsZWQgcnMgcmVzdWx0cyAqLworCXN0cnVjdCB3bWlfcnNfcmVzdWx0cyByc19yZXN1bHRzOworCXU4IHJlc2VydmVkWzNdOworfSBfX3BhY2tlZDsKKworLyogYnJvYWRjYXN0IGNvbm5lY3Rpb24gSUQgKi8KKyNkZWZpbmUgV01JX0xJTktfTUFJTlRBSU5fQ0ZHX0NJRF9CUk9BRENBU1QJKDB4RkZGRkZGRkYpCisKKy8qIFR5cGVzIHdtaV9saW5rX21haW50YWluX2NmZyBwcmVzZXRzIGZvciBXTUlfTElOS19NQUlOVEFJTl9DRkdfV1JJVEVfQ01EICovCitlbnVtIHdtaV9saW5rX21haW50YWluX2NmZ190eXBlIHsKKwkvKiBBUC9QQ1AgZGVmYXVsdCBub3JtYWwgKG5vbi1GU1QpIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KKwlXTUlfTElOS19NQUlOVEFJTl9DRkdfVFlQRV9ERUZBVUxUX05PUk1BTF9BUAk9IDB4MDAsCisJLyogQVAvUENQICBkZWZhdWx0IEZTVCBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCisJV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1RZUEVfREVGQVVMVF9GU1RfQVAJPSAweDAxLAorCS8qIFNUQSBkZWZhdWx0IG5vcm1hbCAobm9uLUZTVCkgY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLworCVdNSV9MSU5LX01BSU5UQUlOX0NGR19UWVBFX0RFRkFVTFRfTk9STUFMX1NUQQk9IDB4MDIsCisJLyogU1RBIGRlZmF1bHQgRlNUIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KKwlXTUlfTElOS19NQUlOVEFJTl9DRkdfVFlQRV9ERUZBVUxUX0ZTVF9TVEEJPSAweDAzLAorCS8qIGN1c3RvbSBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCisJV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1RZUEVfQ1VTVE9NCQk9IDB4MDQsCisJLyogbnVtYmVyIG9mIGRlZmluZWQgY29uZmlndXJhdGlvbiB0eXBlcyAqLworCVdNSV9MSU5LX01BSU5UQUlOX0NGR19UWVBFU19OVU0JCQk9IDB4MDUsCit9OworCisvKiBSZXNwb25zZSBzdGF0dXMgY29kZXMgZm9yIFdNSV9MSU5LX01BSU5UQUlOX0NGR19XUklURS9SRUFEIGNvbW1hbmRzICovCitlbnVtIHdtaV9saW5rX21haW50YWluX2NmZ19yZXNwb25zZV9zdGF0dXMgeworCS8qIFdNSV9MSU5LX01BSU5UQUlOX0NGR19XUklURS9SRUFEIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGFjY29tcGxpc2hlZAorCSAqLworCVdNSV9MSU5LX01BSU5UQUlOX0NGR19SRVNQT05TRV9TVEFUVVNfT0sJCT0gMHgwMCwKKwkvKiBFUlJPUiBkdWUgdG8gYmFkIGFyZ3VtZW50IGluIFdNSV9MSU5LX01BSU5UQUlOX0NGR19XUklURS9SRUFECisJICogY29tbWFuZCByZXF1ZXN0CisJICovCisJV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1JFU1BPTlNFX1NUQVRVU19CQURfQVJHVU1FTlQJPSAweDAxLAorfTsKKworLyogTGluayBMb3NzIGFuZCBLZWVwIEFsaXZlIGNvbmZpZ3VyYXRpb24gKi8KK3N0cnVjdCB3bWlfbGlua19tYWludGFpbl9jZmcgeworCS8qIGxpbmtfbG9zc19lbmFibGVfZGV0ZWN0b3JzX3ZlYyAqLworCV9fbGUzMiBsaW5rX2xvc3NfZW5hYmxlX2RldGVjdG9yc192ZWM7CisJLyogZGV0ZWN0b3JzIGNoZWNrIHBlcmlvZCB1c2VjICovCisJX19sZTMyIGNoZWNrX2xpbmtfbG9zc19wZXJpb2RfdXNlYzsKKwkvKiBtYXggYWxsb3dlZCB0eCBhZ2VpbmcgKi8KKwlfX2xlMzIgdHhfYWdlaW5nX3RocmVzaG9sZF91c2VjOworCS8qIGtlZXAgYWxpdmUgcGVyaW9kIGZvciBoaWdoIFNOUiAqLworCV9fbGUzMiBrZWVwX2FsaXZlX3BlcmlvZF91c2VjX2hpZ2hfc25yOworCS8qIGtlZXAgYWxpdmUgcGVyaW9kIGZvciBsb3cgU05SICovCisJX19sZTMyIGtlZXBfYWxpdmVfcGVyaW9kX3VzZWNfbG93X3NucjsKKwkvKiBsb3dlciBzbnIgbGltaXQgZm9yIGtlZXAgYWxpdmUgcGVyaW9kIHVwZGF0ZSAqLworCV9fbGUzMiBrZWVwX2FsaXZlX3Nucl90aHJlc2hvbGRfbG93X2RiOworCS8qIHVwcGVyIHNuciBsaW1pdCBmb3Iga2VlcCBhbGl2ZSBwZXJpb2QgdXBkYXRlICovCisJX19sZTMyIGtlZXBfYWxpdmVfc25yX3RocmVzaG9sZF9oaWdoX2RiOworCS8qIG51bSBvZiBzdWNjZXNzaXZlIGJhZCBiY29ucyBjYXVzaW5nIGxpbmstbG9zcyAqLworCV9fbGUzMiBiYWRfYmVhY29uc19udW1fdGhyZXNob2xkOworCS8qIFNOUiBsaW1pdCBmb3IgYmFkX2JlYWNvbnNfZGV0ZWN0b3IgKi8KKwlfX2xlMzIgYmFkX2JlYWNvbnNfc25yX3RocmVzaG9sZF9kYjsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9MSU5LX01BSU5UQUlOX0NGR19XUklURV9DTURJRCAqLworc3RydWN0IHdtaV9saW5rX21haW50YWluX2NmZ193cml0ZV9jbWQgeworCS8qIGVudW0gd21pX2xpbmtfbWFpbnRhaW5fY2ZnX3R5cGVfZSAtIHR5cGUgb2YgcmVxdWVzdGVkIGRlZmF1bHQKKwkgKiBjb25maWd1cmF0aW9uIHRvIGJlIGFwcGxpZWQKKwkgKi8KKwlfX2xlMzIgY2ZnX3R5cGU7CisJLyogcmVxdWVzdGVkIGNvbm5lY3Rpb24gSUQgb3IgV01JX0xJTktfTUFJTlRBSU5fQ0ZHX0NJRF9CUk9BRENBU1QgKi8KKwlfX2xlMzIgY2lkOworCS8qIGN1c3RvbSBjb25maWd1cmF0aW9uIHNldHRpbmdzIHRvIGJlIGFwcGxpZWQgKHJlbGV2YW50IG9ubHkgaWYKKwkgKiBjZmdfdHlwZT09V01JX0xJTktfTUFJTlRBSU5fQ0ZHX1RZUEVfQ1VTVE9NKQorCSAqLworCXN0cnVjdCB3bWlfbGlua19tYWludGFpbl9jZmcgbG1fY2ZnOworfSBfX3BhY2tlZDsKKworLyogV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1JFQURfQ01ESUQgKi8KK3N0cnVjdCB3bWlfbGlua19tYWludGFpbl9jZmdfcmVhZF9jbWQgeworCS8qIGNvbm5lY3Rpb24gSUQgd2hpY2ggY29uZmlndXJhdGlvbiBzZXR0aW5ncyBhcmUgcmVxdWVzdGVkICovCisJX19sZTMyIGNpZDsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9MSU5LX01BSU5UQUlOX0NGR19XUklURV9ET05FX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfbGlua19tYWludGFpbl9jZmdfd3JpdGVfZG9uZV9ldmVudCB7CisJLyogcmVxdWVzdGVkIGNvbm5lY3Rpb24gSUQgKi8KKwlfX2xlMzIgY2lkOworCS8qIHdtaV9saW5rX21haW50YWluX2NmZ19yZXNwb25zZV9zdGF0dXNfZSAtIHdyaXRlIHN0YXR1cyAqLworCV9fbGUzMiBzdGF0dXM7Cit9IF9fcGFja2VkOworCisvKiBcV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1JFQURfRE9ORV9FVkVOVCAqLworc3RydWN0IHdtaV9saW5rX21haW50YWluX2NmZ19yZWFkX2RvbmVfZXZlbnQgeworCS8qIHJlcXVlc3RlZCBjb25uZWN0aW9uIElEICovCisJX19sZTMyIGNpZDsKKwkvKiB3bWlfbGlua19tYWludGFpbl9jZmdfcmVzcG9uc2Vfc3RhdHVzX2UgLSByZWFkIHN0YXR1cyAqLworCV9fbGUzMiBzdGF0dXM7CisJLyogUmV0cmlldmVkIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KKwlzdHJ1Y3Qgd21pX2xpbmtfbWFpbnRhaW5fY2ZnIGxtX2NmZzsKK30gX19wYWNrZWQ7CisKK2VudW0gd21pX3RyYWZmaWNfZGVmZXJyYWxfc3RhdHVzIHsKKwlXTUlfVFJBRkZJQ19ERUZFUlJBTF9BUFBST1ZFRAk9IDB4MCwKKwlXTUlfVFJBRkZJQ19ERUZFUlJBTF9SRUpFQ1RFRAk9IDB4MSwKK307CisKKy8qIFdNSV9UUkFGRklDX0RFRkVSUkFMX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfdHJhZmZpY19kZWZlcnJhbF9ldmVudCB7CisJLyogZW51bSB3bWlfdHJhZmZpY19kZWZlcnJhbF9zdGF0dXNfZSAqLworCXU4IHN0YXR1czsKK30gX19wYWNrZWQ7CisKK2VudW0gd21pX3RyYWZmaWNfcmVzdW1lX3N0YXR1cyB7CisJV01JX1RSQUZGSUNfUkVTVU1FX1NVQ0NFU1MJPSAweDAsCisJV01JX1RSQUZGSUNfUkVTVU1FX0ZBSUxFRAk9IDB4MSwKK307CisKKy8qIFdNSV9UUkFGRklDX1JFU1VNRV9FVkVOVElEICovCitzdHJ1Y3Qgd21pX3RyYWZmaWNfcmVzdW1lX2V2ZW50IHsKKwkvKiBlbnVtIHdtaV90cmFmZmljX3Jlc3VtZV9zdGF0dXNfZSAqLworCXU4IHN0YXR1czsKK30gX19wYWNrZWQ7CisKKy8qIFBvd2VyIFNhdmUgY29tbWFuZCBjb21wbGV0aW9uIHN0YXR1cyBjb2RlcyAqLworZW51bSB3bWlfcHNfY2ZnX2NtZF9zdGF0dXMgeworCVdNSV9QU19DRkdfQ01EX1NUQVRVU19TVUNDRVNTCT0gMHgwMCwKKwlXTUlfUFNfQ0ZHX0NNRF9TVEFUVVNfQkFEX1BBUkFNCT0gMHgwMSwKKwkvKiBvdGhlciBlcnJvciAqLworCVdNSV9QU19DRkdfQ01EX1NUQVRVU19FUlJPUgk9IDB4MDIsCit9OworCisvKiBEZXZpY2UgUG93ZXIgU2F2ZSBQcm9maWxlcyAqLworZW51bSB3bWlfcHNfcHJvZmlsZV90eXBlIHsKKwlXTUlfUFNfUFJPRklMRV9UWVBFX0RFRkFVTFQJCT0gMHgwMCwKKwlXTUlfUFNfUFJPRklMRV9UWVBFX1BTX0RJU0FCTEVECQk9IDB4MDEsCisJV01JX1BTX1BST0ZJTEVfVFlQRV9NQVhfUFMJCT0gMHgwMiwKKwlXTUlfUFNfUFJPRklMRV9UWVBFX0xPV19MQVRFTkNZX1BTCT0gMHgwMywKK307CisKKy8qIFdNSV9QU19ERVZfUFJPRklMRV9DRkdfQ01ESUQKKyAqCisgKiBQb3dlciBzYXZlIHByb2ZpbGUgdG8gYmUgdXNlZCBieSB0aGUgZGV2aWNlCisgKgorICogUmV0dXJuZWQgZXZlbnQ6CisgKiAtIFdNSV9QU19ERVZfUFJPRklMRV9DRkdfRVZFTlRJRAorICovCitzdHJ1Y3Qgd21pX3BzX2Rldl9wcm9maWxlX2NmZ19jbWQgeworCS8qIHdtaV9wc19wcm9maWxlX3R5cGVfZSAqLworCXU4IHBzX3Byb2ZpbGU7CisJdTggcmVzZXJ2ZWRbM107Cit9IF9fcGFja2VkOworCisvKiBXTUlfUFNfREVWX1BST0ZJTEVfQ0ZHX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfcHNfZGV2X3Byb2ZpbGVfY2ZnX2V2ZW50IHsKKwkvKiB3bWlfcHNfY2ZnX2NtZF9zdGF0dXNfZSAqLworCV9fbGUzMiBzdGF0dXM7Cit9IF9fcGFja2VkOworCitlbnVtIHdtaV9wc19sZXZlbCB7CisJV01JX1BTX0xFVkVMX0RFRVBfU0xFRVAJCT0gMHgwMCwKKwlXTUlfUFNfTEVWRUxfU0hBTExPV19TTEVFUAk9IDB4MDEsCisJLyogYXdha2UgPSBhbGwgUFMgbWVjaGFuaXNtcyBhcmUgZGlzYWJsZWQgKi8KKwlXTUlfUFNfTEVWRUxfQVdBS0UJCT0gMHgwMiwKK307CisKK2VudW0gd21pX3BzX2RlZXBfc2xlZXBfY2xrX2xldmVsIHsKKwkvKiAzM2sgKi8KKwlXTUlfUFNfREVFUF9TTEVFUF9DTEtfTEVWRUxfUlRDCQk9IDB4MDAsCisJLyogMTBrICovCisJV01JX1BTX0RFRVBfU0xFRVBfQ0xLX0xFVkVMX09TQwkJPSAweDAxLAorCS8qIEBSVEMgTG93IGxhdGVuY3kgKi8KKwlXTUlfUFNfREVFUF9TTEVFUF9DTEtfTEVWRUxfUlRDX0xUCT0gMHgwMiwKKwlXTUlfUFNfREVFUF9TTEVFUF9DTEtfTEVWRUxfWFRBTAk9IDB4MDMsCisJV01JX1BTX0RFRVBfU0xFRVBfQ0xLX0xFVkVMX1NZU0NMSwk9IDB4MDQsCisJLyogTm90IEFwcGxpY2FibGUgKi8KKwlXTUlfUFNfREVFUF9TTEVFUF9DTEtfTEVWRUxfTl9BCQk9IDB4RkYsCit9OworCisvKiBSZXNwb25zZSBieSB0aGUgRlcgdG8gYSBEMyBlbnRyeSByZXF1ZXN0ICovCitlbnVtIHdtaV9wc19kM19yZXNwX3BvbGljeSB7CisJV01JX1BTX0QzX1JFU1BfUE9MSUNZX0RFRkFVTFQJPSAweDAwLAorCS8qIGRlYnVnIC1EMyByZXEgaXMgYWx3YXlzIGRlbmllZCAqLworCVdNSV9QU19EM19SRVNQX1BPTElDWV9ERU5JRUQJPSAweDAxLAorCS8qIGRlYnVnIC1EMyByZXEgaXMgYWx3YXlzIGFwcHJvdmVkICovCisJV01JX1BTX0QzX1JFU1BfUE9MSUNZX0FQUFJPVkVECT0gMHgwMiwKK307CisKKy8qIERldmljZSBjb21tb24gcG93ZXIgc2F2ZSBjb25maWd1cmF0aW9ucyAqLworc3RydWN0IHdtaV9wc19kZXZfY2ZnIHsKKwkvKiBsb3dlc3QgbGV2ZWwgb2YgUFMgYWxsb3dlZCB3aGlsZSB1bmFzc29jaWF0ZWQsIGVudW0gd21pX3BzX2xldmVsX2UKKwkgKi8KKwl1OCBwc191bmFzc29jX21pbl9sZXZlbDsKKwkvKiBsb3dlc3QgZGVlcCBzbGVlcCBjbG9jayBsZXZlbCB3aGlsZSBub25hc3NvYywgZW51bQorCSAqIHdtaV9wc19kZWVwX3NsZWVwX2Nsa19sZXZlbF9lCisJICovCisJdTggcHNfdW5hc3NvY19kZWVwX3NsZWVwX21pbl9sZXZlbDsKKwkvKiBsb3dlc3QgbGV2ZWwgb2YgUFMgYWxsb3dlZCB3aGlsZSBhc3NvY2lhdGVkLCBlbnVtIHdtaV9wc19sZXZlbF9lICovCisJdTggcHNfYXNzb2NfbWluX2xldmVsOworCS8qIGxvd2VzdCBkZWVwIHNsZWVwIGNsb2NrIGxldmVsIHdoaWxlIGFzc29jLCBlbnVtCisJICogd21pX3BzX2RlZXBfc2xlZXBfY2xrX2xldmVsX2UKKwkgKi8KKwl1OCBwc19hc3NvY19kZWVwX3NsZWVwX21pbl9sZXZlbDsKKwkvKiBlbnVtIHdtaV9wc19kZWVwX3NsZWVwX2Nsa19sZXZlbF9lICovCisJdTggcHNfYXNzb2NfbG93X2xhdGVuY3lfZHNfbWluX2xldmVsOworCS8qIGVudW0gd21pX3BzX2QzX3Jlc3BfcG9saWN5X2UgKi8KKwl1OCBwc19EM19yZXNwb25zZV9wb2xpY3k7CisJLyogQk9PTCAqLworCXU4IHBzX0QzX3BtX3BtZV9lbmFibGVkOworCS8qIEJPT0wgKi8KKwl1OCBwc19oYWxwX2VuYWJsZTsKKwl1OCBwc19kZWVwX3NsZWVwX2VudGVyX3RocmVzaF9tc2VjOworCS8qIEJPT0wgKi8KKwl1OCBwc192b2x0YWdlX3NjYWxpbmdfZW47Cit9IF9fcGFja2VkOworCisvKiBXTUlfUFNfREVWX0NGR19DTURJRAorICoKKyAqIENvbmZpZ3VyZSBjb21tb24gUG93ZXIgU2F2ZSBwYXJhbWV0ZXJzIG9mIHRoZSBkZXZpY2UgYW5kIGFsbCBNSURzLgorICoKKyAqIFJldHVybmVkIGV2ZW50OgorICogLSBXTUlfUFNfREVWX0NGR19FVkVOVElECisgKi8KK3N0cnVjdCB3bWlfcHNfZGV2X2NmZ19jbWQgeworCS8qIERldmljZSBQb3dlciBTYXZlIGNvbmZpZ3VyYXRpb24gdG8gYmUgYXBwbGllZCAqLworCXN0cnVjdCB3bWlfcHNfZGV2X2NmZyBwc19kZXZfY2ZnOworCS8qIGFsaWdubWVudCB0byAzMmIgKi8KKwl1OCByZXNlcnZlZFsyXTsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9QU19ERVZfQ0ZHX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfcHNfZGV2X2NmZ19ldmVudCB7CisJLyogd21pX3BzX2NmZ19jbWRfc3RhdHVzX2UgKi8KKwlfX2xlMzIgc3RhdHVzOworfSBfX3BhY2tlZDsKKworLyogV01JX1BTX0RFVl9DRkdfUkVBRF9DTURJRAorICoKKyAqIHJlcXVlc3QgdG8gcmV0cmlldmUgIGRldmljZSBQb3dlciBTYXZlIGNvbmZpZ3VyYXRpb24KKyAqIChXTUlfUFNfREVWX0NGR19DTUQgcGFyYW1zKQorICoKKyAqIFJldHVybmVkIGV2ZW50OgorICogLSBXTUlfUFNfREVWX0NGR19SRUFEX0VWRU5USUQKKyAqLworc3RydWN0IHdtaV9wc19kZXZfY2ZnX3JlYWRfY21kIHsKKwlfX2xlMzIgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisvKiBXTUlfUFNfREVWX0NGR19SRUFEX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfcHNfZGV2X2NmZ19yZWFkX2V2ZW50IHsKKwkvKiB3bWlfcHNfY2ZnX2NtZF9zdGF0dXNfZSAqLworCV9fbGUzMiBzdGF0dXM7CisJLyogUmV0cmlldmVkIGRldmljZSBQb3dlciBTYXZlIGNvbmZpZ3VyYXRpb24gKFdNSV9QU19ERVZfQ0ZHX0NNRAorCSAqIHBhcmFtcykKKwkgKi8KKwlzdHJ1Y3Qgd21pX3BzX2Rldl9jZmcgZGV2X3BzX2NmZzsKKwkvKiBhbGlnbm1lbnQgdG8gMzJiICovCisJdTggcmVzZXJ2ZWRbMl07Cit9IF9fcGFja2VkOworCisvKiBQZXIgTWFjIFBvd2VyIFNhdmUgY29uZmlndXJhdGlvbnMgKi8KK3N0cnVjdCB3bWlfcHNfbWlkX2NmZyB7CisJLyogTG93IHBvd2VyIFJYIGluIEJUSSBpcyBlbmFibGVkLCBCT09MICovCisJdTggYmVhY29uX2xwcnhfZW5hYmxlOworCS8qIFN5bmMgdG8gc2VjdG9yIElEIGVuYWJsZWQsIEJPT0wgKi8KKwl1OCBiZWFjb25fc3luY190b19zZWN0b3JJZF9lbmFibGU7CisJLyogTG93IHBvd2VyIFJYIGluIERUSSBpcyBlbmFibGVkLCBCT09MICovCisJdTggZnJhbWVfZXhjaGFuZ2VfbHByeF9lbmFibGU7CisJLyogU2xlZXAgQ3ljbGUgd2hpbGUgaW4gc2NoZWR1bGVkIFBTLCAxLTMxICovCisJdTggc2NoZWR1bGVkX3NsZWVwX2N5Y2xlX3BvdzI7CisJLyogU3RheSBBd2FrZSBmb3IgayBCSXMgZXZlcnkgKHNsZWVwX2N5Y2xlIC0gaykgQklzLCAxLTMxICovCisJdTggc2NoZWR1bGVkX251bV9vZl9hd2FrZV9iaXM7CisJdTggYW1fdG9fdHJhZmZpY19sb2FkX3RocmVzaF9tYnA7CisJdTggdHJhZmZpY190b19hbV9sb2FkX3RocmVzaF9tYnBzOworCXU4IHRyYWZmaWNfdG9fYW1fbnVtX29mX25vX3RyYWZmaWNfYmlzOworCS8qIEJPT0wgKi8KKwl1OCBjb250aW51b3VzX3RyYWZmaWNfcHNtOworCV9fbGUxNiBub190cmFmZmljX3RvX21pbl91c2VjOworCV9fbGUxNiBub190cmFmZmljX3RvX21heF91c2VjOworCV9fbGUxNiBzbm9vemluZ19zbGVlcF9pbnRlcnZhbF9taWxpc2VjOworCXU4IG1heF9ub19kYXRhX2F3YWtlX2V2ZW50czsKKwkvKiBUcmlnZ2VyIFdFQiBhZnRlciBrIGZhaWxlZCBiZWFjb25zICovCisJdTggbnVtX29mX2ZhaWxlZF9iZWFjb25zX3J4X3RvX3RyaWdnZXJfd2ViOworCS8qIFRyaWdnZXIgQkYgYWZ0ZXIgayBmYWlsZWQgYmVhY29ucyAqLworCXU4IG51bV9vZl9mYWlsZWRfYmVhY29uc19yeF90b190cmlnZ2VyX2JmOworCS8qIFRyaWdnZXIgU09CIGFmdGVyIGsgc3VjY2Vzc2Z1bCBiZWFjb25zICovCisJdTggbnVtX29mX3N1Y2Nlc3NmdWxfYmVhY29uc19yeF90b190cmlnZ2VyX3NvYjsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9QU19NSURfQ0ZHX0NNRElECisgKgorICogQ29uZmlndXJlIFBvd2VyIFNhdmUgcGFyYW1ldGVycyBvZiBhIHNwZWNpZmljIE1JRC4KKyAqIFRoZXNlIHBhcmFtZXRlcnMgYXJlIHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgQlNTIHRoaXMgTUlEIGJlbG9uZ3MgdG8uCisgKgorICogUmV0dXJuZWQgZXZlbnQ6CisgKiAtIFdNSV9QU19NSURfQ0ZHX0VWRU5USUQKKyAqLworc3RydWN0IHdtaV9wc19taWRfY2ZnX2NtZCB7CisJLyogTUFDIElEICovCisJdTggbWlkOworCS8qIG1pZCBQUyBjb25maWd1cmF0aW9uIHRvIGJlIGFwcGxpZWQgKi8KKwlzdHJ1Y3Qgd21pX3BzX21pZF9jZmcgcHNfbWlkX2NmZzsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9QU19NSURfQ0ZHX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfcHNfbWlkX2NmZ19ldmVudCB7CisJLyogTUFDIElEICovCisJdTggbWlkOworCS8qIGFsaWdubWVudCB0byAzMmIgKi8KKwl1OCByZXNlcnZlZFszXTsKKwkvKiB3bWlfcHNfY2ZnX2NtZF9zdGF0dXNfZSAqLworCV9fbGUzMiBzdGF0dXM7Cit9IF9fcGFja2VkOworCisvKiBXTUlfUFNfTUlEX0NGR19SRUFEX0NNRElECisgKgorICogcmVxdWVzdCB0byByZXRyaWV2ZSBQb3dlciBTYXZlIGNvbmZpZ3VyYXRpb24gb2YgbWlkCisgKiAoV01JX1BTX01JRF9DRkdfQ01EIHBhcmFtcykKKyAqCisgKiBSZXR1cm5lZCBldmVudDoKKyAqIC0gV01JX1BTX01JRF9DRkdfUkVBRF9FVkVOVElECisgKi8KK3N0cnVjdCB3bWlfcHNfbWlkX2NmZ19yZWFkX2NtZCB7CisJLyogTUFDIElEICovCisJdTggbWlkOworCS8qIGFsaWdubWVudCB0byAzMmIgKi8KKwl1OCByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9QU19NSURfQ0ZHX1JFQURfRVZFTlRJRCAqLworc3RydWN0IHdtaV9wc19taWRfY2ZnX3JlYWRfZXZlbnQgeworCS8qIE1BQyBJRCAqLworCXU4IG1pZDsKKwkvKiBSZXRyaWV2ZWQgTUlEIFBvd2VyIFNhdmUgY29uZmlndXJhdGlvbihXTUlfUFNfTUlEX0NGR19DTUQgcGFyYW1zKSAqLworCXN0cnVjdCB3bWlfcHNfbWlkX2NmZyBtaWRfcHNfY2ZnOworCS8qIHdtaV9wc19jZmdfY21kX3N0YXR1c19lICovCisJX19sZTMyIHN0YXR1czsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgV01JX0FPQV9NQVhfREFUQV9TSVpFCSgxMjgpCisKK2VudW0gd21pX2FvYV9tZWFzX3N0YXR1cyB7CisJV01JX0FPQV9NRUFTX1NVQ0NFU1MJCT0gMHgwMCwKKwlXTUlfQU9BX01FQVNfUEVFUl9JTkNBUEFCTEUJPSAweDAxLAorCVdNSV9BT0FfTUVBU19GQUlMVVJFCQk9IDB4MDIsCit9OworCisvKiBXTUlfQU9BX01FQVNfRVZFTlRJRCAqLworc3RydWN0IHdtaV9hb2FfbWVhc19ldmVudCB7CisJdTggbWFjX2FkZHJbV01JX01BQ19MRU5dOworCS8qIGNoYW5uZWxzIElEczoKKwkgKiAwIC0gNTgzMjAgTUh6CisJICogMSAtIDYwNDgwIE1IegorCSAqIDIgLSA2MjY0MCBNSHoKKwkgKi8KKwl1OCBjaGFubmVsOworCS8qIGVudW0gd21pX2FvYV9tZWFzX3R5cGUgKi8KKwl1OCBhb2FfbWVhc190eXBlOworCS8qIE1lYXN1cm1lbnRzIGFyZSBmcm9tIFJGcywgZGVmaW5lZCBieSB0aGUgbWFzayAqLworCV9fbGUzMiBtZWFzX3JmX21hc2s7CisJLyogZW51bSB3bWlfYW9hX21lYXNfc3RhdHVzICovCisJdTggbWVhc19zdGF0dXM7CisJdTggcmVzZXJ2ZWQ7CisJLyogTGVuZ3RoIG9mIG1lYXNfZGF0YSBpbiBieXRlcyAqLworCV9fbGUxNiBsZW5ndGg7CisJdTggbWVhc19kYXRhW1dNSV9BT0FfTUFYX0RBVEFfU0laRV07Cit9IF9fcGFja2VkOworCisvKiBXTUlfVE9GX0dFVF9DQVBBQklMSVRJRVNfRVZFTlRJRCAqLworc3RydWN0IHdtaV90b2ZfZ2V0X2NhcGFiaWxpdGllc19ldmVudCB7CisJdTggZnRtX2NhcGFiaWxpdHk7CisJLyogbWF4aW11bSBzdXBwb3J0ZWQgbnVtYmVyIG9mIGRlc3RpbmF0aW9uIHRvIHN0YXJ0IFRPRiAqLworCXU4IG1heF9udW1fb2ZfZGVzdDsKKwkvKiBtYXhpbXVtIHN1cHBvcnRlZCBudW1iZXIgb2YgbWVhc3VyZW1lbnRzIHBlciBidXJzdCAqLworCXU4IG1heF9udW1fb2ZfbWVhc19wZXJfYnVyc3Q7CisJdTggcmVzZXJ2ZWQ7CisJLyogbWF4aW11bSBzdXBwb3J0ZWQgbXVsdGkgYnVyc3RzICovCisJX19sZTE2IG1heF9tdWx0aV9idXJzdHNfc2Vzc2lvbnM7CisJLyogbWF4aW11bSBzdXBwb3J0ZWQgRlRNIGJ1cnN0IGR1cmF0aW9uICwgd21pX3RvZl9idXJzdF9kdXJhdGlvbl9lICovCisJX19sZTE2IG1heF9mdG1fYnVyc3RfZHVyYXRpb247CisJLyogQU9BIHN1cHBvcnRlZCB0eXBlcyAqLworCV9fbGUzMiBhb2Ffc3VwcG9ydGVkX3R5cGVzOworfSBfX3BhY2tlZDsKKworZW51bSB3bWlfdG9mX3Nlc3Npb25fZW5kX3N0YXR1cyB7CisJV01JX1RPRl9TRVNTSU9OX0VORF9OT19FUlJPUgkJPSAweDAwLAorCVdNSV9UT0ZfU0VTU0lPTl9FTkRfRkFJTAkJPSAweDAxLAorCVdNSV9UT0ZfU0VTU0lPTl9FTkRfUEFSQU1TX0VSUk9SCT0gMHgwMiwKKwlXTUlfVE9GX1NFU1NJT05fRU5EX0FCT1JURUQJCT0gMHgwMywKK307CisKKy8qIFdNSV9UT0ZfU0VTU0lPTl9FTkRfRVZFTlRJRCAqLworc3RydWN0IHdtaV90b2Zfc2Vzc2lvbl9lbmRfZXZlbnQgeworCS8qIEZUTSBzZXNzaW9uIElEICovCisJX19sZTMyIHNlc3Npb25faWQ7CisJLyogd21pX3RvZl9zZXNzaW9uX2VuZF9zdGF0dXNfZSAqLworCXU4IHN0YXR1czsKKwl1OCByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKKy8qIFJlc3BvbmRlciBGVE0gUmVzdWx0cyAqLworc3RydWN0IHdtaV9yZXNwb25kZXJfZnRtX3JlcyB7CisJdTggdDFbNl07CisJdTggdDJbNl07CisJdTggdDNbNl07CisJdTggdDRbNl07CisJX19sZTE2IHRvZF9lcnI7CisJX19sZTE2IHRvYV9lcnI7CisJX19sZTE2IHRvZF9lcnJfaW5pdGlhdG9yOworCV9fbGUxNiB0b2FfZXJyX2luaXRpYXRvcjsKK30gX19wYWNrZWQ7CisKK2VudW0gd21pX3RvZl9mdG1fcGVyX2Rlc3RfcmVzX3N0YXR1cyB7CisJV01JX1BFUl9ERVNUX1JFU19OT19FUlJPUgkJPSAweDAwLAorCVdNSV9QRVJfREVTVF9SRVNfVFhfUlhfRkFJTAkJPSAweDAxLAorCVdNSV9QRVJfREVTVF9SRVNfUEFSQU1fRE9OVF9NQVRDSAk9IDB4MDIsCit9OworCitlbnVtIHdtaV90b2ZfZnRtX3Blcl9kZXN0X3Jlc19mbGFncyB7CisJV01JX1BFUl9ERVNUX1JFU19SRVFfU1RBUlQJCT0gMHgwMSwKKwlXTUlfUEVSX0RFU1RfUkVTX0JVUlNUX1JFUE9SVF9FTkQJPSAweDAyLAorCVdNSV9QRVJfREVTVF9SRVNfUkVRX0VORAkJPSAweDA0LAorCVdNSV9QRVJfREVTVF9SRVNfUEFSQU1fVVBEQVRFCQk9IDB4MDgsCit9OworCisvKiBXTUlfVE9GX0ZUTV9QRVJfREVTVF9SRVNfRVZFTlRJRCAqLworc3RydWN0IHdtaV90b2ZfZnRtX3Blcl9kZXN0X3Jlc19ldmVudCB7CisJLyogRlRNIHNlc3Npb24gSUQgKi8KKwlfX2xlMzIgc2Vzc2lvbl9pZDsKKwkvKiBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAqLworCXU4IGRzdF9tYWNbV01JX01BQ19MRU5dOworCS8qIHdtaV90b2ZfZnRtX3Blcl9kZXN0X3Jlc19mbGFnc19lICovCisJdTggZmxhZ3M7CisJLyogd21pX3RvZl9mdG1fcGVyX2Rlc3RfcmVzX3N0YXR1c19lICovCisJdTggc3RhdHVzOworCS8qIHJlc3BvbmRlciBBU0FQICovCisJdTggcmVzcG9uZGVyX2FzYXA7CisJLyogcmVzcG9uZGVyIG51bWJlciBvZiBGVE0gcGVyIGJ1cnN0ICovCisJdTggcmVzcG9uZGVyX251bV9mdG1fcGVyX2J1cnN0OworCS8qIHJlc3BvbmRlciBudW1iZXIgb2YgRlRNIGJ1cnN0IGV4cG9uZW50ICovCisJdTggcmVzcG9uZGVyX251bV9mdG1fYnVyc3RzX2V4cDsKKwkvKiByZXNwb25kZXIgYnVyc3QgZHVyYXRpb24gLHdtaV90b2ZfYnVyc3RfZHVyYXRpb25fZSAqLworCXU4IHJlc3BvbmRlcl9idXJzdF9kdXJhdGlvbjsKKwkvKiByZXNwb25kZXIgYnVyc3QgcGVyaW9kLCBpbmRpY2F0ZSBpbnRlcnZhbCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZQorCSAqIGJ1cnN0IGluc3RhbmNlcywgaW4gdW5pdHMgb2YgMTAwIG1zCisJICovCisJX19sZTE2IHJlc3BvbmRlcl9idXJzdF9wZXJpb2Q7CisJLyogcmVjZWl2ZSBidXJzdCBjb3VudGVyICovCisJX19sZTE2IGJ1cnN0c19jbnQ7CisJLyogdHNmIG9mIHJlc3BvbmRlciBzdGFydCBidXJzdCAqLworCV9fbGUzMiB0c2Zfc3luYzsKKwkvKiBhY3R1YWwgcmVjZWl2ZWQgZnRtIHBlciBidXJzdCAqLworCXU4IGFjdHVhbF9mdG1fcGVyX2J1cnN0OworCXU4IHJlc2VydmVkMFs3XTsKKwlzdHJ1Y3Qgd21pX3Jlc3BvbmRlcl9mdG1fcmVzIHJlc3BvbmRlcl9mdG1fcmVzWzBdOworfSBfX3BhY2tlZDsKKworZW51bSB3bWlfdG9mX2NoYW5uZWxfaW5mb190eXBlIHsKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19BT0EJCT0gMHgwMCwKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19MQ0kJCT0gMHgwMSwKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19MQ1IJCT0gMHgwMiwKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19WRU5ET1JfU1BFQ0lGSUMJPSAweDAzLAorCVdNSV9UT0ZfQ0hBTk5FTF9JTkZPX0NJUgkJPSAweDA0LAorCVdNSV9UT0ZfQ0hBTk5FTF9JTkZPX1JTU0kJCT0gMHgwNSwKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19TTlIJCT0gMHgwNiwKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19ERUJVRwkJPSAweDA3LAorfTsKKworLyogV01JX1RPRl9DSEFOTkVMX0lORk9fRVZFTlRJRCAqLworc3RydWN0IHdtaV90b2ZfY2hhbm5lbF9pbmZvX2V2ZW50IHsKKwkvKiBGVE0gc2Vzc2lvbiBJRCAqLworCV9fbGUzMiBzZXNzaW9uX2lkOworCS8qIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzICovCisJdTggZHN0X21hY1tXTUlfTUFDX0xFTl07CisJLyogd21pX3RvZl9jaGFubmVsX2luZm9fdHlwZV9lICovCisJdTggdHlwZTsKKwkvKiBkYXRhIHJlcG9ydCBsZW5ndGggKi8KKwl1OCBsZW47CisJLyogZGF0YSByZXBvcnQgcGF5bG9hZCAqLworCXU4IHJlcG9ydFswXTsKK30gX19wYWNrZWQ7CisKICNlbmRpZiAvKiBfX1dJTE9DSVRZX1dNSV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2I0My9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9iNDMvZGVidWdmcy5jCmluZGV4IGI0YmNkOTQuLjc3MDQ2MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2I0My9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYjQzL2RlYnVnZnMuYwpAQCAtNTI0LDcgKzUyNCw4IEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQlkZm9wcyA9IGNvbnRhaW5lcl9vZihmaWxlLT5mX29wLCBzdHJ1Y3QgYjQzX2RlYnVnZnNfZm9wcywgZm9wcyk7CisJZGZvcHMgPSBjb250YWluZXJfb2YoZGVidWdmc19yZWFsX2ZvcHMoZmlsZSksCisJCQkgICAgIHN0cnVjdCBiNDNfZGVidWdmc19mb3BzLCBmb3BzKTsKIAlpZiAoIWRmb3BzLT5yZWFkKSB7CiAJCWVyciA9IC1FTk9TWVM7CiAJCWdvdG8gb3V0X3VubG9jazsKQEAgLTU4NSw3ICs1ODYsOCBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0JZGZvcHMgPSBjb250YWluZXJfb2YoZmlsZS0+Zl9vcCwgc3RydWN0IGI0M19kZWJ1Z2ZzX2ZvcHMsIGZvcHMpOworCWRmb3BzID0gY29udGFpbmVyX29mKGRlYnVnZnNfcmVhbF9mb3BzKGZpbGUpLAorCQkJICAgICBzdHJ1Y3QgYjQzX2RlYnVnZnNfZm9wcywgZm9wcyk7CiAJaWYgKCFkZm9wcy0+d3JpdGUpIHsKIAkJZXJyID0gLUVOT1NZUzsKIAkJZ290byBvdXRfdW5sb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYjQzbGVnYWN5L2RlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2I0M2xlZ2FjeS9kZWJ1Z2ZzLmMKaW5kZXggMDkwOTEwZS4uODJlZjU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYjQzbGVnYWN5L2RlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9iNDNsZWdhY3kvZGVidWdmcy5jCkBAIC0yMjEsNyArMjIxLDggQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAotCWRmb3BzID0gY29udGFpbmVyX29mKGZpbGUtPmZfb3AsIHN0cnVjdCBiNDNsZWdhY3lfZGVidWdmc19mb3BzLCBmb3BzKTsKKwlkZm9wcyA9IGNvbnRhaW5lcl9vZihkZWJ1Z2ZzX3JlYWxfZm9wcyhmaWxlKSwKKwkJCSAgICAgc3RydWN0IGI0M2xlZ2FjeV9kZWJ1Z2ZzX2ZvcHMsIGZvcHMpOwogCWlmICghZGZvcHMtPnJlYWQpIHsKIAkJZXJyID0gLUVOT1NZUzsKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtMjg3LDcgKzI4OCw4IEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQlkZm9wcyA9IGNvbnRhaW5lcl9vZihmaWxlLT5mX29wLCBzdHJ1Y3QgYjQzbGVnYWN5X2RlYnVnZnNfZm9wcywgZm9wcyk7CisJZGZvcHMgPSBjb250YWluZXJfb2YoZGVidWdmc19yZWFsX2ZvcHMoZmlsZSksCisJCQkgICAgIHN0cnVjdCBiNDNsZWdhY3lfZGVidWdmc19mb3BzLCBmb3BzKTsKIAlpZiAoIWRmb3BzLT53cml0ZSkgewogCQllcnIgPSAtRU5PU1lTOwogCQlnb3RvIG91dF91bmxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvYmNkYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2JjZGMuYwppbmRleCBkMWJjNTFmLi4wMzhhOTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvYmNkYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9iY2RjLmMKQEAgLTE5NCw3ICsxOTQsNyBAQAogCX0KIAogCS8qIENoZWNrIGluZm8gYnVmZmVyICovCi0JaW5mbyA9ICh2b2lkICopJm1zZ1sxXTsKKwlpbmZvID0gKHZvaWQgKikmYmNkYy0+YnVmWzBdOwogCiAJLyogQ29weSBpbmZvIGJ1ZmZlciAqLwogCWlmIChidWYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGguYwppbmRleCBmNTQ5YzI1Li43MjEzOWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaC5jCkBAIC00MjAsNyArNDIwLDcgQEAKIAogdTMyIGJyY21mX3NkaW9kX3JlZ3JsKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdTMyIGFkZHIsIGludCAqcmV0KQogewotCXUzMiBkYXRhOworCXUzMiBkYXRhID0gMDsKIAlpbnQgcmV0dmFsOwogCiAJYnJjbWZfZGJnKFNESU8sICJhZGRyOjB4JTA4eFxuIiwgYWRkcik7CkBAIC0xMTAxLDYgKzExMDEsNyBAQAogCUJSQ01GX1NESU9fREVWSUNFKFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMzQxKSwKIAlCUkNNRl9TRElPX0RFVklDRShTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzM2MiksCiAJQlJDTUZfU0RJT19ERVZJQ0UoU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzNV80MzM5KSwKKwlCUkNNRl9TRElPX0RFVklDRShTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzM5KSwKIAlCUkNNRl9TRElPX0RFVklDRShTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzQzMCksCiAJQlJDTUZfU0RJT19ERVZJQ0UoU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDM0NSksCiAJQlJDTUZfU0RJT19ERVZJQ0UoU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDM1NCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvY2ZnODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jZmc4MDIxMS5jCmluZGV4IDI2MjhkNWUuLmI3NzdlMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jZmc4MDIxMS5jCkBAIC0xNTk1LDE1ICsxNTk1LDkgQEAKIAkJdmFsID0gMTsKIAkJYnJjbWZfZGJnKENPTk4sICJzaGFyZWQga2V5XG4iKTsKIAkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0FVVEhUWVBFX0FVVE9NQVRJQzoKLQkJdmFsID0gMjsKLQkJYnJjbWZfZGJnKENPTk4sICJhdXRvbWF0aWNcbiIpOwotCQlicmVhazsKLQljYXNlIE5MODAyMTFfQVVUSFRZUEVfTkVUV09SS19FQVA6Ci0JCWJyY21mX2RiZyhDT05OLCAibmV0d29yayBlYXBcbiIpOwogCWRlZmF1bHQ6CiAJCXZhbCA9IDI7Ci0JCWJyY21mX2VycigiaW52YWxpZCBhdXRoIHR5cGUgKCVkKVxuIiwgc21lLT5hdXRoX3R5cGUpOworCQlicmNtZl9kYmcoQ09OTiwgImF1dG9tYXRpYywgYXV0aCB0eXBlICglZClcbiIsIHNtZS0+YXV0aF90eXBlKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0yNTMzLDcgKzI1MjcsNyBAQAogCQkJCSAgICAgV0xfQlNTX0lORk9fTUFYKTsKIAlpZiAoZXJyKSB7CiAJCWJyY21mX2VycigiRmFpbGVkIHRvIGdldCBic3MgaW5mbyAoJWQpXG4iLCBlcnIpOwotCQlyZXR1cm47CisJCWdvdG8gb3V0X2tmcmVlOwogCX0KIAlzaS0+ZmlsbGVkIHw9IEJJVChOTDgwMjExX1NUQV9JTkZPX0JTU19QQVJBTSk7CiAJc2ktPmJzc19wYXJhbS5iZWFjb25faW50ZXJ2YWwgPSBsZTE2X3RvX2NwdShidWYtPmJzc19sZS5iZWFjb25fcGVyaW9kKTsKQEAgLTI1NDUsNiArMjUzOSw5IEBACiAJCXNpLT5ic3NfcGFyYW0uZmxhZ3MgfD0gQlNTX1BBUkFNX0ZMQUdTX1NIT1JUX1BSRUFNQkxFOwogCWlmIChjYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1RfVElNRSkKIAkJc2ktPmJzc19wYXJhbS5mbGFncyB8PSBCU1NfUEFSQU1fRkxBR1NfU0hPUlRfU0xPVF9USU1FOworCitvdXRfa2ZyZWU6CisJa2ZyZWUoYnVmKTsKIH0KIAogc3RhdGljIHMzMgpAQCAtMzcwMyw2ICszNzAwLDcgQEAKIAkJCQkgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293bCkKIHsKIAl1MzIgd293bF9jb25maWc7CisJc3RydWN0IGJyY21mX3dvd2xfd2FrZWluZF9sZSB3b3dsX3dha2VpbmQ7CiAJdTMyIGk7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJTdXNwZW5kLCB3b3dsIGNvbmZpZy5cbiIpOwpAQCAtMzc0NCw4ICszNzQyLDkgQEAKIAlpZiAoIXRlc3RfYml0KEJSQ01GX1ZJRl9TVEFUVVNfQ09OTkVDVEVELCAmaWZwLT52aWYtPnNtZV9zdGF0ZSkpCiAJCXdvd2xfY29uZmlnIHw9IEJSQ01GX1dPV0xfVU5BU1NPQzsKIAotCWJyY21mX2ZpbF9pb3Zhcl9kYXRhX3NldChpZnAsICJ3b3dsX3dha2VpbmQiLCAiY2xlYXIiLAotCQkJCSBzaXplb2Yoc3RydWN0IGJyY21mX3dvd2xfd2FrZWluZF9sZSkpOworCW1lbWNweSgmd293bF93YWtlaW5kLCAiY2xlYXIiLCA2KTsKKwlicmNtZl9maWxfaW92YXJfZGF0YV9zZXQoaWZwLCAid293bF93YWtlaW5kIiwgJndvd2xfd2FrZWluZCwKKwkJCQkgc2l6ZW9mKHdvd2xfd2FrZWluZCkpOwogCWJyY21mX2ZpbF9pb3Zhcl9pbnRfc2V0KGlmcCwgIndvd2wiLCB3b3dsX2NvbmZpZyk7CiAJYnJjbWZfZmlsX2lvdmFyX2ludF9zZXQoaWZwLCAid293bF9hY3RpdmF0ZSIsIDEpOwogCWJyY21mX2J1c193b3dsX2NvbmZpZyhjZmctPnB1Yi0+YnVzX2lmLCB0cnVlKTsKQEAgLTM4ODQsMTEgKzM4ODMsMTEgQEAKIAlpZiAoIWNoZWNrX3ZpZl91cChpZnAtPnZpZikpCiAJCXJldHVybiAtRUlPOwogCi0JYnJjbWZfZGJnKENPTk4sICJkZWxfcG1rc2EgLSBQTUsgYnNzaWQgPSAlcE1cbiIsICZwbWtzYS0+YnNzaWQpOworCWJyY21mX2RiZyhDT05OLCAiZGVsX3Bta3NhIC0gUE1LIGJzc2lkID0gJXBNXG4iLCBwbWtzYS0+YnNzaWQpOwogCiAJbnBtayA9IGxlMzJfdG9fY3B1KGNmZy0+cG1rX2xpc3QubnBtayk7CiAJZm9yIChpID0gMDsgaSA8IG5wbWs7IGkrKykKLQkJaWYgKCFtZW1jbXAoJnBta3NhLT5ic3NpZCwgJnBta1tpXS5ic3NpZCwgRVRIX0FMRU4pKQorCQlpZiAoIW1lbWNtcChwbWtzYS0+YnNzaWQsIHBta1tpXS5ic3NpZCwgRVRIX0FMRU4pKQogCQkJYnJlYWs7CiAKIAlpZiAoKG5wbWsgPiAwKSAmJiAoaSA8IG5wbWspKSB7CkBAIC00NTAyLDYgKzQ1MDEsNyBAQAogCXUxNiBjaGFuc3BlYyA9IGNoYW5kZWZfdG9fY2hhbnNwZWMoJmNmZy0+ZDExaW5mLCAmc2V0dGluZ3MtPmNoYW5kZWYpOwogCWJvb2wgbWJzczsKIAlpbnQgaXNfMTFkOworCWJvb2wgc3VwcG9ydHNfMTFkOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiY3RybGNobj0lZCwgY2VudGVyPSVkLCBidz0lZCwgYmVhY29uX2ludGVydmFsPSVkLCBkdGltX3BlcmlvZD0lZCxcbiIsCiAJCSAgc2V0dGluZ3MtPmNoYW5kZWYuY2hhbi0+aHdfdmFsdWUsCkBAIC00NTE0LDExICs0NTE0LDE2IEBACiAJbWJzcyA9IGlmcC0+dmlmLT5tYnNzOwogCiAJLyogc3RvcmUgY3VycmVudCAxMWQgc2V0dGluZyAqLwotCWJyY21mX2ZpbF9jbWRfaW50X2dldChpZnAsIEJSQ01GX0NfR0VUX1JFR1VMQVRPUlksICZpZnAtPnZpZi0+aXNfMTFkKTsKLQljb3VudHJ5X2llID0gYnJjbWZfcGFyc2VfdGx2cygodTggKilzZXR0aW5ncy0+YmVhY29uLnRhaWwsCi0JCQkJICAgICAgc2V0dGluZ3MtPmJlYWNvbi50YWlsX2xlbiwKLQkJCQkgICAgICBXTEFOX0VJRF9DT1VOVFJZKTsKLQlpc18xMWQgPSBjb3VudHJ5X2llID8gMSA6IDA7CisJaWYgKGJyY21mX2ZpbF9jbWRfaW50X2dldChpZnAsIEJSQ01GX0NfR0VUX1JFR1VMQVRPUlksCisJCQkJICAmaWZwLT52aWYtPmlzXzExZCkpIHsKKwkJc3VwcG9ydHNfMTFkID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJY291bnRyeV9pZSA9IGJyY21mX3BhcnNlX3RsdnMoKHU4ICopc2V0dGluZ3MtPmJlYWNvbi50YWlsLAorCQkJCQkgICAgICBzZXR0aW5ncy0+YmVhY29uLnRhaWxfbGVuLAorCQkJCQkgICAgICBXTEFOX0VJRF9DT1VOVFJZKTsKKwkJaXNfMTFkID0gY291bnRyeV9pZSA/IDEgOiAwOworCQlzdXBwb3J0c18xMWQgPSB0cnVlOworCX0KIAogCW1lbXNldCgmc3NpZF9sZSwgMCwgc2l6ZW9mKHNzaWRfbGUpKTsKIAlpZiAoc2V0dGluZ3MtPnNzaWQgPT0gTlVMTCB8fCBzZXR0aW5ncy0+c3NpZF9sZW4gPT0gMCkgewpAQCAtNDUyNyw3ICs0NTMyLDcgQEAKIAkJCQkodTggKikmc2V0dGluZ3MtPmJlYWNvbi5oZWFkW2llX29mZnNldF0sCiAJCQkJc2V0dGluZ3MtPmJlYWNvbi5oZWFkX2xlbiAtIGllX29mZnNldCwKIAkJCQlXTEFOX0VJRF9TU0lEKTsKLQkJaWYgKCFzc2lkX2llKQorCQlpZiAoIXNzaWRfaWUgfHwgc3NpZF9pZS0+bGVuID4gSUVFRTgwMjExX01BWF9TU0lEX0xFTikKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCW1lbWNweShzc2lkX2xlLlNTSUQsIHNzaWRfaWUtPmRhdGEsIHNzaWRfaWUtPmxlbik7CkBAIC00NTc3LDcgKzQ1ODIsNyBAQAogCiAJLyogUGFyYW1ldGVycyBzaGFyZWQgYnkgYWxsIHJhZGlvIGludGVyZmFjZXMgKi8KIAlpZiAoIW1ic3MpIHsKLQkJaWYgKGlzXzExZCAhPSBpZnAtPnZpZi0+aXNfMTFkKSB7CisJCWlmICgoc3VwcG9ydHNfMTFkKSAmJiAoaXNfMTFkICE9IGlmcC0+dmlmLT5pc18xMWQpKSB7CiAJCQllcnIgPSBicmNtZl9maWxfY21kX2ludF9zZXQoaWZwLCBCUkNNRl9DX1NFVF9SRUdVTEFUT1JZLAogCQkJCQkJICAgIGlzXzExZCk7CiAJCQlpZiAoZXJyIDwgMCkgewpAQCAtNDYxOSw3ICs0NjI0LDcgQEAKIAkJCWJyY21mX2VycigiU0VUIElORlJBIGVycm9yICVkXG4iLCBlcnIpOwogCQkJZ290byBleGl0OwogCQl9Ci0JfSBlbHNlIGlmIChXQVJOX09OKGlzXzExZCAhPSBpZnAtPnZpZi0+aXNfMTFkKSkgeworCX0gZWxzZSBpZiAoV0FSTl9PTihzdXBwb3J0c18xMWQgJiYgKGlzXzExZCAhPSBpZnAtPnZpZi0+aXNfMTFkKSkpIHsKIAkJLyogTXVsdGlwbGUtQlNTIHNob3VsZCB1c2Ugc2FtZSAxMWQgY29uZmlndXJhdGlvbiAqLwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGV4aXQ7CkBAIC00NzUzLDExICs0NzU4LDggQEAKIAkJCWJyY21mX2Vycigic2V0dGluZyBJTkZSQSBtb2RlIGZhaWxlZCAlZFxuIiwgZXJyKTsKIAkJaWYgKGJyY21mX2ZlYXRfaXNfZW5hYmxlZChpZnAsIEJSQ01GX0ZFQVRfTUJTUykpCiAJCQlicmNtZl9maWxfaW92YXJfaW50X3NldChpZnAsICJtYnNzIiwgMCk7Ci0JCWVyciA9IGJyY21mX2ZpbF9jbWRfaW50X3NldChpZnAsIEJSQ01GX0NfU0VUX1JFR1VMQVRPUlksCi0JCQkJCSAgICBpZnAtPnZpZi0+aXNfMTFkKTsKLQkJaWYgKGVyciA8IDApCi0JCQlicmNtZl9lcnIoInJlc3RvcmluZyBSRUdVTEFUT1JZIHNldHRpbmcgZmFpbGVkICVkXG4iLAotCQkJCSAgZXJyKTsKKwkJYnJjbWZfZmlsX2NtZF9pbnRfc2V0KGlmcCwgQlJDTUZfQ19TRVRfUkVHVUxBVE9SWSwKKwkJCQkgICAgICBpZnAtPnZpZi0+aXNfMTFkKTsKIAkJLyogQnJpbmcgZGV2aWNlIGJhY2sgdXAgc28gaXQgY2FuIGJlIHVzZWQgYWdhaW4gKi8KIAkJZXJyID0gYnJjbWZfZmlsX2NtZF9pbnRfc2V0KGlmcCwgQlJDTUZfQ19VUCwgMSk7CiAJCWlmIChlcnIgPCAwKQpAQCAtNTYzNSw3ICs1NjM3LDcgQEAKIAkJICBpZmV2ZW50LT5hY3Rpb24sIGlmZXZlbnQtPmZsYWdzLCBpZmV2ZW50LT5pZmlkeCwKIAkJICBpZmV2ZW50LT5ic3NjZmdpZHgpOwogCi0JbXV0ZXhfbG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKKwlzcGluX2xvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CiAJZXZlbnQtPmFjdGlvbiA9IGlmZXZlbnQtPmFjdGlvbjsKIAl2aWYgPSBldmVudC0+dmlmOwogCkBAIC01NjQzLDcgKzU2NDUsNyBAQAogCWNhc2UgQlJDTUZfRV9JRl9BREQ6CiAJCS8qIHdhaXRpbmcgcHJvY2VzcyBtYXkgaGF2ZSB0aW1lZCBvdXQgKi8KIAkJaWYgKCFjZmctPnZpZl9ldmVudC52aWYpIHsKLQkJCW11dGV4X3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOwogCQkJcmV0dXJuIC1FQkFERjsKIAkJfQogCkBAIC01NjU0LDI0ICs1NjU2LDI0IEBACiAJCQlpZnAtPm5kZXYtPmllZWU4MDIxMV9wdHIgPSAmdmlmLT53ZGV2OwogCQkJU0VUX05FVERFVl9ERVYoaWZwLT5uZGV2LCB3aXBoeV9kZXYoY2ZnLT53aXBoeSkpOwogCQl9Ci0JCW11dGV4X3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CiAJCXdha2VfdXAoJmV2ZW50LT52aWZfd3EpOwogCQlyZXR1cm4gMDsKIAogCWNhc2UgQlJDTUZfRV9JRl9ERUw6Ci0JCW11dGV4X3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CiAJCS8qIGV2ZW50IG1heSBub3QgYmUgdXBvbiB1c2VyIHJlcXVlc3QgKi8KIAkJaWYgKGJyY21mX2NmZzgwMjExX3ZpZl9ldmVudF9hcm1lZChjZmcpKQogCQkJd2FrZV91cCgmZXZlbnQtPnZpZl93cSk7CiAJCXJldHVybiAwOwogCiAJY2FzZSBCUkNNRl9FX0lGX0NIQU5HRToKLQkJbXV0ZXhfdW5sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOworCQlzcGluX3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKIAkJd2FrZV91cCgmZXZlbnQtPnZpZl93cSk7CiAJCXJldHVybiAwOwogCiAJZGVmYXVsdDoKLQkJbXV0ZXhfdW5sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOworCQlzcGluX3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiAtRUlOVkFMOwpAQCAtNTc5Miw3ICs1Nzk0LDcgQEAKIHN0YXRpYyB2b2lkIGluaXRfdmlmX2V2ZW50KHN0cnVjdCBicmNtZl9jZmc4MDIxMV92aWZfZXZlbnQgKmV2ZW50KQogewogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmV2ZW50LT52aWZfd3EpOwotCW11dGV4X2luaXQoJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CiB9CiAKIHN0YXRpYyBzMzIgYnJjbWZfZG9uZ2xlX3JvYW0oc3RydWN0IGJyY21mX2lmICppZnApCkBAIC02NjkxLDkgKzY2OTMsOSBAQAogewogCXU4IGV2dF9hY3Rpb247CiAKLQltdXRleF9sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOworCXNwaW5fbG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKIAlldnRfYWN0aW9uID0gZXZlbnQtPmFjdGlvbjsKLQltdXRleF91bmxvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CisJc3Bpbl91bmxvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CiAJcmV0dXJuIGV2dF9hY3Rpb24gPT0gYWN0aW9uOwogfQogCkBAIC02NzAyLDEwICs2NzA0LDEwIEBACiB7CiAJc3RydWN0IGJyY21mX2NmZzgwMjExX3ZpZl9ldmVudCAqZXZlbnQgPSAmY2ZnLT52aWZfZXZlbnQ7CiAKLQltdXRleF9sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOworCXNwaW5fbG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKIAlldmVudC0+dmlmID0gdmlmOwogCWV2ZW50LT5hY3Rpb24gPSAwOwotCW11dGV4X3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKKwlzcGluX3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKIH0KIAogYm9vbCBicmNtZl9jZmc4MDIxMV92aWZfZXZlbnRfYXJtZWQoc3RydWN0IGJyY21mX2NmZzgwMjExX2luZm8gKmNmZykKQEAgLTY3MTMsOSArNjcxNSw5IEBACiAJc3RydWN0IGJyY21mX2NmZzgwMjExX3ZpZl9ldmVudCAqZXZlbnQgPSAmY2ZnLT52aWZfZXZlbnQ7CiAJYm9vbCBhcm1lZDsKIAotCW11dGV4X2xvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CisJc3Bpbl9sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOwogCWFybWVkID0gZXZlbnQtPnZpZiAhPSBOVUxMOwotCW11dGV4X3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKKwlzcGluX3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKIAogCXJldHVybiBhcm1lZDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jZmc4MDIxMS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NmZzgwMjExLmgKaW5kZXggN2Q3N2Y4Ni4uODg4OTgzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NmZzgwMjExLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NmZzgwMjExLmgKQEAgLTIyNyw3ICsyMjcsNyBAQAogICovCiBzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfdmlmX2V2ZW50IHsKIAl3YWl0X3F1ZXVlX2hlYWRfdCB2aWZfd3E7Ci0Jc3RydWN0IG11dGV4IHZpZl9ldmVudF9sb2NrOworCXNwaW5sb2NrX3QgdmlmX2V2ZW50X2xvY2s7CiAJdTggYWN0aW9uOwogCXN0cnVjdCBicmNtZl9jZmc4MDIxMV92aWYgKnZpZjsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvY29yZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NvcmUuYwppbmRleCA4ZDE2ZjAyLi41ZWFhYzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jb3JlLmMKQEAgLTEzNiwyNyArMTM2LDYgQEAKIAkJCSAgZXJyKTsKIH0KIAotc3RhdGljIHZvaWQKLV9icmNtZl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBicmNtZl9pZiAqaWZwOwotCXMzMiBlcnI7Ci0KLQlpZnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJyY21mX2lmLCBzZXRtYWNhZGRyX3dvcmspOwotCi0JYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXIsIGJzc2NmZ2lkeD0lZFxuIiwgaWZwLT5ic3NjZmdpZHgpOwotCi0JZXJyID0gYnJjbWZfZmlsX2lvdmFyX2RhdGFfc2V0KGlmcCwgImN1cl9ldGhlcmFkZHIiLCBpZnAtPm1hY19hZGRyLAotCQkJCSAgICAgICBFVEhfQUxFTik7Ci0JaWYgKGVyciA8IDApIHsKLQkJYnJjbWZfZXJyKCJTZXR0aW5nIGN1cl9ldGhlcmFkZHIgZmFpbGVkLCAlZFxuIiwgZXJyKTsKLQl9IGVsc2UgewotCQlicmNtZl9kYmcoVFJBQ0UsICJNQUMgYWRkcmVzcyB1cGRhdGVkIHRvICVwTVxuIiwKLQkJCSAgaWZwLT5tYWNfYWRkcik7Ci0JCW1lbWNweShpZnAtPm5kZXYtPmRldl9hZGRyLCBpZnAtPm1hY19hZGRyLCBFVEhfQUxFTik7Ci0JfQotfQotCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIHN0YXRpYyB2b2lkIF9icmNtZl91cGRhdGVfbmR0YWJsZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CkBAIC0xOTAsMTAgKzE2OSwyMCBAQAogewogCXN0cnVjdCBicmNtZl9pZiAqaWZwID0gbmV0ZGV2X3ByaXYobmRldik7CiAJc3RydWN0IHNvY2thZGRyICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyOworCWludCBlcnI7CiAKLQltZW1jcHkoJmlmcC0+bWFjX2FkZHIsIHNhLT5zYV9kYXRhLCBFVEhfQUxFTik7Ci0Jc2NoZWR1bGVfd29yaygmaWZwLT5zZXRtYWNhZGRyX3dvcmspOwotCXJldHVybiAwOworCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyLCBic3NjZmdpZHg9JWRcbiIsIGlmcC0+YnNzY2ZnaWR4KTsKKworCWVyciA9IGJyY21mX2ZpbF9pb3Zhcl9kYXRhX3NldChpZnAsICJjdXJfZXRoZXJhZGRyIiwgc2EtPnNhX2RhdGEsCisJCQkJICAgICAgIEVUSF9BTEVOKTsKKwlpZiAoZXJyIDwgMCkgeworCQlicmNtZl9lcnIoIlNldHRpbmcgY3VyX2V0aGVyYWRkciBmYWlsZWQsICVkXG4iLCBlcnIpOworCX0gZWxzZSB7CisJCWJyY21mX2RiZyhUUkFDRSwgInVwZGF0ZWQgdG8gJXBNXG4iLCBzYS0+c2FfZGF0YSk7CisJCW1lbWNweShpZnAtPm1hY19hZGRyLCBzYS0+c2FfZGF0YSwgRVRIX0FMRU4pOworCQltZW1jcHkoaWZwLT5uZGV2LT5kZXZfYWRkciwgaWZwLT5tYWNfYWRkciwgRVRIX0FMRU4pOworCX0KKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBicmNtZl9uZXRkZXZfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQpAQCAtNTE5LDEzICs1MDgsOSBAQAogCW5kZXYtPm5lZWRlZF9oZWFkcm9vbSArPSBkcnZyLT5oZHJsZW47CiAJbmRldi0+ZXRodG9vbF9vcHMgPSAmYnJjbWZfZXRodG9vbF9vcHM7CiAKLQlkcnZyLT5yeHN6ID0gbmRldi0+bXR1ICsgbmRldi0+aGFyZF9oZWFkZXJfbGVuICsKLQkJCSAgICAgIGRydnItPmhkcmxlbjsKLQogCS8qIHNldCB0aGUgbWFjIGFkZHJlc3MgKi8KIAltZW1jcHkobmRldi0+ZGV2X2FkZHIsIGlmcC0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKIAotCUlOSVRfV09SSygmaWZwLT5zZXRtYWNhZGRyX3dvcmssIF9icmNtZl9zZXRfbWFjX2FkZHJlc3MpOwogCUlOSVRfV09SSygmaWZwLT5tdWx0aWNhc3Rfd29yaywgX2JyY21mX3NldF9tdWx0aWNhc3RfbGlzdCk7CiAJSU5JVF9XT1JLKCZpZnAtPm5kb2ZmbG9hZF93b3JrLCBfYnJjbWZfdXBkYXRlX25kdGFibGUpOwogCkBAIC03MzAsNyArNzE1LDYgQEAKIAkJfQogCiAJCWlmIChpZnAtPm5kZXYtPm5ldGRldl9vcHMgPT0gJmJyY21mX25ldGRldl9vcHNfcHJpKSB7Ci0JCQljYW5jZWxfd29ya19zeW5jKCZpZnAtPnNldG1hY2FkZHJfd29yayk7CiAJCQljYW5jZWxfd29ya19zeW5jKCZpZnAtPm11bHRpY2FzdF93b3JrKTsKIAkJCWNhbmNlbF93b3JrX3N5bmMoJmlmcC0+bmRvZmZsb2FkX3dvcmspOwogCQl9CkBAIC03NDMsNyArNzI3LDcgQEAKIAkJICogc2VyaW91cyB0cm91Ymxlc29tZSBzaWRlIGVmZmVjdHMuIFRoZSBwMnAgbW9kdWxlIHdpbGwgY2xlYW4KIAkJICogdXAgdGhlIGlmcCBpZiBuZWVkZWQuCiAJCSAqLwotCQlicmNtZl9wMnBfaWZwX3JlbW92ZWQoaWZwKTsKKwkJYnJjbWZfcDJwX2lmcF9yZW1vdmVkKGlmcCwgcnRubF9sb2NrZWQpOwogCQlrZnJlZShpZnApOwogCX0KIH0KQEAgLTg4Niw5ICs4NzAsMTIgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIE5FVERFVl9ET1dOOgotCQlpZiAoaSA8IE5ET0xfTUFYX0VOVFJJRVMpCi0JCQlmb3IgKDsgaSA8IGlmcC0+aXB2NmFkZHJfaWR4OyBpKyspCisJCWlmIChpIDwgTkRPTF9NQVhfRU5UUklFUykgeworCQkJZm9yICg7IGkgPCBpZnAtPmlwdjZhZGRyX2lkeCAtIDE7IGkrKykKIAkJCQl0YWJsZVtpXSA9IHRhYmxlW2kgKyAxXTsKKwkJCW1lbXNldCgmdGFibGVbaV0sIDAsIHNpemVvZih0YWJsZVtpXSkpOworCQkJaWZwLT5pcHY2YWRkcl9pZHgtLTsKKwkJfQogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTEwNjEsOCArMTA0OCw3IEBACiAJCWJyY21mX2Z3c19kZWxfaW50ZXJmYWNlKGlmcCk7CiAJCWJyY21mX2Z3c19kZWluaXQoZHJ2cik7CiAJfQotCWlmIChpZnApCi0JCWJyY21mX25ldF9kZXRhY2goaWZwLT5uZGV2LCBmYWxzZSk7CisJYnJjbWZfbmV0X2RldGFjaChpZnAtPm5kZXYsIGZhbHNlKTsKIAlpZiAocDJwX2lmcCkKIAkJYnJjbWZfbmV0X2RldGFjaChwMnBfaWZwLT5uZGV2LCBmYWxzZSk7CiAJZHJ2ci0+aWZsaXN0WzBdID0gTlVMTDsKQEAgLTExNjksNyArMTE1NSw4IEBACiAJCQkJICFicmNtZl9nZXRfcGVuZF84MDIxeF9jbnQoaWZwKSwKIAkJCQkgTUFYX1dBSVRfRk9SXzgwMjFYX1RYKTsKIAotCVdBUk5fT04oIWVycik7CisJaWYgKCFlcnIpCisJCWJyY21mX2VycigiVGltZWQgb3V0IHdhaXRpbmcgZm9yIG5vIHBlbmRpbmcgODAyLjF4IHBhY2tldHNcbiIpOwogCiAJcmV0dXJuICFlcnI7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvY29yZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NvcmUuaAppbmRleCA4ZmEzNGNhLi5jOTRkY2FiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvY29yZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jb3JlLmgKQEAgLTExMiwxNSArMTEyLDExIEBACiAKIAkvKiBJbnRlcm5hbCBicmNtZiBpdGVtcyAqLwogCXVpbnQgaGRybGVuOwkJLyogVG90YWwgQlJDTUYgaGVhZGVyIGxlbmd0aCAocHJvdG8gKyBidXMpICovCi0JdWludCByeHN6OwkJLyogUnggYnVmZmVyIHNpemUgYnVzIG1vZHVsZSBzaG91bGQgdXNlICovCiAKIAkvKiBEb25nbGUgbWVkaWEgaW5mbyAqLwogCWNoYXIgZnd2ZXJbQlJDTUZfRFJJVkVSX0ZJUk1XQVJFX1ZFUlNJT05fTEVOXTsKIAl1OCBtYWNbRVRIX0FMRU5dOwkJLyogTUFDIGFkZHJlc3Mgb2J0YWluZWQgZnJvbSBkb25nbGUgKi8KIAotCS8qIE11bHRpY2FzdCBkYXRhIHBhY2tldHMgc2VudCB0byBkb25nbGUgKi8KLQl1bnNpZ25lZCBsb25nIHR4X211bHRpY2FzdDsKLQogCXN0cnVjdCBtYWNfYWRkcmVzcyBhZGRyZXNzZXNbQlJDTUZfTUFYX0lGU107CiAKIAlzdHJ1Y3QgYnJjbWZfaWYgKmlmbGlzdFtCUkNNRl9NQVhfSUZTXTsKQEAgLTE3Niw3ICsxNzIsNiBAQAogICogQHZpZjogcG9pbnRzIHRvIGNmZzgwMjExIHNwZWNpZmljIGludGVyZmFjZSBpbmZvcm1hdGlvbi4KICAqIEBuZGV2OiBhc3NvY2lhdGVkIG5ldHdvcmsgZGV2aWNlLgogICogQHN0YXRzOiBpbnRlcmZhY2Ugc3BlY2lmaWMgbmV0d29yayBzdGF0aXN0aWNzLgotICogQHNldG1hY2FkZHJfd29yazogd29ya2VyIG9iamVjdCBmb3Igc2V0dGluZyBtYWMgYWRkcmVzcy4KICAqIEBtdWx0aWNhc3Rfd29yazogd29ya2VyIG9iamVjdCBmb3IgbXVsdGljYXN0IHByb3Zpc2lvbmluZy4KICAqIEBuZG9mZmxvYWRfd29yazogd29ya2VyIG9iamVjdCBmb3IgbmVpZ2hib3IgZGlzY292ZXJ5IG9mZmxvYWQgY29uZmlndXJhdGlvbi4KICAqIEBmd3NfZGVzYzogaW50ZXJmYWNlIHNwZWNpZmljIGZpcm13YXJlLXNpZ25hbGxpbmcgZGVzY3JpcHRvci4KQEAgLTE5Myw3ICsxODgsNiBAQAogCXN0cnVjdCBicmNtZl9jZmc4MDIxMV92aWYgKnZpZjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2V0bWFjYWRkcl93b3JrOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBtdWx0aWNhc3Rfd29yazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbmRvZmZsb2FkX3dvcms7CiAJc3RydWN0IGJyY21mX2Z3c19tYWNfZGVzY3JpcHRvciAqZndzX2Rlc2M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvZmxvd3JpbmcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9mbG93cmluZy5jCmluZGV4IDdlMjY5ZjkuLmQwYjczOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9mbG93cmluZy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9mbG93cmluZy5jCkBAIC0yMzQsMTMgKzIzNCwyMCBAQAogCiB2b2lkIGJyY21mX2Zsb3dyaW5nX2RlbGV0ZShzdHJ1Y3QgYnJjbWZfZmxvd3JpbmcgKmZsb3csIHUxNiBmbG93aWQpCiB7CisJc3RydWN0IGJyY21mX2J1cyAqYnVzX2lmID0gZGV2X2dldF9kcnZkYXRhKGZsb3ctPmRldik7CiAJc3RydWN0IGJyY21mX2Zsb3dyaW5nX3JpbmcgKnJpbmc7CisJc3RydWN0IGJyY21mX2lmICppZnA7CiAJdTE2IGhhc2hfaWR4OworCXU4IGlmaWR4OwogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlyaW5nID0gZmxvdy0+cmluZ3NbZmxvd2lkXTsKIAlpZiAoIXJpbmcpCiAJCXJldHVybjsKKworCWlmaWR4ID0gYnJjbWZfZmxvd3JpbmdfaWZpZHhfZ2V0KGZsb3csIGZsb3dpZCk7CisJaWZwID0gYnJjbWZfZ2V0X2lmcChidXNfaWYtPmRydnIsIGlmaWR4KTsKKwogCWJyY21mX2Zsb3dyaW5nX2Jsb2NrKGZsb3csIGZsb3dpZCwgZmFsc2UpOwogCWhhc2hfaWR4ID0gcmluZy0+aGFzaF9pZDsKIAlmbG93LT5oYXNoW2hhc2hfaWR4XS5pZmlkeCA9IEJSQ01GX0ZMT1dSSU5HX0lOVkFMSURfSUZJRFg7CkBAIC0yNDksNyArMjU2LDcgQEAKIAogCXNrYiA9IHNrYl9kZXF1ZXVlKCZyaW5nLT5za2JsaXN0KTsKIAl3aGlsZSAoc2tiKSB7Ci0JCWJyY211X3BrdF9idWZfZnJlZV9za2Ioc2tiKTsKKwkJYnJjbWZfdHhmaW5hbGl6ZShpZnAsIHNrYiwgZmFsc2UpOwogCQlza2IgPSBza2JfZGVxdWV1ZSgmcmluZy0+c2tibGlzdCk7CiAJfQogCkBAIC00OTUsMTQgKzUwMiwxOCBAQAogCX0gZWxzZSB7CiAJCXNlYXJjaCA9IGZsb3ctPnRkbHNfZW50cnk7CiAJCWlmIChtZW1jbXAoc2VhcmNoLT5tYWMsIHBlZXIsIEVUSF9BTEVOKSA9PSAwKQotCQkJcmV0dXJuOworCQkJZ290byBmcmVlX2VudHJ5OwogCQl3aGlsZSAoc2VhcmNoLT5uZXh0KSB7CiAJCQlzZWFyY2ggPSBzZWFyY2gtPm5leHQ7CiAJCQlpZiAobWVtY21wKHNlYXJjaC0+bWFjLCBwZWVyLCBFVEhfQUxFTikgPT0gMCkKLQkJCQlyZXR1cm47CisJCQkJZ290byBmcmVlX2VudHJ5OwogCQl9CiAJCXNlYXJjaC0+bmV4dCA9IHRkbHNfZW50cnk7CiAJfQogCiAJZmxvdy0+dGRsc19hY3RpdmUgPSB0cnVlOworCXJldHVybjsKKworZnJlZV9lbnRyeToKKwlrZnJlZSh0ZGxzX2VudHJ5KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9md3NpZ25hbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2Z3c2lnbmFsLmMKaW5kZXggOWY5MDI0YS4uYTE5MGY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2Z3c2lnbmFsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2Z3c2lnbmFsLmMKQEAgLTIxMDQsOCArMjEwNCw2IEBACiAJaWYgKChza2ItPnByaW9yaXR5ID09IDApIHx8IChza2ItPnByaW9yaXR5ID4gNykpCiAJCXNrYi0+cHJpb3JpdHkgPSBjZmc4MDIxMV9jbGFzc2lmeTgwMjFkKHNrYiwgTlVMTCk7CiAKLQlkcnZyLT50eF9tdWx0aWNhc3QgKz0gISFtdWx0aWNhc3Q7Ci0KIAlpZiAoZndzLT5hdm9pZF9xdWV1ZWluZykgewogCQlyYyA9IGJyY21mX3Byb3RvX3R4ZGF0YShkcnZyLCBpZnAtPmlmaWR4LCAwLCBza2IpOwogCQlpZiAocmMgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3AycC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3AycC5jCmluZGV4IDY2Zjk0MmYuLmRlMTljN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9wMnAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvcDJwLmMKQEAgLTIyOTcsNyArMjI5Nyw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotdm9pZCBicmNtZl9wMnBfaWZwX3JlbW92ZWQoc3RydWN0IGJyY21mX2lmICppZnApCit2b2lkIGJyY21mX3AycF9pZnBfcmVtb3ZlZChzdHJ1Y3QgYnJjbWZfaWYgKmlmcCwgYm9vbCBydG5sX2xvY2tlZCkKIHsKIAlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaW5mbyAqY2ZnOwogCXN0cnVjdCBicmNtZl9jZmc4MDIxMV92aWYgKnZpZjsKQEAgLTIzMDYsOSArMjMwNiwxMSBAQAogCXZpZiA9IGlmcC0+dmlmOwogCWNmZyA9IHdkZXZfdG9fY2ZnKCZ2aWYtPndkZXYpOwogCWNmZy0+cDJwLmJzc19pZHhbUDJQQVBJX0JTU0NGR19ERVZJQ0VdLnZpZiA9IE5VTEw7Ci0JcnRubF9sb2NrKCk7CisJaWYgKCFydG5sX2xvY2tlZCkKKwkJcnRubF9sb2NrKCk7CiAJY2ZnODAyMTFfdW5yZWdpc3Rlcl93ZGV2KCZ2aWYtPndkZXYpOwotCXJ0bmxfdW5sb2NrKCk7CisJaWYgKCFydG5sX2xvY2tlZCkKKwkJcnRubF91bmxvY2soKTsKIAlicmNtZl9mcmVlX3ZpZih2aWYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvcDJwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvcDJwLmgKaW5kZXggYTNiZDE4Yy4uOGNlOTQ0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3AycC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9wMnAuaApAQCAtMTU1LDcgKzE1NSw3IEBACiBpbnQgYnJjbWZfcDJwX2RlbF92aWYoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2Rldik7CiBpbnQgYnJjbWZfcDJwX2lmY2hhbmdlKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9pbmZvICpjZmcsCiAJCSAgICAgICBlbnVtIGJyY21mX2ZpbF9wMnBfaWZfdHlwZXMgaWZfdHlwZSk7Ci12b2lkIGJyY21mX3AycF9pZnBfcmVtb3ZlZChzdHJ1Y3QgYnJjbWZfaWYgKmlmcCk7Cit2b2lkIGJyY21mX3AycF9pZnBfcmVtb3ZlZChzdHJ1Y3QgYnJjbWZfaWYgKmlmcCwgYm9vbCBydG5sX2xvY2tlZCk7CiBpbnQgYnJjbWZfcDJwX3N0YXJ0X2RldmljZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKIHZvaWQgYnJjbWZfcDJwX3N0b3BfZGV2aWNlKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpOwogaW50IGJyY21mX3AycF9zY2FuX3ByZXAoc3RydWN0IHdpcGh5ICp3aXBoeSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvc2Rpby5jCmluZGV4IDY4YWIzYWMuLmI4OTJkYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3NkaW8uYwpAQCAtMzEzLDYgKzMxMyw3IEBACiAKICNkZWZpbmUgS1NPX1dBSVRfVVMgNTAKICNkZWZpbmUgTUFYX0tTT19BVFRFTVBUUyAoUE1VX01BWF9UUkFOU0lUSU9OX0RMWS9LU09fV0FJVF9VUykKKyNkZWZpbmUgQlJDTUZfU0RJT19NQVhfQUNDRVNTX0VSUk9SUwk1CiAKIC8qCiAgKiBDb252ZXJzaW9uIG9mIDgwMi4xRCBwcmlvcml0eSB0byBwcmVjZWRlbmNlIGxldmVsCkBAIC02NzcsNiArNjc4LDcgQEAKIHsKIAl1OCB3cl92YWwgPSAwLCByZF92YWwsIGNtcF92YWwsIGJtYXNrOwogCWludCBlcnIgPSAwOworCWludCBlcnJfY250ID0gMDsKIAlpbnQgdHJ5X2NudCA9IDA7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlcjogb249JWRcbiIsIG9uKTsKQEAgLTcxMiw5ICs3MTQsMTQgQEAKIAkJICovCiAJCXJkX3ZhbCA9IGJyY21mX3NkaW9kX3JlZ3JiKGJ1cy0+c2Rpb2RldiwgU0JTRElPX0ZVTkMxX1NMRUVQQ1NSLAogCQkJCQkgICAmZXJyKTsKLQkJaWYgKCgocmRfdmFsICYgYm1hc2spID09IGNtcF92YWwpICYmICFlcnIpCisJCWlmICghZXJyKSB7CisJCQlpZiAoKHJkX3ZhbCAmIGJtYXNrKSA9PSBjbXBfdmFsKQorCQkJCWJyZWFrOworCQkJZXJyX2NudCA9IDA7CisJCX0KKwkJLyogYmFpbCBvdXQgdXBvbiBzdWJzZXF1ZW50IGFjY2VzcyBlcnJvcnMgKi8KKwkJaWYgKGVyciAmJiAoZXJyX2NudCsrID4gQlJDTUZfU0RJT19NQVhfQUNDRVNTX0VSUk9SUykpCiAJCQlicmVhazsKLQogCQl1ZGVsYXkoS1NPX1dBSVRfVVMpOwogCQlicmNtZl9zZGlvZF9yZWd3YihidXMtPnNkaW9kZXYsIFNCU0RJT19GVU5DMV9TTEVFUENTUiwKIAkJCQkgIHdyX3ZhbCwgJmVycik7CkBAIC0zNzU3LDcgKzM3NjQsOCBAQAogCXUzMiB2YWwsIHJldjsKIAogCXZhbCA9IGJyY21mX3NkaW9kX3JlZ3JsKHNkaW9kZXYsIGFkZHIsIE5VTEwpOwotCWlmIChzZGlvZGV2LT5mdW5jWzBdLT5kZXZpY2UgPT0gU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzNV80MzM5ICYmCisJaWYgKChzZGlvZGV2LT5mdW5jWzBdLT5kZXZpY2UgPT0gU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzNV80MzM5IHx8CisJICAgICBzZGlvZGV2LT5mdW5jWzBdLT5kZXZpY2UgPT0gU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzOSkgJiYKIAkgICAgYWRkciA9PSBDT1JFX0NDX1JFRyhTSV9FTlVNX0JBU0UsIGNoaXBpZCkpIHsKIAkJcmV2ID0gKHZhbCAmIENJRF9SRVZfTUFTSykgPj4gQ0lEX1JFVl9TSElGVDsKIAkJaWYgKHJldiA+PSAyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvdHJhY2Vwb2ludC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3RyYWNlcG9pbnQuYwppbmRleCBhMTBmMzVjLi5mZTY3NTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvdHJhY2Vwb2ludC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy90cmFjZXBvaW50LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpZm5kZWYgX19DSEVDS0VSX18KICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgInRyYWNlcG9pbnQuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogCiB2b2lkIF9fYnJjbWZfZXJyKGNvbnN0IGNoYXIgKmZ1bmMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3VzYi5jCmluZGV4IDk4YjE1YTkuLjJmOTc4YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvdXNiLmMKQEAgLTEwOTksMTUgKzEwOTksMTEgQEAKIAlkZXZpbmZvLT50eF9mcmVlY291bnQgPSBudHhxOwogCiAJZGV2aW5mby0+Y3RsX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFkZXZpbmZvLT5jdGxfdXJiKSB7Ci0JCWJyY21mX2VycigidXNiX2FsbG9jX3VyYiAoY3RsKSBmYWlsZWRcbiIpOworCWlmICghZGV2aW5mby0+Y3RsX3VyYikKIAkJZ290byBlcnJvcjsKLQl9CiAJZGV2aW5mby0+YnVsa191cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwotCWlmICghZGV2aW5mby0+YnVsa191cmIpIHsKLQkJYnJjbWZfZXJyKCJ1c2JfYWxsb2NfdXJiIChidWxrKSBmYWlsZWRcbiIpOworCWlmICghZGV2aW5mby0+YnVsa191cmIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCiAJcmV0dXJuICZkZXZpbmZvLT5idXNfcHViOwogCkBAIC0xNDYyLDExICsxNDU4LDE1IEBACiAjZGVmaW5lIEJSQ01GX1VTQl9ERVZJQ0UoZGV2X2lkKQlcCiAJeyBVU0JfREVWSUNFKEJSQ01fVVNCX1ZFTkRPUl9JRF9CUk9BRENPTSwgZGV2X2lkKSB9CiAKKyNkZWZpbmUgTElOS1NZU19VU0JfREVWSUNFKGRldl9pZCkJXAorCXsgVVNCX0RFVklDRShCUkNNX1VTQl9WRU5ET1JfSURfTElOS1NZUywgZGV2X2lkKSB9CisKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBicmNtZl91c2JfZGV2aWRfdGFibGVbXSA9IHsKIAlCUkNNRl9VU0JfREVWSUNFKEJSQ01fVVNCXzQzMTQzX0RFVklDRV9JRCksCiAJQlJDTUZfVVNCX0RFVklDRShCUkNNX1VTQl80MzIzNl9ERVZJQ0VfSUQpLAogCUJSQ01GX1VTQl9ERVZJQ0UoQlJDTV9VU0JfNDMyNDJfREVWSUNFX0lEKSwKIAlCUkNNRl9VU0JfREVWSUNFKEJSQ01fVVNCXzQzNTY5X0RFVklDRV9JRCksCisJTElOS1NZU19VU0JfREVWSUNFKEJSQ01fVVNCXzQzMjM1X0xJTktTWVNfREVWSUNFX0lEKSwKIAl7IFVTQl9ERVZJQ0UoQlJDTV9VU0JfVkVORE9SX0lEX0xHLCBCUkNNX1VTQl80MzI0Ml9MR19ERVZJQ0VfSUQpIH0sCiAJLyogc3BlY2lhbCBlbnRyeSBmb3IgZGV2aWNlIHdpdGggZmlybXdhcmUgbG9hZGVkIGFuZCBydW5uaW5nICovCiAJQlJDTUZfVVNCX0RFVklDRShCUkNNX1VTQl9CQ01GV19ERVZJQ0VfSUQpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2luY2x1ZGUvYnJjbV9od19pZHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9pbmNsdWRlL2JyY21faHdfaWRzLmgKaW5kZXggM2NjNDJiZS4uZDA0MDdkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2luY2x1ZGUvYnJjbV9od19pZHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvaW5jbHVkZS9icmNtX2h3X2lkcy5oCkBAIC0yMiw2ICsyMiw3IEBACiAKICNkZWZpbmUgQlJDTV9VU0JfVkVORE9SX0lEX0JST0FEQ09NCTB4MGE1YwogI2RlZmluZSBCUkNNX1VTQl9WRU5ET1JfSURfTEcJCTB4MDQzZQorI2RlZmluZSBCUkNNX1VTQl9WRU5ET1JfSURfTElOS1NZUwkweDEzYjEKICNkZWZpbmUgQlJDTV9QQ0lFX1ZFTkRPUl9JRF9CUk9BRENPTQlQQ0lfVkVORE9SX0lEX0JST0FEQ09NCiAKIC8qIENoaXBjb21tb24gQ29yZSBDaGlwIElEcyAqLwpAQCAtNTgsNiArNTksNyBAQAogCiAvKiBVU0IgRGV2aWNlIElEcyAqLwogI2RlZmluZSBCUkNNX1VTQl80MzE0M19ERVZJQ0VfSUQJMHhiZDFlCisjZGVmaW5lIEJSQ01fVVNCXzQzMjM1X0xJTktTWVNfREVWSUNFX0lECTB4MDAzOQogI2RlZmluZSBCUkNNX1VTQl80MzIzNl9ERVZJQ0VfSUQJMHhiZDE3CiAjZGVmaW5lIEJSQ01fVVNCXzQzMjQyX0RFVklDRV9JRAkweGJkMWYKICNkZWZpbmUgQlJDTV9VU0JfNDMyNDJfTEdfREVWSUNFX0lECTB4MzEwMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsZWdhY3kvMzk0NS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsZWdhY3kvMzk0NS5jCmluZGV4IDIwOWRjOTkuLjRkYjMyN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bGVnYWN5LzM5NDUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2xlZ2FjeS8zOTQ1LmMKQEAgLTI2NzEsNyArMjY3MSw3IEBACiAJLnNlbmRfbGVkX2NtZCA9IGlsMzk0NV9zZW5kX2xlZF9jbWQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlsX2NmZyBpbDM5NDVfYmdfY2ZnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpbF9jZmcgaWwzOTQ1X2JnX2NmZyA9IHsKIAkubmFtZSA9ICIzOTQ1QkciLAogCS5md19uYW1lX3ByZSA9IElMMzk0NV9GV19QUkUsCiAJLnVjb2RlX2FwaV9tYXggPSBJTDM5NDVfVUNPREVfQVBJX01BWCwKQEAgLTI3MDAsNyArMjcwMCw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaWxfY2ZnIGlsMzk0NV9hYmdfY2ZnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpbF9jZmcgaWwzOTQ1X2FiZ19jZmcgPSB7CiAJLm5hbWUgPSAiMzk0NUFCRyIsCiAJLmZ3X25hbWVfcHJlID0gSUwzOTQ1X0ZXX1BSRSwKIAkudWNvZGVfYXBpX21heCA9IElMMzk0NV9VQ09ERV9BUElfTUFYLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsZWdhY3kvY29tbW9uLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2xlZ2FjeS9jb21tb24uaAppbmRleCA3MjZlZGUzLi4zYmJhNTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2xlZ2FjeS9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2xlZ2FjeS9jb21tb24uaApAQCAtMTMyMCw3ICsxMzIwLDcgQEAKIAl1NjQgdGltZXN0YW1wOwogCiAJdW5pb24gewotI2lmIGRlZmluZWQoQ09ORklHX0lXTDM5NDUpIHx8IGRlZmluZWQoQ09ORklHX0lXTDM5NDVfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lXTDM5NDUpCiAJCXN0cnVjdCB7CiAJCQl2b2lkICpzaGFyZWRfdmlydDsKIAkJCWRtYV9hZGRyX3Qgc2hhcmVkX3BoeXM7CkBAIC0xMzUxLDcgKzEzNTEsNyBAQAogCiAJCX0gXzM5NDU7CiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19JV0w0OTY1KSB8fCBkZWZpbmVkKENPTkZJR19JV0w0OTY1X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JV0w0OTY1KQogCQlzdHJ1Y3QgewogCQkJc3RydWN0IGlsX3J4X3BoeV9yZXMgbGFzdF9waHlfcmVzOwogCQkJYm9vbCBsYXN0X3BoeV9yZXNfdmFsaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2R2bS91Y29kZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9kdm0vdWNvZGUuYwppbmRleCBiNjYyY2YzLi5jNzUwOWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2R2bS91Y29kZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvZHZtL3Vjb2RlLmMKQEAgLTQ2LDE1ICs0Niw2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgZndfaW1nICoKLWl3bF9nZXRfdWNvZGVfaW1hZ2Uoc3RydWN0IGl3bF9wcml2ICpwcml2LCBlbnVtIGl3bF91Y29kZV90eXBlIHVjb2RlX3R5cGUpCi17Ci0JaWYgKHVjb2RlX3R5cGUgPj0gSVdMX1VDT0RFX1RZUEVfTUFYKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiAmcHJpdi0+ZnctPmltZ1t1Y29kZV90eXBlXTsKLX0KLQogLyoKICAqICBDYWxpYnJhdGlvbgogICovCkBAIC0zMzAsNyArMzIxLDcgQEAKIAllbnVtIGl3bF91Y29kZV90eXBlIG9sZF90eXBlOwogCXN0YXRpYyBjb25zdCB1MTYgYWxpdmVfY21kW10gPSB7IFJFUExZX0FMSVZFIH07CiAKLQlmdyA9IGl3bF9nZXRfdWNvZGVfaW1hZ2UocHJpdiwgdWNvZGVfdHlwZSk7CisJZncgPSBpd2xfZ2V0X3Vjb2RlX2ltYWdlKHByaXYtPmZ3LCB1Y29kZV90eXBlKTsKIAlpZiAoV0FSTl9PTighZncpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtNzAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtNzAwMC5jCmluZGV4IDY0NjkwYzE0Li5kNGI3M2RlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC03MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtNzAwMC5jCkBAIC03MywxMyArNzMsMTMgQEAKIC8qIEhpZ2hlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCiAjZGVmaW5lIElXTDcyNjBfVUNPREVfQVBJX01BWAkxNwogI2RlZmluZSBJV0w3MjY1X1VDT0RFX0FQSV9NQVgJMTcKLSNkZWZpbmUgSVdMNzI2NURfVUNPREVfQVBJX01BWAkyNAotI2RlZmluZSBJV0wzMTY4X1VDT0RFX0FQSV9NQVgJMjQKKyNkZWZpbmUgSVdMNzI2NURfVUNPREVfQVBJX01BWAkyNgorI2RlZmluZSBJV0wzMTY4X1VDT0RFX0FQSV9NQVgJMjYKIAogLyogTG93ZXN0IGZpcm13YXJlIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCAqLwotI2RlZmluZSBJV0w3MjYwX1VDT0RFX0FQSV9NSU4JMTYKLSNkZWZpbmUgSVdMNzI2NV9VQ09ERV9BUElfTUlOCTE2Ci0jZGVmaW5lIElXTDcyNjVEX1VDT0RFX0FQSV9NSU4JMTYKKyNkZWZpbmUgSVdMNzI2MF9VQ09ERV9BUElfTUlOCTE3CisjZGVmaW5lIElXTDcyNjVfVUNPREVfQVBJX01JTgkxNworI2RlZmluZSBJV0w3MjY1RF9VQ09ERV9BUElfTUlOCTE3CiAjZGVmaW5lIElXTDMxNjhfVUNPREVfQVBJX01JTgkyMAogCiAvKiBOVk0gdmVyc2lvbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLTgwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLTgwMDAuYwppbmRleCA2YzY3MjVlLi5kMDJjYTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC04MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtODAwMC5jCkBAIC03MCwxMSArNzAsMTEgQEAKICNpbmNsdWRlICJpd2wtYWduLWh3LmgiCiAKIC8qIEhpZ2hlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCi0jZGVmaW5lIElXTDgwMDBfVUNPREVfQVBJX01BWAkyNAotI2RlZmluZSBJV0w4MjY1X1VDT0RFX0FQSV9NQVgJMjQKKyNkZWZpbmUgSVdMODAwMF9VQ09ERV9BUElfTUFYCTI2CisjZGVmaW5lIElXTDgyNjVfVUNPREVfQVBJX01BWAkyNgogCiAvKiBMb3dlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCi0jZGVmaW5lIElXTDgwMDBfVUNPREVfQVBJX01JTgkxNgorI2RlZmluZSBJV0w4MDAwX1VDT0RFX0FQSV9NSU4JMTcKICNkZWZpbmUgSVdMODI2NV9VQ09ERV9BUElfTUlOCTIwCiAKIC8qIE5WTSB2ZXJzaW9ucyAqLwpAQCAtMjEyLDYgKzIxMiwxNyBAQAogCS52aHRfbXVfbWltb19zdXBwb3J0ZWQgPSB0cnVlLAogfTsKIAorY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsODI3NV8yYWNfY2ZnID0geworCS5uYW1lID0gIkludGVsKFIpIER1YWwgQmFuZCBXaXJlbGVzcyBBQyA4Mjc1IiwKKwkuZndfbmFtZV9wcmUgPSBJV0w4MjY1X0ZXX1BSRSwKKwlJV0xfREVWSUNFXzgyNjUsCisJLmh0X3BhcmFtcyA9ICZpd2w4MDAwX2h0X3BhcmFtcywKKwkubnZtX3ZlciA9IElXTDgwMDBfTlZNX1ZFUlNJT04sCisJLm52bV9jYWxpYl92ZXIgPSBJV0w4MDAwX1RYX1BPV0VSX1ZFUlNJT04sCisJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAorCS52aHRfbXVfbWltb19zdXBwb3J0ZWQgPSB0cnVlLAorfTsKKwogY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsNDE2NV8yYWNfY2ZnID0gewogCS5uYW1lID0gIkludGVsKFIpIER1YWwgQmFuZCBXaXJlbGVzcyBBQyA0MTY1IiwKIAkuZndfbmFtZV9wcmUgPSBJV0w4MDAwX0ZXX1BSRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLTkwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLTkwMDAuYwppbmRleCBmYmFmNzA1Li5mZjg1MDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC05MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtOTAwMC5jCkBAIC01NSwxMCArNTUsMTAgQEAKICNpbmNsdWRlICJpd2wtYWduLWh3LmgiCiAKIC8qIEhpZ2hlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCi0jZGVmaW5lIElXTDkwMDBfVUNPREVfQVBJX01BWAkyNAorI2RlZmluZSBJV0w5MDAwX1VDT0RFX0FQSV9NQVgJMjYKIAogLyogTG93ZXN0IGZpcm13YXJlIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCAqLwotI2RlZmluZSBJV0w5MDAwX1VDT0RFX0FQSV9NSU4JMTYKKyNkZWZpbmUgSVdMOTAwMF9VQ09ERV9BUElfTUlOCTE3CiAKIC8qIE5WTSB2ZXJzaW9ucyAqLwogI2RlZmluZSBJV0w5MDAwX05WTV9WRVJTSU9OCQkweDBhMWQKQEAgLTcyLDE1ICs3MiwxNSBAQAogI2RlZmluZSBJV0w5MDAwX1NNRU1fT0ZGU0VUCQkweDQwMDAwMAogI2RlZmluZSBJV0w5MDAwX1NNRU1fTEVOCQkweDY4MDAwCiAKLSNkZWZpbmUgIElXTDkwMDBfRldfUFJFICJpd2x3aWZpLTkwMDAtcHUtYTAtbGMtYTAtIgorI2RlZmluZSAgSVdMOTAwMF9GV19QUkUgIml3bHdpZmktOTAwMC1wdS1hMC1qZi1hMC0iCiAjZGVmaW5lICBJV0w5MjYwX0ZXX1BSRSAiaXdsd2lmaS05MjYwLXRoLWEwLWpmLWEwLSIKLSNkZWZpbmUgIElXTDkyNjBMQ19GV19QUkUgIml3bHdpZmktOTI2MC10aC1hMC1sYy1hMC0iCisjZGVmaW5lICBJV0w5MDAwTENfRldfUFJFICJpd2x3aWZpLTkwMDAtcHUtYTAtbGMtYTAtIgogI2RlZmluZSBJV0w5MDAwX01PRFVMRV9GSVJNV0FSRShhcGkpIFwKIAlJV0w5MDAwX0ZXX1BSRSAiLSIgX19zdHJpbmdpZnkoYXBpKSAiLnVjb2RlIgogI2RlZmluZSBJV0w5MjYwX01PRFVMRV9GSVJNV0FSRShhcGkpIFwKIAlJV0w5MjYwX0ZXX1BSRSAiLSIgX19zdHJpbmdpZnkoYXBpKSAiLnVjb2RlIgotI2RlZmluZSBJV0w5MjYwTENfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgXAotCUlXTDkyNjBMQ19GV19QUkUgIi0iIF9fc3RyaW5naWZ5KGFwaSkgIi51Y29kZSIKKyNkZWZpbmUgSVdMOTAwMExDX01PRFVMRV9GSVJNV0FSRShhcGkpIFwKKwlJV0w5MDAwTENfRldfUFJFICItIiBfX3N0cmluZ2lmeShhcGkpICIudWNvZGUiCiAKICNkZWZpbmUgTlZNX0hXX1NFQ1RJT05fTlVNX0ZBTUlMWV85MDAwCQkxMAogCkBAIC0xNDYsNDEgKzE0Niw3MyBAQAogCS5tYWNfYWRkcl9mcm9tX2NzciA9IHRydWUsCQkJCQlcCiAJLnJmX2lkID0gdHJ1ZQogCitjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w5MTYwXzJhY19jZmcgPSB7CisJLm5hbWUgPSAiSW50ZWwoUikgRHVhbCBCYW5kIFdpcmVsZXNzIEFDIDkxNjAiLAorCS5md19uYW1lX3ByZSA9IElXTDkyNjBfRldfUFJFLAorCUlXTF9ERVZJQ0VfOTAwMCwKKwkuaHRfcGFyYW1zID0gJml3bDkwMDBfaHRfcGFyYW1zLAorCS5udm1fdmVyID0gSVdMOTAwMF9OVk1fVkVSU0lPTiwKKwkubnZtX2NhbGliX3ZlciA9IElXTDkwMDBfVFhfUE9XRVJfVkVSU0lPTiwKKwkubWF4X2h0X2FtcGR1X2V4cG9uZW50ID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEssCit9OworCiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w5MjYwXzJhY19jZmcgPSB7Ci0JCS5uYW1lID0gIkludGVsKFIpIER1YWwgQmFuZCBXaXJlbGVzcyBBQyA5MjYwIiwKLQkJLmZ3X25hbWVfcHJlID0gSVdMOTI2MF9GV19QUkUsCi0JCUlXTF9ERVZJQ0VfOTAwMCwKLQkJLmh0X3BhcmFtcyA9ICZpd2w5MDAwX2h0X3BhcmFtcywKLQkJLm52bV92ZXIgPSBJV0w5MDAwX05WTV9WRVJTSU9OLAotCQkubnZtX2NhbGliX3ZlciA9IElXTDkwMDBfVFhfUE9XRVJfVkVSU0lPTiwKLQkJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAorCS5uYW1lID0gIkludGVsKFIpIER1YWwgQmFuZCBXaXJlbGVzcyBBQyA5MjYwIiwKKwkuZndfbmFtZV9wcmUgPSBJV0w5MjYwX0ZXX1BSRSwKKwlJV0xfREVWSUNFXzkwMDAsCisJLmh0X3BhcmFtcyA9ICZpd2w5MDAwX2h0X3BhcmFtcywKKwkubnZtX3ZlciA9IElXTDkwMDBfTlZNX1ZFUlNJT04sCisJLm52bV9jYWxpYl92ZXIgPSBJV0w5MDAwX1RYX1BPV0VSX1ZFUlNJT04sCisJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAorfTsKKworY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsOTI3MF8yYWNfY2ZnID0geworCS5uYW1lID0gIkludGVsKFIpIER1YWwgQmFuZCBXaXJlbGVzcyBBQyA5MjcwIiwKKwkuZndfbmFtZV9wcmUgPSBJV0w5MjYwX0ZXX1BSRSwKKwlJV0xfREVWSUNFXzkwMDAsCisJLmh0X3BhcmFtcyA9ICZpd2w5MDAwX2h0X3BhcmFtcywKKwkubnZtX3ZlciA9IElXTDkwMDBfTlZNX1ZFUlNJT04sCisJLm52bV9jYWxpYl92ZXIgPSBJV0w5MDAwX1RYX1BPV0VSX1ZFUlNJT04sCisJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAorfTsKKworY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsOTQ2MF8yYWNfY2ZnID0geworCS5uYW1lID0gIkludGVsKFIpIER1YWwgQmFuZCBXaXJlbGVzcyBBQyA5NDYwIiwKKwkuZndfbmFtZV9wcmUgPSBJV0w5MDAwX0ZXX1BSRSwKKwlJV0xfREVWSUNFXzkwMDAsCisJLmh0X3BhcmFtcyA9ICZpd2w5MDAwX2h0X3BhcmFtcywKKwkubnZtX3ZlciA9IElXTDkwMDBfTlZNX1ZFUlNJT04sCisJLm52bV9jYWxpYl92ZXIgPSBJV0w5MDAwX1RYX1BPV0VSX1ZFUlNJT04sCisJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAorCS5pbnRlZ3JhdGVkID0gdHJ1ZSwKK307CisKK2NvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDk1NjBfMmFjX2NmZyA9IHsKKwkubmFtZSA9ICJJbnRlbChSKSBEdWFsIEJhbmQgV2lyZWxlc3MgQUMgOTU2MCIsCisJLmZ3X25hbWVfcHJlID0gSVdMOTAwMF9GV19QUkUsCisJSVdMX0RFVklDRV85MDAwLAorCS5odF9wYXJhbXMgPSAmaXdsOTAwMF9odF9wYXJhbXMsCisJLm52bV92ZXIgPSBJV0w5MDAwX05WTV9WRVJTSU9OLAorCS5udm1fY2FsaWJfdmVyID0gSVdMOTAwMF9UWF9QT1dFUl9WRVJTSU9OLAorCS5tYXhfaHRfYW1wZHVfZXhwb25lbnQgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SywKKwkuaW50ZWdyYXRlZCA9IHRydWUsCiB9OwogCiAvKgogICogVE9ETyB0aGUgc3RydWN0IGJlbG93IGlzIGZvciBpbnRlcm5hbCB0ZXN0aW5nIG9ubHkgdGhpcyBzaG91bGQgYmUKICAqIHJlbW92ZWQgYnkgRU8gMjAxNn4KICAqLwotY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsOTI2MGxjXzJhY19jZmcgPSB7Ci0JCS5uYW1lID0gIkludGVsKFIpIER1YWwgQmFuZCBXaXJlbGVzcyBBQyA5MjYwIiwKLQkJLmZ3X25hbWVfcHJlID0gSVdMOTI2MExDX0ZXX1BSRSwKLQkJSVdMX0RFVklDRV85MDAwLAotCQkuaHRfcGFyYW1zID0gJml3bDkwMDBfaHRfcGFyYW1zLAotCQkubnZtX3ZlciA9IElXTDkwMDBfTlZNX1ZFUlNJT04sCi0JCS5udm1fY2FsaWJfdmVyID0gSVdMOTAwMF9UWF9QT1dFUl9WRVJTSU9OLAotCQkubWF4X2h0X2FtcGR1X2V4cG9uZW50ID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEssCi19OwotCi1jb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w1MTY1XzJhY19jZmcgPSB7Ci0JCS5uYW1lID0gIkludGVsKFIpIER1YWwgQmFuZCBXaXJlbGVzcyBBQyA1MTY1IiwKLQkJLmZ3X25hbWVfcHJlID0gSVdMOTAwMF9GV19QUkUsCi0JCUlXTF9ERVZJQ0VfOTAwMCwKLQkJLmh0X3BhcmFtcyA9ICZpd2w5MDAwX2h0X3BhcmFtcywKLQkJLm52bV92ZXIgPSBJV0w5MDAwX05WTV9WRVJTSU9OLAotCQkubnZtX2NhbGliX3ZlciA9IElXTDkwMDBfVFhfUE9XRVJfVkVSU0lPTiwKLQkJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAotCQkuaW50ZWdyYXRlZCA9IHRydWUsCitjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w5MDAwbGNfMmFjX2NmZyA9IHsKKwkubmFtZSA9ICJJbnRlbChSKSBEdWFsIEJhbmQgV2lyZWxlc3MgQUMgOTAwMCIsCisJLmZ3X25hbWVfcHJlID0gSVdMOTAwMExDX0ZXX1BSRSwKKwlJV0xfREVWSUNFXzkwMDAsCisJLmh0X3BhcmFtcyA9ICZpd2w5MDAwX2h0X3BhcmFtcywKKwkubnZtX3ZlciA9IElXTDkwMDBfTlZNX1ZFUlNJT04sCisJLm52bV9jYWxpYl92ZXIgPSBJV0w5MDAwX1RYX1BPV0VSX1ZFUlNJT04sCisJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAorCS5pbnRlZ3JhdGVkID0gdHJ1ZSwKIH07CiAKIE1PRFVMRV9GSVJNV0FSRShJV0w5MDAwX01PRFVMRV9GSVJNV0FSRShJV0w5MDAwX1VDT0RFX0FQSV9NQVgpKTsKIE1PRFVMRV9GSVJNV0FSRShJV0w5MjYwX01PRFVMRV9GSVJNV0FSRShJV0w5MDAwX1VDT0RFX0FQSV9NQVgpKTsKLU1PRFVMRV9GSVJNV0FSRShJV0w5MjYwTENfTU9EVUxFX0ZJUk1XQVJFKElXTDkwMDBfVUNPREVfQVBJX01BWCkpOworTU9EVUxFX0ZJUk1XQVJFKElXTDkwMDBMQ19NT0RVTEVfRklSTVdBUkUoSVdMOTAwMF9VQ09ERV9BUElfTUFYKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1hMDAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1hMDAwLmMKaW5kZXggNGQ3ODIzMi4uZWExNjE4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtYTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWEwMDAuYwpAQCAtNTUsNyArNTUsNyBAQAogI2luY2x1ZGUgIml3bC1hZ24taHcuaCIKIAogLyogSGlnaGVzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgSVdMX0EwMDBfVUNPREVfQVBJX01BWAkyNAorI2RlZmluZSBJV0xfQTAwMF9VQ09ERV9BUElfTUFYCTI2CiAKIC8qIExvd2VzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KICNkZWZpbmUgSVdMX0EwMDBfVUNPREVfQVBJX01JTgkyNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtY29uZmlnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1jb25maWcuaAppbmRleCA0MjNiMjMzLi4yNjYwY2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1jb25maWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1jb25maWcuaApAQCAtMzU5LDcgKzM1OSw2IEBACiAJICAgIGhpZ2hfdGVtcDoxLAogCSAgICBtYWNfYWRkcl9mcm9tX2NzcjoxLAogCSAgICBscF94dGFsX3dvcmthcm91bmQ6MSwKLQkgICAgbm9fcG93ZXJfdXBfbmljX2luX2luaXQ6MSwKIAkgICAgZGlzYWJsZV9kdW1teV9ub3RpZmljYXRpb246MSwKIAkgICAgYXBtZ19ub3Rfc3VwcG9ydGVkOjEsCiAJICAgIG1xX3J4X3N1cHBvcnRlZDoxLApAQCAtNDQ1LDEzICs0NDQsMTcgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w4MjYwXzJuX2NmZzsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w4MjYwXzJhY19jZmc7CiBleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsODI2NV8yYWNfY2ZnOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDgyNzVfMmFjX2NmZzsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w0MTY1XzJhY19jZmc7CiBleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsODI2MF8yYWNfc2Rpb19jZmc7CiBleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsODI2NV8yYWNfc2Rpb19jZmc7CiBleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsNDE2NV8yYWNfc2Rpb19jZmc7CitleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsOTAwMGxjXzJhY19jZmc7CitleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsOTE2MF8yYWNfY2ZnOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDkyNjBfMmFjX2NmZzsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w5MjYwbGNfMmFjX2NmZzsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w1MTY1XzJhY19jZmc7CitleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsOTI3MF8yYWNfY2ZnOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDk0NjBfMmFjX2NmZzsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w5NTYwXzJhY19jZmc7CiBleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsYTAwMF8yYWNfY2ZnOwogI2VuZGlmIC8qIENPTkZJR19JV0xNVk0gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtY3NyLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1jc3IuaAppbmRleCA4NzFhZDAyLi5kNzNlOWQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1jc3IuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1jc3IuaApAQCAtNTg5LDYgKzU4OSw4IEBACiAgKiBDYXVzZXMgZm9yIHRoZSBGSCByZWdpc3RlciBpbnRlcnJ1cHRzCiAgKi8KIGVudW0gbXNpeF9maF9pbnRfY2F1c2VzIHsKKwlNU0lYX0ZIX0lOVF9DQVVTRVNfUTAJCQk9IEJJVCgwKSwKKwlNU0lYX0ZIX0lOVF9DQVVTRVNfUTEJCQk9IEJJVCgxKSwKIAlNU0lYX0ZIX0lOVF9DQVVTRVNfRDJTX0NIMF9OVU0JCT0gQklUKDE2KSwKIAlNU0lYX0ZIX0lOVF9DQVVTRVNfRDJTX0NIMV9OVU0JCT0gQklUKDE3KSwKIAlNU0lYX0ZIX0lOVF9DQVVTRVNfUzJECQkJPSBCSVQoMTkpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtZGV2dHJhY2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWRldnRyYWNlLmMKaW5kZXggMWQ5ZGQxNTMuLjUwNTEwZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWRldnRyYWNlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtZGV2dHJhY2UuYwpAQCAtMzMsOSArMzMsNiBAQAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSAiaXdsLWRldnRyYWNlLmgiCiAKLUVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTChpd2x3aWZpX2Rldl9pb3dyaXRlOCk7Ci1FWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woaXdsd2lmaV9kZXZfaW9yZWFkMzIpOwotRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGl3bHdpZmlfZGV2X2lvd3JpdGUzMik7CiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woaXdsd2lmaV9kZXZfdWNvZGVfZXZlbnQpOwogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGl3bHdpZmlfZGV2X3Vjb2RlX2Vycm9yKTsKIEVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTChpd2x3aWZpX2Rldl91Y29kZV9jb250X2V2ZW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWZoLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1maC5oCmluZGV4IDFkNmY1ZDIuLjMzZWY1MzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWZoLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtZmguaApAQCAtNzcsNyArNzcsNiBAQAogICovCiAjZGVmaW5lIEZIX01FTV9MT1dFUl9CT1VORCAgICAgICAgICAgICAgICAgICAoMHgxMDAwKQogI2RlZmluZSBGSF9NRU1fVVBQRVJfQk9VTkQgICAgICAgICAgICAgICAgICAgKDB4MjAwMCkKLSNkZWZpbmUgVEZIX01FTV9MT1dFUl9CT1VORCAgICAgICAgICAgICAgICAgICgweEEwNjAwMCkKIAogLyoqCiAgKiBLZWVwLVdhcm0gKEtXKSBidWZmZXIgYmFzZSBhZGRyZXNzLgpAQCAtMTIwLDcgKzExOSw3IEBACiAjZGVmaW5lIEZIX01FTV9DQkJDXzIwXzMxX0xPV0VSX0JPVU5ECQkoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhCMjApCiAjZGVmaW5lIEZIX01FTV9DQkJDXzIwXzMxX1VQUEVSX0JPVU5ECQkoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhCODApCiAvKiBhMDAwIFRGRCB0YWJsZSBhZGRyZXNzLCA2NCBiaXQgKi8KLSNkZWZpbmUgVEZIX1RGRFFfQ0JCX1RBQkxFCQkJKFRGSF9NRU1fTE9XRVJfQk9VTkQgKyAweDFDMDApCisjZGVmaW5lIFRGSF9URkRRX0NCQl9UQUJMRQkJCSgweDFDMDApCiAKIC8qIEZpbmQgVEZEIENCIGJhc2UgcG9pbnRlciBmb3IgZ2l2ZW4gcXVldWUgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IEZIX01FTV9DQkJDX1FVRVVFKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLApAQCAtMTU2LDcgKzE1NSw3IEBACiAgKiBJbiBjYXNlIG9mIERSQU0gcmVhZCBhZGRyZXNzIHdoaWNoIGlzIG5vdCBhbGlnbmVkIHRvIDEyOEIsIHRoZSBURkggd2lsbAogICogZW5hYmxlIHRyYW5zZmVyIHNpemUgd2hpY2ggZG9lc24ndCBjcm9zcyA2NEIgRFJBTSBhZGRyZXNzIGJvdW5kYXJ5LgogKi8KLSNkZWZpbmUgVEZIX1RSQU5TRkVSX01PREUJCShURkhfTUVNX0xPV0VSX0JPVU5EICsgMHgxRjQwKQorI2RlZmluZSBURkhfVFJBTlNGRVJfTU9ERQkJKDB4MUY0MCkKICNkZWZpbmUgVEZIX1RSQU5TRkVSX01BWF9QRU5ESU5HX1JFUQkweGMKICNkZWZpbmUgVEZIX0NIVU5LX1NJWkVfMTI4CQkJQklUKDgpCiAjZGVmaW5lIFRGSF9DSFVOS19TUExJVF9NT0RFCQlCSVQoMTApCkBAIC0xNjcsNyArMTY2LDcgQEAKICAqIHRoZSBzdGFydCBvZiB0aGUgVEZEIGZpcnN0IFRCLgogICogSW4gY2FzZSBvZiBhIERSQU0gVHggQ01EIHVwZGF0ZSB0aGUgVEZIIHdpbGwgdXBkYXRlIFBOIGFuZCBLZXkgSUQKICAqLwotI2RlZmluZSBURkhfVFhDTURfVVBEQVRFX0NGRwkJKFRGSF9NRU1fTE9XRVJfQk9VTkQgKyAweDFGNDgpCisjZGVmaW5lIFRGSF9UWENNRF9VUERBVEVfQ0ZHCQkoMHgxRjQ4KQogLyoKICAqIENvbnRyb2xzIFRYIERNQSBvcGVyYXRpb24KICAqCkBAIC0xODEsMjIgKzE4MCwyMiBAQAogICogc2V0IHRvIDEgLSBpbnRlcnJ1cHQgaXMgc2VudCB0byB0aGUgZHJpdmVyCiAgKiBCaXQgMDogSW5kaWNhdGVzIHRoZSBzbm9vcCBjb25maWd1cmF0aW9uCiAqLwotI2RlZmluZSBURkhfU1JWX0RNQV9DSE5MMF9DVFJMCShURkhfTUVNX0xPV0VSX0JPVU5EICsgMHgxRjYwKQorI2RlZmluZSBURkhfU1JWX0RNQV9DSE5MMF9DVFJMCSgweDFGNjApCiAjZGVmaW5lIFRGSF9TUlZfRE1BX1NOT09QCUJJVCgwKQogI2RlZmluZSBURkhfU1JWX0RNQV9UT19EUklWRVIJQklUKDI0KQogI2RlZmluZSBURkhfU1JWX0RNQV9TVEFSVAlCSVQoMzEpCiAKIC8qIERlZmluZXMgdGhlIERNQSBTUkFNIHdyaXRlIHN0YXJ0IGFkZHJlc3MgdG8gdHJhbnNmZXIgYSBkYXRhIGJsb2NrICovCi0jZGVmaW5lIFRGSF9TUlZfRE1BX0NITkwwX1NSQU1fQUREUgkoVEZIX01FTV9MT1dFUl9CT1VORCArIDB4MUY2NCkKKyNkZWZpbmUgVEZIX1NSVl9ETUFfQ0hOTDBfU1JBTV9BRERSCSgweDFGNjQpCiAKIC8qIERlZmluZXMgdGhlIDY0Yml0cyBEUkFNIHN0YXJ0IGFkZHJlc3MgdG8gcmVhZCB0aGUgRE1BIGRhdGEgYmxvY2sgZnJvbSAqLwotI2RlZmluZSBURkhfU1JWX0RNQV9DSE5MMF9EUkFNX0FERFIJKFRGSF9NRU1fTE9XRVJfQk9VTkQgKyAweDFGNjgpCisjZGVmaW5lIFRGSF9TUlZfRE1BX0NITkwwX0RSQU1fQUREUgkoMHgxRjY4KQogCiAvKgogICogRGVmaW5lcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyIGZyb20gRFJBTSB0byBTUkFNLgogICogTm90ZSB0aGF0IHRoaXMgcmVnaXN0ZXIgbWF5IGJlIGNvbmZpZ3VyZWQgd2l0aCBub24tZHdvcmQgYWxpZ25lZCBzaXplLgogICovCi0jZGVmaW5lIFRGSF9TUlZfRE1BX0NITkwwX0JDCShURkhfTUVNX0xPV0VSX0JPVU5EICsgMHgxRjcwKQorI2RlZmluZSBURkhfU1JWX0RNQV9DSE5MMF9CQwkoMHgxRjcwKQogCiAvKioKICAqIFJ4IFNSQU0gQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVycyAoUlNDU1IpCkBAIC02NDQsNiArNjQzLDcgQEAKICNkZWZpbmUgVEZEX1FVRVVFX0JDX1NJWkUJKFRGRF9RVUVVRV9TSVpFX01BWCArIFRGRF9RVUVVRV9TSVpFX0JDX0RVUCkKICNkZWZpbmUgSVdMX1RYX0RNQV9NQVNLICAgICAgICBETUFfQklUX01BU0soMzYpCiAjZGVmaW5lIElXTF9OVU1fT0ZfVEJTCQkyMAorI2RlZmluZSBJV0xfVEZIX05VTV9UQlMJCTI1CiAKIHN0YXRpYyBpbmxpbmUgdTggaXdsX2dldF9kbWFfaGlfYWRkcihkbWFfYWRkcl90IGFkZHIpCiB7CkBAIC02NjUsMjUgKzY2NSwyOSBAQAogfSBfX3BhY2tlZDsKIAogLyoqCi0gKiBzdHJ1Y3QgaXdsX3RmZAorICogc3RydWN0IGl3bF90ZmhfdGIgdHJhbnNtaXQgYnVmZmVyIGRlc2NyaXB0b3Igd2l0aGluIHRyYW5zbWl0IGZyYW1lIGRlc2NyaXB0b3IKICAqCi0gKiBUcmFuc21pdCBGcmFtZSBEZXNjcmlwdG9yIChURkQpCisgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBkbWEgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRyYW5zbWlzc2lvbiBhZGRyZXNzCiAgKgotICogQCBfX3Jlc2VydmVkMVszXSByZXNlcnZlZAotICogQCBudW1fdGJzIDAtNCBudW1iZXIgb2YgYWN0aXZlIHRicwotICoJICAgICA1ICAgcmVzZXJ2ZWQKLSAqIAkgICAgIDYtNyBwYWRkaW5nIChub3QgdXNlZCkKLSAqIEAgdGJzWzIwXQl0cmFuc21pdCBmcmFtZSBidWZmZXIgZGVzY3JpcHRvcnMKLSAqIEAgX19wYWQgCXBhZGRpbmcKLSAqCisgKiBAdGJfbGVuIGxlbmd0aCBvZiB0aGUgdHggYnVmZmVyCisgKiBAYWRkciA2NCBiaXRzIGRtYSBhZGRyZXNzCisgKi8KK3N0cnVjdCBpd2xfdGZoX3RiIHsKKwlfX2xlMTYgdGJfbGVuOworCV9fbGU2NCBhZGRyOworfSBfX3BhY2tlZDsKKworLyoqCiAgKiBFYWNoIFR4IHF1ZXVlIHVzZXMgYSBjaXJjdWxhciBidWZmZXIgb2YgMjU2IFRGRHMgc3RvcmVkIGluIGhvc3QgRFJBTS4KICAqIEJvdGggZHJpdmVyIGFuZCBkZXZpY2Ugc2hhcmUgdGhlc2UgY2lyY3VsYXIgYnVmZmVycywgZWFjaCBvZiB3aGljaCBtdXN0IGJlCi0gKiBjb250aWd1b3VzIDI1NiBURkRzIHggMTI4IGJ5dGVzLXBlci1URkQgPSAzMiBLQnl0ZXMKKyAqIGNvbnRpZ3VvdXMgMjU2IFRGRHMuCisgKiBGb3IgcHJlIGEwMDAgSFcgaXQgaXMgMjU2IHggMTI4IGJ5dGVzLXBlci1URkQgPSAzMiBLQnl0ZXMKKyAqIEZvciBhMDAwIEhXIGFuZCBvbiBpdCBpcyAyNTYgeCAyNTYgYnl0ZXMtcGVyLVRGRCA9IDY1IEtCeXRlcwogICoKICAqIERyaXZlciBtdXN0IGluZGljYXRlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBiYXNlIG9mIGVhY2gKICAqIGNpcmN1bGFyIGJ1ZmZlciB2aWEgdGhlIEZIX01FTV9DQkJDX1FVRVVFIHJlZ2lzdGVycy4KICAqCi0gKiBFYWNoIFRGRCBjb250YWlucyBwb2ludGVyL3NpemUgaW5mb3JtYXRpb24gZm9yIHVwIHRvIDIwIGRhdGEgYnVmZmVycworICogRWFjaCBURkQgY29udGFpbnMgcG9pbnRlci9zaXplIGluZm9ybWF0aW9uIGZvciB1cCB0byAyMCAvIDI1IGRhdGEgYnVmZmVycwogICogaW4gaG9zdCBEUkFNLiAgVGhlc2UgYnVmZmVycyBjb2xsZWN0aXZlbHkgY29udGFpbiB0aGUgKG9uZSkgZnJhbWUgZGVzY3JpYmVkCiAgKiBieSB0aGUgVEZELiAgRWFjaCBidWZmZXIgbXVzdCBiZSBhIHNpbmdsZSBjb250aWd1b3VzIGJsb2NrIG9mIG1lbW9yeSB3aXRoaW4KICAqIGl0c2VsZiwgYnV0IGJ1ZmZlcnMgbWF5IGJlIHNjYXR0ZXJlZCBpbiBob3N0IERSQU0uICBFYWNoIGJ1ZmZlciBoYXMgbWF4IHNpemUKQEAgLTY5Miw2ICs2OTYsMTYgQEAKICAqCiAgKiBBIG1heGltdW0gb2YgMjU1IChub3QgMjU2ISkgVEZEcyBtYXkgYmUgb24gYSBxdWV1ZSB3YWl0aW5nIGZvciBUeC4KICAqLworCisvKioKKyAqIHN0cnVjdCBpd2xfdGZkIC0gVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvciAoVEZEKQorICogQCBfX3Jlc2VydmVkMVszXSByZXNlcnZlZAorICogQCBudW1fdGJzIDAtNCBudW1iZXIgb2YgYWN0aXZlIHRicworICoJICAgICA1ICAgcmVzZXJ2ZWQKKyAqCSAgICAgNi03IHBhZGRpbmcgKG5vdCB1c2VkKQorICogQCB0YnNbMjBdCXRyYW5zbWl0IGZyYW1lIGJ1ZmZlciBkZXNjcmlwdG9ycworICogQCBfX3BhZAlwYWRkaW5nCisgKi8KIHN0cnVjdCBpd2xfdGZkIHsKIAl1OCBfX3Jlc2VydmVkMVszXTsKIAl1OCBudW1fdGJzOwpAQCAtNjk5LDYgKzcxMywxOSBAQAogCV9fbGUzMiBfX3BhZDsKIH0gX19wYWNrZWQ7CiAKKy8qKgorICogc3RydWN0IGl3bF90ZmhfdGZkIC0gVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvciAoVEZEKQorICogQCBudW1fdGJzIDAtNCBudW1iZXIgb2YgYWN0aXZlIHRicworICoJICAgICA1IC0xNSAgIHJlc2VydmVkCisgKiBAIHRic1syNV0JdHJhbnNtaXQgZnJhbWUgYnVmZmVyIGRlc2NyaXB0b3JzCisgKiBAIF9fcGFkCXBhZGRpbmcKKyAqLworc3RydWN0IGl3bF90ZmhfdGZkIHsKKwlfX2xlMTYgbnVtX3RiczsKKwlzdHJ1Y3QgaXdsX3RmaF90YiB0YnNbSVdMX1RGSF9OVU1fVEJTXTsKKwlfX2xlMzIgX19wYWQ7Cit9IF9fcGFja2VkOworCiAvKiBLZWVwIFdhcm0gU2l6ZSAqLwogI2RlZmluZSBJV0xfS1dfU0laRSAweDEwMDAJLyogNGsgKi8KIApAQCAtNzA3LDggKzczNCwxMyBAQAogLyoqCiAgKiBzdHJ1Y3QgaXdsYWduX3NjaGVkcV9iY190Ymwgc2NoZWR1bGVyIGJ5dGUgY291bnQgdGFibGUKICAqCWJhc2UgcGh5c2ljYWwgYWRkcmVzcyBwcm92aWRlZCBieSBTQ0RfRFJBTV9CQVNFX0FERFIKKyAqIEZvciBkZXZpY2VzIHVwIHRvIGEwMDA6CiAgKiBAdGZkX29mZnNldCAgMC0xMiAtIHR4IGNvbW1hbmQgYnl0ZSBjb3VudAotICoJICAgICAgIDEyLTE2IC0gc3RhdGlvbiBpbmRleAorICoJCTEyLTE2IC0gc3RhdGlvbiBpbmRleAorICogRm9yIGEwMDAgYW5kIG9uOgorICogQHRmZF9vZmZzZXQgIDAtMTIgLSB0eCBjb21tYW5kIGJ5dGUgY291bnQKKyAqCQkxMi0xMyAtIG51bWJlciBvZiA2NCBieXRlIGNodW5rcworICoJCTE0LTE2IC0gcmVzZXJ2ZWQKICAqLwogc3RydWN0IGl3bGFnbl9zY2RfYmNfdGJsIHsKIAlfX2xlMTYgdGZkX29mZnNldFtURkRfUVVFVUVfQkNfU0laRV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1mdy1maWxlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1mdy1maWxlLmgKaW5kZXggMWIxZTA0NS4uY2VlYzVjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtZnctZmlsZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWZ3LWZpbGUuaApAQCAtMTk5LDggKzE5OSw2IEBACiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19ORVdTQ0FOOiBuZXcgdUNvZGUgc2NhbiBiZWhhdmlvciBvbiBoaWRkZW4gU1NJRCwKICAqCXRyZWF0cyBnb29kIENSQyB0aHJlc2hvbGQgYXMgYSBib29sZWFuCiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19NRlA6IFRoaXMgdUNvZGUgaW1hZ2Ugc3VwcG9ydHMgTUZQICg4MDIuMTF3KS4KLSAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX1AyUDogVGhpcyB1Q29kZSBpbWFnZSBzdXBwb3J0cyBQMlAuCi0gKiBASVdMX1VDT0RFX1RMVl9GTEFHU19EV19CQ19UQUJMRTogVGhlIFNDRCBieXRlIGNvdW50IHRhYmxlIGlzIGluIERXT1JEUwogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfVUFQU0RfU1VQUE9SVDogVGhpcyB1Q29kZSBpbWFnZSBzdXBwb3J0cyB1QVBTRAogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfU0hPUlRfQkw6IDE2IGVudHJpZXMgb2YgYmxhY2sgbGlzdCBpbnN0ZWFkIG9mIDY0IGluIHNjYW4KICAqCW9mZmxvYWQgcHJvZmlsZSBjb25maWcgY29tbWFuZC4KQEAgLTIxMCwzNiArMjA4LDI0IEBACiAgKglmcm9tIHRoZSBwcm9iZSByZXF1ZXN0IHRlbXBsYXRlLgogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfTkVXX05TT0ZGTF9TTUFMTDogbmV3IE5TIG9mZmxvYWQgKHNtYWxsIHZlcnNpb24pCiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19ORVdfTlNPRkZMX0xBUkdFOiBuZXcgTlMgb2ZmbG9hZCAobGFyZ2UgdmVyc2lvbikKLSAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX1AyUF9QTTogUDJQIGNsaWVudCBzdXBwb3J0cyBQTSBhcyBhIHN0YW5kIGFsb25lIE1BQwotICogQElXTF9VQ09ERV9UTFZfRkxBR1NfUDJQX0JTU19QU19EQ006IHN1cHBvcnQgcG93ZXIgc2F2ZSBvbiBCU1Mgc3RhdGlvbiBhbmQKLSAqCVAyUCBjbGllbnQgaW50ZXJmYWNlcyBzaW11bHRhbmVvdXNseSBpZiB0aGV5IGFyZSBpbiBkaWZmZXJlbnQgYmluZGluZ3MuCi0gKiBASVdMX1VDT0RFX1RMVl9GTEFHU19QMlBfQlNTX1BTX1NDTTogc3VwcG9ydCBwb3dlciBzYXZlIG9uIEJTUyBzdGF0aW9uIGFuZAotICoJUDJQIGNsaWVudCBpbnRlcmZhY2VzIHNpbXVsdGFuZW91c2x5IGlmIHRoZXkgYXJlIGluIHNhbWUgYmluZGluZ3MuCiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19VQVBTRF9TVVBQT1JUOiBHZW5lcmFsIHN1cHBvcnQgZm9yIHVBUFNECiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19QMlBfUFNfVUFQU0Q6IFAyUCBjbGllbnQgc3VwcG9ydHMgdUFQU0QgcG93ZXIgc2F2ZQogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfQkNBU1RfRklMVEVSSU5HOiB1Q29kZSBzdXBwb3J0cyBicm9hZGNhc3QgZmlsdGVyaW5nLgotICogQElXTF9VQ09ERV9UTFZfRkxBR1NfR09fVUFQU0Q6IEFQL0dPIGludGVyZmFjZXMgc3VwcG9ydCB1QVBTRCBjbGllbnRzCiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19FQlNfU1VQUE9SVDogdGhpcyB1Q29kZSBpbWFnZSBzdXBwb3J0cyBFQlMuCiAgKi8KIGVudW0gaXdsX3Vjb2RlX3Rsdl9mbGFnIHsKIAlJV0xfVUNPREVfVExWX0ZMQUdTX1BBTgkJCT0gQklUKDApLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfTkVXU0NBTgkJPSBCSVQoMSksCiAJSVdMX1VDT0RFX1RMVl9GTEFHU19NRlAJCQk9IEJJVCgyKSwKLQlJV0xfVUNPREVfVExWX0ZMQUdTX1AyUAkJCT0gQklUKDMpLAotCUlXTF9VQ09ERV9UTFZfRkxBR1NfRFdfQkNfVEFCTEUJCT0gQklUKDQpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfU0hPUlRfQkwJCT0gQklUKDcpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfRDNfNl9JUFY2X0FERFJTCT0gQklUKDEwKSwKIAlJV0xfVUNPREVfVExWX0ZMQUdTX05PX0JBU0lDX1NTSUQJPSBCSVQoMTIpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfTkVXX05TT0ZGTF9TTUFMTAk9IEJJVCgxNSksCiAJSVdMX1VDT0RFX1RMVl9GTEFHU19ORVdfTlNPRkZMX0xBUkdFCT0gQklUKDE2KSwKLQlJV0xfVUNPREVfVExWX0ZMQUdTX1AyUF9QTQkJPSBCSVQoMjEpLAotCUlXTF9VQ09ERV9UTFZfRkxBR1NfQlNTX1AyUF9QU19EQ00JPSBCSVQoMjIpLAotCUlXTF9VQ09ERV9UTFZfRkxBR1NfQlNTX1AyUF9QU19TQ00JPSBCSVQoMjMpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfVUFQU0RfU1VQUE9SVAk9IEJJVCgyNCksCiAJSVdMX1VDT0RFX1RMVl9GTEFHU19FQlNfU1VQUE9SVAkJPSBCSVQoMjUpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfUDJQX1BTX1VBUFNECT0gQklUKDI2KSwKIAlJV0xfVUNPREVfVExWX0ZMQUdTX0JDQVNUX0ZJTFRFUklORwk9IEJJVCgyOSksCi0JSVdMX1VDT0RFX1RMVl9GTEFHU19HT19VQVBTRAkJPSBCSVQoMzApLAogfTsKIAogdHlwZWRlZiB1bnNpZ25lZCBpbnQgX19iaXR3aXNlX18gaXdsX3Vjb2RlX3Rsdl9hcGlfdDsKQEAgLTI0OSwyNCArMjM1LDIxIEBACiAgKiBASVdMX1VDT0RFX1RMVl9BUElfRlJBR01FTlRFRF9TQ0FOOiBUaGlzIHVjb2RlIHN1cHBvcnRzIGFjdGl2ZSBkd2VsbCB0aW1lCiAgKglsb25nZXIgdGhhbiB0aGUgcGFzc2l2ZSBvbmUsIHdoaWNoIGlzIGVzc2VudGlhbCBmb3IgZnJhZ21lbnRlZCBzY2FuLgogICogQElXTF9VQ09ERV9UTFZfQVBJX1dJRklfTUNDX1VQREFURTogdWNvZGUgc3VwcG9ydHMgTUNDIHVwZGF0ZXMgd2l0aCBzb3VyY2UuCi0gKiBASVdMX1VDT0RFX1RMVl9BUElfV0lERV9DTURfSERSOiB1Y29kZSBzdXBwb3J0cyB3aWRlIGNvbW1hbmQgaGVhZGVyCiAgKiBASVdMX1VDT0RFX1RMVl9BUElfTFFfU1NfUEFSQU1TOiBDb25maWd1cmUgU1RCQy9CRkVSIHZpYSBMUSBDTUQgc3NfcGFyYW1zCiAgKiBASVdMX1VDT0RFX1RMVl9BUElfTkVXX1ZFUlNJT046IG5ldyB2ZXJzaW9uaW5nIGZvcm1hdAotICogQElXTF9VQ09ERV9UTFZfQVBJX0VYVF9TQ0FOX1BSSU9SSVRZOiBzY2FuIEFQSXMgdXNlIDgtbGV2ZWwgcHJpb3JpdHkKLSAqCWluc3RlYWQgb2YgMy4KLSAqIEBJV0xfVUNPREVfVExWX0FQSV9UWF9QT1dFUl9DSEFJTjogVFggcG93ZXIgQVBJIGhhcyBsYXJnZXIgY29tbWFuZCBzaXplCi0gKgkoY29tbWFuZCB2ZXJzaW9uIDMpIHRoYXQgc3VwcG9ydHMgcGVyLWNoYWluIGxpbWl0cworICogQElXTF9VQ09ERV9UTFZfQVBJX1NDQU5fVFNGX1JFUE9SVDogU2NhbiBzdGFydCB0aW1lIHJlcG9ydGVkIGluIHNjYW4KKyAqCWl0ZXJhdGlvbiBjb21wbGV0ZSBub3RpZmljYXRpb24sIGFuZCB0aGUgdGltZXN0YW1wIHJlcG9ydGVkIGZvciBSWAorICoJcmVjZWl2ZWQgZHVyaW5nIHNjYW4sIGFyZSByZXBvcnRlZCBpbiBUU0Ygb2YgdGhlIG1hYyBzcGVjaWZpZWQgaW4gdGhlCisgKglzY2FuIHJlcXVlc3QuCiAgKgogICogQE5VTV9JV0xfVUNPREVfVExWX0FQSTogbnVtYmVyIG9mIGJpdHMgdXNlZAogICovCiBlbnVtIGl3bF91Y29kZV90bHZfYXBpIHsKIAlJV0xfVUNPREVfVExWX0FQSV9GUkFHTUVOVEVEX1NDQU4JPSAoX19mb3JjZSBpd2xfdWNvZGVfdGx2X2FwaV90KTgsCiAJSVdMX1VDT0RFX1RMVl9BUElfV0lGSV9NQ0NfVVBEQVRFCT0gKF9fZm9yY2UgaXdsX3Vjb2RlX3Rsdl9hcGlfdCk5LAotCUlXTF9VQ09ERV9UTFZfQVBJX1dJREVfQ01EX0hEUgkJPSAoX19mb3JjZSBpd2xfdWNvZGVfdGx2X2FwaV90KTE0LAogCUlXTF9VQ09ERV9UTFZfQVBJX0xRX1NTX1BBUkFNUwkJPSAoX19mb3JjZSBpd2xfdWNvZGVfdGx2X2FwaV90KTE4LAotCUlXTF9VQ09ERV9UTFZfQVBJX05FV19WRVJTSU9OICAgICAgICAgICA9IChfX2ZvcmNlIGl3bF91Y29kZV90bHZfYXBpX3QpMjAsCi0JSVdMX1VDT0RFX1RMVl9BUElfRVhUX1NDQU5fUFJJT1JJVFkJPSAoX19mb3JjZSBpd2xfdWNvZGVfdGx2X2FwaV90KTI0LAotCUlXTF9VQ09ERV9UTFZfQVBJX1RYX1BPV0VSX0NIQUlOCT0gKF9fZm9yY2UgaXdsX3Vjb2RlX3Rsdl9hcGlfdCkyNywKKwlJV0xfVUNPREVfVExWX0FQSV9ORVdfVkVSU0lPTgkJPSAoX19mb3JjZSBpd2xfdWNvZGVfdGx2X2FwaV90KTIwLAorCUlXTF9VQ09ERV9UTFZfQVBJX1NDQU5fVFNGX1JFUE9SVAk9IChfX2ZvcmNlIGl3bF91Y29kZV90bHZfYXBpX3QpMjgsCiAKIAlOVU1fSVdMX1VDT0RFX1RMVl9BUEkKICNpZmRlZiBfX0NIRUNLRVJfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtZncuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWZ3LmgKaW5kZXggNzRlYTY4ZC4uNWYyMjk1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtZncuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1mdy5oCkBAIC0zMjksNCArMzI5LDEzIEBACiAJcmV0dXJuIGNvbmZfdGx2LT51c25pZmZlcjsKIH0KIAorc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgZndfaW1nICoKK2l3bF9nZXRfdWNvZGVfaW1hZ2UoY29uc3Qgc3RydWN0IGl3bF9mdyAqZncsIGVudW0gaXdsX3Vjb2RlX3R5cGUgdWNvZGVfdHlwZSkKK3sKKwlpZiAodWNvZGVfdHlwZSA+PSBJV0xfVUNPREVfVFlQRV9NQVgpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZmdy0+aW1nW3Vjb2RlX3R5cGVdOworfQorCiAjZW5kaWYgIC8qIF9faXdsX2Z3X2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWlvLmMKaW5kZXggOTJjOGI1Zi4uYTlmNjlmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1pby5jCkBAIC0yNjcsNyArMjY3LDcgQEAKIAkJSVdMX0NNRF9NUShjbWQsIFJGSF9RX0ZSQkRDQl9XSURYLCBpKTsKIAkJSVdMX0NNRF9NUShjbWQsIFJGSF9RX0ZSQkRDQl9SSURYLCBpKTsKIAkJSVdMX0NNRF9NUShjbWQsIFJGSF9RX1VSQkRfU1RUU19XUFRSX0xTQiwgaSk7Ci0JfTsKKwl9CiAKIAlzd2l0Y2ggKGNtZCkgewogCUlXTF9DTUQoUkZIX1JYRl9ETUFfQ0ZHKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLW5vdGlmLXdhaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLW5vdGlmLXdhaXQuYwppbmRleCA4YWExZjJiLi44OGYyNjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1ub3RpZi13YWl0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtbm90aWYtd2FpdC5jCkBAIC05OSw4ICs5OSwxMiBAQAogCQkJCWNvbnRpbnVlOwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgdy0+bl9jbWRzOyBpKyspIHsKLQkJCQlpZiAody0+Y21kc1tpXSA9PQotCQkJCSAgICBXSURFX0lEKHBrdC0+aGRyLmdyb3VwX2lkLCBwa3QtPmhkci5jbWQpKSB7CisJCQkJdTE2IHJlY19pZCA9IFdJREVfSUQocGt0LT5oZHIuZ3JvdXBfaWQsCisJCQkJCQkgICAgIHBrdC0+aGRyLmNtZCk7CisKKwkJCQlpZiAody0+Y21kc1tpXSA9PSByZWNfaWQgfHwKKwkJCQkgICAgKCFpd2xfY21kX2dyb3VwaWQody0+Y21kc1tpXSkgJiYKKwkJCQkgICAgIERFRl9JRCh3LT5jbWRzW2ldKSA9PSByZWNfaWQpKSB7CiAJCQkJCWZvdW5kID0gdHJ1ZTsKIAkJCQkJYnJlYWs7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtbnZtLXBhcnNlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1udm0tcGFyc2UuYwppbmRleCA0M2Y4ZjdkLi4zYmQ2ZmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1udm0tcGFyc2UuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1udm0tcGFyc2UuYwpAQCAtNjcsNiArNjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgIml3bC1kcnYuaCIKICNpbmNsdWRlICJpd2wtbW9kcGFyYW1zLmgiCiAjaW5jbHVkZSAiaXdsLW52bS1wYXJzZS5oIgpAQCAtNTY0LDExICs1NjUsMTYgQEAKIAlfX2xlMzIgbWFjX2FkZHIwID0gY3B1X3RvX2xlMzIoaXdsX3JlYWQzMih0cmFucywgQ1NSX01BQ19BRERSMF9TVFJBUCkpOwogCV9fbGUzMiBtYWNfYWRkcjEgPSBjcHVfdG9fbGUzMihpd2xfcmVhZDMyKHRyYW5zLCBDU1JfTUFDX0FERFIxX1NUUkFQKSk7CiAKLQkvKiBJZiBPRU0gZGlkIG5vdCBmdXNlIGFkZHJlc3MgLSBnZXQgaXQgZnJvbSBPVFAgKi8KLQlpZiAoIW1hY19hZGRyMCAmJiAhbWFjX2FkZHIxKSB7Ci0JCW1hY19hZGRyMCA9IGNwdV90b19sZTMyKGl3bF9yZWFkMzIodHJhbnMsIENTUl9NQUNfQUREUjBfT1RQKSk7Ci0JCW1hY19hZGRyMSA9IGNwdV90b19sZTMyKGl3bF9yZWFkMzIodHJhbnMsIENTUl9NQUNfQUREUjFfT1RQKSk7Ci0JfQorCWl3bF9mbGlwX2h3X2FkZHJlc3MobWFjX2FkZHIwLCBtYWNfYWRkcjEsIGRhdGEtPmh3X2FkZHIpOworCS8qCisJICogSWYgdGhlIE9FTSBmdXNlZCBhIHZhbGlkIGFkZHJlc3MsIHVzZSBpdCBpbnN0ZWFkIG9mIHRoZSBvbmUgaW4gdGhlCisJICogT1RQCisJICovCisJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIoZGF0YS0+aHdfYWRkcikpCisJCXJldHVybjsKKworCW1hY19hZGRyMCA9IGNwdV90b19sZTMyKGl3bF9yZWFkMzIodHJhbnMsIENTUl9NQUNfQUREUjBfT1RQKSk7CisJbWFjX2FkZHIxID0gY3B1X3RvX2xlMzIoaXdsX3JlYWQzMih0cmFucywgQ1NSX01BQ19BRERSMV9PVFApKTsKIAogCWl3bF9mbGlwX2h3X2FkZHJlc3MobWFjX2FkZHIwLCBtYWNfYWRkcjEsIGRhdGEtPmh3X2FkZHIpOwogfQpAQCAtODk5LDMgKzkwNSw5MSBAQAogCXJldHVybiByZWdkOwogfQogSVdMX0VYUE9SVF9TWU1CT0woaXdsX3BhcnNlX252bV9tY2NfaW5mbyk7CisKKyNpZmRlZiBDT05GSUdfQUNQSQorI2RlZmluZSBXUkREX01FVEhPRAkJIldSREQiCisjZGVmaW5lIFdSRERfV0lGSQkJKDB4MDcpCisjZGVmaW5lIFdSRERfV0lHSUcJCSgweDEwKQorCitzdGF0aWMgdTMyIGl3bF93cmRkX2dldF9tY2Moc3RydWN0IGRldmljZSAqZGV2LCB1bmlvbiBhY3BpX29iamVjdCAqd3JkZCkKK3sKKwl1bmlvbiBhY3BpX29iamVjdCAqbWNjX3BrZywgKmRvbWFpbl90eXBlLCAqbWNjX3ZhbHVlOworCXUzMiBpOworCisJaWYgKHdyZGQtPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UgfHwKKwkgICAgd3JkZC0+cGFja2FnZS5jb3VudCA8IDIgfHwKKwkgICAgd3JkZC0+cGFja2FnZS5lbGVtZW50c1swXS50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSIHx8CisJICAgIHdyZGQtPnBhY2thZ2UuZWxlbWVudHNbMF0uaW50ZWdlci52YWx1ZSAhPSAwKSB7CisJCUlXTF9ERUJVR19FRVBST00oZGV2LCAiVW5zdXBwb3J0ZWQgd3JkZCBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAxIDsgaSA8IHdyZGQtPnBhY2thZ2UuY291bnQgOyArK2kpIHsKKwkJbWNjX3BrZyA9ICZ3cmRkLT5wYWNrYWdlLmVsZW1lbnRzW2ldOworCisJCWlmIChtY2NfcGtnLT50eXBlICE9IEFDUElfVFlQRV9QQUNLQUdFIHx8CisJCSAgICBtY2NfcGtnLT5wYWNrYWdlLmNvdW50IDwgMiB8fAorCQkgICAgbWNjX3BrZy0+cGFja2FnZS5lbGVtZW50c1swXS50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSIHx8CisJCSAgICBtY2NfcGtnLT5wYWNrYWdlLmVsZW1lbnRzWzFdLnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwkJCW1jY19wa2cgPSBOVUxMOworCQkJY29udGludWU7CisJCX0KKworCQlkb21haW5fdHlwZSA9ICZtY2NfcGtnLT5wYWNrYWdlLmVsZW1lbnRzWzBdOworCQlpZiAoZG9tYWluX3R5cGUtPmludGVnZXIudmFsdWUgPT0gV1JERF9XSUZJKQorCQkJYnJlYWs7CisKKwkJbWNjX3BrZyA9IE5VTEw7CisJfQorCisJaWYgKG1jY19wa2cpIHsKKwkJbWNjX3ZhbHVlID0gJm1jY19wa2ctPnBhY2thZ2UuZWxlbWVudHNbMV07CisJCXJldHVybiBtY2NfdmFsdWUtPmludGVnZXIudmFsdWU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBpd2xfZ2V0X2Jpb3NfbWNjKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqbWNjKQoreworCWFjcGlfaGFuZGxlIHJvb3RfaGFuZGxlOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgd3JkZCA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiBtY2NfdmFsOworCisJcm9vdF9oYW5kbGUgPSBBQ1BJX0hBTkRMRShkZXYpOworCWlmICghcm9vdF9oYW5kbGUpIHsKKwkJSVdMX0RFQlVHX0VFUFJPTShkZXYsCisJCQkJICJDb3VsZCBub3QgcmV0cmlldmUgcm9vdCBwb3J0IEFDUEkgaGFuZGxlXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJLyogR2V0IHRoZSBtZXRob2QncyBoYW5kbGUgKi8KKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUocm9vdF9oYW5kbGUsIChhY3BpX3N0cmluZylXUkREX01FVEhPRCwKKwkJCQkgJmhhbmRsZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUlXTF9ERUJVR19FRVBST00oZGV2LCAiV1JEIG1ldGhvZCBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwkvKiBDYWxsIFdSREQgd2l0aCBubyBhcmd1bWVudHMgKi8KKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIE5VTEwsIE5VTEwsICZ3cmRkKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJSVdMX0RFQlVHX0VFUFJPTShkZXYsICJXUkRDIGludm9jYXRpb24gZmFpbGVkICgweCV4KVxuIiwKKwkJCQkgc3RhdHVzKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJbWNjX3ZhbCA9IGl3bF93cmRkX2dldF9tY2MoZGV2LCB3cmRkLnBvaW50ZXIpOworCWtmcmVlKHdyZGQucG9pbnRlcik7CisJaWYgKCFtY2NfdmFsKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCW1jY1swXSA9IChtY2NfdmFsID4+IDgpICYgMHhmZjsKKwltY2NbMV0gPSBtY2NfdmFsICYgMHhmZjsKKwltY2NbMl0gPSAnXDAnOworCXJldHVybiAwOworfQorSVdMX0VYUE9SVF9TWU1CT0woaXdsX2dldF9iaW9zX21jYyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLW52bS1wYXJzZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtbnZtLXBhcnNlLmgKaW5kZXggZDcwNGQ1Mi4uNzI0OWU1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtbnZtLXBhcnNlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtbnZtLXBhcnNlLmgKQEAgLTUsNyArNSw4IEBACiAgKgogICogR1BMIExJQ0VOU0UgU1VNTUFSWQogICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDE2ICAgICAgICBJbnRlbCBEZXV0c2NobGFuZCBHbWJICiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCkBAIC05Myw0ICs5NCwyMSBAQAogaXdsX3BhcnNlX252bV9tY2NfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBpd2xfY2ZnICpjZmcsCiAJCSAgICAgICBpbnQgbnVtX29mX2NoLCBfX2xlMzIgKmNoYW5uZWxzLCB1MTYgZndfbWNjKTsKIAorI2lmZGVmIENPTkZJR19BQ1BJCisvKioKKyAqIGl3bF9nZXRfYmlvc19tY2MgLSByZWFkIE1DQyBmcm9tIEJJT1MsIGlmIGF2YWlsYWJsZQorICoKKyAqIEBkZXY6IHRoZSBzdHJ1Y3QgZGV2aWNlCisgKiBAbWNjOiBvdXRwdXQgYnVmZmVyICgzIGJ5dGVzKSB0aGF0IHdpbGwgZ2V0IHRoZSBNQ0MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHJlYWQgdGhlIGN1cnJlbnQgTUNDIGZyb20gQUNQSSBpZiBhdmFpbGFibGUuCisgKi8KK2ludCBpd2xfZ2V0X2Jpb3NfbWNjKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqbWNjKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBpd2xfZ2V0X2Jpb3NfbWNjKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqbWNjKQoreworCXJldHVybiAtRU5PRU5UOworfQorI2VuZGlmCisKICNlbmRpZiAvKiBfX2l3bF9udm1fcGFyc2VfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1waHktZGIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXBoeS1kYi5jCmluZGV4IDdiZWJhOWEuLjI4OTM4MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXBoeS1kYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXBoeS1kYi5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIAlJV0xfUEhZX0RCX01BWAogfTsKIAotI2RlZmluZSBQSFlfREJfQ01EIDB4NmMgLyogVEVNUCBBUEkgLSBUaGUgYWN0dWFsIGlzIDB4OGMgKi8KKyNkZWZpbmUgUEhZX0RCX0NNRCAweDZjCiAKIC8qCiAgKiBwaHkgZGIgLSBjb25maWd1cmUgb3BlcmF0aW9uYWwgdWNvZGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXBycGguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXBycGguaAppbmRleCA0NTliZjczLi40MDZlZjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1wcnBoLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtcHJwaC5oCkBAIC0zMDIsMjIgKzMwMiwxNyBAQAogI2RlZmluZSBPU0NfQ0xLX0ZPUkNFX0NPTlRST0wJCSgweDgpCiAKICNkZWZpbmUgRkhfVUNPREVfTE9BRF9TVEFUVVMJCSgweDFBRjApCi0jZGVmaW5lIENTUl9VQ09ERV9MT0FEX1NUQVRVU19BRERSCSgweDFFNzApCi1lbnVtIHNlY3VyZV9sb2FkX3N0YXR1c19yZWcgewotCUxNUE1fQ1BVX1VDT0RFX0xPQURJTkdfU1RBUlRFRAkJCT0gMHgwMDAwMDAwMSwKLQlMTVBNX0NQVV9IRFJTX0xPQURJTkdfQ09NUExFVEVECQkJPSAweDAwMDAwMDAzLAotCUxNUE1fQ1BVX1VDT0RFX0xPQURJTkdfQ09NUExFVEVECQk9IDB4MDAwMDAwMDcsCi0JTE1QTV9DUFVfU1RBVFVTX05VTV9PRl9MQVNUX0NPTVBMRVRFRAkJPSAweDAwMDAwMEY4LAotCUxNUE1fQ1BVX1NUQVRVU19OVU1fT0ZfTEFTVF9MT0FERURfQkxPQ0sJPSAweDAwMDBGRjAwLAotfTsKIAotI2RlZmluZSBMTVBNX1NFQ1VSRV9JTlNQRUNUT1JfQ09ERV9BRERSCSgweDFFMzgpCi0jZGVmaW5lIExNUE1fU0VDVVJFX0lOU1BFQ1RPUl9EQVRBX0FERFIJKDB4MUUzQykKKy8qCisgKiBSZXBsYWNpbmcgRkhfVUNPREVfTE9BRF9TVEFUVVMKKyAqIFRoaXMgcmVnaXN0ZXIgaXMgd3JpdGVuIGJ5IGRyaXZlciBhbmQgaXMgcmVhZCBieSB1Q29kZSBkdXJpbmcgYm9vdCBmbG93LgorICogTm90ZSB0aGlzIGFkZHJlc3MgaXMgY2xlYXJlZCBhZnRlciBNQUMgcmVzZXQuCisgKi8KKyNkZWZpbmUgVVJFR19VQ09ERV9MT0FEX1NUQVRVUwkJKDB4YTA1YzQwKQorCiAjZGVmaW5lIExNUE1fU0VDVVJFX1VDT0RFX0xPQURfQ1BVMV9IRFJfQUREUgkoMHgxRTc4KQogI2RlZmluZSBMTVBNX1NFQ1VSRV9VQ09ERV9MT0FEX0NQVTJfSERSX0FERFIJKDB4MUU3QykKIAotI2RlZmluZSBMTVBNX1NFQ1VSRV9JTlNQRUNUT1JfQ09ERV9NRU1fU1BBQ0UJKDB4NDAwMDAwKQotI2RlZmluZSBMTVBNX1NFQ1VSRV9JTlNQRUNUT1JfREFUQV9NRU1fU1BBQ0UJKDB4NDAyMDAwKQogI2RlZmluZSBMTVBNX1NFQ1VSRV9DUFUxX0hEUl9NRU1fU1BBQ0UJCSgweDQyMDAwMCkKICNkZWZpbmUgTE1QTV9TRUNVUkVfQ1BVMl9IRFJfTUVNX1NQQUNFCQkoMHg0MjA0MDApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXRyYW5zLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC10cmFucy5jCmluZGV4IDYwNjlhOWYuLmQ0MmNhYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXRyYW5zLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtdHJhbnMuYwpAQCAtNjUsNiArNjUsNyBAQAogCiAjaW5jbHVkZSAiaXdsLXRyYW5zLmgiCiAjaW5jbHVkZSAiaXdsLWRydi5oIgorI2luY2x1ZGUgIml3bC1maC5oIgogCiBzdHJ1Y3QgaXdsX3RyYW5zICppd2xfdHJhbnNfYWxsb2ModW5zaWduZWQgaW50IHByaXZfc2l6ZSwKIAkJCQkgIHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTc3LDcgKzc4LDcgQEAKIAlzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IF9fa2V5OwogI2VuZGlmCiAKLQl0cmFucyA9IGt6YWxsb2Moc2l6ZW9mKCp0cmFucykgKyBwcml2X3NpemUsIEdGUF9LRVJORUwpOworCXRyYW5zID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCp0cmFucykgKyBwcml2X3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghdHJhbnMpCiAJCXJldHVybiBOVUxMOwogCkBAIC0xMDIsMTggKzEwMywxNCBAQAogCQkJCSAgU0xBQl9IV0NBQ0hFX0FMSUdOLAogCQkJCSAgTlVMTCk7CiAJaWYgKCF0cmFucy0+ZGV2X2NtZF9wb29sKQotCQlnb3RvIGZyZWU7CisJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuIHRyYW5zOwotIGZyZWU6Ci0Ja2ZyZWUodHJhbnMpOwotCXJldHVybiBOVUxMOwogfQogCiB2b2lkIGl3bF90cmFuc19mcmVlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQogewogCWttZW1fY2FjaGVfZGVzdHJveSh0cmFucy0+ZGV2X2NtZF9wb29sKTsKLQlrZnJlZSh0cmFucyk7CiB9CiAKIGludCBpd2xfdHJhbnNfc2VuZF9jbWQoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCkKQEAgLTEzOSw2ICsxMzYsOSBAQAogCWlmICghKGNtZC0+ZmxhZ3MgJiBDTURfQVNZTkMpKQogCQlsb2NrX21hcF9hY3F1aXJlX3JlYWQoJnRyYW5zLT5zeW5jX2NtZF9sb2NrZGVwX21hcCk7CiAKKwlpZiAodHJhbnMtPndpZGVfY21kX2hlYWRlciAmJiAhaXdsX2NtZF9ncm91cGlkKGNtZC0+aWQpKQorCQljbWQtPmlkID0gREVGX0lEKGNtZC0+aWQpOworCiAJcmV0ID0gdHJhbnMtPm9wcy0+c2VuZF9jbWQodHJhbnMsIGNtZCk7CiAKIAlpZiAoIShjbWQtPmZsYWdzICYgQ01EX0FTWU5DKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXRyYW5zLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC10cmFucy5oCmluZGV4IDU1MzVlMjIuLjAyOTYxMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXRyYW5zLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtdHJhbnMuaApAQCAtMTUzLDYgKzE1Myw3IEBACiAKIC8qIG1ha2UgdTE2IHdpZGUgaWQgb3V0IG9mIHU4IGdyb3VwIGFuZCBvcGNvZGUgKi8KICNkZWZpbmUgV0lERV9JRChncnAsIG9wY29kZSkgKChncnAgPDwgOCkgfCBvcGNvZGUpCisjZGVmaW5lIERFRl9JRChvcGNvZGUpICgoMSA8PCA4KSB8IChvcGNvZGUpKQogCiAvKiBkdWUgdG8gdGhlIGNvbnZlcnNpb24sIHRoaXMgZ3JvdXAgaXMgc3BlY2lhbDsgbmV3IGdyb3VwcwogICogc2hvdWxkIGJlIGRlZmluZWQgaW4gdGhlIGFwcHJvcHJpYXRlIGZ3LWFwaSBoZWFkZXIgZmlsZXMKQEAgLTI2Miw4ICsyNjMsNiBAQAogICoJKGkuZS4gbWFyayBpdCBhcyBub24taWRsZSkuCiAgKiBAQ01EX1dBTlRfQVNZTkNfQ0FMTEJBQ0s6IHRoZSBvcF9tb2RlJ3MgYXN5bmMgY2FsbGJhY2sgZnVuY3Rpb24gbXVzdCBiZQogICoJY2FsbGVkIGFmdGVyIHRoaXMgY29tbWFuZCBjb21wbGV0ZXMuIFZhbGlkIG9ubHkgd2l0aCBDTURfQVNZTkMuCi0gKiBAQ01EX1RCX0JJVE1BUF9QT1M6IFBvc2l0aW9uIG9mIHRoZSBmaXJzdCBiaXQgZm9yIHRoZSBUQiBiaXRtYXAuIFdlIG5lZWQgdG8KLSAqCWNoZWNrIHRoYXQgd2UgbGVhdmUgZW5vdWdoIHJvb20gZm9yIHRoZSBUQnMgYml0bWFwIHdoaWNoIG5lZWRzIDIwIGJpdHMuCiAgKi8KIGVudW0gQ01EX01PREUgewogCUNNRF9BU1lOQwkJPSBCSVQoMCksCkBAIC0yNzQsOCArMjczLDYgQEAKIAlDTURfTUFLRV9UUkFOU19JRExFCT0gQklUKDUpLAogCUNNRF9XQUtFX1VQX1RSQU5TCT0gQklUKDYpLAogCUNNRF9XQU5UX0FTWU5DX0NBTExCQUNLCT0gQklUKDcpLAotCi0JQ01EX1RCX0JJVE1BUF9QT1MJPSAxMSwKIH07CiAKICNkZWZpbmUgREVGX0NNRF9QQVlMT0FEX1NJWkUgMzIwCkBAIC00ODgsNyArNDg1LDYgQEAKICAqIEBiY190YWJsZV9kd29yZDogc2V0IHRvIHRydWUgaWYgdGhlIEJDIHRhYmxlIGV4cGVjdHMgdGhlIGJ5dGUgY291bnQgdG8gYmUKICAqCWluIERXT1JEIChhcyBvcHBvc2VkIHRvIGJ5dGVzKQogICogQHNjZF9zZXRfYWN0aXZlOiBzaG91bGQgdGhlIHRyYW5zcG9ydCBjb25maWd1cmUgdGhlIFNDRCBmb3IgSENNRCBxdWV1ZQotICogQHdpZGVfY21kX2hlYWRlcjogZmlybXdhcmUgc3VwcG9ydHMgd2lkZSBob3N0IGNvbW1hbmQgaGVhZGVyCiAgKiBAc3dfY3N1bV90eDogdHJhbnNwb3J0IHNob3VsZCBjb21wdXRlIHRoZSBUQ1AgY2hlY2tzdW0KICAqIEBjb21tYW5kX2dyb3VwczogYXJyYXkgb2YgY29tbWFuZCBncm91cHMsIGVhY2ggbWVtYmVyIGlzIGFuIGFycmF5IG9mIHRoZQogICoJY29tbWFuZHMgaW4gdGhlIGdyb3VwOyBmb3IgZGVidWdnaW5nIG9ubHkKQEAgLTUxMCw3ICs1MDYsNiBAQAogCWVudW0gaXdsX2Ftc2R1X3NpemUgcnhfYnVmX3NpemU7CiAJYm9vbCBiY190YWJsZV9kd29yZDsKIAlib29sIHNjZF9zZXRfYWN0aXZlOwotCWJvb2wgd2lkZV9jbWRfaGVhZGVyOwogCWJvb2wgc3dfY3N1bV90eDsKIAljb25zdCBzdHJ1Y3QgaXdsX2hjbWRfYXJyICpjb21tYW5kX2dyb3VwczsKIAlpbnQgY29tbWFuZF9ncm91cHNfc2l6ZTsKQEAgLTY0OSw2ICs2NDQsOCBAQAogCXZvaWQgKCp0eHFfc2V0X3NoYXJlZF9tb2RlKShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgdTMyIHR4cV9pZCwKIAkJCQkgICAgYm9vbCBzaGFyZWQpOwogCisJZG1hX2FkZHJfdCAoKmdldF90eHFfYnl0ZV90YWJsZSkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCB0eHFfaWQpOworCiAJaW50ICgqd2FpdF90eF9xdWV1ZV9lbXB0eSkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHUzMiB0eHFfYm0pOwogCXZvaWQgKCpmcmVlemVfdHhxX3RpbWVyKShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgdW5zaWduZWQgbG9uZyB0eHFzLAogCQkJCSBib29sIGZyZWV6ZSk7CkBAIC03NzIsNiArNzY5LDcgQEAKICAqIEBod19pZF9zdHI6IGEgc3RyaW5nIHdpdGggaW5mbyBhYm91dCBIVyBJRC4gU2V0IGR1cmluZyB0cmFuc3BvcnQgYWxsb2NhdGlvbi4KICAqIEBwbV9zdXBwb3J0OiBzZXQgdG8gdHJ1ZSBpbiBzdGFydF9odyBpZiBsaW5rIHBtIGlzIHN1cHBvcnRlZAogICogQGx0cl9lbmFibGVkOiBzZXQgdG8gdHJ1ZSBpZiB0aGUgTFRSIGlzIGVuYWJsZWQKKyAqIEB3aWRlX2NtZF9oZWFkZXI6IHRydWUgd2hlbiB1Y29kZSBzdXBwb3J0cyB3aWRlIGNvbW1hbmQgaGVhZGVyIGZvcm1hdAogICogQG51bV9yeF9xdWV1ZXM6IG51bWJlciBvZiBSWCBxdWV1ZXMgYWxsb2NhdGVkIGJ5IHRoZSB0cmFuc3BvcnQ7CiAgKgl0aGUgdHJhbnNwb3J0IG11c3Qgc2V0IHRoaXMgYmVmb3JlIGNhbGxpbmcgaXdsX2Rydl9zdGFydCgpCiAgKiBAZGV2X2NtZF9wb29sOiBwb29sIGZvciBUeCBjbWQgYWxsb2NhdGlvbiAtIGZvciBpbnRlcm5hbCB1c2Ugb25seS4KQEAgLTgyMyw2ICs4MjEsNyBAQAogCiAJY29uc3Qgc3RydWN0IGl3bF9oY21kX2FyciAqY29tbWFuZF9ncm91cHM7CiAJaW50IGNvbW1hbmRfZ3JvdXBzX3NpemU7CisJYm9vbCB3aWRlX2NtZF9oZWFkZXI7CiAKIAl1OCBudW1fcnhfcXVldWVzOwogCkBAIC0xMDczLDYgKzEwNzIsMTUgQEAKIAkJdHJhbnMtPm9wcy0+dHhxX3NldF9zaGFyZWRfbW9kZSh0cmFucywgcXVldWUsIHNoYXJlZF9tb2RlKTsKIH0KIAorc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGl3bF90cmFuc19nZXRfdHhxX2J5dGVfdGFibGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCQkJCQkgICAgICBpbnQgcXVldWUpCit7CisJLyogd2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBpZiB0aGUgdHJhbnMgZG9lc24ndCBzdXBwb3J0IGl0ICovCisJQlVHX09OKCF0cmFucy0+b3BzLT5nZXRfdHhxX2J5dGVfdGFibGUpOworCisJcmV0dXJuIHRyYW5zLT5vcHMtPmdldF90eHFfYnl0ZV90YWJsZSh0cmFucywgcXVldWUpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgaXdsX3RyYW5zX3R4cV9lbmFibGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCBxdWV1ZSwKIAkJCQkJaW50IGZpZm8sIGludCBzdGFfaWQsIGludCB0aWQsCiAJCQkJCWludCBmcmFtZV9saW1pdCwgdTE2IHNzbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2RlYnVnZnMtdmlmLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9kZWJ1Z2ZzLXZpZi5jCmluZGV4IGIyMzI3MTcuLjJkNmY0NGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2RlYnVnZnMtdmlmLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZGVidWdmcy12aWYuYwpAQCAtNTA0LDYgKzUwNCwyOCBAQAogCXJldHVybiAhc3RybmNtcChuYW1lLCBidWYsIGxlbikgPyBidWYgKyBsZW4gOiBOVUxMOwogfQogCitzdGF0aWMgc3NpemVfdCBpd2xfZGJnZnNfb3NfZGV2aWNlX3RpbWVkaWZmX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCQkgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGl3bF9tdm1fdmlmICptdm12aWYgPSBpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHZpZik7CisJc3RydWN0IGl3bF9tdm0gKm12bSA9IG12bXZpZi0+bXZtOworCXUzMiBjdXJyX2dwMjsKKwl1NjQgY3Vycl9vczsKKwlzNjQgZGlmZjsKKwljaGFyIGJ1Zls2NF07CisJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7CisJaW50IHBvcyA9IDA7CisKKwlpd2xfbXZtX2dldF9zeW5jX3RpbWUobXZtLCAmY3Vycl9ncDIsICZjdXJyX29zKTsKKwlkb19kaXYoY3Vycl9vcywgTlNFQ19QRVJfVVNFQyk7CisJZGlmZiA9IGN1cnJfb3MgLSBjdXJyX2dwMjsKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJkaWZmPSVsbGRcbiIsIGRpZmYpOworCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworfQorCiBzdGF0aWMgc3NpemVfdCBpd2xfZGJnZnNfdG9mX2VuYWJsZV93cml0ZShzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJCQkgIGNoYXIgKmJ1ZiwKIAkJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKQEAgLTE1MzAsNiArMTU1Miw4IEBACiBNVk1fREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKHRvZl9yZXNwb25kZXJfcGFyYW1zLCAzMik7CiBNVk1fREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKHF1b3RhX21pbiwgMzIpOwogTVZNX0RFQlVHRlNfV1JJVEVfRklMRV9PUFMobHFtX3NlbmRfY21kLCA2NCk7CitNVk1fREVCVUdGU19SRUFEX0ZJTEVfT1BTKG9zX2RldmljZV90aW1lZGlmZik7CisKIAogdm9pZCBpd2xfbXZtX3ZpZl9kYmdmc19yZWdpc3RlcihzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogewpAQCAtMTU1NCw4ICsxNTc4LDcgQEAKIAogCWlmIChpd2xtdm1fbW9kX3BhcmFtcy5wb3dlcl9zY2hlbWUgIT0gSVdMX1BPV0VSX1NDSEVNRV9DQU0gJiYKIAkgICAgKCh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJiAhdmlmLT5wMnApIHx8Ci0JICAgICAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYgdmlmLT5wMnAgJiYKLQkgICAgICBtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19CU1NfUDJQX1BTX0RDTSkpKQorCSAgICAgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmIHZpZi0+cDJwKSkpCiAJCU1WTV9ERUJVR0ZTX0FERF9GSUxFX1ZJRihwbV9wYXJhbXMsIG12bXZpZi0+ZGJnZnNfZGlyLCBTX0lXVVNSIHwKIAkJCQkJIFNfSVJVU1IpOwogCkBAIC0xNTcwLDYgKzE1OTMsOCBAQAogCU1WTV9ERUJVR0ZTX0FERF9GSUxFX1ZJRihxdW90YV9taW4sIG12bXZpZi0+ZGJnZnNfZGlyLAogCQkJCSBTX0lSVVNSIHwgU19JV1VTUik7CiAJTVZNX0RFQlVHRlNfQUREX0ZJTEVfVklGKGxxbV9zZW5kX2NtZCwgbXZtdmlmLT5kYmdmc19kaXIsIFNfSVdVU1IpOworCU1WTV9ERUJVR0ZTX0FERF9GSUxFX1ZJRihvc19kZXZpY2VfdGltZWRpZmYsCisJCQkJIG12bXZpZi0+ZGJnZnNfZGlyLCBTX0lSVVNSKTsKIAogCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJiAhdmlmLT5wMnAgJiYKIAkgICAgbXZtdmlmID09IG12bS0+YmZfYWxsb3dlZF92aWYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9kZWJ1Z2ZzLmMKaW5kZXggYjM0NDg5OC4uNTM5ZDcxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2RlYnVnZnMuYwpAQCAtOTE3LDYgKzkxNyw1OSBAQAogCXJldHVybiByZXQgPzogY291bnQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGl3bF9kYmdmc19pbmplY3RfcGFja2V0X3dyaXRlKHN0cnVjdCBpd2xfbXZtICptdm0sCisJCQkJCSAgICAgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkJCSAgICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpd2xfcnhfY21kX2J1ZmZlciByeGIgPSB7CisJCS5fcnhfcGFnZV9vcmRlciA9IDAsCisJCS50cnVlc2l6ZSA9IDAsIC8qIG5vdCB1c2VkICovCisJCS5fb2Zmc2V0ID0gMCwKKwl9OworCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3Q7CisJc3RydWN0IGl3bF9yeF9tcGR1X2Rlc2MgKmRlc2M7CisJaW50IGJpbl9sZW4gPSBjb3VudCAvIDI7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwkvKiBzdXBwb3J0aW5nIG9ubHkgOTAwMCBkZXNjcmlwdG9yICovCisJaWYgKCFtdm0tPnRyYW5zLT5jZmctPm1xX3J4X3N1cHBvcnRlZCkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCXJ4Yi5fcGFnZSA9IGFsbG9jX3BhZ2VzKEdGUF9BVE9NSUMsIDApOworCWlmICghcnhiLl9wYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwa3QgPSByeGJfYWRkcigmcnhiKTsKKworCXJldCA9IGhleDJiaW4ocGFnZV9hZGRyZXNzKHJ4Yi5fcGFnZSksIGJ1ZiwgYmluX2xlbik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBhdm9pZCBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MgKi8KKwlpZiAoYmluX2xlbiA8IHNpemVvZigqcGt0KSArIHNpemVvZigqZGVzYykpCisJCWdvdG8gb3V0OworCisJLyogY2hlY2sgdGhpcyBpcyBSWCBwYWNrZXQgKi8KKwlpZiAoV0lERV9JRChwa3QtPmhkci5ncm91cF9pZCwgcGt0LT5oZHIuY21kKSAhPQorCSAgICBXSURFX0lEKExFR0FDWV9HUk9VUCwgUkVQTFlfUlhfTVBEVV9DTUQpKQorCQlnb3RvIG91dDsKKworCS8qIGNoZWNrIHRoZSBsZW5ndGggaW4gbWV0YWRhdGEgbWF0Y2hlcyBhY3R1YWwgcmVjZWl2ZWQgbGVuZ3RoICovCisJZGVzYyA9ICh2b2lkICopcGt0LT5kYXRhOworCWlmIChsZTE2X3RvX2NwdShkZXNjLT5tcGR1X2xlbikgIT0KKwkgICAgKGJpbl9sZW4gLSBzaXplb2YoKmRlc2MpIC0gc2l6ZW9mKCpwa3QpKSkKKwkJZ290byBvdXQ7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJaXdsX212bV9yeF9tcGR1X21xKG12bSwgTlVMTCwgJnJ4YiwgMCk7CisJbG9jYWxfYmhfZW5hYmxlKCk7CisJcmV0ID0gMDsKKworb3V0OgorCWl3bF9mcmVlX3J4YigmcnhiKTsKKworCXJldHVybiByZXQgPzogY291bnQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IGl3bF9kYmdmc19md19kYmdfY29uZl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCQkgIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKQEAgLTE0NTQsNiArMTUwNyw3IEBACiBNVk1fREVCVUdGU19XUklURV9GSUxFX09QUyhtYXhfYW1zZHVfbGVuLCA4KTsKIE1WTV9ERUJVR0ZTX1dSSVRFX0ZJTEVfT1BTKGluZGlyZWN0aW9uX3RibCwKIAkJCSAgIChJV0xfUlNTX0lORElSRUNUSU9OX1RBQkxFX1NJWkUgKiAyKSk7CitNVk1fREVCVUdGU19XUklURV9GSUxFX09QUyhpbmplY3RfcGFja2V0LCA1MTIpOwogCiAjaWZkZWYgQ09ORklHX0lXTFdJRklfQkNBU1RfRklMVEVSSU5HCiBNVk1fREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKGJjYXN0X2ZpbHRlcnMsIDI1Nik7CkBAIC0xNDY0LDYgKzE1MTgsMTMyIEBACiBNVk1fREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKGQzX3NyYW0sIDgpOwogI2VuZGlmCiAKK3N0YXRpYyBzc2l6ZV90IGl3bF9kYmdmc19tZW1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGl3bF9tdm0gKm12bSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaXdsX2RiZ19tZW1fYWNjZXNzX2NtZCBjbWQgPSB7fTsKKwlzdHJ1Y3QgaXdsX2RiZ19tZW1fYWNjZXNzX3JzcCAqcnNwOworCXN0cnVjdCBpd2xfaG9zdF9jbWQgaGNtZCA9IHsKKwkJLmZsYWdzID0gQ01EX1dBTlRfU0tCIHwgQ01EX1NFTkRfSU5fUkZLSUxMLAorCQkuZGF0YSA9IHsgJmNtZCwgfSwKKwkJLmxlbiA9IHsgc2l6ZW9mKGNtZCkgfSwKKwl9OworCXNpemVfdCBkZWx0YSwgbGVuOworCXNzaXplX3QgcmV0OworCisJaGNtZC5pZCA9IGl3bF9jbWRfaWQoKnBwb3MgPj4gMjQgPyBVTUFDX1JEX1dSIDogTE1BQ19SRF9XUiwKKwkJCSAgICAgREVCVUdfR1JPVVAsIDApOworCWNtZC5vcCA9IGNwdV90b19sZTMyKERFQlVHX01FTV9PUF9SRUFEKTsKKworCS8qIFRha2UgY2FyZSBvZiBhbGlnbm1lbnQgb2YgYm90aCB0aGUgcG9zaXRpb24gYW5kIHRoZSBsZW5ndGggKi8KKwlkZWx0YSA9ICpwcG9zICYgMHgzOworCWNtZC5hZGRyID0gY3B1X3RvX2xlMzIoKnBwb3MgLSBkZWx0YSk7CisJY21kLmxlbiA9IGNwdV90b19sZTMyKG1pbihBTElHTihjb3VudCArIGRlbHRhLCA0KSAvIDQsCisJCQkJICAoc2l6ZV90KURFQlVHX01FTV9NQVhfU0laRV9EV09SRFMpKTsKKworCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOworCXJldCA9IGl3bF9tdm1fc2VuZF9jbWQobXZtLCAmaGNtZCk7CisJbXV0ZXhfdW5sb2NrKCZtdm0tPm11dGV4KTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcnNwID0gKHZvaWQgKiloY21kLnJlc3BfcGt0LT5kYXRhOworCWlmIChsZTMyX3RvX2NwdShyc3AtPnN0YXR1cykgIT0gREVCVUdfTUVNX1NUQVRVU19TVUNDRVNTKSB7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXQ7CisJfQorCisJbGVuID0gbWluKChzaXplX3QpbGUzMl90b19jcHUocnNwLT5sZW4pIDw8IDIsCisJCSAgaXdsX3J4X3BhY2tldF9wYXlsb2FkX2xlbihoY21kLnJlc3BfcGt0KSAtIHNpemVvZigqcnNwKSk7CisJbGVuID0gbWluKGxlbiAtIGRlbHRhLCBjb3VudCk7CisJaWYgKGxlbiA8IDApIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gbGVuIC0gY29weV90b191c2VyKHVzZXJfYnVmLCAodm9pZCAqKXJzcC0+ZGF0YSArIGRlbHRhLCBsZW4pOworCSpwcG9zICs9IHJldDsKKworb3V0OgorCWl3bF9mcmVlX3Jlc3AoJmhjbWQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGl3bF9kYmdmc19tZW1fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCQkJICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpd2xfbXZtICptdm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGl3bF9kYmdfbWVtX2FjY2Vzc19jbWQgKmNtZDsKKwlzdHJ1Y3QgaXdsX2RiZ19tZW1fYWNjZXNzX3JzcCAqcnNwOworCXN0cnVjdCBpd2xfaG9zdF9jbWQgaGNtZCA9IHt9OworCXNpemVfdCBjbWRfc2l6ZTsKKwlzaXplX3QgZGF0YV9zaXplOworCXUzMiBvcCwgbGVuOworCXNzaXplX3QgcmV0OworCisJaGNtZC5pZCA9IGl3bF9jbWRfaWQoKnBwb3MgPj4gMjQgPyBVTUFDX1JEX1dSIDogTE1BQ19SRF9XUiwKKwkJCSAgICAgREVCVUdfR1JPVVAsIDApOworCisJaWYgKCpwcG9zICYgMHgzIHx8IGNvdW50IDwgNCkgeworCQlvcCA9IERFQlVHX01FTV9PUF9XUklURV9CWVRFUzsKKwkJbGVuID0gbWluKGNvdW50LCAoc2l6ZV90KSg0IC0gKCpwcG9zICYgMHgzKSkpOworCQlkYXRhX3NpemUgPSBsZW47CisJfSBlbHNlIHsKKwkJb3AgPSBERUJVR19NRU1fT1BfV1JJVEU7CisJCWxlbiA9IG1pbihjb3VudCA+PiAyLCAoc2l6ZV90KURFQlVHX01FTV9NQVhfU0laRV9EV09SRFMpOworCQlkYXRhX3NpemUgPSBsZW4gPDwgMjsKKwl9CisKKwljbWRfc2l6ZSA9IHNpemVvZigqY21kKSArIEFMSUdOKGRhdGFfc2l6ZSwgNCk7CisJY21kID0ga3phbGxvYyhjbWRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjbWQpCisJCXJldHVybiAtRU5PTUVNOworCisJY21kLT5vcCA9IGNwdV90b19sZTMyKG9wKTsKKwljbWQtPmxlbiA9IGNwdV90b19sZTMyKGxlbik7CisJY21kLT5hZGRyID0gY3B1X3RvX2xlMzIoKnBwb3MpOworCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKWNtZC0+ZGF0YSwgdXNlcl9idWYsIGRhdGFfc2l6ZSkpIHsKKwkJa2ZyZWUoY21kKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaGNtZC5mbGFncyA9IENNRF9XQU5UX1NLQiB8IENNRF9TRU5EX0lOX1JGS0lMTCwKKwloY21kLmRhdGFbMF0gPSAodm9pZCAqKWNtZDsKKwloY21kLmxlblswXSA9IGNtZF9zaXplOworCisJbXV0ZXhfbG9jaygmbXZtLT5tdXRleCk7CisJcmV0ID0gaXdsX212bV9zZW5kX2NtZChtdm0sICZoY21kKTsKKwltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOworCisJa2ZyZWUoY21kKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcnNwID0gKHZvaWQgKiloY21kLnJlc3BfcGt0LT5kYXRhOworCWlmIChyc3AtPnN0YXR1cyAhPSBERUJVR19NRU1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBkYXRhX3NpemU7CisJKnBwb3MgKz0gcmV0OworCitvdXQ6CisJaXdsX2ZyZWVfcmVzcCgmaGNtZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXdsX2RiZ2ZzX21lbV9vcHMgPSB7CisJLnJlYWQgPSBpd2xfZGJnZnNfbWVtX3JlYWQsCisJLndyaXRlID0gaXdsX2RiZ2ZzX21lbV93cml0ZSwKKwkub3BlbiA9IHNpbXBsZV9vcGVuLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKIGludCBpd2xfbXZtX2RiZ2ZzX3JlZ2lzdGVyKHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBkZW50cnkgKmRiZ2ZzX2RpcikKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpiY2FzdF9kaXIgX19tYXliZV91bnVzZWQ7CkBAIC0xNTAyLDYgKzE2ODIsNyBAQAogCU1WTV9ERUJVR0ZTX0FERF9GSUxFKHNlbmRfZWNob19jbWQsIG12bS0+ZGVidWdmc19kaXIsIFNfSVdVU1IpOwogCU1WTV9ERUJVR0ZTX0FERF9GSUxFKGNvbnRfcmVjb3JkaW5nLCBtdm0tPmRlYnVnZnNfZGlyLCBTX0lXVVNSKTsKIAlNVk1fREVCVUdGU19BRERfRklMRShpbmRpcmVjdGlvbl90YmwsIG12bS0+ZGVidWdmc19kaXIsIFNfSVdVU1IpOworCU1WTV9ERUJVR0ZTX0FERF9GSUxFKGluamVjdF9wYWNrZXQsIG12bS0+ZGVidWdmc19kaXIsIFNfSVdVU1IpOwogCWlmICghZGVidWdmc19jcmVhdGVfYm9vbCgiZW5hYmxlX3NjYW5faXRlcmF0aW9uX25vdGlmIiwKIAkJCQkgU19JUlVTUiB8IFNfSVdVU1IsCiAJCQkJIG12bS0+ZGVidWdmc19kaXIsCkBAIC0xNTYwLDYgKzE3NDEsOSBAQAogCQkJCSBtdm0tPmRlYnVnZnNfZGlyLCAmbXZtLT5udm1fcGh5X3NrdV9ibG9iKSkKIAkJZ290byBlcnI7CiAKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJtZW0iLCBTX0lSVVNSIHwgU19JV1VTUiwgZGJnZnNfZGlyLCBtdm0sCisJCQkgICAgJml3bF9kYmdmc19tZW1fb3BzKTsKKwogCS8qCiAJICogQ3JlYXRlIGEgc3ltbGluayB3aXRoIG1hYzgwMjExLiBJdCB3aWxsIGJlIHJlbW92ZWQgd2hlbiBtYWM4MDIxMQogCSAqIGV4aXN0cyAoYmVmb3JlIHRoZSBvcG1vZGUgZXhpc3RzIHdoaWNoIHJlbW92ZXMgdGhlIHRhcmdldC4pCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktcG93ZXIuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS1wb3dlci5oCmluZGV4IDQwNGIwZGUuLjNmYTQzZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS1wb3dlci5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS1wb3dlci5oCkBAIC0zMTMsMzUgKzMxMywyNiBAQAogCUlXTF9UWF9QT1dFUl9NT0RFX1NFVF9BQ0sgPSAzLAogfTsgLyogVFhfUE9XRVJfUkVEVUNFRF9GTEFHU19UWVBFX0FQSV9FX1ZFUl80ICovOwogCisjZGVmaW5lIElXTF9OVU1fQ0hBSU5fTElNSVRTCTIKKyNkZWZpbmUgSVdMX05VTV9TVUJfQkFORFMJNQorCiAvKioKLSAqIHN0cnVjdCBpd2xfZGV2X3R4X3Bvd2VyX2NtZF92MiAtIFRYIHBvd2VyIHJlZHVjdGlvbiBjb21tYW5kCisgKiBzdHJ1Y3QgaXdsX2Rldl90eF9wb3dlcl9jbWQgLSBUWCBwb3dlciByZWR1Y3Rpb24gY29tbWFuZAogICogQHNldF9tb2RlOiBzZWUgJmVudW0gaXdsX2Rldl90eF9wb3dlcl9jbWRfbW9kZQogICogQG1hY19jb250ZXh0X2lkOiBpZCBvZiB0aGUgbWFjIGN0eCBmb3Igd2hpY2ggd2UgYXJlIHJlZHVjaW5nIFRYIHBvd2VyLgogICogQHB3cl9yZXN0cmljdGlvbjogVFggcG93ZXIgcmVzdHJpY3Rpb24gaW4gMS84IGRCbXMuCiAgKiBAZGV2XzI0OiBkZXZpY2UgVFggcG93ZXIgcmVzdHJpY3Rpb24gaW4gMS84IGRCbXMKICAqIEBkZXZfNTJfbG93OiBkZXZpY2UgVFggcG93ZXIgcmVzdHJpY3Rpb24gdXBwZXIgYmFuZCAtIGxvdwogICogQGRldl81Ml9oaWdoOiBkZXZpY2UgVFggcG93ZXIgcmVzdHJpY3Rpb24gdXBwZXIgYmFuZCAtIGhpZ2gKKyAqIEBwZXJfY2hhaW5fcmVzdHJpY3Rpb246IHBlciBjaGFpbiByZXN0cmljdGlvbnMKICAqLwotc3RydWN0IGl3bF9kZXZfdHhfcG93ZXJfY21kX3YyIHsKK3N0cnVjdCBpd2xfZGV2X3R4X3Bvd2VyX2NtZF92MyB7CiAJX19sZTMyIHNldF9tb2RlOwogCV9fbGUzMiBtYWNfY29udGV4dF9pZDsKIAlfX2xlMTYgcHdyX3Jlc3RyaWN0aW9uOwogCV9fbGUxNiBkZXZfMjQ7CiAJX19sZTE2IGRldl81Ml9sb3c7CiAJX19sZTE2IGRldl81Ml9oaWdoOwotfSBfX3BhY2tlZDsgLyogVFhfUkVEVUNFRF9QT1dFUl9BUElfU19WRVJfMiAqLwotCi0jZGVmaW5lIElXTF9OVU1fQ0hBSU5fTElNSVRTCTIKLSNkZWZpbmUgSVdMX05VTV9TVUJfQkFORFMJNQotCi0vKioKLSAqIHN0cnVjdCBpd2xfZGV2X3R4X3Bvd2VyX2NtZCAtIFRYIHBvd2VyIHJlZHVjdGlvbiBjb21tYW5kCi0gKiBAdjI6IHZlcnNpb24gMiBvZiB0aGUgY29tbWFuZCwgZW1iZWRkZWQgaGVyZSBmb3IgZWFzaWVyIHNvZnR3YXJlIGhhbmRsaW5nCi0gKiBAcGVyX2NoYWluX3Jlc3RyaWN0aW9uOiBwZXIgY2hhaW4gcmVzdHJpY3Rpb25zCi0gKi8KLXN0cnVjdCBpd2xfZGV2X3R4X3Bvd2VyX2NtZF92MyB7Ci0JLyogdjMgaXMganVzdCBhbiBleHRlbnNpb24gb2YgdjIgLSBrZWVwIHRoaXMgaGVyZSAqLwotCXN0cnVjdCBpd2xfZGV2X3R4X3Bvd2VyX2NtZF92MiB2MjsKIAlfX2xlMTYgcGVyX2NoYWluX3Jlc3RyaWN0aW9uW0lXTF9OVU1fQ0hBSU5fTElNSVRTXVtJV0xfTlVNX1NVQl9CQU5EU107CiB9IF9fcGFja2VkOyAvKiBUWF9SRURVQ0VEX1BPV0VSX0FQSV9TX1ZFUl8zICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS1zY2FuLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktc2Nhbi5oCmluZGV4IGYwMWRhYjAuLjBjMjk0YzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktc2Nhbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS1zY2FuLmgKQEAgLTcsNiArNyw3IEBACiAgKgogICogQ29weXJpZ2h0KGMpIDIwMTIgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE1IEludGVsIE1vYmlsZSBDb21tdW5pY2F0aW9ucyBHbWJICisgKiBDb3B5cmlnaHQoYykgMjAxNiBJbnRlbCBEZXV0c2NobGFuZCBHbWJICiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCkBAIC02MDMsNiArNjA0LDggQEAKICAqIEB1aWQ6IHNjYW4gaWQsICZlbnVtIGl3bF91bWFjX3NjYW5fdWlkX29mZnNldHMKICAqIEBvb2NfcHJpb3JpdHk6IG91dCBvZiBjaGFubmVsIHByaW9yaXR5IC0gJmVudW0gaXdsX3NjYW5fcHJpb3JpdHkKICAqIEBnZW5lcmFsX2ZsYWdzOiAmZW51bSBpd2xfdW1hY19zY2FuX2dlbmVyYWxfZmxhZ3MKKyAqIEByZXNlcnZlZDI6IGZvciBmdXR1cmUgdXNlIGFuZCBhbGlnbm1lbnQKKyAqIEBzY2FuX3N0YXJ0X21hY19pZDogcmVwb3J0IHRoZSBzY2FuIHN0YXJ0IFRTRiB0aW1lIGFjY29yZGluZyB0byB0aGlzIG1hYyBUU0YKICAqIEBleHRlbmRlZF9kd2VsbDogZHdlbGwgdGltZSBmb3IgY2hhbm5lbHMgMSwgNiBhbmQgMTEKICAqIEBhY3RpdmVfZHdlbGw6IGR3ZWxsIHRpbWUgZm9yIGFjdGl2ZSBzY2FuCiAgKiBAcGFzc2l2ZV9kd2VsbDogZHdlbGwgdGltZSBmb3IgcGFzc2l2ZSBzY2FuCkBAIC02MjAsOCArNjIzLDEwIEBACiAJX19sZTMyIGZsYWdzOwogCV9fbGUzMiB1aWQ7CiAJX19sZTMyIG9vY19wcmlvcml0eTsKLQkvKiBTQ0FOX0dFTkVSQUxfUEFSQU1TX0FQSV9TX1ZFUl8xICovCi0JX19sZTMyIGdlbmVyYWxfZmxhZ3M7CisJLyogU0NBTl9HRU5FUkFMX1BBUkFNU19BUElfU19WRVJfNCAqLworCV9fbGUxNiBnZW5lcmFsX2ZsYWdzOworCXU4IHJlc2VydmVkMjsKKwl1OCBzY2FuX3N0YXJ0X21hY19pZDsKIAl1OCBleHRlbmRlZF9kd2VsbDsKIAl1OCBhY3RpdmVfZHdlbGw7CiAJdTggcGFzc2l2ZV9kd2VsbDsKQEAgLTYyOSw3ICs2MzQsNyBAQAogCV9fbGUzMiBtYXhfb3V0X3RpbWU7CiAJX19sZTMyIHN1c3BlbmRfdGltZTsKIAlfX2xlMzIgc2Nhbl9wcmlvcml0eTsKLQkvKiBTQ0FOX0NIQU5ORUxfUEFSQU1TX0FQSV9TX1ZFUl8xICovCisJLyogU0NBTl9DSEFOTkVMX1BBUkFNU19BUElfU19WRVJfNCAqLwogCXU4IGNoYW5uZWxfZmxhZ3M7CiAJdTggbl9jaGFubmVsczsKIAlfX2xlMTYgcmVzZXJ2ZWQ7CkBAIC03MTgsOCArNzIzLDggQEAKICAqIEBzdGF0dXM6IG9uZSBvZiBTQ0FOX0NPTVBfU1RBVFVTXyoKICAqIEBidF9zdGF0dXM6IEJUIG9uL29mZiBzdGF0dXMKICAqIEBsYXN0X2NoYW5uZWw6IGxhc3QgY2hhbm5lbCB0aGF0IHdhcyBzY2FubmVkCi0gKiBAdHNmX2xvdzogVFNGIHRpbWVyIChsb3dlciBoYWxmKSBpbiB1c2VjcwotICogQHRzZl9oaWdoOiBUU0YgdGltZXIgKGhpZ2hlciBoYWxmKSBpbiB1c2VjcworICogQHN0YXJ0X3RzZjogVFNGIHRpbWVyIGluIHVzZWNzIG9mIHRoZSBzY2FuIHN0YXJ0IHRpbWUgZm9yIHRoZSBtYWMgc3BlY2lmaWVkCisgKglpbiAmc3RydWN0IGl3bF9zY2FuX3JlcV91bWFjLgogICogQHJlc3VsdHM6IGFycmF5IG9mIHNjYW4gcmVzdWx0cywgb25seSAic2Nhbm5lZF9jaGFubmVscyIgb2YgdGhlbSBhcmUgdmFsaWQKICAqLwogc3RydWN0IGl3bF91bWFjX3NjYW5faXRlcl9jb21wbGV0ZV9ub3RpZiB7CkBAIC03MjgsOSArNzMzLDggQEAKIAl1OCBzdGF0dXM7CiAJdTggYnRfc3RhdHVzOwogCXU4IGxhc3RfY2hhbm5lbDsKLQlfX2xlMzIgdHNmX2xvdzsKLQlfX2xlMzIgdHNmX2hpZ2g7CisJX19sZTY0IHN0YXJ0X3RzZjsKIAlzdHJ1Y3QgaXdsX3NjYW5fcmVzdWx0c19ub3RpZiByZXN1bHRzW107Ci19IF9fcGFja2VkOyAvKiBTQ0FOX0lURVJfQ09NUExFVEVfTlRGX1VNQUNfQVBJX1NfVkVSXzEgKi8KK30gX19wYWNrZWQ7IC8qIFNDQU5fSVRFUl9DT01QTEVURV9OVEZfVU1BQ19BUElfU19WRVJfMiAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS1zdGEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS1zdGEuaAppbmRleCBkMWM0ZmI4Li42YzhlM2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktc3RhLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZnctYXBpLXN0YS5oCkBAIC00MzMsMjUgKzQzMyw0MiBAQAogfSBfX3BhY2tlZDsgLyogUkVNT1ZFX1NUQV9DTURfQVBJX1NfVkVSXzIgKi8KIAogLyoqCisgKiBzdHJ1Y3QgaXdsX212bV9tZ210X21jYXN0X2tleV9jbWRfdjEKKyAqICggTUdNVF9NQ0FTVF9LRVkgPSAweDFmICkKKyAqIEBjdHJsX2ZsYWdzOiAlaXdsX3N0YV9rZXlfZmxhZworICogQGlndGs6CisgKiBAazE6IHVudXNlZAorICogQGsyOiB1bnVzZWQKKyAqIEBzdGFfaWQ6IHN0YXRpb24gSUQgdGhhdCBzdXBwb3J0IElHVEsKKyAqIEBrZXlfaWQ6CisgKiBAcmVjZWl2ZV9zZXFfY250OiBpbml0aWFsIFJTQy9QTiBuZWVkZWQgZm9yIHJlcGxheSBjaGVjaworICovCitzdHJ1Y3QgaXdsX212bV9tZ210X21jYXN0X2tleV9jbWRfdjEgeworCV9fbGUzMiBjdHJsX2ZsYWdzOworCXU4IGlndGtbMTZdOworCXU4IGsxWzE2XTsKKwl1OCBrMlsxNl07CisJX19sZTMyIGtleV9pZDsKKwlfX2xlMzIgc3RhX2lkOworCV9fbGU2NCByZWNlaXZlX3NlcV9jbnQ7Cit9IF9fcGFja2VkOyAvKiBTRUNfTUdNVF9NVUxUSUNBU1RfS0VZX0NNRF9BUElfU19WRVJfMSAqLworCisvKioKICAqIHN0cnVjdCBpd2xfbXZtX21nbXRfbWNhc3Rfa2V5X2NtZAogICogKCBNR01UX01DQVNUX0tFWSA9IDB4MWYgKQogICogQGN0cmxfZmxhZ3M6ICVpd2xfc3RhX2tleV9mbGFnCi0gKiBASUdUSzoKLSAqIEBLMTogdW51c2VkCi0gKiBASzI6IHVudXNlZAorICogQGlndGs6IElHVEsgbWFzdGVyIGtleQogICogQHN0YV9pZDogc3RhdGlvbiBJRCB0aGF0IHN1cHBvcnQgSUdUSwogICogQGtleV9pZDoKICAqIEByZWNlaXZlX3NlcV9jbnQ6IGluaXRpYWwgUlNDL1BOIG5lZWRlZCBmb3IgcmVwbGF5IGNoZWNrCiAgKi8KIHN0cnVjdCBpd2xfbXZtX21nbXRfbWNhc3Rfa2V5X2NtZCB7CiAJX19sZTMyIGN0cmxfZmxhZ3M7Ci0JdTggSUdUS1sxNl07Ci0JdTggSzFbMTZdOwotCXU4IEsyWzE2XTsKKwl1OCBpZ3RrWzMyXTsKIAlfX2xlMzIga2V5X2lkOwogCV9fbGUzMiBzdGFfaWQ7CiAJX19sZTY0IHJlY2VpdmVfc2VxX2NudDsKLX0gX19wYWNrZWQ7IC8qIFNFQ19NR01UX01VTFRJQ0FTVF9LRVlfQ01EX0FQSV9TX1ZFUl8xICovCit9IF9fcGFja2VkOyAvKiBTRUNfTUdNVF9NVUxUSUNBU1RfS0VZX0NNRF9BUElfU19WRVJfMiAqLwogCiBzdHJ1Y3QgaXdsX212bV93ZXBfa2V5IHsKIAl1OCBrZXlfaW5kZXg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktdHguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS10eC5oCmluZGV4IDQxNDQ2MjMuLjU5Y2E5N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS10eC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS10eC5oCkBAIC04OSw3ICs4OSw2IEBACiAgKiBAVFhfQ01EX0ZMR19NSF9QQUQ6IGRyaXZlciBpbnNlcnRlZCAyIGJ5dGUgcGFkZGluZyBhZnRlciBNQUMgaGVhZGVyLgogICoJU2hvdWxkIGJlIHNldCBmb3IgMjYvMzAgbGVuZ3RoIE1BQyBoZWFkZXJzCiAgKiBAVFhfQ01EX0ZMR19SRVNQX1RPX0RSVjogemVybyB0aGlzIGlmIHRoZSByZXNwb25zZSBzaG91bGQgZ28gb25seSB0byBGVwotICogQFRYX0NNRF9GTEdfQ0NNUF9BR0c6IHRoaXMgZnJhbWUgdXNlcyBDQ01QIGZvciBhZ2dyZWdhdGlvbiBhY2NlbGVyYXRpb24KICAqIEBUWF9DTURfRkxHX1RLSVBfTUlDX0RPTkU6IEZXIGFscmVhZHkgcGVyZm9ybWVkIFRLSVAgTUlDIGNhbGN1bGF0aW9uCiAgKiBAVFhfQ01EX0ZMR19EVVI6IGRpc2FibGUgZHVyYXRpb24gb3ZlcndyaXRpbmcgdXNlZCBpbiBQUy1Qb2xsIEFzc29jLWlkCiAgKiBAVFhfQ01EX0ZMR19GV19EUk9QOiBGVyBzaG91bGQgbWFyayBmcmFtZSB0byBiZSBkcm9wcGVkCkBAIC0xMTYsNyArMTE1LDYgQEAKIAlUWF9DTURfRkxHX0tFRVBfU0VRX0NUTAkJPSBCSVQoMTgpLAogCVRYX0NNRF9GTEdfTUhfUEFECQk9IEJJVCgyMCksCiAJVFhfQ01EX0ZMR19SRVNQX1RPX0RSVgkJPSBCSVQoMjEpLAotCVRYX0NNRF9GTEdfQ0NNUF9BR0cJCT0gQklUKDIyKSwKIAlUWF9DTURfRkxHX1RLSVBfTUlDX0RPTkUJPSBCSVQoMjMpLAogCVRYX0NNRF9GTEdfRFVSCQkJPSBCSVQoMjUpLAogCVRYX0NNRF9GTEdfRldfRFJPUAkJPSBCSVQoMjYpLApAQCAtMTQ5LDcgKzE0Nyw3IEBACiAgKiBAVFhfQ01EX1NFQ19FWFQ6IGV4dGVuZGVkIGNpcGhlciBhbGdvcml0aG0uCiAgKiBAVFhfQ01EX1NFQ19HQ01QOiBHQ01QIGVuY3J5cHRpb24gYWxnb3JpdGhtLgogICogQFRYX0NNRF9TRUNfS0VZMTI4OiBzZXQgZm9yIDEwNCBiaXRzIFdFUCBrZXkuCi0gKiBAVENfQ01EX1NFQ19LRVlfRlJPTV9UQUJMRTogZm9yIGEgbm9uLVdFUCBrZXksIHNldCBpZiB0aGUga2V5IHNob3VsZCBiZSB0YWtlbgorICogQFRYX0NNRF9TRUNfS0VZX0ZST01fVEFCTEU6IGZvciBhIG5vbi1XRVAga2V5LCBzZXQgaWYgdGhlIGtleSBzaG91bGQgYmUgdGFrZW4KICAqCWZyb20gdGhlIHRhYmxlIGluc3RlYWQgb2YgZnJvbSB0aGUgVFggY29tbWFuZC4KICAqCUlmIHRoZSBrZXkgaXMgdGFrZW4gZnJvbSB0aGUga2V5IHRhYmxlIGl0cyBpbmRleCBzaG91bGQgYmUgZ2l2ZW4gYnkgdGhlCiAgKglmaXJzdCBieXRlIG9mIHRoZSBUWCBjb21tYW5kIGtleSBmaWVsZC4KQEAgLTE2MSw3ICsxNTksNyBAQAogCVRYX0NNRF9TRUNfRVhUCQkJPSAweDA0LAogCVRYX0NNRF9TRUNfR0NNUAkJCT0gMHgwNSwKIAlUWF9DTURfU0VDX0tFWTEyOAkJPSAweDA4LAotCVRDX0NNRF9TRUNfS0VZX0ZST01fVEFCTEUJPSAweDA4LAorCVRYX0NNRF9TRUNfS0VZX0ZST01fVEFCTEUJPSAweDA4LAogfTsKIAogLyogVE9ETzogaG93IGRvZXMgdGhlc2UgdmFsdWVzIGFyZSBPSyB3aXRoIG9ubHkgMTYgYml0IHZhcmlhYmxlPz8/ICovCkBAIC01NzgsNiArNTc2LDg1IEBACiB9IF9fcGFja2VkOwogCiAvKioKKyAqIHN0cnVjdCBpd2xfbXZtX2NvbXByZXNzZWRfYmFfdGZkIC0gcHJvZ3Jlc3Mgb2YgYSBURkQgcXVldWUKKyAqIEBxX251bTogVEZEIHF1ZXVlIG51bWJlcgorICogQHRmZF9pbmRleDogSW5kZXggb2YgZmlyc3QgdW4tYWNrZWQgZnJhbWUgaW4gdGhlICBURkQgcXVldWUKKyAqLworc3RydWN0IGl3bF9tdm1fY29tcHJlc3NlZF9iYV90ZmQgeworCXU4IHFfbnVtOworCXU4IHJlc2VydmVkOworCV9fbGUxNiB0ZmRfaW5kZXg7Cit9IF9fcGFja2VkOyAvKiBDT01QUkVTU0VEX0JBX1RGRF9BUElfU19WRVJfMSAqLworCisvKioKKyAqIHN0cnVjdCBpd2xfbXZtX2NvbXByZXNzZWRfYmFfcmF0aWQgLSBwcm9ncmVzcyBvZiBhIFJBIFRJRCBxdWV1ZQorICogQHFfbnVtOiBSQSBUSUQgcXVldWUgbnVtYmVyCisgKiBAdGlkOiBUSUQgb2YgdGhlIHF1ZXVlCisgKiBAc3NuOiBCQSB3aW5kb3cgY3VycmVudCBTU04KKyAqLworc3RydWN0IGl3bF9tdm1fY29tcHJlc3NlZF9iYV9yYXRpZCB7CisJdTggcV9udW07CisJdTggdGlkOworCV9fbGUxNiBzc247Cit9IF9fcGFja2VkOyAvKiBDT01QUkVTU0VEX0JBX1JBVElEX0FQSV9TX1ZFUl8xICovCisKKy8qCisgKiBlbnVtIGl3bF9tdm1fYmFfcmVzcF9mbGFncyAtIFRYIGFnZ3JlZ2F0aW9uIHN0YXR1cworICogQElXTF9NVk1fQkFfUkVTUF9UWF9BR0c6IGdlbmVyYXRlZCBkdWUgdG8gQkEKKyAqIEBJV0xfTVZNX0JBX1JFU1BfVFhfQkFSOiBnZW5lcmF0ZWQgZHVlIHRvIEJBIGFmdGVyIEJBUgorICogQElXTF9NVk1fQkFfUkVTUF9UWF9BR0dfRkFJTDogYWdncmVnYXRpb24gZGlkbid0IHJlY2VpdmUgQkEKKyAqIEBJV0xfTVZNX0JBX1JFU1BfVFhfVU5ERVJSVU46IGFnZ3JlZ2F0aW9uIGdvdCB1bmRlcnJ1bgorICogQElXTF9NVk1fQkFfUkVTUF9UWF9CVF9LSUxMOiBhZ2dyZWdhdGlvbiBnb3QgQlQta2lsbAorICogQElXTF9NVk1fQkFfUkVTUF9UWF9EU1BfVElNRU9VVDogYWdncmVnYXRpb24gZGlkbid0IGZpbmlzaCB3aXRoaW4gdGhlCisgKglleHBlY3RlZCB0aW1lCisgKi8KK2VudW0gaXdsX212bV9iYV9yZXNwX2ZsYWdzIHsKKwlJV0xfTVZNX0JBX1JFU1BfVFhfQUdHLAorCUlXTF9NVk1fQkFfUkVTUF9UWF9CQVIsCisJSVdMX01WTV9CQV9SRVNQX1RYX0FHR19GQUlMLAorCUlXTF9NVk1fQkFfUkVTUF9UWF9VTkRFUlJVTiwKKwlJV0xfTVZNX0JBX1JFU1BfVFhfQlRfS0lMTCwKKwlJV0xfTVZNX0JBX1JFU1BfVFhfRFNQX1RJTUVPVVQKK307CisKKy8qKgorICogc3RydWN0IGl3bF9tdm1fY29tcHJlc3NlZF9iYV9ub3RpZiAtIG5vdGlmaWVzIGFib3V0IHJlY2VwdGlvbiBvZiBCQQorICogKCBCQV9OT1RJRiA9IDB4YzUgKQorICogQGZsYWdzOiBzdGF0dXMgZmxhZywgc2VlIHRoZSAmaXdsX212bV9iYV9yZXNwX2ZsYWdzCisgKiBAc3RhX2lkOiBJbmRleCBvZiByZWNpcGllbnQgKEJBLXNlbmRpbmcpIHN0YXRpb24gaW4gZncncyBzdGF0aW9uIHRhYmxlCisgKiBAcmVkdWNlZF90eHA6IHBvd2VyIHJlZHVjZWQgYWNjb3JkaW5nIHRvIFRQQy4gVGhpcyBpcyB0aGUgYWN0dWFsIHZhbHVlIGFuZAorICoJbm90IGEgY29weSBmcm9tIHRoZSBMUSBjb21tYW5kLiBUaHVzLCBpZiBub3QgdGhlIGZpcnN0IHJhdGUgd2FzIHVzZWQKKyAqCWZvciBUeC1pbmcgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgc2V0IHRvIDAgYnkgRlcuCisgKiBAaW5pdGlhbF9yYXRlOiBUTEMgcmF0ZSBpbmZvLCBpbml0aWFsIHJhdGUgaW5kZXgsIFRMQyB0YWJsZSBjb2xvcgorICogQHJldHJ5X2NudDogcmV0cnkgY291bnQKKyAqIEBxdWVyeV9ieXRlX2NudDogU0NEIHF1ZXJ5IGJ5dGUgY291bnQKKyAqIEBxdWVyeV9mcmFtZV9jbnQ6IFNDRCBxdWVyeSBmcmFtZSBjb3VudAorICogQHR4ZWQ6IG51bWJlciBvZiBmcmFtZXMgc2VudCBpbiB0aGUgYWdncmVnYXRpb24gKGFsbC1USURzKQorICogQGRvbmU6IG51bWJlciBvZiBmcmFtZXMgdGhhdCB3ZXJlIEFja2VkIGJ5IHRoZSBCQSAoYWxsLVRJRHMpCisgKiBAd2lyZWxlc3NfdGltZTogV2lyZWxlc3MtbWVkaWEgdGltZQorICogQHR4X3JhdGU6IHRoZSByYXRlIHRoZSBhZ2dyZWdhdGlvbiB3YXMgc2VudCBhdAorICogQHRmZF9jbnQ6IG51bWJlciBvZiBURkQtUSBlbGVtZW50cworICogQHJhX3RpZF9jbnQ6IG51bWJlciBvZiBSQVRJRC1RIGVsZW1lbnRzCisgKi8KK3N0cnVjdCBpd2xfbXZtX2NvbXByZXNzZWRfYmFfbm90aWYgeworCV9fbGUzMiBmbGFnczsKKwl1OCBzdGFfaWQ7CisJdTggcmVkdWNlZF90eHA7CisJdTggaW5pdGlhbF9yYXRlOworCXU4IHJldHJ5X2NudDsKKwlfX2xlMzIgcXVlcnlfYnl0ZV9jbnQ7CisJX19sZTE2IHF1ZXJ5X2ZyYW1lX2NudDsKKwlfX2xlMTYgdHhlZDsKKwlfX2xlMTYgZG9uZTsKKwlfX2xlMzIgd2lyZWxlc3NfdGltZTsKKwlfX2xlMzIgdHhfcmF0ZTsKKwlfX2xlMTYgdGZkX2NudDsKKwlfX2xlMTYgcmFfdGlkX2NudDsKKwlzdHJ1Y3QgaXdsX212bV9jb21wcmVzc2VkX2JhX3RmZCB0ZmRbMV07CisJc3RydWN0IGl3bF9tdm1fY29tcHJlc3NlZF9iYV9yYXRpZCByYV90aWRbMF07Cit9IF9fcGFja2VkOyAvKiBDT01QUkVTU0VEX0JBX1JFU19BUElfU19WRVJfNCAqLworCisvKioKICAqIHN0cnVjdCBpd2xfbWFjX2JlYWNvbl9jbWRfdjYgLSBiZWFjb24gdGVtcGxhdGUgY29tbWFuZAogICogQHR4OiB0aGUgdHggY29tbWFuZHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZWFjb24gZnJhbWUKICAqIEB0ZW1wbGF0ZV9pZDogY3VycmVudGx5IGVxdWFsIHRvIHRoZSBtYWMgY29udGV4dCBpZCBvZiB0aGUgY29yZXNwb25kaW5nCkBAIC02NzUsMTMgKzc1MiwyMSBAQAogCQkJICAgIHR4X3Jlc3AtPmZyYW1lX2NvdW50KSAmIDB4ZmZmOwogfQogCisvKiBBdmFpbGFibGUgb3B0aW9ucyBmb3IgdGhlIFNDRF9RVUVVRV9DRkcgSENNRCAqLworZW51bSBpd2xfc2NkX2NmZ19hY3Rpb25zIHsKKwlTQ0RfQ0ZHX0RJU0FCTEVfUVVFVUUJCT0gMHgwLAorCVNDRF9DRkdfRU5BQkxFX1FVRVVFCQk9IDB4MSwKKwlTQ0RfQ0ZHX1VQREFURV9RVUVVRV9USUQJPSAweDIsCit9OworCiAvKioKICAqIHN0cnVjdCBpd2xfc2NkX3R4cV9jZmdfY21kIC0gTmV3IHR4cSBodyBzY2hlZHVsZXIgY29uZmlnIGNvbW1hbmQKICAqIEB0b2tlbjoKICAqIEBzdGFfaWQ6IHN0YXRpb24gaWQKICAqIEB0aWQ6CiAgKiBAc2NkX3F1ZXVlOiBzY2hlZHVsZXIgcXVldWUgdG8gY29uZml1ZwotICogQGVuYWJsZTogMSBxdWV1ZSBlbmFibGUsIDAgcXVldWUgZGlzYWJsZQorICogQGFjdGlvbjogMSBxdWV1ZSBlbmFibGUsIDAgcXVldWUgZGlzYWJsZSwgMiBjaGFuZ2UgdHhxJ3MgdGlkIG93bmVyCisgKglWYWx1ZSBpcyBvbmUgb2YgJWl3bF9zY2RfY2ZnX2FjdGlvbnMgb3B0aW9ucwogICogQGFnZ3JlZ2F0ZTogMSBhZ2dyZWdhdGVkIHF1ZXVlLCAwIG90aGVyd2lzZQogICogQHR4X2ZpZm86ICVlbnVtIGl3bF9tdm1fdHhfZmlmbwogICogQHdpbmRvdzogQkEgd2luZG93IHNpemUKQEAgLTY5Miw3ICs3NzcsNyBAQAogCXU4IHN0YV9pZDsKIAl1OCB0aWQ7CiAJdTggc2NkX3F1ZXVlOwotCXU4IGVuYWJsZTsKKwl1OCBhY3Rpb247CiAJdTggYWdncmVnYXRlOwogCXU4IHR4X2ZpZm87CiAJdTggd2luZG93OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZnctYXBpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGkuaAppbmRleCA3MTA3NmYwLi45NzYzMzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGkuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGkuaApAQCAtMjA1LDcgKzIwNSw3IEBACiAJLyogUGh5ICovCiAJUEhZX0NPTkZJR1VSQVRJT05fQ01EID0gMHg2YSwKIAlDQUxJQl9SRVNfTk9USUZfUEhZX0RCID0gMHg2YiwKLQkvKiBQSFlfREJfQ01EID0gMHg2YywgKi8KKwlQSFlfREJfQ01EID0gMHg2YywKIAogCS8qIFRvRiAtIDgwMi4xMW1jIEZUTSAqLwogCVRPRl9DTUQgPSAweDEwLApAQCAtMzQwLDYgKzM0MCwxMSBAQAogCVNUT1JFRF9CRUFDT05fTlRGID0gMHhGRiwKIH07CiAKK2VudW0gaXdsX2ZtYWNfZGVidWdfY21kcyB7CisJTE1BQ19SRF9XUiA9IDB4MCwKKwlVTUFDX1JEX1dSID0gMHgxLAorfTsKKwogLyogY29tbWFuZCBncm91cHMgKi8KIGVudW0gewogCUxFR0FDWV9HUk9VUCA9IDB4MCwKQEAgLTM0OSw2ICszNTQsNyBAQAogCVBIWV9PUFNfR1JPVVAgPSAweDQsCiAJREFUQV9QQVRIX0dST1VQID0gMHg1LAogCVBST1RfT0ZGTE9BRF9HUk9VUCA9IDB4YiwKKwlERUJVR19HUk9VUCA9IDB4ZiwKIH07CiAKIC8qKgpAQCAtNDgyLDEzICs0ODgsMTcgQEAKICAqIEBibG9ja19zaXplOiB0aGUgYmxvY2sgc2l6ZSBpbiBwb3dlcnMgb2YgMgogICogQGJsb2NrX251bTogbnVtYmVyIG9mIGJsb2NrcyBzcGVjaWZpZWQgaW4gdGhlIGNvbW1hbmQuCiAgKiBAZGV2aWNlX3BoeV9hZGRyOiB2aXJ0dWFsIGFkZHJlc3NlcyBmcm9tIGRldmljZSBzaWRlCisgKgkzMiBiaXQgYWRkcmVzcyBmb3IgQVBJIHZlcnNpb24gMSwgNjQgYml0IGFkZHJlc3MgZm9yIEFQSSB2ZXJzaW9uIDIuCiAqLwogc3RydWN0IGl3bF9md19wYWdpbmdfY21kIHsKIAlfX2xlMzIgZmxhZ3M7CiAJX19sZTMyIGJsb2NrX3NpemU7CiAJX19sZTMyIGJsb2NrX251bTsKLQlfX2xlMzIgZGV2aWNlX3BoeV9hZGRyW05VTV9PRl9GV19QQUdJTkdfQkxPQ0tTXTsKLX0gX19wYWNrZWQ7IC8qIEZXX1BBR0lOR19CTE9DS19DTURfQVBJX1NfVkVSXzEgKi8KKwl1bmlvbiB7CisJCV9fbGUzMiBhZGRyMzJbTlVNX09GX0ZXX1BBR0lOR19CTE9DS1NdOworCQlfX2xlNjQgYWRkcjY0W05VTV9PRl9GV19QQUdJTkdfQkxPQ0tTXTsKKwl9IGRldmljZV9waHlfYWRkcjsKK30gX19wYWNrZWQ7IC8qIEZXX1BBR0lOR19CTE9DS19DTURfQVBJX1NfVkVSXzIgKi8KIAogLyoKICAqIEZ3IGl0ZW1zIElEJ3MKQEAgLTE5NzMsOCArMTk4Myw5IEBACiAJc3RydWN0IGl3bF90ZGxzX2NvbmZpZ19zdGFfaW5mb19yZXMgc3RhX2luZm9bSVdMX01WTV9URExTX1NUQV9DT1VOVF07CiB9IF9fcGFja2VkOyAvKiBURExTX0NPTkZJR19SU1BfQVBJX1NfVkVSXzEgKi8KIAotI2RlZmluZSBUWF9GSUZPX01BWF9OVU0JCTgKLSNkZWZpbmUgUlhfRklGT19NQVhfTlVNCQkyCisjZGVmaW5lIFRYX0ZJRk9fTUFYX05VTV85MDAwCQk4CisjZGVmaW5lIFRYX0ZJRk9fTUFYX05VTQkJCTE1CisjZGVmaW5lIFJYX0ZJRk9fTUFYX05VTQkJCTIKICNkZWZpbmUgVFhfRklGT19JTlRFUk5BTF9NQVhfTlVNCTYKIAogLyoqCkBAIC0yMDAwLDYgKzIwMTEsMjEgQEAKICAqIE5PVEU6IG9uIGZpcm13YXJlIHRoYXQgZG9uJ3QgaGF2ZSBJV0xfVUNPREVfVExWX0NBUEFfRVhURU5EX1NIQVJFRF9NRU1fQ0ZHCiAgKgkgc2V0LCB0aGUgbGFzdCAzIG1lbWJlcnMgZG9uJ3QgZXhpc3QuCiAgKi8KK3N0cnVjdCBpd2xfc2hhcmVkX21lbV9jZmdfdjEgeworCV9fbGUzMiBzaGFyZWRfbWVtX2FkZHI7CisJX19sZTMyIHNoYXJlZF9tZW1fc2l6ZTsKKwlfX2xlMzIgc2FtcGxlX2J1ZmZfYWRkcjsKKwlfX2xlMzIgc2FtcGxlX2J1ZmZfc2l6ZTsKKwlfX2xlMzIgdHhmaWZvX2FkZHI7CisJX19sZTMyIHR4Zmlmb19zaXplW1RYX0ZJRk9fTUFYX05VTV85MDAwXTsKKwlfX2xlMzIgcnhmaWZvX3NpemVbUlhfRklGT19NQVhfTlVNXTsKKwlfX2xlMzIgcGFnZV9idWZmX2FkZHI7CisJX19sZTMyIHBhZ2VfYnVmZl9zaXplOworCV9fbGUzMiByeGZpZm9fYWRkcjsKKwlfX2xlMzIgaW50ZXJuYWxfdHhmaWZvX2FkZHI7CisJX19sZTMyIGludGVybmFsX3R4Zmlmb19zaXplW1RYX0ZJRk9fSU5URVJOQUxfTUFYX05VTV07Cit9IF9fcGFja2VkOyAvKiBTSEFSRURfTUVNX0FMTE9DX0FQSV9TX1ZFUl8yICovCisKIHN0cnVjdCBpd2xfc2hhcmVkX21lbV9jZmcgewogCV9fbGUzMiBzaGFyZWRfbWVtX2FkZHI7CiAJX19sZTMyIHNoYXJlZF9tZW1fc2l6ZTsKQEAgLTIwMTMsNyArMjAzOSw3IEBACiAJX19sZTMyIHJ4Zmlmb19hZGRyOwogCV9fbGUzMiBpbnRlcm5hbF90eGZpZm9fYWRkcjsKIAlfX2xlMzIgaW50ZXJuYWxfdHhmaWZvX3NpemVbVFhfRklGT19JTlRFUk5BTF9NQVhfTlVNXTsKLX0gX19wYWNrZWQ7IC8qIFNIQVJFRF9NRU1fQUxMT0NfQVBJX1NfVkVSXzIgKi8KK30gX19wYWNrZWQ7IC8qIFNIQVJFRF9NRU1fQUxMT0NfQVBJX1NfVkVSXzMgKi8KIAogLyoqCiAgKiBWSFQgTVUtTUlNTyBncm91cCBjb25maWd1cmF0aW9uCkBAIC0yMTI5LDQgKzIxNTUsNDggQEAKIAlfX2xlMzIgaWRfYW5kX2NvbG9yOwogfSBfX3BhY2tlZDsgLyogQ0hBTk5FTF9TV0lUQ0hfU1RBUlRfTlRGWV9BUElfU19WRVJfMSAqLwogCisvKiBPcGVyYXRpb24gdHlwZXMgZm9yIHRoZSBkZWJ1ZyBtZW0gYWNjZXNzICovCitlbnVtIHsKKwlERUJVR19NRU1fT1BfUkVBRCA9IDAsCisJREVCVUdfTUVNX09QX1dSSVRFID0gMSwKKwlERUJVR19NRU1fT1BfV1JJVEVfQllURVMgPSAyLAorfTsKKworI2RlZmluZSBERUJVR19NRU1fTUFYX1NJWkVfRFdPUkRTIDMyCisKKy8qKgorICogc3RydWN0IGl3bF9kYmdfbWVtX2FjY2Vzc19jbWQgLSBSZXF1ZXN0IHRoZSBkZXZpY2UgdG8gcmVhZC93cml0ZSBtZW1vcnkKKyAqIEBvcDogREVCVUdfTUVNX09QXyoKKyAqIEBhZGRyOiBhZGRyZXNzIHRvIHJlYWQvd3JpdGUgZnJvbS90bworICogQGxlbjogaW4gZHdvcmRzLCB0byByZWFkL3dyaXRlCisgKiBAZGF0YTogZm9yIHdyaXRlIG9wZWF0aW9ucywgY29udGFpbnMgdGhlIHNvdXJjZSBidWZmZXIKKyAqLworc3RydWN0IGl3bF9kYmdfbWVtX2FjY2Vzc19jbWQgeworCV9fbGUzMiBvcDsKKwlfX2xlMzIgYWRkcjsKKwlfX2xlMzIgbGVuOworCV9fbGUzMiBkYXRhW107Cit9IF9fcGFja2VkOyAvKiBERUJVR18oVXxMKU1BQ19SRF9XUl9DTURfQVBJX1NfVkVSXzEgKi8KKworLyogU3RhdHVzIHJlc3BvbnNlcyBmb3IgdGhlIGRlYnVnIG1lbSBhY2Nlc3MgKi8KK2VudW0geworCURFQlVHX01FTV9TVEFUVVNfU1VDQ0VTUyA9IDB4MCwKKwlERUJVR19NRU1fU1RBVFVTX0ZBSUxFRCA9IDB4MSwKKwlERUJVR19NRU1fU1RBVFVTX0xPQ0tFRCA9IDB4MiwKKwlERUJVR19NRU1fU1RBVFVTX0hJRERFTiA9IDB4MywKKwlERUJVR19NRU1fU1RBVFVTX0xFTkdUSCA9IDB4NCwKK307CisKKy8qKgorICogc3RydWN0IGl3bF9kYmdfbWVtX2FjY2Vzc19yc3AgLSBSZXNwb25zZSB0byBkZWJ1ZyBtZW0gY29tbWFuZHMKKyAqIEBzdGF0dXM6IERFQlVHX01FTV9TVEFUVVNfKgorICogQGxlbjogcmVhZCBkd29yZHMgKDAgZm9yIHdyaXRlIG9wZXJhdGlvbnMpCisgKiBAZGF0YTogY29udGFpbnMgdGhlIHJlYWQgRFdzCisgKi8KK3N0cnVjdCBpd2xfZGJnX21lbV9hY2Nlc3NfcnNwIHsKKwlfX2xlMzIgc3RhdHVzOworCV9fbGUzMiBsZW47CisJX19sZTMyIGRhdGFbXTsKK30gX19wYWNrZWQ7IC8qIERFQlVHXyhVfEwpTUFDX1JEX1dSX1JTUF9BUElfU19WRVJfMSAqLworCiAjZW5kaWYgLyogX19md19hcGlfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1kYmcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWRiZy5jCmluZGV4IDFhYmNhYmIuLmQ4OWQwYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWRiZy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWRiZy5jCkBAIC00NDAsMTQgKzQ0MCwxMiBAQAogCXsgLnN0YXJ0ID0gMHgwMGEwNDU2MCwgLmVuZCA9IDB4MDBhMDQ1N2MgfSwKIAl7IC5zdGFydCA9IDB4MDBhMDQ1OTAsIC5lbmQgPSAweDAwYTA0NTk4IH0sCiAJeyAuc3RhcnQgPSAweDAwYTA0NWMwLCAuZW5kID0gMHgwMGEwNDVmNCB9LAotCXsgLnN0YXJ0ID0gMHgwMGE0NDAwMCwgLmVuZCA9IDB4MDBhN2JmODAgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdsX3BycGhfcmFuZ2UgaXdsX3BycGhfZHVtcF9hZGRyXzkwMDBbXSA9IHsKIAl7IC5zdGFydCA9IDB4MDBhMDVjMDAsIC5lbmQgPSAweDAwYTA1YzE4IH0sCiAJeyAuc3RhcnQgPSAweDAwYTA1NDAwLCAuZW5kID0gMHgwMGEwNTZlOCB9LAogCXsgLnN0YXJ0ID0gMHgwMGEwODAwMCwgLmVuZCA9IDB4MDBhMDk4YmMgfSwKLQl7IC5zdGFydCA9IDB4MDBhZGZjMDAsIC5lbmQgPSAweDAwYWRmZDFjIH0sCiAJeyAuc3RhcnQgPSAweDAwYTAyNDAwLCAuZW5kID0gMHgwMGEwMjc1OCB9LAogfTsKIApAQCAtNTU5LDcgKzU1Nyw3IEBACiAJCQkJCSBzaXplb2Yoc3RydWN0IGl3bF9md19lcnJvcl9kdW1wX2ZpZm8pOwogCQl9CiAKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWVtX2NmZy0+dHhmaWZvX3NpemUpOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IG1lbV9jZmctPm51bV90eGZpZm9fZW50cmllczsgaSsrKSB7CiAJCQlpZiAoIW1lbV9jZmctPnR4Zmlmb19zaXplW2ldKQogCQkJCWNvbnRpbnVlOwogCkBAIC05NjAsNSArOTU4LDYgQEAKIAl9CiAKIAltdm0tPmZ3X2RiZ19jb25mID0gY29uZl9pZDsKLQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1kYmcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWRiZy5oCmluZGV4IGY3ZGZmNzYuLmU5ZjFiZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWRiZy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWRiZy5oCkBAIC0xMDUsNyArMTA1LDggQEAKIHsKIAl1MzIgdHJpZ192aWYgPSBsZTMyX3RvX2NwdSh0cmlnLT52aWZfdHlwZSk7CiAKLQlyZXR1cm4gdHJpZ192aWYgPT0gSVdMX0ZXX0RCR19DT05GX1ZJRl9BTlkgfHwgdmlmLT50eXBlID09IHRyaWdfdmlmOworCXJldHVybiB0cmlnX3ZpZiA9PSBJV0xfRldfREJHX0NPTkZfVklGX0FOWSB8fAorCSAgICAgICBpZWVlODAyMTFfdmlmX3R5cGVfcDJwKHZpZikgPT0gdHJpZ192aWY7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LmMKaW5kZXggN2UwY2RiZi4uODcyMDY2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZncuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy5jCkBAIC05MCwxNSArOTAsNiBAQAogCXUzMiBzY2RfYmFzZV9hZGRyOwogfTsKIAotc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgZndfaW1nICoKLWl3bF9nZXRfdWNvZGVfaW1hZ2Uoc3RydWN0IGl3bF9tdm0gKm12bSwgZW51bSBpd2xfdWNvZGVfdHlwZSB1Y29kZV90eXBlKQotewotCWlmICh1Y29kZV90eXBlID49IElXTF9VQ09ERV9UWVBFX01BWCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gJm12bS0+ZnctPmltZ1t1Y29kZV90eXBlXTsKLX0KLQogc3RhdGljIGludCBpd2xfc2VuZF90eF9hbnRfY2ZnKHN0cnVjdCBpd2xfbXZtICptdm0sIHU4IHZhbGlkX3R4X2FudCkKIHsKIAlzdHJ1Y3QgaXdsX3R4X2FudF9jZmdfY21kIHR4X2FudF9jbWQgPSB7CkBAIC0zODUsOSArMzc2LDcgQEAKIC8qIHNlbmQgcGFnaW5nIGNtZCB0byBGVyBpbiBjYXNlIENQVTIgaGFzIHBhZ2luZyBpbWFnZSAqLwogc3RhdGljIGludCBpd2xfc2VuZF9wYWdpbmdfY21kKHN0cnVjdCBpd2xfbXZtICptdm0sIGNvbnN0IHN0cnVjdCBmd19pbWcgKmZ3KQogewotCWludCBibGtfaWR4OwotCV9fbGUzMiBkZXZfcGh5X2FkZHI7Ci0Jc3RydWN0IGl3bF9md19wYWdpbmdfY21kIGZ3X3BhZ2luZ19jbWQgPSB7CisJc3RydWN0IGl3bF9md19wYWdpbmdfY21kIHBhZ2luZ19jbWQgPSB7CiAJCS5mbGFncyA9CiAJCQljcHVfdG9fbGUzMihQQUdJTkdfQ01EX0lTX1NFQ1VSRUQgfAogCQkJCSAgICBQQUdJTkdfQ01EX0lTX0VOQUJMRUQgfApAQCAtMzk2LDE4ICszODUsMzIgQEAKIAkJLmJsb2NrX3NpemUgPSBjcHVfdG9fbGUzMihCTE9DS18yX0VYUF9TSVpFKSwKIAkJLmJsb2NrX251bSA9IGNwdV90b19sZTMyKG12bS0+bnVtX29mX3BhZ2luZ19ibGspLAogCX07CisJaW50IGJsa19pZHgsIHNpemUgPSBzaXplb2YocGFnaW5nX2NtZCk7CisKKwkvKiBBIGJpdCBoYXJkIGNvZGVkIC0gYnV0IHRoaXMgaXMgdGhlIG9sZCBBUEkgYW5kIHdpbGwgYmUgZGVwcmVjYXRlZCAqLworCWlmICghaXdsX212bV9oYXNfbmV3X3R4X2FwaShtdm0pKQorCQlzaXplIC09IE5VTV9PRl9GV19QQUdJTkdfQkxPQ0tTICogNDsKIAogCS8qIGxvb3AgZm9yIGZvciBhbGwgcGFnaW5nIGJsb2NrcyArIENTUyBibG9jayAqLwogCWZvciAoYmxrX2lkeCA9IDA7IGJsa19pZHggPCBtdm0tPm51bV9vZl9wYWdpbmdfYmxrICsgMTsgYmxrX2lkeCsrKSB7Ci0JCWRldl9waHlfYWRkciA9Ci0JCQljcHVfdG9fbGUzMihtdm0tPmZ3X3BhZ2luZ19kYltibGtfaWR4XS5md19wYWdpbmdfcGh5cyA+PgotCQkJCSAgICBQQUdFXzJfRVhQX1NJWkUpOwotCQlmd19wYWdpbmdfY21kLmRldmljZV9waHlfYWRkcltibGtfaWR4XSA9IGRldl9waHlfYWRkcjsKKwkJZG1hX2FkZHJfdCBhZGRyID0gbXZtLT5md19wYWdpbmdfZGJbYmxrX2lkeF0uZndfcGFnaW5nX3BoeXM7CisKKwkJYWRkciA9IGFkZHIgPj4gUEFHRV8yX0VYUF9TSVpFOworCisJCWlmIChpd2xfbXZtX2hhc19uZXdfdHhfYXBpKG12bSkpIHsKKwkJCV9fbGU2NCBwaHlfYWRkciA9IGNwdV90b19sZTY0KGFkZHIpOworCisJCQlwYWdpbmdfY21kLmRldmljZV9waHlfYWRkci5hZGRyNjRbYmxrX2lkeF0gPSBwaHlfYWRkcjsKKwkJfSBlbHNlIHsKKwkJCV9fbGUzMiBwaHlfYWRkciA9IGNwdV90b19sZTMyKGFkZHIpOworCisJCQlwYWdpbmdfY21kLmRldmljZV9waHlfYWRkci5hZGRyMzJbYmxrX2lkeF0gPSBwaHlfYWRkcjsKKwkJfQogCX0KIAogCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIGl3bF9jbWRfaWQoRldfUEFHSU5HX0JMT0NLX0NNRCwKIAkJCQkJCSAgICBJV0xfQUxXQVlTX0xPTkdfR1JPVVAsIDApLAotCQkJCSAgICAwLCBzaXplb2YoZndfcGFnaW5nX2NtZCksICZmd19wYWdpbmdfY21kKTsKKwkJCQkgICAgMCwgc2l6ZSwgJnBhZ2luZ19jbWQpOwogfQogCiAvKgpAQCAtNTgwLDkgKzU4Myw5IEBACiAJICAgIGl3bF9md19kYmdfY29uZl91c25pZmZlcihtdm0tPmZ3LCBGV19EQkdfU1RBUlRfRlJPTV9BTElWRSkgJiYKIAkgICAgIShmd19oYXNfY2FwYSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwKIAkJCSAgSVdMX1VDT0RFX1RMVl9DQVBBX1VTTklGRkVSX1VOSUZJRUQpKSkKLQkJZncgPSBpd2xfZ2V0X3Vjb2RlX2ltYWdlKG12bSwgSVdMX1VDT0RFX1JFR1VMQVJfVVNOSUZGRVIpOworCQlmdyA9IGl3bF9nZXRfdWNvZGVfaW1hZ2UobXZtLT5mdywgSVdMX1VDT0RFX1JFR1VMQVJfVVNOSUZGRVIpOwogCWVsc2UKLQkJZncgPSBpd2xfZ2V0X3Vjb2RlX2ltYWdlKG12bSwgdWNvZGVfdHlwZSk7CisJCWZ3ID0gaXdsX2dldF91Y29kZV9pbWFnZShtdm0tPmZ3LCB1Y29kZV90eXBlKTsKIAlpZiAoV0FSTl9PTighZncpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAltdm0tPmN1cl91Y29kZSA9IHVjb2RlX3R5cGU7CkBAIC04MjYsNiArODI5LDU5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgaXdsX212bV9wYXJzZV9zaGFyZWRfbWVtX2EwMDAoc3RydWN0IGl3bF9tdm0gKm12bSwKKwkJCQkJICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0KQoreworCXN0cnVjdCBpd2xfc2hhcmVkX21lbV9jZmcgKm1lbV9jZmcgPSAodm9pZCAqKXBrdC0+ZGF0YTsKKwlpbnQgaTsKKworCW12bS0+c2hhcmVkX21lbV9jZmcubnVtX3R4Zmlmb19lbnRyaWVzID0KKwkJQVJSQVlfU0laRShtdm0tPnNoYXJlZF9tZW1fY2ZnLnR4Zmlmb19zaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtZW1fY2ZnLT50eGZpZm9fc2l6ZSk7IGkrKykKKwkJbXZtLT5zaGFyZWRfbWVtX2NmZy50eGZpZm9fc2l6ZVtpXSA9CisJCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT50eGZpZm9fc2l6ZVtpXSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXZtLT5zaGFyZWRfbWVtX2NmZy5yeGZpZm9fc2l6ZSk7IGkrKykKKwkJbXZtLT5zaGFyZWRfbWVtX2NmZy5yeGZpZm9fc2l6ZVtpXSA9CisJCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT5yeGZpZm9fc2l6ZVtpXSk7CisKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKG12bS0+c2hhcmVkX21lbV9jZmcuaW50ZXJuYWxfdHhmaWZvX3NpemUpICE9CisJCSAgICAgc2l6ZW9mKG1lbV9jZmctPmludGVybmFsX3R4Zmlmb19zaXplKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtdm0tPnNoYXJlZF9tZW1fY2ZnLmludGVybmFsX3R4Zmlmb19zaXplKTsKKwkgICAgIGkrKykKKwkJbXZtLT5zaGFyZWRfbWVtX2NmZy5pbnRlcm5hbF90eGZpZm9fc2l6ZVtpXSA9CisJCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT5pbnRlcm5hbF90eGZpZm9fc2l6ZVtpXSk7Cit9CisKK3N0YXRpYyB2b2lkIGl3bF9tdm1fcGFyc2Vfc2hhcmVkX21lbShzdHJ1Y3QgaXdsX212bSAqbXZtLAorCQkJCSAgICAgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCkKK3sKKwlzdHJ1Y3QgaXdsX3NoYXJlZF9tZW1fY2ZnX3YxICptZW1fY2ZnID0gKHZvaWQgKilwa3QtPmRhdGE7CisJaW50IGk7CisKKwltdm0tPnNoYXJlZF9tZW1fY2ZnLm51bV90eGZpZm9fZW50cmllcyA9CisJCUFSUkFZX1NJWkUobXZtLT5zaGFyZWRfbWVtX2NmZy50eGZpZm9fc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWVtX2NmZy0+dHhmaWZvX3NpemUpOyBpKyspCisJCW12bS0+c2hhcmVkX21lbV9jZmcudHhmaWZvX3NpemVbaV0gPQorCQkJbGUzMl90b19jcHUobWVtX2NmZy0+dHhmaWZvX3NpemVbaV0pOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG12bS0+c2hhcmVkX21lbV9jZmcucnhmaWZvX3NpemUpOyBpKyspCisJCW12bS0+c2hhcmVkX21lbV9jZmcucnhmaWZvX3NpemVbaV0gPQorCQkJbGUzMl90b19jcHUobWVtX2NmZy0+cnhmaWZvX3NpemVbaV0pOworCisJLyogbmV3IEFQSSBoYXMgbW9yZSBkYXRhLCBmcm9tIHJ4Zmlmb19hZGRyIGZpZWxkIGFuZCBvbiAqLworCWlmIChmd19oYXNfY2FwYSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwKKwkJCUlXTF9VQ09ERV9UTFZfQ0FQQV9FWFRFTkRfU0hBUkVEX01FTV9DRkcpKSB7CisJCUJVSUxEX0JVR19PTihzaXplb2YobXZtLT5zaGFyZWRfbWVtX2NmZy5pbnRlcm5hbF90eGZpZm9fc2l6ZSkgIT0KKwkJCSAgICAgc2l6ZW9mKG1lbV9jZmctPmludGVybmFsX3R4Zmlmb19zaXplKSk7CisKKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwgQVJSQVlfU0laRShtdm0tPnNoYXJlZF9tZW1fY2ZnLmludGVybmFsX3R4Zmlmb19zaXplKTsKKwkJICAgICBpKyspCisJCQltdm0tPnNoYXJlZF9tZW1fY2ZnLmludGVybmFsX3R4Zmlmb19zaXplW2ldID0KKwkJCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT5pbnRlcm5hbF90eGZpZm9fc2l6ZVtpXSk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBpd2xfbXZtX2dldF9zaGFyZWRfbWVtX2NvbmYoc3RydWN0IGl3bF9tdm0gKm12bSkKIHsKIAlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKQEAgLTgzMyw5ICs4ODksNyBAQAogCQkuZGF0YSA9IHsgTlVMTCwgfSwKIAkJLmxlbiA9IHsgMCwgfSwKIAl9OwotCXN0cnVjdCBpd2xfc2hhcmVkX21lbV9jZmcgKm1lbV9jZmc7CiAJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdDsKLQl1MzIgaTsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOwogCkBAIC04NDksNDUgKzkwMywxMCBAQAogCQlyZXR1cm47CiAKIAlwa3QgPSBjbWQucmVzcF9wa3Q7Ci0JbWVtX2NmZyA9ICh2b2lkICopcGt0LT5kYXRhOwotCi0JbXZtLT5zaGFyZWRfbWVtX2NmZy5zaGFyZWRfbWVtX2FkZHIgPQotCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT5zaGFyZWRfbWVtX2FkZHIpOwotCW12bS0+c2hhcmVkX21lbV9jZmcuc2hhcmVkX21lbV9zaXplID0KLQkJbGUzMl90b19jcHUobWVtX2NmZy0+c2hhcmVkX21lbV9zaXplKTsKLQltdm0tPnNoYXJlZF9tZW1fY2ZnLnNhbXBsZV9idWZmX2FkZHIgPQotCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT5zYW1wbGVfYnVmZl9hZGRyKTsKLQltdm0tPnNoYXJlZF9tZW1fY2ZnLnNhbXBsZV9idWZmX3NpemUgPQotCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT5zYW1wbGVfYnVmZl9zaXplKTsKLQltdm0tPnNoYXJlZF9tZW1fY2ZnLnR4Zmlmb19hZGRyID0gbGUzMl90b19jcHUobWVtX2NmZy0+dHhmaWZvX2FkZHIpOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG12bS0+c2hhcmVkX21lbV9jZmcudHhmaWZvX3NpemUpOyBpKyspCi0JCW12bS0+c2hhcmVkX21lbV9jZmcudHhmaWZvX3NpemVbaV0gPQotCQkJbGUzMl90b19jcHUobWVtX2NmZy0+dHhmaWZvX3NpemVbaV0pOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG12bS0+c2hhcmVkX21lbV9jZmcucnhmaWZvX3NpemUpOyBpKyspCi0JCW12bS0+c2hhcmVkX21lbV9jZmcucnhmaWZvX3NpemVbaV0gPQotCQkJbGUzMl90b19jcHUobWVtX2NmZy0+cnhmaWZvX3NpemVbaV0pOwotCW12bS0+c2hhcmVkX21lbV9jZmcucGFnZV9idWZmX2FkZHIgPQotCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT5wYWdlX2J1ZmZfYWRkcik7Ci0JbXZtLT5zaGFyZWRfbWVtX2NmZy5wYWdlX2J1ZmZfc2l6ZSA9Ci0JCWxlMzJfdG9fY3B1KG1lbV9jZmctPnBhZ2VfYnVmZl9zaXplKTsKLQotCS8qIG5ldyBBUEkgaGFzIG1vcmUgZGF0YSAqLwotCWlmIChmd19oYXNfY2FwYSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwKLQkJCUlXTF9VQ09ERV9UTFZfQ0FQQV9FWFRFTkRfU0hBUkVEX01FTV9DRkcpKSB7Ci0JCW12bS0+c2hhcmVkX21lbV9jZmcucnhmaWZvX2FkZHIgPQotCQkJbGUzMl90b19jcHUobWVtX2NmZy0+cnhmaWZvX2FkZHIpOwotCQltdm0tPnNoYXJlZF9tZW1fY2ZnLmludGVybmFsX3R4Zmlmb19hZGRyID0KLQkJCWxlMzJfdG9fY3B1KG1lbV9jZmctPmludGVybmFsX3R4Zmlmb19hZGRyKTsKLQotCQlCVUlMRF9CVUdfT04oc2l6ZW9mKG12bS0+c2hhcmVkX21lbV9jZmcuaW50ZXJuYWxfdHhmaWZvX3NpemUpICE9Ci0JCQkgICAgIHNpemVvZihtZW1fY2ZnLT5pbnRlcm5hbF90eGZpZm9fc2l6ZSkpOwotCi0JCWZvciAoaSA9IDA7Ci0JCSAgICAgaSA8IEFSUkFZX1NJWkUobXZtLT5zaGFyZWRfbWVtX2NmZy5pbnRlcm5hbF90eGZpZm9fc2l6ZSk7Ci0JCSAgICAgaSsrKQotCQkJbXZtLT5zaGFyZWRfbWVtX2NmZy5pbnRlcm5hbF90eGZpZm9fc2l6ZVtpXSA9Ci0JCQkJbGUzMl90b19jcHUobWVtX2NmZy0+aW50ZXJuYWxfdHhmaWZvX3NpemVbaV0pOwotCX0KKwlpZiAoaXdsX212bV9oYXNfbmV3X3R4X2FwaShtdm0pKQorCQlpd2xfbXZtX3BhcnNlX3NoYXJlZF9tZW1fYTAwMChtdm0sIHBrdCk7CisJZWxzZQorCQlpd2xfbXZtX3BhcnNlX3NoYXJlZF9tZW0obXZtLCBwa3QpOwogCiAJSVdMX0RFQlVHX0lORk8obXZtLCAiU0hBUkVEIE1FTSBDRkc6IGdvdCBtZW1vcnkgb2Zmc2V0cy9zaXplc1xuIik7CiAKQEAgLTEwMjcsMTkgKzEwNDYsMTEgQEAKIHsKIAlzdHJ1Y3QgaXdsX212bV9zYXJfdGFibGUgc2FyX3RhYmxlOwogCXN0cnVjdCBpd2xfZGV2X3R4X3Bvd2VyX2NtZCBjbWQgPSB7Ci0JCS52My52Mi5zZXRfbW9kZSA9IGNwdV90b19sZTMyKElXTF9UWF9QT1dFUl9NT0RFX1NFVF9DSEFJTlMpLAorCQkudjMuc2V0X21vZGUgPSBjcHVfdG9fbGUzMihJV0xfVFhfUE9XRVJfTU9ERV9TRVRfQ0hBSU5TKSwKIAl9OwogCWludCByZXQsIGksIGosIGlkeDsKIAlpbnQgbGVuID0gc2l6ZW9mKGNtZCk7CiAKLQkvKiB3ZSBjYW4ndCBkbyBhbnl0aGluZyB3aXRoIHRoZSB0YWJsZSBpZiB0aGUgRlcgZG9lc24ndCBzdXBwb3J0IGl0ICovCi0JaWYgKCFmd19oYXNfYXBpKCZtdm0tPmZ3LT51Y29kZV9jYXBhLAotCQkJSVdMX1VDT0RFX1RMVl9BUElfVFhfUE9XRVJfQ0hBSU4pKSB7Ci0JCUlXTF9ERUJVR19SQURJTyhtdm0sCi0JCQkJIkZXIGRvZXNuJ3Qgc3VwcG9ydCBwZXItY2hhaW4gVFggcG93ZXIgc2V0dGluZ3MuXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJaWYgKCFmd19oYXNfY2FwYSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwgSVdMX1VDT0RFX1RMVl9DQVBBX1RYX1BPV0VSX0FDSykpCiAJCWxlbiA9IHNpemVvZihjbWQudjMpOwogCkBAIC0xMDk2LDI3ICsxMTA3LDI3IEBACiAJICogKGZvciBleGFtcGxlLCBpZiB3ZSB3ZXJlIGluIFJGS0lMTCkKIAkgKi8KIAlyZXQgPSBpd2xfcnVuX2luaXRfbXZtX3Vjb2RlKG12bSwgZmFsc2UpOwotCWlmIChyZXQgJiYgIWl3bG12bV9tb2RfcGFyYW1zLmluaXRfZGJnKSB7CisKKwlpZiAoaXdsbXZtX21vZF9wYXJhbXMuaW5pdF9kYmcpCisJCXJldHVybiAwOworCisJaWYgKHJldCkgewogCQlJV0xfRVJSKG12bSwgIkZhaWxlZCB0byBydW4gSU5JVCB1Y29kZTogJWRcbiIsIHJldCk7CiAJCS8qIHRoaXMgY2FuJ3QgaGFwcGVuICovCiAJCWlmIChXQVJOX09OKHJldCA+IDApKQogCQkJcmV0ID0gLUVSRktJTEw7CiAJCWdvdG8gZXJyb3I7CiAJfQotCWlmICghaXdsbXZtX21vZF9wYXJhbXMuaW5pdF9kYmcpIHsKLQkJLyoKLQkJICogU3RvcCBhbmQgc3RhcnQgdGhlIHRyYW5zcG9ydCB3aXRob3V0IGVudGVyaW5nIGxvdyBwb3dlcgotCQkgKiBtb2RlLiBUaGlzIHdpbGwgc2F2ZSB0aGUgc3RhdGUgb2Ygb3RoZXIgY29tcG9uZW50cyBvbiB0aGUKLQkJICogZGV2aWNlIHRoYXQgYXJlIHRyaWdnZXJlZCBieSB0aGUgSU5JVCBmaXJ3bWFyZSAoTUZVQVJUKS4KLQkJICovCi0JCV9pd2xfdHJhbnNfc3RvcF9kZXZpY2UobXZtLT50cmFucywgZmFsc2UpOwotCQlyZXQgPSBfaXdsX3RyYW5zX3N0YXJ0X2h3KG12bS0+dHJhbnMsIGZhbHNlKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQogCi0JaWYgKGl3bG12bV9tb2RfcGFyYW1zLmluaXRfZGJnKQotCQlyZXR1cm4gMDsKKwkvKgorCSAqIFN0b3AgYW5kIHN0YXJ0IHRoZSB0cmFuc3BvcnQgd2l0aG91dCBlbnRlcmluZyBsb3cgcG93ZXIKKwkgKiBtb2RlLiBUaGlzIHdpbGwgc2F2ZSB0aGUgc3RhdGUgb2Ygb3RoZXIgY29tcG9uZW50cyBvbiB0aGUKKwkgKiBkZXZpY2UgdGhhdCBhcmUgdHJpZ2dlcmVkIGJ5IHRoZSBJTklUIGZpcndtYXJlIChNRlVBUlQpLgorCSAqLworCV9pd2xfdHJhbnNfc3RvcF9kZXZpY2UobXZtLT50cmFucywgZmFsc2UpOworCXJldCA9IF9pd2xfdHJhbnNfc3RhcnRfaHcobXZtLT50cmFucywgZmFsc2UpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CiAKIAlyZXQgPSBpd2xfbXZtX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZShtdm0sIElXTF9VQ09ERV9SRUdVTEFSKTsKIAlpZiAocmV0KSB7CkBAIC0xMjE0LDkgKzEyMjUsMTIgQEAKIAl9CiAKIAkvKiBUT0RPOiByZWFkIHRoZSBidWRnZXQgZnJvbSBCSU9TIC8gUGxhdGZvcm0gTlZNICovCi0JaWYgKGl3bF9tdm1faXNfY3RkcF9zdXBwb3J0ZWQobXZtKSAmJiBtdm0tPmNvb2xpbmdfZGV2LmN1cl9zdGF0ZSA+IDApCisJaWYgKGl3bF9tdm1faXNfY3RkcF9zdXBwb3J0ZWQobXZtKSAmJiBtdm0tPmNvb2xpbmdfZGV2LmN1cl9zdGF0ZSA+IDApIHsKIAkJcmV0ID0gaXdsX212bV9jdGRwX2NvbW1hbmQobXZtLCBDVERQX0NNRF9PUEVSQVRJT05fU1RBUlQsCiAJCQkJCSAgIG12bS0+Y29vbGluZ19kZXYuY3VyX3N0YXRlKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJfQogI2Vsc2UKIAkvKiBJbml0aWFsaXplIHR4IGJhY2tvZmZzIHRvIHRoZSBtaW5pbWFsIHBvc3NpYmxlICovCiAJaXdsX212bV90dF90eF9iYWNrb2ZmKG12bSwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9tYWMtY3R4dC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vbWFjLWN0eHQuYwppbmRleCA2OWM0MmNlLi42Yjk2MmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9tYWMtY3R4dC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL21hYy1jdHh0LmMKQEAgLTUzOSw2ICs1MzksMTEgQEAKIAkJCWl3bF9tdm1fZGlzYWJsZV90eHEobXZtLCBJV0xfTVZNX09GRkNIQU5ORUxfUVVFVUUsCiAJCQkJCSAgICBJV0xfTVZNX09GRkNIQU5ORUxfUVVFVUUsCiAJCQkJCSAgICBJV0xfTUFYX1RJRF9DT1VOVCwgMCk7CisJCWVsc2UKKwkJCWl3bF9tdm1fZGlzYWJsZV90eHEobXZtLAorCQkJCQkgICAgSVdMX01WTV9EUUFfUDJQX0RFVklDRV9RVUVVRSwKKwkJCQkJICAgIHZpZi0+aHdfcXVldWVbMF0sIElXTF9NQVhfVElEX0NPVU5ULAorCQkJCQkgICAgMCk7CiAKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKQEAgLTc2OSwyNiArNzc0LDYgQEAKIAkJY21kLT5hY1t0eGZdLmZpZm9zX21hc2sgPSBCSVQodHhmKTsKIAl9CiAKLQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKSB7Ci0JCS8qIGluIEFQIG1vZGUsIHRoZSBNQ0FTVCBGSUZPIHRha2VzIHRoZSBFRENBIHBhcmFtcyBmcm9tIFZPICovCi0JCWNtZC0+YWNbSVdMX01WTV9UWF9GSUZPX1ZPXS5maWZvc19tYXNrIHw9Ci0JCQlCSVQoSVdMX01WTV9UWF9GSUZPX01DQVNUKTsKLQotCQkvKgotCQkgKiBpbiBBUCBtb2RlLCBwYXNzIHByb2JlIHJlcXVlc3RzIGFuZCBiZWFjb25zIGZyb20gb3RoZXIgQVBzCi0JCSAqIChuZWVkZWQgZm9yIGh0IHByb3RlY3Rpb24pOyB3aGVuIHRoZXJlJ3JlIG5vIGFueSBhc3NvY2lhdGVkCi0JCSAqIHN0YXRpb24gZG9uJ3QgYXNrIEZXIHRvIHBhc3MgYmVhY29ucyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5Ci0JCSAqIHdha2UtdXBzLgotCQkgKi8KLQkJY21kLT5maWx0ZXJfZmxhZ3MgfD0gY3B1X3RvX2xlMzIoTUFDX0ZJTFRFUl9JTl9QUk9CRV9SRVFVRVNUKTsKLQkJaWYgKG12bXZpZi0+YXBfYXNzb2Nfc3RhX2NvdW50IHx8ICFtdm0tPmRyb3BfYmNuX2FwX21vZGUpIHsKLQkJCWNtZC0+ZmlsdGVyX2ZsYWdzIHw9IGNwdV90b19sZTMyKE1BQ19GSUxURVJfSU5fQkVBQ09OKTsKLQkJCUlXTF9ERUJVR19IQyhtdm0sICJBc2tpbmcgRlcgdG8gcGFzcyBiZWFjb25zXG4iKTsKLQkJfSBlbHNlIHsKLQkJCUlXTF9ERUJVR19IQyhtdm0sICJObyBuZWVkIHRvIHJlY2VpdmUgYmVhY29uc1xuIik7Ci0JCX0KLQl9Ci0KIAlpZiAodmlmLT5ic3NfY29uZi5xb3MpCiAJCWNtZC0+cW9zX2ZsYWdzIHw9IGNwdV90b19sZTMyKE1BQ19RT1NfRkxHX1VQREFURV9FRENBKTsKIApAQCAtMTE4Niw2ICsxMTcxLDcgQEAKICAqLwogc3RhdGljIHZvaWQgaXdsX212bV9tYWNfY3R4dF9jbWRfZmlsbF9hcChzdHJ1Y3QgaXdsX212bSAqbXZtLAogCQkJCQkgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkJIHN0cnVjdCBpd2xfbWFjX2N0eF9jbWQgKmNtZCwKIAkJCQkJIHN0cnVjdCBpd2xfbWFjX2RhdGFfYXAgKmN0eHRfYXAsCiAJCQkJCSBib29sIGFkZCkKIHsKQEAgLTExOTYsNiArMTE4MiwyMyBAQAogCQkuYmVhY29uX2RldmljZV90cyA9IDAKIAl9OwogCisJLyogaW4gQVAgbW9kZSwgdGhlIE1DQVNUIEZJRk8gdGFrZXMgdGhlIEVEQ0EgcGFyYW1zIGZyb20gVk8gKi8KKwljbWQtPmFjW0lXTF9NVk1fVFhfRklGT19WT10uZmlmb3NfbWFzayB8PSBCSVQoSVdMX01WTV9UWF9GSUZPX01DQVNUKTsKKworCS8qCisJICogaW4gQVAgbW9kZSwgcGFzcyBwcm9iZSByZXF1ZXN0cyBhbmQgYmVhY29ucyBmcm9tIG90aGVyIEFQcworCSAqIChuZWVkZWQgZm9yIGh0IHByb3RlY3Rpb24pOyB3aGVuIHRoZXJlJ3JlIG5vIGFueSBhc3NvY2lhdGVkCisJICogc3RhdGlvbiBkb24ndCBhc2sgRlcgdG8gcGFzcyBiZWFjb25zIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkKKwkgKiB3YWtlLXVwcy4KKwkgKi8KKwljbWQtPmZpbHRlcl9mbGFncyB8PSBjcHVfdG9fbGUzMihNQUNfRklMVEVSX0lOX1BST0JFX1JFUVVFU1QpOworCWlmIChtdm12aWYtPmFwX2Fzc29jX3N0YV9jb3VudCB8fCAhbXZtLT5kcm9wX2Jjbl9hcF9tb2RlKSB7CisJCWNtZC0+ZmlsdGVyX2ZsYWdzIHw9IGNwdV90b19sZTMyKE1BQ19GSUxURVJfSU5fQkVBQ09OKTsKKwkJSVdMX0RFQlVHX0hDKG12bSwgIkFza2luZyBGVyB0byBwYXNzIGJlYWNvbnNcbiIpOworCX0gZWxzZSB7CisJCUlXTF9ERUJVR19IQyhtdm0sICJObyBuZWVkIHRvIHJlY2VpdmUgYmVhY29uc1xuIik7CisJfQorCiAJY3R4dF9hcC0+YmkgPSBjcHVfdG9fbGUzMih2aWYtPmJzc19jb25mLmJlYWNvbl9pbnQpOwogCWN0eHRfYXAtPmJpX3JlY2lwcm9jYWwgPQogCQljcHVfdG9fbGUzMihpd2xfbXZtX3JlY2lwcm9jYWwodmlmLT5ic3NfY29uZi5iZWFjb25faW50KSk7CkBAIC0xMjUzLDcgKzEyNTYsNyBAQAogCWl3bF9tdm1fbWFjX2N0eHRfY21kX2NvbW1vbihtdm0sIHZpZiwgJmNtZCwgTlVMTCwgYWN0aW9uKTsKIAogCS8qIEZpbGwgdGhlIGRhdGEgc3BlY2lmaWMgZm9yIGFwIG1vZGUgKi8KLQlpd2xfbXZtX21hY19jdHh0X2NtZF9maWxsX2FwKG12bSwgdmlmLCAmY21kLmFwLAorCWl3bF9tdm1fbWFjX2N0eHRfY21kX2ZpbGxfYXAobXZtLCB2aWYsICZjbWQsICZjbWQuYXAsCiAJCQkJICAgICBhY3Rpb24gPT0gRldfQ1RYVF9BQ1RJT05fQUREKTsKIAogCXJldHVybiBpd2xfbXZtX21hY19jdHh0X3NlbmRfY21kKG12bSwgJmNtZCk7CkBAIC0xMjcyLDcgKzEyNzUsNyBAQAogCWl3bF9tdm1fbWFjX2N0eHRfY21kX2NvbW1vbihtdm0sIHZpZiwgJmNtZCwgTlVMTCwgYWN0aW9uKTsKIAogCS8qIEZpbGwgdGhlIGRhdGEgc3BlY2lmaWMgZm9yIEdPIG1vZGUgKi8KLQlpd2xfbXZtX21hY19jdHh0X2NtZF9maWxsX2FwKG12bSwgdmlmLCAmY21kLmdvLmFwLAorCWl3bF9tdm1fbWFjX2N0eHRfY21kX2ZpbGxfYXAobXZtLCB2aWYsICZjbWQsICZjbWQuZ28uYXAsCiAJCQkJICAgICBhY3Rpb24gPT0gRldfQ1RYVF9BQ1RJT05fQUREKTsKIAogCWNtZC5nby5jdHdpbiA9IGNwdV90b19sZTMyKG5vYS0+b3BwcHNfY3R3aW5kb3cgJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vbWFjODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL21hYzgwMjExLmMKaW5kZXggNmQ2MDY0NS4uMzE4ZWZkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vbWFjODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9tYWM4MDIxMS5jCkBAIC00NjUsNyArNDY1LDcgQEAKIAlody0+dWFwc2RfcXVldWVzID0gSVdMX01WTV9VQVBTRF9RVUVVRVM7CiAJaHctPnVhcHNkX21heF9zcF9sZW4gPSBJV0xfVUFQU0RfTUFYX1NQOwogCi0JQlVJTERfQlVHX09OKEFSUkFZX1NJWkUobXZtLT5jaXBoZXJzKSA8IEFSUkFZX1NJWkUobXZtX2NpcGhlcnMpICsgNCk7CisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUobXZtLT5jaXBoZXJzKSA8IEFSUkFZX1NJWkUobXZtX2NpcGhlcnMpICsgNik7CiAJbWVtY3B5KG12bS0+Y2lwaGVycywgbXZtX2NpcGhlcnMsIHNpemVvZihtdm1fY2lwaGVycykpOwogCWh3LT53aXBoeS0+bl9jaXBoZXJfc3VpdGVzID0gQVJSQVlfU0laRShtdm1fY2lwaGVycyk7CiAJaHctPndpcGh5LT5jaXBoZXJfc3VpdGVzID0gbXZtLT5jaXBoZXJzOwpAQCAtNDc5LDE3ICs0NzksMjMgQEAKIAkJaHctPndpcGh5LT5uX2NpcGhlcl9zdWl0ZXMrKzsKIAl9CiAKLQkvKgotCSAqIEVuYWJsZSAxMXcgaWYgYWR2ZXJ0aXNlZCBieSBmaXJtd2FyZSBhbmQgc29mdHdhcmUgY3J5cHRvCi0JICogaXMgbm90IGVuYWJsZWQgKGFzIHRoZSBmaXJtd2FyZSB3aWxsIGludGVycHJldCBzb21lIG1nbXQKLQkgKiBwYWNrZXRzLCBzbyBlbmFibGluZyBpdCB3aXRoIHNvZnR3YXJlIGNyeXB0byBpc24ndCBzYWZlKQorCS8qIEVuYWJsZSAxMXcgaWYgc29mdHdhcmUgY3J5cHRvIGlzIG5vdCBlbmFibGVkIChhcyB0aGUKKwkgKiBmaXJtd2FyZSB3aWxsIGludGVycHJldCBzb21lIG1nbXQgcGFja2V0cywgc28gZW5hYmxpbmcgaXQKKwkgKiB3aXRoIHNvZnR3YXJlIGNyeXB0byBpc24ndCBzYWZlKS4KIAkgKi8KLQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfTUZQICYmCi0JICAgICFpd2x3aWZpX21vZF9wYXJhbXMuc3dfY3J5cHRvKSB7CisJaWYgKCFpd2x3aWZpX21vZF9wYXJhbXMuc3dfY3J5cHRvKSB7CiAJCWllZWU4MDIxMV9od19zZXQoaHcsIE1GUF9DQVBBQkxFKTsKIAkJbXZtLT5jaXBoZXJzW2h3LT53aXBoeS0+bl9jaXBoZXJfc3VpdGVzXSA9CiAJCQlXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQzsKIAkJaHctPndpcGh5LT5uX2NpcGhlcl9zdWl0ZXMrKzsKKwkJaWYgKGl3bF9tdm1faGFzX25ld19yeF9hcGkobXZtKSkgeworCQkJbXZtLT5jaXBoZXJzW2h3LT53aXBoeS0+bl9jaXBoZXJfc3VpdGVzXSA9CisJCQkJV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMTI4OworCQkJaHctPndpcGh5LT5uX2NpcGhlcl9zdWl0ZXMrKzsKKwkJCW12bS0+Y2lwaGVyc1tody0+d2lwaHktPm5fY2lwaGVyX3N1aXRlc10gPQorCQkJCVdMQU5fQ0lQSEVSX1NVSVRFX0JJUF9HTUFDXzI1NjsKKwkJCWh3LT53aXBoeS0+bl9jaXBoZXJfc3VpdGVzKys7CisJCX0KIAl9CiAKIAkvKiBjdXJyZW50bHkgRlcgQVBJIHN1cHBvcnRzIG9ubHkgb25lIG9wdGlvbmFsIGNpcGhlciBzY2hlbWUgKi8KQEAgLTUzOSw5ICs1NDUsNyBAQAogCQlody0+d2lwaHktPnJlZ3VsYXRvcnlfZmxhZ3MgfD0gUkVHVUxBVE9SWV9DVVNUT01fUkVHIHwKIAkJCQkJICAgICAgIFJFR1VMQVRPUllfRElTQUJMRV9CRUFDT05fSElOVFM7CiAKLQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfR09fVUFQU0QpCi0JCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19BUF9VQVBTRDsKLQorCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19BUF9VQVBTRDsKIAlody0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfSEFTX0NIQU5ORUxfU1dJVENIOwogCiAJaHctPndpcGh5LT5pZmFjZV9jb21iaW5hdGlvbnMgPSBpd2xfbXZtX2lmYWNlX2NvbWJpbmF0aW9uczsKQEAgLTYyNCw2ICs2MjgsNyBAQAogCWh3LT53aXBoeS0+ZmVhdHVyZXMgfD0gTkw4MDIxMV9GRUFUVVJFX1AyUF9HT19DVFdJTiB8CiAJCQkgICAgICAgTkw4MDIxMV9GRUFUVVJFX0xPV19QUklPUklUWV9TQ0FOIHwKIAkJCSAgICAgICBOTDgwMjExX0ZFQVRVUkVfUDJQX0dPX09QUFBTIHwKKwkJCSAgICAgICBOTDgwMjExX0ZFQVRVUkVfQVBfTU9ERV9DSEFOX1dJRFRIX0NIQU5HRSB8CiAJCQkgICAgICAgTkw4MDIxMV9GRUFUVVJFX0RZTkFNSUNfU01QUyB8CiAJCQkgICAgICAgTkw4MDIxMV9GRUFUVVJFX1NUQVRJQ19TTVBTIHwKIAkJCSAgICAgICBOTDgwMjExX0ZFQVRVUkVfU1VQUE9SVFNfV01NX0FETUlTU0lPTjsKQEAgLTY0NCw2ICs2NDksMTYgQEAKIAkJCUlXTF9VQ09ERV9UTFZfQ0FQQV9XRkFfVFBDX1JFUF9JRV9TVVBQT1JUKSkKIAkJaHctPndpcGh5LT5mZWF0dXJlcyB8PSBOTDgwMjExX0ZFQVRVUkVfV0ZBX1RQQ19JRV9JTl9QUk9CRVM7CiAKKwlpZiAoZndfaGFzX2FwaSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwKKwkJICAgICAgIElXTF9VQ09ERV9UTFZfQVBJX1NDQU5fVFNGX1JFUE9SVCkpIHsKKwkJd2lwaHlfZXh0X2ZlYXR1cmVfc2V0KGh3LT53aXBoeSwKKwkJCQkgICAgICBOTDgwMjExX0VYVF9GRUFUVVJFX1NDQU5fU1RBUlRfVElNRSk7CisJCXdpcGh5X2V4dF9mZWF0dXJlX3NldChody0+d2lwaHksCisJCQkJICAgICAgTkw4MDIxMV9FWFRfRkVBVFVSRV9CU1NfUEFSRU5UX1RTRik7CisJCXdpcGh5X2V4dF9mZWF0dXJlX3NldChody0+d2lwaHksCisJCQkJICAgICAgTkw4MDIxMV9FWFRfRkVBVFVSRV9TRVRfU0NBTl9EV0VMTCk7CisJfQorCiAJbXZtLT5ydHNfdGhyZXNob2xkID0gSUVFRTgwMjExX01BWF9SVFNfVEhSRVNIT0xEOwogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCkBAIC03MTEsNiArNzI2LDEwIEBACiAJaWYgKHJldCkKIAkJaXdsX212bV9sZWRzX2V4aXQobXZtKTsKIAorCWlmIChtdm0tPmNmZy0+dmh0X211X21pbW9fc3VwcG9ydGVkKQorCQl3aXBoeV9leHRfZmVhdHVyZV9zZXQoaHctPndpcGh5LAorCQkJCSAgICAgIE5MODAyMTFfRVhUX0ZFQVRVUkVfTVVfTUlNT19BSVJfU05JRkZFUik7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMjUwLDIwICsxMjY5LDE4IEBACiAJCQkJczE2IHR4X3Bvd2VyKQogewogCXN0cnVjdCBpd2xfZGV2X3R4X3Bvd2VyX2NtZCBjbWQgPSB7Ci0JCS52My52Mi5zZXRfbW9kZSA9IGNwdV90b19sZTMyKElXTF9UWF9QT1dFUl9NT0RFX1NFVF9NQUMpLAotCQkudjMudjIubWFjX2NvbnRleHRfaWQgPQorCQkudjMuc2V0X21vZGUgPSBjcHVfdG9fbGUzMihJV0xfVFhfUE9XRVJfTU9ERV9TRVRfTUFDKSwKKwkJLnYzLm1hY19jb250ZXh0X2lkID0KIAkJCWNwdV90b19sZTMyKGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmKS0+aWQpLAotCQkudjMudjIucHdyX3Jlc3RyaWN0aW9uID0gY3B1X3RvX2xlMTYoOCAqIHR4X3Bvd2VyKSwKKwkJLnYzLnB3cl9yZXN0cmljdGlvbiA9IGNwdV90b19sZTE2KDggKiB0eF9wb3dlciksCiAJfTsKIAlpbnQgbGVuID0gc2l6ZW9mKGNtZCk7CiAKIAlpZiAodHhfcG93ZXIgPT0gSVdMX0RFRkFVTFRfTUFYX1RYX1BPV0VSKQotCQljbWQudjMudjIucHdyX3Jlc3RyaWN0aW9uID0gY3B1X3RvX2xlMTYoSVdMX0RFVl9NQVhfVFhfUE9XRVIpOworCQljbWQudjMucHdyX3Jlc3RyaWN0aW9uID0gY3B1X3RvX2xlMTYoSVdMX0RFVl9NQVhfVFhfUE9XRVIpOwogCiAJaWYgKCFmd19oYXNfY2FwYSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwgSVdMX1VDT0RFX1RMVl9DQVBBX1RYX1BPV0VSX0FDSykpCiAJCWxlbiA9IHNpemVvZihjbWQudjMpOwotCWlmICghZndfaGFzX2FwaSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwgSVdMX1VDT0RFX1RMVl9BUElfVFhfUE9XRVJfQ0hBSU4pKQotCQlsZW4gPSBzaXplb2YoY21kLnYzLnYyKTsKIAogCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFJFRFVDRV9UWF9QT1dFUl9DTUQsIDAsIGxlbiwgJmNtZCk7CiB9CkBAIC0yMjIwLDYgKzIyMzcsMTAgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgogCQlpd2xfbXZtX2Jzc19pbmZvX2NoYW5nZWRfYXBfaWJzcyhtdm0sIHZpZiwgYnNzX2NvbmYsIGNoYW5nZXMpOwogCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6CisJCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfTVVfR1JPVVBTKQorCQkJaXdsX212bV91cGRhdGVfbXVfZ3JvdXBzKG12bSwgdmlmKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogc2hvdWxkbid0IGhhcHBlbiAqLwogCQlXQVJOX09OX09OQ0UoMSk7CkBAIC0yNzQ2LDYgKzI3NjcsOCBAQAogCQlrZXktPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19QVVRfSVZfU1BBQ0U7CiAJCWJyZWFrOwogCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUM6CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9CSVBfR01BQ18xMjg6CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9CSVBfR01BQ18yNTY6CiAJCVdBUk5fT05fT05DRSghaWVlZTgwMjExX2h3X2NoZWNrKGh3LCBNRlBfQ0FQQUJMRSkpOwogCQlicmVhazsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgpAQCAtMjc3OSw5ICsyODAyLDExIEBACiAJCQkgKiBHVEsgb24gQVAgaW50ZXJmYWNlIGlzIGEgVFgtb25seSBrZXksIHJldHVybiAwOwogCQkJICogb24gSUJTUyB0aGV5J3JlIHBlci1zdGF0aW9uIGFuZCBiZWNhdXNlIHdlJ3JlIGxhenkKIAkJCSAqIHdlIGRvbid0IHN1cHBvcnQgdGhlbSBmb3IgUlgsIHNvIGRvIHRoZSBzYW1lLgotCQkJICogQ01BQyBpbiBBUC9JQlNTIG1vZGVzIG11c3QgYmUgZG9uZSBpbiBzb2Z0d2FyZS4KKwkJCSAqIENNQUMvR01BQyBpbiBBUC9JQlNTIG1vZGVzIG11c3QgYmUgZG9uZSBpbiBzb2Z0d2FyZS4KIAkJCSAqLwotCQkJaWYgKGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDKQorCQkJaWYgKGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDIHx8CisJCQkgICAga2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMTI4IHx8CisJCQkgICAga2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMjU2KQogCQkJCXJldCA9IC1FT1BOT1RTVVBQOwogCQkJZWxzZQogCQkJCXJldCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9tdm0uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL212bS5oCmluZGV4IGI0ZmM4NmQuLmQxN2NiZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL212bS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL212bS5oCkBAIC00NjcsNiArNDY3LDggQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGl3bF9tdm1fdmlmICoKIGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKKwlpZiAoIXZpZikKKwkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuICh2b2lkICopdmlmLT5kcnZfcHJpdjsKIH0KIApAQCAtNjAyLDE2ICs2MDQsOSBAQAogfTsKIAogc3RydWN0IGl3bF9tdm1fc2hhcmVkX21lbV9jZmcgewotCXUzMiBzaGFyZWRfbWVtX2FkZHI7Ci0JdTMyIHNoYXJlZF9tZW1fc2l6ZTsKLQl1MzIgc2FtcGxlX2J1ZmZfYWRkcjsKLQl1MzIgc2FtcGxlX2J1ZmZfc2l6ZTsKLQl1MzIgdHhmaWZvX2FkZHI7CisJaW50IG51bV90eGZpZm9fZW50cmllczsKIAl1MzIgdHhmaWZvX3NpemVbVFhfRklGT19NQVhfTlVNXTsKIAl1MzIgcnhmaWZvX3NpemVbUlhfRklGT19NQVhfTlVNXTsKLQl1MzIgcGFnZV9idWZmX2FkZHI7Ci0JdTMyIHBhZ2VfYnVmZl9zaXplOwotCXUzMiByeGZpZm9fYWRkcjsKIAl1MzIgaW50ZXJuYWxfdHhmaWZvX2FkZHI7CiAJdTMyIGludGVybmFsX3R4Zmlmb19zaXplW1RYX0ZJRk9fSU5URVJOQUxfTUFYX05VTV07CiB9OwpAQCAtNjk3LDYgKzY5MiwxMCBAQAogICoJaXQuIEluIHRoaXMgc3RhdGUsIHdoZW4gYSBuZXcgcXVldWUgaXMgbmVlZGVkIHRvIGJlIGFsbG9jYXRlZCBidXQgbm8KICAqCXN1Y2ggZnJlZSBxdWV1ZSBleGlzdHMsIGFuIGluYWN0aXZlIHF1ZXVlIG1pZ2h0IGJlIGZyZWVkIGFuZCBnaXZlbiB0bwogICoJdGhlIG5ldyBSQS9USUQuCisgKiBASVdMX01WTV9RVUVVRV9SRUNPTkZJR1VSSU5HOiBxdWV1ZSBpcyBiZWluZyByZWNvbmZpZ3VyZWQKKyAqCVRoaXMgaXMgdGhlIHN0YXRlIG9mIGEgcXVldWUgdGhhdCBoYXMgaGFkIHRyYWZmaWMgcGFzcyB0aHJvdWdoIGl0LCBidXQKKyAqCW5lZWRzIHRvIGJlIHJlY29uZmlndXJlZCBmb3Igc29tZSByZWFzb24sIGUuZy4gdGhlIHF1ZXVlIG5lZWRzIHRvCisgKgliZWNvbWUgdW5zaGFyZWQgYW5kIGFnZ3JlZ2F0aW9ucyByZS1lbmFibGVkIG9uLgogICovCiBlbnVtIGl3bF9tdm1fcXVldWVfc3RhdHVzIHsKIAlJV0xfTVZNX1FVRVVFX0ZSRUUsCkBAIC03MDQsMTAgKzcwMywxMSBAQAogCUlXTF9NVk1fUVVFVUVfUkVBRFksCiAJSVdMX01WTV9RVUVVRV9TSEFSRUQsCiAJSVdMX01WTV9RVUVVRV9JTkFDVElWRSwKKwlJV0xfTVZNX1FVRVVFX1JFQ09ORklHVVJJTkcsCiB9OwogCiAjZGVmaW5lIElXTF9NVk1fRFFBX1FVRVVFX1RJTUVPVVQJKDUgKiBIWikKLSNkZWZpbmUgSVdMX01WTV9OVU1fQ0lQSEVSUyAgICAgICAgICAgICA4CisjZGVmaW5lIElXTF9NVk1fTlVNX0NJUEhFUlMgICAgICAgICAgICAgMTAKIAogc3RydWN0IGl3bF9tdm0gewogCS8qIGZvciBsb2dnZXIgYWNjZXNzICovCkBAIC03NjcsNiArNzY3LDcgQEAKIAkJdTggcmFfc3RhX2lkOyAvKiBUaGUgUkEgdGhpcyBxdWV1ZSBpcyBtYXBwZWQgdG8sIGlmIGV4aXN0cyAqLwogCQlib29sIHJlc2VydmVkOyAvKiBJcyB0aGlzIHRoZSBUWFEgcmVzZXJ2ZWQgZm9yIGEgU1RBICovCiAJCXU4IG1hYzgwMjExX2FjOyAvKiBUaGUgbWFjODAyMTEgQUMgdGhpcyBxdWV1ZSBpcyBtYXBwZWQgdG8gKi8KKwkJdTggdHhxX3RpZDsgLyogVGhlIFRJRCAib3duZXIiIG9mIHRoaXMgcXVldWUqLwogCQl1MTYgdGlkX2JpdG1hcDsgLyogQml0bWFwIG9mIHRoZSBUSURzIG1hcHBlZCB0byB0aGlzIHF1ZXVlICovCiAJCS8qIFRpbWVzdGFtcCBmb3IgaW5hY3RpdmF0aW9uIHBlciBUSUQgb2YgdGhpcyBxdWV1ZSAqLwogCQl1bnNpZ25lZCBsb25nIGxhc3RfZnJhbWVfdGltZVtJV0xfTUFYX1RJRF9DT1VOVCArIDFdOwpAQCAtODIwLDYgKzgyMSwxMiBAQAogCS8qIFVNQUMgc2NhbiB0cmFja2luZyAqLwogCXUzMiBzY2FuX3VpZF9zdGF0dXNbSVdMX01WTV9NQVhfVU1BQ19TQ0FOU107CiAKKwkvKiBzdGFydCB0aW1lIG9mIGxhc3Qgc2NhbiBpbiBUU0Ygb2YgdGhlIG1hYyB0aGF0IHJlcXVlc3RlZCB0aGUgc2NhbiAqLworCXU2NCBzY2FuX3N0YXJ0OworCisJLyogdGhlIHZpZiB0aGF0IHJlcXVlc3RlZCB0aGUgY3VycmVudCBzY2FuICovCisJc3RydWN0IGl3bF9tdm1fdmlmICpzY2FuX3ZpZjsKKwogCS8qIHJ4IGNoYWluIGFudGVubmFzIHNldCB0aHJvdWdoIGRlYnVnZnMgZm9yIHRoZSBzY2FuIGNvbW1hbmQgKi8KIAl1OCBzY2FuX3J4X2FudDsKIApAQCAtMTEyMiw2ICsxMTI5LDE4IEBACiAJCShtdm0tPnRyYW5zLT5ydW50aW1lX3BtX21vZGUgIT0gSVdMX1BMQVRfUE1fTU9ERV9EMEkzKTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGl3bF9tdm1faXNfZHFhX2RhdGFfcXVldWUoc3RydWN0IGl3bF9tdm0gKm12bSwgdTggcXVldWUpCit7CisJcmV0dXJuIChxdWV1ZSA+PSBJV0xfTVZNX0RRQV9NSU5fREFUQV9RVUVVRSkgJiYKKwkgICAgICAgKHF1ZXVlIDw9IElXTF9NVk1fRFFBX01BWF9EQVRBX1FVRVVFKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGl3bF9tdm1faXNfZHFhX21nbXRfcXVldWUoc3RydWN0IGl3bF9tdm0gKm12bSwgdTggcXVldWUpCit7CisJcmV0dXJuIChxdWV1ZSA+PSBJV0xfTVZNX0RRQV9NSU5fTUdNVF9RVUVVRSkgJiYKKwkgICAgICAgKHF1ZXVlIDw9IElXTF9NVk1fRFFBX01BWF9NR01UX1FVRVVFKTsKK30KKwogc3RhdGljIGlubGluZSBib29sIGl3bF9tdm1faXNfbGFyX3N1cHBvcnRlZChzdHJ1Y3QgaXdsX212bSAqbXZtKQogewogCWJvb2wgbnZtX2xhciA9IG12bS0+bnZtX2RhdGEtPmxhcl9lbmFibGVkOwpAQCAtMTE5Miw2ICsxMjExLDEyIEBACiAJCQkgICBJV0xfVUNPREVfVExWX0NBUEFfTVVMVElfUVVFVUVfUlhfU1VQUE9SVCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBpd2xfbXZtX2hhc19uZXdfdHhfYXBpKHN0cnVjdCBpd2xfbXZtICptdm0pCit7CisJLyogVE9ETyAtIHJlcGxhY2Ugd2l0aCBUTFYgb25jZSBkZWZpbmVkICovCisJcmV0dXJuIG12bS0+dHJhbnMtPmNmZy0+dXNlX3RmaDsKK30KKwogc3RhdGljIGlubGluZSBib29sIGl3bF9tdm1faXNfdHRfaW5fZncoc3RydWN0IGl3bF9tdm0gKm12bSkKIHsKICNpZmRlZiBDT05GSUdfVEhFUk1BTApAQCAtMTI0Myw2ICsxMjY4LDcgQEAKIHZvaWQgaXdsX212bV9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGl3bF9tdm0gKm12bSk7CiB1OCBmaXJzdF9hbnRlbm5hKHU4IG1hc2spOwogdTggaXdsX212bV9uZXh0X2FudGVubmEoc3RydWN0IGl3bF9tdm0gKm12bSwgdTggdmFsaWQsIHU4IGxhc3RfaWR4KTsKK3ZvaWQgaXdsX212bV9nZXRfc3luY190aW1lKHN0cnVjdCBpd2xfbXZtICptdm0sIHUzMiAqZ3AyLCB1NjQgKmJvb3R0aW1lKTsKIAogLyogVHggLyBIb3N0IENvbW1hbmRzICovCiBpbnQgX19tdXN0X2NoZWNrIGl3bF9tdm1fc2VuZF9jbWQoc3RydWN0IGl3bF9tdm0gKm12bSwKQEAgLTEyNzksOCArMTMwNSw2IEBACiAKIAl0eF9jbWQtPnNlY19jdGwgPSBUWF9DTURfU0VDX0NDTTsKIAltZW1jcHkodHhfY21kLT5rZXksIGtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKLQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKQotCQl0eF9jbWQtPnR4X2ZsYWdzIHw9IGNwdV90b19sZTMyKFRYX0NNRF9GTEdfQ0NNUF9BR0cpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaXdsX212bV93YWl0X2Zvcl9hc3luY19oYW5kbGVycyhzdHJ1Y3QgaXdsX212bSAqbXZtKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vbnZtLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9udm0uYwppbmRleCA3YTY4NmY2Li5lYWRlMDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9udm0uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9udm0uYwpAQCAtNjYsNyArNjYsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgIml3bC10cmFucy5oIgogI2luY2x1ZGUgIml3bC1jc3IuaCIKICNpbmNsdWRlICJtdm0uaCIKQEAgLTc1MSw5NiArNzUwLDYgQEAKIAlyZXR1cm4gcmVzcF9jcDsKIH0KIAotI2lmZGVmIENPTkZJR19BQ1BJCi0jZGVmaW5lIFdSRF9NRVRIT0QJCSJXUkREIgotI2RlZmluZSBXUkREX1dJRkkJCSgweDA3KQotI2RlZmluZSBXUkREX1dJR0lHCQkoMHgxMCkKLQotc3RhdGljIHUzMiBpd2xfbXZtX3dyZGRfZ2V0X21jYyhzdHJ1Y3QgaXdsX212bSAqbXZtLCB1bmlvbiBhY3BpX29iamVjdCAqd3JkZCkKLXsKLQl1bmlvbiBhY3BpX29iamVjdCAqbWNjX3BrZywgKmRvbWFpbl90eXBlLCAqbWNjX3ZhbHVlOwotCXUzMiBpOwotCi0JaWYgKHdyZGQtPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UgfHwKLQkgICAgd3JkZC0+cGFja2FnZS5jb3VudCA8IDIgfHwKLQkgICAgd3JkZC0+cGFja2FnZS5lbGVtZW50c1swXS50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSIHx8Ci0JICAgIHdyZGQtPnBhY2thZ2UuZWxlbWVudHNbMF0uaW50ZWdlci52YWx1ZSAhPSAwKSB7Ci0JCUlXTF9ERUJVR19MQVIobXZtLCAiVW5zdXBwb3J0ZWQgd3JkZCBzdHJ1Y3R1cmVcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlmb3IgKGkgPSAxIDsgaSA8IHdyZGQtPnBhY2thZ2UuY291bnQgOyArK2kpIHsKLQkJbWNjX3BrZyA9ICZ3cmRkLT5wYWNrYWdlLmVsZW1lbnRzW2ldOwotCi0JCWlmIChtY2NfcGtnLT50eXBlICE9IEFDUElfVFlQRV9QQUNLQUdFIHx8Ci0JCSAgICBtY2NfcGtnLT5wYWNrYWdlLmNvdW50IDwgMiB8fAotCQkgICAgbWNjX3BrZy0+cGFja2FnZS5lbGVtZW50c1swXS50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSIHx8Ci0JCSAgICBtY2NfcGtnLT5wYWNrYWdlLmVsZW1lbnRzWzFdLnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKLQkJCW1jY19wa2cgPSBOVUxMOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlkb21haW5fdHlwZSA9ICZtY2NfcGtnLT5wYWNrYWdlLmVsZW1lbnRzWzBdOwotCQlpZiAoZG9tYWluX3R5cGUtPmludGVnZXIudmFsdWUgPT0gV1JERF9XSUZJKQotCQkJYnJlYWs7Ci0KLQkJbWNjX3BrZyA9IE5VTEw7Ci0JfQotCi0JaWYgKG1jY19wa2cpIHsKLQkJbWNjX3ZhbHVlID0gJm1jY19wa2ctPnBhY2thZ2UuZWxlbWVudHNbMV07Ci0JCXJldHVybiBtY2NfdmFsdWUtPmludGVnZXIudmFsdWU7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsX212bV9nZXRfYmlvc19tY2Moc3RydWN0IGl3bF9tdm0gKm12bSwgY2hhciAqbWNjKQotewotCWFjcGlfaGFuZGxlIHJvb3RfaGFuZGxlOwotCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgd3JkZCA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXUzMiBtY2NfdmFsOwotCi0Jcm9vdF9oYW5kbGUgPSBBQ1BJX0hBTkRMRShtdm0tPmRldik7Ci0JaWYgKCFyb290X2hhbmRsZSkgewotCQlJV0xfREVCVUdfTEFSKG12bSwKLQkJCSAgICAgICJDb3VsZCBub3QgcmV0cmlldmUgcm9vdCBwb3J0IEFDUEkgaGFuZGxlXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCi0JLyogR2V0IHRoZSBtZXRob2QncyBoYW5kbGUgKi8KLQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUocm9vdF9oYW5kbGUsIChhY3BpX3N0cmluZylXUkRfTUVUSE9ELCAmaGFuZGxlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJSVdMX0RFQlVHX0xBUihtdm0sICJXUkQgbWV0aG9kIG5vdCBmb3VuZFxuIik7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQotCS8qIENhbGwgV1JERCB3aXRoIG5vIGFyZ3VtZW50cyAqLwotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgTlVMTCwgTlVMTCwgJndyZGQpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlJV0xfREVCVUdfTEFSKG12bSwgIldSREMgaW52b2NhdGlvbiBmYWlsZWQgKDB4JXgpXG4iLCBzdGF0dXMpOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9Ci0KLQltY2NfdmFsID0gaXdsX212bV93cmRkX2dldF9tY2MobXZtLCB3cmRkLnBvaW50ZXIpOwotCWtmcmVlKHdyZGQucG9pbnRlcik7Ci0JaWYgKCFtY2NfdmFsKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCW1jY1swXSA9IChtY2NfdmFsID4+IDgpICYgMHhmZjsKLQltY2NbMV0gPSBtY2NfdmFsICYgMHhmZjsKLQltY2NbMl0gPSAnXDAnOwotCXJldHVybiAwOwotfQotI2Vsc2UgLyogQ09ORklHX0FDUEkgKi8KLXN0YXRpYyBpbnQgaXdsX212bV9nZXRfYmlvc19tY2Moc3RydWN0IGl3bF9tdm0gKm12bSwgY2hhciAqbWNjKQotewotCXJldHVybiAtRU5PRU5UOwotfQotI2VuZGlmCi0KIGludCBpd2xfbXZtX2luaXRfbWNjKHN0cnVjdCBpd2xfbXZtICptdm0pCiB7CiAJYm9vbCB0bHZfbGFyOwpAQCAtODg0LDcgKzc5Myw3IEBACiAJCXJldHVybiAtRUlPOwogCiAJaWYgKGl3bF9tdm1faXNfd2lmaV9tY2Nfc3VwcG9ydGVkKG12bSkgJiYKLQkgICAgIWl3bF9tdm1fZ2V0X2Jpb3NfbWNjKG12bSwgbWNjKSkgeworCSAgICAhaXdsX2dldF9iaW9zX21jYyhtdm0tPmRldiwgbWNjKSkgewogCQlrZnJlZShyZWdkKTsKIAkJcmVnZCA9IGl3bF9tdm1fZ2V0X3JlZ2RvbWFpbihtdm0tPmh3LT53aXBoeSwgbWNjLAogCQkJCQkgICAgIE1DQ19TT1VSQ0VfQklPUywgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9vcHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL29wcy5jCmluZGV4IDU1ZDkwOTYuLjA1ZmU2ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL29wcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL29wcy5jCkBAIC0zNTksNiArMzU5LDcgQEAKIAlIQ01EX05BTUUoQlRfQ09FWF9DSSksCiAJSENNRF9OQU1FKFBIWV9DT05GSUdVUkFUSU9OX0NNRCksCiAJSENNRF9OQU1FKENBTElCX1JFU19OT1RJRl9QSFlfREIpLAorCUhDTURfTkFNRShQSFlfREJfQ01EKSwKIAlIQ01EX05BTUUoU0NBTl9PRkZMT0FEX0NPTVBMRVRFKSwKIAlIQ01EX05BTUUoU0NBTl9PRkZMT0FEX1VQREFURV9QUk9GSUxFU19DTUQpLAogCUhDTURfTkFNRShTQ0FOX09GRkxPQURfQ09ORklHX0NNRCksCkBAIC02NTIsMTEgKzY1Myw5IEBACiAJLyogdGhlIGhhcmR3YXJlIHNwbGl0cyB0aGUgQS1NU0RVICovCiAJaWYgKG12bS0+Y2ZnLT5tcV9yeF9zdXBwb3J0ZWQpCiAJCXRyYW5zX2NmZy5yeF9idWZfc2l6ZSA9IElXTF9BTVNEVV80SzsKLQl0cmFuc19jZmcud2lkZV9jbWRfaGVhZGVyID0gZndfaGFzX2FwaSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwKLQkJCQkJICAgICAgIElXTF9VQ09ERV9UTFZfQVBJX1dJREVfQ01EX0hEUik7CiAKLQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfRFdfQkNfVEFCTEUpCi0JCXRyYW5zX2NmZy5iY190YWJsZV9kd29yZCA9IHRydWU7CisJdHJhbnMtPndpZGVfY21kX2hlYWRlciA9IHRydWU7CisJdHJhbnNfY2ZnLmJjX3RhYmxlX2R3b3JkID0gdHJ1ZTsKIAogCXRyYW5zX2NmZy5jb21tYW5kX2dyb3VwcyA9IGl3bF9tdm1fZ3JvdXBzOwogCXRyYW5zX2NmZy5jb21tYW5kX2dyb3Vwc19zaXplID0gQVJSQVlfU0laRShpd2xfbXZtX2dyb3Vwcyk7CkBAIC03MTEsMzcgKzcxMCwyMSBAQAogCQlJV0xfREVCVUdfRUVQUk9NKG12bS0+dHJhbnMtPmRldiwKIAkJCQkgIndvcmtpbmcgd2l0aG91dCBleHRlcm5hbCBudm0gZmlsZVxuIik7CiAKLQlpZiAoV0FSTihjZmctPm5vX3Bvd2VyX3VwX25pY19pbl9pbml0ICYmICFtdm0tPm52bV9maWxlX25hbWUsCi0JCSAibm90IGFsbG93aW5nIHBvd2VyLXVwIGFuZCBub3QgaGF2aW5nIG52bV9maWxlXG4iKSkKKwllcnIgPSBpd2xfdHJhbnNfc3RhcnRfaHcobXZtLT50cmFucyk7CisJaWYgKGVycikKIAkJZ290byBvdXRfZnJlZTsKIAotCS8qCi0JICogRXZlbiBpZiBudm0gZXhpc3RzIGluIHRoZSBudm1fZmlsZSBkcml2ZXIgc2hvdWxkIHJlYWQgYWdhaW4gdGhlIG52bQotCSAqIGZyb20gdGhlIG5pYyBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIGVudHJpZXMgdGhhdCBleGlzdCBpbiB0aGUgT1RQCi0JICogYW5kIG5vdCBpbiB0aGUgZmlsZS4KLQkgKiBmb3IgbmljcyB3aXRoIG5vX3Bvd2VyX3VwX25pY19pbl9pbml0OiByZWx5IGNvbXBsZXRsZXkgb24gbnZtX2ZpbGUKLQkgKi8KLQlpZiAoY2ZnLT5ub19wb3dlcl91cF9uaWNfaW5faW5pdCAmJiBtdm0tPm52bV9maWxlX25hbWUpIHsKLQkJZXJyID0gaXdsX252bV9pbml0KG12bSwgZmFsc2UpOwotCQlpZiAoZXJyKQotCQkJZ290byBvdXRfZnJlZTsKLQl9IGVsc2UgewotCQllcnIgPSBpd2xfdHJhbnNfc3RhcnRfaHcobXZtLT50cmFucyk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dF9mcmVlOwotCi0JCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOwotCQlpd2xfbXZtX3JlZihtdm0sIElXTF9NVk1fUkVGX0lOSVRfVUNPREUpOwotCQllcnIgPSBpd2xfcnVuX2luaXRfbXZtX3Vjb2RlKG12bSwgdHJ1ZSk7Ci0JCWlmICghZXJyIHx8ICFpd2xtdm1fbW9kX3BhcmFtcy5pbml0X2RiZykKLQkJCWl3bF9tdm1fc3RvcF9kZXZpY2UobXZtKTsKLQkJaXdsX212bV91bnJlZihtdm0sIElXTF9NVk1fUkVGX0lOSVRfVUNPREUpOwotCQltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOwotCQkvKiByZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgMSBpZiBzdWNjZXNzIGJ1dCBpbiByZmtpbGwgKi8KLQkJaWYgKGVyciA8IDAgJiYgIWl3bG12bV9tb2RfcGFyYW1zLmluaXRfZGJnKSB7Ci0JCQlJV0xfRVJSKG12bSwgIkZhaWxlZCB0byBydW4gSU5JVCB1Y29kZTogJWRcbiIsIGVycik7Ci0JCQlnb3RvIG91dF9mcmVlOwotCQl9CisJbXV0ZXhfbG9jaygmbXZtLT5tdXRleCk7CisJaXdsX212bV9yZWYobXZtLCBJV0xfTVZNX1JFRl9JTklUX1VDT0RFKTsKKwllcnIgPSBpd2xfcnVuX2luaXRfbXZtX3Vjb2RlKG12bSwgdHJ1ZSk7CisJaWYgKCFlcnIgfHwgIWl3bG12bV9tb2RfcGFyYW1zLmluaXRfZGJnKQorCQlpd2xfbXZtX3N0b3BfZGV2aWNlKG12bSk7CisJaXdsX212bV91bnJlZihtdm0sIElXTF9NVk1fUkVGX0lOSVRfVUNPREUpOworCW11dGV4X3VubG9jaygmbXZtLT5tdXRleCk7CisJLyogcmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIDEgaWYgc3VjY2VzcyBidXQgaW4gcmZraWxsICovCisJaWYgKGVyciA8IDAgJiYgIWl3bG12bV9tb2RfcGFyYW1zLmluaXRfZGJnKSB7CisJCUlXTF9FUlIobXZtLCAiRmFpbGVkIHRvIHJ1biBJTklUIHVjb2RlOiAlZFxuIiwgZXJyKTsKKwkJZ290byBvdXRfZnJlZTsKIAl9CiAKIAlzY2FuX3NpemUgPSBpd2xfbXZtX3NjYW5fc2l6ZShtdm0pOwpAQCAtNzgzLDggKzc2Niw4IEBACiAJZmx1c2hfZGVsYXllZF93b3JrKCZtdm0tPmZ3X2R1bXBfd2spOwogCWl3bF9waHlfZGJfZnJlZShtdm0tPnBoeV9kYik7CiAJa2ZyZWUobXZtLT5zY2FuX2NtZCk7Ci0JaWYgKCFjZmctPm5vX3Bvd2VyX3VwX25pY19pbl9pbml0IHx8ICFtdm0tPm52bV9maWxlX25hbWUpCi0JCWl3bF90cmFuc19vcF9tb2RlX2xlYXZlKHRyYW5zKTsKKwlpd2xfdHJhbnNfb3BfbW9kZV9sZWF2ZSh0cmFucyk7CisKIAlpZWVlODAyMTFfZnJlZV9odyhtdm0tPmh3KTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTg1Nyw5ICs4NDAsNyBAQAogCXN0cnVjdCBpd2xfbXZtICptdm0gPQogCQljb250YWluZXJfb2Yod2ssIHN0cnVjdCBpd2xfbXZtLCBhc3luY19oYW5kbGVyc193ayk7CiAJc3RydWN0IGl3bF9hc3luY19oYW5kbGVyX2VudHJ5ICplbnRyeSwgKnRtcDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxvY2FsX2xpc3Q7Ci0KLQlJTklUX0xJU1RfSEVBRCgmbG9jYWxfbGlzdCk7CisJTElTVF9IRUFEKGxvY2FsX2xpc3QpOwogCiAJLyogRW5zdXJlIHRoYXQgd2UgYXJlIG5vdCBpbiBzdG9wIGZsb3cgKGNoZWNrIGl3bF9tdm1fbWFjX3N0b3ApICovCiAKQEAgLTk2NiwxMCArOTQ3LDExIEBACiB7CiAJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CiAJc3RydWN0IGl3bF9tdm0gKm12bSA9IElXTF9PUF9NT0RFX0dFVF9NVk0ob3BfbW9kZSk7CisJdTE2IGNtZCA9IFdJREVfSUQocGt0LT5oZHIuZ3JvdXBfaWQsIHBrdC0+aGRyLmNtZCk7CiAKLQlpZiAobGlrZWx5KHBrdC0+aGRyLmNtZCA9PSBSRVBMWV9SWF9NUERVX0NNRCkpCisJaWYgKGxpa2VseShjbWQgPT0gV0lERV9JRChMRUdBQ1lfR1JPVVAsIFJFUExZX1JYX01QRFVfQ01EKSkpCiAJCWl3bF9tdm1fcnhfcnhfbXBkdShtdm0sIG5hcGksIHJ4Yik7Ci0JZWxzZSBpZiAocGt0LT5oZHIuY21kID09IFJFUExZX1JYX1BIWV9DTUQpCisJZWxzZSBpZiAoY21kID09IFdJREVfSUQoTEVHQUNZX0dST1VQLCBSRVBMWV9SWF9QSFlfQ01EKSkKIAkJaXdsX212bV9yeF9yeF9waHlfY21kKG12bSwgcnhiKTsKIAllbHNlCiAJCWl3bF9tdm1fcnhfY29tbW9uKG12bSwgcnhiLCBwa3QpOwpAQCAtOTgxLDEzICs5NjMsMTQgQEAKIHsKIAlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKIAlzdHJ1Y3QgaXdsX212bSAqbXZtID0gSVdMX09QX01PREVfR0VUX01WTShvcF9tb2RlKTsKKwl1MTYgY21kID0gV0lERV9JRChwa3QtPmhkci5ncm91cF9pZCwgcGt0LT5oZHIuY21kKTsKIAotCWlmIChsaWtlbHkocGt0LT5oZHIuY21kID09IFJFUExZX1JYX01QRFVfQ01EKSkKKwlpZiAobGlrZWx5KGNtZCA9PSBXSURFX0lEKExFR0FDWV9HUk9VUCwgUkVQTFlfUlhfTVBEVV9DTUQpKSkKIAkJaXdsX212bV9yeF9tcGR1X21xKG12bSwgbmFwaSwgcnhiLCAwKTsKLQllbHNlIGlmICh1bmxpa2VseShwa3QtPmhkci5ncm91cF9pZCA9PSBEQVRBX1BBVEhfR1JPVVAgJiYKLQkJCSAgcGt0LT5oZHIuY21kID09IFJYX1FVRVVFU19OT1RJRklDQVRJT04pKQorCWVsc2UgaWYgKHVubGlrZWx5KGNtZCA9PSBXSURFX0lEKERBVEFfUEFUSF9HUk9VUCwKKwkJCQkJIFJYX1FVRVVFU19OT1RJRklDQVRJT04pKSkKIAkJaXdsX212bV9yeF9xdWV1ZV9ub3RpZihtdm0sIHJ4YiwgMCk7Ci0JZWxzZSBpZiAocGt0LT5oZHIuY21kID09IEZSQU1FX1JFTEVBU0UpCisJZWxzZSBpZiAoY21kID09IFdJREVfSUQoTEVHQUNZX0dST1VQLCBGUkFNRV9SRUxFQVNFKSkKIAkJaXdsX212bV9yeF9mcmFtZV9yZWxlYXNlKG12bSwgbmFwaSwgcnhiLCAwKTsKIAllbHNlCiAJCWl3bF9tdm1fcnhfY29tbW9uKG12bSwgcnhiLCBwa3QpOwpAQCAtMTY2NiwxMyArMTY0OSwxNCBAQAogewogCXN0cnVjdCBpd2xfbXZtICptdm0gPSBJV0xfT1BfTU9ERV9HRVRfTVZNKG9wX21vZGUpOwogCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXUxNiBjbWQgPSBXSURFX0lEKHBrdC0+aGRyLmdyb3VwX2lkLCBwa3QtPmhkci5jbWQpOwogCi0JaWYgKHVubGlrZWx5KHBrdC0+aGRyLmNtZCA9PSBGUkFNRV9SRUxFQVNFKSkKKwlpZiAodW5saWtlbHkoY21kID09IFdJREVfSUQoTEVHQUNZX0dST1VQLCBGUkFNRV9SRUxFQVNFKSkpCiAJCWl3bF9tdm1fcnhfZnJhbWVfcmVsZWFzZShtdm0sIG5hcGksIHJ4YiwgcXVldWUpOwotCWVsc2UgaWYgKHVubGlrZWx5KHBrdC0+aGRyLmNtZCA9PSBSWF9RVUVVRVNfTk9USUZJQ0FUSU9OICYmCi0JCQkgIHBrdC0+aGRyLmdyb3VwX2lkID09IERBVEFfUEFUSF9HUk9VUCkpCisJZWxzZSBpZiAodW5saWtlbHkoY21kID09IFdJREVfSUQoREFUQV9QQVRIX0dST1VQLAorCQkJCQkgUlhfUVVFVUVTX05PVElGSUNBVElPTikpKQogCQlpd2xfbXZtX3J4X3F1ZXVlX25vdGlmKG12bSwgcnhiLCBxdWV1ZSk7Ci0JZWxzZQorCWVsc2UgaWYgKGxpa2VseShjbWQgPT0gV0lERV9JRChMRUdBQ1lfR1JPVVAsIFJFUExZX1JYX01QRFVfQ01EKSkpCiAJCWl3bF9tdm1fcnhfbXBkdV9tcShtdm0sIG5hcGksIHJ4YiwgcXVldWUpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9wb3dlci5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vcG93ZXIuYwppbmRleCBmZjg1ODY1Li5hZjZkMTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9wb3dlci5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3Bvd2VyLmMKQEAgLTY5NCw4ICs2OTQsNyBAQAogCiAJLyogZW5hYmxlIFBNIG9uIHAycCBpZiBwMnAgc3RhbmQgYWxvbmUgKi8KIAlpZiAodmlmcy0+cDJwX2FjdGl2ZSAmJiAhdmlmcy0+YnNzX2FjdGl2ZSAmJiAhdmlmcy0+YXBfYWN0aXZlKSB7Ci0JCWlmIChtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19QMlBfUE0pCi0JCQlwMnBfbXZtdmlmLT5wbV9lbmFibGVkID0gdHJ1ZTsKKwkJcDJwX212bXZpZi0+cG1fZW5hYmxlZCA9IHRydWU7CiAJCXJldHVybjsKIAl9CiAKQEAgLTcwNywxMiArNzA2LDEwIEBACiAJCQkJICAgYXBfbXZtdmlmLT5waHlfY3R4dC0+aWQpOwogCiAJLyogY2xpZW50cyBhcmUgbm90IHN0YW5kIGFsb25lOiBlbmFibGUgUE0gaWYgRENNICovCi0JaWYgKCEoY2xpZW50X3NhbWVfY2hhbm5lbCB8fCBhcF9zYW1lX2NoYW5uZWwpICYmCi0JICAgIChtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19CU1NfUDJQX1BTX0RDTSkpIHsKKwlpZiAoIShjbGllbnRfc2FtZV9jaGFubmVsIHx8IGFwX3NhbWVfY2hhbm5lbCkpIHsKIAkJaWYgKHZpZnMtPmJzc19hY3RpdmUpCiAJCQlic3NfbXZtdmlmLT5wbV9lbmFibGVkID0gdHJ1ZTsKLQkJaWYgKHZpZnMtPnAycF9hY3RpdmUgJiYKLQkJICAgIChtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19QMlBfUE0pKQorCQlpZiAodmlmcy0+cDJwX2FjdGl2ZSkKIAkJCXAycF9tdm12aWYtPnBtX2VuYWJsZWQgPSB0cnVlOwogCQlyZXR1cm47CiAJfQpAQCAtNzIxLDEyICs3MTgsMTAgQEAKIAkgKiBUaGVyZSBpcyBvbmx5IG9uZSBjaGFubmVsIGluIHRoZSBzeXN0ZW0gYW5kIHRoZXJlIGFyZSBvbmx5CiAJICogYnNzIGFuZCBwMnAgY2xpZW50cyB0aGF0IHNoYXJlIGl0CiAJICovCi0JaWYgKGNsaWVudF9zYW1lX2NoYW5uZWwgJiYgIXZpZnMtPmFwX2FjdGl2ZSAmJgotCSAgICAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfQlNTX1AyUF9QU19TQ00pKSB7CisJaWYgKGNsaWVudF9zYW1lX2NoYW5uZWwgJiYgIXZpZnMtPmFwX2FjdGl2ZSkgewogCQkvKiBzaGFyZSBzYW1lIGNoYW5uZWwqLwogCQlic3NfbXZtdmlmLT5wbV9lbmFibGVkID0gdHJ1ZTsKLQkJaWYgKG12bS0+ZnctPnVjb2RlX2NhcGEuZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX1AyUF9QTSkKLQkJCXAycF9tdm12aWYtPnBtX2VuYWJsZWQgPSB0cnVlOworCQlwMnBfbXZtdmlmLT5wbV9lbmFibGVkID0gdHJ1ZTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3J4bXEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3J4bXEuYwppbmRleCBkZjZjMzJjLi5hNTdjNmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9yeG1xLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vcnhtcS5jCkBAIC0xMzIsNyArMTMyLDggQEAKIAkJICAgSUVFRTgwMjExX0NDTVBfUE5fTEVOKSA8PSAwKQogCQlyZXR1cm4gLTE7CiAKLQltZW1jcHkocHRrX3BuLT5xW3F1ZXVlXS5wblt0aWRdLCBwbiwgSUVFRTgwMjExX0NDTVBfUE5fTEVOKTsKKwlpZiAoIShzdGF0cy0+ZmxhZyAmIFJYX0ZMQUdfQU1TRFVfTU9SRSkpCisJCW1lbWNweShwdGtfcG4tPnFbcXVldWVdLnBuW3RpZF0sIHBuLCBJRUVFODAyMTFfQ0NNUF9QTl9MRU4pOwogCXN0YXRzLT5mbGFnIHw9IFJYX0ZMQUdfUE5fVkFMSURBVEVEOwogCiAJcmV0dXJuIDA7CkBAIC00MTcsMTAgKzQxOCwxMSBAQAogCiAJCXNzbiA9IGllZWU4MDIxMV9zbl9pbmMoc3NuKTsKIAotCQkvKiBob2xlcyBhcmUgdmFsaWQgc2luY2UgbnNzbiBpbmRpY2F0ZXMgZnJhbWVzIHdlcmUgcmVjZWl2ZWQuICovCi0JCWlmIChza2JfcXVldWVfZW1wdHkoc2tiX2xpc3QpIHx8ICFza2JfcGVla190YWlsKHNrYl9saXN0KSkKLQkJCWNvbnRpbnVlOwotCQkvKiBFbXB0eSB0aGUgbGlzdC4gV2lsbCBoYXZlIG1vcmUgdGhhbiBvbmUgZnJhbWUgZm9yIEEtTVNEVSAqLworCQkvKgorCQkgKiBFbXB0eSB0aGUgbGlzdC4gV2lsbCBoYXZlIG1vcmUgdGhhbiBvbmUgZnJhbWUgZm9yIEEtTVNEVS4KKwkJICogRW1wdHkgbGlzdCBpcyB2YWxpZCBhcyB3ZWxsIHNpbmNlIG5zc24gaW5kaWNhdGVzIGZyYW1lcyB3ZXJlCisJCSAqIHJlY2VpdmVkLgorCQkgKi8KIAkJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKHNrYl9saXN0KSkpIHsKIAkJCWl3bF9tdm1fcGFzc19wYWNrZXRfdG9fbWFjODAyMTEobXZtLCBuYXBpLCBza2IsCiAJCQkJCQkJcmVvcmRlcl9idWYtPnF1ZXVlLApAQCAtNDMzLDcgKzQzNSw3IEBACiAJaWYgKHJlb3JkZXJfYnVmLT5udW1fc3RvcmVkICYmICFyZW9yZGVyX2J1Zi0+cmVtb3ZlZCkgewogCQl1MTYgaW5kZXggPSByZW9yZGVyX2J1Zi0+aGVhZF9zbiAlIHJlb3JkZXJfYnVmLT5idWZfc2l6ZTsKIAotCQl3aGlsZSAoIXNrYl9wZWVrX3RhaWwoJnJlb3JkZXJfYnVmLT5lbnRyaWVzW2luZGV4XSkpCisJCXdoaWxlIChza2JfcXVldWVfZW1wdHkoJnJlb3JkZXJfYnVmLT5lbnRyaWVzW2luZGV4XSkpCiAJCQlpbmRleCA9IChpbmRleCArIDEpICUgcmVvcmRlcl9idWYtPmJ1Zl9zaXplOwogCQkvKiBtb2RpZnkgdGltZXIgdG8gbWF0Y2ggbmV4dCBmcmFtZSdzIGV4cGlyYXRpb24gdGltZSAqLwogCQltb2RfdGltZXIoJnJlb3JkZXJfYnVmLT5yZW9yZGVyX3RpbWVyLApAQCAtNDUxLDE3ICs0NTMsMTcgQEAKIAl1MTYgc24gPSAwLCBpbmRleCA9IDA7CiAJYm9vbCBleHBpcmVkID0gZmFsc2U7CiAKLQlzcGluX2xvY2tfYmgoJmJ1Zi0+bG9jayk7CisJc3Bpbl9sb2NrKCZidWYtPmxvY2spOwogCiAJaWYgKCFidWYtPm51bV9zdG9yZWQgfHwgYnVmLT5yZW1vdmVkKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZidWYtPmxvY2spOworCQlzcGluX3VubG9jaygmYnVmLT5sb2NrKTsKIAkJcmV0dXJuOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBidWYtPmJ1Zl9zaXplIDsgaSsrKSB7CiAJCWluZGV4ID0gKGJ1Zi0+aGVhZF9zbiArIGkpICUgYnVmLT5idWZfc2l6ZTsKIAotCQlpZiAoIXNrYl9wZWVrX3RhaWwoJmJ1Zi0+ZW50cmllc1tpbmRleF0pKQorCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZidWYtPmVudHJpZXNbaW5kZXhdKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoIXRpbWVfYWZ0ZXIoamlmZmllcywgYnVmLT5yZW9yZGVyX3RpbWVbaW5kZXhdICsKIAkJCQlSWF9SRU9SREVSX0JVRl9USU1FT1VUX01RKSkKQEAgLTQ5MSw3ICs0OTMsNyBAQAogCQkJICBidWYtPnJlb3JkZXJfdGltZVtpbmRleF0gKwogCQkJICAxICsgUlhfUkVPUkRFUl9CVUZfVElNRU9VVF9NUSk7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZidWYtPmxvY2spOworCXNwaW5fdW5sb2NrKCZidWYtPmxvY2spOwogfQogCiBzdGF0aWMgdm9pZCBpd2xfbXZtX2RlbF9iYShzdHJ1Y3QgaXdsX212bSAqbXZtLCBpbnQgcXVldWUsCkBAIC01MDIsNyArNTA0LDcgQEAKIAlzdHJ1Y3QgaXdsX212bV9yZW9yZGVyX2J1ZmZlciAqcmVvcmRlcl9idWY7CiAJdTggYmFpZCA9IGRhdGEtPmJhaWQ7CiAKLQlpZiAoV0FSTl9PTl9PTkNFKGJhaWQgPj0gSVdMX1JYX1JFT1JERVJfREFUQV9JTlZBTElEX0JBSUQpKQorCWlmIChXQVJOX09OQ0UoYmFpZCA+PSBJV0xfTUFYX0JBSUQsICJpbnZhbGlkIEJBSUQ6ICV4XG4iLCBiYWlkKSkKIAkJcmV0dXJuOwogCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtNTg5LDYgKzU5MSwxMSBAQAogCWJhaWQgPSAocmVvcmRlciAmIElXTF9SWF9NUERVX1JFT1JERVJfQkFJRF9NQVNLKSA+PgogCQlJV0xfUlhfTVBEVV9SRU9SREVSX0JBSURfU0hJRlQ7CiAKKwkvKgorCSAqIFRoaXMgYWxzbyBjb3ZlcnMgdGhlIGNhc2Ugb2YgcmVjZWl2aW5nIGEgQmxvY2sgQWNrIFJlcXVlc3QKKwkgKiBvdXRzaWRlIGEgQkEgc2Vzc2lvbjsgd2UnbGwgcGFzcyBpdCB0byBtYWM4MDIxMSBhbmQgdGhhdAorCSAqIHRoZW4gc2VuZHMgYSBkZWxCQSBhY3Rpb24gZnJhbWUuCisJICovCiAJaWYgKGJhaWQgPT0gSVdMX1JYX1JFT1JERVJfREFUQV9JTlZBTElEX0JBSUQpCiAJCXJldHVybiBmYWxzZTsKIApAQCAtNTk4LDkgKzYwNSwxMCBAQAogCiAJbXZtX3N0YSA9IGl3bF9tdm1fc3RhX2Zyb21fbWFjODAyMTEoc3RhKTsKIAotCS8qIG5vdCBhIGRhdGEgcGFja2V0ICovCi0JaWYgKCFpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSB8fAotCSAgICBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkKKwkvKiBub3QgYSBkYXRhIHBhY2tldCBvciBhIGJhciAqLworCWlmICghaWVlZTgwMjExX2lzX2JhY2tfcmVxKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKKwkgICAgKCFpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSB8fAorCSAgICAgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpKQogCQlyZXR1cm4gZmFsc2U7CiAKIAlpZiAodW5saWtlbHkoIWllZWU4MDIxMV9pc19kYXRhX3ByZXNlbnQoaGRyLT5mcmFtZV9jb250cm9sKSkpCkBAIC02MjQsNiArNjMyLDExIEBACiAKIAlzcGluX2xvY2tfYmgoJmJ1ZmZlci0+bG9jayk7CiAKKwlpZiAoaWVlZTgwMjExX2lzX2JhY2tfcmVxKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKKwkJaXdsX212bV9yZWxlYXNlX2ZyYW1lcyhtdm0sIHN0YSwgbmFwaSwgYnVmZmVyLCBuc3NuKTsKKwkJZ290byBkcm9wOworCX0KKwogCS8qCiAJICogSWYgdGhlcmUgd2FzIGEgc2lnbmlmaWNhbnQganVtcCBpbiB0aGUgbnNzbiAtIGFkanVzdC4KIAkgKiBJZiB0aGUgU04gaXMgc21hbGxlciB0aGFuIHRoZSBOU1NOIGl0IG1pZ2h0IG5lZWQgdG8gZmlyc3QgZ28gaW50bwpAQCAtODgzLDYgKzg5Niw5IEBACiAJCQl1OCAqcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKIAogCQkJKnFjICY9IH5JRUVFODAyMTFfUU9TX0NUTF9BX01TRFVfUFJFU0VOVDsKKwkJCWlmICghKGRlc2MtPmFtc2R1X2luZm8gJgorCQkJICAgICAgSVdMX1JYX01QRFVfQU1TRFVfTEFTVF9TVUJGUkFNRSkpCisJCQkJcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfQU1TRFVfTU9SRTsKIAkJfQogCQlpZiAoYmFpZCAhPSBJV0xfUlhfUkVPUkRFUl9EQVRBX0lOVkFMSURfQkFJRCkKIAkJCWl3bF9tdm1fYWdnX3J4X3JlY2VpdmVkKG12bSwgYmFpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9zY2FuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9zY2FuLmMKaW5kZXggZGFjMTIwZi4uZjI3OWZkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vc2Nhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3NjYW4uYwpAQCAtMTQxLDYgKzE0MSw3IEBACiAJc3RydWN0IGNmZzgwMjExX21hdGNoX3NldCAqbWF0Y2hfc2V0czsKIAlpbnQgbl9zY2FuX3BsYW5zOwogCXN0cnVjdCBjZmc4MDIxMV9zY2hlZF9zY2FuX3BsYW4gKnNjYW5fcGxhbnM7CisJdTMyIG1lYXN1cmVtZW50X2R3ZWxsOwogfTsKIAogc3RhdGljIHU4IGl3bF9tdm1fc2Nhbl9yeF9hbnQoc3RydWN0IGl3bF9tdm0gKm12bSkKQEAgLTIzMiw2ICsyMzMsMjcgQEAKIAlyZXR1cm4gSVdMX1NDQU5fVFlQRV9XSUxEOwogfQogCitzdGF0aWMgaW50Citpd2xfbXZtX2dldF9tZWFzdXJlbWVudF9kd2VsbChzdHJ1Y3QgaXdsX212bSAqbXZtLAorCQkJICAgICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxLAorCQkJICAgICAgc3RydWN0IGl3bF9tdm1fc2Nhbl9wYXJhbXMgKnBhcmFtcykKK3sKKwlpZiAoIXJlcS0+ZHVyYXRpb24pCisJCXJldHVybiAwOworCisJaWYgKHJlcS0+ZHVyYXRpb25fbWFuZGF0b3J5ICYmCisJICAgIHJlcS0+ZHVyYXRpb24gPiBzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLm1heF9vdXRfdGltZSkgeworCQlJV0xfREVCVUdfU0NBTihtdm0sCisJCQkgICAgICAgIk1lYXN1cmVtZW50IHNjYW4gLSB0b28gbG9uZyBkd2VsbCAlaHUgKG1heCBvdXQgdGltZSAldSlcbiIsCisJCQkgICAgICAgcmVxLT5kdXJhdGlvbiwKKwkJCSAgICAgICBzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLm1heF9vdXRfdGltZSk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gbWluX3QodTMyLCAodTMyKXJlcS0+ZHVyYXRpb24sCisJCSAgICAgc2Nhbl90aW1pbmdbcGFyYW1zLT50eXBlXS5tYXhfb3V0X3RpbWUpOworfQorCiBzdGF0aWMgaW5saW5lIGJvb2wgaXdsX212bV9ycm1fc2Nhbl9uZWVkZWQoc3RydWN0IGl3bF9tdm0gKm12bSkKIHsKIAkvKiByZXF1aXJlIHJybSBzY2FuIHdoZW5ldmVyIHRoZSBmdyBzdXBwb3J0cyBpdCAqLwpAQCAtNzE3LDIyICs3MzksNiBAQAogCXBhcmFtcy0+cHJlcS5jb21tb25fZGF0YS5sZW4gPSBjcHVfdG9fbGUxNihpZXMtPmNvbW1vbl9pZV9sZW4pOwogfQogCi1zdGF0aWMgX19sZTMyIGl3bF9tdm1fc2Nhbl9wcmlvcml0eShzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkJCSAgICBlbnVtIGl3bF9zY2FuX3ByaW9yaXR5X2V4dCBwcmlvKQotewotCWlmIChmd19oYXNfYXBpKCZtdm0tPmZ3LT51Y29kZV9jYXBhLAotCQkgICAgICAgSVdMX1VDT0RFX1RMVl9BUElfRVhUX1NDQU5fUFJJT1JJVFkpKQotCQlyZXR1cm4gY3B1X3RvX2xlMzIocHJpbyk7Ci0KLQlpZiAocHJpbyA8PSBJV0xfU0NBTl9QUklPUklUWV9FWFRfMikKLQkJcmV0dXJuIGNwdV90b19sZTMyKElXTF9TQ0FOX1BSSU9SSVRZX0xPVyk7Ci0KLQlpZiAocHJpbyA8PSBJV0xfU0NBTl9QUklPUklUWV9FWFRfNCkKLQkJcmV0dXJuIGNwdV90b19sZTMyKElXTF9TQ0FOX1BSSU9SSVRZX01FRElVTSk7Ci0KLQlyZXR1cm4gY3B1X3RvX2xlMzIoSVdMX1NDQU5fUFJJT1JJVFlfSElHSCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGl3bF9tdm1fc2Nhbl9sbWFjX2R3ZWxsKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkJICAgIHN0cnVjdCBpd2xfc2Nhbl9yZXFfbG1hYyAqY21kLAogCQkJCSAgICBzdHJ1Y3QgaXdsX212bV9zY2FuX3BhcmFtcyAqcGFyYW1zKQpAQCAtNzQzLDcgKzc0OSw3IEBACiAJY21kLT5leHRlbmRlZF9kd2VsbCA9IHNjYW5fdGltaW5nW3BhcmFtcy0+dHlwZV0uZHdlbGxfZXh0ZW5kZWQ7CiAJY21kLT5tYXhfb3V0X3RpbWUgPSBjcHVfdG9fbGUzMihzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLm1heF9vdXRfdGltZSk7CiAJY21kLT5zdXNwZW5kX3RpbWUgPSBjcHVfdG9fbGUzMihzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLnN1c3BlbmRfdGltZSk7Ci0JY21kLT5zY2FuX3ByaW8gPSBpd2xfbXZtX3NjYW5fcHJpb3JpdHkobXZtLCBJV0xfU0NBTl9QUklPUklUWV9FWFRfNik7CisJY21kLT5zY2FuX3ByaW8gPSBjcHVfdG9fbGUzMihJV0xfU0NBTl9QUklPUklUWV9FWFRfNik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBpd2xfbXZtX3NjYW5fZml0cyhzdHJ1Y3QgaXdsX212bSAqbXZtLCBpbnQgbl9zc2lkcywKQEAgLTEwMzMsMjEgKzEwMzksMjQgQEAKIAkJCQkgICAgc3RydWN0IGl3bF9zY2FuX3JlcV91bWFjICpjbWQsCiAJCQkJICAgIHN0cnVjdCBpd2xfbXZtX3NjYW5fcGFyYW1zICpwYXJhbXMpCiB7Ci0JY21kLT5leHRlbmRlZF9kd2VsbCA9IHNjYW5fdGltaW5nW3BhcmFtcy0+dHlwZV0uZHdlbGxfZXh0ZW5kZWQ7Ci0JY21kLT5hY3RpdmVfZHdlbGwgPSBzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLmR3ZWxsX2FjdGl2ZTsKLQljbWQtPnBhc3NpdmVfZHdlbGwgPSBzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLmR3ZWxsX3Bhc3NpdmU7CisJaWYgKHBhcmFtcy0+bWVhc3VyZW1lbnRfZHdlbGwpIHsKKwkJY21kLT5hY3RpdmVfZHdlbGwgPSBwYXJhbXMtPm1lYXN1cmVtZW50X2R3ZWxsOworCQljbWQtPnBhc3NpdmVfZHdlbGwgPSBwYXJhbXMtPm1lYXN1cmVtZW50X2R3ZWxsOworCQljbWQtPmV4dGVuZGVkX2R3ZWxsID0gcGFyYW1zLT5tZWFzdXJlbWVudF9kd2VsbDsKKwl9IGVsc2UgeworCQljbWQtPmFjdGl2ZV9kd2VsbCA9IHNjYW5fdGltaW5nW3BhcmFtcy0+dHlwZV0uZHdlbGxfYWN0aXZlOworCQljbWQtPnBhc3NpdmVfZHdlbGwgPSBzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLmR3ZWxsX3Bhc3NpdmU7CisJCWNtZC0+ZXh0ZW5kZWRfZHdlbGwgPSBzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLmR3ZWxsX2V4dGVuZGVkOworCX0KIAljbWQtPmZyYWdtZW50ZWRfZHdlbGwgPSBzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLmR3ZWxsX2ZyYWdtZW50ZWQ7CiAJY21kLT5tYXhfb3V0X3RpbWUgPSBjcHVfdG9fbGUzMihzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLm1heF9vdXRfdGltZSk7CiAJY21kLT5zdXNwZW5kX3RpbWUgPSBjcHVfdG9fbGUzMihzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLnN1c3BlbmRfdGltZSk7Ci0JY21kLT5zY2FuX3ByaW9yaXR5ID0KLQkJaXdsX212bV9zY2FuX3ByaW9yaXR5KG12bSwgSVdMX1NDQU5fUFJJT1JJVFlfRVhUXzYpOworCWNtZC0+c2Nhbl9wcmlvcml0eSA9IGNwdV90b19sZTMyKElXTF9TQ0FOX1BSSU9SSVRZX0VYVF82KTsKIAogCWlmIChpd2xfbXZtX2lzX3JlZ3VsYXJfc2NhbihwYXJhbXMpKQotCQljbWQtPm9vY19wcmlvcml0eSA9Ci0JCQlpd2xfbXZtX3NjYW5fcHJpb3JpdHkobXZtLCBJV0xfU0NBTl9QUklPUklUWV9FWFRfNik7CisJCWNtZC0+b29jX3ByaW9yaXR5ID0gY3B1X3RvX2xlMzIoSVdMX1NDQU5fUFJJT1JJVFlfRVhUXzYpOwogCWVsc2UKLQkJY21kLT5vb2NfcHJpb3JpdHkgPQotCQkJaXdsX212bV9zY2FuX3ByaW9yaXR5KG12bSwgSVdMX1NDQU5fUFJJT1JJVFlfRVhUXzIpOworCQljbWQtPm9vY19wcmlvcml0eSA9IGNwdV90b19sZTMyKElXTF9TQ0FOX1BSSU9SSVRZX0VYVF8yKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTEwNjcsMTEgKzEwNzYsMTEgQEAKIAl9CiB9CiAKLXN0YXRpYyB1MzIgaXdsX212bV9zY2FuX3VtYWNfZmxhZ3Moc3RydWN0IGl3bF9tdm0gKm12bSwKK3N0YXRpYyB1MTYgaXdsX212bV9zY2FuX3VtYWNfZmxhZ3Moc3RydWN0IGl3bF9tdm0gKm12bSwKIAkJCQkgICBzdHJ1Y3QgaXdsX212bV9zY2FuX3BhcmFtcyAqcGFyYW1zLAogCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCiB7Ci0JaW50IGZsYWdzID0gMDsKKwl1MTYgZmxhZ3MgPSAwOwogCiAJaWYgKHBhcmFtcy0+bl9zc2lkcyA9PSAwKQogCQlmbGFncyA9IElXTF9VTUFDX1NDQU5fR0VOX0ZMQUdTX1BBU1NJVkU7CkBAIC0xMDkzLDYgKzExMDIsOSBAQAogCWlmICghaXdsX212bV9pc19yZWd1bGFyX3NjYW4ocGFyYW1zKSkKIAkJZmxhZ3MgfD0gSVdMX1VNQUNfU0NBTl9HRU5fRkxBR1NfUEVSSU9ESUM7CiAKKwlpZiAocGFyYW1zLT5tZWFzdXJlbWVudF9kd2VsbCkKKwkJZmxhZ3MgfD0gSVdMX1VNQUNfU0NBTl9HRU5fRkxBR1NfSVRFUl9DT01QTEVURTsKKwogI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHRlMKIAlpZiAobXZtLT5zY2FuX2l0ZXJfbm90aWZfZW5hYmxlZCkKIAkJZmxhZ3MgfD0gSVdMX1VNQUNfU0NBTl9HRU5fRkxBR1NfSVRFUl9DT01QTEVURTsKQEAgLTExMTksNiArMTEzMSw3IEBACiAJCQltdm0tPmZ3LT51Y29kZV9jYXBhLm5fc2Nhbl9jaGFubmVsczsKIAlpbnQgdWlkLCBpOwogCXUzMiBzc2lkX2JpdG1hcCA9IDA7CisJc3RydWN0IGl3bF9tdm1fdmlmICpzY2FuX3ZpZiA9IGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmKTsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOwogCkBAIC0xMTM2LDggKzExNDksOSBAQAogCW12bS0+c2Nhbl91aWRfc3RhdHVzW3VpZF0gPSB0eXBlOwogCiAJY21kLT51aWQgPSBjcHVfdG9fbGUzMih1aWQpOwotCWNtZC0+Z2VuZXJhbF9mbGFncyA9IGNwdV90b19sZTMyKGl3bF9tdm1fc2Nhbl91bWFjX2ZsYWdzKG12bSwgcGFyYW1zLAorCWNtZC0+Z2VuZXJhbF9mbGFncyA9IGNwdV90b19sZTE2KGl3bF9tdm1fc2Nhbl91bWFjX2ZsYWdzKG12bSwgcGFyYW1zLAogCQkJCQkJCQkgdmlmKSk7CisJY21kLT5zY2FuX3N0YXJ0X21hY19pZCA9IHNjYW5fdmlmLT5pZDsKIAogCWlmICh0eXBlID09IElXTF9NVk1fU0NBTl9TQ0hFRCB8fCB0eXBlID09IElXTF9NVk1fU0NBTl9ORVRERVRFQ1QpCiAJCWNtZC0+ZmxhZ3MgPSBjcHVfdG9fbGUzMihJV0xfVU1BQ19TQ0FOX0ZMQUdfUFJFRU1QVElWRSk7CkBAIC0xMjg5LDYgKzEzMDMsMTIgQEAKIAkJaXdsX212bV9nZXRfc2Nhbl90eXBlKG12bSwKIAkJCQkgICAgICB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSk7CiAKKwlyZXQgPSBpd2xfbXZtX2dldF9tZWFzdXJlbWVudF9kd2VsbChtdm0sIHJlcSwgJnBhcmFtcyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlwYXJhbXMubWVhc3VyZW1lbnRfZHdlbGwgPSByZXQ7CisKIAlpd2xfbXZtX2J1aWxkX3NjYW5fcHJvYmUobXZtLCB2aWYsIGllcywgJnBhcmFtcyk7CiAKIAlpZiAoZndfaGFzX2NhcGEoJm12bS0+ZnctPnVjb2RlX2NhcGEsIElXTF9VQ09ERV9UTFZfQ0FQQV9VTUFDX1NDQU4pKSB7CkBAIC0xMzE1LDYgKzEzMzUsNyBAQAogCiAJSVdMX0RFQlVHX1NDQU4obXZtLCAiU2NhbiByZXF1ZXN0IHdhcyBzZW50IHN1Y2Nlc3NmdWxseVxuIik7CiAJbXZtLT5zY2FuX3N0YXR1cyB8PSBJV0xfTVZNX1NDQU5fUkVHVUxBUjsKKwltdm0tPnNjYW5fdmlmID0gaXdsX212bV92aWZfZnJvbV9tYWM4MDIxMSh2aWYpOwogCWl3bF9tdm1fcmVmKG12bSwgSVdMX01WTV9SRUZfU0NBTik7CiAKIAlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3dxLCAmbXZtLT5zY2FuX3RpbWVvdXRfZHdvcmssCkBAIC0xNDM3LDkgKzE0NTgsMTIgQEAKIAlpZiAobXZtLT5zY2FuX3VpZF9zdGF0dXNbdWlkXSA9PSBJV0xfTVZNX1NDQU5fUkVHVUxBUikgewogCQlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9pbmZvIGluZm8gPSB7CiAJCQkuYWJvcnRlZCA9IGFib3J0ZWQsCisJCQkuc2Nhbl9zdGFydF90c2YgPSBtdm0tPnNjYW5fc3RhcnQsCiAJCX07CiAKKwkJbWVtY3B5KGluZm8udHNmX2Jzc2lkLCBtdm0tPnNjYW5fdmlmLT5ic3NpZCwgRVRIX0FMRU4pOwogCQlpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQobXZtLT5odywgJmluZm8pOworCQltdm0tPnNjYW5fdmlmID0gTlVMTDsKIAkJaXdsX212bV91bnJlZihtdm0sIElXTF9NVk1fUkVGX1NDQU4pOwogCQljYW5jZWxfZGVsYXllZF93b3JrKCZtdm0tPnNjYW5fdGltZW91dF9kd29yayk7CiAJfSBlbHNlIGlmIChtdm0tPnNjYW5fdWlkX3N0YXR1c1t1aWRdID09IElXTF9NVk1fU0NBTl9TQ0hFRCkgewpAQCAtMTQ3Myw2ICsxNDk3LDggQEAKIAlzdHJ1Y3QgaXdsX3VtYWNfc2Nhbl9pdGVyX2NvbXBsZXRlX25vdGlmICpub3RpZiA9ICh2b2lkICopcGt0LT5kYXRhOwogCXU4IGJ1ZlsyNTZdOwogCisJbXZtLT5zY2FuX3N0YXJ0ID0gbGU2NF90b19jcHUobm90aWYtPnN0YXJ0X3RzZik7CisKIAlJV0xfREVCVUdfU0NBTihtdm0sCiAJCSAgICAgICAiVU1BQyBTY2FuIGl0ZXJhdGlvbiBjb21wbGV0ZTogc3RhdHVzPTB4JXggc2Nhbm5lZF9jaGFubmVscz0lZCBjaGFubmVscyBsaXN0OiAlc1xuIiwKIAkJICAgICAgIG5vdGlmLT5zdGF0dXMsIG5vdGlmLT5zY2FubmVkX2NoYW5uZWxzLApAQCAtMTQ4NSw2ICsxNTExLDEwIEBACiAJCWllZWU4MDIxMV9zY2hlZF9zY2FuX3Jlc3VsdHMobXZtLT5odyk7CiAJCW12bS0+c2NoZWRfc2Nhbl9wYXNzX2FsbCA9IFNDSEVEX1NDQU5fUEFTU19BTExfRU5BQkxFRDsKIAl9CisKKwlJV0xfREVCVUdfU0NBTihtdm0sCisJCSAgICAgICAiVU1BQyBTY2FuIGl0ZXJhdGlvbiBjb21wbGV0ZTogc2NhbiBzdGFydGVkIGF0ICVsbHUgKFRTRilcbiIsCisJCSAgICAgICBtdm0tPnNjYW5fc3RhcnQpOwogfQogCiBzdGF0aWMgaW50IGl3bF9tdm1fdW1hY19zY2FuX2Fib3J0KHN0cnVjdCBpd2xfbXZtICptdm0sIGludCB0eXBlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vc3RhLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9zdGEuYwppbmRleCAzMTMwYjljLi5mYzc3MTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9zdGEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9zdGEuYwpAQCAtNDY4LDYgKzQ2OCwxMSBAQAogCQkgICAgaSAhPSBJV0xfTVZNX0RRQV9CU1NfQ0xJRU5UX1FVRVVFKQogCQkJY29udGludWU7CiAKKwkJLyogRG9uJ3QgdHJ5IGFuZCB0YWtlIHF1ZXVlcyBiZWluZyByZWNvbmZpZ3VyZWQgKi8KKwkJaWYgKG12bS0+cXVldWVfaW5mb1txdWV1ZV0uc3RhdHVzID09CisJCSAgICBJV0xfTVZNX1FVRVVFX1JFQ09ORklHVVJJTkcpCisJCQljb250aW51ZTsKKwogCQlhY190b19xdWV1ZVttdm0tPnF1ZXVlX2luZm9baV0ubWFjODAyMTFfYWNdID0gaTsKIAl9CiAKQEAgLTUwMSwzMSArNTA2LDM3IEBACiAJCXF1ZXVlID0gYWNfdG9fcXVldWVbSUVFRTgwMjExX0FDX1ZPXTsKIAogCS8qIE1ha2Ugc3VyZSBxdWV1ZSBmb3VuZCAob3Igbm90KSBpcyBsZWdhbCAqLwotCWlmICghKChxdWV1ZSA+PSBJV0xfTVZNX0RRQV9NSU5fTUdNVF9RVUVVRSAmJgotCSAgICAgICBxdWV1ZSA8PSBJV0xfTVZNX0RRQV9NQVhfTUdNVF9RVUVVRSkgfHwKLQkgICAgICAocXVldWUgPj0gSVdMX01WTV9EUUFfTUlOX0RBVEFfUVVFVUUgJiYKLQkgICAgICAgcXVldWUgPD0gSVdMX01WTV9EUUFfTUFYX0RBVEFfUVVFVUUpIHx8Ci0JICAgICAgKHF1ZXVlID09IElXTF9NVk1fRFFBX0JTU19DTElFTlRfUVVFVUUpKSkgeworCWlmICghaXdsX212bV9pc19kcWFfZGF0YV9xdWV1ZShtdm0sIHF1ZXVlKSAmJgorCSAgICAhaXdsX212bV9pc19kcWFfbWdtdF9xdWV1ZShtdm0sIHF1ZXVlKSAmJgorCSAgICAocXVldWUgIT0gSVdMX01WTV9EUUFfQlNTX0NMSUVOVF9RVUVVRSkpIHsKIAkJSVdMX0VSUihtdm0sICJObyBEQVRBIHF1ZXVlcyBhdmFpbGFibGUgdG8gc2hhcmVcbiIpOwotCQlxdWV1ZSA9IC1FTk9TUEM7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgcXVldWUgaXNuJ3QgaW4gdGhlIG1pZGRsZSBvZiBiZWluZyByZWNvbmZpZ3VyZWQgKi8KKwlpZiAobXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5zdGF0dXMgPT0gSVdMX01WTV9RVUVVRV9SRUNPTkZJR1VSSU5HKSB7CisJCUlXTF9FUlIobXZtLAorCQkJIlRYUSAlZCBpcyBpbiB0aGUgbWlkZGxlIG9mIHJlLWNvbmZpZyAtIHRyeSBhZ2FpblxuIiwKKwkJCXF1ZXVlKTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAlyZXR1cm4gcXVldWU7CiB9CiAKIC8qCi0gKiBJZiBhIGdpdmVuIHF1ZXVlIGhhcyBhIGhpZ2hlciBBQyB0aGFuIHRoZSBUSUQgc3RyZWFtIHRoYXQgaXMgYmVpbmcgYWRkZWQgdG8KLSAqIGl0LCB0aGUgcXVldWUgbmVlZHMgdG8gYmUgcmVkaXJlY3RlZCB0byB0aGUgbG93ZXIgQUMuIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGF0CisgKiBJZiBhIGdpdmVuIHF1ZXVlIGhhcyBhIGhpZ2hlciBBQyB0aGFuIHRoZSBUSUQgc3RyZWFtIHRoYXQgaXMgYmVpbmcgY29tcGFyZWQKKyAqIHRvLCB0aGUgcXVldWUgbmVlZHMgdG8gYmUgcmVkaXJlY3RlZCB0byB0aGUgbG93ZXIgQUMuIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGF0CiAgKiBpbiBzdWNoIGEgY2FzZSwgb3RoZXJ3aXNlIC0gaWYgbm8gcmVkaXJlY3Rpb24gcmVxdWlyZWQgLSBpdCBkb2VzIG5vdGhpbmcsCiAgKiB1bmxlc3MgdGhlICVmb3JjZSBwYXJhbSBpcyB0cnVlLgogICovCi1zdGF0aWMgaW50IGl3bF9tdm1fc2NkX3F1ZXVlX3JlZGlyZWN0KHN0cnVjdCBpd2xfbXZtICptdm0sIGludCBxdWV1ZSwgaW50IHRpZCwKLQkJCQkgICAgICBpbnQgYWMsIGludCBzc24sIHVuc2lnbmVkIGludCB3ZGdfdGltZW91dCwKLQkJCQkgICAgICBib29sIGZvcmNlKQoraW50IGl3bF9tdm1fc2NkX3F1ZXVlX3JlZGlyZWN0KHN0cnVjdCBpd2xfbXZtICptdm0sIGludCBxdWV1ZSwgaW50IHRpZCwKKwkJCSAgICAgICBpbnQgYWMsIGludCBzc24sIHVuc2lnbmVkIGludCB3ZGdfdGltZW91dCwKKwkJCSAgICAgICBib29sIGZvcmNlKQogewogCXN0cnVjdCBpd2xfc2NkX3R4cV9jZmdfY21kIGNtZCA9IHsKIAkJLnNjZF9xdWV1ZSA9IHF1ZXVlLAotCQkuZW5hYmxlID0gMCwKKwkJLmFjdGlvbiA9IFNDRF9DRkdfRElTQUJMRV9RVUVVRSwKIAl9OwogCWJvb2wgc2hhcmVkX3F1ZXVlOwogCXVuc2lnbmVkIGxvbmcgbXE7CkBAIC01NTEsMTEgKzU2MiwxMiBAQAogCiAJY21kLnN0YV9pZCA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0ucmFfc3RhX2lkOwogCWNtZC50eF9maWZvID0gaXdsX212bV9hY190b190eF9maWZvW212bS0+cXVldWVfaW5mb1txdWV1ZV0ubWFjODAyMTFfYWNdOworCWNtZC50aWQgPSBtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnR4cV90aWQ7CiAJbXEgPSBtdm0tPnF1ZXVlX2luZm9bcXVldWVdLmh3X3F1ZXVlX3RvX21hYzgwMjExOwogCXNoYXJlZF9xdWV1ZSA9IChtdm0tPnF1ZXVlX2luZm9bcXVldWVdLmh3X3F1ZXVlX3JlZmNvdW50ID4gMSk7CiAJc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKIAotCUlXTF9ERUJVR19UWF9RVUVVRVMobXZtLCAiUmVkaXJlY3Rpbmcgc2hhcmVkIFRYUSAjJWQgdG8gRklGTyAjJWRcbiIsCisJSVdMX0RFQlVHX1RYX1FVRVVFUyhtdm0sICJSZWRpcmVjdGluZyBUWFEgIyVkIHRvIEZJRk8gIyVkXG4iLAogCQkJICAgIHF1ZXVlLCBpd2xfbXZtX2FjX3RvX3R4X2ZpZm9bYWNdKTsKIAogCS8qIFN0b3AgTUFDIHF1ZXVlcyBhbmQgd2FpdCBmb3IgdGhpcyBxdWV1ZSB0byBlbXB0eSAqLwpAQCAtNTc2LDkgKzU4OCwxMiBAQAogCQkJcmV0KTsKIAogCS8qIE1ha2Ugc3VyZSB0aGUgU0NEIHdycHRyIGlzIGNvcnJlY3RseSBzZXQgYmVmb3JlIHJlY29uZmlndXJpbmcgKi8KLQlpd2xfdHJhbnNfdHhxX2VuYWJsZShtdm0tPnRyYW5zLCBxdWV1ZSwgaXdsX212bV9hY190b190eF9maWZvW2FjXSwKLQkJCSAgICAgY21kLnN0YV9pZCwgdGlkLCBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRiwKLQkJCSAgICAgc3NuLCB3ZGdfdGltZW91dCk7CisJaXdsX3RyYW5zX3R4cV9lbmFibGVfY2ZnKG12bS0+dHJhbnMsIHF1ZXVlLCBzc24sIE5VTEwsIHdkZ190aW1lb3V0KTsKKworCS8qIFVwZGF0ZSB0aGUgVElEICJvd25lciIgb2YgdGhlIHF1ZXVlICovCisJc3Bpbl9sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CisJbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS50eHFfdGlkID0gdGlkOworCXNwaW5fdW5sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CiAKIAkvKiBUT0RPOiBXb3JrLWFyb3VuZCBTQ0QgYnVnIHdoZW4gbW92aW5nIGJhY2sgYnkgbXVsdGlwbGVzIG9mIDB4NDAgKi8KIApAQCAtNzA5LDcgKzcyNCw3IEBACiAJaWYgKFdBUk5fT04ocXVldWUgPD0gMCkpIHsKIAkJSVdMX0VSUihtdm0sICJObyBhdmFpbGFibGUgcXVldWVzIGZvciB0aWQgJWQgb24gc3RhX2lkICVkXG4iLAogCQkJdGlkLCBjZmcuc3RhX2lkKTsKLQkJcmV0dXJuIC1FTk9TUEM7CisJCXJldHVybiBxdWV1ZTsKIAl9CiAKIAkvKgpAQCAtNzI4LDIxICs3NDMsMjMgQEAKIAlpZiAodXNpbmdfaW5hY3RpdmVfcXVldWUpIHsKIAkJc3RydWN0IGl3bF9zY2RfdHhxX2NmZ19jbWQgY21kID0gewogCQkJLnNjZF9xdWV1ZSA9IHF1ZXVlLAotCQkJLmVuYWJsZSA9IDAsCisJCQkuYWN0aW9uID0gU0NEX0NGR19ESVNBQkxFX1FVRVVFLAogCQl9OwotCQl1OCBhYzsKKwkJdTggdHhxX2N1cnJfYWM7CiAKIAkJZGlzYWJsZV9hZ2dfdGlkcyA9IGl3bF9tdm1fcmVtb3ZlX3N0YV9xdWV1ZV9tYXJraW5nKG12bSwgcXVldWUpOwogCiAJCXNwaW5fbG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOwotCQlhYyA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0ubWFjODAyMTFfYWM7CisJCXR4cV9jdXJyX2FjID0gbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5tYWM4MDIxMV9hYzsKIAkJY21kLnN0YV9pZCA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0ucmFfc3RhX2lkOwotCQljbWQudHhfZmlmbyA9IGl3bF9tdm1fYWNfdG9fdHhfZmlmb1thY107CisJCWNtZC50eF9maWZvID0gaXdsX212bV9hY190b190eF9maWZvW3R4cV9jdXJyX2FjXTsKKwkJY21kLnRpZCA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0udHhxX3RpZDsKIAkJc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKIAogCQkvKiBEaXNhYmxlIHRoZSBxdWV1ZSAqLwotCQlpd2xfbXZtX2ludmFsaWRhdGVfc3RhX3F1ZXVlKG12bSwgcXVldWUsIGRpc2FibGVfYWdnX3RpZHMsCi0JCQkJCSAgICAgdHJ1ZSk7CisJCWlmIChkaXNhYmxlX2FnZ190aWRzKQorCQkJaXdsX212bV9pbnZhbGlkYXRlX3N0YV9xdWV1ZShtdm0sIHF1ZXVlLAorCQkJCQkJICAgICBkaXNhYmxlX2FnZ190aWRzLCBmYWxzZSk7CiAJCWl3bF90cmFuc190eHFfZGlzYWJsZShtdm0tPnRyYW5zLCBxdWV1ZSwgZmFsc2UpOwogCQlyZXQgPSBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFNDRF9RVUVVRV9DRkcsIDAsIHNpemVvZihjbWQpLAogCQkJCQkgICAmY21kKTsKQEAgLTc1OCw2ICs3NzUsMTAgQEAKIAogCQkJcmV0dXJuIHJldDsKIAkJfQorCisJCS8qIElmIFRYUSBpcyBhbGxvY2F0ZWQgdG8gYW5vdGhlciBTVEEsIHVwZGF0ZSByZW1vdmFsIGluIEZXICovCisJCWlmIChjbWQuc3RhX2lkICE9IG12bXN0YS0+c3RhX2lkKQorCQkJaXdsX212bV9pbnZhbGlkYXRlX3N0YV9xdWV1ZShtdm0sIHF1ZXVlLCAwLCB0cnVlKTsKIAl9CiAKIAlJV0xfREVCVUdfVFhfUVVFVUVTKG12bSwKQEAgLTgyNyw2ICs4NDgsMTE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgaXdsX212bV9jaGFuZ2VfcXVldWVfb3duZXIoc3RydWN0IGl3bF9tdm0gKm12bSwgaW50IHF1ZXVlKQoreworCXN0cnVjdCBpd2xfc2NkX3R4cV9jZmdfY21kIGNtZCA9IHsKKwkJLnNjZF9xdWV1ZSA9IHF1ZXVlLAorCQkuYWN0aW9uID0gU0NEX0NGR19VUERBVEVfUVVFVUVfVElELAorCX07CisJczggc3RhX2lkOworCWludCB0aWQ7CisJdW5zaWduZWQgbG9uZyB0aWRfYml0bWFwOworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKKworCXNwaW5fbG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCXN0YV9pZCA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0ucmFfc3RhX2lkOworCXRpZF9iaXRtYXAgPSBtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnRpZF9iaXRtYXA7CisJc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKKworCWlmIChXQVJOKCF0aWRfYml0bWFwLCAiVFhRICVkIGhhcyBubyB0aWRzIGFzc2lnbmVkIHRvIGl0XG4iLCBxdWV1ZSkpCisJCXJldHVybjsKKworCS8qIEZpbmQgYW55IFRJRCBmb3IgcXVldWUgKi8KKwl0aWQgPSBmaW5kX2ZpcnN0X2JpdCgmdGlkX2JpdG1hcCwgSVdMX01BWF9USURfQ09VTlQgKyAxKTsKKwljbWQudGlkID0gdGlkOworCWNtZC50eF9maWZvID0gaXdsX212bV9hY190b190eF9maWZvW3RpZF90b19tYWM4MDIxMV9hY1t0aWRdXTsKKworCXJldCA9IGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgU0NEX1FVRVVFX0NGRywgMCwgc2l6ZW9mKGNtZCksICZjbWQpOworCWlmIChyZXQpCisJCUlXTF9FUlIobXZtLCAiRmFpbGVkIHRvIHVwZGF0ZSBvd25lciBvZiBUWFEgJWQgKHJldD0lZClcbiIsCisJCQlxdWV1ZSwgcmV0KTsKKwllbHNlCisJCUlXTF9ERUJVR19UWF9RVUVVRVMobXZtLCAiQ2hhbmdlZCBUWFEgJWQgb3duZXJzaGlwIHRvIHRpZCAlZFxuIiwKKwkJCQkgICAgcXVldWUsIHRpZCk7Cit9CisKK3N0YXRpYyB2b2lkIGl3bF9tdm1fdW5zaGFyZV9xdWV1ZShzdHJ1Y3QgaXdsX212bSAqbXZtLCBpbnQgcXVldWUpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKKwlzdHJ1Y3QgaXdsX212bV9zdGEgKm12bXN0YTsKKwlzOCBzdGFfaWQ7CisJaW50IHRpZCA9IC0xOworCXVuc2lnbmVkIGxvbmcgdGlkX2JpdG1hcDsKKwl1bnNpZ25lZCBpbnQgd2RnX3RpbWVvdXQ7CisJaW50IHNzbjsKKwlpbnQgcmV0ID0gdHJ1ZTsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOworCisJc3Bpbl9sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CisJc3RhX2lkID0gbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5yYV9zdGFfaWQ7CisJdGlkX2JpdG1hcCA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0udGlkX2JpdG1hcDsKKwlzcGluX3VubG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCisJLyogRmluZCBUSUQgZm9yIHF1ZXVlLCBhbmQgbWFrZSBzdXJlIGl0IGlzIHRoZSBvbmx5IG9uZSBvbiB0aGUgcXVldWUgKi8KKwl0aWQgPSBmaW5kX2ZpcnN0X2JpdCgmdGlkX2JpdG1hcCwgSVdMX01BWF9USURfQ09VTlQgKyAxKTsKKwlpZiAodGlkX2JpdG1hcCAhPSBCSVQodGlkKSkgeworCQlJV0xfRVJSKG12bSwgIkZhaWxlZCB0byB1bnNoYXJlIHEgJWQsIGFjdGl2ZSB0aWRzPTB4JWx4XG4iLAorCQkJcXVldWUsIHRpZF9iaXRtYXApOworCQlyZXR1cm47CisJfQorCisJSVdMX0RFQlVHX1RYX1FVRVVFUyhtdm0sICJVbnNoYXJpbmcgVFhRICVkLCBrZWVwaW5nIHRpZCAlZFxuIiwgcXVldWUsCisJCQkgICAgdGlkKTsKKworCXN0YSA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQobXZtLT5md19pZF90b19tYWNfaWRbc3RhX2lkXSwKKwkJCQkJbG9ja2RlcF9pc19oZWxkKCZtdm0tPm11dGV4KSk7CisKKwlpZiAoV0FSTl9PTl9PTkNFKElTX0VSUl9PUl9OVUxMKHN0YSkpKQorCQlyZXR1cm47CisKKwltdm1zdGEgPSBpd2xfbXZtX3N0YV9mcm9tX21hYzgwMjExKHN0YSk7CisJd2RnX3RpbWVvdXQgPSBpd2xfbXZtX2dldF93ZF90aW1lb3V0KG12bSwgbXZtc3RhLT52aWYsIGZhbHNlLCBmYWxzZSk7CisKKwlzc24gPSBJRUVFODAyMTFfU0VRX1RPX1NOKG12bXN0YS0+dGlkX2RhdGFbdGlkXS5zZXFfbnVtYmVyKTsKKworCXJldCA9IGl3bF9tdm1fc2NkX3F1ZXVlX3JlZGlyZWN0KG12bSwgcXVldWUsIHRpZCwKKwkJCQkJIHRpZF90b19tYWM4MDIxMV9hY1t0aWRdLCBzc24sCisJCQkJCSB3ZGdfdGltZW91dCwgdHJ1ZSk7CisJaWYgKHJldCkgeworCQlJV0xfRVJSKG12bSwgIkZhaWxlZCB0byByZWRpcmVjdCBUWFEgJWRcbiIsIHF1ZXVlKTsKKwkJcmV0dXJuOworCX0KKworCS8qIElmIGFnZ3Mgc2hvdWxkIGJlIHR1cm5lZCBiYWNrIG9uIC0gZG8gaXQgKi8KKwlpZiAobXZtc3RhLT50aWRfZGF0YVt0aWRdLnN0YXRlID09IElXTF9BR0dfT04pIHsKKwkJc3RydWN0IGl3bF9tdm1fYWRkX3N0YV9jbWQgY21kID0gezB9OworCisJCW12bXN0YS0+dGlkX2Rpc2FibGVfYWdnICY9IH5CSVQodGlkKTsKKworCQljbWQubWFjX2lkX25fY29sb3IgPSBjcHVfdG9fbGUzMihtdm1zdGEtPm1hY19pZF9uX2NvbG9yKTsKKwkJY21kLnN0YV9pZCA9IG12bXN0YS0+c3RhX2lkOworCQljbWQuYWRkX21vZGlmeSA9IFNUQV9NT0RFX01PRElGWTsKKwkJY21kLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9USURfRElTQUJMRV9UWDsKKwkJY21kLnRmZF9xdWV1ZV9tc2sgPSBjcHVfdG9fbGUzMihtdm1zdGEtPnRmZF9xdWV1ZV9tc2spOworCQljbWQudGlkX2Rpc2FibGVfdHggPSBjcHVfdG9fbGUxNihtdm1zdGEtPnRpZF9kaXNhYmxlX2FnZyk7CisKKwkJcmV0ID0gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBBRERfU1RBLCBDTURfQVNZTkMsCisJCQkJCSAgIGl3bF9tdm1fYWRkX3N0YV9jbWRfc2l6ZShtdm0pLCAmY21kKTsKKwkJaWYgKCFyZXQpIHsKKwkJCUlXTF9ERUJVR19UWF9RVUVVRVMobXZtLAorCQkJCQkgICAgIlRYUSAjJWQgaXMgbm93IGFnZ3JlZ2F0ZWQgYWdhaW5cbiIsCisJCQkJCSAgICBxdWV1ZSk7CisKKwkJCS8qIE1hcmsgcXVldWUgaW50ZW5hbGx5IGFzIGFnZ3JlZ2F0aW5nIGFnYWluICovCisJCQlpd2xfdHJhbnNfdHhxX3NldF9zaGFyZWRfbW9kZShtdm0tPnRyYW5zLCBxdWV1ZSwgZmFsc2UpOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CisJbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5zdGF0dXMgPSBJV0xfTVZNX1FVRVVFX1JFQURZOworCXNwaW5fdW5sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdTggaXdsX212bV90aWRfdG9fYWNfcXVldWUoaW50IHRpZCkKIHsKIAlpZiAodGlkID09IElXTF9NQVhfVElEX0NPVU5UKQpAQCAtODk0LDEzICsxMDI4LDQyIEBACiAJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKIAlzdHJ1Y3QgaXdsX212bV9zdGEgKm12bXN0YTsKIAl1bnNpZ25lZCBsb25nIGRlZmVycmVkX3RpZF90cmFmZmljOwotCWludCBzdGFfaWQsIHRpZDsKKwlpbnQgcXVldWUsIHN0YV9pZCwgdGlkOwogCiAJLyogQ2hlY2sgaW5hY3Rpdml0eSBvZiBxdWV1ZXMgKi8KIAlpd2xfbXZtX2luYWN0aXZpdHlfY2hlY2sobXZtKTsKIAogCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOwogCisJLyogUmVjb25maWd1cmUgcXVldWVzIHJlcXVpcmluZyByZWNvbmZpZ3VhdGlvbiAqLworCWZvciAocXVldWUgPSAwOyBxdWV1ZSA8IElXTF9NQVhfSFdfUVVFVUVTOyBxdWV1ZSsrKSB7CisJCWJvb2wgcmVjb25maWc7CisJCWJvb2wgY2hhbmdlX293bmVyOworCisJCXNwaW5fbG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCQlyZWNvbmZpZyA9IChtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnN0YXR1cyA9PQorCQkJICAgIElXTF9NVk1fUVVFVUVfUkVDT05GSUdVUklORyk7CisKKwkJLyoKKwkJICogV2UgbmVlZCB0byB0YWtlIGludG8gYWNjb3VudCBhIHNpdHVhdGlvbiBpbiB3aGljaCBhIFRYUSB3YXMKKwkJICogYWxsb2NhdGVkIHRvIFRJRCB4LCBhbmQgdGhlbiB0dXJuZWQgc2hhcmVkIGJ5IGFkZGluZyBUSURzIHkKKwkJICogYW5kIHouIElmIFRJRCB4IGJlY29tZXMgaW5hY3RpdmUgYW5kIGlzIHJlbW92ZWQgZnJvbSB0aGUgVFhRLAorCQkgKiBvd25lcnNoaXAgbXVzdCBiZSBnaXZlbiB0byBvbmUgb2YgdGhlIHJlbWFpbmluZyBUSURzLgorCQkgKiBUaGlzIGlzIG1haW5seSBiZWNhdXNlIGlmIFRJRCB4IGNvbnRpbnVlcyAtIGEgbmV3IHF1ZXVlIGNhbid0CisJCSAqIGJlIGFsbG9jYXRlZCBmb3IgaXQgYXMgbG9uZyBhcyBpdCBpcyBhbiBvd25lciBvZiBhbm90aGVyIFRYUS4KKwkJICovCisJCWNoYW5nZV9vd25lciA9ICEobXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS50aWRfYml0bWFwICYKKwkJCQkgQklUKG12bS0+cXVldWVfaW5mb1txdWV1ZV0udHhxX3RpZCkpICYmCisJCQkgICAgICAgKG12bS0+cXVldWVfaW5mb1txdWV1ZV0uc3RhdHVzID09CisJCQkJSVdMX01WTV9RVUVVRV9TSEFSRUQpOworCQlzcGluX3VubG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCisJCWlmIChyZWNvbmZpZykKKwkJCWl3bF9tdm1fdW5zaGFyZV9xdWV1ZShtdm0sIHF1ZXVlKTsKKwkJZWxzZSBpZiAoY2hhbmdlX293bmVyKQorCQkJaXdsX212bV9jaGFuZ2VfcXVldWVfb3duZXIobXZtLCBxdWV1ZSk7CisJfQorCiAJLyogR28gb3ZlciBhbGwgc3RhdGlvbnMgd2l0aCBkZWZlcnJlZCB0cmFmZmljICovCiAJZm9yX2VhY2hfc2V0X2JpdChzdGFfaWQsIG12bS0+c3RhX2RlZmVycmVkX2ZyYW1lcywKIAkJCSBJV0xfTVZNX1NUQVRJT05fQ09VTlQpIHsKQEAgLTk2Myw2ICsxMTI2LDYxIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBJbiBEUUEgbW9kZSwgYWZ0ZXIgYSBIVyByZXN0YXJ0IHRoZSBxdWV1ZXMgc2hvdWxkIGJlIGFsbG9jYXRlZCBhcyBiZWZvcmUsIGluCisgKiBvcmRlciB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgd2hlbiB0aGVyZSBhcmUgc2hhcmVkIHF1ZXVlcy4gVGhpcyBmdW5jdGlvbgorICogZG9lcyB0aGUgcmUtbWFwcGluZyBhbmQgcXVldWUgYWxsb2NhdGlvbi4KKyAqCisgKiBOb3RlIHRoYXQgcmUtZW5hYmxpbmcgYWdncmVnYXRpb25zIGlzbid0IGRvbmUgaW4gdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgaXdsX212bV9yZWFsbG9jX3F1ZXVlc19hZnRlcl9yZXN0YXJ0KHN0cnVjdCBpd2xfbXZtICptdm0sCisJCQkJCQkgc3RydWN0IGl3bF9tdm1fc3RhICptdm1fc3RhKQoreworCXVuc2lnbmVkIGludCB3ZGdfdGltZW91dCA9CisJCQlpd2xfbXZtX2dldF93ZF90aW1lb3V0KG12bSwgbXZtX3N0YS0+dmlmLCBmYWxzZSwgZmFsc2UpOworCWludCBpOworCXN0cnVjdCBpd2xfdHJhbnNfdHhxX3NjZF9jZmcgY2ZnID0geworCQkuc3RhX2lkID0gbXZtX3N0YS0+c3RhX2lkLAorCQkuZnJhbWVfbGltaXQgPSBJV0xfRlJBTUVfTElNSVQsCisJfTsKKworCS8qIE1ha2Ugc3VyZSByZXNlcnZlZCBxdWV1ZSBpcyBzdGlsbCBtYXJrZWQgYXMgc3VjaCAob3IgYWxsb2NhdGVkKSAqLworCW12bS0+cXVldWVfaW5mb1ttdm1fc3RhLT5yZXNlcnZlZF9xdWV1ZV0uc3RhdHVzID0KKwkJSVdMX01WTV9RVUVVRV9SRVNFUlZFRDsKKworCWZvciAoaSA9IDA7IGkgPD0gSVdMX01BWF9USURfQ09VTlQ7IGkrKykgeworCQlzdHJ1Y3QgaXdsX212bV90aWRfZGF0YSAqdGlkX2RhdGEgPSAmbXZtX3N0YS0+dGlkX2RhdGFbaV07CisJCWludCB0eHFfaWQgPSB0aWRfZGF0YS0+dHhxX2lkOworCQlpbnQgYWM7CisJCXU4IG1hY19xdWV1ZTsKKworCQlpZiAodHhxX2lkID09IElFRUU4MDIxMV9JTlZBTF9IV19RVUVVRSkKKwkJCWNvbnRpbnVlOworCisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnRpZF9kYXRhLT5kZWZlcnJlZF90eF9mcmFtZXMpOworCisJCWFjID0gdGlkX3RvX21hYzgwMjExX2FjW2ldOworCQltYWNfcXVldWUgPSBtdm1fc3RhLT52aWYtPmh3X3F1ZXVlW2FjXTsKKworCQljZmcudGlkID0gaTsKKwkJY2ZnLmZpZm8gPSBpd2xfbXZtX2FjX3RvX3R4X2ZpZm9bYWNdOworCQljZmcuYWdncmVnYXRlID0gKHR4cV9pZCA+PSBJV0xfTVZNX0RRQV9NSU5fREFUQV9RVUVVRSB8fAorCQkJCSB0eHFfaWQgPT0gSVdMX01WTV9EUUFfQlNTX0NMSUVOVF9RVUVVRSk7CisKKwkJSVdMX0RFQlVHX1RYX1FVRVVFUyhtdm0sCisJCQkJICAgICJSZS1tYXBwaW5nIHN0YSAlZCB0aWQgJWQgdG8gcXVldWUgJWRcbiIsCisJCQkJICAgIG12bV9zdGEtPnN0YV9pZCwgaSwgdHhxX2lkKTsKKworCQlpd2xfbXZtX2VuYWJsZV90eHEobXZtLCB0eHFfaWQsIG1hY19xdWV1ZSwKKwkJCQkgICBJRUVFODAyMTFfU0VRX1RPX1NOKHRpZF9kYXRhLT5zZXFfbnVtYmVyKSwKKwkJCQkgICAmY2ZnLCB3ZGdfdGltZW91dCk7CisKKwkJbXZtLT5xdWV1ZV9pbmZvW3R4cV9pZF0uc3RhdHVzID0gSVdMX01WTV9RVUVVRV9SRUFEWTsKKwl9CisKKwlhdG9taWNfc2V0KCZtdm0tPnBlbmRpbmdfZnJhbWVzW212bV9zdGEtPnN0YV9pZF0sIDApOworfQorCiBpbnQgaXdsX212bV9hZGRfc3RhKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKQEAgLTk4NSw2ICsxMjAzLDEzIEBACiAKIAlzcGluX2xvY2tfaW5pdCgmbXZtX3N0YS0+bG9jayk7CiAKKwkvKiBJbiBEUUEgbW9kZSwgaWYgdGhpcyBpcyBhIEhXIHJlc3RhcnQsIHJlLWFsbG9jIGV4aXN0aW5nIHF1ZXVlcyAqLworCWlmIChpd2xfbXZtX2lzX2RxYV9zdXBwb3J0ZWQobXZtKSAmJgorCSAgICB0ZXN0X2JpdChJV0xfTVZNX1NUQVRVU19JTl9IV19SRVNUQVJULCAmbXZtLT5zdGF0dXMpKSB7CisJCWl3bF9tdm1fcmVhbGxvY19xdWV1ZXNfYWZ0ZXJfcmVzdGFydChtdm0sIG12bV9zdGEpOworCQlnb3RvIHVwZGF0ZV9mdzsKKwl9CisKIAltdm1fc3RhLT5zdGFfaWQgPSBzdGFfaWQ7CiAJbXZtX3N0YS0+bWFjX2lkX25fY29sb3IgPSBGV19DTURfSURfQU5EX0NPTE9SKG12bXZpZi0+aWQsCiAJCQkJCQkgICAgICBtdm12aWYtPmNvbG9yKTsKQEAgLTEwNDgsNiArMTI3Myw3IEBACiAJCQlnb3RvIGVycjsKIAl9CiAKK3VwZGF0ZV9mdzoKIAlyZXQgPSBpd2xfbXZtX3N0YV9zZW5kX3RvX2Z3KG12bSwgc3RhLCBmYWxzZSwgMCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnI7CkBAIC0xMDcxLDEzICsxMjk3LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgaXdsX212bV91cGRhdGVfc3RhKHN0cnVjdCBpd2xfbXZtICptdm0sCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKLXsKLQlyZXR1cm4gaXdsX212bV9zdGFfc2VuZF90b19mdyhtdm0sIHN0YSwgdHJ1ZSwgMCk7Ci19Ci0KIGludCBpd2xfbXZtX2RyYWluX3N0YShzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaXdsX212bV9zdGEgKm12bXN0YSwKIAkJICAgICAgYm9vbCBkcmFpbikKIHsKQEAgLTEyNzAsOSArMTQ4OSwzMSBAQAogCQlyZXQgPSBpd2xfbXZtX2RyYWluX3N0YShtdm0sIG12bV9zdGEsIGZhbHNlKTsKIAogCQkvKiBJZiBEUUEgaXMgc3VwcG9ydGVkIC0gdGhlIHF1ZXVlcyBjYW4gYmUgZGlzYWJsZWQgbm93ICovCi0JCWlmIChpd2xfbXZtX2lzX2RxYV9zdXBwb3J0ZWQobXZtKSkKKwkJaWYgKGl3bF9tdm1faXNfZHFhX3N1cHBvcnRlZChtdm0pKSB7CisJCQl1OCByZXNlcnZlZF90eHEgPSBtdm1fc3RhLT5yZXNlcnZlZF9xdWV1ZTsKKwkJCWVudW0gaXdsX212bV9xdWV1ZV9zdGF0dXMgKnN0YXR1czsKKwogCQkJaXdsX212bV9kaXNhYmxlX3N0YV9xdWV1ZXMobXZtLCB2aWYsIG12bV9zdGEpOwogCisJCQkvKgorCQkJICogSWYgbm8gdHJhZmZpYyBoYXMgZ29uZSB0aHJvdWdoIHRoZSByZXNlcnZlZCBUWFEgLSBpdAorCQkJICogaXMgc3RpbGwgbWFya2VkIGFzIElXTF9NVk1fUVVFVUVfUkVTRVJWRUQsIGFuZAorCQkJICogc2hvdWxkIGJlIG1hbnVhbGx5IG1hcmtlZCBhcyBmcmVlIGFnYWluCisJCQkgKi8KKwkJCXNwaW5fbG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCQkJc3RhdHVzID0gJm12bS0+cXVldWVfaW5mb1tyZXNlcnZlZF90eHFdLnN0YXR1czsKKwkJCWlmIChXQVJOKCgqc3RhdHVzICE9IElXTF9NVk1fUVVFVUVfUkVTRVJWRUQpICYmCisJCQkJICgqc3RhdHVzICE9IElXTF9NVk1fUVVFVUVfRlJFRSksCisJCQkJICJzdGFfaWQgJWQgcmVzZXJ2ZWQgdHhxICVkIHN0YXR1cyAlZCIsCisJCQkJIG12bV9zdGEtPnN0YV9pZCwgcmVzZXJ2ZWRfdHhxLCAqc3RhdHVzKSkgeworCQkJCXNwaW5fdW5sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCSpzdGF0dXMgPSBJV0xfTVZNX1FVRVVFX0ZSRUU7CisJCQlzcGluX3VubG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCQl9CisKIAkJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCiAJCSAgICBtdm12aWYtPmFwX3N0YV9pZCA9PSBtdm1fc3RhLT5zdGFfaWQpIHsKIAkJCS8qIGlmIGFzc29jaWF0ZWQgLSB3ZSBjYW4ndCByZW1vdmUgdGhlIEFQIFNUQSBub3cgKi8KQEAgLTE4MDIsMTEgKzIwNDMsOSBAQAogCQliYWlkX2RhdGEtPmJhaWQgPSBiYWlkOwogCQliYWlkX2RhdGEtPnRpbWVvdXQgPSB0aW1lb3V0OwogCQliYWlkX2RhdGEtPmxhc3RfcnggPSBqaWZmaWVzOwotCQlpbml0X3RpbWVyKCZiYWlkX2RhdGEtPnNlc3Npb25fdGltZXIpOwotCQliYWlkX2RhdGEtPnNlc3Npb25fdGltZXIuZnVuY3Rpb24gPQotCQkJaXdsX212bV9yeF9hZ2dfc2Vzc2lvbl9leHBpcmVkOwotCQliYWlkX2RhdGEtPnNlc3Npb25fdGltZXIuZGF0YSA9Ci0JCQkodW5zaWduZWQgbG9uZykmbXZtLT5iYWlkX21hcFtiYWlkXTsKKwkJc2V0dXBfdGltZXIoJmJhaWRfZGF0YS0+c2Vzc2lvbl90aW1lciwKKwkJCSAgICBpd2xfbXZtX3J4X2FnZ19zZXNzaW9uX2V4cGlyZWQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpJm12bS0+YmFpZF9tYXBbYmFpZF0pOwogCQliYWlkX2RhdGEtPm12bSA9IG12bTsKIAkJYmFpZF9kYXRhLT50aWQgPSB0aWQ7CiAJCWJhaWRfZGF0YS0+c3RhX2lkID0gbXZtX3N0YS0+c3RhX2lkOwpAQCAtMTk1Niw3ICsyMTk1LDcgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0Jc3Bpbl9sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CisJc3Bpbl9sb2NrKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CiAKIAkvKgogCSAqIE5vdGUgdGhlIHBvc3NpYmxlIGNhc2VzOgpAQCAtMTk2NywxNCArMjIwNiwyMCBAQAogCSAqCW5vbi1EUUEgbW9kZSwgc2luY2UgdGhlIFRYUSBoYXNuJ3QgeWV0IGJlZW4gYWxsb2NhdGVkCiAJICovCiAJdHhxX2lkID0gbXZtc3RhLT50aWRfZGF0YVt0aWRdLnR4cV9pZDsKLQlpZiAoIWl3bF9tdm1faXNfZHFhX3N1cHBvcnRlZChtdm0pIHx8CisJaWYgKGl3bF9tdm1faXNfZHFhX3N1cHBvcnRlZChtdm0pICYmCisJICAgIHVubGlrZWx5KG12bS0+cXVldWVfaW5mb1t0eHFfaWRdLnN0YXR1cyA9PSBJV0xfTVZNX1FVRVVFX1NIQVJFRCkpIHsKKwkJcmV0ID0gLUVOWElPOworCQlJV0xfREVCVUdfVFhfUVVFVUVTKG12bSwKKwkJCQkgICAgIkNhbid0IHN0YXJ0IHRpZCAlZCBhZ2cgb24gc2hhcmVkIHF1ZXVlIVxuIiwKKwkJCQkgICAgdGlkKTsKKwkJZ290byByZWxlYXNlX2xvY2tzOworCX0gZWxzZSBpZiAoIWl3bF9tdm1faXNfZHFhX3N1cHBvcnRlZChtdm0pIHx8CiAJICAgIG12bS0+cXVldWVfaW5mb1t0eHFfaWRdLnN0YXR1cyAhPSBJV0xfTVZNX1FVRVVFX1JFQURZKSB7CiAJCXR4cV9pZCA9IGl3bF9tdm1fZmluZF9mcmVlX3F1ZXVlKG12bSwgbXZtc3RhLT5zdGFfaWQsCiAJCQkJCQkgbXZtLT5maXJzdF9hZ2dfcXVldWUsCiAJCQkJCQkgbXZtLT5sYXN0X2FnZ19xdWV1ZSk7CiAJCWlmICh0eHFfaWQgPCAwKSB7CiAJCQlyZXQgPSB0eHFfaWQ7Ci0JCQlzcGluX3VubG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOwogCQkJSVdMX0VSUihtdm0sICJGYWlsZWQgdG8gYWxsb2NhdGUgYWdnIHF1ZXVlXG4iKTsKIAkJCWdvdG8gcmVsZWFzZV9sb2NrczsKIAkJfQpAQCAtMTk4Miw3ICsyMjI3LDggQEAKIAkJLyogVFhRIGhhc24ndCB5ZXQgYmVlbiBlbmFibGVkLCBzbyBtYXJrIGl0IG9ubHkgYXMgcmVzZXJ2ZWQgKi8KIAkJbXZtLT5xdWV1ZV9pbmZvW3R4cV9pZF0uc3RhdHVzID0gSVdMX01WTV9RVUVVRV9SRVNFUlZFRDsKIAl9Ci0Jc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKKworCXNwaW5fdW5sb2NrKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CiAKIAlJV0xfREVCVUdfVFhfUVVFVUVTKG12bSwKIAkJCSAgICAiQUdHIGZvciB0aWQgJWQgd2lsbCBiZSBvbiBxdWV1ZSAjJWRcbiIsCkBAIC0yMDA2LDggKzIyNTIsMTEgQEAKIAl9CiAKIAlyZXQgPSAwOworCWdvdG8gb3V0OwogCiByZWxlYXNlX2xvY2tzOgorCXNwaW5fdW5sb2NrKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CitvdXQ6CiAJc3Bpbl91bmxvY2tfYmgoJm12bXN0YS0+bG9jayk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjAyMyw2ICsyMjcyLDcgQEAKIAkJaXdsX212bV9nZXRfd2RfdGltZW91dChtdm0sIHZpZiwgc3RhLT50ZGxzLCBmYWxzZSk7CiAJaW50IHF1ZXVlLCByZXQ7CiAJYm9vbCBhbGxvY19xdWV1ZSA9IHRydWU7CisJZW51bSBpd2xfbXZtX3F1ZXVlX3N0YXR1cyBxdWV1ZV9zdGF0dXM7CiAJdTE2IHNzbjsKIAogCXN0cnVjdCBpd2xfdHJhbnNfdHhxX3NjZF9jZmcgY2ZnID0gewpAQCAtMjA0OCwxMyArMjI5OCwxNSBAQAogCiAJY2ZnLmZpZm8gPSBpd2xfbXZtX2FjX3RvX3R4X2ZpZm9bdGlkX3RvX21hYzgwMjExX2FjW3RpZF1dOwogCisJc3Bpbl9sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CisJcXVldWVfc3RhdHVzID0gbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5zdGF0dXM7CisJc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKKwogCS8qIEluIERRQSBtb2RlLCB0aGUgZXhpc3RpbmcgcXVldWUgbWlnaHQgbmVlZCB0byBiZSByZWNvbmZpZ3VyZWQgKi8KIAlpZiAoaXdsX212bV9pc19kcWFfc3VwcG9ydGVkKG12bSkpIHsKLQkJc3Bpbl9sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CiAJCS8qIE1heWJlIHRoZXJlIGlzIG5vIG5lZWQgdG8gZXZlbiBhbGxvYyBhIHF1ZXVlLi4uICovCiAJCWlmIChtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnN0YXR1cyA9PSBJV0xfTVZNX1FVRVVFX1JFQURZKQogCQkJYWxsb2NfcXVldWUgPSBmYWxzZTsKLQkJc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKIAogCQkvKgogCQkgKiBPbmx5IHJlY29uZmlnIHRoZSBTQ0QgZm9yIHRoZSBxdWV1ZSBpZiB0aGUgd2luZG93IHNpemUgaGFzCkBAIC0yMDg5LDkgKzIzNDEsMTIgQEAKIAkJCQkgICB2aWYtPmh3X3F1ZXVlW3RpZF90b19tYWM4MDIxMV9hY1t0aWRdXSwgc3NuLAogCQkJCSAgICZjZmcsIHdkZ190aW1lb3V0KTsKIAotCXJldCA9IGl3bF9tdm1fc3RhX3R4X2FnZyhtdm0sIHN0YSwgdGlkLCBxdWV1ZSwgdHJ1ZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FSU87CisJLyogU2VuZCBBRERfU1RBIGNvbW1hbmQgdG8gZW5hYmxlIGFnZ3Mgb25seSBpZiB0aGUgcXVldWUgaXNuJ3Qgc2hhcmVkICovCisJaWYgKHF1ZXVlX3N0YXR1cyAhPSBJV0xfTVZNX1FVRVVFX1NIQVJFRCkgeworCQlyZXQgPSBpd2xfbXZtX3N0YV90eF9hZ2cobXZtLCBzdGEsIHRpZCwgcXVldWUsIHRydWUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisJfQogCiAJLyogTm8gbmVlZCB0byBtYXJrIGFzIHJlc2VydmVkICovCiAJc3Bpbl9sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CkBAIC0yMTIzLDcgKzIzNzgsNiBAQAogCXUxNiB0eHFfaWQ7CiAJaW50IGVycjsKIAotCiAJLyoKIAkgKiBJZiBtYWM4MDIxMSBpcyBjbGVhbmluZyBpdHMgc3RhdGUsIHRoZW4gc2F5IHRoYXQgd2UgZmluaXNoZWQgc2luY2UKIAkgKiBvdXIgc3RhdGUgaGFzIGJlZW4gY2xlYXJlZCBhbnl3YXkuCkBAIC0yMTUyLDYgKzI0MDYsNyBAQAogCSAqLwogCWlmIChtdm0tPnF1ZXVlX2luZm9bdHhxX2lkXS5zdGF0dXMgPT0gSVdMX01WTV9RVUVVRV9SRVNFUlZFRCkKIAkJbXZtLT5xdWV1ZV9pbmZvW3R4cV9pZF0uc3RhdHVzID0gSVdMX01WTV9RVUVVRV9GUkVFOworCiAJc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKIAogCXN3aXRjaCAodGlkX2RhdGEtPnN0YXRlKSB7CkBAIC0yNDEyLDkgKzI2NjcsMTUgQEAKIAlzdHJ1Y3QgaXdsX212bV9tZ210X21jYXN0X2tleV9jbWQgaWd0a19jbWQgPSB7fTsKIAogCS8qIHZlcmlmeSB0aGUga2V5IGRldGFpbHMgbWF0Y2ggdGhlIHJlcXVpcmVkIGNvbW1hbmQncyBleHBlY3RhdGlvbnMgKi8KLQlpZiAoV0FSTl9PTigoa2V5Y29uZi0+Y2lwaGVyICE9IFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDKSB8fAotCQkgICAgKGtleWNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BBSVJXSVNFKSB8fAotCQkgICAgKGtleWNvbmYtPmtleWlkeCAhPSA0ICYmIGtleWNvbmYtPmtleWlkeCAhPSA1KSkpCisJaWYgKFdBUk5fT04oKGtleWNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BBSVJXSVNFKSB8fAorCQkgICAgKGtleWNvbmYtPmtleWlkeCAhPSA0ICYmIGtleWNvbmYtPmtleWlkeCAhPSA1KSB8fAorCQkgICAgKGtleWNvbmYtPmNpcGhlciAhPSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQyAmJgorCQkgICAgIGtleWNvbmYtPmNpcGhlciAhPSBXTEFOX0NJUEhFUl9TVUlURV9CSVBfR01BQ18xMjggJiYKKwkJICAgICBrZXljb25mLT5jaXBoZXIgIT0gV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMjU2KSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKFdBUk5fT04oIWl3bF9tdm1faGFzX25ld19yeF9hcGkobXZtKSAmJgorCQkgICAga2V5Y29uZi0+Y2lwaGVyICE9IFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZ3RrX2NtZC5rZXlfaWQgPSBjcHVfdG9fbGUzMihrZXljb25mLT5rZXlpZHgpOwpAQCAtMjQzMCwxMSArMjY5MSwxOCBAQAogCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDOgogCQkJaWd0a19jbWQuY3RybF9mbGFncyB8PSBjcHVfdG9fbGUzMihTVEFfS0VZX0ZMR19DQ00pOwogCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMTI4OgorCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0JJUF9HTUFDXzI1NjoKKwkJCWlndGtfY21kLmN0cmxfZmxhZ3MgfD0gY3B1X3RvX2xlMzIoU1RBX0tFWV9GTEdfR0NNUCk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJbWVtY3B5KGlndGtfY21kLklHVEssIGtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKKwkJbWVtY3B5KGlndGtfY21kLmlndGssIGtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKKwkJaWYgKGtleWNvbmYtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9CSVBfR01BQ18yNTYpCisJCQlpZ3RrX2NtZC5jdHJsX2ZsYWdzIHw9CisJCQkJY3B1X3RvX2xlMzIoU1RBX0tFWV9GTEdfS0VZXzMyQllURVMpOwogCQlpZWVlODAyMTFfZ2V0X2tleV9yeF9zZXEoa2V5Y29uZiwgMCwgJnNlcSk7CiAJCXBuID0gc2VxLmFlc19jbWFjLnBuOwogCQlpZ3RrX2NtZC5yZWNlaXZlX3NlcV9jbnQgPSBjcHVfdG9fbGU2NCgoKHU2NCkgcG5bNV0gPDwgMCkgfApAQCAtMjQ0OSw2ICsyNzE3LDE5IEBACiAJCSAgICAgICByZW1vdmVfa2V5ID8gInJlbW92aW5nIiA6ICJpbnN0YWxsaW5nIiwKIAkJICAgICAgIGlndGtfY21kLnN0YV9pZCk7CiAKKwlpZiAoIWl3bF9tdm1faGFzX25ld19yeF9hcGkobXZtKSkgeworCQlzdHJ1Y3QgaXdsX212bV9tZ210X21jYXN0X2tleV9jbWRfdjEgaWd0a19jbWRfdjEgPSB7CisJCQkuY3RybF9mbGFncyA9IGlndGtfY21kLmN0cmxfZmxhZ3MsCisJCQkua2V5X2lkID0gaWd0a19jbWQua2V5X2lkLAorCQkJLnN0YV9pZCA9IGlndGtfY21kLnN0YV9pZCwKKwkJCS5yZWNlaXZlX3NlcV9jbnQgPSBpZ3RrX2NtZC5yZWNlaXZlX3NlcV9jbnQKKwkJfTsKKworCQltZW1jcHkoaWd0a19jbWRfdjEuaWd0aywgaWd0a19jbWQuaWd0aywKKwkJICAgICAgIEFSUkFZX1NJWkUoaWd0a19jbWRfdjEuaWd0aykpOworCQlyZXR1cm4gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBNR01UX01DQVNUX0tFWSwgMCwKKwkJCQkJICAgIHNpemVvZihpZ3RrX2NtZF92MSksICZpZ3RrX2NtZF92MSk7CisJfQogCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIE1HTVRfTUNBU1RfS0VZLCAwLAogCQkJCSAgICBzaXplb2YoaWd0a19jbWQpLCAmaWd0a19jbWQpOwogfQpAQCAtMjU3Myw3ICsyODU0LDkgQEAKIAl9CiAJc3RhX2lkID0gbXZtX3N0YS0+c3RhX2lkOwogCi0JaWYgKGtleWNvbmYtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQykgeworCWlmIChrZXljb25mLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUMgfHwKKwkgICAga2V5Y29uZi0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0JJUF9HTUFDXzEyOCB8fAorCSAgICBrZXljb25mLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMjU2KSB7CiAJCXJldCA9IGl3bF9tdm1fc2VuZF9zdGFfaWd0ayhtdm0sIGtleWNvbmYsIHN0YV9pZCwgZmFsc2UpOwogCQlnb3RvIGVuZDsKIAl9CkBAIC0yNjU5LDcgKzI5NDIsOSBAQAogCUlXTF9ERUJVR19XRVAobXZtLCAibXZtIHJlbW92ZSBkeW5hbWljIGtleTogaWR4PSVkIHN0YT0lZFxuIiwKIAkJICAgICAga2V5Y29uZi0+a2V5aWR4LCBzdGFfaWQpOwogCi0JaWYgKGtleWNvbmYtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQykKKwlpZiAoa2V5Y29uZi0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDIHx8CisJICAgIGtleWNvbmYtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9CSVBfR01BQ18xMjggfHwKKwkgICAga2V5Y29uZi0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0JJUF9HTUFDXzI1NikKIAkJcmV0dXJuIGl3bF9tdm1fc2VuZF9zdGFfaWd0ayhtdm0sIGtleWNvbmYsIHN0YV9pZCwgdHJ1ZSk7CiAKIAlpZiAoIV9fdGVzdF9hbmRfY2xlYXJfYml0KGtleWNvbmYtPmh3X2tleV9pZHgsIG12bS0+Zndfa2V5X3RhYmxlKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vc3RhLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9zdGEuaAppbmRleCBiYmMxY2FiLi5lMDY4ZDUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9zdGEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9zdGEuaApAQCAtNDczLDkgKzQ3MywxNCBAQAogaW50IGl3bF9tdm1fYWRkX3N0YShzdHJ1Y3QgaXdsX212bSAqbXZtLAogCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOwotaW50IGl3bF9tdm1fdXBkYXRlX3N0YShzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOworCitzdGF0aWMgaW5saW5lIGludCBpd2xfbXZtX3VwZGF0ZV9zdGEoc3RydWN0IGl3bF9tdm0gKm12bSwKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCXJldHVybiBpd2xfbXZtX3N0YV9zZW5kX3RvX2Z3KG12bSwgc3RhLCB0cnVlLCAwKTsKK30KKwogaW50IGl3bF9tdm1fcm1fc3RhKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOwpAQCAtNTU0LDQgKzU1OSw4IEBACiB2b2lkIGl3bF9tdm1fY3NhX2NsaWVudF9hYnNlbnQoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CiB2b2lkIGl3bF9tdm1fYWRkX25ld19kcWFfc3RyZWFtX3drKHN0cnVjdCB3b3JrX3N0cnVjdCAqd2spOwogCitpbnQgaXdsX212bV9zY2RfcXVldWVfcmVkaXJlY3Qoc3RydWN0IGl3bF9tdm0gKm12bSwgaW50IHF1ZXVlLCBpbnQgdGlkLAorCQkJICAgICAgIGludCBhYywgaW50IHNzbiwgdW5zaWduZWQgaW50IHdkZ190aW1lb3V0LAorCQkJICAgICAgIGJvb2wgZm9yY2UpOworCiAjZW5kaWYgLyogX19zdGFfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS90dC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vdHQuYwppbmRleCA1OGZjN2IzLi42M2EwNTFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS90dC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3R0LmMKQEAgLTI0MSwxMSArMjQxLDggQEAKIAl9OwogCXUzMiBjbWRpZDsKIAotCWlmIChmd19oYXNfYXBpKCZtdm0tPmZ3LT51Y29kZV9jYXBhLCBJV0xfVUNPREVfVExWX0FQSV9XSURFX0NNRF9IRFIpKQotCQljbWRpZCA9IGl3bF9jbWRfaWQoQ01EX0RUU19NRUFTVVJFTUVOVF9UUklHR0VSX1dJREUsCi0JCQkJICAgUEhZX09QU19HUk9VUCwgMCk7Ci0JZWxzZQotCQljbWRpZCA9IENNRF9EVFNfTUVBU1VSRU1FTlRfVFJJR0dFUjsKKwljbWRpZCA9IGl3bF9jbWRfaWQoQ01EX0RUU19NRUFTVVJFTUVOVF9UUklHR0VSX1dJREUsCisJCQkgICBQSFlfT1BTX0dST1VQLCAwKTsKIAogCWlmICghZndfaGFzX2NhcGEoJm12bS0+ZnctPnVjb2RlX2NhcGEsCiAJCQkgSVdMX1VDT0RFX1RMVl9DQVBBX0VYVEVOREVEX0RUU19NRUFTVVJFKSkKQEAgLTI2MSw5ICsyNTgsNiBAQAogCQkJCQkgICAgRFRTX01FQVNVUkVNRU5UX05PVElGX1dJREUpIH07CiAJaW50IHJldDsKIAotCWlmICghZndfaGFzX2FwaSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwgSVdMX1VDT0RFX1RMVl9BUElfV0lERV9DTURfSERSKSkKLQkJdGVtcF9ub3RpZlswXSA9IERUU19NRUFTVVJFTUVOVF9OT1RJRklDQVRJT047Ci0KIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKIAogCWl3bF9pbml0X25vdGlmaWNhdGlvbl93YWl0KCZtdm0tPm5vdGlmX3dhaXQsICZ3YWl0X3RlbXBfbm90aWYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS90eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vdHguYwppbmRleCBjNjU4NWFiLi42Njk1N2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS90eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3R4LmMKQEAgLTM0Niw3ICszNDYsNyBAQAogCiAJcmF0ZV9pZHggPSBpbmZvLT5jb250cm9sLnJhdGVzWzBdLmlkeDsKIAkvKiBpZiB0aGUgcmF0ZSBpc24ndCBhIHdlbGwga25vd24gbGVnYWN5IHJhdGUsIHRha2UgdGhlIGxvd2VzdCBvbmUgKi8KLQlpZiAocmF0ZV9pZHggPCAwIHx8IHJhdGVfaWR4ID4gSVdMX1JBVEVfQ09VTlRfTEVHQUNZKQorCWlmIChyYXRlX2lkeCA8IDAgfHwgcmF0ZV9pZHggPj0gSVdMX1JBVEVfQ09VTlRfTEVHQUNZKQogCQlyYXRlX2lkeCA9IHJhdGVfbG93ZXN0X2luZGV4KAogCQkJCSZtdm0tPm52bV9kYXRhLT5iYW5kc1tpbmZvLT5iYW5kXSwgc3RhKTsKIApAQCAtNDQxLDcgKzQ0MSw3IEBACiAJCSAqIG9uZS4KIAkJICogTmVlZCB0byBoYW5kbGUgdGhpcy4KIAkJICovCi0JCXR4X2NtZC0+c2VjX2N0bCB8PSBUWF9DTURfU0VDX0dDTVAgfCBUQ19DTURfU0VDX0tFWV9GUk9NX1RBQkxFOworCQl0eF9jbWQtPnNlY19jdGwgfD0gVFhfQ01EX1NFQ19HQ01QIHwgVFhfQ01EX1NFQ19LRVlfRlJPTV9UQUJMRTsKIAkJdHhfY21kLT5rZXlbMF0gPSBrZXljb25mLT5od19rZXlfaWR4OwogCQlpd2xfbXZtX3NldF90eF9jbWRfcG4oaW5mbywgY3J5cHRvX2hkcik7CiAJCWJyZWFrOwpAQCAtNDkwLDE2ICs0OTAsMzQgQEAKIHN0YXRpYyBpbnQgaXdsX212bV9nZXRfY3RybF92aWZfcXVldWUoc3RydWN0IGl3bF9tdm0gKm12bSwKIAkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sIF9fbGUxNiBmYykKIHsKLQlpZiAoaXdsX212bV9pc19kcWFfc3VwcG9ydGVkKG12bSkpIHsKLQkJaWYgKGluZm8tPmNvbnRyb2wudmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQICYmCi0JCSAgICBpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykpCi0JCQlyZXR1cm4gSVdMX01WTV9EUUFfQVBfUFJPQkVfUkVTUF9RVUVVRTsKLQkJZWxzZSBpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpICYmCi0JCQkgaW5mby0+Y29udHJvbC52aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSkKLQkJCXJldHVybiBJV0xfTVZNX0RRQV9QMlBfREVWSUNFX1FVRVVFOwotCX0KKwlpZiAoIWl3bF9tdm1faXNfZHFhX3N1cHBvcnRlZChtdm0pKQorCQlyZXR1cm4gaW5mby0+aHdfcXVldWU7CiAKLQlyZXR1cm4gaW5mby0+aHdfcXVldWU7CisJc3dpdGNoIChpbmZvLT5jb250cm9sLnZpZi0+dHlwZSkgeworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CisJCS8qCisJCSAqIGhhbmRsZSBsZWdhY3kgaG9zdGFwZCBhcyB3ZWxsLCB3aGVyZSBzdGF0aW9uIG1heSBiZSBhZGRlZAorCQkgKiBvbmx5IGFmdGVyIGFzc29jLgorCQkgKi8KKwkJaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGZjKSB8fCBpZWVlODAyMTFfaXNfYXV0aChmYykpCisJCQlyZXR1cm4gSVdMX01WTV9EUUFfQVBfUFJPQkVfUkVTUF9RVUVVRTsKKwkJaWYgKGluZm8tPmh3X3F1ZXVlID09IGluZm8tPmNvbnRyb2wudmlmLT5jYWJfcXVldWUpCisJCQlyZXR1cm4gaW5mby0+aHdfcXVldWU7CisKKwkJV0FSTl9PTl9PTkNFKDEpOworCQlyZXR1cm4gSVdMX01WTV9EUUFfQVBfUFJPQkVfUkVTUF9RVUVVRTsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CisJCWlmIChpZWVlODAyMTFfaXNfbWdtdChmYykpCisJCQlyZXR1cm4gSVdMX01WTV9EUUFfUDJQX0RFVklDRV9RVUVVRTsKKwkJaWYgKGluZm8tPmh3X3F1ZXVlID09IGluZm8tPmNvbnRyb2wudmlmLT5jYWJfcXVldWUpCisJCQlyZXR1cm4gaW5mby0+aHdfcXVldWU7CisKKwkJV0FSTl9PTl9PTkNFKDEpOworCQlyZXR1cm4gSVdMX01WTV9EUUFfUDJQX0RFVklDRV9RVUVVRTsKKwlkZWZhdWx0OgorCQlXQVJOX09OQ0UoMSwgIk5vdCBhIGN0cmwgdmlmLCBubyBhdmFpbGFibGUgcXVldWVcbiIpOworCQlyZXR1cm4gLTE7CisJfQogfQogCiBpbnQgaXdsX212bV90eF9za2Jfbm9uX3N0YShzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtNTEzLDYgKzUzMSwxNSBAQAogCWludCBoZHJsZW4gPSBpZWVlODAyMTFfaGRybGVuKGhkci0+ZnJhbWVfY29udHJvbCk7CiAJaW50IHF1ZXVlOwogCisJLyogSVdMX01WTV9PRkZDSEFOTkVMX1FVRVVFIGlzIHVzZWQgZm9yIFJPQyBwYWNrZXRzIHRoYXQgY2FuIGJlIHVzZWQKKwkgKiBpbiAyIGRpZmZlcmVudCB0eXBlcyBvZiB2aWZzLCBQMlAgJiBTVEFUSU9OLiBQMlAgdXNlcyB0aGUgb2ZmY2hhbm5lbAorCSAqIHF1ZXVlLiBTVEFUSU9OIChIUzIuMCkgdXNlcyB0aGUgYXV4aWxpYXJ5IGNvbnRleHQgb2YgdGhlIEZXLAorCSAqIGFuZCBoZW5jZSBuZWVkcyB0byBiZSBzZW50IG9uIHRoZSBhdXggcXVldWUKKwkgKi8KKwlpZiAoSUVFRTgwMjExX1NLQl9DQihza2IpLT5od19xdWV1ZSA9PSBJV0xfTVZNX09GRkNIQU5ORUxfUVVFVUUgJiYKKwkgICAgc2tiX2luZm8tPmNvbnRyb2wudmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCisJCUlFRUU4MDIxMV9TS0JfQ0Ioc2tiKS0+aHdfcXVldWUgPSBtdm0tPmF1eF9xdWV1ZTsKKwogCW1lbWNweSgmaW5mbywgc2tiLT5jYiwgc2l6ZW9mKGluZm8pKTsKIAogCWlmIChXQVJOX09OX09OQ0UoaW5mby5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpKQpAQCAtNTI2LDE2ICs1NTMsNiBAQAogCS8qIFRoaXMgaG9sZHMgdGhlIGFtc2R1IGhlYWRlcnMgbGVuZ3RoICovCiAJc2tiX2luZm8tPmRyaXZlcl9kYXRhWzBdID0gKHZvaWQgKikodWludHB0cl90KTA7CiAKLQkvKgotCSAqIElXTF9NVk1fT0ZGQ0hBTk5FTF9RVUVVRSBpcyB1c2VkIGZvciBST0MgcGFja2V0cyB0aGF0IGNhbiBiZSB1c2VkCi0JICogaW4gMiBkaWZmZXJlbnQgdHlwZXMgb2YgdmlmcywgUDJQICYgU1RBVElPTi4gUDJQIHVzZXMgdGhlIG9mZmNoYW5uZWwKLQkgKiBxdWV1ZS4gU1RBVElPTiAoSFMyLjApIHVzZXMgdGhlIGF1eGlsaWFyeSBjb250ZXh0IG9mIHRoZSBGVywKLQkgKiBhbmQgaGVuY2UgbmVlZHMgdG8gYmUgc2VudCBvbiB0aGUgYXV4IHF1ZXVlCi0JICovCi0JaWYgKElFRUU4MDIxMV9TS0JfQ0Ioc2tiKS0+aHdfcXVldWUgPT0gSVdMX01WTV9PRkZDSEFOTkVMX1FVRVVFICYmCi0JICAgIGluZm8uY29udHJvbC52aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKLQkJSUVFRTgwMjExX1NLQl9DQihza2IpLT5od19xdWV1ZSA9IG12bS0+YXV4X3F1ZXVlOwotCiAJcXVldWUgPSBpbmZvLmh3X3F1ZXVlOwogCiAJLyoKQEAgLTU2MCw2ICs1NzcsOSBAQAogCQkJc3RhX2lkID0gbXZtdmlmLT5iY2FzdF9zdGEuc3RhX2lkOwogCQkJcXVldWUgPSBpd2xfbXZtX2dldF9jdHJsX3ZpZl9xdWV1ZShtdm0sICZpbmZvLAogCQkJCQkJCSAgIGhkci0+ZnJhbWVfY29udHJvbCk7CisJCQlpZiAocXVldWUgPCAwKQorCQkJCXJldHVybiAtMTsKKwogCQl9IGVsc2UgaWYgKGluZm8uY29udHJvbC52aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgogCQkJICAgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpIHsKIAkJCXU4IGFwX3N0YV9pZCA9IEFDQ0VTU19PTkNFKG12bXZpZi0+YXBfc3RhX2lkKTsKQEAgLTgzOCw2ICs4NTgsMjIgQEAKIAl9CiB9CiAKKy8qIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgdGltZWQtb3V0IFRJRHMgb24gYSBnaXZlbiBzaGFyZWQgVFhRICovCitzdGF0aWMgYm9vbCBpd2xfbXZtX3R4cV9zaG91bGRfdXBkYXRlKHN0cnVjdCBpd2xfbXZtICptdm0sIGludCB0eHFfaWQpCit7CisJdW5zaWduZWQgbG9uZyBxdWV1ZV90aWRfYml0bWFwID0gbXZtLT5xdWV1ZV9pbmZvW3R4cV9pZF0udGlkX2JpdG1hcDsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJaW50IHRpZDsKKworCWZvcl9lYWNoX3NldF9iaXQodGlkLCAmcXVldWVfdGlkX2JpdG1hcCwgSVdMX01BWF9USURfQ09VTlQgKyAxKSB7CisJCWlmICh0aW1lX2JlZm9yZShtdm0tPnF1ZXVlX2luZm9bdHhxX2lkXS5sYXN0X2ZyYW1lX3RpbWVbdGlkXSArCisJCQkJSVdMX01WTV9EUUFfUVVFVUVfVElNRU9VVCwgbm93KSkKKwkJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKwogLyoKICAqIFNldHMgdGhlIGZpZWxkcyBpbiB0aGUgVHggY21kIHRoYXQgYXJlIGNyeXB0byByZWxhdGVkCiAgKi8KQEAgLTkwNCw5ICs5NDAsMTMgQEAKIAkJdGlkID0gSVdMX01BWF9USURfQ09VTlQ7CiAJfQogCi0JaWYgKGl3bF9tdm1faXNfZHFhX3N1cHBvcnRlZChtdm0pKQorCWlmIChpd2xfbXZtX2lzX2RxYV9zdXBwb3J0ZWQobXZtKSkgewogCQl0eHFfaWQgPSBtdm1zdGEtPnRpZF9kYXRhW3RpZF0udHhxX2lkOwogCisJCWlmIChpZWVlODAyMTFfaXNfbWdtdChmYykpCisJCQl0eF9jbWQtPnRpZF90c3BlYyA9IElXTF9USURfTk9OX1FPUzsKKwl9CisKIAkvKiBDb3B5IE1BQyBoZWFkZXIgZnJvbSBza2IgaW50byBjb21tYW5kIGJ1ZmZlciAqLwogCW1lbWNweSh0eF9jbWQtPmhkciwgaGRyLCBoZHJsZW4pOwogCkBAIC05NDAsNyArOTgwLDYgQEAKIAkJCWl3bF90cmFuc19mcmVlX3R4X2NtZChtdm0tPnRyYW5zLCBkZXZfY21kKTsKIAkJCXNwaW5fdW5sb2NrKCZtdm1zdGEtPmxvY2spOwogCQkJcmV0dXJuIDA7Ci0KIAkJfQogCiAJCS8qIElmIHdlIGFyZSBoZXJlIC0gVFhRIGV4aXN0cyBhbmQgbmVlZHMgdG8gYmUgcmUtYWN0aXZhdGVkICovCkBAIC05NTMsOCArOTkyLDI1IEBACiAJCQkJICAgIHR4cV9pZCk7CiAJfQogCi0JLyogS2VlcCB0cmFjayBvZiB0aGUgdGltZSBvZiB0aGUgbGFzdCBmcmFtZSBmb3IgdGhpcyBSQS9USUQgKi8KLQltdm0tPnF1ZXVlX2luZm9bdHhxX2lkXS5sYXN0X2ZyYW1lX3RpbWVbdGlkXSA9IGppZmZpZXM7CisJaWYgKGl3bF9tdm1faXNfZHFhX3N1cHBvcnRlZChtdm0pKSB7CisJCS8qIEtlZXAgdHJhY2sgb2YgdGhlIHRpbWUgb2YgdGhlIGxhc3QgZnJhbWUgZm9yIHRoaXMgUkEvVElEICovCisJCW12bS0+cXVldWVfaW5mb1t0eHFfaWRdLmxhc3RfZnJhbWVfdGltZVt0aWRdID0gamlmZmllczsKKworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIHRpbWVkLW91dCBUSURzIC0gc2NoZWR1bGUgdGhlIHdvcmtlciB0aGF0IHdpbGwKKwkJICogcmVjb25maWcgdGhlIHF1ZXVlcyBhbmQgdXBkYXRlIHRoZW0KKwkJICoKKwkJICogTm90ZSB0aGF0IHRoZSBtdm0tPnF1ZXVlX2luZm9fbG9jayBpc24ndCBiZWluZyB0YWtlbiBoZXJlIGluCisJCSAqIG9yZGVyIHRvIG5vdCBzZXJpYWxpemUgdGhlIFRYIGZsb3cuIFRoaXMgaXNuJ3QgZGFuZ2Vyb3VzCisJCSAqIGJlY2F1c2Ugc2NoZWR1bGluZyBtdm0tPmFkZF9zdHJlYW1fd2sgY2FuJ3QgcnVpbiB0aGUgc3RhdGUsCisJCSAqIGFuZCBpZiB3ZSBET04nVCBzY2hlZHVsZSBpdCBkdWUgdG8gc29tZSByYWNlIGNvbmRpdGlvbiB0aGVuCisJCSAqIG5leHQgVFggd2UgZ2V0IGhlcmUgd2Ugd2lsbC4KKwkJICovCisJCWlmICh1bmxpa2VseShtdm0tPnF1ZXVlX2luZm9bdHhxX2lkXS5zdGF0dXMgPT0KKwkJCSAgICAgSVdMX01WTV9RVUVVRV9TSEFSRUQgJiYKKwkJCSAgICAgaXdsX212bV90eHFfc2hvdWxkX3VwZGF0ZShtdm0sIHR4cV9pZCkpKQorCQkJc2NoZWR1bGVfd29yaygmbXZtLT5hZGRfc3RyZWFtX3drKTsKKwl9CiAKIAlJV0xfREVCVUdfVFgobXZtLCAiVFggdG8gWyVkfCVkXSBROiVkIC0gc2VxOiAweCV4XG4iLCBtdm1zdGEtPnN0YV9pZCwKIAkJICAgICB0aWQsIHR4cV9pZCwgSUVFRTgwMjExX1NFUV9UT19TTihzZXFfbnVtYmVyKSk7CkBAIC0xMDY4LDkgKzExMjQsMTMgQEAKIAkJSVdMX0RFQlVHX1RYX1FVRVVFUyhtdm0sCiAJCQkJICAgICJDYW4gY29udGludWUgREVMQkEgZmxvdyBzc24gPSBuZXh0X3JlY2wgPSAlZFxuIiwKIAkJCQkgICAgdGlkX2RhdGEtPm5leHRfcmVjbGFpbWVkKTsKLQkJaXdsX212bV9kaXNhYmxlX3R4cShtdm0sIHRpZF9kYXRhLT50eHFfaWQsCi0JCQkJICAgIHZpZi0+aHdfcXVldWVbdGlkX3RvX21hYzgwMjExX2FjW3RpZF1dLCB0aWQsCi0JCQkJICAgIENNRF9BU1lOQyk7CisJCWlmICghaXdsX212bV9pc19kcWFfc3VwcG9ydGVkKG12bSkpIHsKKwkJCXU4IG1hYzgwMjExX2FjID0gdGlkX3RvX21hYzgwMjExX2FjW3RpZF07CisKKwkJCWl3bF9tdm1fZGlzYWJsZV90eHEobXZtLCB0aWRfZGF0YS0+dHhxX2lkLAorCQkJCQkgICAgdmlmLT5od19xdWV1ZVttYWM4MDIxMV9hY10sIHRpZCwKKwkJCQkJICAgIENNRF9BU1lOQyk7CisJCX0KIAkJdGlkX2RhdGEtPnN0YXRlID0gSVdMX0FHR19PRkY7CiAJCWllZWU4MDIxMV9zdG9wX3R4X2JhX2NiX2lycXNhZmUodmlmLCBzdGEtPmFkZHIsIHRpZCk7CiAJCWJyZWFrOwpAQCAtMTU0OCw0MSArMTYwOCwxNiBAQAogCQlpd2xfbXZtX3J4X3R4X2NtZF9hZ2cobXZtLCBwa3QpOwogfQogCi1zdGF0aWMgdm9pZCBpd2xfbXZtX3R4X2luZm9fZnJvbV9iYV9ub3RpZihzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCi0JCQkJCSAgc3RydWN0IGl3bF9tdm1fYmFfbm90aWYgKmJhX25vdGlmLAotCQkJCQkgIHN0cnVjdCBpd2xfbXZtX3RpZF9kYXRhICp0aWRfZGF0YSkKK3N0YXRpYyB2b2lkIGl3bF9tdm1fdHhfcmVjbGFpbShzdHJ1Y3QgaXdsX212bSAqbXZtLCBpbnQgc3RhX2lkLCBpbnQgdGlkLAorCQkJICAgICAgIGludCB0eHEsIGludCBpbmRleCwKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmJhX2luZm8sIHUzMiByYXRlKQogewotCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FNUERVOwotCWluZm8tPnN0YXR1cy5hbXBkdV9hY2tfbGVuID0gYmFfbm90aWYtPnR4ZWRfMl9kb25lOwotCWluZm8tPnN0YXR1cy5hbXBkdV9sZW4gPSBiYV9ub3RpZi0+dHhlZDsKLQlpd2xfbXZtX2h3cmF0ZV90b190eF9zdGF0dXModGlkX2RhdGEtPnJhdGVfbl9mbGFncywKLQkJCQkgICAgaW5mbyk7Ci0JLyogVE9ETzogbm90IGFjY291bnRlZCBpZiB0aGUgd2hvbGUgQS1NUERVIGZhaWxlZCAqLwotCWluZm8tPnN0YXR1cy50eF90aW1lID0gdGlkX2RhdGEtPnR4X3RpbWU7Ci0JaW5mby0+c3RhdHVzLnN0YXR1c19kcml2ZXJfZGF0YVswXSA9Ci0JCSh2b2lkICopKHVpbnRwdHJfdCliYV9ub3RpZi0+cmVkdWNlZF90eHA7Ci0JaW5mby0+c3RhdHVzLnN0YXR1c19kcml2ZXJfZGF0YVsxXSA9Ci0JCSh2b2lkICopKHVpbnRwdHJfdCl0aWRfZGF0YS0+cmF0ZV9uX2ZsYWdzOwotfQotCi12b2lkIGl3bF9tdm1fcnhfYmFfbm90aWYoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGl3bF9yeF9jbWRfYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGl3bF9tdm1fYmFfbm90aWYgKmJhX25vdGlmID0gKHZvaWQgKilwa3QtPmRhdGE7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCByZWNsYWltZWRfc2ticzsKIAlzdHJ1Y3QgaXdsX212bV90aWRfZGF0YSAqdGlkX2RhdGE7CiAJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKIAlzdHJ1Y3QgaXdsX212bV9zdGEgKm12bXN0YTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCBzdGFfaWQsIHRpZCwgZnJlZWQ7Ci0JLyogImZsb3ciIGNvcnJlc3BvbmRzIHRvIFR4IHF1ZXVlICovCi0JdTE2IHNjZF9mbG93ID0gbGUxNl90b19jcHUoYmFfbm90aWYtPnNjZF9mbG93KTsKLQkvKiAic3NuIiBpcyBzdGFydCBvZiBibG9jay1hY2sgVHggd2luZG93LCBjb3JyZXNwb25kcyB0byBpbmRleAotCSAqIChpbiBUeCBxdWV1ZSdzIGNpcmN1bGFyIGJ1ZmZlcikgb2YgZmlyc3QgVEZEL2ZyYW1lIGluIHdpbmRvdyAqLwotCXUxNiBiYV9yZXNwX3NjZF9zc24gPSBsZTE2X3RvX2NwdShiYV9ub3RpZi0+c2NkX3Nzbik7Ci0KLQlzdGFfaWQgPSBiYV9ub3RpZi0+c3RhX2lkOwotCXRpZCA9IGJhX25vdGlmLT50aWQ7CisJaW50IGZyZWVkOwogCiAJaWYgKFdBUk5fT05DRShzdGFfaWQgPj0gSVdMX01WTV9TVEFUSU9OX0NPVU5UIHx8CiAJCSAgICAgIHRpZCA+PSBJV0xfTUFYX1RJRF9DT1VOVCwKQEAgLTE2MDIsMTAgKzE2MzcsMTAgQEAKIAltdm1zdGEgPSBpd2xfbXZtX3N0YV9mcm9tX21hYzgwMjExKHN0YSk7CiAJdGlkX2RhdGEgPSAmbXZtc3RhLT50aWRfZGF0YVt0aWRdOwogCi0JaWYgKHRpZF9kYXRhLT50eHFfaWQgIT0gc2NkX2Zsb3cpIHsKKwlpZiAodGlkX2RhdGEtPnR4cV9pZCAhPSB0eHEpIHsKIAkJSVdMX0VSUihtdm0sCi0JCQkiaW52YWxpZCBCQSBub3RpZmljYXRpb246IFEgJWQsIHRpZCAlZCwgZmxvdyAlZFxuIiwKLQkJCXRpZF9kYXRhLT50eHFfaWQsIHRpZCwgc2NkX2Zsb3cpOworCQkJImludmFsaWQgQkEgbm90aWZpY2F0aW9uOiBRICVkLCB0aWQgJWRcbiIsCisJCQl0aWRfZGF0YS0+dHhxX2lkLCB0aWQpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE2MTksMjcgKzE2NTQsMTQgQEAKIAkgKiBibG9jay1hY2sgd2luZG93ICh3ZSBhc3N1bWUgdGhhdCB0aGV5J3ZlIGJlZW4gc3VjY2Vzc2Z1bGx5CiAJICogdHJhbnNtaXR0ZWQgLi4uIGlmIG5vdCwgaXQncyB0b28gbGF0ZSBhbnl3YXkpLgogCSAqLwotCWl3bF90cmFuc19yZWNsYWltKG12bS0+dHJhbnMsIHNjZF9mbG93LCBiYV9yZXNwX3NjZF9zc24sCi0JCQkgICZyZWNsYWltZWRfc2ticyk7CisJaXdsX3RyYW5zX3JlY2xhaW0obXZtLT50cmFucywgdHhxLCBpbmRleCwgJnJlY2xhaW1lZF9za2JzKTsKIAotCUlXTF9ERUJVR19UWF9SRVBMWShtdm0sCi0JCQkgICAiQkFfTk9USUZJQ0FUSU9OIFJlY2VpdmVkIGZyb20gJXBNLCBzdGFfaWQgPSAlZFxuIiwKLQkJCSAgICh1OCAqKSZiYV9ub3RpZi0+c3RhX2FkZHJfbG8zMiwKLQkJCSAgIGJhX25vdGlmLT5zdGFfaWQpOwotCUlXTF9ERUJVR19UWF9SRVBMWShtdm0sCi0JCQkgICAiVElEID0gJWQsIFNlcUN0bCA9ICVkLCBiaXRtYXAgPSAweCVsbHgsIHNjZF9mbG93ID0gJWQsIHNjZF9zc24gPSAlZCBzZW50OiVkLCBhY2tlZDolZFxuIiwKLQkJCSAgIGJhX25vdGlmLT50aWQsIGxlMTZfdG9fY3B1KGJhX25vdGlmLT5zZXFfY3RsKSwKLQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoYmFfbm90aWYtPmJpdG1hcCksCi0JCQkgICBzY2RfZmxvdywgYmFfcmVzcF9zY2Rfc3NuLCBiYV9ub3RpZi0+dHhlZCwKLQkJCSAgIGJhX25vdGlmLT50eGVkXzJfZG9uZSk7Ci0KLQlJV0xfREVCVUdfVFhfUkVQTFkobXZtLCAicmVkdWNlZCB0eHAgZnJvbSBiYSBub3RpZiAlZFxuIiwKLQkJCSAgIGJhX25vdGlmLT5yZWR1Y2VkX3R4cCk7Ci0JdGlkX2RhdGEtPm5leHRfcmVjbGFpbWVkID0gYmFfcmVzcF9zY2Rfc3NuOworCXRpZF9kYXRhLT5uZXh0X3JlY2xhaW1lZCA9IGluZGV4OwogCiAJaXdsX212bV9jaGVja19yYXRpZF9lbXB0eShtdm0sIHN0YSwgdGlkKTsKIAogCWZyZWVkID0gMDsKKwliYV9pbmZvLT5zdGF0dXMuc3RhdHVzX2RyaXZlcl9kYXRhWzFdID0gKHZvaWQgKikodWludHB0cl90KXJhdGU7CiAKIAlza2JfcXVldWVfd2FsaygmcmVjbGFpbWVkX3NrYnMsIHNrYikgewogCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHZvaWQgKilza2ItPmRhdGE7CkBAIC0xNjYxLDggKzE2ODMsMTIgQEAKIAogCQkvKiB0aGlzIGlzIHRoZSBmaXJzdCBza2Igd2UgZGVsaXZlciBpbiB0aGlzIGJhdGNoICovCiAJCS8qIHB1dCB0aGUgcmF0ZSBzY2FsaW5nIGRhdGEgdGhlcmUgKi8KLQkJaWYgKGZyZWVkID09IDEpCi0JCQlpd2xfbXZtX3R4X2luZm9fZnJvbV9iYV9ub3RpZihpbmZvLCBiYV9ub3RpZiwgdGlkX2RhdGEpOworCQlpZiAoZnJlZWQgPT0gMSkgeworCQkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQU1QRFU7CisJCQltZW1jcHkoJmluZm8tPnN0YXR1cywgJmJhX2luZm8tPnN0YXR1cywKKwkJCSAgICAgICBzaXplb2YoYmFfaW5mby0+c3RhdHVzKSk7CisJCQlpd2xfbXZtX2h3cmF0ZV90b190eF9zdGF0dXMocmF0ZSwgaW5mbyk7CisJCX0KIAl9CiAKIAlzcGluX3VubG9ja19iaCgmbXZtc3RhLT5sb2NrKTsKQEAgLTE2NzIsNyArMTY5OCw2IEBACiAJICogU3RpbGwgaXQncyBpbXBvcnRhbnQgdG8gdXBkYXRlIFJTIGFib3V0IHNlbnQgdnMuIGFja2VkLgogCSAqLwogCWlmIChza2JfcXVldWVfZW1wdHkoJnJlY2xhaW1lZF9za2JzKSkgewotCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gYmFfaW5mbyA9IHt9OwogCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHhfY29uZiAqY2hhbmN0eF9jb25mID0gTlVMTDsKIAogCQlpZiAobXZtc3RhLT52aWYpCkBAIC0xNjgyLDExICsxNzA3LDExIEBACiAJCWlmIChXQVJOX09OX09OQ0UoIWNoYW5jdHhfY29uZikpCiAJCQlnb3RvIG91dDsKIAotCQliYV9pbmZvLmJhbmQgPSBjaGFuY3R4X2NvbmYtPmRlZi5jaGFuLT5iYW5kOwotCQlpd2xfbXZtX3R4X2luZm9fZnJvbV9iYV9ub3RpZigmYmFfaW5mbywgYmFfbm90aWYsIHRpZF9kYXRhKTsKKwkJYmFfaW5mby0+YmFuZCA9IGNoYW5jdHhfY29uZi0+ZGVmLmNoYW4tPmJhbmQ7CisJCWl3bF9tdm1faHdyYXRlX3RvX3R4X3N0YXR1cyhyYXRlLCBiYV9pbmZvKTsKIAogCQlJV0xfREVCVUdfVFhfUkVQTFkobXZtLCAiTm8gcmVjbGFpbS4gVXBkYXRlIHJzIGRpcmVjdGx5XG4iKTsKLQkJaXdsX212bV9yc190eF9zdGF0dXMobXZtLCBzdGEsIHRpZCwgJmJhX2luZm8sIGZhbHNlKTsKKwkJaXdsX212bV9yc190eF9zdGF0dXMobXZtLCBzdGEsIHRpZCwgYmFfaW5mbywgZmFsc2UpOwogCX0KIAogb3V0OgpAQCAtMTY5OCw2ICsxNzIzLDkyIEBACiAJfQogfQogCit2b2lkIGl3bF9tdm1fcnhfYmFfbm90aWYoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGl3bF9yeF9jbWRfYnVmZmVyICpyeGIpCit7CisJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJaW50IHN0YV9pZCwgdGlkLCB0eHEsIGluZGV4OworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyBiYV9pbmZvID0ge307CisJc3RydWN0IGl3bF9tdm1fYmFfbm90aWYgKmJhX25vdGlmOworCXN0cnVjdCBpd2xfbXZtX3RpZF9kYXRhICp0aWRfZGF0YTsKKwlzdHJ1Y3QgaXdsX212bV9zdGEgKm12bXN0YTsKKworCWlmIChpd2xfbXZtX2hhc19uZXdfdHhfYXBpKG12bSkpIHsKKwkJc3RydWN0IGl3bF9tdm1fY29tcHJlc3NlZF9iYV9ub3RpZiAqYmFfcmVzID0KKwkJCSh2b2lkICopcGt0LT5kYXRhOworCisJCXN0YV9pZCA9IGJhX3Jlcy0+c3RhX2lkOworCQliYV9pbmZvLnN0YXR1cy5hbXBkdV9hY2tfbGVuID0gKHU4KWxlMTZfdG9fY3B1KGJhX3Jlcy0+ZG9uZSk7CisJCWJhX2luZm8uc3RhdHVzLmFtcGR1X2xlbiA9ICh1OClsZTE2X3RvX2NwdShiYV9yZXMtPnR4ZWQpOworCQliYV9pbmZvLnN0YXR1cy50eF90aW1lID0KKwkJCSh1MTYpbGUzMl90b19jcHUoYmFfcmVzLT53aXJlbGVzc190aW1lKTsKKwkJYmFfaW5mby5zdGF0dXMuc3RhdHVzX2RyaXZlcl9kYXRhWzBdID0KKwkJCSh2b2lkICopKHVpbnRwdHJfdCliYV9yZXMtPnJlZHVjZWRfdHhwOworCisJCS8qCisJCSAqIFRPRE86CisJCSAqIFdoZW4gc3VwcG9ydGluZyBtdWx0aSBUSUQgYWdncmVnYXRpb25zIC0gd2UgbmVlZCB0byBtb3ZlCisJCSAqIG5leHRfcmVjbGFpbWVkIHRvIGJlIHBlciBUWFEgYW5kIG5vdCBwZXIgVElEIG9yIGhhbmRsZSBpdAorCQkgKiBpbiBhIGRpZmZlcmVudCB3YXkuCisJCSAqIFRoaXMgd2lsbCBnbyB0b2dldGhlciB3aXRoIFNOIGFuZCBBZGRCQSBvZmZsb2FkIGFuZCBjYW5ub3QKKwkJICogYmUgaGFuZGxlZCBwcm9wZXJseSBmb3Igbm93LgorCQkgKi8KKwkJV0FSTl9PTihsZTE2X3RvX2NwdShiYV9yZXMtPnRmZF9jbnQpICE9IDEpOworCQlpd2xfbXZtX3R4X3JlY2xhaW0obXZtLCBzdGFfaWQsIGJhX3Jlcy0+cmFfdGlkWzBdLnRpZCwKKwkJCQkgICAoaW50KWJhX3Jlcy0+dGZkWzBdLnFfbnVtLAorCQkJCSAgIGxlMTZfdG9fY3B1KGJhX3Jlcy0+dGZkWzBdLnRmZF9pbmRleCksCisJCQkJICAgJmJhX2luZm8sIGxlMzJfdG9fY3B1KGJhX3Jlcy0+dHhfcmF0ZSkpOworCisJCUlXTF9ERUJVR19UWF9SRVBMWShtdm0sCisJCQkJICAgIkJBX05PVElGSUNBVElPTiBSZWNlaXZlZCBmcm9tIHN0YV9pZCA9ICVkLCBmbGFncyAleCwgc2VudDolZCwgYWNrZWQ6JWRcbiIsCisJCQkJICAgc3RhX2lkLCBsZTMyX3RvX2NwdShiYV9yZXMtPmZsYWdzKSwKKwkJCQkgICBsZTE2X3RvX2NwdShiYV9yZXMtPnR4ZWQpLAorCQkJCSAgIGxlMTZfdG9fY3B1KGJhX3Jlcy0+ZG9uZSkpOworCQlyZXR1cm47CisJfQorCisJYmFfbm90aWYgPSAodm9pZCAqKXBrdC0+ZGF0YTsKKwlzdGFfaWQgPSBiYV9ub3RpZi0+c3RhX2lkOworCXRpZCA9IGJhX25vdGlmLT50aWQ7CisJLyogImZsb3ciIGNvcnJlc3BvbmRzIHRvIFR4IHF1ZXVlICovCisJdHhxID0gbGUxNl90b19jcHUoYmFfbm90aWYtPnNjZF9mbG93KTsKKwkvKiAic3NuIiBpcyBzdGFydCBvZiBibG9jay1hY2sgVHggd2luZG93LCBjb3JyZXNwb25kcyB0byBpbmRleAorCSAqIChpbiBUeCBxdWV1ZSdzIGNpcmN1bGFyIGJ1ZmZlcikgb2YgZmlyc3QgVEZEL2ZyYW1lIGluIHdpbmRvdyAqLworCWluZGV4ID0gbGUxNl90b19jcHUoYmFfbm90aWYtPnNjZF9zc24pOworCisJcmN1X3JlYWRfbG9jaygpOworCW12bXN0YSA9IGl3bF9tdm1fc3RhX2Zyb21fc3RhaWRfcmN1KG12bSwgc3RhX2lkKTsKKwlpZiAoV0FSTl9PTl9PTkNFKCFtdm1zdGEpKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm47CisJfQorCisJdGlkX2RhdGEgPSAmbXZtc3RhLT50aWRfZGF0YVt0aWRdOworCisJYmFfaW5mby5zdGF0dXMuYW1wZHVfYWNrX2xlbiA9IGJhX25vdGlmLT50eGVkXzJfZG9uZTsKKwliYV9pbmZvLnN0YXR1cy5hbXBkdV9sZW4gPSBiYV9ub3RpZi0+dHhlZDsKKwliYV9pbmZvLnN0YXR1cy50eF90aW1lID0gdGlkX2RhdGEtPnR4X3RpbWU7CisJYmFfaW5mby5zdGF0dXMuc3RhdHVzX2RyaXZlcl9kYXRhWzBdID0KKwkJKHZvaWQgKikodWludHB0cl90KWJhX25vdGlmLT5yZWR1Y2VkX3R4cDsKKworCXJjdV9yZWFkX3VubG9jaygpOworCisJaXdsX212bV90eF9yZWNsYWltKG12bSwgc3RhX2lkLCB0aWQsIHR4cSwgaW5kZXgsICZiYV9pbmZvLAorCQkJICAgdGlkX2RhdGEtPnJhdGVfbl9mbGFncyk7CisKKwlJV0xfREVCVUdfVFhfUkVQTFkobXZtLAorCQkJICAgIkJBX05PVElGSUNBVElPTiBSZWNlaXZlZCBmcm9tICVwTSwgc3RhX2lkID0gJWRcbiIsCisJCQkgICAodTggKikmYmFfbm90aWYtPnN0YV9hZGRyX2xvMzIsIGJhX25vdGlmLT5zdGFfaWQpOworCisJSVdMX0RFQlVHX1RYX1JFUExZKG12bSwKKwkJCSAgICJUSUQgPSAlZCwgU2VxQ3RsID0gJWQsIGJpdG1hcCA9IDB4JWxseCwgc2NkX2Zsb3cgPSAlZCwgc2NkX3NzbiA9ICVkIHNlbnQ6JWQsIGFja2VkOiVkXG4iLAorCQkJICAgYmFfbm90aWYtPnRpZCwgbGUxNl90b19jcHUoYmFfbm90aWYtPnNlcV9jdGwpLAorCQkJICAgbGU2NF90b19jcHUoYmFfbm90aWYtPmJpdG1hcCksIHR4cSwgaW5kZXgsCisJCQkgICBiYV9ub3RpZi0+dHhlZCwgYmFfbm90aWYtPnR4ZWRfMl9kb25lKTsKKworCUlXTF9ERUJVR19UWF9SRVBMWShtdm0sICJyZWR1Y2VkIHR4cCBmcm9tIGJhIG5vdGlmICVkXG4iLAorCQkJICAgYmFfbm90aWYtPnJlZHVjZWRfdHhwKTsKK30KKwogLyoKICAqIE5vdGUgdGhhdCB0aGVyZSBhcmUgdHJhbnNwb3J0cyB0aGF0IGJ1ZmZlciBmcmFtZXMgYmVmb3JlIHRoZXkgcmVhY2gKICAqIHRoZSBmaXJtd2FyZS4gVGhpcyBtZWFucyB0aGF0IGFmdGVyIGZsdXNoX3R4X3BhdGggaXMgY2FsbGVkLCB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3V0aWxzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS91dGlscy5jCmluZGV4IDY4ZjRlN2YuLmQwNGJhYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3V0aWxzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vdXRpbHMuYwpAQCAtNTEyLDcgKzUxMiw3IEBACiAJCQliYXNlID0gbXZtLT5mdy0+aW5zdF9lcnJsb2dfcHRyOwogCX0KIAotCWlmIChiYXNlIDwgMHg4MDAwMDApIHsKKwlpZiAoYmFzZSA8IDB4NDAwMDAwKSB7CiAJCUlXTF9FUlIobXZtLAogCQkJIk5vdCB2YWxpZCBlcnJvciBsb2cgcG9pbnRlciAweCUwOFggZm9yICVzIHVDb2RlXG4iLAogCQkJYmFzZSwKQEAgLTYxMCw3ICs2MTAsNyBAQAogewogCXN0cnVjdCBpd2xfc2NkX3R4cV9jZmdfY21kIGNtZCA9IHsKIAkJLnNjZF9xdWV1ZSA9IHF1ZXVlLAotCQkuZW5hYmxlID0gMSwKKwkJLmFjdGlvbiA9IFNDRF9DRkdfRU5BQkxFX1FVRVVFLAogCQkud2luZG93ID0gZnJhbWVfbGltaXQsCiAJCS5zdGFfaWQgPSBzdGFfaWQsCiAJCS5zc24gPSBjcHVfdG9fbGUxNihzc24pLApAQCAtNjY5LDYgKzY2OSw4IEBACiAJCQkJdGlkX3RvX21hYzgwMjExX2FjW2NmZy0+dGlkXTsKIAkJZWxzZQogCQkJbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5tYWM4MDIxMV9hYyA9IElFRUU4MDIxMV9BQ19WTzsKKworCQltdm0tPnF1ZXVlX2luZm9bcXVldWVdLnR4cV90aWQgPSBjZmctPnRpZDsKIAl9CiAKIAlJV0xfREVCVUdfVFhfUVVFVUVTKG12bSwKQEAgLTY4Miw3ICs2ODQsNyBAQAogCWlmIChlbmFibGVfcXVldWUpIHsKIAkJc3RydWN0IGl3bF9zY2RfdHhxX2NmZ19jbWQgY21kID0gewogCQkJLnNjZF9xdWV1ZSA9IHF1ZXVlLAotCQkJLmVuYWJsZSA9IDEsCisJCQkuYWN0aW9uID0gU0NEX0NGR19FTkFCTEVfUVVFVUUsCiAJCQkud2luZG93ID0gY2ZnLT5mcmFtZV9saW1pdCwKIAkJCS5zdGFfaWQgPSBjZmctPnN0YV9pZCwKIAkJCS5zc24gPSBjcHVfdG9fbGUxNihzc24pLApAQCAtNzA5LDcgKzcxMSw3IEBACiB7CiAJc3RydWN0IGl3bF9zY2RfdHhxX2NmZ19jbWQgY21kID0gewogCQkuc2NkX3F1ZXVlID0gcXVldWUsCi0JCS5lbmFibGUgPSAwLAorCQkuYWN0aW9uID0gU0NEX0NGR19ESVNBQkxFX1FVRVVFLAogCX07CiAJYm9vbCByZW1vdmVfbWFjX3F1ZXVlID0gdHJ1ZTsKIAlpbnQgcmV0OwpAQCAtNzQ0LDggKzc0Niw5IEBACiAJCQl+QklUKG1hYzgwMjExX3F1ZXVlKTsKIAltdm0tPnF1ZXVlX2luZm9bcXVldWVdLmh3X3F1ZXVlX3JlZmNvdW50LS07CiAKLQljbWQuZW5hYmxlID0gbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5od19xdWV1ZV9yZWZjb3VudCA/IDEgOiAwOwotCWlmICghY21kLmVuYWJsZSkKKwljbWQuYWN0aW9uID0gbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5od19xdWV1ZV9yZWZjb3VudCA/CisJCVNDRF9DRkdfRU5BQkxFX1FVRVVFIDogU0NEX0NGR19ESVNBQkxFX1FVRVVFOworCWlmIChjbWQuYWN0aW9uID09IFNDRF9DRkdfRElTQUJMRV9RVUVVRSkKIAkJbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5zdGF0dXMgPSBJV0xfTVZNX1FVRVVFX0ZSRUU7CiAKIAlJV0xfREVCVUdfVFhfUVVFVUVTKG12bSwKQEAgLTc1NSwxMiArNzU4LDEzIEBACiAJCQkgICAgbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5od19xdWV1ZV90b19tYWM4MDIxMSk7CiAKIAkvKiBJZiB0aGUgcXVldWUgaXMgc3RpbGwgZW5hYmxlZCAtIG5vdGhpbmcgbGVmdCB0byBkbyBpbiB0aGlzIGZ1bmMgKi8KLQlpZiAoY21kLmVuYWJsZSkgeworCWlmIChjbWQuYWN0aW9uID09IFNDRF9DRkdfRU5BQkxFX1FVRVVFKSB7CiAJCXNwaW5fdW5sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CiAJCXJldHVybjsKIAl9CiAKIAljbWQuc3RhX2lkID0gbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5yYV9zdGFfaWQ7CisJY21kLnRpZCA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0udHhxX3RpZDsKIAogCS8qIE1ha2Ugc3VyZSBxdWV1ZSBpbmZvIGlzIGNvcnJlY3QgZXZlbiB0aG91Z2ggd2Ugb3ZlcndyaXRlIGl0ICovCiAJV0FSTihtdm0tPnF1ZXVlX2luZm9bcXVldWVdLmh3X3F1ZXVlX3JlZmNvdW50IHx8CkBAIC0xMTMxLDcgKzExMzUsMTMgQEAKIAkJCUJJVChtdm1zdGEtPnZpZi0+aHdfcXVldWVbdGlkX3RvX21hYzgwMjExX2FjW3RpZF1dKTsKIAl9CiAKLQkvKiBUT0RPOiBpZiBxdWV1ZSB3YXMgc2hhcmVkIC0gbmVlZCB0byByZS1lbmFibGUgQUdHcyAqLworCS8qIElmIHRoZSBxdWV1ZSBpcyBtYXJrZWQgYXMgc2hhcmVkIC0gInVuc2hhcmUiIGl0ICovCisJaWYgKG12bS0+cXVldWVfaW5mb1txdWV1ZV0uaHdfcXVldWVfcmVmY291bnQgPT0gMSAmJgorCSAgICBtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnN0YXR1cyA9PSBJV0xfTVZNX1FVRVVFX1NIQVJFRCkgeworCQltdm0tPnF1ZXVlX2luZm9bcXVldWVdLnN0YXR1cyA9IElXTF9NVk1fUVVFVUVfUkVDT05GSUdVUklORzsKKwkJSVdMX0RFQlVHX1RYX1FVRVVFUyhtdm0sICJNYXJraW5nIFE6JWQgZm9yIHJlY29uZmlnXG4iLAorCQkJCSAgICBxdWV1ZSk7CisJfQogfQogCiB2b2lkIGl3bF9tdm1faW5hY3Rpdml0eV9jaGVjayhzdHJ1Y3QgaXdsX212bSAqbXZtKQpAQCAtMTIxNSw2ICsxMjI1LDI4IEBACiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKK3ZvaWQgaXdsX212bV9nZXRfc3luY190aW1lKHN0cnVjdCBpd2xfbXZtICptdm0sIHUzMiAqZ3AyLCB1NjQgKmJvb3R0aW1lKQoreworCWJvb2wgcHNfZGlzYWJsZWQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKKworCS8qIERpc2FibGUgcG93ZXIgc2F2ZSB3aGVuIHJlYWRpbmcgR1AyICovCisJcHNfZGlzYWJsZWQgPSBtdm0tPnBzX2Rpc2FibGVkOworCWlmICghcHNfZGlzYWJsZWQpIHsKKwkJbXZtLT5wc19kaXNhYmxlZCA9IHRydWU7CisJCWl3bF9tdm1fcG93ZXJfdXBkYXRlX2RldmljZShtdm0pOworCX0KKworCSpncDIgPSBpd2xfcmVhZF9wcnBoKG12bS0+dHJhbnMsIERFVklDRV9TWVNURU1fVElNRV9SRUcpOworCSpib290dGltZSA9IGt0aW1lX2dldF9ib290X25zKCk7CisKKwlpZiAoIXBzX2Rpc2FibGVkKSB7CisJCW12bS0+cHNfZGlzYWJsZWQgPSBwc19kaXNhYmxlZDsKKwkJaXdsX212bV9wb3dlcl91cGRhdGVfZGV2aWNlKG12bSk7CisJfQorfQorCiBpbnQgaXdsX212bV9zZW5kX2xxbV9jbWQoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCSBlbnVtIGl3bF9scW1fY21kX29wZXJhdHJpb25zIG9wZXJhdGlvbiwKIAkJCSB1MzIgZHVyYXRpb24sIHUzMiB0aW1lb3V0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL2Rydi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL2Rydi5jCmluZGV4IDc4Y2Y5YTcuLjAwMWJlNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS9kcnYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvZHJ2LmMKQEAgLTQ4Nyw2ICs0ODcsNyBAQAogCXtJV0xfUENJX0RFVklDRSgweDI0RkQsIDB4MTEzMCwgaXdsODI2NV8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MjRGRCwgMHgwMTMwLCBpd2w4MjY1XzJhY19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgyNEZELCAweDEwMTAsIGl3bDgyNjVfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDI0RkQsIDB4MTBEMCwgaXdsODI2NV8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MjRGRCwgMHgwMDUwLCBpd2w4MjY1XzJhY19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgyNEZELCAweDAxNTAsIGl3bDgyNjVfMmFjX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDI0RkQsIDB4OTAxMCwgaXdsODI2NV8yYWNfY2ZnKX0sCkBAIC01MDAsMjIgKzUwMSwzNiBAQAogCXtJV0xfUENJX0RFVklDRSgweDI0RkQsIDB4MDkzMCwgaXdsODI2NV8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MjRGRCwgMHgwOTUwLCBpd2w4MjY1XzJhY19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgyNEZELCAweDA4NTAsIGl3bDgyNjVfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDI0RkQsIDB4MDAxMiwgaXdsODI3NV8yYWNfY2ZnKX0sCiAKIC8qIDkwMDAgU2VyaWVzICovCisJe0lXTF9QQ0lfREVWSUNFKDB4MjcxQiwgMHgwMDEwLCBpd2w5MTYwXzJhY19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgyNTI2LCAweDAwMDAsIGl3bDkyNjBfMmFjX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDI1MjYsIDB4MDAxMCwgaXdsOTI2MF8yYWNfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwQTEwLCBpd2w5MjYwXzJhY19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDAwMTAsIGl3bDkyNjBfMmFjX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MDIxMCwgaXdsOTI2MF8yYWNfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwNDEwLCBpd2w5MjYwXzJhY19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDA2MTAsIGl3bDkyNjBfMmFjX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MDMxMCwgaXdsNTE2NV8yYWNfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwMDAwLCBpd2w1MTY1XzJhY19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDA1MTAsIGl3bDUxNjVfMmFjX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MjAxMCwgaXdsNTE2NV8yYWNfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MjUyNiwgMHgxNDIwLCBpd2w1MTY1XzJhY19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDA3MTAsIGl3bDUxNjVfMmFjX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MkExMCwgaXdsNTE2NV8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MjUyNiwgMHgxNDEwLCBpd2w5MjcwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDBBMTAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MDAxMCwgaXdsOTQ2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwMjEwLCBpd2w5NDYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDA0MTAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MDYxMCwgaXdsOTQ2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwMzEwLCBpd2w5NDYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDAwMDAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MDUxMCwgaXdsOTQ2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgyMDEwLCBpd2w5NDYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgyNTI2LCAweDE0MjAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MDcxMCwgaXdsOTQ2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgyQTEwLCBpd2w5NDYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgzMERDLCAweDAwNjAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDI1MjYsIDB4MDA2MCwgaXdsOTQ2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwMDYwLCBpd2w5NDYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHhBMzcwLCAweDAwNjAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDMxREMsIDB4MDA2MCwgaXdsOTQ2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MjUyNiwgMHgwMDMwLCBpd2w5NTYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDAwMzAsIGl3bDk1NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweEEzNzAsIDB4MDAzMCwgaXdsOTU2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MzFEQywgMHgwMDMwLCBpd2w5NTYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgyNTI2LCAweDEwMzAsIGl3bDk1NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweEEzNzAsIDB4MTAzMCwgaXdsOTU2MF8yYWNfY2ZnKX0sCiAKIC8qIGEwMDAgU2VyaWVzICovCiAJe0lXTF9QQ0lfREVWSUNFKDB4MjcyMCwgMHgwQTEwLCBpd2xhMDAwXzJhY19jZmcpfSwKQEAgLTYwOCw3ICs2MjMsNiBAQAogewogCWNvbnN0IHN0cnVjdCBpd2xfY2ZnICpjZmcgPSAoc3RydWN0IGl3bF9jZmcgKikoZW50LT5kcml2ZXJfZGF0YSk7CiAJY29uc3Qgc3RydWN0IGl3bF9jZmcgKmNmZ183MjY1ZCBfX21heWJlX3VudXNlZCA9IE5VTEw7Ci0JY29uc3Qgc3RydWN0IGl3bF9jZmcgKmNmZ185MjYwbGMgX19tYXliZV91bnVzZWQgPSBOVUxMOwogCXN0cnVjdCBpd2xfdHJhbnMgKml3bF90cmFuczsKIAlpbnQgcmV0OwogCkBAIC02MzcsMTEgKzY1MSwxMCBAQAogCX0KIAogCWlmIChpd2xfdHJhbnMtPmNmZy0+cmZfaWQpIHsKLQkJaWYgKGNmZyA9PSAmaXdsOTI2MF8yYWNfY2ZnKQotCQkJY2ZnXzkyNjBsYyA9ICZpd2w5MjYwbGNfMmFjX2NmZzsKLQkJaWYgKGNmZ185MjYwbGMgJiYgaXdsX3RyYW5zLT5od19yZl9pZCA9PSBDU1JfSFdfUkZfSURfVFlQRV9MQykgewotCQkJY2ZnID0gY2ZnXzkyNjBsYzsKLQkJCWl3bF90cmFucy0+Y2ZnID0gY2ZnXzkyNjBsYzsKKwkJaWYgKGNmZyA9PSAmaXdsOTQ2MF8yYWNfY2ZnICYmCisJCSAgICBpd2xfdHJhbnMtPmh3X3JmX2lkID09IENTUl9IV19SRl9JRF9UWVBFX0xDKSB7CisJCQljZmcgPSAmaXdsOTAwMGxjXzJhY19jZmc7CisJCQlpd2xfdHJhbnMtPmNmZyA9IGNmZzsKIAkJfQogCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL2ludGVybmFsLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvaW50ZXJuYWwuaAppbmRleCAxMWUzNDdkLi5jYWM2ZDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvaW50ZXJuYWwuaApAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogCiAjaW5jbHVkZSAiaXdsLWZoLmgiCiAjaW5jbHVkZSAiaXdsLWNzci5oIgpAQCAtNDksNyArNTAsNyBAQAogICogYmUgbmVlZGVkIGZvciBwb3RlbnRpYWwgZGF0YSBpbiB0aGUgU0tCJ3MgaGVhZC4gVGhlIHJlbWFpbmluZyBvbmVzIGNhbgogICogYmUgdXNlZCBmb3IgZnJhZ3MuCiAgKi8KLSNkZWZpbmUgSVdMX1BDSUVfTUFYX0ZSQUdTIChJV0xfTlVNX09GX1RCUyAtIDMpCisjZGVmaW5lIElXTF9QQ0lFX01BWF9GUkFHUyh4KSAoeC0+bWF4X3RicyAtIDMpCiAKIC8qCiAgKiBSWCByZWxhdGVkIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucwpAQCAtMTkyLDQxICsxOTMsOSBAQAogCS8qIG9ubHkgZm9yIFNZTkMgY29tbWFuZHMsIGlmZiB0aGUgcmVwbHkgc2tiIGlzIHdhbnRlZCAqLwogCXN0cnVjdCBpd2xfaG9zdF9jbWQgKnNvdXJjZTsKIAl1MzIgZmxhZ3M7CisJdTMyIHRiczsKIH07CiAKLS8qCi0gKiBHZW5lcmljIHF1ZXVlIHN0cnVjdHVyZQotICoKLSAqIENvbnRhaW5zIGNvbW1vbiBkYXRhIGZvciBSeCBhbmQgVHggcXVldWVzLgotICoKLSAqIE5vdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBURkRfUVVFVUVfU0laRV9NQVggYW5kIG5fd2luZG93OiB0aGUgaGFyZHdhcmUKLSAqIGFsd2F5cyBhc3N1bWVzIDI1NiBkZXNjcmlwdG9ycywgc28gVEZEX1FVRVVFX1NJWkVfTUFYIGlzIGFsd2F5cyAyNTYgKHVubGVzcwotICogdGhlcmUgbWlnaHQgYmUgSFcgY2hhbmdlcyBpbiB0aGUgZnV0dXJlKS4gRm9yIHRoZSBub3JtYWwgVFgKLSAqIHF1ZXVlcywgbl93aW5kb3csIHdoaWNoIGlzIHRoZSBzaXplIG9mIHRoZSBzb2Z0d2FyZSBxdWV1ZSBkYXRhCi0gKiBpcyBhbHNvIDI1NjsgaG93ZXZlciwgZm9yIHRoZSBjb21tYW5kIHF1ZXVlLCBuX3dpbmRvdyBpcyBvbmx5Ci0gKiAzMiBzaW5jZSB3ZSBkb24ndCBuZWVkIHNvIG1hbnkgY29tbWFuZHMgcGVuZGluZy4gU2luY2UgdGhlIEhXCi0gKiBzdGlsbCB1c2VzIDI1NiBCRHMgZm9yIERNQSB0aG91Z2gsIFRGRF9RVUVVRV9TSVpFX01BWCBzdGF5cyAyNTYuIEFzIGEgcmVzdWx0LAotICogdGhlIHNvZnR3YXJlIGJ1ZmZlcnMgKGluIHRoZSB2YXJpYWJsZXMgQG1ldGEsIEB0eGIgaW4gc3RydWN0Ci0gKiBpd2xfdHhxKSBvbmx5IGhhdmUgMzIgZW50cmllcywgd2hpbGUgdGhlIEhXIGJ1ZmZlcnMgKEB0ZmRzIGluCi0gKiB0aGUgc2FtZSBzdHJ1Y3QpIGhhdmUgMjU2LgotICogVGhpcyBtZWFucyB0aGF0IHdlIGVuZCB1cCB3aXRoIHRoZSBmb2xsb3dpbmc6Ci0gKiAgSFcgZW50cmllczogfCAwIHwgLi4uIHwgTiAqIDMyIHwgLi4uIHwgTiAqIDMyICsgMzEgfCAuLi4gfCAyNTUgfAotICogIFNXIGVudHJpZXM6ICAgICAgICAgICB8IDAgICAgICB8IC4uLiB8IDMxICAgICAgICAgIHwKLSAqIHdoZXJlIE4gaXMgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA3LiBUaGlzIG1lYW5zIHRoYXQgdGhlIFNXCi0gKiBkYXRhIGlzIGEgd2luZG93IG92ZXJsYXllZCBvdmVyIHRoZSBIVyBxdWV1ZS4KLSAqLwotc3RydWN0IGl3bF9xdWV1ZSB7Ci0JaW50IHdyaXRlX3B0cjsgICAgICAgLyogMS1zdCBlbXB0eSBlbnRyeSAoaW5kZXgpIGhvc3RfdyovCi0JaW50IHJlYWRfcHRyOyAgICAgICAgIC8qIGxhc3QgdXNlZCBlbnRyeSAoaW5kZXgpIGhvc3RfciovCi0JLyogdXNlIGZvciBtb25pdG9yaW5nIGFuZCByZWNvdmVyaW5nIHRoZSBzdHVjayBxdWV1ZSAqLwotCWRtYV9hZGRyX3QgZG1hX2FkZHI7ICAgLyogcGh5c2ljYWwgYWRkciBmb3IgQkQncyAqLwotCWludCBuX3dpbmRvdzsJICAgICAgIC8qIHNhZmUgcXVldWUgd2luZG93ICovCi0JdTMyIGlkOwotCWludCBsb3dfbWFyazsJICAgICAgIC8qIGxvdyB3YXRlcm1hcmssIHJlc3VtZSBxdWV1ZSBpZiBmcmVlCi0JCQkJKiBzcGFjZSBtb3JlIHRoYW4gdGhpcyAqLwotCWludCBoaWdoX21hcms7ICAgICAgICAgLyogaGlnaCB3YXRlcm1hcmssIHN0b3AgcXVldWUgaWYgZnJlZQotCQkJCSogc3BhY2UgbGVzcyB0aGFuIHRoaXMgKi8KLX07CiAKICNkZWZpbmUgVEZEX1RYX0NNRF9TTE9UUyAyNTYKICNkZWZpbmUgVEZEX0NNRF9TTE9UUyAzMgpAQCAtMjczLDEzICsyNDIsMzIgQEAKICAqIEB3ZF90aW1lb3V0OiBxdWV1ZSB3YXRjaGRvZyB0aW1lb3V0IChqaWZmaWVzKSAtIHBlciBxdWV1ZQogICogQGZyb3plbjogdHggc3R1Y2sgcXVldWUgdGltZXIgaXMgZnJvemVuCiAgKiBAZnJvemVuX2V4cGlyeV9yZW1haW5kZXI6IHJlbWVtYmVyIGhvdyBsb25nIHVudGlsIHRoZSB0aW1lciBmaXJlcworICogQHdyaXRlX3B0cjogMS1zdCBlbXB0eSBlbnRyeSAoaW5kZXgpIGhvc3RfdworICogQHJlYWRfcHRyOiBsYXN0IHVzZWQgZW50cnkgKGluZGV4KSBob3N0X3IKKyAqIEBkbWFfYWRkcjogIHBoeXNpY2FsIGFkZHIgZm9yIEJEJ3MKKyAqIEBuX3dpbmRvdzogc2FmZSBxdWV1ZSB3aW5kb3cKKyAqIEBpZDogcXVldWUgaWQKKyAqIEBsb3dfbWFyazogbG93IHdhdGVybWFyaywgcmVzdW1lIHF1ZXVlIGlmIGZyZWUgc3BhY2UgbW9yZSB0aGFuIHRoaXMKKyAqIEBoaWdoX21hcms6IGhpZ2ggd2F0ZXJtYXJrLCBzdG9wIHF1ZXVlIGlmIGZyZWUgc3BhY2UgbGVzcyB0aGFuIHRoaXMKICAqCiAgKiBBIFR4IHF1ZXVlIGNvbnNpc3RzIG9mIGNpcmN1bGFyIGJ1ZmZlciBvZiBCRHMgKGEuay5hLiBURkRzLCB0cmFuc21pdCBmcmFtZQogICogZGVzY3JpcHRvcnMpIGFuZCByZXF1aXJlZCBsb2NraW5nIHN0cnVjdHVyZXMuCisgKgorICogTm90ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFRGRF9RVUVVRV9TSVpFX01BWCBhbmQgbl93aW5kb3c6IHRoZSBoYXJkd2FyZQorICogYWx3YXlzIGFzc3VtZXMgMjU2IGRlc2NyaXB0b3JzLCBzbyBURkRfUVVFVUVfU0laRV9NQVggaXMgYWx3YXlzIDI1NiAodW5sZXNzCisgKiB0aGVyZSBtaWdodCBiZSBIVyBjaGFuZ2VzIGluIHRoZSBmdXR1cmUpLiBGb3IgdGhlIG5vcm1hbCBUWAorICogcXVldWVzLCBuX3dpbmRvdywgd2hpY2ggaXMgdGhlIHNpemUgb2YgdGhlIHNvZnR3YXJlIHF1ZXVlIGRhdGEKKyAqIGlzIGFsc28gMjU2OyBob3dldmVyLCBmb3IgdGhlIGNvbW1hbmQgcXVldWUsIG5fd2luZG93IGlzIG9ubHkKKyAqIDMyIHNpbmNlIHdlIGRvbid0IG5lZWQgc28gbWFueSBjb21tYW5kcyBwZW5kaW5nLiBTaW5jZSB0aGUgSFcKKyAqIHN0aWxsIHVzZXMgMjU2IEJEcyBmb3IgRE1BIHRob3VnaCwgVEZEX1FVRVVFX1NJWkVfTUFYIHN0YXlzIDI1Ni4KKyAqIFRoaXMgbWVhbnMgdGhhdCB3ZSBlbmQgdXAgd2l0aCB0aGUgZm9sbG93aW5nOgorICogIEhXIGVudHJpZXM6IHwgMCB8IC4uLiB8IE4gKiAzMiB8IC4uLiB8IE4gKiAzMiArIDMxIHwgLi4uIHwgMjU1IHwKKyAqICBTVyBlbnRyaWVzOiAgICAgICAgICAgfCAwICAgICAgfCAuLi4gfCAzMSAgICAgICAgICB8CisgKiB3aGVyZSBOIGlzIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNy4gVGhpcyBtZWFucyB0aGF0IHRoZSBTVworICogZGF0YSBpcyBhIHdpbmRvdyBvdmVybGF5ZWQgb3ZlciB0aGUgSFcgcXVldWUuCiAgKi8KIHN0cnVjdCBpd2xfdHhxIHsKLQlzdHJ1Y3QgaXdsX3F1ZXVlIHE7Ci0Jc3RydWN0IGl3bF90ZmQgKnRmZHM7CisJdm9pZCAqdGZkczsKIAlzdHJ1Y3QgaXdsX3BjaWVfZmlyc3RfdGJfYnVmICpmaXJzdF90Yl9idWZzOwogCWRtYV9hZGRyX3QgZmlyc3RfdGJfZG1hOwogCXN0cnVjdCBpd2xfcGNpZV90eHFfZW50cnkgKmVudHJpZXM7CkBAIC0yOTQsNiArMjgyLDE0IEBACiAJYm9vbCBibG9jazsKIAl1bnNpZ25lZCBsb25nIHdkX3RpbWVvdXQ7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBvdmVyZmxvd19xOworCisJaW50IHdyaXRlX3B0cjsKKwlpbnQgcmVhZF9wdHI7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwlpbnQgbl93aW5kb3c7CisJdTMyIGlkOworCWludCBsb3dfbWFyazsKKwlpbnQgaGlnaF9tYXJrOwogfTsKIAogc3RhdGljIGlubGluZSBkbWFfYWRkcl90CkBAIC0zMDksNiArMzA1LDE2IEBACiB9OwogCiAvKioKKyAqIGVudW0gaXdsX3NoYXJlZF9pcnFfZmxhZ3MgLSBsZXZlbCBvZiBzaGFyaW5nIGZvciBpcnEKKyAqIEBJV0xfU0hBUkVEX0lSUV9OT05fUlg6IGludGVycnVwdCB2ZWN0b3Igc2VydmVzIG5vbiByeCBjYXVzZXMuCisgKiBASVdMX1NIQVJFRF9JUlFfRklSU1RfUlNTOiBpbnRlcnJ1cHQgdmVjdG9yIHNlcnZlcyBmaXJzdCBSU1MgcXVldWUuCisgKi8KK2VudW0gaXdsX3NoYXJlZF9pcnFfZmxhZ3MgeworCUlXTF9TSEFSRURfSVJRX05PTl9SWAkJPSBCSVQoMCksCisJSVdMX1NIQVJFRF9JUlFfRklSU1RfUlNTCT0gQklUKDEpLAorfTsKKworLyoqCiAgKiBzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgLSBQQ0llIHRyYW5zcG9ydCBzcGVjaWZpYyBkYXRhCiAgKiBAcnhxOiBhbGwgdGhlIFJYIHF1ZXVlIGRhdGEKICAqIEByeF9wb29sOiBpbml0aWFsIHBvb2wgb2YgaXdsX3J4X21lbV9idWZmZXIgZm9yIGFsbCB0aGUgcXVldWVzCkBAIC0zMjYsNyArMzMyLDYgQEAKICAqIEByeF9idWZfc2l6ZTogUnggYnVmZmVyIHNpemUKICAqIEBiY190YWJsZV9kd29yZDogdHJ1ZSBpZiB0aGUgQkMgdGFibGUgZXhwZWN0cyBEV09SRCAoYXMgb3Bwb3NlZCB0byBieXRlcykKICAqIEBzY2Rfc2V0X2FjdGl2ZTogc2hvdWxkIHRoZSB0cmFuc3BvcnQgY29uZmlndXJlIHRoZSBTQ0QgZm9yIEhDTUQgcXVldWUKLSAqIEB3aWRlX2NtZF9oZWFkZXI6IHRydWUgd2hlbiB1Y29kZSBzdXBwb3J0cyB3aWRlIGNvbW1hbmQgaGVhZGVyIGZvcm1hdAogICogQHN3X2NzdW1fdHg6IGlmIHRydWUsIHRoZW4gdGhlIHRyYW5zcG9ydCB3aWxsIGNvbXB1dGUgdGhlIGNzdW0gb2YgdGhlIFRYZWQKICAqCWZyYW1lLgogICogQHJ4X3BhZ2Vfb3JkZXI6IHBhZ2Ugb3JkZXIgZm9yIHJlY2VpdmUgYnVmZmVyIHNpemUKQEAgLTMzOCw4ICszNDMsMTAgQEAKICAqIEBmd19tb25fc2l6ZTogc2l6ZSBvZiB0aGUgYnVmZmVyIGZvciB0aGUgZmlybXdhcmUgbW9uaXRvcgogICogQG1zaXhfZW50cmllczogYXJyYXkgb2YgTVNJLVggZW50cmllcwogICogQG1zaXhfZW5hYmxlZDogdHJ1ZSBpZiBtYW5hZ2VkIHRvIGVuYWJsZSBNU0ktWAotICogQGFsbG9jYXRlZF92ZWN0b3I6IHRoZSBudW1iZXIgb2YgaW50ZXJydXB0IHZlY3RvciBhbGxvY2F0ZWQgYnkgdGhlIE9TCi0gKiBAZGVmYXVsdF9pcnFfbnVtOiBkZWZhdWx0IGlycSBmb3Igbm9uIHJ4IGludGVycnVwdAorICogQHNoYXJlZF92ZWNfbWFzazogdGhlIHR5cGUgb2YgY2F1c2VzIHRoZSBzaGFyZWQgdmVjdG9yIGhhbmRsZXMKKyAqCShzZWUgaXdsX3NoYXJlZF9pcnFfZmxhZ3MpLgorICogQGFsbG9jX3ZlY3M6IHRoZSBudW1iZXIgb2YgaW50ZXJydXB0IHZlY3RvcnMgYWxsb2NhdGVkIGJ5IHRoZSBPUworICogQGRlZl9pcnE6IGRlZmF1bHQgaXJxIGZvciBub24gcnggY2F1c2VzCiAgKiBAZmhfaW5pdF9tYXNrOiBpbml0aWFsIHVubWFza2VkIGZoIGNhdXNlcwogICogQGh3X2luaXRfbWFzazogaW5pdGlhbCB1bm1hc2tlZCBodyBjYXVzZXMKICAqIEBmaF9tYXNrOiBjdXJyZW50IHVubWFza2VkIGZoIGNhdXNlcwpAQCAtMzkxLDExICszOTgsMTIgQEAKIAl1bnNpZ25lZCBpbnQgY21kX3Ffd2RnX3RpbWVvdXQ7CiAJdTggbl9ub19yZWNsYWltX2NtZHM7CiAJdTggbm9fcmVjbGFpbV9jbWRzW01BWF9OT19SRUNMQUlNX0NNRFNdOworCXU4IG1heF90YnM7CisJdTE2IHRmZF9zaXplOwogCiAJZW51bSBpd2xfYW1zZHVfc2l6ZSByeF9idWZfc2l6ZTsKIAlib29sIGJjX3RhYmxlX2R3b3JkOwogCWJvb2wgc2NkX3NldF9hY3RpdmU7Ci0JYm9vbCB3aWRlX2NtZF9oZWFkZXI7CiAJYm9vbCBzd19jc3VtX3R4OwogCXUzMiByeF9wYWdlX29yZGVyOwogCkBAIC00MTAsMTIgKzQxOCwxNCBAQAogCiAJc3RydWN0IG1zaXhfZW50cnkgbXNpeF9lbnRyaWVzW0lXTF9NQVhfUlhfSFdfUVVFVUVTXTsKIAlib29sIG1zaXhfZW5hYmxlZDsKLQl1MzIgYWxsb2NhdGVkX3ZlY3RvcjsKLQl1MzIgZGVmYXVsdF9pcnFfbnVtOworCXU4IHNoYXJlZF92ZWNfbWFzazsKKwl1MzIgYWxsb2NfdmVjczsKKwl1MzIgZGVmX2lycTsKIAl1MzIgZmhfaW5pdF9tYXNrOwogCXUzMiBod19pbml0X21hc2s7CiAJdTMyIGZoX21hc2s7CiAJdTMyIGh3X21hc2s7CisJY3B1bWFza190IGFmZmluaXR5X21hc2tbSVdMX01BWF9SWF9IV19RVUVVRVNdOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKgpAQCAtNDc0LDYgKzQ4NCw3IEBACiAJCQkJYm9vbCBjb25maWd1cmVfc2NkKTsKIHZvaWQgaXdsX3RyYW5zX3BjaWVfdHhxX3NldF9zaGFyZWRfbW9kZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgdTMyIHR4cV9pZCwKIAkJCQkJYm9vbCBzaGFyZWRfbW9kZSk7CitkbWFfYWRkcl90IGl3bF90cmFuc19wY2llX2dldF90eHFfYnl0ZV90YWJsZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHR4cSk7CiB2b2lkIGl3bF90cmFuc19wY2llX2xvZ19zY2RfZXJyb3Ioc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCiAJCQkJICBzdHJ1Y3QgaXdsX3R4cSAqdHhxKTsKIGludCBpd2xfdHJhbnNfcGNpZV90eChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTQ4NiwxMSArNDk3LDIwIEBACiAJCQkgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqc2ticyk7CiB2b2lkIGl3bF90cmFuc19wY2llX3R4X3Jlc2V0KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKTsKIAotc3RhdGljIGlubGluZSB1MTYgaXdsX3BjaWVfdGZkX3RiX2dldF9sZW4oc3RydWN0IGl3bF90ZmQgKnRmZCwgdTggaWR4KQorc3RhdGljIGlubGluZSB1MTYgaXdsX3BjaWVfdGZkX3RiX2dldF9sZW4oc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHZvaWQgKl90ZmQsCisJCQkJCSAgdTggaWR4KQogewotCXN0cnVjdCBpd2xfdGZkX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOworCWlmICh0cmFucy0+Y2ZnLT51c2VfdGZoKSB7CisJCXN0cnVjdCBpd2xfdGZoX3RmZCAqdGZkID0gX3RmZDsKKwkJc3RydWN0IGl3bF90ZmhfdGIgKnRiID0gJnRmZC0+dGJzW2lkeF07CiAKLQlyZXR1cm4gbGUxNl90b19jcHUodGItPmhpX25fbGVuKSA+PiA0OworCQlyZXR1cm4gbGUxNl90b19jcHUodGItPnRiX2xlbik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGl3bF90ZmQgKnRmZCA9IF90ZmQ7CisJCXN0cnVjdCBpd2xfdGZkX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOworCisJCXJldHVybiBsZTE2X3RvX2NwdSh0Yi0+aGlfbl9sZW4pID4+IDQ7CisJfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTYxNyw5ICs2MzcsOSBAQAogewogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KHR4cS0+cS5pZCwgdHJhbnNfcGNpZS0+cXVldWVfc3RvcHBlZCkpIHsKLQkJSVdMX0RFQlVHX1RYX1FVRVVFUyh0cmFucywgIldha2UgaHdxICVkXG4iLCB0eHEtPnEuaWQpOwotCQlpd2xfb3BfbW9kZV9xdWV1ZV9ub3RfZnVsbCh0cmFucy0+b3BfbW9kZSwgdHhxLT5xLmlkKTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KHR4cS0+aWQsIHRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BwZWQpKSB7CisJCUlXTF9ERUJVR19UWF9RVUVVRVModHJhbnMsICJXYWtlIGh3cSAlZFxuIiwgdHhxLT5pZCk7CisJCWl3bF9vcF9tb2RlX3F1ZXVlX25vdF9mdWxsKHRyYW5zLT5vcF9tb2RlLCB0eHEtPmlkKTsKIAl9CiB9CiAKQEAgLTYyOCwyMiArNjQ4LDIyIEBACiB7CiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKIAotCWlmICghdGVzdF9hbmRfc2V0X2JpdCh0eHEtPnEuaWQsIHRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BwZWQpKSB7Ci0JCWl3bF9vcF9tb2RlX3F1ZXVlX2Z1bGwodHJhbnMtPm9wX21vZGUsIHR4cS0+cS5pZCk7Ci0JCUlXTF9ERUJVR19UWF9RVUVVRVModHJhbnMsICJTdG9wIGh3cSAlZFxuIiwgdHhxLT5xLmlkKTsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQodHhxLT5pZCwgdHJhbnNfcGNpZS0+cXVldWVfc3RvcHBlZCkpIHsKKwkJaXdsX29wX21vZGVfcXVldWVfZnVsbCh0cmFucy0+b3BfbW9kZSwgdHhxLT5pZCk7CisJCUlXTF9ERUJVR19UWF9RVUVVRVModHJhbnMsICJTdG9wIGh3cSAlZFxuIiwgdHhxLT5pZCk7CiAJfSBlbHNlCiAJCUlXTF9ERUJVR19UWF9RVUVVRVModHJhbnMsICJod3EgJWQgYWxyZWFkeSBzdG9wcGVkXG4iLAotCQkJCSAgICB0eHEtPnEuaWQpOworCQkJCSAgICB0eHEtPmlkKTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGl3bF9xdWV1ZV91c2VkKGNvbnN0IHN0cnVjdCBpd2xfcXVldWUgKnEsIGludCBpKQorc3RhdGljIGlubGluZSBib29sIGl3bF9xdWV1ZV91c2VkKGNvbnN0IHN0cnVjdCBpd2xfdHhxICpxLCBpbnQgaSkKIHsKIAlyZXR1cm4gcS0+d3JpdGVfcHRyID49IHEtPnJlYWRfcHRyID8KIAkJKGkgPj0gcS0+cmVhZF9wdHIgJiYgaSA8IHEtPndyaXRlX3B0cikgOgogCQkhKGkgPCBxLT5yZWFkX3B0ciAmJiBpID49IHEtPndyaXRlX3B0cik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTggZ2V0X2NtZF9pbmRleChzdHJ1Y3QgaXdsX3F1ZXVlICpxLCB1MzIgaW5kZXgpCitzdGF0aWMgaW5saW5lIHU4IGdldF9jbWRfaW5kZXgoc3RydWN0IGl3bF90eHEgKnEsIHUzMiBpbmRleCkKIHsKIAlyZXR1cm4gaW5kZXggJiAocS0+bl93aW5kb3cgLSAxKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL3J4LmMKaW5kZXggNWMzNmU2ZC4uNmZlNTU0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL3J4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL3J4LmMKQEAgLTQ4NywxNSArNDg3LDEzIEBACiAKIAl3aGlsZSAocGVuZGluZykgewogCQlpbnQgaTsKLQkJc3RydWN0IGxpc3RfaGVhZCBsb2NhbF9hbGxvY2F0ZWQ7CisJCUxJU1RfSEVBRChsb2NhbF9hbGxvY2F0ZWQpOwogCQlnZnBfdCBnZnBfbWFzayA9IEdGUF9LRVJORUw7CiAKIAkJLyogRG8gbm90IHBvc3QgYSB3YXJuaW5nIGlmIHRoZXJlIGFyZSBvbmx5IGEgZmV3IHJlcXVlc3RzICovCiAJCWlmIChwZW5kaW5nIDwgUlhfUEVORElOR19XQVRFUk1BUkspCiAJCQlnZnBfbWFzayB8PSBfX0dGUF9OT1dBUk47CiAKLQkJSU5JVF9MSVNUX0hFQUQoJmxvY2FsX2FsbG9jYXRlZCk7Ci0KIAkJZm9yIChpID0gMDsgaSA8IFJYX0NMQUlNX1JFUV9BTExPQzspIHsKIAkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiOwogCQkJc3RydWN0IHBhZ2UgKnBhZ2U7CkBAIC0xMTA4LDEzICsxMTA2LDE0IEBACiAJCQlGSF9SU0NTUl9SWFFfUE9TICE9IHJ4cS0+aWQpOwogCiAJCUlXTF9ERUJVR19SWCh0cmFucywKLQkJCSAgICAgImNtZCBhdCBvZmZzZXQgJWQ6ICVzICgweCUuMngsIHNlcSAweCV4KVxuIiwKKwkJCSAgICAgImNtZCBhdCBvZmZzZXQgJWQ6ICVzICglLjJ4LiUyeCwgc2VxIDB4JXgpXG4iLAogCQkJICAgICByeGNiLl9vZmZzZXQsCiAJCQkgICAgIGl3bF9nZXRfY21kX3N0cmluZyh0cmFucywKIAkJCQkJCWl3bF9jbWRfaWQocGt0LT5oZHIuY21kLAogCQkJCQkJCSAgIHBrdC0+aGRyLmdyb3VwX2lkLAogCQkJCQkJCSAgIDApKSwKLQkJCSAgICAgcGt0LT5oZHIuY21kLCBsZTE2X3RvX2NwdShwa3QtPmhkci5zZXF1ZW5jZSkpOworCQkJICAgICBwa3QtPmhkci5ncm91cF9pZCwgcGt0LT5oZHIuY21kLAorCQkJICAgICBsZTE2X3RvX2NwdShwa3QtPmhkci5zZXF1ZW5jZSkpOwogCiAJCWxlbiA9IGl3bF9yeF9wYWNrZXRfbGVuKHBrdCk7CiAJCWxlbiArPSBzaXplb2YodTMyKTsgLyogYWNjb3VudCBmb3Igc3RhdHVzIHdvcmQgKi8KQEAgLTExNDIsNyArMTE0MSw3IEBACiAKIAkJc2VxdWVuY2UgPSBsZTE2X3RvX2NwdShwa3QtPmhkci5zZXF1ZW5jZSk7CiAJCWluZGV4ID0gU0VRX1RPX0lOREVYKHNlcXVlbmNlKTsKLQkJY21kX2luZGV4ID0gZ2V0X2NtZF9pbmRleCgmdHhxLT5xLCBpbmRleCk7CisJCWNtZF9pbmRleCA9IGdldF9jbWRfaW5kZXgodHhxLCBpbmRleCk7CiAKIAkJaWYgKHJ4cS0+aWQgPT0gMCkKIAkJCWl3bF9vcF9tb2RlX3J4KHRyYW5zLT5vcF9tb2RlLCAmcnhxLT5uYXBpLApAQCAtMTg4NSw2ICsxODg0LDIwIEBACiAJCQkgICAgICBpbnRhX2ZoLAogCQkJICAgICAgaXdsX3JlYWQzMih0cmFucywgQ1NSX01TSVhfRkhfSU5UX01BU0tfQUQpKTsKIAorCWlmICgodHJhbnNfcGNpZS0+c2hhcmVkX3ZlY19tYXNrICYgSVdMX1NIQVJFRF9JUlFfTk9OX1JYKSAmJgorCSAgICBpbnRhX2ZoICYgTVNJWF9GSF9JTlRfQ0FVU0VTX1EwKSB7CisJCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwkJaXdsX3BjaWVfcnhfaGFuZGxlKHRyYW5zLCAwKTsKKwkJbG9jYWxfYmhfZW5hYmxlKCk7CisJfQorCisJaWYgKCh0cmFuc19wY2llLT5zaGFyZWRfdmVjX21hc2sgJiBJV0xfU0hBUkVEX0lSUV9GSVJTVF9SU1MpICYmCisJICAgIGludGFfZmggJiBNU0lYX0ZIX0lOVF9DQVVTRVNfUTEpIHsKKwkJbG9jYWxfYmhfZGlzYWJsZSgpOworCQlpd2xfcGNpZV9yeF9oYW5kbGUodHJhbnMsIDEpOworCQlsb2NhbF9iaF9lbmFibGUoKTsKKwl9CisKIAkvKiBUaGlzICJUeCIgRE1BIGNoYW5uZWwgaXMgdXNlZCBvbmx5IGZvciBsb2FkaW5nIHVDb2RlICovCiAJaWYgKGludGFfZmggJiBNU0lYX0ZIX0lOVF9DQVVTRVNfRDJTX0NIMF9OVU0pIHsKIAkJSVdMX0RFQlVHX0lTUih0cmFucywgInVDb2RlIGxvYWQgaW50ZXJydXB0XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS90cmFucy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL3RyYW5zLmMKaW5kZXggNzRmMmYwMy4uYWU5NTUzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL3RyYW5zLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL3RyYW5zLmMKQEAgLTgyNywxMCArODI3LDE2IEBACiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCi0JCS8qIE5vdGlmeSB0aGUgdWNvZGUgb2YgdGhlIGxvYWRlZCBzZWN0aW9uIG51bWJlciBhbmQgc3RhdHVzICovCi0JCXZhbCA9IGl3bF9yZWFkX2RpcmVjdDMyKHRyYW5zLCBGSF9VQ09ERV9MT0FEX1NUQVRVUyk7Ci0JCXZhbCA9IHZhbCB8IChzZWNfbnVtIDw8IHNoaWZ0X3BhcmFtKTsKLQkJaXdsX3dyaXRlX2RpcmVjdDMyKHRyYW5zLCBGSF9VQ09ERV9MT0FEX1NUQVRVUywgdmFsKTsKKwkJLyogTm90aWZ5IHVjb2RlIG9mIGxvYWRlZCBzZWN0aW9uIG51bWJlciBhbmQgc3RhdHVzICovCisJCWlmICh0cmFucy0+Y2ZnLT51c2VfdGZoKSB7CisJCQl2YWwgPSBpd2xfcmVhZF9wcnBoKHRyYW5zLCBVUkVHX1VDT0RFX0xPQURfU1RBVFVTKTsKKwkJCXZhbCA9IHZhbCB8IChzZWNfbnVtIDw8IHNoaWZ0X3BhcmFtKTsKKwkJCWl3bF93cml0ZV9wcnBoKHRyYW5zLCBVUkVHX1VDT0RFX0xPQURfU1RBVFVTLCB2YWwpOworCQl9IGVsc2UgeworCQkJdmFsID0gaXdsX3JlYWRfZGlyZWN0MzIodHJhbnMsIEZIX1VDT0RFX0xPQURfU1RBVFVTKTsKKwkJCXZhbCA9IHZhbCB8IChzZWNfbnVtIDw8IHNoaWZ0X3BhcmFtKTsKKwkJCWl3bF93cml0ZV9kaXJlY3QzMih0cmFucywgRkhfVUNPREVfTE9BRF9TVEFUVVMsIHZhbCk7CisJCX0KIAkJc2VjX251bSA9IChzZWNfbnVtIDw8IDEpIHwgMHgxOwogCX0KIApAQCAtODM4LDEwICs4NDQsMjEgQEAKIAogCWl3bF9lbmFibGVfaW50ZXJydXB0cyh0cmFucyk7CiAKLQlpZiAoY3B1ID09IDEpCi0JCWl3bF93cml0ZV9kaXJlY3QzMih0cmFucywgRkhfVUNPREVfTE9BRF9TVEFUVVMsIDB4RkZGRik7Ci0JZWxzZQotCQlpd2xfd3JpdGVfZGlyZWN0MzIodHJhbnMsIEZIX1VDT0RFX0xPQURfU1RBVFVTLCAweEZGRkZGRkZGKTsKKwlpZiAodHJhbnMtPmNmZy0+dXNlX3RmaCkgeworCQlpZiAoY3B1ID09IDEpCisJCQlpd2xfd3JpdGVfcHJwaCh0cmFucywgVVJFR19VQ09ERV9MT0FEX1NUQVRVUywKKwkJCQkgICAgICAgMHhGRkZGKTsKKwkJZWxzZQorCQkJaXdsX3dyaXRlX3BycGgodHJhbnMsIFVSRUdfVUNPREVfTE9BRF9TVEFUVVMsCisJCQkJICAgICAgIDB4RkZGRkZGRkYpOworCX0gZWxzZSB7CisJCWlmIChjcHUgPT0gMSkKKwkJCWl3bF93cml0ZV9kaXJlY3QzMih0cmFucywgRkhfVUNPREVfTE9BRF9TVEFUVVMsCisJCQkJCSAgIDB4RkZGRik7CisJCWVsc2UKKwkJCWl3bF93cml0ZV9kaXJlY3QzMih0cmFucywgRkhfVUNPREVfTE9BRF9TVEFUVVMsCisJCQkJCSAgIDB4RkZGRkZGRkYpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtODg2LDE0ICs5MDMsNiBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAodHJhbnMtPmNmZy0+ZGV2aWNlX2ZhbWlseSA9PSBJV0xfREVWSUNFX0ZBTUlMWV84MDAwKQotCQlpd2xfc2V0X2JpdHNfcHJwaCh0cmFucywKLQkJCQkgIENTUl9VQ09ERV9MT0FEX1NUQVRVU19BRERSLAotCQkJCSAgKExNUE1fQ1BVX1VDT0RFX0xPQURJTkdfQ09NUExFVEVEIHwKLQkJCQkgICBMTVBNX0NQVV9IRFJTX0xPQURJTkdfQ09NUExFVEVEIHwKLQkJCQkgICBMTVBNX0NQVV9VQ09ERV9MT0FESU5HX1NUQVJURUQpIDw8Ci0JCQkJCXNoaWZ0X3BhcmFtKTsKLQogCSpmaXJzdF91Y29kZV9zZWN0aW9uID0gbGFzdF9yZWFkX2lkeDsKIAogCXJldHVybiAwOwpAQCAtMTE2MSw3ICsxMTcwLDcgQEAKIAlpZiAodHJhbnNfcGNpZS0+bXNpeF9lbmFibGVkKSB7CiAJCWludCBpOwogCi0JCWZvciAoaSA9IDA7IGkgPCB0cmFuc19wY2llLT5hbGxvY2F0ZWRfdmVjdG9yOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCB0cmFuc19wY2llLT5hbGxvY192ZWNzOyBpKyspCiAJCQlzeW5jaHJvbml6ZV9pcnEodHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzW2ldLnZlY3Rvcik7CiAJfSBlbHNlIHsKIAkJc3luY2hyb25pemVfaXJxKHRyYW5zX3BjaWUtPnBjaV9kZXYtPmlycSk7CkBAIC0xNDIwLDEzICsxNDI5LDU4IEBACiAJe01TSVhfSFdfSU5UX0NBVVNFU19SRUdfSEFQLAkJQ1NSX01TSVhfSFdfSU5UX01BU0tfQUQsIDB4MkV9LAogfTsKIAorc3RhdGljIHZvaWQgaXdsX3BjaWVfbWFwX25vbl9yeF9jYXVzZXMoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gIElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CisJaW50IHZhbCA9IHRyYW5zX3BjaWUtPmRlZl9pcnEgfCBNU0lYX05PTl9BVVRPX0NMRUFSX0NBVVNFOworCWludCBpOworCisJLyoKKwkgKiBBY2Nlc3MgYWxsIG5vbiBSWCBjYXVzZXMgYW5kIG1hcCB0aGVtIHRvIHRoZSBkZWZhdWx0IGlycS4KKwkgKiBJbiBjYXNlIHdlIGFyZSBtaXNzaW5nIGF0IGxlYXN0IG9uZSBpbnRlcnJ1cHQgdmVjdG9yLAorCSAqIHRoZSBmaXJzdCBpbnRlcnJ1cHQgdmVjdG9yIHdpbGwgc2VydmUgbm9uLVJYIGFuZCBGQlEgY2F1c2VzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNhdXNlc19saXN0KTsgaSsrKSB7CisJCWl3bF93cml0ZTgodHJhbnMsIENTUl9NU0lYX0lWQVIoY2F1c2VzX2xpc3RbaV0uYWRkciksIHZhbCk7CisJCWl3bF9jbGVhcl9iaXQodHJhbnMsIGNhdXNlc19saXN0W2ldLm1hc2tfcmVnLAorCQkJICAgICAgY2F1c2VzX2xpc3RbaV0uY2F1c2VfbnVtKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGl3bF9wY2llX21hcF9yeF9jYXVzZXMoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKKwl1MzIgb2Zmc2V0ID0KKwkJdHJhbnNfcGNpZS0+c2hhcmVkX3ZlY19tYXNrICYgSVdMX1NIQVJFRF9JUlFfRklSU1RfUlNTID8gMSA6IDA7CisJdTMyIHZhbCwgaWR4OworCisJLyoKKwkgKiBUaGUgZmlyc3QgUlggcXVldWUgLSBmYWxsYmFjayBxdWV1ZSwgd2hpY2ggaXMgZGVzaWduYXRlZCBmb3IKKwkgKiBtYW5hZ2VtZW50IGZyYW1lLCBjb21tYW5kIHJlc3BvbnNlcyBldGMsIGlzIGFsd2F5cyBtYXBwZWQgdG8gdGhlCisJICogZmlyc3QgaW50ZXJydXB0IHZlY3Rvci4gVGhlIG90aGVyIFJYIHF1ZXVlcyBhcmUgbWFwcGVkIHRvCisJICogdGhlIG90aGVyIChOIC0gMikgaW50ZXJydXB0IHZlY3RvcnMuCisJICovCisJdmFsID0gQklUKE1TSVhfRkhfSU5UX0NBVVNFU19RKDApKTsKKwlmb3IgKGlkeCA9IDE7IGlkeCA8IHRyYW5zLT5udW1fcnhfcXVldWVzOyBpZHgrKykgeworCQlpd2xfd3JpdGU4KHRyYW5zLCBDU1JfTVNJWF9SWF9JVkFSKGlkeCksCisJCQkgICBNU0lYX0ZIX0lOVF9DQVVTRVNfUShpZHggLSBvZmZzZXQpKTsKKwkJdmFsIHw9IEJJVChNU0lYX0ZIX0lOVF9DQVVTRVNfUShpZHgpKTsKKwl9CisJaXdsX3dyaXRlMzIodHJhbnMsIENTUl9NU0lYX0ZIX0lOVF9NQVNLX0FELCB+dmFsKTsKKworCXZhbCA9IE1TSVhfRkhfSU5UX0NBVVNFU19RKDApOworCWlmICh0cmFuc19wY2llLT5zaGFyZWRfdmVjX21hc2sgJiBJV0xfU0hBUkVEX0lSUV9OT05fUlgpCisJCXZhbCB8PSBNU0lYX05PTl9BVVRPX0NMRUFSX0NBVVNFOworCWl3bF93cml0ZTgodHJhbnMsIENTUl9NU0lYX1JYX0lWQVIoMCksIHZhbCk7CisKKwlpZiAodHJhbnNfcGNpZS0+c2hhcmVkX3ZlY19tYXNrICYgSVdMX1NIQVJFRF9JUlFfRklSU1RfUlNTKQorCQlpd2xfd3JpdGU4KHRyYW5zLCBDU1JfTVNJWF9SWF9JVkFSKDEpLCB2YWwpOworfQorCiBzdGF0aWMgdm9pZCBpd2xfcGNpZV9pbml0X21zaXgoc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llKQogewotCXUzMiB2YWwsIG1heF9yeF92ZWN0b3IsIGk7CiAJc3RydWN0IGl3bF90cmFucyAqdHJhbnMgPSB0cmFuc19wY2llLT50cmFuczsKIAotCW1heF9yeF92ZWN0b3IgPSB0cmFuc19wY2llLT5hbGxvY2F0ZWRfdmVjdG9yIC0gMTsKLQogCWlmICghdHJhbnNfcGNpZS0+bXNpeF9lbmFibGVkKSB7CiAJCWlmICh0cmFucy0+Y2ZnLT5tcV9yeF9zdXBwb3J0ZWQpCiAJCQlpd2xfd3JpdGVfcHJwaCh0cmFucywgVVJFR19DSElDSywKQEAgLTE0MzcsMjUgKzE0OTEsMTYgQEAKIAlpd2xfd3JpdGVfcHJwaCh0cmFucywgVVJFR19DSElDSywgVVJFR19DSElDS19NU0lYX0VOQUJMRSk7CiAKIAkvKgotCSAqIEVhY2ggY2F1c2UgZnJvbSB0aGUgbGlzdCBhYm92ZSBhbmQgdGhlIFJYIGNhdXNlcyBpcyByZXByZXNlbnRlZCBhcwotCSAqIGEgYnl0ZSBpbiB0aGUgSVZBUiB0YWJsZS4gV2UgYWNjZXNzIHRoZSBmaXJzdCAoTiAtIDEpIGJ5dGVzIGFuZCBtYXAKLQkgKiB0aGVtIHRvIHRoZSAoTiAtIDEpIHZlY3RvcnMgc28gdGhlc2UgdmVjdG9ycyB3aWxsIGJlIHVzZWQgYXMgcngKLQkgKiB2ZWN0b3JzLiBUaGVuIGFjY2VzcyBhbGwgbm9uIHJ4IGNhdXNlcyBhbmQgbWFwIHRoZW0gdG8gdGhlCi0JICogZGVmYXVsdCBxdWV1ZSAoTid0aCBxdWV1ZSkuCisJICogRWFjaCBjYXVzZSBmcm9tIHRoZSBjYXVzZXMgbGlzdCBhYm92ZSBhbmQgdGhlIFJYIGNhdXNlcyBpcworCSAqIHJlcHJlc2VudGVkIGFzIGEgYnl0ZSBpbiB0aGUgSVZBUiB0YWJsZS4gVGhlIGZpcnN0IG5pYmJsZQorCSAqIHJlcHJlc2VudHMgdGhlIGJvdW5kIGludGVycnVwdCB2ZWN0b3Igb2YgdGhlIGNhdXNlLCB0aGUgc2Vjb25kCisJICogcmVwcmVzZW50cyBubyBhdXRvIGNsZWFyIGZvciB0aGlzIGNhdXNlLiBUaGlzIHdpbGwgYmUgc2V0IGlmIGl0cworCSAqIGludGVycnVwdCB2ZWN0b3IgaXMgYm91bmQgdG8gc2VydmUgb3RoZXIgY2F1c2VzLgogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBtYXhfcnhfdmVjdG9yOyBpKyspIHsKLQkJaXdsX3dyaXRlOCh0cmFucywgQ1NSX01TSVhfUlhfSVZBUihpKSwgTVNJWF9GSF9JTlRfQ0FVU0VTX1EoaSkpOwotCQlpd2xfY2xlYXJfYml0KHRyYW5zLCBDU1JfTVNJWF9GSF9JTlRfTUFTS19BRCwKLQkJCSAgICAgIEJJVChNU0lYX0ZIX0lOVF9DQVVTRVNfUShpKSkpOwotCX0KKwlpd2xfcGNpZV9tYXBfcnhfY2F1c2VzKHRyYW5zKTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNhdXNlc19saXN0KTsgaSsrKSB7Ci0JCXZhbCA9IHRyYW5zX3BjaWUtPmRlZmF1bHRfaXJxX251bSB8Ci0JCQlNU0lYX05PTl9BVVRPX0NMRUFSX0NBVVNFOwotCQlpd2xfd3JpdGU4KHRyYW5zLCBDU1JfTVNJWF9JVkFSKGNhdXNlc19saXN0W2ldLmFkZHIpLCB2YWwpOwotCQlpd2xfY2xlYXJfYml0KHRyYW5zLCBjYXVzZXNfbGlzdFtpXS5tYXNrX3JlZywKLQkJCSAgICAgIGNhdXNlc19saXN0W2ldLmNhdXNlX251bSk7Ci0JfQorCWl3bF9wY2llX21hcF9ub25fcnhfY2F1c2VzKHRyYW5zKTsKKwogCXRyYW5zX3BjaWUtPmZoX2luaXRfbWFzayA9CiAJCX5pd2xfcmVhZDMyKHRyYW5zLCBDU1JfTVNJWF9GSF9JTlRfTUFTS19BRCk7CiAJdHJhbnNfcGNpZS0+ZmhfbWFzayA9IHRyYW5zX3BjaWUtPmZoX2luaXRfbWFzazsKQEAgLTE0NjgsNDAgKzE1MTMsNTUgQEAKIAkJCQkJc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCiB7CiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKKwlpbnQgbWF4X2lycXMsIG51bV9pcnFzLCBpLCByZXQsIG5yX29ubGluZV9jcHVzOwogCXUxNiBwY2lfY21kOwotCWludCBtYXhfdmVjdG9yOwotCWludCByZXQsIGk7CiAKLQlpZiAodHJhbnMtPmNmZy0+bXFfcnhfc3VwcG9ydGVkKSB7Ci0JCW1heF92ZWN0b3IgPSBtaW5fdCh1MzIsIChudW1fcG9zc2libGVfY3B1cygpICsgMiksCi0JCQkJICAgSVdMX01BWF9SWF9IV19RVUVVRVMpOwotCQlmb3IgKGkgPSAwOyBpIDwgbWF4X3ZlY3RvcjsgaSsrKQotCQkJdHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKKwlpZiAoIXRyYW5zLT5jZmctPm1xX3J4X3N1cHBvcnRlZCkKKwkJZ290byBlbmFibGVfbXNpOwogCi0JCXJldCA9IHBjaV9lbmFibGVfbXNpeF9yYW5nZShwZGV2LCB0cmFuc19wY2llLT5tc2l4X2VudHJpZXMsCi0JCQkJCSAgICBNU0lYX01JTl9JTlRFUlJVUFRfVkVDVE9SUywKLQkJCQkJICAgIG1heF92ZWN0b3IpOwotCQlpZiAocmV0ID4gMSkgewotCQkJSVdMX0RFQlVHX0lORk8odHJhbnMsCi0JCQkJICAgICAgICJFbmFibGUgTVNJLVggYWxsb2NhdGUgJWQgaW50ZXJydXB0IHZlY3RvclxuIiwKLQkJCQkgICAgICAgcmV0KTsKLQkJCXRyYW5zX3BjaWUtPmFsbG9jYXRlZF92ZWN0b3IgPSByZXQ7Ci0JCQl0cmFuc19wY2llLT5kZWZhdWx0X2lycV9udW0gPQotCQkJCXRyYW5zX3BjaWUtPmFsbG9jYXRlZF92ZWN0b3IgLSAxOwotCQkJdHJhbnNfcGNpZS0+dHJhbnMtPm51bV9yeF9xdWV1ZXMgPQotCQkJCXRyYW5zX3BjaWUtPmFsbG9jYXRlZF92ZWN0b3IgLSAxOwotCQkJdHJhbnNfcGNpZS0+bXNpeF9lbmFibGVkID0gdHJ1ZTsKKwlucl9vbmxpbmVfY3B1cyA9IG51bV9vbmxpbmVfY3B1cygpOworCW1heF9pcnFzID0gbWluX3QodTMyLCBucl9vbmxpbmVfY3B1cyArIDIsIElXTF9NQVhfUlhfSFdfUVVFVUVTKTsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X2lycXM7IGkrKykKKwkJdHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKIAotCQkJcmV0dXJuOwotCQl9CisJbnVtX2lycXMgPSBwY2lfZW5hYmxlX21zaXhfcmFuZ2UocGRldiwgdHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzLAorCQkJCQkgTVNJWF9NSU5fSU5URVJSVVBUX1ZFQ1RPUlMsCisJCQkJCSBtYXhfaXJxcyk7CisJaWYgKG51bV9pcnFzIDwgMCkgewogCQlJV0xfREVCVUdfSU5GTyh0cmFucywKLQkJCSAgICAgICAicmV0ID0gJWQgJXMgbW92ZSB0byBtc2kgbW9kZVxuIiwgcmV0LAotCQkJICAgICAgIChyZXQgPT0gMSkgPwotCQkJICAgICAgICJjYW4ndCBhbGxvY2F0ZSBtb3JlIHRoYW4gMSBpbnRlcnJ1cHQgdmVjdG9yIiA6Ci0JCQkgICAgICAgImZhaWxlZCB0byBlbmFibGUgbXNpLXggbW9kZSIpOwotCQlwY2lfZGlzYWJsZV9tc2l4KHBkZXYpOworCQkJICAgICAgICJGYWlsZWQgdG8gZW5hYmxlIG1zaS14IG1vZGUgKHJldCAlZCkuIE1vdmluZyB0byBtc2kgbW9kZS5cbiIsCisJCQkgICAgICAgbnVtX2lycXMpOworCQlnb3RvIGVuYWJsZV9tc2k7CisJfQorCXRyYW5zX3BjaWUtPmRlZl9pcnEgPSAobnVtX2lycXMgPT0gbWF4X2lycXMpID8gbnVtX2lycXMgLSAxIDogMDsKKworCUlXTF9ERUJVR19JTkZPKHRyYW5zLAorCQkgICAgICAgIk1TSS1YIGVuYWJsZWQuICVkIGludGVycnVwdCB2ZWN0b3JzIHdlcmUgYWxsb2NhdGVkXG4iLAorCQkgICAgICAgbnVtX2lycXMpOworCisJLyoKKwkgKiBJbiBjYXNlIHRoZSBPUyBwcm92aWRlcyBmZXdlciBpbnRlcnJ1cHRzIHRoYW4gcmVxdWVzdGVkLCBkaWZmZXJlbnQKKwkgKiBjYXVzZXMgd2lsbCBzaGFyZSB0aGUgc2FtZSBpbnRlcnJ1cHQgdmVjdG9yIGFzIGZvbGxvd3M6CisJICogT25lIGludGVycnVwdCBsZXNzOiBub24gcnggY2F1c2VzIHNoYXJlZCB3aXRoIEZCUS4KKwkgKiBUd28gaW50ZXJydXB0cyBsZXNzOiBub24gcnggY2F1c2VzIHNoYXJlZCB3aXRoIEZCUSBhbmQgUlNTLgorCSAqIE1vcmUgdGhhbiB0d28gaW50ZXJydXB0czogd2Ugd2lsbCB1c2UgZmV3ZXIgUlNTIHF1ZXVlcy4KKwkgKi8KKwlpZiAobnVtX2lycXMgPD0gbnJfb25saW5lX2NwdXMpIHsKKwkJdHJhbnNfcGNpZS0+dHJhbnMtPm51bV9yeF9xdWV1ZXMgPSBudW1faXJxcyArIDE7CisJCXRyYW5zX3BjaWUtPnNoYXJlZF92ZWNfbWFzayA9IElXTF9TSEFSRURfSVJRX05PTl9SWCB8CisJCQlJV0xfU0hBUkVEX0lSUV9GSVJTVF9SU1M7CisJfSBlbHNlIGlmIChudW1faXJxcyA9PSBucl9vbmxpbmVfY3B1cyArIDEpIHsKKwkJdHJhbnNfcGNpZS0+dHJhbnMtPm51bV9yeF9xdWV1ZXMgPSBudW1faXJxczsKKwkJdHJhbnNfcGNpZS0+c2hhcmVkX3ZlY19tYXNrID0gSVdMX1NIQVJFRF9JUlFfTk9OX1JYOworCX0gZWxzZSB7CisJCXRyYW5zX3BjaWUtPnRyYW5zLT5udW1fcnhfcXVldWVzID0gbnVtX2lycXMgLSAxOwogCX0KIAorCXRyYW5zX3BjaWUtPmFsbG9jX3ZlY3MgPSBudW1faXJxczsKKwl0cmFuc19wY2llLT5tc2l4X2VuYWJsZWQgPSB0cnVlOworCXJldHVybjsKKworZW5hYmxlX21zaToKIAlyZXQgPSBwY2lfZW5hYmxlX21zaShwZGV2KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInBjaV9lbmFibGVfbXNpIGZhaWxlZCAtICVkXG4iLCByZXQpOwpAQCAtMTUxNCwzNiArMTU3NCw1NyBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgaXdsX3BjaWVfaXJxX3NldF9hZmZpbml0eShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3sKKwlpbnQgaXRlcl9yeF9xLCBpLCByZXQsIGNwdSwgb2Zmc2V0OworCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CisKKwlpID0gdHJhbnNfcGNpZS0+c2hhcmVkX3ZlY19tYXNrICYgSVdMX1NIQVJFRF9JUlFfRklSU1RfUlNTID8gMCA6IDE7CisJaXRlcl9yeF9xID0gdHJhbnNfcGNpZS0+dHJhbnMtPm51bV9yeF9xdWV1ZXMgLSAxICsgaTsKKwlvZmZzZXQgPSAxICsgaTsKKwlmb3IgKDsgaSA8IGl0ZXJfcnhfcSA7IGkrKykgeworCQkvKgorCQkgKiBHZXQgdGhlIGNwdSBwcmlvciB0byB0aGUgcGxhY2UgdG8gc2VhcmNoCisJCSAqIChpLmUuIHJldHVybiB3aWxsIGJlID4gaSAtIDEpLgorCQkgKi8KKwkJY3B1ID0gY3B1bWFza19uZXh0KGkgLSBvZmZzZXQsIGNwdV9vbmxpbmVfbWFzayk7CisJCWNwdW1hc2tfc2V0X2NwdShjcHUsICZ0cmFuc19wY2llLT5hZmZpbml0eV9tYXNrW2ldKTsKKwkJcmV0ID0gaXJxX3NldF9hZmZpbml0eV9oaW50KHRyYW5zX3BjaWUtPm1zaXhfZW50cmllc1tpXS52ZWN0b3IsCisJCQkJCSAgICAmdHJhbnNfcGNpZS0+YWZmaW5pdHlfbWFza1tpXSk7CisJCWlmIChyZXQpCisJCQlJV0xfRVJSKHRyYW5zX3BjaWUtPnRyYW5zLAorCQkJCSJGYWlsZWQgdG8gc2V0IGFmZmluaXR5IG1hc2sgZm9yIElSUSAlZFxuIiwKKwkJCQlpKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgaXdsX3BjaWVfaW5pdF9tc2l4X2hhbmRsZXIoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgICAgc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llKQogewotCWludCBpLCBsYXN0X3ZlY3RvcjsKKwlpbnQgaTsKIAotCWxhc3RfdmVjdG9yID0gdHJhbnNfcGNpZS0+dHJhbnMtPm51bV9yeF9xdWV1ZXM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdHJhbnNfcGNpZS0+YWxsb2NhdGVkX3ZlY3RvcjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHRyYW5zX3BjaWUtPmFsbG9jX3ZlY3M7IGkrKykgewogCQlpbnQgcmV0OworCQlzdHJ1Y3QgbXNpeF9lbnRyeSAqbXNpeF9lbnRyeTsKIAotCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycSh0cmFuc19wY2llLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yLAotCQkJCQkgICBpd2xfcGNpZV9tc2l4X2lzciwKLQkJCQkJICAgKGkgPT0gbGFzdF92ZWN0b3IpID8KLQkJCQkJICAgaXdsX3BjaWVfaXJxX21zaXhfaGFuZGxlciA6Ci0JCQkJCSAgIGl3bF9wY2llX2lycV9yeF9tc2l4X2hhbmRsZXIsCi0JCQkJCSAgIElSUUZfU0hBUkVELAotCQkJCQkgICBEUlZfTkFNRSwKLQkJCQkJICAgJnRyYW5zX3BjaWUtPm1zaXhfZW50cmllc1tpXSk7CisJCW1zaXhfZW50cnkgPSAmdHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzW2ldOworCQlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZwZGV2LT5kZXYsCisJCQkJCQltc2l4X2VudHJ5LT52ZWN0b3IsCisJCQkJCQlpd2xfcGNpZV9tc2l4X2lzciwKKwkJCQkJCShpID09IHRyYW5zX3BjaWUtPmRlZl9pcnEpID8KKwkJCQkJCWl3bF9wY2llX2lycV9tc2l4X2hhbmRsZXIgOgorCQkJCQkJaXdsX3BjaWVfaXJxX3J4X21zaXhfaGFuZGxlciwKKwkJCQkJCUlSUUZfU0hBUkVELAorCQkJCQkJRFJWX05BTUUsCisJCQkJCQltc2l4X2VudHJ5KTsKIAkJaWYgKHJldCkgewotCQkJaW50IGo7Ci0KIAkJCUlXTF9FUlIodHJhbnNfcGNpZS0+dHJhbnMsCiAJCQkJIkVycm9yIGFsbG9jYXRpbmcgSVJRICVkXG4iLCBpKTsKLQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCi0JCQkJZnJlZV9pcnEodHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzW2pdLnZlY3RvciwKLQkJCQkJICZ0cmFuc19wY2llLT5tc2l4X2VudHJpZXNbal0pOwotCQkJcGNpX2Rpc2FibGVfbXNpeChwZGV2KTsKKwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KKwlpd2xfcGNpZV9pcnFfc2V0X2FmZmluaXR5KHRyYW5zX3BjaWUtPnRyYW5zKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTY3Miw3ICsxNzUzLDYgQEAKIAl0cmFuc19wY2llLT5yeF9wYWdlX29yZGVyID0KIAkJaXdsX3RyYW5zX2dldF9yYl9zaXplX29yZGVyKHRyYW5zX3BjaWUtPnJ4X2J1Zl9zaXplKTsKIAotCXRyYW5zX3BjaWUtPndpZGVfY21kX2hlYWRlciA9IHRyYW5zX2NmZy0+d2lkZV9jbWRfaGVhZGVyOwogCXRyYW5zX3BjaWUtPmJjX3RhYmxlX2R3b3JkID0gdHJhbnNfY2ZnLT5iY190YWJsZV9kd29yZDsKIAl0cmFuc19wY2llLT5zY2Rfc2V0X2FjdGl2ZSA9IHRyYW5zX2NmZy0+c2NkX3NldF9hY3RpdmU7CiAJdHJhbnNfcGNpZS0+c3dfY3N1bV90eCA9IHRyYW5zX2NmZy0+c3dfY3N1bV90eDsKQEAgLTE3MDMsMjIgKzE3ODMsMTYgQEAKIAlpd2xfcGNpZV9yeF9mcmVlKHRyYW5zKTsKIAogCWlmICh0cmFuc19wY2llLT5tc2l4X2VuYWJsZWQpIHsKLQkJZm9yIChpID0gMDsgaSA8IHRyYW5zX3BjaWUtPmFsbG9jYXRlZF92ZWN0b3I7IGkrKykKLQkJCWZyZWVfaXJxKHRyYW5zX3BjaWUtPm1zaXhfZW50cmllc1tpXS52ZWN0b3IsCi0JCQkJICZ0cmFuc19wY2llLT5tc2l4X2VudHJpZXNbaV0pOworCQlmb3IgKGkgPSAwOyBpIDwgdHJhbnNfcGNpZS0+YWxsb2NfdmVjczsgaSsrKSB7CisJCQlpcnFfc2V0X2FmZmluaXR5X2hpbnQoCisJCQkJdHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzW2ldLnZlY3RvciwKKwkJCQlOVUxMKTsKKwkJfQogCi0JCXBjaV9kaXNhYmxlX21zaXgodHJhbnNfcGNpZS0+cGNpX2Rldik7CiAJCXRyYW5zX3BjaWUtPm1zaXhfZW5hYmxlZCA9IGZhbHNlOwogCX0gZWxzZSB7Ci0JCWZyZWVfaXJxKHRyYW5zX3BjaWUtPnBjaV9kZXYtPmlycSwgdHJhbnMpOwotCiAJCWl3bF9wY2llX2ZyZWVfaWN0KHRyYW5zKTsKLQotCQlwY2lfZGlzYWJsZV9tc2kodHJhbnNfcGNpZS0+cGNpX2Rldik7CiAJfQotCWlvdW5tYXAodHJhbnNfcGNpZS0+aHdfYmFzZSk7Ci0JcGNpX3JlbGVhc2VfcmVnaW9ucyh0cmFuc19wY2llLT5wY2lfZGV2KTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UodHJhbnNfcGNpZS0+cGNpX2Rldik7CiAKIAlpd2xfcGNpZV9mcmVlX2Z3X21vbml0b3IodHJhbnMpOwogCkBAIC0xODkwLDcgKzE5NjQsNyBAQAogCiAJCXR4cS0+ZnJvemVuID0gZnJlZXplOwogCi0JCWlmICh0eHEtPnEucmVhZF9wdHIgPT0gdHhxLT5xLndyaXRlX3B0cikKKwkJaWYgKHR4cS0+cmVhZF9wdHIgPT0gdHhxLT53cml0ZV9wdHIpCiAJCQlnb3RvIG5leHRfcXVldWU7CiAKIAkJaWYgKGZyZWV6ZSkgewpAQCAtMTkzOCw3ICsyMDEyLDcgQEAKIAkJCXR4cS0+YmxvY2stLTsKIAkJCWlmICghdHhxLT5ibG9jaykgewogCQkJCWl3bF93cml0ZTMyKHRyYW5zLCBIQlVTX1RBUkdfV1JQVFIsCi0JCQkJCSAgICB0eHEtPnEud3JpdGVfcHRyIHwgKGkgPDwgOCkpOworCQkJCQkgICAgdHhxLT53cml0ZV9wdHIgfCAoaSA8PCA4KSk7CiAJCQl9CiAJCX0gZWxzZSBpZiAoYmxvY2spIHsKIAkJCXR4cS0+YmxvY2srKzsKQEAgLTE5NTgsMTAgKzIwMzIsMTQgQEAKIAlpbnQgY250OwogCiAJSVdMX0VSUih0cmFucywgIkN1cnJlbnQgU1cgcmVhZF9wdHIgJWQgd3JpdGVfcHRyICVkXG4iLAotCQl0eHEtPnEucmVhZF9wdHIsIHR4cS0+cS53cml0ZV9wdHIpOworCQl0eHEtPnJlYWRfcHRyLCB0eHEtPndyaXRlX3B0cik7CisKKwlpZiAodHJhbnMtPmNmZy0+dXNlX3RmaCkKKwkJLyogVE9ETzogYWNjZXNzIG5ldyBTQ0QgcmVnaXN0ZXJzIGFuZCBkdW1wIHRoZW0gKi8KKwkJcmV0dXJuOwogCiAJc2NkX3NyYW1fYWRkciA9IHRyYW5zX3BjaWUtPnNjZF9iYXNlX2FkZHIgKwotCQkJU0NEX1RYX1NUVFNfUVVFVUVfT0ZGU0VUKHR4cS0+cS5pZCk7CisJCQlTQ0RfVFhfU1RUU19RVUVVRV9PRkZTRVQodHhxLT5pZCk7CiAJaXdsX3RyYW5zX3JlYWRfbWVtX2J5dGVzKHRyYW5zLCBzY2Rfc3JhbV9hZGRyLCBidWYsIHNpemVvZihidWYpKTsKIAogCWl3bF9wcmludF9oZXhfZXJyb3IodHJhbnMsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwpAQCAtMTk5Niw3ICsyMDc0LDYgQEAKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCXN0cnVjdCBpd2xfdHhxICp0eHE7Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcTsKIAlpbnQgY250OwogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKIAlpbnQgcmV0ID0gMDsKQEAgLTIwMTQsMTMgKzIwOTEsMTIgQEAKIAogCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiRW1wdHlpbmcgcXVldWUgJWQuLi5cbiIsIGNudCk7CiAJCXR4cSA9ICZ0cmFuc19wY2llLT50eHFbY250XTsKLQkJcSA9ICZ0eHEtPnE7Ci0JCXdyX3B0ciA9IEFDQ0VTU19PTkNFKHEtPndyaXRlX3B0cik7CisJCXdyX3B0ciA9IEFDQ0VTU19PTkNFKHR4cS0+d3JpdGVfcHRyKTsKIAotCQl3aGlsZSAocS0+cmVhZF9wdHIgIT0gQUNDRVNTX09OQ0UocS0+d3JpdGVfcHRyKSAmJgorCQl3aGlsZSAodHhxLT5yZWFkX3B0ciAhPSBBQ0NFU1NfT05DRSh0eHEtPndyaXRlX3B0cikgJiYKIAkJICAgICAgICF0aW1lX2FmdGVyKGppZmZpZXMsCiAJCQkJICAgbm93ICsgbXNlY3NfdG9famlmZmllcyhJV0xfRkxVU0hfV0FJVF9NUykpKSB7Ci0JCQl1OCB3cml0ZV9wdHIgPSBBQ0NFU1NfT05DRShxLT53cml0ZV9wdHIpOworCQkJdTggd3JpdGVfcHRyID0gQUNDRVNTX09OQ0UodHhxLT53cml0ZV9wdHIpOwogCiAJCQlpZiAoV0FSTl9PTkNFKHdyX3B0ciAhPSB3cml0ZV9wdHIsCiAJCQkJICAgICAgIldSIHBvaW50ZXIgbW92ZWQgd2hpbGUgZmx1c2hpbmcgJWQgLT4gJWRcbiIsCkBAIC0yMDI5LDcgKzIxMDUsNyBAQAogCQkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwogCQl9CiAKLQkJaWYgKHEtPnJlYWRfcHRyICE9IHEtPndyaXRlX3B0cikgeworCQlpZiAodHhxLT5yZWFkX3B0ciAhPSB0eHEtPndyaXRlX3B0cikgewogCQkJSVdMX0VSUih0cmFucywKIAkJCQkiZmFpbCB0byBmbHVzaCBhbGwgdHggZmlmbyBxdWV1ZXMgUSAlZFxuIiwgY250KTsKIAkJCXJldCA9IC1FVElNRURPVVQ7CkBAIC0yMTk3LDcgKzIyNzMsNiBAQAogCXN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAJc3RydWN0IGl3bF90eHEgKnR4cTsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxOwogCWNoYXIgKmJ1ZjsKIAlpbnQgcG9zID0gMDsKIAlpbnQgY250OwpAQCAtMjIxNSwxMCArMjI5MCw5IEBACiAKIAlmb3IgKGNudCA9IDA7IGNudCA8IHRyYW5zLT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOyBjbnQrKykgewogCQl0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW2NudF07Ci0JCXEgPSAmdHhxLT5xOwogCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCiAJCQkJImh3cSAlLjJkOiByZWFkPSV1IHdyaXRlPSV1IHVzZT0lZCBzdG9wPSVkIG5lZWRfdXBkYXRlPSVkIGZyb3plbj0lZCVzXG4iLAotCQkJCWNudCwgcS0+cmVhZF9wdHIsIHEtPndyaXRlX3B0ciwKKwkJCQljbnQsIHR4cS0+cmVhZF9wdHIsIHR4cS0+d3JpdGVfcHRyLAogCQkJCSEhdGVzdF9iaXQoY250LCB0cmFuc19wY2llLT5xdWV1ZV91c2VkKSwKIAkJCQkgISF0ZXN0X2JpdChjbnQsIHRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BwZWQpLAogCQkJCSB0eHEtPm5lZWRfdXBkYXRlLCB0eHEtPmZyb3plbiwKQEAgLTI0MjQsMTMgKzI0OTgsMTQgQEAKIH0KICNlbmRpZiAvKkNPTkZJR19JV0xXSUZJX0RFQlVHRlMgKi8KIAotc3RhdGljIHUzMiBpd2xfdHJhbnNfcGNpZV9nZXRfY21kbGVuKHN0cnVjdCBpd2xfdGZkICp0ZmQpCitzdGF0aWMgdTMyIGl3bF90cmFuc19wY2llX2dldF9jbWRsZW4oc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHZvaWQgKnRmZCkKIHsKKwlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCXUzMiBjbWRsZW4gPSAwOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IElXTF9OVU1fT0ZfVEJTOyBpKyspCi0JCWNtZGxlbiArPSBpd2xfcGNpZV90ZmRfdGJfZ2V0X2xlbih0ZmQsIGkpOworCWZvciAoaSA9IDA7IGkgPCB0cmFuc19wY2llLT5tYXhfdGJzOyBpKyspCisJCWNtZGxlbiArPSBpd2xfcGNpZV90ZmRfdGJfZ2V0X2xlbih0cmFucywgdGZkLCBpKTsKIAogCXJldHVybiBjbWRsZW47CiB9CkBAIC0yNjQ1LDcgKzI3MjAsNyBAQAogCiAJLyogaG9zdCBjb21tYW5kcyAqLwogCWxlbiArPSBzaXplb2YoKmRhdGEpICsKLQkJY21kcS0+cS5uX3dpbmRvdyAqIChzaXplb2YoKnR4Y21kKSArIFRGRF9NQVhfUEFZTE9BRF9TSVpFKTsKKwkJY21kcS0+bl93aW5kb3cgKiAoc2l6ZW9mKCp0eGNtZCkgKyBURkRfTUFYX1BBWUxPQURfU0laRSk7CiAKIAkvKiBGVyBtb25pdG9yICovCiAJaWYgKHRyYW5zX3BjaWUtPmZ3X21vbl9wYWdlKSB7CkBAIC0yNzEzLDEyICsyNzg4LDEzIEBACiAJZGF0YS0+dHlwZSA9IGNwdV90b19sZTMyKElXTF9GV19FUlJPUl9EVU1QX1RYQ01EKTsKIAl0eGNtZCA9ICh2b2lkICopZGF0YS0+ZGF0YTsKIAlzcGluX2xvY2tfYmgoJmNtZHEtPmxvY2spOwotCXB0ciA9IGNtZHEtPnEud3JpdGVfcHRyOwotCWZvciAoaSA9IDA7IGkgPCBjbWRxLT5xLm5fd2luZG93OyBpKyspIHsKLQkJdTggaWR4ID0gZ2V0X2NtZF9pbmRleCgmY21kcS0+cSwgcHRyKTsKKwlwdHIgPSBjbWRxLT53cml0ZV9wdHI7CisJZm9yIChpID0gMDsgaSA8IGNtZHEtPm5fd2luZG93OyBpKyspIHsKKwkJdTggaWR4ID0gZ2V0X2NtZF9pbmRleChjbWRxLCBwdHIpOwogCQl1MzIgY2FwbGVuLCBjbWRsZW47CiAKLQkJY21kbGVuID0gaXdsX3RyYW5zX3BjaWVfZ2V0X2NtZGxlbigmY21kcS0+dGZkc1twdHJdKTsKKwkJY21kbGVuID0gaXdsX3RyYW5zX3BjaWVfZ2V0X2NtZGxlbih0cmFucywgY21kcS0+dGZkcyArCisJCQkJCQkgICB0cmFuc19wY2llLT50ZmRfc2l6ZSAqIHB0cik7CiAJCWNhcGxlbiA9IG1pbl90KHUzMiwgVEZEX01BWF9QQVlMT0FEX1NJWkUsIGNtZGxlbik7CiAKIAkJaWYgKGNtZGxlbikgewpAQCAtMjc4OCw2ICsyODY0LDggQEAKIAkudHhxX2Rpc2FibGUgPSBpd2xfdHJhbnNfcGNpZV90eHFfZGlzYWJsZSwKIAkudHhxX2VuYWJsZSA9IGl3bF90cmFuc19wY2llX3R4cV9lbmFibGUsCiAKKwkuZ2V0X3R4cV9ieXRlX3RhYmxlID0gaXdsX3RyYW5zX3BjaWVfZ2V0X3R4cV9ieXRlX3RhYmxlLAorCiAJLnR4cV9zZXRfc2hhcmVkX21vZGUgPSBpd2xfdHJhbnNfcGNpZV90eHFfc2V0X3NoYXJlZF9tb2RlLAogCiAJLndhaXRfdHhfcXVldWVfZW1wdHkgPSBpd2xfdHJhbnNfcGNpZV93YWl0X3R4cV9lbXB0eSwKQEAgLTI4MjEsMTMgKzI4OTksMTUgQEAKIAlzdHJ1Y3QgaXdsX3RyYW5zICp0cmFuczsKIAlpbnQgcmV0LCBhZGRyX3NpemU7CiAKKwlyZXQgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwogCXRyYW5zID0gaXdsX3RyYW5zX2FsbG9jKHNpemVvZihzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUpLAogCQkJCSZwZGV2LT5kZXYsIGNmZywgJnRyYW5zX29wc19wY2llLCAwKTsKIAlpZiAoIXRyYW5zKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCXRyYW5zLT5tYXhfc2tiX2ZyYWdzID0gSVdMX1BDSUVfTUFYX0ZSQUdTOwotCiAJdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAKIAl0cmFuc19wY2llLT50cmFucyA9IHRyYW5zOwpAQCAtMjg0MSw5ICsyOTIxLDYgQEAKIAkJZ290byBvdXRfbm9fcGNpOwogCX0KIAotCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X25vX3BjaTsKIAogCWlmICghY2ZnLT5iYXNlX3BhcmFtcy0+cGNpZV9sMV9hbGxvd2VkKSB7CiAJCS8qCkBAIC0yODYxLDYgKzI5MzgsMTYgQEAKIAllbHNlCiAJCWFkZHJfc2l6ZSA9IDM2OwogCisJaWYgKGNmZy0+dXNlX3RmaCkgeworCQl0cmFuc19wY2llLT5tYXhfdGJzID0gSVdMX1RGSF9OVU1fVEJTOworCQl0cmFuc19wY2llLT50ZmRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsX3RmaF90ZmQpOworCisJfSBlbHNlIHsKKwkJdHJhbnNfcGNpZS0+bWF4X3RicyA9IElXTF9OVU1fT0ZfVEJTOworCQl0cmFuc19wY2llLT50ZmRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsX3RmZCk7CisJfQorCXRyYW5zLT5tYXhfc2tiX2ZyYWdzID0gSVdMX1BDSUVfTUFYX0ZSQUdTKHRyYW5zX3BjaWUpOworCiAJcGNpX3NldF9tYXN0ZXIocGRldik7CiAKIAlyZXQgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyhhZGRyX3NpemUpKTsKQEAgLTI4NzUsMjEgKzI5NjIsMjEgQEAKIAkJLyogYm90aCBhdHRlbXB0cyBmYWlsZWQ6ICovCiAJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGVcbiIpOwotCQkJZ290byBvdXRfcGNpX2Rpc2FibGVfZGV2aWNlOworCQkJZ290byBvdXRfbm9fcGNpOwogCQl9CiAJfQogCi0JcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJcmV0ID0gcGNpbV9pb21hcF9yZWdpb25zX3JlcXVlc3RfYWxsKHBkZXYsIEJJVCgwKSwgRFJWX05BTUUpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAicGNpX3JlcXVlc3RfcmVnaW9ucyBmYWlsZWRcbiIpOwotCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBjaW1faW9tYXBfcmVnaW9uc19yZXF1ZXN0X2FsbCBmYWlsZWRcbiIpOworCQlnb3RvIG91dF9ub19wY2k7CiAJfQogCi0JdHJhbnNfcGNpZS0+aHdfYmFzZSA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAwKTsKKwl0cmFuc19wY2llLT5od19iYXNlID0gcGNpbV9pb21hcF90YWJsZShwZGV2KVswXTsKIAlpZiAoIXRyYW5zX3BjaWUtPmh3X2Jhc2UpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAicGNpX2lvcmVtYXBfYmFyIGZhaWxlZFxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBjaW1faW9tYXBfdGFibGUgZmFpbGVkXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczsKKwkJZ290byBvdXRfbm9fcGNpOwogCX0KIAogCS8qIFdlIGRpc2FibGUgdGhlIFJFVFJZX1RJTUVPVVQgcmVnaXN0ZXIgKDB4NDEpIHRvIGtlZXAKQEAgLTI5MTYsNyArMzAwMyw3IEBACiAJCXJldCA9IGl3bF9wY2llX3ByZXBhcmVfY2FyZF9odyh0cmFucyk7CiAJCWlmIChyZXQpIHsKIAkJCUlXTF9XQVJOKHRyYW5zLCAiRXhpdCBIVyBub3QgcmVhZHlcbiIpOwotCQkJZ290byBvdXRfcGNpX2Rpc2FibGVfbXNpOworCQkJZ290byBvdXRfbm9fcGNpOwogCQl9CiAKIAkJLyoKQEAgLTI5MzMsNyArMzAyMCw3IEBACiAJCQkJICAgMjUwMDApOwogCQlpZiAocmV0IDwgMCkgewogCQkJSVdMX0RFQlVHX0lORk8odHJhbnMsICJGYWlsZWQgdG8gd2FrZSB1cCB0aGUgbmljXG4iKTsKLQkJCWdvdG8gb3V0X3BjaV9kaXNhYmxlX21zaTsKKwkJCWdvdG8gb3V0X25vX3BjaTsKIAkJfQogCiAJCWlmIChpd2xfdHJhbnNfZ3JhYl9uaWNfYWNjZXNzKHRyYW5zLCAmZmxhZ3MpKSB7CkBAIC0yOTY1LDE1ICszMDUyLDE2IEBACiAKIAlpZiAodHJhbnNfcGNpZS0+bXNpeF9lbmFibGVkKSB7CiAJCWlmIChpd2xfcGNpZV9pbml0X21zaXhfaGFuZGxlcihwZGV2LCB0cmFuc19wY2llKSkKLQkJCWdvdG8gb3V0X3BjaV9yZWxlYXNlX3JlZ2lvbnM7CisJCQlnb3RvIG91dF9ub19wY2k7CiAJIH0gZWxzZSB7CiAJCXJldCA9IGl3bF9wY2llX2FsbG9jX2ljdCh0cmFucyk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9tc2k7CisJCQlnb3RvIG91dF9ub19wY2k7CiAKLQkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEocGRldi0+aXJxLCBpd2xfcGNpZV9pc3IsCi0JCQkJCSAgIGl3bF9wY2llX2lycV9oYW5kbGVyLAotCQkJCQkgICBJUlFGX1NIQVJFRCwgRFJWX05BTUUsIHRyYW5zKTsKKwkJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmcGRldi0+ZGV2LCBwZGV2LT5pcnEsCisJCQkJCQlpd2xfcGNpZV9pc3IsCisJCQkJCQlpd2xfcGNpZV9pcnFfaGFuZGxlciwKKwkJCQkJCUlSUUZfU0hBUkVELCBEUlZfTkFNRSwgdHJhbnMpOwogCQlpZiAocmV0KSB7CiAJCQlJV0xfRVJSKHRyYW5zLCAiRXJyb3IgYWxsb2NhdGluZyBJUlEgJWRcbiIsIHBkZXYtPmlycSk7CiAJCQlnb3RvIG91dF9mcmVlX2ljdDsKQEAgLTI5OTEsMTIgKzMwNzksNiBAQAogCiBvdXRfZnJlZV9pY3Q6CiAJaXdsX3BjaWVfZnJlZV9pY3QodHJhbnMpOwotb3V0X3BjaV9kaXNhYmxlX21zaToKLQlwY2lfZGlzYWJsZV9tc2kocGRldik7Ci1vdXRfcGNpX3JlbGVhc2VfcmVnaW9uczoKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotb3V0X3BjaV9kaXNhYmxlX2RldmljZToKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiBvdXRfbm9fcGNpOgogCWZyZWVfcGVyY3B1KHRyYW5zX3BjaWUtPnRzb19oZHJfcGFnZSk7CiAJaXdsX3RyYW5zX2ZyZWUodHJhbnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL3R4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvdHguYwppbmRleCAxODY1MGRjLi5lOWEyNzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvdHguYwpAQCAtNzEsNyArNzEsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBpbnQgaXdsX3F1ZXVlX3NwYWNlKGNvbnN0IHN0cnVjdCBpd2xfcXVldWUgKnEpCitzdGF0aWMgaW50IGl3bF9xdWV1ZV9zcGFjZShjb25zdCBzdHJ1Y3QgaXdsX3R4cSAqcSkKIHsKIAl1bnNpZ25lZCBpbnQgbWF4OwogCXVuc2lnbmVkIGludCB1c2VkOwpAQCAtMTAyLDcgKzEwMiw3IEBACiAvKgogICogaXdsX3F1ZXVlX2luaXQgLSBJbml0aWFsaXplIHF1ZXVlJ3MgaGlnaC9sb3ctd2F0ZXIgYW5kIHJlYWQvd3JpdGUgaW5kZXhlcwogICovCi1zdGF0aWMgaW50IGl3bF9xdWV1ZV9pbml0KHN0cnVjdCBpd2xfcXVldWUgKnEsIGludCBzbG90c19udW0sIHUzMiBpZCkKK3N0YXRpYyBpbnQgaXdsX3F1ZXVlX2luaXQoc3RydWN0IGl3bF90eHEgKnEsIGludCBzbG90c19udW0sIHUzMiBpZCkKIHsKIAlxLT5uX3dpbmRvdyA9IHNsb3RzX251bTsKIAlxLT5pZCA9IGlkOwpAQCAtMTU4LDEzICsxNTgsMTMgQEAKIAogCXNwaW5fbG9jaygmdHhxLT5sb2NrKTsKIAkvKiBjaGVjayBpZiB0cmlnZ2VyZWQgZXJyb25lb3VzbHkgKi8KLQlpZiAodHhxLT5xLnJlYWRfcHRyID09IHR4cS0+cS53cml0ZV9wdHIpIHsKKwlpZiAodHhxLT5yZWFkX3B0ciA9PSB0eHEtPndyaXRlX3B0cikgewogCQlzcGluX3VubG9jaygmdHhxLT5sb2NrKTsKIAkJcmV0dXJuOwogCX0KIAlzcGluX3VubG9jaygmdHhxLT5sb2NrKTsKIAotCUlXTF9FUlIodHJhbnMsICJRdWV1ZSAlZCBzdHVjayBmb3IgJXUgbXMuXG4iLCB0eHEtPnEuaWQsCisJSVdMX0VSUih0cmFucywgIlF1ZXVlICVkIHN0dWNrIGZvciAldSBtcy5cbiIsIHR4cS0+aWQsCiAJCWppZmZpZXNfdG9fbXNlY3ModHhxLT53ZF90aW1lb3V0KSk7CiAKIAlpd2xfdHJhbnNfcGNpZV9sb2dfc2NkX2Vycm9yKHRyYW5zLCB0eHEpOwpAQCAtMTc2LDIyICsxNzYsMjEgQEAKICAqIGl3bF9wY2llX3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsIC0gU2V0IHVwIGVudHJ5IGluIFR4IGJ5dGUtY291bnQgYXJyYXkKICAqLwogc3RhdGljIHZvaWQgaXdsX3BjaWVfdHhxX3VwZGF0ZV9ieXRlX2NudF90Ymwoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCi0JCQkJCSAgICAgc3RydWN0IGl3bF90eHEgKnR4cSwgdTE2IGJ5dGVfY250KQorCQkJCQkgICAgIHN0cnVjdCBpd2xfdHhxICp0eHEsIHUxNiBieXRlX2NudCwKKwkJCQkJICAgICBpbnQgbnVtX3RicykKIHsKIAlzdHJ1Y3QgaXdsYWduX3NjZF9iY190YmwgKnNjZF9iY190Ymw7CiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKLQlpbnQgd3JpdGVfcHRyID0gdHhxLT5xLndyaXRlX3B0cjsKLQlpbnQgdHhxX2lkID0gdHhxLT5xLmlkOworCWludCB3cml0ZV9wdHIgPSB0eHEtPndyaXRlX3B0cjsKKwlpbnQgdHhxX2lkID0gdHhxLT5pZDsKIAl1OCBzZWNfY3RsID0gMDsKLQl1OCBzdGFfaWQgPSAwOwogCXUxNiBsZW4gPSBieXRlX2NudCArIElXTF9UWF9DUkNfU0laRSArIElXTF9UWF9ERUxJTUlURVJfU0laRTsKIAlfX2xlMTYgYmNfZW50OwogCXN0cnVjdCBpd2xfdHhfY21kICp0eF9jbWQgPQotCQkodm9pZCAqKSB0eHEtPmVudHJpZXNbdHhxLT5xLndyaXRlX3B0cl0uY21kLT5wYXlsb2FkOworCQkodm9pZCAqKXR4cS0+ZW50cmllc1t0eHEtPndyaXRlX3B0cl0uY21kLT5wYXlsb2FkOwogCiAJc2NkX2JjX3RibCA9IHRyYW5zX3BjaWUtPnNjZF9iY190YmxzLmFkZHI7CiAKLQlzdGFfaWQgPSB0eF9jbWQtPnN0YV9pZDsKIAlzZWNfY3RsID0gdHhfY21kLT5zZWNfY3RsOwogCiAJc3dpdGNoIChzZWNfY3RsICYgVFhfQ01EX1NFQ19NU0spIHsKQEAgLTIwNSwxNCArMjA0LDMyIEBACiAJCWxlbiArPSBJRUVFODAyMTFfV0VQX0lWX0xFTiArIElFRUU4MDIxMV9XRVBfSUNWX0xFTjsKIAkJYnJlYWs7CiAJfQotCiAJaWYgKHRyYW5zX3BjaWUtPmJjX3RhYmxlX2R3b3JkKQogCQlsZW4gPSBESVZfUk9VTkRfVVAobGVuLCA0KTsKIAogCWlmIChXQVJOX09OKGxlbiA+IDB4RkZGIHx8IHdyaXRlX3B0ciA+PSBURkRfUVVFVUVfU0laRV9NQVgpKQogCQlyZXR1cm47CiAKLQliY19lbnQgPSBjcHVfdG9fbGUxNihsZW4gfCAoc3RhX2lkIDw8IDEyKSk7CisJaWYgKHRyYW5zLT5jZmctPnVzZV90ZmgpIHsKKwkJdTggZmlsbGVkX3RmZF9zaXplID0gb2Zmc2V0b2Yoc3RydWN0IGl3bF90ZmhfdGZkLCB0YnMpICsKKwkJCQkgICAgIG51bV90YnMgKiBzaXplb2Yoc3RydWN0IGl3bF90ZmhfdGIpOworCQkvKgorCQkgKiBmaWxsZWRfdGZkX3NpemUgY29udGFpbnMgdGhlIG51bWJlciBvZiBmaWxsZWQgYnl0ZXMgaW4gdGhlCisJCSAqIFRGRC4KKwkJICogRGl2aWRpbmcgaXQgYnkgNjQgd2lsbCBnaXZlIHRoZSBudW1iZXIgb2YgY2h1bmtzIHRvIGZldGNoCisJCSAqIHRvIFNSQU0tIDAgZm9yIG9uZSBjaHVuaywgMSBmb3IgMiBhbmQgc28gb24uCisJCSAqIElmLCBmb3IgZXhhbXBsZSwgVEZEIGNvbnRhaW5zIG9ubHkgMyBUQnMgdGhlbiAzMiBieXRlcworCQkgKiBvZiB0aGUgVEZEIGFyZSB1c2VkLCBhbmQgb25seSBvbmUgY2h1bmsgb2YgNjQgYnl0ZXMgc2hvdWxkCisJCSAqIGJlIGZldGNoZWQKKwkJICovCisJCXU4IG51bV9mZXRjaF9jaHVua3MgPSBESVZfUk9VTkRfVVAoZmlsbGVkX3RmZF9zaXplLCA2NCkgLSAxOworCisJCWJjX2VudCA9IGNwdV90b19sZTE2KGxlbiB8IChudW1fZmV0Y2hfY2h1bmtzIDw8IDEyKSk7CisJfSBlbHNlIHsKKwkJdTggc3RhX2lkID0gdHhfY21kLT5zdGFfaWQ7CisKKwkJYmNfZW50ID0gY3B1X3RvX2xlMTYobGVuIHwgKHN0YV9pZCA8PCAxMikpOworCX0KIAogCXNjZF9iY190YmxbdHhxX2lkXS50ZmRfb2Zmc2V0W3dyaXRlX3B0cl0gPSBiY19lbnQ7CiAKQEAgLTIyNywxMiArMjQ0LDEyIEBACiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0KIAkJSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKIAlzdHJ1Y3QgaXdsYWduX3NjZF9iY190YmwgKnNjZF9iY190YmwgPSB0cmFuc19wY2llLT5zY2RfYmNfdGJscy5hZGRyOwotCWludCB0eHFfaWQgPSB0eHEtPnEuaWQ7Ci0JaW50IHJlYWRfcHRyID0gdHhxLT5xLnJlYWRfcHRyOworCWludCB0eHFfaWQgPSB0eHEtPmlkOworCWludCByZWFkX3B0ciA9IHR4cS0+cmVhZF9wdHI7CiAJdTggc3RhX2lkID0gMDsKIAlfX2xlMTYgYmNfZW50OwogCXN0cnVjdCBpd2xfdHhfY21kICp0eF9jbWQgPQotCQkodm9pZCAqKXR4cS0+ZW50cmllc1t0eHEtPnEucmVhZF9wdHJdLmNtZC0+cGF5bG9hZDsKKwkJKHZvaWQgKil0eHEtPmVudHJpZXNbcmVhZF9wdHJdLmNtZC0+cGF5bG9hZDsKIAogCVdBUk5fT04ocmVhZF9wdHIgPj0gVEZEX1FVRVVFX1NJWkVfTUFYKTsKIApAQCAtMjQwLDYgKzI1Nyw3IEBACiAJCXN0YV9pZCA9IHR4X2NtZC0+c3RhX2lkOwogCiAJYmNfZW50ID0gY3B1X3RvX2xlMTYoMSB8IChzdGFfaWQgPDwgMTIpKTsKKwogCXNjZF9iY190YmxbdHhxX2lkXS50ZmRfb2Zmc2V0W3JlYWRfcHRyXSA9IGJjX2VudDsKIAogCWlmIChyZWFkX3B0ciA8IFRGRF9RVUVVRV9TSVpFX0JDX0RVUCkKQEAgLTI1NSw3ICsyNzMsNyBAQAogewogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAJdTMyIHJlZyA9IDA7Ci0JaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKKwlpbnQgdHhxX2lkID0gdHhxLT5pZDsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnR4cS0+bG9jayk7CiAKQEAgLTI4OSwxMCArMzA3LDEwIEBACiAJICogaWYgbm90IGluIHBvd2VyLXNhdmUgbW9kZSwgdUNvZGUgd2lsbCBuZXZlciBzbGVlcCB3aGVuIHdlJ3JlCiAJICogdHJ5aW5nIHRvIHR4IChkdXJpbmcgUkZLSUxMLCB3ZSdyZSBub3QgdHJ5aW5nIHRvIHR4KS4KIAkgKi8KLQlJV0xfREVCVUdfVFgodHJhbnMsICJROiVkIFdSOiAweCV4XG4iLCB0eHFfaWQsIHR4cS0+cS53cml0ZV9wdHIpOworCUlXTF9ERUJVR19UWCh0cmFucywgIlE6JWQgV1I6IDB4JXhcbiIsIHR4cV9pZCwgdHhxLT53cml0ZV9wdHIpOwogCWlmICghdHhxLT5ibG9jaykKIAkJaXdsX3dyaXRlMzIodHJhbnMsIEhCVVNfVEFSR19XUlBUUiwKLQkJCSAgICB0eHEtPnEud3JpdGVfcHRyIHwgKHR4cV9pZCA8PCA4KSk7CisJCQkgICAgdHhxLT53cml0ZV9wdHIgfCAodHhxX2lkIDw8IDgpKTsKIH0KIAogdm9pZCBpd2xfcGNpZV90eHFfY2hlY2tfd3JwdHJzKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQpAQCAtMzEyLDQ5ICszMzAsOTMgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBpd2xfcGNpZV90ZmRfdGJfZ2V0X2FkZHIoc3RydWN0IGl3bF90ZmQgKnRmZCwgdTggaWR4KQorc3RhdGljIGlubGluZSB2b2lkICppd2xfcGNpZV9nZXRfdGZkKHN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSwKKwkJCQkgICAgIHN0cnVjdCBpd2xfdHhxICp0eHEsIGludCBpZHgpCiB7Ci0Jc3RydWN0IGl3bF90ZmRfdGIgKnRiID0gJnRmZC0+dGJzW2lkeF07Ci0KLQlkbWFfYWRkcl90IGFkZHIgPSBnZXRfdW5hbGlnbmVkX2xlMzIoJnRiLT5sbyk7Ci0JaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IHNpemVvZih1MzIpKQotCQlhZGRyIHw9Ci0JCSgoZG1hX2FkZHJfdCkobGUxNl90b19jcHUodGItPmhpX25fbGVuKSAmIDB4RikgPDwgMTYpIDw8IDE2OwotCi0JcmV0dXJuIGFkZHI7CisJcmV0dXJuIHR4cS0+dGZkcyArIHRyYW5zX3BjaWUtPnRmZF9zaXplICogaWR4OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX3BjaWVfdGZkX3NldF90YihzdHJ1Y3QgaXdsX3RmZCAqdGZkLCB1OCBpZHgsCi0JCQkJICAgICAgIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbikKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBpd2xfcGNpZV90ZmRfdGJfZ2V0X2FkZHIoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCQkJCQkgIHZvaWQgKl90ZmQsIHU4IGlkeCkKIHsKLQlzdHJ1Y3QgaXdsX3RmZF90YiAqdGIgPSAmdGZkLT50YnNbaWR4XTsKLQl1MTYgaGlfbl9sZW4gPSBsZW4gPDwgNDsKIAotCXB1dF91bmFsaWduZWRfbGUzMihhZGRyLCAmdGItPmxvKTsKLQlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gc2l6ZW9mKHUzMikpCi0JCWhpX25fbGVuIHw9ICgoYWRkciA+PiAxNikgPj4gMTYpICYgMHhGOworCWlmICh0cmFucy0+Y2ZnLT51c2VfdGZoKSB7CisJCXN0cnVjdCBpd2xfdGZoX3RmZCAqdGZkID0gX3RmZDsKKwkJc3RydWN0IGl3bF90ZmhfdGIgKnRiID0gJnRmZC0+dGJzW2lkeF07CiAKLQl0Yi0+aGlfbl9sZW4gPSBjcHVfdG9fbGUxNihoaV9uX2xlbik7CisJCXJldHVybiAoZG1hX2FkZHJfdCkobGU2NF90b19jcHUodGItPmFkZHIpKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgaXdsX3RmZCAqdGZkID0gX3RmZDsKKwkJc3RydWN0IGl3bF90ZmRfdGIgKnRiID0gJnRmZC0+dGJzW2lkeF07CisJCWRtYV9hZGRyX3QgYWRkciA9IGdldF91bmFsaWduZWRfbGUzMigmdGItPmxvKTsKKwkJZG1hX2FkZHJfdCBoaV9sZW47CiAKLQl0ZmQtPm51bV90YnMgPSBpZHggKyAxOworCQlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpIDw9IHNpemVvZih1MzIpKQorCQkJcmV0dXJuIGFkZHI7CisKKwkJaGlfbGVuID0gbGUxNl90b19jcHUodGItPmhpX25fbGVuKSAmIDB4RjsKKworCQkvKgorCQkgKiBzaGlmdCBieSAxNiB0d2ljZSB0byBhdm9pZCB3YXJuaW5ncyBvbiAzMi1iaXQKKwkJICogKHdoZXJlIHRoaXMgY29kZSBuZXZlciBydW5zIGFueXdheSBkdWUgdG8gdGhlCisJCSAqIGlmIHN0YXRlbWVudCBhYm92ZSkKKwkJICovCisJCXJldHVybiBhZGRyIHwgKChoaV9sZW4gPDwgMTYpIDw8IDE2KTsKKwl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTggaXdsX3BjaWVfdGZkX2dldF9udW1fdGJzKHN0cnVjdCBpd2xfdGZkICp0ZmQpCitzdGF0aWMgaW5saW5lIHZvaWQgaXdsX3BjaWVfdGZkX3NldF90YihzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgdm9pZCAqdGZkLAorCQkJCSAgICAgICB1OCBpZHgsIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbikKIHsKLQlyZXR1cm4gdGZkLT5udW1fdGJzICYgMHgxZjsKKwlpZiAodHJhbnMtPmNmZy0+dXNlX3RmaCkgeworCQlzdHJ1Y3QgaXdsX3RmaF90ZmQgKnRmZF9maCA9ICh2b2lkICopdGZkOworCQlzdHJ1Y3QgaXdsX3RmaF90YiAqdGIgPSAmdGZkX2ZoLT50YnNbaWR4XTsKKworCQlwdXRfdW5hbGlnbmVkX2xlNjQoYWRkciwgJnRiLT5hZGRyKTsKKwkJdGItPnRiX2xlbiA9IGNwdV90b19sZTE2KGxlbik7CisKKwkJdGZkX2ZoLT5udW1fdGJzID0gY3B1X3RvX2xlMTYoaWR4ICsgMSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGl3bF90ZmQgKnRmZF9maCA9ICh2b2lkICopdGZkOworCQlzdHJ1Y3QgaXdsX3RmZF90YiAqdGIgPSAmdGZkX2ZoLT50YnNbaWR4XTsKKworCQl1MTYgaGlfbl9sZW4gPSBsZW4gPDwgNDsKKworCQlwdXRfdW5hbGlnbmVkX2xlMzIoYWRkciwgJnRiLT5sbyk7CisJCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPiBzaXplb2YodTMyKSkKKwkJCWhpX25fbGVuIHw9ICgoYWRkciA+PiAxNikgPj4gMTYpICYgMHhGOworCisJCXRiLT5oaV9uX2xlbiA9IGNwdV90b19sZTE2KGhpX25fbGVuKTsKKworCQl0ZmRfZmgtPm51bV90YnMgPSBpZHggKyAxOworCX0KK30KKworc3RhdGljIGlubGluZSB1OCBpd2xfcGNpZV90ZmRfZ2V0X251bV90YnMoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHZvaWQgKl90ZmQpCit7CisJaWYgKHRyYW5zLT5jZmctPnVzZV90ZmgpIHsKKwkJc3RydWN0IGl3bF90ZmhfdGZkICp0ZmQgPSBfdGZkOworCisJCXJldHVybiBsZTE2X3RvX2NwdSh0ZmQtPm51bV90YnMpICYgMHgxZjsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgaXdsX3RmZCAqdGZkID0gX3RmZDsKKworCQlyZXR1cm4gdGZkLT5udW1fdGJzICYgMHgxZjsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGl3bF9wY2llX3RmZF91bm1hcChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKIAkJCSAgICAgICBzdHJ1Y3QgaXdsX2NtZF9tZXRhICptZXRhLAotCQkJICAgICAgIHN0cnVjdCBpd2xfdGZkICp0ZmQpCisJCQkgICAgICAgc3RydWN0IGl3bF90eHEgKnR4cSwgaW50IGluZGV4KQogewotCWludCBpOwotCWludCBudW1fdGJzOworCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CisJaW50IGksIG51bV90YnM7CisJdm9pZCAqdGZkID0gaXdsX3BjaWVfZ2V0X3RmZCh0cmFuc19wY2llLCB0eHEsIGluZGV4KTsKIAogCS8qIFNhbml0eSBjaGVjayBvbiBudW1iZXIgb2YgY2h1bmtzICovCi0JbnVtX3RicyA9IGl3bF9wY2llX3RmZF9nZXRfbnVtX3Ricyh0ZmQpOworCW51bV90YnMgPSBpd2xfcGNpZV90ZmRfZ2V0X251bV90YnModHJhbnMsIHRmZCk7CiAKLQlpZiAobnVtX3RicyA+PSBJV0xfTlVNX09GX1RCUykgeworCWlmIChudW1fdGJzID49IHRyYW5zX3BjaWUtPm1heF90YnMpIHsKIAkJSVdMX0VSUih0cmFucywgIlRvbyBtYW55IGNodW5rczogJWlcbiIsIG51bV90YnMpOwogCQkvKiBAdG9kbyBpc3N1ZSBmYXRhbCBlcnJvciwgaXQgaXMgcXVpdGUgc2VyaW91cyBzaXR1YXRpb24gKi8KIAkJcmV0dXJuOwpAQCAtMzYzLDE4ICs0MjUsMzAgQEAKIAkvKiBmaXJzdCBUQiBpcyBuZXZlciBmcmVlZCAtIGl0J3MgdGhlIGJpZGlyZWN0aW9uYWwgRE1BIGRhdGEgKi8KIAogCWZvciAoaSA9IDE7IGkgPCBudW1fdGJzOyBpKyspIHsKLQkJaWYgKG1ldGEtPmZsYWdzICYgQklUKGkgKyBDTURfVEJfQklUTUFQX1BPUykpCisJCWlmIChtZXRhLT50YnMgJiBCSVQoaSkpCiAJCQlkbWFfdW5tYXBfcGFnZSh0cmFucy0+ZGV2LAotCQkJCSAgICAgICBpd2xfcGNpZV90ZmRfdGJfZ2V0X2FkZHIodGZkLCBpKSwKLQkJCQkgICAgICAgaXdsX3BjaWVfdGZkX3RiX2dldF9sZW4odGZkLCBpKSwKKwkJCQkgICAgICAgaXdsX3BjaWVfdGZkX3RiX2dldF9hZGRyKHRyYW5zLCB0ZmQsIGkpLAorCQkJCSAgICAgICBpd2xfcGNpZV90ZmRfdGJfZ2V0X2xlbih0cmFucywgdGZkLCBpKSwKIAkJCQkgICAgICAgRE1BX1RPX0RFVklDRSk7CiAJCWVsc2UKIAkJCWRtYV91bm1hcF9zaW5nbGUodHJhbnMtPmRldiwKLQkJCQkJIGl3bF9wY2llX3RmZF90Yl9nZXRfYWRkcih0ZmQsIGkpLAotCQkJCQkgaXdsX3BjaWVfdGZkX3RiX2dldF9sZW4odGZkLCBpKSwKKwkJCQkJIGl3bF9wY2llX3RmZF90Yl9nZXRfYWRkcih0cmFucywgdGZkLAorCQkJCQkJCQkgIGkpLAorCQkJCQkgaXdsX3BjaWVfdGZkX3RiX2dldF9sZW4odHJhbnMsIHRmZCwKKwkJCQkJCQkJIGkpLAogCQkJCQkgRE1BX1RPX0RFVklDRSk7CiAJfQotCXRmZC0+bnVtX3RicyA9IDA7CisKKwlpZiAodHJhbnMtPmNmZy0+dXNlX3RmaCkgeworCQlzdHJ1Y3QgaXdsX3RmaF90ZmQgKnRmZF9maCA9ICh2b2lkICopdGZkOworCisJCXRmZF9maC0+bnVtX3RicyA9IDA7CisJfSBlbHNlIHsKKwkJc3RydWN0IGl3bF90ZmQgKnRmZF9maCA9ICh2b2lkICopdGZkOworCisJCXRmZF9maC0+bnVtX3RicyA9IDA7CisJfQorCiB9CiAKIC8qCkBAIC0zODgsMjAgKzQ2MiwxOCBAQAogICovCiBzdGF0aWMgdm9pZCBpd2xfcGNpZV90eHFfZnJlZV90ZmQoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHN0cnVjdCBpd2xfdHhxICp0eHEpCiB7Ci0Jc3RydWN0IGl3bF90ZmQgKnRmZF90bXAgPSB0eHEtPnRmZHM7Ci0KIAkvKiByZF9wdHIgaXMgYm91bmRlZCBieSBURkRfUVVFVUVfU0laRV9NQVggYW5kCiAJICogaWR4IGlzIGJvdW5kZWQgYnkgbl93aW5kb3cKIAkgKi8KLQlpbnQgcmRfcHRyID0gdHhxLT5xLnJlYWRfcHRyOwotCWludCBpZHggPSBnZXRfY21kX2luZGV4KCZ0eHEtPnEsIHJkX3B0cik7CisJaW50IHJkX3B0ciA9IHR4cS0+cmVhZF9wdHI7CisJaW50IGlkeCA9IGdldF9jbWRfaW5kZXgodHhxLCByZF9wdHIpOwogCiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmdHhxLT5sb2NrKTsKIAogCS8qIFdlIGhhdmUgb25seSBxLT5uX3dpbmRvdyB0eHEtPmVudHJpZXMsIGJ1dCB3ZSB1c2UKIAkgKiBURkRfUVVFVUVfU0laRV9NQVggdGZkcwogCSAqLwotCWl3bF9wY2llX3RmZF91bm1hcCh0cmFucywgJnR4cS0+ZW50cmllc1tpZHhdLm1ldGEsICZ0ZmRfdG1wW3JkX3B0cl0pOworCWl3bF9wY2llX3RmZF91bm1hcCh0cmFucywgJnR4cS0+ZW50cmllc1tpZHhdLm1ldGEsIHR4cSwgcmRfcHRyKTsKIAogCS8qIGZyZWUgU0tCICovCiAJaWYgKHR4cS0+ZW50cmllcykgewpAQCAtNDIzLDIzICs0OTUsMjEgQEAKIHN0YXRpYyBpbnQgaXdsX3BjaWVfdHhxX2J1aWxkX3RmZChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgc3RydWN0IGl3bF90eHEgKnR4cSwKIAkJCQkgIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbiwgYm9vbCByZXNldCkKIHsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxOwotCXN0cnVjdCBpd2xfdGZkICp0ZmQsICp0ZmRfdG1wOworCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CisJdm9pZCAqdGZkOwogCXUzMiBudW1fdGJzOwogCi0JcSA9ICZ0eHEtPnE7Ci0JdGZkX3RtcCA9IHR4cS0+dGZkczsKLQl0ZmQgPSAmdGZkX3RtcFtxLT53cml0ZV9wdHJdOworCXRmZCA9IHR4cS0+dGZkcyArIHRyYW5zX3BjaWUtPnRmZF9zaXplICogdHhxLT53cml0ZV9wdHI7CiAKIAlpZiAocmVzZXQpCi0JCW1lbXNldCh0ZmQsIDAsIHNpemVvZigqdGZkKSk7CisJCW1lbXNldCh0ZmQsIDAsIHRyYW5zX3BjaWUtPnRmZF9zaXplKTsKIAotCW51bV90YnMgPSBpd2xfcGNpZV90ZmRfZ2V0X251bV90YnModGZkKTsKKwludW1fdGJzID0gaXdsX3BjaWVfdGZkX2dldF9udW1fdGJzKHRyYW5zLCB0ZmQpOwogCi0JLyogRWFjaCBURkQgY2FuIHBvaW50IHRvIGEgbWF4aW11bSAyMCBUeCBidWZmZXJzICovCi0JaWYgKG51bV90YnMgPj0gSVdMX05VTV9PRl9UQlMpIHsKKwkvKiBFYWNoIFRGRCBjYW4gcG9pbnQgdG8gYSBtYXhpbXVtIG1heF90YnMgVHggYnVmZmVycyAqLworCWlmIChudW1fdGJzID49IHRyYW5zX3BjaWUtPm1heF90YnMpIHsKIAkJSVdMX0VSUih0cmFucywgIkVycm9yIGNhbiBub3Qgc2VuZCBtb3JlIHRoYW4gJWQgY2h1bmtzXG4iLAotCQkJSVdMX05VTV9PRl9UQlMpOworCQkJdHJhbnNfcGNpZS0+bWF4X3Ricyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDQ3LDcgKzUxNyw3IEBACiAJCSAiVW5hbGlnbmVkIGFkZHJlc3MgPSAlbGx4XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWFkZHIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWl3bF9wY2llX3RmZF9zZXRfdGIodGZkLCBudW1fdGJzLCBhZGRyLCBsZW4pOworCWl3bF9wY2llX3RmZF9zZXRfdGIodHJhbnMsIHRmZCwgbnVtX3RicywgYWRkciwgbGVuKTsKIAogCXJldHVybiBudW1fdGJzOwogfQpAQCAtNDU3LDcgKzUyNyw3IEBACiAJCQkgICAgICAgdTMyIHR4cV9pZCkKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwotCXNpemVfdCB0ZmRfc3ogPSBzaXplb2Yoc3RydWN0IGl3bF90ZmQpICogVEZEX1FVRVVFX1NJWkVfTUFYOworCXNpemVfdCB0ZmRfc3ogPSB0cmFuc19wY2llLT50ZmRfc2l6ZSAqIFRGRF9RVUVVRV9TSVpFX01BWDsKIAlzaXplX3QgdGIwX2J1Zl9zejsKIAlpbnQgaTsKIApAQCAtNDY4LDcgKzUzOCw3IEBACiAJCSAgICAodW5zaWduZWQgbG9uZyl0eHEpOwogCXR4cS0+dHJhbnNfcGNpZSA9IHRyYW5zX3BjaWU7CiAKLQl0eHEtPnEubl93aW5kb3cgPSBzbG90c19udW07CisJdHhxLT5uX3dpbmRvdyA9IHNsb3RzX251bTsKIAogCXR4cS0+ZW50cmllcyA9IGtjYWxsb2Moc2xvdHNfbnVtLAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX3BjaWVfdHhxX2VudHJ5KSwKQEAgLTQ4OSw3ICs1NTksNyBAQAogCS8qIENpcmN1bGFyIGJ1ZmZlciBvZiB0cmFuc21pdCBmcmFtZSBkZXNjcmlwdG9ycyAoVEZEcyksCiAJICogc2hhcmVkIHdpdGggZGV2aWNlICovCiAJdHhxLT50ZmRzID0gZG1hX2FsbG9jX2NvaGVyZW50KHRyYW5zLT5kZXYsIHRmZF9zeiwKLQkJCQkgICAgICAgJnR4cS0+cS5kbWFfYWRkciwgR0ZQX0tFUk5FTCk7CisJCQkJICAgICAgICZ0eHEtPmRtYV9hZGRyLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXR4cS0+dGZkcykKIAkJZ290byBlcnJvcjsKIApAQCAtNTAzLDExICs1NzMsMTEgQEAKIAlpZiAoIXR4cS0+Zmlyc3RfdGJfYnVmcykKIAkJZ290byBlcnJfZnJlZV90ZmRzOwogCi0JdHhxLT5xLmlkID0gdHhxX2lkOworCXR4cS0+aWQgPSB0eHFfaWQ7CiAKIAlyZXR1cm4gMDsKIGVycl9mcmVlX3RmZHM6Ci0JZG1hX2ZyZWVfY29oZXJlbnQodHJhbnMtPmRldiwgdGZkX3N6LCB0eHEtPnRmZHMsIHR4cS0+cS5kbWFfYWRkcik7CisJZG1hX2ZyZWVfY29oZXJlbnQodHJhbnMtPmRldiwgdGZkX3N6LCB0eHEtPnRmZHMsIHR4cS0+ZG1hX2FkZHIpOwogZXJyb3I6CiAJaWYgKHR4cS0+ZW50cmllcyAmJiB0eHFfaWQgPT0gdHJhbnNfcGNpZS0+Y21kX3F1ZXVlKQogCQlmb3IgKGkgPSAwOyBpIDwgc2xvdHNfbnVtOyBpKyspCkBAIC01MzEsNyArNjAxLDcgQEAKIAlCVUlMRF9CVUdfT04oVEZEX1FVRVVFX1NJWkVfTUFYICYgKFRGRF9RVUVVRV9TSVpFX01BWCAtIDEpKTsKIAogCS8qIEluaXRpYWxpemUgcXVldWUncyBoaWdoL2xvdy13YXRlciBtYXJrcywgYW5kIGhlYWQvdGFpbCBpbmRleGVzICovCi0JcmV0ID0gaXdsX3F1ZXVlX2luaXQoJnR4cS0+cSwgc2xvdHNfbnVtLCB0eHFfaWQpOworCXJldCA9IGl3bF9xdWV1ZV9pbml0KHR4cSwgc2xvdHNfbnVtLCB0eHFfaWQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTU0NSwxMCArNjE1LDEwIEBACiAJaWYgKHRyYW5zLT5jZmctPnVzZV90ZmgpCiAJCWl3bF93cml0ZV9kaXJlY3Q2NCh0cmFucywKIAkJCQkgICBGSF9NRU1fQ0JCQ19RVUVVRSh0cmFucywgdHhxX2lkKSwKLQkJCQkgICB0eHEtPnEuZG1hX2FkZHIpOworCQkJCSAgIHR4cS0+ZG1hX2FkZHIpOwogCWVsc2UKIAkJaXdsX3dyaXRlX2RpcmVjdDMyKHRyYW5zLCBGSF9NRU1fQ0JCQ19RVUVVRSh0cmFucywgdHhxX2lkKSwKLQkJCQkgICB0eHEtPnEuZG1hX2FkZHIgPj4gOCk7CisJCQkJICAgdHhxLT5kbWFfYWRkciA+PiA4KTsKIAogCXJldHVybiAwOwogfQpAQCAtNTk1LDE1ICs2NjUsMTQgQEAKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCXN0cnVjdCBpd2xfdHhxICp0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF07Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CiAKIAlzcGluX2xvY2tfYmgoJnR4cS0+bG9jayk7Ci0Jd2hpbGUgKHEtPndyaXRlX3B0ciAhPSBxLT5yZWFkX3B0cikgeworCXdoaWxlICh0eHEtPndyaXRlX3B0ciAhPSB0eHEtPnJlYWRfcHRyKSB7CiAJCUlXTF9ERUJVR19UWF9SRVBMWSh0cmFucywgIlEgJWQgRnJlZSAlZFxuIiwKLQkJCQkgICB0eHFfaWQsIHEtPnJlYWRfcHRyKTsKKwkJCQkgICB0eHFfaWQsIHR4cS0+cmVhZF9wdHIpOwogCiAJCWlmICh0eHFfaWQgIT0gdHJhbnNfcGNpZS0+Y21kX3F1ZXVlKSB7Ci0JCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHhxLT5lbnRyaWVzW3EtPnJlYWRfcHRyXS5za2I7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHhxLT5lbnRyaWVzW3R4cS0+cmVhZF9wdHJdLnNrYjsKIAogCQkJaWYgKFdBUk5fT05fT05DRSghc2tiKSkKIAkJCQljb250aW51ZTsKQEAgLTYxMSwxNSArNjgwLDE1IEBACiAJCQlpd2xfcGNpZV9mcmVlX3Rzb19wYWdlKHRyYW5zX3BjaWUsIHNrYik7CiAJCX0KIAkJaXdsX3BjaWVfdHhxX2ZyZWVfdGZkKHRyYW5zLCB0eHEpOwotCQlxLT5yZWFkX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0cik7CisJCXR4cS0+cmVhZF9wdHIgPSBpd2xfcXVldWVfaW5jX3dyYXAodHhxLT5yZWFkX3B0cik7CiAKLQkJaWYgKHEtPnJlYWRfcHRyID09IHEtPndyaXRlX3B0cikgeworCQlpZiAodHhxLT5yZWFkX3B0ciA9PSB0eHEtPndyaXRlX3B0cikgewogCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnRyYW5zX3BjaWUtPnJlZ19sb2NrLCBmbGFncyk7CiAJCQlpZiAodHhxX2lkICE9IHRyYW5zX3BjaWUtPmNtZF9xdWV1ZSkgewogCQkJCUlXTF9ERUJVR19SUE0odHJhbnMsICJRICVkIC0gbGFzdCB0eCBmcmVlZFxuIiwKLQkJCQkJICAgICAgcS0+aWQpOworCQkJCQkgICAgICB0eHEtPmlkKTsKIAkJCQlpd2xfdHJhbnNfdW5yZWYodHJhbnMpOwogCQkJfSBlbHNlIHsKIAkJCQlpd2xfcGNpZV9jbGVhcl9jbWRfaW5fZmxpZ2h0KHRyYW5zKTsKQEAgLTY2Myw3ICs3MzIsNyBAQAogCiAJLyogRGUtYWxsb2MgYXJyYXkgb2YgY29tbWFuZC90eCBidWZmZXJzICovCiAJaWYgKHR4cV9pZCA9PSB0cmFuc19wY2llLT5jbWRfcXVldWUpCi0JCWZvciAoaSA9IDA7IGkgPCB0eHEtPnEubl93aW5kb3c7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgdHhxLT5uX3dpbmRvdzsgaSsrKSB7CiAJCQlremZyZWUodHhxLT5lbnRyaWVzW2ldLmNtZCk7CiAJCQlremZyZWUodHhxLT5lbnRyaWVzW2ldLmZyZWVfYnVmKTsKIAkJfQpAQCAtNjcxLDEzICs3NDAsMTMgQEAKIAkvKiBEZS1hbGxvYyBjaXJjdWxhciBidWZmZXIgb2YgVEZEcyAqLwogCWlmICh0eHEtPnRmZHMpIHsKIAkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LAotCQkJCSAgc2l6ZW9mKHN0cnVjdCBpd2xfdGZkKSAqIFRGRF9RVUVVRV9TSVpFX01BWCwKLQkJCQkgIHR4cS0+dGZkcywgdHhxLT5xLmRtYV9hZGRyKTsKLQkJdHhxLT5xLmRtYV9hZGRyID0gMDsKKwkJCQkgIHRyYW5zX3BjaWUtPnRmZF9zaXplICogVEZEX1FVRVVFX1NJWkVfTUFYLAorCQkJCSAgdHhxLT50ZmRzLCB0eHEtPmRtYV9hZGRyKTsKKwkJdHhxLT5kbWFfYWRkciA9IDA7CiAJCXR4cS0+dGZkcyA9IE5VTEw7CiAKIAkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LAotCQkJCSAgc2l6ZW9mKCp0eHEtPmZpcnN0X3RiX2J1ZnMpICogdHhxLT5xLm5fd2luZG93LAorCQkJCSAgc2l6ZW9mKCp0eHEtPmZpcnN0X3RiX2J1ZnMpICogdHhxLT5uX3dpbmRvdywKIAkJCQkgIHR4cS0+Zmlyc3RfdGJfYnVmcywgdHhxLT5maXJzdF90Yl9kbWEpOwogCX0KIApAQCAtNzAzLDYgKzc3Miw5IEBACiAJbWVtc2V0KHRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BwZWQsIDAsIHNpemVvZih0cmFuc19wY2llLT5xdWV1ZV9zdG9wcGVkKSk7CiAJbWVtc2V0KHRyYW5zX3BjaWUtPnF1ZXVlX3VzZWQsIDAsIHNpemVvZih0cmFuc19wY2llLT5xdWV1ZV91c2VkKSk7CiAKKwlpZiAodHJhbnMtPmNmZy0+dXNlX3RmaCkKKwkJcmV0dXJuOworCiAJdHJhbnNfcGNpZS0+c2NkX2Jhc2VfYWRkciA9CiAJCWl3bF9yZWFkX3BycGgodHJhbnMsIFNDRF9TUkFNX0JBU0VfQUREUik7CiAKQEAgLTc1OCwxNCArODMwLDE0IEBACiAJCWlmICh0cmFucy0+Y2ZnLT51c2VfdGZoKQogCQkJaXdsX3dyaXRlX2RpcmVjdDY0KHRyYW5zLAogCQkJCQkgICBGSF9NRU1fQ0JCQ19RVUVVRSh0cmFucywgdHhxX2lkKSwKLQkJCQkJICAgdHhxLT5xLmRtYV9hZGRyKTsKKwkJCQkJICAgdHhxLT5kbWFfYWRkcik7CiAJCWVsc2UKIAkJCWl3bF93cml0ZV9kaXJlY3QzMih0cmFucywKIAkJCQkJICAgRkhfTUVNX0NCQkNfUVVFVUUodHJhbnMsIHR4cV9pZCksCi0JCQkJCSAgIHR4cS0+cS5kbWFfYWRkciA+PiA4KTsKKwkJCQkJICAgdHhxLT5kbWFfYWRkciA+PiA4KTsKIAkJaXdsX3BjaWVfdHhxX3VubWFwKHRyYW5zLCB0eHFfaWQpOwotCQl0eHEtPnEucmVhZF9wdHIgPSAwOwotCQl0eHEtPnEud3JpdGVfcHRyID0gMDsKKwkJdHhxLT5yZWFkX3B0ciA9IDA7CisJCXR4cS0+d3JpdGVfcHRyID0gMDsKIAl9CiAKIAkvKiBUZWxsIE5JQyB3aGVyZSB0byBmaW5kIHRoZSAia2VlcCB3YXJtIiBidWZmZXIgKi8KQEAgLTk3MCwxMSArMTA0MiwxMyBAQAogCQl9CiAJfQogCi0JaWYgKHRyYW5zLT5jZmctPnVzZV90ZmgpCisJaWYgKHRyYW5zLT5jZmctPnVzZV90ZmgpIHsKIAkJaXdsX3dyaXRlX2RpcmVjdDMyKHRyYW5zLCBURkhfVFJBTlNGRVJfTU9ERSwKIAkJCQkgICBURkhfVFJBTlNGRVJfTUFYX1BFTkRJTkdfUkVRIHwKIAkJCQkgICBURkhfQ0hVTktfU0laRV8xMjggfAogCQkJCSAgIFRGSF9DSFVOS19TUExJVF9NT0RFKTsKKwkJcmV0dXJuIDA7CisJfQogCiAJaXdsX3NldF9iaXRzX3BycGgodHJhbnMsIFNDRF9HUF9DVFJMLCBTQ0RfR1BfQ1RSTF9BVVRPX0FDVElWRV9NT0RFKTsKIAlpZiAodHJhbnMtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgPiAyMCkKQEAgLTEwMDcsNyArMTA4MSw3IEBACiAJICogaWYgZW1wdHkgZGVsZXRlIHRpbWVyLCBvdGhlcndpc2UgbW92ZSB0aW1lciBmb3J3YXJkCiAJICogc2luY2Ugd2UncmUgbWFraW5nIHByb2dyZXNzIG9uIHRoaXMgcXVldWUKIAkgKi8KLQlpZiAodHhxLT5xLnJlYWRfcHRyID09IHR4cS0+cS53cml0ZV9wdHIpCisJaWYgKHR4cS0+cmVhZF9wdHIgPT0gdHhxLT53cml0ZV9wdHIpCiAJCWRlbF90aW1lcigmdHhxLT5zdHVja190aW1lcik7CiAJZWxzZQogCQltb2RfdGltZXIoJnR4cS0+c3R1Y2tfdGltZXIsIGppZmZpZXMgKyB0eHEtPndkX3RpbWVvdXQpOwpAQCAtMTAyMCw3ICsxMDk0LDYgQEAKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCXN0cnVjdCBpd2xfdHhxICp0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF07CiAJaW50IHRmZF9udW0gPSBzc24gJiAoVEZEX1FVRVVFX1NJWkVfTUFYIC0gMSk7Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CiAJaW50IGxhc3RfdG9fZnJlZTsKIAogCS8qIFRoaXMgZnVuY3Rpb24gaXMgbm90IG1lYW50IHRvIHJlbGVhc2UgY21kIHF1ZXVlKi8KQEAgLTEwMzUsMjEgKzExMDgsMjEgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHR4cS0+cS5yZWFkX3B0ciA9PSB0ZmRfbnVtKQorCWlmICh0eHEtPnJlYWRfcHRyID09IHRmZF9udW0pCiAJCWdvdG8gb3V0OwogCiAJSVdMX0RFQlVHX1RYX1JFUExZKHRyYW5zLCAiW1EgJWRdICVkIC0+ICVkICglZClcbiIsCi0JCQkgICB0eHFfaWQsIHR4cS0+cS5yZWFkX3B0ciwgdGZkX251bSwgc3NuKTsKKwkJCSAgIHR4cV9pZCwgdHhxLT5yZWFkX3B0ciwgdGZkX251bSwgc3NuKTsKIAogCS8qU2luY2Ugd2UgZnJlZSB1bnRpbCBpbmRleCBfbm90XyBpbmNsdXNpdmUsIHRoZSBvbmUgYmVmb3JlIGluZGV4IGlzCiAJICogdGhlIGxhc3Qgd2Ugd2lsbCBmcmVlLiBUaGlzIG9uZSBtdXN0IGJlIHVzZWQgKi8KIAlsYXN0X3RvX2ZyZWUgPSBpd2xfcXVldWVfZGVjX3dyYXAodGZkX251bSk7CiAKLQlpZiAoIWl3bF9xdWV1ZV91c2VkKHEsIGxhc3RfdG9fZnJlZSkpIHsKKwlpZiAoIWl3bF9xdWV1ZV91c2VkKHR4cSwgbGFzdF90b19mcmVlKSkgewogCQlJV0xfRVJSKHRyYW5zLAogCQkJIiVzOiBSZWFkIGluZGV4IGZvciBETUEgcXVldWUgdHhxIGlkICglZCksIGxhc3RfdG9fZnJlZSAlZCBpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkLlxuIiwKIAkJCV9fZnVuY19fLCB0eHFfaWQsIGxhc3RfdG9fZnJlZSwgVEZEX1FVRVVFX1NJWkVfTUFYLAotCQkJcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7CisJCQl0eHEtPndyaXRlX3B0ciwgdHhxLT5yZWFkX3B0cik7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTA1Nyw5ICsxMTMwLDkgQEAKIAkJZ290byBvdXQ7CiAKIAlmb3IgKDsKLQkgICAgIHEtPnJlYWRfcHRyICE9IHRmZF9udW07Ci0JICAgICBxLT5yZWFkX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0cikpIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4cS0+ZW50cmllc1t0eHEtPnEucmVhZF9wdHJdLnNrYjsKKwkgICAgIHR4cS0+cmVhZF9wdHIgIT0gdGZkX251bTsKKwkgICAgIHR4cS0+cmVhZF9wdHIgPSBpd2xfcXVldWVfaW5jX3dyYXAodHhxLT5yZWFkX3B0cikpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4cS0+ZW50cmllc1t0eHEtPnJlYWRfcHRyXS5za2I7CiAKIAkJaWYgKFdBUk5fT05fT05DRSghc2tiKSkKIAkJCWNvbnRpbnVlOwpAQCAtMTA2OCwxNiArMTE0MSwxNyBAQAogCiAJCV9fc2tiX3F1ZXVlX3RhaWwoc2ticywgc2tiKTsKIAotCQl0eHEtPmVudHJpZXNbdHhxLT5xLnJlYWRfcHRyXS5za2IgPSBOVUxMOworCQl0eHEtPmVudHJpZXNbdHhxLT5yZWFkX3B0cl0uc2tiID0gTlVMTDsKIAotCQlpd2xfcGNpZV90eHFfaW52YWxfYnl0ZV9jbnRfdGJsKHRyYW5zLCB0eHEpOworCQlpZiAoIXRyYW5zLT5jZmctPnVzZV90ZmgpCisJCQlpd2xfcGNpZV90eHFfaW52YWxfYnl0ZV9jbnRfdGJsKHRyYW5zLCB0eHEpOwogCiAJCWl3bF9wY2llX3R4cV9mcmVlX3RmZCh0cmFucywgdHhxKTsKIAl9CiAKIAlpd2xfcGNpZV90eHFfcHJvZ3Jlc3ModHhxKTsKIAotCWlmIChpd2xfcXVldWVfc3BhY2UoJnR4cS0+cSkgPiB0eHEtPnEubG93X21hcmsgJiYKKwlpZiAoaXdsX3F1ZXVlX3NwYWNlKHR4cSkgPiB0eHEtPmxvd19tYXJrICYmCiAJICAgIHRlc3RfYml0KHR4cV9pZCwgdHJhbnNfcGNpZS0+cXVldWVfc3RvcHBlZCkpIHsKIAkJc3RydWN0IHNrX2J1ZmZfaGVhZCBvdmVyZmxvd19za2JzOwogCkBAIC0xMTA5LDEyICsxMTgzLDEyIEBACiAJCX0KIAkJc3Bpbl9sb2NrX2JoKCZ0eHEtPmxvY2spOwogCi0JCWlmIChpd2xfcXVldWVfc3BhY2UoJnR4cS0+cSkgPiB0eHEtPnEubG93X21hcmspCisJCWlmIChpd2xfcXVldWVfc3BhY2UodHhxKSA+IHR4cS0+bG93X21hcmspCiAJCQlpd2xfd2FrZV9xdWV1ZSh0cmFucywgdHhxKTsKIAl9CiAKLQlpZiAocS0+cmVhZF9wdHIgPT0gcS0+d3JpdGVfcHRyKSB7Ci0JCUlXTF9ERUJVR19SUE0odHJhbnMsICJRICVkIC0gbGFzdCB0eCByZWNsYWltZWRcbiIsIHEtPmlkKTsKKwlpZiAodHhxLT5yZWFkX3B0ciA9PSB0eHEtPndyaXRlX3B0cikgeworCQlJV0xfREVCVUdfUlBNKHRyYW5zLCAiUSAlZCAtIGxhc3QgdHggcmVjbGFpbWVkXG4iLCB0eHEtPmlkKTsKIAkJaXdsX3RyYW5zX3VucmVmKHRyYW5zKTsKIAl9CiAKQEAgLTExNzYsMzEgKzEyNTAsMzAgQEAKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCXN0cnVjdCBpd2xfdHhxICp0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF07Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgbmZyZWVkID0gMDsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnR4cS0+bG9jayk7CiAKLQlpZiAoKGlkeCA+PSBURkRfUVVFVUVfU0laRV9NQVgpIHx8ICghaXdsX3F1ZXVlX3VzZWQocSwgaWR4KSkpIHsKKwlpZiAoKGlkeCA+PSBURkRfUVVFVUVfU0laRV9NQVgpIHx8ICghaXdsX3F1ZXVlX3VzZWQodHhxLCBpZHgpKSkgewogCQlJV0xfRVJSKHRyYW5zLAogCQkJIiVzOiBSZWFkIGluZGV4IGZvciBETUEgcXVldWUgdHhxIGlkICglZCksIGluZGV4ICVkIGlzIG91dCBvZiByYW5nZSBbMC0lZF0gJWQgJWQuXG4iLAogCQkJX19mdW5jX18sIHR4cV9pZCwgaWR4LCBURkRfUVVFVUVfU0laRV9NQVgsCi0JCQlxLT53cml0ZV9wdHIsIHEtPnJlYWRfcHRyKTsKKwkJCXR4cS0+d3JpdGVfcHRyLCB0eHEtPnJlYWRfcHRyKTsKIAkJcmV0dXJuOwogCX0KIAotCWZvciAoaWR4ID0gaXdsX3F1ZXVlX2luY193cmFwKGlkeCk7IHEtPnJlYWRfcHRyICE9IGlkeDsKLQkgICAgIHEtPnJlYWRfcHRyID0gaXdsX3F1ZXVlX2luY193cmFwKHEtPnJlYWRfcHRyKSkgeworCWZvciAoaWR4ID0gaXdsX3F1ZXVlX2luY193cmFwKGlkeCk7IHR4cS0+cmVhZF9wdHIgIT0gaWR4OworCSAgICAgdHhxLT5yZWFkX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcCh0eHEtPnJlYWRfcHRyKSkgewogCiAJCWlmIChuZnJlZWQrKyA+IDApIHsKIAkJCUlXTF9FUlIodHJhbnMsICJIQ01EIHNraXBwZWQ6IGluZGV4ICglZCkgJWQgJWRcbiIsCi0JCQkJaWR4LCBxLT53cml0ZV9wdHIsIHEtPnJlYWRfcHRyKTsKKwkJCQlpZHgsIHR4cS0+d3JpdGVfcHRyLCB0eHEtPnJlYWRfcHRyKTsKIAkJCWl3bF9mb3JjZV9ubWkodHJhbnMpOwogCQl9CiAJfQogCi0JaWYgKHEtPnJlYWRfcHRyID09IHEtPndyaXRlX3B0cikgeworCWlmICh0eHEtPnJlYWRfcHRyID09IHR4cS0+d3JpdGVfcHRyKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZ0cmFuc19wY2llLT5yZWdfbG9jaywgZmxhZ3MpOwogCQlpd2xfcGNpZV9jbGVhcl9jbWRfaW5fZmxpZ2h0KHRyYW5zKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHJhbnNfcGNpZS0+cmVnX2xvY2ssIGZsYWdzKTsKQEAgLTEyNDksNiArMTMyMiw5IEBACiAJaWYgKHRlc3RfYW5kX3NldF9iaXQodHhxX2lkLCB0cmFuc19wY2llLT5xdWV1ZV91c2VkKSkKIAkJV0FSTl9PTkNFKDEsICJxdWV1ZSAlZCBhbHJlYWR5IHVzZWQgLSBleHBlY3QgaXNzdWVzIiwgdHhxX2lkKTsKIAorCWlmIChjZmcgJiYgdHJhbnMtPmNmZy0+dXNlX3RmaCkKKwkJV0FSTl9PTkNFKDEsICJFeHBlY3RlZCBubyBjYWxscyB0byBTQ0QgY29uZmlndXJhdGlvbiIpOworCiAJdHhxLT53ZF90aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyh3ZGdfdGltZW91dCk7CiAKIAlpZiAoY2ZnKSB7CkBAIC0xMjgzLDE0ICsxMzU5LDE0IEBACiAJCQkgKi8KIAkJCWl3bF9zY2RfdHhxX2Rpc2FibGVfYWdnKHRyYW5zLCB0eHFfaWQpOwogCi0JCQlzc24gPSB0eHEtPnEucmVhZF9wdHI7CisJCQlzc24gPSB0eHEtPnJlYWRfcHRyOwogCQl9CiAJfQogCiAJLyogUGxhY2UgZmlyc3QgVEZEIGF0IGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gc3RhcnQgc2VxdWVuY2UgbnVtYmVyLgogCSAqIEFzc3VtZXMgdGhhdCBzc25faWR4IGlzIHZhbGlkICghPSAweEZGRikgKi8KLQl0eHEtPnEucmVhZF9wdHIgPSAoc3NuICYgMHhmZik7Ci0JdHhxLT5xLndyaXRlX3B0ciA9IChzc24gJiAweGZmKTsKKwl0eHEtPnJlYWRfcHRyID0gKHNzbiAmIDB4ZmYpOworCXR4cS0+d3JpdGVfcHRyID0gKHNzbiAmIDB4ZmYpOwogCWl3bF93cml0ZV9kaXJlY3QzMih0cmFucywgSEJVU19UQVJHX1dSUFRSLAogCQkJICAgKHNzbiAmIDB4ZmYpIHwgKHR4cV9pZCA8PCA4KSk7CiAKQEAgLTEzNDMsNiArMTQxOSwxNCBAQAogCXR4cS0+YW1wZHUgPSAhc2hhcmVkX21vZGU7CiB9CiAKK2RtYV9hZGRyX3QgaXdsX3RyYW5zX3BjaWVfZ2V0X3R4cV9ieXRlX3RhYmxlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgdHhxKQoreworCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CisKKwlyZXR1cm4gdHJhbnNfcGNpZS0+c2NkX2JjX3RibHMuZG1hICsKKwkgICAgICAgdHhxICogc2l6ZW9mKHN0cnVjdCBpd2xhZ25fc2NkX2JjX3RibCk7Cit9CisKIHZvaWQgaXdsX3RyYW5zX3BjaWVfdHhxX2Rpc2FibGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCB0eHFfaWQsCiAJCQkJYm9vbCBjb25maWd1cmVfc2NkKQogewpAQCAtMTM2Niw2ICsxNDUwLDkgQEAKIAkJcmV0dXJuOwogCX0KIAorCWlmIChjb25maWd1cmVfc2NkICYmIHRyYW5zLT5jZmctPnVzZV90ZmgpCisJCVdBUk5fT05DRSgxLCAiRXhwZWN0ZWQgbm8gY2FsbHMgdG8gU0NEIGNvbmZpZ3VyYXRpb24iKTsKKwogCWlmIChjb25maWd1cmVfc2NkKSB7CiAJCWl3bF9zY2RfdHhxX3NldF9pbmFjdGl2ZSh0cmFucywgdHhxX2lkKTsKIApAQCAtMTM5NSw3ICsxNDgyLDYgQEAKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCXN0cnVjdCBpd2xfdHhxICp0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW3RyYW5zX3BjaWUtPmNtZF9xdWV1ZV07Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CiAJc3RydWN0IGl3bF9kZXZpY2VfY21kICpvdXRfY21kOwogCXN0cnVjdCBpd2xfY21kX21ldGEgKm91dF9tZXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xNDEwLDcgKzE0OTYsNyBAQAogCWNvbnN0IHU4ICpjbWRkYXRhW0lXTF9NQVhfQ01EX1RCU19QRVJfVEZEXTsKIAl1MTYgY21kbGVuW0lXTF9NQVhfQ01EX1RCU19QRVJfVEZEXTsKIAotCWlmIChXQVJOKCF0cmFuc19wY2llLT53aWRlX2NtZF9oZWFkZXIgJiYKKwlpZiAoV0FSTighdHJhbnMtPndpZGVfY21kX2hlYWRlciAmJgogCQkgZ3JvdXBfaWQgPiBJV0xfQUxXQVlTX0xPTkdfR1JPVVAsCiAJCSAidW5zdXBwb3J0ZWQgd2lkZSBjb21tYW5kICUjeFxuIiwgY21kLT5pZCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQ5NCw3ICsxNTgwLDcgQEAKIAogCXNwaW5fbG9ja19iaCgmdHhxLT5sb2NrKTsKIAotCWlmIChpd2xfcXVldWVfc3BhY2UocSkgPCAoKGNtZC0+ZmxhZ3MgJiBDTURfQVNZTkMpID8gMiA6IDEpKSB7CisJaWYgKGl3bF9xdWV1ZV9zcGFjZSh0eHEpIDwgKChjbWQtPmZsYWdzICYgQ01EX0FTWU5DKSA/IDIgOiAxKSkgewogCQlzcGluX3VubG9ja19iaCgmdHhxLT5sb2NrKTsKIAogCQlJV0xfRVJSKHRyYW5zLCAiTm8gc3BhY2UgaW4gY29tbWFuZCBxdWV1ZVxuIik7CkBAIC0xNTAzLDcgKzE1ODksNyBAQAogCQlnb3RvIGZyZWVfZHVwX2J1ZjsKIAl9CiAKLQlpZHggPSBnZXRfY21kX2luZGV4KHEsIHEtPndyaXRlX3B0cik7CisJaWR4ID0gZ2V0X2NtZF9pbmRleCh0eHEsIHR4cS0+d3JpdGVfcHRyKTsKIAlvdXRfY21kID0gdHhxLT5lbnRyaWVzW2lkeF0uY21kOwogCW91dF9tZXRhID0gJnR4cS0+ZW50cmllc1tpZHhdLm1ldGE7CiAKQEAgLTE1MjIsNyArMTYwOCw3IEBACiAJCW91dF9jbWQtPmhkcl93aWRlLnJlc2VydmVkID0gMDsKIAkJb3V0X2NtZC0+aGRyX3dpZGUuc2VxdWVuY2UgPQogCQkJY3B1X3RvX2xlMTYoUVVFVUVfVE9fU0VRKHRyYW5zX3BjaWUtPmNtZF9xdWV1ZSkgfAotCQkJCQkJIElOREVYX1RPX1NFUShxLT53cml0ZV9wdHIpKTsKKwkJCQkJCSBJTkRFWF9UT19TRVEodHhxLT53cml0ZV9wdHIpKTsKIAogCQljbWRfcG9zID0gc2l6ZW9mKHN0cnVjdCBpd2xfY21kX2hlYWRlcl93aWRlKTsKIAkJY29weV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpd2xfY21kX2hlYWRlcl93aWRlKTsKQEAgLTE1MzAsNyArMTYxNiw3IEBACiAJCW91dF9jbWQtPmhkci5jbWQgPSBpd2xfY21kX29wY29kZShjbWQtPmlkKTsKIAkJb3V0X2NtZC0+aGRyLnNlcXVlbmNlID0KIAkJCWNwdV90b19sZTE2KFFVRVVFX1RPX1NFUSh0cmFuc19wY2llLT5jbWRfcXVldWUpIHwKLQkJCQkJCSBJTkRFWF9UT19TRVEocS0+d3JpdGVfcHRyKSk7CisJCQkJCQkgSU5ERVhfVE9fU0VRKHR4cS0+d3JpdGVfcHRyKSk7CiAJCW91dF9jbWQtPmhkci5ncm91cF9pZCA9IDA7CiAKIAkJY21kX3BvcyA9IHNpemVvZihzdHJ1Y3QgaXdsX2NtZF9oZWFkZXIpOwpAQCAtMTU4MCw3ICsxNjY2LDcgQEAKIAkJICAgICBpd2xfZ2V0X2NtZF9zdHJpbmcodHJhbnMsIGNtZC0+aWQpLAogCQkgICAgIGdyb3VwX2lkLCBvdXRfY21kLT5oZHIuY21kLAogCQkgICAgIGxlMTZfdG9fY3B1KG91dF9jbWQtPmhkci5zZXF1ZW5jZSksCi0JCSAgICAgY21kX3NpemUsIHEtPndyaXRlX3B0ciwgaWR4LCB0cmFuc19wY2llLT5jbWRfcXVldWUpOworCQkgICAgIGNtZF9zaXplLCB0eHEtPndyaXRlX3B0ciwgaWR4LCB0cmFuc19wY2llLT5jbWRfcXVldWUpOwogCiAJLyogc3RhcnQgdGhlIFRGRCB3aXRoIHRoZSBtaW5pbXVtIGNvcHkgYnl0ZXMgKi8KIAl0YjBfc2l6ZSA9IG1pbl90KGludCwgY29weV9zaXplLCBJV0xfRklSU1RfVEJfU0laRSk7CkBAIC0xNTk2LDggKzE2ODIsOCBAQAogCQkJCQkgICBjb3B5X3NpemUgLSB0YjBfc2l6ZSwKIAkJCQkJICAgRE1BX1RPX0RFVklDRSk7CiAJCWlmIChkbWFfbWFwcGluZ19lcnJvcih0cmFucy0+ZGV2LCBwaHlzX2FkZHIpKSB7Ci0JCQlpd2xfcGNpZV90ZmRfdW5tYXAodHJhbnMsIG91dF9tZXRhLAotCQkJCQkgICAmdHhxLT50ZmRzW3EtPndyaXRlX3B0cl0pOworCQkJaXdsX3BjaWVfdGZkX3VubWFwKHRyYW5zLCBvdXRfbWV0YSwgdHhxLAorCQkJCQkgICB0eHEtPndyaXRlX3B0cik7CiAJCQlpZHggPSAtRU5PTUVNOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTE2MjAsOCArMTcwNiw4IEBACiAJCXBoeXNfYWRkciA9IGRtYV9tYXBfc2luZ2xlKHRyYW5zLT5kZXYsICh2b2lkICopZGF0YSwKIAkJCQkJICAgY21kbGVuW2ldLCBETUFfVE9fREVWSUNFKTsKIAkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHRyYW5zLT5kZXYsIHBoeXNfYWRkcikpIHsKLQkJCWl3bF9wY2llX3RmZF91bm1hcCh0cmFucywgb3V0X21ldGEsCi0JCQkJCSAgICZ0eHEtPnRmZHNbcS0+d3JpdGVfcHRyXSk7CisJCQlpd2xfcGNpZV90ZmRfdW5tYXAodHJhbnMsIG91dF9tZXRhLCB0eHEsCisJCQkJCSAgIHR4cS0+d3JpdGVfcHRyKTsKIAkJCWlkeCA9IC1FTk9NRU07CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMTYyOSw4ICsxNzE1LDcgQEAKIAkJaXdsX3BjaWVfdHhxX2J1aWxkX3RmZCh0cmFucywgdHhxLCBwaHlzX2FkZHIsIGNtZGxlbltpXSwgZmFsc2UpOwogCX0KIAotCUJVSUxEX0JVR19PTihJV0xfTlVNX09GX1RCUyArIENNRF9UQl9CSVRNQVBfUE9TID4KLQkJICAgICBzaXplb2Yob3V0X21ldGEtPmZsYWdzKSAqIEJJVFNfUEVSX0JZVEUpOworCUJVSUxEX0JVR19PTihJV0xfVEZIX05VTV9UQlMgPiBzaXplb2Yob3V0X21ldGEtPnRicykgKiBCSVRTX1BFUl9CWVRFKTsKIAlvdXRfbWV0YS0+ZmxhZ3MgPSBjbWQtPmZsYWdzOwogCWlmIChXQVJOX09OX09OQ0UodHhxLT5lbnRyaWVzW2lkeF0uZnJlZV9idWYpKQogCQlremZyZWUodHhxLT5lbnRyaWVzW2lkeF0uZnJlZV9idWYpOwpAQCAtMTYzOSw3ICsxNzI0LDcgQEAKIAl0cmFjZV9pd2x3aWZpX2Rldl9oY21kKHRyYW5zLT5kZXYsIGNtZCwgY21kX3NpemUsICZvdXRfY21kLT5oZHJfd2lkZSk7CiAKIAkvKiBzdGFydCB0aW1lciBpZiBxdWV1ZSBjdXJyZW50bHkgZW1wdHkgKi8KLQlpZiAocS0+cmVhZF9wdHIgPT0gcS0+d3JpdGVfcHRyICYmIHR4cS0+d2RfdGltZW91dCkKKwlpZiAodHhxLT5yZWFkX3B0ciA9PSB0eHEtPndyaXRlX3B0ciAmJiB0eHEtPndkX3RpbWVvdXQpCiAJCW1vZF90aW1lcigmdHhxLT5zdHVja190aW1lciwgamlmZmllcyArIHR4cS0+d2RfdGltZW91dCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdHJhbnNfcGNpZS0+cmVnX2xvY2ssIGZsYWdzKTsKQEAgLTE2NTEsNyArMTczNiw3IEBACiAJfQogCiAJLyogSW5jcmVtZW50IGFuZCB1cGRhdGUgcXVldWUncyB3cml0ZSBpbmRleCAqLwotCXEtPndyaXRlX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT53cml0ZV9wdHIpOworCXR4cS0+d3JpdGVfcHRyID0gaXdsX3F1ZXVlX2luY193cmFwKHR4cS0+d3JpdGVfcHRyKTsKIAlpd2xfcGNpZV90eHFfaW5jX3dyX3B0cih0cmFucywgdHhxKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRyYW5zX3BjaWUtPnJlZ19sb2NrLCBmbGFncyk7CkBAIC0xNjg5LDIwICsxNzc0LDIwIEBACiAJaWYgKFdBUk4odHhxX2lkICE9IHRyYW5zX3BjaWUtPmNtZF9xdWV1ZSwKIAkJICJ3cm9uZyBjb21tYW5kIHF1ZXVlICVkIChzaG91bGQgYmUgJWQpLCBzZXF1ZW5jZSAweCVYIHJlYWRwPSVkIHdyaXRlcD0lZFxuIiwKIAkJIHR4cV9pZCwgdHJhbnNfcGNpZS0+Y21kX3F1ZXVlLCBzZXF1ZW5jZSwKLQkJIHRyYW5zX3BjaWUtPnR4cVt0cmFuc19wY2llLT5jbWRfcXVldWVdLnEucmVhZF9wdHIsCi0JCSB0cmFuc19wY2llLT50eHFbdHJhbnNfcGNpZS0+Y21kX3F1ZXVlXS5xLndyaXRlX3B0cikpIHsKKwkJIHRyYW5zX3BjaWUtPnR4cVt0cmFuc19wY2llLT5jbWRfcXVldWVdLnJlYWRfcHRyLAorCQkgdHJhbnNfcGNpZS0+dHhxW3RyYW5zX3BjaWUtPmNtZF9xdWV1ZV0ud3JpdGVfcHRyKSkgewogCQlpd2xfcHJpbnRfaGV4X2Vycm9yKHRyYW5zLCBwa3QsIDMyKTsKIAkJcmV0dXJuOwogCX0KIAogCXNwaW5fbG9ja19iaCgmdHhxLT5sb2NrKTsKIAotCWNtZF9pbmRleCA9IGdldF9jbWRfaW5kZXgoJnR4cS0+cSwgaW5kZXgpOworCWNtZF9pbmRleCA9IGdldF9jbWRfaW5kZXgodHhxLCBpbmRleCk7CiAJY21kID0gdHhxLT5lbnRyaWVzW2NtZF9pbmRleF0uY21kOwogCW1ldGEgPSAmdHhxLT5lbnRyaWVzW2NtZF9pbmRleF0ubWV0YTsKIAljbWRfaWQgPSBpd2xfY21kX2lkKGNtZC0+aGRyLmNtZCwgZ3JvdXBfaWQsIDApOwogCi0JaXdsX3BjaWVfdGZkX3VubWFwKHRyYW5zLCBtZXRhLCAmdHhxLT50ZmRzW2luZGV4XSk7CisJaXdsX3BjaWVfdGZkX3VubWFwKHRyYW5zLCBtZXRhLCB0eHEsIGluZGV4KTsKIAogCS8qIElucHV0IGVycm9yIGNoZWNraW5nIGlzIGRvbmUgd2hlbiBjb21tYW5kcyBhcmUgYWRkZWQgdG8gcXVldWUuICovCiAJaWYgKG1ldGEtPmZsYWdzICYgQ01EX1dBTlRfU0tCKSB7CkBAIC0xODE1LDE0ICsxOTAwLDEzIEBACiAJCQkJIEhPU1RfQ09NUExFVEVfVElNRU9VVCk7CiAJaWYgKCFyZXQpIHsKIAkJc3RydWN0IGl3bF90eHEgKnR4cSA9ICZ0cmFuc19wY2llLT50eHFbdHJhbnNfcGNpZS0+Y21kX3F1ZXVlXTsKLQkJc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CiAKIAkJSVdMX0VSUih0cmFucywgIkVycm9yIHNlbmRpbmcgJXM6IHRpbWUgb3V0IGFmdGVyICVkbXMuXG4iLAogCQkJaXdsX2dldF9jbWRfc3RyaW5nKHRyYW5zLCBjbWQtPmlkKSwKIAkJCWppZmZpZXNfdG9fbXNlY3MoSE9TVF9DT01QTEVURV9USU1FT1VUKSk7CiAKIAkJSVdMX0VSUih0cmFucywgIkN1cnJlbnQgQ01EIHF1ZXVlIHJlYWRfcHRyICVkIHdyaXRlX3B0ciAlZFxuIiwKLQkJCXEtPnJlYWRfcHRyLCBxLT53cml0ZV9wdHIpOworCQkJdHhxLT5yZWFkX3B0ciwgdHhxLT53cml0ZV9wdHIpOwogCiAJCWNsZWFyX2JpdChTVEFUVVNfU1lOQ19IQ01EX0FDVElWRSwgJnRyYW5zLT5zdGF0dXMpOwogCQlJV0xfREVCVUdfSU5GTyh0cmFucywgIkNsZWFyaW5nIEhDTURfQUNUSVZFIGZvciBjb21tYW5kICVzXG4iLApAQCAtMTkwMCw3ICsxOTg0LDcgQEAKIAkJCSAgICAgc3RydWN0IGl3bF9jbWRfbWV0YSAqb3V0X21ldGEsCiAJCQkgICAgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqZGV2X2NtZCwgdTE2IHRiMV9sZW4pCiB7Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CisJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKIAl1MTYgdGIyX2xlbjsKIAlpbnQgaTsKIApAQCAtMTkxNSw4ICsxOTk5LDggQEAKIAkJCQkJCSAgICAgc2tiLT5kYXRhICsgaGRyX2xlbiwKIAkJCQkJCSAgICAgdGIyX2xlbiwgRE1BX1RPX0RFVklDRSk7CiAJCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcih0cmFucy0+ZGV2LCB0YjJfcGh5cykpKSB7Ci0JCQlpd2xfcGNpZV90ZmRfdW5tYXAodHJhbnMsIG91dF9tZXRhLAotCQkJCQkgICAmdHhxLT50ZmRzW3EtPndyaXRlX3B0cl0pOworCQkJaXdsX3BjaWVfdGZkX3VubWFwKHRyYW5zLCBvdXRfbWV0YSwgdHhxLAorCQkJCQkgICB0eHEtPndyaXRlX3B0cik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpd2xfcGNpZV90eHFfYnVpbGRfdGZkKHRyYW5zLCB0eHEsIHRiMl9waHlzLCB0YjJfbGVuLCBmYWxzZSk7CkBAIC0xOTM1LDE5ICsyMDE5LDE5IEBACiAJCQkJCSAgIHNrYl9mcmFnX3NpemUoZnJhZyksIERNQV9UT19ERVZJQ0UpOwogCiAJCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcih0cmFucy0+ZGV2LCB0Yl9waHlzKSkpIHsKLQkJCWl3bF9wY2llX3RmZF91bm1hcCh0cmFucywgb3V0X21ldGEsCi0JCQkJCSAgICZ0eHEtPnRmZHNbcS0+d3JpdGVfcHRyXSk7CisJCQlpd2xfcGNpZV90ZmRfdW5tYXAodHJhbnMsIG91dF9tZXRhLCB0eHEsCisJCQkJCSAgIHR4cS0+d3JpdGVfcHRyKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCXRiX2lkeCA9IGl3bF9wY2llX3R4cV9idWlsZF90ZmQodHJhbnMsIHR4cSwgdGJfcGh5cywKIAkJCQkJCXNrYl9mcmFnX3NpemUoZnJhZyksIGZhbHNlKTsKIAotCQlvdXRfbWV0YS0+ZmxhZ3MgfD0gQklUKHRiX2lkeCArIENNRF9UQl9CSVRNQVBfUE9TKTsKKwkJb3V0X21ldGEtPnRicyB8PSBCSVQodGJfaWR4KTsKIAl9CiAKIAl0cmFjZV9pd2x3aWZpX2Rldl90eCh0cmFucy0+ZGV2LCBza2IsCi0JCQkgICAgICZ0eHEtPnRmZHNbdHhxLT5xLndyaXRlX3B0cl0sCi0JCQkgICAgIHNpemVvZihzdHJ1Y3QgaXdsX3RmZCksCisJCQkgICAgIGl3bF9wY2llX2dldF90ZmQodHJhbnNfcGNpZSwgdHhxLCB0eHEtPndyaXRlX3B0ciksCisJCQkgICAgIHRyYW5zX3BjaWUtPnRmZF9zaXplLAogCQkJICAgICAmZGV2X2NtZC0+aGRyLCBJV0xfRklSU1RfVEJfU0laRSArIHRiMV9sZW4sCiAJCQkgICAgIHNrYi0+ZGF0YSArIGhkcl9sZW4sIHRiMl9sZW4pOwogCXRyYWNlX2l3bHdpZmlfZGV2X3R4X2RhdGEodHJhbnMtPmRldiwgc2tiLApAQCAtMjAwOCw3ICsyMDkyLDYgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHZvaWQgKilza2ItPmRhdGE7CiAJdW5zaWduZWQgaW50IHNuYXBfaXBfdGNwX2hkcmxlbiwgaXBfaGRybGVuLCB0b3RhbF9sZW4sIGhkcl9yb29tOwogCXVuc2lnbmVkIGludCBtc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwogCXUxNiBsZW5ndGgsIGl2X2xlbiwgYW1zZHVfcGFkOwogCXU4ICpzdGFydF9oZHI7CiAJc3RydWN0IGl3bF90c29faGRyX3BhZ2UgKmhkcl9wYWdlOwpAQCAtMjAyMiw4ICsyMTA1LDggQEAKIAkJSUVFRTgwMjExX0NDTVBfSERSX0xFTiA6IDA7CiAKIAl0cmFjZV9pd2x3aWZpX2Rldl90eCh0cmFucy0+ZGV2LCBza2IsCi0JCQkgICAgICZ0eHEtPnRmZHNbdHhxLT5xLndyaXRlX3B0cl0sCi0JCQkgICAgIHNpemVvZihzdHJ1Y3QgaXdsX3RmZCksCisJCQkgICAgIGl3bF9wY2llX2dldF90ZmQodHJhbnNfcGNpZSwgdHhxLCB0eHEtPndyaXRlX3B0ciksCisJCQkgICAgIHRyYW5zX3BjaWUtPnRmZF9zaXplLAogCQkJICAgICAmZGV2X2NtZC0+aGRyLCBJV0xfRklSU1RfVEJfU0laRSArIHRiMV9sZW4sCiAJCQkgICAgIE5VTEwsIDApOwogCkBAIC0yMTc5LDcgKzIyNjIsNyBAQAogCXJldHVybiAwOwogCiBvdXRfdW5tYXA6Ci0JaXdsX3BjaWVfdGZkX3VubWFwKHRyYW5zLCBvdXRfbWV0YSwgJnR4cS0+dGZkc1txLT53cml0ZV9wdHJdKTsKKwlpd2xfcGNpZV90ZmRfdW5tYXAodHJhbnMsIG91dF9tZXRhLCB0eHEsIHR4cS0+d3JpdGVfcHRyKTsKIAlyZXR1cm4gcmV0OwogfQogI2Vsc2UgLyogQ09ORklHX0lORVQgKi8KQEAgLTIyMDMsOSArMjI4Niw5IEBACiAJc3RydWN0IGl3bF90eF9jbWQgKnR4X2NtZCA9IChzdHJ1Y3QgaXdsX3R4X2NtZCAqKWRldl9jbWQtPnBheWxvYWQ7CiAJc3RydWN0IGl3bF9jbWRfbWV0YSAqb3V0X21ldGE7CiAJc3RydWN0IGl3bF90eHEgKnR4cTsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxOwogCWRtYV9hZGRyX3QgdGIwX3BoeXMsIHRiMV9waHlzLCBzY3JhdGNoX3BoeXM7CiAJdm9pZCAqdGIxX2FkZHI7CisJdm9pZCAqdGZkOwogCXUxNiBsZW4sIHRiMV9sZW47CiAJYm9vbCB3YWl0X3dyaXRlX3B0cjsKIAlfX2xlMTYgZmM7CkBAIC0yMjE0LDcgKzIyOTcsNiBAQAogCWJvb2wgYW1zZHU7CiAKIAl0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF07Ci0JcSA9ICZ0eHEtPnE7CiAKIAlpZiAoV0FSTl9PTkNFKCF0ZXN0X2JpdCh0eHFfaWQsIHRyYW5zX3BjaWUtPnF1ZXVlX3VzZWQpLAogCQkgICAgICAiVFggb24gdW51c2VkIHF1ZXVlICVkXG4iLCB0eHFfaWQpKQpAQCAtMjIzNiw3ICsyMzE4LDcgQEAKIAl9CiAKIAlpZiAoc2tiX2lzX25vbmxpbmVhcihza2IpICYmCi0JICAgIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPiBJV0xfUENJRV9NQVhfRlJBR1MgJiYKKwkgICAgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA+IElXTF9QQ0lFX01BWF9GUkFHUyh0cmFuc19wY2llKSAmJgogCSAgICBfX3NrYl9saW5lYXJpemUoc2tiKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTIyNDksMTEgKzIzMzEsMTEgQEAKIAogCXNwaW5fbG9jaygmdHhxLT5sb2NrKTsKIAotCWlmIChpd2xfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmspIHsKKwlpZiAoaXdsX3F1ZXVlX3NwYWNlKHR4cSkgPCB0eHEtPmhpZ2hfbWFyaykgewogCQlpd2xfc3RvcF9xdWV1ZSh0cmFucywgdHhxKTsKIAogCQkvKiBkb24ndCBwdXQgdGhlIHBhY2tldCBvbiB0aGUgcmluZywgaWYgdGhlcmUgaXMgbm8gcm9vbSAqLwotCQlpZiAodW5saWtlbHkoaXdsX3F1ZXVlX3NwYWNlKHEpIDwgMykpIHsKKwkJaWYgKHVubGlrZWx5KGl3bF9xdWV1ZV9zcGFjZSh0eHEpIDwgMykpIHsKIAkJCXN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqKmRldl9jbWRfcHRyOwogCiAJCQlkZXZfY21kX3B0ciA9ICh2b2lkICopKCh1OCAqKXNrYi0+Y2IgKwpAQCAtMjI3NCwxOSArMjM1NiwxOSBAQAogCSAqLwogCXdpZmlfc2VxID0gSUVFRTgwMjExX1NFUV9UT19TTihsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSk7CiAJV0FSTl9PTkNFKHR4cS0+YW1wZHUgJiYKLQkJICAod2lmaV9zZXEgJiAweGZmKSAhPSBxLT53cml0ZV9wdHIsCisJCSAgKHdpZmlfc2VxICYgMHhmZikgIT0gdHhxLT53cml0ZV9wdHIsCiAJCSAgIlE6ICVkIFdpRmkgU2VxICVkIHRmZE51bSAlZCIsCi0JCSAgdHhxX2lkLCB3aWZpX3NlcSwgcS0+d3JpdGVfcHRyKTsKKwkJICB0eHFfaWQsIHdpZmlfc2VxLCB0eHEtPndyaXRlX3B0cik7CiAKIAkvKiBTZXQgdXAgZHJpdmVyIGRhdGEgZm9yIHRoaXMgVEZEICovCi0JdHhxLT5lbnRyaWVzW3EtPndyaXRlX3B0cl0uc2tiID0gc2tiOwotCXR4cS0+ZW50cmllc1txLT53cml0ZV9wdHJdLmNtZCA9IGRldl9jbWQ7CisJdHhxLT5lbnRyaWVzW3R4cS0+d3JpdGVfcHRyXS5za2IgPSBza2I7CisJdHhxLT5lbnRyaWVzW3R4cS0+d3JpdGVfcHRyXS5jbWQgPSBkZXZfY21kOwogCiAJZGV2X2NtZC0+aGRyLnNlcXVlbmNlID0KIAkJY3B1X3RvX2xlMTYoKHUxNikoUVVFVUVfVE9fU0VRKHR4cV9pZCkgfAotCQkJICAgIElOREVYX1RPX1NFUShxLT53cml0ZV9wdHIpKSk7CisJCQkgICAgSU5ERVhfVE9fU0VRKHR4cS0+d3JpdGVfcHRyKSkpOwogCi0JdGIwX3BoeXMgPSBpd2xfcGNpZV9nZXRfZmlyc3RfdGJfZG1hKHR4cSwgcS0+d3JpdGVfcHRyKTsKKwl0YjBfcGh5cyA9IGl3bF9wY2llX2dldF9maXJzdF90Yl9kbWEodHhxLCB0eHEtPndyaXRlX3B0cik7CiAJc2NyYXRjaF9waHlzID0gdGIwX3BoeXMgKyBzaXplb2Yoc3RydWN0IGl3bF9jbWRfaGVhZGVyKSArCiAJCSAgICAgICBvZmZzZXRvZihzdHJ1Y3QgaXdsX3R4X2NtZCwgc2NyYXRjaCk7CiAKQEAgLTIyOTQsNyArMjM3Niw3IEBACiAJdHhfY21kLT5kcmFtX21zYl9wdHIgPSBpd2xfZ2V0X2RtYV9oaV9hZGRyKHNjcmF0Y2hfcGh5cyk7CiAKIAkvKiBTZXQgdXAgZmlyc3QgZW1wdHkgZW50cnkgaW4gcXVldWUncyBhcnJheSBvZiBUeC9jbWQgYnVmZmVycyAqLwotCW91dF9tZXRhID0gJnR4cS0+ZW50cmllc1txLT53cml0ZV9wdHJdLm1ldGE7CisJb3V0X21ldGEgPSAmdHhxLT5lbnRyaWVzW3R4cS0+d3JpdGVfcHRyXS5tZXRhOwogCW91dF9tZXRhLT5mbGFncyA9IDA7CiAKIAkvKgpAQCAtMjMxOSw3ICsyNDAxLDcgQEAKIAl9CiAKIAkvKiBUaGUgZmlyc3QgVEIgcG9pbnRzIHRvIGJpLWRpcmVjdGlvbmFsIERNQSBkYXRhICovCi0JbWVtY3B5KCZ0eHEtPmZpcnN0X3RiX2J1ZnNbcS0+d3JpdGVfcHRyXSwgJmRldl9jbWQtPmhkciwKKwltZW1jcHkoJnR4cS0+Zmlyc3RfdGJfYnVmc1t0eHEtPndyaXRlX3B0cl0sICZkZXZfY21kLT5oZHIsCiAJICAgICAgIElXTF9GSVJTVF9UQl9TSVpFKTsKIAlpd2xfcGNpZV90eHFfYnVpbGRfdGZkKHRyYW5zLCB0eHEsIHRiMF9waHlzLAogCQkJICAgICAgIElXTF9GSVJTVF9UQl9TSVpFLCB0cnVlKTsKQEAgLTIzNDQsMTMgKzI0MjYsMTUgQEAKIAkJZ290byBvdXRfZXJyOwogCX0KIAorCXRmZCA9IGl3bF9wY2llX2dldF90ZmQodHJhbnNfcGNpZSwgdHhxLCB0eHEtPndyaXRlX3B0cik7CiAJLyogU2V0IHVwIGVudHJ5IGZvciB0aGlzIFRGRCBpbiBUeCBieXRlLWNvdW50IGFycmF5ICovCi0JaXdsX3BjaWVfdHhxX3VwZGF0ZV9ieXRlX2NudF90YmwodHJhbnMsIHR4cSwgbGUxNl90b19jcHUodHhfY21kLT5sZW4pKTsKKwlpd2xfcGNpZV90eHFfdXBkYXRlX2J5dGVfY250X3RibCh0cmFucywgdHhxLCBsZTE2X3RvX2NwdSh0eF9jbWQtPmxlbiksCisJCQkJCSBpd2xfcGNpZV90ZmRfZ2V0X251bV90YnModHJhbnMsIHRmZCkpOwogCiAJd2FpdF93cml0ZV9wdHIgPSBpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYyk7CiAKIAkvKiBzdGFydCB0aW1lciBpZiBxdWV1ZSBjdXJyZW50bHkgZW1wdHkgKi8KLQlpZiAocS0+cmVhZF9wdHIgPT0gcS0+d3JpdGVfcHRyKSB7CisJaWYgKHR4cS0+cmVhZF9wdHIgPT0gdHhxLT53cml0ZV9wdHIpIHsKIAkJaWYgKHR4cS0+d2RfdGltZW91dCkgewogCQkJLyoKIAkJCSAqIElmIHRoZSBUWFEgaXMgYWN0aXZlLCB0aGVuIHNldCB0aGUgdGltZXIsIGlmIG5vdCwKQEAgLTIzNjQsMTIgKzI0NDgsMTIgQEAKIAkJCWVsc2UKIAkJCQl0eHEtPmZyb3plbl9leHBpcnlfcmVtYWluZGVyID0gdHhxLT53ZF90aW1lb3V0OwogCQl9Ci0JCUlXTF9ERUJVR19SUE0odHJhbnMsICJROiAlZCBmaXJzdCB0eCAtIHRha2UgcmVmXG4iLCBxLT5pZCk7CisJCUlXTF9ERUJVR19SUE0odHJhbnMsICJROiAlZCBmaXJzdCB0eCAtIHRha2UgcmVmXG4iLCB0eHEtPmlkKTsKIAkJaXdsX3RyYW5zX3JlZih0cmFucyk7CiAJfQogCiAJLyogVGVsbCBkZXZpY2UgdGhlIHdyaXRlIGluZGV4ICpqdXN0IHBhc3QqIHRoaXMgbGF0ZXN0IGZpbGxlZCBURkQgKi8KLQlxLT53cml0ZV9wdHIgPSBpd2xfcXVldWVfaW5jX3dyYXAocS0+d3JpdGVfcHRyKTsKKwl0eHEtPndyaXRlX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcCh0eHEtPndyaXRlX3B0cik7CiAJaWYgKCF3YWl0X3dyaXRlX3B0cikKIAkJaXdsX3BjaWVfdHhxX2luY193cl9wdHIodHJhbnMsIHR4cSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVyc2lsL2hvc3RhcC9ob3N0YXBfaW9jdGwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVyc2lsL2hvc3RhcC9ob3N0YXBfaW9jdGwuYwppbmRleCAzZTVmYTc4Li5hNTY1NmJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlcnNpbC9ob3N0YXAvaG9zdGFwX2lvY3RsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZXJzaWwvaG9zdGFwL2hvc3RhcF9pb2N0bC5jCkBAIC0zMDQxLDEzICszMDQxLDkgQEAKIAkgICAgcC0+bGVuZ3RoID4gMTAyNCB8fCAhcC0+cG9pbnRlcikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwYXJhbSA9IGttYWxsb2MocC0+bGVuZ3RoLCBHRlBfS0VSTkVMKTsKLQlpZiAocGFyYW0gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIocGFyYW0sIHAtPnBvaW50ZXIsIHAtPmxlbmd0aCkpIHsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBvdXQ7CisJcGFyYW0gPSBtZW1kdXBfdXNlcihwLT5wb2ludGVyLCBwLT5sZW5ndGgpOworCWlmIChJU19FUlIocGFyYW0pKSB7CisJCXJldHVybiBQVFJfRVJSKHBhcmFtKTsKIAl9CiAKIAlpZiAocC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBwcmlzbTJfZG93bmxvYWRfcGFyYW0pICsKQEAgLTM4MDMsMTMgKzM3OTksOSBAQAogCSAgICBwLT5sZW5ndGggPiBQUklTTTJfSE9TVEFQRF9NQVhfQlVGX1NJWkUgfHwgIXAtPnBvaW50ZXIpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcGFyYW0gPSBrbWFsbG9jKHAtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBhcmFtID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtLCBwLT5wb2ludGVyLCBwLT5sZW5ndGgpKSB7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gb3V0OworCXBhcmFtID0gbWVtZHVwX3VzZXIocC0+cG9pbnRlciwgcC0+bGVuZ3RoKTsKKwlpZiAoSVNfRVJSKHBhcmFtKSkgeworCQlyZXR1cm4gUFRSX0VSUihwYXJhbSk7CiAJfQogCiAJc3dpdGNoIChwYXJhbS0+Y21kKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlcnNpbC9vcmlub2NvL29yaW5vY29fdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlcnNpbC9vcmlub2NvL29yaW5vY29fdXNiLmMKaW5kZXggNTZmMTA5Yi4uYmNhNjkzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZXJzaWwvb3Jpbm9jby9vcmlub2NvX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVyc2lsL29yaW5vY28vb3Jpbm9jb191c2IuYwpAQCAtMTYxMywxMCArMTYxMyw4IEBACiAJCQl9CiAKIAkJCXVwcml2LT5yZWFkX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIXVwcml2LT5yZWFkX3VyYikgewotCQkJCWVycigiTm8gZnJlZSB1cmJzIGF2YWlsYWJsZSIpOworCQkJaWYgKCF1cHJpdi0+cmVhZF91cmIpCiAJCQkJZ290byBlcnJvcjsKLQkJCX0KIAkJCWlmIChsZTE2X3RvX2NwdShlcC0+d01heFBhY2tldFNpemUpICE9IDY0KQogCQkJCXByX3dhcm4oImJ1bGsgaW46IHdNYXhQYWNrZXRTaXplIT0gNjRcbiIpOwogCQkJaWYgKGVwLT5iRW5kcG9pbnRBZGRyZXNzICE9ICgyIHwgVVNCX0RJUl9JTikpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFjODAyMTFfaHdzaW0uYwppbmRleCA4YzM1YWM4Li40MzFmMTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hYzgwMjExX2h3c2ltLmMKQEAgLTQ4Nyw3ICs0ODcsNyBAQAogfTsKIAogc3RhdGljIHNwaW5sb2NrX3QgaHdzaW1fcmFkaW9fbG9jazsKLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGh3c2ltX3JhZGlvczsKK3N0YXRpYyBMSVNUX0hFQUQoaHdzaW1fcmFkaW9zKTsKIHN0YXRpYyBpbnQgaHdzaW1fcmFkaW9faWR4OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtYWM4MDIxMV9od3NpbV9kcml2ZXIgPSB7CkBAIC0zMzc2LDcgKzMzNzYsNiBAQAogCQltYWM4MDIxMV9od3NpbV91bmFzc2lnbl92aWZfY2hhbmN0eDsKIAogCXNwaW5fbG9ja19pbml0KCZod3NpbV9yYWRpb19sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmaHdzaW1fcmFkaW9zKTsKIAogCWVyciA9IHJlZ2lzdGVyX3Blcm5ldF9kZXZpY2UoJmh3c2ltX25ldF9vcHMpOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL2xpYmVydGFzX3RmL2lmX3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9saWJlcnRhc190Zi9pZl91c2IuYwppbmRleCA3OTlhMmVmLi5lMGFkZTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL2xpYmVydGFzX3RmL2lmX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbGliZXJ0YXNfdGYvaWZfdXNiLmMKQEAgLTE5OCwyMiArMTk4LDE2IEBACiAJfQogCiAJY2FyZHAtPnJ4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjYXJkcC0+cnhfdXJiKSB7Ci0JCWxidGZfZGViX3VzYmQoJnVkZXYtPmRldiwgIlJ4IFVSQiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJaWYgKCFjYXJkcC0+cnhfdXJiKQogCQlnb3RvIGRlYWxsb2M7Ci0JfQogCiAJY2FyZHAtPnR4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjYXJkcC0+dHhfdXJiKSB7Ci0JCWxidGZfZGViX3VzYmQoJnVkZXYtPmRldiwgIlR4IFVSQiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJaWYgKCFjYXJkcC0+dHhfdXJiKQogCQlnb3RvIGRlYWxsb2M7Ci0JfQogCiAJY2FyZHAtPmNtZF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghY2FyZHAtPmNtZF91cmIpIHsKLQkJbGJ0Zl9kZWJfdXNiZCgmdWRldi0+ZGV2LCAiQ21kIFVSQiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJaWYgKCFjYXJkcC0+Y21kX3VyYikKIAkJZ290byBkZWFsbG9jOwotCX0KIAogCWNhcmRwLT5lcF9vdXRfYnVmID0ga21hbGxvYyhNUlZEUlZfRVRIX1RYX1BBQ0tFVF9CVUZGRVJfU0laRSwKIAkJCQkgICAgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFoLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFoLmMKaW5kZXggODFjNjBkMC4uNDNkY2NkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExaC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMWguYwpAQCAtMjYwLDIyICsyNjAsMTcgQEAKIAogCXJkcl9ldmVudCA9ICh2b2lkICopKHNrYi0+ZGF0YSArIHNpemVvZih1MzIpKTsKIAotCWlmIChsZTMyX3RvX2NwdShyZHJfZXZlbnQtPnBhc3NlZCkpIHsKLQkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgTVNHLAotCQkJICAgICJyYWRhciBkZXRlY3RlZDsgaW5kaWNhdGluZyBrZXJuZWxcbiIpOwotCQlpZiAobXdpZmlleF9zdG9wX3JhZGFyX2RldGVjdGlvbihwcml2LCAmcHJpdi0+ZGZzX2NoYW5kZWYpKQotCQkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgRVJST1IsCi0JCQkJICAgICJGYWlsZWQgdG8gc3RvcCBDQUMgaW4gRldcbiIpOwotCQljZmc4MDIxMV9yYWRhcl9ldmVudChwcml2LT5hZGFwdGVyLT53aXBoeSwgJnByaXYtPmRmc19jaGFuZGVmLAotCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIE1TRywgInJlZ2RvbWFpbjogJWRcbiIsCi0JCQkgICAgcmRyX2V2ZW50LT5yZWdfZG9tYWluKTsKLQkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgTVNHLCAicmFkYXIgZGV0ZWN0aW9uIHR5cGU6ICVkXG4iLAotCQkJICAgIHJkcl9ldmVudC0+ZGV0X3R5cGUpOwotCX0gZWxzZSB7Ci0JCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIE1TRywKLQkJCSAgICAiZmFsc2UgcmFkYXIgZGV0ZWN0aW9uIGV2ZW50IVxuIik7Ci0JfQorCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIE1TRywKKwkJICAgICJyYWRhciBkZXRlY3RlZDsgaW5kaWNhdGluZyBrZXJuZWxcbiIpOworCWlmIChtd2lmaWV4X3N0b3BfcmFkYXJfZGV0ZWN0aW9uKHByaXYsICZwcml2LT5kZnNfY2hhbmRlZikpCisJCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIEVSUk9SLAorCQkJICAgICJGYWlsZWQgdG8gc3RvcCBDQUMgaW4gRldcbiIpOworCWNmZzgwMjExX3JhZGFyX2V2ZW50KHByaXYtPmFkYXB0ZXItPndpcGh5LCAmcHJpdi0+ZGZzX2NoYW5kZWYsCisJCQkgICAgIEdGUF9LRVJORUwpOworCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIE1TRywgInJlZ2RvbWFpbjogJWRcbiIsCisJCSAgICByZHJfZXZlbnQtPnJlZ19kb21haW4pOworCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIE1TRywgInJhZGFyIGRldGVjdGlvbiB0eXBlOiAlZFxuIiwKKwkJICAgIHJkcl9ldmVudC0+ZGV0X3R5cGUpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuLmgKaW5kZXggYWZkZDU4YS4uZWEwZmE2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMW4uaApAQCAtMTcxLDkgKzE3MSwxMCBAQAogc3RhdGljIGlubGluZSBpbnQgbXdpZmlleF9pc19zdGFfMTFuX2VuYWJsZWQoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJCQkJICAgICBzdHJ1Y3QgbXdpZmlleF9zdGFfbm9kZSAqbm9kZSkKIHsKLQotCWlmICghbm9kZSB8fCAocHJpdi0+YnNzX3JvbGUgIT0gTVdJRklFWF9CU1NfUk9MRV9VQVApIHx8Ci0JICAgICFwcml2LT5hcF8xMW5fZW5hYmxlZCkKKwlpZiAoIW5vZGUgfHwgKChwcml2LT5ic3Nfcm9sZSA9PSBNV0lGSUVYX0JTU19ST0xFX1VBUCkgJiYKKwkJICAgICAgIXByaXYtPmFwXzExbl9lbmFibGVkKSB8fAorCSAgICAoKHByaXYtPmJzc19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSAmJgorCSAgICAgIXByaXYtPmFkYXB0ZXItPmFkaG9jXzExbl9lbmFibGVkKSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gbm9kZS0+aXNfMTFuX2VuYWJsZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuX2FnZ3IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMW5fYWdnci5jCmluZGV4IGRjNDljM2QuLmM0N2Q2MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMW5fYWdnci5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMW5fYWdnci5jCkBAIC0yMDUsNyArMjA1LDggQEAKIAogCWRvIHsKIAkJLyogQ2hlY2sgaWYgQU1TRFUgY2FuIGFjY29tbW9kYXRlIHRoaXMgTVNEVSAqLwotCQlpZiAoc2tiX3RhaWxyb29tKHNrYl9hZ2dyKSA8IChza2Jfc3JjLT5sZW4gKyBMTENfU05BUF9MRU4pKQorCQlpZiAoKHNrYl9hZ2dyLT5sZW4gKyBza2Jfc3JjLT5sZW4gKyBMTENfU05BUF9MRU4pID4KKwkJICAgIGFkYXB0ZXItPnR4X2J1Zl9zaXplKQogCQkJYnJlYWs7CiAKIAkJc2tiX3NyYyA9IHNrYl9kZXF1ZXVlKCZwcmFfbGlzdC0+c2tiX2hlYWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExbl9yeHJlb3JkZXIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMW5fcnhyZW9yZGVyLmMKaW5kZXggYTc0Y2M0My4uOTQ0ODAxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExbl9yeHJlb3JkZXIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuX3J4cmVvcmRlci5jCkBAIC03OCw4ICs3OCwxNSBAQAogICovCiBzdGF0aWMgaW50IG13aWZpZXhfMTFuX2Rpc3BhdGNoX3BrdChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCB2b2lkICpwYXlsb2FkKQogewotCWludCByZXQgPSBtd2lmaWV4XzExbl9kaXNwYXRjaF9hbXNkdV9wa3QocHJpdiwgcGF5bG9hZCk7CiAKKwlpbnQgcmV0OworCisJaWYgKCFwYXlsb2FkKSB7CisJCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIElORk8sICJpbmZvOiBmdyBkcm9wIGRhdGFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBtd2lmaWV4XzExbl9kaXNwYXRjaF9hbXNkdV9wa3QocHJpdiwgcGF5bG9hZCk7CiAJaWYgKCFyZXQpCiAJCXJldHVybiAwOwogCkBAIC05MjEsMyArOTI4LDcyIEBACiAJZWxzZQogCQltd2lmaWV4X3VwZGF0ZV9hbXBkdV9yeHdpbnNpemUoYWRhcHRlciwgZmFsc2UpOwogfQorCisvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcnhiYV9zeW5jIGV2ZW50CisgKi8KK3ZvaWQgbXdpZmlleF8xMW5fcnhiYV9zeW5jX2V2ZW50KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCisJCQkJIHU4ICpldmVudF9idWYsIHUxNiBsZW4pCit7CisJc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfcnhiYV9zeW5jICp0bHZfcnhiYSA9ICh2b2lkICopZXZlbnRfYnVmOworCXUxNiB0bHZfdHlwZSwgdGx2X2xlbjsKKwlzdHJ1Y3QgbXdpZmlleF9yeF9yZW9yZGVyX3RibCAqcnhfcmVvcl90YmxfcHRyOworCXU4IGksIGo7CisJdTE2IHNlcV9udW0sIHRsdl9zZXFfbnVtLCB0bHZfYml0bWFwX2xlbjsKKwlpbnQgdGx2X2J1Zl9sZWZ0ID0gbGVuOworCWludCByZXQ7CisJdTggKnRtcDsKKworCW13aWZpZXhfZGJnX2R1bXAocHJpdi0+YWRhcHRlciwgRVZUX0QsICJSWEJBX1NZTkMgZXZlbnQ6IiwKKwkJCSBldmVudF9idWYsIGxlbik7CisJd2hpbGUgKHRsdl9idWZfbGVmdCA+PSBzaXplb2YoKnRsdl9yeGJhKSkgeworCQl0bHZfdHlwZSA9IGxlMTZfdG9fY3B1KHRsdl9yeGJhLT5oZWFkZXIudHlwZSk7CisJCXRsdl9sZW4gID0gbGUxNl90b19jcHUodGx2X3J4YmEtPmhlYWRlci5sZW4pOworCQlpZiAodGx2X3R5cGUgIT0gVExWX1RZUEVfUlhCQV9TWU5DKSB7CisJCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBFUlJPUiwKKwkJCQkgICAgIldyb25nIFRMViBpZD0weCV4XG4iLCB0bHZfdHlwZSk7CisJCQlyZXR1cm47CisJCX0KKworCQl0bHZfc2VxX251bSA9IGxlMTZfdG9fY3B1KHRsdl9yeGJhLT5zZXFfbnVtKTsKKwkJdGx2X2JpdG1hcF9sZW4gPSBsZTE2X3RvX2NwdSh0bHZfcnhiYS0+Yml0bWFwX2xlbik7CisJCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIElORk8sCisJCQkgICAgIiVwTSB0aWQ9JWQgc2VxX251bT0lZCBiaXRtYXBfbGVuPSVkXG4iLAorCQkJICAgIHRsdl9yeGJhLT5tYWMsIHRsdl9yeGJhLT50aWQsIHRsdl9zZXFfbnVtLAorCQkJICAgIHRsdl9iaXRtYXBfbGVuKTsKKworCQlyeF9yZW9yX3RibF9wdHIgPQorCQkJbXdpZmlleF8xMW5fZ2V0X3J4X3Jlb3JkZXJfdGJsKHByaXYsIHRsdl9yeGJhLT50aWQsCisJCQkJCQkgICAgICAgdGx2X3J4YmEtPm1hYyk7CisJCWlmICghcnhfcmVvcl90YmxfcHRyKSB7CisJCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBFUlJPUiwKKwkJCQkgICAgIkNhbiBub3QgZmluZCByeF9yZW9yZGVyX3RibCEiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCB0bHZfYml0bWFwX2xlbjsgaSsrKSB7CisJCQlmb3IgKGogPSAwIDsgaiA8IDg7IGorKykgeworCQkJCWlmICh0bHZfcnhiYS0+Yml0bWFwW2ldICYgKDEgPDwgaikpIHsKKwkJCQkJc2VxX251bSA9IChNQVhfVElEX1ZBTFVFIC0gMSkgJgorCQkJCQkJKHRsdl9zZXFfbnVtICsgaSAqIDggKyBqKTsKKworCQkJCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBFUlJPUiwKKwkJCQkJCSAgICAiZHJvcCBwYWNrZXQsc2VxPSVkXG4iLAorCQkJCQkJICAgIHNlcV9udW0pOworCisJCQkJCXJldCA9IG13aWZpZXhfMTFuX3J4X3Jlb3JkZXJfcGt0CisJCQkJCShwcml2LCBzZXFfbnVtLCB0bHZfcnhiYS0+dGlkLAorCQkJCQkgdGx2X3J4YmEtPm1hYywgMCwgTlVMTCk7CisKKwkJCQkJaWYgKHJldCkKKwkJCQkJCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsCisJCQkJCQkJICAgIEVSUk9SLAorCQkJCQkJCSAgICAiRmFpbCB0byBkcm9wIHBhY2tldCIpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXRsdl9idWZfbGVmdCAtPSAoc2l6ZW9mKCp0bHZfcnhiYSkgKyB0bHZfbGVuKTsKKwkJdG1wID0gKHU4ICopdGx2X3J4YmEgKyB0bHZfbGVuICsgc2l6ZW9mKCp0bHZfcnhiYSk7CisJCXRsdl9yeGJhID0gKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX3J4YmFfc3luYyAqKXRtcDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuX3J4cmVvcmRlci5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExbl9yeHJlb3JkZXIuaAppbmRleCA2M2VjZWE4Li4yMmQ5OTFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuX3J4cmVvcmRlci5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMW5fcnhyZW9yZGVyLmgKQEAgLTgxLDUgKzgxLDYgQEAKIG13aWZpZXhfMTFuX2dldF9yeF9yZW9yZGVyX3RibChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCBpbnQgdGlkLCB1OCAqdGEpOwogdm9pZCBtd2lmaWV4XzExbl9kZWxfcnhfcmVvcmRlcl90YmxfYnlfdGEoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTggKnRhKTsKIHZvaWQgbXdpZmlleF91cGRhdGVfcnhyZW9yX2ZsYWdzKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGZsYWdzKTsKLQordm9pZCBtd2lmaWV4XzExbl9yeGJhX3N5bmNfZXZlbnQoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKKwkJCQkgdTggKmV2ZW50X2J1ZiwgdTE2IGxlbik7CiAjZW5kaWYgLyogX01XSUZJRVhfMTFOX1JYUkVPUkRFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2NmZzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvY2ZnODAyMTEuYwppbmRleCBhOGZmOTY5Li4zOWNlNzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvY2ZnODAyMTEuYwpAQCAtNDg0LDYgKzQ4NCwyOSBAQAogfQogCiAvKgorICogQ0ZHODAyLjExIG9wZXJhdGlvbiBoYW5kbGVyIHRvIHNldCBkZWZhdWx0IG1nbXQga2V5LgorICovCitzdGF0aWMgaW50Cittd2lmaWV4X2NmZzgwMjExX3NldF9kZWZhdWx0X21nbXRfa2V5KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkgICAgICB1OCBrZXlfaW5kZXgpCit7CisJc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiA9IG13aWZpZXhfbmV0ZGV2X2dldF9wcml2KG5ldGRldik7CisJc3RydWN0IG13aWZpZXhfZHNfZW5jcnlwdF9rZXkgZW5jcnlwdF9rZXk7CisKKwl3aXBoeV9kYmcod2lwaHksICJzZXQgZGVmYXVsdCBtZ210IGtleSwga2V5IGluZGV4PSVkXG4iLCBrZXlfaW5kZXgpOworCisJbWVtc2V0KCZlbmNyeXB0X2tleSwgMCwgc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2RzX2VuY3J5cHRfa2V5KSk7CisJZW5jcnlwdF9rZXkua2V5X2xlbiA9IFdMQU5fS0VZX0xFTl9DQ01QOworCWVuY3J5cHRfa2V5LmtleV9pbmRleCA9IGtleV9pbmRleDsKKwllbmNyeXB0X2tleS5pc19pZ3RrX2RlZl9rZXkgPSB0cnVlOworCWV0aF9icm9hZGNhc3RfYWRkcihlbmNyeXB0X2tleS5tYWNfYWRkcik7CisKKwlyZXR1cm4gbXdpZmlleF9zZW5kX2NtZChwcml2LCBIb3N0Q21kX0NNRF84MDJfMTFfS0VZX01BVEVSSUFMLAorCQkJCUhvc3RDbWRfQUNUX0dFTl9TRVQsIHRydWUsICZlbmNyeXB0X2tleSwgdHJ1ZSk7Cit9CisKKy8qCiAgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIGRvbWFpbiBpbmZvcm1hdGlvbiB0byB0aGUgZmlybXdhcmUuCiAgKgogICogVGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBhcmUgcGFzc2VkIHRvIHRoZSBmaXJtd2FyZSAtCkBAIC0yMDEyLDEwICsyMDM1LDYgQEAKIAlpZiAobXdpZmlleF9kZWF1dGhlbnRpY2F0ZShwcml2LCBOVUxMKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBNU0csCi0JCSAgICAiaW5mbzogc3VjY2Vzc2Z1bGx5IGRpc2Nvbm5lY3RlZCBmcm9tICVwTTpcdCIKLQkJICAgICJyZWFzb24gY29kZSAlZFxuIiwgcHJpdi0+Y2ZnX2Jzc2lkLCByZWFzb25fY29kZSk7Ci0KIAlldGhfemVyb19hZGRyKHByaXYtPmNmZ19ic3NpZCk7CiAJcHJpdi0+aHMyX2VuYWJsZWQgPSBmYWxzZTsKIApAQCAtMjQ4NSw2ICsyNTA0LDE2IEBACiAKIAlwcml2LT5zY2FuX3JlcXVlc3QgPSByZXF1ZXN0OwogCisJaWYgKHJlcXVlc3QtPmZsYWdzICYgTkw4MDIxMV9TQ0FOX0ZMQUdfUkFORE9NX0FERFIpIHsKKwkJZXRoZXJfYWRkcl9jb3B5KHByaXYtPnJhbmRvbV9tYWMsIHJlcXVlc3QtPm1hY19hZGRyKTsKKwkJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJCXByaXYtPnJhbmRvbV9tYWNbaV0gJj0gcmVxdWVzdC0+bWFjX2FkZHJfbWFza1tpXTsKKwkJCXByaXYtPnJhbmRvbV9tYWNbaV0gfD0gZ2V0X3JhbmRvbV9pbnQoKSAmCisJCQkJCSAgICAgICB+KHJlcXVlc3QtPm1hY19hZGRyX21hc2tbaV0pOworCQl9CisJfQorCisJZXRoZXJfYWRkcl9jb3B5KHVzZXJfc2Nhbl9jZmctPnJhbmRvbV9tYWMsIHByaXYtPnJhbmRvbV9tYWMpOwogCXVzZXJfc2Nhbl9jZmctPm51bV9zc2lkcyA9IHJlcXVlc3QtPm5fc3NpZHM7CiAJdXNlcl9zY2FuX2NmZy0+c3NpZF9saXN0ID0gcmVxdWVzdC0+c3NpZHM7CiAKQEAgLTI3MjYsNyArMjc1NSw3IEBACiAJCWh0X2luZm8tPmNhcCAmPSB+SUVFRTgwMjExX0hUX0NBUF9TR0lfNDA7CiAKIAlpZiAoYWRhcHRlci0+dXNlcl9kZXZfbWNzX3N1cHBvcnQgPT0gSFRfU1RSRUFNXzJYMikKLQkJaHRfaW5mby0+Y2FwIHw9IDMgPDwgSUVFRTgwMjExX0hUX0NBUF9SWF9TVEJDX1NISUZUOworCQlodF9pbmZvLT5jYXAgfD0gMiA8PCBJRUVFODAyMTFfSFRfQ0FQX1JYX1NUQkNfU0hJRlQ7CiAJZWxzZQogCQlodF9pbmZvLT5jYXAgfD0gMSA8PCBJRUVFODAyMTFfSFRfQ0FQX1JYX1NUQkNfU0hJRlQ7CiAKQEAgLTM5MTMsNiArMzk0Miw4OCBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkw4MDIxMV9URVNUTU9ERQorCitlbnVtIG13aWZpZXhfdG1fYXR0ciB7CisJX19NV0lGSUVYX1RNX0FUVFJfSU5WQUxJRAk9IDAsCisJTVdJRklFWF9UTV9BVFRSX0NNRAkJPSAxLAorCU1XSUZJRVhfVE1fQVRUUl9EQVRBCQk9IDIsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX01XSUZJRVhfVE1fQVRUUl9BRlRFUl9MQVNULAorCU1XSUZJRVhfVE1fQVRUUl9NQVgJCT0gX19NV0lGSUVYX1RNX0FUVFJfQUZURVJfTEFTVCAtIDEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbXdpZmlleF90bV9wb2xpY3lbTVdJRklFWF9UTV9BVFRSX01BWCArIDFdID0geworCVtNV0lGSUVYX1RNX0FUVFJfQ01EXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtNV0lGSUVYX1RNX0FUVFJfREFUQV0JCT0geyAudHlwZSA9IE5MQV9CSU5BUlksCisJCQkJCSAgICAubGVuID0gTVdJRklFWF9TSVpFX09GX0NNRF9CVUZGRVIgfSwKK307CisKK2VudW0gbXdpZmlleF90bV9jb21tYW5kIHsKKwlNV0lGSUVYX1RNX0NNRF9IT1NUQ01ECT0gMCwKK307CisKK3N0YXRpYyBpbnQgbXdpZmlleF90bV9jbWQoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCSAgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2ID0gbXdpZmlleF9uZXRkZXZfZ2V0X3ByaXYod2Rldi0+bmV0ZGV2KTsKKwlzdHJ1Y3QgbXdpZmlleF9kc19taXNjX2NtZCAqaG9zdGNtZDsKKwlzdHJ1Y3QgbmxhdHRyICp0YltNV0lGSUVYX1RNX0FUVFJfTUFYICsgMV07CisJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnI7CisKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRUlOVkFMOworCWFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJZXJyID0gbmxhX3BhcnNlKHRiLCBNV0lGSUVYX1RNX0FUVFJfTUFYLCBkYXRhLCBsZW4sCisJCQltd2lmaWV4X3RtX3BvbGljeSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmICghdGJbTVdJRklFWF9UTV9BVFRSX0NNRF0pCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChubGFfZ2V0X3UzMih0YltNV0lGSUVYX1RNX0FUVFJfQ01EXSkpIHsKKwljYXNlIE1XSUZJRVhfVE1fQ01EX0hPU1RDTUQ6CisJCWlmICghdGJbTVdJRklFWF9UTV9BVFRSX0RBVEFdKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaG9zdGNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpob3N0Y21kKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaG9zdGNtZCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWhvc3RjbWQtPmxlbiA9IG5sYV9sZW4odGJbTVdJRklFWF9UTV9BVFRSX0RBVEFdKTsKKwkJbWVtY3B5KGhvc3RjbWQtPmNtZCwgbmxhX2RhdGEodGJbTVdJRklFWF9UTV9BVFRSX0RBVEFdKSwKKwkJICAgICAgIGhvc3RjbWQtPmxlbik7CisKKwkJaWYgKG13aWZpZXhfc2VuZF9jbWQocHJpdiwgMCwgMCwgMCwgaG9zdGNtZCwgdHJ1ZSkpIHsKKwkJCWRldl9lcnIocHJpdi0+YWRhcHRlci0+ZGV2LCAiRmFpbGVkIHRvIHByb2Nlc3MgaG9zdGNtZFxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCS8qIHByb2Nlc3MgaG9zdGNtZCByZXNwb25zZSovCisJCXNrYiA9IGNmZzgwMjExX3Rlc3Rtb2RlX2FsbG9jX3JlcGx5X3NrYih3aXBoeSwgaG9zdGNtZC0+bGVuKTsKKwkJaWYgKCFza2IpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZXJyID0gbmxhX3B1dChza2IsIE1XSUZJRVhfVE1fQVRUUl9EQVRBLAorCQkJICAgICAgaG9zdGNtZC0+bGVuLCBob3N0Y21kLT5jbWQpOworCQlpZiAoZXJyKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAtRU1TR1NJWkU7CisJCX0KKworCQllcnIgPSBjZmc4MDIxMV90ZXN0bW9kZV9yZXBseShza2IpOworCQlrZnJlZShob3N0Y21kKTsKKwkJcmV0dXJuIGVycjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorI2VuZGlmCisKIHN0YXRpYyBpbnQKIG13aWZpZXhfY2ZnODAyMTFfc3RhcnRfcmFkYXJfZGV0ZWN0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCiAJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC0zOTk0LDYgKzQxMDUsNyBAQAogCS5sZWF2ZV9pYnNzID0gbXdpZmlleF9jZmc4MDIxMV9sZWF2ZV9pYnNzLAogCS5hZGRfa2V5ID0gbXdpZmlleF9jZmc4MDIxMV9hZGRfa2V5LAogCS5kZWxfa2V5ID0gbXdpZmlleF9jZmc4MDIxMV9kZWxfa2V5LAorCS5zZXRfZGVmYXVsdF9tZ210X2tleSA9IG13aWZpZXhfY2ZnODAyMTFfc2V0X2RlZmF1bHRfbWdtdF9rZXksCiAJLm1nbXRfdHggPSBtd2lmaWV4X2NmZzgwMjExX21nbXRfdHgsCiAJLm1nbXRfZnJhbWVfcmVnaXN0ZXIgPSBtd2lmaWV4X2NmZzgwMjExX21nbXRfZnJhbWVfcmVnaXN0ZXIsCiAJLnJlbWFpbl9vbl9jaGFubmVsID0gbXdpZmlleF9jZmc4MDIxMV9yZW1haW5fb25fY2hhbm5lbCwKQEAgLTQwMjUsNiArNDEzNyw3IEBACiAJLnRkbHNfY2FuY2VsX2NoYW5uZWxfc3dpdGNoID0gbXdpZmlleF9jZmc4MDIxMV90ZGxzX2NhbmNlbF9jaGFuX3N3aXRjaCwKIAkuYWRkX3N0YXRpb24gPSBtd2lmaWV4X2NmZzgwMjExX2FkZF9zdGF0aW9uLAogCS5jaGFuZ2Vfc3RhdGlvbiA9IG13aWZpZXhfY2ZnODAyMTFfY2hhbmdlX3N0YXRpb24sCisJQ0ZHODAyMTFfVEVTVE1PREVfQ01EKG13aWZpZXhfdG1fY21kKQogCS5nZXRfY2hhbm5lbCA9IG13aWZpZXhfY2ZnODAyMTFfZ2V0X2NoYW5uZWwsCiAJLnN0YXJ0X3JhZGFyX2RldGVjdGlvbiA9IG13aWZpZXhfY2ZnODAyMTFfc3RhcnRfcmFkYXJfZGV0ZWN0aW9uLAogCS5jaGFubmVsX3N3aXRjaCA9IG13aWZpZXhfY2ZnODAyMTFfY2hhbm5lbF9zd2l0Y2gsCkBAIC00MTM1LDkgKzQyNDgsMTIgQEAKIAl3aXBoeS0+Y2lwaGVyX3N1aXRlcyA9IG13aWZpZXhfY2lwaGVyX3N1aXRlczsKIAl3aXBoeS0+bl9jaXBoZXJfc3VpdGVzID0gQVJSQVlfU0laRShtd2lmaWV4X2NpcGhlcl9zdWl0ZXMpOwogCi0JaWYgKGFkYXB0ZXItPnJlZ2lvbl9jb2RlKQotCQl3aXBoeS0+cmVndWxhdG9yeV9mbGFncyB8PSBSRUdVTEFUT1JZX0RJU0FCTEVfQkVBQ09OX0hJTlRTIHwKKwlpZiAoYWRhcHRlci0+cmVnZCkgeworCQl3aXBoeS0+cmVndWxhdG9yeV9mbGFncyB8PSBSRUdVTEFUT1JZX0NVU1RPTV9SRUcgfAorCQkJCQkgICBSRUdVTEFUT1JZX0RJU0FCTEVfQkVBQ09OX0hJTlRTIHwKIAkJCQkJICAgUkVHVUxBVE9SWV9DT1VOVFJZX0lFX0lHTk9SRTsKKwkJd2lwaHlfYXBwbHlfY3VzdG9tX3JlZ3VsYXRvcnkod2lwaHksIGFkYXB0ZXItPnJlZ2QpOworCX0KIAogCWV0aGVyX2FkZHJfY29weSh3aXBoeS0+cGVybV9hZGRyLCBhZGFwdGVyLT5wZXJtX2FkZHIpOwogCXdpcGh5LT5zaWduYWxfdHlwZSA9IENGRzgwMjExX1NJR05BTF9UWVBFX01CTTsKQEAgLTQxNzMsNyArNDI4OSwxMCBAQAogCXdpcGh5LT5mZWF0dXJlcyB8PSBOTDgwMjExX0ZFQVRVUkVfSFRfSUJTUyB8CiAJCQkgICBOTDgwMjExX0ZFQVRVUkVfSU5BQ1RJVklUWV9USU1FUiB8CiAJCQkgICBOTDgwMjExX0ZFQVRVUkVfTE9XX1BSSU9SSVRZX1NDQU4gfAotCQkJICAgTkw4MDIxMV9GRUFUVVJFX05FRURfT0JTU19TQ0FOOworCQkJICAgTkw4MDIxMV9GRUFUVVJFX05FRURfT0JTU19TQ0FOIHwKKwkJCSAgIE5MODAyMTFfRkVBVFVSRV9TQ0FOX1JBTkRPTV9NQUNfQUREUiB8CisJCQkgICBOTDgwMjExX0ZFQVRVUkVfU0NIRURfU0NBTl9SQU5ET01fTUFDX0FERFIgfAorCQkJICAgTkw4MDIxMV9GRUFUVVJFX05EX1JBTkRPTV9NQUNfQUREUjsKIAogCWlmIChJU1NVUFBfVERMU19FTkFCTEVEKGFkYXB0ZXItPmZ3X2NhcF9pbmZvKSkKIAkJd2lwaHktPmZlYXR1cmVzIHw9IE5MODAyMTFfRkVBVFVSRV9URExTX0NIQU5ORUxfU1dJVENIOwpAQCAtNDIwMCwxOSArNDMxOSwyNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmIChyZWdfYWxwaGEyICYmIG13aWZpZXhfaXNfdmFsaWRfYWxwaGEyKHJlZ19hbHBoYTIpKSB7Ci0JCW13aWZpZXhfZGJnKGFkYXB0ZXIsIElORk8sCi0JCQkgICAgImRyaXZlciBoaW50IGFscGhhMjogJTIuMnNcbiIsIHJlZ19hbHBoYTIpOwotCQlyZWd1bGF0b3J5X2hpbnQod2lwaHksIHJlZ19hbHBoYTIpOwotCX0gZWxzZSB7Ci0JCWlmIChhZGFwdGVyLT5yZWdpb25fY29kZSA9PSAweDAwKSB7Ci0JCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBXQVJOLCAiSWdub3JlIHdvcmxkIHJlZ3VsYXRvcnkgZG9tYWluXG4iKTsKKwlpZiAoIWFkYXB0ZXItPnJlZ2QpIHsKKwkJaWYgKHJlZ19hbHBoYTIgJiYgbXdpZmlleF9pc192YWxpZF9hbHBoYTIocmVnX2FscGhhMikpIHsKKwkJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIElORk8sCisJCQkJICAgICJkcml2ZXIgaGludCBhbHBoYTI6ICUyLjJzXG4iLCByZWdfYWxwaGEyKTsKKwkJCXJlZ3VsYXRvcnlfaGludCh3aXBoeSwgcmVnX2FscGhhMik7CiAJCX0gZWxzZSB7Ci0JCQljb3VudHJ5X2NvZGUgPQotCQkJCW13aWZpZXhfMTFkX2NvZGVfMl9yZWdpb24oYWRhcHRlci0+cmVnaW9uX2NvZGUpOwotCQkJaWYgKGNvdW50cnlfY29kZSAmJgotCQkJICAgIHJlZ3VsYXRvcnlfaGludCh3aXBoeSwgY291bnRyeV9jb2RlKSkKLQkJCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBFUlJPUiwgInJlZ3VsYXRvcnlfaGludCgpIGZhaWxlZFxuIik7CisJCQlpZiAoYWRhcHRlci0+cmVnaW9uX2NvZGUgPT0gMHgwMCkgeworCQkJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIFdBUk4sCisJCQkJCSAgICAiSWdub3JlIHdvcmxkIHJlZ3VsYXRvcnkgZG9tYWluXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJd2lwaHktPnJlZ3VsYXRvcnlfZmxhZ3MgfD0KKwkJCQkJUkVHVUxBVE9SWV9ESVNBQkxFX0JFQUNPTl9ISU5UUyB8CisJCQkJCVJFR1VMQVRPUllfQ09VTlRSWV9JRV9JR05PUkU7CisJCQkJY291bnRyeV9jb2RlID0KKwkJCQkJbXdpZmlleF8xMWRfY29kZV8yX3JlZ2lvbigKKwkJCQkJCWFkYXB0ZXItPnJlZ2lvbl9jb2RlKTsKKwkJCQlpZiAoY291bnRyeV9jb2RlICYmCisJCQkJICAgIHJlZ3VsYXRvcnlfaGludCh3aXBoeSwgY291bnRyeV9jb2RlKSkKKwkJCQkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgRVJST1IsCisJCQkJCQkgICAgInJlZ3VsYXRvcnlfaGludCgpIGZhaWxlZFxuIik7CisJCQl9CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9jbWRldnQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9jbWRldnQuYwppbmRleCBjMjlmMjZkLi41MzQ3NzI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvY21kZXZ0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2NtZGV2dC5jCkBAIC00ODAsMTMgKzQ4MCwyNyBAQAogICovCiBpbnQgbXdpZmlleF9wcm9jZXNzX2V2ZW50KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JaW50IHJldDsKKwlpbnQgcmV0LCBpOwogCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYgPQogCQltd2lmaWV4X2dldF9wcml2KGFkYXB0ZXIsIE1XSUZJRVhfQlNTX1JPTEVfQU5ZKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWRhcHRlci0+ZXZlbnRfc2tiOwotCXUzMiBldmVudGNhdXNlID0gYWRhcHRlci0+ZXZlbnRfY2F1c2U7CisJdTMyIGV2ZW50Y2F1c2U7CiAJc3RydWN0IG13aWZpZXhfcnhpbmZvICpyeF9pbmZvOwogCisJaWYgKChhZGFwdGVyLT5ldmVudF9jYXVzZSAmIEVWRU5UX0lEX01BU0spID09IEVWRU5UX1JBREFSX0RFVEVDVEVEKSB7CisJCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5wcml2X251bTsgaSsrKSB7CisJCQlwcml2ID0gYWRhcHRlci0+cHJpdltpXTsKKwkJCWlmIChwcml2ICYmIG13aWZpZXhfaXNfMTFoX2FjdGl2ZShwcml2KSkgeworCQkJCWFkYXB0ZXItPmV2ZW50X2NhdXNlIHw9CisJCQkJCSgocHJpdi0+YnNzX251bSAmIDB4ZmYpIDw8IDE2KSB8CisJCQkJCSgocHJpdi0+YnNzX3R5cGUgJiAweGZmKSA8PCAyNCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlldmVudGNhdXNlID0gYWRhcHRlci0+ZXZlbnRfY2F1c2U7CisKIAkvKiBTYXZlIHRoZSBsYXN0IGV2ZW50IHRvIGRlYnVnIGxvZyAqLwogCWFkYXB0ZXItPmRiZy5sYXN0X2V2ZW50X2luZGV4ID0KIAkJCShhZGFwdGVyLT5kYmcubGFzdF9ldmVudF9pbmRleCArIDEpICUgREJHX0NNRF9OVU07CkBAIC01ODEsNiArNTk1LDE0IEBACiAJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CisJLyogV2UgZG9uJ3QgZXhwZWN0IGNvbW1hbmRzIGluIG1hbnVmYWN0dXJpbmcgbW9kZS4gVGhleSBhcmUgY29va2VkCisJICogaW4gYXBwbGljYXRpb24gYW5kIHJlYWR5IHRvIGRvd25sb2FkIGJ1ZmZlciBpcyBwYXNzZWQgdG8gdGhlIGRyaXZlcgorCSAqLworCWlmIChhZGFwdGVyLT5tZmdfbW9kZSAmJiBjbWRfbm8pIHsKKwkJZGV2X2RiZyhhZGFwdGVyLT5kZXYsICJJZ25vcmluZyBjb21tYW5kcyBpbiBtYW51ZmFjdHVyaW5nIG1vZGVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCiAKIAkvKiBHZXQgYSBuZXcgY29tbWFuZCBub2RlICovCiAJY21kX25vZGUgPSBtd2lmaWV4X2dldF9jbWRfbm9kZShhZGFwdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvZGVidWdmcy5jCmluZGV4IGJjY2YxN2EuLmI5Mjg0YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2RlYnVnZnMuYwpAQCAtMTE4LDYgKzExOCw4IEBACiAJCXAgKz0gc3ByaW50ZihwLCAiYnNzaWQ9XCIlcE1cIlxuIiwgaW5mby5ic3NpZCk7CiAJCXAgKz0gc3ByaW50ZihwLCAiY2hhbm5lbD1cIiVkXCJcbiIsIChpbnQpIGluZm8uYnNzX2NoYW4pOwogCQlwICs9IHNwcmludGYocCwgImNvdW50cnlfY29kZSA9IFwiJXNcIlxuIiwgaW5mby5jb3VudHJ5X2NvZGUpOworCQlwICs9IHNwcmludGYocCwgInJlZ2lvbl9jb2RlPVwiMHgleFwiXG4iLAorCQkJICAgICBwcml2LT5hZGFwdGVyLT5yZWdpb25fY29kZSk7CiAKIAkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIG5ldGRldikKIAkJCXAgKz0gc3ByaW50ZihwLCAibXVsdGljYXN0X2FkZHJlc3NbJWRdPVwiJXBNXCJcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvZncuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9mdy5oCmluZGV4IDU1OTZiNmIuLjRiMTg5NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9mdy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9mdy5oCkBAIC03OCw2ICs3OCw3IEBACiAJS0VZX1RZUEVfSURfQUVTLAogCUtFWV9UWVBFX0lEX1dBUEksCiAJS0VZX1RZUEVfSURfQUVTX0NNQUMsCisJS0VZX1RZUEVfSURfQUVTX0NNQUNfREVGLAogfTsKIAogI2RlZmluZSBXUEFfUE5fU0laRQkJOApAQCAtMTc2LDYgKzE3Nyw3IEBACiAjZGVmaW5lIFRMVl9UWVBFX1BXS19DSVBIRVIgICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxNDUpCiAjZGVmaW5lIFRMVl9UWVBFX0dXS19DSVBIRVIgICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxNDYpCiAjZGVmaW5lIFRMVl9UWVBFX1RYX1BBVVNFICAgICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxNDgpCisjZGVmaW5lIFRMVl9UWVBFX1JYQkFfU1lOQyAgICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxNTMpCiAjZGVmaW5lIFRMVl9UWVBFX0NPQUxFU0NFX1JVTEUgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxNTQpCiAjZGVmaW5lIFRMVl9UWVBFX0tFWV9QQVJBTV9WMiAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxNTYpCiAjZGVmaW5lIFRMVl9UWVBFX1JFUEVBVF9DT1VOVCAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxNzYpCkBAIC0xODgsNiArMTkwLDggQEAKICNkZWZpbmUgVExWX0JUQ09FWF9XTF9BR0dSX1dJTlNJWkUgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDIwMikKICNkZWZpbmUgVExWX0JUQ09FWF9XTF9TQ0FOVElNRSAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDIwMykKICNkZWZpbmUgVExWX1RZUEVfQlNTX01PREUgICAgICAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDIwNikKKyNkZWZpbmUgVExWX1RZUEVfUkFORE9NX01BQyAgICAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDIzNikKKyNkZWZpbmUgVExWX1RZUEVfQ0hBTl9BVFRSX0NGRyAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDIzNykKIAogI2RlZmluZSBNV0lGSUVYX1RYX0RBVEFfQlVGX1NJWkVfMksgICAgICAgIDIwNDgKIApAQCAtMjA4LDYgKzIxMiw3IEBACiAKICNkZWZpbmUgTVdJRklFWF9UWF9EQVRBX0JVRl9TSVpFXzRLICAgICAgICA0MDk2CiAjZGVmaW5lIE1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV84SyAgICAgICAgODE5MgorI2RlZmluZSBNV0lGSUVYX1RYX0RBVEFfQlVGX1NJWkVfMTJLICAgICAgIDEyMjg4CiAKICNkZWZpbmUgSVNTVVBQXzExTkVOQUJMRUQoRndDYXBJbmZvKSAoRndDYXBJbmZvICYgQklUKDExKSkKICNkZWZpbmUgSVNTVVBQX1RETFNfRU5BQkxFRChGd0NhcEluZm8pIChGd0NhcEluZm8gJiBCSVQoMTQpKQpAQCAtMzc5LDYgKzM4NCw3IEBACiAjZGVmaW5lIEhvc3RDbWRfQ01EX01DX1BPTElDWSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjEKICNkZWZpbmUgSG9zdENtZF9DTURfVERMU19PUEVSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyMgogI2RlZmluZSBIb3N0Q21kX0NNRF9TRElPX1NQX1JYX0FHR1JfQ0ZHICAgICAgICAgICAgICAgMHgwMjIzCisjZGVmaW5lIEhvc3RDbWRfQ01EX0NIQU5fUkVHSU9OX0NGRwkJICAgICAgMHgwMjQyCiAKICNkZWZpbmUgUFJPVE9DT0xfTk9fU0VDVVJJVFkgICAgICAgIDB4MDEKICNkZWZpbmUgUFJPVE9DT0xfU1RBVElDX1dFUCAgICAgICAgIDB4MDIKQEAgLTQxMSw2ICs0MTcsMTQgQEAKIAlQMlBfTU9ERV9DTElFTlQgPSAzLAogfTsKIAorZW51bSBtd2lmaWV4X2NoYW5uZWxfZmxhZ3MgeworCU1XSUZJRVhfQ0hBTk5FTF9QQVNTSVZFID0gQklUKDApLAorCU1XSUZJRVhfQ0hBTk5FTF9ERlMgPSBCSVQoMSksCisJTVdJRklFWF9DSEFOTkVMX05PSFQ0MCA9IEJJVCgyKSwKKwlNV0lGSUVYX0NIQU5ORUxfTk9IVDgwID0gQklUKDMpLAorCU1XSUZJRVhfQ0hBTk5FTF9ESVNBQkxFRCA9IEJJVCg3KSwKK307CisKICNkZWZpbmUgSG9zdENtZF9SRVRfQklUICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAKICNkZWZpbmUgSG9zdENtZF9BQ1RfR0VOX0dFVCAgICAgICAgICAgICAgICAgICAweDAwMDAKICNkZWZpbmUgSG9zdENtZF9BQ1RfR0VOX1NFVCAgICAgICAgICAgICAgICAgICAweDAwMDEKQEAgLTUwNCw2ICs1MTgsOCBAQAogI2RlZmluZSBFVkVOVF9SU1NJX0hJR0ggICAgICAgICAgICAgICAgIDB4MDAwMDAwMWMKICNkZWZpbmUgRVZFTlRfU05SX0hJR0ggICAgICAgICAgICAgICAgICAweDAwMDAwMDFkCiAjZGVmaW5lIEVWRU5UX0lCU1NfQ09BTEVTQ0VEICAgICAgICAgICAgMHgwMDAwMDAxZQorI2RlZmluZSBFVkVOVF9JQlNTX1NUQV9DT05ORUNUICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRVZFTlRfSUJTU19TVEFfRElTQ09OTkVDVCAgICAgICAweDAwMDAwMDIxCiAjZGVmaW5lIEVWRU5UX0RBVEFfUlNTSV9MT1cgICAgICAgICAgICAgMHgwMDAwMDAyNAogI2RlZmluZSBFVkVOVF9EQVRBX1NOUl9MT1cgICAgICAgICAgICAgIDB4MDAwMDAwMjUKICNkZWZpbmUgRVZFTlRfREFUQV9SU1NJX0hJR0ggICAgICAgICAgICAweDAwMDAwMDI2CkBAIC01MzEsNiArNTQ3LDcgQEAKICNkZWZpbmUgRVZFTlRfQ0hBTk5FTF9SRVBPUlRfUkRZICAgICAgICAweDAwMDAwMDU0CiAjZGVmaW5lIEVWRU5UX1RYX0RBVEFfUEFVU0UgICAgICAgICAgICAgMHgwMDAwMDA1NQogI2RlZmluZSBFVkVOVF9FWFRfU0NBTl9SRVBPUlQgICAgICAgICAgIDB4MDAwMDAwNTgKKyNkZWZpbmUgRVZFTlRfUlhCQV9TWU5DICAgICAgICAgICAgICAgICAweDAwMDAwMDU5CiAjZGVmaW5lIEVWRU5UX0JHX1NDQU5fU1RPUFBFRCAgICAgICAgICAgMHgwMDAwMDA2NQogI2RlZmluZSBFVkVOVF9SRU1BSU5fT05fQ0hBTl9FWFBJUkVEICAgIDB4MDAwMDAwNWYKICNkZWZpbmUgRVZFTlRfTVVMVElfQ0hBTl9JTkZPICAgICAgICAgICAweDAwMDAwMDZhCkBAIC03MzQsNiArNzUxLDE2IEBACiAJc3RydWN0IG13aWZpZXhfY2hhbl9zY2FuX3BhcmFtX3NldCBjaGFuX3NjYW5fcGFyYW1bMV07CiB9IF9fcGFja2VkOwogCitzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19yeGJhX3N5bmMgeworCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2hlYWRlciBoZWFkZXI7CisJdTggbWFjW0VUSF9BTEVOXTsKKwl1OCB0aWQ7CisJdTggcmVzZXJ2ZWQ7CisJX19sZTE2IHNlcV9udW07CisJX19sZTE2IGJpdG1hcF9sZW47CisJdTggYml0bWFwWzFdOworfSBfX3BhY2tlZDsKKwogc3RydWN0IGNoYW5fYmFuZF9wYXJhbV9zZXQgewogCXU4IHJhZGlvX3R5cGU7CiAJdTggY2hhbl9udW1iZXI7CkBAIC03ODAsNiArODA3LDExIEBACiAJX19sZTE2IGNoYW5fZ2FwOwogfSBfX3BhY2tlZDsKIAorc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfcmFuZG9tX21hYyB7CisJc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaGVhZGVyIGhlYWRlcjsKKwl1OCBtYWNbRVRIX0FMRU5dOworfSBfX3BhY2tlZDsKKwogc3RydWN0IG13aWZpZXhfaWV0eXBlc19jaGFuc3RhdHMgewogCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2hlYWRlciBoZWFkZXI7CiAJc3RydWN0IG13aWZpZXhfZndfY2hhbl9zdGF0cyBjaGFuc3RhdHNbMF07CkBAIC0xNDY0LDYgKzE0OTYsNyBAQAogCS8qIFZhcmlhYmxlIG51bWJlciAoZml4ZWQgbWF4aW11bSkgb2YgY2hhbm5lbHMgdG8gc2NhbiB1cCAqLwogCXN0cnVjdCBtd2lmaWV4X3VzZXJfc2Nhbl9jaGFuIGNoYW5fbGlzdFtNV0lGSUVYX1VTRVJfU0NBTl9DSEFOX01BWF07CiAJdTE2IHNjYW5fY2hhbl9nYXA7CisJdTggcmFuZG9tX21hY1tFVEhfQUxFTl07CiB9IF9fcGFja2VkOwogCiAjZGVmaW5lIE1XSUZJRVhfQkdfU0NBTl9DSEFOX01BWCAzOApAQCAtMTY0Niw3ICsxNjc5LDcgQEAKIH07CiAKIHN0cnVjdCBob3N0X2NtZF9kc19zdGFfbGlzdCB7Ci0JdTE2IHN0YV9jb3VudDsKKwlfX2xlMTYgc3RhX2NvdW50OwogCXU4IHRsdlswXTsKIH0gX19wYWNrZWQ7CiAKQEAgLTE2NjcsNiArMTcwMCwxMiBAQAogCXU4IHdtbV9pZVsxXTsKIH07CiAKK3N0cnVjdCBtd2lmaWV4X2llX3R5cGVzX21nbXRfZnJhbWUgeworCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2hlYWRlciBoZWFkZXI7CisJX19sZTE2IGZyYW1lX2NvbnRyb2w7CisJdTggZnJhbWVfY29udGVudHNbMF07Cit9OworCiBzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc193bW1fcXVldWVfc3RhdHVzIHsKIAlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19oZWFkZXIgaGVhZGVyOwogCXU4IHF1ZXVlX2luZGV4OwpAQCAtMjAzNCwyNiArMjA3MywyNiBAQAogCiBzdHJ1Y3QgaG9zdF9jbWRfZHNfcGNpZV9kZXRhaWxzIHsKIAkvKiBUWCBidWZmZXIgZGVzY3JpcHRvciByaW5nIGFkZHJlc3MgKi8KLQl1MzIgdHhiZF9hZGRyX2xvOwotCXUzMiB0eGJkX2FkZHJfaGk7CisJX19sZTMyIHR4YmRfYWRkcl9sbzsKKwlfX2xlMzIgdHhiZF9hZGRyX2hpOwogCS8qIFRYIGJ1ZmZlciBkZXNjcmlwdG9yIHJpbmcgY291bnQgKi8KLQl1MzIgdHhiZF9jb3VudDsKKwlfX2xlMzIgdHhiZF9jb3VudDsKIAogCS8qIFJYIGJ1ZmZlciBkZXNjcmlwdG9yIHJpbmcgYWRkcmVzcyAqLwotCXUzMiByeGJkX2FkZHJfbG87Ci0JdTMyIHJ4YmRfYWRkcl9oaTsKKwlfX2xlMzIgcnhiZF9hZGRyX2xvOworCV9fbGUzMiByeGJkX2FkZHJfaGk7CiAJLyogUlggYnVmZmVyIGRlc2NyaXB0b3IgcmluZyBjb3VudCAqLwotCXUzMiByeGJkX2NvdW50OworCV9fbGUzMiByeGJkX2NvdW50OwogCiAJLyogRXZlbnQgYnVmZmVyIGRlc2NyaXB0b3IgcmluZyBhZGRyZXNzICovCi0JdTMyIGV2dGJkX2FkZHJfbG87Ci0JdTMyIGV2dGJkX2FkZHJfaGk7CisJX19sZTMyIGV2dGJkX2FkZHJfbG87CisJX19sZTMyIGV2dGJkX2FkZHJfaGk7CiAJLyogRXZlbnQgYnVmZmVyIGRlc2NyaXB0b3IgcmluZyBjb3VudCAqLwotCXUzMiBldnRiZF9jb3VudDsKKwlfX2xlMzIgZXZ0YmRfY291bnQ7CiAKIAkvKiBTbGVlcCBjb29raWUgYnVmZmVyIHBoeXNpY2FsIGFkZHJlc3MgKi8KLQl1MzIgc2xlZXBfY29va2llX2FkZHJfbG87Ci0JdTMyIHNsZWVwX2Nvb2tpZV9hZGRyX2hpOworCV9fbGUzMiBzbGVlcF9jb29raWVfYWRkcl9sbzsKKwlfX2xlMzIgc2xlZXBfY29va2llX2FkZHJfaGk7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19yc3NpX3RocmVzaG9sZCB7CkBAIC0yMDkzLDggKzIxMzIsOCBAQAogCXU4IGNoYW5fYnVmX3dlaWdodDsKIAl1OCBiYW5kX2NvbmZpZzsKIAl1OCBjaGFuX251bTsKLQl1MzIgY2hhbl90aW1lOwotCXUzMiByZXNlcnZlZDsKKwlfX2xlMzIgY2hhbl90aW1lOworCV9fbGUzMiByZXNlcnZlZDsKIAl1bmlvbiB7CiAJCXU4IHNkaW9fZnVuY19udW07CiAJCXU4IHVzYl9lcF9udW07CkBAIC0yMTg1LDcgKzIyMjQsNyBAQAogfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RfY21kX2RzX3dha2V1cF9yZWFzb24gewotCXUxNiAgd2FrZXVwX3JlYXNvbjsKKwlfX2xlMTYgIHdha2V1cF9yZWFzb247CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdF9jbWRfZHNfZ3RrX3Jla2V5X3BhcmFtcyB7CkBAIC0yMTk2LDYgKzIyMzUsMTAgQEAKIAlfX2xlMzIgcmVwbGF5X2N0cl9oaWdoOwogfSBfX3BhY2tlZDsKIAorc3RydWN0IGhvc3RfY21kX2RzX2NoYW5fcmVnaW9uX2NmZyB7CisJX19sZTE2IGFjdGlvbjsKK30gX19wYWNrZWQ7CisKIHN0cnVjdCBob3N0X2NtZF9kc19jb21tYW5kIHsKIAlfX2xlMTYgY29tbWFuZDsKIAlfX2xlMTYgc2l6ZTsKQEAgLTIyNzAsNiArMjMxMyw3IEBACiAJCXN0cnVjdCBob3N0X2NtZF9kc19yb2J1c3RfY29leCBjb2V4OwogCQlzdHJ1Y3QgaG9zdF9jbWRfZHNfd2FrZXVwX3JlYXNvbiBoc193YWtldXBfcmVhc29uOwogCQlzdHJ1Y3QgaG9zdF9jbWRfZHNfZ3RrX3Jla2V5X3BhcmFtcyByZWtleTsKKwkJc3RydWN0IGhvc3RfY21kX2RzX2NoYW5fcmVnaW9uX2NmZyByZWdfY2ZnOwogCX0gcGFyYW1zOwogfSBfX3BhY2tlZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2luaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9pbml0LmMKaW5kZXggMTQ4OWM5MC4uODI4MzlkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2luaXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvaW5pdC5jCkBAIC0yOTgsNiArMjk4LDcgQEAKIAltZW1zZXQoJmFkYXB0ZXItPmFycF9maWx0ZXIsIDAsIHNpemVvZihhZGFwdGVyLT5hcnBfZmlsdGVyKSk7CiAJYWRhcHRlci0+YXJwX2ZpbHRlcl9zaXplID0gMDsKIAlhZGFwdGVyLT5tYXhfbWdtdF9pZV9pbmRleCA9IE1BWF9NR01UX0lFX0lOREVYOworCWFkYXB0ZXItPm1mZ19tb2RlID0gbWZnX21vZGU7CiAJYWRhcHRlci0+a2V5X2FwaV9tYWpvcl92ZXIgPSAwOwogCWFkYXB0ZXItPmtleV9hcGlfbWlub3JfdmVyID0gMDsKIAlldGhfYnJvYWRjYXN0X2FkZHIoYWRhcHRlci0+cGVybV9hZGRyKTsKQEAgLTU1MywxNSArNTU0LDIyIEBACiAJCQkJcmV0dXJuIC0xOwogCQl9CiAJfQorCWlmIChhZGFwdGVyLT5tZmdfbW9kZSkgeworCQlhZGFwdGVyLT5od19zdGF0dXMgPSBNV0lGSUVYX0hXX1NUQVRVU19SRUFEWTsKKwkJcmV0ID0gLUVJTlBST0dSRVNTOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5wcml2X251bTsgaSsrKSB7CisJCQlpZiAoYWRhcHRlci0+cHJpdltpXSkgeworCQkJCXJldCA9IG13aWZpZXhfc3RhX2luaXRfY21kKGFkYXB0ZXItPnByaXZbaV0sCisJCQkJCQkJICAgZmlyc3Rfc3RhLCB0cnVlKTsKKwkJCQlpZiAocmV0ID09IC0xKQorCQkJCQlyZXR1cm4gLTE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+cHJpdl9udW07IGkrKykgewotCQlpZiAoYWRhcHRlci0+cHJpdltpXSkgewotCQkJcmV0ID0gbXdpZmlleF9zdGFfaW5pdF9jbWQoYWRhcHRlci0+cHJpdltpXSwgZmlyc3Rfc3RhLAotCQkJCQkJICAgdHJ1ZSk7Ci0JCQlpZiAocmV0ID09IC0xKQotCQkJCXJldHVybiAtMTsKKwkJCQlmaXJzdF9zdGEgPSBmYWxzZTsKKwkJCX0KIAotCQkJZmlyc3Rfc3RhID0gZmFsc2U7CisKKwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvaW9jdGwuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9pb2N0bC5oCmluZGV4IDcwNDI5ODEuLjUzNmFiODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9pb2N0bC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9pb2N0bC5oCkBAIC0yNjAsNiArMjYwLDcgQEAKIAl1OCBpc19pZ3RrX2tleTsKIAl1OCBpc19jdXJyZW50X3dlcF9rZXk7CiAJdTggaXNfcnhfc2VxX3ZhbGlkOworCXU4IGlzX2lndGtfZGVmX2tleTsKIH07CiAKIHN0cnVjdCBtd2lmaWV4X3Bvd2VyX2NmZyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvam9pbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2pvaW4uYwppbmRleCAxYzdiMDA2Li5iODk1OTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvam9pbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9qb2luLmMKQEAgLTY2OSw5ICs2NjksOCBAQAogCXByaXYtPmFzc29jX3JzcF9zaXplID0gbWluKGxlMTZfdG9fY3B1KHJlc3AtPnNpemUpIC0gU19EU19HRU4sCiAJCQkJICAgc2l6ZW9mKHByaXYtPmFzc29jX3JzcF9idWYpKTsKIAotCW1lbWNweShwcml2LT5hc3NvY19yc3BfYnVmLCAmcmVzcC0+cGFyYW1zLCBwcml2LT5hc3NvY19yc3Bfc2l6ZSk7Ci0KIAlhc3NvY19yc3AtPmFfaWQgPSBjcHVfdG9fbGUxNihhaWQpOworCW1lbWNweShwcml2LT5hc3NvY19yc3BfYnVmLCAmcmVzcC0+cGFyYW1zLCBwcml2LT5hc3NvY19yc3Bfc2l6ZSk7CiAKIAlpZiAoc3RhdHVzX2NvZGUpIHsKIAkJcHJpdi0+YWRhcHRlci0+ZGJnLm51bV9jbWRfYXNzb2NfZmFpbHVyZSsrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmMKaW5kZXggZGI0OTI1ZC4uMjQ3OGNjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvbWFpbi5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSAiMTFuLmgiCiAKICNkZWZpbmUgVkVSU0lPTgkiMS4wIgorI2RlZmluZSBNRkdfRklSTVdBUkUJIm13aWZpZXhfbWZnLmJpbiIKIAogc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1Z19tYXNrID0gTVdJRklFWF9ERUZBVUxUX0RFQlVHX01BU0s7CiBtb2R1bGVfcGFyYW0oZGVidWdfbWFzaywgdWludCwgMCk7CkBAIC0zNyw2ICszOCwxMCBAQAogTU9EVUxFX1BBUk1fREVTQyhkcml2ZXJfbW9kZSwKIAkJICJzdGF0aW9uPTB4MShkZWZhdWx0KSwgYXAtc3RhPTB4Mywgc3RhdGlvbi1wMnA9MHg1LCBhcC1zdGEtcDJwPTB4NyIpOwogCitib29sIG1mZ19tb2RlOworbW9kdWxlX3BhcmFtKG1mZ19tb2RlLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWZnX21vZGUsICJtYW51ZmFjdHVyaW5nIG1vZGUgZW5hYmxlOjEsIGRpc2FibGU6MCIpOworCiAvKgogICogVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIGRldmljZSBhbmQgcGVyZm9ybXMgYWxsIHRoZSBuZWNlc3NhcnkKICAqIGluaXRpYWxpemF0aW9ucy4KQEAgLTEzOSw2ICsxNDQsOCBAQAogCQlhZGFwdGVyLT5uZF9pbmZvID0gTlVMTDsKIAl9CiAKKwlrZnJlZShhZGFwdGVyLT5yZWdkKTsKKwogCXZmcmVlKGFkYXB0ZXItPmNoYW5fc3RhdHMpOwogCWtmcmVlKGFkYXB0ZXIpOwogCXJldHVybiAwOwpAQCAtNDg2LDkgKzQ5MywxMSBAQAogICovCiBzdGF0aWMgdm9pZCBtd2lmaWV4X3Rlcm1pbmF0ZV93b3JrcXVldWUoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlmbHVzaF93b3JrcXVldWUoYWRhcHRlci0+d29ya3F1ZXVlKTsKLQlkZXN0cm95X3dvcmtxdWV1ZShhZGFwdGVyLT53b3JrcXVldWUpOwotCWFkYXB0ZXItPndvcmtxdWV1ZSA9IE5VTEw7CisJaWYgKGFkYXB0ZXItPndvcmtxdWV1ZSkgeworCQlmbHVzaF93b3JrcXVldWUoYWRhcHRlci0+d29ya3F1ZXVlKTsKKwkJZGVzdHJveV93b3JrcXVldWUoYWRhcHRlci0+d29ya3F1ZXVlKTsKKwkJYWRhcHRlci0+d29ya3F1ZXVlID0gTlVMTDsKKwl9CiAKIAlpZiAoYWRhcHRlci0+cnhfd29ya3F1ZXVlKSB7CiAJCWZsdXNoX3dvcmtxdWV1ZShhZGFwdGVyLT5yeF93b3JrcXVldWUpOwpAQCAtNTU5LDE2ICs1NjgsMjEgQEAKIAkJZ290byBkb25lOwogCX0KIAkvKiBXYWl0IGZvciBtd2lmaWV4X2luaXQgdG8gY29tcGxldGUgKi8KLQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYWRhcHRlci0+aW5pdF93YWl0X3EsCi0JCQkJIGFkYXB0ZXItPmluaXRfd2FpdF9xX3dva2VuKTsKLQlpZiAoYWRhcHRlci0+aHdfc3RhdHVzICE9IE1XSUZJRVhfSFdfU1RBVFVTX1JFQURZKQotCQlnb3RvIGVycl9pbml0X2Z3OworCWlmICghYWRhcHRlci0+bWZnX21vZGUpIHsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGFkYXB0ZXItPmluaXRfd2FpdF9xLAorCQkJCQkgYWRhcHRlci0+aW5pdF93YWl0X3Ffd29rZW4pOworCQlpZiAoYWRhcHRlci0+aHdfc3RhdHVzICE9IE1XSUZJRVhfSFdfU1RBVFVTX1JFQURZKQorCQkJZ290byBlcnJfaW5pdF9mdzsKKwl9CiAKIAlwcml2ID0gYWRhcHRlci0+cHJpdltNV0lGSUVYX0JTU19ST0xFX1NUQV07Ci0JaWYgKG13aWZpZXhfcmVnaXN0ZXJfY2ZnODAyMTEoYWRhcHRlcikpIHsKLQkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsCi0JCQkgICAgImNhbm5vdCByZWdpc3RlciB3aXRoIGNmZzgwMjExXG4iKTsKLQkJZ290byBlcnJfaW5pdF9mdzsKKworCWlmICghYWRhcHRlci0+d2lwaHkpIHsKKwkJaWYgKG13aWZpZXhfcmVnaXN0ZXJfY2ZnODAyMTEoYWRhcHRlcikpIHsKKwkJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLAorCQkJCSAgICAiY2Fubm90IHJlZ2lzdGVyIHdpdGggY2ZnODAyMTFcbiIpOworCQkJZ290byBlcnJfaW5pdF9mdzsKKwkJfQogCX0KIAogCWlmIChtd2lmaWV4X2luaXRfY2hhbm5lbF9zY2FuX2dhcChhZGFwdGVyKSkgewpAQCAtNjYyLDE2ICs2NzYsNDEgQEAKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBoYXJkd2FyZSBhbmQgZ2V0cyBmaXJtd2FyZS4KICAqLwotc3RhdGljIGludCBtd2lmaWV4X2luaXRfaHdfZncoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikKK3N0YXRpYyBpbnQgbXdpZmlleF9pbml0X2h3X2Z3KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgICBib29sIHJlcV9md19ub3dhaXQpCiB7CiAJaW50IHJldDsKIAotCXJldCA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCAxLCBhZGFwdGVyLT5md19uYW1lLAotCQkJCSAgICAgIGFkYXB0ZXItPmRldiwgR0ZQX0tFUk5FTCwgYWRhcHRlciwKLQkJCQkgICAgICBtd2lmaWV4X2Z3X2RwYyk7Ci0JaWYgKHJldCA8IDApCi0JCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLAotCQkJICAgICJyZXF1ZXN0X2Zpcm13YXJlX25vd2FpdCBlcnJvciAlZFxuIiwgcmV0KTsKKwkvKiBPdmVycmlkZSBkZWZhdWx0IGZpcm13YXJlIHdpdGggbWFudWZhY3R1cmluZyBvbmUgaWYKKwkgKiBtYW51ZmFjdHVyaW5nIG1vZGUgaXMgZW5hYmxlZAorCSAqLworCWlmIChtZmdfbW9kZSkgeworCQlpZiAoc3RybGNweShhZGFwdGVyLT5md19uYW1lLCBNRkdfRklSTVdBUkUsCisJCQkgICAgc2l6ZW9mKGFkYXB0ZXItPmZ3X25hbWUpKSA+PQorCQkJICAgIHNpemVvZihhZGFwdGVyLT5md19uYW1lKSkgeworCQkJcHJfZXJyKCIlczogZndfbmFtZSB0b28gbG9uZyFcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChyZXFfZndfbm93YWl0KSB7CisJCXJldCA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCAxLCBhZGFwdGVyLT5md19uYW1lLAorCQkJCQkgICAgICBhZGFwdGVyLT5kZXYsIEdGUF9LRVJORUwsIGFkYXB0ZXIsCisJCQkJCSAgICAgIG13aWZpZXhfZndfZHBjKTsKKwkJaWYgKHJldCA8IDApCisJCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwKKwkJCQkgICAgInJlcXVlc3RfZmlybXdhcmVfbm93YWl0IGVycm9yICVkXG4iLCByZXQpOworCX0gZWxzZSB7CisJCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmFkYXB0ZXItPmZpcm13YXJlLAorCQkJCSAgICAgICBhZGFwdGVyLT5md19uYW1lLAorCQkJCSAgICAgICBhZGFwdGVyLT5kZXYpOworCQlpZiAocmV0IDwgMCkKKwkJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLAorCQkJCSAgICAicmVxdWVzdF9maXJtd2FyZSBlcnJvciAlZFxuIiwgcmV0KTsKKwkJZWxzZQorCQkJbXdpZmlleF9md19kcGMoYWRhcHRlci0+ZmlybXdhcmUsICh2b2lkICopYWRhcHRlcik7CisJfQorCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTMyMSw2ICsxMzYwLDE5OSBAQAogfQogCiAvKgorICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBkdXJpbmcgUENJZSBmdW5jdGlvbiBsZXZlbCByZXNldC4gUmVxdWlyZWQKKyAqIGNvZGUgaXMgZXh0cmFjdGVkIGZyb20gbXdpZmlleF9yZW1vdmVfY2FyZCgpCisgKi8KK3N0YXRpYyBpbnQKK213aWZpZXhfc2h1dGRvd25fc3coc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNlbWFwaG9yZSAqc2VtKQoreworCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXY7CisJaW50IGk7CisKKwlpZiAoIWFkYXB0ZXIpCisJCWdvdG8gZXhpdF9yZXR1cm47CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKHNlbSkpCisJCWdvdG8gZXhpdF9zZW1fZXJyOworCisJcHJpdiA9IG13aWZpZXhfZ2V0X3ByaXYoYWRhcHRlciwgTVdJRklFWF9CU1NfUk9MRV9BTlkpOworCW13aWZpZXhfZGVhdXRoZW50aWNhdGUocHJpdiwgTlVMTCk7CisKKwkvKiBXZSBjYW4gbm8gbG9uZ2VyIGhhbmRsZSBpbnRlcnJ1cHRzIG9uY2Ugd2Ugc3RhcnQgZG9pbmcgdGhlIHRlYXJkb3duCisJICogYmVsb3cuCisJICovCisJaWYgKGFkYXB0ZXItPmlmX29wcy5kaXNhYmxlX2ludCkKKwkJYWRhcHRlci0+aWZfb3BzLmRpc2FibGVfaW50KGFkYXB0ZXIpOworCisJYWRhcHRlci0+c3VycHJpc2VfcmVtb3ZlZCA9IHRydWU7CisJbXdpZmlleF90ZXJtaW5hdGVfd29ya3F1ZXVlKGFkYXB0ZXIpOworCisJLyogU3RvcCBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnByaXZfbnVtOyBpKyspIHsKKwkJcHJpdiA9IGFkYXB0ZXItPnByaXZbaV07CisJCWlmIChwcml2ICYmIHByaXYtPm5ldGRldikgeworCQkJbXdpZmlleF9zdG9wX25ldF9kZXZfcXVldWUocHJpdi0+bmV0ZGV2LCBhZGFwdGVyKTsKKwkJCWlmIChuZXRpZl9jYXJyaWVyX29rKHByaXYtPm5ldGRldikpCisJCQkJbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+bmV0ZGV2KTsKKwkJCW5ldGlmX2RldmljZV9kZXRhY2gocHJpdi0+bmV0ZGV2KTsKKwkJfQorCX0KKworCW13aWZpZXhfZGJnKGFkYXB0ZXIsIENNRCwgImNtZDogY2FsbGluZyBtd2lmaWV4X3NodXRkb3duX2Rydi4uLlxuIik7CisJYWRhcHRlci0+aW5pdF93YWl0X3Ffd29rZW4gPSBmYWxzZTsKKworCWlmIChtd2lmaWV4X3NodXRkb3duX2RydihhZGFwdGVyKSA9PSAtRUlOUFJPR1JFU1MpCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhZGFwdGVyLT5pbml0X3dhaXRfcSwKKwkJCQkJIGFkYXB0ZXItPmluaXRfd2FpdF9xX3dva2VuKTsKKwlpZiAoYWRhcHRlci0+aWZfb3BzLmRvd25fZGV2KQorCQlhZGFwdGVyLT5pZl9vcHMuZG93bl9kZXYoYWRhcHRlcik7CisKKwltd2lmaWV4X2RiZyhhZGFwdGVyLCBDTUQsICJjbWQ6IG13aWZpZXhfc2h1dGRvd25fZHJ2IGRvbmVcbiIpOworCWlmIChhdG9taWNfcmVhZCgmYWRhcHRlci0+cnhfcGVuZGluZykgfHwKKwkgICAgYXRvbWljX3JlYWQoJmFkYXB0ZXItPnR4X3BlbmRpbmcpIHx8CisJICAgIGF0b21pY19yZWFkKCZhZGFwdGVyLT5jbWRfcGVuZGluZykpIHsKKwkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsCisJCQkgICAgInJ4X3BlbmRpbmc9JWQsIHR4X3BlbmRpbmc9JWQsXHQiCisJCQkgICAgImNtZF9wZW5kaW5nPSVkXG4iLAorCQkJICAgIGF0b21pY19yZWFkKCZhZGFwdGVyLT5yeF9wZW5kaW5nKSwKKwkJCSAgICBhdG9taWNfcmVhZCgmYWRhcHRlci0+dHhfcGVuZGluZyksCisJCQkgICAgYXRvbWljX3JlYWQoJmFkYXB0ZXItPmNtZF9wZW5kaW5nKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnByaXZfbnVtOyBpKyspIHsKKwkJcHJpdiA9IGFkYXB0ZXItPnByaXZbaV07CisJCWlmICghcHJpdikKKwkJCWNvbnRpbnVlOworCQlydG5sX2xvY2soKTsKKwkJaWYgKHByaXYtPm5ldGRldiAmJgorCQkgICAgcHJpdi0+d2Rldi5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQpCisJCQltd2lmaWV4X2RlbF92aXJ0dWFsX2ludGYoYWRhcHRlci0+d2lwaHksICZwcml2LT53ZGV2KTsKKwkJcnRubF91bmxvY2soKTsKKwl9CisKKwl1cChzZW0pOworZXhpdF9zZW1fZXJyOgorCW13aWZpZXhfZGJnKGFkYXB0ZXIsIElORk8sICIlcywgc3VjY2Vzc2Z1bFxuIiwgX19mdW5jX18pOworZXhpdF9yZXR1cm46CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgZHVyaW5nIFBDSWUgZnVuY3Rpb24gbGV2ZWwgcmVzZXQuIFJlcXVpcmVkCisgKiBjb2RlIGlzIGV4dHJhY3RlZCBmcm9tIG13aWZpZXhfYWRkX2NhcmQoKQorICovCitzdGF0aWMgaW50Cittd2lmaWV4X3JlaW5pdF9zdyhzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2VtYXBob3JlICpzZW0sCisJCSAgc3RydWN0IG13aWZpZXhfaWZfb3BzICppZl9vcHMsIHU4IGlmYWNlX3R5cGUpCit7CisJY2hhciBmd19uYW1lWzMyXTsKKwlzdHJ1Y3QgcGNpZV9zZXJ2aWNlX2NhcmQgKmNhcmQgPSBhZGFwdGVyLT5jYXJkOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZShzZW0pKQorCQlnb3RvIGV4aXRfc2VtX2VycjsKKworCW13aWZpZXhfaW5pdF9sb2NrX2xpc3QoYWRhcHRlcik7CisJaWYgKGFkYXB0ZXItPmlmX29wcy51cF9kZXYpCisJCWFkYXB0ZXItPmlmX29wcy51cF9kZXYoYWRhcHRlcik7CisKKwlhZGFwdGVyLT5pZmFjZV90eXBlID0gaWZhY2VfdHlwZTsKKwlhZGFwdGVyLT5jYXJkX3NlbSA9IHNlbTsKKworCWFkYXB0ZXItPmh3X3N0YXR1cyA9IE1XSUZJRVhfSFdfU1RBVFVTX0lOSVRJQUxJWklORzsKKwlhZGFwdGVyLT5zdXJwcmlzZV9yZW1vdmVkID0gZmFsc2U7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYWRhcHRlci0+aW5pdF93YWl0X3EpOworCWFkYXB0ZXItPmlzX3N1c3BlbmRlZCA9IGZhbHNlOworCWFkYXB0ZXItPmhzX2FjdGl2YXRlZCA9IGZhbHNlOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFkYXB0ZXItPmhzX2FjdGl2YXRlX3dhaXRfcSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYWRhcHRlci0+Y21kX3dhaXRfcS53YWl0KTsKKwlhZGFwdGVyLT5jbWRfd2FpdF9xLnN0YXR1cyA9IDA7CisJYWRhcHRlci0+c2Nhbl93YWl0X3Ffd29rZW4gPSBmYWxzZTsKKworCWlmICgobnVtX3Bvc3NpYmxlX2NwdXMoKSA+IDEpIHx8IGFkYXB0ZXItPmlmYWNlX3R5cGUgPT0gTVdJRklFWF9VU0IpCisJCWFkYXB0ZXItPnJ4X3dvcmtfZW5hYmxlZCA9IHRydWU7CisKKwlhZGFwdGVyLT53b3JrcXVldWUgPQorCQlhbGxvY193b3JrcXVldWUoIk1XSUZJRVhfV09SS19RVUVVRSIsCisJCQkJV1FfSElHSFBSSSB8IFdRX01FTV9SRUNMQUlNIHwgV1FfVU5CT1VORCwgMSk7CisJaWYgKCFhZGFwdGVyLT53b3JrcXVldWUpCisJCWdvdG8gZXJyX2ttYWxsb2M7CisKKwlJTklUX1dPUksoJmFkYXB0ZXItPm1haW5fd29yaywgbXdpZmlleF9tYWluX3dvcmtfcXVldWUpOworCisJaWYgKGFkYXB0ZXItPnJ4X3dvcmtfZW5hYmxlZCkgeworCQlhZGFwdGVyLT5yeF93b3JrcXVldWUgPSBhbGxvY193b3JrcXVldWUoIk1XSUZJRVhfUlhfV09SS19RVUVVRSIsCisJCQkJCQkJV1FfSElHSFBSSSB8CisJCQkJCQkJV1FfTUVNX1JFQ0xBSU0gfAorCQkJCQkJCVdRX1VOQk9VTkQsIDEpOworCQlpZiAoIWFkYXB0ZXItPnJ4X3dvcmtxdWV1ZSkKKwkJCWdvdG8gZXJyX2ttYWxsb2M7CisJCUlOSVRfV09SSygmYWRhcHRlci0+cnhfd29yaywgbXdpZmlleF9yeF93b3JrX3F1ZXVlKTsKKwl9CisKKwkvKiBSZWdpc3RlciB0aGUgZGV2aWNlLiBGaWxsIHVwIHRoZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlIHdpdGgKKwkgKiByZWxldmFudCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjYXJkLiBTb21lIGNvZGUgZXh0cmFjdGVkIGZyb20KKwkgKiBtd2lmaWV4X3JlZ2lzdGVyX2RldigpCisJICovCisJbXdpZmlleF9kYmcoYWRhcHRlciwgSU5GTywgIiVzLCBtd2lmaWV4X2luaXRfaHdfZncoKS4uLlxuIiwgX19mdW5jX18pOworCXN0cmNweShmd19uYW1lLCBhZGFwdGVyLT5md19uYW1lKTsKKwlzdHJjcHkoYWRhcHRlci0+ZndfbmFtZSwgUENJRTg5OTdfREVGQVVMVF9XSUZJRldfTkFNRSk7CisKKwlhZGFwdGVyLT50eF9idWZfc2l6ZSA9IGNhcmQtPnBjaWUudHhfYnVmX3NpemU7CisJYWRhcHRlci0+ZXh0X3NjYW4gPSBjYXJkLT5wY2llLmNhbl9leHRfc2NhbjsKKwlpZiAobXdpZmlleF9pbml0X2h3X2Z3KGFkYXB0ZXIsIGZhbHNlKSkgeworCQlzdHJjcHkoYWRhcHRlci0+ZndfbmFtZSwgZndfbmFtZSk7CisJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLAorCQkJICAgICIlczogZmlybXdhcmUgaW5pdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfaW5pdF9mdzsKKwl9CisJc3RyY3B5KGFkYXB0ZXItPmZ3X25hbWUsIGZ3X25hbWUpOworCW13aWZpZXhfZGJnKGFkYXB0ZXIsIElORk8sICIlcywgc3VjY2Vzc2Z1bFxuIiwgX19mdW5jX18pOworCXVwKHNlbSk7CisJcmV0dXJuIDA7CisKK2Vycl9pbml0X2Z3OgorCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLCAiaW5mbzogJXM6IHVucmVnaXN0ZXIgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CisJaWYgKGFkYXB0ZXItPmlmX29wcy51bnJlZ2lzdGVyX2RldikKKwkJYWRhcHRlci0+aWZfb3BzLnVucmVnaXN0ZXJfZGV2KGFkYXB0ZXIpOworCWlmIChhZGFwdGVyLT5od19zdGF0dXMgPT0gTVdJRklFWF9IV19TVEFUVVNfUkVBRFkpIHsKKwkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsCisJCQkgICAgImluZm86ICVzOiBzaHV0ZG93biBtd2lmaWV4XG4iLCBfX2Z1bmNfXyk7CisJCWFkYXB0ZXItPmluaXRfd2FpdF9xX3dva2VuID0gZmFsc2U7CisKKwkJaWYgKG13aWZpZXhfc2h1dGRvd25fZHJ2KGFkYXB0ZXIpID09IC1FSU5QUk9HUkVTUykKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhZGFwdGVyLT5pbml0X3dhaXRfcSwKKwkJCQkJCSBhZGFwdGVyLT5pbml0X3dhaXRfcV93b2tlbik7CisJfQorCitlcnJfa21hbGxvYzoKKwltd2lmaWV4X3Rlcm1pbmF0ZV93b3JrcXVldWUoYWRhcHRlcik7CisJYWRhcHRlci0+c3VycHJpc2VfcmVtb3ZlZCA9IHRydWU7CisJdXAoc2VtKTsKK2V4aXRfc2VtX2VycjoKKwltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLCAiJXMsIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHByZSBhbmQgcG9zdCBQQ0llIGZ1bmN0aW9uIGxldmVsIHJlc2V0cy4KKyAqIEl0IHBlcmZvcm1zIHNvZnR3YXJlIGNsZWFudXAgd2l0aG91dCB0b3VjaGluZyBQQ0llIHNwZWNpZmljIGNvZGUuCisgKiBBbHNvLCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gUENJZSBzdHVmZiBpcyBza2lwcGVkLgorICovCit2b2lkIG13aWZpZXhfZG9fZmxyKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgcHJlcGFyZSkKK3sKKwlzdHJ1Y3QgbXdpZmlleF9pZl9vcHMgaWZfb3BzOworCisJaWYgKCFwcmVwYXJlKSB7CisJCW13aWZpZXhfcmVpbml0X3N3KGFkYXB0ZXIsIGFkYXB0ZXItPmNhcmRfc2VtLCAmaWZfb3BzLAorCQkJCSAgYWRhcHRlci0+aWZhY2VfdHlwZSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KCZpZl9vcHMsICZhZGFwdGVyLT5pZl9vcHMsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IG13aWZpZXhfaWZfb3BzKSk7CisJCW13aWZpZXhfc2h1dGRvd25fc3coYWRhcHRlciwgYWRhcHRlci0+Y2FyZF9zZW0pOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKG13aWZpZXhfZG9fZmxyKTsKKworLyoKICAqIFRoaXMgZnVuY3Rpb24gYWRkcyB0aGUgY2FyZC4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIGZvbGxvd2luZyBtYWpvciBzdGVwcyB0byBzZXQgdXAgdGhlIGRldmljZSAtCkBAIC0xMzkxLDcgKzE2MjMsNyBAQAogCQlnb3RvIGVycl9yZWdpc3RlcmRldjsKIAl9CiAKLQlpZiAobXdpZmlleF9pbml0X2h3X2Z3KGFkYXB0ZXIpKSB7CisJaWYgKG13aWZpZXhfaW5pdF9od19mdyhhZGFwdGVyLCB0cnVlKSkgewogCQlwcl9lcnIoIiVzOiBmaXJtd2FyZSBpbml0IGZhaWxlZFxuIiwgX19mdW5jX18pOwogCQlnb3RvIGVycl9pbml0X2Z3OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvbWFpbi5oCmluZGV4IDlmNmJiNDAuLjI2ZGYyOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21haW4uaApAQCAtNTgsNiArNTgsNyBAQAogI2luY2x1ZGUgInNkaW8uaCIKIAogZXh0ZXJuIGNvbnN0IGNoYXIgZHJpdmVyX3ZlcnNpb25bXTsKK2V4dGVybiBib29sIG1mZ19tb2RlOwogCiBzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyOwogc3RydWN0IG13aWZpZXhfcHJpdmF0ZTsKQEAgLTY3NSw2ICs2NzYsNyBAQAogCXN0cnVjdCBtd2lmaWV4X3VzZXJfc2Nhbl9jaGFuIGhpZGRlbl9jaGFuW01XSUZJRVhfVVNFUl9TQ0FOX0NIQU5fTUFYXTsKIAl1OCBhc3NvY19yZXNwX2h0X3BhcmFtOwogCWJvb2wgaHRfcGFyYW1fcHJlc2VudDsKKwl1OCByYW5kb21fbWFjW0VUSF9BTEVOXTsKIH07CiAKIApAQCAtODI3LDYgKzgyOSw4IEBACiAJdm9pZCAoKmRlYWdncl9wa3QpKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKiwgc3RydWN0IHNrX2J1ZmYgKik7CiAJdm9pZCAoKm11bHRpX3BvcnRfcmVzeW5jKShzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICopOwogCWJvb2wgKCppc19wb3J0X3JlYWR5KShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICopOworCXZvaWQgKCpkb3duX2Rldikoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqKTsKKwl2b2lkICgqdXBfZGV2KShzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICopOwogfTsKIAogc3RydWN0IG13aWZpZXhfYWRhcHRlciB7CkBAIC05ODksNiArOTkzLDcgQEAKIAl1MzIgZHJ2X2luZm9fc2l6ZTsKIAlib29sIHNjYW5fY2hhbl9nYXBfZW5hYmxlZDsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJ4X2RhdGFfcTsKKwlib29sIG1mZ19tb2RlOwogCXN0cnVjdCBtd2lmaWV4X2NoYW5fc3RhdHMgKmNoYW5fc3RhdHM7CiAJdTMyIG51bV9pbl9jaGFuX3N0YXRzOwogCWludCBzdXJ2ZXlfaWR4OwpAQCAtMTAwNCw2ICsxMDA5LDcgQEAKIAlib29sIHVzYl9tY19zdGF0dXM7CiAJYm9vbCB1c2JfbWNfc2V0dXA7CiAJc3RydWN0IGNmZzgwMjExX3dvd2xhbl9uZF9pbmZvICpuZF9pbmZvOworCXN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpyZWdkOwogfTsKIAogdm9pZCBtd2lmaWV4X3Byb2Nlc3NfdHhfcXVldWUoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcik7CkBAIC0xNjI1LDQgKzE2MzEsNSBAQAogdm9pZCBtd2lmaWV4X2Rldl9kZWJ1Z2ZzX2luaXQoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdik7CiB2b2lkIG13aWZpZXhfZGV2X2RlYnVnZnNfcmVtb3ZlKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYpOwogI2VuZGlmCit2b2lkIG13aWZpZXhfZG9fZmxyKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgcHJlcGFyZSk7CiAjZW5kaWYgLyogIV9NV0lGSUVYX01BSU5fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9wY2llLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvcGNpZS5jCmluZGV4IDQ1M2FiNmEuLjNjM2M0ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9wY2llLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3BjaWUuYwpAQCAtMjI1LDcgKzIyNSw3IEBACiAJaWYgKCFhZGFwdGVyIHx8ICFhZGFwdGVyLT5wcml2X251bSkKIAkJcmV0dXJuOwogCi0JaWYgKHVzZXJfcm1tb2QpIHsKKwlpZiAodXNlcl9ybW1vZCAmJiAhYWRhcHRlci0+bWZnX21vZGUpIHsKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIAkJaWYgKGFkYXB0ZXItPmlzX3N1c3BlbmRlZCkKIAkJCW13aWZpZXhfcGNpZV9yZXN1bWUoJnBkZXYtPmRldik7CkBAIC0yNzcsNiArMjc3LDUyIEBACiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBtd2lmaWV4X2lkcyk7CiAKK3N0YXRpYyB2b2lkIG13aWZpZXhfcGNpZV9yZXNldF9ub3RpZnkoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGJvb2wgcHJlcGFyZSkKK3sKKwlzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBwY2llX3NlcnZpY2VfY2FyZCAqY2FyZDsKKworCWlmICghcGRldikgeworCQlwcl9lcnIoIiVzOiBQQ0llIGRldmljZSBpcyBub3Qgc3BlY2lmaWVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwljYXJkID0gKHN0cnVjdCBwY2llX3NlcnZpY2VfY2FyZCAqKXBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoIWNhcmQgfHwgIWNhcmQtPmFkYXB0ZXIpIHsKKwkJcHJfZXJyKCIlczogQ2FyZCBvciBhZGFwdGVyIHN0cnVjdHVyZSBpcyBub3QgdmFsaWQgKCVsZClcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgKGxvbmcpY2FyZCk7CisJCXJldHVybjsKKwl9CisKKwlhZGFwdGVyID0gY2FyZC0+YWRhcHRlcjsKKwltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLAorCQkgICAgIiVzOiB2ZW5kb3I9MHglNC4wNHggZGV2aWNlPTB4JTQuMDR4IHJldj0lZCAlc1xuIiwKKwkJICAgIF9fZnVuY19fLCBwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwKKwkJICAgIHBkZXYtPnJldmlzaW9uLAorCQkgICAgcHJlcGFyZSA/ICJQcmUtRkxSIiA6ICJQb3N0LUZMUiIpOworCisJaWYgKHByZXBhcmUpIHsKKwkJLyogS2VybmVsIHdvdWxkIGJlIHBlcmZvcm1pbmcgRkxSIGFmdGVyIHRoaXMgbm90aWZpY2F0aW9uLgorCQkgKiBDbGVhbnVwIGFsbCBzb2Z0d2FyZSB3aXRob3V0IGNsZWFuaW5nIGFueXRoaW5nIHJlbGF0ZWQgdG8KKwkJICogUENJZSBhbmQgSFcuCisJCSAqLworCQltd2lmaWV4X2RvX2ZscihhZGFwdGVyLCBwcmVwYXJlKTsKKwkJYWRhcHRlci0+c3VycHJpc2VfcmVtb3ZlZCA9IHRydWU7CisJfSBlbHNlIHsKKwkJLyogS2VybmVsIHN0b3JlcyBhbmQgcmVzdG9yZXMgUENJZSBmdW5jdGlvbiBjb250ZXh0IGJlZm9yZSBhbmQKKwkJICogYWZ0ZXIgcGVyZm9ybWluZyBGTFIgcmVzcGVjdGl2ZWx5LiBSZWNvbmZpZ3VyZSB0aGUgc29mdHdhcmUKKwkJICogYW5kIGZpcm13YXJlIGluY2x1ZGluZyBmaXJtd2FyZSByZWRvd25sb2FkCisJCSAqLworCQlhZGFwdGVyLT5zdXJwcmlzZV9yZW1vdmVkID0gZmFsc2U7CisJCW13aWZpZXhfZG9fZmxyKGFkYXB0ZXIsIHByZXBhcmUpOworCX0KKwltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLCAiJXMsIHN1Y2Nlc3NmdWxcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZXJyb3JfaGFuZGxlcnMgbXdpZmlleF9wY2llX2Vycl9oYW5kbGVyW10gPSB7CisJCXsgLnJlc2V0X25vdGlmeSA9IG13aWZpZXhfcGNpZV9yZXNldF9ub3RpZnksIH0sCit9OworCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAvKiBQb3dlciBNYW5hZ2VtZW50IEhvb2tzICovCiBzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMobXdpZmlleF9wY2llX3BtX29wcywgbXdpZmlleF9wY2llX3N1c3BlbmQsCkBAIC0yOTUsNiArMzQxLDcgQEAKIAl9LAogI2VuZGlmCiAJLnNodXRkb3duID0gbXdpZmlleF9wY2llX3NodXRkb3duLAorCS5lcnJfaGFuZGxlciA9IG13aWZpZXhfcGNpZV9lcnJfaGFuZGxlciwKIH07CiAKIC8qCkBAIC0xOTU2LDggKzIwMDMsNiBAQAogCQkJaWYgKGZpcm13YXJlX2xlbiAtIG9mZnNldCA8IHR4bGVuKQogCQkJCXR4bGVuID0gZmlybXdhcmVfbGVuIC0gb2Zmc2V0OwogCi0JCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLCAiLiIpOwotCiAJCQl0eF9ibG9ja3MgPSAodHhsZW4gKyBjYXJkLT5wY2llLmJsa3N6X2Z3X2RsIC0gMSkgLwogCQkJCSAgICBjYXJkLT5wY2llLmJsa3N6X2Z3X2RsOwogCkBAIC0yMDQzLDYgKzIwODgsMTAgQEAKIAkJCXJldCA9IC0xOwogCQllbHNlCiAJCQlyZXQgPSAwOworCisJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIElORk8sICJUcnkgJWQgaWYgRlcgaXMgcmVhZHkgPCVkLCUjeD4iLAorCQkJICAgIHRyaWVzLCByZXQsIGZpcm13YXJlX3N0YXQpOworCiAJCWlmIChyZXQpCiAJCQljb250aW51ZTsKIAkJaWYgKGZpcm13YXJlX3N0YXQgPT0gRklSTVdBUkVfUkVBRFlfUENJRSkgewpAQCAtMjA3NCw4ICsyMTIzLDcgQEAKIAkJYWRhcHRlci0+d2lubmVyID0gMTsKIAl9IGVsc2UgewogCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwKLQkJCSAgICAiUENJLUUgaXMgbm90IHRoZSB3aW5uZXIgPCUjeCwlZD4sIGV4aXQgZG5sZFxuIiwKLQkJCSAgICByZXQsIGFkYXB0ZXItPndpbm5lcik7CisJCQkgICAgIlBDSS1FIGlzIG5vdCB0aGUgd2lubmVyIDwlI3g+Iiwgd2lubmVyKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjg2Myw3ICsyOTExLDcgQEAKIHN0YXRpYyB2b2lkIG13aWZpZXhfcGNpZV9nZXRfZndfbmFtZShzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKQogewogCWludCByZXZpc2lvbl9pZCA9IDA7Ci0JaW50IHZlcnNpb247CisJaW50IHZlcnNpb24sIG1hZ2ljOwogCXN0cnVjdCBwY2llX3NlcnZpY2VfY2FyZCAqY2FyZCA9IGFkYXB0ZXItPmNhcmQ7CiAKIAlzd2l0Y2ggKGNhcmQtPmRldi0+ZGV2aWNlKSB7CkBAIC0yODg4LDMwICsyOTM2LDE5IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBQQ0lFX0RFVklDRV9JRF9NQVJWRUxMXzg4Vzg5OTc6Ci0JCW13aWZpZXhfcmVhZF9yZWcoYWRhcHRlciwgMHgwYzQ4LCAmcmV2aXNpb25faWQpOworCQltd2lmaWV4X3JlYWRfcmVnKGFkYXB0ZXIsIDB4OCwgJnJldmlzaW9uX2lkKTsKIAkJbXdpZmlleF9yZWFkX3JlZyhhZGFwdGVyLCAweDBjZDAsICZ2ZXJzaW9uKTsKKwkJbXdpZmlleF9yZWFkX3JlZyhhZGFwdGVyLCAweDBjZDQsICZtYWdpYyk7CisJCXJldmlzaW9uX2lkICY9IDB4ZmY7CiAJCXZlcnNpb24gJj0gMHg3OwotCQlzd2l0Y2ggKHJldmlzaW9uX2lkKSB7Ci0JCWNhc2UgUENJRTg5OTdfVjI6Ci0JCQlpZiAodmVyc2lvbiA9PSBDSElQX1ZFUl9QQ0lFVUFSVCkKLQkJCQlzdHJjcHkoYWRhcHRlci0+ZndfbmFtZSwKLQkJCQkgICAgICAgUENJRVVBUlQ4OTk3X0ZXX05BTUVfVjIpOwotCQkJZWxzZQotCQkJCXN0cmNweShhZGFwdGVyLT5md19uYW1lLAotCQkJCSAgICAgICBQQ0lFVVNCODk5N19GV19OQU1FX1YyKTsKLQkJCWJyZWFrOwotCQljYXNlIFBDSUU4OTk3X1o6Ci0JCQlpZiAodmVyc2lvbiA9PSBDSElQX1ZFUl9QQ0lFVUFSVCkKLQkJCQlzdHJjcHkoYWRhcHRlci0+ZndfbmFtZSwKLQkJCQkgICAgICAgUENJRVVBUlQ4OTk3X0ZXX05BTUVfWik7Ci0JCQllbHNlCi0JCQkJc3RyY3B5KGFkYXB0ZXItPmZ3X25hbWUsCi0JCQkJICAgICAgIFBDSUVVU0I4OTk3X0ZXX05BTUVfWik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXN0cmNweShhZGFwdGVyLT5md19uYW1lLCBQQ0lFODk5N19ERUZBVUxUX0ZXX05BTUUpOwotCQkJYnJlYWs7Ci0JCX0KKwkJbWFnaWMgJj0gMHhmZjsKKwkJaWYgKHJldmlzaW9uX2lkID09IFBDSUU4OTk3X0ExICYmCisJCSAgICBtYWdpYyA9PSBDSElQX01BR0lDX1ZBTFVFICYmCisJCSAgICB2ZXJzaW9uID09IENISVBfVkVSX1BDSUVVQVJUKQorCQkJc3RyY3B5KGFkYXB0ZXItPmZ3X25hbWUsIFBDSUVVQVJUODk5N19GV19OQU1FX1Y0KTsKKwkJZWxzZQorCQkJc3RyY3B5KGFkYXB0ZXItPmZ3X25hbWUsIFBDSUVVU0I4OTk3X0ZXX05BTUVfVjQpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC0yOTUyLDcgKzI5ODksNiBAQAogc3RhdGljIHZvaWQgbXdpZmlleF91bnJlZ2lzdGVyX2RldihzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBwY2llX3NlcnZpY2VfY2FyZCAqY2FyZCA9IGFkYXB0ZXItPmNhcmQ7Ci0JY29uc3Qgc3RydWN0IG13aWZpZXhfcGNpZV9jYXJkX3JlZyAqcmVnOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCWludCBpOwogCkBAIC0yOTc2LDggKzMwMTIsOTAgQEAKIAkJCWlmIChjYXJkLT5tc2lfZW5hYmxlKQogCQkJCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKIAkgICAgICAgfQorCX0KK30KIAotCQlyZWcgPSBjYXJkLT5wY2llLnJlZzsKKy8qIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFBDSS1FIGhvc3QgbWVtb3J5IHNwYWNlLCBXQ0IgcmluZ3MsIGV0Yy4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9ucyBzdGVwcyBhcmUgZm9sbG93ZWQgLQorICogICAgICAtIEFsbG9jYXRlIFRYQkQgcmluZyBidWZmZXJzCisgKiAgICAgIC0gQWxsb2NhdGUgUlhCRCByaW5nIGJ1ZmZlcnMKKyAqICAgICAgLSBBbGxvY2F0ZSBldmVudCBCRCByaW5nIGJ1ZmZlcnMKKyAqICAgICAgLSBBbGxvY2F0ZSBjb21tYW5kIHJlc3BvbnNlIHJpbmcgYnVmZmVyCisgKiAgICAgIC0gQWxsb2NhdGUgc2xlZXAgY29va2llIGJ1ZmZlcgorICogUGFydCBvZiBtd2lmaWV4X3BjaWVfaW5pdCgpLCBub3QgcmVzZXQgdGhlIFBDSUUgcmVnaXN0ZXJzCisgKi8KK3N0YXRpYyB2b2lkIG13aWZpZXhfcGNpZV91cF9kZXYoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcGNpZV9zZXJ2aWNlX2NhcmQgKmNhcmQgPSBhZGFwdGVyLT5jYXJkOworCWludCByZXQ7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBjYXJkLT5kZXY7CisJY29uc3Qgc3RydWN0IG13aWZpZXhfcGNpZV9jYXJkX3JlZyAqcmVnID0gY2FyZC0+cGNpZS5yZWc7CisKKwljYXJkLT5jbWRyc3BfYnVmID0gTlVMTDsKKwlyZXQgPSBtd2lmaWV4X3BjaWVfY3JlYXRlX3R4YmRfcmluZyhhZGFwdGVyKTsKKwlpZiAocmV0KSB7CisJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSB0eGJkIHJpbmdcbiIpOworCQlnb3RvIGVycl9jcmVfdHhiZDsKKwl9CisKKwlyZXQgPSBtd2lmaWV4X3BjaWVfY3JlYXRlX3J4YmRfcmluZyhhZGFwdGVyKTsKKwlpZiAocmV0KSB7CisJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSByeGJkIHJpbmdcbiIpOworCQlnb3RvIGVycl9jcmVfcnhiZDsKKwl9CisKKwlyZXQgPSBtd2lmaWV4X3BjaWVfY3JlYXRlX2V2dGJkX3JpbmcoYWRhcHRlcik7CisJaWYgKHJldCkgeworCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgZXZ0YmQgcmluZ1xuIik7CisJCWdvdG8gZXJyX2NyZV9ldnRiZDsKKwl9CisKKwlyZXQgPSBtd2lmaWV4X3BjaWVfYWxsb2NfY21kcnNwX2J1ZihhZGFwdGVyKTsKKwlpZiAocmV0KSB7CisJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNtZGJ1ZiBidWZmZXJcbiIpOworCQlnb3RvIGVycl9hbGxvY19jbWRidWY7CisJfQorCisJaWYgKHJlZy0+c2xlZXBfY29va2llKSB7CisJCXJldCA9IG13aWZpZXhfcGNpZV9hbGxvY19zbGVlcF9jb29raWVfYnVmKGFkYXB0ZXIpOworCQlpZiAocmV0KSB7CisJCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzbGVlcF9jb29raWUgYnVmZmVyXG4iKTsKKwkJCWdvdG8gZXJyX2FsbG9jX2Nvb2tpZTsKKwkJfQorCX0gZWxzZSB7CisJCWNhcmQtPnNsZWVwX2Nvb2tpZV92YmFzZSA9IE5VTEw7CisJfQorCXJldHVybjsKKworZXJyX2FsbG9jX2Nvb2tpZToKKwltd2lmaWV4X3BjaWVfZGVsZXRlX2NtZHJzcF9idWYoYWRhcHRlcik7CitlcnJfYWxsb2NfY21kYnVmOgorCW13aWZpZXhfcGNpZV9kZWxldGVfZXZ0YmRfcmluZyhhZGFwdGVyKTsKK2Vycl9jcmVfZXZ0YmQ6CisJbXdpZmlleF9wY2llX2RlbGV0ZV9yeGJkX3JpbmcoYWRhcHRlcik7CitlcnJfY3JlX3J4YmQ6CisJbXdpZmlleF9wY2llX2RlbGV0ZV90eGJkX3JpbmcoYWRhcHRlcik7CitlcnJfY3JlX3R4YmQ6CisJcGNpX2lvdW5tYXAocGRldiwgY2FyZC0+cGNpX21tYXAxKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgdGhlIFBDSS1FIGhvc3QgbWVtb3J5IHNwYWNlLgorICogU29tZSBjb2RlIGlzIGV4dHJhY3RlZCBmcm9tIG13aWZpZXhfdW5yZWdpc3Rlcl9kZXYoKQorICoKKyAqLworc3RhdGljIHZvaWQgbXdpZmlleF9wY2llX2Rvd25fZGV2KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHBjaWVfc2VydmljZV9jYXJkICpjYXJkID0gYWRhcHRlci0+Y2FyZDsKKwljb25zdCBzdHJ1Y3QgbXdpZmlleF9wY2llX2NhcmRfcmVnICpyZWcgPSBjYXJkLT5wY2llLnJlZzsKKworCWlmIChtd2lmaWV4X3dyaXRlX3JlZyhhZGFwdGVyLCByZWctPmRydl9yZHksIDB4MDAwMDAwMDApKQorCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwgIkZhaWxlZCB0byB3cml0ZSBkcml2ZXIgbm90LXJlYWR5IHNpZ25hdHVyZVxuIik7CisKKwlhZGFwdGVyLT5zZXFfbnVtID0gMDsKKwlhZGFwdGVyLT50eF9idWZfc2l6ZSA9IE1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV80SzsKKworCWlmIChjYXJkKSB7CiAJCWlmIChyZWctPnNsZWVwX2Nvb2tpZSkKIAkJCW13aWZpZXhfcGNpZV9kZWxldGVfc2xlZXBfY29va2llX2J1ZihhZGFwdGVyKTsKIApAQCAtMjk4Nyw2ICszMTA1LDggQEAKIAkJbXdpZmlleF9wY2llX2RlbGV0ZV90eGJkX3JpbmcoYWRhcHRlcik7CiAJCWNhcmQtPmNtZHJzcF9idWYgPSBOVUxMOwogCX0KKworCXJldHVybjsKIH0KIAogc3RhdGljIHN0cnVjdCBtd2lmaWV4X2lmX29wcyBwY2llX29wcyA9IHsKQEAgLTMwMTMsNiArMzEzMyw4IEBACiAJLmNsZWFuX3BjaWVfcmluZyA9CQltd2lmaWV4X2NsZWFuX3BjaWVfcmluZ19idWYsCiAJLnJlZ19kdW1wID0JCQltd2lmaWV4X3BjaWVfcmVnX2R1bXAsCiAJLmRldmljZV9kdW1wID0JCQltd2lmaWV4X3BjaWVfZGV2aWNlX2R1bXAsCisJLmRvd25fZGV2ID0JCQltd2lmaWV4X3BjaWVfZG93bl9kZXYsCisJLnVwX2RldiA9CQkJbXdpZmlleF9wY2llX3VwX2RldiwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvcGNpZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3BjaWUuaAppbmRleCBmMDUwNjFjLi40NmY5OWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvcGNpZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9wY2llLmgKQEAgLTMyLDExICszMiw5IEBACiAjZGVmaW5lIFBDSUU4ODk3X0RFRkFVTFRfRldfTkFNRSAibXJ2bC9wY2llODg5N191YXBzdGEuYmluIgogI2RlZmluZSBQQ0lFODg5N19BMF9GV19OQU1FICJtcnZsL3BjaWU4ODk3X3VhcHN0YV9hMC5iaW4iCiAjZGVmaW5lIFBDSUU4ODk3X0IwX0ZXX05BTUUgIm1ydmwvcGNpZTg4OTdfdWFwc3RhLmJpbiIKLSNkZWZpbmUgUENJRTg5OTdfREVGQVVMVF9GV19OQU1FICJtcnZsL3BjaWV1c2I4OTk3X2NvbWJvX3YyLmJpbiIKLSNkZWZpbmUgUENJRVVBUlQ4OTk3X0ZXX05BTUVfWiAibXJ2bC9wY2lldWFydDg5OTdfY29tYm8uYmluIgotI2RlZmluZSBQQ0lFVUFSVDg5OTdfRldfTkFNRV9WMiAibXJ2bC9wY2lldWFydDg5OTdfY29tYm9fdjIuYmluIgotI2RlZmluZSBQQ0lFVVNCODk5N19GV19OQU1FX1ogIm1ydmwvcGNpZXVzYjg5OTdfY29tYm8uYmluIgotI2RlZmluZSBQQ0lFVVNCODk5N19GV19OQU1FX1YyICJtcnZsL3BjaWV1c2I4OTk3X2NvbWJvX3YyLmJpbiIKKyNkZWZpbmUgUENJRVVBUlQ4OTk3X0ZXX05BTUVfVjQgIm1ydmwvcGNpZXVhcnQ4OTk3X2NvbWJvX3Y0LmJpbiIKKyNkZWZpbmUgUENJRVVTQjg5OTdfRldfTkFNRV9WNCAibXJ2bC9wY2lldXNiODk5N19jb21ib192NC5iaW4iCisjZGVmaW5lIFBDSUU4OTk3X0RFRkFVTFRfV0lGSUZXX05BTUUgIm1ydmwvcGNpZTg5OTdfd2xhbl92NC5iaW4iCiAKICNkZWZpbmUgUENJRV9WRU5ET1JfSURfTUFSVkVMTCAgICAgICAgICAgICAgKDB4MTFhYikKICNkZWZpbmUgUENJRV9WRU5ET1JfSURfVjJfTUFSVkVMTCAgICAgICAgICAgKDB4MWI0YikKQEAgLTQ2LDkgKzQ0LDEwIEBACiAKICNkZWZpbmUgUENJRTg4OTdfQTAJMHgxMTAwCiAjZGVmaW5lIFBDSUU4ODk3X0IwCTB4MTIwMAotI2RlZmluZSBQQ0lFODk5N19aCTB4MAotI2RlZmluZSBQQ0lFODk5N19WMgkweDQ3MQorI2RlZmluZSBQQ0lFODk5N19BMAkweDEwCisjZGVmaW5lIFBDSUU4OTk3X0ExCTB4MTEKICNkZWZpbmUgQ0hJUF9WRVJfUENJRVVBUlQJMHgzCisjZGVmaW5lIENISVBfTUFHSUNfVkFMVUUJMHgyNAogCiAvKiBDb25zdGFudHMgZm9yIEJ1ZmZlciBEZXNjcmlwdG9yIChCRCkgcmluZ3MgKi8KICNkZWZpbmUgTVdJRklFWF9NQVhfVFhSWF9CRAkJCTB4MjAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zY2FuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc2Nhbi5jCmluZGV4IDIxZWM4NDcuLjk3Yzk3NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zY2FuLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NjYW4uYwpAQCAtODIwLDYgKzgyMCw3IEBACiAJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CiAJc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfbnVtX3Byb2JlcyAqbnVtX3Byb2Jlc190bHY7CiAJc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfc2Nhbl9jaGFuX2dhcCAqY2hhbl9nYXBfdGx2OworCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX3JhbmRvbV9tYWMgKnJhbmRvbV9tYWNfdGx2OwogCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX3dpbGRjYXJkX3NzaWRfcGFyYW1zICp3aWxkY2FyZF9zc2lkX3RsdjsKIAlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19ic3NpZF9saXN0ICpic3NpZF90bHY7CiAJdTggKnRsdl9wb3M7CkBAIC04MzUsNiArODM2LDcgQEAKIAl1OCBzc2lkX2ZpbHRlcjsKIAlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGNhcCAqaHRfY2FwOwogCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2Jzc19tb2RlICpic3NfbW9kZTsKKwljb25zdCB1OCB6ZXJvX21hY1s2XSA9IHswLCAwLCAwLCAwLCAwLCAwfTsKIAogCS8qIFRoZSB0bHZfYnVmX2xlbiBpcyBjYWxjdWxhdGVkIGZvciBlYWNoIHNjYW4gY29tbWFuZC4gIFRoZSBUTFZzIGFkZGVkCiAJICAgaW4gdGhpcyByb3V0aW5lIHdpbGwgYmUgcHJlc2VydmVkIHNpbmNlIHRoZSByb3V0aW5lIHRoYXQgc2VuZHMgdGhlCkBAIC05NjcsNiArOTY5LDE4IEBACiAJCQl0bHZfcG9zICs9CiAJCQkJICBzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfc2Nhbl9jaGFuX2dhcCk7CiAJCX0KKworCQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwodXNlcl9zY2FuX2luLT5yYW5kb21fbWFjLCB6ZXJvX21hYykpIHsKKwkJCXJhbmRvbV9tYWNfdGx2ID0gKHZvaWQgKil0bHZfcG9zOworCQkJcmFuZG9tX21hY190bHYtPmhlYWRlci50eXBlID0KKwkJCQkJIGNwdV90b19sZTE2KFRMVl9UWVBFX1JBTkRPTV9NQUMpOworCQkJcmFuZG9tX21hY190bHYtPmhlYWRlci5sZW4gPQorCQkJCSAgICBjcHVfdG9fbGUxNihzaXplb2YocmFuZG9tX21hY190bHYtPm1hYykpOworCQkJZXRoZXJfYWRkcl9jb3B5KHJhbmRvbV9tYWNfdGx2LT5tYWMsCisJCQkJCXVzZXJfc2Nhbl9pbi0+cmFuZG9tX21hYyk7CisJCQl0bHZfcG9zICs9CisJCQkJICBzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfcmFuZG9tX21hYyk7CisJCX0KIAl9IGVsc2UgewogCQlzY2FuX2NmZ19vdXQtPmJzc19tb2RlID0gKHU4KSBhZGFwdGVyLT5zY2FuX21vZGU7CiAJCW51bV9wcm9iZXMgPSBhZGFwdGVyLT5zY2FuX3Byb2JlczsKQEAgLTE5MjIsNiArMTkzNiw3IEBACiAJfQogCiAJYWRhcHRlci0+YWN0aXZlX3NjYW5fdHJpZ2dlcmVkID0gdHJ1ZTsKKwlldGhlcl9hZGRyX2NvcHkodXNlcl9zY2FuX2NmZy0+cmFuZG9tX21hYywgcHJpdi0+cmFuZG9tX21hYyk7CiAJdXNlcl9zY2FuX2NmZy0+bnVtX3NzaWRzID0gcHJpdi0+c2Nhbl9yZXF1ZXN0LT5uX3NzaWRzOwogCXVzZXJfc2Nhbl9jZmctPnNzaWRfbGlzdCA9IHByaXYtPnNjYW5fcmVxdWVzdC0+c3NpZHM7CiAKQEAgLTIxNzksMTggKzIxOTQsMTQgQEAKIAogCQlpZiAoY2hhbl9iYW5kX3RsdiAmJiBhZGFwdGVyLT5uZF9pbmZvKSB7CiAJCQlhZGFwdGVyLT5uZF9pbmZvLT5tYXRjaGVzW2lkeF0gPQotCQkJCWt6YWxsb2Moc2l6ZW9mKCpwbWF0Y2gpICsKLQkJCQlzaXplb2YodTMyKSwgR0ZQX0FUT01JQyk7CisJCQkJa3phbGxvYyhzaXplb2YoKnBtYXRjaCkgKyBzaXplb2YodTMyKSwKKwkJCQkJR0ZQX0FUT01JQyk7CiAKIAkJCXBtYXRjaCA9IGFkYXB0ZXItPm5kX2luZm8tPm1hdGNoZXNbaWR4XTsKIAogCQkJaWYgKHBtYXRjaCkgewotCQkJCW1lbXNldChwbWF0Y2gsIDAsIHNpemVvZigqcG1hdGNoKSk7Ci0JCQkJaWYgKGNoYW5fYmFuZF90bHYpIHsKLQkJCQkJcG1hdGNoLT5uX2NoYW5uZWxzID0gMTsKLQkJCQkJcG1hdGNoLT5jaGFubmVsc1swXSA9Ci0JCQkJCQljaGFuX2JhbmQtPmNoYW5fbnVtYmVyOwotCQkJCX0KKwkJCQlwbWF0Y2gtPm5fY2hhbm5lbHMgPSAxOworCQkJCXBtYXRjaC0+Y2hhbm5lbHNbMF0gPSBjaGFuX2JhbmQtPmNoYW5fbnVtYmVyOwogCQkJfQogCQl9CiAKQEAgLTI3NjEsNiArMjc3Miw3IEBACiAJaWYgKCFzY2FuX2NmZykKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlldGhlcl9hZGRyX2NvcHkoc2Nhbl9jZmctPnJhbmRvbV9tYWMsIHByaXYtPnJhbmRvbV9tYWMpOwogCXNjYW5fY2ZnLT5zc2lkX2xpc3QgPSByZXFfc3NpZDsKIAlzY2FuX2NmZy0+bnVtX3NzaWRzID0gMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NkaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zZGlvLmMKaW5kZXggZDNlMTU2MS4uODcxODk1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NkaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc2Rpby5jCkBAIC0xMjIsOSArMTIyLDExIEBACiAJCQkJCSAgICAgICBJUlFGX1RSSUdHRVJfTE9XLAogCQkJCQkgICAgICAgIndpZmlfd2FrZSIsIGNmZyk7CiAJCQlpZiAocmV0KSB7Ci0JCQkJZGV2X2VycihkZXYsCisJCQkJZGV2X2RiZyhkZXYsCiAJCQkJCSJGYWlsZWQgdG8gcmVxdWVzdCBpcnFfd2lmaSAlZCAoJWQpXG4iLAogCQkJCQljZmctPmlycV93aWZpLCByZXQpOworCQkJCWNhcmQtPnBsdF93YWtlX2NmZyA9IE5VTEw7CisJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlkaXNhYmxlX2lycShjZmctPmlycV93aWZpKTsKIAkJfQpAQCAtMjg5LDcgKzI5MSw3IEBACiAKIAltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLCAiaW5mbzogU0RJTyBmdW5jIG51bT0lZFxuIiwgZnVuYy0+bnVtKTsKIAotCWlmICh1c2VyX3JtbW9kKSB7CisJaWYgKHVzZXJfcm1tb2QgJiYgIWFkYXB0ZXItPm1mZ19tb2RlKSB7CiAJCWlmIChhZGFwdGVyLT5pc19zdXNwZW5kZWQpCiAJCQltd2lmaWV4X3NkaW9fcmVzdW1lKGFkYXB0ZXItPmRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zdGFfY21kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2NtZC5jCmluZGV4IDc4OTcwMzcuLjJhMTYyYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zdGFfY21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3N0YV9jbWQuYwpAQCAtNTk4LDYgKzU5OCwxMSBAQAogCQltZW1jcHkoa20tPmtleV9wYXJhbV9zZXQua2V5X3BhcmFtcy5jbWFjX2Flcy5rZXksCiAJCSAgICAgICBlbmNfa2V5LT5rZXlfbWF0ZXJpYWwsIGVuY19rZXktPmtleV9sZW4pOwogCQlsZW4gKz0gc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2NtYWNfYWVzX3BhcmFtKTsKKwl9IGVsc2UgaWYgKGVuY19rZXktPmlzX2lndGtfZGVmX2tleSkgeworCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLAorCQkJICAgICIlczogU2V0IENNQUMgZGVmYXVsdCBLZXkgaW5kZXhcbiIsIF9fZnVuY19fKTsKKwkJa20tPmtleV9wYXJhbV9zZXQua2V5X3R5cGUgPSBLRVlfVFlQRV9JRF9BRVNfQ01BQ19ERUY7CisJCWttLT5rZXlfcGFyYW1fc2V0LmtleV9pZHggPSBlbmNfa2V5LT5rZXlfaW5kZXggJiBLRVlfSU5ERVhfTUFTSzsKIAl9IGVsc2UgewogCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLAogCQkJICAgICIlczogU2V0IEFFUyBLZXlcbiIsIF9fZnVuY19fKTsKQEAgLTcwNiwxNSArNzExLDEwIEBACiAJCQkJICAgIChwcml2LT53ZXBfa2V5X2N1cnJfaW5kZXggJiBLRVlfSU5ERVhfTUFTSykpCiAJCQkJCWtleV9pbmZvIHw9IEtFWV9ERUZBVUxUOwogCQkJfSBlbHNlIHsKLQkJCQlpZiAobWFjKSB7Ci0JCQkJCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihtYWMpKQotCQkJCQkJa2V5X2luZm8gfD0gS0VZX01DQVNUOwotCQkJCQllbHNlCi0JCQkJCQlrZXlfaW5mbyB8PSBLRVlfVU5JQ0FTVCB8Ci0JCQkJCQkJICAgIEtFWV9ERUZBVUxUOwotCQkJCX0gZWxzZSB7CisJCQkJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1hYykpCiAJCQkJCWtleV9pbmZvIHw9IEtFWV9NQ0FTVDsKLQkJCQl9CisJCQkJZWxzZQorCQkJCQlrZXlfaW5mbyB8PSBLRVlfVU5JQ0FTVCB8IEtFWV9ERUZBVUxUOwogCQkJfQogCQl9CiAJCWttLT5rZXlfcGFyYW1fc2V0LmtleV9pbmZvID0gY3B1X3RvX2xlMTYoa2V5X2luZm8pOwpAQCAtMTI0NCwyMCArMTI0NCwyMyBAQAogCQlyZXR1cm4gMDsKIAogCS8qIFNlbmQgdGhlIHJpbmcgYmFzZSBhZGRyZXNzZXMgYW5kIGNvdW50IHRvIGZpcm13YXJlICovCi0JaG9zdF9zcGVjLT50eGJkX2FkZHJfbG8gPSAodTMyKShjYXJkLT50eGJkX3JpbmdfcGJhc2UpOwotCWhvc3Rfc3BlYy0+dHhiZF9hZGRyX2hpID0gKHUzMikoKCh1NjQpY2FyZC0+dHhiZF9yaW5nX3BiYXNlKT4+MzIpOwotCWhvc3Rfc3BlYy0+dHhiZF9jb3VudCA9IE1XSUZJRVhfTUFYX1RYUlhfQkQ7Ci0JaG9zdF9zcGVjLT5yeGJkX2FkZHJfbG8gPSAodTMyKShjYXJkLT5yeGJkX3JpbmdfcGJhc2UpOwotCWhvc3Rfc3BlYy0+cnhiZF9hZGRyX2hpID0gKHUzMikoKCh1NjQpY2FyZC0+cnhiZF9yaW5nX3BiYXNlKT4+MzIpOwotCWhvc3Rfc3BlYy0+cnhiZF9jb3VudCA9IE1XSUZJRVhfTUFYX1RYUlhfQkQ7Ci0JaG9zdF9zcGVjLT5ldnRiZF9hZGRyX2xvID0gKHUzMikoY2FyZC0+ZXZ0YmRfcmluZ19wYmFzZSk7Ci0JaG9zdF9zcGVjLT5ldnRiZF9hZGRyX2hpID0gKHUzMikoKCh1NjQpY2FyZC0+ZXZ0YmRfcmluZ19wYmFzZSk+PjMyKTsKLQlob3N0X3NwZWMtPmV2dGJkX2NvdW50ID0gTVdJRklFWF9NQVhfRVZUX0JEOworCWhvc3Rfc3BlYy0+dHhiZF9hZGRyX2xvID0gY3B1X3RvX2xlMzIoKHUzMikoY2FyZC0+dHhiZF9yaW5nX3BiYXNlKSk7CisJaG9zdF9zcGVjLT50eGJkX2FkZHJfaGkgPQorCQkJY3B1X3RvX2xlMzIoKHUzMikoKCh1NjQpY2FyZC0+dHhiZF9yaW5nX3BiYXNlKSA+PiAzMikpOworCWhvc3Rfc3BlYy0+dHhiZF9jb3VudCA9IGNwdV90b19sZTMyKE1XSUZJRVhfTUFYX1RYUlhfQkQpOworCWhvc3Rfc3BlYy0+cnhiZF9hZGRyX2xvID0gY3B1X3RvX2xlMzIoKHUzMikoY2FyZC0+cnhiZF9yaW5nX3BiYXNlKSk7CisJaG9zdF9zcGVjLT5yeGJkX2FkZHJfaGkgPQorCQkJY3B1X3RvX2xlMzIoKHUzMikoKCh1NjQpY2FyZC0+cnhiZF9yaW5nX3BiYXNlKSA+PiAzMikpOworCWhvc3Rfc3BlYy0+cnhiZF9jb3VudCA9IGNwdV90b19sZTMyKE1XSUZJRVhfTUFYX1RYUlhfQkQpOworCWhvc3Rfc3BlYy0+ZXZ0YmRfYWRkcl9sbyA9IGNwdV90b19sZTMyKCh1MzIpKGNhcmQtPmV2dGJkX3JpbmdfcGJhc2UpKTsKKwlob3N0X3NwZWMtPmV2dGJkX2FkZHJfaGkgPQorCQkJY3B1X3RvX2xlMzIoKHUzMikoKCh1NjQpY2FyZC0+ZXZ0YmRfcmluZ19wYmFzZSkgPj4gMzIpKTsKKwlob3N0X3NwZWMtPmV2dGJkX2NvdW50ID0gY3B1X3RvX2xlMzIoTVdJRklFWF9NQVhfRVZUX0JEKTsKIAlpZiAoY2FyZC0+c2xlZXBfY29va2llX3ZiYXNlKSB7CiAJCWhvc3Rfc3BlYy0+c2xlZXBfY29va2llX2FkZHJfbG8gPQotCQkJCQkJKHUzMikoY2FyZC0+c2xlZXBfY29va2llX3BiYXNlKTsKLQkJaG9zdF9zcGVjLT5zbGVlcF9jb29raWVfYWRkcl9oaSA9Ci0JCQkJICh1MzIpKCgodTY0KShjYXJkLT5zbGVlcF9jb29raWVfcGJhc2UpKSA+PiAzMik7CisJCQkJY3B1X3RvX2xlMzIoKHUzMikoY2FyZC0+c2xlZXBfY29va2llX3BiYXNlKSk7CisJCWhvc3Rfc3BlYy0+c2xlZXBfY29va2llX2FkZHJfaGkgPSBjcHVfdG9fbGUzMigodTMyKSgoKHU2NCkKKwkJCQkJKGNhcmQtPnNsZWVwX2Nvb2tpZV9wYmFzZSkpID4+IDMyKSk7CiAJCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIElORk8sCiAJCQkgICAgInNsZWVwX2Nvb2tfbG8gcGh5IGFkZHI6IDB4JXhcbiIsCiAJCQkgICAgaG9zdF9zcGVjLT5zbGVlcF9jb29raWVfYWRkcl9sbyk7CkBAIC0xNDgyLDcgKzE0ODUsNyBAQAogCQkJY29udGludWU7CiAKIAkJLyogcHJvcGVydHkgaGVhZGVyIGlzIDYgYnl0ZXMsIGRhdGEgbXVzdCBmaXQgaW4gY21kIGJ1ZmZlciAqLwotCQlpZiAocHJvcCAmJiBwcm9wLT52YWx1ZSAmJiBwcm9wLT5sZW5ndGggPiA2ICYmCisJCWlmIChwcm9wLT52YWx1ZSAmJiBwcm9wLT5sZW5ndGggPiA2ICYmCiAJCSAgICBwcm9wLT5sZW5ndGggPD0gTVdJRklFWF9TSVpFX09GX0NNRF9CVUZGRVIgLSBTX0RTX0dFTikgewogCQkJcmV0ID0gbXdpZmlleF9zZW5kX2NtZChwcml2LCBIb3N0Q21kX0NNRF9DRkdfREFUQSwKIAkJCQkJICAgICAgIEhvc3RDbWRfQUNUX0dFTl9TRVQsIDAsCkBAIC0xNTk2LDYgKzE1OTksMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtd2lmaWV4X2NtZF9jaGFuX3JlZ2lvbl9jZmcoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKKwkJCQkgICAgICAgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQkgICAgICAgdTE2IGNtZF9hY3Rpb24pCit7CisJc3RydWN0IGhvc3RfY21kX2RzX2NoYW5fcmVnaW9uX2NmZyAqcmVnID0gJmNtZC0+cGFyYW1zLnJlZ19jZmc7CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihIb3N0Q21kX0NNRF9DSEFOX1JFR0lPTl9DRkcpOworCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZigqcmVnKSArIFNfRFNfR0VOKTsKKworCWlmIChjbWRfYWN0aW9uID09IEhvc3RDbWRfQUNUX0dFTl9HRVQpCisJCXJlZy0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludAogbXdpZmlleF9jbWRfY29hbGVzY2VfY2ZnKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCiAJCQkgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKQEAgLTIxMzYsNiArMjE1NCw5IEBACiAJCXJldCA9IG13aWZpZXhfY21kX2d0a19yZWtleV9vZmZsb2FkKHByaXYsIGNtZF9wdHIsIGNtZF9hY3Rpb24sCiAJCQkJCQkgICAgZGF0YV9idWYpOwogCQlicmVhazsKKwljYXNlIEhvc3RDbWRfQ01EX0NIQU5fUkVHSU9OX0NGRzoKKwkJcmV0ID0gbXdpZmlleF9jbWRfY2hhbl9yZWdpb25fY2ZnKHByaXYsIGNtZF9wdHIsIGNtZF9hY3Rpb24pOworCQlicmVhazsKIAlkZWZhdWx0OgogCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBFUlJPUiwKIAkJCSAgICAiUFJFUF9DTUQ6IHVua25vd24gY21kLSAlI3hcbiIsIGNtZF9ubyk7CkBAIC0yMjczLDYgKzIyOTQsOSBAQAogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gLTE7CiAJCX0KKworCQltd2lmaWV4X3NlbmRfY21kKHByaXYsIEhvc3RDbWRfQ01EX0NIQU5fUkVHSU9OX0NGRywKKwkJCQkgSG9zdENtZF9BQ1RfR0VOX0dFVCwgMCwgTlVMTCwgdHJ1ZSk7CiAJfQogCiAJLyogZ2V0IHR4IHJhdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zdGFfY21kcmVzcC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3N0YV9jbWRyZXNwLmMKaW5kZXggY2NmNTQ5MzIuLjg1NDgwMjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2NtZHJlc3AuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2NtZHJlc3AuYwpAQCAtOTYyLDcgKzk2Miw3IEBACiAJaW50IGk7CiAJc3RydWN0IG13aWZpZXhfc3RhX25vZGUgKnN0YV9ub2RlOwogCi0JZm9yIChpID0gMDsgaSA8IHN0YV9saXN0LT5zdGFfY291bnQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCAobGUxNl90b19jcHUoc3RhX2xpc3QtPnN0YV9jb3VudCkpOyBpKyspIHsKIAkJc3RhX25vZGUgPSBtd2lmaWV4X2dldF9zdGFfZW50cnkocHJpdiwgc3RhX2luZm8tPm1hYyk7CiAJCWlmICh1bmxpa2VseSghc3RhX25vZGUpKQogCQkJY29udGludWU7CkBAIC0xMDIyLDYgKzEwMjIsMTM4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqCittd2lmaWV4X2NyZWF0ZV9jdXN0b21fcmVnZG9tYWluKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCisJCQkJdTggKmJ1ZiwgdTE2IGJ1Zl9sZW4pCit7CisJdTE2IG51bV9jaGFuID0gYnVmX2xlbiAvIDI7CisJc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJlZ2Q7CisJc3RydWN0IGllZWU4MDIxMV9yZWdfcnVsZSAqcnVsZTsKKwlib29sIG5ld19ydWxlOworCWludCByZWdkX3NpemUsIGlkeCwgZnJlcSwgcHJldl9mcmVxID0gMDsKKwl1MzIgYncsIHByZXZfYncgPSAwOworCXU4IGNoZmxhZ3MsIHByZXZfY2hmbGFncyA9IDAsIHZhbGlkX3J1bGVzID0gMDsKKworCWlmIChXQVJOX09OX09OQ0UobnVtX2NoYW4gPiBOTDgwMjExX01BWF9TVVBQX1JFR19SVUxFUykpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJcmVnZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluKSArCisJCSAgICBudW1fY2hhbiAqIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JlZ19ydWxlKTsKKworCXJlZ2QgPSBremFsbG9jKHJlZ2Rfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZWdkKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgbnVtX2NoYW47IGlkeCsrKSB7CisJCXU4IGNoYW47CisJCWVudW0gbmw4MDIxMV9iYW5kIGJhbmQ7CisKKwkJY2hhbiA9ICpidWYrKzsKKwkJaWYgKCFjaGFuKSB7CisJCQlrZnJlZShyZWdkKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWNoZmxhZ3MgPSAqYnVmKys7CisJCWJhbmQgPSAoY2hhbiA8PSAxNCkgPyBOTDgwMjExX0JBTkRfMkdIWiA6IE5MODAyMTFfQkFORF81R0haOworCQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW4sIGJhbmQpOworCQluZXdfcnVsZSA9IGZhbHNlOworCisJCWlmIChjaGZsYWdzICYgTVdJRklFWF9DSEFOTkVMX0RJU0FCTEVEKQorCQkJY29udGludWU7CisKKwkJaWYgKGJhbmQgPT0gTkw4MDIxMV9CQU5EXzVHSFopIHsKKwkJCWlmICghKGNoZmxhZ3MgJiBNV0lGSUVYX0NIQU5ORUxfTk9IVDgwKSkKKwkJCQlidyA9IE1IWl9UT19LSFooODApOworCQkJZWxzZSBpZiAoIShjaGZsYWdzICYgTVdJRklFWF9DSEFOTkVMX05PSFQ0MCkpCisJCQkJYncgPSBNSFpfVE9fS0haKDQwKTsKKwkJCWVsc2UKKwkJCQlidyA9IE1IWl9UT19LSFooMjApOworCQl9IGVsc2UgeworCQkJaWYgKCEoY2hmbGFncyAmIE1XSUZJRVhfQ0hBTk5FTF9OT0hUNDApKQorCQkJCWJ3ID0gTUhaX1RPX0tIWig0MCk7CisJCQllbHNlCisJCQkJYncgPSBNSFpfVE9fS0haKDIwKTsKKwkJfQorCisJCWlmIChpZHggPT0gMCB8fCBwcmV2X2NoZmxhZ3MgIT0gY2hmbGFncyB8fCBwcmV2X2J3ICE9IGJ3IHx8CisJCSAgICBmcmVxIC0gcHJldl9mcmVxID4gMjApIHsKKwkJCXZhbGlkX3J1bGVzKys7CisJCQluZXdfcnVsZSA9IHRydWU7CisJCX0KKworCQlydWxlID0gJnJlZ2QtPnJlZ19ydWxlc1t2YWxpZF9ydWxlcyAtIDFdOworCisJCXJ1bGUtPmZyZXFfcmFuZ2UuZW5kX2ZyZXFfa2h6ID0gTUhaX1RPX0tIWihmcmVxICsgMTApOworCisJCXByZXZfY2hmbGFncyA9IGNoZmxhZ3M7CisJCXByZXZfZnJlcSA9IGZyZXE7CisJCXByZXZfYncgPSBidzsKKworCQlpZiAoIW5ld19ydWxlKQorCQkJY29udGludWU7CisKKwkJcnVsZS0+ZnJlcV9yYW5nZS5zdGFydF9mcmVxX2toeiA9IE1IWl9UT19LSFooZnJlcSAtIDEwKTsKKwkJcnVsZS0+cG93ZXJfcnVsZS5tYXhfZWlycCA9IERCTV9UT19NQk0oMTkpOworCisJCWlmIChjaGZsYWdzICYgTVdJRklFWF9DSEFOTkVMX1BBU1NJVkUpCisJCQlydWxlLT5mbGFncyA9IE5MODAyMTFfUlJGX05PX0lSOworCisJCWlmIChjaGZsYWdzICYgTVdJRklFWF9DSEFOTkVMX0RGUykKKwkJCXJ1bGUtPmZsYWdzID0gTkw4MDIxMV9SUkZfREZTOworCisJCXJ1bGUtPmZyZXFfcmFuZ2UubWF4X2JhbmR3aWR0aF9raHogPSBidzsKKwl9CisKKwlyZWdkLT5uX3JlZ19ydWxlcyA9IHZhbGlkX3J1bGVzOworCXJlZ2QtPmFscGhhMlswXSA9ICc5JzsKKwlyZWdkLT5hbHBoYTJbMV0gPSAnOSc7CisKKwlyZXR1cm4gcmVnZDsKK30KKworc3RhdGljIGludCBtd2lmaWV4X3JldF9jaGFuX3JlZ2lvbl9jZmcoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKKwkJCQkgICAgICAgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJc3RydWN0IGhvc3RfY21kX2RzX2NoYW5fcmVnaW9uX2NmZyAqcmVnID0gJnJlc3AtPnBhcmFtcy5yZWdfY2ZnOworCXUxNiBhY3Rpb24gPSBsZTE2X3RvX2NwdShyZWctPmFjdGlvbik7CisJdTE2IHRsdiwgdGx2X2J1Zl9sZW4sIHRsdl9idWZfbGVmdDsKKwlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19oZWFkZXIgKmhlYWQ7CisJc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJlZ2Q7CisJdTggKnRsdl9idWY7CisKKwlpZiAoYWN0aW9uICE9IEhvc3RDbWRfQUNUX0dFTl9HRVQpCisJCXJldHVybiAwOworCisJdGx2X2J1ZiA9ICh1OCAqKXJlZyArIHNpemVvZigqcmVnKTsKKwl0bHZfYnVmX2xlZnQgPSBsZTE2X3RvX2NwdShyZXNwLT5zaXplKSAtIFNfRFNfR0VOIC0gc2l6ZW9mKCpyZWcpOworCisJd2hpbGUgKHRsdl9idWZfbGVmdCA+PSBzaXplb2YoKmhlYWQpKSB7CisJCWhlYWQgPSAoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaGVhZGVyICopdGx2X2J1ZjsKKwkJdGx2ID0gbGUxNl90b19jcHUoaGVhZC0+dHlwZSk7CisJCXRsdl9idWZfbGVuID0gbGUxNl90b19jcHUoaGVhZC0+bGVuKTsKKworCQlpZiAodGx2X2J1Zl9sZWZ0IDwgKHNpemVvZigqaGVhZCkgKyB0bHZfYnVmX2xlbikpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKHRsdikgeworCQljYXNlIFRMVl9UWVBFX0NIQU5fQVRUUl9DRkc6CisJCQltd2lmaWV4X2RiZ19kdW1wKHByaXYtPmFkYXB0ZXIsIENNRF9ELCAiQ0hBTjoiLAorCQkJCQkgKHU4ICopaGVhZCArIHNpemVvZigqaGVhZCksCisJCQkJCSB0bHZfYnVmX2xlbik7CisJCQlyZWdkID0gbXdpZmlleF9jcmVhdGVfY3VzdG9tX3JlZ2RvbWFpbihwcml2LAorCQkJCSh1OCAqKWhlYWQgKyBzaXplb2YoKmhlYWQpLCB0bHZfYnVmX2xlbik7CisJCQlpZiAoIUlTX0VSUihyZWdkKSkKKwkJCQlwcml2LT5hZGFwdGVyLT5yZWdkID0gcmVnZDsKKwkJCWJyZWFrOworCQl9CisKKwkJdGx2X2J1ZiArPSAoc2l6ZW9mKCpoZWFkKSArIHRsdl9idWZfbGVuKTsKKwkJdGx2X2J1Zl9sZWZ0IC09IChzaXplb2YoKmhlYWQpICsgdGx2X2J1Zl9sZW4pOworCX0KKworCXJldHVybiAwOworfQorCiAvKgogICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBjb21tYW5kIHJlc3BvbnNlcy4KICAqCkBAIC0xMjM5LDYgKzEzNzEsOSBAQAogCQlicmVhazsKIAljYXNlIEhvc3RDbWRfQ01EX0dUS19SRUtFWV9PRkZMT0FEX0NGRzoKIAkJYnJlYWs7CisJY2FzZSBIb3N0Q21kX0NNRF9DSEFOX1JFR0lPTl9DRkc6CisJCXJldCA9IG13aWZpZXhfcmV0X2NoYW5fcmVnaW9uX2NmZyhwcml2LCByZXNwKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsCiAJCQkgICAgIkNNRF9SRVNQOiB1bmtub3duIGNtZCByZXNwb25zZSAlI3hcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2V2ZW50LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2V2ZW50LmMKaW5kZXggYTQyMmYzMy4uOWRmMGM0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3N0YV9ldmVudC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zdGFfZXZlbnQuYwpAQCAtMjUsNiArMjUsOTkgQEAKICNpbmNsdWRlICJ3bW0uaCIKICNpbmNsdWRlICIxMW4uaCIKIAorI2RlZmluZSBNV0lGSUVYX0lCU1NfQ09OTkVDVF9FVlRfRklYX1NJWkUgICAgMTIKKworc3RhdGljIGludCBtd2lmaWV4X2NoZWNrX2lic3NfcGVlcl9jYXBhYmlsdGllcyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAorCQkJCQkgICAgICAgc3RydWN0IG13aWZpZXhfc3RhX25vZGUgKnN0YV9wdHIsCisJCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqZXZlbnQpCit7CisJaW50IGV2dF9sZW4sIGVsZV9sZW47CisJdTggKmN1cnI7CisJc3RydWN0IGllZWVfdHlwZXNfaGVhZGVyICplbGVfaGRyOworCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX21nbXRfZnJhbWUgKnRsdl9tZ210X2ZyYW1lOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXA7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV92aHRfY2FwICp2aHRfY2FwOworCisJc2tiX3B1bGwoZXZlbnQsIE1XSUZJRVhfSUJTU19DT05ORUNUX0VWVF9GSVhfU0laRSk7CisJZXZ0X2xlbiA9IGV2ZW50LT5sZW47CisJY3VyciA9IGV2ZW50LT5kYXRhOworCisJbXdpZmlleF9kYmdfZHVtcChwcml2LT5hZGFwdGVyLCBFVlRfRCwgImlic3MgcGVlciBjYXBhYmlsdGllczoiLAorCQkJIGV2ZW50LT5kYXRhLCBldmVudC0+bGVuKTsKKworCXNrYl9wdXNoKGV2ZW50LCBNV0lGSUVYX0lCU1NfQ09OTkVDVF9FVlRfRklYX1NJWkUpOworCisJdGx2X21nbXRfZnJhbWUgPSAodm9pZCAqKWN1cnI7CisJaWYgKGV2dF9sZW4gPj0gc2l6ZW9mKCp0bHZfbWdtdF9mcmFtZSkgJiYKKwkgICAgbGUxNl90b19jcHUodGx2X21nbXRfZnJhbWUtPmhlYWRlci50eXBlKSA9PQorCSAgICBUTFZfVFlQRV9VQVBfTUdNVF9GUkFNRSkgeworCQkvKiBMb2NhdGUgY3VyciBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBiZWFjb24gdGx2LAorCQkgKiB0aW1lc3RhbXAgOCBieXRlcywgYmVhY29uIGludGVydmVsIDIgYnl0ZXMsCisJCSAqIGNhcGFiaWxpdHkgaW5mbyAyIGJ5dGVzLCB0b3RhbGx5IDEyIGJ5dGUgYmVhY29uIGhlYWRlcgorCQkgKi8KKwkJZXZ0X2xlbiA9IGxlMTZfdG9fY3B1KHRsdl9tZ210X2ZyYW1lLT5oZWFkZXIubGVuKTsKKwkJY3VyciArPSAoc2l6ZW9mKCp0bHZfbWdtdF9mcmFtZSkgKyAxMik7CisJfSBlbHNlIHsKKwkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgTVNHLAorCQkJICAgICJtYW5hZ2VtZW50IGZyYW1lIHRsdiBub3QgZm91bmQhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKGV2dF9sZW4gPj0gc2l6ZW9mKCplbGVfaGRyKSkgeworCQllbGVfaGRyID0gKHN0cnVjdCBpZWVlX3R5cGVzX2hlYWRlciAqKWN1cnI7CisJCWVsZV9sZW4gPSBlbGVfaGRyLT5sZW47CisKKwkJaWYgKGV2dF9sZW4gPCBlbGVfbGVuICsgc2l6ZW9mKCplbGVfaGRyKSkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoZWxlX2hkci0+ZWxlbWVudF9pZCkgeworCQljYXNlIFdMQU5fRUlEX0hUX0NBUEFCSUxJVFk6CisJCQlzdGFfcHRyLT5pc18xMW5fZW5hYmxlZCA9IHRydWU7CisJCQlodF9jYXAgPSAodm9pZCAqKShlbGVfaGRyICsgMik7CisJCQlzdGFfcHRyLT5tYXhfYW1zZHUgPSBsZTE2X3RvX2NwdShodF9jYXAtPmNhcF9pbmZvKSAmCisJCQkJSUVFRTgwMjExX0hUX0NBUF9NQVhfQU1TRFUgPworCQkJCU1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV84SyA6CisJCQkJTVdJRklFWF9UWF9EQVRBX0JVRl9TSVpFXzRLOworCQkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgSU5GTywKKwkJCQkgICAgIjExbiBlbmFibGVkISwgbWF4X2Ftc2R1IDogJWRcbiIsCisJCQkJICAgIHN0YV9wdHItPm1heF9hbXNkdSk7CisJCQlicmVhazsKKworCQljYXNlIFdMQU5fRUlEX1ZIVF9DQVBBQklMSVRZOgorCQkJc3RhX3B0ci0+aXNfMTFhY19lbmFibGVkID0gdHJ1ZTsKKwkJCXZodF9jYXAgPSAodm9pZCAqKShlbGVfaGRyICsgMik7CisJCQkvKiBjaGVjayBWSFQgTUFYTVBEVSBjYXBhYmlsaXR5ICovCisJCQlzd2l0Y2ggKGxlMzJfdG9fY3B1KHZodF9jYXAtPnZodF9jYXBfaW5mbykgJiAweDMpIHsKKwkJCWNhc2UgSUVFRTgwMjExX1ZIVF9DQVBfTUFYX01QRFVfTEVOR1RIXzExNDU0OgorCQkJCXN0YV9wdHItPm1heF9hbXNkdSA9CisJCQkJCU1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV8xMks7CisJCQkJYnJlYWs7CisJCQljYXNlIElFRUU4MDIxMV9WSFRfQ0FQX01BWF9NUERVX0xFTkdUSF83OTkxOgorCQkJCXN0YV9wdHItPm1heF9hbXNkdSA9CisJCQkJCU1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV84SzsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUVFRTgwMjExX1ZIVF9DQVBfTUFYX01QRFVfTEVOR1RIXzM4OTU6CisJCQkJc3RhX3B0ci0+bWF4X2Ftc2R1ID0KKwkJCQkJTVdJRklFWF9UWF9EQVRBX0JVRl9TSVpFXzRLOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgSU5GTywKKwkJCQkgICAgIjExYWMgZW5hYmxlZCEsIG1heF9hbXNkdSA6ICVkXG4iLAorCQkJCSAgICBzdGFfcHRyLT5tYXhfYW1zZHUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWN1cnIgKz0gKGVsZV9sZW4gKyBzaXplb2YoKmVsZV9oZHIpKTsKKwkJZXZ0X2xlbiAtPSAoZWxlX2xlbiArIHNpemVvZigqZWxlX2hkcikpOworCX0KKworCXJldHVybiAwOworfQorCiAvKgogICogVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGNvbm5lY3Rpb24gc3RhdGUuCiAgKgpAQCAtNTE5LDYgKzYxMiw4IEBACiAgKiAgICAgIC0gRVZFTlRfTElOS19RVUFMSVRZCiAgKiAgICAgIC0gRVZFTlRfUFJFX0JFQUNPTl9MT1NUCiAgKiAgICAgIC0gRVZFTlRfSUJTU19DT0FMRVNDRUQKKyAqICAgICAgLSBFVkVOVF9JQlNTX1NUQV9DT05ORUNUCisgKiAgICAgIC0gRVZFTlRfSUJTU19TVEFfRElTQ09OTkVDVAogICogICAgICAtIEVWRU5UX1dFUF9JQ1ZfRVJSCiAgKiAgICAgIC0gRVZFTlRfQldfQ0hBTkdFCiAgKiAgICAgIC0gRVZFTlRfSE9TVFdBS0VfU1RBSUUKQEAgLTU0Nyw5ICs2NDIsMTEgQEAKIGludCBtd2lmaWV4X3Byb2Nlc3Nfc3RhX2V2ZW50KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYpCiB7CiAJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldCA9IDAsIGk7CiAJdTMyIGV2ZW50Y2F1c2UgPSBhZGFwdGVyLT5ldmVudF9jYXVzZTsKIAl1MTYgY3RybCwgcmVhc29uX2NvZGU7CisJdTggaWJzc19zdGFfYWRkcltFVEhfQUxFTl07CisJc3RydWN0IG13aWZpZXhfc3RhX25vZGUgKnN0YV9wdHI7CiAKIAlzd2l0Y2ggKGV2ZW50Y2F1c2UpIHsKIAljYXNlIEVWRU5UX0RVTU1ZX0hPU1RfV0FLRVVQX1NJR05BTDoKQEAgLTcwOCw3ICs4MDUsMTEgQEAKIAogCWNhc2UgRVZFTlRfRVhUX1NDQU5fUkVQT1JUOgogCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFVkVOVCwgImV2ZW50OiBFWFRfU0NBTiBSZXBvcnRcbiIpOwotCQlpZiAoYWRhcHRlci0+ZXh0X3NjYW4gJiYgIXByaXYtPnNjYW5fYWJvcnRpbmcpCisJCS8qIFdlIGludGVuZCB0byBza2lwIHRoaXMgZXZlbnQgZHVyaW5nIHN1c3BlbmQsIGJ1dCBoYW5kbGUKKwkJICogaXQgaW4gaW50ZXJmYWNlIGRpc2FibGVkIGNhc2UKKwkJICovCisJCWlmIChhZGFwdGVyLT5leHRfc2NhbiAmJiAoIXByaXYtPnNjYW5fYWJvcnRpbmcgfHwKKwkJCQkJICAhbmV0aWZfcnVubmluZyhwcml2LT5uZXRkZXYpKSkKIAkJCXJldCA9IG13aWZpZXhfaGFuZGxlX2V2ZW50X2V4dF9zY2FuX3JlcG9ydChwcml2LAogCQkJCQkJYWRhcHRlci0+ZXZlbnRfc2tiLT5kYXRhKTsKIApAQCAtNzcxLDYgKzg3MiwzOSBAQAogCQkJCUhvc3RDbWRfQ01EXzgwMl8xMV9JQlNTX0NPQUxFU0NJTkdfU1RBVFVTLAogCQkJCUhvc3RDbWRfQUNUX0dFTl9HRVQsIDAsIE5VTEwsIGZhbHNlKTsKIAkJYnJlYWs7CisJY2FzZSBFVkVOVF9JQlNTX1NUQV9DT05ORUNUOgorCQlldGhlcl9hZGRyX2NvcHkoaWJzc19zdGFfYWRkciwgYWRhcHRlci0+ZXZlbnRfYm9keSArIDIpOworCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFVkVOVCwgImV2ZW50OiBJQlNTX1NUQV9DT05ORUNUICVwTVxuIiwKKwkJCSAgICBpYnNzX3N0YV9hZGRyKTsKKwkJc3RhX3B0ciA9IG13aWZpZXhfYWRkX3N0YV9lbnRyeShwcml2LCBpYnNzX3N0YV9hZGRyKTsKKwkJaWYgKHN0YV9wdHIgJiYgYWRhcHRlci0+YWRob2NfMTFuX2VuYWJsZWQpIHsKKwkJCW13aWZpZXhfY2hlY2tfaWJzc19wZWVyX2NhcGFiaWx0aWVzKHByaXYsIHN0YV9wdHIsCisJCQkJCQkJICAgIGFkYXB0ZXItPmV2ZW50X3NrYik7CisJCQlpZiAoc3RhX3B0ci0+aXNfMTFuX2VuYWJsZWQpCisJCQkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fVElEOyBpKyspCisJCQkJCXN0YV9wdHItPmFtcGR1X3N0YVtpXSA9CisJCQkJCXByaXYtPmFnZ3JfcHJpb190YmxbaV0uYW1wZHVfdXNlcjsKKwkJCWVsc2UKKwkJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9USUQ7IGkrKykKKwkJCQkJc3RhX3B0ci0+YW1wZHVfc3RhW2ldID0KKwkJCQkJCUJBX1NUUkVBTV9OT1RfQUxMT1dFRDsKKwkJCW1lbXNldChzdGFfcHRyLT5yeF9zZXEsIDB4ZmYsIHNpemVvZihzdGFfcHRyLT5yeF9zZXEpKTsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgRVZFTlRfSUJTU19TVEFfRElTQ09OTkVDVDoKKwkJZXRoZXJfYWRkcl9jb3B5KGlic3Nfc3RhX2FkZHIsIGFkYXB0ZXItPmV2ZW50X2JvZHkgKyAyKTsKKwkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVZFTlQsICJldmVudDogSUJTU19TVEFfRElTQ09OTkVDVCAlcE1cbiIsCisJCQkgICAgaWJzc19zdGFfYWRkcik7CisJCXN0YV9wdHIgPSBtd2lmaWV4X2dldF9zdGFfZW50cnkocHJpdiwgaWJzc19zdGFfYWRkcik7CisJCWlmIChzdGFfcHRyICYmIHN0YV9wdHItPmlzXzExbl9lbmFibGVkKSB7CisJCQltd2lmaWV4XzExbl9kZWxfcnhfcmVvcmRlcl90YmxfYnlfdGEocHJpdiwKKwkJCQkJCQkgICAgIGlic3Nfc3RhX2FkZHIpOworCQkJbXdpZmlleF9kZWxfdHhfYmFfc3RyZWFtX3RibF9ieV9yYShwcml2LCBpYnNzX3N0YV9hZGRyKTsKKwkJfQorCQltd2lmaWV4X3dtbV9kZWxfcGVlcl9yYV9saXN0KHByaXYsIGlic3Nfc3RhX2FkZHIpOworCQltd2lmaWV4X2RlbF9zdGFfZW50cnkocHJpdiwgaWJzc19zdGFfYWRkcik7CisJCWJyZWFrOwogCWNhc2UgRVZFTlRfQUREQkE6CiAJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVWRU5ULCAiZXZlbnQ6IEFEREJBIFJlcXVlc3RcbiIpOwogCQltd2lmaWV4X3NlbmRfY21kKHByaXYsIEhvc3RDbWRfQ01EXzExTl9BRERCQV9SU1AsCkBAIC04NjksNiArMTAwMywxMiBAQAogCQltd2lmaWV4X2J0X2NvZXhfd2xhbl9wYXJhbV91cGRhdGVfZXZlbnQocHJpdiwKIAkJCQkJCQlhZGFwdGVyLT5ldmVudF9za2IpOwogCQlicmVhazsKKwljYXNlIEVWRU5UX1JYQkFfU1lOQzoKKwkJZGV2X2RiZyhhZGFwdGVyLT5kZXYsICJFVkVOVDogUlhCQV9TWU5DXG4iKTsKKwkJbXdpZmlleF8xMW5fcnhiYV9zeW5jX2V2ZW50KHByaXYsIGFkYXB0ZXItPmV2ZW50X2JvZHksCisJCQkJCSAgICBhZGFwdGVyLT5ldmVudF9za2ItPmxlbiAtCisJCQkJCSAgICBzaXplb2YoZXZlbnRjYXVzZSkpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwgImV2ZW50OiB1bmtub3duIGV2ZW50IGlkOiAlI3hcbiIsCiAJCQkgICAgZXZlbnRjYXVzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2lvY3RsLmMKaW5kZXggZTA2NjQ3YS4uNjQ0ZjNhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3N0YV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zdGFfaW9jdGwuYwpAQCAtNTc0LDcgKzU3NCw3IEBACiAKIAlhZGFwdGVyLT5oc19hY3RpdmF0ZV93YWl0X3Ffd29rZW4gPSBmYWxzZTsKIAotCW1lbXNldCgmaHNjZmcsIDAsIHNpemVvZihzdHJ1Y3QgbXdpZmlleF9kc19oc19jZmcpKTsKKwltZW1zZXQoJmhzY2ZnLCAwLCBzaXplb2YoaHNjZmcpKTsKIAloc2NmZy5pc19pbnZva2VfaG9zdGNtZCA9IHRydWU7CiAKIAlhZGFwdGVyLT5oc19lbmFibGluZyA9IHRydWU7CkBAIC0xMTM4LDcgKzExMzgsNyBAQAogewogCXN0cnVjdCBtd2lmaWV4X2RzX2VuY3J5cHRfa2V5IGVuY3J5cHRfa2V5OwogCi0JbWVtc2V0KCZlbmNyeXB0X2tleSwgMCwgc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2RzX2VuY3J5cHRfa2V5KSk7CisJbWVtc2V0KCZlbmNyeXB0X2tleSwgMCwgc2l6ZW9mKGVuY3J5cHRfa2V5KSk7CiAJZW5jcnlwdF9rZXkua2V5X2xlbiA9IGtleV9sZW47CiAJZW5jcnlwdF9rZXkua2V5X2luZGV4ID0ga2V5X2luZGV4OwogCkBAIC0xMTgwLDcgKzExODAsNyBAQAogewogCXN0cnVjdCBtd2lmaWV4X3Zlcl9leHQgdmVyX2V4dDsKIAotCW1lbXNldCgmdmVyX2V4dCwgMCwgc2l6ZW9mKHN0cnVjdCBob3N0X2NtZF9kc192ZXJzaW9uX2V4dCkpOworCW1lbXNldCgmdmVyX2V4dCwgMCwgc2l6ZW9mKHZlcl9leHQpKTsKIAl2ZXJfZXh0LnZlcnNpb25fc3RyX3NlbCA9IHZlcnNpb25fc3RyX3NlbDsKIAlpZiAobXdpZmlleF9zZW5kX2NtZChwcml2LCBIb3N0Q21kX0NNRF9WRVJTSU9OX0VYVCwKIAkJCSAgICAgSG9zdENtZF9BQ1RfR0VOX0dFVCwgMCwgJnZlcl9leHQsIHRydWUpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3VhcF9ldmVudC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3VhcF9ldmVudC5jCmluZGV4IDg2ZmY1NDIuLmQyNGVjYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC91YXBfZXZlbnQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvdWFwX2V2ZW50LmMKQEAgLTMwNiw3ICszMDYsMTIgQEAKIAkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVZFTlQsICJldmVudDogbXVsdGktY2hhbiBpbmZvXG4iKTsKIAkJbXdpZmlleF9wcm9jZXNzX211bHRpX2NoYW5fZXZlbnQocHJpdiwgYWRhcHRlci0+ZXZlbnRfc2tiKTsKIAkJYnJlYWs7Ci0KKwljYXNlIEVWRU5UX1JYQkFfU1lOQzoKKwkJZGV2X2RiZyhhZGFwdGVyLT5kZXYsICJFVkVOVDogUlhCQV9TWU5DXG4iKTsKKwkJbXdpZmlleF8xMW5fcnhiYV9zeW5jX2V2ZW50KHByaXYsIGFkYXB0ZXItPmV2ZW50X2JvZHksCisJCQkJCSAgICBhZGFwdGVyLT5ldmVudF9za2ItPmxlbiAtCisJCQkJCSAgICBzaXplb2YoZXZlbnRjYXVzZSkpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFVkVOVCwKIAkJCSAgICAiZXZlbnQ6IHVua25vd24gZXZlbnQgaWQ6ICUjeFxuIiwgZXZlbnRjYXVzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvdXNiLmMKaW5kZXggMDg1NzU3NS4uNzNlYjA4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC91c2IuYwpAQCAtMjczLDYgKzI3Myw4IEBACiAJfSBlbHNlIHsKIAkJbXdpZmlleF9kYmcoYWRhcHRlciwgREFUQSwKIAkJCSAgICAiJXM6IERBVEFcbiIsIF9fZnVuY19fKTsKKwkJbXdpZmlleF93cml0ZV9kYXRhX2NvbXBsZXRlKGFkYXB0ZXIsIGNvbnRleHQtPnNrYiwgMCwKKwkJCQkJICAgIHVyYi0+c3RhdHVzID8gLTEgOiAwKTsKIAkJZm9yIChpID0gMDsgaSA8IE1XSUZJRVhfVFhfREFUQV9QT1JUOyBpKyspIHsKIAkJCXBvcnQgPSAmY2FyZC0+cG9ydFtpXTsKIAkJCWlmIChjb250ZXh0LT5lcCA9PSBwb3J0LT50eF9kYXRhX2VwKSB7CkBAIC0yODIsOCArMjg0LDYgQEAKIAkJCX0KIAkJfQogCQlhZGFwdGVyLT5kYXRhX3NlbnQgPSBmYWxzZTsKLQkJbXdpZmlleF93cml0ZV9kYXRhX2NvbXBsZXRlKGFkYXB0ZXIsIGNvbnRleHQtPnNrYiwgMCwKLQkJCQkJICAgIHVyYi0+c3RhdHVzID8gLTEgOiAwKTsKIAl9CiAKIAlpZiAoY2FyZC0+bWNfcmVzeW5jX2ZsYWcpCkBAIC02MTEsNyArNjExLDcgQEAKIAlpZiAoIWFkYXB0ZXItPnByaXZfbnVtKQogCQlyZXR1cm47CiAKLQlpZiAodXNlcl9ybW1vZCkgeworCWlmICh1c2VyX3JtbW9kICYmICFhZGFwdGVyLT5tZmdfbW9kZSkgewogI2lmZGVmIENPTkZJR19QTQogCQlpZiAoYWRhcHRlci0+aXNfc3VzcGVuZGVkKQogCQkJbXdpZmlleF91c2JfcmVzdW1lKGludGYpOwpAQCAtNjU3LDExICs2NTcsOCBAQAogCWNhcmQtPnR4X2NtZC5lcCA9IGNhcmQtPnR4X2NtZF9lcDsKIAogCWNhcmQtPnR4X2NtZC51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghY2FyZC0+dHhfY21kLnVyYikgewotCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwKLQkJCSAgICAidHhfY21kLnVyYiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJaWYgKCFjYXJkLT50eF9jbWQudXJiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgTVdJRklFWF9UWF9EQVRBX1BPUlQ7IGkrKykgewogCQlwb3J0ID0gJmNhcmQtPnBvcnRbaV07CkBAIC02NzcsMTEgKzY3NCw4IEBACiAJCQlwb3J0LT50eF9kYXRhX2xpc3Rbal0uZXAgPSBwb3J0LT50eF9kYXRhX2VwOwogCQkJcG9ydC0+dHhfZGF0YV9saXN0W2pdLnVyYiA9CiAJCQkJCXVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIXBvcnQtPnR4X2RhdGFfbGlzdFtqXS51cmIpIHsKLQkJCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwKLQkJCQkJICAgICJ1cmIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJaWYgKCFwb3J0LT50eF9kYXRhX2xpc3Rbal0udXJiKQogCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQogCQl9CiAJfQogCkBAIC02OTcsMTAgKzY5MSw4IEBACiAJY2FyZC0+cnhfY21kLmVwID0gY2FyZC0+cnhfY21kX2VwOwogCiAJY2FyZC0+cnhfY21kLnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjYXJkLT5yeF9jbWQudXJiKSB7Ci0JCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLCAicnhfY21kLnVyYiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJaWYgKCFjYXJkLT5yeF9jbWQudXJiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAljYXJkLT5yeF9jbWQuc2tiID0gZGV2X2FsbG9jX3NrYihNV0lGSUVYX1JYX0NNRF9CVUZfU0laRSk7CiAJaWYgKCFjYXJkLT5yeF9jbWQuc2tiKQpAQCAtNzE0LDExICs3MDYsOCBAQAogCQljYXJkLT5yeF9kYXRhX2xpc3RbaV0uZXAgPSBjYXJkLT5yeF9kYXRhX2VwOwogCiAJCWNhcmQtPnJ4X2RhdGFfbGlzdFtpXS51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQlpZiAoIWNhcmQtPnJ4X2RhdGFfbGlzdFtpXS51cmIpIHsKLQkJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLAotCQkJCSAgICAicnhfZGF0YV9saXN0W10gdXJiIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJaWYgKCFjYXJkLT5yeF9kYXRhX2xpc3RbaV0udXJiKQogCQkJcmV0dXJuIC0xOwotCQl9CiAJCWlmIChtd2lmaWV4X3VzYl9zdWJtaXRfcnhfdXJiKCZjYXJkLT5yeF9kYXRhX2xpc3RbaV0sCiAJCQkJCSAgICAgIE1XSUZJRVhfUlhfREFUQV9CVUZfU0laRSkpCiAJCQlyZXR1cm4gLTE7CkBAIC04NTIsNyArODQxLDcgQEAKIAlzdHJ1Y3QgdXNiX3R4X2RhdGFfcG9ydCAqcG9ydCA9IE5VTEw7CiAJdTggKmRhdGEgPSAodTggKilza2ItPmRhdGE7CiAJc3RydWN0IHVyYiAqdHhfdXJiOwotCWludCBpZHgsIHJldDsKKwlpbnQgaWR4LCByZXQgPSAtRUlOUFJPR1JFU1M7CiAKIAlpZiAoYWRhcHRlci0+aXNfc3VzcGVuZGVkKSB7CiAJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLApAQCAtODc2LDggKzg2NSw5IEBACiAJCQkJaWYgKGF0b21pY19yZWFkKCZwb3J0LT50eF9kYXRhX3VyYl9wZW5kaW5nKQogCQkJCSAgICA+PSBNV0lGSUVYX1RYX0RBVEFfVVJCKSB7CiAJCQkJCXBvcnQtPmJsb2NrX3N0YXR1cyA9IHRydWU7Ci0JCQkJCXJldCA9IC1FQlVTWTsKLQkJCQkJZ290byBkb25lOworCQkJCQlhZGFwdGVyLT5kYXRhX3NlbnQgPQorCQkJCQkJbXdpZmlleF91c2JfZGF0YV9zZW50KGFkYXB0ZXIpOworCQkJCQlyZXR1cm4gLUVCVVNZOwogCQkJCX0KIAkJCQlpZiAocG9ydC0+dHhfZGF0YV9peCA+PSBNV0lGSUVYX1RYX0RBVEFfVVJCKQogCQkJCQlwb3J0LT50eF9kYXRhX2l4ID0gMDsKQEAgLTkwOCw2ICs4OTgsMTQgQEAKIAllbHNlCiAJCWF0b21pY19pbmMoJnBvcnQtPnR4X2RhdGFfdXJiX3BlbmRpbmcpOwogCisJaWYgKGVwICE9IGNhcmQtPnR4X2NtZF9lcCAmJgorCSAgICBhdG9taWNfcmVhZCgmcG9ydC0+dHhfZGF0YV91cmJfcGVuZGluZykgPT0KKwkJCQkJTVdJRklFWF9UWF9EQVRBX1VSQikgeworCQlwb3J0LT5ibG9ja19zdGF0dXMgPSB0cnVlOworCQlhZGFwdGVyLT5kYXRhX3NlbnQgPSBtd2lmaWV4X3VzYl9kYXRhX3NlbnQoYWRhcHRlcik7CisJCXJldCA9IC1FTk9TUjsKKwl9CisKIAlpZiAodXNiX3N1Ym1pdF91cmIodHhfdXJiLCBHRlBfQVRPTUlDKSkgewogCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwKIAkJCSAgICAiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZFxuIiwgX19mdW5jX18pOwpAQCAtOTE2LDI5ICs5MTQsMTUgQEAKIAkJfSBlbHNlIHsKIAkJCWF0b21pY19kZWMoJnBvcnQtPnR4X2RhdGFfdXJiX3BlbmRpbmcpOwogCQkJcG9ydC0+YmxvY2tfc3RhdHVzID0gZmFsc2U7CisJCQlhZGFwdGVyLT5kYXRhX3NlbnQgPSBmYWxzZTsKIAkJCWlmIChwb3J0LT50eF9kYXRhX2l4KQogCQkJCXBvcnQtPnR4X2RhdGFfaXgtLTsKIAkJCWVsc2UKIAkJCQlwb3J0LT50eF9kYXRhX2l4ID0gTVdJRklFWF9UWF9EQVRBX1VSQjsKIAkJfQotCi0JCXJldHVybiAtMTsKLQl9IGVsc2UgewotCQlpZiAoZXAgIT0gY2FyZC0+dHhfY21kX2VwICYmCi0JCSAgICBhdG9taWNfcmVhZCgmcG9ydC0+dHhfZGF0YV91cmJfcGVuZGluZykgPT0KLQkJCQkJCQlNV0lGSUVYX1RYX0RBVEFfVVJCKSB7Ci0JCQlwb3J0LT5ibG9ja19zdGF0dXMgPSB0cnVlOwotCQkJcmV0ID0gLUVOT1NSOwotCQkJZ290byBkb25lOwotCQl9CisJCXJldCA9IC0xOwogCX0KIAotCXJldHVybiAtRUlOUFJPR1JFU1M7Ci0KLWRvbmU6Ci0JaWYgKGVwICE9IGNhcmQtPnR4X2NtZF9lcCkKLQkJYWRhcHRlci0+ZGF0YV9zZW50ID0gbXdpZmlleF91c2JfZGF0YV9zZW50KGFkYXB0ZXIpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTAzNyw2ICsxMDIxLDEwIEBACiAJCQlkbmxkX2NtZCA9IGxlMzJfdG9fY3B1KGZ3ZGF0YS0+ZndfaGRyLmRubGRfY21kKTsKIAkJCXRsZW4gKz0gc2l6ZW9mKHN0cnVjdCBmd19oZWFkZXIpOwogCisJCQkvKiBDb21tYW5kIDcgZG9lc24ndCBoYXZlIGRhdGEgbGVuZ3RoIGZpZWxkICovCisJCQlpZiAoZG5sZF9jbWQgPT0gRldfQ01EXzcpCisJCQkJZGxlbiA9IDA7CisKIAkJCW1lbWNweShmd2RhdGEtPmRhdGEsICZmaXJtd2FyZVt0bGVuXSwgZGxlbik7CiAKIAkJCWZ3ZGF0YS0+c2VxX251bSA9IGNwdV90b19sZTMyKGZ3X3NlcW51bSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvdXNiLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvdXNiLmgKaW5kZXggYjRlOTI0Ni4uMzBlOGViOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3VzYi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC91c2IuaApAQCAtNDYsMTEgKzQ2LDEyIEBACiAjZGVmaW5lIFVTQjg3NjZfREVGQVVMVF9GV19OQU1FCSJtcnZsL3VzYjg3NjZfdWFwc3RhLmJpbiIKICNkZWZpbmUgVVNCODc5N19ERUZBVUxUX0ZXX05BTUUJIm1ydmwvdXNiODc5N191YXBzdGEuYmluIgogI2RlZmluZSBVU0I4ODAxX0RFRkFVTFRfRldfTkFNRQkibXJ2bC91c2I4ODAxX3VhcHN0YS5iaW4iCi0jZGVmaW5lIFVTQjg5OTdfREVGQVVMVF9GV19OQU1FCSJtcnZsL3VzYjg5OTdfdWFwc3RhLmJpbiIKKyNkZWZpbmUgVVNCODk5N19ERUZBVUxUX0ZXX05BTUUJIm1ydmwvdXNidXNiODk5N19jb21ib192NC5iaW4iCiAKICNkZWZpbmUgRldfRE5MRF9UWF9CVUZfU0laRQk2MjAKICNkZWZpbmUgRldfRE5MRF9SWF9CVUZfU0laRQkyMDQ4CiAjZGVmaW5lIEZXX0hBU19MQVNUX0JMT0NLCTB4MDAwMDAwMDQKKyNkZWZpbmUgRldfQ01EXzcJCTB4MDAwMDAwMDcKIAogI2RlZmluZSBGV19EQVRBX1hNSVRfU0laRSBcCiAJKHNpemVvZihzdHJ1Y3QgZndfaGVhZGVyKSArIGRsZW4gKyBzaXplb2YodTMyKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC91dGlsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvdXRpbC5jCmluZGV4IDY2ODFiZTAuLjE4ZmJiOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC91dGlsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3V0aWwuYwpAQCAtMzg2LDYgKzM4Niw3IEBACiAJCQkJICAgICJ1bmtub3duIHB1YmxpYyBhY3Rpb24gZnJhbWUgY2F0ZWdvcnkgJWRcbiIsCiAJCQkJICAgIGNhdGVnb3J5KTsKIAkJfQorCQlicmVhazsKIAlkZWZhdWx0OgogCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBJTkZPLAogCQkgICAgInVua25vd24gbWdtdCBmcmFtZSBzdWJ0eXBlICUjeFxuIiwgc3R5cGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9kbWEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvZG1hLmMKaW5kZXggNTdhODBjZi4uYThiYzA2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9kbWEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L2RtYS5jCkBAIC0xMDMsNyArMTAzLDcgQEAKIAogCWlmICh1bmxpa2VseShyeHdpLT56ZXJvWzBdIHx8IHJ4d2ktPnplcm9bMV0gfHwgcnh3aS0+emVyb1syXSkpCiAJCWRldl9lcnJfb25jZShkZXYtPmRldiwgIkVycm9yOiBSWFdJIHplcm8gZmllbGRzIGFyZSBzZXRcbiIpOwotCWlmICh1bmxpa2VseShNVDc2X0dFVChNVF9SWERfSU5GT19UWVBFLCBmY2VfaW5mbykpKQorCWlmICh1bmxpa2VseShGSUVMRF9HRVQoTVRfUlhEX0lORk9fVFlQRSwgZmNlX2luZm8pKSkKIAkJZGV2X2Vycl9vbmNlKGRldi0+ZGV2LCAiRXJyb3I6IFJYIHBhdGggc2VlbiBhIG5vbi1wa3QgdXJiXG4iKTsKIAogCXRyYWNlX210X3J4KGRldiwgcnh3aSwgZmNlX2luZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9kbWEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvZG1hLmgKaW5kZXggOTc4ZThhOS4uMjcwZDEyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9kbWEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L2RtYS5oCkBAIC0xOCw4ICsxOCw2IEBACiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogCi0jaW5jbHVkZSAidXRpbC5oIgotCiAjZGVmaW5lIE1UX0RNQV9IRFJfTEVOCQkJNAogI2RlZmluZSBNVF9SWF9JTkZPX0xFTgkJCTQKICNkZWZpbmUgTVRfRkNFX0lORk9fTEVOCQkJNApAQCAtNzksOSArNzcsOSBAQAogCSAqLwogCiAJaW5mbyA9IGZsYWdzIHwKLQkJTVQ3Nl9TRVQoTVRfVFhEX0lORk9fTEVOLCByb3VuZF91cChza2ItPmxlbiwgNCkpIHwKLQkJTVQ3Nl9TRVQoTVRfVFhEX0lORk9fRF9QT1JULCBkX3BvcnQpIHwKLQkJTVQ3Nl9TRVQoTVRfVFhEX0lORk9fVFlQRSwgdHlwZSk7CisJCUZJRUxEX1BSRVAoTVRfVFhEX0lORk9fTEVOLCByb3VuZF91cChza2ItPmxlbiwgNCkpIHwKKwkJRklFTERfUFJFUChNVF9UWERfSU5GT19EX1BPUlQsIGRfcG9ydCkgfAorCQlGSUVMRF9QUkVQKE1UX1RYRF9JTkZPX1RZUEUsIHR5cGUpOwogCiAJcHV0X3VuYWxpZ25lZF9sZTMyKGluZm8sIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKGluZm8pKSk7CiAJcmV0dXJuIHNrYl9wdXRfcGFkdG8oc2tiLCByb3VuZF91cChza2ItPmxlbiwgNCkgKyA0KTsKQEAgLTkwLDcgKzg4LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBtdDc2MDF1X2RtYV9za2Jfd3JhcF9wa3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBtdDc2X3FzZWwgcXNlbCwgdTMyIGZsYWdzKQogewotCWZsYWdzIHw9IE1UNzZfU0VUKE1UX1RYRF9QS1RfSU5GT19RU0VMLCBxc2VsKTsKKwlmbGFncyB8PSBGSUVMRF9QUkVQKE1UX1RYRF9QS1RfSU5GT19RU0VMLCBxc2VsKTsKIAlyZXR1cm4gbXQ3NjAxdV9kbWFfc2tiX3dyYXAoc2tiLCBXTEFOX1BPUlQsIERNQV9QQUNLRVQsIGZsYWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9lZXByb20uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvZWVwcm9tLmMKaW5kZXggOGQ4ZWUwMy4uZGE2ZmFlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9lZXByb20uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L2VlcHJvbS5jCkBAIC00NSw4ICs0NSw4IEBACiAJdmFsID0gbXQ3Nl9ycihkZXYsIE1UX0VGVVNFX0NUUkwpOwogCXZhbCAmPSB+KE1UX0VGVVNFX0NUUkxfQUlOIHwKIAkJIE1UX0VGVVNFX0NUUkxfTU9ERSk7Ci0JdmFsIHw9IE1UNzZfU0VUKE1UX0VGVVNFX0NUUkxfQUlOLCBhZGRyICYgfjB4ZikgfAotCSAgICAgICBNVDc2X1NFVChNVF9FRlVTRV9DVFJMX01PREUsIG1vZGUpIHwKKwl2YWwgfD0gRklFTERfUFJFUChNVF9FRlVTRV9DVFJMX0FJTiwgYWRkciAmIH4weGYpIHwKKwkgICAgICAgRklFTERfUFJFUChNVF9FRlVTRV9DVFJMX01PREUsIG1vZGUpIHwKIAkgICAgICAgTVRfRUZVU0VfQ1RSTF9LSUNLOwogCW10NzZfd3IoZGV2LCBNVF9FRlVTRV9DVFJMLCB2YWwpOwogCkBAIC0xMjgsOCArMTI4LDggQEAKIAlpZiAoIWZpZWxkX3ZhbGlkKG5pY19jb25mMCA+PiA4KSkKIAkJcmV0dXJuOwogCi0JaWYgKE1UNzZfR0VUKE1UX0VFX05JQ19DT05GXzBfUlhfUEFUSCwgbmljX2NvbmYwKSA+IDEgfHwKLQkgICAgTVQ3Nl9HRVQoTVRfRUVfTklDX0NPTkZfMF9UWF9QQVRILCBuaWNfY29uZjApID4gMSkKKwlpZiAoRklFTERfR0VUKE1UX0VFX05JQ19DT05GXzBfUlhfUEFUSCwgbmljX2NvbmYwKSA+IDEgfHwKKwkgICAgRklFTERfR0VUKE1UX0VFX05JQ19DT05GXzBfVFhfUEFUSCwgbmljX2NvbmYwKSA+IDEpCiAJCWRldl9lcnIoZGV2LT5kZXYsCiAJCQkiRXJyb3I6IGRldmljZSBoYXMgbW9yZSB0aGFuIDEgUlgvVFggc3RyZWFtIVxuIik7CiB9CkBAIC0xNTAsNyArMTUwLDcgQEAKIAogCW10NzZfd3IoZGV2LCBNVF9NQUNfQUREUl9EVzAsIGdldF91bmFsaWduZWRfbGUzMihkZXYtPm1hY2FkZHIpKTsKIAltdDc2X3dyKGRldiwgTVRfTUFDX0FERFJfRFcxLCBnZXRfdW5hbGlnbmVkX2xlMTYoZGV2LT5tYWNhZGRyICsgNCkgfAotCQlNVDc2X1NFVChNVF9NQUNfQUREUl9EVzFfVTJNRV9NQVNLLCAweGZmKSk7CisJCUZJRUxEX1BSRVAoTVRfTUFDX0FERFJfRFcxX1UyTUVfTUFTSywgMHhmZikpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNzYsNyArMTc2LDcgQEAKIAl1OCBtYXhfcHdyOwogCiAJdmFsID0gbXQ3NjAxdV9ycihkZXYsIE1UX1RYX0FMQ19DRkdfMCk7Ci0JbWF4X3B3ciA9IE1UNzZfR0VUKE1UX1RYX0FMQ19DRkdfMF9MSU1JVF8wLCB2YWwpOworCW1heF9wd3IgPSBGSUVMRF9HRVQoTVRfVFhfQUxDX0NGR18wX0xJTUlUXzAsIHZhbCk7CiAKIAlpZiAobXQ3NjAxdV9oYXNfdHNzaShkZXYsIGVlcHJvbSkpIHsKIAkJbXQ3NjAxdV9zZXRfY2hhbm5lbF90YXJnZXRfcG93ZXIoZGV2LCBlZXByb20sIG1heF9wd3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9pbml0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L2luaXQuYwppbmRleCA4ZmE3OGQ3Li40NGQ0NmUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L2luaXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L2luaXQuYwpAQCAtMTA4LDggKzEwOCw5IEBACiB7CiAJdTMyIHZhbDsKIAotCXZhbCA9IE1UNzZfU0VUKE1UX1VTQl9ETUFfQ0ZHX1JYX0JVTEtfQUdHX1RPVVQsIE1UX1VTQl9BR0dSX1RJTUVPVVQpIHwKLQkgICAgICBNVDc2X1NFVChNVF9VU0JfRE1BX0NGR19SWF9CVUxLX0FHR19MTVQsIE1UX1VTQl9BR0dSX1NJWkVfTElNSVQpIHwKKwl2YWwgPSBGSUVMRF9QUkVQKE1UX1VTQl9ETUFfQ0ZHX1JYX0JVTEtfQUdHX1RPVVQsIE1UX1VTQl9BR0dSX1RJTUVPVVQpIHwKKwkgICAgICBGSUVMRF9QUkVQKE1UX1VTQl9ETUFfQ0ZHX1JYX0JVTEtfQUdHX0xNVCwKKwkJCSBNVF9VU0JfQUdHUl9TSVpFX0xJTUlUKSB8CiAJICAgICAgTVRfVVNCX0RNQV9DRkdfUlhfQlVMS19FTiB8CiAJICAgICAgTVRfVVNCX0RNQV9DRkdfVFhfQlVMS19FTjsKIAlpZiAoZGV2LT5pbl9tYXhfcGFja2V0ID09IDUxMikKQEAgLTM5Niw4ICszOTcsOSBAQAogCiAJbXQ3NjAxdV9ybXcoZGV2LCBNVF9VU19DWUNfQ0ZHLCBNVF9VU19DWUNfQ05ULCAweDFlKTsKIAotCW10NzYwMXVfd3IoZGV2LCBNVF9UWE9QX0NUUkxfQ0ZHLCBNVDc2X1NFVChNVF9UWE9QX1RSVU5fRU4sIDB4M2YpIHwKLQkJCQkJICBNVDc2X1NFVChNVF9UWE9QX0VYVF9DQ0FfRExZLCAweDU4KSk7CisJbXQ3NjAxdV93cihkZXYsIE1UX1RYT1BfQ1RSTF9DRkcsCisJCSAgIEZJRUxEX1BSRVAoTVRfVFhPUF9UUlVOX0VOLCAweDNmKSB8CisJCSAgIEZJRUxEX1BSRVAoTVRfVFhPUF9FWFRfQ0NBX0RMWSwgMHg1OCkpOwogCiAJcmV0ID0gbXQ3NjAxdV9lZXByb21faW5pdChkZXYpOwogCWlmIChyZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L21hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9tYWMuYwppbmRleCBlMjFjNTNlLi4zYzU3NjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvbWFjLmMKQEAgLTE5LDEzICsxOSwxMyBAQAogc3RhdGljIHZvaWQKIG10NzZfbWFjX3Byb2Nlc3NfdHhfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnR4cmF0ZSwgdTE2IHJhdGUpCiB7Ci0JdTggaWR4ID0gTVQ3Nl9HRVQoTVRfVFhXSV9SQVRFX01DUywgcmF0ZSk7CisJdTggaWR4ID0gRklFTERfR0VUKE1UX1RYV0lfUkFURV9NQ1MsIHJhdGUpOwogCiAJdHhyYXRlLT5pZHggPSAwOwogCXR4cmF0ZS0+ZmxhZ3MgPSAwOwogCXR4cmF0ZS0+Y291bnQgPSAxOwogCi0Jc3dpdGNoIChNVDc2X0dFVChNVF9UWFdJX1JBVEVfUEhZX01PREUsIHJhdGUpKSB7CisJc3dpdGNoIChGSUVMRF9HRVQoTVRfVFhXSV9SQVRFX1BIWV9NT0RFLCByYXRlKSkgewogCWNhc2UgTVRfUEhZX1RZUEVfT0ZETToKIAkJdHhyYXRlLT5pZHggPSBpZHggKyA0OwogCQlyZXR1cm47CkBAIC00Nyw3ICs0Nyw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoTVQ3Nl9HRVQoTVRfVFhXSV9SQVRFX0JXLCByYXRlKSA9PSBNVF9QSFlfQldfNDApCisJaWYgKEZJRUxEX0dFVChNVF9UWFdJX1JBVEVfQlcsIHJhdGUpID09IE1UX1BIWV9CV180MCkKIAkJdHhyYXRlLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfUkNfNDBfTUhaX1dJRFRIOwogCiAJaWYgKHJhdGUgJiBNVF9UWFdJX1JBVEVfU0dJKQpAQCAtMTI1LDkgKzEyNSw5IEBACiAJCWJ3ID0gMDsKIAl9CiAKLQlyYXRldmFsID0gTVQ3Nl9TRVQoTVRfUlhXSV9SQVRFX01DUywgcmF0ZV9pZHgpOwotCXJhdGV2YWwgfD0gTVQ3Nl9TRVQoTVRfUlhXSV9SQVRFX1BIWSwgcGh5KTsKLQlyYXRldmFsIHw9IE1UNzZfU0VUKE1UX1JYV0lfUkFURV9CVywgYncpOworCXJhdGV2YWwgPSBGSUVMRF9QUkVQKE1UX1JYV0lfUkFURV9NQ1MsIHJhdGVfaWR4KTsKKwlyYXRldmFsIHw9IEZJRUxEX1BSRVAoTVRfUlhXSV9SQVRFX1BIWSwgcGh5KTsKKwlyYXRldmFsIHw9IEZJRUxEX1BSRVAoTVRfUlhXSV9SQVRFX0JXLCBidyk7CiAJaWYgKHJhdGUtPmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJKQogCQlyYXRldmFsIHw9IE1UX1JYV0lfUkFURV9TR0k7CiAKQEAgLTE1Niw5ICsxNTYsOSBAQAogCXN0YXQuc3VjY2VzcyA9ICEhKHZhbCAmIE1UX1RYX1NUQVRfRklGT19TVUNDRVNTKTsKIAlzdGF0LmFnZ3IgPSAhISh2YWwgJiBNVF9UWF9TVEFUX0ZJRk9fQUdHUik7CiAJc3RhdC5hY2tfcmVxID0gISEodmFsICYgTVRfVFhfU1RBVF9GSUZPX0FDS1JFUSk7Ci0Jc3RhdC5wa3RpZCA9IE1UNzZfR0VUKE1UX1RYX1NUQVRfRklGT19QSURfVFlQRSwgdmFsKTsKLQlzdGF0LndjaWQgPSBNVDc2X0dFVChNVF9UWF9TVEFUX0ZJRk9fV0NJRCwgdmFsKTsKLQlzdGF0LnJhdGUgPSBNVDc2X0dFVChNVF9UWF9TVEFUX0ZJRk9fUkFURSwgdmFsKTsKKwlzdGF0LnBrdGlkID0gRklFTERfR0VUKE1UX1RYX1NUQVRfRklGT19QSURfVFlQRSwgdmFsKTsKKwlzdGF0LndjaWQgPSBGSUVMRF9HRVQoTVRfVFhfU1RBVF9GSUZPX1dDSUQsIHZhbCk7CisJc3RhdC5yYXRlID0gRklFTERfR0VUKE1UX1RYX1NUQVRfRklGT19SQVRFLCB2YWwpOwogCiAJcmV0dXJuIHN0YXQ7CiB9CkBAIC0yNzAsNyArMjcwLDcgQEAKIAl9CiAKIAl2YWwgJj0gfk1UX0JFQUNPTl9USU1FX0NGR19JTlRWQUw7Ci0JdmFsIHw9IE1UNzZfU0VUKE1UX0JFQUNPTl9USU1FX0NGR19JTlRWQUwsIGludGVydmFsIDw8IDQpIHwKKwl2YWwgfD0gRklFTERfUFJFUChNVF9CRUFDT05fVElNRV9DRkdfSU5UVkFMLCBpbnRlcnZhbCA8PCA0KSB8CiAJCU1UX0JFQUNPTl9USU1FX0NGR19USU1FUl9FTiB8CiAJCU1UX0JFQUNPTl9USU1FX0NGR19TWU5DX01PREUgfAogCQlNVF9CRUFDT05fVElNRV9DRkdfVEJUVF9FTjsKQEAgLTM0OSw4ICszNDksOCBAQAogCXU4IHptYWNbRVRIX0FMRU5dID0ge307CiAJdTMyIGF0dHI7CiAKLQlhdHRyID0gTVQ3Nl9TRVQoTVRfV0NJRF9BVFRSX0JTU19JRFgsIHZpZl9pZHggJiA3KSB8Ci0JICAgICAgIE1UNzZfU0VUKE1UX1dDSURfQVRUUl9CU1NfSURYX0VYVCwgISEodmlmX2lkeCAmIDgpKTsKKwlhdHRyID0gRklFTERfUFJFUChNVF9XQ0lEX0FUVFJfQlNTX0lEWCwgdmlmX2lkeCAmIDcpIHwKKwkgICAgICAgRklFTERfUFJFUChNVF9XQ0lEX0FUVFJfQlNTX0lEWF9FWFQsICEhKHZpZl9pZHggJiA4KSk7CiAKIAltdDc2X3dyKGRldiwgTVRfV0NJRF9BVFRSKGlkeCksIGF0dHIpOwogCkBAIC0zODIsMTUgKzM4MiwxNSBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJbXQ3NjAxdV93cihkZXYsIE1UX01BWF9MRU5fQ0ZHLCAweGEwZmZmIHwKLQkJICAgTVQ3Nl9TRVQoTVRfTUFYX0xFTl9DRkdfQU1QRFUsIG1pbl9mYWN0b3IpKTsKKwkJICAgRklFTERfUFJFUChNVF9NQVhfTEVOX0NGR19BTVBEVSwgbWluX2ZhY3RvcikpOwogfQogCiBzdGF0aWMgdm9pZAogbXQ3Nl9tYWNfcHJvY2Vzc19yYXRlKHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0dXMsIHUxNiByYXRlKQogewotCXU4IGlkeCA9IE1UNzZfR0VUKE1UX1JYV0lfUkFURV9NQ1MsIHJhdGUpOworCXU4IGlkeCA9IEZJRUxEX0dFVChNVF9SWFdJX1JBVEVfTUNTLCByYXRlKTsKIAotCXN3aXRjaCAoTVQ3Nl9HRVQoTVRfUlhXSV9SQVRFX1BIWSwgcmF0ZSkpIHsKKwlzd2l0Y2ggKEZJRUxEX0dFVChNVF9SWFdJX1JBVEVfUEhZLCByYXRlKSkgewogCWNhc2UgTVRfUEhZX1RZUEVfT0ZETToKIAkJaWYgKFdBUk5fT04oaWR4ID49IDgpKQogCQkJaWR4ID0gMDsKQEAgLTQzNiw3ICs0MzYsNyBAQAogCQkJICB1MTYgcmF0ZSwgaW50IHJzc2kpCiB7CiAJZGV2LT5iY25fZnJlcV9vZmYgPSByeHdpLT5mcmVxX29mZjsKLQlkZXYtPmJjbl9waHlfbW9kZSA9IE1UNzZfR0VUKE1UX1JYV0lfUkFURV9QSFksIHJhdGUpOworCWRldi0+YmNuX3BoeV9tb2RlID0gRklFTERfR0VUKE1UX1JYV0lfUkFURV9QSFksIHJhdGUpOwogCWRldi0+YXZnX3Jzc2kgPSAoZGV2LT5hdmdfcnNzaSAqIDE1KSAvIDE2ICsgKHJzc2kgPDwgOCk7CiB9CiAKQEAgLTQ1OCw3ICs0NTgsNyBAQAogCXUxNiByYXRlID0gbGUxNl90b19jcHUocnh3aS0+cmF0ZSk7CiAJaW50IHJzc2k7CiAKLQlsZW4gPSBNVDc2X0dFVChNVF9SWFdJX0NUTF9NUERVX0xFTiwgY3RsKTsKKwlsZW4gPSBGSUVMRF9HRVQoTVRfUlhXSV9DVExfTVBEVV9MRU4sIGN0bCk7CiAJaWYgKGxlbiA8IDEwKQogCQlyZXR1cm4gMDsKIApAQCAtNTQyLDggKzU0Miw4IEBACiAKIAl2YWwgPSBtdDc2MDF1X3JyKGRldiwgTVRfV0NJRF9BVFRSKGlkeCkpOwogCXZhbCAmPSB+TVRfV0NJRF9BVFRSX1BLRVlfTU9ERSAmIH5NVF9XQ0lEX0FUVFJfUEtFWV9NT0RFX0VYVDsKLQl2YWwgfD0gTVQ3Nl9TRVQoTVRfV0NJRF9BVFRSX1BLRVlfTU9ERSwgY2lwaGVyICYgNykgfAotCSAgICAgICBNVDc2X1NFVChNVF9XQ0lEX0FUVFJfUEtFWV9NT0RFX0VYVCwgY2lwaGVyID4+IDMpOworCXZhbCB8PSBGSUVMRF9QUkVQKE1UX1dDSURfQVRUUl9QS0VZX01PREUsIGNpcGhlciAmIDcpIHwKKwkgICAgICAgRklFTERfUFJFUChNVF9XQ0lEX0FUVFJfUEtFWV9NT0RFX0VYVCwgY2lwaGVyID4+IDMpOwogCXZhbCAmPSB+TVRfV0NJRF9BVFRSX1BBSVJXSVNFOwogCXZhbCB8PSBNVF9XQ0lEX0FUVFJfUEFJUldJU0UgKgogCQkhIShrZXkgJiYga2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvbWFpbi5jCmluZGV4IGU3MGRkOTUuLjQzZWJkNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvbWFpbi5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSAibXQ3NjAxdS5oIgogI2luY2x1ZGUgIm1hYy5oIgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiBzdGF0aWMgaW50IG10NzYwMXVfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L21jdS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9tY3UuYwppbmRleCA5MWM0YjM0Li5kYmRmYjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L21jdS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvbWN1LmMKQEAgLTQzLDggKzQzLDggQEAKIAkJCQkJICAgIHU4IHNlcSwgZW51bSBtY3VfY21kIGNtZCkKIHsKIAlXQVJOX09OKG10NzYwMXVfZG1hX3NrYl93cmFwKHNrYiwgQ1BVX1RYX1BPUlQsIERNQV9DT01NQU5ELAotCQkJCSAgICAgTVQ3Nl9TRVQoTVRfVFhEX0NNRF9JTkZPX1NFUSwgc2VxKSB8Ci0JCQkJICAgICBNVDc2X1NFVChNVF9UWERfQ01EX0lORk9fVFlQRSwgY21kKSkpOworCQkJCSAgICAgRklFTERfUFJFUChNVF9UWERfQ01EX0lORk9fU0VRLCBzZXEpIHwKKwkJCQkgICAgIEZJRUxEX1BSRVAoTVRfVFhEX0NNRF9JTkZPX1RZUEUsIGNtZCkpKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHRyYWNlX210X21jdV9tc2dfc2VuZF9jcyhzdHJ1Y3QgbXQ3NjAxdV9kZXYgKmRldiwKQEAgLTEwMCwxMyArMTAwLDEzIEBACiAJCQlkZXZfZXJyKGRldi0+ZGV2LCAiRXJyb3I6IE1DVSByZXNwIHVyYiBmYWlsZWQ6JWRcbiIsCiAJCQkJdXJiX3N0YXR1cyk7CiAKLQkJaWYgKE1UNzZfR0VUKE1UX1JYRF9DTURfSU5GT19DTURfU0VRLCByeGZjZSkgPT0gc2VxICYmCi0JCSAgICBNVDc2X0dFVChNVF9SWERfQ01EX0lORk9fRVZUX1RZUEUsIHJ4ZmNlKSA9PSBDTURfRE9ORSkKKwkJaWYgKEZJRUxEX0dFVChNVF9SWERfQ01EX0lORk9fQ01EX1NFUSwgcnhmY2UpID09IHNlcSAmJgorCQkgICAgRklFTERfR0VUKE1UX1JYRF9DTURfSU5GT19FVlRfVFlQRSwgcnhmY2UpID09IENNRF9ET05FKQogCQkJcmV0dXJuIDA7CiAKLQkJZGV2X2VycihkZXYtPmRldiwgIkVycm9yOiBNQ1UgcmVzcCBldnQ6JWhoeCBzZXE6JWhoeC0laGh4IVxuIiwKLQkJCU1UNzZfR0VUKE1UX1JYRF9DTURfSU5GT19FVlRfVFlQRSwgcnhmY2UpLAotCQkJc2VxLCBNVDc2X0dFVChNVF9SWERfQ01EX0lORk9fQ01EX1NFUSwgcnhmY2UpKTsKKwkJZGV2X2VycihkZXYtPmRldiwgIkVycm9yOiBNQ1UgcmVzcCBldnQ6JWx4IHNlcTolaGh4LSVseCFcbiIsCisJCQlGSUVMRF9HRVQoTVRfUlhEX0NNRF9JTkZPX0VWVF9UWVBFLCByeGZjZSksCisJCQlzZXEsIEZJRUxEX0dFVChNVF9SWERfQ01EX0lORk9fQ01EX1NFUSwgcnhmY2UpKTsKIAl9CiAKIAlkZXZfZXJyKGRldi0+ZGV2LCAiRXJyb3I6ICVzIHRpbWVkIG91dFxuIiwgX19mdW5jX18pOwpAQCAtMjkxLDkgKzI5MSw5IEBACiAJdTMyIHZhbDsKIAlpbnQgcmV0OwogCi0JcmVnID0gY3B1X3RvX2xlMzIoTVQ3Nl9TRVQoTVRfVFhEX0lORk9fVFlQRSwgRE1BX1BBQ0tFVCkgfAotCQkJICBNVDc2X1NFVChNVF9UWERfSU5GT19EX1BPUlQsIENQVV9UWF9QT1JUKSB8Ci0JCQkgIE1UNzZfU0VUKE1UX1RYRF9JTkZPX0xFTiwgbGVuKSk7CisJcmVnID0gY3B1X3RvX2xlMzIoRklFTERfUFJFUChNVF9UWERfSU5GT19UWVBFLCBETUFfUEFDS0VUKSB8CisJCQkgIEZJRUxEX1BSRVAoTVRfVFhEX0lORk9fRF9QT1JULCBDUFVfVFhfUE9SVCkgfAorCQkJICBGSUVMRF9QUkVQKE1UX1RYRF9JTkZPX0xFTiwgbGVuKSk7CiAJbWVtY3B5KGJ1Zi5idWYsICZyZWcsIHNpemVvZihyZWcpKTsKIAltZW1jcHkoYnVmLmJ1ZiArIHNpemVvZihyZWcpLCBkYXRhLCBsZW4pOwogCW1lbXNldChidWYuYnVmICsgc2l6ZW9mKHJlZykgKyBsZW4sIDAsIDgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9tdDc2MDF1LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L210NzYwMXUuaAppbmRleCA0MjhiZDJmLi5jN2VjNDA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L210NzYwMXUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L210NzYwMXUuaApAQCAtMTUsNiArMTUsNyBAQAogI2lmbmRlZiBNVDc2MDFVX0gKICNkZWZpbmUgTVQ3NjAxVV9ICiAKKyNpbmNsdWRlIDxsaW51eC9iaXRmaWVsZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CkBAIC0yNCw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogCiAjaW5jbHVkZSAicmVncy5oIgotI2luY2x1ZGUgInV0aWwuaCIKIAogI2RlZmluZSBNVF9DQUxJQlJBVEVfSU5URVJWQUwJCSg0ICogSFopCiAKQEAgLTI5OSw3ICsyOTksNyBAQAogCiAvKiBDb21wYXRpYmlsaXR5IHdpdGggbXQ3NiAqLwogI2RlZmluZSBtdDc2X3Jtd19maWVsZChfZGV2LCBfcmVnLCBfZmllbGQsIF92YWwpCVwKLQltdDc2X3JtdyhfZGV2LCBfcmVnLCBfZmllbGQsIE1UNzZfU0VUKF9maWVsZCwgX3ZhbCkpCisJbXQ3Nl9ybXcoX2RldiwgX3JlZywgX2ZpZWxkLCBGSUVMRF9QUkVQKF9maWVsZCwgX3ZhbCkpCiAKIHN0YXRpYyBpbmxpbmUgdTMyIG10NzZfcnIoc3RydWN0IG10NzYwMXVfZGV2ICpkZXYsIHUzMiBvZmZzZXQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9waHkuYwppbmRleCAxOTA4YWY2Li5jYTA5YTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvcGh5LmMKQEAgLTQxLDExICs0MSwxMiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQltdDc2MDF1X3dyKGRldiwgTVRfUkZfQ1NSX0NGRywgTVQ3Nl9TRVQoTVRfUkZfQ1NSX0NGR19EQVRBLCB2YWx1ZSkgfAotCQkJCSAgICAgICBNVDc2X1NFVChNVF9SRl9DU1JfQ0ZHX1JFR19CQU5LLCBiYW5rKSB8Ci0JCQkJICAgICAgIE1UNzZfU0VUKE1UX1JGX0NTUl9DRkdfUkVHX0lELCBvZmZzZXQpIHwKLQkJCQkgICAgICAgTVRfUkZfQ1NSX0NGR19XUiB8Ci0JCQkJICAgICAgIE1UX1JGX0NTUl9DRkdfS0lDSyk7CisJbXQ3NjAxdV93cihkZXYsIE1UX1JGX0NTUl9DRkcsCisJCSAgIEZJRUxEX1BSRVAoTVRfUkZfQ1NSX0NGR19EQVRBLCB2YWx1ZSkgfAorCQkgICBGSUVMRF9QUkVQKE1UX1JGX0NTUl9DRkdfUkVHX0JBTkssIGJhbmspIHwKKwkJICAgRklFTERfUFJFUChNVF9SRl9DU1JfQ0ZHX1JFR19JRCwgb2Zmc2V0KSB8CisJCSAgIE1UX1JGX0NTUl9DRkdfV1IgfAorCQkgICBNVF9SRl9DU1JfQ0ZHX0tJQ0spOwogCXRyYWNlX3JmX3dyaXRlKGRldiwgYmFuaywgb2Zmc2V0LCB2YWx1ZSk7CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnJlZ19hdG9taWNfbXV0ZXgpOwpAQCAtNzQsMTcgKzc1LDE4IEBACiAJaWYgKCFtdDc2X3BvbGwoZGV2LCBNVF9SRl9DU1JfQ0ZHLCBNVF9SRl9DU1JfQ0ZHX0tJQ0ssIDAsIDEwMCkpCiAJCWdvdG8gb3V0OwogCi0JbXQ3NjAxdV93cihkZXYsIE1UX1JGX0NTUl9DRkcsIE1UNzZfU0VUKE1UX1JGX0NTUl9DRkdfUkVHX0JBTkssIGJhbmspIHwKLQkJCQkgICAgICAgTVQ3Nl9TRVQoTVRfUkZfQ1NSX0NGR19SRUdfSUQsIG9mZnNldCkgfAotCQkJCSAgICAgICBNVF9SRl9DU1JfQ0ZHX0tJQ0spOworCW10NzYwMXVfd3IoZGV2LCBNVF9SRl9DU1JfQ0ZHLAorCQkgICBGSUVMRF9QUkVQKE1UX1JGX0NTUl9DRkdfUkVHX0JBTkssIGJhbmspIHwKKwkJICAgRklFTERfUFJFUChNVF9SRl9DU1JfQ0ZHX1JFR19JRCwgb2Zmc2V0KSB8CisJCSAgIE1UX1JGX0NTUl9DRkdfS0lDSyk7CiAKIAlpZiAoIW10NzZfcG9sbChkZXYsIE1UX1JGX0NTUl9DRkcsIE1UX1JGX0NTUl9DRkdfS0lDSywgMCwgMTAwKSkKIAkJZ290byBvdXQ7CiAKIAl2YWwgPSBtdDc2MDF1X3JyKGRldiwgTVRfUkZfQ1NSX0NGRyk7Ci0JaWYgKE1UNzZfR0VUKE1UX1JGX0NTUl9DRkdfUkVHX0lELCB2YWwpID09IG9mZnNldCAmJgotCSAgICBNVDc2X0dFVChNVF9SRl9DU1JfQ0ZHX1JFR19CQU5LLCB2YWwpID09IGJhbmspIHsKLQkJcmV0ID0gTVQ3Nl9HRVQoTVRfUkZfQ1NSX0NGR19EQVRBLCB2YWwpOworCWlmIChGSUVMRF9HRVQoTVRfUkZfQ1NSX0NGR19SRUdfSUQsIHZhbCkgPT0gb2Zmc2V0ICYmCisJICAgIEZJRUxEX0dFVChNVF9SRl9DU1JfQ0ZHX1JFR19CQU5LLCB2YWwpID09IGJhbmspIHsKKwkJcmV0ID0gRklFTERfR0VUKE1UX1JGX0NTUl9DRkdfREFUQSwgdmFsKTsKIAkJdHJhY2VfcmZfcmVhZChkZXYsIGJhbmssIG9mZnNldCwgcmV0KTsKIAl9CiBvdXQ6CkBAIC0xMzksOCArMTQxLDggQEAKIAl9CiAKIAltdDc2MDF1X3dyKGRldiwgTVRfQkJQX0NTUl9DRkcsCi0JCSAgIE1UNzZfU0VUKE1UX0JCUF9DU1JfQ0ZHX1ZBTCwgdmFsKSB8Ci0JCSAgIE1UNzZfU0VUKE1UX0JCUF9DU1JfQ0ZHX1JFR19OVU0sIG9mZnNldCkgfAorCQkgICBGSUVMRF9QUkVQKE1UX0JCUF9DU1JfQ0ZHX1ZBTCwgdmFsKSB8CisJCSAgIEZJRUxEX1BSRVAoTVRfQkJQX0NTUl9DRkdfUkVHX05VTSwgb2Zmc2V0KSB8CiAJCSAgIE1UX0JCUF9DU1JfQ0ZHX1JXX01PREUgfCBNVF9CQlBfQ1NSX0NGR19CVVNZKTsKIAl0cmFjZV9iYnBfd3JpdGUoZGV2LCBvZmZzZXQsIHZhbCk7CiBvdXQ6CkBAIC0xNjMsNyArMTY1LDcgQEAKIAkJZ290byBvdXQ7CiAKIAltdDc2MDF1X3dyKGRldiwgTVRfQkJQX0NTUl9DRkcsCi0JCSAgIE1UNzZfU0VUKE1UX0JCUF9DU1JfQ0ZHX1JFR19OVU0sIG9mZnNldCkgfAorCQkgICBGSUVMRF9QUkVQKE1UX0JCUF9DU1JfQ0ZHX1JFR19OVU0sIG9mZnNldCkgfAogCQkgICBNVF9CQlBfQ1NSX0NGR19SV19NT0RFIHwgTVRfQkJQX0NTUl9DRkdfQlVTWSB8CiAJCSAgIE1UX0JCUF9DU1JfQ0ZHX1JFQUQpOwogCkBAIC0xNzEsOCArMTczLDggQEAKIAkJZ290byBvdXQ7CiAKIAl2YWwgPSBtdDc2MDF1X3JyKGRldiwgTVRfQkJQX0NTUl9DRkcpOwotCWlmIChNVDc2X0dFVChNVF9CQlBfQ1NSX0NGR19SRUdfTlVNLCB2YWwpID09IG9mZnNldCkgewotCQlyZXQgPSBNVDc2X0dFVChNVF9CQlBfQ1NSX0NGR19WQUwsIHZhbCk7CisJaWYgKEZJRUxEX0dFVChNVF9CQlBfQ1NSX0NGR19SRUdfTlVNLCB2YWwpID09IG9mZnNldCkgeworCQlyZXQgPSBGSUVMRF9HRVQoTVRfQkJQX0NTUl9DRkdfVkFMLCB2YWwpOwogCQl0cmFjZV9iYnBfcmVhZChkZXYsIG9mZnNldCwgcmV0KTsKIAl9CiBvdXQ6CkBAIC0yNDksOSArMjUxLDkgQEAKIAkJCS8qIGJ3NDAgKi8geyAtMiwgMTYsIDM0IH0KIAkJfQogCX07Ci0JaW50IGJ3ID0gTVQ3Nl9HRVQoTVRfUlhXSV9SQVRFX0JXLCByYXRlKTsKLQlpbnQgYXV4X2xuYSA9IE1UNzZfR0VUKE1UX1JYV0lfQU5UX0FVWF9MTkEsIHJ4d2ktPmFudCk7Ci0JaW50IGxuYV9pZCA9IE1UNzZfR0VUKE1UX1JYV0lfR0FJTl9SU1NJX0xOQV9JRCwgcnh3aS0+Z2Fpbik7CisJaW50IGJ3ID0gRklFTERfR0VUKE1UX1JYV0lfUkFURV9CVywgcmF0ZSk7CisJaW50IGF1eF9sbmEgPSBGSUVMRF9HRVQoTVRfUlhXSV9BTlRfQVVYX0xOQSwgcnh3aS0+YW50KTsKKwlpbnQgbG5hX2lkID0gRklFTERfR0VUKE1UX1JYV0lfR0FJTl9SU1NJX0xOQV9JRCwgcnh3aS0+Z2Fpbik7CiAJaW50IHZhbDsKIAogCWlmIChsbmFfaWQpIC8qIExOQSBpZCBjYW4gYmUgMCwgMiwgMy4gKi8KQEAgLTI1OSw3ICsyNjEsNyBAQAogCiAJdmFsID0gODsKIAl2YWwgLT0gbG5hW2F1eF9sbmFdW2J3XVtsbmFfaWRdOwotCXZhbCAtPSBNVDc2X0dFVChNVF9SWFdJX0dBSU5fUlNTSV9WQUwsIHJ4d2ktPmdhaW4pOworCXZhbCAtPSBGSUVMRF9HRVQoTVRfUlhXSV9HQUlOX1JTU0lfVkFMLCByeHdpLT5nYWluKTsKIAl2YWwgLT0gZGV2LT5lZS0+bG5hX2dhaW47CiAJdmFsIC09IGRldi0+ZWUtPnJzc2lfb2Zmc2V0WzBdOwogCkBAIC05MzksNyArOTQxLDcgQEAKIAlkZXZfZGJnKGRldi0+ZGV2LCAiZmluYWwgZGlmZjogJTA4eFxuIiwgZGlmZl9wd3IpOwogCiAJdmFsID0gbXQ3NjAxdV9ycihkZXYsIE1UX1RYX0FMQ19DRkdfMSk7Ci0JY3Vycl9wd3IgPSBzNl90b19pbnQoTVQ3Nl9HRVQoTVRfVFhfQUxDX0NGR18xX1RFTVBfQ09NUCwgdmFsKSk7CisJY3Vycl9wd3IgPSBzNl90b19pbnQoRklFTERfR0VUKE1UX1RYX0FMQ19DRkdfMV9URU1QX0NPTVAsIHZhbCkpOwogCWRpZmZfcHdyICs9IGN1cnJfcHdyOwogCXZhbCA9ICh2YWwgJiB+TVRfVFhfQUxDX0NGR18xX1RFTVBfQ09NUCkgfCBpbnRfdG9fczYoZGlmZl9wd3IpOwogCW10NzYwMXVfd3IoZGV2LCBNVF9UWF9BTENfQ0ZHXzEsIHZhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L3JlZ3MuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvcmVncy5oCmluZGV4IGFmZDg5NzguLjI3YTQyOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvcmVncy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvcmVncy5oCkBAIC0xNywxMCArMTcsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKLSNpZm5kZWYgR0VOTUFTSwotI2RlZmluZSBHRU5NQVNLKGgsIGwpICAgICAgICgoKFUzMl9DKDEpIDw8ICgoaCkgLSAobCkgKyAxKSkgLSAxKSA8PCAobCkpCi0jZW5kaWYKLQogI2RlZmluZSBNVF9BU0lDX1ZFUlNJT04JCQkweDAwMDAKIAogI2RlZmluZSBNVDc2WFhfUkVWX0UzCQkweDIyCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L3R4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L3R4LmMKaW5kZXggYTBhMzNkYy4uYWQ3N2JlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS90eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvdHguYwpAQCAtMTc1LDExICsxNzUsMTIgQEAKIAkJYmFfc2l6ZSA9IG1pbl90KGludCwgNjMsIGJhX3NpemUpOwogCQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX1JBVEVfQ1RSTF9QUk9CRSkKIAkJCWJhX3NpemUgPSAwOwotCQl0eHdpLT5hY2tfY3RsIHw9IE1UNzZfU0VUKE1UX1RYV0lfQUNLX0NUTF9CQV9XSU5ET1csIGJhX3NpemUpOworCQl0eHdpLT5hY2tfY3RsIHw9IEZJRUxEX1BSRVAoTVRfVFhXSV9BQ0tfQ1RMX0JBX1dJTkRPVywgYmFfc2l6ZSk7CiAKLQkJdHh3aS0+ZmxhZ3MgPSBjcHVfdG9fbGUxNihNVF9UWFdJX0ZMQUdTX0FNUERVIHwKLQkJCQkJICBNVDc2X1NFVChNVF9UWFdJX0ZMQUdTX01QRFVfREVOU0lUWSwKLQkJCQkJCSAgIHN0YS0+aHRfY2FwLmFtcGR1X2RlbnNpdHkpKTsKKwkJdHh3aS0+ZmxhZ3MgPQorCQkJY3B1X3RvX2xlMTYoTVRfVFhXSV9GTEFHU19BTVBEVSB8CisJCQkJICAgIEZJRUxEX1BSRVAoTVRfVFhXSV9GTEFHU19NUERVX0RFTlNJVFksCisJCQkJCSAgICAgICBzdGEtPmh0X2NhcC5hbXBkdV9kZW5zaXR5KSk7CiAJCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfUkFURV9DVFJMX1BST0JFKQogCQkJdHh3aS0+ZmxhZ3MgPSAwOwogCX0KQEAgLTE4OCw3ICsxODksNyBAQAogCiAJaXNfcHJvYmUgPSAhIShpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfUkFURV9DVFJMX1BST0JFKTsKIAlwa3RfaWQgPSBtdDc2MDF1X3R4X3BrdGlkX2VuYyhkZXYsIHJhdGVfY3RsICYgMHg3LCBpc19wcm9iZSk7Ci0JcGt0X2xlbiB8PSBNVDc2X1NFVChNVF9UWFdJX0xFTl9QS1RJRCwgcGt0X2lkKTsKKwlwa3RfbGVuIHw9IEZJRUxEX1BSRVAoTVRfVFhXSV9MRU5fUEtUSUQsIHBrdF9pZCk7CiAJdHh3aS0+bGVuX2N0bCA9IGNwdV90b19sZTE2KHBrdF9sZW4pOwogCiAJcmV0dXJuIHR4d2k7CkBAIC0yODUsOSArMjg2LDkgQEAKIAlXQVJOX09OKGN3X21pbiA+IDB4Zik7CiAJV0FSTl9PTihjd19tYXggPiAweGYpOwogCi0JdmFsID0gTVQ3Nl9TRVQoTVRfRURDQV9DRkdfQUlGU04sIHBhcmFtcy0+YWlmcykgfAotCSAgICAgIE1UNzZfU0VUKE1UX0VEQ0FfQ0ZHX0NXTUlOLCBjd19taW4pIHwKLQkgICAgICBNVDc2X1NFVChNVF9FRENBX0NGR19DV01BWCwgY3dfbWF4KTsKKwl2YWwgPSBGSUVMRF9QUkVQKE1UX0VEQ0FfQ0ZHX0FJRlNOLCBwYXJhbXMtPmFpZnMpIHwKKwkgICAgICBGSUVMRF9QUkVQKE1UX0VEQ0FfQ0ZHX0NXTUlOLCBjd19taW4pIHwKKwkgICAgICBGSUVMRF9QUkVQKE1UX0VEQ0FfQ0ZHX0NXTUFYLCBjd19tYXgpOwogCS8qIFRPRE86IGJhc2VkIG9uIHVzZXItY29udHJvbGxlZCBFbmFibGVUeEJ1cnN0IHZhciB2ZW5kb3IgZHJ2IHNldHMKIAkgKgkgYSByZWFsbHkgbG9uZyB0eG9wIG9uIEFDMCAoc2VlIGNvbm5lY3QuYzoyMDA5KSBidXQgb25seSBvbgogCSAqCSBjb25uZWN0PyBXaGVuIG5vdCBjb25uZWN0ZWQgc2hvdWxkIGJlIDAuCkBAIC0yOTUsNyArMjk2LDcgQEAKIAlpZiAoIWh3X3EpCiAJCXZhbCB8PSAweDYwOwogCWVsc2UKLQkJdmFsIHw9IE1UNzZfU0VUKE1UX0VEQ0FfQ0ZHX1RYT1AsIHBhcmFtcy0+dHhvcCk7CisJCXZhbCB8PSBGSUVMRF9QUkVQKE1UX0VEQ0FfQ0ZHX1RYT1AsIHBhcmFtcy0+dHhvcCk7CiAJbXQ3Nl93cihkZXYsIE1UX0VEQ0FfQ0ZHX0FDKGh3X3EpLCB2YWwpOwogCiAJdmFsID0gbXQ3Nl9ycihkZXYsIE1UX1dNTV9UWE9QKGh3X3EpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvdXRpbC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS91dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OTE0MGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS91dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IEZlbGl4IEZpZXRrYXUgPG5iZEBvcGVud3J0Lm9yZz4KLSAqIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMDkgSXZvIHZhbiBEb29ybiA8SXZEb29ybkBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX01UNzZfVVRJTF9ICi0jZGVmaW5lIF9fTVQ3Nl9VVElMX0gKLQotLyoKLSAqIFBvd2VyIG9mIHR3byBjaGVjaywgdGhpcyB3aWxsIGNoZWNrCi0gKiBpZiB0aGUgbWFzayB0aGF0IGhhcyBiZWVuIGdpdmVuIGNvbnRhaW5zIGFuZCBjb250aWd1b3VzIHNldCBvZiBiaXRzLgotICogTm90ZSB0aGF0IHdlIGNhbm5vdCB1c2UgdGhlIGlzX3Bvd2VyX29mXzIoKSBmdW5jdGlvbiBzaW5jZSB0aGlzCi0gKiBjaGVjayBtdXN0IGJlIGRvbmUgYXQgY29tcGlsZS10aW1lLgotICovCi0jZGVmaW5lIGlzX3Bvd2VyX29mX3R3byh4KQkoICEoKHgpICYgKCh4KS0xKSkgKQotI2RlZmluZSBsb3dfYml0X21hc2soeCkJCSggKCh4KS0xKSAmIH4oeCkgKQotI2RlZmluZSBpc192YWxpZF9tYXNrKHgpCWlzX3Bvd2VyX29mX3R3bygxTFUgKyAoeCkgKyBsb3dfYml0X21hc2soeCkpCi0KLS8qCi0gKiBNYWNyb3MgdG8gZmluZCBmaXJzdCBzZXQgYml0IGluIGEgdmFyaWFibGUuCi0gKiBUaGVzZSBtYWNyb3MgYmVoYXZlIHRoZSBzYW1lIGFzIHRoZSBfX2ZmcygpIGZ1bmN0aW9ucyBidXQKLSAqIHRoZSBtb3N0IGltcG9ydGFudCBkaWZmZXJlbmNlIHRoYXQgdGhpcyBpcyBkb25lIGR1cmluZwotICogY29tcGlsZS10aW1lIHJhdGhlciB0aGVuIHJ1bi10aW1lLgotICovCi0jZGVmaW5lIGNvbXBpbGVfZmZzMihfX3gpIFwKLQlfX2J1aWx0aW5fY2hvb3NlX2V4cHIoKChfX3gpICYgMHgxKSwgMCwgMSkKLQotI2RlZmluZSBjb21waWxlX2ZmczQoX194KSBcCi0JX19idWlsdGluX2Nob29zZV9leHByKCgoX194KSAmIDB4MyksIFwKLQkJCSAgICAgIChjb21waWxlX2ZmczIoKF9feCkpKSwgXAotCQkJICAgICAgKGNvbXBpbGVfZmZzMigoX194KSA+PiAyKSArIDIpKQotCi0jZGVmaW5lIGNvbXBpbGVfZmZzOChfX3gpIFwKLQlfX2J1aWx0aW5fY2hvb3NlX2V4cHIoKChfX3gpICYgMHhmKSwgXAotCQkJICAgICAgKGNvbXBpbGVfZmZzNCgoX194KSkpLCBcCi0JCQkgICAgICAoY29tcGlsZV9mZnM0KChfX3gpID4+IDQpICsgNCkpCi0KLSNkZWZpbmUgY29tcGlsZV9mZnMxNihfX3gpIFwKLQlfX2J1aWx0aW5fY2hvb3NlX2V4cHIoKChfX3gpICYgMHhmZiksIFwKLQkJCSAgICAgIChjb21waWxlX2ZmczgoKF9feCkpKSwgXAotCQkJICAgICAgKGNvbXBpbGVfZmZzOCgoX194KSA+PiA4KSArIDgpKQotCi0jZGVmaW5lIGNvbXBpbGVfZmZzMzIoX194KSBcCi0JX19idWlsdGluX2Nob29zZV9leHByKCgoX194KSAmIDB4ZmZmZiksIFwKLQkJCSAgICAgIChjb21waWxlX2ZmczE2KChfX3gpKSksIFwKLQkJCSAgICAgIChjb21waWxlX2ZmczE2KChfX3gpID4+IDE2KSArIDE2KSkKLQotLyoKLSAqIFRoaXMgbWFjcm8gd2lsbCBjaGVjayB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgRklFTER7OCwxNiwzMn0gbWFjcm9zCi0gKiBUaGUgbWFzayBzaG91bGQgYmUgYSBjb25zdGFudCBub24temVybyBjb250aWd1b3VzIHNldCBvZiBiaXRzIHdoaWNoCi0gKiBkb2VzIG5vdCBleGNlZWQgdGhlIGdpdmVuIHR5cGVsaW1pdC4KLSAqLwotI2RlZmluZSBGSUVMRF9DSEVDSyhfX21hc2spIFwKLQlCVUlMRF9CVUdfT04oIShfX21hc2spIHx8ICFpc192YWxpZF9tYXNrKF9fbWFzaykpCi0KLSNkZWZpbmUgTVQ3Nl9TRVQoX21hc2ssIF92YWwpCQkJCQkJXAotCSh7CQkJCQkJCQlcCi0JCUZJRUxEX0NIRUNLKF9tYXNrKTsJCQkJCVwKLQkJKCgodTMyKSAoX3ZhbCkpIDw8IGNvbXBpbGVfZmZzMzIoX21hc2spKSAmIF9tYXNrOwlcCi0JfSkKLQotI2RlZmluZSBNVDc2X0dFVChfbWFzaywgX3ZhbCkJCQkJCQlcCi0JKHsJCQkJCQkJCVwKLQkJRklFTERfQ0hFQ0soX21hc2spOwkJCQkJXAotCQkodTMyKSAoKChfdmFsKSAmIF9tYXNrKSA+PiBjb21waWxlX2ZmczMyKF9tYXNrKSk7CVwKLQl9KQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JhbGluay9ydDJ4MDAvcnQyeDAwdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYWxpbmsvcnQyeDAwL3J0MngwMHVzYi5jCmluZGV4IDdjZjI2YzYuLjYwMDVlMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JhbGluay9ydDJ4MDAvcnQyeDAwdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmFsaW5rL3J0MngwMC9ydDJ4MDB1c2IuYwpAQCAtODMxLDggKzgzMSwxMCBAQAogCXJ0MngwMGRldi0+YW5jaG9yID0gZGV2bV9rbWFsbG9jKCZ1c2JfZGV2LT5kZXYsCiAJCQkJCXNpemVvZihzdHJ1Y3QgdXNiX2FuY2hvciksCiAJCQkJCUdGUF9LRVJORUwpOwotCWlmICghcnQyeDAwZGV2LT5hbmNob3IpCisJaWYgKCFydDJ4MDBkZXYtPmFuY2hvcikgeworCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGV4aXRfZnJlZV9yZWc7CisJfQogCiAJaW5pdF91c2JfYW5jaG9yKHJ0MngwMGRldi0+YW5jaG9yKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHUuaAppbmRleCA0MzQxZDU2Li4xMDE2NjI4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHUuaApAQCAtMjksNiArMjksNyBAQAogI2RlZmluZSBSVEw4WFhYVV9ERUJVR19IMkMJCTB4ODAwCiAjZGVmaW5lIFJUTDhYWFhVX0RFQlVHX0FDVElPTgkJMHgxMDAwCiAjZGVmaW5lIFJUTDhYWFhVX0RFQlVHX0VGVVNFCQkweDIwMDAKKyNkZWZpbmUgUlRMOFhYWFVfREVCVUdfSU5URVJSVVBUCTB4NDAwMAogCiAjZGVmaW5lIFJUV19VU0JfQ09OVFJPTF9NU0dfVElNRU9VVAk1MDAKICNkZWZpbmUgUlRMOFhYWFVfTUFYX1JFR19QT0xMCQk1MDAKQEAgLTQzLDYgKzQ0LDcgQEAKIAogI2RlZmluZSBUWF9UT1RBTF9QQUdFX05VTQkJMHhmOAogI2RlZmluZSBUWF9UT1RBTF9QQUdFX05VTV84MTkyRQkJMHhmMworI2RlZmluZSBUWF9UT1RBTF9QQUdFX05VTV84NzIzQgkJMHhmNwogLyogKEhQUSArIExQUSArIE5QUSArIFBVQlEpID0gVFhfVE9UQUxfUEFHRV9OVU0gKi8KICNkZWZpbmUgVFhfUEFHRV9OVU1fUFVCUQkJMHhlNwogI2RlZmluZSBUWF9QQUdFX05VTV9ISV9QUQkJMHgwYwpAQCAtNTQsNiArNTYsMTEgQEAKICNkZWZpbmUgVFhfUEFHRV9OVU1fTE9fUFFfODE5MkUJCTB4MGMKICNkZWZpbmUgVFhfUEFHRV9OVU1fTk9STV9QUV84MTkyRQkweDAwCiAKKyNkZWZpbmUgVFhfUEFHRV9OVU1fUFVCUV84NzIzQgkJMHhlNworI2RlZmluZSBUWF9QQUdFX05VTV9ISV9QUV84NzIzQgkJMHgwYworI2RlZmluZSBUWF9QQUdFX05VTV9MT19QUV84NzIzQgkJMHgwMgorI2RlZmluZSBUWF9QQUdFX05VTV9OT1JNX1BRXzg3MjNCCTB4MDIKKwogI2RlZmluZSBSVExfRldfUEFHRV9TSVpFCQk0MDk2CiAjZGVmaW5lIFJUTDhYWFhVX0ZJUk1XQVJFX1BPTExfTUFYCTEwMDAKIApAQCAtMTMxMiw3ICsxMzE5LDcgQEAKIAlpbnQgKCpwb3dlcl9vbikgKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKIAl2b2lkICgqcG93ZXJfb2ZmKSAoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpOwogCXZvaWQgKCpyZXNldF84MDUxKSAoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpOwotCWludCAoKmxsdF9pbml0KSAoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYsIHU4IGxhc3RfdHhfcGFnZSk7CisJaW50ICgqbGx0X2luaXQpIChzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdik7CiAJdm9pZCAoKmluaXRfcGh5X2JiKSAoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpOwogCWludCAoKmluaXRfcGh5X3JmKSAoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpOwogCXZvaWQgKCpwaHlfaW5pdF9hbnRlbm5hX3NlbGVjdGlvbikgKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKQEAgLTEzMzAsMTEgKzEzMzcsMTcgQEAKIAkJCQkgIHUzMiByYW1hc2ssIGludCBzZ2kpOwogCXZvaWQgKCpyZXBvcnRfY29ubmVjdCkgKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2LAogCQkJCXU4IG1hY2lkLCBib29sIGNvbm5lY3QpOworCXZvaWQgKCpmaWxsX3R4ZGVzYykgKHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQkgICAgIHN0cnVjdCBydGw4eHh4dV90eGRlc2MzMiAqdHhfZGVzYywgdTMyIHJhdGUsCisJCQkgICAgIHUxNiByYXRlX2ZsYWcsIGJvb2wgc2dpLCBib29sIHNob3J0X3ByZWFtYmxlLAorCQkJICAgICBib29sIGFtcGR1X2VuYWJsZSk7CiAJaW50IHdyaXRlTl9ibG9ja19zaXplOwogCWludCByeF9hZ2dfYnVmX3NpemU7CiAJY2hhciB0eF9kZXNjX3NpemU7CiAJY2hhciByeF9kZXNjX3NpemU7Ci0JY2hhciBoYXNfczBzMTsKKwl1OCBoYXNfczBzMToxOworCXU4IGhhc190eF9yZXBvcnQ6MTsKKwl1OCBnZW4yX3RoZXJtYWxfbWV0ZXI6MTsKIAl1MzIgYWRkYV8xdF9pbml0OwogCXUzMiBhZGRhXzF0X3BhdGhfb247CiAJdTMyIGFkZGFfMnRfcGF0aF9vbl9hOwpAQCAtMTM4OCwxNCArMTQwMSwxNCBAQAogdm9pZCBydGw4eHh4dV9maXJtd2FyZV9zZWxmX3Jlc2V0KHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKIHZvaWQgcnRsOHh4eHVfcG93ZXJfb2ZmKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKIHZvaWQgcnRsOHh4eHVfcmVzZXRfODA1MShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdik7Ci1pbnQgcnRsOHh4eHVfYXV0b19sbHRfdGFibGUoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYsIHU4IGxhc3RfdHhfcGFnZSk7CitpbnQgcnRsOHh4eHVfYXV0b19sbHRfdGFibGUoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpOwogdm9pZCBydGw4eHh4dV9nZW4yX3ByZXBhcmVfY2FsaWJyYXRlKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2LCB1OCBzdGFydCk7CiBpbnQgcnRsOHh4eHVfZmx1c2hfZmlmbyhzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdik7CiBpbnQgcnRsOHh4eHVfZ2VuMl9oMmNfY21kKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2LAogCQkJICBzdHJ1Y3QgaDJjX2NtZCAqaDJjLCBpbnQgbGVuKTsKIGludCBydGw4eHh4dV9hY3RpdmVfdG9fbHBzKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKIHZvaWQgcnRsOHh4eHVfZGlzYWJsZWRfdG9fZW11KHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKLWludCBydGw4eHh4dV9pbml0X2xsdF90YWJsZShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdiwgdTggbGFzdF90eF9wYWdlKTsKK2ludCBydGw4eHh4dV9pbml0X2xsdF90YWJsZShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdik7CiB2b2lkIHJ0bDh4eHh1X2dlbjFfcGh5X2lxX2NhbGlicmF0ZShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdik7CiB2b2lkIHJ0bDh4eHh1X2dlbjFfaW5pdF9waHlfYmIoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpOwogdm9pZCBydGw4eHh4dV9nZW4xX3NldF90eF9wb3dlcihzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdiwKQEAgLTE0MjEsNiArMTQzNCwxNCBAQAogaW50IHJ0bDh4eHh1X2dlbjJfY2hhbm5lbF90b19ncm91cChpbnQgY2hhbm5lbCk7CiBib29sIHJ0bDh4eHh1X2dlbjJfc2ltdWxhcml0eV9jb21wYXJlKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2LAogCQkJCSAgICAgIGludCByZXN1bHRbXVs4XSwgaW50IGMxLCBpbnQgYzIpOwordm9pZCBydGw4eHh4dV9maWxsX3R4ZGVzY192MShzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJICAgICBzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjMzIgKnR4X2Rlc2MsIHUzMiByYXRlLAorCQkJICAgICB1MTYgcmF0ZV9mbGFnLCBib29sIHNnaSwgYm9vbCBzaG9ydF9wcmVhbWJsZSwKKwkJCSAgICAgYm9vbCBhbXBkdV9lbmFibGUpOwordm9pZCBydGw4eHh4dV9maWxsX3R4ZGVzY192MihzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJICAgICBzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjMzIgKnR4X2Rlc2MzMiwgdTMyIHJhdGUsCisJCQkgICAgIHUxNiByYXRlX2ZsYWcsIGJvb2wgc2dpLCBib29sIHNob3J0X3ByZWFtYmxlLAorCQkJICAgICBib29sIGFtcGR1X2VuYWJsZSk7CiAKIGV4dGVybiBzdHJ1Y3QgcnRsOHh4eHVfZmlsZW9wcyBydGw4MTkyY3VfZm9wczsKIGV4dGVybiBzdHJ1Y3QgcnRsOHh4eHVfZmlsZW9wcyBydGw4MTkyZXVfZm9wczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODE5MmMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODE5MmMuYwppbmRleCA2OWQxYTE0Li5mOWUyMDUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1XzgxOTJjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV84MTkyYy5jCkBAIC01NjcsNiArNTY3LDcgQEAKIAkuc2V0X3R4X3Bvd2VyID0gcnRsOHh4eHVfZ2VuMV9zZXRfdHhfcG93ZXIsCiAJLnVwZGF0ZV9yYXRlX21hc2sgPSBydGw4eHh4dV91cGRhdGVfcmF0ZV9tYXNrLAogCS5yZXBvcnRfY29ubmVjdCA9IHJ0bDh4eHh1X2dlbjFfcmVwb3J0X2Nvbm5lY3QsCisJLmZpbGxfdHhkZXNjID0gcnRsOHh4eHVfZmlsbF90eGRlc2NfdjEsCiAJLndyaXRlTl9ibG9ja19zaXplID0gMTI4LAogCS5yeF9hZ2dfYnVmX3NpemUgPSAxNjAwMCwKIAkudHhfZGVzY19zaXplID0gc2l6ZW9mKHN0cnVjdCBydGw4eHh4dV90eGRlc2MzMiksCkBAIC01NzksNSArNTgwLDkgQEAKIAkucGJwX3J4ID0gUEJQX1BBR0VfU0laRV8xMjgsCiAJLnBicF90eCA9IFBCUF9QQUdFX1NJWkVfMTI4LAogCS5tYWN0YWJsZSA9IHJ0bDh4eHh1X2dlbjFfbWFjX2luaXRfdGFibGUsCisJLnRvdGFsX3BhZ2VfbnVtID0gVFhfVE9UQUxfUEFHRV9OVU0sCisJLnBhZ2VfbnVtX2hpID0gVFhfUEFHRV9OVU1fSElfUFEsCisJLnBhZ2VfbnVtX2xvID0gVFhfUEFHRV9OVU1fTE9fUFEsCisJLnBhZ2VfbnVtX25vcm0gPSBUWF9QQUdFX05VTV9OT1JNX1BRLAogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV84MTkyZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV84MTkyZS5jCmluZGV4IDlhMTk5NGYuLmRmNTRkMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODE5MmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1XzgxOTJlLmMKQEAgLTEzOTYsNiArMTM5NiwxMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IHJ0bDgxOTJldV9hY3RpdmVfdG9fbHBzKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwcml2LT51ZGV2LT5kZXY7CisJdTggdmFsODsKKwl1MTYgdmFsMTY7CisJdTMyIHZhbDMyOworCWludCByZXRyeSwgcmV0dmFsOworCisJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19UWFBBVVNFLCAweGZmKTsKKworCXJldHJ5ID0gMTAwOworCXJldHZhbCA9IC1FQlVTWTsKKwkvKgorCSAqIFBvbGwgMzIgYml0IHdpZGUgMHgwNWY4IGZvciAweDAwMDAwMDAwIHRvIGVuc3VyZSBubyBUWCBpcyBwZW5kaW5nLgorCSAqLworCWRvIHsKKwkJdmFsMzIgPSBydGw4eHh4dV9yZWFkMzIocHJpdiwgUkVHX1NDSF9UWF9DTUQpOworCQlpZiAoIXZhbDMyKSB7CisJCQlyZXR2YWwgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChyZXRyeS0tKTsKKworCWlmICghcmV0cnkpIHsKKwkJZGV2X3dhcm4oZGV2LCAiRmFpbGVkIHRvIGZsdXNoIFRYIHF1ZXVlXG4iKTsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBEaXNhYmxlIENDSyBhbmQgT0ZETSwgY2xvY2sgZ2F0ZWQgKi8KKwl2YWw4ID0gcnRsOHh4eHVfcmVhZDgocHJpdiwgUkVHX1NZU19GVU5DKTsKKwl2YWw4ICY9IH5TWVNfRlVOQ19CQlJTVEI7CisJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19TWVNfRlVOQywgdmFsOCk7CisKKwl1ZGVsYXkoMik7CisKKwkvKiBSZXNldCB3aG9sZSBCQiAqLworCXZhbDggPSBydGw4eHh4dV9yZWFkOChwcml2LCBSRUdfU1lTX0ZVTkMpOworCXZhbDggJj0gflNZU19GVU5DX0JCX0dMQl9SU1ROOworCXJ0bDh4eHh1X3dyaXRlOChwcml2LCBSRUdfU1lTX0ZVTkMsIHZhbDgpOworCisJLyogUmVzZXQgTUFDIFRSWCAqLworCXZhbDE2ID0gcnRsOHh4eHVfcmVhZDE2KHByaXYsIFJFR19DUik7CisJdmFsMTYgJj0gMHhmZjAwOworCXZhbDE2IHw9IChDUl9IQ0lfVFhETUFfRU5BQkxFIHwgQ1JfSENJX1JYRE1BX0VOQUJMRSk7CisJcnRsOHh4eHVfd3JpdGUxNihwcml2LCBSRUdfQ1IsIHZhbDE2KTsKKworCXZhbDE2ID0gcnRsOHh4eHVfcmVhZDE2KHByaXYsIFJFR19DUik7CisJdmFsMTYgJj0gfkNSX1NFQ1VSSVRZX0VOQUJMRTsKKwlydGw4eHh4dV93cml0ZTE2KHByaXYsIFJFR19DUiwgdmFsMTYpOworCisJdmFsOCA9IHJ0bDh4eHh1X3JlYWQ4KHByaXYsIFJFR19EVUFMX1RTRl9SU1QpOworCXZhbDggfD0gRFVBTF9UU0ZfVFhfT0s7CisJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19EVUFMX1RTRl9SU1QsIHZhbDgpOworCitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBydGw4MTkyZXVfYWN0aXZlX3RvX2VtdShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdikKK3sKKwl1OCB2YWw4OworCWludCBjb3VudCwgcmV0ID0gMDsKKworCS8qIFR1cm4gb2ZmIFJGICovCisJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19SRl9DVFJMLCAwKTsKKworCS8qIFN3aXRjaCBEUERUX1NFTF9QIG91dHB1dCBmcm9tIHJlZ2lzdGVyIDB4NjVbMl0gKi8KKwl2YWw4ID0gcnRsOHh4eHVfcmVhZDgocHJpdiwgUkVHX0xFRENGRzIpOworCXZhbDggJj0gfkxFRENGRzJfRFBEVF9TRUxFQ1Q7CisJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19MRURDRkcyLCB2YWw4KTsKKworCS8qIDB4MDAwNVsxXSA9IDEgdHVybiBvZmYgTUFDIGJ5IEhXIHN0YXRlIG1hY2hpbmUqLworCXZhbDggPSBydGw4eHh4dV9yZWFkOChwcml2LCBSRUdfQVBTX0ZTTUNPICsgMSk7CisJdmFsOCB8PSBCSVQoMSk7CisJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19BUFNfRlNNQ08gKyAxLCB2YWw4KTsKKworCWZvciAoY291bnQgPSBSVEw4WFhYVV9NQVhfUkVHX1BPTEw7IGNvdW50OyBjb3VudC0tKSB7CisJCXZhbDggPSBydGw4eHh4dV9yZWFkOChwcml2LCBSRUdfQVBTX0ZTTUNPICsgMSk7CisJCWlmICgodmFsOCAmIEJJVCgxKSkgPT0gMCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKworCWlmICghY291bnQpIHsKKwkJZGV2X3dhcm4oJnByaXYtPnVkZXYtPmRldiwgIiVzOiBEaXNhYmxpbmcgTUFDIHRpbWVkIG91dFxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBleGl0OworCX0KKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJ0bDgxOTJldV9lbXVfdG9fZGlzYWJsZWQoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpCit7CisJdTggdmFsODsKKworCS8qIDB4MDRbMTI6MTFdID0gMDEgZW5hYmxlIFdMIHN1c3BlbmQgKi8KKwl2YWw4ID0gcnRsOHh4eHVfcmVhZDgocHJpdiwgUkVHX0FQU19GU01DTyArIDEpOworCXZhbDggJj0gfihCSVQoMykgfCBCSVQoNCkpOworCXZhbDggfD0gQklUKDMpOworCXJ0bDh4eHh1X3dyaXRlOChwcml2LCBSRUdfQVBTX0ZTTUNPICsgMSwgdmFsOCk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBydGw4MTkyZXVfcG93ZXJfb24oc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpCiB7CiAJdTE2IHZhbDE2OwpAQCAtMTQ0Niw2ICsxNTU0LDQwIEBACiAJcmV0dXJuIHJldDsKIH0KIAordm9pZCBydGw4MTkyZXVfcG93ZXJfb2ZmKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KQoreworCXU4IHZhbDg7CisJdTE2IHZhbDE2OworCisJcnRsOHh4eHVfZmx1c2hfZmlmbyhwcml2KTsKKworCXZhbDggPSBydGw4eHh4dV9yZWFkOChwcml2LCBSRUdfVFhfUkVQT1JUX0NUUkwpOworCXZhbDggJj0gflRYX1JFUE9SVF9DVFJMX1RJTUVSX0VOQUJMRTsKKwlydGw4eHh4dV93cml0ZTgocHJpdiwgUkVHX1RYX1JFUE9SVF9DVFJMLCB2YWw4KTsKKworCS8qIFR1cm4gb2ZmIFJGICovCisJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19SRl9DVFJMLCAweDAwKTsKKworCXJ0bDgxOTJldV9hY3RpdmVfdG9fbHBzKHByaXYpOworCisJLyogUmVzZXQgRmlybXdhcmUgaWYgcnVubmluZyBpbiBSQU0gKi8KKwlpZiAocnRsOHh4eHVfcmVhZDgocHJpdiwgUkVHX01DVV9GV19ETCkgJiBNQ1VfRldfUkFNX1NFTCkKKwkJcnRsOHh4eHVfZmlybXdhcmVfc2VsZl9yZXNldChwcml2KTsKKworCS8qIFJlc2V0IE1DVSAqLworCXZhbDE2ID0gcnRsOHh4eHVfcmVhZDE2KHByaXYsIFJFR19TWVNfRlVOQyk7CisJdmFsMTYgJj0gflNZU19GVU5DX0NQVV9FTkFCTEU7CisJcnRsOHh4eHVfd3JpdGUxNihwcml2LCBSRUdfU1lTX0ZVTkMsIHZhbDE2KTsKKworCS8qIFJlc2V0IE1DVSByZWFkeSBzdGF0dXMgKi8KKwlydGw4eHh4dV93cml0ZTgocHJpdiwgUkVHX01DVV9GV19ETCwgMHgwMCk7CisKKwlydGw4eHh4dV9yZXNldF84MDUxKHByaXYpOworCisJcnRsODE5MmV1X2FjdGl2ZV90b19lbXUocHJpdik7CisJcnRsODE5MmV1X2VtdV90b19kaXNhYmxlZChwcml2KTsKK30KKwogc3RhdGljIHZvaWQgcnRsODE5MmVfZW5hYmxlX3JmKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KQogewogCXUzMiB2YWwzMjsKQEAgLTE0ODcsNyArMTYyOSw3IEBACiAJLnBhcnNlX2VmdXNlID0gcnRsODE5MmV1X3BhcnNlX2VmdXNlLAogCS5sb2FkX2Zpcm13YXJlID0gcnRsODE5MmV1X2xvYWRfZmlybXdhcmUsCiAJLnBvd2VyX29uID0gcnRsODE5MmV1X3Bvd2VyX29uLAotCS5wb3dlcl9vZmYgPSBydGw4eHh4dV9wb3dlcl9vZmYsCisJLnBvd2VyX29mZiA9IHJ0bDgxOTJldV9wb3dlcl9vZmYsCiAJLnJlc2V0XzgwNTEgPSBydGw4eHh4dV9yZXNldF84MDUxLAogCS5sbHRfaW5pdCA9IHJ0bDh4eHh1X2F1dG9fbGx0X3RhYmxlLAogCS5pbml0X3BoeV9iYiA9IHJ0bDgxOTJldV9pbml0X3BoeV9iYiwKQEAgLTE1MDEsMTAgKzE2NDMsMTIgQEAKIAkuc2V0X3R4X3Bvd2VyID0gcnRsODE5MmVfc2V0X3R4X3Bvd2VyLAogCS51cGRhdGVfcmF0ZV9tYXNrID0gcnRsOHh4eHVfZ2VuMl91cGRhdGVfcmF0ZV9tYXNrLAogCS5yZXBvcnRfY29ubmVjdCA9IHJ0bDh4eHh1X2dlbjJfcmVwb3J0X2Nvbm5lY3QsCisJLmZpbGxfdHhkZXNjID0gcnRsOHh4eHVfZmlsbF90eGRlc2NfdjIsCiAJLndyaXRlTl9ibG9ja19zaXplID0gMTI4LAogCS50eF9kZXNjX3NpemUgPSBzaXplb2Yoc3RydWN0IHJ0bDh4eHh1X3R4ZGVzYzQwKSwKIAkucnhfZGVzY19zaXplID0gc2l6ZW9mKHN0cnVjdCBydGw4eHh4dV9yeGRlc2MyNCksCiAJLmhhc19zMHMxID0gMCwKKwkuZ2VuMl90aGVybWFsX21ldGVyID0gMSwKIAkuYWRkYV8xdF9pbml0ID0gMHgwZmMwMTYxNiwKIAkuYWRkYV8xdF9wYXRoX29uID0gMHgwZmMwMTYxNiwKIAkuYWRkYV8ydF9wYXRoX29uX2EgPSAweDBmYzAxNjE2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV84NzIzYS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV84NzIzYS5jCmluZGV4IDY4NmM1NTEuLmFlZjM3MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODcyM2EuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1Xzg3MjNhLmMKQEAgLTM4NCw2ICszODQsNyBAQAogCS5zZXRfdHhfcG93ZXIgPSBydGw4eHh4dV9nZW4xX3NldF90eF9wb3dlciwKIAkudXBkYXRlX3JhdGVfbWFzayA9IHJ0bDh4eHh1X3VwZGF0ZV9yYXRlX21hc2ssCiAJLnJlcG9ydF9jb25uZWN0ID0gcnRsOHh4eHVfZ2VuMV9yZXBvcnRfY29ubmVjdCwKKwkuZmlsbF90eGRlc2MgPSBydGw4eHh4dV9maWxsX3R4ZGVzY192MSwKIAkud3JpdGVOX2Jsb2NrX3NpemUgPSAxMDI0LAogCS5yeF9hZ2dfYnVmX3NpemUgPSAxNjAwMCwKIAkudHhfZGVzY19zaXplID0gc2l6ZW9mKHN0cnVjdCBydGw4eHh4dV90eGRlc2MzMiksCkBAIC0zOTYsNCArMzk3LDggQEAKIAkucGJwX3J4ID0gUEJQX1BBR0VfU0laRV8xMjgsCiAJLnBicF90eCA9IFBCUF9QQUdFX1NJWkVfMTI4LAogCS5tYWN0YWJsZSA9IHJ0bDh4eHh1X2dlbjFfbWFjX2luaXRfdGFibGUsCisJLnRvdGFsX3BhZ2VfbnVtID0gVFhfVE9UQUxfUEFHRV9OVU0sCisJLnBhZ2VfbnVtX2hpID0gVFhfUEFHRV9OVU1fSElfUFEsCisJLnBhZ2VfbnVtX2xvID0gVFhfUEFHRV9OVU1fTE9fUFEsCisJLnBhZ2VfbnVtX25vcm0gPSBUWF9QQUdFX05VTV9OT1JNX1BRLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODcyM2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODcyM2IuYwppbmRleCA5ZDQ1YWZiLi42YzA4NmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1Xzg3MjNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV84NzIzYi5jCkBAIC0xNjYyLDEwICsxNjYyLDEzIEBACiAJLnNldF90eF9wb3dlciA9IHJ0bDg3MjNiX3NldF90eF9wb3dlciwKIAkudXBkYXRlX3JhdGVfbWFzayA9IHJ0bDh4eHh1X2dlbjJfdXBkYXRlX3JhdGVfbWFzaywKIAkucmVwb3J0X2Nvbm5lY3QgPSBydGw4eHh4dV9nZW4yX3JlcG9ydF9jb25uZWN0LAorCS5maWxsX3R4ZGVzYyA9IHJ0bDh4eHh1X2ZpbGxfdHhkZXNjX3YyLAogCS53cml0ZU5fYmxvY2tfc2l6ZSA9IDEwMjQsCiAJLnR4X2Rlc2Nfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjNDApLAogCS5yeF9kZXNjX3NpemUgPSBzaXplb2Yoc3RydWN0IHJ0bDh4eHh1X3J4ZGVzYzI0KSwKIAkuaGFzX3MwczEgPSAxLAorCS5oYXNfdHhfcmVwb3J0ID0gMSwKKwkuZ2VuMl90aGVybWFsX21ldGVyID0gMSwKIAkuYWRkYV8xdF9pbml0ID0gMHgwMWMwMDAxNCwKIAkuYWRkYV8xdF9wYXRoX29uID0gMHgwMWMwMDAxNCwKIAkuYWRkYV8ydF9wYXRoX29uX2EgPSAweDAxYzAwMDE0LApAQCAtMTY3NCw0ICsxNjc3LDggQEAKIAkucGJwX3J4ID0gUEJQX1BBR0VfU0laRV8yNTYsCiAJLnBicF90eCA9IFBCUF9QQUdFX1NJWkVfMjU2LAogCS5tYWN0YWJsZSA9IHJ0bDg3MjNiX21hY19pbml0X3RhYmxlLAorCS50b3RhbF9wYWdlX251bSA9IFRYX1RPVEFMX1BBR0VfTlVNXzg3MjNCLAorCS5wYWdlX251bV9oaSA9IFRYX1BBR0VfTlVNX0hJX1BRXzg3MjNCLAorCS5wYWdlX251bV9sbyA9IFRYX1BBR0VfTlVNX0xPX1BRXzg3MjNCLAorCS5wYWdlX251bV9ub3JtID0gVFhfUEFHRV9OVU1fTk9STV9QUV84NzIzQiwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1X2NvcmUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfY29yZS5jCmluZGV4IDc3MDQ4ZGIuLmIyZDdmNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfY29yZS5jCkBAIC04OTQsNyArODk0LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIHJ0bDh4eHh1X2dlbjFfaDJjX2NtZChzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdiwgc3RydWN0IGgyY19jbWQgKmgyYywgaW50IGxlbikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcHJpdi0+dWRldi0+ZGV2OwpAQCAtMjQ3MiwxMCArMjQ3MiwxMyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBydGw4eHh4dV9pbml0X2xsdF90YWJsZShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdiwgdTggbGFzdF90eF9wYWdlKQoraW50IHJ0bDh4eHh1X2luaXRfbGx0X3RhYmxlKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KQogewogCWludCByZXQ7CiAJaW50IGk7CisJdTggbGFzdF90eF9wYWdlOworCisJbGFzdF90eF9wYWdlID0gcHJpdi0+Zm9wcy0+dG90YWxfcGFnZV9udW07CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGFzdF90eF9wYWdlOyBpKyspIHsKIAkJcmV0ID0gcnRsOHh4eHVfbGx0X3dyaXRlKHByaXYsIGksIGkgKyAxKTsKQEAgLTI1MDMsNyArMjUwNiw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHJ0bDh4eHh1X2F1dG9fbGx0X3RhYmxlKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2LCB1OCBsYXN0X3R4X3BhZ2UpCitpbnQgcnRsOHh4eHVfYXV0b19sbHRfdGFibGUoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpCiB7CiAJdTMyIHZhbDMyOwogCWludCByZXQgPSAwOwpAQCAtMzg0NywyOCArMzg1MCw2IEBACiAJcnRsOHh4eHVfd3JpdGUzMihwcml2LCBSRUdfUlhfV0FJVF9DQ0EsIHZhbDMyKTsKIH0KIAotc3RhdGljIHZvaWQgcnRsOHh4eHVfb2xkX2luaXRfcXVldWVfcmVzZXJ2ZWRfcGFnZShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdikKLXsKLQl1OCB2YWw4OwotCXUzMiB2YWwzMjsKLQotCWlmIChwcml2LT5lcF90eF9ub3JtYWxfcXVldWUpCi0JCXZhbDggPSBUWF9QQUdFX05VTV9OT1JNX1BROwotCWVsc2UKLQkJdmFsOCA9IDA7Ci0KLQlydGw4eHh4dV93cml0ZTgocHJpdiwgUkVHX1JRUE5fTlBRLCB2YWw4KTsKLQotCXZhbDMyID0gKFRYX1BBR0VfTlVNX1BVQlEgPDwgUlFQTl9QVUJfUFFfU0hJRlQpIHwgUlFQTl9MT0FEOwotCi0JaWYgKHByaXYtPmVwX3R4X2hpZ2hfcXVldWUpCi0JCXZhbDMyIHw9IChUWF9QQUdFX05VTV9ISV9QUSA8PCBSUVBOX0hJX1BRX1NISUZUKTsKLQlpZiAocHJpdi0+ZXBfdHhfbG93X3F1ZXVlKQotCQl2YWwzMiB8PSAoVFhfUEFHRV9OVU1fTE9fUFEgPDwgUlFQTl9MT19QUV9TSElGVCk7Ci0KLQlydGw4eHh4dV93cml0ZTMyKHByaXYsIFJFR19SUVBOLCB2YWwzMik7Ci19Ci0KIHN0YXRpYyB2b2lkIHJ0bDh4eHh1X2luaXRfcXVldWVfcmVzZXJ2ZWRfcGFnZShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdikKIHsKIAlzdHJ1Y3QgcnRsOHh4eHVfZmlsZW9wcyAqZm9wcyA9IHByaXYtPmZvcHM7CkBAIC0zODkxLDcgKzM4NzIsNyBAQAogCXZhbDMyID0gKG5xIDw8IFJRUE5fTlBRX1NISUZUKSB8IChlcSA8PCBSUVBOX0VQUV9TSElGVCk7CiAJcnRsOHh4eHVfd3JpdGUzMihwcml2LCBSRUdfUlFQTl9OUFEsIHZhbDMyKTsKIAotCXB1YnEgPSBmb3BzLT50b3RhbF9wYWdlX251bSAtIGhxIC0gbHEgLSBucTsKKwlwdWJxID0gZm9wcy0+dG90YWxfcGFnZV9udW0gLSBocSAtIGxxIC0gbnEgLSAxOwogCiAJdmFsMzIgPSBSUVBOX0xPQUQ7CiAJdmFsMzIgfD0gKGhxIDw8IFJRUE5fSElfUFFfU0hJRlQpOwpAQCAtMzkwNSw2ICszODg2LDcgQEAKIHsKIAlzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwcml2LT51ZGV2LT5kZXY7CisJc3RydWN0IHJ0bDh4eHh1X2ZpbGVvcHMgKmZvcHMgPSBwcml2LT5mb3BzOwogCWJvb2wgbWFjcG93ZXI7CiAJaW50IHJldDsKIAl1OCB2YWw4OwpAQCAtMzkyMywxOCArMzkwNSwxNCBAQAogCWVsc2UKIAkJbWFjcG93ZXIgPSB0cnVlOwogCi0JcmV0ID0gcHJpdi0+Zm9wcy0+cG93ZXJfb24ocHJpdik7CisJcmV0ID0gZm9wcy0+cG93ZXJfb24ocHJpdik7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X3dhcm4oZGV2LCAiJXM6IEZhaWxlZCBwb3dlciBvblxuIiwgX19mdW5jX18pOwogCQlnb3RvIGV4aXQ7CiAJfQogCi0JaWYgKCFtYWNwb3dlcikgewotCQlpZiAocHJpdi0+Zm9wcy0+dG90YWxfcGFnZV9udW0pCi0JCQlydGw4eHh4dV9pbml0X3F1ZXVlX3Jlc2VydmVkX3BhZ2UocHJpdik7Ci0JCWVsc2UKLQkJCXJ0bDh4eHh1X29sZF9pbml0X3F1ZXVlX3Jlc2VydmVkX3BhZ2UocHJpdik7Ci0JfQorCWlmICghbWFjcG93ZXIpCisJCXJ0bDh4eHh1X2luaXRfcXVldWVfcmVzZXJ2ZWRfcGFnZShwcml2KTsKIAogCXJldCA9IHJ0bDh4eHh1X2luaXRfcXVldWVfcHJpb3JpdHkocHJpdik7CiAJZGV2X2RiZyhkZXYsICIlczogaW5pdF9xdWV1ZV9wcmlvcml0eSAlaVxuIiwgX19mdW5jX18sIHJldCk7CkBAIC0zOTQ0LDE5ICszOTIyLDE5IEBACiAJLyoKIAkgKiBTZXQgUlggcGFnZSBib3VuZGFyeQogCSAqLwotCXJ0bDh4eHh1X3dyaXRlMTYocHJpdiwgUkVHX1RSWEZGX0JORFkgKyAyLCBwcml2LT5mb3BzLT50cnhmZl9ib3VuZGFyeSk7CisJcnRsOHh4eHVfd3JpdGUxNihwcml2LCBSRUdfVFJYRkZfQk5EWSArIDIsIGZvcHMtPnRyeGZmX2JvdW5kYXJ5KTsKIAogCXJldCA9IHJ0bDh4eHh1X2Rvd25sb2FkX2Zpcm13YXJlKHByaXYpOwotCWRldl9kYmcoZGV2LCAiJXM6IGRvd25sb2FkX2Zpd21hcmUgJWlcbiIsIF9fZnVuY19fLCByZXQpOworCWRldl9kYmcoZGV2LCAiJXM6IGRvd25sb2FkX2Zpcm13YXJlICVpXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAlpZiAocmV0KQogCQlnb3RvIGV4aXQ7CiAJcmV0ID0gcnRsOHh4eHVfc3RhcnRfZmlybXdhcmUocHJpdik7Ci0JZGV2X2RiZyhkZXYsICIlczogc3RhcnRfZml3bWFyZSAlaVxuIiwgX19mdW5jX18sIHJldCk7CisJZGV2X2RiZyhkZXYsICIlczogc3RhcnRfZmlybXdhcmUgJWlcbiIsIF9fZnVuY19fLCByZXQpOwogCWlmIChyZXQpCiAJCWdvdG8gZXhpdDsKIAotCWlmIChwcml2LT5mb3BzLT5waHlfaW5pdF9hbnRlbm5hX3NlbGVjdGlvbikKLQkJcHJpdi0+Zm9wcy0+cGh5X2luaXRfYW50ZW5uYV9zZWxlY3Rpb24ocHJpdik7CisJaWYgKGZvcHMtPnBoeV9pbml0X2FudGVubmFfc2VsZWN0aW9uKQorCQlmb3BzLT5waHlfaW5pdF9hbnRlbm5hX3NlbGVjdGlvbihwcml2KTsKIAogCXJldCA9IHJ0bDh4eHh1X2luaXRfbWFjKHByaXYpOwogCkBAIC0zOTY5LDcgKzM5NDcsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXhpdDsKIAotCXJldCA9IHByaXYtPmZvcHMtPmluaXRfcGh5X3JmKHByaXYpOworCXJldCA9IGZvcHMtPmluaXRfcGh5X3JmKHByaXYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXhpdDsKIApAQCAtMzk5NCwxMyArMzk3Miw3IEBACiAJCS8qCiAJCSAqIFNldCBUWCBidWZmZXIgYm91bmRhcnkKIAkJICovCi0JCWlmIChwcml2LT5ydGxfY2hpcCA9PSBSVEw4MTkyRSkKLQkJCXZhbDggPSBUWF9UT1RBTF9QQUdFX05VTV84MTkyRSArIDE7Ci0JCWVsc2UKLQkJCXZhbDggPSBUWF9UT1RBTF9QQUdFX05VTSArIDE7Ci0KLQkJaWYgKHByaXYtPnJ0bF9jaGlwID09IFJUTDg3MjNCKQotCQkJdmFsOCAtPSAxOworCQl2YWw4ID0gZm9wcy0+dG90YWxfcGFnZV9udW0gKyAxOwogCiAJCXJ0bDh4eHh1X3dyaXRlOChwcml2LCBSRUdfVFhQS1RCVUZfQkNOUV9CRE5ZLCB2YWw4KTsKIAkJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19UWFBLVEJVRl9NR1FfQkROWSwgdmFsOCk7CkBAIC00MDEzLDE0ICszOTg1LDE0IEBACiAJICogVGhlIHZlbmRvciBkcml2ZXJzIHNldCBQQlAgZm9yIGFsbCBkZXZpY2VzLCBleGNlcHQgODE5MmUuCiAJICogVGhlcmUgaXMgbm8gZXhwbGFuYXRpb24gZm9yIHRoaXMgaW4gYW55IG9mIHRoZSBzb3VyY2VzLgogCSAqLwotCXZhbDggPSAocHJpdi0+Zm9wcy0+cGJwX3J4IDw8IFBCUF9QQUdFX1NJWkVfUlhfU0hJRlQpIHwKLQkJKHByaXYtPmZvcHMtPnBicF90eCA8PCBQQlBfUEFHRV9TSVpFX1RYX1NISUZUKTsKKwl2YWw4ID0gKGZvcHMtPnBicF9yeCA8PCBQQlBfUEFHRV9TSVpFX1JYX1NISUZUKSB8CisJCShmb3BzLT5wYnBfdHggPDwgUEJQX1BBR0VfU0laRV9UWF9TSElGVCk7CiAJaWYgKHByaXYtPnJ0bF9jaGlwICE9IFJUTDgxOTJFKQogCQlydGw4eHh4dV93cml0ZTgocHJpdiwgUkVHX1BCUCwgdmFsOCk7CiAKIAlkZXZfZGJnKGRldiwgIiVzOiBtYWNwb3dlciAlaVxuIiwgX19mdW5jX18sIG1hY3Bvd2VyKTsKIAlpZiAoIW1hY3Bvd2VyKSB7Ci0JCXJldCA9IHByaXYtPmZvcHMtPmxsdF9pbml0KHByaXYsIFRYX1RPVEFMX1BBR0VfTlVNKTsKKwkJcmV0ID0gZm9wcy0+bGx0X2luaXQocHJpdik7CiAJCWlmIChyZXQpIHsKIAkJCWRldl93YXJuKGRldiwgIiVzOiBMTFQgdGFibGUgaW5pdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAkJCWdvdG8gZXhpdDsKQEAgLTQwMjksMTMgKzQwMDEsMTIgQEAKIAkJLyoKIAkJICogQ2hpcCBzcGVjaWZpYyBxdWlya3MKIAkJICovCi0JCXByaXYtPmZvcHMtPnVzYl9xdWlya3MocHJpdik7CisJCWZvcHMtPnVzYl9xdWlya3MocHJpdik7CiAKIAkJLyoKLQkJICogUHJlc3VtYWJseSB0aGlzIGlzIGZvciA4MTg4RVUgYXMgd2VsbAotCQkgKiBFbmFibGUgVFggcmVwb3J0IGFuZCBUWCByZXBvcnQgdGltZXIKKwkJICogRW5hYmxlIFRYIHJlcG9ydCBhbmQgVFggcmVwb3J0IHRpbWVyIGZvciA4NzIzYnUvODE4OGV1Ly4uLgogCQkgKi8KLQkJaWYgKHByaXYtPnJ0bF9jaGlwID09IFJUTDg3MjNCKSB7CisJCWlmIChmb3BzLT5oYXNfdHhfcmVwb3J0KSB7CiAJCQl2YWw4ID0gcnRsOHh4eHVfcmVhZDgocHJpdiwgUkVHX1RYX1JFUE9SVF9DVFJMKTsKIAkJCXZhbDggfD0gVFhfUkVQT1JUX0NUUkxfVElNRVJfRU5BQkxFOwogCQkJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19UWF9SRVBPUlRfQ1RSTCwgdmFsOCk7CkBAIC00MTcwLDggKzQxNDEsOCBAQAogCQlydGw4eHh4dV93cml0ZTgocHJpdiwgUkVHX1JTVl9DVFJMLCB2YWw4KTsKIAl9CiAKLQlpZiAocHJpdi0+Zm9wcy0+aW5pdF9hZ2dyZWdhdGlvbikKLQkJcHJpdi0+Zm9wcy0+aW5pdF9hZ2dyZWdhdGlvbihwcml2KTsKKwlpZiAoZm9wcy0+aW5pdF9hZ2dyZWdhdGlvbikKKwkJZm9wcy0+aW5pdF9hZ2dyZWdhdGlvbihwcml2KTsKIAogCS8qCiAJICogRW5hYmxlIENDSyBhbmQgT0ZETSBibG9jawpAQCAtNDE4OCw3ICs0MTU5LDcgQEAKIAkvKgogCSAqIFN0YXJ0IG91dCB3aXRoIGRlZmF1bHQgcG93ZXIgbGV2ZWxzIGZvciBjaGFubmVsIDYsIDIwTUh6CiAJICovCi0JcHJpdi0+Zm9wcy0+c2V0X3R4X3Bvd2VyKHByaXYsIDEsIGZhbHNlKTsKKwlmb3BzLT5zZXRfdHhfcG93ZXIocHJpdiwgMSwgZmFsc2UpOwogCiAJLyogTGV0IHRoZSA4MDUxIHRha2UgY29udHJvbCBvZiBhbnRlbm5hIHNldHRpbmcgKi8KIAlpZiAocHJpdi0+cnRsX2NoaXAgIT0gUlRMODE5MkUpIHsKQEAgLTQyMDQsOCArNDE3NSw4IEBACiAKIAlydGw4eHh4dV93cml0ZTE2KHByaXYsIFJFR19GQVNUX0VEQ0FfQ1RSTCwgMCk7CiAKLQlpZiAocHJpdi0+Zm9wcy0+aW5pdF9zdGF0aXN0aWNzKQotCQlwcml2LT5mb3BzLT5pbml0X3N0YXRpc3RpY3MocHJpdik7CisJaWYgKGZvcHMtPmluaXRfc3RhdGlzdGljcykKKwkJZm9wcy0+aW5pdF9zdGF0aXN0aWNzKHByaXYpOwogCiAJaWYgKHByaXYtPnJ0bF9jaGlwID09IFJUTDgxOTJFKSB7CiAJCS8qCkBAIC00MjIzLDEyICs0MTk0LDEyIEBACiAKIAlydGw4NzIzYV9waHlfbGNfY2FsaWJyYXRlKHByaXYpOwogCi0JcHJpdi0+Zm9wcy0+cGh5X2lxX2NhbGlicmF0ZShwcml2KTsKKwlmb3BzLT5waHlfaXFfY2FsaWJyYXRlKHByaXYpOwogCiAJLyoKIAkgKiBUaGlzIHNob3VsZCBlbmFibGUgdGhlcm1hbCBtZXRlcgogCSAqLwotCWlmIChwcml2LT5mb3BzLT50eF9kZXNjX3NpemUgPT0gc2l6ZW9mKHN0cnVjdCBydGw4eHh4dV90eGRlc2M0MCkpCisJaWYgKGZvcHMtPmdlbjJfdGhlcm1hbF9tZXRlcikKIAkJcnRsOHh4eHVfd3JpdGVfcmZyZWcocHJpdiwKIAkJCQkgICAgIFJGX0EsIFJGNjA1Ml9SRUdfVF9NRVRFUl84NzIzQiwgMHgzN2NmOCk7CiAJZWxzZQpAQCAtNDc4Myw2ICs0NzU0LDExMyBAQAogCX0KIH0KIAorLyoKKyAqIEZpbGwgaW4gdjEgKGdlbjEpIHNwZWNpZmljIFRYIGRlc2NyaXB0b3IgYml0cy4KKyAqIFRoaXMgZm9ybWF0IGlzIHVzZWQgb24gODE4OGN1LzgxOTJjdS84NzIzYXUKKyAqLwordm9pZAorcnRsOHh4eHVfZmlsbF90eGRlc2NfdjEoc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCXN0cnVjdCBydGw4eHh4dV90eGRlc2MzMiAqdHhfZGVzYywgdTMyIHJhdGUsCisJCQl1MTYgcmF0ZV9mbGFnLCBib29sIHNnaSwgYm9vbCBzaG9ydF9wcmVhbWJsZSwKKwkJCWJvb2wgYW1wZHVfZW5hYmxlKQoreworCXUxNiBzZXFfbnVtYmVyOworCisJc2VxX251bWJlciA9IElFRUU4MDIxMV9TRVFfVE9fU04obGUxNl90b19jcHUoaGRyLT5zZXFfY3RybCkpOworCisJdHhfZGVzYy0+dHhkdzUgPSBjcHVfdG9fbGUzMihyYXRlKTsKKworCWlmIChpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKQorCQl0eF9kZXNjLT50eGR3NSB8PSBjcHVfdG9fbGUzMigweDAwMDFmZjAwKTsKKworCXR4X2Rlc2MtPnR4ZHczID0gY3B1X3RvX2xlMzIoKHUzMilzZXFfbnVtYmVyIDw8IFRYREVTQzMyX1NFUV9TSElGVCk7CisKKwlpZiAoYW1wZHVfZW5hYmxlKQorCQl0eF9kZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMihUWERFU0MzMl9BR0dfRU5BQkxFKTsKKwllbHNlCisJCXR4X2Rlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKFRYREVTQzMyX0FHR19CUkVBSyk7CisKKwlpZiAoaWVlZTgwMjExX2lzX21nbXQoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQl0eF9kZXNjLT50eGR3NSA9IGNwdV90b19sZTMyKHJhdGUpOworCQl0eF9kZXNjLT50eGR3NCB8PSBjcHVfdG9fbGUzMihUWERFU0MzMl9VU0VfRFJJVkVSX1JBVEUpOworCQl0eF9kZXNjLT50eGR3NSB8PSBjcHVfdG9fbGUzMig2IDw8IFRYREVTQzMyX1JFVFJZX0xJTUlUX1NISUZUKTsKKwkJdHhfZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoVFhERVNDMzJfUkVUUllfTElNSVRfRU5BQkxFKTsKKwl9CisKKwlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkpCisJCXR4X2Rlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKFRYREVTQzMyX1FPUyk7CisKKwlpZiAoc2hvcnRfcHJlYW1ibGUpCisJCXR4X2Rlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKFRYREVTQzMyX1NIT1JUX1BSRUFNQkxFKTsKKworCWlmIChzZ2kpCisJCXR4X2Rlc2MtPnR4ZHc1IHw9IGNwdV90b19sZTMyKFRYREVTQzMyX1NIT1JUX0dJKTsKKworCWlmIChyYXRlX2ZsYWcgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1JUU19DVFMpIHsKKwkJLyoKKwkJICogVXNlIFJUUyByYXRlIDI0TSAtIGRvZXMgdGhlIG1hYzgwMjExIHRlbGwKKwkJICogdXMgd2hpY2ggdG8gdXNlPworCQkgKi8KKwkJdHhfZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoREVTQ19SQVRFXzI0TSA8PAorCQkJCQkgICAgICBUWERFU0MzMl9SVFNfUkFURV9TSElGVCk7CisJCXR4X2Rlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKFRYREVTQzMyX1JUU19DVFNfRU5BQkxFKTsKKwkJdHhfZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoVFhERVNDMzJfSFdfUlRTX0VOQUJMRSk7CisJfQorfQorCisvKgorICogRmlsbCBpbiB2MiAoZ2VuMikgc3BlY2lmaWMgVFggZGVzY3JpcHRvciBiaXRzLgorICogVGhpcyBmb3JtYXQgaXMgdXNlZCBvbiA4MTkyZXUvODcyM2J1CisgKi8KK3ZvaWQKK3J0bDh4eHh1X2ZpbGxfdHhkZXNjX3YyKHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQlzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjMzIgKnR4X2Rlc2MzMiwgdTMyIHJhdGUsCisJCQl1MTYgcmF0ZV9mbGFnLCBib29sIHNnaSwgYm9vbCBzaG9ydF9wcmVhbWJsZSwKKwkJCWJvb2wgYW1wZHVfZW5hYmxlKQoreworCXN0cnVjdCBydGw4eHh4dV90eGRlc2M0MCAqdHhfZGVzYzQwOworCXUxNiBzZXFfbnVtYmVyOworCisJdHhfZGVzYzQwID0gKHN0cnVjdCBydGw4eHh4dV90eGRlc2M0MCAqKXR4X2Rlc2MzMjsKKworCXNlcV9udW1iZXIgPSBJRUVFODAyMTFfU0VRX1RPX1NOKGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpKTsKKworCXR4X2Rlc2M0MC0+dHhkdzQgPSBjcHVfdG9fbGUzMihyYXRlKTsKKwlpZiAoaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQl0eF9kZXNjNDAtPnR4ZHc0IHw9IGNwdV90b19sZTMyKDB4MWYgPDwKKwkJCQkJCVRYREVTQzQwX0RBVEFfUkFURV9GQl9TSElGVCk7CisJfQorCisJdHhfZGVzYzQwLT50eGR3OSA9IGNwdV90b19sZTMyKCh1MzIpc2VxX251bWJlciA8PCBUWERFU0M0MF9TRVFfU0hJRlQpOworCisJaWYgKGFtcGR1X2VuYWJsZSkKKwkJdHhfZGVzYzQwLT50eGR3MiB8PSBjcHVfdG9fbGUzMihUWERFU0M0MF9BR0dfRU5BQkxFKTsKKwllbHNlCisJCXR4X2Rlc2M0MC0+dHhkdzIgfD0gY3B1X3RvX2xlMzIoVFhERVNDNDBfQUdHX0JSRUFLKTsKKworCWlmIChpZWVlODAyMTFfaXNfbWdtdChoZHItPmZyYW1lX2NvbnRyb2wpKSB7CisJCXR4X2Rlc2M0MC0+dHhkdzQgPSBjcHVfdG9fbGUzMihyYXRlKTsKKwkJdHhfZGVzYzQwLT50eGR3MyB8PSBjcHVfdG9fbGUzMihUWERFU0M0MF9VU0VfRFJJVkVSX1JBVEUpOworCQl0eF9kZXNjNDAtPnR4ZHc0IHw9CisJCQljcHVfdG9fbGUzMig2IDw8IFRYREVTQzQwX1JFVFJZX0xJTUlUX1NISUZUKTsKKwkJdHhfZGVzYzQwLT50eGR3NCB8PSBjcHVfdG9fbGUzMihUWERFU0M0MF9SRVRSWV9MSU1JVF9FTkFCTEUpOworCX0KKworCWlmIChzaG9ydF9wcmVhbWJsZSkKKwkJdHhfZGVzYzQwLT50eGR3NSB8PSBjcHVfdG9fbGUzMihUWERFU0M0MF9TSE9SVF9QUkVBTUJMRSk7CisKKwlpZiAocmF0ZV9mbGFnICYgSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTKSB7CisJCS8qCisJCSAqIFVzZSBSVFMgcmF0ZSAyNE0gLSBkb2VzIHRoZSBtYWM4MDIxMSB0ZWxsCisJCSAqIHVzIHdoaWNoIHRvIHVzZT8KKwkJICovCisJCXR4X2Rlc2M0MC0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoREVTQ19SQVRFXzI0TSA8PAorCQkJCQkJVFhERVNDNDBfUlRTX1JBVEVfU0hJRlQpOworCQl0eF9kZXNjNDAtPnR4ZHczIHw9IGNwdV90b19sZTMyKFRYREVTQzQwX1JUU19DVFNfRU5BQkxFKTsKKwkJdHhfZGVzYzQwLT50eGR3MyB8PSBjcHVfdG9fbGUzMihUWERFU0M0MF9IV19SVFNfRU5BQkxFKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHJ0bDh4eHh1X3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJc3RydWN0IGllZWU4MDIxMV90eF9jb250cm9sICpjb250cm9sLAogCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTQ3OTIsNyArNDg3MCw2IEBACiAJc3RydWN0IGllZWU4MDIxMV9yYXRlICp0eF9yYXRlID0gaWVlZTgwMjExX2dldF90eF9yYXRlKGh3LCB0eF9pbmZvKTsKIAlzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwogCXN0cnVjdCBydGw4eHh4dV90eGRlc2MzMiAqdHhfZGVzYzsKLQlzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjNDAgKnR4X2Rlc2M0MDsKIAlzdHJ1Y3QgcnRsOHh4eHVfdHhfdXJiICp0eF91cmI7CiAJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSA9IE5VTEw7CiAJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IHR4X2luZm8tPmNvbnRyb2wudmlmOwpAQCAtNDgwMyw3ICs0ODgwLDcgQEAKIAl1MTYgcmF0ZV9mbGFnID0gdHhfaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFnczsKIAlpbnQgdHhfZGVzY19zaXplID0gcHJpdi0+Zm9wcy0+dHhfZGVzY19zaXplOwogCWludCByZXQ7Ci0JYm9vbCB1c2VkZXNjNDAsIGFtcGR1X2VuYWJsZTsKKwlib29sIHVzZWRlc2M0MCwgYW1wZHVfZW5hYmxlLCBzZ2kgPSBmYWxzZSwgc2hvcnRfcHJlYW1ibGUgPSBmYWxzZTsKIAogCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IHR4X2Rlc2Nfc2l6ZSkgewogCQlkZXZfd2FybihkZXYsCkBAIC00ODgxLDEwNyArNDk1OCwyNiBAQAogCQl9CiAJfQogCi0JaWYgKHJhdGVfZmxhZyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpCisJaWYgKHJhdGVfZmxhZyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MgJiYKKwkgICAgIWllZWU4MDIxMV9pc19tZ210KGhkci0+ZnJhbWVfY29udHJvbCkpCiAJCXJhdGUgPSB0eF9pbmZvLT5jb250cm9sLnJhdGVzWzBdLmlkeCArIERFU0NfUkFURV9NQ1MwOwogCWVsc2UKIAkJcmF0ZSA9IHR4X3JhdGUtPmh3X3ZhbHVlOwogCisJaWYgKHJhdGVfZmxhZyAmIElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSB8fAorCSAgICAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKKwkgICAgIHN0YSAmJiBzdGEtPmh0X2NhcC5jYXAgJgorCSAgICAgKElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwIHwgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjApKSkKKwkJc2dpID0gdHJ1ZTsKKworCWlmIChyYXRlX2ZsYWcgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1NIT1JUX1BSRUFNQkxFIHx8CisJICAgIChzdGEgJiYgdmlmICYmIHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3ByZWFtYmxlKSkKKwkJc2hvcnRfcHJlYW1ibGUgPSB0cnVlOworCiAJc2VxX251bWJlciA9IElFRUU4MDIxMV9TRVFfVE9fU04obGUxNl90b19jcHUoaGRyLT5zZXFfY3RybCkpOwotCWlmICghdXNlZGVzYzQwKSB7Ci0JCXR4X2Rlc2MtPnR4ZHc1ID0gY3B1X3RvX2xlMzIocmF0ZSk7CiAKLQkJaWYgKGllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkpCi0JCQl0eF9kZXNjLT50eGR3NSB8PSBjcHVfdG9fbGUzMigweDAwMDFmZjAwKTsKLQotCQl0eF9kZXNjLT50eGR3MyA9Ci0JCQljcHVfdG9fbGUzMigodTMyKXNlcV9udW1iZXIgPDwgVFhERVNDMzJfU0VRX1NISUZUKTsKLQotCQlpZiAoYW1wZHVfZW5hYmxlKQotCQkJdHhfZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoVFhERVNDMzJfQUdHX0VOQUJMRSk7Ci0JCWVsc2UKLQkJCXR4X2Rlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKFRYREVTQzMyX0FHR19CUkVBSyk7Ci0KLQkJaWYgKGllZWU4MDIxMV9pc19tZ210KGhkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJCXR4X2Rlc2MtPnR4ZHc1ID0gY3B1X3RvX2xlMzIodHhfcmF0ZS0+aHdfdmFsdWUpOwotCQkJdHhfZGVzYy0+dHhkdzQgfD0KLQkJCQljcHVfdG9fbGUzMihUWERFU0MzMl9VU0VfRFJJVkVSX1JBVEUpOwotCQkJdHhfZGVzYy0+dHhkdzUgfD0KLQkJCQljcHVfdG9fbGUzMig2IDw8IFRYREVTQzMyX1JFVFJZX0xJTUlUX1NISUZUKTsKLQkJCXR4X2Rlc2MtPnR4ZHc1IHw9Ci0JCQkJY3B1X3RvX2xlMzIoVFhERVNDMzJfUkVUUllfTElNSVRfRU5BQkxFKTsKLQkJfQotCi0JCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSkKLQkJCXR4X2Rlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKFRYREVTQzMyX1FPUyk7Ci0KLQkJaWYgKHJhdGVfZmxhZyAmIElFRUU4MDIxMV9UWF9SQ19VU0VfU0hPUlRfUFJFQU1CTEUgfHwKLQkJICAgIChzdGEgJiYgdmlmICYmIHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3ByZWFtYmxlKSkKLQkJCXR4X2Rlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKFRYREVTQzMyX1NIT1JUX1BSRUFNQkxFKTsKLQotCQlpZiAocmF0ZV9mbGFnICYgSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJIHx8Ci0JCSAgICAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKLQkJICAgICBzdGEgJiYgc3RhLT5odF9jYXAuY2FwICYKLQkJICAgICAoSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAgfCBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCkpKSB7Ci0JCQl0eF9kZXNjLT50eGR3NSB8PSBjcHVfdG9fbGUzMihUWERFU0MzMl9TSE9SVF9HSSk7Ci0JCX0KLQotCQlpZiAocmF0ZV9mbGFnICYgSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTKSB7Ci0JCQkvKgotCQkJICogVXNlIFJUUyByYXRlIDI0TSAtIGRvZXMgdGhlIG1hYzgwMjExIHRlbGwKLQkJCSAqIHVzIHdoaWNoIHRvIHVzZT8KLQkJCSAqLwotCQkJdHhfZGVzYy0+dHhkdzQgfD0KLQkJCQljcHVfdG9fbGUzMihERVNDX1JBVEVfMjRNIDw8Ci0JCQkJCSAgICBUWERFU0MzMl9SVFNfUkFURV9TSElGVCk7Ci0JCQl0eF9kZXNjLT50eGR3NCB8PQotCQkJCWNwdV90b19sZTMyKFRYREVTQzMyX1JUU19DVFNfRU5BQkxFKTsKLQkJCXR4X2Rlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKFRYREVTQzMyX0hXX1JUU19FTkFCTEUpOwotCQl9Ci0JfSBlbHNlIHsKLQkJdHhfZGVzYzQwID0gKHN0cnVjdCBydGw4eHh4dV90eGRlc2M0MCAqKXR4X2Rlc2M7Ci0KLQkJdHhfZGVzYzQwLT50eGR3NCA9IGNwdV90b19sZTMyKHJhdGUpOwotCQlpZiAoaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQkJdHhfZGVzYy0+dHhkdzQgfD0KLQkJCQljcHVfdG9fbGUzMigweDFmIDw8Ci0JCQkJCSAgICBUWERFU0M0MF9EQVRBX1JBVEVfRkJfU0hJRlQpOwotCQl9Ci0KLQkJdHhfZGVzYzQwLT50eGR3OSA9Ci0JCQljcHVfdG9fbGUzMigodTMyKXNlcV9udW1iZXIgPDwgVFhERVNDNDBfU0VRX1NISUZUKTsKLQotCQlpZiAoYW1wZHVfZW5hYmxlKQotCQkJdHhfZGVzYzQwLT50eGR3MiB8PSBjcHVfdG9fbGUzMihUWERFU0M0MF9BR0dfRU5BQkxFKTsKLQkJZWxzZQotCQkJdHhfZGVzYzQwLT50eGR3MiB8PSBjcHVfdG9fbGUzMihUWERFU0M0MF9BR0dfQlJFQUspOwotCi0JCWlmIChpZWVlODAyMTFfaXNfbWdtdChoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCQl0eF9kZXNjNDAtPnR4ZHc0ID0gY3B1X3RvX2xlMzIodHhfcmF0ZS0+aHdfdmFsdWUpOwotCQkJdHhfZGVzYzQwLT50eGR3MyB8PQotCQkJCWNwdV90b19sZTMyKFRYREVTQzQwX1VTRV9EUklWRVJfUkFURSk7Ci0JCQl0eF9kZXNjNDAtPnR4ZHc0IHw9Ci0JCQkJY3B1X3RvX2xlMzIoNiA8PCBUWERFU0M0MF9SRVRSWV9MSU1JVF9TSElGVCk7Ci0JCQl0eF9kZXNjNDAtPnR4ZHc0IHw9Ci0JCQkJY3B1X3RvX2xlMzIoVFhERVNDNDBfUkVUUllfTElNSVRfRU5BQkxFKTsKLQkJfQotCi0JCWlmIChyYXRlX2ZsYWcgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1NIT1JUX1BSRUFNQkxFIHx8Ci0JCSAgICAoc3RhICYmIHZpZiAmJiB2aWYtPmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZSkpCi0JCQl0eF9kZXNjNDAtPnR4ZHc1IHw9Ci0JCQkJY3B1X3RvX2xlMzIoVFhERVNDNDBfU0hPUlRfUFJFQU1CTEUpOwotCi0JCWlmIChyYXRlX2ZsYWcgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1JUU19DVFMpIHsKLQkJCS8qCi0JCQkgKiBVc2UgUlRTIHJhdGUgMjRNIC0gZG9lcyB0aGUgbWFjODAyMTEgdGVsbAotCQkJICogdXMgd2hpY2ggdG8gdXNlPwotCQkJICovCi0JCQl0eF9kZXNjLT50eGR3NCB8PQotCQkJCWNwdV90b19sZTMyKERFU0NfUkFURV8yNE0gPDwKLQkJCQkJICAgIFRYREVTQzQwX1JUU19SQVRFX1NISUZUKTsKLQkJCXR4X2Rlc2MtPnR4ZHczIHw9IGNwdV90b19sZTMyKFRYREVTQzQwX1JUU19DVFNfRU5BQkxFKTsKLQkJCXR4X2Rlc2MtPnR4ZHczIHw9IGNwdV90b19sZTMyKFRYREVTQzQwX0hXX1JUU19FTkFCTEUpOwotCQl9Ci0JfQorCXByaXYtPmZvcHMtPmZpbGxfdHhkZXNjKGhkciwgdHhfZGVzYywgcmF0ZSwgcmF0ZV9mbGFnLAorCQkJCXNnaSwgc2hvcnRfcHJlYW1ibGUsIGFtcGR1X2VuYWJsZSk7CiAKIAlydGw4eHh4dV9jYWxjX3R4X2Rlc2NfY3N1bSh0eF9kZXNjKTsKIApAQCAtNTM3OSw3ICs1Mzc1LDggQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcHJpdi0+dWRldi0+ZGV2OwogCWludCByZXQ7CiAKLQlkZXZfZGJnKGRldiwgIiVzOiBzdGF0dXMgJWlcbiIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJaWYgKHJ0bDh4eHh1X2RlYnVnICYgUlRMOFhYWFVfREVCVUdfSU5URVJSVVBUKQorCQlkZXZfZGJnKGRldiwgIiVzOiBzdGF0dXMgJWlcbiIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAJaWYgKHVyYi0+c3RhdHVzID09IDApIHsKIAkJdXNiX2FuY2hvcl91cmIodXJiLCAmcHJpdi0+aW50X2FuY2hvcik7CiAJCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CkBAIC01NzA0LDcgKzU3MDEsNyBAQAogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVEFSVDoKLQkJZGV2X2luZm8oZGV2LCAiJXM6IElFRUU4MDIxMV9BTVBEVV9UWF9TVEFSVFxuIiwgX19mdW5jX18pOworCQlkZXZfZGJnKGRldiwgIiVzOiBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlRcbiIsIF9fZnVuY19fKTsKIAkJYW1wZHVfZmFjdG9yID0gc3RhLT5odF9jYXAuYW1wZHVfZmFjdG9yOwogCQlhbXBkdV9kZW5zaXR5ID0gc3RhLT5odF9jYXAuYW1wZHVfZGVuc2l0eTsKIAkJcnRsOHh4eHVfc2V0X2FtcGR1X2ZhY3Rvcihwcml2LCBhbXBkdV9mYWN0b3IpOwpAQCAtNTcxNCwyMSArNTcxMSwyMSBAQAogCQkJYW1wZHVfZmFjdG9yLCBhbXBkdV9kZW5zaXR5KTsKIAkJYnJlYWs7CiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUF9GTFVTSDoKLQkJZGV2X2luZm8oZGV2LCAiJXM6IElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QX0ZMVVNIXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9kYmcoZGV2LCAiJXM6IElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QX0ZMVVNIXG4iLCBfX2Z1bmNfXyk7CiAJCXJ0bDh4eHh1X3NldF9hbXBkdV9mYWN0b3IocHJpdiwgMCk7CiAJCXJ0bDh4eHh1X3NldF9hbXBkdV9taW5fc3BhY2UocHJpdiwgMCk7CiAJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUT1BfRkxVU0hfQ09OVDoKLQkJZGV2X2luZm8oZGV2LCAiJXM6IElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QX0ZMVVNIX0NPTlRcbiIsCisJCWRldl9kYmcoZGV2LCAiJXM6IElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QX0ZMVVNIX0NPTlRcbiIsCiAJCQkgX19mdW5jX18pOwogCQlydGw4eHh4dV9zZXRfYW1wZHVfZmFjdG9yKHByaXYsIDApOwogCQlydGw4eHh4dV9zZXRfYW1wZHVfbWluX3NwYWNlKHByaXYsIDApOwogCQlicmVhazsKIAljYXNlIElFRUU4MDIxMV9BTVBEVV9SWF9TVEFSVDoKLQkJZGV2X2luZm8oZGV2LCAiJXM6IElFRUU4MDIxMV9BTVBEVV9SWF9TVEFSVFxuIiwgX19mdW5jX18pOworCQlkZXZfZGJnKGRldiwgIiVzOiBJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlRcbiIsIF9fZnVuY19fKTsKIAkJYnJlYWs7CiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RPUDoKLQkJZGV2X2luZm8oZGV2LCAiJXM6IElFRUU4MDIxMV9BTVBEVV9SWF9TVE9QXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9kYmcoZGV2LCAiJXM6IElFRUU4MDIxMV9BTVBEVV9SWF9TVE9QXG4iLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtNTk0Nyw3ICs1OTQ0LDcgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0OwogCWludCB1bnRlc3RlZCA9IDE7CiAKIAl1ZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKQEAgLTU5NzEsNiArNTk2OCwxOCBAQAogCQlpZiAoaWQtPmlkUHJvZHVjdCA9PSAweDEwMDQpCiAJCQl1bnRlc3RlZCA9IDA7CiAJCWJyZWFrOworCWNhc2UgMHgyMGY0OgorCQlpZiAoaWQtPmlkUHJvZHVjdCA9PSAweDY0OGIpCisJCQl1bnRlc3RlZCA9IDA7CisJCWJyZWFrOworCWNhc2UgMHgyMDAxOgorCQlpZiAoaWQtPmlkUHJvZHVjdCA9PSAweDMzMDgpCisJCQl1bnRlc3RlZCA9IDA7CisJCWJyZWFrOworCWNhc2UgMHgyMzU3OgorCQlpZiAoaWQtPmlkUHJvZHVjdCA9PSAweDAxMDkpCisJCQl1bnRlc3RlZCA9IDA7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTU5ODcsNiArNTk5Niw3IEBACiAJaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKHN0cnVjdCBydGw4eHh4dV9wcml2KSwgJnJ0bDh4eHh1X29wcyk7CiAJaWYgKCFodykgewogCQlyZXQgPSAtRU5PTUVNOworCQlwcml2ID0gTlVMTDsKIAkJZ290byBleGl0OwogCX0KIApAQCAtNjAzNSw2ICs2MDQ1LDggQEAKIAl9CiAKIAlyZXQgPSBydGw4eHh4dV9pbml0X2RldmljZShodyk7CisJaWYgKHJldCkKKwkJZ290byBleGl0OwogCiAJaHctPndpcGh5LT5tYXhfc2Nhbl9zc2lkcyA9IDE7CiAJaHctPndpcGh5LT5tYXhfc2Nhbl9pZV9sZW4gPSBJRUVFODAyMTFfTUFYX0RBVEFfTEVOOwpAQCAtNjA4NSw5ICs2MDk3LDIwIEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKKwlyZXR1cm4gMDsKKwogZXhpdDoKLQlpZiAocmV0IDwgMCkKLQkJdXNiX3B1dF9kZXYodWRldik7CisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCisJaWYgKHByaXYpIHsKKwkJa2ZyZWUocHJpdi0+ZndfZGF0YSk7CisJCW11dGV4X2Rlc3Ryb3koJnByaXYtPnVzYl9idWZfbXV0ZXgpOworCQltdXRleF9kZXN0cm95KCZwcml2LT5oMmNfbXV0ZXgpOworCX0KKwl1c2JfcHV0X2Rldih1ZGV2KTsKKworCWllZWU4MDIxMV9mcmVlX2h3KGh3KTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTYxMTEsNiArNjEzNCwxMSBAQAogCW11dGV4X2Rlc3Ryb3koJnByaXYtPnVzYl9idWZfbXV0ZXgpOwogCW11dGV4X2Rlc3Ryb3koJnByaXYtPmgyY19tdXRleCk7CiAKKwlpZiAocHJpdi0+dWRldi0+c3RhdGUgIT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKSB7CisJCWRldl9pbmZvKCZwcml2LT51ZGV2LT5kZXYsCisJCQkgIkRldmljZSBzdGlsbCBhdHRhY2hlZCwgdHJ5aW5nIHRvIHJlc2V0XG4iKTsKKwkJdXNiX3Jlc2V0X2RldmljZShwcml2LT51ZGV2KTsKKwl9CiAJdXNiX3B1dF9kZXYocHJpdi0+dWRldik7CiAJaWVlZTgwMjExX2ZyZWVfaHcoaHcpOwogfQpAQCAtNjEyNCw2ICs2MTUyLDkgQEAKIAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODcyM2F1X2ZvcHN9LAoge1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFVTQl9WRU5ET1JfSURfUkVBTFRFSywgMHg4MThiLCAweGZmLCAweGZmLCAweGZmKSwKIAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmV1X2ZvcHN9LAorLyogVGVzdGVkIGJ5IE15Y2tlbCBIYWJldHMgKi8KK3tVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDIzNTcsIDB4MDEwOSwgMHhmZiwgMHhmZiwgMHhmZiksCisJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJnJ0bDgxOTJldV9mb3BzfSwKIHtVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhVU0JfVkVORE9SX0lEX1JFQUxURUssIDB4YjcyMCwgMHhmZiwgMHhmZiwgMHhmZiksCiAJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJnJ0bDg3MjNidV9mb3BzfSwKICNpZmRlZiBDT05GSUdfUlRMOFhYWFVfVU5URVNURUQKQEAgLTYxNDAsNiArNjE3MSwxMiBAQAogLyogVGVzdGVkIGJ5IEFuZHJlYSBNZXJlbGxvICovCiB7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgwNTBkLCAweDEwMDQsIDB4ZmYsIDB4ZmYsIDB4ZmYpLAogCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSZydGw4MTkyY3VfZm9wc30sCisvKiBUZXN0ZWQgYnkgSm9jZWx5biBNYXllciAqLwore1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MjBmNCwgMHg2NDhiLCAweGZmLCAweGZmLCAweGZmKSwKKwkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmN1X2ZvcHN9LAorLyogVGVzdGVkIGJ5IFN0ZWZhbm8gQnJhdmkgKi8KK3tVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDIwMDEsIDB4MzMwOCwgMHhmZiwgMHhmZiwgMHhmZiksCisJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJnJ0bDgxOTJjdV9mb3BzfSwKIC8qIEN1cnJlbnRseSB1bnRlc3RlZCA4MTg4IHNlcmllcyBkZXZpY2VzICovCiB7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oVVNCX1ZFTkRPUl9JRF9SRUFMVEVLLCAweDgxOTEsIDB4ZmYsIDB4ZmYsIDB4ZmYpLAogCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSZydGw4MTkyY3VfZm9wc30sCkBAIC02MTg3LDggKzYyMjQsNiBAQAogCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSZydGw4MTkyY3VfZm9wc30sCiB7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgxM2QzLCAweDMzNTcsIDB4ZmYsIDB4ZmYsIDB4ZmYpLAogCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSZydGw4MTkyY3VfZm9wc30sCi17VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgyMDAxLCAweDMzMDgsIDB4ZmYsIDB4ZmYsIDB4ZmYpLAotCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSZydGw4MTkyY3VfZm9wc30sCiB7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgyMDAxLCAweDMzMGIsIDB4ZmYsIDB4ZmYsIDB4ZmYpLAogCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSZydGw4MTkyY3VfZm9wc30sCiB7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgyMDE5LCAweDQ5MDIsIDB4ZmYsIDB4ZmYsIDB4ZmYpLApAQCAtNjE5OSw4ICs2MjM0LDYgQEAKIAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmN1X2ZvcHN9LAoge1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MjAxOSwgMHhlZDE3LCAweGZmLCAweGZmLCAweGZmKSwKIAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmN1X2ZvcHN9LAote1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MjBmNCwgMHg2NDhiLCAweGZmLCAweGZmLCAweGZmKSwKLQkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmN1X2ZvcHN9LAoge1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4NDg1NSwgMHgwMDkwLCAweGZmLCAweGZmLCAweGZmKSwKIAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmN1X2ZvcHN9LAoge1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4NDg1NiwgMHgwMDkxLCAweGZmLCAweGZmLCAweGZmKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfcmVncy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV9yZWdzLmgKaW5kZXggOTIxYzU2NS4uMzE1Y2NmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV9yZWdzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV9yZWdzLmgKQEAgLTIxMywxMCArMjEzLDY2IEBACiAjZGVmaW5lIFJFR19ITUJPWF9FWFRfMQkJCTB4MDA4YQogI2RlZmluZSBSRUdfSE1CT1hfRVhUXzIJCQkweDAwOGMKICNkZWZpbmUgUkVHX0hNQk9YX0VYVF8zCQkJMHgwMDhlCisKIC8qIEludGVycnVwdCByZWdpc3RlcnMgZm9yIDgxOTJlLzg3MjNidS84ODEyICovCiAjZGVmaW5lIFJFR19ISU1SMAkJCTB4MDBiMAorI2RlZmluZQkgSU1SMF9UWENDSwkJCUJJVCgzMCkJLyogVFhSUFQgaW50ZXJydXB0IHdoZW4gQ0NYIGJpdAorCQkJCQkJICAgb2YgdGhlIHBhY2tldCBpcyBzZXQgKi8KKyNkZWZpbmUJIElNUjBfUFNUSU1FT1VUCQkJQklUKDI5KQkvKiBQb3dlciBTYXZlIFRpbWUgT3V0IEludCAqLworI2RlZmluZQkgSU1SMF9HVElOVDQJCQlCSVQoMjgpCS8qIFNldCB3aGVuIEdUSU1FUjQgZXhwaXJlcyAqLworI2RlZmluZQkgSU1SMF9HVElOVDMJCQlCSVQoMjcpCS8qIFNldCB3aGVuIEdUSU1FUjMgZXhwaXJlcyAqLworI2RlZmluZQkgSU1SMF9UQkRFUgkJCUJJVCgyNikJLyogVHJhbnNtaXQgQmVhY29uMCBFcnJvciAqLworI2RlZmluZQkgSU1SMF9UQkRPSwkJCUJJVCgyNSkJLyogVHJhbnNtaXQgQmVhY29uMCBPSyAqLworI2RlZmluZQkgSU1SMF9UU0ZfQklUMzJfVE9HR0xFCQlCSVQoMjQpCS8qIFRTRiBUaW1lciBCSVQzMiB0b2dnbGUKKwkJCQkJCSAgIGluZGljYXRpb24gaW50ZXJydXB0ICovCisjZGVmaW5lCSBJTVIwX0JDTkRNQUlOVDAJCUJJVCgyMCkJLyogQmVhY29uIERNQSBJbnRlcnJ1cHQgMCAqLworI2RlZmluZQkgSU1SMF9CQ05ERVJSMAkJCUJJVCgxNikJLyogQmVhY29uIFF1ZXVlIERNQSBFcnJvciAwICovCisjZGVmaW5lCSBJTVIwX0hTSVNSX0lORF9PTl9JTlQJCUJJVCgxNSkJLyogSFNJU1IgSW5kaWNhdG9yIChIU0lNUiAmCisJCQkJCQkgICBIU0lTUiBpcyB0cnVlKSAqLworI2RlZmluZQkgSU1SMF9CQ05ETUFJTlRfRQkJQklUKDE0KQkvKiBCZWFjb24gRE1BIEludGVycnVwdAorCQkJCQkJICAgRXh0ZW5zaW9uIGZvciBXaW43ICovCisjZGVmaW5lCSBJTVIwX0FUSU1FTkQJCQlCSVQoMTIpCS8qIENUV2lkbm93IEVuZCBvcgorCQkJCQkJICAgQVRJTSBXaW5kb3cgRW5kICovCisjZGVmaW5lCSBJTVIwX0hJU1IxX0lORF9JTlQJCUJJVCgxMSkJLyogSElTUjEgSW5kaWNhdG9yCisJCQkJCQkgICAoSElTUjEgJiBISU1SMSBpcyB0cnVlKSAqLworI2RlZmluZQkgSU1SMF9DMkhDTUQJCQlCSVQoMTApCS8qIENQVSB0byBIb3N0IENvbW1hbmQgSU5UCisJCQkJCQkgICBTdGF0dXMsIFdyaXRlIDEgdG8gY2xlYXIgKi8KKyNkZWZpbmUJIElNUjBfQ1BXTTIJCQlCSVQoOSkJLyogQ1BVIHBvd2VyIE1vZGUgZXhjaGFuZ2UgSU5UCisJCQkJCQkgICBTdGF0dXMsIFdyaXRlIDEgdG8gY2xlYXIgKi8KKyNkZWZpbmUJIElNUjBfQ1BXTQkJCUJJVCg4KQkvKiBDUFUgcG93ZXIgTW9kZSBleGNoYW5nZSBJTlQKKwkJCQkJCSAgIFN0YXR1cywgV3JpdGUgMSB0byBjbGVhciAqLworI2RlZmluZQkgSU1SMF9ISUdIRE9LCQkJQklUKDcpCS8qIEhpZ2ggUXVldWUgRE1BIE9LICovCisjZGVmaW5lCSBJTVIwX01HTlRET0sJCQlCSVQoNikJLyogTWFuYWdlbWVudCBRdWV1ZSBETUEgT0sgKi8KKyNkZWZpbmUJIElNUjBfQktET0sJCQlCSVQoNSkJLyogQUNfQksgRE1BIE9LICovCisjZGVmaW5lCSBJTVIwX0JFRE9LCQkJQklUKDQpCS8qIEFDX0JFIERNQSBPSyAqLworI2RlZmluZQkgSU1SMF9WSURPSwkJCUJJVCgzKQkvKiBBQ19WSSBETUEgT0sgKi8KKyNkZWZpbmUJIElNUjBfVk9ET0sJCQlCSVQoMikJLyogQUNfVk8gRE1BIE9LICovCisjZGVmaW5lCSBJTVIwX1JEVQkJCUJJVCgxKQkvKiBSeCBEZXNjcmlwdG9yIFVuYXZhaWxhYmxlICovCisjZGVmaW5lCSBJTVIwX1JPSwkJCUJJVCgwKQkvKiBSZWNlaXZlIERNQSBPSyAqLwogI2RlZmluZSBSRUdfSElTUjAJCQkweDAwYjQKICNkZWZpbmUgUkVHX0hJTVIxCQkJMHgwMGI4CisjZGVmaW5lCSBJTVIxX0JDTkRNQUlOVDcJCUJJVCgyNykJLyogQmVhY29uIERNQSBJbnRlcnJ1cHQgNyAqLworI2RlZmluZQkgSU1SMV9CQ05ETUFJTlQ2CQlCSVQoMjYpCS8qIEJlYWNvbiBETUEgSW50ZXJydXB0IDYgKi8KKyNkZWZpbmUJIElNUjFfQkNORE1BSU5UNQkJQklUKDI1KQkvKiBCZWFjb24gRE1BIEludGVycnVwdCA1ICovCisjZGVmaW5lCSBJTVIxX0JDTkRNQUlOVDQJCUJJVCgyNCkJLyogQmVhY29uIERNQSBJbnRlcnJ1cHQgNCAqLworI2RlZmluZQkgSU1SMV9CQ05ETUFJTlQzCQlCSVQoMjMpCS8qIEJlYWNvbiBETUEgSW50ZXJydXB0IDMgKi8KKyNkZWZpbmUJIElNUjFfQkNORE1BSU5UMgkJQklUKDIyKQkvKiBCZWFjb24gRE1BIEludGVycnVwdCAyICovCisjZGVmaW5lCSBJTVIxX0JDTkRNQUlOVDEJCUJJVCgyMSkJLyogQmVhY29uIERNQSBJbnRlcnJ1cHQgMSAqLworI2RlZmluZQkgSU1SMV9CQ05ERVJSNwkJCUJJVCgyMCkJLyogQmVhY29uIFF1ZXVlIERNQSBFcnIgSW50IDcgKi8KKyNkZWZpbmUJIElNUjFfQkNOREVSUjYJCQlCSVQoMTkpCS8qIEJlYWNvbiBRdWV1ZSBETUEgRXJyIEludCA2ICovCisjZGVmaW5lCSBJTVIxX0JDTkRFUlI1CQkJQklUKDE4KQkvKiBCZWFjb24gUXVldWUgRE1BIEVyciBJbnQgNSAqLworI2RlZmluZQkgSU1SMV9CQ05ERVJSNAkJCUJJVCgxNykJLyogQmVhY29uIFF1ZXVlIERNQSBFcnIgSW50IDQgKi8KKyNkZWZpbmUJIElNUjFfQkNOREVSUjMJCQlCSVQoMTYpCS8qIEJlYWNvbiBRdWV1ZSBETUEgRXJyIEludCAzICovCisjZGVmaW5lCSBJTVIxX0JDTkRFUlIyCQkJQklUKDE1KQkvKiBCZWFjb24gUXVldWUgRE1BIEVyciBJbnQgMiAqLworI2RlZmluZQkgSU1SMV9CQ05ERVJSMQkJCUJJVCgxNCkJLyogQmVhY29uIFF1ZXVlIERNQSBFcnIgSW50IDEgKi8KKyNkZWZpbmUJIElNUjFfQVRJTUVORF9FCQkJQklUKDEzKQkvKiBBVElNIFdpbmRvdyBFbmQgRXh0ZW5zaW9uCisJCQkJCQkgICBmb3IgV2luNyAqLworI2RlZmluZQkgSU1SMV9UWEVSUgkJCUJJVCgxMSkJLyogVHggRXJyb3IgRmxhZyBJbnQgU3RhdHVzLAorCQkJCQkJICAgd3JpdGUgMSB0byBjbGVhciAqLworI2RlZmluZQkgSU1SMV9SWEVSUgkJCUJJVCgxMCkJLyogUnggRXJyb3IgRmxhZyBJbnQgU3RhdHVzLAorCQkJCQkJICAgd3JpdGUgMSB0byBjbGVhciAqLworI2RlZmluZQkgSU1SMV9UWEZPVlcJCQlCSVQoOSkJLyogVHJhbnNtaXQgRklGTyBPdmVyZmxvdyAqLworI2RlZmluZQkgSU1SMV9SWEZPVlcJCQlCSVQoOCkJLyogUmVjZWl2ZSBGSUZPIE92ZXJmbG93ICovCiAjZGVmaW5lIFJFR19ISVNSMQkJCTB4MDBiYwogCiAvKiAgSG9zdCBzdXNwZW5kIGNvdW50ZXIgb24gRlBHQSBwbGF0Zm9ybSAqLwpAQCAtNjIwLDYgKzY3Niw3IEBACiAjZGVmaW5lIFJFR19TQ0hfVFhDTUQJCQkweDA1ZDAKIAogLyogZGVmaW5lIFJFR19GV19UU0ZfU1lOQ19DTlQJCTB4MDRhMCAqLworI2RlZmluZSBSRUdfU0NIX1RYX0NNRAkJCTB4MDVmOAogI2RlZmluZSBSRUdfRldfUkVTRVRfVFNGX0NOVF8xCQkweDA1ZmMKICNkZWZpbmUgUkVHX0ZXX1JFU0VUX1RTRl9DTlRfMAkJMHgwNWZkCiAjZGVmaW5lIFJFR19GV19CQ05fRElTX0NOVAkJMHgwNWZlCkBAIC03ODAsNiArODM3LDEwIEBACiAjZGVmaW5lICBGUEdBX1JGX01PREVfT0ZETQkJQklUKDI1KQogCiAjZGVmaW5lIFJFR19GUEdBMF9UWF9JTkZPCQkweDA4MDQKKyNkZWZpbmUgIEZQR0EwX1RYX0lORk9fT0ZETV9QQVRIX0EJQklUKDApCisjZGVmaW5lICBGUEdBMF9UWF9JTkZPX09GRE1fUEFUSF9CCUJJVCgxKQorI2RlZmluZSAgRlBHQTBfVFhfSU5GT19PRkRNX1BBVEhfQwlCSVQoMikKKyNkZWZpbmUgIEZQR0EwX1RYX0lORk9fT0ZETV9QQVRIX0QJQklUKDMpCiAjZGVmaW5lIFJFR19GUEdBMF9QU0RfRlVOQwkJMHgwODA4CiAjZGVmaW5lIFJFR19GUEdBMF9UWF9HQUlOCQkweDA4MGMKICNkZWZpbmUgUkVHX0ZQR0EwX1JGX1RJTUlORzEJCTB4MDgxMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL2NvcmUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9jb3JlLmMKaW5kZXggNDFmNzdmOC4uZjk1NzYwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL2NvcmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvY29yZS5jCkBAIC03NjUsNyArNzY1LDggQEAKIAkJCQkJbWFjLT5id180MCA9IGZhbHNlOwogCQkJCQltYWMtPmJ3XzgwID0gZmFsc2U7CiAJCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkJCSBjaGFubmVsX3R5cGUpOwogCQkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMTEzNSw3ICsxMTM2LDcgQEAKIAkJCQkJbWFjLT5tb2RlID0gV0lSRUxFU1NfTU9ERV9BQ18yNEc7CiAJCQl9CiAKLQkJCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJiBzdGEpCisJCQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnVwZGF0ZV9yYXRlX3RibChodywgc3RhLCAwKTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcGNpLmMKaW5kZXggZDEyNTg2ZC4uMGRmYTllYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3BjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9wY2kuYwpAQCAtMTc5LDcgKzE3OSw4IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCSBydGxwY2ktPmNvbnN0X3N1cHBvcnRfcGNpYXNwbSk7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3BzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcHMuYwppbmRleCA5YTY0ZjliLi4xOGQ5NzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcHMuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHN0YXRlX3Rvc2V0KTsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcmVnZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3JlZ2QuYwppbmRleCAzNTI0NDQxLi42ZWU2YmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcmVnZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9yZWdkLmMKQEAgLTM0NSw5ICszNDUsOSBAQAogCQlyZXR1cm4gJnJ0bF9yZWdkb21fbm9fbWlkYmFuZDsKIAljYXNlIENPVU5UUllfQ09ERV9JQzoKIAkJcmV0dXJuICZydGxfcmVnZG9tXzExOwotCWNhc2UgQ09VTlRSWV9DT0RFX0VUU0k6CiAJY2FzZSBDT1VOVFJZX0NPREVfVEVMRUNfTkVUR0VBUjoKIAkJcmV0dXJuICZydGxfcmVnZG9tXzYwXzY0OworCWNhc2UgQ09VTlRSWV9DT0RFX0VUU0k6CiAJY2FzZSBDT1VOVFJZX0NPREVfU1BBSU46CiAJY2FzZSBDT1VOVFJZX0NPREVfRlJBTkNFOgogCWNhc2UgQ09VTlRSWV9DT0RFX0lTUkFFTDoKQEAgLTQwNiw2ICs0MDYsOCBAQAogCQlyZXR1cm4gQ09VTlRSWV9DT0RFX1dPUkxEX1dJREVfMTM7CiAJY2FzZSAweDIyOgogCQlyZXR1cm4gQ09VTlRSWV9DT0RFX0lDOworCWNhc2UgMHgyNToKKwkJcmV0dXJuIENPVU5UUllfQ09ERV9FVFNJOwogCWNhc2UgMHgzMjoKIAkJcmV0dXJuIENPVU5UUllfQ09ERV9URUxFQ19ORVRHRUFSOwogCWNhc2UgMHg0MToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvZncuYwppbmRleCA2MjkxMjU2Li41MzYwZDUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE4OGVlL2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9mdy5jCkBAIC0zMzQsNyArMzM0LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGJveG51bSk7CiAJCQlicmVhazsKIAkJfQogCQlpc2Z3X3JlYWQgPSBfcnRsODhlX2NoZWNrX2Z3X3JlYWRfbGFzdF9oMmMoaHcsIGJveG51bSk7CkBAIC00MDUsNyArNDA1LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGNtZF9sZW4pOwogCQkJYnJlYWs7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9ody5jCmluZGV4IDRhYjYyMDEuLjM3ZDZlZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE4OGVlL2h3LmMKQEAgLTM1NSw5ICszNTUsMTEgQEAKIAogCQkqKCh1NjQgKikodmFsKSkgPSB0c2Y7CiAJCWJyZWFrOyB9CisJY2FzZSBIQUxfREVGX1dPV0xBTjoKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3MgJXhcbiIsIHZhcmlhYmxlKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHZhcmlhYmxlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtNTcxLDcgKzU3Myw4IEBACiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJCQkgZV9hY2kpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC03MzUsNyArNzM4LDcgQEAKIAkJYnJlYWs7IH0KIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2VzcyAleFxuIiwgdmFyaWFibGUpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgdmFyaWFibGUpOwogCQlicmVhazsKIAl9CiB9CkBAIC0yMzUyLDcgKzIzNTUsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGVuY19hbGdvKTsKIAkJCWVuY19hbGdvID0gQ0FNX1RLSVA7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvbGVkLmMKaW5kZXggYjUwNGJkMC4uZjA1YzJjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9sZWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE4OGVlL2xlZC5jCkBAIC02Miw3ICs2Miw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcGxlZC0+bGVkcGluKTsKIAkJYnJlYWs7CiAJfQogCXBsZWQtPmxlZG9uID0gdHJ1ZTsKQEAgLTEwMCw3ICsxMDAsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvcGh5LmMKaW5kZXggNzQ5OGExMi4uZmZmYWE5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE4OGVlL3BoeS5jCkBAIC0xMzQ2LDcgKzEzNDYsOCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkgY3VycmVudGNtZC0+Y21kaWQpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMjEyOCw3ICsyMTI5LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGlvdHlwZSk7CiAJCQlicmVhazsKIAkJfQogCX0gd2hpbGUgKGZhbHNlKTsKQEAgLTIxNjYsNyArMjE2Nyw4IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCSBydGxwaHktPmN1cnJlbnRfaW9fdHlwZSk7CiAJCWJyZWFrOwogCX0KIAlydGxwaHktPnNldF9pb19pbnByb2dyZXNzID0gZmFsc2U7CkBAIC0yMzE5LDcgKzIzMjEsNyBAQAogCQl9CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCByZnB3cl9zdGF0ZSk7CiAJCWJyZXN1bHQgPSBmYWxzZTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9zdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9zdy5jCmluZGV4IDQ3ZTMyY2IuLmU3YjExYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE4OGVlL3N3LmMKQEAgLTI4MCw3ICsyODAsNyBAQAogCS5kZWJ1ZyA9IERCR19FTUVSRywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsODhlZV9oYWxfY2ZnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBydGxfaGFsX2NmZyBydGw4OGVlX2hhbF9jZmcgPSB7CiAJLmJhcl9pZCA9IDIsCiAJLndyaXRlX3JlYWRiYWNrID0gdHJ1ZSwKIAkubmFtZSA9ICJydGw4OGVfcGNpIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyYy9md19jb21tb24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyYy9md19jb21tb24uYwppbmRleCA0M2ZjYjI1Li43ZDE1MjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmMvZndfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjL2Z3X2NvbW1vbi5jCkBAIC0zNTIsNyArMzUyLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGJveG51bSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC00NTYsNyArNDU2LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGNtZF9sZW4pOwogCQkJYnJlYWs7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjL3BoeV9jb21tb24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyYy9waHlfY29tbW9uLmMKaW5kZXggNjBhYjJlYy4uMjdlM2Q1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjL3BoeV9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmMvcGh5X2NvbW1vbi5jCkBAIC05MTAsNyArOTEwLDggQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkJIGN1cnJlbnRjbWQtPmNtZGlkKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTE1NjcsNyArMTU2OCw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBpb3R5cGUpOwogCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlIChmYWxzZSk7CkBAIC0xNjA1LDcgKzE2MDYsOCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkgcnRscGh5LT5jdXJyZW50X2lvX3R5cGUpOwogCQlicmVhazsKIAl9CiAJcnRscGh5LT5zZXRfaW9faW5wcm9ncmVzcyA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9ody5jCmluZGV4IDI0NDYwNzkuLmE0N2JlNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY2UvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmNlL2h3LmMKQEAgLTE0MSw5ICsxNDEsMTEgQEAKIAogCQlicmVhazsKIAkJfQorCWNhc2UgSEFMX0RFRl9XT1dMQU46CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgdmFyaWFibGUpOwogCQlicmVhazsKIAl9CiB9CkBAIC0zNjcsNyArMzY5LDggQEAKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdDoKIAkJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJCQkJIGVfYWNpKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQpAQCAtMjE1NCw3ICsyMTU3LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGVuY19hbGdvKTsKIAkJCWVuY19hbGdvID0gQ0FNX1RLSVA7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY2UvbGVkLmMKaW5kZXggODI4M2U5YjIuLjI0ZTQ4M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY2UvbGVkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9sZWQuYwpAQCAtNjIsNyArNjIsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IHRydWU7CkBAIC05Nyw3ICs5Nyw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcGxlZC0+bGVkcGluKTsKIAkJYnJlYWs7CiAJfQogCXBsZWQtPmxlZG9uID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmNlL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9waHkuYwppbmRleCAxZWU1YTZhLi40NmQwZDk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmNlL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY2UvcGh5LmMKQEAgLTMwMCwxMiArMzAwLDkgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFJGOTBfUEFUSF9DOgotCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKLQkJYnJlYWs7CiAJY2FzZSBSRjkwX1BBVEhfRDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCByZnBhdGgpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTU1NCw3ICs1NTEsNyBAQAogCQl9CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCByZnB3cl9zdGF0ZSk7CiAJCWJyZXN1bHQgPSBmYWxzZTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9zdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9zdy5jCmluZGV4IDQ3ODBiZGMuLjg3YWEyMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY2Uvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmNlL3N3LmMKQEAgLTI1OCw3ICsyNTgsNyBAQAogCS5kZWJ1ZyA9IERCR19FTUVSRywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsOTJjZV9oYWxfY2ZnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBydGxfaGFsX2NmZyBydGw5MmNlX2hhbF9jZmcgPSB7CiAJLmJhcl9pZCA9IDIsCiAJLndyaXRlX3JlYWRiYWNrID0gdHJ1ZSwKIAkubmFtZSA9ICJydGw5MmNfcGNpIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY3UvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY3UvaHcuYwppbmRleCA4Nzg5NzUyLi5hZThmMDU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmN1L2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjdS9ody5jCkBAIC0xNTYwLDcgKzE1NjAsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHZhcmlhYmxlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMTkzMSw3ICsxOTMxLDcgQEAKIAkJfQogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgdmFyaWFibGUpOwogCQlicmVhazsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmN1L2xlZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjdS9sZWQuYwppbmRleCA3NWEyZGViLi44NTE0YWI2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjdS9sZWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmN1L2xlZC5jCkBAIC02Miw3ICs2Miw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcGxlZC0+bGVkcGluKTsKIAkJYnJlYWs7CiAJfQogCXBsZWQtPmxlZG9uID0gdHJ1ZTsKQEAgLTk1LDcgKzk1LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY3UvcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmN1L3BoeS5jCmluZGV4IGM5NzJmYTUuLjRiMjk3NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY3UvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjdS9waHkuYwpAQCAtMjc3LDEyICsyNzcsOSBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgUkY5MF9QQVRIX0M6Ci0JCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOwotCQlicmVhazsKIAljYXNlIFJGOTBfUEFUSF9EOgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHJmcGF0aCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtNTE3LDcgKzUxNCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcmZwd3Jfc3RhdGUpOwogCQlicmVzdWx0ID0gZmFsc2U7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvZncuYwppbmRleCA2MmVmODIwLi44ZGUyOWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9mdy5jCkBAIC00MzUsNyArNDM1LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGJveG51bSk7CiAJCQlicmVhazsKIAkJfQogCQlpc2Z3X3JlYWQgPSBfcnRsOTJkX2NoZWNrX2Z3X3JlYWRfbGFzdF9oMmMoaHcsIGJveG51bSk7CkBAIC01MTIsNyArNTEyLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGNtZF9sZW4pOwogCQkJYnJlYWs7CiAJCX0KIAkJYndyaXRlX3N1Y2Nlc3MgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9ody5jCmluZGV4IGIwZjYzMjQuLmQ5MWY4YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL2h3LmMKQEAgLTE2NCw5ICsxNjQsMTEgQEAKIAljYXNlIEhXX1ZBUl9JTlRfQUM6CiAJCSooKGJvb2wgKikodmFsKSkgPSBydGxwcml2LT5kbS5kaXNhYmxlX3R4X2ludDsKIAkJYnJlYWs7CisJY2FzZSBIQUxfREVGX1dPV0xBTjoKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTM2MSw3ICszNjMsOCBAQAogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJCQkgZV9hY2kpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC01MDIsNyArNTA1LDcgQEAKIAl9CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTE3NTcsNyArMTc2MCw3IEBACiAJCXJldHVybjsKIAogCWlmIChydGxfZ2V0X2h3aW5mbyhodywgcnRscHJpdiwgSFdTRVRfTUFYX1NJWkUsIGh3aW5mbywgcGFyYW1zKSkKLQkJcmV0dXJuOworCQlnb3RvIGV4aXQ7CiAKIAlfcnRsOTJkZV9lZnVzZV91cGRhdGVfY2hpcF92ZXJzaW9uKGh3KTsKIAlfcnRsOTJkZV9yZWFkX21hY3BoeW1vZGVfYW5kX2JhbmR0eXBlKGh3LCBod2luZm8pOwpAQCAtMTc5MCw2ICsxNzkzLDcgQEAKIAkJYnJlYWs7CiAJfQogCXJ0bGVmdXNlLT50eHB3cl9mcm9tZXByb20gPSB0cnVlOworZXhpdDoKIAlrZnJlZShod2luZm8pOwogfQogCkBAIC0yMTcwLDcgKzIxNzQsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgZW5jX2FsZ28pOwogCQkJZW5jX2FsZ28gPSBDQU1fVEtJUDsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL2xlZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9sZWQuYwppbmRleCA3NmE1N2FlLi44MTFiYTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL2xlZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvbGVkLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSB0cnVlOwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcGxlZC0+bGVkcGluKTsKIAkJYnJlYWs7CiAJfQogCXBsZWQtPmxlZG9uID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9waHkuYwppbmRleCBkMzM0ZDJhLi4yYTFlZGZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvcGh5LmMKQEAgLTU4OCw3ICs1ODgsNyBAQAogCQkJCSAqIHNldHRpbmcuICovCiAJCQkJdWRlbGF5KDEpOwogCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX1RSQUNFLAotCQkJCQkgIlRoZSBSdGw4MTlYQUdDVEFCX0FycmF5X1RhYmxlWzBdIGlzICV1bCBSdGw4MTlYUEhZX1JFR0FycmF5WzFdIGlzICV1bFxuIiwKKwkJCQkJICJUaGUgUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZVswXSBpcyAldSBSdGw4MTlYUEhZX1JFR0FycmF5WzFdIGlzICV1XG4iLAogCQkJCQkgYWdjdGFiX2FycmF5X3RhYmxlW2ldLAogCQkJCQkgYWdjdGFiX2FycmF5X3RhYmxlW2kgKyAxXSk7CiAJCQl9CkBAIC02MDQsNyArNjA0LDcgQEAKIAkJCQkJICogc2V0dGluZy4gKi8KIAkJCQkJdWRlbGF5KDEpOwogCQkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJCQkJCSAiVGhlIFJ0bDgxOVhBR0NUQUJfQXJyYXlfVGFibGVbMF0gaXMgJXVsIFJ0bDgxOVhQSFlfUkVHQXJyYXlbMV0gaXMgJXVsXG4iLAorCQkJCQkJICJUaGUgUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZVswXSBpcyAldSBSdGw4MTlYUEhZX1JFR0FycmF5WzFdIGlzICV1XG4iLAogCQkJCQkJIGFnY3RhYl9hcnJheV90YWJsZVtpXSwKIAkJCQkJCSBhZ2N0YWJfYXJyYXlfdGFibGVbaSArIDFdKTsKIAkJCQl9CkBAIC02MjAsNyArNjIwLDcgQEAKIAkJCQkJICogc2V0dGluZy4gKi8KIAkJCQkJdWRlbGF5KDEpOwogCQkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJCQkJCSAiVGhlIFJ0bDgxOVhBR0NUQUJfNUdBcnJheV9UYWJsZVswXSBpcyAldWwgUnRsODE5WFBIWV9SRUdBcnJheVsxXSBpcyAldWxcbiIsCisJCQkJCQkgIlRoZSBSdGw4MTlYQUdDVEFCXzVHQXJyYXlfVGFibGVbMF0gaXMgJXUgUnRsODE5WFBIWV9SRUdBcnJheVsxXSBpcyAldVxuIiwKIAkJCQkJCSBhZ2N0YWJfNWdhcnJheV90YWJsZVtpXSwKIAkJCQkJCSBhZ2N0YWJfNWdhcnJheV90YWJsZVtpICsgMV0pOwogCQkJCX0KQEAgLTgzNiwxMiArODM2LDkgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFJGOTBfUEFUSF9DOgotCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKLQkJYnJlYWs7CiAJY2FzZSBSRjkwX1BBVEhfRDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCByZnBhdGgpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIHRydWU7CkBAIC0yODUwLDcgKzI4NDcsOCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkgY3VycmVudGNtZC0+Y21kaWQpOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC0yOTYzLDcgKzI5NjEsOCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkgcnRscGh5LT5jdXJyZW50X2lvX3R5cGUpOwogCQlicmVhazsKIAl9CiAJcnRscGh5LT5zZXRfaW9faW5wcm9ncmVzcyA9IGZhbHNlOwpAQCAtMjk5NCw3ICsyOTkzLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGlvdHlwZSk7CiAJCQlicmVhazsKIAkJfQogCX0gd2hpbGUgKGZhbHNlKTsKQEAgLTMxODIsNyArMzE4MSw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcmZwd3Jfc3RhdGUpOwogCQlicmVzdWx0ID0gZmFsc2U7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvc3cuYwppbmRleCBjNmUwOWExLi4wNTM4YTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL3N3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9zdy5jCkBAIC0yNjIsNyArMjYyLDcgQEAKIAkuZGVidWcgPSBEQkdfRU1FUkcsCiB9OwogCi1zdGF0aWMgc3RydWN0IHJ0bF9oYWxfY2ZnIHJ0bDkyZGVfaGFsX2NmZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsOTJkZV9oYWxfY2ZnID0gewogCS5iYXJfaWQgPSAyLAogCS53cml0ZV9yZWFkYmFjayA9IHRydWUsCiAJLm5hbWUgPSAicnRsODE5MmRlIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvZncuYwppbmRleCAwNzA4ZWVkLi5iM2Y2YTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9mdy5jCkBAIC0zNDQsNyArMzQ0LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGJveG51bSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC00MzMsNyArNDMzLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGNtZF9sZW4pOwogCQkJYnJlYWs7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9ody5jCmluZGV4IGIwN2FmOGQuLmViZjY2M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL2h3LmMKQEAgLTMzOCw5ICszMzgsMTEgQEAKIAkJKigodTY0ICopKHZhbCkpID0gdHNmOwogCQl9CiAJCWJyZWFrOworCWNhc2UgSEFMX0RFRl9XT1dMQU46CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRE1FU0csCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzICV4XG4iLCB2YXJpYWJsZSk7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTU2Niw3ICs1NjgsOCBAQAogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0RNRVNHLAotCQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkJIGVfYWNpKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtNjg1LDcgKzY4OCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRE1FU0csCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzICV4XG4iLCB2YXJpYWJsZSk7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTI0NjMsNyArMjQ2Niw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRE1FU0csCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgZW5jX2FsZ28pOwogCQkJZW5jX2FsZ28gPSBDQU1fVEtJUDsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL2xlZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9sZWQuYwppbmRleCA4Mzg4ZTM3Li40N2RhMDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL2xlZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvbGVkLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSB0cnVlOwpAQCAtOTEsNyArOTEsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvcGh5LmMKaW5kZXggYmVhZmM5YS4uNWFkN2U3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL3BoeS5jCkBAIC0xOTI3LDcgKzE5MjcsOCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkgY3VycmVudGNtZC0+Y21kaWQpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMzAwMSw3ICszMDAyLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGlvdHlwZSk7CiAJCQlicmVhazsKIAkJfQogCX0gd2hpbGUgKGZhbHNlKTsKQEAgLTMwNDEsNyArMzA0Miw4IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCSBydGxwaHktPmN1cnJlbnRfaW9fdHlwZSk7CiAJCWJyZWFrOwogCX0KIAlydGxwaHktPnNldF9pb19pbnByb2dyZXNzID0gZmFsc2U7CkBAIC0zMTg3LDcgKzMxODksNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHJmcHdyX3N0YXRlKTsKIAkJYnJlc3VsdCA9IGZhbHNlOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL3N3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL3N3LmMKaW5kZXggYzMxYzZiZi4uYWMyOTljYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvc3cuYwpAQCAtMjYyLDcgKzI2Miw3IEBACiAJLmRlYnVnID0gREJHX0VNRVJHLAogfTsKIAotc3RhdGljIHN0cnVjdCBydGxfaGFsX2NmZyBydGw5MmVlX2hhbF9jZmcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0bF9oYWxfY2ZnIHJ0bDkyZWVfaGFsX2NmZyA9IHsKIAkuYmFyX2lkID0gMiwKIAkud3JpdGVfcmVhZGJhY2sgPSB0cnVlLAogCS5uYW1lID0gInJ0bDkyZWVfcGNpIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2UvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2UvaHcuYwppbmRleCBkZGZhMGFlLi41MmU0NDMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MnNlL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJzZS9ody5jCkBAIC03Nyw5ICs3NywxMSBAQAogCQkJKigoYm9vbCAqKSh2YWwpKSA9IHJ0bHByaXYtPmRtLmN1cnJlbnRfbXJjX3N3aXRjaDsKIAkJCWJyZWFrOwogCQl9CisJY2FzZSBIQUxfREVGX1dPV0xBTjoKKwkJYnJlYWs7CiAJZGVmYXVsdDogewogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHZhcmlhYmxlKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMjk3LDcgKzI5OSw4IEBACiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQ6CiAJCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkJCSBlX2FjaSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KQEAgLTQzMyw3ICs0MzYsNyBAQAogCQlicmVhazsgfQogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgdmFyaWFibGUpOwogCQlicmVhazsKIAl9CiAKQEAgLTI0NjUsNyArMjQ2OCw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBlbmNfYWxnbyk7CiAJCQllbmNfYWxnbyA9IENBTV9US0lQOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2UvbGVkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MnNlL2xlZC5jCmluZGV4IDQ0OTQ5YjUuLjk4NDljYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2UvbGVkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJzZS9sZWQuYwpAQCAtNjgsNyArNjgsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IHRydWU7CkBAIC0xMDQsNyArMTA0LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2UvcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MnNlL3BoeS5jCmluZGV4IDg4MTgyMWYuLjRiYjc1NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2UvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJzZS9waHkuYwpAQCAtNDQyLDcgKzQ0Miw4IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJCSBjdXJyZW50Y21kLT5jbWRpZCk7CiAJCQlicmVhazsKIAkJfQogCkBAIC02NDgsNyArNjQ5LDcgQEAKIAkJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcmZwd3Jfc3RhdGUpOwogCQlicmVzdWx0ID0gZmFsc2U7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2Uvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2Uvc3cuYwppbmRleCAzMWJhY2E0MS4uNWU4ZTAyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJzZS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2Uvc3cuYwpAQCAtMzA2LDcgKzMwNiw3IEBACiAKIC8qIEJlY2F1c2UgbWVtb3J5IFIvVyBidXJzdGluZyB3aWxsIGNhdXNlIHN5c3RlbSBoYW5nL2NyYXNoCiAgKiBmb3IgOTJzZSwgc28gd2UgZG9uJ3QgcmVhZCBiYWNrIGFmdGVyIGV2ZXJ5IHdyaXRlIGFjdGlvbiAqLwotc3RhdGljIHN0cnVjdCBydGxfaGFsX2NmZyBydGw5MnNlX2hhbF9jZmcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0bF9oYWxfY2ZnIHJ0bDkyc2VfaGFsX2NmZyA9IHsKIAkuYmFyX2lkID0gMSwKIAkud3JpdGVfcmVhZGJhY2sgPSBmYWxzZSwKIAkubmFtZSA9ICJydGw5MnNfcGNpIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvZncuYwppbmRleCBiN2MwZDM4Li4xMTg2NzU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9mdy5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBib3hudW0pOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMjMwLDcgKzIzMCw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgY21kX2xlbik7CiAJCQlicmVhazsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL2h3LmMKaW5kZXggYjg4YzdlZS4uZjhiZTBiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvaHcuYwpAQCAtMTQxLDkgKzE0MSwxMSBAQAogCiAJCQlicmVhazsKIAkJfQorCWNhc2UgSEFMX0RFRl9XT1dMQU46CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgdmFyaWFibGUpOwogCQlicmVhazsKIAl9CiB9CkBAIC0zNjYsNyArMzY4LDggQEAKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdDoKIAkJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJCQkJIGVfYWNpKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQpAQCAtNTQ2LDcgKzU0OSw3IEBACiAJCX0KIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHZhcmlhYmxlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMTY1NCw3ICsxNjU3LDcgQEAKIAkJCXJ0bGVmdXNlLT5hdXRvbG9hZF9mYWlsZmxhZywgaHdpbmZvKTsKIAogCWlmIChydGxoYWwtPm9lbV9pZCAhPSBSVF9DSURfREVGQVVMVCkKLQkJcmV0dXJuOworCQlnb3RvIGV4aXQ7CiAKIAlzd2l0Y2ggKHJ0bGVmdXNlLT5lZXByb21fb2VtaWQpIHsKIAljYXNlIEVFUFJPTV9DSURfREVGQVVMVDoKQEAgLTIyMjUsNyArMjIyOCw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBlbmNfYWxnbyk7CiAJCQllbmNfYWxnbyA9IENBTV9US0lQOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvbGVkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL2xlZC5jCmluZGV4IDEzMTczMzUuLmM3YmU5MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvbGVkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9sZWQuYwpAQCAtNjMsNyArNjMsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSB0cnVlOwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvcGh5LmMKaW5kZXggNjAxYjc4ZS4uMTdiNThjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL3BoeS5jCkBAIC0xMDIzLDcgKzEwMjMsOCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkgY3VycmVudGNtZC0+Y21kaWQpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTQ5OSw3ICsxNTAwLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGlvdHlwZSk7CiAJCQlicmVhazsKIAkJfQogCX0gd2hpbGUgKGZhbHNlKTsKQEAgLTE1MzYsNyArMTUzNyw4IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCSBydGxwaHktPmN1cnJlbnRfaW9fdHlwZSk7CiAJCWJyZWFrOwogCX0KIAlydGxwaHktPnNldF9pb19pbnByb2dyZXNzID0gZmFsc2U7CkBAIC0xNjgyLDcgKzE2ODQsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHJmcHdyX3N0YXRlKTsKIAkJYnJlc3VsdCA9IGZhbHNlOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL3N3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL3N3LmMKaW5kZXggZmY0OWE4Yy4uODljODI4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvc3cuYwpAQCAtMjc2LDcgKzI3Niw3IEBACiAJLmRpc2FibGVfd2F0Y2hkb2cgPSBmYWxzZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsODcyM2VfaGFsX2NmZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsODcyM2VfaGFsX2NmZyA9IHsKIAkuYmFyX2lkID0gMiwKIAkud3JpdGVfcmVhZGJhY2sgPSB0cnVlLAogCS5uYW1lID0gInJ0bDg3MjNlX3BjaSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL2Z3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL2Z3LmMKaW5kZXggZDVkYTBmMy4uOGM1YzI3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYmUvZncuYwpAQCAtMTIyLDcgKzEyMiw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgYm94bnVtKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTE5NSw3ICsxOTUsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGNtZF9sZW4pOwogCQkJYnJlYWs7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9ody5jCmluZGV4IDgyZTQ0NzYuLmFiYTYwYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYmUvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL2h3LmMKQEAgLTM0OCw5ICszNDgsMTEgQEAKIAkJKigodTY0ICopKHZhbCkpID0gdHNmOwogCQl9CiAJCWJyZWFrOworCWNhc2UgSEFMX0RFRl9XT1dMQU46CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3MgJXhcbiIsIHZhcmlhYmxlKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHZhcmlhYmxlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtNjA3LDcgKzYwOSw4IEBACiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkJCSBlX2FjaSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTcyMyw4ICs3MjYsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzICV4XG4iLAotCQkJIHZhcmlhYmxlKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHZhcmlhYmxlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMjU2NSw3ICsyNTY3LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGVuY19hbGdvKTsKIAkJCWVuY19hbGdvID0gQ0FNX1RLSVA7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYmUvbGVkLmMKaW5kZXggNDE5NmVmYi4uNDk3OTEzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9sZWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL2xlZC5jCkBAIC01OCw3ICs1OCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IHRydWU7CkBAIC0xMDAsNyArMTAwLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcGxlZC0+bGVkcGluKTsKIAkJYnJlYWs7CiAJfQogCXBsZWQtPmxlZG9uID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9waHkuYwppbmRleCAyODU4MThkLi4zY2MyMjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYmUvcGh5LmMKQEAgLTgzNyw3ICs4MzcsNyBAQAogCQlicmVhazsKIAljYXNlIFJGOTBfUEFUSF9EOgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHJmcGF0aCk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gdHJ1ZTsKQEAgLTE1MDcsNyArMTUwNyw4IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJCSBjdXJyZW50Y21kLT5jbWRpZCk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0yNTE1LDcgKzI1MTYsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgaW90eXBlKTsKIAkJCWJyZWFrOwogCQl9CiAJfSB3aGlsZSAoZmFsc2UpOwpAQCAtMjU1Myw3ICsyNTU0LDggQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJIHJ0bHBoeS0+Y3VycmVudF9pb190eXBlKTsKIAkJYnJlYWs7CiAJfQogCXJ0bHBoeS0+c2V0X2lvX2lucHJvZ3Jlc3MgPSBmYWxzZTsKQEAgLTI3MDUsNyArMjcwNyw3IEBACiAKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHJmcHdyX3N0YXRlKTsKIAkJYnJlc3VsdCA9IGZhbHNlOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL3N3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL3N3LmMKaW5kZXggMjEwMTc5My4uMjBiNTNmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYmUvc3cuYwpAQCAtMjc2LDcgKzI3Niw3IEBACiAJLmFudF9zZWwgPSAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBydGxfaGFsX2NmZyBydGw4NzIzYmVfaGFsX2NmZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsODcyM2JlX2hhbF9jZmcgPSB7CiAJLmJhcl9pZCA9IDIsCiAJLndyaXRlX3JlYWRiYWNrID0gdHJ1ZSwKIAkubmFtZSA9ICJydGw4NzIzYmVfcGNpIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvZncuYwppbmRleCBhNGZjNzBlLi5iNjY1NDQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg4MjFhZS9mdy5jCkBAIC0zOTIsNyArMzkyLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGJveG51bSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC00ODEsNyArNDgxLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGNtZF9sZW4pOwogCQkJYnJlYWs7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg4MjFhZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg4MjFhZS9ody5jCmluZGV4IDBjZGRmMWEuLjEyODFlYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL2h3LmMKQEAgLTQ4MCw3ICs0ODAsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzICV4XG4iLCB2YXJpYWJsZSk7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTY3MSw3ICs2NzEsOCBAQAogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJCQkgZV9hY2kpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC04MDAsNyArODAxLDcgQEAKIAkJYnJlYWs7IH0KIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzICV4XG4iLCB2YXJpYWJsZSk7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTM5MzQsNyArMzkzNSw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBlbmNfYWxnbyk7CiAJCQllbmNfYWxnbyA9IENBTV9US0lQOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvbGVkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL2xlZC5jCmluZGV4IGJhMTk0NmEuLmZjYjNiMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvbGVkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg4MjFhZS9sZWQuYwpAQCAtNjAsNyArNjAsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IHRydWU7CkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL3BoeS5jCmluZGV4IGE3MWJmZTMuLjVkYWQ0MDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvcGh5LmMKQEAgLTIwNjMsMTIgKzIwNjMsOSBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgUkY5MF9QQVRIX0M6Ci0JCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKLQkJYnJlYWs7CiAJY2FzZSBSRjkwX1BBVEhfRDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcmZwYXRoKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiB0cnVlOwpAQCAtMjEzMywxNiArMjEzMCwxMCBAQAogCQlicmVhazsKIAogCWNhc2UgUkY5MF9QQVRIX0I6Ci0JCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKLQkJYnJlYWs7CiAJY2FzZSBSRjkwX1BBVEhfQzoKLQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOwotCQlicmVhazsKIAljYXNlIFJGOTBfUEFUSF9EOgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCByZnBhdGgpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIHRydWU7CkBAIC00NjcwLDcgKzQ2NjEsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGlvdHlwZSk7CiAJCQlicmVhazsKIAkJfQogCX0gd2hpbGUgKGZhbHNlKTsKQEAgLTQ3MTQsNyArNDcwNSw4IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkgcnRscGh5LT5jdXJyZW50X2lvX3R5cGUpOwogCQlicmVhazsKIAl9CiAJcnRscGh5LT5zZXRfaW9faW5wcm9ncmVzcyA9IGZhbHNlOwpAQCAtNDgyMCw3ICs0ODEyLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcmZwd3Jfc3RhdGUpOwogCQlicmVzdWx0ID0gZmFsc2U7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvc3cuYwppbmRleCA0MTU5ZjliLi4yMmY2ODdiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg4MjFhZS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvc3cuYwpAQCAtMzE2LDcgKzMxNiw3IEBACiAJLmRpc2FibGVfd2F0Y2hkb2cgPSAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBydGxfaGFsX2NmZyBydGw4ODIxYWVfaGFsX2NmZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsODgyMWFlX2hhbF9jZmcgPSB7CiAJLmJhcl9pZCA9IDIsCiAJLndyaXRlX3JlYWRiYWNrID0gdHJ1ZSwKIAkubmFtZSA9ICJydGw4ODIxYWVfcGNpIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS91c2IuYwppbmRleCA0MTYxN2I3Li4zMmFhNWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3VzYi5jCkBAIC03MzksMTEgKzczOSw4IEBACiAJZm9yIChpID0gMDsgaSA8IHJ0bHVzYi0+cnhfdXJiX251bTsgaSsrKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdXJiKSB7Ci0JCQlSVF9UUkFDRShydGxwcml2LCBDT01QX1VTQiwgREJHX0VNRVJHLAotCQkJCSAiRmFpbGVkIHRvIGFsbG9jIFVSQiEhXG4iKTsKKwkJaWYgKCF1cmIpCiAJCQlnb3RvIGVycl9vdXQ7Ci0JCX0KIAogCQllcnIgPSBfcnRsX3ByZXBfcnhfdXJiKGh3LCBydGx1c2IsIHVyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChlcnIgPCAwKSB7CkBAIC05MDcsMTUgKzkwNCwxMiBAQAogc3RhdGljIHN0cnVjdCB1cmIgKl9ydGxfdXNiX3R4X3VyYl9zZXR1cChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgZXBfbnVtKQogewotCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKIAlzdHJ1Y3QgcnRsX3VzYiAqcnRsdXNiID0gcnRsX3VzYmRldihydGxfdXNicHJpdihodykpOwogCXN0cnVjdCB1cmIgKl91cmI7CiAKIAlXQVJOX09OKE5VTEwgPT0gc2tiKTsKIAlfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKIAlpZiAoIV91cmIpIHsKLQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9VU0IsIERCR19FTUVSRywKLQkJCSAiQ2FuJ3QgYWxsb2NhdGUgVVJCIGZvciBidWxrIG91dCFcbiIpOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3dpZmkuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS93aWZpLmgKaW5kZXggYzUwODZjMi4uNTk1ZjdkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3dpZmkuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvd2lmaS5oCkBAIC0zOTQsMTEwICszOTQsMTEwIEBACiB9OwogCiBlbnVtIGh3X3ZhcmlhYmxlcyB7Ci0JSFdfVkFSX0VUSEVSX0FERFIsCi0JSFdfVkFSX01VTFRJQ0FTVF9SRUcsCi0JSFdfVkFSX0JBU0lDX1JBVEUsCi0JSFdfVkFSX0JTU0lELAotCUhXX1ZBUl9NRURJQV9TVEFUVVMsCi0JSFdfVkFSX1NFQ1VSSVRZX0NPTkYsCi0JSFdfVkFSX0JFQUNPTl9JTlRFUlZBTCwKLQlIV19WQVJfQVRJTV9XSU5ET1csCi0JSFdfVkFSX0xJU1RFTl9JTlRFUlZBTCwKLQlIV19WQVJfQ1NfQ09VTlRFUiwKLQlIV19WQVJfREVGQVVMVEtFWTAsCi0JSFdfVkFSX0RFRkFVTFRLRVkxLAotCUhXX1ZBUl9ERUZBVUxUS0VZMiwKLQlIV19WQVJfREVGQVVMVEtFWTMsCi0JSFdfVkFSX1NJRlMsCi0JSFdfVkFSX1IyVF9TSUZTLAotCUhXX1ZBUl9ESUZTLAotCUhXX1ZBUl9FSUZTLAotCUhXX1ZBUl9TTE9UX1RJTUUsCi0JSFdfVkFSX0FDS19QUkVBTUJMRSwKLQlIV19WQVJfQ1dfQ09ORklHLAotCUhXX1ZBUl9DV19WQUxVRVMsCi0JSFdfVkFSX1JBVEVfRkFMTEJBQ0tfQ09OVFJPTCwKLQlIV19WQVJfQ09OVEVOVElPTl9XSU5ET1csCi0JSFdfVkFSX1JFVFJZX0NPVU5ULAotCUhXX1ZBUl9UUl9TV0lUQ0gsCi0JSFdfVkFSX0NPTU1BTkQsCi0JSFdfVkFSX1dQQV9DT05GSUcsCi0JSFdfVkFSX0FNUERVX01JTl9TUEFDRSwKLQlIV19WQVJfU0hPUlRHSV9ERU5TSVRZLAotCUhXX1ZBUl9BTVBEVV9GQUNUT1IsCi0JSFdfVkFSX01DU19SQVRFX0FWQUlMQUJMRSwKLQlIV19WQVJfQUNfUEFSQU0sCi0JSFdfVkFSX0FDTV9DVFJMLAotCUhXX1ZBUl9ESVNfUmVxX1FzaXplLAotCUhXX1ZBUl9DQ1hfQ0hOTF9MT0FELAotCUhXX1ZBUl9DQ1hfTk9JU0VfSElTVE9HUkFNLAotCUhXX1ZBUl9DQ1hfQ0xNX05ITSwKLQlIV19WQVJfVHhPUExpbWl0LAotCUhXX1ZBUl9UVVJCT19NT0RFLAotCUhXX1ZBUl9SRl9TVEFURSwKLQlIV19WQVJfUkZfT0ZGX0JZX0hXLAotCUhXX1ZBUl9CVVNfU1BFRUQsCi0JSFdfVkFSX1NFVF9ERVZfUE9XRVIsCisJSFdfVkFSX0VUSEVSX0FERFIgPSAweDAsCisJSFdfVkFSX01VTFRJQ0FTVF9SRUcgPSAweDEsCisJSFdfVkFSX0JBU0lDX1JBVEUgPSAweDIsCisJSFdfVkFSX0JTU0lEID0gMHgzLAorCUhXX1ZBUl9NRURJQV9TVEFUVVM9IDB4NCwKKwlIV19WQVJfU0VDVVJJVFlfQ09ORj0gMHg1LAorCUhXX1ZBUl9CRUFDT05fSU5URVJWQUwgPSAweDYsCisJSFdfVkFSX0FUSU1fV0lORE9XID0gMHg3LAorCUhXX1ZBUl9MSVNURU5fSU5URVJWQUwgPSAweDgsCisJSFdfVkFSX0NTX0NPVU5URVIgPSAweDksCisJSFdfVkFSX0RFRkFVTFRLRVkwID0gMHhhLAorCUhXX1ZBUl9ERUZBVUxUS0VZMSA9IDB4YiwKKwlIV19WQVJfREVGQVVMVEtFWTIgPSAweGMsCisJSFdfVkFSX0RFRkFVTFRLRVkzID0gMHhkLAorCUhXX1ZBUl9TSUZTID0gMHhlLAorCUhXX1ZBUl9SMlRfU0lGUyA9IDB4ZiwKKwlIV19WQVJfRElGUyA9IDB4MTAsCisJSFdfVkFSX0VJRlMgPSAweDExLAorCUhXX1ZBUl9TTE9UX1RJTUUgPSAweDEyLAorCUhXX1ZBUl9BQ0tfUFJFQU1CTEUgPSAweDEzLAorCUhXX1ZBUl9DV19DT05GSUcgPSAweDE0LAorCUhXX1ZBUl9DV19WQUxVRVMgPSAweDE1LAorCUhXX1ZBUl9SQVRFX0ZBTExCQUNLX0NPTlRST0w9IDB4MTYsCisJSFdfVkFSX0NPTlRFTlRJT05fV0lORE9XID0gMHgxNywKKwlIV19WQVJfUkVUUllfQ09VTlQgPSAweDE4LAorCUhXX1ZBUl9UUl9TV0lUQ0ggPSAweDE5LAorCUhXX1ZBUl9DT01NQU5EID0gMHgxYSwKKwlIV19WQVJfV1BBX0NPTkZJRyA9IDB4MWIsCisJSFdfVkFSX0FNUERVX01JTl9TUEFDRSA9IDB4MWMsCisJSFdfVkFSX1NIT1JUR0lfREVOU0lUWSA9IDB4MWQsCisJSFdfVkFSX0FNUERVX0ZBQ1RPUiA9IDB4MWUsCisJSFdfVkFSX01DU19SQVRFX0FWQUlMQUJMRSA9IDB4MWYsCisJSFdfVkFSX0FDX1BBUkFNID0gMHgyMCwKKwlIV19WQVJfQUNNX0NUUkwgPSAweDIxLAorCUhXX1ZBUl9ESVNfUmVxX1FzaXplID0gMHgyMiwKKwlIV19WQVJfQ0NYX0NITkxfTE9BRCA9IDB4MjMsCisJSFdfVkFSX0NDWF9OT0lTRV9ISVNUT0dSQU0gPSAweDI0LAorCUhXX1ZBUl9DQ1hfQ0xNX05ITSA9IDB4MjUsCisJSFdfVkFSX1R4T1BMaW1pdCA9IDB4MjYsCisJSFdfVkFSX1RVUkJPX01PREUgPSAweDI3LAorCUhXX1ZBUl9SRl9TVEFURSA9IDB4MjgsCisJSFdfVkFSX1JGX09GRl9CWV9IVyA9IDB4MjksCisJSFdfVkFSX0JVU19TUEVFRCA9IDB4MmEsCisJSFdfVkFSX1NFVF9ERVZfUE9XRVIgPSAweDJiLAogCi0JSFdfVkFSX1JDUiwKLQlIV19WQVJfUkFUUl8wLAotCUhXX1ZBUl9SUlNSLAotCUhXX1ZBUl9DUFVfUlNULAotCUhXX1ZBUl9DSEVDS19CU1NJRCwKLQlIV19WQVJfTEJLX01PREUsCi0JSFdfVkFSX0FFU18xMU5fRklYLAotCUhXX1ZBUl9VU0JfUlhfQUdHUiwKLQlIV19WQVJfVVNFUl9DT05UUk9MX1RVUkJPX01PREUsCi0JSFdfVkFSX1JFVFJZX0xJTUlULAotCUhXX1ZBUl9JTklUX1RYX1JBVEUsCi0JSFdfVkFSX1RYX1JBVEVfUkVHLAotCUhXX1ZBUl9FRlVTRV9VU0FHRSwKLQlIV19WQVJfRUZVU0VfQllURVMsCi0JSFdfVkFSX0FVVE9MT0FEX1NUQVRVUywKLQlIV19WQVJfUkZfMlJfRElTQUJMRSwKLQlIV19WQVJfU0VUX1JQV00sCi0JSFdfVkFSX0gyQ19GV19QV1JNT0RFLAotCUhXX1ZBUl9IMkNfRldfSk9JTkJTU1JQVCwKLQlIV19WQVJfSDJDX0ZXX01FRElBU1RBVFVTUlBULAotCUhXX1ZBUl9IMkNfRldfUDJQX1BTX09GRkxPQUQsCi0JSFdfVkFSX0ZXX1BTTU9ERV9TVEFUVVMsCi0JSFdfVkFSX0lOSVRfUlRTX1JBVEUsCi0JSFdfVkFSX1JFU1VNRV9DTEtfT04sCi0JSFdfVkFSX0ZXX0xQU19BQ1RJT04sCi0JSFdfVkFSXzFYMV9SRUNWX0NPTUJJTkUsCi0JSFdfVkFSX1NUT1BfU0VORF9CRUFDT04sCi0JSFdfVkFSX1RTRl9USU1FUiwKLQlIV19WQVJfSU9fQ01ELAorCUhXX1ZBUl9SQ1IgPSAweDJjLAorCUhXX1ZBUl9SQVRSXzAgPSAweDJkLAorCUhXX1ZBUl9SUlNSID0gMHgyZSwKKwlIV19WQVJfQ1BVX1JTVCA9IDB4MmYsCisJSFdfVkFSX0NIRUNLX0JTU0lEID0gMHgzMCwKKwlIV19WQVJfTEJLX01PREUgPSAweDMxLAorCUhXX1ZBUl9BRVNfMTFOX0ZJWCA9IDB4MzIsCisJSFdfVkFSX1VTQl9SWF9BR0dSID0gMHgzMywKKwlIV19WQVJfVVNFUl9DT05UUk9MX1RVUkJPX01PREUgPSAweDM0LAorCUhXX1ZBUl9SRVRSWV9MSU1JVCA9IDB4MzUsCisJSFdfVkFSX0lOSVRfVFhfUkFURSA9IDB4MzYsCisJSFdfVkFSX1RYX1JBVEVfUkVHID0gMHgzNywKKwlIV19WQVJfRUZVU0VfVVNBR0UgPSAweDM4LAorCUhXX1ZBUl9FRlVTRV9CWVRFUyA9IDB4MzksCisJSFdfVkFSX0FVVE9MT0FEX1NUQVRVUyA9IDB4M2EsCisJSFdfVkFSX1JGXzJSX0RJU0FCTEUgPSAweDNiLAorCUhXX1ZBUl9TRVRfUlBXTSA9IDB4M2MsCisJSFdfVkFSX0gyQ19GV19QV1JNT0RFID0gMHgzZCwKKwlIV19WQVJfSDJDX0ZXX0pPSU5CU1NSUFQgPSAweDNlLAorCUhXX1ZBUl9IMkNfRldfTUVESUFTVEFUVVNSUFQgPSAweDNmLAorCUhXX1ZBUl9IMkNfRldfUDJQX1BTX09GRkxPQUQgPSAweDQwLAorCUhXX1ZBUl9GV19QU01PREVfU1RBVFVTID0gMHg0MSwKKwlIV19WQVJfSU5JVF9SVFNfUkFURSA9IDB4NDIsCisJSFdfVkFSX1JFU1VNRV9DTEtfT04gPSAweDQzLAorCUhXX1ZBUl9GV19MUFNfQUNUSU9OID0gMHg0NCwKKwlIV19WQVJfMVgxX1JFQ1ZfQ09NQklORSA9IDB4NDUsCisJSFdfVkFSX1NUT1BfU0VORF9CRUFDT04gPSAweDQ2LAorCUhXX1ZBUl9UU0ZfVElNRVIgPSAweDQ3LAorCUhXX1ZBUl9JT19DTUQgPSAweDQ4LAogCi0JSFdfVkFSX1JGX1JFQ09WRVJZLAotCUhXX1ZBUl9IMkNfRldfVVBEQVRFX0dUSywKLQlIV19WQVJfV0ZfTUFTSywKLQlIV19WQVJfV0ZfQ1JDLAotCUhXX1ZBUl9XRl9JU19NQUNfQUREUiwKLQlIV19WQVJfSDJDX0ZXX09GRkxPQUQsCi0JSFdfVkFSX1JFU0VUX1dGQ1JDLAorCUhXX1ZBUl9SRl9SRUNPVkVSWSA9IDB4NDksCisJSFdfVkFSX0gyQ19GV19VUERBVEVfR1RLID0gMHg0YSwKKwlIV19WQVJfV0ZfTUFTSyA9IDB4NGIsCisJSFdfVkFSX1dGX0NSQyA9IDB4NGMsCisJSFdfVkFSX1dGX0lTX01BQ19BRERSID0gMHg0ZCwKKwlIV19WQVJfSDJDX0ZXX09GRkxPQUQgPSAweDRlLAorCUhXX1ZBUl9SRVNFVF9XRkNSQyA9IDB4NGYsCiAKLQlIV19WQVJfSEFORExFX0ZXX0MySCwKLQlIV19WQVJfRExfRldfUlNWRF9QQUdFLAotCUhXX1ZBUl9BSUQsCi0JSFdfVkFSX0hXX1NFUV9FTkFCTEUsCi0JSFdfVkFSX0NPUlJFQ1RfVFNGLAotCUhXX1ZBUl9CQ05fVkFMSUQsCi0JSFdfVkFSX0ZXTFBTX1JGX09OLAotCUhXX1ZBUl9EVUFMX1RTRl9SU1QsCi0JSFdfVkFSX1NXSVRDSF9FUEhZX1dvV0xBTiwKLQlIV19WQVJfSU5UX01JR1JBVElPTiwKLQlIV19WQVJfSU5UX0FDLAotCUhXX1ZBUl9SRl9USU1JTkcsCisJSFdfVkFSX0hBTkRMRV9GV19DMkggPSAweDUwLAorCUhXX1ZBUl9ETF9GV19SU1ZEX1BBR0UgPSAweDUxLAorCUhXX1ZBUl9BSUQgPSAweDUyLAorCUhXX1ZBUl9IV19TRVFfRU5BQkxFID0gMHg1MywKKwlIV19WQVJfQ09SUkVDVF9UU0YgPSAweDU0LAorCUhXX1ZBUl9CQ05fVkFMSUQgPSAweDU1LAorCUhXX1ZBUl9GV0xQU19SRl9PTiA9IDB4NTYsCisJSFdfVkFSX0RVQUxfVFNGX1JTVCA9IDB4NTcsCisJSFdfVkFSX1NXSVRDSF9FUEhZX1dvV0xBTiA9IDB4NTgsCisJSFdfVkFSX0lOVF9NSUdSQVRJT04gPSAweDU5LAorCUhXX1ZBUl9JTlRfQUMgPSAweDVhLAorCUhXX1ZBUl9SRl9USU1JTkcgPSAweDViLAogCi0JSEFMX0RFRl9XT1dMQU4sCi0JSFdfVkFSX01SQywKLQlIV19WQVJfS0VFUF9BTElWRSwKLQlIV19WQVJfTkFWX1VQUEVSLAorCUhBTF9ERUZfV09XTEFOID0gMHg1YywKKwlIV19WQVJfTVJDID0gMHg1ZCwKKwlIV19WQVJfS0VFUF9BTElWRSA9IDB4NWUsCisJSFdfVkFSX05BVl9VUFBFUiA9IDB4NWYsCiAKLQlIV19WQVJfTUdUX0ZJTFRFUiwKLQlIV19WQVJfQ1RSTF9GSUxURVIsCi0JSFdfVkFSX0RBVEFfRklMVEVSLAorCUhXX1ZBUl9NR1RfRklMVEVSID0gMHg2MCwKKwlIV19WQVJfQ1RSTF9GSUxURVIgPSAweDYxLAorCUhXX1ZBUl9EQVRBX0ZJTFRFUiA9IDB4NjIsCiB9OwogCiBlbnVtIHJ0X21lZGlhX3N0YXR1cyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvYWN4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvYWN4LmMKaW5kZXggNGJlMDQwOS4uYjU1MjVhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L2FjeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTh4eC9hY3guYwpAQCAtMzA5LDMgKzMwOSwzMiBAQAogCWtmcmVlKGFjeCk7CiAJcmV0dXJuIHJldDsKIH0KKworaW50IHdsMTh4eF9hY3hfdGltZV9zeW5jX2NmZyhzdHJ1Y3Qgd2wxMjcxICp3bCkKK3sKKwlzdHJ1Y3QgYWN4X3RpbWVfc3luY19jZmcgKmFjeDsKKwlpbnQgcmV0OworCisJd2wxMjcxX2RlYnVnKERFQlVHX0FDWCwgImFjeCB0aW1lIHN5bmMgY2ZnOiBtb2RlICVkLCBhZGRyOiAlcE0iLAorCQkgICAgIHdsLT5jb25mLnNnLnBhcmFtc1tXTDE4WFhfQ09ORl9TR19USU1FX1NZTkNdLAorCQkgICAgIHdsLT56b25lX21hc3Rlcl9tYWNfYWRkcik7CisKKwlhY3ggPSBremFsbG9jKHNpemVvZigqYWN4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhY3gpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJYWN4LT5zeW5jX21vZGUgPSB3bC0+Y29uZi5zZy5wYXJhbXNbV0wxOFhYX0NPTkZfU0dfVElNRV9TWU5DXTsKKwltZW1jcHkoYWN4LT56b25lX21hY19hZGRyLCB3bC0+em9uZV9tYXN0ZXJfbWFjX2FkZHIsIEVUSF9BTEVOKTsKKworCXJldCA9IHdsMTI3MV9jbWRfY29uZmlndXJlKHdsLCBBQ1hfVElNRV9TWU5DX0NGRywKKwkJCQkgICBhY3gsIHNpemVvZigqYWN4KSk7CisJaWYgKHJldCA8IDApIHsKKwkJd2wxMjcxX3dhcm5pbmcoImFjeCB0aW1lIHN5bmMgY2ZnIGZhaWxlZDogJWQiLCByZXQpOworCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJa2ZyZWUoYWN4KTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L2FjeC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L2FjeC5oCmluZGV4IDM0MmEyOTkuLjJlZGJiYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTh4eC9hY3guaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvYWN4LmgKQEAgLTM3LDYgKzM3LDcgQEAKIAlBQ1hfUlhfQkFfRklMVEVSCQkgPSAweDAwNTgsCiAJQUNYX0FQX1NMRUVQX0NGRyAgICAgICAgICAgICAgICAgPSAweDAwNTksCiAJQUNYX0RZTkFNSUNfVFJBQ0VTX0NGRwkJID0gMHgwMDVBLAorCUFDWF9USU1FX1NZTkNfQ0ZHCQkgPSAweDAwNUIsCiB9OwogCiAvKiBudW1iZXJzIG9mIGJpdHMgdGhlIGxlbmd0aCBmaWVsZCB0YWtlcyAoYWRkIDEgZm9yIHRoZSBhY3R1YWwgbnVtYmVyKSAqLwpAQCAtMzg4LDYgKzM4OSwxNyBAQAogCV9fbGUzMiBkeW5hbWljX2Z3X3RyYWNlczsKIH0gX19wYWNrZWQ7CiAKKy8qCisgKiBBQ1hfVElNRV9TWU5DX0NGRworICogY29uZmlndXJlIHRoZSB0aW1lIHN5bmMgcGFyYW1ldGVycworICovCitzdHJ1Y3QgYWN4X3RpbWVfc3luY19jZmcgeworCXN0cnVjdCBhY3hfaGVhZGVyIGhlYWRlcjsKKwl1OCBzeW5jX21vZGU7CisJdTggem9uZV9tYWNfYWRkcltFVEhfQUxFTl07CisJdTggcGFkZGluZ1sxXTsKK30gX19wYWNrZWQ7CisKIGludCB3bDE4eHhfYWN4X2hvc3RfaWZfY2ZnX2JpdG1hcChzdHJ1Y3Qgd2wxMjcxICp3bCwgdTMyIGhvc3RfY2ZnX2JpdG1hcCwKIAkJCQkgIHUzMiBzZGlvX2Jsa19zaXplLCB1MzIgZXh0cmFfbWVtX2Jsa3MsCiAJCQkJICB1MzIgbGVuX2ZpZWxkX3NpemUpOwpAQCAtNDAyLDUgKzQxNCw2IEBACiBpbnQgd2wxOHh4X2FjeF9yeF9iYV9maWx0ZXIoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgYWN0aW9uKTsKIGludCB3bDE4eHhfYWN4X2FwX3NsZWVwKHN0cnVjdCB3bDEyNzEgKndsKTsKIGludCB3bDE4eHhfYWN4X2R5bmFtaWNfZndfdHJhY2VzKHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDE4eHhfYWN4X3RpbWVfc3luY19jZmcoc3RydWN0IHdsMTI3MSAqd2wpOwogCiAjZW5kaWYgLyogX19XTDE4WFhfQUNYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L2V2ZW50LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvZXZlbnQuYwppbmRleCAyYzVkZjQzLi5iMzZjZTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvZXZlbnQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvZXZlbnQuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KICNpbmNsdWRlICJldmVudC5oIgogI2luY2x1ZGUgInNjYW4uaCIKKyNpbmNsdWRlICJjb25mLmgiCiAjaW5jbHVkZSAiLi4vd2xjb3JlL2NtZC5oIgogI2luY2x1ZGUgIi4uL3dsY29yZS9kZWJ1Zy5oIgogI2luY2x1ZGUgIi4uL3dsY29yZS92ZW5kb3JfY21kLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L21haW4uYwppbmRleCAwMGEwNGRmLi4wNmQ2OTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTh4eC9tYWluLmMKQEAgLTEzOTcsMjUgKzEzOTcsMjQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jZGVmaW5lIFdMMThYWF9DT05GX0ZJTEVfTkFNRSAidGktY29ubmVjdGl2aXR5L3dsMTh4eC1jb25mLmJpbiIKLQogc3RhdGljIGludCB3bDE4eHhfbG9hZF9jb25mX2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgd2xjb3JlX2NvbmYgKmNvbmYsCi0JCQkJIHN0cnVjdCB3bDE4eHhfcHJpdl9jb25mICpwcml2X2NvbmYpCisJCQkJIHN0cnVjdCB3bDE4eHhfcHJpdl9jb25mICpwcml2X2NvbmYsCisJCQkJIGNvbnN0IGNoYXIgKmZpbGUpCiB7CiAJc3RydWN0IHdsY29yZV9jb25mX2ZpbGUgKmNvbmZfZmlsZTsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCWludCByZXQ7CiAKLQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgV0wxOFhYX0NPTkZfRklMRV9OQU1FLCBkZXYpOworCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmaWxlLCBkZXYpOwogCWlmIChyZXQgPCAwKSB7CiAJCXdsMTI3MV9lcnJvcigiY291bGQgbm90IGdldCBjb25maWd1cmF0aW9uIGJpbmFyeSAlczogJWQiLAotCQkJICAgICBXTDE4WFhfQ09ORl9GSUxFX05BTUUsIHJldCk7CisJCQkgICAgIGZpbGUsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJaWYgKGZ3LT5zaXplICE9IFdMMThYWF9DT05GX1NJWkUpIHsKLQkJd2wxMjcxX2Vycm9yKCJjb25maWd1cmF0aW9uIGJpbmFyeSBmaWxlIHNpemUgaXMgd3JvbmcsIGV4cGVjdGVkICV6dSBnb3QgJXp1IiwKLQkJCSAgICAgV0wxOFhYX0NPTkZfU0laRSwgZnctPnNpemUpOworCQl3bDEyNzFfZXJyb3IoIiVzIGNvbmZpZ3VyYXRpb24gYmluYXJ5IHNpemUgaXMgd3JvbmcsIGV4cGVjdGVkICV6dSBnb3QgJXp1IiwKKwkJCSAgICAgZmlsZSwgV0wxOFhYX0NPTkZfU0laRSwgZnctPnNpemUpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KQEAgLTE0NDgsOSArMTQ0NywxMiBAQAogCiBzdGF0aWMgaW50IHdsMTh4eF9jb25mX2luaXQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gd2wtPnBkZXY7CisJc3RydWN0IHdsY29yZV9wbGF0ZGV2X2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKIAlzdHJ1Y3Qgd2wxOHh4X3ByaXYgKnByaXYgPSB3bC0+cHJpdjsKIAotCWlmICh3bDE4eHhfbG9hZF9jb25mX2ZpbGUoZGV2LCAmd2wtPmNvbmYsICZwcml2LT5jb25mKSA8IDApIHsKKwlpZiAod2wxOHh4X2xvYWRfY29uZl9maWxlKGRldiwgJndsLT5jb25mLCAmcHJpdi0+Y29uZiwKKwkJCQkgIHBkYXRhLT5mYW1pbHktPmNmZ19uYW1lKSA8IDApIHsKIAkJd2wxMjcxX3dhcm5pbmcoImZhbGxpbmcgYmFjayB0byBkZWZhdWx0IGNvbmZpZyIpOwogCiAJCS8qIGFwcGx5IGRyaXZlciBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KQEAgLTIxNDEsNCArMjE0MywzIEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CiBNT0RVTEVfQVVUSE9SKCJMdWNpYW5vIENvZWxobyA8Y29lbGhvQHRpLmNvbT4iKTsKIE1PRFVMRV9GSVJNV0FSRShXTDE4WFhfRldfTkFNRSk7Ci1NT0RVTEVfRklSTVdBUkUoV0wxOFhYX0NPTkZfRklMRV9OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9ib290LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvYm9vdC5jCmluZGV4IGY3NWQzMDQuLmYwMDUwOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9ib290LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL2Jvb3QuYwpAQCAtMjgyLDYgKzI4Miw5IEBACiAKIGludCB3bGNvcmVfYm9vdF91cGxvYWRfbnZzKHN0cnVjdCB3bDEyNzEgKndsKQogeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB3bC0+cGRldjsKKwlzdHJ1Y3Qgd2xjb3JlX3BsYXRkZXZfZGF0YSAqcGRldl9kYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwljb25zdCBjaGFyICpudnNfbmFtZSA9ICJ1bmtub3duIjsKIAlzaXplX3QgbnZzX2xlbiwgYnVyc3RfbGVuOwogCWludCBpOwogCXUzMiBkZXN0X2FkZHIsIHZhbDsKQEAgLTI5Myw2ICsyOTYsOSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwlpZiAocGRldl9kYXRhICYmIHBkZXZfZGF0YS0+ZmFtaWx5KQorCQludnNfbmFtZSA9IHBkZXZfZGF0YS0+ZmFtaWx5LT5udnNfbmFtZTsKKwogCWlmICh3bC0+cXVpcmtzICYgV0xDT1JFX1FVSVJLX0xFR0FDWV9OVlMpIHsKIAkJc3RydWN0IHdsMTI3MV9udnNfZmlsZSAqbnZzID0KIAkJCShzdHJ1Y3Qgd2wxMjcxX252c19maWxlICopd2wtPm52czsKQEAgLTMxMCw4ICszMTYsOSBAQAogCQlpZiAod2wtPm52c19sZW4gIT0gc2l6ZW9mKHN0cnVjdCB3bDEyNzFfbnZzX2ZpbGUpICYmCiAJCSAgICAod2wtPm52c19sZW4gIT0gV0wxMjcxX0lOSV9MRUdBQ1lfTlZTX0ZJTEVfU0laRSB8fAogCQkgICAgIHdsLT5lbmFibGVfMTFhKSkgewotCQkJd2wxMjcxX2Vycm9yKCJudnMgc2l6ZSBpcyBub3QgYXMgZXhwZWN0ZWQ6ICV6dSAhPSAlenUiLAotCQkJCXdsLT5udnNfbGVuLCBzaXplb2Yoc3RydWN0IHdsMTI3MV9udnNfZmlsZSkpOworCQkJd2wxMjcxX2Vycm9yKCIlcyBzaXplIGlzIG5vdCBhcyBleHBlY3RlZDogJXp1ICE9ICV6dSIsCisJCQkJICAgICBudnNfbmFtZSwgd2wtPm52c19sZW4sCisJCQkJICAgICBzaXplb2Yoc3RydWN0IHdsMTI3MV9udnNfZmlsZSkpOwogCQkJa2ZyZWUod2wtPm52cyk7CiAJCQl3bC0+bnZzID0gTlVMTDsKIAkJCXdsLT5udnNfbGVuID0gMDsKQEAgLTMyOCw4ICszMzUsOCBAQAogCQkJaWYgKG52cy0+Z2VuZXJhbF9wYXJhbXMuZHVhbF9tb2RlX3NlbGVjdCkKIAkJCQl3bC0+ZW5hYmxlXzExYSA9IHRydWU7CiAJCX0gZWxzZSB7Ci0JCQl3bDEyNzFfZXJyb3IoIm52cyBzaXplIGlzIG5vdCBhcyBleHBlY3RlZDogJXp1ICE9ICV6dSIsCi0JCQkJICAgICB3bC0+bnZzX2xlbiwKKwkJCXdsMTI3MV9lcnJvcigiJXMgc2l6ZSBpcyBub3QgYXMgZXhwZWN0ZWQ6ICV6dSAhPSAlenUiLAorCQkJCSAgICAgbnZzX25hbWUsIHdsLT5udnNfbGVuLAogCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCB3bDEyOHhfbnZzX2ZpbGUpKTsKIAkJCWtmcmVlKHdsLT5udnMpOwogCQkJd2wtPm52cyA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL21haW4uYwppbmRleCAxZDY4OTE2Li40NzE1MjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9tYWluLmMKQEAgLTQ5ODYsNyArNDk4Niw2IEBACiAJCXJldHVybiByZXQ7CiAKIAl3bF9zdGEgPSAoc3RydWN0IHdsMTI3MV9zdGF0aW9uICopc3RhLT5kcnZfcHJpdjsKLQl3bF9zdGEtPndsID0gd2w7CiAJaGxpZCA9IHdsX3N0YS0+aGxpZDsKIAogCXJldCA9IHdsMTJ4eF9jbWRfYWRkX3BlZXIod2wsIHdsdmlmLCBzdGEsIGhsaWQpOwpAQCAtNTcwMCwxMCArNTY5OSwxMSBAQAogCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKIH0KIAotc3RhdGljIHUzMiB3bGNvcmVfb3BfZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQoc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3N0YXRpYyB1MzIgd2xjb3JlX29wX2dldF9leHBlY3RlZF90aHJvdWdocHV0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCiB7CiAJc3RydWN0IHdsMTI3MV9zdGF0aW9uICp3bF9zdGEgPSAoc3RydWN0IHdsMTI3MV9zdGF0aW9uICopc3RhLT5kcnZfcHJpdjsKLQlzdHJ1Y3Qgd2wxMjcxICp3bCA9IHdsX3N0YS0+d2w7CisJc3RydWN0IHdsMTI3MSAqd2wgPSBody0+cHJpdjsKIAl1OCBobGlkID0gd2xfc3RhLT5obGlkOwogCiAJLyogcmV0dXJuIGluIHVuaXRzIG9mIEticHMgKi8KQEAgLTY0MTMsOSArNjQxMywxMiBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAkJd2wtPm52c19sZW4gPSBmdy0+c2l6ZTsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAocGRldl9kYXRhLT5mYW1pbHktPm52c19uYW1lKSB7CiAJCXdsMTI3MV9kZWJ1ZyhERUJVR19CT09ULCAiQ291bGQgbm90IGdldCBudnMgZmlsZSAlcyIsCi0JCQkgICAgIFdMMTJYWF9OVlNfTkFNRSk7CisJCQkgICAgIHBkZXZfZGF0YS0+ZmFtaWx5LT5udnNfbmFtZSk7CisJCXdsLT5udnMgPSBOVUxMOworCQl3bC0+bnZzX2xlbiA9IDA7CisJfSBlbHNlIHsKIAkJd2wtPm52cyA9IE5VTEw7CiAJCXdsLT5udnNfbGVuID0gMDsKIAl9CkBAIC02NTEwLDIxICs2NTEzLDI5IEBACiAKIGludCB3bGNvcmVfcHJvYmUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JaW50IHJldDsKKwlzdHJ1Y3Qgd2xjb3JlX3BsYXRkZXZfZGF0YSAqcGRldl9kYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwljb25zdCBjaGFyICpudnNfbmFtZTsKKwlpbnQgcmV0ID0gMDsKIAotCWlmICghd2wtPm9wcyB8fCAhd2wtPnB0YWJsZSkKKwlpZiAoIXdsLT5vcHMgfHwgIXdsLT5wdGFibGUgfHwgIXBkZXZfZGF0YSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl3bC0+ZGV2ID0gJnBkZXYtPmRldjsKIAl3bC0+cGRldiA9IHBkZXY7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgd2wpOwogCi0JcmV0ID0gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsIEZXX0FDVElPTl9IT1RQTFVHLAotCQkJCSAgICAgIFdMMTJYWF9OVlNfTkFNRSwgJnBkZXYtPmRldiwgR0ZQX0tFUk5FTCwKLQkJCQkgICAgICB3bCwgd2xjb3JlX252c19jYik7Ci0JaWYgKHJldCA8IDApIHsKLQkJd2wxMjcxX2Vycm9yKCJyZXF1ZXN0X2Zpcm13YXJlX25vd2FpdCBmYWlsZWQ6ICVkIiwgcmV0KTsKLQkJY29tcGxldGVfYWxsKCZ3bC0+bnZzX2xvYWRpbmdfY29tcGxldGUpOworCWlmIChwZGV2X2RhdGEtPmZhbWlseSAmJiBwZGV2X2RhdGEtPmZhbWlseS0+bnZzX25hbWUpIHsKKwkJbnZzX25hbWUgPSBwZGV2X2RhdGEtPmZhbWlseS0+bnZzX25hbWU7CisJCXJldCA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCBGV19BQ1RJT05fSE9UUExVRywKKwkJCQkJICAgICAgbnZzX25hbWUsICZwZGV2LT5kZXYsIEdGUF9LRVJORUwsCisJCQkJCSAgICAgIHdsLCB3bGNvcmVfbnZzX2NiKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXdsMTI3MV9lcnJvcigicmVxdWVzdF9maXJtd2FyZV9ub3dhaXQgZmFpbGVkIGZvciAlczogJWQiLAorCQkJCSAgICAgbnZzX25hbWUsIHJldCk7CisJCQljb21wbGV0ZV9hbGwoJndsLT5udnNfbG9hZGluZ19jb21wbGV0ZSk7CisJCX0KKwl9IGVsc2UgeworCQl3bGNvcmVfbnZzX2NiKE5VTEwsIHdsKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtNjUzMyw5ICs2NTQ0LDExIEBACiAKIGludCB3bGNvcmVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJc3RydWN0IHdsY29yZV9wbGF0ZGV2X2RhdGEgKnBkZXZfZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CiAJc3RydWN0IHdsMTI3MSAqd2wgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCXdhaXRfZm9yX2NvbXBsZXRpb24oJndsLT5udnNfbG9hZGluZ19jb21wbGV0ZSk7CisJaWYgKHBkZXZfZGF0YS0+ZmFtaWx5ICYmIHBkZXZfZGF0YS0+ZmFtaWx5LT5udnNfbmFtZSkKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmd2wtPm52c19sb2FkaW5nX2NvbXBsZXRlKTsKIAlpZiAoIXdsLT5pbml0aWFsaXplZCkKIAkJcmV0dXJuIDA7CiAKQEAgLTY1NzIsNCArNjU4NSwzIEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJMdWNpYW5vIENvZWxobyA8Y29lbGhvQHRpLmNvbT4iKTsKIE1PRFVMRV9BVVRIT1IoIkp1dXNvIE9pa2FyaW5lbiA8anV1c28ub2lrYXJpbmVuQG5va2lhLmNvbT4iKTsKLU1PRFVMRV9GSVJNV0FSRShXTDEyWFhfTlZTX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3NkaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9zZGlvLmMKaW5kZXggNTgzOWFjYi4uYTZlOTRiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3NkaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvc2Rpby5jCkBAIC0yMTYsMTcgKzIxNiwzMyBAQAogfTsKIAogI2lmZGVmIENPTkZJR19PRgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHdpbGlua19mYW1pbHlfZGF0YSB3bDEyN3hfZGF0YSA9IHsKKwkubmFtZSA9ICJ3bDEyN3giLAorCS5udnNfbmFtZSA9ICJ0aS1jb25uZWN0aXZpdHkvd2wxMjd4LW52cy5iaW4iLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB3aWxpbmtfZmFtaWx5X2RhdGEgd2wxMjh4X2RhdGEgPSB7CisJLm5hbWUgPSAid2wxMjh4IiwKKwkubnZzX25hbWUgPSAidGktY29ubmVjdGl2aXR5L3dsMTI4eC1udnMuYmluIiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2lsaW5rX2ZhbWlseV9kYXRhIHdsMTh4eF9kYXRhID0geworCS5uYW1lID0gIndsMTh4eCIsCisJLmNmZ19uYW1lID0gInRpLWNvbm5lY3Rpdml0eS93bDE4eHgtY29uZi5iaW4iLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd2xjb3JlX3NkaW9fb2ZfbWF0Y2hfdGFibGVbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInRpLHdsMTI3MSIgfSwKLQl7IC5jb21wYXRpYmxlID0gInRpLHdsMTI3MyIgfSwKLQl7IC5jb21wYXRpYmxlID0gInRpLHdsMTI4MSIgfSwKLQl7IC5jb21wYXRpYmxlID0gInRpLHdsMTI4MyIgfSwKLQl7IC5jb21wYXRpYmxlID0gInRpLHdsMTgwMSIgfSwKLQl7IC5jb21wYXRpYmxlID0gInRpLHdsMTgwNSIgfSwKLQl7IC5jb21wYXRpYmxlID0gInRpLHdsMTgwNyIgfSwKLQl7IC5jb21wYXRpYmxlID0gInRpLHdsMTgzMSIgfSwKLQl7IC5jb21wYXRpYmxlID0gInRpLHdsMTgzNSIgfSwKLQl7IC5jb21wYXRpYmxlID0gInRpLHdsMTgzNyIgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHdsMTI3MSIsIC5kYXRhID0gJndsMTI3eF9kYXRhIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDEyNzMiLCAuZGF0YSA9ICZ3bDEyN3hfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksd2wxMjgxIiwgLmRhdGEgPSAmd2wxMjh4X2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHdsMTI4MyIsIC5kYXRhID0gJndsMTI4eF9kYXRhIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDE4MDEiLCAuZGF0YSA9ICZ3bDE4eHhfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksd2wxODA1IiwgLmRhdGEgPSAmd2wxOHh4X2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHdsMTgwNyIsIC5kYXRhID0gJndsMTh4eF9kYXRhIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDE4MzEiLCAuZGF0YSA9ICZ3bDE4eHhfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksd2wxODM1IiwgLmRhdGEgPSAmd2wxOHh4X2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHdsMTgzNyIsIC5kYXRhID0gJndsMTh4eF9kYXRhIH0sCiAJeyB9CiB9OwogCkBAIC0yMzQsOSArMjUwLDEzIEBACiAJCQkgICBzdHJ1Y3Qgd2xjb3JlX3BsYXRkZXZfZGF0YSAqcGRldl9kYXRhKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQ7CiAKLQlpZiAoIW5wIHx8ICFvZl9tYXRjaF9ub2RlKHdsY29yZV9zZGlvX29mX21hdGNoX3RhYmxlLCBucCkpCi0JCXJldHVybiAtRU5PREFUQTsKKwlvZl9pZCA9IG9mX21hdGNoX25vZGUod2xjb3JlX3NkaW9fb2ZfbWF0Y2hfdGFibGUsIG5wKTsKKwlpZiAoIW9mX2lkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBkZXZfZGF0YS0+ZmFtaWx5ID0gb2ZfaWQtPmRhdGE7CiAKIAkqaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwogCWlmICghKmlycSkgewpAQCAtMjYzLDcgKzI4Myw3IEBACiBzdGF0aWMgaW50IHdsMTI3MV9wcm9iZShzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jLAogCQkJCSAgY29uc3Qgc3RydWN0IHNkaW9fZGV2aWNlX2lkICppZCkKIHsKLQlzdHJ1Y3Qgd2xjb3JlX3BsYXRkZXZfZGF0YSBwZGV2X2RhdGE7CisJc3RydWN0IHdsY29yZV9wbGF0ZGV2X2RhdGEgKnBkZXZfZGF0YTsKIAlzdHJ1Y3Qgd2wxMnh4X3NkaW9fZ2x1ZSAqZ2x1ZTsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVzWzFdOwogCW1tY19wbV9mbGFnX3QgbW1jZmxhZ3M7CkBAIC0yNzUsMTQgKzI5NSwxNSBAQAogCWlmIChmdW5jLT5udW0gIT0gMHgwMikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQltZW1zZXQoJnBkZXZfZGF0YSwgMHgwMCwgc2l6ZW9mKHBkZXZfZGF0YSkpOwotCXBkZXZfZGF0YS5pZl9vcHMgPSAmc2Rpb19vcHM7CisJcGRldl9kYXRhID0gZGV2bV9remFsbG9jKCZmdW5jLT5kZXYsIHNpemVvZigqcGRldl9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGV2X2RhdGEpCisJCXJldHVybiAtRU5PTUVNOwogCi0JZ2x1ZSA9IGt6YWxsb2Moc2l6ZW9mKCpnbHVlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFnbHVlKSB7Ci0JCWRldl9lcnIoJmZ1bmMtPmRldiwgImNhbid0IGFsbG9jYXRlIGdsdWVcbiIpOwotCQlnb3RvIG91dDsKLQl9CisJcGRldl9kYXRhLT5pZl9vcHMgPSAmc2Rpb19vcHM7CisKKwlnbHVlID0gZGV2bV9remFsbG9jKCZmdW5jLT5kZXYsIHNpemVvZigqZ2x1ZSksIEdGUF9LRVJORUwpOworCWlmICghZ2x1ZSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlnbHVlLT5kZXYgPSAmZnVuYy0+ZGV2OwogCkBAIC0yOTIsMTYgKzMxMywxNiBAQAogCS8qIFVzZSBibG9jayBtb2RlIGZvciB0cmFuc2ZlcnJpbmcgb3ZlciBvbmUgYmxvY2sgc2l6ZSBvZiBkYXRhICovCiAJZnVuYy0+Y2FyZC0+cXVpcmtzIHw9IE1NQ19RVUlSS19CTEtTWl9GT1JfQllURV9NT0RFOwogCi0JcmV0ID0gd2xjb3JlX3Byb2JlX29mKCZmdW5jLT5kZXYsICZpcnEsICZwZGV2X2RhdGEpOworCXJldCA9IHdsY29yZV9wcm9iZV9vZigmZnVuYy0+ZGV2LCAmaXJxLCBwZGV2X2RhdGEpOwogCWlmIChyZXQpCi0JCWdvdG8gb3V0X2ZyZWVfZ2x1ZTsKKwkJZ290byBvdXQ7CiAKIAkvKiBpZiBzZGlvIGNhbiBrZWVwIHBvd2VyIHdoaWxlIGhvc3QgaXMgc3VzcGVuZGVkLCBlbmFibGUgd293ICovCiAJbW1jZmxhZ3MgPSBzZGlvX2dldF9ob3N0X3BtX2NhcHMoZnVuYyk7CiAJZGV2X2RiZyhnbHVlLT5kZXYsICJzZGlvIFBNIGNhcHMgPSAweCV4XG4iLCBtbWNmbGFncyk7CiAKIAlpZiAobW1jZmxhZ3MgJiBNTUNfUE1fS0VFUF9QT1dFUikKLQkJcGRldl9kYXRhLnB3cl9pbl9zdXNwZW5kID0gdHJ1ZTsKKwkJcGRldl9kYXRhLT5wd3JfaW5fc3VzcGVuZCA9IHRydWU7CiAKIAlzZGlvX3NldF9kcnZkYXRhKGZ1bmMsIGdsdWUpOwogCkBAIC0zMjMsNyArMzQ0LDcgQEAKIAlpZiAoIWdsdWUtPmNvcmUpIHsKIAkJZGV2X2VycihnbHVlLT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBwbGF0Zm9ybV9kZXZpY2UiKTsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXRfZnJlZV9nbHVlOworCQlnb3RvIG91dDsKIAl9CiAKIAlnbHVlLT5jb3JlLT5kZXYucGFyZW50ID0gJmZ1bmMtPmRldjsKQEAgLTM0MSw4ICszNjIsOCBAQAogCQlnb3RvIG91dF9kZXZfcHV0OwogCX0KIAotCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShnbHVlLT5jb3JlLCAmcGRldl9kYXRhLAotCQkJCSAgICAgICBzaXplb2YocGRldl9kYXRhKSk7CisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGdsdWUtPmNvcmUsIHBkZXZfZGF0YSwKKwkJCQkgICAgICAgc2l6ZW9mKCpwZGV2X2RhdGEpKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZ2x1ZS0+ZGV2LCAiY2FuJ3QgYWRkIHBsYXRmb3JtIGRhdGFcbiIpOwogCQlnb3RvIG91dF9kZXZfcHV0OwpAQCAtMzU4LDkgKzM3OSw2IEBACiBvdXRfZGV2X3B1dDoKIAlwbGF0Zm9ybV9kZXZpY2VfcHV0KGdsdWUtPmNvcmUpOwogCi1vdXRfZnJlZV9nbHVlOgotCWtmcmVlKGdsdWUpOwotCiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9zcGkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9zcGkuYwppbmRleCA2ZDI0MDQwLi5mOTQ5YWQyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3NwaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9zcGkuYwpAQCAtNzksMTkgKzc5LDE5IEBACiAjZGVmaW5lIFdTUElfTUFYX05VTV9PRl9DSFVOS1MgXAogCSgoU1BJX0FHR1JfQlVGRkVSX1NJWkUgLyBXU1BJX01BWF9DSFVOS19TSVpFKSArIDEpCiAKLQotc3RydWN0IHdpbGlua19mYW1pbGl5X2RhdGEgewotCWNoYXIgbmFtZVs4XTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2lsaW5rX2ZhbWlseV9kYXRhIHdsMTI3eF9kYXRhID0geworCS5uYW1lID0gIndsMTI3eCIsCisJLm52c19uYW1lID0gInRpLWNvbm5lY3Rpdml0eS93bDEyN3gtbnZzLmJpbiIsCiB9OwogCi1jb25zdCBzdHJ1Y3Qgd2lsaW5rX2ZhbWlsaXlfZGF0YSAqd2lsaW5rX2RhdGE7CitzdGF0aWMgY29uc3Qgc3RydWN0IHdpbGlua19mYW1pbHlfZGF0YSB3bDEyOHhfZGF0YSA9IHsKKwkubmFtZSA9ICJ3bDEyOHgiLAorCS5udnNfbmFtZSA9ICJ0aS1jb25uZWN0aXZpdHkvd2wxMjh4LW52cy5iaW4iLAorfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB3aWxpbmtfZmFtaWxpeV9kYXRhIHdsMTh4eF9kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB3aWxpbmtfZmFtaWx5X2RhdGEgd2wxOHh4X2RhdGEgPSB7CiAJLm5hbWUgPSAid2wxOHh4IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2lsaW5rX2ZhbWlsaXlfZGF0YSB3bDEyeHhfZGF0YSA9IHsKLQkubmFtZSA9ICJ3bDEyeHgiLAorCS5jZmdfbmFtZSA9ICJ0aS1jb25uZWN0aXZpdHkvd2wxOHh4LWNvbmYuYmluIiwKIH07CiAKIHN0cnVjdCB3bDEyeHhfc3BpX2dsdWUgewpAQCAtNDI5LDEwICs0MjksMTAgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdsY29yZV9zcGlfb2ZfbWF0Y2hfdGFibGVbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInRpLHdsMTI3MSIsIC5kYXRhID0gJndsMTJ4eF9kYXRhfSwKLQl7IC5jb21wYXRpYmxlID0gInRpLHdsMTI3MyIsIC5kYXRhID0gJndsMTJ4eF9kYXRhfSwKLQl7IC5jb21wYXRpYmxlID0gInRpLHdsMTI4MSIsIC5kYXRhID0gJndsMTJ4eF9kYXRhfSwKLQl7IC5jb21wYXRpYmxlID0gInRpLHdsMTI4MyIsIC5kYXRhID0gJndsMTJ4eF9kYXRhfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHdsMTI3MSIsIC5kYXRhID0gJndsMTI3eF9kYXRhfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHdsMTI3MyIsIC5kYXRhID0gJndsMTI3eF9kYXRhfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHdsMTI4MSIsIC5kYXRhID0gJndsMTI4eF9kYXRhfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHdsMTI4MyIsIC5kYXRhID0gJndsMTI4eF9kYXRhfSwKIAl7IC5jb21wYXRpYmxlID0gInRpLHdsMTgwMSIsIC5kYXRhID0gJndsMTh4eF9kYXRhfSwKIAl7IC5jb21wYXRpYmxlID0gInRpLHdsMTgwNSIsIC5kYXRhID0gJndsMTh4eF9kYXRhfSwKIAl7IC5jb21wYXRpYmxlID0gInRpLHdsMTgwNyIsIC5kYXRhID0gJndsMTh4eF9kYXRhfSwKQEAgLTQ2MCw5ICs0NjAsOSBAQAogCWlmICghb2ZfaWQpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jd2lsaW5rX2RhdGEgPSBvZl9pZC0+ZGF0YTsKLQlkZXZfaW5mbygmc3BpLT5kZXYsICJzZWxlY3RlZCBjaGlwIGZhbWlsaXkgaXMgJXNcbiIsCi0JCSB3aWxpbmtfZGF0YS0+bmFtZSk7CisJcGRldl9kYXRhLT5mYW1pbHkgPSBvZl9pZC0+ZGF0YTsKKwlkZXZfaW5mbygmc3BpLT5kZXYsICJzZWxlY3RlZCBjaGlwIGZhbWlseSBpcyAlc1xuIiwKKwkJIHBkZXZfZGF0YS0+ZmFtaWx5LT5uYW1lKTsKIAogCWlmIChvZl9maW5kX3Byb3BlcnR5KGR0X25vZGUsICJjbG9jay14dGFsIiwgTlVMTCkpCiAJCXBkZXZfZGF0YS0+cmVmX2Nsb2NrX3h0YWwgPSB0cnVlOwpAQCAtNDc5LDEzICs0NzksMTUgQEAKIHN0YXRpYyBpbnQgd2wxMjcxX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IHdsMTJ4eF9zcGlfZ2x1ZSAqZ2x1ZTsKLQlzdHJ1Y3Qgd2xjb3JlX3BsYXRkZXZfZGF0YSBwZGV2X2RhdGE7CisJc3RydWN0IHdsY29yZV9wbGF0ZGV2X2RhdGEgKnBkZXZfZGF0YTsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVzWzFdOwogCWludCByZXQ7CiAKLQltZW1zZXQoJnBkZXZfZGF0YSwgMHgwMCwgc2l6ZW9mKHBkZXZfZGF0YSkpOworCXBkZXZfZGF0YSA9IGRldm1fa3phbGxvYygmc3BpLT5kZXYsIHNpemVvZigqcGRldl9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGV2X2RhdGEpCisJCXJldHVybiAtRU5PTUVNOwogCi0JcGRldl9kYXRhLmlmX29wcyA9ICZzcGlfb3BzOworCXBkZXZfZGF0YS0+aWZfb3BzID0gJnNwaV9vcHM7CiAKIAlnbHVlID0gZGV2bV9remFsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpnbHVlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFnbHVlKSB7CkBAIC01MDksNyArNTExLDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoZ2x1ZS0+cmVnKTsKIAl9CiAKLQlyZXQgPSB3bGNvcmVfcHJvYmVfb2Yoc3BpLCBnbHVlLCAmcGRldl9kYXRhKTsKKwlyZXQgPSB3bGNvcmVfcHJvYmVfb2Yoc3BpLCBnbHVlLCBwZGV2X2RhdGEpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihnbHVlLT5kZXYsCiAJCQkiY2FuJ3QgZ2V0IGRldmljZSB0cmVlIHBhcmFtZXRlcnMgKCVkKVxuIiwgcmV0KTsKQEAgLTUyMiw3ICs1MjQsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWdsdWUtPmNvcmUgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2Mod2lsaW5rX2RhdGEtPm5hbWUsCisJZ2x1ZS0+Y29yZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhwZGV2X2RhdGEtPmZhbWlseS0+bmFtZSwKIAkJCQkJICAgUExBVEZPUk1fREVWSURfQVVUTyk7CiAJaWYgKCFnbHVlLT5jb3JlKSB7CiAJCWRldl9lcnIoZ2x1ZS0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUgcGxhdGZvcm1fZGV2aWNlXG4iKTsKQEAgLTU0Myw4ICs1NDUsOCBAQAogCQlnb3RvIG91dF9kZXZfcHV0OwogCX0KIAotCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShnbHVlLT5jb3JlLCAmcGRldl9kYXRhLAotCQkJCSAgICAgICBzaXplb2YocGRldl9kYXRhKSk7CisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGdsdWUtPmNvcmUsIHBkZXZfZGF0YSwKKwkJCQkgICAgICAgc2l6ZW9mKCpwZGV2X2RhdGEpKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZ2x1ZS0+ZGV2LCAiY2FuJ3QgYWRkIHBsYXRmb3JtIGRhdGFcbiIpOwogCQlnb3RvIG91dF9kZXZfcHV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3dsY29yZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3dsY29yZS5oCmluZGV4IDhmMjhhYTAuLjE4Mjc1NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS93bGNvcmUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvd2xjb3JlLmgKQEAgLTUwMSw2ICs1MDEsOSBAQAogCiAJLyogZHluYW1pYyBmdyB0cmFjZXMgKi8KIAl1MzIgZHluYW1pY19md190cmFjZXM7CisKKwkvKiB0aW1lIHN5bmMgem9uZSBtYXN0ZXIgKi8KKwl1OCB6b25lX21hc3Rlcl9tYWNfYWRkcltFVEhfQUxFTl07CiB9OwogCiBpbnQgd2xjb3JlX3Byb2JlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS93bGNvcmVfaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3dsY29yZV9pLmgKaW5kZXggMjQyYjRlMy4uZTg0MDk4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3dsY29yZV9pLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3dsY29yZV9pLmgKQEAgLTM1LDEyICszNSwxMSBAQAogI2luY2x1ZGUgImNvbmYuaCIKICNpbmNsdWRlICJpbmkuaCIKIAotLyoKLSAqIHdsMTI3eCBhbmQgd2wxMjh4IGFyZSB1c2luZyB0aGUgc2FtZSBOVlMgZmlsZSBuYW1lLiBIb3dldmVyLCB0aGUKLSAqIGluaSBwYXJhbWV0ZXJzIGJldHdlZW4gdGhlbSBhcmUgZGlmZmVyZW50LiAgVGhlIGRyaXZlciB2YWxpZGF0ZXMKLSAqIHRoZSBjb3JyZWN0IE5WUyBzaXplIGluIHdsMTI3MV9ib290X3VwbG9hZF9udnMoKS4KLSAqLwotI2RlZmluZSBXTDEyWFhfTlZTX05BTUUgInRpLWNvbm5lY3Rpdml0eS93bDEyNzEtbnZzLmJpbiIKK3N0cnVjdCB3aWxpbmtfZmFtaWx5X2RhdGEgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqbnZzX25hbWU7CS8qIHdsMTJ4eCBudnMgZmlsZSAqLworCWNvbnN0IGNoYXIgKmNmZ19uYW1lOwkvKiB3bDE4eHggY2ZnIGZpbGUgKi8KK307CiAKICNkZWZpbmUgV0wxMjcxX1RYX1NFQ1VSSVRZX0xPMTYocykgKCh1MTYpKChzKSAmIDB4ZmZmZikpCiAjZGVmaW5lIFdMMTI3MV9UWF9TRUNVUklUWV9ISTMyKHMpICgodTMyKSgoKHMpID4+IDE2KSAmIDB4ZmZmZmZmZmYpKQpAQCAtMjA4LDYgKzIwNyw3IEBACiAKIHN0cnVjdCB3bGNvcmVfcGxhdGRldl9kYXRhIHsKIAlzdHJ1Y3Qgd2wxMjcxX2lmX29wZXJhdGlvbnMgKmlmX29wczsKKwljb25zdCBzdHJ1Y3Qgd2lsaW5rX2ZhbWlseV9kYXRhICpmYW1pbHk7CiAKIAlib29sIHJlZl9jbG9ja194dGFsOwkvKiBzcGVjaWZ5IHdoZXRoZXIgdGhlIGNsb2NrIGlzIFhUQUwgb3Igbm90ICovCiAJdTMyIHJlZl9jbG9ja19mcmVxOwkvKiBpbiBIZXJ0eiAqLwpAQCAtMzQ3LDcgKzM0Nyw2IEBACiAJICogVXNlZCBpbiBib3RoIEFQIGFuZCBTVEEgbW9kZS4KIAkgKi8KIAl1NjQgdG90YWxfZnJlZWRfcGt0czsKLQlzdHJ1Y3Qgd2wxMjcxICp3bDsKIH07CiAKIHN0cnVjdCB3bDEyeHhfdmlmIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMKaW5kZXggODJkOTRmOC4uOTMyZjNmODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jCkBAIC0xMjU4LDcgKzEyNTgsOSBAQAogewogCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHJjID0gLUVOT0RFVjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKIAl3bDM1MDFfYmxvY2tfaW50ZXJydXB0KHRoaXMpOwogCiAJaWYgKHdsMzUwMV9pbml0X2Zpcm13YXJlKHRoaXMpKSB7CkBAIC0xMjgwLDIwICsxMjgyLDE3IEBACiAJcHJfZGVidWcoIiVzOiBkZXZpY2UgcmVzZXQiLCBkZXYtPm5hbWUpOwogCXJjID0gMDsKIG91dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgdm9pZCB3bDM1MDFfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmRldi0+c3RhdHM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmM7CiAKIAlzdGF0cy0+dHhfZXJyb3JzKys7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKIAlyYyA9IHdsMzUwMV9yZXNldChkZXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKIAlpZiAocmMpCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHJlc2V0dGluZyBjYXJkIG9uIFR4IHRpbWVvdXQhXG4iLAogCQkgICAgICAgZGV2LT5uYW1lLCByYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96eWRhcy96ZDEyMTFydy96ZF91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3p5ZGFzL3pkMTIxMXJ3L3pkX3VzYi5jCmluZGV4IGE5MTJkYzAuLmM1ZWZmZDZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96eWRhcy96ZDEyMTFydy96ZF91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96eWRhcy96ZDEyMTFydy96ZF91c2IuYwpAQCAtMTkzLDcgKzE5Myw3IEBACiAJCQkwLCAwLCBwLCBzaXplb2YocmV0KSwgNTAwMCAvKiBtcyAqLyk7CiAJCWlmIChyICE9IHNpemVvZihyZXQpKSB7CiAJCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsCi0JCQkJImNvbnRyb2wgcmVxdWVzdCBmaXJtZXdhcmUgY29uZmlybWF0aW9uIGZhaWxlZC4iCisJCQkJImNvbnRyb2wgcmVxdWVzdCBmaXJtd2FyZSBjb25maXJtYXRpb24gZmFpbGVkLiIKIAkJCQkiIFJldHVybiB2YWx1ZSAlZFxuIiwgcik7CiAJCQlpZiAociA+PSAwKQogCQkJCXIgPSAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svY29tbW9uLmggYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9jb21tb24uaAppbmRleCA4NGQ2Y2JkLi5iMzhmYjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9jb21tb24uaApAQCAtMjkyLDggKzI5Miw2IEBACiAjZW5kaWYKIAogCXN0cnVjdCB4ZW5fbmV0aWZfY3RybF9iYWNrX3JpbmcgY3RybDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN0cmxfdGFzazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBjdHJsX3dxOwogCXVuc2lnbmVkIGludCBjdHJsX2lycTsKIAogCS8qIE1pc2NlbGxhbmVvdXMgcHJpdmF0ZSBzdHVmZi4gKi8KQEAgLTM1OSw3ICszNTcsNyBAQAogCiBpbnQgeGVudmlmX2RlYWxsb2Nfa3RocmVhZCh2b2lkICpkYXRhKTsKIAotaW50IHhlbnZpZl9jdHJsX2t0aHJlYWQodm9pZCAqZGF0YSk7CitpcnFyZXR1cm5fdCB4ZW52aWZfY3RybF9pcnFfZm4oaW50IGlycSwgdm9pZCAqZGF0YSk7CiAKIHZvaWQgeGVudmlmX3J4X3F1ZXVlX3RhaWwoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUsIHN0cnVjdCBza19idWZmICpza2IpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9oYXNoLmMgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9oYXNoLmMKaW5kZXggZmI4N2NiMy4uNjEzYmFjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaGFzaC5jCisrKyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2hhc2guYwpAQCAtMzIsMTUgKzMyLDYgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogCi1zdGF0aWMgdm9pZCB4ZW52aWZfZGVsX2hhc2goc3RydWN0IHJjdV9oZWFkICpyY3UpCi17Ci0Jc3RydWN0IHhlbnZpZl9oYXNoX2NhY2hlX2VudHJ5ICplbnRyeTsKLQotCWVudHJ5ID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHhlbnZpZl9oYXNoX2NhY2hlX2VudHJ5LCByY3UpOwotCi0Ja2ZyZWUoZW50cnkpOwotfQotCiBzdGF0aWMgdm9pZCB4ZW52aWZfYWRkX2hhc2goc3RydWN0IHhlbnZpZiAqdmlmLCBjb25zdCB1OCAqdGFnLAogCQkJICAgIHVuc2lnbmVkIGludCBsZW4sIHUzMiB2YWwpCiB7CkBAIC03Niw3ICs2Nyw3IEBACiAJCWlmICgrK3ZpZi0+aGFzaC5jYWNoZS5jb3VudCA+IHhlbnZpZl9oYXNoX2NhY2hlX3NpemUpIHsKIAkJCWxpc3RfZGVsX3JjdSgmb2xkZXN0LT5saW5rKTsKIAkJCXZpZi0+aGFzaC5jYWNoZS5jb3VudC0tOwotCQkJY2FsbF9yY3UoJm9sZGVzdC0+cmN1LCB4ZW52aWZfZGVsX2hhc2gpOworCQkJa2ZyZWVfcmN1KG9sZGVzdCwgcmN1KTsKIAkJfQogCX0KIApAQCAtMTE0LDcgKzEwNSw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZW50cnksICZ2aWYtPmhhc2guY2FjaGUubGlzdCwgbGluaykgewogCQlsaXN0X2RlbF9yY3UoJmVudHJ5LT5saW5rKTsKIAkJdmlmLT5oYXNoLmNhY2hlLmNvdW50LS07Ci0JCWNhbGxfcmN1KCZlbnRyeS0+cmN1LCB4ZW52aWZfZGVsX2hhc2gpOworCQlrZnJlZV9yY3UoZW50cnksIHJjdSk7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlmLT5oYXNoLmNhY2hlLmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2ludGVyZmFjZS5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaW50ZXJmYWNlLmMKaW5kZXggODNkZWVlYi4uZmI1MGM2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaW50ZXJmYWNlLmMKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaW50ZXJmYWNlLmMKQEAgLTEyOCwxNSArMTI4LDYgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLWlycXJldHVybl90IHhlbnZpZl9jdHJsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IHhlbnZpZiAqdmlmID0gZGV2X2lkOwotCi0Jd2FrZV91cCgmdmlmLT5jdHJsX3dxKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQogaW50IHhlbnZpZl9xdWV1ZV9zdG9wcGVkKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBxdWV1ZS0+dmlmLT5kZXY7CkBAIC01NzAsOCArNTYxLDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdmlmLT5kZXY7CiAJdm9pZCAqYWRkcjsKIAlzdHJ1Y3QgeGVuX25ldGlmX2N0cmxfc3JpbmcgKnNoYXJlZDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7Ci0JaW50IGVyciA9IC1FTk9NRU07CisJaW50IGVycjsKIAogCWVyciA9IHhlbmJ1c19tYXBfcmluZ192YWxsb2MoeGVudmlmX3RvX3hlbmJ1c19kZXZpY2UodmlmKSwKIAkJCQkgICAgICZyaW5nX3JlZiwgMSwgJmFkZHIpOwpAQCAtNTgxLDExICs1NzEsNyBAQAogCXNoYXJlZCA9IChzdHJ1Y3QgeGVuX25ldGlmX2N0cmxfc3JpbmcgKilhZGRyOwogCUJBQ0tfUklOR19JTklUKCZ2aWYtPmN0cmwsIHNoYXJlZCwgWEVOX1BBR0VfU0laRSk7CiAKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2aWYtPmN0cmxfd3EpOwotCi0JZXJyID0gYmluZF9pbnRlcmRvbWFpbl9ldnRjaG5fdG9faXJxaGFuZGxlcih2aWYtPmRvbWlkLCBldnRjaG4sCi0JCQkJCQkgICAgeGVudmlmX2N0cmxfaW50ZXJydXB0LAotCQkJCQkJICAgIDAsIGRldi0+bmFtZSwgdmlmKTsKKwllcnIgPSBiaW5kX2ludGVyZG9tYWluX2V2dGNobl90b19pcnEodmlmLT5kb21pZCwgZXZ0Y2huKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJfdW5tYXA7CiAKQEAgLTU5MywxOSArNTc5LDEzIEBACiAKIAl4ZW52aWZfaW5pdF9oYXNoKHZpZik7CiAKLQl0YXNrID0ga3RocmVhZF9jcmVhdGUoeGVudmlmX2N0cmxfa3RocmVhZCwgKHZvaWQgKil2aWYsCi0JCQkgICAgICAiJXMtY29udHJvbCIsIGRldi0+bmFtZSk7Ci0JaWYgKElTX0VSUih0YXNrKSkgewotCQlwcl93YXJuKCJDb3VsZCBub3QgYWxsb2NhdGUga3RocmVhZCBmb3IgJXNcbiIsIGRldi0+bmFtZSk7Ci0JCWVyciA9IFBUUl9FUlIodGFzayk7CisJZXJyID0gcmVxdWVzdF90aHJlYWRlZF9pcnEodmlmLT5jdHJsX2lycSwgTlVMTCwgeGVudmlmX2N0cmxfaXJxX2ZuLAorCQkJCSAgIElSUUZfT05FU0hPVCwgInhlbi1uZXRiYWNrLWN0cmwiLCB2aWYpOworCWlmIChlcnIpIHsKKwkJcHJfd2FybigiQ291bGQgbm90IHNldHVwIGlycSBoYW5kbGVyIGZvciAlc1xuIiwgZGV2LT5uYW1lKTsKIAkJZ290byBlcnJfZGVpbml0OwogCX0KIAotCWdldF90YXNrX3N0cnVjdCh0YXNrKTsKLQl2aWYtPmN0cmxfdGFzayA9IHRhc2s7Ci0KLQl3YWtlX3VwX3Byb2Nlc3ModmlmLT5jdHJsX3Rhc2spOwotCiAJcmV0dXJuIDA7CiAKIGVycl9kZWluaXQ6CkBAIC03NzQsMTIgKzc1NCw2IEBACiAKIHZvaWQgeGVudmlmX2Rpc2Nvbm5lY3RfY3RybChzdHJ1Y3QgeGVudmlmICp2aWYpCiB7Ci0JaWYgKHZpZi0+Y3RybF90YXNrKSB7Ci0JCWt0aHJlYWRfc3RvcCh2aWYtPmN0cmxfdGFzayk7Ci0JCXB1dF90YXNrX3N0cnVjdCh2aWYtPmN0cmxfdGFzayk7Ci0JCXZpZi0+Y3RybF90YXNrID0gTlVMTDsKLQl9Ci0KIAlpZiAodmlmLT5jdHJsX2lycSkgewogCQl4ZW52aWZfZGVpbml0X2hhc2godmlmKTsKIAkJdW5iaW5kX2Zyb21faXJxaGFuZGxlcih2aWYtPmN0cmxfaXJxLCB2aWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jCmluZGV4IGVkYmFlMGIuLjNkMGM5ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL25ldGJhY2suYworKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9uZXRiYWNrLmMKQEAgLTIzNTksMjQgKzIzNTksMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHhlbnZpZl9jdHJsX2t0aHJlYWQodm9pZCAqZGF0YSkKK2lycXJldHVybl90IHhlbnZpZl9jdHJsX2lycV9mbihpbnQgaXJxLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCB4ZW52aWYgKnZpZiA9IGRhdGE7CiAKLQlmb3IgKDs7KSB7Ci0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh2aWYtPmN0cmxfd3EsCi0JCQkJCSB4ZW52aWZfY3RybF93b3JrX3RvZG8odmlmKSB8fAotCQkJCQkga3RocmVhZF9zaG91bGRfc3RvcCgpKTsKLQkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKLQkJCWJyZWFrOworCXdoaWxlICh4ZW52aWZfY3RybF93b3JrX3RvZG8odmlmKSkKKwkJeGVudmlmX2N0cmxfYWN0aW9uKHZpZik7CiAKLQkJd2hpbGUgKHhlbnZpZl9jdHJsX3dvcmtfdG9kbyh2aWYpKQotCQkJeGVudmlmX2N0cmxfYWN0aW9uKHZpZik7Ci0KLQkJY29uZF9yZXNjaGVkKCk7Ci0JfQotCi0JcmV0dXJuIDA7CisJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBuZXRiYWNrX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL3hlbmJ1cy5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2sveGVuYnVzLmMKaW5kZXggNmEzMWYyNi4uZGFmNGM3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2sveGVuYnVzLmMKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2sveGVuYnVzLmMKQEAgLTI3MSw2ICsyNzEsMTEgQEAKIAliZS0+ZGV2ID0gZGV2OwogCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIGJlKTsKIAorCWJlLT5zdGF0ZSA9IFhlbmJ1c1N0YXRlSW5pdGlhbGlzaW5nOworCWVyciA9IHhlbmJ1c19zd2l0Y2hfc3RhdGUoZGV2LCBYZW5idXNTdGF0ZUluaXRpYWxpc2luZyk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCiAJc2cgPSAxOwogCiAJZG8gewpAQCAtMzgzLDExICszODgsNiBAQAogCiAJYmUtPmhvdHBsdWdfc2NyaXB0ID0gc2NyaXB0OwogCi0JZXJyID0geGVuYnVzX3N3aXRjaF9zdGF0ZShkZXYsIFhlbmJ1c1N0YXRlSW5pdFdhaXQpOwotCWlmIChlcnIpCi0JCWdvdG8gZmFpbDsKLQotCWJlLT5zdGF0ZSA9IFhlbmJ1c1N0YXRlSW5pdFdhaXQ7CiAKIAkvKiBUaGlzIGtpY2tzIGhvdHBsdWcgc2NyaXB0cywgc28gZG8gaXQgaW1tZWRpYXRlbHkuICovCiAJZXJyID0gYmFja2VuZF9jcmVhdGVfeGVudmlmKGJlKTsKQEAgLTQ5MiwyMCArNDkyLDIwIEBACiAKIC8qIEhhbmRsZSBiYWNrZW5kIHN0YXRlIHRyYW5zaXRpb25zOgogICoKLSAqIFRoZSBiYWNrZW5kIHN0YXRlIHN0YXJ0cyBpbiBJbml0V2FpdCBhbmQgdGhlIGZvbGxvd2luZyB0cmFuc2l0aW9ucyBhcmUKKyAqIFRoZSBiYWNrZW5kIHN0YXRlIHN0YXJ0cyBpbiBJbml0aWFsaXNpbmcgYW5kIHRoZSBmb2xsb3dpbmcgdHJhbnNpdGlvbnMgYXJlCiAgKiBhbGxvd2VkLgogICoKLSAqIEluaXRXYWl0IC0+IENvbm5lY3RlZAorICogSW5pdGlhbGlzaW5nIC0+IEluaXRXYWl0IC0+IENvbm5lY3RlZAorICogICAgICAgICAgXAorICogICAgICAgICAgIFwgICAgICAgIF4gICAgXCAgICAgICAgIHwKKyAqICAgICAgICAgICAgXCAgICAgICB8ICAgICBcICAgICAgICB8CisgKiAgICAgICAgICAgICBcICAgICAgfCAgICAgIFwgICAgICAgfAorICogICAgICAgICAgICAgIFwgICAgIHwgICAgICAgXCAgICAgIHwKKyAqICAgICAgICAgICAgICAgXCAgICB8ICAgICAgICBcICAgICB8CisgKiAgICAgICAgICAgICAgICBcICAgfCAgICAgICAgIFwgICAgfAorICogICAgICAgICAgICAgICAgIFYgIHwgICAgICAgICAgViAgIFYKICAqCi0gKiAgICBeICAgIFwgICAgICAgICB8Ci0gKiAgICB8ICAgICBcICAgICAgICB8Ci0gKiAgICB8ICAgICAgXCAgICAgICB8Ci0gKiAgICB8ICAgICAgIFwgICAgICB8Ci0gKiAgICB8ICAgICAgICBcICAgICB8Ci0gKiAgICB8ICAgICAgICAgXCAgICB8Ci0gKiAgICB8ICAgICAgICAgIFYgICBWCi0gKgotICogIENsb3NlZCAgPC0+IENsb3NpbmcKKyAqICAgICAgICAgICAgICAgICAgQ2xvc2VkICA8LT4gQ2xvc2luZwogICoKICAqIFRoZSBzdGF0ZSBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGV2ZW50dWFsIHN0YXRlIG9mIHRoZSBiYWNrZW5kIGFuZCB0aGUKICAqIGZ1bmN0aW9uIHRyYW5zaXRpb25zIHRvIHRoYXQgc3RhdGUgdmlhIHRoZSBzaG9ydGVzdCBwYXRoLgpAQCAtNTE1LDYgKzUxNSwyMCBAQAogewogCXdoaWxlIChiZS0+c3RhdGUgIT0gc3RhdGUpIHsKIAkJc3dpdGNoIChiZS0+c3RhdGUpIHsKKwkJY2FzZSBYZW5idXNTdGF0ZUluaXRpYWxpc2luZzoKKwkJCXN3aXRjaCAoc3RhdGUpIHsKKwkJCWNhc2UgWGVuYnVzU3RhdGVJbml0V2FpdDoKKwkJCWNhc2UgWGVuYnVzU3RhdGVDb25uZWN0ZWQ6CisJCQljYXNlIFhlbmJ1c1N0YXRlQ2xvc2luZzoKKwkJCQliYWNrZW5kX3N3aXRjaF9zdGF0ZShiZSwgWGVuYnVzU3RhdGVJbml0V2FpdCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFhlbmJ1c1N0YXRlQ2xvc2VkOgorCQkJCWJhY2tlbmRfc3dpdGNoX3N0YXRlKGJlLCBYZW5idXNTdGF0ZUNsb3NlZCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUJVRygpOworCQkJfQorCQkJYnJlYWs7CiAJCWNhc2UgWGVuYnVzU3RhdGVDbG9zZWQ6CiAJCQlzd2l0Y2ggKHN0YXRlKSB7CiAJCQljYXNlIFhlbmJ1c1N0YXRlSW5pdFdhaXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCmluZGV4IDk2Y2NkNGUuLmUxNzg3OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCisrKyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCkBAIC01NjUsNiArNTY1LDcgQEAKIAlzdHJ1Y3QgbmV0ZnJvbnRfcXVldWUgKnF1ZXVlID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgbnVtX3F1ZXVlcyA9IGRldi0+cmVhbF9udW1fdHhfcXVldWVzOwogCXUxNiBxdWV1ZV9pbmRleDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKIAogCS8qIERyb3AgdGhlIHBhY2tldCBpZiBubyBxdWV1ZXMgYXJlIHNldCB1cCAqLwogCWlmIChudW1fcXVldWVzIDwgMSkKQEAgLTU5Myw2ICs1OTQsMjAgQEAKIAogCXBhZ2UgPSB2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhKTsKIAlvZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShza2ItPmRhdGEpOworCisJLyogVGhlIGZpcnN0IHJlcSBzaG91bGQgYmUgYXQgbGVhc3QgRVRIX0hMRU4gc2l6ZSBvciB0aGUgcGFja2V0IHdpbGwgYmUKKwkgKiBkcm9wcGVkIGJ5IG5ldGJhY2suCisJICovCisJaWYgKHVubGlrZWx5KFBBR0VfU0laRSAtIG9mZnNldCA8IEVUSF9ITEVOKSkgeworCQluc2tiID0gc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFuc2tiKQorCQkJZ290byBkcm9wOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlza2IgPSBuc2tiOworCQlwYWdlID0gdmlydF90b19wYWdlKHNrYi0+ZGF0YSk7CisJCW9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHNrYi0+ZGF0YSk7CisJfQorCiAJbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+dHhfbG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9udmRpbW0vYnVzLmMgYi9kcml2ZXJzL252ZGltbS9idXMuYwppbmRleCA0NThkYWY5Li45MzU4NjZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL252ZGltbS9idXMuYworKysgYi9kcml2ZXJzL252ZGltbS9idXMuYwpAQCAtMTg1LDggKzE4NSwxMiBAQAogCQlyZXR1cm4gLUVOWElPOwogCiAJbmRfZGVzYyA9IG52ZGltbV9idXMtPm5kX2Rlc2M7CisJLyoKKwkgKiBpZiBuZGN0bCBkb2VzIG5vdCBleGlzdCwgaXQncyBQTUVNX0xFR0FDWSBhbmQKKwkgKiB3ZSB3YW50IHRvIGp1c3QgcHJldGVuZCBldmVyeXRoaW5nIGlzIGhhbmRsZWQuCisJICovCiAJaWYgKCFuZF9kZXNjLT5uZGN0bCkKLQkJcmV0dXJuIC1FTlhJTzsKKwkJcmV0dXJuIGxlbjsKIAogCW1lbXNldCgmYXJzX2NhcCwgMCwgc2l6ZW9mKGFyc19jYXApKTsKIAlhcnNfY2FwLmFkZHJlc3MgPSBwaHlzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9udmRpbW0vY29yZS5jIGIvZHJpdmVycy9udmRpbW0vY29yZS5jCmluZGV4IDcxNTU4M2YuLjRkN2JiZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZkaW1tL2NvcmUuYworKysgYi9kcml2ZXJzL252ZGltbS9jb3JlLmMKQEAgLTk5LDggKzk5LDExIEBACiAJbnZkaW1tX21hcC0+c2l6ZSA9IHNpemU7CiAJa3JlZl9pbml0KCZudmRpbW1fbWFwLT5rcmVmKTsKIAotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG9mZnNldCwgc2l6ZSwgZGV2X25hbWUoJm52ZGltbV9idXMtPmRldikpKQorCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG9mZnNldCwgc2l6ZSwgZGV2X25hbWUoJm52ZGltbV9idXMtPmRldikpKSB7CisJCWRldl9lcnIoJm52ZGltbV9idXMtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0ICVwYSArICV6ZCBmb3IgJXNcbiIsCisJCQkJJm9mZnNldCwgc2l6ZSwgZGV2X25hbWUoZGV2KSk7CiAJCWdvdG8gZXJyX3JlcXVlc3RfcmVnaW9uOworCX0KIAogCWlmIChmbGFncykKIAkJbnZkaW1tX21hcC0+bWVtID0gbWVtcmVtYXAob2Zmc2V0LCBzaXplLCBmbGFncyk7CkBAIC0xNzEsNiArMTc0LDkgQEAKIAkJa3JlZl9nZXQoJm52ZGltbV9tYXAtPmtyZWYpOwogCW52ZGltbV9idXNfdW5sb2NrKGRldik7CiAKKwlpZiAoIW52ZGltbV9tYXApCisJCXJldHVybiBOVUxMOworCiAJaWYgKGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldChkZXYsIG52ZGltbV9tYXBfcHV0LCBudmRpbW1fbWFwKSkKIAkJcmV0dXJuIE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZkaW1tL25kLmggYi9kcml2ZXJzL252ZGltbS9uZC5oCmluZGV4IDgwMjRhMGUuLjBiNzhhODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZkaW1tL25kLmgKKysrIGIvZHJpdmVycy9udmRpbW0vbmQuaApAQCAtNTIsMTAgKzUyLDI4IEBACiBzdHJ1Y3QgbmRfcmVnaW9uX2RhdGEgewogCWludCBuc19jb3VudDsKIAlpbnQgbnNfYWN0aXZlOwotCXVuc2lnbmVkIGludCBmbHVzaF9tYXNrOwotCXZvaWQgX19pb21lbSAqZmx1c2hfd3BxWzBdWzBdOworCXVuc2lnbmVkIGludCBoaW50c19zaGlmdDsKKwl2b2lkIF9faW9tZW0gKmZsdXNoX3dwcVswXTsKIH07CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpuZHJkX2dldF9mbHVzaF93cHEoc3RydWN0IG5kX3JlZ2lvbl9kYXRhICpuZHJkLAorCQlpbnQgZGltbSwgaW50IGhpbnQpCit7CisJdW5zaWduZWQgaW50IG51bSA9IDEgPDwgbmRyZC0+aGludHNfc2hpZnQ7CisJdW5zaWduZWQgaW50IG1hc2sgPSBudW0gLSAxOworCisJcmV0dXJuIG5kcmQtPmZsdXNoX3dwcVtkaW1tICogbnVtICsgKGhpbnQgJiBtYXNrKV07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZHJkX3NldF9mbHVzaF93cHEoc3RydWN0IG5kX3JlZ2lvbl9kYXRhICpuZHJkLCBpbnQgZGltbSwKKwkJaW50IGhpbnQsIHZvaWQgX19pb21lbSAqZmx1c2gpCit7CisJdW5zaWduZWQgaW50IG51bSA9IDEgPDwgbmRyZC0+aGludHNfc2hpZnQ7CisJdW5zaWduZWQgaW50IG1hc2sgPSBudW0gLSAxOworCisJbmRyZC0+Zmx1c2hfd3BxW2RpbW0gKiBudW0gKyAoaGludCAmIG1hc2spXSA9IGZsdXNoOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZF9uYW1lc3BhY2VfaW5kZXggKnRvX25hbWVzcGFjZV9pbmRleCgKIAkJc3RydWN0IG52ZGltbV9kcnZkYXRhICpuZGQsIGludCBpKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9udmRpbW0vcmVnaW9uX2RldnMuYyBiL2RyaXZlcnMvbnZkaW1tL3JlZ2lvbl9kZXZzLmMKaW5kZXggZThkNWJhNy4uNGMwYWM0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9udmRpbW0vcmVnaW9uX2RldnMuYworKysgYi9kcml2ZXJzL252ZGltbS9yZWdpb25fZGV2cy5jCkBAIC0zOCw3ICszOCw3IEBACiAKIAlkZXZfZGJnKGRldiwgIiVzOiBtYXAgJWQgZmx1c2ggYWRkcmVzcyVzXG4iLCBudmRpbW1fbmFtZShudmRpbW0pLAogCQkJbnZkaW1tLT5udW1fZmx1c2gsIG52ZGltbS0+bnVtX2ZsdXNoID09IDEgPyAiIiA6ICJlcyIpOwotCWZvciAoaSA9IDA7IGkgPCBudmRpbW0tPm51bV9mbHVzaDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8ICgxIDw8IG5kcmQtPmhpbnRzX3NoaWZ0KTsgaSsrKSB7CiAJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJm52ZGltbS0+Zmx1c2hfd3BxW2ldOwogCQl1bnNpZ25lZCBsb25nIHBmbiA9IFBIWVNfUEZOKHJlcy0+c3RhcnQpOwogCQl2b2lkIF9faW9tZW0gKmZsdXNoX3BhZ2U7CkBAIC01NCwxNCArNTQsMTUgQEAKIAogCQlpZiAoaiA8IGkpCiAJCQlmbHVzaF9wYWdlID0gKHZvaWQgX19pb21lbSAqKSAoKHVuc2lnbmVkIGxvbmcpCi0JCQkJCW5kcmQtPmZsdXNoX3dwcVtkaW1tXVtqXSAmIFBBR0VfTUFTSyk7CisJCQkJCW5kcmRfZ2V0X2ZsdXNoX3dwcShuZHJkLCBkaW1tLCBqKQorCQkJCQkmIFBBR0VfTUFTSyk7CiAJCWVsc2UKIAkJCWZsdXNoX3BhZ2UgPSBkZXZtX252ZGltbV9pb3JlbWFwKGRldiwKLQkJCQkJUEhZU19QRk4ocGZuKSwgUEFHRV9TSVpFKTsKKwkJCQkJUEZOX1BIWVMocGZuKSwgUEFHRV9TSVpFKTsKIAkJaWYgKCFmbHVzaF9wYWdlKQogCQkJcmV0dXJuIC1FTlhJTzsKLQkJbmRyZC0+Zmx1c2hfd3BxW2RpbW1dW2ldID0gZmx1c2hfcGFnZQotCQkJKyAocmVzLT5zdGFydCAmIH5QQUdFX01BU0spOworCQluZHJkX3NldF9mbHVzaF93cHEobmRyZCwgZGltbSwgaSwgZmx1c2hfcGFnZQorCQkJCSsgKHJlcy0+c3RhcnQgJiB+UEFHRV9NQVNLKSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC05Myw3ICs5NCwxMCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBuZHJkKTsKIAotCW5kcmQtPmZsdXNoX21hc2sgPSAoMSA8PCBpbG9nMihudW1fZmx1c2gpKSAtIDE7CisJaWYgKCFudW1fZmx1c2gpCisJCXJldHVybiAwOworCisJbmRyZC0+aGludHNfc2hpZnQgPSBpbG9nMihudW1fZmx1c2gpOwogCWZvciAoaSA9IDA7IGkgPCBuZF9yZWdpb24tPm5kcl9tYXBwaW5nczsgaSsrKSB7CiAJCXN0cnVjdCBuZF9tYXBwaW5nICpuZF9tYXBwaW5nID0gJm5kX3JlZ2lvbi0+bWFwcGluZ1tpXTsKIAkJc3RydWN0IG52ZGltbSAqbnZkaW1tID0gbmRfbWFwcGluZy0+bnZkaW1tOwpAQCAtOTAwLDggKzkwNCw4IEBACiAJICovCiAJd21iKCk7CiAJZm9yIChpID0gMDsgaSA8IG5kX3JlZ2lvbi0+bmRyX21hcHBpbmdzOyBpKyspCi0JCWlmIChuZHJkLT5mbHVzaF93cHFbaV1bMF0pCi0JCQl3cml0ZXEoMSwgbmRyZC0+Zmx1c2hfd3BxW2ldW2lkeCAmIG5kcmQtPmZsdXNoX21hc2tdKTsKKwkJaWYgKG5kcmRfZ2V0X2ZsdXNoX3dwcShuZHJkLCBpLCAwKSkKKwkJCXdyaXRlcSgxLCBuZHJkX2dldF9mbHVzaF93cHEobmRyZCwgaSwgaWR4KSk7CiAJd21iKCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChudmRpbW1fZmx1c2gpOwpAQCAtOTI1LDcgKzkyOSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgbmRfcmVnaW9uLT5uZHJfbWFwcGluZ3M7IGkrKykKIAkJLyogZmx1c2ggaGludHMgcHJlc2VudCwgZmx1c2hpbmcgcmVxdWlyZWQgKi8KLQkJaWYgKG5kcmQtPmZsdXNoX3dwcVtpXVswXSkKKwkJaWYgKG5kcmRfZ2V0X2ZsdXNoX3dwcShuZHJkLCBpLCAwKSkKIAkJCXJldHVybiAxOwogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZtZS9ob3N0L0tjb25maWcgYi9kcml2ZXJzL252bWUvaG9zdC9LY29uZmlnCmluZGV4IGRiMzlkNTMuLmY3ZDM3YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZtZS9ob3N0L0tjb25maWcKKysrIGIvZHJpdmVycy9udm1lL2hvc3QvS2NvbmZpZwpAQCAtMzAsOCArMzAsOCBAQAogCiBjb25maWcgTlZNRV9SRE1BCiAJdHJpc3RhdGUgIk5WTSBFeHByZXNzIG92ZXIgRmFicmljcyBSRE1BIGhvc3QgZHJpdmVyIgotCWRlcGVuZHMgb24gSU5GSU5JQkFORAotCWRlcGVuZHMgb24gQkxLX0RFVl9OVk1FCisJZGVwZW5kcyBvbiBJTkZJTklCQU5EICYmIEJMT0NLCisJc2VsZWN0IE5WTUVfQ09SRQogCXNlbGVjdCBOVk1FX0ZBQlJJQ1MKIAlzZWxlY3QgU0dfUE9PTAogCWhlbHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZtZS9ob3N0L2NvcmUuYyBiL2RyaXZlcnMvbnZtZS9ob3N0L2NvcmUuYwppbmRleCA3ZmYyZTgyLi4yZmVhY2M3IDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUvaG9zdC9jb3JlLmMKKysrIGIvZHJpdmVycy9udm1lL2hvc3QvY29yZS5jCkBAIC04MSwxMCArODEsMTIgQEAKIGJvb2wgbnZtZV9jaGFuZ2VfY3RybF9zdGF0ZShzdHJ1Y3QgbnZtZV9jdHJsICpjdHJsLAogCQllbnVtIG52bWVfY3RybF9zdGF0ZSBuZXdfc3RhdGUpCiB7Ci0JZW51bSBudm1lX2N0cmxfc3RhdGUgb2xkX3N0YXRlID0gY3RybC0+c3RhdGU7CisJZW51bSBudm1lX2N0cmxfc3RhdGUgb2xkX3N0YXRlOwogCWJvb2wgY2hhbmdlZCA9IGZhbHNlOwogCiAJc3Bpbl9sb2NrX2lycSgmY3RybC0+bG9jayk7CisKKwlvbGRfc3RhdGUgPSBjdHJsLT5zdGF0ZTsKIAlzd2l0Y2ggKG5ld19zdGF0ZSkgewogCWNhc2UgTlZNRV9DVFJMX0xJVkU6CiAJCXN3aXRjaCAob2xkX3N0YXRlKSB7CkBAIC0xNDAsMTEgKzE0MiwxMiBAQAogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KLQlzcGluX3VubG9ja19pcnEoJmN0cmwtPmxvY2spOwogCiAJaWYgKGNoYW5nZWQpCiAJCWN0cmwtPnN0YXRlID0gbmV3X3N0YXRlOwogCisJc3Bpbl91bmxvY2tfaXJxKCZjdHJsLT5sb2NrKTsKKwogCXJldHVybiBjaGFuZ2VkOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobnZtZV9jaGFuZ2VfY3RybF9zdGF0ZSk7CkBAIC02MDgsNyArNjExLDcgQEAKIAogCXJldCA9IF9fbnZtZV9zdWJtaXRfc3luY19jbWQoZGV2LT5hZG1pbl9xLCAmYywgJmNxZSwgTlVMTCwgMCwgMCwKIAkJCU5WTUVfUUlEX0FOWSwgMCwgMCk7Ci0JaWYgKHJldCA+PSAwKQorCWlmIChyZXQgPj0gMCAmJiByZXN1bHQpCiAJCSpyZXN1bHQgPSBsZTMyX3RvX2NwdShjcWUucmVzdWx0KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjI4LDcgKzYzMSw3IEBACiAKIAlyZXQgPSBfX252bWVfc3VibWl0X3N5bmNfY21kKGRldi0+YWRtaW5fcSwgJmMsICZjcWUsIE5VTEwsIDAsIDAsCiAJCQlOVk1FX1FJRF9BTlksIDAsIDApOwotCWlmIChyZXQgPj0gMCkKKwlpZiAocmV0ID49IDAgJiYgcmVzdWx0KQogCQkqcmVzdWx0ID0gbGUzMl90b19jcHUoY3FlLnJlc3VsdCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZtZS9ob3N0L2ZhYnJpY3MuYyBiL2RyaXZlcnMvbnZtZS9ob3N0L2ZhYnJpY3MuYwppbmRleCBkYzk5Njc2Li40ZWZmNDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUvaG9zdC9mYWJyaWNzLmMKKysrIGIvZHJpdmVycy9udm1lL2hvc3QvZmFicmljcy5jCkBAIC00Nyw4ICs0NywxMCBAQAogCiAJbXV0ZXhfbG9jaygmbnZtZl9ob3N0c19tdXRleCk7CiAJaG9zdCA9IF9fbnZtZl9ob3N0X2ZpbmQoaG9zdG5xbik7Ci0JaWYgKGhvc3QpCisJaWYgKGhvc3QpIHsKKwkJa3JlZl9nZXQoJmhvc3QtPnJlZik7CiAJCWdvdG8gb3V0X3VubG9jazsKKwl9CiAKIAlob3N0ID0ga21hbGxvYyhzaXplb2YoKmhvc3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhvc3QpCkBAIC01Niw3ICs1OCw3IEBACiAKIAlrcmVmX2luaXQoJmhvc3QtPnJlZik7CiAJbWVtY3B5KGhvc3QtPm5xbiwgaG9zdG5xbiwgTlZNRl9OUU5fU0laRSk7Ci0JdXVpZF9sZV9nZW4oJmhvc3QtPmlkKTsKKwl1dWlkX2JlX2dlbigmaG9zdC0+aWQpOwogCiAJbGlzdF9hZGRfdGFpbCgmaG9zdC0+bGlzdCwgJm52bWZfaG9zdHMpOwogb3V0X3VubG9jazoKQEAgLTczLDkgKzc1LDkgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlrcmVmX2luaXQoJmhvc3QtPnJlZik7Ci0JdXVpZF9sZV9nZW4oJmhvc3QtPmlkKTsKKwl1dWlkX2JlX2dlbigmaG9zdC0+aWQpOwogCXNucHJpbnRmKGhvc3QtPm5xbiwgTlZNRl9OUU5fU0laRSwKLQkJIm5xbi4yMDE0LTA4Lm9yZy5udm1leHByZXNzOk5WTWY6dXVpZDolcFVsIiwgJmhvc3QtPmlkKTsKKwkJIm5xbi4yMDE0LTA4Lm9yZy5udm1leHByZXNzOk5WTWY6dXVpZDolcFViIiwgJmhvc3QtPmlkKTsKIAogCW11dGV4X2xvY2soJm52bWZfaG9zdHNfbXV0ZXgpOwogCWxpc3RfYWRkX3RhaWwoJmhvc3QtPmxpc3QsICZudm1mX2hvc3RzKTsKQEAgLTM2Myw3ICszNjUsMTQgQEAKIAljbWQuY29ubmVjdC5vcGNvZGUgPSBudm1lX2ZhYnJpY3NfY29tbWFuZDsKIAljbWQuY29ubmVjdC5mY3R5cGUgPSBudm1lX2ZhYnJpY3NfdHlwZV9jb25uZWN0OwogCWNtZC5jb25uZWN0LnFpZCA9IDA7Ci0JY21kLmNvbm5lY3Quc3FzaXplID0gY3B1X3RvX2xlMTYoY3RybC0+c3FzaXplKTsKKworCS8qCisJICogZmFicmljcyBzcGVjIHNldHMgYSBtaW5pbXVtIG9mIGRlcHRoIDMyIGZvciBhZG1pbiBxdWV1ZSwKKwkgKiBzbyBzZXQgdGhlIHF1ZXVlIHdpdGggdGhpcyBkZXB0aCBhbHdheXMgdW50aWwKKwkgKiBqdXN0aWZpY2F0aW9uIG90aGVyd2lzZS4KKwkgKi8KKwljbWQuY29ubmVjdC5zcXNpemUgPSBjcHVfdG9fbGUxNihOVk1GX0FRX0RFUFRIIC0gMSk7CisKIAkvKgogCSAqIFNldCBrZWVwLWFsaXZlIHRpbWVvdXQgaW4gc2Vjb25kcyBncmFudWxhcml0eSAobXMgKiAxMDAwKQogCSAqIGFuZCBhZGQgYSBncmFjZSBwZXJpb2QgZm9yIGNvbnRyb2xsZXIga2F0byBlbmZvcmNlbWVudApAQCAtMzc1LDcgKzM4NCw3IEBACiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1lbWNweSgmZGF0YS0+aG9zdGlkLCAmY3RybC0+b3B0cy0+aG9zdC0+aWQsIHNpemVvZih1dWlkX2xlKSk7CisJbWVtY3B5KCZkYXRhLT5ob3N0aWQsICZjdHJsLT5vcHRzLT5ob3N0LT5pZCwgc2l6ZW9mKHV1aWRfYmUpKTsKIAlkYXRhLT5jbnRsaWQgPSBjcHVfdG9fbGUxNigweGZmZmYpOwogCXN0cm5jcHkoZGF0YS0+c3Vic3lzbnFuLCBjdHJsLT5vcHRzLT5zdWJzeXNucW4sIE5WTUZfTlFOX1NJWkUpOwogCXN0cm5jcHkoZGF0YS0+aG9zdG5xbiwgY3RybC0+b3B0cy0+aG9zdC0+bnFuLCBOVk1GX05RTl9TSVpFKTsKQEAgLTQzNCw3ICs0NDMsNyBAQAogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltZW1jcHkoJmRhdGEtPmhvc3RpZCwgJmN0cmwtPm9wdHMtPmhvc3QtPmlkLCBzaXplb2YodXVpZF9sZSkpOworCW1lbWNweSgmZGF0YS0+aG9zdGlkLCAmY3RybC0+b3B0cy0+aG9zdC0+aWQsIHNpemVvZih1dWlkX2JlKSk7CiAJZGF0YS0+Y250bGlkID0gY3B1X3RvX2xlMTYoY3RybC0+Y250bGlkKTsKIAlzdHJuY3B5KGRhdGEtPnN1YnN5c25xbiwgY3RybC0+b3B0cy0+c3Vic3lzbnFuLCBOVk1GX05RTl9TSVpFKTsKIAlzdHJuY3B5KGRhdGEtPmhvc3RucW4sIGN0cmwtPm9wdHMtPmhvc3QtPm5xbiwgTlZNRl9OUU5fU0laRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL252bWUvaG9zdC9mYWJyaWNzLmggYi9kcml2ZXJzL252bWUvaG9zdC9mYWJyaWNzLmgKaW5kZXggODlkZjUyYy4uNDZlNDYwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9udm1lL2hvc3QvZmFicmljcy5oCisrKyBiL2RyaXZlcnMvbnZtZS9ob3N0L2ZhYnJpY3MuaApAQCAtMzQsNyArMzQsNyBAQAogCXN0cnVjdCBrcmVmCQlyZWY7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogCWNoYXIJCQlucW5bTlZNRl9OUU5fU0laRV07Ci0JdXVpZF9sZQkJCWlkOworCXV1aWRfYmUJCQlpZDsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9udm1lL2hvc3QvcGNpLmMgYi9kcml2ZXJzL252bWUvaG9zdC9wY2kuYwppbmRleCA4ZGNmNWE5Li42MGY3ZWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUvaG9zdC9wY2kuYworKysgYi9kcml2ZXJzL252bWUvaG9zdC9wY2kuYwpAQCAtMTY5Myw3ICsxNjkzLDEyIEBACiAJCW52bWVfc3VzcGVuZF9xdWV1ZShkZXYtPnF1ZXVlc1tpXSk7CiAKIAlpZiAoY3N0cyAmIE5WTUVfQ1NUU19DRlMgfHwgIShjc3RzICYgTlZNRV9DU1RTX1JEWSkpIHsKLQkJbnZtZV9zdXNwZW5kX3F1ZXVlKGRldi0+cXVldWVzWzBdKTsKKwkJLyogQSBkZXZpY2UgbWlnaHQgYmVjb21lIElPIGluY2FwYWJsZSB2ZXJ5IHNvb24gZHVyaW5nCisJCSAqIHByb2JlLCBiZWZvcmUgdGhlIGFkbWluIHF1ZXVlIGlzIGNvbmZpZ3VyZWQuIFRodXMsCisJCSAqIHF1ZXVlX2NvdW50IGNhbiBiZSAwIGhlcmUuCisJCSAqLworCQlpZiAoZGV2LT5xdWV1ZV9jb3VudCkKKwkJCW52bWVfc3VzcGVuZF9xdWV1ZShkZXYtPnF1ZXVlc1swXSk7CiAJfSBlbHNlIHsKIAkJbnZtZV9kaXNhYmxlX2lvX3F1ZXVlcyhkZXYpOwogCQludm1lX2Rpc2FibGVfYWRtaW5fcXVldWUoZGV2LCBzaHV0ZG93bik7CkBAIC0yMTEyLDYgKzIxMTcsOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBOVk1FX1FVSVJLX0lERU5USUZZX0NOUywgfSwKIAl7IFBDSV9ERVZJQ0UoMHgxYzU4LCAweDAwMDMpLAkvKiBIR1NUIGFkYXB0ZXIgKi8KIAkJLmRyaXZlcl9kYXRhID0gTlZNRV9RVUlSS19ERUxBWV9CRUZPUkVfQ0hLX1JEWSwgfSwKKwl7IFBDSV9ERVZJQ0UoMHgxYzVmLCAweDA1NDApLAkvKiBNZW1ibGF6ZSBQYmxhemU0IGFkYXB0ZXIgKi8KKwkJLmRyaXZlcl9kYXRhID0gTlZNRV9RVUlSS19ERUxBWV9CRUZPUkVfQ0hLX1JEWSwgfSwKIAl7IFBDSV9ERVZJQ0VfQ0xBU1MoUENJX0NMQVNTX1NUT1JBR0VfRVhQUkVTUywgMHhmZmZmZmYpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQVBQTEUsIDB4MjAwMSkgfSwKIAl7IDAsIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZtZS9ob3N0L3JkbWEuYyBiL2RyaXZlcnMvbnZtZS9ob3N0L3JkbWEuYwppbmRleCA4ZDI4NzViLi5mYmRiMjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUvaG9zdC9yZG1hLmMKKysrIGIvZHJpdmVycy9udm1lL2hvc3QvcmRtYS5jCkBAIC00MywxMCArNDMsNiBAQAogCiAjZGVmaW5lIE5WTUVfUkRNQV9NQVhfSU5MSU5FX1NFR01FTlRTCTEKIAotI2RlZmluZSBOVk1FX1JETUFfTUFYX1BBR0VTX1BFUl9NUgk1MTIKLQotI2RlZmluZSBOVk1FX1JETUFfREVGX1JFQ09OTkVDVF9ERUxBWQkyMAotCiAvKgogICogV2UgaGFuZGxlIEFFTiBjb21tYW5kcyBvdXJzZWx2ZXMgYW5kIGRvbid0IGV2ZW4gbGV0IHRoZQogICogYmxvY2sgbGF5ZXIga25vdyBhYm91dCB0aGVtLgpAQCAtNzcsNyArNzMsNiBAQAogCXUzMgkJCW51bV9zZ2U7CiAJaW50CQkJbmVudHM7CiAJYm9vbAkJCWlubGluZV9kYXRhOwotCWJvb2wJCQluZWVkX2ludmFsOwogCXN0cnVjdCBpYl9yZWdfd3IJcmVnX3dyOwogCXN0cnVjdCBpYl9jcWUJCXJlZ19jcWU7CiAJc3RydWN0IG52bWVfcmRtYV9xdWV1ZSAgKnF1ZXVlOwpAQCAtODcsNiArODIsOCBAQAogCiBlbnVtIG52bWVfcmRtYV9xdWV1ZV9mbGFncyB7CiAJTlZNRV9SRE1BX1FfQ09OTkVDVEVEID0gKDEgPDwgMCksCisJTlZNRV9SRE1BX0lCX1FVRVVFX0FMTE9DQVRFRCA9ICgxIDw8IDEpLAorCU5WTUVfUkRNQV9RX0RFTEVUSU5HID0gKDEgPDwgMiksCiB9OwogCiBzdHJ1Y3QgbnZtZV9yZG1hX3F1ZXVlIHsKQEAgLTI4Niw3ICsyODMsNyBAQAogCXN0cnVjdCBudm1lX3JkbWFfcmVxdWVzdCAqcmVxID0gYmxrX21xX3JxX3RvX3BkdShycSk7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoIXJlcS0+bmVlZF9pbnZhbCkKKwlpZiAoIXJlcS0+bXItPm5lZWRfaW52YWwpCiAJCWdvdG8gb3V0OwogCiAJaWJfZGVyZWdfbXIocmVxLT5tcik7CkBAIC0yOTYsOSArMjkzLDEwIEBACiAJaWYgKElTX0VSUihyZXEtPm1yKSkgewogCQlyZXQgPSBQVFJfRVJSKHJlcS0+bXIpOwogCQlyZXEtPm1yID0gTlVMTDsKKwkJZ290byBvdXQ7CiAJfQogCi0JcmVxLT5uZWVkX2ludmFsID0gZmFsc2U7CisJcmVxLT5tci0+bmVlZF9pbnZhbCA9IGZhbHNlOwogCiBvdXQ6CiAJcmV0dXJuIHJldDsKQEAgLTQ4NSw5ICs0ODMsMTQgQEAKIAogc3RhdGljIHZvaWQgbnZtZV9yZG1hX2Rlc3Ryb3lfcXVldWVfaWIoc3RydWN0IG52bWVfcmRtYV9xdWV1ZSAqcXVldWUpCiB7Ci0Jc3RydWN0IG52bWVfcmRtYV9kZXZpY2UgKmRldiA9IHF1ZXVlLT5kZXZpY2U7Ci0Jc3RydWN0IGliX2RldmljZSAqaWJkZXYgPSBkZXYtPmRldjsKKwlzdHJ1Y3QgbnZtZV9yZG1hX2RldmljZSAqZGV2OworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2OwogCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoTlZNRV9SRE1BX0lCX1FVRVVFX0FMTE9DQVRFRCwgJnF1ZXVlLT5mbGFncykpCisJCXJldHVybjsKKworCWRldiA9IHF1ZXVlLT5kZXZpY2U7CisJaWJkZXYgPSBkZXYtPmRldjsKIAlyZG1hX2Rlc3Ryb3lfcXAocXVldWUtPmNtX2lkKTsKIAlpYl9mcmVlX2NxKHF1ZXVlLT5pYl9jcSk7CiAKQEAgLTUzOCw2ICs1NDEsNyBAQAogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9kZXN0cm95X3FwOwogCX0KKwlzZXRfYml0KE5WTUVfUkRNQV9JQl9RVUVVRV9BTExPQ0FURUQsICZxdWV1ZS0+ZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTU5MCwxMSArNTk0LDEzIEBACiAJCWdvdG8gb3V0X2Rlc3Ryb3lfY21faWQ7CiAJfQogCisJY2xlYXJfYml0KE5WTUVfUkRNQV9RX0RFTEVUSU5HLCAmcXVldWUtPmZsYWdzKTsKIAlzZXRfYml0KE5WTUVfUkRNQV9RX0NPTk5FQ1RFRCwgJnF1ZXVlLT5mbGFncyk7CiAKIAlyZXR1cm4gMDsKIAogb3V0X2Rlc3Ryb3lfY21faWQ6CisJbnZtZV9yZG1hX2Rlc3Ryb3lfcXVldWVfaWIocXVldWUpOwogCXJkbWFfZGVzdHJveV9pZChxdWV1ZS0+Y21faWQpOwogCXJldHVybiByZXQ7CiB9CkBAIC02MTMsNyArNjE5LDcgQEAKIAogc3RhdGljIHZvaWQgbnZtZV9yZG1hX3N0b3BfYW5kX2ZyZWVfcXVldWUoc3RydWN0IG52bWVfcmRtYV9xdWV1ZSAqcXVldWUpCiB7Ci0JaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoTlZNRV9SRE1BX1FfQ09OTkVDVEVELCAmcXVldWUtPmZsYWdzKSkKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChOVk1FX1JETUFfUV9ERUxFVElORywgJnF1ZXVlLT5mbGFncykpCiAJCXJldHVybjsKIAludm1lX3JkbWFfc3RvcF9xdWV1ZShxdWV1ZSk7CiAJbnZtZV9yZG1hX2ZyZWVfcXVldWUocXVldWUpOwpAQCAtNjQ1LDcgKzY1MSw4IEBACiAJaW50IGksIHJldDsKIAogCWZvciAoaSA9IDE7IGkgPCBjdHJsLT5xdWV1ZV9jb3VudDsgaSsrKSB7Ci0JCXJldCA9IG52bWVfcmRtYV9pbml0X3F1ZXVlKGN0cmwsIGksIGN0cmwtPmN0cmwuc3FzaXplKTsKKwkJcmV0ID0gbnZtZV9yZG1hX2luaXRfcXVldWUoY3RybCwgaSwKKwkJCQkJICAgY3RybC0+Y3RybC5vcHRzLT5xdWV1ZV9zaXplKTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2luZm8oY3RybC0+Y3RybC5kZXZpY2UsCiAJCQkJImZhaWxlZCB0byBpbml0aWFsaXplIGkvbyBxdWV1ZTogJWRcbiIsIHJldCk7CkBAIC02NTYsNyArNjYzLDcgQEAKIAlyZXR1cm4gMDsKIAogb3V0X2ZyZWVfcXVldWVzOgotCWZvciAoOyBpID49IDE7IGktLSkKKwlmb3IgKGktLTsgaSA+PSAxOyBpLS0pCiAJCW52bWVfcmRtYV9zdG9wX2FuZF9mcmVlX3F1ZXVlKCZjdHJsLT5xdWV1ZXNbaV0pOwogCiAJcmV0dXJuIHJldDsKQEAgLTc2NSw4ICs3NzIsMTMgQEAKIHsKIAlzdHJ1Y3QgbnZtZV9yZG1hX2N0cmwgKmN0cmwgPSBjb250YWluZXJfb2Yod29yaywKIAkJCXN0cnVjdCBudm1lX3JkbWFfY3RybCwgZXJyX3dvcmspOworCWludCBpOwogCiAJbnZtZV9zdG9wX2tlZXBfYWxpdmUoJmN0cmwtPmN0cmwpOworCisJZm9yIChpID0gMDsgaSA8IGN0cmwtPnF1ZXVlX2NvdW50OyBpKyspCisJCWNsZWFyX2JpdChOVk1FX1JETUFfUV9DT05ORUNURUQsICZjdHJsLT5xdWV1ZXNbaV0uZmxhZ3MpOworCiAJaWYgKGN0cmwtPnF1ZXVlX2NvdW50ID4gMSkKIAkJbnZtZV9zdG9wX3F1ZXVlcygmY3RybC0+Y3RybCk7CiAJYmxrX21xX3N0b3BfaHdfcXVldWVzKGN0cmwtPmN0cmwuYWRtaW5fcSk7CkBAIC04NDksNyArODYxLDcgQEAKIAlpZiAoIWJsa19ycV9ieXRlcyhycSkpCiAJCXJldHVybjsKIAotCWlmIChyZXEtPm5lZWRfaW52YWwpIHsKKwlpZiAocmVxLT5tci0+bmVlZF9pbnZhbCkgewogCQlyZXMgPSBudm1lX3JkbWFfaW52X3JrZXkocXVldWUsIHJlcSk7CiAJCWlmIChyZXMgPCAwKSB7CiAJCQlkZXZfZXJyKGN0cmwtPmN0cmwuZGV2aWNlLApAQCAtOTM1LDcgKzk0Nyw3IEBACiAJCQkgICAgIElCX0FDQ0VTU19SRU1PVEVfUkVBRCB8CiAJCQkgICAgIElCX0FDQ0VTU19SRU1PVEVfV1JJVEU7CiAKLQlyZXEtPm5lZWRfaW52YWwgPSB0cnVlOworCXJlcS0+bXItPm5lZWRfaW52YWwgPSB0cnVlOwogCiAJc2ctPmFkZHIgPSBjcHVfdG9fbGU2NChyZXEtPm1yLT5pb3ZhKTsKIAlwdXRfdW5hbGlnbmVkX2xlMjQocmVxLT5tci0+bGVuZ3RoLCBzZy0+bGVuZ3RoKTsKQEAgLTk1OCw3ICs5NzAsNyBAQAogCiAJcmVxLT5udW1fc2dlID0gMTsKIAlyZXEtPmlubGluZV9kYXRhID0gZmFsc2U7Ci0JcmVxLT5uZWVkX2ludmFsID0gZmFsc2U7CisJcmVxLT5tci0+bmVlZF9pbnZhbCA9IGZhbHNlOwogCiAJYy0+Y29tbW9uLmZsYWdzIHw9IE5WTUVfQ01EX1NHTF9NRVRBQlVGOwogCkBAIC0xMTQ1LDcgKzExNTcsNyBAQAogCiAJaWYgKCh3Yy0+d2NfZmxhZ3MgJiBJQl9XQ19XSVRIX0lOVkFMSURBVEUpICYmCiAJICAgIHdjLT5leC5pbnZhbGlkYXRlX3JrZXkgPT0gcmVxLT5tci0+cmtleSkKLQkJcmVxLT5uZWVkX2ludmFsID0gZmFsc2U7CisJCXJlcS0+bXItPm5lZWRfaW52YWwgPSBmYWxzZTsKIAogCWJsa19tcV9jb21wbGV0ZV9yZXF1ZXN0KHJxLCBzdGF0dXMpOwogCkBAIC0xMjc4LDggKzEyOTAsMjIgQEAKIAogCXByaXYucmVjZm10ID0gY3B1X3RvX2xlMTYoTlZNRV9SRE1BX0NNX0ZNVF8xXzApOwogCXByaXYucWlkID0gY3B1X3RvX2xlMTYobnZtZV9yZG1hX3F1ZXVlX2lkeChxdWV1ZSkpOwotCXByaXYuaHJxc2l6ZSA9IGNwdV90b19sZTE2KHF1ZXVlLT5xdWV1ZV9zaXplKTsKLQlwcml2LmhzcXNpemUgPSBjcHVfdG9fbGUxNihxdWV1ZS0+cXVldWVfc2l6ZSk7CisJLyoKKwkgKiBzZXQgdGhlIGFkbWluIHF1ZXVlIGRlcHRoIHRvIHRoZSBtaW5pbXVtIHNpemUKKwkgKiBzcGVjaWZpZWQgYnkgdGhlIEZhYnJpY3Mgc3RhbmRhcmQuCisJICovCisJaWYgKHByaXYucWlkID09IDApIHsKKwkJcHJpdi5ocnFzaXplID0gY3B1X3RvX2xlMTYoTlZNRl9BUV9ERVBUSCk7CisJCXByaXYuaHNxc2l6ZSA9IGNwdV90b19sZTE2KE5WTUZfQVFfREVQVEggLSAxKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBjdXJyZW50IGludGVycHJldGF0aW9uIG9mIHRoZSBmYWJyaWNzIHNwZWMKKwkJICogaXMgYXQgbWluaW11bSB5b3UgbWFrZSBocnFzaXplIHNxc2l6ZSsxLCBvciBhCisJCSAqIDEncyBiYXNlZCByZXByZXNlbnRhdGlvbiBvZiBzcXNpemUuCisJCSAqLworCQlwcml2LmhycXNpemUgPSBjcHVfdG9fbGUxNihxdWV1ZS0+cXVldWVfc2l6ZSk7CisJCXByaXYuaHNxc2l6ZSA9IGNwdV90b19sZTE2KHF1ZXVlLT5jdHJsLT5jdHJsLnNxc2l6ZSk7CisJfQogCiAJcmV0ID0gcmRtYV9jb25uZWN0KHF1ZXVlLT5jbV9pZCwgJnBhcmFtKTsKIAlpZiAocmV0KSB7CkBAIC0xMjk1LDU4ICsxMzIxLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKioKLSAqIG52bWVfcmRtYV9kZXZpY2VfdW5wbHVnKCkgLSBIYW5kbGUgUkRNQSBkZXZpY2UgdW5wbHVnCi0gKiBAcXVldWU6ICAgICAgUXVldWUgdGhhdCBvd25zIHRoZSBjbV9pZCB0aGF0IGNhdWdodCB0aGUgZXZlbnQKLSAqCi0gKiBERVZJQ0VfUkVNT1ZBTCBldmVudCBub3RpZmllcyB1cyB0aGF0IHRoZSBSRE1BIGRldmljZSBpcyBhYm91dAotICogdG8gdW5wbHVnIHNvIHdlIHNob3VsZCB0YWtlIGNhcmUgb2YgZGVzdHJveWluZyBvdXIgUkRNQSByZXNvdXJjZXMuCi0gKiBUaGlzIGV2ZW50IHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBlYWNoIGFsbG9jYXRlZCBjbV9pZC4KLSAqCi0gKiBJbiBvdXIgY2FzZSwgdGhlIFJETUEgcmVzb3VyY2VzIGFyZSBtYW5hZ2VkIHBlciBjb250cm9sbGVyIGFuZCBub3QKLSAqIG9ubHkgcGVyIHF1ZXVlLiBTbyB0aGUgd2F5IHdlIGhhbmRsZSB0aGlzIGlzIHdlIHRyaWdnZXIgYW4gaW1wbGljaXQKLSAqIGNvbnRyb2xsZXIgZGVsZXRpb24gdXBvbiB0aGUgZmlyc3QgREVWSUNFX1JFTU9WQUwgZXZlbnQgd2Ugc2VlLCBhbmQKLSAqIGhvbGQgdGhlIGV2ZW50IGluZmxpZ2h0IHVudGlsIHRoZSBjb250cm9sbGVyIGRlbGV0aW9uIGlzIGNvbXBsZXRlZC4KLSAqCi0gKiBPbmUgZXhjZXB0aW9uIHRoYXQgd2UgbmVlZCB0byBoYW5kbGUgaXMgdGhlIGRlc3RydWN0aW9uIG9mIHRoZSBjbV9pZAotICogdGhhdCBjYXVnaHQgdGhlIGV2ZW50LiBTaW5jZSB3ZSBob2xkIHRoZSBjYWxsb3V0IHVudGlsIHRoZSBjb250cm9sbGVyCi0gKiBkZWxldGlvbiBpcyBjb21wbGV0ZWQsIHdlJ2xsIGRlYWRsb2NrIGlmIHRoZSBjb250cm9sbGVyIGRlbGV0aW9uIHdpbGwKLSAqIGNhbGwgcmRtYV9kZXN0cm95X2lkIG9uIHRoaXMgcXVldWUncyBjbV9pZC4gVGh1cywgd2UgY2xhaW0gb3duZXJzaGlwCi0gKiBvZiBkZXN0cm95aW5nIHRoaXMgcXVldWUgYmVmb3JlLWhhbmQsIGRlc3Ryb3kgdGhlIHF1ZXVlIHJlc291cmNlcywKLSAqIHRoZW4gcXVldWUgdGhlIGNvbnRyb2xsZXIgZGVsZXRpb24gd2hpY2ggd29uJ3QgZGVzdHJveSB0aGlzIHF1ZXVlIGFuZAotICogd2UgZGVzdHJveSB0aGUgY21faWQgaW1wbGljaXRlbHkgYnkgcmV0dXJuaW5nIGEgbm9uLXplcm8gcmMgdG8gdGhlIGNhbGxvdXQuCi0gKi8KLXN0YXRpYyBpbnQgbnZtZV9yZG1hX2RldmljZV91bnBsdWcoc3RydWN0IG52bWVfcmRtYV9xdWV1ZSAqcXVldWUpCi17Ci0Jc3RydWN0IG52bWVfcmRtYV9jdHJsICpjdHJsID0gcXVldWUtPmN0cmw7Ci0JaW50IHJldDsKLQotCS8qIE93biB0aGUgY29udHJvbGxlciBkZWxldGlvbiAqLwotCWlmICghbnZtZV9jaGFuZ2VfY3RybF9zdGF0ZSgmY3RybC0+Y3RybCwgTlZNRV9DVFJMX0RFTEVUSU5HKSkKLQkJcmV0dXJuIDA7Ci0KLQlkZXZfd2FybihjdHJsLT5jdHJsLmRldmljZSwKLQkJIkdvdCByZG1hIGRldmljZSByZW1vdmFsIGV2ZW50LCBkZWxldGluZyBjdHJsXG4iKTsKLQotCS8qIEdldCByaWQgb2YgcmVjb25uZWN0IHdvcmsgaWYgaXRzIHJ1bm5pbmcgKi8KLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmN0cmwtPnJlY29ubmVjdF93b3JrKTsKLQotCS8qIERpc2FibGUgdGhlIHF1ZXVlIHNvIGN0cmwgZGVsZXRlIHdvbid0IGZyZWUgaXQgKi8KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE5WTUVfUkRNQV9RX0NPTk5FQ1RFRCwgJnF1ZXVlLT5mbGFncykpIHsKLQkJLyogRnJlZSB0aGlzIHF1ZXVlIG91cnNlbHZlcyAqLwotCQludm1lX3JkbWFfc3RvcF9xdWV1ZShxdWV1ZSk7Ci0JCW52bWVfcmRtYV9kZXN0cm95X3F1ZXVlX2liKHF1ZXVlKTsKLQotCQkvKiBSZXR1cm4gbm9uLXplcm8gc28gdGhlIGNtX2lkIHdpbGwgZGVzdHJveSBpbXBsaWNpdGx5ICovCi0JCXJldCA9IDE7Ci0JfQotCi0JLyogUXVldWUgY29udHJvbGxlciBkZWxldGlvbiAqLwotCXF1ZXVlX3dvcmsobnZtZV9yZG1hX3dxLCAmY3RybC0+ZGVsZXRlX3dvcmspOwotCWZsdXNoX3dvcmsoJmN0cmwtPmRlbGV0ZV93b3JrKTsKLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgaW50IG52bWVfcmRtYV9jbV9oYW5kbGVyKHN0cnVjdCByZG1hX2NtX2lkICpjbV9pZCwKIAkJc3RydWN0IHJkbWFfY21fZXZlbnQgKmV2KQogewpAQCAtMTM4OCw4ICsxMzYyLDggQEAKIAkJbnZtZV9yZG1hX2Vycm9yX3JlY292ZXJ5KHF1ZXVlLT5jdHJsKTsKIAkJYnJlYWs7CiAJY2FzZSBSRE1BX0NNX0VWRU5UX0RFVklDRV9SRU1PVkFMOgotCQkvKiByZXR1cm4gMSBtZWFucyBpbXBsaWNpeSBDTSBJRCBkZXN0cm95ICovCi0JCXJldHVybiBudm1lX3JkbWFfZGV2aWNlX3VucGx1ZyhxdWV1ZSk7CisJCS8qIGRldmljZSByZW1vdmFsIGlzIGhhbmRsZWQgdmlhIHRoZSBpYl9jbGllbnQgQVBJICovCisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIocXVldWUtPmN0cmwtPmN0cmwuZGV2aWNlLAogCQkJIlVuZXhwZWN0ZWQgUkRNQSBDTSBldmVudCAoJWQpXG4iLCBldi0+ZXZlbnQpOwpAQCAtMTQ2MSw3ICsxNDM1LDcgQEAKIAlpZiAocnEtPmNtZF90eXBlID09IFJFUV9UWVBFX0ZTICYmIHJlcV9vcChycSkgPT0gUkVRX09QX0ZMVVNIKQogCQlmbHVzaCA9IHRydWU7CiAJcmV0ID0gbnZtZV9yZG1hX3Bvc3Rfc2VuZChxdWV1ZSwgc3FlLCByZXEtPnNnZSwgcmVxLT5udW1fc2dlLAotCQkJcmVxLT5uZWVkX2ludmFsID8gJnJlcS0+cmVnX3dyLndyIDogTlVMTCwgZmx1c2gpOworCQkJcmVxLT5tci0+bmVlZF9pbnZhbCA/ICZyZXEtPnJlZ193ci53ciA6IE5VTEwsIGZsdXNoKTsKIAlpZiAocmV0KSB7CiAJCW52bWVfcmRtYV91bm1hcF9kYXRhKHF1ZXVlLCBycSk7CiAJCWdvdG8gZXJyOwpAQCAtMTY5MCwxNSArMTY2NCwxOSBAQAogc3RhdGljIGludCBudm1lX3JkbWFfZGVsX2N0cmwoc3RydWN0IG52bWVfY3RybCAqbmN0cmwpCiB7CiAJc3RydWN0IG52bWVfcmRtYV9jdHJsICpjdHJsID0gdG9fcmRtYV9jdHJsKG5jdHJsKTsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCisJLyoKKwkgKiBLZWVwIGEgcmVmZXJlbmNlIHVudGlsIGFsbCB3b3JrIGlzIGZsdXNoZWQgc2luY2UKKwkgKiBfX252bWVfcmRtYV9kZWxfY3RybCBjYW4gZnJlZSB0aGUgY3RybCBtZW0KKwkgKi8KKwlpZiAoIWtyZWZfZ2V0X3VubGVzc196ZXJvKCZjdHJsLT5jdHJsLmtyZWYpKQorCQlyZXR1cm4gLUVCVVNZOwogCXJldCA9IF9fbnZtZV9yZG1hX2RlbF9jdHJsKGN0cmwpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlmbHVzaF93b3JrKCZjdHJsLT5kZWxldGVfd29yayk7Ci0KLQlyZXR1cm4gMDsKKwlpZiAoIXJldCkKKwkJZmx1c2hfd29yaygmY3RybC0+ZGVsZXRlX3dvcmspOworCW52bWVfcHV0X2N0cmwoJmN0cmwtPmN0cmwpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIG52bWVfcmRtYV9yZW1vdmVfY3RybF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTE4MTYsNyArMTc5NCw3IEBACiAKIAltZW1zZXQoJmN0cmwtPnRhZ19zZXQsIDAsIHNpemVvZihjdHJsLT50YWdfc2V0KSk7CiAJY3RybC0+dGFnX3NldC5vcHMgPSAmbnZtZV9yZG1hX21xX29wczsKLQljdHJsLT50YWdfc2V0LnF1ZXVlX2RlcHRoID0gY3RybC0+Y3RybC5zcXNpemU7CisJY3RybC0+dGFnX3NldC5xdWV1ZV9kZXB0aCA9IGN0cmwtPmN0cmwub3B0cy0+cXVldWVfc2l6ZTsKIAljdHJsLT50YWdfc2V0LnJlc2VydmVkX3RhZ3MgPSAxOyAvKiBmYWJyaWMgY29ubmVjdCAqLwogCWN0cmwtPnRhZ19zZXQubnVtYV9ub2RlID0gTlVNQV9OT19OT0RFOwogCWN0cmwtPnRhZ19zZXQuZmxhZ3MgPSBCTEtfTVFfRl9TSE9VTERfTUVSR0U7CkBAIC0xOTE0LDcgKzE4OTIsNyBAQAogCXNwaW5fbG9ja19pbml0KCZjdHJsLT5sb2NrKTsKIAogCWN0cmwtPnF1ZXVlX2NvdW50ID0gb3B0cy0+bnJfaW9fcXVldWVzICsgMTsgLyogKzEgZm9yIGFkbWluIHF1ZXVlICovCi0JY3RybC0+Y3RybC5zcXNpemUgPSBvcHRzLT5xdWV1ZV9zaXplOworCWN0cmwtPmN0cmwuc3FzaXplID0gb3B0cy0+cXVldWVfc2l6ZSAtIDE7CiAJY3RybC0+Y3RybC5rYXRvID0gb3B0cy0+a2F0bzsKIAogCXJldCA9IC1FTk9NRU07CkBAIC0xOTk1LDI3ICsxOTczLDU3IEBACiAJLmNyZWF0ZV9jdHJsCT0gbnZtZV9yZG1hX2NyZWF0ZV9jdHJsLAogfTsKIAorc3RhdGljIHZvaWQgbnZtZV9yZG1hX2FkZF9vbmUoc3RydWN0IGliX2RldmljZSAqaWJfZGV2aWNlKQoreworfQorCitzdGF0aWMgdm9pZCBudm1lX3JkbWFfcmVtb3ZlX29uZShzdHJ1Y3QgaWJfZGV2aWNlICppYl9kZXZpY2UsIHZvaWQgKmNsaWVudF9kYXRhKQoreworCXN0cnVjdCBudm1lX3JkbWFfY3RybCAqY3RybDsKKworCS8qIERlbGV0ZSBhbGwgY29udHJvbGxlcnMgdXNpbmcgdGhpcyBkZXZpY2UgKi8KKwltdXRleF9sb2NrKCZudm1lX3JkbWFfY3RybF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdHJsLCAmbnZtZV9yZG1hX2N0cmxfbGlzdCwgbGlzdCkgeworCQlpZiAoY3RybC0+ZGV2aWNlLT5kZXYgIT0gaWJfZGV2aWNlKQorCQkJY29udGludWU7CisJCWRldl9pbmZvKGN0cmwtPmN0cmwuZGV2aWNlLAorCQkJIlJlbW92aW5nIGN0cmw6IE5RTiBcIiVzXCIsIGFkZHIgJXBJU3BcbiIsCisJCQljdHJsLT5jdHJsLm9wdHMtPnN1YnN5c25xbiwgJmN0cmwtPmFkZHIpOworCQlfX252bWVfcmRtYV9kZWxfY3RybChjdHJsKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZudm1lX3JkbWFfY3RybF9tdXRleCk7CisKKwlmbHVzaF93b3JrcXVldWUobnZtZV9yZG1hX3dxKTsKK30KKworc3RhdGljIHN0cnVjdCBpYl9jbGllbnQgbnZtZV9yZG1hX2liX2NsaWVudCA9IHsKKwkubmFtZSAgID0gIm52bWVfcmRtYSIsCisJLmFkZCA9IG52bWVfcmRtYV9hZGRfb25lLAorCS5yZW1vdmUgPSBudm1lX3JkbWFfcmVtb3ZlX29uZQorfTsKKwogc3RhdGljIGludCBfX2luaXQgbnZtZV9yZG1hX2luaXRfbW9kdWxlKHZvaWQpCiB7CisJaW50IHJldDsKKwogCW52bWVfcmRtYV93cSA9IGNyZWF0ZV93b3JrcXVldWUoIm52bWVfcmRtYV93cSIpOwogCWlmICghbnZtZV9yZG1hX3dxKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXJldCA9IGliX3JlZ2lzdGVyX2NsaWVudCgmbnZtZV9yZG1hX2liX2NsaWVudCk7CisJaWYgKHJldCkgeworCQlkZXN0cm95X3dvcmtxdWV1ZShudm1lX3JkbWFfd3EpOworCQlyZXR1cm4gcmV0OworCX0KKwogCW52bWZfcmVnaXN0ZXJfdHJhbnNwb3J0KCZudm1lX3JkbWFfdHJhbnNwb3J0KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG52bWVfcmRtYV9jbGVhbnVwX21vZHVsZSh2b2lkKQogewotCXN0cnVjdCBudm1lX3JkbWFfY3RybCAqY3RybDsKLQogCW52bWZfdW5yZWdpc3Rlcl90cmFuc3BvcnQoJm52bWVfcmRtYV90cmFuc3BvcnQpOwotCi0JbXV0ZXhfbG9jaygmbnZtZV9yZG1hX2N0cmxfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3RybCwgJm52bWVfcmRtYV9jdHJsX2xpc3QsIGxpc3QpCi0JCV9fbnZtZV9yZG1hX2RlbF9jdHJsKGN0cmwpOwotCW11dGV4X3VubG9jaygmbnZtZV9yZG1hX2N0cmxfbXV0ZXgpOwotCisJaWJfdW5yZWdpc3Rlcl9jbGllbnQoJm52bWVfcmRtYV9pYl9jbGllbnQpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKG52bWVfcmRtYV93cSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZtZS90YXJnZXQvS2NvbmZpZyBiL2RyaXZlcnMvbnZtZS90YXJnZXQvS2NvbmZpZwppbmRleCBhNWMzMWNiLi4zYTViOWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUvdGFyZ2V0L0tjb25maWcKKysrIGIvZHJpdmVycy9udm1lL3RhcmdldC9LY29uZmlnCkBAIC0xNSw4ICsxNSw4IEBACiAKIGNvbmZpZyBOVk1FX1RBUkdFVF9MT09QCiAJdHJpc3RhdGUgIk5WTWUgbG9vcGJhY2sgZGV2aWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBCTEtfREVWX05WTUUKIAlkZXBlbmRzIG9uIE5WTUVfVEFSR0VUCisJc2VsZWN0IE5WTUVfQ09SRQogCXNlbGVjdCBOVk1FX0ZBQlJJQ1MKIAlzZWxlY3QgU0dfUE9PTAogCWhlbHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZtZS90YXJnZXQvbG9vcC5jIGIvZHJpdmVycy9udm1lL3RhcmdldC9sb29wLmMKaW5kZXggN2FmZmQ0MC4uMzk1ZTYwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9udm1lL3RhcmdldC9sb29wLmMKKysrIGIvZHJpdmVycy9udm1lL3RhcmdldC9sb29wLmMKQEAgLTU1Niw3ICs1NTYsNyBAQAogCiAJbWVtc2V0KCZjdHJsLT50YWdfc2V0LCAwLCBzaXplb2YoY3RybC0+dGFnX3NldCkpOwogCWN0cmwtPnRhZ19zZXQub3BzID0gJm52bWVfbG9vcF9tcV9vcHM7Ci0JY3RybC0+dGFnX3NldC5xdWV1ZV9kZXB0aCA9IGN0cmwtPmN0cmwuc3FzaXplOworCWN0cmwtPnRhZ19zZXQucXVldWVfZGVwdGggPSBjdHJsLT5jdHJsLm9wdHMtPnF1ZXVlX3NpemU7CiAJY3RybC0+dGFnX3NldC5yZXNlcnZlZF90YWdzID0gMTsgLyogZmFicmljIGNvbm5lY3QgKi8KIAljdHJsLT50YWdfc2V0Lm51bWFfbm9kZSA9IE5VTUFfTk9fTk9ERTsKIAljdHJsLT50YWdfc2V0LmZsYWdzID0gQkxLX01RX0ZfU0hPVUxEX01FUkdFOwpAQCAtNjIwLDcgKzYyMCw3IEBACiAKIAlyZXQgPSAtRU5PTUVNOwogCi0JY3RybC0+Y3RybC5zcXNpemUgPSBvcHRzLT5xdWV1ZV9zaXplOworCWN0cmwtPmN0cmwuc3FzaXplID0gb3B0cy0+cXVldWVfc2l6ZSAtIDE7CiAJY3RybC0+Y3RybC5rYXRvID0gb3B0cy0+a2F0bzsKIAogCWN0cmwtPnF1ZXVlcyA9IGtjYWxsb2Mob3B0cy0+bnJfaW9fcXVldWVzICsgMSwgc2l6ZW9mKCpjdHJsLT5xdWV1ZXMpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9udm1lL3RhcmdldC9yZG1hLmMgYi9kcml2ZXJzL252bWUvdGFyZ2V0L3JkbWEuYwppbmRleCBiNGQ2NDg1Li4xY2JlNmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUvdGFyZ2V0L3JkbWEuYworKysgYi9kcml2ZXJzL252bWUvdGFyZ2V0L3JkbWEuYwpAQCAtOTc4LDEwICs5NzgsMTEgQEAKIAkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBudm1ldF9yZG1hX3F1ZXVlLCByZWxlYXNlX3dvcmspOwogCXN0cnVjdCByZG1hX2NtX2lkICpjbV9pZCA9IHF1ZXVlLT5jbV9pZDsKIAlzdHJ1Y3QgbnZtZXRfcmRtYV9kZXZpY2UgKmRldiA9IHF1ZXVlLT5kZXY7CisJZW51bSBudm1ldF9yZG1hX3F1ZXVlX3N0YXRlIHN0YXRlID0gcXVldWUtPnN0YXRlOwogCiAJbnZtZXRfcmRtYV9mcmVlX3F1ZXVlKHF1ZXVlKTsKIAotCWlmIChxdWV1ZS0+c3RhdGUgIT0gTlZNRVRfUkRNQV9JTl9ERVZJQ0VfUkVNT1ZBTCkKKwlpZiAoc3RhdGUgIT0gTlZNRVRfUkRNQV9JTl9ERVZJQ0VfUkVNT1ZBTCkKIAkJcmRtYV9kZXN0cm95X2lkKGNtX2lkKTsKIAogCWtyZWZfcHV0KCZkZXYtPnJlZiwgbnZtZXRfcmRtYV9mcmVlX2Rldik7CkBAIC0xMDAzLDEwICsxMDA0LDEwIEBACiAJcXVldWUtPmhvc3RfcWlkID0gbGUxNl90b19jcHUocmVxLT5xaWQpOwogCiAJLyoKLQkgKiByZXEtPmhzcXNpemUgY29ycmVzcG9uZHMgdG8gb3VyIHJlY3YgcXVldWUgc2l6ZQorCSAqIHJlcS0+aHNxc2l6ZSBjb3JyZXNwb25kcyB0byBvdXIgcmVjdiBxdWV1ZSBzaXplIHBsdXMgMQogCSAqIHJlcS0+aHJxc2l6ZSBjb3JyZXNwb25kcyB0byBvdXIgc2VuZCBxdWV1ZSBzaXplCiAJICovCi0JcXVldWUtPnJlY3ZfcXVldWVfc2l6ZSA9IGxlMTZfdG9fY3B1KHJlcS0+aHNxc2l6ZSk7CisJcXVldWUtPnJlY3ZfcXVldWVfc2l6ZSA9IGxlMTZfdG9fY3B1KHJlcS0+aHNxc2l6ZSkgKyAxOwogCXF1ZXVlLT5zZW5kX3F1ZXVlX3NpemUgPSBsZTE2X3RvX2NwdShyZXEtPmhycXNpemUpOwogCiAJaWYgKCFxdWV1ZS0+aG9zdF9xaWQgJiYgcXVldWUtPnJlY3ZfcXVldWVfc2l6ZSA+IE5WTUZfQVFfREVQVEgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL252bWVtL3JvY2tjaGlwLWVmdXNlLmMgYi9kcml2ZXJzL252bWVtL3JvY2tjaGlwLWVmdXNlLmMKaW5kZXggNGQzZjM5MS4uNDIzOTA3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9udm1lbS9yb2NrY2hpcC1lZnVzZS5jCisrKyBiL2RyaXZlcnMvbnZtZW0vcm9ja2NoaXAtZWZ1c2UuYwpAQCAtMjIsMTcgKzIyLDI5IEBACiAjaW5jbHVkZSA8bGludXgvbnZtZW0tcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCi0jZGVmaW5lIEVGVVNFX0FfU0hJRlQJCQk2Ci0jZGVmaW5lIEVGVVNFX0FfTUFTSwkJCTB4M2ZmCi0jZGVmaW5lIEVGVVNFX1BHRU5CCQkJQklUKDMpCi0jZGVmaW5lIEVGVVNFX0xPQUQJCQlCSVQoMikKLSNkZWZpbmUgRUZVU0VfU1RST0JFCQkJQklUKDEpCi0jZGVmaW5lIEVGVVNFX0NTQgkJCUJJVCgwKQorI2RlZmluZSBSSzMyODhfQV9TSElGVAkJNgorI2RlZmluZSBSSzMyODhfQV9NQVNLCQkweDNmZgorI2RlZmluZSBSSzMyODhfUEdFTkIJCUJJVCgzKQorI2RlZmluZSBSSzMyODhfTE9BRAkJQklUKDIpCisjZGVmaW5lIFJLMzI4OF9TVFJPQkUJCUJJVCgxKQorI2RlZmluZSBSSzMyODhfQ1NCCQlCSVQoMCkKIAotI2RlZmluZSBSRUdfRUZVU0VfQ1RSTAkJCTB4MDAwMAotI2RlZmluZSBSRUdfRUZVU0VfRE9VVAkJCTB4MDAwNAorI2RlZmluZSBSSzMzOTlfQV9TSElGVAkJMTYKKyNkZWZpbmUgUkszMzk5X0FfTUFTSwkJMHgzZmYKKyNkZWZpbmUgUkszMzk5X05CWVRFUwkJNAorI2RlZmluZSBSSzMzOTlfU1RST0JTRlRTRUwJQklUKDkpCisjZGVmaW5lIFJLMzM5OV9SU0IJCUJJVCg3KQorI2RlZmluZSBSSzMzOTlfUEQJCUJJVCg1KQorI2RlZmluZSBSSzMzOTlfUEdFTkIJCUJJVCgzKQorI2RlZmluZSBSSzMzOTlfTE9BRAkJQklUKDIpCisjZGVmaW5lIFJLMzM5OV9TVFJPQkUJCUJJVCgxKQorI2RlZmluZSBSSzMzOTlfQ1NCCQlCSVQoMCkKKworI2RlZmluZSBSRUdfRUZVU0VfQ1RSTAkJMHgwMDAwCisjZGVmaW5lIFJFR19FRlVTRV9ET1VUCQkweDAwMDQKIAogc3RydWN0IHJvY2tjaGlwX2VmdXNlX2NoaXAgewogCXN0cnVjdCBkZXZpY2UgKmRldjsKQEAgLTQwLDggKzUyLDggQEAKIAlzdHJ1Y3QgY2xrICpjbGs7CiB9OwogCi1zdGF0aWMgaW50IHJvY2tjaGlwX2VmdXNlX3JlYWQodm9pZCAqY29udGV4dCwgdW5zaWduZWQgaW50IG9mZnNldCwKLQkJCSAgICAgICB2b2lkICp2YWwsIHNpemVfdCBieXRlcykKK3N0YXRpYyBpbnQgcm9ja2NoaXBfcmszMjg4X2VmdXNlX3JlYWQodm9pZCAqY29udGV4dCwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCQkgICAgICB2b2lkICp2YWwsIHNpemVfdCBieXRlcykKIHsKIAlzdHJ1Y3Qgcm9ja2NoaXBfZWZ1c2VfY2hpcCAqZWZ1c2UgPSBjb250ZXh0OwogCXU4ICpidWYgPSB2YWw7CkBAIC01MywyNyArNjUsODIgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQl3cml0ZWwoRUZVU0VfTE9BRCB8IEVGVVNFX1BHRU5CLCBlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKTsKKwl3cml0ZWwoUkszMjg4X0xPQUQgfCBSSzMyODhfUEdFTkIsIGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpOwogCXVkZWxheSgxKTsKIAl3aGlsZSAoYnl0ZXMtLSkgewogCQl3cml0ZWwocmVhZGwoZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCkgJgotCQkJICAgICAofihFRlVTRV9BX01BU0sgPDwgRUZVU0VfQV9TSElGVCkpLAorCQkJICAgICAofihSSzMyODhfQV9NQVNLIDw8IFJLMzI4OF9BX1NISUZUKSksCiAJCQkgICAgIGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpOwogCQl3cml0ZWwocmVhZGwoZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCkgfAotCQkJICAgICAoKG9mZnNldCsrICYgRUZVU0VfQV9NQVNLKSA8PCBFRlVTRV9BX1NISUZUKSwKKwkJCSAgICAgKChvZmZzZXQrKyAmIFJLMzI4OF9BX01BU0spIDw8IFJLMzI4OF9BX1NISUZUKSwKIAkJCSAgICAgZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCk7CiAJCXVkZWxheSgxKTsKIAkJd3JpdGVsKHJlYWRsKGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpIHwKLQkJCSAgICAgRUZVU0VfU1RST0JFLCBlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKTsKKwkJCSAgICAgUkszMjg4X1NUUk9CRSwgZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCk7CiAJCXVkZWxheSgxKTsKIAkJKmJ1ZisrID0gcmVhZGIoZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfRE9VVCk7CiAJCXdyaXRlbChyZWFkbChlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKSAmCi0JCSAgICAgKH5FRlVTRV9TVFJPQkUpLCBlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKTsKKwkJICAgICAgICh+UkszMjg4X1NUUk9CRSksIGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpOwogCQl1ZGVsYXkoMSk7CiAJfQogCiAJLyogU3dpdGNoIHRvIHN0YW5kYnkgbW9kZSAqLwotCXdyaXRlbChFRlVTRV9QR0VOQiB8IEVGVVNFX0NTQiwgZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCk7CisJd3JpdGVsKFJLMzI4OF9QR0VOQiB8IFJLMzI4OF9DU0IsIGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpOworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGVmdXNlLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfcmszMzk5X2VmdXNlX3JlYWQodm9pZCAqY29udGV4dCwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCQkgICAgICB2b2lkICp2YWwsIHNpemVfdCBieXRlcykKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfZWZ1c2VfY2hpcCAqZWZ1c2UgPSBjb250ZXh0OworCXVuc2lnbmVkIGludCBhZGRyX3N0YXJ0LCBhZGRyX2VuZCwgYWRkcl9vZmZzZXQsIGFkZHJfbGVuOworCXUzMiBvdXRfdmFsdWU7CisJdTggKmJ1ZjsKKwlpbnQgcmV0LCBpID0gMDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShlZnVzZS0+Y2xrKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGVmdXNlLT5kZXYsICJmYWlsZWQgdG8gcHJlcGFyZS9lbmFibGUgZWZ1c2UgY2xrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhZGRyX3N0YXJ0ID0gcm91bmRkb3duKG9mZnNldCwgUkszMzk5X05CWVRFUykgLyBSSzMzOTlfTkJZVEVTOworCWFkZHJfZW5kID0gcm91bmR1cChvZmZzZXQgKyBieXRlcywgUkszMzk5X05CWVRFUykgLyBSSzMzOTlfTkJZVEVTOworCWFkZHJfb2Zmc2V0ID0gb2Zmc2V0ICUgUkszMzk5X05CWVRFUzsKKwlhZGRyX2xlbiA9IGFkZHJfZW5kIC0gYWRkcl9zdGFydDsKKworCWJ1ZiA9IGt6YWxsb2Moc2l6ZW9mKCpidWYpICogYWRkcl9sZW4gKiBSSzMzOTlfTkJZVEVTLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZWZ1c2UtPmNsayk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXdyaXRlbChSSzMzOTlfTE9BRCB8IFJLMzM5OV9QR0VOQiB8IFJLMzM5OV9TVFJPQlNGVFNFTCB8IFJLMzM5OV9SU0IsCisJICAgICAgIGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpOworCXVkZWxheSgxKTsKKwl3aGlsZSAoYWRkcl9sZW4tLSkgeworCQl3cml0ZWwocmVhZGwoZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCkgfCBSSzMzOTlfU1RST0JFIHwKKwkJICAgICAgICgoYWRkcl9zdGFydCsrICYgUkszMzk5X0FfTUFTSykgPDwgUkszMzk5X0FfU0hJRlQpLAorCQkgICAgICAgZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCk7CisJCXVkZWxheSgxKTsKKwkJb3V0X3ZhbHVlID0gcmVhZGwoZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfRE9VVCk7CisJCXdyaXRlbChyZWFkbChlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKSAmICh+UkszMzk5X1NUUk9CRSksCisJCSAgICAgICBlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKTsKKwkJdWRlbGF5KDEpOworCisJCW1lbWNweSgmYnVmW2ldLCAmb3V0X3ZhbHVlLCBSSzMzOTlfTkJZVEVTKTsKKwkJaSArPSBSSzMzOTlfTkJZVEVTOworCX0KKworCS8qIFN3aXRjaCB0byBzdGFuZGJ5IG1vZGUgKi8KKwl3cml0ZWwoUkszMzk5X1BEIHwgUkszMzk5X0NTQiwgZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCk7CisKKwltZW1jcHkodmFsLCBidWYgKyBhZGRyX29mZnNldCwgYnl0ZXMpOworCisJa2ZyZWUoYnVmKTsKIAogCWNsa19kaXNhYmxlX3VucHJlcGFyZShlZnVzZS0+Y2xrKTsKIApAQCAtODksNyArMTU2LDI3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByb2NrY2hpcF9lZnVzZV9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscm9ja2NoaXAtZWZ1c2UiLCB9LAorCS8qIGRlcHJlY2F0ZWQgYnV0IGtlcHQgYXJvdW5kIGZvciBkdHMgYmluZGluZyBjb21wYXRpYmlsaXR5ICovCisJeworCQkuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyb2NrY2hpcC1lZnVzZSIsCisJCS5kYXRhID0gKHZvaWQgKikmcm9ja2NoaXBfcmszMjg4X2VmdXNlX3JlYWQsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzA2NmEtZWZ1c2UiLAorCQkuZGF0YSA9ICh2b2lkICopJnJvY2tjaGlwX3JrMzI4OF9lZnVzZV9yZWFkLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMxODgtZWZ1c2UiLAorCQkuZGF0YSA9ICh2b2lkICopJnJvY2tjaGlwX3JrMzI4OF9lZnVzZV9yZWFkLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMyODgtZWZ1c2UiLAorCQkuZGF0YSA9ICh2b2lkICopJnJvY2tjaGlwX3JrMzI4OF9lZnVzZV9yZWFkLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktZWZ1c2UiLAorCQkuZGF0YSA9ICh2b2lkICopJnJvY2tjaGlwX3JrMzM5OV9lZnVzZV9yZWFkLAorCX0sCiAJeyAvKiBzZW50aW5lbCAqL30sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcm9ja2NoaXBfZWZ1c2VfbWF0Y2gpOwpAQCAtOTksNiArMTg2LDE0IEBACiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJc3RydWN0IG52bWVtX2RldmljZSAqbnZtZW07CiAJc3RydWN0IHJvY2tjaGlwX2VmdXNlX2NoaXAgKmVmdXNlOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisKKwltYXRjaCA9IG9mX21hdGNoX2RldmljZShkZXYtPmRyaXZlci0+b2ZfbWF0Y2hfdGFibGUsIGRldik7CisJaWYgKCFtYXRjaCB8fCAhbWF0Y2gtPmRhdGEpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IG1hdGNoIGRhdGFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAllZnVzZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHJvY2tjaGlwX2VmdXNlX2NoaXApLAogCQkJICAgICBHRlBfS0VSTkVMKTsKQEAgLTExNiw3ICsyMTEsNyBAQAogCiAJZWZ1c2UtPmRldiA9ICZwZGV2LT5kZXY7CiAJZWNvbmZpZy5zaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwotCWVjb25maWcucmVnX3JlYWQgPSByb2NrY2hpcF9lZnVzZV9yZWFkOworCWVjb25maWcucmVnX3JlYWQgPSBtYXRjaC0+ZGF0YTsKIAllY29uZmlnLnByaXYgPSBlZnVzZTsKIAllY29uZmlnLmRldiA9IGVmdXNlLT5kZXY7CiAJbnZtZW0gPSBudm1lbV9yZWdpc3RlcigmZWNvbmZpZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL2Jhc2UuYyBiL2RyaXZlcnMvb2YvYmFzZS5jCmluZGV4IDc3OTIyNjYuLmEwYmNjYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvYmFzZS5jCisrKyBiL2RyaXZlcnMvb2YvYmFzZS5jCkBAIC0xMTQ2LDE2ICsxMTQ2LDE4IEBACiAgKgogICogQG5wOgkJZGV2aWNlIG5vZGUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdG8gYmUgcmVhZC4KICAqIEBwcm9wbmFtZToJbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2VhcmNoZWQuCi0gKiBAbGVuOglyZXF1ZXN0ZWQgbGVuZ3RoIG9mIHByb3BlcnR5IHZhbHVlCisgKiBAbWluOgltaW5pbXVtIGFsbG93ZWQgbGVuZ3RoIG9mIHByb3BlcnR5IHZhbHVlCisgKiBAbWF4OgltYXhpbXVtIGFsbG93ZWQgbGVuZ3RoIG9mIHByb3BlcnR5IHZhbHVlICgwIG1lYW5zIHVubGltaXRlZCkKKyAqIEBsZW46CWlmICE9TlVMTCwgYWN0dWFsIGxlbmd0aCBpcyB3cml0dGVuIHRvIGhlcmUKICAqCiAgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgdmFsaWQgdGhlIHJlcXVlc3RlZCBzaXplLgogICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkgZG9lcyBub3QKICAqICBleGlzdCwgLUVOT0RBVEEgaWYgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgLUVPVkVSRkxPVyBpZiB0aGUKLSAqIHByb3BlcnR5IGRhdGEgaXNuJ3QgbGFyZ2UgZW5vdWdoLgorICogcHJvcGVydHkgZGF0YSBpcyB0b28gc21hbGwgb3IgdG9vIGxhcmdlLgogICoKICAqLwogc3RhdGljIHZvaWQgKm9mX2ZpbmRfcHJvcGVydHlfdmFsdWVfb2Zfc2l6ZShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIHUzMiBsZW4pCisJCQljb25zdCBjaGFyICpwcm9wbmFtZSwgdTMyIG1pbiwgdTMyIG1heCwgc2l6ZV90ICpsZW4pCiB7CiAJc3RydWN0IHByb3BlcnR5ICpwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgcHJvcG5hbWUsIE5VTEwpOwogCkBAIC0xMTYzLDggKzExNjUsMTMgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJaWYgKCFwcm9wLT52YWx1ZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0RBVEEpOwotCWlmIChsZW4gPiBwcm9wLT5sZW5ndGgpCisJaWYgKHByb3AtPmxlbmd0aCA8IG1pbikKIAkJcmV0dXJuIEVSUl9QVFIoLUVPVkVSRkxPVyk7CisJaWYgKG1heCAmJiBwcm9wLT5sZW5ndGggPiBtYXgpCisJCXJldHVybiBFUlJfUFRSKC1FT1ZFUkZMT1cpOworCisJaWYgKGxlbikKKwkJKmxlbiA9IHByb3AtPmxlbmd0aDsKIAogCXJldHVybiBwcm9wLT52YWx1ZTsKIH0KQEAgLTExODksNyArMTE5Niw5IEBACiAJCQkJICAgICAgIHUzMiBpbmRleCwgdTMyICpvdXRfdmFsdWUpCiB7CiAJY29uc3QgdTMyICp2YWwgPSBvZl9maW5kX3Byb3BlcnR5X3ZhbHVlX29mX3NpemUobnAsIHByb3BuYW1lLAotCQkJCQkoKGluZGV4ICsgMSkgKiBzaXplb2YoKm91dF92YWx1ZSkpKTsKKwkJCQkJKChpbmRleCArIDEpICogc2l6ZW9mKCpvdXRfdmFsdWUpKSwKKwkJCQkJMCwKKwkJCQkJTlVMTCk7CiAKIAlpZiAoSVNfRVJSKHZhbCkpCiAJCXJldHVybiBQVFJfRVJSKHZhbCk7CkBAIC0xMjAwLDEwMiArMTIwOSwxNDUgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKG9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KTsKIAogLyoqCi0gKiBvZl9wcm9wZXJ0eV9yZWFkX3U4X2FycmF5IC0gRmluZCBhbmQgcmVhZCBhbiBhcnJheSBvZiB1OCBmcm9tIGEgcHJvcGVydHkuCisgKiBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3U4X2FycmF5IC0gRmluZCBhbmQgcmVhZCBhbiBhcnJheSBvZiB1OCBmcm9tIGEKKyAqIHByb3BlcnR5LCB3aXRoIGJvdW5kcyBvbiB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBhcnJheSBzaXplLgogICoKICAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCiAgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgogICogQG91dF92YWx1ZXM6CXBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlLCBtb2RpZmllZCBvbmx5IGlmIHJldHVybiB2YWx1ZSBpcyAwLgotICogQHN6OgkJbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQKKyAqIEBzel9taW46CW1pbmltdW0gbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQKKyAqIEBzel9tYXg6CW1heGltdW0gbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQsIGlmIHplcm8gdGhlcmUgaXMgbm8KKyAqCQl1cHBlciBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBkdHMgZW50cnkgYnV0IG9ubHkKKyAqCQlzel9taW4gd2lsbCBiZSByZWFkLgogICoKICAqIFNlYXJjaCBmb3IgYSBwcm9wZXJ0eSBpbiBhIGRldmljZSBub2RlIGFuZCByZWFkIDgtYml0IHZhbHVlKHMpIGZyb20KLSAqIGl0LiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QsCi0gKiAtRU5PREFUQSBpZiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsIGFuZCAtRU9WRVJGTE9XIGlmIHRoZQotICogcHJvcGVydHkgZGF0YSBpc24ndCBsYXJnZSBlbm91Z2guCisgKiBpdC4gUmV0dXJucyBudW1iZXIgb2YgZWxlbWVudHMgcmVhZCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eQorICogZG9lcyBub3QgZXhpc3QsIC1FTk9EQVRBIGlmIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FT1ZFUkZMT1cKKyAqIGlmIHRoZSBwcm9wZXJ0eSBkYXRhIGlzIHNtYWxsZXIgdGhhbiBzel9taW4gb3IgbG9uZ2VyIHRoYW4gc3pfbWF4LgogICoKICAqIGR0cyBlbnRyeSBvZiBhcnJheSBzaG91bGQgYmUgbGlrZToKICAqCXByb3BlcnR5ID0gL2JpdHMvIDggPDB4NTAgMHg2MCAweDcwPjsKICAqCiAgKiBUaGUgb3V0X3ZhbHVlcyBpcyBtb2RpZmllZCBvbmx5IGlmIGEgdmFsaWQgdTggdmFsdWUgY2FuIGJlIGRlY29kZWQuCiAgKi8KLWludCBvZl9wcm9wZXJ0eV9yZWFkX3U4X2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQljb25zdCBjaGFyICpwcm9wbmFtZSwgdTggKm91dF92YWx1ZXMsIHNpemVfdCBzeikKK2ludCBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3U4X2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCWNvbnN0IGNoYXIgKnByb3BuYW1lLCB1OCAqb3V0X3ZhbHVlcywKKwkJCQkJc2l6ZV90IHN6X21pbiwgc2l6ZV90IHN6X21heCkKIHsKKwlzaXplX3Qgc3osIGNvdW50OwogCWNvbnN0IHU4ICp2YWwgPSBvZl9maW5kX3Byb3BlcnR5X3ZhbHVlX29mX3NpemUobnAsIHByb3BuYW1lLAotCQkJCQkJKHN6ICogc2l6ZW9mKCpvdXRfdmFsdWVzKSkpOworCQkJCQkJKHN6X21pbiAqIHNpemVvZigqb3V0X3ZhbHVlcykpLAorCQkJCQkJKHN6X21heCAqIHNpemVvZigqb3V0X3ZhbHVlcykpLAorCQkJCQkJJnN6KTsKIAogCWlmIChJU19FUlIodmFsKSkKIAkJcmV0dXJuIFBUUl9FUlIodmFsKTsKIAotCXdoaWxlIChzei0tKQorCWlmICghc3pfbWF4KQorCQlzeiA9IHN6X21pbjsKKwllbHNlCisJCXN6IC89IHNpemVvZigqb3V0X3ZhbHVlcyk7CisKKwljb3VudCA9IHN6OworCXdoaWxlIChjb3VudC0tKQogCQkqb3V0X3ZhbHVlcysrID0gKnZhbCsrOwotCXJldHVybiAwOworCisJcmV0dXJuIHN6OwogfQotRVhQT1JUX1NZTUJPTF9HUEwob2ZfcHJvcGVydHlfcmVhZF91OF9hcnJheSk7CitFWFBPUlRfU1lNQk9MX0dQTChvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3U4X2FycmF5KTsKIAogLyoqCi0gKiBvZl9wcm9wZXJ0eV9yZWFkX3UxNl9hcnJheSAtIEZpbmQgYW5kIHJlYWQgYW4gYXJyYXkgb2YgdTE2IGZyb20gYSBwcm9wZXJ0eS4KKyAqIG9mX3Byb3BlcnR5X3JlYWRfdmFyaWFibGVfdTE2X2FycmF5IC0gRmluZCBhbmQgcmVhZCBhbiBhcnJheSBvZiB1MTYgZnJvbSBhCisgKiBwcm9wZXJ0eSwgd2l0aCBib3VuZHMgb24gdGhlIG1pbmltdW0gYW5kIG1heGltdW0gYXJyYXkgc2l6ZS4KICAqCiAgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgogICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KICAqIEBvdXRfdmFsdWVzOglwb2ludGVyIHRvIHJldHVybiB2YWx1ZSwgbW9kaWZpZWQgb25seSBpZiByZXR1cm4gdmFsdWUgaXMgMC4KLSAqIEBzejoJCW51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkCisgKiBAc3pfbWluOgltaW5pbXVtIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkCisgKiBAc3pfbWF4OgltYXhpbXVtIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkLCBpZiB6ZXJvIHRoZXJlIGlzIG5vCisgKgkJdXBwZXIgbGltaXQgb24gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZHRzIGVudHJ5IGJ1dCBvbmx5CisgKgkJc3pfbWluIHdpbGwgYmUgcmVhZC4KICAqCiAgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgcmVhZCAxNi1iaXQgdmFsdWUocykgZnJvbQotICogaXQuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCwKLSAqIC1FTk9EQVRBIGlmIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FT1ZFUkZMT1cgaWYgdGhlCi0gKiBwcm9wZXJ0eSBkYXRhIGlzbid0IGxhcmdlIGVub3VnaC4KKyAqIGl0LiBSZXR1cm5zIG51bWJlciBvZiBlbGVtZW50cyByZWFkIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgdGhlIHByb3BlcnR5CisgKiBkb2VzIG5vdCBleGlzdCwgLUVOT0RBVEEgaWYgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgLUVPVkVSRkxPVworICogaWYgdGhlIHByb3BlcnR5IGRhdGEgaXMgc21hbGxlciB0aGFuIHN6X21pbiBvciBsb25nZXIgdGhhbiBzel9tYXguCiAgKgogICogZHRzIGVudHJ5IG9mIGFycmF5IHNob3VsZCBiZSBsaWtlOgogICoJcHJvcGVydHkgPSAvYml0cy8gMTYgPDB4NTAwMCAweDYwMDAgMHg3MDAwPjsKICAqCiAgKiBUaGUgb3V0X3ZhbHVlcyBpcyBtb2RpZmllZCBvbmx5IGlmIGEgdmFsaWQgdTE2IHZhbHVlIGNhbiBiZSBkZWNvZGVkLgogICovCi1pbnQgb2ZfcHJvcGVydHlfcmVhZF91MTZfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCWNvbnN0IGNoYXIgKnByb3BuYW1lLCB1MTYgKm91dF92YWx1ZXMsIHNpemVfdCBzeikKK2ludCBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3UxNl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQljb25zdCBjaGFyICpwcm9wbmFtZSwgdTE2ICpvdXRfdmFsdWVzLAorCQkJCQlzaXplX3Qgc3pfbWluLCBzaXplX3Qgc3pfbWF4KQogeworCXNpemVfdCBzeiwgY291bnQ7CiAJY29uc3QgX19iZTE2ICp2YWwgPSBvZl9maW5kX3Byb3BlcnR5X3ZhbHVlX29mX3NpemUobnAsIHByb3BuYW1lLAotCQkJCQkJKHN6ICogc2l6ZW9mKCpvdXRfdmFsdWVzKSkpOworCQkJCQkJKHN6X21pbiAqIHNpemVvZigqb3V0X3ZhbHVlcykpLAorCQkJCQkJKHN6X21heCAqIHNpemVvZigqb3V0X3ZhbHVlcykpLAorCQkJCQkJJnN6KTsKIAogCWlmIChJU19FUlIodmFsKSkKIAkJcmV0dXJuIFBUUl9FUlIodmFsKTsKIAotCXdoaWxlIChzei0tKQorCWlmICghc3pfbWF4KQorCQlzeiA9IHN6X21pbjsKKwllbHNlCisJCXN6IC89IHNpemVvZigqb3V0X3ZhbHVlcyk7CisKKwljb3VudCA9IHN6OworCXdoaWxlIChjb3VudC0tKQogCQkqb3V0X3ZhbHVlcysrID0gYmUxNl90b19jcHVwKHZhbCsrKTsKLQlyZXR1cm4gMDsKKworCXJldHVybiBzejsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG9mX3Byb3BlcnR5X3JlYWRfdTE2X2FycmF5KTsKK0VYUE9SVF9TWU1CT0xfR1BMKG9mX3Byb3BlcnR5X3JlYWRfdmFyaWFibGVfdTE2X2FycmF5KTsKIAogLyoqCi0gKiBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheSAtIEZpbmQgYW5kIHJlYWQgYW4gYXJyYXkgb2YgMzIgYml0IGludGVnZXJzCi0gKiBmcm9tIGEgcHJvcGVydHkuCisgKiBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3UzMl9hcnJheSAtIEZpbmQgYW5kIHJlYWQgYW4gYXJyYXkgb2YgMzIgYml0CisgKiBpbnRlZ2VycyBmcm9tIGEgcHJvcGVydHksIHdpdGggYm91bmRzIG9uIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGFycmF5IHNpemUuCiAgKgogICogQG5wOgkJZGV2aWNlIG5vZGUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdG8gYmUgcmVhZC4KICAqIEBwcm9wbmFtZToJbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2VhcmNoZWQuCiAgKiBAb3V0X3ZhbHVlczoJcG9pbnRlciB0byByZXR1cm4gdmFsdWUsIG1vZGlmaWVkIG9ubHkgaWYgcmV0dXJuIHZhbHVlIGlzIDAuCi0gKiBAc3o6CQludW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdG8gcmVhZAorICogQHN6X21pbjoJbWluaW11bSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdG8gcmVhZAorICogQHN6X21heDoJbWF4aW11bSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdG8gcmVhZCwgaWYgemVybyB0aGVyZSBpcyBubworICoJCXVwcGVyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGR0cyBlbnRyeSBidXQgb25seQorICoJCXN6X21pbiB3aWxsIGJlIHJlYWQuCiAgKgogICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIG5vZGUgYW5kIHJlYWQgMzItYml0IHZhbHVlKHMpIGZyb20KLSAqIGl0LiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QsCi0gKiAtRU5PREFUQSBpZiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsIGFuZCAtRU9WRVJGTE9XIGlmIHRoZQotICogcHJvcGVydHkgZGF0YSBpc24ndCBsYXJnZSBlbm91Z2guCisgKiBpdC4gUmV0dXJucyBudW1iZXIgb2YgZWxlbWVudHMgcmVhZCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eQorICogZG9lcyBub3QgZXhpc3QsIC1FTk9EQVRBIGlmIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FT1ZFUkZMT1cKKyAqIGlmIHRoZSBwcm9wZXJ0eSBkYXRhIGlzIHNtYWxsZXIgdGhhbiBzel9taW4gb3IgbG9uZ2VyIHRoYW4gc3pfbWF4LgogICoKICAqIFRoZSBvdXRfdmFsdWVzIGlzIG1vZGlmaWVkIG9ubHkgaWYgYSB2YWxpZCB1MzIgdmFsdWUgY2FuIGJlIGRlY29kZWQuCiAgKi8KLWludCBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAoraW50IG9mX3Byb3BlcnR5X3JlYWRfdmFyaWFibGVfdTMyX2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCiAJCQkgICAgICAgY29uc3QgY2hhciAqcHJvcG5hbWUsIHUzMiAqb3V0X3ZhbHVlcywKLQkJCSAgICAgICBzaXplX3Qgc3opCisJCQkgICAgICAgc2l6ZV90IHN6X21pbiwgc2l6ZV90IHN6X21heCkKIHsKKwlzaXplX3Qgc3osIGNvdW50OwogCWNvbnN0IF9fYmUzMiAqdmFsID0gb2ZfZmluZF9wcm9wZXJ0eV92YWx1ZV9vZl9zaXplKG5wLCBwcm9wbmFtZSwKLQkJCQkJCShzeiAqIHNpemVvZigqb3V0X3ZhbHVlcykpKTsKKwkJCQkJCShzel9taW4gKiBzaXplb2YoKm91dF92YWx1ZXMpKSwKKwkJCQkJCShzel9tYXggKiBzaXplb2YoKm91dF92YWx1ZXMpKSwKKwkJCQkJCSZzeik7CiAKIAlpZiAoSVNfRVJSKHZhbCkpCiAJCXJldHVybiBQVFJfRVJSKHZhbCk7CiAKLQl3aGlsZSAoc3otLSkKKwlpZiAoIXN6X21heCkKKwkJc3ogPSBzel9taW47CisJZWxzZQorCQlzeiAvPSBzaXplb2YoKm91dF92YWx1ZXMpOworCisJY291bnQgPSBzejsKKwl3aGlsZSAoY291bnQtLSkKIAkJKm91dF92YWx1ZXMrKyA9IGJlMzJfdG9fY3B1cCh2YWwrKyk7Ci0JcmV0dXJuIDA7CisKKwlyZXR1cm4gc3o7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheSk7CitFWFBPUlRfU1lNQk9MX0dQTChvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3UzMl9hcnJheSk7CiAKIC8qKgogICogb2ZfcHJvcGVydHlfcmVhZF91NjQgLSBGaW5kIGFuZCByZWFkIGEgNjQgYml0IGludGVnZXIgZnJvbSBhIHByb3BlcnR5CkBAIC0xMzE0LDcgKzEzNjYsOSBAQAogCQkJIHU2NCAqb3V0X3ZhbHVlKQogewogCWNvbnN0IF9fYmUzMiAqdmFsID0gb2ZfZmluZF9wcm9wZXJ0eV92YWx1ZV9vZl9zaXplKG5wLCBwcm9wbmFtZSwKLQkJCQkJCXNpemVvZigqb3V0X3ZhbHVlKSk7CisJCQkJCQlzaXplb2YoKm91dF92YWx1ZSksCisJCQkJCQkwLAorCQkJCQkJTlVMTCk7CiAKIAlpZiAoSVNfRVJSKHZhbCkpCiAJCXJldHVybiBQVFJfRVJSKHZhbCk7CkBAIC0xMzI1LDM4ICsxMzc5LDUxIEBACiBFWFBPUlRfU1lNQk9MX0dQTChvZl9wcm9wZXJ0eV9yZWFkX3U2NCk7CiAKIC8qKgotICogb2ZfcHJvcGVydHlfcmVhZF91NjRfYXJyYXkgLSBGaW5kIGFuZCByZWFkIGFuIGFycmF5IG9mIDY0IGJpdCBpbnRlZ2VycwotICogZnJvbSBhIHByb3BlcnR5LgorICogb2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91NjRfYXJyYXkgLSBGaW5kIGFuZCByZWFkIGFuIGFycmF5IG9mIDY0IGJpdAorICogaW50ZWdlcnMgZnJvbSBhIHByb3BlcnR5LCB3aXRoIGJvdW5kcyBvbiB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBhcnJheSBzaXplLgogICoKICAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCiAgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgogICogQG91dF92YWx1ZXM6CXBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlLCBtb2RpZmllZCBvbmx5IGlmIHJldHVybiB2YWx1ZSBpcyAwLgotICogQHN6OgkJbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQKKyAqIEBzel9taW46CW1pbmltdW0gbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQKKyAqIEBzel9tYXg6CW1heGltdW0gbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQsIGlmIHplcm8gdGhlcmUgaXMgbm8KKyAqCQl1cHBlciBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBkdHMgZW50cnkgYnV0IG9ubHkKKyAqCQlzel9taW4gd2lsbCBiZSByZWFkLgogICoKICAqIFNlYXJjaCBmb3IgYSBwcm9wZXJ0eSBpbiBhIGRldmljZSBub2RlIGFuZCByZWFkIDY0LWJpdCB2YWx1ZShzKSBmcm9tCi0gKiBpdC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0LAotICogLUVOT0RBVEEgaWYgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgLUVPVkVSRkxPVyBpZiB0aGUKLSAqIHByb3BlcnR5IGRhdGEgaXNuJ3QgbGFyZ2UgZW5vdWdoLgorICogaXQuIFJldHVybnMgbnVtYmVyIG9mIGVsZW1lbnRzIHJlYWQgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkKKyAqIGRvZXMgbm90IGV4aXN0LCAtRU5PREFUQSBpZiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsIGFuZCAtRU9WRVJGTE9XCisgKiBpZiB0aGUgcHJvcGVydHkgZGF0YSBpcyBzbWFsbGVyIHRoYW4gc3pfbWluIG9yIGxvbmdlciB0aGFuIHN6X21heC4KICAqCiAgKiBUaGUgb3V0X3ZhbHVlcyBpcyBtb2RpZmllZCBvbmx5IGlmIGEgdmFsaWQgdTY0IHZhbHVlIGNhbiBiZSBkZWNvZGVkLgogICovCi1pbnQgb2ZfcHJvcGVydHlfcmVhZF91NjRfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKK2ludCBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3U2NF9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJICAgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLCB1NjQgKm91dF92YWx1ZXMsCi0JCQkgICAgICAgc2l6ZV90IHN6KQorCQkJICAgICAgIHNpemVfdCBzel9taW4sIHNpemVfdCBzel9tYXgpCiB7CisJc2l6ZV90IHN6LCBjb3VudDsKIAljb25zdCBfX2JlMzIgKnZhbCA9IG9mX2ZpbmRfcHJvcGVydHlfdmFsdWVfb2Zfc2l6ZShucCwgcHJvcG5hbWUsCi0JCQkJCQkoc3ogKiBzaXplb2YoKm91dF92YWx1ZXMpKSk7CisJCQkJCQkoc3pfbWluICogc2l6ZW9mKCpvdXRfdmFsdWVzKSksCisJCQkJCQkoc3pfbWF4ICogc2l6ZW9mKCpvdXRfdmFsdWVzKSksCisJCQkJCQkmc3opOwogCiAJaWYgKElTX0VSUih2YWwpKQogCQlyZXR1cm4gUFRSX0VSUih2YWwpOwogCi0Jd2hpbGUgKHN6LS0pIHsKKwlpZiAoIXN6X21heCkKKwkJc3ogPSBzel9taW47CisJZWxzZQorCQlzeiAvPSBzaXplb2YoKm91dF92YWx1ZXMpOworCisJY291bnQgPSBzejsKKwl3aGlsZSAoY291bnQtLSkgewogCQkqb3V0X3ZhbHVlcysrID0gb2ZfcmVhZF9udW1iZXIodmFsLCAyKTsKIAkJdmFsICs9IDI7CiAJfQotCXJldHVybiAwOworCisJcmV0dXJuIHN6OwogfQotRVhQT1JUX1NZTUJPTF9HUEwob2ZfcHJvcGVydHlfcmVhZF91NjRfYXJyYXkpOworRVhQT1JUX1NZTUJPTF9HUEwob2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91NjRfYXJyYXkpOwogCiAvKioKICAqIG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nIC0gRmluZCBhbmQgcmVhZCBhIHN0cmluZyBmcm9tIGEgcHJvcGVydHkKQEAgLTE2MzEsOCArMTY5OCw3IEBACiAJICovCiAKICBlcnI6Ci0JaWYgKGl0Lm5vZGUpCi0JCW9mX25vZGVfcHV0KGl0Lm5vZGUpOworCW9mX25vZGVfcHV0KGl0Lm5vZGUpOwogCXJldHVybiByYzsKIH0KIApAQCAtMjM0MywyMCArMjQwOSwxMyBAQAogCWNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LCBpbnQgcG9ydF9yZWcsIGludCByZWcpCiB7CiAJc3RydWN0IG9mX2VuZHBvaW50IGVuZHBvaW50OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgKnByZXZfbm9kZSA9IE5VTEw7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gTlVMTDsKIAotCXdoaWxlICgxKSB7Ci0JCW5vZGUgPSBvZl9ncmFwaF9nZXRfbmV4dF9lbmRwb2ludChwYXJlbnQsIHByZXZfbm9kZSk7Ci0JCW9mX25vZGVfcHV0KHByZXZfbm9kZSk7Ci0JCWlmICghbm9kZSkKLQkJCWJyZWFrOwotCisJZm9yX2VhY2hfZW5kcG9pbnRfb2Zfbm9kZShwYXJlbnQsIG5vZGUpIHsKIAkJb2ZfZ3JhcGhfcGFyc2VfZW5kcG9pbnQobm9kZSwgJmVuZHBvaW50KTsKIAkJaWYgKCgocG9ydF9yZWcgPT0gLTEpIHx8IChlbmRwb2ludC5wb3J0ID09IHBvcnRfcmVnKSkgJiYKIAkJCSgocmVnID09IC0xKSB8fCAoZW5kcG9pbnQuaWQgPT0gcmVnKSkpCiAJCQlyZXR1cm4gbm9kZTsKLQotCQlwcmV2X25vZGUgPSBub2RlOwogCX0KIAogCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9mZHQuYyBiL2RyaXZlcnMvb2YvZmR0LmMKaW5kZXggNTVmMWI4My4uYzg5ZDVkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9mZHQuYworKysgYi9kcml2ZXJzL29mL2ZkdC5jCkBAIC01MTcsNyArNTE3LDcgQEAKIAkJcHJfd2FybmluZygiRW5kIG9mIHRyZWUgbWFya2VyIG92ZXJ3cml0dGVuOiAlMDh4XG4iLAogCQkJICAgYmUzMl90b19jcHVwKG1lbSArIHNpemUpKTsKIAotCWlmIChkZXRhY2hlZCkgeworCWlmIChkZXRhY2hlZCAmJiBteW5vZGVzKSB7CiAJCW9mX25vZGVfc2V0X2ZsYWcoKm15bm9kZXMsIE9GX0RFVEFDSEVEKTsKIAkJcHJfZGVidWcoInVuZmxhdHRlbmVkIHRyZWUgaXMgZGV0YWNoZWRcbiIpOwogCX0KQEAgLTkyNCw3ICs5MjQsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NFUklBTF9FQVJMWUNPTgogCi1zdGF0aWMgaW50IF9faW5pdCBlYXJseV9pbml0X2R0X3NjYW5fY2hvc2VuX3NlcmlhbCh2b2lkKQoraW50IF9faW5pdCBlYXJseV9pbml0X2R0X3NjYW5fY2hvc2VuX3N0ZG91dCh2b2lkKQogewogCWludCBvZmZzZXQ7CiAJY29uc3QgY2hhciAqcCwgKnEsICpvcHRpb25zID0gTlVMTDsKQEAgLTk2OCwxNSArOTY4LDYgQEAKIAl9CiAJcmV0dXJuIC1FTk9ERVY7CiB9Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNldHVwX29mX2Vhcmx5Y29uKGNoYXIgKmJ1ZikKLXsKLQlpZiAoYnVmKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBlYXJseV9pbml0X2R0X3NjYW5fY2hvc2VuX3NlcmlhbCgpOwotfQotZWFybHlfcGFyYW0oImVhcmx5Y29uIiwgc2V0dXBfb2ZfZWFybHljb24pOwogI2VuZGlmCiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9pcnEuYyBiL2RyaXZlcnMvb2YvaXJxLmMKaW5kZXggODlhNzFjNi4uYTJlNjhmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9pcnEuYworKysgYi9kcml2ZXJzL29mL2lycS5jCkBAIC01NDQsMTIgKzU0NCwxNSBAQAogCiAJCQlsaXN0X2RlbCgmZGVzYy0+bGlzdCk7CiAKKwkJCW9mX25vZGVfc2V0X2ZsYWcoZGVzYy0+ZGV2LCBPRl9QT1BVTEFURUQpOworCiAJCQlwcl9kZWJ1Zygib2ZfaXJxX2luaXQ6IGluaXQgJXMgKCVwKSwgcGFyZW50ICVwXG4iLAogCQkJCSBkZXNjLT5kZXYtPmZ1bGxfbmFtZSwKIAkJCQkgZGVzYy0+ZGV2LCBkZXNjLT5pbnRlcnJ1cHRfcGFyZW50KTsKIAkJCXJldCA9IGRlc2MtPmlycV9pbml0X2NiKGRlc2MtPmRldiwKIAkJCQkJCWRlc2MtPmludGVycnVwdF9wYXJlbnQpOwogCQkJaWYgKHJldCkgeworCQkJCW9mX25vZGVfY2xlYXJfZmxhZyhkZXNjLT5kZXYsIE9GX1BPUFVMQVRFRCk7CiAJCQkJa2ZyZWUoZGVzYyk7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC01NTksOCArNTYyLDYgQEAKIAkJCSAqIGl0cyBjaGlsZHJlbiBjYW4gZ2V0IHByb2Nlc3NlZCBpbiBhIHN1YnNlcXVlbnQgcGFzcy4KIAkJCSAqLwogCQkJbGlzdF9hZGRfdGFpbCgmZGVzYy0+bGlzdCwgJmludGNfcGFyZW50X2xpc3QpOwotCi0JCQlvZl9ub2RlX3NldF9mbGFnKGRlc2MtPmRldiwgT0ZfUE9QVUxBVEVEKTsKIAkJfQogCiAJCS8qIEdldCB0aGUgbmV4dCBwZW5kaW5nIHBhcmVudCB0aGF0IG1pZ2h0IGhhdmUgY2hpbGRyZW4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2Yvb2ZfbnVtYS5jIGIvZHJpdmVycy9vZi9vZl9udW1hLmMKaW5kZXggZWQ1YTA5Ny4uZjYzZDRiMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2Yvb2ZfbnVtYS5jCisrKyBiL2RyaXZlcnMvb2Yvb2ZfbnVtYS5jCkBAIC0xNiw2ICsxNiw4IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpICJPRjogTlVNQTogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CkBAIC00OSwxMCArNTEsOSBAQAogCQlpZiAocikKIAkJCWNvbnRpbnVlOwogCi0JCXByX2RlYnVnKCJOVU1BOiBDUFUgb24gJXVcbiIsIG5pZCk7CisJCXByX2RlYnVnKCJDUFUgb24gJXVcbiIsIG5pZCk7CiAJCWlmIChuaWQgPj0gTUFYX05VTU5PREVTKQotCQkJcHJfd2FybigiTlVNQTogTm9kZSBpZCAldSBleGNlZWRzIG1heGltdW0gdmFsdWVcbiIsCi0JCQkJbmlkKTsKKwkJCXByX3dhcm4oIk5vZGUgaWQgJXUgZXhjZWVkcyBtYXhpbXVtIHZhbHVlXG4iLCBuaWQpOwogCQllbHNlCiAJCQlub2RlX3NldChuaWQsIG51bWFfbm9kZXNfcGFyc2VkKTsKIAl9CkBAIC02MywxMyArNjQsOSBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOwogCXN0cnVjdCByZXNvdXJjZSByc3JjOwogCXUzMiBuaWQ7Ci0JaW50IHIgPSAwOworCWludCBpLCByOwogCi0JZm9yICg7OykgewotCQlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAibWVtb3J5Iik7Ci0JCWlmICghbnApCi0JCQlicmVhazsKLQorCWZvcl9lYWNoX25vZGVfYnlfdHlwZShucCwgIm1lbW9yeSIpIHsKIAkJciA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibnVtYS1ub2RlLWlkIiwgJm5pZCk7CiAJCWlmIChyID09IC1FSU5WQUwpCiAJCQkvKgpAQCAtNzgsMjcgKzc1LDIzIEBACiAJCQkgKiAibnVtYS1ub2RlLWlkIiBwcm9wZXJ0eQogCQkJICovCiAJCQljb250aW51ZTsKLQkJZWxzZSBpZiAocikKLQkJCS8qIHNvbWUgb3RoZXIgZXJyb3IgKi8KLQkJCWJyZWFrOwogCi0JCXIgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcnNyYyk7Ci0JCWlmIChyKSB7Ci0JCQlwcl9lcnIoIk5VTUE6IGJhZCByZWcgcHJvcGVydHkgaW4gbWVtb3J5IG5vZGVcbiIpOwotCQkJYnJlYWs7CisJCWlmIChuaWQgPj0gTUFYX05VTU5PREVTKSB7CisJCQlwcl93YXJuKCJOb2RlIGlkICV1IGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVxuIiwgbmlkKTsKKwkJCXIgPSAtRUlOVkFMOwogCQl9CiAKLQkJcHJfZGVidWcoIk5VTUE6ICBiYXNlID0gJWxseCBsZW4gPSAlbGx4LCBub2RlID0gJXVcbiIsCi0JCQkgcnNyYy5zdGFydCwgcnNyYy5lbmQgLSByc3JjLnN0YXJ0ICsgMSwgbmlkKTsKKwkJZm9yIChpID0gMDsgIXIgJiYgIW9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIGksICZyc3JjKTsgaSsrKQorCQkJciA9IG51bWFfYWRkX21lbWJsayhuaWQsIHJzcmMuc3RhcnQsIHJzcmMuZW5kICsgMSk7CiAKLQotCQlyID0gbnVtYV9hZGRfbWVtYmxrKG5pZCwgcnNyYy5zdGFydCwgcnNyYy5lbmQgKyAxKTsKLQkJaWYgKHIpCi0JCQlicmVhazsKKwkJaWYgKCFpIHx8IHIpIHsKKwkJCW9mX25vZGVfcHV0KG5wKTsKKwkJCXByX2VycigiYmFkIHByb3BlcnR5IGluIG1lbW9yeSBub2RlXG4iKTsKKwkJCXJldHVybiByID8gOiAtRUlOVkFMOworCQl9CiAJfQotCW9mX25vZGVfcHV0KG5wKTsKIAotCXJldHVybiByOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBvZl9udW1hX3BhcnNlX2Rpc3RhbmNlX21hcF92MShzdHJ1Y3QgZGV2aWNlX25vZGUgKm1hcCkKQEAgLTEwNywxNyArMTAwLDE3IEBACiAJaW50IGVudHJ5X2NvdW50OwogCWludCBpOwogCi0JcHJfaW5mbygiTlVNQTogcGFyc2luZyBudW1hLWRpc3RhbmNlLW1hcC12MVxuIik7CisJcHJfaW5mbygicGFyc2luZyBudW1hLWRpc3RhbmNlLW1hcC12MVxuIik7CiAKIAltYXRyaXggPSBvZl9nZXRfcHJvcGVydHkobWFwLCAiZGlzdGFuY2UtbWF0cml4IiwgTlVMTCk7CiAJaWYgKCFtYXRyaXgpIHsKLQkJcHJfZXJyKCJOVU1BOiBObyBkaXN0YW5jZS1tYXRyaXggcHJvcGVydHkgaW4gZGlzdGFuY2UtbWFwXG4iKTsKKwkJcHJfZXJyKCJObyBkaXN0YW5jZS1tYXRyaXggcHJvcGVydHkgaW4gZGlzdGFuY2UtbWFwXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJZW50cnlfY291bnQgPSBvZl9wcm9wZXJ0eV9jb3VudF91MzJfZWxlbXMobWFwLCAiZGlzdGFuY2UtbWF0cml4Iik7CiAJaWYgKGVudHJ5X2NvdW50IDw9IDApIHsKLQkJcHJfZXJyKCJOVU1BOiBJbnZhbGlkIGRpc3RhbmNlLW1hdHJpeFxuIik7CisJCXByX2VycigiSW52YWxpZCBkaXN0YW5jZS1tYXRyaXhcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEzMiw3ICsxMjUsNyBAQAogCQltYXRyaXgrKzsKIAogCQludW1hX3NldF9kaXN0YW5jZShub2RlYSwgbm9kZWIsIGRpc3RhbmNlKTsKLQkJcHJfZGVidWcoIk5VTUE6ICBkaXN0YW5jZVtub2RlJWQgLT4gbm9kZSVkXSA9ICVkXG4iLAorCQlwcl9kZWJ1ZygiZGlzdGFuY2Vbbm9kZSVkIC0+IG5vZGUlZF0gPSAlZFxuIiwKIAkJCSBub2RlYSwgbm9kZWIsIGRpc3RhbmNlKTsKIAogCQkvKiBTZXQgZGVmYXVsdCBkaXN0YW5jZSBvZiBub2RlIEItPkEgc2FtZSBhcyBBLT5CICovCkBAIC0xNjYsOCArMTU5LDYgQEAKIAlucCA9IG9mX25vZGVfZ2V0KGRldmljZSk7CiAKIAl3aGlsZSAobnApIHsKLQkJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQ7Ci0KIAkJciA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibnVtYS1ub2RlLWlkIiwgJm5pZCk7CiAJCS8qCiAJCSAqIC1FSU5WQUwgaW5kaWNhdGVzIHRoZSBwcm9wZXJ0eSB3YXMgbm90IGZvdW5kLCBhbmQKQEAgLTE3OCwyMiArMTY5LDE1IEBACiAJCWlmIChyICE9IC1FSU5WQUwpCiAJCQlicmVhazsKIAotCQlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KG5wKTsKLQkJb2Zfbm9kZV9wdXQobnApOwotCQlucCA9IHBhcmVudDsKKwkJbnAgPSBvZl9nZXRfbmV4dF9wYXJlbnQobnApOwogCX0KIAlpZiAobnAgJiYgcikKLQkJcHJfd2FybigiTlVNQTogSW52YWxpZCBcIm51bWEtbm9kZS1pZFwiIHByb3BlcnR5IGluIG5vZGUgJXNcbiIsCisJCXByX3dhcm4oIkludmFsaWQgXCJudW1hLW5vZGUtaWRcIiBwcm9wZXJ0eSBpbiBub2RlICVzXG4iLAogCQkJbnAtPm5hbWUpOwogCW9mX25vZGVfcHV0KG5wKTsKIAotCWlmICghcikgewotCQlpZiAobmlkID49IE1BWF9OVU1OT0RFUykKLQkJCXByX3dhcm4oIk5VTUE6IE5vZGUgaWQgJXUgZXhjZWVkcyBtYXhpbXVtIHZhbHVlXG4iLAotCQkJCW5pZCk7Ci0JCWVsc2UKLQkJCXJldHVybiBuaWQ7Ci0JfQorCWlmICghcikKKwkJcmV0dXJuIG5pZDsKIAogCXJldHVybiBOVU1BX05PX05PREU7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL3BsYXRmb3JtLmMgYi9kcml2ZXJzL29mL3BsYXRmb3JtLmMKaW5kZXggOGFhMTk3Ni4uZjgxMWQyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvb2YvcGxhdGZvcm0uYwpAQCAtMTQyLDYgKzE0Miw3IEBACiAJfQogCiAJZGV2LT5kZXYub2Zfbm9kZSA9IG9mX25vZGVfZ2V0KG5wKTsKKwlkZXYtPmRldi5md25vZGUgPSAmbnAtPmZ3bm9kZTsKIAlkZXYtPmRldi5wYXJlbnQgPSBwYXJlbnQgPyA6ICZwbGF0Zm9ybV9idXM7CiAKIAlpZiAoYnVzX2lkKQpAQCAtMjQxLDYgKzI0Miw3IEBACiAKIAkvKiBzZXR1cCBnZW5lcmljIGRldmljZSBpbmZvICovCiAJZGV2LT5kZXYub2Zfbm9kZSA9IG9mX25vZGVfZ2V0KG5vZGUpOworCWRldi0+ZGV2LmZ3bm9kZSA9ICZub2RlLT5md25vZGU7CiAJZGV2LT5kZXYucGFyZW50ID0gcGFyZW50ID8gOiAmcGxhdGZvcm1fYnVzOwogCWRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwbGF0Zm9ybV9kYXRhOwogCWlmIChidXNfaWQpCkBAIC00OTcsNiArNDk5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9mX3BsYXRmb3JtX2RlZmF1bHRfcG9wdWxhdGUpOwogCisjaWZuZGVmIENPTkZJR19QUEMKIHN0YXRpYyBpbnQgX19pbml0IG9mX3BsYXRmb3JtX2RlZmF1bHRfcG9wdWxhdGVfaW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKQEAgLTUyMSw2ICs1MjQsNyBAQAogCXJldHVybiAwOwogfQogYXJjaF9pbml0Y2FsbF9zeW5jKG9mX3BsYXRmb3JtX2RlZmF1bHRfcG9wdWxhdGVfaW5pdCk7CisjZW5kaWYKIAogc3RhdGljIGludCBvZl9wbGF0Zm9ybV9kZXZpY2VfZGVzdHJveShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL3RpbWVyX2ludC5jIGIvZHJpdmVycy9vcHJvZmlsZS90aW1lcl9pbnQuYwppbmRleCBiZGVmOTE2Li4yNDk4YTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL3RpbWVyX2ludC5jCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvdGltZXJfaW50LmMKQEAgLTc0LDM3ICs3NCwzOSBAQAogCXB1dF9vbmxpbmVfY3B1cygpOwogfQogCi1zdGF0aWMgaW50IG9wcm9maWxlX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQorc3RhdGljIGludCBvcHJvZmlsZV90aW1lcl9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKLQlsb25nIGNwdSA9IChsb25nKSBoY3B1OwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKLQkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgX19vcHJvZmlsZV9ocnRpbWVyX3N0YXJ0LAotCQkJCQkgTlVMTCwgMSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX0RFQUQ6Ci0JY2FzZSBDUFVfREVBRF9GUk9aRU46Ci0JCV9fb3Byb2ZpbGVfaHJ0aW1lcl9zdG9wKGNwdSk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gTk9USUZZX09LOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJX19vcHJvZmlsZV9ocnRpbWVyX3N0YXJ0KE5VTEwpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBfX3JlZmRhdGEgb3Byb2ZpbGVfY3B1X25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gb3Byb2ZpbGVfY3B1X25vdGlmeSwKLX07CitzdGF0aWMgaW50IG9wcm9maWxlX3RpbWVyX3ByZXBfZG93bih1bnNpZ25lZCBpbnQgY3B1KQoreworCV9fb3Byb2ZpbGVfaHJ0aW1lcl9zdG9wKGNwdSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIGNwdWhwX3N0YXRlIGhwX29ubGluZTsKIAogc3RhdGljIGludCBvcHJvZmlsZV9ocnRpbWVyX3NldHVwKHZvaWQpCiB7Ci0JcmV0dXJuIHJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmb3Byb2ZpbGVfY3B1X25vdGlmaWVyKTsKKwlpbnQgcmV0OworCisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9PTkxJTkVfRFlOLAorCQkJCQkib3Byb2ZpbGUvdGltZXI6b25saW5lIiwKKwkJCQkJb3Byb2ZpbGVfdGltZXJfb25saW5lLAorCQkJCQlvcHJvZmlsZV90aW1lcl9wcmVwX2Rvd24pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWhwX29ubGluZSA9IHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgb3Byb2ZpbGVfaHJ0aW1lcl9zaHV0ZG93bih2b2lkKQogewotCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZvcHJvZmlsZV9jcHVfbm90aWZpZXIpOworCWNwdWhwX3JlbW92ZV9zdGF0ZV9ub2NhbGxzKGhwX29ubGluZSk7CiB9CiAKIGludCBvcHJvZmlsZV90aW1lcl9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICpvcHMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0LWJyaWRnZS5jIGIvZHJpdmVycy9wY2kvaG9zdC1icmlkZ2UuYwppbmRleCA1ZjRhMmUwLi5hZGQ2NjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0LWJyaWRnZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QtYnJpZGdlLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKIAlicmlkZ2UtPnJlbGVhc2VfZm4gPSByZWxlYXNlX2ZuOwogCWJyaWRnZS0+cmVsZWFzZV9kYXRhID0gcmVsZWFzZV9kYXRhOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX3NldF9ob3N0X2JyaWRnZV9yZWxlYXNlKTsKIAogdm9pZCBwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbiwKIAkJCSAgICAgc3RydWN0IHJlc291cmNlICpyZXMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9tc2kuYyBiL2RyaXZlcnMvcGNpL21zaS5jCmluZGV4IGVhZmE2MTMuLmJmZGQwNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL21zaS5jCisrKyBiL2RyaXZlcnMvcGNpL21zaS5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGlfaW9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KQEAgLTU0OSwxNSArNTUwLDIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBtc2lfZGVzYyAqbXNpX3NldHVwX2VudHJ5KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBudmVjKQorc3RhdGljIHN0cnVjdCBtc2lfZGVzYyAqCittc2lfc2V0dXBfZW50cnkoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG52ZWMsIGJvb2wgYWZmaW5pdHkpCiB7Ci0JdTE2IGNvbnRyb2w7CisJc3RydWN0IGNwdW1hc2sgKm1hc2tzID0gTlVMTDsKIAlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OworCXUxNiBjb250cm9sOworCisJaWYgKGFmZmluaXR5KSB7CisJCW1hc2tzID0gaXJxX2NyZWF0ZV9hZmZpbml0eV9tYXNrcyhkZXYtPmlycV9hZmZpbml0eSwgbnZlYyk7CisJCWlmICghbWFza3MpCisJCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBhZmZpbml0eSBtYXNrcywgaWdub3JpbmdcbiIpOworCX0KIAogCS8qIE1TSSBFbnRyeSBJbml0aWFsaXphdGlvbiAqLwotCWVudHJ5ID0gYWxsb2NfbXNpX2VudHJ5KCZkZXYtPmRldik7CisJZW50cnkgPSBhbGxvY19tc2lfZW50cnkoJmRldi0+ZGV2LCBudmVjLCBtYXNrcyk7CiAJaWYgKCFlbnRyeSkKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gb3V0OwogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBkZXYtPm1zaV9jYXAgKyBQQ0lfTVNJX0ZMQUdTLCAmY29udHJvbCk7CiAKQEAgLTU2OCw4ICs1NzcsNiBAQAogCWVudHJ5LT5tc2lfYXR0cmliLmRlZmF1bHRfaXJxCT0gZGV2LT5pcnE7CS8qIFNhdmUgSU9BUElDIElSUSAqLwogCWVudHJ5LT5tc2lfYXR0cmliLm11bHRpX2NhcAk9IChjb250cm9sICYgUENJX01TSV9GTEFHU19RTUFTSykgPj4gMTsKIAllbnRyeS0+bXNpX2F0dHJpYi5tdWx0aXBsZQk9IGlsb2cyKF9fcm91bmR1cF9wb3dfb2ZfdHdvKG52ZWMpKTsKLQllbnRyeS0+bnZlY191c2VkCQk9IG52ZWM7Ci0JZW50cnktPmFmZmluaXR5CQkJPSBkZXYtPmlycV9hZmZpbml0eTsKIAogCWlmIChjb250cm9sICYgUENJX01TSV9GTEFHU182NEJJVCkKIAkJZW50cnktPm1hc2tfcG9zID0gZGV2LT5tc2lfY2FwICsgUENJX01TSV9NQVNLXzY0OwpAQCAtNTgwLDYgKzU4Nyw4IEBACiAJaWYgKGVudHJ5LT5tc2lfYXR0cmliLm1hc2tiaXQpCiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGVudHJ5LT5tYXNrX3BvcywgJmVudHJ5LT5tYXNrZWQpOwogCitvdXQ6CisJa2ZyZWUobWFza3MpOwogCXJldHVybiBlbnRyeTsKIH0KIApAQCAtNjA4LDcgKzYxNyw3IEBACiAgKiBhbiBlcnJvciwgYW5kIGEgcG9zaXRpdmUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGludGVycnVwdHMKICAqIHdoaWNoIGNvdWxkIGhhdmUgYmVlbiBhbGxvY2F0ZWQuCiAgKi8KLXN0YXRpYyBpbnQgbXNpX2NhcGFiaWxpdHlfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbnZlYykKK3N0YXRpYyBpbnQgbXNpX2NhcGFiaWxpdHlfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbnZlYywgYm9vbCBhZmZpbml0eSkKIHsKIAlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OwogCWludCByZXQ7CkBAIC02MTYsNyArNjI1LDcgQEAKIAogCXBjaV9tc2lfc2V0X2VuYWJsZShkZXYsIDApOwkvKiBEaXNhYmxlIE1TSSBkdXJpbmcgc2V0IHVwICovCiAKLQllbnRyeSA9IG1zaV9zZXR1cF9lbnRyeShkZXYsIG52ZWMpOworCWVudHJ5ID0gbXNpX3NldHVwX2VudHJ5KGRldiwgbnZlYywgYWZmaW5pdHkpOwogCWlmICghZW50cnkpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC02NzksMjggKzY4OCwyOSBAQAogfQogCiBzdGF0aWMgaW50IG1zaXhfc2V0dXBfZW50cmllcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkIF9faW9tZW0gKmJhc2UsCi0JCQkgICAgICBzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllcywgaW50IG52ZWMpCisJCQkgICAgICBzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllcywgaW50IG52ZWMsCisJCQkgICAgICBib29sIGFmZmluaXR5KQogewotCWNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrID0gTlVMTDsKKwlzdHJ1Y3QgY3B1bWFzayAqY3VybXNrLCAqbWFza3MgPSBOVUxMOwogCXN0cnVjdCBtc2lfZGVzYyAqZW50cnk7Ci0JaW50IGNwdSA9IC0xLCBpOworCWludCByZXQsIGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnZlYzsgaSsrKSB7Ci0JCWlmIChkZXYtPmlycV9hZmZpbml0eSkgewotCQkJY3B1ID0gY3B1bWFza19uZXh0KGNwdSwgZGV2LT5pcnFfYWZmaW5pdHkpOwotCQkJaWYgKGNwdSA+PSBucl9jcHVfaWRzKQotCQkJCWNwdSA9IGNwdW1hc2tfZmlyc3QoZGV2LT5pcnFfYWZmaW5pdHkpOwotCQkJbWFzayA9IGNwdW1hc2tfb2YoY3B1KTsKLQkJfQorCWlmIChhZmZpbml0eSkgeworCQltYXNrcyA9IGlycV9jcmVhdGVfYWZmaW5pdHlfbWFza3MoZGV2LT5pcnFfYWZmaW5pdHksIG52ZWMpOworCQlpZiAoIW1hc2tzKQorCQkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgYWZmaW5pdHkgbWFza3MsIGlnbm9yaW5nXG4iKTsKKwl9CiAKLQkJZW50cnkgPSBhbGxvY19tc2lfZW50cnkoJmRldi0+ZGV2KTsKKwlmb3IgKGkgPSAwLCBjdXJtc2sgPSBtYXNrczsgaSA8IG52ZWM7IGkrKykgeworCQllbnRyeSA9IGFsbG9jX21zaV9lbnRyeSgmZGV2LT5kZXYsIDEsIGN1cm1zayk7CiAJCWlmICghZW50cnkpIHsKIAkJCWlmICghaSkKIAkJCQlpb3VubWFwKGJhc2UpOwogCQkJZWxzZQogCQkJCWZyZWVfbXNpX2lycXMoZGV2KTsKIAkJCS8qIE5vIGVub3VnaCBtZW1vcnkuIERvbid0IHRyeSBhZ2FpbiAqLwotCQkJcmV0dXJuIC1FTk9NRU07CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CiAJCX0KIAogCQllbnRyeS0+bXNpX2F0dHJpYi5pc19tc2l4CT0gMTsKQEAgLTcxMSwxMiArNzIxLDE0IEBACiAJCQllbnRyeS0+bXNpX2F0dHJpYi5lbnRyeV9uciA9IGk7CiAJCWVudHJ5LT5tc2lfYXR0cmliLmRlZmF1bHRfaXJxCT0gZGV2LT5pcnE7CiAJCWVudHJ5LT5tYXNrX2Jhc2UJCT0gYmFzZTsKLQkJZW50cnktPm52ZWNfdXNlZAkJPSAxOwotCQllbnRyeS0+YWZmaW5pdHkJCQk9IG1hc2s7CiAKIAkJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsIGRldl90b19tc2lfbGlzdCgmZGV2LT5kZXYpKTsKKwkJaWYgKG1hc2tzKQorCQkJY3VybXNrKys7CiAJfQotCisJcmV0ID0gMDsKK291dDoKKwlrZnJlZShtYXNrcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc0NSw4ICs3NTcsOCBAQAogICogc2luZ2xlIE1TSS1YIGlycS4gQSByZXR1cm4gb2YgemVybyBpbmRpY2F0ZXMgdGhlIHN1Y2Nlc3NmdWwgc2V0dXAgb2YKICAqIHJlcXVlc3RlZCBNU0ktWCBlbnRyaWVzIHdpdGggYWxsb2NhdGVkIGlycXMgb3Igbm9uLXplcm8gZm9yIG90aGVyd2lzZS4KICAqKi8KLXN0YXRpYyBpbnQgbXNpeF9jYXBhYmlsaXR5X2luaXQoc3RydWN0IHBjaV9kZXYgKmRldiwKLQkJCQlzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllcywgaW50IG52ZWMpCitzdGF0aWMgaW50IG1zaXhfY2FwYWJpbGl0eV9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBtc2l4X2VudHJ5ICplbnRyaWVzLAorCQkJCWludCBudmVjLCBib29sIGFmZmluaXR5KQogewogCWludCByZXQ7CiAJdTE2IGNvbnRyb2w7CkBAIC03NjEsNyArNzczLDcgQEAKIAlpZiAoIWJhc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmV0ID0gbXNpeF9zZXR1cF9lbnRyaWVzKGRldiwgYmFzZSwgZW50cmllcywgbnZlYyk7CisJcmV0ID0gbXNpeF9zZXR1cF9lbnRyaWVzKGRldiwgYmFzZSwgZW50cmllcywgbnZlYywgYWZmaW5pdHkpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTk0MSwyMiArOTUzLDggQEAKIH0KIEVYUE9SVF9TWU1CT0wocGNpX21zaXhfdmVjX2NvdW50KTsKIAotLyoqCi0gKiBwY2lfZW5hYmxlX21zaXggLSBjb25maWd1cmUgZGV2aWNlJ3MgTVNJLVggY2FwYWJpbGl0eSBzdHJ1Y3R1cmUKLSAqIEBkZXY6IHBvaW50ZXIgdG8gdGhlIHBjaV9kZXYgZGF0YSBzdHJ1Y3R1cmUgb2YgTVNJLVggZGV2aWNlIGZ1bmN0aW9uCi0gKiBAZW50cmllczogcG9pbnRlciB0byBhbiBhcnJheSBvZiBNU0ktWCBlbnRyaWVzIChvcHRpb25hbCkKLSAqIEBudmVjOiBudW1iZXIgb2YgTVNJLVggaXJxcyByZXF1ZXN0ZWQgZm9yIGFsbG9jYXRpb24gYnkgZGV2aWNlIGRyaXZlcgotICoKLSAqIFNldHVwIHRoZSBNU0ktWCBjYXBhYmlsaXR5IHN0cnVjdHVyZSBvZiBkZXZpY2UgZnVuY3Rpb24gd2l0aCB0aGUgbnVtYmVyCi0gKiBvZiByZXF1ZXN0ZWQgaXJxcyB1cG9uIGl0cyBzb2Z0d2FyZSBkcml2ZXIgY2FsbCB0byByZXF1ZXN0IGZvcgotICogTVNJLVggbW9kZSBlbmFibGVkIG9uIGl0cyBoYXJkd2FyZSBkZXZpY2UgZnVuY3Rpb24uIEEgcmV0dXJuIG9mIHplcm8KLSAqIGluZGljYXRlcyB0aGUgc3VjY2Vzc2Z1bCBjb25maWd1cmF0aW9uIG9mIE1TSS1YIGNhcGFiaWxpdHkgc3RydWN0dXJlCi0gKiB3aXRoIG5ldyBhbGxvY2F0ZWQgTVNJLVggaXJxcy4gQSByZXR1cm4gb2YgPCAwIGluZGljYXRlcyBhIGZhaWx1cmUuCi0gKiBPciBhIHJldHVybiBvZiA+IDAgaW5kaWNhdGVzIHRoYXQgZHJpdmVyIHJlcXVlc3QgaXMgZXhjZWVkaW5nIHRoZSBudW1iZXIKLSAqIG9mIGlycXMgb3IgTVNJLVggdmVjdG9ycyBhdmFpbGFibGUuIERyaXZlciBzaG91bGQgdXNlIHRoZSByZXR1cm5lZCB2YWx1ZSB0bwotICogcmUtc2VuZCBpdHMgcmVxdWVzdC4KLSAqKi8KLWludCBwY2lfZW5hYmxlX21zaXgoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IG1zaXhfZW50cnkgKmVudHJpZXMsIGludCBudmVjKQorc3RhdGljIGludCBfX3BjaV9lbmFibGVfbXNpeChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllcywKKwkJCSAgICAgaW50IG52ZWMsIGJvb2wgYWZmaW5pdHkpCiB7CiAJaW50IG5yX2VudHJpZXM7CiAJaW50IGksIGo7CkBAIC05ODgsNyArOTg2LDI3IEBACiAJCWRldl9pbmZvKCZkZXYtPmRldiwgImNhbid0IGVuYWJsZSBNU0ktWCAoTVNJIElSUSBhbHJlYWR5IGFzc2lnbmVkKVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlyZXR1cm4gbXNpeF9jYXBhYmlsaXR5X2luaXQoZGV2LCBlbnRyaWVzLCBudmVjKTsKKwlyZXR1cm4gbXNpeF9jYXBhYmlsaXR5X2luaXQoZGV2LCBlbnRyaWVzLCBudmVjLCBhZmZpbml0eSk7Cit9CisKKy8qKgorICogcGNpX2VuYWJsZV9tc2l4IC0gY29uZmlndXJlIGRldmljZSdzIE1TSS1YIGNhcGFiaWxpdHkgc3RydWN0dXJlCisgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBwY2lfZGV2IGRhdGEgc3RydWN0dXJlIG9mIE1TSS1YIGRldmljZSBmdW5jdGlvbgorICogQGVudHJpZXM6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgTVNJLVggZW50cmllcyAob3B0aW9uYWwpCisgKiBAbnZlYzogbnVtYmVyIG9mIE1TSS1YIGlycXMgcmVxdWVzdGVkIGZvciBhbGxvY2F0aW9uIGJ5IGRldmljZSBkcml2ZXIKKyAqCisgKiBTZXR1cCB0aGUgTVNJLVggY2FwYWJpbGl0eSBzdHJ1Y3R1cmUgb2YgZGV2aWNlIGZ1bmN0aW9uIHdpdGggdGhlIG51bWJlcgorICogb2YgcmVxdWVzdGVkIGlycXMgdXBvbiBpdHMgc29mdHdhcmUgZHJpdmVyIGNhbGwgdG8gcmVxdWVzdCBmb3IKKyAqIE1TSS1YIG1vZGUgZW5hYmxlZCBvbiBpdHMgaGFyZHdhcmUgZGV2aWNlIGZ1bmN0aW9uLiBBIHJldHVybiBvZiB6ZXJvCisgKiBpbmRpY2F0ZXMgdGhlIHN1Y2Nlc3NmdWwgY29uZmlndXJhdGlvbiBvZiBNU0ktWCBjYXBhYmlsaXR5IHN0cnVjdHVyZQorICogd2l0aCBuZXcgYWxsb2NhdGVkIE1TSS1YIGlycXMuIEEgcmV0dXJuIG9mIDwgMCBpbmRpY2F0ZXMgYSBmYWlsdXJlLgorICogT3IgYSByZXR1cm4gb2YgPiAwIGluZGljYXRlcyB0aGF0IGRyaXZlciByZXF1ZXN0IGlzIGV4Y2VlZGluZyB0aGUgbnVtYmVyCisgKiBvZiBpcnFzIG9yIE1TSS1YIHZlY3RvcnMgYXZhaWxhYmxlLiBEcml2ZXIgc2hvdWxkIHVzZSB0aGUgcmV0dXJuZWQgdmFsdWUgdG8KKyAqIHJlLXNlbmQgaXRzIHJlcXVlc3QuCisgKiovCitpbnQgcGNpX2VuYWJsZV9tc2l4KHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBtc2l4X2VudHJ5ICplbnRyaWVzLCBpbnQgbnZlYykKK3sKKwlyZXR1cm4gX19wY2lfZW5hYmxlX21zaXgoZGV2LCBlbnRyaWVzLCBudmVjLCBmYWxzZSk7CiB9CiBFWFBPUlRfU1lNQk9MKHBjaV9lbmFibGVfbXNpeCk7CiAKQEAgLTEwNDEsNiArMTA1OSw3IEBACiBzdGF0aWMgaW50IF9fcGNpX2VuYWJsZV9tc2lfcmFuZ2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1pbnZlYywgaW50IG1heHZlYywKIAkJdW5zaWduZWQgaW50IGZsYWdzKQogeworCWJvb2wgYWZmaW5pdHkgPSBmbGFncyAmIFBDSV9JUlFfQUZGSU5JVFk7CiAJaW50IG52ZWM7CiAJaW50IHJjOwogCkBAIC0xMDY5LDE5ICsxMDg4LDE3IEBACiAJCW52ZWMgPSBtYXh2ZWM7CiAKIAlmb3IgKDs7KSB7Ci0JCWlmICghKGZsYWdzICYgUENJX0lSUV9OT0FGRklOSVRZKSkgewotCQkJZGV2LT5pcnFfYWZmaW5pdHkgPSBpcnFfY3JlYXRlX2FmZmluaXR5X21hc2soJm52ZWMpOworCQlpZiAoYWZmaW5pdHkpIHsKKwkJCW52ZWMgPSBpcnFfY2FsY19hZmZpbml0eV92ZWN0b3JzKGRldi0+aXJxX2FmZmluaXR5LAorCQkJCQludmVjKTsKIAkJCWlmIChudmVjIDwgbWludmVjKQogCQkJCXJldHVybiAtRU5PU1BDOwogCQl9CiAKLQkJcmMgPSBtc2lfY2FwYWJpbGl0eV9pbml0KGRldiwgbnZlYyk7CisJCXJjID0gbXNpX2NhcGFiaWxpdHlfaW5pdChkZXYsIG52ZWMsIGFmZmluaXR5KTsKIAkJaWYgKHJjID09IDApCiAJCQlyZXR1cm4gbnZlYzsKIAotCQlrZnJlZShkZXYtPmlycV9hZmZpbml0eSk7Ci0JCWRldi0+aXJxX2FmZmluaXR5ID0gTlVMTDsKLQogCQlpZiAocmMgPCAwKQogCQkJcmV0dXJuIHJjOwogCQlpZiAocmMgPCBtaW52ZWMpCkBAIC0xMTA1LDcgKzExMjIsNyBAQAogICoqLwogaW50IHBjaV9lbmFibGVfbXNpX3JhbmdlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtaW52ZWMsIGludCBtYXh2ZWMpCiB7Ci0JcmV0dXJuIF9fcGNpX2VuYWJsZV9tc2lfcmFuZ2UoZGV2LCBtaW52ZWMsIG1heHZlYywgUENJX0lSUV9OT0FGRklOSVRZKTsKKwlyZXR1cm4gX19wY2lfZW5hYmxlX21zaV9yYW5nZShkZXYsIG1pbnZlYywgbWF4dmVjLCAwKTsKIH0KIEVYUE9SVF9TWU1CT0wocGNpX2VuYWJsZV9tc2lfcmFuZ2UpOwogCkBAIC0xMTEzLDI2ICsxMTMwLDI0IEBACiAJCXN0cnVjdCBtc2l4X2VudHJ5ICplbnRyaWVzLCBpbnQgbWludmVjLCBpbnQgbWF4dmVjLAogCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0JaW50IG52ZWMgPSBtYXh2ZWM7Ci0JaW50IHJjOworCWJvb2wgYWZmaW5pdHkgPSBmbGFncyAmIFBDSV9JUlFfQUZGSU5JVFk7CisJaW50IHJjLCBudmVjID0gbWF4dmVjOwogCiAJaWYgKG1heHZlYyA8IG1pbnZlYykKIAkJcmV0dXJuIC1FUkFOR0U7CiAKIAlmb3IgKDs7KSB7Ci0JCWlmICghKGZsYWdzICYgUENJX0lSUV9OT0FGRklOSVRZKSkgewotCQkJZGV2LT5pcnFfYWZmaW5pdHkgPSBpcnFfY3JlYXRlX2FmZmluaXR5X21hc2soJm52ZWMpOworCQlpZiAoYWZmaW5pdHkpIHsKKwkJCW52ZWMgPSBpcnFfY2FsY19hZmZpbml0eV92ZWN0b3JzKGRldi0+aXJxX2FmZmluaXR5LAorCQkJCQludmVjKTsKIAkJCWlmIChudmVjIDwgbWludmVjKQogCQkJCXJldHVybiAtRU5PU1BDOwogCQl9CiAKLQkJcmMgPSBwY2lfZW5hYmxlX21zaXgoZGV2LCBlbnRyaWVzLCBudmVjKTsKKwkJcmMgPSBfX3BjaV9lbmFibGVfbXNpeChkZXYsIGVudHJpZXMsIG52ZWMsIGFmZmluaXR5KTsKIAkJaWYgKHJjID09IDApCiAJCQlyZXR1cm4gbnZlYzsKIAotCQlrZnJlZShkZXYtPmlycV9hZmZpbml0eSk7Ci0JCWRldi0+aXJxX2FmZmluaXR5ID0gTlVMTDsKLQogCQlpZiAocmMgPCAwKQogCQkJcmV0dXJuIHJjOwogCQlpZiAocmMgPCBtaW52ZWMpCkBAIC0xMTYwLDggKzExNzUsNyBAQAogaW50IHBjaV9lbmFibGVfbXNpeF9yYW5nZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllcywKIAkJaW50IG1pbnZlYywgaW50IG1heHZlYykKIHsKLQlyZXR1cm4gX19wY2lfZW5hYmxlX21zaXhfcmFuZ2UoZGV2LCBlbnRyaWVzLCBtaW52ZWMsIG1heHZlYywKLQkJCVBDSV9JUlFfTk9BRkZJTklUWSk7CisJcmV0dXJuIF9fcGNpX2VuYWJsZV9tc2l4X3JhbmdlKGRldiwgZW50cmllcywgbWludmVjLCBtYXh2ZWMsIDApOwogfQogRVhQT1JUX1NZTUJPTChwY2lfZW5hYmxlX21zaXhfcmFuZ2UpOwogCkBAIC0xMTg3LDIyICsxMjAxLDI1IEBACiB7CiAJaW50IHZlY3MgPSAtRU5PU1BDOwogCi0JaWYgKCEoZmxhZ3MgJiBQQ0lfSVJRX05PTVNJWCkpIHsKKwlpZiAoZmxhZ3MgJiBQQ0lfSVJRX01TSVgpIHsKIAkJdmVjcyA9IF9fcGNpX2VuYWJsZV9tc2l4X3JhbmdlKGRldiwgTlVMTCwgbWluX3ZlY3MsIG1heF92ZWNzLAogCQkJCWZsYWdzKTsKIAkJaWYgKHZlY3MgPiAwKQogCQkJcmV0dXJuIHZlY3M7CiAJfQogCi0JaWYgKCEoZmxhZ3MgJiBQQ0lfSVJRX05PTVNJKSkgeworCWlmIChmbGFncyAmIFBDSV9JUlFfTVNJKSB7CiAJCXZlY3MgPSBfX3BjaV9lbmFibGVfbXNpX3JhbmdlKGRldiwgbWluX3ZlY3MsIG1heF92ZWNzLCBmbGFncyk7CiAJCWlmICh2ZWNzID4gMCkKIAkJCXJldHVybiB2ZWNzOwogCX0KIAogCS8qIHVzZSBsZWdhY3kgaXJxIGlmIGFsbG93ZWQgKi8KLQlpZiAoIShmbGFncyAmIFBDSV9JUlFfTk9MRUdBQ1kpICYmIG1pbl92ZWNzID09IDEpCisJaWYgKChmbGFncyAmIFBDSV9JUlFfTEVHQUNZKSAmJiBtaW5fdmVjcyA9PSAxKSB7CisJCXBjaV9pbnR4KGRldiwgMSk7CiAJCXJldHVybiAxOworCX0KKwogCXJldHVybiB2ZWNzOwogfQogRVhQT1JUX1NZTUJPTChwY2lfYWxsb2NfaXJxX3ZlY3RvcnMpOwpAQCAtMTI1NCw2ICsxMjcxLDM3IEBACiB9CiBFWFBPUlRfU1lNQk9MKHBjaV9pcnFfdmVjdG9yKTsKIAorLyoqCisgKiBwY2lfaXJxX2dldF9hZmZpbml0eSAtIHJldHVybiB0aGUgYWZmaW5pdHkgb2YgYSBwYXJ0aWN1bGFyIG1zaSB2ZWN0b3IKKyAqIEBkZXY6CVBDSSBkZXZpY2UgdG8gb3BlcmF0ZSBvbgorICogQG5yOgkJZGV2aWNlLXJlbGF0aXZlIGludGVycnVwdCB2ZWN0b3IgaW5kZXggKDAtYmFzZWQpLgorICovCitjb25zdCBzdHJ1Y3QgY3B1bWFzayAqcGNpX2lycV9nZXRfYWZmaW5pdHkoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG5yKQoreworCWlmIChkZXYtPm1zaXhfZW5hYmxlZCkgeworCQlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OworCQlpbnQgaSA9IDA7CisKKwkJZm9yX2VhY2hfcGNpX21zaV9lbnRyeShlbnRyeSwgZGV2KSB7CisJCQlpZiAoaSA9PSBucikKKwkJCQlyZXR1cm4gZW50cnktPmFmZmluaXR5OworCQkJaSsrOworCQl9CisJCVdBUk5fT05fT05DRSgxKTsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmIChkZXYtPm1zaV9lbmFibGVkKSB7CisJCXN0cnVjdCBtc2lfZGVzYyAqZW50cnkgPSBmaXJzdF9wY2lfbXNpX2VudHJ5KGRldik7CisKKwkJaWYgKFdBUk5fT05fT05DRSghZW50cnkgfHwgbnIgPj0gZW50cnktPm52ZWNfdXNlZCkpCisJCQlyZXR1cm4gTlVMTDsKKworCQlyZXR1cm4gJmVudHJ5LT5hZmZpbml0eVtucl07CisJfSBlbHNlIHsKKwkJcmV0dXJuIGNwdV9wb3NzaWJsZV9tYXNrOworCX0KK30KK0VYUE9SVF9TWU1CT0wocGNpX2lycV9nZXRfYWZmaW5pdHkpOworCiBzdHJ1Y3QgcGNpX2RldiAqbXNpX2Rlc2NfdG9fcGNpX2RldihzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MpCiB7CiAJcmV0dXJuIHRvX3BjaV9kZXYoZGVzYy0+ZGV2KTsKQEAgLTE1MDAsOCArMTU0OCw4IEBACiAJcGNpX2Zvcl9lYWNoX2RtYV9hbGlhcyhwZGV2LCBnZXRfbXNpX2lkX2NiLCAmcmlkKTsKIAogCW9mX25vZGUgPSBpcnFfZG9tYWluX2dldF9vZl9ub2RlKGRvbWFpbik7Ci0JaWYgKG9mX25vZGUpCi0JCXJpZCA9IG9mX21zaV9tYXBfcmlkKCZwZGV2LT5kZXYsIG9mX25vZGUsIHJpZCk7CisJcmlkID0gb2Zfbm9kZSA/IG9mX21zaV9tYXBfcmlkKCZwZGV2LT5kZXYsIG9mX25vZGUsIHJpZCkgOgorCQkJaW9ydF9tc2lfbWFwX3JpZCgmcGRldi0+ZGV2LCByaWQpOwogCiAJcmV0dXJuIHJpZDsKIH0KQEAgLTE1MTcsOSArMTU2NSwxMyBAQAogICovCiBzdHJ1Y3QgaXJxX2RvbWFpbiAqcGNpX21zaV9nZXRfZGV2aWNlX2RvbWFpbihzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tOwogCXUzMiByaWQgPSAwOwogCiAJcGNpX2Zvcl9lYWNoX2RtYV9hbGlhcyhwZGV2LCBnZXRfbXNpX2lkX2NiLCAmcmlkKTsKLQlyZXR1cm4gb2ZfbXNpX21hcF9nZXRfZGV2aWNlX2RvbWFpbigmcGRldi0+ZGV2LCByaWQpOworCWRvbSA9IG9mX21zaV9tYXBfZ2V0X2RldmljZV9kb21haW4oJnBkZXYtPmRldiwgcmlkKTsKKwlpZiAoIWRvbSkKKwkJZG9tID0gaW9ydF9nZXRfZGV2aWNlX2RvbWFpbigmcGRldi0+ZGV2LCByaWQpOworCXJldHVybiBkb207CiB9CiAjZW5kaWYgLyogQ09ORklHX1BDSV9NU0lfSVJRX0RPTUFJTiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLW1pZC5jIGIvZHJpdmVycy9wY2kvcGNpLW1pZC5jCmluZGV4IGM4NzhhYTcuLjU1ZjQ1M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1taWQuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktbWlkLmMKQEAgLTYwLDggKzYwLDEzIEBACiAKICNkZWZpbmUgSUNQVShtb2RlbCkJeyBYODZfVkVORE9SX0lOVEVMLCA2LCBtb2RlbCwgWDg2X0ZFQVRVUkVfQU5ZLCB9CiAKKy8qCisgKiBUaGlzIHRhYmxlIHNob3VsZCBiZSBpbiBzeW5jIHdpdGggdGhlIG9uZSBpbgorICogYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL3B3ci5jLgorICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHg4Nl9jcHVfaWQgbHBzc19jcHVfaWRzW10gPSB7Ci0JSUNQVShJTlRFTF9GQU02X0FUT01fTUVSUklGSUVMRDEpLAorCUlDUFUoSU5URUxfRkFNNl9BVE9NX1BFTldFTEwpLAorCUlDUFUoSU5URUxfRkFNNl9BVE9NX01FUlJJRklFTEQpLAogCXt9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IGFhYjlkNTEuLjQxNTk1NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC00ODAsNiArNDgwLDMwIEBACiBFWFBPUlRfU1lNQk9MKHBjaV9maW5kX3BhcmVudF9yZXNvdXJjZSk7CiAKIC8qKgorICogcGNpX2ZpbmRfcmVzb3VyY2UgLSBSZXR1cm4gbWF0Y2hpbmcgUENJIGRldmljZSByZXNvdXJjZQorICogQGRldjogUENJIGRldmljZSB0byBxdWVyeQorICogQHJlczogUmVzb3VyY2UgdG8gbG9vayBmb3IKKyAqCisgKiBHb2VzIG92ZXIgc3RhbmRhcmQgUENJIHJlc291cmNlcyAoQkFScykgYW5kIGNoZWNrcyBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UKKyAqIGlzIHBhcnRpYWxseSBvciBmdWxseSBjb250YWluZWQgaW4gYW55IG9mIHRoZW0uIEluIHRoYXQgY2FzZSB0aGUKKyAqIG1hdGNoaW5nIHJlc291cmNlIGlzIHJldHVybmVkLCAlTlVMTCBvdGhlcndpc2UuCisgKi8KK3N0cnVjdCByZXNvdXJjZSAqcGNpX2ZpbmRfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUENJX1JPTV9SRVNPVVJDRTsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkZXYtPnJlc291cmNlW2ldOworCisJCWlmIChyLT5zdGFydCAmJiByZXNvdXJjZV9jb250YWlucyhyLCByZXMpKQorCQkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKHBjaV9maW5kX3Jlc291cmNlKTsKKworLyoqCiAgKiBwY2lfZmluZF9wY2llX3Jvb3RfcG9ydCAtIHJldHVybiBQQ0llIFJvb3QgUG9ydAogICogQGRldjogUENJIGRldmljZSB0byBxdWVyeQogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggMzdmZjAxNS4uNDRlMGZmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcXVpcmtzLmMKKysrIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKQEAgLTMzMjcsOSArMzMyNyw5IEBACiAJaWYgKG5oaS0+dmVuZG9yICE9IFBDSV9WRU5ET1JfSURfSU5URUwKIAkJICAgIHx8IChuaGktPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0lOVEVMX0xJR0hUX1JJREdFICYmCiAJCQluaGktPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0lOVEVMX0NBQ1RVU19SSURHRV80QyAmJgorCQkJbmhpLT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9JTlRFTF9GQUxDT05fUklER0VfMkNfTkhJICYmCiAJCQluaGktPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0lOVEVMX0ZBTENPTl9SSURHRV80Q19OSEkpCi0JCSAgICB8fCBuaGktPnN1YnN5c3RlbV92ZW5kb3IgIT0gMHgyMjIyCi0JCSAgICB8fCBuaGktPnN1YnN5c3RlbV9kZXZpY2UgIT0gMHgxMTExKQorCQkgICAgfHwgbmhpLT5jbGFzcyAhPSBQQ0lfQ0xBU1NfU1lTVEVNX09USEVSIDw8IDgpCiAJCWdvdG8gb3V0OwogCWRldl9pbmZvKCZkZXYtPmRldiwgInF1aXJrOiB3YWl0aW5nIGZvciB0aHVuZGVyYm9sdCB0byByZWVzdGFibGlzaCBQQ0kgdHVubmVscy4uLlxuIik7CiAJZGV2aWNlX3BtX3dhaXRfZm9yX2RldigmZGV2LT5kZXYsICZuaGktPmRldik7CkBAIC0zMzQ0LDYgKzMzNDQsOSBAQAogCQkJICAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfQ0FDVFVTX1JJREdFXzRDLAogCQkJICAgICAgIHF1aXJrX2FwcGxlX3dhaXRfZm9yX3RodW5kZXJib2x0KTsKIERFQ0xBUkVfUENJX0ZJWFVQX1JFU1VNRV9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJICAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfRkFMQ09OX1JJREdFXzJDX0JSSURHRSwKKwkJCSAgICAgICBxdWlya19hcHBsZV93YWl0X2Zvcl90aHVuZGVyYm9sdCk7CitERUNMQVJFX1BDSV9GSVhVUF9SRVNVTUVfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwKIAkJCSAgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMX0ZBTENPTl9SSURHRV80Q19CUklER0UsCiAJCQkgICAgICAgcXVpcmtfYXBwbGVfd2FpdF9mb3JfdGh1bmRlcmJvbHQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9yZW1vdmUuYyBiL2RyaXZlcnMvcGNpL3JlbW92ZS5jCmluZGV4IGQxZWY3YWMuLmY5MzU3ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3JlbW92ZS5jCisrKyBiL2RyaXZlcnMvcGNpL3JlbW92ZS5jCkBAIC00MCw2ICs0MCw3IEBACiAJbGlzdF9kZWwoJmRldi0+YnVzX2xpc3QpOwogCXVwX3dyaXRlKCZwY2lfYnVzX3NlbSk7CiAKKwlwY2lfYnJpZGdlX2QzX2RldmljZV9yZW1vdmVkKGRldik7CiAJcGNpX2ZyZWVfcmVzb3VyY2VzKGRldik7CiAJcHV0X2RldmljZSgmZGV2LT5kZXYpOwogfQpAQCAtOTYsOCArOTcsNiBAQAogCQlkZXYtPnN1Ym9yZGluYXRlID0gTlVMTDsKIAl9CiAKLQlwY2lfYnJpZGdlX2QzX2RldmljZV9yZW1vdmVkKGRldik7Ci0KIAlwY2lfZGVzdHJveV9kZXYoZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwppbmRleCBjNzQwNTllLi5mMzBjYTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlICJwY2kuaCIKIAogdW5zaWduZWQgaW50IHBjaV9mbGFnczsKQEAgLTE4NTIsOCArMTg1MywxMyBAQAogewogCXN0cnVjdCBwY2lfYnVzICpyb290X2J1czsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkocm9vdF9idXMsICZwY2lfcm9vdF9idXNlcywgbm9kZSkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJvb3RfYnVzLCAmcGNpX3Jvb3RfYnVzZXMsIG5vZGUpIHsKIAkJcGNpX2Fzc2lnbl91bmFzc2lnbmVkX3Jvb3RfYnVzX3Jlc291cmNlcyhyb290X2J1cyk7CisKKwkJLyogTWFrZSBzdXJlIHRoZSByb290IGJyaWRnZSBoYXMgYSBjb21wYW5pb24gQUNQSSBkZXZpY2U6ICovCisJCWlmIChBQ1BJX0hBTkRMRShyb290X2J1cy0+YnJpZGdlKSkKKwkJCWFjcGlfaW9hcGljX2FkZChBQ1BJX0hBTkRMRShyb290X2J1cy0+YnJpZGdlKSk7CisJfQogfQogCiB2b2lkIHBjaV9hc3NpZ25fdW5hc3NpZ25lZF9icmlkZ2VfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpicmlkZ2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9kcy5jIGIvZHJpdmVycy9wY21jaWEvZHMuYwppbmRleCA0ODllYTEwLi42OWI1ZTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9kcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2RzLmMKQEAgLTk3Nyw3ICs5NzcsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqIHJ1bnRpbWUgUE0gc3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBpbnQgcGNtY2lhX2Rldl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK3N0YXRpYyBpbnQgcGNtY2lhX2Rldl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IHBjbWNpYV9kZXZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKIHN0YXRpYyBpbnQgcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTk4NSw3ICs5ODUsNyBAQAogCWludCByYzsKIAogCWRldmljZV9sb2NrKGRldik7Ci0JcmMgPSBwY21jaWFfZGV2X3N1c3BlbmQoZGV2LCBQTVNHX1NVU1BFTkQpOworCXJjID0gcGNtY2lhX2Rldl9zdXNwZW5kKGRldik7CiAJZGV2aWNlX3VubG9jayhkZXYpOwogCXJldHVybiByYzsKIH0KQEAgLTExMzUsNyArMTEzNSw3IEBACiAKIC8qIFBNIHN1cHBvcnQsIGFsc28gbmVlZGVkIGZvciByZXNldCAqLwogCi1zdGF0aWMgaW50IHBjbWNpYV9kZXZfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgcGNtY2lhX2Rldl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYgPSB0b19wY21jaWFfZGV2KGRldik7CiAJc3RydWN0IHBjbWNpYV9kcml2ZXIgKnBfZHJ2ID0gTlVMTDsKQEAgLTE0MTAsNiArMTQxMCw5IEBACiAJLnJlbW92ZV9kZXYgPSAmcGNtY2lhX2J1c19yZW1vdmVfc29ja2V0LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHBjbWNpYV9idXNfcG1fb3BzID0geworCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHBjbWNpYV9kZXZfc3VzcGVuZCwgcGNtY2lhX2Rldl9yZXN1bWUpCit9OwogCiBzdHJ1Y3QgYnVzX3R5cGUgcGNtY2lhX2J1c190eXBlID0gewogCS5uYW1lID0gInBjbWNpYSIsCkBAIC0xNDE4LDggKzE0MjEsNyBAQAogCS5kZXZfZ3JvdXBzID0gcGNtY2lhX2Rldl9ncm91cHMsCiAJLnByb2JlID0gcGNtY2lhX2RldmljZV9wcm9iZSwKIAkucmVtb3ZlID0gcGNtY2lhX2RldmljZV9yZW1vdmUsCi0JLnN1c3BlbmQgPSBwY21jaWFfZGV2X3N1c3BlbmQsCi0JLnJlc3VtZSA9IHBjbWNpYV9kZXZfcmVzdW1lLAorCS5wbSA9ICZwY21jaWFfYnVzX3BtX29wcywKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmMKaW5kZXggNDgzZjkxOS4uOTFiNWY1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5jCkBAIC0yMTQsOSArMjE0LDggQEAKIH0KICNlbmRpZgogCi12b2lkIHB4YTJ4eF9jb25maWd1cmVfc29ja2V0cyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit2b2lkIHB4YTJ4eF9jb25maWd1cmVfc29ja2V0cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwY21jaWFfbG93X2xldmVsICpvcHMpCiB7Ci0Jc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgKm9wcyA9IGRldi0+cGxhdGZvcm1fZGF0YTsKIAkvKgogCSAqIFdlIGhhdmUgYXQgbGVhc3Qgb25lIHNvY2tldCwgc28gc2V0IE1FQ1I6Q0lUCiAJICogKENhcmQgSXMgVGhlcmUpCkBAIC0zMjIsNyArMzIxLDcgQEAKIAkJCWdvdG8gZXJyMTsKIAl9CiAKLQlweGEyeHhfY29uZmlndXJlX3NvY2tldHMoJmRldi0+ZGV2KTsKKwlweGEyeHhfY29uZmlndXJlX3NvY2tldHMoJmRldi0+ZGV2LCBvcHMpOwogCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIHNpbmZvKTsKIAogCXJldHVybiAwOwpAQCAtMzQ4LDcgKzM0Nyw5IEBACiAKIHN0YXRpYyBpbnQgcHhhMnh4X2Rydl9wY21jaWFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlweGEyeHhfY29uZmlndXJlX3NvY2tldHMoZGV2KTsKKwlzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCAqb3BzID0gKHN0cnVjdCBwY21jaWFfbG93X2xldmVsICopZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJcHhhMnh4X2NvbmZpZ3VyZV9zb2NrZXRzKGRldiwgb3BzKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuaCBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmgKaW5kZXggYjYwOWI0NS4uZTU4YzdhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuaAorKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5oCkBAIC0xLDQgKzEsNCBAQAogaW50IHB4YTJ4eF9kcnZfcGNtY2lhX2FkZF9vbmUoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpOwogdm9pZCBweGEyeHhfZHJ2X3BjbWNpYV9vcHMoc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgKm9wcyk7Ci12b2lkIHB4YTJ4eF9jb25maWd1cmVfc29ja2V0cyhzdHJ1Y3QgZGV2aWNlICpkZXYpOwordm9pZCBweGEyeHhfY29uZmlndXJlX3NvY2tldHMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCAqb3BzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc2ExMTExX2JhZGdlNC5jIGIvZHJpdmVycy9wY21jaWEvc2ExMTExX2JhZGdlNC5jCmluZGV4IDEyZjBkZDAuLjJmNDkwOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9iYWRnZTQuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zYTExMTFfYmFkZ2U0LmMKQEAgLTEzNCwyMCArMTM0LDE0IEBACiAKIGludCBwY21jaWFfYmFkZ2U0X2luaXQoc3RydWN0IHNhMTExMV9kZXYgKmRldikKIHsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKKwlwcmludGsoS0VSTl9JTkZPCisJICAgICAgICIlczogYmFkZ2U0X3BjbXZjYz0lZCwgYmFkZ2U0X3BjbXZwcD0lZCwgYmFkZ2U0X2NmdmNjPSVkXG4iLAorCSAgICAgICBfX2Z1bmNfXywKKwkgICAgICAgYmFkZ2U0X3BjbXZjYywgYmFkZ2U0X3BjbXZwcCwgYmFkZ2U0X2NmdmNjKTsKIAotCWlmIChtYWNoaW5lX2lzX2JhZGdlNCgpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICIlczogYmFkZ2U0X3BjbXZjYz0lZCwgYmFkZ2U0X3BjbXZwcD0lZCwgYmFkZ2U0X2NmdmNjPSVkXG4iLAotCQkgICAgICAgX19mdW5jX18sCi0JCSAgICAgICBiYWRnZTRfcGNtdmNjLCBiYWRnZTRfcGNtdnBwLCBiYWRnZTRfY2Z2Y2MpOwotCi0JCXNhMTF4eF9kcnZfcGNtY2lhX29wcygmYmFkZ2U0X3BjbWNpYV9vcHMpOwotCQlyZXQgPSBzYTExMTFfcGNtY2lhX2FkZChkZXYsICZiYWRnZTRfcGNtY2lhX29wcywKLQkJCQlzYTExeHhfZHJ2X3BjbWNpYV9hZGRfb25lKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCXNhMTF4eF9kcnZfcGNtY2lhX29wcygmYmFkZ2U0X3BjbWNpYV9vcHMpOworCXJldHVybiBzYTExMTFfcGNtY2lhX2FkZChkZXYsICZiYWRnZTRfcGNtY2lhX29wcywKKwkJCQkgc2ExMXh4X2Rydl9wY21jaWFfYWRkX29uZSk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHBjbXZfc2V0dXAoY2hhciAqcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9nZW5lcmljLmMgYi9kcml2ZXJzL3BjbWNpYS9zYTExMTFfZ2VuZXJpYy5jCmluZGV4IGExNTMxZmUuLjNkOTVkZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9wY21jaWEvc2ExMTExX2dlbmVyaWMuYwpAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zYTExMTEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAogI2luY2x1ZGUgInNhMTExMV9nZW5lcmljLmgiCkBAIC0yMDMsMTkgKzIwNCwzMCBAQAogCXNhMTExMV93cml0ZWwoUENTU1JfUzBfU0xFRVAgfCBQQ1NTUl9TMV9TTEVFUCwgYmFzZSArIFBDU1NSKTsKIAlzYTExMTFfd3JpdGVsKFBDQ1JfUzBfRkxUIHwgUENDUl9TMV9GTFQsIGJhc2UgKyBQQ0NSKTsKIAorCXJldCA9IC1FTk9ERVY7CiAjaWZkZWYgQ09ORklHX1NBMTEwMF9CQURHRTQKLQlwY21jaWFfYmFkZ2U0X2luaXQoZGV2KTsKKwlpZiAobWFjaGluZV9pc19iYWRnZTQoKSkKKwkJcmV0ID0gcGNtY2lhX2JhZGdlNF9pbml0KGRldik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfU0ExMTAwX0pPUk5BREE3MjAKLQlwY21jaWFfam9ybmFkYTcyMF9pbml0KGRldik7CisJaWYgKG1hY2hpbmVfaXNfam9ybmFkYTcyMCgpKQorCQlyZXQgPSBwY21jaWFfam9ybmFkYTcyMF9pbml0KGRldik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQVJDSF9MVUJCT0NLCi0JcGNtY2lhX2x1YmJvY2tfaW5pdChkZXYpOworCWlmIChtYWNoaW5lX2lzX2x1YmJvY2soKSkKKwkJcmV0ID0gcGNtY2lhX2x1YmJvY2tfaW5pdChkZXYpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0FTU0FCRVRfTkVQT05TRVQKLQlwY21jaWFfbmVwb25zZXRfaW5pdChkZXYpOworCWlmIChtYWNoaW5lX2lzX2Fzc2FiZXQoKSkKKwkJcmV0ID0gcGNtY2lhX25lcG9uc2V0X2luaXQoZGV2KTsKICNlbmRpZgotCXJldHVybiAwOworCisJaWYgKHJldCkgeworCQlyZWxlYXNlX21lbV9yZWdpb24oZGV2LT5yZXMuc3RhcnQsIDUxMik7CisJCXNhMTExMV9kaXNhYmxlX2RldmljZShkZXYpOworCX0KKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcGNtY2lhX3JlbW92ZShzdHJ1Y3Qgc2ExMTExX2RldiAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc2ExMTExX2pvcm5hZGE3MjAuYyBiL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9qb3JuYWRhNzIwLmMKaW5kZXggYzJjMzA1OC4uNDgwYTNlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc2ExMTExX2pvcm5hZGE3MjAuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zYTExMTFfam9ybmFkYTcyMC5jCkBAIC05NCwyMiArOTQsMTcgQEAKIAogaW50IHBjbWNpYV9qb3JuYWRhNzIwX2luaXQoc3RydWN0IHNhMTExMV9kZXYgKnNhZGV2KQogewotCWludCByZXQgPSAtRU5PREVWOworCXVuc2lnbmVkIGludCBwaW4gPSBHUElPX0EwIHwgR1BJT19BMSB8IEdQSU9fQTIgfCBHUElPX0EzOwogCi0JaWYgKG1hY2hpbmVfaXNfam9ybmFkYTcyMCgpKSB7Ci0JCXVuc2lnbmVkIGludCBwaW4gPSBHUElPX0EwIHwgR1BJT19BMSB8IEdQSU9fQTIgfCBHUElPX0EzOworCS8qIEZpeG1lOiB3aHkgbWVzc2luZyBhcm91bmQgd2l0aCBTQTExeDAncyBHUElPMT8gKi8KKwlHUkVSIHw9IDB4MDAwMDAwMDI7CiAKLQkJR1JFUiB8PSAweDAwMDAwMDAyOworCS8qIFNldCBHUElPX0E8MzoxPiB0byBiZSBvdXRwdXRzIGZvciBQQ01DSUEvQ0YgcG93ZXIgY29udHJvbGxlcjogKi8KKwlzYTExMTFfc2V0X2lvX2RpcihzYWRldiwgcGluLCAwLCAwKTsKKwlzYTExMTFfc2V0X2lvKHNhZGV2LCBwaW4sIDApOworCXNhMTExMV9zZXRfc2xlZXBfaW8oc2FkZXYsIHBpbiwgMCk7CiAKLQkJLyogU2V0IEdQSU9fQTwzOjE+IHRvIGJlIG91dHB1dHMgZm9yIFBDTUNJQS9DRiBwb3dlciBjb250cm9sbGVyOiAqLwotCQlzYTExMTFfc2V0X2lvX2RpcihzYWRldiwgcGluLCAwLCAwKTsKLQkJc2ExMTExX3NldF9pbyhzYWRldiwgcGluLCAwKTsKLQkJc2ExMTExX3NldF9zbGVlcF9pbyhzYWRldiwgcGluLCAwKTsKLQotCQlzYTExeHhfZHJ2X3BjbWNpYV9vcHMoJmpvcm5hZGE3MjBfcGNtY2lhX29wcyk7Ci0JCXJldCA9IHNhMTExMV9wY21jaWFfYWRkKHNhZGV2LCAmam9ybmFkYTcyMF9wY21jaWFfb3BzLAotCQkJCXNhMTF4eF9kcnZfcGNtY2lhX2FkZF9vbmUpOwotCX0KLQotCXJldHVybiByZXQ7CisJc2ExMXh4X2Rydl9wY21jaWFfb3BzKCZqb3JuYWRhNzIwX3BjbWNpYV9vcHMpOworCXJldHVybiBzYTExMTFfcGNtY2lhX2FkZChzYWRldiwgJmpvcm5hZGE3MjBfcGNtY2lhX29wcywKKwkJCQkgc2ExMXh4X2Rydl9wY21jaWFfYWRkX29uZSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9zYTExMTFfbHViYm9jay5jIGIvZHJpdmVycy9wY21jaWEvc2ExMTExX2x1YmJvY2suYwppbmRleCBjNWNhZjU3Li5lNzQxZjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zYTExMTFfbHViYm9jay5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9sdWJib2NrLmMKQEAgLTIxMCwyNyArMjEwLDIxIEBACiAKIGludCBwY21jaWFfbHViYm9ja19pbml0KHN0cnVjdCBzYTExMTFfZGV2ICpzYWRldikKIHsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKKwkvKgorCSAqIFNldCBHUElPX0E8MzowPiB0byBiZSBvdXRwdXRzIGZvciB0aGUgTUFYMTYwMCwKKwkgKiBhbmQgc3dpdGNoIHRvIHN0YW5kYnkgbW9kZS4KKwkgKi8KKwlzYTExMTFfc2V0X2lvX2RpcihzYWRldiwgR1BJT19BMHxHUElPX0ExfEdQSU9fQTJ8R1BJT19BMywgMCwgMCk7CisJc2ExMTExX3NldF9pbyhzYWRldiwgR1BJT19BMHxHUElPX0ExfEdQSU9fQTJ8R1BJT19BMywgMCk7CisJc2ExMTExX3NldF9zbGVlcF9pbyhzYWRldiwgR1BJT19BMHxHUElPX0ExfEdQSU9fQTJ8R1BJT19BMywgMCk7CiAKLQlpZiAobWFjaGluZV9pc19sdWJib2NrKCkpIHsKLQkJLyoKLQkJICogU2V0IEdQSU9fQTwzOjA+IHRvIGJlIG91dHB1dHMgZm9yIHRoZSBNQVgxNjAwLAotCQkgKiBhbmQgc3dpdGNoIHRvIHN0YW5kYnkgbW9kZS4KLQkJICovCi0JCXNhMTExMV9zZXRfaW9fZGlyKHNhZGV2LCBHUElPX0EwfEdQSU9fQTF8R1BJT19BMnxHUElPX0EzLCAwLCAwKTsKLQkJc2ExMTExX3NldF9pbyhzYWRldiwgR1BJT19BMHxHUElPX0ExfEdQSU9fQTJ8R1BJT19BMywgMCk7Ci0JCXNhMTExMV9zZXRfc2xlZXBfaW8oc2FkZXYsIEdQSU9fQTB8R1BJT19BMXxHUElPX0EyfEdQSU9fQTMsIDApOworCS8qIFNldCBDRiBTb2NrZXQgMSBwb3dlciB0byBzdGFuZGJ5IG1vZGUuICovCisJbHViYm9ja19zZXRfbWlzY193cigoMSA8PCAxNSkgfCAoMSA8PCAxNCksIDApOwogCi0JCS8qIFNldCBDRiBTb2NrZXQgMSBwb3dlciB0byBzdGFuZGJ5IG1vZGUuICovCi0JCWx1YmJvY2tfc2V0X21pc2Nfd3IoKDEgPDwgMTUpIHwgKDEgPDwgMTQpLCAwKTsKLQotCQlweGEyeHhfZHJ2X3BjbWNpYV9vcHMoJmx1YmJvY2tfcGNtY2lhX29wcyk7Ci0JCXB4YTJ4eF9jb25maWd1cmVfc29ja2V0cygmc2FkZXYtPmRldik7Ci0JCXJldCA9IHNhMTExMV9wY21jaWFfYWRkKHNhZGV2LCAmbHViYm9ja19wY21jaWFfb3BzLAotCQkJCXB4YTJ4eF9kcnZfcGNtY2lhX2FkZF9vbmUpOwotCX0KLQotCXJldHVybiByZXQ7CisJcHhhMnh4X2Rydl9wY21jaWFfb3BzKCZsdWJib2NrX3BjbWNpYV9vcHMpOworCXB4YTJ4eF9jb25maWd1cmVfc29ja2V0cygmc2FkZXYtPmRldiwgJmx1YmJvY2tfcGNtY2lhX29wcyk7CisJcmV0dXJuIHNhMTExMV9wY21jaWFfYWRkKHNhZGV2LCAmbHViYm9ja19wY21jaWFfb3BzLAorCQkJCSBweGEyeHhfZHJ2X3BjbWNpYV9hZGRfb25lKTsKIH0KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc2ExMTExX25lcG9uc2V0LmMgYi9kcml2ZXJzL3BjbWNpYS9zYTExMTFfbmVwb25zZXQuYwppbmRleCAxZDc4NzM5Li4wMTljMzk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zYTExMTFfbmVwb25zZXQuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zYTExMTFfbmVwb25zZXQuYwpAQCAtMTEwLDIwICsxMTAsMTQgQEAKIAogaW50IHBjbWNpYV9uZXBvbnNldF9pbml0KHN0cnVjdCBzYTExMTFfZGV2ICpzYWRldikKIHsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKLQotCWlmIChtYWNoaW5lX2lzX2Fzc2FiZXQoKSkgewotCQkvKgotCQkgKiBTZXQgR1BJT19BPDM6MD4gdG8gYmUgb3V0cHV0cyBmb3IgdGhlIE1BWDE2MDAsCi0JCSAqIGFuZCBzd2l0Y2ggdG8gc3RhbmRieSBtb2RlLgotCQkgKi8KLQkJc2ExMTExX3NldF9pb19kaXIoc2FkZXYsIEdQSU9fQTB8R1BJT19BMXxHUElPX0EyfEdQSU9fQTMsIDAsIDApOwotCQlzYTExMTFfc2V0X2lvKHNhZGV2LCBHUElPX0EwfEdQSU9fQTF8R1BJT19BMnxHUElPX0EzLCAwKTsKLQkJc2ExMTExX3NldF9zbGVlcF9pbyhzYWRldiwgR1BJT19BMHxHUElPX0ExfEdQSU9fQTJ8R1BJT19BMywgMCk7Ci0JCXNhMTF4eF9kcnZfcGNtY2lhX29wcygmbmVwb25zZXRfcGNtY2lhX29wcyk7Ci0JCXJldCA9IHNhMTExMV9wY21jaWFfYWRkKHNhZGV2LCAmbmVwb25zZXRfcGNtY2lhX29wcywKLQkJCQlzYTExeHhfZHJ2X3BjbWNpYV9hZGRfb25lKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCS8qCisJICogU2V0IEdQSU9fQTwzOjA+IHRvIGJlIG91dHB1dHMgZm9yIHRoZSBNQVgxNjAwLAorCSAqIGFuZCBzd2l0Y2ggdG8gc3RhbmRieSBtb2RlLgorCSAqLworCXNhMTExMV9zZXRfaW9fZGlyKHNhZGV2LCBHUElPX0EwfEdQSU9fQTF8R1BJT19BMnxHUElPX0EzLCAwLCAwKTsKKwlzYTExMTFfc2V0X2lvKHNhZGV2LCBHUElPX0EwfEdQSU9fQTF8R1BJT19BMnxHUElPX0EzLCAwKTsKKwlzYTExMTFfc2V0X3NsZWVwX2lvKHNhZGV2LCBHUElPX0EwfEdQSU9fQTF8R1BJT19BMnxHUElPX0EzLCAwKTsKKwlzYTExeHhfZHJ2X3BjbWNpYV9vcHMoJm5lcG9uc2V0X3BjbWNpYV9vcHMpOworCXJldHVybiBzYTExMTFfcGNtY2lhX2FkZChzYWRldiwgJm5lcG9uc2V0X3BjbWNpYV9vcHMsCisJCQkJIHNhMTF4eF9kcnZfcGNtY2lhX2FkZF9vbmUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc2ExMXh4X2Jhc2UuYyBiL2RyaXZlcnMvcGNtY2lhL3NhMTF4eF9iYXNlLmMKaW5kZXggOWY2ZWM4Ny4uNDgxNDBhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc2ExMXh4X2Jhc2UuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zYTExeHhfYmFzZS5jCkBAIC0xNDQsMTkgKzE0NCwxOSBAQAogc2ExMTAwX3BjbWNpYV9zaG93X3RpbWluZyhzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCwgY2hhciAqYnVmKQogewogCXN0cnVjdCBzb2NfcGNtY2lhX3RpbWluZyB0aW1pbmc7Ci0JdW5zaWduZWQgaW50IGNsb2NrID0gY2xrX2dldF9yYXRlKHNrdC0+Y2xrKTsKKwl1bnNpZ25lZCBpbnQgY2xvY2sgPSBjbGtfZ2V0X3JhdGUoc2t0LT5jbGspIC8gMTAwMDsKIAl1bnNpZ25lZCBsb25nIG1lY3IgPSBNRUNSOwogCWNoYXIgKnAgPSBidWY7CiAKIAlzb2NfY29tbW9uX3BjbWNpYV9nZXRfdGltaW5nKHNrdCwgJnRpbWluZyk7CiAKLQlwKz1zcHJpbnRmKHAsICJJL08gICAgICA6ICV1ICgldSlcbiIsIHRpbWluZy5pbywKKwlwKz1zcHJpbnRmKHAsICJJL08gICAgICA6ICV1bnMgKCV1bnMpXG4iLCB0aW1pbmcuaW8sCiAJCSAgIHNhMTEwMF9wY21jaWFfY21kX3RpbWUoY2xvY2ssIE1FQ1JfQlNJT19HRVQobWVjciwgc2t0LT5ucikpKTsKIAotCXArPXNwcmludGYocCwgImF0dHJpYnV0ZTogJXUgKCV1KVxuIiwgdGltaW5nLmF0dHIsCisJcCs9c3ByaW50ZihwLCAiYXR0cmlidXRlOiAldW5zICgldW5zKVxuIiwgdGltaW5nLmF0dHIsCiAJCSAgIHNhMTEwMF9wY21jaWFfY21kX3RpbWUoY2xvY2ssIE1FQ1JfQlNBX0dFVChtZWNyLCBza3QtPm5yKSkpOwogCi0JcCs9c3ByaW50ZihwLCAiY29tbW9uICAgOiAldSAoJXUpXG4iLCB0aW1pbmcubWVtLAorCXArPXNwcmludGYocCwgImNvbW1vbiAgIDogJXVucyAoJXVucylcbiIsIHRpbWluZy5tZW0sCiAJCSAgIHNhMTEwMF9wY21jaWFfY21kX3RpbWUoY2xvY2ssIE1FQ1JfQlNNX0dFVChtZWNyLCBza3QtPm5yKSkpOwogCiAJcmV0dXJuIHAgLSBidWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmMgYi9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmMKaW5kZXggZWVkNWU5Yy4uZDVjYTc2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uYwpAQCAtMjM1LDcgKzIzNSw3IEBACiAJc3RhdCB8PSBza3QtPmNzX3N0YXRlLlZjYyA/IFNTX1BPV0VST04gOiAwOwogCiAJaWYgKHNrdC0+Y3Nfc3RhdGUuZmxhZ3MgJiBTU19JT0NBUkQpCi0JCXN0YXQgfD0gc3RhdGUuYnZkMSA/IFNTX1NUU0NIRyA6IDA7CisJCXN0YXQgfD0gc3RhdGUuYnZkMSA/IDAgOiBTU19TVFNDSEc7CiAJZWxzZSB7CiAJCWlmIChzdGF0ZS5idmQxID09IDApCiAJCQlzdGF0IHw9IFNTX0JBVERFQUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BlcmYvYXJtX3BtdS5jIGIvZHJpdmVycy9wZXJmL2FybV9wbXUuYwppbmRleCBjNDk0NjEzLi5iMzdiNTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BlcmYvYXJtX3BtdS5jCisrKyBiL2RyaXZlcnMvcGVyZi9hcm1fcG11LmMKQEAgLTUzNCw2ICs1MzQsMjQgQEAKIAlyZXR1cm4gY3B1bWFza190ZXN0X2NwdShjcHUsICZhcm1wbXUtPnN1cHBvcnRlZF9jcHVzKTsKIH0KIAorc3RhdGljIHNzaXplX3QgYXJtcG11X2NwdW1hc2tfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11ID0gdG9fYXJtX3BtdShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJcmV0dXJuIGNwdW1hcF9wcmludF90b19wYWdlYnVmKHRydWUsIGJ1ZiwgJmFybXBtdS0+c3VwcG9ydGVkX2NwdXMpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoY3B1cywgU19JUlVHTywgYXJtcG11X2NwdW1hc2tfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphcm1wbXVfY29tbW9uX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2NwdXMuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYXJtcG11X2NvbW1vbl9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGFybXBtdV9jb21tb25fYXR0cnMsCit9OworCiBzdGF0aWMgdm9pZCBhcm1wbXVfaW5pdChzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11KQogewogCWF0b21pY19zZXQoJmFybXBtdS0+YWN0aXZlX2V2ZW50cywgMCk7CkBAIC01NDksNyArNTY3LDEwIEBACiAJCS5zdG9wCQk9IGFybXBtdV9zdG9wLAogCQkucmVhZAkJPSBhcm1wbXVfcmVhZCwKIAkJLmZpbHRlcl9tYXRjaAk9IGFybXBtdV9maWx0ZXJfbWF0Y2gsCisJCS5hdHRyX2dyb3Vwcwk9IGFybXBtdS0+YXR0cl9ncm91cHMsCiAJfTsKKwlhcm1wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0NPTU1PTl0gPQorCQkmYXJtcG11X2NvbW1vbl9hdHRyX2dyb3VwOwogfQogCiAvKiBTZXQgYXQgcnVudGltZSB3aGVuIHdlIGtub3cgd2hhdCBDUFUgdHlwZSB3ZSBhcmUuICovCkBAIC02MDIsNyArNjIzLDcgQEAKIAlpcnFzID0gbWluKHBtdV9kZXZpY2UtPm51bV9yZXNvdXJjZXMsIG51bV9wb3NzaWJsZV9jcHVzKCkpOwogCiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwbXVfZGV2aWNlLCAwKTsKLQlpZiAoaXJxID49IDAgJiYgaXJxX2lzX3BlcmNwdShpcnEpKSB7CisJaWYgKGlycSA+IDAgJiYgaXJxX2lzX3BlcmNwdShpcnEpKSB7CiAJCW9uX2VhY2hfY3B1X21hc2soJmNwdV9wbXUtPnN1cHBvcnRlZF9jcHVzLAogCQkJCSBjcHVfcG11X2Rpc2FibGVfcGVyY3B1X2lycSwgJmlycSwgMSk7CiAJCWZyZWVfcGVyY3B1X2lycShpcnEsICZod19ldmVudHMtPnBlcmNwdV9wbXUpOwpAQCAtNjE2LDcgKzYzNyw3IEBACiAJCQlpZiAoIWNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgJmNwdV9wbXUtPmFjdGl2ZV9pcnFzKSkKIAkJCQljb250aW51ZTsKIAkJCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocG11X2RldmljZSwgaSk7Ci0JCQlpZiAoaXJxID49IDApCisJCQlpZiAoaXJxID4gMCkKIAkJCQlmcmVlX2lycShpcnEsIHBlcl9jcHVfcHRyKCZod19ldmVudHMtPnBlcmNwdV9wbXUsIGNwdSkpOwogCQl9CiAJfQpAQCAtNjM4LDcgKzY1OSw3IEBACiAJfQogCiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwbXVfZGV2aWNlLCAwKTsKLQlpZiAoaXJxID49IDAgJiYgaXJxX2lzX3BlcmNwdShpcnEpKSB7CisJaWYgKGlycSA+IDAgJiYgaXJxX2lzX3BlcmNwdShpcnEpKSB7CiAJCWVyciA9IHJlcXVlc3RfcGVyY3B1X2lycShpcnEsIGhhbmRsZXIsICJhcm0tcG11IiwKIAkJCQkJICZod19ldmVudHMtPnBlcmNwdV9wbXUpOwogCQlpZiAoZXJyKSB7CkBAIC02ODgsMjggKzcwOSwyMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFybV9wbXVfbG9jayk7Ci1zdGF0aWMgTElTVF9IRUFEKGFybV9wbXVfbGlzdCk7Ci0KIC8qCiAgKiBQTVUgaGFyZHdhcmUgbG9zZXMgYWxsIGNvbnRleHQgd2hlbiBhIENQVSBnb2VzIG9mZmxpbmUuCiAgKiBXaGVuIGEgQ1BVIGlzIGhvdHBsdWdnZWQgYmFjayBpbiwgc2luY2Ugc29tZSBoYXJkd2FyZSByZWdpc3RlcnMgYXJlCiAgKiBVTktOT1dOIGF0IHJlc2V0LCB0aGUgUE1VIG11c3QgYmUgZXhwbGljaXRseSByZXNldCB0byBhdm9pZCByZWFkaW5nCiAgKiBqdW5rIHZhbHVlcyBvdXQgb2YgdGhlbS4KICAqLwotc3RhdGljIGludCBhcm1fcGVyZl9zdGFydGluZ19jcHUodW5zaWduZWQgaW50IGNwdSkKK3N0YXRpYyBpbnQgYXJtX3BlcmZfc3RhcnRpbmdfY3B1KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQogewotCXN0cnVjdCBhcm1fcG11ICpwbXU7CisJc3RydWN0IGFybV9wbXUgKnBtdSA9IGhsaXN0X2VudHJ5X3NhZmUobm9kZSwgc3RydWN0IGFybV9wbXUsIG5vZGUpOwogCi0Jc3Bpbl9sb2NrKCZhcm1fcG11X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocG11LCAmYXJtX3BtdV9saXN0LCBlbnRyeSkgewotCi0JCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsICZwbXUtPnN1cHBvcnRlZF9jcHVzKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAocG11LT5yZXNldCkKLQkJCXBtdS0+cmVzZXQocG11KTsKLQl9Ci0Jc3Bpbl91bmxvY2soJmFybV9wbXVfbG9jayk7CisJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgJnBtdS0+c3VwcG9ydGVkX2NwdXMpKQorCQlyZXR1cm4gMDsKKwlpZiAocG11LT5yZXNldCkKKwkJcG11LT5yZXNldChwbXUpOwogCXJldHVybiAwOwogfQogCkBAIC04MjEsOSArODM0LDEwIEBACiAJaWYgKCFjcHVfaHdfZXZlbnRzKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNwaW5fbG9jaygmYXJtX3BtdV9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZjcHVfcG11LT5lbnRyeSwgJmFybV9wbXVfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmFybV9wbXVfbG9jayk7CisJZXJyID0gY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlX25vY2FsbHMoQ1BVSFBfQVBfUEVSRl9BUk1fU1RBUlRJTkcsCisJCQkJCSAgICAgICAmY3B1X3BtdS0+bm9kZSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKIAogCWVyciA9IGNwdV9wbV9wbXVfcmVnaXN0ZXIoY3B1X3BtdSk7CiAJaWYgKGVycikKQEAgLTg1OSw5ICs4NzMsOSBAQAogCXJldHVybiAwOwogCiBvdXRfdW5yZWdpc3RlcjoKLQlzcGluX2xvY2soJmFybV9wbXVfbG9jayk7Ci0JbGlzdF9kZWwoJmNwdV9wbXUtPmVudHJ5KTsKLQlzcGluX3VubG9jaygmYXJtX3BtdV9sb2NrKTsKKwljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyhDUFVIUF9BUF9QRVJGX0FSTV9TVEFSVElORywKKwkJCQkJICAgICZjcHVfcG11LT5ub2RlKTsKK291dF9mcmVlOgogCWZyZWVfcGVyY3B1KGNwdV9od19ldmVudHMpOwogCXJldHVybiBlcnI7CiB9CkBAIC04NjksOSArODgzLDggQEAKIHN0YXRpYyB2b2lkIGNwdV9wbXVfZGVzdHJveShzdHJ1Y3QgYXJtX3BtdSAqY3B1X3BtdSkKIHsKIAljcHVfcG1fcG11X3VucmVnaXN0ZXIoY3B1X3BtdSk7Ci0Jc3Bpbl9sb2NrKCZhcm1fcG11X2xvY2spOwotCWxpc3RfZGVsKCZjcHVfcG11LT5lbnRyeSk7Ci0Jc3Bpbl91bmxvY2soJmFybV9wbXVfbG9jayk7CisJY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlX25vY2FsbHMoQ1BVSFBfQVBfUEVSRl9BUk1fU1RBUlRJTkcsCisJCQkJCSAgICAmY3B1X3BtdS0+bm9kZSk7CiAJZnJlZV9wZXJjcHUoY3B1X3BtdS0+aHdfZXZlbnRzKTsKIH0KIApAQCAtOTE5LDEyICs5MzIsMTMgQEAKIAogCQkvKiBDaGVjayB0aGUgSVJRIHR5cGUgYW5kIHByb2hpYml0IGEgbWl4IG9mIFBQSXMgYW5kIFNQSXMgKi8KIAkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCBpKTsKLQkJaWYgKGlycSA+PSAwKSB7CisJCWlmIChpcnEgPiAwKSB7CiAJCQlib29sIHNwaSA9ICFpcnFfaXNfcGVyY3B1KGlycSk7CiAKIAkJCWlmIChpID4gMCAmJiBzcGkgIT0gdXNpbmdfc3BpKSB7CiAJCQkJcHJfZXJyKCJQUEkvU1BJIElSUSB0eXBlIG1pc21hdGNoIGZvciAlcyFcbiIsCiAJCQkJCWRuLT5uYW1lKTsKKwkJCQlvZl9ub2RlX3B1dChkbik7CiAJCQkJa2ZyZWUoaXJxcyk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CkBAIC05NjksNyArOTgzLDcgQEAKIAlpZiAoY3B1bWFza193ZWlnaHQoJnBtdS0+c3VwcG9ydGVkX2NwdXMpID09IDApIHsKIAkJaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAKLQkJaWYgKGlycV9pc19wZXJjcHUoaXJxKSkgeworCQlpZiAoaXJxID4gMCAmJiBpcnFfaXNfcGVyY3B1KGlycSkpIHsKIAkJCS8qIElmIHVzaW5nIFBQSXMsIGNoZWNrIHRoZSBhZmZpbml0eSBvZiB0aGUgcGFydGl0aW9uICovCiAJCQlpbnQgcmV0OwogCkBAIC0xMDI4LDcgKzEwNDIsNyBAQAogCQlyZXQgPSBvZl9wbXVfaXJxX2NmZyhwbXUpOwogCQlpZiAoIXJldCkKIAkJCXJldCA9IGluaXRfZm4ocG11KTsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAocHJvYmVfdGFibGUpIHsKIAkJY3B1bWFza19zZXRhbGwoJnBtdS0+c3VwcG9ydGVkX2NwdXMpOwogCQlyZXQgPSBwcm9iZV9jdXJyZW50X3BtdShwbXUsIHByb2JlX3RhYmxlKTsKIAl9CkBAIC0xMDM4LDYgKzEwNTIsNyBAQAogCQlnb3RvIG91dF9mcmVlOwogCX0KIAorCiAJcmV0ID0gY3B1X3BtdV9pbml0KHBtdSk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfZnJlZTsKQEAgLTEwNjgsOSArMTA4Myw5IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfUEVSRl9BUk1fU1RBUlRJTkcsCi0JCQkJCSJBUF9QRVJGX0FSTV9TVEFSVElORyIsCi0JCQkJCWFybV9wZXJmX3N0YXJ0aW5nX2NwdSwgTlVMTCk7CisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfQVBfUEVSRl9BUk1fU1RBUlRJTkcsCisJCQkJICAgICAgIkFQX1BFUkZfQVJNX1NUQVJUSU5HIiwKKwkJCQkgICAgICBhcm1fcGVyZl9zdGFydGluZ19jcHUsIE5VTEwpOwogCWlmIChyZXQpCiAJCXByX2VycigiQ1BVIGhvdHBsdWcgbm90aWZpZXIgZm9yIEFSTSBQTVUgY291bGQgbm90IGJlIHJlZ2lzdGVyZWQ6ICVkXG4iLAogCQkgICAgICAgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L0tjb25maWcgYi9kcml2ZXJzL3BoeS9LY29uZmlnCmluZGV4IDE5YmZmM2EuLmZlMDBmOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L0tjb25maWcKKysrIGIvZHJpdmVycy9waHkvS2NvbmZpZwpAQCAtMjQsNiArMjQsMTUgQEAKIAkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgQnJvYWRjb20gVVNCIDIuMCBQSFkgY29ubmVjdGVkIHRvIHRoZSBVU0IKIAkgIGNvbnRyb2xsZXIgb24gTm9ydGhzdGFyIGZhbWlseS4KIAorY29uZmlnIFBIWV9CQ01fTlNfVVNCMworCXRyaXN0YXRlICJCcm9hZGNvbSBOb3J0aHN0YXIgVVNCIDMuMCBQSFkgRHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9CQ01fSVBST0MgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0gJiYgT0YKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwloZWxwCisJICBFbmFibGUgdGhpcyB0byBzdXBwb3J0IEJyb2FkY29tIFVTQiAzLjAgUEhZIGNvbm5lY3RlZCB0byB0aGUgVVNCCisJICBjb250cm9sbGVyIG9uIE5vcnRoc3RhciBmYW1pbHkuCisKIGNvbmZpZyBQSFlfQkVSTElOX1VTQgogCXRyaXN0YXRlICJNYXJ2ZWxsIEJlcmxpbiBVU0IgUEhZIERyaXZlciIKIAlkZXBlbmRzIG9uIEFSQ0hfQkVSTElOICYmIFJFU0VUX0NPTlRST0xMRVIgJiYgSEFTX0lPTUVNICYmIE9GCkBAIC0yNTgsNyArMjY3LDkgQEAKIAlkZXBlbmRzIG9uIFJFU0VUX0NPTlRST0xMRVIKIAlkZXBlbmRzIG9uIEVYVENPTgogCWRlcGVuZHMgb24gUE9XRVJfU1VQUExZCisJZGVwZW5kcyBvbiBVU0JfU1VQUE9SVAogCXNlbGVjdCBHRU5FUklDX1BIWQorCXNlbGVjdCBVU0JfQ09NTU9OCiAJaGVscAogCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCB0aGUgdHJhbnNjZWl2ZXIgdGhhdCBpcyBwYXJ0IG9mIEFsbHdpbm5lcgogCSAgc3VueGkgU29Dcy4KQEAgLTM1OCw2ICszNjksMTQgQEAKIAloZWxwCiAJICBFbmFibGUgdGhpcyB0byBzdXBwb3J0IHRoZSBSb2NrY2hpcCBVU0IgMi4wIFBIWS4KIAorY29uZmlnIFBIWV9ST0NLQ0hJUF9JTk5PX1VTQjIKKwl0cmlzdGF0ZSAiUm9ja2NoaXAgSU5OTyBVU0IyUEhZIERyaXZlciIKKwlkZXBlbmRzIG9uIChBUkNIX1JPQ0tDSElQIHx8IENPTVBJTEVfVEVTVCkgJiYgT0YKKwlkZXBlbmRzIG9uIENPTU1PTl9DTEsKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwloZWxwCisJICBTdXBwb3J0IGZvciBSb2NrY2hpcCBVU0IyLjAgUEhZIHdpdGggSW5ub3NpbGljb24gSVAgYmxvY2suCisKIGNvbmZpZyBQSFlfUk9DS0NISVBfRU1NQwogCXRyaXN0YXRlICJSb2NrY2hpcCBFTU1DIFBIWSBEcml2ZXIiCiAJZGVwZW5kcyBvbiBBUkNIX1JPQ0tDSElQICYmIE9GCkBAIC0zNzIsNiArMzkxLDIzIEBACiAJaGVscAogCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCB0aGUgUm9ja2NoaXAgRGlzcGxheSBQb3J0IFBIWS4KIAorY29uZmlnIFBIWV9ST0NLQ0hJUF9QQ0lFCisJdHJpc3RhdGUgIlJvY2tjaGlwIFBDSWUgUEhZIERyaXZlciIKKwlkZXBlbmRzIG9uIChBUkNIX1JPQ0tDSElQICYmIE9GKSB8fCBDT01QSUxFX1RFU1QKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwlzZWxlY3QgTUZEX1NZU0NPTgorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgdGhlIFJvY2tjaGlwIFBDSWUgUEhZLgorCitjb25maWcgUEhZX1JPQ0tDSElQX1RZUEVDCisJdHJpc3RhdGUgIlJvY2tjaGlwIFRZUEVDIFBIWSBEcml2ZXIiCisJZGVwZW5kcyBvbiBPRiAmJiAoQVJDSF9ST0NLQ0hJUCB8fCBDT01QSUxFX1RFU1QpCisJc2VsZWN0IEVYVENPTgorCXNlbGVjdCBHRU5FUklDX1BIWQorCXNlbGVjdCBSRVNFVF9DT05UUk9MTEVSCisJaGVscAorCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCB0aGUgUm9ja2NoaXAgVVNCIFRZUEVDIFBIWS4KKwogY29uZmlnIFBIWV9TVF9TUEVBUjEzMTBfTUlQSFkKIAl0cmlzdGF0ZSAiU1QgU1BFQVIxMzEwLU1JUEhZIGRyaXZlciIKIAlzZWxlY3QgR0VORVJJQ19QSFkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L01ha2VmaWxlIGIvZHJpdmVycy9waHkvTWFrZWZpbGUKaW5kZXggOTBhZTE5OC4uYTUzNGNmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9waHkvTWFrZWZpbGUKQEAgLTQsNiArNCw3IEBACiAKIG9iai0kKENPTkZJR19HRU5FUklDX1BIWSkJCSs9IHBoeS1jb3JlLm8KIG9iai0kKENPTkZJR19QSFlfQkNNX05TX1VTQjIpCQkrPSBwaHktYmNtLW5zLXVzYjIubworb2JqLSQoQ09ORklHX1BIWV9CQ01fTlNfVVNCMykJCSs9IHBoeS1iY20tbnMtdXNiMy5vCiBvYmotJChDT05GSUdfUEhZX0JFUkxJTl9VU0IpCQkrPSBwaHktYmVybGluLXVzYi5vCiBvYmotJChDT05GSUdfUEhZX0JFUkxJTl9TQVRBKQkJKz0gcGh5LWJlcmxpbi1zYXRhLm8KIG9iai0kKENPTkZJR19QSFlfREE4WFhfVVNCKQkJKz0gcGh5LWRhOHh4LXVzYi5vCkBAIC0zOSw4ICs0MCwxMSBAQAogb2JqLSQoQ09ORklHX1BIWV9FWFlOT1M1X1VTQkRSRCkJKz0gcGh5LWV4eW5vczUtdXNiZHJkLm8KIG9iai0kKENPTkZJR19QSFlfUUNPTV9BUFE4MDY0X1NBVEEpCSs9IHBoeS1xY29tLWFwcTgwNjQtc2F0YS5vCiBvYmotJChDT05GSUdfUEhZX1JPQ0tDSElQX1VTQikgKz0gcGh5LXJvY2tjaGlwLXVzYi5vCitvYmotJChDT05GSUdfUEhZX1JPQ0tDSElQX0lOTk9fVVNCMikJKz0gcGh5LXJvY2tjaGlwLWlubm8tdXNiMi5vCiBvYmotJChDT05GSUdfUEhZX1JPQ0tDSElQX0VNTUMpICs9IHBoeS1yb2NrY2hpcC1lbW1jLm8KK29iai0kKENPTkZJR19QSFlfUk9DS0NISVBfUENJRSkgKz0gcGh5LXJvY2tjaGlwLXBjaWUubwogb2JqLSQoQ09ORklHX1BIWV9ST0NLQ0hJUF9EUCkJCSs9IHBoeS1yb2NrY2hpcC1kcC5vCitvYmotJChDT05GSUdfUEhZX1JPQ0tDSElQX1RZUEVDKSArPSBwaHktcm9ja2NoaXAtdHlwZWMubwogb2JqLSQoQ09ORklHX1BIWV9RQ09NX0lQUTgwNlhfU0FUQSkJKz0gcGh5LXFjb20taXBxODA2eC1zYXRhLm8KIG9iai0kKENPTkZJR19QSFlfU1RfU1BFQVIxMzEwX01JUEhZKQkrPSBwaHktc3BlYXIxMzEwLW1pcGh5Lm8KIG9iai0kKENPTkZJR19QSFlfU1RfU1BFQVIxMzQwX01JUEhZKQkrPSBwaHktc3BlYXIxMzQwLW1pcGh5Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1iY20tbnMtdXNiMy5jIGIvZHJpdmVycy9waHkvcGh5LWJjbS1ucy11c2IzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyMGZhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1iY20tbnMtdXNiMy5jCkBAIC0wLDAgKzEsMjc0IEBACisvKgorICogQnJvYWRjb20gTm9ydGhzdGFyIFVTQiAzLjAgUEhZIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBSYWZhxYIgTWnFgmVja2kgPHJhZmFsQG1pbGVja2kucGw+CisgKgorICogQWxsIG1hZ2ljIHZhbHVlcyB1c2VkIGZvciBpbml0aWFsaXphdGlvbiAoYW5kIHJlbGF0ZWQgY29tbWVudHMpIHdlcmUgb2J0YWluZWQKKyAqIGZyb20gQnJvYWRjb20ncyBTREs6CisgKiBDb3B5cmlnaHQgKGMpIEJyb2FkY29tIENvcnAsIDIwMTIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9iY21hL2JjbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZSBCQ01fTlNfVVNCM19NSUlfTU5HX1RJTUVPVVRfVVMJMTAwMAkvKiB1c2VjcyAqLworCitlbnVtIGJjbV9uc19mYW1pbHkgeworCUJDTV9OU19VTktOT1dOLAorCUJDTV9OU19BWCwKKwlCQ01fTlNfQlgsCit9OworCitzdHJ1Y3QgYmNtX25zX3VzYjMgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwllbnVtIGJjbV9uc19mYW1pbHkgZmFtaWx5OworCXZvaWQgX19pb21lbSAqZG1wOworCXZvaWQgX19pb21lbSAqY2NiX21paTsKKwlzdHJ1Y3QgcGh5ICpwaHk7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBiY21fbnNfdXNiM19pZF90YWJsZVtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAiYnJjbSxucy1heC11c2IzLXBoeSIsCisJCS5kYXRhID0gKGludCAqKUJDTV9OU19BWCwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAiYnJjbSxucy1ieC11c2IzLXBoeSIsCisJCS5kYXRhID0gKGludCAqKUJDTV9OU19CWCwKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGJjbV9uc191c2IzX2lkX3RhYmxlKTsKKworc3RhdGljIGludCBiY21fbnNfdXNiM193YWl0X3JlZyhzdHJ1Y3QgYmNtX25zX3VzYjMgKnVzYjMsIHZvaWQgX19pb21lbSAqYWRkciwKKwkJCQl1MzIgbWFzaywgdTMyIHZhbHVlLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJdW5zaWduZWQgbG9uZyBkZWFkbGluZSA9IGppZmZpZXMgKyB0aW1lb3V0OworCXUzMiB2YWw7CisKKwlkbyB7CisJCXZhbCA9IHJlYWRsKGFkZHIpOworCQlpZiAoKHZhbCAmIG1hc2spID09IHZhbHVlKQorCQkJcmV0dXJuIDA7CisJCWNwdV9yZWxheCgpOworCQl1ZGVsYXkoMTApOworCX0gd2hpbGUgKCF0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGRlYWRsaW5lKSk7CisKKwlkZXZfZXJyKHVzYjMtPmRldiwgIlRpbWVvdXQgd2FpdGluZyBmb3IgcmVnaXN0ZXIgJXBcbiIsIGFkZHIpOworCisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYmNtX25zX3VzYjNfbWlpX21uZ193YWl0X2lkbGUoc3RydWN0IGJjbV9uc191c2IzICp1c2IzKQoreworCXJldHVybiBiY21fbnNfdXNiM193YWl0X3JlZyh1c2IzLCB1c2IzLT5jY2JfbWlpICsgQkNNQV9DQ0JfTUlJX01OR19DVEwsCisJCQkJICAgIDB4MDEwMCwgMHgwMDAwLAorCQkJCSAgICB1c2Vjc190b19qaWZmaWVzKEJDTV9OU19VU0IzX01JSV9NTkdfVElNRU9VVF9VUykpOworfQorCitzdGF0aWMgaW50IGJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMihzdHJ1Y3QgYmNtX25zX3VzYjMgKnVzYjMsIHUzMiB2YWx1ZSkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gYmNtX25zX3VzYjNfbWlpX21uZ193YWl0X2lkbGUodXNiMyk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2Vycih1c2IzLT5kZXYsICJDb3VsZG4ndCB3cml0ZSAweCUwOHggdmFsdWVcbiIsIHZhbHVlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl3cml0ZWwodmFsdWUsIHVzYjMtPmNjYl9taWkgKyBCQ01BX0NDQl9NSUlfTU5HX0NNRF9EQVRBKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbV9uc191c2IzX3BoeV9pbml0X25zX2J4KHN0cnVjdCBiY21fbnNfdXNiMyAqdXNiMykKK3sKKwlpbnQgZXJyOworCisJLyogRW5hYmxlIE1ESU8uIFNldHRpbmcgTURDRElWIGFzIDI2ICAqLworCXdyaXRlbCgweDAwMDAwMDlhLCB1c2IzLT5jY2JfbWlpICsgQkNNQV9DQ0JfTUlJX01OR19DVEwpOworCisJLyogV2FpdCBmb3IgTURJTz8gKi8KKwl1ZGVsYXkoMik7CisKKwkvKiBVU0IzIFBMTCBCbG9jayAqLworCWVyciA9IGJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4N2U4MDAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIEFzc2VydCBBbmFfUGxsc2VxIHN0YXJ0ICovCisJYmNtX25zX3VzYjNfbWlpX21uZ193cml0ZTMyKHVzYjMsIDB4NTgwNjEwMDApOworCisJLyogQXNzZXJ0IENNTCBEaXZpZGVyIHJhdGlvIHRvIDI2ICovCisJYmNtX25zX3VzYjNfbWlpX21uZ193cml0ZTMyKHVzYjMsIDB4NTgyYTY0MDApOworCisJLyogQXNzZXJ0aW5nIFBMTCBSZXNldCAqLworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4MmVjMDAwKTsKKworCS8qIERlYWFzZXJ0aW5nIFBMTCBSZXNldCAqLworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4MmU4MDAwKTsKKworCS8qIFdhaXRpbmcgTUlJIE1ndCBpbnRlcmZhY2UgaWRsZSAqLworCWJjbV9uc191c2IzX21paV9tbmdfd2FpdF9pZGxlKHVzYjMpOworCisJLyogRGVhc3NlcnRpbmcgVVNCMyBzeXN0ZW0gcmVzZXQgKi8KKwl3cml0ZWwoMCwgdXNiMy0+ZG1wICsgQkNNQV9SRVNFVF9DVEwpOworCisJLyogUExMIGZyZXF1ZW5jeSBtb25pdG9yIGVuYWJsZSAqLworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4MDY5MDAwKTsKKworCS8qIFBJUEUgQmxvY2sgKi8KKwliY21fbnNfdXNiM19taWlfbW5nX3dyaXRlMzIodXNiMywgMHg1ODdlODA2MCk7CisKKwkvKiBDTVBNQVggJiBDTVBNSU5USCBzZXR0aW5nICovCisJYmNtX25zX3VzYjNfbWlpX21uZ193cml0ZTMyKHVzYjMsIDB4NTgwYWYzMGQpOworCisJLyogREVHTElUQ0ggTUlOICYgTUFYIHNldHRpbmcgKi8KKwliY21fbnNfdXNiM19taWlfbW5nX3dyaXRlMzIodXNiMywgMHg1ODBlNjMwMik7CisKKwkvKiBUWFBNRCBibG9jayAqLworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4N2U4MDQwKTsKKworCS8qIEVuYWJsaW5nIFNTQyAqLworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4MDYxMDAzKTsKKworCS8qIFdhaXRpbmcgTUlJIE1ndCBpbnRlcmZhY2UgaWRsZSAqLworCWJjbV9uc191c2IzX21paV9tbmdfd2FpdF9pZGxlKHVzYjMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtX25zX3VzYjNfcGh5X2luaXRfbnNfYXgoc3RydWN0IGJjbV9uc191c2IzICp1c2IzKQoreworCWludCBlcnI7CisKKwkvKiBFbmFibGUgTURJTy4gU2V0dGluZyBNRENESVYgYXMgMjYgICovCisJd3JpdGVsKDB4MDAwMDAwOWEsIHVzYjMtPmNjYl9taWkgKyBCQ01BX0NDQl9NSUlfTU5HX0NUTCk7CisKKwkvKiBXYWl0IGZvciBNRElPPyAqLworCXVkZWxheSgyKTsKKworCS8qIFBMTDMwIGJsb2NrICovCisJZXJyID0gYmNtX25zX3VzYjNfbWlpX21uZ193cml0ZTMyKHVzYjMsIDB4NTg3ZTgwMDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJYmNtX25zX3VzYjNfbWlpX21uZ193cml0ZTMyKHVzYjMsIDB4NTgyYTY0MDApOworCisJYmNtX25zX3VzYjNfbWlpX21uZ193cml0ZTMyKHVzYjMsIDB4NTg3ZTgwZTApOworCisJYmNtX25zX3VzYjNfbWlpX21uZ193cml0ZTMyKHVzYjMsIDB4NTgwYTAwOWMpOworCisJLyogRW5hYmxlIFNTQyAqLworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4N2U4MDQwKTsKKworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4MGEyMWQzKTsKKworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4MDYxMDAzKTsKKworCS8qIFdhaXRpbmcgTUlJIE1ndCBpbnRlcmZhY2UgaWRsZSAqLworCWJjbV9uc191c2IzX21paV9tbmdfd2FpdF9pZGxlKHVzYjMpOworCisJLyogRGVhc3NlcnRpbmcgVVNCMyBzeXN0ZW0gcmVzZXQgKi8KKwl3cml0ZWwoMCwgdXNiMy0+ZG1wICsgQkNNQV9SRVNFVF9DVEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtX25zX3VzYjNfcGh5X2luaXQoc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCBiY21fbnNfdXNiMyAqdXNiMyA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCWludCBlcnI7CisKKwkvKiBQZXJmb3JtIFVTQjMgc3lzdGVtIHNvZnQgcmVzZXQgKi8KKwl3cml0ZWwoQkNNQV9SRVNFVF9DVExfUkVTRVQsIHVzYjMtPmRtcCArIEJDTUFfUkVTRVRfQ1RMKTsKKworCXN3aXRjaCAodXNiMy0+ZmFtaWx5KSB7CisJY2FzZSBCQ01fTlNfQVg6CisJCWVyciA9IGJjbV9uc191c2IzX3BoeV9pbml0X25zX2F4KHVzYjMpOworCQlicmVhazsKKwljYXNlIEJDTV9OU19CWDoKKwkJZXJyID0gYmNtX25zX3VzYjNfcGh5X2luaXRfbnNfYngodXNiMyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJCWVyciA9IC1FTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgb3BzID0geworCS5pbml0CQk9IGJjbV9uc191c2IzX3BoeV9pbml0LAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgYmNtX25zX3VzYjNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOworCXN0cnVjdCBiY21fbnNfdXNiMyAqdXNiMzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwaHlfcHJvdmlkZXI7CisKKwl1c2IzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCp1c2IzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1c2IzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXVzYjMtPmRldiA9IGRldjsKKworCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKGJjbV9uc191c2IzX2lkX3RhYmxlLCBkZXYpOworCWlmICghb2ZfaWQpCisJCXJldHVybiAtRUlOVkFMOworCXVzYjMtPmZhbWlseSA9IChlbnVtIGJjbV9uc19mYW1pbHkpb2ZfaWQtPmRhdGE7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAiZG1wIik7CisJdXNiMy0+ZG1wID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHVzYjMtPmRtcCkpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIERNUCByZWdzXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIodXNiMy0+ZG1wKTsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAiY2NiLW1paSIpOworCXVzYjMtPmNjYl9taWkgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIodXNiMy0+Y2NiX21paSkpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIENoaXBDb21tb24gQiBNSUkgcmVnc1xuIik7CisJCXJldHVybiBQVFJfRVJSKHVzYjMtPmNjYl9taWkpOworCX0KKworCXVzYjMtPnBoeSA9IGRldm1fcGh5X2NyZWF0ZShkZXYsIE5VTEwsICZvcHMpOworCWlmIChJU19FUlIodXNiMy0+cGh5KSkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBjcmVhdGUgUEhZXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIodXNiMy0+cGh5KTsKKwl9CisKKwlwaHlfc2V0X2RydmRhdGEodXNiMy0+cGh5LCB1c2IzKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB1c2IzKTsKKworCXBoeV9wcm92aWRlciA9IGRldm1fb2ZfcGh5X3Byb3ZpZGVyX3JlZ2lzdGVyKGRldiwgb2ZfcGh5X3NpbXBsZV94bGF0ZSk7CisJaWYgKCFJU19FUlIocGh5X3Byb3ZpZGVyKSkKKwkJZGV2X2luZm8oZGV2LCAiUmVnaXN0ZXJlZCBCcm9hZGNvbSBOb3J0aHN0YXIgVVNCIDMuMCBQSFkgZHJpdmVyXG4iKTsKKworCXJldHVybiBQVFJfRVJSX09SX1pFUk8ocGh5X3Byb3ZpZGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYmNtX25zX3VzYjNfZHJpdmVyID0geworCS5wcm9iZQkJPSBiY21fbnNfdXNiM19wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJiY21fbnNfdXNiMyIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGJjbV9uc191c2IzX2lkX3RhYmxlLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihiY21fbnNfdXNiM19kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktYmNtLW5zMi1wY2llLmMgYi9kcml2ZXJzL3BoeS9waHktYmNtLW5zMi1wY2llLmMKaW5kZXggOTUxM2Y3YS4uNGM3ZDExZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LWJjbS1uczItcGNpZS5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1iY20tbnMyLXBjaWUuYwpAQCAtMTgsMTEgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CiAKLXN0cnVjdCBuczJfcGNpX3BoeSB7Ci0Jc3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2OwotCXN0cnVjdCBwaHkgKnBoeTsKLX07Ci0KICNkZWZpbmUgQkxLX0FERFJfUkVHX09GRlNFVAkweDFmCiAjZGVmaW5lIFBMTF9BRkUxXzEwME1IWl9CTEsJMHgyMTAwCiAjZGVmaW5lIFBMTF9DTEtfQU1QX09GRlNFVAkweDAzCkBAIC0zMCwxNyArMjUsMTcgQEAKIAogc3RhdGljIGludCBuczJfcGNpX3BoeV9pbml0KHN0cnVjdCBwaHkgKnApCiB7Ci0Jc3RydWN0IG5zMl9wY2lfcGh5ICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEocCk7CisJc3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2ID0gcGh5X2dldF9kcnZkYXRhKHApOwogCWludCByYzsKIAogCS8qIHNlbGVjdCB0aGUgQUZFIDEwME1IeiBibG9jayBwYWdlICovCi0JcmMgPSBtZGlvYnVzX3dyaXRlKHBoeS0+bWRpb2Rldi0+YnVzLCBwaHktPm1kaW9kZXYtPmFkZHIsCisJcmMgPSBtZGlvYnVzX3dyaXRlKG1kaW9kZXYtPmJ1cywgbWRpb2Rldi0+YWRkciwKIAkJCSAgIEJMS19BRERSX1JFR19PRkZTRVQsIFBMTF9BRkUxXzEwME1IWl9CTEspOwogCWlmIChyYykKIAkJZ290byBlcnI7CiAKIAkvKiBzZXQgdGhlIDEwMCBNSHogcmVmZXJlbmNlIGNsb2NrIGFtcGxpdHVkZSB0byAyLjA1IHYgKi8KLQlyYyA9IG1kaW9idXNfd3JpdGUocGh5LT5tZGlvZGV2LT5idXMsIHBoeS0+bWRpb2Rldi0+YWRkciwKKwlyYyA9IG1kaW9idXNfd3JpdGUobWRpb2Rldi0+YnVzLCBtZGlvZGV2LT5hZGRyLAogCQkJICAgUExMX0NMS19BTVBfT0ZGU0VULCBQTExfQ0xLX0FNUF8yUDA1Vik7CiAJaWYgKHJjKQogCQlnb3RvIGVycjsKQEAgLTQ4LDE5ICs0MywxOSBAQAogCXJldHVybiAwOwogCiBlcnI6Ci0JZGV2X2VycigmcGh5LT5tZGlvZGV2LT5kZXYsICJFcnJvciAlZCB3cml0aW5nIHRvIHBoeVxuIiwgcmMpOworCWRldl9lcnIoJm1kaW9kZXYtPmRldiwgIkVycm9yICVkIHdyaXRpbmcgdG8gcGh5XG4iLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgc3RydWN0IHBoeV9vcHMgbnMyX3BjaV9waHlfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwaHlfb3BzIG5zMl9wY2lfcGh5X29wcyA9IHsKIAkuaW5pdCA9IG5zMl9wY2lfcGh5X2luaXQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgaW50IG5zMl9wY2lfcGh5X3Byb2JlKHN0cnVjdCBtZGlvX2RldmljZSAqbWRpb2RldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmbWRpb2Rldi0+ZGV2OwogCXN0cnVjdCBwaHlfcHJvdmlkZXIgKnByb3ZpZGVyOwotCXN0cnVjdCBuczJfcGNpX3BoeSAqcDsKIAlzdHJ1Y3QgcGh5ICpwaHk7CiAKIAlwaHkgPSBkZXZtX3BoeV9jcmVhdGUoZGV2LCBkZXYtPm9mX25vZGUsICZuczJfcGNpX3BoeV9vcHMpOwpAQCAtNjksMTYgKzY0LDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIocGh5KTsKIAl9CiAKLQlwID0gZGV2bV9rbWFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBuczJfcGNpX3BoeSksCi0JCQkgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXAtPm1kaW9kZXYgPSBtZGlvZGV2OwotCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHApOwotCi0JcC0+cGh5ID0gcGh5OwotCXBoeV9zZXRfZHJ2ZGF0YShwaHksIHApOworCXBoeV9zZXRfZHJ2ZGF0YShwaHksIG1kaW9kZXYpOwogCiAJcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcigmcGh5LT5kZXYsCiAJCQkJCQkgb2ZfcGh5X3NpbXBsZV94bGF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktYnJjbS1zYXRhLmMgYi9kcml2ZXJzL3BoeS9waHktYnJjbS1zYXRhLmMKaW5kZXggMThkNjYyNi4uOGZmYzQ0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LWJyY20tc2F0YS5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1icmNtLXNhdGEuYwpAQCAtMzY3LDcgKzM2Nyw3IEBACiAJCXJjID0gLUVOT0RFVjsKIAl9OwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgcGh5X29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1jb3JlLmMgYi9kcml2ZXJzL3BoeS9waHktY29yZS5jCmluZGV4IDhlY2E5MDYuLmEyNjhmNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1jb3JlLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LWNvcmUuYwpAQCAtMzU3LDYgKzM1NywyMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocGh5X3NldF9tb2RlKTsKIAoraW50IHBoeV9yZXNldChzdHJ1Y3QgcGh5ICpwaHkpCit7CisJaW50IHJldDsKKworCWlmICghcGh5IHx8ICFwaHktPm9wcy0+cmVzZXQpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmcGh5LT5tdXRleCk7CisJcmV0ID0gcGh5LT5vcHMtPnJlc2V0KHBoeSk7CisJbXV0ZXhfdW5sb2NrKCZwaHktPm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwaHlfcmVzZXQpOworCiAvKioKICAqIF9vZl9waHlfZ2V0KCkgLSBsb29rdXAgYW5kIG9idGFpbiBhIHJlZmVyZW5jZSB0byBhIHBoeSBieSBwaGFuZGxlCiAgKiBAbnA6IGRldmljZV9ub2RlIGZvciB3aGljaCB0byBnZXQgdGhlIHBoeQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LWRhOHh4LXVzYi5jIGIvZHJpdmVycy9waHkvcGh5LWRhOHh4LXVzYi5jCmluZGV4IGIyZTU5YjYuLjMyYWU3OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1kYTh4eC11c2IuYworKysgYi9kcml2ZXJzL3BoeS9waHktZGE4eHgtdXNiLmMKQEAgLTE1NCw3ICsxNTQsNyBAQAogCQlkX3BoeS0+cmVnbWFwID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfY29tcGF0aWJsZSgKIAkJCQkJCQkidGksZGE4MzAtY2ZnY2hpcCIpOwogCWVsc2UKLQkJZF9waHktPnJlZ21hcCA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BkZXZuYW1lKCJzeXNjb24uMCIpOworCQlkX3BoeS0+cmVnbWFwID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfcGRldm5hbWUoInN5c2NvbiIpOwogCWlmIChJU19FUlIoZF9waHktPnJlZ21hcCkpIHsKIAkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IHN5c2NvblxuIik7CiAJCXJldHVybiBQVFJfRVJSKGRfcGh5LT5yZWdtYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LWV4eW5vczUtdXNiZHJkLmMgYi9kcml2ZXJzL3BoeS9waHktZXh5bm9zNS11c2JkcmQuYwppbmRleCAyMDY5NmY1Li4wN2VkNjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktZXh5bm9zNS11c2JkcmQuYworKysgYi9kcml2ZXJzL3BoeS9waHktZXh5bm9zNS11c2JkcmQuYwpAQCAtMjQ5LDcgKzI0OSw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50CiBleHlub3M1X3VzYmRyZF9waXBlM19zZXRfcmVmY2xrKHN0cnVjdCBwaHlfdXNiX2luc3RhbmNlICppbnN0KQogewotCXN0YXRpYyB1MzIgcmVnOworCXUzMiByZWc7CiAJc3RydWN0IGV4eW5vczVfdXNiZHJkX3BoeSAqcGh5X2RyZCA9IHRvX3VzYmRyZF9waHkoaW5zdCk7CiAKIAkvKiByZXN0b3JlIGFueSBwcmV2aW91cyByZWZlcmVuY2UgY2xvY2sgc2V0dGluZ3MgKi8KQEAgLTI5NSw3ICsyOTUsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludAogZXh5bm9zNV91c2JkcmRfdXRtaV9zZXRfcmVmY2xrKHN0cnVjdCBwaHlfdXNiX2luc3RhbmNlICppbnN0KQogewotCXN0YXRpYyB1MzIgcmVnOworCXUzMiByZWc7CiAJc3RydWN0IGV4eW5vczVfdXNiZHJkX3BoeSAqcGh5X2RyZCA9IHRvX3VzYmRyZF9waHkoaW5zdCk7CiAKIAkvKiByZXN0b3JlIGFueSBwcmV2aW91cyByZWZlcmVuY2UgY2xvY2sgc2V0dGluZ3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1vbWFwLXVzYjIuYyBiL2RyaXZlcnMvcGh5L3BoeS1vbWFwLXVzYjIuYwppbmRleCBjMTM0OTg5Li5mZTkwOWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktb21hcC11c2IyLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LW9tYXAtdXNiMi5jCkBAIC0xMzMsMTEgKzEzMyw0OSBAQAogCXJldHVybiBvbWFwX3VzYl9waHlfcG93ZXIocGh5LCB0cnVlKTsKIH0KIAorc3RhdGljIGludCBvbWFwX3VzYjJfZGlzYWJsZV9jbG9ja3Moc3RydWN0IG9tYXBfdXNiICpwaHkpCit7CisJY2xrX2Rpc2FibGUocGh5LT53a3VwY2xrKTsKKwlpZiAoIUlTX0VSUihwaHktPm9wdGNsaykpCisJCWNsa19kaXNhYmxlKHBoeS0+b3B0Y2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfdXNiMl9lbmFibGVfY2xvY2tzKHN0cnVjdCBvbWFwX3VzYiAqcGh5KQoreworCWludCByZXQ7CisKKwlyZXQgPSBjbGtfZW5hYmxlKHBoeS0+d2t1cGNsayk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihwaHktPmRldiwgIkZhaWxlZCB0byBlbmFibGUgd2t1cGNsayAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnIwOworCX0KKworCWlmICghSVNfRVJSKHBoeS0+b3B0Y2xrKSkgeworCQlyZXQgPSBjbGtfZW5hYmxlKHBoeS0+b3B0Y2xrKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocGh5LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIG9wdGNsayAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gZXJyMTsKKwkJfQorCX0KKworCXJldHVybiAwOworCitlcnIxOgorCWNsa19kaXNhYmxlKHBoeS0+d2t1cGNsayk7CisKK2VycjA6CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBvbWFwX3VzYl9pbml0KHN0cnVjdCBwaHkgKngpCiB7CiAJc3RydWN0IG9tYXBfdXNiICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEoeCk7CiAJdTMyIHZhbDsKIAorCW9tYXBfdXNiMl9lbmFibGVfY2xvY2tzKHBoeSk7CisKIAlpZiAocGh5LT5mbGFncyAmIE9NQVBfVVNCMl9DQUxJQlJBVEVfRkFMU0VfRElTQ09OTkVDVCkgewogCQkvKgogCQkgKgpAQCAtMTU1LDggKzE5MywxNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG9tYXBfdXNiX2V4aXQoc3RydWN0IHBoeSAqeCkKK3sKKwlzdHJ1Y3Qgb21hcF91c2IgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YSh4KTsKKworCXJldHVybiBvbWFwX3VzYjJfZGlzYWJsZV9jbG9ja3MocGh5KTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBwaHlfb3BzIG9wcyA9IHsKIAkuaW5pdAkJPSBvbWFwX3VzYl9pbml0LAorCS5leGl0CQk9IG9tYXBfdXNiX2V4aXQsCiAJLnBvd2VyX29uCT0gb21hcF91c2JfcG93ZXJfb24sCiAJLnBvd2VyX29mZgk9IG9tYXBfdXNiX3Bvd2VyX29mZiwKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCkBAIC0zNzYsNjUgKzQyMiwxMSBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNCi0KLXN0YXRpYyBpbnQgb21hcF91c2IyX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCXN0cnVjdCBvbWFwX3VzYgkqcGh5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQljbGtfZGlzYWJsZShwaHktPndrdXBjbGspOwotCWlmICghSVNfRVJSKHBoeS0+b3B0Y2xrKSkKLQkJY2xrX2Rpc2FibGUocGh5LT5vcHRjbGspOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcF91c2IyX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0Jc3RydWN0IG9tYXBfdXNiCSpwaHkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gY2xrX2VuYWJsZShwaHktPndrdXBjbGspOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIocGh5LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIHdrdXBjbGsgJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyMDsKLQl9Ci0KLQlpZiAoIUlTX0VSUihwaHktPm9wdGNsaykpIHsKLQkJcmV0ID0gY2xrX2VuYWJsZShwaHktPm9wdGNsayk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHBoeS0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBvcHRjbGsgJWRcbiIsIHJldCk7Ci0JCQlnb3RvIGVycjE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLQotZXJyMToKLQljbGtfZGlzYWJsZShwaHktPndrdXBjbGspOwotCi1lcnIwOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBvbWFwX3VzYjJfcG1fb3BzID0gewotCVNFVF9SVU5USU1FX1BNX09QUyhvbWFwX3VzYjJfcnVudGltZV9zdXNwZW5kLCBvbWFwX3VzYjJfcnVudGltZV9yZXN1bWUsCi0JCU5VTEwpCi19OwotCi0jZGVmaW5lIERFVl9QTV9PUFMgICAgICgmb21hcF91c2IyX3BtX29wcykKLSNlbHNlCi0jZGVmaW5lIERFVl9QTV9PUFMgICAgIE5VTEwKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX3VzYjJfZHJpdmVyID0gewogCS5wcm9iZQkJPSBvbWFwX3VzYjJfcHJvYmUsCiAJLnJlbW92ZQkJPSBvbWFwX3VzYjJfcmVtb3ZlLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJvbWFwLXVzYjIiLAotCQkucG0JPSBERVZfUE1fT1BTLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBvbWFwX3VzYjJfaWRfdGFibGUsCiAJfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktcWNvbS11ZnMuYyBiL2RyaXZlcnMvcGh5L3BoeS1xY29tLXVmcy5jCmluZGV4IDEwN2NiNTcuLjE4YTViNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1xY29tLXVmcy5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1xY29tLXVmcy5jCkBAIC0yODMsMTAgKzI4Myw4IEBACiAJCQllcnIgPSAwOwogCQl9CiAJCXNucHJpbnRmKHByb3BfbmFtZSwgTUFYX1BST1BfTkFNRSwgIiVzLWFsd2F5cy1vbiIsIG5hbWUpOwotCQlpZiAob2ZfZ2V0X3Byb3BlcnR5KGRldi0+b2Zfbm9kZSwgcHJvcF9uYW1lLCBOVUxMKSkKLQkJCXZyZWctPmlzX2Fsd2F5c19vbiA9IHRydWU7Ci0JCWVsc2UKLQkJCXZyZWctPmlzX2Fsd2F5c19vbiA9IGZhbHNlOworCQl2cmVnLT5pc19hbHdheXNfb24gPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAorCQkJCQkJCSAgIHByb3BfbmFtZSk7CiAJfQogCiAJaWYgKCFzdHJjbXAobmFtZSwgInZkZGEtcGxsIikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1yY2FyLWdlbjMtdXNiMi5jIGIvZHJpdmVycy9waHkvcGh5LXJjYXItZ2VuMy11c2IyLmMKaW5kZXggMzExNTZjOS4uM2Q5N2VhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LXJjYXItZ2VuMy11c2IyLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LXJjYXItZ2VuMy11c2IyLmMKQEAgLTI4MCw2ICsyODAsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByY2FyX2dlbjNfcGh5X3VzYjJfbWF0Y2hfdGFibGVbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsdXNiMi1waHktcjhhNzc5NSIgfSwKKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsdXNiMi1waHktcjhhNzc5NiIgfSwKIAl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscmNhci1nZW4zLXVzYjItcGh5IiB9LAogCXsgfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1yb2NrY2hpcC1pbm5vLXVzYjIuYyBiL2RyaXZlcnMvcGh5L3BoeS1yb2NrY2hpcC1pbm5vLXVzYjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzIwMzEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waHkvcGh5LXJvY2tjaGlwLWlubm8tdXNiMi5jCkBAIC0wLDAgKzEsNzA3IEBACisvKgorICogUm9ja2NoaXAgVVNCMi4wIFBIWSB3aXRoIElubm9zaWxpY29uIElQIGJsb2NrIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBGdXpob3UgUm9ja2NoaXAgRWxlY3Ryb25pY3MgQ28uLCBMdGQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorCisjZGVmaW5lIEJJVF9XUklURUFCTEVfU0hJRlQJMTYKKyNkZWZpbmUgU0NIRURVTEVfREVMQVkJKDYwICogSFopCisKK2VudW0gcm9ja2NoaXBfdXNiMnBoeV9wb3J0X2lkIHsKKwlVU0IyUEhZX1BPUlRfT1RHLAorCVVTQjJQSFlfUE9SVF9IT1NULAorCVVTQjJQSFlfTlVNX1BPUlRTLAorfTsKKworZW51bSByb2NrY2hpcF91c2IycGh5X2hvc3Rfc3RhdGUgeworCVBIWV9TVEFURV9IU19PTkxJTkUJPSAwLAorCVBIWV9TVEFURV9ESVNDT05ORUNUCT0gMSwKKwlQSFlfU1RBVEVfQ09OTkVDVAk9IDIsCisJUEhZX1NUQVRFX0ZTX0xTX09OTElORQk9IDQsCit9OworCitzdHJ1Y3QgdXNiMnBoeV9yZWcgeworCXVuc2lnbmVkIGludAlvZmZzZXQ7CisJdW5zaWduZWQgaW50CWJpdGVuZDsKKwl1bnNpZ25lZCBpbnQJYml0c3RhcnQ7CisJdW5zaWduZWQgaW50CWRpc2FibGU7CisJdW5zaWduZWQgaW50CWVuYWJsZTsKK307CisKKy8qKgorICogc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydF9jZmc6IHVzYi1waHkgcG9ydCBjb25maWd1cmF0aW9uLgorICogQHBoeV9zdXM6IHBoeSBzdXNwZW5kIHJlZ2lzdGVyLgorICogQGxzX2RldF9lbjogbGluZXN0YXRlIGRldGVjdGlvbiBlbmFibGUgcmVnaXN0ZXIuCisgKiBAbHNfZGV0X3N0OiBsaW5lc3RhdGUgZGV0ZWN0aW9uIHN0YXRlIHJlZ2lzdGVyLgorICogQGxzX2RldF9jbHI6IGxpbmVzdGF0ZSBkZXRlY3Rpb24gY2xlYXIgcmVnaXN0ZXIuCisgKiBAdXRtaV9sczogdXRtaSBsaW5lc3RhdGUgc3RhdGUgcmVnaXN0ZXIuCisgKiBAdXRtaV9oc3RkZXQ6IHV0bWkgaG9zdCBkaXNjb25uZWN0IHJlZ2lzdGVyLgorICovCitzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9wb3J0X2NmZyB7CisJc3RydWN0IHVzYjJwaHlfcmVnCXBoeV9zdXM7CisJc3RydWN0IHVzYjJwaHlfcmVnCWxzX2RldF9lbjsKKwlzdHJ1Y3QgdXNiMnBoeV9yZWcJbHNfZGV0X3N0OworCXN0cnVjdCB1c2IycGh5X3JlZwlsc19kZXRfY2xyOworCXN0cnVjdCB1c2IycGh5X3JlZwl1dG1pX2xzOworCXN0cnVjdCB1c2IycGh5X3JlZwl1dG1pX2hzdGRldDsKK307CisKKy8qKgorICogc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfY2ZnOiB1c2ItcGh5IGNvbmZpZ3VyYXRpb24uCisgKiBAcmVnOiB0aGUgYWRkcmVzcyBvZmZzZXQgb2YgZ3JmIGZvciB1c2ItcGh5IGNvbmZpZy4KKyAqIEBudW1fcG9ydHM6IHNwZWNpZnkgaG93IG1hbnkgcG9ydHMgdGhhdCB0aGUgcGh5IGhhcy4KKyAqIEBjbGtvdXRfY3RsOiBrZWVwIG9uL3R1cm4gb2ZmIG91dHB1dCBjbGsgb2YgcGh5LgorICovCitzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9jZmcgeworCXVuc2lnbmVkIGludAlyZWc7CisJdW5zaWduZWQgaW50CW51bV9wb3J0czsKKwlzdHJ1Y3QgdXNiMnBoeV9yZWcJY2xrb3V0X2N0bDsKKwljb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9wb3J0X2NmZwlwb3J0X2NmZ3NbVVNCMlBIWV9OVU1fUE9SVFNdOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9wb3J0OiB1c2ItcGh5IHBvcnQgZGF0YS4KKyAqIEBwb3J0X2lkOiBmbGFnIGZvciBvdGcgcG9ydCBvciBob3N0IHBvcnQuCisgKiBAc3VzcGVuZGVkOiBwaHkgc3VzcGVuZGVkIGZsYWcuCisgKiBAbHNfaXJxOiBJUlEgbnVtYmVyIGFzc2lnbmVkIGZvciBsaW5lc3RhdGUgZGV0ZWN0aW9uLgorICogQG11dGV4OiBmb3IgcmVnaXN0ZXIgdXBkYXRpbmcgaW4gc21fd29yay4KKyAqIEBzbV93b3JrOiBPVEcgc3RhdGUgbWFjaGluZSB3b3JrLgorICogQHBoeV9jZmc6IHBvcnQgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiwgYXNzaWduZWQgYnkgZHJpdmVyIGRhdGEuCisgKi8KK3N0cnVjdCByb2NrY2hpcF91c2IycGh5X3BvcnQgeworCXN0cnVjdCBwaHkJKnBoeTsKKwl1bnNpZ25lZCBpbnQJcG9ydF9pZDsKKwlib29sCQlzdXNwZW5kZWQ7CisJaW50CQlsc19pcnE7CisJc3RydWN0IG11dGV4CW11dGV4OworCXN0cnVjdAkJZGVsYXllZF93b3JrIHNtX3dvcms7CisJY29uc3Qgc3RydWN0CXJvY2tjaGlwX3VzYjJwaHlfcG9ydF9jZmcgKnBvcnRfY2ZnOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeTogdXNiMi4wIHBoeSBkcml2ZXIgZGF0YS4KKyAqIEBncmY6IEdlbmVyYWwgUmVnaXN0ZXIgRmlsZXMgcmVnbWFwLgorICogQGNsazogY2xvY2sgc3RydWN0IG9mIHBoeSBpbnB1dCBjbGsuCisgKiBAY2xrNDgwbTogY2xvY2sgc3RydWN0IG9mIHBoeSBvdXRwdXQgY2xrLgorICogQGNsa19odzogY2xvY2sgc3RydWN0IG9mIHBoeSBvdXRwdXQgY2xrIG1hbmFnZW1lbnQuCisgKiBAcGh5X2NmZzogcGh5IHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24sIGFzc2lnbmVkIGJ5IGRyaXZlciBkYXRhLgorICogQHBvcnRzOiBwaHkgcG9ydCBpbnN0YW5jZS4KKyAqLworc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgeworCXN0cnVjdCBkZXZpY2UJKmRldjsKKwlzdHJ1Y3QgcmVnbWFwCSpncmY7CisJc3RydWN0IGNsawkqY2xrOworCXN0cnVjdCBjbGsJKmNsazQ4MG07CisJc3RydWN0IGNsa19odwljbGs0ODBtX2h3OworCWNvbnN0IHN0cnVjdCByb2NrY2hpcF91c2IycGh5X2NmZwkqcGh5X2NmZzsKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9wb3J0CXBvcnRzW1VTQjJQSFlfTlVNX1BPUlRTXTsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHByb3BlcnR5X2VuYWJsZShzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSAqcnBoeSwKKwkJCQkgIGNvbnN0IHN0cnVjdCB1c2IycGh5X3JlZyAqcmVnLCBib29sIGVuKQoreworCXVuc2lnbmVkIGludCB2YWwsIG1hc2ssIHRtcDsKKworCXRtcCA9IGVuID8gcmVnLT5lbmFibGUgOiByZWctPmRpc2FibGU7CisJbWFzayA9IEdFTk1BU0socmVnLT5iaXRlbmQsIHJlZy0+Yml0c3RhcnQpOworCXZhbCA9ICh0bXAgPDwgcmVnLT5iaXRzdGFydCkgfCAobWFzayA8PCBCSVRfV1JJVEVBQkxFX1NISUZUKTsKKworCXJldHVybiByZWdtYXBfd3JpdGUocnBoeS0+Z3JmLCByZWctPm9mZnNldCwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSBib29sIHByb3BlcnR5X2VuYWJsZWQoc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgKnJwaHksCisJCQkJICAgIGNvbnN0IHN0cnVjdCB1c2IycGh5X3JlZyAqcmVnKQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHRtcCwgb3JpZzsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IEdFTk1BU0socmVnLT5iaXRlbmQsIHJlZy0+Yml0c3RhcnQpOworCisJcmV0ID0gcmVnbWFwX3JlYWQocnBoeS0+Z3JmLCByZWctPm9mZnNldCwgJm9yaWcpOworCWlmIChyZXQpCisJCXJldHVybiBmYWxzZTsKKworCXRtcCA9IChvcmlnICYgbWFzaykgPj4gcmVnLT5iaXRzdGFydDsKKwlyZXR1cm4gdG1wID09IHJlZy0+ZW5hYmxlOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3VzYjJwaHlfY2xrNDgwbV9lbmFibGUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgKnJwaHkgPQorCQljb250YWluZXJfb2YoaHcsIHN0cnVjdCByb2NrY2hpcF91c2IycGh5LCBjbGs0ODBtX2h3KTsKKwlpbnQgcmV0OworCisJLyogdHVybiBvbiA0ODBtIGNsayBvdXRwdXQgaWYgaXQgaXMgb2ZmICovCisJaWYgKCFwcm9wZXJ0eV9lbmFibGVkKHJwaHksICZycGh5LT5waHlfY2ZnLT5jbGtvdXRfY3RsKSkgeworCQlyZXQgPSBwcm9wZXJ0eV9lbmFibGUocnBoeSwgJnJwaHktPnBoeV9jZmctPmNsa291dF9jdGwsIHRydWUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQkvKiB3YWl0dGluZyBmb3IgdGhlIGNsayBiZWNvbWUgc3RhYmxlICovCisJCW1kZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcm9ja2NoaXBfdXNiMnBoeV9jbGs0ODBtX2Rpc2FibGUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgKnJwaHkgPQorCQljb250YWluZXJfb2YoaHcsIHN0cnVjdCByb2NrY2hpcF91c2IycGh5LCBjbGs0ODBtX2h3KTsKKworCS8qIHR1cm4gb2ZmIDQ4MG0gY2xrIG91dHB1dCAqLworCXByb3BlcnR5X2VuYWJsZShycGh5LCAmcnBoeS0+cGh5X2NmZy0+Y2xrb3V0X2N0bCwgZmFsc2UpOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3VzYjJwaHlfY2xrNDgwbV9lbmFibGVkKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCByb2NrY2hpcF91c2IycGh5ICpycGh5ID0KKwkJY29udGFpbmVyX29mKGh3LCBzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSwgY2xrNDgwbV9odyk7CisKKwlyZXR1cm4gcHJvcGVydHlfZW5hYmxlZChycGh5LCAmcnBoeS0+cGh5X2NmZy0+Y2xrb3V0X2N0bCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCityb2NrY2hpcF91c2IycGh5X2NsazQ4MG1fcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKQoreworCXJldHVybiA0ODAwMDAwMDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyByb2NrY2hpcF91c2IycGh5X2Nsa291dF9vcHMgPSB7CisJLmVuYWJsZSA9IHJvY2tjaGlwX3VzYjJwaHlfY2xrNDgwbV9lbmFibGUsCisJLmRpc2FibGUgPSByb2NrY2hpcF91c2IycGh5X2NsazQ4MG1fZGlzYWJsZSwKKwkuaXNfZW5hYmxlZCA9IHJvY2tjaGlwX3VzYjJwaHlfY2xrNDgwbV9lbmFibGVkLAorCS5yZWNhbGNfcmF0ZSA9IHJvY2tjaGlwX3VzYjJwaHlfY2xrNDgwbV9yZWNhbGNfcmF0ZSwKK307CisKK3N0YXRpYyB2b2lkIHJvY2tjaGlwX3VzYjJwaHlfY2xrNDgwbV91bnJlZ2lzdGVyKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgKnJwaHkgPSBkYXRhOworCisJb2ZfY2xrX2RlbF9wcm92aWRlcihycGh5LT5kZXYtPm9mX25vZGUpOworCWNsa191bnJlZ2lzdGVyKHJwaHktPmNsazQ4MG0pOworfQorCitzdGF0aWMgaW50Cityb2NrY2hpcF91c2IycGh5X2NsazQ4MG1fcmVnaXN0ZXIoc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgKnJwaHkpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gcnBoeS0+ZGV2LT5vZl9ub2RlOworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJY29uc3QgY2hhciAqY2xrX25hbWU7CisJaW50IHJldDsKKworCWluaXQuZmxhZ3MgPSAwOworCWluaXQubmFtZSA9ICJjbGtfdXNicGh5XzQ4MG0iOworCWluaXQub3BzID0gJnJvY2tjaGlwX3VzYjJwaHlfY2xrb3V0X29wczsKKworCS8qIG9wdGlvbmFsIG92ZXJyaWRlIG9mIHRoZSBjbG9ja25hbWUgKi8KKwlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhub2RlLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwgJmluaXQubmFtZSk7CisKKwlpZiAocnBoeS0+Y2xrKSB7CisJCWNsa19uYW1lID0gX19jbGtfZ2V0X25hbWUocnBoeS0+Y2xrKTsKKwkJaW5pdC5wYXJlbnRfbmFtZXMgPSAmY2xrX25hbWU7CisJCWluaXQubnVtX3BhcmVudHMgPSAxOworCX0gZWxzZSB7CisJCWluaXQucGFyZW50X25hbWVzID0gTlVMTDsKKwkJaW5pdC5udW1fcGFyZW50cyA9IDA7CisJfQorCisJcnBoeS0+Y2xrNDgwbV9ody5pbml0ID0gJmluaXQ7CisKKwkvKiByZWdpc3RlciB0aGUgY2xvY2sgKi8KKwlycGh5LT5jbGs0ODBtID0gY2xrX3JlZ2lzdGVyKHJwaHktPmRldiwgJnJwaHktPmNsazQ4MG1faHcpOworCWlmIChJU19FUlIocnBoeS0+Y2xrNDgwbSkpIHsKKwkJcmV0ID0gUFRSX0VSUihycGh5LT5jbGs0ODBtKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCXJldCA9IG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBycGh5LT5jbGs0ODBtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfY2xrX3Byb3ZpZGVyOworCisJcmV0ID0gZGV2bV9hZGRfYWN0aW9uKHJwaHktPmRldiwgcm9ja2NoaXBfdXNiMnBoeV9jbGs0ODBtX3VucmVnaXN0ZXIsCisJCQkgICAgICBycGh5KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfdW5yZWdfYWN0aW9uOworCisJcmV0dXJuIDA7CisKK2Vycl91bnJlZ19hY3Rpb246CisJb2ZfY2xrX2RlbF9wcm92aWRlcihub2RlKTsKK2Vycl9jbGtfcHJvdmlkZXI6CisJY2xrX3VucmVnaXN0ZXIocnBoeS0+Y2xrNDgwbSk7CitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfdXNiMnBoeV9pbml0KHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9wb3J0ICpycG9ydCA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCXN0cnVjdCByb2NrY2hpcF91c2IycGh5ICpycGh5ID0gZGV2X2dldF9kcnZkYXRhKHBoeS0+ZGV2LnBhcmVudCk7CisJaW50IHJldDsKKworCWlmIChycG9ydC0+cG9ydF9pZCA9PSBVU0IyUEhZX1BPUlRfSE9TVCkgeworCQkvKiBjbGVhciBsaW5lc3RhdGUgYW5kIGVuYWJsZSBsaW5lc3RhdGUgZGV0ZWN0IGlycSAqLworCQltdXRleF9sb2NrKCZycG9ydC0+bXV0ZXgpOworCisJCXJldCA9IHByb3BlcnR5X2VuYWJsZShycGh5LCAmcnBvcnQtPnBvcnRfY2ZnLT5sc19kZXRfY2xyLCB0cnVlKTsKKwkJaWYgKHJldCkgeworCQkJbXV0ZXhfdW5sb2NrKCZycG9ydC0+bXV0ZXgpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldCA9IHByb3BlcnR5X2VuYWJsZShycGh5LCAmcnBvcnQtPnBvcnRfY2ZnLT5sc19kZXRfZW4sIHRydWUpOworCQlpZiAocmV0KSB7CisJCQltdXRleF91bmxvY2soJnJwb3J0LT5tdXRleCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJbXV0ZXhfdW5sb2NrKCZycG9ydC0+bXV0ZXgpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnJwb3J0LT5zbV93b3JrLCBTQ0hFRFVMRV9ERUxBWSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfdXNiMnBoeV9wb3dlcl9vbihzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydCAqcnBvcnQgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSAqcnBoeSA9IGRldl9nZXRfZHJ2ZGF0YShwaHktPmRldi5wYXJlbnQpOworCWludCByZXQ7CisKKwlkZXZfZGJnKCZycG9ydC0+cGh5LT5kZXYsICJwb3J0IHBvd2VyIG9uXG4iKTsKKworCWlmICghcnBvcnQtPnN1c3BlbmRlZCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocnBoeS0+Y2xrNDgwbSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHByb3BlcnR5X2VuYWJsZShycGh5LCAmcnBvcnQtPnBvcnRfY2ZnLT5waHlfc3VzLCBmYWxzZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJwb3J0LT5zdXNwZW5kZWQgPSBmYWxzZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF91c2IycGh5X3Bvd2VyX29mZihzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydCAqcnBvcnQgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSAqcnBoeSA9IGRldl9nZXRfZHJ2ZGF0YShwaHktPmRldi5wYXJlbnQpOworCWludCByZXQ7CisKKwlkZXZfZGJnKCZycG9ydC0+cGh5LT5kZXYsICJwb3J0IHBvd2VyIG9mZlxuIik7CisKKwlpZiAocnBvcnQtPnN1c3BlbmRlZCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBwcm9wZXJ0eV9lbmFibGUocnBoeSwgJnJwb3J0LT5wb3J0X2NmZy0+cGh5X3N1cywgdHJ1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJwb3J0LT5zdXNwZW5kZWQgPSB0cnVlOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShycGh5LT5jbGs0ODBtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3VzYjJwaHlfZXhpdChzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydCAqcnBvcnQgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKworCWlmIChycG9ydC0+cG9ydF9pZCA9PSBVU0IyUEhZX1BPUlRfSE9TVCkKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZycG9ydC0+c21fd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwaHlfb3BzIHJvY2tjaGlwX3VzYjJwaHlfb3BzID0geworCS5pbml0CQk9IHJvY2tjaGlwX3VzYjJwaHlfaW5pdCwKKwkuZXhpdAkJPSByb2NrY2hpcF91c2IycGh5X2V4aXQsCisJLnBvd2VyX29uCT0gcm9ja2NoaXBfdXNiMnBoeV9wb3dlcl9vbiwKKwkucG93ZXJfb2ZmCT0gcm9ja2NoaXBfdXNiMnBoeV9wb3dlcl9vZmYsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworLyoKKyAqIFRoZSBmdW5jdGlvbiBtYW5hZ2UgaG9zdC1waHkgcG9ydCBzdGF0ZSBhbmQgc3VzcGVuZC9yZXN1bWUgcGh5IHBvcnQKKyAqIHRvIHNhdmUgcG93ZXIuCisgKgorICogd2UgcmVseSBvbiB1dG1pX2xpbmVzdGF0ZSBhbmQgdXRtaV9ob3N0ZGlzY29ubmVjdCB0byBpZGVudGlmeSB3aGV0aGVyCisgKiBkZXZpY2VzIGlzIGRpc2Nvbm5lY3Qgb3Igbm90LiBCZXNpZGVzLCB3ZSBkbyBub3QgbmVlZCBjYXJlIGl0IGlzIEZTL0xTCisgKiBkaXNjb25uZWN0ZWQgb3IgSFMgZGlzY29ubmVjdGVkLCBhY3R1YWxseSwgd2UganVzdCBvbmx5IG5lZWQgZ2V0IHRoZQorICogZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCBhdCBsYXN0IHRocm91Z2ggcmVhcm0gdGhlIGRlbGF5ZWQgd29yaywKKyAqIHRvIHN1c3BlbmQgdGhlIHBoeSBwb3J0IGluIF9QSFlfU1RBVEVfRElTQ09OTkVDVF8gY2FzZS4KKyAqCisgKiBOT1RFOiBJdCBtYXkgaW52b2tlICpwaHlfcG93cl9vZmYgb3IgKnBoeV9wb3dlcl9vbiB3aGljaCB3aWxsIGludm9rZQorICogc29tZSBjbGsgcmVsYXRlZCBBUElzLCBzbyBkbyBub3QgaW52b2tlIGl0IGZyb20gaW50ZXJydXB0IGNvbnRleHQgZGlyZWN0bHkuCisgKi8KK3N0YXRpYyB2b2lkIHJvY2tjaGlwX3VzYjJwaHlfc21fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydCAqcnBvcnQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydCwgc21fd29yay53b3JrKTsKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSAqcnBoeSA9IGRldl9nZXRfZHJ2ZGF0YShycG9ydC0+cGh5LT5kZXYucGFyZW50KTsKKwl1bnNpZ25lZCBpbnQgc2ggPSBycG9ydC0+cG9ydF9jZmctPnV0bWlfaHN0ZGV0LmJpdGVuZCAtCisJCQkgIHJwb3J0LT5wb3J0X2NmZy0+dXRtaV9oc3RkZXQuYml0c3RhcnQgKyAxOworCXVuc2lnbmVkIGludCB1bCwgdWhkLCBzdGF0ZTsKKwl1bnNpZ25lZCBpbnQgdWxfbWFzaywgdWhkX21hc2s7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnJwb3J0LT5tdXRleCk7CisKKwlyZXQgPSByZWdtYXBfcmVhZChycGh5LT5ncmYsIHJwb3J0LT5wb3J0X2NmZy0+dXRtaV9scy5vZmZzZXQsICZ1bCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gbmV4dF9zY2hlZHVsZTsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJwaHktPmdyZiwgcnBvcnQtPnBvcnRfY2ZnLT51dG1pX2hzdGRldC5vZmZzZXQsCisJCQkgICZ1aGQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG5leHRfc2NoZWR1bGU7CisKKwl1aGRfbWFzayA9IEdFTk1BU0socnBvcnQtPnBvcnRfY2ZnLT51dG1pX2hzdGRldC5iaXRlbmQsCisJCQkgICBycG9ydC0+cG9ydF9jZmctPnV0bWlfaHN0ZGV0LmJpdHN0YXJ0KTsKKwl1bF9tYXNrID0gR0VOTUFTSyhycG9ydC0+cG9ydF9jZmctPnV0bWlfbHMuYml0ZW5kLAorCQkJICBycG9ydC0+cG9ydF9jZmctPnV0bWlfbHMuYml0c3RhcnQpOworCisJLyogc3RpdGNoIG9uIHV0bWlfbHMgYW5kIHV0bWlfaHN0ZGV0IGFzIHBoeSBzdGF0ZSAqLworCXN0YXRlID0gKCh1aGQgJiB1aGRfbWFzaykgPj4gcnBvcnQtPnBvcnRfY2ZnLT51dG1pX2hzdGRldC5iaXRzdGFydCkgfAorCQkoKCh1bCAmIHVsX21hc2spID4+IHJwb3J0LT5wb3J0X2NmZy0+dXRtaV9scy5iaXRzdGFydCkgPDwgc2gpOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgUEhZX1NUQVRFX0hTX09OTElORToKKwkJZGV2X2RiZygmcnBvcnQtPnBoeS0+ZGV2LCAiSFMgb25saW5lXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBQSFlfU1RBVEVfRlNfTFNfT05MSU5FOgorCQkvKgorCQkgKiBGb3IgRlMvTFMgZGV2aWNlLCB0aGUgb25saW5lIHN0YXRlIHNoYXJlIHdpdGggY29ubmVjdCBzdGF0ZQorCQkgKiBmcm9tIHV0bWlfbHMgYW5kIHV0bWlfaHN0ZGV0IHJlZ2lzdGVyLCBzbyB3ZSBkaXN0aW5ndWlzaAorCQkgKiB0aGVtIHZpYSBzdXNwZW5kZWQgZmxhZy4KKwkJICoKKwkJICogUGx1cywgdGhlcmUgYXJlIHR3byBjYXNlcywgb25lIGlzIEQtIExpbmUgcHVsbC11cCwgYW5kIEQrCisJCSAqIGxpbmUgcHVsbC1kb3duLCB0aGUgc3RhdGUgaXMgNDsgYW5vdGhlciBpcyBEKyBsaW5lIHB1bGwtdXAsCisJCSAqIGFuZCBELSBsaW5lIHB1bGwtZG93biwgdGhlIHN0YXRlIGlzIDIuCisJCSAqLworCQlpZiAoIXJwb3J0LT5zdXNwZW5kZWQpIHsKKwkJCS8qIEQtIGxpbmUgcHVsbC11cCwgRCsgbGluZSBwdWxsLWRvd24gKi8KKwkJCWRldl9kYmcoJnJwb3J0LT5waHktPmRldiwgIkZTL0xTIG9ubGluZVxuIik7CisJCQlicmVhazsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFBIWV9TVEFURV9DT05ORUNUOgorCQlpZiAocnBvcnQtPnN1c3BlbmRlZCkgeworCQkJZGV2X2RiZygmcnBvcnQtPnBoeS0+ZGV2LCAiQ29ubmVjdGVkXG4iKTsKKwkJCXJvY2tjaGlwX3VzYjJwaHlfcG93ZXJfb24ocnBvcnQtPnBoeSk7CisJCQlycG9ydC0+c3VzcGVuZGVkID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQkvKiBEKyBsaW5lIHB1bGwtdXAsIEQtIGxpbmUgcHVsbC1kb3duICovCisJCQlkZXZfZGJnKCZycG9ydC0+cGh5LT5kZXYsICJGUy9MUyBvbmxpbmVcbiIpOworCQl9CisJCWJyZWFrOworCWNhc2UgUEhZX1NUQVRFX0RJU0NPTk5FQ1Q6CisJCWlmICghcnBvcnQtPnN1c3BlbmRlZCkgeworCQkJZGV2X2RiZygmcnBvcnQtPnBoeS0+ZGV2LCAiRGlzY29ubmVjdGVkXG4iKTsKKwkJCXJvY2tjaGlwX3VzYjJwaHlfcG93ZXJfb2ZmKHJwb3J0LT5waHkpOworCQkJcnBvcnQtPnN1c3BlbmRlZCA9IHRydWU7CisJCX0KKworCQkvKgorCQkgKiBhY3RpdmF0ZSB0aGUgbGluZXN0YXRlIGRldGVjdGlvbiB0byBnZXQgdGhlIG5leHQgZGV2aWNlCisJCSAqIHBsdWctaW4gaXJxLgorCQkgKi8KKwkJcHJvcGVydHlfZW5hYmxlKHJwaHksICZycG9ydC0+cG9ydF9jZmctPmxzX2RldF9jbHIsIHRydWUpOworCQlwcm9wZXJ0eV9lbmFibGUocnBoeSwgJnJwb3J0LT5wb3J0X2NmZy0+bHNfZGV0X2VuLCB0cnVlKTsKKworCQkvKgorCQkgKiB3ZSBkb24ndCBuZWVkIHRvIHJlYXJtIHRoZSBkZWxheWVkIHdvcmsgd2hlbiB0aGUgcGh5IHBvcnQKKwkJICogaXMgc3VzcGVuZGVkLgorCQkgKi8KKwkJbXV0ZXhfdW5sb2NrKCZycG9ydC0+bXV0ZXgpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJZGV2X2RiZygmcnBvcnQtPnBoeS0+ZGV2LCAidW5rbm93biBwaHkgc3RhdGVcbiIpOworCQlicmVhazsKKwl9CisKK25leHRfc2NoZWR1bGU6CisJbXV0ZXhfdW5sb2NrKCZycG9ydC0+bXV0ZXgpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcnBvcnQtPnNtX3dvcmssIFNDSEVEVUxFX0RFTEFZKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHJvY2tjaGlwX3VzYjJwaHlfbGluZXN0YXRlX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCByb2NrY2hpcF91c2IycGh5X3BvcnQgKnJwb3J0ID0gZGF0YTsKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSAqcnBoeSA9IGRldl9nZXRfZHJ2ZGF0YShycG9ydC0+cGh5LT5kZXYucGFyZW50KTsKKworCWlmICghcHJvcGVydHlfZW5hYmxlZChycGh5LCAmcnBvcnQtPnBvcnRfY2ZnLT5sc19kZXRfc3QpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwltdXRleF9sb2NrKCZycG9ydC0+bXV0ZXgpOworCisJLyogZGlzYWJsZSBsaW5lc3RhdGUgZGV0ZWN0IGlycSBhbmQgY2xlYXIgaXRzIHN0YXR1cyAqLworCXByb3BlcnR5X2VuYWJsZShycGh5LCAmcnBvcnQtPnBvcnRfY2ZnLT5sc19kZXRfZW4sIGZhbHNlKTsKKwlwcm9wZXJ0eV9lbmFibGUocnBoeSwgJnJwb3J0LT5wb3J0X2NmZy0+bHNfZGV0X2NsciwgdHJ1ZSk7CisKKwltdXRleF91bmxvY2soJnJwb3J0LT5tdXRleCk7CisKKwkvKgorCSAqIEluIHRoaXMgY2FzZSBmb3IgaG9zdCBwaHkgcG9ydCwgYSBuZXcgZGV2aWNlIGlzIHBsdWdnZWQgaW4sCisJICogbWVhbndoaWxlLCBpZiB0aGUgcGh5IHBvcnQgaXMgc3VzcGVuZGVkLCB3ZSBuZWVkIHJlYXJtIHRoZSB3b3JrIHRvCisJICogcmVzdW1lIGl0IGFuZCBtYW5nZSBpdHMgc3RhdGVzOyBvdGhlcndpc2UsIHdlIGRvIG5vdGhpbmcgYWJvdXQgdGhhdC4KKwkgKi8KKwlpZiAocnBvcnQtPnN1c3BlbmRlZCAmJiBycG9ydC0+cG9ydF9pZCA9PSBVU0IyUEhZX1BPUlRfSE9TVCkKKwkJcm9ja2NoaXBfdXNiMnBoeV9zbV93b3JrKCZycG9ydC0+c21fd29yay53b3JrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF91c2IycGh5X2hvc3RfcG9ydF9pbml0KHN0cnVjdCByb2NrY2hpcF91c2IycGh5ICpycGh5LAorCQkJCQkgICBzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9wb3J0ICpycG9ydCwKKwkJCQkJICAgc3RydWN0IGRldmljZV9ub2RlICpjaGlsZF9ucCkKK3sKKwlpbnQgcmV0OworCisJcnBvcnQtPnBvcnRfaWQgPSBVU0IyUEhZX1BPUlRfSE9TVDsKKwlycG9ydC0+cG9ydF9jZmcgPSAmcnBoeS0+cGh5X2NmZy0+cG9ydF9jZmdzW1VTQjJQSFlfUE9SVF9IT1NUXTsKKwlycG9ydC0+c3VzcGVuZGVkID0gdHJ1ZTsKKworCW11dGV4X2luaXQoJnJwb3J0LT5tdXRleCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnJwb3J0LT5zbV93b3JrLCByb2NrY2hpcF91c2IycGh5X3NtX3dvcmspOworCisJcnBvcnQtPmxzX2lycSA9IG9mX2lycV9nZXRfYnluYW1lKGNoaWxkX25wLCAibGluZXN0YXRlIik7CisJaWYgKHJwb3J0LT5sc19pcnEgPCAwKSB7CisJCWRldl9lcnIocnBoeS0+ZGV2LCAibm8gbGluZXN0YXRlIGlycSBwcm92aWRlZFxuIik7CisJCXJldHVybiBycG9ydC0+bHNfaXJxOworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEocnBoeS0+ZGV2LCBycG9ydC0+bHNfaXJxLCBOVUxMLAorCQkJCQlyb2NrY2hpcF91c2IycGh5X2xpbmVzdGF0ZV9pcnEsCisJCQkJCUlSUUZfT05FU0hPVCwKKwkJCQkJInJvY2tjaGlwX3VzYjJwaHkiLCBycG9ydCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHJwaHktPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGlycSBoYW5kbGVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3VzYjJwaHlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZF9ucDsKKwlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwcm92aWRlcjsKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSAqcnBoeTsKKwljb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9jZmcgKnBoeV9jZmdzOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCXVuc2lnbmVkIGludCByZWc7CisJaW50IGluZGV4LCByZXQ7CisKKwlycGh5ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpycGh5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFycGh5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKGRldi0+ZHJpdmVyLT5vZl9tYXRjaF90YWJsZSwgZGV2KTsKKwlpZiAoIW1hdGNoIHx8ICFtYXRjaC0+ZGF0YSkgeworCQlkZXZfZXJyKGRldiwgInBoeSBjb25maWdzIGFyZSBub3QgYXNzaWduZWQhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFkZXYtPnBhcmVudCB8fCAhZGV2LT5wYXJlbnQtPm9mX25vZGUpCisJCXJldHVybiAtRUlOVkFMOworCisJcnBoeS0+Z3JmID0gc3lzY29uX25vZGVfdG9fcmVnbWFwKGRldi0+cGFyZW50LT5vZl9ub2RlKTsKKwlpZiAoSVNfRVJSKHJwaHktPmdyZikpCisJCXJldHVybiBQVFJfRVJSKHJwaHktPmdyZik7CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyZWciLCAmcmVnKSkgeworCQlkZXZfZXJyKGRldiwgInRoZSByZWcgcHJvcGVydHkgaXMgbm90IGFzc2lnbmVkIGluICVzIG5vZGVcbiIsCisJCQlucC0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJwaHktPmRldiA9IGRldjsKKwlwaHlfY2ZncyA9IG1hdGNoLT5kYXRhOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJwaHkpOworCisJLyogZmluZCBvdXQgYSBwcm9wZXIgY29uZmlnIHdoaWNoIGNhbiBiZSBtYXRjaGVkIHdpdGggZHQuICovCisJaW5kZXggPSAwOworCXdoaWxlIChwaHlfY2Znc1tpbmRleF0ucmVnKSB7CisJCWlmIChwaHlfY2Znc1tpbmRleF0ucmVnID09IHJlZykgeworCQkJcnBoeS0+cGh5X2NmZyA9ICZwaHlfY2Znc1tpbmRleF07CisJCQlicmVhazsKKwkJfQorCisJCSsraW5kZXg7CisJfQorCisJaWYgKCFycGh5LT5waHlfY2ZnKSB7CisJCWRldl9lcnIoZGV2LCAibm8gcGh5LWNvbmZpZyBjYW4gYmUgbWF0Y2hlZCB3aXRoICVzIG5vZGVcbiIsCisJCQlucC0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJwaHktPmNsayA9IG9mX2Nsa19nZXRfYnlfbmFtZShucCwgInBoeWNsayIpOworCWlmICghSVNfRVJSKHJwaHktPmNsaykpIHsKKwkJY2xrX3ByZXBhcmVfZW5hYmxlKHJwaHktPmNsayk7CisJfSBlbHNlIHsKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgIm5vIHBoeWNsayBzcGVjaWZpZWRcbiIpOworCQlycGh5LT5jbGsgPSBOVUxMOworCX0KKworCXJldCA9IHJvY2tjaGlwX3VzYjJwaHlfY2xrNDgwbV9yZWdpc3RlcihycGh5KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIDQ4MG0gb3V0cHV0IGNsb2NrXG4iKTsKKwkJZ290byBkaXNhYmxlX2Nsa3M7CisJfQorCisJaW5kZXggPSAwOworCWZvcl9lYWNoX2F2YWlsYWJsZV9jaGlsZF9vZl9ub2RlKG5wLCBjaGlsZF9ucCkgeworCQlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9wb3J0ICpycG9ydCA9ICZycGh5LT5wb3J0c1tpbmRleF07CisJCXN0cnVjdCBwaHkgKnBoeTsKKworCQkvKgorCQkgKiBUaGlzIGRyaXZlciBhaW0gdG8gc3VwcG9ydCBib3RoIG90Zy1wb3J0IGFuZCBob3N0LXBvcnQsCisJCSAqIGJ1dCB1bmZvcnR1bmF0ZWx5LCB0aGUgb3RnIHBhcnQgaXMgbm90IHJlYWR5IGluIGN1cnJlbnQsCisJCSAqIHNvIHRoaXMgY29tbWVudHMgYW5kIGJlbG93IGNvZGVzIGFyZSBpbnRlcmltLCB3aGljaCBzaG91bGQKKwkJICogYmUgY2hhbmdlZCBhZnRlciBvdGctcG9ydCBpcyBzdXBwbGllZCBzb29uLgorCQkgKi8KKwkJaWYgKG9mX25vZGVfY21wKGNoaWxkX25wLT5uYW1lLCAiaG9zdC1wb3J0IikpCisJCQlnb3RvIG5leHRfY2hpbGQ7CisKKwkJcGh5ID0gZGV2bV9waHlfY3JlYXRlKGRldiwgY2hpbGRfbnAsICZyb2NrY2hpcF91c2IycGh5X29wcyk7CisJCWlmIChJU19FUlIocGh5KSkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRlIHBoeVxuIik7CisJCQlyZXQgPSBQVFJfRVJSKHBoeSk7CisJCQlnb3RvIHB1dF9jaGlsZDsKKwkJfQorCisJCXJwb3J0LT5waHkgPSBwaHk7CisJCXBoeV9zZXRfZHJ2ZGF0YShycG9ydC0+cGh5LCBycG9ydCk7CisKKwkJcmV0ID0gcm9ja2NoaXBfdXNiMnBoeV9ob3N0X3BvcnRfaW5pdChycGh5LCBycG9ydCwgY2hpbGRfbnApOworCQlpZiAocmV0KQorCQkJZ290byBwdXRfY2hpbGQ7CisKK25leHRfY2hpbGQ6CisJCS8qIHRvIHByZXZlbnQgb3V0IG9mIGJvdW5kYXJ5ICovCisJCWlmICgrK2luZGV4ID49IHJwaHktPnBoeV9jZmctPm51bV9wb3J0cykKKwkJCWJyZWFrOworCX0KKworCXByb3ZpZGVyID0gZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LCBvZl9waHlfc2ltcGxlX3hsYXRlKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKHByb3ZpZGVyKTsKKworcHV0X2NoaWxkOgorCW9mX25vZGVfcHV0KGNoaWxkX25wKTsKK2Rpc2FibGVfY2xrczoKKwlpZiAocnBoeS0+Y2xrKSB7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShycGh5LT5jbGspOworCQljbGtfcHV0KHJwaHktPmNsayk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9jZmcgcmszMzY2X3BoeV9jZmdzW10gPSB7CisJeworCQkucmVnID0gMHg3MDAsCisJCS5udW1fcG9ydHMJPSAyLAorCQkuY2xrb3V0X2N0bAk9IHsgMHgwNzI0LCAxNSwgMTUsIDEsIDAgfSwKKwkJLnBvcnRfY2Zncwk9IHsKKwkJCVtVU0IyUEhZX1BPUlRfSE9TVF0gPSB7CisJCQkJLnBoeV9zdXMJPSB7IDB4MDcyOCwgMTUsIDAsIDAsIDB4MWQxIH0sCisJCQkJLmxzX2RldF9lbgk9IHsgMHgwNjgwLCA0LCA0LCAwLCAxIH0sCisJCQkJLmxzX2RldF9zdAk9IHsgMHgwNjkwLCA0LCA0LCAwLCAxIH0sCisJCQkJLmxzX2RldF9jbHIJPSB7IDB4MDZhMCwgNCwgNCwgMCwgMSB9LAorCQkJCS51dG1pX2xzCT0geyAweDA0OWMsIDE0LCAxMywgMCwgMSB9LAorCQkJCS51dG1pX2hzdGRldAk9IHsgMHgwNDljLCAxMiwgMTIsIDAsIDEgfQorCQkJfQorCQl9LAorCX0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfY2ZnIHJrMzM5OV9waHlfY2Znc1tdID0geworCXsKKwkJLnJlZyA9IDB4ZTQ1MCwKKwkJLm51bV9wb3J0cwk9IDIsCisJCS5jbGtvdXRfY3RsCT0geyAweGU0NTAsIDQsIDQsIDEsIDAgfSwKKwkJLnBvcnRfY2Zncwk9IHsKKwkJCVtVU0IyUEhZX1BPUlRfSE9TVF0gPSB7CisJCQkJLnBoeV9zdXMJPSB7IDB4ZTQ1OCwgMSwgMCwgMHgyLCAweDEgfSwKKwkJCQkubHNfZGV0X2VuCT0geyAweGUzYzAsIDYsIDYsIDAsIDEgfSwKKwkJCQkubHNfZGV0X3N0CT0geyAweGUzZTAsIDYsIDYsIDAsIDEgfSwKKwkJCQkubHNfZGV0X2Nscgk9IHsgMHhlM2QwLCA2LCA2LCAwLCAxIH0sCisJCQkJLnV0bWlfbHMJPSB7IDB4ZTJhYywgMjIsIDIxLCAwLCAxIH0sCisJCQkJLnV0bWlfaHN0ZGV0CT0geyAweGUyYWMsIDIzLCAyMywgMCwgMSB9CisJCQl9CisJCX0sCisJfSwKKwl7CisJCS5yZWcgPSAweGU0NjAsCisJCS5udW1fcG9ydHMJPSAyLAorCQkuY2xrb3V0X2N0bAk9IHsgMHhlNDYwLCA0LCA0LCAxLCAwIH0sCisJCS5wb3J0X2NmZ3MJPSB7CisJCQlbVVNCMlBIWV9QT1JUX0hPU1RdID0geworCQkJCS5waHlfc3VzCT0geyAweGU0NjgsIDEsIDAsIDB4MiwgMHgxIH0sCisJCQkJLmxzX2RldF9lbgk9IHsgMHhlM2MwLCAxMSwgMTEsIDAsIDEgfSwKKwkJCQkubHNfZGV0X3N0CT0geyAweGUzZTAsIDExLCAxMSwgMCwgMSB9LAorCQkJCS5sc19kZXRfY2xyCT0geyAweGUzZDAsIDExLCAxMSwgMCwgMSB9LAorCQkJCS51dG1pX2xzCT0geyAweGUyYWMsIDI2LCAyNSwgMCwgMSB9LAorCQkJCS51dG1pX2hzdGRldAk9IHsgMHhlMmFjLCAyNywgMjcsIDAsIDEgfQorCQkJfQorCQl9LAorCX0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByb2NrY2hpcF91c2IycGh5X2R0X21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzNjYtdXNiMnBoeSIsIC5kYXRhID0gJnJrMzM2Nl9waHlfY2ZncyB9LAorCXsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LXVzYjJwaHkiLCAuZGF0YSA9ICZyazMzOTlfcGh5X2NmZ3MgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHJvY2tjaGlwX3VzYjJwaHlfZHRfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByb2NrY2hpcF91c2IycGh5X2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcm9ja2NoaXBfdXNiMnBoeV9wcm9iZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicm9ja2NoaXAtdXNiMnBoeSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHJvY2tjaGlwX3VzYjJwaHlfZHRfbWF0Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJvY2tjaGlwX3VzYjJwaHlfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiRnJhbmsgV2FuZyA8ZnJhbmsud2FuZ0Byb2NrLWNoaXBzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUm9ja2NoaXAgVVNCMi4wIFBIWSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1yb2NrY2hpcC1wY2llLmMgYi9kcml2ZXJzL3BoeS9waHktcm9ja2NoaXAtcGNpZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYjRjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BoeS9waHktcm9ja2NoaXAtcGNpZS5jCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICogUm9ja2NoaXAgUENJZSBQSFkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFNoYXduIExpbiA8c2hhd24ubGluQHJvY2stY2hpcHMuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDE2IFJPQ0tDSElQLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KKworLyoKKyAqIFRoZSBoaWdoZXIgMTYtYml0IG9mIHRoaXMgcmVnaXN0ZXIgaXMgdXNlZCBmb3Igd3JpdGUgcHJvdGVjdGlvbgorICogb25seSBpZiBCSVQoeCArIDE2KSBzZXQgdG8gMSB0aGUgQklUKHgpIGNhbiBiZSB3cml0dGVuLgorICovCisjZGVmaW5lIEhJV09SRF9VUERBVEUodmFsLCBtYXNrLCBzaGlmdCkgXAorCQkoKHZhbCkgPDwgKHNoaWZ0KSB8IChtYXNrKSA8PCAoKHNoaWZ0KSArIDE2KSkKKworI2RlZmluZSBQSFlfTUFYX0xBTkVfTlVNICAgICAgNAorI2RlZmluZSBQSFlfQ0ZHX0RBVEFfU0hJRlQgICAgNworI2RlZmluZSBQSFlfQ0ZHX0FERFJfU0hJRlQgICAgMQorI2RlZmluZSBQSFlfQ0ZHX0RBVEFfTUFTSyAgICAgMHhmCisjZGVmaW5lIFBIWV9DRkdfQUREUl9NQVNLICAgICAweDNmCisjZGVmaW5lIFBIWV9DRkdfUkRfTUFTSyAgICAgICAweDNmZgorI2RlZmluZSBQSFlfQ0ZHX1dSX0VOQUJMRSAgICAgMQorI2RlZmluZSBQSFlfQ0ZHX1dSX0RJU0FCTEUgICAgMQorI2RlZmluZSBQSFlfQ0ZHX1dSX1NISUZUICAgICAgMAorI2RlZmluZSBQSFlfQ0ZHX1dSX01BU0sgICAgICAgMQorI2RlZmluZSBQSFlfQ0ZHX1BMTF9MT0NLICAgICAgMHgxMAorI2RlZmluZSBQSFlfQ0ZHX0NMS19URVNUICAgICAgMHgxMAorI2RlZmluZSBQSFlfQ0ZHX0NMS19TQ0MgICAgICAgMHgxMgorI2RlZmluZSBQSFlfQ0ZHX1NFUEVfUkFURSAgICAgQklUKDMpCisjZGVmaW5lIFBIWV9DRkdfUExMXzEwME0gICAgICBCSVQoMykKKyNkZWZpbmUgUEhZX1BMTF9MT0NLRUQgICAgICAgIEJJVCg5KQorI2RlZmluZSBQSFlfUExMX09VVFBVVCAgICAgICAgQklUKDEwKQorI2RlZmluZSBQSFlfTEFORV9BX1NUQVRVUyAgICAgMHgzMAorI2RlZmluZSBQSFlfTEFORV9CX1NUQVRVUyAgICAgMHgzMQorI2RlZmluZSBQSFlfTEFORV9DX1NUQVRVUyAgICAgMHgzMgorI2RlZmluZSBQSFlfTEFORV9EX1NUQVRVUyAgICAgMHgzMworI2RlZmluZSBQSFlfTEFORV9SWF9ERVRfU0hJRlQgMTEKKyNkZWZpbmUgUEhZX0xBTkVfUlhfREVUX1RIICAgIDB4MQorI2RlZmluZSBQSFlfTEFORV9JRExFX09GRiAgICAgMHgxCisjZGVmaW5lIFBIWV9MQU5FX0lETEVfTUFTSyAgICAweDEKKyNkZWZpbmUgUEhZX0xBTkVfSURMRV9BX1NISUZUIDMKKyNkZWZpbmUgUEhZX0xBTkVfSURMRV9CX1NISUZUIDQKKyNkZWZpbmUgUEhZX0xBTkVfSURMRV9DX1NISUZUIDUKKyNkZWZpbmUgUEhZX0xBTkVfSURMRV9EX1NISUZUIDYKKworc3RydWN0IHJvY2tjaGlwX3BjaWVfZGF0YSB7CisJdW5zaWduZWQgaW50IHBjaWVfY29uZjsKKwl1bnNpZ25lZCBpbnQgcGNpZV9zdGF0dXM7CisJdW5zaWduZWQgaW50IHBjaWVfbGFuZW9mZjsKK307CisKK3N0cnVjdCByb2NrY2hpcF9wY2llX3BoeSB7CisJc3RydWN0IHJvY2tjaGlwX3BjaWVfZGF0YSAqcGh5X2RhdGE7CisJc3RydWN0IHJlZ21hcCAqcmVnX2Jhc2U7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wgKnBoeV9yc3Q7CisJc3RydWN0IGNsayAqY2xrX3BjaWVwaHlfcmVmOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHBoeV93cl9jZmcoc3RydWN0IHJvY2tjaGlwX3BjaWVfcGh5ICpya19waHksCisJCQkgICAgICB1MzIgYWRkciwgdTMyIGRhdGEpCit7CisJcmVnbWFwX3dyaXRlKHJrX3BoeS0+cmVnX2Jhc2UsIHJrX3BoeS0+cGh5X2RhdGEtPnBjaWVfY29uZiwKKwkJICAgICBISVdPUkRfVVBEQVRFKGRhdGEsCisJCQkJICAgUEhZX0NGR19EQVRBX01BU0ssCisJCQkJICAgUEhZX0NGR19EQVRBX1NISUZUKSB8CisJCSAgICAgSElXT1JEX1VQREFURShhZGRyLAorCQkJCSAgIFBIWV9DRkdfQUREUl9NQVNLLAorCQkJCSAgIFBIWV9DRkdfQUREUl9TSElGVCkpOworCXVkZWxheSgxKTsKKwlyZWdtYXBfd3JpdGUocmtfcGh5LT5yZWdfYmFzZSwgcmtfcGh5LT5waHlfZGF0YS0+cGNpZV9jb25mLAorCQkgICAgIEhJV09SRF9VUERBVEUoUEhZX0NGR19XUl9FTkFCTEUsCisJCQkJICAgUEhZX0NGR19XUl9NQVNLLAorCQkJCSAgIFBIWV9DRkdfV1JfU0hJRlQpKTsKKwl1ZGVsYXkoMSk7CisJcmVnbWFwX3dyaXRlKHJrX3BoeS0+cmVnX2Jhc2UsIHJrX3BoeS0+cGh5X2RhdGEtPnBjaWVfY29uZiwKKwkJICAgICBISVdPUkRfVVBEQVRFKFBIWV9DRkdfV1JfRElTQUJMRSwKKwkJCQkgICBQSFlfQ0ZHX1dSX01BU0ssCisJCQkJICAgUEhZX0NGR19XUl9TSElGVCkpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBwaHlfcmRfY2ZnKHN0cnVjdCByb2NrY2hpcF9wY2llX3BoeSAqcmtfcGh5LAorCQkJICAgICB1MzIgYWRkcikKK3sKKwl1MzIgdmFsOworCisJcmVnbWFwX3dyaXRlKHJrX3BoeS0+cmVnX2Jhc2UsIHJrX3BoeS0+cGh5X2RhdGEtPnBjaWVfY29uZiwKKwkJICAgICBISVdPUkRfVVBEQVRFKGFkZHIsCisJCQkJICAgUEhZX0NGR19SRF9NQVNLLAorCQkJCSAgIFBIWV9DRkdfQUREUl9TSElGVCkpOworCXJlZ21hcF9yZWFkKHJrX3BoeS0+cmVnX2Jhc2UsCisJCSAgICBya19waHktPnBoeV9kYXRhLT5wY2llX3N0YXR1cywKKwkJICAgICZ2YWwpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfcGNpZV9waHlfcG93ZXJfb2ZmKHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfcGNpZV9waHkgKnJrX3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCWludCBlcnIgPSAwOworCisJZXJyID0gcmVzZXRfY29udHJvbF9hc3NlcnQocmtfcGh5LT5waHlfcnN0KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBoeS0+ZGV2LCAiYXNzZXJ0IHBoeV9yc3QgZXJyICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3BjaWVfcGh5X3Bvd2VyX29uKHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfcGNpZV9waHkgKnJrX3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCWludCBlcnIgPSAwOworCXUzMiBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJZXJyID0gcmVzZXRfY29udHJvbF9kZWFzc2VydChya19waHktPnBoeV9yc3QpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGh5LT5kZXYsICJkZWFzc2VydCBwaHlfcnN0IGVyciAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZWdtYXBfd3JpdGUocmtfcGh5LT5yZWdfYmFzZSwgcmtfcGh5LT5waHlfZGF0YS0+cGNpZV9jb25mLAorCQkgICAgIEhJV09SRF9VUERBVEUoUEhZX0NGR19QTExfTE9DSywKKwkJCQkgICBQSFlfQ0ZHX0FERFJfTUFTSywKKwkJCQkgICBQSFlfQ0ZHX0FERFJfU0hJRlQpKTsKKworCS8qCisJICogTm8gZG9jdW1lbnRlZCB0aW1lb3V0IHZhbHVlIGZvciBwaHkgb3BlcmF0aW9uIGJlbG93LAorCSAqIHNvIHdlIG1ha2UgaXQgbGFyZ2UgZW5vdWdoIGhlcmUuIEFuZCB3ZSB1c2UgbG9vcC1icmVhaworCSAqIG1ldGhvZCB3aGljaCBzaG91bGQgbm90IGJlIGhhcm1mdWwuCisJICovCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCisJZXJyID0gLUVJTlZBTDsKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJcmVnbWFwX3JlYWQocmtfcGh5LT5yZWdfYmFzZSwKKwkJCSAgICBya19waHktPnBoeV9kYXRhLT5wY2llX3N0YXR1cywKKwkJCSAgICAmc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAmIFBIWV9QTExfTE9DS0VEKSB7CisJCQlkZXZfZGJnKCZwaHktPmRldiwgInBsbCBsb2NrZWQhXG4iKTsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoMjApOworCX0KKworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGh5LT5kZXYsICJwbGwgbG9jayB0aW1lb3V0IVxuIik7CisJCWdvdG8gZXJyX3BsbF9sb2NrOworCX0KKworCXBoeV93cl9jZmcocmtfcGh5LCBQSFlfQ0ZHX0NMS19URVNULCBQSFlfQ0ZHX1NFUEVfUkFURSk7CisJcGh5X3dyX2NmZyhya19waHksIFBIWV9DRkdfQ0xLX1NDQywgUEhZX0NGR19QTExfMTAwTSk7CisKKwllcnIgPSAtRVRJTUVET1VUOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlyZWdtYXBfcmVhZChya19waHktPnJlZ19iYXNlLAorCQkJICAgIHJrX3BoeS0+cGh5X2RhdGEtPnBjaWVfc3RhdHVzLAorCQkJICAgICZzdGF0dXMpOworCQlpZiAoIShzdGF0dXMgJiBQSFlfUExMX09VVFBVVCkpIHsKKwkJCWRldl9kYmcoJnBoeS0+ZGV2LCAicGxsIG91dHB1dCBlbmFibGUgZG9uZSFcbiIpOworCQkJZXJyID0gMDsKKwkJCWJyZWFrOworCQl9CisJCW1zbGVlcCgyMCk7CisJfQorCisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwaHktPmRldiwgInBsbCBvdXRwdXQgZW5hYmxlIHRpbWVvdXQhXG4iKTsKKwkJZ290byBlcnJfcGxsX2xvY2s7CisJfQorCisJcmVnbWFwX3dyaXRlKHJrX3BoeS0+cmVnX2Jhc2UsIHJrX3BoeS0+cGh5X2RhdGEtPnBjaWVfY29uZiwKKwkJICAgICBISVdPUkRfVVBEQVRFKFBIWV9DRkdfUExMX0xPQ0ssCisJCQkJICAgUEhZX0NGR19BRERSX01BU0ssCisJCQkJICAgUEhZX0NGR19BRERSX1NISUZUKSk7CisJZXJyID0gLUVJTlZBTDsKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJcmVnbWFwX3JlYWQocmtfcGh5LT5yZWdfYmFzZSwKKwkJCSAgICBya19waHktPnBoeV9kYXRhLT5wY2llX3N0YXR1cywKKwkJCSAgICAmc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAmIFBIWV9QTExfTE9DS0VEKSB7CisJCQlkZXZfZGJnKCZwaHktPmRldiwgInBsbCByZWxvY2tlZCFcbiIpOworCQkJZXJyID0gMDsKKwkJCWJyZWFrOworCQl9CisJCW1zbGVlcCgyMCk7CisJfQorCisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwaHktPmRldiwgInBsbCByZWxvY2sgdGltZW91dCFcbiIpOworCQlnb3RvIGVycl9wbGxfbG9jazsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3BsbF9sb2NrOgorCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHJrX3BoeS0+cGh5X3JzdCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9wY2llX3BoeV9pbml0KHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfcGNpZV9waHkgKnJrX3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCWludCBlcnIgPSAwOworCisJZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxlKHJrX3BoeS0+Y2xrX3BjaWVwaHlfcmVmKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBoeS0+ZGV2LCAiRmFpbCB0byBlbmFibGUgcGNpZSByZWYgY2xvY2suXG4iKTsKKwkJZ290byBlcnJfcmVmY2xrOworCX0KKworCWVyciA9IHJlc2V0X2NvbnRyb2xfYXNzZXJ0KHJrX3BoeS0+cGh5X3JzdCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwaHktPmRldiwgImFzc2VydCBwaHlfcnN0IGVyciAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJfcmVzZXQ7CisJfQorCisJcmV0dXJuIGVycjsKKworZXJyX3Jlc2V0OgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShya19waHktPmNsa19wY2llcGh5X3JlZik7CitlcnJfcmVmY2xrOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfcGNpZV9waHlfZXhpdChzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3BjaWVfcGh5ICpya19waHkgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKwlpbnQgZXJyID0gMDsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShya19waHktPmNsa19wY2llcGh5X3JlZik7CisKKwllcnIgPSByZXNldF9jb250cm9sX2RlYXNzZXJ0KHJrX3BoeS0+cGh5X3JzdCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwaHktPmRldiwgImRlYXNzZXJ0IHBoeV9yc3QgZXJyICVkXG4iLCBlcnIpOworCQlnb3RvIGVycl9yZXNldDsKKwl9CisKKwlyZXR1cm4gZXJyOworCitlcnJfcmVzZXQ6CisJY2xrX3ByZXBhcmVfZW5hYmxlKHJrX3BoeS0+Y2xrX3BjaWVwaHlfcmVmKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgb3BzID0geworCS5pbml0CQk9IHJvY2tjaGlwX3BjaWVfcGh5X2luaXQsCisJLmV4aXQJCT0gcm9ja2NoaXBfcGNpZV9waHlfZXhpdCwKKwkucG93ZXJfb24JPSByb2NrY2hpcF9wY2llX3BoeV9wb3dlcl9vbiwKKwkucG93ZXJfb2ZmCT0gcm9ja2NoaXBfcGNpZV9waHlfcG93ZXJfb2ZmLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfcGNpZV9kYXRhIHJrMzM5OV9wY2llX2RhdGEgPSB7CisJLnBjaWVfY29uZiA9IDB4ZTIyMCwKKwkucGNpZV9zdGF0dXMgPSAweGUyYTQsCisJLnBjaWVfbGFuZW9mZiA9IDB4ZTIxNCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJvY2tjaGlwX3BjaWVfcGh5X2R0X2lkc1tdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LXBjaWUtcGh5IiwKKwkJLmRhdGEgPSAmcmszMzk5X3BjaWVfZGF0YSwKKwl9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByb2NrY2hpcF9wY2llX3BoeV9kdF9pZHMpOworCitzdGF0aWMgaW50IHJvY2tjaGlwX3BjaWVfcGh5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3Qgcm9ja2NoaXBfcGNpZV9waHkgKnJrX3BoeTsKKwlzdHJ1Y3QgcGh5ICpnZW5lcmljX3BoeTsKKwlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwaHlfcHJvdmlkZXI7CisJc3RydWN0IHJlZ21hcCAqZ3JmOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOworCisJZ3JmID0gc3lzY29uX25vZGVfdG9fcmVnbWFwKGRldi0+cGFyZW50LT5vZl9ub2RlKTsKKwlpZiAoSVNfRVJSKGdyZikpIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgZmluZCBHUkYgc3lzY29uXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZ3JmKTsKKwl9CisKKwlya19waHkgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnJrX3BoeSksIEdGUF9LRVJORUwpOworCWlmICghcmtfcGh5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKHJvY2tjaGlwX3BjaWVfcGh5X2R0X2lkcywgJnBkZXYtPmRldik7CisJaWYgKCFvZl9pZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlya19waHktPnBoeV9kYXRhID0gKHN0cnVjdCByb2NrY2hpcF9wY2llX2RhdGEgKilvZl9pZC0+ZGF0YTsKKwlya19waHktPnJlZ19iYXNlID0gZ3JmOworCisJcmtfcGh5LT5waHlfcnN0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldChkZXYsICJwaHkiKTsKKwlpZiAoSVNfRVJSKHJrX3BoeS0+cGh5X3JzdCkpIHsKKwkJaWYgKFBUUl9FUlIocmtfcGh5LT5waHlfcnN0KSAhPSAtRVBST0JFX0RFRkVSKQorCQkJZGV2X2VycihkZXYsCisJCQkJIm1pc3NpbmcgcGh5IHByb3BlcnR5IGZvciByZXNldCBjb250cm9sbGVyXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocmtfcGh5LT5waHlfcnN0KTsKKwl9CisKKwlya19waHktPmNsa19wY2llcGh5X3JlZiA9IGRldm1fY2xrX2dldChkZXYsICJyZWZjbGsiKTsKKwlpZiAoSVNfRVJSKHJrX3BoeS0+Y2xrX3BjaWVwaHlfcmVmKSkgeworCQlkZXZfZXJyKGRldiwgInJlZmNsayBub3QgZm91bmQuXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocmtfcGh5LT5jbGtfcGNpZXBoeV9yZWYpOworCX0KKworCWdlbmVyaWNfcGh5ID0gZGV2bV9waHlfY3JlYXRlKGRldiwgZGV2LT5vZl9ub2RlLCAmb3BzKTsKKwlpZiAoSVNfRVJSKGdlbmVyaWNfcGh5KSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjcmVhdGUgUEhZXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZ2VuZXJpY19waHkpOworCX0KKworCXBoeV9zZXRfZHJ2ZGF0YShnZW5lcmljX3BoeSwgcmtfcGh5KTsKKwlwaHlfcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcihkZXYsIG9mX3BoeV9zaW1wbGVfeGxhdGUpOworCisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhwaHlfcHJvdmlkZXIpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByb2NrY2hpcF9wY2llX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcm9ja2NoaXBfcGNpZV9waHlfcHJvYmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJvY2tjaGlwLXBjaWUtcGh5IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gcm9ja2NoaXBfcGNpZV9waHlfZHRfaWRzLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJvY2tjaGlwX3BjaWVfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiU2hhd24gTGluIDxzaGF3bi5saW5Acm9jay1jaGlwcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJvY2tjaGlwIFBDSWUgUEhZIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXJvY2tjaGlwLXR5cGVjLmMgYi9kcml2ZXJzL3BoeS9waHktcm9ja2NoaXAtdHlwZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2ZiMGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waHkvcGh5LXJvY2tjaGlwLXR5cGVjLmMKQEAgLTAsMCArMSwxMDIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSBGdXpob3UgUm9ja2NoaXAgRWxlY3Ryb25pY3MgQ28uTHRkCisgKiBBdXRob3I6IENocmlzIFpob25nIDx6eXdAcm9jay1jaGlwcy5jb20+CisgKiAgICAgICAgIEtldmVyIFlhbmcgPGtldmVyLnlhbmdAcm9jay1jaGlwcy5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgUk9DS0NISVAgVHlwZS1DIFBIWSBoYXMgdHdvIFBMTCBjbG9ja3MuIFRoZSBmaXJzdCBQTEwgY2xvY2sKKyAqIGlzIHVzZWQgZm9yIFVTQjMsIHRoZSBzZWNvbmQgUExMIGNsb2NrIGlzIHVzZWQgZm9yIERQLiBUaGlzIFR5cGUtQyBQSFkgaGFzCisgKiAzIHdvcmtpbmcgbW9kZXM6IFVTQjMgb25seSBtb2RlLCBEUCBvbmx5IG1vZGUsIGFuZCBVU0IzK0RQIG1vZGUuCisgKiBBdCBVU0IzIG9ubHkgbW9kZSwgYm90aCBQTEwgY2xvY2tzIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQsIHRoaXMgYWxsb3dzIHRoZQorICogUEhZIHRvIHN3aXRjaCBtb2RlIGJldHdlZW4gVVNCMyBhbmQgVVNCMytEUCwgd2l0aG91dCBkaXNjb25uZWN0aW5nIHRoZSBVU0IKKyAqIGRldmljZS4KKyAqIEluIFRoZSBEUCBvbmx5IG1vZGUsIG9ubHkgdGhlIERQIFBMTCBuZWVkcyB0byBiZSBwb3dlcmVkIG9uLCBhbmQgdGhlIDQgbGFuZXMKKyAqIGFyZSBhbGwgdXNlZCBmb3IgRFAuCisgKgorICogVGhpcyBkcml2ZXIgZ2V0cyBleHRjb24gY2FibGUgc3RhdGUgYW5kIHByb3BlcnR5LCB0aGVuIGRlY2lkZXMgd2hpY2ggbW9kZSB0bworICogc2VsZWN0OgorICoKKyAqIDEuIFVTQjMgb25seSBtb2RlOgorICogICAgRVhUQ09OX1VTQiBvciBFWFRDT05fVVNCX0hPU1Qgc3RhdGUgaXMgdHJ1ZSwgYW5kCisgKiAgICBFWFRDT05fUFJPUF9VU0JfU1MgcHJvcGVydHkgaXMgdHJ1ZS4KKyAqICAgIEVYVENPTl9ESVNQX0RQIHN0YXRlIGlzIGZhbHNlLgorICoKKyAqIDIuIERQIG9ubHkgbW9kZToKKyAqICAgIEVYVENPTl9ESVNQX0RQIHN0YXRlIGlzIHRydWUsIGFuZAorICogICAgRVhUQ09OX1BST1BfVVNCX1NTIHByb3BlcnR5IGlzIGZhbHNlLgorICogICAgSWYgRVhUQ09OX1VTQl9IT1NUIHN0YXRlIGlzIHRydWUsIGl0IGlzIERQICsgVVNCMiBtb2RlLCBzaW5jZSB0aGUgVVNCMiBwaHkKKyAqICAgIGlzIGEgc2VwYXJhdGUgcGh5LCBzbyB0aGlzIGNhc2UgaXMgc3RpbGwgRFAgb25seSBtb2RlLgorICoKKyAqIDMuIFVTQjMrRFAgbW9kZToKKyAqICAgIEVYVENPTl9VU0JfSE9TVCBhbmQgRVhUQ09OX0RJU1BfRFAgYXJlIGJvdGggdHJ1ZSwgYW5kCisgKiAgICBFWFRDT05fUFJPUF9VU0JfU1MgcHJvcGVydHkgaXMgdHJ1ZS4KKyAqCisgKiBUaGlzIFR5cGUtQyBQSFkgZHJpdmVyIHN1cHBvcnRzIG5vcm1hbCBhbmQgZmxpcCBvcmllbnRhdGlvbi4gVGhlIG9yaWVudGF0aW9uCisgKiBpcyByZXBvcnRlZCBieSB0aGUgRVhUQ09OX1BST1BfVVNCX1RZUEVDX1BPTEFSSVRZIHByb3BlcnR5OiB0cnVlIGlzIGZsaXAKKyAqIG9yaWVudGF0aW9uLCBmYWxzZSBpcyBub3JtYWwgb3JpZW50YXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGNvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorCisjZGVmaW5lIENNTl9TU01fQkFOREdBUAkJCSgweDIxIDw8IDIpCisjZGVmaW5lIENNTl9TU01fQklBUwkJCSgweDIyIDw8IDIpCisjZGVmaW5lIENNTl9QTExTTTBfUExMRU4JCSgweDI5IDw8IDIpCisjZGVmaW5lIENNTl9QTExTTTBfUExMUFJFCQkoMHgyYSA8PCAyKQorI2RlZmluZSBDTU5fUExMU00wX1BMTFZSRUYJCSgweDJiIDw8IDIpCisjZGVmaW5lIENNTl9QTExTTTBfUExMTE9DSwkJKDB4MmMgPDwgMikKKyNkZWZpbmUgQ01OX1BMTFNNMV9QTExFTgkJKDB4MzEgPDwgMikKKyNkZWZpbmUgQ01OX1BMTFNNMV9QTExQUkUJCSgweDMyIDw8IDIpCisjZGVmaW5lIENNTl9QTExTTTFfUExMVlJFRgkJKDB4MzMgPDwgMikKKyNkZWZpbmUgQ01OX1BMTFNNMV9QTExMT0NLCQkoMHgzNCA8PCAyKQorI2RlZmluZSBDTU5fUExMU00xX1VTRVJfREVGX0NUUkwJKDB4MzcgPDwgMikKKyNkZWZpbmUgQ01OX0lDQUxfT1ZSRAkJCSgweGMxIDw8IDIpCisjZGVmaW5lIENNTl9QTEwwX1ZDT0NBTF9PVlJECQkoMHg4MyA8PCAyKQorI2RlZmluZSBDTU5fUExMMF9WQ09DQUxfSU5JVAkJKDB4ODQgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDBfVkNPQ0FMX0lURVIJCSgweDg1IDw8IDIpCisjZGVmaW5lIENNTl9QTEwwX0xPQ0tfUkVGQ05UX1NUQVJUCSgweDkwIDw8IDIpCisjZGVmaW5lIENNTl9QTEwwX0xPQ0tfUExMQ05UX1NUQVJUCSgweDkyIDw8IDIpCisjZGVmaW5lIENNTl9QTEwwX0xPQ0tfUExMQ05UX1RIUgkoMHg5MyA8PCAyKQorI2RlZmluZSBDTU5fUExMMF9JTlRESVYJCQkoMHg5NCA8PCAyKQorI2RlZmluZSBDTU5fUExMMF9GUkFDRElWCQkoMHg5NSA8PCAyKQorI2RlZmluZSBDTU5fUExMMF9ISUdIX1RIUgkJKDB4OTYgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDBfRFNNX0RJQUcJCSgweDk3IDw8IDIpCisjZGVmaW5lIENNTl9QTEwwX1NTX0NUUkwxCQkoMHg5OCA8PCAyKQorI2RlZmluZSBDTU5fUExMMF9TU19DVFJMMgkJKDB4OTkgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDFfVkNPQ0FMX1NUQVJUCQkoMHhhMSA8PCAyKQorI2RlZmluZSBDTU5fUExMMV9WQ09DQUxfT1ZSRAkJKDB4YTMgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDFfVkNPQ0FMX0lOSVQJCSgweGE0IDw8IDIpCisjZGVmaW5lIENNTl9QTEwxX1ZDT0NBTF9JVEVSCQkoMHhhNSA8PCAyKQorI2RlZmluZSBDTU5fUExMMV9MT0NLX1JFRkNOVF9TVEFSVAkoMHhiMCA8PCAyKQorI2RlZmluZSBDTU5fUExMMV9MT0NLX1BMTENOVF9TVEFSVAkoMHhiMiA8PCAyKQorI2RlZmluZSBDTU5fUExMMV9MT0NLX1BMTENOVF9USFIJKDB4YjMgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDFfSU5URElWCQkJKDB4YjQgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDFfRlJBQ0RJVgkJKDB4YjUgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDFfSElHSF9USFIJCSgweGI2IDw8IDIpCisjZGVmaW5lIENNTl9QTEwxX0RTTV9ESUFHCQkoMHhiNyA8PCAyKQorI2RlZmluZSBDTU5fUExMMV9TU19DVFJMMQkJKDB4YjggPDwgMikKKyNkZWZpbmUgQ01OX1BMTDFfU1NfQ1RSTDIJCSgweGI5IDw8IDIpCisjZGVmaW5lIENNTl9SWENBTF9PVlJECQkJKDB4ZDEgPDwgMikKKyNkZWZpbmUgQ01OX1RYUFVDQUxfQ1RSTAkJKDB4ZTAgPDwgMikKKyNkZWZpbmUgQ01OX1RYUFVDQUxfT1ZSRAkJKDB4ZTEgPDwgMikKKyNkZWZpbmUgQ01OX1RYUERDQUxfT1ZSRAkJKDB4ZjEgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9GQkhfT1ZSRAkJKDB4MWMwIDw8IDIpCisjZGVmaW5lIENNTl9ESUFHX1BMTDBfRkJMX09WUkQJCSgweDFjMSA8PCAyKQorI2RlZmluZSBDTU5fRElBR19QTEwwX09WUkQJCSgweDFjMiA8PCAyKQorI2RlZmluZSBDTU5fRElBR19QTEwwX1YySV9UVU5FCQkoMHgxYzUgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9DUF9UVU5FCQkoMHgxYzYgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9MRl9QUk9HCQkoMHgxYzcgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMV9GQkhfT1ZSRAkJKDB4MWQwIDw8IDIpCisjZGVmaW5lIENNTl9ESUFHX1BMTDFfRkJMX09WUkQJCSgweDFkMSA8PCAyKQorI2RlZmluZSBDTU5fRElBR19QTEwxX09WUkQJCSgweDFkMiA8PCAyKQorI2RlZmluZSBDTU5fRElBR19QTEwxX1YySV9UVU5FCQkoMHgxZDUgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMV9DUF9UVU5FCQkoMHgxZDYgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMV9MRl9QUk9HCQkoMHgxZDcgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMV9QVEFUSVNfVFVORTEJKDB4MWQ4IDw8IDIpCisjZGVmaW5lIENNTl9ESUFHX1BMTDFfUFRBVElTX1RVTkUyCSgweDFkOSA8PCAyKQorI2RlZmluZSBDTU5fRElBR19QTEwxX0lOQ0xLX0NUUkwJKDB4MWRhIDw8IDIpCisjZGVmaW5lIENNTl9ESUFHX0hTQ0xLX1NFTAkJKDB4MWUwIDw8IDIpCisKKyNkZWZpbmUgWENWUl9QU01fUkNUUkwobikJCSgoMHg0MDAxIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgWENWUl9QU01fQ0FMX1RNUihuKQkJKCgweDQwMDIgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBYQ1ZSX1BTTV9BMElOX1RNUihuKQkJKCgweDQwMDMgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX0NBTF9TQ0xSX01VTFQobikJKCgweDQwNDcgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX0NQT1NUX01VTFRfMDAobikJKCgweDQwNGMgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX0NQT1NUX01VTFRfMDEobikJKCgweDQwNGQgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX0NQT1NUX01VTFRfMTAobikJKCgweDQwNGUgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX0NQT1NUX01VTFRfMTEobikJKCgweDQwNGYgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX01HTkZTX01VTFRfMDAwKG4pCSgoMHg0MDUwIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfVFhDQ19NR05GU19NVUxUXzAwMShuKQkoKDB4NDA1MSB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX1RYQ0NfTUdORlNfTVVMVF8wMTAobikJKCgweDQwNTIgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX01HTkZTX01VTFRfMDExKG4pCSgoMHg0MDUzIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfVFhDQ19NR05GU19NVUxUXzEwMChuKQkoKDB4NDA1NCB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX1RYQ0NfTUdORlNfTVVMVF8xMDEobikJKCgweDQwNTUgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX01HTkZTX01VTFRfMTEwKG4pCSgoMHg0MDU2IHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfVFhDQ19NR05GU19NVUxUXzExMShuKQkoKDB4NDA1NyB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFhDVlJfRElBR19QTExEUkNfQ1RSTChuKQkoKDB4NDBlMCB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFhDVlJfRElBR19CSURJX0NUUkwobikJCSgoMHg0MGU4IHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgWENWUl9ESUFHX0xBTkVfRkNNX0VOX01HTihuKQkoKDB4NDBmMiB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX1BTQ19BMChuKQkJCSgoMHg0MTAwIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfUFNDX0ExKG4pCQkJKCgweDQxMDEgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9QU0NfQTIobikJCQkoKDB4NDEwMiB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX1BTQ19BMyhuKQkJCSgoMHg0MTAzIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfUkNWREVUX0NUUkwobikJCSgoMHg0MTIwIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfUkNWREVUX0VOX1RNUihuKQkJKCgweDQxMjIgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9SQ1ZERVRfU1RfVE1SKG4pCQkoKDB4NDEyMyB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX0RJQUdfVFhfRFJWKG4pCQkoKDB4NDFlMSB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX0RJQUdfQkdSRUZfUFJFRFJWX0RFTEFZCSgweDQxZTcgPDwgMikKKyNkZWZpbmUgVFhfQU5BX0NUUkxfUkVHXzEJCSgweDUwMjAgPDwgMikKKyNkZWZpbmUgVFhfQU5BX0NUUkxfUkVHXzIJCSgweDUwMjEgPDwgMikKKyNkZWZpbmUgVFhEQV9DT0VGRl9DQUxDX0NUUkwJCSgweDUwMjIgPDwgMikKKyNkZWZpbmUgVFhfRElHX0NUUkxfUkVHXzIJCSgweDUwMjQgPDwgMikKKyNkZWZpbmUgVFhEQV9DWUFfQVVYREFfQ1lBCQkoMHg1MDI1IDw8IDIpCisjZGVmaW5lIFRYX0FOQV9DVFJMX1JFR18zCQkoMHg1MDI2IDw8IDIpCisjZGVmaW5lIFRYX0FOQV9DVFJMX1JFR180CQkoMHg1MDI3IDw8IDIpCisjZGVmaW5lIFRYX0FOQV9DVFJMX1JFR181CQkoMHg1MDI5IDw8IDIpCisKKyNkZWZpbmUgUlhfUFNDX0EwKG4pCQkJKCgweDgwMDAgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBSWF9QU0NfQTEobikJCQkoKDB4ODAwMSB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFJYX1BTQ19BMihuKQkJCSgoMHg4MDAyIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgUlhfUFNDX0EzKG4pCQkJKCgweDgwMDMgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBSWF9QU0NfQ0FMKG4pCQkJKCgweDgwMDYgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBSWF9QU0NfUkRZKG4pCQkJKCgweDgwMDcgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBSWF9JUVBJX0lMTF9DQUxfT1ZSRAkJKDB4ODAyMyA8PCAyKQorI2RlZmluZSBSWF9FUElfSUxMX0NBTF9PVlJECQkoMHg4MDMzIDw8IDIpCisjZGVmaW5lIFJYX1NEQ0FMMF9PVlJECQkJKDB4ODA0MSA8PCAyKQorI2RlZmluZSBSWF9TRENBTDFfT1ZSRAkJCSgweDgwNDkgPDwgMikKKyNkZWZpbmUgUlhfU0xDX0lOSVQJCQkoMHg4MDZkIDw8IDIpCisjZGVmaW5lIFJYX1NMQ19SVU4JCQkoMHg4MDZlIDw8IDIpCisjZGVmaW5lIFJYX0NEUkxGX0NORkcyCQkJKDB4ODA4MSA8PCAyKQorI2RlZmluZSBSWF9TSUdERVRfSExfRklMVF9UTVIobikJKCgweDgwOTAgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBSWF9TTENfSU9QMF9PVlJECQkoMHg4MTAxIDw8IDIpCisjZGVmaW5lIFJYX1NMQ19JT1AxX09WUkQJCSgweDgxMDUgPDwgMikKKyNkZWZpbmUgUlhfU0xDX1FPUDBfT1ZSRAkJKDB4ODEwOSA8PCAyKQorI2RlZmluZSBSWF9TTENfUU9QMV9PVlJECQkoMHg4MTBkIDw8IDIpCisjZGVmaW5lIFJYX1NMQ19FT1AwX09WUkQJCSgweDgxMTEgPDwgMikKKyNkZWZpbmUgUlhfU0xDX0VPUDFfT1ZSRAkJKDB4ODExNSA8PCAyKQorI2RlZmluZSBSWF9TTENfSU9OMF9PVlJECQkoMHg4MTE5IDw8IDIpCisjZGVmaW5lIFJYX1NMQ19JT04xX09WUkQJCSgweDgxMWQgPDwgMikKKyNkZWZpbmUgUlhfU0xDX1FPTjBfT1ZSRAkJKDB4ODEyMSA8PCAyKQorI2RlZmluZSBSWF9TTENfUU9OMV9PVlJECQkoMHg4MTI1IDw8IDIpCisjZGVmaW5lIFJYX1NMQ19FT04wX09WUkQJCSgweDgxMjkgPDwgMikKKyNkZWZpbmUgUlhfU0xDX0VPTjFfT1ZSRAkJKDB4ODEyZCA8PCAyKQorI2RlZmluZSBSWF9TTENfSUVQMF9PVlJECQkoMHg4MTMxIDw8IDIpCisjZGVmaW5lIFJYX1NMQ19JRVAxX09WUkQJCSgweDgxMzUgPDwgMikKKyNkZWZpbmUgUlhfU0xDX1FFUDBfT1ZSRAkJKDB4ODEzOSA8PCAyKQorI2RlZmluZSBSWF9TTENfUUVQMV9PVlJECQkoMHg4MTNkIDw8IDIpCisjZGVmaW5lIFJYX1NMQ19FRVAwX09WUkQJCSgweDgxNDEgPDwgMikKKyNkZWZpbmUgUlhfU0xDX0VFUDFfT1ZSRAkJKDB4ODE0NSA8PCAyKQorI2RlZmluZSBSWF9TTENfSUVOMF9PVlJECQkoMHg4MTQ5IDw8IDIpCisjZGVmaW5lIFJYX1NMQ19JRU4xX09WUkQJCSgweDgxNGQgPDwgMikKKyNkZWZpbmUgUlhfU0xDX1FFTjBfT1ZSRAkJKDB4ODE1MSA8PCAyKQorI2RlZmluZSBSWF9TTENfUUVOMV9PVlJECQkoMHg4MTU1IDw8IDIpCisjZGVmaW5lIFJYX1NMQ19FRU4wX09WUkQJCSgweDgxNTkgPDwgMikKKyNkZWZpbmUgUlhfU0xDX0VFTjFfT1ZSRAkJKDB4ODE1ZCA8PCAyKQorI2RlZmluZSBSWF9SRUVfQ1RSTF9EQVRBX01BU0sobikJKCgweDgxYmIgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBSWF9ESUFHX1NJR0RFVF9UVU5FKG4pCQkoKDB4ODFkYyB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFJYX0RJQUdfU0MyQ19ERUxBWQkJKDB4ODFlMSA8PCAyKQorCisjZGVmaW5lIFBNQV9MQU5FX0NGRwkJCSgweGMwMDAgPDwgMikKKyNkZWZpbmUgUElQRV9DTU5fQ1RSTDEJCQkoMHhjMDAxIDw8IDIpCisjZGVmaW5lIFBJUEVfQ01OX0NUUkwyCQkJKDB4YzAwMiA8PCAyKQorI2RlZmluZSBQSVBFX0NPTV9MT0NLX0NGRzEJCSgweGMwMDMgPDwgMikKKyNkZWZpbmUgUElQRV9DT01fTE9DS19DRkcyCQkoMHhjMDA0IDw8IDIpCisjZGVmaW5lIFBJUEVfUkNWX0RFVF9JTkgJCSgweGMwMDUgPDwgMikKKyNkZWZpbmUgRFBfTU9ERV9DVEwJCQkoMHhjMDA4IDw8IDIpCisjZGVmaW5lIERQX0NMS19DVEwJCQkoMHhjMDA5IDw8IDIpCisjZGVmaW5lIFNUUwkJCQkoMHhjMDBGIDw8IDIpCisjZGVmaW5lIFBIWV9JU09fQ01OX0NUUkwJCSgweGMwMTAgPDwgMikKKyNkZWZpbmUgUEhZX0RQX1RYX0NUTAkJCSgweGM0MDggPDwgMikKKyNkZWZpbmUgUE1BX0NNTl9DVFJMMQkJCSgweGM4MDAgPDwgMikKKyNkZWZpbmUgUEhZX1BNQV9JU09fQ01OX0NUUkwJCSgweGM4MTAgPDwgMikKKyNkZWZpbmUgUEhZX0lTT0xBVElPTl9DVFJMCQkoMHhjODFmIDw8IDIpCisjZGVmaW5lIFBIWV9QTUFfSVNPX1hDVlJfQ1RSTChuKQkoKDB4Y2MxMSB8ICgobikgPDwgNikpIDw8IDIpCisjZGVmaW5lIFBIWV9QTUFfSVNPX0xJTktfTU9ERShuKQkoKDB4Y2MxMiB8ICgobikgPDwgNikpIDw8IDIpCisjZGVmaW5lIFBIWV9QTUFfSVNPX1BXUlNUX0NUUkwobikJKCgweGNjMTMgfCAoKG4pIDw8IDYpKSA8PCAyKQorI2RlZmluZSBQSFlfUE1BX0lTT19UWF9EQVRBX0xPKG4pCSgoMHhjYzE0IHwgKChuKSA8PCA2KSkgPDwgMikKKyNkZWZpbmUgUEhZX1BNQV9JU09fVFhfREFUQV9ISShuKQkoKDB4Y2MxNSB8ICgobikgPDwgNikpIDw8IDIpCisjZGVmaW5lIFBIWV9QTUFfSVNPX1JYX0RBVEFfTE8obikJKCgweGNjMTYgfCAoKG4pIDw8IDYpKSA8PCAyKQorI2RlZmluZSBQSFlfUE1BX0lTT19SWF9EQVRBX0hJKG4pCSgoMHhjYzE3IHwgKChuKSA8PCA2KSkgPDwgMikKKyNkZWZpbmUgVFhfQklTVF9DVFJMKG4pCQkJKCgweDQxNDAgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9CSVNUX1VERFdSKG4pCQkoKDB4NDE0MSB8ICgobikgPDwgOSkpIDw8IDIpCisKKy8qCisgKiBTZWxlY3RzIHdoaWNoIFBMTCBjbG9jayB3aWxsIGJlIGRyaXZlbiBvbiB0aGUgYW5hbG9nIGhpZ2ggc3BlZWQKKyAqIGNsb2NrIDA6IFBMTCAwIGRpdiAxCisgKiBjbG9jayAxOiBQTEwgMSBkaXYgMgorICovCisjZGVmaW5lIENMS19QTExfQ09ORklHCQkJMFgzMAorI2RlZmluZSBDTEtfUExMX01BU0sJCQkweDMzCisKKyNkZWZpbmUgQ01OX1JFQURZCQkJQklUKDApCisKKyNkZWZpbmUgRFBfUExMX0NMT0NLX0VOQUJMRQkJQklUKDIpCisjZGVmaW5lIERQX1BMTF9FTkFCTEUJCQlCSVQoMCkKKyNkZWZpbmUgRFBfUExMX0RBVEFfUkFURV9SQlIJCSgoMiA8PCAxMikgfCAoNCA8PCA4KSkKKyNkZWZpbmUgRFBfUExMX0RBVEFfUkFURV9IQlIJCSgoMiA8PCAxMikgfCAoNCA8PCA4KSkKKyNkZWZpbmUgRFBfUExMX0RBVEFfUkFURV9IQlIyCQkoKDEgPDwgMTIpIHwgKDIgPDwgOCkpCisKKyNkZWZpbmUgRFBfTU9ERV9BMAkJCUJJVCg0KQorI2RlZmluZSBEUF9NT0RFX0EyCQkJQklUKDYpCisjZGVmaW5lIERQX01PREVfRU5URVJfQTAJCTB4YzEwMQorI2RlZmluZSBEUF9NT0RFX0VOVEVSX0EyCQkweGMxMDQKKworI2RlZmluZSBQSFlfTU9ERV9TRVRfVElNRU9VVAkJMTAwMDAwCisKKyNkZWZpbmUgUElOX0FTU0lHTl9DX0UJCQkweDUxZDkKKyNkZWZpbmUgUElOX0FTU0lHTl9EX0YJCQkweDUxMDAKKworI2RlZmluZSBNT0RFX0RJU0NPTk5FQ1QJCQkwCisjZGVmaW5lIE1PREVfVUZQX1VTQgkJCUJJVCgwKQorI2RlZmluZSBNT0RFX0RGUF9VU0IJCQlCSVQoMSkKKyNkZWZpbmUgTU9ERV9ERlBfRFAJCQlCSVQoMikKKworc3RydWN0IHVzYjNwaHlfcmVnIHsKKwl1MzIgb2Zmc2V0OworCXUzMiBlbmFibGVfYml0OworCXUzMiB3cml0ZV9lbmFibGU7Cit9OworCitzdHJ1Y3Qgcm9ja2NoaXBfdXNiM3BoeV9wb3J0X2NmZyB7CisJc3RydWN0IHVzYjNwaHlfcmVnIHR5cGVjX2Nvbm5fZGlyOworCXN0cnVjdCB1c2IzcGh5X3JlZyB1c2IzdG91c2IyX2VuOworCXN0cnVjdCB1c2IzcGh5X3JlZyBleHRlcm5hbF9wc207CisJc3RydWN0IHVzYjNwaHlfcmVnIHBpcGVfc3RhdHVzOworfTsKKworc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzdHJ1Y3QgZXh0Y29uX2RldiAqZXh0Y29uOworCXN0cnVjdCByZWdtYXAgKmdyZl9yZWdzOworCXN0cnVjdCBjbGsgKmNsa19jb3JlOworCXN0cnVjdCBjbGsgKmNsa19yZWY7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wgKnVwaHlfcnN0OworCXN0cnVjdCByZXNldF9jb250cm9sICpwaXBlX3JzdDsKKwlzdHJ1Y3QgcmVzZXRfY29udHJvbCAqdGNwaHlfcnN0OworCXN0cnVjdCByb2NrY2hpcF91c2IzcGh5X3BvcnRfY2ZnIHBvcnRfY2ZnczsKKwkvKiBtdXRleCB0byBwcm90ZWN0IGFjY2VzcyB0byBpbmRpdmlkdWFsIFBIWXMgKi8KKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKworCWJvb2wgZmxpcDsKKwl1OCBtb2RlOworfTsKKworc3RydWN0IHBoeV9yZWcgeworCXUxNiB2YWx1ZTsKKwl1MzIgYWRkcjsKK307CisKK3N0cnVjdCBwaHlfcmVnIHVzYjNfcGxsX2NmZ1tdID0geworCXsgMHhmMCwJCUNNTl9QTEwwX1ZDT0NBTF9JTklUIH0sCisJeyAweDE4LAkJQ01OX1BMTDBfVkNPQ0FMX0lURVIgfSwKKwl7IDB4ZDAsCQlDTU5fUExMMF9JTlRESVYgfSwKKwl7IDB4NGE0YSwJQ01OX1BMTDBfRlJBQ0RJViB9LAorCXsgMHgzNCwJCUNNTl9QTEwwX0hJR0hfVEhSIH0sCisJeyAweDFlZSwJQ01OX1BMTDBfU1NfQ1RSTDEgfSwKKwl7IDB4N2YwMywJQ01OX1BMTDBfU1NfQ1RSTDIgfSwKKwl7IDB4MjAsCQlDTU5fUExMMF9EU01fRElBRyB9LAorCXsgMCwJCUNNTl9ESUFHX1BMTDBfT1ZSRCB9LAorCXsgMCwJCUNNTl9ESUFHX1BMTDBfRkJIX09WUkQgfSwKKwl7IDAsCQlDTU5fRElBR19QTEwwX0ZCTF9PVlJEIH0sCisJeyAweDcsCQlDTU5fRElBR19QTEwwX1YySV9UVU5FIH0sCisJeyAweDQ1LAkJQ01OX0RJQUdfUExMMF9DUF9UVU5FIH0sCisJeyAweDgsCQlDTU5fRElBR19QTEwwX0xGX1BST0cgfSwKK307CisKK3N0cnVjdCBwaHlfcmVnIGRwX3BsbF9jZmdbXSA9IHsKKwl7IDB4ZjAsCQlDTU5fUExMMV9WQ09DQUxfSU5JVCB9LAorCXsgMHgxOCwJCUNNTl9QTEwxX1ZDT0NBTF9JVEVSIH0sCisJeyAweDMwYjksCUNNTl9QTEwxX1ZDT0NBTF9TVEFSVCB9LAorCXsgMHgyMWMsCUNNTl9QTEwxX0lOVERJViB9LAorCXsgMCwJCUNNTl9QTEwxX0ZSQUNESVYgfSwKKwl7IDB4NSwJCUNNTl9QTEwxX0hJR0hfVEhSIH0sCisJeyAweDM1LAkJQ01OX1BMTDFfU1NfQ1RSTDEgfSwKKwl7IDB4N2YxZSwJQ01OX1BMTDFfU1NfQ1RSTDIgfSwKKwl7IDB4MjAsCQlDTU5fUExMMV9EU01fRElBRyB9LAorCXsgMCwJCUNNTl9QTExTTTFfVVNFUl9ERUZfQ1RSTCB9LAorCXsgMCwJCUNNTl9ESUFHX1BMTDFfT1ZSRCB9LAorCXsgMCwJCUNNTl9ESUFHX1BMTDFfRkJIX09WUkQgfSwKKwl7IDAsCQlDTU5fRElBR19QTEwxX0ZCTF9PVlJEIH0sCisJeyAweDYsCQlDTU5fRElBR19QTEwxX1YySV9UVU5FIH0sCisJeyAweDQ1LAkJQ01OX0RJQUdfUExMMV9DUF9UVU5FIH0sCisJeyAweDgsCQlDTU5fRElBR19QTEwxX0xGX1BST0cgfSwKKwl7IDB4MTAwLAlDTU5fRElBR19QTEwxX1BUQVRJU19UVU5FMSB9LAorCXsgMHg3LAkJQ01OX0RJQUdfUExMMV9QVEFUSVNfVFVORTIgfSwKKwl7IDB4NCwJCUNNTl9ESUFHX1BMTDFfSU5DTEtfQ1RSTCB9LAorfTsKKworc3RhdGljIHZvaWQgdGNwaHlfY2ZnXzI0bShzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSkKK3sKKwl1MzIgaSwgcmRhdGE7CisKKwkvKgorCSAqIGNtbl9yZWZfY2xrX3NlbCA9IDMsIHNlbGVjdCB0aGUgMjRNaHogZm9yIGNsayBwYXJlbnQKKwkgKiBjbW5fcHNtX2Nsa19kaWdfZGl2ID0gMiwgc2V0IHRoZSBjbGsgZGl2aXNpb24gdG8gMgorCSAqLworCXdyaXRlbCgweDgzMCwgdGNwaHktPmJhc2UgKyBQTUFfQ01OX0NUUkwxKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCS8qCisJCSAqIFRoZSBmb2xsb3dpbmcgUEhZIGNvbmZpZ3VyYXRpb24gYXNzdW1lcyBhIDI0IE1IeiByZWZlcmVuY2UKKwkJICogY2xvY2suCisJCSAqLworCQl3cml0ZWwoMHg5MCwgdGNwaHktPmJhc2UgKyBYQ1ZSX0RJQUdfTEFORV9GQ01fRU5fTUdOKGkpKTsKKwkJd3JpdGVsKDB4OTYwLCB0Y3BoeS0+YmFzZSArIFRYX1JDVkRFVF9FTl9UTVIoaSkpOworCQl3cml0ZWwoMHgzMCwgdGNwaHktPmJhc2UgKyBUWF9SQ1ZERVRfU1RfVE1SKGkpKTsKKwl9CisKKwlyZGF0YSA9IHJlYWRsKHRjcGh5LT5iYXNlICsgQ01OX0RJQUdfSFNDTEtfU0VMKTsKKwlyZGF0YSAmPSB+Q0xLX1BMTF9NQVNLOworCXJkYXRhIHw9IENMS19QTExfQ09ORklHOworCXdyaXRlbChyZGF0YSwgdGNwaHktPmJhc2UgKyBDTU5fRElBR19IU0NMS19TRUwpOworfQorCitzdGF0aWMgdm9pZCB0Y3BoeV9jZmdfdXNiM19wbGwoc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHkpCit7CisJdTMyIGk7CisKKwkvKiBsb2FkIHRoZSBjb25maWd1cmF0aW9uIG9mIFBMTDAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh1c2IzX3BsbF9jZmcpOyBpKyspCisJCXdyaXRlbCh1c2IzX3BsbF9jZmdbaV0udmFsdWUsCisJCSAgICAgICB0Y3BoeS0+YmFzZSArIHVzYjNfcGxsX2NmZ1tpXS5hZGRyKTsKK30KKworc3RhdGljIHZvaWQgdGNwaHlfY2ZnX2RwX3BsbChzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSkKK3sKKwl1MzIgaTsKKworCS8qIHNldCB0aGUgZGVmYXVsdCBtb2RlIHRvIFJCUiAqLworCXdyaXRlbChEUF9QTExfQ0xPQ0tfRU5BQkxFIHwgRFBfUExMX0VOQUJMRSB8IERQX1BMTF9EQVRBX1JBVEVfUkJSLAorCSAgICAgICB0Y3BoeS0+YmFzZSArIERQX0NMS19DVEwpOworCisJLyogbG9hZCB0aGUgY29uZmlndXJhdGlvbiBvZiBQTEwxICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHBfcGxsX2NmZyk7IGkrKykKKwkJd3JpdGVsKGRwX3BsbF9jZmdbaV0udmFsdWUsIHRjcGh5LT5iYXNlICsgZHBfcGxsX2NmZ1tpXS5hZGRyKTsKK30KKworc3RhdGljIHZvaWQgdGNwaHlfdHhfdXNiM19jZmdfbGFuZShzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSwgdTMyIGxhbmUpCit7CisJd3JpdGVsKDB4Nzc5OSwgdGNwaHktPmJhc2UgKyBUWF9QU0NfQTAobGFuZSkpOworCXdyaXRlbCgweDc3OTgsIHRjcGh5LT5iYXNlICsgVFhfUFNDX0ExKGxhbmUpKTsKKwl3cml0ZWwoMHg1MDk4LCB0Y3BoeS0+YmFzZSArIFRYX1BTQ19BMihsYW5lKSk7CisJd3JpdGVsKDB4NTA5OCwgdGNwaHktPmJhc2UgKyBUWF9QU0NfQTMobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8wMDAobGFuZSkpOworCXdyaXRlbCgweGJmLCB0Y3BoeS0+YmFzZSArIFhDVlJfRElBR19CSURJX0NUUkwobGFuZSkpOworfQorCitzdGF0aWMgdm9pZCB0Y3BoeV9yeF91c2IzX2NmZ19sYW5lKHN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5LCB1MzIgbGFuZSkKK3sKKwl3cml0ZWwoMHhhNmZkLCB0Y3BoeS0+YmFzZSArIFJYX1BTQ19BMChsYW5lKSk7CisJd3JpdGVsKDB4YTZmZCwgdGNwaHktPmJhc2UgKyBSWF9QU0NfQTEobGFuZSkpOworCXdyaXRlbCgweGE0MTAsIHRjcGh5LT5iYXNlICsgUlhfUFNDX0EyKGxhbmUpKTsKKwl3cml0ZWwoMHgyNDEwLCB0Y3BoeS0+YmFzZSArIFJYX1BTQ19BMyhsYW5lKSk7CisJd3JpdGVsKDB4MjNmZiwgdGNwaHktPmJhc2UgKyBSWF9QU0NfQ0FMKGxhbmUpKTsKKwl3cml0ZWwoMHgxMywgdGNwaHktPmJhc2UgKyBSWF9TSUdERVRfSExfRklMVF9UTVIobGFuZSkpOworCXdyaXRlbCgweDAzZTcsIHRjcGh5LT5iYXNlICsgUlhfUkVFX0NUUkxfREFUQV9NQVNLKGxhbmUpKTsKKwl3cml0ZWwoMHgxMDA0LCB0Y3BoeS0+YmFzZSArIFJYX0RJQUdfU0lHREVUX1RVTkUobGFuZSkpOworCXdyaXRlbCgweDIwMTAsIHRjcGh5LT5iYXNlICsgUlhfUFNDX1JEWShsYW5lKSk7CisJd3JpdGVsKDB4ZmIsIHRjcGh5LT5iYXNlICsgWENWUl9ESUFHX0JJRElfQ1RSTChsYW5lKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRjcGh5X2RwX2NmZ19sYW5lKHN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5LCB1MzIgbGFuZSkKK3sKKwl1MTYgcmRhdGE7CisKKwl3cml0ZWwoMHhiZWZjLCB0Y3BoeS0+YmFzZSArIFhDVlJfUFNNX1JDVFJMKGxhbmUpKTsKKwl3cml0ZWwoMHg2Nzk5LCB0Y3BoeS0+YmFzZSArIFRYX1BTQ19BMChsYW5lKSk7CisJd3JpdGVsKDB4Njc5OCwgdGNwaHktPmJhc2UgKyBUWF9QU0NfQTEobGFuZSkpOworCXdyaXRlbCgweDk4LCB0Y3BoeS0+YmFzZSArIFRYX1BTQ19BMihsYW5lKSk7CisJd3JpdGVsKDB4OTgsIHRjcGh5LT5iYXNlICsgVFhfUFNDX0EzKGxhbmUpKTsKKworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8wMDAobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8wMDEobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8wMTAobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8wMTEobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8xMDAobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8xMDEobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8xMTAobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8xMTEobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfQ1BPU1RfTVVMVF8xMChsYW5lKSk7CisJd3JpdGVsKDAsIHRjcGh5LT5iYXNlICsgVFhfVFhDQ19DUE9TVF9NVUxUXzAxKGxhbmUpKTsKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWF9UWENDX0NQT1NUX01VTFRfMDAobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfQ1BPU1RfTVVMVF8xMShsYW5lKSk7CisKKwl3cml0ZWwoMHgxMjgsIHRjcGh5LT5iYXNlICsgVFhfVFhDQ19DQUxfU0NMUl9NVUxUKGxhbmUpKTsKKwl3cml0ZWwoMHg0MDAsIHRjcGh5LT5iYXNlICsgVFhfRElBR19UWF9EUlYobGFuZSkpOworCisJcmRhdGEgPSByZWFkbCh0Y3BoeS0+YmFzZSArIFhDVlJfRElBR19QTExEUkNfQ1RSTChsYW5lKSk7CisJcmRhdGEgPSAocmRhdGEgJiAweDhmZmYpIHwgMHg2MDAwOworCXdyaXRlbChyZGF0YSwgdGNwaHktPmJhc2UgKyBYQ1ZSX0RJQUdfUExMRFJDX0NUUkwobGFuZSkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcm9wZXJ0eV9lbmFibGUoc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHksCisJCQkJICBjb25zdCBzdHJ1Y3QgdXNiM3BoeV9yZWcgKnJlZywgYm9vbCBlbikKK3sKKwl1MzIgbWFzayA9IDEgPDwgcmVnLT53cml0ZV9lbmFibGU7CisJdTMyIHZhbCA9IGVuIDw8IHJlZy0+ZW5hYmxlX2JpdDsKKworCXJldHVybiByZWdtYXBfd3JpdGUodGNwaHktPmdyZl9yZWdzLCByZWctPm9mZnNldCwgdmFsIHwgbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIHRjcGh5X2RwX2F1eF9jYWxpYnJhdGlvbihzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSkKK3sKKwl1MTYgcmRhdGEsIHJkYXRhMiwgdmFsOworCisJLyogZGlzYWJsZSB0eGRhX2NhbF9sYXRjaF9lbiBmb3IgcmV3cml0ZSB0aGUgY2FsaWJyYXRpb24gdmFsdWVzICovCisJcmRhdGEgPSByZWFkbCh0Y3BoeS0+YmFzZSArIFRYX0FOQV9DVFJMX1JFR18xKTsKKwl2YWwgPSByZGF0YSAmIDB4ZGZmZjsKKwl3cml0ZWwodmFsLCB0Y3BoeS0+YmFzZSArIFRYX0FOQV9DVFJMX1JFR18xKTsKKworCS8qCisJICogcmVhZCBhIHJlc2lzdG9yIGNhbGlicmF0aW9uIGNvZGUgZnJvbSBDTU5fVFhQVUNBTF9DVFJMWzY6MF0gYW5kCisJICogd3JpdGUgaXQgdG8gVFhfRElHX0NUUkxfUkVHXzJbNjowXSwgYW5kIGRlbGF5IDFtcyB0byBtYWtlIHN1cmUgaXQKKwkgKiB3b3Jrcy4KKwkgKi8KKwlyZGF0YSA9IHJlYWRsKHRjcGh5LT5iYXNlICsgVFhfRElHX0NUUkxfUkVHXzIpOworCXJkYXRhID0gcmRhdGEgJiAweGZmYzA7CisKKwlyZGF0YTIgPSByZWFkbCh0Y3BoeS0+YmFzZSArIENNTl9UWFBVQ0FMX0NUUkwpOworCXJkYXRhMiA9IHJkYXRhMiAmIDB4M2Y7CisKKwl2YWwgPSByZGF0YSB8IHJkYXRhMjsKKwl3cml0ZWwodmFsLCB0Y3BoeS0+YmFzZSArIFRYX0RJR19DVFJMX1JFR18yKTsKKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMTA1MCk7CisKKwkvKgorCSAqIEVuYWJsZSBzaWduYWwgZm9yIGxhdGNoIHRoYXQgc2FtcGxlIGFuZCBob2xkcyBjYWxpYnJhdGlvbiB2YWx1ZXMuCisJICogQWN0aXZhdGUgdGhpcyBzaWduYWwgZm9yIDEgY2xvY2sgY3ljbGUgdG8gc2FtcGxlIG5ldyBjYWxpYnJhdGlvbgorCSAqIHZhbHVlcy4KKwkgKi8KKwlyZGF0YSA9IHJlYWRsKHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzEpOworCXZhbCA9IHJkYXRhIHwgMHgyMDAwOworCXdyaXRlbCh2YWwsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzEpOworCXVzbGVlcF9yYW5nZSgxNTAsIDIwMCk7CisKKwkvKiBzZXQgVFggVm9sdGFnZSBMZXZlbCBhbmQgVFggRGVlbXBoYXNpcyB0byAwICovCisJd3JpdGVsKDAsIHRjcGh5LT5iYXNlICsgUEhZX0RQX1RYX0NUTCk7CisJLyogcmUtZW5hYmxlIGRlY2FwICovCisJd3JpdGVsKDB4MTAwLCB0Y3BoeS0+YmFzZSArIFRYX0FOQV9DVFJMX1JFR18yKTsKKwl3cml0ZWwoMHgzMDAsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzIpOworCXdyaXRlbCgweDIwMDgsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzEpOworCXdyaXRlbCgweDIwMTgsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzEpOworCisJd3JpdGVsKDAsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzUpOworCisJLyoKKwkgKiBQcm9ncmFtcyB0eGRhX2Rydl9sZG9fcHJvZ1sxNTowXSwgU2V0cyBkcml2ZXIgTERPCisJICogdm9sdGFnZSAxNidoMTAwMSBmb3IgRFAtQVVYLVRYIGFuZCBSWAorCSAqLworCXdyaXRlbCgweDEwMDEsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzQpOworCisJLyogcmUtZW5hYmxlcyBCYW5kZ2FwIHJlZmVyZW5jZSBmb3IgTERPICovCisJd3JpdGVsKDB4MjA5OCwgdGNwaHktPmJhc2UgKyBUWF9BTkFfQ1RSTF9SRUdfMSk7CisJd3JpdGVsKDB4MjE5OCwgdGNwaHktPmJhc2UgKyBUWF9BTkFfQ1RSTF9SRUdfMSk7CisKKwkvKgorCSAqIHJlLWVuYWJsZXMgdGhlIHRyYW5zbWl0dGVyIHByZS1kcml2ZXIsIGRyaXZlciBkYXRhIHNlbGVjdGlvbiBNVVgsCisJICogYW5kIHJlY2VpdmVyIGRldGVjdCBjaXJjdWl0cy4KKwkgKi8KKwl3cml0ZWwoMHgzMDEsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzIpOworCXdyaXRlbCgweDMwMywgdGNwaHktPmJhc2UgKyBUWF9BTkFfQ1RSTF9SRUdfMik7CisKKwkvKgorCSAqIEJJVCAxMjogQ29udHJvbHMgYXV4ZGFfcG9sYXJpdHksIHdoaWNoIHNlbGVjdHMgdGhlIHBvbGFyaXR5IG9mIHRoZQorCSAqIHhjdnI6CisJICogMSwgUmV2ZXJzZXMgdGhlIHBvbGFyaXR5IChJZiBUWVBFQywgUHVsbHMgdXBzIGF1eF9wIGFuZCBwdWxsCisJICogZG93biBhdXhfbSkKKwkgKiAwLCBOb3JtYWwgcG9sYXJpdHkgKGlmIFRZUEVfQywgcHVsbHMgdXAgYXV4X20gYW5kIHB1bGxzIGRvd24KKwkgKiBhdXhfcCkKKwkgKi8KKwl2YWwgPSAweGEwNzg7CisJaWYgKCF0Y3BoeS0+ZmxpcCkKKwkJdmFsIHw9IEJJVCgxMik7CisJd3JpdGVsKHZhbCwgdGNwaHktPmJhc2UgKyBUWF9BTkFfQ1RSTF9SRUdfMSk7CisKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWF9BTkFfQ1RSTF9SRUdfMyk7CisJd3JpdGVsKDAsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzQpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX0FOQV9DVFJMX1JFR181KTsKKworCS8qCisJICogQ29udHJvbHMgbG93X3Bvd2VyX3N3aW5nX2VuLCBzZXQgdGhlIHZvbHRhZ2Ugc3dpbmcgb2YgdGhlIGRyaXZlcgorCSAqIHRvIDQwMG12LiBUaGUgdmFsdWVzCWJlbG93IGFyZSBwZWFrIHRvIHBlYWsgKGRpZmZlcmVudGlhbCkgdmFsdWVzLgorCSAqLworCXdyaXRlbCg0LCB0Y3BoeS0+YmFzZSArIFRYREFfQ09FRkZfQ0FMQ19DVFJMKTsKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWERBX0NZQV9BVVhEQV9DWUEpOworCisJLyogQ29udHJvbHMgdHhfaGlnaF96X3RtX2VuICovCisJdmFsID0gcmVhZGwodGNwaHktPmJhc2UgKyBUWF9ESUdfQ1RSTF9SRUdfMik7CisJdmFsIHw9IEJJVCgxNSk7CisJd3JpdGVsKHZhbCwgdGNwaHktPmJhc2UgKyBUWF9ESUdfQ1RSTF9SRUdfMik7Cit9CisKK3N0YXRpYyBpbnQgdGNwaHlfcGh5X2luaXQoc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHksIHU4IG1vZGUpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjNwaHlfcG9ydF9jZmcgKmNmZyA9ICZ0Y3BoeS0+cG9ydF9jZmdzOworCWludCByZXQsIGk7CisJdTMyIHZhbDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZSh0Y3BoeS0+Y2xrX2NvcmUpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycih0Y3BoeS0+ZGV2LCAiRmFpbGVkIHRvIHByZXBhcmVfZW5hYmxlIGNvcmUgY2xvY2tcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZSh0Y3BoeS0+Y2xrX3JlZik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHRjcGh5LT5kZXYsICJGYWlsZWQgdG8gcHJlcGFyZV9lbmFibGUgcmVmIGNsb2NrXG4iKTsKKwkJZ290byBlcnJfY2xrX2NvcmU7CisJfQorCisJcmVzZXRfY29udHJvbF9kZWFzc2VydCh0Y3BoeS0+dGNwaHlfcnN0KTsKKworCXByb3BlcnR5X2VuYWJsZSh0Y3BoeSwgJmNmZy0+dHlwZWNfY29ubl9kaXIsIHRjcGh5LT5mbGlwKTsKKworCXRjcGh5X2NmZ18yNG0odGNwaHkpOworCisJaWYgKG1vZGUgPT0gTU9ERV9ERlBfRFApIHsKKwkJdGNwaHlfY2ZnX2RwX3BsbCh0Y3BoeSk7CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQl0Y3BoeV9kcF9jZmdfbGFuZSh0Y3BoeSwgaSk7CisKKwkJd3JpdGVsKFBJTl9BU1NJR05fQ19FLCB0Y3BoeS0+YmFzZSArIFBNQV9MQU5FX0NGRyk7CisJfSBlbHNlIHsKKwkJdGNwaHlfY2ZnX3VzYjNfcGxsKHRjcGh5KTsKKwkJdGNwaHlfY2ZnX2RwX3BsbCh0Y3BoeSk7CisJCWlmICh0Y3BoeS0+ZmxpcCkgeworCQkJdGNwaHlfdHhfdXNiM19jZmdfbGFuZSh0Y3BoeSwgMyk7CisJCQl0Y3BoeV9yeF91c2IzX2NmZ19sYW5lKHRjcGh5LCAyKTsKKwkJCXRjcGh5X2RwX2NmZ19sYW5lKHRjcGh5LCAwKTsKKwkJCXRjcGh5X2RwX2NmZ19sYW5lKHRjcGh5LCAxKTsKKwkJfSBlbHNlIHsKKwkJCXRjcGh5X3R4X3VzYjNfY2ZnX2xhbmUodGNwaHksIDApOworCQkJdGNwaHlfcnhfdXNiM19jZmdfbGFuZSh0Y3BoeSwgMSk7CisJCQl0Y3BoeV9kcF9jZmdfbGFuZSh0Y3BoeSwgMik7CisJCQl0Y3BoeV9kcF9jZmdfbGFuZSh0Y3BoeSwgMyk7CisJCX0KKworCQl3cml0ZWwoUElOX0FTU0lHTl9EX0YsIHRjcGh5LT5iYXNlICsgUE1BX0xBTkVfQ0ZHKTsKKwl9CisKKwl3cml0ZWwoRFBfTU9ERV9FTlRFUl9BMiwgdGNwaHktPmJhc2UgKyBEUF9NT0RFX0NUTCk7CisKKwlyZXNldF9jb250cm9sX2RlYXNzZXJ0KHRjcGh5LT51cGh5X3JzdCk7CisKKwlyZXQgPSByZWFkeF9wb2xsX3RpbWVvdXQocmVhZGwsIHRjcGh5LT5iYXNlICsgUE1BX0NNTl9DVFJMMSwKKwkJCQkgdmFsLCB2YWwgJiBDTU5fUkVBRFksIDEwLAorCQkJCSBQSFlfTU9ERV9TRVRfVElNRU9VVCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycih0Y3BoeS0+ZGV2LCAid2FpdCBwbWEgcmVhZHkgdGltZW91dFxuIik7CisJCXJldCA9IC1FVElNRURPVVQ7CisJCWdvdG8gZXJyX3dhaXRfcG1hOworCX0KKworCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQodGNwaHktPnBpcGVfcnN0KTsKKworCXJldHVybiAwOworCitlcnJfd2FpdF9wbWE6CisJcmVzZXRfY29udHJvbF9hc3NlcnQodGNwaHktPnVwaHlfcnN0KTsKKwlyZXNldF9jb250cm9sX2Fzc2VydCh0Y3BoeS0+dGNwaHlfcnN0KTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUodGNwaHktPmNsa19yZWYpOworZXJyX2Nsa19jb3JlOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZSh0Y3BoeS0+Y2xrX2NvcmUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRjcGh5X3BoeV9kZWluaXQoc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHkpCit7CisJcmVzZXRfY29udHJvbF9hc3NlcnQodGNwaHktPnRjcGh5X3JzdCk7CisJcmVzZXRfY29udHJvbF9hc3NlcnQodGNwaHktPnVwaHlfcnN0KTsKKwlyZXNldF9jb250cm9sX2Fzc2VydCh0Y3BoeS0+cGlwZV9yc3QpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZSh0Y3BoeS0+Y2xrX2NvcmUpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZSh0Y3BoeS0+Y2xrX3JlZik7Cit9CisKK3N0YXRpYyBpbnQgdGNwaHlfZ2V0X21vZGUoc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHkpCit7CisJc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYgPSB0Y3BoeS0+ZXh0Y29uOworCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSBwcm9wZXJ0eTsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJYm9vbCBkZnAsIHVmcCwgZHA7CisJdTggbW9kZTsKKwlpbnQgcmV0OworCisJdWZwID0gZXh0Y29uX2dldF9zdGF0ZShlZGV2LCBFWFRDT05fVVNCKTsKKwlkZnAgPSBleHRjb25fZ2V0X3N0YXRlKGVkZXYsIEVYVENPTl9VU0JfSE9TVCk7CisJZHAgPSBleHRjb25fZ2V0X3N0YXRlKGVkZXYsIEVYVENPTl9ESVNQX0RQKTsKKworCW1vZGUgPSBNT0RFX0RGUF9VU0I7CisJaWQgPSBFWFRDT05fVVNCX0hPU1Q7CisKKwlpZiAodWZwKSB7CisJCW1vZGUgPSBNT0RFX1VGUF9VU0I7CisJCWlkID0gRVhUQ09OX1VTQjsKKwl9IGVsc2UgaWYgKGRwKSB7CisJCW1vZGUgPSBNT0RFX0RGUF9EUDsKKwkJaWQgPSBFWFRDT05fRElTUF9EUDsKKworCQlyZXQgPSBleHRjb25fZ2V0X3Byb3BlcnR5KGVkZXYsIGlkLCBFWFRDT05fUFJPUF9VU0JfU1MsCisJCQkJCSAgJnByb3BlcnR5KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycih0Y3BoeS0+ZGV2LCAiZ2V0IHN1cGVyc3BlZWQgcHJvcGVydHkgZmFpbGVkXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAocHJvcGVydHkuaW50dmFsKQorCQkJbW9kZSB8PSBNT0RFX0RGUF9VU0I7CisJfQorCisJcmV0ID0gZXh0Y29uX2dldF9wcm9wZXJ0eShlZGV2LCBpZCwgRVhUQ09OX1BST1BfVVNCX1RZUEVDX1BPTEFSSVRZLAorCQkJCSAgJnByb3BlcnR5KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIodGNwaHktPmRldiwgImdldCBwb2xhcml0eSBwcm9wZXJ0eSBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXRjcGh5LT5mbGlwID0gcHJvcGVydHkuaW50dmFsID8gMSA6IDA7CisKKwlyZXR1cm4gbW9kZTsKK30KKworc3RhdGljIGludCByb2NrY2hpcF91c2IzX3BoeV9wb3dlcl9vbihzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHkgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiM3BoeV9wb3J0X2NmZyAqY2ZnID0gJnRjcGh5LT5wb3J0X2NmZ3M7CisJY29uc3Qgc3RydWN0IHVzYjNwaHlfcmVnICpyZWcgPSAmY2ZnLT5waXBlX3N0YXR1czsKKwlpbnQgdGltZW91dCwgbmV3X21vZGUsIHJldCA9IDA7CisJdTMyIHZhbDsKKworCW11dGV4X2xvY2soJnRjcGh5LT5sb2NrKTsKKworCW5ld19tb2RlID0gdGNwaHlfZ2V0X21vZGUodGNwaHkpOworCWlmIChuZXdfbW9kZSA8IDApIHsKKwkJcmV0ID0gbmV3X21vZGU7CisJCWdvdG8gdW5sb2NrX3JldDsKKwl9CisKKwkvKiBEUC1vbmx5IG1vZGU7IGZhbGwgYmFjayB0byBVU0IyICovCisJaWYgKCEobmV3X21vZGUgJiAoTU9ERV9ERlBfVVNCIHwgTU9ERV9VRlBfVVNCKSkpCisJCWdvdG8gdW5sb2NrX3JldDsKKworCWlmICh0Y3BoeS0+bW9kZSA9PSBuZXdfbW9kZSkKKwkJZ290byB1bmxvY2tfcmV0OworCisJaWYgKHRjcGh5LT5tb2RlID09IE1PREVfRElTQ09OTkVDVCkKKwkJdGNwaHlfcGh5X2luaXQodGNwaHksIG5ld19tb2RlKTsKKworCS8qIHdhaXQgVENQSFkgZm9yIHBpcGUgcmVhZHkgKi8KKwlmb3IgKHRpbWVvdXQgPSAwOyB0aW1lb3V0IDwgMTAwOyB0aW1lb3V0KyspIHsKKwkJcmVnbWFwX3JlYWQodGNwaHktPmdyZl9yZWdzLCByZWctPm9mZnNldCwgJnZhbCk7CisJCWlmICghKHZhbCAmIEJJVChyZWctPmVuYWJsZV9iaXQpKSkgeworCQkJdGNwaHktPm1vZGUgfD0gbmV3X21vZGUgJiAoTU9ERV9ERlBfVVNCIHwgTU9ERV9VRlBfVVNCKTsKKwkJCWdvdG8gdW5sb2NrX3JldDsKKwkJfQorCQl1c2xlZXBfcmFuZ2UoMTAsIDIwKTsKKwl9CisKKwlpZiAodGNwaHktPm1vZGUgPT0gTU9ERV9ESVNDT05ORUNUKQorCQl0Y3BoeV9waHlfZGVpbml0KHRjcGh5KTsKKworCXJldCA9IC1FVElNRURPVVQ7CisKK3VubG9ja19yZXQ6CisJbXV0ZXhfdW5sb2NrKCZ0Y3BoeS0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF91c2IzX3BoeV9wb3dlcl9vZmYoc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisKKwltdXRleF9sb2NrKCZ0Y3BoeS0+bG9jayk7CisKKwlpZiAodGNwaHktPm1vZGUgPT0gTU9ERV9ESVNDT05ORUNUKQorCQlnb3RvIHVubG9jazsKKworCXRjcGh5LT5tb2RlICY9IH4oTU9ERV9VRlBfVVNCIHwgTU9ERV9ERlBfVVNCKTsKKwlpZiAodGNwaHktPm1vZGUgPT0gTU9ERV9ESVNDT05ORUNUKQorCQl0Y3BoeV9waHlfZGVpbml0KHRjcGh5KTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmdGNwaHktPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgcm9ja2NoaXBfdXNiM19waHlfb3BzID0geworCS5wb3dlcl9vbgk9IHJvY2tjaGlwX3VzYjNfcGh5X3Bvd2VyX29uLAorCS5wb3dlcl9vZmYJPSByb2NrY2hpcF91c2IzX3BoeV9wb3dlcl9vZmYsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCByb2NrY2hpcF9kcF9waHlfcG93ZXJfb24oc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisJaW50IG5ld19tb2RlLCByZXQgPSAwOworCXUzMiB2YWw7CisKKwltdXRleF9sb2NrKCZ0Y3BoeS0+bG9jayk7CisKKwluZXdfbW9kZSA9IHRjcGh5X2dldF9tb2RlKHRjcGh5KTsKKwlpZiAobmV3X21vZGUgPCAwKSB7CisJCXJldCA9IG5ld19tb2RlOworCQlnb3RvIHVubG9ja19yZXQ7CisJfQorCisJaWYgKCEobmV3X21vZGUgJiBNT0RFX0RGUF9EUCkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byB1bmxvY2tfcmV0OworCX0KKworCWlmICh0Y3BoeS0+bW9kZSA9PSBuZXdfbW9kZSkKKwkJZ290byB1bmxvY2tfcmV0OworCisJLyoKKwkgKiBJZiB0aGUgUEhZIGhhcyBiZWVuIHBvd2VyIG9uLCBidXQgdGhlIG1vZGUgaXMgbm90IERQIG9ubHkgbW9kZSwKKwkgKiByZS1pbml0IHRoZSBQSFkgZm9yIHNldHRpbmcgYWxsIG9mIDQgbGFuZXMgdG8gRFAuCisJICovCisJaWYgKG5ld19tb2RlID09IE1PREVfREZQX0RQICYmIHRjcGh5LT5tb2RlICE9IE1PREVfRElTQ09OTkVDVCkgeworCQl0Y3BoeV9waHlfZGVpbml0KHRjcGh5KTsKKwkJdGNwaHlfcGh5X2luaXQodGNwaHksIG5ld19tb2RlKTsKKwl9IGVsc2UgaWYgKHRjcGh5LT5tb2RlID09IE1PREVfRElTQ09OTkVDVCkgeworCQl0Y3BoeV9waHlfaW5pdCh0Y3BoeSwgbmV3X21vZGUpOworCX0KKworCXJldCA9IHJlYWR4X3BvbGxfdGltZW91dChyZWFkbCwgdGNwaHktPmJhc2UgKyBEUF9NT0RFX0NUTCwKKwkJCQkgdmFsLCB2YWwgJiBEUF9NT0RFX0EyLCAxMDAwLAorCQkJCSBQSFlfTU9ERV9TRVRfVElNRU9VVCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycih0Y3BoeS0+ZGV2LCAiZmFpbGVkIHRvIHdhaXQgVENQSFkgZW50ZXIgQTJcbiIpOworCQlnb3RvIHBvd2VyX29uX2ZpbmlzaDsKKwl9CisKKwl0Y3BoeV9kcF9hdXhfY2FsaWJyYXRpb24odGNwaHkpOworCisJd3JpdGVsKERQX01PREVfRU5URVJfQTAsIHRjcGh5LT5iYXNlICsgRFBfTU9ERV9DVEwpOworCisJcmV0ID0gcmVhZHhfcG9sbF90aW1lb3V0KHJlYWRsLCB0Y3BoeS0+YmFzZSArIERQX01PREVfQ1RMLAorCQkJCSB2YWwsIHZhbCAmIERQX01PREVfQTAsIDEwMDAsCisJCQkJIFBIWV9NT0RFX1NFVF9USU1FT1VUKTsKKwlpZiAocmV0IDwgMCkgeworCQl3cml0ZWwoRFBfTU9ERV9FTlRFUl9BMiwgdGNwaHktPmJhc2UgKyBEUF9NT0RFX0NUTCk7CisJCWRldl9lcnIodGNwaHktPmRldiwgImZhaWxlZCB0byB3YWl0IFRDUEhZIGVudGVyIEEwXG4iKTsKKwkJZ290byBwb3dlcl9vbl9maW5pc2g7CisJfQorCisJdGNwaHktPm1vZGUgfD0gTU9ERV9ERlBfRFA7CisKK3Bvd2VyX29uX2ZpbmlzaDoKKwlpZiAodGNwaHktPm1vZGUgPT0gTU9ERV9ESVNDT05ORUNUKQorCQl0Y3BoeV9waHlfZGVpbml0KHRjcGh5KTsKK3VubG9ja19yZXQ6CisJbXV0ZXhfdW5sb2NrKCZ0Y3BoeS0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9kcF9waHlfcG93ZXJfb2ZmKHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCisJbXV0ZXhfbG9jaygmdGNwaHktPmxvY2spOworCisJaWYgKHRjcGh5LT5tb2RlID09IE1PREVfRElTQ09OTkVDVCkKKwkJZ290byB1bmxvY2s7CisKKwl0Y3BoeS0+bW9kZSAmPSB+TU9ERV9ERlBfRFA7CisKKwl3cml0ZWwoRFBfTU9ERV9FTlRFUl9BMiwgdGNwaHktPmJhc2UgKyBEUF9NT0RFX0NUTCk7CisKKwlpZiAodGNwaHktPm1vZGUgPT0gTU9ERV9ESVNDT05ORUNUKQorCQl0Y3BoeV9waHlfZGVpbml0KHRjcGh5KTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmdGNwaHktPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgcm9ja2NoaXBfZHBfcGh5X29wcyA9IHsKKwkucG93ZXJfb24JPSByb2NrY2hpcF9kcF9waHlfcG93ZXJfb24sCisJLnBvd2VyX29mZgk9IHJvY2tjaGlwX2RwX3BoeV9wb3dlcl9vZmYsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCB0Y3BoeV9nZXRfcGFyYW0oc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IHVzYjNwaHlfcmVnICpyZWcsCisJCQkgICBjb25zdCBjaGFyICpuYW1lKQoreworCXUzMiBidWZmZXJbM107CisJaW50IHJldDsKKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KGRldi0+b2Zfbm9kZSwgbmFtZSwgYnVmZmVyLCAzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuIG5vdCBwYXJzZSAlc1xuIiwgbmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmVnLT5vZmZzZXQgPSBidWZmZXJbMF07CisJcmVnLT5lbmFibGVfYml0ID0gYnVmZmVyWzFdOworCXJlZy0+d3JpdGVfZW5hYmxlID0gYnVmZmVyWzJdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRjcGh5X3BhcnNlX2R0KHN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5LAorCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjNwaHlfcG9ydF9jZmcgKmNmZyA9ICZ0Y3BoeS0+cG9ydF9jZmdzOworCWludCByZXQ7CisKKwlyZXQgPSB0Y3BoeV9nZXRfcGFyYW0oZGV2LCAmY2ZnLT50eXBlY19jb25uX2RpciwKKwkJCSAgICAgICJyb2NrY2hpcCx0eXBlYy1jb25uLWRpciIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB0Y3BoeV9nZXRfcGFyYW0oZGV2LCAmY2ZnLT51c2IzdG91c2IyX2VuLAorCQkJICAgICAgInJvY2tjaGlwLHVzYjN0b3VzYjItZW4iKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdGNwaHlfZ2V0X3BhcmFtKGRldiwgJmNmZy0+ZXh0ZXJuYWxfcHNtLAorCQkJICAgICAgInJvY2tjaGlwLGV4dGVybmFsLXBzbSIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB0Y3BoeV9nZXRfcGFyYW0oZGV2LCAmY2ZnLT5waXBlX3N0YXR1cywKKwkJCSAgICAgICJyb2NrY2hpcCxwaXBlLXN0YXR1cyIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl0Y3BoeS0+Z3JmX3JlZ3MgPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9waGFuZGxlKGRldi0+b2Zfbm9kZSwKKwkJCQkJCQkgICJyb2NrY2hpcCxncmYiKTsKKwlpZiAoSVNfRVJSKHRjcGh5LT5ncmZfcmVncykpIHsKKwkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgZmluZCBncmYgZHQgbm9kZVxuIik7CisJCXJldHVybiBQVFJfRVJSKHRjcGh5LT5ncmZfcmVncyk7CisJfQorCisJdGNwaHktPmNsa19jb3JlID0gZGV2bV9jbGtfZ2V0KGRldiwgInRjcGRjb3JlIik7CisJaWYgKElTX0VSUih0Y3BoeS0+Y2xrX2NvcmUpKSB7CisJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IGdldCB1cGh5IGNvcmUgY2xvY2tcbiIpOworCQlyZXR1cm4gUFRSX0VSUih0Y3BoeS0+Y2xrX2NvcmUpOworCX0KKworCXRjcGh5LT5jbGtfcmVmID0gZGV2bV9jbGtfZ2V0KGRldiwgInRjcGRwaHktcmVmIik7CisJaWYgKElTX0VSUih0Y3BoeS0+Y2xrX3JlZikpIHsKKwkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgZ2V0IHVwaHkgcmVmIGNsb2NrXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIodGNwaHktPmNsa19yZWYpOworCX0KKworCXRjcGh5LT51cGh5X3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAidXBoeSIpOworCWlmIChJU19FUlIodGNwaHktPnVwaHlfcnN0KSkgeworCQlkZXZfZXJyKGRldiwgIm5vIHVwaHlfcnN0IHJlc2V0IGNvbnRyb2wgZm91bmRcbiIpOworCQlyZXR1cm4gUFRSX0VSUih0Y3BoeS0+dXBoeV9yc3QpOworCX0KKworCXRjcGh5LT5waXBlX3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAidXBoeS1waXBlIik7CisJaWYgKElTX0VSUih0Y3BoeS0+cGlwZV9yc3QpKSB7CisJCWRldl9lcnIoZGV2LCAibm8gcGlwZV9yc3QgcmVzZXQgY29udHJvbCBmb3VuZFxuIik7CisJCXJldHVybiBQVFJfRVJSKHRjcGh5LT5waXBlX3JzdCk7CisJfQorCisJdGNwaHktPnRjcGh5X3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAidXBoeS10Y3BoeSIpOworCWlmIChJU19FUlIodGNwaHktPnRjcGh5X3JzdCkpIHsKKwkJZGV2X2VycihkZXYsICJubyB0Y3BoeV9yc3QgcmVzZXQgY29udHJvbCBmb3VuZFxuIik7CisJCXJldHVybiBQVFJfRVJSKHRjcGh5LT50Y3BoeV9yc3QpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0eXBlY19waHlfcHJlX2luaXQoc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjNwaHlfcG9ydF9jZmcgKmNmZyA9ICZ0Y3BoeS0+cG9ydF9jZmdzOworCisJcmVzZXRfY29udHJvbF9hc3NlcnQodGNwaHktPnRjcGh5X3JzdCk7CisJcmVzZXRfY29udHJvbF9hc3NlcnQodGNwaHktPnVwaHlfcnN0KTsKKwlyZXNldF9jb250cm9sX2Fzc2VydCh0Y3BoeS0+cGlwZV9yc3QpOworCisJLyogc2VsZWN0IGV4dGVybmFsIHBzbSBjbG9jayAqLworCXByb3BlcnR5X2VuYWJsZSh0Y3BoeSwgJmNmZy0+ZXh0ZXJuYWxfcHNtLCAxKTsKKwlwcm9wZXJ0eV9lbmFibGUodGNwaHksICZjZmctPnVzYjN0b3VzYjJfZW4sIDApOworCisJdGNwaHktPm1vZGUgPSBNT0RFX0RJU0NPTk5FQ1Q7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfdHlwZWNfcGh5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGRfbnA7CisJc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHk7CisJc3RydWN0IHBoeV9wcm92aWRlciAqcGh5X3Byb3ZpZGVyOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQ7CisKKwl0Y3BoeSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqdGNwaHkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRjcGh5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJdGNwaHktPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIodGNwaHktPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUih0Y3BoeS0+YmFzZSk7CisKKwlyZXQgPSB0Y3BoeV9wYXJzZV9kdCh0Y3BoeSwgZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdGNwaHktPmRldiA9IGRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB0Y3BoeSk7CisJbXV0ZXhfaW5pdCgmdGNwaHktPmxvY2spOworCisJdHlwZWNfcGh5X3ByZV9pbml0KHRjcGh5KTsKKworCXRjcGh5LT5leHRjb24gPSBleHRjb25fZ2V0X2VkZXZfYnlfcGhhbmRsZShkZXYsIDApOworCWlmIChJU19FUlIodGNwaHktPmV4dGNvbikpIHsKKwkJaWYgKFBUUl9FUlIodGNwaHktPmV4dGNvbikgIT0gLUVQUk9CRV9ERUZFUikKKwkJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBvciBtaXNzaW5nIGV4dGNvblxuIik7CisJCXJldHVybiBQVFJfRVJSKHRjcGh5LT5leHRjb24pOworCX0KKworCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisKKwlmb3JfZWFjaF9hdmFpbGFibGVfY2hpbGRfb2Zfbm9kZShucCwgY2hpbGRfbnApIHsKKwkJc3RydWN0IHBoeSAqcGh5OworCisJCWlmICghb2Zfbm9kZV9jbXAoY2hpbGRfbnAtPm5hbWUsICJkcC1wb3J0IikpCisJCQlwaHkgPSBkZXZtX3BoeV9jcmVhdGUoZGV2LCBjaGlsZF9ucCwKKwkJCQkJICAgICAgJnJvY2tjaGlwX2RwX3BoeV9vcHMpOworCQllbHNlIGlmICghb2Zfbm9kZV9jbXAoY2hpbGRfbnAtPm5hbWUsICJ1c2IzLXBvcnQiKSkKKwkJCXBoeSA9IGRldm1fcGh5X2NyZWF0ZShkZXYsIGNoaWxkX25wLAorCQkJCQkgICAgICAmcm9ja2NoaXBfdXNiM19waHlfb3BzKTsKKwkJZWxzZQorCQkJY29udGludWU7CisKKwkJaWYgKElTX0VSUihwaHkpKSB7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjcmVhdGUgcGh5OiAlc1xuIiwKKwkJCQljaGlsZF9ucC0+bmFtZSk7CisJCQlyZXR1cm4gUFRSX0VSUihwaHkpOworCQl9CisKKwkJcGh5X3NldF9kcnZkYXRhKHBoeSwgdGNwaHkpOworCX0KKworCXBoeV9wcm92aWRlciA9IGRldm1fb2ZfcGh5X3Byb3ZpZGVyX3JlZ2lzdGVyKGRldiwgb2ZfcGh5X3NpbXBsZV94bGF0ZSk7CisJaWYgKElTX0VSUihwaHlfcHJvdmlkZXIpKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHBoeSBwcm92aWRlclxuIik7CisJCXJldHVybiBQVFJfRVJSKHBoeV9wcm92aWRlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfdHlwZWNfcGh5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByb2NrY2hpcF90eXBlY19waHlfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktdHlwZWMtcGh5IiB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByb2NrY2hpcF90eXBlY19waHlfZHRfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcm9ja2NoaXBfdHlwZWNfcGh5X2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcm9ja2NoaXBfdHlwZWNfcGh5X3Byb2JlLAorCS5yZW1vdmUJCT0gcm9ja2NoaXBfdHlwZWNfcGh5X3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicm9ja2NoaXAtdHlwZWMtcGh5IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gcm9ja2NoaXBfdHlwZWNfcGh5X2R0X2lkcywKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyb2NrY2hpcF90eXBlY19waHlfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiQ2hyaXMgWmhvbmcgPHp5d0Byb2NrLWNoaXBzLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIktldmVyIFlhbmcgPGtldmVyLnlhbmdAcm9jay1jaGlwcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJvY2tjaGlwIFVTQiBUWVBFLUMgUEhZIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXJvY2tjaGlwLXVzYi5jIGIvZHJpdmVycy9waHkvcGh5LXJvY2tjaGlwLXVzYi5jCmluZGV4IDJhNzM4MWYuLjczNDk4N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1yb2NrY2hpcC11c2IuYworKysgYi9kcml2ZXJzL3BoeS9waHktcm9ja2NoaXAtdXNiLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yZXNldC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiBzdGF0aWMgaW50IGVuYWJsZV91c2JfdWFydDsKIApAQCAtNjQsNiArNjUsNyBAQAogCXN0cnVjdCBjbGtfaHcJY2xrNDgwbV9odzsKIAlzdHJ1Y3QgcGh5CSpwaHk7CiAJYm9vbAkJdWFydF9lbmFibGVkOworCXN0cnVjdCByZXNldF9jb250cm9sICpyZXNldDsKIH07CiAKIHN0YXRpYyBpbnQgcm9ja2NoaXBfdXNiX3BoeV9wb3dlcihzdHJ1Y3Qgcm9ja2NoaXBfdXNiX3BoeSAqcGh5LApAQCAtMTQ0LDkgKzE0NiwyMyBAQAogCXJldHVybiBjbGtfcHJlcGFyZV9lbmFibGUocGh5LT5jbGs0ODBtKTsKIH0KIAorc3RhdGljIGludCByb2NrY2hpcF91c2JfcGh5X3Jlc2V0KHN0cnVjdCBwaHkgKl9waHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYl9waHkgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YShfcGh5KTsKKworCWlmIChwaHktPnJlc2V0KSB7CisJCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHBoeS0+cmVzZXQpOworCQl1ZGVsYXkoMTApOworCQlyZXNldF9jb250cm9sX2RlYXNzZXJ0KHBoeS0+cmVzZXQpOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgb3BzID0gewogCS5wb3dlcl9vbgk9IHJvY2tjaGlwX3VzYl9waHlfcG93ZXJfb24sCiAJLnBvd2VyX29mZgk9IHJvY2tjaGlwX3VzYl9waHlfcG93ZXJfb2ZmLAorCS5yZXNldAkJPSByb2NrY2hpcF91c2JfcGh5X3Jlc2V0LAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIH07CiAKQEAgLTE4NSw2ICsyMDEsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJcmtfcGh5LT5yZXNldCA9IG9mX3Jlc2V0X2NvbnRyb2xfZ2V0KGNoaWxkLCAicGh5LXJlc2V0Iik7CisJaWYgKElTX0VSUihya19waHktPnJlc2V0KSkKKwkJcmtfcGh5LT5yZXNldCA9IE5VTEw7CisKIAlya19waHktPnJlZ19vZmZzZXQgPSByZWdfb2Zmc2V0OwogCiAJcmtfcGh5LT5jbGsgPSBvZl9jbGtfZ2V0X2J5X25hbWUoY2hpbGQsICJwaHljbGsiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1zdW40aS11c2IuYyBiL2RyaXZlcnMvcGh5L3BoeS1zdW40aS11c2IuYwppbmRleCAwYTQ1YmM2Li5iOTM0MmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktc3VuNGktdXNiLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LXN1bjRpLXVzYi5jCkBAIC00MCw2ICs0MCw4IEBACiAjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAjZGVmaW5lIFJFR19JU0NSCQkJMHgwMApAQCAtNDksNyArNTEsNyBAQAogI2RlZmluZSBSRUdfUEhZQ1RMX0EzMwkJCTB4MTAKICNkZWZpbmUgUkVHX1BIWV9VTktfSDMJCQkweDIwCiAKLSNkZWZpbmUgUkVHX1BNVV9VTktfSDMJCQkweDEwCisjZGVmaW5lIFJFR19QTVVfVU5LMQkJCTB4MTAKIAogI2RlZmluZSBQSFlDVExfREFUQQkJCUJJVCg3KQogCkBAIC05Nyw2ICs5OSw3IEBACiAJc3VuNmlfYTMxX3BoeSwKIAlzdW44aV9hMzNfcGh5LAogCXN1bjhpX2gzX3BoeSwKKwlzdW41MGlfYTY0X3BoeSwKIH07CiAKIHN0cnVjdCBzdW40aV91c2JfcGh5X2NmZyB7CkBAIC0xMDUsMTIgKzEwOCwxNCBAQAogCXUzMiBkaXNjX3RocmVzaDsKIAl1OCBwaHljdGxfb2Zmc2V0OwogCWJvb2wgZGVkaWNhdGVkX2Nsb2NrczsKKwlib29sIGVuYWJsZV9wbXVfdW5rMTsKIH07CiAKIHN0cnVjdCBzdW40aV91c2JfcGh5X2RhdGEgewogCXZvaWQgX19pb21lbSAqYmFzZTsKIAljb25zdCBzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9jZmcgKmNmZzsKLQlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJZW51bSB1c2JfZHJfbW9kZSBkcl9tb2RlOworCXNwaW5sb2NrX3QgcmVnX2xvY2s7IC8qIGd1YXJkIGFjY2VzcyB0byBwaHljdGwgcmVnICovCiAJc3RydWN0IHN1bjRpX3VzYl9waHkgewogCQlzdHJ1Y3QgcGh5ICpwaHk7CiAJCXZvaWQgX19pb21lbSAqcG11OwpAQCAtMTI4LDYgKzEzMyw3IEBACiAJc3RydWN0IHBvd2VyX3N1cHBseSAqdmJ1c19wb3dlcl9zdXBwbHk7CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHZidXNfcG93ZXJfbmI7CiAJYm9vbCB2YnVzX3Bvd2VyX25iX3JlZ2lzdGVyZWQ7CisJYm9vbCBmb3JjZV9zZXNzaW9uX2VuZDsKIAlpbnQgaWRfZGV0X2lycTsKIAlpbnQgdmJ1c19kZXRfaXJxOwogCWludCBpZF9kZXQ7CkBAIC0xNzYsMTIgKzE4MiwxNCBAQAogCXN0cnVjdCBzdW40aV91c2JfcGh5X2RhdGEgKnBoeV9kYXRhID0gdG9fc3VuNGlfdXNiX3BoeV9kYXRhKHBoeSk7CiAJdTMyIHRlbXAsIHVzYmNfYml0ID0gQklUKHBoeS0+aW5kZXggKiAyKTsKIAl2b2lkIF9faW9tZW0gKnBoeWN0bCA9IHBoeV9kYXRhLT5iYXNlICsgcGh5X2RhdGEtPmNmZy0+cGh5Y3RsX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwogCi0JbXV0ZXhfbG9jaygmcGh5X2RhdGEtPm11dGV4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGh5X2RhdGEtPnJlZ19sb2NrLCBmbGFncyk7CiAKLQlpZiAocGh5X2RhdGEtPmNmZy0+dHlwZSA9PSBzdW44aV9hMzNfcGh5KSB7Ci0JCS8qIEEzMyBuZWVkcyB1cyB0byBzZXQgcGh5Y3RsIHRvIDAgZXhwbGljaXRseSAqLworCWlmIChwaHlfZGF0YS0+Y2ZnLT50eXBlID09IHN1bjhpX2EzM19waHkgfHwKKwkgICAgcGh5X2RhdGEtPmNmZy0+dHlwZSA9PSBzdW41MGlfYTY0X3BoeSkgeworCQkvKiBBMzMgb3IgQTY0IG5lZWRzIHVzIHRvIHNldCBwaHljdGwgdG8gMCBleHBsaWNpdGx5ICovCiAJCXdyaXRlbCgwLCBwaHljdGwpOwogCX0KIApAQCAtMjE1LDcgKzIyMyw4IEBACiAKIAkJZGF0YSA+Pj0gMTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZwaHlfZGF0YS0+bXV0ZXgpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGh5X2RhdGEtPnJlZ19sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIHN1bjRpX3VzYl9waHlfcGFzc2J5KHN0cnVjdCBzdW40aV91c2JfcGh5ICpwaHksIGludCBlbmFibGUpCkBAIC0yNTUsMTQgKzI2NCwxNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAorCWlmIChkYXRhLT5jZmctPmVuYWJsZV9wbXVfdW5rMSkgeworCQl2YWwgPSByZWFkbChwaHktPnBtdSArIFJFR19QTVVfVU5LMSk7CisJCXdyaXRlbCh2YWwgJiB+MiwgcGh5LT5wbXUgKyBSRUdfUE1VX1VOSzEpOworCX0KKwogCWlmIChkYXRhLT5jZmctPnR5cGUgPT0gc3VuOGlfaDNfcGh5KSB7CiAJCWlmIChwaHktPmluZGV4ID09IDApIHsKIAkJCXZhbCA9IHJlYWRsKGRhdGEtPmJhc2UgKyBSRUdfUEhZX1VOS19IMyk7CiAJCQl3cml0ZWwodmFsICYgfjEsIGRhdGEtPmJhc2UgKyBSRUdfUEhZX1VOS19IMyk7CiAJCX0KLQotCQl2YWwgPSByZWFkbChwaHktPnBtdSArIFJFR19QTVVfVU5LX0gzKTsKLQkJd3JpdGVsKHZhbCAmIH4yLCBwaHktPnBtdSArIFJFR19QTVVfVU5LX0gzKTsKIAl9IGVsc2UgewogCQkvKiBFbmFibGUgVVNCIDQ1IE9obSByZXNpc3RvciBjYWxpYnJhdGlvbiAqLwogCQlpZiAocGh5LT5pbmRleCA9PSAwKQpAQCAtMjg1LDE2ICsyOTYsMTAgQEAKIAkJc3VuNGlfdXNiX3BoeTBfdXBkYXRlX2lzY3IoX3BoeSwgMCwgSVNDUl9EUERNX1BVTExVUF9FTik7CiAJCXN1bjRpX3VzYl9waHkwX3VwZGF0ZV9pc2NyKF9waHksIDAsIElTQ1JfSURfUFVMTFVQX0VOKTsKIAotCQlpZiAoZGF0YS0+aWRfZGV0X2dwaW8pIHsKLQkJCS8qIE9URyBtb2RlLCBmb3JjZSBJU0NSIGFuZCBjYWJsZSBzdGF0ZSB1cGRhdGVzICovCi0JCQlkYXRhLT5pZF9kZXQgPSAtMTsKLQkJCWRhdGEtPnZidXNfZGV0ID0gLTE7Ci0JCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3dxLCAmZGF0YS0+ZGV0ZWN0LCAwKTsKLQkJfSBlbHNlIHsKLQkJCS8qIEhvc3Qgb25seSBtb2RlICovCi0JCQlzdW40aV91c2JfcGh5MF9zZXRfaWRfZGV0ZWN0KF9waHksIDApOwotCQkJc3VuNGlfdXNiX3BoeTBfc2V0X3ZidXNfZGV0ZWN0KF9waHksIDEpOwotCQl9CisJCS8qIEZvcmNlIElTQ1IgYW5kIGNhYmxlIHN0YXRlIHVwZGF0ZXMgKi8KKwkJZGF0YS0+aWRfZGV0ID0gLTE7CisJCWRhdGEtPnZidXNfZGV0ID0gLTE7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fd3EsICZkYXRhLT5kZXRlY3QsIDApOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzE5LDYgKzMyNCwyMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHN1bjRpX3VzYl9waHkwX2dldF9pZF9kZXQoc3RydWN0IHN1bjRpX3VzYl9waHlfZGF0YSAqZGF0YSkKK3sKKwlzd2l0Y2ggKGRhdGEtPmRyX21vZGUpIHsKKwljYXNlIFVTQl9EUl9NT0RFX09URzoKKwkJaWYgKGRhdGEtPmlkX2RldF9ncGlvKQorCQkJcmV0dXJuIGdwaW9kX2dldF92YWx1ZV9jYW5zbGVlcChkYXRhLT5pZF9kZXRfZ3Bpbyk7CisJCWVsc2UKKwkJCXJldHVybiAxOyAvKiBGYWxsYmFjayB0byBwZXJpcGhlcmFsIG1vZGUgKi8KKwljYXNlIFVTQl9EUl9NT0RFX0hPU1Q6CisJCXJldHVybiAwOworCWNhc2UgVVNCX0RSX01PREVfUEVSSVBIRVJBTDoKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgc3VuNGlfdXNiX3BoeTBfZ2V0X3ZidXNfZGV0KHN0cnVjdCBzdW40aV91c2JfcGh5X2RhdGEgKmRhdGEpCiB7CiAJaWYgKGRhdGEtPnZidXNfZGV0X2dwaW8pCkBAIC0zNzIsOCArMzkzLDEwIEBACiAKIAkvKiBGb3IgcGh5MCBvbmx5IHR1cm4gb24gVmJ1cyBpZiB3ZSBkb24ndCBoYXZlIGFuIGV4dC4gVmJ1cyAqLwogCWlmIChwaHktPmluZGV4ID09IDAgJiYgc3VuNGlfdXNiX3BoeTBfaGF2ZV92YnVzX2RldChkYXRhKSAmJgotCQkJCWRhdGEtPnZidXNfZGV0KQorCQkJCWRhdGEtPnZidXNfZGV0KSB7CisJCWRldl93YXJuKCZfcGh5LT5kZXYsICJFeHRlcm5hbCB2YnVzIGRldGVjdGVkLCBub3QgZW5hYmxpbmcgb3VyIG93biB2YnVzXG4iKTsKIAkJcmV0dXJuIDA7CisJfQogCiAJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShwaHktPnZidXMpOwogCWlmIChyZXQpCkBAIC00MDksNiArNDMyLDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc3VuNGlfdXNiX3BoeV9zZXRfbW9kZShzdHJ1Y3QgcGh5ICpfcGh5LCBlbnVtIHBoeV9tb2RlIG1vZGUpCit7CisJc3RydWN0IHN1bjRpX3VzYl9waHkgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YShfcGh5KTsKKwlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9kYXRhICpkYXRhID0gdG9fc3VuNGlfdXNiX3BoeV9kYXRhKHBoeSk7CisKKwlpZiAocGh5LT5pbmRleCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgUEhZX01PREVfVVNCX0hPU1Q6CisJCWRhdGEtPmRyX21vZGUgPSBVU0JfRFJfTU9ERV9IT1NUOworCQlicmVhazsKKwljYXNlIFBIWV9NT0RFX1VTQl9ERVZJQ0U6CisJCWRhdGEtPmRyX21vZGUgPSBVU0JfRFJfTU9ERV9QRVJJUEhFUkFMOworCQlicmVhazsKKwljYXNlIFBIWV9NT0RFX1VTQl9PVEc6CisJCWRhdGEtPmRyX21vZGUgPSBVU0JfRFJfTU9ERV9PVEc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9pbmZvKCZfcGh5LT5kZXYsICJDaGFuZ2luZyBkcl9tb2RlIHRvICVkXG4iLCAoaW50KWRhdGEtPmRyX21vZGUpOworCWRhdGEtPmZvcmNlX3Nlc3Npb25fZW5kID0gdHJ1ZTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3dxLCAmZGF0YS0+ZGV0ZWN0LCAwKTsKKworCXJldHVybiAwOworfQorCiB2b2lkIHN1bjRpX3VzYl9waHlfc2V0X3NxdWVsY2hfZGV0ZWN0KHN0cnVjdCBwaHkgKl9waHksIGJvb2wgZW5hYmxlZCkKIHsKIAlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeSAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKF9waHkpOwpAQCAtNDIyLDYgKzQ3NCw3IEBACiAJLmV4aXQJCT0gc3VuNGlfdXNiX3BoeV9leGl0LAogCS5wb3dlcl9vbgk9IHN1bjRpX3VzYl9waHlfcG93ZXJfb24sCiAJLnBvd2VyX29mZgk9IHN1bjRpX3VzYl9waHlfcG93ZXJfb2ZmLAorCS5zZXRfbW9kZQk9IHN1bjRpX3VzYl9waHlfc2V0X21vZGUsCiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogfTsKIApAQCAtNDMwLDkgKzQ4MywxMyBAQAogCXN0cnVjdCBzdW40aV91c2JfcGh5X2RhdGEgKmRhdGEgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHN1bjRpX3VzYl9waHlfZGF0YSwgZGV0ZWN0LndvcmspOwogCXN0cnVjdCBwaHkgKnBoeTAgPSBkYXRhLT5waHlzWzBdLnBoeTsKLQlpbnQgaWRfZGV0LCB2YnVzX2RldCwgaWRfbm90aWZ5ID0gMCwgdmJ1c19ub3RpZnkgPSAwOworCWJvb2wgZm9yY2Vfc2Vzc2lvbl9lbmQsIGlkX25vdGlmeSA9IGZhbHNlLCB2YnVzX25vdGlmeSA9IGZhbHNlOworCWludCBpZF9kZXQsIHZidXNfZGV0OwogCi0JaWRfZGV0ID0gZ3Bpb2RfZ2V0X3ZhbHVlX2NhbnNsZWVwKGRhdGEtPmlkX2RldF9ncGlvKTsKKwlpZiAocGh5MCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZF9kZXQgPSBzdW40aV91c2JfcGh5MF9nZXRfaWRfZGV0KGRhdGEpOwogCXZidXNfZGV0ID0gc3VuNGlfdXNiX3BoeTBfZ2V0X3ZidXNfZGV0KGRhdGEpOwogCiAJbXV0ZXhfbG9jaygmcGh5MC0+bXV0ZXgpOwpAQCAtNDQyLDI2ICs0OTksMzAgQEAKIAkJcmV0dXJuOwogCX0KIAorCWZvcmNlX3Nlc3Npb25fZW5kID0gZGF0YS0+Zm9yY2Vfc2Vzc2lvbl9lbmQ7CisJZGF0YS0+Zm9yY2Vfc2Vzc2lvbl9lbmQgPSBmYWxzZTsKKwogCWlmIChpZF9kZXQgIT0gZGF0YS0+aWRfZGV0KSB7Ci0JCS8qCi0JCSAqIFdoZW4gYSBob3N0IGNhYmxlIChpZCA9PSAwKSBnZXRzIHBsdWdnZWQgaW4gb24gc3lzdGVtcwotCQkgKiB3aXRob3V0IHZidXMgZGV0ZWN0aW9uIHJlcG9ydCB2YnVzIGxvdyBmb3IgbG9uZyBlbm91Z2ggZm9yCi0JCSAqIHRoZSBtdXNiLWlwIHRvIGVuZCB0aGUgY3VycmVudCBkZXZpY2Ugc2Vzc2lvbi4KLQkJICovCi0JCWlmICghc3VuNGlfdXNiX3BoeTBfaGF2ZV92YnVzX2RldChkYXRhKSAmJiBpZF9kZXQgPT0gMCkgeworCQkvKiBpZC1jaGFuZ2UsIGZvcmNlIHNlc3Npb24gZW5kIGlmIHdlJ3ZlIG5vIHZidXMgZGV0ZWN0aW9uICovCisJCWlmIChkYXRhLT5kcl9tb2RlID09IFVTQl9EUl9NT0RFX09URyAmJgorCQkgICAgIXN1bjRpX3VzYl9waHkwX2hhdmVfdmJ1c19kZXQoZGF0YSkpCisJCQlmb3JjZV9zZXNzaW9uX2VuZCA9IHRydWU7CisKKwkJLyogV2hlbiBlbnRlcmluZyBob3N0IG1vZGUgKGlkID0gMCkgZm9yY2UgZW5kIHRoZSBzZXNzaW9uIG5vdyAqLworCQlpZiAoZm9yY2Vfc2Vzc2lvbl9lbmQgJiYgaWRfZGV0ID09IDApIHsKIAkJCXN1bjRpX3VzYl9waHkwX3NldF92YnVzX2RldGVjdChwaHkwLCAwKTsKIAkJCW1zbGVlcCgyMDApOwogCQkJc3VuNGlfdXNiX3BoeTBfc2V0X3ZidXNfZGV0ZWN0KHBoeTAsIDEpOwogCQl9CiAJCXN1bjRpX3VzYl9waHkwX3NldF9pZF9kZXRlY3QocGh5MCwgaWRfZGV0KTsKIAkJZGF0YS0+aWRfZGV0ID0gaWRfZGV0OwotCQlpZF9ub3RpZnkgPSAxOworCQlpZF9ub3RpZnkgPSB0cnVlOwogCX0KIAogCWlmICh2YnVzX2RldCAhPSBkYXRhLT52YnVzX2RldCkgewogCQlzdW40aV91c2JfcGh5MF9zZXRfdmJ1c19kZXRlY3QocGh5MCwgdmJ1c19kZXQpOwogCQlkYXRhLT52YnVzX2RldCA9IHZidXNfZGV0OwotCQl2YnVzX25vdGlmeSA9IDE7CisJCXZidXNfbm90aWZ5ID0gdHJ1ZTsKIAl9CiAKIAltdXRleF91bmxvY2soJnBoeTAtPm11dGV4KTsKQEAgLTQ2OSwxMiArNTMwLDggQEAKIAlpZiAoaWRfbm90aWZ5KSB7CiAJCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGRhdGEtPmV4dGNvbiwgRVhUQ09OX1VTQl9IT1NULAogCQkJCQkhaWRfZGV0KTsKLQkJLyoKLQkJICogV2hlbiBhIGhvc3QgY2FibGUgZ2V0cyB1bnBsdWdnZWQgKGlkID09IDEpIG9uIHN5c3RlbXMKLQkJICogd2l0aG91dCB2YnVzIGRldGVjdGlvbiByZXBvcnQgdmJ1cyBsb3cgZm9yIGxvbmcgZW5vdWdoIHRvCi0JCSAqIHRoZSBtdXNiLWlwIHRvIGVuZCB0aGUgY3VycmVudCBob3N0IHNlc3Npb24uCi0JCSAqLwotCQlpZiAoIXN1bjRpX3VzYl9waHkwX2hhdmVfdmJ1c19kZXQoZGF0YSkgJiYgaWRfZGV0ID09IDEpIHsKKwkJLyogV2hlbiBsZWF2aW5nIGhvc3QgbW9kZSBmb3JjZSBlbmQgdGhlIHNlc3Npb24gaGVyZSAqLworCQlpZiAoZm9yY2Vfc2Vzc2lvbl9lbmQgJiYgaWRfZGV0ID09IDEpIHsKIAkJCW11dGV4X2xvY2soJnBoeTAtPm11dGV4KTsKIAkJCXN1bjRpX3VzYl9waHkwX3NldF92YnVzX2RldGVjdChwaHkwLCAwKTsKIAkJCW1zbGVlcCgxMDAwKTsKQEAgLTU2MSw3ICs2MTgsNyBAQAogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltdXRleF9pbml0KCZkYXRhLT5tdXRleCk7CisJc3Bpbl9sb2NrX2luaXQoJmRhdGEtPnJlZ19sb2NrKTsKIAlJTklUX0RFTEFZRURfV09SSygmZGF0YS0+ZGV0ZWN0LCBzdW40aV91c2JfcGh5MF9pZF92YnVzX2RldF9zY2FuKTsKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBkYXRhKTsKIAlkYXRhLT5jZmcgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoZGV2KTsKQEAgLTU5MywyMyArNjUwLDE2IEBACiAJCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKIAl9CiAKLQkvKiB2YnVzX2RldCB3aXRob3V0IGlkX2RldCBtYWtlcyBubyBzZW5zZSwgYW5kIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLQlpZiAoc3VuNGlfdXNiX3BoeTBfaGF2ZV92YnVzX2RldChkYXRhKSAmJiAhZGF0YS0+aWRfZGV0X2dwaW8pIHsKLQkJZGV2X2VycihkZXYsICJ1c2IwX2lkX2RldCBtaXNzaW5nIG9yIGludmFsaWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CisJZGF0YS0+ZHJfbW9kZSA9IG9mX3VzYl9nZXRfZHJfbW9kZV9ieV9waHkobnAsIDApOwogCi0JaWYgKGRhdGEtPmlkX2RldF9ncGlvKSB7Ci0JCWRhdGEtPmV4dGNvbiA9IGRldm1fZXh0Y29uX2Rldl9hbGxvY2F0ZShkZXYsCi0JCQkJCQkJc3VuNGlfdXNiX3BoeTBfY2FibGUpOwotCQlpZiAoSVNfRVJSKGRhdGEtPmV4dGNvbikpCi0JCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5leHRjb24pOworCWRhdGEtPmV4dGNvbiA9IGRldm1fZXh0Y29uX2Rldl9hbGxvY2F0ZShkZXYsIHN1bjRpX3VzYl9waHkwX2NhYmxlKTsKKwlpZiAoSVNfRVJSKGRhdGEtPmV4dGNvbikpCisJCXJldHVybiBQVFJfRVJSKGRhdGEtPmV4dGNvbik7CiAKLQkJcmV0ID0gZGV2bV9leHRjb25fZGV2X3JlZ2lzdGVyKGRldiwgZGF0YS0+ZXh0Y29uKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgZXh0Y29uOiAlZFxuIiwgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KKwlyZXQgPSBkZXZtX2V4dGNvbl9kZXZfcmVnaXN0ZXIoZGV2LCBkYXRhLT5leHRjb24pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgZXh0Y29uOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+Y2ZnLT5udW1fcGh5czsgaSsrKSB7CkBAIC03MTMsNiArNzYzLDcgQEAKIAkuZGlzY190aHJlc2ggPSAzLAogCS5waHljdGxfb2Zmc2V0ID0gUkVHX1BIWUNUTF9BMTAsCiAJLmRlZGljYXRlZF9jbG9ja3MgPSBmYWxzZSwKKwkuZW5hYmxlX3BtdV91bmsxID0gZmFsc2UsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1bjRpX3VzYl9waHlfY2ZnIHN1bjVpX2ExM19jZmcgPSB7CkBAIC03MjEsNiArNzcyLDcgQEAKIAkuZGlzY190aHJlc2ggPSAyLAogCS5waHljdGxfb2Zmc2V0ID0gUkVHX1BIWUNUTF9BMTAsCiAJLmRlZGljYXRlZF9jbG9ja3MgPSBmYWxzZSwKKwkuZW5hYmxlX3BtdV91bmsxID0gZmFsc2UsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1bjRpX3VzYl9waHlfY2ZnIHN1bjZpX2EzMV9jZmcgPSB7CkBAIC03MjksNiArNzgxLDcgQEAKIAkuZGlzY190aHJlc2ggPSAzLAogCS5waHljdGxfb2Zmc2V0ID0gUkVHX1BIWUNUTF9BMTAsCiAJLmRlZGljYXRlZF9jbG9ja3MgPSB0cnVlLAorCS5lbmFibGVfcG11X3VuazEgPSBmYWxzZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9jZmcgc3VuN2lfYTIwX2NmZyA9IHsKQEAgLTczNyw2ICs3OTAsNyBAQAogCS5kaXNjX3RocmVzaCA9IDIsCiAJLnBoeWN0bF9vZmZzZXQgPSBSRUdfUEhZQ1RMX0ExMCwKIAkuZGVkaWNhdGVkX2Nsb2NrcyA9IGZhbHNlLAorCS5lbmFibGVfcG11X3VuazEgPSBmYWxzZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9jZmcgc3VuOGlfYTIzX2NmZyA9IHsKQEAgLTc0NSw2ICs3OTksNyBAQAogCS5kaXNjX3RocmVzaCA9IDMsCiAJLnBoeWN0bF9vZmZzZXQgPSBSRUdfUEhZQ1RMX0ExMCwKIAkuZGVkaWNhdGVkX2Nsb2NrcyA9IHRydWUsCisJLmVuYWJsZV9wbXVfdW5rMSA9IGZhbHNlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdW40aV91c2JfcGh5X2NmZyBzdW44aV9hMzNfY2ZnID0gewpAQCAtNzUzLDYgKzgwOCw3IEBACiAJLmRpc2NfdGhyZXNoID0gMywKIAkucGh5Y3RsX29mZnNldCA9IFJFR19QSFlDVExfQTMzLAogCS5kZWRpY2F0ZWRfY2xvY2tzID0gdHJ1ZSwKKwkuZW5hYmxlX3BtdV91bmsxID0gZmFsc2UsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1bjRpX3VzYl9waHlfY2ZnIHN1bjhpX2gzX2NmZyA9IHsKQEAgLTc2MCw2ICs4MTYsMTYgQEAKIAkudHlwZSA9IHN1bjhpX2gzX3BoeSwKIAkuZGlzY190aHJlc2ggPSAzLAogCS5kZWRpY2F0ZWRfY2xvY2tzID0gdHJ1ZSwKKwkuZW5hYmxlX3BtdV91bmsxID0gdHJ1ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9jZmcgc3VuNTBpX2E2NF9jZmcgPSB7CisJLm51bV9waHlzID0gMiwKKwkudHlwZSA9IHN1bjUwaV9hNjRfcGh5LAorCS5kaXNjX3RocmVzaCA9IDMsCisJLnBoeWN0bF9vZmZzZXQgPSBSRUdfUEhZQ1RMX0EzMywKKwkuZGVkaWNhdGVkX2Nsb2NrcyA9IHRydWUsCisJLmVuYWJsZV9wbXVfdW5rMSA9IHRydWUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdW40aV91c2JfcGh5X29mX21hdGNoW10gPSB7CkBAIC03NzAsNiArODM2LDggQEAKIAl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW44aS1hMjMtdXNiLXBoeSIsIC5kYXRhID0gJnN1bjhpX2EyM19jZmcgfSwKIAl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW44aS1hMzMtdXNiLXBoeSIsIC5kYXRhID0gJnN1bjhpX2EzM19jZmcgfSwKIAl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW44aS1oMy11c2ItcGh5IiwgLmRhdGEgPSAmc3VuOGlfaDNfY2ZnIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNTBpLWE2NC11c2ItcGh5IiwKKwkgIC5kYXRhID0gJnN1bjUwaV9hNjRfY2ZnfSwKIAl7IH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3VuNGlfdXNiX3BoeV9vZl9tYXRjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktc3VuOWktdXNiLmMgYi9kcml2ZXJzL3BoeS9waHktc3VuOWktdXNiLmMKaW5kZXggYWM0ZjMxYS4uMjhmY2U0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LXN1bjlpLXVzYi5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1zdW45aS11c2IuYwpAQCAtMTQxLDkgKzE0MSw5IEBACiAJCX0KIAogCQlwaHktPmhzaWNfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImhzaWNfMTJNIik7Ci0JCWlmIChJU19FUlIocGh5LT5jbGspKSB7CisJCWlmIChJU19FUlIocGh5LT5oc2ljX2NsaykpIHsKIAkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBoc2ljXzEyTSBjbG9ja1xuIik7Ci0JCQlyZXR1cm4gUFRSX0VSUihwaHktPmNsayk7CisJCQlyZXR1cm4gUFRSX0VSUihwaHktPmhzaWNfY2xrKTsKIAkJfQogCiAJCXBoeS0+cmVzZXQgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KGRldiwgImhzaWMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS10d2w0MDMwLXVzYi5jIGIvZHJpdmVycy9waHkvcGh5LXR3bDQwMzAtdXNiLmMKaW5kZXggZDliMTBhMy4uODdlNjMzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LXR3bDQwMzAtdXNiLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LXR3bDQwMzAtdXNiLmMKQEAgLTE3Miw2ICsxNzIsNyBAQAogCWludAkJCWlycTsKIAllbnVtIG11c2JfdmJ1c19pZF9zdGF0dXMgbGlua3N0YXQ7CiAJYm9vbAkJCXZidXNfc3VwcGxpZWQ7CisJYm9vbAkJCW11c2JfbWFpbGJveF9wZW5kaW5nOwogCiAJc3RydWN0IGRlbGF5ZWRfd29yawlpZF93b3JrYXJvdW5kX3dvcms7CiB9OwpAQCAtNDM5LDYgKzQ0MCwxNyBAQAogCQkJICAoUEhZX0NMS19DVFJMX0NMT0NLR0FUSU5HX0VOIHwKIAkJCSAgIFBIWV9DTEtfQ1RSTF9DTEszMktfRU4pKTsKIAorCXR3bDQwMzBfaTJjX2FjY2Vzcyh0d2wsIDEpOworCXR3bDQwMzBfdXNiX3NldF9tb2RlKHR3bCwgdHdsLT51c2JfbW9kZSk7CisJaWYgKHR3bC0+dXNiX21vZGUgPT0gVDJfVVNCX01PREVfVUxQSSkKKwkJdHdsNDAzMF9pMmNfYWNjZXNzKHR3bCwgMCk7CisJLyoKKwkgKiBBY2NvcmRpbmcgdG8gdGhlIFRQUzY1OTUwIFRSTSwgdGhlcmUgaGFzIHRvIGJlIGF0IGxlYXN0IDUwbXMKKwkgKiBkZWxheSBiZXR3ZWVuIHNldHRpbmcgUE9XRVJfQ1RSTF9PVEdfRU5BQiBhbmQgZW5hYmxpbmcgY2hhcmdpbmcKKwkgKiBzbyB3YWl0IGhlcmUgc28gdGhhdCBhIGZ1bGx5IGVuYWJsZWQgcGh5IGNhbiBiZSBleHBlY3RlZCBhZnRlcgorCSAqIHJlc3VtZQorCSAqLworCW1zbGVlcCg1MCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ1OSwxMSArNDcxLDYgQEAKIAogCWRldl9kYmcodHdsLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCXBtX3J1bnRpbWVfZ2V0X3N5bmModHdsLT5kZXYpOwotCXR3bDQwMzBfaTJjX2FjY2Vzcyh0d2wsIDEpOwotCXR3bDQwMzBfdXNiX3NldF9tb2RlKHR3bCwgdHdsLT51c2JfbW9kZSk7Ci0JaWYgKHR3bC0+dXNiX21vZGUgPT0gVDJfVVNCX01PREVfVUxQSSkKLQkJdHdsNDAzMF9pMmNfYWNjZXNzKHR3bCwgMCk7Ci0JdHdsLT5saW5rc3RhdCA9IE1VU0JfVU5LTk9XTjsKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR3bC0+aWRfd29ya2Fyb3VuZF93b3JrLCBIWik7CiAKIAlyZXR1cm4gMDsKQEAgLTU2OSw5ICs1NzYsMTIgQEAKIAkJCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kodHdsLT5kZXYpOwogCQkJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQodHdsLT5kZXYpOwogCQl9CisJCXR3bC0+bXVzYl9tYWlsYm94X3BlbmRpbmcgPSB0cnVlOworCX0KKwlpZiAodHdsLT5tdXNiX21haWxib3hfcGVuZGluZykgewogCQllcnIgPSBtdXNiX21haWxib3goc3RhdHVzKTsKLQkJaWYgKGVycikKLQkJCXR3bC0+bGlua3N0YXQgPSBNVVNCX1VOS05PV047CisJCWlmICghZXJyKQorCQkJdHdsLT5tdXNiX21haWxib3hfcGVuZGluZyA9IGZhbHNlOwogCX0KIAogCS8qIGRvbid0IHNjaGVkdWxlIGR1cmluZyBzbGVlcCAtIGlycSB3b3JrcyByaWdodCB0aGVuICovCkBAIC02NzYsNiArNjg2LDcgQEAKIAl0d2wtPmlycQkJPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCXR3bC0+dmJ1c19zdXBwbGllZAk9IGZhbHNlOwogCXR3bC0+bGlua3N0YXQJCT0gTVVTQl9VTktOT1dOOworCXR3bC0+bXVzYl9tYWlsYm94X3BlbmRpbmcgPSBmYWxzZTsKIAogCXR3bC0+cGh5LmRldgkJPSB0d2wtPmRldjsKIAl0d2wtPnBoeS5sYWJlbAkJPSAidHdsNDAzMCI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS90ZWdyYS94dXNiLmMgYi9kcml2ZXJzL3BoeS90ZWdyYS94dXNiLmMKaW5kZXggZWM4M2RmZC4uODczNDI0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvdGVncmEveHVzYi5jCisrKyBiL2RyaXZlcnMvcGh5L3RlZ3JhL3h1c2IuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS90ZWdyYS94dXNiLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KQEAgLTEwMSw3ICsxMDIsOCBAQAogCXJldHVybiBvZl9maW5kX25vZGVfYnlfbmFtZShucCwgcGFkLT5zb2MtPmxhbmVzW2luZGV4XS5uYW1lKTsKIH0KIAotaW50IHRlZ3JhX3h1c2JfbGFuZV9sb29rdXBfZnVuY3Rpb24oc3RydWN0IHRlZ3JhX3h1c2JfbGFuZSAqbGFuZSwKK3N0YXRpYyBpbnQKK3RlZ3JhX3h1c2JfbGFuZV9sb29rdXBfZnVuY3Rpb24oc3RydWN0IHRlZ3JhX3h1c2JfbGFuZSAqbGFuZSwKIAkJCQkgICAgY29uc3QgY2hhciAqZnVuY3Rpb24pCiB7CiAJdW5zaWduZWQgaW50IGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvS2NvbmZpZyBiL2RyaXZlcnMvcGluY3RybC9LY29uZmlnCmluZGV4IGIzZmUxZDMuLjBlNzVkOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGluY3RybC9LY29uZmlnCkBAIC0yNTQsNiArMjU0LDcgQEAKIAloZWxwCiAJICBUaGlzIHNlbGVjdHMgdGhlIHBpbmN0cmwgZHJpdmVyIGZvciBYaWxpbnggWnlucS4KIAorc291cmNlICJkcml2ZXJzL3BpbmN0cmwvYXNwZWVkL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvcGluY3RybC9iY20vS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9waW5jdHJsL2Jlcmxpbi9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3BpbmN0cmwvZnJlZXNjYWxlL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvTWFrZWZpbGUgYi9kcml2ZXJzL3BpbmN0cmwvTWFrZWZpbGUKaW5kZXggOGViZDdiOC4uMTFiYWQzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGluY3RybC9NYWtlZmlsZQpAQCAtMzcsNiArMzcsNyBAQAogb2JqLSQoQ09ORklHX1BJTkNUUkxfU1QpIAkrPSBwaW5jdHJsLXN0Lm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1pZTlEpCSs9IHBpbmN0cmwtenlucS5vCiAKK29iai0kKENPTkZJR19BUkNIX0FTUEVFRCkJKz0gYXNwZWVkLwogb2JqLXkJCQkJKz0gYmNtLwogb2JqLSQoQ09ORklHX1BJTkNUUkxfQkVSTElOKQkrPSBiZXJsaW4vCiBvYmoteQkJCQkrPSBmcmVlc2NhbGUvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL0tjb25maWcgYi9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk4ZWFiZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvS2NvbmZpZwpAQCAtMCwwICsxLDI0IEBACitjb25maWcgUElOQ1RSTF9BU1BFRUQKKwlib29sCisJZGVwZW5kcyBvbiAoQVJDSF9BU1BFRUQgfHwgQ09NUElMRV9URVNUKSAmJiBPRgorCWRlcGVuZHMgb24gTUZEX1NZU0NPTgorCXNlbGVjdCBQSU5NVVgKKwlzZWxlY3QgUElOQ09ORgorCXNlbGVjdCBHRU5FUklDX1BJTkNPTkYKKwlzZWxlY3QgUkVHTUFQX01NSU8KKworY29uZmlnIFBJTkNUUkxfQVNQRUVEX0c0CisJYm9vbCAiQXNwZWVkIEc0IFNvQyBwaW4gY29udHJvbCIKKwlkZXBlbmRzIG9uIChNQUNIX0FTUEVFRF9HNCB8fCBDT01QSUxFX1RFU1QpICYmIE9GCisJc2VsZWN0IFBJTkNUUkxfQVNQRUVECisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgcGluIGNvbnRyb2xsZXIgc3VwcG9ydCBmb3IgQXNwZWVkJ3MgNHRoCisJICBnZW5lcmF0aW9uIFNvQ3MuIEdQSU8gaXMgcHJvdmlkZWQgYnkgYSBzZXBhcmF0ZSBHUElPIGRyaXZlci4KKworY29uZmlnIFBJTkNUUkxfQVNQRUVEX0c1CisJYm9vbCAiQXNwZWVkIEc1IFNvQyBwaW4gY29udHJvbCIKKwlkZXBlbmRzIG9uIChNQUNIX0FTUEVFRF9HNSB8fCBDT01QSUxFX1RFU1QpICYmIE9GCisJc2VsZWN0IFBJTkNUUkxfQVNQRUVECisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgcGluIGNvbnRyb2xsZXIgc3VwcG9ydCBmb3IgQXNwZWVkJ3MgNXRoCisJICBnZW5lcmF0aW9uIFNvQ3MuIEdQSU8gaXMgcHJvdmlkZWQgYnkgYSBzZXBhcmF0ZSBHUElPIGRyaXZlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvTWFrZWZpbGUgYi9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MWVkMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIyBBc3BlZWQgcGluY3RybCBzdXBwb3J0CisKK2NjZmxhZ3MteSArPSAtV292ZXJyaWRlLWluaXQKK29iai0kKENPTkZJR19QSU5DVFJMX0FTUEVFRCkJKz0gcGluY3RybC1hc3BlZWQubworb2JqLSQoQ09ORklHX1BJTkNUUkxfQVNQRUVEX0c0KQkrPSBwaW5jdHJsLWFzcGVlZC1nNC5vCitvYmotJChDT05GSUdfUElOQ1RSTF9BU1BFRURfRzUpCSs9IHBpbmN0cmwtYXNwZWVkLWc1Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvcGluY3RybC1hc3BlZWQtZzQuYyBiL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvcGluY3RybC1hc3BlZWQtZzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjFiMDcxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL2FzcGVlZC9waW5jdHJsLWFzcGVlZC1nNC5jCkBAIC0wLDAgKzEsMTIzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY3RybC5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGlubXV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jb25mLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jb25mLWdlbmVyaWMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAiLi4vY29yZS5oIgorI2luY2x1ZGUgIi4uL3BpbmN0cmwtdXRpbHMuaCIKKyNpbmNsdWRlICJwaW5jdHJsLWFzcGVlZC5oIgorCisvKgorICogVXNlcyB1bmRlZmluZWQgbWFjcm9zIGZvciBzeW1ib2wgbmFtaW5nIGFuZCByZWZlcmVuY2VzLCBlZyBHUElPQTAsIE1BQzFMSU5LLAorICogVElNRVIzIGV0Yy4KKyAqCisgKiBQaW5zIGFyZSBkZWZpbmVkIGluIEdQSU8gYmFuayBvcmRlcjoKKyAqCisgKiBHUElPQTA6IDAKKyAqIC4uLgorICogR1BJT0E3OiA3CisgKiBHUElPQjA6IDgKKyAqIC4uLgorICogR1BJT1o3OiAyMDcKKyAqIEdQSU9BQTA6IDIwOAorICogLi4uCisgKiBHUElPQUIzOiAyMTkKKyAqCisgKiBOb3QgYWxsIHBpbnMgaGF2ZSB0aGVpciBzaWduYWxzIGRlZmluZWQgKHlldCkuCisgKi8KKworI2RlZmluZSBBNCAyCitTU1NGX1BJTl9ERUNMKEE0LCBHUElPQTIsIFRJTUVSMywgU0lHX0RFU0NfU0VUKFNDVTgwLCAyKSk7CisKKyNkZWZpbmUgSTJDOV9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMjIpCisKKyNkZWZpbmUgQzUgNAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0w5LCBJMkM5LCBJMkM5X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShUSU1FUjUsIFRJTUVSNSwgU0lHX0RFU0NfU0VUKFNDVTgwLCA0KSk7CitNU19QSU5fREVDTChDNSwgR1BJT0E0LCBTQ0w5LCBUSU1FUjUpOworCitGVU5DX0dST1VQX0RFQ0woVElNRVI1LCBDNSk7CisKKyNkZWZpbmUgQjQgNQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREE5LCBJMkM5LCBJMkM5X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShUSU1FUjYsIFRJTUVSNiwgU0lHX0RFU0NfU0VUKFNDVTgwLCA1KSk7CitNU19QSU5fREVDTChCNCwgR1BJT0E1LCBTREE5LCBUSU1FUjYpOworCitGVU5DX0dST1VQX0RFQ0woVElNRVI2LCBCNCk7CitGVU5DX0dST1VQX0RFQ0woSTJDOSwgQzUsIEI0KTsKKworI2RlZmluZSBNRElPMl9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMikKKworI2RlZmluZSBBMyA2CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE1EQzIsIE1ESU8yLCBNRElPMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVElNRVI3LCBUSU1FUjcsIFNJR19ERVNDX1NFVChTQ1U4MCwgNikpOworTVNfUElOX0RFQ0woQTMsIEdQSU9BNiwgTURDMiwgVElNRVI3KTsKKworRlVOQ19HUk9VUF9ERUNMKFRJTUVSNywgQTMpOworCisjZGVmaW5lIEQ1IDcKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTURJTzIsIE1ESU8yLCBNRElPMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVElNRVI4LCBUSU1FUjgsIFNJR19ERVNDX1NFVChTQ1U4MCwgNykpOworTVNfUElOX0RFQ0woRDUsIEdQSU9BNywgTURJTzIsIFRJTUVSOCk7CisKK0ZVTkNfR1JPVVBfREVDTChUSU1FUjgsIEQ1KTsKK0ZVTkNfR1JPVVBfREVDTChNRElPMiwgQTMsIEQ1KTsKKworI2RlZmluZSBIMTkgMTMKKyNkZWZpbmUgSDE5X0RFU0MgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4MCwgMTMpCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKExQQ1BELCBMUENQRCwgSDE5X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShMUENTTUksIExQQ1NNSSwgSDE5X0RFU0MpOworTVNfUElOX0RFQ0woSDE5LCBHUElPQjUsIExQQ1BELCBMUENTTUkpOworCitGVU5DX0dST1VQX0RFQ0woTFBDUEQsIEgxOSk7CitGVU5DX0dST1VQX0RFQ0woTFBDU01JLCBIMTkpOworCisjZGVmaW5lIEgyMCAxNAorU1NTRl9QSU5fREVDTChIMjAsIEdQSU9CNiwgTFBDUE1FLCBTSUdfREVTQ19TRVQoU0NVODAsIDE0KSk7CisKKyNkZWZpbmUgU0QxX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAwKQorI2RlZmluZSBJMkMxMF9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMjMpCisKKyNkZWZpbmUgQzQgMTYKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QxQ0xLLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMMTAsIEkyQzEwLCBJMkMxMF9ERVNDKTsKK01TX1BJTl9ERUNMKEM0LCBHUElPQzAsIFNEMUNMSywgU0NMMTApOworCisjZGVmaW5lIEIzIDE3CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMUNNRCwgU0QxLCBTRDFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEQTEwLCBJMkMxMCwgSTJDMTBfREVTQyk7CitNU19QSU5fREVDTChCMywgR1BJT0MxLCBTRDFDTUQsIFNEQTEwKTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzEwLCBDNCwgQjMpOworCisjZGVmaW5lIEkyQzExX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyNCkKKworI2RlZmluZSBBMiAxOAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFEQVQwLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMMTEsIEkyQzExLCBJMkMxMV9ERVNDKTsKK01TX1BJTl9ERUNMKEEyLCBHUElPQzIsIFNEMURBVDAsIFNDTDExKTsKKworI2RlZmluZSBFNSAxOQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFEQVQxLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMTEsIEkyQzExLCBJMkMxMV9ERVNDKTsKK01TX1BJTl9ERUNMKEU1LCBHUElPQzMsIFNEMURBVDEsIFNEQTExKTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzExLCBBMiwgRTUpOworCisjZGVmaW5lIEkyQzEyX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyNSkKKworI2RlZmluZSBENCAyMAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFEQVQyLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMMTIsIEkyQzEyLCBJMkMxMl9ERVNDKTsKK01TX1BJTl9ERUNMKEQ0LCBHUElPQzQsIFNEMURBVDIsIFNDTDEyKTsKKworI2RlZmluZSBDMyAyMQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFEQVQzLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMTIsIEkyQzEyLCBJMkMxMl9ERVNDKTsKK01TX1BJTl9ERUNMKEMzLCBHUElPQzUsIFNEMURBVDMsIFNEQTEyKTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzEyLCBENCwgQzMpOworCisjZGVmaW5lIEkyQzEzX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyNikKKworI2RlZmluZSBCMiAyMgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFDRCwgU0QxLCBTRDFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDEzLCBJMkMxMywgSTJDMTNfREVTQyk7CitNU19QSU5fREVDTChCMiwgR1BJT0M2LCBTRDFDRCwgU0NMMTMpOworCisjZGVmaW5lIEExIDIzCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMVdQLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMTMsIEkyQzEzLCBJMkMxM19ERVNDKTsKK01TX1BJTl9ERUNMKEExLCBHUElPQzcsIFNEMVdQLCBTREExMyk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkMxMywgQjIsIEExKTsKK0ZVTkNfR1JPVVBfREVDTChTRDEsIEM0LCBCMywgQTIsIEU1LCBENCwgQzMsIEIyLCBBMSk7CisKKyNkZWZpbmUgU0QyX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAxKQorI2RlZmluZSBHUElEX0RFU0MgICAgICAgU0lHX0RFU0NfU0VUKEhXX1NUUkFQMSwgMjEpCisjZGVmaW5lIEdQSUQwX0RFU0MJU0lHX0RFU0NfU0VUKFNDVThDLCA4KQorCisjZGVmaW5lIEExOCAyNAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDJDTEssIFNEMiwgU0QyX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElEMElOLCBHUElEMCwgR1BJRDBfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUQwSU4sIEdQSUQsIEdQSURfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChHUElEMElOLCBHUElEMCwgR1BJRCk7CitNU19QSU5fREVDTChBMTgsIEdQSU9EMCwgU0QyQ0xLLCBHUElEMElOKTsKKworI2RlZmluZSBEMTYgMjUKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QyQ01ELCBTRDIsIFNEMl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRDBPVVQsIEdQSUQwLCBHUElEMF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRDBPVVQsIEdQSUQsIEdQSURfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChHUElEME9VVCwgR1BJRDAsIEdQSUQpOworTVNfUElOX0RFQ0woRDE2LCBHUElPRDEsIFNEMkNNRCwgR1BJRDBPVVQpOworCitGVU5DX0dST1VQX0RFQ0woR1BJRDAsIEExOCwgRDE2KTsKKworI2RlZmluZSBHUElFX0RFU0MgICAgICAgU0lHX0RFU0NfU0VUKEhXX1NUUkFQMSwgMjIpCisjZGVmaW5lIEdQSUUwX0RFU0MgICAgICBTSUdfREVTQ19TRVQoU0NVOEMsIDEyKQorI2RlZmluZSBHUElFMl9ERVNDICAgICAgU0lHX0RFU0NfU0VUKFNDVThDLCAxMykKKyNkZWZpbmUgR1BJRTRfREVTQyAgICAgIFNJR19ERVNDX1NFVChTQ1U4QywgMTQpCisjZGVmaW5lIEdQSUU2X0RFU0MgICAgICBTSUdfREVTQ19TRVQoU0NVOEMsIDE1KQorCisjZGVmaW5lIEQxNSAzMgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShOQ1RTMywgTkNUUzMsIFNJR19ERVNDX1NFVChTQ1U4MCwgMTYpKTsKK1NJR19FWFBSX0RFQ0woR1BJRTBJTiwgR1BJRTAsIEdQSUUwX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElFMElOLCBHUElFLCBHUElFX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRTBJTiwgR1BJRTAsIEdQSUUpOworTVNfUElOX0RFQ0woRDE1LCBHUElPRTAsIE5DVFMzLCBHUElFMElOKTsKKworRlVOQ19HUk9VUF9ERUNMKE5DVFMzLCBEMTUpOworCisjZGVmaW5lIEMxNSAzMworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShORENEMywgTkRDRDMsIFNJR19ERVNDX1NFVChTQ1U4MCwgMTcpKTsKK1NJR19FWFBSX0RFQ0woR1BJRTBPVVQsIEdQSUUwLCBHUElFMF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRTBPVVQsIEdQSUUsIEdQSUVfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChHUElFME9VVCwgR1BJRTAsIEdQSUUpOworTVNfUElOX0RFQ0woQzE1LCBHUElPRTEsIE5EQ0QzLCBHUElFME9VVCk7CisKK0ZVTkNfR1JPVVBfREVDTChORENEMywgQzE1KTsKK0ZVTkNfR1JPVVBfREVDTChHUElFMCwgRDE1LCBDMTUpOworCisjZGVmaW5lIEIxNSAzNAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShORFNSMywgTkRTUjMsIFNJR19ERVNDX1NFVChTQ1U4MCwgMTgpKTsKK1NJR19FWFBSX0RFQ0woR1BJRTJJTiwgR1BJRTIsIEdQSUUyX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElFMklOLCBHUElFLCBHUElFX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRTJJTiwgR1BJRTIsIEdQSUUpOworTVNfUElOX0RFQ0woQjE1LCBHUElPRTIsIE5EU1IzLCBHUElFMklOKTsKKworRlVOQ19HUk9VUF9ERUNMKE5EU1IzLCBCMTUpOworCisjZGVmaW5lIEExNSAzNQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShOUkkzLCBOUkkzLCBTSUdfREVTQ19TRVQoU0NVODAsIDE5KSk7CitTSUdfRVhQUl9ERUNMKEdQSUUyT1VULCBHUElFMiwgR1BJRTJfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUUyT1VULCBHUElFLCBHUElFX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRTJPVVQsIEdQSUUyLCBHUElFKTsKK01TX1BJTl9ERUNMKEExNSwgR1BJT0UzLCBOUkkzLCBHUElFMk9VVCk7CisKK0ZVTkNfR1JPVVBfREVDTChOUkkzLCBBMTUpOworRlVOQ19HUk9VUF9ERUNMKEdQSUUyLCBCMTUsIEExNSk7CisKKyNkZWZpbmUgRTE0IDM2CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5EVFIzLCBORFRSMywgU0lHX0RFU0NfU0VUKFNDVTgwLCAyMCkpOworU0lHX0VYUFJfREVDTChHUElFNElOLCBHUElFNCwgR1BJRTRfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUU0SU4sIEdQSUUsIEdQSUVfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChHUElFNElOLCBHUElFNCwgR1BJRSk7CitNU19QSU5fREVDTChFMTQsIEdQSU9FNCwgTkRUUjMsIEdQSUU0SU4pOworCitGVU5DX0dST1VQX0RFQ0woTkRUUjMsIEUxNCk7CisKKyNkZWZpbmUgRDE0IDM3CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5SVFMzLCBOUlRTMywgU0lHX0RFU0NfU0VUKFNDVTgwLCAyMSkpOworU0lHX0VYUFJfREVDTChHUElFNE9VVCwgR1BJRTQsIEdQSUU0X0RFU0MpOworU0lHX0VYUFJfREVDTChHUElFNE9VVCwgR1BJRSwgR1BJRV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKEdQSUU0T1VULCBHUElFNCwgR1BJRSk7CitNU19QSU5fREVDTChEMTQsIEdQSU9FNSwgTlJUUzMsIEdQSUU0T1VUKTsKKworRlVOQ19HUk9VUF9ERUNMKE5SVFMzLCBEMTQpOworRlVOQ19HUk9VUF9ERUNMKEdQSUU0LCBFMTQsIEQxNCk7CisKKyNkZWZpbmUgQzE0IDM4CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFRYRDMsIFRYRDMsIFNJR19ERVNDX1NFVChTQ1U4MCwgMjIpKTsKK1NJR19FWFBSX0RFQ0woR1BJRTZJTiwgR1BJRTYsIEdQSUU2X0RFU0MpOworU0lHX0VYUFJfREVDTChHUElFNklOLCBHUElFLCBHUElFX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRTZJTiwgR1BJRTYsIEdQSUUpOworTVNfUElOX0RFQ0woQzE0LCBHUElPRTYsIFRYRDMsIEdQSUU2SU4pOworCitGVU5DX0dST1VQX0RFQ0woVFhEMywgQzE0KTsKKworI2RlZmluZSBCMTQgMzkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUlhEMywgUlhEMywgU0lHX0RFU0NfU0VUKFNDVTgwLCAyMykpOworU0lHX0VYUFJfREVDTChHUElFNk9VVCwgR1BJRTYsIEdQSUU2X0RFU0MpOworU0lHX0VYUFJfREVDTChHUElFNk9VVCwgR1BJRSwgR1BJRV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKEdQSUU2T1VULCBHUElFNiwgR1BJRSk7CitNU19QSU5fREVDTChCMTQsIEdQSU9FNywgUlhEMywgR1BJRTZPVVQpOworCitGVU5DX0dST1VQX0RFQ0woUlhEMywgQjE0KTsKK0ZVTkNfR1JPVVBfREVDTChHUElFNiwgQzE0LCBCMTQpOworCisjZGVmaW5lIEQxOCA0MAorU1NTRl9QSU5fREVDTChEMTgsIEdQSU9GMCwgTkNUUzQsIFNJR19ERVNDX1NFVChTQ1U4MCwgMjQpKTsKKworI2RlZmluZSBBQ1BJX0RFU0MgICAgICAgU0lHX0RFU0NfQklUKEhXX1NUUkFQMSwgMTksIDApCisKKyNkZWZpbmUgQjE5IDQxCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5EQ0Q0LCBORENENCwgU0lHX0RFU0NfU0VUKFNDVTgwLCAyNSkpOworU0lHX0VYUFJfREVDTChTSU9QQkksIFNJT1BCSSwgU0lHX0RFU0NfU0VUKFNDVUE0LCAxMikpOworU0lHX0VYUFJfREVDTChTSU9QQkksIEFDUEksIEFDUElfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChTSU9QQkksIFNJT1BCSSwgQUNQSSk7CitNU19QSU5fREVDTChCMTksIEdQSU9GMSwgTkRDRDQsIFNJT1BCSSk7CitGVU5DX0dST1VQX0RFQ0woTkRDRDQsIEIxOSk7CitGVU5DX0dST1VQX0RFQ0woU0lPUEJJLCBCMTkpOworCisjZGVmaW5lIEQxNyA0MworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShOUkk0LCBOUkk0LCBTSUdfREVTQ19TRVQoU0NVODAsIDI3KSk7CitTSUdfRVhQUl9ERUNMKFNJT1BCTywgU0lPUEJPLCBTSUdfREVTQ19TRVQoU0NVQTQsIDE0KSk7CitTSUdfRVhQUl9ERUNMKFNJT1BCTywgQUNQSSwgQUNQSV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFNJT1BCTywgU0lPUEJPLCBBQ1BJKTsKK01TX1BJTl9ERUNMKEQxNywgR1BJT0YzLCBOUkk0LCBTSU9QQk8pOworRlVOQ19HUk9VUF9ERUNMKE5SSTQsIEQxNyk7CitGVU5DX0dST1VQX0RFQ0woU0lPUEJPLCBEMTcpOworCitGVU5DX0dST1VQX0RFQ0woQUNQSSwgQjE5LCBEMTcpOworCisjZGVmaW5lIEUxNiA0NgorU1NTRl9QSU5fREVDTChFMTYsIEdQSU9GNiwgVFhENCwgU0lHX0RFU0NfU0VUKFNDVTgwLCAzMCkpOworCisjZGVmaW5lIEMxNyA0NworU1NTRl9QSU5fREVDTChDMTcsIEdQSU9GNywgUlhENCwgU0lHX0RFU0NfU0VUKFNDVTgwLCAzMSkpOworCisjZGVmaW5lIEFBMjIgNTQKK1NTU0ZfUElOX0RFQ0woQUEyMiwgR1BJT0c2LCBGTEJVU1ksIFNJR19ERVNDX1NFVChTQ1U4NCwgNikpOworCisjZGVmaW5lIFUxOCA1NQorU1NTRl9QSU5fREVDTChVMTgsIEdQSU9HNywgRkxXUCwgU0lHX0RFU0NfU0VUKFNDVTg0LCA3KSk7CisKKyNkZWZpbmUgVUFSVDZfREVTQwlTSUdfREVTQ19TRVQoU0NVOTAsIDcpCisjZGVmaW5lIFJPTTE2X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCA2KQorI2RlZmluZSBGTEFTSF9XSURFCVNJR19ERVNDX1NFVChIV19TVFJBUDEsIDQpCisjZGVmaW5lIEJPT1RfU1JDX05PUgl7IEhXX1NUUkFQMSwgR0VOTUFTSygxLCAwKSwgMCwgMCB9CisKKyNkZWZpbmUgQTggNTYKK1NJR19FWFBSX0RFQ0woUk9NRDgsIFJPTTE2LCBST00xNl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDgsIFJPTTE2UywgRkxBU0hfV0lERSwgQk9PVF9TUkNfTk9SKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFJPTUQ4LCBST00xNiwgUk9NMTZTKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkNUUzYsIE5DVFM2LCBVQVJUNl9ERVNDKTsKK01TX1BJTl9ERUNMKEE4LCBHUElPSDAsIFJPTUQ4LCBOQ1RTNik7CisKKyNkZWZpbmUgQzcgNTcKK1NJR19FWFBSX0RFQ0woUk9NRDksIFJPTTE2LCBST00xNl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDksIFJPTTE2UywgRkxBU0hfV0lERSwgQk9PVF9TUkNfTk9SKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFJPTUQ5LCBST00xNiwgUk9NMTZTKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkRDRDYsIE5EQ0Q2LCBVQVJUNl9ERVNDKTsKK01TX1BJTl9ERUNMKEM3LCBHUElPSDEsIFJPTUQ5LCBORENENik7CisKKyNkZWZpbmUgQjcgNTgKK1NJR19FWFBSX0RFQ0woUk9NRDEwLCBST00xNiwgUk9NMTZfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTUQxMCwgUk9NMTZTLCBGTEFTSF9XSURFLCBCT09UX1NSQ19OT1IpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoUk9NRDEwLCBST00xNiwgUk9NMTZTKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkRTUjYsIE5EU1I2LCBVQVJUNl9ERVNDKTsKK01TX1BJTl9ERUNMKEI3LCBHUElPSDIsIFJPTUQxMCwgTkRTUjYpOworCisjZGVmaW5lIEE3IDU5CitTSUdfRVhQUl9ERUNMKFJPTUQxMSwgUk9NMTYsIFJPTTE2X0RFU0MpOworU0lHX0VYUFJfREVDTChST01EMTEsIFJPTTE2UywgRkxBU0hfV0lERSwgQk9PVF9TUkNfTk9SKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFJPTUQxMSwgUk9NMTYsIFJPTTE2Uyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5SSTYsIE5SSTYsIFVBUlQ2X0RFU0MpOworTVNfUElOX0RFQ0woQTcsIEdQSU9IMywgUk9NRDExLCBOUkk2KTsKKworI2RlZmluZSBENyA2MAorU0lHX0VYUFJfREVDTChST01EMTIsIFJPTTE2LCBST00xNl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDEyLCBST00xNlMsIEZMQVNIX1dJREUsIEJPT1RfU1JDX05PUik7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChST01EMTIsIFJPTTE2LCBST00xNlMpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShORFRSNiwgTkRUUjYsIFVBUlQ2X0RFU0MpOworTVNfUElOX0RFQ0woRDcsIEdQSU9INCwgUk9NRDEyLCBORFRSNik7CisKKyNkZWZpbmUgQjYgNjEKK1NJR19FWFBSX0RFQ0woUk9NRDEzLCBST00xNiwgUk9NMTZfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTUQxMywgUk9NMTZTLCBGTEFTSF9XSURFLCBCT09UX1NSQ19OT1IpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoUk9NRDEzLCBST00xNiwgUk9NMTZTKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTlJUUzYsIE5SVFM2LCBVQVJUNl9ERVNDKTsKK01TX1BJTl9ERUNMKEI2LCBHUElPSDUsIFJPTUQxMywgTlJUUzYpOworCisjZGVmaW5lIEE2IDYyCitTSUdfRVhQUl9ERUNMKFJPTUQxNCwgUk9NMTYsIFJPTTE2X0RFU0MpOworU0lHX0VYUFJfREVDTChST01EMTQsIFJPTTE2UywgRkxBU0hfV0lERSwgQk9PVF9TUkNfTk9SKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFJPTUQxNCwgUk9NMTYsIFJPTTE2Uyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFRYRDYsIFRYRDYsIFVBUlQ2X0RFU0MpOworTVNfUElOX0RFQ0woQTYsIEdQSU9INiwgUk9NRDE0LCBUWEQ2KTsKKworI2RlZmluZSBFNyA2MworU0lHX0VYUFJfREVDTChST01EMTUsIFJPTTE2LCBST00xNl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDE1LCBST00xNlMsIEZMQVNIX1dJREUsIEJPT1RfU1JDX05PUik7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChST01EMTUsIFJPTTE2LCBST00xNlMpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSWEQ2LCBSWEQ2LCBVQVJUNl9ERVNDKTsKK01TX1BJTl9ERUNMKEU3LCBHUElPSDcsIFJPTUQxNSwgUlhENik7CisKK0ZVTkNfR1JPVVBfREVDTChVQVJUNiwgQTgsIEM3LCBCNywgQTcsIEQ3LCBCNiwgQTYsIEU3KTsKKworI2RlZmluZSBKMyA3NQorU1NTRl9QSU5fREVDTChKMywgR1BJT0ozLCBTR1BNSSwgU0lHX0RFU0NfU0VUKFNDVTg0LCAxMSkpOworCisjZGVmaW5lIFQ0IDc2CitTU1NGX1BJTl9ERUNMKFQ0LCBHUElPSjQsIFZHQUhTLCBTSUdfREVTQ19TRVQoU0NVODQsIDEyKSk7CisKKyNkZWZpbmUgVTIgNzcKK1NTU0ZfUElOX0RFQ0woVTIsIEdQSU9KNSwgVkdBVlMsIFNJR19ERVNDX1NFVChTQ1U4NCwgMTMpKTsKKworI2RlZmluZSBUMiA3OAorU1NTRl9QSU5fREVDTChUMiwgR1BJT0o2LCBERENDTEssIFNJR19ERVNDX1NFVChTQ1U4NCwgMTQpKTsKKworI2RlZmluZSBUMSA3OQorU1NTRl9QSU5fREVDTChUMSwgR1BJT0o3LCBERENEQVQsIFNJR19ERVNDX1NFVChTQ1U4NCwgMTUpKTsKKworI2RlZmluZSBJMkM1X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAxOCkKKworI2RlZmluZSBFMyA4MAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0w1LCBJMkM1LCBJMkM1X0RFU0MpOworU1NfUElOX0RFQ0woRTMsIEdQSU9LMCwgU0NMNSk7CisKKyNkZWZpbmUgRDIgODEKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBNSwgSTJDNSwgSTJDNV9ERVNDKTsKK1NTX1BJTl9ERUNMKEQyLCBHUElPSzEsIFNEQTUpOworCitGVU5DX0dST1VQX0RFQ0woSTJDNSwgRTMsIEQyKTsKKworI2RlZmluZSBJMkM2X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAxOSkKKworI2RlZmluZSBDMSA4MgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0w2LCBJMkM2LCBJMkM2X0RFU0MpOworU1NfUElOX0RFQ0woQzEsIEdQSU9LMiwgU0NMNik7CisKKyNkZWZpbmUgRjQgODMKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBNiwgSTJDNiwgSTJDNl9ERVNDKTsKK1NTX1BJTl9ERUNMKEY0LCBHUElPSzMsIFNEQTYpOworCitGVU5DX0dST1VQX0RFQ0woSTJDNiwgQzEsIEY0KTsKKworI2RlZmluZSBJMkM3X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyMCkKKworI2RlZmluZSBFMiA4NAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0w3LCBJMkM3LCBJMkM3X0RFU0MpOworU1NfUElOX0RFQ0woRTIsIEdQSU9LNCwgU0NMNyk7CisKKyNkZWZpbmUgRDEgODUKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBNywgSTJDNywgSTJDN19ERVNDKTsKK1NTX1BJTl9ERUNMKEQxLCBHUElPSzUsIFNEQTcpOworCitGVU5DX0dST1VQX0RFQ0woSTJDNywgRTIsIEQxKTsKKworI2RlZmluZSBJMkM4X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyMSkKKworI2RlZmluZSBHNSA4NgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0w4LCBJMkM4LCBJMkM4X0RFU0MpOworU1NfUElOX0RFQ0woRzUsIEdQSU9LNiwgU0NMOCk7CisKKyNkZWZpbmUgRjMgODcKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBOCwgSTJDOCwgSTJDOF9ERVNDKTsKK1NTX1BJTl9ERUNMKEYzLCBHUElPSzcsIFNEQTgpOworCitGVU5DX0dST1VQX0RFQ0woSTJDOCwgRzUsIEYzKTsKKworI2RlZmluZSBVMSA4OAorU1NTRl9QSU5fREVDTChVMSwgR1BJT0wwLCBOQ1RTMSwgU0lHX0RFU0NfU0VUKFNDVTg0LCAxNikpOworCisjZGVmaW5lIFZQSTE4X0RFU0MJeyBTQ1U5MCwgR0VOTUFTSyg1LCA0KSwgMSwgMCB9CisjZGVmaW5lIFZQSTI0X0RFU0MJeyBTQ1U5MCwgR0VOTUFTSyg1LCA0KSwgMiwgMCB9CisjZGVmaW5lIFZQSTMwX0RFU0MJeyBTQ1U5MCwgR0VOTUFTSyg1LCA0KSwgMywgMCB9CisKKyNkZWZpbmUgVDUgODkKKyNkZWZpbmUgVDVfREVTQyAgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4NCwgMTcpCitTSUdfRVhQUl9ERUNMKFZQSURFLCBWUEkxOCwgVlBJMThfREVTQywgVDVfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSURFLCBWUEkyNCwgVlBJMjRfREVTQywgVDVfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSURFLCBWUEkzMCwgVlBJMzBfREVTQywgVDVfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0woVlBJREUsIFNJR19FWFBSX1BUUihWUElERSwgVlBJMTgpLAorCQlTSUdfRVhQUl9QVFIoVlBJREUsIFZQSTI0KSwKKwkJU0lHX0VYUFJfUFRSKFZQSURFLCBWUEkzMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShORENEMSwgTkRDRDEsIFQ1X0RFU0MpOworTVNfUElOX0RFQ0woVDUsIEdQSU9MMSwgVlBJREUsIE5EQ0QxKTsKK0ZVTkNfR1JPVVBfREVDTChORENEMSwgVDUpOworCisjZGVmaW5lIFUzIDkwCisjZGVmaW5lIFUzX0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODQsIDE4KQorU0lHX0VYUFJfREVDTChWUElPREQsIFZQSTE4LCBWUEkxOF9ERVNDLCBVM19ERVNDKTsKK1NJR19FWFBSX0RFQ0woVlBJT0RELCBWUEkyNCwgVlBJMjRfREVTQywgVTNfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSU9ERCwgVlBJMzAsIFZQSTMwX0RFU0MsIFUzX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMKFZQSU9ERCwgU0lHX0VYUFJfUFRSKFZQSU9ERCwgVlBJMTgpLAorCQlTSUdfRVhQUl9QVFIoVlBJT0RELCBWUEkyNCksCisJCVNJR19FWFBSX1BUUihWUElPREQsIFZQSTMwKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5EU1IxLCBORFNSMSwgVTNfREVTQyk7CitNU19QSU5fREVDTChVMywgR1BJT0wyLCBWUElPREQsIE5EU1IxKTsKK0ZVTkNfR1JPVVBfREVDTChORFNSMSwgVTMpOworCisjZGVmaW5lIFYxIDkxCisjZGVmaW5lIFYxX0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODQsIDE5KQorU0lHX0VYUFJfREVDTChWUElIUywgVlBJMTgsIFZQSTE4X0RFU0MsIFYxX0RFU0MpOworU0lHX0VYUFJfREVDTChWUElIUywgVlBJMjQsIFZQSTI0X0RFU0MsIFYxX0RFU0MpOworU0lHX0VYUFJfREVDTChWUElIUywgVlBJMzAsIFZQSTMwX0RFU0MsIFYxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMKFZQSUhTLCBTSUdfRVhQUl9QVFIoVlBJSFMsIFZQSTE4KSwKKwkJU0lHX0VYUFJfUFRSKFZQSUhTLCBWUEkyNCksCisJCVNJR19FWFBSX1BUUihWUElIUywgVlBJMzApKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTlJJMSwgTlJJMSwgVjFfREVTQyk7CitNU19QSU5fREVDTChWMSwgR1BJT0wzLCBWUElIUywgTlJJMSk7CitGVU5DX0dST1VQX0RFQ0woTlJJMSwgVjEpOworCisjZGVmaW5lIFU0IDkyCisjZGVmaW5lIFU0X0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODQsIDIwKQorU0lHX0VYUFJfREVDTChWUElWUywgVlBJMTgsIFZQSTE4X0RFU0MsIFU0X0RFU0MpOworU0lHX0VYUFJfREVDTChWUElWUywgVlBJMjQsIFZQSTI0X0RFU0MsIFU0X0RFU0MpOworU0lHX0VYUFJfREVDTChWUElWUywgVlBJMzAsIFZQSTMwX0RFU0MsIFU0X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMKFZQSVZTLCBTSUdfRVhQUl9QVFIoVlBJVlMsIFZQSTE4KSwKKwkJU0lHX0VYUFJfUFRSKFZQSVZTLCBWUEkyNCksCisJCVNJR19FWFBSX1BUUihWUElWUywgVlBJMzApKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkRUUjEsIE5EVFIxLCBVNF9ERVNDKTsKK01TX1BJTl9ERUNMKFU0LCBHUElPTDQsIFZQSVZTLCBORFRSMSk7CitGVU5DX0dST1VQX0RFQ0woTkRUUjEsIFU0KTsKKworI2RlZmluZSBWMiA5MworI2RlZmluZSBWMl9ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg0LCAyMSkKK1NJR19FWFBSX0RFQ0woVlBJQ0xLLCBWUEkxOCwgVlBJMThfREVTQywgVjJfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSUNMSywgVlBJMjQsIFZQSTI0X0RFU0MsIFYyX0RFU0MpOworU0lHX0VYUFJfREVDTChWUElDTEssIFZQSTMwLCBWUEkzMF9ERVNDLCBWMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTChWUElDTEssIFNJR19FWFBSX1BUUihWUElDTEssIFZQSTE4KSwKKwkJU0lHX0VYUFJfUFRSKFZQSUNMSywgVlBJMjQpLAorCQlTSUdfRVhQUl9QVFIoVlBJQ0xLLCBWUEkzMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShOUlRTMSwgTlJUUzEsIFYyX0RFU0MpOworTVNfUElOX0RFQ0woVjIsIEdQSU9MNSwgVlBJQ0xLLCBOUlRTMSk7CitGVU5DX0dST1VQX0RFQ0woTlJUUzEsIFYyKTsKKworI2RlZmluZSBXMSA5NAorI2RlZmluZSBXMV9ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg0LCAyMikKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBJQjAsIFZQSTMwLCBWUEkzMF9ERVNDLCBXMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVFhEMSwgVFhEMSwgVzFfREVTQyk7CitNU19QSU5fREVDTChXMSwgR1BJT0w2LCBWUElCMCwgVFhEMSk7CitGVU5DX0dST1VQX0RFQ0woVFhEMSwgVzEpOworCisjZGVmaW5lIFU1IDk1CisjZGVmaW5lIFU1X0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODQsIDIzKQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShWUElCMSwgVlBJMzAsIFZQSTMwX0RFU0MsIFU1X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSWEQxLCBSWEQxLCBVNV9ERVNDKTsKK01TX1BJTl9ERUNMKFU1LCBHUElPTDcsIFZQSUIxLCBSWEQxKTsKK0ZVTkNfR1JPVVBfREVDTChSWEQxLCBVNSk7CisKKyNkZWZpbmUgVzQgMTA0CisjZGVmaW5lIFc0X0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODgsIDApCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFZQSUcwLCBWUEkzMCwgVlBJMzBfREVTQywgVzRfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFBXTTAsIFBXTTAsIFc0X0RFU0MpOworTVNfUElOX0RFQ0woVzQsIEdQSU9OMCwgVlBJRzAsIFBXTTApOworRlVOQ19HUk9VUF9ERUNMKFBXTTAsIFc0KTsKKworI2RlZmluZSBZMyAxMDUKKyNkZWZpbmUgWTNfREVTQyAgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4OCwgMSkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBJRzEsIFZQSTMwLCBWUEkzMF9ERVNDLCBZM19ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUFdNMSwgUFdNMSwgWTNfREVTQyk7CitNU19QSU5fREVDTChZMywgR1BJT04xLCBWUElHMSwgUFdNMSk7CitGVU5DX0dST1VQX0RFQ0woUFdNMSwgWTMpOworCisjZGVmaW5lIEFBMiAxMDYKKyNkZWZpbmUgQUEyX0RFU0MgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4OCwgMikKK1NJR19FWFBSX0RFQ0woVlBJRzIsIFZQSTE4LCBWUEkxOF9ERVNDLCBBQTJfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSUcyLCBWUEkyNCwgVlBJMjRfREVTQywgQUEyX0RFU0MpOworU0lHX0VYUFJfREVDTChWUElHMiwgVlBJMzAsIFZQSTMwX0RFU0MsIEFBMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTChWUElHMiwgU0lHX0VYUFJfUFRSKFZQSUcyLCBWUEkxOCksCisJCVNJR19FWFBSX1BUUihWUElHMiwgVlBJMjQpLAorCQlTSUdfRVhQUl9QVFIoVlBJRzIsIFZQSTMwKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFBXTTIsIFBXTTIsIEFBMl9ERVNDKTsKK01TX1BJTl9ERUNMKEFBMiwgR1BJT04yLCBWUElHMiwgUFdNMik7CitGVU5DX0dST1VQX0RFQ0woUFdNMiwgQUEyKTsKKworI2RlZmluZSBBQjEgMTA3CisjZGVmaW5lIEFCMV9ERVNDICAgICAgICBTSUdfREVTQ19TRVQoU0NVODgsIDMpCitTSUdfRVhQUl9ERUNMKFZQSUczLCBWUEkxOCwgVlBJMThfREVTQywgQUIxX0RFU0MpOworU0lHX0VYUFJfREVDTChWUElHMywgVlBJMjQsIFZQSTI0X0RFU0MsIEFCMV9ERVNDKTsKK1NJR19FWFBSX0RFQ0woVlBJRzMsIFZQSTMwLCBWUEkzMF9ERVNDLCBBQjFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0woVlBJRzMsIFNJR19FWFBSX1BUUihWUElHMywgVlBJMTgpLAorCQlTSUdfRVhQUl9QVFIoVlBJRzIsIFZQSTI0KSwKKwkJU0lHX0VYUFJfUFRSKFZQSUcyLCBWUEkzMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV00zLCBQV00zLCBBQjFfREVTQyk7CitNU19QSU5fREVDTChBQjEsIEdQSU9OMywgVlBJRzMsIFBXTTMpOworRlVOQ19HUk9VUF9ERUNMKFBXTTMsIEFCMSk7CisKKyNkZWZpbmUgVzUgMTA4CisjZGVmaW5lIFc1X0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODgsIDQpCitTSUdfRVhQUl9ERUNMKFZQSUc0LCBWUEkxOCwgVlBJMThfREVTQywgVzVfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSUc0LCBWUEkyNCwgVlBJMjRfREVTQywgVzVfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSUc0LCBWUEkzMCwgVlBJMzBfREVTQywgVzVfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0woVlBJRzQsIFNJR19FWFBSX1BUUihWUElHNCwgVlBJMTgpLAorCQlTSUdfRVhQUl9QVFIoVlBJRzIsIFZQSTI0KSwKKwkJU0lHX0VYUFJfUFRSKFZQSUcyLCBWUEkzMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV000LCBQV000LCBXNV9ERVNDKTsKK01TX1BJTl9ERUNMKFc1LCBHUElPTjQsIFZQSUc0LCBQV000KTsKK0ZVTkNfR1JPVVBfREVDTChQV000LCBXNSk7CisKKyNkZWZpbmUgWTQgMTA5CisjZGVmaW5lIFk0X0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODgsIDUpCitTSUdfRVhQUl9ERUNMKFZQSUc1LCBWUEkxOCwgVlBJMThfREVTQywgWTRfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSUc1LCBWUEkyNCwgVlBJMjRfREVTQywgWTRfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSUc1LCBWUEkzMCwgVlBJMzBfREVTQywgWTRfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0woVlBJRzUsIFNJR19FWFBSX1BUUihWUElHNSwgVlBJMTgpLAorCQlTSUdfRVhQUl9QVFIoVlBJRzIsIFZQSTI0KSwKKwkJU0lHX0VYUFJfUFRSKFZQSUcyLCBWUEkzMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV001LCBQV001LCBZNF9ERVNDKTsKK01TX1BJTl9ERUNMKFk0LCBHUElPTjUsIFZQSUc1LCBQV001KTsKK0ZVTkNfR1JPVVBfREVDTChQV001LCBZNCk7CisKKyNkZWZpbmUgQUEzIDExMAorI2RlZmluZSBBQTNfREVTQyAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg4LCA2KQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShWUElHNiwgVlBJMzAsIFZQSTMwX0RFU0MsIEFBM19ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUFdNNiwgUFdNNiwgQUEzX0RFU0MpOworTVNfUElOX0RFQ0woQUEzLCBHUElPTjYsIFZQSUc2LCBQV002KTsKK0ZVTkNfR1JPVVBfREVDTChQV002LCBBQTMpOworCisjZGVmaW5lIEFCMiAxMTEKKyNkZWZpbmUgQUIyX0RFU0MgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4OCwgNykKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBJRzcsIFZQSTMwLCBWUEkzMF9ERVNDLCBBQjJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFBXTTcsIFBXTTcsIEFCMl9ERVNDKTsKK01TX1BJTl9ERUNMKEFCMiwgR1BJT043LCBWUElHNywgUFdNNyk7CitGVU5DX0dST1VQX0RFQ0woUFdNNywgQUIyKTsKKworI2RlZmluZSBWNiAxMTIKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBJRzgsIFZQSTI0LCBWUEkyNF9ERVNDLCBTSUdfREVTQ19TRVQoU0NVODgsIDgpKTsKK1NTX1BJTl9ERUNMKFY2LCBHUElPTzAsIFZQSUc4KTsKKworI2RlZmluZSBZNSAxMTMKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBJRzksIFZQSTI0LCBWUEkyNF9ERVNDLCBTSUdfREVTQ19TRVQoU0NVODgsIDkpKTsKK1NTX1BJTl9ERUNMKFk1LCBHUElPTzEsIFZQSUc5KTsKKworRlVOQ19HUk9VUF9ERUNMKFZQSTE4LCBUNSwgVTMsIFYxLCBVNCwgVjIsIEFBMjIsIFc1LCBZNCwgQUEzLCBBQjIpOworRlVOQ19HUk9VUF9ERUNMKFZQSTI0LCBUNSwgVTMsIFYxLCBVNCwgVjIsIEFBMjIsIFc1LCBZNCwgQUEzLCBBQjIsIFY2LCBZNSk7CitGVU5DX0dST1VQX0RFQ0woVlBJMzAsIFQ1LCBVMywgVjEsIFU0LCBWMiwgVzEsIFU1LCBXNCwgWTMsIEFBMjIsIFc1LCBZNCwgQUEzLAorCQlBQjIpOworCisjZGVmaW5lIFk3IDEyNQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPUDUsIEdQSU9QNSk7CitNU19QSU5fREVDTF8oWTcsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9QNSkpOworCisjZGVmaW5lIEFBNyAxMjYKK1NTU0ZfUElOX0RFQ0woQUE3LCBHUElPUDYsIEJNQ0lOVCwgU0lHX0RFU0NfU0VUKFNDVTg4LCAyMikpOworCisjZGVmaW5lIEFCNyAxMjcKK1NTU0ZfUElOX0RFQ0woQUI3LCBHUElPUDcsIEZMQUNLLCBTSUdfREVTQ19TRVQoU0NVODgsIDIzKSk7CisKKyNkZWZpbmUgSTJDM19ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMTYpCisKKyNkZWZpbmUgRDMgMTI4CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDMsIEkyQzMsIEkyQzNfREVTQyk7CitTU19QSU5fREVDTChEMywgR1BJT1EwLCBTQ0wzKTsKKworI2RlZmluZSBDMiAxMjkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMywgSTJDMywgSTJDM19ERVNDKTsKK1NTX1BJTl9ERUNMKEMyLCBHUElPUTEsIFNEQTMpOworCitGVU5DX0dST1VQX0RFQ0woSTJDMywgRDMsIEMyKTsKKworI2RlZmluZSBJMkM0X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAxNykKKworI2RlZmluZSBCMSAxMzAKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMNCwgSTJDNCwgSTJDNF9ERVNDKTsKK1NTX1BJTl9ERUNMKEIxLCBHUElPUTIsIFNDTDQpOworCisjZGVmaW5lIEY1IDEzMQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREE0LCBJMkM0LCBJMkM0X0RFU0MpOworU1NfUElOX0RFQ0woRjUsIEdQSU9RMywgU0RBNCk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkM0LCBCMSwgRjUpOworCisjZGVmaW5lIERBU0g5MDI4X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyOCkKKworI2RlZmluZSBIMiAxMzQKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoREFTSEgyLCBEQVNISDIsIERBU0g5MDI4X0RFU0MpOworU1NfUElOX0RFQ0woSDIsIEdQSU9RNiwgREFTSEgyKTsKKworI2RlZmluZSBIMSAxMzUKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoREFTSEgxLCBEQVNISDEsIERBU0g5MDI4X0RFU0MpOworU1NfUElOX0RFQ0woSDEsIEdQSU9RNywgREFTSEgxKTsKKworI2RlZmluZSBWMjAgMTM2CitTU1NGX1BJTl9ERUNMKFYyMCwgR1BJT1IwLCBST01DUzEsIFNJR19ERVNDX1NFVChTQ1U4OCwgMjQpKTsKKworI2RlZmluZSBXMjEgMTM3CitTU1NGX1BJTl9ERUNMKFcyMSwgR1BJT1IxLCBST01DUzIsIFNJR19ERVNDX1NFVChTQ1U4OCwgMjUpKTsKKworI2RlZmluZSBZMjIgMTM4CitTU1NGX1BJTl9ERUNMKFkyMiwgR1BJT1IyLCBST01DUzMsIFNJR19ERVNDX1NFVChTQ1U4OCwgMjYpKTsKKworI2RlZmluZSBVMTkgMTM5CitTU1NGX1BJTl9ERUNMKFUxOSwgR1BJT1IzLCBST01DUzQsIFNJR19ERVNDX1NFVChTQ1U4OCwgMjcpKTsKKworI2RlZmluZSBWUE9PRkYwX0RFU0MJeyBTQ1U5NCwgR0VOTUFTSygxLCAwKSwgMCwgMCB9CisjZGVmaW5lIFZQTzEyX0RFU0MJeyBTQ1U5NCwgR0VOTUFTSygxLCAwKSwgMSwgMCB9CisjZGVmaW5lIFZQTzI0X0RFU0MJeyBTQ1U5NCwgR0VOTUFTSygxLCAwKSwgMiwgMCB9CisjZGVmaW5lIFZQT09GRjFfREVTQwl7IFNDVTk0LCBHRU5NQVNLKDEsIDApLCAzLCAwIH0KKyNkZWZpbmUgVlBPX09GRl8xMiAgICAgIHsgU0NVOTQsIDB4MiwgMCwgMCB9CisjZGVmaW5lIFZQT18yNF9PRkYgICAgICBTSUdfREVTQ19TRVQoU0NVOTQsIDEpCisKKyNkZWZpbmUgVjIxIDE0MAorI2RlZmluZSBWMjFfREVTQwlTSUdfREVTQ19TRVQoU0NVODgsIDI4KQorU0lHX0VYUFJfREVDTChST01BMjQsIFJPTTgsIFYyMV9ERVNDLCBWUE9fT0ZGXzEyKTsKK1NJR19FWFBSX0RFQ0woUk9NQTI0LCBST00xNiwgVjIxX0RFU0MsIFZQT19PRkZfMTIpOworU0lHX0VYUFJfREVDTChST01BMjQsIFJPTTE2UywgVjIxX0RFU0MsIFZQT19PRkZfMTIpOworU0lHX0VYUFJfTElTVF9ERUNMKFJPTUEyNCwgU0lHX0VYUFJfUFRSKFJPTUEyNCwgUk9NOCksCisJCVNJR19FWFBSX1BUUihST01BMjQsIFJPTTE2KSwKKwkJU0lHX0VYUFJfUFRSKFJPTUEyNCwgUk9NMTZTKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFZQT1I2LCBWUE8yNCwgVjIxX0RFU0MsIFZQT18yNF9PRkYpOworTVNfUElOX0RFQ0woVjIxLCBHUElPUjQsIFJPTUEyNCwgVlBPUjYpOworCisjZGVmaW5lIFcyMiAxNDEKKyNkZWZpbmUgVzIyX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTg4LCAyOSkKK1NJR19FWFBSX0RFQ0woUk9NQTI1LCBST004LCBXMjJfREVTQywgVlBPX09GRl8xMik7CitTSUdfRVhQUl9ERUNMKFJPTUEyNSwgUk9NMTYsIFcyMl9ERVNDLCBWUE9fT0ZGXzEyKTsKK1NJR19FWFBSX0RFQ0woUk9NQTI1LCBST00xNlMsIFcyMl9ERVNDLCBWUE9fT0ZGXzEyKTsKK1NJR19FWFBSX0xJU1RfREVDTChST01BMjUsIFNJR19FWFBSX1BUUihST01BMjUsIFJPTTgpLAorCQlTSUdfRVhQUl9QVFIoUk9NQTI1LCBST00xNiksCisJCVNJR19FWFBSX1BUUihST01BMjUsIFJPTTE2UykpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShWUE9SNywgVlBPMjQsIFcyMl9ERVNDLCBWUE9fMjRfT0ZGKTsKK01TX1BJTl9ERUNMKFcyMiwgR1BJT1I1LCBST01BMjUsIFZQT1I3KTsKKworI2RlZmluZSBDNiAxNDIKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTURDMSwgTURJTzEsIFNJR19ERVNDX1NFVChTQ1U4OCwgMzApKTsKK1NTX1BJTl9ERUNMKEM2LCBHUElPUjYsIE1EQzEpOworCisjZGVmaW5lIEE1IDE0MworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShNRElPMSwgTURJTzEsIFNJR19ERVNDX1NFVChTQ1U4OCwgMzEpKTsKK1NTX1BJTl9ERUNMKEE1LCBHUElPUjcsIE1ESU8xKTsKKworRlVOQ19HUk9VUF9ERUNMKE1ESU8xLCBDNiwgQTUpOworCisjZGVmaW5lIFUyMSAxNDQKKyNkZWZpbmUgVTIxX0RFU0MgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4QywgMCkKK1NJR19FWFBSX0RFQ0woUk9NRDQsIFJPTTgsIFUyMV9ERVNDLCBWUE9PRkYwX0RFU0MpOworU0lHX0VYUFJfREVDTChST01ENCwgUk9NMTYsIFUyMV9ERVNDLCBWUE9PRkYwX0RFU0MpOworU0lHX0VYUFJfREVDTChST01ENCwgUk9NMTZTLCBVMjFfREVTQywgVlBPT0ZGMF9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTChST01ENCwgU0lHX0VYUFJfUFRSKFJPTUQ0LCBST004KSwKKwkJU0lHX0VYUFJfUFRSKFJPTUQ0LCBST00xNiksCisJCVNJR19FWFBSX1BUUihST01ENCwgUk9NMTZTKSk7CitTSUdfRVhQUl9ERUNMKFZQT0RFLCBWUE8xMiwgVTIxX0RFU0MsIFZQTzEyX0RFU0MpOworU0lHX0VYUFJfREVDTChWUE9ERSwgVlBPMjQsIFUyMV9ERVNDLCBWUE8xMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFZQT0RFLCBWUE8xMiwgVlBPMjQpOworTVNfUElOX0RFQ0woVTIxLCBHUElPUzAsIFJPTUQ0LCBWUE9ERSk7CisKKyNkZWZpbmUgVDE5IDE0NQorI2RlZmluZSBUMTlfREVTQyAgICAgICAgU0lHX0RFU0NfU0VUKFNDVThDLCAxKQorU0lHX0VYUFJfREVDTChST01ENSwgUk9NOCwgVDE5X0RFU0MsIFZQT09GRjBfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTUQ1LCBST00xNiwgVDE5X0RFU0MsIFZQT09GRjBfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTUQ1LCBST00xNlMsIFQxOV9ERVNDLCBWUE9PRkYwX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMKFJPTUQ1LCBTSUdfRVhQUl9QVFIoUk9NRDUsIFJPTTgpLAorCQlTSUdfRVhQUl9QVFIoUk9NRDUsIFJPTTE2KSwKKwkJU0lHX0VYUFJfUFRSKFJPTUQ1LCBST00xNlMpKTsKK1NJR19FWFBSX0RFQ0woVlBPSFMsIFZQTzEyLCBUMTlfREVTQywgVlBPMTJfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQT0hTLCBWUE8yNCwgVDE5X0RFU0MsIFZQTzI0X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoVlBPSFMsIFZQTzEyLCBWUE8yNCk7CitNU19QSU5fREVDTChUMTksIEdQSU9TMSwgUk9NRDUsIFZQT0hTKTsKKworI2RlZmluZSBWMjIgMTQ2CisjZGVmaW5lIFYyMl9ERVNDICAgICAgICBTSUdfREVTQ19TRVQoU0NVOEMsIDIpCitTSUdfRVhQUl9ERUNMKFJPTUQ2LCBST004LCBWMjJfREVTQywgVlBPT0ZGMF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDYsIFJPTTE2LCBWMjJfREVTQywgVlBPT0ZGMF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDYsIFJPTTE2UywgVjIyX0RFU0MsIFZQT09GRjBfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0woUk9NRDYsIFNJR19FWFBSX1BUUihST01ENiwgUk9NOCksCisJCVNJR19FWFBSX1BUUihST01ENiwgUk9NMTYpLAorCQlTSUdfRVhQUl9QVFIoUk9NRDYsIFJPTTE2UykpOworU0lHX0VYUFJfREVDTChWUE9WUywgVlBPMTIsIFYyMl9ERVNDLCBWUE8xMl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woVlBPVlMsIFZQTzI0LCBWMjJfREVTQywgVlBPMjRfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChWUE9WUywgVlBPMTIsIFZQTzI0KTsKK01TX1BJTl9ERUNMKFYyMiwgR1BJT1MyLCBST01ENiwgVlBPVlMpOworCisjZGVmaW5lIFUyMCAxNDcKKyNkZWZpbmUgVTIwX0RFU0MgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4QywgMykKK1NJR19FWFBSX0RFQ0woUk9NRDcsIFJPTTgsIFUyMF9ERVNDLCBWUE9PRkYwX0RFU0MpOworU0lHX0VYUFJfREVDTChST01ENywgUk9NMTYsIFUyMF9ERVNDLCBWUE9PRkYwX0RFU0MpOworU0lHX0VYUFJfREVDTChST01ENywgUk9NMTZTLCBVMjBfREVTQywgVlBPT0ZGMF9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTChST01ENywgU0lHX0VYUFJfUFRSKFJPTUQ3LCBST004KSwKKwkJU0lHX0VYUFJfUFRSKFJPTUQ3LCBST00xNiksCisJCVNJR19FWFBSX1BUUihST01ENywgUk9NMTZTKSk7CitTSUdfRVhQUl9ERUNMKFZQT0NMSywgVlBPMTIsIFUyMF9ERVNDLCBWUE8xMl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woVlBPQ0xLLCBWUE8yNCwgVTIwX0RFU0MsIFZQTzI0X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoVlBPQ0xLLCBWUE8xMiwgVlBPMjQpOworTVNfUElOX0RFQ0woVTIwLCBHUElPUzMsIFJPTUQ3LCBWUE9DTEspOworCisjZGVmaW5lIFIxOCAxNDgKKyNkZWZpbmUgUk9NT0VfREVTQyAgICAgIFNJR19ERVNDX1NFVChTQ1U4QywgNCkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1M0LCBHUElPUzQpOworU0lHX0VYUFJfREVDTChST01PRSwgUk9NOCwgUk9NT0VfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTU9FLCBST00xNiwgUk9NT0VfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTU9FLCBST00xNlMsIFJPTU9FX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMKFJPTU9FLCBTSUdfRVhQUl9QVFIoUk9NT0UsIFJPTTgpLAorCQlTSUdfRVhQUl9QVFIoUk9NT0UsIFJPTTE2KSwKKwkJU0lHX0VYUFJfUFRSKFJPTU9FLCBST00xNlMpKTsKK01TX1BJTl9ERUNMXyhSMTgsIFNJR19FWFBSX0xJU1RfUFRSKFJPTU9FKSwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1M0KSk7CisKKyNkZWZpbmUgTjIxIDE0OQorI2RlZmluZSBST01XRV9ERVNDICAgICAgU0lHX0RFU0NfU0VUKFNDVThDLCA1KQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPUzUsIEdQSU9TNSk7CitTSUdfRVhQUl9ERUNMKFJPTVdFLCBST004LCBST01XRV9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NV0UsIFJPTTE2LCBST01XRV9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NV0UsIFJPTTE2UywgUk9NV0VfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0woUk9NV0UsIFNJR19FWFBSX1BUUihST01XRSwgUk9NOCksCisJCVNJR19FWFBSX1BUUihST01XRSwgUk9NMTYpLAorCQlTSUdfRVhQUl9QVFIoUk9NV0UsIFJPTTE2UykpOworTVNfUElOX0RFQ0xfKE4yMSwgU0lHX0VYUFJfTElTVF9QVFIoUk9NV0UpLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPUzUpKTsKKworI2RlZmluZSBMMjIgMTUwCisjZGVmaW5lIEwyMl9ERVNDICAgICAgICBTSUdfREVTQ19TRVQoU0NVOEMsIDYpCitTSUdfRVhQUl9ERUNMKFJPTUEyMiwgUk9NOCwgTDIyX0RFU0MsIFZQT19PRkZfMTIpOworU0lHX0VYUFJfREVDTChST01BMjIsIFJPTTE2LCBMMjJfREVTQywgVlBPX09GRl8xMik7CitTSUdfRVhQUl9ERUNMKFJPTUEyMiwgUk9NMTZTLCBMMjJfREVTQywgVlBPX09GRl8xMik7CitTSUdfRVhQUl9MSVNUX0RFQ0woUk9NQTIyLCBTSUdfRVhQUl9QVFIoUk9NQTIyLCBST004KSwKKwkJU0lHX0VYUFJfUFRSKFJPTUEyMiwgUk9NMTYpLAorCQlTSUdfRVhQUl9QVFIoUk9NQTIyLCBST00xNlMpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBPUjQsIFZQTzI0LCBMMjJfREVTQywgVlBPXzI0X09GRik7CitNU19QSU5fREVDTChMMjIsIEdQSU9TNiwgUk9NQTIyLCBWUE9SNCk7CisKKyNkZWZpbmUgSzE4IDE1MQorI2RlZmluZSBLMThfREVTQwlTSUdfREVTQ19TRVQoU0NVOEMsIDcpCitTSUdfRVhQUl9ERUNMKFJPTUEyMywgUk9NOCwgSzE4X0RFU0MsIFZQT19PRkZfMTIpOworU0lHX0VYUFJfREVDTChST01BMjMsIFJPTTE2LCBLMThfREVTQywgVlBPX09GRl8xMik7CitTSUdfRVhQUl9ERUNMKFJPTUEyMywgUk9NMTZTLCBLMThfREVTQywgVlBPX09GRl8xMik7CitTSUdfRVhQUl9MSVNUX0RFQ0woUk9NQTIzLCBTSUdfRVhQUl9QVFIoUk9NQTIzLCBST004KSwKKwkJU0lHX0VYUFJfUFRSKFJPTUEyMywgUk9NMTYpLAorCQlTSUdfRVhQUl9QVFIoUk9NQTIzLCBST00xNlMpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBPUjUsIFZQTzI0LCBLMThfREVTQywgVlBPXzI0X09GRik7CitNU19QSU5fREVDTChLMTgsIEdQSU9TNywgUk9NQTIzLCBWUE9SNSk7CisKK0ZVTkNfR1JPVVBfREVDTChST004LCBWMjAsIFUyMSwgVDE5LCBWMjIsIFUyMCwgUjE4LCBOMjEsIEwyMiwgSzE4LCBXMjEsIFkyMiwKKwkJVTE5KTsKK0ZVTkNfR1JPVVBfREVDTChST00xNiwgVjIwLCBVMjEsIFQxOSwgVjIyLCBVMjAsIFIxOCwgTjIxLCBMMjIsIEsxOCwKKwkJQTgsIEM3LCBCNywgQTcsIEQ3LCBCNiwgQTYsIEU3LCBXMjEsIFkyMiwgVTE5KTsKK0ZVTkNfR1JPVVBfREVDTChWUE8xMiwgVTIxLCBUMTksIFYyMiwgVTIwKTsKK0ZVTkNfR1JPVVBfREVDTChWUE8yNCwgVTIxLCBUMTksIFYyMiwgVTIwLCBMMjIsIEsxOCwgVjIxLCBXMjIpOworCisjZGVmaW5lIFJNSUkxX0RFU0MgICAgICBTSUdfREVTQ19CSVQoSFdfU1RSQVAxLCA2LCAwKQorCisjZGVmaW5lIEExMiAxNTIKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1QwLCBHUElPVDAsIFNJR19ERVNDX1NFVChTQ1VBMCwgMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMVRYRU4sIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxVFhDSywgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhBMTIsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UMCksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxVFhFTiksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVRYQ0spKTsKKworI2RlZmluZSBCMTIgMTUzCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9UMSwgR1BJT1QxLCBTSUdfREVTQ19TRVQoU0NVQTAsIDEpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoREFTSEIxMiwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFUWENUTCwgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhCMTIsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UMSksIFNJR19FWFBSX0xJU1RfUFRSKERBU0hCMTIpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWENUTCkpOworCisjZGVmaW5lIEMxMiAxNTQKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1QyLCBHUElPVDIsIFNJR19ERVNDX1NFVChTQ1VBMCwgMikpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMVRYRDAsIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxVFhEMCwgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhDMTIsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UMiksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxVFhEMCksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVRYRDApKTsKKworI2RlZmluZSBEMTIgMTU1CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9UMywgR1BJT1QzLCBTSUdfREVTQ19TRVQoU0NVQTAsIDMpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFUWEQxLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVRYRDEsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oRDEyLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDMpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVRYRDEpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWEQxKSk7CisKKyNkZWZpbmUgRTEyIDE1NgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVDQsIEdQSU9UNCwgU0lHX0RFU0NfU0VUKFNDVUEwLCA0KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKERBU0hFMTIsIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxVFhEMiwgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhFMTIsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UNCksIFNJR19FWFBSX0xJU1RfUFRSKERBU0hFMTIpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWEQyKSk7CisKKyNkZWZpbmUgQTEzIDE1NworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVDUsIEdQSU9UNSwgU0lHX0RFU0NfU0VUKFNDVUEwLCA1KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKERBU0hBMTMsIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxVFhEMywgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhBMTMsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UNSksIFNJR19FWFBSX0xJU1RfUFRSKERBU0hBMTMpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWEQzKSk7CisKKyNkZWZpbmUgRTExIDE2NAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVTQsIEdQSU9VNCwgU0lHX0RFU0NfU0VUKFNDVUEwLCAxMikpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMVJDTEssIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxUlhDSywgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhFMTEsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9VNCksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxUkNMSyksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVJYQ0spKTsKKworI2RlZmluZSBEMTEgMTY1CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9VNSwgR1BJT1U1LCBTSUdfREVTQ19TRVQoU0NVQTAsIDEzKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKERBU0hEMTEsIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxUlhDVEwsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oRDExLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVTUpLCBTSUdfRVhQUl9MSVNUX1BUUihEQVNIRDExKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxUlhDVEwpKTsKKworI2RlZmluZSBDMTEgMTY2CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9VNiwgR1BJT1U2LCBTSUdfREVTQ19TRVQoU0NVQTAsIDE0KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxUlhEMCwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFSWEQwLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEMxMSwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1U2KSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTFSWEQwKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxUlhEMCkpOworCisjZGVmaW5lIEIxMSAxNjcKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1U3LCBHUElPVTcsIFNJR19ERVNDX1NFVChTQ1VBMCwgMTUpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFSWEQxLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVJYRDEsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oQjExLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVTcpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVJYRDEpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFSWEQxKSk7CisKKyNkZWZpbmUgQTExIDE2OAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVjAsIEdQSU9WMCwgU0lHX0RFU0NfU0VUKFNDVUEwLCAxNikpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMUNSU0RWLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVJYRDIsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oQTExLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVjApLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMUNSU0RWKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxUlhEMikpOworCisjZGVmaW5lIEUxMCAxNjkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1YxLCBHUElPVjEsIFNJR19ERVNDX1NFVChTQ1VBMCwgMTcpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFSWEVSLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVJYRDMsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oRTEwLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVjEpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVJYRVIpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFSWEQzKSk7CisKK0ZVTkNfR1JPVVBfREVDTChSTUlJMSwgQTEyLCBCMTIsIEMxMiwgRDEyLCBFMTIsIEExMywgRTExLCBEMTEsIEMxMSwgQjExLCBBMTEsCisJCUUxMCk7CitGVU5DX0dST1VQX0RFQ0woUkdNSUkxLCBBMTIsIEIxMiwgQzEyLCBEMTIsIEUxMiwgQTEzLCBFMTEsIEQxMSwgQzExLCBCMTEsIEExMSwKKwkJRTEwKTsKKworLyogTm90ZSB3ZSBhY2NvdW50IGZvciBHUElPWTQtR1BJT1k3IGV2ZW4gdGhvdWdoIHRoZXkncmUgbm90IHZhbGlkLCB0aHVzIDIxNgorICogcGlucyBiZWNvbWVzIDIyMC4KKyAqLworI2RlZmluZSBBU1BFRURfRzRfTlJfUElOUyAyMjAKKworLyogUGlucywgZ3JvdXBzIGFuZCBmdW5jdGlvbnMgYXJlIHNvcnQoMSk6ZWQgYWxwaGFiZXRpY2FsbHkgZm9yIHNhbml0eSAqLworCitzdGF0aWMgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgYXNwZWVkX2c0X3BpbnNbQVNQRUVEX0c0X05SX1BJTlNdID0geworCUFTUEVFRF9QSU5DVFJMX1BJTihBMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEExMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEExMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEExMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEExNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEExOCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEEyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQTMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBNCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEE1KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQTYpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBNyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEE4KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQUEyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQUEyMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEFBMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEFBNyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEFCMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEFCMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEFCNyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEIxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjExKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjEyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjE0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjE1KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjE5KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEI0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjYpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCNyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEMxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzExKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzEyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzE0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzE1KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzE3KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEM0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzUpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDNiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEM3KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMTEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMTIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMTQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMTUpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMTYpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMTcpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMTgpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEQzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihENSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEQ3KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTEwKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTExKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTEyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTE0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTE2KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihFMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEU1KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTcpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihGMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEY0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRjUpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihHNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEgxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oSDE5KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oSDIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihIMjApLAorCUFTUEVFRF9QSU5DVFJMX1BJTihKMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEsxOCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEwyMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKE4yMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFIxOCksCisJQVNQRUVEX1BJTkNUUkxfUElOKFQxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVDE5KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVDIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihUNCksCisJQVNQRUVEX1BJTkNUUkxfUElOKFQ1KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVTEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihVMTgpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihVMTkpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihVMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKFUyMCksCisJQVNQRUVEX1BJTkNUUkxfUElOKFUyMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFUzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVTQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihVNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFYxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVjIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihWMjApLAorCUFTUEVFRF9QSU5DVFJMX1BJTihWMjEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihWMjIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihWNiksCisJQVNQRUVEX1BJTkNUUkxfUElOKFcxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVzIxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVzIyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVzQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihXNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFkyMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKFkzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oWTQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihZNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFk3KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXNwZWVkX3Bpbl9ncm91cCBhc3BlZWRfZzRfZ3JvdXBzW10gPSB7CisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoQUNQSSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoQk1DSU5UKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChERENDTEspLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEREQ0RBVCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoRkxBQ0spLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEZMQlVTWSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoRkxXUCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoR1BJRDApLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEdQSUUwKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChHUElFMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoR1BJRTQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEdQSUU2KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkMxMCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDMTEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEkyQzEyKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkMxMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDNCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDNSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDNiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDNyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDOCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDOSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTFBDUEQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKExQQ1BNRSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTFBDUE1FKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChMUENTTUkpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE1ESU8xKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChNRElPMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTkNUUzEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5DVFMzKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChOQ1RTNCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTkRDRDEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5EQ0QzKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChORENENCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTkRTUjEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5EU1IzKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChORFRSMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTkRUUjMpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5SSTEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5SSTMpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5SSTQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5SVFMxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChOUlRTMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNMCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNNCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNNSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNNiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNNyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUkdNSUkxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChSTUlJMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUk9NMTYpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFJPTTgpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFJPTUNTMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUk9NQ1MyKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChST01DUzMpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFJPTUNTNCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUlhEMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUlhEMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUlhENCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoU0QxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChTR1BNSSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoU0lPUEJJKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChTSU9QQk8pLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFRJTUVSMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVElNRVI1KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChUSU1FUjYpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFRJTUVSNyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVElNRVI4KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChUWEQxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChUWEQzKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChUWEQ0KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChVQVJUNiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVkdBSFMpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFZHQVZTKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChWUEkxOCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVlBJMjQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFZQSTMwKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChWUE8xMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVlBPMjQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhc3BlZWRfcGluX2Z1bmN0aW9uIGFzcGVlZF9nNF9mdW5jdGlvbnNbXSA9IHsKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEFDUEkpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoQk1DSU5UKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEREQ0NMSyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhERENEQVQpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoRkxBQ0spLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoRkxCVVNZKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEZMV1ApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoR1BJRDApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoR1BJRTApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoR1BJRTIpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoR1BJRTQpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoR1BJRTYpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTIpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTMpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhJMkM0KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzUpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDNiksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhJMkM3KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzgpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDOSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhMUENQRCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhMUENQTUUpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoTFBDU01JKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE1ESU8xKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE1ESU8yKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5DVFMxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5DVFMzKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5DVFM0KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5EQ0QxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5EQ0QzKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5EQ0Q0KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5EU1IxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5EU1IzKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5EVFIxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5EVFIzKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5SSTEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoTlJJMyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhOUkk0KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5SVFMxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5SVFMzKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUFdNMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhQV00yKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTMpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUFdNNCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhQV001KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTYpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUFdNNyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhSR01JSTEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUk1JSTEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUk9NMTYpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUk9NOCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhST01DUzEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUk9NQ1MyKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFJPTUNTMyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhST01DUzQpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUlhEMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhSWEQzKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFJYRDQpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoU0QxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFNHUE1JKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFNJT1BCSSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhTSU9QQk8pLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVElNRVIzKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFRJTUVSNSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhUSU1FUjYpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVElNRVI3KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFRJTUVSOCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhUWEQxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFRYRDMpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVFhENCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhVQVJUNiksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhWR0FIUyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhWR0FWUyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhWUEkxOCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhWUEkyNCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhWUEkzMCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhWUE8xMiksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhWUE8yNCksCit9OworCitzdGF0aWMgc3RydWN0IGFzcGVlZF9waW5jdHJsX2RhdGEgYXNwZWVkX2c0X3BpbmN0cmxfZGF0YSA9IHsKKwkucGlucyA9IGFzcGVlZF9nNF9waW5zLAorCS5ucGlucyA9IEFSUkFZX1NJWkUoYXNwZWVkX2c0X3BpbnMpLAorCS5ncm91cHMgPSBhc3BlZWRfZzRfZ3JvdXBzLAorCS5uZ3JvdXBzID0gQVJSQVlfU0laRShhc3BlZWRfZzRfZ3JvdXBzKSwKKwkuZnVuY3Rpb25zID0gYXNwZWVkX2c0X2Z1bmN0aW9ucywKKwkubmZ1bmN0aW9ucyA9IEFSUkFZX1NJWkUoYXNwZWVkX2c0X2Z1bmN0aW9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHBpbm11eF9vcHMgYXNwZWVkX2c0X3Bpbm11eF9vcHMgPSB7CisJLmdldF9mdW5jdGlvbnNfY291bnQgPSBhc3BlZWRfcGlubXV4X2dldF9mbl9jb3VudCwKKwkuZ2V0X2Z1bmN0aW9uX25hbWUgPSBhc3BlZWRfcGlubXV4X2dldF9mbl9uYW1lLAorCS5nZXRfZnVuY3Rpb25fZ3JvdXBzID0gYXNwZWVkX3Bpbm11eF9nZXRfZm5fZ3JvdXBzLAorCS5zZXRfbXV4ID0gYXNwZWVkX3Bpbm11eF9zZXRfbXV4LAorCS5ncGlvX3JlcXVlc3RfZW5hYmxlID0gYXNwZWVkX2dwaW9fcmVxdWVzdF9lbmFibGUsCisJLnN0cmljdCA9IHRydWUsCit9OworCitzdGF0aWMgc3RydWN0IHBpbmN0cmxfb3BzIGFzcGVlZF9nNF9waW5jdHJsX29wcyA9IHsKKwkuZ2V0X2dyb3Vwc19jb3VudCA9IGFzcGVlZF9waW5jdHJsX2dldF9ncm91cHNfY291bnQsCisJLmdldF9ncm91cF9uYW1lID0gYXNwZWVkX3BpbmN0cmxfZ2V0X2dyb3VwX25hbWUsCisJLmdldF9ncm91cF9waW5zID0gYXNwZWVkX3BpbmN0cmxfZ2V0X2dyb3VwX3BpbnMsCisJLnBpbl9kYmdfc2hvdyA9IGFzcGVlZF9waW5jdHJsX3Bpbl9kYmdfc2hvdywKKwkuZHRfbm9kZV90b19tYXAgPSBwaW5jb25mX2dlbmVyaWNfZHRfbm9kZV90b19tYXBfcGluLAorCS5kdF9mcmVlX21hcCA9IHBpbmN0cmxfdXRpbHNfZnJlZV9tYXAsCit9OworCitzdGF0aWMgc3RydWN0IHBpbmN0cmxfZGVzYyBhc3BlZWRfZzRfcGluY3RybF9kZXNjID0geworCS5uYW1lID0gImFzcGVlZC1nNC1waW5jdHJsIiwKKwkucGlucyA9IGFzcGVlZF9nNF9waW5zLAorCS5ucGlucyA9IEFSUkFZX1NJWkUoYXNwZWVkX2c0X3BpbnMpLAorCS5wY3Rsb3BzID0gJmFzcGVlZF9nNF9waW5jdHJsX29wcywKKwkucG14b3BzID0gJmFzcGVlZF9nNF9waW5tdXhfb3BzLAorfTsKKworc3RhdGljIGludCBhc3BlZWRfZzRfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXNwZWVkX2c0X3BpbnMpOyBpKyspCisJCWFzcGVlZF9nNF9waW5zW2ldLm51bWJlciA9IGk7CisKKwlyZXR1cm4gYXNwZWVkX3BpbmN0cmxfcHJvYmUocGRldiwgJmFzcGVlZF9nNF9waW5jdHJsX2Rlc2MsCisJCQkmYXNwZWVkX2c0X3BpbmN0cmxfZGF0YSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFzcGVlZF9nNF9waW5jdHJsX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJhc3BlZWQsYXN0MjQwMC1waW5jdHJsIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImFzcGVlZCxnNC1waW5jdHJsIiwgfSwKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhc3BlZWRfZzRfcGluY3RybF9kcml2ZXIgPSB7CisJLnByb2JlID0gYXNwZWVkX2c0X3BpbmN0cmxfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYXNwZWVkLWc0LXBpbmN0cmwiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhc3BlZWRfZzRfcGluY3RybF9vZl9tYXRjaCwKKwl9LAorfTsKKworc3RhdGljIGludCBhc3BlZWRfZzRfcGluY3RybF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXNwZWVkX2c0X3BpbmN0cmxfZHJpdmVyKTsKK30KKworYXJjaF9pbml0Y2FsbChhc3BlZWRfZzRfcGluY3RybF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvcGluY3RybC1hc3BlZWQtZzUuYyBiL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvcGluY3RybC1hc3BlZWQtZzUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWFiODY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL2FzcGVlZC9waW5jdHJsLWFzcGVlZC1nNS5jCkBAIC0wLDAgKzEsODA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IElCTSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5tdXguaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmNvbmYuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmNvbmYtZ2VuZXJpYy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICIuLi9jb3JlLmgiCisjaW5jbHVkZSAiLi4vcGluY3RybC11dGlscy5oIgorI2luY2x1ZGUgInBpbmN0cmwtYXNwZWVkLmgiCisKKyNkZWZpbmUgQVNQRUVEX0c1X05SX1BJTlMgMjI4CisKKyNkZWZpbmUgQ09ORDEJCVNJR19ERVNDX0JJVChTQ1U5MCwgNiwgMCkKKyNkZWZpbmUgQ09ORDIJCXsgU0NVOTQsIEdFTk1BU0soMSwgMCksIDAsIDAgfQorCisjZGVmaW5lIEIxNCAwCitTU1NGX1BJTl9ERUNMKEIxNCwgR1BJT0EwLCBNQUMxTElOSywgU0lHX0RFU0NfU0VUKFNDVTgwLCAwKSk7CisKKyNkZWZpbmUgRTEzIDMKK1NTU0ZfUElOX0RFQ0woRTEzLCBHUElPQTMsIFRJTUVSNCwgU0lHX0RFU0NfU0VUKFNDVTgwLCAzKSk7CisKKyNkZWZpbmUgSTJDOV9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMjIpCisKKyNkZWZpbmUgQzE0IDQKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMOSwgSTJDOSwgSTJDOV9ERVNDLCBDT05EMSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFRJTUVSNSwgVElNRVI1LCBTSUdfREVTQ19TRVQoU0NVODAsIDQpLCBDT05EMSk7CitNU19QSU5fREVDTChDMTQsIEdQSU9BNCwgU0NMOSwgVElNRVI1KTsKKworRlVOQ19HUk9VUF9ERUNMKFRJTUVSNSwgQzE0KTsKKworI2RlZmluZSBBMTMgNQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREE5LCBJMkM5LCBJMkM5X0RFU0MsIENPTkQxKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVElNRVI2LCBUSU1FUjYsIFNJR19ERVNDX1NFVChTQ1U4MCwgNSksIENPTkQxKTsKK01TX1BJTl9ERUNMKEExMywgR1BJT0E1LCBTREE5LCBUSU1FUjYpOworCitGVU5DX0dST1VQX0RFQ0woVElNRVI2LCBBMTMpOworCitGVU5DX0dST1VQX0RFQ0woSTJDOSwgQzE0LCBBMTMpOworCisjZGVmaW5lIE1ESU8yX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyKQorCisjZGVmaW5lIEMxMyA2CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE1EQzIsIE1ESU8yLCBNRElPMl9ERVNDLCBDT05EMSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFRJTUVSNywgVElNRVI3LCBTSUdfREVTQ19TRVQoU0NVODAsIDYpLCBDT05EMSk7CitNU19QSU5fREVDTChDMTMsIEdQSU9BNiwgTURDMiwgVElNRVI3KTsKKworRlVOQ19HUk9VUF9ERUNMKFRJTUVSNywgQzEzKTsKKworI2RlZmluZSBCMTMgNworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShNRElPMiwgTURJTzIsIE1ESU8yX0RFU0MsIENPTkQxKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVElNRVI4LCBUSU1FUjgsIFNJR19ERVNDX1NFVChTQ1U4MCwgNyksIENPTkQxKTsKK01TX1BJTl9ERUNMKEIxMywgR1BJT0E3LCBNRElPMiwgVElNRVI4KTsKKworRlVOQ19HUk9VUF9ERUNMKFRJTUVSOCwgQjEzKTsKKworRlVOQ19HUk9VUF9ERUNMKE1ESU8yLCBDMTMsIEIxMyk7CisKKyNkZWZpbmUgSDIwIDE1CitHUElPX1BJTl9ERUNMKEgyMCwgR1BJT0I3KTsKKworI2RlZmluZSBTRDFfREVTQwlTSUdfREVTQ19TRVQoU0NVOTAsIDApCisKKyNkZWZpbmUgQzEyIDE2CisjZGVmaW5lIEkyQzEwX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyMykKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QxQ0xLLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMMTAsIEkyQzEwLCBJMkMxMF9ERVNDKTsKK01TX1BJTl9ERUNMKEMxMiwgR1BJT0MwLCBTRDFDTEssIFNDTDEwKTsKKworI2RlZmluZSBBMTIgMTcKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QxQ01ELCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMTAsIEkyQzEwLCBJMkMxMF9ERVNDKTsKK01TX1BJTl9ERUNMKEExMiwgR1BJT0MxLCBTRDFDTUQsIFNEQTEwKTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzEwLCBDMTIsIEExMik7CisKKyNkZWZpbmUgQjEyIDE4CisjZGVmaW5lIEkyQzExX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyNCkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QxREFUMCwgU0QxLCBTRDFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDExLCBJMkMxMSwgSTJDMTFfREVTQyk7CitNU19QSU5fREVDTChCMTIsIEdQSU9DMiwgU0QxREFUMCwgU0NMMTEpOworCisjZGVmaW5lIEQ5ICAxOQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFEQVQxLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMTEsIEkyQzExLCBJMkMxMV9ERVNDKTsKK01TX1BJTl9ERUNMKEQ5LCBHUElPQzMsIFNEMURBVDEsIFNEQTExKTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzExLCBCMTIsIEQ5KTsKKworI2RlZmluZSBEMTAgMjAKKyNkZWZpbmUgSTJDMTJfREVTQwlTSUdfREVTQ19TRVQoU0NVOTAsIDI1KQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFEQVQyLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMMTIsIEkyQzEyLCBJMkMxMl9ERVNDKTsKK01TX1BJTl9ERUNMKEQxMCwgR1BJT0M0LCBTRDFEQVQyLCBTQ0wxMik7CisKKyNkZWZpbmUgRTEyIDIxCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMURBVDMsIFNEMSwgU0QxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREExMiwgSTJDMTIsIEkyQzEyX0RFU0MpOworTVNfUElOX0RFQ0woRTEyLCBHUElPQzUsIFNEMURBVDMsIFNEQTEyKTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzEyLCBEMTAsIEUxMik7CisKKyNkZWZpbmUgQzExIDIyCisjZGVmaW5lIEkyQzEzX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyNikKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QxQ0QsIFNEMSwgU0QxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0wxMywgSTJDMTMsIEkyQzEzX0RFU0MpOworTVNfUElOX0RFQ0woQzExLCBHUElPQzYsIFNEMUNELCBTQ0wxMyk7CisKKyNkZWZpbmUgQjExIDIzCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMVdQLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMTMsIEkyQzEzLCBJMkMxM19ERVNDKTsKK01TX1BJTl9ERUNMKEIxMSwgR1BJT0M3LCBTRDFXUCwgU0RBMTMpOworCitGVU5DX0dST1VQX0RFQ0woSTJDMTMsIEMxMSwgQjExKTsKK0ZVTkNfR1JPVVBfREVDTChTRDEsIEMxMiwgQTEyLCBCMTIsIEQ5LCBEMTAsIEUxMiwgQzExLCBCMTEpOworCisjZGVmaW5lIFNEMl9ERVNDICAgICAgICBTSUdfREVTQ19TRVQoU0NVOTAsIDEpCisjZGVmaW5lIEdQSUQwX0RFU0MgICAgICBTSUdfREVTQ19TRVQoU0NVOEMsIDgpCisjZGVmaW5lIEdQSURfREVTQyAgICAgICBTSUdfREVTQ19TRVQoSFdfU1RSQVAxLCAyMSkKKworI2RlZmluZSBGMTkgMjQKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QyQ0xLLCBTRDIsIFNEMl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRDBJTiwgR1BJRDAsIEdQSUQwX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElEMElOLCBHUElELCBHUElEX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRDBJTiwgR1BJRDAsIEdQSUQpOworTVNfUElOX0RFQ0woRjE5LCBHUElPRDAsIFNEMkNMSywgR1BJRDBJTik7CisKKyNkZWZpbmUgRTIxIDI1CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMkNNRCwgU0QyLCBTRDJfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUQwT1VULCBHUElEMCwgR1BJRDBfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUQwT1VULCBHUElELCBHUElEX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRDBPVVQsIEdQSUQwLCBHUElEKTsKK01TX1BJTl9ERUNMKEUyMSwgR1BJT0QxLCBTRDJDTUQsIEdQSUQwT1VUKTsKKworRlVOQ19HUk9VUF9ERUNMKEdQSUQwLCBGMTksIEUyMSk7CisKKyNkZWZpbmUgR1BJRDJfREVTQyAgICAgIFNJR19ERVNDX1NFVChTQ1U4QywgOSkKKworI2RlZmluZSBEMjAgMjYKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QyREFUMCwgU0QyLCBTRDJfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUQySU4sIEdQSUQyLCBHUElEMl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRDJJTiwgR1BJRCwgR1BJRF9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKEdQSUQySU4sIEdQSUQyLCBHUElEKTsKK01TX1BJTl9ERUNMKEQyMCwgR1BJT0QyLCBTRDJEQVQwLCBHUElEMklOKTsKKworI2RlZmluZSBEMjEgMjcKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QyREFUMSwgU0QyLCBTRDJfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUQyT1VULCBHUElEMiwgR1BJRDJfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUQyT1VULCBHUElELCBHUElEX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRDJPVVQsIEdQSUQyLCBHUElEKTsKK01TX1BJTl9ERUNMKEQyMSwgR1BJT0QzLCBTRDJEQVQxLCBHUElEMk9VVCk7CisKK0ZVTkNfR1JPVVBfREVDTChHUElEMiwgRDIwLCBEMjEpOworCisjZGVmaW5lIEdQSUVfREVTQwlTSUdfREVTQ19TRVQoSFdfU1RSQVAxLCAyMSkKKyNkZWZpbmUgR1BJRTBfREVTQwlTSUdfREVTQ19TRVQoU0NVOEMsIDEyKQorCisjZGVmaW5lIEIyMCAzMgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShOQ1RTMywgTkNUUzMsIFNJR19ERVNDX1NFVChTQ1U4MCwgMTYpKTsKK1NJR19FWFBSX0RFQ0woR1BJRTBJTiwgR1BJRTAsIEdQSUUwX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElFMElOLCBHUElFLCBHUElFX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRTBJTiwgR1BJRTAsIEdQSUUpOworTVNfUElOX0RFQ0woQjIwLCBHUElPRTAsIE5DVFMzLCBHUElFMElOKTsKKworI2RlZmluZSBDMjAgMzMKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkRDRDMsIE5EQ0QzLCBTSUdfREVTQ19TRVQoU0NVODAsIDE3KSk7CitTSUdfRVhQUl9ERUNMKEdQSUUwT1VULCBHUElFMCwgR1BJRTBfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUUwT1VULCBHUElFLCBHUElFX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRTBPVVQsIEdQSUUwLCBHUElFKTsKK01TX1BJTl9ERUNMKEMyMCwgR1BJRTAsIE5EQ0QzLCBHUElFME9VVCk7CisKK0ZVTkNfR1JPVVBfREVDTChHUElFMCwgQjIwLCBDMjApOworCisjZGVmaW5lIFNQSTFfREVTQwlTSUdfREVTQ19TRVQoSFdfU1RSQVAxLCAxMykKKyNkZWZpbmUgQzE4IDY0CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNZU0NTLCBTUEkxLCBDT05EMSwgU1BJMV9ERVNDKTsKK1NTX1BJTl9ERUNMKEMxOCwgR1BJT0kwLCBTWVNDUyk7CisKKyNkZWZpbmUgRTE1IDY1CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNZU0NLLCBTUEkxLCBDT05EMSwgU1BJMV9ERVNDKTsKK1NTX1BJTl9ERUNMKEUxNSwgR1BJT0kxLCBTWVNDSyk7CisKKyNkZWZpbmUgQTE0IDY2CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNZU01PU0ksIFNQSTEsIENPTkQxLCBTUEkxX0RFU0MpOworU1NfUElOX0RFQ0woQTE0LCBHUElPSTIsIFNZU01PU0kpOworCisjZGVmaW5lIEMxNiA2NworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTWVNNSVNPLCBTUEkxLCBDT05EMSwgU1BJMV9ERVNDKTsKK1NTX1BJTl9ERUNMKEMxNiwgR1BJT0kzLCBTWVNNSVNPKTsKKworRlVOQ19HUk9VUF9ERUNMKFNQSTEsIEMxOCwgRTE1LCBBMTQsIEMxNik7CisKKyNkZWZpbmUgTDIgNzMKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0dQTUxELCBTR1BNLCBTSUdfREVTQ19TRVQoU0NVODQsIDkpKTsKK1NTX1BJTl9ERUNMKEwyLCBHUElPSjEsIFNHUE1MRCk7CisKKyNkZWZpbmUgTjMgNzQKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0dQTU8sIFNHUE0sIFNJR19ERVNDX1NFVChTQ1U4NCwgMTApKTsKK1NTX1BJTl9ERUNMKE4zLCBHUElPSjIsIFNHUE1PKTsKKworI2RlZmluZSBONCA3NQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTR1BNSSwgU0dQTSwgU0lHX0RFU0NfU0VUKFNDVTg0LCAxMSkpOworU1NfUElOX0RFQ0woTjQsIEdQSU9KMywgU0dQTUkpOworCisjZGVmaW5lIEkyQzVfREVTQyAgICAgICBTSUdfREVTQ19TRVQoU0NVOTAsIDE4KQorCisjZGVmaW5lIEwzIDgwCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDUsIEkyQzUsIEkyQzVfREVTQyk7CitTU19QSU5fREVDTChMMywgR1BJT0swLCBTQ0w1KTsKKworI2RlZmluZSBMNCA4MQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREE1LCBJMkM1LCBJMkM1X0RFU0MpOworU1NfUElOX0RFQ0woTDQsIEdQSU9LMSwgU0RBNSk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkM1LCBMMywgTDQpOworCisjZGVmaW5lIEkyQzZfREVTQyAgICAgICBTSUdfREVTQ19TRVQoU0NVOTAsIDE5KQorCisjZGVmaW5lIEwxIDgyCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDYsIEkyQzYsIEkyQzZfREVTQyk7CitTU19QSU5fREVDTChMMSwgR1BJT0syLCBTQ0w2KTsKKworI2RlZmluZSBOMiA4MworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREE2LCBJMkM2LCBJMkM2X0RFU0MpOworU1NfUElOX0RFQ0woTjIsIEdQSU9LMywgU0RBNik7CisKK0ZVTkNfR1JPVVBfREVDTChJMkM2LCBMMSwgTjIpOworCisjZGVmaW5lIEkyQzdfREVTQyAgICAgICBTSUdfREVTQ19TRVQoU0NVOTAsIDIwKQorCisjZGVmaW5lIE4xIDg0CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDcsIEkyQzcsIEkyQzdfREVTQyk7CitTU19QSU5fREVDTChOMSwgR1BJT0s0LCBTQ0w3KTsKKworI2RlZmluZSBQMSA4NQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREE3LCBJMkM3LCBJMkM3X0RFU0MpOworU1NfUElOX0RFQ0woUDEsIEdQSU9LNSwgU0RBNyk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkM3LCBOMSwgUDEpOworCisjZGVmaW5lIEkyQzhfREVTQyAgICAgICBTSUdfREVTQ19TRVQoU0NVOTAsIDIxKQorCisjZGVmaW5lIFAyIDg2CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDgsIEkyQzgsIEkyQzhfREVTQyk7CitTU19QSU5fREVDTChQMiwgR1BJT0s2LCBTQ0w4KTsKKworI2RlZmluZSBSMSA4NworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREE4LCBJMkM4LCBJMkM4X0RFU0MpOworU1NfUElOX0RFQ0woUjEsIEdQSU9LNywgU0RBOCk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkM4LCBQMiwgUjEpOworCisjZGVmaW5lIFZQSU9GRjBfREVTQyAgICB7IFNDVTkwLCBHRU5NQVNLKDUsIDQpLCAwLCAwIH0KKyNkZWZpbmUgVlBJT0ZGMV9ERVNDICAgIHsgU0NVOTAsIEdFTk1BU0soNSwgNCksIDEsIDAgfQorI2RlZmluZSBWUEkyNF9ERVNDICAgICAgeyBTQ1U5MCwgR0VOTUFTSyg1LCA0KSwgMiwgMCB9CisjZGVmaW5lIFZQSVJTVkRfREVTQyAgICB7IFNDVTkwLCBHRU5NQVNLKDUsIDQpLCAzLCAwIH0KKworI2RlZmluZSBWMiAxMDQKKyNkZWZpbmUgVjJfREVTQyAgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4OCwgMCkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoREFTSE4wLCBEQVNITjAsIFZQSVJTVkRfREVTQywgVjJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFBXTTAsIFBXTTAsIFYyX0RFU0MsIENPTkQyKTsKK01TX1BJTl9ERUNMKFYyLCBHUElPTjAsIERBU0hOMCwgUFdNMCk7CitGVU5DX0dST1VQX0RFQ0woUFdNMCwgVjIpOworCisjZGVmaW5lIFcyIDEwNQorI2RlZmluZSBXMl9ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg4LCAxKQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShEQVNITjEsIERBU0hOMSwgVlBJUlNWRF9ERVNDLCBXMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUFdNMSwgUFdNMSwgVzJfREVTQywgQ09ORDIpOworTVNfUElOX0RFQ0woVzIsIEdQSU9OMSwgREFTSE4xLCBQV00xKTsKK0ZVTkNfR1JPVVBfREVDTChQV00xLCBXMik7CisKKyNkZWZpbmUgVjMgMTA2CisjZGVmaW5lIFYzX0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODgsIDIpCitTSUdfRVhQUl9ERUNMKFZQSUcyLCBWUEkyNCwgVlBJMjRfREVTQywgVjNfREVTQywgQ09ORDIpOworU0lHX0VYUFJfREVDTChWUElHMiwgVlBJUlNWRCwgVlBJUlNWRF9ERVNDLCBWM19ERVNDLCBDT05EMik7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChWUElHMiwgVlBJMjQsIFZQSVJTVkQpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV00yLCBQV00yLCBWM19ERVNDLCBDT05EMik7CitNU19QSU5fREVDTChWMywgR1BJT04yLCBWUElHMiwgUFdNMik7CitGVU5DX0dST1VQX0RFQ0woUFdNMiwgVjMpOworCisjZGVmaW5lIFUzIDEwNworI2RlZmluZSBVM19ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg4LCAzKQorU0lHX0VYUFJfREVDTChWUElHMywgVlBJMjQsIFZQSTI0X0RFU0MsIFUzX0RFU0MsIENPTkQyKTsKK1NJR19FWFBSX0RFQ0woVlBJRzMsIFZQSVJTVkQsIFZQSVJTVkRfREVTQywgVTNfREVTQywgQ09ORDIpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoVlBJRzMsIFZQSTI0LCBWUElSU1ZEKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUFdNMywgUFdNMywgVTNfREVTQywgQ09ORDIpOworTVNfUElOX0RFQ0woVTMsIEdQSU9OMywgVlBJRzMsIFBXTTMpOworRlVOQ19HUk9VUF9ERUNMKFBXTTMsIFUzKTsKKworI2RlZmluZSBXMyAxMDgKKyNkZWZpbmUgVzNfREVTQyAgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4OCwgNCkKK1NJR19FWFBSX0RFQ0woVlBJRzQsIFZQSTI0LCBWUEkyNF9ERVNDLCBXM19ERVNDLCBDT05EMik7CitTSUdfRVhQUl9ERUNMKFZQSUc0LCBWUElSU1ZELCBWUElSU1ZEX0RFU0MsIFczX0RFU0MsIENPTkQyKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFZQSUc0LCBWUEkyNCwgVlBJUlNWRCk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFBXTTQsIFBXTTQsIFczX0RFU0MsIENPTkQyKTsKK01TX1BJTl9ERUNMKFczLCBHUElPTjQsIFZQSUc0LCBQV000KTsKK0ZVTkNfR1JPVVBfREVDTChQV000LCBXMyk7CisKKyNkZWZpbmUgQUEzIDEwOQorI2RlZmluZSBBQTNfREVTQyAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg4LCA1KQorU0lHX0VYUFJfREVDTChWUElHNSwgVlBJMjQsIFZQSTI0X0RFU0MsIEFBM19ERVNDLCBDT05EMik7CitTSUdfRVhQUl9ERUNMKFZQSUc1LCBWUElSU1ZELCBWUElSU1ZEX0RFU0MsIEFBM19ERVNDLCBDT05EMik7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChWUElHNSwgVlBJMjQsIFZQSVJTVkQpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV001LCBQV001LCBBQTNfREVTQywgQ09ORDIpOworTVNfUElOX0RFQ0woQUEzLCBHUElPTjUsIFZQSUc1LCBQV001KTsKK0ZVTkNfR1JPVVBfREVDTChQV001LCBBQTMpOworCisjZGVmaW5lIFkzIDExMAorI2RlZmluZSBZM19ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg4LCA2KQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShWUElHNiwgVlBJMjQsIFZQSTI0X0RFU0MsIFkzX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV002LCBQV002LCBZM19ERVNDLCBDT05EMik7CitNU19QSU5fREVDTChZMywgR1BJT042LCBWUElHNiwgUFdNNik7CitGVU5DX0dST1VQX0RFQ0woUFdNNiwgWTMpOworCisjZGVmaW5lIFQ0IDExMQorI2RlZmluZSBUNF9ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg4LCA3KQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShWUElHNywgVlBJMjQsIFZQSTI0X0RFU0MsIFQ0X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV003LCBQV003LCBUNF9ERVNDLCBDT05EMik7CitNU19QSU5fREVDTChUNCwgR1BJT043LCBWUElHNywgUFdNNyk7CitGVU5DX0dST1VQX0RFQ0woUFdNNywgVDQpOworCisjZGVmaW5lIFY2IDEyNworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShEQVNIVjYsIERBU0hWNiwgU0lHX0RFU0NfU0VUKFNDVTkwLCAyOCksCisJCVNJR19ERVNDX1NFVChTQ1U4OCwgMjMpKTsKK1NTX1BJTl9ERUNMKFY2LCBHUElPUDcsIERBU0hWNik7CisKKyNkZWZpbmUgSTJDM19ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMTYpCisKKyNkZWZpbmUgQTExIDEyOAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0wzLCBJMkMzLCBJMkMzX0RFU0MpOworU1NfUElOX0RFQ0woQTExLCBHUElPUTAsIFNDTDMpOworCisjZGVmaW5lIEExMCAxMjkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMywgSTJDMywgSTJDM19ERVNDKTsKK1NTX1BJTl9ERUNMKEExMCwgR1BJT1ExLCBTREEzKTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzMsIEExMSwgQTEwKTsKKworI2RlZmluZSBJMkM0X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAxNykKKworI2RlZmluZSBBOSAxMzAKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMNCwgSTJDNCwgSTJDNF9ERVNDKTsKK1NTX1BJTl9ERUNMKEE5LCBHUElPUTIsIFNDTDQpOworCisjZGVmaW5lIEI5IDEzMQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREE0LCBJMkM0LCBJMkM0X0RFU0MpOworU1NfUElOX0RFQ0woQjksIEdQSU9RMywgU0RBNCk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkM0LCBBOSwgQjkpOworCisjZGVmaW5lIEkyQzE0X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyNykKKworI2RlZmluZSBOMjEgMTMyCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDE0LCBJMkMxNCwgSTJDMTRfREVTQyk7CitTU19QSU5fREVDTChOMjEsIEdQSU9RNCwgU0NMMTQpOworCisjZGVmaW5lIE4yMiAxMzMKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMTQsIEkyQzE0LCBJMkMxNF9ERVNDKTsKK1NTX1BJTl9ERUNMKE4yMiwgR1BJT1E1LCBTREExNCk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkMxNCwgTjIxLCBOMjIpOworCisjZGVmaW5lIEIxMCAxMzQKK1NTU0ZfUElOX0RFQ0woQjEwLCBHUElPUTYsIE9TQ0NMSywgU0lHX0RFU0NfU0VUKFNDVTJDLCAxKSk7CisKKyNkZWZpbmUgTjIwIDEzNQorU1NTRl9QSU5fREVDTChOMjAsIEdQSU9RNywgUEVXQUtFLCBTSUdfREVTQ19TRVQoU0NVMkMsIDI5KSk7CisKKyNkZWZpbmUgRDggMTQyCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE1EQzEsIE1ESU8xLCBTSUdfREVTQ19TRVQoU0NVODgsIDMwKSk7CitTU19QSU5fREVDTChEOCwgR1BJT1I2LCBNREMxKTsKKworI2RlZmluZSBFMTAgMTQzCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE1ESU8xLCBNRElPMSwgU0lHX0RFU0NfU0VUKFNDVTg4LCAzMSkpOworU1NfUElOX0RFQ0woRTEwLCBHUElPUjcsIE1ESU8xKTsKKworRlVOQ19HUk9VUF9ERUNMKE1ESU8xLCBEOCwgRTEwKTsKKworLyogUkdNSUkxL1JNSUkxICovCisKKyNkZWZpbmUgUk1JSTFfREVTQyAgICAgIFNJR19ERVNDX0JJVChIV19TVFJBUDEsIDYsIDApCisjZGVmaW5lIFJNSUkyX0RFU0MgICAgICBTSUdfREVTQ19CSVQoSFdfU1RSQVAxLCA3LCAwKQorCisjZGVmaW5lIEI1IDE1MgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVDAsIEdQSU9UMCwgU0lHX0RFU0NfU0VUKFNDVUEwLCAwKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxUkNMS08sIFJNSUkxLCBSTUlJMV9ERVNDLAorCQlTSUdfREVTQ19TRVQoU0NVNDgsIDI5KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVRYQ0ssIFJHTUlJMSk7CitNU19QSU5fREVDTF8oQjUsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UMCksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxUkNMS08pLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWENLKSk7CisKKyNkZWZpbmUgRTkgMTUzCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9UMSwgR1BJT1QxLCBTSUdfREVTQ19TRVQoU0NVQTAsIDEpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFUWEVOLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVRYQ1RMLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEU5LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDEpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVRYRU4pLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWENUTCkpOworCisjZGVmaW5lIEY5IDE1NAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVDIsIEdQSU9UMiwgU0lHX0RFU0NfU0VUKFNDVUEwLCAyKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxVFhEMCwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFUWEQwLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEY5LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDIpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVRYRDApLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWEQwKSk7CisKKyNkZWZpbmUgQTUgMTU1CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9UMywgR1BJT1QzLCBTSUdfREVTQ19TRVQoU0NVQTAsIDMpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFUWEQxLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVRYRDEsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oQTUsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UMyksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxVFhEMSksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVRYRDEpKTsKKworI2RlZmluZSBFNyAxNTYKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1Q0LCBHUElPVDQsIFNJR19ERVNDX1NFVChTQ1VBMCwgNCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMURBU0gwLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVRYRDIsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oRTcsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UNCksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxREFTSDApLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWEQyKSk7CisKKyNkZWZpbmUgRDcgMTU3CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9UNSwgR1BJT1Q1LCBTSUdfREVTQ19TRVQoU0NVQTAsIDUpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFEQVNIMSwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFUWEQzLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEQ3LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDUpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMURBU0gxKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxVFhEMykpOworCisjZGVmaW5lIEIyIDE1OAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVDYsIEdQSU9UNiwgU0lHX0RFU0NfU0VUKFNDVUEwLCA2KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkyUkNMS08sIFJNSUkyLCBSTUlJMl9ERVNDLAorCQlTSUdfREVTQ19TRVQoU0NVNDgsIDMwKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMlRYQ0ssIFJHTUlJMik7CitNU19QSU5fREVDTF8oQjIsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UNiksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkyUkNMS08pLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTJUWENLKSk7CisKKyNkZWZpbmUgQjEgMTU5CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9UNywgR1BJT1Q3LCBTSUdfREVTQ19TRVQoU0NVQTAsIDcpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTJUWEVOLCBSTUlJMiwgUk1JSTJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMlRYQ1RMLCBSR01JSTIpOworTVNfUElOX0RFQ0xfKEIxLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDcpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMlRYRU4pLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTJUWENUTCkpOworCisjZGVmaW5lIEEyIDE2MAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVTAsIEdQSU9VMCwgU0lHX0RFU0NfU0VUKFNDVUEwLCA4KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkyVFhEMCwgUk1JSTIsIFJNSUkyX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTJUWEQwLCBSR01JSTIpOworTVNfUElOX0RFQ0xfKEEyLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVTApLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMlRYRDApLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTJUWEQwKSk7CisKKyNkZWZpbmUgQjMgMTYxCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9VMSwgR1BJT1UxLCBTSUdfREVTQ19TRVQoU0NVQTAsIDkpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTJUWEQxLCBSTUlJMiwgUk1JSTJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMlRYRDEsIFJHTUlJMik7CitNU19QSU5fREVDTF8oQjMsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9VMSksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkyVFhEMSksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMlRYRDEpKTsKKworI2RlZmluZSBENSAxNjIKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1UyLCBHUElPVTIsIFNJR19ERVNDX1NFVChTQ1VBMCwgMTApKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTJEQVNIMCwgUk1JSTIsIFJNSUkyX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTJUWEQyLCBSR01JSTIpOworTVNfUElOX0RFQ0xfKEQ1LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVTIpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMkRBU0gwKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkyVFhEMikpOworCisjZGVmaW5lIEQ0IDE2MworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVTMsIEdQSU9VMywgU0lHX0RFU0NfU0VUKFNDVUEwLCAxMSkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMkRBU0gxLCBSTUlJMiwgUk1JSTJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMlRYRDMsIFJHTUlJMik7CitNU19QSU5fREVDTF8oRDQsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9VMyksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkyREFTSDEpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTJUWEQzKSk7CisKKyNkZWZpbmUgQjQgMTY0CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9VNCwgR1BJT1U0LCBTSUdfREVTQ19TRVQoU0NVQTAsIDEyKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxUkNMS0ksIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxUlhDSywgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhCNCwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1U0KSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTFSQ0xLSSksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVJYQ0spKTsKKworI2RlZmluZSBBNCAxNjUKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1U1LCBHUElPVTUsIFNJR19ERVNDX1NFVChTQ1VBMCwgMTMpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFEQVNIMiwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFSWENUTCwgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhBNCwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1U1KSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTFEQVNIMiksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVJYQ1RMKSk7CisKKyNkZWZpbmUgQTMgMTY2CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9VNiwgR1BJT1U2LCBTSUdfREVTQ19TRVQoU0NVQTAsIDE0KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxUlhEMCwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFSWEQwLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEEzLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVTYpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVJYRDApLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFSWEQwKSk7CisKKyNkZWZpbmUgRDYgMTY3CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9VNywgR1BJT1U3LCBTSUdfREVTQ19TRVQoU0NVQTAsIDE1KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxUlhEMSwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFSWEQxLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEQ2LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVTcpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVJYRDEpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFSWEQxKSk7CisKKyNkZWZpbmUgQzUgMTY4CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9WMCwgR1BJT1YwLCBTSUdfREVTQ19TRVQoU0NVQTAsIDE2KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxQ1JTRFYsIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxUlhEMiwgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhDNSwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1YwKSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTFDUlNEViksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVJYRDIpKTsKKworI2RlZmluZSBDNCAxNjkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1YxLCBHUElPVjEsIFNJR19ERVNDX1NFVChTQ1VBMCwgMTcpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFSWEVSLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVJYRDMsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oQzQsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9WMSksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxUlhFUiksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVJYRDMpKTsKKworRlVOQ19HUk9VUF9ERUNMKFJHTUlJMSwgQjQsIEE0LCBBMywgRDYsIEM1LCBDNCwgQjUsIEU5LCBGOSwgQTUsIEU3LCBENyk7CitGVU5DX0dST1VQX0RFQ0woUk1JSTEsIEI0LCBBMywgRDYsIEM1LCBDNCwgQjUsIEU5LCBGOSwgQTUpOworCisjZGVmaW5lIEMyIDE3MAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVjIsIEdQSU9WMiwgU0lHX0RFU0NfU0VUKFNDVUEwLCAxOCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMlJDTEtJLCBSTUlJMiwgUk1JSTJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMlJYQ0ssIFJHTUlJMik7CitNU19QSU5fREVDTF8oQzIsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9WMiksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkyUkNMS0kpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTJSWENLKSk7CisKKyNkZWZpbmUgQzEgMTcxCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9WMywgR1BJT1YzLCBTSUdfREVTQ19TRVQoU0NVQTAsIDE5KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkyREFTSDIsIFJNSUkyLCBSTUlJMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkyUlhDVEwsIFJHTUlJMik7CitNU19QSU5fREVDTF8oQzEsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9WMyksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkyREFTSDIpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTJSWENUTCkpOworCisjZGVmaW5lIEMzIDE3MgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVjQsIEdQSU9WNCwgU0lHX0RFU0NfU0VUKFNDVUEwLCAyMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMlJYRDAsIFJNSUkyLCBSTUlJMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkyUlhEMCwgUkdNSUkyKTsKK01TX1BJTl9ERUNMXyhDMywgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1Y0KSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTJSWEQwKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkyUlhEMCkpOworCisjZGVmaW5lIEQxIDE3MworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVjUsIEdQSU9WNSwgU0lHX0RFU0NfU0VUKFNDVUEwLCAyMSkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMlJYRDEsIFJNSUkyLCBSTUlJMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkyUlhEMSwgUkdNSUkyKTsKK01TX1BJTl9ERUNMXyhEMSwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1Y1KSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTJSWEQxKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkyUlhEMSkpOworCisjZGVmaW5lIEQyIDE3NAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVjYsIEdQSU9WNiwgU0lHX0RFU0NfU0VUKFNDVUEwLCAyMikpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMkNSU0RWLCBSTUlJMiwgUk1JSTJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMlJYRDIsIFJHTUlJMik7CitNU19QSU5fREVDTF8oRDIsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9WNiksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkyQ1JTRFYpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTJSWEQyKSk7CisKKyNkZWZpbmUgRTYgMTc1CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9WNywgR1BJT1Y3LCBTSUdfREVTQ19TRVQoU0NVQTAsIDIzKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkyUlhFUiwgUk1JSTIsIFJNSUkyX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTJSWEQzLCBSR01JSTIpOworTVNfUElOX0RFQ0xfKEU2LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVjcpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMlJYRVIpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTJSWEQzKSk7CisKK0ZVTkNfR1JPVVBfREVDTChSR01JSTIsIEIyLCBCMSwgQTIsIEIzLCBENSwgRDQsIEMyLCBDMSwgQzMsIEQxLCBEMiwgRTYpOworRlVOQ19HUk9VUF9ERUNMKFJNSUkyLCBCMiwgQjEsIEEyLCBCMywgQzIsIEMzLCBEMSwgRDIsIEU2KTsKKworLyogUGlucywgZ3JvdXBzIGFuZCBmdW5jdGlvbnMgYXJlIHNvcnQoMSk6ZWQgYWxwaGFiZXRpY2FsbHkgZm9yIHNhbml0eSAqLworCitzdGF0aWMgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgYXNwZWVkX2c1X3BpbnNbQVNQRUVEX0c1X05SX1BJTlNdID0geworCUFTUEVFRF9QSU5DVFJMX1BJTihBMTApLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBMTEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBMTIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBMTMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBMTQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEEzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQTQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEE5KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQUEzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCMTApLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCMTEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCMTIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCMTMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCMTQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEIyMCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEIzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEI5KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMTEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMTIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMTMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMTQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMTYpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMTgpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEMyMCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEMzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEQxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDEwKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMjApLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMjEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihENCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEQ1KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDYpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihENyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEQ4KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDkpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihFMTApLAorCUFTUEVFRF9QSU5DVFJMX1BJTihFMTIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihFMTMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihFMTUpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihFMjEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihFNiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEU3KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTkpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihGMTkpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihGOSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEgyMCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEwxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oTDIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihMMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEw0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oTjEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihOMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKE4yMCksCisJQVNQRUVEX1BJTkNUUkxfUElOKE4yMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKE4yMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKE4zKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oTjQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihQMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFAyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oUjEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihUNCksCisJQVNQRUVEX1BJTkNUUkxfUElOKFUzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVjIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihWMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKFY2KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVzIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihXMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKFkzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXNwZWVkX3Bpbl9ncm91cCBhc3BlZWRfZzVfZ3JvdXBzW10gPSB7CisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoR1BJRDApLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEdQSUQyKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChHUElFMCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDMTApLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEkyQzExKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkMxMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDMTMpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEkyQzE0KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkMzKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkM0KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkM1KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkM2KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkM3KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkM4KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkM5KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChNQUMxTElOSyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTURJTzEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE1ESU8yKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChPU0NDTEspLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBFV0FLRSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNMCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNNCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNNSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNNiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNNyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUkdNSUkxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChSR01JSTIpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFJNSUkxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChSTUlJMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoU0QxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChTUEkxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChUSU1FUjQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFRJTUVSNSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVElNRVI2KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChUSU1FUjcpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFRJTUVSOCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFzcGVlZF9waW5fZnVuY3Rpb24gYXNwZWVkX2c1X2Z1bmN0aW9uc1tdID0geworCUFTUEVFRF9QSU5DVFJMX0ZVTkMoR1BJRDApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoR1BJRDIpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoR1BJRTApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTIpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTMpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTQpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhJMkM0KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzUpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDNiksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhJMkM3KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzgpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDOSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhNQUMxTElOSyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhNRElPMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhNRElPMiksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhPU0NDTEspLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUEVXQUtFKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUFdNMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhQV00yKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTMpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUFdNNCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhQV001KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTYpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUFdNNyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhSR01JSTEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUkdNSUkyKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFJNSUkxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFJNSUkyKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFNEMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhTUEkxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFRJTUVSNCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhUSU1FUjUpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVElNRVI2KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFRJTUVSNyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhUSU1FUjgpLAorfTsKKworc3RhdGljIHN0cnVjdCBhc3BlZWRfcGluY3RybF9kYXRhIGFzcGVlZF9nNV9waW5jdHJsX2RhdGEgPSB7CisJLnBpbnMgPSBhc3BlZWRfZzVfcGlucywKKwkubnBpbnMgPSBBUlJBWV9TSVpFKGFzcGVlZF9nNV9waW5zKSwKKwkuZ3JvdXBzID0gYXNwZWVkX2c1X2dyb3VwcywKKwkubmdyb3VwcyA9IEFSUkFZX1NJWkUoYXNwZWVkX2c1X2dyb3VwcyksCisJLmZ1bmN0aW9ucyA9IGFzcGVlZF9nNV9mdW5jdGlvbnMsCisJLm5mdW5jdGlvbnMgPSBBUlJBWV9TSVpFKGFzcGVlZF9nNV9mdW5jdGlvbnMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwaW5tdXhfb3BzIGFzcGVlZF9nNV9waW5tdXhfb3BzID0geworCS5nZXRfZnVuY3Rpb25zX2NvdW50ID0gYXNwZWVkX3Bpbm11eF9nZXRfZm5fY291bnQsCisJLmdldF9mdW5jdGlvbl9uYW1lID0gYXNwZWVkX3Bpbm11eF9nZXRfZm5fbmFtZSwKKwkuZ2V0X2Z1bmN0aW9uX2dyb3VwcyA9IGFzcGVlZF9waW5tdXhfZ2V0X2ZuX2dyb3VwcywKKwkuc2V0X211eCA9IGFzcGVlZF9waW5tdXhfc2V0X211eCwKKwkuZ3Bpb19yZXF1ZXN0X2VuYWJsZSA9IGFzcGVlZF9ncGlvX3JlcXVlc3RfZW5hYmxlLAorCS5zdHJpY3QgPSB0cnVlLAorfTsKKworc3RhdGljIHN0cnVjdCBwaW5jdHJsX29wcyBhc3BlZWRfZzVfcGluY3RybF9vcHMgPSB7CisJLmdldF9ncm91cHNfY291bnQgPSBhc3BlZWRfcGluY3RybF9nZXRfZ3JvdXBzX2NvdW50LAorCS5nZXRfZ3JvdXBfbmFtZSA9IGFzcGVlZF9waW5jdHJsX2dldF9ncm91cF9uYW1lLAorCS5nZXRfZ3JvdXBfcGlucyA9IGFzcGVlZF9waW5jdHJsX2dldF9ncm91cF9waW5zLAorCS5waW5fZGJnX3Nob3cgPSBhc3BlZWRfcGluY3RybF9waW5fZGJnX3Nob3csCisJLmR0X25vZGVfdG9fbWFwID0gcGluY29uZl9nZW5lcmljX2R0X25vZGVfdG9fbWFwX3BpbiwKKwkuZHRfZnJlZV9tYXAgPSBwaW5jdHJsX3V0aWxzX2ZyZWVfbWFwLAorfTsKKworc3RhdGljIHN0cnVjdCBwaW5jdHJsX2Rlc2MgYXNwZWVkX2c1X3BpbmN0cmxfZGVzYyA9IHsKKwkubmFtZSA9ICJhc3BlZWQtZzUtcGluY3RybCIsCisJLnBpbnMgPSBhc3BlZWRfZzVfcGlucywKKwkubnBpbnMgPSBBUlJBWV9TSVpFKGFzcGVlZF9nNV9waW5zKSwKKwkucGN0bG9wcyA9ICZhc3BlZWRfZzVfcGluY3RybF9vcHMsCisJLnBteG9wcyA9ICZhc3BlZWRfZzVfcGlubXV4X29wcywKK307CisKK3N0YXRpYyBpbnQgYXNwZWVkX2c1X3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFzcGVlZF9nNV9waW5zKTsgaSsrKQorCQlhc3BlZWRfZzVfcGluc1tpXS5udW1iZXIgPSBpOworCisJcmV0dXJuIGFzcGVlZF9waW5jdHJsX3Byb2JlKHBkZXYsICZhc3BlZWRfZzVfcGluY3RybF9kZXNjLAorCQkJJmFzcGVlZF9nNV9waW5jdHJsX2RhdGEpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhc3BlZWRfZzVfcGluY3RybF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYXNwZWVkLGFzdDI1MDAtcGluY3RybCIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhc3BlZWQsZzUtcGluY3RybCIsIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXNwZWVkX2c1X3BpbmN0cmxfZHJpdmVyID0geworCS5wcm9iZSA9IGFzcGVlZF9nNV9waW5jdHJsX3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFzcGVlZC1nNS1waW5jdHJsIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gYXNwZWVkX2c1X3BpbmN0cmxfb2ZfbWF0Y2gsCisJfSwKK307CisKK3N0YXRpYyBpbnQgYXNwZWVkX2c1X3BpbmN0cmxfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFzcGVlZF9nNV9waW5jdHJsX2RyaXZlcik7Cit9CisKK2FyY2hfaW5pdGNhbGwoYXNwZWVkX2c1X3BpbmN0cmxfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL3BpbmN0cmwtYXNwZWVkLmMgYi9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL3BpbmN0cmwtYXNwZWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5MWY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvcGluY3RybC1hc3BlZWQuYwpAQCAtMCwwICsxLDQ5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgIi4uL2NvcmUuaCIKKyNpbmNsdWRlICJwaW5jdHJsLWFzcGVlZC5oIgorCitpbnQgYXNwZWVkX3BpbmN0cmxfZ2V0X2dyb3Vwc19jb3VudChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYpCit7CisJc3RydWN0IGFzcGVlZF9waW5jdHJsX2RhdGEgKnBkYXRhID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisKKwlyZXR1cm4gcGRhdGEtPm5ncm91cHM7Cit9CisKK2NvbnN0IGNoYXIgKmFzcGVlZF9waW5jdHJsX2dldF9ncm91cF9uYW1lKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJdW5zaWduZWQgaW50IGdyb3VwKQoreworCXN0cnVjdCBhc3BlZWRfcGluY3RybF9kYXRhICpwZGF0YSA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCisJcmV0dXJuIHBkYXRhLT5ncm91cHNbZ3JvdXBdLm5hbWU7Cit9CisKK2ludCBhc3BlZWRfcGluY3RybF9nZXRfZ3JvdXBfcGlucyhzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJICB1bnNpZ25lZCBpbnQgZ3JvdXAsIGNvbnN0IHVuc2lnbmVkIGludCAqKnBpbnMsCisJCQkJICB1bnNpZ25lZCBpbnQgKm5waW5zKQoreworCXN0cnVjdCBhc3BlZWRfcGluY3RybF9kYXRhICpwZGF0YSA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCisJKnBpbnMgPSAmcGRhdGEtPmdyb3Vwc1tncm91cF0ucGluc1swXTsKKwkqbnBpbnMgPSBwZGF0YS0+Z3JvdXBzW2dyb3VwXS5ucGluczsKKworCXJldHVybiAwOworfQorCit2b2lkIGFzcGVlZF9waW5jdHJsX3Bpbl9kYmdfc2hvdyhzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJIHN0cnVjdCBzZXFfZmlsZSAqcywgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzZXFfcHJpbnRmKHMsICIgJXMiLCBkZXZfbmFtZShwY3RsZGV2LT5kZXYpKTsKK30KKworaW50IGFzcGVlZF9waW5tdXhfZ2V0X2ZuX2NvdW50KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldikKK3sKKwlzdHJ1Y3QgYXNwZWVkX3BpbmN0cmxfZGF0YSAqcGRhdGEgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCXJldHVybiBwZGF0YS0+bmZ1bmN0aW9uczsKK30KKworY29uc3QgY2hhciAqYXNwZWVkX3Bpbm11eF9nZXRfZm5fbmFtZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uKQoreworCXN0cnVjdCBhc3BlZWRfcGluY3RybF9kYXRhICpwZGF0YSA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCisJcmV0dXJuIHBkYXRhLT5mdW5jdGlvbnNbZnVuY3Rpb25dLm5hbWU7Cit9CisKK2ludCBhc3BlZWRfcGlubXV4X2dldF9mbl9ncm91cHMoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQkJCXVuc2lnbmVkIGludCBmdW5jdGlvbiwKKwkJCQljb25zdCBjaGFyICogY29uc3QgKipncm91cHMsCisJCQkJdW5zaWduZWQgaW50ICogY29uc3QgbnVtX2dyb3VwcykKK3sKKwlzdHJ1Y3QgYXNwZWVkX3BpbmN0cmxfZGF0YSAqcGRhdGEgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCSpncm91cHMgPSBwZGF0YS0+ZnVuY3Rpb25zW2Z1bmN0aW9uXS5ncm91cHM7CisJKm51bV9ncm91cHMgPSBwZGF0YS0+ZnVuY3Rpb25zW2Z1bmN0aW9uXS5uZ3JvdXBzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhc3BlZWRfc2lnX2Rlc2NfcHJpbnRfdmFsKAorCQljb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19kZXNjICpkZXNjLCBib29sIGVuYWJsZSwgdTMyIHJ2KQoreworCXByX2RlYnVnKCJTQ1UleFsweCUwOHhdPTB4JXgsIGdvdCAweCV4IGZyb20gMHglMDh4XG4iLCBkZXNjLT5yZWcsCisJCQlkZXNjLT5tYXNrLCBlbmFibGUgPyBkZXNjLT5lbmFibGUgOiBkZXNjLT5kaXNhYmxlLAorCQkJKHJ2ICYgZGVzYy0+bWFzaykgPj4gX19mZnMoZGVzYy0+bWFzayksIHJ2KTsKK30KKworLyoqCisgKiBRdWVyeSB0aGUgZW5hYmxlZCBvciBkaXNhYmxlZCBzdGF0ZSBvZiBhIHNpZ25hbCBkZXNjcmlwdG9yCisgKgorICogQGRlc2M6IFRoZSBzaWduYWwgZGVzY3JpcHRvciBvZiBpbnRlcmVzdAorICogQGVuYWJsZWQ6IFRydWUgdG8gcXVlcnkgdGhlIGVuYWJsZWQgc3RhdGUsIGZhbHNlIHRvIHF1ZXJ5IGRpc2FibGVkIHN0YXRlCisgKiBAcmVnbWFwOiBUaGUgU0NVIHJlZ21hcCBpbnN0YW5jZQorICoKKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZGVzY3JpcHRvcidzIGJpdGZpZWxkIGlzIGNvbmZpZ3VyZWQgdG8gdGhlIHN0YXRlCisgKiBzZWxlY3RlZCBieSBAZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgKgorICogRXZhbHVhdGlvbiBvZiBkZXNjcmlwdG9yIHN0YXRlIGlzIG5vbi10cml2aWFsIGluIHRoYXQgaXQgaXMgbm90IGEgYmluYXJ5CisgKiBvdXRjb21lOiBUaGUgYml0ZmllbGRzIGNhbiBiZSBncmVhdGVyIHRoYW4gb25lIGJpdCBpbiBzaXplIGFuZCB0aHVzIGNhbiB0YWtlCisgKiBhIHZhbHVlIHRoYXQgaXMgbmVpdGhlciB0aGUgZW5hYmxlZCBub3IgZGlzYWJsZWQgc3RhdGUgcmVjb3JkZWQgaW4gdGhlCisgKiBkZXNjcmlwdG9yICh0eXBpY2FsbHkgdGhpcyBtZWFucyBhIGRpZmZlcmVudCBmdW5jdGlvbiB0byB0aGUgb25lIG9mIGludGVyZXN0CisgKiBpcyBlbmFibGVkKS4gVGh1cyB3ZSBtdXN0IGV4cGxpY2l0bHkgdGVzdCBmb3IgZWl0aGVyIGNvbmRpdGlvbiBhcyByZXF1aXJlZC4KKyAqLworc3RhdGljIGJvb2wgYXNwZWVkX3NpZ19kZXNjX2V2YWwoY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZGVzYyAqZGVzYywKKwkJCQkgYm9vbCBlbmFibGVkLCBzdHJ1Y3QgcmVnbWFwICptYXApCit7CisJdW5zaWduZWQgaW50IHJhdzsKKwl1MzIgd2FudDsKKworCWlmIChyZWdtYXBfcmVhZChtYXAsIGRlc2MtPnJlZywgJnJhdykgPCAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlhc3BlZWRfc2lnX2Rlc2NfcHJpbnRfdmFsKGRlc2MsIGVuYWJsZWQsIHJhdyk7CisJd2FudCA9IGVuYWJsZWQgPyBkZXNjLT5lbmFibGUgOiBkZXNjLT5kaXNhYmxlOworCisJcmV0dXJuICgocmF3ICYgZGVzYy0+bWFzaykgPj4gX19mZnMoZGVzYy0+bWFzaykpID09IHdhbnQ7Cit9CisKKy8qKgorICogUXVlcnkgdGhlIGVuYWJsZWQgb3IgZGlzYWJsZWQgc3RhdGUgZm9yIGEgbXV4IGZ1bmN0aW9uJ3Mgc2lnbmFsIG9uIGEgcGluCisgKgorICogQGV4cHI6IEFuIGV4cHJlc3Npb24gY29udHJvbGxpbmcgdGhlIHNpZ25hbCBmb3IgYSBtdXggZnVuY3Rpb24gb24gYSBwaW4KKyAqIEBlbmFibGVkOiBUcnVlIHRvIHF1ZXJ5IHRoZSBlbmFibGVkIHN0YXRlLCBmYWxzZSB0byBxdWVyeSBkaXNhYmxlZCBzdGF0ZQorICogQHJlZ21hcDogVGhlIFNDVSByZWdtYXAgaW5zdGFuY2UKKyAqCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGV4cHJlc3Npb24gY29tcG9zZWQgYnkgQGVuYWJsZWQgZXZhbHVhdGVzIHRydWUsIGZhbHNlCisgKiBvdGhlcndpc2UKKyAqCisgKiBBIG11eCBmdW5jdGlvbiBpcyBlbmFibGVkIG9yIGRpc2FibGVkIGlmIHRoZSBmdW5jdGlvbidzIHNpZ25hbCBleHByZXNzaW9uCisgKiBmb3IgZWFjaCBwaW4gaW4gdGhlIGZ1bmN0aW9uJ3MgcGluIGdyb3VwIGV2YWx1YXRlcyB0cnVlIGZvciB0aGUgZGVzaXJlZAorICogc3RhdGUuIEFuIHNpZ25hbCBleHByZXNzaW9uIGV2YWx1YXRlcyB0cnVlIGlmIGFsbCBvZiBpdHMgYXNzb2NpYXRlZCBzaWduYWwKKyAqIGRlc2NyaXB0b3JzIGV2YWx1YXRlIHRydWUgZm9yIHRoZSBkZXNpcmVkIHN0YXRlLgorICoKKyAqIElmIGFuIGV4cHJlc3Npb24ncyBzdGF0ZSBpcyBkZXNjcmliZWQgYnkgbW9yZSB0aGFuIG9uZSBiaXQsIGVpdGhlciB0aHJvdWdoCisgKiBtdWx0aS1iaXQgYml0ZmllbGRzIGluIGEgc2luZ2xlIHNpZ25hbCBkZXNjcmlwdG9yIG9yIHRocm91Z2ggbXVsdGlwbGUgc2lnbmFsCisgKiBkZXNjcmlwdG9ycyBvZiBhIHNpbmdsZSBiaXQgdGhlbiBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIGV4cHJlc3Npb24gdG8gYmUgaW4KKyAqIG5laXRoZXIgdGhlIGVuYWJsZWQgbm9yIGRpc2FibGVkIHN0YXRlLiBUaHVzIHdlIG11c3QgZXhwbGljaXRseSB0ZXN0IGZvcgorICogZWl0aGVyIGNvbmRpdGlvbiBhcyByZXF1aXJlZC4KKyAqLworc3RhdGljIGJvb2wgYXNwZWVkX3NpZ19leHByX2V2YWwoY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqZXhwciwKKwkJCQkgYm9vbCBlbmFibGVkLCBzdHJ1Y3QgcmVnbWFwICptYXApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZXhwci0+bmRlc2NzOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZGVzYyAqZGVzYyA9ICZleHByLT5kZXNjc1tpXTsKKworCQlpZiAoIWFzcGVlZF9zaWdfZGVzY19ldmFsKGRlc2MsIGVuYWJsZWQsIG1hcCkpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogQ29uZmlndXJlIGEgcGluJ3Mgc2lnbmFsIGJ5IGFwcGx5aW5nIGFuIGV4cHJlc3Npb24ncyBkZXNjcmlwdG9yIHN0YXRlIGZvcgorICogYWxsIGRlc2NyaXB0b3JzIGluIHRoZSBleHByZXNzaW9uLgorICoKKyAqIEBleHByOiBUaGUgZXhwcmVzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIHdob3NlIHNpZ25hbCBpcyB0byBiZQorICogICAgICAgIGNvbmZpZ3VyZWQKKyAqIEBlbmFibGU6IHRydWUgdG8gZW5hYmxlIGFuIGZ1bmN0aW9uJ3Mgc2lnbmFsIHRocm91Z2ggYSBwaW4ncyBzaWduYWwKKyAqICAgICAgICAgIGV4cHJlc3Npb24sIGZhbHNlIHRvIGRpc2FibGUgdGhlIGZ1bmN0aW9uJ3Mgc2lnbmFsCisgKiBAbWFwOiBUaGUgU0NVJ3MgcmVnbWFwIGluc3RhbmNlIGZvciBwaW5tdXggcmVnaXN0ZXIgYWNjZXNzLgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXhwcmVzc2lvbiBpcyBjb25maWd1cmVkIGFzIHJlcXVlc3RlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBib29sIGFzcGVlZF9zaWdfZXhwcl9zZXQoY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqZXhwciwKKwkJCQlib29sIGVuYWJsZSwgc3RydWN0IHJlZ21hcCAqbWFwKQoreworCWludCBpOworCWJvb2wgcmV0OworCisJcmV0ID0gYXNwZWVkX3NpZ19leHByX2V2YWwoZXhwciwgZW5hYmxlLCBtYXApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZXhwci0+bmRlc2NzOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZGVzYyAqZGVzYyA9ICZleHByLT5kZXNjc1tpXTsKKwkJdTMyIHBhdHRlcm4gPSBlbmFibGUgPyBkZXNjLT5lbmFibGUgOiBkZXNjLT5kaXNhYmxlOworCisJCS8qCisJCSAqIFN0cmFwIHJlZ2lzdGVycyBhcmUgY29uZmlndXJlZCBpbiBoYXJkd2FyZSBvciBieSBlYXJseS1ib290CisJCSAqIGZpcm13YXJlLiBUcmVhdCB0aGVtIGFzIHJlYWQtb25seSBkZXNwaXRlIHRoYXQgd2UgY2FuIHdyaXRlCisJCSAqIHRoZW0uIFRoaXMgbWF5IG1lYW4gdGhhdCBjZXJ0YWluIGZ1bmN0aW9ucyBjYW5ub3QgYmUKKwkJICogZGVjb25maWd1cmVkIGFuZCBpcyB0aGUgcmVhc29uIHdlIHJlLWV2YWx1YXRlIGFmdGVyIHdyaXRpbmcKKwkJICogYWxsIGRlc2NyaXB0b3IgYml0cy4KKwkJICovCisJCWlmIChkZXNjLT5yZWcgPT0gSFdfU1RSQVAxIHx8IGRlc2MtPnJlZyA9PSBIV19TVFJBUDIpCisJCQljb250aW51ZTsKKworCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMobWFwLCBkZXNjLT5yZWcsIGRlc2MtPm1hc2ssCisJCQkJcGF0dGVybiA8PCBfX2ZmcyhkZXNjLT5tYXNrKSkgPT0gMDsKKworCQlpZiAoIXJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIGFzcGVlZF9zaWdfZXhwcl9ldmFsKGV4cHIsIGVuYWJsZSwgbWFwKTsKK30KKworc3RhdGljIGJvb2wgYXNwZWVkX3NpZ19leHByX2VuYWJsZShjb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICpleHByLAorCQkJCSAgIHN0cnVjdCByZWdtYXAgKm1hcCkKK3sKKwlyZXR1cm4gYXNwZWVkX3NpZ19leHByX3NldChleHByLCB0cnVlLCBtYXApOworfQorCitzdGF0aWMgYm9vbCBhc3BlZWRfc2lnX2V4cHJfZGlzYWJsZShjb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICpleHByLAorCQkJCSAgICBzdHJ1Y3QgcmVnbWFwICptYXApCit7CisJcmV0dXJuIGFzcGVlZF9zaWdfZXhwcl9zZXQoZXhwciwgZmFsc2UsIG1hcCk7Cit9CisKKy8qKgorICogRGlzYWJsZSBhIHNpZ25hbCBvbiBhIHBpbiBieSBkaXNhYmxpbmcgYWxsIHByb3ZpZGVkIHNpZ25hbCBleHByZXNzaW9ucy4KKyAqCisgKiBAZXhwcnM6IFRoZSBsaXN0IG9mIHNpZ25hbCBleHByZXNzaW9ucyAoZnJvbSBhIHByaW9yaXR5IGxldmVsIG9uIGEgcGluKQorICogQG1hcDogVGhlIFNDVSdzIHJlZ21hcCBpbnN0YW5jZSBmb3IgcGlubXV4IHJlZ2lzdGVyIGFjY2Vzcy4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgYWxsIGV4cHJlc3Npb25zIGluIHRoZSBsaXN0IGFyZSBzdWNjZXNzZnVsbHkgZGlzYWJsZWQsIGZhbHNlCisgKiBvdGhlcndpc2UKKyAqLworc3RhdGljIGJvb2wgYXNwZWVkX2Rpc2FibGVfc2lnKGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKipleHBycywKKwkJCSAgICAgICBzdHJ1Y3QgcmVnbWFwICptYXApCit7CisJYm9vbCBkaXNhYmxlZCA9IHRydWU7CisKKwlpZiAoIWV4cHJzKQorCQlyZXR1cm4gdHJ1ZTsKKworCXdoaWxlICgqZXhwcnMpIHsKKwkJYm9vbCByZXQ7CisKKwkJcmV0ID0gYXNwZWVkX3NpZ19leHByX2Rpc2FibGUoKmV4cHJzLCBtYXApOworCQlkaXNhYmxlZCA9IGRpc2FibGVkICYmIHJldDsKKworCQlleHBycysrOworCX0KKworCXJldHVybiBkaXNhYmxlZDsKK30KKworLyoqCisgKiBTZWFyY2ggZm9yIHRoZSBzaWduYWwgZXhwcmVzc2lvbiBuZWVkZWQgdG8gZW5hYmxlIHRoZSBwaW4ncyBzaWduYWwgZm9yIHRoZQorICogcmVxdWVzdGVkIGZ1bmN0aW9uLgorICoKKyAqIEBleHByczogTGlzdCBvZiBzaWduYWwgZXhwcmVzc2lvbnMgKGhheXN0YWNrKQorICogQG5hbWU6IFRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24gKG5lZWRsZSkKKyAqCisgKiBAcmV0dXJuIEEgcG9pbnRlciB0byB0aGUgc2lnbmFsIGV4cHJlc3Npb24gd2hvc2UgZnVuY3Rpb24gdGFnIG1hdGNoZXMgdGhlCisgKiAgICAgICAgIHByb3ZpZGVkIG5hbWUsIG90aGVyd2lzZSBOVUxMLgorICoKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKmFzcGVlZF9maW5kX2V4cHJfYnlfbmFtZSgKKwkJY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqKmV4cHJzLCBjb25zdCBjaGFyICpuYW1lKQoreworCXdoaWxlICgqZXhwcnMpIHsKKwkJaWYgKHN0cmNtcCgoKmV4cHJzKS0+ZnVuY3Rpb24sIG5hbWUpID09IDApCisJCQlyZXR1cm4gKmV4cHJzOworCQlleHBycysrOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY2hhciAqZ2V0X2RlZmluZWRfYXR0cmlidXRlKGNvbnN0IHN0cnVjdCBhc3BlZWRfcGluX2Rlc2MgKnBkZXNjLAorCQkJCSAgIGNvbnN0IGNoYXIgKigqZ2V0KSgKKwkJCQkJICAgY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqKSkKK3sKKwljaGFyICpmb3VuZCA9IE5VTEw7CisJc2l6ZV90IGxlbiA9IDA7CisJY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqKipwcmlvcywgKipmdW5jcywgKmV4cHI7CisKKwlwcmlvcyA9IHBkZXNjLT5wcmlvczsKKworCXdoaWxlICgoZnVuY3MgPSAqcHJpb3MpKSB7CisJCXdoaWxlICgoZXhwciA9ICpmdW5jcykpIHsKKwkJCWNvbnN0IGNoYXIgKnN0ciA9IGdldChleHByKTsKKwkJCXNpemVfdCBkZWx0YSA9IHN0cmxlbihzdHIpICsgMjsKKwkJCWNoYXIgKmV4cGFuZGVkOworCisJCQlleHBhbmRlZCA9IGtyZWFsbG9jKGZvdW5kLCBsZW4gKyBkZWx0YSArIDEsIEdGUF9LRVJORUwpOworCQkJaWYgKCFleHBhbmRlZCkgeworCQkJCWtmcmVlKGZvdW5kKTsKKwkJCQlyZXR1cm4gZXhwYW5kZWQ7CisJCQl9CisKKwkJCWZvdW5kID0gZXhwYW5kZWQ7CisJCQlmb3VuZFtsZW5dID0gJ1wwJzsKKwkJCWxlbiArPSBkZWx0YTsKKworCQkJc3RyY2F0KGZvdW5kLCBzdHIpOworCQkJc3RyY2F0KGZvdW5kLCAiLCAiKTsKKworCQkJZnVuY3MrKzsKKwkJfQorCQlwcmlvcysrOworCX0KKworCWlmIChsZW4gPCAyKSB7CisJCWtmcmVlKGZvdW5kKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZm91bmRbbGVuIC0gMl0gPSAnXDAnOworCisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYXNwZWVkX3NpZ19leHByX2Z1bmN0aW9uKGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKmV4cHIpCit7CisJcmV0dXJuIGV4cHItPmZ1bmN0aW9uOworfQorCitzdGF0aWMgY2hhciAqZ2V0X2RlZmluZWRfZnVuY3Rpb25zKGNvbnN0IHN0cnVjdCBhc3BlZWRfcGluX2Rlc2MgKnBkZXNjKQoreworCXJldHVybiBnZXRfZGVmaW5lZF9hdHRyaWJ1dGUocGRlc2MsIGFzcGVlZF9zaWdfZXhwcl9mdW5jdGlvbik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICphc3BlZWRfc2lnX2V4cHJfc2lnbmFsKGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKmV4cHIpCit7CisJcmV0dXJuIGV4cHItPnNpZ25hbDsKK30KKworc3RhdGljIGNoYXIgKmdldF9kZWZpbmVkX3NpZ25hbHMoY29uc3Qgc3RydWN0IGFzcGVlZF9waW5fZGVzYyAqcGRlc2MpCit7CisJcmV0dXJuIGdldF9kZWZpbmVkX2F0dHJpYnV0ZShwZGVzYywgYXNwZWVkX3NpZ19leHByX3NpZ25hbCk7Cit9CisKK2ludCBhc3BlZWRfcGlubXV4X3NldF9tdXgoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24sCisJCQkgIHVuc2lnbmVkIGludCBncm91cCkKK3sKKwlpbnQgaTsKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX3BpbmN0cmxfZGF0YSAqcGRhdGEgPQorCQlwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX3Bpbl9ncm91cCAqcGdyb3VwID0gJnBkYXRhLT5ncm91cHNbZ3JvdXBdOworCWNvbnN0IHN0cnVjdCBhc3BlZWRfcGluX2Z1bmN0aW9uICpwZnVuYyA9CisJCSZwZGF0YS0+ZnVuY3Rpb25zW2Z1bmN0aW9uXTsKKworCWZvciAoaSA9IDA7IGkgPCBwZ3JvdXAtPm5waW5zOyBpKyspIHsKKwkJaW50IHBpbiA9IHBncm91cC0+cGluc1tpXTsKKwkJY29uc3Qgc3RydWN0IGFzcGVlZF9waW5fZGVzYyAqcGRlc2MgPSBwZGF0YS0+cGluc1twaW5dLmRydl9kYXRhOworCQljb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICpleHByID0gTlVMTDsKKwkJY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqKmZ1bmNzOworCQljb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICoqKnByaW9zOworCisJCWlmICghcGRlc2MpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcmlvcyA9IHBkZXNjLT5wcmlvczsKKworCQlpZiAoIXByaW9zKQorCQkJY29udGludWU7CisKKwkJLyogRGlzYWJsZSBmdW5jdGlvbnMgYXQgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGF0IHJlcXVlc3RlZCAqLworCQl3aGlsZSAoKGZ1bmNzID0gKnByaW9zKSkgeworCQkJZXhwciA9IGFzcGVlZF9maW5kX2V4cHJfYnlfbmFtZShmdW5jcywgcGZ1bmMtPm5hbWUpOworCisJCQlpZiAoZXhwcikKKwkJCQlicmVhazsKKworCQkJaWYgKCFhc3BlZWRfZGlzYWJsZV9zaWcoZnVuY3MsIHBkYXRhLT5tYXApKQorCQkJCXJldHVybiAtRVBFUk07CisKKwkJCXByaW9zKys7CisJCX0KKworCQlpZiAoIWV4cHIpIHsKKwkJCWNoYXIgKmZ1bmN0aW9ucyA9IGdldF9kZWZpbmVkX2Z1bmN0aW9ucyhwZGVzYyk7CisJCQljaGFyICpzaWduYWxzID0gZ2V0X2RlZmluZWRfc2lnbmFscyhwZGVzYyk7CisKKwkJCXByX3dhcm4oIk5vIGZ1bmN0aW9uICVzIGZvdW5kIG9uIHBpbiAlcyAoJWQpLiBGb3VuZCBzaWduYWwocykgJXMgZm9yIGZ1bmN0aW9uKHMpICVzXG4iLAorCQkJCXBmdW5jLT5uYW1lLCBwZGVzYy0+bmFtZSwgcGluLCBzaWduYWxzLAorCQkJCWZ1bmN0aW9ucyk7CisJCQlrZnJlZShzaWduYWxzKTsKKwkJCWtmcmVlKGZ1bmN0aW9ucyk7CisKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKworCQlpZiAoIWFzcGVlZF9zaWdfZXhwcl9lbmFibGUoZXhwciwgcGRhdGEtPm1hcCkpCisJCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBhc3BlZWRfZXhwcl9pc19ncGlvKGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKmV4cHIpCit7CisJLyoKKwkgKiBUaGUgc2lnbmFsIHR5cGUgaXMgR1BJTyBpZiB0aGUgc2lnbmFsIG5hbWUgaGFzICJHUElPIiBhcyBhIHByZWZpeC4KKwkgKiBzdHJuY21wIChyYXRoZXIgdGhhbiBzdHJjbXApIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBwcmVmaXgKKwkgKiByZXF1aXJlbWVudC4KKwkgKgorCSAqIGV4cHItPnNpZ25hbCBtaWdodCBsb29rIGxpa2UgIkdQSU9UMyIgaW4gdGhlIEdQSU8gY2FzZS4KKwkgKi8KKwlyZXR1cm4gc3RybmNtcChleHByLT5zaWduYWwsICJHUElPIiwgNCkgPT0gMDsKK30KKworc3RhdGljIGJvb2wgYXNwZWVkX2dwaW9faW5fZXhwcnMoY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqKmV4cHJzKQoreworCWlmICghZXhwcnMpCisJCXJldHVybiBmYWxzZTsKKworCXdoaWxlICgqZXhwcnMpIHsKKwkJaWYgKGFzcGVlZF9leHByX2lzX2dwaW8oKmV4cHJzKSkKKwkJCXJldHVybiB0cnVlOworCQlleHBycysrOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworaW50IGFzcGVlZF9ncGlvX3JlcXVlc3RfZW5hYmxlKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJCSAgICAgICBzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlICpyYW5nZSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCWNvbnN0IHN0cnVjdCBhc3BlZWRfcGluY3RybF9kYXRhICpwZGF0YSA9CisJCXBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCWNvbnN0IHN0cnVjdCBhc3BlZWRfcGluX2Rlc2MgKnBkZXNjID0gcGRhdGEtPnBpbnNbb2Zmc2V0XS5kcnZfZGF0YTsKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICoqKnByaW9zLCAqKmZ1bmNzLCAqZXhwcjsKKworCWlmICghcGRlc2MpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJpb3MgPSBwZGVzYy0+cHJpb3M7CisKKwlpZiAoIXByaW9zKQorCQlyZXR1cm4gLUVOWElPOworCisJLyogRGlzYWJsZSBhbnkgZnVuY3Rpb25zIG9mIGhpZ2hlciBwcmlvcml0eSB0aGFuIEdQSU8gKi8KKwl3aGlsZSAoKGZ1bmNzID0gKnByaW9zKSkgeworCQlpZiAoYXNwZWVkX2dwaW9faW5fZXhwcnMoZnVuY3MpKQorCQkJYnJlYWs7CisKKwkJaWYgKCFhc3BlZWRfZGlzYWJsZV9zaWcoZnVuY3MsIHBkYXRhLT5tYXApKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlwcmlvcysrOworCX0KKworCWlmICghZnVuY3MpIHsKKwkJY2hhciAqc2lnbmFscyA9IGdldF9kZWZpbmVkX3NpZ25hbHMocGRlc2MpOworCisJCXByX3dhcm4oIk5vIEdQSU8gc2lnbmFsIHR5cGUgZm91bmQgb24gcGluICVzICglZCkuIEZvdW5kOiAlc1xuIiwKKwkJCXBkZXNjLT5uYW1lLCBvZmZzZXQsIHNpZ25hbHMpOworCQlrZnJlZShzaWduYWxzKTsKKworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWV4cHIgPSAqZnVuY3M7CisKKwkvKgorCSAqIERpc2FibGluZyBhbGwgaGlnaGVyLXByaW9yaXR5IGV4cHJlc3Npb25zIGlzIGVub3VnaCB0byBlbmFibGUgdGhlCisJICogbG93ZXN0LXByaW9yaXR5IHNpZ25hbCB0eXBlLiBBcyBzdWNoIGl0IGhhcyBubyBhc3NvY2lhdGVkCisJICogZXhwcmVzc2lvbi4KKwkgKi8KKwlpZiAoIWV4cHIpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiBHUElPIGlzIG5vdCB0aGUgbG93ZXN0IHByaW9yaXR5IHNpZ25hbCB0eXBlLCBhc3N1bWUgdGhlcmUgaXMgb25seQorCSAqIG9uZSBleHByZXNzaW9uIGRlZmluZWQgdG8gZW5hYmxlIHRoZSBHUElPIGZ1bmN0aW9uCisJICovCisJaWYgKCFhc3BlZWRfc2lnX2V4cHJfZW5hYmxlKGV4cHIsIHBkYXRhLT5tYXApKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBhc3BlZWRfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJIHN0cnVjdCBwaW5jdHJsX2Rlc2MgKnBkZXNjLAorCQkJIHN0cnVjdCBhc3BlZWRfcGluY3RybF9kYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7CisJc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsOworCisJcGFyZW50ID0gcGRldi0+ZGV2LnBhcmVudDsKKwlpZiAoIXBhcmVudCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBwYXJlbnQgZm9yIHN5c2NvbiBwaW5jb250cm9sbGVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGRhdGEtPm1hcCA9IHN5c2Nvbl9ub2RlX3RvX3JlZ21hcChwYXJlbnQtPm9mX25vZGUpOworCWlmIChJU19FUlIocGRhdGEtPm1hcCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcmVnbWFwIGZvciBzeXNjb24gcGluY29udHJvbGxlciBwYXJlbnRcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwZGF0YS0+bWFwKTsKKwl9CisKKwlwY3RsID0gcGluY3RybF9yZWdpc3RlcihwZGVzYywgJnBkZXYtPmRldiwgcGRhdGEpOworCisJaWYgKElTX0VSUihwY3RsKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgcGluY3RybFxuIik7CisJCXJldHVybiBQVFJfRVJSKHBjdGwpOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL2FzcGVlZC9waW5jdHJsLWFzcGVlZC5oIGIvZHJpdmVycy9waW5jdHJsL2FzcGVlZC9waW5jdHJsLWFzcGVlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNzJlZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL3BpbmN0cmwtYXNwZWVkLmgKQEAgLTAsMCArMSw1NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIFBJTkNUUkxfQVNQRUVECisjZGVmaW5lIFBJTkNUUkxfQVNQRUVECisKKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmN0cmwuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3Bpbm11eC5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY29uZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY29uZi1nZW5lcmljLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKy8qCisgKiBUaGUgQVNQRUVEIFNvQ3MgcHJvdmlkZSB0eXBpY2FsbHkgbW9yZSB0aGFuIDIwMCBwaW5zIGZvciBHUElPIGFuZCBvdGhlcgorICogZnVuY3Rpb25zLiBUaGUgU29DIGZ1bmN0aW9uIGVuYWJsZWQgb24gYSBwaW4gaXMgZGV0ZXJtaW5lZCBvbiBhIHByaW9yaXR5CisgKiBiYXNpcyB3aGVyZSBhIGdpdmVuIHBpbiBjYW4gcHJvdmlkZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgc2lnbmFsIHR5cGVzLgorICoKKyAqIFRoZSBzaWduYWwgYWN0aXZlIG9uIGEgcGluIGlzIGRlc2NyaWJlZCBieSBib3RoIGEgcHJpb3JpdHkgbGV2ZWwgYW5kCisgKiBjb21wb3VuZCBsb2dpY2FsIGV4cHJlc3Npb25zIGludm9sdmluZyBtdWx0aXBsZSBvcGVyYXRvcnMsIHJlZ2lzdGVycyBhbmQKKyAqIGJpdHMuIFNvbWUgZGlmZmljdWx0eSBhcmlzZXMgYXMgdGhlIHBpbidzIGZ1bmN0aW9uIGJpdCBtYXNrcyBmb3IgZWFjaAorICogcHJpb3JpdHkgbGV2ZWwgYXJlIGZyZXF1ZW50bHkgbm90IHRoZSBzYW1lIChpLmUuIGNhbm5vdCBqdXN0IGZsaXAgYSBiaXQgdG8KKyAqIGNoYW5nZSBmcm9tIGEgaGlnaCB0byBsb3cgcHJpb3JpdHkgc2lnbmFsKSwgb3IgZXZlbiBpbiB0aGUgc2FtZSByZWdpc3Rlci4KKyAqIEZ1cnRoZXIsIG5vdCBhbGwgc2lnbmFscyBjYW4gYmUgdW5tdXhlZCwgYXMgc29tZSBleHByZXNzaW9ucyBkZXBlbmQgb24KKyAqIHZhbHVlcyBpbiB0aGUgaGFyZHdhcmUgc3RyYXBwaW5nIHJlZ2lzdGVyICh3aGljaCBpcyB0cmVhdGVkIGFzIHJlYWQtb25seSkuCisgKgorICogU29DIE11bHRpLWZ1bmN0aW9uIFBpbiBFeHByZXNzaW9uIEV4YW1wbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBIZXJlIGFyZSBzb21lIHNhbXBsZSBtdXggY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgQVNUMjQwMCBhbmQgQVNUMjUwMAorICogZGF0YXNoZWV0cyB0byBpbGx1c3RyYXRlIHRoZSBjb3JuZXIgY2FzZXMsIHJvdWdobHkgaW4gb3JkZXIgb2YgbGVhc3QgdG8gbW9zdAorICogY29ybmVyLiBUaGUgc2lnbmFsIHByaW9yaXRpZXMgYXJlIGluIGRlY2VuZGluZyBvcmRlciBmcm9tIFAwIChoaWdoZXN0KS4KKyAqCisgKiBENiBpcyBhIHBpbiB3aXRoIGEgc2luZ2xlIGZ1bmN0aW9uIChiZXNpZGUgR1BJTyk7IGEgaGlnaCBwcmlvcml0eSBzaWduYWwKKyAqIHRoYXQgcGFydGljaXBhdGVzIGluIG9uZSBmdW5jdGlvbjoKKyAqCisgKiBCYWxsIHwgRGVmYXVsdCB8IFAwIFNpZ25hbCB8IFAwIEV4cHJlc3Npb24gICAgICAgICAgICAgICB8IFAxIFNpZ25hbCB8IFAxIEV4cHJlc3Npb24gfCBPdGhlcgorICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKiAgRDYgICAgR1BJT0EwICAgIE1BQzFMSU5LICAgIFNDVTgwWzBdPTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPQTAKKyAqIC0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICoKKyAqIEM1IGlzIGEgbXVsdGktc2lnbmFsIHBpbiAoaGlnaCBhbmQgbG93IHByaW9yaXR5IHNpZ25hbHMpLiBIZXJlIHdlIHRvdWNoCisgKiBkaWZmZXJlbnQgcmVnaXN0ZXJzIGZvciB0aGUgZGlmZmVyZW50IGZ1bmN0aW9ucyB0aGF0IGVuYWJsZSBlYWNoIHNpZ25hbDoKKyAqCisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0KKyAqICBDNSAgICBHUElPQTQgICAgU0NMOSAgICAgICAgU0NVOTBbMjJdPTEgICAgICAgICAgICAgICAgICAgVElNRVI1ICAgICAgU0NVODBbNF09MSAgICAgIEdQSU9BNAorICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKgorICogRTE5IGlzIGEgc2luZ2xlLXNpZ25hbCBwaW4gd2l0aCB0d28gZnVuY3Rpb25zIHRoYXQgaW5mbHVlbmNlIHRoZSBhY3RpdmUKKyAqIHNpZ25hbC4gSW4gdGhpcyBjYXNlIGJvdGggYml0cyBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgLSBlbmFibGUgYSBkZWRpY2F0ZWQKKyAqIExQQyByZXNldCBwaW4uIEhvd2V2ZXIgaXQncyBub3QgYWx3YXlzIHRoZSBjYXNlIHRoYXQgdGhlIGJpdHMgaW4gdGhlCisgKiBPUi1yZWxhdGlvbnNoaXAgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nLgorICoKKyAqIC0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICogIEUxOSAgIEdQSU9CNCAgICBMUENSU1QjICAgICBTQ1U4MFsxMl09MSB8IFN0cmFwWzE0XT0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT0I0CisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0KKyAqCisgKiBGb3IgZXhhbXBsZSwgcGluIEIxOSBoYXMgYSBsb3ctcHJpb3JpdHkgc2lnbmFsIHRoYXQncyBlbmFibGVkIGJ5IHR3bworICogZGlzdGluY3QgU29DIGZ1bmN0aW9uczogQSBzcGVjaWZpYyBTSU9QQkkgYml0IGluIHJlZ2lzdGVyIFNDVUE0LCBhbmQgYW4gQUNQSQorICogYml0IGluIHRoZSBTVFJBUCByZWdpc3Rlci4gVGhlIEFDUEkgYml0IGNvbmZpZ3VyZXMgc2lnbmFscyBvbiBwaW5zIGluCisgKiBhZGRpdGlvbiB0byBCMTkuIEJvdGggb2YgdGhlIGxvdyBwcmlvcml0eSBmdW5jdGlvbnMgYXMgd2VsbCBhcyB0aGUgaGlnaAorICogcHJpb3JpdHkgZnVuY3Rpb24gbXVzdCBiZSBkaXNhYmxlZCBmb3IgR1BJT0YxIHRvIGJlIHVzZWQuCisgKgorICogQmFsbCB8IERlZmF1bHQgfCBQMCBTaWduYWwgfCBQMCBFeHByZXNzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQMSBTaWduYWwgfCBQMSBFeHByZXNzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICB8IE90aGVyCisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKiAgQjE5ICAgR1BJT0YxICAgIE5EQ0Q0ICAgICAgIFNDVTgwWzI1XT0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJT1BCSSMgICAgIFNDVUE0WzEyXT0xIHwgU3RyYXBbMTldPTAgICAgICAgICAgICAgICAgR1BJT0YxCisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKgorICogRm9yIHBpbiBFMTgsIHRoZSBTb0MgQU5EcyB0aGUgZXhwZWN0ZWQgc3RhdGUgb2YgdGhyZWUgYml0cyB0byBkZXRlcm1pbmUgdGhlCisgKiBwaW4ncyBhY3RpdmUgc2lnbmFsOgorICoKKyAqICogU0NVM0NbM106IEVuYWJsZSBleHRlcm5hbCBTT0MgcmVzZXQgZnVuY3Rpb24KKyAqICogU0NVODBbMTVdOiBFbmFibGUgU1BJQ1MxIyBvciBFWFRSU1QjIGZ1bmN0aW9uIHBpbgorICogKiBTQ1U5MFszMV06IFNlbGVjdCBTUEkgaW50ZXJmYWNlIENTIyBvdXRwdXQKKyAqCisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKiAgRTE4ICAgR1BJT0I3ICAgIEVYVFJTVCMgICAgIFNDVTNDWzNdPTEgJiBTQ1U4MFsxNV09MSAmIFNDVTkwWzMxXT0wICAgIFNQSUNTMSMgICAgIFNDVTNDWzNdPTEgJiBTQ1U4MFsxNV09MSAmIFNDVTkwWzMxXT0xICAgR1BJT0I3CisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKgorICogKEJpdHMgU0NVM0NbM10gYW5kIFNDVTgwWzE1XSBhcHBlYXIgdG8gb25seSBiZSB1c2VkIGluIHRoZSBleHByZXNzaW9ucyBmb3IKKyAqIHNlbGVjdGluZyB0aGUgc2lnbmFscyBvbiBwaW4gRTE4KQorICoKKyAqIFBpbiBUNSBpcyBhIG11bHRpLXNpZ25hbCBwaW4gd2l0aCBhIG1vcmUgY29tcGxleCBjb25maWd1cmF0aW9uOgorICoKKyAqIEJhbGwgfCBEZWZhdWx0IHwgUDAgU2lnbmFsIHwgUDAgRXhwcmVzc2lvbiAgICAgICAgICAgICAgICB8IFAxIFNpZ25hbCB8IFAxIEV4cHJlc3Npb24gfCBPdGhlcgorICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICogIFQ1ICAgIEdQSU9MMSAgICBWUElERSAgICAgICBTQ1U5MFs1OjRdIT0wICYgU0NVODRbMTddPTEgICAgTkRDRDEgICAgICAgU0NVODRbMTddPTEgICAgIEdQSU9MMQorICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICoKKyAqIFRoZSBoaWdoIHByaW9yaXR5IHNpZ25hbCBjb25maWd1cmF0aW9uIGlzIGJlc3QgdGhvdWdodCBvZiBpbiB0ZXJtcyBvZiBpdHMKKyAqIGV4cGxvZGVkIGZvcm0sIHdpdGggcmVmZXJlbmNlIHRvIHRoZSBTQ1U5MFs1OjRdIGJpdHM6CisgKgorICogKiBTQ1U5MFs1OjRdPTAwOiBkaXNhYmxlCisgKiAqIFNDVTkwWzU6NF09MDE6IDE4IGJpdHMgKFI2L0c2L0I2KSB2aWRlbyBtb2RlLgorICogKiBTQ1U5MFs1OjRdPTEwOiAyNCBiaXRzIChSOC9HOC9COCkgdmlkZW8gbW9kZS4KKyAqICogU0NVOTBbNTo0XT0xMTogMzAgYml0cyAoUjEwL0cxMC9CMTApIHZpZGVvIG1vZGUuCisgKgorICogUmUtd3JpdGluZzoKKyAqCisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKiAgVDUgICAgR1BJT0wxICAgIFZQSURFICAgICAgKFNDVTkwWzU6NF09MSAmIFNDVTg0WzE3XT0xKSAgICBORENEMSAgICAgICBTQ1U4NFsxN109MSAgICAgR1BJT0wxCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoU0NVOTBbNTo0XT0yICYgU0NVODRbMTddPTEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoU0NVOTBbNTo0XT0zICYgU0NVODRbMTddPTEpCisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKgorICogRm9yIHJlZmVyZW5jZSB0aGUgU0NVODRbMTddIGJpdCBjb25maWd1cmUgdGhlICJVQVJUMSBORENEMSBvciBWaWRlbyBWUElERQorICogZnVuY3Rpb24gcGluIiwgd2hlcmUgdGhlIHNpZ25hbCBpdHNlbGYgaXMgZGV0ZXJtaW5lZCBieSB3aGV0aGVyIFNDVTk0WzU6NF0KKyAqIGlzIGRpc2FibGVkIG9yIGluIG9uZSBvZiB0aGUgMTgsIDI0IG9yIDMwYml0IHZpZGVvIG1vZGVzLgorICoKKyAqIE90aGVyIHZpZGVvLWlucHV0LXJlbGF0ZWQgcGlucyByZXF1aXJlIGFuIGV4cGxpY2l0IHN0YXRlIGluIFNDVTkwWzU6NF0sIGUuZy4KKyAqIFcxIGFuZCBVNToKKyAqCisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKiAgVzEgICAgR1BJT0w2ICAgIFZQSUIwICAgICAgIFNDVTkwWzU6NF09MyAmIFNDVTg0WzIyXT0xICAgICBUWEQxICAgICAgICBTQ1U4NFsyMl09MSAgICAgR1BJT0w2CisgKiAgVTUgICAgR1BJT0w3ICAgIFZQSUIxICAgICAgIFNDVTkwWzU6NF09MyAmIFNDVTg0WzIzXT0xICAgICBSWEQxICAgICAgICBTQ1U4NFsyM109MSAgICAgR1BJT0w3CisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKgorICogVGhlIGV4YW1wbGVzIG9mIFQ1IGFuZCBXMSBhcmUgcGFydGljdWxhcmx5IGZlcnRpbGUsIGFzIHRoZXkgYWxzbyBkZW1vbnN0cmF0ZQorICogdGhhdCBkZXNwaXRlIG9wZXJhdGluZyBhcyBwYXJ0IG9mIHRoZSB2aWRlbyBpbnB1dCBidXMgZWFjaCBzaWduYWwgbmVlZHMgdG8KKyAqIGJlIGVuYWJsZWQgaW5kaXZpZHVhbGx5IHZpYSBpdCdzIG93biBTQ1U4NCAoaW4gdGhlIGNhc2VzIG9mIFQ1IGFuZCBXMSkKKyAqIHJlZ2lzdGVyIGJpdC4gVGhpcyBpcyBhIGxpdHRsZSBjcmF6eSBpZiB0aGUgYnVzIGRvZXNuJ3QgaGF2ZSBvcHRpb25hbAorICogc2lnbmFscywgYnV0IGlzIHVzZWQgdG8gZGVjZW50IGVmZmVjdCB3aXRoIHNvbWUgb2YgdGhlIFVBUlRzIHdoZXJlIG5vdCBhbGwKKyAqIHNpZ25hbHMgYXJlIHJlcXVpcmVkLiBIb3dldmVyLCB0aGlzIGlzbid0IGRvbmUgY29uc2lzdGVudGx5IC0gVUFSVDEgaXMKKyAqIGVuYWJsZWQgb24gYSBwZXItcGluIGJhc2lzLCBhbmQgYnkgY29udHJhc3QsIGFsbCBzaWduYWxzIGZvciBVQVJUNiBhcmUKKyAqIGVuYWJsZWQgYnkgYSBzaW5nbGUgYml0LgorICoKKyAqIEZ1cnRoZXIsIHRoZSBoaWdoIGFuZCBsb3cgcHJpb3JpdHkgc2lnbmFscyBsaXN0ZWQgaW4gdGhlIHRhYmxlIGFib3ZlIHNoYXJlCisgKiBhIGNvbmZpZ3VyYXRpb24gYml0LiBUaGUgVlBJIHNpZ25hbHMgc2hvdWxkIG9wZXJhdGUgaW4gY29uY2VydCBpbiBhIHNpbmdsZQorICogZnVuY3Rpb24sIGJ1dCB0aGUgVUFSVCBzaWduYWxzIHNob3VsZCByZXRhaW4gdGhlIGFiaWxpdHkgdG8gYmUgY29uZmlndXJlZAorICogaW5kZXBlbmRlbnRseS4gVGhpcyBwdXNoZXMgdGhlIGltcGxlbWVudGF0aW9uIGRvd24gdGhlIHBhdGggb2YgdGFnZ2luZyBhCisgKiBzaWduYWwncyBleHByZXNzaW9ucyB3aXRoIHRoZSBmdW5jdGlvbiB0aGV5IHBhcnRpY2lwYXRlIGluLCByYXRoZXIgdGhhbgorICogZGVmaW5pbmcgbWFza3MgYWZmZWN0aW5nIG11bHRpcGxlIHNpZ25hbHMgcGVyIGZ1bmN0aW9uLiBUaGUgbGF0dGVyIGFwcHJvYWNoCisgKiBmYWlscyBpbiB0aGlzIGluc3RhbmNlIHdoZXJlIGFwcGx5aW5nIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgVUFSVCBwaW4gb2YKKyAqIGludGVyZXN0IHdpbGwgc3RvbXAgb24gdGhlIHN0YXRlIG9mIG90aGVyIFVBUlQgc2lnbmFscyB3aGVuIGRpc2FibGluZyB0aGUKKyAqIFZQSSBmdW5jdGlvbnMgb24gdGhlIGN1cnJlbnQgcGluLgorICoKKyAqIEJhbGwgfCAgRGVmYXVsdCAgIHwgUDAgU2lnbmFsIHwgUDAgRXhwcmVzc2lvbiAgICAgICAgICAgICB8IFAxIFNpZ25hbCB8IFAxIEV4cHJlc3Npb24gfCBPdGhlcgorICogLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tCisgKiAgQTEyICAgUkdNSUkxVFhDSyAgIEdQSU9UMCAgICAgIFNDVUEwWzBdPTEgICAgICAgICAgICAgICAgICBSTUlJMVRYRU4gICBTdHJhcFs2XT0wICAgICAgUkdNSUkxVFhDSworICogIEIxMiAgIFJHTUlJMVRYQ1RMICBHUElPVDEgICAgICBTQ1VBMFsxXT0xICAgICAgICAgICAgICAgICAg4oCTICAgICAgICAgICBTdHJhcFs2XT0wICAgICAgUkdNSUkxVFhDVEwKKyAqIC0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLQorICoKKyAqIEExMiBkZW1vbnN0cmF0ZXMgdGhhdCB0aGUgIk90aGVyIiBzaWduYWwgaXNuJ3QgYWx3YXlzIEdQSU8gLSBpbiB0aGlzIGNhc2UKKyAqIEdQSU9UMCBpcyBhIGhpZ2gtcHJpb3JpdHkgc2lnbmFsIGFuZCBSR01JSTFUWENLIGlzIE90aGVyLiBUaHVzLCBHUElPCisgKiBzaG91bGQgYmUgdHJlYXRlZCBsaWtlIGFueSBvdGhlciBzaWduYWwgdHlwZSB3aXRoIGZ1bGwgZnVuY3Rpb24gZXhwcmVzc2lvbgorICogcmVxdWlyZW1lbnRzLCBhbmQgbm90IGFzc3VtZWQgdG8gYmUgdGhlIGRlZmF1bHQgY2FzZS4gU2VwYXJhdGVseSwgR1BJT1QwIGFuZAorICogR1BJT1QxJ3Mgc2lnbmFsIGRlc2NyaXB0b3IgYml0cyBhcmUgZGlzdGluY3QsIHRoZXJlZm9yZSB3ZSBtdXN0IGl0ZXJhdGUgYWxsCisgKiBwaW5zIGluIHRoZSBmdW5jdGlvbidzIGdyb3VwIHRvIGRpc2FibGUgdGhlIGhpZ2hlci1wcmlvcml0eSBzaWduYWxzIHN1Y2gKKyAqIHRoYXQgdGhlIHNpZ25hbCBmb3IgdGhlIGZ1bmN0aW9uIG9mIGludGVyZXN0IGlzIGNvcnJlY3RseSBlbmFibGVkLgorICoKKyAqIEZpbmFsbHksIHRocmVlIHByaW9yaXR5IGxldmVscyBhcmVuJ3QgYWx3YXlzIGVub3VnaDsgdGhlIEFTVDI1MDAgYnJpbmdzIHdpdGgKKyAqIGl0IDE4IHBpbnMgb2YgZml2ZSBwcmlvcml0eSBsZXZlbHMsIGhvd2V2ZXIgdGhlIDE4IHBpbnMgb25seSB1c2UgdGhyZWUgb2YKKyAqIHRoZSBmaXZlIHByaW9yaXR5IGxldmVscy4KKyAqCisgKiBVbHRpbWF0ZWx5IHRoZSByZXF1aXJlbWVudCB0byBjb250cm9sIHBpbnMgaW4gdGhlIGV4YW1wbGVzIGFib3ZlIGRyaXZlIHRoZQorICogZGVzaWduOgorICoKKyAqICogUGlucyBwcm92aWRlIHNpZ25hbHMgYWNjb3JkaW5nIHRvIGZ1bmN0aW9ucyBhY3RpdmF0ZWQgaW4gdGhlIG11eAorICogICBjb25maWd1cmF0aW9uCisgKgorICogKiBQaW5zIHByb3ZpZGUgdXAgdG8gZml2ZSBzaWduYWwgdHlwZXMgaW4gYSBwcmlvcml0eSBvcmRlcgorICoKKyAqICogRm9yIHByaW9yaXRpZXMgbGV2ZWxzIGRlZmluZWQgb24gYSBwaW4sIGVhY2ggcHJpb3JpdHkgcHJvdmlkZXMgb25lIHNpZ25hbAorICoKKyAqICogRW5hYmxpbmcgbG93ZXIgcHJpb3JpdHkgc2lnbmFscyByZXF1aXJlcyBoaWdoZXIgcHJpb3JpdHkgc2lnbmFscyBiZQorICogICBkaXNhYmxlZAorICoKKyAqICogQSBmdW5jdGlvbiByZXByZXNlbnRzIGEgc2V0IG9mIHNpZ25hbHM7IGZ1bmN0aW9ucyBhcmUgZGlzdGluY3QgaWYgdGhlaXIKKyAqICAgc2V0cyBvZiBzaWduYWxzIGFyZSBub3QgZXF1YWwKKyAqCisgKiAqIFNpZ25hbHMgcGFydGljaXBhdGUgaW4gb25lIG9yIG1vcmUgZnVuY3Rpb25zCisgKgorICogKiBBIGZ1bmN0aW9uIGlzIGRlc2NyaWJlZCBieSBhbiBleHByZXNzaW9uIG9mIG9uZSBvciBtb3JlIHNpZ25hbAorICogICBkZXNjcmlwdG9ycywgd2hpY2ggY29tcGFyZSBiaXQgdmFsdWVzIGluIGEgcmVnaXN0ZXIKKyAqCisgKiAqIEEgc2lnbmFsIGV4cHJlc3Npb24gaXMgdGhlIHNtYWxsZXN0IHNldCBvZiBzaWduYWwgZGVzY3JpcHRvcnMgd2hvc2UKKyAqICAgY29tcGFyaXNvbnMgbXVzdCBldmFsdWF0ZSAndHJ1ZScgZm9yIGEgc2lnbmFsIHRvIGJlIGVuYWJsZWQgb24gYSBwaW4uCisgKgorICogKiBBIGZ1bmN0aW9uJ3Mgc2lnbmFsIGlzIGFjdGl2ZSBvbiBhIHBpbiBpZiBldmFsdWF0aW5nIGFsbCBzaWduYWwKKyAqICAgZGVzY3JpcHRvcnMgaW4gdGhlIHBpbidzIHNpZ25hbCBleHByZXNzaW9uIGZvciB0aGUgZnVuY3Rpb24geWllbGRzIGEgJ3RydWUnCisgKiAgIHJlc3VsdAorICoKKyAqICogQSBzaWduYWwgYXQgYSBnaXZlbiBwcmlvcml0eSBvbiBhIGdpdmVuIHBpbiBpcyBhY3RpdmUgaWYgYW55IG9mIHRoZQorICogICBmdW5jdGlvbnMgaW4gd2hpY2ggdGhlIHNpZ25hbCBwYXJ0aWNpcGF0ZXMgYXJlIGFjdGl2ZSwgYW5kIG5vIGhpZ2hlcgorICogICBwcmlvcml0eSBzaWduYWwgb24gdGhlIHBpbiBpcyBhY3RpdmUKKyAqCisgKiAqIEdQSU8gaXMgY29uZmlndXJlZCBwZXItcGluCisgKgorICogQW5kIHNvOgorICoKKyAqICogVG8gZGlzYWJsZSBhIHNpZ25hbCwgYW55IGZ1bmN0aW9uKHMpIGFjdGl2YXRpbmcgdGhlIHNpZ25hbCBtdXN0IGJlCisgKiAgIGRpc2FibGVkCisgKgorICogKiBFYWNoIHBpbiBtdXN0IGtub3cgdGhlIHNpZ25hbCBleHByZXNzaW9ucyBvZiBmdW5jdGlvbnMgaW4gd2hpY2ggaXQKKyAqICAgcGFydGljaXBhdGVzLCBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5hYmxpbmcgdGhlIE90aGVyIGZ1bmN0aW9uLiBUaGlzIGlzIGRvbmUKKyAqICAgYnkgZGVhY3RpdmF0aW5nIGFsbCBmdW5jdGlvbnMgdGhhdCBhY3RpdmF0ZSBoaWdoZXIgcHJpb3JpdHkgc2lnbmFscyBvbiB0aGUKKyAqICAgcGluLgorICoKKyAqIEFzIGEgY29uY3JldGUgZXhhbXBsZToKKyAqCisgKiAqIFQ1IHByb3ZpZGVzIHRocmVlIHNpZ25hbHMgdHlwZXM6IFZQSURFLCBORENEMSBhbmQgR1BJTworICoKKyAqICogVGhlIFZQSURFIHNpZ25hbCBwYXJ0aWNpcGF0ZXMgaW4gMyBmdW5jdGlvbnM6IFZQSTE4LCBWUEkyNCBhbmQgVlBJMzAKKyAqCisgKiAqIFRoZSBORENEMSBzaWduYWwgcGFydGljaXBhdGVzIGluIGp1c3QgaXRzIG93biBORENEMSBmdW5jdGlvbgorICoKKyAqICogVlBJREUgaXMgaGlnaCBwcmlvcml0eSwgTkRDRDEgaXMgbG93IHByaW9yaXR5LCBhbmQgR1BJT0wxIGlzIHRoZSBsZWFzdAorICogICBwcmlvcml0aXNlZAorICoKKyAqICogVGhlIHByZXJlcXVpc2l0IGZvciBhY3RpdmF0aW5nIHRoZSBORENEMSBzaWduYWwgaXMgdGhhdCB0aGUgVlBJMTgsIFZQSTI0CisgKiAgIGFuZCBWUEkzMCBmdW5jdGlvbnMgYWxsIGJlIGRpc2FibGVkCisgKgorICogKiBTaW1pbGFybHksIGFsbCBvZiBWUEkxOCwgVlBJMjQsIFZQSTMwIGFuZCBORENEMSBmdW5jdGlvbnMgbXVzdCBiZSBkaXNhYmxlZAorICogICB0byBwcm92aWRlIEdQSU9MNgorICoKKyAqIENvbnNpZGVyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLQorICoKKyAqIElmIHBpbmN0cmwgYWxsb3dzIHVzIHRvIGFsbG9jYXRlIGEgcGluIHdlIGNhbiBjb25maWd1cmUgYSBmdW5jdGlvbiB3aXRob3V0CisgKiBjb25jZXJuIGZvciB0aGUgZnVuY3Rpb24gb2YgYWxyZWFkeSBhbGxvY2F0ZWQgcGlucywgaWYgcGluIGdyb3VwcyBhcmUKKyAqIGNyZWF0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb0MgZnVuY3Rpb25zIGluIHdoaWNoIHRoZXkgcGFydGljaXBhdGUuIFRoaXMgaXMKKyAqIGludHVpdGl2ZSwgYnV0IGl0IGRpZCBub3QgZmVlbCBvYnZpb3VzIGZyb20gdGhlIGJpdC9waW4gcmVsYXRpb25zaGlwcy4KKyAqCisgKiBDb252ZXJzZWx5LCBmYWlsaW5nIHRvIGFsbG9jYXRlIGFsbCBwaW5zIGluIGEgZ3JvdXAgaW5kaWNhdGVzIHNvbWUgYml0cyAoYXMKKyAqIHdlbGwgYXMgcGlucykgcmVxdWlyZWQgZm9yIHRoZSBncm91cCdzIGNvbmZpZ3VyYXRpb24gd2lsbCBhbHJlYWR5IGJlIGluIHVzZSwKKyAqIGxpa2VseSBpbiBhIHdheSB0aGF0J3MgaW5jb25zaXN0ZW50IHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgZmFpbGVkCisgKiBncm91cC4KKyAqLworCisvKgorICogVGhlICJNdWx0aS1mdW5jdGlvbiBQaW5zIE1hcHBpbmcgYW5kIENvbnRyb2wiIHRhYmxlIGluIHRoZSBTb0MgZGF0YXNoZWV0CisgKiByZWZlcmVuY2VzIHJlZ2lzdGVycyBieSB0aGUgZGV2aWNlL29mZnNldCBtbmVtb25pYy4gVGhlIHJlZ2lzdGVyIG1hY3JvcworICogYmVsb3cgYXJlIG5hbWVkIHRoZSBzYW1lIHdheSB0byBlYXNlIHRyYW5zY3JpcHRpb24gYW5kIHZlcmlmaWNhdGlvbiAoYXMKKyAqIG9wcG9zZWQgdG8gbmFtaW5nIHRoZW0gZS5nLiBQSU5NVVhfQ1RSTF9bMC05XSkuIEZ1cnRoZXIsIHNpZ25hbCBleHByZXNzaW9ucworICogcmVmZXJlbmNlIHJlZ2lzdGVycyBiZXlvbmQgdGhvc2UgZGVkaWNhdGVkIHRvIHBpbm11eCwgc3VjaCBhcyB0aGUgc3lzdGVtCisgKiByZXNldCBjb250cm9sIGFuZCBNQUMgY2xvY2sgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuIFRoZSBBU1QyNTAwIGdvZXMgYSBzdGVwCisgKiBmdXJ0aGVyIGFuZCByZWZlcmVuY2VzIHJlZ2lzdGVycyBpbiB0aGUgZ3JhcGhpY3MgSVAgYmxvY2ssIGJ1dCB0aGF0IGlzbid0CisgKiBoYW5kbGVkIHlldC4KKyAqLworI2RlZmluZSBTQ1UyQyAgICAgICAgICAgMHgyQyAvKiBNaXNjLiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDVTNDICAgICAgICAgICAweDNDIC8qIFN5c3RlbSBSZXNldCBDb250cm9sL1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBTQ1U0OCAgICAgICAgICAgMHg0OCAvKiBNQUMgSW50ZXJmYWNlIENsb2NrIERlbGF5IFNldHRpbmcgKi8KKyNkZWZpbmUgSFdfU1RSQVAxICAgICAgIDB4NzAgLyogQVNUMjQwMCBzdHJhcHBpbmcgaXMgMzMgYml0cywgaXMgc3BsaXQgKi8KKyNkZWZpbmUgU0NVODAgICAgICAgICAgIDB4ODAgLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzEgKi8KKyNkZWZpbmUgU0NVODQgICAgICAgICAgIDB4ODQgLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzIgKi8KKyNkZWZpbmUgU0NVODggICAgICAgICAgIDB4ODggLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzMgKi8KKyNkZWZpbmUgU0NVOEMgICAgICAgICAgIDB4OEMgLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzQgKi8KKyNkZWZpbmUgU0NVOTAgICAgICAgICAgIDB4OTAgLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzUgKi8KKyNkZWZpbmUgU0NVOTQgICAgICAgICAgIDB4OTQgLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzYgKi8KKyNkZWZpbmUgU0NVQTAgICAgICAgICAgIDB4QTAgLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzcgKi8KKyNkZWZpbmUgU0NVQTQgICAgICAgICAgIDB4QTQgLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzggKi8KKyNkZWZpbmUgU0NVQTggICAgICAgICAgIDB4QTggLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzkgKi8KKyNkZWZpbmUgSFdfU1RSQVAyICAgICAgIDB4RDAgLyogU3RyYXBwaW5nICovCisKKyAvKioKKyAgKiBBIHNpZ25hbCBkZXNjcmlwdG9yLCB3aGljaCBkZXNjcmliZXMgdGhlIHJlZ2lzdGVyLCBiaXRzIGFuZCB0aGUKKyAgKiBlbmFibGUvZGlzYWJsZSB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgY29tcGFyZWQgb3Igd3JpdHRlbi4KKyAgKgorICAqIEByZWc6IFRoZSByZWdpc3RlciBvZmZzZXQgZnJvbSBiYXNlIGluIGJ5dGVzCisgICogQG1hc2s6IFRoZSBtYXNrIHRvIGFwcGx5IHRvIHRoZSByZWdpc3Rlci4gVGhlIGxvd2VzdCBzZXQgYml0IG9mIHRoZSBtYXNrIGlzCisgICogICAgICAgIHVzZWQgdG8gZGVyaXZlIHRoZSBzaGlmdCB2YWx1ZS4KKyAgKiBAZW5hYmxlOiBUaGUgdmFsdWUgdGhhdCBlbmFibGVzIHRoZSBmdW5jdGlvbi4gVmFsdWUgc2hvdWxkIGJlIGluIHRoZSBMU0JzLAorICAqICAgICAgICAgIG5vdCBhdCB0aGUgcG9zaXRpb24gb2YgdGhlIG1hc2suCisgICogQGRpc2FibGU6IFRoZSB2YWx1ZSB0aGF0IGRpc2FibGVzIHRoZSBmdW5jdGlvbi4gVmFsdWUgc2hvdWxkIGJlIGluIHRoZQorICAqICAgICAgICAgICBMU0JzLCBub3QgYXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBtYXNrLgorICAqLworc3RydWN0IGFzcGVlZF9zaWdfZGVzYyB7CisJdW5zaWduZWQgaW50IHJlZzsKKwl1MzIgbWFzazsKKwl1MzIgZW5hYmxlOworCXUzMiBkaXNhYmxlOworfTsKKworLyoqCisgKiBEZXNjcmliZXMgYSBzaWduYWwgZXhwcmVzc2lvbi4gVGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGJ5IEFORGluZyB0aGUKKyAqIGV2YWx1YXRpb24gb2YgdGhlIGRlc2NyaXB0b3JzLgorICoKKyAqIEBzaWduYWw6IFRoZSBzaWduYWwgbmFtZSBmb3IgdGhlIHByaW9yaXR5IGxldmVsIG9uIHRoZSBwaW4uIElmIHRoZSBzaWduYWwKKyAqICAgICAgICAgIHR5cGUgaXMgR1BJTywgdGhlbiB0aGUgc2lnbmFsIG5hbWUgbXVzdCBiZWdpbiB3aXRoIHRoZSBzdHJpbmcKKyAqICAgICAgICAgICJHUElPIiwgZS5nLiBHUElPQTAsIEdQSU9UNCBldGMuCisgKiBAZnVuY3Rpb246IFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0aGUgc2lnbmFsIHBhcnRpY2lwYXRlcyBpbiBmb3IgdGhlCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgZXhwcmVzc2lvbgorICogQG5kZXNjczogVGhlIG51bWJlciBvZiBzaWduYWwgZGVzY3JpcHRvcnMgaW4gdGhlIGV4cHJlc3Npb24KKyAqIEBkZXNjczogUG9pbnRlciB0byBhbiBhcnJheSBvZiBzaWduYWwgZGVzY3JpcHRvcnMgdGhhdCBjb21wcmlzZSB0aGUKKyAqICAgICAgICAgZnVuY3Rpb24gZXhwcmVzc2lvbgorICovCitzdHJ1Y3QgYXNwZWVkX3NpZ19leHByIHsKKwljb25zdCBjaGFyICpzaWduYWw7CisJY29uc3QgY2hhciAqZnVuY3Rpb247CisJaW50IG5kZXNjczsKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19kZXNjICpkZXNjczsKK307CisKKy8qKgorICogQSBzdHJ1Y3QgY2FwdHVyaW5nIHRoZSBsaXN0IG9mIGV4cHJlc3Npb25zIGVuYWJsaW5nIHNpZ25hbHMgYXQgZWFjaCBwcmlvcml0eQorICogZm9yIGEgZ2l2ZW4gcGluLiBUaGUgc2lnbmFsIGNvbmZpZ3VyYXRpb24gZm9yIGEgcHJpb3JpdHkgbGV2ZWwgaXMgZXZhbHVhdGVkCisgKiBieSBPUmluZyB0aGUgZXZhbHVhdGlvbiBvZiB0aGUgc2lnbmFsIGV4cHJlc3Npb25zIGluIHRoZSByZXNwZWN0aXZlCisgKiBwcmlvcml0eSdzIGxpc3QuCisgKgorICogQG5hbWU6IEEgbmFtZSBmb3IgdGhlIHBpbgorICogQHByaW9zOiBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZXhwcmVzc2lvbiBsaXN0IHBvaW50ZXJzCisgKgorICovCitzdHJ1Y3QgYXNwZWVkX3Bpbl9kZXNjIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKioqcHJpb3M7Cit9OworCisvKiBNYWNybyBoZWxsICovCisKKy8qKgorICogU2hvcnQtaGFuZCBtYWNybyBmb3IgZGVzY3JpYmluZyBhIGNvbmZpZ3VyYXRpb24gZW5hYmxlZCBieSB0aGUgc3RhdGUgb2Ygb25lCisgKiBiaXQuIFRoZSBkaXNhYmxlIHZhbHVlIGlzIGRlcml2ZWQuCisgKgorICogQHJlZzogVGhlIHNpZ25hbCdzIGFzc29jaWF0ZWQgcmVnaXN0ZXIsIG9mZnNldCBmcm9tIGJhc2UKKyAqIEBpZHg6IFRoZSBzaWduYWwncyBiaXQgaW5kZXggaW4gdGhlIHJlZ2lzdGVyCisgKiBAdmFsOiBUaGUgdmFsdWUgKDAgb3IgMSkgdGhhdCBlbmFibGVzIHRoZSBmdW5jdGlvbgorICovCisjZGVmaW5lIFNJR19ERVNDX0JJVChyZWcsIGlkeCwgdmFsKSBcCisJeyByZWcsIEJJVF9NQVNLKGlkeCksIHZhbCwgKCgodmFsKSArIDEpICYgMSkgfQorCisvKioKKyAqIEEgZnVydGhlciBzaG9ydC1oYW5kIG1hY3JvIGRlc2NyaWJpbmcgYSBjb25maWd1cmF0aW9uIGVuYWJsZWQgd2l0aCBhIHNldCBiaXQuCisgKgorICogQHJlZzogVGhlIGNvbmZpZ3VyYXRpb24ncyBhc3NvY2lhdGVkIHJlZ2lzdGVyLCBvZmZzZXQgZnJvbSBiYXNlCisgKiBAaWR4OiBUaGUgY29uZmlndXJhdGlvbidzIGJpdCBpbmRleCBpbiB0aGUgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBTSUdfREVTQ19TRVQocmVnLCBpZHgpIFNJR19ERVNDX0JJVChyZWcsIGlkeCwgMSkKKworI2RlZmluZSBTSUdfREVTQ19MSVNUX1NZTShzaWcsIGZ1bmMpIHNpZ19kZXNjc18gIyMgc2lnICMjIF8gIyMgZnVuYworI2RlZmluZSBTSUdfREVTQ19MSVNUX0RFQ0woc2lnLCBmdW5jLCAuLi4pIFwKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZGVzYyBTSUdfREVTQ19MSVNUX1NZTShzaWcsIGZ1bmMpW10gPSBcCisJCXsgX19WQV9BUkdTX18gfQorCisjZGVmaW5lIFNJR19FWFBSX1NZTShzaWcsIGZ1bmMpIHNpZ19leHByXyAjIyBzaWcgIyMgXyAjIyBmdW5jCisjZGVmaW5lIFNJR19FWFBSX0RFQ0xfKHNpZywgZnVuYykgXAorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByIFNJR19FWFBSX1NZTShzaWcsIGZ1bmMpID0gXAorCXsgXAorCQkuc2lnbmFsID0gI3NpZywgXAorCQkuZnVuY3Rpb24gPSAjZnVuYywgXAorCQkubmRlc2NzID0gQVJSQVlfU0laRShTSUdfREVTQ19MSVNUX1NZTShzaWcsIGZ1bmMpKSwgXAorCQkuZGVzY3MgPSAmKFNJR19ERVNDX0xJU1RfU1lNKHNpZywgZnVuYykpWzBdLCBcCisJfQorCisvKioKKyAqIERlY2xhcmUgYSBzaWduYWwgZXhwcmVzc2lvbi4KKyAqCisgKiBAc2lnOiBBIG1hY3JvIHN5bWJvbCBuYW1lIGZvciB0aGUgc2lnbmFsIChpcyBzdWJqZWN0ZWQgdG8gc3RyaW5naWZpY2F0aW9uCisgKiAgICAgICAgYW5kIHRva2VuIHBhc3RpbmcpCisgKiBAZnVuYzogVGhlIGZ1bmN0aW9uIGluIHdoaWNoIHRoZSBzaWduYWwgaXMgcGFydGljaXBhdGluZworICogQC4uLjogU2lnbmFsIGRlc2NyaXB0b3JzIHRoYXQgZGVmaW5lIHRoZSBzaWduYWwgZXhwcmVzc2lvbgorICoKKyAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGRlY2xhcmVzIHRoZSBST01EOCBzaWduYWwgZm9yIHRoZSBST00xNiBmdW5jdGlvbjoKKyAqCisgKiAgICAgU0lHX0VYUFJfREVDTChST01EOCwgUk9NMTYsIFNJR19ERVNDX1NFVChTQ1U5MCwgNikpOworICoKKyAqIEFuZCB3aXRoIG11bHRpcGxlIHNpZ25hbCBkZXNjcmlwdG9yczoKKyAqCisgKiAgICAgU0lHX0VYUFJfREVDTChST01EOCwgUk9NMTZTLCBTSUdfREVTQ19TRVQoSFdfU1RSQVAxLCA0KSwKKyAqICAgICAgICAgICAgICB7IEhXX1NUUkFQMSwgR0VOTUFTSygxLCAwKSwgMCwgMCB9KTsKKyAqLworI2RlZmluZSBTSUdfRVhQUl9ERUNMKHNpZywgZnVuYywgLi4uKSBcCisJU0lHX0RFU0NfTElTVF9ERUNMKHNpZywgZnVuYywgX19WQV9BUkdTX18pOyBcCisJU0lHX0VYUFJfREVDTF8oc2lnLCBmdW5jKQorCisvKioKKyAqIERlY2xhcmUgYSBwb2ludGVyIHRvIGEgc2lnbmFsIGV4cHJlc3Npb24KKyAqCisgKiBAc2lnOiBUaGUgbWFjcm8gc3ltYm9sIG5hbWUgZm9yIHRoZSBzaWduYWwgKHN1YmplY3RlZCB0byB0b2tlbiBwYXN0aW5nKQorICogQGZ1bmM6IFRoZSBtYWNybyBzeW1ib2wgbmFtZSBmb3IgdGhlIGZ1bmN0aW9uIChzdWJqZWN0ZWQgdG8gdG9rZW4gcGFzdGluZykKKyAqLworI2RlZmluZSBTSUdfRVhQUl9QVFIoc2lnLCBmdW5jKSAoJlNJR19FWFBSX1NZTShzaWcsIGZ1bmMpKQorCisjZGVmaW5lIFNJR19FWFBSX0xJU1RfU1lNKHNpZykgc2lnX2V4cHJzXyAjIyBzaWcKKworLyoqCisgKiBEZWNsYXJlIGEgc2lnbmFsIGV4cHJlc3Npb24gbGlzdCBmb3IgcmVmZXJlbmNlIGluIGEgc3RydWN0IGFzcGVlZF9waW5fcHJpby4KKyAqCisgKiBAc2lnOiBBIG1hY3JvIHN5bWJvbCBuYW1lIGZvciB0aGUgc2lnbmFsIChpcyBzdWJqZWN0ZWQgdG8gdG9rZW4gcGFzdGluZykKKyAqIEAuLi46IFNpZ25hbCBleHByZXNzaW9uIHN0cnVjdHVyZSBwb2ludGVycyAodXNlIFNJR19FWFBSX1BUUigpKQorICoKKyAqIEZvciBleGFtcGxlLCB0aGUgMTYtYml0IFJPTSBidXMgY2FuIGJlIGVuYWJsZWQgYnkgb25lIG9mIHR3byBwb3NzaWJsZSBzaWduYWwKKyAqIGV4cHJlc3Npb25zOgorICoKKyAqICAgICBTSUdfRVhQUl9ERUNMKFJPTUQ4LCBST00xNiwgU0lHX0RFU0NfU0VUKFNDVTkwLCA2KSk7CisgKiAgICAgU0lHX0VYUFJfREVDTChST01EOCwgUk9NMTZTLCBTSUdfREVTQ19TRVQoSFdfU1RSQVAxLCA0KSwKKyAqICAgICAgICAgICAgICB7IEhXX1NUUkFQMSwgR0VOTUFTSygxLCAwKSwgMCwgMCB9KTsKKyAqICAgICBTSUdfRVhQUl9MSVNUX0RFQ0woUk9NRDgsIFNJR19FWFBSX1BUUihST01EOCwgUk9NMTYpLAorICogICAgICAgICAgICAgIFNJR19FWFBSX1BUUihST01EOCwgUk9NMTZTKSk7CisgKi8KKyNkZWZpbmUgU0lHX0VYUFJfTElTVF9ERUNMKHNpZywgLi4uKSBcCisJc3RhdGljIGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKlNJR19FWFBSX0xJU1RfU1lNKHNpZylbXSA9IFwKKwkJeyBfX1ZBX0FSR1NfXywgTlVMTCB9CisKKy8qKgorICogQSBzaG9ydC1oYW5kIG1hY3JvIGZvciBkZWNsYXJpbmcgYSBmdW5jdGlvbiBleHByZXNzaW9uIGFuZCBhbiBleHByZXNzaW9uCisgKiBsaXN0IHdpdGggYSBzaW5nbGUgZnVuY3Rpb24uCisgKgorICogQGZ1bmM6IEEgbWFjcm8gc3ltYm9sIG5hbWUgZm9yIHRoZSBmdW5jdGlvbiAoaXMgc3ViamVjdGVkIHRvIHRva2VuIHBhc3RpbmcpCisgKiBALi4uOiBGdW5jdGlvbiBkZXNjcmlwdG9ycyB0aGF0IGRlZmluZSB0aGUgZnVuY3Rpb24gZXhwcmVzc2lvbgorICoKKyAqIEZvciBleGFtcGxlLCBzaWduYWwgTkNUUzYgcGFydGljaXBhdGVzIGluIGl0cyBvd24gZnVuY3Rpb24gd2l0aCBvbmUgZ3JvdXA6CisgKgorICogICAgIFNJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkNUUzYsIE5DVFM2LCBTSUdfREVTQ19TRVQoU0NVOTAsIDcpKTsKKyAqLworI2RlZmluZSBTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKHNpZywgZnVuYywgLi4uKSBcCisJU0lHX0RFU0NfTElTVF9ERUNMKHNpZywgZnVuYywgX19WQV9BUkdTX18pOyBcCisJU0lHX0VYUFJfREVDTF8oc2lnLCBmdW5jKTsgXAorCVNJR19FWFBSX0xJU1RfREVDTChzaWcsIFNJR19FWFBSX1BUUihzaWcsIGZ1bmMpKQorCisjZGVmaW5lIFNJR19FWFBSX0xJU1RfREVDTF9EVUFMKHNpZywgZjAsIGYxKSBcCisJU0lHX0VYUFJfTElTVF9ERUNMKHNpZywgU0lHX0VYUFJfUFRSKHNpZywgZjApLCBTSUdfRVhQUl9QVFIoc2lnLCBmMSkpCisKKyNkZWZpbmUgU0lHX0VYUFJfTElTVF9QVFIoc2lnKSAoJlNJR19FWFBSX0xJU1RfU1lNKHNpZylbMF0pCisKKyNkZWZpbmUgUElOX0VYUFJTX1NZTShwaW4pIHBpbl9leHByc18gIyMgcGluCisjZGVmaW5lIFBJTl9FWFBSU19QVFIocGluKSAoJlBJTl9FWFBSU19TWU0ocGluKVswXSkKKyNkZWZpbmUgUElOX1NZTShwaW4pIHBpbl8gIyMgcGluCisKKyNkZWZpbmUgTVNfUElOX0RFQ0xfKHBpbiwgLi4uKSBcCisJc3RhdGljIGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKipQSU5fRVhQUlNfU1lNKHBpbilbXSA9IFwKKwkJeyBfX1ZBX0FSR1NfXywgTlVMTCB9OyBcCisJc3RhdGljIGNvbnN0IHN0cnVjdCBhc3BlZWRfcGluX2Rlc2MgUElOX1NZTShwaW4pID0gXAorCQl7ICNwaW4sIFBJTl9FWFBSU19QVFIocGluKSB9CisKKy8qKgorICogRGVjbGFyZSBhIG11bHRpLXNpZ25hbCBwaW4KKyAqCisgKiBAcGluOiBUaGUgcGluIG51bWJlcgorICogQG90aGVyOiBNYWNybyBuYW1lIGZvciAib3RoZXIiIGZ1bmN0aW9uYWxpdHkgKHN1YmplY3RlZCB0byBzdHJpbmdpZmljYXRpb24pCisgKiBAaGlnaDogTWFjcm8gbmFtZSBmb3IgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgc2lnbmFsIGZ1bmN0aW9ucworICogQGxvdzogTWFjcm8gbmFtZSBmb3IgdGhlIGxvdyBzaWduYWwgZnVuY3Rpb25zCisgKgorICogRm9yIGV4YW1wbGU6CisgKgorICogICAgICNkZWZpbmUgQTggNTYKKyAqICAgICBTSUdfRVhQUl9ERUNMKFJPTUQ4LCBST00xNiwgU0lHX0RFU0NfU0VUKFNDVTkwLCA2KSk7CisgKiAgICAgU0lHX0VYUFJfREVDTChST01EOCwgUk9NMTZTLCBTSUdfREVTQ19TRVQoSFdfU1RSQVAxLCA0KSwKKyAqICAgICAgICAgICAgICB7IEhXX1NUUkFQMSwgR0VOTUFTSygxLCAwKSwgMCwgMCB9KTsKKyAqICAgICBTSUdfRVhQUl9MSVNUX0RFQ0woUk9NRDgsIFNJR19FWFBSX1BUUihST01EOCwgUk9NMTYpLAorICogICAgICAgICAgICAgIFNJR19FWFBSX1BUUihST01EOCwgUk9NMTZTKSk7CisgKiAgICAgU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShOQ1RTNiwgTkNUUzYsIFNJR19ERVNDX1NFVChTQ1U5MCwgNykpOworICogICAgIE1TX1BJTl9ERUNMKEE4LCBHUElPSDAsIFJPTUQ4LCBOQ1RTNik7CisgKi8KKyNkZWZpbmUgTVNfUElOX0RFQ0wocGluLCBvdGhlciwgaGlnaCwgbG93KSBcCisJU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShvdGhlciwgb3RoZXIpOyBcCisJTVNfUElOX0RFQ0xfKHBpbiwgXAorCQkJU0lHX0VYUFJfTElTVF9QVFIoaGlnaCksIFwKKwkJCVNJR19FWFBSX0xJU1RfUFRSKGxvdyksIFwKKwkJCVNJR19FWFBSX0xJU1RfUFRSKG90aGVyKSkKKworI2RlZmluZSBQSU5fR1JPVVBfU1lNKGZ1bmMpIHBpbnNfICMjIGZ1bmMKKyNkZWZpbmUgRlVOQ19HUk9VUF9TWU0oZnVuYykgZ3JvdXBzXyAjIyBmdW5jCisjZGVmaW5lIEZVTkNfR1JPVVBfREVDTChmdW5jLCAuLi4pIFwKKwlzdGF0aWMgY29uc3QgaW50IFBJTl9HUk9VUF9TWU0oZnVuYylbXSA9IHsgX19WQV9BUkdTX18gfTsgXAorCXN0YXRpYyBjb25zdCBjaGFyICpGVU5DX0dST1VQX1NZTShmdW5jKVtdID0geyAjZnVuYyB9CisKKy8qKgorICogRGVjbGFyZSBhIHNpbmdsZSBzaWduYWwgcGluCisgKgorICogQHBpbjogVGhlIHBpbiBudW1iZXIKKyAqIEBvdGhlcjogTWFjcm8gbmFtZSBmb3IgIm90aGVyIiBmdW5jdGlvbmFsaXR5IChzdWJqZWN0ZWQgdG8gc3RyaW5naWZpY2F0aW9uKQorICogQHNpZzogTWFjcm8gbmFtZSBmb3IgdGhlIHNpZ25hbCAoc3ViamVjdGVkIHRvIHN0cmluZ2lmaWNhdGlvbikKKyAqCisgKiBGb3IgZXhhbXBsZToKKyAqCisgKiAgICAgI2RlZmluZSBFMyA4MAorICogICAgIFNJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMNSwgSTJDNSwgSTJDNV9ERVNDKTsKKyAqICAgICBTU19QSU5fREVDTChFMywgR1BJT0swLCBTQ0w1KTsKKyAqLworI2RlZmluZSBTU19QSU5fREVDTChwaW4sIG90aGVyLCBzaWcpIFwKKwlTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKG90aGVyLCBvdGhlcik7IFwKKwlNU19QSU5fREVDTF8ocGluLCBTSUdfRVhQUl9MSVNUX1BUUihzaWcpLCBTSUdfRVhQUl9MSVNUX1BUUihvdGhlcikpCisKKy8qKgorICogU2luZ2xlIHNpZ25hbCwgc2luZ2xlIGZ1bmN0aW9uIHBpbiBkZWNsYXJhdGlvbgorICoKKyAqIEBwaW46IFRoZSBwaW4gbnVtYmVyCisgKiBAb3RoZXI6IE1hY3JvIG5hbWUgZm9yICJvdGhlciIgZnVuY3Rpb25hbGl0eSAoc3ViamVjdGVkIHRvIHN0cmluZ2lmaWNhdGlvbikKKyAqIEBzaWc6IE1hY3JvIG5hbWUgZm9yIHRoZSBzaWduYWwgKHN1YmplY3RlZCB0byBzdHJpbmdpZmljYXRpb24pCisgKiBALi4uOiBTaWduYWwgZGVzY3JpcHRvcnMgdGhhdCBkZWZpbmUgdGhlIGZ1bmN0aW9uIGV4cHJlc3Npb24KKyAqCisgKiBGb3IgZXhhbXBsZToKKyAqCisgKiAgICBTU1NGX1BJTl9ERUNMKEE0LCBHUElPQTIsIFRJTUVSMywgU0lHX0RFU0NfU0VUKFNDVTgwLCAyKSk7CisgKi8KKyNkZWZpbmUgU1NTRl9QSU5fREVDTChwaW4sIG90aGVyLCBzaWcsIC4uLikgXAorCVNJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoc2lnLCBzaWcsIF9fVkFfQVJHU19fKTsgXAorCVNJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUob3RoZXIsIG90aGVyKTsgXAorCU1TX1BJTl9ERUNMXyhwaW4sIFNJR19FWFBSX0xJU1RfUFRSKHNpZyksIFNJR19FWFBSX0xJU1RfUFRSKG90aGVyKSk7IFwKKwlGVU5DX0dST1VQX0RFQ0woc2lnLCBwaW4pCisKKyNkZWZpbmUgR1BJT19QSU5fREVDTChwaW4sIGdwaW8pIFwKKwlTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKGdwaW8sIGdwaW8pOyBcCisJTVNfUElOX0RFQ0xfKHBpbiwgU0lHX0VYUFJfTElTVF9QVFIoZ3BpbykpCisKK3N0cnVjdCBhc3BlZWRfcGluY3RybF9kYXRhIHsKKwlzdHJ1Y3QgcmVnbWFwICptYXA7CisKKwljb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyAqcGluczsKKwljb25zdCB1bnNpZ25lZCBpbnQgbnBpbnM7CisKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX3Bpbl9ncm91cCAqZ3JvdXBzOworCWNvbnN0IHVuc2lnbmVkIGludCBuZ3JvdXBzOworCisJY29uc3Qgc3RydWN0IGFzcGVlZF9waW5fZnVuY3Rpb24gKmZ1bmN0aW9uczsKKwljb25zdCB1bnNpZ25lZCBpbnQgbmZ1bmN0aW9uczsKK307CisKKyNkZWZpbmUgQVNQRUVEX1BJTkNUUkxfUElOKG5hbWVfKSBcCisJW25hbWVfXSA9IHsgXAorCQkubnVtYmVyID0gbmFtZV8sIFwKKwkJLm5hbWUgPSAjbmFtZV8sIFwKKwkJLmRydl9kYXRhID0gKHZvaWQgKikgJihQSU5fU1lNKG5hbWVfKSkgXAorCX0KKworc3RydWN0IGFzcGVlZF9waW5fZ3JvdXAgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgdW5zaWduZWQgaW50ICpwaW5zOworCWNvbnN0IHVuc2lnbmVkIGludCBucGluczsKK307CisKKyNkZWZpbmUgQVNQRUVEX1BJTkNUUkxfR1JPVVAobmFtZV8pIHsgXAorCS5uYW1lID0gI25hbWVfLCBcCisJLnBpbnMgPSAmKFBJTl9HUk9VUF9TWU0obmFtZV8pKVswXSwgXAorCS5ucGlucyA9IEFSUkFZX1NJWkUoUElOX0dST1VQX1NZTShuYW1lXykpLCBcCit9CisKK3N0cnVjdCBhc3BlZWRfcGluX2Z1bmN0aW9uIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKmNvbnN0ICpncm91cHM7CisJdW5zaWduZWQgaW50IG5ncm91cHM7Cit9OworCisjZGVmaW5lIEFTUEVFRF9QSU5DVFJMX0ZVTkMobmFtZV8sIC4uLikgeyBcCisJLm5hbWUgPSAjbmFtZV8sIFwKKwkuZ3JvdXBzID0gJkZVTkNfR1JPVVBfU1lNKG5hbWVfKVswXSwgXAorCS5uZ3JvdXBzID0gQVJSQVlfU0laRShGVU5DX0dST1VQX1NZTShuYW1lXykpLCBcCit9CisKK2ludCBhc3BlZWRfcGluY3RybF9nZXRfZ3JvdXBzX2NvdW50KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldik7Citjb25zdCBjaGFyICphc3BlZWRfcGluY3RybF9nZXRfZ3JvdXBfbmFtZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCXVuc2lnbmVkIGludCBncm91cCk7CitpbnQgYXNwZWVkX3BpbmN0cmxfZ2V0X2dyb3VwX3BpbnMoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQl1bnNpZ25lZCBpbnQgZ3JvdXAsIGNvbnN0IHVuc2lnbmVkIGludCAqKnBpbnMsCisJCXVuc2lnbmVkIGludCAqbnBpbnMpOwordm9pZCBhc3BlZWRfcGluY3RybF9waW5fZGJnX3Nob3coc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQlzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHVuc2lnbmVkIGludCBvZmZzZXQpOworaW50IGFzcGVlZF9waW5tdXhfZ2V0X2ZuX2NvdW50KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldik7Citjb25zdCBjaGFyICphc3BlZWRfcGlubXV4X2dldF9mbl9uYW1lKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJdW5zaWduZWQgaW50IGZ1bmN0aW9uKTsKK2ludCBhc3BlZWRfcGlubXV4X2dldF9mbl9ncm91cHMoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQl1bnNpZ25lZCBpbnQgZnVuY3Rpb24sIGNvbnN0IGNoYXIgKiBjb25zdCAqKmdyb3VwcywKKwkJdW5zaWduZWQgaW50ICogY29uc3QgbnVtX2dyb3Vwcyk7CitpbnQgYXNwZWVkX3Bpbm11eF9zZXRfbXV4KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwgdW5zaWduZWQgaW50IGZ1bmN0aW9uLAorCQl1bnNpZ25lZCBpbnQgZ3JvdXApOworaW50IGFzcGVlZF9ncGlvX3JlcXVlc3RfZW5hYmxlKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJc3RydWN0IHBpbmN0cmxfZ3Bpb19yYW5nZSAqcmFuZ2UsCisJCXVuc2lnbmVkIGludCBvZmZzZXQpOworaW50IGFzcGVlZF9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCXN0cnVjdCBwaW5jdHJsX2Rlc2MgKnBkZXNjLAorCQlzdHJ1Y3QgYXNwZWVkX3BpbmN0cmxfZGF0YSAqcGRhdGEpOworCisjZW5kaWYgLyogUElOQ1RSTF9BU1BFRUQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1iY20yODF4eC5jIGIvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLWJjbTI4MXh4LmMKaW5kZXggNTgyZjZkZi4uYTUzMzFmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLWJjbTI4MXh4LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLWJjbTI4MXh4LmMKQEAgLTEwMTgsNyArMTAxOCw3IEBACiAJc2VxX3ByaW50ZihzLCAiICVzIiwgZGV2X25hbWUocGN0bGRldi0+ZGV2KSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGluY3RybF9vcHMgYmNtMjgxeHhfcGluY3RybF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmN0cmxfb3BzIGJjbTI4MXh4X3BpbmN0cmxfb3BzID0gewogCS5nZXRfZ3JvdXBzX2NvdW50ID0gYmNtMjgxeHhfcGluY3RybF9nZXRfZ3JvdXBzX2NvdW50LAogCS5nZXRfZ3JvdXBfbmFtZSA9IGJjbTI4MXh4X3BpbmN0cmxfZ2V0X2dyb3VwX25hbWUsCiAJLmdldF9ncm91cF9waW5zID0gYmNtMjgxeHhfcGluY3RybF9nZXRfZ3JvdXBfcGlucywKQEAgLTEwODAsNyArMTA4MCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgc3RydWN0IHBpbm11eF9vcHMgYmNtMjgxeHhfcGluY3RybF9waW5tdXhfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5tdXhfb3BzIGJjbTI4MXh4X3BpbmN0cmxfcGlubXV4X29wcyA9IHsKIAkuZ2V0X2Z1bmN0aW9uc19jb3VudCA9IGJjbTI4MXh4X3BpbmN0cmxfZ2V0X2ZjbnNfY291bnQsCiAJLmdldF9mdW5jdGlvbl9uYW1lID0gYmNtMjgxeHhfcGluY3RybF9nZXRfZmNuX25hbWUsCiAJLmdldF9mdW5jdGlvbl9ncm91cHMgPSBiY20yODF4eF9waW5jdHJsX2dldF9mY25fZ3JvdXBzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLW5zMi1tdXguYyBiL2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1uczItbXV4LmMKaW5kZXggY2E4MTc4OS4uMTNhNGMyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLW5zMi1tdXguYworKysgYi9kcml2ZXJzL3BpbmN0cmwvYmNtL3BpbmN0cmwtbnMyLW11eC5jCkBAIC01MzEsNyArNTMxLDcgQEAKIAlzZXFfcHJpbnRmKHMsICIgJXMiLCBkZXZfbmFtZShwY3RybF9kZXYtPmRldikpOwogfQogCi1zdGF0aWMgc3RydWN0IHBpbmN0cmxfb3BzIG5zMl9waW5jdHJsX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9vcHMgbnMyX3BpbmN0cmxfb3BzID0gewogCS5nZXRfZ3JvdXBzX2NvdW50ID0gbnMyX2dldF9ncm91cHNfY291bnQsCiAJLmdldF9ncm91cF9uYW1lID0gbnMyX2dldF9ncm91cF9uYW1lLAogCS5nZXRfZ3JvdXBfcGlucyA9IG5zMl9nZXRfZ3JvdXBfcGlucywKQEAgLTk1OSw3ICs5NTksNyBAQAogb3V0OgogCXJldHVybiByZXQ7CiB9Ci1zdGF0aWMgc3RydWN0IHBpbm11eF9vcHMgbnMyX3Bpbm11eF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbm11eF9vcHMgbnMyX3Bpbm11eF9vcHMgPSB7CiAJLmdldF9mdW5jdGlvbnNfY291bnQgPSBuczJfZ2V0X2Z1bmN0aW9uc19jb3VudCwKIAkuZ2V0X2Z1bmN0aW9uX25hbWUgPSBuczJfZ2V0X2Z1bmN0aW9uX25hbWUsCiAJLmdldF9mdW5jdGlvbl9ncm91cHMgPSBuczJfZ2V0X2Z1bmN0aW9uX2dyb3VwcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1uc3AtbXV4LmMgYi9kcml2ZXJzL3BpbmN0cmwvYmNtL3BpbmN0cmwtbnNwLW11eC5jCmluZGV4IDQxNDlkYjMuLjM1YzE3NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1uc3AtbXV4LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLW5zcC1tdXguYwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJc2VxX3ByaW50ZihzLCAiICVzIiwgZGV2X25hbWUocGN0cmxfZGV2LT5kZXYpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwaW5jdHJsX29wcyBuc3BfcGluY3RybF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmN0cmxfb3BzIG5zcF9waW5jdHJsX29wcyA9IHsKIAkuZ2V0X2dyb3Vwc19jb3VudCA9IG5zcF9nZXRfZ3JvdXBzX2NvdW50LAogCS5nZXRfZ3JvdXBfbmFtZSA9IG5zcF9nZXRfZ3JvdXBfbmFtZSwKIAkuZ2V0X2dyb3VwX3BpbnMgPSBuc3BfZ2V0X2dyb3VwX3BpbnMsCkBAIC01MTgsNyArNTE4LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaW5jdHJsLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGlubXV4X29wcyBuc3BfcGlubXV4X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGlubXV4X29wcyBuc3BfcGlubXV4X29wcyA9IHsKIAkuZ2V0X2Z1bmN0aW9uc19jb3VudCA9IG5zcF9nZXRfZnVuY3Rpb25zX2NvdW50LAogCS5nZXRfZnVuY3Rpb25fbmFtZSA9IG5zcF9nZXRfZnVuY3Rpb25fbmFtZSwKIAkuZ2V0X2Z1bmN0aW9uX2dyb3VwcyA9IG5zcF9nZXRfZnVuY3Rpb25fZ3JvdXBzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL2ZyZWVzY2FsZS9waW5jdHJsLWlteC5jIGIvZHJpdmVycy9waW5jdHJsL2ZyZWVzY2FsZS9waW5jdHJsLWlteC5jCmluZGV4IDcxMzkxNzUuLjQ3NjEzMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9mcmVlc2NhbGUvcGluY3RybC1pbXguYworKysgYi9kcml2ZXJzL3BpbmN0cmwvZnJlZXNjYWxlL3BpbmN0cmwtaW14LmMKQEAgLTMxNSw3ICszMTUsNyBAQAogCiAJLyogQ3VycmVudGx5IGltcGxlbWVudGF0aW9uIG9ubHkgZm9yIHNoYXJlZCBtdXgvY29uZiByZWdpc3RlciAqLwogCWlmICghKGluZm8tPmZsYWdzICYgU0hBUkVfTVVYX0NPTkZfUkVHKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOwogCiAJcGluX3JlZyA9ICZpbmZvLT5waW5fcmVnc1tvZmZzZXRdOwogCWlmIChwaW5fcmVnLT5tdXhfcmVnID09IC0xKQpAQCAtMzgwLDcgKzM4MCw3IEBACiAJICogVGhleSBhcmUgcGFydCBvZiB0aGUgc2hhcmVkIG11eC9jb25mIHJlZ2lzdGVyLgogCSAqLwogCWlmICghKGluZm8tPmZsYWdzICYgU0hBUkVfTVVYX0NPTkZfUkVHKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOwogCiAJcGluX3JlZyA9ICZpbmZvLT5waW5fcmVnc1tvZmZzZXRdOwogCWlmIChwaW5fcmVnLT5tdXhfcmVnID09IC0xKQpAQCAtNTAxLDcgKzUwMSw3IEBACiAJCXJldCA9IGlteF9waW5jb25mX2dldChwY3RsZGV2LCBwaW4tPnBpbiwgJmNvbmZpZyk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm47Ci0JCXNlcV9wcmludGYocywgIiVzOiAweCVseCIsIG5hbWUsIGNvbmZpZyk7CisJCXNlcV9wcmludGYocywgIiAgJXM6IDB4JWx4XG4iLCBuYW1lLCBjb25maWcpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtY2hlcnJ5dmlldy5jIGIvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtY2hlcnJ5dmlldy5jCmluZGV4IDU3NDlhNGVlLi4zMDM4OWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvcGluY3RybC1jaGVycnl2aWV3LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtY2hlcnJ5dmlldy5jCkBAIC0xMzQsNiArMTM0LDcgQEAKICAqIEBncGlvX3JhbmdlczogQW4gYXJyYXkgb2YgR1BJTyByYW5nZXMgaW4gdGhpcyBjb21tdW5pdHkKICAqIEBuZ3Bpb19yYW5nZXM6IE51bWJlciBvZiBHUElPIHJhbmdlcwogICogQG5ncGlvczogVG90YWwgbnVtYmVyIG9mIEdQSU9zIGluIHRoaXMgY29tbXVuaXR5CisgKiBAbmlycXM6IFRvdGFsIG51bWJlciBvZiBJUlFzIHRoaXMgY29tbXVuaXR5IGNhbiBnZW5lcmF0ZQogICovCiBzdHJ1Y3QgY2h2X2NvbW11bml0eSB7CiAJY29uc3QgY2hhciAqdWlkOwpAQCAtMTQ2LDYgKzE0Nyw3IEBACiAJY29uc3Qgc3RydWN0IGNodl9ncGlvX3BpbnJhbmdlICpncGlvX3JhbmdlczsKIAlzaXplX3QgbmdwaW9fcmFuZ2VzOwogCXNpemVfdCBuZ3Bpb3M7CisJc2l6ZV90IG5pcnFzOwogfTsKIAogc3RydWN0IGNodl9waW5fY29udGV4dCB7CkBAIC0zOTYsNiArMzk4LDEyIEBACiAJLmdwaW9fcmFuZ2VzID0gc291dGh3ZXN0X2dwaW9fcmFuZ2VzLAogCS5uZ3Bpb19yYW5nZXMgPSBBUlJBWV9TSVpFKHNvdXRod2VzdF9ncGlvX3JhbmdlcyksCiAJLm5ncGlvcyA9IEFSUkFZX1NJWkUoc291dGh3ZXN0X3BpbnMpLAorCS8qCisJICogU291dGh3ZXN0IGNvbW11bml0eSBjYW4gYmVuZXJhdGUgR1BJTyBpbnRlcnJ1cHRzIG9ubHkgZm9yIHRoZQorCSAqIGZpcnN0IDggaW50ZXJydXB0cy4gVGhlIHVwcGVyIGhhbGYgKDgtMTUpIGNhbiBvbmx5IGJlIHVzZWQgdG8KKwkgKiB0cmlnZ2VyIEdQRXMuCisJICovCisJLm5pcnFzID0gOCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyBub3J0aF9waW5zW10gPSB7CkBAIC00NzksNiArNDg3LDEyIEBACiAJLmdwaW9fcmFuZ2VzID0gbm9ydGhfZ3Bpb19yYW5nZXMsCiAJLm5ncGlvX3JhbmdlcyA9IEFSUkFZX1NJWkUobm9ydGhfZ3Bpb19yYW5nZXMpLAogCS5uZ3Bpb3MgPSBBUlJBWV9TSVpFKG5vcnRoX3BpbnMpLAorCS8qCisJICogTm9ydGggY29tbXVuaXR5IGNhbiBiZW5lcmF0ZSBHUElPIGludGVycnVwdHMgb25seSBmb3IgdGhlIGZpcnN0CisJICogOCBpbnRlcnJ1cHRzLiBUaGUgdXBwZXIgaGFsZiAoOC0xNSkgY2FuIG9ubHkgYmUgdXNlZCB0byB0cmlnZ2VyCisJICogR1BFcy4KKwkgKi8KKwkubmlycXMgPSA4LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjIGVhc3RfcGluc1tdID0gewpAQCAtNTIxLDYgKzUzNSw3IEBACiAJLmdwaW9fcmFuZ2VzID0gZWFzdF9ncGlvX3JhbmdlcywKIAkubmdwaW9fcmFuZ2VzID0gQVJSQVlfU0laRShlYXN0X2dwaW9fcmFuZ2VzKSwKIAkubmdwaW9zID0gQVJSQVlfU0laRShlYXN0X3BpbnMpLAorCS5uaXJxcyA9IDE2LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjIHNvdXRoZWFzdF9waW5zW10gPSB7CkBAIC02NDYsNiArNjYxLDcgQEAKIAkuZ3Bpb19yYW5nZXMgPSBzb3V0aGVhc3RfZ3Bpb19yYW5nZXMsCiAJLm5ncGlvX3JhbmdlcyA9IEFSUkFZX1NJWkUoc291dGhlYXN0X2dwaW9fcmFuZ2VzKSwKIAkubmdwaW9zID0gQVJSQVlfU0laRShzb3V0aGVhc3RfcGlucyksCisJLm5pcnFzID0gMTYsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNodl9jb21tdW5pdHkgKmNodl9jb21tdW5pdGllc1tdID0gewpAQCAtMTQ5Nyw3ICsxNTEzLDcgQEAKIAljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKIAogCXBlbmRpbmcgPSByZWFkbChwY3RybC0+cmVncyArIENIVl9JTlRTVEFUKTsKLQlmb3JfZWFjaF9zZXRfYml0KGludHJfbGluZSwgJnBlbmRpbmcsIDE2KSB7CisJZm9yX2VhY2hfc2V0X2JpdChpbnRyX2xpbmUsICZwZW5kaW5nLCBwY3RybC0+Y29tbXVuaXR5LT5uaXJxcykgewogCQl1bnNpZ25lZCBpcnEsIG9mZnNldDsKIAogCQlvZmZzZXQgPSBwY3RybC0+aW50cl9saW5lc1tpbnRyX2xpbmVdOwpAQCAtMTUyMCw4ICsxNTM2LDkgQEAKIAljaGlwLT5sYWJlbCA9IGRldl9uYW1lKHBjdHJsLT5kZXYpOwogCWNoaXAtPnBhcmVudCA9IHBjdHJsLT5kZXY7CiAJY2hpcC0+YmFzZSA9IC0xOworCWNoaXAtPmlycV9uZWVkX3ZhbGlkX21hc2sgPSB0cnVlOwogCi0JcmV0ID0gZ3Bpb2NoaXBfYWRkX2RhdGEoY2hpcCwgcGN0cmwpOworCXJldCA9IGRldm1fZ3Bpb2NoaXBfYWRkX2RhdGEocGN0cmwtPmRldiwgY2hpcCwgcGN0cmwpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihwY3RybC0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGdwaW9jaGlwXG4iKTsKIAkJcmV0dXJuIHJldDsKQEAgLTE1MzMsMzEgKzE1NTAsNDAgQEAKIAkJCQkJICAgICByYW5nZS0+YmFzZSwgcmFuZ2UtPm5waW5zKTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2VycihwY3RybC0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBHUElPIHBpbiByYW5nZVxuIik7Ci0JCQlnb3RvIGZhaWw7CisJCQlyZXR1cm4gcmV0OwogCQl9CiAKIAkJb2Zmc2V0ICs9IHJhbmdlLT5ucGluczsKIAl9CiAKLQkvKiBNYXNrIGFuZCBjbGVhciBhbGwgaW50ZXJydXB0cyAqLwotCWNodl93cml0ZWwoMCwgcGN0cmwtPnJlZ3MgKyBDSFZfSU5UTUFTSyk7CisJLyogRG8gbm90IGFkZCBHUElPcyB0aGF0IGNhbiBvbmx5IGdlbmVyYXRlIEdQRXMgdG8gdGhlIElSUSBkb21haW4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGN0cmwtPmNvbW11bml0eS0+bnBpbnM7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyAqZGVzYzsKKwkJdTMyIGludHNlbDsKKworCQlkZXNjID0gJnBjdHJsLT5jb21tdW5pdHktPnBpbnNbaV07CisKKwkJaW50c2VsID0gcmVhZGwoY2h2X3BhZHJlZyhwY3RybCwgZGVzYy0+bnVtYmVyLCBDSFZfUEFEQ1RSTDApKTsKKwkJaW50c2VsICY9IENIVl9QQURDVFJMMF9JTlRTRUxfTUFTSzsKKwkJaW50c2VsID4+PSBDSFZfUEFEQ1RSTDBfSU5UU0VMX1NISUZUOworCisJCWlmIChpbnRzZWwgPj0gcGN0cmwtPmNvbW11bml0eS0+bmlycXMpCisJCQljbGVhcl9iaXQoaSwgY2hpcC0+aXJxX3ZhbGlkX21hc2spOworCX0KKworCS8qIENsZWFyIGFsbCBpbnRlcnJ1cHRzICovCiAJY2h2X3dyaXRlbCgweGZmZmYsIHBjdHJsLT5yZWdzICsgQ0hWX0lOVFNUQVQpOwogCiAJcmV0ID0gZ3Bpb2NoaXBfaXJxY2hpcF9hZGQoY2hpcCwgJmNodl9ncGlvX2lycWNoaXAsIDAsCi0JCQkJICAgaGFuZGxlX3NpbXBsZV9pcnEsIElSUV9UWVBFX05PTkUpOworCQkJCSAgIGhhbmRsZV9iYWRfaXJxLCBJUlFfVFlQRV9OT05FKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIocGN0cmwtPmRldiwgImZhaWxlZCB0byBhZGQgSVJRIGNoaXBcbiIpOwotCQlnb3RvIGZhaWw7CisJCXJldHVybiByZXQ7CiAJfQogCiAJZ3Bpb2NoaXBfc2V0X2NoYWluZWRfaXJxY2hpcChjaGlwLCAmY2h2X2dwaW9faXJxY2hpcCwgaXJxLAogCQkJCSAgICAgY2h2X2dwaW9faXJxX2hhbmRsZXIpOwogCXJldHVybiAwOwotCi1mYWlsOgotCWdwaW9jaGlwX3JlbW92ZShjaGlwKTsKLQotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgY2h2X3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTE2MjUsMTUgKzE2NTEsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNodl9waW5jdHJsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBjaHZfcGluY3RybCAqcGN0cmwgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWdwaW9jaGlwX3JlbW92ZSgmcGN0cmwtPmNoaXApOwotCi0JcmV0dXJuIDA7Ci19Ci0KICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIHN0YXRpYyBpbnQgY2h2X3BpbmN0cmxfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC0xNzMwLDcgKzE3NDcsNiBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjaHZfcGluY3RybF9kcml2ZXIgPSB7CiAJLnByb2JlID0gY2h2X3BpbmN0cmxfcHJvYmUsCi0JLnJlbW92ZSA9IGNodl9waW5jdHJsX3JlbW92ZSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJjaGVycnl2aWV3LXBpbmN0cmwiLAogCQkucG0gPSAmY2h2X3BpbmN0cmxfcG1fb3BzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtaW50ZWwuYyBiL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLWludGVsLmMKaW5kZXggMjU3Y2FiMS4uNjMzODdhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtaW50ZWwuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvcGluY3RybC1pbnRlbC5jCkBAIC04Niw2ICs4Niw3IEBACiAgKiBAY29tbXVuaXRpZXM6IEFsbCBjb21tdW5pdGllcyBpbiB0aGlzIHBpbiBjb250cm9sbGVyCiAgKiBAbmNvbW11bml0aWVzOiBOdW1iZXIgb2YgY29tbXVuaXRpZXMgaW4gdGhpcyBwaW4gY29udHJvbGxlcgogICogQGNvbnRleHQ6IENvbmZpZ3VyYXRpb24gc2F2ZWQgb3ZlciBzeXN0ZW0gc2xlZXAKKyAqIEBpcnE6IHBpbmN0cmwvR1BJTyBjaGlwIGlycSBudW1iZXIKICAqLwogc3RydWN0IGludGVsX3BpbmN0cmwgewogCXN0cnVjdCBkZXZpY2UgKmRldjsKQEAgLTk3LDYgKzk4LDcgQEAKIAlzdHJ1Y3QgaW50ZWxfY29tbXVuaXR5ICpjb21tdW5pdGllczsKIAlzaXplX3QgbmNvbW11bml0aWVzOwogCXN0cnVjdCBpbnRlbF9waW5jdHJsX2NvbnRleHQgY29udGV4dDsKKwlpbnQgaXJxOwogfTsKIAogI2RlZmluZSBwaW5fdG9fcGFkbm8oYywgcCkJKChwKSAtIChjKS0+cGluX2Jhc2UpCkBAIC03OTMsMzggKzc5NSwxMiBAQAogewogCXN0cnVjdCBncGlvX2NoaXAgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CiAJc3RydWN0IGludGVsX3BpbmN0cmwgKnBjdHJsID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOwotCWNvbnN0IHN0cnVjdCBpbnRlbF9jb21tdW5pdHkgKmNvbW11bml0eTsKIAl1bnNpZ25lZCBwaW4gPSBpcnFkX3RvX2h3aXJxKGQpOwotCXVuc2lnbmVkIHBhZG5vLCBncHAsIGdwcF9vZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgZ3BlX2VuOwogCi0JY29tbXVuaXR5ID0gaW50ZWxfZ2V0X2NvbW11bml0eShwY3RybCwgcGluKTsKLQlpZiAoIWNvbW11bml0eSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7Ci0KLQlwYWRubyA9IHBpbl90b19wYWRubyhjb21tdW5pdHksIHBpbik7Ci0JZ3BwID0gcGFkbm8gLyBjb21tdW5pdHktPmdwcF9zaXplOwotCWdwcF9vZmZzZXQgPSBwYWRubyAlIGNvbW11bml0eS0+Z3BwX3NpemU7Ci0KLQkvKiBDbGVhciB0aGUgZXhpc3Rpbmcgd2FrZSBzdGF0dXMgKi8KLQl3cml0ZWwoQklUKGdwcF9vZmZzZXQpLCBjb21tdW5pdHktPnJlZ3MgKyBHUElfR1BFX1NUUyArIGdwcCAqIDQpOwotCi0JLyoKLQkgKiBUaGUgY29udHJvbGxlciB3aWxsIGdlbmVyYXRlIHdha2Ugd2hlbiBHUEUgb2YgdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiBwYWQgaXMgZW5hYmxlZCBhbmQgaXQgaXMgbm90IHJvdXRlZCB0byBTQ0kgKEdQSVJPVVRTQ0kgaXMgbm90Ci0JICogc2V0KS4KLQkgKi8KLQlncGVfZW4gPSByZWFkbChjb21tdW5pdHktPnJlZ3MgKyBHUElfR1BFX0VOICsgZ3BwICogNCk7CiAJaWYgKG9uKQotCQlncGVfZW4gfD0gQklUKGdwcF9vZmZzZXQpOworCQllbmFibGVfaXJxX3dha2UocGN0cmwtPmlycSk7CiAJZWxzZQotCQlncGVfZW4gJj0gfkJJVChncHBfb2Zmc2V0KTsKLQl3cml0ZWwoZ3BlX2VuLCBjb21tdW5pdHktPnJlZ3MgKyBHUElfR1BFX0VOICsgZ3BwICogNCk7Ci0KLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKKwkJZGlzYWJsZV9pcnFfd2FrZShwY3RybC0+aXJxKTsKIAogCWRldl9kYmcocGN0cmwtPmRldiwgIiVzYWJsZSB3YWtlIGZvciBwaW4gJXVcbiIsIG9uID8gImVuIiA6ICJkaXMiLCBwaW4pOwogCXJldHVybiAwOwpAQCAtOTA1LDYgKzg4MSw3IEBACiAJcGN0cmwtPmNoaXAubGFiZWwgPSBkZXZfbmFtZShwY3RybC0+ZGV2KTsKIAlwY3RybC0+Y2hpcC5wYXJlbnQgPSBwY3RybC0+ZGV2OwogCXBjdHJsLT5jaGlwLmJhc2UgPSAtMTsKKwlwY3RybC0+aXJxID0gaXJxOwogCiAJcmV0ID0gZ3Bpb2NoaXBfYWRkX2RhdGEoJnBjdHJsLT5jaGlwLCBwY3RybCk7CiAJaWYgKHJldCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtbWVycmlmaWVsZC5jIGIvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtbWVycmlmaWVsZC5jCmluZGV4IGViNDk5MGYuLjc4MjZjN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLW1lcnJpZmllbGQuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvcGluY3RybC1tZXJyaWZpZWxkLmMKQEAgLTExLDYgKzExLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jb25mLmg+CkBAIC04NTMsNyArODU0LDcgQEAKIAkgKi8KIAluZmFtaWxpZXMgPSBBUlJBWV9TSVpFKG1yZmxkX2ZhbWlsaWVzKSwKIAlmYW1pbGllcyA9IGRldm1fa21lbWR1cCgmcGRldi0+ZGV2LCBtcmZsZF9mYW1pbGllcywKLQkJCQkJICAgIG5mYW1pbGllcyAqIHNpemVvZihtcmZsZF9mYW1pbGllcyksCisJCQkJCSAgICBzaXplb2YobXJmbGRfZmFtaWxpZXMpLAogCQkJCQkgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmYW1pbGllcykKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbWVkaWF0ZWsvcGluY3RybC1tdGstY29tbW9uLmMgYi9kcml2ZXJzL3BpbmN0cmwvbWVkaWF0ZWsvcGluY3RybC1tdGstY29tbW9uLmMKaW5kZXggY2U1NTRlMC4uZjlhZWYyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL21lZGlhdGVrL3BpbmN0cmwtbXRrLWNvbW1vbi5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9tZWRpYXRlay9waW5jdHJsLW10ay1jb21tb24uYwpAQCAtMTUsNyArMTUsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvL2RyaXZlci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgpAQCAtMTA1NSw3ICsxMDU0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgbXRrX2dwaW9fY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIG10a19ncGlvX2NoaXAgPSB7CiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkucmVxdWVzdAkJPSBncGlvY2hpcF9nZW5lcmljX3JlcXVlc3QsCiAJLmZyZWUJCQk9IGdwaW9jaGlwX2dlbmVyaWNfZnJlZSwKQEAgLTE0OTYsNyArMTQ5NSwzIEBACiAJZ3Bpb2NoaXBfcmVtb3ZlKHBjdGwtPmNoaXApOwogCXJldHVybiByZXQ7CiB9Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTWVkaWFUZWsgUGluY3RybCBEcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIkhvbmd6aG91IFlhbmcgPGhvbmd6aG91LnlhbmdAbWVkaWF0ZWsuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb24tZ3hiYi5jIGIvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb24tZ3hiYi5jCmluZGV4IGNiNGQ2YWQuLmMzOTI4YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uLWd4YmIuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbi1neGJiLmMKQEAgLTE1Niw2ICsxNTYsMTEgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW1tY19jbWRfcGluc1tdID0geyBQSU4oQk9PVF8xMCwgRUVfT0ZGKSB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBlbW1jX2RzX3BpbnNbXSA9IHsgUElOKEJPT1RfMTUsIEVFX09GRikgfTsKIAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBub3JfZF9waW5zW10JCT0geyBQSU4oQk9PVF8xMSwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBub3JfcV9waW5zW10JCT0geyBQSU4oQk9PVF8xMiwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBub3JfY19waW5zW10JCT0geyBQSU4oQk9PVF8xMywgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBub3JfY3NfcGluc1tdCQk9IHsgUElOKEJPT1RfMTUsIEVFX09GRikgfTsKKwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGNhcmRfZDBfcGluc1tdID0geyBQSU4oQ0FSRF8xLCBFRV9PRkYpIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkY2FyZF9kMV9waW5zW10gPSB7IFBJTihDQVJEXzAsIEVFX09GRikgfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RjYXJkX2QyX3BpbnNbXSA9IHsgUElOKENBUkRfNSwgRUVfT0ZGKSB9OwpAQCAtMTYzLDYgKzE2OCwyMyBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGNhcmRfY21kX3BpbnNbXSA9IHsgUElOKENBUkRfMywgRUVfT0ZGKSB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGNhcmRfY2xrX3BpbnNbXSA9IHsgUElOKENBUkRfMiwgRUVfT0ZGKSB9OwogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaW9fZDBfcGluc1tdID0geyBQSU4oR1BJT1hfMCwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGlvX2QxX3BpbnNbXSA9IHsgUElOKEdQSU9YXzEsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2Rpb19kMl9waW5zW10gPSB7IFBJTihHUElPWF8yLCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaW9fZDNfcGluc1tdID0geyBQSU4oR1BJT1hfMywgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGlvX2NtZF9waW5zW10gPSB7IFBJTihHUElPWF80LCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaW9fY2xrX3BpbnNbXSA9IHsgUElOKEdQSU9YXzUsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2Rpb19pcnFfcGluc1tdID0geyBQSU4oR1BJT1hfNywgRUVfT0ZGKSB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfY2UwX3BpbnNbXQk9IHsgUElOKEJPT1RfOCwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuYW5kX2NlMV9waW5zW10JPSB7IFBJTihCT09UXzksIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmFuZF9yYjBfcGluc1tdCT0geyBQSU4oQk9PVF8xMCwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuYW5kX2FsZV9waW5zW10JPSB7IFBJTihCT09UXzExLCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfY2xlX3BpbnNbXQk9IHsgUElOKEJPT1RfMTIsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmFuZF93ZW5fY2xrX3BpbnNbXQk9IHsgUElOKEJPT1RfMTMsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmFuZF9yZW5fd3JfcGluc1tdCT0geyBQSU4oQk9PVF8xNCwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuYW5kX2Rxc19waW5zW10JPSB7IFBJTihCT09UXzE1LCBFRV9PRkYpIH07CisKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF90eF9hX3BpbnNbXQk9IHsgUElOKEdQSU9YXzEyLCBFRV9PRkYpIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfcnhfYV9waW5zW10JPSB7IFBJTihHUElPWF8xMywgRUVfT0ZGKSB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X2N0c19hX3BpbnNbXQk9IHsgUElOKEdQSU9YXzE0LCBFRV9PRkYpIH07CkBAIC0xNzgsNiArMjAwLDE1IEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfY3RzX2NfcGluc1tdCT0geyBQSU4oR1BJT1hfMTEsIEVFX09GRikgfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9ydHNfY19waW5zW10JPSB7IFBJTihHUElPWF8xMiwgRUVfT0ZGKSB9OwogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zY2tfYV9waW5zW10JPSB7IFBJTihHUElPRFZfMjUsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NkYV9hX3BpbnNbXQk9IHsgUElOKEdQSU9EVl8yNCwgRUVfT0ZGKSB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zY2tfYl9waW5zW10JPSB7IFBJTihHUElPRFZfMjcsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NkYV9iX3BpbnNbXQk9IHsgUElOKEdQSU9EVl8yNiwgRUVfT0ZGKSB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zY2tfY19waW5zW10JPSB7IFBJTihHUElPRFZfMjksIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NkYV9jX3BpbnNbXQk9IHsgUElOKEdQSU9EVl8yOCwgRUVfT0ZGKSB9OworCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV0aF9tZGlvX3BpbnNbXQk9IHsgUElOKEdQSU9aXzAsIEVFX09GRikgfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZXRoX21kY19waW5zW10JPSB7IFBJTihHUElPWl8xLCBFRV9PRkYpIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV0aF9jbGtfcnhfY2xrX3BpbnNbXQk9IHsgUElOKEdQSU9aXzIsIEVFX09GRikgfTsKQEAgLTE5Myw2ICsyMjQsMTQgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZXRoX3R4ZDJfcGluc1tdCT0geyBQSU4oR1BJT1pfMTIsIEVFX09GRikgfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZXRoX3R4ZDNfcGluc1tdCT0geyBQSU4oR1BJT1pfMTMsIEVFX09GRikgfTsKIAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd21fYV94X3BpbnNbXQk9IHsgUElOKEdQSU9YXzYsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHdtX2FfeV9waW5zW10JPSB7IFBJTihHUElPWV8xNiwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd21fYl9waW5zW10JCT0geyBQSU4oR1BJT0RWXzI5LCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHB3bV9kX3BpbnNbXQkJPSB7IFBJTihHUElPRFZfMjgsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHdtX2VfcGluc1tdCQk9IHsgUElOKEdQSU9YXzE5LCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHB3bV9mX3hfcGluc1tdCT0geyBQSU4oR1BJT1hfNywgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd21fZl95X3BpbnNbXQk9IHsgUElOKEdQSU9ZXzE1LCBFRV9PRkYpIH07CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyBtZXNvbl9neGJiX2FvYnVzX3BpbnNbXSA9IHsKIAlNRVNPTl9QSU4oR1BJT0FPXzAsIDApLAogCU1FU09OX1BJTihHUElPQU9fMSwgMCksCkBAIC0yMjUsNiArMjY0LDEzIEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zbGF2ZV9zY2tfYW9fcGluc1tdID0ge1BJTihHUElPQU9fNCwgMCkgfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NsYXZlX3NkYV9hb19waW5zW10gPSB7UElOKEdQSU9BT181LCAwKSB9OwogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJlbW90ZV9pbnB1dF9hb19waW5zW10gPSB7UElOKEdQSU9BT183LCAwKSB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHB3bV9hb19hXzNfcGluc1tdCT0geyBQSU4oR1BJT0FPXzMsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHB3bV9hb19hXzZfcGluc1tdCT0geyBQSU4oR1BJT0FPXzYsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHB3bV9hb19hXzEyX3BpbnNbXQk9IHsgUElOKEdQSU9BT18xMiwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHdtX2FvX2JfcGluc1tdCT0geyBQSU4oR1BJT0FPXzEzLCAwKSB9OworCiBzdGF0aWMgc3RydWN0IG1lc29uX3BteF9ncm91cCBtZXNvbl9neGJiX3BlcmlwaHNfZ3JvdXBzW10gPSB7CiAJR1BJT19HUk9VUChHUElPWl8wLCBFRV9PRkYpLAogCUdQSU9fR1JPVVAoR1BJT1pfMSwgRUVfT0ZGKSwKQEAgLTM1NSwxNiArNDAxLDI4IEBACiAJR1BJT19HUk9VUChHUElPX1RFU1RfTiwgRUVfT0ZGKSwKIAogCS8qIEJhbmsgWCAqLworCUdST1VQKHNkaW9fZDAsCQk4LAk1KSwKKwlHUk9VUChzZGlvX2QxLAkJOCwJNCksCisJR1JPVVAoc2Rpb19kMiwJCTgsCTMpLAorCUdST1VQKHNkaW9fZDMsCQk4LAkyKSwKKwlHUk9VUChzZGlvX2NtZCwJCTgsCTEpLAorCUdST1VQKHNkaW9fY2xrLAkJOCwJMCksCisJR1JPVVAoc2Rpb19pcnEsCQk4LAkxMSksCiAJR1JPVVAodWFydF90eF9hLAk0LAkxMyksCiAJR1JPVVAodWFydF9yeF9hLAk0LAkxMiksCiAJR1JPVVAodWFydF9jdHNfYSwJNCwJMTEpLAogCUdST1VQKHVhcnRfcnRzX2EsCTQsCTEwKSwKKwlHUk9VUChwd21fYV94LAkJMywJMTcpLAorCUdST1VQKHB3bV9lLAkJMiwJMzApLAorCUdST1VQKHB3bV9mX3gsCQkzLAkxOCksCiAKIAkvKiBCYW5rIFkgKi8KIAlHUk9VUCh1YXJ0X2N0c19jLAkxLAkxOSksCiAJR1JPVVAodWFydF9ydHNfYywJMSwJMTgpLAogCUdST1VQKHVhcnRfdHhfYywJMSwJMTcpLAogCUdST1VQKHVhcnRfcnhfYywJMSwJMTYpLAorCUdST1VQKHB3bV9hX3ksCQkxLAkyMSksCisJR1JPVVAocHdtX2ZfeSwJCTEsCTIwKSwKIAogCS8qIEJhbmsgWiAqLwogCUdST1VQKGV0aF9tZGlvLAkJNiwJMSksCkBAIC0zODcsMTIgKzQ0NSwzMiBAQAogCUdST1VQKHVhcnRfcnhfYiwJMiwJMjgpLAogCUdST1VQKHVhcnRfY3RzX2IsCTIsCTI3KSwKIAlHUk9VUCh1YXJ0X3J0c19iLAkyLAkyNiksCisJR1JPVVAocHdtX2IsCQkzLAkyMSksCisJR1JPVVAocHdtX2QsCQkzLAkyMCksCisJR1JPVVAoaTJjX3Nja19hLAk3LAkyNyksCisJR1JPVVAoaTJjX3NkYV9hLAk3LAkyNiksCisJR1JPVVAoaTJjX3Nja19iLAk3LAkyNSksCisJR1JPVVAoaTJjX3NkYV9iLAk3LAkyNCksCisJR1JPVVAoaTJjX3Nja19jLAk3LAkyMyksCisJR1JPVVAoaTJjX3NkYV9jLAk3LAkyMiksCiAKIAkvKiBCYW5rIEJPT1QgKi8KIAlHUk9VUChlbW1jX25hbmRfZDA3LAk0LAkzMCksCiAJR1JPVVAoZW1tY19jbGssCQk0LAkxOCksCiAJR1JPVVAoZW1tY19jbWQsCQk0LAkxOSksCiAJR1JPVVAoZW1tY19kcywJCTQsCTMxKSwKKwlHUk9VUChub3JfZCwJCTUsCTEpLAorCUdST1VQKG5vcl9xLAkJNSwJMyksCisJR1JPVVAobm9yX2MsCQk1LAkyKSwKKwlHUk9VUChub3JfY3MsCQk1LAkwKSwKKwlHUk9VUChuYW5kX2NlMCwJCTQsCTI2KSwKKwlHUk9VUChuYW5kX2NlMSwJCTQsCTI3KSwKKwlHUk9VUChuYW5kX3JiMCwJCTQsCTI1KSwKKwlHUk9VUChuYW5kX2FsZSwJCTQsCTI0KSwKKwlHUk9VUChuYW5kX2NsZSwJCTQsCTIzKSwKKwlHUk9VUChuYW5kX3dlbl9jbGssCTQsCTIyKSwKKwlHUk9VUChuYW5kX3Jlbl93ciwJNCwJMjEpLAorCUdST1VQKG5hbmRfZHFzLAkJNCwJMjApLAogCiAJLyogQmFuayBDQVJEICovCiAJR1JPVVAoc2RjYXJkX2QxLAkyLAkxNCksCkBAIC00MzIsNiArNTEwLDExIEBACiAJR1JPVVAoaTJjX3NkYV9hbywJMCwJNSksCiAJR1JPVVAoaTJjX3NsYXZlX3Nja19hbywgMCwJMiksCiAJR1JPVVAoaTJjX3NsYXZlX3NkYV9hbywgMCwJMSksCisJR1JPVVAocmVtb3RlX2lucHV0X2FvLAkwLAkwKSwKKwlHUk9VUChwd21fYW9fYV8zLAkwLAkyMiksCisJR1JPVVAocHdtX2FvX2FfNiwJMCwJMTgpLAorCUdST1VQKHB3bV9hb19hXzEyLAkwLAkxNyksCisJR1JPVVAocHdtX2FvX2IsCQkwLAkzKSwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZ3Bpb19wZXJpcGhzX2dyb3Vwc1tdID0gewpAQCAtNDc1LDExICs1NTgsMjUgQEAKIAkiZW1tY19uYW5kX2QwNyIsICJlbW1jX2NsayIsICJlbW1jX2NtZCIsICJlbW1jX2RzIiwKIH07CiAKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgbm9yX2dyb3Vwc1tdID0geworCSJub3JfZCIsICJub3JfcSIsICJub3JfYyIsICJub3JfY3MiLAorfTsKKwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZGNhcmRfZ3JvdXBzW10gPSB7CiAJInNkY2FyZF9kMCIsICJzZGNhcmRfZDEiLCAic2RjYXJkX2QyIiwgInNkY2FyZF9kMyIsCiAJInNkY2FyZF9jbWQiLCAic2RjYXJkX2NsayIsCiB9OwogCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkaW9fZ3JvdXBzW10gPSB7CisJInNkaW9fZDAiLCAic2Rpb19kMSIsICJzZGlvX2QyIiwgInNkaW9fZDMiLAorCSJzZGlvX2NtZCIsICJzZGlvX2NsayIsICJzZGlvX2lycSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbmRfZ3JvdXBzW10gPSB7CisJIm5hbmRfY2UwIiwgIm5hbmRfY2UxIiwgIm5hbmRfcmIwIiwgIm5hbmRfYWxlIiwgIm5hbmRfY2xlIiwKKwkibmFuZF93ZW5fY2xrIiwgIm5hbmRfcmVuX3dyIiwgIm5hbmRfZHFzIiwKK307CisKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydF9hX2dyb3Vwc1tdID0gewogCSJ1YXJ0X3R4X2EiLCAidWFydF9yeF9hIiwgInVhcnRfY3RzX2EiLCAidWFydF9ydHNfYSIsCiB9OwpAQCAtNDkyLDYgKzU4OSwxOCBAQAogCSJ1YXJ0X3R4X2MiLCAidWFydF9yeF9jIiwgInVhcnRfY3RzX2MiLCAidWFydF9ydHNfYyIsCiB9OwogCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyY19hX2dyb3Vwc1tdID0geworCSJpMmNfc2NrX2EiLCAiaTJjX3NkYV9hIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjX2JfZ3JvdXBzW10gPSB7CisJImkyY19zY2tfYiIsICJpMmNfc2RhX2IiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmNfY19ncm91cHNbXSA9IHsKKwkiaTJjX3Nja19jIiwgImkyY19zZGFfYyIsCit9OworCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGV0aF9ncm91cHNbXSA9IHsKIAkiZXRoX21kaW8iLCAiZXRoX21kYyIsICJldGhfY2xrX3J4X2NsayIsICJldGhfcnhfZHYiLAogCSJldGhfcnhkMCIsICJldGhfcnhkMSIsICJldGhfcnhkMiIsICJldGhfcnhkMyIsCkBAIC00OTksNiArNjA4LDM0IEBACiAJImV0aF90eGQwIiwgImV0aF90eGQxIiwgImV0aF90eGQyIiwgImV0aF90eGQzIiwKIH07CiAKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtX2FfeF9ncm91cHNbXSA9IHsKKwkicHdtX2FfeCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bV9hX3lfZ3JvdXBzW10gPSB7CisJInB3bV9hX3kiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd21fYl9ncm91cHNbXSA9IHsKKwkicHdtX2IiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd21fZF9ncm91cHNbXSA9IHsKKwkicHdtX2QiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd21fZV9ncm91cHNbXSA9IHsKKwkicHdtX2UiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd21fZl94X2dyb3Vwc1tdID0geworCSJwd21fZl94IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtX2ZfeV9ncm91cHNbXSA9IHsKKwkicHdtX2ZfeSIsCit9OworCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdwaW9fYW9idXNfZ3JvdXBzW10gPSB7CiAJIkdQSU9BT18wIiwgIkdQSU9BT18xIiwgIkdQSU9BT18yIiwgIkdQSU9BT18zIiwgIkdQSU9BT180IiwKIAkiR1BJT0FPXzUiLCAiR1BJT0FPXzYiLCAiR1BJT0FPXzciLCAiR1BJT0FPXzgiLCAiR1BJT0FPXzkiLApAQCAtNTIxLDE0ICs2NTgsNDcgQEAKIAkiaTJjX3NsYXZlX3Nka19hbyIsICJpMmNfc2xhdmVfc2RhX2FvIiwKIH07CiAKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmVtb3RlX2lucHV0X2FvX2dyb3Vwc1tdID0geworCSJyZW1vdGVfaW5wdXRfYW8iLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd21fYW9fYV8zX2dyb3Vwc1tdID0geworCSJwd21fYW9fYV8zIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtX2FvX2FfNl9ncm91cHNbXSA9IHsKKwkicHdtX2FvX2FfNiIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bV9hb19hXzEyX2dyb3Vwc1tdID0geworCSJwd21fYW9fYV8xMiIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bV9hb19iX2dyb3Vwc1tdID0geworCSJwd21fYW9fYiIsCit9OworCiBzdGF0aWMgc3RydWN0IG1lc29uX3BteF9mdW5jIG1lc29uX2d4YmJfcGVyaXBoc19mdW5jdGlvbnNbXSA9IHsKIAlGVU5DVElPTihncGlvX3BlcmlwaHMpLAogCUZVTkNUSU9OKGVtbWMpLAorCUZVTkNUSU9OKG5vciksCiAJRlVOQ1RJT04oc2RjYXJkKSwKKwlGVU5DVElPTihzZGlvKSwKKwlGVU5DVElPTihuYW5kKSwKIAlGVU5DVElPTih1YXJ0X2EpLAogCUZVTkNUSU9OKHVhcnRfYiksCiAJRlVOQ1RJT04odWFydF9jKSwKKwlGVU5DVElPTihpMmNfYSksCisJRlVOQ1RJT04oaTJjX2IpLAorCUZVTkNUSU9OKGkyY19jKSwKIAlGVU5DVElPTihldGgpLAorCUZVTkNUSU9OKHB3bV9hX3gpLAorCUZVTkNUSU9OKHB3bV9hX3kpLAorCUZVTkNUSU9OKHB3bV9iKSwKKwlGVU5DVElPTihwd21fZCksCisJRlVOQ1RJT04ocHdtX2UpLAorCUZVTkNUSU9OKHB3bV9mX3gpLAorCUZVTkNUSU9OKHB3bV9mX3kpLAogfTsKIAogc3RhdGljIHN0cnVjdCBtZXNvbl9wbXhfZnVuYyBtZXNvbl9neGJiX2FvYnVzX2Z1bmN0aW9uc1tdID0gewpAQCAtNTM3LDYgKzcwNywxMSBAQAogCUZVTkNUSU9OKHVhcnRfYW9fYiksCiAJRlVOQ1RJT04oaTJjX2FvKSwKIAlGVU5DVElPTihpMmNfc2xhdmVfYW8pLAorCUZVTkNUSU9OKHJlbW90ZV9pbnB1dF9hbyksCisJRlVOQ1RJT04ocHdtX2FvX2FfMyksCisJRlVOQ1RJT04ocHdtX2FvX2FfNiksCisJRlVOQ1RJT04ocHdtX2FvX2FfMTIpLAorCUZVTkNUSU9OKHB3bV9hb19iKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbWVzb25fYmFuayBtZXNvbl9neGJiX3BlcmlwaHNfYmFua3NbXSA9IHsKQEAgLTU1NiwzOCArNzMxLDI4IEBACiAJQkFOSygiQU8iLCAgIFBJTihHUElPQU9fMCwgMCksICBQSU4oR1BJT0FPXzEzLCAwKSwgMCwgIDAsICAwLCAxNiwgIDAsICAwLCAgMCwgMTYsICAxLCAgMCksCiB9OwogCi1zdGF0aWMgc3RydWN0IG1lc29uX2RvbWFpbl9kYXRhIG1lc29uX2d4YmJfcGVyaXBoc19kb21haW5fZGF0YSA9IHsKLQkubmFtZQkJPSAicGVyaXBocy1iYW5rcyIsCi0JLmJhbmtzCQk9IG1lc29uX2d4YmJfcGVyaXBoc19iYW5rcywKLQkubnVtX2JhbmtzCT0gQVJSQVlfU0laRShtZXNvbl9neGJiX3BlcmlwaHNfYmFua3MpLAotCS5waW5fYmFzZQk9IDE0LAotCS5udW1fcGlucwk9IDEyMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWVzb25fZG9tYWluX2RhdGEgbWVzb25fZ3hiYl9hb2J1c19kb21haW5fZGF0YSA9IHsKLQkubmFtZQkJPSAiYW9idXMtYmFua3MiLAotCS5iYW5rcwkJPSBtZXNvbl9neGJiX2FvYnVzX2JhbmtzLAotCS5udW1fYmFua3MJPSBBUlJBWV9TSVpFKG1lc29uX2d4YmJfYW9idXNfYmFua3MpLAotCS5waW5fYmFzZQk9IDAsCi0JLm51bV9waW5zCT0gMTQsCi19OwotCiBzdHJ1Y3QgbWVzb25fcGluY3RybF9kYXRhIG1lc29uX2d4YmJfcGVyaXBoc19waW5jdHJsX2RhdGEgPSB7CisJLm5hbWUJCT0gInBlcmlwaHMtYmFua3MiLAorCS5waW5fYmFzZQk9IDE0LAogCS5waW5zCQk9IG1lc29uX2d4YmJfcGVyaXBoc19waW5zLAogCS5ncm91cHMJCT0gbWVzb25fZ3hiYl9wZXJpcGhzX2dyb3VwcywKIAkuZnVuY3MJCT0gbWVzb25fZ3hiYl9wZXJpcGhzX2Z1bmN0aW9ucywKLQkuZG9tYWluX2RhdGEJPSAmbWVzb25fZ3hiYl9wZXJpcGhzX2RvbWFpbl9kYXRhLAorCS5iYW5rcwkJPSBtZXNvbl9neGJiX3BlcmlwaHNfYmFua3MsCiAJLm51bV9waW5zCT0gQVJSQVlfU0laRShtZXNvbl9neGJiX3BlcmlwaHNfcGlucyksCiAJLm51bV9ncm91cHMJPSBBUlJBWV9TSVpFKG1lc29uX2d4YmJfcGVyaXBoc19ncm91cHMpLAogCS5udW1fZnVuY3MJPSBBUlJBWV9TSVpFKG1lc29uX2d4YmJfcGVyaXBoc19mdW5jdGlvbnMpLAorCS5udW1fYmFua3MJPSBBUlJBWV9TSVpFKG1lc29uX2d4YmJfcGVyaXBoc19iYW5rcyksCiB9OwogCiBzdHJ1Y3QgbWVzb25fcGluY3RybF9kYXRhIG1lc29uX2d4YmJfYW9idXNfcGluY3RybF9kYXRhID0geworCS5uYW1lCQk9ICJhb2J1cy1iYW5rcyIsCisJLnBpbl9iYXNlCT0gMCwKIAkucGlucwkJPSBtZXNvbl9neGJiX2FvYnVzX3BpbnMsCiAJLmdyb3VwcwkJPSBtZXNvbl9neGJiX2FvYnVzX2dyb3VwcywKIAkuZnVuY3MJCT0gbWVzb25fZ3hiYl9hb2J1c19mdW5jdGlvbnMsCi0JLmRvbWFpbl9kYXRhCT0gJm1lc29uX2d4YmJfYW9idXNfZG9tYWluX2RhdGEsCisJLmJhbmtzCQk9IG1lc29uX2d4YmJfYW9idXNfYmFua3MsCiAJLm51bV9waW5zCT0gQVJSQVlfU0laRShtZXNvbl9neGJiX2FvYnVzX3BpbnMpLAogCS5udW1fZ3JvdXBzCT0gQVJSQVlfU0laRShtZXNvbl9neGJiX2FvYnVzX2dyb3VwcyksCiAJLm51bV9mdW5jcwk9IEFSUkFZX1NJWkUobWVzb25fZ3hiYl9hb2J1c19mdW5jdGlvbnMpLAorCS5udW1fYmFua3MJPSBBUlJBWV9TSVpFKG1lc29uX2d4YmJfYW9idXNfYmFua3MpLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uLmMgYi9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbi5jCmluZGV4IDExNjIzYzYuLjU3MTIyZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb24uYwpAQCAtMjEsOSArMjEsOCBAQAogICogZG9tYWluIHdoaWNoIGNhbid0IGJlIHBvd2VyZWQgb2ZmOyB0aGUgYmFuayBhbHNvIHVzZXMgYSBzZXQgb2YKICAqIHJlZ2lzdGVycyBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIgYmFua3MuCiAgKgotICogRm9yIGVhY2ggb2YgdGhlIHR3byBwb3dlciBkb21haW5zIChyZWd1bGFyIGFuZCBhbHdheXMtb24pIHRoZXJlIGFyZQotICogNCBkaWZmZXJlbnQgcmVnaXN0ZXIgcmFuZ2VzIHRoYXQgY29udHJvbCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMKLSAqIG9mIHRoZSBwaW5zOgorICogRm9yIGVhY2ggcGluIGNvbnRyb2xsZXIgdGhlcmUgYXJlIDQgZGlmZmVyZW50IHJlZ2lzdGVyIHJhbmdlcyB0aGF0CisgKiBjb250cm9sIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBvZiB0aGUgcGluczoKICAqICAxKSBwaW4gbXV4aW5nCiAgKiAgMikgcHVsbCBlbmFibGUvZGlzYWJsZQogICogIDMpIHB1bGwgdXAvZG93bgpAQCAtMzMsOCArMzIsOCBAQAogICogZGlyZWN0aW9uIGFyZSB0aGUgc2FtZSBhbmQgdGh1cyB0aGVyZSBhcmUgb25seSAzIHJlZ2lzdGVyIHJhbmdlcy4KICAqCiAgKiBFdmVyeSBwaW5tdXggZ3JvdXAgY2FuIGJlIGVuYWJsZWQgYnkgYSBzcGVjaWZpYyBiaXQgaW4gdGhlIGZpcnN0Ci0gKiByZWdpc3RlciByYW5nZSBvZiB0aGUgZG9tYWluOyB3aGVuIGFsbCBncm91cHMgZm9yIGEgZ2l2ZW4gcGluIGFyZQotICogZGlzYWJsZWQgdGhlIHBpbiBhY3RzIGFzIGEgR1BJTy4KKyAqIHJlZ2lzdGVyIHJhbmdlOyB3aGVuIGFsbCBncm91cHMgZm9yIGEgZ2l2ZW4gcGluIGFyZSBkaXNhYmxlZCB0aGUKKyAqIHBpbiBhY3RzIGFzIGEgR1BJTy4KICAqCiAgKiBGb3IgdGhlIHB1bGwgYW5kIEdQSU8gY29uZmlndXJhdGlvbiBldmVyeSBiYW5rIHVzZXMgYSBjb250aWd1b3VzCiAgKiBzZXQgb2YgYml0cyBpbiB0aGUgcmVnaXN0ZXIgc2V0cyBkZXNjcmliZWQgYWJvdmU7IHRoZSBzYW1lIHJlZ2lzdGVyCkBAIC02NiwyMSArNjUsMjEgQEAKIC8qKgogICogbWVzb25fZ2V0X2JhbmsoKSAtIGZpbmQgdGhlIGJhbmsgY29udGFpbmluZyBhIGdpdmVuIHBpbgogICoKLSAqIEBkb21haW46CXRoZSBkb21haW4gY29udGFpbmluZyB0aGUgcGluCisgKiBAcGM6CQl0aGUgcGluY3RybCBpbnN0YW5jZQogICogQHBpbjoJdGhlIHBpbiBudW1iZXIKICAqIEBiYW5rOgl0aGUgZm91bmQgYmFuawogICoKICAqIFJldHVybjoJMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yCiAgKi8KLXN0YXRpYyBpbnQgbWVzb25fZ2V0X2Jhbmsoc3RydWN0IG1lc29uX2RvbWFpbiAqZG9tYWluLCB1bnNpZ25lZCBpbnQgcGluLAorc3RhdGljIGludCBtZXNvbl9nZXRfYmFuayhzdHJ1Y3QgbWVzb25fcGluY3RybCAqcGMsIHVuc2lnbmVkIGludCBwaW4sCiAJCQkgIHN0cnVjdCBtZXNvbl9iYW5rICoqYmFuaykKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBkb21haW4tPmRhdGEtPm51bV9iYW5rczsgaSsrKSB7Ci0JCWlmIChwaW4gPj0gZG9tYWluLT5kYXRhLT5iYW5rc1tpXS5maXJzdCAmJgotCQkgICAgcGluIDw9IGRvbWFpbi0+ZGF0YS0+YmFua3NbaV0ubGFzdCkgewotCQkJKmJhbmsgPSAmZG9tYWluLT5kYXRhLT5iYW5rc1tpXTsKKwlmb3IgKGkgPSAwOyBpIDwgcGMtPmRhdGEtPm51bV9iYW5rczsgaSsrKSB7CisJCWlmIChwaW4gPj0gcGMtPmRhdGEtPmJhbmtzW2ldLmZpcnN0ICYmCisJCSAgICBwaW4gPD0gcGMtPmRhdGEtPmJhbmtzW2ldLmxhc3QpIHsKKwkJCSpiYW5rID0gJnBjLT5kYXRhLT5iYW5rc1tpXTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtODksMzMgKzg4LDYgQEAKIH0KIAogLyoqCi0gKiBtZXNvbl9nZXRfZG9tYWluX2FuZF9iYW5rKCkgLSBmaW5kIGRvbWFpbiBhbmQgYmFuayBjb250YWluaW5nIGEgZ2l2ZW4gcGluCi0gKgotICogQHBjOgkJTWVzb24gcGluIGNvbnRyb2xsZXIgZGV2aWNlCi0gKiBAcGluOgl0aGUgcGluIG51bWJlcgotICogQGRvbWFpbjoJdGhlIGZvdW5kIGRvbWFpbgotICogQGJhbms6CXRoZSBmb3VuZCBiYW5rCi0gKgotICogUmV0dXJuOgkwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IKLSAqLwotc3RhdGljIGludCBtZXNvbl9nZXRfZG9tYWluX2FuZF9iYW5rKHN0cnVjdCBtZXNvbl9waW5jdHJsICpwYywgdW5zaWduZWQgaW50IHBpbiwKLQkJCQkgICAgIHN0cnVjdCBtZXNvbl9kb21haW4gKipkb21haW4sCi0JCQkJICAgICBzdHJ1Y3QgbWVzb25fYmFuayAqKmJhbmspCi17Ci0Jc3RydWN0IG1lc29uX2RvbWFpbiAqZDsKLQotCWQgPSBwYy0+ZG9tYWluOwotCi0JaWYgKHBpbiA+PSBkLT5kYXRhLT5waW5fYmFzZSAmJgotCSAgICBwaW4gPCBkLT5kYXRhLT5waW5fYmFzZSArIGQtPmRhdGEtPm51bV9waW5zKSB7Ci0JCSpkb21haW4gPSBkOwotCQlyZXR1cm4gbWVzb25fZ2V0X2JhbmsoZCwgcGluLCBiYW5rKTsKLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotLyoqCiAgKiBtZXNvbl9jYWxjX3JlZ19hbmRfYml0KCkgLSBjYWxjdWxhdGUgcmVnaXN0ZXIgYW5kIGJpdCBmb3IgYSBwaW4KICAqCiAgKiBAYmFuazoJdGhlIGJhbmsgY29udGFpbmluZyB0aGUgcGluCkBAIC0xOTAsNyArMTYyLDYgQEAKIAkJCQkJICAgdW5zaWduZWQgaW50IHBpbiwgaW50IHNlbF9ncm91cCkKIHsKIAlzdHJ1Y3QgbWVzb25fcG14X2dyb3VwICpncm91cDsKLQlzdHJ1Y3QgbWVzb25fZG9tYWluICpkb21haW47CiAJaW50IGksIGo7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGMtPmRhdGEtPm51bV9ncm91cHM7IGkrKykgewpAQCAtMjAxLDggKzE3Miw3IEBACiAJCWZvciAoaiA9IDA7IGogPCBncm91cC0+bnVtX3BpbnM7IGorKykgewogCQkJaWYgKGdyb3VwLT5waW5zW2pdID09IHBpbikgewogCQkJCS8qIFdlIGhhdmUgZm91bmQgYSBncm91cCB1c2luZyB0aGUgcGluICovCi0JCQkJZG9tYWluID0gcGMtPmRvbWFpbjsKLQkJCQlyZWdtYXBfdXBkYXRlX2JpdHMoZG9tYWluLT5yZWdfbXV4LAorCQkJCXJlZ21hcF91cGRhdGVfYml0cyhwYy0+cmVnX211eCwKIAkJCQkJCSAgIGdyb3VwLT5yZWcgKiA0LAogCQkJCQkJICAgQklUKGdyb3VwLT5iaXQpLCAwKTsKIAkJCX0KQEAgLTIxNiw3ICsxODYsNiBAQAogCXN0cnVjdCBtZXNvbl9waW5jdHJsICpwYyA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjZGV2KTsKIAlzdHJ1Y3QgbWVzb25fcG14X2Z1bmMgKmZ1bmMgPSAmcGMtPmRhdGEtPmZ1bmNzW2Z1bmNfbnVtXTsKIAlzdHJ1Y3QgbWVzb25fcG14X2dyb3VwICpncm91cCA9ICZwYy0+ZGF0YS0+Z3JvdXBzW2dyb3VwX251bV07Ci0Jc3RydWN0IG1lc29uX2RvbWFpbiAqZG9tYWluID0gcGMtPmRvbWFpbjsKIAlpbnQgaSwgcmV0ID0gMDsKIAogCWRldl9kYmcocGMtPmRldiwgImVuYWJsZSBmdW5jdGlvbiAlcywgZ3JvdXAgJXNcbiIsIGZ1bmMtPm5hbWUsCkBAIC0yMzEsNyArMjAwLDcgQEAKIAogCS8qIEZ1bmN0aW9uIDAgKEdQSU8pIGRvZXNuJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBzZXR0aW5nICovCiAJaWYgKGZ1bmNfbnVtKQotCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoZG9tYWluLT5yZWdfbXV4LCBncm91cC0+cmVnICogNCwKKwkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjLT5yZWdfbXV4LCBncm91cC0+cmVnICogNCwKIAkJCQkJIEJJVChncm91cC0+Yml0KSwgQklUKGdyb3VwLT5iaXQpKTsKIAogCXJldHVybiByZXQ7CkBAIC0yODcsMTQgKzI1NiwxMyBAQAogCQkJICAgICB1bnNpZ25lZCBsb25nICpjb25maWdzLCB1bnNpZ25lZCBudW1fY29uZmlncykKIHsKIAlzdHJ1Y3QgbWVzb25fcGluY3RybCAqcGMgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY2Rldik7Ci0Jc3RydWN0IG1lc29uX2RvbWFpbiAqZG9tYWluOwogCXN0cnVjdCBtZXNvbl9iYW5rICpiYW5rOwogCWVudW0gcGluX2NvbmZpZ19wYXJhbSBwYXJhbTsKIAl1bnNpZ25lZCBpbnQgcmVnLCBiaXQ7CiAJaW50IGksIHJldDsKIAl1MTYgYXJnOwogCi0JcmV0ID0gbWVzb25fZ2V0X2RvbWFpbl9hbmRfYmFuayhwYywgcGluLCAmZG9tYWluLCAmYmFuayk7CisJcmV0ID0gbWVzb25fZ2V0X2JhbmsocGMsIHBpbiwgJmJhbmspOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTMwNyw3ICsyNzUsNyBAQAogCQkJZGV2X2RiZyhwYy0+ZGV2LCAicGluICV1OiBkaXNhYmxlIGJpYXNcbiIsIHBpbik7CiAKIAkJCW1lc29uX2NhbGNfcmVnX2FuZF9iaXQoYmFuaywgcGluLCBSRUdfUFVMTCwgJnJlZywgJmJpdCk7Ci0JCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoZG9tYWluLT5yZWdfcHVsbCwgcmVnLAorCQkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjLT5yZWdfcHVsbCwgcmVnLAogCQkJCQkJIEJJVChiaXQpLCAwKTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKQEAgLTMxNywxMyArMjg1LDEzIEBACiAKIAkJCW1lc29uX2NhbGNfcmVnX2FuZF9iaXQoYmFuaywgcGluLCBSRUdfUFVMTEVOLAogCQkJCQkgICAgICAgJnJlZywgJmJpdCk7Ci0JCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoZG9tYWluLT5yZWdfcHVsbGVuLCByZWcsCisJCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocGMtPnJlZ19wdWxsZW4sIHJlZywKIAkJCQkJCSBCSVQoYml0KSwgQklUKGJpdCkpOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwogCiAJCQltZXNvbl9jYWxjX3JlZ19hbmRfYml0KGJhbmssIHBpbiwgUkVHX1BVTEwsICZyZWcsICZiaXQpOwotCQkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGRvbWFpbi0+cmVnX3B1bGwsIHJlZywKKwkJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhwYy0+cmVnX3B1bGwsIHJlZywKIAkJCQkJCSBCSVQoYml0KSwgQklUKGJpdCkpOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwpAQCAtMzMzLDEzICszMDEsMTMgQEAKIAogCQkJbWVzb25fY2FsY19yZWdfYW5kX2JpdChiYW5rLCBwaW4sIFJFR19QVUxMRU4sCiAJCQkJCSAgICAgICAmcmVnLCAmYml0KTsKLQkJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkb21haW4tPnJlZ19wdWxsZW4sIHJlZywKKwkJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhwYy0+cmVnX3B1bGxlbiwgcmVnLAogCQkJCQkJIEJJVChiaXQpLCBCSVQoYml0KSk7CiAJCQlpZiAocmV0KQogCQkJCXJldHVybiByZXQ7CiAKIAkJCW1lc29uX2NhbGNfcmVnX2FuZF9iaXQoYmFuaywgcGluLCBSRUdfUFVMTCwgJnJlZywgJmJpdCk7Ci0JCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoZG9tYWluLT5yZWdfcHVsbCwgcmVnLAorCQkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjLT5yZWdfcHVsbCwgcmVnLAogCQkJCQkJIEJJVChiaXQpLCAwKTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKQEAgLTM1NCwxOCArMzIyLDE3IEBACiAKIHN0YXRpYyBpbnQgbWVzb25fcGluY29uZl9nZXRfcHVsbChzdHJ1Y3QgbWVzb25fcGluY3RybCAqcGMsIHVuc2lnbmVkIGludCBwaW4pCiB7Ci0Jc3RydWN0IG1lc29uX2RvbWFpbiAqZG9tYWluOwogCXN0cnVjdCBtZXNvbl9iYW5rICpiYW5rOwogCXVuc2lnbmVkIGludCByZWcsIGJpdCwgdmFsOwogCWludCByZXQsIGNvbmY7CiAKLQlyZXQgPSBtZXNvbl9nZXRfZG9tYWluX2FuZF9iYW5rKHBjLCBwaW4sICZkb21haW4sICZiYW5rKTsKKwlyZXQgPSBtZXNvbl9nZXRfYmFuayhwYywgcGluLCAmYmFuayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCW1lc29uX2NhbGNfcmVnX2FuZF9iaXQoYmFuaywgcGluLCBSRUdfUFVMTEVOLCAmcmVnLCAmYml0KTsKIAotCXJldCA9IHJlZ21hcF9yZWFkKGRvbWFpbi0+cmVnX3B1bGxlbiwgcmVnLCAmdmFsKTsKKwlyZXQgPSByZWdtYXBfcmVhZChwYy0+cmVnX3B1bGxlbiwgcmVnLCAmdmFsKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0zNzQsNyArMzQxLDcgQEAKIAl9IGVsc2UgewogCQltZXNvbl9jYWxjX3JlZ19hbmRfYml0KGJhbmssIHBpbiwgUkVHX1BVTEwsICZyZWcsICZiaXQpOwogCi0JCXJldCA9IHJlZ21hcF9yZWFkKGRvbWFpbi0+cmVnX3B1bGwsIHJlZywgJnZhbCk7CisJCXJldCA9IHJlZ21hcF9yZWFkKHBjLT5yZWdfcHVsbCwgcmVnLCAmdmFsKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKQEAgLTQ1Miw4MiArNDE5LDgyIEBACiAKIHN0YXRpYyB2b2lkIG1lc29uX2dwaW9fZnJlZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBncGlvKQogewotCXN0cnVjdCBtZXNvbl9kb21haW4gKmRvbWFpbiA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCXN0cnVjdCBtZXNvbl9waW5jdHJsICpwYyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCi0JcGluY3RybF9mcmVlX2dwaW8oZG9tYWluLT5kYXRhLT5waW5fYmFzZSArIGdwaW8pOworCXBpbmN0cmxfZnJlZV9ncGlvKHBjLT5kYXRhLT5waW5fYmFzZSArIGdwaW8pOwogfQogCiBzdGF0aWMgaW50IG1lc29uX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8pCiB7Ci0Jc3RydWN0IG1lc29uX2RvbWFpbiAqZG9tYWluID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJc3RydWN0IG1lc29uX3BpbmN0cmwgKnBjID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CiAJdW5zaWduZWQgaW50IHJlZywgYml0LCBwaW47CiAJc3RydWN0IG1lc29uX2JhbmsgKmJhbms7CiAJaW50IHJldDsKIAotCXBpbiA9IGRvbWFpbi0+ZGF0YS0+cGluX2Jhc2UgKyBncGlvOwotCXJldCA9IG1lc29uX2dldF9iYW5rKGRvbWFpbiwgcGluLCAmYmFuayk7CisJcGluID0gcGMtPmRhdGEtPnBpbl9iYXNlICsgZ3BpbzsKKwlyZXQgPSBtZXNvbl9nZXRfYmFuayhwYywgcGluLCAmYmFuayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCW1lc29uX2NhbGNfcmVnX2FuZF9iaXQoYmFuaywgcGluLCBSRUdfRElSLCAmcmVnLCAmYml0KTsKIAotCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoZG9tYWluLT5yZWdfZ3BpbywgcmVnLCBCSVQoYml0KSwgQklUKGJpdCkpOworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocGMtPnJlZ19ncGlvLCByZWcsIEJJVChiaXQpLCBCSVQoYml0KSk7CiB9CiAKIHN0YXRpYyBpbnQgbWVzb25fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8sCiAJCQkJICAgICAgIGludCB2YWx1ZSkKIHsKLQlzdHJ1Y3QgbWVzb25fZG9tYWluICpkb21haW4gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwlzdHJ1Y3QgbWVzb25fcGluY3RybCAqcGMgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAl1bnNpZ25lZCBpbnQgcmVnLCBiaXQsIHBpbjsKIAlzdHJ1Y3QgbWVzb25fYmFuayAqYmFuazsKIAlpbnQgcmV0OwogCi0JcGluID0gZG9tYWluLT5kYXRhLT5waW5fYmFzZSArIGdwaW87Ci0JcmV0ID0gbWVzb25fZ2V0X2JhbmsoZG9tYWluLCBwaW4sICZiYW5rKTsKKwlwaW4gPSBwYy0+ZGF0YS0+cGluX2Jhc2UgKyBncGlvOworCXJldCA9IG1lc29uX2dldF9iYW5rKHBjLCBwaW4sICZiYW5rKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJbWVzb25fY2FsY19yZWdfYW5kX2JpdChiYW5rLCBwaW4sIFJFR19ESVIsICZyZWcsICZiaXQpOwotCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkb21haW4tPnJlZ19ncGlvLCByZWcsIEJJVChiaXQpLCAwKTsKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocGMtPnJlZ19ncGlvLCByZWcsIEJJVChiaXQpLCAwKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJbWVzb25fY2FsY19yZWdfYW5kX2JpdChiYW5rLCBwaW4sIFJFR19PVVQsICZyZWcsICZiaXQpOwotCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoZG9tYWluLT5yZWdfZ3BpbywgcmVnLCBCSVQoYml0KSwKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjLT5yZWdfZ3BpbywgcmVnLCBCSVQoYml0KSwKIAkJCQkgIHZhbHVlID8gQklUKGJpdCkgOiAwKTsKIH0KIAogc3RhdGljIHZvaWQgbWVzb25fZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQogewotCXN0cnVjdCBtZXNvbl9kb21haW4gKmRvbWFpbiA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCXN0cnVjdCBtZXNvbl9waW5jdHJsICpwYyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXVuc2lnbmVkIGludCByZWcsIGJpdCwgcGluOwogCXN0cnVjdCBtZXNvbl9iYW5rICpiYW5rOwogCWludCByZXQ7CiAKLQlwaW4gPSBkb21haW4tPmRhdGEtPnBpbl9iYXNlICsgZ3BpbzsKLQlyZXQgPSBtZXNvbl9nZXRfYmFuayhkb21haW4sIHBpbiwgJmJhbmspOworCXBpbiA9IHBjLT5kYXRhLT5waW5fYmFzZSArIGdwaW87CisJcmV0ID0gbWVzb25fZ2V0X2JhbmsocGMsIHBpbiwgJmJhbmspOwogCWlmIChyZXQpCiAJCXJldHVybjsKIAogCW1lc29uX2NhbGNfcmVnX2FuZF9iaXQoYmFuaywgcGluLCBSRUdfT1VULCAmcmVnLCAmYml0KTsKLQlyZWdtYXBfdXBkYXRlX2JpdHMoZG9tYWluLT5yZWdfZ3BpbywgcmVnLCBCSVQoYml0KSwKKwlyZWdtYXBfdXBkYXRlX2JpdHMocGMtPnJlZ19ncGlvLCByZWcsIEJJVChiaXQpLAogCQkJICAgdmFsdWUgPyBCSVQoYml0KSA6IDApOwogfQogCiBzdGF0aWMgaW50IG1lc29uX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8pCiB7Ci0Jc3RydWN0IG1lc29uX2RvbWFpbiAqZG9tYWluID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJc3RydWN0IG1lc29uX3BpbmN0cmwgKnBjID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CiAJdW5zaWduZWQgaW50IHJlZywgYml0LCB2YWwsIHBpbjsKIAlzdHJ1Y3QgbWVzb25fYmFuayAqYmFuazsKIAlpbnQgcmV0OwogCi0JcGluID0gZG9tYWluLT5kYXRhLT5waW5fYmFzZSArIGdwaW87Ci0JcmV0ID0gbWVzb25fZ2V0X2JhbmsoZG9tYWluLCBwaW4sICZiYW5rKTsKKwlwaW4gPSBwYy0+ZGF0YS0+cGluX2Jhc2UgKyBncGlvOworCXJldCA9IG1lc29uX2dldF9iYW5rKHBjLCBwaW4sICZiYW5rKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJbWVzb25fY2FsY19yZWdfYW5kX2JpdChiYW5rLCBwaW4sIFJFR19JTiwgJnJlZywgJmJpdCk7Ci0JcmVnbWFwX3JlYWQoZG9tYWluLT5yZWdfZ3BpbywgcmVnLCAmdmFsKTsKKwlyZWdtYXBfcmVhZChwYy0+cmVnX2dwaW8sIHJlZywgJnZhbCk7CiAKIAlyZXR1cm4gISEodmFsICYgQklUKGJpdCkpOwogfQpAQCAtNTYyLDM1ICs1MjksMzIgQEAKIAogc3RhdGljIGludCBtZXNvbl9ncGlvbGliX3JlZ2lzdGVyKHN0cnVjdCBtZXNvbl9waW5jdHJsICpwYykKIHsKLQlzdHJ1Y3QgbWVzb25fZG9tYWluICpkb21haW47CiAJaW50IHJldDsKIAotCWRvbWFpbiA9IHBjLT5kb21haW47CisJcGMtPmNoaXAubGFiZWwgPSBwYy0+ZGF0YS0+bmFtZTsKKwlwYy0+Y2hpcC5wYXJlbnQgPSBwYy0+ZGV2OworCXBjLT5jaGlwLnJlcXVlc3QgPSBtZXNvbl9ncGlvX3JlcXVlc3Q7CisJcGMtPmNoaXAuZnJlZSA9IG1lc29uX2dwaW9fZnJlZTsKKwlwYy0+Y2hpcC5kaXJlY3Rpb25faW5wdXQgPSBtZXNvbl9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKKwlwYy0+Y2hpcC5kaXJlY3Rpb25fb3V0cHV0ID0gbWVzb25fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OworCXBjLT5jaGlwLmdldCA9IG1lc29uX2dwaW9fZ2V0OworCXBjLT5jaGlwLnNldCA9IG1lc29uX2dwaW9fc2V0OworCXBjLT5jaGlwLmJhc2UgPSBwYy0+ZGF0YS0+cGluX2Jhc2U7CisJcGMtPmNoaXAubmdwaW8gPSBwYy0+ZGF0YS0+bnVtX3BpbnM7CisJcGMtPmNoaXAuY2FuX3NsZWVwID0gZmFsc2U7CisJcGMtPmNoaXAub2Zfbm9kZSA9IHBjLT5vZl9ub2RlOworCXBjLT5jaGlwLm9mX2dwaW9fbl9jZWxscyA9IDI7CiAKLQlkb21haW4tPmNoaXAubGFiZWwgPSBkb21haW4tPmRhdGEtPm5hbWU7Ci0JZG9tYWluLT5jaGlwLnBhcmVudCA9IHBjLT5kZXY7Ci0JZG9tYWluLT5jaGlwLnJlcXVlc3QgPSBtZXNvbl9ncGlvX3JlcXVlc3Q7Ci0JZG9tYWluLT5jaGlwLmZyZWUgPSBtZXNvbl9ncGlvX2ZyZWU7Ci0JZG9tYWluLT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IG1lc29uX2dwaW9fZGlyZWN0aW9uX2lucHV0OwotCWRvbWFpbi0+Y2hpcC5kaXJlY3Rpb25fb3V0cHV0ID0gbWVzb25fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OwotCWRvbWFpbi0+Y2hpcC5nZXQgPSBtZXNvbl9ncGlvX2dldDsKLQlkb21haW4tPmNoaXAuc2V0ID0gbWVzb25fZ3Bpb19zZXQ7Ci0JZG9tYWluLT5jaGlwLmJhc2UgPSBkb21haW4tPmRhdGEtPnBpbl9iYXNlOwotCWRvbWFpbi0+Y2hpcC5uZ3BpbyA9IGRvbWFpbi0+ZGF0YS0+bnVtX3BpbnM7Ci0JZG9tYWluLT5jaGlwLmNhbl9zbGVlcCA9IGZhbHNlOwotCWRvbWFpbi0+Y2hpcC5vZl9ub2RlID0gZG9tYWluLT5vZl9ub2RlOwotCWRvbWFpbi0+Y2hpcC5vZl9ncGlvX25fY2VsbHMgPSAyOwotCi0JcmV0ID0gZ3Bpb2NoaXBfYWRkX2RhdGEoJmRvbWFpbi0+Y2hpcCwgZG9tYWluKTsKKwlyZXQgPSBncGlvY2hpcF9hZGRfZGF0YSgmcGMtPmNoaXAsIHBjKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIocGMtPmRldiwgImNhbid0IGFkZCBncGlvIGNoaXAgJXNcbiIsCi0JCQlkb21haW4tPmRhdGEtPm5hbWUpOworCQkJcGMtPmRhdGEtPm5hbWUpOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JcmV0ID0gZ3Bpb2NoaXBfYWRkX3Bpbl9yYW5nZSgmZG9tYWluLT5jaGlwLCBkZXZfbmFtZShwYy0+ZGV2KSwKLQkJCQkgICAgIDAsIGRvbWFpbi0+ZGF0YS0+cGluX2Jhc2UsCi0JCQkJICAgICBkb21haW4tPmNoaXAubmdwaW8pOworCXJldCA9IGdwaW9jaGlwX2FkZF9waW5fcmFuZ2UoJnBjLT5jaGlwLCBkZXZfbmFtZShwYy0+ZGV2KSwKKwkJCQkgICAgIDAsIHBjLT5kYXRhLT5waW5fYmFzZSwKKwkJCQkgICAgIHBjLT5jaGlwLm5ncGlvKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIocGMtPmRldiwgImNhbid0IGFkZCBwaW4gcmFuZ2VcbiIpOwogCQlnb3RvIGZhaWw7CkBAIC01OTgsNyArNTYyLDcgQEAKIAogCXJldHVybiAwOwogZmFpbDoKLQlncGlvY2hpcF9yZW1vdmUoJnBjLT5kb21haW4tPmNoaXApOworCWdwaW9jaGlwX3JlbW92ZSgmcGMtPmNoaXApOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTYzNyw1OCArNjAxLDQ2IEBACiBzdGF0aWMgaW50IG1lc29uX3BpbmN0cmxfcGFyc2VfZHQoc3RydWN0IG1lc29uX3BpbmN0cmwgKnBjLAogCQkJCSAgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0Jc3RydWN0IG1lc29uX2RvbWFpbiAqZG9tYWluOwotCWludCBudW1fZG9tYWlucyA9IDA7CisJc3RydWN0IGRldmljZV9ub2RlICpucCwgKmdwaW9fbnAgPSBOVUxMOwogCiAJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShub2RlLCBucCkgewogCQlpZiAoIW9mX2ZpbmRfcHJvcGVydHkobnAsICJncGlvLWNvbnRyb2xsZXIiLCBOVUxMKSkKIAkJCWNvbnRpbnVlOwotCQludW1fZG9tYWlucysrOworCQlpZiAoZ3Bpb19ucCkgeworCQkJZGV2X2VycihwYy0+ZGV2LCAibXVsdGlwbGUgZ3BpbyBub2Rlc1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlncGlvX25wID0gbnA7CiAJfQogCi0JaWYgKG51bV9kb21haW5zICE9IDEpIHsKLQkJZGV2X2VycihwYy0+ZGV2LCAid3JvbmcgbnVtYmVyIG9mIHN1Ym5vZGVzXG4iKTsKKwlpZiAoIWdwaW9fbnApIHsKKwkJZGV2X2VycihwYy0+ZGV2LCAibm8gZ3BpbyBub2RlIGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcGMtPmRvbWFpbiA9IGRldm1fa3phbGxvYyhwYy0+ZGV2LCBzaXplb2Yoc3RydWN0IG1lc29uX2RvbWFpbiksIEdGUF9LRVJORUwpOwotCWlmICghcGMtPmRvbWFpbikKLQkJcmV0dXJuIC1FTk9NRU07CisJcGMtPm9mX25vZGUgPSBncGlvX25wOwogCi0JZG9tYWluID0gcGMtPmRvbWFpbjsKLQlkb21haW4tPmRhdGEgPSBwYy0+ZGF0YS0+ZG9tYWluX2RhdGE7CisJcGMtPnJlZ19tdXggPSBtZXNvbl9tYXBfcmVzb3VyY2UocGMsIGdwaW9fbnAsICJtdXgiKTsKKwlpZiAoSVNfRVJSKHBjLT5yZWdfbXV4KSkgeworCQlkZXZfZXJyKHBjLT5kZXYsICJtdXggcmVnaXN0ZXJzIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiBQVFJfRVJSKHBjLT5yZWdfbXV4KTsKKwl9CiAKLQlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5vZGUsIG5wKSB7Ci0JCWlmICghb2ZfZmluZF9wcm9wZXJ0eShucCwgImdwaW8tY29udHJvbGxlciIsIE5VTEwpKQotCQkJY29udGludWU7CisJcGMtPnJlZ19wdWxsID0gbWVzb25fbWFwX3Jlc291cmNlKHBjLCBncGlvX25wLCAicHVsbCIpOworCWlmIChJU19FUlIocGMtPnJlZ19wdWxsKSkgeworCQlkZXZfZXJyKHBjLT5kZXYsICJwdWxsIHJlZ2lzdGVycyBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwYy0+cmVnX3B1bGwpOworCX0KIAotCQlkb21haW4tPm9mX25vZGUgPSBucDsKKwlwYy0+cmVnX3B1bGxlbiA9IG1lc29uX21hcF9yZXNvdXJjZShwYywgZ3Bpb19ucCwgInB1bGwtZW5hYmxlIik7CisJLyogVXNlIHB1bGwgcmVnaW9uIGlmIHB1bGwtZW5hYmxlIG9uZSBpcyBub3QgcHJlc2VudCAqLworCWlmIChJU19FUlIocGMtPnJlZ19wdWxsZW4pKQorCQlwYy0+cmVnX3B1bGxlbiA9IHBjLT5yZWdfcHVsbDsKIAotCQlkb21haW4tPnJlZ19tdXggPSBtZXNvbl9tYXBfcmVzb3VyY2UocGMsIG5wLCAibXV4Iik7Ci0JCWlmIChJU19FUlIoZG9tYWluLT5yZWdfbXV4KSkgewotCQkJZGV2X2VycihwYy0+ZGV2LCAibXV4IHJlZ2lzdGVycyBub3QgZm91bmRcbiIpOwotCQkJcmV0dXJuIFBUUl9FUlIoZG9tYWluLT5yZWdfbXV4KTsKLQkJfQotCi0JCWRvbWFpbi0+cmVnX3B1bGwgPSBtZXNvbl9tYXBfcmVzb3VyY2UocGMsIG5wLCAicHVsbCIpOwotCQlpZiAoSVNfRVJSKGRvbWFpbi0+cmVnX3B1bGwpKSB7Ci0JCQlkZXZfZXJyKHBjLT5kZXYsICJwdWxsIHJlZ2lzdGVycyBub3QgZm91bmRcbiIpOwotCQkJcmV0dXJuIFBUUl9FUlIoZG9tYWluLT5yZWdfcHVsbCk7Ci0JCX0KLQotCQlkb21haW4tPnJlZ19wdWxsZW4gPSBtZXNvbl9tYXBfcmVzb3VyY2UocGMsIG5wLCAicHVsbC1lbmFibGUiKTsKLQkJLyogVXNlIHB1bGwgcmVnaW9uIGlmIHB1bGwtZW5hYmxlIG9uZSBpcyBub3QgcHJlc2VudCAqLwotCQlpZiAoSVNfRVJSKGRvbWFpbi0+cmVnX3B1bGxlbikpCi0JCQlkb21haW4tPnJlZ19wdWxsZW4gPSBkb21haW4tPnJlZ19wdWxsOwotCi0JCWRvbWFpbi0+cmVnX2dwaW8gPSBtZXNvbl9tYXBfcmVzb3VyY2UocGMsIG5wLCAiZ3BpbyIpOwotCQlpZiAoSVNfRVJSKGRvbWFpbi0+cmVnX2dwaW8pKSB7Ci0JCQlkZXZfZXJyKHBjLT5kZXYsICJncGlvIHJlZ2lzdGVycyBub3QgZm91bmRcbiIpOwotCQkJcmV0dXJuIFBUUl9FUlIoZG9tYWluLT5yZWdfZ3Bpbyk7Ci0JCX0KLQotCQlicmVhazsKKwlwYy0+cmVnX2dwaW8gPSBtZXNvbl9tYXBfcmVzb3VyY2UocGMsIGdwaW9fbnAsICJncGlvIik7CisJaWYgKElTX0VSUihwYy0+cmVnX2dwaW8pKSB7CisJCWRldl9lcnIocGMtPmRldiwgImdwaW8gcmVnaXN0ZXJzIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiBQVFJfRVJSKHBjLT5yZWdfZ3Bpbyk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC03MjcsMTMgKzY3OSw3IEBACiAJCXJldHVybiBQVFJfRVJSKHBjLT5wY2Rldik7CiAJfQogCi0JcmV0ID0gbWVzb25fZ3Bpb2xpYl9yZWdpc3RlcihwYyk7Ci0JaWYgKHJldCkgewotCQlwaW5jdHJsX3VucmVnaXN0ZXIocGMtPnBjZGV2KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gbWVzb25fZ3Bpb2xpYl9yZWdpc3RlcihwYyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1lc29uX3BpbmN0cmxfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb24uaCBiL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uLmgKaW5kZXggZDg5NDQyZS4uOThiNTA4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb24uaAorKysgYi9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbi5oCkBAIC05NSw1NCArOTUsMTcgQEAKIAlzdHJ1Y3QgbWVzb25fcmVnX2Rlc2MgcmVnc1tOVU1fUkVHXTsKIH07CiAKLS8qKgotICogc3RydWN0IG1lc29uX2RvbWFpbl9kYXRhIC0gZG9tYWluIHBsYXRmb3JtIGRhdGEKLSAqCi0gKiBAbmFtZToJbmFtZSBvZiB0aGUgZG9tYWluCi0gKiBAYmFua3M6CXNldCBvZiBiYW5rcyBiZWxvbmdpbmcgdG8gdGhlIGRvbWFpbgotICogQG51bV9iYW5rczoJbnVtYmVyIG9mIGJhbmtzIGluIHRoZSBkb21haW4KLSAqLwotc3RydWN0IG1lc29uX2RvbWFpbl9kYXRhIHsKLQljb25zdCBjaGFyICpuYW1lOwotCXN0cnVjdCBtZXNvbl9iYW5rICpiYW5rczsKLQl1bnNpZ25lZCBpbnQgbnVtX2JhbmtzOwotCXVuc2lnbmVkIGludCBwaW5fYmFzZTsKLQl1bnNpZ25lZCBpbnQgbnVtX3BpbnM7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBtZXNvbl9kb21haW4KLSAqCi0gKiBAcmVnX211eDoJcmVnaXN0ZXJzIGZvciBtdXggc2V0dGluZ3MKLSAqIEByZWdfcHVsbGVuOglyZWdpc3RlcnMgZm9yIHB1bGwtZW5hYmxlIHNldHRpbmdzCi0gKiBAcmVnX3B1bGw6CXJlZ2lzdGVycyBmb3IgcHVsbCBzZXR0aW5ncwotICogQHJlZ19ncGlvOglyZWdpc3RlcnMgZm9yIGdwaW8gc2V0dGluZ3MKLSAqIEBjaGlwOglncGlvIGNoaXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBkb21haW4KLSAqIEBkYXRhOwlwbGF0Zm9ybSBkYXRhIGZvciB0aGUgZG9tYWluCi0gKiBAbm9kZToJZGV2aWNlIHRyZWUgbm9kZSBmb3IgdGhlIGRvbWFpbgotICoKLSAqIEEgZG9tYWluIHJlcHJlc2VudHMgYSBzZXQgb2YgYmFua3MgY29udHJvbGxlZCBieSB0aGUgc2FtZSBzZXQgb2YKLSAqIHJlZ2lzdGVycy4KLSAqLwotc3RydWN0IG1lc29uX2RvbWFpbiB7Ci0Jc3RydWN0IHJlZ21hcCAqcmVnX211eDsKLQlzdHJ1Y3QgcmVnbWFwICpyZWdfcHVsbGVuOwotCXN0cnVjdCByZWdtYXAgKnJlZ19wdWxsOwotCXN0cnVjdCByZWdtYXAgKnJlZ19ncGlvOwotCi0Jc3RydWN0IGdwaW9fY2hpcCBjaGlwOwotCXN0cnVjdCBtZXNvbl9kb21haW5fZGF0YSAqZGF0YTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7Ci19OwotCiBzdHJ1Y3QgbWVzb25fcGluY3RybF9kYXRhIHsKKwljb25zdCBjaGFyICpuYW1lOwogCWNvbnN0IHN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjICpwaW5zOwogCXN0cnVjdCBtZXNvbl9wbXhfZ3JvdXAgKmdyb3VwczsKIAlzdHJ1Y3QgbWVzb25fcG14X2Z1bmMgKmZ1bmNzOwotCXN0cnVjdCBtZXNvbl9kb21haW5fZGF0YSAqZG9tYWluX2RhdGE7CisJdW5zaWduZWQgaW50IHBpbl9iYXNlOwogCXVuc2lnbmVkIGludCBudW1fcGluczsKIAl1bnNpZ25lZCBpbnQgbnVtX2dyb3VwczsKIAl1bnNpZ25lZCBpbnQgbnVtX2Z1bmNzOworCXN0cnVjdCBtZXNvbl9iYW5rICpiYW5rczsKKwl1bnNpZ25lZCBpbnQgbnVtX2JhbmtzOwogfTsKIAogc3RydWN0IG1lc29uX3BpbmN0cmwgewpAQCAtMTUwLDcgKzExMywxMiBAQAogCXN0cnVjdCBwaW5jdHJsX2RldiAqcGNkZXY7CiAJc3RydWN0IHBpbmN0cmxfZGVzYyBkZXNjOwogCXN0cnVjdCBtZXNvbl9waW5jdHJsX2RhdGEgKmRhdGE7Ci0Jc3RydWN0IG1lc29uX2RvbWFpbiAqZG9tYWluOworCXN0cnVjdCByZWdtYXAgKnJlZ19tdXg7CisJc3RydWN0IHJlZ21hcCAqcmVnX3B1bGxlbjsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdfcHVsbDsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdfZ3BpbzsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7CisJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlOwogfTsKIAogI2RlZmluZSBQSU4oeCwgYikJKGIgKyB4KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb244LmMgYi9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbjguYwppbmRleCAzMmRlMTkxLi4wN2YxY2IyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbjguYworKysgYi9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbjguYwpAQCAtOTMxLDM4ICs5MzEsMjggQEAKIAlCQU5LKCJBTyIsICAgUElOKEdQSU9BT18wLCBBT19PRkYpLCBQSU4oR1BJT19URVNUX04sIEFPX09GRiksIDAsICAwLCAgMCwgMTYsICAwLCAgMCwgIDAsIDE2LCAgMSwgIDApLAogfTsKIAotc3RhdGljIHN0cnVjdCBtZXNvbl9kb21haW5fZGF0YSBtZXNvbjhfY2J1c19kb21haW5fZGF0YSA9IHsKLQkubmFtZQkJPSAiY2J1cy1iYW5rcyIsCi0JLmJhbmtzCQk9IG1lc29uOF9jYnVzX2JhbmtzLAotCS5udW1fYmFua3MJPSBBUlJBWV9TSVpFKG1lc29uOF9jYnVzX2JhbmtzKSwKLQkucGluX2Jhc2UJPSAwLAotCS5udW1fcGlucwk9IDEyMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWVzb25fZG9tYWluX2RhdGEgbWVzb244X2FvYnVzX2RvbWFpbl9kYXRhID0gewotCS5uYW1lCQk9ICJhby1iYW5rIiwKLQkuYmFua3MJCT0gbWVzb244X2FvYnVzX2JhbmtzLAotCS5udW1fYmFua3MJPSBBUlJBWV9TSVpFKG1lc29uOF9hb2J1c19iYW5rcyksCi0JLnBpbl9iYXNlCT0gMTIwLAotCS5udW1fcGlucwk9IDE2LAotfTsKLQogc3RydWN0IG1lc29uX3BpbmN0cmxfZGF0YSBtZXNvbjhfY2J1c19waW5jdHJsX2RhdGEgPSB7CisJLm5hbWUJCT0gImNidXMtYmFua3MiLAorCS5waW5fYmFzZQk9IDAsCiAJLnBpbnMJCT0gbWVzb244X2NidXNfcGlucywKIAkuZ3JvdXBzCQk9IG1lc29uOF9jYnVzX2dyb3VwcywKIAkuZnVuY3MJCT0gbWVzb244X2NidXNfZnVuY3Rpb25zLAotCS5kb21haW5fZGF0YQk9ICZtZXNvbjhfY2J1c19kb21haW5fZGF0YSwKKwkuYmFua3MJCT0gbWVzb244X2NidXNfYmFua3MsCiAJLm51bV9waW5zCT0gQVJSQVlfU0laRShtZXNvbjhfY2J1c19waW5zKSwKIAkubnVtX2dyb3Vwcwk9IEFSUkFZX1NJWkUobWVzb244X2NidXNfZ3JvdXBzKSwKIAkubnVtX2Z1bmNzCT0gQVJSQVlfU0laRShtZXNvbjhfY2J1c19mdW5jdGlvbnMpLAorCS5udW1fYmFua3MJPSBBUlJBWV9TSVpFKG1lc29uOF9jYnVzX2JhbmtzKSwKIH07CiAKIHN0cnVjdCBtZXNvbl9waW5jdHJsX2RhdGEgbWVzb244X2FvYnVzX3BpbmN0cmxfZGF0YSA9IHsKKwkubmFtZQkJPSAiYW8tYmFuayIsCisJLnBpbl9iYXNlCT0gMTIwLAogCS5waW5zCQk9IG1lc29uOF9hb2J1c19waW5zLAogCS5ncm91cHMJCT0gbWVzb244X2FvYnVzX2dyb3VwcywKIAkuZnVuY3MJCT0gbWVzb244X2FvYnVzX2Z1bmN0aW9ucywKLQkuZG9tYWluX2RhdGEJPSAmbWVzb244X2FvYnVzX2RvbWFpbl9kYXRhLAorCS5iYW5rcwkJPSBtZXNvbjhfYW9idXNfYmFua3MsCiAJLm51bV9waW5zCT0gQVJSQVlfU0laRShtZXNvbjhfYW9idXNfcGlucyksCiAJLm51bV9ncm91cHMJPSBBUlJBWV9TSVpFKG1lc29uOF9hb2J1c19ncm91cHMpLAogCS5udW1fZnVuY3MJPSBBUlJBWV9TSVpFKG1lc29uOF9hb2J1c19mdW5jdGlvbnMpLAorCS5udW1fYmFua3MJPSBBUlJBWV9TSVpFKG1lc29uOF9hb2J1c19iYW5rcyksCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb244Yi5jIGIvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb244Yi5jCmluZGV4IDg3NGYyZWQuLjc2ZjA3N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uOGIuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbjhiLmMKQEAgLTg5NiwzOCArODk2LDI4IEBACiAJQkFOSygiQU8iLCAgIFBJTihHUElPQU9fMCwgQU9fT0ZGKSwgUElOKEdQSU9fVEVTVF9OLCBBT19PRkYpLCAwLCAgMCwgIDAsIDE2LCAgMCwgIDAsICAwLCAxNiwgIDEsICAwKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbWVzb25fZG9tYWluX2RhdGEgbWVzb244Yl9jYnVzX2RvbWFpbl9kYXRhID0gewotCS5uYW1lCQk9ICJjYnVzLWJhbmtzIiwKLQkuYmFua3MJCT0gbWVzb244Yl9jYnVzX2JhbmtzLAotCS5udW1fYmFua3MJPSBBUlJBWV9TSVpFKG1lc29uOGJfY2J1c19iYW5rcyksCi0JLnBpbl9iYXNlCT0gMCwKLQkubnVtX3BpbnMJPSAxMzAsCi19OwotCi1zdGF0aWMgc3RydWN0IG1lc29uX2RvbWFpbl9kYXRhIG1lc29uOGJfYW9idXNfZG9tYWluX2RhdGEgPSB7Ci0JLm5hbWUJCT0gImFvYnVzLWJhbmtzIiwKLQkuYmFua3MJCT0gbWVzb244Yl9hb2J1c19iYW5rcywKLQkubnVtX2JhbmtzCT0gQVJSQVlfU0laRShtZXNvbjhiX2FvYnVzX2JhbmtzKSwKLQkucGluX2Jhc2UJPSAxMzAsCi0JLm51bV9waW5zCT0gMTYsCi19OwotCiBzdHJ1Y3QgbWVzb25fcGluY3RybF9kYXRhIG1lc29uOGJfY2J1c19waW5jdHJsX2RhdGEgPSB7CisJLm5hbWUJCT0gImNidXMtYmFua3MiLAorCS5waW5fYmFzZQk9IDAsCiAJLnBpbnMJCT0gbWVzb244Yl9jYnVzX3BpbnMsCiAJLmdyb3VwcwkJPSBtZXNvbjhiX2NidXNfZ3JvdXBzLAogCS5mdW5jcwkJPSBtZXNvbjhiX2NidXNfZnVuY3Rpb25zLAotCS5kb21haW5fZGF0YQk9ICZtZXNvbjhiX2NidXNfZG9tYWluX2RhdGEsCisJLmJhbmtzCQk9IG1lc29uOGJfY2J1c19iYW5rcywKIAkubnVtX3BpbnMJPSBBUlJBWV9TSVpFKG1lc29uOGJfY2J1c19waW5zKSwKIAkubnVtX2dyb3Vwcwk9IEFSUkFZX1NJWkUobWVzb244Yl9jYnVzX2dyb3VwcyksCiAJLm51bV9mdW5jcwk9IEFSUkFZX1NJWkUobWVzb244Yl9jYnVzX2Z1bmN0aW9ucyksCisJLm51bV9iYW5rcwk9IEFSUkFZX1NJWkUobWVzb244Yl9jYnVzX2JhbmtzKSwKIH07CiAKIHN0cnVjdCBtZXNvbl9waW5jdHJsX2RhdGEgbWVzb244Yl9hb2J1c19waW5jdHJsX2RhdGEgPSB7CisJLm5hbWUJCT0gImFvYnVzLWJhbmtzIiwKKwkucGluX2Jhc2UJPSAxMzAsCiAJLnBpbnMJCT0gbWVzb244Yl9hb2J1c19waW5zLAogCS5ncm91cHMJCT0gbWVzb244Yl9hb2J1c19ncm91cHMsCiAJLmZ1bmNzCQk9IG1lc29uOGJfYW9idXNfZnVuY3Rpb25zLAotCS5kb21haW5fZGF0YQk9ICZtZXNvbjhiX2FvYnVzX2RvbWFpbl9kYXRhLAorCS5iYW5rcwkJPSBtZXNvbjhiX2FvYnVzX2JhbmtzLAogCS5udW1fcGlucwk9IEFSUkFZX1NJWkUobWVzb244Yl9hb2J1c19waW5zKSwKIAkubnVtX2dyb3Vwcwk9IEFSUkFZX1NJWkUobWVzb244Yl9hb2J1c19ncm91cHMpLAogCS5udW1fZnVuY3MJPSBBUlJBWV9TSVpFKG1lc29uOGJfYW9idXNfZnVuY3Rpb25zKSwKKwkubnVtX2JhbmtzCT0gQVJSQVlfU0laRShtZXNvbjhiX2FvYnVzX2JhbmtzKSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbm9tYWRpay9waW5jdHJsLWFieDUwMC5jIGIvZHJpdmVycy9waW5jdHJsL25vbWFkaWsvcGluY3RybC1hYng1MDAuYwppbmRleCA3ZDM0M2MyLi5mOTUwMDFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbm9tYWRpay9waW5jdHJsLWFieDUwMC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9ub21hZGlrL3BpbmN0cmwtYWJ4NTAwLmMKQEAgLTQsNiArNCw4IEBACiAgKiBBdXRob3I6IFBhdHJpY2UgQ2hvdGFyZCA8cGF0cmljZS5jaG90YXJkQHN0LmNvbT4KICAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgogICoKKyAqIERyaXZlciBhbGxvd3MgdG8gdXNlIEF4QjV4eCB1bnVzZWQgcGlucyB0byBiZSB1c2VkIGFzIEdQSU8KKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgpAQCAtMTIsNyArMTQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgpAQCAtMTI2OSw4ICsxMjcwLDMgQEAKIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhYng1MDBfZ3Bpb19kcml2ZXIpOwogfQogY29yZV9pbml0Y2FsbChhYng1MDBfZ3Bpb19pbml0KTsKLQotTU9EVUxFX0FVVEhPUigiUGF0cmljZSBDaG90YXJkIDxwYXRyaWNlLmNob3RhcmRAc3QuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgYWxsb3dzIHRvIHVzZSBBeEI1eHggdW51c2VkIHBpbnMgdG8gYmUgdXNlZCBhcyBHUElPIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOmFieDUwMC1ncGlvIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbm9tYWRpay9waW5jdHJsLW5vbWFkaWsuYyBiL2RyaXZlcnMvcGluY3RybC9ub21hZGlrL3BpbmN0cmwtbm9tYWRpay5jCmluZGV4IDM1ZjYyMTguLmQzMThjYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9ub21hZGlrL3BpbmN0cmwtbm9tYWRpay5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9ub21hZGlrL3BpbmN0cmwtbm9tYWRpay5jCkBAIC0xMSw3ICsxMSw2IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTExMTAsMTAgKzExMDksOCBAQAogCQlyZXR1cm4gUFRSX0VSUihubWtfY2hpcCk7CiAJfQogCi0JaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgInN0LHN1cHBvcnRzLXNsZWVwbW9kZSIsIE5VTEwpKQotCQlzdXBwb3J0c19zbGVlcG1vZGUgPSB0cnVlOwotCWVsc2UKLQkJc3VwcG9ydHNfc2xlZXBtb2RlID0gZmFsc2U7CisJc3VwcG9ydHNfc2xlZXBtb2RlID0KKwkJb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAic3Qsc3VwcG9ydHMtc2xlZXBtb2RlIik7CiAKIAkvKiBDb3JyZWN0IHBsYXRmb3JtIGRldmljZSBJRCAqLwogCWRldi0+aWQgPSBubWtfY2hpcC0+YmFuazsKQEAgLTExODAsNyArMTE3Nyw3IEBACiAJCQkJICAgaXJxY2hpcCwKIAkJCQkgICAwLAogCQkJCSAgIGhhbmRsZV9lZGdlX2lycSwKLQkJCQkgICBJUlFfVFlQRV9FREdFX0ZBTExJTkcpOworCQkJCSAgIElSUV9UWVBFX05PTkUpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJjb3VsZCBub3QgYWRkIGlycWNoaXBcbiIpOwogCQlncGlvY2hpcF9yZW1vdmUoJm5ta19jaGlwLT5jaGlwKTsKQEAgLTE5ODUsNyArMTk4MiwzIEBACiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmbm1rX3BpbmN0cmxfZHJpdmVyKTsKIH0KIGNvcmVfaW5pdGNhbGwobm1rX3BpbmN0cmxfaW5pdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIlByYWZ1bGxhIFdBREFTS0FSIGFuZCBBbGVzc2FuZHJvIFJ1YmluaSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJOb21hZGlrIEdQSU8gRHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hbWQuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFtZC5jCmluZGV4IDYzNGI0ZDMuLmFlYTMxMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFtZC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFtZC5jCkBAIC00MywxNyArNDMsNiBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fZGV2LT5sb2NrLCBmbGFncyk7CiAJcGluX3JlZyA9IHJlYWRsKGdwaW9fZGV2LT5iYXNlICsgb2Zmc2V0ICogNCk7Ci0JLyoKLQkgKiBTdXBwb3NlIEJJT1Mgb3IgQm9vdGxvYWRlciBzZXRzIHNwZWNpZmljIGRlYm91bmNlIGZvciB0aGUKLQkgKiBHUElPLiBpZiBub3QsIHNldCBkZWJvdW5jZSB0byBiZSAgMi43NW1zIGFuZCByZW1vdmUgZ2xpdGNoLgotCSovCi0JaWYgKChwaW5fcmVnICYgREJfVE1SX09VVF9NQVNLKSA9PSAwKSB7Ci0JCXBpbl9yZWcgfD0gMHhmOwotCQlwaW5fcmVnIHw9IEJJVChEQl9UTVJfT1VUX1VOSVRfT0ZGKTsKLQkJcGluX3JlZyB8PSBEQl9UWVBFX1JFTU9WRV9HTElUQ0ggPDwgREJfQ05UUkxfT0ZGOwotCQlwaW5fcmVnICY9IH5CSVQoREJfVE1SX0xBUkdFX09GRik7Ci0JfQotCiAJcGluX3JlZyAmPSB+QklUKE9VVFBVVF9FTkFCTEVfT0ZGKTsKIAl3cml0ZWwocGluX3JlZywgZ3Bpb19kZXYtPmJhc2UgKyBvZmZzZXQgKiA0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2Rldi0+bG9jaywgZmxhZ3MpOwpAQCAtMzI2LDE1ICszMTUsNiBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fZGV2LT5sb2NrLCBmbGFncyk7CiAJcGluX3JlZyA9IHJlYWRsKGdwaW9fZGV2LT5iYXNlICsgKGQtPmh3aXJxKSo0KTsKLQkvKgotCQlTdXBwb3NlIEJJT1Mgb3IgQm9vdGxvYWRlciBzZXRzIHNwZWNpZmljIGRlYm91bmNlIGZvciB0aGUKLQkJR1BJTy4gaWYgbm90LCBzZXQgZGVib3VuY2UgdG8gYmUgIDIuNzVtcy4KLQkqLwotCWlmICgocGluX3JlZyAmIERCX1RNUl9PVVRfTUFTSykgPT0gMCkgewotCQlwaW5fcmVnIHw9IDB4ZjsKLQkJcGluX3JlZyB8PSBCSVQoREJfVE1SX09VVF9VTklUX09GRik7Ci0JCXBpbl9yZWcgJj0gfkJJVChEQl9UTVJfTEFSR0VfT0ZGKTsKLQl9CiAJcGluX3JlZyB8PSBCSVQoSU5URVJSVVBUX0VOQUJMRV9PRkYpOwogCXBpbl9yZWcgfD0gQklUKElOVEVSUlVQVF9NQVNLX09GRik7CiAJd3JpdGVsKHBpbl9yZWcsIGdwaW9fZGV2LT5iYXNlICsgKGQtPmh3aXJxKSo0KTsKQEAgLTQwMywxMiArMzgzLDI2IEBACiAJaW50IHJldCA9IDA7CiAJdTMyIHBpbl9yZWc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIGxldmVsX3RyaWc7CisJdTMyIGFjdGl2ZV9sZXZlbDsKIAlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCXN0cnVjdCBhbWRfZ3BpbyAqZ3Bpb19kZXYgPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19kZXYtPmxvY2ssIGZsYWdzKTsKIAlwaW5fcmVnID0gcmVhZGwoZ3Bpb19kZXYtPmJhc2UgKyAoZC0+aHdpcnEpKjQpOwogCisJLyoKKwkgKiBXaGVuIGxldmVsX3RyaWcgaXMgc2V0IEVER0UgYW5kIGFjdGl2ZV9sZXZlbCBpcyBzZXQgSElHSCBpbiBCSU9TCisJICogZGVmYXVsdCBzZXR0aW5ncywgaWdub3JlIGluY29taW5nIHNldHRpbmdzIGZyb20gY2xpZW50IGFuZCB1c2UKKwkgKiBCSU9TIHNldHRpbmdzIHRvIGNvbmZpZ3VyZSBHUElPIHJlZ2lzdGVyLgorCSAqLworCWxldmVsX3RyaWcgPSAhKHBpbl9yZWcgJiAoTEVWRUxfVFJJR0dFUiA8PCBMRVZFTF9UUklHX09GRikpOworCWFjdGl2ZV9sZXZlbCA9IHBpbl9yZWcgJiAoQUNUSVZFX0xFVkVMX01BU0sgPDwgQUNUSVZFX0xFVkVMX09GRik7CisKKwlpZihsZXZlbF90cmlnICYmCisJICAgKChhY3RpdmVfbGV2ZWwgPj4gQUNUSVZFX0xFVkVMX09GRikgPT0gQUNUSVZFX0hJR0gpKQorCQl0eXBlID0gSVJRX1RZUEVfRURHRV9GQUxMSU5HOworCiAJc3dpdGNoICh0eXBlICYgSVJRX1RZUEVfU0VOU0VfTUFTSykgewogCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6CiAJCXBpbl9yZWcgJj0gfkJJVChMRVZFTF9UUklHX09GRik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hdDkxLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hdDkxLmMKaW5kZXggODBkYWVhZC4uOWYwOTA0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYXQ5MS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWF0OTEuYwpAQCAtMTYxNCw3ICsxNjE0LDcgQEAKIAkJCQkgICAmZ3Bpb19pcnFjaGlwLAogCQkJCSAgIDAsCiAJCQkJICAgaGFuZGxlX2VkZ2VfaXJxLAotCQkJCSAgIElSUV9UWVBFX0VER0VfQk9USCk7CisJCQkJICAgSVJRX1RZUEVfTk9ORSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJhdDkxX2dwaW8uJWQ6IENvdWxkbid0IGFkZCBpcnFjaGlwIHRvIGdwaW9jaGlwLlxuIiwKIAkJCWF0OTFfZ3Bpby0+cGlvY19pZHgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtcGFsbWFzLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1wYWxtYXMuYwppbmRleCA4ZWRiM2Y4Yy4uYTMwMTQ2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtcGFsbWFzLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtcGFsbWFzLmMKQEAgLTEwMDQsOSArMTAwNCw3IEBACiAJYm9vbCBlbmFibGVfZHZmczIgPSBmYWxzZTsKIAogCWlmIChwZGV2LT5kZXYub2Zfbm9kZSkgewotCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKLQkJbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2UocGFsbWFzX3BpbmN0cmxfb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOwotCQlwaW5jdHJsX2RhdGEgPSBtYXRjaC0+ZGF0YTsKKwkJcGluY3RybF9kYXRhID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKCZwZGV2LT5kZXYpOwogCQllbmFibGVfZHZmczEgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsCiAJCQkJCSJ0aSxwYWxtYXMtZW5hYmxlLWR2ZnMxIik7CiAJCWVuYWJsZV9kdmZzMiA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXBpc3RhY2hpby5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtcGlzdGFjaGlvLmMKaW5kZXggYzZkNDEwZS4uNTUzNzViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtcGlzdGFjaGlvLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtcGlzdGFjaGlvLmMKQEAgLTgwOSwxNyArODA5LDE3IEBACiAJCQkgICBQQURTX0ZVTkNUSU9OX1NFTEVDVDIsIDEyLCAweDMpLAogCU1GSU9fTVVYX1BJTl9HUk9VUCg4MywgTUlQU19QTExfTE9DSywgTUlQU19UUkFDRV9EQVRBLCBVU0JfREVCVUcsCiAJCQkgICBQQURTX0ZVTkNUSU9OX1NFTEVDVDIsIDE0LCAweDMpLAotCU1GSU9fTVVYX1BJTl9HUk9VUCg4NCwgU1lTX1BMTF9MT0NLLCBNSVBTX1RSQUNFX0RBVEEsIFVTQl9ERUJVRywKKwlNRklPX01VWF9QSU5fR1JPVVAoODQsIEFVRElPX1BMTF9MT0NLLCBNSVBTX1RSQUNFX0RBVEEsIFVTQl9ERUJVRywKIAkJCSAgIFBBRFNfRlVOQ1RJT05fU0VMRUNUMiwgMTYsIDB4MyksCi0JTUZJT19NVVhfUElOX0dST1VQKDg1LCBXSUZJX1BMTF9MT0NLLCBNSVBTX1RSQUNFX0RBVEEsIFNESE9TVF9ERUJVRywKKwlNRklPX01VWF9QSU5fR1JPVVAoODUsIFJQVV9WX1BMTF9MT0NLLCBNSVBTX1RSQUNFX0RBVEEsIFNESE9TVF9ERUJVRywKIAkJCSAgIFBBRFNfRlVOQ1RJT05fU0VMRUNUMiwgMTgsIDB4MyksCi0JTUZJT19NVVhfUElOX0dST1VQKDg2LCBCVF9QTExfTE9DSywgTUlQU19UUkFDRV9EQVRBLCBTREhPU1RfREVCVUcsCisJTUZJT19NVVhfUElOX0dST1VQKDg2LCBSUFVfTF9QTExfTE9DSywgTUlQU19UUkFDRV9EQVRBLCBTREhPU1RfREVCVUcsCiAJCQkgICBQQURTX0ZVTkNUSU9OX1NFTEVDVDIsIDIwLCAweDMpLAotCU1GSU9fTVVYX1BJTl9HUk9VUCg4NywgUlBVX1ZfUExMX0xPQ0ssIERSRVEyLCBTT0NJRl9ERUJVRywKKwlNRklPX01VWF9QSU5fR1JPVVAoODcsIFNZU19QTExfTE9DSywgRFJFUTIsIFNPQ0lGX0RFQlVHLAogCQkJICAgUEFEU19GVU5DVElPTl9TRUxFQ1QyLCAyMiwgMHgzKSwKLQlNRklPX01VWF9QSU5fR1JPVVAoODgsIFJQVV9MX1BMTF9MT0NLLCBEUkVRMywgU09DSUZfREVCVUcsCisJTUZJT19NVVhfUElOX0dST1VQKDg4LCBXSUZJX1BMTF9MT0NLLCBEUkVRMywgU09DSUZfREVCVUcsCiAJCQkgICBQQURTX0ZVTkNUSU9OX1NFTEVDVDIsIDI0LCAweDMpLAotCU1GSU9fTVVYX1BJTl9HUk9VUCg4OSwgQVVESU9fUExMX0xPQ0ssIERSRVE0LCBEUkVRNSwKKwlNRklPX01VWF9QSU5fR1JPVVAoODksIEJUX1BMTF9MT0NLLCBEUkVRNCwgRFJFUTUsCiAJCQkgICBQQURTX0ZVTkNUSU9OX1NFTEVDVDIsIDI2LCAweDMpLAogCVBJTl9HUk9VUChUQ0ssICJ0Y2siKSwKIAlQSU5fR1JPVVAoVFJTVE4sICJ0cnN0biIpLApAQCAtMTQzMiw3ICsxNDMyLDYgQEAKIHsKIAlzdHJ1Y3QgcGlzdGFjaGlvX3BpbmN0cmwgKnBjdGw7CiAJc3RydWN0IHJlc291cmNlICpyZXM7Ci0JaW50IHJldDsKIAogCXBjdGwgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwY3RsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwY3RsKQpAQCAtMTQ2NCwxMyArMTQ2Myw3IEBACiAJCXJldHVybiBQVFJfRVJSKHBjdGwtPnBjdGxkZXYpOwogCX0KIAotCXJldCA9IHBpc3RhY2hpb19ncGlvX3JlZ2lzdGVyKHBjdGwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXBpbmN0cmxfdW5yZWdpc3RlcihwY3RsLT5wY3RsZGV2KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcGlzdGFjaGlvX2dwaW9fcmVnaXN0ZXIocGN0bCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBpc3RhY2hpb19waW5jdHJsX2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXJvY2tjaGlwLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1yb2NrY2hpcC5jCmluZGV4IDQ0OTAyYzYuLjQ5YmY3ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXJvY2tjaGlwLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtcm9ja2NoaXAuYwpAQCAtMjMsNyArMjMsNyBAQAogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CkBAIC0yNzA0LDcgKzI3MDQsNiBAQAogCQkuZGF0YSA9ICh2b2lkICopJnJrMzM5OV9waW5fY3RybCB9LAogCXt9LAogfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHJvY2tjaGlwX3BpbmN0cmxfZHRfbWF0Y2gpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByb2NrY2hpcF9waW5jdHJsX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gcm9ja2NoaXBfcGluY3RybF9wcm9iZSwKQEAgLTI3MjAsNyArMjcxOSwzIEBACiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmcm9ja2NoaXBfcGluY3RybF9kcml2ZXIpOwogfQogcG9zdGNvcmVfaW5pdGNhbGwocm9ja2NoaXBfcGluY3RybF9kcnZfcmVnaXN0ZXIpOwotCi1NT0RVTEVfQVVUSE9SKCJIZWlrbyBTdHVlYm5lciA8aGVpa29Ac250ZWNoLmRlPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJSb2NrY2hpcCBwaW5jdHJsIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc3QuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXN0LmMKaW5kZXggMGRlMWM2Ny4uOTlkYTRjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc3QuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zdC5jCkBAIC0zMzUsNjEgKzMzNSwyNSBAQAogfTsKIAogLyogU09DIHNwZWNpZmljIGRhdGEgKi8KLS8qIFNUaUg0MTUgZGF0YSAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzdGloNDE1X2lucHV0X2RlbGF5c1tdID0gezAsIDUwMCwgMTAwMCwgMTUwMH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHN0aWg0MTVfb3V0cHV0X2RlbGF5c1tdID0gezAsIDEwMDAsIDIwMDAsIDMwMDB9OwogCi0jZGVmaW5lIFNUSUg0MTVfUENUUkxfQ09NTU9OX0RBVEEJCQkJXAotCS5ydF9zdHlsZQk9IHN0X3JldGltZV9zdHlsZV9wYWNrZWQsCQlcCi0JLmlucHV0X2RlbGF5cwk9IHN0aWg0MTVfaW5wdXRfZGVsYXlzLAkJCVwKLQkubmlucHV0X2RlbGF5cwk9IEFSUkFZX1NJWkUoc3RpaDQxNV9pbnB1dF9kZWxheXMpLAlcCi0JLm91dHB1dF9kZWxheXMgPSBzdGloNDE1X291dHB1dF9kZWxheXMsCQkJXAotCS5ub3V0cHV0X2RlbGF5cyA9IEFSUkFZX1NJWkUoc3RpaDQxNV9vdXRwdXRfZGVsYXlzKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0X3BjdGxfZGF0YSAgc3RpaDQxNV9zYmNfZGF0YSA9IHsKLQlTVElINDE1X1BDVFJMX0NPTU1PTl9EQVRBLAotCS5hbHQgPSAwLCAub2UgPSA1LCAucHUgPSA3LCAub2QgPSA5LCAucnQgPSAxNiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RfcGN0bF9kYXRhICBzdGloNDE1X2Zyb250X2RhdGEgPSB7Ci0JU1RJSDQxNV9QQ1RSTF9DT01NT05fREFUQSwKLQkuYWx0ID0gMCwgLm9lID0gOCwgLnB1ID0gMTAsIC5vZCA9IDEyLCAucnQgPSAxNiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RfcGN0bF9kYXRhICBzdGloNDE1X3JlYXJfZGF0YSA9IHsKLQlTVElINDE1X1BDVFJMX0NPTU1PTl9EQVRBLAotCS5hbHQgPSAwLCAub2UgPSA2LCAucHUgPSA4LCAub2QgPSAxMCwgLnJ0ID0gMzgsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0X3BjdGxfZGF0YSAgc3RpaDQxNV9sZWZ0X2RhdGEgPSB7Ci0JU1RJSDQxNV9QQ1RSTF9DT01NT05fREFUQSwKLQkuYWx0ID0gMCwgLm9lID0gMywgLnB1ID0gNCwgLm9kID0gNSwgLnJ0ID0gNiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RfcGN0bF9kYXRhICBzdGloNDE1X3JpZ2h0X2RhdGEgPSB7Ci0JU1RJSDQxNV9QQ1RSTF9DT01NT05fREFUQSwKLQkuYWx0ID0gMCwgLm9lID0gNSwgLnB1ID0gNywgLm9kID0gOSwgLnJ0ID0gMTEsCi19OwotCi0vKiBTVGlINDE2IGRhdGEgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3RpaDQxNl9kZWxheXNbXSA9IHswLCAzMDAsIDUwMCwgNzUwLCAxMDAwLCAxMjUwLAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzdGloNDA3X2RlbGF5c1tdID0gezAsIDMwMCwgNTAwLCA3NTAsIDEwMDAsIDEyNTAsCiAJCQkxNTAwLCAxNzUwLCAyMDAwLCAyMjUwLCAyNTAwLCAyNzUwLCAzMDAwLCAzMjUwIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RfcGN0bF9kYXRhICBzdGloNDE2X2RhdGEgPSB7Ci0JLnJ0X3N0eWxlCT0gc3RfcmV0aW1lX3N0eWxlX2RlZGljYXRlZCwKLQkuaW5wdXRfZGVsYXlzCT0gc3RpaDQxNl9kZWxheXMsCi0JLm5pbnB1dF9kZWxheXMJPSBBUlJBWV9TSVpFKHN0aWg0MTZfZGVsYXlzKSwKLQkub3V0cHV0X2RlbGF5cwk9IHN0aWg0MTZfZGVsYXlzLAotCS5ub3V0cHV0X2RlbGF5cyA9IEFSUkFZX1NJWkUoc3RpaDQxNl9kZWxheXMpLAorc3RhdGljIGNvbnN0IHN0cnVjdCBzdF9wY3RsX2RhdGEgIHN0aWg0MDdfZGF0YSA9IHsKKwkucnRfc3R5bGUgICAgICAgPSBzdF9yZXRpbWVfc3R5bGVfZGVkaWNhdGVkLAorCS5pbnB1dF9kZWxheXMgICA9IHN0aWg0MDdfZGVsYXlzLAorCS5uaW5wdXRfZGVsYXlzICA9IEFSUkFZX1NJWkUoc3RpaDQwN19kZWxheXMpLAorCS5vdXRwdXRfZGVsYXlzICA9IHN0aWg0MDdfZGVsYXlzLAorCS5ub3V0cHV0X2RlbGF5cyA9IEFSUkFZX1NJWkUoc3RpaDQwN19kZWxheXMpLAogCS5hbHQgPSAwLCAub2UgPSA0MCwgLnB1ID0gNTAsIC5vZCA9IDYwLCAucnQgPSAxMDAsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN0X3BjdGxfZGF0YSBzdGloNDA3X2ZsYXNoZGF0YSA9IHsKIAkucnRfc3R5bGUJPSBzdF9yZXRpbWVfc3R5bGVfbm9uZSwKLQkuaW5wdXRfZGVsYXlzCT0gc3RpaDQxNl9kZWxheXMsCi0JLm5pbnB1dF9kZWxheXMJPSBBUlJBWV9TSVpFKHN0aWg0MTZfZGVsYXlzKSwKLQkub3V0cHV0X2RlbGF5cwk9IHN0aWg0MTZfZGVsYXlzLAotCS5ub3V0cHV0X2RlbGF5cyA9IEFSUkFZX1NJWkUoc3RpaDQxNl9kZWxheXMpLAorCS5pbnB1dF9kZWxheXMJPSBzdGloNDA3X2RlbGF5cywKKwkubmlucHV0X2RlbGF5cwk9IEFSUkFZX1NJWkUoc3RpaDQwN19kZWxheXMpLAorCS5vdXRwdXRfZGVsYXlzCT0gc3RpaDQwN19kZWxheXMsCisJLm5vdXRwdXRfZGVsYXlzID0gQVJSQVlfU0laRShzdGloNDA3X2RlbGF5cyksCiAJLmFsdCA9IDAsCiAJLm9lID0gLTEsIC8qIE5vdCBBdmFpbGFibGUgKi8KIAkucHUgPSAtMSwgLyogTm90IEF2YWlsYWJsZSAqLwpAQCAtNzk5LDIxICs3NjMsNiBAQAogCXJldHVybiAoZGlyZWN0aW9uID09IFNUX0dQSU9fRElSRUNUSU9OX0lOKTsKIH0KIAotc3RhdGljIGludCBzdF9ncGlvX3hsYXRlKHN0cnVjdCBncGlvX2NoaXAgKmdjLAotCQkJY29uc3Qgc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqZ3Bpb3NwZWMsIHUzMiAqZmxhZ3MpCi17Ci0JaWYgKFdBUk5fT04oZ2MtPm9mX2dwaW9fbl9jZWxscyA8IDEpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChXQVJOX09OKGdwaW9zcGVjLT5hcmdzX2NvdW50IDwgZ2MtPm9mX2dwaW9fbl9jZWxscykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGdwaW9zcGVjLT5hcmdzWzBdID4gZ2MtPm5ncGlvKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiBncGlvc3BlYy0+YXJnc1swXTsKLX0KLQogLyogUGluY3RybCBHcm91cHMgKi8KIHN0YXRpYyBpbnQgc3RfcGN0bF9nZXRfZ3JvdXBzX2NvdW50KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldikKIHsKQEAgLTE0ODYsOCArMTQzNSw2IEBACiAJLmRpcmVjdGlvbl9vdXRwdXQJPSBzdF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCiAJLmdldF9kaXJlY3Rpb24JCT0gc3RfZ3Bpb19nZXRfZGlyZWN0aW9uLAogCS5uZ3BpbwkJCT0gU1RfR1BJT19QSU5TX1BFUl9CQU5LLAotCS5vZl9ncGlvX25fY2VsbHMJPSAxLAotCS5vZl94bGF0ZQkJPSBzdF9ncGlvX3hsYXRlLAogfTsKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzdF9ncGlvX2lycWNoaXAgPSB7CkBAIC0xNTc5LDIxICsxNTI2LDkgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3RfcGN0bF9vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNS1zYmMtcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MTVfc2JjX2RhdGEgfSwKLQl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MTUtcmVhci1waW5jdHJsIiwgLmRhdGEgPSAmc3RpaDQxNV9yZWFyX2RhdGEgfSwKLQl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MTUtbGVmdC1waW5jdHJsIiwgLmRhdGEgPSAmc3RpaDQxNV9sZWZ0X2RhdGEgfSwKLQl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MTUtcmlnaHQtcGluY3RybCIsCi0JCS5kYXRhID0gJnN0aWg0MTVfcmlnaHRfZGF0YSB9LAotCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNS1mcm9udC1waW5jdHJsIiwKLQkJLmRhdGEgPSAmc3RpaDQxNV9mcm9udF9kYXRhIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LXNiYy1waW5jdHJsIiwgLmRhdGEgPSAmc3RpaDQxNl9kYXRhfSwKLQl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MTYtZnJvbnQtcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MTZfZGF0YX0sCi0JeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LXJlYXItcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MTZfZGF0YX0sCi0JeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LWZ2ZHAtZmUtcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MTZfZGF0YX0sCi0JeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LWZ2ZHAtbGl0ZS1waW5jdHJsIiwgLmRhdGEgPSAmc3RpaDQxNl9kYXRhfSwKLQl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MDctc2JjLXBpbmN0cmwiLCAuZGF0YSA9ICZzdGloNDE2X2RhdGF9LAotCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy1mcm9udC1waW5jdHJsIiwgLmRhdGEgPSAmc3RpaDQxNl9kYXRhfSwKLQl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MDctcmVhci1waW5jdHJsIiwgLmRhdGEgPSAmc3RpaDQxNl9kYXRhfSwKKwl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MDctc2JjLXBpbmN0cmwiLCAuZGF0YSA9ICZzdGloNDA3X2RhdGF9LAorCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy1mcm9udC1waW5jdHJsIiwgLmRhdGEgPSAmc3RpaDQwN19kYXRhfSwKKwl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MDctcmVhci1waW5jdHJsIiwgLmRhdGEgPSAmc3RpaDQwN19kYXRhfSwKIAl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MDctZmxhc2gtcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MDdfZmxhc2hkYXRhfSwKIAl7IC8qIHNlbnRpbmVsICovIH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC16eW5xLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC16eW5xLmMKaW5kZXggN2FmZGJlZC4uZTBlY2ZmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtenlucS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXp5bnEuYwpAQCAtMjMzLDcgKzIzMyw3IEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaW8xXzBfcGluc1tdID0gezEwLCAxMSwgMTIsIDEzLCAxNCwgMTV9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGlvMV8xX3BpbnNbXSA9IHsyMiwgMjMsIDI0LCAyNSwgMjYsIDI3fTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RpbzFfMl9waW5zW10gPSB7MzQsIDM1LCAzNiwgMzcsIDM4LCAzOX07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaW8xXzNfcGluc1tdID0gezQ2LCA0NywgNDgsIDQ5LCA0MCwgNTF9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGlvMV8zX3BpbnNbXSA9IHs0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RpbzBfZW1pb193cF9waW5zW10gPSB7NTR9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGlvMF9lbWlvX2NkX3BpbnNbXSA9IHs1NX07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaW8xX2VtaW9fd3BfcGluc1tdID0gezU2fTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtbXNtLmMgYi9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLW1zbS5jCmluZGV4IDUxYzQyZDcuLjc3NWM4ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtbXNtLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1tc20uYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKIAl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGctPmN0bF9yZWcpOwotCXZhbCAmPSBtYXNrOworCXZhbCAmPSB+bWFzazsKIAl2YWwgfD0gaSA8PCBnLT5tdXhfYml0OwogCXdyaXRlbCh2YWwsIHBjdHJsLT5yZWdzICsgZy0+Y3RsX3JlZyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtc3BtaS1ncGlvLmMgYi9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXNwbWktZ3Bpby5jCmluZGV4IDY4NmFjY2IuLjY2NGI2NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtc3BtaS1ncGlvLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1zcG1pLWdwaW8uYwpAQCAtODAwLDYgKzgwMCw3IEBACiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLHBtODk0MS1ncGlvIiB9LAkvKiAzNiBHUElPJ3MgKi8KIAl7IC5jb21wYXRpYmxlID0gInFjb20scG04OTk0LWdwaW8iIH0sCS8qIDIyIEdQSU8ncyAqLwogCXsgLmNvbXBhdGlibGUgPSAicWNvbSxwbWE4MDg0LWdwaW8iIH0sCS8qIDIyIEdQSU8ncyAqLworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxzcG1pLWdwaW8iIH0sIC8qIEdlbmVyaWMgKi8KIAl7IH0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXNwbWktbXBwLmMgYi9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXNwbWktbXBwLmMKaW5kZXggMTczNWZmZS4uNjU1NmRiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1zcG1pLW1wcC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtc3BtaS1tcHAuYwpAQCAtOTE0LDYgKzkxNCw3IEBACiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLHBtODk0MS1tcHAiIH0sCS8qIDggTVBQJ3MgKi8KIAl7IC5jb21wYXRpYmxlID0gInFjb20scG04OTk0LW1wcCIgfSwJLyogOCBNUFAncyAqLwogCXsgLmNvbXBhdGlibGUgPSAicWNvbSxwbWE4MDg0LW1wcCIgfSwJLyogOCBNUFAncyAqLworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxzcG1pLW1wcCIgfSwJLyogR2VuZXJpYyAqLwogCXsgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zYW1zdW5nL3BpbmN0cmwtZXh5bm9zLmMgYi9kcml2ZXJzL3BpbmN0cmwvc2Ftc3VuZy9waW5jdHJsLWV4eW5vcy5jCmluZGV4IDA1MWI1YmYuLmQzMmZhMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zYW1zdW5nL3BpbmN0cmwtZXh5bm9zLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3NhbXN1bmcvcGluY3RybC1leHlub3MuYwpAQCAtNDI4LDE0ICs0MjgsMTAgQEAKIAlpbnQgZWludF9pcnE7CiAKIAljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKLQljaGlwLT5pcnFfbWFzaygmZGVzYy0+aXJxX2RhdGEpOwotCi0JaWYgKGNoaXAtPmlycV9hY2spCi0JCWNoaXAtPmlycV9hY2soJmRlc2MtPmlycV9kYXRhKTsKIAogCWVpbnRfaXJxID0gaXJxX2xpbmVhcl9yZXZtYXAoYmFuay0+aXJxX2RvbWFpbiwgZWludGQtPmlycSk7CiAJZ2VuZXJpY19oYW5kbGVfaXJxKGVpbnRfaXJxKTsKLQljaGlwLT5pcnFfdW5tYXNrKCZkZXNjLT5pcnFfZGF0YSk7CisKIAljaGFpbmVkX2lycV9leGl0KGNoaXAsIGRlc2MpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2Ftc3VuZy9waW5jdHJsLXNhbXN1bmcuYyBiL2RyaXZlcnMvcGluY3RybC9zYW1zdW5nL3BpbmN0cmwtc2Ftc3VuZy5jCmluZGV4IDUxM2ZlNmIuLjYyMDcyN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zYW1zdW5nL3BpbmN0cmwtc2Ftc3VuZy5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zYW1zdW5nL3BpbmN0cmwtc2Ftc3VuZy5jCkBAIC0xMDQxLDE3ICsxMDQxLDkgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQgcmV0OwogCi0JaWYgKCFkZXYtPm9mX25vZGUpIHsKLQkJZGV2X2VycihkZXYsICJkZXZpY2UgdHJlZSBub2RlIG5vdCBmb3VuZFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQogCWRydmRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRydmRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRydmRhdGEpIHsKLQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkcml2ZXIncyAiCi0JCQkJInByaXZhdGUgZGF0YVxuIik7CisJaWYgKCFkcnZkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAljdHJsID0gc2Ftc3VuZ19waW5jdHJsX2dldF9zb2NfZGF0YShkcnZkYXRhLCBwZGV2KTsKIAlpZiAoSVNfRVJSKGN0cmwpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL0tjb25maWcgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL0tjb25maWcKaW5kZXggNDE1ZGQ4MC4uMDdlY2E1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvS2NvbmZpZwpAQCAtNTQsNiArNTQsMTEgQEAKIAlkZXBlbmRzIG9uIEFSQ0hfUjhBNzc5MQogCXNlbGVjdCBQSU5DVFJMX1NIX1BGQwogCitjb25maWcgUElOQ1RSTF9QRkNfUjhBNzc5MgorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIEFSQ0hfUjhBNzc5MgorCXNlbGVjdCBQSU5DVFJMX1NIX1BGQworCiBjb25maWcgUElOQ1RSTF9QRkNfUjhBNzc5MwogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIEFSQ0hfUjhBNzc5MwpAQCAtNjksNiArNzQsMTEgQEAKIAlkZXBlbmRzIG9uIEFSQ0hfUjhBNzc5NQogCXNlbGVjdCBQSU5DVFJMX1NIX1BGQwogCitjb25maWcgUElOQ1RSTF9QRkNfUjhBNzc5NgorICAgICAgICBkZWZfYm9vbCB5CisgICAgICAgIGRlcGVuZHMgb24gQVJDSF9SOEE3Nzk2CisgICAgICAgIHNlbGVjdCBQSU5DVFJMX1NIX1BGQworCiBjb25maWcgUElOQ1RSTF9QRkNfU0g3MjAzCiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3MjAzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL01ha2VmaWxlIGIvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9NYWtlZmlsZQppbmRleCA4YTJjODcxLi4yZGRhOGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvTWFrZWZpbGUKQEAgLTcsOSArNywxMSBAQAogb2JqLSQoQ09ORklHX1BJTkNUUkxfUEZDX1I4QTc3NzkpCSs9IHBmYy1yOGE3Nzc5Lm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1BGQ19SOEE3NzkwKQkrPSBwZmMtcjhhNzc5MC5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9QRkNfUjhBNzc5MSkJKz0gcGZjLXI4YTc3OTEubworb2JqLSQoQ09ORklHX1BJTkNUUkxfUEZDX1I4QTc3OTIpCSs9IHBmYy1yOGE3NzkyLm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1BGQ19SOEE3NzkzKQkrPSBwZmMtcjhhNzc5MS5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9QRkNfUjhBNzc5NCkJKz0gcGZjLXI4YTc3OTQubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfUEZDX1I4QTc3OTUpCSs9IHBmYy1yOGE3Nzk1Lm8KK29iai0kKENPTkZJR19QSU5DVFJMX1BGQ19SOEE3Nzk2KQkrPSBwZmMtcjhhNzc5Ni5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9QRkNfU0g3MjAzKQkrPSBwZmMtc2g3MjAzLm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1BGQ19TSDcyNjQpCSs9IHBmYy1zaDcyNjQubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfUEZDX1NINzI2OSkJKz0gcGZjLXNoNzI2OS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL2NvcmUuYyBiL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvY29yZS5jCmluZGV4IGEzYjgyMDQuLmYzYTg4OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvY29yZS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvY29yZS5jCkBAIC00OTQsNiArNDk0LDEyIEBACiAJCS5kYXRhID0gJnI4YTc3OTFfcGlubXV4X2luZm8sCiAJfSwKICNlbmRpZgorI2lmZGVmIENPTkZJR19QSU5DVFJMX1BGQ19SOEE3NzkyCisJeworCQkuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHBmYy1yOGE3NzkyIiwKKwkJLmRhdGEgPSAmcjhhNzc5Ml9waW5tdXhfaW5mbywKKwl9LAorI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BJTkNUUkxfUEZDX1I4QTc3OTMKIAl7CiAJCS5jb21wYXRpYmxlID0gInJlbmVzYXMscGZjLXI4YTc3OTMiLApAQCAtNTEyLDYgKzUxOCwxMiBAQAogCQkuZGF0YSA9ICZyOGE3Nzk1X3Bpbm11eF9pbmZvLAogCX0sCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfUElOQ1RSTF9QRkNfUjhBNzc5NgorCXsKKwkJLmNvbXBhdGlibGUgPSAicmVuZXNhcyxwZmMtcjhhNzc5NiIsCisJCS5kYXRhID0gJnI4YTc3OTZfcGlubXV4X2luZm8sCisJfSwKKyNlbmRpZgogI2lmZGVmIENPTkZJR19QSU5DVFJMX1BGQ19TSDczQTAKIAl7CiAJCS5jb21wYXRpYmxlID0gInJlbmVzYXMscGZjLXNoNzNhMCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3NzkxLmMgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3NzkxLmMKaW5kZXggMGMxYTYwYy4uN2NhMzdjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5MS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGZjLXI4YTc3OTEuYwpAQCAtMTMsNiArMTMsMTAgQEAKIAogI2luY2x1ZGUgInNoX3BmYy5oIgogCisvKgorICogUGlucyAwLTIzIGFzc2lnbmVkIHRvIEdQSU8gYmFuayA2IGNhbiBiZSB1c2VkIGZvciBTRCBpbnRlcmZhY2VzIGluCisgKiB3aGljaCBjYXNlIHRoZXkgc3VwcG9ydCBib3RoIDMuM1YgYW5kIDEuOFYgc2lnbmFsbGluZy4KKyAqLwogI2RlZmluZSBDUFVfQUxMX1BPUlQoZm4sIHNmeCkJCQkJCQlcCiAJUE9SVF9HUF8zMigwLCBmbiwgc2Z4KSwJCQkJCQlcCiAJUE9SVF9HUF8yNigxLCBmbiwgc2Z4KSwJCQkJCQlcCkBAIC0yMCw3ICsyNCwxNSBAQAogCVBPUlRfR1BfMzIoMywgZm4sIHNmeCksCQkJCQkJXAogCVBPUlRfR1BfMzIoNCwgZm4sIHNmeCksCQkJCQkJXAogCVBPUlRfR1BfMzIoNSwgZm4sIHNmeCksCQkJCQkJXAotCVBPUlRfR1BfMzIoNiwgZm4sIHNmeCksCQkJCQkJXAorCVBPUlRfR1BfQ0ZHXzI0KDYsIGZuLCBzZngsIFNIX1BGQ19QSU5fQ0ZHX0lPX1ZPTFRBR0UpLAkJXAorCVBPUlRfR1BfMSg2LCAyNCwgZm4sIHNmeCksCQkJCQlcCisJUE9SVF9HUF8xKDYsIDI1LCBmbiwgc2Z4KSwJCQkJCVwKKwlQT1JUX0dQXzEoNiwgMjYsIGZuLCBzZngpLAkJCQkJXAorCVBPUlRfR1BfMSg2LCAyNywgZm4sIHNmeCksCQkJCQlcCisJUE9SVF9HUF8xKDYsIDI4LCBmbiwgc2Z4KSwJCQkJCVwKKwlQT1JUX0dQXzEoNiwgMjksIGZuLCBzZngpLAkJCQkJXAorCVBPUlRfR1BfMSg2LCAzMCwgZm4sIHNmeCksCQkJCQlcCisJUE9SVF9HUF8xKDYsIDMxLCBmbiwgc2Z4KSwJCQkJCVwKIAlQT1JUX0dQXzI2KDcsIGZuLCBzZngpCiAKIGVudW0gewpAQCAtNjQwNCw5ICs2NDE2LDI0IEBACiAJeyB9LAogfTsKIAorc3RhdGljIGludCByOGE3NzkxX3Bpbl90b19wb2NjdHJsKHN0cnVjdCBzaF9wZmMgKnBmYywgdW5zaWduZWQgaW50IHBpbiwgdTMyICpwb2NjdHJsKQoreworCWlmIChwaW4gPCBSQ0FSX0dQX1BJTig2LCAwKSB8fCBwaW4gPiBSQ0FSX0dQX1BJTig2LCAyMykpCisJCXJldHVybiAtRUlOVkFMOworCisJKnBvY2N0cmwgPSAweGU2MDYwMDhjOworCisJcmV0dXJuIDMxIC0gKHBpbiAmIDB4MWYpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX3BmY19zb2Nfb3BlcmF0aW9ucyByOGE3NzkxX3Bpbm11eF9vcHMgPSB7CisJLnBpbl90b19wb2NjdHJsID0gcjhhNzc5MV9waW5fdG9fcG9jY3RybCwKK307CisKICNpZmRlZiBDT05GSUdfUElOQ1RSTF9QRkNfUjhBNzc5MQogY29uc3Qgc3RydWN0IHNoX3BmY19zb2NfaW5mbyByOGE3NzkxX3Bpbm11eF9pbmZvID0gewogCS5uYW1lID0gInI4YTc3OTEwX3BmYyIsCisJLm9wcyA9ICZyOGE3NzkxX3Bpbm11eF9vcHMsCiAJLnVubG9ja19yZWcgPSAweGU2MDYwMDAwLCAvKiBQTU1SICovCiAKIAkuZnVuY3Rpb24gPSB7IFBJTk1VWF9GVU5DVElPTl9CRUdJTiwgUElOTVVYX0ZVTkNUSU9OX0VORCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5Mi5jIGIvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYmFkYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3NzkyLmMKQEAgLTAsMCArMSwyNzM5IEBACisvKgorICogcjhhNzc5MiBwcm9jZXNzb3Igc3VwcG9ydCAtIFBGQyBoYXJkd2FyZSBibG9jay4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNCBSZW5lc2FzIEVsZWN0cm9uaWNzIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQ29nZW50IEVtYmVkZGVkLCBJbmMuLCA8c291cmNlQGNvZ2VudGVtYmVkZGVkLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJzaF9wZmMuaCIKKworI2RlZmluZSBDUFVfQUxMX1BPUlQoZm4sIHNmeCkJCQkJCQlcCisJUE9SVF9HUF8yOSgwLCBmbiwgc2Z4KSwJCQkJCQlcCisJUE9SVF9HUF8yMygxLCBmbiwgc2Z4KSwJCQkJCQlcCisJUE9SVF9HUF8zMigyLCBmbiwgc2Z4KSwJCQkJCQlcCisJUE9SVF9HUF8yOCgzLCBmbiwgc2Z4KSwJCQkJCQlcCisJUE9SVF9HUF8xNyg0LCBmbiwgc2Z4KSwJCQkJCQlcCisJUE9SVF9HUF8xNyg1LCBmbiwgc2Z4KSwJCQkJCQlcCisJUE9SVF9HUF8xNyg2LCBmbiwgc2Z4KSwJCQkJCQlcCisJUE9SVF9HUF8xNyg3LCBmbiwgc2Z4KSwJCQkJCQlcCisJUE9SVF9HUF8xNyg4LCBmbiwgc2Z4KSwJCQkJCQlcCisJUE9SVF9HUF8xNyg5LCBmbiwgc2Z4KSwJCQkJCQlcCisJUE9SVF9HUF8zMigxMCwgZm4sIHNmeCksCQkJCQlcCisJUE9SVF9HUF8zMCgxMSwgZm4sIHNmeCkKKworZW51bSB7CisJUElOTVVYX1JFU0VSVkVEID0gMCwKKworCVBJTk1VWF9EQVRBX0JFR0lOLAorCUdQX0FMTChEQVRBKSwKKwlQSU5NVVhfREFUQV9FTkQsCisKKwlQSU5NVVhfRlVOQ1RJT05fQkVHSU4sCisJR1BfQUxMKEZOKSwKKworCS8qIEdQU1IwICovCisJRk5fSVAwXzAsIEZOX0lQMF8xLCBGTl9JUDBfMiwgRk5fSVAwXzMsIEZOX0lQMF80LCBGTl9JUDBfNSwKKwlGTl9JUDBfNiwgRk5fSVAwXzcsIEZOX0lQMF84LCBGTl9JUDBfOSwgRk5fSVAwXzEwLCBGTl9JUDBfMTEsCisJRk5fSVAwXzEyLCBGTl9JUDBfMTMsIEZOX0lQMF8xNCwgRk5fSVAwXzE1LCBGTl9JUDBfMTYsCisJRk5fSVAwXzE3LCBGTl9JUDBfMTgsIEZOX0lQMF8xOSwgRk5fSVAwXzIwLCBGTl9JUDBfMjEsCisJRk5fSVAwXzIyLCBGTl9JUDBfMjMsIEZOX0lQMV8wLCBGTl9JUDFfMSwgRk5fSVAxXzIsCisJRk5fSVAxXzMsIEZOX0lQMV80LAorCisJLyogR1BTUjEgKi8KKwlGTl9JUDFfNSwgRk5fSVAxXzYsIEZOX0lQMV83LCBGTl9JUDFfOCwgRk5fSVAxXzksIEZOX0lQMV8xMCwKKwlGTl9JUDFfMTEsIEZOX0lQMV8xMiwgRk5fSVAxXzEzLCBGTl9JUDFfMTQsIEZOX0lQMV8xNSwgRk5fSVAxXzE2LAorCUZOX0RVMV9EQjJfQzBfREFUQTEyLCBGTl9EVTFfREIzX0MxX0RBVEExMywgRk5fRFUxX0RCNF9DMl9EQVRBMTQsCisJRk5fRFUxX0RCNV9DM19EQVRBMTUsIEZOX0RVMV9EQjZfQzQsIEZOX0RVMV9EQjdfQzUsCisJRk5fRFUxX0VYSFNZTkNfRFUxX0hTWU5DLCBGTl9EVTFfRVhWU1lOQ19EVTFfVlNZTkMsCisJRk5fRFUxX0VYT0RERl9EVTFfT0RERl9ESVNQX0NERSwgRk5fRFUxX0RJU1AsIEZOX0RVMV9DREUsCisKKwkvKiBHUFNSMiAqLworCUZOX0QwLCBGTl9EMSwgRk5fRDIsIEZOX0QzLCBGTl9ENCwgRk5fRDUsIEZOX0Q2LCBGTl9ENywKKwlGTl9EOCwgRk5fRDksIEZOX0QxMCwgRk5fRDExLCBGTl9EMTIsIEZOX0QxMywgRk5fRDE0LCBGTl9EMTUsCisJRk5fQTAsIEZOX0ExLCBGTl9BMiwgRk5fQTMsIEZOX0E0LCBGTl9BNSwgRk5fQTYsIEZOX0E3LAorCUZOX0E4LCBGTl9BOSwgRk5fQTEwLCBGTl9BMTEsIEZOX0ExMiwgRk5fQTEzLCBGTl9BMTQsIEZOX0ExNSwKKworCS8qIEdQU1IzICovCisJRk5fQTE2LCBGTl9BMTcsIEZOX0ExOCwgRk5fQTE5LCBGTl9JUDFfMTcsIEZOX0lQMV8xOCwKKwlGTl9DUzFfTl9BMjYsIEZOX0VYX0NTMF9OLCBGTl9FWF9DUzFfTiwgRk5fRVhfQ1MyX04sIEZOX0VYX0NTM19OLAorCUZOX0VYX0NTNF9OLCBGTl9FWF9DUzVfTiwgRk5fQlNfTiwgRk5fUkRfTiwgRk5fUkRfV1JfTiwKKwlGTl9XRTBfTiwgRk5fV0UxX04sIEZOX0VYX1dBSVQwLCBGTl9JUlEwLCBGTl9JUlExLCBGTl9JUlEyLCBGTl9JUlEzLAorCUZOX0lQMV8xOSwgRk5fSVAxXzIwLCBGTl9JUDFfMjEsIEZOX0lQMV8yMiwgRk5fQ1MwX04sCisKKwkvKiBHUFNSNCAqLworCUZOX1ZJMF9DTEssIEZOX1ZJMF9DTEtFTkIsIEZOX1ZJMF9IU1lOQ19OLCBGTl9WSTBfVlNZTkNfTiwKKwlGTl9WSTBfRDBfQjBfQzAsIEZOX1ZJMF9EMV9CMV9DMSwgRk5fVkkwX0QyX0IyX0MyLCBGTl9WSTBfRDNfQjNfQzMsCisJRk5fVkkwX0Q0X0I0X0M0LCBGTl9WSTBfRDVfQjVfQzUsIEZOX1ZJMF9ENl9CNl9DNiwgRk5fVkkwX0Q3X0I3X0M3LAorCUZOX1ZJMF9EOF9HMF9ZMCwgRk5fVkkwX0Q5X0cxX1kxLCBGTl9WSTBfRDEwX0cyX1kyLCBGTl9WSTBfRDExX0czX1kzLAorCUZOX1ZJMF9GSUVMRCwKKworCS8qIEdQU1I1ICovCisJRk5fVkkxX0NMSywgRk5fVkkxX0NMS0VOQiwgRk5fVkkxX0hTWU5DX04sIEZOX1ZJMV9WU1lOQ19OLAorCUZOX1ZJMV9EMF9CMF9DMCwgRk5fVkkxX0QxX0IxX0MxLCBGTl9WSTFfRDJfQjJfQzIsIEZOX1ZJMV9EM19CM19DMywKKwlGTl9WSTFfRDRfQjRfQzQsIEZOX1ZJMV9ENV9CNV9DNSwgRk5fVkkxX0Q2X0I2X0M2LCBGTl9WSTFfRDdfQjdfQzcsCisJRk5fVkkxX0Q4X0cwX1kwLCBGTl9WSTFfRDlfRzFfWTEsIEZOX1ZJMV9EMTBfRzJfWTIsIEZOX1ZJMV9EMTFfRzNfWTMsCisJRk5fVkkxX0ZJRUxELAorCisJLyogR1BTUjYgKi8KKwlGTl9JUDJfMCwgRk5fSVAyXzEsIEZOX0lQMl8yLCBGTl9JUDJfMywgRk5fSVAyXzQsIEZOX0lQMl81LCBGTl9JUDJfNiwKKwlGTl9JUDJfNywgRk5fSVAyXzgsIEZOX0lQMl85LCBGTl9JUDJfMTAsIEZOX0lQMl8xMSwgRk5fSVAyXzEyLAorCUZOX0lQMl8xMywgRk5fSVAyXzE0LCBGTl9JUDJfMTUsIEZOX0lQMl8xNiwKKworCS8qIEdQU1I3ICovCisJRk5fSVAzXzAsIEZOX0lQM18xLCBGTl9JUDNfMiwgRk5fSVAzXzMsIEZOX0lQM180LCBGTl9JUDNfNSwgRk5fSVAzXzYsCisJRk5fSVAzXzcsIEZOX0lQM184LCBGTl9JUDNfOSwgRk5fSVAzXzEwLCBGTl9JUDNfMTEsIEZOX0lQM18xMiwKKwlGTl9JUDNfMTMsIEZOX1ZJM19EMTBfWTIsIEZOX0lQM18xNCwgRk5fVkkzX0ZJRUxELAorCisJLyogR1BTUjggKi8KKwlGTl9WSTRfQ0xLLCBGTl9JUDRfMCwgRk5fSVA0XzEsIEZOX0lQNF8zXzIsIEZOX0lQNF80LCBGTl9JUDRfNl81LAorCUZOX0lQNF84XzcsIEZOX0lQNF8xMF85LCBGTl9JUDRfMTJfMTEsIEZOX0lQNF8xNF8xMywgRk5fSVA0XzE2XzE1LAorCUZOX0lQNF8xOF8xNywgRk5fSVA0XzIwXzE5LCBGTl9JUDRfMjEsIEZOX0lQNF8yMiwgRk5fSVA0XzIzLCBGTl9JUDRfMjQsCisKKwkvKiBHUFNSOSAqLworCUZOX1ZJNV9DTEssIEZOX0lQNV8wLCBGTl9JUDVfMSwgRk5fSVA1XzIsIEZOX0lQNV8zLCBGTl9JUDVfNCwgRk5fSVA1XzUsCisJRk5fSVA1XzYsIEZOX0lQNV83LCBGTl9JUDVfOCwgRk5fSVA1XzksIEZOX0lQNV8xMCwgRk5fSVA1XzExLAorCUZOX1ZJNV9EOV9ZMSwgRk5fVkk1X0QxMF9ZMiwgRk5fVkk1X0QxMV9ZMywgRk5fVkk1X0ZJRUxELAorCisJLyogR1BTUjEwICovCisJRk5fSVA2XzAsIEZOX0lQNl8xLCBGTl9IUlRTMF9OLCBGTl9JUDZfMiwgRk5fSVA2XzMsIEZOX0lQNl80LCBGTl9JUDZfNSwKKwlGTl9IQ1RTMV9OLCBGTl9JUDZfNiwgRk5fSVA2XzcsCUZOX1NDSzAsIEZOX0NUUzBfTiwgRk5fUlRTMF9OLAorCUZOX1RYMCwgRk5fUlgwLCBGTl9TQ0sxLCBGTl9DVFMxX04sIEZOX1JUUzFfTiwgRk5fVFgxLCBGTl9SWDEsCisJRk5fSVA2XzlfOCwgRk5fSVA2XzExXzEwLCBGTl9JUDZfMTNfMTIsIEZOX0lQNl8xNV8xNCwgRk5fSVA2XzE2LAorCUZOX0lQNl8xOF8xNywgRk5fU0NJRl9DTEssIEZOX0NBTjBfVFgsIEZOX0NBTjBfUlgsIEZOX0NBTl9DTEssCisJRk5fQ0FOMV9UWCwgRk5fQ0FOMV9SWCwKKworCS8qIEdQU1IxMSAqLworCUZOX0lQN18xXzAsIEZOX0lQN18zXzIsIEZOX0lQN181XzQsIEZOX0lQN182LCBGTl9JUDdfNywgRk5fU0QwX0NMSywKKwlGTl9TRDBfQ01ELCBGTl9TRDBfREFUMCwgRk5fU0QwX0RBVDEsIEZOX1NEMF9EQVQyLCBGTl9TRDBfREFUMywKKwlGTl9TRDBfQ0QsIEZOX1NEMF9XUCwgRk5fSVA3XzlfOCwgRk5fSVA3XzExXzEwLCBGTl9JUDdfMTNfMTIsCisJRk5fSVA3XzE1XzE0LCBGTl9JUDdfMTYsIEZOX0lQN18xNywgRk5fSVA3XzE4LCBGTl9JUDdfMTksIEZOX0lQN18yMCwKKwlGTl9BRElDTEssIEZOX0FESUNTX1NBTVAsIEZOX0FESURBVEEsIEZOX0FESUNIUzAsIEZOX0FESUNIUzEsCisJRk5fQURJQ0hTMiwgRk5fQVZTMSwgRk5fQVZTMiwKKworCS8qIElQU1IwICovCisJRk5fRFUwX0RSMF9EQVRBMCwgRk5fRFUwX0RSMV9EQVRBMSwgRk5fRFUwX0RSMl9ZNF9EQVRBMiwKKwlGTl9EVTBfRFIzX1k1X0RBVEEzLCBGTl9EVTBfRFI0X1k2X0RBVEE0LCBGTl9EVTBfRFI1X1k3X0RBVEE1LAorCUZOX0RVMF9EUjZfWThfREFUQTYsIEZOX0RVMF9EUjdfWTlfREFUQTcsIEZOX0RVMF9ERzBfREFUQTgsCisJRk5fRFUwX0RHMV9EQVRBOSwgRk5fRFUwX0RHMl9DNl9EQVRBMTAsIEZOX0RVMF9ERzNfQzdfREFUQTExLAorCUZOX0RVMF9ERzRfWTBfREFUQTEyLCBGTl9EVTBfREc1X1kxX0RBVEExMywgRk5fRFUwX0RHNl9ZMl9EQVRBMTQsCisJRk5fRFUwX0RHN19ZM19EQVRBMTUsIEZOX0RVMF9EQjAsIEZOX0RVMF9EQjEsIEZOX0RVMF9EQjJfQzAsCisJRk5fRFUwX0RCM19DMSwgRk5fRFUwX0RCNF9DMiwgRk5fRFUwX0RCNV9DMywgRk5fRFUwX0RCNl9DNCwKKwlGTl9EVTBfREI3X0M1LAorCisJLyogSVBTUjEgKi8KKwlGTl9EVTBfRVhIU1lOQ19EVTBfSFNZTkMsIEZOX0RVMF9FWFZTWU5DX0RVMF9WU1lOQywKKwlGTl9EVTBfRVhPRERGX0RVMF9PRERGX0RJU1BfQ0RFLCBGTl9EVTBfRElTUCwgRk5fRFUwX0NERSwKKwlGTl9EVTFfRFIyX1k0X0RBVEEwLCBGTl9EVTFfRFIzX1k1X0RBVEExLCBGTl9EVTFfRFI0X1k2X0RBVEEyLAorCUZOX0RVMV9EUjVfWTdfREFUQTMsIEZOX0RVMV9EUjZfREFUQTQsIEZOX0RVMV9EUjdfREFUQTUsCisJRk5fRFUxX0RHMl9DNl9EQVRBNiwgRk5fRFUxX0RHM19DN19EQVRBNywgRk5fRFUxX0RHNF9ZMF9EQVRBOCwKKwlGTl9EVTFfREc1X1kxX0RBVEE5LCBGTl9EVTFfREc2X1kyX0RBVEExMCwgRk5fRFUxX0RHN19ZM19EQVRBMTEsCisJRk5fQTIwLCBGTl9NT1NJX0lPMCwgRk5fQTIxLCBGTl9NSVNPX0lPMSwgRk5fQTIyLCBGTl9JTzIsCisJRk5fQTIzLCBGTl9JTzMsIEZOX0EyNCwgRk5fU1BDTEssIEZOX0EyNSwgRk5fU1NMLAorCisJLyogSVBTUjIgKi8KKwlGTl9WSTJfQ0xLLCBGTl9BVkJfUlhfQ0xLLCBGTl9WSTJfQ0xLRU5CLCBGTl9BVkJfUlhfRFYsCisJRk5fVkkyX0hTWU5DX04sIEZOX0FWQl9SWEQwLCBGTl9WSTJfVlNZTkNfTiwgRk5fQVZCX1JYRDEsCisJRk5fVkkyX0QwX0MwLCBGTl9BVkJfUlhEMiwgRk5fVkkyX0QxX0MxLCBGTl9BVkJfUlhEMywKKwlGTl9WSTJfRDJfQzIsIEZOX0FWQl9SWEQ0LCBGTl9WSTJfRDNfQzMsIEZOX0FWQl9SWEQ1LAorCUZOX1ZJMl9ENF9DNCwgRk5fQVZCX1JYRDYsIEZOX1ZJMl9ENV9DNSwgRk5fQVZCX1JYRDcsCisJRk5fVkkyX0Q2X0M2LCBGTl9BVkJfUlhfRVIsIEZOX1ZJMl9EN19DNywgRk5fQVZCX0NPTCwKKwlGTl9WSTJfRDhfWTAsIEZOX0FWQl9UWEQzLCBGTl9WSTJfRDlfWTEsIEZOX0FWQl9UWF9FTiwKKwlGTl9WSTJfRDEwX1kyLCBGTl9BVkJfVFhEMCwgRk5fVkkyX0QxMV9ZMywgRk5fQVZCX1RYRDEsCisJRk5fVkkyX0ZJRUxELCBGTl9BVkJfVFhEMiwKKworCS8qIElQU1IzICovCisJRk5fVkkzX0NMSywgRk5fQVZCX1RYX0NMSywgRk5fVkkzX0NMS0VOQiwgRk5fQVZCX1RYRDQsCisJRk5fVkkzX0hTWU5DX04sIEZOX0FWQl9UWEQ1LCBGTl9WSTNfVlNZTkNfTiwgRk5fQVZCX1RYRDYsCisJRk5fVkkzX0QwX0MwLCBGTl9BVkJfVFhENywgRk5fVkkzX0QxX0MxLCBGTl9BVkJfVFhfRVIsCisJRk5fVkkzX0QyX0MyLCBGTl9BVkJfR1RYX0NMSywgRk5fVkkzX0QzX0MzLCBGTl9BVkJfTURDLAorCUZOX1ZJM19ENF9DNCwgRk5fQVZCX01ESU8sIEZOX1ZJM19ENV9DNSwgRk5fQVZCX0xJTkssCisJRk5fVkkzX0Q2X0M2LCBGTl9BVkJfTUFHSUMsIEZOX1ZJM19EN19DNywgRk5fQVZCX1BIWV9JTlQsCisJRk5fVkkzX0Q4X1kwLCBGTl9BVkJfQ1JTLCBGTl9WSTNfRDlfWTEsIEZOX0FWQl9HVFhSRUZDTEssCisJRk5fVkkzX0QxMV9ZMywgRk5fQVZCX0FWVFBfTUFUQ0gsCisKKwkvKiBJUFNSNCAqLworCUZOX1ZJNF9DTEtFTkIsIEZOX1ZJMF9EMTJfRzRfWTQsIEZOX1ZJNF9IU1lOQ19OLCBGTl9WSTBfRDEzX0c1X1k1LAorCUZOX1ZJNF9WU1lOQ19OLCBGTl9WSTBfRDE0X0c2X1k2LCBGTl9SRFJfQ0xLT1VULAorCUZOX1ZJNF9EMF9DMCwgRk5fVkkwX0QxNV9HN19ZNywKKwlGTl9WSTRfRDFfQzEsIEZOX1ZJMF9EMTZfUjAsIEZOX1ZJMV9EMTJfRzRfWTQsCisJRk5fVkk0X0QyX0MyLCBGTl9WSTBfRDE3X1IxLCBGTl9WSTFfRDEzX0c1X1k1LAorCUZOX1ZJNF9EM19DMywgRk5fVkkwX0QxOF9SMiwgRk5fVkkxX0QxNF9HNl9ZNiwKKwlGTl9WSTRfRDRfQzQsIEZOX1ZJMF9EMTlfUjMsIEZOX1ZJMV9EMTVfRzdfWTcsCisJRk5fVkk0X0Q1X0M1LCBGTl9WSTBfRDIwX1I0LCBGTl9WSTJfRDEyX1k0LAorCUZOX1ZJNF9ENl9DNiwgRk5fVkkwX0QyMV9SNSwgRk5fVkkyX0QxM19ZNSwKKwlGTl9WSTRfRDdfQzcsIEZOX1ZJMF9EMjJfUjYsIEZOX1ZJMl9EMTRfWTYsCisJRk5fVkk0X0Q4X1kwLCBGTl9WSTBfRDIzX1I3LCBGTl9WSTJfRDE1X1k3LAorCUZOX1ZJNF9EOV9ZMSwgRk5fVkkzX0QxMl9ZNCwgRk5fVkk0X0QxMF9ZMiwgRk5fVkkzX0QxM19ZNSwKKwlGTl9WSTRfRDExX1kzLCBGTl9WSTNfRDE0X1k2LCBGTl9WSTRfRklFTEQsIEZOX1ZJM19EMTVfWTcsCisKKwkvKiBJUFNSNSAqLworCUZOX1ZJNV9DTEtFTkIsIEZOX1ZJMV9EMTJfRzRfWTRfQiwgRk5fVkk1X0hTWU5DX04sIEZOX1ZJMV9EMTNfRzVfWTVfQiwKKwlGTl9WSTVfVlNZTkNfTiwgRk5fVkkxX0QxNF9HNl9ZNl9CLCBGTl9WSTVfRDBfQzAsIEZOX1ZJMV9EMTVfRzdfWTdfQiwKKwlGTl9WSTVfRDFfQzEsIEZOX1ZJMV9EMTZfUjAsIEZOX1ZJNV9EMl9DMiwgRk5fVkkxX0QxN19SMSwKKwlGTl9WSTVfRDNfQzMsIEZOX1ZJMV9EMThfUjIsIEZOX1ZJNV9ENF9DNCwgRk5fVkkxX0QxOV9SMywKKwlGTl9WSTVfRDVfQzUsIEZOX1ZJMV9EMjBfUjQsIEZOX1ZJNV9ENl9DNiwgRk5fVkkxX0QyMV9SNSwKKwlGTl9WSTVfRDdfQzcsIEZOX1ZJMV9EMjJfUjYsIEZOX1ZJNV9EOF9ZMCwgRk5fVkkxX0QyM19SNywKKworCS8qIElQU1I2ICovCisJRk5fTVNJT0YwX1NDSywgRk5fSFNDSzAsIEZOX01TSU9GMF9TWU5DLCBGTl9IQ1RTMF9OLAorCUZOX01TSU9GMF9UWEQsIEZOX0hUWDAsIEZOX01TSU9GMF9SWEQsIEZOX0hSWDAsCisJRk5fTVNJT0YxX1NDSywgRk5fSFNDSzEsIEZOX01TSU9GMV9TWU5DLCBGTl9IUlRTMV9OLAorCUZOX01TSU9GMV9UWEQsIEZOX0hUWDEsIEZOX01TSU9GMV9SWEQsIEZOX0hSWDEsCisJRk5fRFJBQ0swLCBGTl9TQ0syLCBGTl9EQUNLMCwgRk5fVFgyLCBGTl9EUkVRMF9OLCBGTl9SWDIsCisJRk5fREFDSzEsIEZOX1NDSzMsIEZOX1RYMywgRk5fRFJFUTFfTiwgRk5fUlgzLAorCisJLyogSVBTUjcgKi8KKwlGTl9QV00wLCBGTl9UQ0xLMSwgRk5fRlNPX0NGRV8wLCBGTl9QV00xLCBGTl9UQ0xLMiwgRk5fRlNPX0NGRV8xLAorCUZOX1BXTTIsIEZOX1RDTEszLCBGTl9GU09fVE9FLCBGTl9QV00zLCBGTl9QV000LAorCUZOX1NTSV9TQ0szNCwgRk5fVFBVMFRPMCwgRk5fU1NJX1dTMzQsIEZOX1RQVTBUTzEsCisJRk5fU1NJX1NEQVRBMywgRk5fVFBVMFRPMiwgRk5fU1NJX1NDSzQsIEZOX1RQVTBUTzMsCisJRk5fU1NJX1dTNCwgRk5fU1NJX1NEQVRBNCwgRk5fQVVESU9fQ0xLT1VULAorCUZOX0FVRElPX0NMS0EsIEZOX0FVRElPX0NMS0IsCisKKwkvKiBNT0RfU0VMICovCisJRk5fU0VMX1ZJMV8wLCBGTl9TRUxfVkkxXzEsCisJUElOTVVYX0ZVTkNUSU9OX0VORCwKKworCVBJTk1VWF9NQVJLX0JFR0lOLAorCURVMV9EQjJfQzBfREFUQTEyX01BUkssIERVMV9EQjNfQzFfREFUQTEzX01BUkssCisJRFUxX0RCNF9DMl9EQVRBMTRfTUFSSywgRFUxX0RCNV9DM19EQVRBMTVfTUFSSywKKwlEVTFfREI2X0M0X01BUkssIERVMV9EQjdfQzVfTUFSSywgRFUxX0VYSFNZTkNfRFUxX0hTWU5DX01BUkssCisJRFUxX0VYVlNZTkNfRFUxX1ZTWU5DX01BUkssIERVMV9FWE9EREZfRFUxX09EREZfRElTUF9DREVfTUFSSywKKwlEVTFfRElTUF9NQVJLLCBEVTFfQ0RFX01BUkssCisKKwlEMF9NQVJLLCBEMV9NQVJLLCBEMl9NQVJLLCBEM19NQVJLLCBENF9NQVJLLCBENV9NQVJLLCBENl9NQVJLLAorCUQ3X01BUkssIEQ4X01BUkssIEQ5X01BUkssIEQxMF9NQVJLLCBEMTFfTUFSSywgRDEyX01BUkssIEQxM19NQVJLLAorCUQxNF9NQVJLLCBEMTVfTUFSSywgQTBfTUFSSywgQTFfTUFSSywgQTJfTUFSSywgQTNfTUFSSywgQTRfTUFSSywKKwlBNV9NQVJLLCBBNl9NQVJLLCBBN19NQVJLLCBBOF9NQVJLLCBBOV9NQVJLLCBBMTBfTUFSSywgQTExX01BUkssCisJQTEyX01BUkssIEExM19NQVJLLCBBMTRfTUFSSywgQTE1X01BUkssCisKKwlBMTZfTUFSSywgQTE3X01BUkssIEExOF9NQVJLLCBBMTlfTUFSSywgQ1MxX05fQTI2X01BUkssCisJRVhfQ1MwX05fTUFSSywgRVhfQ1MxX05fTUFSSywgRVhfQ1MyX05fTUFSSywgRVhfQ1MzX05fTUFSSywKKwlFWF9DUzRfTl9NQVJLLCBFWF9DUzVfTl9NQVJLLCBCU19OX01BUkssIFJEX05fTUFSSywgUkRfV1JfTl9NQVJLLAorCVdFMF9OX01BUkssIFdFMV9OX01BUkssIEVYX1dBSVQwX01BUkssCisJSVJRMF9NQVJLLCBJUlExX01BUkssIElSUTJfTUFSSywgSVJRM19NQVJLLCBDUzBfTl9NQVJLLAorCisJVkkwX0NMS19NQVJLLCBWSTBfQ0xLRU5CX01BUkssIFZJMF9IU1lOQ19OX01BUkssIFZJMF9WU1lOQ19OX01BUkssCisJVkkwX0QwX0IwX0MwX01BUkssIFZJMF9EMV9CMV9DMV9NQVJLLCBWSTBfRDJfQjJfQzJfTUFSSywKKwlWSTBfRDNfQjNfQzNfTUFSSywgVkkwX0Q0X0I0X0M0X01BUkssIFZJMF9ENV9CNV9DNV9NQVJLLAorCVZJMF9ENl9CNl9DNl9NQVJLLCBWSTBfRDdfQjdfQzdfTUFSSywgVkkwX0Q4X0cwX1kwX01BUkssCisJVkkwX0Q5X0cxX1kxX01BUkssIFZJMF9EMTBfRzJfWTJfTUFSSywgVkkwX0QxMV9HM19ZM19NQVJLLAorCVZJMF9GSUVMRF9NQVJLLAorCisJVkkxX0NMS19NQVJLLCBWSTFfQ0xLRU5CX01BUkssIFZJMV9IU1lOQ19OX01BUkssIFZJMV9WU1lOQ19OX01BUkssCisJVkkxX0QwX0IwX0MwX01BUkssIFZJMV9EMV9CMV9DMV9NQVJLLCBWSTFfRDJfQjJfQzJfTUFSSywKKwlWSTFfRDNfQjNfQzNfTUFSSywgVkkxX0Q0X0I0X0M0X01BUkssIFZJMV9ENV9CNV9DNV9NQVJLLAorCVZJMV9ENl9CNl9DNl9NQVJLLCBWSTFfRDdfQjdfQzdfTUFSSywgVkkxX0Q4X0cwX1kwX01BUkssCisJVkkxX0Q5X0cxX1kxX01BUkssIFZJMV9EMTBfRzJfWTJfTUFSSywgVkkxX0QxMV9HM19ZM19NQVJLLAorCVZJMV9GSUVMRF9NQVJLLAorCisJVkkzX0QxMF9ZMl9NQVJLLCBWSTNfRklFTERfTUFSSywKKworCVZJNF9DTEtfTUFSSywKKworCVZJNV9DTEtfTUFSSywgVkk1X0Q5X1kxX01BUkssIFZJNV9EMTBfWTJfTUFSSywgVkk1X0QxMV9ZM19NQVJLLAorCVZJNV9GSUVMRF9NQVJLLAorCisJSFJUUzBfTl9NQVJLLCBIQ1RTMV9OX01BUkssIFNDSzBfTUFSSywgQ1RTMF9OX01BUkssIFJUUzBfTl9NQVJLLAorCVRYMF9NQVJLLCBSWDBfTUFSSywgU0NLMV9NQVJLLCBDVFMxX05fTUFSSywgUlRTMV9OX01BUkssCisJVFgxX01BUkssIFJYMV9NQVJLLCBTQ0lGX0NMS19NQVJLLCBDQU4wX1RYX01BUkssIENBTjBfUlhfTUFSSywKKwlDQU5fQ0xLX01BUkssIENBTjFfVFhfTUFSSywgQ0FOMV9SWF9NQVJLLAorCisJU0QwX0NMS19NQVJLLCBTRDBfQ01EX01BUkssIFNEMF9EQVQwX01BUkssIFNEMF9EQVQxX01BUkssCisJU0QwX0RBVDJfTUFSSywgU0QwX0RBVDNfTUFSSywgU0QwX0NEX01BUkssIFNEMF9XUF9NQVJLLAorCUFESUNMS19NQVJLLCBBRElDU19TQU1QX01BUkssIEFESURBVEFfTUFSSywgQURJQ0hTMF9NQVJLLAorCUFESUNIUzFfTUFSSywgQURJQ0hTMl9NQVJLLCBBVlMxX01BUkssIEFWUzJfTUFSSywKKworCS8qIElQU1IwICovCisJRFUwX0RSMF9EQVRBMF9NQVJLLCBEVTBfRFIxX0RBVEExX01BUkssIERVMF9EUjJfWTRfREFUQTJfTUFSSywKKwlEVTBfRFIzX1k1X0RBVEEzX01BUkssIERVMF9EUjRfWTZfREFUQTRfTUFSSywgRFUwX0RSNV9ZN19EQVRBNV9NQVJLLAorCURVMF9EUjZfWThfREFUQTZfTUFSSywgRFUwX0RSN19ZOV9EQVRBN19NQVJLLCBEVTBfREcwX0RBVEE4X01BUkssCisJRFUwX0RHMV9EQVRBOV9NQVJLLCBEVTBfREcyX0M2X0RBVEExMF9NQVJLLCBEVTBfREczX0M3X0RBVEExMV9NQVJLLAorCURVMF9ERzRfWTBfREFUQTEyX01BUkssIERVMF9ERzVfWTFfREFUQTEzX01BUkssIERVMF9ERzZfWTJfREFUQTE0X01BUkssCisJRFUwX0RHN19ZM19EQVRBMTVfTUFSSywgRFUwX0RCMF9NQVJLLCBEVTBfREIxX01BUkssCisJRFUwX0RCMl9DMF9NQVJLLCBEVTBfREIzX0MxX01BUkssIERVMF9EQjRfQzJfTUFSSywgRFUwX0RCNV9DM19NQVJLLAorCURVMF9EQjZfQzRfTUFSSywgRFUwX0RCN19DNV9NQVJLLAorCisJLyogSVBTUjEgKi8KKwlEVTBfRVhIU1lOQ19EVTBfSFNZTkNfTUFSSywgRFUwX0VYVlNZTkNfRFUwX1ZTWU5DX01BUkssCisJRFUwX0VYT0RERl9EVTBfT0RERl9ESVNQX0NERV9NQVJLLCBEVTBfRElTUF9NQVJLLCBEVTBfQ0RFX01BUkssCisJRFUxX0RSMl9ZNF9EQVRBMF9NQVJLLCBEVTFfRFIzX1k1X0RBVEExX01BUkssIERVMV9EUjRfWTZfREFUQTJfTUFSSywKKwlEVTFfRFI1X1k3X0RBVEEzX01BUkssIERVMV9EUjZfREFUQTRfTUFSSywgRFUxX0RSN19EQVRBNV9NQVJLLAorCURVMV9ERzJfQzZfREFUQTZfTUFSSywgRFUxX0RHM19DN19EQVRBN19NQVJLLCBEVTFfREc0X1kwX0RBVEE4X01BUkssCisJRFUxX0RHNV9ZMV9EQVRBOV9NQVJLLCBEVTFfREc2X1kyX0RBVEExMF9NQVJLLCBEVTFfREc3X1kzX0RBVEExMV9NQVJLLAorCUEyMF9NQVJLLCBNT1NJX0lPMF9NQVJLLCBBMjFfTUFSSywgTUlTT19JTzFfTUFSSywgQTIyX01BUkssIElPMl9NQVJLLAorCUEyM19NQVJLLCBJTzNfTUFSSywgQTI0X01BUkssIFNQQ0xLX01BUkssIEEyNV9NQVJLLCBTU0xfTUFSSywKKworCS8qIElQU1IyICovCisJVkkyX0NMS19NQVJLLCBBVkJfUlhfQ0xLX01BUkssIFZJMl9DTEtFTkJfTUFSSywgQVZCX1JYX0RWX01BUkssCisJVkkyX0hTWU5DX05fTUFSSywgQVZCX1JYRDBfTUFSSywgVkkyX1ZTWU5DX05fTUFSSywgQVZCX1JYRDFfTUFSSywKKwlWSTJfRDBfQzBfTUFSSywgQVZCX1JYRDJfTUFSSywgVkkyX0QxX0MxX01BUkssIEFWQl9UWF9DTEtfTUFSSywKKwlWSTJfRDJfQzJfTUFSSywgQVZCX1JYRDRfTUFSSywgVkkyX0QzX0MzX01BUkssIEFWQl9SWEQ1X01BUkssCisJVkkyX0Q0X0M0X01BUkssIEFWQl9SWEQ2X01BUkssIFZJMl9ENV9DNV9NQVJLLCBBVkJfUlhEN19NQVJLLAorCVZJMl9ENl9DNl9NQVJLLCBBVkJfUlhfRVJfTUFSSywgVkkyX0Q3X0M3X01BUkssIEFWQl9DT0xfTUFSSywKKwlWSTJfRDhfWTBfTUFSSywgQVZCX1JYRDNfTUFSSywgVkkyX0Q5X1kxX01BUkssIEFWQl9UWF9FTl9NQVJLLAorCVZJMl9EMTBfWTJfTUFSSywgQVZCX1RYRDBfTUFSSywKKwlWSTJfRDExX1kzX01BUkssIEFWQl9UWEQxX01BUkssIFZJMl9GSUVMRF9NQVJLLCBBVkJfVFhEMl9NQVJLLAorCisJLyogSVBTUjMgKi8KKwlWSTNfQ0xLX01BUkssIEFWQl9UWEQzX01BUkssIFZJM19DTEtFTkJfTUFSSywgQVZCX1RYRDRfTUFSSywKKwlWSTNfSFNZTkNfTl9NQVJLLCBBVkJfVFhENV9NQVJLLCBWSTNfVlNZTkNfTl9NQVJLLCBBVkJfVFhENl9NQVJLLAorCVZJM19EMF9DMF9NQVJLLCBBVkJfVFhEN19NQVJLLCBWSTNfRDFfQzFfTUFSSywgQVZCX1RYX0VSX01BUkssCisJVkkzX0QyX0MyX01BUkssIEFWQl9HVFhfQ0xLX01BUkssIFZJM19EM19DM19NQVJLLCBBVkJfTURDX01BUkssCisJVkkzX0Q0X0M0X01BUkssIEFWQl9NRElPX01BUkssIFZJM19ENV9DNV9NQVJLLCBBVkJfTElOS19NQVJLLAorCVZJM19ENl9DNl9NQVJLLCBBVkJfTUFHSUNfTUFSSywgVkkzX0Q3X0M3X01BUkssIEFWQl9QSFlfSU5UX01BUkssCisJVkkzX0Q4X1kwX01BUkssIEFWQl9DUlNfTUFSSywgVkkzX0Q5X1kxX01BUkssIEFWQl9HVFhSRUZDTEtfTUFSSywKKwlWSTNfRDExX1kzX01BUkssIEFWQl9BVlRQX01BVENIX01BUkssCisKKwkvKiBJUFNSNCAqLworCVZJNF9DTEtFTkJfTUFSSywgVkkwX0QxMl9HNF9ZNF9NQVJLLCBWSTRfSFNZTkNfTl9NQVJLLAorCVZJMF9EMTNfRzVfWTVfTUFSSywgVkk0X1ZTWU5DX05fTUFSSywgVkkwX0QxNF9HNl9ZNl9NQVJLLAorCVJEUl9DTEtPVVRfTUFSSywgVkk0X0QwX0MwX01BUkssIFZJMF9EMTVfRzdfWTdfTUFSSywgVkk0X0QxX0MxX01BUkssCisJVkkwX0QxNl9SMF9NQVJLLCBWSTFfRDEyX0c0X1k0X01BUkssIFZJNF9EMl9DMl9NQVJLLCBWSTBfRDE3X1IxX01BUkssCisJVkkxX0QxM19HNV9ZNV9NQVJLLCBWSTRfRDNfQzNfTUFSSywgVkkwX0QxOF9SMl9NQVJLLCBWSTFfRDE0X0c2X1k2X01BUkssCisJVkk0X0Q0X0M0X01BUkssCVZJMF9EMTlfUjNfTUFSSywgVkkxX0QxNV9HN19ZN19NQVJLLCBWSTRfRDVfQzVfTUFSSywKKwlWSTBfRDIwX1I0X01BUkssIFZJMl9EMTJfWTRfTUFSSywgVkk0X0Q2X0M2X01BUkssIFZJMF9EMjFfUjVfTUFSSywKKwlWSTJfRDEzX1k1X01BUkssIFZJNF9EN19DN19NQVJLLCBWSTBfRDIyX1I2X01BUkssIFZJMl9EMTRfWTZfTUFSSywKKwlWSTRfRDhfWTBfTUFSSywgVkkwX0QyM19SN19NQVJLLCBWSTJfRDE1X1k3X01BUkssIFZJNF9EOV9ZMV9NQVJLLAorCVZJM19EMTJfWTRfTUFSSywgVkk0X0QxMF9ZMl9NQVJLLCBWSTNfRDEzX1k1X01BUkssIFZJNF9EMTFfWTNfTUFSSywKKwlWSTNfRDE0X1k2X01BUkssIFZJNF9GSUVMRF9NQVJLLCBWSTNfRDE1X1k3X01BUkssCisKKwkvKiBJUFNSNSAqLworCVZJNV9DTEtFTkJfTUFSSywgVkkxX0QxMl9HNF9ZNF9CX01BUkssIFZJNV9IU1lOQ19OX01BUkssCisJVkkxX0QxM19HNV9ZNV9CX01BUkssIFZJNV9WU1lOQ19OX01BUkssIFZJMV9EMTRfRzZfWTZfQl9NQVJLLAorCVZJNV9EMF9DMF9NQVJLLCBWSTFfRDE1X0c3X1k3X0JfTUFSSywgVkk1X0QxX0MxX01BUkssIFZJMV9EMTZfUjBfTUFSSywKKwlWSTVfRDJfQzJfTUFSSywgVkkxX0QxN19SMV9NQVJLLCBWSTVfRDNfQzNfTUFSSywgVkkxX0QxOF9SMl9NQVJLLAorCVZJNV9ENF9DNF9NQVJLLCBWSTFfRDE5X1IzX01BUkssIFZJNV9ENV9DNV9NQVJLLCBWSTFfRDIwX1I0X01BUkssCisJVkk1X0Q2X0M2X01BUkssIFZJMV9EMjFfUjVfTUFSSywgVkk1X0Q3X0M3X01BUkssIFZJMV9EMjJfUjZfTUFSSywKKwlWSTVfRDhfWTBfTUFSSywgVkkxX0QyM19SN19NQVJLLAorCisJLyogSVBTUjYgKi8KKwlNU0lPRjBfU0NLX01BUkssIEhTQ0swX01BUkssIE1TSU9GMF9TWU5DX01BUkssIEhDVFMwX05fTUFSSywKKwlNU0lPRjBfVFhEX01BUkssIEhUWDBfTUFSSywgTVNJT0YwX1JYRF9NQVJLLCBIUlgwX01BUkssCisJTVNJT0YxX1NDS19NQVJLLCBIU0NLMV9NQVJLLCBNU0lPRjFfU1lOQ19NQVJLLCBIUlRTMV9OX01BUkssCisJTVNJT0YxX1RYRF9NQVJLLCBIVFgxX01BUkssIE1TSU9GMV9SWERfTUFSSywgSFJYMV9NQVJLLAorCURSQUNLMF9NQVJLLCBTQ0syX01BUkssIERBQ0swX01BUkssIFRYMl9NQVJLLCBEUkVRMF9OX01BUkssCisJUlgyX01BUkssIERBQ0sxX01BUkssIFNDSzNfTUFSSywgVFgzX01BUkssIERSRVExX05fTUFSSywKKwlSWDNfTUFSSywKKworCS8qIElQU1I3ICovCisJUFdNMF9NQVJLLCBUQ0xLMV9NQVJLLCBGU09fQ0ZFXzBfTUFSSywgUFdNMV9NQVJLLCBUQ0xLMl9NQVJLLAorCUZTT19DRkVfMV9NQVJLLCBQV00yX01BUkssIFRDTEszX01BUkssIEZTT19UT0VfTUFSSywgUFdNM19NQVJLLAorCVBXTTRfTUFSSywgU1NJX1NDSzM0X01BUkssIFRQVTBUTzBfTUFSSywgU1NJX1dTMzRfTUFSSywgVFBVMFRPMV9NQVJLLAorCVNTSV9TREFUQTNfTUFSSywgVFBVMFRPMl9NQVJLLCBTU0lfU0NLNF9NQVJLLCBUUFUwVE8zX01BUkssCisJU1NJX1dTNF9NQVJLLCBTU0lfU0RBVEE0X01BUkssIEFVRElPX0NMS09VVF9NQVJLLCBBVURJT19DTEtBX01BUkssCisJQVVESU9fQ0xLQl9NQVJLLAorCVBJTk1VWF9NQVJLX0VORCwKK307CisKK3N0YXRpYyBjb25zdCB1MTYgcGlubXV4X2RhdGFbXSA9IHsKKwlQSU5NVVhfREFUQV9HUF9BTEwoKSwgLyogUElOTVVYX0RBVEEoR1BfTV9OX0RBVEEsIEdQX01fTl9GTi4uLiksICovCisKKwlQSU5NVVhfU0lOR0xFKERVMV9EQjJfQzBfREFUQTEyKSwKKwlQSU5NVVhfU0lOR0xFKERVMV9EQjNfQzFfREFUQTEzKSwKKwlQSU5NVVhfU0lOR0xFKERVMV9EQjRfQzJfREFUQTE0KSwKKwlQSU5NVVhfU0lOR0xFKERVMV9EQjVfQzNfREFUQTE1KSwKKwlQSU5NVVhfU0lOR0xFKERVMV9EQjZfQzQpLAorCVBJTk1VWF9TSU5HTEUoRFUxX0RCN19DNSksCisJUElOTVVYX1NJTkdMRShEVTFfRVhIU1lOQ19EVTFfSFNZTkMpLAorCVBJTk1VWF9TSU5HTEUoRFUxX0VYVlNZTkNfRFUxX1ZTWU5DKSwKKwlQSU5NVVhfU0lOR0xFKERVMV9FWE9EREZfRFUxX09EREZfRElTUF9DREUpLAorCVBJTk1VWF9TSU5HTEUoRFUxX0RJU1ApLAorCVBJTk1VWF9TSU5HTEUoRFUxX0NERSksCisJUElOTVVYX1NJTkdMRShEMCksCisJUElOTVVYX1NJTkdMRShEMSksCisJUElOTVVYX1NJTkdMRShEMiksCisJUElOTVVYX1NJTkdMRShEMyksCisJUElOTVVYX1NJTkdMRShENCksCisJUElOTVVYX1NJTkdMRShENSksCisJUElOTVVYX1NJTkdMRShENiksCisJUElOTVVYX1NJTkdMRShENyksCisJUElOTVVYX1NJTkdMRShEOCksCisJUElOTVVYX1NJTkdMRShEOSksCisJUElOTVVYX1NJTkdMRShEMTApLAorCVBJTk1VWF9TSU5HTEUoRDExKSwKKwlQSU5NVVhfU0lOR0xFKEQxMiksCisJUElOTVVYX1NJTkdMRShEMTMpLAorCVBJTk1VWF9TSU5HTEUoRDE0KSwKKwlQSU5NVVhfU0lOR0xFKEQxNSksCisJUElOTVVYX1NJTkdMRShBMCksCisJUElOTVVYX1NJTkdMRShBMSksCisJUElOTVVYX1NJTkdMRShBMiksCisJUElOTVVYX1NJTkdMRShBMyksCisJUElOTVVYX1NJTkdMRShBNCksCisJUElOTVVYX1NJTkdMRShBNSksCisJUElOTVVYX1NJTkdMRShBNiksCisJUElOTVVYX1NJTkdMRShBNyksCisJUElOTVVYX1NJTkdMRShBOCksCisJUElOTVVYX1NJTkdMRShBOSksCisJUElOTVVYX1NJTkdMRShBMTApLAorCVBJTk1VWF9TSU5HTEUoQTExKSwKKwlQSU5NVVhfU0lOR0xFKEExMiksCisJUElOTVVYX1NJTkdMRShBMTMpLAorCVBJTk1VWF9TSU5HTEUoQTE0KSwKKwlQSU5NVVhfU0lOR0xFKEExNSksCisJUElOTVVYX1NJTkdMRShBMTYpLAorCVBJTk1VWF9TSU5HTEUoQTE3KSwKKwlQSU5NVVhfU0lOR0xFKEExOCksCisJUElOTVVYX1NJTkdMRShBMTkpLAorCVBJTk1VWF9TSU5HTEUoQ1MxX05fQTI2KSwKKwlQSU5NVVhfU0lOR0xFKEVYX0NTMF9OKSwKKwlQSU5NVVhfU0lOR0xFKEVYX0NTMV9OKSwKKwlQSU5NVVhfU0lOR0xFKEVYX0NTMl9OKSwKKwlQSU5NVVhfU0lOR0xFKEVYX0NTM19OKSwKKwlQSU5NVVhfU0lOR0xFKEVYX0NTNF9OKSwKKwlQSU5NVVhfU0lOR0xFKEVYX0NTNV9OKSwKKwlQSU5NVVhfU0lOR0xFKEJTX04pLAorCVBJTk1VWF9TSU5HTEUoUkRfTiksCisJUElOTVVYX1NJTkdMRShSRF9XUl9OKSwKKwlQSU5NVVhfU0lOR0xFKFdFMF9OKSwKKwlQSU5NVVhfU0lOR0xFKFdFMV9OKSwKKwlQSU5NVVhfU0lOR0xFKEVYX1dBSVQwKSwKKwlQSU5NVVhfU0lOR0xFKElSUTApLAorCVBJTk1VWF9TSU5HTEUoSVJRMSksCisJUElOTVVYX1NJTkdMRShJUlEyKSwKKwlQSU5NVVhfU0lOR0xFKElSUTMpLAorCVBJTk1VWF9TSU5HTEUoQ1MwX04pLAorCVBJTk1VWF9TSU5HTEUoVkkwX0NMSyksCisJUElOTVVYX1NJTkdMRShWSTBfQ0xLRU5CKSwKKwlQSU5NVVhfU0lOR0xFKFZJMF9IU1lOQ19OKSwKKwlQSU5NVVhfU0lOR0xFKFZJMF9WU1lOQ19OKSwKKwlQSU5NVVhfU0lOR0xFKFZJMF9EMF9CMF9DMCksCisJUElOTVVYX1NJTkdMRShWSTBfRDFfQjFfQzEpLAorCVBJTk1VWF9TSU5HTEUoVkkwX0QyX0IyX0MyKSwKKwlQSU5NVVhfU0lOR0xFKFZJMF9EM19CM19DMyksCisJUElOTVVYX1NJTkdMRShWSTBfRDRfQjRfQzQpLAorCVBJTk1VWF9TSU5HTEUoVkkwX0Q1X0I1X0M1KSwKKwlQSU5NVVhfU0lOR0xFKFZJMF9ENl9CNl9DNiksCisJUElOTVVYX1NJTkdMRShWSTBfRDdfQjdfQzcpLAorCVBJTk1VWF9TSU5HTEUoVkkwX0Q4X0cwX1kwKSwKKwlQSU5NVVhfU0lOR0xFKFZJMF9EOV9HMV9ZMSksCisJUElOTVVYX1NJTkdMRShWSTBfRDEwX0cyX1kyKSwKKwlQSU5NVVhfU0lOR0xFKFZJMF9EMTFfRzNfWTMpLAorCVBJTk1VWF9TSU5HTEUoVkkwX0ZJRUxEKSwKKwlQSU5NVVhfU0lOR0xFKFZJMV9DTEspLAorCVBJTk1VWF9TSU5HTEUoVkkxX0NMS0VOQiksCisJUElOTVVYX1NJTkdMRShWSTFfSFNZTkNfTiksCisJUElOTVVYX1NJTkdMRShWSTFfVlNZTkNfTiksCisJUElOTVVYX1NJTkdMRShWSTFfRDBfQjBfQzApLAorCVBJTk1VWF9TSU5HTEUoVkkxX0QxX0IxX0MxKSwKKwlQSU5NVVhfU0lOR0xFKFZJMV9EMl9CMl9DMiksCisJUElOTVVYX1NJTkdMRShWSTFfRDNfQjNfQzMpLAorCVBJTk1VWF9TSU5HTEUoVkkxX0Q0X0I0X0M0KSwKKwlQSU5NVVhfU0lOR0xFKFZJMV9ENV9CNV9DNSksCisJUElOTVVYX1NJTkdMRShWSTFfRDZfQjZfQzYpLAorCVBJTk1VWF9TSU5HTEUoVkkxX0Q3X0I3X0M3KSwKKwlQSU5NVVhfU0lOR0xFKFZJMV9EOF9HMF9ZMCksCisJUElOTVVYX1NJTkdMRShWSTFfRDlfRzFfWTEpLAorCVBJTk1VWF9TSU5HTEUoVkkxX0QxMF9HMl9ZMiksCisJUElOTVVYX1NJTkdMRShWSTFfRDExX0czX1kzKSwKKwlQSU5NVVhfU0lOR0xFKFZJMV9GSUVMRCksCisJUElOTVVYX1NJTkdMRShWSTNfRDEwX1kyKSwKKwlQSU5NVVhfU0lOR0xFKFZJM19GSUVMRCksCisJUElOTVVYX1NJTkdMRShWSTRfQ0xLKSwKKwlQSU5NVVhfU0lOR0xFKFZJNV9DTEspLAorCVBJTk1VWF9TSU5HTEUoVkk1X0Q5X1kxKSwKKwlQSU5NVVhfU0lOR0xFKFZJNV9EMTBfWTIpLAorCVBJTk1VWF9TSU5HTEUoVkk1X0QxMV9ZMyksCisJUElOTVVYX1NJTkdMRShWSTVfRklFTEQpLAorCVBJTk1VWF9TSU5HTEUoSFJUUzBfTiksCisJUElOTVVYX1NJTkdMRShIQ1RTMV9OKSwKKwlQSU5NVVhfU0lOR0xFKFNDSzApLAorCVBJTk1VWF9TSU5HTEUoQ1RTMF9OKSwKKwlQSU5NVVhfU0lOR0xFKFJUUzBfTiksCisJUElOTVVYX1NJTkdMRShUWDApLAorCVBJTk1VWF9TSU5HTEUoUlgwKSwKKwlQSU5NVVhfU0lOR0xFKFNDSzEpLAorCVBJTk1VWF9TSU5HTEUoQ1RTMV9OKSwKKwlQSU5NVVhfU0lOR0xFKFJUUzFfTiksCisJUElOTVVYX1NJTkdMRShUWDEpLAorCVBJTk1VWF9TSU5HTEUoUlgxKSwKKwlQSU5NVVhfU0lOR0xFKFNDSUZfQ0xLKSwKKwlQSU5NVVhfU0lOR0xFKENBTjBfVFgpLAorCVBJTk1VWF9TSU5HTEUoQ0FOMF9SWCksCisJUElOTVVYX1NJTkdMRShDQU5fQ0xLKSwKKwlQSU5NVVhfU0lOR0xFKENBTjFfVFgpLAorCVBJTk1VWF9TSU5HTEUoQ0FOMV9SWCksCisJUElOTVVYX1NJTkdMRShTRDBfQ0xLKSwKKwlQSU5NVVhfU0lOR0xFKFNEMF9DTUQpLAorCVBJTk1VWF9TSU5HTEUoU0QwX0RBVDApLAorCVBJTk1VWF9TSU5HTEUoU0QwX0RBVDEpLAorCVBJTk1VWF9TSU5HTEUoU0QwX0RBVDIpLAorCVBJTk1VWF9TSU5HTEUoU0QwX0RBVDMpLAorCVBJTk1VWF9TSU5HTEUoU0QwX0NEKSwKKwlQSU5NVVhfU0lOR0xFKFNEMF9XUCksCisJUElOTVVYX1NJTkdMRShBRElDTEspLAorCVBJTk1VWF9TSU5HTEUoQURJQ1NfU0FNUCksCisJUElOTVVYX1NJTkdMRShBRElEQVRBKSwKKwlQSU5NVVhfU0lOR0xFKEFESUNIUzApLAorCVBJTk1VWF9TSU5HTEUoQURJQ0hTMSksCisJUElOTVVYX1NJTkdMRShBRElDSFMyKSwKKwlQSU5NVVhfU0lOR0xFKEFWUzEpLAorCVBJTk1VWF9TSU5HTEUoQVZTMiksCisKKwkvKiBJUFNSMCAqLworCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzAsIERVMF9EUjBfREFUQTApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzEsIERVMF9EUjFfREFUQTEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzIsIERVMF9EUjJfWTRfREFUQTIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzMsIERVMF9EUjNfWTVfREFUQTMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzQsIERVMF9EUjRfWTZfREFUQTQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzUsIERVMF9EUjVfWTdfREFUQTUpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzYsIERVMF9EUjZfWThfREFUQTYpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzcsIERVMF9EUjdfWTlfREFUQTcpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzgsIERVMF9ERzBfREFUQTgpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzksIERVMF9ERzFfREFUQTkpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzEwLCBEVTBfREcyX0M2X0RBVEExMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDBfMTEsIERVMF9ERzNfQzdfREFUQTExKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8xMiwgRFUwX0RHNF9ZMF9EQVRBMTIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzEzLCBEVTBfREc1X1kxX0RBVEExMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDBfMTQsIERVMF9ERzZfWTJfREFUQTE0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8xNSwgRFUwX0RHN19ZM19EQVRBMTUpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzE2LCBEVTBfREIwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8xNywgRFUwX0RCMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDBfMTgsIERVMF9EQjJfQzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzE5LCBEVTBfREIzX0MxKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8yMCwgRFUwX0RCNF9DMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDBfMjEsIERVMF9EQjVfQzMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzIyLCBEVTBfREI2X0M0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8yMywgRFUwX0RCN19DNSksCisKKwkvKiBJUFNSMSAqLworCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzAsIERVMF9FWEhTWU5DX0RVMF9IU1lOQyksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMSwgRFUwX0VYVlNZTkNfRFUwX1ZTWU5DKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8yLCBEVTBfRVhPRERGX0RVMF9PRERGX0RJU1BfQ0RFKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8zLCBEVTBfRElTUCksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfNCwgRFUwX0NERSksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfNSwgRFUxX0RSMl9ZNF9EQVRBMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfNiwgRFUxX0RSM19ZNV9EQVRBMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfNywgRFUxX0RSNF9ZNl9EQVRBMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfOCwgRFUxX0RSNV9ZN19EQVRBMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfOSwgRFUxX0RSNl9EQVRBNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTAsIERVMV9EUjdfREFUQTUpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzExLCBEVTFfREcyX0M2X0RBVEE2KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8xMiwgRFUxX0RHM19DN19EQVRBNyksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTMsIERVMV9ERzRfWTBfREFUQTgpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzE0LCBEVTFfREc1X1kxX0RBVEE5KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8xNSwgRFUxX0RHNl9ZMl9EQVRBMTApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzE2LCBEVTFfREc3X1kzX0RBVEExMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTcsIEEyMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTcsIE1PU0lfSU8wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8xOCwgQTIxKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8xOCwgTUlTT19JTzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzE5LCBBMjIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzE5LCBJTzIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzIwLCBBMjMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzIwLCBJTzMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzIxLCBBMjQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzIxLCBTUENMSyksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMjIsIEEyNSksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMjIsIFNTTCksCisKKwkvKiBJUFNSMiAqLworCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzAsIFZJMl9DTEspLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzAsIEFWQl9SWF9DTEspLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzEsIFZJMl9DTEtFTkIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzEsIEFWQl9SWF9EViksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMiwgVkkyX0hTWU5DX04pLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzIsIEFWQl9SWEQwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8zLCBWSTJfVlNZTkNfTiksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMywgQVZCX1JYRDEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzQsIFZJMl9EMF9DMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfNCwgQVZCX1JYRDIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzUsIFZJMl9EMV9DMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfNSwgQVZCX1JYRDMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzYsIFZJMl9EMl9DMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfNiwgQVZCX1JYRDQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzcsIFZJMl9EM19DMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfNywgQVZCX1JYRDUpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzgsIFZJMl9ENF9DNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfOCwgQVZCX1JYRDYpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzksIFZJMl9ENV9DNSksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfOSwgQVZCX1JYRDcpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzEwLCBWSTJfRDZfQzYpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzEwLCBBVkJfUlhfRVIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzExLCBWSTJfRDdfQzcpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzExLCBBVkJfQ09MKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xMiwgVkkyX0Q4X1kwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xMiwgQVZCX1RYRDMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzEzLCBWSTJfRDlfWTEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzEzLCBBVkJfVFhfRU4pLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzE0LCBWSTJfRDEwX1kyKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xNCwgQVZCX1RYRDApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzE1LCBWSTJfRDExX1kzKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xNSwgQVZCX1RYRDEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzE2LCBWSTJfRklFTEQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzE2LCBBVkJfVFhEMiksCisKKwkvKiBJUFNSMyAqLworCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzAsIFZJM19DTEspLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzAsIEFWQl9UWF9DTEspLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzEsIFZJM19DTEtFTkIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzEsIEFWQl9UWEQ0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18yLCBWSTNfSFNZTkNfTiksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMiwgQVZCX1RYRDUpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzMsIFZJM19WU1lOQ19OKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18zLCBBVkJfVFhENiksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfNCwgVkkzX0QwX0MwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM180LCBBVkJfVFhENyksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfNSwgVkkzX0QxX0MxKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM181LCBBVkJfVFhfRVIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzYsIFZJM19EMl9DMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfNiwgQVZCX0dUWF9DTEspLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzcsIFZJM19EM19DMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfNywgQVZCX01EQyksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfOCwgVkkzX0Q0X0M0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM184LCBBVkJfTURJTyksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfOSwgVkkzX0Q1X0M1KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM185LCBBVkJfTElOSyksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTAsIFZJM19ENl9DNiksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTAsIEFWQl9NQUdJQyksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTEsIFZJM19EN19DNyksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTEsIEFWQl9QSFlfSU5UKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18xMiwgVkkzX0Q4X1kwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18xMiwgQVZCX0NSUyksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTMsIFZJM19EOV9ZMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTMsIEFWQl9HVFhSRUZDTEspLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzE0LCBWSTNfRDExX1kzKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18xNCwgQVZCX0FWVFBfTUFUQ0gpLAorCisJLyogSVBTUjQgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8wLCBWSTRfQ0xLRU5CKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8wLCBWSTBfRDEyX0c0X1k0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8xLCBWSTRfSFNZTkNfTiksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMSwgVkkwX0QxM19HNV9ZNSksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfM18yLCBWSTRfVlNZTkNfTiksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfM18yLCBWSTBfRDE0X0c2X1k2KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF80LCBWSTRfRDBfQzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzQsIFZJMF9EMTVfRzdfWTcpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzZfNSwgVkk0X0QxX0MxKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF82XzUsIFZJMF9EMTZfUjApLAorCVBJTk1VWF9JUFNSX01TRUwoSVA0XzZfNSwgVkkxX0QxMl9HNF9ZNCwgU0VMX1ZJMV8wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF84XzcsIFZJNF9EMl9DMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfOF83LCBWSTBfRDE3X1IxKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNF84XzcsIFZJMV9EMTNfRzVfWTUsIFNFTF9WSTFfMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMTBfOSwgVkk0X0QzX0MzKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8xMF85LCBWSTBfRDE4X1IyKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNF8xMF85LCBWSTFfRDE0X0c2X1k2LCBTRUxfVkkxXzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzEyXzExLCBWSTRfRDRfQzQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzEyXzExLCBWSTBfRDE5X1IzKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNF8xMl8xMSwgVkkxX0QxNV9HN19ZNywgU0VMX1ZJMV8wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8xNF8xMywgVkk0X0Q1X0M1KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8xNF8xMywgVkkwX0QyMF9SNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMTRfMTMsIFZJMl9EMTJfWTQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzE2XzE1LCBWSTRfRDZfQzYpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzE2XzE1LCBWSTBfRDIxX1I1KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8xNl8xNSwgVkkyX0QxM19ZNSksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMThfMTcsIFZJNF9EN19DNyksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMThfMTcsIFZJMF9EMjJfUjYpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzE4XzE3LCBWSTJfRDE0X1k2KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8yMF8xOSwgVkk0X0Q4X1kwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8yMF8xOSwgVkkwX0QyM19SNyksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMjBfMTksIFZJMl9EMTVfWTcpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzIxLCBWSTRfRDlfWTEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzIxLCBWSTNfRDEyX1k0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8yMiwgVkk0X0QxMF9ZMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMjIsIFZJM19EMTNfWTUpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzIzLCBWSTRfRDExX1kzKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8yMywgVkkzX0QxNF9ZNiksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMjQsIFZJNF9GSUVMRCksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMjQsIFZJM19EMTVfWTcpLAorCisJLyogSVBTUjUgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8wLCBWSTVfQ0xLRU5CKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNV8wLCBWSTFfRDEyX0c0X1k0X0IsIFNFTF9WSTFfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfMSwgVkk1X0hTWU5DX04pLAorCVBJTk1VWF9JUFNSX01TRUwoSVA1XzEsIFZJMV9EMTNfRzVfWTVfQiwgU0VMX1ZJMV8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8yLCBWSTVfVlNZTkNfTiksCisJUElOTVVYX0lQU1JfTVNFTChJUDVfMiwgVkkxX0QxNF9HNl9ZNl9CLCBTRUxfVkkxXzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzMsIFZJNV9EMF9DMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDVfMywgVkkxX0QxNV9HN19ZN19CLCBTRUxfVkkxXzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzQsIFZJNV9EMV9DMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfNCwgVkkxX0QxNl9SMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfNSwgVkk1X0QyX0MyKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV81LCBWSTFfRDE3X1IxKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV82LCBWSTVfRDNfQzMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzYsIFZJMV9EMThfUjIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzcsIFZJNV9ENF9DNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfNywgVkkxX0QxOV9SMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfOCwgVkk1X0Q1X0M1KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV84LCBWSTFfRDIwX1I0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV85LCBWSTVfRDZfQzYpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzksIFZJMV9EMjFfUjUpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzEwLCBWSTVfRDdfQzcpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzEwLCBWSTFfRDIyX1I2KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8xMSwgVkk1X0Q4X1kwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8xMSwgVkkxX0QyM19SNyksCisKKwkvKiBJUFNSNiAqLworCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzAsIE1TSU9GMF9TQ0spLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzAsIEhTQ0swKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8xLCBNU0lPRjBfU1lOQyksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMSwgSENUUzBfTiksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMiwgTVNJT0YwX1RYRCksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMiwgSFRYMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMywgTVNJT0YwX1JYRCksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMywgSFJYMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfNCwgTVNJT0YxX1NDSyksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfNCwgSFNDSzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzUsIE1TSU9GMV9TWU5DKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl81LCBIUlRTMV9OKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl82LCBNU0lPRjFfVFhEKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl82LCBIVFgxKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl83LCBNU0lPRjFfUlhEKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl83LCBIUlgxKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl85XzgsIERSQUNLMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfOV84LCBTQ0syKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8xMV8xMCwgREFDSzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzExXzEwLCBUWDIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzEzXzEyLCBEUkVRMF9OKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8xM18xMiwgUlgyKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8xNV8xNCwgREFDSzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzE1XzE0LCBTQ0szKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8xNiwgVFgzKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8xOF8xNywgRFJFUTFfTiksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMThfMTcsIFJYMyksCisKKwkvKiBJUFNSNyAqLworCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzFfMCwgUFdNMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfMV8wLCBUQ0xLMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfMV8wLCBGU09fQ0ZFXzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzNfMiwgUFdNMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfM18yLCBUQ0xLMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfM18yLCBGU09fQ0ZFXzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzVfNCwgUFdNMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfNV80LCBUQ0xLMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfNV80LCBGU09fVE9FKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQN182LCBQV00zKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQN183LCBQV000KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQN185XzgsIFNTSV9TQ0szNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfOV84LCBUUFUwVE8wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQN18xMV8xMCwgU1NJX1dTMzQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzExXzEwLCBUUFUwVE8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQN18xM18xMiwgU1NJX1NEQVRBMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfMTNfMTIsIFRQVTBUTzIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzE1XzE0LCBTU0lfU0NLNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfMTVfMTQsIFRQVTBUTzMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzE2LCBTU0lfV1M0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQN18xNywgU1NJX1NEQVRBNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfMTgsIEFVRElPX0NMS09VVCksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfMTksIEFVRElPX0NMS0EpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzIwLCBBVURJT19DTEtCKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfcGZjX3BpbiBwaW5tdXhfcGluc1tdID0geworCVBJTk1VWF9HUElPX0dQX0FMTCgpLAorfTsKKworLyogLSBBVkIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXZiX2xpbmtfcGluc1tdID0geworCVJDQVJfR1BfUElOKDcsIDkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXZiX2xpbmtfbXV4W10gPSB7CisJQVZCX0xJTktfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGF2Yl9tYWdpY19waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oNywgMTApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXZiX21hZ2ljX211eFtdID0geworCUFWQl9NQUdJQ19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXZiX3BoeV9pbnRfcGluc1tdID0geworCVJDQVJfR1BfUElOKDcsIDExKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGF2Yl9waHlfaW50X211eFtdID0geworCUFWQl9QSFlfSU5UX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhdmJfbWRpb19waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oNywgNyksIFJDQVJfR1BfUElOKDcsIDgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXZiX21kaW9fbXV4W10gPSB7CisJQVZCX01EQ19NQVJLLCBBVkJfTURJT19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXZiX21paV9waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oNiwgMTQpLCBSQ0FSX0dQX1BJTig2LCAxNSksIFJDQVJfR1BfUElOKDYsIDE2KSwKKwlSQ0FSX0dQX1BJTig2LCAxMiksCisKKwlSQ0FSX0dQX1BJTig2LCAyKSwgIFJDQVJfR1BfUElOKDYsIDMpLCAgUkNBUl9HUF9QSU4oNiwgNCksCisJUkNBUl9HUF9QSU4oNiwgNSksCisKKwlSQ0FSX0dQX1BJTig2LCAxMCksIFJDQVJfR1BfUElOKDYsIDApLCAgUkNBUl9HUF9QSU4oNiwgMSksCisJUkNBUl9HUF9QSU4oNywgMTIpLCBSQ0FSX0dQX1BJTig2LCAxMyksIFJDQVJfR1BfUElOKDcsIDUpLAorCVJDQVJfR1BfUElOKDcsIDApLCAgUkNBUl9HUF9QSU4oNiwgMTEpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXZiX21paV9tdXhbXSA9IHsKKwlBVkJfVFhEMF9NQVJLLCBBVkJfVFhEMV9NQVJLLCBBVkJfVFhEMl9NQVJLLAorCUFWQl9UWEQzX01BUkssCisKKwlBVkJfUlhEMF9NQVJLLCBBVkJfUlhEMV9NQVJLLCBBVkJfUlhEMl9NQVJLLAorCUFWQl9SWEQzX01BUkssCisKKwlBVkJfUlhfRVJfTUFSSywgQVZCX1JYX0NMS19NQVJLLCBBVkJfUlhfRFZfTUFSSywKKwlBVkJfQ1JTX01BUkssIEFWQl9UWF9FTl9NQVJLLCBBVkJfVFhfRVJfTUFSSywKKwlBVkJfVFhfQ0xLX01BUkssIEFWQl9DT0xfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGF2Yl9nbWlpX3BpbnNbXSA9IHsKKwlSQ0FSX0dQX1BJTig2LCAxNCksIFJDQVJfR1BfUElOKDYsIDE1KSwgUkNBUl9HUF9QSU4oNiwgMTYpLAorCVJDQVJfR1BfUElOKDYsIDEyKSwgUkNBUl9HUF9QSU4oNywgMSksICBSQ0FSX0dQX1BJTig3LCAyKSwKKwlSQ0FSX0dQX1BJTig3LCAzKSwgIFJDQVJfR1BfUElOKDcsIDQpLAorCisJUkNBUl9HUF9QSU4oNiwgMiksICBSQ0FSX0dQX1BJTig2LCAzKSwgUkNBUl9HUF9QSU4oNiwgNCksCisJUkNBUl9HUF9QSU4oNiwgNSksICBSQ0FSX0dQX1BJTig2LCA2KSwgUkNBUl9HUF9QSU4oNiwgNyksCisJUkNBUl9HUF9QSU4oNiwgOCksICBSQ0FSX0dQX1BJTig2LCA5KSwKKworCVJDQVJfR1BfUElOKDYsIDEwKSwgUkNBUl9HUF9QSU4oNiwgMCksIFJDQVJfR1BfUElOKDYsIDEpLAorCVJDQVJfR1BfUElOKDcsIDEyKSwgUkNBUl9HUF9QSU4oNywgNiksIFJDQVJfR1BfUElOKDcsIDEzKSwKKwlSQ0FSX0dQX1BJTig2LCAxMyksIFJDQVJfR1BfUElOKDcsIDUpLCBSQ0FSX0dQX1BJTig3LCAwKSwKKwlSQ0FSX0dQX1BJTig2LCAxMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhdmJfZ21paV9tdXhbXSA9IHsKKwlBVkJfVFhEMF9NQVJLLCBBVkJfVFhEMV9NQVJLLCBBVkJfVFhEMl9NQVJLLAorCUFWQl9UWEQzX01BUkssIEFWQl9UWEQ0X01BUkssIEFWQl9UWEQ1X01BUkssCisJQVZCX1RYRDZfTUFSSywgQVZCX1RYRDdfTUFSSywKKworCUFWQl9SWEQwX01BUkssIEFWQl9SWEQxX01BUkssIEFWQl9SWEQyX01BUkssCisJQVZCX1JYRDNfTUFSSywgQVZCX1JYRDRfTUFSSywgQVZCX1JYRDVfTUFSSywKKwlBVkJfUlhENl9NQVJLLCBBVkJfUlhEN19NQVJLLAorCisJQVZCX1JYX0VSX01BUkssIEFWQl9SWF9DTEtfTUFSSywgQVZCX1JYX0RWX01BUkssCisJQVZCX0NSU19NQVJLLCBBVkJfR1RYX0NMS19NQVJLLCBBVkJfR1RYUkVGQ0xLX01BUkssCisJQVZCX1RYX0VOX01BUkssIEFWQl9UWF9FUl9NQVJLLCBBVkJfVFhfQ0xLX01BUkssCisJQVZCX0NPTF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXZiX2F2dHBfbWF0Y2hfcGluc1tdID0geworCVJDQVJfR1BfUElOKDcsIDE1KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGF2Yl9hdnRwX21hdGNoX211eFtdID0geworCUFWQl9BVlRQX01BVENIX01BUkssCit9OworLyogLSBDQU4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY2FuMF9kYXRhX3BpbnNbXSA9IHsKKwkvKiBUWCwgUlggKi8KKwlSQ0FSX0dQX1BJTigxMCwgMjcpLCBSQ0FSX0dQX1BJTigxMCwgMjgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY2FuMF9kYXRhX211eFtdID0geworCUNBTjBfVFhfTUFSSywgQ0FOMF9SWF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY2FuMV9kYXRhX3BpbnNbXSA9IHsKKwkvKiBUWCwgUlggKi8KKwlSQ0FSX0dQX1BJTigxMCwgMzApLCBSQ0FSX0dQX1BJTigxMCwgMzEpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY2FuMV9kYXRhX211eFtdID0geworCUNBTjFfVFhfTUFSSywgQ0FOMV9SWF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY2FuX2Nsa19waW5zW10gPSB7CisJLyogQ0FOX0NMSyAqLworCVJDQVJfR1BfUElOKDEwLCAyOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjYW5fY2xrX211eFtdID0geworCUNBTl9DTEtfTUFSSywKK307CisvKiAtIERVIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdTBfcmdiNjY2X3BpbnNbXSA9IHsKKwkvKiBSWzc6Ml0sIEdbNzoyXSwgQls3OjJdICovCisJUkNBUl9HUF9QSU4oMCwgNyksIFJDQVJfR1BfUElOKDAsIDYpLCBSQ0FSX0dQX1BJTigwLCA1KSwKKwlSQ0FSX0dQX1BJTigwLCA0KSwgUkNBUl9HUF9QSU4oMCwgMyksIFJDQVJfR1BfUElOKDAsIDIpLAorCVJDQVJfR1BfUElOKDAsIDE1KSwgUkNBUl9HUF9QSU4oMCwgMTQpLCBSQ0FSX0dQX1BJTigwLCAxMyksCisJUkNBUl9HUF9QSU4oMCwgMTIpLCBSQ0FSX0dQX1BJTigwLCAxMSksIFJDQVJfR1BfUElOKDAsIDEwKSwKKwlSQ0FSX0dQX1BJTigwLCAyMyksIFJDQVJfR1BfUElOKDAsIDIyKSwgUkNBUl9HUF9QSU4oMCwgMjEpLAorCVJDQVJfR1BfUElOKDAsIDIwKSwgUkNBUl9HUF9QSU4oMCwgMTkpLCBSQ0FSX0dQX1BJTigwLCAxOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdTBfcmdiNjY2X211eFtdID0geworCURVMF9EUjdfWTlfREFUQTdfTUFSSywgRFUwX0RSNl9ZOF9EQVRBNl9NQVJLLCBEVTBfRFI1X1k3X0RBVEE1X01BUkssCisJRFUwX0RSNF9ZNl9EQVRBNF9NQVJLLCBEVTBfRFIzX1k1X0RBVEEzX01BUkssIERVMF9EUjJfWTRfREFUQTJfTUFSSywKKwlEVTBfREc3X1kzX0RBVEExNV9NQVJLLCBEVTBfREc2X1kyX0RBVEExNF9NQVJLLCBEVTBfREc1X1kxX0RBVEExM19NQVJLLAorCURVMF9ERzRfWTBfREFUQTEyX01BUkssIERVMF9ERzNfQzdfREFUQTExX01BUkssIERVMF9ERzJfQzZfREFUQTEwX01BUkssCisJRFUwX0RCN19DNV9NQVJLLCBEVTBfREI2X0M0X01BUkssIERVMF9EQjVfQzNfTUFSSywKKwlEVTBfREI0X0MyX01BUkssIERVMF9EQjNfQzFfTUFSSywgRFUwX0RCMl9DMF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHUwX3JnYjg4OF9waW5zW10gPSB7CisJLyogUls3OjBdLCBHWzc6MF0sIEJbNzowXSAqLworCVJDQVJfR1BfUElOKDAsIDcpLCBSQ0FSX0dQX1BJTigwLCA2KSwgUkNBUl9HUF9QSU4oMCwgNSksCisJUkNBUl9HUF9QSU4oMCwgNCksIFJDQVJfR1BfUElOKDAsIDMpLCBSQ0FSX0dQX1BJTigwLCAyKSwKKwlSQ0FSX0dQX1BJTigwLCAxKSwgUkNBUl9HUF9QSU4oMCwgMCksCisJUkNBUl9HUF9QSU4oMCwgMTUpLCBSQ0FSX0dQX1BJTigwLCAxNCksIFJDQVJfR1BfUElOKDAsIDEzKSwKKwlSQ0FSX0dQX1BJTigwLCAxMiksIFJDQVJfR1BfUElOKDAsIDExKSwgUkNBUl9HUF9QSU4oMCwgMTApLAorCVJDQVJfR1BfUElOKDAsIDkpLCBSQ0FSX0dQX1BJTigwLCA4KSwKKwlSQ0FSX0dQX1BJTigwLCAyMyksIFJDQVJfR1BfUElOKDAsIDIyKSwgUkNBUl9HUF9QSU4oMCwgMjEpLAorCVJDQVJfR1BfUElOKDAsIDIwKSwgUkNBUl9HUF9QSU4oMCwgMTkpLCBSQ0FSX0dQX1BJTigwLCAxOCksCisJUkNBUl9HUF9QSU4oMCwgMTcpLCBSQ0FSX0dQX1BJTigwLCAxNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdTBfcmdiODg4X211eFtdID0geworCURVMF9EUjdfWTlfREFUQTdfTUFSSywgRFUwX0RSNl9ZOF9EQVRBNl9NQVJLLCBEVTBfRFI1X1k3X0RBVEE1X01BUkssCisJRFUwX0RSNF9ZNl9EQVRBNF9NQVJLLCBEVTBfRFIzX1k1X0RBVEEzX01BUkssIERVMF9EUjJfWTRfREFUQTJfTUFSSywKKwlEVTBfRFIxX0RBVEExX01BUkssIERVMF9EUjBfREFUQTBfTUFSSywKKwlEVTBfREc3X1kzX0RBVEExNV9NQVJLLCBEVTBfREc2X1kyX0RBVEExNF9NQVJLLCBEVTBfREc1X1kxX0RBVEExM19NQVJLLAorCURVMF9ERzRfWTBfREFUQTEyX01BUkssIERVMF9ERzNfQzdfREFUQTExX01BUkssIERVMF9ERzJfQzZfREFUQTEwX01BUkssCisJRFUwX0RHMV9EQVRBOV9NQVJLLCBEVTBfREcwX0RBVEE4X01BUkssCisJRFUwX0RCN19DNV9NQVJLLCBEVTBfREI2X0M0X01BUkssIERVMF9EQjVfQzNfTUFSSywKKwlEVTBfREI0X0MyX01BUkssIERVMF9EQjNfQzFfTUFSSywgRFUwX0RCMl9DMF9NQVJLLAorCURVMF9EQjFfTUFSSywgRFUwX0RCMF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHUwX3N5bmNfcGluc1tdID0geworCS8qIEVYVlNZTkMvVlNZTkMsIEVYSFNZTkMvSFNZTkMgKi8KKwlSQ0FSX0dQX1BJTigwLCAyNSksIFJDQVJfR1BfUElOKDAsIDI0KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1MF9zeW5jX211eFtdID0geworCURVMF9FWFZTWU5DX0RVMF9WU1lOQ19NQVJLLCBEVTBfRVhIU1lOQ19EVTBfSFNZTkNfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1MF9vZGRmX3BpbnNbXSA9IHsKKwkvKiBFWE9EREYvT0RERi9ESVNQL0NERSAqLworCVJDQVJfR1BfUElOKDAsIDI2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1MF9vZGRmX211eFtdID0geworCURVMF9FWE9EREZfRFUwX09EREZfRElTUF9DREVfTUFSSworfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHUwX2Rpc3BfcGluc1tdID0geworCS8qIERJU1AgKi8KKwlSQ0FSX0dQX1BJTigwLCAyNyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdTBfZGlzcF9tdXhbXSA9IHsKKwlEVTBfRElTUF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHUwX2NkZV9waW5zW10gPSB7CisJLyogQ0RFICovCisJUkNBUl9HUF9QSU4oMCwgMjgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHUwX2NkZV9tdXhbXSA9IHsKKwlEVTBfQ0RFX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdTFfcmdiNjY2X3BpbnNbXSA9IHsKKwkvKiBSWzc6Ml0sIEdbNzoyXSwgQls3OjJdICovCisJUkNBUl9HUF9QSU4oMSwgNSksIFJDQVJfR1BfUElOKDEsIDQpLCBSQ0FSX0dQX1BJTigxLCAzKSwKKwlSQ0FSX0dQX1BJTigxLCAyKSwgUkNBUl9HUF9QSU4oMSwgMSksIFJDQVJfR1BfUElOKDEsIDApLAorCVJDQVJfR1BfUElOKDEsIDExKSwgUkNBUl9HUF9QSU4oMSwgMTApLCBSQ0FSX0dQX1BJTigxLCA5KSwKKwlSQ0FSX0dQX1BJTigxLCA4KSwgUkNBUl9HUF9QSU4oMSwgNyksIFJDQVJfR1BfUElOKDEsIDYpLAorCVJDQVJfR1BfUElOKDEsIDE3KSwgUkNBUl9HUF9QSU4oMSwgMTYpLCBSQ0FSX0dQX1BJTigxLCAxNSksCisJUkNBUl9HUF9QSU4oMSwgMTQpLCBSQ0FSX0dQX1BJTigxLCAxMyksIFJDQVJfR1BfUElOKDEsIDEyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1MV9yZ2I2NjZfbXV4W10gPSB7CisJRFUxX0RSN19EQVRBNV9NQVJLLCBEVTFfRFI2X0RBVEE0X01BUkssIERVMV9EUjVfWTdfREFUQTNfTUFSSywKKwlEVTFfRFI0X1k2X0RBVEEyX01BUkssIERVMV9EUjNfWTVfREFUQTFfTUFSSywgRFUxX0RSMl9ZNF9EQVRBMF9NQVJLLAorCURVMV9ERzdfWTNfREFUQTExX01BUkssIERVMV9ERzZfWTJfREFUQTEwX01BUkssIERVMV9ERzVfWTFfREFUQTlfTUFSSywKKwlEVTFfREc0X1kwX0RBVEE4X01BUkssIERVMV9ERzNfQzdfREFUQTdfTUFSSywgRFUxX0RHMl9DNl9EQVRBNl9NQVJLLAorCURVMV9EQjdfQzVfTUFSSywgRFUxX0RCNl9DNF9NQVJLLCBEVTFfREI1X0MzX0RBVEExNV9NQVJLLAorCURVMV9EQjRfQzJfREFUQTE0X01BUkssIERVMV9EQjNfQzFfREFUQTEzX01BUkssIERVMV9EQjJfQzBfREFUQTEyX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdTFfc3luY19waW5zW10gPSB7CisJLyogRVhWU1lOQy9WU1lOQywgRVhIU1lOQy9IU1lOQyAqLworCVJDQVJfR1BfUElOKDEsIDE5KSwgUkNBUl9HUF9QSU4oMSwgMTgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHUxX3N5bmNfbXV4W10gPSB7CisJRFUxX0VYVlNZTkNfRFUxX1ZTWU5DX01BUkssIERVMV9FWEhTWU5DX0RVMV9IU1lOQ19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHUxX29kZGZfcGluc1tdID0geworCS8qIEVYT0RERi9PRERGL0RJU1AvQ0RFICovCisJUkNBUl9HUF9QSU4oMSwgMjApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHUxX29kZGZfbXV4W10gPSB7CisJRFUxX0VYT0RERl9EVTFfT0RERl9ESVNQX0NERV9NQVJLCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdTFfZGlzcF9waW5zW10gPSB7CisJLyogRElTUCAqLworCVJDQVJfR1BfUElOKDEsIDIxKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1MV9kaXNwX211eFtdID0geworCURVMV9ESVNQX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdTFfY2RlX3BpbnNbXSA9IHsKKwkvKiBDREUgKi8KKwlSQ0FSX0dQX1BJTigxLCAyMiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdTFfY2RlX211eFtdID0geworCURVMV9DREVfTUFSSywKK307CisvKiAtIElOVEMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpbnRjX2lycTBfcGluc1tdID0geworCS8qIElSUTAgKi8KKwlSQ0FSX0dQX1BJTigzLCAxOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpbnRjX2lycTBfbXV4W10gPSB7CisJSVJRMF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW50Y19pcnExX3BpbnNbXSA9IHsKKwkvKiBJUlExICovCisJUkNBUl9HUF9QSU4oMywgMjApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW50Y19pcnExX211eFtdID0geworCUlSUTFfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGludGNfaXJxMl9waW5zW10gPSB7CisJLyogSVJRMiAqLworCVJDQVJfR1BfUElOKDMsIDIxKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGludGNfaXJxMl9tdXhbXSA9IHsKKwlJUlEyX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpbnRjX2lycTNfcGluc1tdID0geworCS8qIElSUTMgKi8KKwlSQ0FSX0dQX1BJTigzLCAyMiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpbnRjX2lycTNfbXV4W10gPSB7CisJSVJRM19NQVJLLAorfTsKKy8qIC0gTEJTQyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxic2NfY3MwX3BpbnNbXSA9IHsKKwkvKiBDUzAjICovCisJUkNBUl9HUF9QSU4oMywgMjcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGJzY19jczBfbXV4W10gPSB7CisJQ1MwX05fTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxic2NfY3MxX3BpbnNbXSA9IHsKKwkvKiBDUzEjX0EyNiAqLworCVJDQVJfR1BfUElOKDMsIDYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGJzY19jczFfbXV4W10gPSB7CisJQ1MxX05fQTI2X01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsYnNjX2V4X2NzMF9waW5zW10gPSB7CisJLyogRVhfQ1MwIyAqLworCVJDQVJfR1BfUElOKDMsIDcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGJzY19leF9jczBfbXV4W10gPSB7CisJRVhfQ1MwX05fTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxic2NfZXhfY3MxX3BpbnNbXSA9IHsKKwkvKiBFWF9DUzEjICovCisJUkNBUl9HUF9QSU4oMywgOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsYnNjX2V4X2NzMV9tdXhbXSA9IHsKKwlFWF9DUzFfTl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGJzY19leF9jczJfcGluc1tdID0geworCS8qIEVYX0NTMiMgKi8KKwlSQ0FSX0dQX1BJTigzLCA5KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxic2NfZXhfY3MyX211eFtdID0geworCUVYX0NTMl9OX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsYnNjX2V4X2NzM19waW5zW10gPSB7CisJLyogRVhfQ1MzIyAqLworCVJDQVJfR1BfUElOKDMsIDEwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxic2NfZXhfY3MzX211eFtdID0geworCUVYX0NTM19OX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsYnNjX2V4X2NzNF9waW5zW10gPSB7CisJLyogRVhfQ1M0IyAqLworCVJDQVJfR1BfUElOKDMsIDExKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxic2NfZXhfY3M0X211eFtdID0geworCUVYX0NTNF9OX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsYnNjX2V4X2NzNV9waW5zW10gPSB7CisJLyogRVhfQ1M1IyAqLworCVJDQVJfR1BfUElOKDMsIDEyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxic2NfZXhfY3M1X211eFtdID0geworCUVYX0NTNV9OX01BUkssCit9OworLyogLSBNU0lPRjAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX2Nsa19waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oMTAsIDApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX2Nsa19tdXhbXSA9IHsKKwlNU0lPRjBfU0NLX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3luY19waW5zW10gPSB7CisJLyogU1lOQyAqLworCVJDQVJfR1BfUElOKDEwLCAxKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9zeW5jX211eFtdID0geworCU1TSU9GMF9TWU5DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfcnhfcGluc1tdID0geworCS8qIFJYRCAqLworCVJDQVJfR1BfUElOKDEwLCA0KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9yeF9tdXhbXSA9IHsKKwlNU0lPRjBfUlhEX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfdHhfcGluc1tdID0geworCS8qIFRYRCAqLworCVJDQVJfR1BfUElOKDEwLCAzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF90eF9tdXhbXSA9IHsKKwlNU0lPRjBfVFhEX01BUkssCit9OworLyogLSBNU0lPRjEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oMTAsIDUpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19tdXhbXSA9IHsKKwlNU0lPRjFfU0NLX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3luY19waW5zW10gPSB7CisJLyogU1lOQyAqLworCVJDQVJfR1BfUElOKDEwLCA2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zeW5jX211eFtdID0geworCU1TSU9GMV9TWU5DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfcnhfcGluc1tdID0geworCS8qIFJYRCAqLworCVJDQVJfR1BfUElOKDEwLCA5KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9yeF9tdXhbXSA9IHsKKwlNU0lPRjFfUlhEX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfdHhfcGluc1tdID0geworCS8qIFRYRCAqLworCVJDQVJfR1BfUElOKDEwLCA4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV90eF9tdXhbXSA9IHsKKwlNU0lPRjFfVFhEX01BUkssCit9OworLyogLSBRU1BJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9jdHJsX3BpbnNbXSA9IHsKKwkvKiBTUENMSywgU1NMICovCisJUkNBUl9HUF9QSU4oMywgMjUpLCBSQ0FSX0dQX1BJTigzLCAyNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2N0cmxfbXV4W10gPSB7CisJU1BDTEtfTUFSSywgU1NMX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2RhdGEyX3BpbnNbXSA9IHsKKwkvKiBNT1NJX0lPMCwgTUlTT19JTzEgKi8KKwlSQ0FSX0dQX1BJTigzLCA0KSwgUkNBUl9HUF9QSU4oMywgNSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2RhdGEyX211eFtdID0geworCU1PU0lfSU8wX01BUkssIE1JU09fSU8xX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2RhdGE0X3BpbnNbXSA9IHsKKwkvKiBNT1NJX0lPMCwgTUlTT19JTzEsIElPMiwgSU8zICovCisJUkNBUl9HUF9QSU4oMywgNCksIFJDQVJfR1BfUElOKDMsIDUpLCBSQ0FSX0dQX1BJTigzLCAyMyksCisJUkNBUl9HUF9QSU4oMywgMjQpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9kYXRhNF9tdXhbXSA9IHsKKwlNT1NJX0lPMF9NQVJLLCBNSVNPX0lPMV9NQVJLLCBJTzJfTUFSSywJSU8zX01BUkssCit9OworLyogLSBTQ0lGMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjBfZGF0YV9waW5zW10gPSB7CisJLyogUlgsIFRYICovCisJUkNBUl9HUF9QSU4oMTAsIDE0KSwgUkNBUl9HUF9QSU4oMTAsIDEzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYwX2RhdGFfbXV4W10gPSB7CisJUlgwX01BUkssIFRYMF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjBfY2xrX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTigxMCwgMTApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjBfY2xrX211eFtdID0geworCVNDSzBfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYwX2N0cmxfcGluc1tdID0geworCS8qIFJUUywgQ1RTICovCisJUkNBUl9HUF9QSU4oMTAsIDEyKSwgUkNBUl9HUF9QSU4oMTAsIDExKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYwX2N0cmxfbXV4W10gPSB7CisJUlRTMF9OX01BUkssIENUUzBfTl9NQVJLLAorfTsKKy8qIC0gU0NJRjMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYzX2RhdGFfcGluc1tdID0geworCS8qIFJYLCBUWCAqLworCVJDQVJfR1BfUElOKDEwLCAyNSksIFJDQVJfR1BfUElOKDEwLCAyNCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmM19kYXRhX211eFtdID0geworCVJYM19NQVJLLCBUWDNfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYzX2Nsa19waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oMTAsIDIzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYzX2Nsa19tdXhbXSA9IHsKKwlTQ0szX01BUkssCit9OworLyogLSBTREhJMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTBfZGF0YTFfcGluc1tdID0geworCS8qIERBVDAgKi8KKwlSQ0FSX0dQX1BJTigxMSwgNyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMF9kYXRhMV9tdXhbXSA9IHsKKwlTRDBfREFUMF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTBfZGF0YTRfcGluc1tdID0geworCS8qIERBVFswLTNdICovCisJUkNBUl9HUF9QSU4oMTEsIDcpLCBSQ0FSX0dQX1BJTigxMSwgOCksCisJUkNBUl9HUF9QSU4oMTEsIDkpLCBSQ0FSX0dQX1BJTigxMSwgMTApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTBfZGF0YTRfbXV4W10gPSB7CisJU0QwX0RBVDBfTUFSSywgU0QwX0RBVDFfTUFSSywgU0QwX0RBVDJfTUFSSywgU0QwX0RBVDNfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkwX2N0cmxfcGluc1tdID0geworCS8qIENMSywgQ01EICovCisJUkNBUl9HUF9QSU4oMTEsIDUpLCBSQ0FSX0dQX1BJTigxMSwgNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMF9jdHJsX211eFtdID0geworCVNEMF9DTEtfTUFSSywgU0QwX0NNRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTBfY2RfcGluc1tdID0geworCS8qIENEICovCisJUkNBUl9HUF9QSU4oMTEsIDExKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkwX2NkX211eFtdID0geworCVNEMF9DRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTBfd3BfcGluc1tdID0geworCS8qIFdQICovCisJUkNBUl9HUF9QSU4oMTEsIDEyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkwX3dwX211eFtdID0geworCVNEMF9XUF9NQVJLLAorfTsKKy8qIC0gVklOMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5pb24gdmluX2RhdGEgdmluMF9kYXRhX3BpbnMgPSB7CisJLmRhdGEyNCA9IHsKKwkJLyogQiAqLworCQlSQ0FSX0dQX1BJTig0LCA0KSwgUkNBUl9HUF9QSU4oNCwgNSksCisJCVJDQVJfR1BfUElOKDQsIDYpLCBSQ0FSX0dQX1BJTig0LCA3KSwKKwkJUkNBUl9HUF9QSU4oNCwgOCksIFJDQVJfR1BfUElOKDQsIDkpLAorCQlSQ0FSX0dQX1BJTig0LCAxMCksIFJDQVJfR1BfUElOKDQsIDExKSwKKwkJLyogRyAqLworCQlSQ0FSX0dQX1BJTig0LCAxMiksIFJDQVJfR1BfUElOKDQsIDEzKSwKKwkJUkNBUl9HUF9QSU4oNCwgMTQpLCBSQ0FSX0dQX1BJTig0LCAxNSksCisJCVJDQVJfR1BfUElOKDgsIDEpLCBSQ0FSX0dQX1BJTig4LCAyKSwKKwkJUkNBUl9HUF9QSU4oOCwgMyksIFJDQVJfR1BfUElOKDgsIDQpLAorCQkvKiBSICovCisJCVJDQVJfR1BfUElOKDgsIDUpLCBSQ0FSX0dQX1BJTig4LCA2KSwKKwkJUkNBUl9HUF9QSU4oOCwgNyksIFJDQVJfR1BfUElOKDgsIDgpLAorCQlSQ0FSX0dQX1BJTig4LCA5KSwgUkNBUl9HUF9QSU4oOCwgMTApLAorCQlSQ0FSX0dQX1BJTig4LCAxMSksIFJDQVJfR1BfUElOKDgsIDEyKSwKKwl9LAorfTsKK3N0YXRpYyBjb25zdCB1bmlvbiB2aW5fZGF0YSB2aW4wX2RhdGFfbXV4ID0geworCS5kYXRhMjQgPSB7CisJCS8qIEIgKi8KKwkJVkkwX0QwX0IwX0MwX01BUkssIFZJMF9EMV9CMV9DMV9NQVJLLAorCQlWSTBfRDJfQjJfQzJfTUFSSywgVkkwX0QzX0IzX0MzX01BUkssCisJCVZJMF9ENF9CNF9DNF9NQVJLLCBWSTBfRDVfQjVfQzVfTUFSSywKKwkJVkkwX0Q2X0I2X0M2X01BUkssIFZJMF9EN19CN19DN19NQVJLLAorCQkvKiBHICovCisJCVZJMF9EOF9HMF9ZMF9NQVJLLCBWSTBfRDlfRzFfWTFfTUFSSywKKwkJVkkwX0QxMF9HMl9ZMl9NQVJLLCBWSTBfRDExX0czX1kzX01BUkssCisJCVZJMF9EMTJfRzRfWTRfTUFSSywgVkkwX0QxM19HNV9ZNV9NQVJLLAorCQlWSTBfRDE0X0c2X1k2X01BUkssIFZJMF9EMTVfRzdfWTdfTUFSSywKKwkJLyogUiAqLworCQlWSTBfRDE2X1IwX01BUkssIFZJMF9EMTdfUjFfTUFSSywKKwkJVkkwX0QxOF9SMl9NQVJLLCBWSTBfRDE5X1IzX01BUkssCisJCVZJMF9EMjBfUjRfTUFSSywgVkkwX0QyMV9SNV9NQVJLLAorCQlWSTBfRDIyX1I2X01BUkssIFZJMF9EMjNfUjdfTUFSSywKKwl9LAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluMF9kYXRhMThfcGluc1tdID0geworCS8qIEIgKi8KKwlSQ0FSX0dQX1BJTig0LCA2KSwgUkNBUl9HUF9QSU4oNCwgNyksCisJUkNBUl9HUF9QSU4oNCwgOCksIFJDQVJfR1BfUElOKDQsIDkpLAorCVJDQVJfR1BfUElOKDQsIDEwKSwgUkNBUl9HUF9QSU4oNCwgMTEpLAorCS8qIEcgKi8KKwlSQ0FSX0dQX1BJTig0LCAxNCksIFJDQVJfR1BfUElOKDQsIDE1KSwKKwlSQ0FSX0dQX1BJTig4LCAxKSwgUkNBUl9HUF9QSU4oOCwgMiksCisJUkNBUl9HUF9QSU4oOCwgMyksIFJDQVJfR1BfUElOKDgsIDQpLAorCS8qIFIgKi8KKwlSQ0FSX0dQX1BJTig4LCA3KSwgUkNBUl9HUF9QSU4oOCwgOCksCisJUkNBUl9HUF9QSU4oOCwgOSksIFJDQVJfR1BfUElOKDgsIDEwKSwKKwlSQ0FSX0dQX1BJTig4LCAxMSksIFJDQVJfR1BfUElOKDgsIDEyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjBfZGF0YTE4X211eFtdID0geworCS8qIEIgKi8KKwlWSTBfRDJfQjJfQzJfTUFSSywgVkkwX0QzX0IzX0MzX01BUkssCisJVkkwX0Q0X0I0X0M0X01BUkssIFZJMF9ENV9CNV9DNV9NQVJLLAorCVZJMF9ENl9CNl9DNl9NQVJLLCBWSTBfRDdfQjdfQzdfTUFSSywKKwkvKiBHICovCisJVkkwX0QxMF9HMl9ZMl9NQVJLLCBWSTBfRDExX0czX1kzX01BUkssCisJVkkwX0QxMl9HNF9ZNF9NQVJLLCBWSTBfRDEzX0c1X1k1X01BUkssCisJVkkwX0QxNF9HNl9ZNl9NQVJLLCBWSTBfRDE1X0c3X1k3X01BUkssCisJLyogUiAqLworCVZJMF9EMThfUjJfTUFSSywgVkkwX0QxOV9SM19NQVJLLAorCVZJMF9EMjBfUjRfTUFSSywgVkkwX0QyMV9SNV9NQVJLLAorCVZJMF9EMjJfUjZfTUFSSywgVkkwX0QyM19SN19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluMF9zeW5jX3BpbnNbXSA9IHsKKwkvKiBIU1lOQyMsIFZTWU5DIyAqLworCVJDQVJfR1BfUElOKDQsIDIpLCBSQ0FSX0dQX1BJTig0LCAzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjBfc3luY19tdXhbXSA9IHsKKwlWSTBfSFNZTkNfTl9NQVJLLCBWSTBfVlNZTkNfTl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluMF9maWVsZF9waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oNCwgMTYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluMF9maWVsZF9tdXhbXSA9IHsKKwlWSTBfRklFTERfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjBfY2xrZW5iX3BpbnNbXSA9IHsKKwlSQ0FSX0dQX1BJTig0LCAxKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjBfY2xrZW5iX211eFtdID0geworCVZJMF9DTEtFTkJfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjBfY2xrX3BpbnNbXSA9IHsKKwlSQ0FSX0dQX1BJTig0LCAwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjBfY2xrX211eFtdID0geworCVZJMF9DTEtfTUFSSywKK307CisvKiAtIFZJTjEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuaW9uIHZpbl9kYXRhIHZpbjFfZGF0YV9waW5zID0geworCS5kYXRhMjQgPSB7CisJCS8qIEIgKi8KKwkJUkNBUl9HUF9QSU4oNSwgNCksIFJDQVJfR1BfUElOKDUsIDUpLAorCQlSQ0FSX0dQX1BJTig1LCA2KSwgUkNBUl9HUF9QSU4oNSwgNyksCisJCVJDQVJfR1BfUElOKDUsIDgpLCBSQ0FSX0dQX1BJTig1LCA5KSwKKwkJUkNBUl9HUF9QSU4oNSwgMTApLCBSQ0FSX0dQX1BJTig1LCAxMSksCisJCS8qIEcgKi8KKwkJUkNBUl9HUF9QSU4oNSwgMTIpLCBSQ0FSX0dQX1BJTig1LCAxMyksCisJCVJDQVJfR1BfUElOKDUsIDE0KSwgUkNBUl9HUF9QSU4oNSwgMTUpLAorCQlSQ0FSX0dQX1BJTig4LCA1KSwgUkNBUl9HUF9QSU4oOCwgNiksCisJCVJDQVJfR1BfUElOKDgsIDcpLCBSQ0FSX0dQX1BJTig4LCA4KSwKKwkJLyogUiAqLworCQlSQ0FSX0dQX1BJTig5LCA1KSwgUkNBUl9HUF9QSU4oOSwgNiksCisJCVJDQVJfR1BfUElOKDksIDcpLCBSQ0FSX0dQX1BJTig5LCA4KSwKKwkJUkNBUl9HUF9QSU4oOSwgOSksIFJDQVJfR1BfUElOKDksIDEwKSwKKwkJUkNBUl9HUF9QSU4oOSwgMTEpLCBSQ0FSX0dQX1BJTig5LCAxMiksCisJfSwKK307CitzdGF0aWMgY29uc3QgdW5pb24gdmluX2RhdGEgdmluMV9kYXRhX211eCA9IHsKKwkuZGF0YTI0ID0geworCQkvKiBCICovCisJCVZJMV9EMF9CMF9DMF9NQVJLLCBWSTFfRDFfQjFfQzFfTUFSSywKKwkJVkkxX0QyX0IyX0MyX01BUkssIFZJMV9EM19CM19DM19NQVJLLAorCQlWSTFfRDRfQjRfQzRfTUFSSywgVkkxX0Q1X0I1X0M1X01BUkssCisJCVZJMV9ENl9CNl9DNl9NQVJLLCBWSTFfRDdfQjdfQzdfTUFSSywKKwkJLyogRyAqLworCQlWSTFfRDhfRzBfWTBfTUFSSywgVkkxX0Q5X0cxX1kxX01BUkssCisJCVZJMV9EMTBfRzJfWTJfTUFSSywgVkkxX0QxMV9HM19ZM19NQVJLLAorCQlWSTFfRDEyX0c0X1k0X01BUkssIFZJMV9EMTNfRzVfWTVfTUFSSywKKwkJVkkxX0QxNF9HNl9ZNl9NQVJLLCBWSTFfRDE1X0c3X1k3X01BUkssCisJCS8qIFIgKi8KKwkJVkkxX0QxNl9SMF9NQVJLLCBWSTFfRDE3X1IxX01BUkssCisJCVZJMV9EMThfUjJfTUFSSywgVkkxX0QxOV9SM19NQVJLLAorCQlWSTFfRDIwX1I0X01BUkssIFZJMV9EMjFfUjVfTUFSSywKKwkJVkkxX0QyMl9SNl9NQVJLLCBWSTFfRDIzX1I3X01BUkssCisJfSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjFfZGF0YTE4X3BpbnNbXSA9IHsKKwkvKiBCICovCisJUkNBUl9HUF9QSU4oNSwgNiksIFJDQVJfR1BfUElOKDUsIDcpLAorCVJDQVJfR1BfUElOKDUsIDgpLCBSQ0FSX0dQX1BJTig1LCA5KSwKKwlSQ0FSX0dQX1BJTig1LCAxMCksIFJDQVJfR1BfUElOKDUsIDExKSwKKwkvKiBHICovCisJUkNBUl9HUF9QSU4oNSwgMTQpLCBSQ0FSX0dQX1BJTig1LCAxNSksCisJUkNBUl9HUF9QSU4oOCwgNSksIFJDQVJfR1BfUElOKDgsIDYpLAorCVJDQVJfR1BfUElOKDgsIDcpLCBSQ0FSX0dQX1BJTig4LCA4KSwKKwkvKiBSICovCisJUkNBUl9HUF9QSU4oOSwgNyksIFJDQVJfR1BfUElOKDksIDgpLAorCVJDQVJfR1BfUElOKDksIDkpLCBSQ0FSX0dQX1BJTig5LCAxMCksCisJUkNBUl9HUF9QSU4oOSwgMTEpLCBSQ0FSX0dQX1BJTig5LCAxMiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4xX2RhdGExOF9tdXhbXSA9IHsKKwkvKiBCICovCisJVkkxX0QyX0IyX0MyX01BUkssIFZJMV9EM19CM19DM19NQVJLLAorCVZJMV9ENF9CNF9DNF9NQVJLLCBWSTFfRDVfQjVfQzVfTUFSSywKKwlWSTFfRDZfQjZfQzZfTUFSSywgVkkxX0Q3X0I3X0M3X01BUkssCisJLyogRyAqLworCVZJMV9EMTBfRzJfWTJfTUFSSywgVkkxX0QxMV9HM19ZM19NQVJLLAorCVZJMV9EMTJfRzRfWTRfTUFSSywgVkkxX0QxM19HNV9ZNV9NQVJLLAorCVZJMV9EMTRfRzZfWTZfTUFSSywgVkkxX0QxNV9HN19ZN19NQVJLLAorCS8qIFIgKi8KKwlWSTFfRDE4X1IyX01BUkssIFZJMV9EMTlfUjNfTUFSSywKKwlWSTFfRDIwX1I0X01BUkssIFZJMV9EMjFfUjVfTUFSSywKKwlWSTFfRDIyX1I2X01BUkssIFZJMV9EMjNfUjdfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5pb24gdmluX2RhdGEgdmluMV9kYXRhX2JfcGlucyA9IHsKKwkuZGF0YTI0ID0geworCQkvKiBCICovCisJCVJDQVJfR1BfUElOKDUsIDQpLCBSQ0FSX0dQX1BJTig1LCA1KSwKKwkJUkNBUl9HUF9QSU4oNSwgNiksIFJDQVJfR1BfUElOKDUsIDcpLAorCQlSQ0FSX0dQX1BJTig1LCA4KSwgUkNBUl9HUF9QSU4oNSwgOSksCisJCVJDQVJfR1BfUElOKDUsIDEwKSwgUkNBUl9HUF9QSU4oNSwgMTEpLAorCQkvKiBHICovCisJCVJDQVJfR1BfUElOKDUsIDEyKSwgUkNBUl9HUF9QSU4oNSwgMTMpLAorCQlSQ0FSX0dQX1BJTig1LCAxNCksIFJDQVJfR1BfUElOKDUsIDE1KSwKKwkJUkNBUl9HUF9QSU4oOSwgMSksIFJDQVJfR1BfUElOKDksIDIpLAorCQlSQ0FSX0dQX1BJTig5LCAzKSwgUkNBUl9HUF9QSU4oOSwgNCksCisJCS8qIFIgKi8KKwkJUkNBUl9HUF9QSU4oOSwgNSksIFJDQVJfR1BfUElOKDksIDYpLAorCQlSQ0FSX0dQX1BJTig5LCA3KSwgUkNBUl9HUF9QSU4oOSwgOCksCisJCVJDQVJfR1BfUElOKDksIDkpLCBSQ0FSX0dQX1BJTig5LCAxMCksCisJCVJDQVJfR1BfUElOKDksIDExKSwgUkNBUl9HUF9QSU4oOSwgMTIpLAorCX0sCit9Oworc3RhdGljIGNvbnN0IHVuaW9uIHZpbl9kYXRhIHZpbjFfZGF0YV9iX211eCA9IHsKKwkuZGF0YTI0ID0geworCQkvKiBCICovCisJCVZJMV9EMF9CMF9DMF9NQVJLLCBWSTFfRDFfQjFfQzFfTUFSSywKKwkJVkkxX0QyX0IyX0MyX01BUkssIFZJMV9EM19CM19DM19NQVJLLAorCQlWSTFfRDRfQjRfQzRfTUFSSywgVkkxX0Q1X0I1X0M1X01BUkssCisJCVZJMV9ENl9CNl9DNl9NQVJLLCBWSTFfRDdfQjdfQzdfTUFSSywKKwkJLyogRyAqLworCQlWSTFfRDhfRzBfWTBfTUFSSywgVkkxX0Q5X0cxX1kxX01BUkssCisJCVZJMV9EMTBfRzJfWTJfTUFSSywgVkkxX0QxMV9HM19ZM19NQVJLLAorCQlWSTFfRDEyX0c0X1k0X0JfTUFSSywgVkkxX0QxM19HNV9ZNV9CX01BUkssCisJCVZJMV9EMTRfRzZfWTZfQl9NQVJLLCBWSTFfRDE1X0c3X1k3X0JfTUFSSywKKwkJLyogUiAqLworCQlWSTFfRDE2X1IwX01BUkssIFZJMV9EMTdfUjFfTUFSSywKKwkJVkkxX0QxOF9SMl9NQVJLLCBWSTFfRDE5X1IzX01BUkssCisJCVZJMV9EMjBfUjRfTUFSSywgVkkxX0QyMV9SNV9NQVJLLAorCQlWSTFfRDIyX1I2X01BUkssIFZJMV9EMjNfUjdfTUFSSywKKwl9LAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluMV9kYXRhMThfYl9waW5zW10gPSB7CisJLyogQiAqLworCVJDQVJfR1BfUElOKDUsIDYpLCBSQ0FSX0dQX1BJTig1LCA3KSwKKwlSQ0FSX0dQX1BJTig1LCA4KSwgUkNBUl9HUF9QSU4oNSwgOSksCisJUkNBUl9HUF9QSU4oNSwgMTApLCBSQ0FSX0dQX1BJTig1LCAxMSksCisJLyogRyAqLworCVJDQVJfR1BfUElOKDUsIDE0KSwgUkNBUl9HUF9QSU4oNSwgMTUpLAorCVJDQVJfR1BfUElOKDksIDEpLCBSQ0FSX0dQX1BJTig5LCAyKSwKKwlSQ0FSX0dQX1BJTig5LCAzKSwgUkNBUl9HUF9QSU4oOSwgNCksCisJLyogUiAqLworCVJDQVJfR1BfUElOKDksIDcpLCBSQ0FSX0dQX1BJTig5LCA4KSwKKwlSQ0FSX0dQX1BJTig5LCA5KSwgUkNBUl9HUF9QSU4oOSwgMTApLAorCVJDQVJfR1BfUElOKDksIDExKSwgUkNBUl9HUF9QSU4oOSwgMTIpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluMV9kYXRhMThfYl9tdXhbXSA9IHsKKwkvKiBCICovCisJVkkxX0QyX0IyX0MyX01BUkssIFZJMV9EM19CM19DM19NQVJLLAorCVZJMV9ENF9CNF9DNF9NQVJLLCBWSTFfRDVfQjVfQzVfTUFSSywKKwlWSTFfRDZfQjZfQzZfTUFSSywgVkkxX0Q3X0I3X0M3X01BUkssCisJLyogRyAqLworCVZJMV9EMTBfRzJfWTJfTUFSSywgVkkxX0QxMV9HM19ZM19NQVJLLAorCVZJMV9EMTJfRzRfWTRfQl9NQVJLLCBWSTFfRDEzX0c1X1k1X0JfTUFSSywKKwlWSTFfRDE0X0c2X1k2X0JfTUFSSywgVkkxX0QxNV9HN19ZN19CX01BUkssCisJLyogUiAqLworCVZJMV9EMThfUjJfTUFSSywgVkkxX0QxOV9SM19NQVJLLAorCVZJMV9EMjBfUjRfTUFSSywgVkkxX0QyMV9SNV9NQVJLLAorCVZJMV9EMjJfUjZfTUFSSywgVkkxX0QyM19SN19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluMV9zeW5jX3BpbnNbXSA9IHsKKwkvKiBIU1lOQyMsIFZTWU5DIyAqLworCVJDQVJfR1BfUElOKDUsIDIpLCBSQ0FSX0dQX1BJTig1LCAzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjFfc3luY19tdXhbXSA9IHsKKwlWSTFfSFNZTkNfTl9NQVJLLCBWSTFfVlNZTkNfTl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluMV9maWVsZF9waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oNSwgMTYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluMV9maWVsZF9tdXhbXSA9IHsKKwlWSTFfRklFTERfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjFfY2xrZW5iX3BpbnNbXSA9IHsKKwlSQ0FSX0dQX1BJTig1LCAxKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjFfY2xrZW5iX211eFtdID0geworCVZJMV9DTEtFTkJfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjFfY2xrX3BpbnNbXSA9IHsKKwlSQ0FSX0dQX1BJTig1LCAwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjFfY2xrX211eFtdID0geworCVZJMV9DTEtfTUFSSywKK307CisvKiAtIFZJTjIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuaW9uIHZpbl9kYXRhIHZpbjJfZGF0YV9waW5zID0geworCS5kYXRhMTYgPSB7CisJCVJDQVJfR1BfUElOKDYsIDQpLCBSQ0FSX0dQX1BJTig2LCA1KSwKKwkJUkNBUl9HUF9QSU4oNiwgNiksIFJDQVJfR1BfUElOKDYsIDcpLAorCQlSQ0FSX0dQX1BJTig2LCA4KSwgUkNBUl9HUF9QSU4oNiwgOSksCisJCVJDQVJfR1BfUElOKDYsIDEwKSwgUkNBUl9HUF9QSU4oNiwgMTEpLAorCQlSQ0FSX0dQX1BJTig2LCAxMiksIFJDQVJfR1BfUElOKDYsIDEzKSwKKwkJUkNBUl9HUF9QSU4oNiwgMTQpLCBSQ0FSX0dQX1BJTig2LCAxNSksCisJCVJDQVJfR1BfUElOKDgsIDkpLCBSQ0FSX0dQX1BJTig4LCAxMCksCisJCVJDQVJfR1BfUElOKDgsIDExKSwgUkNBUl9HUF9QSU4oOCwgMTIpLAorCX0sCit9Oworc3RhdGljIGNvbnN0IHVuaW9uIHZpbl9kYXRhIHZpbjJfZGF0YV9tdXggPSB7CisJLmRhdGExNiA9IHsKKwkJVkkyX0QwX0MwX01BUkssIFZJMl9EMV9DMV9NQVJLLAorCQlWSTJfRDJfQzJfTUFSSywJVkkyX0QzX0MzX01BUkssCisJCVZJMl9ENF9DNF9NQVJLLCBWSTJfRDVfQzVfTUFSSywKKwkJVkkyX0Q2X0M2X01BUkssIFZJMl9EN19DN19NQVJLLAorCQlWSTJfRDhfWTBfTUFSSywJVkkyX0Q5X1kxX01BUkssCisJCVZJMl9EMTBfWTJfTUFSSywgVkkyX0QxMV9ZM19NQVJLLAorCQlWSTJfRDEyX1k0X01BUkssIFZJMl9EMTNfWTVfTUFSSywKKwkJVkkyX0QxNF9ZNl9NQVJLLCBWSTJfRDE1X1k3X01BUkssCisJfSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjJfc3luY19waW5zW10gPSB7CisJLyogSFNZTkMjLCBWU1lOQyMgKi8KKwlSQ0FSX0dQX1BJTig2LCAyKSwgUkNBUl9HUF9QSU4oNiwgMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4yX3N5bmNfbXV4W10gPSB7CisJVkkyX0hTWU5DX05fTUFSSywgVkkyX1ZTWU5DX05fTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjJfZmllbGRfcGluc1tdID0geworCVJDQVJfR1BfUElOKDYsIDE2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjJfZmllbGRfbXV4W10gPSB7CisJVkkyX0ZJRUxEX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4yX2Nsa2VuYl9waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oNiwgMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4yX2Nsa2VuYl9tdXhbXSA9IHsKKwlWSTJfQ0xLRU5CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4yX2Nsa19waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oNiwgMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4yX2Nsa19tdXhbXSA9IHsKKwlWSTJfQ0xLX01BUkssCit9OworLyogLSBWSU4zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bmlvbiB2aW5fZGF0YSB2aW4zX2RhdGFfcGlucyA9IHsKKwkuZGF0YTE2ID0geworCQlSQ0FSX0dQX1BJTig3LCA0KSwgUkNBUl9HUF9QSU4oNywgNSksCisJCVJDQVJfR1BfUElOKDcsIDYpLCBSQ0FSX0dQX1BJTig3LCA3KSwKKwkJUkNBUl9HUF9QSU4oNywgOCksIFJDQVJfR1BfUElOKDcsIDkpLAorCQlSQ0FSX0dQX1BJTig3LCAxMCksIFJDQVJfR1BfUElOKDcsIDExKSwKKwkJUkNBUl9HUF9QSU4oNywgMTIpLCBSQ0FSX0dQX1BJTig3LCAxMyksCisJCVJDQVJfR1BfUElOKDcsIDE0KSwgUkNBUl9HUF9QSU4oNywgMTUpLAorCQlSQ0FSX0dQX1BJTig4LCAxMyksIFJDQVJfR1BfUElOKDgsIDE0KSwKKwkJUkNBUl9HUF9QSU4oOCwgMTUpLCBSQ0FSX0dQX1BJTig4LCAxNiksCisJfSwKK307CitzdGF0aWMgY29uc3QgdW5pb24gdmluX2RhdGEgdmluM19kYXRhX211eCA9IHsKKwkuZGF0YTE2ID0geworCQlWSTNfRDBfQzBfTUFSSywgVkkzX0QxX0MxX01BUkssCisJCVZJM19EMl9DMl9NQVJLLAlWSTNfRDNfQzNfTUFSSywKKwkJVkkzX0Q0X0M0X01BUkssIFZJM19ENV9DNV9NQVJLLAorCQlWSTNfRDZfQzZfTUFSSywgVkkzX0Q3X0M3X01BUkssCisJCVZJM19EOF9ZMF9NQVJLLCBWSTNfRDlfWTFfTUFSSywKKwkJVkkzX0QxMF9ZMl9NQVJLLCBWSTNfRDExX1kzX01BUkssCisJCVZJM19EMTJfWTRfTUFSSywgVkkzX0QxM19ZNV9NQVJLLAorCQlWSTNfRDE0X1k2X01BUkssIFZJM19EMTVfWTdfTUFSSywKKwl9LAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluM19zeW5jX3BpbnNbXSA9IHsKKwkvKiBIU1lOQyMsIFZTWU5DIyAqLworCVJDQVJfR1BfUElOKDcsIDIpLCBSQ0FSX0dQX1BJTig3LCAzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjNfc3luY19tdXhbXSA9IHsKKwlWSTNfSFNZTkNfTl9NQVJLLCBWSTNfVlNZTkNfTl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluM19maWVsZF9waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oNywgMTYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluM19maWVsZF9tdXhbXSA9IHsKKwlWSTNfRklFTERfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjNfY2xrZW5iX3BpbnNbXSA9IHsKKwlSQ0FSX0dQX1BJTig3LCAxKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjNfY2xrZW5iX211eFtdID0geworCVZJM19DTEtFTkJfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjNfY2xrX3BpbnNbXSA9IHsKKwlSQ0FSX0dQX1BJTig3LCAwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjNfY2xrX211eFtdID0geworCVZJM19DTEtfTUFSSywKK307CisvKiAtIFZJTjQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuaW9uIHZpbl9kYXRhIHZpbjRfZGF0YV9waW5zID0geworCS5kYXRhMTIgPSB7CisJCVJDQVJfR1BfUElOKDgsIDQpLCBSQ0FSX0dQX1BJTig4LCA1KSwKKwkJUkNBUl9HUF9QSU4oOCwgNiksIFJDQVJfR1BfUElOKDgsIDcpLAorCQlSQ0FSX0dQX1BJTig4LCA4KSwgUkNBUl9HUF9QSU4oOCwgOSksCisJCVJDQVJfR1BfUElOKDgsIDEwKSwgUkNBUl9HUF9QSU4oOCwgMTEpLAorCQlSQ0FSX0dQX1BJTig4LCAxMiksIFJDQVJfR1BfUElOKDgsIDEzKSwKKwkJUkNBUl9HUF9QSU4oOCwgMTQpLCBSQ0FSX0dQX1BJTig4LCAxNSksCisJfSwKK307CitzdGF0aWMgY29uc3QgdW5pb24gdmluX2RhdGEgdmluNF9kYXRhX211eCA9IHsKKwkuZGF0YTEyID0geworCQlWSTRfRDBfQzBfTUFSSywgVkk0X0QxX0MxX01BUkssCisJCVZJNF9EMl9DMl9NQVJLLCBWSTRfRDNfQzNfTUFSSywKKwkJVkk0X0Q0X0M0X01BUkssIFZJNF9ENV9DNV9NQVJLLAorCQlWSTRfRDZfQzZfTUFSSywgVkk0X0Q3X0M3X01BUkssCisJCVZJNF9EOF9ZMF9NQVJLLAlWSTRfRDlfWTFfTUFSSywKKwkJVkk0X0QxMF9ZMl9NQVJLLCBWSTRfRDExX1kzX01BUkssCisJfSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjRfc3luY19waW5zW10gPSB7CisJIC8qIEhTWU5DIywgVlNZTkMjICovCisJUkNBUl9HUF9QSU4oOCwgMiksIFJDQVJfR1BfUElOKDgsIDMpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluNF9zeW5jX211eFtdID0geworCVZJNF9IU1lOQ19OX01BUkssIFZJNF9WU1lOQ19OX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW40X2ZpZWxkX3BpbnNbXSA9IHsKKwlSQ0FSX0dQX1BJTig4LCAxNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW40X2ZpZWxkX211eFtdID0geworCVZJNF9GSUVMRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluNF9jbGtlbmJfcGluc1tdID0geworCVJDQVJfR1BfUElOKDgsIDEpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluNF9jbGtlbmJfbXV4W10gPSB7CisJVkk0X0NMS0VOQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluNF9jbGtfcGluc1tdID0geworCVJDQVJfR1BfUElOKDgsIDApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluNF9jbGtfbXV4W10gPSB7CisJVkk0X0NMS19NQVJLLAorfTsKKy8qIC0gVklONSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5pb24gdmluX2RhdGEgdmluNV9kYXRhX3BpbnMgPSB7CisJLmRhdGExMiA9IHsKKwkJUkNBUl9HUF9QSU4oOSwgNCksIFJDQVJfR1BfUElOKDksIDUpLAorCQlSQ0FSX0dQX1BJTig5LCA2KSwgUkNBUl9HUF9QSU4oOSwgNyksCisJCVJDQVJfR1BfUElOKDksIDgpLCBSQ0FSX0dQX1BJTig5LCA5KSwKKwkJUkNBUl9HUF9QSU4oOSwgMTApLCBSQ0FSX0dQX1BJTig5LCAxMSksCisJCVJDQVJfR1BfUElOKDksIDEyKSwgUkNBUl9HUF9QSU4oOSwgMTMpLAorCQlSQ0FSX0dQX1BJTig5LCAxNCksIFJDQVJfR1BfUElOKDksIDE1KSwKKwl9LAorfTsKK3N0YXRpYyBjb25zdCB1bmlvbiB2aW5fZGF0YSB2aW41X2RhdGFfbXV4ID0geworCS5kYXRhMTIgPSB7CisJCVZJNV9EMF9DMF9NQVJLLCBWSTVfRDFfQzFfTUFSSywKKwkJVkk1X0QyX0MyX01BUkssIFZJNV9EM19DM19NQVJLLAorCQlWSTVfRDRfQzRfTUFSSywgVkk1X0Q1X0M1X01BUkssCisJCVZJNV9ENl9DNl9NQVJLLCBWSTVfRDdfQzdfTUFSSywKKwkJVkk1X0Q4X1kwX01BUkssIFZJNV9EOV9ZMV9NQVJLLAorCQlWSTVfRDEwX1kyX01BUkssIFZJNV9EMTFfWTNfTUFSSywKKwl9LAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluNV9zeW5jX3BpbnNbXSA9IHsKKwkvKiBIU1lOQyMsIFZTWU5DIyAqLworCVJDQVJfR1BfUElOKDksIDIpLCBSQ0FSX0dQX1BJTig5LCAzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjVfc3luY19tdXhbXSA9IHsKKwlWSTVfSFNZTkNfTl9NQVJLLCBWSTVfVlNZTkNfTl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluNV9maWVsZF9waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oOSwgMTYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluNV9maWVsZF9tdXhbXSA9IHsKKwlWSTVfRklFTERfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjVfY2xrZW5iX3BpbnNbXSA9IHsKKwlSQ0FSX0dQX1BJTig5LCAxKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjVfY2xrZW5iX211eFtdID0geworCVZJNV9DTEtFTkJfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjVfY2xrX3BpbnNbXSA9IHsKKwlSQ0FSX0dQX1BJTig5LCAwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjVfY2xrX211eFtdID0geworCVZJNV9DTEtfTUFSSywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfcGZjX3Bpbl9ncm91cCBwaW5tdXhfZ3JvdXBzW10gPSB7CisJU0hfUEZDX1BJTl9HUk9VUChhdmJfbGluayksCisJU0hfUEZDX1BJTl9HUk9VUChhdmJfbWFnaWMpLAorCVNIX1BGQ19QSU5fR1JPVVAoYXZiX3BoeV9pbnQpLAorCVNIX1BGQ19QSU5fR1JPVVAoYXZiX21kaW8pLAorCVNIX1BGQ19QSU5fR1JPVVAoYXZiX21paSksCisJU0hfUEZDX1BJTl9HUk9VUChhdmJfZ21paSksCisJU0hfUEZDX1BJTl9HUk9VUChhdmJfYXZ0cF9tYXRjaCksCisJU0hfUEZDX1BJTl9HUk9VUChjYW4wX2RhdGEpLAorCVNIX1BGQ19QSU5fR1JPVVAoY2FuMV9kYXRhKSwKKwlTSF9QRkNfUElOX0dST1VQKGNhbl9jbGspLAorCVNIX1BGQ19QSU5fR1JPVVAoZHUwX3JnYjY2NiksCisJU0hfUEZDX1BJTl9HUk9VUChkdTBfcmdiODg4KSwKKwlTSF9QRkNfUElOX0dST1VQKGR1MF9zeW5jKSwKKwlTSF9QRkNfUElOX0dST1VQKGR1MF9vZGRmKSwKKwlTSF9QRkNfUElOX0dST1VQKGR1MF9kaXNwKSwKKwlTSF9QRkNfUElOX0dST1VQKGR1MF9jZGUpLAorCVNIX1BGQ19QSU5fR1JPVVAoZHUxX3JnYjY2NiksCisJU0hfUEZDX1BJTl9HUk9VUChkdTFfc3luYyksCisJU0hfUEZDX1BJTl9HUk9VUChkdTFfb2RkZiksCisJU0hfUEZDX1BJTl9HUk9VUChkdTFfZGlzcCksCisJU0hfUEZDX1BJTl9HUk9VUChkdTFfY2RlKSwKKwlTSF9QRkNfUElOX0dST1VQKGludGNfaXJxMCksCisJU0hfUEZDX1BJTl9HUk9VUChpbnRjX2lycTEpLAorCVNIX1BGQ19QSU5fR1JPVVAoaW50Y19pcnEyKSwKKwlTSF9QRkNfUElOX0dST1VQKGludGNfaXJxMyksCisJU0hfUEZDX1BJTl9HUk9VUChsYnNjX2NzMCksCisJU0hfUEZDX1BJTl9HUk9VUChsYnNjX2NzMSksCisJU0hfUEZDX1BJTl9HUk9VUChsYnNjX2V4X2NzMCksCisJU0hfUEZDX1BJTl9HUk9VUChsYnNjX2V4X2NzMSksCisJU0hfUEZDX1BJTl9HUk9VUChsYnNjX2V4X2NzMiksCisJU0hfUEZDX1BJTl9HUk9VUChsYnNjX2V4X2NzMyksCisJU0hfUEZDX1BJTl9HUk9VUChsYnNjX2V4X2NzNCksCisJU0hfUEZDX1BJTl9HUk9VUChsYnNjX2V4X2NzNSksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfY2xrKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9zeW5jKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9yeCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfdHgpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX2NsayksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3luYyksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfcngpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3R4KSwKKwlTSF9QRkNfUElOX0dST1VQKHFzcGlfY3RybCksCisJU0hfUEZDX1BJTl9HUk9VUChxc3BpX2RhdGEyKSwKKwlTSF9QRkNfUElOX0dST1VQKHFzcGlfZGF0YTQpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjBfZGF0YSksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmMF9jbGspLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjBfY3RybCksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmM19kYXRhKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWYzX2NsayksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMF9kYXRhMSksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMF9kYXRhNCksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMF9jdHJsKSwKKwlTSF9QRkNfUElOX0dST1VQKHNkaGkwX2NkKSwKKwlTSF9QRkNfUElOX0dST1VQKHNkaGkwX3dwKSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluMF9kYXRhLCAyNCksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjBfZGF0YSwgMjApLAorCVNIX1BGQ19QSU5fR1JPVVAodmluMF9kYXRhMTgpLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW4wX2RhdGEsIDE2KSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluMF9kYXRhLCAxMiksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjBfZGF0YSwgMTApLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW4wX2RhdGEsIDgpLAorCVNIX1BGQ19QSU5fR1JPVVAodmluMF9zeW5jKSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjBfZmllbGQpLAorCVNIX1BGQ19QSU5fR1JPVVAodmluMF9jbGtlbmIpLAorCVNIX1BGQ19QSU5fR1JPVVAodmluMF9jbGspLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW4xX2RhdGEsIDI0KSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluMV9kYXRhLCAyMCksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW4xX2RhdGExOCksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjFfZGF0YSwgMTYpLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW4xX2RhdGEsIDEyKSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluMV9kYXRhLCAxMCksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjFfZGF0YSwgOCksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjFfZGF0YV9iLCAyNCksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjFfZGF0YV9iLCAyMCksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW4xX2RhdGExOF9iKSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluMV9kYXRhX2IsIDE2KSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjFfc3luYyksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW4xX2ZpZWxkKSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjFfY2xrZW5iKSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjFfY2xrKSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluMl9kYXRhLCAxNiksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjJfZGF0YSwgMTIpLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW4yX2RhdGEsIDEwKSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluMl9kYXRhLCA4KSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjJfc3luYyksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW4yX2ZpZWxkKSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjJfY2xrZW5iKSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjJfY2xrKSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluM19kYXRhLCAxNiksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjNfZGF0YSwgMTIpLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW4zX2RhdGEsIDEwKSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluM19kYXRhLCA4KSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjNfc3luYyksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW4zX2ZpZWxkKSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjNfY2xrZW5iKSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjNfY2xrKSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluNF9kYXRhLCAxMiksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjRfZGF0YSwgMTApLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW40X2RhdGEsIDgpLAorCVNIX1BGQ19QSU5fR1JPVVAodmluNF9zeW5jKSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjRfZmllbGQpLAorCVNIX1BGQ19QSU5fR1JPVVAodmluNF9jbGtlbmIpLAorCVNIX1BGQ19QSU5fR1JPVVAodmluNF9jbGspLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW41X2RhdGEsIDEyKSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluNV9kYXRhLCAxMCksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjVfZGF0YSwgOCksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW41X3N5bmMpLAorCVNIX1BGQ19QSU5fR1JPVVAodmluNV9maWVsZCksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW41X2Nsa2VuYiksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW41X2NsayksCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF2Yl9ncm91cHNbXSA9IHsKKwkiYXZiX2xpbmsiLAorCSJhdmJfbWFnaWMiLAorCSJhdmJfcGh5X2ludCIsCisJImF2Yl9tZGlvIiwKKwkiYXZiX21paSIsCisJImF2Yl9nbWlpIiwKKwkiYXZiX2F2dHBfbWF0Y2giLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjYW4wX2dyb3Vwc1tdID0geworCSJjYW4wX2RhdGEiLAorCSJjYW5fY2xrIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2FuMV9ncm91cHNbXSA9IHsKKwkiY2FuMV9kYXRhIiwKKwkiY2FuX2NsayIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGR1MF9ncm91cHNbXSA9IHsKKwkiZHUwX3JnYjY2NiIsCisJImR1MF9yZ2I4ODgiLAorCSJkdTBfc3luYyIsCisJImR1MF9vZGRmIiwKKwkiZHUwX2Rpc3AiLAorCSJkdTBfY2RlIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZHUxX2dyb3Vwc1tdID0geworCSJkdTFfcmdiNjY2IiwKKwkiZHUxX3N5bmMiLAorCSJkdTFfb2RkZiIsCisJImR1MV9kaXNwIiwKKwkiZHUxX2NkZSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGludGNfZ3JvdXBzW10gPSB7CisJImludGNfaXJxMCIsCisJImludGNfaXJxMSIsCisJImludGNfaXJxMiIsCisJImludGNfaXJxMyIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxic2NfZ3JvdXBzW10gPSB7CisJImxic2NfY3MwIiwKKwkibGJzY19jczEiLAorCSJsYnNjX2V4X2NzMCIsCisJImxic2NfZXhfY3MxIiwKKwkibGJzY19leF9jczIiLAorCSJsYnNjX2V4X2NzMyIsCisJImxic2NfZXhfY3M0IiwKKwkibGJzY19leF9jczUiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc2lvZjBfZ3JvdXBzW10gPSB7CisJIm1zaW9mMF9jbGsiLAorCSJtc2lvZjBfc3luYyIsCisJIm1zaW9mMF9yeCIsCisJIm1zaW9mMF90eCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1zaW9mMV9ncm91cHNbXSA9IHsKKwkibXNpb2YxX2NsayIsCisJIm1zaW9mMV9zeW5jIiwKKwkibXNpb2YxX3J4IiwKKwkibXNpb2YxX3R4IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcXNwaV9ncm91cHNbXSA9IHsKKwkicXNwaV9jdHJsIiwKKwkicXNwaV9kYXRhMiIsCisJInFzcGlfZGF0YTQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzY2lmMF9ncm91cHNbXSA9IHsKKwkic2NpZjBfZGF0YSIsCisJInNjaWYwX2NsayIsCisJInNjaWYwX2N0cmwiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzY2lmM19ncm91cHNbXSA9IHsKKwkic2NpZjNfZGF0YSIsCisJInNjaWYzX2NsayIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkaGkwX2dyb3Vwc1tdID0geworCSJzZGhpMF9kYXRhMSIsCisJInNkaGkwX2RhdGE0IiwKKwkic2RoaTBfY3RybCIsCisJInNkaGkwX2NkIiwKKwkic2RoaTBfd3AiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aW4wX2dyb3Vwc1tdID0geworCSJ2aW4wX2RhdGEyNCIsCisJInZpbjBfZGF0YTIwIiwKKwkidmluMF9kYXRhMTgiLAorCSJ2aW4wX2RhdGExNiIsCisJInZpbjBfZGF0YTEyIiwKKwkidmluMF9kYXRhMTAiLAorCSJ2aW4wX2RhdGE4IiwKKwkidmluMF9zeW5jIiwKKwkidmluMF9maWVsZCIsCisJInZpbjBfY2xrZW5iIiwKKwkidmluMF9jbGsiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aW4xX2dyb3Vwc1tdID0geworCSJ2aW4xX2RhdGEyNCIsCisJInZpbjFfZGF0YTIwIiwKKwkidmluMV9kYXRhMTgiLAorCSJ2aW4xX2RhdGExNiIsCisJInZpbjFfZGF0YTEyIiwKKwkidmluMV9kYXRhMTAiLAorCSJ2aW4xX2RhdGE4IiwKKwkidmluMV9kYXRhMjRfYiIsCisJInZpbjFfZGF0YTIwX2IiLAorCSJ2aW4xX2RhdGExNl9iIiwKKwkidmluMV9zeW5jIiwKKwkidmluMV9maWVsZCIsCisJInZpbjFfY2xrZW5iIiwKKwkidmluMV9jbGsiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aW4yX2dyb3Vwc1tdID0geworCSJ2aW4yX2RhdGExNiIsCisJInZpbjJfZGF0YTEyIiwKKwkidmluMl9kYXRhMTAiLAorCSJ2aW4yX2RhdGE4IiwKKwkidmluMl9zeW5jIiwKKwkidmluMl9maWVsZCIsCisJInZpbjJfY2xrZW5iIiwKKwkidmluMl9jbGsiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aW4zX2dyb3Vwc1tdID0geworCSJ2aW4zX2RhdGExNiIsCisJInZpbjNfZGF0YTEyIiwKKwkidmluM19kYXRhMTAiLAorCSJ2aW4zX2RhdGE4IiwKKwkidmluM19zeW5jIiwKKwkidmluM19maWVsZCIsCisJInZpbjNfY2xrZW5iIiwKKwkidmluM19jbGsiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aW40X2dyb3Vwc1tdID0geworCSJ2aW40X2RhdGExMiIsCisJInZpbjRfZGF0YTEwIiwKKwkidmluNF9kYXRhOCIsCisJInZpbjRfc3luYyIsCisJInZpbjRfZmllbGQiLAorCSJ2aW40X2Nsa2VuYiIsCisJInZpbjRfY2xrIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmluNV9ncm91cHNbXSA9IHsKKwkidmluNV9kYXRhMTIiLAorCSJ2aW41X2RhdGExMCIsCisJInZpbjVfZGF0YTgiLAorCSJ2aW41X3N5bmMiLAorCSJ2aW41X2ZpZWxkIiwKKwkidmluNV9jbGtlbmIiLAorCSJ2aW41X2NsayIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX3BmY19mdW5jdGlvbiBwaW5tdXhfZnVuY3Rpb25zW10gPSB7CisJU0hfUEZDX0ZVTkNUSU9OKGF2YiksCisJU0hfUEZDX0ZVTkNUSU9OKGNhbjApLAorCVNIX1BGQ19GVU5DVElPTihjYW4xKSwKKwlTSF9QRkNfRlVOQ1RJT04oZHUwKSwKKwlTSF9QRkNfRlVOQ1RJT04oZHUxKSwKKwlTSF9QRkNfRlVOQ1RJT04oaW50YyksCisJU0hfUEZDX0ZVTkNUSU9OKGxic2MpLAorCVNIX1BGQ19GVU5DVElPTihtc2lvZjApLAorCVNIX1BGQ19GVU5DVElPTihtc2lvZjEpLAorCVNIX1BGQ19GVU5DVElPTihxc3BpKSwKKwlTSF9QRkNfRlVOQ1RJT04oc2NpZjApLAorCVNIX1BGQ19GVU5DVElPTihzY2lmMyksCisJU0hfUEZDX0ZVTkNUSU9OKHNkaGkwKSwKKwlTSF9QRkNfRlVOQ1RJT04odmluMCksCisJU0hfUEZDX0ZVTkNUSU9OKHZpbjEpLAorCVNIX1BGQ19GVU5DVElPTih2aW4yKSwKKwlTSF9QRkNfRlVOQ1RJT04odmluMyksCisJU0hfUEZDX0ZVTkNUSU9OKHZpbjQpLAorCVNIX1BGQ19GVU5DVElPTih2aW41KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGlubXV4X2NmZ19yZWcgcGlubXV4X2NvbmZpZ19yZWdzW10gPSB7CisJeyBQSU5NVVhfQ0ZHX1JFRygiR1BTUjAiLCAweEU2MDYwMDA0LCAzMiwgMSkgeworCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQlHUF8wXzI4X0ZOLCBGTl9JUDFfNCwKKwkJR1BfMF8yN19GTiwgRk5fSVAxXzMsCisJCUdQXzBfMjZfRk4sIEZOX0lQMV8yLAorCQlHUF8wXzI1X0ZOLCBGTl9JUDFfMSwKKwkJR1BfMF8yNF9GTiwgRk5fSVAxXzAsCisJCUdQXzBfMjNfRk4sIEZOX0lQMF8yMywKKwkJR1BfMF8yMl9GTiwgRk5fSVAwXzIyLAorCQlHUF8wXzIxX0ZOLCBGTl9JUDBfMjEsCisJCUdQXzBfMjBfRk4sIEZOX0lQMF8yMCwKKwkJR1BfMF8xOV9GTiwgRk5fSVAwXzE5LAorCQlHUF8wXzE4X0ZOLCBGTl9JUDBfMTgsCisJCUdQXzBfMTdfRk4sIEZOX0lQMF8xNywKKwkJR1BfMF8xNl9GTiwgRk5fSVAwXzE2LAorCQlHUF8wXzE1X0ZOLCBGTl9JUDBfMTUsCisJCUdQXzBfMTRfRk4sIEZOX0lQMF8xNCwKKwkJR1BfMF8xM19GTiwgRk5fSVAwXzEzLAorCQlHUF8wXzEyX0ZOLCBGTl9JUDBfMTIsCisJCUdQXzBfMTFfRk4sIEZOX0lQMF8xMSwKKwkJR1BfMF8xMF9GTiwgRk5fSVAwXzEwLAorCQlHUF8wXzlfRk4sIEZOX0lQMF85LAorCQlHUF8wXzhfRk4sIEZOX0lQMF84LAorCQlHUF8wXzdfRk4sIEZOX0lQMF83LAorCQlHUF8wXzZfRk4sIEZOX0lQMF82LAorCQlHUF8wXzVfRk4sIEZOX0lQMF81LAorCQlHUF8wXzRfRk4sIEZOX0lQMF80LAorCQlHUF8wXzNfRk4sIEZOX0lQMF8zLAorCQlHUF8wXzJfRk4sIEZOX0lQMF8yLAorCQlHUF8wXzFfRk4sIEZOX0lQMF8xLAorCQlHUF8wXzBfRk4sIEZOX0lQMF8wIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIkdQU1IxIiwgMHhFNjA2MDAwOCwgMzIsIDEpIHsKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJR1BfMV8yMl9GTiwgRk5fRFUxX0NERSwKKwkJR1BfMV8yMV9GTiwgRk5fRFUxX0RJU1AsCisJCUdQXzFfMjBfRk4sIEZOX0RVMV9FWE9EREZfRFUxX09EREZfRElTUF9DREUsCisJCUdQXzFfMTlfRk4sIEZOX0RVMV9FWFZTWU5DX0RVMV9WU1lOQywKKwkJR1BfMV8xOF9GTiwgRk5fRFUxX0VYSFNZTkNfRFUxX0hTWU5DLAorCQlHUF8xXzE3X0ZOLCBGTl9EVTFfREI3X0M1LAorCQlHUF8xXzE2X0ZOLCBGTl9EVTFfREI2X0M0LAorCQlHUF8xXzE1X0ZOLCBGTl9EVTFfREI1X0MzX0RBVEExNSwKKwkJR1BfMV8xNF9GTiwgRk5fRFUxX0RCNF9DMl9EQVRBMTQsCisJCUdQXzFfMTNfRk4sIEZOX0RVMV9EQjNfQzFfREFUQTEzLAorCQlHUF8xXzEyX0ZOLCBGTl9EVTFfREIyX0MwX0RBVEExMiwKKwkJR1BfMV8xMV9GTiwgRk5fSVAxXzE2LAorCQlHUF8xXzEwX0ZOLCBGTl9JUDFfMTUsCisJCUdQXzFfOV9GTiwgRk5fSVAxXzE0LAorCQlHUF8xXzhfRk4sIEZOX0lQMV8xMywKKwkJR1BfMV83X0ZOLCBGTl9JUDFfMTIsCisJCUdQXzFfNl9GTiwgRk5fSVAxXzExLAorCQlHUF8xXzVfRk4sIEZOX0lQMV8xMCwKKwkJR1BfMV80X0ZOLCBGTl9JUDFfOSwKKwkJR1BfMV8zX0ZOLCBGTl9JUDFfOCwKKwkJR1BfMV8yX0ZOLCBGTl9JUDFfNywKKwkJR1BfMV8xX0ZOLCBGTl9JUDFfNiwKKwkJR1BfMV8wX0ZOLCBGTl9JUDFfNSwgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiR1BTUjIiLCAweEU2MDYwMDBDLCAzMiwgMSkgeworCQlHUF8yXzMxX0ZOLCBGTl9BMTUsCisJCUdQXzJfMzBfRk4sIEZOX0ExNCwKKwkJR1BfMl8yOV9GTiwgRk5fQTEzLAorCQlHUF8yXzI4X0ZOLCBGTl9BMTIsCisJCUdQXzJfMjdfRk4sIEZOX0ExMSwKKwkJR1BfMl8yNl9GTiwgRk5fQTEwLAorCQlHUF8yXzI1X0ZOLCBGTl9BOSwKKwkJR1BfMl8yNF9GTiwgRk5fQTgsCisJCUdQXzJfMjNfRk4sIEZOX0E3LAorCQlHUF8yXzIyX0ZOLCBGTl9BNiwKKwkJR1BfMl8yMV9GTiwgRk5fQTUsCisJCUdQXzJfMjBfRk4sIEZOX0E0LAorCQlHUF8yXzE5X0ZOLCBGTl9BMywKKwkJR1BfMl8xOF9GTiwgRk5fQTIsCisJCUdQXzJfMTdfRk4sIEZOX0ExLAorCQlHUF8yXzE2X0ZOLCBGTl9BMCwKKwkJR1BfMl8xNV9GTiwgRk5fRDE1LAorCQlHUF8yXzE0X0ZOLCBGTl9EMTQsCisJCUdQXzJfMTNfRk4sIEZOX0QxMywKKwkJR1BfMl8xMl9GTiwgRk5fRDEyLAorCQlHUF8yXzExX0ZOLCBGTl9EMTEsCisJCUdQXzJfMTBfRk4sIEZOX0QxMCwKKwkJR1BfMl85X0ZOLCBGTl9EOSwKKwkJR1BfMl84X0ZOLCBGTl9EOCwKKwkJR1BfMl83X0ZOLCBGTl9ENywKKwkJR1BfMl82X0ZOLCBGTl9ENiwKKwkJR1BfMl81X0ZOLCBGTl9ENSwKKwkJR1BfMl80X0ZOLCBGTl9ENCwKKwkJR1BfMl8zX0ZOLCBGTl9EMywKKwkJR1BfMl8yX0ZOLCBGTl9EMiwKKwkJR1BfMl8xX0ZOLCBGTl9EMSwKKwkJR1BfMl8wX0ZOLCBGTl9EMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJHUFNSMyIsIDB4RTYwNjAwMTAsIDMyLCAxKSB7CisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCUdQXzNfMjdfRk4sIEZOX0NTMF9OLAorCQlHUF8zXzI2X0ZOLCBGTl9JUDFfMjIsCisJCUdQXzNfMjVfRk4sIEZOX0lQMV8yMSwKKwkJR1BfM18yNF9GTiwgRk5fSVAxXzIwLAorCQlHUF8zXzIzX0ZOLCBGTl9JUDFfMTksCisJCUdQXzNfMjJfRk4sIEZOX0lSUTMsCisJCUdQXzNfMjFfRk4sIEZOX0lSUTIsCisJCUdQXzNfMjBfRk4sIEZOX0lSUTEsCisJCUdQXzNfMTlfRk4sIEZOX0lSUTAsCisJCUdQXzNfMThfRk4sIEZOX0VYX1dBSVQwLAorCQlHUF8zXzE3X0ZOLCBGTl9XRTFfTiwKKwkJR1BfM18xNl9GTiwgRk5fV0UwX04sCisJCUdQXzNfMTVfRk4sIEZOX1JEX1dSX04sCisJCUdQXzNfMTRfRk4sIEZOX1JEX04sCisJCUdQXzNfMTNfRk4sIEZOX0JTX04sCisJCUdQXzNfMTJfRk4sIEZOX0VYX0NTNV9OLAorCQlHUF8zXzExX0ZOLCBGTl9FWF9DUzRfTiwKKwkJR1BfM18xMF9GTiwgRk5fRVhfQ1MzX04sCisJCUdQXzNfOV9GTiwgRk5fRVhfQ1MyX04sCisJCUdQXzNfOF9GTiwgRk5fRVhfQ1MxX04sCisJCUdQXzNfN19GTiwgRk5fRVhfQ1MwX04sCisJCUdQXzNfNl9GTiwgRk5fQ1MxX05fQTI2LAorCQlHUF8zXzVfRk4sIEZOX0lQMV8xOCwKKwkJR1BfM180X0ZOLCBGTl9JUDFfMTcsCisJCUdQXzNfM19GTiwgRk5fQTE5LAorCQlHUF8zXzJfRk4sIEZOX0ExOCwKKwkJR1BfM18xX0ZOLCBGTl9BMTcsCisJCUdQXzNfMF9GTiwgRk5fQTE2IH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIkdQU1I0IiwgMHhFNjA2MDAxNCwgMzIsIDEpIHsKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJR1BfNF8xNl9GTiwgRk5fVkkwX0ZJRUxELAorCQlHUF80XzE1X0ZOLCBGTl9WSTBfRDExX0czX1kzLAorCQlHUF80XzE0X0ZOLCBGTl9WSTBfRDEwX0cyX1kyLAorCQlHUF80XzEzX0ZOLCBGTl9WSTBfRDlfRzFfWTEsCisJCUdQXzRfMTJfRk4sIEZOX1ZJMF9EOF9HMF9ZMCwKKwkJR1BfNF8xMV9GTiwgRk5fVkkwX0Q3X0I3X0M3LAorCQlHUF80XzEwX0ZOLCBGTl9WSTBfRDZfQjZfQzYsCisJCUdQXzRfOV9GTiwgRk5fVkkwX0Q1X0I1X0M1LAorCQlHUF80XzhfRk4sIEZOX1ZJMF9ENF9CNF9DNCwKKwkJR1BfNF83X0ZOLCBGTl9WSTBfRDNfQjNfQzMsCisJCUdQXzRfNl9GTiwgRk5fVkkwX0QyX0IyX0MyLAorCQlHUF80XzVfRk4sIEZOX1ZJMF9EMV9CMV9DMSwKKwkJR1BfNF80X0ZOLCBGTl9WSTBfRDBfQjBfQzAsCisJCUdQXzRfM19GTiwgRk5fVkkwX1ZTWU5DX04sCisJCUdQXzRfMl9GTiwgRk5fVkkwX0hTWU5DX04sCisJCUdQXzRfMV9GTiwgRk5fVkkwX0NMS0VOQiwKKwkJR1BfNF8wX0ZOLCBGTl9WSTBfQ0xLIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIkdQU1I1IiwgMHhFNjA2MDAxOCwgMzIsIDEpIHsKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJR1BfNV8xNl9GTiwgRk5fVkkxX0ZJRUxELAorCQlHUF81XzE1X0ZOLCBGTl9WSTFfRDExX0czX1kzLAorCQlHUF81XzE0X0ZOLCBGTl9WSTFfRDEwX0cyX1kyLAorCQlHUF81XzEzX0ZOLCBGTl9WSTFfRDlfRzFfWTEsCisJCUdQXzVfMTJfRk4sIEZOX1ZJMV9EOF9HMF9ZMCwKKwkJR1BfNV8xMV9GTiwgRk5fVkkxX0Q3X0I3X0M3LAorCQlHUF81XzEwX0ZOLCBGTl9WSTFfRDZfQjZfQzYsCisJCUdQXzVfOV9GTiwgRk5fVkkxX0Q1X0I1X0M1LAorCQlHUF81XzhfRk4sIEZOX1ZJMV9ENF9CNF9DNCwKKwkJR1BfNV83X0ZOLCBGTl9WSTFfRDNfQjNfQzMsCisJCUdQXzVfNl9GTiwgRk5fVkkxX0QyX0IyX0MyLAorCQlHUF81XzVfRk4sIEZOX1ZJMV9EMV9CMV9DMSwKKwkJR1BfNV80X0ZOLCBGTl9WSTFfRDBfQjBfQzAsCisJCUdQXzVfM19GTiwgRk5fVkkxX1ZTWU5DX04sCisJCUdQXzVfMl9GTiwgRk5fVkkxX0hTWU5DX04sCisJCUdQXzVfMV9GTiwgRk5fVkkxX0NMS0VOQiwKKwkJR1BfNV8wX0ZOLCBGTl9WSTFfQ0xLIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIkdQU1I2IiwgMHhFNjA2MDAxQywgMzIsIDEpIHsKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJR1BfNl8xNl9GTiwgRk5fSVAyXzE2LAorCQlHUF82XzE1X0ZOLCBGTl9JUDJfMTUsCisJCUdQXzZfMTRfRk4sIEZOX0lQMl8xNCwKKwkJR1BfNl8xM19GTiwgRk5fSVAyXzEzLAorCQlHUF82XzEyX0ZOLCBGTl9JUDJfMTIsCisJCUdQXzZfMTFfRk4sIEZOX0lQMl8xMSwKKwkJR1BfNl8xMF9GTiwgRk5fSVAyXzEwLAorCQlHUF82XzlfRk4sIEZOX0lQMl85LAorCQlHUF82XzhfRk4sIEZOX0lQMl84LAorCQlHUF82XzdfRk4sIEZOX0lQMl83LAorCQlHUF82XzZfRk4sIEZOX0lQMl82LAorCQlHUF82XzVfRk4sIEZOX0lQMl81LAorCQlHUF82XzRfRk4sIEZOX0lQMl80LAorCQlHUF82XzNfRk4sIEZOX0lQMl8zLAorCQlHUF82XzJfRk4sIEZOX0lQMl8yLAorCQlHUF82XzFfRk4sIEZOX0lQMl8xLAorCQlHUF82XzBfRk4sIEZOX0lQMl8wIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIkdQU1I3IiwgMHhFNjA2MDAyMCwgMzIsIDEpIHsKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJR1BfN18xNl9GTiwgRk5fVkkzX0ZJRUxELAorCQlHUF83XzE1X0ZOLCBGTl9JUDNfMTQsCisJCUdQXzdfMTRfRk4sIEZOX1ZJM19EMTBfWTIsCisJCUdQXzdfMTNfRk4sIEZOX0lQM18xMywKKwkJR1BfN18xMl9GTiwgRk5fSVAzXzEyLAorCQlHUF83XzExX0ZOLCBGTl9JUDNfMTEsCisJCUdQXzdfMTBfRk4sIEZOX0lQM18xMCwKKwkJR1BfN185X0ZOLCBGTl9JUDNfOSwKKwkJR1BfN184X0ZOLCBGTl9JUDNfOCwKKwkJR1BfN183X0ZOLCBGTl9JUDNfNywKKwkJR1BfN182X0ZOLCBGTl9JUDNfNiwKKwkJR1BfN181X0ZOLCBGTl9JUDNfNSwKKwkJR1BfN180X0ZOLCBGTl9JUDNfNCwKKwkJR1BfN18zX0ZOLCBGTl9JUDNfMywKKwkJR1BfN18yX0ZOLCBGTl9JUDNfMiwKKwkJR1BfN18xX0ZOLCBGTl9JUDNfMSwKKwkJR1BfN18wX0ZOLCBGTl9JUDNfMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJHUFNSOCIsIDB4RTYwNjAwMjQsIDMyLCAxKSB7CisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCUdQXzhfMTZfRk4sIEZOX0lQNF8yNCwKKwkJR1BfOF8xNV9GTiwgRk5fSVA0XzIzLAorCQlHUF84XzE0X0ZOLCBGTl9JUDRfMjIsCisJCUdQXzhfMTNfRk4sIEZOX0lQNF8yMSwKKwkJR1BfOF8xMl9GTiwgRk5fSVA0XzIwXzE5LAorCQlHUF84XzExX0ZOLCBGTl9JUDRfMThfMTcsCisJCUdQXzhfMTBfRk4sIEZOX0lQNF8xNl8xNSwKKwkJR1BfOF85X0ZOLCBGTl9JUDRfMTRfMTMsCisJCUdQXzhfOF9GTiwgRk5fSVA0XzEyXzExLAorCQlHUF84XzdfRk4sIEZOX0lQNF8xMF85LAorCQlHUF84XzZfRk4sIEZOX0lQNF84XzcsCisJCUdQXzhfNV9GTiwgRk5fSVA0XzZfNSwKKwkJR1BfOF80X0ZOLCBGTl9JUDRfNCwKKwkJR1BfOF8zX0ZOLCBGTl9JUDRfM18yLAorCQlHUF84XzJfRk4sIEZOX0lQNF8xLAorCQlHUF84XzFfRk4sIEZOX0lQNF8wLAorCQlHUF84XzBfRk4sIEZOX1ZJNF9DTEsgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiR1BTUjkiLCAweEU2MDYwMDI4LCAzMiwgMSkgeworCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQlHUF85XzE2X0ZOLCBGTl9WSTVfRklFTEQsCisJCUdQXzlfMTVfRk4sIEZOX1ZJNV9EMTFfWTMsCisJCUdQXzlfMTRfRk4sIEZOX1ZJNV9EMTBfWTIsCisJCUdQXzlfMTNfRk4sIEZOX1ZJNV9EOV9ZMSwKKwkJR1BfOV8xMl9GTiwgRk5fSVA1XzExLAorCQlHUF85XzExX0ZOLCBGTl9JUDVfMTAsCisJCUdQXzlfMTBfRk4sIEZOX0lQNV85LAorCQlHUF85XzlfRk4sIEZOX0lQNV84LAorCQlHUF85XzhfRk4sIEZOX0lQNV83LAorCQlHUF85XzdfRk4sIEZOX0lQNV82LAorCQlHUF85XzZfRk4sIEZOX0lQNV81LAorCQlHUF85XzVfRk4sIEZOX0lQNV80LAorCQlHUF85XzRfRk4sIEZOX0lQNV8zLAorCQlHUF85XzNfRk4sIEZOX0lQNV8yLAorCQlHUF85XzJfRk4sIEZOX0lQNV8xLAorCQlHUF85XzFfRk4sIEZOX0lQNV8wLAorCQlHUF85XzBfRk4sIEZOX1ZJNV9DTEsgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiR1BTUjEwIiwgMHhFNjA2MDAyQywgMzIsIDEpIHsKKwkJR1BfMTBfMzFfRk4sIEZOX0NBTjFfUlgsCisJCUdQXzEwXzMwX0ZOLCBGTl9DQU4xX1RYLAorCQlHUF8xMF8yOV9GTiwgRk5fQ0FOX0NMSywKKwkJR1BfMTBfMjhfRk4sIEZOX0NBTjBfUlgsCisJCUdQXzEwXzI3X0ZOLCBGTl9DQU4wX1RYLAorCQlHUF8xMF8yNl9GTiwgRk5fU0NJRl9DTEssCisJCUdQXzEwXzI1X0ZOLCBGTl9JUDZfMThfMTcsCisJCUdQXzEwXzI0X0ZOLCBGTl9JUDZfMTYsCisJCUdQXzEwXzIzX0ZOLCBGTl9JUDZfMTVfMTQsCisJCUdQXzEwXzIyX0ZOLCBGTl9JUDZfMTNfMTIsCisJCUdQXzEwXzIxX0ZOLCBGTl9JUDZfMTFfMTAsCisJCUdQXzEwXzIwX0ZOLCBGTl9JUDZfOV84LAorCQlHUF8xMF8xOV9GTiwgRk5fUlgxLAorCQlHUF8xMF8xOF9GTiwgRk5fVFgxLAorCQlHUF8xMF8xN19GTiwgRk5fUlRTMV9OLAorCQlHUF8xMF8xNl9GTiwgRk5fQ1RTMV9OLAorCQlHUF8xMF8xNV9GTiwgRk5fU0NLMSwKKwkJR1BfMTBfMTRfRk4sIEZOX1JYMCwKKwkJR1BfMTBfMTNfRk4sIEZOX1RYMCwKKwkJR1BfMTBfMTJfRk4sIEZOX1JUUzBfTiwKKwkJR1BfMTBfMTFfRk4sIEZOX0NUUzBfTiwKKwkJR1BfMTBfMTBfRk4sIEZOX1NDSzAsCisJCUdQXzEwXzlfRk4sIEZOX0lQNl83LAorCQlHUF8xMF84X0ZOLCBGTl9JUDZfNiwKKwkJR1BfMTBfN19GTiwgRk5fSENUUzFfTiwKKwkJR1BfMTBfNl9GTiwgRk5fSVA2XzUsCisJCUdQXzEwXzVfRk4sIEZOX0lQNl80LAorCQlHUF8xMF80X0ZOLCBGTl9JUDZfMywKKwkJR1BfMTBfM19GTiwgRk5fSVA2XzIsCisJCUdQXzEwXzJfRk4sIEZOX0hSVFMwX04sCisJCUdQXzEwXzFfRk4sIEZOX0lQNl8xLAorCQlHUF8xMF8wX0ZOLCBGTl9JUDZfMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJHUFNSMTEiLCAweEU2MDYwMDMwLCAzMiwgMSkgeworCQkwLCAwLAorCQkwLCAwLAorCQlHUF8xMV8yOV9GTiwgRk5fQVZTMiwKKwkJR1BfMTFfMjhfRk4sIEZOX0FWUzEsCisJCUdQXzExXzI3X0ZOLCBGTl9BRElDSFMyLAorCQlHUF8xMV8yNl9GTiwgRk5fQURJQ0hTMSwKKwkJR1BfMTFfMjVfRk4sIEZOX0FESUNIUzAsCisJCUdQXzExXzI0X0ZOLCBGTl9BRElEQVRBLAorCQlHUF8xMV8yM19GTiwgRk5fQURJQ1NfU0FNUCwKKwkJR1BfMTFfMjJfRk4sIEZOX0FESUNMSywKKwkJR1BfMTFfMjFfRk4sIEZOX0lQN18yMCwKKwkJR1BfMTFfMjBfRk4sIEZOX0lQN18xOSwKKwkJR1BfMTFfMTlfRk4sIEZOX0lQN18xOCwKKwkJR1BfMTFfMThfRk4sIEZOX0lQN18xNywKKwkJR1BfMTFfMTdfRk4sIEZOX0lQN18xNiwKKwkJR1BfMTFfMTZfRk4sIEZOX0lQN18xNV8xNCwKKwkJR1BfMTFfMTVfRk4sIEZOX0lQN18xM18xMiwKKwkJR1BfMTFfMTRfRk4sIEZOX0lQN18xMV8xMCwKKwkJR1BfMTFfMTNfRk4sIEZOX0lQN185XzgsCisJCUdQXzExXzEyX0ZOLCBGTl9TRDBfV1AsCisJCUdQXzExXzExX0ZOLCBGTl9TRDBfQ0QsCisJCUdQXzExXzEwX0ZOLCBGTl9TRDBfREFUMywKKwkJR1BfMTFfOV9GTiwgRk5fU0QwX0RBVDIsCisJCUdQXzExXzhfRk4sIEZOX1NEMF9EQVQxLAorCQlHUF8xMV83X0ZOLCBGTl9TRDBfREFUMCwKKwkJR1BfMTFfNl9GTiwgRk5fU0QwX0NNRCwKKwkJR1BfMTFfNV9GTiwgRk5fU0QwX0NMSywKKwkJR1BfMTFfNF9GTiwgRk5fSVA3XzcsCisJCUdQXzExXzNfRk4sIEZOX0lQN182LAorCQlHUF8xMV8yX0ZOLCBGTl9JUDdfNV80LAorCQlHUF8xMV8xX0ZOLCBGTl9JUDdfM18yLAorCQlHUF8xMV8wX0ZOLCBGTl9JUDdfMV8wIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUdfVkFSKCJJUFNSMCIsIDB4RTYwNjAwNDAsIDMyLAorCQkJICAgICA0LCA0LAorCQkJICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCQkJICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCQkJICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKSB7CisJCS8qIElQMF8zMV8yOCBbNF0gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVAwXzI3XzI0IFs0XSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDBfMjMgWzFdICovCisJCUZOX0RVMF9EQjdfQzUsIDAsCisJCS8qIElQMF8yMiBbMV0gKi8KKwkJRk5fRFUwX0RCNl9DNCwgMCwKKwkJLyogSVAwXzIxIFsxXSAqLworCQlGTl9EVTBfREI1X0MzLCAwLAorCQkvKiBJUDBfMjAgWzFdICovCisJCUZOX0RVMF9EQjRfQzIsIDAsCisJCS8qIElQMF8xOSBbMV0gKi8KKwkJRk5fRFUwX0RCM19DMSwgMCwKKwkJLyogSVAwXzE4IFsxXSAqLworCQlGTl9EVTBfREIyX0MwLCAwLAorCQkvKiBJUDBfMTcgWzFdICovCisJCUZOX0RVMF9EQjEsIDAsCisJCS8qIElQMF8xNiBbMV0gKi8KKwkJRk5fRFUwX0RCMCwgMCwKKwkJLyogSVAwXzE1IFsxXSAqLworCQlGTl9EVTBfREc3X1kzX0RBVEExNSwgMCwKKwkJLyogSVAwXzE0IFsxXSAqLworCQlGTl9EVTBfREc2X1kyX0RBVEExNCwgMCwKKwkJLyogSVAwXzEzIFsxXSAqLworCQlGTl9EVTBfREc1X1kxX0RBVEExMywgMCwKKwkJLyogSVAwXzEyIFsxXSAqLworCQlGTl9EVTBfREc0X1kwX0RBVEExMiwgMCwKKwkJLyogSVAwXzExIFsxXSAqLworCQlGTl9EVTBfREczX0M3X0RBVEExMSwgMCwKKwkJLyogSVAwXzEwIFsxXSAqLworCQlGTl9EVTBfREcyX0M2X0RBVEExMCwgMCwKKwkJLyogSVAwXzkgWzFdICovCisJCUZOX0RVMF9ERzFfREFUQTksIDAsCisJCS8qIElQMF84IFsxXSAqLworCQlGTl9EVTBfREcwX0RBVEE4LCAwLAorCQkvKiBJUDBfNyBbMV0gKi8KKwkJRk5fRFUwX0RSN19ZOV9EQVRBNywgMCwKKwkJLyogSVAwXzYgWzFdICovCisJCUZOX0RVMF9EUjZfWThfREFUQTYsIDAsCisJCS8qIElQMF81IFsxXSAqLworCQlGTl9EVTBfRFI1X1k3X0RBVEE1LCAwLAorCQkvKiBJUDBfNCBbMV0gKi8KKwkJRk5fRFUwX0RSNF9ZNl9EQVRBNCwgMCwKKwkJLyogSVAwXzMgWzFdICovCisJCUZOX0RVMF9EUjNfWTVfREFUQTMsIDAsCisJCS8qIElQMF8yIFsxXSAqLworCQlGTl9EVTBfRFIyX1k0X0RBVEEyLCAwLAorCQkvKiBJUDBfMSBbMV0gKi8KKwkJRk5fRFUwX0RSMV9EQVRBMSwgMCwKKwkJLyogSVAwXzAgWzFdICovCisJCUZOX0RVMF9EUjBfREFUQTAsIDAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFR19WQVIoIklQU1IxIiwgMHhFNjA2MDA0NCwgMzIsCisJCQkgICAgIDQsIDQsCisJCQkgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisJCQkgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisJCQkgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEpIHsKKwkJLyogSVAxXzMxXzI4IFs0XSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDFfMjdfMjQgWzRdICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQMV8yMyBbMV0gKi8KKwkJMCwgMCwKKwkJLyogSVAxXzIyIFsxXSAqLworCQlGTl9BMjUsIEZOX1NTTCwKKwkJLyogSVAxXzIxIFsxXSAqLworCQlGTl9BMjQsIEZOX1NQQ0xLLAorCQkvKiBJUDFfMjAgWzFdICovCisJCUZOX0EyMywgRk5fSU8zLAorCQkvKiBJUDFfMTkgWzFdICovCisJCUZOX0EyMiwgRk5fSU8yLAorCQkvKiBJUDFfMTggWzFdICovCisJCUZOX0EyMSwgRk5fTUlTT19JTzEsCisJCS8qIElQMV8xNyBbMV0gKi8KKwkJRk5fQTIwLCBGTl9NT1NJX0lPMCwKKwkJLyogSVAxXzE2IFsxXSAqLworCQlGTl9EVTFfREc3X1kzX0RBVEExMSwgMCwKKwkJLyogSVAxXzE1IFsxXSAqLworCQlGTl9EVTFfREc2X1kyX0RBVEExMCwgMCwKKwkJLyogSVAxXzE0IFsxXSAqLworCQlGTl9EVTFfREc1X1kxX0RBVEE5LCAwLAorCQkvKiBJUDFfMTMgWzFdICovCisJCUZOX0RVMV9ERzRfWTBfREFUQTgsIDAsCisJCS8qIElQMV8xMiBbMV0gKi8KKwkJRk5fRFUxX0RHM19DN19EQVRBNywgMCwKKwkJLyogSVAxXzExIFsxXSAqLworCQlGTl9EVTFfREcyX0M2X0RBVEE2LCAwLAorCQkvKiBJUDFfMTAgWzFdICovCisJCUZOX0RVMV9EUjdfREFUQTUsIDAsCisJCS8qIElQMV85IFsxXSAqLworCQlGTl9EVTFfRFI2X0RBVEE0LCAwLAorCQkvKiBJUDFfOCBbMV0gKi8KKwkJRk5fRFUxX0RSNV9ZN19EQVRBMywgMCwKKwkJLyogSVAxXzcgWzFdICovCisJCUZOX0RVMV9EUjRfWTZfREFUQTIsIDAsCisJCS8qIElQMV82IFsxXSAqLworCQlGTl9EVTFfRFIzX1k1X0RBVEExLCAwLAorCQkvKiBJUDFfNSBbMV0gKi8KKwkJRk5fRFUxX0RSMl9ZNF9EQVRBMCwgMCwKKwkJLyogSVAxXzQgWzFdICovCisJCUZOX0RVMF9DREUsIDAsCisJCS8qIElQMV8zIFsxXSAqLworCQlGTl9EVTBfRElTUCwgMCwKKwkJLyogSVAxXzIgWzFdICovCisJCUZOX0RVMF9FWE9EREZfRFUwX09EREZfRElTUF9DREUsIDAsCisJCS8qIElQMV8xIFsxXSAqLworCQlGTl9EVTBfRVhWU1lOQ19EVTBfVlNZTkMsIDAsCisJCS8qIElQMV8wIFsxXSAqLworCQlGTl9EVTBfRVhIU1lOQ19EVTBfSFNZTkMsIDAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFR19WQVIoIklQU1IyIiwgMHhFNjA2MDA0OCwgMzIsCisJCQkgICAgIDQsIDQsCisJCQkgICAgIDQsIDMsIDEsCisJCQkgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisJCQkgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEpIHsKKwkJLyogSVAyXzMxXzI4IFs0XSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDJfMjdfMjQgWzRdICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQMl8yM18yMCBbNF0gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVAyXzE5XzE3IFszXSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDJfMTYgWzFdICovCisJCUZOX1ZJMl9GSUVMRCwgRk5fQVZCX1RYRDIsCisJCS8qIElQMl8xNSBbMV0gKi8KKwkJRk5fVkkyX0QxMV9ZMywgRk5fQVZCX1RYRDEsCisJCS8qIElQMl8xNCBbMV0gKi8KKwkJRk5fVkkyX0QxMF9ZMiwgRk5fQVZCX1RYRDAsCisJCS8qIElQMl8xMyBbMV0gKi8KKwkJRk5fVkkyX0Q5X1kxLCBGTl9BVkJfVFhfRU4sCisJCS8qIElQMl8xMiBbMV0gKi8KKwkJRk5fVkkyX0Q4X1kwLCBGTl9BVkJfVFhEMywKKwkJLyogSVAyXzExIFsxXSAqLworCQlGTl9WSTJfRDdfQzcsIEZOX0FWQl9DT0wsCisJCS8qIElQMl8xMCBbMV0gKi8KKwkJRk5fVkkyX0Q2X0M2LCBGTl9BVkJfUlhfRVIsCisJCS8qIElQMl85IFsxXSAqLworCQlGTl9WSTJfRDVfQzUsIEZOX0FWQl9SWEQ3LAorCQkvKiBJUDJfOCBbMV0gKi8KKwkJRk5fVkkyX0Q0X0M0LCBGTl9BVkJfUlhENiwKKwkJLyogSVAyXzcgWzFdICovCisJCUZOX1ZJMl9EM19DMywgRk5fQVZCX1JYRDUsCisJCS8qIElQMl82IFsxXSAqLworCQlGTl9WSTJfRDJfQzIsIEZOX0FWQl9SWEQ0LAorCQkvKiBJUDJfNSBbMV0gKi8KKwkJRk5fVkkyX0QxX0MxLCBGTl9BVkJfUlhEMywKKwkJLyogSVAyXzQgWzFdICovCisJCUZOX1ZJMl9EMF9DMCwgRk5fQVZCX1JYRDIsCisJCS8qIElQMl8zIFsxXSAqLworCQlGTl9WSTJfVlNZTkNfTiwgRk5fQVZCX1JYRDEsCisJCS8qIElQMl8yIFsxXSAqLworCQlGTl9WSTJfSFNZTkNfTiwgRk5fQVZCX1JYRDAsCisJCS8qIElQMl8xIFsxXSAqLworCQlGTl9WSTJfQ0xLRU5CLCBGTl9BVkJfUlhfRFYsCisJCS8qIElQMl8wIFsxXSAqLworCQlGTl9WSTJfQ0xLLCBGTl9BVkJfUlhfQ0xLIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUdfVkFSKCJJUFNSMyIsIDB4RTYwNjAwNEMsIDMyLAorCQkJICAgICA0LCA0LAorCQkJICAgICA0LCA0LAorCQkJICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCQkJICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKSB7CisJCS8qIElQM18zMV8yOCBbNF0gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVAzXzI3XzI0IFs0XSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDNfMjNfMjAgWzRdICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQM18xOV8xNiBbNF0gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVAzXzE1IFsxXSAqLworCQkwLCAwLAorCQkvKiBJUDNfMTQgWzFdICovCisJCUZOX1ZJM19EMTFfWTMsIEZOX0FWQl9BVlRQX01BVENILAorCQkvKiBJUDNfMTMgWzFdICovCisJCUZOX1ZJM19EOV9ZMSwgRk5fQVZCX0dUWFJFRkNMSywKKwkJLyogSVAzXzEyIFsxXSAqLworCQlGTl9WSTNfRDhfWTAsIEZOX0FWQl9DUlMsCisJCS8qIElQM18xMSBbMV0gKi8KKwkJRk5fVkkzX0Q3X0M3LCBGTl9BVkJfUEhZX0lOVCwKKwkJLyogSVAzXzEwIFsxXSAqLworCQlGTl9WSTNfRDZfQzYsIEZOX0FWQl9NQUdJQywKKwkJLyogSVAzXzkgWzFdICovCisJCUZOX1ZJM19ENV9DNSwgRk5fQVZCX0xJTkssCisJCS8qIElQM184IFsxXSAqLworCQlGTl9WSTNfRDRfQzQsIEZOX0FWQl9NRElPLAorCQkvKiBJUDNfNyBbMV0gKi8KKwkJRk5fVkkzX0QzX0MzLCBGTl9BVkJfTURDLAorCQkvKiBJUDNfNiBbMV0gKi8KKwkJRk5fVkkzX0QyX0MyLCBGTl9BVkJfR1RYX0NMSywKKwkJLyogSVAzXzUgWzFdICovCisJCUZOX1ZJM19EMV9DMSwgRk5fQVZCX1RYX0VSLAorCQkvKiBJUDNfNCBbMV0gKi8KKwkJRk5fVkkzX0QwX0MwLCBGTl9BVkJfVFhENywKKwkJLyogSVAzXzMgWzFdICovCisJCUZOX1ZJM19WU1lOQ19OLCBGTl9BVkJfVFhENiwKKwkJLyogSVAzXzIgWzFdICovCisJCUZOX1ZJM19IU1lOQ19OLCBGTl9BVkJfVFhENSwKKwkJLyogSVAzXzEgWzFdICovCisJCUZOX1ZJM19DTEtFTkIsIEZOX0FWQl9UWEQ0LAorCQkvKiBJUDNfMCBbMV0gKi8KKwkJRk5fVkkzX0NMSywgRk5fQVZCX1RYX0NMSyB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHX1ZBUigiSVBTUjQiLCAweEU2MDYwMDUwLCAzMiwKKwkJCSAgICAgNCwgMywgMSwKKwkJCSAgICAgMSwgMSwgMSwgMiwgMiwgMiwKKwkJCSAgICAgMiwgMiwgMiwgMiwgMiwgMSwgMiwgMSwgMSkgeworCQkvKiBJUDRfMzFfMjggWzRdICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQNF8yN18yNSBbM10gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVA0XzI0IFsxXSAqLworCQlGTl9WSTRfRklFTEQsIEZOX1ZJM19EMTVfWTcsCisJCS8qIElQNF8yMyBbMV0gKi8KKwkJRk5fVkk0X0QxMV9ZMywgRk5fVkkzX0QxNF9ZNiwKKwkJLyogSVA0XzIyIFsxXSAqLworCQlGTl9WSTRfRDEwX1kyLCBGTl9WSTNfRDEzX1k1LAorCQkvKiBJUDRfMjEgWzFdICovCisJCUZOX1ZJNF9EOV9ZMSwgRk5fVkkzX0QxMl9ZNCwKKwkJLyogSVA0XzIwXzE5IFsyXSAqLworCQlGTl9WSTRfRDhfWTAsIEZOX1ZJMF9EMjNfUjcsIEZOX1ZJMl9EMTVfWTcsIDAsCisJCS8qIElQNF8xOF8xNyBbMl0gKi8KKwkJRk5fVkk0X0Q3X0M3LCBGTl9WSTBfRDIyX1I2LCBGTl9WSTJfRDE0X1k2LCAwLAorCQkvKiBJUDRfMTZfMTUgWzJdICovCisJCUZOX1ZJNF9ENl9DNiwgRk5fVkkwX0QyMV9SNSwgRk5fVkkyX0QxM19ZNSwgMCwKKwkJLyogSVA0XzE0XzEzIFsyXSAqLworCQlGTl9WSTRfRDVfQzUsIEZOX1ZJMF9EMjBfUjQsIEZOX1ZJMl9EMTJfWTQsIDAsCisJCS8qIElQNF8xMl8xMSBbMl0gKi8KKwkJRk5fVkk0X0Q0X0M0LCBGTl9WSTBfRDE5X1IzLCBGTl9WSTFfRDE1X0c3X1k3LCAwLAorCQkvKiBJUDRfMTBfOSBbMl0gKi8KKwkJRk5fVkk0X0QzX0MzLCBGTl9WSTBfRDE4X1IyLCBGTl9WSTFfRDE0X0c2X1k2LCAwLAorCQkvKiBJUDRfOF83IFsyXSAqLworCQlGTl9WSTRfRDJfQzIsIDAsIEZOX1ZJMF9EMTdfUjEsIEZOX1ZJMV9EMTNfRzVfWTUsCisJCS8qIElQNF82XzUgWzJdICovCisJCUZOX1ZJNF9EMV9DMSwgRk5fVkkwX0QxNl9SMCwgRk5fVkkxX0QxMl9HNF9ZNCwgMCwKKwkJLyogSVA0XzQgWzFdICovCisJCUZOX1ZJNF9EMF9DMCwgRk5fVkkwX0QxNV9HN19ZNywKKwkJLyogSVA0XzNfMiBbMl0gKi8KKwkJRk5fVkk0X1ZTWU5DX04sIEZOX1ZJMF9EMTRfRzZfWTYsIDAsIDAsCisJCS8qIElQNF8xIFsxXSAqLworCQlGTl9WSTRfSFNZTkNfTiwgRk5fVkkwX0QxM19HNV9ZNSwKKwkJLyogSVA0XzAgWzFdICovCisJCUZOX1ZJNF9DTEtFTkIsIEZOX1ZJMF9EMTJfRzRfWTQgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFR19WQVIoIklQU1I1IiwgMHhFNjA2MDA1NCwgMzIsCisJCQkgICAgIDQsIDQsCisJCQkgICAgIDQsIDQsCisJCQkgICAgIDQsIDEsIDEsIDEsIDEsCisJCQkgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEpIHsKKwkJLyogSVA1XzMxXzI4IFs0XSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDVfMjdfMjQgWzRdICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQNV8yM18yMCBbNF0gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVA1XzE5XzE2IFs0XSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDVfMTVfMTIgWzRdICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQNV8xMSBbMV0gKi8KKwkJRk5fVkk1X0Q4X1kwLCBGTl9WSTFfRDIzX1I3LAorCQkvKiBJUDVfMTAgWzFdICovCisJCUZOX1ZJNV9EN19DNywgRk5fVkkxX0QyMl9SNiwKKwkJLyogSVA1XzkgWzFdICovCisJCUZOX1ZJNV9ENl9DNiwgRk5fVkkxX0QyMV9SNSwKKwkJLyogSVA1XzggWzFdICovCisJCUZOX1ZJNV9ENV9DNSwgRk5fVkkxX0QyMF9SNCwKKwkJLyogSVA1XzcgWzFdICovCisJCUZOX1ZJNV9ENF9DNCwgRk5fVkkxX0QxOV9SMywKKwkJLyogSVA1XzYgWzFdICovCisJCUZOX1ZJNV9EM19DMywgRk5fVkkxX0QxOF9SMiwKKwkJLyogSVA1XzUgWzFdICovCisJCUZOX1ZJNV9EMl9DMiwgRk5fVkkxX0QxN19SMSwKKwkJLyogSVA1XzQgWzFdICovCisJCUZOX1ZJNV9EMV9DMSwgRk5fVkkxX0QxNl9SMCwKKwkJLyogSVA1XzMgWzFdICovCisJCUZOX1ZJNV9EMF9DMCwgRk5fVkkxX0QxNV9HN19ZN19CLAorCQkvKiBJUDVfMiBbMV0gKi8KKwkJRk5fVkk1X1ZTWU5DX04sIEZOX1ZJMV9EMTRfRzZfWTZfQiwKKwkJLyogSVA1XzEgWzFdICovCisJCUZOX1ZJNV9IU1lOQ19OLCBGTl9WSTFfRDEzX0c1X1k1X0IsCisJCS8qIElQNV8wIFsxXSAqLworCQlGTl9WSTVfQ0xLRU5CLCBGTl9WSTFfRDEyX0c0X1k0X0IgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFR19WQVIoIklQU1I2IiwgMHhFNjA2MDA1OCwgMzIsCisJCQkgICAgIDQsIDQsCisJCQkgICAgIDQsIDEsIDIsIDEsCisJCQkgICAgIDIsIDIsIDIsIDIsCisJCQkgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEpIHsKKwkJLyogSVA2XzMxXzI4IFs0XSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDZfMjdfMjQgWzRdICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQNl8yM18yMCBbNF0gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVA2XzE5IFsxXSAqLworCQkwLCAwLAorCQkvKiBJUDZfMThfMTcgWzJdICovCisJCUZOX0RSRVExX04sIEZOX1JYMywgMCwgMCwKKwkJLyogSVA2XzE2IFsxXSAqLworCQlGTl9UWDMsIDAsCisJCS8qIElQNl8xNV8xNCBbMl0gKi8KKwkJRk5fREFDSzEsIEZOX1NDSzMsIDAsIDAsCisJCS8qIElQNl8xM18xMiBbMl0gKi8KKwkJRk5fRFJFUTBfTiwgRk5fUlgyLCAwLCAwLAorCQkvKiBJUDZfMTFfMTAgWzJdICovCisJCUZOX0RBQ0swLCBGTl9UWDIsIDAsIDAsCisJCS8qIElQNl85XzggWzJdICovCisJCUZOX0RSQUNLMCwgRk5fU0NLMiwgMCwgMCwKKwkJLyogSVA2XzcgWzFdICovCisJCUZOX01TSU9GMV9SWEQsIEZOX0hSWDEsCisJCS8qIElQNl82IFsxXSAqLworCQlGTl9NU0lPRjFfVFhELCBGTl9IVFgxLAorCQkvKiBJUDZfNSBbMV0gKi8KKwkJRk5fTVNJT0YxX1NZTkMsIEZOX0hSVFMxX04sCisJCS8qIElQNl80IFsxXSAqLworCQlGTl9NU0lPRjFfU0NLLCBGTl9IU0NLMSwKKwkJLyogSVA2XzMgWzFdICovCisJCUZOX01TSU9GMF9SWEQsIEZOX0hSWDAsCisJCS8qIElQNl8yIFsxXSAqLworCQlGTl9NU0lPRjBfVFhELCBGTl9IVFgwLAorCQkvKiBJUDZfMSBbMV0gKi8KKwkJRk5fTVNJT0YwX1NZTkMsIEZOX0hDVFMwX04sCisJCS8qIElQNl8wIFsxXSAqLworCQlGTl9NU0lPRjBfU0NLLCBGTl9IU0NLMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHX1ZBUigiSVBTUjciLCAweEU2MDYwMDVDLCAzMiwKKwkJCSAgICAgNCwgNCwKKwkJCSAgICAgMywgMSwgMSwgMSwgMSwgMSwKKwkJCSAgICAgMiwgMiwgMiwgMiwKKwkJCSAgICAgMSwgMSwgMiwgMiwgMikgeworCQkvKiBJUDdfMzFfMjggWzRdICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQN18yN18yNCBbNF0gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVA3XzIzXzIxIFszXSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDdfMjAgWzFdICovCisJCUZOX0FVRElPX0NMS0IsIDAsCisJCS8qIElQN18xOSBbMV0gKi8KKwkJRk5fQVVESU9fQ0xLQSwgMCwKKwkJLyogSVA3XzE4IFsxXSAqLworCQlGTl9BVURJT19DTEtPVVQsIDAsCisJCS8qIElQN18xNyBbMV0gKi8KKwkJRk5fU1NJX1NEQVRBNCwgMCwKKwkJLyogSVA3XzE2IFsxXSAqLworCQlGTl9TU0lfV1M0LCAwLAorCQkvKiBJUDdfMTVfMTQgWzJdICovCisJCUZOX1NTSV9TQ0s0LCBGTl9UUFUwVE8zLCAwLCAwLAorCQkvKiBJUDdfMTNfMTIgWzJdICovCisJCUZOX1NTSV9TREFUQTMsIEZOX1RQVTBUTzIsIDAsIDAsCisJCS8qIElQN18xMV8xMCBbMl0gKi8KKwkJRk5fU1NJX1dTMzQsIEZOX1RQVTBUTzEsIDAsIDAsCisJCS8qIElQN185XzggWzJdICovCisJCUZOX1NTSV9TQ0szNCwgRk5fVFBVMFRPMCwgMCwgMCwKKwkJLyogSVA3XzcgWzFdICovCisJCUZOX1BXTTQsIDAsCisJCS8qIElQN182IFsxXSAqLworCQlGTl9QV00zLCAwLAorCQkvKiBJUDdfNV80IFsyXSAqLworCQlGTl9QV00yLCBGTl9UQ0xLMywgRk5fRlNPX1RPRSwgMCwKKwkJLyogSVA3XzNfMiBbMl0gKi8KKwkJRk5fUFdNMSwgRk5fVENMSzIsIEZOX0ZTT19DRkVfMSwgMCwKKwkJLyogSVA3XzFfMCBbMl0gKi8KKwkJRk5fUFdNMCwgRk5fVENMSzEsIEZOX0ZTT19DRkVfMCwgMCB9CisJfSwKKwl7IH0sCit9OworCitjb25zdCBzdHJ1Y3Qgc2hfcGZjX3NvY19pbmZvIHI4YTc3OTJfcGlubXV4X2luZm8gPSB7CisJLm5hbWUgPSAicjhhNzc5MjBfcGZjIiwKKwkudW5sb2NrX3JlZyA9IDB4ZTYwNjAwMDAsIC8qIFBNTVIgKi8KKworCS5mdW5jdGlvbiA9IHsgUElOTVVYX0ZVTkNUSU9OX0JFR0lOLCBQSU5NVVhfRlVOQ1RJT05fRU5EIH0sCisKKwkucGlucyA9IHBpbm11eF9waW5zLAorCS5ucl9waW5zID0gQVJSQVlfU0laRShwaW5tdXhfcGlucyksCisJLmdyb3VwcyA9IHBpbm11eF9ncm91cHMsCisJLm5yX2dyb3VwcyA9IEFSUkFZX1NJWkUocGlubXV4X2dyb3VwcyksCisJLmZ1bmN0aW9ucyA9IHBpbm11eF9mdW5jdGlvbnMsCisJLm5yX2Z1bmN0aW9ucyA9IEFSUkFZX1NJWkUocGlubXV4X2Z1bmN0aW9ucyksCisKKwkuY2ZnX3JlZ3MgPSBwaW5tdXhfY29uZmlnX3JlZ3MsCisKKwkucGlubXV4X2RhdGEgPSBwaW5tdXhfZGF0YSwKKwkucGlubXV4X2RhdGFfc2l6ZSA9IEFSUkFZX1NJWkUocGlubXV4X2RhdGEpLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGZjLXI4YTc3OTQuYyBiL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGZjLXI4YTc3OTQuYwppbmRleCA4YmMyY2YwYy4uZWQ3MzRmNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGZjLXI4YTc3OTQuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3Nzk0LmMKQEAgLTIyLDcgKzIyLDkgQEAKIAlQT1JUX0dQXzMyKDMsIGZuLCBzZngpLAkJCQkJCVwKIAlQT1JUX0dQXzMyKDQsIGZuLCBzZngpLAkJCQkJCVwKIAlQT1JUX0dQXzI4KDUsIGZuLCBzZngpLAkJCQkJCVwKLQlQT1JUX0dQXzI2KDYsIGZuLCBzZngpCisJUE9SVF9HUF9DRkdfMjQoNiwgZm4sIHNmeCwgU0hfUEZDX1BJTl9DRkdfSU9fVk9MVEFHRSksCQlcCisJUE9SVF9HUF8xKDYsIDI0LCBmbiwgc2Z4KSwJCQkJCVwKKwlQT1JUX0dQXzEoNiwgMjUsIGZuLCBzZngpCiAKIGVudW0gewogCVBJTk1VWF9SRVNFUlZFRCA9IDAsCkBAIC01MTYwLDggKzUxNjIsMzIgQEAKIAl7IH0sCiB9OwogCitzdGF0aWMgaW50IHI4YTc3OTRfcGluX3RvX3BvY2N0cmwoc3RydWN0IHNoX3BmYyAqcGZjLCB1bnNpZ25lZCBpbnQgcGluLCB1MzIgKnBvY2N0cmwpCit7CisJKnBvY2N0cmwgPSAweGU2MDYwMDZjOworCisJc3dpdGNoIChwaW4gJiAweDFmKSB7CisJY2FzZSA2OiByZXR1cm4gMjM7CisJY2FzZSA3OiByZXR1cm4gMTY7CisJY2FzZSAxNDogcmV0dXJuIDE1OworCWNhc2UgMTU6IHJldHVybiA4OworCWNhc2UgMCAuLi4gNToKKwljYXNlIDggLi4uIDEzOgorCQlyZXR1cm4gMjIgLSAocGluICYgMHgxZik7CisJY2FzZSAxNiAuLi4gMjM6CisJCXJldHVybiA0NyAtIChwaW4gJiAweDFmKTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9wZmNfc29jX29wZXJhdGlvbnMgcjhhNzc5NF9waW5tdXhfb3BzID0geworCS5waW5fdG9fcG9jY3RybCA9IHI4YTc3OTRfcGluX3RvX3BvY2N0cmwsCit9OworCiBjb25zdCBzdHJ1Y3Qgc2hfcGZjX3NvY19pbmZvIHI4YTc3OTRfcGlubXV4X2luZm8gPSB7CiAJLm5hbWUgPSAicjhhNzc5NDBfcGZjIiwKKwkub3BzID0gJnI4YTc3OTRfcGlubXV4X29wcywKIAkudW5sb2NrX3JlZyA9IDB4ZTYwNjAwMDAsIC8qIFBNTVIgKi8KIAogCS5mdW5jdGlvbiA9IHsgUElOTVVYX0ZVTkNUSU9OX0JFR0lOLCBQSU5NVVhfRlVOQ1RJT05fRU5EIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3Nzk1LmMgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3Nzk1LmMKaW5kZXggYjc0Y2RkMy4uMmU4Y2MyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5NS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGZjLXI4YTc3OTUuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBSLUNhciBHZW4zIHByb2Nlc3NvciBzdXBwb3J0IC0gUEZDIGhhcmR3YXJlIGJsb2NrLgorICogUjhBNzc5NSBwcm9jZXNzb3Igc3VwcG9ydCAtIFBGQyBoYXJkd2FyZSBibG9jay4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTUgIFJlbmVzYXMgRWxlY3Ryb25pY3MgQ29ycG9yYXRpb24KICAqCkBAIC0xMywxOSArMTMsMjMgQEAKICNpbmNsdWRlICJjb3JlLmgiCiAjaW5jbHVkZSAic2hfcGZjLmgiCiAKKyNkZWZpbmUgQ0ZHX0ZMQUdTIChTSF9QRkNfUElOX0NGR19EUklWRV9TVFJFTkdUSCB8IFwKKwkJICAgU0hfUEZDX1BJTl9DRkdfUFVMTF9VUCB8IFwKKwkJICAgU0hfUEZDX1BJTl9DRkdfUFVMTF9ET1dOKQorCiAjZGVmaW5lIENQVV9BTExfUE9SVChmbiwgc2Z4KQkJCQkJCVwKLQlQT1JUX0dQX0NGR18xNigwLCBmbiwgc2Z4LCBTSF9QRkNfUElOX0NGR19EUklWRV9TVFJFTkdUSCksCVwKLQlQT1JUX0dQX0NGR18yOCgxLCBmbiwgc2Z4LCBTSF9QRkNfUElOX0NGR19EUklWRV9TVFJFTkdUSCksCVwKLQlQT1JUX0dQX0NGR18xNSgyLCBmbiwgc2Z4LCBTSF9QRkNfUElOX0NGR19EUklWRV9TVFJFTkdUSCksCVwKLQlQT1JUX0dQX0NGR18xMigzLCBmbiwgc2Z4LCBTSF9QRkNfUElOX0NGR19EUklWRV9TVFJFTkdUSCB8IFNIX1BGQ19QSU5fQ0ZHX0lPX1ZPTFRBR0UpLAlcCi0JUE9SVF9HUF9DRkdfMSgzLCAxMiwgZm4sIHNmeCwgU0hfUEZDX1BJTl9DRkdfRFJJVkVfU1RSRU5HVEgpLAlcCi0JUE9SVF9HUF9DRkdfMSgzLCAxMywgZm4sIHNmeCwgU0hfUEZDX1BJTl9DRkdfRFJJVkVfU1RSRU5HVEgpLAlcCi0JUE9SVF9HUF9DRkdfMSgzLCAxNCwgZm4sIHNmeCwgU0hfUEZDX1BJTl9DRkdfRFJJVkVfU1RSRU5HVEgpLAlcCi0JUE9SVF9HUF9DRkdfMSgzLCAxNSwgZm4sIHNmeCwgU0hfUEZDX1BJTl9DRkdfRFJJVkVfU1RSRU5HVEgpLAlcCi0JUE9SVF9HUF9DRkdfMTgoNCwgZm4sIHNmeCwgU0hfUEZDX1BJTl9DRkdfRFJJVkVfU1RSRU5HVEggfCBTSF9QRkNfUElOX0NGR19JT19WT0xUQUdFKSwJXAotCVBPUlRfR1BfQ0ZHXzI2KDUsIGZuLCBzZngsIFNIX1BGQ19QSU5fQ0ZHX0RSSVZFX1NUUkVOR1RIKSwJXAotCVBPUlRfR1BfQ0ZHXzMyKDYsIGZuLCBzZngsIFNIX1BGQ19QSU5fQ0ZHX0RSSVZFX1NUUkVOR1RIKSwJXAotCVBPUlRfR1BfQ0ZHXzQoNywgZm4sIHNmeCwgU0hfUEZDX1BJTl9DRkdfRFJJVkVfU1RSRU5HVEgpCisJUE9SVF9HUF9DRkdfMTYoMCwgZm4sIHNmeCwgQ0ZHX0ZMQUdTKSwJXAorCVBPUlRfR1BfQ0ZHXzI4KDEsIGZuLCBzZngsIENGR19GTEFHUyksCVwKKwlQT1JUX0dQX0NGR18xNSgyLCBmbiwgc2Z4LCBDRkdfRkxBR1MpLAlcCisJUE9SVF9HUF9DRkdfMTIoMywgZm4sIHNmeCwgQ0ZHX0ZMQUdTIHwgU0hfUEZDX1BJTl9DRkdfSU9fVk9MVEFHRSksCVwKKwlQT1JUX0dQX0NGR18xKDMsIDEyLCBmbiwgc2Z4LCBDRkdfRkxBR1MpLAlcCisJUE9SVF9HUF9DRkdfMSgzLCAxMywgZm4sIHNmeCwgQ0ZHX0ZMQUdTKSwJXAorCVBPUlRfR1BfQ0ZHXzEoMywgMTQsIGZuLCBzZngsIENGR19GTEFHUyksCVwKKwlQT1JUX0dQX0NGR18xKDMsIDE1LCBmbiwgc2Z4LCBDRkdfRkxBR1MpLAlcCisJUE9SVF9HUF9DRkdfMTgoNCwgZm4sIHNmeCwgQ0ZHX0ZMQUdTIHwgU0hfUEZDX1BJTl9DRkdfSU9fVk9MVEFHRSksCVwKKwlQT1JUX0dQX0NGR18yNig1LCBmbiwgc2Z4LCBDRkdfRkxBR1MpLAlcCisJUE9SVF9HUF9DRkdfMzIoNiwgZm4sIHNmeCwgQ0ZHX0ZMQUdTKSwJXAorCVBPUlRfR1BfQ0ZHXzQoNywgZm4sIHNmeCwgQ0ZHX0ZMQUdTKQogLyoKICAqIEZfKCkgOiBqdXN0IGluZm9ybWF0aW9uCiAgKiBGTSgpIDogbWFjcm8gZm9yIEZOX3h4eCAvIHh4eF9NQVJLCkBAIC0xODcxLDYgKzE4NzUsODYgQEAKIAlSSUYzX0QxX0JfTUFSSywKIH07CiAKKy8qIC0gRFUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1X3JnYjY2Nl9waW5zW10gPSB7CisJLyogUls3OjJdLCBHWzc6Ml0sIEJbNzoyXSAqLworCVJDQVJfR1BfUElOKDAsIDE1KSwgUkNBUl9HUF9QSU4oMCwgMTQpLCBSQ0FSX0dQX1BJTigwLCAxMyksCisJUkNBUl9HUF9QSU4oMCwgMTIpLCBSQ0FSX0dQX1BJTigwLCAxMSksIFJDQVJfR1BfUElOKDAsIDEwKSwKKwlSQ0FSX0dQX1BJTigxLCAxNSksIFJDQVJfR1BfUElOKDEsIDE0KSwgUkNBUl9HUF9QSU4oMSwgMTMpLAorCVJDQVJfR1BfUElOKDEsIDEyKSwgUkNBUl9HUF9QSU4oMSwgMTkpLCBSQ0FSX0dQX1BJTigxLCAxOCksCisJUkNBUl9HUF9QSU4oMSwgNyksICBSQ0FSX0dQX1BJTigxLCA2KSwgIFJDQVJfR1BfUElOKDEsIDUpLAorCVJDQVJfR1BfUElOKDEsIDQpLCAgUkNBUl9HUF9QSU4oMSwgMyksICBSQ0FSX0dQX1BJTigxLCAyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1X3JnYjY2Nl9tdXhbXSA9IHsKKwlEVV9EUjdfTUFSSywgRFVfRFI2X01BUkssIERVX0RSNV9NQVJLLCBEVV9EUjRfTUFSSywKKwlEVV9EUjNfTUFSSywgRFVfRFIyX01BUkssCisJRFVfREc3X01BUkssIERVX0RHNl9NQVJLLCBEVV9ERzVfTUFSSywgRFVfREc0X01BUkssCisJRFVfREczX01BUkssIERVX0RHMl9NQVJLLAorCURVX0RCN19NQVJLLCBEVV9EQjZfTUFSSywgRFVfREI1X01BUkssIERVX0RCNF9NQVJLLAorCURVX0RCM19NQVJLLCBEVV9EQjJfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1X3JnYjg4OF9waW5zW10gPSB7CisJLyogUls3OjBdLCBHWzc6MF0sIEJbNzowXSAqLworCVJDQVJfR1BfUElOKDAsIDE1KSwgUkNBUl9HUF9QSU4oMCwgMTQpLCBSQ0FSX0dQX1BJTigwLCAxMyksCisJUkNBUl9HUF9QSU4oMCwgMTIpLCBSQ0FSX0dQX1BJTigwLCAxMSksIFJDQVJfR1BfUElOKDAsIDEwKSwKKwlSQ0FSX0dQX1BJTigwLCA5KSwgIFJDQVJfR1BfUElOKDAsIDgpLAorCVJDQVJfR1BfUElOKDEsIDE1KSwgUkNBUl9HUF9QSU4oMSwgMTQpLCBSQ0FSX0dQX1BJTigxLCAxMyksCisJUkNBUl9HUF9QSU4oMSwgMTIpLCBSQ0FSX0dQX1BJTigxLCAxOSksIFJDQVJfR1BfUElOKDEsIDE4KSwKKwlSQ0FSX0dQX1BJTigxLCAxNyksIFJDQVJfR1BfUElOKDEsIDE2KSwKKwlSQ0FSX0dQX1BJTigxLCA3KSwgIFJDQVJfR1BfUElOKDEsIDYpLCAgUkNBUl9HUF9QSU4oMSwgNSksCisJUkNBUl9HUF9QSU4oMSwgNCksICBSQ0FSX0dQX1BJTigxLCAzKSwgIFJDQVJfR1BfUElOKDEsIDIpLAorCVJDQVJfR1BfUElOKDEsIDEpLCAgUkNBUl9HUF9QSU4oMSwgMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdV9yZ2I4ODhfbXV4W10gPSB7CisJRFVfRFI3X01BUkssIERVX0RSNl9NQVJLLCBEVV9EUjVfTUFSSywgRFVfRFI0X01BUkssCisJRFVfRFIzX01BUkssIERVX0RSMl9NQVJLLCBEVV9EUjFfTUFSSywgRFVfRFIwX01BUkssCisJRFVfREc3X01BUkssIERVX0RHNl9NQVJLLCBEVV9ERzVfTUFSSywgRFVfREc0X01BUkssCisJRFVfREczX01BUkssIERVX0RHMl9NQVJLLCBEVV9ERzFfTUFSSywgRFVfREcwX01BUkssCisJRFVfREI3X01BUkssIERVX0RCNl9NQVJLLCBEVV9EQjVfTUFSSywgRFVfREI0X01BUkssCisJRFVfREIzX01BUkssIERVX0RCMl9NQVJLLCBEVV9EQjFfTUFSSywgRFVfREIwX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdV9jbGtfb3V0XzBfcGluc1tdID0geworCS8qIENMS09VVCAqLworCVJDQVJfR1BfUElOKDEsIDI3KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1X2Nsa19vdXRfMF9tdXhbXSA9IHsKKwlEVV9ET1RDTEtPVVQwX01BUksKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1X2Nsa19vdXRfMV9waW5zW10gPSB7CisJLyogQ0xLT1VUICovCisJUkNBUl9HUF9QSU4oMiwgMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdV9jbGtfb3V0XzFfbXV4W10gPSB7CisJRFVfRE9UQ0xLT1VUMV9NQVJLCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdV9zeW5jX3BpbnNbXSA9IHsKKwkvKiBFWFZTWU5DL1ZTWU5DLCBFWEhTWU5DL0hTWU5DICovCisJUkNBUl9HUF9QSU4oMiwgNSksIFJDQVJfR1BfUElOKDIsIDQpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHVfc3luY19tdXhbXSA9IHsKKwlEVV9FWFZTWU5DX0RVX1ZTWU5DX01BUkssIERVX0VYSFNZTkNfRFVfSFNZTkNfTUFSSworfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHVfb2RkZl9waW5zW10gPSB7CisJLyogRVhESVNQL0VYT0RERi9FWENERSAqLworCVJDQVJfR1BfUElOKDIsIDIpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHVfb2RkZl9tdXhbXSA9IHsKKwlEVV9FWE9EREZfRFVfT0RERl9ESVNQX0NERV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHVfY2RlX3BpbnNbXSA9IHsKKwkvKiBDREUgKi8KKwlSQ0FSX0dQX1BJTigyLCAwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1X2NkZV9tdXhbXSA9IHsKKwlEVV9DREVfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1X2Rpc3BfcGluc1tdID0geworCS8qIERJU1AgKi8KKwlSQ0FSX0dQX1BJTigyLCAxKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1X2Rpc3BfbXV4W10gPSB7CisJRFVfRElTUF9NQVJLLAorfTsKIC8qIC0gSFNDSUYwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGhzY2lmMF9kYXRhX3BpbnNbXSA9IHsKIAkvKiBSWCwgVFggKi8KQEAgLTM1OTMsNiArMzY3NywxNCBAQAogCVNIX1BGQ19QSU5fR1JPVVAoZHJpZjNfY3RybF9iKSwKIAlTSF9QRkNfUElOX0dST1VQKGRyaWYzX2RhdGEwX2IpLAogCVNIX1BGQ19QSU5fR1JPVVAoZHJpZjNfZGF0YTFfYiksCisJU0hfUEZDX1BJTl9HUk9VUChkdV9yZ2I2NjYpLAorCVNIX1BGQ19QSU5fR1JPVVAoZHVfcmdiODg4KSwKKwlTSF9QRkNfUElOX0dST1VQKGR1X2Nsa19vdXRfMCksCisJU0hfUEZDX1BJTl9HUk9VUChkdV9jbGtfb3V0XzEpLAorCVNIX1BGQ19QSU5fR1JPVVAoZHVfc3luYyksCisJU0hfUEZDX1BJTl9HUk9VUChkdV9vZGRmKSwKKwlTSF9QRkNfUElOX0dST1VQKGR1X2NkZSksCisJU0hfUEZDX1BJTl9HUk9VUChkdV9kaXNwKSwKIAlTSF9QRkNfUElOX0dST1VQKGhzY2lmMF9kYXRhKSwKIAlTSF9QRkNfUElOX0dST1VQKGhzY2lmMF9jbGspLAogCVNIX1BGQ19QSU5fR1JPVVAoaHNjaWYwX2N0cmwpLApAQCAtMzkxOCw2ICs0MDEwLDE3IEBACiAJImRyaWYzX2RhdGExX2IiLAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkdV9ncm91cHNbXSA9IHsKKwkiZHVfcmdiNjY2IiwKKwkiZHVfcmdiODg4IiwKKwkiZHVfY2xrX291dF8wIiwKKwkiZHVfY2xrX291dF8xIiwKKwkiZHVfc3luYyIsCisJImR1X29kZGYiLAorCSJkdV9jZGUiLAorCSJkdV9kaXNwIiwKK307CisKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaHNjaWYwX2dyb3Vwc1tdID0gewogCSJoc2NpZjBfZGF0YSIsCiAJImhzY2lmMF9jbGsiLApAQCAtNDI2NSw2ICs0MzY4LDcgQEAKIAlTSF9QRkNfRlVOQ1RJT04oZHJpZjEpLAogCVNIX1BGQ19GVU5DVElPTihkcmlmMiksCiAJU0hfUEZDX0ZVTkNUSU9OKGRyaWYzKSwKKwlTSF9QRkNfRlVOQ1RJT04oZHUpLAogCVNIX1BGQ19GVU5DVElPTihoc2NpZjApLAogCVNIX1BGQ19GVU5DVElPTihoc2NpZjEpLAogCVNIX1BGQ19GVU5DVElPTihoc2NpZjIpLApAQCAtNTA3Myw4ICs1MTc3LDIzNCBAQAogCXJldHVybiBiaXQ7CiB9CiAKKyNkZWZpbmUgUFVFTgkweGU2MDYwNDAwCisjZGVmaW5lIFBVRAkweGU2MDYwNDQwCisKKyNkZWZpbmUgUFUwCTB4MDAKKyNkZWZpbmUgUFUxCTB4MDQKKyNkZWZpbmUgUFUyCTB4MDgKKyNkZWZpbmUgUFUzCTB4MGMKKyNkZWZpbmUgUFU0CTB4MTAKKyNkZWZpbmUgUFU1CTB4MTQKKyNkZWZpbmUgUFU2CTB4MTgKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdTE2IHJlZyA6IDExOworCXUxNiBiaXQgOiA1OworfSBwdWxsdXBzW10gPSB7CisJW1JDQVJfR1BfUElOKDIsIDExKV0gPSB7IFBVMCwgMzEgfSwJLyogQVZCX1BIWV9JTlQgKi8KKwlbUkNBUl9HUF9QSU4oMiwgMTApXSA9IHsgUFUwLCAzMCB9LAkvKiBBVkJfTUFHSUMgKi8KKwlbUkNBUl9HUF9QSU4oMiwgIDkpXSA9IHsgUFUwLCAyOSB9LAkvKiBBVkJfTURDICovCisKKwlbUkNBUl9HUF9QSU4oMSwgMTkpXSA9IHsgUFUxLCAzMSB9LAkvKiBBMTkgKi8KKwlbUkNBUl9HUF9QSU4oMSwgMTgpXSA9IHsgUFUxLCAzMCB9LAkvKiBBMTggKi8KKwlbUkNBUl9HUF9QSU4oMSwgMTcpXSA9IHsgUFUxLCAyOSB9LAkvKiBBMTcgKi8KKwlbUkNBUl9HUF9QSU4oMSwgMTYpXSA9IHsgUFUxLCAyOCB9LAkvKiBBMTYgKi8KKwlbUkNBUl9HUF9QSU4oMSwgMTUpXSA9IHsgUFUxLCAyNyB9LAkvKiBBMTUgKi8KKwlbUkNBUl9HUF9QSU4oMSwgMTQpXSA9IHsgUFUxLCAyNiB9LAkvKiBBMTQgKi8KKwlbUkNBUl9HUF9QSU4oMSwgMTMpXSA9IHsgUFUxLCAyNSB9LAkvKiBBMTMgKi8KKwlbUkNBUl9HUF9QSU4oMSwgMTIpXSA9IHsgUFUxLCAyNCB9LAkvKiBBMTIgKi8KKwlbUkNBUl9HUF9QSU4oMSwgMTEpXSA9IHsgUFUxLCAyMyB9LAkvKiBBMTEgKi8KKwlbUkNBUl9HUF9QSU4oMSwgMTApXSA9IHsgUFUxLCAyMiB9LAkvKiBBMTAgKi8KKwlbUkNBUl9HUF9QSU4oMSwgIDkpXSA9IHsgUFUxLCAyMSB9LAkvKiBBOSAqLworCVtSQ0FSX0dQX1BJTigxLCAgOCldID0geyBQVTEsIDIwIH0sCS8qIEE4ICovCisJW1JDQVJfR1BfUElOKDEsICA3KV0gPSB7IFBVMSwgMTkgfSwJLyogQTcgKi8KKwlbUkNBUl9HUF9QSU4oMSwgIDYpXSA9IHsgUFUxLCAxOCB9LAkvKiBBNiAqLworCVtSQ0FSX0dQX1BJTigxLCAgNSldID0geyBQVTEsIDE3IH0sCS8qIEE1ICovCisJW1JDQVJfR1BfUElOKDEsICA0KV0gPSB7IFBVMSwgMTYgfSwJLyogQTQgKi8KKwlbUkNBUl9HUF9QSU4oMSwgIDMpXSA9IHsgUFUxLCAxNSB9LAkvKiBBMyAqLworCVtSQ0FSX0dQX1BJTigxLCAgMildID0geyBQVTEsIDE0IH0sCS8qIEEyICovCisJW1JDQVJfR1BfUElOKDEsICAxKV0gPSB7IFBVMSwgMTMgfSwJLyogQTEgKi8KKwlbUkNBUl9HUF9QSU4oMSwgIDApXSA9IHsgUFUxLCAxMiB9LAkvKiBBMCAqLworCVtSQ0FSX0dQX1BJTigyLCAgOCldID0geyBQVTEsIDExIH0sCS8qIFBXTTJfQSAqLworCVtSQ0FSX0dQX1BJTigyLCAgNyldID0geyBQVTEsIDEwIH0sCS8qIFBXTTFfQSAqLworCVtSQ0FSX0dQX1BJTigyLCAgNildID0geyBQVTEsICA5IH0sCS8qIFBXTTAgKi8KKwlbUkNBUl9HUF9QSU4oMiwgIDUpXSA9IHsgUFUxLCAgOCB9LAkvKiBJUlE1ICovCisJW1JDQVJfR1BfUElOKDIsICA0KV0gPSB7IFBVMSwgIDcgfSwJLyogSVJRNCAqLworCVtSQ0FSX0dQX1BJTigyLCAgMyldID0geyBQVTEsICA2IH0sCS8qIElSUTMgKi8KKwlbUkNBUl9HUF9QSU4oMiwgIDIpXSA9IHsgUFUxLCAgNSB9LAkvKiBJUlEyICovCisJW1JDQVJfR1BfUElOKDIsICAxKV0gPSB7IFBVMSwgIDQgfSwJLyogSVJRMSAqLworCVtSQ0FSX0dQX1BJTigyLCAgMCldID0geyBQVTEsICAzIH0sCS8qIElSUTAgKi8KKwlbUkNBUl9HUF9QSU4oMiwgMTQpXSA9IHsgUFUxLCAgMiB9LAkvKiBBVkJfQVZUUF9DQVBUVVJFX0EgKi8KKwlbUkNBUl9HUF9QSU4oMiwgMTMpXSA9IHsgUFUxLCAgMSB9LAkvKiBBVkJfQVZUUF9NQVRDSF9BICovCisJW1JDQVJfR1BfUElOKDIsIDEyKV0gPSB7IFBVMSwgIDAgfSwJLyogQVZCX0xJTksgKi8KKworCVtSQ0FSX0dQX1BJTig3LCAgMyldID0geyBQVTIsIDI5IH0sCS8qIEhETUkxX0NFQyAqLworCVtSQ0FSX0dQX1BJTig3LCAgMildID0geyBQVTIsIDI4IH0sCS8qIEhETUkwX0NFQyAqLworCVtSQ0FSX0dQX1BJTig3LCAgMSldID0geyBQVTIsIDI3IH0sCS8qIEFWUzIgKi8KKwlbUkNBUl9HUF9QSU4oNywgIDApXSA9IHsgUFUyLCAyNiB9LAkvKiBBVlMxICovCisJW1JDQVJfR1BfUElOKDAsIDE1KV0gPSB7IFBVMiwgMjUgfSwJLyogRDE1ICovCisJW1JDQVJfR1BfUElOKDAsIDE0KV0gPSB7IFBVMiwgMjQgfSwJLyogRDE0ICovCisJW1JDQVJfR1BfUElOKDAsIDEzKV0gPSB7IFBVMiwgMjMgfSwJLyogRDEzICovCisJW1JDQVJfR1BfUElOKDAsIDEyKV0gPSB7IFBVMiwgMjIgfSwJLyogRDEyICovCisJW1JDQVJfR1BfUElOKDAsIDExKV0gPSB7IFBVMiwgMjEgfSwJLyogRDExICovCisJW1JDQVJfR1BfUElOKDAsIDEwKV0gPSB7IFBVMiwgMjAgfSwJLyogRDEwICovCisJW1JDQVJfR1BfUElOKDAsICA5KV0gPSB7IFBVMiwgMTkgfSwJLyogRDkgKi8KKwlbUkNBUl9HUF9QSU4oMCwgIDgpXSA9IHsgUFUyLCAxOCB9LAkvKiBEOCAqLworCVtSQ0FSX0dQX1BJTigwLCAgNyldID0geyBQVTIsIDE3IH0sCS8qIEQ3ICovCisJW1JDQVJfR1BfUElOKDAsICA2KV0gPSB7IFBVMiwgMTYgfSwJLyogRDYgKi8KKwlbUkNBUl9HUF9QSU4oMCwgIDUpXSA9IHsgUFUyLCAxNSB9LAkvKiBENSAqLworCVtSQ0FSX0dQX1BJTigwLCAgNCldID0geyBQVTIsIDE0IH0sCS8qIEQ0ICovCisJW1JDQVJfR1BfUElOKDAsICAzKV0gPSB7IFBVMiwgMTMgfSwJLyogRDMgKi8KKwlbUkNBUl9HUF9QSU4oMCwgIDIpXSA9IHsgUFUyLCAxMiB9LAkvKiBEMiAqLworCVtSQ0FSX0dQX1BJTigwLCAgMSldID0geyBQVTIsIDExIH0sCS8qIEQxICovCisJW1JDQVJfR1BfUElOKDAsICAwKV0gPSB7IFBVMiwgMTAgfSwJLyogRDAgKi8KKwlbUkNBUl9HUF9QSU4oMSwgMjcpXSA9IHsgUFUyLCAgOCB9LAkvKiBFWF9XQUlUMF9BICovCisJW1JDQVJfR1BfUElOKDEsIDI2KV0gPSB7IFBVMiwgIDcgfSwJLyogV0UxX04gKi8KKwlbUkNBUl9HUF9QSU4oMSwgMjUpXSA9IHsgUFUyLCAgNiB9LAkvKiBXRTBfTiAqLworCVtSQ0FSX0dQX1BJTigxLCAyNCldID0geyBQVTIsICA1IH0sCS8qIFJEX1dSX04gKi8KKwlbUkNBUl9HUF9QSU4oMSwgMjMpXSA9IHsgUFUyLCAgNCB9LAkvKiBSRF9OICovCisJW1JDQVJfR1BfUElOKDEsIDIyKV0gPSB7IFBVMiwgIDMgfSwJLyogQlNfTiAqLworCVtSQ0FSX0dQX1BJTigxLCAyMSldID0geyBQVTIsICAyIH0sCS8qIENTMV9OX0EyNiAqLworCVtSQ0FSX0dQX1BJTigxLCAyMCldID0geyBQVTIsICAxIH0sCS8qIENTMF9OICovCisKKwlbUkNBUl9HUF9QSU4oNCwgIDkpXSA9IHsgUFUzLCAzMSB9LAkvKiBTRDNfREFUMCAqLworCVtSQ0FSX0dQX1BJTig0LCAgOCldID0geyBQVTMsIDMwIH0sCS8qIFNEM19DTUQgKi8KKwlbUkNBUl9HUF9QSU4oNCwgIDcpXSA9IHsgUFUzLCAyOSB9LAkvKiBTRDNfQ0xLICovCisJW1JDQVJfR1BfUElOKDQsICA2KV0gPSB7IFBVMywgMjggfSwJLyogU0QyX0RTICovCisJW1JDQVJfR1BfUElOKDQsICA1KV0gPSB7IFBVMywgMjcgfSwJLyogU0QyX0RBVDMgKi8KKwlbUkNBUl9HUF9QSU4oNCwgIDQpXSA9IHsgUFUzLCAyNiB9LAkvKiBTRDJfREFUMiAqLworCVtSQ0FSX0dQX1BJTig0LCAgMyldID0geyBQVTMsIDI1IH0sCS8qIFNEMl9EQVQxICovCisJW1JDQVJfR1BfUElOKDQsICAyKV0gPSB7IFBVMywgMjQgfSwJLyogU0QyX0RBVDAgKi8KKwlbUkNBUl9HUF9QSU4oNCwgIDEpXSA9IHsgUFUzLCAyMyB9LAkvKiBTRDJfQ01EICovCisJW1JDQVJfR1BfUElOKDQsICAwKV0gPSB7IFBVMywgMjIgfSwJLyogU0QyX0NMSyAqLworCVtSQ0FSX0dQX1BJTigzLCAxMSldID0geyBQVTMsIDIxIH0sCS8qIFNEMV9EQVQzICovCisJW1JDQVJfR1BfUElOKDMsIDEwKV0gPSB7IFBVMywgMjAgfSwJLyogU0QxX0RBVDIgKi8KKwlbUkNBUl9HUF9QSU4oMywgIDkpXSA9IHsgUFUzLCAxOSB9LAkvKiBTRDFfREFUMSAqLworCVtSQ0FSX0dQX1BJTigzLCAgOCldID0geyBQVTMsIDE4IH0sCS8qIFNEMV9EQVQwICovCisJW1JDQVJfR1BfUElOKDMsICA3KV0gPSB7IFBVMywgMTcgfSwJLyogU0QxX0NNRCAqLworCVtSQ0FSX0dQX1BJTigzLCAgNildID0geyBQVTMsIDE2IH0sCS8qIFNEMV9DTEsgKi8KKwlbUkNBUl9HUF9QSU4oMywgIDUpXSA9IHsgUFUzLCAxNSB9LAkvKiBTRDBfREFUMyAqLworCVtSQ0FSX0dQX1BJTigzLCAgNCldID0geyBQVTMsIDE0IH0sCS8qIFNEMF9EQVQyICovCisJW1JDQVJfR1BfUElOKDMsICAzKV0gPSB7IFBVMywgMTMgfSwJLyogU0QwX0RBVDEgKi8KKwlbUkNBUl9HUF9QSU4oMywgIDIpXSA9IHsgUFUzLCAxMiB9LAkvKiBTRDBfREFUMCAqLworCVtSQ0FSX0dQX1BJTigzLCAgMSldID0geyBQVTMsIDExIH0sCS8qIFNEMF9DTUQgKi8KKwlbUkNBUl9HUF9QSU4oMywgIDApXSA9IHsgUFUzLCAxMCB9LAkvKiBTRDBfQ0xLICovCisKKwlbUkNBUl9HUF9QSU4oNSwgMTkpXSA9IHsgUFU0LCAzMSB9LAkvKiBNU0lPRjBfU1MxICovCisJW1JDQVJfR1BfUElOKDUsIDE4KV0gPSB7IFBVNCwgMzAgfSwJLyogTVNJT0YwX1NZTkMgKi8KKwlbUkNBUl9HUF9QSU4oNSwgMTcpXSA9IHsgUFU0LCAyOSB9LAkvKiBNU0lPRjBfU0NLICovCisJW1JDQVJfR1BfUElOKDUsIDE2KV0gPSB7IFBVNCwgMjggfSwJLyogSFJUUzBfTiAqLworCVtSQ0FSX0dQX1BJTig1LCAxNSldID0geyBQVTQsIDI3IH0sCS8qIEhDVFMwX04gKi8KKwlbUkNBUl9HUF9QSU4oNSwgMTQpXSA9IHsgUFU0LCAyNiB9LAkvKiBIVFgwICovCisJW1JDQVJfR1BfUElOKDUsIDEzKV0gPSB7IFBVNCwgMjUgfSwJLyogSFJYMCAqLworCVtSQ0FSX0dQX1BJTig1LCAxMildID0geyBQVTQsIDI0IH0sCS8qIEhTQ0swICovCisJW1JDQVJfR1BfUElOKDUsIDExKV0gPSB7IFBVNCwgMjMgfSwJLyogUlgyX0EgKi8KKwlbUkNBUl9HUF9QSU4oNSwgMTApXSA9IHsgUFU0LCAyMiB9LAkvKiBUWDJfQSAqLworCVtSQ0FSX0dQX1BJTig1LCAgOSldID0geyBQVTQsIDIxIH0sCS8qIFNDSzIgKi8KKwlbUkNBUl9HUF9QSU4oNSwgIDgpXSA9IHsgUFU0LCAyMCB9LAkvKiBSVFMxX05fVEFOUyAqLworCVtSQ0FSX0dQX1BJTig1LCAgNyldID0geyBQVTQsIDE5IH0sCS8qIENUUzFfTiAqLworCVtSQ0FSX0dQX1BJTig1LCAgNildID0geyBQVTQsIDE4IH0sCS8qIFRYMV9BICovCisJW1JDQVJfR1BfUElOKDUsICA1KV0gPSB7IFBVNCwgMTcgfSwJLyogUlgxX0EgKi8KKwlbUkNBUl9HUF9QSU4oNSwgIDQpXSA9IHsgUFU0LCAxNiB9LAkvKiBSVFMwX05fVEFOUyAqLworCVtSQ0FSX0dQX1BJTig1LCAgMyldID0geyBQVTQsIDE1IH0sCS8qIENUUzBfTiAqLworCVtSQ0FSX0dQX1BJTig1LCAgMildID0geyBQVTQsIDE0IH0sCS8qIFRYMCAqLworCVtSQ0FSX0dQX1BJTig1LCAgMSldID0geyBQVTQsIDEzIH0sCS8qIFJYMCAqLworCVtSQ0FSX0dQX1BJTig1LCAgMCldID0geyBQVTQsIDEyIH0sCS8qIFNDSzAgKi8KKwlbUkNBUl9HUF9QSU4oMywgMTUpXSA9IHsgUFU0LCAxMSB9LAkvKiBTRDFfV1AgKi8KKwlbUkNBUl9HUF9QSU4oMywgMTQpXSA9IHsgUFU0LCAxMCB9LAkvKiBTRDFfQ0QgKi8KKwlbUkNBUl9HUF9QSU4oMywgMTMpXSA9IHsgUFU0LCAgOSB9LAkvKiBTRDBfV1AgKi8KKwlbUkNBUl9HUF9QSU4oMywgMTIpXSA9IHsgUFU0LCAgOCB9LAkvKiBTRDBfQ0QgKi8KKwlbUkNBUl9HUF9QSU4oNCwgMTcpXSA9IHsgUFU0LCAgNyB9LAkvKiBTRDNfRFMgKi8KKwlbUkNBUl9HUF9QSU4oNCwgMTYpXSA9IHsgUFU0LCAgNiB9LAkvKiBTRDNfREFUNyAqLworCVtSQ0FSX0dQX1BJTig0LCAxNSldID0geyBQVTQsICA1IH0sCS8qIFNEM19EQVQ2ICovCisJW1JDQVJfR1BfUElOKDQsIDE0KV0gPSB7IFBVNCwgIDQgfSwJLyogU0QzX0RBVDUgKi8KKwlbUkNBUl9HUF9QSU4oNCwgMTMpXSA9IHsgUFU0LCAgMyB9LAkvKiBTRDNfREFUNCAqLworCVtSQ0FSX0dQX1BJTig0LCAxMildID0geyBQVTQsICAyIH0sCS8qIFNEM19EQVQzICovCisJW1JDQVJfR1BfUElOKDQsIDExKV0gPSB7IFBVNCwgIDEgfSwJLyogU0QzX0RBVDIgKi8KKwlbUkNBUl9HUF9QSU4oNCwgMTApXSA9IHsgUFU0LCAgMCB9LAkvKiBTRDNfREFUMSAqLworCisJW1JDQVJfR1BfUElOKDYsIDI0KV0gPSB7IFBVNSwgMzEgfSwJLyogVVNCMF9QV0VOICovCisJW1JDQVJfR1BfUElOKDYsIDIzKV0gPSB7IFBVNSwgMzAgfSwJLyogQVVESU9fQ0xLQl9CICovCisJW1JDQVJfR1BfUElOKDYsIDIyKV0gPSB7IFBVNSwgMjkgfSwJLyogQVVESU9fQ0xLQV9BICovCisJW1JDQVJfR1BfUElOKDYsIDIxKV0gPSB7IFBVNSwgMjggfSwJLyogU1NJX1NEQVRBOV9BICovCisJW1JDQVJfR1BfUElOKDYsIDIwKV0gPSB7IFBVNSwgMjcgfSwJLyogU1NJX1NEQVRBOCAqLworCVtSQ0FSX0dQX1BJTig2LCAxOSldID0geyBQVTUsIDI2IH0sCS8qIFNTSV9TREFUQTcgKi8KKwlbUkNBUl9HUF9QSU4oNiwgMTgpXSA9IHsgUFU1LCAyNSB9LAkvKiBTU0lfV1M3OCAqLworCVtSQ0FSX0dQX1BJTig2LCAxNyldID0geyBQVTUsIDI0IH0sCS8qIFNTSV9TQ0s3OCAqLworCVtSQ0FSX0dQX1BJTig2LCAxNildID0geyBQVTUsIDIzIH0sCS8qIFNTSV9TREFUQTYgKi8KKwlbUkNBUl9HUF9QSU4oNiwgMTUpXSA9IHsgUFU1LCAyMiB9LAkvKiBTU0lfV1M2ICovCisJW1JDQVJfR1BfUElOKDYsIDE0KV0gPSB7IFBVNSwgMjEgfSwJLyogU1NJX1NDSzYgKi8KKwlbUkNBUl9HUF9QSU4oNiwgMTMpXSA9IHsgUFU1LCAyMCB9LAkvKiBTU0lfU0RBVEE1ICovCisJW1JDQVJfR1BfUElOKDYsIDEyKV0gPSB7IFBVNSwgMTkgfSwJLyogU1NJX1dTNSAqLworCVtSQ0FSX0dQX1BJTig2LCAxMSldID0geyBQVTUsIDE4IH0sCS8qIFNTSV9TQ0s1ICovCisJW1JDQVJfR1BfUElOKDYsIDEwKV0gPSB7IFBVNSwgMTcgfSwJLyogU1NJX1NEQVRBNCAqLworCVtSQ0FSX0dQX1BJTig2LCAgOSldID0geyBQVTUsIDE2IH0sCS8qIFNTSV9XUzQgKi8KKwlbUkNBUl9HUF9QSU4oNiwgIDgpXSA9IHsgUFU1LCAxNSB9LAkvKiBTU0lfU0NLNCAqLworCVtSQ0FSX0dQX1BJTig2LCAgNyldID0geyBQVTUsIDE0IH0sCS8qIFNTSV9TREFUQTMgKi8KKwlbUkNBUl9HUF9QSU4oNiwgIDYpXSA9IHsgUFU1LCAxMyB9LAkvKiBTU0lfV1MzNCAqLworCVtSQ0FSX0dQX1BJTig2LCAgNSldID0geyBQVTUsIDEyIH0sCS8qIFNTSV9TQ0szNCAqLworCVtSQ0FSX0dQX1BJTig2LCAgNCldID0geyBQVTUsIDExIH0sCS8qIFNTSV9TREFUQTJfQSAqLworCVtSQ0FSX0dQX1BJTig2LCAgMyldID0geyBQVTUsIDEwIH0sCS8qIFNTSV9TREFUQTFfQSAqLworCVtSQ0FSX0dQX1BJTig2LCAgMildID0geyBQVTUsICA5IH0sCS8qIFNTSV9TREFUQTAgKi8KKwlbUkNBUl9HUF9QSU4oNiwgIDEpXSA9IHsgUFU1LCAgOCB9LAkvKiBTU0lfV1MwMTIzOSAqLworCVtSQ0FSX0dQX1BJTig2LCAgMCldID0geyBQVTUsICA3IH0sCS8qIFNTSV9TQ0swMTIzOSAqLworCVtSQ0FSX0dQX1BJTig1LCAyNSldID0geyBQVTUsICA1IH0sCS8qIE1MQl9EQVQgKi8KKwlbUkNBUl9HUF9QSU4oNSwgMjQpXSA9IHsgUFU1LCAgNCB9LAkvKiBNTEJfU0lHICovCisJW1JDQVJfR1BfUElOKDUsIDIzKV0gPSB7IFBVNSwgIDMgfSwJLyogTUxCX0NMSyAqLworCVtSQ0FSX0dQX1BJTig1LCAyMildID0geyBQVTUsICAyIH0sCS8qIE1TSU9GMF9SWEQgKi8KKwlbUkNBUl9HUF9QSU4oNSwgMjEpXSA9IHsgUFU1LCAgMSB9LAkvKiBNU0lPRjBfU1MyICovCisJW1JDQVJfR1BfUElOKDUsIDIwKV0gPSB7IFBVNSwgIDAgfSwJLyogTVNJT0YwX1RYRCAqLworCisJW1JDQVJfR1BfUElOKDYsIDMxKV0gPSB7IFBVNiwgIDYgfSwJLyogVVNCMzFfT1ZDICovCisJW1JDQVJfR1BfUElOKDYsIDMwKV0gPSB7IFBVNiwgIDUgfSwJLyogVVNCMzFfUFdFTiAqLworCVtSQ0FSX0dQX1BJTig2LCAyOSldID0geyBQVTYsICA0IH0sCS8qIFVTQjMwX09WQyAqLworCVtSQ0FSX0dQX1BJTig2LCAyOCldID0geyBQVTYsICAzIH0sCS8qIFVTQjMwX1BXRU4gKi8KKwlbUkNBUl9HUF9QSU4oNiwgMjcpXSA9IHsgUFU2LCAgMiB9LAkvKiBVU0IxX09WQyAqLworCVtSQ0FSX0dQX1BJTig2LCAyNildID0geyBQVTYsICAxIH0sCS8qIFVTQjFfUFdFTiAqLworCVtSQ0FSX0dQX1BJTig2LCAyNSldID0geyBQVTYsICAwIH0sCS8qIFVTQjBfT1ZDICovCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IHI4YTc3OTVfcGlubXV4X2dldF9iaWFzKHN0cnVjdCBzaF9wZmMgKnBmYywKKwkJCQkJICAgIHVuc2lnbmVkIGludCBwaW4pCit7CisJdTMyIHJlZzsKKwl1MzIgYml0OworCisJaWYgKFdBUk5fT05fT05DRSghcHVsbHVwc1twaW5dLnJlZykpCisJCXJldHVybiBQSU5fQ09ORklHX0JJQVNfRElTQUJMRTsKKworCXJlZyA9IHB1bGx1cHNbcGluXS5yZWc7CisJYml0ID0gQklUKHB1bGx1cHNbcGluXS5iaXQpOworCisJaWYgKHNoX3BmY19yZWFkX3JlZyhwZmMsIFBVRU4gKyByZWcsIDMyKSAmIGJpdCkgeworCQlpZiAoc2hfcGZjX3JlYWRfcmVnKHBmYywgUFVEICsgcmVnLCAzMikgJiBiaXQpCisJCQlyZXR1cm4gUElOX0NPTkZJR19CSUFTX1BVTExfVVA7CisJCWVsc2UKKwkJCXJldHVybiBQSU5fQ09ORklHX0JJQVNfUFVMTF9ET1dOOworCX0gZWxzZQorCQlyZXR1cm4gUElOX0NPTkZJR19CSUFTX0RJU0FCTEU7Cit9CisKK3N0YXRpYyB2b2lkIHI4YTc3OTVfcGlubXV4X3NldF9iaWFzKHN0cnVjdCBzaF9wZmMgKnBmYywgdW5zaWduZWQgaW50IHBpbiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgYmlhcykKK3sKKwl1MzIgZW5hYmxlLCB1cGRvd247CisJdTMyIHJlZzsKKwl1MzIgYml0OworCisJaWYgKFdBUk5fT05fT05DRSghcHVsbHVwc1twaW5dLnJlZykpCisJCXJldHVybjsKKworCXJlZyA9IHB1bGx1cHNbcGluXS5yZWc7CisJYml0ID0gQklUKHB1bGx1cHNbcGluXS5iaXQpOworCisJZW5hYmxlID0gc2hfcGZjX3JlYWRfcmVnKHBmYywgUFVFTiArIHJlZywgMzIpICYgfmJpdDsKKwlpZiAoYmlhcyAhPSBQSU5fQ09ORklHX0JJQVNfRElTQUJMRSkKKwkJZW5hYmxlIHw9IGJpdDsKKworCXVwZG93biA9IHNoX3BmY19yZWFkX3JlZyhwZmMsIFBVRCArIHJlZywgMzIpICYgfmJpdDsKKwlpZiAoYmlhcyA9PSBQSU5fQ09ORklHX0JJQVNfUFVMTF9VUCkKKwkJdXBkb3duIHw9IGJpdDsKKworCXNoX3BmY193cml0ZV9yZWcocGZjLCBQVUQgKyByZWcsIDMyLCB1cGRvd24pOworCXNoX3BmY193cml0ZV9yZWcocGZjLCBQVUVOICsgcmVnLCAzMiwgZW5hYmxlKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9wZmNfc29jX29wZXJhdGlvbnMgcjhhNzc5NV9waW5tdXhfb3BzID0gewogCS5waW5fdG9fcG9jY3RybCA9IHI4YTc3OTVfcGluX3RvX3BvY2N0cmwsCisJLmdldF9iaWFzID0gcjhhNzc5NV9waW5tdXhfZ2V0X2JpYXMsCisJLnNldF9iaWFzID0gcjhhNzc5NV9waW5tdXhfc2V0X2JpYXMsCiB9OwogCiBjb25zdCBzdHJ1Y3Qgc2hfcGZjX3NvY19pbmZvIHI4YTc3OTVfcGlubXV4X2luZm8gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3Nzk2LmMgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3Nzk2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5YjY3MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGZjLXI4YTc3OTYuYwpAQCAtMCwwICsxLDI2NzEgQEAKKy8qCisgKiBSOEE3Nzk2IHByb2Nlc3NvciBzdXBwb3J0IC0gUEZDIGhhcmR3YXJlIGJsb2NrLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBSZW5lc2FzIEVsZWN0cm9uaWNzIENvcnAuCisgKgorICogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRoZSBkcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3Nzk1LmMKKyAqCisgKiBSLUNhciBHZW4zIHByb2Nlc3NvciBzdXBwb3J0IC0gUEZDIGhhcmR3YXJlIGJsb2NrLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSAgUmVuZXNhcyBFbGVjdHJvbmljcyBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJzaF9wZmMuaCIKKworI2RlZmluZSBDUFVfQUxMX1BPUlQoZm4sIHNmeCkJCQkJCQlcCisJUE9SVF9HUF8xNigwLCBmbiwgc2Z4KSwJCQkJCQlcCisJUE9SVF9HUF8yOSgxLCBmbiwgc2Z4KSwJCQkJCQlcCisJUE9SVF9HUF8xNSgyLCBmbiwgc2Z4KSwJCQkJCQlcCisJUE9SVF9HUF9DRkdfMTIoMywgZm4sIHNmeCwgU0hfUEZDX1BJTl9DRkdfSU9fVk9MVEFHRSksCQlcCisJUE9SVF9HUF8xKDMsIDEyLCBmbiwgc2Z4KSwJCQkJCVwKKwlQT1JUX0dQXzEoMywgMTMsIGZuLCBzZngpLAkJCQkJXAorCVBPUlRfR1BfMSgzLCAxNCwgZm4sIHNmeCksCQkJCQlcCisJUE9SVF9HUF8xKDMsIDE1LCBmbiwgc2Z4KSwJCQkJCVwKKwlQT1JUX0dQX0NGR18xOCg0LCBmbiwgc2Z4LCBTSF9QRkNfUElOX0NGR19JT19WT0xUQUdFKSwJCVwKKwlQT1JUX0dQXzI2KDUsIGZuLCBzZngpLAkJCQkJCVwKKwlQT1JUX0dQXzMyKDYsIGZuLCBzZngpLAkJCQkJCVwKKwlQT1JUX0dQXzQoNywgZm4sIHNmeCkKKy8qCisgKiBGXygpIDoganVzdCBpbmZvcm1hdGlvbgorICogRk0oKSA6IG1hY3JvIGZvciBGTl94eHggLyB4eHhfTUFSSworICovCisKKy8qIEdQU1IwICovCisjZGVmaW5lIEdQU1IwXzE1CUZfKEQxNSwJCQlJUDdfMTFfOCkKKyNkZWZpbmUgR1BTUjBfMTQJRl8oRDE0LAkJCUlQN183XzQpCisjZGVmaW5lIEdQU1IwXzEzCUZfKEQxMywJCQlJUDdfM18wKQorI2RlZmluZSBHUFNSMF8xMglGXyhEMTIsCQkJSVA2XzMxXzI4KQorI2RlZmluZSBHUFNSMF8xMQlGXyhEMTEsCQkJSVA2XzI3XzI0KQorI2RlZmluZSBHUFNSMF8xMAlGXyhEMTAsCQkJSVA2XzIzXzIwKQorI2RlZmluZSBHUFNSMF85CQlGXyhEOSwJCQlJUDZfMTlfMTYpCisjZGVmaW5lIEdQU1IwXzgJCUZfKEQ4LAkJCUlQNl8xNV8xMikKKyNkZWZpbmUgR1BTUjBfNwkJRl8oRDcsCQkJSVA2XzExXzgpCisjZGVmaW5lIEdQU1IwXzYJCUZfKEQ2LAkJCUlQNl83XzQpCisjZGVmaW5lIEdQU1IwXzUJCUZfKEQ1LAkJCUlQNl8zXzApCisjZGVmaW5lIEdQU1IwXzQJCUZfKEQ0LAkJCUlQNV8zMV8yOCkKKyNkZWZpbmUgR1BTUjBfMwkJRl8oRDMsCQkJSVA1XzI3XzI0KQorI2RlZmluZSBHUFNSMF8yCQlGXyhEMiwJCQlJUDVfMjNfMjApCisjZGVmaW5lIEdQU1IwXzEJCUZfKEQxLAkJCUlQNV8xOV8xNikKKyNkZWZpbmUgR1BTUjBfMAkJRl8oRDAsCQkJSVA1XzE1XzEyKQorCisvKiBHUFNSMSAqLworI2RlZmluZSBHUFNSMV8yOAlGTShDTEtPVVQpCisjZGVmaW5lIEdQU1IxXzI3CUZfKEVYX1dBSVQwX0EsCQlJUDVfMTFfOCkKKyNkZWZpbmUgR1BTUjFfMjYJRl8oV0UxX04sCQlJUDVfN180KQorI2RlZmluZSBHUFNSMV8yNQlGXyhXRTBfTiwJCUlQNV8zXzApCisjZGVmaW5lIEdQU1IxXzI0CUZfKFJEX1dSX04sCQlJUDRfMzFfMjgpCisjZGVmaW5lIEdQU1IxXzIzCUZfKFJEX04sCQlJUDRfMjdfMjQpCisjZGVmaW5lIEdQU1IxXzIyCUZfKEJTX04sCQlJUDRfMjNfMjApCisjZGVmaW5lIEdQU1IxXzIxCUZfKENTMV9OX0EyNiwJCUlQNF8xOV8xNikKKyNkZWZpbmUgR1BTUjFfMjAJRl8oQ1MwX04sCQlJUDRfMTVfMTIpCisjZGVmaW5lIEdQU1IxXzE5CUZfKEExOSwJCQlJUDRfMTFfOCkKKyNkZWZpbmUgR1BTUjFfMTgJRl8oQTE4LAkJCUlQNF83XzQpCisjZGVmaW5lIEdQU1IxXzE3CUZfKEExNywJCQlJUDRfM18wKQorI2RlZmluZSBHUFNSMV8xNglGXyhBMTYsCQkJSVAzXzMxXzI4KQorI2RlZmluZSBHUFNSMV8xNQlGXyhBMTUsCQkJSVAzXzI3XzI0KQorI2RlZmluZSBHUFNSMV8xNAlGXyhBMTQsCQkJSVAzXzIzXzIwKQorI2RlZmluZSBHUFNSMV8xMwlGXyhBMTMsCQkJSVAzXzE5XzE2KQorI2RlZmluZSBHUFNSMV8xMglGXyhBMTIsCQkJSVAzXzE1XzEyKQorI2RlZmluZSBHUFNSMV8xMQlGXyhBMTEsCQkJSVAzXzExXzgpCisjZGVmaW5lIEdQU1IxXzEwCUZfKEExMCwJCQlJUDNfN180KQorI2RlZmluZSBHUFNSMV85CQlGXyhBOSwJCQlJUDNfM18wKQorI2RlZmluZSBHUFNSMV84CQlGXyhBOCwJCQlJUDJfMzFfMjgpCisjZGVmaW5lIEdQU1IxXzcJCUZfKEE3LAkJCUlQMl8yN18yNCkKKyNkZWZpbmUgR1BTUjFfNgkJRl8oQTYsCQkJSVAyXzIzXzIwKQorI2RlZmluZSBHUFNSMV81CQlGXyhBNSwJCQlJUDJfMTlfMTYpCisjZGVmaW5lIEdQU1IxXzQJCUZfKEE0LAkJCUlQMl8xNV8xMikKKyNkZWZpbmUgR1BTUjFfMwkJRl8oQTMsCQkJSVAyXzExXzgpCisjZGVmaW5lIEdQU1IxXzIJCUZfKEEyLAkJCUlQMl83XzQpCisjZGVmaW5lIEdQU1IxXzEJCUZfKEExLAkJCUlQMl8zXzApCisjZGVmaW5lIEdQU1IxXzAJCUZfKEEwLAkJCUlQMV8zMV8yOCkKKworLyogR1BTUjIgKi8KKyNkZWZpbmUgR1BTUjJfMTQJRl8oQVZCX0FWVFBfQ0FQVFVSRV9BLAlJUDBfMjNfMjApCisjZGVmaW5lIEdQU1IyXzEzCUZfKEFWQl9BVlRQX01BVENIX0EsCUlQMF8xOV8xNikKKyNkZWZpbmUgR1BTUjJfMTIJRl8oQVZCX0xJTkssCQlJUDBfMTVfMTIpCisjZGVmaW5lIEdQU1IyXzExCUZfKEFWQl9QSFlfSU5ULAkJSVAwXzExXzgpCisjZGVmaW5lIEdQU1IyXzEwCUZfKEFWQl9NQUdJQywJCUlQMF83XzQpCisjZGVmaW5lIEdQU1IyXzkJCUZfKEFWQl9NREMsCQlJUDBfM18wKQorI2RlZmluZSBHUFNSMl84CQlGXyhQV00yX0EsCQlJUDFfMjdfMjQpCisjZGVmaW5lIEdQU1IyXzcJCUZfKFBXTTFfQSwJCUlQMV8yM18yMCkKKyNkZWZpbmUgR1BTUjJfNgkJRl8oUFdNMCwJCUlQMV8xOV8xNikKKyNkZWZpbmUgR1BTUjJfNQkJRl8oSVJRNSwJCUlQMV8xNV8xMikKKyNkZWZpbmUgR1BTUjJfNAkJRl8oSVJRNCwJCUlQMV8xMV84KQorI2RlZmluZSBHUFNSMl8zCQlGXyhJUlEzLAkJSVAxXzdfNCkKKyNkZWZpbmUgR1BTUjJfMgkJRl8oSVJRMiwJCUlQMV8zXzApCisjZGVmaW5lIEdQU1IyXzEJCUZfKElSUTEsCQlJUDBfMzFfMjgpCisjZGVmaW5lIEdQU1IyXzAJCUZfKElSUTAsCQlJUDBfMjdfMjQpCisKKy8qIEdQU1IzICovCisjZGVmaW5lIEdQU1IzXzE1CUZfKFNEMV9XUCwJCUlQMTFfMjNfMjApCisjZGVmaW5lIEdQU1IzXzE0CUZfKFNEMV9DRCwJCUlQMTFfMTlfMTYpCisjZGVmaW5lIEdQU1IzXzEzCUZfKFNEMF9XUCwJCUlQMTFfMTVfMTIpCisjZGVmaW5lIEdQU1IzXzEyCUZfKFNEMF9DRCwJCUlQMTFfMTFfOCkKKyNkZWZpbmUgR1BTUjNfMTEJRl8oU0QxX0RBVDMsCQlJUDhfMzFfMjgpCisjZGVmaW5lIEdQU1IzXzEwCUZfKFNEMV9EQVQyLAkJSVA4XzI3XzI0KQorI2RlZmluZSBHUFNSM185CQlGXyhTRDFfREFUMSwJCUlQOF8yM18yMCkKKyNkZWZpbmUgR1BTUjNfOAkJRl8oU0QxX0RBVDAsCQlJUDhfMTlfMTYpCisjZGVmaW5lIEdQU1IzXzcJCUZfKFNEMV9DTUQsCQlJUDhfMTVfMTIpCisjZGVmaW5lIEdQU1IzXzYJCUZfKFNEMV9DTEssCQlJUDhfMTFfOCkKKyNkZWZpbmUgR1BTUjNfNQkJRl8oU0QwX0RBVDMsCQlJUDhfN180KQorI2RlZmluZSBHUFNSM180CQlGXyhTRDBfREFUMiwJCUlQOF8zXzApCisjZGVmaW5lIEdQU1IzXzMJCUZfKFNEMF9EQVQxLAkJSVA3XzMxXzI4KQorI2RlZmluZSBHUFNSM18yCQlGXyhTRDBfREFUMCwJCUlQN18yN18yNCkKKyNkZWZpbmUgR1BTUjNfMQkJRl8oU0QwX0NNRCwJCUlQN18yM18yMCkKKyNkZWZpbmUgR1BTUjNfMAkJRl8oU0QwX0NMSywJCUlQN18xOV8xNikKKworLyogR1BTUjQgKi8KKyNkZWZpbmUgR1BTUjRfMTcJRl8oU0QzX0RTLAkJSVAxMV8xMV84KQorI2RlZmluZSBHUFNSNF8xNglGXyhTRDNfREFUNywJCUlQMTBfN180KQorI2RlZmluZSBHUFNSNF8xNQlGXyhTRDNfREFUNiwJCUlQMTBfM18wKQorI2RlZmluZSBHUFNSNF8xNAlGXyhTRDNfREFUNSwJCUlQOV8zMV8yOCkKKyNkZWZpbmUgR1BTUjRfMTMJRl8oU0QzX0RBVDQsCQlJUDlfMjdfMjQpCisjZGVmaW5lIEdQU1I0XzEyCUZfKFNEM19EQVQzLAkJSVAxMF8xOV8xNikKKyNkZWZpbmUgR1BTUjRfMTEJRl8oU0QzX0RBVDIsCQlJUDEwXzE1XzEyKQorI2RlZmluZSBHUFNSNF8xMAlGXyhTRDNfREFUMSwJCUlQMTBfMTFfOCkKKyNkZWZpbmUgR1BTUjRfOQkJRl8oU0QzX0RBVDAsCQlJUDEwXzdfNCkKKyNkZWZpbmUgR1BTUjRfOAkJRl8oU0QzX0NNRCwJCUlQMTBfM18wKQorI2RlZmluZSBHUFNSNF83CQlGXyhTRDNfQ0xLLAkJSVA5XzMxXzI4KQorI2RlZmluZSBHUFNSNF82CQlGXyhTRDJfRFMsCQlJUDlfMjNfMjApCisjZGVmaW5lIEdQU1I0XzUJCUZfKFNEMl9EQVQzLAkJSVA5XzE5XzE2KQorI2RlZmluZSBHUFNSNF80CQlGXyhTRDJfREFUMiwJCUlQOV8xNV8xMikKKyNkZWZpbmUgR1BTUjRfMwkJRl8oU0QyX0RBVDEsCQlJUDlfMTFfOCkKKyNkZWZpbmUgR1BTUjRfMgkJRl8oU0QyX0RBVDAsCQlJUDlfN180KQorI2RlZmluZSBHUFNSNF8xCQlGXyhTRDJfQ01ELAkJSVA5XzdfNCkKKyNkZWZpbmUgR1BTUjRfMAkJRl8oU0QyX0NMSywJCUlQOV8zXzApCisKKy8qIEdQU1I1ICovCisjZGVmaW5lIEdQU1I1XzI1CUZfKE1MQl9EQVQsCQlJUDE0XzE5XzE2KQorI2RlZmluZSBHUFNSNV8yNAlGXyhNTEJfU0lHLAkJSVAxNF8xNV8xMikKKyNkZWZpbmUgR1BTUjVfMjMJRl8oTUxCX0NMSywJCUlQMTRfMTFfOCkKKyNkZWZpbmUgR1BTUjVfMjIJRk0oTVNJT0YwX1JYRCkKKyNkZWZpbmUgR1BTUjVfMjEJRl8oTVNJT0YwX1NTMiwJCUlQMTRfN180KQorI2RlZmluZSBHUFNSNV8yMAlGTShNU0lPRjBfVFhEKQorI2RlZmluZSBHUFNSNV8xOQlGXyhNU0lPRjBfU1MxLAkJSVAxNF8zXzApCisjZGVmaW5lIEdQU1I1XzE4CUZfKE1TSU9GMF9TWU5DLAkJSVAxM18zMV8yOCkKKyNkZWZpbmUgR1BTUjVfMTcJRk0oTVNJT0YwX1NDSykKKyNkZWZpbmUgR1BTUjVfMTYJRl8oSFJUUzBfTiwJCUlQMTNfMjdfMjQpCisjZGVmaW5lIEdQU1I1XzE1CUZfKEhDVFMwX04sCQlJUDEzXzIzXzIwKQorI2RlZmluZSBHUFNSNV8xNAlGXyhIVFgwLAkJSVAxM18xOV8xNikKKyNkZWZpbmUgR1BTUjVfMTMJRl8oSFJYMCwJCUlQMTNfMTVfMTIpCisjZGVmaW5lIEdQU1I1XzEyCUZfKEhTQ0swLAkJSVAxM18xMV84KQorI2RlZmluZSBHUFNSNV8xMQlGXyhSWDJfQSwJCUlQMTNfN180KQorI2RlZmluZSBHUFNSNV8xMAlGXyhUWDJfQSwJCUlQMTNfM18wKQorI2RlZmluZSBHUFNSNV85CQlGXyhTQ0syLAkJSVAxMl8zMV8yOCkKKyNkZWZpbmUgR1BTUjVfOAkJRl8oUlRTMV9OX1RBTlMsCQlJUDEyXzI3XzI0KQorI2RlZmluZSBHUFNSNV83CQlGXyhDVFMxX04sCQlJUDEyXzIzXzIwKQorI2RlZmluZSBHUFNSNV82CQlGXyhUWDFfQSwJCUlQMTJfMTlfMTYpCisjZGVmaW5lIEdQU1I1XzUJCUZfKFJYMV9BLAkJSVAxMl8xNV8xMikKKyNkZWZpbmUgR1BTUjVfNAkJRl8oUlRTMF9OX1RBTlMsCQlJUDEyXzExXzgpCisjZGVmaW5lIEdQU1I1XzMJCUZfKENUUzBfTiwJCUlQMTJfN180KQorI2RlZmluZSBHUFNSNV8yCQlGXyhUWDAsCQkJSVAxMl8zXzApCisjZGVmaW5lIEdQU1I1XzEJCUZfKFJYMCwJCQlJUDExXzMxXzI4KQorI2RlZmluZSBHUFNSNV8wCQlGXyhTQ0swLAkJSVAxMV8yN18yNCkKKworLyogR1BTUjYgKi8KKyNkZWZpbmUgR1BTUjZfMzEJRl8oR1A2XzMxLAkJSVAxOF83XzQpCisjZGVmaW5lIEdQU1I2XzMwCUZfKEdQNl8zMCwJCUlQMThfM18wKQorI2RlZmluZSBHUFNSNl8yOQlGXyhVU0IzMF9PVkMsCQlJUDE3XzMxXzI4KQorI2RlZmluZSBHUFNSNl8yOAlGXyhVU0IzMF9QV0VOLAkJSVAxN18yN18yNCkKKyNkZWZpbmUgR1BTUjZfMjcJRl8oVVNCMV9PVkMsCQlJUDE3XzIzXzIwKQorI2RlZmluZSBHUFNSNl8yNglGXyhVU0IxX1BXRU4sCQlJUDE3XzE5XzE2KQorI2RlZmluZSBHUFNSNl8yNQlGXyhVU0IwX09WQywJCUlQMTdfMTVfMTIpCisjZGVmaW5lIEdQU1I2XzI0CUZfKFVTQjBfUFdFTiwJCUlQMTdfMTFfOCkKKyNkZWZpbmUgR1BTUjZfMjMJRl8oQVVESU9fQ0xLQl9CLAlJUDE3XzdfNCkKKyNkZWZpbmUgR1BTUjZfMjIJRl8oQVVESU9fQ0xLQV9BLAlJUDE3XzNfMCkKKyNkZWZpbmUgR1BTUjZfMjEJRl8oU1NJX1NEQVRBOV9BLAlJUDE2XzMxXzI4KQorI2RlZmluZSBHUFNSNl8yMAlGXyhTU0lfU0RBVEE4LAkJSVAxNl8yN18yNCkKKyNkZWZpbmUgR1BTUjZfMTkJRl8oU1NJX1NEQVRBNywJCUlQMTZfMjNfMjApCisjZGVmaW5lIEdQU1I2XzE4CUZfKFNTSV9XUzc4LAkJSVAxNl8xOV8xNikKKyNkZWZpbmUgR1BTUjZfMTcJRl8oU1NJX1NDSzc4LAkJSVAxNl8xNV8xMikKKyNkZWZpbmUgR1BTUjZfMTYJRl8oU1NJX1NEQVRBNiwJCUlQMTZfMTFfOCkKKyNkZWZpbmUgR1BTUjZfMTUJRl8oU1NJX1dTNiwJCUlQMTZfN180KQorI2RlZmluZSBHUFNSNl8xNAlGXyhTU0lfU0NLNiwJCUlQMTZfM18wKQorI2RlZmluZSBHUFNSNl8xMwlGTShTU0lfU0RBVEE1KQorI2RlZmluZSBHUFNSNl8xMglGTShTU0lfV1M1KQorI2RlZmluZSBHUFNSNl8xMQlGTShTU0lfU0NLNSkKKyNkZWZpbmUgR1BTUjZfMTAJRl8oU1NJX1NEQVRBNCwJCUlQMTVfMzFfMjgpCisjZGVmaW5lIEdQU1I2XzkJCUZfKFNTSV9XUzQsCQlJUDE1XzI3XzI0KQorI2RlZmluZSBHUFNSNl84CQlGXyhTU0lfU0NLNCwJCUlQMTVfMjNfMjApCisjZGVmaW5lIEdQU1I2XzcJCUZfKFNTSV9TREFUQTMsCQlJUDE1XzE5XzE2KQorI2RlZmluZSBHUFNSNl82CQlGXyhTU0lfV1MzNCwJCUlQMTVfMTVfMTIpCisjZGVmaW5lIEdQU1I2XzUJCUZfKFNTSV9TQ0szNCwJCUlQMTVfMTFfOCkKKyNkZWZpbmUgR1BTUjZfNAkJRl8oU1NJX1NEQVRBMl9BLAlJUDE1XzdfNCkKKyNkZWZpbmUgR1BTUjZfMwkJRl8oU1NJX1NEQVRBMV9BLAlJUDE1XzNfMCkKKyNkZWZpbmUgR1BTUjZfMgkJRl8oU1NJX1NEQVRBMCwJCUlQMTRfMzFfMjgpCisjZGVmaW5lIEdQU1I2XzEJCUZfKFNTSV9XUzAxMjksCQlJUDE0XzI3XzI0KQorI2RlZmluZSBHUFNSNl8wCQlGXyhTU0lfU0NLMDEyOSwJCUlQMTRfMjNfMjApCisKKy8qIEdQU1I3ICovCisjZGVmaW5lIEdQU1I3XzMJCUZNKEdQN18wMykKKyNkZWZpbmUgR1BTUjdfMgkJRk0oSERNSTBfQ0VDKQorI2RlZmluZSBHUFNSN18xCQlGTShBVlMyKQorI2RlZmluZSBHUFNSN18wCQlGTShBVlMxKQorCisKKy8qIElQU1J4ICovCQkvKiAwICovCQkJLyogMSAqLwkJLyogMiAqLwkJCS8qIDMgKi8JCQkJLyogNCAqLwkJLyogNSAqLwkJLyogNiAqLwkJCS8qIDcgKi8JCS8qIDggKi8JCQkvKiA5ICovCQkvKiBBICovCQkvKiBCICovCQkvKiBDIC0gRiAqLworI2RlZmluZSBJUDBfM18wCQlGTShBVkJfTURDKQkJRl8oMCwgMCkJRk0oTVNJT0YyX1NTMl9DKQlGXygwLCAwKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAwXzdfNAkJRk0oQVZCX01BR0lDKQkJRl8oMCwgMCkJRk0oTVNJT0YyX1NTMV9DKQlGTShTQ0s0X0EpCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDBfMTFfOAlGTShBVkJfUEhZX0lOVCkJCUZfKDAsIDApCUZNKE1TSU9GMl9TWU5DX0MpCUZNKFJYNF9BKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAwXzE1XzEyCUZNKEFWQl9MSU5LKQkJRl8oMCwgMCkJRk0oTVNJT0YyX1NDS19DKQlGTShUWDRfQSkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMF8xOV8xNglGTShBVkJfQVZUUF9NQVRDSF9BKQlGXygwLCAwKQlGTShNU0lPRjJfUlhEX0MpCUZNKENUUzRfTl9BKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAwXzIzXzIwCUZNKEFWQl9BVlRQX0NBUFRVUkVfQSkJRl8oMCwgMCkJRk0oTVNJT0YyX1RYRF9DKQlGTShSVFM0X05fVEFOU19BKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDBfMjdfMjQJRk0oSVJRMCkJCUZNKFFQT0xCKQlGXygwLCAwKQkJRk0oRFVfQ0RFKQkJCUZNKFZJNF9EQVRBMF9CKSBGTShDQU4wX1RYX0IpCUZNKENBTkZEMF9UWF9CKQkJRk0oTVNJT0YzX1NTMV9FKSBGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAwXzMxXzI4CUZNKElSUTEpCQlGTShRUE9MQSkJRl8oMCwgMCkJCUZNKERVX0RJU1ApCQkJRk0oVkk0X0RBVEExX0IpIEZNKENBTjBfUlhfQikJRk0oQ0FORkQwX1JYX0IpCQlGTShNU0lPRjNfU1MyX0UpIEZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDFfM18wCQlGTShJUlEyKQkJRk0oUUNQVl9RREUpCUZfKDAsIDApCQlGTShEVV9FWE9EREZfRFVfT0RERl9ESVNQX0NERSkJRk0oVkk0X0RBVEEyX0IpIEZfKDAsIDApCUZfKDAsIDApCQlGTShNU0lPRjNfU1lOQ19FKSBGXygwLCAwKQkJRk0oUFdNM19CKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDFfN180CQlGTShJUlEzKQkJRk0oUVNUVkJfUVZFKQlGTShBMjUpCQkJRk0oRFVfRE9UQ0xLT1VUMSkJCUZNKFZJNF9EQVRBM19CKSBGXygwLCAwKQlGXygwLCAwKQkJRk0oTVNJT0YzX1NDS19FKSBGXygwLCAwKQkJRk0oUFdNNF9CKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDFfMTFfOAlGTShJUlE0KQkJRk0oUVNUSF9RSFMpCUZNKEEyNCkJCQlGTShEVV9FWEhTWU5DX0RVX0hTWU5DKQkJRk0oVkk0X0RBVEE0X0IpIEZfKDAsIDApCUZfKDAsIDApCQlGTShNU0lPRjNfUlhEX0UpIEZfKDAsIDApCQlGTShQV001X0IpCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMV8xNV8xMglGTShJUlE1KQkJRk0oUVNUQl9RSEUpCUZNKEEyMykJCQlGTShEVV9FWFZTWU5DX0RVX1ZTWU5DKQkJRk0oVkk0X0RBVEE1X0IpIEZfKDAsIDApCUZfKDAsIDApCQlGTShNU0lPRjNfVFhEX0UpIEZfKDAsIDApCQlGTShQV002X0IpCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMV8xOV8xNglGTShQV00wKQkJRk0oQVZCX0FWVFBfUFBTKUZNKEEyMikJCQlGXygwLCAwKQkJCUZNKFZJNF9EQVRBNl9CKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKElFQ0xLX0IpCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMV8yM18yMAlGTShQV00xX0EpCQlGXygwLCAwKQlGTShBMjEpCQkJRk0oSFJYM19EKQkJCUZNKFZJNF9EQVRBN19CKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKElFUlhfQikJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxXzI3XzI0CUZNKFBXTTJfQSkJCUZfKDAsIDApCUZNKEEyMCkJCQlGTShIVFgzX0QpCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGTShJRVRYX0IpCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMV8zMV8yOAlGTShBMCkJCQlGTShMQ0RPVVQxNikJRk0oTVNJT0YzX1NZTkNfQikJRl8oMCwgMCkJCQlGTShWSTRfREFUQTgpCUZfKDAsIDApCUZNKERVX0RCMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGTShQV00zX0EpCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMl8zXzAJCUZNKEExKQkJCUZNKExDRE9VVDE3KQlGTShNU0lPRjNfVFhEX0IpCUZfKDAsIDApCQkJRk0oVkk0X0RBVEE5KQlGXygwLCAwKQlGTShEVV9EQjEpCQlGXygwLCAwKQlGXygwLCAwKQkJRk0oUFdNNF9BKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDJfN180CQlGTShBMikJCQlGTShMQ0RPVVQxOCkJRk0oTVNJT0YzX1NDS19CKQlGXygwLCAwKQkJCUZNKFZJNF9EQVRBMTApCUZfKDAsIDApCUZNKERVX0RCMikJCUZfKDAsIDApCUZfKDAsIDApCQlGTShQV001X0EpCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMl8xMV84CUZNKEEzKQkJCUZNKExDRE9VVDE5KQlGTShNU0lPRjNfUlhEX0IpCUZfKDAsIDApCQkJRk0oVkk0X0RBVEExMSkJRl8oMCwgMCkJRk0oRFVfREIzKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKFBXTTZfQSkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAyXzE1XzEyCUZNKEE0KQkJCUZNKExDRE9VVDIwKQlGTShNU0lPRjNfU1MxX0IpCUZfKDAsIDApCQkJRk0oVkk0X0RBVEExMikJRk0oVkk1X0RBVEExMikJRk0oRFVfREI0KQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMl8xOV8xNglGTShBNSkJCQlGTShMQ0RPVVQyMSkJRk0oTVNJT0YzX1NTMl9CKQlGTShTQ0s0X0IpCQkJRk0oVkk0X0RBVEExMykJRk0oVkk1X0RBVEExMykJRk0oRFVfREI1KQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMl8yM18yMAlGTShBNikJCQlGTShMQ0RPVVQyMikJRk0oTVNJT0YyX1NTMV9BKQlGTShSWDRfQikJCQlGTShWSTRfREFUQTE0KQlGTShWSTVfREFUQTE0KQlGTShEVV9EQjYpCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAyXzI3XzI0CUZNKEE3KQkJCUZNKExDRE9VVDIzKQlGTShNU0lPRjJfU1MyX0EpCUZNKFRYNF9CKQkJCUZNKFZJNF9EQVRBMTUpCUZNKFZJNV9EQVRBMTUpCUZNKERVX0RCNykJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDJfMzFfMjgJRk0oQTgpCQkJRk0oUlgzX0IpCUZNKE1TSU9GMl9TWU5DX0EpCUZNKEhSWDRfQikJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRk0oU0RBNl9BKQlGTShBVkJfQVZUUF9NQVRDSF9CKQlGTShQV00xX0IpCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQM18zXzAJCUZNKEE5KQkJCUZfKDAsIDApCUZNKE1TSU9GMl9TQ0tfQSkJRk0oQ1RTNF9OX0IpCQkJRl8oMCwgMCkJRk0oVkk1X1ZTWU5DX04pCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAzXzdfNAkJRk0oQTEwKQkJCUZfKDAsIDApCUZNKE1TSU9GMl9SWERfQSkJRk0oUlRTNF9OX1RBTlNfQikJCUZfKDAsIDApCUZNKFZJNV9IU1lOQ19OKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQM18xMV84CUZNKEExMSkJCQlGTShUWDNfQikJRk0oTVNJT0YyX1RYRF9BKQlGTShIVFg0X0IpCQkJRk0oSFNDSzQpCUZNKFZJNV9GSUVMRCkJRl8oMCwgMCkJCUZNKFNDTDZfQSkJRk0oQVZCX0FWVFBfQ0FQVFVSRV9CKQlGTShQV00yX0IpCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisKKy8qIElQU1J4ICovCQkvKiAwICovCQkJLyogMSAqLwkJLyogMiAqLwkJCS8qIDMgKi8JCQkJLyogNCAqLwkJLyogNSAqLwkJLyogNiAqLwkJCS8qIDcgKi8JCS8qIDggKi8JCQkvKiA5ICovCQkvKiBBICovCQkvKiBCICovCQkvKiBDIC0gRiAqLworI2RlZmluZSBJUDNfMTVfMTIJRk0oQTEyKQkJCUZNKExDRE9VVDEyKQlGTShNU0lPRjNfU0NLX0MpCUZfKDAsIDApCQkJRk0oSFJYNF9BKQlGTShWSTVfREFUQTgpCUZNKERVX0RHNCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDNfMTlfMTYJRk0oQTEzKQkJCUZNKExDRE9VVDEzKQlGTShNU0lPRjNfU1lOQ19DKQlGXygwLCAwKQkJCUZNKEhUWDRfQSkJRk0oVkk1X0RBVEE5KQlGTShEVV9ERzUpCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAzXzIzXzIwCUZNKEExNCkJCQlGTShMQ0RPVVQxNCkJRk0oTVNJT0YzX1JYRF9DKQlGXygwLCAwKQkJCUZNKEhDVFM0X04pCUZNKFZJNV9EQVRBMTApCUZNKERVX0RHNikJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDNfMjdfMjQJRk0oQTE1KQkJCUZNKExDRE9VVDE1KQlGTShNU0lPRjNfVFhEX0MpCUZfKDAsIDApCQkJRk0oSFJUUzRfTikJRk0oVkk1X0RBVEExMSkJRk0oRFVfREc3KQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQM18zMV8yOAlGTShBMTYpCQkJRk0oTENET1VUOCkJRl8oMCwgMCkJCUZfKDAsIDApCQkJRk0oVkk0X0ZJRUxEKQlGXygwLCAwKQlGTShEVV9ERzApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA0XzNfMAkJRk0oQTE3KQkJCUZNKExDRE9VVDkpCUZfKDAsIDApCQlGXygwLCAwKQkJCUZNKFZJNF9WU1lOQ19OKQlGXygwLCAwKQlGTShEVV9ERzEpCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA0XzdfNAkJRk0oQTE4KQkJCUZNKExDRE9VVDEwKQlGXygwLCAwKQkJRl8oMCwgMCkJCQlGTShWSTRfSFNZTkNfTikJRl8oMCwgMCkJRk0oRFVfREcyKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNF8xMV84CUZNKEExOSkJCQlGTShMQ0RPVVQxMSkJRl8oMCwgMCkJCUZfKDAsIDApCQkJRk0oVkk0X0NMS0VOQikJRl8oMCwgMCkJRk0oRFVfREczKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNF8xNV8xMglGTShDUzBfTikJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQkJCUZfKDAsIDApCUZNKFZJNV9DTEtFTkIpCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA0XzE5XzE2CUZNKENTMV9OX0EyNikJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQkJCUZfKDAsIDApCUZNKFZJNV9DTEspCUZfKDAsIDApCQlGTShFWF9XQUlUMF9CKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA0XzIzXzIwCUZNKEJTX04pCQlGTShRU1RWQV9RVlMpCUZNKE1TSU9GM19TQ0tfRCkJRk0oU0NLMykJCQlGTShIU0NLMykJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZNKENBTjFfVFgpCQlGTShDQU5GRDFfVFgpCUZNKElFVFhfQSkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA0XzI3XzI0CUZNKFJEX04pCQlGXygwLCAwKQlGTShNU0lPRjNfU1lOQ19EKQlGTShSWDNfQSkJCQlGTShIUlgzX0EpCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGTShDQU4wX1RYX0EpCQlGTShDQU5GRDBfVFhfQSkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA0XzMxXzI4CUZNKFJEX1dSX04pCQlGXygwLCAwKQlGTShNU0lPRjNfUlhEX0QpCUZNKFRYM19BKQkJCUZNKEhUWDNfQSkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZNKENBTjBfUlhfQSkJCUZNKENBTkZEMF9SWF9BKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDVfM18wCQlGTShXRTBfTikJCUZfKDAsIDApCUZNKE1TSU9GM19UWERfRCkJRk0oQ1RTM19OKQkJCUZNKEhDVFMzX04pCUZfKDAsIDApCUZfKDAsIDApCQlGTShTQ0w2X0IpCUZNKENBTl9DTEspCQlGXygwLCAwKQlGTShJRUNMS19BKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDVfN180CQlGTShXRTFfTikJCUZfKDAsIDApCUZNKE1TSU9GM19TUzFfRCkJRk0oUlRTM19OX1RBTlMpCQkJRk0oSFJUUzNfTikJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKFNEQTZfQikJRk0oQ0FOMV9SWCkJCUZNKENBTkZEMV9SWCkJRk0oSUVSWF9BKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDVfMTFfOAlGTShFWF9XQUlUMF9BKQkJRk0oUUNMSykJRl8oMCwgMCkJCUZfKDAsIDApCQkJRk0oVkk0X0NMSykJRl8oMCwgMCkJRk0oRFVfRE9UQ0xLT1VUMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNV8xNV8xMglGTShEMCkJCQlGTShNU0lPRjJfU1MxX0IpRk0oTVNJT0YzX1NDS19BKQlGXygwLCAwKQkJCUZNKFZJNF9EQVRBMTYpCUZNKFZJNV9EQVRBMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDVfMTlfMTYJRk0oRDEpCQkJRk0oTVNJT0YyX1NTMl9CKUZNKE1TSU9GM19TWU5DX0EpCUZfKDAsIDApCQkJRk0oVkk0X0RBVEExNykJRk0oVkk1X0RBVEExKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNV8yM18yMAlGTShEMikJCQlGXygwLCAwKQlGTShNU0lPRjNfUlhEX0EpCUZfKDAsIDApCQkJRk0oVkk0X0RBVEExOCkJRk0oVkk1X0RBVEEyKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNV8yN18yNAlGTShEMykJCQlGXygwLCAwKQlGTShNU0lPRjNfVFhEX0EpCUZfKDAsIDApCQkJRk0oVkk0X0RBVEExOSkJRk0oVkk1X0RBVEEzKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNV8zMV8yOAlGTShENCkJCQlGTShNU0lPRjJfU0NLX0IpRl8oMCwgMCkJCUZfKDAsIDApCQkJRk0oVkk0X0RBVEEyMCkJRk0oVkk1X0RBVEE0KQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNl8zXzAJCUZNKEQ1KQkJCUZNKE1TSU9GMl9TWU5DX0IpRl8oMCwgMCkJCUZfKDAsIDApCQkJRk0oVkk0X0RBVEEyMSkJRk0oVkk1X0RBVEE1KQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNl83XzQJCUZNKEQ2KQkJCUZNKE1TSU9GMl9SWERfQilGXygwLCAwKQkJRl8oMCwgMCkJCQlGTShWSTRfREFUQTIyKQlGTShWSTVfREFUQTYpCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA2XzExXzgJRk0oRDcpCQkJRk0oTVNJT0YyX1RYRF9CKUZfKDAsIDApCQlGXygwLCAwKQkJCUZNKFZJNF9EQVRBMjMpCUZNKFZJNV9EQVRBNykJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDZfMTVfMTIJRk0oRDgpCQkJRk0oTENET1VUMCkJRk0oTVNJT0YyX1NDS19EKQlGTShTQ0s0X0MpCQkJRk0oVkk0X0RBVEEwX0EpCUZfKDAsIDApCUZNKERVX0RSMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDZfMTlfMTYJRk0oRDkpCQkJRk0oTENET1VUMSkJRk0oTVNJT0YyX1NZTkNfRCkJRl8oMCwgMCkJCQlGTShWSTRfREFUQTFfQSkJRl8oMCwgMCkJRk0oRFVfRFIxKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNl8yM18yMAlGTShEMTApCQkJRk0oTENET1VUMikJRk0oTVNJT0YyX1JYRF9EKQlGTShIUlgzX0IpCQkJRk0oVkk0X0RBVEEyX0EpCUZNKENUUzRfTl9DKQlGTShEVV9EUjIpCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA2XzI3XzI0CUZNKEQxMSkJCQlGTShMQ0RPVVQzKQlGTShNU0lPRjJfVFhEX0QpCUZNKEhUWDNfQikJCQlGTShWSTRfREFUQTNfQSkJRk0oUlRTNF9OX1RBTlNfQylGTShEVV9EUjMpCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA2XzMxXzI4CUZNKEQxMikJCQlGTShMQ0RPVVQ0KQlGTShNU0lPRjJfU1MxX0QpCUZNKFJYNF9DKQkJCUZNKFZJNF9EQVRBNF9BKQlGXygwLCAwKQlGTShEVV9EUjQpCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKworLyogSVBTUnggKi8JCS8qIDAgKi8JCQkvKiAxICovCQkvKiAyICovCQkJLyogMyAqLwkJCQkvKiA0ICovCQkvKiA1ICovCQkvKiA2ICovCQkJLyogNyAqLwkJLyogOCAqLwkJCS8qIDkgKi8JCS8qIEEgKi8JCS8qIEIgKi8JCS8qIEMgLSBGICovCisjZGVmaW5lIElQN18zXzAJCUZNKEQxMykJCQlGTShMQ0RPVVQ1KQlGTShNU0lPRjJfU1MyX0QpCUZNKFRYNF9DKQkJCUZNKFZJNF9EQVRBNV9BKQlGXygwLCAwKQlGTShEVV9EUjUpCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA3XzdfNAkJRk0oRDE0KQkJCUZNKExDRE9VVDYpCUZNKE1TSU9GM19TUzFfQSkJRk0oSFJYM19DKQkJCUZNKFZJNF9EQVRBNl9BKQlGXygwLCAwKQlGTShEVV9EUjYpCQlGTShTQ0w2X0MpCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDdfMTFfOAlGTShEMTUpCQkJRk0oTENET1VUNykJRk0oTVNJT0YzX1NTMl9BKQlGTShIVFgzX0MpCQkJRk0oVkk0X0RBVEE3X0EpCUZfKDAsIDApCUZNKERVX0RSNykJCUZNKFNEQTZfQykJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQN18xNV8xMglGTShGU0NMS1NUKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDdfMTlfMTYJRk0oU0QwX0NMSykJCUZfKDAsIDApCUZNKE1TSU9GMV9TQ0tfRSkJRl8oMCwgMCkJCQlGXygwLCAwKQlGXygwLCAwKQlGTShTVFBfT1BXTV8wX0IpCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDdfMjNfMjAJRk0oU0QwX0NNRCkJCUZfKDAsIDApCUZNKE1TSU9GMV9TWU5DX0UpCUZfKDAsIDApCQkJRl8oMCwgMCkJRl8oMCwgMCkJRk0oU1RQX0lWQ1hPMjdfMF9CKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA3XzI3XzI0CUZNKFNEMF9EQVQwKQkJRl8oMCwgMCkJRk0oTVNJT0YxX1JYRF9FKQlGXygwLCAwKQkJCUZfKDAsIDApCUZNKFRTX1NDSzBfQikJRk0oU1RQX0lTQ0xLXzBfQikJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQN18zMV8yOAlGTShTRDBfREFUMSkJCUZfKDAsIDApCUZNKE1TSU9GMV9UWERfRSkJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShUU19TUFNZTkMwX0IpRk0oU1RQX0lTU1lOQ18wX0IpCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDhfM18wCQlGTShTRDBfREFUMikJCUZfKDAsIDApCUZNKE1TSU9GMV9TUzFfRSkJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShUU19TREFUMF9CKQlGTShTVFBfSVNEXzBfQikJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDhfN180CQlGTShTRDBfREFUMykJCUZfKDAsIDApCUZNKE1TSU9GMV9TUzJfRSkJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShUU19TREVOMF9CKQlGTShTVFBfSVNFTl8wX0IpCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDhfMTFfOAlGTShTRDFfQ0xLKQkJRl8oMCwgMCkJRk0oTVNJT0YxX1NDS19HKQlGXygwLCAwKQkJCUZfKDAsIDApCUZNKFNJTTBfQ0xLX0EpCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA4XzE1XzEyCUZNKFNEMV9DTUQpCQlGXygwLCAwKQlGTShNU0lPRjFfU1lOQ19HKQlGTShORkNFX05fQikJCQlGXygwLCAwKQlGTShTSU0wX0RfQSkJRk0oU1RQX0lWQ1hPMjdfMV9CKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA4XzE5XzE2CUZNKFNEMV9EQVQwKQkJRk0oU0QyX0RBVDQpCUZNKE1TSU9GMV9SWERfRykJRk0oTkZXUF9OX0IpCQkJRl8oMCwgMCkJRk0oVFNfU0NLMV9CKQlGTShTVFBfSVNDTEtfMV9CKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA4XzIzXzIwCUZNKFNEMV9EQVQxKQkJRk0oU0QyX0RBVDUpCUZNKE1TSU9GMV9UWERfRykJRk0oTkZEQVRBMTRfQikJCQlGXygwLCAwKQlGTShUU19TUFNZTkMxX0IpRk0oU1RQX0lTU1lOQ18xX0IpCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDhfMjdfMjQJRk0oU0QxX0RBVDIpCQlGTShTRDJfREFUNikJRk0oTVNJT0YxX1NTMV9HKQlGTShORkRBVEExNV9CKQkJCUZfKDAsIDApCUZNKFRTX1NEQVQxX0IpCUZNKFNUUF9JU0RfMV9CKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQOF8zMV8yOAlGTShTRDFfREFUMykJCUZNKFNEMl9EQVQ3KQlGTShNU0lPRjFfU1MyX0cpCUZNKE5GUkJfTl9CKQkJCUZfKDAsIDApCUZNKFRTX1NERU4xX0IpCUZNKFNUUF9JU0VOXzFfQikJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQOV8zXzAJCUZNKFNEMl9DTEspCQlGXygwLCAwKQlGXygwLCAwKQkJRk0oTkZEQVRBOCkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQOV83XzQJCUZNKFNEMl9DTUQpCQlGXygwLCAwKQlGXygwLCAwKQkJRk0oTkZEQVRBOSkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQOV8xMV84CUZNKFNEMl9EQVQwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKE5GREFUQTEwKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA5XzE1XzEyCUZNKFNEMl9EQVQxKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKE5GREFUQTExKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA5XzE5XzE2CUZNKFNEMl9EQVQyKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKE5GREFUQTEyKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA5XzIzXzIwCUZNKFNEMl9EQVQzKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKE5GREFUQTEzKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA5XzI3XzI0CUZNKFNEMl9EUykJCUZfKDAsIDApCUZfKDAsIDApCQlGTShORkFMRSkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRk0oU0FUQV9ERVZTTFBfQikJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA5XzMxXzI4CUZNKFNEM19DTEspCQlGXygwLCAwKQlGXygwLCAwKQkJRk0oTkZXRV9OKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxMF8zXzAJRk0oU0QzX0NNRCkJCUZfKDAsIDApCUZfKDAsIDApCQlGTShORlJFX04pCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDEwXzdfNAlGTShTRDNfREFUMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGTShORkRBVEEwKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxMF8xMV84CUZNKFNEM19EQVQxKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKE5GREFUQTEpCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDEwXzE1XzEyCUZNKFNEM19EQVQyKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKE5GREFUQTIpCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDEwXzE5XzE2CUZNKFNEM19EQVQzKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKE5GREFUQTMpCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDEwXzIzXzIwCUZNKFNEM19EQVQ0KQkJRk0oU0QyX0NEX0EpCUZfKDAsIDApCQlGTShORkRBVEE0KQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxMF8yN18yNAlGTShTRDNfREFUNSkJCUZNKFNEMl9XUF9BKQlGXygwLCAwKQkJRk0oTkZEQVRBNSkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTBfMzFfMjgJRk0oU0QzX0RBVDYpCQlGTShTRDNfQ0QpCUZfKDAsIDApCQlGTShORkRBVEE2KQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxMV8zXzAJRk0oU0QzX0RBVDcpCQlGTShTRDNfV1ApCUZfKDAsIDApCQlGTShORkRBVEE3KQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxMV83XzQJRk0oU0QzX0RTKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKE5GQ0xFKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxMV8xMV84CUZNKFNEMF9DRCkJCUZfKDAsIDApCUZNKE5GREFUQTE0X0EpCQlGXygwLCAwKQkJCUZNKFNDTDJfQikJRk0oU0lNMF9SU1RfQSkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorCisvKiBJUFNSeCAqLwkJLyogMCAqLwkJCS8qIDEgKi8JCS8qIDIgKi8JCQkvKiAzICovCQkJCS8qIDQgKi8JCS8qIDUgKi8JCS8qIDYgKi8JCQkvKiA3ICovCQkvKiA4ICovCQkJLyogOSAqLwkJLyogQSAqLwkJLyogQiAqLwkJLyogQyAtIEYgKi8KKyNkZWZpbmUgSVAxMV8xNV8xMglGTShTRDBfV1ApCQlGXygwLCAwKQlGTShORkRBVEExNV9BKQkJRl8oMCwgMCkJCQlGTShTREEyX0IpCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxMV8xOV8xNglGTShTRDFfQ0QpCQlGXygwLCAwKQlGTShORlJCX05fQSkJCUZfKDAsIDApCQkJRl8oMCwgMCkJRk0oU0lNMF9DTEtfQikJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDExXzIzXzIwCUZNKFNEMV9XUCkJCUZfKDAsIDApCUZNKE5GQ0VfTl9BKQkJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShTSU0wX0RfQikJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDExXzI3XzI0CUZNKFNDSzApCQlGTShIU0NLMV9CKQlGTShNU0lPRjFfU1MyX0IpCUZNKEFVRElPX0NMS0NfQikJCUZNKFNEQTJfQSkJRk0oU0lNMF9SU1RfQikJRk0oU1RQX09QV01fMF9DKQlGTShSSUYwX0NMS19CKQlGXygwLCAwKQkJRk0oQURJQ0hTMikJRk0oU0NLNV9CKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDExXzMxXzI4CUZNKFJYMCkJCQlGTShIUlgxX0IpCUZfKDAsIDApCQlGXygwLCAwKQkJCUZfKDAsIDApCUZNKFRTX1NDSzBfQykJRk0oU1RQX0lTQ0xLXzBfQykJRk0oUklGMF9EMF9CKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxMl8zXzAJRk0oVFgwKQkJCUZNKEhUWDFfQikJRl8oMCwgMCkJCUZfKDAsIDApCQkJRl8oMCwgMCkJRk0oVFNfU1BTWU5DMF9DKUZNKFNUUF9JU1NZTkNfMF9DKQlGTShSSUYwX0QxX0IpCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDEyXzdfNAlGTShDVFMwX04pCQlGTShIQ1RTMV9OX0IpCUZNKE1TSU9GMV9TWU5DX0IpCUZfKDAsIDApCQkJRl8oMCwgMCkJRk0oVFNfU1BTWU5DMV9DKUZNKFNUUF9JU1NZTkNfMV9DKQlGTShSSUYxX1NZTkNfQikJRk0oQVVESU9fQ0xLT1VUX0MpCUZNKEFESUNTX1NBTVApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTJfMTFfOAlGTShSVFMwX05fVEFOUykJCUZNKEhSVFMxX05fQikJRk0oTVNJT0YxX1NTMV9CKQlGTShBVURJT19DTEtBX0IpCQlGTShTQ0wyX0EpCUZfKDAsIDApCUZNKFNUUF9JVkNYTzI3XzFfQykJRk0oUklGMF9TWU5DX0IpCUZNKEZTT19UT0VfQSkJCUZNKEFESUNIUzEpCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTJfMTVfMTIJRk0oUlgxX0EpCQlGTShIUlgxX0EpCUZfKDAsIDApCQlGXygwLCAwKQkJCUZfKDAsIDApCUZNKFRTX1NEQVQwX0MpCUZNKFNUUF9JU0RfMF9DKQkJRk0oUklGMV9DTEtfQykJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTJfMTlfMTYJRk0oVFgxX0EpCQlGTShIVFgxX0EpCUZfKDAsIDApCQlGXygwLCAwKQkJCUZfKDAsIDApCUZNKFRTX1NERU4wX0MpCUZNKFNUUF9JU0VOXzBfQykJRk0oUklGMV9EMF9DKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxMl8yM18yMAlGTShDVFMxX04pCQlGTShIQ1RTMV9OX0EpCUZNKE1TSU9GMV9SWERfQikJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShUU19TREVOMV9DKQlGTShTVFBfSVNFTl8xX0MpCUZNKFJJRjFfRDBfQikJRl8oMCwgMCkJCUZNKEFESURBVEEpCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTJfMjdfMjQJRk0oUlRTMV9OX1RBTlMpCQlGTShIUlRTMV9OX0EpCUZNKE1TSU9GMV9UWERfQikJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShUU19TREFUMV9DKQlGTShTVFBfSVNEXzFfQykJCUZNKFJJRjFfRDFfQikJRl8oMCwgMCkJCUZNKEFESUNIUzApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTJfMzFfMjgJRk0oU0NLMikJCUZNKFNDSUZfQ0xLX0IpCUZNKE1TSU9GMV9TQ0tfQikJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShUU19TQ0sxX0MpCUZNKFNUUF9JU0NMS18xX0MpCUZNKFJJRjFfQ0xLX0IpCUZfKDAsIDApCQlGTShBRElDTEspCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTNfM18wCUZNKFRYMl9BKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKFNEMl9DRF9CKQkJCUZNKFNDTDFfQSkJRl8oMCwgMCkJRk0oRk1DTEtfQSkJCUZNKFJJRjFfRDFfQykJRl8oMCwgMCkJCUZNKEZTT19DRkVfMF9CKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDEzXzdfNAlGTShSWDJfQSkJCUZfKDAsIDApCUZfKDAsIDApCQlGTShTRDJfV1BfQikJCQlGTShTREExX0EpCUZfKDAsIDApCUZNKEZNSU5fQSkJCUZNKFJJRjFfU1lOQ19DKQlGXygwLCAwKQkJRk0oRlNPX0NGRV8xX0IpCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTNfMTFfOAlGTShIU0NLMCkJCUZfKDAsIDApCUZNKE1TSU9GMV9TQ0tfRCkJRk0oQVVESU9fQ0xLQl9BKQkJRk0oU1NJX1NEQVRBMV9CKUZNKFRTX1NDSzBfRCkJRk0oU1RQX0lTQ0xLXzBfRCkJRk0oUklGMF9DTEtfQykJRl8oMCwgMCkJCUZfKDAsIDApCUZNKFJYNV9CKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDEzXzE1XzEyCUZNKEhSWDApCQlGXygwLCAwKQlGTShNU0lPRjFfUlhEX0QpCUZfKDAsIDApCQkJRk0oU1NJX1NEQVRBMl9CKUZNKFRTX1NERU4wX0QpCUZNKFNUUF9JU0VOXzBfRCkJRk0oUklGMF9EMF9DKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxM18xOV8xNglGTShIVFgwKQkJRl8oMCwgMCkJRk0oTVNJT0YxX1RYRF9EKQlGXygwLCAwKQkJCUZNKFNTSV9TREFUQTlfQilGTShUU19TREFUMF9EKQlGTShTVFBfSVNEXzBfRCkJCUZNKFJJRjBfRDFfQykJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTNfMjNfMjAJRk0oSENUUzBfTikJCUZNKFJYMl9CKQlGTShNU0lPRjFfU1lOQ19EKQlGXygwLCAwKQkJCUZNKFNTSV9TQ0s5X0EpCUZNKFRTX1NQU1lOQzBfRClGTShTVFBfSVNTWU5DXzBfRCkJRk0oUklGMF9TWU5DX0MpCUZNKEFVRElPX0NMS09VVDFfQSkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxM18yN18yNAlGTShIUlRTMF9OKQkJRk0oVFgyX0IpCUZNKE1TSU9GMV9TUzFfRCkJRl8oMCwgMCkJCQlGTShTU0lfV1M5X0EpCUZfKDAsIDApCUZNKFNUUF9JVkNYTzI3XzBfRCkJRk0oQlBGQ0xLX0EpCUZNKEFVRElPX0NMS09VVDJfQSkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxM18zMV8yOAlGTShNU0lPRjBfU1lOQykJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGTShBVURJT19DTEtPVVRfQSkJRl8oMCwgMCkJRk0oVFg1X0IpCUZfKDAsIDApCUZfKDAsIDApIEZNKEJQRkNMS19EKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE0XzNfMAlGTShNU0lPRjBfU1MxKQkJRk0oUlg1X0EpCUZNKE5GV1BfTl9BKQkJRk0oQVVESU9fQ0xLQV9DKQkJRk0oU1NJX1NDSzJfQSkJRl8oMCwgMCkJRk0oU1RQX0lWQ1hPMjdfMF9DKQlGXygwLCAwKQlGTShBVURJT19DTEtPVVQzX0EpCUZfKDAsIDApCUZNKFRDTEsxX0IpCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTRfN180CUZNKE1TSU9GMF9TUzIpCQlGTShUWDVfQSkJRk0oTVNJT0YxX1NTMl9EKQlGTShBVURJT19DTEtDX0EpCQlGTShTU0lfV1MyX0EpCUZfKDAsIDApCUZNKFNUUF9PUFdNXzBfRCkJRl8oMCwgMCkJRk0oQVVESU9fQ0xLT1VUX0QpCUZfKDAsIDApCUZNKFNQRUVESU5fQikJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxNF8xMV84CUZNKE1MQl9DTEspCQlGXygwLCAwKQlGTShNU0lPRjFfU0NLX0YpCUZfKDAsIDApCQkJRk0oU0NMMV9CKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTRfMTVfMTIJRk0oTUxCX1NJRykJCUZNKFJYMV9CKQlGTShNU0lPRjFfU1lOQ19GKQlGXygwLCAwKQkJCUZNKFNEQTFfQikJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE0XzE5XzE2CUZNKE1MQl9EQVQpCQlGTShUWDFfQikJRk0oTVNJT0YxX1JYRF9GKQlGXygwLCAwKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxNF8yM18yMAlGTShTU0lfU0NLMDEyOSkJCUZfKDAsIDApCUZNKE1TSU9GMV9UWERfRikJRl8oMCwgMCkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTRfMjdfMjQJRk0oU1NJX1dTMDEyOSkJCUZfKDAsIDApCUZNKE1TSU9GMV9TUzFfRikJRl8oMCwgMCkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisKKy8qIElQU1J4ICovCQkvKiAwICovCQkJLyogMSAqLwkJLyogMiAqLwkJCS8qIDMgKi8JCQkJLyogNCAqLwkJLyogNSAqLwkJLyogNiAqLwkJCS8qIDcgKi8JCS8qIDggKi8JCQkvKiA5ICovCQkvKiBBICovCQkvKiBCICovCQkvKiBDIC0gRiAqLworI2RlZmluZSBJUDE0XzMxXzI4CUZNKFNTSV9TREFUQTApCQlGXygwLCAwKQlGTShNU0lPRjFfU1MyX0YpCUZfKDAsIDApCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE1XzNfMAlGTShTU0lfU0RBVEExX0EpCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxNV83XzQJRk0oU1NJX1NEQVRBMl9BKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJCQlGTShTU0lfU0NLMV9CKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTVfMTFfOAlGTShTU0lfU0NLMzQpCQlGXygwLCAwKQlGTShNU0lPRjFfU1MxX0EpCUZfKDAsIDApCQkJRl8oMCwgMCkJRl8oMCwgMCkJRk0oU1RQX09QV01fMF9BKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxNV8xNV8xMglGTShTU0lfV1MzNCkJCUZNKEhDVFMyX05fQSkJRk0oTVNJT0YxX1NTMl9BKQlGXygwLCAwKQkJCUZfKDAsIDApCUZfKDAsIDApCUZNKFNUUF9JVkNYTzI3XzBfQSkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTVfMTlfMTYJRk0oU1NJX1NEQVRBMykJCUZNKEhSVFMyX05fQSkJRk0oTVNJT0YxX1RYRF9BKQlGXygwLCAwKQkJCUZfKDAsIDApCUZNKFRTX1NDSzBfQSkJRk0oU1RQX0lTQ0xLXzBfQSkJRk0oUklGMF9EMV9BKQlGTShSSUYyX0QwX0EpCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE1XzIzXzIwCUZNKFNTSV9TQ0s0KQkJRk0oSFJYMl9BKQlGTShNU0lPRjFfU0NLX0EpCUZfKDAsIDApCQkJRl8oMCwgMCkJRk0oVFNfU0RBVDBfQSkJRk0oU1RQX0lTRF8wX0EpCQlGTShSSUYwX0NMS19BKQlGTShSSUYyX0NMS19BKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxNV8yN18yNAlGTShTU0lfV1M0KQkJRk0oSFRYMl9BKQlGTShNU0lPRjFfU1lOQ19BKQlGXygwLCAwKQkJCUZfKDAsIDApCUZNKFRTX1NERU4wX0EpCUZNKFNUUF9JU0VOXzBfQSkJRk0oUklGMF9TWU5DX0EpCUZNKFJJRjJfU1lOQ19BKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxNV8zMV8yOAlGTShTU0lfU0RBVEE0KQkJRk0oSFNDSzJfQSkJRk0oTVNJT0YxX1JYRF9BKQlGXygwLCAwKQkJCUZfKDAsIDApCUZNKFRTX1NQU1lOQzBfQSlGTShTVFBfSVNTWU5DXzBfQSkJRk0oUklGMF9EMF9BKQlGTShSSUYyX0QxX0EpCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE2XzNfMAlGTShTU0lfU0NLNikJCUZfKDAsIDApCUZfKDAsIDApCQlGTShTSU0wX1JTVF9EKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxNl83XzQJRk0oU1NJX1dTNikJCUZfKDAsIDApCUZfKDAsIDApCQlGTShTSU0wX0RfRCkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTZfMTFfOAlGTShTU0lfU0RBVEE2KQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKFNJTTBfQ0xLX0QpCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE2XzE1XzEyCUZNKFNTSV9TQ0s3OCkJCUZNKEhSWDJfQikJRk0oTVNJT0YxX1NDS19DKQlGXygwLCAwKQkJCUZfKDAsIDApCUZNKFRTX1NDSzFfQSkJRk0oU1RQX0lTQ0xLXzFfQSkJRk0oUklGMV9DTEtfQSkJRk0oUklGM19DTEtfQSkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTZfMTlfMTYJRk0oU1NJX1dTNzgpCQlGTShIVFgyX0IpCUZNKE1TSU9GMV9TWU5DX0MpCUZfKDAsIDApCQkJRl8oMCwgMCkJRk0oVFNfU0RBVDFfQSkJRk0oU1RQX0lTRF8xX0EpCQlGTShSSUYxX1NZTkNfQSkJRk0oUklGM19TWU5DX0EpCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE2XzIzXzIwCUZNKFNTSV9TREFUQTcpCQlGTShIQ1RTMl9OX0IpCUZNKE1TSU9GMV9SWERfQykJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShUU19TREVOMV9BKQlGTShTVFBfSVNFTl8xX0EpCUZNKFJJRjFfRDBfQSkJRk0oUklGM19EMF9BKQkJRl8oMCwgMCkJRk0oVENMSzJfQSkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxNl8yN18yNAlGTShTU0lfU0RBVEE4KQkJRk0oSFJUUzJfTl9CKQlGTShNU0lPRjFfVFhEX0MpCUZfKDAsIDApCQkJRl8oMCwgMCkJRk0oVFNfU1BTWU5DMV9BKUZNKFNUUF9JU1NZTkNfMV9BKQlGTShSSUYxX0QxX0EpCUZNKFJJRjNfRDFfQSkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTZfMzFfMjgJRk0oU1NJX1NEQVRBOV9BKQlGTShIU0NLMl9CKQlGTShNU0lPRjFfU1MxX0MpCUZNKEhTQ0sxX0EpCQkJRk0oU1NJX1dTMV9CKQlGTShTQ0sxKQlGTShTVFBfSVZDWE8yN18xX0EpCUZNKFNDSzVfQSkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTdfM18wCUZNKEFVRElPX0NMS0FfQSkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGTShDQzVfT1NDT1VUKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE3XzdfNAlGTShBVURJT19DTEtCX0IpCUZNKFNDSUZfQ0xLX0EpCUZfKDAsIDApCQlGXygwLCAwKQkJCUZfKDAsIDApCUZfKDAsIDApCUZNKFNUUF9JVkNYTzI3XzFfRCkJRk0oUkVNT0NPTl9BKQlGXygwLCAwKQkJRl8oMCwgMCkJRk0oVENMSzFfQSkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxN18xMV84CUZNKFVTQjBfUFdFTikJCUZfKDAsIDApCUZfKDAsIDApCQlGTShTSU0wX1JTVF9DKQkJCUZfKDAsIDApCUZNKFRTX1NDSzFfRCkJRk0oU1RQX0lTQ0xLXzFfRCkJRk0oQlBGQ0xLX0IpCUZNKFJJRjNfQ0xLX0IpCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGTShIU0NLMl9DKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE3XzE1XzEyCUZNKFVTQjBfT1ZDKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKFNJTTBfRF9DKQkJCUZfKDAsIDApCUZNKFRTX1NEQVQxX0QpCUZNKFNUUF9JU0RfMV9EKQkJRl8oMCwgMCkJRk0oUklGM19TWU5DX0IpCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGTShIUlgyX0MpIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTdfMTlfMTYJRk0oVVNCMV9QV0VOKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKFNJTTBfQ0xLX0MpCQkJRk0oU1NJX1NDSzFfQSkJRk0oVFNfU0NLMF9FKQlGTShTVFBfSVNDTEtfMF9FKQlGTShGTUNMS19CKQlGTShSSUYyX0NMS19CKQkJRl8oMCwgMCkJRk0oU1BFRURJTl9BKQlGXygwLCAwKQlGXygwLCAwKSBGTShIVFgyX0MpIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTdfMjNfMjAJRk0oVVNCMV9PVkMpCQlGXygwLCAwKQlGTShNU0lPRjFfU1MyX0MpCUZfKDAsIDApCQkJRk0oU1NJX1dTMV9BKQlGTShUU19TREFUMF9FKQlGTShTVFBfSVNEXzBfRSkJCUZNKEZNSU5fQikJRk0oUklGMl9TWU5DX0IpCQlGXygwLCAwKQlGTShSRU1PQ09OX0IpCUZfKDAsIDApCUZfKDAsIDApIEZNKEhDVFMyX05fQykgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxN18yN18yNAlGTShVU0IzMF9QV0VOKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKEFVRElPX0NMS09VVF9CKQkJRk0oU1NJX1NDSzJfQikJRk0oVFNfU0RFTjFfRCkJRk0oU1RQX0lTRU5fMV9EKQlGTShTVFBfT1BXTV8wX0UpRk0oUklGM19EMF9CKQkJRl8oMCwgMCkJRk0oVENMSzJfQikJRk0oVFBVMFRPMCkJRk0oQlBGQ0xLX0MpIEZNKEhSVFMyX05fQykgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxN18zMV8yOAlGTShVU0IzMF9PVkMpCQlGXygwLCAwKQlGXygwLCAwKQkJRk0oQVVESU9fQ0xLT1VUMV9CKQkJRk0oU1NJX1dTMl9CKQlGTShUU19TUFNZTkMxX0QpRk0oU1RQX0lTU1lOQ18xX0QpCUZNKFNUUF9JVkNYTzI3XzBfRSlGTShSSUYzX0QxX0IpCUZfKDAsIDApCUZNKEZTT19UT0VfQikJRk0oVFBVMFRPMSkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxOF8zXzAJRk0oR1A2XzMwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKEFVRElPX0NMS09VVDJfQikJCUZNKFNTSV9TQ0s5X0IpCUZNKFRTX1NERU4wX0UpCUZNKFNUUF9JU0VOXzBfRSkJRl8oMCwgMCkJRk0oUklGMl9EMF9CKQkJRl8oMCwgMCkJRk0oRlNPX0NGRV8wX0EpCUZNKFRQVTBUTzIpCUZfKDAsIDApIEZNKEZNQ0xLX0MpIEZNKEZNQ0xLX0QpIEZfKDAsIDApCisjZGVmaW5lIElQMThfN180CUZNKEdQNl8zMSkJCUZfKDAsIDApCUZfKDAsIDApCQlGTShBVURJT19DTEtPVVQzX0IpCQlGTShTU0lfV1M5X0IpCUZNKFRTX1NQU1lOQzBfRSlGTShTVFBfSVNTWU5DXzBfRSkJRl8oMCwgMCkJRk0oUklGMl9EMV9CKQkJRl8oMCwgMCkJRk0oRlNPX0NGRV8xX0EpCUZNKFRQVTBUTzMpCUZfKDAsIDApIEZNKEZNSU5fQykgRk0oRk1JTl9EKSBGXygwLCAwKQorCisjZGVmaW5lIFBJTk1VWF9HUFNSCVwKK1wKKwkJCQkJCQkJCQkJCUdQU1I2XzMxIFwKKwkJCQkJCQkJCQkJCUdQU1I2XzMwIFwKKwkJCQkJCQkJCQkJCUdQU1I2XzI5IFwKKwkJR1BTUjFfMjgJCQkJCQkJCQlHUFNSNl8yOCBcCisJCUdQU1IxXzI3CQkJCQkJCQkJR1BTUjZfMjcgXAorCQlHUFNSMV8yNgkJCQkJCQkJCUdQU1I2XzI2IFwKKwkJR1BTUjFfMjUJCQkJCQkJR1BTUjVfMjUJR1BTUjZfMjUgXAorCQlHUFNSMV8yNAkJCQkJCQlHUFNSNV8yNAlHUFNSNl8yNCBcCisJCUdQU1IxXzIzCQkJCQkJCUdQU1I1XzIzCUdQU1I2XzIzIFwKKwkJR1BTUjFfMjIJCQkJCQkJR1BTUjVfMjIJR1BTUjZfMjIgXAorCQlHUFNSMV8yMQkJCQkJCQlHUFNSNV8yMQlHUFNSNl8yMSBcCisJCUdQU1IxXzIwCQkJCQkJCUdQU1I1XzIwCUdQU1I2XzIwIFwKKwkJR1BTUjFfMTkJCQkJCQkJR1BTUjVfMTkJR1BTUjZfMTkgXAorCQlHUFNSMV8xOAkJCQkJCQlHUFNSNV8xOAlHUFNSNl8xOCBcCisJCUdQU1IxXzE3CQkJCQlHUFNSNF8xNwlHUFNSNV8xNwlHUFNSNl8xNyBcCisJCUdQU1IxXzE2CQkJCQlHUFNSNF8xNglHUFNSNV8xNglHUFNSNl8xNiBcCitHUFNSMF8xNQlHUFNSMV8xNQkJCUdQU1IzXzE1CUdQU1I0XzE1CUdQU1I1XzE1CUdQU1I2XzE1IFwKK0dQU1IwXzE0CUdQU1IxXzE0CUdQU1IyXzE0CUdQU1IzXzE0CUdQU1I0XzE0CUdQU1I1XzE0CUdQU1I2XzE0IFwKK0dQU1IwXzEzCUdQU1IxXzEzCUdQU1IyXzEzCUdQU1IzXzEzCUdQU1I0XzEzCUdQU1I1XzEzCUdQU1I2XzEzIFwKK0dQU1IwXzEyCUdQU1IxXzEyCUdQU1IyXzEyCUdQU1IzXzEyCUdQU1I0XzEyCUdQU1I1XzEyCUdQU1I2XzEyIFwKK0dQU1IwXzExCUdQU1IxXzExCUdQU1IyXzExCUdQU1IzXzExCUdQU1I0XzExCUdQU1I1XzExCUdQU1I2XzExIFwKK0dQU1IwXzEwCUdQU1IxXzEwCUdQU1IyXzEwCUdQU1IzXzEwCUdQU1I0XzEwCUdQU1I1XzEwCUdQU1I2XzEwIFwKK0dQU1IwXzkJCUdQU1IxXzkJCUdQU1IyXzkJCUdQU1IzXzkJCUdQU1I0XzkJCUdQU1I1XzkJCUdQU1I2XzkgXAorR1BTUjBfOAkJR1BTUjFfOAkJR1BTUjJfOAkJR1BTUjNfOAkJR1BTUjRfOAkJR1BTUjVfOAkJR1BTUjZfOCBcCitHUFNSMF83CQlHUFNSMV83CQlHUFNSMl83CQlHUFNSM183CQlHUFNSNF83CQlHUFNSNV83CQlHUFNSNl83IFwKK0dQU1IwXzYJCUdQU1IxXzYJCUdQU1IyXzYJCUdQU1IzXzYJCUdQU1I0XzYJCUdQU1I1XzYJCUdQU1I2XzYgXAorR1BTUjBfNQkJR1BTUjFfNQkJR1BTUjJfNQkJR1BTUjNfNQkJR1BTUjRfNQkJR1BTUjVfNQkJR1BTUjZfNSBcCitHUFNSMF80CQlHUFNSMV80CQlHUFNSMl80CQlHUFNSM180CQlHUFNSNF80CQlHUFNSNV80CQlHUFNSNl80IFwKK0dQU1IwXzMJCUdQU1IxXzMJCUdQU1IyXzMJCUdQU1IzXzMJCUdQU1I0XzMJCUdQU1I1XzMJCUdQU1I2XzMJCUdQU1I3XzMgXAorR1BTUjBfMgkJR1BTUjFfMgkJR1BTUjJfMgkJR1BTUjNfMgkJR1BTUjRfMgkJR1BTUjVfMgkJR1BTUjZfMgkJR1BTUjdfMiBcCitHUFNSMF8xCQlHUFNSMV8xCQlHUFNSMl8xCQlHUFNSM18xCQlHUFNSNF8xCQlHUFNSNV8xCQlHUFNSNl8xCQlHUFNSN18xIFwKK0dQU1IwXzAJCUdQU1IxXzAJCUdQU1IyXzAJCUdQU1IzXzAJCUdQU1I0XzAJCUdQU1I1XzAJCUdQU1I2XzAJCUdQU1I3XzAKKworI2RlZmluZSBQSU5NVVhfSVBTUgkJCQlcCitcCitGTShJUDBfM18wKQlJUDBfM18wCQlGTShJUDFfM18wKQlJUDFfM18wCQlGTShJUDJfM18wKQlJUDJfM18wCQlGTShJUDNfM18wKQlJUDNfM18wIFwKK0ZNKElQMF83XzQpCUlQMF83XzQJCUZNKElQMV83XzQpCUlQMV83XzQJCUZNKElQMl83XzQpCUlQMl83XzQJCUZNKElQM183XzQpCUlQM183XzQgXAorRk0oSVAwXzExXzgpCUlQMF8xMV84CUZNKElQMV8xMV84KQlJUDFfMTFfOAlGTShJUDJfMTFfOCkJSVAyXzExXzgJRk0oSVAzXzExXzgpCUlQM18xMV84IFwKK0ZNKElQMF8xNV8xMikJSVAwXzE1XzEyCUZNKElQMV8xNV8xMikJSVAxXzE1XzEyCUZNKElQMl8xNV8xMikJSVAyXzE1XzEyCUZNKElQM18xNV8xMikJSVAzXzE1XzEyIFwKK0ZNKElQMF8xOV8xNikJSVAwXzE5XzE2CUZNKElQMV8xOV8xNikJSVAxXzE5XzE2CUZNKElQMl8xOV8xNikJSVAyXzE5XzE2CUZNKElQM18xOV8xNikJSVAzXzE5XzE2IFwKK0ZNKElQMF8yM18yMCkJSVAwXzIzXzIwCUZNKElQMV8yM18yMCkJSVAxXzIzXzIwCUZNKElQMl8yM18yMCkJSVAyXzIzXzIwCUZNKElQM18yM18yMCkJSVAzXzIzXzIwIFwKK0ZNKElQMF8yN18yNCkJSVAwXzI3XzI0CUZNKElQMV8yN18yNCkJSVAxXzI3XzI0CUZNKElQMl8yN18yNCkJSVAyXzI3XzI0CUZNKElQM18yN18yNCkJSVAzXzI3XzI0IFwKK0ZNKElQMF8zMV8yOCkJSVAwXzMxXzI4CUZNKElQMV8zMV8yOCkJSVAxXzMxXzI4CUZNKElQMl8zMV8yOCkJSVAyXzMxXzI4CUZNKElQM18zMV8yOCkJSVAzXzMxXzI4IFwKK1wKK0ZNKElQNF8zXzApCUlQNF8zXzAJCUZNKElQNV8zXzApCUlQNV8zXzAJCUZNKElQNl8zXzApCUlQNl8zXzAJCUZNKElQN18zXzApCUlQN18zXzAgXAorRk0oSVA0XzdfNCkJSVA0XzdfNAkJRk0oSVA1XzdfNCkJSVA1XzdfNAkJRk0oSVA2XzdfNCkJSVA2XzdfNAkJRk0oSVA3XzdfNCkJSVA3XzdfNCBcCitGTShJUDRfMTFfOCkJSVA0XzExXzgJRk0oSVA1XzExXzgpCUlQNV8xMV84CUZNKElQNl8xMV84KQlJUDZfMTFfOAlGTShJUDdfMTFfOCkJSVA3XzExXzggXAorRk0oSVA0XzE1XzEyKQlJUDRfMTVfMTIJRk0oSVA1XzE1XzEyKQlJUDVfMTVfMTIJRk0oSVA2XzE1XzEyKQlJUDZfMTVfMTIJRk0oSVA3XzE1XzEyKQlJUDdfMTVfMTIgXAorRk0oSVA0XzE5XzE2KQlJUDRfMTlfMTYJRk0oSVA1XzE5XzE2KQlJUDVfMTlfMTYJRk0oSVA2XzE5XzE2KQlJUDZfMTlfMTYJRk0oSVA3XzE5XzE2KQlJUDdfMTlfMTYgXAorRk0oSVA0XzIzXzIwKQlJUDRfMjNfMjAJRk0oSVA1XzIzXzIwKQlJUDVfMjNfMjAJRk0oSVA2XzIzXzIwKQlJUDZfMjNfMjAJRk0oSVA3XzIzXzIwKQlJUDdfMjNfMjAgXAorRk0oSVA0XzI3XzI0KQlJUDRfMjdfMjQJRk0oSVA1XzI3XzI0KQlJUDVfMjdfMjQJRk0oSVA2XzI3XzI0KQlJUDZfMjdfMjQJRk0oSVA3XzI3XzI0KQlJUDdfMjdfMjQgXAorRk0oSVA0XzMxXzI4KQlJUDRfMzFfMjgJRk0oSVA1XzMxXzI4KQlJUDVfMzFfMjgJRk0oSVA2XzMxXzI4KQlJUDZfMzFfMjgJRk0oSVA3XzMxXzI4KQlJUDdfMzFfMjggXAorXAorRk0oSVA4XzNfMCkJSVA4XzNfMAkJRk0oSVA5XzNfMCkJSVA5XzNfMAkJRk0oSVAxMF8zXzApCUlQMTBfM18wCUZNKElQMTFfM18wKQlJUDExXzNfMCBcCitGTShJUDhfN180KQlJUDhfN180CQlGTShJUDlfN180KQlJUDlfN180CQlGTShJUDEwXzdfNCkJSVAxMF83XzQJRk0oSVAxMV83XzQpCUlQMTFfN180IFwKK0ZNKElQOF8xMV84KQlJUDhfMTFfOAlGTShJUDlfMTFfOCkJSVA5XzExXzgJRk0oSVAxMF8xMV84KQlJUDEwXzExXzgJRk0oSVAxMV8xMV84KQlJUDExXzExXzggXAorRk0oSVA4XzE1XzEyKQlJUDhfMTVfMTIJRk0oSVA5XzE1XzEyKQlJUDlfMTVfMTIJRk0oSVAxMF8xNV8xMikJSVAxMF8xNV8xMglGTShJUDExXzE1XzEyKQlJUDExXzE1XzEyIFwKK0ZNKElQOF8xOV8xNikJSVA4XzE5XzE2CUZNKElQOV8xOV8xNikJSVA5XzE5XzE2CUZNKElQMTBfMTlfMTYpCUlQMTBfMTlfMTYJRk0oSVAxMV8xOV8xNikJSVAxMV8xOV8xNiBcCitGTShJUDhfMjNfMjApCUlQOF8yM18yMAlGTShJUDlfMjNfMjApCUlQOV8yM18yMAlGTShJUDEwXzIzXzIwKQlJUDEwXzIzXzIwCUZNKElQMTFfMjNfMjApCUlQMTFfMjNfMjAgXAorRk0oSVA4XzI3XzI0KQlJUDhfMjdfMjQJRk0oSVA5XzI3XzI0KQlJUDlfMjdfMjQJRk0oSVAxMF8yN18yNCkJSVAxMF8yN18yNAlGTShJUDExXzI3XzI0KQlJUDExXzI3XzI0IFwKK0ZNKElQOF8zMV8yOCkJSVA4XzMxXzI4CUZNKElQOV8zMV8yOCkJSVA5XzMxXzI4CUZNKElQMTBfMzFfMjgpCUlQMTBfMzFfMjgJRk0oSVAxMV8zMV8yOCkJSVAxMV8zMV8yOCBcCitcCitGTShJUDEyXzNfMCkJSVAxMl8zXzAJRk0oSVAxM18zXzApCUlQMTNfM18wCUZNKElQMTRfM18wKQlJUDE0XzNfMAlGTShJUDE1XzNfMCkJSVAxNV8zXzAgXAorRk0oSVAxMl83XzQpCUlQMTJfN180CUZNKElQMTNfN180KQlJUDEzXzdfNAlGTShJUDE0XzdfNCkJSVAxNF83XzQJRk0oSVAxNV83XzQpCUlQMTVfN180IFwKK0ZNKElQMTJfMTFfOCkJSVAxMl8xMV84CUZNKElQMTNfMTFfOCkJSVAxM18xMV84CUZNKElQMTRfMTFfOCkJSVAxNF8xMV84CUZNKElQMTVfMTFfOCkJSVAxNV8xMV84IFwKK0ZNKElQMTJfMTVfMTIpCUlQMTJfMTVfMTIJRk0oSVAxM18xNV8xMikJSVAxM18xNV8xMglGTShJUDE0XzE1XzEyKQlJUDE0XzE1XzEyCUZNKElQMTVfMTVfMTIpCUlQMTVfMTVfMTIgXAorRk0oSVAxMl8xOV8xNikJSVAxMl8xOV8xNglGTShJUDEzXzE5XzE2KQlJUDEzXzE5XzE2CUZNKElQMTRfMTlfMTYpCUlQMTRfMTlfMTYJRk0oSVAxNV8xOV8xNikJSVAxNV8xOV8xNiBcCitGTShJUDEyXzIzXzIwKQlJUDEyXzIzXzIwCUZNKElQMTNfMjNfMjApCUlQMTNfMjNfMjAJRk0oSVAxNF8yM18yMCkJSVAxNF8yM18yMAlGTShJUDE1XzIzXzIwKQlJUDE1XzIzXzIwIFwKK0ZNKElQMTJfMjdfMjQpCUlQMTJfMjdfMjQJRk0oSVAxM18yN18yNCkJSVAxM18yN18yNAlGTShJUDE0XzI3XzI0KQlJUDE0XzI3XzI0CUZNKElQMTVfMjdfMjQpCUlQMTVfMjdfMjQgXAorRk0oSVAxMl8zMV8yOCkJSVAxMl8zMV8yOAlGTShJUDEzXzMxXzI4KQlJUDEzXzMxXzI4CUZNKElQMTRfMzFfMjgpCUlQMTRfMzFfMjgJRk0oSVAxNV8zMV8yOCkJSVAxNV8zMV8yOCBcCitcCitGTShJUDE2XzNfMCkJSVAxNl8zXzAJRk0oSVAxN18zXzApCUlQMTdfM18wCUZNKElQMThfM18wKQlJUDE4XzNfMCBcCitGTShJUDE2XzdfNCkJSVAxNl83XzQJRk0oSVAxN183XzQpCUlQMTdfN180CUZNKElQMThfN180KQlJUDE4XzdfNCBcCitGTShJUDE2XzExXzgpCUlQMTZfMTFfOAlGTShJUDE3XzExXzgpCUlQMTdfMTFfOCBcCitGTShJUDE2XzE1XzEyKQlJUDE2XzE1XzEyCUZNKElQMTdfMTVfMTIpCUlQMTdfMTVfMTIgXAorRk0oSVAxNl8xOV8xNikJSVAxNl8xOV8xNglGTShJUDE3XzE5XzE2KQlJUDE3XzE5XzE2IFwKK0ZNKElQMTZfMjNfMjApCUlQMTZfMjNfMjAJRk0oSVAxN18yM18yMCkJSVAxN18yM18yMCBcCitGTShJUDE2XzI3XzI0KQlJUDE2XzI3XzI0CUZNKElQMTdfMjdfMjQpCUlQMTdfMjdfMjQgXAorRk0oSVAxNl8zMV8yOCkJSVAxNl8zMV8yOAlGTShJUDE3XzMxXzI4KQlJUDE3XzMxXzI4CisKKy8qIE1PRF9TRUwwICovCQkJLyogMCAqLwkJCS8qIDEgKi8JCQkvKiAyICovCQkJLyogMyAqLwkJCS8qIDQgKi8JCQkvKiA1ICovCQkJLyogNiAqLwkJCS8qIDcgKi8KKyNkZWZpbmUgTU9EX1NFTDBfMzFfMzBfMjkJRk0oU0VMX01TSU9GM18wKQlGTShTRUxfTVNJT0YzXzEpCUZNKFNFTF9NU0lPRjNfMikJRk0oU0VMX01TSU9GM18zKQlGTShTRUxfTVNJT0YzXzQpCUZfKDAsIDApCQlGXygwLCAwKQkJRl8oMCwgMCkKKyNkZWZpbmUgTU9EX1NFTDBfMjhfMjcJCUZNKFNFTF9NU0lPRjJfMCkJRk0oU0VMX01TSU9GMl8xKQlGTShTRUxfTVNJT0YyXzIpCUZNKFNFTF9NU0lPRjJfMykKKyNkZWZpbmUgTU9EX1NFTDBfMjZfMjVfMjQJRk0oU0VMX01TSU9GMV8wKQlGTShTRUxfTVNJT0YxXzEpCUZNKFNFTF9NU0lPRjFfMikJRk0oU0VMX01TSU9GMV8zKQlGTShTRUxfTVNJT0YxXzQpCUZNKFNFTF9NU0lPRjFfNSkJRk0oU0VMX01TSU9GMV82KQlGXygwLCAwKQorI2RlZmluZSBNT0RfU0VMMF8yMwkJRk0oU0VMX0xCU0NfMCkJCUZNKFNFTF9MQlNDXzEpCisjZGVmaW5lIE1PRF9TRUwwXzIyCQlGTShTRUxfSUVCVVNfMCkJCUZNKFNFTF9JRUJVU18xKQorI2RlZmluZSBNT0RfU0VMMF8yMQkJRk0oU0VMX0kyQzJfMCkJCUZNKFNFTF9JMkMyXzEpCisjZGVmaW5lIE1PRF9TRUwwXzIwCQlGTShTRUxfSTJDMV8wKQkJRk0oU0VMX0kyQzFfMSkKKyNkZWZpbmUgTU9EX1NFTDBfMTkJCUZNKFNFTF9IU0NJRjRfMCkJRk0oU0VMX0hTQ0lGNF8xKQorI2RlZmluZSBNT0RfU0VMMF8xOF8xNwkJRk0oU0VMX0hTQ0lGM18wKQlGTShTRUxfSFNDSUYzXzEpCUZNKFNFTF9IU0NJRjNfMikJRk0oU0VMX0hTQ0lGM18zKQorI2RlZmluZSBNT0RfU0VMMF8xNgkJRk0oU0VMX0hTQ0lGMV8wKQlGTShTRUxfSFNDSUYxXzEpCisjZGVmaW5lIE1PRF9TRUwwXzE1CQlGTShTRUxfRlNPXzApCQlGTShTRUxfRlNPXzEpCisjZGVmaW5lIE1PRF9TRUwwXzE0XzEzCQlGTShTRUxfSFNDSUYyXzApCUZNKFNFTF9IU0NJRjJfMSkJRk0oU0VMX0hTQ0lGMl8yKQlGXygwLCAwKQorI2RlZmluZSBNT0RfU0VMMF8xMgkJRk0oU0VMX0VUSEVSQVZCXzApCUZNKFNFTF9FVEhFUkFWQl8xKQorI2RlZmluZSBNT0RfU0VMMF8xMQkJRk0oU0VMX0RSSUYzXzApCQlGTShTRUxfRFJJRjNfMSkKKyNkZWZpbmUgTU9EX1NFTDBfMTAJCUZNKFNFTF9EUklGMl8wKQkJRk0oU0VMX0RSSUYyXzEpCisjZGVmaW5lIE1PRF9TRUwwXzlfOAkJRk0oU0VMX0RSSUYxXzApCQlGTShTRUxfRFJJRjFfMSkJCUZNKFNFTF9EUklGMV8yKQkJRl8oMCwgMCkKKyNkZWZpbmUgTU9EX1NFTDBfN182CQlGTShTRUxfRFJJRjBfMCkJCUZNKFNFTF9EUklGMF8xKQkJRk0oU0VMX0RSSUYwXzIpCQlGXygwLCAwKQorI2RlZmluZSBNT0RfU0VMMF81CQlGTShTRUxfQ0FORkQwXzApCUZNKFNFTF9DQU5GRDBfMSkKKyNkZWZpbmUgTU9EX1NFTDBfNF8zCQlGTShTRUxfQURHX0FfMCkJCUZNKFNFTF9BREdfQV8xKQkJRk0oU0VMX0FER19BXzIpCQlGTShTRUxfQURHX0FfMykKKyNkZWZpbmUgTU9EX1NFTDBfMgkJRk0oU0VMXzVMSU5FXzApCQlGTShTRUxfNUxJTkVfMSkKKworLyogTU9EX1NFTDEgKi8JCQkvKiAwICovCQkJLyogMSAqLwkJCS8qIDIgKi8JCQkvKiAzICovCQkJLyogNCAqLwkJCS8qIDUgKi8JCQkvKiA2ICovCQkJLyogNyAqLworI2RlZmluZSBNT0RfU0VMMV8zMV8zMAkJRk0oU0VMX1RTSUYxXzApCQlGTShTRUxfVFNJRjFfMSkJCUZNKFNFTF9UU0lGMV8yKQkJRk0oU0VMX1RTSUYxXzMpCisjZGVmaW5lIE1PRF9TRUwxXzI5XzI4XzI3CUZNKFNFTF9UU0lGMF8wKQkJRk0oU0VMX1RTSUYwXzEpCQlGTShTRUxfVFNJRjBfMikJCUZNKFNFTF9UU0lGMF8zKQkJRk0oU0VMX1RTSUYwXzQpCQlGXygwLCAwKQkJRl8oMCwgMCkJCUZfKDAsIDApCisjZGVmaW5lIE1PRF9TRUwxXzI2CQlGTShTRUxfVElNRVJfVE1VXzApCUZNKFNFTF9USU1FUl9UTVVfMSkKKyNkZWZpbmUgTU9EX1NFTDFfMjVfMjQJCUZNKFNFTF9TU1AxXzFfMCkJRk0oU0VMX1NTUDFfMV8xKQlGTShTRUxfU1NQMV8xXzIpCUZNKFNFTF9TU1AxXzFfMykKKyNkZWZpbmUgTU9EX1NFTDFfMjNfMjJfMjEJRk0oU0VMX1NTUDFfMF8wKQlGTShTRUxfU1NQMV8wXzEpCUZNKFNFTF9TU1AxXzBfMikJRk0oU0VMX1NTUDFfMF8zKQlGTShTRUxfU1NQMV8wXzQpCUZfKDAsIDApCQlGXygwLCAwKQkJRl8oMCwgMCkKKyNkZWZpbmUgTU9EX1NFTDFfMjAJCUZNKFNFTF9TU0lfMCkJCUZNKFNFTF9TU0lfMSkKKyNkZWZpbmUgTU9EX1NFTDFfMTkJCUZNKFNFTF9TUEVFRF9QVUxTRV8wKQlGTShTRUxfU1BFRURfUFVMU0VfMSkKKyNkZWZpbmUgTU9EX1NFTDFfMThfMTcJCUZNKFNFTF9TSU1DQVJEXzApCUZNKFNFTF9TSU1DQVJEXzEpCUZNKFNFTF9TSU1DQVJEXzIpCUZNKFNFTF9TSU1DQVJEXzMpCisjZGVmaW5lIE1PRF9TRUwxXzE2CQlGTShTRUxfU0RISTJfMCkJCUZNKFNFTF9TREhJMl8xKQorI2RlZmluZSBNT0RfU0VMMV8xNV8xNAkJRk0oU0VMX1NDSUY0XzApCQlGTShTRUxfU0NJRjRfMSkJCUZNKFNFTF9TQ0lGNF8yKQkJRl8oMCwgMCkKKyNkZWZpbmUgTU9EX1NFTDFfMTMJCUZNKFNFTF9TQ0lGM18wKQkJRk0oU0VMX1NDSUYzXzEpCisjZGVmaW5lIE1PRF9TRUwxXzEyCQlGTShTRUxfU0NJRjJfMCkJCUZNKFNFTF9TQ0lGMl8xKQorI2RlZmluZSBNT0RfU0VMMV8xMQkJRk0oU0VMX1NDSUYxXzApCQlGTShTRUxfU0NJRjFfMSkKKyNkZWZpbmUgTU9EX1NFTDFfMTAJCUZNKFNFTF9TQVRBXzApCQlGTShTRUxfU0FUQV8xKQorI2RlZmluZSBNT0RfU0VMMV85CQlGTShTRUxfUkVNT0NPTl8wKQlGTShTRUxfUkVNT0NPTl8xKQorI2RlZmluZSBNT0RfU0VMMV82CQlGTShTRUxfUkNBTjBfMCkJCUZNKFNFTF9SQ0FOMF8xKQorI2RlZmluZSBNT0RfU0VMMV81CQlGTShTRUxfUFdNNl8wKQkJRk0oU0VMX1BXTTZfMSkKKyNkZWZpbmUgTU9EX1NFTDFfNAkJRk0oU0VMX1BXTTVfMCkJCUZNKFNFTF9QV001XzEpCisjZGVmaW5lIE1PRF9TRUwxXzMJCUZNKFNFTF9QV000XzApCQlGTShTRUxfUFdNNF8xKQorI2RlZmluZSBNT0RfU0VMMV8yCQlGTShTRUxfUFdNM18wKQkJRk0oU0VMX1BXTTNfMSkKKyNkZWZpbmUgTU9EX1NFTDFfMQkJRk0oU0VMX1BXTTJfMCkJCUZNKFNFTF9QV00yXzEpCisjZGVmaW5lIE1PRF9TRUwxXzAJCUZNKFNFTF9QV00xXzApCQlGTShTRUxfUFdNMV8xKQorCisvKiBNT0RfU0VMMSAqLwkJCS8qIDAgKi8JCQkvKiAxICovCQkJLyogMiAqLwkJCS8qIDMgKi8JCQkvKiA0ICovCQkJLyogNSAqLwkJCS8qIDYgKi8JCQkvKiA3ICovCisjZGVmaW5lIE1PRF9TRUwyXzMxCQlGTShJMkNfU0VMXzVfMCkJCUZNKEkyQ19TRUxfNV8xKQorI2RlZmluZSBNT0RfU0VMMl8zMAkJRk0oSTJDX1NFTF8zXzApCQlGTShJMkNfU0VMXzNfMSkKKyNkZWZpbmUgTU9EX1NFTDJfMjkJCUZNKEkyQ19TRUxfMF8wKQkJRk0oSTJDX1NFTF8wXzEpCisjZGVmaW5lIE1PRF9TRUwyXzI4XzI3CQlGTShTRUxfRk1fMCkJCUZNKFNFTF9GTV8xKQkJRk0oU0VMX0ZNXzIpCQlGTShTRUxfRk1fMykKKyNkZWZpbmUgTU9EX1NFTDJfMjYJCUZNKFNFTF9TQ0lGNV8wKQkJRk0oU0VMX1NDSUY1XzEpCisjZGVmaW5lIE1PRF9TRUwyXzI1XzI0XzIzCUZNKFNFTF9JMkM2XzApCQlGTShTRUxfSTJDNl8xKQkJRk0oU0VMX0kyQzZfMikJCUZfKDAsIDApCQlGXygwLCAwKQkJRl8oMCwgMCkJCUZfKDAsIDApCQlGXygwLCAwKQorI2RlZmluZSBNT0RfU0VMMl8yMgkJRk0oU0VMX05ERl8wKQkJRk0oU0VMX05ERl8xKQorI2RlZmluZSBNT0RfU0VMMl8yMQkJRk0oU0VMX1NTSTJfMCkJCUZNKFNFTF9TU0kyXzEpCisjZGVmaW5lIE1PRF9TRUwyXzIwCQlGTShTRUxfU1NJOV8wKQkJRk0oU0VMX1NTSTlfMSkKKyNkZWZpbmUgTU9EX1NFTDJfMTkJCUZNKFNFTF9USU1FUl9UTVUyXzApCUZNKFNFTF9USU1FUl9UTVUyXzEpCisjZGVmaW5lIE1PRF9TRUwyXzE4CQlGTShTRUxfQURHX0JfMCkJCUZNKFNFTF9BREdfQl8xKQorI2RlZmluZSBNT0RfU0VMMl8xNwkJRk0oU0VMX0FER19DXzApCQlGTShTRUxfQURHX0NfMSkKKyNkZWZpbmUgTU9EX1NFTDJfMAkJRk0oU0VMX1ZJTjRfMCkJCUZNKFNFTF9WSU40XzEpCisKKyNkZWZpbmUgUElOTVVYX01PRF9TRUxTCVwKK1wKK01PRF9TRUwwXzMxXzMwXzI5CU1PRF9TRUwxXzMxXzMwCQlNT0RfU0VMMl8zMSBcCisJCQkJCQlNT0RfU0VMMl8zMCBcCisJCQlNT0RfU0VMMV8yOV8yOF8yNwlNT0RfU0VMMl8yOSBcCitNT0RfU0VMMF8yOF8yNwkJCQkJTU9EX1NFTDJfMjhfMjcgXAorTU9EX1NFTDBfMjZfMjVfMjQJTU9EX1NFTDFfMjYJCU1PRF9TRUwyXzI2IFwKKwkJCU1PRF9TRUwxXzI1XzI0CQlNT0RfU0VMMl8yNV8yNF8yMyBcCitNT0RfU0VMMF8yMwkJTU9EX1NFTDFfMjNfMjJfMjEgXAorTU9EX1NFTDBfMjIJCQkJCU1PRF9TRUwyXzIyIFwKK01PRF9TRUwwXzIxCQkJCQlNT0RfU0VMMl8yMSBcCitNT0RfU0VMMF8yMAkJTU9EX1NFTDFfMjAJCU1PRF9TRUwyXzIwIFwKK01PRF9TRUwwXzE5CQlNT0RfU0VMMV8xOQkJTU9EX1NFTDJfMTkgXAorTU9EX1NFTDBfMThfMTcJCU1PRF9TRUwxXzE4XzE3CQlNT0RfU0VMMl8xOCBcCisJCQkJCQlNT0RfU0VMMl8xNyBcCitNT0RfU0VMMF8xNgkJTU9EX1NFTDFfMTYgXAorTU9EX1NFTDBfMTUJCU1PRF9TRUwxXzE1XzE0IFwKK01PRF9TRUwwXzE0XzEzIFwKKwkJCU1PRF9TRUwxXzEzIFwKK01PRF9TRUwwXzEyCQlNT0RfU0VMMV8xMiBcCitNT0RfU0VMMF8xMQkJTU9EX1NFTDFfMTEgXAorTU9EX1NFTDBfMTAJCU1PRF9TRUwxXzEwIFwKK01PRF9TRUwwXzlfOAkJTU9EX1NFTDFfOSBcCitNT0RfU0VMMF83XzYgXAorCQkJTU9EX1NFTDFfNiBcCitNT0RfU0VMMF81CQlNT0RfU0VMMV81IFwKK01PRF9TRUwwXzRfMwkJTU9EX1NFTDFfNCBcCisJCQlNT0RfU0VMMV8zIFwKK01PRF9TRUwwXzIJCU1PRF9TRUwxXzIgXAorCQkJTU9EX1NFTDFfMSBcCisJCQlNT0RfU0VMMV8wCQlNT0RfU0VMMl8wCisKK2VudW0geworCVBJTk1VWF9SRVNFUlZFRCA9IDAsCisKKwlQSU5NVVhfREFUQV9CRUdJTiwKKwlHUF9BTEwoREFUQSksCisJUElOTVVYX0RBVEFfRU5ELAorCisjZGVmaW5lIEZfKHgsIHkpCisjZGVmaW5lIEZNKHgpCUZOXyMjeCwKKwlQSU5NVVhfRlVOQ1RJT05fQkVHSU4sCisJR1BfQUxMKEZOKSwKKwlQSU5NVVhfR1BTUgorCVBJTk1VWF9JUFNSCisJUElOTVVYX01PRF9TRUxTCisJUElOTVVYX0ZVTkNUSU9OX0VORCwKKyN1bmRlZiBGXworI3VuZGVmIEZNCisKKyNkZWZpbmUgRl8oeCwgeSkKKyNkZWZpbmUgRk0oeCkJeCMjX01BUkssCisJUElOTVVYX01BUktfQkVHSU4sCisJUElOTVVYX0dQU1IKKwlQSU5NVVhfSVBTUgorCVBJTk1VWF9NT0RfU0VMUworCVBJTk1VWF9NQVJLX0VORCwKKyN1bmRlZiBGXworI3VuZGVmIEZNCit9OworCitzdGF0aWMgY29uc3QgdTE2IHBpbm11eF9kYXRhW10gPSB7CisJUElOTVVYX0RBVEFfR1BfQUxMKCksCisKKwlQSU5NVVhfU0lOR0xFKEFWUzEpLAorCVBJTk1VWF9TSU5HTEUoQVZTMiksCisJUElOTVVYX1NJTkdMRShDTEtPVVQpLAorCVBJTk1VWF9TSU5HTEUoR1A3XzAzKSwKKwlQSU5NVVhfU0lOR0xFKEhETUkwX0NFQyksCisJUElOTVVYX1NJTkdMRShNU0lPRjBfUlhEKSwKKwlQSU5NVVhfU0lOR0xFKE1TSU9GMF9TQ0spLAorCVBJTk1VWF9TSU5HTEUoTVNJT0YwX1RYRCksCisJUElOTVVYX1NJTkdMRShTU0lfU0NLNSksCisJUElOTVVYX1NJTkdMRShTU0lfU0RBVEE1KSwKKwlQSU5NVVhfU0lOR0xFKFNTSV9XUzUpLAorCisJLyogSVBTUjAgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8zXzAsCUFWQl9NREMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAwXzNfMCwJTVNJT0YyX1NTMl9DLAkJU0VMX01TSU9GMl8yKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzdfNCwJQVZCX01BR0lDKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMF83XzQsCU1TSU9GMl9TUzFfQywJCVNFTF9NU0lPRjJfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDBfN180LAlTQ0s0X0EsCQkJU0VMX1NDSUY0XzApLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDBfMTFfOCwJQVZCX1BIWV9JTlQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAwXzExXzgsCU1TSU9GMl9TWU5DX0MsCQlTRUxfTVNJT0YyXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAwXzExXzgsCVJYNF9BLAkJCVNFTF9TQ0lGNF8wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzE1XzEyLAlBVkJfTElOSyksCisJUElOTVVYX0lQU1JfTVNFTChJUDBfMTVfMTIsCU1TSU9GMl9TQ0tfQywJCVNFTF9NU0lPRjJfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDBfMTVfMTIsCVRYNF9BLAkJCVNFTF9TQ0lGNF8wKSwKKworCVBJTk1VWF9JUFNSX01TRUwoSVAwXzE5XzE2LAlBVkJfQVZUUF9NQVRDSF9BLAlTRUxfRVRIRVJBVkJfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDBfMTlfMTYsCU1TSU9GMl9SWERfQywJCVNFTF9NU0lPRjJfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDBfMTlfMTYsCUNUUzRfTl9BLAkJU0VMX1NDSUY0XzApLAorCisJUElOTVVYX0lQU1JfTVNFTChJUDBfMjNfMjAsCUFWQl9BVlRQX0NBUFRVUkVfQSwJU0VMX0VUSEVSQVZCXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAwXzIzXzIwLAlNU0lPRjJfVFhEX0MsCQlTRUxfTVNJT0YyXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAwXzIzXzIwLAlSVFM0X05fVEFOU19BLAkJU0VMX1NDSUY0XzApLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDBfMjdfMjQsCUlSUTApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzI3XzI0LAlRUE9MQiksCisJUElOTVVYX0lQU1JfR1BTUihJUDBfMjdfMjQsCURVX0NERSksCisJUElOTVVYX0lQU1JfTVNFTChJUDBfMjdfMjQsCVZJNF9EQVRBMF9CLAkJU0VMX1ZJTjRfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDBfMjdfMjQsCUNBTjBfVFhfQiwJCVNFTF9SQ0FOMF8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMF8yN18yNCwJQ0FORkQwX1RYX0IsCQlTRUxfQ0FORkQwXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAwXzI3XzI0LAlNU0lPRjNfU1MyX0UsCQlTRUxfTVNJT0YzXzQpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDBfMzFfMjgsCUlSUTEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzMxXzI4LAlRUE9MQSksCisJUElOTVVYX0lQU1JfR1BTUihJUDBfMzFfMjgsCURVX0RJU1ApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAwXzMxXzI4LAlWSTRfREFUQTFfQiwJCVNFTF9WSU40XzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAwXzMxXzI4LAlDQU4wX1JYX0IsCQlTRUxfUkNBTjBfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDBfMzFfMjgsCUNBTkZEMF9SWF9CLAkJU0VMX0NBTkZEMF8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMF8yN18yNCwJTVNJT0YzX1NTMV9FLAkJU0VMX01TSU9GM180KSwKKworCS8qIElQU1IxICovCisJUElOTVVYX0lQU1JfR1BTUihJUDFfM18wLAlJUlEyKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8zXzAsCVFDUFZfUURFKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8zXzAsCURVX0VYT0RERl9EVV9PRERGX0RJU1BfQ0RFKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMV8zXzAsCVZJNF9EQVRBMl9CLAkJU0VMX1ZJTjRfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDFfM18wLAlQV00zX0IsCQkJU0VMX1BXTTNfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDFfM18wLAlNU0lPRjNfU1lOQ19FLAkJU0VMX01TSU9GM180KSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzdfNCwJSVJRMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfN180LAlRU1RWQl9RVkUpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzdfNCwJQTI1KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV83XzQsCURVX0RPVENMS09VVDEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxXzdfNCwJVkk0X0RBVEEzX0IsCQlTRUxfVklONF8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMV83XzQsCVBXTTRfQiwJCQlTRUxfUFdNNF8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMV83XzQsCU1TSU9GM19TQ0tfRSwJCVNFTF9NU0lPRjNfNCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8xMV84LAlJUlE0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8xMV84LAlRU1RIX1FIUyksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTFfOCwJQTI0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8xMV84LAlEVV9FWEhTWU5DX0RVX0hTWU5DKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMV8xMV84LAlWSTRfREFUQTRfQiwJCVNFTF9WSU40XzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxXzExXzgsCVBXTTVfQiwJCQlTRUxfUFdNNV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMV8xMV84LAlNU0lPRjNfUlhEX0UsCQlTRUxfTVNJT0YzXzQpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTVfMTIsCUlSUTUpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzE1XzEyLAlRU1RCX1FIRSksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTVfMTIsCUEyMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTVfMTIsCURVX0VYVlNZTkNfRFVfVlNZTkMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxXzE1XzEyLAlWSTRfREFUQTVfQiwJCVNFTF9WSU40XzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxXzE1XzEyLAlQV002X0IsCQkJU0VMX1BXTTZfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDFfMTVfMTIsCU1TSU9GM19UWERfRSwJCVNFTF9NU0lPRjNfNCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8xOV8xNiwJUFdNMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTlfMTYsCUFWQl9BVlRQX1BQUyksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTlfMTYsCUEyMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDFfMTlfMTYsCVZJNF9EQVRBNl9CLAkJU0VMX1ZJTjRfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDFfMTlfMTYsCUlFQ0xLX0IsCQlTRUxfSUVCVVNfMSksCisKKwlQSU5NVVhfSVBTUl9NU0VMKElQMV8yM18yMCwJUFdNMV9BLAkJCVNFTF9QV00xXzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzIzXzIwLAlBMjEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxXzIzXzIwLAlIUlgzX0QsCQkJU0VMX0hTQ0lGM18zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMV8yM18yMCwJVkk0X0RBVEE3X0IsCQlTRUxfVklONF8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMV8yM18yMCwJSUVSWF9CLAkJCVNFTF9JRUJVU18xKSwKKworCVBJTk1VWF9JUFNSX01TRUwoSVAxXzI3XzI0LAlQV00yX0EsCQkJU0VMX1BXTTJfMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMjdfMjQsCUEyMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDFfMjdfMjQsCUhUWDNfRCwJCQlTRUxfSFNDSUYzXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxXzI3XzI0LAlJRVRYX0IsCQkJU0VMX0lFQlVTXzEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMzFfMjgsCUEwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8zMV8yOCwJTENET1VUMTYpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxXzMxXzI4LAlNU0lPRjNfU1lOQ19CLAkJU0VMX01TSU9GM18xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8zMV8yOCwJVkk0X0RBVEE4KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8zMV8yOCwJRFVfREIwKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMV8zMV8yOCwJUFdNM19BLAkJCVNFTF9QV00zXzApLAorCisJLyogSVBTUjIgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8zXzAsCUExKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8zXzAsCUxDRE9VVDE3KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMl8zXzAsCU1TSU9GM19UWERfQiwJCVNFTF9NU0lPRjNfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfM18wLAlWSTRfREFUQTkpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzNfMCwJRFVfREIxKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMl8zXzAsCVBXTTRfQSwJCQlTRUxfUFdNNF8wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzdfNCwJQTIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzdfNCwJTENET1VUMTgpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAyXzdfNCwJTVNJT0YzX1NDS19CLAkJU0VMX01TSU9GM18xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl83XzQsCVZJNF9EQVRBMTApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzdfNCwJRFVfREIyKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMl83XzQsCVBXTTVfQSwJCQlTRUxfUFdNNV8wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzExXzgsCUEzKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xMV84LAlMQ0RPVVQxOSksCisJUElOTVVYX0lQU1JfTVNFTChJUDJfMTFfOCwJTVNJT0YzX1JYRF9CLAkJU0VMX01TSU9GM18xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xMV84LAlWSTRfREFUQTExKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xMV84LAlEVV9EQjMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAyXzExXzgsCVBXTTZfQSwJCQlTRUxfUFdNNl8wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzE1XzEyLAlBNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMTVfMTIsCUxDRE9VVDIwKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMl8xNV8xMiwJTVNJT0YzX1NTMV9CLAkJU0VMX01TSU9GM18xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xNV8xMiwJVkk0X0RBVEExMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMTVfMTIsCVZJNV9EQVRBMTIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzE1XzEyLAlEVV9EQjQpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMTlfMTYsCUE1KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xOV8xNiwJTENET1VUMjEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAyXzE5XzE2LAlNU0lPRjNfU1MyX0IsCQlTRUxfTVNJT0YzXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAyXzE5XzE2LAlTQ0s0X0IsCQkJU0VMX1NDSUY0XzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzE5XzE2LAlWSTRfREFUQTEzKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xOV8xNiwJVkk1X0RBVEExMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMTlfMTYsCURVX0RCNSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8yM18yMCwJQTYpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzIzXzIwLAlMQ0RPVVQyMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDJfMjNfMjAsCU1TSU9GMl9TUzFfQSwJCVNFTF9NU0lPRjJfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDJfMjNfMjAsCVJYNF9CLAkJCVNFTF9TQ0lGNF8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8yM18yMCwJVkk0X0RBVEExNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMjNfMjAsCVZJNV9EQVRBMTQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzIzXzIwLAlEVV9EQjYpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMjdfMjQsCUE3KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8yN18yNCwJTENET1VUMjMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAyXzI3XzI0LAlNU0lPRjJfU1MyX0EsCQlTRUxfTVNJT0YyXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAyXzI3XzI0LAlUWDRfQiwJCQlTRUxfU0NJRjRfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMjdfMjQsCVZJNF9EQVRBMTUpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzI3XzI0LAlWSTVfREFUQTE1KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8yN18yNCwJRFVfREI3KSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzMxXzI4LAlBOCksCisJUElOTVVYX0lQU1JfTVNFTChJUDJfMzFfMjgsCVJYM19CLAkJCVNFTF9TQ0lGM18xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMl8zMV8yOCwJTVNJT0YyX1NZTkNfQSwJCVNFTF9NU0lPRjJfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDJfMzFfMjgsCUhSWDRfQiwJCQlTRUxfSFNDSUY0XzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAyXzMxXzI4LAlTREE2X0EsCQkJU0VMX0kyQzZfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDJfMzFfMjgsCUFWQl9BVlRQX01BVENIX0IsCVNFTF9FVEhFUkFWQl8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMl8zMV8yOCwJUFdNMV9CLAkJCVNFTF9QV00xXzEpLAorCisJLyogSVBTUjMgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQM18zXzAsCUE5KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQM18zXzAsCU1TSU9GMl9TQ0tfQSwJCVNFTF9NU0lPRjJfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDNfM18wLAlDVFM0X05fQiwJCVNFTF9TQ0lGNF8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18zXzAsCVZJNV9WU1lOQ19OKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzdfNCwJQTEwKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQM183XzQsCU1TSU9GMl9SWERfQSwJCVNFTF9NU0lPRjJfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDNfN180LAlSVFM0X05fVEFOU19CLAkJU0VMX1NDSUY0XzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzdfNCwJVkk1X0hTWU5DX04pLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTFfOCwJQTExKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQM18xMV84LAlUWDNfQiwJCQlTRUxfU0NJRjNfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDNfMTFfOCwJTVNJT0YyX1RYRF9BLAkJU0VMX01TSU9GMl8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQM18xMV84LAlIVFg0X0IsCQkJU0VMX0hTQ0lGNF8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18xMV84LAlIU0NLNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTFfOCwJVkk1X0ZJRUxEKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQM18xMV84LAlTQ0w2X0EsCQkJU0VMX0kyQzZfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDNfMTFfOCwJQVZCX0FWVFBfQ0FQVFVSRV9CLAlTRUxfRVRIRVJBVkJfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDNfMTFfOCwJUFdNMl9CLAkJCVNFTF9QV00yXzEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTVfMTIsCUExMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTVfMTIsCUxDRE9VVDEyKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQM18xNV8xMiwJTVNJT0YzX1NDS19DLAkJU0VMX01TSU9GM18yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQM18xNV8xMiwJSFJYNF9BLAkJCVNFTF9IU0NJRjRfMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTVfMTIsCVZJNV9EQVRBOCksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTVfMTIsCURVX0RHNCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18xOV8xNiwJQTEzKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18xOV8xNiwJTENET1VUMTMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAzXzE5XzE2LAlNU0lPRjNfU1lOQ19DLAkJU0VMX01TSU9GM18yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQM18xOV8xNiwJSFRYNF9BLAkJCVNFTF9IU0NJRjRfMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTlfMTYsCVZJNV9EQVRBOSksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTlfMTYsCURVX0RHNSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18yM18yMCwJQTE0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18yM18yMCwJTENET1VUMTQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAzXzIzXzIwLAlNU0lPRjNfUlhEX0MsCQlTRUxfTVNJT0YzXzIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzIzXzIwLAlIQ1RTNF9OKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18yM18yMCwJVkk1X0RBVEExMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMjNfMjAsCURVX0RHNiksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18yN18yNCwJQTE1KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18yN18yNCwJTENET1VUMTUpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAzXzI3XzI0LAlNU0lPRjNfVFhEX0MsCQlTRUxfTVNJT0YzXzIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzI3XzI0LAlIUlRTNF9OKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18yN18yNCwJVkk1X0RBVEExMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMjdfMjQsCURVX0RHNyksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18zMV8yOCwJQTE2KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18zMV8yOCwJTENET1VUOCksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMzFfMjgsCVZJNF9GSUVMRCksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMzFfMjgsCURVX0RHMCksCisKKwkvKiBJUFNSNCAqLworCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzNfMCwJQTE3KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8zXzAsCUxDRE9VVDkpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzNfMCwJVkk0X1ZTWU5DX04pLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzNfMCwJRFVfREcxKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzdfNCwJQTE4KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF83XzQsCUxDRE9VVDEwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF83XzQsCVZJNF9IU1lOQ19OKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF83XzQsCURVX0RHMiksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8xMV84LAlBMTkpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzExXzgsCUxDRE9VVDExKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8xMV84LAlWSTRfQ0xLRU5CKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8xMV84LAlEVV9ERzMpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMTVfMTIsCUNTMF9OKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8xNV8xMiwJVkk1X0NMS0VOQiksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8xOV8xNiwJQ1MxX05fQTI2KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8xOV8xNiwJVkk1X0NMSyksCisJUElOTVVYX0lQU1JfTVNFTChJUDRfMTlfMTYsCUVYX1dBSVQwX0IsCQlTRUxfTEJTQ18xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzIzXzIwLAlCU19OKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8yM18yMCwJUVNUVkFfUVZTKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNF8yM18yMCwJTVNJT0YzX1NDS19ELAkJU0VMX01TSU9GM18zKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8yM18yMCwJU0NLMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMjNfMjAsCUhTQ0szKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8yM18yMCwJQ0FOMV9UWCksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMjNfMjAsCUNBTkZEMV9UWCksCisJUElOTVVYX0lQU1JfTVNFTChJUDRfMjNfMjAsCUlFVFhfQSwJCQlTRUxfSUVCVVNfMCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8yN18yNCwJUkRfTiksCisJUElOTVVYX0lQU1JfTVNFTChJUDRfMjdfMjQsCU1TSU9GM19TWU5DX0QsCQlTRUxfTVNJT0YzXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA0XzI3XzI0LAlSWDNfQSwJCQlTRUxfU0NJRjNfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDRfMjdfMjQsCUhSWDNfQSwJCQlTRUxfSFNDSUYzXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVA0XzI3XzI0LAlDQU4wX1RYX0EsCQlTRUxfUkNBTjBfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDRfMjdfMjQsCUNBTkZEMF9UWF9BLAkJU0VMX0NBTkZEMF8wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzMxXzI4LAlSRF9XUl9OKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNF8zMV8yOCwJTVNJT0YzX1JYRF9ELAkJU0VMX01TSU9GM18zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNF8zMV8yOCwJVFgzX0EsCQkJU0VMX1NDSUYzXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVA0XzMxXzI4LAlIVFgzX0EsCQkJU0VMX0hTQ0lGM18wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNF8zMV8yOCwJQ0FOMF9SWF9BLAkJU0VMX1JDQU4wXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVA0XzMxXzI4LAlDQU5GRDBfUlhfQSwJCVNFTF9DQU5GRDBfMCksCisKKwkvKiBJUFNSNSAqLworCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzNfMCwJV0UwX04pLAorCVBJTk1VWF9JUFNSX01TRUwoSVA1XzNfMCwJTVNJT0YzX1RYRF9ELAkJU0VMX01TSU9GM18zKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8zXzAsCUNUUzNfTiksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfM18wLAlIQ1RTM19OKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNV8zXzAsCVNDTDZfQiwJCQlTRUxfSTJDNl8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8zXzAsCUNBTl9DTEspLAorCVBJTk1VWF9JUFNSX01TRUwoSVA1XzNfMCwJSUVDTEtfQSwJCVNFTF9JRUJVU18wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzdfNCwJV0UxX04pLAorCVBJTk1VWF9JUFNSX01TRUwoSVA1XzdfNCwJTVNJT0YzX1NTMV9ELAkJU0VMX01TSU9GM18zKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV83XzQsCVJUUzNfTl9UQU5TKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV83XzQsCUhSVFMzX04pLAorCVBJTk1VWF9JUFNSX01TRUwoSVA1XzdfNCwJU0RBNl9CLAkJCVNFTF9JMkM2XzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzdfNCwJQ0FOMV9SWCksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfN180LAlDQU5GRDFfUlgpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA1XzdfNCwJSUVSWF9BLAkJCVNFTF9JRUJVU18wKSwKKworCVBJTk1VWF9JUFNSX01TRUwoSVA1XzExXzgsCUVYX1dBSVQwX0EsCQlTRUxfTEJTQ18wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8xMV84LAlRQ0xLKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8xMV84LAlWSTRfQ0xLKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8xMV84LAlEVV9ET1RDTEtPVVQwKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzE1XzEyLAlEMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDVfMTVfMTIsCU1TSU9GMl9TUzFfQiwJCVNFTF9NU0lPRjJfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDVfMTVfMTIsCU1TSU9GM19TQ0tfQSwJCVNFTF9NU0lPRjNfMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfMTVfMTIsCVZJNF9EQVRBMTYpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzE1XzEyLAlWSTVfREFUQTApLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDVfMTlfMTYsCUQxKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNV8xOV8xNiwJTVNJT0YyX1NTMl9CLAkJU0VMX01TSU9GMl8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNV8xOV8xNiwJTVNJT0YzX1NZTkNfQSwJCVNFTF9NU0lPRjNfMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfMTlfMTYsCVZJNF9EQVRBMTcpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzE5XzE2LAlWSTVfREFUQTEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDVfMjNfMjAsCUQyKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNV8yM18yMCwJTVNJT0YzX1JYRF9BLAkJU0VMX01TSU9GM18wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8yM18yMCwJVkk0X0RBVEExOCksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfMjNfMjAsCVZJNV9EQVRBMiksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8yN18yNCwJRDMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA1XzI3XzI0LAlNU0lPRjNfVFhEX0EsCQlTRUxfTVNJT0YzXzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzI3XzI0LAlWSTRfREFUQTE5KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8yN18yNCwJVkk1X0RBVEEzKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzMxXzI4LAlENCksCisJUElOTVVYX0lQU1JfTVNFTChJUDVfMzFfMjgsCU1TSU9GMl9TQ0tfQiwJCVNFTF9NU0lPRjJfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfMzFfMjgsCVZJNF9EQVRBMjApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzMxXzI4LAlWSTVfREFUQTQpLAorCisJLyogSVBTUjYgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8zXzAsCUQ1KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNl8zXzAsCU1TSU9GMl9TWU5DX0IsCQlTRUxfTVNJT0YyXzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzNfMCwJVkk0X0RBVEEyMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfM18wLAlWSTVfREFUQTUpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDZfN180LAlENiksCisJUElOTVVYX0lQU1JfTVNFTChJUDZfN180LAlNU0lPRjJfUlhEX0IsCQlTRUxfTVNJT0YyXzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzdfNCwJVkk0X0RBVEEyMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfN180LAlWSTVfREFUQTYpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMTFfOCwJRDcpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA2XzExXzgsCU1TSU9GMl9UWERfQiwJCVNFTF9NU0lPRjJfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMTFfOCwJVkk0X0RBVEEyMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMTFfOCwJVkk1X0RBVEE3KSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzE1XzEyLAlEOCksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMTVfMTIsCUxDRE9VVDApLAorCVBJTk1VWF9JUFNSX01TRUwoSVA2XzE1XzEyLAlNU0lPRjJfU0NLX0QsCQlTRUxfTVNJT0YyXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA2XzE1XzEyLAlTQ0s0X0MsCQkJU0VMX1NDSUY0XzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA2XzE1XzEyLAlWSTRfREFUQTBfQSwJCVNFTF9WSU40XzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzE1XzEyLAlEVV9EUjApLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMTlfMTYsCUQ5KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8xOV8xNiwJTENET1VUMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDZfMTlfMTYsCU1TSU9GMl9TWU5DX0QsCQlTRUxfTVNJT0YyXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA2XzE5XzE2LAlWSTRfREFUQTFfQSwJCVNFTF9WSU40XzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzE5XzE2LAlEVV9EUjEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMjNfMjAsCUQxMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMjNfMjAsCUxDRE9VVDIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA2XzIzXzIwLAlNU0lPRjJfUlhEX0QsCQlTRUxfTVNJT0YyXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA2XzIzXzIwLAlIUlgzX0IsCQkJU0VMX0hTQ0lGM18xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNl8yM18yMCwJVkk0X0RBVEEyX0EsCQlTRUxfVklONF8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNl8yM18yMCwJQ1RTNF9OX0MsCQlTRUxfU0NJRjRfMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMjNfMjAsCURVX0RSMiksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8yN18yNCwJRDExKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8yN18yNCwJTENET1VUMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDZfMjdfMjQsCU1TSU9GMl9UWERfRCwJCVNFTF9NU0lPRjJfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDZfMjdfMjQsCUhUWDNfQiwJCQlTRUxfSFNDSUYzXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA2XzI3XzI0LAlWSTRfREFUQTNfQSwJCVNFTF9WSU40XzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVA2XzI3XzI0LAlSVFM0X05fVEFOU19DLAkJU0VMX1NDSUY0XzIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzI3XzI0LAlEVV9EUjMpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMzFfMjgsCUQxMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMzFfMjgsCUxDRE9VVDQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA2XzMxXzI4LAlNU0lPRjJfU1MxX0QsCQlTRUxfTVNJT0YyXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA2XzMxXzI4LAlSWDRfQywJCQlTRUxfU0NJRjRfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDZfMzFfMjgsCVZJNF9EQVRBNF9BLAkJU0VMX1ZJTjRfMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMzFfMjgsCURVX0RSNCksCisKKwkvKiBJUFNSNyAqLworCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzNfMCwJRDEzKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQN18zXzAsCUxDRE9VVDUpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA3XzNfMCwJTVNJT0YyX1NTMl9ELAkJU0VMX01TSU9GMl8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQN18zXzAsCVRYNF9DLAkJCVNFTF9TQ0lGNF8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQN18zXzAsCVZJNF9EQVRBNV9BLAkJU0VMX1ZJTjRfMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfM18wLAlEVV9EUjUpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDdfN180LAlEMTQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzdfNCwJTENET1VUNiksCisJUElOTVVYX0lQU1JfTVNFTChJUDdfN180LAlNU0lPRjNfU1MxX0EsCQlTRUxfTVNJT0YzXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVA3XzdfNCwJSFJYM19DLAkJCVNFTF9IU0NJRjNfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDdfN180LAlWSTRfREFUQTZfQSwJCVNFTF9WSU40XzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzdfNCwJRFVfRFI2KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQN183XzQsCVNDTDZfQywJCQlTRUxfSTJDNl8yKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzExXzgsCUQxNSksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfMTFfOCwJTENET1VUNyksCisJUElOTVVYX0lQU1JfTVNFTChJUDdfMTFfOCwJTVNJT0YzX1NTMl9BLAkJU0VMX01TSU9GM18wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQN18xMV84LAlIVFgzX0MsCQkJU0VMX0hTQ0lGM18yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQN18xMV84LAlWSTRfREFUQTdfQSwJCVNFTF9WSU40XzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzExXzgsCURVX0RSNyksCisJUElOTVVYX0lQU1JfTVNFTChJUDdfMTFfOCwJU0RBNl9DLAkJCVNFTF9JMkM2XzIpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDdfMTVfMTIsCUZTQ0xLU1QpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDdfMTlfMTYsCVNEMF9DTEspLAorCVBJTk1VWF9JUFNSX01TRUwoSVA3XzE5XzE2LAlNU0lPRjFfU0NLX0UsCQlTRUxfTVNJT0YxXzQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA3XzE5XzE2LAlTVFBfT1BXTV8wX0IsCQlTRUxfU1NQMV8wXzEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDdfMjNfMjAsCVNEMF9DTUQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA3XzIzXzIwLAlNU0lPRjFfU1lOQ19FLAkJU0VMX01TSU9GMV80KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQN18yM18yMCwJU1RQX0lWQ1hPMjdfMF9CLAlTRUxfU1NQMV8wXzEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDdfMjdfMjQsCVNEMF9EQVQwKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQN18yN18yNCwJTVNJT0YxX1JYRF9FLAkJU0VMX01TSU9GMV80KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQN18yN18yNCwJVFNfU0NLMF9CLAkJU0VMX1RTSUYwXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA3XzI3XzI0LAlTVFBfSVNDTEtfMF9CLAkJU0VMX1NTUDFfMF8xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzMxXzI4LAlTRDBfREFUMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDdfMzFfMjgsCU1TSU9GMV9UWERfRSwJCVNFTF9NU0lPRjFfNCksCisJUElOTVVYX0lQU1JfTVNFTChJUDdfMzFfMjgsCVRTX1NQU1lOQzBfQiwJCVNFTF9UU0lGMF8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQN18zMV8yOCwJU1RQX0lTU1lOQ18wX0IsCQlTRUxfU1NQMV8wXzEpLAorCisJLyogSVBTUjggKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQOF8zXzAsCVNEMF9EQVQyKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF8zXzAsCU1TSU9GMV9TUzFfRSwJCVNFTF9NU0lPRjFfNCksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfM18wLAlUU19TREFUMF9CLAkJU0VMX1RTSUYwXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA4XzNfMCwJU1RQX0lTRF8wX0IsCQlTRUxfU1NQMV8wXzEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDhfN180LAlTRDBfREFUMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfN180LAlNU0lPRjFfU1MyX0UsCQlTRUxfTVNJT0YxXzQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA4XzdfNCwJVFNfU0RFTjBfQiwJCVNFTF9UU0lGMF8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF83XzQsCVNUUF9JU0VOXzBfQiwJCVNFTF9TU1AxXzBfMSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQOF8xMV84LAlTRDFfQ0xLKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF8xMV84LAlNU0lPRjFfU0NLX0csCQlTRUxfTVNJT0YxXzYpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA4XzExXzgsCVNJTTBfQ0xLX0EsCQlTRUxfU0lNQ0FSRF8wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA4XzE1XzEyLAlTRDFfQ01EKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF8xNV8xMiwJTVNJT0YxX1NZTkNfRywJCVNFTF9NU0lPRjFfNiksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfMTVfMTIsCU5GQ0VfTl9CLAkJU0VMX05ERl8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF8xNV8xMiwJU0lNMF9EX0EsCQlTRUxfU0lNQ0FSRF8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF8xNV8xMiwJU1RQX0lWQ1hPMjdfMV9CLAlTRUxfU1NQMV8xXzEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDhfMTlfMTYsCVNEMV9EQVQwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQOF8xOV8xNiwJU0QyX0RBVDQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA4XzE5XzE2LAlNU0lPRjFfUlhEX0csCQlTRUxfTVNJT0YxXzYpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA4XzE5XzE2LAlORldQX05fQiwJCVNFTF9OREZfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfMTlfMTYsCVRTX1NDSzFfQiwJCVNFTF9UU0lGMV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF8xOV8xNiwJU1RQX0lTQ0xLXzFfQiwJCVNFTF9TU1AxXzFfMSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQOF8yM18yMCwJU0QxX0RBVDEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA4XzIzXzIwLAlTRDJfREFUNSksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfMjNfMjAsCU1TSU9GMV9UWERfRywJCVNFTF9NU0lPRjFfNiksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfMjNfMjAsCU5GREFUQTE0X0IsCQlTRUxfTkRGXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA4XzIzXzIwLAlUU19TUFNZTkMxX0IsCQlTRUxfVFNJRjFfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfMjNfMjAsCVNUUF9JU1NZTkNfMV9CLAkJU0VMX1NTUDFfMV8xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA4XzI3XzI0LAlTRDFfREFUMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDhfMjdfMjQsCVNEMl9EQVQ2KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF8yN18yNCwJTVNJT0YxX1NTMV9HLAkJU0VMX01TSU9GMV82KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF8yN18yNCwJTkZEQVRBMTVfQiwJCVNFTF9OREZfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfMjdfMjQsCVRTX1NEQVQxX0IsCQlTRUxfVFNJRjFfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfMjdfMjQsCVNUUF9JU0RfMV9CLAkJU0VMX1NTUDFfMV8xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA4XzMxXzI4LAlTRDFfREFUMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDhfMzFfMjgsCVNEMl9EQVQ3KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF8zMV8yOCwJTVNJT0YxX1NTMl9HLAkJU0VMX01TSU9GMV82KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF8zMV8yOCwJTkZSQl9OX0IsCQlTRUxfTkRGXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA4XzMxXzI4LAlUU19TREVOMV9CLAkJU0VMX1RTSUYxXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA4XzMxXzI4LAlTVFBfSVNFTl8xX0IsCQlTRUxfU1NQMV8xXzEpLAorCisJLyogSVBTUjkgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQOV8zXzAsCVNEMl9DTEspLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA5XzNfMCwJTkZEQVRBOCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQOV83XzQsCVNEMl9DTUQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA5XzdfNCwJTkZEQVRBOSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQOV8xMV84LAlTRDJfREFUMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDlfMTFfOCwJTkZEQVRBMTApLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDlfMTVfMTIsCVNEMl9EQVQxKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQOV8xNV8xMiwJTkZEQVRBMTEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDlfMTlfMTYsCVNEMl9EQVQyKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQOV8xOV8xNiwJTkZEQVRBMTIpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDlfMjNfMjAsCVNEMl9EQVQzKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQOV8yM18yMCwJTkZEQVRBMTMpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDlfMjdfMjQsCVNEMl9EUyksCisJUElOTVVYX0lQU1JfR1BTUihJUDlfMjdfMjQsCU5GQUxFKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA5XzMxXzI4LAlTRDNfQ0xLKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQOV8zMV8yOCwJTkZXRV9OKSwKKworCS8qIElQU1IxMCAqLworCVBJTk1VWF9JUFNSX0dQU1IoSVAxMF8zXzAsCVNEM19DTUQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxMF8zXzAsCU5GUkVfTiksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTBfN180LAlTRDNfREFUMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDEwXzdfNCwJTkZEQVRBMCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTBfMTFfOCwJU0QzX0RBVDEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxMF8xMV84LAlORkRBVEExKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxMF8xNV8xMiwJU0QzX0RBVDIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxMF8xNV8xMiwJTkZEQVRBMiksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTBfMTlfMTYsCVNEM19EQVQzKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTBfMTlfMTYsCU5GREFUQTMpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDEwXzIzXzIwLAlTRDNfREFUNCksCisJUElOTVVYX0lQU1JfTVNFTChJUDEwXzIzXzIwLAlTRDJfQ0RfQSwJCVNFTF9TREhJMl8wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTBfMjNfMjAsCU5GREFUQTQpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDEwXzI3XzI0LAlTRDNfREFUNSksCisJUElOTVVYX0lQU1JfTVNFTChJUDEwXzI3XzI0LAlTRDJfV1BfQSwJCVNFTF9TREhJMl8wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTBfMjdfMjQsCU5GREFUQTUpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDEwXzMxXzI4LAlTRDNfREFUNiksCisJUElOTVVYX0lQU1JfR1BTUihJUDEwXzMxXzI4LAlTRDNfQ0QpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxMF8zMV8yOCwJTkZEQVRBNiksCisKKwkvKiBJUFNSMTEgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQMTFfM18wLAlTRDNfREFUNyksCisJUElOTVVYX0lQU1JfR1BTUihJUDExXzNfMCwJU0QzX1dQKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTFfM18wLAlORkRBVEE3KSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxMV83XzQsCVNEM19EUyksCisJUElOTVVYX0lQU1JfR1BTUihJUDExXzdfNCwJTkZDTEUpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDExXzExXzgsCVNEMF9DRCksCisJUElOTVVYX0lQU1JfTVNFTChJUDExXzExXzgsCVNDTDJfQiwJCQlTRUxfSTJDMl8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTFfMTFfOCwJU0lNMF9SU1RfQSwJCVNFTF9TSU1DQVJEXzApLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDExXzE1XzEyLAlTRDBfV1ApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMV8xNV8xMiwJU0RBMl9CLAkJCVNFTF9JMkMyXzEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDExXzE5XzE2LAlTRDFfQ0QpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMV8xOV8xNiwJU0lNMF9DTEtfQiwJCVNFTF9TSU1DQVJEXzEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDExXzIzXzIwLAlTRDFfV1ApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMV8yM18yMCwJU0lNMF9EX0IsCQlTRUxfU0lNQ0FSRF8xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxMV8yN18yNCwJU0NLMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDExXzI3XzI0LAlIU0NLMV9CLAkJU0VMX0hTQ0lGMV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTFfMjdfMjQsCU1TSU9GMV9TUzJfQiwJCVNFTF9NU0lPRjFfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDExXzI3XzI0LAlBVURJT19DTEtDX0IsCQlTRUxfQURHX0NfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDExXzI3XzI0LAlTREEyX0EsCQkJU0VMX0kyQzJfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDExXzI3XzI0LAlTSU0wX1JTVF9CLAkJU0VMX1NJTUNBUkRfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDExXzI3XzI0LAlTVFBfT1BXTV8wX0MsCQlTRUxfU1NQMV8wXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMV8yN18yNCwJUklGMF9DTEtfQiwJCVNFTF9EUklGMF8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTFfMjdfMjQsCUFESUNIUzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMV8yN18yNCwJU0NLNV9CLAkJCVNFTF9TQ0lGNV8xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxMV8zMV8yOCwJUlgwKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTFfMzFfMjgsCUhSWDFfQiwJCQlTRUxfSFNDSUYxXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMV8zMV8yOCwJVFNfU0NLMF9DLAkJU0VMX1RTSUYwXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMV8zMV8yOCwJU1RQX0lTQ0xLXzBfQywJCVNFTF9TU1AxXzBfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDExXzMxXzI4LAlSSUYwX0QwX0IsCQlTRUxfRFJJRjBfMSksCisKKwkvKiBJUFNSMTIgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQMTJfM18wLAlUWDApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8zXzAsCUhUWDFfQiwJCQlTRUxfSFNDSUYxXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8zXzAsCVRTX1NQU1lOQzBfQywJCVNFTF9UU0lGMF8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfM18wLAlTVFBfSVNTWU5DXzBfQywJCVNFTF9TU1AxXzBfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzNfMCwJUklGMF9EMV9CLAkJU0VMX0RSSUYwXzEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDEyXzdfNCwJQ1RTMF9OKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfN180LAlIQ1RTMV9OX0IsCQlTRUxfSFNDSUYxXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl83XzQsCU1TSU9GMV9TWU5DX0IsCQlTRUxfTVNJT0YxXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl83XzQsCVRTX1NQU1lOQzFfQywJCVNFTF9UU0lGMV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfN180LAlTVFBfSVNTWU5DXzFfQywJCVNFTF9TU1AxXzFfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzdfNCwJUklGMV9TWU5DX0IsCQlTRUxfRFJJRjFfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDEyXzdfNCwJQVVESU9fQ0xLT1VUX0MpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxMl83XzQsCUFESUNTX1NBTVApLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDEyXzExXzgsCVJUUzBfTl9UQU5TKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMTFfOCwJSFJUUzFfTl9CLAkJU0VMX0hTQ0lGMV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMTFfOCwJTVNJT0YxX1NTMV9CLAkJU0VMX01TSU9GMV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMTFfOCwJQVVESU9fQ0xLQV9CLAkJU0VMX0FER19BXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8xMV84LAlTQ0wyX0EsCQkJU0VMX0kyQzJfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzExXzgsCVNUUF9JVkNYTzI3XzFfQywJU0VMX1NTUDFfMV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMTFfOCwJUklGMF9TWU5DX0IsCQlTRUxfRFJJRjBfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzExXzgsCUZTT19UT0VfQSwJCVNFTF9GU09fMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDEyXzExXzgsCUFESUNIUzEpLAorCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzE1XzEyLAlSWDFfQSwJCQlTRUxfU0NJRjFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzE1XzEyLAlIUlgxX0EsCQkJU0VMX0hTQ0lGMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMTVfMTIsCVRTX1NEQVQwX0MsCQlTRUxfVFNJRjBfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzE1XzEyLAlTVFBfSVNEXzBfQywJCVNFTF9TU1AxXzBfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzE1XzEyLAlSSUYxX0NMS19DLAkJU0VMX0RSSUYxXzIpLAorCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzE5XzE2LAlUWDFfQSwJCQlTRUxfU0NJRjFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzE5XzE2LAlIVFgxX0EsCQkJU0VMX0hTQ0lGMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMTlfMTYsCVRTX1NERU4wX0MsCQlTRUxfVFNJRjBfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzE5XzE2LAlTVFBfSVNFTl8wX0MsCQlTRUxfU1NQMV8wXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8xOV8xNiwJUklGMV9EMF9DLAkJU0VMX0RSSUYxXzIpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDEyXzIzXzIwLAlDVFMxX04pLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8yM18yMCwJSENUUzFfTl9BLAkJU0VMX0hTQ0lGMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMjNfMjAsCU1TSU9GMV9SWERfQiwJCVNFTF9NU0lPRjFfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzIzXzIwLAlUU19TREVOMV9DLAkJU0VMX1RTSUYxXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8yM18yMCwJU1RQX0lTRU5fMV9DLAkJU0VMX1NTUDFfMV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMjNfMjAsCVJJRjFfRDBfQiwJCVNFTF9EUklGMV8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTJfMjNfMjAsCUFESURBVEEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDEyXzI3XzI0LAlSVFMxX05fVEFOUyksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzI3XzI0LAlIUlRTMV9OX0EsCQlTRUxfSFNDSUYxXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8yN18yNCwJTVNJT0YxX1RYRF9CLAkJU0VMX01TSU9GMV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMjdfMjQsCVRTX1NEQVQxX0MsCQlTRUxfVFNJRjFfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzI3XzI0LAlTVFBfSVNEXzFfQywJCVNFTF9TU1AxXzFfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzI3XzI0LAlSSUYxX0QxX0IsCQlTRUxfRFJJRjFfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDEyXzI3XzI0LAlBRElDSFMwKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxMl8zMV8yOCwJU0NLMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzMxXzI4LAlTQ0lGX0NMS19CLAkJU0VMX1NDSUYxXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8zMV8yOCwJTVNJT0YxX1NDS19CLAkJU0VMX01TSU9GMV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMzFfMjgsCVRTX1NDSzFfQywJCVNFTF9UU0lGMV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMzFfMjgsCVNUUF9JU0NMS18xX0MsCQlTRUxfU1NQMV8xXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8zMV8yOCwJUklGMV9DTEtfQiwJCVNFTF9EUklGMV8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTJfMzFfMjgsCUFESUNMSyksCisKKwkvKiBJUFNSMTMgKi8KKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfM18wLAlUWDJfQSwJCQlTRUxfU0NJRjJfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzNfMCwJU0QyX0NEX0IsCQlTRUxfU0RISTJfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzNfMCwJU0NMMV9BLAkJCVNFTF9JMkMxXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18zXzAsCUZNQ0xLX0EsCQlTRUxfRk1fMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzNfMCwJUklGMV9EMV9DLAkJU0VMX0RSSUYxXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18zXzAsCUZTT19DRkVfMF9CLAkJU0VMX0ZTT18xKSwKKworCVBJTk1VWF9JUFNSX01TRUwoSVAxM183XzQsCVJYMl9BLAkJCVNFTF9TQ0lGMl8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfN180LAlTRDJfV1BfQiwJCVNFTF9TREhJMl8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfN180LAlTREExX0EsCQkJU0VMX0kyQzFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzdfNCwJRk1JTl9BLAkJCVNFTF9GTV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfN180LAlSSUYxX1NZTkNfQywJCVNFTF9EUklGMV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfN180LAlGU09fQ0ZFXzFfQiwJCVNFTF9GU09fMSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTNfMTFfOCwJSFNDSzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18xMV84LAlNU0lPRjFfU0NLX0QsCQlTRUxfTVNJT0YxXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18xMV84LAlBVURJT19DTEtCX0EsCQlTRUxfQURHX0JfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzExXzgsCVNTSV9TREFUQTFfQiwJCVNFTF9TU0lfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzExXzgsCVRTX1NDSzBfRCwJCVNFTF9UU0lGMF8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMTFfOCwJU1RQX0lTQ0xLXzBfRCwJCVNFTF9TU1AxXzBfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzExXzgsCVJJRjBfQ0xLX0MsCQlTRUxfRFJJRjBfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzExXzgsCVJYNV9CLAkJCVNFTF9TQ0lGNV8xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxM18xNV8xMiwJSFJYMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzE1XzEyLAlNU0lPRjFfUlhEX0QsCQlTRUxfTVNJT0YxXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18xNV8xMiwJU1NJX1NEQVRBMl9CLAkJU0VMX1NTSV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMTVfMTIsCVRTX1NERU4wX0QsCQlTRUxfVFNJRjBfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzE1XzEyLAlTVFBfSVNFTl8wX0QsCQlTRUxfU1NQMV8wXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18xNV8xMiwJUklGMF9EMF9DLAkJU0VMX0RSSUYwXzIpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDEzXzE5XzE2LAlIVFgwKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMTlfMTYsCU1TSU9GMV9UWERfRCwJCVNFTF9NU0lPRjFfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzE5XzE2LAlTU0lfU0RBVEE5X0IsCQlTRUxfU1NJXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18xOV8xNiwJVFNfU0RBVDBfRCwJCVNFTF9UU0lGMF8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMTlfMTYsCVNUUF9JU0RfMF9ELAkJU0VMX1NTUDFfMF8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMTlfMTYsCVJJRjBfRDFfQywJCVNFTF9EUklGMF8yKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxM18yM18yMCwJSENUUzBfTiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzIzXzIwLAlSWDJfQiwJCQlTRUxfU0NJRjJfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzIzXzIwLAlNU0lPRjFfU1lOQ19ELAkJU0VMX01TSU9GMV8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMjNfMjAsCVNTSV9TQ0s5X0EsCQlTRUxfU1NJXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18yM18yMCwJVFNfU1BTWU5DMF9ELAkJU0VMX1RTSUYwXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18yM18yMCwJU1RQX0lTU1lOQ18wX0QsCQlTRUxfU1NQMV8wXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18yM18yMCwJUklGMF9TWU5DX0MsCQlTRUxfRFJJRjBfMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDEzXzIzXzIwLAlBVURJT19DTEtPVVQxX0EpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDEzXzI3XzI0LAlIUlRTMF9OKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMjdfMjQsCVRYMl9CLAkJCVNFTF9TQ0lGMl8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMjdfMjQsCU1TSU9GMV9TUzFfRCwJCVNFTF9NU0lPRjFfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzI3XzI0LAlTU0lfV1M5X0EsCQlTRUxfU1NJXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18yN18yNCwJU1RQX0lWQ1hPMjdfMF9ELAlTRUxfU1NQMV8wXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18yN18yNCwJQlBGQ0xLX0EsCQlTRUxfRk1fMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDEzXzI3XzI0LAlBVURJT19DTEtPVVQyX0EpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDEzXzMxXzI4LAlNU0lPRjBfU1lOQyksCisJUElOTVVYX0lQU1JfR1BTUihJUDEzXzMxXzI4LAlBVURJT19DTEtPVVRfQSksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzMxXzI4LAlUWDVfQiwJCQlTRUxfU0NJRjVfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzMxXzI4LAlCUEZDTEtfRCwJCVNFTF9GTV8zKSwKKworCS8qIElQU1IxNCAqLworCVBJTk1VWF9JUFNSX0dQU1IoSVAxNF8zXzAsCU1TSU9GMF9TUzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF8zXzAsCVJYNV9BLAkJCVNFTF9TQ0lGNV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTRfM18wLAlORldQX05fQSwJCVNFTF9OREZfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE0XzNfMCwJQVVESU9fQ0xLQV9DLAkJU0VMX0FER19BXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF8zXzAsCVNTSV9TQ0syX0EsCQlTRUxfU1NJXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF8zXzAsCVNUUF9JVkNYTzI3XzBfQywJU0VMX1NTUDFfMF8yKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTRfM18wLAlBVURJT19DTEtPVVQzX0EpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF8zXzAsCVRDTEsxX0IsCQlTRUxfVElNRVJfVE1VXzEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDE0XzdfNCwJTVNJT0YwX1NTMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDE0XzdfNCwJVFg1X0EsCQkJU0VMX1NDSUY1XzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF83XzQsCU1TSU9GMV9TUzJfRCwJCVNFTF9NU0lPRjFfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDE0XzdfNCwJQVVESU9fQ0xLQ19BLAkJU0VMX0FER19DXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF83XzQsCVNTSV9XUzJfQSwJCVNFTF9TU0lfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE0XzdfNCwJU1RQX09QV01fMF9ELAkJU0VMX1NTUDFfMF8zKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTRfN180LAlBVURJT19DTEtPVVRfRCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE0XzdfNCwJU1BFRURJTl9CLAkJU0VMX1NQRUVEX1BVTFNFXzEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDE0XzExXzgsCU1MQl9DTEspLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF8xMV84LAlNU0lPRjFfU0NLX0YsCQlTRUxfTVNJT0YxXzUpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF8xMV84LAlTQ0wxX0IsCQkJU0VMX0kyQzFfMSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTRfMTVfMTIsCU1MQl9TSUcpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF8xNV8xMiwJUlgxX0IsCQkJU0VMX1NDSUYxXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF8xNV8xMiwJTVNJT0YxX1NZTkNfRiwJCVNFTF9NU0lPRjFfNSksCisJUElOTVVYX0lQU1JfTVNFTChJUDE0XzE1XzEyLAlTREExX0IsCQkJU0VMX0kyQzFfMSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTRfMTlfMTYsCU1MQl9EQVQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF8xOV8xNiwJVFgxX0IsCQkJU0VMX1NDSUYxXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF8xOV8xNiwJTVNJT0YxX1JYRF9GLAkJU0VMX01TSU9GMV81KSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxNF8yM18yMCwJU1NJX1NDSzAxMjkpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF8yM18yMCwJTVNJT0YxX1RYRF9GLAkJU0VMX01TSU9GMV81KSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxNF8yN18yNCwJU1NJX1dTMDEyOSksCisJUElOTVVYX0lQU1JfTVNFTChJUDE0XzI3XzI0LAlNU0lPRjFfU1MxX0YsCQlTRUxfTVNJT0YxXzUpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDE0XzMxXzI4LAlTU0lfU0RBVEEwKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTRfMzFfMjgsCU1TSU9GMV9TUzJfRiwJCVNFTF9NU0lPRjFfNSksCisKKwkvKiBJUFNSMTUgKi8KKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfM18wLAlTU0lfU0RBVEExX0EsCQlTRUxfU1NJXzApLAorCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzdfNCwJU1NJX1NEQVRBMl9BLAkJU0VMX1NTSV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfN180LAlTU0lfU0NLMV9CLAkJU0VMX1NTSV8xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxNV8xMV84LAlTU0lfU0NLMzQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8xMV84LAlNU0lPRjFfU1MxX0EsCQlTRUxfTVNJT0YxXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8xMV84LAlTVFBfT1BXTV8wX0EsCQlTRUxfU1NQMV8wXzApLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDE1XzE1XzEyLAlTU0lfV1MzNCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzE1XzEyLAlIQ1RTMl9OX0EsCQlTRUxfSFNDSUYyXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8xNV8xMiwJTVNJT0YxX1NTMl9BLAkJU0VMX01TSU9GMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfMTVfMTIsCVNUUF9JVkNYTzI3XzBfQSwJU0VMX1NTUDFfMF8wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxNV8xOV8xNiwJU1NJX1NEQVRBMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzE5XzE2LAlIUlRTMl9OX0EsCQlTRUxfSFNDSUYyXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8xOV8xNiwJTVNJT0YxX1RYRF9BLAkJU0VMX01TSU9GMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfMTlfMTYsCVRTX1NDSzBfQSwJCVNFTF9UU0lGMF8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfMTlfMTYsCVNUUF9JU0NMS18wX0EsCQlTRUxfU1NQMV8wXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8xOV8xNiwJUklGMF9EMV9BLAkJU0VMX0RSSUYwXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8xOV8xNiwJUklGMl9EMF9BLAkJU0VMX0RSSUYyXzApLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDE1XzIzXzIwLAlTU0lfU0NLNCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzIzXzIwLAlIUlgyX0EsCQkJU0VMX0hTQ0lGMl8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfMjNfMjAsCU1TSU9GMV9TQ0tfQSwJCVNFTF9NU0lPRjFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzIzXzIwLAlUU19TREFUMF9BLAkJU0VMX1RTSUYwXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8yM18yMCwJU1RQX0lTRF8wX0EsCQlTRUxfU1NQMV8wXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8yM18yMCwJUklGMF9DTEtfQSwJCVNFTF9EUklGMF8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfMjNfMjAsCVJJRjJfQ0xLX0EsCQlTRUxfRFJJRjJfMCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTVfMjdfMjQsCVNTSV9XUzQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8yN18yNCwJSFRYMl9BLAkJCVNFTF9IU0NJRjJfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzI3XzI0LAlNU0lPRjFfU1lOQ19BLAkJU0VMX01TSU9GMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfMjdfMjQsCVRTX1NERU4wX0EsCQlTRUxfVFNJRjBfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzI3XzI0LAlTVFBfSVNFTl8wX0EsCQlTRUxfU1NQMV8wXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8yN18yNCwJUklGMF9TWU5DX0EsCQlTRUxfRFJJRjBfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzI3XzI0LAlSSUYyX1NZTkNfQSwJCVNFTF9EUklGMl8wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxNV8zMV8yOCwJU1NJX1NEQVRBNCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzMxXzI4LAlIU0NLMl9BLAkJU0VMX0hTQ0lGMl8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfMzFfMjgsCU1TSU9GMV9SWERfQSwJCVNFTF9NU0lPRjFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzMxXzI4LAlUU19TUFNZTkMwX0EsCQlTRUxfVFNJRjBfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzMxXzI4LAlTVFBfSVNTWU5DXzBfQSwJCVNFTF9TU1AxXzBfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzMxXzI4LAlSSUYwX0QwX0EsCQlTRUxfRFJJRjBfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzMxXzI4LAlSSUYyX0QxX0EsCQlTRUxfRFJJRjJfMCksCisKKwkvKiBJUFNSMTYgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQMTZfM18wLAlTU0lfU0NLNiksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzNfMCwJU0lNMF9SU1RfRCwJCVNFTF9TSU1DQVJEXzMpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDE2XzdfNCwJU1NJX1dTNiksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzdfNCwJU0lNMF9EX0QsCQlTRUxfU0lNQ0FSRF8zKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxNl8xMV84LAlTU0lfU0RBVEE2KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMTFfOCwJU0lNMF9DTEtfRCwJCVNFTF9TSU1DQVJEXzMpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDE2XzE1XzEyLAlTU0lfU0NLNzgpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8xNV8xMiwJSFJYMl9CLAkJCVNFTF9IU0NJRjJfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzE1XzEyLAlNU0lPRjFfU0NLX0MsCQlTRUxfTVNJT0YxXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8xNV8xMiwJVFNfU0NLMV9BLAkJU0VMX1RTSUYxXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8xNV8xMiwJU1RQX0lTQ0xLXzFfQSwJCVNFTF9TU1AxXzFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzE1XzEyLAlSSUYxX0NMS19BLAkJU0VMX0RSSUYxXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8xNV8xMiwJUklGM19DTEtfQSwJCVNFTF9EUklGM18wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxNl8xOV8xNiwJU1NJX1dTNzgpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8xOV8xNiwJSFRYMl9CLAkJCVNFTF9IU0NJRjJfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzE5XzE2LAlNU0lPRjFfU1lOQ19DLAkJU0VMX01TSU9GMV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMTlfMTYsCVRTX1NEQVQxX0EsCQlTRUxfVFNJRjFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzE5XzE2LAlTVFBfSVNEXzFfQSwJCVNFTF9TU1AxXzFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzE5XzE2LAlSSUYxX1NZTkNfQSwJCVNFTF9EUklGMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMTlfMTYsCVJJRjNfU1lOQ19BLAkJU0VMX0RSSUYzXzApLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDE2XzIzXzIwLAlTU0lfU0RBVEE3KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMjNfMjAsCUhDVFMyX05fQiwJCVNFTF9IU0NJRjJfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzIzXzIwLAlNU0lPRjFfUlhEX0MsCQlTRUxfTVNJT0YxXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8yM18yMCwJVFNfU0RFTjFfQSwJCVNFTF9UU0lGMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMjNfMjAsCVNUUF9JU0VOXzFfQSwJCVNFTF9TU1AxXzFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzIzXzIwLAlSSUYxX0QwX0EsCQlTRUxfRFJJRjFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzIzXzIwLAlSSUYzX0QwX0EsCQlTRUxfRFJJRjNfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzIzXzIwLAlUQ0xLMl9BLAkJU0VMX1RJTUVSX1RNVV8wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxNl8yN18yNCwJU1NJX1NEQVRBOCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzI3XzI0LAlIUlRTMl9OX0IsCQlTRUxfSFNDSUYyXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8yN18yNCwJTVNJT0YxX1RYRF9DLAkJU0VMX01TSU9GMV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMjdfMjQsCVRTX1NQU1lOQzFfQSwJCVNFTF9UU0lGMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMjdfMjQsCVNUUF9JU1NZTkNfMV9BLAkJU0VMX1NTUDFfMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMjdfMjQsCVJJRjFfRDFfQSwJCVNFTF9EUklGMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMjdfMjQsCVJJRjNfRDFfQSwJCVNFTF9EUklGM18wKSwKKworCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8zMV8yOCwJU1NJX1NEQVRBOV9BLAkJU0VMX1NTSV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMzFfMjgsCUhTQ0syX0IsCQlTRUxfSFNDSUYyXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8zMV8yOCwJTVNJT0YxX1NTMV9DLAkJU0VMX01TSU9GMV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMzFfMjgsCUhTQ0sxX0EsCQlTRUxfSFNDSUYxXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8zMV8yOCwJU1NJX1dTMV9CLAkJU0VMX1NTSV8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTZfMzFfMjgsCVNDSzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8zMV8yOCwJU1RQX0lWQ1hPMjdfMV9BLAlTRUxfU1NQMV8xXzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxNl8zMV8yOCwJU0NLNV9BKSwKKworCS8qIElQU1IxNyAqLworCVBJTk1VWF9JUFNSX01TRUwoSVAxN18zXzAsCUFVRElPX0NMS0FfQSwJCVNFTF9BREdfQV8wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTdfM18wLAlDQzVfT1NDT1VUKSwKKworCVBJTk1VWF9JUFNSX01TRUwoSVAxN183XzQsCUFVRElPX0NMS0JfQiwJCVNFTF9BREdfQl8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfN180LAlTQ0lGX0NMS19BLAkJU0VMX1NDSUYxXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN183XzQsCVNUUF9JVkNYTzI3XzFfRCwJU0VMX1NTUDFfMV8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfN180LAlSRU1PQ09OX0EsCQlTRUxfUkVNT0NPTl8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfN180LAlUQ0xLMV9BLAkJU0VMX1RJTUVSX1RNVV8wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxN18xMV84LAlVU0IwX1BXRU4pLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18xMV84LAlTSU0wX1JTVF9DLAkJU0VMX1NJTUNBUkRfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzExXzgsCVRTX1NDSzFfRCwJCVNFTF9UU0lGMV8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMTFfOCwJU1RQX0lTQ0xLXzFfRCwJCVNFTF9TU1AxXzFfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzExXzgsCUJQRkNMS19CLAkJU0VMX0ZNXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18xMV84LAlSSUYzX0NMS19CLAkJU0VMX0RSSUYzXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18xMV84LAlIU0NLMl9DLAkJU0VMX0hTQ0lGMl8yKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxN18xNV8xMiwJVVNCMF9PVkMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18xNV8xMiwJU0lNMF9EX0MsCQlTRUxfU0lNQ0FSRF8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMTVfMTIsCVRTX1NEQVQxX0QsCQlTRUxfVFNJRjFfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzE1XzEyLAlTVFBfSVNEXzFfRCwJCVNFTF9TU1AxXzFfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzE1XzEyLAlSSUYzX1NZTkNfQiwJCVNFTF9EUklGM18xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMTVfMTIsCUhSWDJfQywJCQlTRUxfSFNDSUYyXzIpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDE3XzE5XzE2LAlVU0IxX1BXRU4pLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18xOV8xNiwJU0lNMF9DTEtfQywJCVNFTF9TSU1DQVJEXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18xOV8xNiwJU1NJX1NDSzFfQSwJCVNFTF9TU0lfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzE5XzE2LAlUU19TQ0swX0UsCQlTRUxfVFNJRjBfNCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzE5XzE2LAlTVFBfSVNDTEtfMF9FLAkJU0VMX1NTUDFfMF80KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMTlfMTYsCUZNQ0xLX0IsCQlTRUxfRk1fMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzE5XzE2LAlSSUYyX0NMS19CLAkJU0VMX0RSSUYyXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18xOV8xNiwJU1BFRURJTl9BLAkJU0VMX1NQRUVEX1BVTFNFXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18xOV8xNiwJSFRYMl9DLAkJCVNFTF9IU0NJRjJfMiksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTdfMjNfMjAsCVVTQjFfT1ZDKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMjNfMjAsCU1TSU9GMV9TUzJfQywJCVNFTF9NU0lPRjFfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzIzXzIwLAlTU0lfV1MxX0EsCQlTRUxfU1NJXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18yM18yMCwJVFNfU0RBVDBfRSwJCVNFTF9UU0lGMF80KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMjNfMjAsCVNUUF9JU0RfMF9FLAkJU0VMX1NTUDFfMF80KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMjNfMjAsCUZNSU5fQiwJCQlTRUxfRk1fMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzIzXzIwLAlSSUYyX1NZTkNfQiwJCVNFTF9EUklGMl8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMjNfMjAsCVJFTU9DT05fQiwJCVNFTF9SRU1PQ09OXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18yM18yMCwJSENUUzJfTl9DLAkJU0VMX0hTQ0lGMl8yKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxN18yN18yNCwJVVNCMzBfUFdFTiksCisJUElOTVVYX0lQU1JfR1BTUihJUDE3XzI3XzI0LAlBVURJT19DTEtPVVRfQiksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzI3XzI0LAlTU0lfU0NLMl9CLAkJU0VMX1NTSV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMjdfMjQsCVRTX1NERU4xX0QsCQlTRUxfVFNJRjFfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzI3XzI0LAlTVFBfSVNFTl8xX0QsCQlTRUxfU1NQMV8xXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18yN18yNCwJU1RQX09QV01fMF9FLAkJU0VMX1NTUDFfMF80KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMjdfMjQsCVJJRjNfRDBfQiwJCVNFTF9EUklGM18xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMjdfMjQsCVRDTEsyX0IsCQlTRUxfVElNRVJfVE1VXzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxN18yN18yNCwJVFBVMFRPMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzI3XzI0LAlCUEZDTEtfQywJCVNFTF9GTV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMjdfMjQsCUhSVFMyX05fQywJCVNFTF9IU0NJRjJfMiksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTdfMzFfMjgsCVVTQjMwX09WQyksCisJUElOTVVYX0lQU1JfR1BTUihJUDE3XzMxXzI4LAlBVURJT19DTEtPVVQxX0IpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18zMV8yOCwJU1NJX1dTMl9CLAkJU0VMX1NTSV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMzFfMjgsCVRTX1NQU1lOQzFfRCwJCVNFTF9UU0lGMV8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMzFfMjgsCVNUUF9JU1NZTkNfMV9ELAkJU0VMX1NTUDFfMV8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMzFfMjgsCVNUUF9JVkNYTzI3XzBfRSwJU0VMX1NTUDFfMF80KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMzFfMjgsCVJJRjNfRDFfQiwJCVNFTF9EUklGM18xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMzFfMjgsCUZTT19UT0VfQiwJCVNFTF9GU09fMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDE3XzMxXzI4LAlUUFUwVE8xKSwKKworCS8qIElQU1IxOCAqLworCVBJTk1VWF9JUFNSX0dQU1IoSVAxOF8zXzAsCUdQNl8zMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDE4XzNfMCwJQVVESU9fQ0xLT1VUMl9CKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMThfM18wLAlTU0lfU0NLOV9CLAkJU0VMX1NTSV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMThfM18wLAlUU19TREVOMF9FLAkJU0VMX1RTSUYwXzQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxOF8zXzAsCVNUUF9JU0VOXzBfRSwJCVNFTF9TU1AxXzBfNCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE4XzNfMCwJUklGMl9EMF9CLAkJU0VMX0RSSUYyXzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxOF8zXzAsCVRQVTBUTzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxOF8zXzAsCUZTT19DRkVfMF9BLAkJU0VMX0ZTT18wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMThfM18wLAlGTUNMS19DLAkJU0VMX0ZNXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxOF8zXzAsCUZNQ0xLX0QsCQlTRUxfRk1fMyksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMThfN180LAlHUDZfMzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxOF83XzQsCUFVRElPX0NMS09VVDNfQiksCisJUElOTVVYX0lQU1JfTVNFTChJUDE4XzdfNCwJU1NJX1dTOV9CLAkJU0VMX1NTSV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMThfN180LAlUU19TUFNZTkMwX0UsCQlTRUxfVFNJRjBfNCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE4XzdfNCwJU1RQX0lTU1lOQ18wX0UsCQlTRUxfU1NQMV8wXzQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxOF83XzQsCVJJRjJfRDFfQiwJCVNFTF9EUklGMl8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMThfN180LAlUUFUwVE8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMThfN180LAlGU09fQ0ZFXzFfQSwJCVNFTF9GU09fMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE4XzdfNCwJRk1JTl9DLAkJCVNFTF9GTV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMThfN180LAlGTUlOX0QsCQkJU0VMX0ZNXzMpLAorCisJLyogSTJDICovCisJUElOTVVYX0lQU1JfTk9HUCgwLAkJSTJDX1NFTF8wXzEpLAorCVBJTk1VWF9JUFNSX05PR1AoMCwJCUkyQ19TRUxfM18xKSwKKwlQSU5NVVhfSVBTUl9OT0dQKDAsCQlJMkNfU0VMXzVfMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX3BmY19waW4gcGlubXV4X3BpbnNbXSA9IHsKKwlQSU5NVVhfR1BJT19HUF9BTEwoKSwKK307CisKKy8qIC0gU0NJRjAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYwX2RhdGFfcGluc1tdID0geworCS8qIFJYLCBUWCAqLworCVJDQVJfR1BfUElOKDUsIDEpLCBSQ0FSX0dQX1BJTig1LCAyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYwX2RhdGFfbXV4W10gPSB7CisJUlgwX01BUkssIFRYMF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjBfY2xrX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTig1LCAwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYwX2Nsa19tdXhbXSA9IHsKKwlTQ0swX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMF9jdHJsX3BpbnNbXSA9IHsKKwkvKiBSVFMsIENUUyAqLworCVJDQVJfR1BfUElOKDUsIDQpLCBSQ0FSX0dQX1BJTig1LCAzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYwX2N0cmxfbXV4W10gPSB7CisJUlRTMF9OX1RBTlNfTUFSSywgQ1RTMF9OX01BUkssCit9OworLyogLSBTQ0lGMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjFfZGF0YV9hX3BpbnNbXSA9IHsKKwkvKiBSWCwgVFggKi8KKwlSQ0FSX0dQX1BJTig1LCA1KSwgUkNBUl9HUF9QSU4oNSwgNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMV9kYXRhX2FfbXV4W10gPSB7CisJUlgxX0FfTUFSSywgVFgxX0FfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYxX2Nsa19waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oNiwgMjEpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjFfY2xrX211eFtdID0geworCVNDSzFfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYxX2N0cmxfcGluc1tdID0geworCS8qIFJUUywgQ1RTICovCisJUkNBUl9HUF9QSU4oNSwgOCksIFJDQVJfR1BfUElOKDUsIDcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjFfY3RybF9tdXhbXSA9IHsKKwlSVFMxX05fVEFOU19NQVJLLCBDVFMxX05fTUFSSywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjFfZGF0YV9iX3BpbnNbXSA9IHsKKwkvKiBSWCwgVFggKi8KKwlSQ0FSX0dQX1BJTig1LCAyNCksIFJDQVJfR1BfUElOKDUsIDI1KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYxX2RhdGFfYl9tdXhbXSA9IHsKKwlSWDFfQl9NQVJLLCBUWDFfQl9NQVJLLAorfTsKKy8qIC0gU0NJRjIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYyX2RhdGFfYV9waW5zW10gPSB7CisJLyogUlgsIFRYICovCisJUkNBUl9HUF9QSU4oNSwgMTEpLCBSQ0FSX0dQX1BJTig1LCAxMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMl9kYXRhX2FfbXV4W10gPSB7CisJUlgyX0FfTUFSSywgVFgyX0FfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYyX2Nsa19waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oNSwgOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMl9jbGtfbXV4W10gPSB7CisJU0NLMl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjJfZGF0YV9iX3BpbnNbXSA9IHsKKwkvKiBSWCwgVFggKi8KKwlSQ0FSX0dQX1BJTig1LCAxNSksIFJDQVJfR1BfUElOKDUsIDE2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYyX2RhdGFfYl9tdXhbXSA9IHsKKwlSWDJfQl9NQVJLLCBUWDJfQl9NQVJLLAorfTsKKy8qIC0gU0NJRjMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYzX2RhdGFfYV9waW5zW10gPSB7CisJLyogUlgsIFRYICovCisJUkNBUl9HUF9QSU4oMSwgMjMpLCBSQ0FSX0dQX1BJTigxLCAyNCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmM19kYXRhX2FfbXV4W10gPSB7CisJUlgzX0FfTUFSSywgVFgzX0FfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYzX2Nsa19waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oMSwgMjIpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjNfY2xrX211eFtdID0geworCVNDSzNfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYzX2N0cmxfcGluc1tdID0geworCS8qIFJUUywgQ1RTICovCisJUkNBUl9HUF9QSU4oMSwgMjYpLCBSQ0FSX0dQX1BJTigxLCAyNSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmM19jdHJsX211eFtdID0geworCVJUUzNfTl9UQU5TX01BUkssIENUUzNfTl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjNfZGF0YV9iX3BpbnNbXSA9IHsKKwkvKiBSWCwgVFggKi8KKwlSQ0FSX0dQX1BJTigxLCA4KSwgUkNBUl9HUF9QSU4oMSwgMTEpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjNfZGF0YV9iX211eFtdID0geworCVJYM19CX01BUkssIFRYM19CX01BUkssCit9OworLyogLSBTQ0lGNCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjRfZGF0YV9hX3BpbnNbXSA9IHsKKwkvKiBSWCwgVFggKi8KKwlSQ0FSX0dQX1BJTigyLCAxMSksIFJDQVJfR1BfUElOKDIsIDEyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY0X2RhdGFfYV9tdXhbXSA9IHsKKwlSWDRfQV9NQVJLLCBUWDRfQV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjRfY2xrX2FfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDIsIDEwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY0X2Nsa19hX211eFtdID0geworCVNDSzRfQV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjRfY3RybF9hX3BpbnNbXSA9IHsKKwkvKiBSVFMsIENUUyAqLworCVJDQVJfR1BfUElOKDIsIDE0KSwgUkNBUl9HUF9QSU4oMiwgMTMpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjRfY3RybF9hX211eFtdID0geworCVJUUzRfTl9UQU5TX0FfTUFSSywgQ1RTNF9OX0FfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY0X2RhdGFfYl9waW5zW10gPSB7CisJLyogUlgsIFRYICovCisJUkNBUl9HUF9QSU4oMSwgNiksIFJDQVJfR1BfUElOKDEsIDcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjRfZGF0YV9iX211eFtdID0geworCVJYNF9CX01BUkssIFRYNF9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmNF9jbGtfYl9waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oMSwgNSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmNF9jbGtfYl9tdXhbXSA9IHsKKwlTQ0s0X0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY0X2N0cmxfYl9waW5zW10gPSB7CisJLyogUlRTLCBDVFMgKi8KKwlSQ0FSX0dQX1BJTigxLCAxMCksIFJDQVJfR1BfUElOKDEsIDkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjRfY3RybF9iX211eFtdID0geworCVJUUzRfTl9UQU5TX0JfTUFSSywgQ1RTNF9OX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY0X2RhdGFfY19waW5zW10gPSB7CisJLyogUlgsIFRYICovCisJUkNBUl9HUF9QSU4oMCwgMTIpLCBSQ0FSX0dQX1BJTigwLCAxMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmNF9kYXRhX2NfbXV4W10gPSB7CisJUlg0X0NfTUFSSywgVFg0X0NfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY0X2Nsa19jX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTigwLCA4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY0X2Nsa19jX211eFtdID0geworCVNDSzRfQ19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjRfY3RybF9jX3BpbnNbXSA9IHsKKwkvKiBSVFMsIENUUyAqLworCVJDQVJfR1BfUElOKDAsIDExKSwgUkNBUl9HUF9QSU4oMCwgMTApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjRfY3RybF9jX211eFtdID0geworCVJUUzRfTl9UQU5TX0NfTUFSSywgQ1RTNF9OX0NfTUFSSywKK307CisvKiAtIFNDSUY1IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmNV9kYXRhX2FfcGluc1tdID0geworCS8qIFJYLCBUWCAqLworCVJDQVJfR1BfUElOKDUsIDE5KSwgUkNBUl9HUF9QSU4oNSwgMjEpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjVfZGF0YV9hX211eFtdID0geworCVJYNV9BX01BUkssIFRYNV9BX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmNV9jbGtfYV9waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oNiwgMjEpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjVfY2xrX2FfbXV4W10gPSB7CisJU0NLNV9BX01BUkssCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY1X2RhdGFfYl9waW5zW10gPSB7CisJLyogUlgsIFRYICovCisJUkNBUl9HUF9QSU4oNSwgMTIpLCBSQ0FSX0dQX1BJTig1LCAxOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmNV9kYXRhX2JfbXV4W10gPSB7CisJUlg1X0JfTUFSSywgVFg1X0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY1X2Nsa19iX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTig1LCAwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY1X2Nsa19iX211eFtdID0geworCVNDSzVfQl9NQVJLLAorfTsKKworLyogLSBTQ0lGIENsb2NrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZl9jbGtfYV9waW5zW10gPSB7CisJLyogU0NJRl9DTEsgKi8KKwlSQ0FSX0dQX1BJTig2LCAyMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmX2Nsa19hX211eFtdID0geworCVNDSUZfQ0xLX0FfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWZfY2xrX2JfcGluc1tdID0geworCS8qIFNDSUZfQ0xLICovCisJUkNBUl9HUF9QSU4oNSwgOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmX2Nsa19iX211eFtdID0geworCVNDSUZfQ0xLX0JfTUFSSywKK307CisKKy8qIC0gU0RISTAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkwX2RhdGExX3BpbnNbXSA9IHsKKwkvKiBEMCAqLworCVJDQVJfR1BfUElOKDMsIDIpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTBfZGF0YTFfbXV4W10gPSB7CisJU0QwX0RBVDBfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkwX2RhdGE0X3BpbnNbXSA9IHsKKwkvKiBEWzA6M10gKi8KKwlSQ0FSX0dQX1BJTigzLCAyKSwgUkNBUl9HUF9QSU4oMywgMyksCisJUkNBUl9HUF9QSU4oMywgNCksIFJDQVJfR1BfUElOKDMsIDUpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTBfZGF0YTRfbXV4W10gPSB7CisJU0QwX0RBVDBfTUFSSywgU0QwX0RBVDFfTUFSSywKKwlTRDBfREFUMl9NQVJLLCBTRDBfREFUM19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTBfY3RybF9waW5zW10gPSB7CisJLyogQ0xLLCBDTUQgKi8KKwlSQ0FSX0dQX1BJTigzLCAwKSwgUkNBUl9HUF9QSU4oMywgMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMF9jdHJsX211eFtdID0geworCVNEMF9DTEtfTUFSSywgU0QwX0NNRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTBfY2RfcGluc1tdID0geworCS8qIENEICovCisJUkNBUl9HUF9QSU4oMywgMTIpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTBfY2RfbXV4W10gPSB7CisJU0QwX0NEX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMF93cF9waW5zW10gPSB7CisJLyogV1AgKi8KKwlSQ0FSX0dQX1BJTigzLCAxMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMF93cF9tdXhbXSA9IHsKKwlTRDBfV1BfTUFSSywKK307CisvKiAtIFNESEkxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMV9kYXRhMV9waW5zW10gPSB7CisJLyogRDAgKi8KKwlSQ0FSX0dQX1BJTigzLCA4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkxX2RhdGExX211eFtdID0geworCVNEMV9EQVQwX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMV9kYXRhNF9waW5zW10gPSB7CisJLyogRFswOjNdICovCisJUkNBUl9HUF9QSU4oMywgOCksICBSQ0FSX0dQX1BJTigzLCA5KSwKKwlSQ0FSX0dQX1BJTigzLCAxMCksIFJDQVJfR1BfUElOKDMsIDExKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkxX2RhdGE0X211eFtdID0geworCVNEMV9EQVQwX01BUkssIFNEMV9EQVQxX01BUkssCisJU0QxX0RBVDJfTUFSSywgU0QxX0RBVDNfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkxX2N0cmxfcGluc1tdID0geworCS8qIENMSywgQ01EICovCisJUkNBUl9HUF9QSU4oMywgNiksIFJDQVJfR1BfUElOKDMsIDcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTFfY3RybF9tdXhbXSA9IHsKKwlTRDFfQ0xLX01BUkssIFNEMV9DTURfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkxX2NkX3BpbnNbXSA9IHsKKwkvKiBDRCAqLworCVJDQVJfR1BfUElOKDMsIDE0KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkxX2NkX211eFtdID0geworCVNEMV9DRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTFfd3BfcGluc1tdID0geworCS8qIFdQICovCisJUkNBUl9HUF9QSU4oMywgMTUpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTFfd3BfbXV4W10gPSB7CisJU0QxX1dQX01BUkssCit9OworLyogLSBTREhJMiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTJfZGF0YTFfcGluc1tdID0geworCS8qIEQwICovCisJUkNBUl9HUF9QSU4oNCwgMiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMl9kYXRhMV9tdXhbXSA9IHsKKwlTRDJfREFUMF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTJfZGF0YTRfcGluc1tdID0geworCS8qIERbMDozXSAqLworCVJDQVJfR1BfUElOKDQsIDIpLCBSQ0FSX0dQX1BJTig0LCAzKSwKKwlSQ0FSX0dQX1BJTig0LCA0KSwgUkNBUl9HUF9QSU4oNCwgNSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMl9kYXRhNF9tdXhbXSA9IHsKKwlTRDJfREFUMF9NQVJLLCBTRDJfREFUMV9NQVJLLAorCVNEMl9EQVQyX01BUkssIFNEMl9EQVQzX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMl9kYXRhOF9waW5zW10gPSB7CisJLyogRFswOjddICovCisJUkNBUl9HUF9QSU4oNCwgMiksICBSQ0FSX0dQX1BJTig0LCAzKSwKKwlSQ0FSX0dQX1BJTig0LCA0KSwgIFJDQVJfR1BfUElOKDQsIDUpLAorCVJDQVJfR1BfUElOKDMsIDgpLCAgUkNBUl9HUF9QSU4oMywgOSksCisJUkNBUl9HUF9QSU4oMywgMTApLCBSQ0FSX0dQX1BJTigzLCAxMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMl9kYXRhOF9tdXhbXSA9IHsKKwlTRDJfREFUMF9NQVJLLCBTRDJfREFUMV9NQVJLLAorCVNEMl9EQVQyX01BUkssIFNEMl9EQVQzX01BUkssCisJU0QyX0RBVDRfTUFSSywgU0QyX0RBVDVfTUFSSywKKwlTRDJfREFUNl9NQVJLLCBTRDJfREFUN19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTJfY3RybF9waW5zW10gPSB7CisJLyogQ0xLLCBDTUQgKi8KKwlSQ0FSX0dQX1BJTig0LCAwKSwgUkNBUl9HUF9QSU4oNCwgMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMl9jdHJsX211eFtdID0geworCVNEMl9DTEtfTUFSSywgU0QyX0NNRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTJfY2RfYV9waW5zW10gPSB7CisJLyogQ0QgKi8KKwlSQ0FSX0dQX1BJTig0LCAxMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMl9jZF9hX211eFtdID0geworCVNEMl9DRF9BX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMl9jZF9iX3BpbnNbXSA9IHsKKwkvKiBDRCAqLworCVJDQVJfR1BfUElOKDUsIDEwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkyX2NkX2JfbXV4W10gPSB7CisJU0QyX0NEX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkyX3dwX2FfcGluc1tdID0geworCS8qIFdQICovCisJUkNBUl9HUF9QSU4oNCwgMTQpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTJfd3BfYV9tdXhbXSA9IHsKKwlTRDJfV1BfQV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTJfd3BfYl9waW5zW10gPSB7CisJLyogV1AgKi8KKwlSQ0FSX0dQX1BJTig1LCAxMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMl93cF9iX211eFtdID0geworCVNEMl9XUF9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMl9kc19waW5zW10gPSB7CisJLyogRFMgKi8KKwlSQ0FSX0dQX1BJTig0LCA2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkyX2RzX211eFtdID0geworCVNEMl9EU19NQVJLLAorfTsKKy8qIC0gU0RISTMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkzX2RhdGExX3BpbnNbXSA9IHsKKwkvKiBEMCAqLworCVJDQVJfR1BfUElOKDQsIDkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTNfZGF0YTFfbXV4W10gPSB7CisJU0QzX0RBVDBfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkzX2RhdGE0X3BpbnNbXSA9IHsKKwkvKiBEWzA6M10gKi8KKwlSQ0FSX0dQX1BJTig0LCA5KSwgIFJDQVJfR1BfUElOKDQsIDEwKSwKKwlSQ0FSX0dQX1BJTig0LCAxMSksIFJDQVJfR1BfUElOKDQsIDEyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkzX2RhdGE0X211eFtdID0geworCVNEM19EQVQwX01BUkssIFNEM19EQVQxX01BUkssCisJU0QzX0RBVDJfTUFSSywgU0QzX0RBVDNfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkzX2RhdGE4X3BpbnNbXSA9IHsKKwkvKiBEWzA6N10gKi8KKwlSQ0FSX0dQX1BJTig0LCA5KSwgIFJDQVJfR1BfUElOKDQsIDEwKSwKKwlSQ0FSX0dQX1BJTig0LCAxMSksIFJDQVJfR1BfUElOKDQsIDEyKSwKKwlSQ0FSX0dQX1BJTig0LCAxMyksIFJDQVJfR1BfUElOKDQsIDE0KSwKKwlSQ0FSX0dQX1BJTig0LCAxNSksIFJDQVJfR1BfUElOKDQsIDE2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkzX2RhdGE4X211eFtdID0geworCVNEM19EQVQwX01BUkssIFNEM19EQVQxX01BUkssCisJU0QzX0RBVDJfTUFSSywgU0QzX0RBVDNfTUFSSywKKwlTRDNfREFUNF9NQVJLLCBTRDNfREFUNV9NQVJLLAorCVNEM19EQVQ2X01BUkssIFNEM19EQVQ3X01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpM19jdHJsX3BpbnNbXSA9IHsKKwkvKiBDTEssIENNRCAqLworCVJDQVJfR1BfUElOKDQsIDcpLCBSQ0FSX0dQX1BJTig0LCA4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkzX2N0cmxfbXV4W10gPSB7CisJU0QzX0NMS19NQVJLLCBTRDNfQ01EX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpM19jZF9waW5zW10gPSB7CisJLyogQ0QgKi8KKwlSQ0FSX0dQX1BJTig0LCAxNSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpM19jZF9tdXhbXSA9IHsKKwlTRDNfQ0RfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkzX3dwX3BpbnNbXSA9IHsKKwkvKiBXUCAqLworCVJDQVJfR1BfUElOKDQsIDE2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkzX3dwX211eFtdID0geworCVNEM19XUF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTNfZHNfcGluc1tdID0geworCS8qIERTICovCisJUkNBUl9HUF9QSU4oNCwgMTcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTNfZHNfbXV4W10gPSB7CisJU0QzX0RTX01BUkssCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX3BmY19waW5fZ3JvdXAgcGlubXV4X2dyb3Vwc1tdID0geworCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjBfZGF0YSksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmMF9jbGspLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjBfY3RybCksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmMV9kYXRhX2EpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjFfY2xrKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWYxX2N0cmwpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjFfZGF0YV9iKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWYyX2RhdGFfYSksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmMl9jbGspLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjJfZGF0YV9iKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWYzX2RhdGFfYSksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmM19jbGspLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjNfY3RybCksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmM19kYXRhX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjRfZGF0YV9hKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWY0X2Nsa19hKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWY0X2N0cmxfYSksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmNF9kYXRhX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjRfY2xrX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjRfY3RybF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWY0X2RhdGFfYyksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmNF9jbGtfYyksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmNF9jdHJsX2MpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjVfZGF0YV9hKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWY1X2Nsa19hKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWY1X2RhdGFfYiksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmNV9jbGtfYiksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmX2Nsa19hKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWZfY2xrX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTBfZGF0YTEpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTBfZGF0YTQpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTBfY3RybCksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMF9jZCksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMF93cCksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMV9kYXRhMSksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMV9kYXRhNCksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMV9jdHJsKSwKKwlTSF9QRkNfUElOX0dST1VQKHNkaGkxX2NkKSwKKwlTSF9QRkNfUElOX0dST1VQKHNkaGkxX3dwKSwKKwlTSF9QRkNfUElOX0dST1VQKHNkaGkyX2RhdGExKSwKKwlTSF9QRkNfUElOX0dST1VQKHNkaGkyX2RhdGE0KSwKKwlTSF9QRkNfUElOX0dST1VQKHNkaGkyX2RhdGE4KSwKKwlTSF9QRkNfUElOX0dST1VQKHNkaGkyX2N0cmwpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTJfY2RfYSksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMl93cF9hKSwKKwlTSF9QRkNfUElOX0dST1VQKHNkaGkyX2NkX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTJfd3BfYiksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMl9kcyksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpM19kYXRhMSksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpM19kYXRhNCksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpM19kYXRhOCksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpM19jdHJsKSwKKwlTSF9QRkNfUElOX0dST1VQKHNkaGkzX2NkKSwKKwlTSF9QRkNfUElOX0dST1VQKHNkaGkzX3dwKSwKKwlTSF9QRkNfUElOX0dST1VQKHNkaGkzX2RzKSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2NpZjBfZ3JvdXBzW10gPSB7CisJInNjaWYwX2RhdGEiLAorCSJzY2lmMF9jbGsiLAorCSJzY2lmMF9jdHJsIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2NpZjFfZ3JvdXBzW10gPSB7CisJInNjaWYxX2RhdGFfYSIsCisJInNjaWYxX2NsayIsCisJInNjaWYxX2N0cmwiLAorCSJzY2lmMV9kYXRhX2IiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzY2lmMl9ncm91cHNbXSA9IHsKKwkic2NpZjJfZGF0YV9hIiwKKwkic2NpZjJfY2xrIiwKKwkic2NpZjJfZGF0YV9iIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2NpZjNfZ3JvdXBzW10gPSB7CisJInNjaWYzX2RhdGFfYSIsCisJInNjaWYzX2NsayIsCisJInNjaWYzX2N0cmwiLAorCSJzY2lmM19kYXRhX2IiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzY2lmNF9ncm91cHNbXSA9IHsKKwkic2NpZjRfZGF0YV9hIiwKKwkic2NpZjRfY2xrX2EiLAorCSJzY2lmNF9jdHJsX2EiLAorCSJzY2lmNF9kYXRhX2IiLAorCSJzY2lmNF9jbGtfYiIsCisJInNjaWY0X2N0cmxfYiIsCisJInNjaWY0X2RhdGFfYyIsCisJInNjaWY0X2Nsa19jIiwKKwkic2NpZjRfY3RybF9jIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2NpZjVfZ3JvdXBzW10gPSB7CisJInNjaWY1X2RhdGFfYSIsCisJInNjaWY1X2Nsa19hIiwKKwkic2NpZjVfZGF0YV9iIiwKKwkic2NpZjVfY2xrX2IiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzY2lmX2Nsa19ncm91cHNbXSA9IHsKKwkic2NpZl9jbGtfYSIsCisJInNjaWZfY2xrX2IiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZGhpMF9ncm91cHNbXSA9IHsKKwkic2RoaTBfZGF0YTEiLAorCSJzZGhpMF9kYXRhNCIsCisJInNkaGkwX2N0cmwiLAorCSJzZGhpMF9jZCIsCisJInNkaGkwX3dwIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RoaTFfZ3JvdXBzW10gPSB7CisJInNkaGkxX2RhdGExIiwKKwkic2RoaTFfZGF0YTQiLAorCSJzZGhpMV9jdHJsIiwKKwkic2RoaTFfY2QiLAorCSJzZGhpMV93cCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkaGkyX2dyb3Vwc1tdID0geworCSJzZGhpMl9kYXRhMSIsCisJInNkaGkyX2RhdGE0IiwKKwkic2RoaTJfZGF0YTgiLAorCSJzZGhpMl9jdHJsIiwKKwkic2RoaTJfY2RfYSIsCisJInNkaGkyX3dwX2EiLAorCSJzZGhpMl9jZF9iIiwKKwkic2RoaTJfd3BfYiIsCisJInNkaGkyX2RzIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RoaTNfZ3JvdXBzW10gPSB7CisJInNkaGkzX2RhdGExIiwKKwkic2RoaTNfZGF0YTQiLAorCSJzZGhpM19kYXRhOCIsCisJInNkaGkzX2N0cmwiLAorCSJzZGhpM19jZCIsCisJInNkaGkzX3dwIiwKKwkic2RoaTNfZHMiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9wZmNfZnVuY3Rpb24gcGlubXV4X2Z1bmN0aW9uc1tdID0geworCVNIX1BGQ19GVU5DVElPTihzY2lmMCksCisJU0hfUEZDX0ZVTkNUSU9OKHNjaWYxKSwKKwlTSF9QRkNfRlVOQ1RJT04oc2NpZjIpLAorCVNIX1BGQ19GVU5DVElPTihzY2lmMyksCisJU0hfUEZDX0ZVTkNUSU9OKHNjaWY0KSwKKwlTSF9QRkNfRlVOQ1RJT04oc2NpZjUpLAorCVNIX1BGQ19GVU5DVElPTihzY2lmX2NsayksCisJU0hfUEZDX0ZVTkNUSU9OKHNkaGkwKSwKKwlTSF9QRkNfRlVOQ1RJT04oc2RoaTEpLAorCVNIX1BGQ19GVU5DVElPTihzZGhpMiksCisJU0hfUEZDX0ZVTkNUSU9OKHNkaGkzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGlubXV4X2NmZ19yZWcgcGlubXV4X2NvbmZpZ19yZWdzW10gPSB7CisjZGVmaW5lIEZfKHgsIHkpCUZOXyMjeQorI2RlZmluZSBGTSh4KQkJRk5fIyN4CisJeyBQSU5NVVhfQ0ZHX1JFRygiR1BTUjAiLCAweGU2MDYwMTAwLCAzMiwgMSkgeworCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQlHUF8wXzE1X0ZOLAlHUFNSMF8xNSwKKwkJR1BfMF8xNF9GTiwJR1BTUjBfMTQsCisJCUdQXzBfMTNfRk4sCUdQU1IwXzEzLAorCQlHUF8wXzEyX0ZOLAlHUFNSMF8xMiwKKwkJR1BfMF8xMV9GTiwJR1BTUjBfMTEsCisJCUdQXzBfMTBfRk4sCUdQU1IwXzEwLAorCQlHUF8wXzlfRk4sCUdQU1IwXzksCisJCUdQXzBfOF9GTiwJR1BTUjBfOCwKKwkJR1BfMF83X0ZOLAlHUFNSMF83LAorCQlHUF8wXzZfRk4sCUdQU1IwXzYsCisJCUdQXzBfNV9GTiwJR1BTUjBfNSwKKwkJR1BfMF80X0ZOLAlHUFNSMF80LAorCQlHUF8wXzNfRk4sCUdQU1IwXzMsCisJCUdQXzBfMl9GTiwJR1BTUjBfMiwKKwkJR1BfMF8xX0ZOLAlHUFNSMF8xLAorCQlHUF8wXzBfRk4sCUdQU1IwXzAsIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIkdQU1IxIiwgMHhlNjA2MDEwNCwgMzIsIDEpIHsKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJR1BfMV8yOF9GTiwJR1BTUjFfMjgsCisJCUdQXzFfMjdfRk4sCUdQU1IxXzI3LAorCQlHUF8xXzI2X0ZOLAlHUFNSMV8yNiwKKwkJR1BfMV8yNV9GTiwJR1BTUjFfMjUsCisJCUdQXzFfMjRfRk4sCUdQU1IxXzI0LAorCQlHUF8xXzIzX0ZOLAlHUFNSMV8yMywKKwkJR1BfMV8yMl9GTiwJR1BTUjFfMjIsCisJCUdQXzFfMjFfRk4sCUdQU1IxXzIxLAorCQlHUF8xXzIwX0ZOLAlHUFNSMV8yMCwKKwkJR1BfMV8xOV9GTiwJR1BTUjFfMTksCisJCUdQXzFfMThfRk4sCUdQU1IxXzE4LAorCQlHUF8xXzE3X0ZOLAlHUFNSMV8xNywKKwkJR1BfMV8xNl9GTiwJR1BTUjFfMTYsCisJCUdQXzFfMTVfRk4sCUdQU1IxXzE1LAorCQlHUF8xXzE0X0ZOLAlHUFNSMV8xNCwKKwkJR1BfMV8xM19GTiwJR1BTUjFfMTMsCisJCUdQXzFfMTJfRk4sCUdQU1IxXzEyLAorCQlHUF8xXzExX0ZOLAlHUFNSMV8xMSwKKwkJR1BfMV8xMF9GTiwJR1BTUjFfMTAsCisJCUdQXzFfOV9GTiwJR1BTUjFfOSwKKwkJR1BfMV84X0ZOLAlHUFNSMV84LAorCQlHUF8xXzdfRk4sCUdQU1IxXzcsCisJCUdQXzFfNl9GTiwJR1BTUjFfNiwKKwkJR1BfMV81X0ZOLAlHUFNSMV81LAorCQlHUF8xXzRfRk4sCUdQU1IxXzQsCisJCUdQXzFfM19GTiwJR1BTUjFfMywKKwkJR1BfMV8yX0ZOLAlHUFNSMV8yLAorCQlHUF8xXzFfRk4sCUdQU1IxXzEsCisJCUdQXzFfMF9GTiwJR1BTUjFfMCwgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiR1BTUjIiLCAweGU2MDYwMTA4LCAzMiwgMSkgeworCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQlHUF8yXzE0X0ZOLAlHUFNSMl8xNCwKKwkJR1BfMl8xM19GTiwJR1BTUjJfMTMsCisJCUdQXzJfMTJfRk4sCUdQU1IyXzEyLAorCQlHUF8yXzExX0ZOLAlHUFNSMl8xMSwKKwkJR1BfMl8xMF9GTiwJR1BTUjJfMTAsCisJCUdQXzJfOV9GTiwJR1BTUjJfOSwKKwkJR1BfMl84X0ZOLAlHUFNSMl84LAorCQlHUF8yXzdfRk4sCUdQU1IyXzcsCisJCUdQXzJfNl9GTiwJR1BTUjJfNiwKKwkJR1BfMl81X0ZOLAlHUFNSMl81LAorCQlHUF8yXzRfRk4sCUdQU1IyXzQsCisJCUdQXzJfM19GTiwJR1BTUjJfMywKKwkJR1BfMl8yX0ZOLAlHUFNSMl8yLAorCQlHUF8yXzFfRk4sCUdQU1IyXzEsCisJCUdQXzJfMF9GTiwJR1BTUjJfMCwgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiR1BTUjMiLCAweGU2MDYwMTBjLCAzMiwgMSkgeworCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQlHUF8zXzE1X0ZOLAlHUFNSM18xNSwKKwkJR1BfM18xNF9GTiwJR1BTUjNfMTQsCisJCUdQXzNfMTNfRk4sCUdQU1IzXzEzLAorCQlHUF8zXzEyX0ZOLAlHUFNSM18xMiwKKwkJR1BfM18xMV9GTiwJR1BTUjNfMTEsCisJCUdQXzNfMTBfRk4sCUdQU1IzXzEwLAorCQlHUF8zXzlfRk4sCUdQU1IzXzksCisJCUdQXzNfOF9GTiwJR1BTUjNfOCwKKwkJR1BfM183X0ZOLAlHUFNSM183LAorCQlHUF8zXzZfRk4sCUdQU1IzXzYsCisJCUdQXzNfNV9GTiwJR1BTUjNfNSwKKwkJR1BfM180X0ZOLAlHUFNSM180LAorCQlHUF8zXzNfRk4sCUdQU1IzXzMsCisJCUdQXzNfMl9GTiwJR1BTUjNfMiwKKwkJR1BfM18xX0ZOLAlHUFNSM18xLAorCQlHUF8zXzBfRk4sCUdQU1IzXzAsIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIkdQU1I0IiwgMHhlNjA2MDExMCwgMzIsIDEpIHsKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJR1BfNF8xN19GTiwJR1BTUjRfMTcsCisJCUdQXzRfMTZfRk4sCUdQU1I0XzE2LAorCQlHUF80XzE1X0ZOLAlHUFNSNF8xNSwKKwkJR1BfNF8xNF9GTiwJR1BTUjRfMTQsCisJCUdQXzRfMTNfRk4sCUdQU1I0XzEzLAorCQlHUF80XzEyX0ZOLAlHUFNSNF8xMiwKKwkJR1BfNF8xMV9GTiwJR1BTUjRfMTEsCisJCUdQXzRfMTBfRk4sCUdQU1I0XzEwLAorCQlHUF80XzlfRk4sCUdQU1I0XzksCisJCUdQXzRfOF9GTiwJR1BTUjRfOCwKKwkJR1BfNF83X0ZOLAlHUFNSNF83LAorCQlHUF80XzZfRk4sCUdQU1I0XzYsCisJCUdQXzRfNV9GTiwJR1BTUjRfNSwKKwkJR1BfNF80X0ZOLAlHUFNSNF80LAorCQlHUF80XzNfRk4sCUdQU1I0XzMsCisJCUdQXzRfMl9GTiwJR1BTUjRfMiwKKwkJR1BfNF8xX0ZOLAlHUFNSNF8xLAorCQlHUF80XzBfRk4sCUdQU1I0XzAsIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIkdQU1I1IiwgMHhlNjA2MDExNCwgMzIsIDEpIHsKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJR1BfNV8yNV9GTiwJR1BTUjVfMjUsCisJCUdQXzVfMjRfRk4sCUdQU1I1XzI0LAorCQlHUF81XzIzX0ZOLAlHUFNSNV8yMywKKwkJR1BfNV8yMl9GTiwJR1BTUjVfMjIsCisJCUdQXzVfMjFfRk4sCUdQU1I1XzIxLAorCQlHUF81XzIwX0ZOLAlHUFNSNV8yMCwKKwkJR1BfNV8xOV9GTiwJR1BTUjVfMTksCisJCUdQXzVfMThfRk4sCUdQU1I1XzE4LAorCQlHUF81XzE3X0ZOLAlHUFNSNV8xNywKKwkJR1BfNV8xNl9GTiwJR1BTUjVfMTYsCisJCUdQXzVfMTVfRk4sCUdQU1I1XzE1LAorCQlHUF81XzE0X0ZOLAlHUFNSNV8xNCwKKwkJR1BfNV8xM19GTiwJR1BTUjVfMTMsCisJCUdQXzVfMTJfRk4sCUdQU1I1XzEyLAorCQlHUF81XzExX0ZOLAlHUFNSNV8xMSwKKwkJR1BfNV8xMF9GTiwJR1BTUjVfMTAsCisJCUdQXzVfOV9GTiwJR1BTUjVfOSwKKwkJR1BfNV84X0ZOLAlHUFNSNV84LAorCQlHUF81XzdfRk4sCUdQU1I1XzcsCisJCUdQXzVfNl9GTiwJR1BTUjVfNiwKKwkJR1BfNV81X0ZOLAlHUFNSNV81LAorCQlHUF81XzRfRk4sCUdQU1I1XzQsCisJCUdQXzVfM19GTiwJR1BTUjVfMywKKwkJR1BfNV8yX0ZOLAlHUFNSNV8yLAorCQlHUF81XzFfRk4sCUdQU1I1XzEsCisJCUdQXzVfMF9GTiwJR1BTUjVfMCwgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiR1BTUjYiLCAweGU2MDYwMTE4LCAzMiwgMSkgeworCQlHUF82XzMxX0ZOLAlHUFNSNl8zMSwKKwkJR1BfNl8zMF9GTiwJR1BTUjZfMzAsCisJCUdQXzZfMjlfRk4sCUdQU1I2XzI5LAorCQlHUF82XzI4X0ZOLAlHUFNSNl8yOCwKKwkJR1BfNl8yN19GTiwJR1BTUjZfMjcsCisJCUdQXzZfMjZfRk4sCUdQU1I2XzI2LAorCQlHUF82XzI1X0ZOLAlHUFNSNl8yNSwKKwkJR1BfNl8yNF9GTiwJR1BTUjZfMjQsCisJCUdQXzZfMjNfRk4sCUdQU1I2XzIzLAorCQlHUF82XzIyX0ZOLAlHUFNSNl8yMiwKKwkJR1BfNl8yMV9GTiwJR1BTUjZfMjEsCisJCUdQXzZfMjBfRk4sCUdQU1I2XzIwLAorCQlHUF82XzE5X0ZOLAlHUFNSNl8xOSwKKwkJR1BfNl8xOF9GTiwJR1BTUjZfMTgsCisJCUdQXzZfMTdfRk4sCUdQU1I2XzE3LAorCQlHUF82XzE2X0ZOLAlHUFNSNl8xNiwKKwkJR1BfNl8xNV9GTiwJR1BTUjZfMTUsCisJCUdQXzZfMTRfRk4sCUdQU1I2XzE0LAorCQlHUF82XzEzX0ZOLAlHUFNSNl8xMywKKwkJR1BfNl8xMl9GTiwJR1BTUjZfMTIsCisJCUdQXzZfMTFfRk4sCUdQU1I2XzExLAorCQlHUF82XzEwX0ZOLAlHUFNSNl8xMCwKKwkJR1BfNl85X0ZOLAlHUFNSNl85LAorCQlHUF82XzhfRk4sCUdQU1I2XzgsCisJCUdQXzZfN19GTiwJR1BTUjZfNywKKwkJR1BfNl82X0ZOLAlHUFNSNl82LAorCQlHUF82XzVfRk4sCUdQU1I2XzUsCisJCUdQXzZfNF9GTiwJR1BTUjZfNCwKKwkJR1BfNl8zX0ZOLAlHUFNSNl8zLAorCQlHUF82XzJfRk4sCUdQU1I2XzIsCisJCUdQXzZfMV9GTiwJR1BTUjZfMSwKKwkJR1BfNl8wX0ZOLAlHUFNSNl8wLCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJHUFNSNyIsIDB4ZTYwNjAxMWMsIDMyLCAxKSB7CisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCUdQXzdfM19GTiwgR1BTUjdfMywKKwkJR1BfN18yX0ZOLCBHUFNSN18yLAorCQlHUF83XzFfRk4sIEdQU1I3XzEsCisJCUdQXzdfMF9GTiwgR1BTUjdfMCwgfQorCX0sCisjdW5kZWYgRl8KKyN1bmRlZiBGTQorCisjZGVmaW5lIEZfKHgsIHkpCXgsCisjZGVmaW5lIEZNKHgpCQlGTl8jI3gsCisJeyBQSU5NVVhfQ0ZHX1JFRygiSVBTUjAiLCAweGU2MDYwMjAwLCAzMiwgNCkgeworCQlJUDBfMzFfMjgKKwkJSVAwXzI3XzI0CisJCUlQMF8yM18yMAorCQlJUDBfMTlfMTYKKwkJSVAwXzE1XzEyCisJCUlQMF8xMV84CisJCUlQMF83XzQKKwkJSVAwXzNfMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJJUFNSMSIsIDB4ZTYwNjAyMDQsIDMyLCA0KSB7CisJCUlQMV8zMV8yOAorCQlJUDFfMjdfMjQKKwkJSVAxXzIzXzIwCisJCUlQMV8xOV8xNgorCQlJUDFfMTVfMTIKKwkJSVAxXzExXzgKKwkJSVAxXzdfNAorCQlJUDFfM18wIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIklQU1IyIiwgMHhlNjA2MDIwOCwgMzIsIDQpIHsKKwkJSVAyXzMxXzI4CisJCUlQMl8yN18yNAorCQlJUDJfMjNfMjAKKwkJSVAyXzE5XzE2CisJCUlQMl8xNV8xMgorCQlJUDJfMTFfOAorCQlJUDJfN180CisJCUlQMl8zXzAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiSVBTUjMiLCAweGU2MDYwMjBjLCAzMiwgNCkgeworCQlJUDNfMzFfMjgKKwkJSVAzXzI3XzI0CisJCUlQM18yM18yMAorCQlJUDNfMTlfMTYKKwkJSVAzXzE1XzEyCisJCUlQM18xMV84CisJCUlQM183XzQKKwkJSVAzXzNfMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJJUFNSNCIsIDB4ZTYwNjAyMTAsIDMyLCA0KSB7CisJCUlQNF8zMV8yOAorCQlJUDRfMjdfMjQKKwkJSVA0XzIzXzIwCisJCUlQNF8xOV8xNgorCQlJUDRfMTVfMTIKKwkJSVA0XzExXzgKKwkJSVA0XzdfNAorCQlJUDRfM18wIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIklQU1I1IiwgMHhlNjA2MDIxNCwgMzIsIDQpIHsKKwkJSVA1XzMxXzI4CisJCUlQNV8yN18yNAorCQlJUDVfMjNfMjAKKwkJSVA1XzE5XzE2CisJCUlQNV8xNV8xMgorCQlJUDVfMTFfOAorCQlJUDVfN180CisJCUlQNV8zXzAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiSVBTUjYiLCAweGU2MDYwMjE4LCAzMiwgNCkgeworCQlJUDZfMzFfMjgKKwkJSVA2XzI3XzI0CisJCUlQNl8yM18yMAorCQlJUDZfMTlfMTYKKwkJSVA2XzE1XzEyCisJCUlQNl8xMV84CisJCUlQNl83XzQKKwkJSVA2XzNfMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJJUFNSNyIsIDB4ZTYwNjAyMWMsIDMyLCA0KSB7CisJCUlQN18zMV8yOAorCQlJUDdfMjdfMjQKKwkJSVA3XzIzXzIwCisJCUlQN18xOV8xNgorCQlJUDdfMTVfMTIKKwkJSVA3XzExXzgKKwkJSVA3XzdfNAorCQlJUDdfM18wIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIklQU1I4IiwgMHhlNjA2MDIyMCwgMzIsIDQpIHsKKwkJSVA4XzMxXzI4CisJCUlQOF8yN18yNAorCQlJUDhfMjNfMjAKKwkJSVA4XzE5XzE2CisJCUlQOF8xNV8xMgorCQlJUDhfMTFfOAorCQlJUDhfN180CisJCUlQOF8zXzAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiSVBTUjkiLCAweGU2MDYwMjI0LCAzMiwgNCkgeworCQlJUDlfMzFfMjgKKwkJSVA5XzI3XzI0CisJCUlQOV8yM18yMAorCQlJUDlfMTlfMTYKKwkJSVA5XzE1XzEyCisJCUlQOV8xMV84CisJCUlQOV83XzQKKwkJSVA5XzNfMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJJUFNSMTAiLCAweGU2MDYwMjI4LCAzMiwgNCkgeworCQlJUDEwXzMxXzI4CisJCUlQMTBfMjdfMjQKKwkJSVAxMF8yM18yMAorCQlJUDEwXzE5XzE2CisJCUlQMTBfMTVfMTIKKwkJSVAxMF8xMV84CisJCUlQMTBfN180CisJCUlQMTBfM18wIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIklQU1IxMSIsIDB4ZTYwNjAyMmMsIDMyLCA0KSB7CisJCUlQMTFfMzFfMjgKKwkJSVAxMV8yN18yNAorCQlJUDExXzIzXzIwCisJCUlQMTFfMTlfMTYKKwkJSVAxMV8xNV8xMgorCQlJUDExXzExXzgKKwkJSVAxMV83XzQKKwkJSVAxMV8zXzAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiSVBTUjEyIiwgMHhlNjA2MDIzMCwgMzIsIDQpIHsKKwkJSVAxMl8zMV8yOAorCQlJUDEyXzI3XzI0CisJCUlQMTJfMjNfMjAKKwkJSVAxMl8xOV8xNgorCQlJUDEyXzE1XzEyCisJCUlQMTJfMTFfOAorCQlJUDEyXzdfNAorCQlJUDEyXzNfMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJJUFNSMTMiLCAweGU2MDYwMjM0LCAzMiwgNCkgeworCQlJUDEzXzMxXzI4CisJCUlQMTNfMjdfMjQKKwkJSVAxM18yM18yMAorCQlJUDEzXzE5XzE2CisJCUlQMTNfMTVfMTIKKwkJSVAxM18xMV84CisJCUlQMTNfN180CisJCUlQMTNfM18wIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIklQU1IxNCIsIDB4ZTYwNjAyMzgsIDMyLCA0KSB7CisJCUlQMTRfMzFfMjgKKwkJSVAxNF8yN18yNAorCQlJUDE0XzIzXzIwCisJCUlQMTRfMTlfMTYKKwkJSVAxNF8xNV8xMgorCQlJUDE0XzExXzgKKwkJSVAxNF83XzQKKwkJSVAxNF8zXzAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiSVBTUjE1IiwgMHhlNjA2MDIzYywgMzIsIDQpIHsKKwkJSVAxNV8zMV8yOAorCQlJUDE1XzI3XzI0CisJCUlQMTVfMjNfMjAKKwkJSVAxNV8xOV8xNgorCQlJUDE1XzE1XzEyCisJCUlQMTVfMTFfOAorCQlJUDE1XzdfNAorCQlJUDE1XzNfMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJJUFNSMTYiLCAweGU2MDYwMjQwLCAzMiwgNCkgeworCQlJUDE2XzMxXzI4CisJCUlQMTZfMjdfMjQKKwkJSVAxNl8yM18yMAorCQlJUDE2XzE5XzE2CisJCUlQMTZfMTVfMTIKKwkJSVAxNl8xMV84CisJCUlQMTZfN180CisJCUlQMTZfM18wIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIklQU1IxNyIsIDB4ZTYwNjAyNDQsIDMyLCA0KSB7CisJCUlQMTdfMzFfMjgKKwkJSVAxN18yN18yNAorCQlJUDE3XzIzXzIwCisJCUlQMTdfMTlfMTYKKwkJSVAxN18xNV8xMgorCQlJUDE3XzExXzgKKwkJSVAxN183XzQKKwkJSVAxN18zXzAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiSVBTUjE4IiwgMHhlNjA2MDI0OCwgMzIsIDQpIHsKKwkJLyogSVAxOF8zMV8yOCAqLyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDE4XzI3XzI0ICovIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQMThfMjNfMjAgKi8gMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVAxOF8xOV8xNiAqLyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDE4XzE1XzEyICovIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQMThfMTFfOCAgKi8gMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJSVAxOF83XzQKKwkJSVAxOF8zXzAgfQorCX0sCisjdW5kZWYgRl8KKyN1bmRlZiBGTQorCisjZGVmaW5lIEZfKHgsIHkpCXgsCisjZGVmaW5lIEZNKHgpCQlGTl8jI3gsCisJeyBQSU5NVVhfQ0ZHX1JFR19WQVIoIk1PRF9TRUwwIiwgMHhlNjA2MDUwMCwgMzIsCisJCQkgICAgIDMsIDIsIDMsIDEsIDEsIDEsIDEsIDEsIDIsIDEsCisJCQkgICAgIDEsIDIsIDEsIDEsIDEsIDIsIDIsIDEsIDIsIDMpIHsKKwkJTU9EX1NFTDBfMzFfMzBfMjkKKwkJTU9EX1NFTDBfMjhfMjcKKwkJTU9EX1NFTDBfMjZfMjVfMjQKKwkJTU9EX1NFTDBfMjMKKwkJTU9EX1NFTDBfMjIKKwkJTU9EX1NFTDBfMjEKKwkJTU9EX1NFTDBfMjAKKwkJTU9EX1NFTDBfMTkKKwkJTU9EX1NFTDBfMThfMTcKKwkJTU9EX1NFTDBfMTYKKwkJTU9EX1NFTDBfMTUKKwkJTU9EX1NFTDBfMTRfMTMKKwkJTU9EX1NFTDBfMTIKKwkJTU9EX1NFTDBfMTEKKwkJTU9EX1NFTDBfMTAKKwkJTU9EX1NFTDBfOV84CisJCU1PRF9TRUwwXzdfNgorCQlNT0RfU0VMMF81CisJCU1PRF9TRUwwXzRfMworCQkvKiBSRVNFUlZFRCAyLCAxLCAwICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFR19WQVIoIk1PRF9TRUwxIiwgMHhlNjA2MDUwNCwgMzIsCisJCQkgICAgIDIsIDMsIDEsIDIsIDMsIDEsIDEsIDIsIDEsCisJCQkgICAgIDIsIDEsIDEsIDEsIDEsIDEsIDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEpIHsKKwkJTU9EX1NFTDFfMzFfMzAKKwkJTU9EX1NFTDFfMjlfMjhfMjcKKwkJTU9EX1NFTDFfMjYKKwkJTU9EX1NFTDFfMjVfMjQKKwkJTU9EX1NFTDFfMjNfMjJfMjEKKwkJTU9EX1NFTDFfMjAKKwkJTU9EX1NFTDFfMTkKKwkJTU9EX1NFTDFfMThfMTcKKwkJTU9EX1NFTDFfMTYKKwkJTU9EX1NFTDFfMTVfMTQKKwkJTU9EX1NFTDFfMTMKKwkJTU9EX1NFTDFfMTIKKwkJTU9EX1NFTDFfMTEKKwkJTU9EX1NFTDFfMTAKKwkJTU9EX1NFTDFfOQorCQkwLCAwLCAwLCAwLCAvKiBSRVNFUlZFRCA4LCA3ICovCisJCU1PRF9TRUwxXzYKKwkJTU9EX1NFTDFfNQorCQlNT0RfU0VMMV80CisJCU1PRF9TRUwxXzMKKwkJTU9EX1NFTDFfMgorCQlNT0RfU0VMMV8xCisJCU1PRF9TRUwxXzAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFR19WQVIoIk1PRF9TRUwyIiwgMHhlNjA2MDUwOCwgMzIsCisJCQkgICAgIDEsIDEsIDEsIDIsIDEsIDMsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisJCQkgICAgIDQsIDQsIDQsIDMsIDEpIHsKKwkJTU9EX1NFTDJfMzEKKwkJTU9EX1NFTDJfMzAKKwkJTU9EX1NFTDJfMjkKKwkJTU9EX1NFTDJfMjhfMjcKKwkJTU9EX1NFTDJfMjYKKwkJTU9EX1NFTDJfMjVfMjRfMjMKKwkJTU9EX1NFTDJfMjIKKwkJTU9EX1NFTDJfMjEKKwkJTU9EX1NFTDJfMjAKKwkJTU9EX1NFTDJfMTkKKwkJTU9EX1NFTDJfMTgKKwkJTU9EX1NFTDJfMTcKKwkJLyogUkVTRVJWRUQgMTYgKi8KKwkJMCwgMCwKKwkJLyogUkVTRVJWRUQgMTUsIDE0LCAxMywgMTIgKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogUkVTRVJWRUQgMTEsIDEwLCA5LCA4ICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIFJFU0VSVkVEIDcsIDYsIDUsIDQgKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogUkVTRVJWRUQgMywgMiwgMSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQlNT0RfU0VMMl8wIH0KKwl9LAorCXsgfSwKK307CisKK3N0YXRpYyBpbnQgcjhhNzc5Nl9waW5fdG9fcG9jY3RybChzdHJ1Y3Qgc2hfcGZjICpwZmMsIHVuc2lnbmVkIGludCBwaW4sIHUzMiAqcG9jY3RybCkKK3sKKwlpbnQgYml0ID0gLUVJTlZBTDsKKworCSpwb2NjdHJsID0gMHhlNjA2MDM4MDsKKworCWlmIChwaW4gPj0gUkNBUl9HUF9QSU4oMywgMCkgJiYgcGluIDw9IFJDQVJfR1BfUElOKDMsIDExKSkKKwkJYml0ID0gcGluICYgMHgxZjsKKworCWlmIChwaW4gPj0gUkNBUl9HUF9QSU4oNCwgMCkgJiYgcGluIDw9IFJDQVJfR1BfUElOKDQsIDE3KSkKKwkJYml0ID0gKHBpbiAmIDB4MWYpICsgMTI7CisKKwlyZXR1cm4gYml0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX3BmY19zb2Nfb3BlcmF0aW9ucyByOGE3Nzk2X3Bpbm11eF9vcHMgPSB7CisJLnBpbl90b19wb2NjdHJsID0gcjhhNzc5Nl9waW5fdG9fcG9jY3RybCwKK307CisKK2NvbnN0IHN0cnVjdCBzaF9wZmNfc29jX2luZm8gcjhhNzc5Nl9waW5tdXhfaW5mbyA9IHsKKwkubmFtZSA9ICJyOGE3Nzk2MF9wZmMiLAorCS5vcHMgPSAmcjhhNzc5Nl9waW5tdXhfb3BzLAorCS51bmxvY2tfcmVnID0gMHhlNjA2MDAwMCwgLyogUE1NUiAqLworCisJLmZ1bmN0aW9uID0geyBQSU5NVVhfRlVOQ1RJT05fQkVHSU4sIFBJTk1VWF9GVU5DVElPTl9FTkQgfSwKKworCS5waW5zID0gcGlubXV4X3BpbnMsCisJLm5yX3BpbnMgPSBBUlJBWV9TSVpFKHBpbm11eF9waW5zKSwKKwkuZ3JvdXBzID0gcGlubXV4X2dyb3VwcywKKwkubnJfZ3JvdXBzID0gQVJSQVlfU0laRShwaW5tdXhfZ3JvdXBzKSwKKwkuZnVuY3Rpb25zID0gcGlubXV4X2Z1bmN0aW9ucywKKwkubnJfZnVuY3Rpb25zID0gQVJSQVlfU0laRShwaW5tdXhfZnVuY3Rpb25zKSwKKworCS5jZmdfcmVncyA9IHBpbm11eF9jb25maWdfcmVncywKKworCS5waW5tdXhfZGF0YSA9IHBpbm11eF9kYXRhLAorCS5waW5tdXhfZGF0YV9zaXplID0gQVJSQVlfU0laRShwaW5tdXhfZGF0YSksCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9waW5jdHJsLmMgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BpbmN0cmwuYwppbmRleCBlMjA4ZWUwLi5jNTc3MjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BpbmN0cmwuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BpbmN0cmwuYwpAQCAtNTk2LDYgKzU5Niw3IEBACiAJc3RydWN0IHNoX3BmYyAqcGZjID0gcG14LT5wZmM7CiAJZW51bSBwaW5fY29uZmlnX3BhcmFtIHBhcmFtID0gcGluY29uZl90b19jb25maWdfcGFyYW0oKmNvbmZpZyk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgYXJnOwogCiAJaWYgKCFzaF9wZmNfcGluY29uZl92YWxpZGF0ZShwZmMsIF9waW4sIHBhcmFtKSkKIAkJcmV0dXJuIC1FTk9UU1VQUDsKQEAgLTYxNiw3ICs2MTcsNyBAQAogCQlpZiAoYmlhcyAhPSBwYXJhbSkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCSpjb25maWcgPSAwOworCQlhcmcgPSAwOwogCQlicmVhazsKIAl9CiAKQEAgLTYyNyw3ICs2MjgsNyBAQAogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKLQkJKmNvbmZpZyA9IHJldDsKKwkJYXJnID0gcmV0OwogCQlicmVhazsKIAl9CiAKQEAgLTY0Niw3ICs2NDcsNyBAQAogCQl2YWwgPSBzaF9wZmNfcmVhZF9yZWcocGZjLCBwb2NjdHJsLCAzMik7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmYy0+bG9jaywgZmxhZ3MpOwogCi0JCSpjb25maWcgPSAodmFsICYgQklUKGJpdCkpID8gMzMwMCA6IDE4MDA7CisJCWFyZyA9ICh2YWwgJiBCSVQoYml0KSkgPyAzMzAwIDogMTgwMDsKIAkJYnJlYWs7CiAJfQogCkBAIC02NTQsNiArNjU1LDcgQEAKIAkJcmV0dXJuIC1FTk9UU1VQUDsKIAl9CiAKKwkqY29uZmlnID0gcGluY29uZl90b19jb25maWdfcGFja2VkKHBhcmFtLCBhcmcpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3NoX3BmYy5oIGIvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9zaF9wZmMuaAppbmRleCA1ZTk2NmMwLi4yMzQ1NDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3NoX3BmYy5oCisrKyBiL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvc2hfcGZjLmgKQEAgLTI1Nyw5ICsyNTcsMTEgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc2hfcGZjX3NvY19pbmZvIHI4YTc3NzlfcGlubXV4X2luZm87CiBleHRlcm4gY29uc3Qgc3RydWN0IHNoX3BmY19zb2NfaW5mbyByOGE3NzkwX3Bpbm11eF9pbmZvOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBzaF9wZmNfc29jX2luZm8gcjhhNzc5MV9waW5tdXhfaW5mbzsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc2hfcGZjX3NvY19pbmZvIHI4YTc3OTJfcGlubXV4X2luZm87CiBleHRlcm4gY29uc3Qgc3RydWN0IHNoX3BmY19zb2NfaW5mbyByOGE3NzkzX3Bpbm11eF9pbmZvOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBzaF9wZmNfc29jX2luZm8gcjhhNzc5NF9waW5tdXhfaW5mbzsKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc2hfcGZjX3NvY19pbmZvIHI4YTc3OTVfcGlubXV4X2luZm87CitleHRlcm4gY29uc3Qgc3RydWN0IHNoX3BmY19zb2NfaW5mbyByOGE3Nzk2X3Bpbm11eF9pbmZvOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBzaF9wZmNfc29jX2luZm8gc2g3MjAzX3Bpbm11eF9pbmZvOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBzaF9wZmNfc29jX2luZm8gc2g3MjY0X3Bpbm11eF9pbmZvOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBzaF9wZmNfc29jX2luZm8gc2g3MjY5X3Bpbm11eF9pbmZvOwpAQCAtMzU0LDcyICszNTYsMTAzIEBACiAgKiBHUCBwb3J0IHN0eWxlICgzMiBwb3J0cyBiYW5rcykKICAqLwogCi0jZGVmaW5lIFBPUlRfR1BfQ0ZHXzEoYmFuaywgcGluLCBmbiwgc2Z4LCBjZmcpIGZuKGJhbmssIHBpbiwgR1BfIyNiYW5rIyNfIyNwaW4sIHNmeCwgY2ZnKQorI2RlZmluZSBQT1JUX0dQX0NGR18xKGJhbmssIHBpbiwgZm4sIHNmeCwgY2ZnKQkJCQlcCisJZm4oYmFuaywgcGluLCBHUF8jI2JhbmsjI18jI3Bpbiwgc2Z4LCBjZmcpCiAjZGVmaW5lIFBPUlRfR1BfMShiYW5rLCBwaW4sIGZuLCBzZngpCVBPUlRfR1BfQ0ZHXzEoYmFuaywgcGluLCBmbiwgc2Z4LCAwKQogCi0jZGVmaW5lIFBPUlRfR1BfQ0ZHXzQoYmFuaywgZm4sIHNmeCwgY2ZnKQkJCQkJCVwKLQlQT1JUX0dQX0NGR18xKGJhbmssIDAsICBmbiwgc2Z4LCBjZmcpLCBQT1JUX0dQX0NGR18xKGJhbmssIDEsICBmbiwgc2Z4LCBjZmcpLAlcCi0JUE9SVF9HUF9DRkdfMShiYW5rLCAyLCAgZm4sIHNmeCwgY2ZnKSwgUE9SVF9HUF9DRkdfMShiYW5rLCAzLCAgZm4sIHNmeCwgY2ZnKQorI2RlZmluZSBQT1JUX0dQX0NGR180KGJhbmssIGZuLCBzZngsIGNmZykJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMCwgIGZuLCBzZngsIGNmZyksCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDEsICBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAyLCAgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMywgIGZuLCBzZngsIGNmZykKICNkZWZpbmUgUE9SVF9HUF80KGJhbmssIGZuLCBzZngpCVBPUlRfR1BfQ0ZHXzQoYmFuaywgZm4sIHNmeCwgMCkKIAotI2RlZmluZSBQT1JUX0dQX0NGR184KGJhbmssIGZuLCBzZngsIGNmZykJCQkJCQlcCi0JUE9SVF9HUF9DRkdfNChiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQkJCVwKLQlQT1JUX0dQX0NGR18xKGJhbmssIDQsICBmbiwgc2Z4LCBjZmcpLCBQT1JUX0dQX0NGR18xKGJhbmssIDUsICBmbiwgc2Z4LCBjZmcpLAlcCi0JUE9SVF9HUF9DRkdfMShiYW5rLCA2LCAgZm4sIHNmeCwgY2ZnKSwgUE9SVF9HUF9DRkdfMShiYW5rLCA3LCAgZm4sIHNmeCwgY2ZnKQorI2RlZmluZSBQT1JUX0dQX0NGR184KGJhbmssIGZuLCBzZngsIGNmZykJCQkJXAorCVBPUlRfR1BfQ0ZHXzQoYmFuaywgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgNCwgIGZuLCBzZngsIGNmZyksCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDUsICBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCA2LCAgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgNywgIGZuLCBzZngsIGNmZykKICNkZWZpbmUgUE9SVF9HUF84KGJhbmssIGZuLCBzZngpCVBPUlRfR1BfQ0ZHXzgoYmFuaywgZm4sIHNmeCwgMCkKIAotI2RlZmluZSBQT1JUX0dQX0NGR185KGJhbmssIGZuLCBzZngsIGNmZykJCQkJCQlcCi0JUE9SVF9HUF9DRkdfOChiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQkJCVwKKyNkZWZpbmUgUE9SVF9HUF9DRkdfOShiYW5rLCBmbiwgc2Z4LCBjZmcpCQkJCVwKKwlQT1JUX0dQX0NGR184KGJhbmssIGZuLCBzZngsIGNmZyksCQkJCVwKIAlQT1JUX0dQX0NGR18xKGJhbmssIDgsICBmbiwgc2Z4LCBjZmcpCiAjZGVmaW5lIFBPUlRfR1BfOShiYW5rLCBmbiwgc2Z4KQlQT1JUX0dQX0NGR185KGJhbmssIGZuLCBzZngsIDApCiAKLSNkZWZpbmUgUE9SVF9HUF9DRkdfMTIoYmFuaywgZm4sIHNmeCwgY2ZnKQkJCQkJCVwKLQlQT1JUX0dQX0NGR184KGJhbmssIGZuLCBzZngsIGNmZyksCQkJCQkJXAotCVBPUlRfR1BfQ0ZHXzEoYmFuaywgOCwgIGZuLCBzZngsIGNmZyksIFBPUlRfR1BfQ0ZHXzEoYmFuaywgOSwgIGZuLCBzZngsIGNmZyksCVwKLQlQT1JUX0dQX0NGR18xKGJhbmssIDEwLCBmbiwgc2Z4LCBjZmcpLCBQT1JUX0dQX0NGR18xKGJhbmssIDExLCBmbiwgc2Z4LCBjZmcpCisjZGVmaW5lIFBPUlRfR1BfQ0ZHXzEyKGJhbmssIGZuLCBzZngsIGNmZykJCQkJXAorCVBPUlRfR1BfQ0ZHXzkoYmFuaywgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgOSwgIGZuLCBzZngsIGNmZyksCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDEwLCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAxMSwgZm4sIHNmeCwgY2ZnKQogI2RlZmluZSBQT1JUX0dQXzEyKGJhbmssIGZuLCBzZngpCVBPUlRfR1BfQ0ZHXzEyKGJhbmssIGZuLCBzZngsIDApCiAKLSNkZWZpbmUgUE9SVF9HUF9DRkdfMTQoYmFuaywgZm4sIHNmeCwgY2ZnKQkJCQkJCVwKLQlQT1JUX0dQX0NGR18xMihiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQkJCVwKLQlQT1JUX0dQX0NGR18xKGJhbmssIDEyLCBmbiwgc2Z4LCBjZmcpLCBQT1JUX0dQX0NGR18xKGJhbmssIDEzLCBmbiwgc2Z4LCBjZmcpCisjZGVmaW5lIFBPUlRfR1BfQ0ZHXzE0KGJhbmssIGZuLCBzZngsIGNmZykJCQkJXAorCVBPUlRfR1BfQ0ZHXzEyKGJhbmssIGZuLCBzZngsIGNmZyksCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDEyLCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAxMywgZm4sIHNmeCwgY2ZnKQogI2RlZmluZSBQT1JUX0dQXzE0KGJhbmssIGZuLCBzZngpCVBPUlRfR1BfQ0ZHXzE0KGJhbmssIGZuLCBzZngsIDApCiAKLSNkZWZpbmUgUE9SVF9HUF9DRkdfMTUoYmFuaywgZm4sIHNmeCwgY2ZnKQkJCQkJCVwKLQlQT1JUX0dQX0NGR18xNChiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQkJCVwKKyNkZWZpbmUgUE9SVF9HUF9DRkdfMTUoYmFuaywgZm4sIHNmeCwgY2ZnKQkJCQlcCisJUE9SVF9HUF9DRkdfMTQoYmFuaywgZm4sIHNmeCwgY2ZnKSwJCQkJXAogCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMTQsIGZuLCBzZngsIGNmZykKICNkZWZpbmUgUE9SVF9HUF8xNShiYW5rLCBmbiwgc2Z4KQlQT1JUX0dQX0NGR18xNShiYW5rLCBmbiwgc2Z4LCAwKQogCi0jZGVmaW5lIFBPUlRfR1BfQ0ZHXzE2KGJhbmssIGZuLCBzZngsIGNmZykJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMTQoYmFuaywgZm4sIHNmeCwgY2ZnKSwJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMShiYW5rLCAxNCwgZm4sIHNmeCwgY2ZnKSwgUE9SVF9HUF9DRkdfMShiYW5rLCAxNSwgZm4sIHNmeCwgY2ZnKQorI2RlZmluZSBQT1JUX0dQX0NGR18xNihiYW5rLCBmbiwgc2Z4LCBjZmcpCQkJCVwKKwlQT1JUX0dQX0NGR18xNShiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAxNSwgZm4sIHNmeCwgY2ZnKQogI2RlZmluZSBQT1JUX0dQXzE2KGJhbmssIGZuLCBzZngpCVBPUlRfR1BfQ0ZHXzE2KGJhbmssIGZuLCBzZngsIDApCiAKLSNkZWZpbmUgUE9SVF9HUF9DRkdfMTgoYmFuaywgZm4sIHNmeCwgY2ZnKQkJCQkJCVwKLQlQT1JUX0dQX0NGR18xNihiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQkJCVwKLQlQT1JUX0dQX0NGR18xKGJhbmssIDE2LCBmbiwgc2Z4LCBjZmcpLCBQT1JUX0dQX0NGR18xKGJhbmssIDE3LCBmbiwgc2Z4LCBjZmcpCisjZGVmaW5lIFBPUlRfR1BfQ0ZHXzE3KGJhbmssIGZuLCBzZngsIGNmZykJCQkJXAorCVBPUlRfR1BfQ0ZHXzE2KGJhbmssIGZuLCBzZngsIGNmZyksCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDE2LCBmbiwgc2Z4LCBjZmcpCisjZGVmaW5lIFBPUlRfR1BfMTcoYmFuaywgZm4sIHNmeCkJUE9SVF9HUF9DRkdfMTcoYmFuaywgZm4sIHNmeCwgMCkKKworI2RlZmluZSBQT1JUX0dQX0NGR18xOChiYW5rLCBmbiwgc2Z4LCBjZmcpCQkJCVwKKwlQT1JUX0dQX0NGR18xNyhiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAxNywgZm4sIHNmeCwgY2ZnKQogI2RlZmluZSBQT1JUX0dQXzE4KGJhbmssIGZuLCBzZngpCVBPUlRfR1BfQ0ZHXzE4KGJhbmssIGZuLCBzZngsIDApCiAKLSNkZWZpbmUgUE9SVF9HUF9DRkdfMjYoYmFuaywgZm4sIHNmeCwgY2ZnKQkJCQkJCVwKLQlQT1JUX0dQX0NGR18xOChiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQkJCVwKLQlQT1JUX0dQX0NGR18xKGJhbmssIDE4LCBmbiwgc2Z4LCBjZmcpLCBQT1JUX0dQX0NGR18xKGJhbmssIDE5LCBmbiwgc2Z4LCBjZmcpLAlcCi0JUE9SVF9HUF9DRkdfMShiYW5rLCAyMCwgZm4sIHNmeCwgY2ZnKSwgUE9SVF9HUF9DRkdfMShiYW5rLCAyMSwgZm4sIHNmeCwgY2ZnKSwJXAotCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMjIsIGZuLCBzZngsIGNmZyksIFBPUlRfR1BfQ0ZHXzEoYmFuaywgMjMsIGZuLCBzZngsIGNmZyksCVwKLQlQT1JUX0dQX0NGR18xKGJhbmssIDI0LCBmbiwgc2Z4LCBjZmcpLCBQT1JUX0dQX0NGR18xKGJhbmssIDI1LCBmbiwgc2Z4LCBjZmcpCisjZGVmaW5lIFBPUlRfR1BfQ0ZHXzIzKGJhbmssIGZuLCBzZngsIGNmZykJCQkJXAorCVBPUlRfR1BfQ0ZHXzE4KGJhbmssIGZuLCBzZngsIGNmZyksCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDE4LCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAxOSwgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMjAsIGZuLCBzZngsIGNmZyksCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDIxLCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAyMiwgZm4sIHNmeCwgY2ZnKQorI2RlZmluZSBQT1JUX0dQXzIzKGJhbmssIGZuLCBzZngpCVBPUlRfR1BfQ0ZHXzIzKGJhbmssIGZuLCBzZngsIDApCisKKyNkZWZpbmUgUE9SVF9HUF9DRkdfMjQoYmFuaywgZm4sIHNmeCwgY2ZnKQkJCQlcCisJUE9SVF9HUF9DRkdfMjMoYmFuaywgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMjMsIGZuLCBzZngsIGNmZykKKyNkZWZpbmUgUE9SVF9HUF8yNChiYW5rLCBmbiwgc2Z4KQlQT1JUX0dQX0NGR18yNChiYW5rLCBmbiwgc2Z4LCAwKQorCisjZGVmaW5lIFBPUlRfR1BfQ0ZHXzI2KGJhbmssIGZuLCBzZngsIGNmZykJCQkJXAorCVBPUlRfR1BfQ0ZHXzI0KGJhbmssIGZuLCBzZngsIGNmZyksCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDI0LCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAyNSwgZm4sIHNmeCwgY2ZnKQogI2RlZmluZSBQT1JUX0dQXzI2KGJhbmssIGZuLCBzZngpCVBPUlRfR1BfQ0ZHXzI2KGJhbmssIGZuLCBzZngsIDApCiAKLSNkZWZpbmUgUE9SVF9HUF9DRkdfMjgoYmFuaywgZm4sIHNmeCwgY2ZnKQkJCQkJCVwKLQlQT1JUX0dQX0NGR18yNihiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQkJCVwKLQlQT1JUX0dQX0NGR18xKGJhbmssIDI2LCBmbiwgc2Z4LCBjZmcpLCBQT1JUX0dQX0NGR18xKGJhbmssIDI3LCBmbiwgc2Z4LCBjZmcpCisjZGVmaW5lIFBPUlRfR1BfQ0ZHXzI4KGJhbmssIGZuLCBzZngsIGNmZykJCQkJXAorCVBPUlRfR1BfQ0ZHXzI2KGJhbmssIGZuLCBzZngsIGNmZyksCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDI2LCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAyNywgZm4sIHNmeCwgY2ZnKQogI2RlZmluZSBQT1JUX0dQXzI4KGJhbmssIGZuLCBzZngpCVBPUlRfR1BfQ0ZHXzI4KGJhbmssIGZuLCBzZngsIDApCiAKLSNkZWZpbmUgUE9SVF9HUF9DRkdfMzAoYmFuaywgZm4sIHNmeCwgY2ZnKQkJCQkJCVwKLQlQT1JUX0dQX0NGR18yOChiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQkJCVwKLQlQT1JUX0dQX0NGR18xKGJhbmssIDI4LCBmbiwgc2Z4LCBjZmcpLCBQT1JUX0dQX0NGR18xKGJhbmssIDI5LCBmbiwgc2Z4LCBjZmcpCisjZGVmaW5lIFBPUlRfR1BfQ0ZHXzI5KGJhbmssIGZuLCBzZngsIGNmZykJCQkJXAorCVBPUlRfR1BfQ0ZHXzI4KGJhbmssIGZuLCBzZngsIGNmZyksCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDI4LCBmbiwgc2Z4LCBjZmcpCisjZGVmaW5lIFBPUlRfR1BfMjkoYmFuaywgZm4sIHNmeCkJUE9SVF9HUF9DRkdfMjkoYmFuaywgZm4sIHNmeCwgMCkKKworI2RlZmluZSBQT1JUX0dQX0NGR18zMChiYW5rLCBmbiwgc2Z4LCBjZmcpCQkJCVwKKwlQT1JUX0dQX0NGR18yOShiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAyOSwgZm4sIHNmeCwgY2ZnKQogI2RlZmluZSBQT1JUX0dQXzMwKGJhbmssIGZuLCBzZngpCVBPUlRfR1BfQ0ZHXzMwKGJhbmssIGZuLCBzZngsIDApCiAKLSNkZWZpbmUgUE9SVF9HUF9DRkdfMzIoYmFuaywgZm4sIHNmeCwgY2ZnKQkJCQkJCVwKLQlQT1JUX0dQX0NGR18zMChiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQkJCVwKLQlQT1JUX0dQX0NGR18xKGJhbmssIDMwLCBmbiwgc2Z4LCBjZmcpLCBQT1JUX0dQX0NGR18xKGJhbmssIDMxLCBmbiwgc2Z4LCBjZmcpCisjZGVmaW5lIFBPUlRfR1BfQ0ZHXzMyKGJhbmssIGZuLCBzZngsIGNmZykJCQkJXAorCVBPUlRfR1BfQ0ZHXzMwKGJhbmssIGZuLCBzZngsIGNmZyksCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDMwLCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAzMSwgZm4sIHNmeCwgY2ZnKQogI2RlZmluZSBQT1JUX0dQXzMyKGJhbmssIGZuLCBzZngpCVBPUlRfR1BfQ0ZHXzMyKGJhbmssIGZuLCBzZngsIDApCiAKICNkZWZpbmUgUE9SVF9HUF8zMl9SRVYoYmFuaywgZm4sIHNmeCkJCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtYXRsYXM3LmMgYi9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLWF0bGFzNy5jCmluZGV4IDE5OTUyZjcuLjdmMzA0MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtYXRsYXM3LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1hdGxhczcuYwpAQCAtNyw3ICs3LDcgQEAKICAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KQEAgLTYxNTgsNiArNjE1OCwzIEBACiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXRsYXM3X2dwaW9fZHJpdmVyKTsKIH0KIHN1YnN5c19pbml0Y2FsbChhdGxhczdfZ3Bpb19pbml0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJTSVJGU09DIEF0bGFzNyBwaW4gY29udHJvbCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtc2lyZi5jIGIvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1zaXJmLmMKaW5kZXggNzYyYzBjOS4uMGRmNzJiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1zaXJmLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1zaXJmLmMKQEAgLTEsNiArMSwxMSBAQAogLyoKICAqIHBpbm11eCBkcml2ZXIgZm9yIENTUiBTaVJGcHJpbWFJSQogICoKKyAqIEF1dGhvcnM6CisgKglSb25nanVuIFlpbmcgPHJvbmdqdW4ueWluZ0Bjc3IuY29tPgorICoJWXVwaW5nIEx1byA8eXVwaW5nLmx1b0Bjc3IuY29tPgorICoJQmFycnkgU29uZyA8YmFvaHVhLnNvbmdAY3NyLmNvbT4KKyAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEgLSAyMDE0IENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cAogICogY29tcGFueS4KICAqCkBAIC04LDcgKzEzLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC04ODQsOSArODg4LDMgQEAKIAlyZXR1cm4gc2lyZnNvY19ncGlvX3Byb2JlKG5wKTsKIH0KIHN1YnN5c19pbml0Y2FsbChzaXJmc29jX2dwaW9faW5pdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIlJvbmdqdW4gWWluZyA8cm9uZ2p1bi55aW5nQGNzci5jb20+Iik7Ci1NT0RVTEVfQVVUSE9SKCJZdXBpbmcgTHVvIDx5dXBpbmcubHVvQGNzci5jb20+Iik7Ci1NT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDxiYW9odWEuc29uZ0Bjc3IuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTSVJGU09DIHBpbiBjb250cm9sIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3N0bTMyL0tjb25maWcgYi9kcml2ZXJzL3BpbmN0cmwvc3RtMzIvS2NvbmZpZwppbmRleCA0YzQwZGFlLi5jMDNkY2U3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc3RtMzIvS2NvbmZpZworKysgYi9kcml2ZXJzL3BpbmN0cmwvc3RtMzIvS2NvbmZpZwpAQCAtNiwxNiArNiwxNyBAQAogCXNlbGVjdCBQSU5NVVgKIAlzZWxlY3QgR0VORVJJQ19QSU5DT05GCiAJc2VsZWN0IEdQSU9MSUIKKwlzZWxlY3QgTUZEX1NZU0NPTgogCiBjb25maWcgUElOQ1RSTF9TVE0zMkY0MjkKIAlib29sICJTVE1pY3JvZWxlY3Ryb25pY3MgU1RNMzJGNDI5IHBpbiBjb250cm9sIiBpZiBDT01QSUxFX1RFU1QgJiYgIU1BQ0hfU1RNMzJGNDI5Ci0JZGVwZW5kcyBvbiBPRgorCWRlcGVuZHMgb24gT0YgJiYgSVJRX0RPTUFJTl9ISUVSQVJDSFkKIAlkZWZhdWx0IE1BQ0hfU1RNMzJGNDI5CiAJc2VsZWN0IFBJTkNUUkxfU1RNMzIKIAogY29uZmlnIFBJTkNUUkxfU1RNMzJGNzQ2CiAJYm9vbCAiU1RNaWNyb2VsZWN0cm9uaWNzIFNUTTMyRjc0NiBwaW4gY29udHJvbCIgaWYgQ09NUElMRV9URVNUICYmICFNQUNIX1NUTTMyRjc0NgotCWRlcGVuZHMgb24gT0YKKwlkZXBlbmRzIG9uIE9GICYmIElSUV9ET01BSU5fSElFUkFSQ0hZCiAJZGVmYXVsdCBNQUNIX1NUTTMyRjc0NgogCXNlbGVjdCBQSU5DVFJMX1NUTTMyCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zdG0zMi9waW5jdHJsLXN0bTMyLmMgYi9kcml2ZXJzL3BpbmN0cmwvc3RtMzIvcGluY3RybC1zdG0zMi5jCmluZGV4IDRhZTU5NmIuLjIwMDY2N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zdG0zMi9waW5jdHJsLXN0bTMyLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3N0bTMyL3BpbmN0cmwtc3RtMzIuYwpAQCAtOCw2ICs4LDggQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgpAQCAtMjAsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY3RybC5oPgogI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGlubXV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKQEAgLTQwLDYgKzQzLDcgQEAKICNkZWZpbmUgU1RNMzJfR1BJT19BRlJICQkweDI0CiAKICNkZWZpbmUgU1RNMzJfR1BJT19QSU5TX1BFUl9CQU5LIDE2CisjZGVmaW5lIFNUTTMyX0dQSU9fSVJRX0xJTkUJIDE2CiAKICNkZWZpbmUgZ3Bpb19yYW5nZV90b19iYW5rKGNoaXApIFwKIAkJY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBzdG0zMl9ncGlvX2JhbmssIHJhbmdlKQpAQCAtNjUsNiArNjksOCBAQAogCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW9fY2hpcDsKIAlzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlIHJhbmdlOworCXN0cnVjdCBmd25vZGVfaGFuZGxlICpmd25vZGU7CisJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbjsKIH07CiAKIHN0cnVjdCBzdG0zMl9waW5jdHJsIHsKQEAgLTc3LDYgKzgzLDkgQEAKIAlzdHJ1Y3Qgc3RtMzJfZ3Bpb19iYW5rICpiYW5rczsKIAl1bnNpZ25lZCBuYmFua3M7CiAJY29uc3Qgc3RydWN0IHN0bTMyX3BpbmN0cmxfbWF0Y2hfZGF0YSAqbWF0Y2hfZGF0YTsKKwlzdHJ1Y3QgaXJxX2RvbWFpbgkqZG9tYWluOworCXN0cnVjdCByZWdtYXAJCSpyZWdtYXA7CisJc3RydWN0IHJlZ21hcF9maWVsZAkqaXJxbXV4W1NUTTMyX0dQSU9fUElOU19QRVJfQkFOS107CiB9OwogCiBzdGF0aWMgaW5saW5lIGludCBzdG0zMl9ncGlvX3BpbihpbnQgZ3BpbykKQEAgLTE3NCwxNyArMTgzLDExMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCBzdG0zMl9ncGlvX3RlbXBsYXRlID0geworCitzdGF0aWMgaW50IHN0bTMyX2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IHN0bTMyX2dwaW9fYmFuayAqYmFuayA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCXN0cnVjdCBpcnFfZndzcGVjIGZ3c3BlYzsKKworCWZ3c3BlYy5md25vZGUgPSBiYW5rLT5md25vZGU7CisJZndzcGVjLnBhcmFtX2NvdW50ID0gMjsKKwlmd3NwZWMucGFyYW1bMF0gPSBvZmZzZXQ7CisJZndzcGVjLnBhcmFtWzFdID0gSVJRX1RZUEVfTk9ORTsKKworCXJldHVybiBpcnFfY3JlYXRlX2Z3c3BlY19tYXBwaW5nKCZmd3NwZWMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCBzdG0zMl9ncGlvX3RlbXBsYXRlID0gewogCS5yZXF1ZXN0CQk9IHN0bTMyX2dwaW9fcmVxdWVzdCwKIAkuZnJlZQkJCT0gc3RtMzJfZ3Bpb19mcmVlLAogCS5nZXQJCQk9IHN0bTMyX2dwaW9fZ2V0LAogCS5zZXQJCQk9IHN0bTMyX2dwaW9fc2V0LAogCS5kaXJlY3Rpb25faW5wdXQJPSBzdG0zMl9ncGlvX2RpcmVjdGlvbl9pbnB1dCwKIAkuZGlyZWN0aW9uX291dHB1dAk9IHN0bTMyX2dwaW9fZGlyZWN0aW9uX291dHB1dCwKKwkudG9faXJxCQkJPSBzdG0zMl9ncGlvX3RvX2lycSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3RtMzJfZ3Bpb19pcnFfY2hpcCA9IHsKKwkubmFtZSAgICAgICAgICAgPSAic3RtMzJncGlvIiwKKwkuaXJxX2VvaQk9IGlycV9jaGlwX2VvaV9wYXJlbnQsCisJLmlycV9tYXNrICAgICAgID0gaXJxX2NoaXBfbWFza19wYXJlbnQsCisJLmlycV91bm1hc2sgICAgID0gaXJxX2NoaXBfdW5tYXNrX3BhcmVudCwKKwkuaXJxX3NldF90eXBlICAgPSBpcnFfY2hpcF9zZXRfdHlwZV9wYXJlbnQsCit9OworCitzdGF0aWMgaW50IHN0bTMyX2dwaW9fZG9tYWluX3RyYW5zbGF0ZShzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwKKwkJCQkgICAgICAgc3RydWN0IGlycV9md3NwZWMgKmZ3c3BlYywKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqaHdpcnEsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqdHlwZSkKK3sKKwlpZiAoKGZ3c3BlYy0+cGFyYW1fY291bnQgIT0gMikgfHwKKwkgICAgKGZ3c3BlYy0+cGFyYW1bMF0gPj0gU1RNMzJfR1BJT19JUlFfTElORSkpCisJCXJldHVybiAtRUlOVkFMOworCisJKmh3aXJxID0gZndzcGVjLT5wYXJhbVswXTsKKwkqdHlwZSA9IGZ3c3BlYy0+cGFyYW1bMV07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0bTMyX2dwaW9fZG9tYWluX2FjdGl2YXRlKHN0cnVjdCBpcnFfZG9tYWluICpkLAorCQkJCSAgICAgICBzdHJ1Y3QgaXJxX2RhdGEgKmlycV9kYXRhKQoreworCXN0cnVjdCBzdG0zMl9ncGlvX2JhbmsgKmJhbmsgPSBkLT5ob3N0X2RhdGE7CisJc3RydWN0IHN0bTMyX3BpbmN0cmwgKnBjdGwgPSBkZXZfZ2V0X2RydmRhdGEoYmFuay0+Z3Bpb19jaGlwLnBhcmVudCk7CisKKwlyZWdtYXBfZmllbGRfd3JpdGUocGN0bC0+aXJxbXV4W2lycV9kYXRhLT5od2lycV0sIGJhbmstPnJhbmdlLmlkKTsKK30KKworc3RhdGljIGludCBzdG0zMl9ncGlvX2RvbWFpbl9hbGxvYyhzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdmlycSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgbnJfaXJxcywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3RtMzJfZ3Bpb19iYW5rICpiYW5rID0gZC0+aG9zdF9kYXRhOworCXN0cnVjdCBzdG0zMl9waW5jdHJsICpwY3RsID0gZGV2X2dldF9kcnZkYXRhKGJhbmstPmdwaW9fY2hpcC5wYXJlbnQpOworCXN0cnVjdCBpcnFfZndzcGVjICpmd3NwZWMgPSBkYXRhOworCXN0cnVjdCBpcnFfZndzcGVjIHBhcmVudF9md3NwZWM7CisJaXJxX2h3X251bWJlcl90IGh3aXJxOworCWludCByZXQ7CisKKwlod2lycSA9IGZ3c3BlYy0+cGFyYW1bMF07CisJcGFyZW50X2Z3c3BlYy5md25vZGUgPSBkLT5wYXJlbnQtPmZ3bm9kZTsKKwlwYXJlbnRfZndzcGVjLnBhcmFtX2NvdW50ID0gMjsKKwlwYXJlbnRfZndzcGVjLnBhcmFtWzBdID0gZndzcGVjLT5wYXJhbVswXTsKKwlwYXJlbnRfZndzcGVjLnBhcmFtWzFdID0gZndzcGVjLT5wYXJhbVsxXTsKKworCWlycV9kb21haW5fc2V0X2h3aXJxX2FuZF9jaGlwKGQsIHZpcnEsIGh3aXJxLCAmc3RtMzJfZ3Bpb19pcnFfY2hpcCwKKwkJCQkgICAgICBiYW5rKTsKKworCXJldCA9IGdwaW9jaGlwX2xvY2tfYXNfaXJxKCZiYW5rLT5ncGlvX2NoaXAsIGh3aXJxKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIocGN0bC0+ZGV2LCAiVW5hYmxlIHRvIGNvbmZpZ3VyZSBTVE0zMiAlcyVsZCBhcyBJUlFcbiIsCisJCQliYW5rLT5ncGlvX2NoaXAubGFiZWwsIGh3aXJxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBpcnFfZG9tYWluX2FsbG9jX2lycXNfcGFyZW50KGQsIHZpcnEsIG5yX2lycXMsICZwYXJlbnRfZndzcGVjKTsKKwlpZiAocmV0KQorCQlncGlvY2hpcF91bmxvY2tfYXNfaXJxKCZiYW5rLT5ncGlvX2NoaXAsIGh3aXJxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHN0bTMyX2dwaW9fZG9tYWluX2ZyZWUoc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGludCB2aXJxLAorCQkJCSAgIHVuc2lnbmVkIGludCBucl9pcnFzKQoreworCXN0cnVjdCBzdG0zMl9ncGlvX2JhbmsgKmJhbmsgPSBkLT5ob3N0X2RhdGE7CisJc3RydWN0IGlycV9kYXRhICpkYXRhID0gaXJxX2dldF9pcnFfZGF0YSh2aXJxKTsKKworCWlycV9kb21haW5fZnJlZV9pcnFzX2NvbW1vbihkLCB2aXJxLCBucl9pcnFzKTsKKwlncGlvY2hpcF91bmxvY2tfYXNfaXJxKCZiYW5rLT5ncGlvX2NoaXAsIGRhdGEtPmh3aXJxKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpcnFfZG9tYWluX29wcyBzdG0zMl9ncGlvX2RvbWFpbl9vcHMgPSB7CisJLnRyYW5zbGF0ZSAgICAgID0gc3RtMzJfZ3Bpb19kb21haW5fdHJhbnNsYXRlLAorCS5hbGxvYyAgICAgICAgICA9IHN0bTMyX2dwaW9fZG9tYWluX2FsbG9jLAorCS5mcmVlICAgICAgICAgICA9IHN0bTMyX2dwaW9fZG9tYWluX2ZyZWUsCisJLmFjdGl2YXRlCT0gc3RtMzJfZ3Bpb19kb21haW5fYWN0aXZhdGUsCiB9OwogCiAvKiBQaW5jdHJsIGZ1bmN0aW9ucyAqLwotCiBzdGF0aWMgc3RydWN0IHN0bTMyX3BpbmN0cmxfZ3JvdXAgKgogc3RtMzJfcGN0cmxfZmluZF9ncm91cF9ieV9waW4oc3RydWN0IHN0bTMyX3BpbmN0cmwgKnBjdGwsIHUzMiBwaW4pCiB7CkBAIC04NTcsNiArOTYyLDE3IEBACiAJcmFuZ2UtPnBpbl9iYXNlID0gcmFuZ2UtPmJhc2UgPSByYW5nZS0+aWQgKiBTVE0zMl9HUElPX1BJTlNfUEVSX0JBTks7CiAJcmFuZ2UtPm5waW5zID0gYmFuay0+Z3Bpb19jaGlwLm5ncGlvOwogCXJhbmdlLT5nYyA9ICZiYW5rLT5ncGlvX2NoaXA7CisKKwkvKiBjcmVhdGUgaXJxIGhpZXJhcmNoaWNhbCBkb21haW4gKi8KKwliYW5rLT5md25vZGUgPSBvZl9ub2RlX3RvX2Z3bm9kZShucCk7CisKKwliYW5rLT5kb21haW4gPSBpcnFfZG9tYWluX2NyZWF0ZV9oaWVyYXJjaHkocGN0bC0+ZG9tYWluLCAwLAorCQkJCQlTVE0zMl9HUElPX0lSUV9MSU5FLCBiYW5rLT5md25vZGUsCisJCQkJCSZzdG0zMl9ncGlvX2RvbWFpbl9vcHMsIGJhbmspOworCisJaWYgKCFiYW5rLT5kb21haW4pCisJCXJldHVybiAtRU5PREVWOworCiAJZXJyID0gZ3Bpb2NoaXBfYWRkX2RhdGEoJmJhbmstPmdwaW9fY2hpcCwgYmFuayk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBhZGQgZ3Bpb2NoaXAoJWQpIVxuIiwgYmFua19ucik7CkBAIC04NjcsNiArOTgzLDQ3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc3RtMzJfcGN0cmxfZHRfc2V0dXBfaXJxKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkgICBzdHJ1Y3Qgc3RtMzJfcGluY3RybCAqcGN0bCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGUsICpwYXJlbnQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgcmVnbWFwICpybTsKKwlpbnQgb2Zmc2V0LCByZXQsIGk7CisKKwlwYXJlbnQgPSBvZl9pcnFfZmluZF9wYXJlbnQobnApOworCWlmICghcGFyZW50KQorCQlyZXR1cm4gLUVOWElPOworCisJcGN0bC0+ZG9tYWluID0gaXJxX2ZpbmRfaG9zdChwYXJlbnQpOworCWlmICghcGN0bC0+ZG9tYWluKQorCQlyZXR1cm4gLUVOWElPOworCisJcGN0bC0+cmVnbWFwID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfcGhhbmRsZShucCwgInN0LHN5c2NmZyIpOworCWlmIChJU19FUlIocGN0bC0+cmVnbWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIocGN0bC0+cmVnbWFwKTsKKworCXJtID0gcGN0bC0+cmVnbWFwOworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgobnAsICJzdCxzeXNjZmciLCAxLCAmb2Zmc2V0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IFNUTTMyX0dQSU9fUElOU19QRVJfQkFOSzsgaSsrKSB7CisJCXN0cnVjdCByZWdfZmllbGQgbXV4OworCisJCW11eC5yZWcgPSBvZmZzZXQgKyAoaSAvIDQpICogNDsKKwkJbXV4LmxzYiA9IChpICUgNCkgKiA0OworCQltdXgubXNiID0gbXV4LmxzYiArIDM7CisKKwkJcGN0bC0+aXJxbXV4W2ldID0gZGV2bV9yZWdtYXBfZmllbGRfYWxsb2MoZGV2LCBybSwgbXV4KTsKKwkJaWYgKElTX0VSUihwY3RsLT5pcnFtdXhbaV0pKQorCQkJcmV0dXJuIFBUUl9FUlIocGN0bC0+aXJxbXV4W2ldKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBzdG0zMl9wY3RybF9idWlsZF9zdGF0ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzdG0zMl9waW5jdHJsICpwY3RsID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CkBAIC05MzUsNiArMTA5MiwxMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlyZXQgPSBzdG0zMl9wY3RybF9kdF9zZXR1cF9pcnEocGRldiwgcGN0bCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobnAsIGNoaWxkKQogCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGNoaWxkLCAiZ3Bpby1jb250cm9sbGVyIikpCiAJCQliYW5rcysrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL0tjb25maWcgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvS2NvbmZpZwppbmRleCBhYWYwNzViLi5iZmYxZmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvS2NvbmZpZworKysgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvS2NvbmZpZwpAQCAtMTcsNiArMTcsMTAgQEAKIAlkZWZfYm9vbCBNQUNIX1NVTjVJCiAJc2VsZWN0IFBJTkNUUkxfU1VOWEkKIAorY29uZmlnIFBJTkNUUkxfR1I4CisJZGVmX2Jvb2wgTUFDSF9TVU41SQorCXNlbGVjdCBQSU5DVFJMX1NVTlhJX0NPTU1PTgorCiBjb25maWcgUElOQ1RSTF9TVU42SV9BMzEKIAlkZWZfYm9vbCBNQUNIX1NVTjZJCiAJc2VsZWN0IFBJTkNUUkxfU1VOWEkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9NYWtlZmlsZSBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9NYWtlZmlsZQppbmRleCAyZDhiNjRlLi45NWY5M2QwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL01ha2VmaWxlCkBAIC01LDYgKzUsNyBAQAogb2JqLSQoQ09ORklHX1BJTkNUUkxfU1VONElfQTEwKQkJKz0gcGluY3RybC1zdW40aS1hMTAubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfU1VONUlfQTEwUykJKz0gcGluY3RybC1zdW41aS1hMTBzLm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1NVTjVJX0ExMykJCSs9IHBpbmN0cmwtc3VuNWktYTEzLm8KK29iai0kKENPTkZJR19QSU5DVFJMX0dSOCkJCSs9IHBpbmN0cmwtZ3I4Lm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1NVTjZJX0EzMSkJCSs9IHBpbmN0cmwtc3VuNmktYTMxLm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1NVTjZJX0EzMVMpCSs9IHBpbmN0cmwtc3VuNmktYTMxcy5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9TVU42SV9BMzFfUikJKz0gcGluY3RybC1zdW42aS1hMzEtci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1ncjguYyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLWdyOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDRkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1ncjguYwpAQCAtMCwwICsxLDU0MSBAQAorLyoKKyAqIE5leHRUaGluZyBHUjggU29DcyBwaW5jdHJsIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTXlsZW5lIEpvc3NlcmFuZAorICoKKyAqIEJhc2VkIG9uIHBpbmN0cmwtc3VuNWktYTEzLmMKKyAqCisgKiBNeWxlbmUgSm9zc2VyYW5kIDxteWxlbmUuam9zc2VyYW5kQGZyZWUtZWxlY3Ryb25zLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmN0cmwuaD4KKworI2luY2x1ZGUgInBpbmN0cmwtc3VueGkuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdW54aV9kZXNjX3BpbiBzdW41aV9ncjhfcGluc1tdID0geworCS8qIEhvbGUgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQiwgMCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAiaTJjMCIpKSwJCS8qIFNDSyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCAxKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJpMmMwIikpLAkJLyogU0RBICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInB3bTAiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJzcGRpZiIpLAkJLyogRE8gKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAxNikpLAkJLyogRUlOVDE2ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDMpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImlyMCIpLAkJLyogVFggKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAxNykpLAkJLyogRUlOVDE3ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDQpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImlyMCIpLAkJLyogUlggKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAxOCkpLAkJLyogRUlOVDE4ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDUpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImkyczAiKSwJCS8qIE1DTEsgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAxOSkpLAkJLyogRUlOVDE5ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDYpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImkyczAiKSwJCS8qIEJDTEsgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAyMCkpLAkJLyogRUlOVDIwICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDcpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImkyczAiKSwJCS8qIExSQ0sgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAyMSkpLAkJLyogRUlOVDIxICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDgpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImkyczAiKSwJCS8qIERPICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMjIpKSwJCS8qIEVJTlQyMiAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCA5KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJpMnMwIiksCQkvKiBESSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInNwZGlmIiksCQkvKiBESSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDIzKSksCQkvKiBFSU5UMjMgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQiwgMTApLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInNwaTIiKSwJCS8qIENTMSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInNwZGlmIiksCQkvKiBETyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDI0KSksCQkvKiBFSU5UMjQgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQiwgMTEpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInNwaTIiKSwJCS8qIENTMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImp0YWciKSwJCS8qIE1TMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDI1KSksCQkvKiBFSU5UMjUgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQiwgMTIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInNwaTIiKSwJCS8qIENMSyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImp0YWciKSwJCS8qIENLMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDI2KSksCQkvKiBFSU5UMjYgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQiwgMTMpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInNwaTIiKSwJCS8qIE1PU0kgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJqdGFnIiksCQkvKiBETzAgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAyNykpLAkJLyogRUlOVDI3ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDE0KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJzcGkyIiksCQkvKiBNSVNPICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAianRhZyIpLAkJLyogREkwICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMjgpKSwJCS8qIEVJTlQyOCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCAxNSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAiaTJjMSIpKSwJCS8qIFNDSyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCAxNiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAiaTJjMSIpKSwJCS8qIFNEQSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCAxNyksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAiaTJjMiIpKSwJCS8qIFNDSyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCAxOCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAiaTJjMiIpKSwJCS8qIFNEQSAqLworCS8qIEhvbGUgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQywgMCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSwJCS8qIE5XRSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInNwaTAiKSksCQkvKiBNT1NJICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDEpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm5hbmQwIiksCQkvKiBOQUxFICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAic3BpMCIpKSwJCS8qIE1JU08gKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQywgMiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSwJCS8qIE5DTEUgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJzcGkwIikpLAkJLyogQ0xLICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDMpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm5hbmQwIiksCQkvKiBOQ0UxICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAic3BpMCIpKSwJCS8qIENTMCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihDLCA0KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJuYW5kMCIpKSwJLyogTkNFMCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihDLCA1KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJuYW5kMCIpKSwJLyogTlJFICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDYpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm5hbmQwIiksCQkvKiBOUkIwICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibW1jMiIpKSwJCS8qIENNRCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihDLCA3KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJuYW5kMCIpLAkJLyogTlJCMSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgIm1tYzIiKSksCQkvKiBDTEsgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQywgOCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSwJCS8qIE5EUTAgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJtbWMyIikpLAkJLyogRDAgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQywgOSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSwJCS8qIE5EUTEgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJtbWMyIikpLAkJLyogRDEgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQywgMTApLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm5hbmQwIiksCQkvKiBORFEyICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibW1jMiIpKSwJCS8qIEQyICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDExKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJuYW5kMCIpLAkJLyogTkRRMyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgIm1tYzIiKSksCQkvKiBEMyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihDLCAxMiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSwJCS8qIE5EUTQgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJtbWMyIikpLAkJLyogRDQgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQywgMTMpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm5hbmQwIiksCQkvKiBORFE1ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibW1jMiIpKSwJCS8qIEQ1ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDE0KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJuYW5kMCIpLAkJLyogTkRRNiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgIm1tYzIiKSksCQkvKiBENiAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihDLCAxNSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSwJCS8qIE5EUTcgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJtbWMyIikpLAkJLyogRDcgKi8KKwkvKiBIb2xlICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDE5KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJuYW5kMCIpLAkJLyogTkRRUyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInVhcnQyIiksCQkvKiBSWCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgInVhcnQzIikpLAkvKiBSVFMgKi8KKwkvKiBIb2xlICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIEQyICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAidWFydDIiKSksCS8qIFRYICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDMpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIEQzICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAidWFydDIiKSksCS8qIFJYICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDQpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIEQ0ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAidWFydDIiKSksCS8qIENUUyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCA1KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBENSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInVhcnQyIikpLAkvKiBSVFMgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgNiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogRDYgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRUNSUyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCA3KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBENyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImVtYWMiKSksCQkvKiBFQ09MICovCisJLyogSG9sZSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAxMCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogRDEwICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiZW1hYyIpKSwJCS8qIEVSWEQwICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDExKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBEMTEgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRVJYRDEgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgMTIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIEQxMiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImVtYWMiKSksCQkvKiBFUlhEMiAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAxMyksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogRDEzICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiZW1hYyIpKSwJCS8qIEVSWEQzICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDE0KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBEMTQgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRVJYQ0sgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgMTUpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIEQxNSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImVtYWMiKSksCQkvKiBFUlhFUlIgKi8KKwkvKiBIb2xlICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDE4KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBEMTggKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRVJYRFYgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgMTkpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIEQxOSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImVtYWMiKSksCQkvKiBFVFhEMCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAyMCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogRDIwICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiZW1hYyIpKSwJCS8qIEVUWEQxICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDIxKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBEMjEgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRVRYRDIgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgMjIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIEQyMiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImVtYWMiKSksCQkvKiBFVFhEMyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAyMyksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogRDIzICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiZW1hYyIpKSwJCS8qIEVUWEVOICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDI0KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBDTEsgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRVRYQ0sgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgMjUpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIERFICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiZW1hYyIpKSwJCS8qIEVUWEVSUiovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDI2KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBIU1lOQyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImVtYWMiKSksCQkvKiBFTURDICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDI3KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBWU1lOQyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImVtYWMiKSksCQkvKiBFTURJTyAqLworCS8qIEhvbGUgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRSwgMCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInRzMCIpLAkJLyogQ0xLICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiY3NpMCIpLAkJLyogUENMSyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgInNwaTIiKSwJCS8qIENTMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDE0KSksCQkvKiBFSU5UMTQgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRSwgMSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInRzMCIpLAkJLyogRVJSICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiY3NpMCIpLAkJLyogTUNMSyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgInNwaTIiKSwJCS8qIENMSyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDE1KSksCQkvKiBFSU5UMTUgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRSwgMiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInRzMCIpLAkJLyogU1lOQyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImNzaTAiKSwJCS8qIEhTWU5DICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAic3BpMiIpKSwJCS8qIE1PU0kgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRSwgMyksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAidHMwIiksCQkvKiBEVkxEICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiY3NpMCIpLAkJLyogVlNZTkMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJzcGkyIikpLAkJLyogTUlTTyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihFLCA0KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ0czAiKSwJCS8qIEQwICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiY3NpMCIpLAkJLyogRDAgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJtbWMyIikpLAkJLyogRDAgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRSwgNSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAidHMwIiksCQkvKiBEMSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImNzaTAiKSwJCS8qIEQxICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAibW1jMiIpKSwJCS8qIEQxICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEUsIDYpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInRzMCIpLAkJLyogRDIgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJjc2kwIiksCQkvKiBEMiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgIm1tYzIiKSksCQkvKiBEMiAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihFLCA3KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ0czAiKSwJCS8qIEQzICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiY3NpMCIpLAkJLyogRDMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJtbWMyIikpLAkJLyogRDMgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRSwgOCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAidHMwIiksCQkvKiBENCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImNzaTAiKSwJCS8qIEQ0ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAibW1jMiIpKSwJCS8qIENNRCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihFLCA5KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ0czAiKSwJCS8qIEQ1ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiY3NpMCIpLAkJLyogRDUgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJtbWMyIikpLAkJLyogQ0xLICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEUsIDEwKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ0czAiKSwJCS8qIEQ2ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiY3NpMCIpLAkJLyogRDYgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJ1YXJ0MSIpKSwJLyogVFggKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRSwgMTEpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInRzMCIpLAkJLyogRDcgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJjc2kwIiksCQkvKiBENyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgInVhcnQxIikpLAkvKiBSWCAqLworCS8qIEhvbGUgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRiwgMCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMCIpLAkJLyogRDEgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJqdGFnIikpLAkJLyogTVMxICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEYsIDEpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzAiKSwJCS8qIEQwICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAianRhZyIpKSwJCS8qIERJMSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihGLCAyKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJtbWMwIiksCQkvKiBDTEsgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJ1YXJ0MCIpKSwJLyogVFggKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRiwgMyksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMCIpLAkJLyogQ01EICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAianRhZyIpKSwJCS8qIERPMSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihGLCA0KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJtbWMwIiksCQkvKiBEMyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgInVhcnQwIikpLAkvKiBSWCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihGLCA1KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJtbWMwIiksCQkvKiBEMiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgImp0YWciKSksCQkvKiBDSzEgKi8KKwkvKiBIb2xlICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDApLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJncHMiKSwJCS8qIENMSyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDApKSwJCS8qIEVJTlQwICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDEpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJncHMiKSwJCS8qIFNJR04gKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAxKSksCQkvKiBFSU5UMSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCAyKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAiZ3BzIiksCQkvKiBNQUcgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAyKSksCQkvKiBFSU5UMiAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCAzKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJtbWMxIiksCQkvKiBDTUQgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJtcyIpLAkJLyogQlMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJ1YXJ0MSIpLAkJLyogVFggKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAzKSksCQkvKiBFSU5UMyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCA0KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJtbWMxIiksCQkvKiBDTEsgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJtcyIpLAkJLyogQ0xLICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAidWFydDEiKSwJCS8qIFJYICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgNCkpLAkJLyogRUlOVDQgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgNSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMSIpLAkJLyogRDAgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJtcyIpLAkJLyogRDAgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJ1YXJ0MSIpLAkJLyogQ1RTICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgNSkpLAkJLyogRUlOVDUgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgNiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMSIpLAkJLyogRDEgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJtcyIpLAkJLyogRDEgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJ1YXJ0MSIpLAkJLyogUlRTICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg1LCAidWFydDIiKSwJCS8qIFJUUyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDYpKSwJCS8qIEVJTlQ2ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDcpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzEiKSwJCS8qIEQyICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibXMiKSwJCS8qIEQyICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg1LCAidWFydDIiKSwJCS8qIFRYICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgNykpLAkJLyogRUlOVDcgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgOCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMSIpLAkJLyogRDMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJtcyIpLAkJLyogRDMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDUsICJ1YXJ0MiIpLAkJLyogUlggKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCA4KSksCQkvKiBFSU5UOCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCA5KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJzcGkxIiksCQkvKiBDUzAgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJ1YXJ0MyIpLAkJLyogVFggKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCA5KSksCQkvKiBFSU5UOSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCAxMCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAic3BpMSIpLAkJLyogQ0xLICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAidWFydDMiKSwJCS8qIFJYICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMTApKSwJCS8qIEVJTlQxMCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCAxMSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAic3BpMSIpLAkJLyogTU9TSSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInVhcnQzIiksCQkvKiBDVFMgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAxMSkpLAkJLyogRUlOVDExICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDEyKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJzcGkxIiksCQkvKiBNSVNPICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAidWFydDMiKSwJCS8qIFJUUyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDEyKSksCQkvKiBFSU5UMTIgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgMTMpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInNwaTEiKSwJCS8qIENTMSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInB3bTEiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDUsICJ1YXJ0MiIpLAkJLyogQ1RTICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMTMpKSwJCS8qIEVJTlQxMyAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdW54aV9waW5jdHJsX2Rlc2Mgc3VuNWlfZ3I4X3BpbmN0cmxfZGF0YSA9IHsKKwkucGlucyA9IHN1bjVpX2dyOF9waW5zLAorCS5ucGlucyA9IEFSUkFZX1NJWkUoc3VuNWlfZ3I4X3BpbnMpLAorCS5pcnFfYmFua3MgPSAxLAorfTsKKworc3RhdGljIGludCBzdW41aV9ncjhfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBzdW54aV9waW5jdHJsX2luaXQocGRldiwKKwkJCQkgICZzdW41aV9ncjhfcGluY3RybF9kYXRhKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNWlfZ3I4X3BpbmN0cmxfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm5leHR0aGluZyxncjgtcGluY3RybCIsIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzdW41aV9ncjhfcGluY3RybF9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN1bjVpX2dyOF9waW5jdHJsX2RyaXZlciA9IHsKKwkucHJvYmUJPSBzdW41aV9ncjhfcGluY3RybF9wcm9iZSwKKwkuZHJpdmVyCT0geworCQkubmFtZQkJPSAiZ3I4LXBpbmN0cmwiLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBzdW41aV9ncjhfcGluY3RybF9tYXRjaCwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3VuNWlfZ3I4X3BpbmN0cmxfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiTXlsZW5lIEpvc3NlcmFuZCA8bXlsZW5lLmpvc3NlcmFuZEBmcmVlLWVsZWN0cm9ucy5jb20iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTmV4dFRoaW5nIEdSOCBwaW5jdHJsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuNmktYTMxLmMgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW42aS1hMzEuYwppbmRleCAwMjI4NjNhLi5hNzBiNTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW42aS1hMzEuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW42aS1hMzEuYwpAQCAtODk2LDEwICs4OTYsMTggQEAKIAkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpKSwKIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oSCwgMjcpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKLQkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkvKgorCQkgKiBUaGUgU1BESUYgYmxvY2sgaXMgbm90IHJlZmVyZW5jZWQgYXQgYWxsIGluIHRoZSBBMzEgdXNlcgorCQkgKiBtYW51YWwuIEhvd2V2ZXIgaXQgaXMgZGVzY3JpYmVkIGluIHRoZSBjb2RlIGxlYWtlZCBhbmQgdGhlCisJCSAqIGNvbmZpZ3VyYXRpb24gZmlsZXMgc3VwcGxpZWQgYnkgdmVuZG9ycy4KKwkJICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAic3BkaWYiKSksICAgICAgICAvKiBTUERJRiBJTiAqLwogCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihILCAyOCksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAotCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IikpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCS8qIFVuZG9jdW1lbnRlZCBtdXggZnVuY3Rpb24gLSBzZWUgYWJvdmUgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJzcGRpZiIpKSwgICAgICAgIC8qIFNQRElGIE9VVCAqLwogCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihILCAyOSksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW44aS1hMjMuYyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjhpLWEyMy5jCmluZGV4IGNlNDgzYjAuLmY5ZDY2MWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW44aS1hMjMuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW44aS1hMjMuYwpAQCAtNDg1LDEyICs0ODUsMTIgQEAKIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgOCksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCi0JCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAidWFydDIiKSwJCS8qIFJUUyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInVhcnQxIiksCQkvKiBSVFMgKi8KIAkJICBTVU5YSV9GVU5DVElPTl9JUlFfQkFOSygweDQsIDIsIDgpKSwJLyogUEdfRUlOVDggKi8KIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgOSksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCi0JCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAidWFydDIiKSwJCS8qIENUUyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInVhcnQxIiksCQkvKiBDVFMgKi8KIAkJICBTVU5YSV9GVU5DVElPTl9JUlFfQkFOSygweDQsIDIsIDkpKSwJLyogUEdfRUlOVDkgKi8KIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgMTApLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjhpLWEzMy5jIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOGktYTMzLmMKaW5kZXggMzA0MGFiZS4uMzEzMWNhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOGktYTMzLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOGktYTMzLmMKQEAgLTQwNywxMiArNDA3LDEyIEBACiAJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDgpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAotCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInVhcnQyIiksCQkvKiBSVFMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ1YXJ0MSIpLAkJLyogUlRTICovCiAJCSAgU1VOWElfRlVOQ1RJT05fSVJRX0JBTksoMHg0LCAxLCA4KSksCS8qIFBHX0VJTlQ4ICovCiAJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDkpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAotCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInVhcnQyIiksCQkvKiBDVFMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ1YXJ0MSIpLAkJLyogQ1RTICovCiAJCSAgU1VOWElfRlVOQ1RJT05fSVJRX0JBTksoMHg0LCAxLCA5KSksCS8qIFBHX0VJTlQ5ICovCiAJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDEwKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW44aS1oMy5jIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOGktaDMuYwppbmRleCAyNmEyYWQzLi41MThhOTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW44aS1oMy5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjhpLWgzLmMKQEAgLTYwLDcgKzYwLDYgQEAKIAkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDIsICJzaW0iKSwJCS8qIFBXUkVOICovCi0JCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAicHdtMSIpLAogCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUV9CQU5LKDB4NiwgMCwgNikpLAkvKiBQQV9FSU5UNiAqLwogCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihBLCA3KSwKIAkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW54aS5jIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VueGkuYwppbmRleCA1NDQ1NWFmLi4wZmFjYmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW54aS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bnhpLmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlICIuLi9jb3JlLmgiCi0jaW5jbHVkZSAiLi4vLi4vZ3Bpby9ncGlvbGliLmgiCiAjaW5jbHVkZSAicGluY3RybC1zdW54aS5oIgogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHN1bnhpX3BpbmN0cmxfZWRnZV9pcnFfY2hpcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vb2xwYy9vbHBjLWVjLmMgYi9kcml2ZXJzL3BsYXRmb3JtL29scGMvb2xwYy1lYy5jCmluZGV4IGY5OWIxODMuLjM3NGE4MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vb2xwYy9vbHBjLWVjLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS9vbHBjL29scGMtZWMuYwpAQCAtMSw2ICsxLDggQEAKIC8qCiAgKiBHZW5lcmljIGRyaXZlciBmb3IgdGhlIE9MUEMgRW1iZWRkZWQgQ29udHJvbGxlci4KICAqCisgKiBBdXRob3I6IEFuZHJlcyBTYWxvbW9uIDxkaWxpbmdlckBxdWV1ZWQubmV0PgorICoKICAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIE9uZSBMYXB0b3AgcGVyIENoaWxkIEZvdW5kYXRpb24uCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2MiBvciBsYXRlci4KQEAgLTEyLDcgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9vbHBjLWVjLmg+CiAjaW5jbHVkZSA8YXNtL29scGMuaD4KQEAgLTMyNiw4ICszMjgsNCBAQAogewogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9scGNfZWNfcGxhdF9kcml2ZXIpOwogfQotCiBhcmNoX2luaXRjYWxsKG9scGNfZWNfaW5pdF9tb2R1bGUpOwotCi1NT0RVTEVfQVVUSE9SKCJBbmRyZXMgU2Fsb21vbiA8ZGlsaW5nZXJAcXVldWVkLm5ldD4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3BtY19pcGMuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3BtY19pcGMuYwppbmRleCBiODZlMWJjLi5hNTExZDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9wbWNfaXBjLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfcG1jX2lwYy5jCkBAIC02NTEsMTEgKzY1MSwxNSBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSBpcGNfY3JlYXRlX3Rjb19kZXZpY2UoKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoaXBjZGV2LmRldiwgIkZhaWxlZCB0byBhZGQgdGNvIHBsYXRmb3JtIGRldmljZVxuIik7Ci0JCXJldHVybiByZXQ7CisJLyogSWYgd2UgaGF2ZSBBQ1BJIGJhc2VkIHdhdGNoZG9nIHVzZSB0aGF0IGluc3RlYWQgKi8KKwlpZiAoIWFjcGlfaGFzX3dhdGNoZG9nKCkpIHsKKwkJcmV0ID0gaXBjX2NyZWF0ZV90Y29fZGV2aWNlKCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoaXBjZGV2LmRldiwgIkZhaWxlZCB0byBhZGQgdGNvIHBsYXRmb3JtIGRldmljZVxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfQorCiAJcmV0ID0gaXBjX2NyZWF0ZV9wdW5pdF9kZXZpY2UoKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoaXBjZGV2LmRldiwgIkZhaWxlZCB0byBhZGQgcHVuaXQgcGxhdGZvcm0gZGV2aWNlXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3BtaWNfZ3Bpby5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfcG1pY19ncGlvLmMKaW5kZXggNjNiMzcxZC4uOTFhZTU4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfcG1pY19ncGlvLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfcG1pY19ncGlvLmMKQEAgLTEsNiArMSw4IEBACiAvKiBNb29yZXN0b3duIFBNSUMgR1BJTyAoYWNjZXNzIHRocm91Z2ggSVBDKSBkcml2ZXIKICAqIENvcHlyaWdodCAoYykgMjAwOCAtIDIwMDksIEludGVsIENvcnBvcmF0aW9uLgogICoKKyAqIEF1dGhvcjogQWxlayBEdSA8YWxlay5kdUBpbnRlbC5jb20+CisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KQEAgLTIxLDcgKzIzLDYgQEAKIAogI2RlZmluZSBwcl9mbXQoZm10KSAiJXM6ICIgZm10LCBfX2Z1bmNfXwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTMyMiw5ICszMjMsNCBAQAogewogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBsYXRmb3JtX3BtaWNfZ3Bpb19kcml2ZXIpOwogfQotCiBzdWJzeXNfaW5pdGNhbGwocGxhdGZvcm1fcG1pY19ncGlvX2luaXQpOwotCi1NT0RVTEVfQVVUSE9SKCJBbGVrIER1IDxhbGVrLmR1QGludGVsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgTW9vcmVzdG93biBQTUlDIEdQSU8gZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9pc2FwbnAvY29yZS5jIGIvZHJpdmVycy9wbnAvaXNhcG5wL2NvcmUuYwppbmRleCBjZjg4ZjliNi4uZDhiZjVhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvaXNhcG5wL2NvcmUuYworKysgYi9kcml2ZXJzL3BucC9pc2FwbnAvY29yZS5jCkBAIC0zNCw3ICszNCw3IEBACiAgKiAgMjAwMy0wOC0xMQlSZXNvdXJjZSBNYW5hZ2VtZW50IFVwZGF0ZXMgLSBBZGFtIEJlbGF5IDxhbWJ4MUBuZW8ucnIuY29tPgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTU0LDggKzU0LDYgQEAKIHN0YXRpYyBpbnQgaXNhcG5wX3Jlc2V0ID0gMTsJLyogcmVzZXQgYWxsIFBuUCBjYXJkcyAoZGVhY3RpdmF0ZSkgKi8KIHN0YXRpYyBpbnQgaXNhcG5wX3ZlcmJvc2UgPSAxOwkvKiB2ZXJib3NlIG1vZGUgKi8KIAotTU9EVUxFX0FVVEhPUigiSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiR2VuZXJpYyBJU0EgUGx1ZyAmIFBsYXkgc3VwcG9ydCIpOwogbW9kdWxlX3BhcmFtKGlzYXBucF9kaXNhYmxlLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhpc2FwbnBfZGlzYWJsZSwgIklTQSBQbHVnICYgUGxheSBkaXNhYmxlIik7CiBtb2R1bGVfcGFyYW0oaXNhcG5wX3JkcCwgaW50LCAwKTsKQEAgLTY0LDcgKzYyLDYgQEAKIE1PRFVMRV9QQVJNX0RFU0MoaXNhcG5wX3Jlc2V0LCAiSVNBIFBsdWcgJiBQbGF5IHJlc2V0IGFsbCBjYXJkcyIpOwogbW9kdWxlX3BhcmFtKGlzYXBucF92ZXJib3NlLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhpc2FwbnBfdmVyYm9zZSwgIklTQSBQbHVnICYgUGxheSB2ZXJib3NlIG1vZGUiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogI2RlZmluZSBfUElEWFIJCTB4Mjc5CiAjZGVmaW5lIF9QTlBXUlAJCTB4YTc5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2F2cy9zbWFydHJlZmxleC5jIGIvZHJpdmVycy9wb3dlci9hdnMvc21hcnRyZWZsZXguYwppbmRleCBkYjk5NzNiLi5mYTBmMTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2F2cy9zbWFydHJlZmxleC5jCisrKyBiL2RyaXZlcnMvcG93ZXIvYXZzL3NtYXJ0cmVmbGV4LmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogCiAJaWYgKElTX0VSUihmY2spKSB7CiAJCWRldl9lcnIoJnNyLT5wZGV2LT5kZXYsICIlczogdW5hYmxlIHRvIGdldCBmY2sgZm9yIGRldmljZSAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgZGV2X25hbWUoJnNyLT5wZGV2LT5kZXYpKTsKKwkJCV9fZnVuY19fLCBkZXZfbmFtZSgmc3ItPnBkZXYtPmRldikpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNzAsOCArMTcwLDggQEAKIHsKIAlpZiAoIXNyX2NsYXNzIHx8ICEoc3JfY2xhc3MtPmVuYWJsZSkgfHwgIShzcl9jbGFzcy0+Y29uZmlndXJlKSkgewogCQlkZXZfd2Fybigmc3ItPnBkZXYtPmRldiwKLQkJCSIlczogc21hcnRyZWZsZXggY2xhc3MgZHJpdmVyIG5vdCByZWdpc3RlcmVkXG4iLAotCQkJX19mdW5jX18pOworCQkJICIlczogc21hcnRyZWZsZXggY2xhc3MgZHJpdmVyIG5vdCByZWdpc3RlcmVkXG4iLAorCQkJIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTgzLDggKzE4Myw4IEBACiB7CiAJaWYgKCFzcl9jbGFzcyB8fCAhKHNyX2NsYXNzLT5kaXNhYmxlKSkgewogCQlkZXZfd2Fybigmc3ItPnBkZXYtPmRldiwKLQkJCSIlczogc21hcnRyZWZsZXggY2xhc3MgZHJpdmVyIG5vdCByZWdpc3RlcmVkXG4iLAotCQkJX19mdW5jX18pOworCQkJICIlczogc21hcnRyZWZsZXggY2xhc3MgZHJpdmVyIG5vdCByZWdpc3RlcmVkXG4iLAorCQkJIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjI1LDkgKzIyNSw4IEBACiAKIGVycm9yOgogCWxpc3RfZGVsKCZzcl9pbmZvLT5ub2RlKTsKLQlkZXZfZXJyKCZzcl9pbmZvLT5wZGV2LT5kZXYsICIlczogRVJST1IgaW4gcmVnaXN0ZXJpbmciCi0JCSJpbnRlcnJ1cHQgaGFuZGxlci4gU21hcnRyZWZsZXggd2lsbCIKLQkJIm5vdCBmdW5jdGlvbiBhcyBkZXNpcmVkXG4iLCBfX2Z1bmNfXyk7CisJZGV2X2Vycigmc3JfaW5mby0+cGRldi0+ZGV2LCAiJXM6IEVSUk9SIGluIHJlZ2lzdGVyaW5nIGludGVycnVwdCBoYW5kbGVyLiBTbWFydHJlZmxleCB3aWxsIG5vdCBmdW5jdGlvbiBhcyBkZXNpcmVkXG4iLAorCQlfX2Z1bmNfXyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjYzLDcgKzI2Miw3IEBACiAKIAlpZiAodGltZW91dCA+PSBTUl9ESVNBQkxFX1RJTUVPVVQpCiAJCWRldl93YXJuKCZzci0+cGRldi0+ZGV2LCAiJXM6IFNtYXJ0cmVmbGV4IGRpc2FibGUgdGltZWRvdXRcbiIsCi0JCQlfX2Z1bmNfXyk7CisJCQkgX19mdW5jX18pOwogCiAJLyogRGlzYWJsZSBNQ1VEaXNhYmxlQWNrbm93bGVkZ2UgaW50ZXJydXB0ICYgY2xlYXIgcGVuZGluZyBpbnRlcnJ1cHQgKi8KIAlzcl9tb2RpZnlfcmVnKHNyLCBFUlJDT05GSUdfVjEsIEVSUkNPTkZJR19NQ1VESVNBQ0tJTlRFTiwKQEAgLTMwOCw3ICszMDcsNyBAQAogCiAJaWYgKHRpbWVvdXQgPj0gU1JfRElTQUJMRV9USU1FT1VUKQogCQlkZXZfd2Fybigmc3ItPnBkZXYtPmRldiwgIiVzOiBTbWFydHJlZmxleCBkaXNhYmxlIHRpbWVkb3V0XG4iLAotCQkJX19mdW5jX18pOworCQkJIF9fZnVuY19fKTsKIAogCS8qIERpc2FibGUgTUNVRGlzYWJsZUFja25vd2xlZGdlIGludGVycnVwdCAmIGNsZWFyIHBlbmRpbmcgaW50ZXJydXB0ICovCiAJc3Jfd3JpdGVfcmVnKHNyLCBJUlFFTkFCTEVfQ0xSLCBJUlFFTkFCTEVfTUNVRElTQUJMRUFDS0lOVCk7CkBAIC0zMjIsNyArMzIxLDcgQEAKIAogCWlmICghc3ItPm52YWx1ZV90YWJsZSkgewogCQlkZXZfd2Fybigmc3ItPnBkZXYtPmRldiwgIiVzOiBNaXNzaW5nIG50YXJnZXQgdmFsdWUgdGFibGVcbiIsCi0JCQlfX2Z1bmNfXyk7CisJCQkgX19mdW5jX18pOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTM1Niw4ICszNTUsOCBAQAogCXU4IHNlbnBfc2hpZnQsIHNlbm5fc2hpZnQ7CiAKIAlpZiAoIXNyKSB7Ci0JCXByX3dhcm4oIiVzOiBOVUxMIG9tYXBfc3IgZnJvbSAlcEZcbiIsIF9fZnVuY19fLAotCQkJKHZvaWQgKilfUkVUX0lQXyk7CisJCXByX3dhcm4oIiVzOiBOVUxMIG9tYXBfc3IgZnJvbSAlcEZcbiIsCisJCQlfX2Z1bmNfXywgKHZvaWQgKilfUkVUX0lQXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMzg3LDggKzM4Niw4IEBACiAJCXZwYm91bmRpbnRfc3QgPSBFUlJDT05GSUdfVlBCT1VORElOVFNUX1YyOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKCZzci0+cGRldi0+ZGV2LCAiJXM6IFRyeWluZyB0byBDb25maWd1cmUgc21hcnRyZWZsZXgiCi0JCQkibW9kdWxlIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgaXBcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2Vycigmc3ItPnBkZXYtPmRldiwgIiVzOiBUcnlpbmcgdG8gQ29uZmlndXJlIHNtYXJ0cmVmbGV4IG1vZHVsZSB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIGlwXG4iLAorCQkJX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTQyMyw4ICs0MjIsOCBAQAogCXUzMiB2cGJvdW5kaW50X2VuLCB2cGJvdW5kaW50X3N0OwogCiAJaWYgKCFzcikgewotCQlwcl93YXJuKCIlczogTlVMTCBvbWFwX3NyIGZyb20gJXBGXG4iLCBfX2Z1bmNfXywKLQkJCSh2b2lkICopX1JFVF9JUF8pOworCQlwcl93YXJuKCIlczogTlVMTCBvbWFwX3NyIGZyb20gJXBGXG4iLAorCQkJX19mdW5jX18sICh2b2lkICopX1JFVF9JUF8pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTQ0MCw4ICs0MzksOCBAQAogCQl2cGJvdW5kaW50X3N0ID0gRVJSQ09ORklHX1ZQQk9VTkRJTlRTVF9WMjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2Vycigmc3ItPnBkZXYtPmRldiwgIiVzOiBUcnlpbmcgdG8gQ29uZmlndXJlIHNtYXJ0cmVmbGV4IgotCQkJIm1vZHVsZSB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIGlwXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9lcnIoJnNyLT5wZGV2LT5kZXYsICIlczogVHJ5aW5nIHRvIENvbmZpZ3VyZSBzbWFydHJlZmxleCBtb2R1bGUgd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBpcFxuIiwKKwkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00NzgsOCArNDc3LDggQEAKIAl1OCBzZW5wX3NoaWZ0LCBzZW5uX3NoaWZ0OwogCiAJaWYgKCFzcikgewotCQlwcl93YXJuKCIlczogTlVMTCBvbWFwX3NyIGZyb20gJXBGXG4iLCBfX2Z1bmNfXywKLQkJCSh2b2lkICopX1JFVF9JUF8pOworCQlwcl93YXJuKCIlczogTlVMTCBvbWFwX3NyIGZyb20gJXBGXG4iLAorCQkJX19mdW5jX18sICh2b2lkICopX1JFVF9JUF8pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTUwNCw4ICs1MDMsOCBAQAogCQlzZW5wX3NoaWZ0ID0gU1JDT05GSUdfU0VOUEVOQUJMRV9WMl9TSElGVDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2Vycigmc3ItPnBkZXYtPmRldiwgIiVzOiBUcnlpbmcgdG8gQ29uZmlndXJlIHNtYXJ0cmVmbGV4IgotCQkJIm1vZHVsZSB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIGlwXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9lcnIoJnNyLT5wZGV2LT5kZXYsICIlczogVHJ5aW5nIHRvIENvbmZpZ3VyZSBzbWFydHJlZmxleCBtb2R1bGUgd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBpcFxuIiwKKwkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01MzcsOCArNTM2LDggQEAKIAkJCUlSUUVOQUJMRV9NQ1VCT1VORFNJTlQgfCBJUlFFTkFCTEVfTUNVRElTQUJMRUFDS0lOVCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJnNyLT5wZGV2LT5kZXYsICIlczogVHJ5aW5nIHRvIENvbmZpZ3VyZSBzbWFydHJlZmxleCIKLQkJCSJtb2R1bGUgd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBpcFxuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKCZzci0+cGRldi0+ZGV2LCAiJXM6IFRyeWluZyB0byBDb25maWd1cmUgc21hcnRyZWZsZXggbW9kdWxlIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgaXBcbiIsCisJCQlfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNTYzLDE2ICs1NjIsMTYgQEAKIAlpbnQgcmV0OwogCiAJaWYgKCFzcikgewotCQlwcl93YXJuKCIlczogTlVMTCBvbWFwX3NyIGZyb20gJXBGXG4iLCBfX2Z1bmNfXywKLQkJCSh2b2lkICopX1JFVF9JUF8pOworCQlwcl93YXJuKCIlczogTlVMTCBvbWFwX3NyIGZyb20gJXBGXG4iLAorCQkJX19mdW5jX18sICh2b2lkICopX1JFVF9JUF8pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAl2b2x0X2RhdGEgPSBvbWFwX3ZvbHRhZ2VfZ2V0X3ZvbHRkYXRhKHNyLT52b2x0ZG0sIHZvbHQpOwogCiAJaWYgKElTX0VSUih2b2x0X2RhdGEpKSB7Ci0JCWRldl93YXJuKCZzci0+cGRldi0+ZGV2LCAiJXM6IFVuYWJsZSB0byBnZXQgdm9sdGFnZSB0YWJsZSIKLQkJCSJmb3Igbm9taW5hbCB2b2x0YWdlICVsZFxuIiwgX19mdW5jX18sIHZvbHQpOworCQlkZXZfd2Fybigmc3ItPnBkZXYtPmRldiwgIiVzOiBVbmFibGUgdG8gZ2V0IHZvbHRhZ2UgdGFibGUgZm9yIG5vbWluYWwgdm9sdGFnZSAlbGRcbiIsCisJCQkgX19mdW5jX18sIHZvbHQpOwogCQlyZXR1cm4gUFRSX0VSUih2b2x0X2RhdGEpOwogCX0KIApAQCAtNjE1LDggKzYxNCw4IEBACiB2b2lkIHNyX2Rpc2FibGUoc3RydWN0IG9tYXBfc3IgKnNyKQogewogCWlmICghc3IpIHsKLQkJcHJfd2FybigiJXM6IE5VTEwgb21hcF9zciBmcm9tICVwRlxuIiwgX19mdW5jX18sCi0JCQkodm9pZCAqKV9SRVRfSVBfKTsKKwkJcHJfd2FybigiJXM6IE5VTEwgb21hcF9zciBmcm9tICVwRlxuIiwKKwkJCV9fZnVuY19fLCAodm9pZCAqKV9SRVRfSVBfKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNjU4LDEzICs2NTcsMTMgQEAKIAlzdHJ1Y3Qgb21hcF9zciAqc3JfaW5mbzsKIAogCWlmICghY2xhc3NfZGF0YSkgewotCQlwcl93YXJuaW5nKCIlczosIFNtYXJ0cmVmbGV4IGNsYXNzIGRhdGEgcGFzc2VkIGlzIE5VTExcbiIsCisJCXByX3dhcm4oIiVzOiwgU21hcnRyZWZsZXggY2xhc3MgZGF0YSBwYXNzZWQgaXMgTlVMTFxuIiwKIAkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKHNyX2NsYXNzKSB7Ci0JCXByX3dhcm5pbmcoIiVzOiBTbWFydHJlZmxleCBjbGFzcyBkcml2ZXIgYWxyZWFkeSByZWdpc3RlcmVkXG4iLAorCQlwcl93YXJuKCIlczogU21hcnRyZWZsZXggY2xhc3MgZHJpdmVyIGFscmVhZHkgcmVnaXN0ZXJlZFxuIiwKIAkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC02OTYsNyArNjk1LDcgQEAKIAlzdHJ1Y3Qgb21hcF9zciAqc3IgPSBfc3JfbG9va3VwKHZvbHRkbSk7CiAKIAlpZiAoSVNfRVJSKHNyKSkgewotCQlwcl93YXJuaW5nKCIlczogb21hcF9zciBzdHJ1Y3QgZm9yIHZvbHRkbSBub3QgZm91bmRcbiIsCV9fZnVuY19fKTsKKwkJcHJfd2FybigiJXM6IG9tYXBfc3Igc3RydWN0IGZvciB2b2x0ZG0gbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTcwNCw4ICs3MDMsOCBAQAogCQlyZXR1cm47CiAKIAlpZiAoIXNyX2NsYXNzIHx8ICEoc3JfY2xhc3MtPmVuYWJsZSkgfHwgIShzcl9jbGFzcy0+Y29uZmlndXJlKSkgewotCQlkZXZfd2Fybigmc3ItPnBkZXYtPmRldiwgIiVzOiBzbWFydHJlZmxleCBjbGFzcyBkcml2ZXIgbm90IgotCQkJInJlZ2lzdGVyZWRcbiIsIF9fZnVuY19fKTsKKwkJZGV2X3dhcm4oJnNyLT5wZGV2LT5kZXYsICIlczogc21hcnRyZWZsZXggY2xhc3MgZHJpdmVyIG5vdCByZWdpc3RlcmVkXG4iLAorCQkJIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNzI4LDcgKzcyNyw3IEBACiAJc3RydWN0IG9tYXBfc3IgKnNyID0gX3NyX2xvb2t1cCh2b2x0ZG0pOwogCiAJaWYgKElTX0VSUihzcikpIHsKLQkJcHJfd2FybmluZygiJXM6IG9tYXBfc3Igc3RydWN0IGZvciB2b2x0ZG0gbm90IGZvdW5kXG4iLAlfX2Z1bmNfXyk7CisJCXByX3dhcm4oIiVzOiBvbWFwX3NyIHN0cnVjdCBmb3Igdm9sdGRtIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC03MzYsOCArNzM1LDggQEAKIAkJcmV0dXJuOwogCiAJaWYgKCFzcl9jbGFzcyB8fCAhKHNyX2NsYXNzLT5kaXNhYmxlKSkgewotCQlkZXZfd2Fybigmc3ItPnBkZXYtPmRldiwgIiVzOiBzbWFydHJlZmxleCBjbGFzcyBkcml2ZXIgbm90IgotCQkJInJlZ2lzdGVyZWRcbiIsIF9fZnVuY19fKTsKKwkJZGV2X3dhcm4oJnNyLT5wZGV2LT5kZXYsICIlczogc21hcnRyZWZsZXggY2xhc3MgZHJpdmVyIG5vdCByZWdpc3RlcmVkXG4iLAorCQkJIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNzYwLDcgKzc1OSw3IEBACiAJc3RydWN0IG9tYXBfc3IgKnNyID0gX3NyX2xvb2t1cCh2b2x0ZG0pOwogCiAJaWYgKElTX0VSUihzcikpIHsKLQkJcHJfd2FybmluZygiJXM6IG9tYXBfc3Igc3RydWN0IGZvciB2b2x0ZG0gbm90IGZvdW5kXG4iLAlfX2Z1bmNfXyk7CisJCXByX3dhcm4oIiVzOiBvbWFwX3NyIHN0cnVjdCBmb3Igdm9sdGRtIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC03NjgsOCArNzY3LDggQEAKIAkJcmV0dXJuOwogCiAJaWYgKCFzcl9jbGFzcyB8fCAhKHNyX2NsYXNzLT5kaXNhYmxlKSkgewotCQlkZXZfd2Fybigmc3ItPnBkZXYtPmRldiwgIiVzOiBzbWFydHJlZmxleCBjbGFzcyBkcml2ZXIgbm90IgotCQkJInJlZ2lzdGVyZWRcbiIsIF9fZnVuY19fKTsKKwkJZGV2X3dhcm4oJnNyLT5wZGV2LT5kZXYsICIlczogc21hcnRyZWZsZXggY2xhc3MgZHJpdmVyIG5vdCByZWdpc3RlcmVkXG4iLAorCQkJIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNzg3LDggKzc4Niw4IEBACiB2b2lkIG9tYXBfc3JfcmVnaXN0ZXJfcG1pYyhzdHJ1Y3Qgb21hcF9zcl9wbWljX2RhdGEgKnBtaWNfZGF0YSkKIHsKIAlpZiAoIXBtaWNfZGF0YSkgewotCQlwcl93YXJuaW5nKCIlczogVHJ5aW5nIHRvIHJlZ2lzdGVyIE5VTEwgUE1JQyBkYXRhIHN0cnVjdHVyZSIKLQkJCSJ3aXRoIHNtYXJ0cmVmbGV4XG4iLCBfX2Z1bmNfXyk7CisJCXByX3dhcm4oIiVzOiBUcnlpbmcgdG8gcmVnaXN0ZXIgTlVMTCBQTUlDIGRhdGEgc3RydWN0dXJlIHdpdGggc21hcnRyZWZsZXhcbiIsCisJCQlfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTgwMSw3ICs4MDAsNyBAQAogCXN0cnVjdCBvbWFwX3NyICpzcl9pbmZvID0gZGF0YTsKIAogCWlmICghc3JfaW5mbykgewotCQlwcl93YXJuaW5nKCIlczogb21hcF9zciBzdHJ1Y3Qgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCXByX3dhcm4oIiVzOiBvbWFwX3NyIHN0cnVjdCBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC04MTUsMTMgKzgxNCwxMyBAQAogCXN0cnVjdCBvbWFwX3NyICpzcl9pbmZvID0gZGF0YTsKIAogCWlmICghc3JfaW5mbykgewotCQlwcl93YXJuaW5nKCIlczogb21hcF9zciBzdHJ1Y3Qgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCXByX3dhcm4oIiVzOiBvbWFwX3NyIHN0cnVjdCBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogU2FuaXR5IGNoZWNrICovCiAJaWYgKHZhbCA+IDEpIHsKLQkJcHJfd2FybmluZygiJXM6IEludmFsaWQgYXJndW1lbnQgJWxsZFxuIiwgX19mdW5jX18sIHZhbCk7CisJCXByX3dhcm4oIiVzOiBJbnZhbGlkIGFyZ3VtZW50ICVsbGRcbiIsIF9fZnVuY19fLCB2YWwpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTg0OCwxOSArODQ3LDEzIEBACiAJaW50IGksIHJldCA9IDA7CiAKIAlzcl9pbmZvID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgb21hcF9zciksIEdGUF9LRVJORUwpOwotCWlmICghc3JfaW5mbykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogdW5hYmxlIHRvIGFsbG9jYXRlIHNyX2luZm9cbiIsCi0JCQlfX2Z1bmNfXyk7CisJaWYgKCFzcl9pbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlzcl9pbmZvLT5uYW1lID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCiAJCQkJICAgICBTTUFSVFJFRkxFWF9OQU1FX0xFTiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzcl9pbmZvLT5uYW1lKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgU1IgaW5zdGFuY2UgbmFtZVxuIiwKLQkJCV9fZnVuY19fKTsKKwlpZiAoIXNyX2luZm8tPm5hbWUpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNyX2luZm8pOwogCkBAIC05MTIsNyArOTA1LDcgQEAKIAlpZiAoc3JfY2xhc3MpIHsKIAkJcmV0ID0gc3JfbGF0ZV9pbml0KHNyX2luZm8pOwogCQlpZiAocmV0KSB7Ci0JCQlwcl93YXJuaW5nKCIlczogRXJyb3IgaW4gU1IgbGF0ZSBpbml0XG4iLCBfX2Z1bmNfXyk7CisJCQlwcl93YXJuKCIlczogRXJyb3IgaW4gU1IgbGF0ZSBpbml0XG4iLCBfX2Z1bmNfXyk7CiAJCQlnb3RvIGVycl9saXN0X2RlbDsKIAkJfQogCX0KQEAgLTkyMyw3ICs5MTYsNyBAQAogCQlpZiAoSVNfRVJSX09SX05VTEwoc3JfZGJnX2RpcikpIHsKIAkJCXJldCA9IFBUUl9FUlIoc3JfZGJnX2Rpcik7CiAJCQlwcl9lcnIoIiVzOnNyIGRlYnVnZnMgZGlyIGNyZWF0aW9uIGZhaWxlZCglZClcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7CisJCQkgICAgICAgX19mdW5jX18sIHJldCk7CiAJCQlnb3RvIGVycl9saXN0X2RlbDsKIAkJfQogCX0KQEAgLTk0NSw4ICs5MzgsOCBAQAogCiAJbnZhbHVlX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigibnZhbHVlIiwgc3JfaW5mby0+ZGJnX2Rpcik7CiAJaWYgKElTX0VSUl9PUl9OVUxMKG52YWx1ZV9kaXIpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBVbmFibGUgdG8gY3JlYXRlIGRlYnVnZnMgZGlyZWN0b3J5IgotCQkJImZvciBuLXZhbHVlc1xuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogVW5hYmxlIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGRpcmVjdG9yeSBmb3Igbi12YWx1ZXNcbiIsCisJCQlfX2Z1bmNfXyk7CiAJCXJldCA9IFBUUl9FUlIobnZhbHVlX2Rpcik7CiAJCWdvdG8gZXJyX2RlYnVnZnM7CiAJfQpAQCAtMTA1MywxMiArMTA0NiwxMiBAQAogCWlmIChzcl9wbWljX2RhdGEgJiYgc3JfcG1pY19kYXRhLT5zcl9wbWljX2luaXQpCiAJCXNyX3BtaWNfZGF0YS0+c3JfcG1pY19pbml0KCk7CiAJZWxzZQotCQlwcl93YXJuaW5nKCIlczogTm8gUE1JQyBob29rIHRvIGluaXQgc21hcnRyZWZsZXhcbiIsIF9fZnVuY19fKTsKKwkJcHJfd2FybigiJXM6IE5vIFBNSUMgaG9vayB0byBpbml0IHNtYXJ0cmVmbGV4XG4iLCBfX2Z1bmNfXyk7CiAKIAlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnNtYXJ0cmVmbGV4X2RyaXZlciwgb21hcF9zcl9wcm9iZSk7CiAJaWYgKHJldCkgewogCQlwcl9lcnIoIiVzOiBwbGF0Zm9ybSBkcml2ZXIgcmVnaXN0ZXIgZmFpbGVkIGZvciBTUlxuIiwKLQkJCV9fZnVuY19fKTsKKwkJICAgICAgIF9fZnVuY19fKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmMKaW5kZXggOWM2NWYxMy4uZGE3YTc1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmMKQEAgLTQ1NywxMyArNDU3LDE2IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXgxNzA0Ml9yZWFkX21vZGVsX2RhdGEoc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXAsCi0JCQkJCXU4IGFkZHIsIHUzMiAqZGF0YSwgaW50IHNpemUpCisJCQkJCXU4IGFkZHIsIHUxNiAqZGF0YSwgaW50IHNpemUpCiB7CiAJc3RydWN0IHJlZ21hcCAqbWFwID0gY2hpcC0+cmVnbWFwOwogCWludCBpOworCXUzMiB0bXA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQlyZWdtYXBfcmVhZChtYXAsIGFkZHIgKyBpLCAmZGF0YVtpXSk7CisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlyZWdtYXBfcmVhZChtYXAsIGFkZHIgKyBpLCAmdG1wKTsKKwkJZGF0YVtpXSA9ICh1MTYpdG1wOworCX0KIH0KIAogc3RhdGljIGlubGluZSBpbnQgbWF4MTcwNDJfbW9kZWxfZGF0YV9jb21wYXJlKHN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwLApAQCAtNDg2LDcgKzQ4OSw3IEBACiB7CiAJaW50IHJldDsKIAlpbnQgdGFibGVfc2l6ZSA9IEFSUkFZX1NJWkUoY2hpcC0+cGRhdGEtPmNvbmZpZ19kYXRhLT5jZWxsX2NoYXJfdGJsKTsKLQl1MzIgKnRlbXBfZGF0YTsKKwl1MTYgKnRlbXBfZGF0YTsKIAogCXRlbXBfZGF0YSA9IGtjYWxsb2ModGFibGVfc2l6ZSwgc2l6ZW9mKCp0ZW1wX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRlbXBfZGF0YSkKQEAgLTUwMSw3ICs1MDQsNyBAQAogCXJldCA9IG1heDE3MDQyX21vZGVsX2RhdGFfY29tcGFyZSgKIAkJY2hpcCwKIAkJY2hpcC0+cGRhdGEtPmNvbmZpZ19kYXRhLT5jZWxsX2NoYXJfdGJsLAotCQkodTE2ICopdGVtcF9kYXRhLAorCQl0ZW1wX2RhdGEsCiAJCXRhYmxlX3NpemUpOwogCiAJbWF4MTA3NDJfbG9ja19tb2RlbChjaGlwKTsKQEAgLTUxNCw3ICs1MTcsNyBAQAogewogCWludCBpOwogCWludCB0YWJsZV9zaXplID0gQVJSQVlfU0laRShjaGlwLT5wZGF0YS0+Y29uZmlnX2RhdGEtPmNlbGxfY2hhcl90YmwpOwotCXUzMiAqdGVtcF9kYXRhOworCXUxNiAqdGVtcF9kYXRhOwogCWludCByZXQgPSAwOwogCiAJdGVtcF9kYXRhID0ga2NhbGxvYyh0YWJsZV9zaXplLCBzaXplb2YoKnRlbXBfZGF0YSksIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9yZXNldC9LY29uZmlnIGIvZHJpdmVycy9wb3dlci9yZXNldC9LY29uZmlnCmluZGV4IDNiZmFjNTMuLmM3NGMzZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvcmVzZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3Bvd2VyL3Jlc2V0L0tjb25maWcKQEAgLTIwMCw4ICsyMDAsOCBAQAogY29uZmlnIFNZU0NPTl9SRUJPT1RfTU9ERQogCXRyaXN0YXRlICJHZW5lcmljIFNZU0NPTiByZWdtYXAgcmVib290IG1vZGUgZHJpdmVyIgogCWRlcGVuZHMgb24gT0YKKwlkZXBlbmRzIG9uIE1GRF9TWVNDT04KIAlzZWxlY3QgUkVCT09UX01PREUKLQlzZWxlY3QgTUZEX1NZU0NPTgogCWhlbHAKIAkgIFNheSB5IGhlcmUgd2lsbCBlbmFibGUgcmVib290IG1vZGUgZHJpdmVyLiBUaGlzIHdpbGwKIAkgIGdldCByZWJvb3QgbW9kZSBhcmd1bWVudHMgYW5kIHN0b3JlIGl0IGluIFNZU0NPTiBtYXBwZWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcmVzZXQvaGlzaS1yZWJvb3QuYyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQvaGlzaS1yZWJvb3QuYwppbmRleCA5YWI3ZjU2Li5mNjkzODdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L2hpc2ktcmVib290LmMKKysrIGIvZHJpdmVycy9wb3dlci9yZXNldC9oaXNpLXJlYm9vdC5jCkBAIC01MywxMyArNTMsMTYgQEAKIAogCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJlYm9vdC1vZmZzZXQiLCAmcmVib290X29mZnNldCkgPCAwKSB7CiAJCXByX2VycigiZmFpbGVkIHRvIGZpbmQgcmVib290LW9mZnNldCBwcm9wZXJ0eVxuIik7CisJCWlvdW5tYXAoYmFzZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWVyciA9IHJlZ2lzdGVyX3Jlc3RhcnRfaGFuZGxlcigmaGlzaV9yZXN0YXJ0X25iKTsKLQlpZiAoZXJyKQorCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IHJlZ2lzdGVyIHJlc3RhcnQgaGFuZGxlciAoZXJyPSVkKVxuIiwKIAkJCWVycik7CisJCWlvdW5tYXAoYmFzZSk7CisJfQogCiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvdHBzNjUyMTdfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci90cHM2NTIxN19jaGFyZ2VyLmMKaW5kZXggNzNkZmFlNC4uNGM1NmU1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci90cHM2NTIxN19jaGFyZ2VyLmMKKysrIGIvZHJpdmVycy9wb3dlci90cHM2NTIxN19jaGFyZ2VyLmMKQEAgLTIwNiw2ICsyMDYsNyBAQAogCWlmICghY2hhcmdlcikKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjaGFyZ2VyKTsKIAljaGFyZ2VyLT50cHMgPSB0cHM7CiAJY2hhcmdlci0+ZGV2ID0gJnBkZXYtPmRldjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlcmNhcC9pbnRlbF9yYXBsLmMgYi9kcml2ZXJzL3Bvd2VyY2FwL2ludGVsX3JhcGwuYwppbmRleCBmYmFiMjlkLi4yNDNiMjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyY2FwL2ludGVsX3JhcGwuYworKysgYi9kcml2ZXJzL3Bvd2VyY2FwL2ludGVsX3JhcGwuYwpAQCAtMTE1NCw4ICsxMTU0LDggQEAKIAogCVJBUExfQ1BVKElOVEVMX0ZBTTZfQVRPTV9TSUxWRVJNT05UMSwJcmFwbF9kZWZhdWx0c19ieXQpLAogCVJBUExfQ1BVKElOVEVMX0ZBTTZfQVRPTV9BSVJNT05ULAlyYXBsX2RlZmF1bHRzX2NodCksCi0JUkFQTF9DUFUoSU5URUxfRkFNNl9BVE9NX01FUlJJRklFTEQxLAlyYXBsX2RlZmF1bHRzX3RuZyksCi0JUkFQTF9DUFUoSU5URUxfRkFNNl9BVE9NX01FUlJJRklFTEQyLAlyYXBsX2RlZmF1bHRzX2FubiksCisJUkFQTF9DUFUoSU5URUxfRkFNNl9BVE9NX01FUlJJRklFTEQsCXJhcGxfZGVmYXVsdHNfdG5nKSwKKwlSQVBMX0NQVShJTlRFTF9GQU02X0FUT01fTU9PUkVGSUVMRCwJcmFwbF9kZWZhdWx0c19hbm4pLAogCVJBUExfQ1BVKElOVEVMX0ZBTTZfQVRPTV9HT0xETU9OVCwJcmFwbF9kZWZhdWx0c19jb3JlKSwKIAlSQVBMX0NQVShJTlRFTF9GQU02X0FUT01fREVOVkVSVE9OLAlyYXBsX2RlZmF1bHRzX2NvcmUpLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3B0cC9wdHBfY2xvY2suYyBiL2RyaXZlcnMvcHRwL3B0cF9jbG9jay5jCmluZGV4IDJlNDgxYjkuLjg2MjgwYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHRwL3B0cF9jbG9jay5jCisrKyBiL2RyaXZlcnMvcHRwL3B0cF9jbG9jay5jCkBAIC0yNjMsNiArMjYzLDcgQEAKIG5vX2RldmljZToKIAltdXRleF9kZXN0cm95KCZwdHAtPnRzZXZxX211eCk7CiAJbXV0ZXhfZGVzdHJveSgmcHRwLT5waW5jZmdfbXV4KTsKKwlpZGFfc2ltcGxlX3JlbW92ZSgmcHRwX2Nsb2Nrc19tYXAsIGluZGV4KTsKIG5vX3Nsb3Q6CiAJa2ZyZWUocHRwKTsKIG5vX21lbW9yeToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHRwL3B0cF9peHA0NnguYyBiL2RyaXZlcnMvcHRwL3B0cF9peHA0NnguYwppbmRleCBlZTRmMTgzLi4zNDRhM2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3B0cC9wdHBfaXhwNDZ4LmMKKysrIGIvZHJpdmVycy9wdHAvcHRwX2l4cDQ2eC5jCkBAIC0yNjgsMTggKzI2OCwxOSBAQAogCQlyZXR1cm4gZXJyOwogCiAJaXJxID0gZ3Bpb190b19pcnEoZ3Bpbyk7CisJaWYgKGlycSA8IDApCisJCXJldHVybiBpcnE7CiAKLQlpZiAoTk9fSVJRID09IGlycSkKLQkJcmV0dXJuIE5PX0lSUTsKLQotCWlmIChpcnFfc2V0X2lycV90eXBlKGlycSwgSVJRRl9UUklHR0VSX0ZBTExJTkcpKSB7CisJZXJyID0gaXJxX3NldF9pcnFfdHlwZShpcnEsIElSUUZfVFJJR0dFUl9GQUxMSU5HKTsKKwlpZiAoZXJyKSB7CiAJCXByX2VycigiY2Fubm90IHNldCB0cmlnZ2VyIHR5cGUgZm9yIGlycSAlZFxuIiwgaXJxKTsKLQkJcmV0dXJuIE5PX0lSUTsKKwkJcmV0dXJuIGVycjsKIAl9CiAKLQlpZiAocmVxdWVzdF9pcnEoaXJxLCBpc3IsIDAsIERSSVZFUiwgJml4cF9jbG9jaykpIHsKKwllcnIgPSByZXF1ZXN0X2lycShpcnEsIGlzciwgMCwgRFJJVkVSLCAmaXhwX2Nsb2NrKTsKKwlpZiAoZXJyKSB7CiAJCXByX2VycigicmVxdWVzdF9pcnEgZmFpbGVkIGZvciBpcnEgJWRcbiIsIGlycSk7Ci0JCXJldHVybiBOT19JUlE7CisJCXJldHVybiBlcnI7CiAJfQogCiAJcmV0dXJuIGlycTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmFwaWRpby9kZXZpY2VzL3RzaTcyMS5jIGIvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvdHNpNzIxLmMKaW5kZXggMzJmMGYwMS4uOWQxOWI5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvdHNpNzIxLmMKKysrIGIvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvdHNpNzIxLmMKQEAgLTExNjEsNyArMTE2MSw3IEBACiAJCX0gZWxzZSBpZiAoaWJ3X3N0YXJ0IDwgKGliX3dpbi0+cnN0YXJ0ICsgaWJfd2luLT5zaXplKSAmJgogCQkJICAgKGlid19zdGFydCArIGlid19zaXplKSA+IGliX3dpbi0+cnN0YXJ0KSB7CiAJCQkvKiBSZXR1cm4gZXJyb3IgaWYgYWRkcmVzcyB0cmFuc2xhdGlvbiBpbnZvbHZlZCAqLwotCQkJaWYgKGRpcmVjdCAmJiBpYl93aW4tPnhsYXQpIHsKKwkJCWlmICghZGlyZWN0IHx8IGliX3dpbi0+eGxhdCkgewogCQkJCXJldCA9IC1FRkFVTFQ7CiAJCQkJYnJlYWs7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JhcGlkaW8vcmlvX2NtLmMgYi9kcml2ZXJzL3JhcGlkaW8vcmlvX2NtLmMKaW5kZXggM2ZhMTdhYy4uY2ViYzI5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yYXBpZGlvL3Jpb19jbS5jCisrKyBiL2RyaXZlcnMvcmFwaWRpby9yaW9fY20uYwpAQCAtMjI0NywxNyArMjI0NywzMCBAQAogewogCXN0cnVjdCByaW9fY2hhbm5lbCAqY2g7CiAJdW5zaWduZWQgaW50IGk7CisJTElTVF9IRUFEKGxpc3QpOwogCiAJcmlvY21fZGVidWcoRVhJVCwgIi4iKTsKIAorCS8qCisJICogSWYgdGhlcmUgYXJlIGFueSBjaGFubmVscyBsZWZ0IGluIGNvbm5lY3RlZCBzdGF0ZSBzZW5kCisJICogY2xvc2Ugbm90aWZpY2F0aW9uIHRvIHRoZSBjb25uZWN0aW9uIHBhcnRuZXIuCisJICogRmlyc3QgYnVpbGQgYSBsaXN0IG9mIGNoYW5uZWxzIHRoYXQgcmVxdWlyZSBhIGNsb3NpbmcKKwkgKiBub3RpZmljYXRpb24gYmVjYXVzZSBmdW5jdGlvbiByaW9jbV9zZW5kX2Nsb3NlKCkgc2hvdWxkCisJICogYmUgY2FsbGVkIG91dHNpZGUgb2Ygc3BpbmxvY2sgcHJvdGVjdGVkIGNvZGUuCisJICovCiAJc3Bpbl9sb2NrX2JoKCZpZHJfbG9jayk7CiAJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjaF9pZHIsIGNoLCBpKSB7Ci0JCXJpb2NtX2RlYnVnKEVYSVQsICJjbG9zZSBjaCAlZCIsIGNoLT5pZCk7Ci0JCWlmIChjaC0+c3RhdGUgPT0gUklPX0NNX0NPTk5FQ1RFRCkKLQkJCXJpb2NtX3NlbmRfY2xvc2UoY2gpOworCQlpZiAoY2gtPnN0YXRlID09IFJJT19DTV9DT05ORUNURUQpIHsKKwkJCXJpb2NtX2RlYnVnKEVYSVQsICJjbG9zZSBjaCAlZCIsIGNoLT5pZCk7CisJCQlpZHJfcmVtb3ZlKCZjaF9pZHIsIGNoLT5pZCk7CisJCQlsaXN0X2FkZCgmY2gtPmNoX25vZGUsICZsaXN0KTsKKwkJfQogCX0KIAlzcGluX3VubG9ja19iaCgmaWRyX2xvY2spOwogCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaCwgJmxpc3QsIGNoX25vZGUpCisJCXJpb2NtX3NlbmRfY2xvc2UoY2gpOworCiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnIGIvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZwppbmRleCA2Yzg4ZTMxLi4wNmM3NTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKQEAgLTMyMyw3ICszMjMsNyBAQAogCiBjb25maWcgUkVHVUxBVE9SX0xQODczWAogCXRyaXN0YXRlICJUSSBMUDg3M1ggUG93ZXIgcmVndWxhdG9ycyIKLQlkZXBlbmRzIG9uIE1GRF9MUDg3M1ggJiYgT0YKKwlkZXBlbmRzIG9uIE1GRF9USV9MUDg3M1ggJiYgT0YKIAloZWxwCiAJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBMUDg3M1ggdm9sdGFnZSByZWd1bGF0b3IgY2hpcHMuIExQODczWAogCSAgcHJvdmlkZXMgdHdvIHN0ZXAtZG93biBjb252ZXJ0ZXJzIGFuZCB0d28gZ2VuZXJhbC1wdXJwb3NlIExETwpAQCAtMzUzLDYgKzM1MywxNCBAQAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBMVEMzNTg5LCBMVEMzNTg5LTEsIGFuZCBMVEMzNTg5LTIKIAkgIDgtb3V0cHV0IHJlZ3VsYXRvcnMgY29udHJvbGxlZCB2aWEgSTJDLgogCitjb25maWcgUkVHVUxBVE9SX0xUQzM2NzYKKwl0cmlzdGF0ZSAiTFRDMzY3NiA4LW91dHB1dCB2b2x0YWdlIHJlZ3VsYXRvciIKKwlkZXBlbmRzIG9uIEkyQworCXNlbGVjdCBSRUdNQVBfSTJDCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBMVEMzNjc2CisJICA4LW91dHB1dCByZWd1bGF0b3JzIGNvbnRyb2xsZWQgdmlhIEkyQy4KKwogY29uZmlnIFJFR1VMQVRPUl9NQVgxNDU3NwogCXRyaXN0YXRlICJNYXhpbSAxNDU3Ny83NzgzNiByZWd1bGF0b3IiCiAJZGVwZW5kcyBvbiBNRkRfTUFYMTQ1NzcKQEAgLTgyMCw3ICs4MjgsNyBAQAogCSAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyBUUFM2NTkxMiB2b2x0YWdlIHJlZ3VsYXRvciBjaGlwLgogCiBjb25maWcgUkVHVUxBVE9SX1RQUzgwMDMxCi0JdHJpc3RhdGUgIlRJIFRQUzgwMDMxL1RQUzgwMDMyIHBvd2VyIHJlZ3VhbHRvciBkcml2ZXIiCisJdHJpc3RhdGUgIlRJIFRQUzgwMDMxL1RQUzgwMDMyIHBvd2VyIHJlZ3VsYXRvciBkcml2ZXIiCiAJZGVwZW5kcyBvbiBNRkRfVFBTODAwMzEKIAloZWxwCiAJICBUUFM4MDAzMS8gVFBTODAwMzIgRnVsbHkgSW50ZWdyYXRlZCBQb3dlciBNYW5hZ2VtZW50IHdpdGggUG93ZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL01ha2VmaWxlIGIvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKaW5kZXggZjNkYTllZS4uMjE0MmE1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKQEAgLTQ3LDYgKzQ3LDcgQEAKIG9iai0kKENPTkZJR19SRUdVTEFUT1JfTFA4Nzg4KSArPSBscDg3ODgtbGRvLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfTFA4NzU1KSArPSBscDg3NTUubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9MVEMzNTg5KSArPSBsdGMzNTg5Lm8KK29iai0kKENPTkZJR19SRUdVTEFUT1JfTFRDMzY3NikgKz0gbHRjMzY3Ni5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX01BWDE0NTc3KSArPSBtYXgxNDU3Ny1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9NQVgxNTg2KSArPSBtYXgxNTg2Lm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfTUFYNzc2MjApICs9IG1heDc3NjIwLXJlZ3VsYXRvci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKaW5kZXggZGIzMjBlOC4uNjc0MjZjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYwpAQCAtNjc5LDI0ICs2NzksNiBAQAogCSAgICAhcmRldi0+ZGVzYy0+b3BzLT5zZXRfbG9hZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBnZXQgb3V0cHV0IHZvbHRhZ2UgKi8KLQlvdXRwdXRfdVYgPSBfcmVndWxhdG9yX2dldF92b2x0YWdlKHJkZXYpOwotCWlmIChvdXRwdXRfdVYgPD0gMCkgewotCQlyZGV2X2VycihyZGV2LCAiaW52YWxpZCBvdXRwdXQgdm9sdGFnZSBmb3VuZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIGdldCBpbnB1dCB2b2x0YWdlICovCi0JaW5wdXRfdVYgPSAwOwotCWlmIChyZGV2LT5zdXBwbHkpCi0JCWlucHV0X3VWID0gcmVndWxhdG9yX2dldF92b2x0YWdlKHJkZXYtPnN1cHBseSk7Ci0JaWYgKGlucHV0X3VWIDw9IDApCi0JCWlucHV0X3VWID0gcmRldi0+Y29uc3RyYWludHMtPmlucHV0X3VWOwotCWlmIChpbnB1dF91ViA8PSAwKSB7Ci0JCXJkZXZfZXJyKHJkZXYsICJpbnZhbGlkIGlucHV0IHZvbHRhZ2UgZm91bmRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAkvKiBjYWxjIHRvdGFsIHJlcXVlc3RlZCBsb2FkICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzaWJsaW5nLCAmcmRldi0+Y29uc3VtZXJfbGlzdCwgbGlzdCkKIAkJY3VycmVudF91QSArPSBzaWJsaW5nLT51QV9sb2FkOwpAQCAtNzA5LDYgKzY5MSwyNCBAQAogCQlpZiAoZXJyIDwgMCkKIAkJCXJkZXZfZXJyKHJkZXYsICJmYWlsZWQgdG8gc2V0IGxvYWQgJWRcbiIsIGN1cnJlbnRfdUEpOwogCX0gZWxzZSB7CisJCS8qIGdldCBvdXRwdXQgdm9sdGFnZSAqLworCQlvdXRwdXRfdVYgPSBfcmVndWxhdG9yX2dldF92b2x0YWdlKHJkZXYpOworCQlpZiAob3V0cHV0X3VWIDw9IDApIHsKKwkJCXJkZXZfZXJyKHJkZXYsICJpbnZhbGlkIG91dHB1dCB2b2x0YWdlIGZvdW5kXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogZ2V0IGlucHV0IHZvbHRhZ2UgKi8KKwkJaW5wdXRfdVYgPSAwOworCQlpZiAocmRldi0+c3VwcGx5KQorCQkJaW5wdXRfdVYgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UocmRldi0+c3VwcGx5KTsKKwkJaWYgKGlucHV0X3VWIDw9IDApCisJCQlpbnB1dF91ViA9IHJkZXYtPmNvbnN0cmFpbnRzLT5pbnB1dF91VjsKKwkJaWYgKGlucHV0X3VWIDw9IDApIHsKKwkJCXJkZXZfZXJyKHJkZXYsICJpbnZhbGlkIGlucHV0IHZvbHRhZ2UgZm91bmRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwogCQkvKiBub3cgZ2V0IHRoZSBvcHRpbXVtIG1vZGUgZm9yIG91ciBuZXcgdG90YWwgcmVndWxhdG9yIGxvYWQgKi8KIAkJbW9kZSA9IHJkZXYtPmRlc2MtPm9wcy0+Z2V0X29wdGltdW1fbW9kZShyZGV2LCBpbnB1dF91ViwKIAkJCQkJCQkgb3V0cHV0X3VWLCBjdXJyZW50X3VBKTsKQEAgLTI3NDMsNiArMjc0MywyNCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZV90aW1lKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAorCQkJCSAgICAgICBpbnQgb2xkX3VWLCBpbnQgbmV3X3VWKQoreworCXVuc2lnbmVkIGludCByYW1wX2RlbGF5ID0gMDsKKworCWlmIChyZGV2LT5jb25zdHJhaW50cy0+cmFtcF9kZWxheSkKKwkJcmFtcF9kZWxheSA9IHJkZXYtPmNvbnN0cmFpbnRzLT5yYW1wX2RlbGF5OworCWVsc2UgaWYgKHJkZXYtPmRlc2MtPnJhbXBfZGVsYXkpCisJCXJhbXBfZGVsYXkgPSByZGV2LT5kZXNjLT5yYW1wX2RlbGF5OworCisJaWYgKHJhbXBfZGVsYXkgPT0gMCkgeworCQlyZGV2X3dhcm4ocmRldiwgInJhbXBfZGVsYXkgbm90IHNldFxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBESVZfUk9VTkRfVVAoYWJzKG5ld191ViAtIG9sZF91ViksIHJhbXBfZGVsYXkpOworfQorCiBzdGF0aWMgaW50IF9yZWd1bGF0b3JfZG9fc2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCiAJCQkJICAgICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQogewpAQCAtMjc1MSw2ICsyNzY5LDggQEAKIAlpbnQgYmVzdF92YWwgPSAwOwogCXVuc2lnbmVkIGludCBzZWxlY3RvcjsKIAlpbnQgb2xkX3NlbGVjdG9yID0gLTE7CisJY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9vcHMgKm9wcyA9IHJkZXYtPmRlc2MtPm9wczsKKwlpbnQgb2xkX3VWID0gX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZShyZGV2KTsKIAogCXRyYWNlX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZShyZGV2X2dldF9uYW1lKHJkZXYpLCBtaW5fdVYsIG1heF91Vik7CiAKQEAgLTI3NjIsMjkgKzI3ODIsMjggQEAKIAkgKiBpbmZvIHRvIGNhbGwgc2V0X3ZvbHRhZ2VfdGltZV9zZWwoKS4KIAkgKi8KIAlpZiAoX3JlZ3VsYXRvcl9pc19lbmFibGVkKHJkZXYpICYmCi0JICAgIHJkZXYtPmRlc2MtPm9wcy0+c2V0X3ZvbHRhZ2VfdGltZV9zZWwgJiYKLQkgICAgcmRldi0+ZGVzYy0+b3BzLT5nZXRfdm9sdGFnZV9zZWwpIHsKLQkJb2xkX3NlbGVjdG9yID0gcmRldi0+ZGVzYy0+b3BzLT5nZXRfdm9sdGFnZV9zZWwocmRldik7CisJICAgIG9wcy0+c2V0X3ZvbHRhZ2VfdGltZV9zZWwgJiYgb3BzLT5nZXRfdm9sdGFnZV9zZWwpIHsKKwkJb2xkX3NlbGVjdG9yID0gb3BzLT5nZXRfdm9sdGFnZV9zZWwocmRldik7CiAJCWlmIChvbGRfc2VsZWN0b3IgPCAwKQogCQkJcmV0dXJuIG9sZF9zZWxlY3RvcjsKIAl9CiAKLQlpZiAocmRldi0+ZGVzYy0+b3BzLT5zZXRfdm9sdGFnZSkgeworCWlmIChvcHMtPnNldF92b2x0YWdlKSB7CiAJCXJldCA9IF9yZWd1bGF0b3JfY2FsbF9zZXRfdm9sdGFnZShyZGV2LCBtaW5fdVYsIG1heF91ViwKIAkJCQkJCSAgJnNlbGVjdG9yKTsKIAogCQlpZiAocmV0ID49IDApIHsKLQkJCWlmIChyZGV2LT5kZXNjLT5vcHMtPmxpc3Rfdm9sdGFnZSkKLQkJCQliZXN0X3ZhbCA9IHJkZXYtPmRlc2MtPm9wcy0+bGlzdF92b2x0YWdlKHJkZXYsCi0JCQkJCQkJCQkgc2VsZWN0b3IpOworCQkJaWYgKG9wcy0+bGlzdF92b2x0YWdlKQorCQkJCWJlc3RfdmFsID0gb3BzLT5saXN0X3ZvbHRhZ2UocmRldiwKKwkJCQkJCQkgICAgIHNlbGVjdG9yKTsKIAkJCWVsc2UKIAkJCQliZXN0X3ZhbCA9IF9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UocmRldik7CiAJCX0KIAotCX0gZWxzZSBpZiAocmRldi0+ZGVzYy0+b3BzLT5zZXRfdm9sdGFnZV9zZWwpIHsKKwl9IGVsc2UgaWYgKG9wcy0+c2V0X3ZvbHRhZ2Vfc2VsKSB7CiAJCXJldCA9IHJlZ3VsYXRvcl9tYXBfdm9sdGFnZShyZGV2LCBtaW5fdVYsIG1heF91Vik7CiAJCWlmIChyZXQgPj0gMCkgewotCQkJYmVzdF92YWwgPSByZGV2LT5kZXNjLT5vcHMtPmxpc3Rfdm9sdGFnZShyZGV2LCByZXQpOworCQkJYmVzdF92YWwgPSBvcHMtPmxpc3Rfdm9sdGFnZShyZGV2LCByZXQpOwogCQkJaWYgKG1pbl91ViA8PSBiZXN0X3ZhbCAmJiBtYXhfdVYgPj0gYmVzdF92YWwpIHsKIAkJCQlzZWxlY3RvciA9IHJldDsKIAkJCQlpZiAob2xkX3NlbGVjdG9yID09IHNlbGVjdG9yKQpAQCAtMjgwMCwzNCArMjgxOSw1MCBAQAogCQlyZXQgPSAtRUlOVkFMOwogCX0KIAotCS8qIENhbGwgc2V0X3ZvbHRhZ2VfdGltZV9zZWwgaWYgc3VjY2Vzc2Z1bGx5IG9idGFpbmVkIG9sZF9zZWxlY3RvciAqLwotCWlmIChyZXQgPT0gMCAmJiAhcmRldi0+Y29uc3RyYWludHMtPnJhbXBfZGlzYWJsZSAmJiBvbGRfc2VsZWN0b3IgPj0gMAotCQkmJiBvbGRfc2VsZWN0b3IgIT0gc2VsZWN0b3IpIHsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKIAotCQlkZWxheSA9IHJkZXYtPmRlc2MtPm9wcy0+c2V0X3ZvbHRhZ2VfdGltZV9zZWwocmRldiwKLQkJCQkJCW9sZF9zZWxlY3Rvciwgc2VsZWN0b3IpOwotCQlpZiAoZGVsYXkgPCAwKSB7Ci0JCQlyZGV2X3dhcm4ocmRldiwgInNldF92b2x0YWdlX3RpbWVfc2VsKCkgZmFpbGVkOiAlZFxuIiwKLQkJCQkgIGRlbGF5KTsKLQkJCWRlbGF5ID0gMDsKLQkJfQotCi0JCS8qIEluc2VydCBhbnkgbmVjZXNzYXJ5IGRlbGF5cyAqLwotCQlpZiAoZGVsYXkgPj0gMTAwMCkgewotCQkJbWRlbGF5KGRlbGF5IC8gMTAwMCk7Ci0JCQl1ZGVsYXkoZGVsYXkgJSAxMDAwKTsKLQkJfSBlbHNlIGlmIChkZWxheSkgewotCQkJdWRlbGF5KGRlbGF5KTsKKwlpZiAob3BzLT5zZXRfdm9sdGFnZV90aW1lX3NlbCkgeworCQkvKgorCQkgKiBDYWxsIHNldF92b2x0YWdlX3RpbWVfc2VsIGlmIHN1Y2Nlc3NmdWxseSBvYnRhaW5lZAorCQkgKiBvbGRfc2VsZWN0b3IKKwkJICovCisJCWlmIChvbGRfc2VsZWN0b3IgPj0gMCAmJiBvbGRfc2VsZWN0b3IgIT0gc2VsZWN0b3IpCisJCQlkZWxheSA9IG9wcy0+c2V0X3ZvbHRhZ2VfdGltZV9zZWwocmRldiwgb2xkX3NlbGVjdG9yLAorCQkJCQkJCSAgc2VsZWN0b3IpOworCX0gZWxzZSB7CisJCWlmIChvbGRfdVYgIT0gYmVzdF92YWwpIHsKKwkJCWlmIChvcHMtPnNldF92b2x0YWdlX3RpbWUpCisJCQkJZGVsYXkgPSBvcHMtPnNldF92b2x0YWdlX3RpbWUocmRldiwgb2xkX3VWLAorCQkJCQkJCSAgICAgIGJlc3RfdmFsKTsKKwkJCWVsc2UKKwkJCQlkZWxheSA9IF9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2VfdGltZShyZGV2LAorCQkJCQkJCQkgICAgb2xkX3VWLAorCQkJCQkJCQkgICAgYmVzdF92YWwpOwogCQl9CiAJfQogCi0JaWYgKHJldCA9PSAwICYmIGJlc3RfdmFsID49IDApIHsKKwlpZiAoZGVsYXkgPCAwKSB7CisJCXJkZXZfd2FybihyZGV2LCAiZmFpbGVkIHRvIGdldCBkZWxheTogJWRcbiIsIGRlbGF5KTsKKwkJZGVsYXkgPSAwOworCX0KKworCS8qIEluc2VydCBhbnkgbmVjZXNzYXJ5IGRlbGF5cyAqLworCWlmIChkZWxheSA+PSAxMDAwKSB7CisJCW1kZWxheShkZWxheSAvIDEwMDApOworCQl1ZGVsYXkoZGVsYXkgJSAxMDAwKTsKKwl9IGVsc2UgaWYgKGRlbGF5KSB7CisJCXVkZWxheShkZWxheSk7CisJfQorCisJaWYgKGJlc3RfdmFsID49IDApIHsKIAkJdW5zaWduZWQgbG9uZyBkYXRhID0gYmVzdF92YWw7CiAKIAkJX25vdGlmaWVyX2NhbGxfY2hhaW4ocmRldiwgUkVHVUxBVE9SX0VWRU5UX1ZPTFRBR0VfQ0hBTkdFLAogCQkJCSAgICAgKHZvaWQgKilkYXRhKTsKIAl9CiAKK291dDoKIAl0cmFjZV9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2VfY29tcGxldGUocmRldl9nZXRfbmFtZShyZGV2KSwgYmVzdF92YWwpOwogCiAJcmV0dXJuIHJldDsKQEAgLTI5OTgsOSArMzAzMywxMyBAQAogCWludCB2b2x0YWdlOwogCWludCBpOwogCisJaWYgKG9wcy0+c2V0X3ZvbHRhZ2VfdGltZSkKKwkJcmV0dXJuIG9wcy0+c2V0X3ZvbHRhZ2VfdGltZShyZGV2LCBvbGRfdVYsIG5ld191Vik7CisJZWxzZSBpZiAoIW9wcy0+c2V0X3ZvbHRhZ2VfdGltZV9zZWwpCisJCXJldHVybiBfcmVndWxhdG9yX3NldF92b2x0YWdlX3RpbWUocmRldiwgb2xkX3VWLCBuZXdfdVYpOworCiAJLyogQ3VycmVudGx5IHJlcXVpcmVzIG9wZXJhdGlvbnMgdG8gZG8gdGhpcyAqLwotCWlmICghb3BzLT5saXN0X3ZvbHRhZ2UgfHwgIW9wcy0+c2V0X3ZvbHRhZ2VfdGltZV9zZWwKLQkgICAgfHwgIXJkZXYtPmRlc2MtPm5fdm9sdGFnZXMpCisJaWYgKCFvcHMtPmxpc3Rfdm9sdGFnZSB8fCAhcmRldi0+ZGVzYy0+bl92b2x0YWdlcykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcmRldi0+ZGVzYy0+bl92b2x0YWdlczsgaSsrKSB7CkBAIC0zMDM5LDE5ICszMDc4LDggQEAKIAkJCQkgICB1bnNpZ25lZCBpbnQgb2xkX3NlbGVjdG9yLAogCQkJCSAgIHVuc2lnbmVkIGludCBuZXdfc2VsZWN0b3IpCiB7Ci0JdW5zaWduZWQgaW50IHJhbXBfZGVsYXkgPSAwOwogCWludCBvbGRfdm9sdCwgbmV3X3ZvbHQ7CiAKLQlpZiAocmRldi0+Y29uc3RyYWludHMtPnJhbXBfZGVsYXkpCi0JCXJhbXBfZGVsYXkgPSByZGV2LT5jb25zdHJhaW50cy0+cmFtcF9kZWxheTsKLQllbHNlIGlmIChyZGV2LT5kZXNjLT5yYW1wX2RlbGF5KQotCQlyYW1wX2RlbGF5ID0gcmRldi0+ZGVzYy0+cmFtcF9kZWxheTsKLQotCWlmIChyYW1wX2RlbGF5ID09IDApIHsKLQkJcmRldl93YXJuKHJkZXYsICJyYW1wX2RlbGF5IG5vdCBzZXRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAkvKiBzYW5pdHkgY2hlY2sgKi8KIAlpZiAoIXJkZXYtPmRlc2MtPm9wcy0+bGlzdF92b2x0YWdlKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMwNTksNyArMzA4NywxMSBAQAogCW9sZF92b2x0ID0gcmRldi0+ZGVzYy0+b3BzLT5saXN0X3ZvbHRhZ2UocmRldiwgb2xkX3NlbGVjdG9yKTsKIAluZXdfdm9sdCA9IHJkZXYtPmRlc2MtPm9wcy0+bGlzdF92b2x0YWdlKHJkZXYsIG5ld19zZWxlY3Rvcik7CiAKLQlyZXR1cm4gRElWX1JPVU5EX1VQKGFicyhuZXdfdm9sdCAtIG9sZF92b2x0KSwgcmFtcF9kZWxheSk7CisJaWYgKHJkZXYtPmRlc2MtPm9wcy0+c2V0X3ZvbHRhZ2VfdGltZSkKKwkJcmV0dXJuIHJkZXYtPmRlc2MtPm9wcy0+c2V0X3ZvbHRhZ2VfdGltZShyZGV2LCBvbGRfdm9sdCwKKwkJCQkJCQkgbmV3X3ZvbHQpOworCWVsc2UKKwkJcmV0dXJuIF9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2VfdGltZShyZGV2LCBvbGRfdm9sdCwgbmV3X3ZvbHQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVndWxhdG9yX3NldF92b2x0YWdlX3RpbWVfc2VsKTsKIApAQCAtMzQ4MywxMCArMzUxNSw4IEBACiAJCWNvbnN1bWVyc1tpXS5jb25zdW1lciA9IE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbnN1bWVyczsgaSsrKSB7Ci0JCWNvbnN1bWVyc1tpXS5jb25zdW1lciA9IF9yZWd1bGF0b3JfZ2V0KGRldiwKLQkJCQkJCSAgICAgICBjb25zdW1lcnNbaV0uc3VwcGx5LAotCQkJCQkJICAgICAgIGZhbHNlLAotCQkJCQkJICAgICAgICFjb25zdW1lcnNbaV0ub3B0aW9uYWwpOworCQljb25zdW1lcnNbaV0uY29uc3VtZXIgPSByZWd1bGF0b3JfZ2V0KGRldiwKKwkJCQkJCSAgICAgIGNvbnN1bWVyc1tpXS5zdXBwbHkpOwogCQlpZiAoSVNfRVJSKGNvbnN1bWVyc1tpXS5jb25zdW1lcikpIHsKIAkJCXJldCA9IFBUUl9FUlIoY29uc3VtZXJzW2ldLmNvbnN1bWVyKTsKIAkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBzdXBwbHkgJyVzJzogJWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kYng1MDAtcHJjbXUuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2RieDUwMC1wcmNtdS5jCmluZGV4IDM5NjNkZmEuLjg5NzYxNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2RieDUwMC1wcmNtdS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2RieDUwMC1wcmNtdS5jCkBAIC03NSwyNCArNzUsNiBAQAogCXU4ICpzdGF0ZV9hZnRlcl9zdXNwZW5kOwogfSByZGVidWc7CiAKLXZvaWQgdXg1MDBfcmVndWxhdG9yX3N1c3BlbmRfZGVidWcodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCByZGVidWcubnVtX3JlZ3VsYXRvcnM7IGkrKykKLQkJcmRlYnVnLnN0YXRlX2JlZm9yZV9zdXNwZW5kW2ldID0KLQkJCXJkZWJ1Zy5yZWd1bGF0b3JfYXJyYXlbaV0uaXNfZW5hYmxlZDsKLX0KLQotdm9pZCB1eDUwMF9yZWd1bGF0b3JfcmVzdW1lX2RlYnVnKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmRlYnVnLm51bV9yZWd1bGF0b3JzOyBpKyspCi0JCXJkZWJ1Zy5zdGF0ZV9hZnRlcl9zdXNwZW5kW2ldID0KLQkJCXJkZWJ1Zy5yZWd1bGF0b3JfYXJyYXlbaV0uaXNfZW5hYmxlZDsKLX0KLQogc3RhdGljIGludCB1eDUwMF9yZWd1bGF0b3JfcG93ZXJfc3RhdGVfY250X3ByaW50KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKIHsKIAkvKiBwcmludCBwb3dlciBzdGF0ZSBjb3VudCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvZGV2cmVzLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9kZXZyZXMuYwppbmRleCA2YWQ4YWI0Li42ZWMxZDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9kZXZyZXMuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9kZXZyZXMuYwpAQCAtMTY0LDExICsxNjQsOCBAQAogCQljb25zdW1lcnNbaV0uY29uc3VtZXIgPSBOVUxMOwogCiAJZm9yIChpID0gMDsgaSA8IG51bV9jb25zdW1lcnM7IGkrKykgewotCQljb25zdW1lcnNbaV0uY29uc3VtZXIgPSBfZGV2bV9yZWd1bGF0b3JfZ2V0KGRldiwKLQkJCQkJCQkgICAgY29uc3VtZXJzW2ldLnN1cHBseSwKLQkJCQkJCQkgICAgY29uc3VtZXJzW2ldLm9wdGlvbmFsID8KLQkJCQkJCQkJT1BUSU9OQUxfR0VUIDoKLQkJCQkJCQkJTk9STUFMX0dFVCk7CisJCWNvbnN1bWVyc1tpXS5jb25zdW1lciA9IGRldm1fcmVndWxhdG9yX2dldChkZXYsCisJCQkJCQkJICAgY29uc3VtZXJzW2ldLnN1cHBseSk7CiAJCWlmIChJU19FUlIoY29uc3VtZXJzW2ldLmNvbnN1bWVyKSkgewogCQkJcmV0ID0gUFRSX0VSUihjb25zdW1lcnNbaV0uY29uc3VtZXIpOwogCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IHN1cHBseSAnJXMnOiAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2hpNjQyMS1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2hpNjQyMS1yZWd1bGF0b3IuYwppbmRleCA0MmRjNWZiLi42MmM1ZjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9oaTY0MjEtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvaGk2NDIxLXJlZ3VsYXRvci5jCkBAIC00NzcsNyArNDc3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotdW5zaWduZWQgaW50IGhpNjQyMV9yZWd1bGF0b3JfbGRvX2dldF9vcHRpbXVtX21vZGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCitzdGF0aWMgdW5zaWduZWQgaW50CitoaTY0MjFfcmVndWxhdG9yX2xkb19nZXRfb3B0aW11bV9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAogCQkJaW50IGlucHV0X3VWLCBpbnQgb3V0cHV0X3VWLCBpbnQgbG9hZF91QSkKIHsKIAlzdHJ1Y3QgaGk2NDIxX3JlZ3VsYXRvcl9pbmZvICppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2x0YzM2NzYuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2x0YzM2NzYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmI0NzZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbHRjMzY3Ni5jCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEdhdGV3b3JrcyBDb3Jwb3JhdGlvbiwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3Ivb2ZfcmVndWxhdG9yLmg+CisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJsdGMzNjc2IgorCisvKiBMVEMzNjc2IFJlZ2lzdGVycyAqLworI2RlZmluZSBMVEMzNjc2X0JVQ0sxICAgICAweDAxCisjZGVmaW5lIExUQzM2NzZfQlVDSzIgICAgIDB4MDIKKyNkZWZpbmUgTFRDMzY3Nl9CVUNLMyAgICAgMHgwMworI2RlZmluZSBMVEMzNjc2X0JVQ0s0ICAgICAweDA0CisjZGVmaW5lIExUQzM2NzZfTERPQSAgICAgIDB4MDUKKyNkZWZpbmUgTFRDMzY3Nl9MRE9CICAgICAgMHgwNgorI2RlZmluZSBMVEMzNjc2X1NRRDEgICAgICAweDA3CisjZGVmaW5lIExUQzM2NzZfU1FEMiAgICAgIDB4MDgKKyNkZWZpbmUgTFRDMzY3Nl9DTlRSTCAgICAgMHgwOQorI2RlZmluZSBMVEMzNjc2X0RWQjFBICAgICAweDBBCisjZGVmaW5lIExUQzM2NzZfRFZCMUIgICAgIDB4MEIKKyNkZWZpbmUgTFRDMzY3Nl9EVkIyQSAgICAgMHgwQworI2RlZmluZSBMVEMzNjc2X0RWQjJCICAgICAweDBECisjZGVmaW5lIExUQzM2NzZfRFZCM0EgICAgIDB4MEUKKyNkZWZpbmUgTFRDMzY3Nl9EVkIzQiAgICAgMHgwRgorI2RlZmluZSBMVEMzNjc2X0RWQjRBICAgICAweDEwCisjZGVmaW5lIExUQzM2NzZfRFZCNEIgICAgIDB4MTEKKyNkZWZpbmUgTFRDMzY3Nl9NU0tJUlEgICAgMHgxMgorI2RlZmluZSBMVEMzNjc2X01TS1BHICAgICAweDEzCisjZGVmaW5lIExUQzM2NzZfVVNFUiAgICAgIDB4MTQKKyNkZWZpbmUgTFRDMzY3Nl9JUlFTVEFUICAgMHgxNQorI2RlZmluZSBMVEMzNjc2X1BHU1RBVEwgICAweDE2CisjZGVmaW5lIExUQzM2NzZfUEdTVEFUUlQgIDB4MTcKKyNkZWZpbmUgTFRDMzY3Nl9IUlNUICAgICAgMHgxRQorI2RlZmluZSBMVEMzNjc2X0NMSVJRICAgICAweDFGCisKKyNkZWZpbmUgTFRDMzY3Nl9EVkJ4QV9SRUZfU0VMRUNUCUJJVCg1KQorCisjZGVmaW5lIExUQzM2NzZfSVJRU1RBVF9QR09PRF9USU1FT1VUCUJJVCgzKQorI2RlZmluZSBMVEMzNjc2X0lSUVNUQVRfVU5ERVJWT0xUX1dBUk4JQklUKDQpCisjZGVmaW5lIExUQzM2NzZfSVJRU1RBVF9VTkRFUlZPTFRfRkFVTFQJQklUKDUpCisjZGVmaW5lIExUQzM2NzZfSVJRU1RBVF9USEVSTUFMX1dBUk4JQklUKDYpCisjZGVmaW5lIExUQzM2NzZfSVJRU1RBVF9USEVSTUFMX0ZBVUxUCUJJVCg3KQorCitlbnVtIGx0YzM2NzZfcmVnIHsKKwlMVEMzNjc2X1NXMSwKKwlMVEMzNjc2X1NXMiwKKwlMVEMzNjc2X1NXMywKKwlMVEMzNjc2X1NXNCwKKwlMVEMzNjc2X0xETzEsCisJTFRDMzY3Nl9MRE8yLAorCUxUQzM2NzZfTERPMywKKwlMVEMzNjc2X0xETzQsCisJTFRDMzY3Nl9OVU1fUkVHVUxBVE9SUywKK307CisKK3N0cnVjdCBsdGMzNjc2IHsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCByZWd1bGF0b3JfZGVzYyByZWd1bGF0b3JfZGVzY3NbTFRDMzY3Nl9OVU1fUkVHVUxBVE9SU107CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZ3VsYXRvcnNbTFRDMzY3Nl9OVU1fUkVHVUxBVE9SU107Cit9OworCitzdGF0aWMgaW50IGx0YzM2NzZfc2V0X3N1c3BlbmRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IHVWKQoreworCXN0cnVjdCBsdGMzNjc2ICpsdGMzNjc2ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBsdGMzNjc2LT5kZXY7CisJaW50IGRjZGMgPSByZGV2X2dldF9pZChyZGV2KTsKKwlpbnQgc2VsOworCisJZGV2X2RiZyhkZXYsICIlcyBpZD0lZCB1Vj0lZFxuIiwgX19mdW5jX18sIGRjZGMsIHVWKTsKKwlzZWwgPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyKHJkZXYsIHVWLCB1Vik7CisJaWYgKHNlbCA8IDApCisJCXJldHVybiBzZWw7CisKKwkvKiBEVkJCIHJlZ2lzdGVyIGZvbGxvd3MgcmlnaHQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgRFZCQSByZWdpc3RlciAqLworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMobHRjMzY3Ni0+cmVnbWFwLCByZGV2LT5kZXNjLT52c2VsX3JlZyArIDEsCisJCQkJICByZGV2LT5kZXNjLT52c2VsX21hc2ssIHNlbCk7Cit9CisKK3N0YXRpYyBpbnQgbHRjMzY3Nl9zZXRfc3VzcGVuZF9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgbHRjMzY3NiAqbHRjMzY3Nj0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBsdGMzNjc2LT5kZXY7CisJaW50IG1hc2ssIHZhbDsKKwlpbnQgZGNkYyA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCisJZGV2X2RiZyhkZXYsICIlcyBpZD0lZCBtb2RlPSVkXG4iLCBfX2Z1bmNfXywgZGNkYywgbW9kZSk7CisKKwltYXNrID0gTFRDMzY3Nl9EVkJ4QV9SRUZfU0VMRUNUOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgUkVHVUxBVE9SX01PREVfU1RBTkRCWToKKwkJdmFsID0gMDsgLyogc2VsZWN0IERWQnhBICovCisJCWJyZWFrOworCWNhc2UgUkVHVUxBVE9SX01PREVfTk9STUFMOgorCQl2YWwgPSBMVEMzNjc2X0RWQnhBX1JFRl9TRUxFQ1Q7IC8qIHNlbGVjdCBEVkJ4QiAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmcmRldi0+ZGV2LCAiJXM6IHJlZ3VsYXRvciBtb2RlOiAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkgcmRldi0+ZGVzYy0+bmFtZSwgbW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMobHRjMzY3Ni0+cmVnbWFwLCByZGV2LT5kZXNjLT52c2VsX3JlZywKKwkJCQkgIG1hc2ssIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGx0YzM2NzZfc2NhbGUodW5zaWduZWQgaW50IHVWLCB1MzIgcjEsIHUzMiByMikKK3sKKwl1aW50NjRfdCB0bXA7CisJaWYgKHVWID09IDApCisJCXJldHVybiAwOworCXRtcCA9ICh1aW50NjRfdCl1ViAqIHIxOworCWRvX2Rpdih0bXAsIHIyKTsKKwlyZXR1cm4gdVYgKyAodW5zaWduZWQgaW50KXRtcDsKK30KKworc3RhdGljIGludCBsdGMzNjc2X29mX3BhcnNlX2NiKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjICpkZXNjLAorCQkJICAgICAgIHN0cnVjdCByZWd1bGF0b3JfY29uZmlnICpjb25maWcpCit7CisJc3RydWN0IGx0YzM2NzYgKmx0YzM2NzYgPSBjb25maWctPmRyaXZlcl9kYXRhOworCXN0cnVjdCByZWd1bGF0b3JfZGVzYyAqcmRlc2MgPSAmbHRjMzY3Ni0+cmVndWxhdG9yX2Rlc2NzW2Rlc2MtPmlkXTsKKwl1MzIgclsyXTsKKwlpbnQgcmV0OworCisJLyogTERPMyBoYXMgYSBmaXhlZCBvdXRwdXQgKi8KKwlpZiAoZGVzYy0+aWQgPT0gTFRDMzY3Nl9MRE8zKQorCQlyZXR1cm4gMDsKKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KG5wLCAibGx0YyxmYi12b2x0YWdlLWRpdmlkZXIiLCByLCAyKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIobHRjMzY3Ni0+ZGV2LCAiRmFpbGVkIHRvIHBhcnNlIHZvbHRhZ2UgZGl2aWRlcjogJWRcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJkZXNjLT5taW5fdVYgPSBsdGMzNjc2X3NjYWxlKGRlc2MtPm1pbl91ViwgclswXSwgclsxXSk7CisJcmRlc2MtPnVWX3N0ZXAgPSBsdGMzNjc2X3NjYWxlKGRlc2MtPnVWX3N0ZXAsIHJbMF0sIHJbMV0pOworCXJkZXNjLT5maXhlZF91ViA9IGx0YzM2NzZfc2NhbGUoZGVzYy0+Zml4ZWRfdVYsIHJbMF0sIHJbMV0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFNXMSwgU1cyLCBTVzMsIFNXNCBsaW5lYXIgMC44Vi0zLjNWIHdpdGggc2NhbGFyIHZpYSBSMS9SMiBmZWViYWNrIHJlcyAqLworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIGx0YzM2NzZfbGluZWFyX3JlZ3VsYXRvcl9vcHMgPSB7CisJLmVuYWJsZSA9IHJlZ3VsYXRvcl9lbmFibGVfcmVnbWFwLAorCS5kaXNhYmxlID0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLAorCS5pc19lbmFibGVkID0gcmVndWxhdG9yX2lzX2VuYWJsZWRfcmVnbWFwLAorCS5saXN0X3ZvbHRhZ2UgPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhciwKKwkuc2V0X3ZvbHRhZ2Vfc2VsID0gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLmdldF92b2x0YWdlX3NlbCA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5zZXRfc3VzcGVuZF92b2x0YWdlID0gbHRjMzY3Nl9zZXRfc3VzcGVuZF92b2x0YWdlLAorCS5zZXRfc3VzcGVuZF9tb2RlID0gbHRjMzY3Nl9zZXRfc3VzcGVuZF9tb2RlLAorfTsKKworLyogTERPMSBhbHdheXMgb24gZml4ZWQgMC44Vi0zLjNWIHZpYSBzY2FsYXIgdmlhIFIxL1IyIGZlZWJhY2sgcmVzICovCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgbHRjMzY3Nl9maXhlZF9zdGFuZGJ5X3JlZ3VsYXRvcl9vcHMgPSB7Cit9OworCisvKiBMRE8yLCBMRE8zIGZpeGVkIChMRE8yIGhhcyBleHRlcm5hbCBzY2FsYXIgdmlhIFIxL1IyIGZlZWRiYWNrIHJlcykgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBsdGMzNjc2X2ZpeGVkX3JlZ3VsYXRvcl9vcHMgPSB7CisJLmVuYWJsZSA9IHJlZ3VsYXRvcl9lbmFibGVfcmVnbWFwLAorCS5kaXNhYmxlID0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLAorCS5pc19lbmFibGVkID0gcmVndWxhdG9yX2lzX2VuYWJsZWRfcmVnbWFwLAorfTsKKworI2RlZmluZSBMVEMzNjc2X1JFRyhfaWQsIF9uYW1lLCBfb3BzLCBlbl9yZWcsIGVuX2JpdCwgZHZiYV9yZWcsIGR2Yl9tYXNrKSAgIFwKKwlbTFRDMzY3Nl8gIyMgX2lkXSA9IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkubmFtZSA9ICNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJLm9mX21hdGNoID0gb2ZfbWF0Y2hfcHRyKCNfbmFtZSksICAgICAgICAgICAgICBcCisJCS5yZWd1bGF0b3JzX25vZGUgPSBvZl9tYXRjaF9wdHIoInJlZ3VsYXRvcnMiKSwgXAorCQkub2ZfcGFyc2VfY2IgPSBsdGMzNjc2X29mX3BhcnNlX2NiLCAgICAgICAgICAgIFwKKwkJLm5fdm9sdGFnZXMgPSAoZHZiX21hc2spICsgMSwgICAgICAgICAgICAgICAgICBcCisJCS5taW5fdVYgPSAoZHZiYV9yZWcpID8gNDEyNTAwIDogMCwgICAgICAgICAgICAgXAorCQkudVZfc3RlcCA9IChkdmJhX3JlZykgPyAxMjUwMCA6IDAsICAgICAgICAgICAgIFwKKwkJLnJhbXBfZGVsYXkgPSAoZHZiYV9yZWcpID8gODAwIDogMCwgICAgICAgICAgICBcCisJCS5maXhlZF91ViA9IChkdmJfbWFzaykgPyAwIDogNzI1MDAwLCAgICAgICAgICAgXAorCQkub3BzID0gJmx0YzM2NzZfICMjIF9vcHMgIyMgX3JlZ3VsYXRvcl9vcHMsICAgIFwKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwgICAgICAgICAgICAgICAgICAgICBcCisJCS5pZCA9IExUQzM2NzZfICMjIF9pZCwgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkub3duZXIgPSBUSElTX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJLnZzZWxfcmVnID0gKGR2YmFfcmVnKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisJCS52c2VsX21hc2sgPSAoZHZiX21hc2spLCAgICAgICAgICAgICAgICAgICAgICAgXAorCQkuZW5hYmxlX3JlZyA9IChlbl9yZWcpLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJLmVuYWJsZV9tYXNrID0gKDEgPDwgZW5fYml0KSwgICAgICAgICAgICAgICAgICBcCisJfQorCisjZGVmaW5lIExUQzM2NzZfTElORUFSX1JFRyhfaWQsIF9uYW1lLCBfZW4sIF9kdmJhKSAgICAgICAgICAgICAgICAgICAgIFwKKwlMVEMzNjc2X1JFRyhfaWQsIF9uYW1lLCBsaW5lYXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSAgICBMVEMzNjc2XyAjIyBfZW4sIDcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSAgICBMVEMzNjc2XyAjIyBfZHZiYSwgMHgxZikKKworI2RlZmluZSBMVEMzNjc2X0ZJWEVEX1JFRyhfaWQsIF9uYW1lLCBfZW5fcmVnLCBfZW5fYml0KSAgICAgICAgICAgICAgICBcCisJTFRDMzY3Nl9SRUcoX2lkLCBfbmFtZSwgZml4ZWQsIExUQzM2NzZfICMjIF9lbl9yZWcsIF9lbl9iaXQsIDAsIDApCisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgbHRjMzY3Nl9yZWd1bGF0b3JzW0xUQzM2NzZfTlVNX1JFR1VMQVRPUlNdID0geworCUxUQzM2NzZfTElORUFSX1JFRyhTVzEsIHN3MSwgQlVDSzEsIERWQjFBKSwKKwlMVEMzNjc2X0xJTkVBUl9SRUcoU1cyLCBzdzIsIEJVQ0syLCBEVkIyQSksCisJTFRDMzY3Nl9MSU5FQVJfUkVHKFNXMywgc3czLCBCVUNLMywgRFZCM0EpLAorCUxUQzM2NzZfTElORUFSX1JFRyhTVzQsIHN3NCwgQlVDSzQsIERWQjRBKSwKKwlMVEMzNjc2X1JFRyhMRE8xLCBsZG8xLCBmaXhlZF9zdGFuZGJ5LCAwLCAwLCAwLCAwKSwKKwlMVEMzNjc2X0ZJWEVEX1JFRyhMRE8yLCBsZG8yLCBMRE9BLCAyKSwKKwlMVEMzNjc2X0ZJWEVEX1JFRyhMRE8zLCBsZG8zLCBMRE9BLCA1KSwKKwlMVEMzNjc2X0ZJWEVEX1JFRyhMRE80LCBsZG80LCBMRE9CLCAyKSwKK307CisKK3N0YXRpYyBib29sIGx0YzM2NzZfd3JpdGVhYmxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIExUQzM2NzZfSVJRU1RBVDoKKwljYXNlIExUQzM2NzZfQlVDSzE6CisJY2FzZSBMVEMzNjc2X0JVQ0syOgorCWNhc2UgTFRDMzY3Nl9CVUNLMzoKKwljYXNlIExUQzM2NzZfQlVDSzQ6CisJY2FzZSBMVEMzNjc2X0xET0E6CisJY2FzZSBMVEMzNjc2X0xET0I6CisJY2FzZSBMVEMzNjc2X1NRRDE6CisJY2FzZSBMVEMzNjc2X1NRRDI6CisJY2FzZSBMVEMzNjc2X0NOVFJMOgorCWNhc2UgTFRDMzY3Nl9EVkIxQToKKwljYXNlIExUQzM2NzZfRFZCMUI6CisJY2FzZSBMVEMzNjc2X0RWQjJBOgorCWNhc2UgTFRDMzY3Nl9EVkIyQjoKKwljYXNlIExUQzM2NzZfRFZCM0E6CisJY2FzZSBMVEMzNjc2X0RWQjNCOgorCWNhc2UgTFRDMzY3Nl9EVkI0QToKKwljYXNlIExUQzM2NzZfRFZCNEI6CisJY2FzZSBMVEMzNjc2X01TS0lSUToKKwljYXNlIExUQzM2NzZfTVNLUEc6CisJY2FzZSBMVEMzNjc2X1VTRVI6CisJY2FzZSBMVEMzNjc2X0hSU1Q6CisJY2FzZSBMVEMzNjc2X0NMSVJROgorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBsdGMzNjc2X3JlYWRhYmxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIExUQzM2NzZfSVJRU1RBVDoKKwljYXNlIExUQzM2NzZfQlVDSzE6CisJY2FzZSBMVEMzNjc2X0JVQ0syOgorCWNhc2UgTFRDMzY3Nl9CVUNLMzoKKwljYXNlIExUQzM2NzZfQlVDSzQ6CisJY2FzZSBMVEMzNjc2X0xET0E6CisJY2FzZSBMVEMzNjc2X0xET0I6CisJY2FzZSBMVEMzNjc2X1NRRDE6CisJY2FzZSBMVEMzNjc2X1NRRDI6CisJY2FzZSBMVEMzNjc2X0NOVFJMOgorCWNhc2UgTFRDMzY3Nl9EVkIxQToKKwljYXNlIExUQzM2NzZfRFZCMUI6CisJY2FzZSBMVEMzNjc2X0RWQjJBOgorCWNhc2UgTFRDMzY3Nl9EVkIyQjoKKwljYXNlIExUQzM2NzZfRFZCM0E6CisJY2FzZSBMVEMzNjc2X0RWQjNCOgorCWNhc2UgTFRDMzY3Nl9EVkI0QToKKwljYXNlIExUQzM2NzZfRFZCNEI6CisJY2FzZSBMVEMzNjc2X01TS0lSUToKKwljYXNlIExUQzM2NzZfTVNLUEc6CisJY2FzZSBMVEMzNjc2X1VTRVI6CisJY2FzZSBMVEMzNjc2X0hSU1Q6CisJY2FzZSBMVEMzNjc2X0NMSVJROgorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBsdGMzNjc2X3ZvbGF0aWxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIExUQzM2NzZfSVJRU1RBVDoKKwljYXNlIExUQzM2NzZfUEdTVEFUTDoKKwljYXNlIExUQzM2NzZfUEdTVEFUUlQ6CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBsdGMzNjc2X3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSA4LAorCS53cml0ZWFibGVfcmVnID0gbHRjMzY3Nl93cml0ZWFibGVfcmVnLAorCS5yZWFkYWJsZV9yZWcgPSBsdGMzNjc2X3JlYWRhYmxlX3JlZywKKwkudm9sYXRpbGVfcmVnID0gbHRjMzY3Nl92b2xhdGlsZV9yZWcsCisJLm1heF9yZWdpc3RlciA9IExUQzM2NzZfQ0xJUlEsCisJLnVzZV9zaW5nbGVfcncgPSB0cnVlLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorfTsKKworc3RhdGljIGlycXJldHVybl90IGx0YzM2NzZfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbHRjMzY3NiAqbHRjMzY3NiA9IGRldl9pZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBsdGMzNjc2LT5kZXY7CisJdW5zaWduZWQgaW50IGksIGlycXN0YXQsIGV2ZW50OworCisJcmVnbWFwX3JlYWQobHRjMzY3Ni0+cmVnbWFwLCBMVEMzNjc2X0lSUVNUQVQsICZpcnFzdGF0KTsKKworCWRldl9kYmcoZGV2LCAiaXJxJWQgaXJxc3RhdD0weCUwMnhcbiIsIGlycSwgaXJxc3RhdCk7CisJaWYgKGlycXN0YXQgJiBMVEMzNjc2X0lSUVNUQVRfVEhFUk1BTF9XQVJOKSB7CisJCWRldl93YXJuKGRldiwgIk92ZXItdGVtcGVyYXR1cmUgV2FybmluZ1xuIik7CisJCWV2ZW50ID0gUkVHVUxBVE9SX0VWRU5UX09WRVJfVEVNUDsKKwkJZm9yIChpID0gMDsgaSA8IExUQzM2NzZfTlVNX1JFR1VMQVRPUlM7IGkrKykKKwkJCXJlZ3VsYXRvcl9ub3RpZmllcl9jYWxsX2NoYWluKGx0YzM2NzYtPnJlZ3VsYXRvcnNbaV0sCisJCQkJCQkgICAgICBldmVudCwgTlVMTCk7CisJfQorCisJaWYgKGlycXN0YXQgJiBMVEMzNjc2X0lSUVNUQVRfVU5ERVJWT0xUX1dBUk4pIHsKKwkJZGV2X2luZm8oZGV2LCAiVW5kZXJ2b2x0YWdlIFdhcm5pbmdcbiIpOworCQlldmVudCA9IFJFR1VMQVRPUl9FVkVOVF9VTkRFUl9WT0xUQUdFOworCQlmb3IgKGkgPSAwOyBpIDwgTFRDMzY3Nl9OVU1fUkVHVUxBVE9SUzsgaSsrKQorCQkJcmVndWxhdG9yX25vdGlmaWVyX2NhbGxfY2hhaW4obHRjMzY3Ni0+cmVndWxhdG9yc1tpXSwKKwkJCQkJCSAgICAgIGV2ZW50LCBOVUxMKTsKKwl9CisKKwkvKiBDbGVhciB3YXJuaW5nIGNvbmRpdGlvbiAqLworCXJlZ21hcF93cml0ZShsdGMzNjc2LT5yZWdtYXAsIExUQzM2NzZfQ0xJUlEsIDApOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGx0YzM2NzZfcmVndWxhdG9yX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKmluaXRfZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgKmRlc2NzOworCXN0cnVjdCBsdGMzNjc2ICpsdGMzNjc2OworCWludCBpLCByZXQ7CisKKwlsdGMzNjc2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpsdGMzNjc2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsdGMzNjc2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGx0YzM2NzYpOworCWx0YzM2NzYtPmRldiA9IGRldjsKKworCWRlc2NzID0gbHRjMzY3Ni0+cmVndWxhdG9yX2Rlc2NzOworCW1lbWNweShkZXNjcywgbHRjMzY3Nl9yZWd1bGF0b3JzLCBzaXplb2YobHRjMzY3Nl9yZWd1bGF0b3JzKSk7CisJZGVzY3NbTFRDMzY3Nl9MRE8zXS5maXhlZF91ViA9IDE4MDAwMDA7IC8qIExETzMgaXMgZml4ZWQgMS44ViAqLworCisJbHRjMzY3Ni0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmbHRjMzY3Nl9yZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKGx0YzM2NzYtPnJlZ21hcCkpIHsKKwkJcmV0ID0gUFRSX0VSUihsdGMzNjc2LT5yZWdtYXApOworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIHJlZ21hcDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IExUQzM2NzZfTlVNX1JFR1VMQVRPUlM7IGkrKykgeworCQlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgKmRlc2MgPSAmbHRjMzY3Ni0+cmVndWxhdG9yX2Rlc2NzW2ldOworCQlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07CisKKwkJaWYgKGluaXRfZGF0YSkKKwkJCWNvbmZpZy5pbml0X2RhdGEgPSAmaW5pdF9kYXRhW2ldOworCisJCWNvbmZpZy5kZXYgPSBkZXY7CisJCWNvbmZpZy5kcml2ZXJfZGF0YSA9IGx0YzM2NzY7CisKKwkJbHRjMzY3Ni0+cmVndWxhdG9yc1tpXSA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKGRldiwgZGVzYywKKwkJCQkJCQkJICZjb25maWcpOworCQlpZiAoSVNfRVJSKGx0YzM2NzYtPnJlZ3VsYXRvcnNbaV0pKSB7CisJCQlyZXQgPSBQVFJfRVJSKGx0YzM2NzYtPnJlZ3VsYXRvcnNbaV0pOworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgcmVndWxhdG9yICVzOiAlZFxuIiwKKwkJCQlkZXNjLT5uYW1lLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJlZ21hcF93cml0ZShsdGMzNjc2LT5yZWdtYXAsIExUQzM2NzZfQ0xJUlEsIDApOworCWlmIChjbGllbnQtPmlycSkgeworCQlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKGRldiwgY2xpZW50LT5pcnEsIE5VTEwsCisJCQkJCQlsdGMzNjc2X2lzciwKKwkJCQkJCUlSUUZfVFJJR0dFUl9MT1cgfCBJUlFGX09ORVNIT1QsCisJCQkJCQljbGllbnQtPm5hbWUsIGx0YzM2NzYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXF1ZXN0IElSUTogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsdGMzNjc2X2kyY19pZFtdID0geworCXsgImx0YzM2NzYiIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGx0YzM2NzZfaTJjX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGx0YzM2NzZfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJJVkVSX05BTUUsCisJfSwKKwkucHJvYmUgPSBsdGMzNjc2X3JlZ3VsYXRvcl9wcm9iZSwKKwkuaWRfdGFibGUgPSBsdGMzNjc2X2kyY19pZCwKK307Cittb2R1bGVfaTJjX2RyaXZlcihsdGMzNjc2X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlRpbSBIYXJ2ZXkgPHRoYXJ2ZXlAZ2F0ZXdvcmtzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVndWxhdG9yIGRyaXZlciBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDMTM3NiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4MTQ1NzctcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXgxNDU3Ny1yZWd1bGF0b3IuYwppbmRleCBiMmRhYTY2Li5jOWZmMjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXgxNDU3Ny1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXgxNDU3Ny1yZWd1bGF0b3IuYwpAQCAtMiw3ICsyLDcgQEAKICAqIG1heDE0NTc3LmMgLSBSZWd1bGF0b3IgZHJpdmVyIGZvciB0aGUgTWF4aW0gMTQ1NzcvNzc4MzYKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTMsMjAxNCBTYW1zdW5nIEVsZWN0cm9uaWNzCi0gKiBLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraUBzYW1zdW5nLmNvbT4KKyAqIEtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTMzMSw3ICszMzEsNyBAQAogfQogbW9kdWxlX2V4aXQobWF4MTQ1NzdfcmVndWxhdG9yX2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKCJLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIktyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTWF4aW0gMTQ1NzcvNzc4MzYgcmVndWxhdG9yIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTptYXgxNDU3Ny1yZWd1bGF0b3IiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDc3NjkzLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4Nzc2OTMtcmVndWxhdG9yLmMKaW5kZXggZGU3MzBmZC4uY2ZiYjk1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4Nzc2OTMtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4Nzc2OTMtcmVndWxhdG9yLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTUgU2Ftc3VuZyBFbGVjdHJvbmljcwogICogSm9uZ2h3YSBMZWUgPGpvbmdod2EzLmxlZUBzYW1zdW5nLmNvbT4KLSAqIEtyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpLmtAZ21haWwuY29tPgorICogS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMzE0LDUgKzMxNCw1IEBACiAKIE1PRFVMRV9ERVNDUklQVElPTigiTUFYSU0gNzc2OTMvNzc4NDMgcmVndWxhdG9yIGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiSm9uZ2h3YSBMZWUgPGpvbmdod2EzLmxlZUBzYW1zdW5nLmNvbT4iKTsKLU1PRFVMRV9BVVRIT1IoIktyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpLmtAZ21haWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvcHY4ODA4MC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3B2ODgwODAtcmVndWxhdG9yLmMKaW5kZXggODE5NTBiZC4uOTU0YTIwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvcHY4ODA4MC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9wdjg4MDgwLXJlZ3VsYXRvci5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KQEAgLTI2LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3Ivb2ZfcmVndWxhdG9yLmg+CiAjaW5jbHVkZSAicHY4ODA4MC1yZWd1bGF0b3IuaCIKIAotI2RlZmluZSBQVjg4MDgwX01BWF9SRUdVTEFUT1JTCTMKKyNkZWZpbmUgUFY4ODA4MF9NQVhfUkVHVUxBVE9SUwk0CiAKIC8qIFBWODgwODAgUkVHVUxBVE9SIElEcyAqLwogZW51bSB7CkBAIC0zNCw2ICszNSwxMiBAQAogCVBWODgwODBfSURfQlVDSzEsCiAJUFY4ODA4MF9JRF9CVUNLMiwKIAlQVjg4MDgwX0lEX0JVQ0szLAorCVBWODgwODBfSURfSFZCVUNLLAorfTsKKworZW51bSBwdjg4MDgwX3R5cGVzIHsKKwlUWVBFX1BWODgwODBfQUEsCisJVFlQRV9QVjg4MDgwX0JBLAogfTsKIAogc3RydWN0IHB2ODgwODBfcmVndWxhdG9yIHsKQEAgLTQyLDcgKzQ5LDggQEAKIAl1bnNpZ25lZCBpbnQgbl9jdXJyZW50X2xpbWl0czsKIAljb25zdCBpbnQgKmN1cnJlbnRfbGltaXRzOwogCXVuc2lnbmVkIGludCBsaW1pdF9tYXNrOwotCXVuc2lnbmVkIGludCBjb25mOworCXVuc2lnbmVkIGludCBtb2RlX3JlZzsKKwl1bnNpZ25lZCBpbnQgbGltaXRfcmVnOwogCXVuc2lnbmVkIGludCBjb25mMjsKIAl1bnNpZ25lZCBpbnQgY29uZjU7CiB9OwpAQCAtNTEsNiArNTksOCBAQAogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXZbUFY4ODA4MF9NQVhfUkVHVUxBVE9SU107CisJdW5zaWduZWQgbG9uZyB0eXBlOworCWNvbnN0IHN0cnVjdCBwdjg4MDgwX2NvbXBhdGlibGVfcmVnbWFwICpyZWdtYXBfY29uZmlnOwogfTsKIAogc3RydWN0IHB2ODgwODBfYnVja192b2x0YWdlIHsKQEAgLTU5LDYgKzY5LDMwIEBACiAJaW50IHVWX3N0ZXA7CiB9OwogCitzdHJ1Y3QgcHY4ODA4MF9idWNrX3JlZ21hcCB7CisJLyogUkVHUyAqLworCWludCBidWNrX2VuYWJsZV9yZWc7CisJaW50IGJ1Y2tfdnNlbF9yZWc7CisJaW50IGJ1Y2tfbW9kZV9yZWc7CisJaW50IGJ1Y2tfbGltaXRfcmVnOworCWludCBidWNrX3ZkYWNfcmFuZ2VfcmVnOworCWludCBidWNrX3ZyYW5nZV9nYWluX3JlZzsKKwkvKiBNQVNLUyAqLworCWludCBidWNrX2VuYWJsZV9tYXNrOworCWludCBidWNrX3ZzZWxfbWFzazsKKwlpbnQgYnVja19saW1pdF9tYXNrOworfTsKKworc3RydWN0IHB2ODgwODBfY29tcGF0aWJsZV9yZWdtYXAgeworCS8qIEJVQ0sxLCAyLCAzICovCisJc3RydWN0IHB2ODgwODBfYnVja19yZWdtYXAgYnVja19yZWdtYXBbUFY4ODA4MF9NQVhfUkVHVUxBVE9SUy0xXTsKKwkvKiBIVkJVQ0sgKi8KKwlpbnQgaHZidWNrX2VuYWJsZV9yZWc7CisJaW50IGh2YnVja192c2VsX3JlZzsKKwlpbnQgaHZidWNrX2VuYWJsZV9tYXNrOworCWludCBodmJ1Y2tfdnNlbF9tYXNrOworfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHB2ODgwODBfcmVnbWFwX2NvbmZpZyA9IHsKIAkucmVnX2JpdHMgPSA4LAogCS52YWxfYml0cyA9IDgsCkBAIC04OSwxMyArMTIzLDExMSBAQAogCX0sCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHB2ODgwODBfY29tcGF0aWJsZV9yZWdtYXAgcHY4ODA4MF9hYV9yZWdzID0geworCS8qIEJVQ0sxICovCisJLmJ1Y2tfcmVnbWFwWzBdID0geworCQkuYnVja19lbmFibGVfcmVnICAgICAgPSBQVjg4MDgwQUFfUkVHX0JVQ0sxX0NPTkYwLAorCQkuYnVja192c2VsX3JlZyAgICAgICAgPSBQVjg4MDgwQUFfUkVHX0JVQ0sxX0NPTkYwLAorCQkuYnVja19tb2RlX3JlZyAgICAgICAgPSBQVjg4MDgwQUFfUkVHX0JVQ0sxX0NPTkYxLAorCQkuYnVja19saW1pdF9yZWcgICAgICAgPSBQVjg4MDgwQUFfUkVHX0JVQ0sxX0NPTkYxLAorCQkuYnVja192ZGFjX3JhbmdlX3JlZyAgPSBQVjg4MDgwQUFfUkVHX0JVQ0sxX0NPTkYyLAorCQkuYnVja192cmFuZ2VfZ2Fpbl9yZWcgPSBQVjg4MDgwQUFfUkVHX0JVQ0sxX0NPTkY1LAorCQkuYnVja19lbmFibGVfbWFzayAgICAgPSBQVjg4MDgwX0JVQ0sxX0VOLAorCQkuYnVja192c2VsX21hc2sgICAgICAgPSBQVjg4MDgwX1ZCVUNLMV9NQVNLLAorCQkuYnVja19saW1pdF9tYXNrICAgICAgPSBQVjg4MDgwX0JVQ0sxX0lMSU1fTUFTSywKKwl9LAorCS8qIEJVQ0syICovCisJLmJ1Y2tfcmVnbWFwWzFdID0geworCQkuYnVja19lbmFibGVfcmVnICAgICAgPSBQVjg4MDgwQUFfUkVHX0JVQ0syX0NPTkYwLAorCQkuYnVja192c2VsX3JlZyAgICAgICAgPSBQVjg4MDgwQUFfUkVHX0JVQ0syX0NPTkYwLAorCQkuYnVja19tb2RlX3JlZyAgICAgICAgPSBQVjg4MDgwQUFfUkVHX0JVQ0syX0NPTkYxLAorCQkuYnVja19saW1pdF9yZWcJICAgICAgPSBQVjg4MDgwQUFfUkVHX0JVQ0syX0NPTkYxLAorCQkuYnVja192ZGFjX3JhbmdlX3JlZyAgPSBQVjg4MDgwQUFfUkVHX0JVQ0syX0NPTkYyLAorCQkuYnVja192cmFuZ2VfZ2Fpbl9yZWcgPSBQVjg4MDgwQUFfUkVHX0JVQ0syX0NPTkY1LAorCQkuYnVja19lbmFibGVfbWFzawkgID0gUFY4ODA4MF9CVUNLMl9FTiwKKwkJLmJ1Y2tfdnNlbF9tYXNrICAgICAgID0gUFY4ODA4MF9WQlVDSzJfTUFTSywKKwkJLmJ1Y2tfbGltaXRfbWFzayAgICAgID0gUFY4ODA4MF9CVUNLMl9JTElNX01BU0ssCisJfSwKKwkvKiBCVUNLMyAqLworCS5idWNrX3JlZ21hcFsyXSA9IHsKKwkJLmJ1Y2tfZW5hYmxlX3JlZwkgID0gUFY4ODA4MEFBX1JFR19CVUNLM19DT05GMCwKKwkJLmJ1Y2tfdnNlbF9yZWcgICAgICAgID0gUFY4ODA4MEFBX1JFR19CVUNLM19DT05GMCwKKwkJLmJ1Y2tfbW9kZV9yZWcgICAgICAgID0gUFY4ODA4MEFBX1JFR19CVUNLM19DT05GMSwKKwkJLmJ1Y2tfbGltaXRfcmVnCSAgICAgID0gUFY4ODA4MEFBX1JFR19CVUNLM19DT05GMSwKKwkJLmJ1Y2tfdmRhY19yYW5nZV9yZWcgID0gUFY4ODA4MEFBX1JFR19CVUNLM19DT05GMiwKKwkJLmJ1Y2tfdnJhbmdlX2dhaW5fcmVnID0gUFY4ODA4MEFBX1JFR19CVUNLM19DT05GNSwKKwkJLmJ1Y2tfZW5hYmxlX21hc2sJICA9IFBWODgwODBfQlVDSzNfRU4sCisJCS5idWNrX3ZzZWxfbWFzayAgICAgICA9IFBWODgwODBfVkJVQ0szX01BU0ssCisJCS5idWNrX2xpbWl0X21hc2sgICAgICA9IFBWODgwODBfQlVDSzNfSUxJTV9NQVNLLAorCX0sCisJLyogSFZCVUNLICovCisJLmh2YnVja19lbmFibGVfcmVnCSAgICAgID0gUFY4ODA4MEFBX1JFR19IVkJVQ0tfQ09ORjIsCisJLmh2YnVja192c2VsX3JlZyAgICAgICAgICA9IFBWODgwODBBQV9SRUdfSFZCVUNLX0NPTkYxLAorCS5odmJ1Y2tfZW5hYmxlX21hc2sgICAgICAgPSBQVjg4MDgwX0hWQlVDS19FTiwKKwkuaHZidWNrX3ZzZWxfbWFzayAgICAgICAgID0gUFY4ODA4MF9WSFZCVUNLX01BU0ssCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHB2ODgwODBfY29tcGF0aWJsZV9yZWdtYXAgcHY4ODA4MF9iYV9yZWdzID0geworCS8qIEJVQ0sxICovCisJLmJ1Y2tfcmVnbWFwWzBdID0geworCQkuYnVja19lbmFibGVfcmVnCSAgPSBQVjg4MDgwQkFfUkVHX0JVQ0sxX0NPTkYwLAorCQkuYnVja192c2VsX3JlZyAgICAgICAgPSBQVjg4MDgwQkFfUkVHX0JVQ0sxX0NPTkYwLAorCQkuYnVja19tb2RlX3JlZyAgICAgICAgPSBQVjg4MDgwQkFfUkVHX0JVQ0sxX0NPTkYxLAorCQkuYnVja19saW1pdF9yZWcgICAgICAgPSBQVjg4MDgwQkFfUkVHX0JVQ0sxX0NPTkYxLAorCQkuYnVja192ZGFjX3JhbmdlX3JlZyAgPSBQVjg4MDgwQkFfUkVHX0JVQ0sxX0NPTkYyLAorCQkuYnVja192cmFuZ2VfZ2Fpbl9yZWcgPSBQVjg4MDgwQkFfUkVHX0JVQ0sxX0NPTkY1LAorCQkuYnVja19lbmFibGVfbWFzayAgICAgPSBQVjg4MDgwX0JVQ0sxX0VOLAorCQkuYnVja192c2VsX21hc2sgICAgICAgPSBQVjg4MDgwX1ZCVUNLMV9NQVNLLAorCQkuYnVja19saW1pdF9tYXNrCSAgPSBQVjg4MDgwX0JVQ0sxX0lMSU1fTUFTSywKKwl9LAorCS8qIEJVQ0syICovCisJLmJ1Y2tfcmVnbWFwWzFdID0geworCQkuYnVja19lbmFibGVfcmVnCSAgPSBQVjg4MDgwQkFfUkVHX0JVQ0syX0NPTkYwLAorCQkuYnVja192c2VsX3JlZyAgICAgICAgPSBQVjg4MDgwQkFfUkVHX0JVQ0syX0NPTkYwLAorCQkuYnVja19tb2RlX3JlZyAgICAgICAgPSBQVjg4MDgwQkFfUkVHX0JVQ0syX0NPTkYxLAorCQkuYnVja19saW1pdF9yZWcJICAgICAgPSBQVjg4MDgwQkFfUkVHX0JVQ0syX0NPTkYxLAorCQkuYnVja192ZGFjX3JhbmdlX3JlZyAgPSBQVjg4MDgwQkFfUkVHX0JVQ0syX0NPTkYyLAorCQkuYnVja192cmFuZ2VfZ2Fpbl9yZWcgPSBQVjg4MDgwQkFfUkVHX0JVQ0syX0NPTkY1LAorCQkuYnVja19lbmFibGVfbWFzawkgID0gUFY4ODA4MF9CVUNLMl9FTiwKKwkJLmJ1Y2tfdnNlbF9tYXNrICAgICAgID0gUFY4ODA4MF9WQlVDSzJfTUFTSywKKwkJLmJ1Y2tfbGltaXRfbWFzawkgID0gUFY4ODA4MF9CVUNLMl9JTElNX01BU0ssCisJfSwKKwkvKiBCVUNLMyAqLworCS5idWNrX3JlZ21hcFsyXSA9IHsKKwkJLmJ1Y2tfZW5hYmxlX3JlZwkgID0gUFY4ODA4MEJBX1JFR19CVUNLM19DT05GMCwKKwkJLmJ1Y2tfdnNlbF9yZWcgICAgICAgID0gUFY4ODA4MEJBX1JFR19CVUNLM19DT05GMCwKKwkJLmJ1Y2tfbW9kZV9yZWcgICAgICAgID0gUFY4ODA4MEJBX1JFR19CVUNLM19DT05GMSwKKwkJLmJ1Y2tfbGltaXRfcmVnCSAgICAgID0gUFY4ODA4MEJBX1JFR19CVUNLM19DT05GMSwKKwkJLmJ1Y2tfdmRhY19yYW5nZV9yZWcgID0gUFY4ODA4MEJBX1JFR19CVUNLM19DT05GMiwKKwkJLmJ1Y2tfdnJhbmdlX2dhaW5fcmVnID0gUFY4ODA4MEJBX1JFR19CVUNLM19DT05GNSwKKwkJLmJ1Y2tfZW5hYmxlX21hc2sJICA9IFBWODgwODBfQlVDSzNfRU4sCisJCS5idWNrX3ZzZWxfbWFzayAgICAgICA9IFBWODgwODBfVkJVQ0szX01BU0ssCisJCS5idWNrX2xpbWl0X21hc2sJICA9IFBWODgwODBfQlVDSzNfSUxJTV9NQVNLLAorCX0sCisJLyogSFZCVUNLICovCisJLmh2YnVja19lbmFibGVfcmVnCSAgICAgID0gUFY4ODA4MEJBX1JFR19IVkJVQ0tfQ09ORjIsCisJLmh2YnVja192c2VsX3JlZyAgICAgICAgICA9IFBWODgwODBCQV9SRUdfSFZCVUNLX0NPTkYxLAorCS5odmJ1Y2tfZW5hYmxlX21hc2sgICAgICAgPSBQVjg4MDgwX0hWQlVDS19FTiwKKwkuaHZidWNrX3ZzZWxfbWFzawkJICA9IFBWODgwODBfVkhWQlVDS19NQVNLLAorfTsKKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcHY4ODA4MF9kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInB2cyxwdjg4MDgwIiwgICAgLmRhdGEgPSAodm9pZCAqKVRZUEVfUFY4ODA4MF9BQSB9LAorCXsgLmNvbXBhdGlibGUgPSAicHZzLHB2ODgwODAtYWEiLCAuZGF0YSA9ICh2b2lkICopVFlQRV9QVjg4MDgwX0FBIH0sCisJeyAuY29tcGF0aWJsZSA9ICJwdnMscHY4ODA4MC1iYSIsIC5kYXRhID0gKHZvaWQgKilUWVBFX1BWODgwODBfQkEgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBwdjg4MDgwX2R0X2lkcyk7CisjZW5kaWYKKwogc3RhdGljIHVuc2lnbmVkIGludCBwdjg4MDgwX2J1Y2tfZ2V0X21vZGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7CiAJc3RydWN0IHB2ODgwODBfcmVndWxhdG9yICppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAl1bnNpZ25lZCBpbnQgZGF0YTsKIAlpbnQgcmV0LCBtb2RlID0gMDsKIAotCXJldCA9IHJlZ21hcF9yZWFkKHJkZXYtPnJlZ21hcCwgaW5mby0+Y29uZiwgJmRhdGEpOworCXJldCA9IHJlZ21hcF9yZWFkKHJkZXYtPnJlZ21hcCwgaW5mby0+bW9kZV9yZWcsICZkYXRhKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTM2LDcgKzI2OCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocmRldi0+cmVnbWFwLCBpbmZvLT5jb25mLAorCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocmRldi0+cmVnbWFwLCBpbmZvLT5tb2RlX3JlZywKIAkJCQkJUFY4ODA4MF9CVUNLMV9NT0RFX01BU0ssIHZhbCk7CiB9CiAKQEAgLTE1MSw3ICsyODMsNyBAQAogCQlpZiAobWluIDw9IGluZm8tPmN1cnJlbnRfbGltaXRzW2ldCiAJCQkmJiBtYXggPj0gaW5mby0+Y3VycmVudF9saW1pdHNbaV0pIHsKIAkJCQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJkZXYtPnJlZ21hcCwKLQkJCQkJaW5mby0+Y29uZiwKKwkJCQkJaW5mby0+bGltaXRfcmVnLAogCQkJCQlpbmZvLT5saW1pdF9tYXNrLAogCQkJCQlpIDw8IFBWODgwODBfQlVDSzFfSUxJTV9TSElGVCk7CiAJCX0KQEAgLTE2Niw3ICsyOTgsNyBAQAogCXVuc2lnbmVkIGludCBkYXRhOwogCWludCByZXQ7CiAKLQlyZXQgPSByZWdtYXBfcmVhZChyZGV2LT5yZWdtYXAsIGluZm8tPmNvbmYsICZkYXRhKTsKKwlyZXQgPSByZWdtYXBfcmVhZChyZGV2LT5yZWdtYXAsIGluZm8tPmxpbWl0X3JlZywgJmRhdGEpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xODcsNiArMzE5LDE1IEBACiAJLmdldF9jdXJyZW50X2xpbWl0ID0gcHY4ODA4MF9nZXRfY3VycmVudF9saW1pdCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBwdjg4MDgwX2h2YnVja19vcHMgPSB7CisJLmVuYWJsZSA9IHJlZ3VsYXRvcl9lbmFibGVfcmVnbWFwLAorCS5kaXNhYmxlID0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLAorCS5pc19lbmFibGVkID0gcmVndWxhdG9yX2lzX2VuYWJsZWRfcmVnbWFwLAorCS5zZXRfdm9sdGFnZV9zZWwgPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkuZ2V0X3ZvbHRhZ2Vfc2VsID0gcmVndWxhdG9yX2dldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLmxpc3Rfdm9sdGFnZSA9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2VfbGluZWFyLAorfTsKKwogI2RlZmluZSBQVjg4MDgwX0JVQ0soY2hpcCwgcmVnbF9uYW1lLCBtaW4sIHN0ZXAsIG1heCwgbGltaXRzX2FycmF5KSBcCiB7XAogCS5kZXNjCT0Je1wKQEAgLTIwMCwxNyArMzQxLDI1IEBACiAJCS5taW5fdVYgPSBtaW4sIFwKIAkJLnVWX3N0ZXAgPSBzdGVwLCBcCiAJCS5uX3ZvbHRhZ2VzID0gKChtYXgpIC0gKG1pbikpLyhzdGVwKSArIDEsIFwKLQkJLmVuYWJsZV9yZWcgPSBQVjg4MDgwX1JFR18jI3JlZ2xfbmFtZSMjX0NPTkYwLCBcCi0JCS5lbmFibGVfbWFzayA9IFBWODgwODBfIyNyZWdsX25hbWUjI19FTiwgXAotCQkudnNlbF9yZWcgPSBQVjg4MDgwX1JFR18jI3JlZ2xfbmFtZSMjX0NPTkYwLCBcCi0JCS52c2VsX21hc2sgPSBQVjg4MDgwX1YjI3JlZ2xfbmFtZSMjX01BU0ssIFwKIAl9LFwKIAkuY3VycmVudF9saW1pdHMgPSBsaW1pdHNfYXJyYXksIFwKIAkubl9jdXJyZW50X2xpbWl0cyA9IEFSUkFZX1NJWkUobGltaXRzX2FycmF5KSwgXAotCS5saW1pdF9tYXNrID0gUFY4ODA4MF8jI3JlZ2xfbmFtZSMjX0lMSU1fTUFTSywgXAotCS5jb25mID0gUFY4ODA4MF9SRUdfIyNyZWdsX25hbWUjI19DT05GMSwgXAotCS5jb25mMiA9IFBWODgwODBfUkVHXyMjcmVnbF9uYW1lIyNfQ09ORjIsIFwKLQkuY29uZjUgPSBQVjg4MDgwX1JFR18jI3JlZ2xfbmFtZSMjX0NPTkY1LCBcCit9CisKKyNkZWZpbmUgUFY4ODA4MF9IVkJVQ0soY2hpcCwgcmVnbF9uYW1lLCBtaW4sIHN0ZXAsIG1heCkgXAore1wKKwkuZGVzYwk9CXtcCisJCS5pZCA9IGNoaXAjI19JRF8jI3JlZ2xfbmFtZSxcCisJCS5uYW1lID0gX19zdHJpbmdpZnkoY2hpcCMjXyMjcmVnbF9uYW1lKSxcCisJCS5vZl9tYXRjaCA9IG9mX21hdGNoX3B0cigjcmVnbF9uYW1lKSxcCisJCS5yZWd1bGF0b3JzX25vZGUgPSBvZl9tYXRjaF9wdHIoInJlZ3VsYXRvcnMiKSxcCisJCS50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsXAorCQkub3duZXIgPSBUSElTX01PRFVMRSxcCisJCS5vcHMgPSAmcHY4ODA4MF9odmJ1Y2tfb3BzLFwKKwkJLm1pbl91ViA9IG1pbiwgXAorCQkudVZfc3RlcCA9IHN0ZXAsIFwKKwkJLm5fdm9sdGFnZXMgPSAoKG1heCkgLSAobWluKSkvKHN0ZXApICsgMSwgXAorCX0sXAogfQogCiBzdGF0aWMgc3RydWN0IHB2ODgwODBfcmVndWxhdG9yIHB2ODgwODBfcmVndWxhdG9yX2luZm9bXSA9IHsKQEAgLTIyMCw2ICszNjksNyBAQAogCQlwdjg4MDgwX2J1Y2syM19saW1pdHMpLAogCVBWODgwODBfQlVDSyhQVjg4MDgwLCBCVUNLMywgNjAwMDAwLCA2MjUwLCAxMzkzNzUwLAogCQlwdjg4MDgwX2J1Y2syM19saW1pdHMpLAorCVBWODgwODBfSFZCVUNLKFBWODgwODAsIEhWQlVDSywgMCwgNTAwMCwgMTI3NTAwMCksCiB9OwogCiBzdGF0aWMgaXJxcmV0dXJuX3QgcHY4ODA4MF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQpAQCAtMjgwLDYgKzQzMCw4IEBACiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKmluaXRfZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJmkyYy0+ZGV2KTsKIAlzdHJ1Y3QgcHY4ODA4MCAqY2hpcDsKKwljb25zdCBzdHJ1Y3QgcHY4ODA4MF9jb21wYXRpYmxlX3JlZ21hcCAqcmVnbWFwX2NvbmZpZzsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07CiAJaW50IGksIGVycm9yLCByZXQ7CiAJdW5zaWduZWQgaW50IGNvbmYyLCBjb25mNTsKQEAgLTI5Nyw2ICs0NDksMTcgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAorCWlmIChpMmMtPmRldi5vZl9ub2RlKSB7CisJCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShwdjg4MDgwX2R0X2lkcywgaTJjLT5kZXYub2Zfbm9kZSk7CisJCWlmICghbWF0Y2gpIHsKKwkJCWRldl9lcnIoY2hpcC0+ZGV2LCAiRmFpbGVkIHRvIGdldCBvZl9tYXRjaF9ub2RlXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWNoaXAtPnR5cGUgPSAodW5zaWduZWQgbG9uZyltYXRjaC0+ZGF0YTsKKwl9IGVsc2UgeworCQljaGlwLT50eXBlID0gaWQtPmRyaXZlcl9kYXRhOworCX0KKwogCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGNoaXApOwogCiAJaWYgKGkyYy0+aXJxICE9IDApIHsKQEAgLTMzNiwzMSArNDk5LDU4IEBACiAJCQkJIkZhaWxlZCB0byB1cGRhdGUgbWFzayByZWc6ICVkXG4iLCByZXQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQotCiAJfSBlbHNlIHsKIAkJZGV2X3dhcm4oY2hpcC0+ZGV2LCAiTm8gSVJRIGNvbmZpZ3VyZWRcbiIpOwogCX0KIAorCXN3aXRjaCAoY2hpcC0+dHlwZSkgeworCWNhc2UgVFlQRV9QVjg4MDgwX0FBOgorCQljaGlwLT5yZWdtYXBfY29uZmlnID0gJnB2ODgwODBfYWFfcmVnczsKKwkJYnJlYWs7CisJY2FzZSBUWVBFX1BWODgwODBfQkE6CisJCWNoaXAtPnJlZ21hcF9jb25maWcgPSAmcHY4ODA4MF9iYV9yZWdzOworCQlicmVhazsKKwl9CisKKwlyZWdtYXBfY29uZmlnID0gY2hpcC0+cmVnbWFwX2NvbmZpZzsKIAljb25maWcuZGV2ID0gY2hpcC0+ZGV2OwogCWNvbmZpZy5yZWdtYXAgPSBjaGlwLT5yZWdtYXA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUFY4ODA4MF9NQVhfUkVHVUxBVE9SUzsgaSsrKSB7CisJLyogUmVnaXN0ZXJhdGlvbiBmb3IgQlVDSzEsIDIsIDMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUFY4ODA4MF9NQVhfUkVHVUxBVE9SUy0xOyBpKyspIHsKIAkJaWYgKGluaXRfZGF0YSkKIAkJCWNvbmZpZy5pbml0X2RhdGEgPSAmaW5pdF9kYXRhW2ldOwogCisJCXB2ODgwODBfcmVndWxhdG9yX2luZm9baV0ubGltaXRfcmVnCisJCQk9IHJlZ21hcF9jb25maWctPmJ1Y2tfcmVnbWFwW2ldLmJ1Y2tfbGltaXRfcmVnOworCQlwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW2ldLmxpbWl0X21hc2sKKwkJCT0gcmVnbWFwX2NvbmZpZy0+YnVja19yZWdtYXBbaV0uYnVja19saW1pdF9tYXNrOworCQlwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW2ldLm1vZGVfcmVnCisJCQk9IHJlZ21hcF9jb25maWctPmJ1Y2tfcmVnbWFwW2ldLmJ1Y2tfbW9kZV9yZWc7CisJCXB2ODgwODBfcmVndWxhdG9yX2luZm9baV0uY29uZjIKKwkJCT0gcmVnbWFwX2NvbmZpZy0+YnVja19yZWdtYXBbaV0uYnVja192ZGFjX3JhbmdlX3JlZzsKKwkJcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tpXS5jb25mNQorCQkJPSByZWdtYXBfY29uZmlnLT5idWNrX3JlZ21hcFtpXS5idWNrX3ZyYW5nZV9nYWluX3JlZzsKKwkJcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tpXS5kZXNjLmVuYWJsZV9yZWcKKwkJCT0gcmVnbWFwX2NvbmZpZy0+YnVja19yZWdtYXBbaV0uYnVja19lbmFibGVfcmVnOworCQlwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW2ldLmRlc2MuZW5hYmxlX21hc2sKKwkJCT0gcmVnbWFwX2NvbmZpZy0+YnVja19yZWdtYXBbaV0uYnVja19lbmFibGVfbWFzazsKKwkJcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tpXS5kZXNjLnZzZWxfcmVnCisJCQk9IHJlZ21hcF9jb25maWctPmJ1Y2tfcmVnbWFwW2ldLmJ1Y2tfdnNlbF9yZWc7CisJCXB2ODgwODBfcmVndWxhdG9yX2luZm9baV0uZGVzYy52c2VsX21hc2sKKwkJCT0gcmVnbWFwX2NvbmZpZy0+YnVja19yZWdtYXBbaV0uYnVja192c2VsX21hc2s7CisKIAkJcmV0ID0gcmVnbWFwX3JlYWQoY2hpcC0+cmVnbWFwLAotCQkJcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tpXS5jb25mMiwgJmNvbmYyKTsKKwkJCQlwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW2ldLmNvbmYyLCAmY29uZjIpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7Ci0KIAkJY29uZjIgPSAoKGNvbmYyID4+IFBWODgwODBfQlVDS19WREFDX1JBTkdFX1NISUZUKSAmCiAJCQlQVjg4MDgwX0JVQ0tfVkRBQ19SQU5HRV9NQVNLKTsKIAogCQlyZXQgPSByZWdtYXBfcmVhZChjaGlwLT5yZWdtYXAsCi0JCQlwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW2ldLmNvbmY1LCAmY29uZjUpOworCQkJCXB2ODgwODBfcmVndWxhdG9yX2luZm9baV0uY29uZjUsICZjb25mNSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKLQogCQljb25mNSA9ICgoY29uZjUgPj4gUFY4ODA4MF9CVUNLX1ZSQU5HRV9HQUlOX1NISUZUKSAmCiAJCQlQVjg4MDgwX0JVQ0tfVlJBTkdFX0dBSU5fTUFTSyk7CiAKQEAgLTM4MywyMyArNTczLDM4IEBACiAJCX0KIAl9CiAKKwlwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW1BWODgwODBfSURfSFZCVUNLXS5kZXNjLmVuYWJsZV9yZWcKKwkJPSByZWdtYXBfY29uZmlnLT5odmJ1Y2tfZW5hYmxlX3JlZzsKKwlwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW1BWODgwODBfSURfSFZCVUNLXS5kZXNjLmVuYWJsZV9tYXNrCisJCT0gcmVnbWFwX2NvbmZpZy0+aHZidWNrX2VuYWJsZV9tYXNrOworCXB2ODgwODBfcmVndWxhdG9yX2luZm9bUFY4ODA4MF9JRF9IVkJVQ0tdLmRlc2MudnNlbF9yZWcKKwkJPSByZWdtYXBfY29uZmlnLT5odmJ1Y2tfdnNlbF9yZWc7CisJcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tQVjg4MDgwX0lEX0hWQlVDS10uZGVzYy52c2VsX21hc2sKKwkJPSByZWdtYXBfY29uZmlnLT5odmJ1Y2tfdnNlbF9tYXNrOworCisJLyogUmVnaXN0ZXJhdGlvbiBmb3IgSFZCVUNLICovCisJaWYgKGluaXRfZGF0YSkKKwkJY29uZmlnLmluaXRfZGF0YSA9ICZpbml0X2RhdGFbUFY4ODA4MF9JRF9IVkJVQ0tdOworCisJY29uZmlnLmRyaXZlcl9kYXRhID0gKHZvaWQgKikmcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tQVjg4MDgwX0lEX0hWQlVDS107CisJY2hpcC0+cmRldltQVjg4MDgwX0lEX0hWQlVDS10gPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcihjaGlwLT5kZXYsCisJCSZwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW1BWODgwODBfSURfSFZCVUNLXS5kZXNjLCAmY29uZmlnKTsKKwlpZiAoSVNfRVJSKGNoaXAtPnJkZXZbUFY4ODA4MF9JRF9IVkJVQ0tdKSkgeworCQlkZXZfZXJyKGNoaXAtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBQVjg4MDgwIHJlZ3VsYXRvclxuIik7CisJCXJldHVybiBQVFJfRVJSKGNoaXAtPnJkZXZbUFY4ODA4MF9JRF9IVkJVQ0tdKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHB2ODgwODBfaTJjX2lkW10gPSB7Ci0JeyJwdjg4MDgwIiwgMH0sCisJeyAicHY4ODA4MCIsICAgIFRZUEVfUFY4ODA4MF9BQSB9LAorCXsgInB2ODgwODAtYWEiLCBUWVBFX1BWODgwODBfQUEgfSwKKwl7ICJwdjg4MDgwLWJhIiwgVFlQRV9QVjg4MDgwX0JBIH0sCiAJe30sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHB2ODgwODBfaTJjX2lkKTsKIAotI2lmZGVmIENPTkZJR19PRgotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcHY4ODA4MF9kdF9pZHNbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInB2cyxwdjg4MDgwIiwgLmRhdGEgPSAmcHY4ODA4MF9pMmNfaWRbMF0gfSwKLQl7fSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBwdjg4MDgwX2R0X2lkcyk7Ci0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHB2ODgwODBfcmVndWxhdG9yX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJwdjg4MDgwIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3B2ODgwODAtcmVndWxhdG9yLmggYi9kcml2ZXJzL3JlZ3VsYXRvci9wdjg4MDgwLXJlZ3VsYXRvci5oCmluZGV4IDVlOWFmZGUuLmFlMjVmZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3B2ODgwODAtcmVndWxhdG9yLmgKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvcHY4ODA4MC1yZWd1bGF0b3IuaApAQCAtMTcsNTUgKzE3LDc1IEBACiAjZGVmaW5lIF9fUFY4ODA4MF9SRUdJU1RFUlNfSF9fCiAKIC8qIFN5c3RlbSBDb250cm9sIGFuZCBFdmVudCBSZWdpc3RlcnMgKi8KLSNkZWZpbmUJUFY4ODA4MF9SRUdfRVZFTlRfQQkJCTB4MDQKLSNkZWZpbmUJUFY4ODA4MF9SRUdfTUFTS19BCQkJMHgwOQotI2RlZmluZQlQVjg4MDgwX1JFR19NQVNLX0IJCQkweDBhCi0jZGVmaW5lCVBWODgwODBfUkVHX01BU0tfQwkJCTB4MGIKKyNkZWZpbmUJUFY4ODA4MF9SRUdfRVZFTlRfQQkJCQkweDA0CisjZGVmaW5lCVBWODgwODBfUkVHX01BU0tfQQkJCQkweDA5CisjZGVmaW5lCVBWODgwODBfUkVHX01BU0tfQgkJCQkweDBBCisjZGVmaW5lCVBWODgwODBfUkVHX01BU0tfQwkJCQkweDBCCiAKLS8qIFJlZ3VsYXRvciBSZWdpc3RlcnMgKi8KLSNkZWZpbmUJUFY4ODA4MF9SRUdfQlVDSzFfQ09ORjAJCQkweDI3Ci0jZGVmaW5lCVBWODgwODBfUkVHX0JVQ0sxX0NPTkYxCQkJMHgyOAotI2RlZmluZQlQVjg4MDgwX1JFR19CVUNLMV9DT05GMgkJCTB4NTkKLSNkZWZpbmUJUFY4ODA4MF9SRUdfQlVDSzFfQ09ORjUJCQkweDVjCi0jZGVmaW5lCVBWODgwODBfUkVHX0JVQ0syX0NPTkYwCQkJMHgyOQotI2RlZmluZQlQVjg4MDgwX1JFR19CVUNLMl9DT05GMQkJCTB4MmEKLSNkZWZpbmUJUFY4ODA4MF9SRUdfQlVDSzJfQ09ORjIJCQkweDYxCi0jZGVmaW5lCVBWODgwODBfUkVHX0JVQ0syX0NPTkY1CQkJMHg2NAotI2RlZmluZQlQVjg4MDgwX1JFR19CVUNLM19DT05GMAkJCTB4MmIKLSNkZWZpbmUJUFY4ODA4MF9SRUdfQlVDSzNfQ09ORjEJCQkweDJjCi0jZGVmaW5lCVBWODgwODBfUkVHX0JVQ0szX0NPTkYyCQkJMHg2OQotI2RlZmluZQlQVjg4MDgwX1JFR19CVUNLM19DT05GNQkJCTB4NmMKKy8qIFJlZ3VsYXRvciBSZWdpc3RlcnMgLSByZXYuIEFBICovCisjZGVmaW5lIFBWODgwODBBQV9SRUdfSFZCVUNLX0NPTkYxCQkweDJECisjZGVmaW5lIFBWODgwODBBQV9SRUdfSFZCVUNLX0NPTkYyCQkweDJFCisjZGVmaW5lCVBWODgwODBBQV9SRUdfQlVDSzFfQ09ORjAJCTB4MjcKKyNkZWZpbmUJUFY4ODA4MEFBX1JFR19CVUNLMV9DT05GMQkJMHgyOAorI2RlZmluZQlQVjg4MDgwQUFfUkVHX0JVQ0sxX0NPTkYyCQkweDU5CisjZGVmaW5lCVBWODgwODBBQV9SRUdfQlVDSzFfQ09ORjUJCTB4NUMKKyNkZWZpbmUJUFY4ODA4MEFBX1JFR19CVUNLMl9DT05GMAkJMHgyOQorI2RlZmluZQlQVjg4MDgwQUFfUkVHX0JVQ0syX0NPTkYxCQkweDJBCisjZGVmaW5lCVBWODgwODBBQV9SRUdfQlVDSzJfQ09ORjIJCTB4NjEKKyNkZWZpbmUJUFY4ODA4MEFBX1JFR19CVUNLMl9DT05GNQkJMHg2NAorI2RlZmluZQlQVjg4MDgwQUFfUkVHX0JVQ0szX0NPTkYwCQkweDJCCisjZGVmaW5lCVBWODgwODBBQV9SRUdfQlVDSzNfQ09ORjEJCTB4MkMKKyNkZWZpbmUJUFY4ODA4MEFBX1JFR19CVUNLM19DT05GMgkJMHg2OQorI2RlZmluZQlQVjg4MDgwQUFfUkVHX0JVQ0szX0NPTkY1CQkweDZDCisKKy8qIFJlZ3VsYXRvciBSZWdpc3RlcnMgLSByZXYuIEJBICovCisjZGVmaW5lCVBWODgwODBCQV9SRUdfSFZCVUNLX0NPTkYxCQkweDMzCisjZGVmaW5lCVBWODgwODBCQV9SRUdfSFZCVUNLX0NPTkYyCQkweDM0CisjZGVmaW5lCVBWODgwODBCQV9SRUdfQlVDSzFfQ09ORjAJCTB4MkEKKyNkZWZpbmUJUFY4ODA4MEJBX1JFR19CVUNLMV9DT05GMQkJMHgyQworI2RlZmluZQlQVjg4MDgwQkFfUkVHX0JVQ0sxX0NPTkYyCQkweDVBCisjZGVmaW5lCVBWODgwODBCQV9SRUdfQlVDSzFfQ09ORjUJCTB4NUQKKyNkZWZpbmUJUFY4ODA4MEJBX1JFR19CVUNLMl9DT05GMAkJMHgyRAorI2RlZmluZQlQVjg4MDgwQkFfUkVHX0JVQ0syX0NPTkYxCQkweDJGCisjZGVmaW5lCVBWODgwODBCQV9SRUdfQlVDSzJfQ09ORjIJCTB4NjMKKyNkZWZpbmUJUFY4ODA4MEJBX1JFR19CVUNLMl9DT05GNQkJMHg2NgorI2RlZmluZQlQVjg4MDgwQkFfUkVHX0JVQ0szX0NPTkYwCQkweDMwCisjZGVmaW5lCVBWODgwODBCQV9SRUdfQlVDSzNfQ09ORjEJCTB4MzIKKyNkZWZpbmUJUFY4ODA4MEJBX1JFR19CVUNLM19DT05GMgkJMHg2QworI2RlZmluZQlQVjg4MDgwQkFfUkVHX0JVQ0szX0NPTkY1CQkweDZGCiAKIC8qIFBWODgwODBfUkVHX0VWRU5UX0EgKGFkZHI9MHgwNCkgKi8KICNkZWZpbmUJUFY4ODA4MF9FX1ZERF9GTFQJCQkJMHgwMQotI2RlZmluZQlQVjg4MDgwX0VfT1ZFUl9URU1QCQkJMHgwMgorI2RlZmluZQlQVjg4MDgwX0VfT1ZFUl9URU1QCQkJCTB4MDIKIAogLyogUFY4ODA4MF9SRUdfTUFTS19BIChhZGRyPTB4MDkpICovCiAjZGVmaW5lCVBWODgwODBfTV9WRERfRkxUCQkJCTB4MDEKLSNkZWZpbmUJUFY4ODA4MF9NX09WRVJfVEVNUAkJCTB4MDIKKyNkZWZpbmUJUFY4ODA4MF9NX09WRVJfVEVNUAkJCQkweDAyCiAKLS8qIFBWODgwODBfUkVHX0JVQ0sxX0NPTkYwIChhZGRyPTB4MjcpICovCisvKiBQVjg4MDgwX1JFR19CVUNLMV9DT05GMCAoYWRkcj0weDI3fDB4MkEpICovCiAjZGVmaW5lCVBWODgwODBfQlVDSzFfRU4JCQkJMHg4MAotI2RlZmluZSBQVjg4MDgwX1ZCVUNLMV9NQVNLCQkJMHg3RgotLyogUFY4ODA4MF9SRUdfQlVDSzJfQ09ORjAgKGFkZHI9MHgyOSkgKi8KLSNkZWZpbmUJUFY4ODA4MF9CVUNLMl9FTgkJCQkweDgwCi0jZGVmaW5lIFBWODgwODBfVkJVQ0syX01BU0sJCQkweDdGCi0vKiBQVjg4MDgwX1JFR19CVUNLM19DT05GMCAoYWRkcj0weDJiKSAqLwotI2RlZmluZQlQVjg4MDgwX0JVQ0szX0VOCQkJCTB4ODAKLSNkZWZpbmUgUFY4ODA4MF9WQlVDSzNfTUFTSwkJCTB4N0YKKyNkZWZpbmUgUFY4ODA4MF9WQlVDSzFfTUFTSwkJCQkweDdGCiAKLS8qIFBWODgwODBfUkVHX0JVQ0sxX0NPTkYxIChhZGRyPTB4MjgpICovCi0jZGVmaW5lIFBWODgwODBfQlVDSzFfSUxJTV9TSElGVAkJCTIKKy8qIFBWODgwODBfUkVHX0JVQ0syX0NPTkYwIChhZGRyPTB4Mjl8MHgyRCkgKi8KKyNkZWZpbmUJUFY4ODA4MF9CVUNLMl9FTgkJCQkweDgwCisjZGVmaW5lIFBWODgwODBfVkJVQ0syX01BU0sJCQkJMHg3RgorCisvKiBQVjg4MDgwX1JFR19CVUNLM19DT05GMCAoYWRkcj0weDJCfDB4MzApICovCisjZGVmaW5lCVBWODgwODBfQlVDSzNfRU4JCQkJMHg4MAorI2RlZmluZSBQVjg4MDgwX1ZCVUNLM19NQVNLCQkJCTB4N0YKKworLyogUFY4ODA4MF9SRUdfQlVDSzFfQ09ORjEgKGFkZHI9MHgyOHwweDJDKSAqLworI2RlZmluZSBQVjg4MDgwX0JVQ0sxX0lMSU1fU0hJRlQJCTIKICNkZWZpbmUgUFY4ODA4MF9CVUNLMV9JTElNX01BU0sJCQkweDBDCiAjZGVmaW5lIFBWODgwODBfQlVDSzFfTU9ERV9NQVNLCQkJMHgwMwogCi0vKiBQVjg4MDgwX1JFR19CVUNLMl9DT05GMSAoYWRkcj0weDJhKSAqLwotI2RlZmluZSBQVjg4MDgwX0JVQ0syX0lMSU1fU0hJRlQJCQkyCisvKiBQVjg4MDgwX1JFR19CVUNLMl9DT05GMSAoYWRkcj0weDJBfDB4MkYpICovCisjZGVmaW5lIFBWODgwODBfQlVDSzJfSUxJTV9TSElGVAkJMgogI2RlZmluZSBQVjg4MDgwX0JVQ0syX0lMSU1fTUFTSwkJCTB4MEMKICNkZWZpbmUgUFY4ODA4MF9CVUNLMl9NT0RFX01BU0sJCQkweDAzCiAKLS8qIFBWODgwODBfUkVHX0JVQ0szX0NPTkYxIChhZGRyPTB4MmMpICovCi0jZGVmaW5lIFBWODgwODBfQlVDSzNfSUxJTV9TSElGVAkJCTIKKy8qIFBWODgwODBfUkVHX0JVQ0szX0NPTkYxIChhZGRyPTB4MkN8MHgzMikgKi8KKyNkZWZpbmUgUFY4ODA4MF9CVUNLM19JTElNX1NISUZUCQkyCiAjZGVmaW5lIFBWODgwODBfQlVDSzNfSUxJTV9NQVNLCQkJMHgwQwogI2RlZmluZSBQVjg4MDgwX0JVQ0szX01PREVfTUFTSwkJCTB4MDMKIApAQCAtNzMsMjAgKzkzLDI2IEBACiAjZGVmaW5lCVBWODgwODBfQlVDS19NT0RFX0FVVE8JCQkweDAxCiAjZGVmaW5lCVBWODgwODBfQlVDS19NT0RFX1NZTkMJCQkweDAyCiAKLS8qIFBWODgwODBfUkVHX0JVQ0syX0NPTkYyIChhZGRyPTB4NjEpICovCi0vKiBQVjg4MDgwX1JFR19CVUNLM19DT05GMiAoYWRkcj0weDY5KSAqLwotI2RlZmluZSBQVjg4MDgwX0JVQ0tfVkRBQ19SQU5HRV9TSElGVAkJCTcKLSNkZWZpbmUgUFY4ODA4MF9CVUNLX1ZEQUNfUkFOR0VfTUFTSwkJCTB4MDEKKy8qIFBWODgwODBfUkVHX0hWQlVDS19DT05GMSAoYWRkcj0weDJEfDB4MzMpICovCisjZGVmaW5lIFBWODgwODBfVkhWQlVDS19NQVNLCQkJMHhGRgogCi0jZGVmaW5lIFBWODgwODBfQlVDS19WREFDX1JBTkdFXzEJCQkweDAwCi0jZGVmaW5lIFBWODgwODBfQlVDS19WREFDX1JBTkdFXzIJCQkweDAxCisvKiBQVjg4MDgwX1JFR19IVkJVQ0tfQ09ORjEgKGFkZHI9MHgyRXwweDM0KSAqLworI2RlZmluZSBQVjg4MDgwX0hWQlVDS19FTgkJCQkweDAxCiAKLS8qIFBWODgwODBfUkVHX0JVQ0syX0NPTkY1IChhZGRyPTB4NjQpICovCi0vKiBQVjg4MDgwX1JFR19CVUNLM19DT05GNSAoYWRkcj0weDZjKSAqLwotI2RlZmluZSBQVjg4MDgwX0JVQ0tfVlJBTkdFX0dBSU5fU0hJRlQJCQkwCi0jZGVmaW5lIFBWODgwODBfQlVDS19WUkFOR0VfR0FJTl9NQVNLCQkJMHgwMQorLyogUFY4ODA4MF9SRUdfQlVDSzJfQ09ORjIgKGFkZHI9MHg2MXwweDYzKSAqLworLyogUFY4ODA4MF9SRUdfQlVDSzNfQ09ORjIgKGFkZHI9MHg2OXwweDZDKSAqLworI2RlZmluZSBQVjg4MDgwX0JVQ0tfVkRBQ19SQU5HRV9TSElGVAk3CisjZGVmaW5lIFBWODgwODBfQlVDS19WREFDX1JBTkdFX01BU0sJMHgwMQogCi0jZGVmaW5lIFBWODgwODBfQlVDS19WUkFOR0VfR0FJTl8xCQkJMHgwMAotI2RlZmluZSBQVjg4MDgwX0JVQ0tfVlJBTkdFX0dBSU5fMgkJCTB4MDEKKyNkZWZpbmUgUFY4ODA4MF9CVUNLX1ZEQUNfUkFOR0VfMQkJMHgwMAorI2RlZmluZSBQVjg4MDgwX0JVQ0tfVkRBQ19SQU5HRV8yCQkweDAxCisKKy8qIFBWODgwODBfUkVHX0JVQ0syX0NPTkY1IChhZGRyPTB4NjR8MHg2NikgKi8KKy8qIFBWODgwODBfUkVHX0JVQ0szX0NPTkY1IChhZGRyPTB4NkN8MHg2RikgKi8KKyNkZWZpbmUgUFY4ODA4MF9CVUNLX1ZSQU5HRV9HQUlOX1NISUZUCTAKKyNkZWZpbmUgUFY4ODA4MF9CVUNLX1ZSQU5HRV9HQUlOX01BU0sJMHgwMQorCisjZGVmaW5lIFBWODgwODBfQlVDS19WUkFOR0VfR0FJTl8xCQkweDAwCisjZGVmaW5lIFBWODgwODBfQlVDS19WUkFOR0VfR0FJTl8yCQkweDAxCiAKICNlbmRpZgkvKiBfX1BWODgwODBfUkVHSVNURVJTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvcHdtLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvcHdtLXJlZ3VsYXRvci5jCmluZGV4IGMyNDUyNDIuLjFiODhlMGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9wd20tcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvcHdtLXJlZ3VsYXRvci5jCkBAIC0xMCw3ICsxMCw2IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CkBAIC0xOTQsMTIgKzE5MywxMCBAQAogCXVuc2lnbmVkIGludCBtaW5fdVZfZHV0eSA9IGRydmRhdGEtPmNvbnRpbnVvdXMubWluX3VWX2R1dHljeWNsZTsKIAl1bnNpZ25lZCBpbnQgbWF4X3VWX2R1dHkgPSBkcnZkYXRhLT5jb250aW51b3VzLm1heF91Vl9kdXR5Y3ljbGU7CiAJdW5zaWduZWQgaW50IGR1dHlfdW5pdCA9IGRydmRhdGEtPmNvbnRpbnVvdXMuZHV0eWN5Y2xlX3VuaXQ7Ci0JdW5zaWduZWQgaW50IHJhbXBfZGVsYXkgPSByZGV2LT5jb25zdHJhaW50cy0+cmFtcF9kZWxheTsKIAlpbnQgbWluX3VWID0gcmRldi0+Y29uc3RyYWludHMtPm1pbl91VjsKIAlpbnQgbWF4X3VWID0gcmRldi0+Y29uc3RyYWludHMtPm1heF91VjsKIAlpbnQgZGlmZl91ViA9IG1heF91ViAtIG1pbl91VjsKIAlzdHJ1Y3QgcHdtX3N0YXRlIHBzdGF0ZTsKLQlpbnQgb2xkX3VWID0gcHdtX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZShyZGV2KTsKIAl1bnNpZ25lZCBpbnQgZGlmZl9kdXR5OwogCXVuc2lnbmVkIGludCBkdXR5Y3ljbGU7CiAJaW50IHJldDsKQEAgLTIzMywxMyArMjMwLDYgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAoKHJhbXBfZGVsYXkgPT0gMCkgfHwgIXB3bV9yZWd1bGF0b3JfaXNfZW5hYmxlZChyZGV2KSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBSYW1wIGRlbGF5IGlzIGluIHVWL3VTLiBBZGp1c3QgdG8gdVMgYW5kIGRlbGF5ICovCi0JcmFtcF9kZWxheSA9IERJVl9ST1VORF9VUChhYnMocmVxX21pbl91ViAtIG9sZF91ViksIHJhbXBfZGVsYXkpOwotCXVzbGVlcF9yYW5nZShyYW1wX2RlbGF5LCByYW1wX2RlbGF5ICsgRElWX1JPVU5EX1VQKHJhbXBfZGVsYXksIDEwKSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvcWNvbV9zbWQtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9xY29tX3NtZC1yZWd1bGF0b3IuYwppbmRleCA1MDIyZmE4Li44ZWQ0NmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9xY29tX3NtZC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9xY29tX3NtZC1yZWd1bGF0b3IuYwpAQCAtMTc4LDIwICsxNzgsMjEgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgcG1hODA4NF9mdHNtcHMgPSB7CiAJLmxpbmVhcl9yYW5nZXMgPSAoc3RydWN0IHJlZ3VsYXRvcl9saW5lYXJfcmFuZ2VbXSkgewogCQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDM1MDAwMCwgIDAsIDE4NCwgNTAwMCksCi0JCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoNzAwMDAwLCAxODUsIDMzOSwgMTAwMDApLAorCQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDEyODAwMDAsIDE4NSwgMjYxLCAxMDAwMCksCiAJfSwKIAkubl9saW5lYXJfcmFuZ2VzID0gMiwKLQkubl92b2x0YWdlcyA9IDM0MCwKKwkubl92b2x0YWdlcyA9IDI2MiwKIAkub3BzID0gJnJwbV9zbXBzX2xkb19vcHMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHBtYTgwODRfcGxkbyA9IHsKIAkubGluZWFyX3JhbmdlcyA9IChzdHJ1Y3QgcmVndWxhdG9yX2xpbmVhcl9yYW5nZVtdKSB7Ci0JCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoNzUwMDAwLCAgMCwgIDMwLCAyNTAwMCksCi0JCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTUwMDAwMCwgMzEsIDk5LCA1MDAwMCksCisJCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoIDc1MDAwMCwgIDAsICA2MywgMTI1MDApLAorCQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDE1NTAwMDAsIDY0LCAxMjYsIDI1MDAwKSwKKwkJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgzMTAwMDAwLCAxMjcsIDE2MywgNTAwMDApLAogCX0sCi0JLm5fbGluZWFyX3JhbmdlcyA9IDIsCi0JLm5fdm9sdGFnZXMgPSAxMDAsCisJLm5fbGluZWFyX3JhbmdlcyA9IDMsCisJLm5fdm9sdGFnZXMgPSAxNjQsCiAJLm9wcyA9ICZycG1fc21wc19sZG9fb3BzLAogfTsKIApAQCAtMjIxLDI5ICsyMjIsMzAgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgcG04ODQxX2Z0c21wcyA9IHsKIAkubGluZWFyX3JhbmdlcyA9IChzdHJ1Y3QgcmVndWxhdG9yX2xpbmVhcl9yYW5nZVtdKSB7CiAJCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMzUwMDAwLCAgMCwgMTg0LCA1MDAwKSwKLQkJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg3MDAwMDAsIDE4NSwgMzM5LCAxMDAwMCksCisJCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTI4MDAwMCwgMTg1LCAyNjEsIDEwMDAwKSwKIAl9LAogCS5uX2xpbmVhcl9yYW5nZXMgPSAyLAotCS5uX3ZvbHRhZ2VzID0gMzQwLAorCS5uX3ZvbHRhZ2VzID0gMjYyLAogCS5vcHMgPSAmcnBtX3NtcHNfbGRvX29wcywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgcG04OTQxX2Jvb3N0ID0gewogCS5saW5lYXJfcmFuZ2VzID0gKHN0cnVjdCByZWd1bGF0b3JfbGluZWFyX3JhbmdlW10pIHsKLQkJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg0MDAwMDAwLCAwLCAxNSwgMTAwMDAwKSwKKwkJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg0MDAwMDAwLCAwLCAzMCwgNTAwMDApLAogCX0sCiAJLm5fbGluZWFyX3JhbmdlcyA9IDEsCi0JLm5fdm9sdGFnZXMgPSAxNiwKKwkubl92b2x0YWdlcyA9IDMxLAogCS5vcHMgPSAmcnBtX3NtcHNfbGRvX29wcywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgcG04OTQxX3BsZG8gPSB7CiAJLmxpbmVhcl9yYW5nZXMgPSAoc3RydWN0IHJlZ3VsYXRvcl9saW5lYXJfcmFuZ2VbXSkgewotCQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKCA3NTAwMDAsICAwLCAgMzAsIDI1MDAwKSwKLQkJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgxNTAwMDAwLCAzMSwgOTksIDUwMDAwKSwKKwkJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSggNzUwMDAwLCAgMCwgIDYzLCAxMjUwMCksCisJCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTU1MDAwMCwgNjQsIDEyNiwgMjUwMDApLAorCQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDMxMDAwMDAsIDEyNywgMTYzLCA1MDAwMCksCiAJfSwKLQkubl9saW5lYXJfcmFuZ2VzID0gMiwKLQkubl92b2x0YWdlcyA9IDEwMCwKKwkubl9saW5lYXJfcmFuZ2VzID0gMywKKwkubl92b2x0YWdlcyA9IDE2NCwKIAkub3BzID0gJnJwbV9zbXBzX2xkb19vcHMsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9yazgwOC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3JrODA4LXJlZ3VsYXRvci5jCmluZGV4IDQwZDA3YmEuLmE2NzY3NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3JrODA4LXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3JrODA4LXJlZ3VsYXRvci5jCkBAIC01MzMsOCArNTMzLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJrODA4X3JlZ3VsYXRvcl9kcml2ZXIgPSB7CiAJLnByb2JlID0gcms4MDhfcmVndWxhdG9yX3Byb2JlLAogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInJrODA4LXJlZ3VsYXRvciIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkubmFtZSA9ICJyazgwOC1yZWd1bGF0b3IiCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MjE4LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUyMTgtcmVndWxhdG9yLmMKaW5kZXggZDFlNjMxZC4uZWIwZjViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUyMTgtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUyMTgtcmVndWxhdG9yLmMKQEAgLTE4MCw2ICsxODAsMTQgQEAKIAlpZiAocmlkIDwgVFBTNjUyMThfRENEQ18xIHx8IHJpZCA+IFRQUzY1MjE4X0xET18xKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qCisJICogQ2VydGFpbiByZXZpc2lvbnMgb2YgVFBTNjUyMTggd2lsbCBuZWVkIHRvIGhhdmUgRENEQzMgcmVndWxhdG9yCisJICogZW5hYmxlZCBhbHdheXMsIG90aGVyd2lzZSBhbiBpbW1lZGlhdGUgc3lzdGVtIHJlYm9vdCB3aWxsIG9jY3VyCisJICogZHVyaW5nIHBvd2Vyb2ZmLgorCSAqLworCWlmIChyaWQgPT0gVFBTNjUyMThfRENEQ18zICYmIHRwcy0+cmV2ID09IFRQUzY1MjE4X1JFVl8yXzEpCisJCXJldHVybiAwOworCiAJaWYgKCF0cHMtPmluZm9bcmlkXS0+c3Ryb2JlKSB7CiAJCWlmIChyaWQgPT0gVFBTNjUyMThfRENEQ18zKQogCQkJdHBzLT5pbmZvW3JpZF0tPnN0cm9iZSA9IDM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEwLXJlZ3VsYXRvci5jCmluZGV4IGZiOTkxZWMuLjY5NjExNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEwLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEwLXJlZ3VsYXRvci5jCkBAIC0xMTExLDYgKzExMTEsMTIgQEAKIAkJcG1pYy0+bnVtX3JlZ3VsYXRvcnMgPSBBUlJBWV9TSVpFKHRwczY1OTEwX3JlZ3MpOwogCQlwbWljLT5leHRfc2xlZXBfY29udHJvbCA9IHRwczY1OTEwX2V4dF9zbGVlcF9jb250cm9sOwogCQlpbmZvID0gdHBzNjU5MTBfcmVnczsKKwkJLyogV29yayBhcm91bmQgc2lsaWNvbiBlcnJhdHVtIFNXQ1owMTA6IG91dHB1dCBwcm9ncmFtbWVkCisJCSAqIHZvbHRhZ2UgbGV2ZWwgY2FuIGdvIGhpZ2hlciB0aGFuIGV4cGVjdGVkIG9yIGNyYXNoCisJCSAqIFdvcmthcm91bmQ6IHVzZSBubyBzeW5jaHJvbml6YXRpb24gb2YgRENEQyBjbG9ja3MKKwkJICovCisJCXRwczY1OTEwX3JlZ19jbGVhcl9iaXRzKHBtaWMtPm1mZCwgVFBTNjU5MTBfRENEQ0NUUkwsCisJCQkJCURDRENDVFJMX0RDRENDS1NZTkNfTUFTSyk7CiAJCWJyZWFrOwogCWNhc2UgVFBTNjU5MTE6CiAJCXBtaWMtPmdldF9jdHJsX3JlZyA9ICZ0cHM2NTkxMV9nZXRfY3RybF9yZWdpc3RlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCmluZGV4IDg5NzNkMzQuLjFkZTA4OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYwpAQCAtMjEyLDE2ICsyMTIsNiBAQAogewogCS8qIERpc2FibGUgZXh0ZW5kZWQgZXJyb3IgcmVwb3J0aW5nIGZvciB0aGlzIGRldmljZS4gKi8KIAlkYXNkX2Vlcl9kaXNhYmxlKGRldmljZSk7Ci0JLyogRm9yZ2V0IHRoZSBkaXNjaXBsaW5lIGluZm9ybWF0aW9uLiAqLwotCWlmIChkZXZpY2UtPmRpc2NpcGxpbmUpIHsKLQkJaWYgKGRldmljZS0+ZGlzY2lwbGluZS0+dW5jaGVja19kZXZpY2UpCi0JCQlkZXZpY2UtPmRpc2NpcGxpbmUtPnVuY2hlY2tfZGV2aWNlKGRldmljZSk7Ci0JCW1vZHVsZV9wdXQoZGV2aWNlLT5kaXNjaXBsaW5lLT5vd25lcik7Ci0JfQotCWRldmljZS0+ZGlzY2lwbGluZSA9IE5VTEw7Ci0JaWYgKGRldmljZS0+YmFzZV9kaXNjaXBsaW5lKQotCQltb2R1bGVfcHV0KGRldmljZS0+YmFzZV9kaXNjaXBsaW5lLT5vd25lcik7Ci0JZGV2aWNlLT5iYXNlX2Rpc2NpcGxpbmUgPSBOVUxMOwogCWRldmljZS0+c3RhdGUgPSBEQVNEX1NUQVRFX05FVzsKIAogCWlmIChkZXZpY2UtPmJsb2NrKQpAQCAtMzM2LDYgKzMyNiw3IEBACiB7CiAJaW50IHJjOwogCXN0cnVjdCBkYXNkX2Jsb2NrICpibG9jazsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKIAogCXJjID0gMDsKIAlibG9jayA9IGRldmljZS0+YmxvY2s7CkBAIC0zNDYsNiArMzM3LDkgQEAKIAkJaWYgKHJjKSB7CiAJCQlpZiAocmMgIT0gLUVBR0FJTikgewogCQkJCWRldmljZS0+c3RhdGUgPSBEQVNEX1NUQVRFX1VORk1UOworCQkJCWRpc2sgPSBkZXZpY2UtPmJsb2NrLT5nZHA7CisJCQkJa29iamVjdF91ZXZlbnQoJmRpc2tfdG9fZGV2KGRpc2spLT5rb2JqLAorCQkJCQkgICAgICAgS09CSl9DSEFOR0UpOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJcmV0dXJuIHJjOwpAQCAtMTY0Myw5ICsxNjM3LDE4IEBACiAJdTggKnNlbnNlID0gTlVMTDsKIAlpbnQgZXhwaXJlczsKIAorCWNxciA9IChzdHJ1Y3QgZGFzZF9jY3dfcmVxICopIGludHBhcm07CiAJaWYgKElTX0VSUihpcmIpKSB7CiAJCXN3aXRjaCAoUFRSX0VSUihpcmIpKSB7CiAJCWNhc2UgLUVJTzoKKwkJCWlmIChjcXIgJiYgY3FyLT5zdGF0dXMgPT0gREFTRF9DUVJfQ0xFQVJfUEVORElORykgeworCQkJCWRldmljZSA9IChzdHJ1Y3QgZGFzZF9kZXZpY2UgKikgY3FyLT5zdGFydGRldjsKKwkJCQljcXItPnN0YXR1cyA9IERBU0RfQ1FSX0NMRUFSRUQ7CisJCQkJZGFzZF9kZXZpY2VfY2xlYXJfdGltZXIoZGV2aWNlKTsKKwkJCQl3YWtlX3VwKCZkYXNkX2ZsdXNoX3dxKTsKKwkJCQlkYXNkX3NjaGVkdWxlX2RldmljZV9iaChkZXZpY2UpOworCQkJCXJldHVybjsKKwkJCX0KIAkJCWJyZWFrOwogCQljYXNlIC1FVElNRURPVVQ6CiAJCQlEQkZfRVZFTlRfREVWSUQoREJGX1dBUk5JTkcsIGNkZXYsICIlczogIgpAQCAtMTY2MSw3ICsxNjY0LDYgQEAKIAl9CiAKIAlub3cgPSBnZXRfdG9kX2Nsb2NrKCk7Ci0JY3FyID0gKHN0cnVjdCBkYXNkX2Njd19yZXEgKikgaW50cGFybTsKIAkvKiBjaGVjayBmb3IgY29uZGl0aW9ucyB0aGF0IHNob3VsZCBiZSBoYW5kbGVkIGltbWVkaWF0ZWx5ICovCiAJaWYgKCFjcXIgfHwKIAkgICAgIShzY3N3X2RzdGF0KCZpcmItPnNjc3cpID09IChERVZfU1RBVF9DSE5fRU5EIHwgREVWX1NUQVRfREVWX0VORCkgJiYKQEAgLTIyNjYsNiArMjI2OCwxNSBAQAogCQkJY29udGludWU7CiAJCX0KIAkJLyoKKwkJICogRG9uJ3QgdHJ5IHRvIHN0YXJ0IHJlcXVlc3RzIGlmIGRldmljZSBpcyBpbgorCQkgKiBvZmZsaW5lIHByb2Nlc3NpbmcsIGl0IG1pZ2h0IHdhaXQgZm9yZXZlcgorCQkgKi8KKwkJaWYgKHRlc3RfYml0KERBU0RfRkxBR19PRkZMSU5FLCAmZGV2aWNlLT5mbGFncykpIHsKKwkJCWNxci0+c3RhdHVzID0gREFTRF9DUVJfRkFJTEVEOworCQkJY3FyLT5pbnRyYyA9IC1FTk9ERVY7CisJCQljb250aW51ZTsKKwkJfQorCQkvKgogCQkgKiBEb24ndCB0cnkgdG8gc3RhcnQgcmVxdWVzdHMgaWYgZGV2aWNlIGlzIHN0b3BwZWQKIAkJICogZXhjZXB0IHBhdGggdmVyaWZpY2F0aW9uIHJlcXVlc3RzCiAJCSAqLwpAQCAtMzM1Niw2ICszMzY3LDIyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkYXNkX2dlbmVyaWNfcHJvYmUpOwogCit2b2lkIGRhc2RfZ2VuZXJpY19mcmVlX2Rpc2NpcGxpbmUoc3RydWN0IGRhc2RfZGV2aWNlICpkZXZpY2UpCit7CisJLyogRm9yZ2V0IHRoZSBkaXNjaXBsaW5lIGluZm9ybWF0aW9uLiAqLworCWlmIChkZXZpY2UtPmRpc2NpcGxpbmUpIHsKKwkJaWYgKGRldmljZS0+ZGlzY2lwbGluZS0+dW5jaGVja19kZXZpY2UpCisJCQlkZXZpY2UtPmRpc2NpcGxpbmUtPnVuY2hlY2tfZGV2aWNlKGRldmljZSk7CisJCW1vZHVsZV9wdXQoZGV2aWNlLT5kaXNjaXBsaW5lLT5vd25lcik7CisJCWRldmljZS0+ZGlzY2lwbGluZSA9IE5VTEw7CisJfQorCWlmIChkZXZpY2UtPmJhc2VfZGlzY2lwbGluZSkgeworCQltb2R1bGVfcHV0KGRldmljZS0+YmFzZV9kaXNjaXBsaW5lLT5vd25lcik7CisJCWRldmljZS0+YmFzZV9kaXNjaXBsaW5lID0gTlVMTDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkYXNkX2dlbmVyaWNfZnJlZV9kaXNjaXBsaW5lKTsKKwogLyoKICAqIFRoaXMgd2lsbCBvbmUgZGF5IGJlIGNhbGxlZCBmcm9tIGEgZ2xvYmFsIG5vdF9vcGVyIGhhbmRsZXIuCiAgKiBJdCBpcyBhbHNvIHVzZWQgYnkgZHJpdmVyX3VucmVnaXN0ZXIgZHVyaW5nIG1vZHVsZSB1bmxvYWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Rldm1hcC5jCmluZGV4IDNjZGJjZTQuLjE1YTFhNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Rldm1hcC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Rldm1hcC5jCkBAIC02MTcsNiArNjE3LDcgQEAKIAkvKiBXYWl0IGZvciByZWZlcmVuY2UgY291bnRlciB0byBkcm9wIHRvIHplcm8uICovCiAJd2FpdF9ldmVudChkYXNkX2RlbGV0ZV93cSwgYXRvbWljX3JlYWQoJmRldmljZS0+cmVmX2NvdW50KSA9PSAwKTsKIAorCWRhc2RfZ2VuZXJpY19mcmVlX2Rpc2NpcGxpbmUoZGV2aWNlKTsKIAkvKiBEaXNjb25uZWN0IGRhc2RfZGV2aWNlIHN0cnVjdHVyZSBmcm9tIGNjd19kZXZpY2Ugc3RydWN0dXJlLiAqLwogCWNkZXYgPSBkZXZpY2UtPmNkZXY7CiAJZGV2aWNlLT5jZGV2ID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYwppbmRleCBmZDJlZmY0Li44MzE5MzVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jCkBAIC01MDc4LDYgKzUwNzgsOCBAQAogCQlyZXR1cm4gUFRSX0VSUihjcXIpOwogCX0KIAorCWNxci0+bHBtID0gbHB1bTsKK3JldHJ5OgogCWNxci0+c3RhcnRkZXYgPSBkZXZpY2U7CiAJY3FyLT5tZW1kZXYgPSBkZXZpY2U7CiAJY3FyLT5ibG9jayA9IE5VTEw7CkBAIC01MTIyLDYgKzUxMjQsMTQgQEAKIAkJCShwcnNzZHAgKyAxKTsKIAkJbWVtY3B5KG1lc3NhZ2VzLCBtZXNzYWdlX2J1ZiwKIAkJICAgICAgIHNpemVvZihzdHJ1Y3QgZGFzZF9yc3NkX21lc3NhZ2VzKSk7CisJfSBlbHNlIGlmIChjcXItPmxwbSkgeworCQkvKgorCQkgKiBvbiB6L1ZNIHdlIG1pZ2h0IG5vdCBiZSBhYmxlIHRvIGRvIEkvTyBvbiB0aGUgcmVxdWVzdGVkIHBhdGgKKwkJICogYnV0IGluc3RlYWQgd2UgZ2V0IHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbiBvbiBhbnkgcGF0aAorCQkgKiBzbyByZXRyeSB3aXRoIG9wZW4gcGF0aCBtYXNrCisJCSAqLworCQljcXItPmxwbSA9IDA7CisJCWdvdG8gcmV0cnk7CiAJfSBlbHNlCiAJCURCRl9FVkVOVF9ERVZJRChEQkZfV0FSTklORywgZGV2aWNlLT5jZGV2LAogCQkJCSJSZWFkaW5nIG1lc3NhZ2VzIGZhaWxlZCB3aXRoIHJjPSVkXG4iCkBAIC01MTkxLDcgKzUyMDEsNyBAQAogCiAJY3FyLT5idWlsZGNsayA9IGdldF90b2RfY2xvY2soKTsKIAljcXItPnN0YXR1cyA9IERBU0RfQ1FSX0ZJTExFRDsKLQlyYyA9IGRhc2Rfc2xlZXBfb24oY3FyKTsKKwlyYyA9IGRhc2Rfc2xlZXBfb25faW50ZXJydXB0aWJsZShjcXIpOwogCWlmIChyYyA9PSAwKSB7CiAJCSpkYXRhID0gKmhvc3RfYWNjZXNzOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lcnAuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2VycC5jCmluZGV4IGUxZTg4NDguLmQxMzhkMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2VycC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2VycC5jCkBAIC0xNjksMTIgKzE2OSwxMiBAQAogCWRldmljZSA9IGNxci0+c3RhcnRkZXY7CiAJaWYgKGNxci0+aW50cmMgPT0gLUVUSU1FRE9VVCkgewogCQlkZXZfZXJyKCZkZXZpY2UtPmNkZXYtPmRldiwKLQkJCSJBIHRpbWVvdXQgZXJyb3Igb2NjdXJyZWQgZm9yIGNxciAlcCIsIGNxcik7CisJCQkiQSB0aW1lb3V0IGVycm9yIG9jY3VycmVkIGZvciBjcXIgJXBcbiIsIGNxcik7CiAJCXJldHVybjsKIAl9CiAJaWYgKGNxci0+aW50cmMgPT0gLUVOT0xJTkspIHsKIAkJZGV2X2VycigmZGV2aWNlLT5jZGV2LT5kZXYsCi0JCQkiQSB0cmFuc3BvcnQgZXJyb3Igb2NjdXJyZWQgZm9yIGNxciAlcCIsIGNxcik7CisJCQkiQSB0cmFuc3BvcnQgZXJyb3Igb2NjdXJyZWQgZm9yIGNxciAlcFxuIiwgY3FyKTsKIAkJcmV0dXJuOwogCX0KIAkvKiBkdW1wIHNlbnNlIGRhdGEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKaW5kZXggYWM3MDI3ZS4uODdmZjZjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKQEAgLTcyNSw2ICs3MjUsNyBAQAogaW50ICBkYXNkX2NhbmNlbF9yZXEoc3RydWN0IGRhc2RfY2N3X3JlcSAqKTsKIGludCBkYXNkX2ZsdXNoX2RldmljZV9xdWV1ZShzdHJ1Y3QgZGFzZF9kZXZpY2UgKik7CiBpbnQgZGFzZF9nZW5lcmljX3Byb2JlIChzdHJ1Y3QgY2N3X2RldmljZSAqLCBzdHJ1Y3QgZGFzZF9kaXNjaXBsaW5lICopOwordm9pZCBkYXNkX2dlbmVyaWNfZnJlZV9kaXNjaXBsaW5lKHN0cnVjdCBkYXNkX2RldmljZSAqKTsKIHZvaWQgZGFzZF9nZW5lcmljX3JlbW92ZSAoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpOwogaW50IGRhc2RfZ2VuZXJpY19zZXRfb25saW5lKHN0cnVjdCBjY3dfZGV2aWNlICosIHN0cnVjdCBkYXNkX2Rpc2NpcGxpbmUgKik7CiBpbnQgZGFzZF9nZW5lcmljX3NldF9vZmZsaW5lIChzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjcwLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjcwLmMKaW5kZXggNmIxNTc3Yy4uMjg1YjQwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvY29uMzI3MC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyNzAuYwpAQCAtMTI0LDcgKzEyNCwxMiBAQAogc3RhdGljIHZvaWQKIGNvbjMyNzBfdXBkYXRlX3N0cmluZyhzdHJ1Y3QgY29uMzI3MCAqY3AsIHN0cnVjdCBzdHJpbmcgKnMsIGludCBucikKIHsKLQlpZiAocy0+bGVuID49IGNwLT52aWV3LmNvbHMgLSA1KQorCWlmIChzLT5sZW4gPCA0KSB7CisJCS8qIFRoaXMgaW5kaWNhdGVzIGEgYnVnLCBidXQgcHJpbnRpbmcgYSB3YXJuaW5nIHdvdWxkCisJCSAqIGNhdXNlIGEgZGVhZGxvY2suICovCisJCXJldHVybjsKKwl9CisJaWYgKHMtPnN0cmluZ1tzLT5sZW4gLSA0XSAhPSBUT19SQSkKIAkJcmV0dXJuOwogCXJhdzMyNzBfYnVmZmVyX2FkZHJlc3MoY3AtPnZpZXcuZGV2LCBzLT5zdHJpbmcgKyBzLT5sZW4gLSAzLAogCQkJICAgICAgIGNwLT52aWV3LmNvbHMgKiAobnIgKyAxKSk7CkBAIC00NjAsMTEgKzQ2NSwxMSBAQAogCQljcC0+Y2xpbmUtPmxlbiArIDQgOiBjcC0+dmlldy5jb2xzOwogCXMgPSBjb24zMjcwX2FsbG9jX3N0cmluZyhjcCwgc2l6ZSk7CiAJbWVtY3B5KHMtPnN0cmluZywgY3AtPmNsaW5lLT5zdHJpbmcsIGNwLT5jbGluZS0+bGVuKTsKLQlpZiAocy0+bGVuIDwgY3AtPnZpZXcuY29scyAtIDUpIHsKKwlpZiAoY3AtPmNsaW5lLT5sZW4gPCBjcC0+dmlldy5jb2xzIC0gNSkgewogCQlzLT5zdHJpbmdbcy0+bGVuIC0gNF0gPSBUT19SQTsKIAkJcy0+c3RyaW5nW3MtPmxlbiAtIDFdID0gMDsKIAl9IGVsc2UgewotCQl3aGlsZSAoLS1zaXplID4gY3AtPmNsaW5lLT5sZW4pCisJCXdoaWxlICgtLXNpemUgPj0gY3AtPmNsaW5lLT5sZW4pCiAJCQlzLT5zdHJpbmdbc2l6ZV0gPSBjcC0+dmlldy5hc2NlYmNbJyAnXTsKIAl9CiAJLyogUmVwbGFjZSBjbGluZSB3aXRoIGFsbG9jYXRlZCBsaW5lIHMgYW5kIHJlc2V0IGNsaW5lLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jdGwuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY3RsLmMKaW5kZXggZWE2MDdhNC4uNTU0ZWFhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jdGwuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2N0bC5jCkBAIC0xMjYsMjEgKzEyNiw0IEBACiAJLm5hbWUgPSAic2NscCIsCiAJLmZvcHMgPSAmc2NscF9jdGxfZm9wcywKIH07Ci0KLS8qCi0gKiBSZWdpc3RlciBzY2xwX2N0bCBtaXNjIGRldmljZQotICovCi1zdGF0aWMgaW50IF9faW5pdCBzY2xwX2N0bF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJnNjbHBfY3RsX2RldmljZSk7Ci19Ci1tb2R1bGVfaW5pdChzY2xwX2N0bF9pbml0KTsKLQotLyoKLSAqIERlcmVnaXN0ZXIgc2NscF9jdGwgbWlzYyBkZXZpY2UKLSAqLwotc3RhdGljIHZvaWQgX19leGl0IHNjbHBfY3RsX2V4aXQodm9pZCkKLXsKLQltaXNjX2RlcmVnaXN0ZXIoJnNjbHBfY3RsX2RldmljZSk7Ci19Ci1tb2R1bGVfZXhpdChzY2xwX2N0bF9leGl0KTsKK21vZHVsZV9taXNjX2RldmljZShzY2xwX2N0bF9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM1OTAuYwppbmRleCBkM2QxOTM2Li5lMzUyMDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM1OTAuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM1OTAuYwpAQCAtMzEyLDE1ICszMTIsMTAgQEAKIAkJcmV0dXJuIC1FTk9TWVM7CiAJaWYgKCFjcnlwdF9lbmFibGVkKGRldmljZSkpCiAJCXJldHVybiAtRVVOQVRDSDsKLQlleHRfa2VrbHMgPSBrbWFsbG9jKHNpemVvZigqZXh0X2tla2xzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFleHRfa2VrbHMpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmIChjb3B5X2Zyb21fdXNlcihleHRfa2VrbHMsIChjaGFyIF9fdXNlciAqKWFyZywgc2l6ZW9mKCpleHRfa2VrbHMpKSkgewotCQlyYyA9IC1FRkFVTFQ7Ci0JCWdvdG8gb3V0OwotCX0KKwlleHRfa2VrbHMgPSBtZW1kdXBfdXNlcigoY2hhciBfX3VzZXIgKilhcmcsIHNpemVvZigqZXh0X2tla2xzKSk7CisJaWYgKElTX0VSUihleHRfa2VrbHMpKQorCQlyZXR1cm4gUFRSX0VSUihleHRfa2VrbHMpOwogCXJjID0gdGFwZV8zNTkyX2tla2xfc2V0KGRldmljZSwgZXh0X2tla2xzKTsKLW91dDoKIAlrZnJlZShleHRfa2VrbHMpOwogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3ZtdXIuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3ZtdXIuYwppbmRleCA2YzMwZTkzYS4uZmYxOGYzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdm11ci5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3ZtdXIuYwpAQCAtMzA2LDEwICszMDYsMTEgQEAKIHsKIAlzdHJ1Y3QgdXJkZXYgKnVyZDsKIAotCVRSQUNFKCJ1cl9pbnRfaGFuZGxlcjogaW50cGFybT0weCVseCBjc3RhdD0lMDJ4IGRzdGF0PSUwMnggcmVzPSV1XG4iLAotCSAgICAgIGludHBhcm0sIGlyYi0+c2Nzdy5jbWQuY3N0YXQsIGlyYi0+c2Nzdy5jbWQuZHN0YXQsCi0JICAgICAgaXJiLT5zY3N3LmNtZC5jb3VudCk7Ci0KKwlpZiAoIUlTX0VSUihpcmIpKSB7CisJCVRSQUNFKCJ1cl9pbnRfaGFuZGxlcjogaW50cGFybT0weCVseCBjc3RhdD0lMDJ4IGRzdGF0PSUwMnggcmVzPSV1XG4iLAorCQkgICAgICBpbnRwYXJtLCBpcmItPnNjc3cuY21kLmNzdGF0LCBpcmItPnNjc3cuY21kLmRzdGF0LAorCQkgICAgICBpcmItPnNjc3cuY21kLmNvdW50KTsKKwl9CiAJaWYgKCFpbnRwYXJtKSB7CiAJCVRSQUNFKCJ1cl9pbnRfaGFuZGxlcjogdW5zb2xpY2l0ZWQgaW50ZXJydXB0XG4iKTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuYwppbmRleCA5NDBlNzI1Li4xMTY3NDY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuYwpAQCAtOTUsMTIgKzk1LDEzIEBACiBpbnQgY2hzY19nZXRfc3NkX2luZm8oc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsIHN0cnVjdCBjaHNjX3NzZF9pbmZvICpzc2QpCiB7CiAJc3RydWN0IGNoc2Nfc3NkX2FyZWEgKnNzZF9hcmVhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGNjb2RlOwogCWludCByZXQ7CiAJaW50IGk7CiAJaW50IG1hc2s7CiAKLQlzcGluX2xvY2tfaXJxKCZjaHNjX3BhZ2VfbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoc2NfcGFnZV9sb2NrLCBmbGFncyk7CiAJbWVtc2V0KGNoc2NfcGFnZSwgMCwgUEFHRV9TSVpFKTsKIAlzc2RfYXJlYSA9IGNoc2NfcGFnZTsKIAlzc2RfYXJlYS0+cmVxdWVzdC5sZW5ndGggPSAweDAwMTA7CkBAIC0xNDQsNyArMTQ1LDcgQEAKIAkJCXNzZC0+ZmxhW2ldID0gc3NkX2FyZWEtPmZsYVtpXTsKIAl9CiBvdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjaHNjX3BhZ2VfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hzY19wYWdlX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC04MzIsOSArODMzLDEwIEBACiAJCXUzMiBmbXQgOiA0OwogCQl1MzIgOiAxNjsKIAl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAqc2VjbV9hcmVhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCwgY2NvZGU7CiAKLQlzcGluX2xvY2tfaXJxKCZjaHNjX3BhZ2VfbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoc2NfcGFnZV9sb2NrLCBmbGFncyk7CiAJbWVtc2V0KGNoc2NfcGFnZSwgMCwgUEFHRV9TSVpFKTsKIAlzZWNtX2FyZWEgPSBjaHNjX3BhZ2U7CiAJc2VjbV9hcmVhLT5yZXF1ZXN0Lmxlbmd0aCA9IDB4MDA1MDsKQEAgLTg2NCw3ICs4NjYsNyBAQAogCQlDSU9fQ1JXX0VWRU5UKDIsICJjaHNjOiBzZWNtIGZhaWxlZCAocmM9JTA0eClcbiIsCiAJCQkgICAgICBzZWNtX2FyZWEtPnJlc3BvbnNlLmNvZGUpOwogb3V0OgotCXNwaW5fdW5sb2NrX2lycSgmY2hzY19wYWdlX2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoc2NfcGFnZV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtOTkyLDYgKzk5NCw3IEBACiAKIGludCBjaHNjX2dldF9jaGFubmVsX21lYXN1cmVtZW50X2NoYXJzKHN0cnVjdCBjaGFubmVsX3BhdGggKmNocCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBjY29kZSwgcmV0OwogCiAJc3RydWN0IHsKQEAgLTEwMjEsNyArMTAyNCw3IEBACiAJaWYgKCFjc3NfY2hzY19jaGFyYWN0ZXJpc3RpY3Muc2NtYyB8fCAhY3NzX2Noc2NfY2hhcmFjdGVyaXN0aWNzLnNlY20pCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3Bpbl9sb2NrX2lycSgmY2hzY19wYWdlX2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaHNjX3BhZ2VfbG9jaywgZmxhZ3MpOwogCW1lbXNldChjaHNjX3BhZ2UsIDAsIFBBR0VfU0laRSk7CiAJc2NtY19hcmVhID0gY2hzY19wYWdlOwogCXNjbWNfYXJlYS0+cmVxdWVzdC5sZW5ndGggPSAweDAwMTA7CkBAIC0xMDUzLDcgKzEwNTYsNyBAQAogCWNoc2NfaW5pdGlhbGl6ZV9jbWdfY2hhcnMoY2hwLCBzY21jX2FyZWEtPmNtY3YsCiAJCQkJICAoc3RydWN0IGNtZ19jaGFycyAqKSAmc2NtY19hcmVhLT5kYXRhKTsKIG91dDoKLQlzcGluX3VubG9ja19pcnEoJmNoc2NfcGFnZV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaHNjX3BhZ2VfbG9jaywgZmxhZ3MpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTExMzQsNiArMTEzNyw3IEBACiBpbnQgX19pbml0CiBjaHNjX2RldGVybWluZV9jc3NfY2hhcmFjdGVyaXN0aWNzKHZvaWQpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCB7CiAJCXN0cnVjdCBjaHNjX2hlYWRlciByZXF1ZXN0OwpAQCAtMTE0Niw3ICsxMTUwLDcgQEAKIAkJdTMyIGNoc2NfY2hhcls1MDhdOwogCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICpzY3NjX2FyZWE7CiAKLQlzcGluX2xvY2tfaXJxKCZjaHNjX3BhZ2VfbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoc2NfcGFnZV9sb2NrLCBmbGFncyk7CiAJbWVtc2V0KGNoc2NfcGFnZSwgMCwgUEFHRV9TSVpFKTsKIAlzY3NjX2FyZWEgPSBjaHNjX3BhZ2U7CiAJc2NzY19hcmVhLT5yZXF1ZXN0Lmxlbmd0aCA9IDB4MDAxMDsKQEAgLTExNjgsNyArMTE3Miw3IEBACiAJCUNJT19DUldfRVZFTlQoMiwgImNoc2M6IHNjc2MgZmFpbGVkIChyYz0lMDR4KVxuIiwKIAkJCSAgICAgIHNjc2NfYXJlYS0+cmVzcG9uc2UuY29kZSk7CiBleGl0OgotCXNwaW5fdW5sb2NrX2lycSgmY2hzY19wYWdlX2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoc2NfcGFnZV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaW8uaCBiL2RyaXZlcnMvczM5MC9jaW8vY2lvLmgKaW5kZXggOTNkZTBiNC4uZjBlNTdhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jaW8uaAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5oCkBAIC0xMjcsNyArMTI3LDYgQEAKIGV4dGVybiBpbnQgY2lvX2hhbHQgKHN0cnVjdCBzdWJjaGFubmVsICopOwogZXh0ZXJuIGludCBjaW9fc3RhcnQgKHN0cnVjdCBzdWJjaGFubmVsICosIHN0cnVjdCBjY3cxICosIF9fdTgpOwogZXh0ZXJuIGludCBjaW9fc3RhcnRfa2V5IChzdHJ1Y3Qgc3ViY2hhbm5lbCAqLCBzdHJ1Y3QgY2N3MSAqLCBfX3U4LCBfX3U4KTsKLWV4dGVybiBpbnQgY2lvX2NhbmNlbCAoc3RydWN0IHN1YmNoYW5uZWwgKik7CiBleHRlcm4gaW50IGNpb19zZXRfb3B0aW9ucyAoc3RydWN0IHN1YmNoYW5uZWwgKiwgaW50KTsKIGV4dGVybiBpbnQgY2lvX3VwZGF0ZV9zY2hpYihzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKTsKIGV4dGVybiBpbnQgY2lvX2NvbW1pdF9jb25maWcoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYwppbmRleCA3YWRhMDc4Li42YTU4YmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKQEAgLTc2Miw3ICs3NjIsNiBAQAogCXByaXYtPnN0YXRlID0gREVWX1NUQVRFX05PVF9PUEVSOwogCXByaXYtPmRldl9pZC5kZXZubyA9IHNjaC0+c2NoaWIucG1jdy5kZXY7CiAJcHJpdi0+ZGV2X2lkLnNzaWQgPSBzY2gtPnNjaGlkLnNzaWQ7Ci0JcHJpdi0+c2NoaWQgPSBzY2gtPnNjaGlkOwogCiAJSU5JVF9XT1JLKCZwcml2LT50b2RvX3dvcmssIGNjd19kZXZpY2VfdG9kbyk7CiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmNtYl9saXN0KTsKQEAgLTEwMDAsNyArOTk5LDYgQEAKIAlwdXRfZGV2aWNlKCZvbGRfc2NoLT5kZXYpOwogCS8qIEluaXRpYWxpemUgbmV3IHN1YmNoYW5uZWwuICovCiAJc3Bpbl9sb2NrX2lycShzY2gtPmxvY2spOwotCWNkZXYtPnByaXZhdGUtPnNjaGlkID0gc2NoLT5zY2hpZDsKIAljZGV2LT5jY3dsb2NrID0gc2NoLT5sb2NrOwogCWlmICghc2NoX2lzX3BzZXVkb19zY2goc2NoKSkKIAkJc2NoX3NldF9jZGV2KHNjaCwgY2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9zdGF0dXMuYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3N0YXR1cy5jCmluZGV4IDE1YjU2YTEuLjliYzM1MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3N0YXR1cy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3N0YXR1cy5jCkBAIC0yNiw2ICsyNiw3IEBACiBzdGF0aWMgdm9pZAogY2N3X2RldmljZV9tc2dfY29udHJvbF9jaGVjayhzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldiwgc3RydWN0IGlyYiAqaXJiKQogeworCXN0cnVjdCBzdWJjaGFubmVsICpzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwogCWNoYXIgZGJmX3RleHRbMTVdOwogCiAJaWYgKCFzY3N3X2lzX3ZhbGlkX2NzdGF0KCZpcmItPnNjc3cpIHx8CkBAIC0zNiwxMCArMzcsMTAgQEAKIAkJICAgICAgInJlY2VpdmVkIgogCQkgICAgICAiIC4uLiBkZXZpY2UgJTA0eCBvbiBzdWJjaGFubmVsIDAuJXguJTA0eCwgZGV2X3N0YXQgIgogCQkgICAgICAiOiAlMDJYIHNjaF9zdGF0IDogJTAyWFxuIiwKLQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLCBjZGV2LT5wcml2YXRlLT5zY2hpZC5zc2lkLAotCQkgICAgICBjZGV2LT5wcml2YXRlLT5zY2hpZC5zY2hfbm8sCisJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywgc2NoLT5zY2hpZC5zc2lkLAorCQkgICAgICBzY2gtPnNjaGlkLnNjaF9ubywKIAkJICAgICAgc2Nzd19kc3RhdCgmaXJiLT5zY3N3KSwgc2Nzd19jc3RhdCgmaXJiLT5zY3N3KSk7Ci0Jc3ByaW50ZihkYmZfdGV4dCwgImNoayV4IiwgY2Rldi0+cHJpdmF0ZS0+c2NoaWQuc2NoX25vKTsKKwlzcHJpbnRmKGRiZl90ZXh0LCAiY2hrJXgiLCBzY2gtPnNjaGlkLnNjaF9ubyk7CiAJQ0lPX1RSQUNFX0VWRU5UKDAsIGRiZl90ZXh0KTsKIAlDSU9fSEVYX0VWRU5UKDAsIGlyYiwgc2l6ZW9mKHN0cnVjdCBpcmIpKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vaW9fc2NoLmggYi9kcml2ZXJzL3MzOTAvY2lvL2lvX3NjaC5oCmluZGV4IDg5NzUwNjAuLjIyMGY0OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vaW9fc2NoLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9pb19zY2guaApAQCAtMTIwLDcgKzEyMCw2IEBACiAJaW50IHN0YXRlOwkJLyogZGV2aWNlIHN0YXRlICovCiAJYXRvbWljX3Qgb25vZmY7CiAJc3RydWN0IGNjd19kZXZfaWQgZGV2X2lkOwkvKiBkZXZpY2UgaWQgKi8KLQlzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZDsJLyogc3ViY2hhbm5lbCBudW1iZXIgKi8KIAlzdHJ1Y3QgY2N3X3JlcXVlc3QgcmVxOwkJLyogaW50ZXJuYWwgSS9PIHJlcXVlc3QgKi8KIAlpbnQgaXJldHJ5OwogCXU4IHBnaWRfdmFsaWRfbWFzazsJLyogbWFzayBvZiB2YWxpZCBQR0lEcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMKaW5kZXggNGJiNTI2MmYuLjcxYmY5YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYwpAQCAtNjg2LDYgKzY4NiwxNSBAQAogCXEtPnFkaW9fZXJyb3IgPSAwOwogfQogCitzdGF0aWMgaW5saW5lIGludCBxZGlvX3Rhc2tsZXRfc2NoZWR1bGUoc3RydWN0IHFkaW9fcSAqcSkKK3sKKwlpZiAobGlrZWx5KHEtPmlycV9wdHItPnN0YXRlID09IFFESU9fSVJRX1NUQVRFX0FDVElWRSkpIHsKKwkJdGFza2xldF9zY2hlZHVsZSgmcS0+dGFza2xldCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVQRVJNOworfQorCiBzdGF0aWMgdm9pZCBfX3FkaW9faW5ib3VuZF9wcm9jZXNzaW5nKHN0cnVjdCBxZGlvX3EgKnEpCiB7CiAJcXBlcmZfaW5jKHEsIHRhc2tsZXRfaW5ib3VuZCk7CkBAIC02OTgsMTAgKzcwNyw4IEBACiAJaWYgKCFxZGlvX2luYm91bmRfcV9kb25lKHEpKSB7CiAJCS8qIG1lYW5zIHBvbGwgdGltZSBpcyBub3QgeWV0IG92ZXIgKi8KIAkJcXBlcmZfaW5jKHEsIHRhc2tsZXRfaW5ib3VuZF9yZXNjaGVkKTsKLQkJaWYgKGxpa2VseShxLT5pcnFfcHRyLT5zdGF0ZSAhPSBRRElPX0lSUV9TVEFURV9TVE9QUEVEKSkgewotCQkJdGFza2xldF9zY2hlZHVsZSgmcS0+dGFza2xldCk7CisJCWlmICghcWRpb190YXNrbGV0X3NjaGVkdWxlKHEpKQogCQkJcmV0dXJuOwotCQl9CiAJfQogCiAJcWRpb19zdG9wX3BvbGxpbmcocSk7CkBAIC03MTEsOCArNzE4LDcgQEAKIAkgKi8KIAlpZiAoIXFkaW9faW5ib3VuZF9xX2RvbmUocSkpIHsKIAkJcXBlcmZfaW5jKHEsIHRhc2tsZXRfaW5ib3VuZF9yZXNjaGVkMik7Ci0JCWlmIChsaWtlbHkocS0+aXJxX3B0ci0+c3RhdGUgIT0gUURJT19JUlFfU1RBVEVfU1RPUFBFRCkpCi0JCQl0YXNrbGV0X3NjaGVkdWxlKCZxLT50YXNrbGV0KTsKKwkJcWRpb190YXNrbGV0X3NjaGVkdWxlKHEpOwogCX0KIH0KIApAQCAtODY5LDE2ICs4NzUsMTUgQEAKIAkgKiBpcyBub3RpY2VkIGFuZCBvdXRib3VuZF9oYW5kbGVyIGlzIGNhbGxlZCBhZnRlciBzb21lIHRpbWUuCiAJICovCiAJaWYgKHFkaW9fb3V0Ym91bmRfcV9kb25lKHEpKQotCQlkZWxfdGltZXIoJnEtPnUub3V0LnRpbWVyKTsKKwkJZGVsX3RpbWVyX3N5bmMoJnEtPnUub3V0LnRpbWVyKTsKIAllbHNlCi0JCWlmICghdGltZXJfcGVuZGluZygmcS0+dS5vdXQudGltZXIpKQorCQlpZiAoIXRpbWVyX3BlbmRpbmcoJnEtPnUub3V0LnRpbWVyKSAmJgorCQkgICAgbGlrZWx5KHEtPmlycV9wdHItPnN0YXRlID09IFFESU9fSVJRX1NUQVRFX0FDVElWRSkpCiAJCQltb2RfdGltZXIoJnEtPnUub3V0LnRpbWVyLCBqaWZmaWVzICsgMTAgKiBIWik7CiAJcmV0dXJuOwogCiBzY2hlZDoKLQlpZiAodW5saWtlbHkocS0+aXJxX3B0ci0+c3RhdGUgPT0gUURJT19JUlFfU1RBVEVfU1RPUFBFRCkpCi0JCXJldHVybjsKLQl0YXNrbGV0X3NjaGVkdWxlKCZxLT50YXNrbGV0KTsKKwlxZGlvX3Rhc2tsZXRfc2NoZWR1bGUocSk7CiB9CiAKIC8qIG91dGJvdW5kIHRhc2tsZXQgKi8KQEAgLTg5Miw5ICs4OTcsNyBAQAogewogCXN0cnVjdCBxZGlvX3EgKnEgPSAoc3RydWN0IHFkaW9fcSAqKWRhdGE7CiAKLQlpZiAodW5saWtlbHkocS0+aXJxX3B0ci0+c3RhdGUgPT0gUURJT19JUlFfU1RBVEVfU1RPUFBFRCkpCi0JCXJldHVybjsKLQl0YXNrbGV0X3NjaGVkdWxlKCZxLT50YXNrbGV0KTsKKwlxZGlvX3Rhc2tsZXRfc2NoZWR1bGUocSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBxZGlvX2NoZWNrX291dGJvdW5kX2FmdGVyX3RoaW5pbnQoc3RydWN0IHFkaW9fcSAqcSkKQEAgLTkwNyw3ICs5MTAsNyBAQAogCiAJZm9yX2VhY2hfb3V0cHV0X3F1ZXVlKHEtPmlycV9wdHIsIG91dCwgaSkKIAkJaWYgKCFxZGlvX291dGJvdW5kX3FfZG9uZShvdXQpKQotCQkJdGFza2xldF9zY2hlZHVsZSgmb3V0LT50YXNrbGV0KTsKKwkJCXFkaW9fdGFza2xldF9zY2hlZHVsZShvdXQpOwogfQogCiBzdGF0aWMgdm9pZCBfX3RpcWRpb19pbmJvdW5kX3Byb2Nlc3Npbmcoc3RydWN0IHFkaW9fcSAqcSkKQEAgLTkyOSwxMCArOTMyLDggQEAKIAogCWlmICghcWRpb19pbmJvdW5kX3FfZG9uZShxKSkgewogCQlxcGVyZl9pbmMocSwgdGFza2xldF9pbmJvdW5kX3Jlc2NoZWQpOwotCQlpZiAobGlrZWx5KHEtPmlycV9wdHItPnN0YXRlICE9IFFESU9fSVJRX1NUQVRFX1NUT1BQRUQpKSB7Ci0JCQl0YXNrbGV0X3NjaGVkdWxlKCZxLT50YXNrbGV0KTsKKwkJaWYgKCFxZGlvX3Rhc2tsZXRfc2NoZWR1bGUocSkpCiAJCQlyZXR1cm47Ci0JCX0KIAl9CiAKIAlxZGlvX3N0b3BfcG9sbGluZyhxKTsKQEAgLTk0Miw4ICs5NDMsNyBAQAogCSAqLwogCWlmICghcWRpb19pbmJvdW5kX3FfZG9uZShxKSkgewogCQlxcGVyZl9pbmMocSwgdGFza2xldF9pbmJvdW5kX3Jlc2NoZWQyKTsKLQkJaWYgKGxpa2VseShxLT5pcnFfcHRyLT5zdGF0ZSAhPSBRRElPX0lSUV9TVEFURV9TVE9QUEVEKSkKLQkJCXRhc2tsZXRfc2NoZWR1bGUoJnEtPnRhc2tsZXQpOworCQlxZGlvX3Rhc2tsZXRfc2NoZWR1bGUocSk7CiAJfQogfQogCkBAIC05NzcsNyArOTc3LDcgQEAKIAlpbnQgaTsKIAlzdHJ1Y3QgcWRpb19xICpxOwogCi0JaWYgKHVubGlrZWx5KGlycV9wdHItPnN0YXRlID09IFFESU9fSVJRX1NUQVRFX1NUT1BQRUQpKQorCWlmICh1bmxpa2VseShpcnFfcHRyLT5zdGF0ZSAhPSBRRElPX0lSUV9TVEFURV9BQ1RJVkUpKQogCQlyZXR1cm47CiAKIAlmb3JfZWFjaF9pbnB1dF9xdWV1ZShpcnFfcHRyLCBxLCBpKSB7CkBAIC0xMDAzLDcgKzEwMDMsNyBAQAogCQkJY29udGludWU7CiAJCWlmIChuZWVkX3NpZ2Ffc3luYyhxKSAmJiBuZWVkX3NpZ2Ffc3luY19vdXRfYWZ0ZXJfcGNpKHEpKQogCQkJcWRpb19zaWdhX3N5bmNfcShxKTsKLQkJdGFza2xldF9zY2hlZHVsZSgmcS0+dGFza2xldCk7CisJCXFkaW9fdGFza2xldF9zY2hlZHVsZShxKTsKIAl9CiB9CiAKQEAgLTEwNjYsMTAgKzEwNjYsMTIgQEAKIAkJICAgICAgc3RydWN0IGlyYiAqaXJiKQogewogCXN0cnVjdCBxZGlvX2lycSAqaXJxX3B0ciA9IGNkZXYtPnByaXZhdGUtPnFkaW9fZGF0YTsKKwlzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZDsKIAlpbnQgY3N0YXQsIGRzdGF0OwogCiAJaWYgKCFpbnRwYXJtIHx8ICFpcnFfcHRyKSB7Ci0JCURCRl9FUlJPUigicWludDolNHgiLCBjZGV2LT5wcml2YXRlLT5zY2hpZC5zY2hfbm8pOworCQljY3dfZGV2aWNlX2dldF9zY2hpZChjZGV2LCAmc2NoaWQpOworCQlEQkZfRVJST1IoInFpbnQ6JTR4Iiwgc2NoaWQuc2NoX25vKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTEyMiwxMiArMTEyNCwxNCBAQAogaW50IHFkaW9fZ2V0X3NzcWRfZGVzYyhzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwKIAkJICAgICAgIHN0cnVjdCBxZGlvX3NzcWRfZGVzYyAqZGF0YSkKIHsKKwlzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZDsKIAogCWlmICghY2RldiB8fCAhY2Rldi0+cHJpdmF0ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlEQkZfRVZFTlQoImdldCBzc3FkOiU0eCIsIGNkZXYtPnByaXZhdGUtPnNjaGlkLnNjaF9ubyk7Ci0JcmV0dXJuIHFkaW9fc2V0dXBfZ2V0X3NzcWQoTlVMTCwgJmNkZXYtPnByaXZhdGUtPnNjaGlkLCBkYXRhKTsKKwljY3dfZGV2aWNlX2dldF9zY2hpZChjZGV2LCAmc2NoaWQpOworCURCRl9FVkVOVCgiZ2V0IHNzcWQ6JTR4Iiwgc2NoaWQuc2NoX25vKTsKKwlyZXR1cm4gcWRpb19zZXR1cF9nZXRfc3NxZChOVUxMLCAmc2NoaWQsIGRhdGEpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocWRpb19nZXRfc3NxZF9kZXNjKTsKIApAQCAtMTE0MSw3ICsxMTQ1LDcgQEAKIAkJdGFza2xldF9raWxsKCZxLT50YXNrbGV0KTsKIAogCWZvcl9lYWNoX291dHB1dF9xdWV1ZShpcnFfcHRyLCBxLCBpKSB7Ci0JCWRlbF90aW1lcigmcS0+dS5vdXQudGltZXIpOworCQlkZWxfdGltZXJfc3luYygmcS0+dS5vdXQudGltZXIpOwogCQl0YXNrbGV0X2tpbGwoJnEtPnRhc2tsZXQpOwogCX0KIH0KQEAgLTExNTQsMTQgKzExNTgsMTUgQEAKIGludCBxZGlvX3NodXRkb3duKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBpbnQgaG93KQogewogCXN0cnVjdCBxZGlvX2lycSAqaXJxX3B0ciA9IGNkZXYtPnByaXZhdGUtPnFkaW9fZGF0YTsKKwlzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZDsKIAlpbnQgcmM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghaXJxX3B0cikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlXQVJOX09OX09OQ0UoaXJxc19kaXNhYmxlZCgpKTsKLQlEQkZfRVZFTlQoInFzaHV0ZG93bjolNHgiLCBjZGV2LT5wcml2YXRlLT5zY2hpZC5zY2hfbm8pOworCWNjd19kZXZpY2VfZ2V0X3NjaGlkKGNkZXYsICZzY2hpZCk7CisJREJGX0VWRU5UKCJxc2h1dGRvd246JTR4Iiwgc2NoaWQuc2NoX25vKTsKIAogCW11dGV4X2xvY2soJmlycV9wdHItPnNldHVwX211dGV4KTsKIAkvKgpAQCAtMTE4NCw3ICsxMTg5LDcgQEAKIAlxZGlvX3NodXRkb3duX2RlYnVnX2VudHJpZXMoaXJxX3B0cik7CiAKIAkvKiBjbGVhbnVwIHN1YmNoYW5uZWwgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soY2RldiksIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxKGdldF9jY3dkZXZfbG9jayhjZGV2KSk7CiAKIAlpZiAoaG93ICYgUURJT19GTEFHX0NMRUFOVVBfVVNJTkdfQ0xFQVIpCiAJCXJjID0gY2N3X2RldmljZV9jbGVhcihjZGV2LCBRRElPX0RPSU5HX0NMRUFOVVApOwpAQCAtMTE5OCwxMiArMTIwMywxMiBAQAogCX0KIAogCXFkaW9fc2V0X3N0YXRlKGlycV9wdHIsIFFESU9fSVJRX1NUQVRFX0NMRUFOVVApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKGNkZXYpLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxKGdldF9jY3dkZXZfbG9jayhjZGV2KSk7CiAJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoY2Rldi0+cHJpdmF0ZS0+d2FpdF9xLAogCQlpcnFfcHRyLT5zdGF0ZSA9PSBRRElPX0lSUV9TVEFURV9JTkFDVElWRSB8fAogCQlpcnFfcHRyLT5zdGF0ZSA9PSBRRElPX0lSUV9TVEFURV9FUlIsCiAJCTEwICogSFopOwotCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhjZGV2KSwgZmxhZ3MpOworCXNwaW5fbG9ja19pcnEoZ2V0X2Njd2Rldl9sb2NrKGNkZXYpKTsKIAogbm9fY2xlYW51cDoKIAlxZGlvX3NodXRkb3duX3RoaW5pbnQoaXJxX3B0cik7CkBAIC0xMjExLDcgKzEyMTYsNyBAQAogCS8qIHJlc3RvcmUgaW50ZXJydXB0IGhhbmRsZXIgKi8KIAlpZiAoKHZvaWQgKiljZGV2LT5oYW5kbGVyID09ICh2b2lkICopcWRpb19pbnRfaGFuZGxlcikKIAkJY2Rldi0+aGFuZGxlciA9IGlycV9wdHItPm9yaWdfaGFuZGxlcjsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhjZGV2KSwgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycShnZXRfY2N3ZGV2X2xvY2soY2RldikpOwogCiAJcWRpb19zZXRfc3RhdGUoaXJxX3B0ciwgUURJT19JUlFfU1RBVEVfSU5BQ1RJVkUpOwogCW11dGV4X3VubG9jaygmaXJxX3B0ci0+c2V0dXBfbXV0ZXgpOwpAQCAtMTIyOCwxMSArMTIzMywxMyBAQAogaW50IHFkaW9fZnJlZShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKIHsKIAlzdHJ1Y3QgcWRpb19pcnEgKmlycV9wdHIgPSBjZGV2LT5wcml2YXRlLT5xZGlvX2RhdGE7CisJc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQ7CiAKIAlpZiAoIWlycV9wdHIpCiAJCXJldHVybiAtRU5PREVWOwogCi0JREJGX0VWRU5UKCJxZnJlZTolNHgiLCBjZGV2LT5wcml2YXRlLT5zY2hpZC5zY2hfbm8pOworCWNjd19kZXZpY2VfZ2V0X3NjaGlkKGNkZXYsICZzY2hpZCk7CisJREJGX0VWRU5UKCJxZnJlZTolNHgiLCBzY2hpZC5zY2hfbm8pOwogCURCRl9ERVZfRVZFTlQoREJGX0VSUiwgaXJxX3B0ciwgImRiZiBhYmFuZG9uZWQiKTsKIAltdXRleF9sb2NrKCZpcnFfcHRyLT5zZXR1cF9tdXRleCk7CiAKQEAgLTEyNTEsOSArMTI1OCwxMSBAQAogICovCiBpbnQgcWRpb19hbGxvY2F0ZShzdHJ1Y3QgcWRpb19pbml0aWFsaXplICppbml0X2RhdGEpCiB7CisJc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQ7CiAJc3RydWN0IHFkaW9faXJxICppcnFfcHRyOwogCi0JREJGX0VWRU5UKCJxYWxsb2NhdGU6JTR4IiwgaW5pdF9kYXRhLT5jZGV2LT5wcml2YXRlLT5zY2hpZC5zY2hfbm8pOworCWNjd19kZXZpY2VfZ2V0X3NjaGlkKGluaXRfZGF0YS0+Y2RldiwgJnNjaGlkKTsKKwlEQkZfRVZFTlQoInFhbGxvY2F0ZTolNHgiLCBzY2hpZC5zY2hfbm8pOwogCiAJaWYgKChpbml0X2RhdGEtPm5vX2lucHV0X3FzICYmICFpbml0X2RhdGEtPmlucHV0X2hhbmRsZXIpIHx8CiAJICAgIChpbml0X2RhdGEtPm5vX291dHB1dF9xcyAmJiAhaW5pdF9kYXRhLT5vdXRwdXRfaGFuZGxlcikpCkBAIC0xMzMxLDIwICsxMzQwLDE4IEBACiAgKi8KIGludCBxZGlvX2VzdGFibGlzaChzdHJ1Y3QgcWRpb19pbml0aWFsaXplICppbml0X2RhdGEpCiB7Ci0Jc3RydWN0IHFkaW9faXJxICppcnFfcHRyOwogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2ID0gaW5pdF9kYXRhLT5jZGV2OwotCXVuc2lnbmVkIGxvbmcgc2F2ZWZsYWdzOworCXN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkOworCXN0cnVjdCBxZGlvX2lycSAqaXJxX3B0cjsKIAlpbnQgcmM7CiAKLQlEQkZfRVZFTlQoInFlc3RhYmxpc2g6JTR4IiwgY2Rldi0+cHJpdmF0ZS0+c2NoaWQuc2NoX25vKTsKKwljY3dfZGV2aWNlX2dldF9zY2hpZChjZGV2LCAmc2NoaWQpOworCURCRl9FVkVOVCgicWVzdGFibGlzaDolNHgiLCBzY2hpZC5zY2hfbm8pOwogCiAJaXJxX3B0ciA9IGNkZXYtPnByaXZhdGUtPnFkaW9fZGF0YTsKIAlpZiAoIWlycV9wdHIpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKGNkZXYtPnByaXZhdGUtPnN0YXRlICE9IERFVl9TVEFURV9PTkxJTkUpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJbXV0ZXhfbG9jaygmaXJxX3B0ci0+c2V0dXBfbXV0ZXgpOwogCXFkaW9fc2V0dXBfaXJxKGluaXRfZGF0YSk7CiAKQEAgLTEzNjEsMTcgKzEzNjgsMTQgQEAKIAlpcnFfcHRyLT5jY3cuY291bnQgPSBpcnFfcHRyLT5lcXVldWUuY291bnQ7CiAJaXJxX3B0ci0+Y2N3LmNkYSA9ICh1MzIpKChhZGRyX3QpaXJxX3B0ci0+cWRyKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhjZGV2KSwgc2F2ZWZsYWdzKTsKKwlzcGluX2xvY2tfaXJxKGdldF9jY3dkZXZfbG9jayhjZGV2KSk7CiAJY2N3X2RldmljZV9zZXRfb3B0aW9uc19tYXNrKGNkZXYsIDApOwogCiAJcmMgPSBjY3dfZGV2aWNlX3N0YXJ0KGNkZXYsICZpcnFfcHRyLT5jY3csIFFESU9fRE9JTkdfRVNUQUJMSVNILCAwLCAwKTsKKwlzcGluX3VubG9ja19pcnEoZ2V0X2Njd2Rldl9sb2NrKGNkZXYpKTsKIAlpZiAocmMpIHsKIAkJREJGX0VSUk9SKCIlNHggZXN0IElPIEVSUiIsIGlycV9wdHItPnNjaGlkLnNjaF9ubyk7CiAJCURCRl9FUlJPUigicmM6JTR4IiwgcmMpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhjZGV2KSwgc2F2ZWZsYWdzKTsKLQotCWlmIChyYykgewogCQltdXRleF91bmxvY2soJmlycV9wdHItPnNldHVwX211dGV4KTsKIAkJcWRpb19zaHV0ZG93bihjZGV2LCBRRElPX0ZMQUdfQ0xFQU5VUF9VU0lOR19DTEVBUik7CiAJCXJldHVybiByYzsKQEAgLTE0MDcsMTkgKzE0MTEsMTcgQEAKICAqLwogaW50IHFkaW9fYWN0aXZhdGUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCiB7CisJc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQ7CiAJc3RydWN0IHFkaW9faXJxICppcnFfcHRyOwogCWludCByYzsKLQl1bnNpZ25lZCBsb25nIHNhdmVmbGFnczsKIAotCURCRl9FVkVOVCgicWFjdGl2YXRlOiU0eCIsIGNkZXYtPnByaXZhdGUtPnNjaGlkLnNjaF9ubyk7CisJY2N3X2RldmljZV9nZXRfc2NoaWQoY2RldiwgJnNjaGlkKTsKKwlEQkZfRVZFTlQoInFhY3RpdmF0ZTolNHgiLCBzY2hpZC5zY2hfbm8pOwogCiAJaXJxX3B0ciA9IGNkZXYtPnByaXZhdGUtPnFkaW9fZGF0YTsKIAlpZiAoIWlycV9wdHIpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKGNkZXYtPnByaXZhdGUtPnN0YXRlICE9IERFVl9TVEFURV9PTkxJTkUpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJbXV0ZXhfbG9jaygmaXJxX3B0ci0+c2V0dXBfbXV0ZXgpOwogCWlmIChpcnFfcHRyLT5zdGF0ZSA9PSBRRElPX0lSUV9TVEFURV9JTkFDVElWRSkgewogCQlyYyA9IC1FQlVTWTsKQEAgLTE0MzEsMTkgKzE0MzMsMTcgQEAKIAlpcnFfcHRyLT5jY3cuY291bnQgPSBpcnFfcHRyLT5hcXVldWUuY291bnQ7CiAJaXJxX3B0ci0+Y2N3LmNkYSA9IDA7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soY2RldiksIHNhdmVmbGFncyk7CisJc3Bpbl9sb2NrX2lycShnZXRfY2N3ZGV2X2xvY2soY2RldikpOwogCWNjd19kZXZpY2Vfc2V0X29wdGlvbnMoY2RldiwgQ0NXREVWX1JFUE9SVF9BTEwpOwogCiAJcmMgPSBjY3dfZGV2aWNlX3N0YXJ0KGNkZXYsICZpcnFfcHRyLT5jY3csIFFESU9fRE9JTkdfQUNUSVZBVEUsCiAJCQkgICAgICAwLCBET0lPX0RFTllfUFJFRkVUQ0gpOworCXNwaW5fdW5sb2NrX2lycShnZXRfY2N3ZGV2X2xvY2soY2RldikpOwogCWlmIChyYykgewogCQlEQkZfRVJST1IoIiU0eCBhY3QgSU8gRVJSIiwgaXJxX3B0ci0+c2NoaWQuc2NoX25vKTsKIAkJREJGX0VSUk9SKCJyYzolNHgiLCByYyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKGNkZXYpLCBzYXZlZmxhZ3MpOwotCi0JaWYgKHJjKQogCQlnb3RvIG91dDsKKwl9CiAKIAlpZiAoaXNfdGhpbmludF9pcnEoaXJxX3B0cikpCiAJCXRpcWRpb19hZGRfaW5wdXRfcXVldWVzKGlycV9wdHIpOwpAQCAtMTU4NSwxMCArMTU4NSwxMSBAQAogCiAJLyogaW4gY2FzZSBvZiBTSUdBIGVycm9ycyB3ZSBtdXN0IHByb2Nlc3MgdGhlIGVycm9yIGltbWVkaWF0ZWx5ICovCiAJaWYgKHVzZWQgPj0gcS0+dS5vdXQuc2Nhbl90aHJlc2hvbGQgfHwgcmMpCi0JCXRhc2tsZXRfc2NoZWR1bGUoJnEtPnRhc2tsZXQpOworCQlxZGlvX3Rhc2tsZXRfc2NoZWR1bGUocSk7CiAJZWxzZQogCQkvKiBmcmVlIHRoZSBTQkFMcyBpbiBjYXNlIG9mIG5vIGZ1cnRoZXIgdHJhZmZpYyAqLwotCQlpZiAoIXRpbWVyX3BlbmRpbmcoJnEtPnUub3V0LnRpbWVyKSkKKwkJaWYgKCF0aW1lcl9wZW5kaW5nKCZxLT51Lm91dC50aW1lcikgJiYKKwkJICAgIGxpa2VseShxLT5pcnFfcHRyLT5zdGF0ZSA9PSBRRElPX0lSUV9TVEFURV9BQ1RJVkUpKQogCQkJbW9kX3RpbWVyKCZxLT51Lm91dC50aW1lciwgamlmZmllcyArIEhaKTsKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZS5oIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmUuaAppbmRleCBiZjQwMDYzLi42ZDRiNjhjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmUuaAorKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZS5oCkBAIC05OTksNiArOTk5LDcgQEAKIAkJCQkJCSBfX3UxNiwgX191MTYsCiAJCQkJCQkgZW51bSBxZXRoX3Byb3RfdmVyc2lvbnMpOwogaW50IHFldGhfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICosIG5ldGRldl9mZWF0dXJlc190KTsKK2ludCBxZXRoX3JlY292ZXJfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKik7CiBuZXRkZXZfZmVhdHVyZXNfdCBxZXRoX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqLCBuZXRkZXZfZmVhdHVyZXNfdCk7CiAKIC8qIGV4cG9ydHMgZm9yIE9TTiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCmluZGV4IDdkYmE2YzguLjIwY2YyOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKQEAgLTM2MTksNyArMzYxOSw4IEBACiAJCWludCBlOwogCiAJCWUgPSAwOwotCQl3aGlsZSAoYnVmZmVyLT5lbGVtZW50W2VdLmFkZHIpIHsKKwkJd2hpbGUgKChlIDwgUURJT19NQVhfRUxFTUVOVFNfUEVSX0JVRkZFUikgJiYKKwkJICAgICAgIGJ1ZmZlci0+ZWxlbWVudFtlXS5hZGRyKSB7CiAJCQl1bnNpZ25lZCBsb25nIHBoeXNfYW9iX2FkZHI7CiAKIAkJCXBoeXNfYW9iX2FkZHIgPSAodW5zaWduZWQgbG9uZykgYnVmZmVyLT5lbGVtZW50W2VdLmFkZHI7CkBAIC02MTMxLDYgKzYxMzIsMzUgQEAKIAlyZXR1cm4gcmM7CiB9CiAKKy8qIHRyeSB0byByZXN0b3JlIGRldmljZSBmZWF0dXJlcyBvbiBhIGRldmljZSBhZnRlciByZWNvdmVyeSAqLworaW50IHFldGhfcmVjb3Zlcl9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQgPSBkZXYtPm1sX3ByaXY7CisJbmV0ZGV2X2ZlYXR1cmVzX3QgcmVjb3ZlciA9IGRldi0+ZmVhdHVyZXM7CisKKwlpZiAocmVjb3ZlciAmIE5FVElGX0ZfSVBfQ1NVTSkgeworCQlpZiAocWV0aF9zZXRfaXBhX2NzdW0oY2FyZCwgMSwgSVBBX09VVEJPVU5EX0NIRUNLU1VNKSkKKwkJCXJlY292ZXIgXj0gTkVUSUZfRl9JUF9DU1VNOworCX0KKwlpZiAocmVjb3ZlciAmIE5FVElGX0ZfUlhDU1VNKSB7CisJCWlmIChxZXRoX3NldF9pcGFfY3N1bShjYXJkLCAxLCBJUEFfSU5CT1VORF9DSEVDS1NVTSkpCisJCQlyZWNvdmVyIF49IE5FVElGX0ZfUlhDU1VNOworCX0KKwlpZiAocmVjb3ZlciAmIE5FVElGX0ZfVFNPKSB7CisJCWlmIChxZXRoX3NldF9pcGFfdHNvKGNhcmQsIDEpKQorCQkJcmVjb3ZlciBePSBORVRJRl9GX1RTTzsKKwl9CisKKwlpZiAocmVjb3ZlciA9PSBkZXYtPmZlYXR1cmVzKQorCQlyZXR1cm4gMDsKKworCWRldl93YXJuKCZjYXJkLT5nZGV2LT5kZXYsCisJCSAiRGV2aWNlIHJlY292ZXJ5IGZhaWxlZCB0byByZXN0b3JlIGFsbCBvZmZsb2FkIGZlYXR1cmVzXG4iKTsKKwlkZXYtPmZlYXR1cmVzID0gcmVjb3ZlcjsKKwlyZXR1cm4gLUVJTzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHFldGhfcmVjb3Zlcl9mZWF0dXJlcyk7CisKIGludCBxZXRoX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkID0gZGV2LT5tbF9wcml2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wyX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sMl9tYWluLmMKaW5kZXggN2JjMjBjNS4uYmIyNzA1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wyX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDJfbWFpbi5jCkBAIC0xMTI0LDE0ICsxMTI0LDExIEBACiAJCQljYXJkLT5kZXYtPmh3X2ZlYXR1cmVzIHw9IE5FVElGX0ZfUlhDU1VNOwogCQkJY2FyZC0+ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfUlhDU1VNOwogCQl9Ci0JCS8qIFR1cm4gb24gU0cgcGVyIGRlZmF1bHQgKi8KLQkJY2FyZC0+ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHOwogCX0KIAljYXJkLT5pbmZvLmJyb2FkY2FzdF9jYXBhYmxlID0gMTsKIAlxZXRoX2wyX3JlcXVlc3RfaW5pdGlhbF9tYWMoY2FyZCk7CiAJY2FyZC0+ZGV2LT5nc29fbWF4X3NpemUgPSAoUUVUSF9NQVhfQlVGRkVSX0VMRU1FTlRTKGNhcmQpIC0gMSkgKgogCQkJCSAgUEFHRV9TSVpFOwotCWNhcmQtPmRldi0+Z3NvX21heF9zZWdzID0gKFFFVEhfTUFYX0JVRkZFUl9FTEVNRU5UUyhjYXJkKSAtIDEpOwogCVNFVF9ORVRERVZfREVWKGNhcmQtPmRldiwgJmNhcmQtPmdkZXYtPmRldik7CiAJbmV0aWZfbmFwaV9hZGQoY2FyZC0+ZGV2LCAmY2FyZC0+bmFwaSwgcWV0aF9sMl9wb2xsLCBRRVRIX05BUElfV0VJR0hUKTsKIAluZXRpZl9jYXJyaWVyX29mZihjYXJkLT5kZXYpOwpAQCAtMTI0Niw2ICsxMjQzLDkgQEAKIAkJfQogCQkvKiB0aGlzIGFsc28gc2V0cyBzYXZlZCB1bmljYXN0IGFkZHJlc3NlcyAqLwogCQlxZXRoX2wyX3NldF9yeF9tb2RlKGNhcmQtPmRldik7CisJCXJ0bmxfbG9jaygpOworCQlxZXRoX3JlY292ZXJfZmVhdHVyZXMoY2FyZC0+ZGV2KTsKKwkJcnRubF91bmxvY2soKTsKIAl9CiAJLyogbGV0IHVzZXJfc3BhY2Uga25vdyB0aGF0IGRldmljZSBpcyBvbmxpbmUgKi8KIAlrb2JqZWN0X3VldmVudCgmZ2Rldi0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jCmluZGV4IDcyOTM0NjYuLjI3MmQ5ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX21haW4uYwpAQCAtMjU3LDYgKzI1NywxMSBAQAogCWlmIChhZGRyLT5pbl9wcm9ncmVzcykKIAkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKIAorCWlmICghcWV0aF9jYXJkX2h3X2lzX3JlYWNoYWJsZShjYXJkKSkgeworCQlhZGRyLT5kaXNwX2ZsYWcgPSBRRVRIX0RJU1BfQUREUl9ERUxFVEU7CisJCXJldHVybiAwOworCX0KKwogCXJjID0gcWV0aF9sM19kZXJlZ2lzdGVyX2FkZHJfZW50cnkoY2FyZCwgYWRkcik7CiAKIAloYXNoX2RlbCgmYWRkci0+aG5vZGUpOwpAQCAtMjk2LDYgKzMwMSwxMSBAQAogCQloYXNoX2FkZChjYXJkLT5pcF9odGFibGUsICZhZGRyLT5obm9kZSwKIAkJCQlxZXRoX2wzX2lwYWRkcl9oYXNoKGFkZHIpKTsKIAorCQlpZiAoIXFldGhfY2FyZF9od19pc19yZWFjaGFibGUoY2FyZCkpIHsKKwkJCWFkZHItPmRpc3BfZmxhZyA9IFFFVEhfRElTUF9BRERSX0FERDsKKwkJCXJldHVybiAwOworCQl9CisKIAkJLyogcWV0aF9sM19yZWdpc3Rlcl9hZGRyX2VudHJ5IGNhbiBnbyB0byBzbGVlcAogCQkgKiBpZiB3ZSBhZGQgYSBJUFY0IGFkZHIuIEl0IGlzIGNhdXNlZCBieSB0aGUgcmVhc29uCiAJCSAqIHRoYXQgU0VUSVAgaXBhIGNtZCBzdGFydHMgQVJQIHN0YWZmIGZvciBJUFY0IGFkZHIuCkBAIC0zOTAsMTIgKzQwMCwxNiBAQAogCWludCBpOwogCWludCByYzsKIAotCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJyZWNvdmVyaXAiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAicmVjb3ZyaXAiKTsKIAogCXNwaW5fbG9ja19iaCgmY2FyZC0+aXBfbG9jayk7CiAKIAloYXNoX2Zvcl9lYWNoX3NhZmUoY2FyZC0+aXBfaHRhYmxlLCBpLCB0bXAsIGFkZHIsIGhub2RlKSB7Ci0JCWlmIChhZGRyLT5kaXNwX2ZsYWcgPT0gUUVUSF9ESVNQX0FERFJfQUREKSB7CisJCWlmIChhZGRyLT5kaXNwX2ZsYWcgPT0gUUVUSF9ESVNQX0FERFJfREVMRVRFKSB7CisJCQlxZXRoX2wzX2RlcmVnaXN0ZXJfYWRkcl9lbnRyeShjYXJkLCBhZGRyKTsKKwkJCWhhc2hfZGVsKCZhZGRyLT5obm9kZSk7CisJCQlrZnJlZShhZGRyKTsKKwkJfSBlbHNlIGlmIChhZGRyLT5kaXNwX2ZsYWcgPT0gUUVUSF9ESVNQX0FERFJfQUREKSB7CiAJCQlpZiAoYWRkci0+cHJvdG8gPT0gUUVUSF9QUk9UX0lQVjQpIHsKIAkJCQlhZGRyLT5pbl9wcm9ncmVzcyA9IDE7CiAJCQkJc3Bpbl91bmxvY2tfYmgoJmNhcmQtPmlwX2xvY2spOwpAQCAtNDA3LDEwICs0MjEsOCBAQAogCiAJCQlpZiAoIXJjKSB7CiAJCQkJYWRkci0+ZGlzcF9mbGFnID0gUUVUSF9ESVNQX0FERFJfRE9fTk9USElORzsKLQkJCQlpZiAoYWRkci0+cmVmX2NvdW50ZXIgPCAxKSB7CisJCQkJaWYgKGFkZHItPnJlZl9jb3VudGVyIDwgMSkKIAkJCQkJcWV0aF9sM19kZWxldGVfaXAoY2FyZCwgYWRkcik7Ci0JCQkJCWtmcmVlKGFkZHIpOwotCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJaGFzaF9kZWwoJmFkZHItPmhub2RlKTsKIAkJCQlrZnJlZShhZGRyKTsKQEAgLTY4OSw3ICs3MDEsNyBAQAogCiAJc3Bpbl9sb2NrX2JoKCZjYXJkLT5pcF9sb2NrKTsKIAotCWlmICghcWV0aF9sM19pcF9mcm9tX2hhc2goY2FyZCwgaXBhZGRyKSkKKwlpZiAocWV0aF9sM19pcF9mcm9tX2hhc2goY2FyZCwgaXBhZGRyKSkKIAkJcmMgPSAtRUVYSVNUOwogCWVsc2UKIAkJcWV0aF9sM19hZGRfaXAoY2FyZCwgaXBhZGRyKTsKQEAgLTc1Nyw3ICs3NjksNyBAQAogCiAJc3Bpbl9sb2NrX2JoKCZjYXJkLT5pcF9sb2NrKTsKIAotCWlmICghcWV0aF9sM19pcF9mcm9tX2hhc2goY2FyZCwgaXBhZGRyKSkKKwlpZiAocWV0aF9sM19pcF9mcm9tX2hhc2goY2FyZCwgaXBhZGRyKSkKIAkJcmMgPSAtRUVYSVNUOwogCWVsc2UKIAkJcWV0aF9sM19hZGRfaXAoY2FyZCwgaXBhZGRyKTsKQEAgLTMxMDgsNyArMzEyMCw2IEBACiAJCQkJY2FyZC0+ZGV2LT52bGFuX2ZlYXR1cmVzID0gTkVUSUZfRl9TRyB8CiAJCQkJCU5FVElGX0ZfUlhDU1VNIHwgTkVUSUZfRl9JUF9DU1VNIHwKIAkJCQkJTkVUSUZfRl9UU087Ci0JCQkJY2FyZC0+ZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfU0c7CiAJCQl9CiAJCX0KIAl9IGVsc2UgaWYgKGNhcmQtPmluZm8udHlwZSA9PSBRRVRIX0NBUkRfVFlQRV9JUUQpIHsKQEAgLTMxMzYsNyArMzE0Nyw2IEBACiAJbmV0aWZfa2VlcF9kc3QoY2FyZC0+ZGV2KTsKIAljYXJkLT5kZXYtPmdzb19tYXhfc2l6ZSA9IChRRVRIX01BWF9CVUZGRVJfRUxFTUVOVFMoY2FyZCkgLSAxKSAqCiAJCQkJICBQQUdFX1NJWkU7Ci0JY2FyZC0+ZGV2LT5nc29fbWF4X3NlZ3MgPSAoUUVUSF9NQVhfQlVGRkVSX0VMRU1FTlRTKGNhcmQpIC0gMSk7CiAKIAlTRVRfTkVUREVWX0RFVihjYXJkLT5kZXYsICZjYXJkLT5nZGV2LT5kZXYpOwogCW5ldGlmX25hcGlfYWRkKGNhcmQtPmRldiwgJmNhcmQtPm5hcGksIHFldGhfbDNfcG9sbCwgUUVUSF9OQVBJX1dFSUdIVCk7CkBAIC0zMjY5LDYgKzMyNzksNyBAQAogCQllbHNlCiAJCQlkZXZfb3BlbihjYXJkLT5kZXYpOwogCQlxZXRoX2wzX3NldF9tdWx0aWNhc3RfbGlzdChjYXJkLT5kZXYpOworCQlxZXRoX3JlY292ZXJfZmVhdHVyZXMoY2FyZC0+ZGV2KTsKIAkJcnRubF91bmxvY2soKTsKIAl9CiAJcWV0aF90cmFjZV9mZWF0dXJlcyhjYXJkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19zeXMuYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19zeXMuYwppbmRleCA2NTY0NWIxLi4wZTAwYTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfc3lzLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX3N5cy5jCkBAIC0yOTcsNyArMjk3LDkgQEAKIAkJYWRkci0+dS5hNi5wZnhsZW4gPSAwOwogCQlhZGRyLT50eXBlID0gUUVUSF9JUF9UWVBFX05PUk1BTDsKIAorCQlzcGluX2xvY2tfYmgoJmNhcmQtPmlwX2xvY2spOwogCQlxZXRoX2wzX2RlbGV0ZV9pcChjYXJkLCBhZGRyKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmNhcmQtPmlwX2xvY2spOwogCQlrZnJlZShhZGRyKTsKIAl9CiAKQEAgLTMyOSw3ICszMzEsMTAgQEAKIAkJYWRkci0+dHlwZSA9IFFFVEhfSVBfVFlQRV9OT1JNQUw7CiAJfSBlbHNlCiAJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2JoKCZjYXJkLT5pcF9sb2NrKTsKIAlxZXRoX2wzX2FkZF9pcChjYXJkLCBhZGRyKTsKKwlzcGluX3VubG9ja19iaCgmY2FyZC0+aXBfbG9jayk7CiAJa2ZyZWUoYWRkcik7CiAKIAlyZXR1cm4gY291bnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2F1eC5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYwppbmRleCBjMDBhYzQ2Li5iY2M4ZjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2F1eC5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfYXV4LmMKQEAgLTMxMCw3ICszMTAsNyBAQAogCiAJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiemZjcF9xXyVzIiwKIAkJIGRldl9uYW1lKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYpKTsKLQlhZGFwdGVyLT53b3JrX3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUobmFtZSk7CisJYWRhcHRlci0+d29ya19xdWV1ZSA9IGFsbG9jX29yZGVyZWRfd29ya3F1ZXVlKG5hbWUsIFdRX01FTV9SRUNMQUlNKTsKIAogCWlmIChhZGFwdGVyLT53b3JrX3F1ZXVlKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1jdHJsLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jCmluZGV4IGIzODFiMzcxLi41NjQ4YjcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1jdHJsLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAlzdHJ1Y3QgZmliICpmaWJwdHI7CiAJc3RydWN0IGh3X2ZpYiAqIGh3X2ZpYiA9IChzdHJ1Y3QgaHdfZmliICopMDsKIAlkbWFfYWRkcl90IGh3X2ZpYl9wYSA9IChkbWFfYWRkcl90KTBMTDsKLQl1bnNpZ25lZCBzaXplOworCXVuc2lnbmVkIGludCBzaXplLCBvc2l6ZTsKIAlpbnQgcmV0dmFsOwogCiAJaWYgKGRldi0+aW5fcmVzZXQpIHsKQEAgLTg3LDcgKzg3LDggQEAKIAkgKgl3aWxsIG5vdCBvdmVycnVuIHRoZSBidWZmZXIgd2hlbiB3ZSBjb3B5IHRoZSBtZW1vcnkuIFJldHVybgogCSAqCWFuIGVycm9yIGlmIHdlIHdvdWxkLgogCSAqLwotCXNpemUgPSBsZTE2X3RvX2NwdShrZmliLT5oZWFkZXIuU2l6ZSkgKyBzaXplb2Yoc3RydWN0IGFhY19maWJoZHIpOworCW9zaXplID0gc2l6ZSA9IGxlMTZfdG9fY3B1KGtmaWItPmhlYWRlci5TaXplKSArCisJCXNpemVvZihzdHJ1Y3QgYWFjX2ZpYmhkcik7CiAJaWYgKHNpemUgPCBsZTE2X3RvX2NwdShrZmliLT5oZWFkZXIuU2VuZGVyU2l6ZSkpCiAJCXNpemUgPSBsZTE2X3RvX2NwdShrZmliLT5oZWFkZXIuU2VuZGVyU2l6ZSk7CiAJaWYgKHNpemUgPiBkZXYtPm1heF9maWJfc2l6ZSkgewpAQCAtMTE4LDYgKzExOSwxNCBAQAogCQlnb3RvIGNsZWFudXA7CiAJfQogCisJLyogU2FuaXR5IGNoZWNrIHRoZSBzZWNvbmQgY29weSAqLworCWlmICgob3NpemUgIT0gbGUxNl90b19jcHUoa2ZpYi0+aGVhZGVyLlNpemUpICsKKwkJc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKSkKKwkJfHwgKHNpemUgPCBsZTE2X3RvX2NwdShrZmliLT5oZWFkZXIuU2VuZGVyU2l6ZSkpKSB7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKIAlpZiAoa2ZpYi0+aGVhZGVyLkNvbW1hbmQgPT0gY3B1X3RvX2xlMTYoVGFrZUFCcmVha1B0KSkgewogCQlhYWNfYWRhcHRlcl9pbnRlcnJ1cHQoZGV2KTsKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jb25zdGFudHMuYyBiL2RyaXZlcnMvc2NzaS9jb25zdGFudHMuYwppbmRleCA4MzQ1OGY3Li42ZGM5NmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvY29uc3RhbnRzLmMKKysrIGIvZHJpdmVycy9zY3NpL2NvbnN0YW50cy5jCkBAIC0zNjEsOCArMzYxLDkgQEAKIAogLyogR2V0IHNlbnNlIGtleSBzdHJpbmcgb3IgTlVMTCBpZiBub3QgYXZhaWxhYmxlICovCiBjb25zdCBjaGFyICoKLXNjc2lfc2Vuc2Vfa2V5X3N0cmluZyh1bnNpZ25lZCBjaGFyIGtleSkgewotCWlmIChrZXkgPD0gMHhFKQorc2NzaV9zZW5zZV9rZXlfc3RyaW5nKHVuc2lnbmVkIGNoYXIga2V5KQoreworCWlmIChrZXkgPCBBUlJBWV9TSVpFKHNuc3RleHQpKQogCQlyZXR1cm4gc25zdGV4dFtrZXldOwogCXJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2I0aS9jeGdiNGkuYyBiL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiNGkvY3hnYjRpLmMKaW5kZXggZTRiYTJkMi4uN2MwZDdhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2I0aS9jeGdiNGkuYworKysgYi9kcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjRpL2N4Z2I0aS5jCkBAIC04NCw2ICs4NCw5IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY3hnYjRfdWxkX2luZm8gY3hnYjRpX3VsZF9pbmZvID0gewogCS5uYW1lID0gRFJWX01PRFVMRV9OQU1FLAorCS5ucnhxID0gTUFYX1VMRF9RU0VUUywKKwkucnhxX3NpemUgPSAxMDI0LAorCS5scm8gPSBmYWxzZSwKIAkuYWRkID0gdDRfdWxkX2FkZCwKIAkucnhfaGFuZGxlciA9IHQ0X3VsZF9yeF9oYW5kbGVyLAogCS5zdGF0ZV9jaGFuZ2UgPSB0NF91bGRfc3RhdGVfY2hhbmdlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZV9jdGxyLmMgYi9kcml2ZXJzL3Njc2kvZmNvZS9mY29lX2N0bHIuYwppbmRleCBhNTY5YzY1Li5kY2YzNjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZmNvZS9mY29lX2N0bHIuYworKysgYi9kcml2ZXJzL3Njc2kvZmNvZS9mY29lX2N0bHIuYwpAQCAtMjkyMyw3ICsyOTIzLDcgQEAKIAltdXRleF91bmxvY2soJmZpcC0+Y3Rscl9tdXRleCk7CiAKIGRyb3A6Ci0Ja2ZyZWUoc2tiKTsKKwlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gcmM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ob3N0cy5jIGIvZHJpdmVycy9zY3NpL2hvc3RzLmMKaW5kZXggYmE5YWY0YS4uZWM2MzgxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hvc3RzLmMKKysrIGIvZHJpdmVycy9zY3NpL2hvc3RzLmMKQEAgLTQ4Niw2ICs0ODYsOCBAQAogCWVsc2UKIAkJc2hvc3QtPmRtYV9ib3VuZGFyeSA9IDB4ZmZmZmZmZmY7CiAKKwlzaG9zdC0+dXNlX2Jsa19tcSA9IHNjc2lfdXNlX2Jsa19tcTsKKwogCWRldmljZV9pbml0aWFsaXplKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKIAlkZXZfc2V0X25hbWUoJnNob3N0LT5zaG9zdF9nZW5kZXYsICJob3N0JWQiLCBzaG9zdC0+aG9zdF9ubyk7CiAJc2hvc3QtPnNob3N0X2dlbmRldi5idXMgPSAmc2NzaV9idXNfdHlwZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfYmFzZS5jIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMKaW5kZXggMmRhYjNkYy4uYzFlZDI1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMKQEAgLTUwMzcsNyArNTAzNyw3IEBACiAJLyogRmluZCBmaXJzdCBtZW1vcnkgYmFyICovCiAJYmFyX2xpc3QgPSBwY2lfc2VsZWN0X2JhcnMoaW5zdGFuY2UtPnBkZXYsIElPUkVTT1VSQ0VfTUVNKTsKIAlpbnN0YW5jZS0+YmFyID0gZmluZF9maXJzdF9iaXQoJmJhcl9saXN0LCBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCWlmIChwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zKGluc3RhbmNlLT5wZGV2LCBpbnN0YW5jZS0+YmFyLAorCWlmIChwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zKGluc3RhbmNlLT5wZGV2LCAxPDxpbnN0YW5jZS0+YmFyLAogCQkJCQkgIm1lZ2FzYXM6IExTSSIpKSB7CiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmluc3RhbmNlLT5wZGV2LT5kZXYsICJJTyBtZW1vcnkgcmVnaW9uIGJ1c3khXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTUzMzksNyArNTMzOSw3IEBACiAJaW91bm1hcChpbnN0YW5jZS0+cmVnX3NldCk7CiAKICAgICAgIGZhaWxfaW9yZW1hcDoKLQlwY2lfcmVsZWFzZV9zZWxlY3RlZF9yZWdpb25zKGluc3RhbmNlLT5wZGV2LCBpbnN0YW5jZS0+YmFyKTsKKwlwY2lfcmVsZWFzZV9zZWxlY3RlZF9yZWdpb25zKGluc3RhbmNlLT5wZGV2LCAxPDxpbnN0YW5jZS0+YmFyKTsKIAogCXJldHVybiAtRUlOVkFMOwogfQpAQCAtNTM2MCw3ICs1MzYwLDcgQEAKIAogCWlvdW5tYXAoaW5zdGFuY2UtPnJlZ19zZXQpOwogCi0JcGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyhpbnN0YW5jZS0+cGRldiwgaW5zdGFuY2UtPmJhcik7CisJcGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyhpbnN0YW5jZS0+cGRldiwgMTw8aW5zdGFuY2UtPmJhcik7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mdXNpb24uYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmMKaW5kZXggZWM4Mzc1NC4uNTJkOGJiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mdXNpb24uYworKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Z1c2lvbi5jCkBAIC0yNjAzLDcgKzI2MDMsNyBAQAogCiAJaW91bm1hcChpbnN0YW5jZS0+cmVnX3NldCk7CiAKLQlwY2lfcmVsZWFzZV9zZWxlY3RlZF9yZWdpb25zKGluc3RhbmNlLT5wZGV2LCBpbnN0YW5jZS0+YmFyKTsKKwlwY2lfcmVsZWFzZV9zZWxlY3RlZF9yZWdpb25zKGluc3RhbmNlLT5wZGV2LCAxPDxpbnN0YW5jZS0+YmFyKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0M3Nhcy9tcHQzc2FzX2Jhc2UuYyBiL2RyaXZlcnMvc2NzaS9tcHQzc2FzL21wdDNzYXNfYmFzZS5jCmluZGV4IDc1MWYxM2UuLjc1MGY4MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQzc2FzL21wdDNzYXNfYmFzZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQzc2FzL21wdDNzYXNfYmFzZS5jCkBAIC0yMTg4LDYgKzIxODgsMTcgQEAKIAl9IGVsc2UKIAkJaW9jLT5tc2l4OTZfdmVjdG9yID0gMDsKIAorCWlmIChpb2MtPmlzX3dhcnBkcml2ZSkgeworCQlpb2MtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleFswXSA9IChyZXNvdXJjZV9zaXplX3QgX19pb21lbSAqKQorCQkgICAgJmlvYy0+Y2hpcC0+UmVwbHlQb3N0SG9zdEluZGV4OworCisJCWZvciAoaSA9IDE7IGkgPCBpb2MtPmNwdV9tc2l4X3RhYmxlX3N6OyBpKyspCisJCQlpb2MtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleFtpXSA9CisJCQkocmVzb3VyY2Vfc2l6ZV90IF9faW9tZW0gKikKKwkJCSgodTggX19pb21lbSAqKSZpb2MtPmNoaXAtPkRvb3JiZWxsICsgKDB4NDAwMCArICgoaSAtIDEpCisJCQkqIDQpKSk7CisJfQorCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXBseV9xLCAmaW9jLT5yZXBseV9xdWV1ZV9saXN0LCBsaXN0KQogCQlwcl9pbmZvKE1QVDNTQVNfRk1UICIlczogSVJRICVkXG4iLAogCQkgICAgcmVwbHlfcS0+bmFtZSwgICgoaW9jLT5tc2l4X2VuYWJsZSkgPyAiUENJLU1TSS1YIGVuYWJsZWQiIDoKQEAgLTUyODAsMTcgKzUyOTEsNiBAQAogCWlmIChyKQogCQlnb3RvIG91dF9mcmVlX3Jlc291cmNlczsKIAotCWlmIChpb2MtPmlzX3dhcnBkcml2ZSkgewotCQlpb2MtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleFswXSA9IChyZXNvdXJjZV9zaXplX3QgX19pb21lbSAqKQotCQkgICAgJmlvYy0+Y2hpcC0+UmVwbHlQb3N0SG9zdEluZGV4OwotCi0JCWZvciAoaSA9IDE7IGkgPCBpb2MtPmNwdV9tc2l4X3RhYmxlX3N6OyBpKyspCi0JCQlpb2MtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleFtpXSA9Ci0JCQkocmVzb3VyY2Vfc2l6ZV90IF9faW9tZW0gKikKLQkJCSgodTggX19pb21lbSAqKSZpb2MtPmNoaXAtPkRvb3JiZWxsICsgKDB4NDAwMCArICgoaSAtIDEpCi0JCQkqIDQpKSk7Ci0JfQotCiAJcGNpX3NldF9kcnZkYXRhKGlvYy0+cGRldiwgaW9jLT5zaG9zdCk7CiAJciA9IF9iYXNlX2dldF9pb2NfZmFjdHMoaW9jLCBDQU5fU0xFRVApOwogCWlmIChyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9zY3NpLmMKaW5kZXggMWYzNmFjYS4uMWRlYjZhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaS5jCkBAIC0xMTYwLDcgKzExNjAsNiBAQAogYm9vbCBzY3NpX3VzZV9ibGtfbXEgPSBmYWxzZTsKICNlbmRpZgogbW9kdWxlX3BhcmFtX25hbWVkKHVzZV9ibGtfbXEsIHNjc2lfdXNlX2Jsa19tcSwgYm9vbCwgU19JV1VTUiB8IFNfSVJVR08pOwotRVhQT1JUX1NZTUJPTF9HUEwoc2NzaV91c2VfYmxrX21xKTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9zY3NpKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9kZXZpbmZvLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZXZpbmZvLmMKaW5kZXggZWFjY2Q2NS4uMjQ2NDU2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfZGV2aW5mby5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2RldmluZm8uYwpAQCAtMjQ2LDYgKzI0NiwxMCBAQAogCXsiSUJNIiwgIlVuaXZlcnNhbCBYcG9ydCIsICIqIiwgQkxJU1RfTk9fVUxEX0FUVEFDSH0sCiAJeyJTVU4iLCAiVW5pdmVyc2FsIFhwb3J0IiwgIioiLCBCTElTVF9OT19VTERfQVRUQUNIfSwKIAl7IkRFTEwiLCAiVW5pdmVyc2FsIFhwb3J0IiwgIioiLCBCTElTVF9OT19VTERfQVRUQUNIfSwKKwl7IlNUSyIsICJVbml2ZXJzYWwgWHBvcnQiLCAiKiIsIEJMSVNUX05PX1VMRF9BVFRBQ0h9LAorCXsiTkVUQVBQIiwgIlVuaXZlcnNhbCBYcG9ydCIsICIqIiwgQkxJU1RfTk9fVUxEX0FUVEFDSH0sCisJeyJMU0kiLCAiVW5pdmVyc2FsIFhwb3J0IiwgIioiLCBCTElTVF9OT19VTERfQVRUQUNIfSwKKwl7IkVOR0VOSU8iLCAiVW5pdmVyc2FsIFhwb3J0IiwgIioiLCBCTElTVF9OT19VTERfQVRUQUNIfSwKIAl7IlNNU0MiLCAiVVNCIDIgSFMtQ0YiLCBOVUxMLCBCTElTVF9TUEFSU0VMVU4gfCBCTElTVF9JTlFVSVJZXzM2fSwKIAl7IlNPTlkiLCAiQ0QtUk9NIENEVS04MDAxIiwgTlVMTCwgQkxJU1RfQk9SS0VOfSwKIAl7IlNPTlkiLCAiVFNMIiwgTlVMTCwgQkxJU1RfRk9SQ0VMVU59LAkJLyogRERTMyAmIEREUzQgYXV0b2xvYWRlcnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3ByaXYuaCBiL2RyaXZlcnMvc2NzaS9zY3NpX3ByaXYuaAppbmRleCA1N2E0Yjk5Li44NWM4YTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9wcml2LmgKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oCkBAIC0yOSw2ICsyOSw3IEBACiBleHRlcm4gdm9pZCBzY3NpX2V4aXRfaG9zdHModm9pZCk7CiAKIC8qIHNjc2kuYyAqLworZXh0ZXJuIGJvb2wgc2NzaV91c2VfYmxrX21xOwogZXh0ZXJuIGludCBzY3NpX3NldHVwX2NvbW1hbmRfZnJlZWxpc3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpOwogZXh0ZXJuIHZvaWQgc2NzaV9kZXN0cm95X2NvbW1hbmRfZnJlZWxpc3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpOwogI2lmZGVmIENPTkZJR19TQ1NJX0xPR0dJTkcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYwppbmRleCAzZjBmZjA3Li42MGI2NTFiZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMKQEAgLTM0MSwyMiArMzQxLDYgQEAKIH0KIAogLyoqCi0gKiBpc19zYXNfYXR0YWNoZWQgLSBjaGVjayBpZiBkZXZpY2UgaXMgU0FTIGF0dGFjaGVkCi0gKiBAc2Rldjogc2NzaSBkZXZpY2UgdG8gY2hlY2sKLSAqCi0gKiByZXR1cm5zIHRydWUgaWYgdGhlIGRldmljZSBpcyBTQVMgYXR0YWNoZWQKLSAqLwotaW50IGlzX3Nhc19hdHRhY2hlZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCi17Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBzZGV2LT5ob3N0OwotCi0JcmV0dXJuIHNob3N0LT50cmFuc3BvcnR0LT5ob3N0X2F0dHJzLmFjLmNsYXNzID09Ci0JCSZzYXNfaG9zdF9jbGFzcy5jbGFzczsKLX0KLUVYUE9SVF9TWU1CT0woaXNfc2FzX2F0dGFjaGVkKTsKLQotCi0vKioKICAqIHNhc19yZW1vdmVfY2hpbGRyZW4gIC0gIHRlYXIgZG93biBhIGRldmljZXMgU0FTIGRhdGEgc3RydWN0dXJlcwogICogQGRldjoJZGV2aWNlIGJlbG9uZ2luZyB0byB0aGUgc2FzIG9iamVjdAogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZXMuYyBiL2RyaXZlcnMvc2NzaS9zZXMuYwppbmRleCA1M2VmMWNiLi44YzlhMzVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2VzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Nlcy5jCkBAIC01ODcsNyArNTg3LDcgQEAKIAogCXNlc19lbmNsb3N1cmVfZGF0YV9wcm9jZXNzKGVkZXYsIHRvX3Njc2lfZGV2aWNlKGVkZXYtPmVkZXYucGFyZW50KSwgMCk7CiAKLQlpZiAoaXNfc2FzX2F0dGFjaGVkKHNkZXYpKQorCWlmIChzY3NpX2lzX3Nhc19ycGh5KCZzZGV2LT5zZGV2X2dlbmRldikpCiAJCWVmZC5hZGRyID0gc2FzX2dldF9hZGRyZXNzKHNkZXYpOwogCiAJaWYgKGVmZC5hZGRyKSB7CkBAIC03NzgsNiArNzc4LDggQEAKIAlpZiAoIWVkZXYpCiAJCXJldHVybjsKIAorCWVuY2xvc3VyZV91bnJlZ2lzdGVyKGVkZXYpOworCiAJc2VzX2RldiA9IGVkZXYtPnNjcmF0Y2g7CiAJZWRldi0+c2NyYXRjaCA9IE5VTEw7CiAKQEAgLTc4OSw3ICs3OTEsNiBAQAogCWtmcmVlKGVkZXYtPmNvbXBvbmVudFswXS5zY3JhdGNoKTsKIAogCXB1dF9kZXZpY2UoJmVkZXYtPmVkZXYpOwotCWVuY2xvc3VyZV91bnJlZ2lzdGVyKGVkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBzZXNfaW50Zl9yZW1vdmUoc3RydWN0IGRldmljZSAqY2RldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS92aXJ0aW9fc2NzaS5jIGIvZHJpdmVycy9zY3NpL3ZpcnRpb19zY3NpLmMKaW5kZXggN2RiYmIyOS4uZGVlZmFiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3ZpcnRpb19zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3ZpcnRpb19zY3NpLmMKQEAgLTEwNyw4ICsxMDcsOCBAQAogCS8qIElmIHRoZSBhZmZpbml0eSBoaW50IGlzIHNldCBmb3IgdmlydHF1ZXVlcyAqLwogCWJvb2wgYWZmaW5pdHlfaGludF9zZXQ7CiAKLQkvKiBDUFUgaG90cGx1ZyBub3RpZmllciAqLwotCXN0cnVjdCBub3RpZmllcl9ibG9jayBuYjsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlOworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGVfZGVhZDsKIAogCS8qIFByb3RlY3RlZCBieSBldmVudF92cSBsb2NrICovCiAJYm9vbCBzdG9wX2V2ZW50czsKQEAgLTExOCw2ICsxMTgsNyBAQAogCXN0cnVjdCB2aXJ0aW9fc2NzaV92cSByZXFfdnFzW107CiB9OwogCitzdGF0aWMgZW51bSBjcHVocF9zdGF0ZSB2aXJ0aW9zY3NpX29ubGluZTsKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqdmlydHNjc2lfY21kX2NhY2hlOwogc3RhdGljIG1lbXBvb2xfdCAqdmlydHNjc2lfY21kX3Bvb2w7CiAKQEAgLTg1MiwyMSArODUzLDMzIEBACiAJcHV0X29ubGluZV9jcHVzKCk7CiB9CiAKLXN0YXRpYyBpbnQgdmlydHNjc2lfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAotCQkJCSB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgdmlydHNjc2lfY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKIHsKLQlzdHJ1Y3QgdmlydGlvX3Njc2kgKnZzY3NpID0gY29udGFpbmVyX29mKG5mYiwgc3RydWN0IHZpcnRpb19zY3NpLCBuYik7Ci0Jc3dpdGNoKGFjdGlvbikgewotCWNhc2UgQ1BVX09OTElORToKLQljYXNlIENQVV9PTkxJTkVfRlJPWkVOOgotCWNhc2UgQ1BVX0RFQUQ6Ci0JY2FzZSBDUFVfREVBRF9GUk9aRU46Ci0JCV9fdmlydHNjc2lfc2V0X2FmZmluaXR5KHZzY3NpLCB0cnVlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBOT1RJRllfT0s7CisJc3RydWN0IHZpcnRpb19zY3NpICp2c2NzaSA9IGhsaXN0X2VudHJ5X3NhZmUobm9kZSwgc3RydWN0IHZpcnRpb19zY3NpLAorCQkJCQkJICAgICBub2RlKTsKKwlfX3ZpcnRzY3NpX3NldF9hZmZpbml0eSh2c2NzaSwgdHJ1ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlydHNjc2lfY3B1X25vdGlmX2FkZChzdHJ1Y3QgdmlydGlvX3Njc2kgKnZpKQoreworCWludCByZXQ7CisKKwlyZXQgPSBjcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2UodmlydGlvc2NzaV9vbmxpbmUsICZ2aS0+bm9kZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZShDUFVIUF9WSVJUX1NDU0lfREVBRCwgJnZpLT5ub2RlX2RlYWQpOworCWlmIChyZXQpCisJCWNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZSh2aXJ0aW9zY3NpX29ubGluZSwgJnZpLT5ub2RlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB2aXJ0c2NzaV9jcHVfbm90aWZfcmVtb3ZlKHN0cnVjdCB2aXJ0aW9fc2NzaSAqdmkpCit7CisJY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlX25vY2FsbHModmlydGlvc2NzaV9vbmxpbmUsICZ2aS0+bm9kZSk7CisJY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlX25vY2FsbHMoQ1BVSFBfVklSVF9TQ1NJX0RFQUQsCisJCQkJCSAgICAmdmktPm5vZGVfZGVhZCk7CiB9CiAKIHN0YXRpYyB2b2lkIHZpcnRzY3NpX2luaXRfdnEoc3RydWN0IHZpcnRpb19zY3NpX3ZxICp2aXJ0c2NzaV92cSwKQEAgLTkyOSw4ICs5NDIsNiBAQAogCQl2aXJ0c2NzaV9pbml0X3ZxKCZ2c2NzaS0+cmVxX3Zxc1tpIC0gVklSVElPX1NDU0lfVlFfQkFTRV0sCiAJCQkJIHZxc1tpXSk7CiAKLQl2aXJ0c2NzaV9zZXRfYWZmaW5pdHkodnNjc2ksIHRydWUpOwotCiAJdmlydHNjc2lfY29uZmlnX3NldCh2ZGV2LCBjZGJfc2l6ZSwgVklSVElPX1NDU0lfQ0RCX1NJWkUpOwogCXZpcnRzY3NpX2NvbmZpZ19zZXQodmRldiwgc2Vuc2Vfc2l6ZSwgVklSVElPX1NDU0lfU0VOU0VfU0laRSk7CiAKQEAgLTk4NywxMiArOTk4LDkgQEAKIAlpZiAoZXJyKQogCQlnb3RvIHZpcnRzY3NpX2luaXRfZmFpbGVkOwogCi0JdnNjc2ktPm5iLm5vdGlmaWVyX2NhbGwgPSAmdmlydHNjc2lfY3B1X2NhbGxiYWNrOwotCWVyciA9IHJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmdnNjc2ktPm5iKTsKLQlpZiAoZXJyKSB7Ci0JCXByX2VycigicmVnaXN0ZXJpbmcgY3B1IG5vdGlmaWVyIGZhaWxlZFxuIik7CisJZXJyID0gdmlydHNjc2lfY3B1X25vdGlmX2FkZCh2c2NzaSk7CisJaWYgKGVycikKIAkJZ290byBzY3NpX2FkZF9ob3N0X2ZhaWxlZDsKLQl9CiAKIAljbWRfcGVyX2x1biA9IHZpcnRzY3NpX2NvbmZpZ19nZXQodmRldiwgY21kX3Blcl9sdW4pID86IDE7CiAJc2hvc3QtPmNtZF9wZXJfbHVuID0gbWluX3QodTMyLCBjbWRfcGVyX2x1biwgc2hvc3QtPmNhbl9xdWV1ZSk7CkBAIC0xMDQ5LDcgKzEwNTcsNyBAQAogCiAJc2NzaV9yZW1vdmVfaG9zdChzaG9zdCk7CiAKLQl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmdnNjc2ktPm5iKTsKKwl2aXJ0c2NzaV9jcHVfbm90aWZfcmVtb3ZlKHZzY3NpKTsKIAogCXZpcnRzY3NpX3JlbW92ZV92cXModmRldik7CiAJc2NzaV9ob3N0X3B1dChzaG9zdCk7CkBAIC0xMDYxLDcgKzEwNjksNyBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNoID0gdmlydGlvX3Njc2lfaG9zdCh2ZGV2KTsKIAlzdHJ1Y3QgdmlydGlvX3Njc2kgKnZzY3NpID0gc2hvc3RfcHJpdihzaCk7CiAKLQl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmdnNjc2ktPm5iKTsKKwl2aXJ0c2NzaV9jcHVfbm90aWZfcmVtb3ZlKHZzY3NpKTsKIAl2aXJ0c2NzaV9yZW1vdmVfdnFzKHZkZXYpOwogCXJldHVybiAwOwogfQpAQCAtMTA3NiwxMiArMTA4NCwxMSBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQllcnIgPSByZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJnZzY3NpLT5uYik7CisJZXJyID0gdmlydHNjc2lfY3B1X25vdGlmX2FkZCh2c2NzaSk7CiAJaWYgKGVycikgewogCQl2ZGV2LT5jb25maWctPmRlbF92cXModmRldik7CiAJCXJldHVybiBlcnI7CiAJfQotCiAJdmlydGlvX2RldmljZV9yZWFkeSh2ZGV2KTsKIAogCWlmICh2aXJ0aW9faGFzX2ZlYXR1cmUodmRldiwgVklSVElPX1NDU0lfRl9IT1RQTFVHKSkKQEAgLTExMzYsNiArMTE0MywxNiBAQAogCQlwcl9lcnIoIm1lbXBvb2xfY3JlYXRlKCkgZm9yIHZpcnRzY3NpX2NtZF9wb29sIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQorCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX211bHRpKENQVUhQX0FQX09OTElORV9EWU4sCisJCQkJICAgICAgInNjc2kvdmlydGlvOm9ubGluZSIsCisJCQkJICAgICAgdmlydHNjc2lfY3B1X29ubGluZSwgTlVMTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisJdmlydGlvc2NzaV9vbmxpbmUgPSByZXQ7CisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfVklSVF9TQ1NJX0RFQUQsICJzY3NpL3ZpcnRpbzpkZWFkIiwKKwkJCQkgICAgICBOVUxMLCB2aXJ0c2NzaV9jcHVfb25saW5lKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOwogCXJldCA9IHJlZ2lzdGVyX3ZpcnRpb19kcml2ZXIoJnZpcnRpb19zY3NpX2RyaXZlcik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CkBAIC0xMTUxLDEyICsxMTY4LDE3IEBACiAJCWttZW1fY2FjaGVfZGVzdHJveSh2aXJ0c2NzaV9jbWRfY2FjaGUpOwogCQl2aXJ0c2NzaV9jbWRfY2FjaGUgPSBOVUxMOwogCX0KKwlpZiAodmlydGlvc2NzaV9vbmxpbmUpCisJCWNwdWhwX3JlbW92ZV9tdWx0aV9zdGF0ZSh2aXJ0aW9zY3NpX29ubGluZSk7CisJY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlKENQVUhQX1ZJUlRfU0NTSV9ERUFEKTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewogCXVucmVnaXN0ZXJfdmlydGlvX2RyaXZlcigmdmlydGlvX3Njc2lfZHJpdmVyKTsKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUodmlydGlvc2NzaV9vbmxpbmUpOworCWNwdWhwX3JlbW92ZV9tdWx0aV9zdGF0ZShDUFVIUF9WSVJUX1NDU0lfREVBRCk7CiAJbWVtcG9vbF9kZXN0cm95KHZpcnRzY3NpX2NtZF9wb29sKTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3kodmlydHNjc2lfY21kX2NhY2hlKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS93ZDcxOXguYyBiL2RyaXZlcnMvc2NzaS93ZDcxOXguYwppbmRleCBlM2RhMWEyLi4yYTlkYTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvd2Q3MTl4LmMKKysrIGIvZHJpdmVycy9zY3NpL3dkNzE5eC5jCkBAIC05NjIsNyArOTYyLDcgQEAKIAlzY3NpX2hvc3RfcHV0KHNoKTsKIH0KIAotc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKHdkNzE5eF9wY2lfdGFibGUpID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHdkNzE5eF9wY2lfdGFibGVbXSA9IHsKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9XRCwgMHgzMjk2KSB9LAogCXt9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2Mvc2Ftc3VuZy9wbV9kb21haW5zLmMgYi9kcml2ZXJzL3NvYy9zYW1zdW5nL3BtX2RvbWFpbnMuYwppbmRleCA0ODIyMzQ2Li43MTEyMDA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NvYy9zYW1zdW5nL3BtX2RvbWFpbnMuYworKysgYi9kcml2ZXJzL3NvYy9zYW1zdW5nL3BtX2RvbWFpbnMuYwpAQCAtMjE1LDI5ICsyMTUsMjIgQEAKIAogCS8qIEFzc2lnbiB0aGUgY2hpbGQgcG93ZXIgZG9tYWlucyB0byB0aGVpciBwYXJlbnRzICovCiAJZm9yX2VhY2hfbWF0Y2hpbmdfbm9kZShucCwgZXh5bm9zX3BtX2RvbWFpbl9vZl9tYXRjaCkgewotCQlzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmNoaWxkX2RvbWFpbiwgKnBhcmVudF9kb21haW47Ci0JCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgYXJnczsKKwkJc3RydWN0IG9mX3BoYW5kbGVfYXJncyBjaGlsZCwgcGFyZW50OwogCi0JCWFyZ3MubnAgPSBucDsKLQkJYXJncy5hcmdzX2NvdW50ID0gMDsKLQkJY2hpbGRfZG9tYWluID0gb2ZfZ2VucGRfZ2V0X2Zyb21fcHJvdmlkZXIoJmFyZ3MpOwotCQlpZiAoSVNfRVJSKGNoaWxkX2RvbWFpbikpCi0JCQljb250aW51ZTsKKwkJY2hpbGQubnAgPSBucDsKKwkJY2hpbGQuYXJnc19jb3VudCA9IDA7CiAKIAkJaWYgKG9mX3BhcnNlX3BoYW5kbGVfd2l0aF9hcmdzKG5wLCAicG93ZXItZG9tYWlucyIsCi0JCQkJCSAiI3Bvd2VyLWRvbWFpbi1jZWxscyIsIDAsICZhcmdzKSAhPSAwKQorCQkJCQkgICAgICAgIiNwb3dlci1kb21haW4tY2VsbHMiLCAwLAorCQkJCQkgICAgICAgJnBhcmVudCkgIT0gMCkKIAkJCWNvbnRpbnVlOwogCi0JCXBhcmVudF9kb21haW4gPSBvZl9nZW5wZF9nZXRfZnJvbV9wcm92aWRlcigmYXJncyk7Ci0JCWlmIChJU19FUlIocGFyZW50X2RvbWFpbikpCi0JCQljb250aW51ZTsKLQotCQlpZiAocG1fZ2VucGRfYWRkX3N1YmRvbWFpbihwYXJlbnRfZG9tYWluLCBjaGlsZF9kb21haW4pKQorCQlpZiAob2ZfZ2VucGRfYWRkX3N1YmRvbWFpbigmcGFyZW50LCAmY2hpbGQpKQogCQkJcHJfd2FybigiJXMgZmFpbGVkIHRvIGFkZCBzdWJkb21haW46ICVzXG4iLAotCQkJCXBhcmVudF9kb21haW4tPm5hbWUsIGNoaWxkX2RvbWFpbi0+bmFtZSk7CisJCQkJcGFyZW50Lm5wLT5uYW1lLCBjaGlsZC5ucC0+bmFtZSk7CiAJCWVsc2UKIAkJCXByX2luZm8oIiVzIGhhcyBhcyBjaGlsZCBzdWJkb21haW46ICVzLlxuIiwKLQkJCQlwYXJlbnRfZG9tYWluLT5uYW1lLCBjaGlsZF9kb21haW4tPm5hbWUpOworCQkJCXBhcmVudC5ucC0+bmFtZSwgY2hpbGQubnAtPm5hbWUpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvS2NvbmZpZyBiL2RyaXZlcnMvc3BpL0tjb25maWcKaW5kZXggZDZmYjhkNC4uYjc5OTU0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvS2NvbmZpZworKysgYi9kcml2ZXJzL3NwaS9LY29uZmlnCkBAIC0xNTMsNiArMTUzLDE2IEBACiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEhpZ2ggU3BlZWQgU1BJIGNvbnRyb2xsZXIgcHJlc2VudCBvbgogCSAgbmV3ZXIgQnJvYWRjb20gQkNNNjNYWCBTb0NzLgogCitjb25maWcgU1BJX0JDTV9RU1BJCisJdHJpc3RhdGUgIkJyb2FkY29tIEJTUEkgYW5kIE1TUEkgY29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9CUkNNU1RCIHx8IEFSQ0hfQkNNIHx8IEFSQ0hfQkNNX0lQUk9DIHx8IENPTVBJTEVfVEVTVAorCWRlZmF1bHQgQVJDSF9CQ01fSVBST0MKKwloZWxwCisJICBFbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBCcm9hZGNvbSBTUEkgZmxhc2ggYW5kIE1TUEkgY29udHJvbGxlci4KKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBmb3IgYW55IG9uZSBvZiBCUkNNU1RCLCBpUHJvYyBOU1AgYW5kIE5TMiBTb0NzCisJICBiYXNlZCBwbGF0Zm9ybXMuIFRoaXMgZHJpdmVyIHdvcmtzIGZvciBib3RoIFNQSSBtYXN0ZXIgZm9yIHNwaS1ub3IKKwkgIGZsYXNoIGRldmljZSBhcyB3ZWxsIGFzIE1TUEkgZGV2aWNlLgorCiBjb25maWcgU1BJX0JJVEJBTkcKIAl0cmlzdGF0ZSAiVXRpbGl0aWVzIGZvciBCaXRiYW5naW5nIFNQSSBtYXN0ZXJzIgogCWhlbHAKQEAgLTI4NSw2ICsyOTUsMTMgQEAKIAkgIFRoaXMgZW5hYmxlcyB1c2luZyB0aGUgRnJlZXNjYWxlIGkuTVggU1BJIGNvbnRyb2xsZXJzIGluIG1hc3RlcgogCSAgbW9kZS4KIAorY29uZmlnIFNQSV9KQ09SRQorCXRyaXN0YXRlICJKLUNvcmUgU1BJIE1hc3RlciIKKwlkZXBlbmRzIG9uIE9GICYmIChTVVBFUkggfHwgQ09NUElMRV9URVNUKQorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgU1BJIG1hc3RlciBjb250cm9sbGVyIGluIHRoZSBKLUNvcmUKKwkgIHN5bnRoZXNpemFibGUsIG9wZW4gc291cmNlIFNvQy4KKwogY29uZmlnIFNQSV9MTTcwX0xMUAogCXRyaXN0YXRlICJQYXJhbGxlbCBwb3J0IGFkYXB0ZXIgZm9yIExNNzAgZXZhbCBib2FyZCAoREVWRUxPUE1FTlQpIgogCWRlcGVuZHMgb24gUEFSUE9SVApAQCAtNTQ5LDcgKzU2Niw3IEBACiBjb25maWcgU1BJX1NIX01TSU9GCiAJdHJpc3RhdGUgIlN1cGVySCBNU0lPRiBTUEkgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIEhBVkVfQ0xLICYmIEhBU19ETUEKLQlkZXBlbmRzIG9uIFNVUEVSSCB8fCBBUkNIX1JFTkVTQVMgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBBUkNIX1NITU9CSUxFIHx8IEFSQ0hfUkVORVNBUyB8fCBDT01QSUxFX1RFU1QKIAloZWxwCiAJICBTUEkgZHJpdmVyIGZvciBTdXBlckggYW5kIFNIIE1vYmlsZSBNU0lPRiBibG9ja3MuCiAKQEAgLTYzMSw2ICs2NDgsMTMgQEAKIAloZWxwCiAJICBTUEkgZHJpdmVyIGZvciBOdmlkaWEgVGVncmEyMC9UZWdyYTMwIFNMSU5LIENvbnRyb2xsZXIgaW50ZXJmYWNlLgogCitjb25maWcgU1BJX1RIVU5ERVJYCisJdHJpc3RhdGUgIkNhdml1bSBUaHVuZGVyWCBTUEkgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIFBDSSAmJiA2NEJJVCAmJiAoQVJNNjQgfHwgQ09NUElMRV9URVNUKQorCWhlbHAKKwkgIFNQSSBob3N0IGRyaXZlciBmb3IgdGhlIGhhcmR3YXJlIGZvdW5kIG9uIENhdml1bSBUaHVuZGVyWAorCSAgU09Dcy4KKwogY29uZmlnIFNQSV9UT1BDTElGRl9QQ0gKIAl0cmlzdGF0ZSAiSW50ZWwgRUcyMFQgUENIL0xBUElTIFNlbWljb24gSU9IKE1MNzIxMy9NTDcyMjMvTUw3ODMxKSBTUEkiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgKFg4Nl8zMiB8fCBNSVBTIHx8IENPTVBJTEVfVEVTVCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL01ha2VmaWxlIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKaW5kZXggMTg1MzY3ZS4uYWE5MzlkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKQEAgLTIxLDYgKzIxLDcgQEAKIG9iai0kKENPTkZJR19TUElfQkNNNTNYWCkJCSs9IHNwaS1iY201M3h4Lm8KIG9iai0kKENPTkZJR19TUElfQkNNNjNYWCkJCSs9IHNwaS1iY202M3h4Lm8KIG9iai0kKENPTkZJR19TUElfQkNNNjNYWF9IU1NQSSkJCSs9IHNwaS1iY202M3h4LWhzc3BpLm8KK29iai0kKENPTkZJR19TUElfQkNNX1FTUEkpCQkrPSBzcGktaXByb2MtcXNwaS5vIHNwaS1icmNtc3RiLXFzcGkubyBzcGktYmNtLXFzcGkubwogb2JqLSQoQ09ORklHX1NQSV9CRklONVhYKQkJKz0gc3BpLWJmaW41eHgubwogb2JqLSQoQ09ORklHX1NQSV9BRElfVjMpICAgICAgICAgICAgICAgICs9IHNwaS1hZGktdjMubwogb2JqLSQoQ09ORklHX1NQSV9CRklOX1NQT1JUKQkJKz0gc3BpLWJmaW4tc3BvcnQubwpAQCAtNDYsNiArNDcsNyBAQAogb2JqLSQoQ09ORklHX1NQSV9HUElPKQkJCSs9IHNwaS1ncGlvLm8KIG9iai0kKENPTkZJR19TUElfSU1HX1NQRkkpCQkrPSBzcGktaW1nLXNwZmkubwogb2JqLSQoQ09ORklHX1NQSV9JTVgpCQkJKz0gc3BpLWlteC5vCitvYmotJChDT05GSUdfU1BJX0pDT1JFKQkJCSs9IHNwaS1qY29yZS5vCiBvYmotJChDT05GSUdfU1BJX0xNNzBfTExQKQkJKz0gc3BpLWxtNzBsbHAubwogb2JqLSQoQ09ORklHX1NQSV9MUDg4NDFfUlRDKQkJKz0gc3BpLWxwODg0MS1ydGMubwogb2JqLSQoQ09ORklHX1NQSV9NRVNPTl9TUElGQykJCSs9IHNwaS1tZXNvbi1zcGlmYy5vCkBAIC05MSw2ICs5Myw4IEBACiBvYmotJChDT05GSUdfU1BJX1RFR1JBMjBfU0ZMQVNIKQkrPSBzcGktdGVncmEyMC1zZmxhc2gubwogb2JqLSQoQ09ORklHX1NQSV9URUdSQTIwX1NMSU5LKQkJKz0gc3BpLXRlZ3JhMjAtc2xpbmsubwogb2JqLSQoQ09ORklHX1NQSV9UTEU2MlgwKQkJKz0gc3BpLXRsZTYyeDAubworc3BpLXRodW5kZXJ4LW9ianMJCQk6PSBzcGktY2F2aXVtLm8gc3BpLWNhdml1bS10aHVuZGVyeC5vCitvYmotJChDT05GSUdfU1BJX1RIVU5ERVJYKQkJKz0gc3BpLXRodW5kZXJ4Lm8KIG9iai0kKENPTkZJR19TUElfVE9QQ0xJRkZfUENIKQkJKz0gc3BpLXRvcGNsaWZmLXBjaC5vCiBvYmotJChDT05GSUdfU1BJX1RYWDkpCQkJKz0gc3BpLXR4eDkubwogb2JqLSQoQ09ORklHX1NQSV9YQ09NTSkJCSs9IHNwaS14Y29tbS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYmNtLXFzcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS1iY20tcXNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZjlkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktYmNtLXFzcGkuYwpAQCAtMCwwICsxLDEzOTcgQEAKKy8qCisgKiBEcml2ZXIgZm9yIEJyb2FkY29tIEJSQ01TVEIsIE5TUCwgIE5TMiwgQ3lnbnVzIFNQSSBDb250cm9sbGVycworICoKKyAqIENvcHlyaWdodCAyMDE2IEJyb2FkY29tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICh0aGUgIkdQTCIpLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAoR1BMdjIpIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiAoR1BMdjIpIGFsb25nIHdpdGggdGhpcyBzb3VyY2UgY29kZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvc3BpLW5vci5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSAic3BpLWJjbS1xc3BpLmgiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgImJjbV9xc3BpIgorCisKKy8qIEJTUEkgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBCU1BJX1JFVklTSU9OX0lECQkJMHgwMDAKKyNkZWZpbmUgQlNQSV9TQ1JBVENICQkJCTB4MDA0CisjZGVmaW5lIEJTUElfTUFTVF9OX0JPT1RfQ1RSTAkJCTB4MDA4CisjZGVmaW5lIEJTUElfQlVTWV9TVEFUVVMJCQkweDAwYworI2RlZmluZSBCU1BJX0lOVFJfU1RBVFVTCQkJMHgwMTAKKyNkZWZpbmUgQlNQSV9CMF9TVEFUVVMJCQkJMHgwMTQKKyNkZWZpbmUgQlNQSV9CMF9DVFJMCQkJCTB4MDE4CisjZGVmaW5lIEJTUElfQjFfU1RBVFVTCQkJCTB4MDFjCisjZGVmaW5lIEJTUElfQjFfQ1RSTAkJCQkweDAyMAorI2RlZmluZSBCU1BJX1NUUkFQX09WRVJSSURFX0NUUkwJCTB4MDI0CisjZGVmaW5lIEJTUElfRkxFWF9NT0RFX0VOQUJMRQkJCTB4MDI4CisjZGVmaW5lIEJTUElfQklUU19QRVJfQ1lDTEUJCQkweDAyYworI2RlZmluZSBCU1BJX0JJVFNfUEVSX1BIQVNFCQkJMHgwMzAKKyNkZWZpbmUgQlNQSV9DTURfQU5EX01PREVfQllURQkJCTB4MDM0CisjZGVmaW5lIEJTUElfQlNQSV9GTEFTSF9VUFBFUl9BRERSX0JZVEUJMHgwMzgKKyNkZWZpbmUgQlNQSV9CU1BJX1hPUl9WQUxVRQkJCTB4MDNjCisjZGVmaW5lIEJTUElfQlNQSV9YT1JfRU5BQkxFCQkJMHgwNDAKKyNkZWZpbmUgQlNQSV9CU1BJX1BJT19NT0RFX0VOQUJMRQkJMHgwNDQKKyNkZWZpbmUgQlNQSV9CU1BJX1BJT19JT0RJUgkJCTB4MDQ4CisjZGVmaW5lIEJTUElfQlNQSV9QSU9fREFUQQkJCTB4MDRjCisKKy8qIFJBRiByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIEJTUElfUkFGX1NUQVJUX0FERFIJCQkweDEwMAorI2RlZmluZSBCU1BJX1JBRl9OVU1fV09SRFMJCQkweDEwNAorI2RlZmluZSBCU1BJX1JBRl9DVFJMCQkJCTB4MTA4CisjZGVmaW5lIEJTUElfUkFGX0ZVTExORVNTCQkJMHgxMGMKKyNkZWZpbmUgQlNQSV9SQUZfV0FURVJNQVJLCQkJMHgxMTAKKyNkZWZpbmUgQlNQSV9SQUZfU1RBVFVTCQkJMHgxMTQKKyNkZWZpbmUgQlNQSV9SQUZfUkVBRF9EQVRBCQkJMHgxMTgKKyNkZWZpbmUgQlNQSV9SQUZfV09SRF9DTlQJCQkweDExYworI2RlZmluZSBCU1BJX1JBRl9DVVJSX0FERFIJCQkweDEyMAorCisvKiBPdmVycmlkZSBtb2RlIG1hc2tzICovCisjZGVmaW5lIEJTUElfU1RSQVBfT1ZFUlJJREVfQ1RSTF9PVkVSUklERQlCSVQoMCkKKyNkZWZpbmUgQlNQSV9TVFJBUF9PVkVSUklERV9DVFJMX0RBVEFfRFVBTAlCSVQoMSkKKyNkZWZpbmUgQlNQSV9TVFJBUF9PVkVSUklERV9DVFJMX0FERFJfNEJZVEUJQklUKDIpCisjZGVmaW5lIEJTUElfU1RSQVBfT1ZFUlJJREVfQ1RSTF9EQVRBX1FVQUQJQklUKDMpCisjZGVmaW5lIEJTUElfU1RSQVBfT1ZFUlJJREVfQ1RSTF9FTkRBSU5fTU9ERQlCSVQoNCkKKworI2RlZmluZSBCU1BJX0FERFJMRU5fM0JZVEVTCQkJMworI2RlZmluZSBCU1BJX0FERFJMRU5fNEJZVEVTCQkJNAorCisjZGVmaW5lIEJTUElfUkFGX1NUQVRVU19GSUZPX0VNUFRZX01BU0sJQklUKDEpCisKKyNkZWZpbmUgQlNQSV9SQUZfQ1RSTF9TVEFSVF9NQVNLCQlCSVQoMCkKKyNkZWZpbmUgQlNQSV9SQUZfQ1RSTF9DTEVBUl9NQVNLCQlCSVQoMSkKKworI2RlZmluZSBCU1BJX0JQUF9NT0RFX1NFTEVDVF9NQVNLCQlCSVQoOCkKKyNkZWZpbmUgQlNQSV9CUFBfQUREUl9TRUxFQ1RfTUFTSwkJQklUKDE2KQorCisjZGVmaW5lIEJTUElfUkVBRF9MRU5HVEgJCQkyNTYKKworLyogTVNQSSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE1TUElfU1BDUjBfTFNCCQkJCTB4MDAwCisjZGVmaW5lIE1TUElfU1BDUjBfTVNCCQkJCTB4MDA0CisjZGVmaW5lIE1TUElfU1BDUjFfTFNCCQkJCTB4MDA4CisjZGVmaW5lIE1TUElfU1BDUjFfTVNCCQkJCTB4MDBjCisjZGVmaW5lIE1TUElfTkVXUVAJCQkJMHgwMTAKKyNkZWZpbmUgTVNQSV9FTkRRUAkJCQkweDAxNAorI2RlZmluZSBNU1BJX1NQQ1IyCQkJCTB4MDE4CisjZGVmaW5lIE1TUElfTVNQSV9TVEFUVVMJCQkweDAyMAorI2RlZmluZSBNU1BJX0NQVFFQCQkJCTB4MDI0CisjZGVmaW5lIE1TUElfU1BDUjMJCQkJMHgwMjgKKyNkZWZpbmUgTVNQSV9UWFJBTQkJCQkweDA0MAorI2RlZmluZSBNU1BJX1JYUkFNCQkJCTB4MGMwCisjZGVmaW5lIE1TUElfQ0RSQU0JCQkJMHgxNDAKKyNkZWZpbmUgTVNQSV9XUklURV9MT0NLCQkJMHgxODAKKworI2RlZmluZSBNU1BJX01BU1RFUl9CSVQJCQlCSVQoNykKKworI2RlZmluZSBNU1BJX05VTV9DRFJBTQkJCQkxNgorI2RlZmluZSBNU1BJX0NEUkFNX0NPTlRfQklUCQkJQklUKDcpCisjZGVmaW5lIE1TUElfQ0RSQU1fQklUU0VfQklUCQkJQklUKDYpCisjZGVmaW5lIE1TUElfQ0RSQU1fUENTCQkJCTB4ZgorCisjZGVmaW5lIE1TUElfU1BDUjJfU1BFCQkJCUJJVCg2KQorI2RlZmluZSBNU1BJX1NQQ1IyX0NPTlRfQUZURVJfQ01ECQlCSVQoNykKKworI2RlZmluZSBNU1BJX01TUElfU1RBVFVTX1NQSUYJCQlCSVQoMCkKKworI2RlZmluZSBJTlRSX0JBU0VfQklUX1NISUZUCQkJMHgwMgorI2RlZmluZSBJTlRSX0NPVU5UCQkJCTB4MDcKKworI2RlZmluZSBOVU1fQ0hJUFNFTEVDVAkJCQk0CisjZGVmaW5lIFFTUElfU1BCUl9NSU4JCQkJOFUKKyNkZWZpbmUgUVNQSV9TUEJSX01BWAkJCQkyNTVVCisKKyNkZWZpbmUgT1BDT0RFX0RJT1IJCQkJMHhCQgorI2RlZmluZSBPUENPREVfUUlPUgkJCQkweEVCCisjZGVmaW5lIE9QQ09ERV9ESU9SXzRCCQkJCTB4QkMKKyNkZWZpbmUgT1BDT0RFX1FJT1JfNEIJCQkJMHhFQworCisjZGVmaW5lIE1BWF9DTURfU0laRQkJCQk2CisKKyNkZWZpbmUgQUREUl80TUJfTUFTSwkJCQlHRU5NQVNLKDIyLCAwKQorCisvKiBzdG9wIGF0IGVuZCBvZiB0cmFuc2Zlciwgbm8gb3RoZXIgcmVhc29uICovCisjZGVmaW5lIFRSQU5TX1NUQVRVU19CUkVBS19OT05FCQkwCisvKiBzdG9wIGF0IGVuZCBvZiBzcGlfbWVzc2FnZSAqLworI2RlZmluZSBUUkFOU19TVEFUVVNfQlJFQUtfRU9NCQkJMQorLyogc3RvcCBhdCBlbmQgb2Ygc3BpX3RyYW5zZmVyIGlmIGRlbGF5ICovCisjZGVmaW5lIFRSQU5TX1NUQVRVU19CUkVBS19ERUxBWQkJMgorLyogc3RvcCBhdCBlbmQgb2Ygc3BpX3RyYW5zZmVyIGlmIGNzX2NoYW5nZSAqLworI2RlZmluZSBUUkFOU19TVEFUVVNfQlJFQUtfQ1NfQ0hBTkdFCQk0CisvKiBzdG9wIGlmIHdlIHJ1biBvdXQgb2YgYnl0ZXMgKi8KKyNkZWZpbmUgVFJBTlNfU1RBVFVTX0JSRUFLX05PX0JZVEVTCQk4CisKKy8qIGV2ZW50cyB0aGF0IG1ha2UgdXMgc3RvcCBmaWxsaW5nIFRYIHNsb3RzICovCisjZGVmaW5lIFRSQU5TX1NUQVRVU19CUkVBS19UWCAoVFJBTlNfU1RBVFVTX0JSRUFLX0VPTSB8CQlcCisJCQkgICAgICAgVFJBTlNfU1RBVFVTX0JSRUFLX0RFTEFZIHwJCVwKKwkJCSAgICAgICBUUkFOU19TVEFUVVNfQlJFQUtfQ1NfQ0hBTkdFKQorCisvKiBldmVudHMgdGhhdCBtYWtlIHVzIGRlYXNzZXJ0IENTICovCisjZGVmaW5lIFRSQU5TX1NUQVRVU19CUkVBS19ERVNFTEVDVCAoVFJBTlNfU1RBVFVTX0JSRUFLX0VPTSB8CQlcCisJCQkJICAgICBUUkFOU19TVEFUVVNfQlJFQUtfQ1NfQ0hBTkdFKQorCitzdHJ1Y3QgYmNtX3FzcGlfcGFybXMgeworCXUzMiBzcGVlZF9oejsKKwl1OCBtb2RlOworCXU4IGJpdHNfcGVyX3dvcmQ7Cit9OworCitzdHJ1Y3QgYmNtX3hmZXJfbW9kZSB7CisJYm9vbCBmbGV4X21vZGU7CisJdW5zaWduZWQgaW50IHdpZHRoOworCXVuc2lnbmVkIGludCBhZGRybGVuOworCXVuc2lnbmVkIGludCBocDsKK307CisKK2VudW0gYmFzZV90eXBlIHsKKwlNU1BJLAorCUJTUEksCisJQ0hJUF9TRUxFQ1QsCisJQkFTRU1BWCwKK307CisKK2VudW0gaXJxX3NvdXJjZSB7CisJU0lOR0xFX0wyLAorCU1VWEVEX0wxLAorfTsKKworc3RydWN0IGJjbV9xc3BpX2lycSB7CisJY29uc3QgY2hhciAqaXJxX25hbWU7CisJY29uc3QgaXJxX2hhbmRsZXJfdCBpcnFfaGFuZGxlcjsKKwlpbnQgaXJxX3NvdXJjZTsKKwl1MzIgbWFzazsKK307CisKK3N0cnVjdCBiY21fcXNwaV9kZXZfaWQgeworCWNvbnN0IHN0cnVjdCBiY21fcXNwaV9pcnEgKmlycXA7CisJdm9pZCAqZGV2OworfTsKKworc3RydWN0IHFzcGlfdHJhbnMgeworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnRyYW5zOworCWludCBieXRlOworfTsKKworc3RydWN0IGJjbV9xc3BpIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IGNsayAqY2xrOworCXUzMiBiYXNlX2NsazsKKwl1MzIgbWF4X3NwZWVkX2h6OworCXZvaWQgX19pb21lbSAqYmFzZVtCQVNFTUFYXTsKKworCS8qIFNvbWUgU29DcyBwcm92aWRlIGN1c3RvbSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyKHMpICovCisJc3RydWN0IGJjbV9xc3BpX3NvY19pbnRjCSpzb2NfaW50YzsKKworCXN0cnVjdCBiY21fcXNwaV9wYXJtcyBsYXN0X3Bhcm1zOworCXN0cnVjdCBxc3BpX3RyYW5zICB0cmFuc19wb3M7CisJaW50IGN1cnJfY3M7CisJaW50IGJzcGlfbWFqX3JldjsKKwlpbnQgYnNwaV9taW5fcmV2OworCWludCBic3BpX2VuYWJsZWQ7CisJc3RydWN0IHNwaV9mbGFzaF9yZWFkX21lc3NhZ2UgKmJzcGlfcmZfbXNnOworCXUzMiBic3BpX3JmX21zZ19pZHg7CisJdTMyIGJzcGlfcmZfbXNnX2xlbjsKKwl1MzIgYnNwaV9yZl9tc2dfc3RhdHVzOworCXN0cnVjdCBiY21feGZlcl9tb2RlIHhmZXJfbW9kZTsKKwl1MzIgczNfc3RyYXBfb3ZlcnJpZGVfY3RybDsKKwlib29sIGJzcGlfbW9kZTsKKwlib29sIGJpZ19lbmRpYW47CisJaW50IG51bV9pcnFzOworCXN0cnVjdCBiY21fcXNwaV9kZXZfaWQgKmRldl9pZHM7CisJc3RydWN0IGNvbXBsZXRpb24gbXNwaV9kb25lOworCXN0cnVjdCBjb21wbGV0aW9uIGJzcGlfZG9uZTsKK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBoYXNfYnNwaShzdHJ1Y3QgYmNtX3FzcGkgKnFzcGkpCit7CisJcmV0dXJuIHFzcGktPmJzcGlfbW9kZTsKK30KKworLyogUmVhZCBxc3BpIGNvbnRyb2xsZXIgcmVnaXN0ZXIqLworc3RhdGljIGlubGluZSB1MzIgYmNtX3FzcGlfcmVhZChzdHJ1Y3QgYmNtX3FzcGkgKnFzcGksIGVudW0gYmFzZV90eXBlIHR5cGUsCisJCQkJdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gYmNtX3FzcGlfcmVhZGwocXNwaS0+YmlnX2VuZGlhbiwgcXNwaS0+YmFzZVt0eXBlXSArIG9mZnNldCk7Cit9CisKKy8qIFdyaXRlIHFzcGkgY29udHJvbGxlciByZWdpc3RlciovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtX3FzcGlfd3JpdGUoc3RydWN0IGJjbV9xc3BpICpxc3BpLCBlbnVtIGJhc2VfdHlwZSB0eXBlLAorCQkJCSAgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGRhdGEpCit7CisJYmNtX3FzcGlfd3JpdGVsKHFzcGktPmJpZ19lbmRpYW4sIGRhdGEsIHFzcGktPmJhc2VbdHlwZV0gKyBvZmZzZXQpOworfQorCisvKiBCU1BJIGhlbHBlcnMgKi8KK3N0YXRpYyBpbnQgYmNtX3FzcGlfYnNwaV9idXN5X3BvbGwoc3RydWN0IGJjbV9xc3BpICpxc3BpKQoreworCWludCBpOworCisJLyogdGhpcyBzaG91bGQgbm9ybWFsbHkgZmluaXNoIHdpdGhpbiAxMHVzICovCisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQlpZiAoIShiY21fcXNwaV9yZWFkKHFzcGksIEJTUEksIEJTUElfQlVTWV9TVEFUVVMpICYgMSkpCisJCQlyZXR1cm4gMDsKKwkJdWRlbGF5KDEpOworCX0KKwlkZXZfd2FybigmcXNwaS0+cGRldi0+ZGV2LCAidGltZW91dCB3YWl0aW5nIGZvciAhYnVzeV9zdGF0dXNcbiIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYmNtX3FzcGlfYnNwaV92ZXJfdGhyZWUoc3RydWN0IGJjbV9xc3BpICpxc3BpKQoreworCWlmIChxc3BpLT5ic3BpX21hal9yZXYgPCA0KQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGJjbV9xc3BpX2JzcGlfZmx1c2hfcHJlZmV0Y2hfYnVmZmVycyhzdHJ1Y3QgYmNtX3FzcGkgKnFzcGkpCit7CisJYmNtX3FzcGlfYnNwaV9idXN5X3BvbGwocXNwaSk7CisJLyogRm9yY2UgcmlzaW5nIGVkZ2UgZm9yIHRoZSBiMC9iMSAnZmx1c2gnIGZpZWxkICovCisJYmNtX3FzcGlfd3JpdGUocXNwaSwgQlNQSSwgQlNQSV9CMF9DVFJMLCAxKTsKKwliY21fcXNwaV93cml0ZShxc3BpLCBCU1BJLCBCU1BJX0IxX0NUUkwsIDEpOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIEJTUEksIEJTUElfQjBfQ1RSTCwgMCk7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgQlNQSSwgQlNQSV9CMV9DVFJMLCAwKTsKK30KKworc3RhdGljIGludCBiY21fcXNwaV9ic3BpX2xyX2lzX2ZpZm9fZW1wdHkoc3RydWN0IGJjbV9xc3BpICpxc3BpKQoreworCXJldHVybiAoYmNtX3FzcGlfcmVhZChxc3BpLCBCU1BJLCBCU1BJX1JBRl9TVEFUVVMpICYKKwkJCQlCU1BJX1JBRl9TVEFUVVNfRklGT19FTVBUWV9NQVNLKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgYmNtX3FzcGlfYnNwaV9scl9yZWFkX2ZpZm8oc3RydWN0IGJjbV9xc3BpICpxc3BpKQoreworCXUzMiBkYXRhID0gYmNtX3FzcGlfcmVhZChxc3BpLCBCU1BJLCBCU1BJX1JBRl9SRUFEX0RBVEEpOworCisJLyogQlNQSSB2MyBMUiBpcyBMRSBvbmx5LCBjb252ZXJ0IGRhdGEgdG8gaG9zdCBlbmRpYW5uZXNzICovCisJaWYgKGJjbV9xc3BpX2JzcGlfdmVyX3RocmVlKHFzcGkpKQorCQlkYXRhID0gbGUzMl90b19jcHUoZGF0YSk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJjbV9xc3BpX2JzcGlfbHJfc3RhcnQoc3RydWN0IGJjbV9xc3BpICpxc3BpKQoreworCWJjbV9xc3BpX2JzcGlfYnVzeV9wb2xsKHFzcGkpOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIEJTUEksIEJTUElfUkFGX0NUUkwsCisJCSAgICAgICBCU1BJX1JBRl9DVFJMX1NUQVJUX01BU0spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtX3FzcGlfYnNwaV9scl9jbGVhcihzdHJ1Y3QgYmNtX3FzcGkgKnFzcGkpCit7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgQlNQSSwgQlNQSV9SQUZfQ1RSTCwKKwkJICAgICAgIEJTUElfUkFGX0NUUkxfQ0xFQVJfTUFTSyk7CisJYmNtX3FzcGlfYnNwaV9mbHVzaF9wcmVmZXRjaF9idWZmZXJzKHFzcGkpOworfQorCitzdGF0aWMgdm9pZCBiY21fcXNwaV9ic3BpX2xyX2RhdGFfcmVhZChzdHJ1Y3QgYmNtX3FzcGkgKnFzcGkpCit7CisJdTMyICpidWYgPSAodTMyICopcXNwaS0+YnNwaV9yZl9tc2ctPmJ1ZjsKKwl1MzIgZGF0YSA9IDA7CisKKwlkZXZfZGJnKCZxc3BpLT5wZGV2LT5kZXYsICJ4ZmVyICVwIHJ4ICVwIHJ4bGVuICVkXG4iLCBxc3BpLT5ic3BpX3JmX21zZywKKwkJcXNwaS0+YnNwaV9yZl9tc2ctPmJ1ZiwgcXNwaS0+YnNwaV9yZl9tc2dfbGVuKTsKKwl3aGlsZSAoIWJjbV9xc3BpX2JzcGlfbHJfaXNfZmlmb19lbXB0eShxc3BpKSkgeworCQlkYXRhID0gYmNtX3FzcGlfYnNwaV9scl9yZWFkX2ZpZm8ocXNwaSk7CisJCWlmIChsaWtlbHkocXNwaS0+YnNwaV9yZl9tc2dfbGVuID49IDQpICYmCisJCSAgICBJU19BTElHTkVEKCh1aW50cHRyX3QpYnVmLCA0KSkgeworCQkJYnVmW3FzcGktPmJzcGlfcmZfbXNnX2lkeCsrXSA9IGRhdGE7CisJCQlxc3BpLT5ic3BpX3JmX21zZ19sZW4gLT0gNDsKKwkJfSBlbHNlIHsKKwkJCS8qIFJlYWQgb3V0IHJlbWFpbmluZyBieXRlcywgbWFrZSBzdXJlKi8KKwkJCXU4ICpjYnVmID0gKHU4ICopJmJ1Zltxc3BpLT5ic3BpX3JmX21zZ19pZHhdOworCisJCQlkYXRhID0gY3B1X3RvX2xlMzIoZGF0YSk7CisJCQl3aGlsZSAocXNwaS0+YnNwaV9yZl9tc2dfbGVuKSB7CisJCQkJKmNidWYrKyA9ICh1OClkYXRhOworCQkJCWRhdGEgPj49IDg7CisJCQkJcXNwaS0+YnNwaV9yZl9tc2dfbGVuLS07CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJjbV9xc3BpX2JzcGlfc2V0X3hmZXJfcGFyYW1zKHN0cnVjdCBiY21fcXNwaSAqcXNwaSwgdTggY21kX2J5dGUsCisJCQkJCSAgaW50IGJwcCwgaW50IGJwYywgaW50IGZsZXhfbW9kZSkKK3sKKwliY21fcXNwaV93cml0ZShxc3BpLCBCU1BJLCBCU1BJX0ZMRVhfTU9ERV9FTkFCTEUsIDApOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIEJTUEksIEJTUElfQklUU19QRVJfQ1lDTEUsIGJwYyk7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgQlNQSSwgQlNQSV9CSVRTX1BFUl9QSEFTRSwgYnBwKTsKKwliY21fcXNwaV93cml0ZShxc3BpLCBCU1BJLCBCU1BJX0NNRF9BTkRfTU9ERV9CWVRFLCBjbWRfYnl0ZSk7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgQlNQSSwgQlNQSV9GTEVYX01PREVfRU5BQkxFLCBmbGV4X21vZGUpOworfQorCitzdGF0aWMgaW50IGJjbV9xc3BpX2JzcGlfc2V0X2ZsZXhfbW9kZShzdHJ1Y3QgYmNtX3FzcGkgKnFzcGksIGludCB3aWR0aCwKKwkJCQkgICAgICAgaW50IGFkZHJsZW4sIGludCBocCkKK3sKKwlpbnQgYnBjID0gMCwgYnBwID0gMDsKKwl1OCBjb21tYW5kID0gU1BJTk9SX09QX1JFQURfRkFTVDsKKwlpbnQgZmxleF9tb2RlID0gMSwgcnYgPSAwOworCWJvb2wgc3BhbnNfNGJ5dGUgPSBmYWxzZTsKKworCWRldl9kYmcoJnFzcGktPnBkZXYtPmRldiwgInNldCBmbGV4IG1vZGUgdyAleCBhZGRybGVuICV4IGhwICVkXG4iLAorCQl3aWR0aCwgYWRkcmxlbiwgaHApOworCisJaWYgKGFkZHJsZW4gPT0gQlNQSV9BRERSTEVOXzRCWVRFUykgeworCQlicHAgPSBCU1BJX0JQUF9BRERSX1NFTEVDVF9NQVNLOworCQlzcGFuc180Ynl0ZSA9IHRydWU7CisJfQorCisJYnBwIHw9IDg7CisKKwlzd2l0Y2ggKHdpZHRoKSB7CisJY2FzZSBTUElfTkJJVFNfU0lOR0xFOgorCQlpZiAoYWRkcmxlbiA9PSBCU1BJX0FERFJMRU5fM0JZVEVTKQorCQkJLyogZGVmYXVsdCBtb2RlLCBkb2VzIG5vdCBuZWVkIGZsZXhfY21kICovCisJCQlmbGV4X21vZGUgPSAwOworCQllbHNlCisJCQljb21tYW5kID0gU1BJTk9SX09QX1JFQUQ0X0ZBU1Q7CisJCWJyZWFrOworCWNhc2UgU1BJX05CSVRTX0RVQUw6CisJCWJwYyA9IDB4MDAwMDAwMDE7CisJCWlmIChocCkgeworCQkJYnBjIHw9IDB4MDAwMTAxMDA7IC8qIGFkZHJlc3MgYW5kIG1vZGUgYXJlIDItYml0ICovCisJCQlicHAgPSBCU1BJX0JQUF9NT0RFX1NFTEVDVF9NQVNLOworCQkJY29tbWFuZCA9IE9QQ09ERV9ESU9SOworCQkJaWYgKHNwYW5zXzRieXRlKQorCQkJCWNvbW1hbmQgPSBPUENPREVfRElPUl80QjsKKwkJfSBlbHNlIHsKKwkJCWNvbW1hbmQgPSBTUElOT1JfT1BfUkVBRF8xXzFfMjsKKwkJCWlmIChzcGFuc180Ynl0ZSkKKwkJCQljb21tYW5kID0gU1BJTk9SX09QX1JFQUQ0XzFfMV8yOworCQl9CisJCWJyZWFrOworCWNhc2UgU1BJX05CSVRTX1FVQUQ6CisJCWJwYyA9IDB4MDAwMDAwMDI7CisJCWlmIChocCkgeworCQkJYnBjIHw9IDB4MDAwMjAyMDA7IC8qIGFkZHJlc3MgYW5kIG1vZGUgYXJlIDQtYml0ICovCisJCQlicHAgPSA0OyAvKiBkdW1teSBjeWNsZXMgKi8KKwkJCWJwcCB8PSBCU1BJX0JQUF9BRERSX1NFTEVDVF9NQVNLOworCQkJY29tbWFuZCA9IE9QQ09ERV9RSU9SOworCQkJaWYgKHNwYW5zXzRieXRlKQorCQkJCWNvbW1hbmQgPSBPUENPREVfUUlPUl80QjsKKwkJfSBlbHNlIHsKKwkJCWNvbW1hbmQgPSBTUElOT1JfT1BfUkVBRF8xXzFfNDsKKwkJCWlmIChzcGFuc180Ynl0ZSkKKwkJCQljb21tYW5kID0gU1BJTk9SX09QX1JFQUQ0XzFfMV80OworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJ2ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJ2ID09IDApCisJCWJjbV9xc3BpX2JzcGlfc2V0X3hmZXJfcGFyYW1zKHFzcGksIGNvbW1hbmQsIGJwcCwgYnBjLAorCQkJCQkgICAgICBmbGV4X21vZGUpOworCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IGJjbV9xc3BpX2JzcGlfc2V0X292ZXJyaWRlKHN0cnVjdCBiY21fcXNwaSAqcXNwaSwgaW50IHdpZHRoLAorCQkJCSAgICAgIGludCBhZGRybGVuLCBpbnQgaHApCit7CisJdTMyIGRhdGEgPSBiY21fcXNwaV9yZWFkKHFzcGksIEJTUEksIEJTUElfU1RSQVBfT1ZFUlJJREVfQ1RSTCk7CisKKwlkZXZfZGJnKCZxc3BpLT5wZGV2LT5kZXYsICJzZXQgb3ZlcnJpZGUgbW9kZSB3ICV4IGFkZHJsZW4gJXggaHAgJWRcbiIsCisJCXdpZHRoLCBhZGRybGVuLCBocCk7CisKKwlzd2l0Y2ggKHdpZHRoKSB7CisJY2FzZSBTUElfTkJJVFNfU0lOR0xFOgorCQkvKiBjbGVhciBxdWFkL2R1YWwgbW9kZSAqLworCQlkYXRhICY9IH4oQlNQSV9TVFJBUF9PVkVSUklERV9DVFJMX0RBVEFfUVVBRCB8CisJCQkgIEJTUElfU1RSQVBfT1ZFUlJJREVfQ1RSTF9EQVRBX0RVQUwpOworCQlicmVhazsKKworCWNhc2UgU1BJX05CSVRTX1FVQUQ6CisJCS8qIGNsZWFyIGR1YWwgbW9kZSBhbmQgc2V0IHF1YWQgbW9kZSAqLworCQlkYXRhICY9IH5CU1BJX1NUUkFQX09WRVJSSURFX0NUUkxfREFUQV9EVUFMOworCQlkYXRhIHw9IEJTUElfU1RSQVBfT1ZFUlJJREVfQ1RSTF9EQVRBX1FVQUQ7CisJCWJyZWFrOworCWNhc2UgU1BJX05CSVRTX0RVQUw6CisJCS8qIGNsZWFyIHF1YWQgbW9kZSBzZXQgZHVhbCBtb2RlICovCisJCWRhdGEgJj0gfkJTUElfU1RSQVBfT1ZFUlJJREVfQ1RSTF9EQVRBX1FVQUQ7CisJCWRhdGEgfD0gQlNQSV9TVFJBUF9PVkVSUklERV9DVFJMX0RBVEFfRFVBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFkZHJsZW4gPT0gQlNQSV9BRERSTEVOXzRCWVRFUykKKwkJLyogc2V0IDRieXRlIG1vZGUqLworCQlkYXRhIHw9IEJTUElfU1RSQVBfT1ZFUlJJREVfQ1RSTF9BRERSXzRCWVRFOworCWVsc2UKKwkJLyogY2xlYXIgNCBieXRlIG1vZGUgKi8KKwkJZGF0YSAmPSB+QlNQSV9TVFJBUF9PVkVSUklERV9DVFJMX0FERFJfNEJZVEU7CisKKwkvKiBzZXQgdGhlIG92ZXJyaWRlIG1vZGUgKi8KKwlkYXRhIHw9CUJTUElfU1RSQVBfT1ZFUlJJREVfQ1RSTF9PVkVSUklERTsKKwliY21fcXNwaV93cml0ZShxc3BpLCBCU1BJLCBCU1BJX1NUUkFQX09WRVJSSURFX0NUUkwsIGRhdGEpOworCWJjbV9xc3BpX2JzcGlfc2V0X3hmZXJfcGFyYW1zKHFzcGksIFNQSU5PUl9PUF9SRUFEX0ZBU1QsIDAsIDAsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtX3FzcGlfYnNwaV9zZXRfbW9kZShzdHJ1Y3QgYmNtX3FzcGkgKnFzcGksCisJCQkJICBpbnQgd2lkdGgsIGludCBhZGRybGVuLCBpbnQgaHApCit7CisJaW50IGVycm9yID0gMDsKKworCS8qIGRlZmF1bHQgbW9kZSAqLworCXFzcGktPnhmZXJfbW9kZS5mbGV4X21vZGUgPSB0cnVlOworCisJaWYgKCFiY21fcXNwaV9ic3BpX3Zlcl90aHJlZShxc3BpKSkgeworCQl1MzIgdmFsLCBtYXNrOworCisJCXZhbCA9IGJjbV9xc3BpX3JlYWQocXNwaSwgQlNQSSwgQlNQSV9TVFJBUF9PVkVSUklERV9DVFJMKTsKKwkJbWFzayA9IEJTUElfU1RSQVBfT1ZFUlJJREVfQ1RSTF9PVkVSUklERTsKKwkJaWYgKHZhbCAmIG1hc2sgfHwgcXNwaS0+czNfc3RyYXBfb3ZlcnJpZGVfY3RybCAmIG1hc2spIHsKKwkJCXFzcGktPnhmZXJfbW9kZS5mbGV4X21vZGUgPSBmYWxzZTsKKwkJCWJjbV9xc3BpX3dyaXRlKHFzcGksIEJTUEksIEJTUElfRkxFWF9NT0RFX0VOQUJMRSwKKwkJCQkgICAgICAgMCk7CisKKwkJCWlmICgodmFsIHwgcXNwaS0+czNfc3RyYXBfb3ZlcnJpZGVfY3RybCkgJgorCQkJICAgIEJTUElfU1RSQVBfT1ZFUlJJREVfQ1RSTF9EQVRBX0RVQUwpCisJCQkJd2lkdGggPSBTUElfTkJJVFNfRFVBTDsKKwkJCWVsc2UgaWYgKCh2YWwgfCAgcXNwaS0+czNfc3RyYXBfb3ZlcnJpZGVfY3RybCkgJgorCQkJCSBCU1BJX1NUUkFQX09WRVJSSURFX0NUUkxfREFUQV9RVUFEKQorCQkJCXdpZHRoID0gU1BJX05CSVRTX1FVQUQ7CisKKwkJCWVycm9yID0gYmNtX3FzcGlfYnNwaV9zZXRfb3ZlcnJpZGUocXNwaSwgd2lkdGgsIGFkZHJsZW4sCisJCQkJCQkJICAgaHApOworCQl9CisJfQorCisJaWYgKHFzcGktPnhmZXJfbW9kZS5mbGV4X21vZGUpCisJCWVycm9yID0gYmNtX3FzcGlfYnNwaV9zZXRfZmxleF9tb2RlKHFzcGksIHdpZHRoLCBhZGRybGVuLCBocCk7CisKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X3dhcm4oJnFzcGktPnBkZXYtPmRldiwKKwkJCSAiSU5WQUxJRCBDT01CSU5BVElPTjogd2lkdGg9JWQgYWRkcmxlbj0lZCBocD0lZFxuIiwKKwkJCSB3aWR0aCwgYWRkcmxlbiwgaHApOworCX0gZWxzZSBpZiAocXNwaS0+eGZlcl9tb2RlLndpZHRoICE9IHdpZHRoIHx8CisJCSAgIHFzcGktPnhmZXJfbW9kZS5hZGRybGVuICE9IGFkZHJsZW4gfHwKKwkJICAgcXNwaS0+eGZlcl9tb2RlLmhwICE9IGhwKSB7CisJCXFzcGktPnhmZXJfbW9kZS53aWR0aCA9IHdpZHRoOworCQlxc3BpLT54ZmVyX21vZGUuYWRkcmxlbiA9IGFkZHJsZW47CisJCXFzcGktPnhmZXJfbW9kZS5ocCA9IGhwOworCQlkZXZfZGJnKCZxc3BpLT5wZGV2LT5kZXYsCisJCQkiY3M6JWQgJWQtbGFuZSBvdXRwdXQsICVkLWJ5dGUgYWRkcmVzcyVzXG4iLAorCQkJcXNwaS0+Y3Vycl9jcywKKwkJCXFzcGktPnhmZXJfbW9kZS53aWR0aCwKKwkJCXFzcGktPnhmZXJfbW9kZS5hZGRybGVuLAorCQkJcXNwaS0+eGZlcl9tb2RlLmhwICE9IC0xID8gIiwgaHAgbW9kZSIgOiAiIik7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBiY21fcXNwaV9lbmFibGVfYnNwaShzdHJ1Y3QgYmNtX3FzcGkgKnFzcGkpCit7CisJaWYgKCFoYXNfYnNwaShxc3BpKSB8fCAocXNwaS0+YnNwaV9lbmFibGVkKSkKKwkJcmV0dXJuOworCisJcXNwaS0+YnNwaV9lbmFibGVkID0gMTsKKwlpZiAoKGJjbV9xc3BpX3JlYWQocXNwaSwgQlNQSSwgQlNQSV9NQVNUX05fQk9PVF9DVFJMKSAmIDEpID09IDApCisJCXJldHVybjsKKworCWJjbV9xc3BpX2JzcGlfZmx1c2hfcHJlZmV0Y2hfYnVmZmVycyhxc3BpKTsKKwl1ZGVsYXkoMSk7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgQlNQSSwgQlNQSV9NQVNUX05fQk9PVF9DVFJMLCAwKTsKKwl1ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbV9xc3BpX2Rpc2FibGVfYnNwaShzdHJ1Y3QgYmNtX3FzcGkgKnFzcGkpCit7CisJaWYgKCFoYXNfYnNwaShxc3BpKSB8fCAoIXFzcGktPmJzcGlfZW5hYmxlZCkpCisJCXJldHVybjsKKworCXFzcGktPmJzcGlfZW5hYmxlZCA9IDA7CisJaWYgKChiY21fcXNwaV9yZWFkKHFzcGksIEJTUEksIEJTUElfTUFTVF9OX0JPT1RfQ1RSTCkgJiAxKSkKKwkJcmV0dXJuOworCisJYmNtX3FzcGlfYnNwaV9idXN5X3BvbGwocXNwaSk7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgQlNQSSwgQlNQSV9NQVNUX05fQk9PVF9DVFJMLCAxKTsKKwl1ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbV9xc3BpX2NoaXBfc2VsZWN0KHN0cnVjdCBiY21fcXNwaSAqcXNwaSwgaW50IGNzKQoreworCXUzMiBkYXRhID0gMDsKKworCWlmIChxc3BpLT5jdXJyX2NzID09IGNzKQorCQlyZXR1cm47CisJaWYgKHFzcGktPmJhc2VbQ0hJUF9TRUxFQ1RdKSB7CisJCWRhdGEgPSBiY21fcXNwaV9yZWFkKHFzcGksIENISVBfU0VMRUNULCAwKTsKKwkJZGF0YSA9IChkYXRhICYgfjB4ZmYpIHwgKDEgPDwgY3MpOworCQliY21fcXNwaV93cml0ZShxc3BpLCBDSElQX1NFTEVDVCwgMCwgZGF0YSk7CisJCXVzbGVlcF9yYW5nZSgxMCwgMjApOworCX0KKwlxc3BpLT5jdXJyX2NzID0gY3M7Cit9CisKKy8qIE1TUEkgaGVscGVycyAqLworc3RhdGljIHZvaWQgYmNtX3FzcGlfaHdfc2V0X3Bhcm1zKHN0cnVjdCBiY21fcXNwaSAqcXNwaSwKKwkJCQkgIGNvbnN0IHN0cnVjdCBiY21fcXNwaV9wYXJtcyAqeHApCit7CisJdTMyIHNwY3IsIHNwYnIgPSAwOworCisJaWYgKHhwLT5zcGVlZF9oeikKKwkJc3BiciA9IHFzcGktPmJhc2VfY2xrIC8gKDIgKiB4cC0+c3BlZWRfaHopOworCisJc3BjciA9IGNsYW1wX3ZhbChzcGJyLCBRU1BJX1NQQlJfTUlOLCBRU1BJX1NQQlJfTUFYKTsKKwliY21fcXNwaV93cml0ZShxc3BpLCBNU1BJLCBNU1BJX1NQQ1IwX0xTQiwgc3Bjcik7CisKKwlzcGNyID0gTVNQSV9NQVNURVJfQklUOworCS8qIGZvciAxNiBiaXQgdGhlIGRhdGEgc2hvdWxkIGJlIHplcm8gKi8KKwlpZiAoeHAtPmJpdHNfcGVyX3dvcmQgIT0gMTYpCisJCXNwY3IgfD0geHAtPmJpdHNfcGVyX3dvcmQgPDwgMjsKKwlzcGNyIHw9IHhwLT5tb2RlICYgMzsKKwliY21fcXNwaV93cml0ZShxc3BpLCBNU1BJLCBNU1BJX1NQQ1IwX01TQiwgc3Bjcik7CisKKwlxc3BpLT5sYXN0X3Bhcm1zID0gKnhwOworfQorCitzdGF0aWMgdm9pZCBiY21fcXNwaV91cGRhdGVfcGFybXMoc3RydWN0IGJjbV9xc3BpICpxc3BpLAorCQkJCSAgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnRyYW5zKQoreworCXN0cnVjdCBiY21fcXNwaV9wYXJtcyB4cDsKKworCXhwLnNwZWVkX2h6ID0gdHJhbnMtPnNwZWVkX2h6OworCXhwLmJpdHNfcGVyX3dvcmQgPSB0cmFucy0+Yml0c19wZXJfd29yZDsKKwl4cC5tb2RlID0gc3BpLT5tb2RlOworCisJYmNtX3FzcGlfaHdfc2V0X3Bhcm1zKHFzcGksICZ4cCk7Cit9CisKK3N0YXRpYyBpbnQgYmNtX3FzcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYmNtX3FzcGlfcGFybXMgKnhwOworCisJaWYgKHNwaS0+Yml0c19wZXJfd29yZCA+IDE2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXhwID0gc3BpX2dldF9jdGxkYXRhKHNwaSk7CisJaWYgKCF4cCkgeworCQl4cCA9IGt6YWxsb2Moc2l6ZW9mKCp4cCksIEdGUF9LRVJORUwpOworCQlpZiAoIXhwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXNwaV9zZXRfY3RsZGF0YShzcGksIHhwKTsKKwl9CisJeHAtPnNwZWVkX2h6ID0gc3BpLT5tYXhfc3BlZWRfaHo7CisJeHAtPm1vZGUgPSBzcGktPm1vZGU7CisKKwlpZiAoc3BpLT5iaXRzX3Blcl93b3JkKQorCQl4cC0+Yml0c19wZXJfd29yZCA9IHNwaS0+Yml0c19wZXJfd29yZDsKKwllbHNlCisJCXhwLT5iaXRzX3Blcl93b3JkID0gODsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVwZGF0ZV9xc3BpX3RyYW5zX2J5dGVfY291bnQoc3RydWN0IGJjbV9xc3BpICpxc3BpLAorCQkJCQlzdHJ1Y3QgcXNwaV90cmFucyAqcXQsIGludCBmbGFncykKK3sKKwlpbnQgcmV0ID0gVFJBTlNfU1RBVFVTX0JSRUFLX05PTkU7CisKKwkvKiBjb3VudCB0aGUgbGFzdCB0cmFuc2ZlcnJlZCBieXRlcyAqLworCWlmIChxdC0+dHJhbnMtPmJpdHNfcGVyX3dvcmQgPD0gOCkKKwkJcXQtPmJ5dGUrKzsKKwllbHNlCisJCXF0LT5ieXRlICs9IDI7CisKKwlpZiAocXQtPmJ5dGUgPj0gcXQtPnRyYW5zLT5sZW4pIHsKKwkJLyogd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgc3BpX3RyYW5zZmVyICovCisKKwkJLyogaW4gVFggbW9kZSwgbmVlZCB0byBwYXVzZSBmb3IgYSBkZWxheSBvciBDUyBjaGFuZ2UgKi8KKwkJaWYgKHF0LT50cmFucy0+ZGVsYXlfdXNlY3MgJiYKKwkJICAgIChmbGFncyAmIFRSQU5TX1NUQVRVU19CUkVBS19ERUxBWSkpCisJCQlyZXQgfD0gVFJBTlNfU1RBVFVTX0JSRUFLX0RFTEFZOworCQlpZiAocXQtPnRyYW5zLT5jc19jaGFuZ2UgJiYKKwkJICAgIChmbGFncyAmIFRSQU5TX1NUQVRVU19CUkVBS19DU19DSEFOR0UpKQorCQkJcmV0IHw9IFRSQU5TX1NUQVRVU19CUkVBS19DU19DSEFOR0U7CisJCWlmIChyZXQpCisJCQlnb3RvIGRvbmU7CisKKwkJZGV2X2RiZygmcXNwaS0+cGRldi0+ZGV2LCAiYWR2YW5jZSBtc2cgZXhpdFxuIik7CisJCWlmIChzcGlfdHJhbnNmZXJfaXNfbGFzdChxc3BpLT5tYXN0ZXIsIHF0LT50cmFucykpCisJCQlyZXQgPSBUUkFOU19TVEFUVVNfQlJFQUtfRU9NOworCQllbHNlCisJCQlyZXQgPSBUUkFOU19TVEFUVVNfQlJFQUtfTk9fQllURVM7CisKKwkJcXQtPnRyYW5zID0gTlVMTDsKKwl9CisKK2RvbmU6CisJZGV2X2RiZygmcXNwaS0+cGRldi0+ZGV2LCAidHJhbnMgJXAgbGVuICVkIGJ5dGUgJWQgcmV0ICV4XG4iLAorCQlxdC0+dHJhbnMsIHF0LT50cmFucyA/IHF0LT50cmFucy0+bGVuIDogMCwgcXQtPmJ5dGUsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB1OCByZWFkX3J4cmFtX3Nsb3RfdTgoc3RydWN0IGJjbV9xc3BpICpxc3BpLCBpbnQgc2xvdCkKK3sKKwl1MzIgc2xvdF9vZmZzZXQgPSBNU1BJX1JYUkFNICsgKHNsb3QgPDwgMykgKyAweDQ7CisKKwkvKiBtYXNrIG91dCByZXNlcnZlZCBiaXRzICovCisJcmV0dXJuIGJjbV9xc3BpX3JlYWQocXNwaSwgTVNQSSwgc2xvdF9vZmZzZXQpICYgMHhmZjsKK30KKworc3RhdGljIGlubGluZSB1MTYgcmVhZF9yeHJhbV9zbG90X3UxNihzdHJ1Y3QgYmNtX3FzcGkgKnFzcGksIGludCBzbG90KQoreworCXUzMiByZWdfb2Zmc2V0ID0gTVNQSV9SWFJBTTsKKwl1MzIgbHNiX29mZnNldCA9IHJlZ19vZmZzZXQgKyAoc2xvdCA8PCAzKSArIDB4NDsKKwl1MzIgbXNiX29mZnNldCA9IHJlZ19vZmZzZXQgKyAoc2xvdCA8PCAzKTsKKworCXJldHVybiAoYmNtX3FzcGlfcmVhZChxc3BpLCBNU1BJLCBsc2Jfb2Zmc2V0KSAmIDB4ZmYpIHwKKwkJKChiY21fcXNwaV9yZWFkKHFzcGksIE1TUEksIG1zYl9vZmZzZXQpICYgMHhmZikgPDwgOCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfZnJvbV9odyhzdHJ1Y3QgYmNtX3FzcGkgKnFzcGksIGludCBzbG90cykKK3sKKwlzdHJ1Y3QgcXNwaV90cmFucyB0cDsKKwlpbnQgc2xvdDsKKworCWJjbV9xc3BpX2Rpc2FibGVfYnNwaShxc3BpKTsKKworCWlmIChzbG90cyA+IE1TUElfTlVNX0NEUkFNKSB7CisJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJZGV2X2VycigmcXNwaS0+cGRldi0+ZGV2LCAiJXM6IHRvbyBtYW55IHNsb3RzIVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJdHAgPSBxc3BpLT50cmFuc19wb3M7CisKKwlmb3IgKHNsb3QgPSAwOyBzbG90IDwgc2xvdHM7IHNsb3QrKykgeworCQlpZiAodHAudHJhbnMtPmJpdHNfcGVyX3dvcmQgPD0gOCkgeworCQkJdTggKmJ1ZiA9IHRwLnRyYW5zLT5yeF9idWY7CisKKwkJCWlmIChidWYpCisJCQkJYnVmW3RwLmJ5dGVdID0gcmVhZF9yeHJhbV9zbG90X3U4KHFzcGksIHNsb3QpOworCQkJZGV2X2RiZygmcXNwaS0+cGRldi0+ZGV2LCAiUkQgJTAyeFxuIiwKKwkJCQlidWYgPyBidWZbdHAuYnl0ZV0gOiAweGZmKTsKKwkJfSBlbHNlIHsKKwkJCXUxNiAqYnVmID0gdHAudHJhbnMtPnJ4X2J1ZjsKKworCQkJaWYgKGJ1ZikKKwkJCQlidWZbdHAuYnl0ZSAvIDJdID0gcmVhZF9yeHJhbV9zbG90X3UxNihxc3BpLAorCQkJCQkJCQkgICAgICBzbG90KTsKKwkJCWRldl9kYmcoJnFzcGktPnBkZXYtPmRldiwgIlJEICUwNHhcbiIsCisJCQkJYnVmID8gYnVmW3RwLmJ5dGVdIDogMHhmZmZmKTsKKwkJfQorCisJCXVwZGF0ZV9xc3BpX3RyYW5zX2J5dGVfY291bnQocXNwaSwgJnRwLAorCQkJCQkgICAgIFRSQU5TX1NUQVRVU19CUkVBS19OT05FKTsKKwl9CisKKwlxc3BpLT50cmFuc19wb3MgPSB0cDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3R4cmFtX3Nsb3RfdTgoc3RydWN0IGJjbV9xc3BpICpxc3BpLCBpbnQgc2xvdCwKKwkJCQkgICAgICAgdTggdmFsKQoreworCXUzMiByZWdfb2Zmc2V0ID0gTVNQSV9UWFJBTSArIChzbG90IDw8IDMpOworCisJLyogbWFzayBvdXQgcmVzZXJ2ZWQgYml0cyAqLworCWJjbV9xc3BpX3dyaXRlKHFzcGksIE1TUEksIHJlZ19vZmZzZXQsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV90eHJhbV9zbG90X3UxNihzdHJ1Y3QgYmNtX3FzcGkgKnFzcGksIGludCBzbG90LAorCQkJCQl1MTYgdmFsKQoreworCXUzMiByZWdfb2Zmc2V0ID0gTVNQSV9UWFJBTTsKKwl1MzIgbXNiX29mZnNldCA9IHJlZ19vZmZzZXQgKyAoc2xvdCA8PCAzKTsKKwl1MzIgbHNiX29mZnNldCA9IHJlZ19vZmZzZXQgKyAoc2xvdCA8PCAzKSArIDB4NDsKKworCWJjbV9xc3BpX3dyaXRlKHFzcGksIE1TUEksIG1zYl9vZmZzZXQsICh2YWwgPj4gOCkpOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIE1TUEksIGxzYl9vZmZzZXQsICh2YWwgJiAweGZmKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJlYWRfY2RyYW1fc2xvdChzdHJ1Y3QgYmNtX3FzcGkgKnFzcGksIGludCBzbG90KQoreworCXJldHVybiBiY21fcXNwaV9yZWFkKHFzcGksIE1TUEksIE1TUElfQ0RSQU0gKyAoc2xvdCA8PCAyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9jZHJhbV9zbG90KHN0cnVjdCBiY21fcXNwaSAqcXNwaSwgaW50IHNsb3QsIHUzMiB2YWwpCit7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgTVNQSSwgKE1TUElfQ0RSQU0gKyAoc2xvdCA8PCAyKSksIHZhbCk7Cit9CisKKy8qIFJldHVybiBudW1iZXIgb2Ygc2xvdHMgd3JpdHRlbiAqLworc3RhdGljIGludCB3cml0ZV90b19odyhzdHJ1Y3QgYmNtX3FzcGkgKnFzcGksIHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHFzcGlfdHJhbnMgdHA7CisJaW50IHNsb3QgPSAwLCB0c3RhdHVzID0gMDsKKwl1MzIgbXNwaV9jZHJhbSA9IDA7CisKKwliY21fcXNwaV9kaXNhYmxlX2JzcGkocXNwaSk7CisJdHAgPSBxc3BpLT50cmFuc19wb3M7CisJYmNtX3FzcGlfdXBkYXRlX3Bhcm1zKHFzcGksIHNwaSwgdHAudHJhbnMpOworCisJLyogUnVuIHVudGlsIGVuZCBvZiB0cmFuc2ZlciBvciByZWFjaGVkIHRoZSBtYXggZGF0YSAqLworCXdoaWxlICghdHN0YXR1cyAmJiBzbG90IDwgTVNQSV9OVU1fQ0RSQU0pIHsKKwkJaWYgKHRwLnRyYW5zLT5iaXRzX3Blcl93b3JkIDw9IDgpIHsKKwkJCWNvbnN0IHU4ICpidWYgPSB0cC50cmFucy0+dHhfYnVmOworCQkJdTggdmFsID0gYnVmID8gYnVmW3RwLmJ5dGVdIDogMHhmZjsKKworCQkJd3JpdGVfdHhyYW1fc2xvdF91OChxc3BpLCBzbG90LCB2YWwpOworCQkJZGV2X2RiZygmcXNwaS0+cGRldi0+ZGV2LCAiV1IgJTAyeFxuIiwgdmFsKTsKKwkJfSBlbHNlIHsKKwkJCWNvbnN0IHUxNiAqYnVmID0gdHAudHJhbnMtPnR4X2J1ZjsKKwkJCXUxNiB2YWwgPSBidWYgPyBidWZbdHAuYnl0ZSAvIDJdIDogMHhmZmZmOworCisJCQl3cml0ZV90eHJhbV9zbG90X3UxNihxc3BpLCBzbG90LCB2YWwpOworCQkJZGV2X2RiZygmcXNwaS0+cGRldi0+ZGV2LCAiV1IgJTA0eFxuIiwgdmFsKTsKKwkJfQorCQltc3BpX2NkcmFtID0gTVNQSV9DRFJBTV9DT05UX0JJVDsKKwkJbXNwaV9jZHJhbSB8PSAofigxIDw8IHNwaS0+Y2hpcF9zZWxlY3QpICYKKwkJCSAgICAgICBNU1BJX0NEUkFNX1BDUyk7CisJCW1zcGlfY2RyYW0gfD0gKCh0cC50cmFucy0+Yml0c19wZXJfd29yZCA8PSA4KSA/IDAgOgorCQkJCU1TUElfQ0RSQU1fQklUU0VfQklUKTsKKworCQl3cml0ZV9jZHJhbV9zbG90KHFzcGksIHNsb3QsIG1zcGlfY2RyYW0pOworCisJCXRzdGF0dXMgPSB1cGRhdGVfcXNwaV90cmFuc19ieXRlX2NvdW50KHFzcGksICZ0cCwKKwkJCQkJCSAgICAgICBUUkFOU19TVEFUVVNfQlJFQUtfVFgpOworCQlzbG90Kys7CisJfQorCisJaWYgKCFzbG90KSB7CisJCWRldl9lcnIoJnFzcGktPnBkZXYtPmRldiwgIiVzOiBubyBkYXRhIHRvIHNlbmQ/IiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJZGV2X2RiZygmcXNwaS0+cGRldi0+ZGV2LCAic3VibWl0dGluZyAlZCBzbG90c1xuIiwgc2xvdCk7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgTVNQSSwgTVNQSV9ORVdRUCwgMCk7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgTVNQSSwgTVNQSV9FTkRRUCwgc2xvdCAtIDEpOworCisJaWYgKHRzdGF0dXMgJiBUUkFOU19TVEFUVVNfQlJFQUtfREVTRUxFQ1QpIHsKKwkJbXNwaV9jZHJhbSA9IHJlYWRfY2RyYW1fc2xvdChxc3BpLCBzbG90IC0gMSkgJgorCQkJfk1TUElfQ0RSQU1fQ09OVF9CSVQ7CisJCXdyaXRlX2NkcmFtX3Nsb3QocXNwaSwgc2xvdCAtIDEsIG1zcGlfY2RyYW0pOworCX0KKworCWlmIChoYXNfYnNwaShxc3BpKSkKKwkJYmNtX3FzcGlfd3JpdGUocXNwaSwgTVNQSSwgTVNQSV9XUklURV9MT0NLLCAxKTsKKworCS8qIE11c3QgZmx1c2ggcHJldmlvdXMgd3JpdGVzIGJlZm9yZSBzdGFydGluZyBNU1BJIG9wZXJhdGlvbiAqLworCW1iKCk7CisJLyogU2V0IGNvbnQgfCBzcGUgfCBzcGlmaWUgKi8KKwliY21fcXNwaV93cml0ZShxc3BpLCBNU1BJLCBNU1BJX1NQQ1IyLCAweGUwKTsKKworZG9uZToKKwlyZXR1cm4gc2xvdDsKK30KKworc3RhdGljIGludCBiY21fcXNwaV9ic3BpX2ZsYXNoX3JlYWQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkgICAgc3RydWN0IHNwaV9mbGFzaF9yZWFkX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3QgYmNtX3FzcGkgKnFzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl1MzIgYWRkciA9IDAsIGxlbiwgbGVuX3dvcmRzOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgdGltZW8gPSBtc2Vjc190b19qaWZmaWVzKDEwMCk7CisJc3RydWN0IGJjbV9xc3BpX3NvY19pbnRjICpzb2NfaW50YyA9IHFzcGktPnNvY19pbnRjOworCisJaWYgKGJjbV9xc3BpX2JzcGlfdmVyX3RocmVlKHFzcGkpKQorCQlpZiAobXNnLT5hZGRyX3dpZHRoID09IEJTUElfQUREUkxFTl80QllURVMpCisJCQlyZXR1cm4gLUVJTzsKKworCWJjbV9xc3BpX2NoaXBfc2VsZWN0KHFzcGksIHNwaS0+Y2hpcF9zZWxlY3QpOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIE1TUEksIE1TUElfV1JJVEVfTE9DSywgMCk7CisKKwkvKgorCSAqIHdoZW4gdXNpbmcgZmxleCBtb2RlIG1vZGUgd2UgbmVlZCB0byBzZW5kCisJICogdGhlIHVwcGVyIGFkZHJlc3MgYnl0ZSB0byBic3BpCisJICovCisJaWYgKGJjbV9xc3BpX2JzcGlfdmVyX3RocmVlKHFzcGkpID09IGZhbHNlKSB7CisJCWFkZHIgPSBtc2ctPmZyb20gJiAweGZmMDAwMDAwOworCQliY21fcXNwaV93cml0ZShxc3BpLCBCU1BJLAorCQkJICAgICAgIEJTUElfQlNQSV9GTEFTSF9VUFBFUl9BRERSX0JZVEUsIGFkZHIpOworCX0KKworCWlmICghcXNwaS0+eGZlcl9tb2RlLmZsZXhfbW9kZSkKKwkJYWRkciA9IG1zZy0+ZnJvbTsKKwllbHNlCisJCWFkZHIgPSBtc2ctPmZyb20gJiAweDAwZmZmZmZmOworCisJLyogc2V0IEJTUEkgUkFGIGJ1ZmZlciBtYXggcmVhZCBsZW5ndGggKi8KKwlsZW4gPSBtc2ctPmxlbjsKKwlpZiAobGVuID4gQlNQSV9SRUFEX0xFTkdUSCkKKwkJbGVuID0gQlNQSV9SRUFEX0xFTkdUSDsKKworCWlmIChiY21fcXNwaV9ic3BpX3Zlcl90aHJlZShxc3BpKSA9PSB0cnVlKQorCQlhZGRyID0gKGFkZHIgKyAweGMwMDAwMCkgJiAweGZmZmZmZjsKKworCXJlaW5pdF9jb21wbGV0aW9uKCZxc3BpLT5ic3BpX2RvbmUpOworCWJjbV9xc3BpX2VuYWJsZV9ic3BpKHFzcGkpOworCWxlbl93b3JkcyA9IChsZW4gKyAzKSA+PiAyOworCXFzcGktPmJzcGlfcmZfbXNnID0gbXNnOworCXFzcGktPmJzcGlfcmZfbXNnX3N0YXR1cyA9IDA7CisJcXNwaS0+YnNwaV9yZl9tc2dfaWR4ID0gMDsKKwlxc3BpLT5ic3BpX3JmX21zZ19sZW4gPSBsZW47CisJZGV2X2RiZygmcXNwaS0+cGRldi0+ZGV2LCAiYnNwaSB4ZnIgYWRkciAweCV4IGxlbiAweCV4IiwgYWRkciwgbGVuKTsKKworCWJjbV9xc3BpX3dyaXRlKHFzcGksIEJTUEksIEJTUElfUkFGX1NUQVJUX0FERFIsIGFkZHIpOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIEJTUEksIEJTUElfUkFGX05VTV9XT1JEUywgbGVuX3dvcmRzKTsKKwliY21fcXNwaV93cml0ZShxc3BpLCBCU1BJLCBCU1BJX1JBRl9XQVRFUk1BUkssIDApOworCisJaWYgKHFzcGktPnNvY19pbnRjKSB7CisJCS8qCisJCSAqIGNsZWFyIHNvYyBNU1BJIGFuZCBCU1BJIGludGVycnVwdHMgYW5kIGVuYWJsZQorCQkgKiBCU1BJIGludGVycnVwdHMuCisJCSAqLworCQlzb2NfaW50Yy0+YmNtX3FzcGlfaW50X2Fjayhzb2NfaW50YywgTVNQSV9CU1BJX0RPTkUpOworCQlzb2NfaW50Yy0+YmNtX3FzcGlfaW50X3NldChzb2NfaW50YywgQlNQSV9ET05FLCB0cnVlKTsKKwl9CisKKwkvKiBNdXN0IGZsdXNoIHByZXZpb3VzIHdyaXRlcyBiZWZvcmUgc3RhcnRpbmcgQlNQSSBvcGVyYXRpb24gKi8KKwltYigpOworCisJYmNtX3FzcGlfYnNwaV9scl9zdGFydChxc3BpKTsKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcXNwaS0+YnNwaV9kb25lLCB0aW1lbykpIHsKKwkJZGV2X2VycigmcXNwaS0+cGRldi0+ZGV2LCAidGltZW91dCB3YWl0aW5nIGZvciBCU1BJXG4iKTsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwl9IGVsc2UgeworCQkvKiBzZXQgdGhlIHJldHVybiBsZW5ndGggZm9yIHRoZSBjYWxsZXIgKi8KKwkJbXNnLT5yZXRsZW4gPSBsZW47CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBiY21fcXNwaV9mbGFzaF9yZWFkKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkgICAgICAgc3RydWN0IHNwaV9mbGFzaF9yZWFkX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3QgYmNtX3FzcGkgKnFzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwlpbnQgcmV0ID0gMDsKKwlib29sIG1zcGlfcmVhZCA9IGZhbHNlOworCXUzMiBpb193aWR0aCwgYWRkcmxlbiwgYWRkciwgbGVuOworCXVfY2hhciAqYnVmOworCisJYnVmID0gbXNnLT5idWY7CisJYWRkciA9IG1zZy0+ZnJvbTsKKwlsZW4gPSBtc2ctPmxlbjsKKworCWlmIChiY21fcXNwaV9ic3BpX3Zlcl90aHJlZShxc3BpKSA9PSB0cnVlKSB7CisJCS8qCisJCSAqIFRoZSBhZGRyZXNzIGNvbWluZyBpbnRvIHRoaXMgZnVuY3Rpb24gaXMgYSByYXcgZmxhc2ggb2Zmc2V0LgorCQkgKiBCdXQgZm9yIEJTUEkgPD0gVjMsIHdlIG5lZWQgdG8gY29udmVydCBpdCB0byBhIHJlbWFwcGVkIEJTUEkKKwkJICogYWRkcmVzcy4gSWYgaXQgY3Jvc3NlcyBhIDRNQiBib3VuZGFyeSwganVzdCByZXZlcnQgYmFjayB0bworCQkgKiB1c2luZyBNU1BJLgorCQkgKi8KKwkJYWRkciA9IChhZGRyICsgMHhjMDAwMDApICYgMHhmZmZmZmY7CisKKwkJaWYgKCh+QUREUl80TUJfTUFTSyAmIGFkZHIpIF4KKwkJICAgICh+QUREUl80TUJfTUFTSyAmIChhZGRyICsgbGVuIC0gMSkpKQorCQkJbXNwaV9yZWFkID0gdHJ1ZTsKKwl9CisKKwkvKiBub24tYWxpZ25lZCBhbmQgdmVyeSBzaG9ydCB0cmFuc2ZlcnMgYXJlIGhhbmRsZWQgYnkgTVNQSSAqLworCWlmICghSVNfQUxJR05FRCgodWludHB0cl90KWFkZHIsIDQpIHx8ICFJU19BTElHTkVEKCh1aW50cHRyX3QpYnVmLCA0KSB8fAorCSAgICBsZW4gPCA0KQorCQltc3BpX3JlYWQgPSB0cnVlOworCisJaWYgKG1zcGlfcmVhZCkKKwkJLyogdGhpcyB3aWxsIG1ha2UgdGhlIG0yNXA4MCByZWFkIHRvIGZhbGxiYWNrIHRvIG1zcGkgcmVhZCAqLworCQlyZXR1cm4gLUVBR0FJTjsKKworCWlvX3dpZHRoID0gbXNnLT5kYXRhX25iaXRzID8gbXNnLT5kYXRhX25iaXRzIDogU1BJX05CSVRTX1NJTkdMRTsKKwlhZGRybGVuID0gbXNnLT5hZGRyX3dpZHRoOworCXJldCA9IGJjbV9xc3BpX2JzcGlfc2V0X21vZGUocXNwaSwgaW9fd2lkdGgsIGFkZHJsZW4sIC0xKTsKKworCWlmICghcmV0KQorCQlyZXQgPSBiY21fcXNwaV9ic3BpX2ZsYXNoX3JlYWQoc3BpLCBtc2cpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBiY21fcXNwaV90cmFuc2Zlcl9vbmUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKKwkJCQkgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkgc3RydWN0IHNwaV90cmFuc2ZlciAqdHJhbnMpCit7CisJc3RydWN0IGJjbV9xc3BpICpxc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWludCBzbG90czsKKwl1bnNpZ25lZCBsb25nIHRpbWVvID0gbXNlY3NfdG9famlmZmllcygxMDApOworCisJYmNtX3FzcGlfY2hpcF9zZWxlY3QocXNwaSwgc3BpLT5jaGlwX3NlbGVjdCk7CisJcXNwaS0+dHJhbnNfcG9zLnRyYW5zID0gdHJhbnM7CisJcXNwaS0+dHJhbnNfcG9zLmJ5dGUgPSAwOworCisJd2hpbGUgKHFzcGktPnRyYW5zX3Bvcy5ieXRlIDwgdHJhbnMtPmxlbikgeworCQlyZWluaXRfY29tcGxldGlvbigmcXNwaS0+bXNwaV9kb25lKTsKKworCQlzbG90cyA9IHdyaXRlX3RvX2h3KHFzcGksIHNwaSk7CisJCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZxc3BpLT5tc3BpX2RvbmUsIHRpbWVvKSkgeworCQkJZGV2X2VycigmcXNwaS0+cGRldi0+ZGV2LCAidGltZW91dCB3YWl0aW5nIGZvciBNU1BJXG4iKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisKKwkJcmVhZF9mcm9tX2h3KHFzcGksIHNsb3RzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmNtX3FzcGlfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBiY21fcXNwaV9wYXJtcyAqeHAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKKworCWtmcmVlKHhwKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGJjbV9xc3BpX21zcGlfbDJfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgYmNtX3FzcGlfZGV2X2lkICpxc3BpX2Rldl9pZCA9IGRldl9pZDsKKwlzdHJ1Y3QgYmNtX3FzcGkgKnFzcGkgPSBxc3BpX2Rldl9pZC0+ZGV2OworCXUzMiBzdGF0dXMgPSBiY21fcXNwaV9yZWFkKHFzcGksIE1TUEksIE1TUElfTVNQSV9TVEFUVVMpOworCisJaWYgKHN0YXR1cyAmIE1TUElfTVNQSV9TVEFUVVNfU1BJRikgeworCQlzdHJ1Y3QgYmNtX3FzcGlfc29jX2ludGMgKnNvY19pbnRjID0gcXNwaS0+c29jX2ludGM7CisJCS8qIGNsZWFyIGludGVycnVwdCAqLworCQlzdGF0dXMgJj0gfk1TUElfTVNQSV9TVEFUVVNfU1BJRjsKKwkJYmNtX3FzcGlfd3JpdGUocXNwaSwgTVNQSSwgTVNQSV9NU1BJX1NUQVRVUywgc3RhdHVzKTsKKwkJaWYgKHFzcGktPnNvY19pbnRjKQorCQkJc29jX2ludGMtPmJjbV9xc3BpX2ludF9hY2soc29jX2ludGMsIE1TUElfRE9ORSk7CisJCWNvbXBsZXRlKCZxc3BpLT5tc3BpX2RvbmUpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIElSUV9OT05FOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYmNtX3FzcGlfYnNwaV9scl9sMl9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBiY21fcXNwaV9kZXZfaWQgKnFzcGlfZGV2X2lkID0gZGV2X2lkOworCXN0cnVjdCBiY21fcXNwaSAqcXNwaSA9IHFzcGlfZGV2X2lkLT5kZXY7CisJc3RydWN0IGJjbV9xc3BpX3NvY19pbnRjICpzb2NfaW50YyA9IHFzcGktPnNvY19pbnRjOworCXUzMiBzdGF0dXMgPSBxc3BpX2Rldl9pZC0+aXJxcC0+bWFzazsKKworCWlmIChxc3BpLT5ic3BpX2VuYWJsZWQgJiYgcXNwaS0+YnNwaV9yZl9tc2cpIHsKKwkJYmNtX3FzcGlfYnNwaV9scl9kYXRhX3JlYWQocXNwaSk7CisJCWlmIChxc3BpLT5ic3BpX3JmX21zZ19sZW4gPT0gMCkgeworCQkJcXNwaS0+YnNwaV9yZl9tc2cgPSBOVUxMOworCQkJaWYgKHFzcGktPnNvY19pbnRjKSB7CisJCQkJLyogZGlzYWJsZSBzb2MgQlNQSSBpbnRlcnJ1cHQgKi8KKwkJCQlzb2NfaW50Yy0+YmNtX3FzcGlfaW50X3NldChzb2NfaW50YywgQlNQSV9ET05FLAorCQkJCQkJCSAgIGZhbHNlKTsKKwkJCQkvKiBpbmRpY2F0ZSBkb25lICovCisJCQkJc3RhdHVzID0gSU5UUl9CU1BJX0xSX1NFU1NJT05fRE9ORV9NQVNLOworCQkJfQorCisJCQlpZiAocXNwaS0+YnNwaV9yZl9tc2dfc3RhdHVzKQorCQkJCWJjbV9xc3BpX2JzcGlfbHJfY2xlYXIocXNwaSk7CisJCQllbHNlCisJCQkJYmNtX3FzcGlfYnNwaV9mbHVzaF9wcmVmZXRjaF9idWZmZXJzKHFzcGkpOworCQl9CisKKwkJaWYgKHFzcGktPnNvY19pbnRjKQorCQkJLyogY2xlYXIgc29jIEJTUEkgaW50ZXJydXB0ICovCisJCQlzb2NfaW50Yy0+YmNtX3FzcGlfaW50X2Fjayhzb2NfaW50YywgQlNQSV9ET05FKTsKKwl9CisKKwlzdGF0dXMgJj0gSU5UUl9CU1BJX0xSX1NFU1NJT05fRE9ORV9NQVNLOworCWlmIChxc3BpLT5ic3BpX2VuYWJsZWQgJiYgc3RhdHVzICYmIHFzcGktPmJzcGlfcmZfbXNnX2xlbiA9PSAwKQorCQljb21wbGV0ZSgmcXNwaS0+YnNwaV9kb25lKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGJjbV9xc3BpX2JzcGlfbHJfZXJyX2wyX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGJjbV9xc3BpX2Rldl9pZCAqcXNwaV9kZXZfaWQgPSBkZXZfaWQ7CisJc3RydWN0IGJjbV9xc3BpICpxc3BpID0gcXNwaV9kZXZfaWQtPmRldjsKKwlzdHJ1Y3QgYmNtX3FzcGlfc29jX2ludGMgKnNvY19pbnRjID0gcXNwaS0+c29jX2ludGM7CisKKwlkZXZfZXJyKCZxc3BpLT5wZGV2LT5kZXYsICJCU1BJIElOVCBlcnJvclxuIik7CisJcXNwaS0+YnNwaV9yZl9tc2dfc3RhdHVzID0gLUVJTzsKKwlpZiAocXNwaS0+c29jX2ludGMpCisJCS8qIGNsZWFyIHNvYyBpbnRlcnJ1cHQgKi8KKwkJc29jX2ludGMtPmJjbV9xc3BpX2ludF9hY2soc29jX2ludGMsIEJTUElfRVJSKTsKKworCWNvbXBsZXRlKCZxc3BpLT5ic3BpX2RvbmUpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGJjbV9xc3BpX2wxX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGJjbV9xc3BpX2Rldl9pZCAqcXNwaV9kZXZfaWQgPSBkZXZfaWQ7CisJc3RydWN0IGJjbV9xc3BpICpxc3BpID0gcXNwaV9kZXZfaWQtPmRldjsKKwlzdHJ1Y3QgYmNtX3FzcGlfc29jX2ludGMgKnNvY19pbnRjID0gcXNwaS0+c29jX2ludGM7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisKKwlpZiAoc29jX2ludGMpIHsKKwkJdTMyIHN0YXR1cyA9IHNvY19pbnRjLT5iY21fcXNwaV9nZXRfaW50X3N0YXR1cyhzb2NfaW50Yyk7CisKKwkJaWYgKHN0YXR1cyAmIE1TUElfRE9ORSkKKwkJCXJldCA9IGJjbV9xc3BpX21zcGlfbDJfaXNyKGlycSwgZGV2X2lkKTsKKwkJZWxzZSBpZiAoc3RhdHVzICYgQlNQSV9ET05FKQorCQkJcmV0ID0gYmNtX3FzcGlfYnNwaV9scl9sMl9pc3IoaXJxLCBkZXZfaWQpOworCQllbHNlIGlmIChzdGF0dXMgJiBCU1BJX0VSUikKKwkJCXJldCA9IGJjbV9xc3BpX2JzcGlfbHJfZXJyX2wyX2lzcihpcnEsIGRldl9pZCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBiY21fcXNwaV9pcnEgcXNwaV9pcnFfdGFiW10gPSB7CisJeworCQkuaXJxX25hbWUgPSAic3BpX2xyX2Z1bGxuZXNzX3JlYWNoZWQiLAorCQkuaXJxX2hhbmRsZXIgPSBiY21fcXNwaV9ic3BpX2xyX2wyX2lzciwKKwkJLm1hc2sgPSBJTlRSX0JTUElfTFJfRlVMTE5FU1NfUkVBQ0hFRF9NQVNLLAorCX0sCisJeworCQkuaXJxX25hbWUgPSAic3BpX2xyX3Nlc3Npb25fYWJvcnRlZCIsCisJCS5pcnFfaGFuZGxlciA9IGJjbV9xc3BpX2JzcGlfbHJfZXJyX2wyX2lzciwKKwkJLm1hc2sgPSBJTlRSX0JTUElfTFJfU0VTU0lPTl9BQk9SVEVEX01BU0ssCisJfSwKKwl7CisJCS5pcnFfbmFtZSA9ICJzcGlfbHJfaW1wYXRpZW50IiwKKwkJLmlycV9oYW5kbGVyID0gYmNtX3FzcGlfYnNwaV9scl9lcnJfbDJfaXNyLAorCQkubWFzayA9IElOVFJfQlNQSV9MUl9JTVBBVElFTlRfTUFTSywKKwl9LAorCXsKKwkJLmlycV9uYW1lID0gInNwaV9scl9zZXNzaW9uX2RvbmUiLAorCQkuaXJxX2hhbmRsZXIgPSBiY21fcXNwaV9ic3BpX2xyX2wyX2lzciwKKwkJLm1hc2sgPSBJTlRSX0JTUElfTFJfU0VTU0lPTl9ET05FX01BU0ssCisJfSwKKyNpZmRlZiBRU1BJX0lOVF9ERUJVRworCS8qIHRoaXMgaW50ZXJydXB0IGlzIGZvciBkZWJ1ZyBwdXJwb3NlcyBvbmx5LCBkb250IHJlcXVlc3QgaXJxICovCisJeworCQkuaXJxX25hbWUgPSAic3BpX2xyX292ZXJyZWFkIiwKKwkJLmlycV9oYW5kbGVyID0gYmNtX3FzcGlfYnNwaV9scl9lcnJfbDJfaXNyLAorCQkubWFzayA9IElOVFJfQlNQSV9MUl9PVkVSUkVBRF9NQVNLLAorCX0sCisjZW5kaWYKKwl7CisJCS5pcnFfbmFtZSA9ICJtc3BpX2RvbmUiLAorCQkuaXJxX2hhbmRsZXIgPSBiY21fcXNwaV9tc3BpX2wyX2lzciwKKwkJLm1hc2sgPSBJTlRSX01TUElfRE9ORV9NQVNLLAorCX0sCisJeworCQkuaXJxX25hbWUgPSAibXNwaV9oYWx0ZWQiLAorCQkuaXJxX2hhbmRsZXIgPSBiY21fcXNwaV9tc3BpX2wyX2lzciwKKwkJLm1hc2sgPSBJTlRSX01TUElfSEFMVEVEX01BU0ssCisJfSwKKwl7CisJCS8qIHNpbmdsZSBtdXhlZCBMMSBpbnRlcnJ1cHQgc291cmNlICovCisJCS5pcnFfbmFtZSA9ICJzcGlfbDFfaW50ciIsCisJCS5pcnFfaGFuZGxlciA9IGJjbV9xc3BpX2wxX2lzciwKKwkJLmlycV9zb3VyY2UgPSBNVVhFRF9MMSwKKwkJLm1hc2sgPSBRU1BJX0lOVEVSUlVQVFNfQUxMLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBiY21fcXNwaV9ic3BpX2luaXQoc3RydWN0IGJjbV9xc3BpICpxc3BpKQoreworCXUzMiB2YWwgPSAwOworCisJdmFsID0gYmNtX3FzcGlfcmVhZChxc3BpLCBCU1BJLCBCU1BJX1JFVklTSU9OX0lEKTsKKwlxc3BpLT5ic3BpX21hal9yZXYgPSAodmFsID4+IDgpICYgMHhmZjsKKwlxc3BpLT5ic3BpX21pbl9yZXYgPSB2YWwgJiAweGZmOworCWlmICghKGJjbV9xc3BpX2JzcGlfdmVyX3RocmVlKHFzcGkpKSkgeworCQkvKiBGb3JjZSBtYXBwaW5nIG9mIEJTUEkgYWRkcmVzcyAtPiBmbGFzaCBvZmZzZXQgKi8KKwkJYmNtX3FzcGlfd3JpdGUocXNwaSwgQlNQSSwgQlNQSV9CU1BJX1hPUl9WQUxVRSwgMCk7CisJCWJjbV9xc3BpX3dyaXRlKHFzcGksIEJTUEksIEJTUElfQlNQSV9YT1JfRU5BQkxFLCAxKTsKKwl9CisJcXNwaS0+YnNwaV9lbmFibGVkID0gMTsKKwliY21fcXNwaV9kaXNhYmxlX2JzcGkocXNwaSk7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgQlNQSSwgQlNQSV9CMF9DVFJMLCAwKTsKKwliY21fcXNwaV93cml0ZShxc3BpLCBCU1BJLCBCU1BJX0IxX0NUUkwsIDApOworfQorCitzdGF0aWMgdm9pZCBiY21fcXNwaV9od19pbml0KHN0cnVjdCBiY21fcXNwaSAqcXNwaSkKK3sKKwlzdHJ1Y3QgYmNtX3FzcGlfcGFybXMgcGFybXM7CisKKwliY21fcXNwaV93cml0ZShxc3BpLCBNU1BJLCBNU1BJX1NQQ1IxX0xTQiwgMCk7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgTVNQSSwgTVNQSV9TUENSMV9NU0IsIDApOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIE1TUEksIE1TUElfTkVXUVAsIDApOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIE1TUEksIE1TUElfRU5EUVAsIDApOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIE1TUEksIE1TUElfU1BDUjIsIDB4MjApOworCisJcGFybXMubW9kZSA9IFNQSV9NT0RFXzM7CisJcGFybXMuYml0c19wZXJfd29yZCA9IDg7CisJcGFybXMuc3BlZWRfaHogPSBxc3BpLT5tYXhfc3BlZWRfaHo7CisJYmNtX3FzcGlfaHdfc2V0X3Bhcm1zKHFzcGksICZwYXJtcyk7CisKKwlpZiAoaGFzX2JzcGkocXNwaSkpCisJCWJjbV9xc3BpX2JzcGlfaW5pdChxc3BpKTsKK30KKworc3RhdGljIHZvaWQgYmNtX3FzcGlfaHdfdW5pbml0KHN0cnVjdCBiY21fcXNwaSAqcXNwaSkKK3sKKwliY21fcXNwaV93cml0ZShxc3BpLCBNU1BJLCBNU1BJX1NQQ1IyLCAwKTsKKwlpZiAoaGFzX2JzcGkocXNwaSkpCisJCWJjbV9xc3BpX3dyaXRlKHFzcGksIE1TUEksIE1TUElfV1JJVEVfTE9DSywgMCk7CisKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYmNtX3FzcGlfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImJyY20sc3BpLWJjbS1xc3BpIiB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGJjbV9xc3BpX29mX21hdGNoKTsKKworaW50IGJjbV9xc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCSAgIHN0cnVjdCBiY21fcXNwaV9zb2NfaW50YyAqc29jX2ludGMpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgYmNtX3FzcGkgKnFzcGk7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaXJxLCByZXQgPSAwLCBudW1faW50cyA9IDA7CisJdTMyIHZhbDsKKwljb25zdCBjaGFyICpuYW1lID0gTlVMTDsKKwlpbnQgbnVtX2lycXMgPSBBUlJBWV9TSVpFKHFzcGlfaXJxX3RhYik7CisKKwkvKiBXZSBvbmx5IHN1cHBvcnQgZGV2aWNlLXRyZWUgaW5zdGFudGlhdGlvbiAqLworCWlmICghZGV2LT5vZl9ub2RlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghb2ZfbWF0Y2hfbm9kZShiY21fcXNwaV9vZl9tYXRjaCwgZGV2LT5vZl9ub2RlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKGRldiwgc2l6ZW9mKHN0cnVjdCBiY21fcXNwaSkpOworCWlmICghbWFzdGVyKSB7CisJCWRldl9lcnIoZGV2LCAiZXJyb3IgYWxsb2NhdGluZyBzcGlfbWFzdGVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlxc3BpLT5wZGV2ID0gcGRldjsKKwlxc3BpLT50cmFuc19wb3MudHJhbnMgPSBOVUxMOworCXFzcGktPnRyYW5zX3Bvcy5ieXRlID0gMDsKKwlxc3BpLT5tYXN0ZXIgPSBtYXN0ZXI7CisKKwltYXN0ZXItPmJ1c19udW0gPSAtMTsKKwltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUEhBIHwgU1BJX0NQT0wgfCBTUElfUlhfRFVBTCB8IFNQSV9SWF9RVUFEOworCW1hc3Rlci0+c2V0dXAgPSBiY21fcXNwaV9zZXR1cDsKKwltYXN0ZXItPnRyYW5zZmVyX29uZSA9IGJjbV9xc3BpX3RyYW5zZmVyX29uZTsKKwltYXN0ZXItPnNwaV9mbGFzaF9yZWFkID0gYmNtX3FzcGlfZmxhc2hfcmVhZDsKKwltYXN0ZXItPmNsZWFudXAgPSBiY21fcXNwaV9jbGVhbnVwOworCW1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBkZXYtPm9mX25vZGU7CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IE5VTV9DSElQU0VMRUNUOworCisJcXNwaS0+YmlnX2VuZGlhbiA9IG9mX2RldmljZV9pc19iaWdfZW5kaWFuKGRldi0+b2Zfbm9kZSk7CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgIm51bS1jcyIsICZ2YWwpKQorCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gdmFsOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgImhpZl9tc3BpIik7CisJaWYgKCFyZXMpCisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCisJCQkJCQkgICAibXNwaSIpOworCisJaWYgKHJlcykgeworCQlxc3BpLT5iYXNlW01TUEldICA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJCWlmIChJU19FUlIocXNwaS0+YmFzZVtNU1BJXSkpIHsKKwkJCXJldCA9IFBUUl9FUlIocXNwaS0+YmFzZVtNU1BJXSk7CisJCQlnb3RvIHFzcGlfcHJvYmVfZXJyOworCQl9CisJfSBlbHNlIHsKKwkJZ290byBxc3BpX3Byb2JlX2VycjsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAiYnNwaSIpOworCWlmIChyZXMpIHsKKwkJcXNwaS0+YmFzZVtCU1BJXSAgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCQlpZiAoSVNfRVJSKHFzcGktPmJhc2VbQlNQSV0pKSB7CisJCQlyZXQgPSBQVFJfRVJSKHFzcGktPmJhc2VbQlNQSV0pOworCQkJZ290byBxc3BpX3Byb2JlX2VycjsKKwkJfQorCQlxc3BpLT5ic3BpX21vZGUgPSB0cnVlOworCX0gZWxzZSB7CisJCXFzcGktPmJzcGlfbW9kZSA9IGZhbHNlOworCX0KKworCWRldl9pbmZvKGRldiwgInVzaW5nICVzbXNwaSBtb2RlXG4iLCBxc3BpLT5ic3BpX21vZGUgPyAiYnNwaS0iIDogIiIpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgImNzX3JlZyIpOworCWlmIChyZXMpIHsKKwkJcXNwaS0+YmFzZVtDSElQX1NFTEVDVF0gID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwkJaWYgKElTX0VSUihxc3BpLT5iYXNlW0NISVBfU0VMRUNUXSkpIHsKKwkJCXJldCA9IFBUUl9FUlIocXNwaS0+YmFzZVtDSElQX1NFTEVDVF0pOworCQkJZ290byBxc3BpX3Byb2JlX2VycjsKKwkJfQorCX0KKworCXFzcGktPmRldl9pZHMgPSBrY2FsbG9jKG51bV9pcnFzLCBzaXplb2Yoc3RydWN0IGJjbV9xc3BpX2Rldl9pZCksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFxc3BpLT5kZXZfaWRzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gcXNwaV9wcm9iZV9lcnI7CisJfQorCisJZm9yICh2YWwgPSAwOyB2YWwgPCBudW1faXJxczsgdmFsKyspIHsKKwkJaXJxID0gLTE7CisJCW5hbWUgPSBxc3BpX2lycV90YWJbdmFsXS5pcnFfbmFtZTsKKwkJaWYgKHFzcGlfaXJxX3RhYlt2YWxdLmlycV9zb3VyY2UgPT0gU0lOR0xFX0wyKSB7CisJCQkvKiBnZXQgdGhlIGwyIGludGVycnVwdHMgKi8KKwkJCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsIG5hbWUpOworCQl9IGVsc2UgaWYgKCFudW1faW50cyAmJiBzb2NfaW50YykgeworCQkJLyogYWxsIG1zcGksIGJzcGkgaW50cnMgbXV4ZWQgdG8gb25lIEwxIGludHIgKi8KKwkJCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJCX0KKworCQlpZiAoaXJxICA+PSAwKSB7CisJCQlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwKKwkJCQkJICAgICAgIHFzcGlfaXJxX3RhYlt2YWxdLmlycV9oYW5kbGVyLCAwLAorCQkJCQkgICAgICAgbmFtZSwKKwkJCQkJICAgICAgICZxc3BpLT5kZXZfaWRzW3ZhbF0pOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJUlEgJXMgbm90IGZvdW5kXG4iLCBuYW1lKTsKKwkJCQlnb3RvIHFzcGlfcHJvYmVfZXJyOworCQkJfQorCisJCQlxc3BpLT5kZXZfaWRzW3ZhbF0uZGV2ID0gcXNwaTsKKwkJCXFzcGktPmRldl9pZHNbdmFsXS5pcnFwID0gJnFzcGlfaXJxX3RhYlt2YWxdOworCQkJbnVtX2ludHMrKzsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgInJlZ2lzdGVyZWQgSVJRICVzICVkXG4iLAorCQkJCXFzcGlfaXJxX3RhYlt2YWxdLmlycV9uYW1lLAorCQkJCWlycSk7CisJCX0KKwl9CisKKwlpZiAoIW51bV9pbnRzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIElSUXMgcmVnaXN0ZXJlZCwgY2Fubm90IGluaXQgZHJpdmVyXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBxc3BpX3Byb2JlX2VycjsKKwl9CisKKwkvKgorCSAqIFNvbWUgU29DcyBpbnRlZ3JhdGUgc3BpIGNvbnRyb2xsZXIgKGUuZy4sIGl0cyBpbnRlcnJ1cHQgYml0cykKKwkgKiBpbiBzcGVjaWZpYyB3YXlzCisJICovCisJaWYgKHNvY19pbnRjKSB7CisJCXFzcGktPnNvY19pbnRjID0gc29jX2ludGM7CisJCXNvY19pbnRjLT5iY21fcXNwaV9pbnRfc2V0KHNvY19pbnRjLCBNU1BJX0RPTkUsIHRydWUpOworCX0gZWxzZSB7CisJCXFzcGktPnNvY19pbnRjID0gTlVMTDsKKwl9CisKKwlxc3BpLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUihxc3BpLT5jbGspKSB7CisJCWRldl93YXJuKGRldiwgInVuYWJsZSB0byBnZXQgY2xvY2tcbiIpOworCQlyZXQgPSBQVFJfRVJSKHFzcGktPmNsayk7CisJCWdvdG8gcXNwaV9wcm9iZV9lcnI7CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHFzcGktPmNsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBwcmVwYXJlIGNsb2NrXG4iKTsKKwkJZ290byBxc3BpX3Byb2JlX2VycjsKKwl9CisKKwlxc3BpLT5iYXNlX2NsayA9IGNsa19nZXRfcmF0ZShxc3BpLT5jbGspOworCXFzcGktPm1heF9zcGVlZF9oeiA9IHFzcGktPmJhc2VfY2xrIC8gKFFTUElfU1BCUl9NSU4gKiAyKTsKKworCWJjbV9xc3BpX2h3X2luaXQocXNwaSk7CisJaW5pdF9jb21wbGV0aW9uKCZxc3BpLT5tc3BpX2RvbmUpOworCWluaXRfY29tcGxldGlvbigmcXNwaS0+YnNwaV9kb25lKTsKKwlxc3BpLT5jdXJyX2NzID0gLTE7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBxc3BpKTsKKworCXFzcGktPnhmZXJfbW9kZS53aWR0aCA9IC0xOworCXFzcGktPnhmZXJfbW9kZS5hZGRybGVuID0gLTE7CisJcXNwaS0+eGZlcl9tb2RlLmhwID0gLTE7CisKKwlyZXQgPSBkZXZtX3NwaV9yZWdpc3Rlcl9tYXN0ZXIoJnBkZXYtPmRldiwgbWFzdGVyKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNhbid0IHJlZ2lzdGVyIG1hc3RlclxuIik7CisJCWdvdG8gcXNwaV9yZWdfZXJyOworCX0KKworCXJldHVybiAwOworCitxc3BpX3JlZ19lcnI6CisJYmNtX3FzcGlfaHdfdW5pbml0KHFzcGkpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShxc3BpLT5jbGspOworcXNwaV9wcm9iZV9lcnI6CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKwlrZnJlZShxc3BpLT5kZXZfaWRzKTsKKwlyZXR1cm4gcmV0OworfQorLyogcHJvYmUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IFNvQyBzcGVjaWZpYyBwbGF0Zm9ybSBkcml2ZXIgcHJvYmUgKi8KK0VYUE9SVF9TWU1CT0xfR1BMKGJjbV9xc3BpX3Byb2JlKTsKKworaW50IGJjbV9xc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBiY21fcXNwaSAqcXNwaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJYmNtX3FzcGlfaHdfdW5pbml0KHFzcGkpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShxc3BpLT5jbGspOworCWtmcmVlKHFzcGktPmRldl9pZHMpOworCXNwaV91bnJlZ2lzdGVyX21hc3Rlcihxc3BpLT5tYXN0ZXIpOworCisJcmV0dXJuIDA7Cit9CisvKiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYnkgU29DIHNwZWNpZmljIHBsYXRmb3JtIGRyaXZlciByZW1vdmUoKSAqLworRVhQT1JUX1NZTUJPTF9HUEwoYmNtX3FzcGlfcmVtb3ZlKTsKKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBiY21fcXNwaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmNtX3FzcGkgKnFzcGkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXNwaV9tYXN0ZXJfc3VzcGVuZChxc3BpLT5tYXN0ZXIpOworCWNsa19kaXNhYmxlKHFzcGktPmNsayk7CisJYmNtX3FzcGlfaHdfdW5pbml0KHFzcGkpOworCisJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIGJjbV9xc3BpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJjbV9xc3BpICpxc3BpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCA9IDA7CisKKwliY21fcXNwaV9od19pbml0KHFzcGkpOworCWJjbV9xc3BpX2NoaXBfc2VsZWN0KHFzcGksIHFzcGktPmN1cnJfY3MpOworCWlmIChxc3BpLT5zb2NfaW50YykKKwkJLyogZW5hYmxlIE1TUEkgaW50ZXJydXB0ICovCisJCXFzcGktPnNvY19pbnRjLT5iY21fcXNwaV9pbnRfc2V0KHFzcGktPnNvY19pbnRjLCBNU1BJX0RPTkUsCisJCQkJCQkgdHJ1ZSk7CisKKwlyZXQgPSBjbGtfZW5hYmxlKHFzcGktPmNsayk7CisJaWYgKCFyZXQpCisJCXNwaV9tYXN0ZXJfcmVzdW1lKHFzcGktPm1hc3Rlcik7CisKKwlyZXR1cm4gcmV0OworfQorCitTSU1QTEVfREVWX1BNX09QUyhiY21fcXNwaV9wbV9vcHMsIGJjbV9xc3BpX3N1c3BlbmQsIGJjbV9xc3BpX3Jlc3VtZSk7CisKKy8qIHBtX29wcyB0byBiZSBjYWxsZWQgYnkgU29DIHNwZWNpZmljIHBsYXRmb3JtIGRyaXZlciAqLworRVhQT1JUX1NZTUJPTF9HUEwoYmNtX3FzcGlfcG1fb3BzKTsKKworTU9EVUxFX0FVVEhPUigiS2FtYWwgRGFzdSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9hZGNvbSBRU1BJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSSVZFUl9OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1iY20tcXNwaS5oIGIvZHJpdmVycy9zcGkvc3BpLWJjbS1xc3BpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiZmM3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1iY20tcXNwaS5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgQnJvYWRjb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gKHRoZSAiR1BMIikuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIChHUEx2MikgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIChHUEx2MikgYWxvbmcgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgorICovCisKKyNpZm5kZWYgX19TUElfQkNNX1FTUElfSF9fCisjZGVmaW5lIF9fU1BJX0JDTV9RU1BJX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisvKiBCU1BJIGludGVycnVwdCBtYXNrcyAqLworI2RlZmluZSBJTlRSX0JTUElfTFJfT1ZFUlJFQURfTUFTSwkJQklUKDQpCisjZGVmaW5lIElOVFJfQlNQSV9MUl9TRVNTSU9OX0RPTkVfTUFTSwkJQklUKDMpCisjZGVmaW5lIElOVFJfQlNQSV9MUl9JTVBBVElFTlRfTUFTSwkJQklUKDIpCisjZGVmaW5lIElOVFJfQlNQSV9MUl9TRVNTSU9OX0FCT1JURURfTUFTSwlCSVQoMSkKKyNkZWZpbmUgSU5UUl9CU1BJX0xSX0ZVTExORVNTX1JFQUNIRURfTUFTSwlCSVQoMCkKKworI2RlZmluZSBCU1BJX0xSX0lOVEVSUlVQVFNfREFUQQkJICAgICAgIFwKKwkoSU5UUl9CU1BJX0xSX1NFU1NJT05fRE9ORV9NQVNLIHwJICAgICAgIFwKKwkgSU5UUl9CU1BJX0xSX0ZVTExORVNTX1JFQUNIRURfTUFTSykKKworI2RlZmluZSBCU1BJX0xSX0lOVEVSUlVQVFNfRVJST1IgICAgICAgICAgICAgICBcCisJKElOVFJfQlNQSV9MUl9PVkVSUkVBRF9NQVNLIHwJICAgICAgIFwKKwkgSU5UUl9CU1BJX0xSX0lNUEFUSUVOVF9NQVNLIHwJICAgICAgIFwKKwkgSU5UUl9CU1BJX0xSX1NFU1NJT05fQUJPUlRFRF9NQVNLKQorCisjZGVmaW5lIEJTUElfTFJfSU5URVJSVVBUU19BTEwgICAgICAgICAgICAgICAgIFwKKwkoQlNQSV9MUl9JTlRFUlJVUFRTX0VSUk9SIHwJICAgICAgIFwKKwkgQlNQSV9MUl9JTlRFUlJVUFRTX0RBVEEpCisKKy8qIE1TUEkgSW50ZXJydXB0IG1hc2tzICovCisjZGVmaW5lIElOVFJfTVNQSV9IQUxURURfTUFTSwkJCUJJVCg2KQorI2RlZmluZSBJTlRSX01TUElfRE9ORV9NQVNLCQkJQklUKDUpCisKKyNkZWZpbmUgTVNQSV9JTlRFUlJVUFRTX0FMTAkJICAgICAgIFwKKwkoSU5UUl9NU1BJX0RPTkVfTUFTSyB8CQkgICAgICAgXAorCSBJTlRSX01TUElfSEFMVEVEX01BU0spCisKKyNkZWZpbmUgUVNQSV9JTlRFUlJVUFRTX0FMTCAgICAgICAgICAgICAgICAgICAgXAorCShNU1BJX0lOVEVSUlVQVFNfQUxMIHwJCSAgICAgICBcCisJIEJTUElfTFJfSU5URVJSVVBUU19BTEwpCisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2U7CitzdHJ1Y3QgZGV2X3BtX29wczsKKworZW51bSB7CisJTVNQSV9ET05FID0gMHgxLAorCUJTUElfRE9ORSA9IDB4MiwKKwlCU1BJX0VSUiA9IDB4NCwKKwlNU1BJX0JTUElfRE9ORSA9IDB4NworfTsKKworc3RydWN0IGJjbV9xc3BpX3NvY19pbnRjIHsKKwl2b2lkICgqYmNtX3FzcGlfaW50X2Fjaykoc3RydWN0IGJjbV9xc3BpX3NvY19pbnRjICpzb2NfaW50YywgaW50IHR5cGUpOworCXZvaWQgKCpiY21fcXNwaV9pbnRfc2V0KShzdHJ1Y3QgYmNtX3FzcGlfc29jX2ludGMgKnNvY19pbnRjLCBpbnQgdHlwZSwKKwkJCQkgYm9vbCBlbik7CisJdTMyICgqYmNtX3FzcGlfZ2V0X2ludF9zdGF0dXMpKHN0cnVjdCBiY21fcXNwaV9zb2NfaW50YyAqc29jX2ludGMpOworfTsKKworLyogUmVhZCBjb250cm9sbGVyIHJlZ2lzdGVyKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGJjbV9xc3BpX3JlYWRsKGJvb2wgYmUsIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlpZiAoYmUpCisJCXJldHVybiBpb3JlYWQzMmJlKGFkZHIpOworCWVsc2UKKwkJcmV0dXJuIHJlYWRsX3JlbGF4ZWQoYWRkcik7Cit9CisKKy8qIFdyaXRlIGNvbnRyb2xsZXIgcmVnaXN0ZXIqLworc3RhdGljIGlubGluZSB2b2lkIGJjbV9xc3BpX3dyaXRlbChib29sIGJlLAorCQkJCSAgIHVuc2lnbmVkIGludCBkYXRhLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaWYgKGJlKQorCQlpb3dyaXRlMzJiZShkYXRhLCBhZGRyKTsKKwllbHNlCisJCXdyaXRlbF9yZWxheGVkKGRhdGEsIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBnZXRfcXNwaV9tYXNrKGludCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTVNQSV9ET05FOgorCQlyZXR1cm4gSU5UUl9NU1BJX0RPTkVfTUFTSzsKKwljYXNlIEJTUElfRE9ORToKKwkJcmV0dXJuIEJTUElfTFJfSU5URVJSVVBUU19BTEw7CisJY2FzZSBNU1BJX0JTUElfRE9ORToKKwkJcmV0dXJuIFFTUElfSU5URVJSVVBUU19BTEw7CisJY2FzZSBCU1BJX0VSUjoKKwkJcmV0dXJuIEJTUElfTFJfSU5URVJSVVBUU19FUlJPUjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGNvbW1vbiBkcml2ZXIgZnVuY3Rpb25zIHRvIGJlIGNhbGxlZCBieSB0aGUgU29DIHBsYXRmb3JtIGRyaXZlciAqLworaW50IGJjbV9xc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCSAgIHN0cnVjdCBiY21fcXNwaV9zb2NfaW50YyAqc29jX2ludGMpOworaW50IGJjbV9xc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKworLyogcG1fb3BzIHVzZWQgYnkgdGhlIFNvQyBwbGF0Zm9ybSBkcml2ZXIgY2FsbGVkIG9uIFBNIHN1c3BlbmQvcmVzdW1lICovCitleHRlcm4gY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgYmNtX3FzcGlfcG1fb3BzOworCisjZW5kaWYgLyogX19TUElfQkNNX1FTUElfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYnJjbXN0Yi1xc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktYnJjbXN0Yi1xc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjkyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1icmNtc3RiLXFzcGkuYwpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgQnJvYWRjb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gKHRoZSAiR1BMIikuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIChHUEx2MikgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIChHUEx2MikgYWxvbmcgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgInNwaS1iY20tcXNwaS5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBicmNtc3RiX3FzcGlfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImJyY20sc3BpLWJyY21zdGItcXNwaSIgfSwKKwl7IC5jb21wYXRpYmxlID0gImJyY20sc3BpLWJyY21zdGItbXNwaSIgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBicmNtc3RiX3FzcGlfb2ZfbWF0Y2gpOworCitzdGF0aWMgaW50IGJyY21zdGJfcXNwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBiY21fcXNwaV9wcm9iZShwZGV2LCBOVUxMKTsKK30KKworc3RhdGljIGludCBicmNtc3RiX3FzcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIGJjbV9xc3BpX3JlbW92ZShwZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYnJjbXN0Yl9xc3BpX2RyaXZlciA9IHsKKwkucHJvYmUJCQk9IGJyY21zdGJfcXNwaV9wcm9iZSwKKwkucmVtb3ZlCQkJPSBicmNtc3RiX3FzcGlfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9ICJicmNtc3RiX3FzcGkiLAorCQkucG0JCT0gJmJjbV9xc3BpX3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gYnJjbXN0Yl9xc3BpX29mX21hdGNoLAorCX0KK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGJyY21zdGJfcXNwaV9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKCJLYW1hbCBEYXN1Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJyb2FkY29tIFNQSSBkcml2ZXIgZm9yIHNldHRvcCBTb0MiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1jYXZpdW0tdGh1bmRlcnguYyBiL2RyaXZlcnMvc3BpL3NwaS1jYXZpdW0tdGh1bmRlcnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzc5Mzc3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpLWNhdml1bS10aHVuZGVyeC5jCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ2F2aXVtIFRodW5kZXJYIFNQSSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IENhdml1bSBJbmMuCisgKiBBdXRob3JzOiBKYW4gR2xhdWJlciA8amdsYXViZXJAY2F2aXVtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjaW5jbHVkZSAic3BpLWNhdml1bS5oIgorCisjZGVmaW5lIERSVl9OQU1FICJzcGktdGh1bmRlcngiCisKKyNkZWZpbmUgU1lTX0ZSRVFfREVGQVVMVCA3MDAwMDAwMDAgLyogNzAwIE1oeiAqLworCitzdGF0aWMgaW50IHRodW5kZXJ4X3NwaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCBvY3Rlb25fc3BpICpwOworCWludCByZXQ7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKGRldiwgc2l6ZW9mKHN0cnVjdCBvY3Rlb25fc3BpKSk7CisJaWYgKCFtYXN0ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJcCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCXJldCA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXAtPnJlZ2lzdGVyX2Jhc2UgPSBwY2ltX2lvbWFwKHBkZXYsIDAsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCWlmICghcC0+cmVnaXN0ZXJfYmFzZSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCXAtPnJlZ3MuY29uZmlnID0gMHgxMDAwOworCXAtPnJlZ3Muc3RhdHVzID0gMHgxMDA4OworCXAtPnJlZ3MudHggPSAweDEwMTA7CisJcC0+cmVncy5kYXRhID0gMHgxMDgwOworCisJcC0+Y2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgTlVMTCk7CisJaWYgKElTX0VSUihwLT5jbGspKSB7CisJCXJldCA9IFBUUl9FUlIocC0+Y2xrKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocC0+Y2xrKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcC0+c3lzX2ZyZXEgPSBjbGtfZ2V0X3JhdGUocC0+Y2xrKTsKKwlpZiAoIXAtPnN5c19mcmVxKQorCQlwLT5zeXNfZnJlcSA9IFNZU19GUkVRX0RFRkFVTFQ7CisJZGV2X2luZm8oZGV2LCAiU2V0IHN5c3RlbSBjbG9jayB0byAldVxuIiwgcC0+c3lzX2ZyZXEpOworCisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IDQ7CisJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BIQSB8IFNQSV9DUE9MIHwgU1BJX0NTX0hJR0ggfAorCQkJICAgIFNQSV9MU0JfRklSU1QgfCBTUElfM1dJUkU7CisJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IG9jdGVvbl9zcGlfdHJhbnNmZXJfb25lX21lc3NhZ2U7CisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soOCk7CisJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSBPQ1RFT05fU1BJX01BWF9DTE9DS19IWjsKKwltYXN0ZXItPmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKKworCXJldCA9IGRldm1fc3BpX3JlZ2lzdGVyX21hc3RlcihkZXYsIG1hc3Rlcik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAwOworCitlcnJvcjoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocC0+Y2xrKTsKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRodW5kZXJ4X3NwaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgb2N0ZW9uX3NwaSAqcDsKKworCXAgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJaWYgKCFwKQorCQlyZXR1cm47CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocC0+Y2xrKTsKKwkvKiBQdXQgZXZlcnl0aGluZyBpbiBhIGtub3duIHN0YXRlLiAqLworCXdyaXRlcSgwLCBwLT5yZWdpc3Rlcl9iYXNlICsgT0NURU9OX1NQSV9DRkcocCkpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgdGh1bmRlcnhfc3BpX3BjaV9pZF90YWJsZVtdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0NBVklVTSwgMHhhMDBiKSB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHRodW5kZXJ4X3NwaV9wY2lfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdGh1bmRlcnhfc3BpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJPSB0aHVuZGVyeF9zcGlfcGNpX2lkX3RhYmxlLAorCS5wcm9iZQkJPSB0aHVuZGVyeF9zcGlfcHJvYmUsCisJLnJlbW92ZQkJPSB0aHVuZGVyeF9zcGlfcmVtb3ZlLAorfTsKKworbW9kdWxlX3BjaV9kcml2ZXIodGh1bmRlcnhfc3BpX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQ2F2aXVtLCBJbmMuIFRodW5kZXJYIFNQSSBidXMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJKYW4gR2xhdWJlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWNhdml1bS5oIGIvZHJpdmVycy9zcGkvc3BpLWNhdml1bS5oCmluZGV4IDg4YzVmMzYuLjFmOTFkNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1jYXZpdW0uaAorKysgYi9kcml2ZXJzL3NwaS9zcGktY2F2aXVtLmgKQEAgLTEsNiArMSw4IEBACiAjaWZuZGVmIF9fU1BJX0NBVklVTV9ICiAjZGVmaW5lIF9fU1BJX0NBVklVTV9ICiAKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKwogI2RlZmluZSBPQ1RFT05fU1BJX01BWF9CWVRFUyA5CiAjZGVmaW5lIE9DVEVPTl9TUElfTUFYX0NMT0NLX0haIDE2MDAwMDAwCiAKQEAgLTE3LDYgKzE5LDcgQEAKIAl1NjQgY3NfZW5heDsKIAlpbnQgc3lzX2ZyZXE7CiAJc3RydWN0IG9jdGVvbl9zcGlfcmVncyByZWdzOworCXN0cnVjdCBjbGsgKmNsazsKIH07CiAKICNkZWZpbmUgT0NURU9OX1NQSV9DRkcoeCkJKHgtPnJlZ3MuY29uZmlnKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWR3LmMgYi9kcml2ZXJzL3NwaS9zcGktZHcuYwppbmRleCBjMDliYjc0Li4yNzk2MGU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZHcuYworKysgYi9kcml2ZXJzL3NwaS9zcGktZHcuYwpAQCAtMjgzLDcgKzI4Myw2IEBACiAJc3RydWN0IGNoaXBfZGF0YSAqY2hpcCA9IHNwaV9nZXRfY3RsZGF0YShzcGkpOwogCXU4IGltYXNrID0gMDsKIAl1MTYgdHhsZXZlbCA9IDA7Ci0JdTE2IGNsa19kaXY7CiAJdTMyIGNyMDsKIAlpbnQgcmV0OwogCkBAIC0yOTgsMTMgKzI5NywxMyBAQAogCXNwaV9lbmFibGVfY2hpcChkd3MsIDApOwogCiAJLyogSGFuZGxlIHBlciB0cmFuc2ZlciBvcHRpb25zIGZvciBicHcgYW5kIHNwZWVkICovCi0JaWYgKHRyYW5zZmVyLT5zcGVlZF9oeiAhPSBjaGlwLT5zcGVlZF9oeikgewotCQkvKiBjbGtfZGl2IGRvZXNuJ3Qgc3VwcG9ydCBvZGQgbnVtYmVyICovCi0JCWNsa19kaXYgPSAoZHdzLT5tYXhfZnJlcSAvIHRyYW5zZmVyLT5zcGVlZF9oeiArIDEpICYgMHhmZmZlOwotCi0JCWNoaXAtPnNwZWVkX2h6ID0gdHJhbnNmZXItPnNwZWVkX2h6OwotCQljaGlwLT5jbGtfZGl2ID0gY2xrX2RpdjsKLQorCWlmICh0cmFuc2Zlci0+c3BlZWRfaHogIT0gZHdzLT5jdXJyZW50X2ZyZXEpIHsKKwkJaWYgKHRyYW5zZmVyLT5zcGVlZF9oeiAhPSBjaGlwLT5zcGVlZF9oeikgeworCQkJLyogY2xrX2RpdiBkb2Vzbid0IHN1cHBvcnQgb2RkIG51bWJlciAqLworCQkJY2hpcC0+Y2xrX2RpdiA9IChESVZfUk9VTkRfVVAoZHdzLT5tYXhfZnJlcSwgdHJhbnNmZXItPnNwZWVkX2h6KSArIDEpICYgMHhmZmZlOworCQkJY2hpcC0+c3BlZWRfaHogPSB0cmFuc2Zlci0+c3BlZWRfaHo7CisJCX0KKwkJZHdzLT5jdXJyZW50X2ZyZXEgPSB0cmFuc2Zlci0+c3BlZWRfaHo7CiAJCXNwaV9zZXRfY2xrKGR3cywgY2hpcC0+Y2xrX2Rpdik7CiAJfQogCWlmICh0cmFuc2Zlci0+Yml0c19wZXJfd29yZCA9PSA4KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZHcuaCBiL2RyaXZlcnMvc3BpL3NwaS1kdy5oCmluZGV4IDYxYmMzY2IuLmMyMWNhMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1kdy5oCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1kdy5oCkBAIC0xMjMsNiArMTIzLDcgQEAKIAl1OAkJCW5fYnl0ZXM7CS8qIGN1cnJlbnQgaXMgYSAxLzIgYnl0ZXMgb3AgKi8KIAl1MzIJCQlkbWFfd2lkdGg7CiAJaXJxcmV0dXJuX3QJCSgqdHJhbnNmZXJfaGFuZGxlcikoc3RydWN0IGR3X3NwaSAqZHdzKTsKKwl1MzIJCQljdXJyZW50X2ZyZXE7CS8qIGZyZXF1ZW5jeSBpbiBoeiAqLwogCiAJLyogRE1BIGluZm8gKi8KIAlpbnQJCQlkbWFfaW5pdGVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWZzbC1kc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWRzcGkuYwppbmRleCA5ZTlkYWRiLi4zNWMwZGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZnNsLWRzcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWRzcGkuYwpAQCAtMTU5LDcgKzE1OSw3IEBACiAJdTgJCQljczsKIAl1MTYJCQl2b2lkX3dyaXRlX2RhdGE7CiAJdTMyCQkJY3NfY2hhbmdlOwotCXN0cnVjdCBmc2xfZHNwaV9kZXZ0eXBlX2RhdGEgKmRldnR5cGVfZGF0YTsKKwljb25zdCBzdHJ1Y3QgZnNsX2RzcGlfZGV2dHlwZV9kYXRhICpkZXZ0eXBlX2RhdGE7CiAKIAl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0cTsKIAl1MzIJCQl3YWl0ZmxhZ3M7CkBAIC02MjQsMTAgKzYyNCwxMyBAQAogewogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgZnNsX2RzcGkgKmRzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJaW50IHJldDsKIAogCXBpbmN0cmxfcG1fc2VsZWN0X2RlZmF1bHRfc3RhdGUoZGV2KTsKIAotCWNsa19wcmVwYXJlX2VuYWJsZShkc3BpLT5jbGspOworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkc3BpLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAJc3BpX21hc3Rlcl9yZXN1bWUobWFzdGVyKTsKIAogCXJldHVybiAwOwpAQCAtNjUxLDggKzY1NCw2IEBACiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCWludCByZXQgPSAwLCBjc19udW0sIGJ1c19udW07Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQgPQotCQkJb2ZfbWF0Y2hfZGV2aWNlKGZzbF9kc3BpX2R0X2lkcywgJnBkZXYtPmRldik7CiAKIAltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgZnNsX2RzcGkpKTsKIAlpZiAoIW1hc3RlcikKQEAgLTY4Niw3ICs2ODcsNyBAQAogCX0KIAltYXN0ZXItPmJ1c19udW0gPSBidXNfbnVtOwogCi0JZHNwaS0+ZGV2dHlwZV9kYXRhID0gKHN0cnVjdCBmc2xfZHNwaV9kZXZ0eXBlX2RhdGEgKilvZl9pZC0+ZGF0YTsKKwlkc3BpLT5kZXZ0eXBlX2RhdGEgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoJnBkZXYtPmRldik7CiAJaWYgKCFkc3BpLT5kZXZ0eXBlX2RhdGEpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGRldnR5cGVfZGF0YVxuIik7CiAJCXJldCA9IC1FRkFVTFQ7CkBAIC03MjgsNyArNzI5LDkgQEAKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCBjbG9ja1xuIik7CiAJCWdvdG8gb3V0X21hc3Rlcl9wdXQ7CiAJfQotCWNsa19wcmVwYXJlX2VuYWJsZShkc3BpLT5jbGspOworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkc3BpLT5jbGspOworCWlmIChyZXQpCisJCWdvdG8gb3V0X21hc3Rlcl9wdXQ7CiAKIAltYXN0ZXItPm1heF9zcGVlZF9oeiA9CiAJCWNsa19nZXRfcmF0ZShkc3BpLT5jbGspIC8gZHNwaS0+ZGV2dHlwZV9kYXRhLT5tYXhfY2xvY2tfZmFjdG9yOwpAQCAtNzYwLDcgKzc2Myw2IEBACiAJLyogRGlzY29ubmVjdCBmcm9tIHRoZSBTUEkgZnJhbWV3b3JrICovCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRzcGktPmNsayk7CiAJc3BpX3VucmVnaXN0ZXJfbWFzdGVyKGRzcGktPm1hc3Rlcik7Ci0Jc3BpX21hc3Rlcl9wdXQoZHNwaS0+bWFzdGVyKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWZzbC1lc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWVzcGkuYwppbmRleCA4ZDg1YTNjLi43NDUxNTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZnNsLWVzcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWVzcGkuYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgpAQCAtMjcsNDAgKzI2LDI5IEBACiAjaW5jbHVkZSAic3BpLWZzbC1saWIuaCIKIAogLyogZVNQSSBDb250cm9sbGVyIHJlZ2lzdGVycyAqLwotc3RydWN0IGZzbF9lc3BpX3JlZyB7Ci0JX19iZTMyIG1vZGU7CQkvKiAweDAwMCAtIGVTUEkgbW9kZSByZWdpc3RlciAqLwotCV9fYmUzMiBldmVudDsJCS8qIDB4MDA0IC0gZVNQSSBldmVudCByZWdpc3RlciAqLwotCV9fYmUzMiBtYXNrOwkJLyogMHgwMDggLSBlU1BJIG1hc2sgcmVnaXN0ZXIgKi8KLQlfX2JlMzIgY29tbWFuZDsJCS8qIDB4MDBjIC0gZVNQSSBjb21tYW5kIHJlZ2lzdGVyICovCi0JX19iZTMyIHRyYW5zbWl0OwkvKiAweDAxMCAtIGVTUEkgdHJhbnNtaXQgRklGTyBhY2Nlc3MgcmVnaXN0ZXIqLwotCV9fYmUzMiByZWNlaXZlOwkJLyogMHgwMTQgLSBlU1BJIHJlY2VpdmUgRklGTyBhY2Nlc3MgcmVnaXN0ZXIqLwotCXU4IHJlc1s4XTsJCS8qIDB4MDE4IC0gMHgwMWMgcmVzZXJ2ZWQgKi8KLQlfX2JlMzIgY3Ntb2RlWzRdOwkvKiAweDAyMCAtIDB4MDJjIGVTUEkgY3MgbW9kZSByZWdpc3RlciAqLwotfTsKKyNkZWZpbmUgRVNQSV9TUE1PREUJMHgwMAkvKiBlU1BJIG1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVNQSV9TUElFCTB4MDQJLyogZVNQSSBldmVudCByZWdpc3RlciAqLworI2RlZmluZSBFU1BJX1NQSU0JMHgwOAkvKiBlU1BJIG1hc2sgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVNQSV9TUENPTQkweDBjCS8qIGVTUEkgY29tbWFuZCByZWdpc3RlciAqLworI2RlZmluZSBFU1BJX1NQSVRGCTB4MTAJLyogZVNQSSB0cmFuc21pdCBGSUZPIGFjY2VzcyByZWdpc3RlciovCisjZGVmaW5lIEVTUElfU1BJUkYJMHgxNAkvKiBlU1BJIHJlY2VpdmUgRklGTyBhY2Nlc3MgcmVnaXN0ZXIqLworI2RlZmluZSBFU1BJX1NQTU9ERTAJMHgyMAkvKiBlU1BJIGNzMCBtb2RlIHJlZ2lzdGVyICovCiAKLXN0cnVjdCBmc2xfZXNwaV90cmFuc2ZlciB7Ci0JY29uc3Qgdm9pZCAqdHhfYnVmOwotCXZvaWQgKnJ4X2J1ZjsKLQl1bnNpZ25lZCBsZW47Ci0JdW5zaWduZWQgbl90eDsKLQl1bnNpZ25lZCBuX3J4OwotCXVuc2lnbmVkIGFjdHVhbF9sZW5ndGg7Ci0JaW50IHN0YXR1czsKLX07CisjZGVmaW5lIEVTUElfU1BNT0RFeCh4KQkoRVNQSV9TUE1PREUwICsgKHgpICogNCkKIAogLyogZVNQSSBDb250cm9sbGVyIG1vZGUgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgU1BNT0RFX0VOQUJMRQkJKDEgPDwgMzEpCi0jZGVmaW5lIFNQTU9ERV9MT09QCQkoMSA8PCAzMCkKKyNkZWZpbmUgU1BNT0RFX0VOQUJMRQkJQklUKDMxKQorI2RlZmluZSBTUE1PREVfTE9PUAkJQklUKDMwKQogI2RlZmluZSBTUE1PREVfVFhUSFIoeCkJCSgoeCkgPDwgOCkKICNkZWZpbmUgU1BNT0RFX1JYVEhSKHgpCQkoKHgpIDw8IDApCiAKIC8qIGVTUEkgQ29udHJvbGxlciBDUyBtb2RlIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCi0jZGVmaW5lIENTTU9ERV9DSV9JTkFDVElWRUhJR0gJKDEgPDwgMzEpCi0jZGVmaW5lIENTTU9ERV9DUF9CRUdJTl9FREdFQ0xLCSgxIDw8IDMwKQotI2RlZmluZSBDU01PREVfUkVWCQkoMSA8PCAyOSkKLSNkZWZpbmUgQ1NNT0RFX0RJVjE2CQkoMSA8PCAyOCkKKyNkZWZpbmUgQ1NNT0RFX0NJX0lOQUNUSVZFSElHSAlCSVQoMzEpCisjZGVmaW5lIENTTU9ERV9DUF9CRUdJTl9FREdFQ0xLCUJJVCgzMCkKKyNkZWZpbmUgQ1NNT0RFX1JFVgkJQklUKDI5KQorI2RlZmluZSBDU01PREVfRElWMTYJCUJJVCgyOCkKICNkZWZpbmUgQ1NNT0RFX1BNKHgpCQkoKHgpIDw8IDI0KQotI2RlZmluZSBDU01PREVfUE9MXzEJCSgxIDw8IDIwKQorI2RlZmluZSBDU01PREVfUE9MXzEJCUJJVCgyMCkKICNkZWZpbmUgQ1NNT0RFX0xFTih4KQkJKCh4KSA8PCAxNikKICNkZWZpbmUgQ1NNT0RFX0JFRih4KQkJKCh4KSA8PCAxMikKICNkZWZpbmUgQ1NNT0RFX0FGVCh4KQkJKCh4KSA8PCA4KQpAQCAtNzIsMjkgKzYwLDExNCBAQAogCQl8IENTTU9ERV9BRlQoMCkgfCBDU01PREVfQ0coMSkpCiAKIC8qIFNQSUUgcmVnaXN0ZXIgdmFsdWVzICovCi0jZGVmaW5lCVNQSUVfTkUJCTB4MDAwMDAyMDAJLyogTm90IGVtcHR5ICovCi0jZGVmaW5lCVNQSUVfTkYJCTB4MDAwMDAxMDAJLyogTm90IGZ1bGwgKi8KLQotLyogU1BJTSByZWdpc3RlciB2YWx1ZXMgKi8KLSNkZWZpbmUJU1BJTV9ORQkJMHgwMDAwMDIwMAkvKiBOb3QgZW1wdHkgKi8KLSNkZWZpbmUJU1BJTV9ORgkJMHgwMDAwMDEwMAkvKiBOb3QgZnVsbCAqLwogI2RlZmluZSBTUElFX1JYQ05UKHJlZykgICAgICgocmVnID4+IDI0KSAmIDB4M0YpCiAjZGVmaW5lIFNQSUVfVFhDTlQocmVnKSAgICAgKChyZWcgPj4gMTYpICYgMHgzRikKKyNkZWZpbmUJU1BJRV9UWEUJCUJJVCgxNSkJLyogVFggRklGTyBlbXB0eSAqLworI2RlZmluZQlTUElFX0RPTgkJQklUKDE0KQkvKiBUWCBkb25lICovCisjZGVmaW5lCVNQSUVfUlhUCQlCSVQoMTMpCS8qIFJYIEZJRk8gdGhyZXNob2xkICovCisjZGVmaW5lCVNQSUVfUlhGCQlCSVQoMTIpCS8qIFJYIEZJRk8gZnVsbCAqLworI2RlZmluZQlTUElFX1RYVAkJQklUKDExKQkvKiBUWCBGSUZPIHRocmVzaG9sZCovCisjZGVmaW5lCVNQSUVfUk5FCQlCSVQoOSkJLyogUlggRklGTyBub3QgZW1wdHkgKi8KKyNkZWZpbmUJU1BJRV9UTkYJCUJJVCg4KQkvKiBUWCBGSUZPIG5vdCBmdWxsICovCisKKy8qIFNQSU0gcmVnaXN0ZXIgdmFsdWVzICovCisjZGVmaW5lCVNQSU1fVFhFCQlCSVQoMTUpCS8qIFRYIEZJRk8gZW1wdHkgKi8KKyNkZWZpbmUJU1BJTV9ET04JCUJJVCgxNCkJLyogVFggZG9uZSAqLworI2RlZmluZQlTUElNX1JYVAkJQklUKDEzKQkvKiBSWCBGSUZPIHRocmVzaG9sZCAqLworI2RlZmluZQlTUElNX1JYRgkJQklUKDEyKQkvKiBSWCBGSUZPIGZ1bGwgKi8KKyNkZWZpbmUJU1BJTV9UWFQJCUJJVCgxMSkJLyogVFggRklGTyB0aHJlc2hvbGQqLworI2RlZmluZQlTUElNX1JORQkJQklUKDkpCS8qIFJYIEZJRk8gbm90IGVtcHR5ICovCisjZGVmaW5lCVNQSU1fVE5GCQlCSVQoOCkJLyogVFggRklGTyBub3QgZnVsbCAqLwogCiAvKiBTUENPTSByZWdpc3RlciB2YWx1ZXMgKi8KICNkZWZpbmUgU1BDT01fQ1MoeCkJCSgoeCkgPDwgMzApCisjZGVmaW5lIFNQQ09NX0RPCQlCSVQoMjgpIC8qIER1YWwgb3V0cHV0ICovCisjZGVmaW5lIFNQQ09NX1RPCQlCSVQoMjcpIC8qIFRYIG9ubHkgKi8KKyNkZWZpbmUgU1BDT01fUlhTS0lQKHgpCQkoKHgpIDw8IDE2KQogI2RlZmluZSBTUENPTV9UUkFOTEVOKHgpCSgoeCkgPDwgMCkKKwogI2RlZmluZQlTUENPTV9UUkFOTEVOX01BWAkweDEwMDAwCS8qIE1heCB0cmFuc2FjdGlvbiBsZW5ndGggKi8KIAogI2RlZmluZSBBVVRPU1VTUEVORF9USU1FT1VUIDIwMDAKIAorc3RhdGljIGlubGluZSB1MzIgZnNsX2VzcGlfcmVhZF9yZWcoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiBpb3JlYWQzMmJlKG1zcGktPnJlZ19iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB1OCBmc2xfZXNwaV9yZWFkX3JlZzgoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiBpb3JlYWQ4KG1zcGktPnJlZ19iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZzbF9lc3BpX3dyaXRlX3JlZyhzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1zcGksIGludCBvZmZzZXQsCisJCQkJICAgICAgdTMyIHZhbCkKK3sKKwlpb3dyaXRlMzJiZSh2YWwsIG1zcGktPnJlZ19iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZzbF9lc3BpX3dyaXRlX3JlZzgoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpLCBpbnQgb2Zmc2V0LAorCQkJCSAgICAgICB1OCB2YWwpCit7CisJaW93cml0ZTgodmFsLCBtc3BpLT5yZWdfYmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9lc3BpX2NvcHlfdG9fYnVmKHN0cnVjdCBzcGlfbWVzc2FnZSAqbSwKKwkJCQkgc3RydWN0IG1wYzh4eHhfc3BpICptc3BpKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7CisJdTggKmJ1ZiA9IG1zcGktPmxvY2FsX2J1ZjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQlpZiAodC0+dHhfYnVmKQorCQkJbWVtY3B5KGJ1ZiwgdC0+dHhfYnVmLCB0LT5sZW4pOworCQllbHNlCisJCQltZW1zZXQoYnVmLCAwLCB0LT5sZW4pOworCQlidWYgKz0gdC0+bGVuOworCX0KK30KKworc3RhdGljIHZvaWQgZnNsX2VzcGlfY29weV9mcm9tX2J1ZihzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0sCisJCQkJICAgc3RydWN0IG1wYzh4eHhfc3BpICptc3BpKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7CisJdTggKmJ1ZiA9IG1zcGktPmxvY2FsX2J1ZjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQlpZiAodC0+cnhfYnVmKQorCQkJbWVtY3B5KHQtPnJ4X2J1ZiwgYnVmLCB0LT5sZW4pOworCQlidWYgKz0gdC0+bGVuOworCX0KK30KKworc3RhdGljIGludCBmc2xfZXNwaV9jaGVja19tZXNzYWdlKHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKK3sKKwlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG0tPnNwaS0+bWFzdGVyKTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0LCAqZmlyc3Q7CisKKwlpZiAobS0+ZnJhbWVfbGVuZ3RoID4gU1BDT01fVFJBTkxFTl9NQVgpIHsKKwkJZGV2X2Vycihtc3BpLT5kZXYsICJtZXNzYWdlIHRvbyBsb25nLCBzaXplIGlzICV1IGJ5dGVzXG4iLAorCQkJbS0+ZnJhbWVfbGVuZ3RoKTsKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwl9CisKKwlmaXJzdCA9IGxpc3RfZmlyc3RfZW50cnkoJm0tPnRyYW5zZmVycywgc3RydWN0IHNwaV90cmFuc2ZlciwKKwkJCQkgdHJhbnNmZXJfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CisJCWlmIChmaXJzdC0+Yml0c19wZXJfd29yZCAhPSB0LT5iaXRzX3Blcl93b3JkIHx8CisJCSAgICBmaXJzdC0+c3BlZWRfaHogIT0gdC0+c3BlZWRfaHopIHsKKwkJCWRldl9lcnIobXNwaS0+ZGV2LCAiYml0c19wZXJfd29yZC9zcGVlZF9oeiBzaG91bGQgYmUgdGhlIHNhbWUgZm9yIGFsbCB0cmFuc2ZlcnNcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgZnNsX2VzcGlfY2hhbmdlX21vZGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKIAlzdHJ1Y3Qgc3BpX21wYzh4eHhfY3MgKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwotCXN0cnVjdCBmc2xfZXNwaV9yZWcgKnJlZ19iYXNlID0gbXNwaS0+cmVnX2Jhc2U7Ci0JX19iZTMyIF9faW9tZW0gKm1vZGUgPSAmcmVnX2Jhc2UtPmNzbW9kZVtzcGktPmNoaXBfc2VsZWN0XTsKLQlfX2JlMzIgX19pb21lbSAqZXNwaV9tb2RlID0gJnJlZ19iYXNlLT5tb2RlOwogCXUzMiB0bXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTAyLDEwICsxNzUsMTEgQEAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKIAkvKiBUdXJuIG9mZiBTUEkgdW5pdCBwcmlvciBjaGFuZ2luZyBtb2RlICovCi0JdG1wID0gbXBjOHh4eF9zcGlfcmVhZF9yZWcoZXNwaV9tb2RlKTsKLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoZXNwaV9tb2RlLCB0bXAgJiB+U1BNT0RFX0VOQUJMRSk7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKG1vZGUsIGNzLT5od19tb2RlKTsKLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoZXNwaV9tb2RlLCB0bXApOworCXRtcCA9IGZzbF9lc3BpX3JlYWRfcmVnKG1zcGksIEVTUElfU1BNT0RFKTsKKwlmc2xfZXNwaV93cml0ZV9yZWcobXNwaSwgRVNQSV9TUE1PREUsIHRtcCAmIH5TUE1PREVfRU5BQkxFKTsKKwlmc2xfZXNwaV93cml0ZV9yZWcobXNwaSwgRVNQSV9TUE1PREV4KHNwaS0+Y2hpcF9zZWxlY3QpLAorCQkJICAgICAgY3MtPmh3X21vZGUpOworCWZzbF9lc3BpX3dyaXRlX3JlZyhtc3BpLCBFU1BJX1NQTU9ERSwgdG1wKTsKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KQEAgLTEzMSwyNyArMjA1LDE1IEBACiAJcmV0dXJuIGRhdGE7CiB9CiAKLXN0YXRpYyBpbnQgZnNsX2VzcGlfc2V0dXBfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKK3N0YXRpYyB2b2lkIGZzbF9lc3BpX3NldHVwX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCiAJCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCiB7CiAJc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCWludCBiaXRzX3Blcl93b3JkID0gMDsKKwlpbnQgYml0c19wZXJfd29yZCA9IHQgPyB0LT5iaXRzX3Blcl93b3JkIDogc3BpLT5iaXRzX3Blcl93b3JkOworCXUzMiBoeiA9IHQgPyB0LT5zcGVlZF9oeiA6IHNwaS0+bWF4X3NwZWVkX2h6OwogCXU4IHBtOwotCXUzMiBoeiA9IDA7CiAJc3RydWN0IHNwaV9tcGM4eHh4X2NzICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKIAotCWlmICh0KSB7Ci0JCWJpdHNfcGVyX3dvcmQgPSB0LT5iaXRzX3Blcl93b3JkOwotCQloeiA9IHQtPnNwZWVkX2h6OwotCX0KLQotCS8qIHNwaV90cmFuc2ZlciBsZXZlbCBjYWxscyB0aGF0IHdvcmsgcGVyLXdvcmQgKi8KLQlpZiAoIWJpdHNfcGVyX3dvcmQpCi0JCWJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0KLQlpZiAoIWh6KQotCQloeiA9IHNwaS0+bWF4X3NwZWVkX2h6OwotCiAJY3MtPnJ4X3NoaWZ0ID0gMDsKIAljcy0+dHhfc2hpZnQgPSAwOwogCWNzLT5nZXRfcnggPSBtcGM4eHh4X3NwaV9yeF9idWZfdTMyOwpAQCAtMTY5LDEyICsyMzEsMTAgQEAKIAltcGM4eHh4X3NwaS0+Z2V0X3J4ID0gY3MtPmdldF9yeDsKIAltcGM4eHh4X3NwaS0+Z2V0X3R4ID0gY3MtPmdldF90eDsKIAotCWJpdHNfcGVyX3dvcmQgPSBiaXRzX3Blcl93b3JkIC0gMTsKLQogCS8qIG1hc2sgb3V0IGJpdHMgd2UgYXJlIGdvaW5nIHRvIHNldCAqLwogCWNzLT5od19tb2RlICY9IH4oQ1NNT0RFX0xFTigweEYpIHwgQ1NNT0RFX0RJVjE2IHwgQ1NNT0RFX1BNKDB4RikpOwogCi0JY3MtPmh3X21vZGUgfD0gQ1NNT0RFX0xFTihiaXRzX3Blcl93b3JkKTsKKwljcy0+aHdfbW9kZSB8PSBDU01PREVfTEVOKGJpdHNfcGVyX3dvcmQgLSAxKTsKIAogCWlmICgobXBjOHh4eF9zcGktPnNwaWJyZyAvIGh6KSA+IDY0KSB7CiAJCWNzLT5od19tb2RlIHw9IENTTU9ERV9ESVYxNjsKQEAgLTE5NiwzNiArMjU2LDE2IEBACiAJY3MtPmh3X21vZGUgfD0gQ1NNT0RFX1BNKHBtKTsKIAogCWZzbF9lc3BpX2NoYW5nZV9tb2RlKHNwaSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZnNsX2VzcGlfY3B1X2J1ZnMoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0LAotCQl1bnNpZ25lZCBpbnQgbGVuKQotewotCXUzMiB3b3JkOwotCXN0cnVjdCBmc2xfZXNwaV9yZWcgKnJlZ19iYXNlID0gbXNwaS0+cmVnX2Jhc2U7Ci0KLQltc3BpLT5jb3VudCA9IGxlbjsKLQotCS8qIGVuYWJsZSByeCBpbnRzICovCi0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bWFzaywgU1BJTV9ORSk7Ci0KLQkvKiB0cmFuc21pdCB3b3JkICovCi0Jd29yZCA9IG1zcGktPmdldF90eChtc3BpKTsKLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT50cmFuc21pdCwgd29yZCk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBmc2xfZXNwaV9idWZzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCiB7CiAJc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXN0cnVjdCBmc2xfZXNwaV9yZWcgKnJlZ19iYXNlID0gbXBjOHh4eF9zcGktPnJlZ19iYXNlOwotCXVuc2lnbmVkIGludCBsZW4gPSB0LT5sZW47CisJdTMyIHdvcmQ7CiAJaW50IHJldDsKIAogCW1wYzh4eHhfc3BpLT5sZW4gPSB0LT5sZW47Ci0JbGVuID0gcm91bmR1cChsZW4sIDQpIC8gNDsKKwltcGM4eHh4X3NwaS0+Y291bnQgPSByb3VuZHVwKHQtPmxlbiwgNCkgLyA0OwogCiAJbXBjOHh4eF9zcGktPnR4ID0gdC0+dHhfYnVmOwogCW1wYzh4eHhfc3BpLT5yeCA9IHQtPnJ4X2J1ZjsKQEAgLTIzMywxNyArMjczLDE1IEBACiAJcmVpbml0X2NvbXBsZXRpb24oJm1wYzh4eHhfc3BpLT5kb25lKTsKIAogCS8qIFNldCBTUENPTVtDU10gYW5kIFNQQ09NW1RSQU5MRU5dIGZpZWxkICovCi0JaWYgKHQtPmxlbiA+IFNQQ09NX1RSQU5MRU5fTUFYKSB7Ci0JCWRldl9lcnIobXBjOHh4eF9zcGktPmRldiwgIlRyYW5zYWN0aW9uIGxlbmd0aCAoJWQpIgotCQkJCSIgYmV5b25kIHRoZSBTUENPTVtUUkFOTEVOXSBmaWVsZFxuIiwgdC0+bGVuKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPmNvbW1hbmQsCisJZnNsX2VzcGlfd3JpdGVfcmVnKG1wYzh4eHhfc3BpLCBFU1BJX1NQQ09NLAogCQkoU1BDT01fQ1Moc3BpLT5jaGlwX3NlbGVjdCkgfCBTUENPTV9UUkFOTEVOKHQtPmxlbiAtIDEpKSk7CiAKLQlyZXQgPSBmc2xfZXNwaV9jcHVfYnVmcyhtcGM4eHh4X3NwaSwgdCwgbGVuKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCS8qIGVuYWJsZSByeCBpbnRzICovCisJZnNsX2VzcGlfd3JpdGVfcmVnKG1wYzh4eHhfc3BpLCBFU1BJX1NQSU0sIFNQSU1fUk5FKTsKKworCS8qIHRyYW5zbWl0IHdvcmQgKi8KKwl3b3JkID0gbXBjOHh4eF9zcGktPmdldF90eChtcGM4eHh4X3NwaSk7CisJZnNsX2VzcGlfd3JpdGVfcmVnKG1wYzh4eHhfc3BpLCBFU1BJX1NQSVRGLCB3b3JkKTsKIAogCS8qIFdvbid0IGhhbmcgdXAgZm9yZXZlciwgU1BJIGJ1cyBzb21ldGltZXMgZ290IGxvc3QgaW50ZXJydXB0cy4uLiAqLwogCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmbXBjOHh4eF9zcGktPmRvbmUsIDIgKiBIWik7CkBAIC0yNTMsMjMwICsyOTEsNzYgQEAKIAkJCW1wYzh4eHhfc3BpLT5jb3VudCk7CiAKIAkvKiBkaXNhYmxlIHJ4IGludHMgKi8KLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5tYXNrLCAwKTsKKwlmc2xfZXNwaV93cml0ZV9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BJTSwgMCk7CiAKLQlyZXR1cm4gbXBjOHh4eF9zcGktPmNvdW50OworCXJldHVybiBtcGM4eHh4X3NwaS0+Y291bnQgPiAwID8gLUVNU0dTSVpFIDogMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGZzbF9lc3BpX2FkZHIyY21kKHVuc2lnbmVkIGludCBhZGRyLCB1OCAqY21kKQorc3RhdGljIGludCBmc2xfZXNwaV90cmFucyhzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0sIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnRyYW5zKQogewotCWlmIChjbWQpIHsKLQkJY21kWzFdID0gKHU4KShhZGRyID4+IDE2KTsKLQkJY21kWzJdID0gKHU4KShhZGRyID4+IDgpOwotCQljbWRbM10gPSAodTgpKGFkZHIgPj4gMCk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmc2xfZXNwaV9jbWQyYWRkcih1OCAqY21kKQotewotCWlmIChjbWQpCi0JCXJldHVybiBjbWRbMV0gPDwgMTYgfCBjbWRbMl0gPDwgOCB8IGNtZFszXSA8PCAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGZzbF9lc3BpX2RvX3RyYW5zKHN0cnVjdCBzcGlfbWVzc2FnZSAqbSwKLQkJCQlzdHJ1Y3QgZnNsX2VzcGlfdHJhbnNmZXIgKnRyKQoteworCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobS0+c3BpLT5tYXN0ZXIpOwogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBtLT5zcGk7Ci0Jc3RydWN0IG1wYzh4eHhfc3BpICptc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0Jc3RydWN0IGZzbF9lc3BpX3RyYW5zZmVyICplc3BpX3RyYW5zID0gdHI7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlIG1lc3NhZ2U7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdCwgKmZpcnN0LCB0cmFuczsKLQlpbnQgc3RhdHVzID0gMDsKKwlpbnQgcmV0OwogCi0Jc3BpX21lc3NhZ2VfaW5pdCgmbWVzc2FnZSk7Ci0JbWVtc2V0KCZ0cmFucywgMCwgc2l6ZW9mKHRyYW5zKSk7CisJZnNsX2VzcGlfY29weV90b19idWYobSwgbXNwaSk7CisJZnNsX2VzcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCB0cmFucyk7CiAKLQlmaXJzdCA9IGxpc3RfZmlyc3RfZW50cnkoJm0tPnRyYW5zZmVycywgc3RydWN0IHNwaV90cmFuc2ZlciwKLQkJCXRyYW5zZmVyX2xpc3QpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCQlpZiAoKGZpcnN0LT5iaXRzX3Blcl93b3JkICE9IHQtPmJpdHNfcGVyX3dvcmQpIHx8Ci0JCQkoZmlyc3QtPnNwZWVkX2h6ICE9IHQtPnNwZWVkX2h6KSkgewotCQkJZXNwaV90cmFucy0+c3RhdHVzID0gLUVJTlZBTDsKLQkJCWRldl9lcnIobXNwaS0+ZGV2LAotCQkJCSJiaXRzX3Blcl93b3JkL3NwZWVkX2h6IHNob3VsZCBiZSBzYW1lIGZvciB0aGUgc2FtZSBTUEkgdHJhbnNmZXJcbiIpOwotCQkJcmV0dXJuOwotCQl9CisJcmV0ID0gZnNsX2VzcGlfYnVmcyhzcGksIHRyYW5zKTsKIAotCQl0cmFucy5zcGVlZF9oeiA9IHQtPnNwZWVkX2h6OwotCQl0cmFucy5iaXRzX3Blcl93b3JkID0gdC0+Yml0c19wZXJfd29yZDsKLQkJdHJhbnMuZGVsYXlfdXNlY3MgPSBtYXgoZmlyc3QtPmRlbGF5X3VzZWNzLCB0LT5kZWxheV91c2Vjcyk7Ci0JfQorCWlmICh0cmFucy0+ZGVsYXlfdXNlY3MpCisJCXVkZWxheSh0cmFucy0+ZGVsYXlfdXNlY3MpOwogCi0JdHJhbnMubGVuID0gZXNwaV90cmFucy0+bGVuOwotCXRyYW5zLnR4X2J1ZiA9IGVzcGlfdHJhbnMtPnR4X2J1ZjsKLQl0cmFucy5yeF9idWYgPSBlc3BpX3RyYW5zLT5yeF9idWY7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRyYW5zLCAmbWVzc2FnZSk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtZXNzYWdlLnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCQlpZiAodC0+Yml0c19wZXJfd29yZCB8fCB0LT5zcGVlZF9oeikgewotCQkJc3RhdHVzID0gLUVJTlZBTDsKLQotCQkJc3RhdHVzID0gZnNsX2VzcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCB0KTsKLQkJCWlmIChzdGF0dXMgPCAwKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHQtPmxlbikKLQkJCXN0YXR1cyA9IGZzbF9lc3BpX2J1ZnMoc3BpLCB0KTsKLQotCQlpZiAoc3RhdHVzKSB7Ci0JCQlzdGF0dXMgPSAtRU1TR1NJWkU7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmICh0LT5kZWxheV91c2VjcykKLQkJCXVkZWxheSh0LT5kZWxheV91c2Vjcyk7Ci0JfQotCi0JZXNwaV90cmFucy0+c3RhdHVzID0gc3RhdHVzOwogCWZzbF9lc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgTlVMTCk7Ci19CiAKLXN0YXRpYyB2b2lkIGZzbF9lc3BpX2NtZF90cmFucyhzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0sCi0JCQkJc3RydWN0IGZzbF9lc3BpX3RyYW5zZmVyICp0cmFucywgdTggKnJ4X2J1ZmYpCi17Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKLQl1OCAqbG9jYWxfYnVmOwotCWludCBpID0gMDsKLQlzdHJ1Y3QgZnNsX2VzcGlfdHJhbnNmZXIgKmVzcGlfdHJhbnMgPSB0cmFuczsKKwlpZiAoIXJldCkKKwkJZnNsX2VzcGlfY29weV9mcm9tX2J1ZihtLCBtc3BpKTsKIAotCWxvY2FsX2J1ZiA9IGt6YWxsb2MoU1BDT01fVFJBTkxFTl9NQVgsIEdGUF9LRVJORUwpOwotCWlmICghbG9jYWxfYnVmKSB7Ci0JCWVzcGlfdHJhbnMtPnN0YXR1cyA9IC1FTk9NRU07Ci0JCXJldHVybjsKLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJaWYgKHQtPnR4X2J1ZikgewotCQkJbWVtY3B5KGxvY2FsX2J1ZiArIGksIHQtPnR4X2J1ZiwgdC0+bGVuKTsKLQkJCWkgKz0gdC0+bGVuOwotCQl9Ci0JfQotCi0JZXNwaV90cmFucy0+dHhfYnVmID0gbG9jYWxfYnVmOwotCWVzcGlfdHJhbnMtPnJ4X2J1ZiA9IGxvY2FsX2J1ZjsKLQlmc2xfZXNwaV9kb190cmFucyhtLCBlc3BpX3RyYW5zKTsKLQotCWVzcGlfdHJhbnMtPmFjdHVhbF9sZW5ndGggPSBlc3BpX3RyYW5zLT5sZW47Ci0Ja2ZyZWUobG9jYWxfYnVmKTsKLX0KLQotc3RhdGljIHZvaWQgZnNsX2VzcGlfcndfdHJhbnMoc3RydWN0IHNwaV9tZXNzYWdlICptLAotCQkJCXN0cnVjdCBmc2xfZXNwaV90cmFuc2ZlciAqdHJhbnMsIHU4ICpyeF9idWZmKQotewotCXN0cnVjdCBmc2xfZXNwaV90cmFuc2ZlciAqZXNwaV90cmFucyA9IHRyYW5zOwotCXVuc2lnbmVkIGludCB0b3RhbF9sZW4gPSBlc3BpX3RyYW5zLT5sZW47Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKLQl1OCAqbG9jYWxfYnVmOwotCXU4ICpyeF9idWYgPSByeF9idWZmOwotCXVuc2lnbmVkIGludCB0cmFuc19sZW47Ci0JdW5zaWduZWQgaW50IGFkZHI7Ci0JdW5zaWduZWQgaW50IHR4X29ubHk7Ci0JdW5zaWduZWQgaW50IHJ4X3BvcyA9IDA7Ci0JdW5zaWduZWQgaW50IHBvczsKLQlpbnQgaSwgbG9vcDsKLQotCWxvY2FsX2J1ZiA9IGt6YWxsb2MoU1BDT01fVFJBTkxFTl9NQVgsIEdGUF9LRVJORUwpOwotCWlmICghbG9jYWxfYnVmKSB7Ci0JCWVzcGlfdHJhbnMtPnN0YXR1cyA9IC1FTk9NRU07Ci0JCXJldHVybjsKLQl9Ci0KLQlmb3IgKHBvcyA9IDAsIGxvb3AgPSAwOyBwb3MgPCB0b3RhbF9sZW47IHBvcyArPSB0cmFuc19sZW4sIGxvb3ArKykgewotCQl0cmFuc19sZW4gPSB0b3RhbF9sZW4gLSBwb3M7Ci0KLQkJaSA9IDA7Ci0JCXR4X29ubHkgPSAwOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJCWlmICh0LT50eF9idWYpIHsKLQkJCQltZW1jcHkobG9jYWxfYnVmICsgaSwgdC0+dHhfYnVmLCB0LT5sZW4pOwotCQkJCWkgKz0gdC0+bGVuOwotCQkJCWlmICghdC0+cnhfYnVmKQotCQkJCQl0eF9vbmx5ICs9IHQtPmxlbjsKLQkJCX0KLQkJfQotCi0JCS8qIEFkZCBhZGRpdGlvbmFsIFRYIGJ5dGVzIHRvIGNvbXBlbnNhdGUgU1BDT01fVFJBTkxFTl9NQVggKi8KLQkJaWYgKGxvb3AgPiAwKQotCQkJdHJhbnNfbGVuICs9IHR4X29ubHk7Ci0KLQkJaWYgKHRyYW5zX2xlbiA+IFNQQ09NX1RSQU5MRU5fTUFYKQotCQkJdHJhbnNfbGVuID0gU1BDT01fVFJBTkxFTl9NQVg7Ci0KLQkJLyogVXBkYXRlIGRldmljZSBvZmZzZXQgKi8KLQkJaWYgKHBvcyA+IDApIHsKLQkJCWFkZHIgPSBmc2xfZXNwaV9jbWQyYWRkcihsb2NhbF9idWYpOwotCQkJYWRkciArPSByeF9wb3M7Ci0JCQlmc2xfZXNwaV9hZGRyMmNtZChhZGRyLCBsb2NhbF9idWYpOwotCQl9Ci0KLQkJZXNwaV90cmFucy0+bGVuID0gdHJhbnNfbGVuOwotCQllc3BpX3RyYW5zLT50eF9idWYgPSBsb2NhbF9idWY7Ci0JCWVzcGlfdHJhbnMtPnJ4X2J1ZiA9IGxvY2FsX2J1ZjsKLQkJZnNsX2VzcGlfZG9fdHJhbnMobSwgZXNwaV90cmFucyk7Ci0KLQkJLyogSWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIFJYIGJ5dGUgdGhlbiBjb3B5IGl0IHRvIHJ4X2J1ZiAqLwotCQlpZiAodHhfb25seSA8IFNQQ09NX1RSQU5MRU5fTUFYKQotCQkJbWVtY3B5KHJ4X2J1ZiArIHJ4X3BvcywgZXNwaV90cmFucy0+cnhfYnVmICsgdHhfb25seSwKLQkJCQkJdHJhbnNfbGVuIC0gdHhfb25seSk7Ci0KLQkJcnhfcG9zICs9IHRyYW5zX2xlbiAtIHR4X29ubHk7Ci0KLQkJaWYgKGxvb3AgPiAwKQotCQkJZXNwaV90cmFucy0+YWN0dWFsX2xlbmd0aCArPSBlc3BpX3RyYW5zLT5sZW4gLSB0eF9vbmx5OwotCQllbHNlCi0JCQllc3BpX3RyYW5zLT5hY3R1YWxfbGVuZ3RoICs9IGVzcGlfdHJhbnMtPmxlbjsKLQl9Ci0KLQlrZnJlZShsb2NhbF9idWYpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZnNsX2VzcGlfZG9fb25lX21zZyhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAogCQkJICAgICAgIHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKIHsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0OwotCXU4ICpyeF9idWYgPSBOVUxMOwotCXVuc2lnbmVkIGludCBuX3R4ID0gMDsKLQl1bnNpZ25lZCBpbnQgbl9yeCA9IDA7Ci0JdW5zaWduZWQgaW50IHhmZXJfbGVuID0gMDsKLQlzdHJ1Y3QgZnNsX2VzcGlfdHJhbnNmZXIgZXNwaV90cmFuczsKKwlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG0tPnNwaS0+bWFzdGVyKTsKKwl1bnNpZ25lZCBpbnQgZGVsYXlfdXNlY3MgPSAwOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQsIHRyYW5zID0ge307CisJaW50IHJldDsKKworCXJldCA9IGZzbF9lc3BpX2NoZWNrX21lc3NhZ2UobSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJaWYgKHQtPnR4X2J1ZikKLQkJCW5fdHggKz0gdC0+bGVuOwotCQlpZiAodC0+cnhfYnVmKSB7Ci0JCQluX3J4ICs9IHQtPmxlbjsKLQkJCXJ4X2J1ZiA9IHQtPnJ4X2J1ZjsKLQkJfQotCQlpZiAoKHQtPnR4X2J1ZikgfHwgKHQtPnJ4X2J1ZikpCi0JCQl4ZmVyX2xlbiArPSB0LT5sZW47CisJCWlmICh0LT5kZWxheV91c2VjcyA+IGRlbGF5X3VzZWNzKQorCQkJZGVsYXlfdXNlY3MgPSB0LT5kZWxheV91c2VjczsKIAl9CiAKLQllc3BpX3RyYW5zLm5fdHggPSBuX3R4OwotCWVzcGlfdHJhbnMubl9yeCA9IG5fcng7Ci0JZXNwaV90cmFucy5sZW4gPSB4ZmVyX2xlbjsKLQllc3BpX3RyYW5zLmFjdHVhbF9sZW5ndGggPSAwOwotCWVzcGlfdHJhbnMuc3RhdHVzID0gMDsKKwl0ID0gbGlzdF9maXJzdF9lbnRyeSgmbS0+dHJhbnNmZXJzLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyLAorCQkJICAgICB0cmFuc2Zlcl9saXN0KTsKIAotCWlmICghcnhfYnVmKQotCQlmc2xfZXNwaV9jbWRfdHJhbnMobSwgJmVzcGlfdHJhbnMsIE5VTEwpOwotCWVsc2UKLQkJZnNsX2VzcGlfcndfdHJhbnMobSwgJmVzcGlfdHJhbnMsIHJ4X2J1Zik7CisJdHJhbnMubGVuID0gbS0+ZnJhbWVfbGVuZ3RoOworCXRyYW5zLnNwZWVkX2h6ID0gdC0+c3BlZWRfaHo7CisJdHJhbnMuYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQ7CisJdHJhbnMuZGVsYXlfdXNlY3MgPSBkZWxheV91c2VjczsKKwl0cmFucy50eF9idWYgPSBtc3BpLT5sb2NhbF9idWY7CisJdHJhbnMucnhfYnVmID0gbXNwaS0+bG9jYWxfYnVmOwogCi0JbS0+YWN0dWFsX2xlbmd0aCA9IGVzcGlfdHJhbnMuYWN0dWFsX2xlbmd0aDsKLQltLT5zdGF0dXMgPSBlc3BpX3RyYW5zLnN0YXR1czsKKwlpZiAodHJhbnMubGVuKQorCQlyZXQgPSBmc2xfZXNwaV90cmFucyhtLCAmdHJhbnMpOworCisJbS0+YWN0dWFsX2xlbmd0aCA9IHJldCA/IDAgOiB0cmFucy5sZW47CitvdXQ6CisJaWYgKG0tPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCisJCW0tPnN0YXR1cyA9IHJldDsKKwogCXNwaV9maW5hbGl6ZV9jdXJyZW50X21lc3NhZ2UobWFzdGVyKTsKLQlyZXR1cm4gMDsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZnNsX2VzcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1wYzh4eHhfc3BpOwotCXN0cnVjdCBmc2xfZXNwaV9yZWcgKnJlZ19iYXNlOwotCWludCByZXR2YWw7Ci0JdTMyIGh3X21vZGU7CiAJdTMyIGxvb3BfbW9kZTsKIAlzdHJ1Y3Qgc3BpX21wYzh4eHhfY3MgKmNzID0gc3BpX2dldF9jdGxkYXRhKHNwaSk7CiAKQEAgLTQ5MSwxMyArMzc1LDExIEBACiAJfQogCiAJbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQlyZWdfYmFzZSA9IG1wYzh4eHhfc3BpLT5yZWdfYmFzZTsKIAogCXBtX3J1bnRpbWVfZ2V0X3N5bmMobXBjOHh4eF9zcGktPmRldik7CiAKLQlod19tb2RlID0gY3MtPmh3X21vZGU7IC8qIFNhdmUgb3JpZ2luYWwgc2V0dGluZ3MgKi8KLQljcy0+aHdfbW9kZSA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKAotCQkJJnJlZ19iYXNlLT5jc21vZGVbc3BpLT5jaGlwX3NlbGVjdF0pOworCWNzLT5od19tb2RlID0gZnNsX2VzcGlfcmVhZF9yZWcobXBjOHh4eF9zcGksCisJCQkJCSAgIEVTUElfU1BNT0RFeChzcGktPmNoaXBfc2VsZWN0KSk7CiAJLyogbWFzayBvdXQgYml0cyB3ZSBhcmUgZ29pbmcgdG8gc2V0ICovCiAJY3MtPmh3X21vZGUgJj0gfihDU01PREVfQ1BfQkVHSU5fRURHRUNMSyB8IENTTU9ERV9DSV9JTkFDVElWRUhJR0gKIAkJCSB8IENTTU9ERV9SRVYpOwpAQCAtNTEwLDIxICszOTIsMTcgQEAKIAkJY3MtPmh3X21vZGUgfD0gQ1NNT0RFX1JFVjsKIAogCS8qIEhhbmRsZSB0aGUgbG9vcCBtb2RlICovCi0JbG9vcF9tb2RlID0gbXBjOHh4eF9zcGlfcmVhZF9yZWcoJnJlZ19iYXNlLT5tb2RlKTsKKwlsb29wX21vZGUgPSBmc2xfZXNwaV9yZWFkX3JlZyhtcGM4eHh4X3NwaSwgRVNQSV9TUE1PREUpOwogCWxvb3BfbW9kZSAmPSB+U1BNT0RFX0xPT1A7CiAJaWYgKHNwaS0+bW9kZSAmIFNQSV9MT09QKQogCQlsb29wX21vZGUgfD0gU1BNT0RFX0xPT1A7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bW9kZSwgbG9vcF9tb2RlKTsKKwlmc2xfZXNwaV93cml0ZV9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BNT0RFLCBsb29wX21vZGUpOwogCi0JcmV0dmFsID0gZnNsX2VzcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCBOVUxMKTsKKwlmc2xfZXNwaV9zZXR1cF90cmFuc2ZlcihzcGksIE5VTEwpOwogCiAJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShtcGM4eHh4X3NwaS0+ZGV2KTsKIAlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChtcGM4eHh4X3NwaS0+ZGV2KTsKIAotCWlmIChyZXR2YWwgPCAwKSB7Ci0JCWNzLT5od19tb2RlID0gaHdfbW9kZTsgLyogUmVzdG9yZSBzZXR0aW5ncyAqLwotCQlyZXR1cm4gcmV0dmFsOwotCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTM2LDEyICs0MTQsMTAgQEAKIAlzcGlfc2V0X2N0bGRhdGEoc3BpLCBOVUxMKTsKIH0KIAotdm9pZCBmc2xfZXNwaV9jcHVfaXJxKHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSwgdTMyIGV2ZW50cykKK3N0YXRpYyB2b2lkIGZzbF9lc3BpX2NwdV9pcnEoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpLCB1MzIgZXZlbnRzKQogewotCXN0cnVjdCBmc2xfZXNwaV9yZWcgKnJlZ19iYXNlID0gbXNwaS0+cmVnX2Jhc2U7Ci0KIAkvKiBXZSBuZWVkIGhhbmRsZSBSWCBmaXJzdCAqLwotCWlmIChldmVudHMgJiBTUElFX05FKSB7CisJaWYgKGV2ZW50cyAmIFNQSUVfUk5FKSB7CiAJCXUzMiByeF9kYXRhLCB0bXA7CiAJCXU4IHJ4X2RhdGFfODsKIAkJaW50IHJ4X25yX2J5dGVzID0gNDsKQEAgLTU1MSw3ICs0MjcsNyBAQAogCQlpZiAoU1BJRV9SWENOVChldmVudHMpIDwgbWluKDQsIG1zcGktPmxlbikpIHsKIAkJCXJldCA9IHNwaW5fZXZlbnRfdGltZW91dCgKIAkJCQkhKFNQSUVfUlhDTlQoZXZlbnRzID0KLQkJCQltcGM4eHh4X3NwaV9yZWFkX3JlZygmcmVnX2Jhc2UtPmV2ZW50KSkgPAorCQkJCWZzbF9lc3BpX3JlYWRfcmVnKG1zcGksIEVTUElfU1BJRSkpIDwKIAkJCQkJCW1pbig0LCBtc3BpLT5sZW4pKSwKIAkJCQkJCTEwMDAwLCAwKTsgLyogMTAgbXNlYyAqLwogCQkJaWYgKCFyZXQpCkBAIC01NjAsMTAgKzQzNiwxMCBAQAogCQl9CiAKIAkJaWYgKG1zcGktPmxlbiA+PSA0KSB7Ci0JCQlyeF9kYXRhID0gbXBjOHh4eF9zcGlfcmVhZF9yZWcoJnJlZ19iYXNlLT5yZWNlaXZlKTsKKwkJCXJ4X2RhdGEgPSBmc2xfZXNwaV9yZWFkX3JlZyhtc3BpLCBFU1BJX1NQSVJGKTsKIAkJfSBlbHNlIGlmIChtc3BpLT5sZW4gPD0gMCkgewogCQkJZGV2X2Vycihtc3BpLT5kZXYsCi0JCQkJInVuZXhwZWN0ZWQgUlgoU1BJRV9ORSkgaW50ZXJydXB0IG9jY3VycmVkLFxuIgorCQkJCSJ1bmV4cGVjdGVkIFJYKFNQSUVfUk5FKSBpbnRlcnJ1cHQgb2NjdXJyZWQsXG4iCiAJCQkJIihsb2NhbCByeGxlbiAlZCBieXRlcywgcmVnIHJ4bGVuICVkIGJ5dGVzKVxuIiwKIAkJCQltaW4oNCwgbXNwaS0+bGVuKSwgU1BJRV9SWENOVChldmVudHMpKTsKIAkJCXJ4X25yX2J5dGVzID0gMDsKQEAgLTU3Miw3ICs0NDgsOCBAQAogCQkJdG1wID0gbXNwaS0+bGVuOwogCQkJcnhfZGF0YSA9IDA7CiAJCQl3aGlsZSAodG1wLS0pIHsKLQkJCQlyeF9kYXRhXzggPSBpbl84KCh1OCAqKSZyZWdfYmFzZS0+cmVjZWl2ZSk7CisJCQkJcnhfZGF0YV84ID0gZnNsX2VzcGlfcmVhZF9yZWc4KG1zcGksCisJCQkJCQkJICAgICAgIEVTUElfU1BJUkYpOwogCQkJCXJ4X2RhdGEgfD0gKHJ4X2RhdGFfOCA8PCAodG1wICogOCkpOwogCQkJfQogCkBAIC01ODUsMzAgKzQ2MiwyNCBAQAogCQkJbXNwaS0+Z2V0X3J4KHJ4X2RhdGEsIG1zcGkpOwogCX0KIAotCWlmICghKGV2ZW50cyAmIFNQSUVfTkYpKSB7CisJaWYgKCEoZXZlbnRzICYgU1BJRV9UTkYpKSB7CiAJCWludCByZXQ7CiAKIAkJLyogc3BpbiB1bnRpbCBUWCBpcyBkb25lICovCi0JCXJldCA9IHNwaW5fZXZlbnRfdGltZW91dCgoKGV2ZW50cyA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKAotCQkJCSZyZWdfYmFzZS0+ZXZlbnQpKSAmIFNQSUVfTkYpLCAxMDAwLCAwKTsKKwkJcmV0ID0gc3Bpbl9ldmVudF90aW1lb3V0KCgoZXZlbnRzID0gZnNsX2VzcGlfcmVhZF9yZWcoCisJCQkJbXNwaSwgRVNQSV9TUElFKSkgJiBTUElFX1RORiksIDEwMDAsIDApOwogCQlpZiAoIXJldCkgewotCQkJZGV2X2Vycihtc3BpLT5kZXYsICJ0aXJlZCB3YWl0aW5nIGZvciBTUElFX05GXG4iKTsKLQotCQkJLyogQ2xlYXIgdGhlIFNQSUUgYml0cyAqLwotCQkJbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+ZXZlbnQsIGV2ZW50cyk7CisJCQlkZXZfZXJyKG1zcGktPmRldiwgInRpcmVkIHdhaXRpbmcgZm9yIFNQSUVfVE5GXG4iKTsKIAkJCWNvbXBsZXRlKCZtc3BpLT5kb25lKTsKIAkJCXJldHVybjsKIAkJfQogCX0KIAotCS8qIENsZWFyIHRoZSBldmVudHMgKi8KLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5ldmVudCwgZXZlbnRzKTsKLQogCW1zcGktPmNvdW50IC09IDE7CiAJaWYgKG1zcGktPmNvdW50KSB7CiAJCXUzMiB3b3JkID0gbXNwaS0+Z2V0X3R4KG1zcGkpOwogCi0JCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPnRyYW5zbWl0LCB3b3JkKTsKKwkJZnNsX2VzcGlfd3JpdGVfcmVnKG1zcGksIEVTUElfU1BJVEYsIHdvcmQpOwogCX0gZWxzZSB7CiAJCWNvbXBsZXRlKCZtc3BpLT5kb25lKTsKIAl9CkBAIC02MTcsMjAgKzQ4OCwyMSBAQAogc3RhdGljIGlycXJldHVybl90IGZzbF9lc3BpX2lycShzMzIgaXJxLCB2b2lkICpjb250ZXh0X2RhdGEpCiB7CiAJc3RydWN0IG1wYzh4eHhfc3BpICptc3BpID0gY29udGV4dF9kYXRhOwotCXN0cnVjdCBmc2xfZXNwaV9yZWcgKnJlZ19iYXNlID0gbXNwaS0+cmVnX2Jhc2U7Ci0JaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CiAJdTMyIGV2ZW50czsKIAogCS8qIEdldCBpbnRlcnJ1cHQgZXZlbnRzKHR4L3J4KSAqLwotCWV2ZW50cyA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKCZyZWdfYmFzZS0+ZXZlbnQpOwotCWlmIChldmVudHMpCi0JCXJldCA9IElSUV9IQU5ETEVEOworCWV2ZW50cyA9IGZzbF9lc3BpX3JlYWRfcmVnKG1zcGksIEVTUElfU1BJRSk7CisJaWYgKCFldmVudHMpCisJCXJldHVybiBJUlFfTk9ORTsKIAogCWRldl92ZGJnKG1zcGktPmRldiwgIiVzOiBldmVudHMgJXhcbiIsIF9fZnVuY19fLCBldmVudHMpOwogCiAJZnNsX2VzcGlfY3B1X2lycShtc3BpLCBldmVudHMpOwogCi0JcmV0dXJuIHJldDsKKwkvKiBDbGVhciB0aGUgZXZlbnRzICovCisJZnNsX2VzcGlfd3JpdGVfcmVnKG1zcGksIEVTUElfU1BJRSwgZXZlbnRzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogI2lmZGVmIENPTkZJR19QTQpAQCAtNjM4LDEyICs1MTAsMTEgQEAKIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlzdHJ1Y3QgZnNsX2VzcGlfcmVnICpyZWdfYmFzZSA9IG1wYzh4eHhfc3BpLT5yZWdfYmFzZTsKIAl1MzIgcmVndmFsOwogCi0JcmVndmFsID0gbXBjOHh4eF9zcGlfcmVhZF9yZWcoJnJlZ19iYXNlLT5tb2RlKTsKKwlyZWd2YWwgPSBmc2xfZXNwaV9yZWFkX3JlZyhtcGM4eHh4X3NwaSwgRVNQSV9TUE1PREUpOwogCXJlZ3ZhbCAmPSB+U1BNT0RFX0VOQUJMRTsKLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5tb2RlLCByZWd2YWwpOworCWZzbF9lc3BpX3dyaXRlX3JlZyhtcGM4eHh4X3NwaSwgRVNQSV9TUE1PREUsIHJlZ3ZhbCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY1MiwzOSArNTIzLDM1IEBACiB7CiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0Jc3RydWN0IGZzbF9lc3BpX3JlZyAqcmVnX2Jhc2UgPSBtcGM4eHh4X3NwaS0+cmVnX2Jhc2U7CiAJdTMyIHJlZ3ZhbDsKIAotCXJlZ3ZhbCA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKCZyZWdfYmFzZS0+bW9kZSk7CisJcmVndmFsID0gZnNsX2VzcGlfcmVhZF9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BNT0RFKTsKIAlyZWd2YWwgfD0gU1BNT0RFX0VOQUJMRTsKLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5tb2RlLCByZWd2YWwpOworCWZzbF9lc3BpX3dyaXRlX3JlZyhtcGM4eHh4X3NwaSwgRVNQSV9TUE1PREUsIHJlZ3ZhbCk7CiAKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgogCi1zdGF0aWMgc2l6ZV90IGZzbF9lc3BpX21heF90cmFuc2Zlcl9zaXplKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCitzdGF0aWMgc2l6ZV90IGZzbF9lc3BpX21heF9tZXNzYWdlX3NpemUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlyZXR1cm4gU1BDT01fVFJBTkxFTl9NQVg7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3BpX21hc3RlciAqIGZzbF9lc3BpX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IHJlc291cmNlICptZW0sIHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgaW50IGZzbF9lc3BpX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlc291cmNlICptZW0sCisJCQkgIHVuc2lnbmVkIGludCBpcnEpCiB7CiAJc3RydWN0IGZzbF9zcGlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKIAlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1wYzh4eHhfc3BpOwotCXN0cnVjdCBmc2xfZXNwaV9yZWcgKnJlZ19iYXNlOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbmM7CiAJY29uc3QgX19iZTMyICpwcm9wOwogCXUzMiByZWd2YWwsIGNzbW9kZTsKLQlpbnQgaSwgbGVuLCByZXQgPSAwOworCWludCBpLCBsZW4sIHJldDsKIAogCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoZGV2LCBzaXplb2Yoc3RydWN0IG1wYzh4eHhfc3BpKSk7Ci0JaWYgKCFtYXN0ZXIpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQorCWlmICghbWFzdGVyKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIG1hc3Rlcik7CiAKQEAgLTY5NSwxOCArNTYyLDIzIEBACiAJbWFzdGVyLT5jbGVhbnVwID0gZnNsX2VzcGlfY2xlYW51cDsKIAltYXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlID0gZnNsX2VzcGlfZG9fb25lX21zZzsKIAltYXN0ZXItPmF1dG9fcnVudGltZV9wbSA9IHRydWU7Ci0JbWFzdGVyLT5tYXhfdHJhbnNmZXJfc2l6ZSA9IGZzbF9lc3BpX21heF90cmFuc2Zlcl9zaXplOworCW1hc3Rlci0+bWF4X21lc3NhZ2Vfc2l6ZSA9IGZzbF9lc3BpX21heF9tZXNzYWdlX3NpemU7CiAKIAltcGM4eHh4X3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAorCW1wYzh4eHhfc3BpLT5sb2NhbF9idWYgPQorCQlkZXZtX2ttYWxsb2MoZGV2LCBTUENPTV9UUkFOTEVOX01BWCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtcGM4eHh4X3NwaS0+bG9jYWxfYnVmKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3Byb2JlOworCX0KKwogCW1wYzh4eHhfc3BpLT5yZWdfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIG1lbSk7CiAJaWYgKElTX0VSUihtcGM4eHh4X3NwaS0+cmVnX2Jhc2UpKSB7CiAJCXJldCA9IFBUUl9FUlIobXBjOHh4eF9zcGktPnJlZ19iYXNlKTsKIAkJZ290byBlcnJfcHJvYmU7CiAJfQogCi0JcmVnX2Jhc2UgPSBtcGM4eHh4X3NwaS0+cmVnX2Jhc2U7Ci0KIAkvKiBSZWdpc3RlciBmb3IgU1BJIEludGVycnVwdCAqLwogCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBtcGM4eHh4X3NwaS0+aXJxLCBmc2xfZXNwaV9pcnEsCiAJCQkgIDAsICJmc2xfZXNwaSIsIG1wYzh4eHhfc3BpKTsKQEAgLTcxOSwxMCArNTkxLDEwIEBACiAJfQogCiAJLyogU1BJIGNvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb25zICovCi0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bW9kZSwgMCk7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bWFzaywgMCk7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+Y29tbWFuZCwgMCk7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+ZXZlbnQsIDB4ZmZmZmZmZmYpOworCWZzbF9lc3BpX3dyaXRlX3JlZyhtcGM4eHh4X3NwaSwgRVNQSV9TUE1PREUsIDApOworCWZzbF9lc3BpX3dyaXRlX3JlZyhtcGM4eHh4X3NwaSwgRVNQSV9TUElNLCAwKTsKKwlmc2xfZXNwaV93cml0ZV9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BDT00sIDApOworCWZzbF9lc3BpX3dyaXRlX3JlZyhtcGM4eHh4X3NwaSwgRVNQSV9TUElFLCAweGZmZmZmZmZmKTsKIAogCS8qIEluaXQgZVNQSSBDUyBtb2RlIHJlZ2lzdGVyICovCiAJZm9yX2VhY2hfYXZhaWxhYmxlX2NoaWxkX29mX25vZGUobWFzdGVyLT5kZXYub2Zfbm9kZSwgbmMpIHsKQEAgLTc0Nyw3ICs2MTksNyBAQAogCQkJY3Ntb2RlICY9IH4oQ1NNT0RFX0FGVCgweGYpKTsKIAkJCWNzbW9kZSB8PSBDU01PREVfQUZUKGJlMzJfdG9fY3B1cChwcm9wKSk7CiAJCX0KLQkJbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+Y3Ntb2RlW2ldLCBjc21vZGUpOworCQlmc2xfZXNwaV93cml0ZV9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BNT0RFeChpKSwgY3Ntb2RlKTsKIAogCQlkZXZfaW5mbyhkZXYsICJjcz0lZCwgaW5pdF9jc21vZGU9MHgleFxuIiwgaSwgY3Ntb2RlKTsKIAl9CkBAIC03NTUsNyArNjI3LDcgQEAKIAkvKiBFbmFibGUgU1BJIGludGVyZmFjZSAqLwogCXJlZ3ZhbCA9IHBkYXRhLT5pbml0aWFsX3NwbW9kZSB8IFNQTU9ERV9JTklUX1ZBTCB8IFNQTU9ERV9FTkFCTEU7CiAKLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5tb2RlLCByZWd2YWwpOworCWZzbF9lc3BpX3dyaXRlX3JlZyhtcGM4eHh4X3NwaSwgRVNQSV9TUE1PREUsIHJlZ3ZhbCk7CiAKIAlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheShkZXYsIEFVVE9TVVNQRU5EX1RJTUVPVVQpOwogCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKGRldik7CkBAIC03NjcsMTIgKzYzOSwxMyBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9wbTsKIAotCWRldl9pbmZvKGRldiwgImF0IDB4JXAgKGlycSA9ICVkKVxuIiwgcmVnX2Jhc2UsIG1wYzh4eHhfc3BpLT5pcnEpOworCWRldl9pbmZvKGRldiwgImF0IDB4JXAgKGlycSA9ICVkKVxuIiwgbXBjOHh4eF9zcGktPnJlZ19iYXNlLAorCQkgbXBjOHh4eF9zcGktPmlycSk7CiAKIAlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGRldik7CiAJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZGV2KTsKIAotCXJldHVybiBtYXN0ZXI7CisJcmV0dXJuIDA7CiAKIGVycl9wbToKIAlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2KTsKQEAgLTc4MCw4ICs2NTMsNyBAQAogCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZChkZXYpOwogZXJyX3Byb2JlOgogCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7Ci1lcnI6Ci0JcmV0dXJuIEVSUl9QVFIocmV0KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG9mX2ZzbF9lc3BpX2dldF9jaGlwc2VsZWN0cyhzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC04MDcsMTAgKzY3OSw5IEBACiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJm9mZGV2LT5kZXY7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IG9mZGV2LT5kZXYub2Zfbm9kZTsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwogCXN0cnVjdCByZXNvdXJjZSBtZW07CiAJdW5zaWduZWQgaW50IGlycTsKLQlpbnQgcmV0ID0gLUVOT01FTTsKKwlpbnQgcmV0OwogCiAJcmV0ID0gb2ZfbXBjOHh4eF9zcGlfcHJvYmUob2ZkZXYpOwogCWlmIChyZXQpCkBAIC04MTgsMjggKzY4OSwxNyBAQAogCiAJcmV0ID0gb2ZfZnNsX2VzcGlfZ2V0X2NoaXBzZWxlY3RzKGRldik7CiAJaWYgKHJldCkKLQkJZ290byBlcnI7CisJCXJldHVybiByZXQ7CiAKIAlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmbWVtKTsKIAlpZiAocmV0KQotCQlnb3RvIGVycjsKKwkJcmV0dXJuIHJldDsKIAogCWlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQlpZiAoIWlycSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycjsKLQl9CisJaWYgKCFpcnEpCisJCXJldHVybiAtRUlOVkFMOwogCi0JbWFzdGVyID0gZnNsX2VzcGlfcHJvYmUoZGV2LCAmbWVtLCBpcnEpOwotCWlmIChJU19FUlIobWFzdGVyKSkgewotCQlyZXQgPSBQVFJfRVJSKG1hc3Rlcik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJldHVybiAwOwotCi1lcnI6Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZnNsX2VzcGlfcHJvYmUoZGV2LCAmbWVtLCBpcnEpOwogfQogCiBzdGF0aWMgaW50IG9mX2ZzbF9lc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCkBAIC04NzMsMjcgKzczMywyNiBAQAogCXN0cnVjdCBmc2xfc3BpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOwogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1wYzh4eHhfc3BpOwotCXN0cnVjdCBmc2xfZXNwaV9yZWcgKnJlZ19iYXNlOwogCXUzMiByZWd2YWw7CiAJaW50IGksIHJldDsKIAogCW1wYzh4eHhfc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCXJlZ19iYXNlID0gbXBjOHh4eF9zcGktPnJlZ19iYXNlOwogCiAJLyogU1BJIGNvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb25zICovCi0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bW9kZSwgMCk7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bWFzaywgMCk7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+Y29tbWFuZCwgMCk7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+ZXZlbnQsIDB4ZmZmZmZmZmYpOworCWZzbF9lc3BpX3dyaXRlX3JlZyhtcGM4eHh4X3NwaSwgRVNQSV9TUE1PREUsIDApOworCWZzbF9lc3BpX3dyaXRlX3JlZyhtcGM4eHh4X3NwaSwgRVNQSV9TUElNLCAwKTsKKwlmc2xfZXNwaV93cml0ZV9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BDT00sIDApOworCWZzbF9lc3BpX3dyaXRlX3JlZyhtcGM4eHh4X3NwaSwgRVNQSV9TUElFLCAweGZmZmZmZmZmKTsKIAogCS8qIEluaXQgZVNQSSBDUyBtb2RlIHJlZ2lzdGVyICovCiAJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5tYXhfY2hpcHNlbGVjdDsgaSsrKQotCQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5jc21vZGVbaV0sIENTTU9ERV9JTklUX1ZBTCk7CisJCWZzbF9lc3BpX3dyaXRlX3JlZyhtcGM4eHh4X3NwaSwgRVNQSV9TUE1PREV4KGkpLAorCQkJCSAgICAgIENTTU9ERV9JTklUX1ZBTCk7CiAKIAkvKiBFbmFibGUgU1BJIGludGVyZmFjZSAqLwogCXJlZ3ZhbCA9IHBkYXRhLT5pbml0aWFsX3NwbW9kZSB8IFNQTU9ERV9JTklUX1ZBTCB8IFNQTU9ERV9FTkFCTEU7CiAKLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5tb2RlLCByZWd2YWwpOworCWZzbF9lc3BpX3dyaXRlX3JlZyhtcGM4eHh4X3NwaSwgRVNQSV9TUE1PREUsIHJlZ3ZhbCk7CiAKIAlyZXQgPSBwbV9ydW50aW1lX2ZvcmNlX3Jlc3VtZShkZXYpOwogCWlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWZzbC1saWIuaCBiL2RyaXZlcnMvc3BpL3NwaS1mc2wtbGliLmgKaW5kZXggODRmNWRjYi4uMjkyNWM4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWZzbC1saWIuaAorKysgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWxpYi5oCkBAIC0yMywxMyArMjMsMTQgQEAKIC8qIFNQSS9lU1BJIENvbnRyb2xsZXIgZHJpdmVyJ3MgcHJpdmF0ZSBkYXRhLiAqLwogc3RydWN0IG1wYzh4eHhfc3BpIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jdm9pZCAqcmVnX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpyZWdfYmFzZTsKIAogCS8qIHJ4ICYgdHggYnVmcyBmcm9tIHRoZSBzcGlfdHJhbnNmZXIgKi8KIAljb25zdCB2b2lkICp0eDsKIAl2b2lkICpyeDsKICNpZiBJU19FTkFCTEVEKENPTkZJR19TUElfRlNMX0VTUEkpCiAJaW50IGxlbjsKKwl1OCAqbG9jYWxfYnVmOwogI2VuZGlmCiAKIAlpbnQgc3ViYmxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktaW1nLXNwZmkuYyBiL2RyaXZlcnMvc3BpL3NwaS1pbWctc3BmaS5jCmluZGV4IDgyM2NiYzkuLjdhMzcwOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1pbWctc3BmaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1pbWctc3BmaS5jCkBAIC03MjAsOCArNzIwLDYgQEAKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNwZmktPnN5c19jbGspOwogCX0KIAotCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWlteC5jIGIvZHJpdmVycy9zcGkvc3BpLWlteC5jCmluZGV4IGY2M2NiMzAuLmRlYjc4MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1pbXguYworKysgYi9kcml2ZXJzL3NwaS9zcGktaW14LmMKQEAgLTE4NiwxNyArMTg2LDE5IEBACiAKIC8qIE1YMSwgTVgzMSwgTVgzNSwgTVg1MSBDU1BJICovCiBzdGF0aWMgdW5zaWduZWQgaW50IHNwaV9pbXhfY2xrZGl2XzIodW5zaWduZWQgaW50IGZpbiwKLQkJdW5zaWduZWQgaW50IGZzcGkpCisJCXVuc2lnbmVkIGludCBmc3BpLCB1bnNpZ25lZCBpbnQgKmZyZXMpCiB7CiAJaW50IGksIGRpdiA9IDQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CiAJCWlmIChmc3BpICogZGl2ID49IGZpbikKLQkJCXJldHVybiBpOworCQkJZ290byBvdXQ7CiAJCWRpdiA8PD0gMTsKIAl9CiAKLQlyZXR1cm4gNzsKK291dDoKKwkqZnJlcyA9IGZpbiAvIGRpdjsKKwlyZXR1cm4gaTsKIH0KIAogc3RhdGljIGludCBzcGlfaW14X2J5dGVzX3Blcl93b3JkKGNvbnN0IGludCBicHcpCkBAIC00NTMsNiArNDU1LDkgQEAKICNkZWZpbmUgTVgzMV9DU1BJU1RBVFVTCQkweDE0CiAjZGVmaW5lIE1YMzFfU1RBVFVTX1JSCQkoMSA8PCAzKQogCisjZGVmaW5lIE1YMzFfQ1NQSV9URVNUUkVHCTB4MUMKKyNkZWZpbmUgTVgzMV9URVNUX0xCQwkJKDEgPDwgMTQpCisKIC8qIFRoZXNlIGZ1bmN0aW9ucyBhbHNvIHdvcmsgZm9yIHRoZSBpLk1YMzUsIGJ1dCBiZSBhd2FyZSB0aGF0CiAgKiB0aGUgaS5NWDM1IGhhcyBhIHNsaWdodGx5IGRpZmZlcmVudCByZWdpc3RlciBsYXlvdXQgZm9yIGJpdHMKICAqIHdlIGRvIG5vdCB1c2UgaGVyZS4KQEAgLTQ4Miw5ICs0ODcsMTEgQEAKIHsKIAlzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CiAJdW5zaWduZWQgaW50IHJlZyA9IE1YMzFfQ1NQSUNUUkxfRU5BQkxFIHwgTVgzMV9DU1BJQ1RSTF9NQVNURVI7CisJdW5zaWduZWQgaW50IGNsazsKIAotCXJlZyB8PSBzcGlfaW14X2Nsa2Rpdl8yKHNwaV9pbXgtPnNwaV9jbGssIGNvbmZpZy0+c3BlZWRfaHopIDw8CisJcmVnIHw9IHNwaV9pbXhfY2xrZGl2XzIoc3BpX2lteC0+c3BpX2NsaywgY29uZmlnLT5zcGVlZF9oeiwgJmNsaykgPDwKIAkJTVgzMV9DU1BJQ1RSTF9EUl9TSElGVDsKKwlzcGlfaW14LT5zcGlfYnVzX2NsayA9IGNsazsKIAogCWlmIChpc19pbXgzNV9jc3BpKHNwaV9pbXgpKSB7CiAJCXJlZyB8PSAoY29uZmlnLT5icHcgLSAxKSA8PCBNWDM1X0NTUElDVFJMX0JMX1NISUZUOwpAQCAtNTA2LDYgKzUxMywxMyBAQAogCiAJd3JpdGVsKHJlZywgc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJQ1RSTCk7CiAKKwlyZWcgPSByZWFkbChzcGlfaW14LT5iYXNlICsgTVgzMV9DU1BJX1RFU1RSRUcpOworCWlmIChzcGktPm1vZGUgJiBTUElfTE9PUCkKKwkJcmVnIHw9IE1YMzFfVEVTVF9MQkM7CisJZWxzZQorCQlyZWcgJj0gfk1YMzFfVEVTVF9MQkM7CisJd3JpdGVsKHJlZywgc3BpX2lteC0+YmFzZSArIE1YMzFfQ1NQSV9URVNUUkVHKTsKKwogCXJldHVybiAwOwogfQogCkBAIC02MjUsOSArNjM5LDEyIEBACiB7CiAJc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwogCXVuc2lnbmVkIGludCByZWcgPSBNWDFfQ1NQSUNUUkxfRU5BQkxFIHwgTVgxX0NTUElDVFJMX01BU1RFUjsKKwl1bnNpZ25lZCBpbnQgY2xrOwogCi0JcmVnIHw9IHNwaV9pbXhfY2xrZGl2XzIoc3BpX2lteC0+c3BpX2NsaywgY29uZmlnLT5zcGVlZF9oeikgPDwKKwlyZWcgfD0gc3BpX2lteF9jbGtkaXZfMihzcGlfaW14LT5zcGlfY2xrLCBjb25maWctPnNwZWVkX2h6LCAmY2xrKSA8PAogCQlNWDFfQ1NQSUNUUkxfRFJfU0hJRlQ7CisJc3BpX2lteC0+c3BpX2J1c19jbGsgPSBjbGs7CisKIAlyZWcgfD0gY29uZmlnLT5icHcgLSAxOwogCiAJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQpAQCAtMTE3OSw3ICsxMTk2LDcgQEAKIAlzcGlfaW14LT5iaXRiYW5nLm1hc3Rlci0+cHJlcGFyZV9tZXNzYWdlID0gc3BpX2lteF9wcmVwYXJlX21lc3NhZ2U7CiAJc3BpX2lteC0+Yml0YmFuZy5tYXN0ZXItPnVucHJlcGFyZV9tZXNzYWdlID0gc3BpX2lteF91bnByZXBhcmVfbWVzc2FnZTsKIAlzcGlfaW14LT5iaXRiYW5nLm1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIOwotCWlmIChpc19pbXg1MV9lY3NwaShzcGlfaW14KSkKKwlpZiAoaXNfaW14MzVfY3NwaShzcGlfaW14KSB8fCBpc19pbXg1MV9lY3NwaShzcGlfaW14KSkKIAkJc3BpX2lteC0+Yml0YmFuZy5tYXN0ZXItPm1vZGVfYml0cyB8PSBTUElfTE9PUDsKIAogCWluaXRfY29tcGxldGlvbigmc3BpX2lteC0+eGZlcl9kb25lKTsKQEAgLTEyNTEsNiArMTI2OCwxMiBAQAogCQlnb3RvIG91dF9jbGtfcHV0OwogCX0KIAorCWlmICghbWFzdGVyLT5jc19ncGlvcykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBDUyBHUElPcyBhdmFpbGFibGVcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9jbGtfcHV0OworCX0KKwogCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPm51bV9jaGlwc2VsZWN0OyBpKyspIHsKIAkJaWYgKCFncGlvX2lzX3ZhbGlkKG1hc3Rlci0+Y3NfZ3Bpb3NbaV0pKQogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktaXByb2MtcXNwaS5jIGIvZHJpdmVycy9zcGkvc3BpLWlwcm9jLXFzcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTZjY2IyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpLWlwcm9jLXFzcGkuYwpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEJyb2FkY29tIExpbWl0ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJzcGktYmNtLXFzcGkuaCIKKworI2RlZmluZSBJTlRSX0JBU0VfQklUX1NISUZUCQkJMHgwMgorI2RlZmluZSBJTlRSX0NPVU5UCQkJCTB4MDcKKworc3RydWN0IGJjbV9pcHJvY19pbnRjIHsKKwlzdHJ1Y3QgYmNtX3FzcGlfc29jX2ludGMgc29jX2ludGM7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwl2b2lkIF9faW9tZW0gKmludF9yZWc7CisJdm9pZCBfX2lvbWVtICppbnRfc3RhdHVzX3JlZzsKKwlzcGlubG9ja190IHNvY2xvY2s7CisJYm9vbCBiaWdfZW5kaWFuOworfTsKKworc3RhdGljIHUzMiBiY21faXByb2NfcXNwaV9nZXRfbDJfaW50X3N0YXR1cyhzdHJ1Y3QgYmNtX3FzcGlfc29jX2ludGMgKnNvY19pbnRjKQoreworCXN0cnVjdCBiY21faXByb2NfaW50YyAqcHJpdiA9CisJCQljb250YWluZXJfb2Yoc29jX2ludGMsIHN0cnVjdCBiY21faXByb2NfaW50Yywgc29jX2ludGMpOworCXZvaWQgX19pb21lbSAqbW1pbyA9IHByaXYtPmludF9zdGF0dXNfcmVnOworCWludCBpOworCXUzMiB2YWwgPSAwLCBzdHMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IElOVFJfQ09VTlQ7IGkrKykgeworCQlpZiAoYmNtX3FzcGlfcmVhZGwocHJpdi0+YmlnX2VuZGlhbiwgbW1pbyArIChpICogNCkpKQorCQkJdmFsIHw9IDFVTCA8PCBpOworCX0KKworCWlmICh2YWwgJiBJTlRSX01TUElfRE9ORV9NQVNLKQorCQlzdHMgfD0gTVNQSV9ET05FOworCisJaWYgKHZhbCAmIEJTUElfTFJfSU5URVJSVVBUU19BTEwpCisJCXN0cyB8PSBCU1BJX0RPTkU7CisKKwlpZiAodmFsICYgQlNQSV9MUl9JTlRFUlJVUFRTX0VSUk9SKQorCQlzdHMgfD0gQlNQSV9FUlI7CisKKwlyZXR1cm4gc3RzOworfQorCitzdGF0aWMgdm9pZCBiY21faXByb2NfcXNwaV9pbnRfYWNrKHN0cnVjdCBiY21fcXNwaV9zb2NfaW50YyAqc29jX2ludGMsIGludCB0eXBlKQoreworCXN0cnVjdCBiY21faXByb2NfaW50YyAqcHJpdiA9CisJCQljb250YWluZXJfb2Yoc29jX2ludGMsIHN0cnVjdCBiY21faXByb2NfaW50Yywgc29jX2ludGMpOworCXZvaWQgX19pb21lbSAqbW1pbyA9IHByaXYtPmludF9zdGF0dXNfcmVnOworCXUzMiBtYXNrID0gZ2V0X3FzcGlfbWFzayh0eXBlKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJTlRSX0NPVU5UOyBpKyspIHsKKwkJaWYgKG1hc2sgJiAoMVVMIDw8IGkpKQorCQkJYmNtX3FzcGlfd3JpdGVsKHByaXYtPmJpZ19lbmRpYW4sIDEsIG1taW8gKyAoaSAqIDQpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJjbV9pcHJvY19xc3BpX2ludF9zZXQoc3RydWN0IGJjbV9xc3BpX3NvY19pbnRjICpzb2NfaW50YywgaW50IHR5cGUsCisJCQkJICAgYm9vbCBlbikKK3sKKwlzdHJ1Y3QgYmNtX2lwcm9jX2ludGMgKnByaXYgPQorCQkJY29udGFpbmVyX29mKHNvY19pbnRjLCBzdHJ1Y3QgYmNtX2lwcm9jX2ludGMsIHNvY19pbnRjKTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBwcml2LT5pbnRfcmVnOworCXUzMiBtYXNrID0gZ2V0X3FzcGlfbWFzayh0eXBlKTsKKwl1MzIgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c29jbG9jaywgZmxhZ3MpOworCisJdmFsID0gYmNtX3FzcGlfcmVhZGwocHJpdi0+YmlnX2VuZGlhbiwgbW1pbyk7CisKKwlpZiAoZW4pCisJCXZhbCA9IHZhbCB8IChtYXNrIDw8IElOVFJfQkFTRV9CSVRfU0hJRlQpOworCWVsc2UKKwkJdmFsID0gdmFsICYgfihtYXNrIDw8IElOVFJfQkFTRV9CSVRfU0hJRlQpOworCisJYmNtX3FzcGlfd3JpdGVsKHByaXYtPmJpZ19lbmRpYW4sIHZhbCwgbW1pbyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zb2Nsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2lwcm9jX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgYmNtX2lwcm9jX2ludGMgKnByaXY7CisJc3RydWN0IGJjbV9xc3BpX3NvY19pbnRjICpzb2NfaW50YzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCXNvY19pbnRjID0gJnByaXYtPnNvY19pbnRjOworCXByaXYtPnBkZXYgPSBwZGV2OworCisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnNvY2xvY2spOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgImludHJfcmVncyIpOworCXByaXYtPmludF9yZWcgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIocHJpdi0+aW50X3JlZykpCisJCXJldHVybiBQVFJfRVJSKHByaXYtPmludF9yZWcpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwKKwkJCQkJICAgImludHJfc3RhdHVzX3JlZyIpOworCXByaXYtPmludF9zdGF0dXNfcmVnID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHByaXYtPmludF9zdGF0dXNfcmVnKSkKKwkJcmV0dXJuIFBUUl9FUlIocHJpdi0+aW50X3N0YXR1c19yZWcpOworCisJcHJpdi0+YmlnX2VuZGlhbiA9IG9mX2RldmljZV9pc19iaWdfZW5kaWFuKGRldi0+b2Zfbm9kZSk7CisKKwliY21faXByb2NfcXNwaV9pbnRfYWNrKHNvY19pbnRjLCBNU1BJX0JTUElfRE9ORSk7CisJYmNtX2lwcm9jX3FzcGlfaW50X3NldChzb2NfaW50YywgTVNQSV9CU1BJX0RPTkUsIGZhbHNlKTsKKworCXNvY19pbnRjLT5iY21fcXNwaV9pbnRfYWNrID0gYmNtX2lwcm9jX3FzcGlfaW50X2FjazsKKwlzb2NfaW50Yy0+YmNtX3FzcGlfaW50X3NldCA9IGJjbV9pcHJvY19xc3BpX2ludF9zZXQ7CisJc29jX2ludGMtPmJjbV9xc3BpX2dldF9pbnRfc3RhdHVzID0gYmNtX2lwcm9jX3FzcGlfZ2V0X2wyX2ludF9zdGF0dXM7CisKKwlyZXR1cm4gYmNtX3FzcGlfcHJvYmUocGRldiwgc29jX2ludGMpOworfQorCitzdGF0aWMgaW50IGJjbV9pcHJvY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gYmNtX3FzcGlfcmVtb3ZlKHBkZXYpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBiY21faXByb2Nfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImJyY20sc3BpLW5zcC1xc3BpIiB9LAorCXsgLmNvbXBhdGlibGUgPSAiYnJjbSxzcGktbnMyLXFzcGkiIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYmNtX2lwcm9jX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYmNtX2lwcm9jX2RyaXZlciA9IHsKKwkucHJvYmUJCQk9IGJjbV9pcHJvY19wcm9iZSwKKwkucmVtb3ZlCQkJPSBiY21faXByb2NfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9ICJiY21faXByb2MiLAorCQkucG0JCT0gJmJjbV9xc3BpX3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gYmNtX2lwcm9jX29mX21hdGNoLAorCX0KK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGJjbV9pcHJvY19kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKCJLYW1hbCBEYXN1Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNQSSBmbGFzaCBkcml2ZXIgZm9yIEJyb2FkY29tIGlQcm9jIFNvQ3MiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1qY29yZS5jIGIvZHJpdmVycy9zcGkvc3BpLWpjb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgxMTdiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1qY29yZS5jCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICogSi1Db3JlIFNQSSBjb250cm9sbGVyIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDE2IFNtYXJ0IEVuZXJneSBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIEN1cnJlbnQgdmVyc2lvbiBieSBSaWNoIEZlbGtlcgorICogQmFzZWQgbG9vc2VseSBvbiBpbml0aWFsIHZlcnNpb24gYnkgT2xla3NhbmRyIEcgWmhhZGFuCisgKgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjZGVmaW5lIERSVl9OQU1FCSJqY29yZV9zcGkiCisKKyNkZWZpbmUgQ1RSTF9SRUcJMHgwCisjZGVmaW5lIERBVEFfUkVHCTB4NAorCisjZGVmaW5lIEpDT1JFX1NQSV9DVFJMX1hNSVQJCTB4MDIKKyNkZWZpbmUgSkNPUkVfU1BJX1NUQVRfQlVTWQkJMHgwMgorI2RlZmluZSBKQ09SRV9TUElfQ1RSTF9MT09QCQkweDA4CisjZGVmaW5lIEpDT1JFX1NQSV9DVFJMX0NTX0JJVFMJCTB4MTUKKworI2RlZmluZSBKQ09SRV9TUElfV0FJVF9SRFlfTUFYX0xPT1AJMjAwMDAwMAorCitzdHJ1Y3QgamNvcmVfc3BpIHsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwl1bnNpZ25lZCBpbnQgY3NfcmVnOworCXVuc2lnbmVkIGludCBzcGVlZF9yZWc7CisJdW5zaWduZWQgaW50IHNwZWVkX2h6OworCXVuc2lnbmVkIGludCBjbG9ja19mcmVxOworfTsKKworc3RhdGljIGludCBqY29yZV9zcGlfd2FpdCh2b2lkIF9faW9tZW0gKmN0cmxfcmVnKQoreworCXVuc2lnbmVkIHRpbWVvdXQgPSBKQ09SRV9TUElfV0FJVF9SRFlfTUFYX0xPT1A7CisKKwlkbyB7CisJCWlmICghKHJlYWRsKGN0cmxfcmVnKSAmIEpDT1JFX1NQSV9TVEFUX0JVU1kpKQorCQkJcmV0dXJuIDA7CisJCWNwdV9yZWxheCgpOworCX0gd2hpbGUgKC0tdGltZW91dCk7CisKKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgdm9pZCBqY29yZV9zcGlfcHJvZ3JhbShzdHJ1Y3QgamNvcmVfc3BpICpodykKK3sKKwl2b2lkIF9faW9tZW0gKmN0cmxfcmVnID0gaHctPmJhc2UgKyBDVFJMX1JFRzsKKworCWlmIChqY29yZV9zcGlfd2FpdChjdHJsX3JlZykpCisJCWRldl9lcnIoaHctPm1hc3Rlci0+ZGV2LnBhcmVudCwKKwkJCSJ0aW1lb3V0IHdhaXRpbmcgdG8gcHJvZ3JhbSBjdHJsIHJlZy5cbiIpOworCisJd3JpdGVsKGh3LT5jc19yZWcgfCBody0+c3BlZWRfcmVnLCBjdHJsX3JlZyk7Cit9CisKK3N0YXRpYyB2b2lkIGpjb3JlX3NwaV9jaGlwc2VsKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGJvb2wgdmFsdWUpCit7CisJc3RydWN0IGpjb3JlX3NwaSAqaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl1MzIgY3NiaXQgPSAxVSA8PCAoMiAqIHNwaS0+Y2hpcF9zZWxlY3QpOworCisJZGV2X2RiZyhody0+bWFzdGVyLT5kZXYucGFyZW50LCAiY2hpcHNlbGVjdCAlZFxuIiwgc3BpLT5jaGlwX3NlbGVjdCk7CisKKwlpZiAodmFsdWUpCisJCWh3LT5jc19yZWcgfD0gY3NiaXQ7CisJZWxzZQorCQlody0+Y3NfcmVnICY9IH5jc2JpdDsKKworCWpjb3JlX3NwaV9wcm9ncmFtKGh3KTsKK30KKworc3RhdGljIHZvaWQgamNvcmVfc3BpX2JhdWRyYXRlKHN0cnVjdCBqY29yZV9zcGkgKmh3LCBpbnQgc3BlZWQpCit7CisJaWYgKHNwZWVkID09IGh3LT5zcGVlZF9oeikgcmV0dXJuOworCWh3LT5zcGVlZF9oeiA9IHNwZWVkOworCWlmIChzcGVlZCA+PSBody0+Y2xvY2tfZnJlcSAvIDIpCisJCWh3LT5zcGVlZF9yZWcgPSAwOworCWVsc2UKKwkJaHctPnNwZWVkX3JlZyA9ICgoaHctPmNsb2NrX2ZyZXEgLyAyIC8gc3BlZWQpIC0gMSkgPDwgMjc7CisJamNvcmVfc3BpX3Byb2dyYW0oaHcpOworCWRldl9kYmcoaHctPm1hc3Rlci0+ZGV2LnBhcmVudCwgInNwZWVkPSVkIHJlZz0weCV4XG4iLAorCQlzcGVlZCwgaHctPnNwZWVkX3JlZyk7Cit9CisKK3N0YXRpYyBpbnQgamNvcmVfc3BpX3R4cngoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCSAgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwlzdHJ1Y3QgamNvcmVfc3BpICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCXZvaWQgX19pb21lbSAqY3RybF9yZWcgPSBody0+YmFzZSArIENUUkxfUkVHOworCXZvaWQgX19pb21lbSAqZGF0YV9yZWcgPSBody0+YmFzZSArIERBVEFfUkVHOworCXUzMiB4bWl0OworCisJLyogZGF0YSBidWZmZXJzICovCisJY29uc3QgdW5zaWduZWQgY2hhciAqdHg7CisJdW5zaWduZWQgY2hhciAqcng7CisJdW5zaWduZWQgaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisKKwlqY29yZV9zcGlfYmF1ZHJhdGUoaHcsIHQtPnNwZWVkX2h6KTsKKworCXhtaXQgPSBody0+Y3NfcmVnIHwgaHctPnNwZWVkX3JlZyB8IEpDT1JFX1NQSV9DVFJMX1hNSVQ7CisJdHggPSB0LT50eF9idWY7CisJcnggPSB0LT5yeF9idWY7CisJbGVuID0gdC0+bGVuOworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbGVuOyBjb3VudCsrKSB7CisJCWlmIChqY29yZV9zcGlfd2FpdChjdHJsX3JlZykpCisJCQlicmVhazsKKworCQl3cml0ZWwodHggPyAqdHgrKyA6IDAsIGRhdGFfcmVnKTsKKwkJd3JpdGVsKHhtaXQsIGN0cmxfcmVnKTsKKworCQlpZiAoamNvcmVfc3BpX3dhaXQoY3RybF9yZWcpKQorCQkJYnJlYWs7CisKKwkJaWYgKHJ4KQorCQkJKnJ4KysgPSByZWFkbChkYXRhX3JlZyk7CisJfQorCisJc3BpX2ZpbmFsaXplX2N1cnJlbnRfdHJhbnNmZXIobWFzdGVyKTsKKworCWlmIChjb3VudCA8IGxlbikKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqY29yZV9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgamNvcmVfc3BpICpodzsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXUzMiBjbG9ja19mcmVxOworCXN0cnVjdCBjbGsgKmNsazsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBqY29yZV9zcGkpKTsKKwlpZiAoIW1hc3RlcikKKwkJcmV0dXJuIGVycjsKKworCS8qIFNldHVwIHRoZSBtYXN0ZXIgc3RhdGUuICovCisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IDM7CisJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0g7CisJbWFzdGVyLT50cmFuc2Zlcl9vbmUgPSBqY29yZV9zcGlfdHhyeDsKKwltYXN0ZXItPnNldF9jcyA9IGpjb3JlX3NwaV9jaGlwc2VsOworCW1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBub2RlOworCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOworCisJaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJaHctPm1hc3RlciA9IG1hc3RlcjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBodyk7CisKKwkvKiBGaW5kIGFuZCBtYXAgb3VyIHJlc291cmNlcyAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpCisJCWdvdG8gZXhpdF9idXN5OworCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKKwkJCQkgICAgIHJlc291cmNlX3NpemUocmVzKSwgcGRldi0+bmFtZSkpCisJCWdvdG8gZXhpdF9idXN5OworCWh3LT5iYXNlID0gZGV2bV9pb3JlbWFwX25vY2FjaGUoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKKwkJCQkJcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIWh3LT5iYXNlKQorCQlnb3RvIGV4aXRfYnVzeTsKKworCS8qCisJICogVGhlIFNQSSBjbG9jayByYXRlIGNvbnRyb2xsZWQgdmlhIGEgY29uZmlndXJhYmxlIGNsb2NrIGRpdmlkZXIKKwkgKiB3aGljaCBpcyBhcHBsaWVkIHRvIHRoZSByZWZlcmVuY2UgY2xvY2suIEEgNTAgTUh6IHJlZmVyZW5jZSBpcworCSAqIG1vc3Qgc3VpdGFibGUgZm9yIG9idGFpbmluZyBzdGFuZGFyZCBTUEkgY2xvY2sgcmF0ZXMsIGJ1dCBzb21lCisJICogZGVzaWducyBtYXkgaGF2ZSBhIGRpZmZlcmVudCByZWZlcmVuY2UgY2xvY2ssIGFuZCB0aGUgRFQgbXVzdAorCSAqIG1ha2UgdGhlIGRyaXZlciBhd2FyZSBzbyB0aGF0IGl0IGNhbiBwcm9wZXJseSBwcm9ncmFtIHRoZQorCSAqIHJlcXVlc3RlZCByYXRlLiBJZiB0aGUgY2xvY2sgaXMgb21pdHRlZCwgNTAgTUh6IGlzIGFzc3VtZWQuCisJICovCisJY2xvY2tfZnJlcSA9IDUwMDAwMDAwOworCWNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAicmVmX2NsayIpOworCWlmICghSVNfRVJSX09SX05VTEwoY2xrKSkgeworCQlpZiAoY2xrX2VuYWJsZShjbGspID09IDApCisJCQljbG9ja19mcmVxID0gY2xrX2dldF9yYXRlKGNsayk7CisJCWVsc2UKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZW5hYmxlIHJlZl9jbGtcbiIpOworCX0KKwlody0+Y2xvY2tfZnJlcSA9IGNsb2NrX2ZyZXE7CisKKwkvKiBJbml0aWFsaXplIGFsbCBDUyBiaXRzIHRvIGhpZ2guICovCisJaHctPmNzX3JlZyA9IEpDT1JFX1NQSV9DVFJMX0NTX0JJVFM7CisJamNvcmVfc3BpX2JhdWRyYXRlKGh3LCA0MDAwMDApOworCisJLyogUmVnaXN0ZXIgb3VyIHNwaSBjb250cm9sbGVyICovCisJZXJyID0gZGV2bV9zcGlfcmVnaXN0ZXJfbWFzdGVyKCZwZGV2LT5kZXYsIG1hc3Rlcik7CisJaWYgKGVycikKKwkJZ290byBleGl0OworCisJcmV0dXJuIDA7CisKK2V4aXRfYnVzeToKKwllcnIgPSAtRUJVU1k7CitleGl0OgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgamNvcmVfc3BpX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJqY29yZSxzcGkyIiB9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgamNvcmVfc3BpX2RyaXZlciA9IHsKKwkucHJvYmUgPSBqY29yZV9zcGlfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gamNvcmVfc3BpX29mX21hdGNoLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGpjb3JlX3NwaV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkotQ29yZSBTUEkgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJSaWNoIEZlbGtlciA8ZGFsaWFzQGxpYmMub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSVl9OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1sb29wYmFjay10ZXN0LmMgYi9kcml2ZXJzL3NwaS9zcGktbG9vcGJhY2stdGVzdC5jCmluZGV4IGZhYTFiMTMuLjUwZTYyMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1sb29wYmFjay10ZXN0LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWxvb3BiYWNrLXRlc3QuYwpAQCAtNDA1LDcgKzQwNSw3IEBACiAJdTggKmVuZDsKIH07CiAKLWludCByeF9yYW5nZXNfY21wKHZvaWQgKnByaXYsIHN0cnVjdCBsaXN0X2hlYWQgKmEsIHN0cnVjdCBsaXN0X2hlYWQgKmIpCitzdGF0aWMgaW50IHJ4X3Jhbmdlc19jbXAodm9pZCAqcHJpdiwgc3RydWN0IGxpc3RfaGVhZCAqYSwgc3RydWN0IGxpc3RfaGVhZCAqYikKIHsKIAlzdHJ1Y3QgcnhfcmFuZ2VzICpyeF9hID0gbGlzdF9lbnRyeShhLCBzdHJ1Y3QgcnhfcmFuZ2VzLCBsaXN0KTsKIAlzdHJ1Y3QgcnhfcmFuZ2VzICpyeF9iID0gbGlzdF9lbnRyeShiLCBzdHJ1Y3QgcnhfcmFuZ2VzLCBsaXN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1tZXNvbi1zcGlmYy5jIGIvZHJpdmVycy9zcGkvc3BpLW1lc29uLXNwaWZjLmMKaW5kZXggMjQ2NTI1OS4uNjE2NTY2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW1lc29uLXNwaWZjLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW1lc29uLXNwaWZjLmMKQEAgLTQ0Miw2ICs0NDIsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtZXNvbl9zcGlmY19kdF9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAiYW1sb2dpYyxtZXNvbjYtc3BpZmMiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiYW1sb2dpYyxtZXNvbi1neGJiLXNwaWZjIiwgfSwKIAl7IH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbWVzb25fc3BpZmNfZHRfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW10NjV4eC5jIGIvZHJpdmVycy9zcGkvc3BpLW10NjV4eC5jCmluZGV4IDBiZTg5ZTAuLjg5OWQ3YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1tdDY1eHguYworKysgYi9kcml2ZXJzL3NwaS9zcGktbXQ2NXh4LmMKQEAgLTY4NSw3ICs2ODUsNiBAQAogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIAogCW10a19zcGlfcmVzZXQobWRhdGEpOwotCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1waWMzMi1zcWkuYyBiL2RyaXZlcnMvc3BpL3NwaS1waWMzMi1zcWkuYwppbmRleCBjNDFhYmRkLi5iZDFjNmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktcGljMzItc3FpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXBpYzMyLXNxaS5jCkBAIC0yNTMsMTUgKzI1MywxMyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCXJkZXNjID0gbGlzdF9maXJzdF9lbnRyeSgmc3FpLT5iZF9saXN0X2ZyZWUsIHN0cnVjdCByaW5nX2Rlc2MsIGxpc3QpOwotCWxpc3RfZGVsKCZyZGVzYy0+bGlzdCk7Ci0JbGlzdF9hZGRfdGFpbCgmcmRlc2MtPmxpc3QsICZzcWktPmJkX2xpc3RfdXNlZCk7CisJbGlzdF9tb3ZlX3RhaWwoJnJkZXNjLT5saXN0LCAmc3FpLT5iZF9saXN0X3VzZWQpOwogCXJldHVybiByZGVzYzsKIH0KIAogc3RhdGljIHZvaWQgcmluZ19kZXNjX3B1dChzdHJ1Y3QgcGljMzJfc3FpICpzcWksIHN0cnVjdCByaW5nX2Rlc2MgKnJkZXNjKQogewotCWxpc3RfZGVsKCZyZGVzYy0+bGlzdCk7Ci0JbGlzdF9hZGQoJnJkZXNjLT5saXN0LCAmc3FpLT5iZF9saXN0X2ZyZWUpOworCWxpc3RfbW92ZSgmcmRlc2MtPmxpc3QsICZzcWktPmJkX2xpc3RfZnJlZSk7CiB9CiAKIHN0YXRpYyBpbnQgcGljMzJfc3FpX29uZV90cmFuc2ZlcihzdHJ1Y3QgcGljMzJfc3FpICpzcWksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LWRtYS5jIGIvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1kbWEuYwppbmRleCBkYjNhZTFkLi4wNGYzZWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LWRtYS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1weGEyeHgtZG1hLmMKQEAgLTIzLDcgKzIzLDcgQEAKIHN0YXRpYyB2b2lkIHB4YTJ4eF9zcGlfZG1hX3RyYW5zZmVyX2NvbXBsZXRlKHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEsCiAJCQkJCSAgICAgYm9vbCBlcnJvcikKIHsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9IGRydl9kYXRhLT5jdXJfbXNnOworCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnID0gZHJ2X2RhdGEtPm1hc3Rlci0+Y3VyX21zZzsKIAogCS8qCiAJICogSXQgaXMgcG9zc2libGUgdGhhdCBvbmUgQ1BVIGlzIGhhbmRsaW5nIFJPUiBpbnRlcnJ1cHQgYW5kIG90aGVyCkBAIC03Niw3ICs3Niw4IEBACiBweGEyeHhfc3BpX2RtYV9wcmVwYXJlX29uZShzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhLAogCQkJICAgZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpcikKIHsKLQlzdHJ1Y3QgY2hpcF9kYXRhICpjaGlwID0gZHJ2X2RhdGEtPmN1cl9jaGlwOworCXN0cnVjdCBjaGlwX2RhdGEgKmNoaXAgPQorCQlzcGlfZ2V0X2N0bGRhdGEoZHJ2X2RhdGEtPm1hc3Rlci0+Y3VyX21zZy0+c3BpKTsKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyID0gZHJ2X2RhdGEtPmN1cl90cmFuc2ZlcjsKIAllbnVtIGRtYV9zbGF2ZV9idXN3aWR0aCB3aWR0aDsKIAlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBjZmc7CkBAIC0xNDYsNyArMTQ3LDcgQEAKIGludCBweGEyeHhfc3BpX2RtYV9wcmVwYXJlKHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEsIHUzMiBkbWFfYnVyc3QpCiB7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eF9kZXNjLCAqcnhfZGVzYzsKLQlpbnQgZXJyID0gMDsKKwlpbnQgZXJyOwogCiAJdHhfZGVzYyA9IHB4YTJ4eF9zcGlfZG1hX3ByZXBhcmVfb25lKGRydl9kYXRhLCBETUFfTUVNX1RPX0RFVik7CiAJaWYgKCF0eF9kZXNjKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LXBjaS5jIGIvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1wY2kuYwppbmRleCBmM2RmNTIyLi41OGQyZDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LXBjaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1weGEyeHgtcGNpLmMKQEAgLTIxNCw2ICsyMTQsNyBAQAogCQlyZXR1cm4gUFRSX0VSUihzc3AtPmNsayk7CiAKIAltZW1zZXQoJnBpLCAwLCBzaXplb2YocGkpKTsKKwlwaS5md25vZGUgPSBkZXYtPmRldi5md25vZGU7CiAJcGkucGFyZW50ID0gJmRldi0+ZGV2OwogCXBpLm5hbWUgPSAicHhhMnh4LXNwaSI7CiAJcGkuaWQgPSBzc3AtPnBvcnRfaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LmMgYi9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LmMKaW5kZXggODcxNTBhMS4uZGQ3YjViNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1weGEyeHguYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KQEAgLTYyLDYgKzYzLDEzIEBACiAJCQkJfCBRVUFSS19YMTAwMF9TU0NSMV9URlQJCVwKIAkJCQl8IFNTQ1IxX1NQSCB8IFNTQ1IxX1NQTyB8IFNTQ1IxX0xCTSkKIAorI2RlZmluZSBDRTQxMDBfU1NDUjFfQ0hBTkdFX01BU0sgKFNTQ1IxX1RURUxQIHwgU1NDUjFfVFRFIHwgU1NDUjFfU0NGUiBcCisJCQkJfCBTU0NSMV9FQ1JBIHwgU1NDUjFfRUNSQiB8IFNTQ1IxX1NDTEtESVIgXAorCQkJCXwgU1NDUjFfU0ZSTURJUiB8IFNTQ1IxX1JXT1QgfCBTU0NSMV9UUkFJTCBcCisJCQkJfCBTU0NSMV9JRlMgfCBTU0NSMV9TVFJGIHwgU1NDUjFfRUZXUiBcCisJCQkJfCBDRTQxMDBfU1NDUjFfUkZUIHwgQ0U0MTAwX1NTQ1IxX1RGVCB8IFNTQ1IxX01XRFMgXAorCQkJCXwgU1NDUjFfU1BIIHwgU1NDUjFfU1BPIHwgU1NDUjFfTEJNKQorCiAjZGVmaW5lIExQU1NfR0VORVJBTF9SRUdfUlhUT19IT0xET0ZGX0RJU0FCTEUJQklUKDI0KQogI2RlZmluZSBMUFNTX0NTX0NPTlRST0xfU1dfTU9ERQkJCUJJVCgwKQogI2RlZmluZSBMUFNTX0NTX0NPTlRST0xfQ1NfSElHSAkJCUJJVCgxKQpAQCAtMTc1LDYgKzE4Myw4IEBACiAJc3dpdGNoIChkcnZfZGF0YS0+c3NwX3R5cGUpIHsKIAljYXNlIFFVQVJLX1gxMDAwX1NTUDoKIAkJcmV0dXJuIFFVQVJLX1gxMDAwX1NTQ1IxX0NIQU5HRV9NQVNLOworCWNhc2UgQ0U0MTAwX1NTUDoKKwkJcmV0dXJuIENFNDEwMF9TU0NSMV9DSEFOR0VfTUFTSzsKIAlkZWZhdWx0OgogCQlyZXR1cm4gU1NDUjFfQ0hBTkdFX01BU0s7CiAJfQpAQCAtMTg2LDYgKzE5Niw4IEBACiAJc3dpdGNoIChkcnZfZGF0YS0+c3NwX3R5cGUpIHsKIAljYXNlIFFVQVJLX1gxMDAwX1NTUDoKIAkJcmV0dXJuIFJYX1RIUkVTSF9RVUFSS19YMTAwMF9ERkxUOworCWNhc2UgQ0U0MTAwX1NTUDoKKwkJcmV0dXJuIFJYX1RIUkVTSF9DRTQxMDBfREZMVDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gUlhfVEhSRVNIX0RGTFQ7CiAJfQpAQCAtMTk5LDYgKzIxMSw5IEBACiAJY2FzZSBRVUFSS19YMTAwMF9TU1A6CiAJCW1hc2sgPSBRVUFSS19YMTAwMF9TU1NSX1RGTF9NQVNLOwogCQlicmVhazsKKwljYXNlIENFNDEwMF9TU1A6CisJCW1hc2sgPSBDRTQxMDBfU1NTUl9URkxfTUFTSzsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbWFzayA9IFNTU1JfVEZMX01BU0s7CiAJCWJyZWFrOwpAQCAtMjE2LDYgKzIzMSw5IEBACiAJY2FzZSBRVUFSS19YMTAwMF9TU1A6CiAJCW1hc2sgPSBRVUFSS19YMTAwMF9TU0NSMV9SRlQ7CiAJCWJyZWFrOworCWNhc2UgQ0U0MTAwX1NTUDoKKwkJbWFzayA9IENFNDEwMF9TU0NSMV9SRlQ7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCW1hc2sgPSBTU0NSMV9SRlQ7CiAJCWJyZWFrOwpAQCAtMjMwLDYgKzI0OCw5IEBACiAJY2FzZSBRVUFSS19YMTAwMF9TU1A6CiAJCSpzY2NyMV9yZWcgfD0gUVVBUktfWDEwMDBfU1NDUjFfUnhUcmVzaCh0aHJlc2hvbGQpOwogCQlicmVhazsKKwljYXNlIENFNDEwMF9TU1A6CisJCSpzY2NyMV9yZWcgfD0gQ0U0MTAwX1NTQ1IxX1J4VHJlc2godGhyZXNob2xkKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJKnNjY3IxX3JlZyB8PSBTU0NSMV9SeFRyZXNoKHRocmVzaG9sZCk7CiAJCWJyZWFrOwpAQCAtMzE2LDcgKzMzNyw3IEBACiAKIAl2YWx1ZSA9IF9fbHBzc19zc3BfcmVhZF9wcml2KGRydl9kYXRhLCBjb25maWctPnJlZ19jc19jdHJsKTsKIAotCWNzID0gZHJ2X2RhdGEtPmN1cl9tc2ctPnNwaS0+Y2hpcF9zZWxlY3Q7CisJY3MgPSBkcnZfZGF0YS0+bWFzdGVyLT5jdXJfbXNnLT5zcGktPmNoaXBfc2VsZWN0OwogCWNzIDw8PSBjb25maWctPmNzX3NlbF9zaGlmdDsKIAlpZiAoY3MgIT0gKHZhbHVlICYgY29uZmlnLT5jc19zZWxfbWFzaykpIHsKIAkJLyoKQEAgLTM1NSwxMCArMzc2LDExIEBACiAKIHN0YXRpYyB2b2lkIGNzX2Fzc2VydChzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhKQogewotCXN0cnVjdCBjaGlwX2RhdGEgKmNoaXAgPSBkcnZfZGF0YS0+Y3VyX2NoaXA7CisJc3RydWN0IGNoaXBfZGF0YSAqY2hpcCA9CisJCXNwaV9nZXRfY3RsZGF0YShkcnZfZGF0YS0+bWFzdGVyLT5jdXJfbXNnLT5zcGkpOwogCiAJaWYgKGRydl9kYXRhLT5zc3BfdHlwZSA9PSBDRTQxMDBfU1NQKSB7Ci0JCXB4YTJ4eF9zcGlfd3JpdGUoZHJ2X2RhdGEsIFNTU1IsIGRydl9kYXRhLT5jdXJfY2hpcC0+ZnJtKTsKKwkJcHhhMnh4X3NwaV93cml0ZShkcnZfZGF0YSwgU1NTUiwgY2hpcC0+ZnJtKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzc4LDcgKzQwMCw4IEBACiAKIHN0YXRpYyB2b2lkIGNzX2RlYXNzZXJ0KHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEpCiB7Ci0Jc3RydWN0IGNoaXBfZGF0YSAqY2hpcCA9IGRydl9kYXRhLT5jdXJfY2hpcDsKKwlzdHJ1Y3QgY2hpcF9kYXRhICpjaGlwID0KKwkJc3BpX2dldF9jdGxkYXRhKGRydl9kYXRhLT5tYXN0ZXItPmN1cl9tc2ctPnNwaSk7CiAKIAlpZiAoZHJ2X2RhdGEtPnNzcF90eXBlID09IENFNDEwMF9TU1ApCiAJCXJldHVybjsKQEAgLTUwOCw3ICs1MzEsNyBAQAogCiB2b2lkICpweGEyeHhfc3BpX25leHRfdHJhbnNmZXIoc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSkKIHsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9IGRydl9kYXRhLT5jdXJfbXNnOworCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnID0gZHJ2X2RhdGEtPm1hc3Rlci0+Y3VyX21zZzsKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0cmFucyA9IGRydl9kYXRhLT5jdXJfdHJhbnNmZXI7CiAKIAkvKiBNb3ZlIHRvIG5leHQgdHJhbnNmZXIgKi8KQEAgLTUyOSw4ICs1NTIsNyBAQAogCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnOwogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAotCW1zZyA9IGRydl9kYXRhLT5jdXJfbXNnOwotCWRydl9kYXRhLT5jdXJfbXNnID0gTlVMTDsKKwltc2cgPSBkcnZfZGF0YS0+bWFzdGVyLT5jdXJfbXNnOwogCWRydl9kYXRhLT5jdXJfdHJhbnNmZXIgPSBOVUxMOwogCiAJbGFzdF90cmFuc2ZlciA9IGxpc3RfbGFzdF9lbnRyeSgmbXNnLT50cmFuc2ZlcnMsIHN0cnVjdCBzcGlfdHJhbnNmZXIsCkBAIC01NzUsMTMgKzU5NywxMyBAQAogCQkJY3NfZGVhc3NlcnQoZHJ2X2RhdGEpOwogCX0KIAotCWRydl9kYXRhLT5jdXJfY2hpcCA9IE5VTEw7CiAJc3BpX2ZpbmFsaXplX2N1cnJlbnRfbWVzc2FnZShkcnZfZGF0YS0+bWFzdGVyKTsKIH0KIAogc3RhdGljIHZvaWQgcmVzZXRfc2NjcjEoc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSkKIHsKLQlzdHJ1Y3QgY2hpcF9kYXRhICpjaGlwID0gZHJ2X2RhdGEtPmN1cl9jaGlwOworCXN0cnVjdCBjaGlwX2RhdGEgKmNoaXAgPQorCQlzcGlfZ2V0X2N0bGRhdGEoZHJ2X2RhdGEtPm1hc3Rlci0+Y3VyX21zZy0+c3BpKTsKIAl1MzIgc2NjcjFfcmVnOwogCiAJc2NjcjFfcmVnID0gcHhhMnh4X3NwaV9yZWFkKGRydl9kYXRhLCBTU0NSMSkgJiB+ZHJ2X2RhdGEtPmludF9jcjE7CkBAIC01ODksNiArNjExLDkgQEAKIAljYXNlIFFVQVJLX1gxMDAwX1NTUDoKIAkJc2NjcjFfcmVnICY9IH5RVUFSS19YMTAwMF9TU0NSMV9SRlQ7CiAJCWJyZWFrOworCWNhc2UgQ0U0MTAwX1NTUDoKKwkJc2NjcjFfcmVnICY9IH5DRTQxMDBfU1NDUjFfUkZUOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlzY2NyMV9yZWcgJj0gflNTQ1IxX1JGVDsKIAkJYnJlYWs7CkBAIC02MTAsNyArNjM1LDcgQEAKIAogCWRldl9lcnIoJmRydl9kYXRhLT5wZGV2LT5kZXYsICIlc1xuIiwgbXNnKTsKIAotCWRydl9kYXRhLT5jdXJfbXNnLT5zdGF0ZSA9IEVSUk9SX1NUQVRFOworCWRydl9kYXRhLT5tYXN0ZXItPmN1cl9tc2ctPnN0YXRlID0gRVJST1JfU1RBVEU7CiAJdGFza2xldF9zY2hlZHVsZSgmZHJ2X2RhdGEtPnB1bXBfdHJhbnNmZXJzKTsKIH0KIApAQCAtNjIzLDcgKzY0OCw3IEBACiAJCXB4YTJ4eF9zcGlfd3JpdGUoZHJ2X2RhdGEsIFNTVE8sIDApOwogCiAJLyogVXBkYXRlIHRvdGFsIGJ5dGUgdHJhbnNmZXJyZWQgcmV0dXJuIGNvdW50IGFjdHVhbCBieXRlcyByZWFkICovCi0JZHJ2X2RhdGEtPmN1cl9tc2ctPmFjdHVhbF9sZW5ndGggKz0gZHJ2X2RhdGEtPmxlbiAtCisJZHJ2X2RhdGEtPm1hc3Rlci0+Y3VyX21zZy0+YWN0dWFsX2xlbmd0aCArPSBkcnZfZGF0YS0+bGVuIC0KIAkJCQkoZHJ2X2RhdGEtPnJ4X2VuZCAtIGRydl9kYXRhLT5yeCk7CiAKIAkvKiBUcmFuc2ZlciBkZWxheXMgYW5kIGNoaXAgc2VsZWN0IHJlbGVhc2UgYXJlCkBAIC02MzEsNyArNjU2LDcgQEAKIAkgKi8KIAogCS8qIE1vdmUgdG8gbmV4dCB0cmFuc2ZlciAqLwotCWRydl9kYXRhLT5jdXJfbXNnLT5zdGF0ZSA9IHB4YTJ4eF9zcGlfbmV4dF90cmFuc2ZlcihkcnZfZGF0YSk7CisJZHJ2X2RhdGEtPm1hc3Rlci0+Y3VyX21zZy0+c3RhdGUgPSBweGEyeHhfc3BpX25leHRfdHJhbnNmZXIoZHJ2X2RhdGEpOwogCiAJLyogU2NoZWR1bGUgdHJhbnNmZXIgdGFza2xldCAqLwogCXRhc2tsZXRfc2NoZWR1bGUoJmRydl9kYXRhLT5wdW1wX3RyYW5zZmVycyk7CkBAIC03NDYsNyArNzcxLDcgQEAKIAlpZiAoIShzdGF0dXMgJiBtYXNrKSkKIAkJcmV0dXJuIElSUV9OT05FOwogCi0JaWYgKCFkcnZfZGF0YS0+Y3VyX21zZykgeworCWlmICghZHJ2X2RhdGEtPm1hc3Rlci0+Y3VyX21zZykgewogCiAJCXB4YTJ4eF9zcGlfd3JpdGUoZHJ2X2RhdGEsIFNTQ1IwLAogCQkJCSBweGEyeHhfc3BpX3JlYWQoZHJ2X2RhdGEsIFNTQ1IwKQpAQCAtOTA1LDcgKzkzMCw4IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHB4YTJ4eF9zc3BfZ2V0X2Nsa19kaXYoc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSwKIAkJCQkJICAgaW50IHJhdGUpCiB7Ci0Jc3RydWN0IGNoaXBfZGF0YSAqY2hpcCA9IGRydl9kYXRhLT5jdXJfY2hpcDsKKwlzdHJ1Y3QgY2hpcF9kYXRhICpjaGlwID0KKwkJc3BpX2dldF9jdGxkYXRhKGRydl9kYXRhLT5tYXN0ZXItPmN1cl9tc2ctPnNwaSk7CiAJdW5zaWduZWQgaW50IGNsa19kaXY7CiAKIAlzd2l0Y2ggKGRydl9kYXRhLT5zc3BfdHlwZSkgewpAQCAtOTM0LDI1ICs5NjAsMjMgQEAKIHsKIAlzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhID0gKHN0cnVjdCBkcml2ZXJfZGF0YSAqKWRhdGE7CiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRydl9kYXRhLT5tYXN0ZXI7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlICptZXNzYWdlID0gTlVMTDsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0cmFuc2ZlciA9IE5VTEw7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqcHJldmlvdXMgPSBOVUxMOwotCXN0cnVjdCBjaGlwX2RhdGEgKmNoaXAgPSBOVUxMOwotCXUzMiBjbGtfZGl2ID0gMDsKLQl1OCBiaXRzID0gMDsKLQl1MzIgc3BlZWQgPSAwOworCXN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzc2FnZSA9IG1hc3Rlci0+Y3VyX21zZzsKKwlzdHJ1Y3QgY2hpcF9kYXRhICpjaGlwID0gc3BpX2dldF9jdGxkYXRhKG1lc3NhZ2UtPnNwaSk7CisJdTMyIGRtYV90aHJlc2ggPSBjaGlwLT5kbWFfdGhyZXNob2xkOworCXUzMiBkbWFfYnVyc3QgPSBjaGlwLT5kbWFfYnVyc3Rfc2l6ZTsKKwl1MzIgY2hhbmdlX21hc2sgPSBweGEyeHhfc3BpX2dldF9zc3JjMV9jaGFuZ2VfbWFzayhkcnZfZGF0YSk7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdHJhbnNmZXI7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqcHJldmlvdXM7CisJdTMyIGNsa19kaXY7CisJdTggYml0czsKKwl1MzIgc3BlZWQ7CiAJdTMyIGNyMDsKIAl1MzIgY3IxOwotCXUzMiBkbWFfdGhyZXNoID0gZHJ2X2RhdGEtPmN1cl9jaGlwLT5kbWFfdGhyZXNob2xkOwotCXUzMiBkbWFfYnVyc3QgPSBkcnZfZGF0YS0+Y3VyX2NoaXAtPmRtYV9idXJzdF9zaXplOwotCXUzMiBjaGFuZ2VfbWFzayA9IHB4YTJ4eF9zcGlfZ2V0X3NzcmMxX2NoYW5nZV9tYXNrKGRydl9kYXRhKTsKIAlpbnQgZXJyOwogCWludCBkbWFfbWFwcGVkOwogCiAJLyogR2V0IGN1cnJlbnQgc3RhdGUgaW5mb3JtYXRpb24gKi8KLQltZXNzYWdlID0gZHJ2X2RhdGEtPmN1cl9tc2c7CiAJdHJhbnNmZXIgPSBkcnZfZGF0YS0+Y3VyX3RyYW5zZmVyOwotCWNoaXAgPSBkcnZfZGF0YS0+Y3VyX2NoaXA7CiAKIAkvKiBIYW5kbGUgZm9yIGFib3J0ICovCiAJaWYgKG1lc3NhZ2UtPnN0YXRlID09IEVSUk9SX1NUQVRFKSB7CkBAIC0xMTQ2LDE3ICsxMTcwLDEyIEBACiB7CiAJc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAotCWRydl9kYXRhLT5jdXJfbXNnID0gbXNnOwogCS8qIEluaXRpYWwgbWVzc2FnZSBzdGF0ZSovCi0JZHJ2X2RhdGEtPmN1cl9tc2ctPnN0YXRlID0gU1RBUlRfU1RBVEU7Ci0JZHJ2X2RhdGEtPmN1cl90cmFuc2ZlciA9IGxpc3RfZW50cnkoZHJ2X2RhdGEtPmN1cl9tc2ctPnRyYW5zZmVycy5uZXh0LAorCW1zZy0+c3RhdGUgPSBTVEFSVF9TVEFURTsKKwlkcnZfZGF0YS0+Y3VyX3RyYW5zZmVyID0gbGlzdF9lbnRyeShtc2ctPnRyYW5zZmVycy5uZXh0LAogCQkJCQkJc3RydWN0IHNwaV90cmFuc2ZlciwKIAkJCQkJCXRyYW5zZmVyX2xpc3QpOwogCi0JLyogcHJlcGFyZSB0byBzZXR1cCB0aGUgU1NQLCBpbiBwdW1wX3RyYW5zZmVycywgdXNpbmcgdGhlIHBlcgotCSAqIGNoaXAgY29uZmlndXJhdGlvbiAqLwotCWRydl9kYXRhLT5jdXJfY2hpcCA9IHNwaV9nZXRfY3RsZGF0YShkcnZfZGF0YS0+Y3VyX21zZy0+c3BpKTsKLQogCS8qIE1hcmsgYXMgYnVzeSBhbmQgbGF1bmNoIHRyYW5zZmVycyAqLwogCXRhc2tsZXRfc2NoZWR1bGUoJmRydl9kYXRhLT5wdW1wX3RyYW5zZmVycyk7CiAJcmV0dXJuIDA7CkBAIC0xMTc2LDkgKzExOTUsMjYgQEAKIHN0YXRpYyBpbnQgc2V0dXBfY3Moc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IGNoaXBfZGF0YSAqY2hpcCwKIAkJICAgIHN0cnVjdCBweGEyeHhfc3BpX2NoaXAgKmNoaXBfaW5mbykKIHsKKwlzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CiAJaW50IGVyciA9IDA7CiAKLQlpZiAoY2hpcCA9PSBOVUxMIHx8IGNoaXBfaW5mbyA9PSBOVUxMKQorCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiAwOworCisJaWYgKGRydl9kYXRhLT5jc19ncGlvZHMpIHsKKwkJc3RydWN0IGdwaW9fZGVzYyAqZ3Bpb2Q7CisKKwkJZ3Bpb2QgPSBkcnZfZGF0YS0+Y3NfZ3Bpb2RzW3NwaS0+Y2hpcF9zZWxlY3RdOworCQlpZiAoZ3Bpb2QpIHsKKwkJCWNoaXAtPmdwaW9fY3MgPSBkZXNjX3RvX2dwaW8oZ3Bpb2QpOworCQkJY2hpcC0+Z3Bpb19jc19pbnZlcnRlZCA9IHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIOworCQkJZ3Bpb2Rfc2V0X3ZhbHVlKGdwaW9kLCBjaGlwLT5ncGlvX2NzX2ludmVydGVkKTsKKwkJfQorCisJCXJldHVybiAwOworCX0KKworCWlmIChjaGlwX2luZm8gPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKIAkvKiBOT1RFOiBzZXR1cCgpIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIHBvc3NpYmx5IHdpdGgKQEAgLTEyMTMsNyArMTI0OSw3IEBACiAKIHN0YXRpYyBpbnQgc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlzdHJ1Y3QgcHhhMnh4X3NwaV9jaGlwICpjaGlwX2luZm8gPSBOVUxMOworCXN0cnVjdCBweGEyeHhfc3BpX2NoaXAgKmNoaXBfaW5mbzsKIAlzdHJ1Y3QgY2hpcF9kYXRhICpjaGlwOwogCWNvbnN0IHN0cnVjdCBscHNzX2NvbmZpZyAqY29uZmlnOwogCXN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKQEAgLTEyMjUsNiArMTI2MSwxMSBAQAogCQl0eF9oaV90aHJlcyA9IDA7CiAJCXJ4X3RocmVzID0gUlhfVEhSRVNIX1FVQVJLX1gxMDAwX0RGTFQ7CiAJCWJyZWFrOworCWNhc2UgQ0U0MTAwX1NTUDoKKwkJdHhfdGhyZXMgPSBUWF9USFJFU0hfQ0U0MTAwX0RGTFQ7CisJCXR4X2hpX3RocmVzID0gMDsKKwkJcnhfdGhyZXMgPSBSWF9USFJFU0hfQ0U0MTAwX0RGTFQ7CisJCWJyZWFrOwogCWNhc2UgTFBTU19MUFRfU1NQOgogCWNhc2UgTFBTU19CWVRfU1NQOgogCWNhc2UgTFBTU19CU1dfU1NQOgpAQCAtMTMwOSw2ICsxMzUwLDEwIEBACiAJCQkJICAgfCAoUVVBUktfWDEwMDBfU1NDUjFfVHhUcmVzaCh0eF90aHJlcykKIAkJCQkgICAmIFFVQVJLX1gxMDAwX1NTQ1IxX1RGVCk7CiAJCWJyZWFrOworCWNhc2UgQ0U0MTAwX1NTUDoKKwkJY2hpcC0+dGhyZXNob2xkID0gKENFNDEwMF9TU0NSMV9SeFRyZXNoKHJ4X3RocmVzKSAmIENFNDEwMF9TU0NSMV9SRlQpIHwKKwkJCShDRTQxMDBfU1NDUjFfVHhUcmVzaCh0eF90aHJlcykgJiBDRTQxMDBfU1NDUjFfVEZUKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJY2hpcC0+dGhyZXNob2xkID0gKFNTQ1IxX1J4VHJlc2gocnhfdGhyZXMpICYgU1NDUjFfUkZUKSB8CiAJCQkoU1NDUjFfVHhUcmVzaCh0eF90aHJlcykgJiBTU0NSMV9URlQpOwpAQCAtMTM1Miw3ICsxMzk3LDggQEAKIAlpZiAoIWNoaXApCiAJCXJldHVybjsKIAotCWlmIChkcnZfZGF0YS0+c3NwX3R5cGUgIT0gQ0U0MTAwX1NTUCAmJiBncGlvX2lzX3ZhbGlkKGNoaXAtPmdwaW9fY3MpKQorCWlmIChkcnZfZGF0YS0+c3NwX3R5cGUgIT0gQ0U0MTAwX1NTUCAmJiAhZHJ2X2RhdGEtPmNzX2dwaW9kcyAmJgorCSAgICBncGlvX2lzX3ZhbGlkKGNoaXAtPmdwaW9fY3MpKQogCQlncGlvX2ZyZWUoY2hpcC0+Z3Bpb19jcyk7CiAKIAlrZnJlZShjaGlwKTsKQEAgLTE1MzAsNyArMTU3Niw3IEBACiAJc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YTsKIAlzdHJ1Y3Qgc3NwX2RldmljZSAqc3NwOwogCWNvbnN0IHN0cnVjdCBscHNzX2NvbmZpZyAqY29uZmlnOwotCWludCBzdGF0dXM7CisJaW50IHN0YXR1cywgY291bnQ7CiAJdTMyIHRtcDsKIAogCXBsYXRmb3JtX2luZm8gPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CkBAIC0xNjMwLDE1ICsxNjc2LDIwIEBACiAJcHhhMnh4X3NwaV93cml0ZShkcnZfZGF0YSwgU1NDUjAsIDApOwogCXN3aXRjaCAoZHJ2X2RhdGEtPnNzcF90eXBlKSB7CiAJY2FzZSBRVUFSS19YMTAwMF9TU1A6Ci0JCXRtcCA9IFFVQVJLX1gxMDAwX1NTQ1IxX1J4VHJlc2goUlhfVEhSRVNIX1FVQVJLX1gxMDAwX0RGTFQpCi0JCSAgICAgIHwgUVVBUktfWDEwMDBfU1NDUjFfVHhUcmVzaChUWF9USFJFU0hfUVVBUktfWDEwMDBfREZMVCk7CisJCXRtcCA9IFFVQVJLX1gxMDAwX1NTQ1IxX1J4VHJlc2goUlhfVEhSRVNIX1FVQVJLX1gxMDAwX0RGTFQpIHwKKwkJICAgICAgUVVBUktfWDEwMDBfU1NDUjFfVHhUcmVzaChUWF9USFJFU0hfUVVBUktfWDEwMDBfREZMVCk7CiAJCXB4YTJ4eF9zcGlfd3JpdGUoZHJ2X2RhdGEsIFNTQ1IxLCB0bXApOwogCiAJCS8qIHVzaW5nIHRoZSBNb3Rvcm9sYSBTUEkgcHJvdG9jb2wgYW5kIHVzZSA4IGJpdCBmcmFtZSAqLwotCQlweGEyeHhfc3BpX3dyaXRlKGRydl9kYXRhLCBTU0NSMCwKLQkJCQkgUVVBUktfWDEwMDBfU1NDUjBfTW90b3JvbGEKLQkJCQkgfCBRVUFSS19YMTAwMF9TU0NSMF9EYXRhU2l6ZSg4KSk7CisJCXRtcCA9IFFVQVJLX1gxMDAwX1NTQ1IwX01vdG9yb2xhIHwgUVVBUktfWDEwMDBfU1NDUjBfRGF0YVNpemUoOCk7CisJCXB4YTJ4eF9zcGlfd3JpdGUoZHJ2X2RhdGEsIFNTQ1IwLCB0bXApOwogCQlicmVhazsKKwljYXNlIENFNDEwMF9TU1A6CisJCXRtcCA9IENFNDEwMF9TU0NSMV9SeFRyZXNoKFJYX1RIUkVTSF9DRTQxMDBfREZMVCkgfAorCQkgICAgICBDRTQxMDBfU1NDUjFfVHhUcmVzaChUWF9USFJFU0hfQ0U0MTAwX0RGTFQpOworCQlweGEyeHhfc3BpX3dyaXRlKGRydl9kYXRhLCBTU0NSMSwgdG1wKTsKKwkJdG1wID0gU1NDUjBfU0NSKDIpIHwgU1NDUjBfTW90b3JvbGEgfCBTU0NSMF9EYXRhU2l6ZSg4KTsKKwkJcHhhMnh4X3NwaV93cml0ZShkcnZfZGF0YSwgU1NDUjAsIHRtcCk7CiAJZGVmYXVsdDoKIAkJdG1wID0gU1NDUjFfUnhUcmVzaChSWF9USFJFU0hfREZMVCkgfAogCQkgICAgICBTU0NSMV9UeFRyZXNoKFRYX1RIUkVTSF9ERkxUKTsKQEAgLTE2NjksNiArMTcyMCwzOSBAQAogCX0KIAltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gcGxhdGZvcm1faW5mby0+bnVtX2NoaXBzZWxlY3Q7CiAKKwljb3VudCA9IGdwaW9kX2NvdW50KCZwZGV2LT5kZXYsICJjcyIpOworCWlmIChjb3VudCA+IDApIHsKKwkJaW50IGk7CisKKwkJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IG1heF90KGludCwgY291bnQsCisJCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0KTsKKworCQlkcnZfZGF0YS0+Y3NfZ3Bpb2RzID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsCisJCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0LCBzaXplb2Yoc3RydWN0IGdwaW9fZGVzYyAqKSwKKwkJCUdGUF9LRVJORUwpOworCQlpZiAoIWRydl9kYXRhLT5jc19ncGlvZHMpIHsKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9lcnJvcl9jbG9ja19lbmFibGVkOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IG1hc3Rlci0+bnVtX2NoaXBzZWxlY3Q7IGkrKykgeworCQkJc3RydWN0IGdwaW9fZGVzYyAqZ3Bpb2Q7CisKKwkJCWdwaW9kID0gZGV2bV9ncGlvZF9nZXRfaW5kZXgoZGV2LCAiY3MiLCBpLAorCQkJCQkJICAgICBHUElPRF9PVVRfSElHSCk7CisJCQlpZiAoSVNfRVJSKGdwaW9kKSkgeworCQkJCS8qIE1lYW5zIHVzZSBuYXRpdmUgY2hpcCBzZWxlY3QgKi8KKwkJCQlpZiAoUFRSX0VSUihncGlvZCkgPT0gLUVOT0VOVCkKKwkJCQkJY29udGludWU7CisKKwkJCQlzdGF0dXMgPSAoaW50KVBUUl9FUlIoZ3Bpb2QpOworCQkJCWdvdG8gb3V0X2Vycm9yX2Nsb2NrX2VuYWJsZWQ7CisJCQl9IGVsc2UgeworCQkJCWRydl9kYXRhLT5jc19ncGlvZHNbaV0gPSBncGlvZDsKKwkJCX0KKwkJfQorCX0KKwogCXRhc2tsZXRfaW5pdCgmZHJ2X2RhdGEtPnB1bXBfdHJhbnNmZXJzLCBwdW1wX3RyYW5zZmVycywKIAkJICAgICAodW5zaWduZWQgbG9uZylkcnZfZGF0YSk7CiAKQEAgLTE3NDIsNyArMTgyNiw3IEBACiB7CiAJc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBzc3BfZGV2aWNlICpzc3AgPSBkcnZfZGF0YS0+c3NwOwotCWludCBzdGF0dXMgPSAwOworCWludCBzdGF0dXM7CiAKIAlzdGF0dXMgPSBzcGlfbWFzdGVyX3N1c3BlbmQoZHJ2X2RhdGEtPm1hc3Rlcik7CiAJaWYgKHN0YXR1cyAhPSAwKQpAQCAtMTc1OSw3ICsxODQzLDcgQEAKIHsKIAlzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHNzcF9kZXZpY2UgKnNzcCA9IGRydl9kYXRhLT5zc3A7Ci0JaW50IHN0YXR1cyA9IDA7CisJaW50IHN0YXR1czsKIAogCS8qIEVuYWJsZSB0aGUgU1NQIGNsb2NrICovCiAJaWYgKCFwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC5oIGIvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC5oCmluZGV4IGQyMTdhZDUuLmNlMzFiODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1weGEyeHguaAorKysgYi9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LmgKQEAgLTUzLDkgKzUzLDcgQEAKIAlhdG9taWNfdCBkbWFfcnVubmluZzsKIAogCS8qIEN1cnJlbnQgbWVzc2FnZSB0cmFuc2ZlciBzdGF0ZSBpbmZvICovCi0Jc3RydWN0IHNwaV9tZXNzYWdlICpjdXJfbXNnOwogCXN0cnVjdCBzcGlfdHJhbnNmZXIgKmN1cl90cmFuc2ZlcjsKLQlzdHJ1Y3QgY2hpcF9kYXRhICpjdXJfY2hpcDsKIAlzaXplX3QgbGVuOwogCXZvaWQgKnR4OwogCXZvaWQgKnR4X2VuZDsKQEAgLTY4LDYgKzY2LDkgQEAKIAl2b2lkICgqY3NfY29udHJvbCkodTMyIGNvbW1hbmQpOwogCiAJdm9pZCBfX2lvbWVtICpscHNzX2Jhc2U7CisKKwkvKiBHUElPcyBmb3IgY2hpcCBzZWxlY3RzICovCisJc3RydWN0IGdwaW9fZGVzYyAqKmNzX2dwaW9kczsKIH07CiAKIHN0cnVjdCBjaGlwX2RhdGEgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXF1cC5jIGIvZHJpdmVycy9zcGkvc3BpLXF1cC5jCmluZGV4IGMzMzhlZjEuLjFiZmE4ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1xdXAuYworKysgYi9kcml2ZXJzL3NwaS9zcGktcXVwLmMKQEAgLTk4Miw4ICs5ODIsMTAgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNvbnRyb2xsZXItPmNjbGspOwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShjb250cm9sbGVyLT5pY2xrKTsKKwlpZiAoIXBtX3J1bnRpbWVfc3VzcGVuZGVkKGRldmljZSkpIHsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNvbnRyb2xsZXItPmNjbGspOworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoY29udHJvbGxlci0+aWNsayk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0xMDMwLDcgKzEwMzIsNiBAQAogCiAJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZwZGV2LT5kZXYpOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKLQlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktcnNwaS5jIGIvZHJpdmVycy9zcGkvc3BpLXJzcGkuYwppbmRleCA4MTg4NDMzLi5hODE2ZjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktcnNwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1yc3BpLmMKQEAgLTI5NSwxNCArMjk1LDI0IEBACiBzdGF0aWMgaW50IHJzcGlfcnpfc2V0X2NvbmZpZ19yZWdpc3RlcihzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBpbnQgYWNjZXNzX3NpemUpCiB7CiAJaW50IHNwYnI7CisJaW50IGRpdiA9IDA7CisJdW5zaWduZWQgbG9uZyBjbGtzcmM7CiAKIAkvKiBTZXRzIG91dHB1dCBtb2RlLCBNT1NJIHNpZ25hbCwgYW5kIChvcHRpb25hbGx5KSBsb29wYmFjayAqLwogCXJzcGlfd3JpdGU4KHJzcGksIHJzcGktPnNwcGNyLCBSU1BJX1NQUENSKTsKIAorCWNsa3NyYyA9IGNsa19nZXRfcmF0ZShyc3BpLT5jbGspOworCXdoaWxlIChkaXYgPCAzKSB7CisJCWlmIChyc3BpLT5tYXhfc3BlZWRfaHogPj0gY2xrc3JjLzQpIC8qIDQ9KENMSy8yKS8yICovCisJCQlicmVhazsKKwkJZGl2Kys7CisJCWNsa3NyYyAvPSAyOworCX0KKwogCS8qIFNldHMgdHJhbnNmZXIgYml0IHJhdGUgKi8KLQlzcGJyID0gRElWX1JPVU5EX1VQKGNsa19nZXRfcmF0ZShyc3BpLT5jbGspLAotCQkJICAgIDIgKiByc3BpLT5tYXhfc3BlZWRfaHopIC0gMTsKKwlzcGJyID0gRElWX1JPVU5EX1VQKGNsa3NyYywgMiAqIHJzcGktPm1heF9zcGVlZF9oeikgLSAxOwogCXJzcGlfd3JpdGU4KHJzcGksIGNsYW1wKHNwYnIsIDAsIDI1NSksIFJTUElfU1BCUik7CisJcnNwaS0+c3BjbWQgfD0gZGl2IDw8IDI7CiAKIAkvKiBEaXNhYmxlIGR1bW15IHRyYW5zbWlzc2lvbiwgc2V0IGJ5dGUgYWNjZXNzICovCiAJcnNwaV93cml0ZTgocnNwaSwgU1BEQ1JfU1BMQllURSwgUlNQSV9TUERDUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktc2MxOGlzNjAyLmMgYi9kcml2ZXJzL3NwaS9zcGktc2MxOGlzNjAyLmMKaW5kZXggMzZhZjRkNC4uZjYzNzE0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXNjMThpczYwMi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zYzE4aXM2MDIuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvc2MxOGlzNjAyLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgogCiBlbnVtIGNoaXBzIHsgc2MxOGlzNjAyLCBzYzE4aXM2MDJiLCBzYzE4aXM2MDMgfTsKIApAQCAtNTAsNiArNTEsOCBAQAogCXU4CQkJYnVmZmVyW1NDMThJUzYwMl9CVUZTSVogKyAxXTsKIAlpbnQJCQl0bGVuOwkvKiBEYXRhIHF1ZXVlZCBmb3IgdHggaW4gYnVmZmVyICovCiAJaW50CQkJcmluZGV4OwkvKiBSZWNlaXZlIGRhdGEgaW5kZXggaW4gYnVmZmVyICovCisKKwlzdHJ1Y3QgZ3Bpb19kZXNjCSpyZXNldDsKIH07CiAKIHN0YXRpYyBpbnQgc2MxOGlzNjAyX3dhaXRfcmVhZHkoc3RydWN0IHNjMThpczYwMiAqaHcsIGludCBsZW4pCkBAIC0yNTcsNiArMjYwLDEyIEBACiAJaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaHcpOwogCisJLyogYXNzZXJ0IHJlc2V0IGFuZCB0aGVuIHJlbGVhc2UgKi8KKwlody0+cmVzZXQgPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbChkZXYsICJyZXNldCIsIEdQSU9EX09VVF9ISUdIKTsKKwlpZiAoSVNfRVJSKGh3LT5yZXNldCkpCisJCXJldHVybiBQVFJfRVJSKGh3LT5yZXNldCk7CisJZ3Bpb2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKGh3LT5yZXNldCwgMCk7CisKIAlody0+bWFzdGVyID0gbWFzdGVyOwogCWh3LT5jbGllbnQgPSBjbGllbnQ7CiAJaHctPmRldiA9IGRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1zaC1tc2lvZi5jIGIvZHJpdmVycy9zcGkvc3BpLXNoLW1zaW9mLmMKaW5kZXggMGY4M2FkMS4uMWRlM2E3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXNoLW1zaW9mLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXNoLW1zaW9mLmMKQEAgLTI2Miw2ICsyNjIsOSBAQAogCiAJZm9yIChrID0gMDsgayA8IEFSUkFZX1NJWkUoc2hfbXNpb2Zfc3BpX2Rpdl90YWJsZSk7IGsrKykgewogCQlicnBzID0gRElWX1JPVU5EX1VQKGRpdiwgc2hfbXNpb2Zfc3BpX2Rpdl90YWJsZVtrXS5kaXYpOworCQkvKiBTQ1JfQlJEVl9ESVZfMSBpcyB2YWxpZCBvbmx5IGlmIEJSUFMgaXMgeCAxLzEgb3IgeCAxLzIgKi8KKwkJaWYgKHNoX21zaW9mX3NwaV9kaXZfdGFibGVba10uZGl2ID09IDEgJiYgYnJwcyA+IDIpCisJCQljb250aW51ZTsKIAkJaWYgKGJycHMgPD0gMzIpIC8qIG1heCBvZiBicmR2IGlzIDMyICovCiAJCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktc3Qtc3NjNC5jIGIvZHJpdmVycy9zcGkvc3BpLXN0LXNzYzQuYwppbmRleCBhNTZlY2EwLi5lNTRiNTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktc3Qtc3NjNC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zdC1zc2M0LmMKQEAgLTE3NSwxMCArMTc1LDcgQEAKIAogc3RhdGljIHZvaWQgc3BpX3N0X2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlpbnQgY3MgPSBzcGktPmNzX2dwaW87Ci0KLQlpZiAoZ3Bpb19pc192YWxpZChjcykpCi0JCWRldm1fZ3Bpb19mcmVlKCZzcGktPmRldiwgY3MpOworCWdwaW9fZnJlZShzcGktPmNzX2dwaW8pOwogfQogCiAvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KQEAgLTIwMSwxNCArMTk4LDE1IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChkZXZtX2dwaW9fcmVxdWVzdCgmc3BpLT5kZXYsIGNzLCBkZXZfbmFtZSgmc3BpLT5kZXYpKSkgeworCXJldCA9IGdwaW9fcmVxdWVzdChjcywgZGV2X25hbWUoJnNwaS0+ZGV2KSk7CisJaWYgKHJldCkgewogCQlkZXZfZXJyKCZzcGktPmRldiwgImNvdWxkIG5vdCByZXF1ZXN0IGdwaW86JWRcbiIsIGNzKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0ID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGNzLCBzcGktPm1vZGUgJiBTUElfQ1NfSElHSCk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXRfZnJlZV9ncGlvOwogCiAJc3BpX3N0X2NsayA9IGNsa19nZXRfcmF0ZShzcGlfc3QtPmNsayk7CiAKQEAgLTIxNyw3ICsyMTUsOCBAQAogCWlmIChzc2NicmcgPCAweDA3IHx8IHNzY2JyZyA+IEJJVCgxNikpIHsKIAkJZGV2X2Vycigmc3BpLT5kZXYsCiAJCQkiYmF1ZHJhdGUgJWQgb3V0c2lkZSB2YWxpZCByYW5nZSAlZFxuIiwgc3NjYnJnLCBoeik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9mcmVlX2dwaW87CiAJfQogCiAJc3BpX3N0LT5iYXVkID0gc3BpX3N0X2NsayAvICgyICogc3NjYnJnKTsKQEAgLTI2Niw2ICsyNjUsMTAgQEAKIAkgcmVhZGxfcmVsYXhlZChzcGlfc3QtPmJhc2UgKyBTU0NfUkJVRik7CiAKIAkgcmV0dXJuIDA7CisKK291dF9mcmVlX2dwaW86CisJZ3Bpb19mcmVlKGNzKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKiBJbnRlcnJ1cHQgZmlyZWQgd2hlbiBUWCBzaGlmdCByZWdpc3RlciBiZWNvbWVzIGVtcHR5ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktdGktcXNwaS5jIGIvZHJpdmVycy9zcGkvc3BpLXRpLXFzcGkuYwppbmRleCBhYzBiMDcyLi5jYWVhYzY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktdGktcXNwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS10aS1xc3BpLmMKQEAgLTQxLDYgKzQxLDggQEAKIH07CiAKIHN0cnVjdCB0aV9xc3BpIHsKKwlzdHJ1Y3QgY29tcGxldGlvbgl0cmFuc2Zlcl9jb21wbGV0ZTsKKwogCS8qIGxpc3Qgc3luY2hyb25pemF0aW9uICovCiAJc3RydWN0IG11dGV4ICAgICAgICAgICAgbGlzdF9sb2NrOwogCkBAIC01NCw2ICs1Niw5IEBACiAKIAlzdHJ1Y3QgdGlfcXNwaV9yZWdzICAgICBjdHhfcmVnOwogCisJZG1hX2FkZHJfdAkJbW1hcF9waHlzX2Jhc2U7CisJc3RydWN0IGRtYV9jaGFuCQkqcnhfY2hhbjsKKwogCXUzMiBzcGlfbWF4X2ZyZXF1ZW5jeTsKIAl1MzIgY21kOwogCXUzMiBkYzsKQEAgLTM3OSw2ICszODQsNzIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgdGlfcXNwaV9kbWFfY2FsbGJhY2sodm9pZCAqcGFyYW0pCit7CisJc3RydWN0IHRpX3FzcGkgKnFzcGkgPSBwYXJhbTsKKworCWNvbXBsZXRlKCZxc3BpLT50cmFuc2Zlcl9jb21wbGV0ZSk7Cit9CisKK3N0YXRpYyBpbnQgdGlfcXNwaV9kbWFfeGZlcihzdHJ1Y3QgdGlfcXNwaSAqcXNwaSwgZG1hX2FkZHJfdCBkbWFfZHN0LAorCQkJICAgIGRtYV9hZGRyX3QgZG1hX3NyYywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSBxc3BpLT5yeF9jaGFuOworCXN0cnVjdCBkbWFfZGV2aWNlICpkbWFfZGV2ID0gY2hhbi0+ZGV2aWNlOworCWRtYV9jb29raWVfdCBjb29raWU7CisJZW51bSBkbWFfY3RybF9mbGFncyBmbGFncyA9IERNQV9DVFJMX0FDSyB8IERNQV9QUkVQX0lOVEVSUlVQVDsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4OworCWludCByZXQ7CisKKwl0eCA9IGRtYV9kZXYtPmRldmljZV9wcmVwX2RtYV9tZW1jcHkoY2hhbiwgZG1hX2RzdCwgZG1hX3NyYywKKwkJCQkJICAgICBsZW4sIGZsYWdzKTsKKwlpZiAoIXR4KSB7CisJCWRldl9lcnIocXNwaS0+ZGV2LCAiZGV2aWNlX3ByZXBfZG1hX21lbWNweSBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXR4LT5jYWxsYmFjayA9IHRpX3FzcGlfZG1hX2NhbGxiYWNrOworCXR4LT5jYWxsYmFja19wYXJhbSA9IHFzcGk7CisJY29va2llID0gdHgtPnR4X3N1Ym1pdCh0eCk7CisKKwlyZXQgPSBkbWFfc3VibWl0X2Vycm9yKGNvb2tpZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHFzcGktPmRldiwgImRtYV9zdWJtaXRfZXJyb3IgJWRcbiIsIGNvb2tpZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKGNoYW4pOworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcXNwaS0+dHJhbnNmZXJfY29tcGxldGUsCisJCQkJCSAgbXNlY3NfdG9famlmZmllcyhsZW4pKTsKKwlpZiAocmV0IDw9IDApIHsKKwkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9zeW5jKGNoYW4pOworCQlkZXZfZXJyKHFzcGktPmRldiwgIkRNQSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXRcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aV9xc3BpX2RtYV94ZmVyX3NnKHN0cnVjdCB0aV9xc3BpICpxc3BpLCBzdHJ1Y3Qgc2dfdGFibGUgcnhfc2csCisJCQkgICAgICAgbG9mZl90IGZyb20pCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlkbWFfYWRkcl90IGRtYV9zcmMgPSBxc3BpLT5tbWFwX3BoeXNfYmFzZSArIGZyb207CisJZG1hX2FkZHJfdCBkbWFfZHN0OworCWludCBpLCBsZW4sIHJldDsKKworCWZvcl9lYWNoX3NnKHJ4X3NnLnNnbCwgc2csIHJ4X3NnLm5lbnRzLCBpKSB7CisJCWRtYV9kc3QgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCWxlbiA9IHNnX2RtYV9sZW4oc2cpOworCQlyZXQgPSB0aV9xc3BpX2RtYV94ZmVyKHFzcGksIGRtYV9kc3QsIGRtYV9zcmMsIGxlbik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlkbWFfc3JjICs9IGxlbjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgdGlfcXNwaV9lbmFibGVfbWVtb3J5X21hcChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCB0aV9xc3BpICAqcXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwpAQCAtNDI2LDcgKzQ5Nyw3IEBACiAJCSAgICAgIFFTUElfU1BJX1NFVFVQX1JFRyhzcGktPmNoaXBfc2VsZWN0KSk7CiB9CiAKLXN0YXRpYyBpbnQgdGlfcXNwaV9zcGlfZmxhc2hfcmVhZChzdHJ1Y3QgIHNwaV9kZXZpY2UgKnNwaSwKK3N0YXRpYyBpbnQgdGlfcXNwaV9zcGlfZmxhc2hfcmVhZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAogCQkJCSAgc3RydWN0IHNwaV9mbGFzaF9yZWFkX21lc3NhZ2UgKm1zZykKIHsKIAlzdHJ1Y3QgdGlfcXNwaSAqcXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwpAQCAtNDM3LDkgKzUwOCwyMyBAQAogCWlmICghcXNwaS0+bW1hcF9lbmFibGVkKQogCQl0aV9xc3BpX2VuYWJsZV9tZW1vcnlfbWFwKHNwaSk7CiAJdGlfcXNwaV9zZXR1cF9tbWFwX3JlYWQoc3BpLCBtc2cpOwotCW1lbWNweV9mcm9taW8obXNnLT5idWYsIHFzcGktPm1tYXBfYmFzZSArIG1zZy0+ZnJvbSwgbXNnLT5sZW4pOworCisJaWYgKHFzcGktPnJ4X2NoYW4pIHsKKwkJaWYgKG1zZy0+Y3VyX21zZ19tYXBwZWQpIHsKKwkJCXJldCA9IHRpX3FzcGlfZG1hX3hmZXJfc2cocXNwaSwgbXNnLT5yeF9zZywgbXNnLT5mcm9tKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJfdW5sb2NrOworCQl9IGVsc2UgeworCQkJZGV2X2Vycihxc3BpLT5kZXYsICJJbnZhbGlkIGFkZHJlc3MgZm9yIERNQVxuIik7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBlcnJfdW5sb2NrOworCQl9CisJfSBlbHNlIHsKKwkJbWVtY3B5X2Zyb21pbyhtc2ctPmJ1ZiwgcXNwaS0+bW1hcF9iYXNlICsgbXNnLT5mcm9tLCBtc2ctPmxlbik7CisJfQogCW1zZy0+cmV0bGVuID0gbXNnLT5sZW47CiAKK2Vycl91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZxc3BpLT5saXN0X2xvY2spOwogCiAJcmV0dXJuIHJldDsKQEAgLTUzNiw2ICs2MjEsNyBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAl1MzIgbWF4X2ZyZXE7CiAJaW50IHJldCA9IDAsIG51bV9jcywgaXJxOworCWRtYV9jYXBfbWFza190IG1hc2s7CiAKIAltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZigqcXNwaSkpOwogCWlmICghbWFzdGVyKQpAQCAtNTUwLDYgKzYzNiw3IEBACiAJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKDMyKSB8IFNQSV9CUFdfTUFTSygxNikgfAogCQkJCSAgICAgU1BJX0JQV19NQVNLKDgpOworCW1hc3Rlci0+c3BpX2ZsYXNoX3JlYWQgPSB0aV9xc3BpX3NwaV9mbGFzaF9yZWFkOwogCiAJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgIm51bS1jcyIsICZudW1fY3MpKQogCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gbnVtX2NzOwpAQCAtNTkyLDE3ICs2NzksNiBAQAogCQlnb3RvIGZyZWVfbWFzdGVyOwogCX0KIAotCWlmIChyZXNfbW1hcCkgewotCQlxc3BpLT5tbWFwX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwKLQkJCQkJCQlyZXNfbW1hcCk7Ci0JCW1hc3Rlci0+c3BpX2ZsYXNoX3JlYWQgPSB0aV9xc3BpX3NwaV9mbGFzaF9yZWFkOwotCQlpZiAoSVNfRVJSKHFzcGktPm1tYXBfYmFzZSkpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCQkiZmFsbGluZyBiYWNrIHRvIFBJTyBtb2RlXG4iKTsKLQkJCW1hc3Rlci0+c3BpX2ZsYXNoX3JlYWQgPSBOVUxMOwotCQl9Ci0JfQotCXFzcGktPm1tYXBfZW5hYmxlZCA9IGZhbHNlOwogCiAJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgInN5c2Nvbi1jaGlwc2VsZWN0cyIpKSB7CiAJCXFzcGktPmN0cmxfYmFzZSA9CkBAIC02MzMsMTEgKzcwOSwzNyBAQAogCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJzcGktbWF4LWZyZXF1ZW5jeSIsICZtYXhfZnJlcSkpCiAJCXFzcGktPnNwaV9tYXhfZnJlcXVlbmN5ID0gbWF4X2ZyZXE7CiAKLQlyZXQgPSBkZXZtX3NwaV9yZWdpc3Rlcl9tYXN0ZXIoJnBkZXYtPmRldiwgbWFzdGVyKTsKLQlpZiAocmV0KQotCQlnb3RvIGZyZWVfbWFzdGVyOworCWRtYV9jYXBfemVybyhtYXNrKTsKKwlkbWFfY2FwX3NldChETUFfTUVNQ1BZLCBtYXNrKTsKIAotCXJldHVybiAwOworCXFzcGktPnJ4X2NoYW4gPSBkbWFfcmVxdWVzdF9jaGFuX2J5X21hc2soJm1hc2spOworCWlmICghcXNwaS0+cnhfY2hhbikgeworCQlkZXZfZXJyKHFzcGktPmRldiwKKwkJCSJObyBSeCBETUEgYXZhaWxhYmxlLCB0cnlpbmcgbW1hcCBtb2RlXG4iKTsKKwkJcmV0ID0gMDsKKwkJZ290byBub19kbWE7CisJfQorCW1hc3Rlci0+ZG1hX3J4ID0gcXNwaS0+cnhfY2hhbjsKKwlpbml0X2NvbXBsZXRpb24oJnFzcGktPnRyYW5zZmVyX2NvbXBsZXRlKTsKKwlpZiAocmVzX21tYXApCisJCXFzcGktPm1tYXBfcGh5c19iYXNlID0gKGRtYV9hZGRyX3QpcmVzX21tYXAtPnN0YXJ0OworCitub19kbWE6CisJaWYgKCFxc3BpLT5yeF9jaGFuICYmIHJlc19tbWFwKSB7CisJCXFzcGktPm1tYXBfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXNfbW1hcCk7CisJCWlmIChJU19FUlIocXNwaS0+bW1hcF9iYXNlKSkgeworCQkJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJCQkgIm1tYXAgZmFpbGVkIHdpdGggZXJyb3IgJWxkIHVzaW5nIFBJTyBtb2RlXG4iLAorCQkJCSBQVFJfRVJSKHFzcGktPm1tYXBfYmFzZSkpOworCQkJcXNwaS0+bW1hcF9iYXNlID0gTlVMTDsKKwkJCW1hc3Rlci0+c3BpX2ZsYXNoX3JlYWQgPSBOVUxMOworCQl9CisJfQorCXFzcGktPm1tYXBfZW5hYmxlZCA9IGZhbHNlOworCisJcmV0ID0gZGV2bV9zcGlfcmVnaXN0ZXJfbWFzdGVyKCZwZGV2LT5kZXYsIG1hc3Rlcik7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOwogCiBmcmVlX21hc3RlcjoKIAlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOwpAQCAtNjU2LDYgKzc1OCw5IEBACiAJcG1fcnVudGltZV9wdXRfc3luYygmcGRldi0+ZGV2KTsKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAKKwlpZiAocXNwaS0+cnhfY2hhbikKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbChxc3BpLT5yeF9jaGFuKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktdHh4OS5jIGIvZHJpdmVycy9zcGkvc3BpLXR4eDkuYwppbmRleCA3NDkyZWEzLi41MTc1OWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktdHh4OS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS10eHg5LmMKQEAgLTM0Niw3ICszNDYsNyBAQAogCQljLT5jbGsgPSBOVUxMOwogCQlnb3RvIGV4aXQ7CiAJfQotCXJldCA9IGNsa19lbmFibGUoYy0+Y2xrKTsKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoYy0+Y2xrKTsKIAlpZiAocmV0KSB7CiAJCWMtPmNsayA9IE5VTEw7CiAJCWdvdG8gZXhpdDsKQEAgLTM5NSw3ICszOTUsNyBAQAogZXhpdF9idXN5OgogCXJldCA9IC1FQlVTWTsKIGV4aXQ6Ci0JY2xrX2Rpc2FibGUoYy0+Y2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoYy0+Y2xrKTsKIAlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOwogCXJldHVybiByZXQ7CiB9CkBAIC00MDYsNyArNDA2LDcgQEAKIAlzdHJ1Y3QgdHh4OXNwaSAqYyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAogCWZsdXNoX3dvcmsoJmMtPndvcmspOwotCWNsa19kaXNhYmxlKGMtPmNsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGMtPmNsayk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS14bHAuYyBiL2RyaXZlcnMvc3BpL3NwaS14bHAuYwppbmRleCA4ZjA0ZmVjLi40MDcxYTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGkteGxwLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXhscC5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNDA1LDggKzQwNiw5IEBACiAJY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOwogCWlmIChJU19FUlIoY2xrKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IHNwaSBjbG9ja1xuIik7Ci0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm4gUFRSX0VSUihjbGspOwogCX0KKwogCXhzcGktPnNwaV9jbGsgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKIAogCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgMCk7CkBAIC00MzcsNiArNDM5LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfQUNQSQorc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCB4bHBfc3BpX2FjcGlfbWF0Y2hbXSA9IHsKKwl7ICJCUkNNOTAwRCIsIDAgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCB4bHBfc3BpX2FjcGlfbWF0Y2gpOworI2VuZGlmCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHhscF9zcGlfZHRfaWRbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gIm5ldGxvZ2ljLHhscDgzMi1zcGkiIH0sCiAJeyB9LApAQCAtNDQ3LDYgKzQ1Nyw3IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAieGxwLXNwaSIsCiAJCS5vZl9tYXRjaF90YWJsZSA9IHhscF9zcGlfZHRfaWQsCisJCS5hY3BpX21hdGNoX3RhYmxlID0gQUNQSV9QVFIoeGxwX3NwaV9hY3BpX21hdGNoKSwKIAl9LAogfTsKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoeGxwX3NwaV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGkuYwppbmRleCA1MWFkNDJmLi44MTQ2Y2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGkuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogCiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvc3BpLmg+CkBAIC03MDksNiArNzEwLDEzIEBACiB7CiAJY29uc3QgYm9vbCB2bWFsbG9jZWRfYnVmID0gaXNfdm1hbGxvY19hZGRyKGJ1Zik7CiAJdW5zaWduZWQgaW50IG1heF9zZWdfc2l6ZSA9IGRtYV9nZXRfbWF4X3NlZ19zaXplKGRldik7CisjaWZkZWYgQ09ORklHX0hJR0hNRU0KKwljb25zdCBib29sIGttYXBfYnVmID0gKCh1bnNpZ25lZCBsb25nKWJ1ZiA+PSBQS01BUF9CQVNFICYmCisJCQkJKHVuc2lnbmVkIGxvbmcpYnVmIDwgKFBLTUFQX0JBU0UgKworCQkJCQkoTEFTVF9QS01BUCAqIFBBR0VfU0laRSkpKTsKKyNlbHNlCisJY29uc3QgYm9vbCBrbWFwX2J1ZiA9IGZhbHNlOworI2VuZGlmCiAJaW50IGRlc2NfbGVuOwogCWludCBzZ3M7CiAJc3RydWN0IHBhZ2UgKnZtX3BhZ2U7CkBAIC03MTYsNyArNzI0LDcgQEAKIAlzaXplX3QgbWluOwogCWludCBpLCByZXQ7CiAKLQlpZiAodm1hbGxvY2VkX2J1ZikgeworCWlmICh2bWFsbG9jZWRfYnVmIHx8IGttYXBfYnVmKSB7CiAJCWRlc2NfbGVuID0gbWluX3QoaW50LCBtYXhfc2VnX3NpemUsIFBBR0VfU0laRSk7CiAJCXNncyA9IERJVl9ST1VORF9VUChsZW4gKyBvZmZzZXRfaW5fcGFnZShidWYpLCBkZXNjX2xlbik7CiAJfSBlbHNlIGlmICh2aXJ0X2FkZHJfdmFsaWQoYnVmKSkgewpAQCAtNzMyLDEwICs3NDAsMTMgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBzZ3M7IGkrKykgewogCi0JCWlmICh2bWFsbG9jZWRfYnVmKSB7CisJCWlmICh2bWFsbG9jZWRfYnVmIHx8IGttYXBfYnVmKSB7CiAJCQltaW4gPSBtaW5fdChzaXplX3QsCiAJCQkJICAgIGxlbiwgZGVzY19sZW4gLSBvZmZzZXRfaW5fcGFnZShidWYpKTsKLQkJCXZtX3BhZ2UgPSB2bWFsbG9jX3RvX3BhZ2UoYnVmKTsKKwkJCWlmICh2bWFsbG9jZWRfYnVmKQorCQkJCXZtX3BhZ2UgPSB2bWFsbG9jX3RvX3BhZ2UoYnVmKTsKKwkJCWVsc2UKKwkJCQl2bV9wYWdlID0ga21hcF90b19wYWdlKGJ1Zik7CiAJCQlpZiAoIXZtX3BhZ2UpIHsKIAkJCQlzZ19mcmVlX3RhYmxlKHNndCk7CiAJCQkJcmV0dXJuIC1FTk9NRU07CkBAIC05NjAsNyArOTcxLDcgQEAKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyOwogCWJvb2wga2VlcF9jcyA9IGZhbHNlOwogCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgbXMgPSAxOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtcyA9IDE7CiAJc3RydWN0IHNwaV9zdGF0aXN0aWNzICpzdGF0bSA9ICZtYXN0ZXItPnN0YXRpc3RpY3M7CiAJc3RydWN0IHNwaV9zdGF0aXN0aWNzICpzdGF0cyA9ICZtc2ctPnNwaS0+c3RhdGlzdGljczsKIApAQCAtOTkxLDkgKzEwMDIsMTMgQEAKIAogCQkJaWYgKHJldCA+IDApIHsKIAkJCQlyZXQgPSAwOwotCQkJCW1zID0geGZlci0+bGVuICogOCAqIDEwMDAgLyB4ZmVyLT5zcGVlZF9oejsKKwkJCQltcyA9IDhMTCAqIDEwMDBMTCAqIHhmZXItPmxlbjsKKwkJCQlkb19kaXYobXMsIHhmZXItPnNwZWVkX2h6KTsKIAkJCQltcyArPSBtcyArIDEwMDsgLyogc29tZSB0b2xlcmFuY2UgKi8KIAorCQkJCWlmIChtcyA+IFVJTlRfTUFYKQorCQkJCQltcyA9IFVJTlRfTUFYOworCiAJCQkJbXMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJm1hc3Rlci0+eGZlcl9jb21wbGV0aW9uLAogCQkJCQkJCQkgbXNlY3NfdG9famlmZmllcyhtcykpOwogCQkJfQpAQCAtMTE1OSw2ICsxMTc0LDcgQEAKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoJm1hc3Rlci0+ZGV2LCAiRmFpbGVkIHRvIHBvd2VyIGRldmljZTogJWRcbiIsCiAJCQkJcmV0KTsKKwkJCW11dGV4X3VubG9jaygmbWFzdGVyLT5pb19tdXRleCk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC0xMTc0LDYgKzExOTAsNyBAQAogCiAJCQlpZiAobWFzdGVyLT5hdXRvX3J1bnRpbWVfcG0pCiAJCQkJcG1fcnVudGltZV9wdXQobWFzdGVyLT5kZXYucGFyZW50KTsKKwkJCW11dGV4X3VubG9jaygmbWFzdGVyLT5pb19tdXRleCk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwbWkvc3BtaS1wbWljLWFyYi5jIGIvZHJpdmVycy9zcG1pL3NwbWktcG1pYy1hcmIuYwppbmRleCBhY2EyODJkLi41ZWMzYTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwbWkvc3BtaS1wbWljLWFyYi5jCisrKyBiL2RyaXZlcnMvc3BtaS9zcG1pLXBtaWMtYXJiLmMKQEAgLTk1NCw2ICs5NTQsNyBAQAogCWlmIChjaGFubmVsID4gNSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpbnZhbGlkIGNoYW5uZWwgKCV1KSBzcGVjaWZpZWQuXG4iLAogCQkJY2hhbm5lbCk7CisJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX3B1dF9jdHJsOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwppbmRleCBhZjk0NzY0Li41OGE3YjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwpAQCAtNDAsOCArNDAsNiBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L0tjb25maWciCi0KIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL0tjb25maWciCkBAIC0xMDQsNCArMTAyLDggQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcva3M3MDEwL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9LY29uZmlnIgorCiBlbmRpZiAjIFNUQUdJTkcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQppbmRleCA5ZjYwMDlkLi4yZmE5NzQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCkBAIC05LDcgKzksNiBAQAogb2JqLSQoQ09ORklHX1JUTDgxOTJFKQkJKz0gcnRsODE5MmUvCiBvYmotJChDT05GSUdfUjg3MTJVKQkJKz0gcnRsODcxMi8KIG9iai0kKENPTkZJR19SODE4OEVVKQkJKz0gcnRsODE4OGV1Lwotb2JqLSQoQ09ORklHX1I4NzIzQVUpCQkrPSBydGw4NzIzYXUvCiBvYmotJChDT05GSUdfUlRTNTIwOCkJCSs9IHJ0czUyMDgvCiBvYmotJChDT05GSUdfTkVUTE9HSUNfWExSX05FVCkJKz0gbmV0bG9naWMvCiBvYmotJChDT05GSUdfT0NURU9OX0VUSEVSTkVUKQkrPSBvY3Rlb24vCkBAIC00MSwzICs0MCw1IEBACiBvYmotJChDT05GSUdfTU9TVCkJCSs9IG1vc3QvCiBvYmotJChDT05GSUdfSVNETl9JNEwpCQkrPSBpNGwvCiBvYmotJChDT05GSUdfS1M3MDEwKQkJKz0ga3M3MDEwLworb2JqLSQoQ09ORklHX0dSRVlCVVMpCQkrPSBncmV5YnVzLworb2JqLSQoQ09ORklHX0JDTTI3MDhfVkNISVEpCSs9IHZjMDRfc2VydmljZXMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvS2NvbmZpZwppbmRleCAwNmU0MWQyLi42YzAwZDZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWcKQEAgLTI0LDE5ICsyNCw2IEBACiAJICBzY3JpcHRzICgvaW5pdC5yYyksIGFuZCBpdCBkZWZpbmVzIHByaW9yaXR5IHZhbHVlcyB3aXRoIG1pbmltdW0gZnJlZSBtZW1vcnkgc2l6ZQogCSAgZm9yIGVhY2ggcHJpb3JpdHkuCiAKLWNvbmZpZyBTV19TWU5DCi0JYm9vbCAiU29mdHdhcmUgc3luY2hyb25pemF0aW9uIGZyYW1ld29yayIKLQlkZWZhdWx0IG4KLQlkZXBlbmRzIG9uIFNZTkNfRklMRQotCWRlcGVuZHMgb24gREVCVUdfRlMKLQktLS1oZWxwLS0tCi0JICBBIHN5bmMgb2JqZWN0IGRyaXZlciB0aGF0IHVzZXMgYSAzMmJpdCBjb3VudGVyIHRvIGNvb3JkaW5hdGUKLQkgIHN5bmNocm9uaXphdGlvbi4gIFVzZWZ1bCB3aGVuIHRoZXJlIGlzIG5vIGhhcmR3YXJlIHByaW1pdGl2ZSBiYWNraW5nCi0JICB0aGUgc3luY2hyb25pemF0aW9uLgotCi0JICBXQVJOSU5HOiBpbXByb3BlciB1c2Ugb2YgdGhpcyBjYW4gcmVzdWx0IGluIGRlYWRsb2NraW5nIGtlcm5lbAotCSAgZHJpdmVycyBmcm9tIHVzZXJzcGFjZS4gSW50ZW5kZWQgZm9yIHRlc3QgYW5kIGRlYnVnIG9ubHkuCi0KIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL0tjb25maWciCiAKIGVuZGlmICMgaWYgQU5EUk9JRApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9NYWtlZmlsZQppbmRleCA3Y2E2MWI3Li43ZWQxYmU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9NYWtlZmlsZQpAQCAtNCw0ICs0LDMgQEAKIAogb2JqLSQoQ09ORklHX0FTSE1FTSkJCQkrPSBhc2htZW0ubwogb2JqLSQoQ09ORklHX0FORFJPSURfTE9XX01FTU9SWV9LSUxMRVIpCSs9IGxvd21lbW9yeWtpbGxlci5vCi1vYmotJChDT05GSUdfU1dfU1lOQykJCQkrPSBzd19zeW5jLm8gc3luY19kZWJ1Zy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9LY29uZmlnCmluZGV4IDE5YzE1NzIuLmM4ZmI0MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9LY29uZmlnCkBAIC0zNiw3ICszNiwxOSBAQAogY29uZmlnIElPTl9ISVNJCiAJdHJpc3RhdGUgIklvbiBmb3IgSGlzaWxpY29uIgogCWRlcGVuZHMgb24gQVJDSF9ISVNJICYmIElPTgorCXNlbGVjdCBJT05fT0YKIAloZWxwCiAJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IHdpc2ggdG8gdXNlIGlvbiBvbiBIaXNpbGljb24gUGxhdGZvcm0uCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2hpc2lsaWNvbi9LY29uZmlnIgorCitjb25maWcgSU9OX09GCisJYm9vbCAiRGV2aWNldHJlZSBzdXBwb3J0IGZvciBJb24iCisJZGVwZW5kcyBvbiBJT04gJiYgT0ZfQUREUkVTUworCWhlbHAKKwkgIFByb3ZpZGVzIGJhc2Ugc3VwcG9ydCBmb3IgZGVmaW5pbmcgSW9uIGhlYXBzIGluIGRldmljZXRyZWUKKwkgIGFuZCBzZXR0aW5nIHRoZW0gdXAuIEFsc28gaW5jbHVkZXMgZnVuY3Rpb25zIGZvciBwbGF0Zm9ybXMKKwkgIHRvIHBhcnNlIHRoZSBkZXZpY2V0cmVlIGFuZCBleHBhbmQgZm9yIHRoZWlyIG93biBjdXN0b20KKwkgIGV4dGVuc2lvbnMKKworCSAgSWYgdXNpbmcgSW9uIGFuZCBkZXZpY2V0cmVlLCB5b3Ugc2hvdWxkIHNheSBZIGhlcmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9NYWtlZmlsZQppbmRleCAxOGNjMmFhLi41ZDYzMGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL01ha2VmaWxlCkBAIC0xLDQgKzEsNSBAQAotb2JqLSQoQ09ORklHX0lPTikgKz0JaW9uLm8gaW9uX2hlYXAubyBpb25fcGFnZV9wb29sLm8gaW9uX3N5c3RlbV9oZWFwLm8gXAorb2JqLSQoQ09ORklHX0lPTikgKz0JaW9uLm8gaW9uLWlvY3RsLm8gaW9uX2hlYXAubyBcCisJCQlpb25fcGFnZV9wb29sLm8gaW9uX3N5c3RlbV9oZWFwLm8gXAogCQkJaW9uX2NhcnZlb3V0X2hlYXAubyBpb25fY2h1bmtfaGVhcC5vIGlvbl9jbWFfaGVhcC5vCiBvYmotJChDT05GSUdfSU9OX1RFU1QpICs9IGlvbl90ZXN0Lm8KIGlmZGVmIENPTkZJR19DT01QQVQKQEAgLTgsNCArOSw1IEBACiBvYmotJChDT05GSUdfSU9OX0RVTU1ZKSArPSBpb25fZHVtbXlfZHJpdmVyLm8KIG9iai0kKENPTkZJR19JT05fVEVHUkEpICs9IHRlZ3JhLwogb2JqLSQoQ09ORklHX0lPTl9ISVNJKSArPSBoaXNpbGljb24vCitvYmotJChDT05GSUdfSU9OX09GKSArPSBpb25fb2YubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vZGV2aWNldHJlZS50eHQgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vZGV2aWNldHJlZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4NzE1MjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vZGV2aWNldHJlZS50eHQKQEAgLTAsMCArMSw1MSBAQAorSW9uIE1lbW9yeSBNYW5hZ2VyCisKK0lvbiBpcyBhIG1lbW9yeSBtYW5hZ2VyIHRoYXQgYWxsb3dzIGZvciBzaGFyaW5nIG9mIGJ1ZmZlcnMgdmlhIGRtYS1idWYuCitJb24gYWxsb3dzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgYWxsb2NhdGlvbiB2aWEgYW4gYWJzdHJhY3Rpb24gY2FsbGVkCithICdoZWFwJy4gQSBoZWFwIHJlcHJlc2VudHMgYSBzcGVjaWZpYyB0eXBlIG9mIG1lbW9yeS4gRWFjaCBoZWFwIGhhcworYSBkaWZmZXJlbnQgdHlwZS4gVGhlcmUgY2FuIGJlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBoZWFwCit0eXBlLgorCitTcGVjaWZpYyBoZWFwIGluc3RhbmNlcyBhcmUgdGllZCB0byBoZWFwIElEcy4gSGVhcCBJRHMgYXJlIG5vdCB0byBiZSBzcGVjaWZpZWQKK2luIHRoZSBkZXZpY2V0cmVlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzIGZvciBJb24KKworLSBjb21wYXRpYmxlOiAibGludXgsaW9uIiBQTFVTIGEgY29tcGF0aWJsZSBwcm9wZXJ0eSBmb3IgdGhlIGRldmljZQorCitBbGwgY2hpbGQgbm9kZXMgb2YgYSBsaW51eCxpb24gbm9kZSBhcmUgaW50ZXJwcmV0ZWQgYXMgaGVhcHMKKworcmVxdWlyZWQgcHJvcGVydGllcyBmb3IgaGVhcHMKKworLSBjb21wYXRpYmxlOiBjb21wYXRpYmxlIHN0cmluZyBmb3IgYSBoZWFwIHR5cGUgUExVUyBhIGNvbXBhdGlibGUgcHJvcGVydHkKK2ZvciB0aGUgc3BlY2lmaWMgaW5zdGFuY2Ugb2YgdGhlIGhlYXAuIEN1cnJlbnQgaGVhcCB0eXBlcworLS0gbGludXgsaW9uLWhlYXAtc3lzdGVtCistLSBsaW51eCxpb24taGVhcC1zeXN0ZW0tY29udGlnCistLSBsaW51eCxpb24taGVhcC1jYXJ2ZW91dAorLS0gbGludXgsaW9uLWhlYXAtY2h1bmsKKy0tIGxpbnV4LGlvbi1oZWFwLWRtYQorLS0gbGludXgsaW9uLWhlYXAtY3VzdG9tCisKK09wdGlvbmFsIHByb3BlcnRpZXMKKy0gbWVtb3J5LXJlZ2lvbjogQSBwaGFuZGxlIHRvIGEgbWVtb3J5IHJlZ2lvbi4gUmVxdWlyZWQgZm9yIERNQSBoZWFwIHR5cGUKKyhzZWUgcmVzZXJ2ZWQtbWVtb3J5LnR4dCBmb3IgZGV0YWlscyBvbiB0aGUgcmVzZXJ2YXRpb24pCisKK0V4YW1wbGU6CisKKwlpb24geworCQljb21wYXRiaWxlID0gImhpc2lsaWNvbixpb24iLCAibGludXgsaW9uIjsKKworCQlpb24tc3lzdGVtLWhlYXAgeworCQkJY29tcGF0YmlsZSA9ICJoaXNpbGljb24sc3lzdGVtLWhlYXAiLCAibGludXgsaW9uLWhlYXAtc3lzdGVtIgorCQl9OworCisJCWlvbi1jYW1lcmEtcmVnaW9uIHsKKwkJCWNvbXBhdGlibGUgPSAiaGlzaWxpY29uLGNhbWVyYS1oZWFwIiwgImxpbnV4LGlvbi1oZWFwLWRtYSIKKwkJCW1lbW9yeS1yZWdpb24gPSA8JmNhbWVyYV9yZWdpb24+OworCQl9OworCisJCWlvbi1mYi1yZWdpb24geworCQkJY29tcGF0YmlsZSA9ICJoaXNpbGljb24sZmItaGVhcCIsICJsaW51eCxpb24taGVhcC1kbWEiCisJCQltZW1vcnktcmVnaW9uID0gPCZmYl9yZWdpb24+OworCQl9OworCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9oaXNpbGljb24vaGk2MjIwX2lvbi5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2hpc2lsaWNvbi9oaTYyMjBfaW9uLmMKaW5kZXggZmU5ZjBmZC4uMGRlNzg5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2hpc2lsaWNvbi9oaTYyMjBfaW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2hpc2lsaWNvbi9oaTYyMjBfaW9uLmMKQEAgLTE5LDE4MSArMTksNzQgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgIi4uL2lvbl9wcml2LmgiCiAjaW5jbHVkZSAiLi4vaW9uLmgiCisjaW5jbHVkZSAiLi4vaW9uX29mLmgiCiAKLXN0cnVjdCBoaTYyMjBfaW9uX3R5cGVfdGFibGUgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JZW51bSBpb25faGVhcF90eXBlIHR5cGU7CitzdHJ1Y3QgaGlzaV9pb25fZGV2IHsKKwlzdHJ1Y3QgaW9uX2hlYXAJKipoZWFwczsKKwlzdHJ1Y3QgaW9uX2RldmljZSAqaWRldjsKKwlzdHJ1Y3QgaW9uX3BsYXRmb3JtX2RhdGEgKmRhdGE7CiB9OwogCi1zdGF0aWMgc3RydWN0IGhpNjIyMF9pb25fdHlwZV90YWJsZSBpb25fdHlwZV90YWJsZVtdID0gewotCXsiaW9uX3N5c3RlbSIsIElPTl9IRUFQX1RZUEVfU1lTVEVNfSwKLQl7Imlvbl9zeXN0ZW1fY29udGlnIiwgSU9OX0hFQVBfVFlQRV9TWVNURU1fQ09OVElHfSwKLQl7Imlvbl9jYXJ2ZW91dCIsIElPTl9IRUFQX1RZUEVfQ0FSVkVPVVR9LAotCXsiaW9uX2NodW5rIiwgSU9OX0hFQVBfVFlQRV9DSFVOS30sCi0JeyJpb25fZG1hIiwgSU9OX0hFQVBfVFlQRV9ETUF9LAotCXsiaW9uX2N1c3RvbSIsIElPTl9IRUFQX1RZUEVfQ1VTVE9NfSwKK3N0YXRpYyBzdHJ1Y3QgaW9uX29mX2hlYXAgaGlzaV9oZWFwc1tdID0geworCVBMQVRGT1JNX0hFQVAoImhpc2lsaWNvbixzeXNfdXNlciIsIDAsCisJCSAgICAgIElPTl9IRUFQX1RZUEVfU1lTVEVNLCAic3lzX3VzZXIiKSwKKwlQTEFURk9STV9IRUFQKCJoaXNpbGljb24sc3lzX2NvbnRpZyIsIDEsCisJCSAgICAgIElPTl9IRUFQX1RZUEVfU1lTVEVNX0NPTlRJRywgInN5c19jb250aWciKSwKKwlQTEFURk9STV9IRUFQKCJoaXNpbGljb24sY21hIiwgSU9OX0hFQVBfVFlQRV9ETUEsIElPTl9IRUFQX1RZUEVfRE1BLAorCQkgICAgICAiY21hIiksCisJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaW9uX2RldmljZSAqaWRldjsKLXN0YXRpYyBpbnQgbnVtX2hlYXBzOwotc3RhdGljIHN0cnVjdCBpb25faGVhcCAqKmhlYXBzOwotc3RhdGljIHN0cnVjdCBpb25fcGxhdGZvcm1faGVhcCAqKmhlYXBzX2RhdGE7Ci0KLXN0YXRpYyBpbnQgZ2V0X3R5cGVfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lLCBlbnVtIGlvbl9oZWFwX3R5cGUgKnR5cGUpCitzdGF0aWMgaW50IGhpNjIyMF9pb25fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgaGlzaV9pb25fZGV2ICppcGRldjsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlvbl90eXBlX3RhYmxlKTsgaSsrKSB7Ci0JCWlmIChzdHJuY21wKG5hbWUsIGlvbl90eXBlX3RhYmxlW2ldLm5hbWUsIHN0cmxlbihuYW1lKSkpCi0JCQljb250aW51ZTsKLQotCQkqdHlwZSA9IGlvbl90eXBlX3RhYmxlW2ldLnR5cGU7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IGhpNjIyMF9zZXRfcGxhdGZvcm1fZGF0YShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXVuc2lnbmVkIGludCBiYXNlOwotCXVuc2lnbmVkIGludCBzaXplOwotCXVuc2lnbmVkIGludCBpZDsKLQljb25zdCBjaGFyICpoZWFwX25hbWU7Ci0JY29uc3QgY2hhciAqdHlwZV9uYW1lOwotCWVudW0gaW9uX2hlYXBfdHlwZSB0eXBlOwotCWludCByZXQ7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQlzdHJ1Y3QgaW9uX3BsYXRmb3JtX2hlYXAgKnBfZGF0YTsKLQljb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmR0X25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKLQlpbnQgaW5kZXggPSAwOwotCi0JZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShkdF9ub2RlLCBucCkKLQkJbnVtX2hlYXBzKys7Ci0KLQloZWFwc19kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCi0JCQkJICBzaXplb2Yoc3RydWN0IGlvbl9wbGF0Zm9ybV9oZWFwICopICoKLQkJCQkgIG51bV9oZWFwcywKLQkJCQkgIEdGUF9LRVJORUwpOwotCWlmICghaGVhcHNfZGF0YSkKKwlpcGRldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmlwZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpcGRldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKGR0X25vZGUsIG5wKSB7Ci0JCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAiaGVhcC1uYW1lIiwgJmhlYXBfbmFtZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoImNoZWNrIHRoZSBuYW1lIG9mIG5vZGUgJXNcbiIsIG5wLT5uYW1lKTsKLQkJCWNvbnRpbnVlOwotCQl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaXBkZXYpOwogCi0JCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiaGVhcC1pZCIsICZpZCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoImNoZWNrIHRoZSBpZCAlc1xuIiwgbnAtPm5hbWUpOwotCQkJY29udGludWU7Ci0JCX0KKwlpcGRldi0+aWRldiA9IGlvbl9kZXZpY2VfY3JlYXRlKE5VTEwpOworCWlmIChJU19FUlIoaXBkZXYtPmlkZXYpKQorCQlyZXR1cm4gUFRSX0VSUihpcGRldi0+aWRldik7CiAKLQkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJoZWFwLWJhc2UiLCAmYmFzZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoImNoZWNrIHRoZSBiYXNlIG9mIG5vZGUgJXNcbiIsIG5wLT5uYW1lKTsKLQkJCWNvbnRpbnVlOwotCQl9CisJaXBkZXYtPmRhdGEgPSBpb25fcGFyc2VfZHQocGRldiwgaGlzaV9oZWFwcyk7CisJaWYgKElTX0VSUihpcGRldi0+ZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGlwZGV2LT5kYXRhKTsKIAotCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImhlYXAtc2l6ZSIsICZzaXplKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiY2hlY2sgdGhlIHNpemUgb2Ygbm9kZSAlc1xuIiwgbnAtPm5hbWUpOwotCQkJY29udGludWU7Ci0JCX0KKwlpcGRldi0+aGVhcHMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKKwkJCQlzaXplb2Yoc3RydWN0IGlvbl9oZWFwKSAqIGlwZGV2LT5kYXRhLT5uciwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWlwZGV2LT5oZWFwcykgeworCQlpb25fZGVzdHJveV9wbGF0Zm9ybV9kYXRhKGlwZGV2LT5kYXRhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCi0JCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAiaGVhcC10eXBlIiwgJnR5cGVfbmFtZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoImNoZWNrIHRoZSB0eXBlIG9mIG5vZGUgJXNcbiIsIG5wLT5uYW1lKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJcmV0ID0gZ2V0X3R5cGVfYnlfbmFtZSh0eXBlX25hbWUsICZ0eXBlKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigidHlwZSBuYW1lIGVycm9yICVzIVxuIiwgdHlwZV9uYW1lKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXByX2luZm8oImhlYXAgaW5kZXggJWQgOiBuYW1lICVzIGJhc2UgMHgleCBzaXplIDB4JXggaWQgJWQgdHlwZSAlZFxuIiwKLQkJCWluZGV4LCBoZWFwX25hbWUsIGJhc2UsIHNpemUsIGlkLCB0eXBlKTsKLQotCQlwX2RhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKLQkJCQkgICAgICBzaXplb2Yoc3RydWN0IGlvbl9wbGF0Zm9ybV9oZWFwKSwKLQkJCQkgICAgICBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwX2RhdGEpCisJZm9yIChpID0gMDsgaSA8IGlwZGV2LT5kYXRhLT5ucjsgaSsrKSB7CisJCWlwZGV2LT5oZWFwc1tpXSA9IGlvbl9oZWFwX2NyZWF0ZSgmaXBkZXYtPmRhdGEtPmhlYXBzW2ldKTsKKwkJaWYgKCFpcGRldi0+aGVhcHMpIHsKKwkJCWlvbl9kZXN0cm95X3BsYXRmb3JtX2RhdGEoaXBkZXYtPmRhdGEpOwogCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJcF9kYXRhLT5uYW1lID0gaGVhcF9uYW1lOwotCQlwX2RhdGEtPmJhc2UgPSBiYXNlOwotCQlwX2RhdGEtPnNpemUgPSBzaXplOwotCQlwX2RhdGEtPmlkID0gaWQ7Ci0JCXBfZGF0YS0+dHlwZSA9IHR5cGU7Ci0KLQkJaGVhcHNfZGF0YVtpbmRleF0gPSBwX2RhdGE7Ci0JCWluZGV4Kys7CisJCX0KKwkJaW9uX2RldmljZV9hZGRfaGVhcChpcGRldi0+aWRldiwgaXBkZXYtPmhlYXBzW2ldKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaGk2MjIwX2lvbl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCBpOwotCWludCBlcnI7Ci0Jc3RhdGljIHN0cnVjdCBpb25fcGxhdGZvcm1faGVhcCAqcF9oZWFwOwotCi0JaWRldiA9IGlvbl9kZXZpY2VfY3JlYXRlKE5VTEwpOwotCWVyciA9IGhpNjIyMF9zZXRfcGxhdGZvcm1fZGF0YShwZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCXByX2VycigiaW9uIHNldCBwbGF0Zm9ybSBkYXRhIGVycm9yIVxuIik7Ci0JCWdvdG8gZXJyX2ZyZWVfaWRldjsKLQl9Ci0JaGVhcHMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKLQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpb25faGVhcCAqKSAqIG51bV9oZWFwcywKLQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFoZWFwcykgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9mcmVlX2lkZXY7Ci0JfQotCi0JLyoKLQkgKiBjcmVhdGUgdGhlIGhlYXBzIGFzIHNwZWNpZmllZCBpbiB0aGUgZHRzIGZpbGUKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2hlYXBzOyBpKyspIHsKLQkJcF9oZWFwID0gaGVhcHNfZGF0YVtpXTsKLQkJaGVhcHNbaV0gPSBpb25faGVhcF9jcmVhdGUocF9oZWFwKTsKLQkJaWYgKElTX0VSUl9PUl9OVUxMKGhlYXBzW2ldKSkgewotCQkJZXJyID0gUFRSX0VSUihoZWFwc1tpXSk7Ci0JCQlnb3RvIGVycl9mcmVlX2hlYXBzOwotCQl9Ci0KLQkJaW9uX2RldmljZV9hZGRfaGVhcChpZGV2LCBoZWFwc1tpXSk7Ci0KLQkJcHJfaW5mbygiJXM6IGFkZGluZyBoZWFwICVzIG9mIHR5cGUgJWQgd2l0aCAlbHhAJWx4XG4iLAotCQkJX19mdW5jX18sIHBfaGVhcC0+bmFtZSwgcF9oZWFwLT50eXBlLAotCQkJcF9oZWFwLT5iYXNlLCAodW5zaWduZWQgbG9uZylwX2hlYXAtPnNpemUpOwotCX0KLQlyZXR1cm4gZXJyOwotCi1lcnJfZnJlZV9oZWFwczoKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2hlYXBzOyArK2kpIHsKLQkJaW9uX2hlYXBfZGVzdHJveShoZWFwc1tpXSk7Ci0JCWhlYXBzW2ldID0gTlVMTDsKLQl9Ci1lcnJfZnJlZV9pZGV2OgotCWlvbl9kZXZpY2VfZGVzdHJveShpZGV2KTsKLQotCXJldHVybiBlcnI7Ci19Ci0KIHN0YXRpYyBpbnQgaGk2MjIwX2lvbl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgaGlzaV9pb25fZGV2ICppcGRldjsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBudW1faGVhcHM7IGkrKykgewotCQlpb25faGVhcF9kZXN0cm95KGhlYXBzW2ldKTsKLQkJaGVhcHNbaV0gPSBOVUxMOwotCX0KLQlpb25fZGV2aWNlX2Rlc3Ryb3koaWRldik7CisJaXBkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBpcGRldi0+ZGF0YS0+bnI7IGkrKykKKwkJaW9uX2hlYXBfZGVzdHJveShpcGRldi0+aGVhcHNbaV0pOworCisJaW9uX2Rlc3Ryb3lfcGxhdGZvcm1fZGF0YShpcGRldi0+ZGF0YSk7CisJaW9uX2RldmljZV9kZXN0cm95KGlwZGV2LT5pZGV2KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbi1pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbi1pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNzQzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uLWlvY3RsLmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJpb24uaCIKKyNpbmNsdWRlICJpb25fcHJpdi5oIgorI2luY2x1ZGUgImNvbXBhdF9pb24uaCIKKwordW5pb24gaW9uX2lvY3RsX2FyZyB7CisJc3RydWN0IGlvbl9mZF9kYXRhIGZkOworCXN0cnVjdCBpb25fYWxsb2NhdGlvbl9kYXRhIGFsbG9jYXRpb247CisJc3RydWN0IGlvbl9oYW5kbGVfZGF0YSBoYW5kbGU7CisJc3RydWN0IGlvbl9jdXN0b21fZGF0YSBjdXN0b207CisJc3RydWN0IGlvbl9oZWFwX3F1ZXJ5IHF1ZXJ5OworfTsKKworc3RhdGljIGludCB2YWxpZGF0ZV9pb2N0bF9hcmcodW5zaWduZWQgaW50IGNtZCwgdW5pb24gaW9uX2lvY3RsX2FyZyAqYXJnKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIElPTl9JT0NfSEVBUF9RVUVSWToKKwkJcmV0ID0gYXJnLT5xdWVyeS5yZXNlcnZlZDAgIT0gMDsKKwkJcmV0IHw9IGFyZy0+cXVlcnkucmVzZXJ2ZWQxICE9IDA7CisJCXJldCB8PSBhcmctPnF1ZXJ5LnJlc2VydmVkMiAhPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0ID8gLUVJTlZBTCA6IDA7Cit9CisKKy8qIGZpeCB1cCB0aGUgY2FzZXMgd2hlcmUgdGhlIGlvY3RsIGRpcmVjdGlvbiBiaXRzIGFyZSBpbmNvcnJlY3QgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW9uX2lvY3RsX2Rpcih1bnNpZ25lZCBpbnQgY21kKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBJT05fSU9DX1NZTkM6CisJY2FzZSBJT05fSU9DX0ZSRUU6CisJY2FzZSBJT05fSU9DX0NVU1RPTToKKwkJcmV0dXJuIF9JT0NfV1JJVEU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIF9JT0NfRElSKGNtZCk7CisJfQorfQorCitsb25nIGlvbl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaW9uX2RldmljZSAqZGV2ID0gY2xpZW50LT5kZXY7CisJc3RydWN0IGlvbl9oYW5kbGUgKmNsZWFudXBfaGFuZGxlID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgZGlyOworCXVuaW9uIGlvbl9pb2N0bF9hcmcgZGF0YTsKKworCWRpciA9IGlvbl9pb2N0bF9kaXIoY21kKTsKKworCWlmIChfSU9DX1NJWkUoY21kKSA+IHNpemVvZihkYXRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIFRoZSBjb3B5X2Zyb21fdXNlciBpcyB1bmNvbmRpdGlvbmFsIGhlcmUgZm9yIGJvdGggcmVhZCBhbmQgd3JpdGUKKwkgKiB0byBkbyB0aGUgdmFsaWRhdGUuIElmIHRoZXJlIGlzIG5vIHdyaXRlIGZvciB0aGUgaW9jdGwsIHRoZQorCSAqIGJ1ZmZlciBpcyBjbGVhcmVkCisJICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcsIF9JT0NfU0laRShjbWQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXQgPSB2YWxpZGF0ZV9pb2N0bF9hcmcoY21kLCAmZGF0YSk7CisJaWYgKFdBUk5fT05fT05DRShyZXQpKQorCQlyZXR1cm4gcmV0OworCisJaWYgKCEoZGlyICYgX0lPQ19XUklURSkpCisJCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBJT05fSU9DX0FMTE9DOgorCXsKKwkJc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZTsKKworCQloYW5kbGUgPSBpb25fYWxsb2MoY2xpZW50LCBkYXRhLmFsbG9jYXRpb24ubGVuLAorCQkJCQkJZGF0YS5hbGxvY2F0aW9uLmFsaWduLAorCQkJCQkJZGF0YS5hbGxvY2F0aW9uLmhlYXBfaWRfbWFzaywKKwkJCQkJCWRhdGEuYWxsb2NhdGlvbi5mbGFncyk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CisKKwkJZGF0YS5hbGxvY2F0aW9uLmhhbmRsZSA9IGhhbmRsZS0+aWQ7CisKKwkJY2xlYW51cF9oYW5kbGUgPSBoYW5kbGU7CisJCWJyZWFrOworCX0KKwljYXNlIElPTl9JT0NfRlJFRToKKwl7CisJCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGU7CisKKwkJbXV0ZXhfbG9jaygmY2xpZW50LT5sb2NrKTsKKwkJaGFuZGxlID0gaW9uX2hhbmRsZV9nZXRfYnlfaWRfbm9sb2NrKGNsaWVudCwgZGF0YS5oYW5kbGUuaGFuZGxlKTsKKwkJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCQltdXRleF91bmxvY2soJmNsaWVudC0+bG9jayk7CisJCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCQl9CisJCWlvbl9mcmVlX25vbG9jayhjbGllbnQsIGhhbmRsZSk7CisJCWlvbl9oYW5kbGVfcHV0X25vbG9jayhoYW5kbGUpOworCQltdXRleF91bmxvY2soJmNsaWVudC0+bG9jayk7CisJCWJyZWFrOworCX0KKwljYXNlIElPTl9JT0NfU0hBUkU6CisJY2FzZSBJT05fSU9DX01BUDoKKwl7CisJCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGU7CisKKwkJaGFuZGxlID0gaW9uX2hhbmRsZV9nZXRfYnlfaWQoY2xpZW50LCBkYXRhLmhhbmRsZS5oYW5kbGUpOworCQlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCQlkYXRhLmZkLmZkID0gaW9uX3NoYXJlX2RtYV9idWZfZmQoY2xpZW50LCBoYW5kbGUpOworCQlpb25faGFuZGxlX3B1dChoYW5kbGUpOworCQlpZiAoZGF0YS5mZC5mZCA8IDApCisJCQlyZXQgPSBkYXRhLmZkLmZkOworCQlicmVhazsKKwl9CisJY2FzZSBJT05fSU9DX0lNUE9SVDoKKwl7CisJCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGU7CisKKwkJaGFuZGxlID0gaW9uX2ltcG9ydF9kbWFfYnVmX2ZkKGNsaWVudCwgZGF0YS5mZC5mZCk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJZWxzZQorCQkJZGF0YS5oYW5kbGUuaGFuZGxlID0gaGFuZGxlLT5pZDsKKwkJYnJlYWs7CisJfQorCWNhc2UgSU9OX0lPQ19TWU5DOgorCXsKKwkJcmV0ID0gaW9uX3N5bmNfZm9yX2RldmljZShjbGllbnQsIGRhdGEuZmQuZmQpOworCQlicmVhazsKKwl9CisJY2FzZSBJT05fSU9DX0NVU1RPTToKKwl7CisJCWlmICghZGV2LT5jdXN0b21faW9jdGwpCisJCQlyZXR1cm4gLUVOT1RUWTsKKwkJcmV0ID0gZGV2LT5jdXN0b21faW9jdGwoY2xpZW50LCBkYXRhLmN1c3RvbS5jbWQsCisJCQkJCQlkYXRhLmN1c3RvbS5hcmcpOworCQlicmVhazsKKwl9CisJY2FzZSBJT05fSU9DX0hFQVBfUVVFUlk6CisJCXJldCA9IGlvbl9xdWVyeV9oZWFwcyhjbGllbnQsICZkYXRhLnF1ZXJ5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorCisJaWYgKGRpciAmIF9JT0NfUkVBRCkgeworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmRhdGEsIF9JT0NfU0laRShjbWQpKSkgeworCQkJaWYgKGNsZWFudXBfaGFuZGxlKQorCQkJCWlvbl9mcmVlKGNsaWVudCwgY2xlYW51cF9oYW5kbGUpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb24uYwppbmRleCBhMmNmOTNiLi4zOTZkZWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbi5jCkBAIC00MSw4MCArNDEsNiBAQAogI2luY2x1ZGUgImlvbl9wcml2LmgiCiAjaW5jbHVkZSAiY29tcGF0X2lvbi5oIgogCi0vKioKLSAqIHN0cnVjdCBpb25fZGV2aWNlIC0gdGhlIG1ldGFkYXRhIG9mIHRoZSBpb24gZGV2aWNlIG5vZGUKLSAqIEBkZXY6CQl0aGUgYWN0dWFsIG1pc2MgZGV2aWNlCi0gKiBAYnVmZmVyczoJCWFuIHJiIHRyZWUgb2YgYWxsIHRoZSBleGlzdGluZyBidWZmZXJzCi0gKiBAYnVmZmVyX2xvY2s6CWxvY2sgcHJvdGVjdGluZyB0aGUgdHJlZSBvZiBidWZmZXJzCi0gKiBAbG9jazoJCXJ3c2VtIHByb3RlY3RpbmcgdGhlIHRyZWUgb2YgaGVhcHMgYW5kIGNsaWVudHMKLSAqIEBoZWFwczoJCWxpc3Qgb2YgYWxsIHRoZSBoZWFwcyBpbiB0aGUgc3lzdGVtCi0gKiBAdXNlcl9jbGllbnRzOglsaXN0IG9mIGFsbCB0aGUgY2xpZW50cyBjcmVhdGVkIGZyb20gdXNlcnNwYWNlCi0gKi8KLXN0cnVjdCBpb25fZGV2aWNlIHsKLQlzdHJ1Y3QgbWlzY2RldmljZSBkZXY7Ci0Jc3RydWN0IHJiX3Jvb3QgYnVmZmVyczsKLQlzdHJ1Y3QgbXV0ZXggYnVmZmVyX2xvY2s7Ci0Jc3RydWN0IHJ3X3NlbWFwaG9yZSBsb2NrOwotCXN0cnVjdCBwbGlzdF9oZWFkIGhlYXBzOwotCWxvbmcgKCpjdXN0b21faW9jdGwpKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKLQlzdHJ1Y3QgcmJfcm9vdCBjbGllbnRzOwotCXN0cnVjdCBkZW50cnkgKmRlYnVnX3Jvb3Q7Ci0Jc3RydWN0IGRlbnRyeSAqaGVhcHNfZGVidWdfcm9vdDsKLQlzdHJ1Y3QgZGVudHJ5ICpjbGllbnRzX2RlYnVnX3Jvb3Q7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBpb25fY2xpZW50IC0gYSBwcm9jZXNzL2h3IGJsb2NrIGxvY2FsIGFkZHJlc3Mgc3BhY2UKLSAqIEBub2RlOgkJbm9kZSBpbiB0aGUgdHJlZSBvZiBhbGwgY2xpZW50cwotICogQGRldjoJCWJhY2twb2ludGVyIHRvIGlvbiBkZXZpY2UKLSAqIEBoYW5kbGVzOgkJYW4gcmIgdHJlZSBvZiBhbGwgdGhlIGhhbmRsZXMgaW4gdGhpcyBjbGllbnQKLSAqIEBpZHI6CQlhbiBpZHIgc3BhY2UgZm9yIGFsbG9jYXRpbmcgaGFuZGxlIGlkcwotICogQGxvY2s6CQlsb2NrIHByb3RlY3RpbmcgdGhlIHRyZWUgb2YgaGFuZGxlcwotICogQG5hbWU6CQl1c2VkIGZvciBkZWJ1Z2dpbmcKLSAqIEBkaXNwbGF5X25hbWU6CXVzZWQgZm9yIGRlYnVnZ2luZyAodW5pcXVlIHZlcnNpb24gb2YgQG5hbWUpCi0gKiBAZGlzcGxheV9zZXJpYWw6CXVzZWQgZm9yIGRlYnVnZ2luZyAodG8gbWFrZSBkaXNwbGF5X25hbWUgdW5pcXVlKQotICogQHRhc2s6CQl1c2VkIGZvciBkZWJ1Z2dpbmcKLSAqCi0gKiBBIGNsaWVudCByZXByZXNlbnRzIGEgbGlzdCBvZiBidWZmZXJzIHRoaXMgY2xpZW50IG1heSBhY2Nlc3MuCi0gKiBUaGUgbXV0ZXggc3RvcmVkIGhlcmUgaXMgdXNlZCB0byBwcm90ZWN0IGJvdGggaGFuZGxlcyB0cmVlCi0gKiBhcyB3ZWxsIGFzIHRoZSBoYW5kbGVzIHRoZW1zZWx2ZXMsIGFuZCBzaG91bGQgYmUgaGVsZCB3aGlsZSBtb2RpZnlpbmcgZWl0aGVyLgotICovCi1zdHJ1Y3QgaW9uX2NsaWVudCB7Ci0Jc3RydWN0IHJiX25vZGUgbm9kZTsKLQlzdHJ1Y3QgaW9uX2RldmljZSAqZGV2OwotCXN0cnVjdCByYl9yb290IGhhbmRsZXM7Ci0Jc3RydWN0IGlkciBpZHI7Ci0Jc3RydWN0IG11dGV4IGxvY2s7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQljaGFyICpkaXNwbGF5X25hbWU7Ci0JaW50IGRpc3BsYXlfc2VyaWFsOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLQlwaWRfdCBwaWQ7Ci0Jc3RydWN0IGRlbnRyeSAqZGVidWdfcm9vdDsKLX07Ci0KLS8qKgotICogaW9uX2hhbmRsZSAtIGEgY2xpZW50IGxvY2FsIHJlZmVyZW5jZSB0byBhIGJ1ZmZlcgotICogQHJlZjoJCXJlZmVyZW5jZSBjb3VudAotICogQGNsaWVudDoJCWJhY2sgcG9pbnRlciB0byB0aGUgY2xpZW50IHRoZSBidWZmZXIgcmVzaWRlcyBpbgotICogQGJ1ZmZlcjoJCXBvaW50ZXIgdG8gdGhlIGJ1ZmZlcgotICogQG5vZGU6CQlub2RlIGluIHRoZSBjbGllbnQncyBoYW5kbGUgcmJ0cmVlCi0gKiBAa21hcF9jbnQ6CQljb3VudCBvZiB0aW1lcyB0aGlzIGNsaWVudCBoYXMgbWFwcGVkIHRvIGtlcm5lbAotICogQGlkOgkJCWNsaWVudC11bmlxdWUgaWQgYWxsb2NhdGVkIGJ5IGNsaWVudC0+aWRyCi0gKgotICogTW9kaWZpY2F0aW9ucyB0byBub2RlLCBtYXBfY250IG9yIG1hcHBpbmcgc2hvdWxkIGJlIHByb3RlY3RlZCBieSB0aGUKLSAqIGxvY2sgaW4gdGhlIGNsaWVudC4gIE90aGVyIGZpZWxkcyBhcmUgbmV2ZXIgY2hhbmdlZCBhZnRlciBpbml0aWFsaXphdGlvbi4KLSAqLwotc3RydWN0IGlvbl9oYW5kbGUgewotCXN0cnVjdCBrcmVmIHJlZjsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBpb25fYnVmZmVyICpidWZmZXI7Ci0Jc3RydWN0IHJiX25vZGUgbm9kZTsKLQl1bnNpZ25lZCBpbnQga21hcF9jbnQ7Ci0JaW50IGlkOwotfTsKLQogYm9vbCBpb25fYnVmZmVyX2ZhdWx0X3VzZXJfbWFwcGluZ3Moc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcikKIHsKIAlyZXR1cm4gKGJ1ZmZlci0+ZmxhZ3MgJiBJT05fRkxBR19DQUNIRUQpICYmCkBAIC0xNzQsMTAgKzEwMCwxMCBAQAogCiAvKiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGlsZSBkZXYtPmxvY2sgaXMgaGVsZCAqLwogc3RhdGljIHN0cnVjdCBpb25fYnVmZmVyICppb25fYnVmZmVyX2NyZWF0ZShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCi0JCQkJICAgICBzdHJ1Y3QgaW9uX2RldmljZSAqZGV2LAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyBsZW4sCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIGFsaWduLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKKwkJCQkJICAgIHN0cnVjdCBpb25fZGV2aWNlICpkZXYsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWxpZ24sCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBpb25fYnVmZmVyICpidWZmZXI7CiAJc3RydWN0IHNnX3RhYmxlICp0YWJsZTsKQEAgLTIwNSwxOSArMTMxLDE2IEBACiAJCQlnb3RvIGVycjI7CiAJfQogCi0JYnVmZmVyLT5kZXYgPSBkZXY7Ci0JYnVmZmVyLT5zaXplID0gbGVuOwotCi0JdGFibGUgPSBoZWFwLT5vcHMtPm1hcF9kbWEoaGVhcCwgYnVmZmVyKTsKLQlpZiAoV0FSTl9PTkNFKHRhYmxlID09IE5VTEwsCi0JCQkiaGVhcC0+b3BzLT5tYXBfZG1hIHNob3VsZCByZXR1cm4gRVJSX1BUUiBvbiBlcnJvciIpKQotCQl0YWJsZSA9IEVSUl9QVFIoLUVJTlZBTCk7Ci0JaWYgKElTX0VSUih0YWJsZSkpIHsKKwlpZiAoYnVmZmVyLT5zZ190YWJsZSA9PSBOVUxMKSB7CisJCVdBUk5fT05DRSgxLCAiVGhpcyBoZWFwIG5lZWRzIHRvIHNldCB0aGUgc2d0YWJsZSIpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycjE7CiAJfQogCi0JYnVmZmVyLT5zZ190YWJsZSA9IHRhYmxlOworCXRhYmxlID0gYnVmZmVyLT5zZ190YWJsZTsKKwlidWZmZXItPmRldiA9IGRldjsKKwlidWZmZXItPnNpemUgPSBsZW47CisKIAlpZiAoaW9uX2J1ZmZlcl9mYXVsdF91c2VyX21hcHBpbmdzKGJ1ZmZlcikpIHsKIAkJaW50IG51bV9wYWdlcyA9IFBBR0VfQUxJR04oYnVmZmVyLT5zaXplKSAvIFBBR0VfU0laRTsKIAkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKQEAgLTIyNiw3ICsxNDksNyBAQAogCQlidWZmZXItPnBhZ2VzID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBudW1fcGFnZXMpOwogCQlpZiAoIWJ1ZmZlci0+cGFnZXMpIHsKIAkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycjsKKwkJCWdvdG8gZXJyMTsKIAkJfQogCiAJCWZvcl9lYWNoX3NnKHRhYmxlLT5zZ2wsIHNnLCB0YWJsZS0+bmVudHMsIGkpIHsKQEAgLTI2MCw4ICsxODMsNiBAQAogCW11dGV4X3VubG9jaygmZGV2LT5idWZmZXJfbG9jayk7CiAJcmV0dXJuIGJ1ZmZlcjsKIAotZXJyOgotCWhlYXAtPm9wcy0+dW5tYXBfZG1hKGhlYXAsIGJ1ZmZlcik7CiBlcnIxOgogCWhlYXAtPm9wcy0+ZnJlZShidWZmZXIpOwogZXJyMjoKQEAgLTI3Myw3ICsxOTQsNiBAQAogewogCWlmIChXQVJOX09OKGJ1ZmZlci0+a21hcF9jbnQgPiAwKSkKIAkJYnVmZmVyLT5oZWFwLT5vcHMtPnVubWFwX2tlcm5lbChidWZmZXItPmhlYXAsIGJ1ZmZlcik7Ci0JYnVmZmVyLT5oZWFwLT5vcHMtPnVubWFwX2RtYShidWZmZXItPmhlYXAsIGJ1ZmZlcik7CiAJYnVmZmVyLT5oZWFwLT5vcHMtPmZyZWUoYnVmZmVyKTsKIAl2ZnJlZShidWZmZXItPnBhZ2VzKTsKIAlrZnJlZShidWZmZXIpOwpAQCAtMzM3LDcgKzI1Nyw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaW9uX2hhbmRsZSAqaW9uX2hhbmRsZV9jcmVhdGUoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKLQkJCQkgICAgIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpCisJCQkJCSAgICBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKQogewogCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGU7CiAKQEAgLTM3NywyNiArMjk3LDE3IEBACiAJa2ZyZWUoaGFuZGxlKTsKIH0KIAotc3RydWN0IGlvbl9idWZmZXIgKmlvbl9oYW5kbGVfYnVmZmVyKHN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUpCi17Ci0JcmV0dXJuIGhhbmRsZS0+YnVmZmVyOwotfQotCiBzdGF0aWMgdm9pZCBpb25faGFuZGxlX2dldChzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKQogewogCWtyZWZfZ2V0KCZoYW5kbGUtPnJlZik7CiB9CiAKLXN0YXRpYyBpbnQgaW9uX2hhbmRsZV9wdXRfbm9sb2NrKHN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUpCitpbnQgaW9uX2hhbmRsZV9wdXRfbm9sb2NrKHN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUpCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IGtyZWZfcHV0KCZoYW5kbGUtPnJlZiwgaW9uX2hhbmRsZV9kZXN0cm95KTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGtyZWZfcHV0KCZoYW5kbGUtPnJlZiwgaW9uX2hhbmRsZV9kZXN0cm95KTsKIH0KIAotc3RhdGljIGludCBpb25faGFuZGxlX3B1dChzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKQoraW50IGlvbl9oYW5kbGVfcHV0KHN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUpCiB7CiAJc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCA9IGhhbmRsZS0+Y2xpZW50OwogCWludCByZXQ7CkBAIC00MjYsOCArMzM3LDggQEAKIAlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpb25faGFuZGxlICppb25faGFuZGxlX2dldF9ieV9pZF9ub2xvY2soc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKLQkJCQkJCWludCBpZCkKK3N0cnVjdCBpb25faGFuZGxlICppb25faGFuZGxlX2dldF9ieV9pZF9ub2xvY2soc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKKwkJCQkJICAgICAgIGludCBpZCkKIHsKIAlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOwogCkBAIC00MzgsNyArMzQ5LDcgQEAKIAlyZXR1cm4gaGFuZGxlID8gaGFuZGxlIDogRVJSX1BUUigtRUlOVkFMKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpb25faGFuZGxlICppb25faGFuZGxlX2dldF9ieV9pZChzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LAorc3RydWN0IGlvbl9oYW5kbGUgKmlvbl9oYW5kbGVfZ2V0X2J5X2lkKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsCiAJCQkJCSAgICAgICBpbnQgaWQpCiB7CiAJc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZTsKQEAgLTU1MSwxNSArNDYyLDEwIEBACiB9CiBFWFBPUlRfU1lNQk9MKGlvbl9hbGxvYyk7CiAKLXN0YXRpYyB2b2lkIGlvbl9mcmVlX25vbG9jayhzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKQordm9pZCBpb25fZnJlZV9ub2xvY2soc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKKwkJICAgICBzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKQogewotCWJvb2wgdmFsaWRfaGFuZGxlOwotCi0JQlVHX09OKGNsaWVudCAhPSBoYW5kbGUtPmNsaWVudCk7Ci0KLQl2YWxpZF9oYW5kbGUgPSBpb25faGFuZGxlX3ZhbGlkYXRlKGNsaWVudCwgaGFuZGxlKTsKLQotCWlmICghdmFsaWRfaGFuZGxlKSB7CisJaWYgKCFpb25faGFuZGxlX3ZhbGlkYXRlKGNsaWVudCwgaGFuZGxlKSkgewogCQlXQVJOKDEsICIlczogaW52YWxpZCBoYW5kbGUgcGFzc2VkIHRvIGZyZWUuXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CkBAIC01NzYsMzIgKzQ4Miw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlvbl9mcmVlKTsKIAotaW50IGlvbl9waHlzKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIHN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUsCi0JICAgICBpb25fcGh5c19hZGRyX3QgKmFkZHIsIHNpemVfdCAqbGVuKQotewotCXN0cnVjdCBpb25fYnVmZmVyICpidWZmZXI7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJmNsaWVudC0+bG9jayk7Ci0JaWYgKCFpb25faGFuZGxlX3ZhbGlkYXRlKGNsaWVudCwgaGFuZGxlKSkgewotCQltdXRleF91bmxvY2soJmNsaWVudC0+bG9jayk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWJ1ZmZlciA9IGhhbmRsZS0+YnVmZmVyOwotCi0JaWYgKCFidWZmZXItPmhlYXAtPm9wcy0+cGh5cykgewotCQlwcl9lcnIoIiVzOiBpb25fcGh5cyBpcyBub3QgaW1wbGVtZW50ZWQgYnkgdGhpcyBoZWFwIChuYW1lPSVzLCB0eXBlPSVkKS5cbiIsCi0JCQlfX2Z1bmNfXywgYnVmZmVyLT5oZWFwLT5uYW1lLCBidWZmZXItPmhlYXAtPnR5cGUpOwotCQltdXRleF91bmxvY2soJmNsaWVudC0+bG9jayk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQltdXRleF91bmxvY2soJmNsaWVudC0+bG9jayk7Ci0JcmV0ID0gYnVmZmVyLT5oZWFwLT5vcHMtPnBoeXMoYnVmZmVyLT5oZWFwLCBidWZmZXIsIGFkZHIsIGxlbik7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woaW9uX3BoeXMpOwotCiBzdGF0aWMgdm9pZCAqaW9uX2J1ZmZlcl9rbWFwX2dldChzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKQogewogCXZvaWQgKnZhZGRyOwpAQCAtNjEyLDcgKzQ5Miw3IEBACiAJfQogCXZhZGRyID0gYnVmZmVyLT5oZWFwLT5vcHMtPm1hcF9rZXJuZWwoYnVmZmVyLT5oZWFwLCBidWZmZXIpOwogCWlmIChXQVJOX09OQ0UodmFkZHIgPT0gTlVMTCwKLQkJCSJoZWFwLT5vcHMtPm1hcF9rZXJuZWwgc2hvdWxkIHJldHVybiBFUlJfUFRSIG9uIGVycm9yIikpCisJCSAgICAgICJoZWFwLT5vcHMtPm1hcF9rZXJuZWwgc2hvdWxkIHJldHVybiBFUlJfUFRSIG9uIGVycm9yIikpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCWlmIChJU19FUlIodmFkZHIpKQogCQlyZXR1cm4gdmFkZHI7CkBAIC03ODEsMTQgKzY2MSwxNCBAQAogfTsKIAogc3RhdGljIGludCBpb25fZ2V0X2NsaWVudF9zZXJpYWwoY29uc3Qgc3RydWN0IHJiX3Jvb3QgKnJvb3QsCi0JCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUpCisJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUpCiB7CiAJaW50IHNlcmlhbCA9IC0xOwogCXN0cnVjdCByYl9ub2RlICpub2RlOwogCiAJZm9yIChub2RlID0gcmJfZmlyc3Qocm9vdCk7IG5vZGU7IG5vZGUgPSByYl9uZXh0KG5vZGUpKSB7CiAJCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgaW9uX2NsaWVudCwKLQkJCQkJCW5vZGUpOworCQkJCQkJICAgICBub2RlKTsKIAogCQlpZiAoc3RyY21wKGNsaWVudC0+bmFtZSwgbmFtZSkpCiAJCQljb250aW51ZTsKQEAgLTg2MywxNCArNzQzLDE0IEBACiAJcmJfaW5zZXJ0X2NvbG9yKCZjbGllbnQtPm5vZGUsICZkZXYtPmNsaWVudHMpOwogCiAJY2xpZW50LT5kZWJ1Z19yb290ID0gZGVidWdmc19jcmVhdGVfZmlsZShjbGllbnQtPmRpc3BsYXlfbmFtZSwgMDY2NCwKLQkJCQkJCWRldi0+Y2xpZW50c19kZWJ1Z19yb290LAotCQkJCQkJY2xpZW50LCAmZGVidWdfY2xpZW50X2ZvcHMpOworCQkJCQkJIGRldi0+Y2xpZW50c19kZWJ1Z19yb290LAorCQkJCQkJIGNsaWVudCwgJmRlYnVnX2NsaWVudF9mb3BzKTsKIAlpZiAoIWNsaWVudC0+ZGVidWdfcm9vdCkgewogCQljaGFyIGJ1ZlsyNTZdLCAqcGF0aDsKIAogCQlwYXRoID0gZGVudHJ5X3BhdGgoZGV2LT5jbGllbnRzX2RlYnVnX3Jvb3QsIGJ1ZiwgMjU2KTsKIAkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIGNsaWVudCBkZWJ1Z2ZzIGF0ICVzLyVzXG4iLAotCQkJcGF0aCwgY2xpZW50LT5kaXNwbGF5X25hbWUpOworCQkgICAgICAgcGF0aCwgY2xpZW50LT5kaXNwbGF5X25hbWUpOwogCX0KIAogCXVwX3dyaXRlKCZkZXYtPmxvY2spOwpAQCAtOTE3LDI2ICs3OTcsNiBAQAogfQogRVhQT1JUX1NZTUJPTChpb25fY2xpZW50X2Rlc3Ryb3kpOwogCi1zdHJ1Y3Qgc2dfdGFibGUgKmlvbl9zZ190YWJsZShzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LAotCQkJICAgICAgc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSkKLXsKLQlzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyOwotCXN0cnVjdCBzZ190YWJsZSAqdGFibGU7Ci0KLQltdXRleF9sb2NrKCZjbGllbnQtPmxvY2spOwotCWlmICghaW9uX2hhbmRsZV92YWxpZGF0ZShjbGllbnQsIGhhbmRsZSkpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBoYW5kbGUgcGFzc2VkIHRvIG1hcF9kbWEuXG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCQltdXRleF91bmxvY2soJmNsaWVudC0+bG9jayk7Ci0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCX0KLQlidWZmZXIgPSBoYW5kbGUtPmJ1ZmZlcjsKLQl0YWJsZSA9IGJ1ZmZlci0+c2dfdGFibGU7Ci0JbXV0ZXhfdW5sb2NrKCZjbGllbnQtPmxvY2spOwotCXJldHVybiB0YWJsZTsKLX0KLUVYUE9SVF9TWU1CT0woaW9uX3NnX3RhYmxlKTsKLQogc3RhdGljIHZvaWQgaW9uX2J1ZmZlcl9zeW5jX2Zvcl9kZXZpY2Uoc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwKIAkJCQkgICAgICAgc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOwpAQCAtOTU4LDcgKzgxOCw3IEBACiB9CiAKIHZvaWQgaW9uX3BhZ2VzX3N5bmNfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAotCQlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQorCQkJICAgICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwogCkBAIC05OTgsNyArODU4LDcgQEAKIAogCQlpZiAoaW9uX2J1ZmZlcl9wYWdlX2lzX2RpcnR5KHBhZ2UpKQogCQkJaW9uX3BhZ2VzX3N5bmNfZm9yX2RldmljZShkZXYsIGlvbl9idWZmZXJfcGFnZShwYWdlKSwKLQkJCQkJCQlQQUdFX1NJWkUsIGRpcik7CisJCQkJCQkgIFBBR0VfU0laRSwgZGlyKTsKIAogCQlpb25fYnVmZmVyX3BhZ2VfY2xlYW4oYnVmZmVyLT5wYWdlcyArIGkpOwogCX0KQEAgLTEwNzYsNyArOTM2LDcgQEAKIAogCWlmICghYnVmZmVyLT5oZWFwLT5vcHMtPm1hcF91c2VyKSB7CiAJCXByX2VycigiJXM6IHRoaXMgaGVhcCBkb2VzIG5vdCBkZWZpbmUgYSBtZXRob2QgZm9yIG1hcHBpbmcgdG8gdXNlcnNwYWNlXG4iLAotCQkJX19mdW5jX18pOworCQkgICAgICAgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTExNjcsNyArMTAyNyw3IEBACiB9OwogCiBzdHJ1Y3QgZG1hX2J1ZiAqaW9uX3NoYXJlX2RtYV9idWYoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKLQkJCQkJCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUpCisJCQkJICBzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKQogewogCURFRklORV9ETUFfQlVGX0VYUE9SVF9JTkZPKGV4cF9pbmZvKTsKIAlzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyOwpAQCAtMTI3NSw3ICsxMTM1LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woaW9uX2ltcG9ydF9kbWFfYnVmX2ZkKTsKIAotc3RhdGljIGludCBpb25fc3luY19mb3JfZGV2aWNlKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIGludCBmZCkKK2ludCBpb25fc3luY19mb3JfZGV2aWNlKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIGludCBmZCkKIHsKIAlzdHJ1Y3QgZG1hX2J1ZiAqZG1hYnVmOwogCXN0cnVjdCBpb25fYnVmZmVyICpidWZmZXI7CkBAIC0xMjk5LDEyNCArMTE1OSw0NSBAQAogCXJldHVybiAwOwogfQogCi0vKiBmaXggdXAgdGhlIGNhc2VzIHdoZXJlIHRoZSBpb2N0bCBkaXJlY3Rpb24gYml0cyBhcmUgaW5jb3JyZWN0ICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGlvbl9pb2N0bF9kaXIodW5zaWduZWQgaW50IGNtZCkKK2ludCBpb25fcXVlcnlfaGVhcHMoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgc3RydWN0IGlvbl9oZWFwX3F1ZXJ5ICpxdWVyeSkKIHsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgSU9OX0lPQ19TWU5DOgotCWNhc2UgSU9OX0lPQ19GUkVFOgotCWNhc2UgSU9OX0lPQ19DVVNUT006Ci0JCXJldHVybiBfSU9DX1dSSVRFOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBfSU9DX0RJUihjbWQpOwotCX0KLX0KLQotc3RhdGljIGxvbmcgaW9uX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBpb25fZGV2aWNlICpkZXYgPSBjbGllbnQtPmRldjsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqY2xlYW51cF9oYW5kbGUgPSBOVUxMOwotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGludCBkaXI7CisJc3RydWN0IGlvbl9oZWFwX2RhdGEgX191c2VyICpidWZmZXIgPSB1NjRfdG9fdXNlcl9wdHIocXVlcnktPmhlYXBzKTsKKwlpbnQgcmV0ID0gLUVJTlZBTCwgY250ID0gMCwgbWF4X2NudDsKKwlzdHJ1Y3QgaW9uX2hlYXAgKmhlYXA7CisJc3RydWN0IGlvbl9oZWFwX2RhdGEgaGRhdGE7CiAKLQl1bmlvbiB7Ci0JCXN0cnVjdCBpb25fZmRfZGF0YSBmZDsKLQkJc3RydWN0IGlvbl9hbGxvY2F0aW9uX2RhdGEgYWxsb2NhdGlvbjsKLQkJc3RydWN0IGlvbl9oYW5kbGVfZGF0YSBoYW5kbGU7Ci0JCXN0cnVjdCBpb25fY3VzdG9tX2RhdGEgY3VzdG9tOwotCX0gZGF0YTsKKwltZW1zZXQoJmhkYXRhLCAwLCBzaXplb2YoaGRhdGEpKTsKIAotCWRpciA9IGlvbl9pb2N0bF9kaXIoY21kKTsKLQotCWlmIChfSU9DX1NJWkUoY21kKSA+IHNpemVvZihkYXRhKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoZGlyICYgX0lPQ19XUklURSkKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcsIF9JT0NfU0laRShjbWQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIElPTl9JT0NfQUxMT0M6Ci0JewotCQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOwotCi0JCWhhbmRsZSA9IGlvbl9hbGxvYyhjbGllbnQsIGRhdGEuYWxsb2NhdGlvbi5sZW4sCi0JCQkJCQlkYXRhLmFsbG9jYXRpb24uYWxpZ24sCi0JCQkJCQlkYXRhLmFsbG9jYXRpb24uaGVhcF9pZF9tYXNrLAotCQkJCQkJZGF0YS5hbGxvY2F0aW9uLmZsYWdzKTsKLQkJaWYgKElTX0VSUihoYW5kbGUpKQotCQkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKLQotCQlkYXRhLmFsbG9jYXRpb24uaGFuZGxlID0gaGFuZGxlLT5pZDsKLQotCQljbGVhbnVwX2hhbmRsZSA9IGhhbmRsZTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgSU9OX0lPQ19GUkVFOgotCXsKLQkJc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZTsKLQotCQltdXRleF9sb2NrKCZjbGllbnQtPmxvY2spOwotCQloYW5kbGUgPSBpb25faGFuZGxlX2dldF9ieV9pZF9ub2xvY2soY2xpZW50LCBkYXRhLmhhbmRsZS5oYW5kbGUpOwotCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJCW11dGV4X3VubG9jaygmY2xpZW50LT5sb2NrKTsKLQkJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7Ci0JCX0KLQkJaW9uX2ZyZWVfbm9sb2NrKGNsaWVudCwgaGFuZGxlKTsKLQkJaW9uX2hhbmRsZV9wdXRfbm9sb2NrKGhhbmRsZSk7Ci0JCW11dGV4X3VubG9jaygmY2xpZW50LT5sb2NrKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgSU9OX0lPQ19TSEFSRToKLQljYXNlIElPTl9JT0NfTUFQOgotCXsKLQkJc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZTsKLQotCQloYW5kbGUgPSBpb25faGFuZGxlX2dldF9ieV9pZChjbGllbnQsIGRhdGEuaGFuZGxlLmhhbmRsZSk7Ci0JCWlmIChJU19FUlIoaGFuZGxlKSkKLQkJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7Ci0JCWRhdGEuZmQuZmQgPSBpb25fc2hhcmVfZG1hX2J1Zl9mZChjbGllbnQsIGhhbmRsZSk7Ci0JCWlvbl9oYW5kbGVfcHV0KGhhbmRsZSk7Ci0JCWlmIChkYXRhLmZkLmZkIDwgMCkKLQkJCXJldCA9IGRhdGEuZmQuZmQ7Ci0JCWJyZWFrOwotCX0KLQljYXNlIElPTl9JT0NfSU1QT1JUOgotCXsKLQkJc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZTsKLQotCQloYW5kbGUgPSBpb25faW1wb3J0X2RtYV9idWZfZmQoY2xpZW50LCBkYXRhLmZkLmZkKTsKLQkJaWYgKElTX0VSUihoYW5kbGUpKQotCQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOwotCQllbHNlCi0JCQlkYXRhLmhhbmRsZS5oYW5kbGUgPSBoYW5kbGUtPmlkOwotCQlicmVhazsKLQl9Ci0JY2FzZSBJT05fSU9DX1NZTkM6Ci0JewotCQlyZXQgPSBpb25fc3luY19mb3JfZGV2aWNlKGNsaWVudCwgZGF0YS5mZC5mZCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIElPTl9JT0NfQ1VTVE9NOgotCXsKLQkJaWYgKCFkZXYtPmN1c3RvbV9pb2N0bCkKLQkJCXJldHVybiAtRU5PVFRZOwotCQlyZXQgPSBkZXYtPmN1c3RvbV9pb2N0bChjbGllbnQsIGRhdGEuY3VzdG9tLmNtZCwKLQkJCQkJCWRhdGEuY3VzdG9tLmFyZyk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT1RUWTsKKwlkb3duX3JlYWQoJmRldi0+bG9jayk7CisJaWYgKCFidWZmZXIpIHsKKwkJcXVlcnktPmNudCA9IGRldi0+aGVhcF9jbnQ7CisJCXJldCA9IDA7CisJCWdvdG8gb3V0OwogCX0KIAotCWlmIChkaXIgJiBfSU9DX1JFQUQpIHsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZkYXRhLCBfSU9DX1NJWkUoY21kKSkpIHsKLQkJCWlmIChjbGVhbnVwX2hhbmRsZSkKLQkJCQlpb25fZnJlZShjbGllbnQsIGNsZWFudXBfaGFuZGxlKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9CisJaWYgKHF1ZXJ5LT5jbnQgPD0gMCkKKwkJZ290byBvdXQ7CisKKwltYXhfY250ID0gcXVlcnktPmNudDsKKworCXBsaXN0X2Zvcl9lYWNoX2VudHJ5KGhlYXAsICZkZXYtPmhlYXBzLCBub2RlKSB7CisJCXN0cm5jcHkoaGRhdGEubmFtZSwgaGVhcC0+bmFtZSwgTUFYX0hFQVBfTkFNRSk7CisJCWhkYXRhLm5hbWVbc2l6ZW9mKGhkYXRhLm5hbWUpIC0gMV0gPSAnXDAnOworCQloZGF0YS50eXBlID0gaGVhcC0+dHlwZTsKKwkJaGRhdGEuaGVhcF9pZCA9IGhlYXAtPmlkOworCisJCXJldCA9IGNvcHlfdG9fdXNlcigmYnVmZmVyW2NudF0sCisJCQkJICAgJmhkYXRhLCBzaXplb2YoaGRhdGEpKTsKKworCQljbnQrKzsKKwkJaWYgKGNudCA+PSBtYXhfY250KQorCQkJYnJlYWs7CiAJfQorCisJcXVlcnktPmNudCA9IGNudDsKK291dDoKKwl1cF9yZWFkKCZkZXYtPmxvY2spOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE1MjgsNyArMTMwOSw3IEBACiAJc2VxX3ByaW50ZihzLCAiJTE2cyAlMTZ6dVxuIiwgInRvdGFsICIsIHRvdGFsX3NpemUpOwogCWlmIChoZWFwLT5mbGFncyAmIElPTl9IRUFQX0ZMQUdfREVGRVJfRlJFRSkKIAkJc2VxX3ByaW50ZihzLCAiJTE2cyAlMTZ6dVxuIiwgImRlZmVycmVkIGZyZWUiLAotCQkJCWhlYXAtPmZyZWVfbGlzdF9zaXplKTsKKwkJCSAgIGhlYXAtPmZyZWVfbGlzdF9zaXplKTsKIAlzZXFfcHV0cyhzLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAKIAlpZiAoaGVhcC0+ZGVidWdfc2hvdykKQEAgLTE1ODgsOCArMTM2OSw3IEBACiB7CiAJc3RydWN0IGRlbnRyeSAqZGVidWdfZmlsZTsKIAotCWlmICghaGVhcC0+b3BzLT5hbGxvY2F0ZSB8fCAhaGVhcC0+b3BzLT5mcmVlIHx8ICFoZWFwLT5vcHMtPm1hcF9kbWEgfHwKLQkgICAgIWhlYXAtPm9wcy0+dW5tYXBfZG1hKQorCWlmICghaGVhcC0+b3BzLT5hbGxvY2F0ZSB8fCAhaGVhcC0+b3BzLT5mcmVlKQogCQlwcl9lcnIoIiVzOiBjYW4gbm90IGFkZCBoZWFwIHdpdGggaW52YWxpZCBvcHMgc3RydWN0LlxuIiwKIAkJICAgICAgIF9fZnVuY19fKTsKIApAQCAtMTYxMSwxNSArMTM5MSwxNSBAQAogCXBsaXN0X25vZGVfaW5pdCgmaGVhcC0+bm9kZSwgLWhlYXAtPmlkKTsKIAlwbGlzdF9hZGQoJmhlYXAtPm5vZGUsICZkZXYtPmhlYXBzKTsKIAlkZWJ1Z19maWxlID0gZGVidWdmc19jcmVhdGVfZmlsZShoZWFwLT5uYW1lLCAwNjY0LAotCQkJCQlkZXYtPmhlYXBzX2RlYnVnX3Jvb3QsIGhlYXAsCi0JCQkJCSZkZWJ1Z19oZWFwX2ZvcHMpOworCQkJCQkgZGV2LT5oZWFwc19kZWJ1Z19yb290LCBoZWFwLAorCQkJCQkgJmRlYnVnX2hlYXBfZm9wcyk7CiAKIAlpZiAoIWRlYnVnX2ZpbGUpIHsKIAkJY2hhciBidWZbMjU2XSwgKnBhdGg7CiAKIAkJcGF0aCA9IGRlbnRyeV9wYXRoKGRldi0+aGVhcHNfZGVidWdfcm9vdCwgYnVmLCAyNTYpOwogCQlwcl9lcnIoIkZhaWxlZCB0byBjcmVhdGUgaGVhcCBkZWJ1Z2ZzIGF0ICVzLyVzXG4iLAotCQkJcGF0aCwgaGVhcC0+bmFtZSk7CisJCSAgICAgICBwYXRoLCBoZWFwLT5uYW1lKTsKIAl9CiAKIAlpZiAoaGVhcC0+c2hyaW5rZXIuY291bnRfb2JqZWN0cyAmJiBoZWFwLT5zaHJpbmtlci5zY2FuX29iamVjdHMpIHsKQEAgLTE2MzQsMTAgKzE0MTQsMTEgQEAKIAogCQkJcGF0aCA9IGRlbnRyeV9wYXRoKGRldi0+aGVhcHNfZGVidWdfcm9vdCwgYnVmLCAyNTYpOwogCQkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIGhlYXAgc2hyaW5rZXIgZGVidWdmcyBhdCAlcy8lc1xuIiwKLQkJCQlwYXRoLCBkZWJ1Z19uYW1lKTsKKwkJCSAgICAgICBwYXRoLCBkZWJ1Z19uYW1lKTsKIAkJfQogCX0KIAorCWRldi0+aGVhcF9jbnQrKzsKIAl1cF93cml0ZSgmZGV2LT5sb2NrKTsKIH0KIEVYUE9SVF9TWU1CT0woaW9uX2RldmljZV9hZGRfaGVhcCk7CkBAIC0xNzAyLDM4ICsxNDgzLDMgQEAKIAlrZnJlZShkZXYpOwogfQogRVhQT1JUX1NZTUJPTChpb25fZGV2aWNlX2Rlc3Ryb3kpOwotCi12b2lkIF9faW5pdCBpb25fcmVzZXJ2ZShzdHJ1Y3QgaW9uX3BsYXRmb3JtX2RhdGEgKmRhdGEpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bnI7IGkrKykgewotCQlpZiAoZGF0YS0+aGVhcHNbaV0uc2l6ZSA9PSAwKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGRhdGEtPmhlYXBzW2ldLmJhc2UgPT0gMCkgewotCQkJcGh5c19hZGRyX3QgcGFkZHI7Ci0KLQkJCXBhZGRyID0gbWVtYmxvY2tfYWxsb2NfYmFzZShkYXRhLT5oZWFwc1tpXS5zaXplLAotCQkJCQkJICAgIGRhdGEtPmhlYXBzW2ldLmFsaWduLAotCQkJCQkJICAgIE1FTUJMT0NLX0FMTE9DX0FOWVdIRVJFKTsKLQkJCWlmICghcGFkZHIpIHsKLQkJCQlwcl9lcnIoIiVzOiBlcnJvciBhbGxvY2F0aW5nIG1lbWJsb2NrIGZvciBoZWFwICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgaSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlkYXRhLT5oZWFwc1tpXS5iYXNlID0gcGFkZHI7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgcmV0ID0gbWVtYmxvY2tfcmVzZXJ2ZShkYXRhLT5oZWFwc1tpXS5iYXNlLAotCQkJCQkgICAgICAgZGF0YS0+aGVhcHNbaV0uc2l6ZSk7Ci0JCQlpZiAocmV0KQotCQkJCXByX2VycigibWVtYmxvY2sgcmVzZXJ2ZSBvZiAlenhAJWx4IGZhaWxlZFxuIiwKLQkJCQkgICAgICAgZGF0YS0+aGVhcHNbaV0uc2l6ZSwKLQkJCQkgICAgICAgZGF0YS0+aGVhcHNbaV0uYmFzZSk7Ci0JCX0KLQkJcHJfaW5mbygiJXM6ICVzIHJlc2VydmVkIGJhc2UgJWx4IHNpemUgJXp1XG4iLCBfX2Z1bmNfXywKLQkJCWRhdGEtPmhlYXBzW2ldLm5hbWUsCi0JCQlkYXRhLT5oZWFwc1tpXS5iYXNlLAotCQkJZGF0YS0+aGVhcHNbaV0uc2l6ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbi5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbi5oCmluZGV4IGExMzMxZmMuLjkzZGFmYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb24uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uLmgKQEAgLTczLDE3ICs3Myw2IEBACiB9OwogCiAvKioKLSAqIGlvbl9yZXNlcnZlKCkgLSByZXNlcnZlIG1lbW9yeSBmb3IgaW9uIGhlYXBzIGlmIGFwcGxpY2FibGUKLSAqIEBkYXRhOglwbGF0Zm9ybSBkYXRhIHNwZWNpZnlpbmcgc3RhcnRpbmcgcGh5c2ljYWwgYWRkcmVzcyBhbmQKLSAqCQlzaXplCi0gKgotICogQ2FsbHMgbWVtYmxvY2sgcmVzZXJ2ZSB0byBzZXQgYXNpZGUgbWVtb3J5IGZvciBoZWFwcyB0aGF0IGFyZQotICogbG9jYXRlZCBhdCBzcGVjaWZpYyBtZW1vcnkgYWRkcmVzc2VzIG9yIG9mIHNwZWNpZmljIHNpemVzIG5vdAotICogbWFuYWdlZCBieSB0aGUga2VybmVsCi0gKi8KLXZvaWQgaW9uX3Jlc2VydmUoc3RydWN0IGlvbl9wbGF0Zm9ybV9kYXRhICpkYXRhKTsKLQotLyoqCiAgKiBpb25fY2xpZW50X2NyZWF0ZSgpIC0gIGFsbG9jYXRlIGEgY2xpZW50IGFuZCByZXR1cm5zIGl0CiAgKiBAZGV2OgkJdGhlIGdsb2JhbCBpb24gZGV2aWNlCiAgKiBAbmFtZToJCXVzZWQgZm9yIGRlYnVnZ2luZwpAQCAtMTMwLDM2ICsxMTksNiBAQAogdm9pZCBpb25fZnJlZShzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKTsKIAogLyoqCi0gKiBpb25fcGh5cyAtIHJldHVybnMgdGhlIHBoeXNpY2FsIGFkZHJlc3MgYW5kIGxlbiBvZiBhIGhhbmRsZQotICogQGNsaWVudDoJdGhlIGNsaWVudAotICogQGhhbmRsZToJdGhlIGhhbmRsZQotICogQGFkZHI6CWEgcG9pbnRlciB0byBwdXQgdGhlIGFkZHJlc3MgaW4KLSAqIEBsZW46CWEgcG9pbnRlciB0byBwdXQgdGhlIGxlbmd0aCBpbgotICoKLSAqIFRoaXMgZnVuY3Rpb24gcXVlcmllcyB0aGUgaGVhcCBmb3IgYSBwYXJ0aWN1bGFyIGhhbmRsZSB0byBnZXQgdGhlCi0gKiBoYW5kbGUncyBwaHlzaWNhbCBhZGRyZXNzLiAgSXQndCBvdXRwdXQgaXMgb25seSBjb3JyZWN0IGlmCi0gKiBhIGhlYXAgcmV0dXJucyBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5IC0tIGluIG90aGVyIGNhc2VzCi0gKiB0aGlzIGFwaSBzaG91bGQgbm90IGJlIGltcGxlbWVudGVkIC0tIGlvbl9zZ190YWJsZSBzaG91bGQgYmUgdXNlZAotICogaW5zdGVhZC4gIFJldHVybnMgLUVJTlZBTCBpZiB0aGUgaGFuZGxlIGlzIGludmFsaWQuICBUaGlzIGhhcwotICogbm8gaW1wbGljYXRpb25zIG9uIHRoZSByZWZlcmVuY2UgY291bnRpbmcgb2YgdGhlIGhhbmRsZSAtLQotICogdGhlIHJldHVybmVkIHZhbHVlIG1heSBub3QgYmUgdmFsaWQgaWYgdGhlIGNhbGxlciBpcyBub3QKLSAqIGhvbGRpbmcgYSByZWZlcmVuY2UuCi0gKi8KLWludCBpb25fcGh5cyhzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlLAotCSAgICAgaW9uX3BoeXNfYWRkcl90ICphZGRyLCBzaXplX3QgKmxlbik7Ci0KLS8qKgotICogaW9uX21hcF9kbWEgLSByZXR1cm4gYW4gc2dfdGFibGUgZGVzY3JpYmluZyBhIGhhbmRsZQotICogQGNsaWVudDoJdGhlIGNsaWVudAotICogQGhhbmRsZToJdGhlIGhhbmRsZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2dfdGFibGUgZGVzY3JpYmluZwotICogYSBwYXJ0aWN1bGFyIGlvbiBoYW5kbGUuCi0gKi8KLXN0cnVjdCBzZ190YWJsZSAqaW9uX3NnX3RhYmxlKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsCi0JCQkgICAgICBzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKTsKLQotLyoqCiAgKiBpb25fbWFwX2tlcm5lbCAtIGNyZWF0ZSBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gaGFuZGxlCiAgKiBAY2xpZW50Ogl0aGUgY2xpZW50CiAgKiBAaGFuZGxlOgloYW5kbGUgdG8gbWFwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2NhcnZlb3V0X2hlYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fY2FydmVvdXRfaGVhcC5jCmluZGV4IDFmYjBkODEuLmE4ZWE5NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fY2FydmVvdXRfaGVhcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fY2FydmVvdXRfaGVhcC5jCkBAIC0yNSwxNSArMjUsMTcgQEAKICNpbmNsdWRlICJpb24uaCIKICNpbmNsdWRlICJpb25fcHJpdi5oIgogCisjZGVmaW5lIElPTl9DQVJWRU9VVF9BTExPQ0FURV9GQUlMCS0xCisKIHN0cnVjdCBpb25fY2FydmVvdXRfaGVhcCB7CiAJc3RydWN0IGlvbl9oZWFwIGhlYXA7CiAJc3RydWN0IGdlbl9wb29sICpwb29sOwogCWlvbl9waHlzX2FkZHJfdCBiYXNlOwogfTsKIAotaW9uX3BoeXNfYWRkcl90IGlvbl9jYXJ2ZW91dF9hbGxvY2F0ZShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWxpZ24pCitzdGF0aWMgaW9uX3BoeXNfYWRkcl90IGlvbl9jYXJ2ZW91dF9hbGxvY2F0ZShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWxpZ24pCiB7CiAJc3RydWN0IGlvbl9jYXJ2ZW91dF9oZWFwICpjYXJ2ZW91dF9oZWFwID0KIAkJY29udGFpbmVyX29mKGhlYXAsIHN0cnVjdCBpb25fY2FydmVvdXRfaGVhcCwgaGVhcCk7CkBAIC00NSw4ICs0Nyw4IEBACiAJcmV0dXJuIG9mZnNldDsKIH0KIAotdm9pZCBpb25fY2FydmVvdXRfZnJlZShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIGlvbl9waHlzX2FkZHJfdCBhZGRyLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKQorc3RhdGljIHZvaWQgaW9uX2NhcnZlb3V0X2ZyZWUoc3RydWN0IGlvbl9oZWFwICpoZWFwLCBpb25fcGh5c19hZGRyX3QgYWRkciwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlzdHJ1Y3QgaW9uX2NhcnZlb3V0X2hlYXAgKmNhcnZlb3V0X2hlYXAgPQogCQljb250YWluZXJfb2YoaGVhcCwgc3RydWN0IGlvbl9jYXJ2ZW91dF9oZWFwLCBoZWFwKTsKQEAgLTU2LDE5ICs1OCw2IEBACiAJZ2VuX3Bvb2xfZnJlZShjYXJ2ZW91dF9oZWFwLT5wb29sLCBhZGRyLCBzaXplKTsKIH0KIAotc3RhdGljIGludCBpb25fY2FydmVvdXRfaGVhcF9waHlzKHN0cnVjdCBpb25faGVhcCAqaGVhcCwKLQkJCQkgIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIsCi0JCQkJICBpb25fcGh5c19hZGRyX3QgKmFkZHIsIHNpemVfdCAqbGVuKQotewotCXN0cnVjdCBzZ190YWJsZSAqdGFibGUgPSBidWZmZXItPnByaXZfdmlydDsKLQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHNnX3BhZ2UodGFibGUtPnNnbCk7Ci0JaW9uX3BoeXNfYWRkcl90IHBhZGRyID0gUEZOX1BIWVMocGFnZV90b19wZm4ocGFnZSkpOwotCi0JKmFkZHIgPSBwYWRkcjsKLQkqbGVuID0gYnVmZmVyLT5zaXplOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGlvbl9jYXJ2ZW91dF9oZWFwX2FsbG9jYXRlKHN0cnVjdCBpb25faGVhcCAqaGVhcCwKIAkJCQkgICAgICBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyLAogCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbiwKQEAgLTk1LDcgKzg0LDcgQEAKIAl9CiAKIAlzZ19zZXRfcGFnZSh0YWJsZS0+c2dsLCBwZm5fdG9fcGFnZShQRk5fRE9XTihwYWRkcikpLCBzaXplLCAwKTsKLQlidWZmZXItPnByaXZfdmlydCA9IHRhYmxlOworCWJ1ZmZlci0+c2dfdGFibGUgPSB0YWJsZTsKIAogCXJldHVybiAwOwogCkBAIC0xMDksNyArOTgsNyBAQAogc3RhdGljIHZvaWQgaW9uX2NhcnZlb3V0X2hlYXBfZnJlZShzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKQogewogCXN0cnVjdCBpb25faGVhcCAqaGVhcCA9IGJ1ZmZlci0+aGVhcDsKLQlzdHJ1Y3Qgc2dfdGFibGUgKnRhYmxlID0gYnVmZmVyLT5wcml2X3ZpcnQ7CisJc3RydWN0IHNnX3RhYmxlICp0YWJsZSA9IGJ1ZmZlci0+c2dfdGFibGU7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBzZ19wYWdlKHRhYmxlLT5zZ2wpOwogCWlvbl9waHlzX2FkZHJfdCBwYWRkciA9IFBGTl9QSFlTKHBhZ2VfdG9fcGZuKHBhZ2UpKTsKIApAQCAtMTI0LDIzICsxMTMsOSBAQAogCWtmcmVlKHRhYmxlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzZ190YWJsZSAqaW9uX2NhcnZlb3V0X2hlYXBfbWFwX2RtYShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCi0JCQkJCQkgIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpCi17Ci0JcmV0dXJuIGJ1ZmZlci0+cHJpdl92aXJ0OwotfQotCi1zdGF0aWMgdm9pZCBpb25fY2FydmVvdXRfaGVhcF91bm1hcF9kbWEoc3RydWN0IGlvbl9oZWFwICpoZWFwLAotCQkJCQlzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKQotewotfQotCiBzdGF0aWMgc3RydWN0IGlvbl9oZWFwX29wcyBjYXJ2ZW91dF9oZWFwX29wcyA9IHsKIAkuYWxsb2NhdGUgPSBpb25fY2FydmVvdXRfaGVhcF9hbGxvY2F0ZSwKIAkuZnJlZSA9IGlvbl9jYXJ2ZW91dF9oZWFwX2ZyZWUsCi0JLnBoeXMgPSBpb25fY2FydmVvdXRfaGVhcF9waHlzLAotCS5tYXBfZG1hID0gaW9uX2NhcnZlb3V0X2hlYXBfbWFwX2RtYSwKLQkudW5tYXBfZG1hID0gaW9uX2NhcnZlb3V0X2hlYXBfdW5tYXBfZG1hLAogCS5tYXBfdXNlciA9IGlvbl9oZWFwX21hcF91c2VyLAogCS5tYXBfa2VybmVsID0gaW9uX2hlYXBfbWFwX2tlcm5lbCwKIAkudW5tYXBfa2VybmVsID0gaW9uX2hlYXBfdW5tYXBfa2VybmVsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9jaHVua19oZWFwLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2NodW5rX2hlYXAuYwppbmRleCBlMDU1M2ZlLi43MDQ5NWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2NodW5rX2hlYXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2NodW5rX2hlYXAuYwpAQCAtMzQsOSArMzQsOSBAQAogfTsKIAogc3RhdGljIGludCBpb25fY2h1bmtfaGVhcF9hbGxvY2F0ZShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCi0JCQkJICAgICAgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24sCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKKwkJCQkgICBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbiwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBpb25fY2h1bmtfaGVhcCAqY2h1bmtfaGVhcCA9CiAJCWNvbnRhaW5lcl9vZihoZWFwLCBzdHJ1Y3QgaW9uX2NodW5rX2hlYXAsIGhlYXApOwpAQCAtNzEsMTEgKzcxLDExIEBACiAJCWlmICghcGFkZHIpCiAJCQlnb3RvIGVycjsKIAkJc2dfc2V0X3BhZ2Uoc2csIHBmbl90b19wYWdlKFBGTl9ET1dOKHBhZGRyKSksCi0JCQkJY2h1bmtfaGVhcC0+Y2h1bmtfc2l6ZSwgMCk7CisJCQkgICAgY2h1bmtfaGVhcC0+Y2h1bmtfc2l6ZSwgMCk7CiAJCXNnID0gc2dfbmV4dChzZyk7CiAJfQogCi0JYnVmZmVyLT5wcml2X3ZpcnQgPSB0YWJsZTsKKwlidWZmZXItPnNnX3RhYmxlID0gdGFibGU7CiAJY2h1bmtfaGVhcC0+YWxsb2NhdGVkICs9IGFsbG9jYXRlZF9zaXplOwogCXJldHVybiAwOwogZXJyOgpAQCAtOTUsNyArOTUsNyBAQAogCXN0cnVjdCBpb25faGVhcCAqaGVhcCA9IGJ1ZmZlci0+aGVhcDsKIAlzdHJ1Y3QgaW9uX2NodW5rX2hlYXAgKmNodW5rX2hlYXAgPQogCQljb250YWluZXJfb2YoaGVhcCwgc3RydWN0IGlvbl9jaHVua19oZWFwLCBoZWFwKTsKLQlzdHJ1Y3Qgc2dfdGFibGUgKnRhYmxlID0gYnVmZmVyLT5wcml2X3ZpcnQ7CisJc3RydWN0IHNnX3RhYmxlICp0YWJsZSA9IGJ1ZmZlci0+c2dfdGFibGU7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGFsbG9jYXRlZF9zaXplOwpAQCAtMTA2LDcgKzEwNiw3IEBACiAKIAlpZiAoaW9uX2J1ZmZlcl9jYWNoZWQoYnVmZmVyKSkKIAkJZG1hX3N5bmNfc2dfZm9yX2RldmljZShOVUxMLCB0YWJsZS0+c2dsLCB0YWJsZS0+bmVudHMsCi0JCQkJCQkJRE1BX0JJRElSRUNUSU9OQUwpOworCQkJCSAgICAgICBETUFfQklESVJFQ1RJT05BTCk7CiAKIAlmb3JfZWFjaF9zZyh0YWJsZS0+c2dsLCBzZywgdGFibGUtPm5lbnRzLCBpKSB7CiAJCWdlbl9wb29sX2ZyZWUoY2h1bmtfaGVhcC0+cG9vbCwgcGFnZV90b19waHlzKHNnX3BhZ2Uoc2cpKSwKQEAgLTExNywyMiArMTE3LDkgQEAKIAlrZnJlZSh0YWJsZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUgKmlvbl9jaHVua19oZWFwX21hcF9kbWEoc3RydWN0IGlvbl9oZWFwICpoZWFwLAotCQkJCQkgICAgICAgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlyZXR1cm4gYnVmZmVyLT5wcml2X3ZpcnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvbl9jaHVua19oZWFwX3VubWFwX2RtYShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCi0JCQkJICAgICBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKQotewotfQotCiBzdGF0aWMgc3RydWN0IGlvbl9oZWFwX29wcyBjaHVua19oZWFwX29wcyA9IHsKIAkuYWxsb2NhdGUgPSBpb25fY2h1bmtfaGVhcF9hbGxvY2F0ZSwKIAkuZnJlZSA9IGlvbl9jaHVua19oZWFwX2ZyZWUsCi0JLm1hcF9kbWEgPSBpb25fY2h1bmtfaGVhcF9tYXBfZG1hLAotCS51bm1hcF9kbWEgPSBpb25fY2h1bmtfaGVhcF91bm1hcF9kbWEsCiAJLm1hcF91c2VyID0gaW9uX2hlYXBfbWFwX3VzZXIsCiAJLm1hcF9rZXJuZWwgPSBpb25faGVhcF9tYXBfa2VybmVsLAogCS51bm1hcF9rZXJuZWwgPSBpb25faGVhcF91bm1hcF9rZXJuZWwsCkBAIC0xNzQsNyArMTYxLDcgQEAKIAljaHVua19oZWFwLT5oZWFwLnR5cGUgPSBJT05fSEVBUF9UWVBFX0NIVU5LOwogCWNodW5rX2hlYXAtPmhlYXAuZmxhZ3MgPSBJT05fSEVBUF9GTEFHX0RFRkVSX0ZSRUU7CiAJcHJfZGVidWcoIiVzOiBiYXNlICVsdSBzaXplICV6dSBhbGlnbiAlbGRcbiIsIF9fZnVuY19fLAotCQljaHVua19oZWFwLT5iYXNlLCBoZWFwX2RhdGEtPnNpemUsIGhlYXBfZGF0YS0+YWxpZ24pOworCQkgY2h1bmtfaGVhcC0+YmFzZSwgaGVhcF9kYXRhLT5zaXplLCBoZWFwX2RhdGEtPmFsaWduKTsKIAogCXJldHVybiAmY2h1bmtfaGVhcC0+aGVhcDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9jbWFfaGVhcC5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9jbWFfaGVhcC5jCmluZGV4IGEzNDQ2ZGEuLjZjN2RlNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fY21hX2hlYXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2NtYV9oZWFwLmMKQEAgLTc4LDYgKzc4LDcgQEAKIAkJZ290byBmcmVlX3RhYmxlOwogCS8qIGtlZXAgdGhpcyBmb3IgbWVtb3J5IHJlbGVhc2UgKi8KIAlidWZmZXItPnByaXZfdmlydCA9IGluZm87CisJYnVmZmVyLT5zZ190YWJsZSA9IGluZm8tPnRhYmxlOwogCWRldl9kYmcoZGV2LCAiQWxsb2NhdGUgYnVmZmVyICVwXG4iLCBidWZmZXIpOwogCXJldHVybiAwOwogCkBAIC0xMDUsMzYgKzEwNiw2IEBACiAJa2ZyZWUoaW5mbyk7CiB9CiAKLS8qIHJldHVybiBwaHlzaWNhbCBhZGRyZXNzIGluIGFkZHIgKi8KLXN0YXRpYyBpbnQgaW9uX2NtYV9waHlzKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwKLQkJCWlvbl9waHlzX2FkZHJfdCAqYWRkciwgc2l6ZV90ICpsZW4pCi17Ci0Jc3RydWN0IGlvbl9jbWFfaGVhcCAqY21hX2hlYXAgPSB0b19jbWFfaGVhcChidWZmZXItPmhlYXApOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNtYV9oZWFwLT5kZXY7Ci0Jc3RydWN0IGlvbl9jbWFfYnVmZmVyX2luZm8gKmluZm8gPSBidWZmZXItPnByaXZfdmlydDsKLQotCWRldl9kYmcoZGV2LCAiUmV0dXJuIGJ1ZmZlciAlcCBwaHlzaWNhbCBhZGRyZXNzICVwYVxuIiwgYnVmZmVyLAotCQkmaW5mby0+aGFuZGxlKTsKLQotCSphZGRyID0gaW5mby0+aGFuZGxlOwotCSpsZW4gPSBidWZmZXItPnNpemU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzZ190YWJsZSAqaW9uX2NtYV9oZWFwX21hcF9kbWEoc3RydWN0IGlvbl9oZWFwICpoZWFwLAotCQkJCQkgICAgIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpCi17Ci0Jc3RydWN0IGlvbl9jbWFfYnVmZmVyX2luZm8gKmluZm8gPSBidWZmZXItPnByaXZfdmlydDsKLQotCXJldHVybiBpbmZvLT50YWJsZTsKLX0KLQotc3RhdGljIHZvaWQgaW9uX2NtYV9oZWFwX3VubWFwX2RtYShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCi0JCQkJICAgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcikKLXsKLX0KLQogc3RhdGljIGludCBpb25fY21hX21tYXAoc3RydWN0IGlvbl9oZWFwICptYXBwZXIsIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIsCiAJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKQEAgLTE1NSwxNiArMTI2LDEzIEBACiB9CiAKIHN0YXRpYyB2b2lkIGlvbl9jbWFfdW5tYXBfa2VybmVsKHN0cnVjdCBpb25faGVhcCAqaGVhcCwKLQkJCQkJc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcikKKwkJCQkgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcikKIHsKIH0KIAogc3RhdGljIHN0cnVjdCBpb25faGVhcF9vcHMgaW9uX2NtYV9vcHMgPSB7CiAJLmFsbG9jYXRlID0gaW9uX2NtYV9hbGxvY2F0ZSwKIAkuZnJlZSA9IGlvbl9jbWFfZnJlZSwKLQkubWFwX2RtYSA9IGlvbl9jbWFfaGVhcF9tYXBfZG1hLAotCS51bm1hcF9kbWEgPSBpb25fY21hX2hlYXBfdW5tYXBfZG1hLAotCS5waHlzID0gaW9uX2NtYV9waHlzLAogCS5tYXBfdXNlciA9IGlvbl9jbWFfbW1hcCwKIAkubWFwX2tlcm5lbCA9IGlvbl9jbWFfbWFwX2tlcm5lbCwKIAkudW5tYXBfa2VybmVsID0gaW9uX2NtYV91bm1hcF9rZXJuZWwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2R1bW15X2RyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9kdW1teV9kcml2ZXIuYwppbmRleCA4MTRhM2M5Li5iMjNmMmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2R1bW15X2RyaXZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fZHVtbXlfZHJpdmVyLmMKQEAgLTk5LDcgKzk5LDcgQEAKIAkJc3RydWN0IGlvbl9wbGF0Zm9ybV9oZWFwICpoZWFwX2RhdGEgPSAmZHVtbXlfaW9uX3BkYXRhLmhlYXBzW2ldOwogCiAJCWlmIChoZWFwX2RhdGEtPnR5cGUgPT0gSU9OX0hFQVBfVFlQRV9DQVJWRU9VVCAmJgotCQkJCQkJCSFoZWFwX2RhdGEtPmJhc2UpCisJCSAgICAhaGVhcF9kYXRhLT5iYXNlKQogCQkJY29udGludWU7CiAKIAkJaWYgKGhlYXBfZGF0YS0+dHlwZSA9PSBJT05fSEVBUF9UWVBFX0NIVU5LICYmICFoZWFwX2RhdGEtPmJhc2UpCkBAIC0xMjAsMTIgKzEyMCwxMiBAQAogCiAJaWYgKGNhcnZlb3V0X3B0cikgewogCQlmcmVlX3BhZ2VzX2V4YWN0KGNhcnZlb3V0X3B0ciwKLQkJCQlkdW1teV9oZWFwc1tJT05fSEVBUF9UWVBFX0NBUlZFT1VUXS5zaXplKTsKKwkJCQkgZHVtbXlfaGVhcHNbSU9OX0hFQVBfVFlQRV9DQVJWRU9VVF0uc2l6ZSk7CiAJCWNhcnZlb3V0X3B0ciA9IE5VTEw7CiAJfQogCWlmIChjaHVua19wdHIpIHsKIAkJZnJlZV9wYWdlc19leGFjdChjaHVua19wdHIsCi0JCQkJZHVtbXlfaGVhcHNbSU9OX0hFQVBfVFlQRV9DSFVOS10uc2l6ZSk7CisJCQkJIGR1bW15X2hlYXBzW0lPTl9IRUFQX1RZUEVfQ0hVTktdLnNpemUpOwogCQljaHVua19wdHIgPSBOVUxMOwogCX0KIAlyZXR1cm4gZXJyOwpAQCAtMTQ0LDEyICsxNDQsMTIgQEAKIAogCWlmIChjYXJ2ZW91dF9wdHIpIHsKIAkJZnJlZV9wYWdlc19leGFjdChjYXJ2ZW91dF9wdHIsCi0JCQkJZHVtbXlfaGVhcHNbSU9OX0hFQVBfVFlQRV9DQVJWRU9VVF0uc2l6ZSk7CisJCQkJIGR1bW15X2hlYXBzW0lPTl9IRUFQX1RZUEVfQ0FSVkVPVVRdLnNpemUpOwogCQljYXJ2ZW91dF9wdHIgPSBOVUxMOwogCX0KIAlpZiAoY2h1bmtfcHRyKSB7CiAJCWZyZWVfcGFnZXNfZXhhY3QoY2h1bmtfcHRyLAotCQkJCWR1bW15X2hlYXBzW0lPTl9IRUFQX1RZUEVfQ0hVTktdLnNpemUpOworCQkJCSBkdW1teV9oZWFwc1tJT05fSEVBUF9UWVBFX0NIVU5LXS5zaXplKTsKIAkJY2h1bmtfcHRyID0gTlVMTDsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2hlYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25faGVhcC5jCmluZGV4IGNhMTVhODcuLjRlNWMwZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25faGVhcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25faGVhcC5jCkBAIC05Myw3ICs5Myw3IEBACiAJCX0KIAkJbGVuID0gbWluKGxlbiwgcmVtYWluZGVyKTsKIAkJcmV0ID0gcmVtYXBfcGZuX3JhbmdlKHZtYSwgYWRkciwgcGFnZV90b19wZm4ocGFnZSksIGxlbiwKLQkJCQl2bWEtPnZtX3BhZ2VfcHJvdCk7CisJCQkJICAgICAgdm1hLT52bV9wYWdlX3Byb3QpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAkJYWRkciArPSBsZW47CkBAIC0xMTYsNyArMTE2LDcgQEAKIH0KIAogc3RhdGljIGludCBpb25faGVhcF9zZ2xpc3RfemVybyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgdW5zaWduZWQgaW50IG5lbnRzLAotCQkJCQkJcGdwcm90X3QgcGdwcm90KQorCQkJCXBncHJvdF90IHBncHJvdCkKIHsKIAlpbnQgcCA9IDA7CiAJaW50IHJldCA9IDA7CkBAIC0xODEsNyArMTgxLDcgQEAKIH0KIAogc3RhdGljIHNpemVfdCBfaW9uX2hlYXBfZnJlZWxpc3RfZHJhaW4oc3RydWN0IGlvbl9oZWFwICpoZWFwLCBzaXplX3Qgc2l6ZSwKLQkJCQlib29sIHNraXBfcG9vbHMpCisJCQkJICAgICAgIGJvb2wgc2tpcF9wb29scykKIHsKIAlzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyOwogCXNpemVfdCB0b3RhbF9kcmFpbmVkID0gMDsKQEAgLTI2Niw3ICsyNjYsNyBAQAogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpb25faGVhcF9zaHJpbmtfY291bnQoc3RydWN0IHNocmlua2VyICpzaHJpbmtlciwKLQkJCQkJCXN0cnVjdCBzaHJpbmtfY29udHJvbCAqc2MpCisJCQkJCSAgIHN0cnVjdCBzaHJpbmtfY29udHJvbCAqc2MpCiB7CiAJc3RydWN0IGlvbl9oZWFwICpoZWFwID0gY29udGFpbmVyX29mKHNocmlua2VyLCBzdHJ1Y3QgaW9uX2hlYXAsCiAJCQkJCSAgICAgc2hyaW5rZXIpOwpAQCAtMjc5LDcgKzI3OSw3IEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlvbl9oZWFwX3Nocmlua19zY2FuKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIsCi0JCQkJCQlzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKQorCQkJCQkgIHN0cnVjdCBzaHJpbmtfY29udHJvbCAqc2MpCiB7CiAJc3RydWN0IGlvbl9oZWFwICpoZWFwID0gY29udGFpbmVyX29mKHNocmlua2VyLCBzdHJ1Y3QgaW9uX2hlYXAsCiAJCQkJCSAgICAgc2hyaW5rZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9vZi5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9vZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YmFjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX29mLmMKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBCYXNlZCBvbiB3b3JrIGZyb206CisgKiAgIEFuZHJldyBBbmRyaWFub3YgPGFuZHJld0BuY3JtbnQub3JnPgorICogICBHb29nbGUKKyAqICAgVGhlIExpbnV4IEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtY29udGlndW91cy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcmVzZXJ2ZWRfbWVtLmg+CisjaW5jbHVkZSAiaW9uLmgiCisjaW5jbHVkZSAiaW9uX3ByaXYuaCIKKyNpbmNsdWRlICJpb25fb2YuaCIKKworc3RhdGljIGludCBpb25fcGFyc2VfZHRfaGVhcF9jb21tb24oc3RydWN0IGRldmljZV9ub2RlICpoZWFwX25vZGUsCisJCQkJICAgIHN0cnVjdCBpb25fcGxhdGZvcm1faGVhcCAqaGVhcCwKKwkJCQkgICAgc3RydWN0IGlvbl9vZl9oZWFwICpjb21wYXRpYmxlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgY29tcGF0aWJsZVtpXS5uYW1lOyBpKyspIHsKKwkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKGhlYXBfbm9kZSwgY29tcGF0aWJsZVtpXS5jb21wYXQpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFjb21wYXRpYmxlW2ldLm5hbWUpCisJCXJldHVybiAtRU5PREVWOworCisJaGVhcC0+aWQgPSBjb21wYXRpYmxlW2ldLmhlYXBfaWQ7CisJaGVhcC0+dHlwZSA9IGNvbXBhdGlibGVbaV0udHlwZTsKKwloZWFwLT5uYW1lID0gY29tcGF0aWJsZVtpXS5uYW1lOworCWhlYXAtPmFsaWduID0gY29tcGF0aWJsZVtpXS5hbGlnbjsKKworCS8qIFNvbWUga2luZCBvZiBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyPyAqLworCisJcHJfaW5mbygiJXM6IGlkICVkIHR5cGUgJWQgbmFtZSAlcyBhbGlnbiAlbHhcbiIsIF9fZnVuY19fLAorCQloZWFwLT5pZCwgaGVhcC0+dHlwZSwgaGVhcC0+bmFtZSwgaGVhcC0+YWxpZ24pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvbl9zZXR1cF9oZWFwX2NvbW1vbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwYXJlbnQsCisJCQkJIHN0cnVjdCBkZXZpY2Vfbm9kZSAqaGVhcF9ub2RlLAorCQkJCSBzdHJ1Y3QgaW9uX3BsYXRmb3JtX2hlYXAgKmhlYXApCit7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGhlYXAtPnR5cGUpIHsKKwljYXNlIElPTl9IRUFQX1RZUEVfQ0FSVkVPVVQ6CisJY2FzZSBJT05fSEVBUF9UWVBFX0NIVU5LOgorCQlpZiAoaGVhcC0+YmFzZSAmJiBoZWFwLT5zaXplKQorCQkJcmV0dXJuIDA7CisKKwkJcmV0ID0gb2ZfcmVzZXJ2ZWRfbWVtX2RldmljZV9pbml0KGhlYXAtPnByaXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgaW9uX3BsYXRmb3JtX2RhdGEgKmlvbl9wYXJzZV9kdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgaW9uX29mX2hlYXAgKmNvbXBhdGlibGUpCit7CisJaW50IG51bV9oZWFwcywgcmV0OworCWNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHRfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgaW9uX3BsYXRmb3JtX2hlYXAgKmhlYXBzOworCXN0cnVjdCBpb25fcGxhdGZvcm1fZGF0YSAqZGF0YTsKKwlpbnQgaSA9IDA7CisKKwludW1faGVhcHMgPSBvZl9nZXRfYXZhaWxhYmxlX2NoaWxkX2NvdW50KGR0X25vZGUpOworCisJaWYgKCFudW1faGVhcHMpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJaGVhcHMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpb25fcGxhdGZvcm1faGVhcCkgKiBudW1faGVhcHMsCisJCQkgICAgIEdGUF9LRVJORUwpOworCWlmICghaGVhcHMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGlvbl9wbGF0Zm9ybV9kYXRhKSwKKwkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZm9yX2VhY2hfYXZhaWxhYmxlX2NoaWxkX29mX25vZGUoZHRfbm9kZSwgbm9kZSkgeworCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpoZWFwX3BkZXY7CisKKwkJcmV0ID0gaW9uX3BhcnNlX2R0X2hlYXBfY29tbW9uKG5vZGUsICZoZWFwc1tpXSwgY29tcGF0aWJsZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCisJCWhlYXBfcGRldiA9IG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUobm9kZSwgaGVhcHNbaV0ubmFtZSwKKwkJCQkJCSAgICAgICZwZGV2LT5kZXYpOworCQlpZiAoIXBkZXYpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJaGVhcF9wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9ICZoZWFwc1tpXTsKKworCQloZWFwc1tpXS5wcml2ID0gJmhlYXBfcGRldi0+ZGV2OworCisJCXJldCA9IGlvbl9zZXR1cF9oZWFwX2NvbW1vbihwZGV2LCBub2RlLCAmaGVhcHNbaV0pOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZXJyOworCQlpKys7CisJfQorCisJZGF0YS0+aGVhcHMgPSBoZWFwczsKKwlkYXRhLT5uciA9IG51bV9oZWFwczsKKwlyZXR1cm4gZGF0YTsKKworb3V0X2VycjoKKwlmb3IgKCA7IGkgPj0gMDsgaS0tKQorCQlpZiAoaGVhcHNbaV0ucHJpdikKKwkJCW9mX2RldmljZV91bnJlZ2lzdGVyKHRvX3BsYXRmb3JtX2RldmljZShoZWFwc1tpXS5wcml2KSk7CisKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCit2b2lkIGlvbl9kZXN0cm95X3BsYXRmb3JtX2RhdGEoc3RydWN0IGlvbl9wbGF0Zm9ybV9kYXRhICpkYXRhKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPm5yOyBpKyspCisJCWlmIChkYXRhLT5oZWFwc1tpXS5wcml2KQorCQkJb2ZfZGV2aWNlX3VucmVnaXN0ZXIodG9fcGxhdGZvcm1fZGV2aWNlKAorCQkJCWRhdGEtPmhlYXBzW2ldLnByaXYpKTsKK30KKworI2lmZGVmIENPTkZJR19PRl9SRVNFUlZFRF9NRU0KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2ZkdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3Jlc2VydmVkX21lbS5oPgorCitzdGF0aWMgaW50IHJtZW1faW9uX2RldmljZV9pbml0KHN0cnVjdCByZXNlcnZlZF9tZW0gKnJtZW0sIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGlvbl9wbGF0Zm9ybV9oZWFwICpoZWFwID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwloZWFwLT5iYXNlID0gcm1lbS0+YmFzZTsKKwloZWFwLT5iYXNlID0gcm1lbS0+c2l6ZTsKKwlwcl9kZWJ1ZygiJXM6IGhlYXAgJXMgYmFzZSAlcGEgc2l6ZSAlcGEgZGV2ICVwXG4iLCBfX2Z1bmNfXywKKwkJIGhlYXAtPm5hbWUsICZybWVtLT5iYXNlLCAmcm1lbS0+c2l6ZSwgZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcm1lbV9pb25fZGV2aWNlX3JlbGVhc2Uoc3RydWN0IHJlc2VydmVkX21lbSAqcm1lbSwKKwkJCQkgICAgc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZXNlcnZlZF9tZW1fb3BzIHJtZW1fZG1hX29wcyA9IHsKKwkuZGV2aWNlX2luaXQJPSBybWVtX2lvbl9kZXZpY2VfaW5pdCwKKwkuZGV2aWNlX3JlbGVhc2UJPSBybWVtX2lvbl9kZXZpY2VfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJtZW1faW9uX3NldHVwKHN0cnVjdCByZXNlcnZlZF9tZW0gKnJtZW0pCit7CisJcGh5c19hZGRyX3Qgc2l6ZSA9IHJtZW0tPnNpemU7CisKKwlzaXplID0gc2l6ZSAvIDEwMjQ7CisKKwlwcl9pbmZvKCJJb24gbWVtb3J5IHNldHVwIGF0ICVwYSBzaXplICVwYSBNaUJcbiIsCisJCSZybWVtLT5iYXNlLCAmc2l6ZSk7CisJcm1lbS0+b3BzID0gJnJtZW1fZG1hX29wczsKKwlyZXR1cm4gMDsKK30KKworUkVTRVJWRURNRU1fT0ZfREVDTEFSRShpb24sICJpb24tcmVnaW9uIiwgcm1lbV9pb25fc2V0dXApOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX29mLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX29mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI0MWExNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fb2YuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQmFzZWQgb24gd29yayBmcm9tOgorICogICBBbmRyZXcgQW5kcmlhbm92IDxhbmRyZXdAbmNybW50Lm9yZz4KKyAqICAgR29vZ2xlCisgKiAgIFRoZSBMaW51eCBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9JT05fT0ZfSAorI2RlZmluZSBfSU9OX09GX0gKKworc3RydWN0IGlvbl9vZl9oZWFwIHsKKwljb25zdCBjaGFyICpjb21wYXQ7CisJaW50IGhlYXBfaWQ7CisJaW50IHR5cGU7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgYWxpZ247Cit9OworCisjZGVmaW5lIFBMQVRGT1JNX0hFQVAoX2NvbXBhdCwgX2lkLCBfdHlwZSwgX25hbWUpIFwKK3sgXAorCS5jb21wYXQgPSBfY29tcGF0LCBcCisJLmhlYXBfaWQgPSBfaWQsIFwKKwkudHlwZSA9IF90eXBlLCBcCisJLm5hbWUgPSBfbmFtZSwgXAorCS5hbGlnbiA9IFBBR0VfU0laRSwgXAorfQorCitzdHJ1Y3QgaW9uX3BsYXRmb3JtX2RhdGEgKmlvbl9wYXJzZV9kdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCQlzdHJ1Y3QgaW9uX29mX2hlYXAgKmNvbXBhdGlibGUpOworCit2b2lkIGlvbl9kZXN0cm95X3BsYXRmb3JtX2RhdGEoc3RydWN0IGlvbl9wbGF0Zm9ybV9kYXRhICpkYXRhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3BhZ2VfcG9vbC5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9wYWdlX3Bvb2wuYwppbmRleCAxZmU4MDE2Li5hZWE4OWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3BhZ2VfcG9vbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fcGFnZV9wb29sLmMKQEAgLTMwLDggKzMwLDkgQEAKIAogCWlmICghcGFnZSkKIAkJcmV0dXJuIE5VTEw7Ci0JaW9uX3BhZ2VzX3N5bmNfZm9yX2RldmljZShOVUxMLCBwYWdlLCBQQUdFX1NJWkUgPDwgcG9vbC0+b3JkZXIsCi0JCQkJCQlETUFfQklESVJFQ1RJT05BTCk7CisJaWYgKCFwb29sLT5jYWNoZWQpCisJCWlvbl9wYWdlc19zeW5jX2Zvcl9kZXZpY2UoTlVMTCwgcGFnZSwgUEFHRV9TSVpFIDw8IHBvb2wtPm9yZGVyLAorCQkJCQkgIERNQV9CSURJUkVDVElPTkFMKTsKIAlyZXR1cm4gcGFnZTsKIH0KIApAQCAtMTE0LDcgKzExNSw3IEBACiB9CiAKIGludCBpb25fcGFnZV9wb29sX3NocmluayhzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqcG9vbCwgZ2ZwX3QgZ2ZwX21hc2ssCi0JCQkJaW50IG5yX3RvX3NjYW4pCisJCQkgaW50IG5yX3RvX3NjYW4pCiB7CiAJaW50IGZyZWVkID0gMDsKIAlib29sIGhpZ2g7CkBAIC0xNDcsNyArMTQ4LDggQEAKIAlyZXR1cm4gZnJlZWQ7CiB9CiAKLXN0cnVjdCBpb25fcGFnZV9wb29sICppb25fcGFnZV9wb29sX2NyZWF0ZShnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKQorc3RydWN0IGlvbl9wYWdlX3Bvb2wgKmlvbl9wYWdlX3Bvb2xfY3JlYXRlKGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXIsCisJCQkJCSAgIGJvb2wgY2FjaGVkKQogewogCXN0cnVjdCBpb25fcGFnZV9wb29sICpwb29sID0ga21hbGxvYyhzaXplb2YoKnBvb2wpLCBHRlBfS0VSTkVMKTsKIApAQCAtMTYxLDYgKzE2Myw4IEBACiAJcG9vbC0+b3JkZXIgPSBvcmRlcjsKIAltdXRleF9pbml0KCZwb29sLT5tdXRleCk7CiAJcGxpc3Rfbm9kZV9pbml0KCZwb29sLT5saXN0LCBvcmRlcik7CisJaWYgKGNhY2hlZCkKKwkJcG9vbC0+Y2FjaGVkID0gdHJ1ZTsKIAogCXJldHVybiBwb29sOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9wcml2LmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3ByaXYuaAppbmRleCAwMjM5ODgzLi4zYzNiMzI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3ByaXYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3ByaXYuaApAQCAtMjYsMTEgKzI2LDEwIEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zaHJpbmtlci5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogCiAjaW5jbHVkZSAiaW9uLmgiCiAKLXN0cnVjdCBpb25fYnVmZmVyICppb25faGFuZGxlX2J1ZmZlcihzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKTsKLQogLyoqCiAgKiBzdHJ1Y3QgaW9uX2J1ZmZlciAtIG1ldGFkYXRhIGZvciBhIHBhcnRpY3VsYXIgYnVmZmVyCiAgKiBAcmVmOgkJcmVmZXJlbmNlIGNvdW50CkBAIC00Miw4ICs0MSw2IEBACiAgKiBAc2l6ZToJCXNpemUgb2YgdGhlIGJ1ZmZlcgogICogQHByaXZfdmlydDoJCXByaXZhdGUgZGF0YSB0byB0aGUgYnVmZmVyIHJlcHJlc2VudGFibGUgYXMKICAqCQkJYSB2b2lkICoKLSAqIEBwcml2X3BoeXM6CQlwcml2YXRlIGRhdGEgdG8gdGhlIGJ1ZmZlciByZXByZXNlbnRhYmxlIGFzCi0gKgkJCWFuIGlvbl9waHlzX2FkZHJfdCAoYW5kIHNvbWVkYXkgYSBwaHlzX2FkZHJfdCkKICAqIEBsb2NrOgkJcHJvdGVjdHMgdGhlIGJ1ZmZlcnMgY250IGZpZWxkcwogICogQGttYXBfY250OgkJbnVtYmVyIG9mIHRpbWVzIHRoZSBidWZmZXIgaXMgbWFwcGVkIHRvIHRoZSBrZXJuZWwKICAqIEB2YWRkcjoJCXRoZSBrZXJuZWwgbWFwcGluZyBpZiBrbWFwX2NudCBpcyBub3QgemVybwpAQCAtNjksMTAgKzY2LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgcHJpdmF0ZV9mbGFnczsKIAlzaXplX3Qgc2l6ZTsKLQl1bmlvbiB7Ci0JCXZvaWQgKnByaXZfdmlydDsKLQkJaW9uX3BoeXNfYWRkcl90IHByaXZfcGh5czsKLQl9OworCXZvaWQgKnByaXZfdmlydDsKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIAlpbnQga21hcF9jbnQ7CiAJdm9pZCAqdmFkZHI7CkBAIC04OCwxMyArODIsODQgQEAKIHZvaWQgaW9uX2J1ZmZlcl9kZXN0cm95KHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpOwogCiAvKioKKyAqIHN0cnVjdCBpb25fZGV2aWNlIC0gdGhlIG1ldGFkYXRhIG9mIHRoZSBpb24gZGV2aWNlIG5vZGUKKyAqIEBkZXY6CQl0aGUgYWN0dWFsIG1pc2MgZGV2aWNlCisgKiBAYnVmZmVyczoJCWFuIHJiIHRyZWUgb2YgYWxsIHRoZSBleGlzdGluZyBidWZmZXJzCisgKiBAYnVmZmVyX2xvY2s6CWxvY2sgcHJvdGVjdGluZyB0aGUgdHJlZSBvZiBidWZmZXJzCisgKiBAbG9jazoJCXJ3c2VtIHByb3RlY3RpbmcgdGhlIHRyZWUgb2YgaGVhcHMgYW5kIGNsaWVudHMKKyAqIEBoZWFwczoJCWxpc3Qgb2YgYWxsIHRoZSBoZWFwcyBpbiB0aGUgc3lzdGVtCisgKiBAdXNlcl9jbGllbnRzOglsaXN0IG9mIGFsbCB0aGUgY2xpZW50cyBjcmVhdGVkIGZyb20gdXNlcnNwYWNlCisgKi8KK3N0cnVjdCBpb25fZGV2aWNlIHsKKwlzdHJ1Y3QgbWlzY2RldmljZSBkZXY7CisJc3RydWN0IHJiX3Jvb3QgYnVmZmVyczsKKwlzdHJ1Y3QgbXV0ZXggYnVmZmVyX2xvY2s7CisJc3RydWN0IHJ3X3NlbWFwaG9yZSBsb2NrOworCXN0cnVjdCBwbGlzdF9oZWFkIGhlYXBzOworCWxvbmcgKCpjdXN0b21faW9jdGwpKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKKwlzdHJ1Y3QgcmJfcm9vdCBjbGllbnRzOworCXN0cnVjdCBkZW50cnkgKmRlYnVnX3Jvb3Q7CisJc3RydWN0IGRlbnRyeSAqaGVhcHNfZGVidWdfcm9vdDsKKwlzdHJ1Y3QgZGVudHJ5ICpjbGllbnRzX2RlYnVnX3Jvb3Q7CisJaW50IGhlYXBfY250OworfTsKKworLyoqCisgKiBzdHJ1Y3QgaW9uX2NsaWVudCAtIGEgcHJvY2Vzcy9odyBibG9jayBsb2NhbCBhZGRyZXNzIHNwYWNlCisgKiBAbm9kZToJCW5vZGUgaW4gdGhlIHRyZWUgb2YgYWxsIGNsaWVudHMKKyAqIEBkZXY6CQliYWNrcG9pbnRlciB0byBpb24gZGV2aWNlCisgKiBAaGFuZGxlczoJCWFuIHJiIHRyZWUgb2YgYWxsIHRoZSBoYW5kbGVzIGluIHRoaXMgY2xpZW50CisgKiBAaWRyOgkJYW4gaWRyIHNwYWNlIGZvciBhbGxvY2F0aW5nIGhhbmRsZSBpZHMKKyAqIEBsb2NrOgkJbG9jayBwcm90ZWN0aW5nIHRoZSB0cmVlIG9mIGhhbmRsZXMKKyAqIEBuYW1lOgkJdXNlZCBmb3IgZGVidWdnaW5nCisgKiBAZGlzcGxheV9uYW1lOgl1c2VkIGZvciBkZWJ1Z2dpbmcgKHVuaXF1ZSB2ZXJzaW9uIG9mIEBuYW1lKQorICogQGRpc3BsYXlfc2VyaWFsOgl1c2VkIGZvciBkZWJ1Z2dpbmcgKHRvIG1ha2UgZGlzcGxheV9uYW1lIHVuaXF1ZSkKKyAqIEB0YXNrOgkJdXNlZCBmb3IgZGVidWdnaW5nCisgKgorICogQSBjbGllbnQgcmVwcmVzZW50cyBhIGxpc3Qgb2YgYnVmZmVycyB0aGlzIGNsaWVudCBtYXkgYWNjZXNzLgorICogVGhlIG11dGV4IHN0b3JlZCBoZXJlIGlzIHVzZWQgdG8gcHJvdGVjdCBib3RoIGhhbmRsZXMgdHJlZQorICogYXMgd2VsbCBhcyB0aGUgaGFuZGxlcyB0aGVtc2VsdmVzLCBhbmQgc2hvdWxkIGJlIGhlbGQgd2hpbGUgbW9kaWZ5aW5nIGVpdGhlci4KKyAqLworc3RydWN0IGlvbl9jbGllbnQgeworCXN0cnVjdCByYl9ub2RlIG5vZGU7CisJc3RydWN0IGlvbl9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcmJfcm9vdCBoYW5kbGVzOworCXN0cnVjdCBpZHIgaWRyOworCXN0cnVjdCBtdXRleCBsb2NrOworCWNvbnN0IGNoYXIgKm5hbWU7CisJY2hhciAqZGlzcGxheV9uYW1lOworCWludCBkaXNwbGF5X3NlcmlhbDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJcGlkX3QgcGlkOworCXN0cnVjdCBkZW50cnkgKmRlYnVnX3Jvb3Q7Cit9OworCisvKioKKyAqIGlvbl9oYW5kbGUgLSBhIGNsaWVudCBsb2NhbCByZWZlcmVuY2UgdG8gYSBidWZmZXIKKyAqIEByZWY6CQlyZWZlcmVuY2UgY291bnQKKyAqIEBjbGllbnQ6CQliYWNrIHBvaW50ZXIgdG8gdGhlIGNsaWVudCB0aGUgYnVmZmVyIHJlc2lkZXMgaW4KKyAqIEBidWZmZXI6CQlwb2ludGVyIHRvIHRoZSBidWZmZXIKKyAqIEBub2RlOgkJbm9kZSBpbiB0aGUgY2xpZW50J3MgaGFuZGxlIHJidHJlZQorICogQGttYXBfY250OgkJY291bnQgb2YgdGltZXMgdGhpcyBjbGllbnQgaGFzIG1hcHBlZCB0byBrZXJuZWwKKyAqIEBpZDoJCQljbGllbnQtdW5pcXVlIGlkIGFsbG9jYXRlZCBieSBjbGllbnQtPmlkcgorICoKKyAqIE1vZGlmaWNhdGlvbnMgdG8gbm9kZSwgbWFwX2NudCBvciBtYXBwaW5nIHNob3VsZCBiZSBwcm90ZWN0ZWQgYnkgdGhlCisgKiBsb2NrIGluIHRoZSBjbGllbnQuICBPdGhlciBmaWVsZHMgYXJlIG5ldmVyIGNoYW5nZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCisgKi8KK3N0cnVjdCBpb25faGFuZGxlIHsKKwlzdHJ1Y3Qga3JlZiByZWY7CisJc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyOworCXN0cnVjdCByYl9ub2RlIG5vZGU7CisJdW5zaWduZWQgaW50IGttYXBfY250OworCWludCBpZDsKK307CisKKy8qKgogICogc3RydWN0IGlvbl9oZWFwX29wcyAtIG9wcyB0byBvcGVyYXRlIG9uIGEgZ2l2ZW4gaGVhcAogICogQGFsbG9jYXRlOgkJYWxsb2NhdGUgbWVtb3J5CiAgKiBAZnJlZToJCWZyZWUgbWVtb3J5Ci0gKiBAcGh5cwkJZ2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBidWZmZXIgKG9ubHkgZGVmaW5lIG9uCi0gKgkJCXBoeXNpY2FsbHkgY29udGlndW91cyBoZWFwcykKLSAqIEBtYXBfZG1hCQltYXAgdGhlIG1lbW9yeSBmb3IgZG1hIHRvIGEgc2NhdHRlcmxpc3QKLSAqIEB1bm1hcF9kbWEJCXVubWFwIHRoZSBtZW1vcnkgZm9yIGRtYQogICogQG1hcF9rZXJuZWwJCW1hcCBtZW1vcnkgdG8gdGhlIGtlcm5lbAogICogQHVubWFwX2tlcm5lbAl1bm1hcCBtZW1vcnkgdG8gdGhlIGtlcm5lbAogICogQG1hcF91c2VyCQltYXAgbWVtb3J5IHRvIHVzZXJzcGFjZQpAQCAtMTExLDExICsxNzYsNiBAQAogCQkJc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBsZW4sCiAJCQl1bnNpZ25lZCBsb25nIGFsaWduLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIAl2b2lkICgqZnJlZSkoc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7Ci0JaW50ICgqcGh5cykoc3RydWN0IGlvbl9oZWFwICpoZWFwLCBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyLAotCQkgICAgaW9uX3BoeXNfYWRkcl90ICphZGRyLCBzaXplX3QgKmxlbik7Ci0Jc3RydWN0IHNnX3RhYmxlICogKCptYXBfZG1hKShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCi0JCQkJICAgICBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKTsKLQl2b2lkICgqdW5tYXBfZG1hKShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpOwogCXZvaWQgKiAoKm1hcF9rZXJuZWwpKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7CiAJdm9pZCAoKnVubWFwX2tlcm5lbCkoc3RydWN0IGlvbl9oZWFwICpoZWFwLCBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKTsKIAlpbnQgKCptYXBfdXNlcikoc3RydWN0IGlvbl9oZWFwICptYXBwZXIsIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIsCkBAIC0zMjgsMjAgKzM4OCw2IEBACiB2b2lkIGlvbl9jbWFfaGVhcF9kZXN0cm95KHN0cnVjdCBpb25faGVhcCAqKTsKIAogLyoqCi0gKiBrZXJuZWwgYXBpIHRvIGFsbG9jYXRlL2ZyZWUgZnJvbSBjYXJ2ZW91dCAtLSB1c2VkIHdoZW4gY2FydmVvdXQgaXMKLSAqIHVzZWQgdG8gYmFjayBhbiBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgY3VzdG9tIGhlYXAKLSAqLwotaW9uX3BoeXNfYWRkcl90IGlvbl9jYXJ2ZW91dF9hbGxvY2F0ZShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFsaWduKTsKLXZvaWQgaW9uX2NhcnZlb3V0X2ZyZWUoc3RydWN0IGlvbl9oZWFwICpoZWFwLCBpb25fcGh5c19hZGRyX3QgYWRkciwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci0vKioKLSAqIFRoZSBjYXJ2ZW91dCBoZWFwIHJldHVybnMgcGh5c2ljYWwgYWRkcmVzc2VzLCBzaW5jZSAwIG1heSBiZSBhIHZhbGlkCi0gKiBwaHlzaWNhbCBhZGRyZXNzLCB0aGlzIGlzIHVzZWQgdG8gaW5kaWNhdGUgYWxsb2NhdGlvbiBmYWlsZWQKLSAqLwotI2RlZmluZSBJT05fQ0FSVkVPVVRfQUxMT0NBVEVfRkFJTCAtMQotCi0vKioKICAqIGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgYW5kIGRlc3Ryb3lpbmcgYSBoZWFwIHBvb2wgLS0gYWxsb3dzIHlvdQogICogdG8ga2VlcCBhIHBvb2wgb2YgcHJlIGFsbG9jYXRlZCBtZW1vcnkgdG8gdXNlIGZyb20geW91ciBoZWFwLiAgS2VlcGluZwogICogYSBwb29sIG9mIG1lbW9yeSB0aGF0IGlzIHJlYWR5IGZvciBkbWEsIGllIGFueSBjYWNoZWQgbWFwcGluZyBoYXZlIGJlZW4KQEAgLTM2MCw2ICs0MDYsNyBAQAogICogQGdmcF9tYXNrOgkJZ2ZwX21hc2sgdG8gdXNlIGZyb20gYWxsb2MKICAqIEBvcmRlcjoJCW9yZGVyIG9mIHBhZ2VzIGluIHRoZSBwb29sCiAgKiBAbGlzdDoJCXBsaXN0IG5vZGUgZm9yIGxpc3Qgb2YgcG9vbHMKKyAqIEBjYWNoZWQ6CQlpdCdzIGNhY2hlZCBwb29sIG9yIG5vdAogICoKICAqIEFsbG93cyB5b3UgdG8ga2VlcCBhIHBvb2wgb2YgcHJlIGFsbG9jYXRlZCBwYWdlcyB0byB1c2UgZnJvbSB5b3VyIGhlYXAuCiAgKiBLZWVwaW5nIGEgcG9vbCBvZiBwYWdlcyB0aGF0IGlzIHJlYWR5IGZvciBkbWEsIGllIGFueSBjYWNoZWQgbWFwcGluZyBoYXZlCkBAIC0zNjksNiArNDE2LDcgQEAKIHN0cnVjdCBpb25fcGFnZV9wb29sIHsKIAlpbnQgaGlnaF9jb3VudDsKIAlpbnQgbG93X2NvdW50OworCWJvb2wgY2FjaGVkOwogCXN0cnVjdCBsaXN0X2hlYWQgaGlnaF9pdGVtczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxvd19pdGVtczsKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CkBAIC0zNzcsNyArNDI1LDggQEAKIAlzdHJ1Y3QgcGxpc3Rfbm9kZSBsaXN0OwogfTsKIAotc3RydWN0IGlvbl9wYWdlX3Bvb2wgKmlvbl9wYWdlX3Bvb2xfY3JlYXRlKGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXIpOworc3RydWN0IGlvbl9wYWdlX3Bvb2wgKmlvbl9wYWdlX3Bvb2xfY3JlYXRlKGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXIsCisJCQkJCSAgIGJvb2wgY2FjaGVkKTsKIHZvaWQgaW9uX3BhZ2VfcG9vbF9kZXN0cm95KHN0cnVjdCBpb25fcGFnZV9wb29sICopOwogc3RydWN0IHBhZ2UgKmlvbl9wYWdlX3Bvb2xfYWxsb2Moc3RydWN0IGlvbl9wYWdlX3Bvb2wgKik7CiB2b2lkIGlvbl9wYWdlX3Bvb2xfZnJlZShzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqLCBzdHJ1Y3QgcGFnZSAqKTsKQEAgLTQwMyw0ICs0NTIsMjIgQEAKIHZvaWQgaW9uX3BhZ2VzX3N5bmNfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAogCQlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKTsKIAorbG9uZyBpb25faW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworaW50IGlvbl9zeW5jX2Zvcl9kZXZpY2Uoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgaW50IGZkKTsKKworc3RydWN0IGlvbl9oYW5kbGUgKmlvbl9oYW5kbGVfZ2V0X2J5X2lkX25vbG9jayhzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LAorCQkJCQkJaW50IGlkKTsKKwordm9pZCBpb25fZnJlZV9ub2xvY2soc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSk7CisKK2ludCBpb25faGFuZGxlX3B1dF9ub2xvY2soc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSk7CisKK3N0cnVjdCBpb25faGFuZGxlICppb25faGFuZGxlX2dldF9ieV9pZChzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LAorCQkJCQkJaW50IGlkKTsKKworaW50IGlvbl9oYW5kbGVfcHV0KHN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUpOworCitpbnQgaW9uX3F1ZXJ5X2hlYXBzKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIHN0cnVjdCBpb25faGVhcF9xdWVyeSAqcXVlcnkpOworCiAjZW5kaWYgLyogX0lPTl9QUklWX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fc3lzdGVtX2hlYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fc3lzdGVtX2hlYXAuYwppbmRleCBiNjlkZmM3Li43ZTAyM2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3N5c3RlbV9oZWFwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9zeXN0ZW1faGVhcC5jCkBAIC0yNiwxNiArMjYsMTggQEAKICNpbmNsdWRlICJpb24uaCIKICNpbmNsdWRlICJpb25fcHJpdi5oIgogCisjZGVmaW5lIE5VTV9PUkRFUlMgQVJSQVlfU0laRShvcmRlcnMpCisKIHN0YXRpYyBnZnBfdCBoaWdoX29yZGVyX2dmcF9mbGFncyA9IChHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPIHwgX19HRlBfTk9XQVJOIHwKIAkJCQkgICAgIF9fR0ZQX05PUkVUUlkpICYgfl9fR0ZQX1JFQ0xBSU07Ci1zdGF0aWMgZ2ZwX3QgbG93X29yZGVyX2dmcF9mbGFncyAgPSAoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IF9fR0ZQX05PV0FSTik7CitzdGF0aWMgZ2ZwX3QgbG93X29yZGVyX2dmcF9mbGFncyAgPSAoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyk7CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG9yZGVyc1tdID0gezgsIDQsIDB9Owotc3RhdGljIGNvbnN0IGludCBudW1fb3JkZXJzID0gQVJSQVlfU0laRShvcmRlcnMpOworCiBzdGF0aWMgaW50IG9yZGVyX3RvX2luZGV4KHVuc2lnbmVkIGludCBvcmRlcikKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBudW1fb3JkZXJzOyBpKyspCisJZm9yIChpID0gMDsgaSA8IE5VTV9PUkRFUlM7IGkrKykKIAkJaWYgKG9yZGVyID09IG9yZGVyc1tpXSkKIAkJCXJldHVybiBpOwogCUJVRygpOwpAQCAtNDksNDcgKzUxLDU1IEBACiAKIHN0cnVjdCBpb25fc3lzdGVtX2hlYXAgewogCXN0cnVjdCBpb25faGVhcCBoZWFwOwotCXN0cnVjdCBpb25fcGFnZV9wb29sICpwb29sc1swXTsKKwlzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqdW5jYWNoZWRfcG9vbHNbTlVNX09SREVSU107CisJc3RydWN0IGlvbl9wYWdlX3Bvb2wgKmNhY2hlZF9wb29sc1tOVU1fT1JERVJTXTsKIH07CiAKKy8qKgorICogVGhlIHBhZ2UgZnJvbSBwYWdlLXBvb2wgYXJlIGFsbCB6ZXJvZWQgYmVmb3JlLiBXZSBuZWVkIGRvIGNhY2hlCisgKiBjbGVhbiBmb3IgY2FjaGVkIGJ1ZmZlci4gVGhlIHVuY2FjaGVkIGJ1ZmZlciBhcmUgYWx3YXlzIG5vbi1jYWNoZWQKKyAqIHNpbmNlIGl0J3MgYWxsb2NhdGVkLiBTbyBubyBuZWVkIGZvciBub24tY2FjaGVkIHBhZ2VzLgorICovCiBzdGF0aWMgc3RydWN0IHBhZ2UgKmFsbG9jX2J1ZmZlcl9wYWdlKHN0cnVjdCBpb25fc3lzdGVtX2hlYXAgKmhlYXAsCiAJCQkJICAgICAgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwKIAkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9yZGVyKQogewogCWJvb2wgY2FjaGVkID0gaW9uX2J1ZmZlcl9jYWNoZWQoYnVmZmVyKTsKLQlzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqcG9vbCA9IGhlYXAtPnBvb2xzW29yZGVyX3RvX2luZGV4KG9yZGVyKV07CisJc3RydWN0IGlvbl9wYWdlX3Bvb2wgKnBvb2w7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKLQlpZiAoIWNhY2hlZCkgewotCQlwYWdlID0gaW9uX3BhZ2VfcG9vbF9hbGxvYyhwb29sKTsKLQl9IGVsc2UgewotCQlnZnBfdCBnZnBfZmxhZ3MgPSBsb3dfb3JkZXJfZ2ZwX2ZsYWdzOworCWlmICghY2FjaGVkKQorCQlwb29sID0gaGVhcC0+dW5jYWNoZWRfcG9vbHNbb3JkZXJfdG9faW5kZXgob3JkZXIpXTsKKwllbHNlCisJCXBvb2wgPSBoZWFwLT5jYWNoZWRfcG9vbHNbb3JkZXJfdG9faW5kZXgob3JkZXIpXTsKIAotCQlpZiAob3JkZXIgPiA0KQotCQkJZ2ZwX2ZsYWdzID0gaGlnaF9vcmRlcl9nZnBfZmxhZ3M7Ci0JCXBhZ2UgPSBhbGxvY19wYWdlcyhnZnBfZmxhZ3MgfCBfX0dGUF9DT01QLCBvcmRlcik7Ci0JCWlmICghcGFnZSkKLQkJCXJldHVybiBOVUxMOworCXBhZ2UgPSBpb25fcGFnZV9wb29sX2FsbG9jKHBvb2wpOworCisJaWYgKGNhY2hlZCkKIAkJaW9uX3BhZ2VzX3N5bmNfZm9yX2RldmljZShOVUxMLCBwYWdlLCBQQUdFX1NJWkUgPDwgb3JkZXIsCi0JCQkJCQlETUFfQklESVJFQ1RJT05BTCk7Ci0JfQotCisJCQkJCSAgRE1BX0JJRElSRUNUSU9OQUwpOwogCXJldHVybiBwYWdlOwogfQogCiBzdGF0aWMgdm9pZCBmcmVlX2J1ZmZlcl9wYWdlKHN0cnVjdCBpb25fc3lzdGVtX2hlYXAgKmhlYXAsCiAJCQkgICAgIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIsIHN0cnVjdCBwYWdlICpwYWdlKQogeworCXN0cnVjdCBpb25fcGFnZV9wb29sICpwb29sOwogCXVuc2lnbmVkIGludCBvcmRlciA9IGNvbXBvdW5kX29yZGVyKHBhZ2UpOwogCWJvb2wgY2FjaGVkID0gaW9uX2J1ZmZlcl9jYWNoZWQoYnVmZmVyKTsKIAotCWlmICghY2FjaGVkICYmICEoYnVmZmVyLT5wcml2YXRlX2ZsYWdzICYgSU9OX1BSSVZfRkxBR19TSFJJTktFUl9GUkVFKSkgewotCQlzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqcG9vbCA9IGhlYXAtPnBvb2xzW29yZGVyX3RvX2luZGV4KG9yZGVyKV07Ci0KLQkJaW9uX3BhZ2VfcG9vbF9mcmVlKHBvb2wsIHBhZ2UpOwotCX0gZWxzZSB7CisJLyogZ28gdG8gc3lzdGVtICovCisJaWYgKGJ1ZmZlci0+cHJpdmF0ZV9mbGFncyAmIElPTl9QUklWX0ZMQUdfU0hSSU5LRVJfRlJFRSkgewogCQlfX2ZyZWVfcGFnZXMocGFnZSwgb3JkZXIpOworCQlyZXR1cm47CiAJfQorCisJaWYgKCFjYWNoZWQpCisJCXBvb2wgPSBoZWFwLT51bmNhY2hlZF9wb29sc1tvcmRlcl90b19pbmRleChvcmRlcildOworCWVsc2UKKwkJcG9vbCA9IGhlYXAtPmNhY2hlZF9wb29sc1tvcmRlcl90b19pbmRleChvcmRlcildOworCisJaW9uX3BhZ2VfcG9vbF9mcmVlKHBvb2wsIHBhZ2UpOwogfQogCiAKQEAgLTEwMSw3ICsxMTEsNyBAQAogCXN0cnVjdCBwYWdlICpwYWdlOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IG51bV9vcmRlcnM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBOVU1fT1JERVJTOyBpKyspIHsKIAkJaWYgKHNpemUgPCBvcmRlcl90b19zaXplKG9yZGVyc1tpXSkpCiAJCQljb250aW51ZTsKIAkJaWYgKG1heF9vcmRlciA8IG9yZGVyc1tpXSkKQEAgLTExOCw5ICsxMjgsOSBAQAogfQogCiBzdGF0aWMgaW50IGlvbl9zeXN0ZW1faGVhcF9hbGxvY2F0ZShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCi0JCQkJICAgICBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKKwkJCQkgICAgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBpb25fc3lzdGVtX2hlYXAgKnN5c19oZWFwID0gY29udGFpbmVyX29mKGhlYXAsCiAJCQkJCQkJc3RydWN0IGlvbl9zeXN0ZW1faGVhcCwKQEAgLTE0Miw3ICsxNTIsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZwYWdlcyk7CiAJd2hpbGUgKHNpemVfcmVtYWluaW5nID4gMCkgewogCQlwYWdlID0gYWxsb2NfbGFyZ2VzdF9hdmFpbGFibGUoc3lzX2hlYXAsIGJ1ZmZlciwgc2l6ZV9yZW1haW5pbmcsCi0JCQkJCQltYXhfb3JkZXIpOworCQkJCQkgICAgICAgbWF4X29yZGVyKTsKIAkJaWYgKCFwYWdlKQogCQkJZ290byBmcmVlX3BhZ2VzOwogCQlsaXN0X2FkZF90YWlsKCZwYWdlLT5scnUsICZwYWdlcyk7CkBAIC0xNjQsNyArMTc0LDcgQEAKIAkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CiAJfQogCi0JYnVmZmVyLT5wcml2X3ZpcnQgPSB0YWJsZTsKKwlidWZmZXItPnNnX3RhYmxlID0gdGFibGU7CiAJcmV0dXJuIDA7CiAKIGZyZWVfdGFibGU6CkBAIC0xODEsMTYgKzE5MSwxMSBAQAogCQkJCQkJCXN0cnVjdCBpb25fc3lzdGVtX2hlYXAsCiAJCQkJCQkJaGVhcCk7CiAJc3RydWN0IHNnX3RhYmxlICp0YWJsZSA9IGJ1ZmZlci0+c2dfdGFibGU7Ci0JYm9vbCBjYWNoZWQgPSBpb25fYnVmZmVyX2NhY2hlZChidWZmZXIpOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJaW50IGk7CiAKLQkvKgotCSAqICB1bmNhY2hlZCBwYWdlcyBjb21lIGZyb20gdGhlIHBhZ2UgcG9vbHMsIHplcm8gdGhlbSBiZWZvcmUgcmV0dXJuaW5nCi0JICogIGZvciBzZWN1cml0eSBwdXJwb3NlcyAob3RoZXIgYWxsb2NhdGlvbnMgYXJlIHplcm9kIGF0Ci0JICogIGFsbG9jIHRpbWUKLQkgKi8KLQlpZiAoIWNhY2hlZCAmJiAhKGJ1ZmZlci0+cHJpdmF0ZV9mbGFncyAmIElPTl9QUklWX0ZMQUdfU0hSSU5LRVJfRlJFRSkpCisJLyogemVybyB0aGUgYnVmZmVyIGJlZm9yZSBnb3RvIHBhZ2UgcG9vbCAqLworCWlmICghKGJ1ZmZlci0+cHJpdmF0ZV9mbGFncyAmIElPTl9QUklWX0ZMQUdfU0hSSU5LRVJfRlJFRSkpCiAJCWlvbl9oZWFwX2J1ZmZlcl96ZXJvKGJ1ZmZlcik7CiAKIAlmb3JfZWFjaF9zZyh0YWJsZS0+c2dsLCBzZywgdGFibGUtPm5lbnRzLCBpKQpAQCAtMTk5LDIwICsyMDQsMTEgQEAKIAlrZnJlZSh0YWJsZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUgKmlvbl9zeXN0ZW1faGVhcF9tYXBfZG1hKHN0cnVjdCBpb25faGVhcCAqaGVhcCwKLQkJCQkJCXN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpCi17Ci0JcmV0dXJuIGJ1ZmZlci0+cHJpdl92aXJ0OwotfQotCi1zdGF0aWMgdm9pZCBpb25fc3lzdGVtX2hlYXBfdW5tYXBfZG1hKHN0cnVjdCBpb25faGVhcCAqaGVhcCwKLQkJCQkgICAgICBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKQotewotfQotCiBzdGF0aWMgaW50IGlvbl9zeXN0ZW1faGVhcF9zaHJpbmsoc3RydWN0IGlvbl9oZWFwICpoZWFwLCBnZnBfdCBnZnBfbWFzaywKLQkJCQkJaW50IG5yX3RvX3NjYW4pCisJCQkJICBpbnQgbnJfdG9fc2NhbikKIHsKKwlzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqdW5jYWNoZWRfcG9vbDsKKwlzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqY2FjaGVkX3Bvb2w7CiAJc3RydWN0IGlvbl9zeXN0ZW1faGVhcCAqc3lzX2hlYXA7CiAJaW50IG5yX3RvdGFsID0gMDsKIAlpbnQgaSwgbnJfZnJlZWQ7CkBAIC0yMjMsMjggKzIxOSw0MSBAQAogCWlmICghbnJfdG9fc2NhbikKIAkJb25seV9zY2FuID0gMTsKIAotCWZvciAoaSA9IDA7IGkgPCBudW1fb3JkZXJzOyBpKyspIHsKLQkJc3RydWN0IGlvbl9wYWdlX3Bvb2wgKnBvb2wgPSBzeXNfaGVhcC0+cG9vbHNbaV07CisJZm9yIChpID0gMDsgaSA8IE5VTV9PUkRFUlM7IGkrKykgeworCQl1bmNhY2hlZF9wb29sID0gc3lzX2hlYXAtPnVuY2FjaGVkX3Bvb2xzW2ldOworCQljYWNoZWRfcG9vbCA9IHN5c19oZWFwLT5jYWNoZWRfcG9vbHNbaV07CiAKLQkJbnJfZnJlZWQgPSBpb25fcGFnZV9wb29sX3Nocmluayhwb29sLCBnZnBfbWFzaywgbnJfdG9fc2Nhbik7Ci0JCW5yX3RvdGFsICs9IG5yX2ZyZWVkOworCQlpZiAob25seV9zY2FuKSB7CisJCQlucl90b3RhbCArPSBpb25fcGFnZV9wb29sX3Nocmluayh1bmNhY2hlZF9wb29sLAorCQkJCQkJCSBnZnBfbWFzaywKKwkJCQkJCQkgbnJfdG9fc2Nhbik7CiAKLQkJaWYgKCFvbmx5X3NjYW4pIHsKKwkJCW5yX3RvdGFsICs9IGlvbl9wYWdlX3Bvb2xfc2hyaW5rKGNhY2hlZF9wb29sLAorCQkJCQkJCSBnZnBfbWFzaywKKwkJCQkJCQkgbnJfdG9fc2Nhbik7CisJCX0gZWxzZSB7CisJCQlucl9mcmVlZCA9IGlvbl9wYWdlX3Bvb2xfc2hyaW5rKHVuY2FjaGVkX3Bvb2wsCisJCQkJCQkJZ2ZwX21hc2ssCisJCQkJCQkJbnJfdG9fc2Nhbik7CiAJCQlucl90b19zY2FuIC09IG5yX2ZyZWVkOwotCQkJLyogc2hyaW5rIGNvbXBsZXRlZCAqLworCQkJbnJfdG90YWwgKz0gbnJfZnJlZWQ7CisJCQlpZiAobnJfdG9fc2NhbiA8PSAwKQorCQkJCWJyZWFrOworCQkJbnJfZnJlZWQgPSBpb25fcGFnZV9wb29sX3NocmluayhjYWNoZWRfcG9vbCwKKwkJCQkJCQlnZnBfbWFzaywKKwkJCQkJCQlucl90b19zY2FuKTsKKwkJCW5yX3RvX3NjYW4gLT0gbnJfZnJlZWQ7CisJCQlucl90b3RhbCArPSBucl9mcmVlZDsKIAkJCWlmIChucl90b19zY2FuIDw9IDApCiAJCQkJYnJlYWs7CiAJCX0KIAl9Ci0KIAlyZXR1cm4gbnJfdG90YWw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaW9uX2hlYXBfb3BzIHN5c3RlbV9oZWFwX29wcyA9IHsKIAkuYWxsb2NhdGUgPSBpb25fc3lzdGVtX2hlYXBfYWxsb2NhdGUsCiAJLmZyZWUgPSBpb25fc3lzdGVtX2hlYXBfZnJlZSwKLQkubWFwX2RtYSA9IGlvbl9zeXN0ZW1faGVhcF9tYXBfZG1hLAotCS51bm1hcF9kbWEgPSBpb25fc3lzdGVtX2hlYXBfdW5tYXBfZG1hLAogCS5tYXBfa2VybmVsID0gaW9uX2hlYXBfbWFwX2tlcm5lbCwKIAkudW5tYXBfa2VybmVsID0gaW9uX2hlYXBfdW5tYXBfa2VybmVsLAogCS5tYXBfdXNlciA9IGlvbl9oZWFwX21hcF91c2VyLApAQCAtMjU5LDUyICsyNjgsODkgQEAKIAkJCQkJCQlzdHJ1Y3QgaW9uX3N5c3RlbV9oZWFwLAogCQkJCQkJCWhlYXApOwogCWludCBpOworCXN0cnVjdCBpb25fcGFnZV9wb29sICpwb29sOwogCi0JZm9yIChpID0gMDsgaSA8IG51bV9vcmRlcnM7IGkrKykgewotCQlzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqcG9vbCA9IHN5c19oZWFwLT5wb29sc1tpXTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX09SREVSUzsgaSsrKSB7CisJCXBvb2wgPSBzeXNfaGVhcC0+dW5jYWNoZWRfcG9vbHNbaV07CiAKLQkJc2VxX3ByaW50ZihzLCAiJWQgb3JkZXIgJXUgaGlnaG1lbSBwYWdlcyBpbiBwb29sID0gJWx1IHRvdGFsXG4iLAorCQlzZXFfcHJpbnRmKHMsICIlZCBvcmRlciAldSBoaWdobWVtIHBhZ2VzIHVuY2FjaGVkICVsdSB0b3RhbFxuIiwKIAkJCSAgIHBvb2wtPmhpZ2hfY291bnQsIHBvb2wtPm9yZGVyLAogCQkJICAgKFBBR0VfU0laRSA8PCBwb29sLT5vcmRlcikgKiBwb29sLT5oaWdoX2NvdW50KTsKLQkJc2VxX3ByaW50ZihzLCAiJWQgb3JkZXIgJXUgbG93bWVtIHBhZ2VzIGluIHBvb2wgPSAlbHUgdG90YWxcbiIsCisJCXNlcV9wcmludGYocywgIiVkIG9yZGVyICV1IGxvd21lbSBwYWdlcyB1bmNhY2hlZCAlbHUgdG90YWxcbiIsCisJCQkgICBwb29sLT5sb3dfY291bnQsIHBvb2wtPm9yZGVyLAorCQkJICAgKFBBR0VfU0laRSA8PCBwb29sLT5vcmRlcikgKiBwb29sLT5sb3dfY291bnQpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBOVU1fT1JERVJTOyBpKyspIHsKKwkJcG9vbCA9IHN5c19oZWFwLT5jYWNoZWRfcG9vbHNbaV07CisKKwkJc2VxX3ByaW50ZihzLCAiJWQgb3JkZXIgJXUgaGlnaG1lbSBwYWdlcyBjYWNoZWQgJWx1IHRvdGFsXG4iLAorCQkJICAgcG9vbC0+aGlnaF9jb3VudCwgcG9vbC0+b3JkZXIsCisJCQkgICAoUEFHRV9TSVpFIDw8IHBvb2wtPm9yZGVyKSAqIHBvb2wtPmhpZ2hfY291bnQpOworCQlzZXFfcHJpbnRmKHMsICIlZCBvcmRlciAldSBsb3dtZW0gcGFnZXMgY2FjaGVkICVsdSB0b3RhbFxuIiwKIAkJCSAgIHBvb2wtPmxvd19jb3VudCwgcG9vbC0+b3JkZXIsCiAJCQkgICAoUEFHRV9TSVpFIDw8IHBvb2wtPm9yZGVyKSAqIHBvb2wtPmxvd19jb3VudCk7CiAJfQogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBpb25fc3lzdGVtX2hlYXBfZGVzdHJveV9wb29scyhzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqKnBvb2xzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9PUkRFUlM7IGkrKykKKwkJaWYgKHBvb2xzW2ldKQorCQkJaW9uX3BhZ2VfcG9vbF9kZXN0cm95KHBvb2xzW2ldKTsKK30KKworc3RhdGljIGludCBpb25fc3lzdGVtX2hlYXBfY3JlYXRlX3Bvb2xzKHN0cnVjdCBpb25fcGFnZV9wb29sICoqcG9vbHMsCisJCQkJCWJvb2wgY2FjaGVkKQoreworCWludCBpOworCWdmcF90IGdmcF9mbGFncyA9IGxvd19vcmRlcl9nZnBfZmxhZ3M7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX09SREVSUzsgaSsrKSB7CisJCXN0cnVjdCBpb25fcGFnZV9wb29sICpwb29sOworCisJCWlmIChvcmRlcnNbaV0gPiA0KQorCQkJZ2ZwX2ZsYWdzID0gaGlnaF9vcmRlcl9nZnBfZmxhZ3M7CisKKwkJcG9vbCA9IGlvbl9wYWdlX3Bvb2xfY3JlYXRlKGdmcF9mbGFncywgb3JkZXJzW2ldLCBjYWNoZWQpOworCQlpZiAoIXBvb2wpCisJCQlnb3RvIGVycl9jcmVhdGVfcG9vbDsKKwkJcG9vbHNbaV0gPSBwb29sOworCX0KKwlyZXR1cm4gMDsKKworZXJyX2NyZWF0ZV9wb29sOgorCWlvbl9zeXN0ZW1faGVhcF9kZXN0cm95X3Bvb2xzKHBvb2xzKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKwogc3RydWN0IGlvbl9oZWFwICppb25fc3lzdGVtX2hlYXBfY3JlYXRlKHN0cnVjdCBpb25fcGxhdGZvcm1faGVhcCAqdW51c2VkKQogewogCXN0cnVjdCBpb25fc3lzdGVtX2hlYXAgKmhlYXA7Ci0JaW50IGk7CiAKLQloZWFwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlvbl9zeXN0ZW1faGVhcCkgKwotCQkJc2l6ZW9mKHN0cnVjdCBpb25fcGFnZV9wb29sICopICogbnVtX29yZGVycywKLQkJCUdGUF9LRVJORUwpOworCWhlYXAgPSBremFsbG9jKHNpemVvZigqaGVhcCksIEdGUF9LRVJORUwpOwogCWlmICghaGVhcCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJaGVhcC0+aGVhcC5vcHMgPSAmc3lzdGVtX2hlYXBfb3BzOwogCWhlYXAtPmhlYXAudHlwZSA9IElPTl9IRUFQX1RZUEVfU1lTVEVNOwogCWhlYXAtPmhlYXAuZmxhZ3MgPSBJT05fSEVBUF9GTEFHX0RFRkVSX0ZSRUU7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX29yZGVyczsgaSsrKSB7Ci0JCXN0cnVjdCBpb25fcGFnZV9wb29sICpwb29sOwotCQlnZnBfdCBnZnBfZmxhZ3MgPSBsb3dfb3JkZXJfZ2ZwX2ZsYWdzOworCWlmIChpb25fc3lzdGVtX2hlYXBfY3JlYXRlX3Bvb2xzKGhlYXAtPnVuY2FjaGVkX3Bvb2xzLCBmYWxzZSkpCisJCWdvdG8gZnJlZV9oZWFwOwogCi0JCWlmIChvcmRlcnNbaV0gPiA0KQotCQkJZ2ZwX2ZsYWdzID0gaGlnaF9vcmRlcl9nZnBfZmxhZ3M7Ci0JCXBvb2wgPSBpb25fcGFnZV9wb29sX2NyZWF0ZShnZnBfZmxhZ3MsIG9yZGVyc1tpXSk7Ci0JCWlmICghcG9vbCkKLQkJCWdvdG8gZGVzdHJveV9wb29sczsKLQkJaGVhcC0+cG9vbHNbaV0gPSBwb29sOwotCX0KKwlpZiAoaW9uX3N5c3RlbV9oZWFwX2NyZWF0ZV9wb29scyhoZWFwLT5jYWNoZWRfcG9vbHMsIHRydWUpKQorCQlnb3RvIGRlc3Ryb3lfdW5jYWNoZWRfcG9vbHM7CiAKIAloZWFwLT5oZWFwLmRlYnVnX3Nob3cgPSBpb25fc3lzdGVtX2hlYXBfZGVidWdfc2hvdzsKIAlyZXR1cm4gJmhlYXAtPmhlYXA7CiAKLWRlc3Ryb3lfcG9vbHM6Ci0Jd2hpbGUgKGktLSkKLQkJaW9uX3BhZ2VfcG9vbF9kZXN0cm95KGhlYXAtPnBvb2xzW2ldKTsKK2Rlc3Ryb3lfdW5jYWNoZWRfcG9vbHM6CisJaW9uX3N5c3RlbV9oZWFwX2Rlc3Ryb3lfcG9vbHMoaGVhcC0+dW5jYWNoZWRfcG9vbHMpOworCitmcmVlX2hlYXA6CiAJa2ZyZWUoaGVhcCk7CiAJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiB9CkBAIC0zMTYsOCArMzYyLDEwIEBACiAJCQkJCQkJaGVhcCk7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX29yZGVyczsgaSsrKQotCQlpb25fcGFnZV9wb29sX2Rlc3Ryb3koc3lzX2hlYXAtPnBvb2xzW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX09SREVSUzsgaSsrKSB7CisJCWlvbl9wYWdlX3Bvb2xfZGVzdHJveShzeXNfaGVhcC0+dW5jYWNoZWRfcG9vbHNbaV0pOworCQlpb25fcGFnZV9wb29sX2Rlc3Ryb3koc3lzX2hlYXAtPmNhY2hlZF9wb29sc1tpXSk7CisJfQogCWtmcmVlKHN5c19oZWFwKTsKIH0KIApAQCAtMzU4LDcgKzQwNiw3IEBACiAKIAlzZ19zZXRfcGFnZSh0YWJsZS0+c2dsLCBwYWdlLCBsZW4sIDApOwogCi0JYnVmZmVyLT5wcml2X3ZpcnQgPSB0YWJsZTsKKwlidWZmZXItPnNnX3RhYmxlID0gdGFibGU7CiAKIAlpb25fcGFnZXNfc3luY19mb3JfZGV2aWNlKE5VTEwsIHBhZ2UsIGxlbiwgRE1BX0JJRElSRUNUSU9OQUwpOwogCkBAIC0zNzUsNyArNDIzLDcgQEAKIAogc3RhdGljIHZvaWQgaW9uX3N5c3RlbV9jb250aWdfaGVhcF9mcmVlKHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpCiB7Ci0Jc3RydWN0IHNnX3RhYmxlICp0YWJsZSA9IGJ1ZmZlci0+cHJpdl92aXJ0OworCXN0cnVjdCBzZ190YWJsZSAqdGFibGUgPSBidWZmZXItPnNnX3RhYmxlOwogCXN0cnVjdCBwYWdlICpwYWdlID0gc2dfcGFnZSh0YWJsZS0+c2dsKTsKIAl1bnNpZ25lZCBsb25nIHBhZ2VzID0gUEFHRV9BTElHTihidWZmZXItPnNpemUpID4+IFBBR0VfU0hJRlQ7CiAJdW5zaWduZWQgbG9uZyBpOwpAQCAtMzg2LDM0ICs0MzQsOSBAQAogCWtmcmVlKHRhYmxlKTsKIH0KIAotc3RhdGljIGludCBpb25fc3lzdGVtX2NvbnRpZ19oZWFwX3BoeXMoc3RydWN0IGlvbl9oZWFwICpoZWFwLAotCQkJCSAgICAgICBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyLAotCQkJCSAgICAgICBpb25fcGh5c19hZGRyX3QgKmFkZHIsIHNpemVfdCAqbGVuKQotewotCXN0cnVjdCBzZ190YWJsZSAqdGFibGUgPSBidWZmZXItPnByaXZfdmlydDsKLQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHNnX3BhZ2UodGFibGUtPnNnbCk7Ci0JKmFkZHIgPSBwYWdlX3RvX3BoeXMocGFnZSk7Ci0JKmxlbiA9IGJ1ZmZlci0+c2l6ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzZ190YWJsZSAqaW9uX3N5c3RlbV9jb250aWdfaGVhcF9tYXBfZG1hKHN0cnVjdCBpb25faGVhcCAqaGVhcCwKLQkJCQkJCXN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpCi17Ci0JcmV0dXJuIGJ1ZmZlci0+cHJpdl92aXJ0OwotfQotCi1zdGF0aWMgdm9pZCBpb25fc3lzdGVtX2NvbnRpZ19oZWFwX3VubWFwX2RtYShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCi0JCQkJCSAgICAgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcikKLXsKLX0KLQogc3RhdGljIHN0cnVjdCBpb25faGVhcF9vcHMga21hbGxvY19vcHMgPSB7CiAJLmFsbG9jYXRlID0gaW9uX3N5c3RlbV9jb250aWdfaGVhcF9hbGxvY2F0ZSwKIAkuZnJlZSA9IGlvbl9zeXN0ZW1fY29udGlnX2hlYXBfZnJlZSwKLQkucGh5cyA9IGlvbl9zeXN0ZW1fY29udGlnX2hlYXBfcGh5cywKLQkubWFwX2RtYSA9IGlvbl9zeXN0ZW1fY29udGlnX2hlYXBfbWFwX2RtYSwKLQkudW5tYXBfZG1hID0gaW9uX3N5c3RlbV9jb250aWdfaGVhcF91bm1hcF9kbWEsCiAJLm1hcF9rZXJuZWwgPSBpb25faGVhcF9tYXBfa2VybmVsLAogCS51bm1hcF9rZXJuZWwgPSBpb25faGVhcF91bm1hcF9rZXJuZWwsCiAJLm1hcF91c2VyID0gaW9uX2hlYXBfbWFwX3VzZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3Rlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fdGVzdC5jCmluZGV4IDVhMzk2YTEuLjVhYmY4MzIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3Rlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3Rlc3QuYwpAQCAtNDIsNyArNDIsOCBAQAogfTsKIAogc3RhdGljIGludCBpb25faGFuZGxlX3Rlc3RfZG1hKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRtYV9idWYgKmRtYV9idWYsCi0JCXZvaWQgX191c2VyICpwdHIsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBib29sIHdyaXRlKQorCQkJICAgICAgIHZvaWQgX191c2VyICpwdHIsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLAorCQkJICAgICAgIGJvb2wgd3JpdGUpCiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqYXR0YWNoOwpAQCAtOTgsNyArOTksNyBAQAogfQogCiBzdGF0aWMgaW50IGlvbl9oYW5kbGVfdGVzdF9rZXJuZWwoc3RydWN0IGRtYV9idWYgKmRtYV9idWYsIHZvaWQgX191c2VyICpwdHIsCi0JCXNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBib29sIHdyaXRlKQorCQkJCSAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIGJvb2wgd3JpdGUpCiB7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIHBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0ID4+IFBBR0VfU0hJRlQ7CkBAIC0xNDQsNyArMTQ1LDcgQEAKIH0KIAogc3RhdGljIGxvbmcgaW9uX3Rlc3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJCQl1bnNpZ25lZCBsb25nIGFyZykKKwkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBpb25fdGVzdF9kYXRhICp0ZXN0X2RhdGEgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJaW50IHJldCA9IDA7CkBAIC0xNzksMTcgKzE4MCwxOSBAQAogCWNhc2UgSU9OX0lPQ19URVNUX0RNQV9NQVBQSU5HOgogCXsKIAkJcmV0ID0gaW9uX2hhbmRsZV90ZXN0X2RtYSh0ZXN0X2RhdGEtPmRldiwgdGVzdF9kYXRhLT5kbWFfYnVmLAotCQkJCQl1NjRfdG9fdXB0cihkYXRhLnRlc3RfcncucHRyKSwKLQkJCQkJZGF0YS50ZXN0X3J3Lm9mZnNldCwgZGF0YS50ZXN0X3J3LnNpemUsCi0JCQkJCWRhdGEudGVzdF9ydy53cml0ZSk7CisJCQkJCSAgdTY0X3RvX3VwdHIoZGF0YS50ZXN0X3J3LnB0ciksCisJCQkJCSAgZGF0YS50ZXN0X3J3Lm9mZnNldCwKKwkJCQkJICBkYXRhLnRlc3Rfcncuc2l6ZSwKKwkJCQkJICBkYXRhLnRlc3Rfcncud3JpdGUpOwogCQlicmVhazsKIAl9CiAJY2FzZSBJT05fSU9DX1RFU1RfS0VSTkVMX01BUFBJTkc6CiAJewogCQlyZXQgPSBpb25faGFuZGxlX3Rlc3Rfa2VybmVsKHRlc3RfZGF0YS0+ZG1hX2J1ZiwKLQkJCQkJdTY0X3RvX3VwdHIoZGF0YS50ZXN0X3J3LnB0ciksCi0JCQkJCWRhdGEudGVzdF9ydy5vZmZzZXQsIGRhdGEudGVzdF9ydy5zaXplLAotCQkJCQlkYXRhLnRlc3Rfcncud3JpdGUpOworCQkJCQkgICAgIHU2NF90b191cHRyKGRhdGEudGVzdF9ydy5wdHIpLAorCQkJCQkgICAgIGRhdGEudGVzdF9ydy5vZmZzZXQsCisJCQkJCSAgICAgZGF0YS50ZXN0X3J3LnNpemUsCisJCQkJCSAgICAgZGF0YS50ZXN0X3J3LndyaXRlKTsKIAkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6CkBAIC0yNDIsNyArMjQ1LDcgQEAKIAlzdHJ1Y3QgaW9uX3Rlc3RfZGV2aWNlICp0ZXN0ZGV2OwogCiAJdGVzdGRldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGlvbl90ZXN0X2RldmljZSksCi0JCQkJR0ZQX0tFUk5FTCk7CisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0ZXN0ZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb3dtZW1vcnlraWxsZXIuYwppbmRleCA0NWExYjRlLi5lYzNiNjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb3dtZW1vcnlraWxsZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb3dtZW1vcnlraWxsZXIuYwpAQCAtOTIsOCArOTIsOCBAQAogCWludCBhcnJheV9zaXplID0gQVJSQVlfU0laRShsb3dtZW1fYWRqKTsKIAlpbnQgb3RoZXJfZnJlZSA9IGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZSRUVfUEFHRVMpIC0gdG90YWxyZXNlcnZlX3BhZ2VzOwogCWludCBvdGhlcl9maWxlID0gZ2xvYmFsX25vZGVfcGFnZV9zdGF0ZShOUl9GSUxFX1BBR0VTKSAtCi0JCQkJCQlnbG9iYWxfbm9kZV9wYWdlX3N0YXRlKE5SX1NITUVNKSAtCi0JCQkJCQl0b3RhbF9zd2FwY2FjaGVfcGFnZXMoKTsKKwkJCQlnbG9iYWxfbm9kZV9wYWdlX3N0YXRlKE5SX1NITUVNKSAtCisJCQkJdG90YWxfc3dhcGNhY2hlX3BhZ2VzKCk7CiAKIAlpZiAobG93bWVtX2Fkal9zaXplIDwgYXJyYXlfc2l6ZSkKIAkJYXJyYXlfc2l6ZSA9IGxvd21lbV9hZGpfc2l6ZTsKQEAgLTIwNCwxMCArMjA0LDkgQEAKICAqIG5vdCByZWFsbHkgbW9kdWxhciwgYnV0IHRoZSBlYXNpZXN0IHdheSB0byBrZWVwIGNvbXBhdCB3aXRoIGV4aXN0aW5nCiAgKiBib290YXJncyBiZWhhdmlvdXIgaXMgdG8gY29udGludWUgdXNpbmcgbW9kdWxlX3BhcmFtIGhlcmUuCiAgKi8KLW1vZHVsZV9wYXJhbV9uYW1lZChjb3N0LCBsb3dtZW1fc2hyaW5rZXIuc2Vla3MsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOwotbW9kdWxlX3BhcmFtX2FycmF5X25hbWVkKGFkaiwgbG93bWVtX2Fkaiwgc2hvcnQsICZsb3dtZW1fYWRqX3NpemUsCi0JCQkgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtX25hbWVkKGNvc3QsIGxvd21lbV9zaHJpbmtlci5zZWVrcywgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChhZGosIGxvd21lbV9hZGosIHNob3J0LCAmbG93bWVtX2Fkal9zaXplLCAwNjQ0KTsKIG1vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChtaW5mcmVlLCBsb3dtZW1fbWluZnJlZSwgdWludCwgJmxvd21lbV9taW5mcmVlX3NpemUsCi0JCQkgU19JUlVHTyB8IFNfSVdVU1IpOwotbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnX2xldmVsLCBsb3dtZW1fZGVidWdfbGV2ZWwsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKKwkJCSAwNjQ0KTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z19sZXZlbCwgbG93bWVtX2RlYnVnX2xldmVsLCB1aW50LCAwNjQ0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvc3dfc3luYy5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvc3dfc3luYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTVjOTE3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3N3X3N5bmMuYworKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKgotICogZHJpdmVycy9kbWEtYnVmL3N3X3N5bmMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUsIEluYy4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zeW5jX2ZpbGUuaD4KLQotI2luY2x1ZGUgInN5bmNfZGVidWcuaCIKLQotI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCi0jaW5jbHVkZSAidHJhY2Uvc3luYy5oIgotCi1zdHJ1Y3Qgc3dfc3luY19jcmVhdGVfZmVuY2VfZGF0YSB7Ci0JX191MzIJdmFsdWU7Ci0JY2hhcgluYW1lWzMyXTsKLQlfX3MzMglmZW5jZTsgLyogZmQgb2YgbmV3IGZlbmNlICovCi19OwotCi0jZGVmaW5lIFNXX1NZTkNfSU9DX01BR0lDCSdXJwotCi0jZGVmaW5lIFNXX1NZTkNfSU9DX0NSRUFURV9GRU5DRQlfSU9XUihTV19TWU5DX0lPQ19NQUdJQywgMCxcCi0JCXN0cnVjdCBzd19zeW5jX2NyZWF0ZV9mZW5jZV9kYXRhKQotI2RlZmluZSBTV19TWU5DX0lPQ19JTkMJCQlfSU9XKFNXX1NZTkNfSU9DX01BR0lDLCAxLCBfX3UzMikKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmZW5jZV9vcHMgdGltZWxpbmVfZmVuY2Vfb3BzOwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzeW5jX3B0ICpmZW5jZV90b19zeW5jX3B0KHN0cnVjdCBmZW5jZSAqZmVuY2UpCi17Ci0JaWYgKGZlbmNlLT5vcHMgIT0gJnRpbWVsaW5lX2ZlbmNlX29wcykKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihmZW5jZSwgc3RydWN0IHN5bmNfcHQsIGJhc2UpOwotfQotCi0vKioKLSAqIHN5bmNfdGltZWxpbmVfY3JlYXRlKCkgLSBjcmVhdGVzIGEgc3luYyBvYmplY3QKLSAqIEBuYW1lOglzeW5jX3RpbWVsaW5lIG5hbWUKLSAqCi0gKiBDcmVhdGVzIGEgbmV3IHN5bmNfdGltZWxpbmUuIFJldHVybnMgdGhlIHN5bmNfdGltZWxpbmUgb2JqZWN0IG9yIE5VTEwgaW4KLSAqIGNhc2Ugb2YgZXJyb3IuCi0gKi8KLXN0cnVjdCBzeW5jX3RpbWVsaW5lICpzeW5jX3RpbWVsaW5lX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmo7Ci0KLQlvYmogPSBremFsbG9jKHNpemVvZigqb2JqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFvYmopCi0JCXJldHVybiBOVUxMOwotCi0Ja3JlZl9pbml0KCZvYmotPmtyZWYpOwotCW9iai0+Y29udGV4dCA9IGZlbmNlX2NvbnRleHRfYWxsb2MoMSk7Ci0Jc3RybGNweShvYmotPm5hbWUsIG5hbWUsIHNpemVvZihvYmotPm5hbWUpKTsKLQotCUlOSVRfTElTVF9IRUFEKCZvYmotPmNoaWxkX2xpc3RfaGVhZCk7Ci0JSU5JVF9MSVNUX0hFQUQoJm9iai0+YWN0aXZlX2xpc3RfaGVhZCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJm9iai0+Y2hpbGRfbGlzdF9sb2NrKTsKLQotCXN5bmNfdGltZWxpbmVfZGVidWdfYWRkKG9iaik7Ci0KLQlyZXR1cm4gb2JqOwotfQotCi1zdGF0aWMgdm9pZCBzeW5jX3RpbWVsaW5lX2ZyZWUoc3RydWN0IGtyZWYgKmtyZWYpCi17Ci0Jc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiA9Ci0JCWNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3Qgc3luY190aW1lbGluZSwga3JlZik7Ci0KLQlzeW5jX3RpbWVsaW5lX2RlYnVnX3JlbW92ZShvYmopOwotCi0Ja2ZyZWUob2JqKTsKLX0KLQotc3RhdGljIHZvaWQgc3luY190aW1lbGluZV9nZXQoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaikKLXsKLQlrcmVmX2dldCgmb2JqLT5rcmVmKTsKLX0KLQotc3RhdGljIHZvaWQgc3luY190aW1lbGluZV9wdXQoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaikKLXsKLQlrcmVmX3B1dCgmb2JqLT5rcmVmLCBzeW5jX3RpbWVsaW5lX2ZyZWUpOwotfQotCi0vKioKLSAqIHN5bmNfdGltZWxpbmVfc2lnbmFsKCkgLSBzaWduYWwgYSBzdGF0dXMgY2hhbmdlIG9uIGEgc3luY190aW1lbGluZQotICogQG9iajoJc3luY190aW1lbGluZSB0byBzaWduYWwKLSAqIEBpbmM6CW51bSB0byBpbmNyZW1lbnQgb24gdGltZWxpbmUtPnZhbHVlCi0gKgotICogQSBzeW5jIGltcGxlbWVudGF0aW9uIHNob3VsZCBjYWxsIHRoaXMgYW55IHRpbWUgb25lIG9mIGl0J3MgZmVuY2VzCi0gKiBoYXMgc2lnbmFsZWQgb3IgaGFzIGFuIGVycm9yIGNvbmRpdGlvbi4KLSAqLwotc3RhdGljIHZvaWQgc3luY190aW1lbGluZV9zaWduYWwoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiwgdW5zaWduZWQgaW50IGluYykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBzeW5jX3B0ICpwdCwgKm5leHQ7Ci0KLQl0cmFjZV9zeW5jX3RpbWVsaW5lKG9iaik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmb2JqLT5jaGlsZF9saXN0X2xvY2ssIGZsYWdzKTsKLQotCW9iai0+dmFsdWUgKz0gaW5jOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB0LCBuZXh0LCAmb2JqLT5hY3RpdmVfbGlzdF9oZWFkLAotCQkJCSBhY3RpdmVfbGlzdCkgewotCQlpZiAoZmVuY2VfaXNfc2lnbmFsZWRfbG9ja2VkKCZwdC0+YmFzZSkpCi0JCQlsaXN0X2RlbF9pbml0KCZwdC0+YWN0aXZlX2xpc3QpOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iai0+Y2hpbGRfbGlzdF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qKgotICogc3luY19wdF9jcmVhdGUoKSAtIGNyZWF0ZXMgYSBzeW5jIHB0Ci0gKiBAcGFyZW50OglmZW5jZSdzIHBhcmVudCBzeW5jX3RpbWVsaW5lCi0gKiBAc2l6ZToJc2l6ZSB0byBhbGxvY2F0ZSBmb3IgdGhpcyBwdAotICogQGluYzoJdmFsdWUgb2YgdGhlIGZlbmNlCi0gKgotICogQ3JlYXRlcyBhIG5ldyBzeW5jX3B0IGFzIGEgY2hpbGQgb2YgQHBhcmVudC4gIEBzaXplIGJ5dGVzIHdpbGwgYmUKLSAqIGFsbG9jYXRlZCBhbGxvd2luZyBmb3IgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgZGF0YSB0byBiZSBrZXB0IGFmdGVyCi0gKiB0aGUgZ2VuZXJpYyBzeW5jX3RpbWVsaW5lIHN0cnVjdC4gUmV0dXJucyB0aGUgc3luY19wdCBvYmplY3Qgb3IKLSAqIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KLSAqLwotc3RhdGljIHN0cnVjdCBzeW5jX3B0ICpzeW5jX3B0X2NyZWF0ZShzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqLCBpbnQgc2l6ZSwKLQkJCSAgICAgdW5zaWduZWQgaW50IHZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHN5bmNfcHQgKnB0OwotCi0JaWYgKHNpemUgPCBzaXplb2YoKnB0KSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlwdCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwdCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmb2JqLT5jaGlsZF9saXN0X2xvY2ssIGZsYWdzKTsKLQlzeW5jX3RpbWVsaW5lX2dldChvYmopOwotCWZlbmNlX2luaXQoJnB0LT5iYXNlLCAmdGltZWxpbmVfZmVuY2Vfb3BzLCAmb2JqLT5jaGlsZF9saXN0X2xvY2ssCi0JCSAgIG9iai0+Y29udGV4dCwgdmFsdWUpOwotCWxpc3RfYWRkX3RhaWwoJnB0LT5jaGlsZF9saXN0LCAmb2JqLT5jaGlsZF9saXN0X2hlYWQpOwotCUlOSVRfTElTVF9IRUFEKCZwdC0+YWN0aXZlX2xpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iai0+Y2hpbGRfbGlzdF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHB0OwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqdGltZWxpbmVfZmVuY2VfZ2V0X2RyaXZlcl9uYW1lKHN0cnVjdCBmZW5jZSAqZmVuY2UpCi17Ci0JcmV0dXJuICJzd19zeW5jIjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnRpbWVsaW5lX2ZlbmNlX2dldF90aW1lbGluZV9uYW1lKHN0cnVjdCBmZW5jZSAqZmVuY2UpCi17Ci0Jc3RydWN0IHN5bmNfdGltZWxpbmUgKnBhcmVudCA9IGZlbmNlX3BhcmVudChmZW5jZSk7Ci0KLQlyZXR1cm4gcGFyZW50LT5uYW1lOwotfQotCi1zdGF0aWMgdm9pZCB0aW1lbGluZV9mZW5jZV9yZWxlYXNlKHN0cnVjdCBmZW5jZSAqZmVuY2UpCi17Ci0Jc3RydWN0IHN5bmNfcHQgKnB0ID0gZmVuY2VfdG9fc3luY19wdChmZW5jZSk7Ci0Jc3RydWN0IHN5bmNfdGltZWxpbmUgKnBhcmVudCA9IGZlbmNlX3BhcmVudChmZW5jZSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKGZlbmNlLT5sb2NrLCBmbGFncyk7Ci0JbGlzdF9kZWwoJnB0LT5jaGlsZF9saXN0KTsKLQlpZiAoV0FSTl9PTl9PTkNFKCFsaXN0X2VtcHR5KCZwdC0+YWN0aXZlX2xpc3QpKSkKLQkJbGlzdF9kZWwoJnB0LT5hY3RpdmVfbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShmZW5jZS0+bG9jaywgZmxhZ3MpOwotCi0Jc3luY190aW1lbGluZV9wdXQocGFyZW50KTsKLQlmZW5jZV9mcmVlKGZlbmNlKTsKLX0KLQotc3RhdGljIGJvb2wgdGltZWxpbmVfZmVuY2Vfc2lnbmFsZWQoc3RydWN0IGZlbmNlICpmZW5jZSkKLXsKLQlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKLQotCXJldHVybiAoZmVuY2UtPnNlcW5vID4gcGFyZW50LT52YWx1ZSkgPyBmYWxzZSA6IHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIHRpbWVsaW5lX2ZlbmNlX2VuYWJsZV9zaWduYWxpbmcoc3RydWN0IGZlbmNlICpmZW5jZSkKLXsKLQlzdHJ1Y3Qgc3luY19wdCAqcHQgPSBmZW5jZV90b19zeW5jX3B0KGZlbmNlKTsKLQlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKLQotCWlmICh0aW1lbGluZV9mZW5jZV9zaWduYWxlZChmZW5jZSkpCi0JCXJldHVybiBmYWxzZTsKLQotCWxpc3RfYWRkX3RhaWwoJnB0LT5hY3RpdmVfbGlzdCwgJnBhcmVudC0+YWN0aXZlX2xpc3RfaGVhZCk7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIHRpbWVsaW5lX2ZlbmNlX3ZhbHVlX3N0cihzdHJ1Y3QgZmVuY2UgKmZlbmNlLAotCQkJCSAgICBjaGFyICpzdHIsIGludCBzaXplKQotewotCXNucHJpbnRmKHN0ciwgc2l6ZSwgIiVkIiwgZmVuY2UtPnNlcW5vKTsKLX0KLQotc3RhdGljIHZvaWQgdGltZWxpbmVfZmVuY2VfdGltZWxpbmVfdmFsdWVfc3RyKHN0cnVjdCBmZW5jZSAqZmVuY2UsCi0JCQkJCSAgICAgY2hhciAqc3RyLCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKLQotCXNucHJpbnRmKHN0ciwgc2l6ZSwgIiVkIiwgcGFyZW50LT52YWx1ZSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmVuY2Vfb3BzIHRpbWVsaW5lX2ZlbmNlX29wcyA9IHsKLQkuZ2V0X2RyaXZlcl9uYW1lID0gdGltZWxpbmVfZmVuY2VfZ2V0X2RyaXZlcl9uYW1lLAotCS5nZXRfdGltZWxpbmVfbmFtZSA9IHRpbWVsaW5lX2ZlbmNlX2dldF90aW1lbGluZV9uYW1lLAotCS5lbmFibGVfc2lnbmFsaW5nID0gdGltZWxpbmVfZmVuY2VfZW5hYmxlX3NpZ25hbGluZywKLQkuc2lnbmFsZWQgPSB0aW1lbGluZV9mZW5jZV9zaWduYWxlZCwKLQkud2FpdCA9IGZlbmNlX2RlZmF1bHRfd2FpdCwKLQkucmVsZWFzZSA9IHRpbWVsaW5lX2ZlbmNlX3JlbGVhc2UsCi0JLmZlbmNlX3ZhbHVlX3N0ciA9IHRpbWVsaW5lX2ZlbmNlX3ZhbHVlX3N0ciwKLQkudGltZWxpbmVfdmFsdWVfc3RyID0gdGltZWxpbmVfZmVuY2VfdGltZWxpbmVfdmFsdWVfc3RyLAotfTsKLQotLyoKLSAqICpXQVJOSU5HKgotICoKLSAqIGltcHJvcGVyIHVzZSBvZiB0aGlzIGNhbiByZXN1bHQgaW4gZGVhZGxvY2tpbmcga2VybmVsIGRyaXZlcnMgZnJvbSB1c2Vyc3BhY2UuCi0gKi8KLQotLyogb3BlbmluZyBzd19zeW5jIGNyZWF0ZSBhIG5ldyBzeW5jIG9iaiAqLwotc3RhdGljIGludCBzd19zeW5jX2RlYnVnZnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqOwotCWNoYXIgdGFza19jb21tW1RBU0tfQ09NTV9MRU5dOwotCi0JZ2V0X3Rhc2tfY29tbSh0YXNrX2NvbW0sIGN1cnJlbnQpOwotCi0Jb2JqID0gc3luY190aW1lbGluZV9jcmVhdGUodGFza19jb21tKTsKLQlpZiAoIW9iaikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBvYmo7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzd19zeW5jX2RlYnVnZnNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0Jc21wX3dtYigpOwotCi0Jc3luY190aW1lbGluZV9wdXQob2JqKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgc3dfc3luY19pb2N0bF9jcmVhdGVfZmVuY2Uoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiwKLQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JaW50IGZkID0gZ2V0X3VudXNlZF9mZF9mbGFncyhPX0NMT0VYRUMpOwotCWludCBlcnI7Ci0Jc3RydWN0IHN5bmNfcHQgKnB0OwotCXN0cnVjdCBzeW5jX2ZpbGUgKnN5bmNfZmlsZTsKLQlzdHJ1Y3Qgc3dfc3luY19jcmVhdGVfZmVuY2VfZGF0YSBkYXRhOwotCi0JaWYgKGZkIDwgMCkKLQkJcmV0dXJuIGZkOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihkYXRhKSkpIHsKLQkJZXJyID0gLUVGQVVMVDsKLQkJZ290byBlcnI7Ci0JfQotCi0JcHQgPSBzeW5jX3B0X2NyZWF0ZShvYmosIHNpemVvZigqcHQpLCBkYXRhLnZhbHVlKTsKLQlpZiAoIXB0KSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyOwotCX0KLQotCXN5bmNfZmlsZSA9IHN5bmNfZmlsZV9jcmVhdGUoJnB0LT5iYXNlKTsKLQlpZiAoIXN5bmNfZmlsZSkgewotCQlmZW5jZV9wdXQoJnB0LT5iYXNlKTsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQotCi0JZGF0YS5mZW5jZSA9IGZkOwotCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKSkgewotCQlmcHV0KHN5bmNfZmlsZS0+ZmlsZSk7Ci0JCWVyciA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWZkX2luc3RhbGwoZmQsIHN5bmNfZmlsZS0+ZmlsZSk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyOgotCXB1dF91bnVzZWRfZmQoZmQpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBsb25nIHN3X3N5bmNfaW9jdGxfaW5jKHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmosIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXUzMiB2YWx1ZTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsdWUsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHZhbHVlKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0Jc3luY190aW1lbGluZV9zaWduYWwob2JqLCB2YWx1ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgc3dfc3luY19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTV19TWU5DX0lPQ19DUkVBVEVfRkVOQ0U6Ci0JCXJldHVybiBzd19zeW5jX2lvY3RsX2NyZWF0ZV9mZW5jZShvYmosIGFyZyk7Ci0KLQljYXNlIFNXX1NZTkNfSU9DX0lOQzoKLQkJcmV0dXJuIHN3X3N5bmNfaW9jdGxfaW5jKG9iaiwgYXJnKTsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PVFRZOwotCX0KLX0KLQotY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzd19zeW5jX2RlYnVnZnNfZm9wcyA9IHsKLQkub3BlbiAgICAgICAgICAgPSBzd19zeW5jX2RlYnVnZnNfb3BlbiwKLQkucmVsZWFzZSAgICAgICAgPSBzd19zeW5jX2RlYnVnZnNfcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwgPSBzd19zeW5jX2lvY3RsLAotCS5jb21wYXRfaW9jdGwJPSBzd19zeW5jX2lvY3RsLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3N5bmNfZGVidWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3N5bmNfZGVidWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM1YTg1NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zeW5jX2RlYnVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoKLSAqIGRyaXZlcnMvYmFzZS9zeW5jLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlLCBJbmMuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlICJzeW5jX2RlYnVnLmgiCi0KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkYmdmczsKLQotc3RhdGljIExJU1RfSEVBRChzeW5jX3RpbWVsaW5lX2xpc3RfaGVhZCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN5bmNfdGltZWxpbmVfbGlzdF9sb2NrKTsKLXN0YXRpYyBMSVNUX0hFQUQoc3luY19maWxlX2xpc3RfaGVhZCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN5bmNfZmlsZV9saXN0X2xvY2spOwotCi12b2lkIHN5bmNfdGltZWxpbmVfZGVidWdfYWRkKHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmopCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzeW5jX3RpbWVsaW5lX2xpc3RfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJm9iai0+c3luY190aW1lbGluZV9saXN0LCAmc3luY190aW1lbGluZV9saXN0X2hlYWQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bmNfdGltZWxpbmVfbGlzdF9sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgc3luY190aW1lbGluZV9kZWJ1Z19yZW1vdmUoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN5bmNfdGltZWxpbmVfbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9kZWwoJm9iai0+c3luY190aW1lbGluZV9saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW5jX3RpbWVsaW5lX2xpc3RfbG9jaywgZmxhZ3MpOwotfQotCi12b2lkIHN5bmNfZmlsZV9kZWJ1Z19hZGQoc3RydWN0IHN5bmNfZmlsZSAqc3luY19maWxlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3luY19maWxlX2xpc3RfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJnN5bmNfZmlsZS0+c3luY19maWxlX2xpc3QsICZzeW5jX2ZpbGVfbGlzdF9oZWFkKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW5jX2ZpbGVfbGlzdF9sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgc3luY19maWxlX2RlYnVnX3JlbW92ZShzdHJ1Y3Qgc3luY19maWxlICpzeW5jX2ZpbGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzeW5jX2ZpbGVfbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9kZWwoJnN5bmNfZmlsZS0+c3luY19maWxlX2xpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bmNfZmlsZV9saXN0X2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnN5bmNfc3RhdHVzX3N0cihpbnQgc3RhdHVzKQotewotCWlmIChzdGF0dXMgPT0gMCkKLQkJcmV0dXJuICJzaWduYWxlZCI7Ci0KLQlpZiAoc3RhdHVzID4gMCkKLQkJcmV0dXJuICJhY3RpdmUiOwotCi0JcmV0dXJuICJlcnJvciI7Ci19Ci0KLXN0YXRpYyB2b2lkIHN5bmNfcHJpbnRfZmVuY2Uoc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgZmVuY2UgKmZlbmNlLCBib29sIHNob3cpCi17Ci0JaW50IHN0YXR1cyA9IDE7Ci0Jc3RydWN0IHN5bmNfdGltZWxpbmUgKnBhcmVudCA9IGZlbmNlX3BhcmVudChmZW5jZSk7Ci0KLQlpZiAoZmVuY2VfaXNfc2lnbmFsZWRfbG9ja2VkKGZlbmNlKSkKLQkJc3RhdHVzID0gZmVuY2UtPnN0YXR1czsKLQotCXNlcV9wcmludGYocywgIiAgJXMlc2ZlbmNlICVzIiwKLQkJICAgc2hvdyA/IHBhcmVudC0+bmFtZSA6ICIiLAotCQkgICBzaG93ID8gIl8iIDogIiIsCi0JCSAgIHN5bmNfc3RhdHVzX3N0cihzdGF0dXMpKTsKLQotCWlmIChzdGF0dXMgPD0gMCkgewotCQlzdHJ1Y3QgdGltZXNwZWM2NCB0czY0ID0KLQkJCWt0aW1lX3RvX3RpbWVzcGVjNjQoZmVuY2UtPnRpbWVzdGFtcCk7Ci0KLQkJc2VxX3ByaW50ZihzLCAiQCVsbGQuJTA5bGQiLCAoczY0KXRzNjQudHZfc2VjLCB0czY0LnR2X25zZWMpOwotCX0KLQotCWlmIChmZW5jZS0+b3BzLT50aW1lbGluZV92YWx1ZV9zdHIgJiYKLQkJZmVuY2UtPm9wcy0+ZmVuY2VfdmFsdWVfc3RyKSB7Ci0JCWNoYXIgdmFsdWVbNjRdOwotCQlib29sIHN1Y2Nlc3M7Ci0KLQkJZmVuY2UtPm9wcy0+ZmVuY2VfdmFsdWVfc3RyKGZlbmNlLCB2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0JCXN1Y2Nlc3MgPSBzdHJsZW4odmFsdWUpOwotCi0JCWlmIChzdWNjZXNzKSB7Ci0JCQlzZXFfcHJpbnRmKHMsICI6ICVzIiwgdmFsdWUpOwotCi0JCQlmZW5jZS0+b3BzLT50aW1lbGluZV92YWx1ZV9zdHIoZmVuY2UsIHZhbHVlLAotCQkJCQkJICAgICAgIHNpemVvZih2YWx1ZSkpOwotCi0JCQlpZiAoc3RybGVuKHZhbHVlKSkKLQkJCQlzZXFfcHJpbnRmKHMsICIgLyAlcyIsIHZhbHVlKTsKLQkJfQotCX0KLQotCXNlcV9wdXRzKHMsICJcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBzeW5jX3ByaW50X29iaihzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmopCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzZXFfcHJpbnRmKHMsICIlczogJWRcbiIsIG9iai0+bmFtZSwgb2JqLT52YWx1ZSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmb2JqLT5jaGlsZF9saXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoKHBvcywgJm9iai0+Y2hpbGRfbGlzdF9oZWFkKSB7Ci0JCXN0cnVjdCBzeW5jX3B0ICpwdCA9Ci0JCQljb250YWluZXJfb2YocG9zLCBzdHJ1Y3Qgc3luY19wdCwgY2hpbGRfbGlzdCk7Ci0JCXN5bmNfcHJpbnRfZmVuY2UocywgJnB0LT5iYXNlLCBmYWxzZSk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iai0+Y2hpbGRfbGlzdF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN5bmNfcHJpbnRfc3luY19maWxlKHN0cnVjdCBzZXFfZmlsZSAqcywKLQkJCQkgIHN0cnVjdCBzeW5jX2ZpbGUgKnN5bmNfZmlsZSkKLXsKLQlpbnQgaTsKLQotCXNlcV9wcmludGYocywgIlslcF0gJXM6ICVzXG4iLCBzeW5jX2ZpbGUsIHN5bmNfZmlsZS0+bmFtZSwKLQkJICAgc3luY19zdGF0dXNfc3RyKGF0b21pY19yZWFkKCZzeW5jX2ZpbGUtPnN0YXR1cykpKTsKLQotCWZvciAoaSA9IDA7IGkgPCBzeW5jX2ZpbGUtPm51bV9mZW5jZXM7ICsraSkKLQkJc3luY19wcmludF9mZW5jZShzLCBzeW5jX2ZpbGUtPmNic1tpXS5mZW5jZSwgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgc3luY19kZWJ1Z2ZzX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp1bnVzZWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7Ci0KLQlzZXFfcHV0cyhzLCAib2Jqczpcbi0tLS0tLS0tLS0tLS0tXG4iKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzeW5jX3RpbWVsaW5lX2xpc3RfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2gocG9zLCAmc3luY190aW1lbGluZV9saXN0X2hlYWQpIHsKLQkJc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiA9Ci0JCQljb250YWluZXJfb2YocG9zLCBzdHJ1Y3Qgc3luY190aW1lbGluZSwKLQkJCQkgICAgIHN5bmNfdGltZWxpbmVfbGlzdCk7Ci0KLQkJc3luY19wcmludF9vYmoocywgb2JqKTsKLQkJc2VxX3B1dHMocywgIlxuIik7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bmNfdGltZWxpbmVfbGlzdF9sb2NrLCBmbGFncyk7Ci0KLQlzZXFfcHV0cyhzLCAiZmVuY2VzOlxuLS0tLS0tLS0tLS0tLS1cbiIpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN5bmNfZmlsZV9saXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoKHBvcywgJnN5bmNfZmlsZV9saXN0X2hlYWQpIHsKLQkJc3RydWN0IHN5bmNfZmlsZSAqc3luY19maWxlID0KLQkJCWNvbnRhaW5lcl9vZihwb3MsIHN0cnVjdCBzeW5jX2ZpbGUsIHN5bmNfZmlsZV9saXN0KTsKLQotCQlzeW5jX3ByaW50X3N5bmNfZmlsZShzLCBzeW5jX2ZpbGUpOwotCQlzZXFfcHV0cyhzLCAiXG4iKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luY19maWxlX2xpc3RfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN5bmNfaW5mb19kZWJ1Z2ZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHN5bmNfZGVidWdmc19zaG93LCBpbm9kZS0+aV9wcml2YXRlKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3luY19pbmZvX2RlYnVnZnNfZm9wcyA9IHsKLQkub3BlbiAgICAgICAgICAgPSBzeW5jX2luZm9fZGVidWdmc19vcGVuLAotCS5yZWFkICAgICAgICAgICA9IHNlcV9yZWFkLAotCS5sbHNlZWsgICAgICAgICA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSAgICAgICAgPSBzaW5nbGVfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBfX2luaXQgaW50IHN5bmNfZGVidWdmc19pbml0KHZvaWQpCi17Ci0JZGJnZnMgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInN5bmMiLCBOVUxMKTsKLQotCS8qCi0JICogVGhlIGRlYnVnZnMgZmlsZXMgd29uJ3QgZXZlciBnZXQgcmVtb3ZlZCBhbmQgdGh1cywgdGhlcmUgaXMKLQkgKiBubyBuZWVkIHRvIHByb3RlY3QgaXQgYWdhaW5zdCByZW1vdmFsIHJhY2VzLiBUaGUgdXNlIG9mCi0JICogZGVidWdmc19jcmVhdGVfZmlsZV91bnNhZmUoKSBpcyBhY3R1YWxseSBzYWZlIGhlcmUuCi0JICovCi0JZGVidWdmc19jcmVhdGVfZmlsZV91bnNhZmUoImluZm8iLCAwNDQ0LCBkYmdmcywgTlVMTCwKLQkJCQkgICAmc3luY19pbmZvX2RlYnVnZnNfZm9wcyk7Ci0JZGVidWdmc19jcmVhdGVfZmlsZV91bnNhZmUoInN3X3N5bmMiLCAwNjQ0LCBkYmdmcywgTlVMTCwKLQkJCQkgICAmc3dfc3luY19kZWJ1Z2ZzX2ZvcHMpOwotCi0JcmV0dXJuIDA7Ci19Ci1sYXRlX2luaXRjYWxsKHN5bmNfZGVidWdmc19pbml0KTsKLQotI2RlZmluZSBEVU1QX0NIVU5LIDI1Ngotc3RhdGljIGNoYXIgc3luY19kdW1wX2J1Zls2NCAqIDEwMjRdOwotdm9pZCBzeW5jX2R1bXAodm9pZCkKLXsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgcyA9IHsKLQkJLmJ1ZiA9IHN5bmNfZHVtcF9idWYsCi0JCS5zaXplID0gc2l6ZW9mKHN5bmNfZHVtcF9idWYpIC0gMSwKLQl9OwotCWludCBpOwotCi0Jc3luY19kZWJ1Z2ZzX3Nob3coJnMsIE5VTEwpOwotCi0JZm9yIChpID0gMDsgaSA8IHMuY291bnQ7IGkgKz0gRFVNUF9DSFVOSykgewotCQlpZiAoKHMuY291bnQgLSBpKSA+IERVTVBfQ0hVTkspIHsKLQkJCWNoYXIgYyA9IHMuYnVmW2kgKyBEVU1QX0NIVU5LXTsKLQotCQkJcy5idWZbaSArIERVTVBfQ0hVTktdID0gMDsKLQkJCXByX2NvbnQoIiVzIiwgcy5idWYgKyBpKTsKLQkJCXMuYnVmW2kgKyBEVU1QX0NIVU5LXSA9IGM7Ci0JCX0gZWxzZSB7Ci0JCQlzLmJ1ZltzLmNvdW50XSA9IDA7Ci0JCQlwcl9jb250KCIlcyIsIHMuYnVmICsgaSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zeW5jX2RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zeW5jX2RlYnVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYjY2MzkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvc3luY19kZWJ1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvbGludXgvc3luYy5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX0xJTlVYX1NZTkNfSAotI2RlZmluZSBfTElOVVhfU1lOQ19ICi0KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9mZW5jZS5oPgotCi0jaW5jbHVkZSA8bGludXgvc3luY19maWxlLmg+Ci0jaW5jbHVkZSA8dWFwaS9saW51eC9zeW5jX2ZpbGUuaD4KLQotLyoqCi0gKiBzdHJ1Y3Qgc3luY190aW1lbGluZSAtIHN5bmMgb2JqZWN0Ci0gKiBAa3JlZjoJCXJlZmVyZW5jZSBjb3VudCBvbiBmZW5jZS4KLSAqIEBuYW1lOgkJbmFtZSBvZiB0aGUgc3luY190aW1lbGluZS4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSAqIEBjaGlsZF9saXN0X2hlYWQ6CWxpc3Qgb2YgY2hpbGRyZW4gc3luY19wdHMgZm9yIHRoaXMgc3luY190aW1lbGluZQotICogQGNoaWxkX2xpc3RfbG9jazoJbG9jayBwcm90ZWN0aW5nIEBjaGlsZF9saXN0X2hlYWQgYW5kIGZlbmNlLnN0YXR1cwotICogQGFjdGl2ZV9saXN0X2hlYWQ6CWxpc3Qgb2YgYWN0aXZlICh1bnNpZ25hbGVkL2Vycm9yZWQpIHN5bmNfcHRzCi0gKiBAc3luY190aW1lbGluZV9saXN0OgltZW1iZXJzaGlwIGluIGdsb2JhbCBzeW5jX3RpbWVsaW5lX2xpc3QKLSAqLwotc3RydWN0IHN5bmNfdGltZWxpbmUgewotCXN0cnVjdCBrcmVmCQlrcmVmOwotCWNoYXIJCQluYW1lWzMyXTsKLQotCS8qIHByb3RlY3RlZCBieSBjaGlsZF9saXN0X2xvY2sgKi8KLQl1NjQJCQljb250ZXh0OwotCWludAkJCXZhbHVlOwotCi0Jc3RydWN0IGxpc3RfaGVhZAljaGlsZF9saXN0X2hlYWQ7Ci0Jc3BpbmxvY2tfdAkJY2hpbGRfbGlzdF9sb2NrOwotCi0Jc3RydWN0IGxpc3RfaGVhZAlhY3RpdmVfbGlzdF9oZWFkOwotCi0Jc3RydWN0IGxpc3RfaGVhZAlzeW5jX3RpbWVsaW5lX2xpc3Q7Ci19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzeW5jX3RpbWVsaW5lICpmZW5jZV9wYXJlbnQoc3RydWN0IGZlbmNlICpmZW5jZSkKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKGZlbmNlLT5sb2NrLCBzdHJ1Y3Qgc3luY190aW1lbGluZSwKLQkJCSAgICBjaGlsZF9saXN0X2xvY2spOwotfQotCi0vKioKLSAqIHN0cnVjdCBzeW5jX3B0IC0gc3luY19wdCBvYmplY3QKLSAqIEBiYXNlOiBiYXNlIGZlbmNlIG9iamVjdAotICogQGNoaWxkX2xpc3Q6IHN5bmMgdGltZWxpbmUgY2hpbGQncyBsaXN0Ci0gKiBAYWN0aXZlX2xpc3Q6IHN5bmMgdGltZWxpbmUgYWN0aXZlIGNoaWxkJ3MgbGlzdAotICovCi1zdHJ1Y3Qgc3luY19wdCB7Ci0Jc3RydWN0IGZlbmNlIGJhc2U7Ci0Jc3RydWN0IGxpc3RfaGVhZCBjaGlsZF9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgYWN0aXZlX2xpc3Q7Ci19OwotCi0jaWZkZWYgQ09ORklHX1NXX1NZTkMKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3dfc3luY19kZWJ1Z2ZzX2ZvcHM7Ci0KLXZvaWQgc3luY190aW1lbGluZV9kZWJ1Z19hZGQoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaik7Ci12b2lkIHN5bmNfdGltZWxpbmVfZGVidWdfcmVtb3ZlKHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmopOwotdm9pZCBzeW5jX2ZpbGVfZGVidWdfYWRkKHN0cnVjdCBzeW5jX2ZpbGUgKmZlbmNlKTsKLXZvaWQgc3luY19maWxlX2RlYnVnX3JlbW92ZShzdHJ1Y3Qgc3luY19maWxlICpmZW5jZSk7Ci12b2lkIHN5bmNfZHVtcCh2b2lkKTsKLQotI2Vsc2UKLSMgZGVmaW5lIHN5bmNfdGltZWxpbmVfZGVidWdfYWRkKG9iaikKLSMgZGVmaW5lIHN5bmNfdGltZWxpbmVfZGVidWdfcmVtb3ZlKG9iaikKLSMgZGVmaW5lIHN5bmNfZmlsZV9kZWJ1Z19hZGQoZmVuY2UpCi0jIGRlZmluZSBzeW5jX2ZpbGVfZGVidWdfcmVtb3ZlKGZlbmNlKQotIyBkZWZpbmUgc3luY19kdW1wKCkKLSNlbmRpZgotCi0jZW5kaWYgLyogX0xJTlVYX1NZTkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdHJhY2Uvc3luYy5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdHJhY2Uvc3luYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjVjZTk2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RyYWNlL3N5bmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSN1bmRlZiBUUkFDRV9TWVNURU0KLSNkZWZpbmUgVFJBQ0VfSU5DTFVERV9QQVRIIC4uLy4uL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RyYWNlCi0jZGVmaW5lIFRSQUNFX1NZU1RFTSBzeW5jCi0KLSNpZiAhZGVmaW5lZChfVFJBQ0VfU1lOQ19IKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKQotI2RlZmluZSBfVFJBQ0VfU1lOQ19ICi0KLSNpbmNsdWRlICIuLi9zeW5jX2RlYnVnLmgiCi0jaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgotCi1UUkFDRV9FVkVOVChzeW5jX3RpbWVsaW5lLAotCVRQX1BST1RPKHN0cnVjdCBzeW5jX3RpbWVsaW5lICp0aW1lbGluZSksCi0KLQlUUF9BUkdTKHRpbWVsaW5lKSwKLQotCVRQX1NUUlVDVF9fZW50cnkoCi0JCQlfX3N0cmluZyhuYW1lLCB0aW1lbGluZS0+bmFtZSkKLQkJCV9fZmllbGQodTMyLCB2YWx1ZSkKLQkpLAotCi0JVFBfZmFzdF9hc3NpZ24oCi0JCQlfX2Fzc2lnbl9zdHIobmFtZSwgdGltZWxpbmUtPm5hbWUpOwotCQkJX19lbnRyeS0+dmFsdWUgPSB0aW1lbGluZS0+dmFsdWU7Ci0JKSwKLQotCVRQX3ByaW50aygibmFtZT0lcyB2YWx1ZT0lZCIsIF9fZ2V0X3N0cihuYW1lKSwgX19lbnRyeS0+dmFsdWUpCi0pOwotCi0jZW5kaWYgLyogaWYgIWRlZmluZWQoX1RSQUNFX1NZTkNfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkgKi8KLQotLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCi0jaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC91YXBpL2lvbi5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9pb24uaAppbmRleCAwYThlNDBmLi4xNGNkODczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC91YXBpL2lvbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvaW9uLmgKQEAgLTQ0LDMyICs0NCwyNiBAQAogCQkJICAgICAgICogbXVzdCBiZSBsYXN0IHNvIGRldmljZSBzcGVjaWZpYyBoZWFwcyBhbHdheXMKIAkJCSAgICAgICAqIGFyZSBhdCB0aGUgZW5kIG9mIHRoaXMgZW51bQogCQkJICAgICAgICovCi0JSU9OX05VTV9IRUFQUyA9IDE2LAogfTsKIAotI2RlZmluZSBJT05fSEVBUF9TWVNURU1fTUFTSwkJKDEgPDwgSU9OX0hFQVBfVFlQRV9TWVNURU0pCi0jZGVmaW5lIElPTl9IRUFQX1NZU1RFTV9DT05USUdfTUFTSwkoMSA8PCBJT05fSEVBUF9UWVBFX1NZU1RFTV9DT05USUcpCi0jZGVmaW5lIElPTl9IRUFQX0NBUlZFT1VUX01BU0sJCSgxIDw8IElPTl9IRUFQX1RZUEVfQ0FSVkVPVVQpCi0jZGVmaW5lIElPTl9IRUFQX1RZUEVfRE1BX01BU0sJCSgxIDw8IElPTl9IRUFQX1RZUEVfRE1BKQotCiAjZGVmaW5lIElPTl9OVU1fSEVBUF9JRFMJCShzaXplb2YodW5zaWduZWQgaW50KSAqIDgpCiAKIC8qKgogICogYWxsb2NhdGlvbiBmbGFncyAtIHRoZSBsb3dlciAxNiBiaXRzIGFyZSB1c2VkIGJ5IGNvcmUgaW9uLCB0aGUgdXBwZXIgMTYKICAqIGJpdHMgYXJlIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIGhlYXBzIHRoZW1zZWx2ZXMuCiAgKi8KLSNkZWZpbmUgSU9OX0ZMQUdfQ0FDSEVEIDEJCS8qCi0JCQkJCSAqIG1hcHBpbmdzIG9mIHRoaXMgYnVmZmVyIHNob3VsZCBiZQotCQkJCQkgKiBjYWNoZWQsIGlvbiB3aWxsIGRvIGNhY2hlCi0JCQkJCSAqIG1haW50ZW5hbmNlIHdoZW4gdGhlIGJ1ZmZlciBpcwotCQkJCQkgKiBtYXBwZWQgZm9yIGRtYQotCQkJCQkqLwotI2RlZmluZSBJT05fRkxBR19DQUNIRURfTkVFRFNfU1lOQyAyCS8qCi0JCQkJCSAqIG1hcHBpbmdzIG9mIHRoaXMgYnVmZmVyIHdpbGwgY3JlYXRlZAotCQkJCQkgKiBhdCBtbWFwIHRpbWUsIGlmIHRoaXMgaXMgc2V0Ci0JCQkJCSAqIGNhY2hlcyBtdXN0IGJlIG1hbmFnZWQKLQkJCQkJICogbWFudWFsbHkKLQkJCQkJICovCisKKy8qCisgKiBtYXBwaW5ncyBvZiB0aGlzIGJ1ZmZlciBzaG91bGQgYmUgY2FjaGVkLCBpb24gd2lsbCBkbyBjYWNoZSBtYWludGVuYW5jZQorICogd2hlbiB0aGUgYnVmZmVyIGlzIG1hcHBlZCBmb3IgZG1hCisgKi8KKyNkZWZpbmUgSU9OX0ZMQUdfQ0FDSEVEIDEKKworLyoKKyAqIG1hcHBpbmdzIG9mIHRoaXMgYnVmZmVyIHdpbGwgY3JlYXRlZCBhdCBtbWFwIHRpbWUsIGlmIHRoaXMgaXMgc2V0CisgKiBjYWNoZXMgbXVzdCBiZSBtYW5hZ2VkIG1hbnVhbGx5CisgKi8KKyNkZWZpbmUgSU9OX0ZMQUdfQ0FDSEVEX05FRURTX1NZTkMgMgogCiAvKioKICAqIERPQzogSW9uIFVzZXJzcGFjZSBBUEkKQEAgLTEzNCw2ICsxMjgsMzYgQEAKIAl1bnNpZ25lZCBsb25nIGFyZzsKIH07CiAKKyNkZWZpbmUgTUFYX0hFQVBfTkFNRQkJCTMyCisKKy8qKgorICogc3RydWN0IGlvbl9oZWFwX2RhdGEgLSBkYXRhIGFib3V0IGEgaGVhcAorICogQG5hbWUgLSBmaXJzdCAzMiBjaGFyYWN0ZXJzIG9mIHRoZSBoZWFwIG5hbWUKKyAqIEB0eXBlIC0gaGVhcCB0eXBlCisgKiBAaGVhcF9pZCAtIGhlYXAgaWQgZm9yIHRoZSBoZWFwCisgKi8KK3N0cnVjdCBpb25faGVhcF9kYXRhIHsKKwljaGFyIG5hbWVbTUFYX0hFQVBfTkFNRV07CisJX191MzIgdHlwZTsKKwlfX3UzMiBoZWFwX2lkOworCV9fdTMyIHJlc2VydmVkMDsKKwlfX3UzMiByZXNlcnZlZDE7CisJX191MzIgcmVzZXJ2ZWQyOworfTsKKworLyoqCisgKiBzdHJ1Y3QgaW9uX2hlYXBfcXVlcnkgLSBjb2xsZWN0aW9uIG9mIGRhdGEgYWJvdXQgYWxsIGhlYXBzCisgKiBAY250IC0gdG90YWwgbnVtYmVyIG9mIGhlYXBzIHRvIGJlIGNvcGllZAorICogQGhlYXBzIC0gYnVmZmVyIHRvIGNvcHkgaGVhcCBkYXRhCisgKi8KK3N0cnVjdCBpb25faGVhcF9xdWVyeSB7CisJX191MzIgY250OyAvKiBUb3RhbCBudW1iZXIgb2YgaGVhcHMgdG8gYmUgY29waWVkICovCisJX191MzIgcmVzZXJ2ZWQwOyAvKiBhbGlnbiB0byA2NGJpdHMgKi8KKwlfX3U2NCBoZWFwczsgLyogYnVmZmVyIHRvIGJlIHBvcHVsYXRlZCAqLworCV9fdTMyIHJlc2VydmVkMTsKKwlfX3UzMiByZXNlcnZlZDI7Cit9OworCiAjZGVmaW5lIElPTl9JT0NfTUFHSUMJCSdJJwogCiAvKioKQEAgLTIwMCw0ICsyMjQsMTMgQEAKICAqLwogI2RlZmluZSBJT05fSU9DX0NVU1RPTQkJX0lPV1IoSU9OX0lPQ19NQUdJQywgNiwgc3RydWN0IGlvbl9jdXN0b21fZGF0YSkKIAorLyoqCisgKiBET0M6IElPTl9JT0NfSEVBUF9RVUVSWSAtIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBoZWFwcworICoKKyAqIFRha2VzIGFuIGlvbl9oZWFwX3F1ZXJ5IHN0cnVjdHVyZSBhbmQgcG9wdWxhdGVzIGluZm9ybWF0aW9uIGFib3V0CisgKiBhdmFpbGFibGUgSW9uIGhlYXBzLgorICovCisjZGVmaW5lIElPTl9JT0NfSEVBUF9RVUVSWSAgICAgX0lPV1IoSU9OX0lPQ19NQUdJQywgOCwgXAorCQkJCQlzdHJ1Y3QgaW9uX2hlYXBfcXVlcnkpCisKICNlbmRpZiAvKiBfVUFQSV9MSU5VWF9JT05fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JvYXJkL2JvYXJkLmMgYi9kcml2ZXJzL3N0YWdpbmcvYm9hcmQvYm9hcmQuYwppbmRleCA0NTgwN2Q4Li44NmRjNDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYm9hcmQvYm9hcmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYm9hcmQvYm9hcmQuYwpAQCAtMTQwLDcgKzE0MCw2IEBACiAJCQkJCWNvbnN0IGNoYXIgKmRvbWFpbikKIHsKIAlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzIHBkX2FyZ3M7Ci0Jc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpwZDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCiAJbnAgPSBvZl9maW5kX25vZGVfYnlfcGF0aChkb21haW4pOwpAQCAtMTUxLDE0ICsxNTAsOCBAQAogCiAJcGRfYXJncy5ucCA9IG5wOwogCXBkX2FyZ3MuYXJnc19jb3VudCA9IDA7Ci0JcGQgPSBvZl9nZW5wZF9nZXRfZnJvbV9wcm92aWRlcigmcGRfYXJncyk7Ci0JaWYgKElTX0VSUihwZCkpIHsKLQkJcHJfZXJyKCJDYW5ub3QgZmluZCBnZW5wZCAlcyAoJWxkKVxuIiwgZG9tYWluLCBQVFJfRVJSKHBkKSk7Ci0JCXJldHVybiBQVFJfRVJSKHBkKTsKLQl9Ci0JcHJfZGVidWcoIkZvdW5kIGdlbnBkICVzIGZvciBkZXZpY2UgJXNcbiIsIHBkLT5uYW1lLCBwZGV2LT5uYW1lKTsKIAotCXJldHVybiBwbV9nZW5wZF9hZGRfZGV2aWNlKHBkLCAmcGRldi0+ZGV2KTsKKwlyZXR1cm4gb2ZfZ2VucGRfYWRkX2RldmljZSgmcGRfYXJncywgJnBkZXYtPmRldik7CiB9CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgYm9hcmRfc3RhZ2luZ19hZGRfZGV2X2RvbWFpbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jCmluZGV4IDE5OTllZWQuLjY0YjM5NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMKQEAgLTgxLDIwICs4MSwyMCBAQAogCShDT01FRElfTlVNX01JTk9SUyAtIENPTUVESV9OVU1fQk9BUkRfTUlOT1JTKQogCiBzdGF0aWMgaW50IGNvbWVkaV9udW1fbGVnYWN5X21pbm9yczsKLW1vZHVsZV9wYXJhbShjb21lZGlfbnVtX2xlZ2FjeV9taW5vcnMsIGludCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW0oY29tZWRpX251bV9sZWdhY3lfbWlub3JzLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhjb21lZGlfbnVtX2xlZ2FjeV9taW5vcnMsCiAJCSAibnVtYmVyIG9mIGNvbWVkaSBtaW5vciBkZXZpY2VzIHRvIHJlc2VydmUgZm9yIG5vbi1hdXRvLWNvbmZpZ3VyZWQgZGV2aWNlcyAoZGVmYXVsdCAwKSIKIAkJKTsKIAogdW5zaWduZWQgaW50IGNvbWVkaV9kZWZhdWx0X2J1Zl9zaXplX2tiID0gQ09ORklHX0NPTUVESV9ERUZBVUxUX0JVRl9TSVpFX0tCOwotbW9kdWxlX3BhcmFtKGNvbWVkaV9kZWZhdWx0X2J1Zl9zaXplX2tiLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0oY29tZWRpX2RlZmF1bHRfYnVmX3NpemVfa2IsIHVpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhjb21lZGlfZGVmYXVsdF9idWZfc2l6ZV9rYiwKIAkJICJkZWZhdWx0IGFzeW5jaHJvbm91cyBidWZmZXIgc2l6ZSBpbiBLaUIgKGRlZmF1bHQgIgogCQkgX19NT0RVTEVfU1RSSU5HKENPTkZJR19DT01FRElfREVGQVVMVF9CVUZfU0laRV9LQikgIikiKTsKIAogdW5zaWduZWQgaW50IGNvbWVkaV9kZWZhdWx0X2J1Zl9tYXhzaXplX2tiCiAJPSBDT05GSUdfQ09NRURJX0RFRkFVTFRfQlVGX01BWFNJWkVfS0I7Ci1tb2R1bGVfcGFyYW0oY29tZWRpX2RlZmF1bHRfYnVmX21heHNpemVfa2IsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShjb21lZGlfZGVmYXVsdF9idWZfbWF4c2l6ZV9rYiwgdWludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNvbWVkaV9kZWZhdWx0X2J1Zl9tYXhzaXplX2tiLAogCQkgImRlZmF1bHQgbWF4aW11bSBzaXplIG9mIGFzeW5jaHJvbm91cyBidWZmZXIgaW4gS2lCIChkZWZhdWx0ICIKIAkJIF9fTU9EVUxFX1NUUklORyhDT05GSUdfQ09NRURJX0RFRkFVTFRfQlVGX01BWFNJWkVfS0IpICIpIik7CkBAIC0yMjMzLDcgKzIyMzMsNyBAQAogCQlnb3RvIGRvbmU7CiAJfQogCi0Jbl9wYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKKwluX3BhZ2VzID0gdm1hX3BhZ2VzKHZtYSk7CiAKIAkvKiBnZXQgcmVmZXJlbmNlIHRvIGN1cnJlbnQgYnVmIG1hcCAoaWYgYW55KSAqLwogCWJtID0gY29tZWRpX2J1Zl9tYXBfZnJvbV9zdWJkZXZfZ2V0KHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYwppbmRleCA0NDUxMWQ3Li5hNWJmMmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYwpAQCAtMTUsNyArMTUsNyBAQAogICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qLworICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTM1MDEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTM1MDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1NzA3NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzNTAxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyogV2F0Y2hkb2cgUmVsYXRlZCBEZWZpbmVzICovCi0KLSNkZWZpbmUgQURESURBVEFfVElNRVIJCQkwCi0jZGVmaW5lIEFERElEQVRBX1dBVENIRE9HCQkyCi0KLS8qCi0gKiAoKmluc25fY29uZmlnKSBmb3IgdGhlIHRpbWVyIHN1YmRldmljZQotICoKLSAqIENvbmZpZ3VyZXMgVGhlIFRpbWVyLCBDb3VudGVyIG9yIFdhdGNoZG9nCi0gKiBEYXRhIFBvaW50ZXIgY29udGFpbnMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93Ci0gKglkYXRhWzBdIDogMCBDb25maWd1cmUgQXMgVGltZXIKLSAqCQkgIDEgQ29uZmlndXJlIEFzIENvdW50ZXIKLSAqCQkgIDIgQ29uZmlndXJlIEFzIFdhdGNoZG9nCi0gKglkYXRhWzFdIDogMSBFbmFibGUgIEludGVycnVwdAotICoJCSAgMCBEaXNhYmxlIEludGVycnVwdAotICoJZGF0YVsyXSA6IFRpbWUgVW5pdAotICoJZGF0YVszXSA6IFJlbG9hZCBWYWx1ZQotICovCi1zdGF0aWMgaW50IGFwY2kzNTAxX2NvbmZpZ19pbnNuX3RpbWVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYXBjaTM1MDFfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgY3RybDsKLQotCWlmIChkYXRhWzBdICE9IEFERElEQVRBX1dBVENIRE9HICYmCi0JICAgIGRhdGFbMF0gIT0gQURESURBVEFfVElNRVIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGV2cHJpdi0+dHNrX0N1cnJlbnQgPSBjdXJyZW50OwotCi0JZGV2cHJpdi0+dGltZXJfbW9kZSA9IGRhdGFbMF07Ci0KLQkvKiBmaXJzdCwgZGlzYWJsZSB0aGUgd2F0Y2hkb2cgb3Igc3RvcCB0aGUgdGltZXIgKi8KLQlpZiAoZGV2cHJpdi0+dGltZXJfbW9kZSA9PSBBRERJREFUQV9XQVRDSERPRykgewotCQljdHJsID0gMDsKLQl9IGVsc2UgewotCQljdHJsID0gaW5sKGRldnByaXYtPnRjdyArIEFERElfVENXX0NUUkxfUkVHKTsKLQkJY3RybCAmPSB+KEFERElfVENXX0NUUkxfR0FURSB8IEFERElfVENXX0NUUkxfVFJJRyB8Ci0JCQkgIEFERElfVENXX0NUUkxfRU5BKTsKLQl9Ci0Jb3V0bChjdHJsLCBkZXZwcml2LT50Y3cgKyBBRERJX1RDV19DVFJMX1JFRyk7Ci0KLQkvKiBlbmFibGUvZGlzYWJsZSB0aGUgdGltZXIgaW50ZXJydXB0ICovCi0JY3RybCA9IChkYXRhWzFdID09IDEpID8gQURESV9UQ1dfQ1RSTF9JUlFfRU5BIDogMDsKLQlvdXRsKGN0cmwsIGRldnByaXYtPnRjdyArIEFERElfVENXX0NUUkxfUkVHKTsKLQotCW91dGwoZGF0YVsyXSwgZGV2cHJpdi0+dGN3ICsgQURESV9UQ1dfVElNRUJBU0VfUkVHKTsKLQlvdXRsKGRhdGFbM10sIGRldnByaXYtPnRjdyArIEFERElfVENXX1JFTE9BRF9SRUcpOwotCi0JY3RybCA9IGlubChkZXZwcml2LT50Y3cgKyBBRERJX1RDV19DVFJMX1JFRyk7Ci0JaWYgKGRldnByaXYtPnRpbWVyX21vZGUgPT0gQURESURBVEFfV0FUQ0hET0cpIHsKLQkJLyogU2V0IHRoZSBtb2RlIChlMi0+ZTApIE5PVEU6IHRoaXMgZG9lc24ndCBsb29rIGNvcnJlY3QgKi8KLQkJY3RybCB8PSB+KEFERElfVENXX0NUUkxfQ05UX1VQIHwgQURESV9UQ1dfQ1RSTF9FWFRfQ0xLX01BU0sgfAotCQkJICBBRERJX1RDV19DVFJMX01PREVfTUFTSyB8IEFERElfVENXX0NUUkxfR0FURSB8Ci0JCQkgIEFERElfVENXX0NUUkxfVFJJRyB8IEFERElfVENXX0NUUkxfVElNRVJfRU5BIHwKLQkJCSAgQURESV9UQ1dfQ1RSTF9SRVNFVF9FTkEgfCBBRERJX1RDV19DVFJMX1dBUk5fRU5BIHwKLQkJCSAgQURESV9UQ1dfQ1RSTF9JUlFfRU5BIHwgQURESV9UQ1dfQ1RSTF9FTkEpOwotCX0gZWxzZSB7Ci0JCS8qIG1vZGUgMiAqLwotCQljdHJsICY9IH4oQURESV9UQ1dfQ1RSTF9DTlRSX0VOQSB8IEFERElfVENXX0NUUkxfTU9ERV9NQVNLIHwKLQkJCSAgQURESV9UQ1dfQ1RSTF9HQVRFIHwgQURESV9UQ1dfQ1RSTF9UUklHIHwKLQkJCSAgQURESV9UQ1dfQ1RSTF9USU1FUl9FTkEgfCBBRERJX1RDV19DVFJMX1JFU0VUX0VOQSB8Ci0JCQkgIEFERElfVENXX0NUUkxfV0FSTl9FTkEgfCBBRERJX1RDV19DVFJMX0VOQSk7Ci0JCWN0cmwgfD0gQURESV9UQ1dfQ1RSTF9NT0RFKDIpIHwgQURESV9UQ1dfQ1RSTF9USU1FUl9FTkE7Ci0JfQotCW91dGwoY3RybCwgZGV2cHJpdi0+dGN3ICsgQURESV9UQ1dfQ1RSTF9SRUcpOwotCi0JcmV0dXJuIGluc24tPm47Ci19Ci0KLS8qCi0gKiAoKmluc25fd3JpdGUpIGZvciB0aGUgdGltZXIgc3ViZGV2aWNlCi0gKgotICogU3RhcnQgLyBTdG9wIFRoZSBTZWxlY3RlZCBUaW1lciAsIENvdW50ZXIgb3IgV2F0Y2hkb2cKLSAqIERhdGEgUG9pbnRlciBjb250YWlucyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXMgYmVsb3cKLSAqCWRhdGFbMF0gOiAwIFRpbWVyCi0gKgkJICAxIENvdW50ZXIKLSAqCQkgIDIgV2F0Y2hkb2cKLSAqCWRhdGFbMV0gOiAxIFN0YXJ0Ci0gKgkJICAwIFN0b3AKLSAqCQkgIDIgVHJpZ2dlcgotICovCi1zdGF0aWMgaW50IGFwY2kzNTAxX3dyaXRlX2luc25fdGltZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCSAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCSAgICAgdW5zaWduZWQgaW50ICpkYXRhKQotewotCXN0cnVjdCBhcGNpMzUwMV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCBjdHJsOwotCi0JaWYgKGRldnByaXYtPnRpbWVyX21vZGUgPT0gQURESURBVEFfV0FUQ0hET0cgfHwKLQkgICAgZGV2cHJpdi0+dGltZXJfbW9kZSA9PSBBRERJREFUQV9USU1FUikgewotCQljdHJsID0gaW5sKGRldnByaXYtPnRjdyArIEFERElfVENXX0NUUkxfUkVHKTsKLQkJY3RybCAmPSB+KEFERElfVENXX0NUUkxfR0FURSB8IEFERElfVENXX0NUUkxfVFJJRyk7Ci0KLQkJaWYgKGRhdGFbMV0gPT0gMSkgewkJLyogZW5hYmxlICovCi0JCQljdHJsIHw9IEFERElfVENXX0NUUkxfRU5BOwotCQl9IGVsc2UgaWYgKGRhdGFbMV0gPT0gMCkgewkvKiBzdG9wICovCi0JCQlpZiAoZGV2cHJpdi0+dGltZXJfbW9kZSA9PSBBRERJREFUQV9XQVRDSERPRykKLQkJCQljdHJsID0gMDsKLQkJCWVsc2UKLQkJCQljdHJsICY9IH5BRERJX1RDV19DVFJMX0VOQTsKLQkJfSBlbHNlIGlmIChkYXRhWzFdID09IDIpIHsJLyogdHJpZ2dlciAqLwotCQkJY3RybCB8PSBBRERJX1RDV19DVFJMX1RSSUc7Ci0JCX0KLQkJb3V0bChjdHJsLCBkZXZwcml2LT50Y3cgKyBBRERJX1RDV19DVFJMX1JFRyk7Ci0JfQotCi0JaW5sKGRldnByaXYtPnRjdyArIEFERElfVENXX1NUQVRVU19SRUcpOwotCXJldHVybiBpbnNuLT5uOwotfQotCi0vKgotICogKCppbnNuX3JlYWQpIGZvciB0aGUgdGltZXIgc3ViZGV2aWNlCi0gKgotICogUmVhZCBUaGUgU2VsZWN0ZWQgVGltZXIsIENvdW50ZXIgb3IgV2F0Y2hkb2cKLSAqIERhdGEgUG9pbnRlciBjb250YWlucyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXMgYmVsb3cKLSAqCWRhdGFbMF0gOiAwIFRpbWVyCi0gKgkJICAxIENvdW50ZXIKLSAqCQkgIDIgV2F0Y2hkb2cKLSAqCWRhdGFbMV0gOiBUaW1lciBDb3VudGVyIFdhdGNoZG9nIE51bWJlcgotICovCi1zdGF0aWMgaW50IGFwY2kzNTAxX3JlYWRfaW5zbl90aW1lcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0Jc3RydWN0IGFwY2kzNTAxX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0KLQlpZiAoZGV2cHJpdi0+dGltZXJfbW9kZSAhPSBBRERJREFUQV9USU1FUiAmJgotCSAgICBkZXZwcml2LT50aW1lcl9tb2RlICE9IEFERElEQVRBX1dBVENIRE9HKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRhdGFbMF0gPSBpbmwoZGV2cHJpdi0+dGN3ICsgQURESV9UQ1dfU1RBVFVTX1JFRykgJgotCQkgIEFERElfVENXX1NUQVRVU19PVkVSRkxPVzsKLQlkYXRhWzFdID0gaW5sKGRldnByaXYtPnRjdyArIEFERElfVENXX1ZBTF9SRUcpOwotCi0JcmV0dXJuIGluc24tPm47Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzM1MDEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMzUwMS5jCmluZGV4IDQwZmY5MTQuLjU3ZjBmNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMzUwMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMzUwMS5jCkBAIC0yMiwxMiArMjIsMzYgQEAKICAqIG1vcmUgZGV0YWlscy4KICAqLwogCisvKgorICogRHJpdmVyOiBhZGRpX2FwY2lfMzUwMQorICogRGVzY3JpcHRpb246IEFEREktREFUQSBBUENJLTM1MDEgQW5hbG9nIG91dHB1dCBib2FyZAorICogRGV2aWNlczogW0FEREktREFUQV0gQVBDSS0zNTAxIChhZGRpX2FwY2lfMzUwMSkKKyAqIEF1dGhvcjogSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+CisgKiBVcGRhdGVkOiBNb24sIDIwIEp1biAyMDE2IDEwOjU3OjAxIC0wNzAwCisgKiBTdGF0dXM6IHVudGVzdGVkCisgKgorICogQ29uZmlndXJhdGlvbiBPcHRpb25zOiBub3QgYXBwbGljYWJsZSwgdXNlcyBjb21lZGkgUENJIGF1dG8gY29uZmlnCisgKgorICogVGhpcyBib2FyZCBoYXMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczoKKyAqICAgLSA0IG9yIDggYW5hbG9nIG91dHB1dCBjaGFubmVscworICogICAtIDIgb3B0aWNhbGx5IGlzb2xhdGVkIGRpZ2l0YWwgaW5wdXRzCisgKiAgIC0gMiBvcHRpY2FsbHkgaXNvbGF0ZWQgZGlnaXRhbCBvdXRwdXRzCisgKiAgIC0gMSAxMi1iaXQgd2F0Y2hkb2cvdGltZXIKKyAqCisgKiBUaGVyZSBhcmUgMiB2ZXJzaW9ucyBvZiB0aGUgQVBDSS0zNTAxOgorICogICAtIEFQQ0ktMzUwMS00ICA0IGFuYWxvZyBvdXRwdXQgY2hhbm5lbHMKKyAqICAgLSBBUENJLTM1MDEtOCAgOCBhbmFsb2cgb3V0cHV0IGNoYW5uZWxzCisgKgorICogVGhlc2UgYm9hcmRzIHVzZSB0aGUgc2FtZSBQQ0kgVmVuZG9yL0RldmljZSBJRHMuIFRoZSBudW1iZXIgb2Ygb3V0cHV0CisgKiBjaGFubmVscyB1c2VkIGJ5IHRoaXMgZHJpdmVyIGlzIGRldGVybWluZWQgYnkgcmVhZGluZyB0aGUgRUVQUk9NIG9uCisgKiB0aGUgYm9hcmQuCisgKgorICogVGhlIHdhdGNoZG9nL3RpbWVyIHN1YmRldmljZSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KKyAqLworCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKLSNpbmNsdWRlICJhZGRpX3Rjdy5oIgogI2luY2x1ZGUgImFtY2NfczU5MzMuaCIKIAogLyoKQEAgLTY3LDggKzkxLDYgQEAKIAogc3RydWN0IGFwY2kzNTAxX3ByaXZhdGUgewogCXVuc2lnbmVkIGxvbmcgYW1jYzsKLQl1bnNpZ25lZCBsb25nIHRjdzsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRza19DdXJyZW50OwogCXVuc2lnbmVkIGNoYXIgdGltZXJfbW9kZTsKIH07CiAKQEAgLTEzOSw4ICsxNjEsNiBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCi0jaW5jbHVkZSAiYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzNTAxLmMiCi0KIHN0YXRpYyBpbnQgYXBjaTM1MDFfZGlfaW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCkBAIC0yNTMsMzcgKzI3Myw2IEBACiAJcmV0dXJuIGluc24tPm47CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBhcGNpMzUwMV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKLXsKLQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKLQlzdHJ1Y3QgYXBjaTM1MDFfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzOwotCXVuc2lnbmVkIGludCBjdHJsOwotCi0JLyogIERpc2FibGUgSW50ZXJydXB0ICovCi0JY3RybCA9IGlubChkZXZwcml2LT50Y3cgKyBBRERJX1RDV19DVFJMX1JFRyk7Ci0JY3RybCAmPSB+KEFERElfVENXX0NUUkxfR0FURSB8IEFERElfVENXX0NUUkxfVFJJRyB8Ci0JCSAgQURESV9UQ1dfQ1RSTF9JUlFfRU5BKTsKLQlvdXRsKGN0cmwsIGRldnByaXYtPnRjdyArIEFERElfVENXX0NUUkxfUkVHKTsKLQotCXN0YXR1cyA9IGlubChkZXZwcml2LT50Y3cgKyBBRERJX1RDV19JUlFfUkVHKTsKLQlpZiAoIShzdGF0dXMgJiBBRERJX1RDV19JUlEpKSB7Ci0JCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJJUlEgZnJvbSB1bmtub3duIHNvdXJjZVxuIik7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0KLQkvKiBFbmFibGUgSW50ZXJydXB0IFNlbmQgYSBzaWduYWwgdG8gZnJvbSBrZXJuZWwgdG8gdXNlciBzcGFjZSAqLwotCXNlbmRfc2lnKFNJR0lPLCBkZXZwcml2LT50c2tfQ3VycmVudCwgMCk7Ci0JY3RybCA9IGlubChkZXZwcml2LT50Y3cgKyBBRERJX1RDV19DVFJMX1JFRyk7Ci0JY3RybCAmPSB+KEFERElfVENXX0NUUkxfR0FURSB8IEFERElfVENXX0NUUkxfVFJJRyB8Ci0JCSAgQURESV9UQ1dfQ1RSTF9JUlFfRU5BKTsKLQljdHJsIHw9IEFERElfVENXX0NUUkxfSVJRX0VOQTsKLQlvdXRsKGN0cmwsIGRldnByaXYtPnRjdyArIEFERElfVENXX0NUUkxfUkVHKTsKLQlpbmwoZGV2cHJpdi0+dGN3ICsgQURESV9UQ1dfU1RBVFVTX1JFRyk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KIHN0YXRpYyBpbnQgYXBjaTM1MDFfcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAl1bnNpZ25lZCBpbnQgdmFsOwpAQCAtMzMzLDE3ICszMjIsOSBAQAogCiAJZGV2cHJpdi0+YW1jYyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDApOwogCWRldi0+aW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMSk7Ci0JZGV2cHJpdi0+dGN3ID0gZGV2LT5pb2Jhc2UgKyBBUENJMzUwMV9USU1FUl9CQVNFOwogCiAJYW9fbl9jaGFuID0gYXBjaTM1MDFfZWVwcm9tX2dldF9hb19uX2NoYW4oZGV2KTsKIAotCWlmIChwY2lkZXYtPmlycSA+IDApIHsKLQkJcmV0ID0gcmVxdWVzdF9pcnEocGNpZGV2LT5pcnEsIGFwY2kzNTAxX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCi0JCQkJICBkZXYtPmJvYXJkX25hbWUsIGRldik7Ci0JCWlmIChyZXQgPT0gMCkKLQkJCWRldi0+aXJxID0gcGNpZGV2LT5pcnE7Ci0JfQotCiAJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCA1KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtMzgzLDE3ICszNjQsOSBAQAogCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2RpZ2l0YWw7CiAJcy0+aW5zbl9iaXRzCT0gYXBjaTM1MDFfZG9faW5zbl9iaXRzOwogCi0JLyogSW5pdGlhbGl6ZSB0aGUgdGltZXIvd2F0Y2hkb2cgc3ViZGV2aWNlICovCisJLyogVGltZXIvV2F0Y2hkb2cgc3ViZGV2aWNlICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbM107Ci0Jcy0+dHlwZSA9IENPTUVESV9TVUJEX1RJTUVSOwotCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRTsKLQlzLT5uX2NoYW4gPSAxOwotCXMtPm1heGRhdGEgPSAwOwotCXMtPmxlbl9jaGFubGlzdCA9IDE7Ci0Jcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKLQlzLT5pbnNuX3dyaXRlID0gYXBjaTM1MDFfd3JpdGVfaW5zbl90aW1lcjsKLQlzLT5pbnNuX3JlYWQgPSBhcGNpMzUwMV9yZWFkX2luc25fdGltZXI7Ci0Jcy0+aW5zbl9jb25maWcgPSBhcGNpMzUwMV9jb25maWdfaW5zbl90aW1lcjsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX1VOVVNFRDsKIAogCS8qIEluaXRpYWxpemUgdGhlIGVlcHJvbSBzdWJkZXZpY2UgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1s0XTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExOC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTE4LmMKaW5kZXggYmU3MGJkMy4uODY0NTBjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTE4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTE4LmMKQEAgLTE2OTMsOCArMTY5Myw3IEBACiAJCXBjaTkxMThfcmVzZXQoZGV2KTsKIAljb21lZGlfcGNpX2RldGFjaChkZXYpOwogCXBjaTkxMThfZnJlZV9kbWEoZGV2KTsKLQlpZiAocGNpZGV2KQotCQlwY2lfZGV2X3B1dChwY2lkZXYpOworCXBjaV9kZXZfcHV0KHBjaWRldik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY29tZWRpX2RyaXZlciBhZGxfcGNpOTExOF9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3NjAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpMTc2MC5jCmluZGV4IGQ3ZGQxZTUuLjlmNTI1ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpMTc2MC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpMTc2MC5jCkBAIC0xOTYsNiArMTk2LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBDTURGX1JPVU5EX0RPV046CiAJCWRpdmlzb3IgPSBucyAvIFBDSTE3NjBfUFdNX1RJTUVCQVNFOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGFzNjQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXM2NC5jCmluZGV4IDFmOWMwOGEuLmNiOWMyNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXM2NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXM2NC5jCkBAIC0xLDM0ICsxLDM0IEBACiAvKgotICAgIGNvbWVkaS9kcml2ZXJzL2NiX3BjaWRhczY0LmMKLSAgICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgQ29tcHV0ZXJCb2FyZHMvTWVhc3VyZW1lbnRDb21wdXRpbmcgUENJLURBUwotICAgIDY0eHgsIDYweHgsIGFuZCA0MDIwIGNhcmRzLgotCi0gICAgQXV0aG9yOiAgRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgotICAgIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBGcmFuayBNb3JpIEhlc3MKLQotICAgIFRoYW5rcyBhbHNvIGdvIHRvIHRoZSBmb2xsb3dpbmcgcGVvcGxlOgotCi0gICAgU3RldmUgUm9zZW5ibHV0aCwgZm9yIHByb3ZpZGluZyB0aGUgc291cmNlIGNvZGUgZm9yCi0gICAgaGlzIHBjaS1kYXM2NDAyIGRyaXZlciwgYW5kIHNvdXJjZSBjb2RlIGZvciB3b3JraW5nIFFOWCBwY2ktNjQwMgotICAgIGRyaXZlcnMgYnkgR3JlZyBMYWlyZCBhbmQgTWFyaXVzeiBCb2dhY3ouICBOb25lIG9mIHRoZSBjb2RlIHdhcwotICAgIHVzZWQgZGlyZWN0bHkgaGVyZSwgYnV0IGl0IHdhcyB1c2VmdWwgYXMgYW4gYWRkaXRpb25hbCBzb3VyY2Ugb2YKLSAgICBkb2N1bWVudGF0aW9uIG9uIGhvdyB0byBwcm9ncmFtIHRoZSBib2FyZHMuCi0KLSAgICBKb2huIFNpbXMsIGZvciBtdWNoIHRlc3RpbmcgYW5kIGZlZWRiYWNrIG9uIHBjaWRhcy00MDIwIHN1cHBvcnQuCi0KLSAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTggRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSovCisgKiBjb21lZGkvZHJpdmVycy9jYl9wY2lkYXM2NC5jCisgKiBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgQ29tcHV0ZXJCb2FyZHMvTWVhc3VyZW1lbnRDb21wdXRpbmcgUENJLURBUworICogNjR4eCwgNjB4eCwgYW5kIDQwMjAgY2FyZHMuCisgKgorICogQXV0aG9yOiAgRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIEZyYW5rIE1vcmkgSGVzcworICoKKyAqIFRoYW5rcyBhbHNvIGdvIHRvIHRoZSBmb2xsb3dpbmcgcGVvcGxlOgorICoKKyAqIFN0ZXZlIFJvc2VuYmx1dGgsIGZvciBwcm92aWRpbmcgdGhlIHNvdXJjZSBjb2RlIGZvcgorICogaGlzIHBjaS1kYXM2NDAyIGRyaXZlciwgYW5kIHNvdXJjZSBjb2RlIGZvciB3b3JraW5nIFFOWCBwY2ktNjQwMgorICogZHJpdmVycyBieSBHcmVnIExhaXJkIGFuZCBNYXJpdXN6IEJvZ2Fjei4gIE5vbmUgb2YgdGhlIGNvZGUgd2FzCisgKiB1c2VkIGRpcmVjdGx5IGhlcmUsIGJ1dCBpdCB3YXMgdXNlZnVsIGFzIGFuIGFkZGl0aW9uYWwgc291cmNlIG9mCisgKiBkb2N1bWVudGF0aW9uIG9uIGhvdyB0byBwcm9ncmFtIHRoZSBib2FyZHMuCisgKgorICogSm9obiBTaW1zLCBmb3IgbXVjaCB0ZXN0aW5nIGFuZCBmZWVkYmFjayBvbiBwY2lkYXMtNDAyMCBzdXBwb3J0LgorICoKKyAqIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMTk5Ny04IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLwogCiAvKgogICogRHJpdmVyOiBjYl9wY2lkYXM2NApAQCAtNjYsMTkgKzY2LDE4IEBACiAgKi8KIAogLyoKLQotVE9ETzoKLQltYWtlIGl0IHJldHVybiBlcnJvciBpZiB1c2VyIGF0dGVtcHRzIGFuIGFpIGNvbW1hbmQgdGhhdCB1c2VzIHRoZQotCWV4dGVybmFsIHF1ZXVlLCBhbmQgYW4gYW8gY29tbWFuZCBzaW11bHRhbmVvdXNseSB1c2VyIGNvdW50ZXIgc3ViZGV2aWNlCi0JdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGJvYXJkcyB0aGlzIGRyaXZlciB3aWxsIHN1cHBvcnQgd2hlbiB0aGV5IGFyZQotCWZ1bGx5IHJlbGVhc2VkLCBidXQgZG9lcyBub3QgeWV0IHNpbmNlIHRoZSBwY2kgZGV2aWNlIGlkIG51bWJlcnMKLQlhcmUgbm90IHlldCBhdmFpbGFibGUuCi0KLQlzdXBwb3J0IHByZXNjYWxlZCAxMDBraHogY2xvY2sgZm9yIHNsb3cgcGFjaW5nIChub3QgYXZhaWxhYmxlIG9uIDYwMDAKLQlzZXJpZXM/KQotCi0JbWFrZSBhbyBmaWZvIHNpemUgYWRqdXN0YWJsZSBsaWtlIGFpIGZpZm8KLSovCisgKiBUT0RPOgorICogbWFrZSBpdCByZXR1cm4gZXJyb3IgaWYgdXNlciBhdHRlbXB0cyBhbiBhaSBjb21tYW5kIHRoYXQgdXNlcyB0aGUKKyAqIGV4dGVybmFsIHF1ZXVlLCBhbmQgYW4gYW8gY29tbWFuZCBzaW11bHRhbmVvdXNseSB1c2VyIGNvdW50ZXIgc3ViZGV2aWNlCisgKiB0aGVyZSBhcmUgYSBudW1iZXIgb2YgYm9hcmRzIHRoaXMgZHJpdmVyIHdpbGwgc3VwcG9ydCB3aGVuIHRoZXkgYXJlCisgKiBmdWxseSByZWxlYXNlZCwgYnV0IGRvZXMgbm90IHlldCBzaW5jZSB0aGUgcGNpIGRldmljZSBpZCBudW1iZXJzCisgKiBhcmUgbm90IHlldCBhdmFpbGFibGUuCisgKgorICogc3VwcG9ydCBwcmVzY2FsZWQgMTAwa2h6IGNsb2NrIGZvciBzbG93IHBhY2luZyAobm90IGF2YWlsYWJsZSBvbiA2MDAwCisgKiBzZXJpZXM/KQorICoKKyAqIG1ha2UgYW8gZmlmbyBzaXplIGFkanVzdGFibGUgbGlrZSBhaSBmaWZvCisgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC05MCw1MyArODksNTYgQEAKICNpbmNsdWRlICJwbHg5MDgwLmgiCiAKICNkZWZpbmUgVElNRVJfQkFTRSAyNQkJLyogIDQwTUh6IG1hc3RlciBjbG9jayAqLwotLyogMTAwa0h6ICdwcmVzY2FsZWQnIGNsb2NrIGZvciBzbG93IGFjcXVpc2l0aW9uLAotICogbWF5YmUgSSdsbCBzdXBwb3J0IHRoaXMgc29tZWRheSAqLworLyoKKyAqIDEwMGtIeiAncHJlc2NhbGVkJyBjbG9jayBmb3Igc2xvdyBhY3F1aXNpdGlvbiwKKyAqIG1heWJlIEknbGwgc3VwcG9ydCB0aGlzIHNvbWVkYXkKKyAqLwogI2RlZmluZSBQUkVTQ0FMRURfVElNRVJfQkFTRQkxMDAwMAotI2RlZmluZSBETUFfQlVGRkVSX1NJWkUgMHgxMDAwCisjZGVmaW5lIERNQV9CVUZGRVJfU0laRQkJMHgxMDAwCisjZGVmaW5lIERBQ19GSUZPX1NJWkUJCTB4MjAwMAogCi0vKiBtYXhpbXVtIHZhbHVlIHRoYXQgY2FuIGJlIGxvYWRlZCBpbnRvIGJvYXJkJ3MgMjQtYml0IGNvdW50ZXJzKi8KKy8qIG1heGltdW0gdmFsdWUgdGhhdCBjYW4gYmUgbG9hZGVkIGludG8gYm9hcmQncyAyNC1iaXQgY291bnRlcnMgKi8KIHN0YXRpYyBjb25zdCBpbnQgbWF4X2NvdW50ZXJfdmFsdWUgPSAweGZmZmZmZjsKIAogLyogUENJLURBUzY0eHh4IGJhc2UgYWRkcmVzc2VzICovCiAKIC8qIGRldnByaXYtPm1haW5faW9iYXNlIHJlZ2lzdGVycyAqLwogZW51bSB3cml0ZV9vbmx5X3JlZ2lzdGVycyB7Ci0JSU5UUl9FTkFCTEVfUkVHID0gMHgwLAkvKiAgaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLwotCUhXX0NPTkZJR19SRUcgPSAweDIsCS8qICBoYXJkd2FyZSBjb25maWcgcmVnaXN0ZXIgKi8KKwlJTlRSX0VOQUJMRV9SRUcgPSAweDAsCQkvKiBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovCisJSFdfQ09ORklHX1JFRyA9IDB4MiwJCS8qIGhhcmR3YXJlIGNvbmZpZyByZWdpc3RlciAqLwogCURBUV9TWU5DX1JFRyA9IDB4YywKIAlEQVFfQVRSSUdfTE9XXzQwMjBfUkVHID0gMHhjLAotCUFEQ19DT05UUk9MMF9SRUcgPSAweDEwLAkvKiAgYWRjIGNvbnRyb2wgcmVnaXN0ZXIgMCAqLwotCUFEQ19DT05UUk9MMV9SRUcgPSAweDEyLAkvKiAgYWRjIGNvbnRyb2wgcmVnaXN0ZXIgMSAqLworCUFEQ19DT05UUk9MMF9SRUcgPSAweDEwLAkvKiBhZGMgY29udHJvbCByZWdpc3RlciAwICovCisJQURDX0NPTlRST0wxX1JFRyA9IDB4MTIsCS8qIGFkYyBjb250cm9sIHJlZ2lzdGVyIDEgKi8KIAlDQUxJQlJBVElPTl9SRUcgPSAweDE0LAotCS8qICBsb3dlciAxNiBiaXRzIG9mIGFkYyBzYW1wbGUgaW50ZXJ2YWwgY291bnRlciAqLworCS8qIGxvd2VyIDE2IGJpdHMgb2YgYWRjIHNhbXBsZSBpbnRlcnZhbCBjb3VudGVyICovCiAJQURDX1NBTVBMRV9JTlRFUlZBTF9MT1dFUl9SRUcgPSAweDE2LAotCS8qICB1cHBlciA4IGJpdHMgb2YgYWRjIHNhbXBsZSBpbnRlcnZhbCBjb3VudGVyICovCisJLyogdXBwZXIgOCBiaXRzIG9mIGFkYyBzYW1wbGUgaW50ZXJ2YWwgY291bnRlciAqLwogCUFEQ19TQU1QTEVfSU5URVJWQUxfVVBQRVJfUkVHID0gMHgxOCwKLQkvKiAgbG93ZXIgMTYgYml0cyBvZiBkZWxheSBpbnRlcnZhbCBjb3VudGVyICovCisJLyogbG93ZXIgMTYgYml0cyBvZiBkZWxheSBpbnRlcnZhbCBjb3VudGVyICovCiAJQURDX0RFTEFZX0lOVEVSVkFMX0xPV0VSX1JFRyA9IDB4MWEsCi0JLyogIHVwcGVyIDggYml0cyBvZiBkZWxheSBpbnRlcnZhbCBjb3VudGVyICovCisJLyogdXBwZXIgOCBiaXRzIG9mIGRlbGF5IGludGVydmFsIGNvdW50ZXIgKi8KIAlBRENfREVMQVlfSU5URVJWQUxfVVBQRVJfUkVHID0gMHgxYywKLQkvKiAgbG93ZXIgMTYgYml0cyBvZiBoYXJkd2FyZSBjb252ZXJzaW9uL3NjYW4gY291bnRlciAqLworCS8qIGxvd2VyIDE2IGJpdHMgb2YgaGFyZHdhcmUgY29udmVyc2lvbi9zY2FuIGNvdW50ZXIgKi8KIAlBRENfQ09VTlRfTE9XRVJfUkVHID0gMHgxZSwKLQkvKiAgdXBwZXIgOCBiaXRzIG9mIGhhcmR3YXJlIGNvbnZlcnNpb24vc2NhbiBjb3VudGVyICovCisJLyogdXBwZXIgOCBiaXRzIG9mIGhhcmR3YXJlIGNvbnZlcnNpb24vc2NhbiBjb3VudGVyICovCiAJQURDX0NPVU5UX1VQUEVSX1JFRyA9IDB4MjAsCi0JQURDX1NUQVJUX1JFRyA9IDB4MjIsCS8qICBzb2Z0d2FyZSB0cmlnZ2VyIHRvIHN0YXJ0IGFjcXVpc2l0aW9uICovCi0JQURDX0NPTlZFUlRfUkVHID0gMHgyNCwJLyogIGluaXRpYXRlcyBzaW5nbGUgY29udmVyc2lvbiAqLwotCUFEQ19RVUVVRV9DTEVBUl9SRUcgPSAweDI2LAkvKiAgY2xlYXJzIGFkYyBxdWV1ZSAqLwotCUFEQ19RVUVVRV9MT0FEX1JFRyA9IDB4MjgsCS8qICBsb2FkcyBhZGMgcXVldWUgKi8KKwlBRENfU1RBUlRfUkVHID0gMHgyMiwJLyogc29mdHdhcmUgdHJpZ2dlciB0byBzdGFydCBhY3F1aXNpdGlvbiAqLworCUFEQ19DT05WRVJUX1JFRyA9IDB4MjQsCS8qIGluaXRpYXRlcyBzaW5nbGUgY29udmVyc2lvbiAqLworCUFEQ19RVUVVRV9DTEVBUl9SRUcgPSAweDI2LAkvKiBjbGVhcnMgYWRjIHF1ZXVlICovCisJQURDX1FVRVVFX0xPQURfUkVHID0gMHgyOCwJLyogbG9hZHMgYWRjIHF1ZXVlICovCiAJQURDX0JVRkZFUl9DTEVBUl9SRUcgPSAweDJhLAotCS8qICBoaWdoIGNoYW5uZWwgZm9yIGludGVybmFsIHF1ZXVlLCB1c2UgYWRjX2NoYW5fYml0cygpIGlubGluZSBhYm92ZSAqLworCS8qIGhpZ2ggY2hhbm5lbCBmb3IgaW50ZXJuYWwgcXVldWUsIHVzZSBhZGNfY2hhbl9iaXRzKCkgaW5saW5lIGFib3ZlICovCiAJQURDX1FVRVVFX0hJR0hfUkVHID0gMHgyYywKLQlEQUNfQ09OVFJPTDBfUkVHID0gMHg1MCwJLyogIGRhYyBjb250cm9sIHJlZ2lzdGVyIDAgKi8KLQlEQUNfQ09OVFJPTDFfUkVHID0gMHg1MiwJLyogIGRhYyBjb250cm9sIHJlZ2lzdGVyIDAgKi8KLQkvKiAgbG93ZXIgMTYgYml0cyBvZiBkYWMgc2FtcGxlIGludGVydmFsIGNvdW50ZXIgKi8KKwlEQUNfQ09OVFJPTDBfUkVHID0gMHg1MCwJLyogZGFjIGNvbnRyb2wgcmVnaXN0ZXIgMCAqLworCURBQ19DT05UUk9MMV9SRUcgPSAweDUyLAkvKiBkYWMgY29udHJvbCByZWdpc3RlciAwICovCisJLyogbG93ZXIgMTYgYml0cyBvZiBkYWMgc2FtcGxlIGludGVydmFsIGNvdW50ZXIgKi8KIAlEQUNfU0FNUExFX0lOVEVSVkFMX0xPV0VSX1JFRyA9IDB4NTQsCi0JLyogIHVwcGVyIDggYml0cyBvZiBkYWMgc2FtcGxlIGludGVydmFsIGNvdW50ZXIgKi8KKwkvKiB1cHBlciA4IGJpdHMgb2YgZGFjIHNhbXBsZSBpbnRlcnZhbCBjb3VudGVyICovCiAJREFDX1NBTVBMRV9JTlRFUlZBTF9VUFBFUl9SRUcgPSAweDU2LAogCURBQ19TRUxFQ1RfUkVHID0gMHg2MCwKIAlEQUNfU1RBUlRfUkVHID0gMHg2NCwKLQlEQUNfQlVGRkVSX0NMRUFSX1JFRyA9IDB4NjYsCS8qICBjbGVhciBkYWMgYnVmZmVyICovCisJREFDX0JVRkZFUl9DTEVBUl9SRUcgPSAweDY2LAkvKiBjbGVhciBkYWMgYnVmZmVyICovCiB9OwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkYWNfY29udmVydF9yZWcodW5zaWduZWQgaW50IGNoYW5uZWwpCkBAIC0xNjgsOCArMTcwLDggQEAKIH07CiAKIGVudW0gcmVhZF93cml0ZV9yZWdpc3RlcnMgewotCUk4MjU1XzQwMjBfUkVHID0gMHg0OCwJLyogIDgyNTUgb2Zmc2V0LCBmb3IgNDAyMCBvbmx5ICovCi0JLyogIGV4dGVybmFsIGNoYW5uZWwvZ2FpbiBxdWV1ZSwgdXNlcyBzYW1lIGJpdHMgYXMgQURDX1FVRVVFX0xPQURfUkVHICovCisJSTgyNTVfNDAyMF9SRUcgPSAweDQ4LAkvKiA4MjU1IG9mZnNldCwgZm9yIDQwMjAgb25seSAqLworCS8qIGV4dGVybmFsIGNoYW5uZWwvZ2FpbiBxdWV1ZSwgdXNlcyBzYW1lIGJpdHMgYXMgQURDX1FVRVVFX0xPQURfUkVHICovCiAJQURDX1FVRVVFX0ZJRk9fUkVHID0gMHgxMDAsCiAJQURDX0ZJRk9fUkVHID0gMHgyMDAsCS8qIGFkYyBkYXRhIGZpZm8gKi8KIAkvKiBkYWMgZGF0YSBmaWZvLCBoYXMgd2VpcmQgaW50ZXJhY3Rpb25zIHdpdGggZXh0ZXJuYWwgY2hhbm5lbCBxdWV1ZSAqLwpAQCAtMTg4LDUwICsxOTAsNTEgQEAKIC8qIGJpdCBkZWZpbml0aW9ucyBmb3Igd3JpdGUtb25seSByZWdpc3RlcnMgKi8KIAogZW51bSBpbnRyX2VuYWJsZV9jb250ZW50cyB7Ci0JQURDX0lOVFJfU1JDX01BU0sgPSAweDMsCS8qICBhZGMgaW50ZXJydXB0IHNvdXJjZSBtYXNrICovCi0JQURDX0lOVFJfUUZVTExfQklUUyA9IDB4MCwJLyogIGludGVycnVwdCBmaWZvIHF1YXJ0ZXIgZnVsbCAqLwotCUFEQ19JTlRSX0VPQ19CSVRTID0gMHgxLAkvKiAgaW50ZXJydXB0IGVuZCBvZiBjb252ZXJzaW9uICovCi0JQURDX0lOVFJfRU9TQ0FOX0JJVFMgPSAweDIsCS8qICBpbnRlcnJ1cHQgZW5kIG9mIHNjYW4gKi8KLQlBRENfSU5UUl9FT1NFUV9CSVRTID0gMHgzLAkvKiAgaW50ZXJydXB0IGVuZCBvZiBzZXF1ZW5jZSBtYXNrICovCi0JRU5fQURDX0lOVFJfU1JDX0JJVCA9IDB4NCwJLyogIGVuYWJsZSBhZGMgaW50ZXJydXB0IHNvdXJjZSAqLwotCUVOX0FEQ19ET05FX0lOVFJfQklUID0gMHg4LAkvKiAgZW5hYmxlIGFkYyBhY3F1aXNpdGlvbiBkb25lIGludHIgKi8KKwlBRENfSU5UUl9TUkNfTUFTSyA9IDB4MywJLyogYWRjIGludGVycnVwdCBzb3VyY2UgbWFzayAqLworCUFEQ19JTlRSX1FGVUxMX0JJVFMgPSAweDAsCS8qIGludGVycnVwdCBmaWZvIHF1YXJ0ZXIgZnVsbCAqLworCUFEQ19JTlRSX0VPQ19CSVRTID0gMHgxLAkvKiBpbnRlcnJ1cHQgZW5kIG9mIGNvbnZlcnNpb24gKi8KKwlBRENfSU5UUl9FT1NDQU5fQklUUyA9IDB4MiwJLyogaW50ZXJydXB0IGVuZCBvZiBzY2FuICovCisJQURDX0lOVFJfRU9TRVFfQklUUyA9IDB4MywJLyogaW50ZXJydXB0IGVuZCBvZiBzZXF1ZW5jZSBtYXNrICovCisJRU5fQURDX0lOVFJfU1JDX0JJVCA9IDB4NCwJLyogZW5hYmxlIGFkYyBpbnRlcnJ1cHQgc291cmNlICovCisJRU5fQURDX0RPTkVfSU5UUl9CSVQgPSAweDgsCS8qIGVuYWJsZSBhZGMgYWNxdWlzaXRpb24gZG9uZSBpbnRyICovCiAJREFDX0lOVFJfU1JDX01BU0sgPSAweDMwLAogCURBQ19JTlRSX1FFTVBUWV9CSVRTID0gMHgwLAogCURBQ19JTlRSX0hJR0hfQ0hBTl9CSVRTID0gMHgxMCwKLQlFTl9EQUNfSU5UUl9TUkNfQklUID0gMHg0MCwJLyogIGVuYWJsZSBkYWMgaW50ZXJydXB0IHNvdXJjZSAqLworCUVOX0RBQ19JTlRSX1NSQ19CSVQgPSAweDQwLAkvKiBlbmFibGUgZGFjIGludGVycnVwdCBzb3VyY2UgKi8KIAlFTl9EQUNfRE9ORV9JTlRSX0JJVCA9IDB4ODAsCi0JRU5fQURDX0FDVElWRV9JTlRSX0JJVCA9IDB4MjAwLAkvKiAgZW5hYmxlIGFkYyBhY3RpdmUgaW50ZXJydXB0ICovCi0JRU5fQURDX1NUT1BfSU5UUl9CSVQgPSAweDQwMCwJLyogIGVuYWJsZSBhZGMgc3RvcCB0cmlnZ2VyIGludGVycnVwdCAqLwotCUVOX0RBQ19BQ1RJVkVfSU5UUl9CSVQgPSAweDgwMCwJLyogIGVuYWJsZSBkYWMgYWN0aXZlIGludGVycnVwdCAqLwotCUVOX0RBQ19VTkRFUlJVTl9CSVQgPSAweDQwMDAsCS8qICBlbmFibGUgZGFjIHVuZGVycnVuIHN0YXR1cyBiaXQgKi8KLQlFTl9BRENfT1ZFUlJVTl9CSVQgPSAweDgwMDAsCS8qICBlbmFibGUgYWRjIG92ZXJydW4gc3RhdHVzIGJpdCAqLworCUVOX0FEQ19BQ1RJVkVfSU5UUl9CSVQgPSAweDIwMCwJLyogZW5hYmxlIGFkYyBhY3RpdmUgaW50ZXJydXB0ICovCisJRU5fQURDX1NUT1BfSU5UUl9CSVQgPSAweDQwMCwJLyogZW5hYmxlIGFkYyBzdG9wIHRyaWdnZXIgaW50ZXJydXB0ICovCisJRU5fREFDX0FDVElWRV9JTlRSX0JJVCA9IDB4ODAwLAkvKiBlbmFibGUgZGFjIGFjdGl2ZSBpbnRlcnJ1cHQgKi8KKwlFTl9EQUNfVU5ERVJSVU5fQklUID0gMHg0MDAwLAkvKiBlbmFibGUgZGFjIHVuZGVycnVuIHN0YXR1cyBiaXQgKi8KKwlFTl9BRENfT1ZFUlJVTl9CSVQgPSAweDgwMDAsCS8qIGVuYWJsZSBhZGMgb3ZlcnJ1biBzdGF0dXMgYml0ICovCiB9OwogCiBlbnVtIGh3X2NvbmZpZ19jb250ZW50cyB7Ci0JTUFTVEVSX0NMT0NLXzQwMjBfTUFTSyA9IDB4MywJLyogIG1hc3RlciBjbG9jayBzb3VyY2UgbWFzayBmb3IgNDAyMCAqLwotCUlOVEVSTkFMX0NMT0NLXzQwMjBfQklUUyA9IDB4MSwJLyogIHVzZSA0MCBNSHogaW50ZXJuYWwgbWFzdGVyIGNsb2NrICovCi0JQk5DX0NMT0NLXzQwMjBfQklUUyA9IDB4MiwJLyogIHVzZSBCTkMgaW5wdXQgZm9yIG1hc3RlciBjbG9jayAqLwotCUVYVF9DTE9DS180MDIwX0JJVFMgPSAweDMsCS8qICB1c2UgZGlvIGlucHV0IGZvciBtYXN0ZXIgY2xvY2sgKi8KLQlFWFRfUVVFVUVfQklUID0gMHgyMDAsCQkvKiAgdXNlIGV4dGVybmFsIGNoYW5uZWwvZ2FpbiBxdWV1ZSAqLwotCS8qICB1c2UgMjI1IG5hbm9zZWMgc3Ryb2JlIHdoZW4gbG9hZGluZyBkYWMgaW5zdGVhZCBvZiA1MCBuYW5vc2VjICovCisJTUFTVEVSX0NMT0NLXzQwMjBfTUFTSyA9IDB4MywJLyogbWFzdGVyIGNsb2NrIHNvdXJjZSBtYXNrIGZvciA0MDIwICovCisJSU5URVJOQUxfQ0xPQ0tfNDAyMF9CSVRTID0gMHgxLAkvKiB1c2UgNDAgTUh6IGludGVybmFsIG1hc3RlciBjbG9jayAqLworCUJOQ19DTE9DS180MDIwX0JJVFMgPSAweDIsCS8qIHVzZSBCTkMgaW5wdXQgZm9yIG1hc3RlciBjbG9jayAqLworCUVYVF9DTE9DS180MDIwX0JJVFMgPSAweDMsCS8qIHVzZSBkaW8gaW5wdXQgZm9yIG1hc3RlciBjbG9jayAqLworCUVYVF9RVUVVRV9CSVQgPSAweDIwMCwJCS8qIHVzZSBleHRlcm5hbCBjaGFubmVsL2dhaW4gcXVldWUgKi8KKwkvKiB1c2UgMjI1IG5hbm9zZWMgc3Ryb2JlIHdoZW4gbG9hZGluZyBkYWMgaW5zdGVhZCBvZiA1MCBuYW5vc2VjICovCiAJU0xPV19EQUNfQklUID0gMHg0MDAsCi0JLyogIGJpdCB3aXRoIHVua25vd24gZnVuY3Rpb24geWV0IGdpdmVuIGFzIGRlZmF1bHQgdmFsdWUgaW4gcGNpLWRhczY0Ci0JICogIG1hbnVhbCAqLworCS8qCisJICogYml0IHdpdGggdW5rbm93biBmdW5jdGlvbiB5ZXQgZ2l2ZW4gYXMgZGVmYXVsdCB2YWx1ZSBpbiBwY2ktZGFzNjQKKwkgKiBtYW51YWwKKwkgKi8KIAlIV19DT05GSUdfRFVNTVlfQklUUyA9IDB4MjAwMCwKLQkvKiAgYml0IHNlbGVjdHMgY2hhbm5lbHMgMS8wIGZvciBhbmFsb2cgaW5wdXQvb3V0cHV0LCBvdGhlcndpc2UgMC8xICovCisJLyogYml0IHNlbGVjdHMgY2hhbm5lbHMgMS8wIGZvciBhbmFsb2cgaW5wdXQvb3V0cHV0LCBvdGhlcndpc2UgMC8xICovCiAJRE1BX0NIX1NFTEVDVF9CSVQgPSAweDgwMDAsCi0JRklGT19TSVpFX1JFRyA9IDB4NCwJCS8qICBhbGxvd3MgYWRqdXN0bWVudCBvZiBmaWZvIHNpemVzICovCi0JREFDX0ZJRk9fU0laRV9NQVNLID0gMHhmZjAwLAkvKiAgYml0cyB0aGF0IHNldCBkYWMgZmlmbyBzaXplICovCi0JREFDX0ZJRk9fQklUUyA9IDB4ZjgwMCwJCS8qICA4ayBzYW1wbGUgYW8gZmlmbyAqLworCUZJRk9fU0laRV9SRUcgPSAweDQsCQkvKiBhbGxvd3MgYWRqdXN0bWVudCBvZiBmaWZvIHNpemVzICovCisJREFDX0ZJRk9fU0laRV9NQVNLID0gMHhmZjAwLAkvKiBiaXRzIHRoYXQgc2V0IGRhYyBmaWZvIHNpemUgKi8KKwlEQUNfRklGT19CSVRTID0gMHhmODAwLAkJLyogOGsgc2FtcGxlIGFvIGZpZm8gKi8KIH07Ci0jZGVmaW5lIERBQ19GSUZPX1NJWkUgMHgyMDAwCiAKIGVudW0gZGFxX2F0cmlnX2xvd180MDIwX2NvbnRlbnRzIHsKLQkvKiAgdXNlIHRyaWcvZXh0IGNsayBibmMgaW5wdXQgZm9yIGFuYWxvZyBnYXRlIHNpZ25hbCAqLworCS8qIHVzZSB0cmlnL2V4dCBjbGsgYm5jIGlucHV0IGZvciBhbmFsb2cgZ2F0ZSBzaWduYWwgKi8KIAlFWFRfQUdBVEVfQk5DX0JJVCA9IDB4ODAwMCwKLQkvKiAgdXNlIHRyaWcvZXh0IGNsayBibmMgaW5wdXQgZm9yIGV4dGVybmFsIHN0b3AgdHJpZ2dlciBzaWduYWwgKi8KKwkvKiB1c2UgdHJpZy9leHQgY2xrIGJuYyBpbnB1dCBmb3IgZXh0ZXJuYWwgc3RvcCB0cmlnZ2VyIHNpZ25hbCAqLwogCUVYVF9TVE9QX1RSSUdfQk5DX0JJVCA9IDB4NDAwMCwKLQkvKiAgdXNlIHRyaWcvZXh0IGNsayBibmMgaW5wdXQgZm9yIGV4dGVybmFsIHN0YXJ0IHRyaWdnZXIgc2lnbmFsICovCisJLyogdXNlIHRyaWcvZXh0IGNsayBibmMgaW5wdXQgZm9yIGV4dGVybmFsIHN0YXJ0IHRyaWdnZXIgc2lnbmFsICovCiAJRVhUX1NUQVJUX1RSSUdfQk5DX0JJVCA9IDB4MjAwMCwKIH07CiAKQEAgLTI0MSwzOCArMjQ0LDM4IEBACiB9CiAKIGVudW0gYWRjX2NvbnRyb2wwX2NvbnRlbnRzIHsKLQlBRENfR0FURV9TUkNfTUFTSyA9IDB4MywJLyogIGJpdHMgdGhhdCBzZWxlY3QgZ2F0ZSAqLwotCUFEQ19TT0ZUX0dBVEVfQklUUyA9IDB4MSwJLyogIHNvZnR3YXJlIGdhdGUgKi8KLQlBRENfRVhUX0dBVEVfQklUUyA9IDB4MiwJLyogIGV4dGVybmFsIGRpZ2l0YWwgZ2F0ZSAqLwotCUFEQ19BTkFMT0dfR0FURV9CSVRTID0gMHgzLAkvKiAgYW5hbG9nIGxldmVsIGdhdGUgKi8KLQkvKiAgbGV2ZWwtc2Vuc2l0aXZlIGdhdGUgKGZvciBkaWdpdGFsKSAqLworCUFEQ19HQVRFX1NSQ19NQVNLID0gMHgzLAkvKiBiaXRzIHRoYXQgc2VsZWN0IGdhdGUgKi8KKwlBRENfU09GVF9HQVRFX0JJVFMgPSAweDEsCS8qIHNvZnR3YXJlIGdhdGUgKi8KKwlBRENfRVhUX0dBVEVfQklUUyA9IDB4MiwJLyogZXh0ZXJuYWwgZGlnaXRhbCBnYXRlICovCisJQURDX0FOQUxPR19HQVRFX0JJVFMgPSAweDMsCS8qIGFuYWxvZyBsZXZlbCBnYXRlICovCisJLyogbGV2ZWwtc2Vuc2l0aXZlIGdhdGUgKGZvciBkaWdpdGFsKSAqLwogCUFEQ19HQVRFX0xFVkVMX0JJVCA9IDB4NCwKLQlBRENfR0FURV9QT0xBUklUWV9CSVQgPSAweDgsCS8qICBnYXRlIGFjdGl2ZSBsb3cgKi8KKwlBRENfR0FURV9QT0xBUklUWV9CSVQgPSAweDgsCS8qIGdhdGUgYWN0aXZlIGxvdyAqLwogCUFEQ19TVEFSVF9UUklHX1NPRlRfQklUUyA9IDB4MTAsCiAJQURDX1NUQVJUX1RSSUdfRVhUX0JJVFMgPSAweDIwLAogCUFEQ19TVEFSVF9UUklHX0FOQUxPR19CSVRTID0gMHgzMCwKIAlBRENfU1RBUlRfVFJJR19NQVNLID0gMHgzMCwKLQlBRENfU1RBUlRfVFJJR19GQUxMSU5HX0JJVCA9IDB4NDAsCS8qICB0cmlnIDEgdXNlcyBmYWxsaW5nIGVkZ2UgKi8KLQkvKiAgZXh0ZXJuYWwgcGFjaW5nIHVzZXMgZmFsbGluZyBlZGdlICovCisJQURDX1NUQVJUX1RSSUdfRkFMTElOR19CSVQgPSAweDQwLAkvKiB0cmlnIDEgdXNlcyBmYWxsaW5nIGVkZ2UgKi8KKwkvKiBleHRlcm5hbCBwYWNpbmcgdXNlcyBmYWxsaW5nIGVkZ2UgKi8KIAlBRENfRVhUX0NPTlZfRkFMTElOR19CSVQgPSAweDgwMCwKLQkvKiAgZW5hYmxlIGhhcmR3YXJlIHNjYW4gY291bnRlciAqLworCS8qIGVuYWJsZSBoYXJkd2FyZSBzY2FuIGNvdW50ZXIgKi8KIAlBRENfU0FNUExFX0NPVU5URVJfRU5fQklUID0gMHgxMDAwLAotCUFEQ19ETUFfRElTQUJMRV9CSVQgPSAweDQwMDAsCS8qICBkaXNhYmxlcyBkbWEgKi8KLQlBRENfRU5BQkxFX0JJVCA9IDB4ODAwMCwJLyogIG1hc3RlciBhZGMgZW5hYmxlICovCisJQURDX0RNQV9ESVNBQkxFX0JJVCA9IDB4NDAwMCwJLyogZGlzYWJsZXMgZG1hICovCisJQURDX0VOQUJMRV9CSVQgPSAweDgwMDAsCS8qIG1hc3RlciBhZGMgZW5hYmxlICovCiB9OwogCiBlbnVtIGFkY19jb250cm9sMV9jb250ZW50cyB7Ci0JLyogIHNob3VsZCBiZSBzZXQgZm9yIGJvYXJkcyB3aXRoID4gMTYgY2hhbm5lbHMgKi8KKwkvKiBzaG91bGQgYmUgc2V0IGZvciBib2FyZHMgd2l0aCA+IDE2IGNoYW5uZWxzICovCiAJQURDX1FVRVVFX0NPTkZJR19CSVQgPSAweDEsCiAJQ09OVkVSVF9QT0xBUklUWV9CSVQgPSAweDEwLAogCUVPQ19QT0xBUklUWV9CSVQgPSAweDIwLAotCUFEQ19TV19HQVRFX0JJVCA9IDB4NDAsCS8qICBzb2Z0d2FyZSBnYXRlIG9mIGFkYyAqLwotCUFEQ19ESVRIRVJfQklUID0gMHgyMDAsCS8qICB0dXJuIG9uIGV4dHJhIG5vaXNlIGZvciBkaXRoZXJpbmcgKi8KKwlBRENfU1dfR0FURV9CSVQgPSAweDQwLAkJLyogc29mdHdhcmUgZ2F0ZSBvZiBhZGMgKi8KKwlBRENfRElUSEVSX0JJVCA9IDB4MjAwLAkJLyogdHVybiBvbiBleHRyYSBub2lzZSBmb3IgZGl0aGVyaW5nICovCiAJUkVUUklHR0VSX0JJVCA9IDB4ODAwLAogCUFEQ19MT19DSEFOTkVMXzQwMjBfTUFTSyA9IDB4MzAwLAogCUFEQ19ISV9DSEFOTkVMXzQwMjBfTUFTSyA9IDB4YzAwLAotCVRXT19DSEFOTkVMXzQwMjBfQklUUyA9IDB4MTAwMCwJLyogIHR3byBjaGFubmVsIG1vZGUgZm9yIDQwMjAgKi8KLQlGT1VSX0NIQU5ORUxfNDAyMF9CSVRTID0gMHgyMDAwLCAvKiAgZm91ciBjaGFubmVsIG1vZGUgZm9yIDQwMjAgKi8KKwlUV09fQ0hBTk5FTF80MDIwX0JJVFMgPSAweDEwMDAsCQkvKiB0d28gY2hhbm5lbCBtb2RlIGZvciA0MDIwICovCisJRk9VUl9DSEFOTkVMXzQwMjBfQklUUyA9IDB4MjAwMCwJLyogZm91ciBjaGFubmVsIG1vZGUgZm9yIDQwMjAgKi8KIAlDSEFOTkVMX01PREVfNDAyMF9NQVNLID0gMHgzMDAwLAogCUFEQ19NT0RFX01BU0sgPSAweGYwMDAsCiB9OwpAQCAtMjk2LDEwICsyOTksMTAgQEAKIAlTRUxFQ1RfODgwMF9CSVQgPSAweDEsCiAJU0VMRUNUXzg0MDJfNjRYWF9CSVQgPSAweDIsCiAJU0VMRUNUXzE1OTBfNjBYWF9CSVQgPSAweDIsCi0JQ0FMX0VOXzY0WFhfQklUID0gMHg0MCwJLyogIGNhbGlicmF0aW9uIGVuYWJsZSBmb3IgNjR4eCBzZXJpZXMgKi8KKwlDQUxfRU5fNjRYWF9CSVQgPSAweDQwLAkJLyogY2FsaWJyYXRpb24gZW5hYmxlIGZvciA2NHh4IHNlcmllcyAqLwogCVNFUklBTF9EQVRBX0lOX0JJVCA9IDB4ODAsCiAJU0VSSUFMX0NMT0NLX0JJVCA9IDB4MTAwLAotCUNBTF9FTl82MFhYX0JJVCA9IDB4MjAwLCAvKiAgY2FsaWJyYXRpb24gZW5hYmxlIGZvciA2MHh4IHNlcmllcyAqLworCUNBTF9FTl82MFhYX0JJVCA9IDB4MjAwLAkvKiBjYWxpYnJhdGlvbiBlbmFibGUgZm9yIDYweHggc2VyaWVzICovCiAJQ0FMX0dBSU5fQklUID0gMHg4MDAsCiB9OwogCkBAIC0zMjYsMTIgKzMyOSwxMiBAQAogfTsKIAogZW51bSBhZGNfcXVldWVfbG9hZF9jb250ZW50cyB7Ci0JVU5JUF9CSVQgPSAweDgwMCwJLyogIHVuaXBvbGFyL2JpcG9sYXIgYml0ICovCi0JQURDX1NFX0RJRkZfQklUID0gMHgxMDAwLAkvKiAgc2luZ2xlLWVuZGVkLyBkaWZmZXJlbnRpYWwgYml0ICovCi0JLyogIG5vbi1yZWZlcmVuY2VkIHNpbmdsZS1lbmRlZCAoY29tbW9uLW1vZGUgaW5wdXQpICovCisJVU5JUF9CSVQgPSAweDgwMCwJCS8qIHVuaXBvbGFyL2JpcG9sYXIgYml0ICovCisJQURDX1NFX0RJRkZfQklUID0gMHgxMDAwLAkvKiBzaW5nbGUtZW5kZWQvIGRpZmZlcmVudGlhbCBiaXQgKi8KKwkvKiBub24tcmVmZXJlbmNlZCBzaW5nbGUtZW5kZWQgKGNvbW1vbi1tb2RlIGlucHV0KSAqLwogCUFEQ19DT01NT05fQklUID0gMHgyMDAwLAotCVFVRVVFX0VPU0VRX0JJVCA9IDB4NDAwMCwJLyogIHF1ZXVlIGVuZCBvZiBzZXF1ZW5jZSAqLwotCVFVRVVFX0VPU0NBTl9CSVQgPSAweDgwMDAsCS8qICBxdWV1ZSBlbmQgb2Ygc2NhbiAqLworCVFVRVVFX0VPU0VRX0JJVCA9IDB4NDAwMCwJLyogcXVldWUgZW5kIG9mIHNlcXVlbmNlICovCisJUVVFVUVfRU9TQ0FOX0JJVCA9IDB4ODAwMCwJLyogcXVldWUgZW5kIG9mIHNjYW4gKi8KIH07CiAKIHN0YXRpYyBpbmxpbmUgdWludDE2X3QgYWRjX2NoYW5fYml0cyh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKQEAgLTM0MCw3ICszNDMsNyBAQAogfTsKIAogZW51bSBkYWNfY29udHJvbDBfY29udGVudHMgewotCURBQ19FTkFCTEVfQklUID0gMHg4MDAwLAkvKiAgZGFjIGNvbnRyb2xsZXIgZW5hYmxlIGJpdCAqLworCURBQ19FTkFCTEVfQklUID0gMHg4MDAwLAkvKiBkYWMgY29udHJvbGxlciBlbmFibGUgYml0ICovCiAJREFDX0NZQ0xJQ19TVE9QX0JJVCA9IDB4NDAwMCwKIAlEQUNfV0FWRUZPUk1fTU9ERV9CSVQgPSAweDEwMCwKIAlEQUNfRVhUX1VQREFURV9GQUxMSU5HX0JJVCA9IDB4ODAsCkBAIC0zNjAsNyArMzYzLDcgQEAKIAlEQUNfV1JJVEVfUE9MQVJJVFlfQklUID0gMHg4MDAsCS8qIGJvYXJkLWRlcGVuZGVudCBzZXR0aW5nICovCiAJREFDMV9FWFRfUkVGX0JJVCA9IDB4MjAwLAogCURBQzBfRVhUX1JFRl9CSVQgPSAweDEwMCwKLQlEQUNfT1VUUFVUX0VOQUJMRV9CSVQgPSAweDgwLAkvKiAgZGFjIG91dHB1dCBlbmFibGUgYml0ICovCisJREFDX09VVFBVVF9FTkFCTEVfQklUID0gMHg4MCwJLyogZGFjIG91dHB1dCBlbmFibGUgYml0ICovCiAJREFDX1VQREFURV9QT0xBUklUWV9CSVQgPSAweDQwLAkvKiBib2FyZC1kZXBlbmRlbnQgc2V0dGluZyAqLwogCURBQ19TV19HQVRFX0JJVCA9IDB4MjAsCiAJREFDMV9VTklQT0xBUl9CSVQgPSAweDgsCkBAIC00MDksOSArNDEyLDkgQEAKIH07CiAKIGVudW0gcmFuZ2VfY2FsX2kyY19jb250ZW50cyB7Ci0JLyogIGJpdHMgdGhhdCBzZXQgd2hhdCBzb3VyY2UgdGhlIGFkYyBjb252ZXJ0ZXIgbWVhc3VyZXMgKi8KKwkvKiBiaXRzIHRoYXQgc2V0IHdoYXQgc291cmNlIHRoZSBhZGMgY29udmVydGVyIG1lYXN1cmVzICovCiAJQURDX1NSQ180MDIwX01BU0sgPSAweDcwLAotCS8qICBtYWtlIGJuYyB0cmlnL2V4dCBjbG9jayB0aHJlc2hvbGQgMFYgaW5zdGVhZCBvZiAyLjVWICovCisJLyogbWFrZSBibmMgdHJpZy9leHQgY2xvY2sgdGhyZXNob2xkIDBWIGluc3RlYWQgb2YgMi41ViAqLwogCUJOQ19UUklHX1RIUkVTSE9MRF8wVl9CSVQgPSAweDgwLAogfTsKIApAQCAtNDIyLDcgKzQyNSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdWludDhfdCBhdHRlbnVhdGVfYml0KHVuc2lnbmVkIGludCBjaGFubmVsKQogewotCS8qICBhdHRlbnVhdGUgY2hhbm5lbCAoKy01ViBpbnB1dCByYW5nZSkgKi8KKwkvKiBhdHRlbnVhdGUgY2hhbm5lbCAoKy01ViBpbnB1dCByYW5nZSkgKi8KIAlyZXR1cm4gMSA8PCAoY2hhbm5lbCAmIDB4Myk7CiB9OwogCkBAIC02MjcsMTggKzYzMCwxOCBAQAogCiBzdHJ1Y3QgcGNpZGFzNjRfYm9hcmQgewogCWNvbnN0IGNoYXIgKm5hbWU7Ci0JaW50IGFpX3NlX2NoYW5zOwkvKiAgbnVtYmVyIG9mIGFpIGlucHV0cyBpbiBzaW5nbGUtZW5kZWQgbW9kZSAqLwotCWludCBhaV9iaXRzOwkJLyogIGFuYWxvZyBpbnB1dCByZXNvbHV0aW9uICovCi0JaW50IGFpX3NwZWVkOwkJLyogIGZhc3Rlc3QgY29udmVyc2lvbiBwZXJpb2QgaW4gbnMgKi8KKwlpbnQgYWlfc2VfY2hhbnM7CS8qIG51bWJlciBvZiBhaSBpbnB1dHMgaW4gc2luZ2xlLWVuZGVkIG1vZGUgKi8KKwlpbnQgYWlfYml0czsJCS8qIGFuYWxvZyBpbnB1dCByZXNvbHV0aW9uICovCisJaW50IGFpX3NwZWVkOwkJLyogZmFzdGVzdCBjb252ZXJzaW9uIHBlcmlvZCBpbiBucyAqLwogCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICphaV9yYW5nZV90YWJsZTsKIAljb25zdCB1aW50OF90ICphaV9yYW5nZV9jb2RlOwotCWludCBhb19uY2hhbjsJCS8qICBudW1iZXIgb2YgYW5hbG9nIG91dCBjaGFubmVscyAqLwotCWludCBhb19iaXRzOwkJLyogIGFuYWxvZyBvdXRwdXQgcmVzb2x1dGlvbiAqLwotCWludCBhb19zY2FuX3NwZWVkOwkvKiAgYW5hbG9nIG91dHB1dCBzY2FuIHNwZWVkICovCisJaW50IGFvX25jaGFuOwkJLyogbnVtYmVyIG9mIGFuYWxvZyBvdXQgY2hhbm5lbHMgKi8KKwlpbnQgYW9fYml0czsJCS8qIGFuYWxvZyBvdXRwdXQgcmVzb2x1dGlvbiAqLworCWludCBhb19zY2FuX3NwZWVkOwkvKiBhbmFsb2cgb3V0cHV0IHNjYW4gc3BlZWQgKi8KIAljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqYW9fcmFuZ2VfdGFibGU7CiAJY29uc3QgaW50ICphb19yYW5nZV9jb2RlOwogCWNvbnN0IHN0cnVjdCBod19maWZvX2luZm8gKmNvbnN0IGFpX2ZpZm87Ci0JLyogIGRpZmZlcmVudCBib2FyZCBmYW1pbGllcyBoYXZlIHNsaWdodGx5IGRpZmZlcmVudCByZWdpc3RlcnMgKi8KKwkvKiBkaWZmZXJlbnQgYm9hcmQgZmFtaWxpZXMgaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnQgcmVnaXN0ZXJzICovCiAJZW51bSByZWdpc3Rlcl9sYXlvdXQgbGF5b3V0OwogCXVuc2lnbmVkIGhhc184MjU1OjE7CiB9OwpAQCAtNjk5LDcgKzcwMiw3IEBACiAJCS5oYXNfODI1NQk9IDEsCiAJfSwKIAlbQk9BUkRfUENJREFTNjQwMl8xMl0gPSB7Ci0JCS5uYW1lCQk9ICJwY2ktZGFzNjQwMi8xMiIsCS8qICBYWFggY2hlY2sgKi8KKwkJLm5hbWUJCT0gInBjaS1kYXM2NDAyLzEyIiwJLyogWFhYIGNoZWNrICovCiAJCS5haV9zZV9jaGFucwk9IDY0LAogCQkuYWlfYml0cwk9IDEyLAogCQkuYWlfc3BlZWQJPSA1MDAwLApAQCAtOTk2LDcgKzk5OSw3IEBACiAJCS5haV9zcGVlZAk9IDUwLAogCQkuYW9fYml0cwk9IDEyLAogCQkuYW9fbmNoYW4JPSAyLAotCQkuYW9fc2Nhbl9zcGVlZAk9IDAsCS8qICBubyBoYXJkd2FyZSBwYWNpbmcgb24gYW8gKi8KKwkJLmFvX3NjYW5fc3BlZWQJPSAwLAkvKiBubyBoYXJkd2FyZSBwYWNpbmcgb24gYW8gKi8KIAkJLmxheW91dAkJPSBMQVlPVVRfNDAyMCwKIAkJLmFpX3JhbmdlX3RhYmxlCT0gJmFpX3Jhbmdlc180MDIwLAogCQkuYW9fcmFuZ2VfdGFibGUJPSAmYW9fcmFuZ2VzXzQwMjAsCkBAIC0xMDA1LDkgKzEwMDgsNyBAQAogCQkuaGFzXzgyNTUJPSAxLAogCX0sCiAjaWYgMAotCS8qCi0JICogVGhlIGRldmljZSBpZCBmb3IgdGhlc2UgYm9hcmRzIGlzIHVua25vd24KLQkgKi8KKwkvKiBUaGUgZGV2aWNlIGlkIGZvciB0aGVzZSBib2FyZHMgaXMgdW5rbm93biAqLwogCiAJW0JPQVJEX1BDSURBUzY0MDJfMTZfSlJdID0gewogCQkubmFtZQkJPSAicGNpLWRhczY0MDIvMTYvanIiLApAQCAtMTExNiw2MiArMTExNyw2NiBAQAogfQogCiBzdHJ1Y3QgZXh0X2Nsb2NrX2luZm8gewotCS8qICBtYXN0ZXIgY2xvY2sgZGl2aXNvciB0byB1c2UgZm9yIHNjYW5zIHdpdGggZXh0ZXJuYWwgbWFzdGVyIGNsb2NrICovCisJLyogbWFzdGVyIGNsb2NrIGRpdmlzb3IgdG8gdXNlIGZvciBzY2FucyB3aXRoIGV4dGVybmFsIG1hc3RlciBjbG9jayAqLwogCXVuc2lnbmVkIGludCBkaXZpc29yOwotCS8qICBjaGFuc3BlYyBmb3IgbWFzdGVyIGNsb2NrIGlucHV0IHdoZW4gdXNlZCBhcyBzY2FuIGJlZ2luIHNyYyAqLworCS8qIGNoYW5zcGVjIGZvciBtYXN0ZXIgY2xvY2sgaW5wdXQgd2hlbiB1c2VkIGFzIHNjYW4gYmVnaW4gc3JjICovCiAJdW5zaWduZWQgaW50IGNoYW5zcGVjOwogfTsKIAogLyogdGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIGRhdGEgdW5pcXVlIHRvIHRoaXMgaGFyZHdhcmUgZHJpdmVyLiAqLwogc3RydWN0IHBjaWRhczY0X3ByaXZhdGUgewotCS8qICBiYXNlIGFkZHJlc3NlcyAocGh5c2ljYWwpICovCisJLyogYmFzZSBhZGRyZXNzZXMgKHBoeXNpY2FsKSAqLwogCXJlc291cmNlX3NpemVfdCBtYWluX3BoeXNfaW9iYXNlOwogCXJlc291cmNlX3NpemVfdCBkaW9fY291bnRlcl9waHlzX2lvYmFzZTsKLQkvKiAgYmFzZSBhZGRyZXNzZXMgKGlvcmVtYXBwZWQpICovCisJLyogYmFzZSBhZGRyZXNzZXMgKGlvcmVtYXBwZWQpICovCiAJdm9pZCBfX2lvbWVtICpwbHg5MDgwX2lvYmFzZTsKIAl2b2lkIF9faW9tZW0gKm1haW5faW9iYXNlOwotCS8qICBsb2NhbCBhZGRyZXNzICh1c2VkIGJ5IGRtYSBjb250cm9sbGVyKSAqLworCS8qIGxvY2FsIGFkZHJlc3MgKHVzZWQgYnkgZG1hIGNvbnRyb2xsZXIpICovCiAJdWludDMyX3QgbG9jYWwwX2lvYmFzZTsKIAl1aW50MzJfdCBsb2NhbDFfaW9iYXNlOwotCS8qICBkbWEgYnVmZmVycyBmb3IgYW5hbG9nIGlucHV0ICovCisJLyogZG1hIGJ1ZmZlcnMgZm9yIGFuYWxvZyBpbnB1dCAqLwogCXVpbnQxNl90ICphaV9idWZmZXJbTUFYX0FJX0RNQV9SSU5HX0NPVU5UXTsKLQkvKiAgcGh5c2ljYWwgYWRkcmVzc2VzIG9mIGFpIGRtYSBidWZmZXJzICovCisJLyogcGh5c2ljYWwgYWRkcmVzc2VzIG9mIGFpIGRtYSBidWZmZXJzICovCiAJZG1hX2FkZHJfdCBhaV9idWZmZXJfYnVzX2FkZHJbTUFYX0FJX0RNQV9SSU5HX0NPVU5UXTsKLQkvKiAgYXJyYXkgb2YgYWkgZG1hIGRlc2NyaXB0b3JzIHJlYWQgYnkgcGx4OTA4MCwKLQkgKiAgYWxsb2NhdGVkIHRvIGdldCBwcm9wZXIgYWxpZ25tZW50ICovCisJLyoKKwkgKiBhcnJheSBvZiBhaSBkbWEgZGVzY3JpcHRvcnMgcmVhZCBieSBwbHg5MDgwLAorCSAqIGFsbG9jYXRlZCB0byBnZXQgcHJvcGVyIGFsaWdubWVudAorCSAqLwogCXN0cnVjdCBwbHhfZG1hX2Rlc2MgKmFpX2RtYV9kZXNjOwotCS8qICBwaHlzaWNhbCBhZGRyZXNzIG9mIGFpIGRtYSBkZXNjcmlwdG9yIGFycmF5ICovCisJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBhaSBkbWEgZGVzY3JpcHRvciBhcnJheSAqLwogCWRtYV9hZGRyX3QgYWlfZG1hX2Rlc2NfYnVzX2FkZHI7Ci0JLyogIGluZGV4IG9mIHRoZSBhaSBkbWEgZGVzY3JpcHRvci9idWZmZXIKLQkgKiAgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZCAqLworCS8qCisJICogaW5kZXggb2YgdGhlIGFpIGRtYSBkZXNjcmlwdG9yL2J1ZmZlcgorCSAqIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQKKwkgKi8KIAl1bnNpZ25lZCBpbnQgYWlfZG1hX2luZGV4OwotCS8qICBkbWEgYnVmZmVycyBmb3IgYW5hbG9nIG91dHB1dCAqLworCS8qIGRtYSBidWZmZXJzIGZvciBhbmFsb2cgb3V0cHV0ICovCiAJdWludDE2X3QgKmFvX2J1ZmZlcltBT19ETUFfUklOR19DT1VOVF07Ci0JLyogIHBoeXNpY2FsIGFkZHJlc3NlcyBvZiBhbyBkbWEgYnVmZmVycyAqLworCS8qIHBoeXNpY2FsIGFkZHJlc3NlcyBvZiBhbyBkbWEgYnVmZmVycyAqLwogCWRtYV9hZGRyX3QgYW9fYnVmZmVyX2J1c19hZGRyW0FPX0RNQV9SSU5HX0NPVU5UXTsKIAlzdHJ1Y3QgcGx4X2RtYV9kZXNjICphb19kbWFfZGVzYzsKIAlkbWFfYWRkcl90IGFvX2RtYV9kZXNjX2J1c19hZGRyOwotCS8qICBrZWVwcyB0cmFjayBvZiBidWZmZXIgd2hlcmUgdGhlIG5leHQgYW8gc2FtcGxlIHNob3VsZCBnbyAqLworCS8qIGtlZXBzIHRyYWNrIG9mIGJ1ZmZlciB3aGVyZSB0aGUgbmV4dCBhbyBzYW1wbGUgc2hvdWxkIGdvICovCiAJdW5zaWduZWQgaW50IGFvX2RtYV9pbmRleDsKLQl1bnNpZ25lZCBpbnQgaHdfcmV2aXNpb247CS8qICBzdGMgY2hpcCBoYXJkd2FyZSByZXZpc2lvbiBudW1iZXIgKi8KLQkvKiAgbGFzdCBiaXRzIHNlbnQgdG8gSU5UUl9FTkFCTEVfUkVHIHJlZ2lzdGVyICovCisJdW5zaWduZWQgaW50IGh3X3JldmlzaW9uOwkvKiBzdGMgY2hpcCBoYXJkd2FyZSByZXZpc2lvbiBudW1iZXIgKi8KKwkvKiBsYXN0IGJpdHMgc2VudCB0byBJTlRSX0VOQUJMRV9SRUcgcmVnaXN0ZXIgKi8KIAl1bnNpZ25lZCBpbnQgaW50cl9lbmFibGVfYml0czsKLQkvKiAgbGFzdCBiaXRzIHNlbnQgdG8gQURDX0NPTlRST0wxX1JFRyByZWdpc3RlciAqLworCS8qIGxhc3QgYml0cyBzZW50IHRvIEFEQ19DT05UUk9MMV9SRUcgcmVnaXN0ZXIgKi8KIAl1aW50MTZfdCBhZGNfY29udHJvbDFfYml0czsKLQkvKiAgbGFzdCBiaXRzIHNlbnQgdG8gRklGT19TSVpFX1JFRyByZWdpc3RlciAqLworCS8qIGxhc3QgYml0cyBzZW50IHRvIEZJRk9fU0laRV9SRUcgcmVnaXN0ZXIgKi8KIAl1aW50MTZfdCBmaWZvX3NpemVfYml0czsKLQkvKiAgbGFzdCBiaXRzIHNlbnQgdG8gSFdfQ09ORklHX1JFRyByZWdpc3RlciAqLworCS8qIGxhc3QgYml0cyBzZW50IHRvIEhXX0NPTkZJR19SRUcgcmVnaXN0ZXIgKi8KIAl1aW50MTZfdCBod19jb25maWdfYml0czsKIAl1aW50MTZfdCBkYWNfY29udHJvbDFfYml0czsKLQkvKiAgbGFzdCBiaXRzIHdyaXR0ZW4gdG8gcGx4OTA4MCBjb250cm9sIHJlZ2lzdGVyICovCisJLyogbGFzdCBiaXRzIHdyaXR0ZW4gdG8gcGx4OTA4MCBjb250cm9sIHJlZ2lzdGVyICovCiAJdWludDMyX3QgcGx4X2NvbnRyb2xfYml0czsKLQkvKiAgbGFzdCBiaXRzIHdyaXR0ZW4gdG8gcGx4IGludGVycnVwdCBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KKwkvKiBsYXN0IGJpdHMgd3JpdHRlbiB0byBwbHggaW50ZXJydXB0IGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlciAqLwogCXVpbnQzMl90IHBseF9pbnRjc3JfYml0czsKLQkvKiAgaW5kZXggb2YgY2FsaWJyYXRpb24gc291cmNlIHJlYWRhYmxlIHRocm91Z2ggYWkgY2gwICovCisJLyogaW5kZXggb2YgY2FsaWJyYXRpb24gc291cmNlIHJlYWRhYmxlIHRocm91Z2ggYWkgY2gwICovCiAJaW50IGNhbGlicmF0aW9uX3NvdXJjZTsKLQkvKiAgYml0cyB3cml0dGVuIHRvIGkyYyBjYWxpYnJhdGlvbi9yYW5nZSByZWdpc3RlciAqLworCS8qIGJpdHMgd3JpdHRlbiB0byBpMmMgY2FsaWJyYXRpb24vcmFuZ2UgcmVnaXN0ZXIgKi8KIAl1aW50OF90IGkyY19jYWxfcmFuZ2VfYml0czsKLQkvKiAgY29uZmlndXJlIGRpZ2l0YWwgdHJpZ2dlcnMgdG8gdHJpZ2dlciBvbiBmYWxsaW5nIGVkZ2UgKi8KKwkvKiBjb25maWd1cmUgZGlnaXRhbCB0cmlnZ2VycyB0byB0cmlnZ2VyIG9uIGZhbGxpbmcgZWRnZSAqLwogCXVuc2lnbmVkIGludCBleHRfdHJpZ19mYWxsaW5nOwogCXNob3J0IGFpX2NtZF9ydW5uaW5nOwogCXVuc2lnbmVkIGludCBhaV9maWZvX3NlZ21lbnRfbGVuZ3RoOwpAQCAtMTIyNCw3ICsxMjI5LDcgQEAKIAlzdHJ1Y3QgcGNpZGFzNjRfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogIHNwaW5sb2NrIGZvciBwbHggZG1hIGNvbnRyb2wvc3RhdHVzIHJlZyAqLworCS8qIHNwaW5sb2NrIGZvciBwbHggZG1hIGNvbnRyb2wvc3RhdHVzIHJlZyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CiAKIAlwbHg5MDgwX2Fib3J0X2RtYShkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSwgY2hhbm5lbCk7CkBAIC0xMjcxLDcgKzEyNzYsNyBAQAogCSAqIGlmIENNREZfV0FLRV9FT1MgZmxhZyBpcyBzZXQuCiAJICovCiAJaWYgKGNtZC0+ZmxhZ3MgJiBDTURGX1dBS0VfRU9TKSB7Ci0JCS8qICA0MDIwIGRvZXNuJ3Qgc3VwcG9ydCBwaW8gdHJhbnNmZXJzIGV4Y2VwdCBmb3IgZmlmbyBkcmVncyAqLworCQkvKiA0MDIwIGRvZXNuJ3Qgc3VwcG9ydCBwaW8gdHJhbnNmZXJzIGV4Y2VwdCBmb3IgZmlmbyBkcmVncyAqLwogCQlpZiAoYm9hcmQtPmxheW91dCAhPSBMQVlPVVRfNDAyMCkKIAkJCWJpdHMgfD0gQURDX0lOVFJfRU9TQ0FOX0JJVFMgfCBFTl9BRENfSU5UUl9TUkNfQklUOwogCX0KQEAgLTEzMDUsMzYgKzEzMTAsNDAgQEAKIAlhYm9ydF9kbWEoZGV2LCAwKTsKIAlhYm9ydF9kbWEoZGV2LCAxKTsKIAotCS8qICBjb25maWd1cmUgZG1hMCBtb2RlICovCisJLyogY29uZmlndXJlIGRtYTAgbW9kZSAqLwogCWJpdHMgPSAwOwotCS8qICBlbmFibGUgcmVhZHkgaW5wdXQsIG5vdCBzdXJlIGlmIHRoaXMgaXMgbmVjZXNzYXJ5ICovCisJLyogZW5hYmxlIHJlYWR5IGlucHV0LCBub3Qgc3VyZSBpZiB0aGlzIGlzIG5lY2Vzc2FyeSAqLwogCWJpdHMgfD0gUExYX0RNQU1PREVfUkVBRFlJRU47Ci0JLyogIGVuYWJsZSBidGVybSwgbm90IHN1cmUgaWYgdGhpcyBpcyBuZWNlc3NhcnkgKi8KKwkvKiBlbmFibGUgYnRlcm0sIG5vdCBzdXJlIGlmIHRoaXMgaXMgbmVjZXNzYXJ5ICovCiAJYml0cyB8PSBQTFhfRE1BTU9ERV9CVEVSTUlFTjsKLQkvKiAgZW5hYmxlIGRtYSBjaGFpbmluZyAqLworCS8qIGVuYWJsZSBkbWEgY2hhaW5pbmcgKi8KIAliaXRzIHw9IFBMWF9ETUFNT0RFX0NIQUlORU47Ci0JLyogIGVuYWJsZSBpbnRlcnJ1cHQgb24gZG1hIGRvbmUKLQkgKiAgKHByb2JhYmx5IGRvbid0IG5lZWQgdGhpcywgc2luY2UgY2hhaW4gbmV2ZXIgZmluaXNoZXMpICovCisJLyoKKwkgKiBlbmFibGUgaW50ZXJydXB0IG9uIGRtYSBkb25lCisJICogKHByb2JhYmx5IGRvbid0IG5lZWQgdGhpcywgc2luY2UgY2hhaW4gbmV2ZXIgZmluaXNoZXMpCisJICovCiAJYml0cyB8PSBQTFhfRE1BTU9ERV9ET05FSUVOOwotCS8qICBkb24ndCBpbmNyZW1lbnQgbG9jYWwgYWRkcmVzcyBkdXJpbmcgdHJhbnNmZXJzCi0JICogICh3ZSBhcmUgdHJhbnNmZXJyaW5nIGZyb20gYSBmaXhlZCBmaWZvIHJlZ2lzdGVyKSAqLworCS8qCisJICogZG9uJ3QgaW5jcmVtZW50IGxvY2FsIGFkZHJlc3MgZHVyaW5nIHRyYW5zZmVycworCSAqICh3ZSBhcmUgdHJhbnNmZXJyaW5nIGZyb20gYSBmaXhlZCBmaWZvIHJlZ2lzdGVyKQorCSAqLwogCWJpdHMgfD0gUExYX0RNQU1PREVfTEFDT05TVDsKLQkvKiAgcm91dGUgZG1hIGludGVycnVwdCB0byBwY2kgYnVzICovCisJLyogcm91dGUgZG1hIGludGVycnVwdCB0byBwY2kgYnVzICovCiAJYml0cyB8PSBQTFhfRE1BTU9ERV9JTlRSUENJOwotCS8qICBlbmFibGUgZGVtYW5kIG1vZGUgKi8KKwkvKiBlbmFibGUgZGVtYW5kIG1vZGUgKi8KIAliaXRzIHw9IFBMWF9ETUFNT0RFX0RFTUFORDsKLQkvKiAgZW5hYmxlIGxvY2FsIGJ1cnN0IG1vZGUgKi8KKwkvKiBlbmFibGUgbG9jYWwgYnVyc3QgbW9kZSAqLwogCWJpdHMgfD0gUExYX0RNQU1PREVfQlVSU1RFTjsKLQkvKiAgNDAyMCB1c2VzIDMyIGJpdCBkbWEgKi8KKwkvKiA0MDIwIHVzZXMgMzIgYml0IGRtYSAqLwogCWlmIChib2FyZC0+bGF5b3V0ID09IExBWU9VVF80MDIwKQotCQliaXRzIHw9IFBMWF9ETUFNT0RFX1dJRFRIMzI7Ci0JZWxzZQkJLyogIGxvY2Fsc3BhY2UwIGJ1cyBpcyAxNiBiaXRzIHdpZGUgKi8KLQkJYml0cyB8PSBQTFhfRE1BTU9ERV9XSURUSDE2OworCQliaXRzIHw9IFBMWF9ETUFNT0RFX1dJRFRIXzMyOworCWVsc2UJCQkJLyogbG9jYWxzcGFjZTAgYnVzIGlzIDE2IGJpdHMgd2lkZSAqLworCQliaXRzIHw9IFBMWF9ETUFNT0RFX1dJRFRIXzE2OwogCXdyaXRlbChiaXRzLCBwbHhfaW9iYXNlICsgUExYX1JFR19ETUFNT0RFMSk7CiAJaWYgKGFvX2NtZF9pc19zdXBwb3J0ZWQoYm9hcmQpKQogCQl3cml0ZWwoYml0cywgcGx4X2lvYmFzZSArIFBMWF9SRUdfRE1BTU9ERTApOwogCi0JLyogIGVuYWJsZSBpbnRlcnJ1cHRzIG9uIHBseCA5MDgwICovCisJLyogZW5hYmxlIGludGVycnVwdHMgb24gcGx4IDkwODAgKi8KIAlkZXZwcml2LT5wbHhfaW50Y3NyX2JpdHMgfD0KIAkgICAgUExYX0lOVENTUl9MU0VBQk9SVEVOIHwgUExYX0lOVENTUl9MU0VQQVJJVFlFTiB8IFBMWF9JTlRDU1JfUElFTiB8CiAJICAgIFBMWF9JTlRDU1JfUExJRU4gfCBQTFhfSU5UQ1NSX1BBQk9SVElFTiB8IFBMWF9JTlRDU1JfTElPRU4gfApAQCAtMTM3Niw3ICsxMzg1LDcgQEAKIAlpZiAobnVtX2VudHJpZXMgPiBmaWZvLT5tYXhfc2VnbWVudF9sZW5ndGgpCiAJCW51bV9lbnRyaWVzID0gZmlmby0+bWF4X3NlZ21lbnRfbGVuZ3RoOwogCi0JLyogIDEgPT0gMjU2IGVudHJpZXMsIDIgPT0gNTEyIGVudHJpZXMsIGV0YyAqLworCS8qIDEgPT0gMjU2IGVudHJpZXMsIDIgPT0gNTEyIGVudHJpZXMsIGV0YyAqLwogCW51bV9pbmNyZW1lbnRzID0gRElWX1JPVU5EX0NMT1NFU1QobnVtX2VudHJpZXMsIGluY3JlbWVudF9zaXplKTsKIAogCWJpdHMgPSAofihudW1faW5jcmVtZW50cyAtIDEpKSAmIGZpZm8tPmZpZm9fc2l6ZV9yZWdfbWFzazsKQEAgLTE0NDIsNyArMTQ1MSw3IEBACiAJd3JpdGV3KGRldnByaXYtPmFkY19jb250cm9sMV9iaXRzLAogCSAgICAgICBkZXZwcml2LT5tYWluX2lvYmFzZSArIEFEQ19DT05UUk9MMV9SRUcpOwogCi0JLyogIDY0MDIvMTYgbWFudWFsIHNheXMgdGhpcyByZWdpc3RlciBtdXN0IGJlIGluaXRpYWxpemVkIHRvIDB4ZmY/ICovCisJLyogNjQwMi8xNiBtYW51YWwgc2F5cyB0aGlzIHJlZ2lzdGVyIG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gMHhmZj8gKi8KIAl3cml0ZXcoMHhmZiwgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBBRENfU0FNUExFX0lOVEVSVkFMX1VQUEVSX1JFRyk7CiAKIAliaXRzID0gU0xPV19EQUNfQklUIHwgRE1BX0NIX1NFTEVDVF9CSVQ7CkBAIC0xNDU3LDcgKzE0NjYsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwogCi0JLyogIHNldCBmaWZvcyB0byBtYXhpbXVtIHNpemUgKi8KKwkvKiBzZXQgZmlmb3MgdG8gbWF4aW11bSBzaXplICovCiAJZGV2cHJpdi0+Zmlmb19zaXplX2JpdHMgfD0gREFDX0ZJRk9fQklUUzsKIAlzZXRfYWlfZmlmb19zZWdtZW50X2xlbmd0aChkZXYsIGJvYXJkLT5haV9maWZvLT5tYXhfc2VnbWVudF9sZW5ndGgpOwogCkBAIC0xNDc4LDcgKzE0ODcsNyBAQAogCXN0cnVjdCBwY2lkYXM2NF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBpOwogCi0JLyogIGFsbG9jYXRlIHBjaSBkbWEgYnVmZmVycyAqLworCS8qIGFsbG9jYXRlIHBjaSBkbWEgYnVmZmVycyAqLwogCWZvciAoaSA9IDA7IGkgPCBhaV9kbWFfcmluZ19jb3VudChib2FyZCk7IGkrKykgewogCQlkZXZwcml2LT5haV9idWZmZXJbaV0gPQogCQkJZG1hX2FsbG9jX2NvaGVyZW50KCZwY2lkZXYtPmRldiwgRE1BX0JVRkZFUl9TSVpFLApAQCAtMTQ5OSw3ICsxNTA4LDcgQEAKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KLQkvKiAgYWxsb2NhdGUgZG1hIGRlc2NyaXB0b3JzICovCisJLyogYWxsb2NhdGUgZG1hIGRlc2NyaXB0b3JzICovCiAJZGV2cHJpdi0+YWlfZG1hX2Rlc2MgPQogCQlkbWFfYWxsb2NfY29oZXJlbnQoJnBjaWRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHBseF9kbWFfZGVzYykgKgogCQkJCSAgIGFpX2RtYV9yaW5nX2NvdW50KGJvYXJkKSwKQEAgLTE1MTcsNyArMTUyNiw3IEBACiAJCWlmICghZGV2cHJpdi0+YW9fZG1hX2Rlc2MpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JLyogIGluaXRpYWxpemUgZG1hIGRlc2NyaXB0b3JzICovCisJLyogaW5pdGlhbGl6ZSBkbWEgZGVzY3JpcHRvcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgYWlfZG1hX3JpbmdfY291bnQoYm9hcmQpOyBpKyspIHsKIAkJZGV2cHJpdi0+YWlfZG1hX2Rlc2NbaV0ucGNpX3N0YXJ0X2FkZHIgPQogCQkJY3B1X3RvX2xlMzIoZGV2cHJpdi0+YWlfYnVmZmVyX2J1c19hZGRyW2ldKTsKQEAgLTE2MTgsMTMgKzE2MjcsMTEgQEAKIAl2b2lkIF9faW9tZW0gKnBseF9jb250cm9sX2FkZHIgPSBkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArCiAJCQkJCSBQTFhfUkVHX0NOVFJMOwogCi0JaWYgKHN0YXRlKSB7Ci0JCS8qICBzZXQgZGF0YSBsaW5lIGhpZ2ggKi8KKwlpZiAoc3RhdGUpIHsJCQkJLyogc2V0IGRhdGEgbGluZSBoaWdoICovCiAJCWRldnByaXYtPnBseF9jb250cm9sX2JpdHMgJj0gfmRhdGFfYml0OwogCQl3cml0ZWwoZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cywgcGx4X2NvbnRyb2xfYWRkcik7CiAJCXVkZWxheShpMmNfaGlnaF91ZGVsYXkpOwotCX0gZWxzZSB7CQkvKiAgc2V0IGRhdGEgbGluZSBsb3cgKi8KLQorCX0gZWxzZSB7CQkJCS8qIHNldCBkYXRhIGxpbmUgbG93ICovCiAJCWRldnByaXYtPnBseF9jb250cm9sX2JpdHMgfD0gZGF0YV9iaXQ7CiAJCXdyaXRlbChkZXZwcml2LT5wbHhfY29udHJvbF9iaXRzLCBwbHhfY29udHJvbF9hZGRyKTsKIAkJdWRlbGF5KGkyY19sb3dfdWRlbGF5KTsKQEAgLTE2MzksMTMgKzE2NDYsMTEgQEAKIAl2b2lkIF9faW9tZW0gKnBseF9jb250cm9sX2FkZHIgPSBkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArCiAJCQkJCSBQTFhfUkVHX0NOVFJMOwogCi0JaWYgKHN0YXRlKSB7Ci0JCS8qICBzZXQgY2xvY2sgbGluZSBoaWdoICovCisJaWYgKHN0YXRlKSB7CQkJCS8qIHNldCBjbG9jayBsaW5lIGhpZ2ggKi8KIAkJZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cyAmPSB+Y2xvY2tfYml0OwogCQl3cml0ZWwoZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cywgcGx4X2NvbnRyb2xfYWRkcik7CiAJCXVkZWxheShpMmNfaGlnaF91ZGVsYXkpOwotCX0gZWxzZSB7CQkvKiAgc2V0IGNsb2NrIGxpbmUgbG93ICovCi0KKwl9IGVsc2UgewkJCQkvKiBzZXQgY2xvY2sgbGluZSBsb3cgKi8KIAkJZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cyB8PSBjbG9ja19iaXQ7CiAJCXdyaXRlbChkZXZwcml2LT5wbHhfY29udHJvbF9iaXRzLCBwbHhfY29udHJvbF9hZGRyKTsKIAkJdWRlbGF5KGkyY19sb3dfdWRlbGF5KTsKQEAgLTE2NzQsNyArMTY3OSw3IEBACiAJaTJjX3NldF9zZGEoZGV2LCAxKTsKIAlpMmNfc2V0X3NjbChkZXYsIDEpOwogCi0JcmV0dXJuIDA7CQkvKiAgcmV0dXJuIGZha2UgYWNrbm93bGVkZ2UgYml0ICovCisJcmV0dXJuIDA7CQkvKiByZXR1cm4gZmFrZSBhY2tub3dsZWRnZSBiaXQgKi8KIH0KIAogLyogc2VuZCBzdGFydCBiaXQgKi8KQEAgLTE3MDcsMjMgKzE3MTIsMjMgQEAKIAkgKiBlZXByb20gYW5kIGkyYyBidXMKIAkgKi8KIAotCS8qICBtYWtlIHN1cmUgd2UgZG9udCBzZW5kIGFueXRoaW5nIHRvIGVlcHJvbSAqLworCS8qIG1ha2Ugc3VyZSB3ZSBkb250IHNlbmQgYW55dGhpbmcgdG8gZWVwcm9tICovCiAJZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cyAmPSB+UExYX0NOVFJMX0VFQ1M7CiAKIAlpMmNfc3RvcChkZXYpOwogCWkyY19zdGFydChkZXYpOwogCi0JLyogIHNlbmQgYWRkcmVzcyBhbmQgd3JpdGUgYml0ICovCisJLyogc2VuZCBhZGRyZXNzIGFuZCB3cml0ZSBiaXQgKi8KIAliaXRzdHJlYW0gPSAoYWRkcmVzcyA8PCAxKSAmIH5yZWFkX2JpdDsKIAlpMmNfd3JpdGVfYnl0ZShkZXYsIGJpdHN0cmVhbSk7CiAKLQkvKiAgZ2V0IGFja25vd2xlZGdlICovCisJLyogZ2V0IGFja25vd2xlZGdlICovCiAJaWYgKGkyY19yZWFkX2FjayhkZXYpICE9IDApIHsKIAkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgImZhaWxlZDogbm8gYWNrbm93bGVkZ2VcbiIpOwogCQlpMmNfc3RvcChkZXYpOwogCQlyZXR1cm47CiAJfQotCS8qICB3cml0ZSBkYXRhIGJ5dGVzICovCisJLyogd3JpdGUgZGF0YSBieXRlcyAqLwogCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQlpMmNfd3JpdGVfYnl0ZShkZXYsIGRhdGFbaV0pOwogCQlpZiAoaTJjX3JlYWRfYWNrKGRldikgIT0gMCkgewpAQCAtMTc3MCw4ICsxNzc1LDggQEAKIAlyYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKIAlhcmVmID0gQ1JfQVJFRihpbnNuLT5jaGFuc3BlYyk7CiAKLQkvKiAgZGlzYWJsZSBjYXJkJ3MgYW5hbG9nIGlucHV0IGludGVycnVwdCBzb3VyY2VzIGFuZCBwYWNpbmcgKi8KLQkvKiAgNDAyMCBnZW5lcmF0ZXMgZGFjIGRvbmUgaW50ZXJydXB0cyBldmVuIHRob3VnaCB0aGV5IGFyZSBkaXNhYmxlZCAqLworCS8qIGRpc2FibGUgY2FyZCdzIGFuYWxvZyBpbnB1dCBpbnRlcnJ1cHQgc291cmNlcyBhbmQgcGFjaW5nICovCisJLyogNDAyMCBnZW5lcmF0ZXMgZGFjIGRvbmUgaW50ZXJydXB0cyBldmVuIHRob3VnaCB0aGV5IGFyZSBkaXNhYmxlZCAqLwogCWRpc2FibGVfYWlfcGFjaW5nKGRldik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwpAQCAtMTc4NCwxMiArMTc4OSwxMiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKIAogCWlmIChib2FyZC0+bGF5b3V0ICE9IExBWU9VVF80MDIwKSB7Ci0JCS8qICB1c2UgaW50ZXJuYWwgcXVldWUgKi8KKwkJLyogdXNlIGludGVybmFsIHF1ZXVlICovCiAJCWRldnByaXYtPmh3X2NvbmZpZ19iaXRzICY9IH5FWFRfUVVFVUVfQklUOwogCQl3cml0ZXcoZGV2cHJpdi0+aHdfY29uZmlnX2JpdHMsCiAJCSAgICAgICBkZXZwcml2LT5tYWluX2lvYmFzZSArIEhXX0NPTkZJR19SRUcpOwogCi0JCS8qICBBTFRfU09VUkNFIGlzIGludGVybmFsIGNhbGlicmF0aW9uIHJlZmVyZW5jZSAqLworCQkvKiBBTFRfU09VUkNFIGlzIGludGVybmFsIGNhbGlicmF0aW9uIHJlZmVyZW5jZSAqLwogCQlpZiAoaW5zbi0+Y2hhbnNwZWMgJiBDUl9BTFRfU09VUkNFKSB7CiAJCQl1bnNpZ25lZCBpbnQgY2FsX2VuX2JpdDsKIApAQCAtMTgxMSwxOSArMTgxNiwxOSBAQAogCQkJICovCiAJCQl3cml0ZXcoMCwgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBDQUxJQlJBVElPTl9SRUcpOwogCQl9Ci0JCS8qICBsb2FkIGludGVybmFsIHF1ZXVlICovCisJCS8qIGxvYWQgaW50ZXJuYWwgcXVldWUgKi8KIAkJYml0cyA9IDA7Ci0JCS8qICBzZXQgZ2FpbiAqLworCQkvKiBzZXQgZ2FpbiAqLwogCQliaXRzIHw9IGFpX3JhbmdlX2JpdHNfNnh4eChkZXYsIENSX1JBTkdFKGluc24tPmNoYW5zcGVjKSk7Ci0JCS8qICBzZXQgc2luZ2xlLWVuZGVkIC8gZGlmZmVyZW50aWFsICovCisJCS8qIHNldCBzaW5nbGUtZW5kZWQgLyBkaWZmZXJlbnRpYWwgKi8KIAkJYml0cyB8PSBzZV9kaWZmX2JpdF82eHh4KGRldiwgYXJlZiA9PSBBUkVGX0RJRkYpOwogCQlpZiAoYXJlZiA9PSBBUkVGX0NPTU1PTikKIAkJCWJpdHMgfD0gQURDX0NPTU1PTl9CSVQ7CiAJCWJpdHMgfD0gYWRjX2NoYW5fYml0cyhjaGFubmVsKTsKLQkJLyogIHNldCBzdG9wIGNoYW5uZWwgKi8KKwkJLyogc2V0IHN0b3AgY2hhbm5lbCAqLwogCQl3cml0ZXcoYWRjX2NoYW5fYml0cyhjaGFubmVsKSwKIAkJICAgICAgIGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX1FVRVVFX0hJR0hfUkVHKTsKLQkJLyogIHNldCBzdGFydCBjaGFubmVsLCBhbmQgcmVzdCBvZiBzZXR0aW5ncyAqLworCQkvKiBzZXQgc3RhcnQgY2hhbm5lbCwgYW5kIHJlc3Qgb2Ygc2V0dGluZ3MgKi8KIAkJd3JpdGV3KGJpdHMsIGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX1FVRVVFX0xPQURfUkVHKTsKIAl9IGVsc2UgewogCQl1aW50OF90IG9sZF9jYWxfcmFuZ2VfYml0cyA9IGRldnByaXYtPmkyY19jYWxfcmFuZ2VfYml0czsKQEAgLTE4MzUsNyArMTg0MCw3IEBACiAJCX0gZWxzZSB7CS8qIHNlbGVjdCBCTkMgaW5wdXRzICovCiAJCQlkZXZwcml2LT5pMmNfY2FsX3JhbmdlX2JpdHMgfD0gYWRjX3NyY180MDIwX2JpdHMoNCk7CiAJCX0KLQkJLyogIHNlbGVjdCByYW5nZSAqLworCQkvKiBzZWxlY3QgcmFuZ2UgKi8KIAkJaWYgKHJhbmdlID09IDApCiAJCQlkZXZwcml2LT5pMmNfY2FsX3JhbmdlX2JpdHMgfD0gYXR0ZW51YXRlX2JpdChjaGFubmVsKTsKIAkJZWxzZQpAQCAtMTg2MiwxNCArMTg2NywxNCBAQAogCX0KIAogCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKLQkJLyogIGNsZWFyIGFkYyBidWZmZXIgKGluc2lkZSBsb29wIGZvciA0MDIwIHNha2UpICovCisJCS8qIGNsZWFyIGFkYyBidWZmZXIgKGluc2lkZSBsb29wIGZvciA0MDIwIHNha2UpICovCiAJCXdyaXRldygwLCBkZXZwcml2LT5tYWluX2lvYmFzZSArIEFEQ19CVUZGRVJfQ0xFQVJfUkVHKTsKIAogCQkvKiB0cmlnZ2VyIGNvbnZlcnNpb24sIGJpdHMgc2VudCBvbmx5IG1hdHRlciBmb3IgNDAyMCAqLwogCQl3cml0ZXcoYWRjX2NvbnZlcnRfY2hhbl80MDIwX2JpdHMoQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYykpLAogCQkgICAgICAgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBBRENfQ09OVkVSVF9SRUcpOwogCi0JCS8qICB3YWl0IGZvciBkYXRhICovCisJCS8qIHdhaXQgZm9yIGRhdGEgKi8KIAkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBjYl9wY2lkYXM2NF9haV9lb2MsIDApOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKQEAgLTIyNDksNyArMjI1NCw3IEBACiB7CiAJc3RydWN0IHBjaWRhczY0X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKLQkvKiAgbG9hZCBoYXJkd2FyZSBjb252ZXJzaW9uIGNvdW50ZXIgKi8KKwkvKiBsb2FkIGhhcmR3YXJlIGNvbnZlcnNpb24gY291bnRlciAqLwogCWlmICh1c2VfaHdfc2FtcGxlX2NvdW50ZXIoY21kKSkgewogCQl3cml0ZXcoY21kLT5zdG9wX2FyZyAmIDB4ZmZmZiwKIAkJICAgICAgIGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX0NPVU5UX0xPV0VSX1JFRyk7CkBAIC0yMjc3LDcgKzIyODIsNyBAQAogc3RhdGljIHVpbnQzMl90IGFpX2NvbnZlcnRfY291bnRlcl82eHh4KGNvbnN0IHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJCWNvbnN0IHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7Ci0JLyogIHN1cHBvc2VkIHRvIGxvYWQgY291bnRlciB3aXRoIGRlc2lyZWQgZGl2aXNvciBtaW51cyAzICovCisJLyogc3VwcG9zZWQgdG8gbG9hZCBjb3VudGVyIHdpdGggZGVzaXJlZCBkaXZpc29yIG1pbnVzIDMgKi8KIAlyZXR1cm4gY21kLT5jb252ZXJ0X2FyZyAvIFRJTUVSX0JBU0UgLSAzOwogfQogCkBAIC0yMjg2LDcgKzIyOTEsNyBAQAogewogCXVpbnQzMl90IGNvdW50OwogCi0JLyogIGZpZ3VyZSBvdXQgaG93IGxvbmcgd2UgbmVlZCB0byBkZWxheSBhdCBlbmQgb2Ygc2NhbiAqLworCS8qIGZpZ3VyZSBvdXQgaG93IGxvbmcgd2UgbmVlZCB0byBkZWxheSBhdCBlbmQgb2Ygc2NhbiAqLwogCXN3aXRjaCAoY21kLT5zY2FuX2JlZ2luX3NyYykgewogCWNhc2UgVFJJR19USU1FUjoKIAkJY291bnQgPSAoY21kLT5zY2FuX2JlZ2luX2FyZyAtCkBAIC0yMzE1LDEzICsyMzIwLDEzIEBACiAJY2FzZSBUUklHX09USEVSOgogCQlkaXZpc29yID0gZGV2cHJpdi0+ZXh0X2Nsb2NrLmRpdmlzb3I7CiAJCWJyZWFrOwotCWRlZmF1bHQ6CQkvKiAgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCWRlZmF1bHQ6CQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCiAJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJidWchIGZhaWxlZCB0byBzZXQgYWkgcGFjaW5nIVxuIik7CiAJCWRpdmlzb3IgPSAxMDAwOwogCQlicmVhazsKIAl9CiAKLQkvKiAgc3VwcG9zZWQgdG8gbG9hZCBjb3VudGVyIHdpdGggZGVzaXJlZCBkaXZpc29yIG1pbnVzIDIgZm9yIDQwMjAgKi8KKwkvKiBzdXBwb3NlZCB0byBsb2FkIGNvdW50ZXIgd2l0aCBkZXNpcmVkIGRpdmlzb3IgbWludXMgMiBmb3IgNDAyMCAqLwogCXJldHVybiBkaXZpc29yIC0gMjsKIH0KIApAQCAtMjMzMCw3ICsyMzM1LDcgQEAKIHsKIAlzdHJ1Y3QgcGNpZGFzNjRfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAotCS8qICBzZWxlY3QgaW50ZXJuYWwvZXh0ZXJuYWwgbWFzdGVyIGNsb2NrICovCisJLyogc2VsZWN0IGludGVybmFsL2V4dGVybmFsIG1hc3RlciBjbG9jayAqLwogCWRldnByaXYtPmh3X2NvbmZpZ19iaXRzICY9IH5NQVNURVJfQ0xPQ0tfNDAyMF9NQVNLOwogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfT1RIRVIpIHsKIAkJaW50IGNoYW5zcGVjID0gZGV2cHJpdi0+ZXh0X2Nsb2NrLmNoYW5zcGVjOwpAQCAtMjM2Niw3ICsyMzcxLDcgQEAKIAlzdHJ1Y3QgcGNpZGFzNjRfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogIHNwaW5sb2NrIGZvciBwbHggZG1hIGNvbnRyb2wvc3RhdHVzIHJlZyAqLworCS8qIHNwaW5sb2NrIGZvciBwbHggZG1hIGNvbnRyb2wvc3RhdHVzIHJlZyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CiAJd3JpdGViKFBMWF9ETUFDU1JfRU5BQkxFIHwgUExYX0RNQUNTUl9TVEFSVCB8IFBMWF9ETUFDU1JfQ0xFQVJJTlRSLAogCSAgICAgICBkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9SRUdfRE1BQ1NSKGNoYW5uZWwpKTsKQEAgLTIzOTAsMTYgKzIzOTUsMTYgQEAKIAkJc2Nhbl9jb3VudGVyID0gYWlfc2Nhbl9jb3VudGVyXzZ4eHgoZGV2LCBjbWQpOwogCX0KIAotCS8qICBsb2FkIGxvd2VyIDE2IGJpdHMgb2YgY29udmVydCBpbnRlcnZhbCAqLworCS8qIGxvYWQgbG93ZXIgMTYgYml0cyBvZiBjb252ZXJ0IGludGVydmFsICovCiAJd3JpdGV3KGNvbnZlcnRfY291bnRlciAmIDB4ZmZmZiwKIAkgICAgICAgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBBRENfU0FNUExFX0lOVEVSVkFMX0xPV0VSX1JFRyk7Ci0JLyogIGxvYWQgdXBwZXIgOCBiaXRzIG9mIGNvbnZlcnQgaW50ZXJ2YWwgKi8KKwkvKiBsb2FkIHVwcGVyIDggYml0cyBvZiBjb252ZXJ0IGludGVydmFsICovCiAJd3JpdGV3KChjb252ZXJ0X2NvdW50ZXIgPj4gMTYpICYgMHhmZiwKIAkgICAgICAgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBBRENfU0FNUExFX0lOVEVSVkFMX1VQUEVSX1JFRyk7Ci0JLyogIGxvYWQgbG93ZXIgMTYgYml0cyBvZiBzY2FuIGRlbGF5ICovCisJLyogbG9hZCBsb3dlciAxNiBiaXRzIG9mIHNjYW4gZGVsYXkgKi8KIAl3cml0ZXcoc2Nhbl9jb3VudGVyICYgMHhmZmZmLAogCSAgICAgICBkZXZwcml2LT5tYWluX2lvYmFzZSArIEFEQ19ERUxBWV9JTlRFUlZBTF9MT1dFUl9SRUcpOwotCS8qICBsb2FkIHVwcGVyIDggYml0cyBvZiBzY2FuIGRlbGF5ICovCisJLyogbG9hZCB1cHBlciA4IGJpdHMgb2Ygc2NhbiBkZWxheSAqLwogCXdyaXRldygoc2Nhbl9jb3VudGVyID4+IDE2KSAmIDB4ZmYsCiAJICAgICAgIGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX0RFTEFZX0lOVEVSVkFMX1VQUEVSX1JFRyk7CiB9CkBAIC0yNDM1LDI2ICsyNDQwLDI2IEBACiAJCQl3cml0ZXcoZGV2cHJpdi0+aHdfY29uZmlnX2JpdHMsCiAJCQkgICAgICAgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBIV19DT05GSUdfUkVHKTsKIAkJCWJpdHMgPSAwOwotCQkJLyogIHNldCBjaGFubmVsICovCisJCQkvKiBzZXQgY2hhbm5lbCAqLwogCQkJYml0cyB8PSBhZGNfY2hhbl9iaXRzKENSX0NIQU4oY21kLT5jaGFubGlzdFswXSkpOwotCQkJLyogIHNldCBnYWluICovCisJCQkvKiBzZXQgZ2FpbiAqLwogCQkJYml0cyB8PSBhaV9yYW5nZV9iaXRzXzZ4eHgoZGV2LAogCQkJCQkJICAgQ1JfUkFOR0UoY21kLT5jaGFubGlzdFswXSkpOwotCQkJLyogIHNldCBzaW5nbGUtZW5kZWQgLyBkaWZmZXJlbnRpYWwgKi8KKwkJCS8qIHNldCBzaW5nbGUtZW5kZWQgLyBkaWZmZXJlbnRpYWwgKi8KIAkJCWJpdHMgfD0gc2VfZGlmZl9iaXRfNnh4eChkZXYsCiAJCQkJCQkgQ1JfQVJFRihjbWQtPmNoYW5saXN0WzBdKSA9PQogCQkJCQkJIEFSRUZfRElGRik7CiAJCQlpZiAoQ1JfQVJFRihjbWQtPmNoYW5saXN0WzBdKSA9PSBBUkVGX0NPTU1PTikKIAkJCQliaXRzIHw9IEFEQ19DT01NT05fQklUOwotCQkJLyogIHNldCBzdG9wIGNoYW5uZWwgKi8KKwkJCS8qIHNldCBzdG9wIGNoYW5uZWwgKi8KIAkJCXdyaXRldyhhZGNfY2hhbl9iaXRzCiAJCQkgICAgICAgKENSX0NIQU4oY21kLT5jaGFubGlzdFtjbWQtPmNoYW5saXN0X2xlbiAtIDFdKSksCiAJCQkgICAgICAgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBBRENfUVVFVUVfSElHSF9SRUcpOwotCQkJLyogIHNldCBzdGFydCBjaGFubmVsLCBhbmQgcmVzdCBvZiBzZXR0aW5ncyAqLworCQkJLyogc2V0IHN0YXJ0IGNoYW5uZWwsIGFuZCByZXN0IG9mIHNldHRpbmdzICovCiAJCQl3cml0ZXcoYml0cywKIAkJCSAgICAgICBkZXZwcml2LT5tYWluX2lvYmFzZSArIEFEQ19RVUVVRV9MT0FEX1JFRyk7CiAJCX0gZWxzZSB7Ci0JCQkvKiAgdXNlIGV4dGVybmFsIHF1ZXVlICovCisJCQkvKiB1c2UgZXh0ZXJuYWwgcXVldWUgKi8KIAkJCWlmIChkZXYtPndyaXRlX3N1YmRldiAmJiBkZXYtPndyaXRlX3N1YmRldi0+YnVzeSkgewogCQkJCXdhcm5fZXh0ZXJuYWxfcXVldWUoZGV2KTsKIAkJCQlyZXR1cm4gLUVCVVNZOwpAQCAtMjQ2MiwzMCArMjQ2NywzMCBAQAogCQkJZGV2cHJpdi0+aHdfY29uZmlnX2JpdHMgfD0gRVhUX1FVRVVFX0JJVDsKIAkJCXdyaXRldyhkZXZwcml2LT5od19jb25maWdfYml0cywKIAkJCSAgICAgICBkZXZwcml2LT5tYWluX2lvYmFzZSArIEhXX0NPTkZJR19SRUcpOwotCQkJLyogIGNsZWFyIERBQyBidWZmZXIgdG8gcHJldmVudCB3ZWlyZCBpbnRlcmFjdGlvbnMgKi8KKwkJCS8qIGNsZWFyIERBQyBidWZmZXIgdG8gcHJldmVudCB3ZWlyZCBpbnRlcmFjdGlvbnMgKi8KIAkJCXdyaXRldygwLAogCQkJICAgICAgIGRldnByaXYtPm1haW5faW9iYXNlICsgREFDX0JVRkZFUl9DTEVBUl9SRUcpOwotCQkJLyogIGNsZWFyIHF1ZXVlIHBvaW50ZXIgKi8KKwkJCS8qIGNsZWFyIHF1ZXVlIHBvaW50ZXIgKi8KIAkJCXdyaXRldygwLCBkZXZwcml2LT5tYWluX2lvYmFzZSArIEFEQ19RVUVVRV9DTEVBUl9SRUcpOwotCQkJLyogIGxvYWQgZXh0ZXJuYWwgcXVldWUgKi8KKwkJCS8qIGxvYWQgZXh0ZXJuYWwgcXVldWUgKi8KIAkJCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgaSsrKSB7CiAJCQkJYml0cyA9IDA7Ci0JCQkJLyogIHNldCBjaGFubmVsICovCisJCQkJLyogc2V0IGNoYW5uZWwgKi8KIAkJCQliaXRzIHw9IGFkY19jaGFuX2JpdHMoQ1JfQ0hBTihjbWQtPgogCQkJCQkJCSAgICAgIGNoYW5saXN0W2ldKSk7Ci0JCQkJLyogIHNldCBnYWluICovCisJCQkJLyogc2V0IGdhaW4gKi8KIAkJCQliaXRzIHw9IGFpX3JhbmdlX2JpdHNfNnh4eChkZXYsCiAJCQkJCQkJICAgQ1JfUkFOR0UoY21kLT4KIAkJCQkJCQkJICAgIGNoYW5saXN0CiAJCQkJCQkJCSAgICBbaV0pKTsKLQkJCQkvKiAgc2V0IHNpbmdsZS1lbmRlZCAvIGRpZmZlcmVudGlhbCAqLworCQkJCS8qIHNldCBzaW5nbGUtZW5kZWQgLyBkaWZmZXJlbnRpYWwgKi8KIAkJCQliaXRzIHw9IHNlX2RpZmZfYml0XzZ4eHgoZGV2LAogCQkJCQkJCSBDUl9BUkVGKGNtZC0+CiAJCQkJCQkJCSBjaGFubGlzdFtpXSkgPT0KIAkJCQkJCQkgQVJFRl9ESUZGKTsKIAkJCQlpZiAoQ1JfQVJFRihjbWQtPmNoYW5saXN0W2ldKSA9PSBBUkVGX0NPTU1PTikKIAkJCQkJYml0cyB8PSBBRENfQ09NTU9OX0JJVDsKLQkJCQkvKiAgbWFyayBlbmQgb2YgcXVldWUgKi8KKwkJCQkvKiBtYXJrIGVuZCBvZiBxdWV1ZSAqLwogCQkJCWlmIChpID09IGNtZC0+Y2hhbmxpc3RfbGVuIC0gMSkKIAkJCQkJYml0cyB8PSBRVUVVRV9FT1NDQU5fQklUIHwKIAkJCQkJCVFVRVVFX0VPU0VRX0JJVDsKQEAgLTI0OTgsNyArMjUwMyw3IEBACiAJCQkgKiBidXQgcmVxdWlyZWQgZm9yIHJlbGlhYmxlIG9wZXJhdGlvbgogCQkJICovCiAJCQl3cml0ZXcoMCwgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBBRENfUVVFVUVfQ0xFQVJfUkVHKTsKLQkJCS8qICBwcmltZSBxdWV1ZSBob2xkaW5nIHJlZ2lzdGVyICovCisJCQkvKiBwcmltZSBxdWV1ZSBob2xkaW5nIHJlZ2lzdGVyICovCiAJCQl3cml0ZXcoMCwgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBBRENfUVVFVUVfTE9BRF9SRUcpOwogCQl9CiAJfSBlbHNlIHsKQEAgLTI1MDcsNyArMjUxMiw3IEBACiAJCWRldnByaXYtPmkyY19jYWxfcmFuZ2VfYml0cyAmPSB+QURDX1NSQ180MDIwX01BU0s7CiAJCS8qIHNlbGVjdCBCTkMgaW5wdXRzICovCiAJCWRldnByaXYtPmkyY19jYWxfcmFuZ2VfYml0cyB8PSBhZGNfc3JjXzQwMjBfYml0cyg0KTsKLQkJLyogIHNlbGVjdCByYW5nZXMgKi8KKwkJLyogc2VsZWN0IHJhbmdlcyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgY21kLT5jaGFubGlzdF9sZW47IGkrKykgewogCQkJdW5zaWduZWQgaW50IGNoYW5uZWwgPSBDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbaV0pOwogCQkJdW5zaWduZWQgaW50IHJhbmdlID0gQ1JfUkFOR0UoY21kLT5jaGFubGlzdFtpXSk7CkBAIC0yNTc5LDcgKzI1ODQsNyBAQAogCWlmIChyZXR2YWwgPCAwKQogCQlyZXR1cm4gcmV0dmFsOwogCi0JLyogIG1ha2Ugc3VyZSBpbnRlcm5hbCBjYWxpYnJhdGlvbiBzb3VyY2UgaXMgdHVybmVkIG9mZiAqLworCS8qIG1ha2Ugc3VyZSBpbnRlcm5hbCBjYWxpYnJhdGlvbiBzb3VyY2UgaXMgdHVybmVkIG9mZiAqLwogCXdyaXRldygwLCBkZXZwcml2LT5tYWluX2lvYmFzZSArIENBTElCUkFUSU9OX1JFRyk7CiAKIAlzZXRfYWlfcGFjaW5nKGRldiwgY21kKTsKQEAgLTI1OTUsMTAgKzI2MDAsMTAgQEAKIAlpZiAoYm9hcmQtPmxheW91dCAhPSBMQVlPVVRfNDAyMCkgewogCQlkZXZwcml2LT5hZGNfY29udHJvbDFfYml0cyAmPSB+QURDX01PREVfTUFTSzsKIAkJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19FWFQpCi0JCQkvKiAgZ29vZCBvbGQgbW9kZSAxMyAqLworCQkJLyogZ29vZCBvbGQgbW9kZSAxMyAqLwogCQkJZGV2cHJpdi0+YWRjX2NvbnRyb2wxX2JpdHMgfD0gYWRjX21vZGVfYml0cygxMyk7CiAJCWVsc2UKLQkJCS8qICBtb2RlIDguICBXaGF0IGVsc2UgY291bGQgeW91IG5lZWQ/ICovCisJCQkvKiBtb2RlIDguICBXaGF0IGVsc2UgY291bGQgeW91IG5lZWQ/ICovCiAJCQlkZXZwcml2LT5hZGNfY29udHJvbDFfYml0cyB8PSBhZGNfbW9kZV9iaXRzKDgpOwogCX0gZWxzZSB7CiAJCWRldnByaXYtPmFkY19jb250cm9sMV9iaXRzICY9IH5DSEFOTkVMX01PREVfNDAyMF9NQVNLOwpAQCAtMjYxOCwyMCArMjYyMywyMCBAQAogCSAgICAgICBkZXZwcml2LT5tYWluX2lvYmFzZSArIEFEQ19DT05UUk9MMV9SRUcpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKIAotCS8qICBjbGVhciBhZGMgYnVmZmVyICovCisJLyogY2xlYXIgYWRjIGJ1ZmZlciAqLwogCXdyaXRldygwLCBkZXZwcml2LT5tYWluX2lvYmFzZSArIEFEQ19CVUZGRVJfQ0xFQVJfUkVHKTsKIAogCWlmICgoY21kLT5mbGFncyAmIENNREZfV0FLRV9FT1MpID09IDAgfHwKIAkgICAgYm9hcmQtPmxheW91dCA9PSBMQVlPVVRfNDAyMCkgewogCQlkZXZwcml2LT5haV9kbWFfaW5kZXggPSAwOwogCi0JCS8qICBzZXQgZG1hIHRyYW5zZmVyIHNpemUgKi8KKwkJLyogc2V0IGRtYSB0cmFuc2ZlciBzaXplICovCiAJCWZvciAoaSA9IDA7IGkgPCBhaV9kbWFfcmluZ19jb3VudChib2FyZCk7IGkrKykKIAkJCWRldnByaXYtPmFpX2RtYV9kZXNjW2ldLnRyYW5zZmVyX3NpemUgPQogCQkJCWNwdV90b19sZTMyKGRtYV90cmFuc2Zlcl9zaXplKGRldikgKgogCQkJCQkgICAgc2l6ZW9mKHVpbnQxNl90KSk7CiAKLQkJLyogIGdpdmUgbG9jYXRpb24gb2YgZmlyc3QgZG1hIGRlc2NyaXB0b3IgKi8KKwkJLyogZ2l2ZSBsb2NhdGlvbiBvZiBmaXJzdCBkbWEgZGVzY3JpcHRvciAqLwogCQlsb2FkX2ZpcnN0X2RtYV9kZXNjcmlwdG9yKGRldiwgMSwKIAkJCQkJICBkZXZwcml2LT5haV9kbWFfZGVzY19idXNfYWRkciB8CiAJCQkJCSAgUExYX0RNQURQUl9ERVNDUENJIHwKQEAgLTI2NTcsNyArMjY2Miw3IEBACiAJYml0cyA9IEFEQ19FTkFCTEVfQklUIHwgQURDX1NPRlRfR0FURV9CSVRTIHwgQURDX0dBVEVfTEVWRUxfQklUOwogCWlmIChjbWQtPmZsYWdzICYgQ01ERl9XQUtFX0VPUykKIAkJYml0cyB8PSBBRENfRE1BX0RJU0FCTEVfQklUOwotCS8qICBzZXQgc3RhcnQgdHJpZ2dlciAqLworCS8qIHNldCBzdGFydCB0cmlnZ2VyICovCiAJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUKSB7CiAJCWJpdHMgfD0gQURDX1NUQVJUX1RSSUdfRVhUX0JJVFM7CiAJCWlmIChjbWQtPnN0YXJ0X2FyZyAmIENSX0lOVkVSVCkKQEAgLTI2NzMsNyArMjY3OCw3IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CiAKLQkvKiAgc3RhcnQgYWNxdWlzaXRpb24gKi8KKwkvKiBzdGFydCBhY3F1aXNpdGlvbiAqLwogCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVykKIAkJd3JpdGV3KDAsIGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX1NUQVJUX1JFRyk7CiAKQEAgLTI2OTEsNyArMjY5Niw3IEBACiAJaW50IG51bV9zYW1wbGVzOwogCiAJZG8gewotCQkvKiAgZ2V0IGxlYXN0IHNpZ25pZmljYW50IDE1IGJpdHMgKi8KKwkJLyogZ2V0IGxlYXN0IHNpZ25pZmljYW50IDE1IGJpdHMgKi8KIAkJcmVhZF9pbmRleCA9IHJlYWR3KGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX1JFQURfUE5UUl9SRUcpICYKIAkJCSAgICAgMHg3ZmZmOwogCQl3cml0ZV9pbmRleCA9IHJlYWR3KGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX1dSSVRFX1BOVFJfUkVHKSAmCkBAIC0yNzk2LDE0ICsyODAxLDE0IEBACiAKIAlwY2lfYWRkcl9yZWcgPSBkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9SRUdfRE1BUEFEUihjaGFubmVsKTsKIAotCS8qICBsb29wIHVudGlsIHdlIGhhdmUgcmVhZCBhbGwgdGhlIGZ1bGwgYnVmZmVycyAqLworCS8qIGxvb3AgdW50aWwgd2UgaGF2ZSByZWFkIGFsbCB0aGUgZnVsbCBidWZmZXJzICovCiAJZm9yIChqID0gMCwgbmV4dF90cmFuc2Zlcl9hZGRyID0gcmVhZGwocGNpX2FkZHJfcmVnKTsKIAkgICAgIChuZXh0X3RyYW5zZmVyX2FkZHIgPAogCSAgICAgIGRldnByaXYtPmFpX2J1ZmZlcl9idXNfYWRkcltkZXZwcml2LT5haV9kbWFfaW5kZXhdIHx8CiAJICAgICAgbmV4dF90cmFuc2Zlcl9hZGRyID49CiAJICAgICAgZGV2cHJpdi0+YWlfYnVmZmVyX2J1c19hZGRyW2RldnByaXYtPmFpX2RtYV9pbmRleF0gKwogCSAgICAgIERNQV9CVUZGRVJfU0laRSkgJiYgaiA8IGFpX2RtYV9yaW5nX2NvdW50KGJvYXJkKTsgaisrKSB7Ci0JCS8qICB0cmFuc2ZlciBkYXRhIGZyb20gZG1hIGJ1ZmZlciB0byBjb21lZGkgYnVmZmVyICovCisJCS8qIHRyYW5zZmVyIGRhdGEgZnJvbSBkbWEgYnVmZmVyIHRvIGNvbWVkaSBidWZmZXIgKi8KIAkJbnVtX3NhbXBsZXMgPSBjb21lZGlfbnNhbXBsZXNfbGVmdChzLCBkbWFfdHJhbnNmZXJfc2l6ZShkZXYpKTsKIAkJY29tZWRpX2J1Zl93cml0ZV9zYW1wbGVzKHMsCiAJCQkJZGV2cHJpdi0+YWlfYnVmZmVyW2RldnByaXYtPmFpX2RtYV9pbmRleF0sCkBAIC0yODI5LDE1ICsyODM0LDE1IEBACiAJdWludDhfdCBkbWExX3N0YXR1czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogIGNoZWNrIGZvciBmaWZvIG92ZXJydW4gKi8KKwkvKiBjaGVjayBmb3IgZmlmbyBvdmVycnVuICovCiAJaWYgKHN0YXR1cyAmIEFEQ19PVkVSUlVOX0JJVCkgewogCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiZmlmbyBvdmVycnVuXG4iKTsKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CiAJfQotCS8qICBzcGluIGxvY2sgbWFrZXMgc3VyZSBubyBvbmUgZWxzZSBjaGFuZ2VzIHBseCBkbWEgY29udHJvbCByZWcgKi8KKwkvKiBzcGluIGxvY2sgbWFrZXMgc3VyZSBubyBvbmUgZWxzZSBjaGFuZ2VzIHBseCBkbWEgY29udHJvbCByZWcgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwogCWRtYTFfc3RhdHVzID0gcmVhZGIoZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfUkVHX0RNQUNTUjEpOwotCWlmIChwbHhfc3RhdHVzICYgUExYX0lOVENTUl9ETUExSUEpIHsJLyogIGRtYSBjaGFuIDEgaW50ZXJydXB0ICovCisJaWYgKHBseF9zdGF0dXMgJiBQTFhfSU5UQ1NSX0RNQTFJQSkgewkvKiBkbWEgY2hhbiAxIGludGVycnVwdCAqLwogCQl3cml0ZWIoKGRtYTFfc3RhdHVzICYgUExYX0RNQUNTUl9FTkFCTEUpIHwgUExYX0RNQUNTUl9DTEVBUklOVFIsCiAJCSAgICAgICBkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9SRUdfRE1BQ1NSMSk7CiAKQEAgLTI4NDYsNyArMjg1MSw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKIAotCS8qICBkcmFpbiBmaWZvIHdpdGggcGlvICovCisJLyogZHJhaW4gZmlmbyB3aXRoIHBpbyAqLwogCWlmICgoc3RhdHVzICYgQURDX0RPTkVfQklUKSB8fAogCSAgICAoKGNtZC0+ZmxhZ3MgJiBDTURGX1dBS0VfRU9TKSAmJgogCSAgICAgKHN0YXR1cyAmIEFEQ19JTlRSX1BFTkRJTkdfQklUKSAmJgpAQCAtMjg1OSw3ICsyODY0LDcgQEAKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKIAkJfQogCX0KLQkvKiAgaWYgd2UgYXJlIGhhdmUgYWxsIHRoZSBkYXRhLCB0aGVuIHF1aXQgKi8KKwkvKiBpZiB3ZSBhcmUgaGF2ZSBhbGwgdGhlIGRhdGEsIHRoZW4gcXVpdCAqLwogCWlmICgoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UICYmCiAJICAgICBhc3luYy0+c2NhbnNfZG9uZSA+PSBjbWQtPnN0b3BfYXJnKSB8fAogCSAgICAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0VYVCAmJiAoc3RhdHVzICYgQURDX1NUT1BfQklUKSkpCkBAIC0zMDEyLDcgKzMwMTcsNyBAQAogCWFzeW5jID0gcy0+YXN5bmM7CiAJY21kID0gJmFzeW5jLT5jbWQ7CiAKLQkvKiAgc3BpbiBsb2NrIG1ha2VzIHN1cmUgbm8gb25lIGVsc2UgY2hhbmdlcyBwbHggZG1hIGNvbnRyb2wgcmVnICovCisJLyogc3BpbiBsb2NrIG1ha2VzIHN1cmUgbm8gb25lIGVsc2UgY2hhbmdlcyBwbHggZG1hIGNvbnRyb2wgcmVnICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKIAlkbWEwX3N0YXR1cyA9IHJlYWRiKGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX1JFR19ETUFDU1IwKTsKIAlpZiAocGx4X3N0YXR1cyAmIFBMWF9JTlRDU1JfRE1BMElBKSB7CS8qICBkbWEgY2hhbiAwIGludGVycnVwdCAqLwpAQCAtMzEwNiwxNSArMzExMSwxNSBAQAogCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJaW50IHJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOwogCi0JLyogIGRvIHNvbWUgaW5pdGlhbGl6aW5nICovCisJLyogZG8gc29tZSBpbml0aWFsaXppbmcgKi8KIAl3cml0ZXcoMCwgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBEQUNfQ09OVFJPTDBfUkVHKTsKIAotCS8qICBzZXQgcmFuZ2UgKi8KKwkvKiBzZXQgcmFuZ2UgKi8KIAlzZXRfZGFjX3JhbmdlX2JpdHMoZGV2LCAmZGV2cHJpdi0+ZGFjX2NvbnRyb2wxX2JpdHMsIGNoYW4sIHJhbmdlKTsKIAl3cml0ZXcoZGV2cHJpdi0+ZGFjX2NvbnRyb2wxX2JpdHMsCiAJICAgICAgIGRldnByaXYtPm1haW5faW9iYXNlICsgREFDX0NPTlRST0wxX1JFRyk7CiAKLQkvKiAgd3JpdGUgdG8gY2hhbm5lbCAqLworCS8qIHdyaXRlIHRvIGNoYW5uZWwgKi8KIAlpZiAoYm9hcmQtPmxheW91dCA9PSBMQVlPVVRfNDAyMCkgewogCQl3cml0ZXcoZGF0YVswXSAmIDB4ZmYsCiAJCSAgICAgICBkZXZwcml2LT5tYWluX2lvYmFzZSArIGRhY19sc2JfNDAyMF9yZWcoY2hhbikpOwpAQCAtMzEyNCw3ICszMTI5LDcgQEAKIAkJd3JpdGV3KGRhdGFbMF0sIGRldnByaXYtPm1haW5faW9iYXNlICsgZGFjX2NvbnZlcnRfcmVnKGNoYW4pKTsKIAl9CiAKLQkvKiAgcmVtZW1iZXIgb3V0cHV0IHZhbHVlICovCisJLyogcmVtZW1iZXIgb3V0cHV0IHZhbHVlICovCiAJcy0+cmVhZGJhY2tbY2hhbl0gPSBkYXRhWzBdOwogCiAJcmV0dXJuIDE7CkBAIC0zNTU2LDcgKzM1NjEsNyBAQAogCXVpbnQ4X3Qgc2VyaWFsX2J5dGVzWzNdOwogCXVpbnQ4X3QgaTJjX2FkZHI7CiAJZW51bSBwb2ludGVyX2JpdHMgewotCQkvKiAgbWFudWFsIGhhcyBnYWluIGFuZCBvZmZzZXQgYml0cyBzd2l0Y2hlZCAqLworCQkvKiBtYW51YWwgaGFzIGdhaW4gYW5kIG9mZnNldCBiaXRzIHN3aXRjaGVkICovCiAJCU9GRlNFVF8wXzIgPSAweDEsCiAJCUdBSU5fMF8yID0gMHgyLAogCQlPRkZTRVRfMV8zID0gMHg0LApAQCAtMzU2NywzNSArMzU3MiwzNSBAQAogCX07CiAKIAlzd2l0Y2ggKGNhbGRhY19jaGFubmVsKSB7Ci0JY2FzZSAwOgkJLyogIGNoYW4gMCBvZmZzZXQgKi8KKwljYXNlIDA6CQkJCQkvKiBjaGFuIDAgb2Zmc2V0ICovCiAJCWkyY19hZGRyID0gQ0FMREFDMF9JMkNfQUREUjsKIAkJc2VyaWFsX2J5dGVzWzBdID0gT0ZGU0VUXzBfMjsKIAkJYnJlYWs7Ci0JY2FzZSAxOgkJLyogIGNoYW4gMSBvZmZzZXQgKi8KKwljYXNlIDE6CQkJCQkvKiBjaGFuIDEgb2Zmc2V0ICovCiAJCWkyY19hZGRyID0gQ0FMREFDMF9JMkNfQUREUjsKIAkJc2VyaWFsX2J5dGVzWzBdID0gT0ZGU0VUXzFfMzsKIAkJYnJlYWs7Ci0JY2FzZSAyOgkJLyogIGNoYW4gMiBvZmZzZXQgKi8KKwljYXNlIDI6CQkJCQkvKiBjaGFuIDIgb2Zmc2V0ICovCiAJCWkyY19hZGRyID0gQ0FMREFDMV9JMkNfQUREUjsKIAkJc2VyaWFsX2J5dGVzWzBdID0gT0ZGU0VUXzBfMjsKIAkJYnJlYWs7Ci0JY2FzZSAzOgkJLyogIGNoYW4gMyBvZmZzZXQgKi8KKwljYXNlIDM6CQkJCQkvKiBjaGFuIDMgb2Zmc2V0ICovCiAJCWkyY19hZGRyID0gQ0FMREFDMV9JMkNfQUREUjsKIAkJc2VyaWFsX2J5dGVzWzBdID0gT0ZGU0VUXzFfMzsKIAkJYnJlYWs7Ci0JY2FzZSA0OgkJLyogIGNoYW4gMCBnYWluICovCisJY2FzZSA0OgkJCQkJLyogY2hhbiAwIGdhaW4gKi8KIAkJaTJjX2FkZHIgPSBDQUxEQUMwX0kyQ19BRERSOwogCQlzZXJpYWxfYnl0ZXNbMF0gPSBHQUlOXzBfMjsKIAkJYnJlYWs7Ci0JY2FzZSA1OgkJLyogIGNoYW4gMSBnYWluICovCisJY2FzZSA1OgkJCQkJLyogY2hhbiAxIGdhaW4gKi8KIAkJaTJjX2FkZHIgPSBDQUxEQUMwX0kyQ19BRERSOwogCQlzZXJpYWxfYnl0ZXNbMF0gPSBHQUlOXzFfMzsKIAkJYnJlYWs7Ci0JY2FzZSA2OgkJLyogIGNoYW4gMiBnYWluICovCisJY2FzZSA2OgkJCQkJLyogY2hhbiAyIGdhaW4gKi8KIAkJaTJjX2FkZHIgPSBDQUxEQUMxX0kyQ19BRERSOwogCQlzZXJpYWxfYnl0ZXNbMF0gPSBHQUlOXzBfMjsKIAkJYnJlYWs7Ci0JY2FzZSA3OgkJLyogIGNoYW4gMyBnYWluICovCisJY2FzZSA3OgkJCQkJLyogY2hhbiAzIGdhaW4gKi8KIAkJaTJjX2FkZHIgPSBDQUxEQUMxX0kyQ19BRERSOwogCQlzZXJpYWxfYnl0ZXNbMF0gPSBHQUlOXzFfMzsKIAkJYnJlYWs7CkBAIC0zNzE4LDI0ICszNzIzLDI0IEBACiAKIAl1ZGVsYXkoZWVwcm9tX3VkZWxheSk7CiAJZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cyAmPSB+UExYX0NOVFJMX0VFU0sgJiB+UExYX0NOVFJMX0VFQ1M7Ci0JLyogIG1ha2Ugc3VyZSB3ZSBkb24ndCBzZW5kIGFueXRoaW5nIHRvIHRoZSBpMmMgYnVzIG9uIDQwMjAgKi8KKwkvKiBtYWtlIHN1cmUgd2UgZG9uJ3Qgc2VuZCBhbnl0aGluZyB0byB0aGUgaTJjIGJ1cyBvbiA0MDIwICovCiAJZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cyB8PSBQTFhfQ05UUkxfVVNFUk87CiAJd3JpdGVsKGRldnByaXYtPnBseF9jb250cm9sX2JpdHMsIHBseF9jb250cm9sX2FkZHIpOwotCS8qICBhY3RpdmF0ZSBzZXJpYWwgZWVwcm9tICovCisJLyogYWN0aXZhdGUgc2VyaWFsIGVlcHJvbSAqLwogCXVkZWxheShlZXByb21fdWRlbGF5KTsKIAlkZXZwcml2LT5wbHhfY29udHJvbF9iaXRzIHw9IFBMWF9DTlRSTF9FRUNTOwogCXdyaXRlbChkZXZwcml2LT5wbHhfY29udHJvbF9iaXRzLCBwbHhfY29udHJvbF9hZGRyKTsKIAotCS8qICB3cml0ZSByZWFkIGNvbW1hbmQgYW5kIGRlc2lyZWQgbWVtb3J5IGFkZHJlc3MgKi8KKwkvKiB3cml0ZSByZWFkIGNvbW1hbmQgYW5kIGRlc2lyZWQgbWVtb3J5IGFkZHJlc3MgKi8KIAlmb3IgKGJpdCA9IDEgPDwgKGJpdHN0cmVhbV9sZW5ndGggLSAxKTsgYml0OyBiaXQgPj49IDEpIHsKLQkJLyogIHNldCBiaXQgdG8gYmUgd3JpdHRlbiAqLworCQkvKiBzZXQgYml0IHRvIGJlIHdyaXR0ZW4gKi8KIAkJdWRlbGF5KGVlcHJvbV91ZGVsYXkpOwogCQlpZiAoYml0c3RyZWFtICYgYml0KQogCQkJZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cyB8PSBQTFhfQ05UUkxfRUVXQjsKIAkJZWxzZQogCQkJZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cyAmPSB+UExYX0NOVFJMX0VFV0I7CiAJCXdyaXRlbChkZXZwcml2LT5wbHhfY29udHJvbF9iaXRzLCBwbHhfY29udHJvbF9hZGRyKTsKLQkJLyogIGNsb2NrIGluIGJpdCAqLworCQkvKiBjbG9jayBpbiBiaXQgKi8KIAkJdWRlbGF5KGVlcHJvbV91ZGVsYXkpOwogCQlkZXZwcml2LT5wbHhfY29udHJvbF9iaXRzIHw9IFBMWF9DTlRSTF9FRVNLOwogCQl3cml0ZWwoZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cywgcGx4X2NvbnRyb2xfYWRkcik7CkBAIC0zNzQzLDEwICszNzQ4LDEwIEBACiAJCWRldnByaXYtPnBseF9jb250cm9sX2JpdHMgJj0gflBMWF9DTlRSTF9FRVNLOwogCQl3cml0ZWwoZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cywgcGx4X2NvbnRyb2xfYWRkcik7CiAJfQotCS8qICByZWFkIGJhY2sgdmFsdWUgZnJvbSBlZXByb20gbWVtb3J5IGxvY2F0aW9uICovCisJLyogcmVhZCBiYWNrIHZhbHVlIGZyb20gZWVwcm9tIG1lbW9yeSBsb2NhdGlvbiAqLwogCXZhbHVlID0gMDsKIAlmb3IgKGJpdCA9IDEgPDwgKHZhbHVlX2xlbmd0aCAtIDEpOyBiaXQ7IGJpdCA+Pj0gMSkgewotCQkvKiAgY2xvY2sgb3V0IGJpdCAqLworCQkvKiBjbG9jayBvdXQgYml0ICovCiAJCXVkZWxheShlZXByb21fdWRlbGF5KTsKIAkJZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cyB8PSBQTFhfQ05UUkxfRUVTSzsKIAkJd3JpdGVsKGRldnByaXYtPnBseF9jb250cm9sX2JpdHMsIHBseF9jb250cm9sX2FkZHIpOwpAQCAtMzc1OCw3ICszNzYzLDcgQEAKIAkJCXZhbHVlIHw9IGJpdDsKIAl9CiAKLQkvKiAgZGVhY3RpdmF0ZSBlZXByb20gc2VyaWFsIGlucHV0ICovCisJLyogZGVhY3RpdmF0ZSBlZXByb20gc2VyaWFsIGlucHV0ICovCiAJdWRlbGF5KGVlcHJvbV91ZGVsYXkpOwogCWRldnByaXYtPnBseF9jb250cm9sX2JpdHMgJj0gflBMWF9DTlRSTF9FRUNTOwogCXdyaXRlbChkZXZwcml2LT5wbHhfY29udHJvbF9iaXRzLCBwbHhfY29udHJvbF9hZGRyKTsKQEAgLTM3NzUsOSArMzc4MCw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLS8qCi0gKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgc3ViZGV2aWNlIHN0cnVjdHVyZXMuCi0gKi8KKy8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBzdWJkZXZpY2Ugc3RydWN0dXJlcy4gKi8KIHN0YXRpYyBpbnQgc2V0dXBfc3ViZGV2aWNlcyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCWNvbnN0IHN0cnVjdCBwY2lkYXM2NF9ib2FyZCAqYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKQEAgLTM4MTYsNyArMzgxOSw3IEBACiAJCSAqIChub3QgaW50ZXJuYWwgY2FsaWJyYXRpb24gc291cmNlcykKIAkJICovCiAJCWRldnByaXYtPmkyY19jYWxfcmFuZ2VfYml0cyA9IGFkY19zcmNfNDAyMF9iaXRzKDQpOwotCQkvKiAgc2V0IGNoYW5uZWxzIHRvICstNSB2b2x0IGlucHV0IHJhbmdlcyAqLworCQkvKiBzZXQgY2hhbm5lbHMgdG8gKy01IHZvbHQgaW5wdXQgcmFuZ2VzICovCiAJCWZvciAoaSA9IDA7IGkgPCBzLT5uX2NoYW47IGkrKykKIAkJCWRldnByaXYtPmkyY19jYWxfcmFuZ2VfYml0cyB8PSBhdHRlbnVhdGVfYml0KGkpOwogCQlkYXRhID0gZGV2cHJpdi0+aTJjX2NhbF9yYW5nZV9iaXRzOwpAQCAtMzg0OSw3ICszODUyLDcgQEAKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKIAl9CiAKLQkvKiAgZGlnaXRhbCBpbnB1dCAqLworCS8qIGRpZ2l0YWwgaW5wdXQgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1syXTsKIAlpZiAoYm9hcmQtPmxheW91dCA9PSBMQVlPVVRfNjRYWCkgewogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfREk7CkBAIC0zODYyLDcgKzM4NjUsNyBAQAogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwogCX0KIAotCS8qICBkaWdpdGFsIG91dHB1dCAqLworCS8qIGRpZ2l0YWwgb3V0cHV0ICovCiAJaWYgKGJvYXJkLT5sYXlvdXQgPT0gTEFZT1VUXzY0WFgpIHsKIAkJcyA9ICZkZXYtPnN1YmRldmljZXNbM107CiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ETzsKQEAgLTM4OTEsNyArMzg5NCw3IEBACiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CiAJfQogCi0JLyogIDggY2hhbm5lbCBkaW8gZm9yIDYweHggKi8KKwkvKiA4IGNoYW5uZWwgZGlvIGZvciA2MHh4ICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbNV07CiAJaWYgKGJvYXJkLT5sYXlvdXQgPT0gTEFZT1VUXzYwWFgpIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJTzsKQEAgLTM5MDUsNyArMzkwOCw3IEBACiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CiAJfQogCi0JLyogIGNhbGRhYyAqLworCS8qIGNhbGRhYyAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzZdOwogCXMtPnR5cGUgPSBDT01FRElfU1VCRF9DQUxJQjsKIAlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfV1JJVEFCTEUgfCBTREZfSU5URVJOQUw7CkBAIC0zOTI1LDcgKzM5MjgsNyBAQAogCQlzLT5yZWFkYmFja1tpXSA9IHMtPm1heGRhdGEgLyAyOwogCX0KIAotCS8qICAyIGNoYW5uZWwgYWQ4NDAyIHBvdGVudGlvbWV0ZXIgKi8KKwkvKiAyIGNoYW5uZWwgYWQ4NDAyIHBvdGVudGlvbWV0ZXIgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1s3XTsKIAlpZiAoYm9hcmQtPmxheW91dCA9PSBMQVlPVVRfNjRYWCkgewogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQ0FMSUI7CkBAIC0zOTU5LDcgKzM5NjIsNyBAQAogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwogCX0KIAotCS8qICB1c2VyIGNvdW50ZXIgc3ViZCBYWFggKi8KKwkvKiB1c2VyIGNvdW50ZXIgc3ViZCBYWFggKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1s5XTsKIAlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwogCkBAIC00MDA1LDcgKzQwMDgsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQkvKiAgZmlndXJlIG91dCB3aGF0IGxvY2FsIGFkZHJlc3NlcyBhcmUgKi8KKwkvKiBmaWd1cmUgb3V0IHdoYXQgbG9jYWwgYWRkcmVzc2VzIGFyZSAqLwogCWxvY2FsX3JhbmdlID0gcmVhZGwoZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfUkVHX0xBUzBSUikgJgogCQkgICAgICBQTFhfTEFTUlJfTUVNX01BU0s7CiAJbG9jYWxfZGVjb2RlID0gcmVhZGwoZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfUkVHX0xBUzBCQSkgJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3Rlc3QuYwppbmRleCA0YWIxODY2Li5lYzViOWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3Rlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3Rlc3QuYwpAQCAtNTYsMTEgKzU2LDYgQEAKIAogI2RlZmluZSBOX0NIQU5TIDgKIAotZW51bSB3YXZlZm9ybV9zdGF0ZV9iaXRzIHsKLQlXQVZFRk9STV9BSV9SVU5OSU5HLAotCVdBVkVGT1JNX0FPX1JVTk5JTkcKLX07Ci0KIC8qIERhdGEgdW5pcXVlIHRvIHRoaXMgZHJpdmVyICovCiBzdHJ1Y3Qgd2F2ZWZvcm1fcHJpdmF0ZSB7CiAJc3RydWN0IHRpbWVyX2xpc3QgYWlfdGltZXI7CS8qIHRpbWVyIGZvciBBSSBjb21tYW5kcyAqLwpAQCAtNjgsNyArNjMsNiBAQAogCXVuc2lnbmVkIGludCB3Zl9hbXBsaXR1ZGU7CS8qIHdhdmVmb3JtIGFtcGxpdHVkZSBpbiBtaWNyb3ZvbHRzICovCiAJdW5zaWduZWQgaW50IHdmX3BlcmlvZDsJCS8qIHdhdmVmb3JtIHBlcmlvZCBpbiBtaWNyb3NlY29uZHMgKi8KIAl1bnNpZ25lZCBpbnQgd2ZfY3VycmVudDsJLyogY3VycmVudCB0aW1lIGluIHdhdmVmb3JtIHBlcmlvZCAqLwotCXVuc2lnbmVkIGxvbmcgc3RhdGVfYml0czsKIAl1bnNpZ25lZCBpbnQgYWlfc2Nhbl9wZXJpb2Q7CS8qIEFJIHNjYW4gcGVyaW9kIGluIHVzZWMgKi8KIAl1bnNpZ25lZCBpbnQgYWlfY29udmVydF9wZXJpb2Q7CS8qIEFJIGNvbnZlcnNpb24gcGVyaW9kIGluIHVzZWMgKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCBhb190aW1lcjsJLyogdGltZXIgZm9yIEFPIGNvbW1hbmRzICovCkBAIC0xOTEsMTAgKzE4NSw2IEBACiAJdW5zaWduZWQgaW50IG5zYW1wbGVzOwogCXVuc2lnbmVkIGludCB0aW1lX2luY3JlbWVudDsKIAotCS8qIGNoZWNrIGNvbW1hbmQgaXMgc3RpbGwgYWN0aXZlICovCi0JaWYgKCF0ZXN0X2JpdChXQVZFRk9STV9BSV9SVU5OSU5HLCAmZGV2cHJpdi0+c3RhdGVfYml0cykpCi0JCXJldHVybjsKLQogCW5vdyA9IGt0aW1lX3RvX3VzKGt0aW1lX2dldCgpKTsKIAluc2FtcGxlcyA9IGNvbWVkaV9uc2FtcGxlc19sZWZ0KHMsIFVJTlRfTUFYKTsKIApAQCAtMzg2LDExICszNzYsNiBAQAogCSAqLwogCWRldnByaXYtPmFpX3RpbWVyLmV4cGlyZXMgPQogCQlqaWZmaWVzICsgdXNlY3NfdG9famlmZmllcyhkZXZwcml2LT5haV9jb252ZXJ0X3BlcmlvZCkgKyAxOwotCi0JLyogbWFyayBjb21tYW5kIGFzIGFjdGl2ZSAqLwotCXNtcF9tYl9fYmVmb3JlX2F0b21pYygpOwotCXNldF9iaXQoV0FWRUZPUk1fQUlfUlVOTklORywgJmRldnByaXYtPnN0YXRlX2JpdHMpOwotCXNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7CiAJYWRkX3RpbWVyKCZkZXZwcml2LT5haV90aW1lcik7CiAJcmV0dXJuIDA7CiB9CkBAIC00MDAsMTEgKzM4NSwxMiBAQAogewogCXN0cnVjdCB3YXZlZm9ybV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCi0JLyogbWFyayBjb21tYW5kIGFzIG5vIGxvbmdlciBhY3RpdmUgKi8KLQljbGVhcl9iaXQoV0FWRUZPUk1fQUlfUlVOTklORywgJmRldnByaXYtPnN0YXRlX2JpdHMpOwotCXNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7Ci0JLyogY2Fubm90IGNhbGwgZGVsX3RpbWVyX3N5bmMoKSBhcyBtYXkgYmUgY2FsbGVkIGZyb20gdGltZXIgcm91dGluZSAqLwotCWRlbF90aW1lcigmZGV2cHJpdi0+YWlfdGltZXIpOworCWlmIChpbl9zb2Z0aXJxKCkpIHsKKwkJLyogQXNzdW1lIHdlIHdlcmUgY2FsbGVkIGZyb20gdGhlIHRpbWVyIHJvdXRpbmUgaXRzZWxmLiAqLworCQlkZWxfdGltZXIoJmRldnByaXYtPmFpX3RpbWVyKTsKKwl9IGVsc2UgeworCQlkZWxfdGltZXJfc3luYygmZGV2cHJpdi0+YWlfdGltZXIpOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDM2LDEwICs0MjIsNiBAQAogCXU2NCBzY2Fuc19zaW5jZTsKIAl1bnNpZ25lZCBpbnQgc2NhbnNfYXZhaWwgPSAwOwogCi0JLyogY2hlY2sgY29tbWFuZCBpcyBzdGlsbCBhY3RpdmUgKi8KLQlpZiAoIXRlc3RfYml0KFdBVkVGT1JNX0FPX1JVTk5JTkcsICZkZXZwcml2LT5zdGF0ZV9iaXRzKSkKLQkJcmV0dXJuOwotCiAJLyogZGV0ZXJtaW5lIG51bWJlciBvZiBzY2FuIHBlcmlvZHMgc2luY2UgbGFzdCB0aW1lICovCiAJbm93ID0ga3RpbWVfdG9fdXMoa3RpbWVfZ2V0KCkpOwogCXNjYW5zX3NpbmNlID0gbm93IC0gZGV2cHJpdi0+YW9fbGFzdF9zY2FuX3RpbWU7CkBAIC01MTgsMTEgKzUwMCw2IEBACiAJZGV2cHJpdi0+YW9fbGFzdF9zY2FuX3RpbWUgPSBrdGltZV90b191cyhrdGltZV9nZXQoKSk7CiAJZGV2cHJpdi0+YW9fdGltZXIuZXhwaXJlcyA9CiAJCWppZmZpZXMgKyB1c2Vjc190b19qaWZmaWVzKGRldnByaXYtPmFvX3NjYW5fcGVyaW9kKTsKLQotCS8qIG1hcmsgY29tbWFuZCBhcyBhY3RpdmUgKi8KLQlzbXBfbWJfX2JlZm9yZV9hdG9taWMoKTsKLQlzZXRfYml0KFdBVkVGT1JNX0FPX1JVTk5JTkcsICZkZXZwcml2LT5zdGF0ZV9iaXRzKTsKLQlzbXBfbWJfX2FmdGVyX2F0b21pYygpOwogCWFkZF90aW1lcigmZGV2cHJpdi0+YW9fdGltZXIpOwogCiAJcmV0dXJuIDE7CkBAIC02MDgsMTEgKzU4NSwxMiBAQAogCXN0cnVjdCB3YXZlZm9ybV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCiAJcy0+YXN5bmMtPmludHRyaWcgPSBOVUxMOwotCS8qIG1hcmsgY29tbWFuZCBhcyBubyBsb25nZXIgYWN0aXZlICovCi0JY2xlYXJfYml0KFdBVkVGT1JNX0FPX1JVTk5JTkcsICZkZXZwcml2LT5zdGF0ZV9iaXRzKTsKLQlzbXBfbWJfX2FmdGVyX2F0b21pYygpOwotCS8qIGNhbm5vdCBjYWxsIGRlbF90aW1lcl9zeW5jKCkgYXMgbWF5IGJlIGNhbGxlZCBmcm9tIHRpbWVyIHJvdXRpbmUgKi8KLQlkZWxfdGltZXIoJmRldnByaXYtPmFvX3RpbWVyKTsKKwlpZiAoaW5fc29mdGlycSgpKSB7CisJCS8qIEFzc3VtZSB3ZSB3ZXJlIGNhbGxlZCBmcm9tIHRoZSB0aW1lciByb3V0aW5lIGl0c2VsZi4gKi8KKwkJZGVsX3RpbWVyKCZkZXZwcml2LT5hb190aW1lcik7CisJfSBlbHNlIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmRldnByaXYtPmFvX3RpbWVyKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXFib2FyZDIwMDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXFib2FyZDIwMDAuYwppbmRleCA2NWRhZWYwLi4wZjRlYjk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFxYm9hcmQyMDAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhcWJvYXJkMjAwMC5jCkBAIC02MzQsNyArNjM0LDcgQEAKIAljb25zdCBzdHJ1Y3QgZGFxMjAwX2JvYXJkdHlwZSAqYm9hcmQ7CiAJaW50IGk7CiAKLQlpZiAocGNpZGV2LT5zdWJzeXN0ZW1fZGV2aWNlICE9IFBDSV9WRU5ET1JfSURfSU9URUNIKQorCWlmIChwY2lkZXYtPnN1YnN5c3RlbV92ZW5kb3IgIT0gUENJX1ZFTkRPUl9JRF9JT1RFQ0gpCiAJCXJldHVybiBOVUxMOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYm9hcmR0eXBlcyk7IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczA4X2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMDhfY3MuYwppbmRleCA5YzAyYjE3Li4zMTdhOWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMDhfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMDhfY3MuYwpAQCAtMSw0MyArMSw0MiBAQAogLyoKLSAgICBjb21lZGkvZHJpdmVycy9kYXMwOF9jcy5jCi0gICAgREFTMDggZHJpdmVyCisgKiBDb21lZGkgZHJpdmVyIGZvciBEQVMwMDggUENNQ0lBIGJvYXJkcworICoKKyAqIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyLDIwMDMgRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBQQ01DSUEgc3VwcG9ydCBjb2RlIGZvciB0aGlzIGRyaXZlciBpcyBhZGFwdGVkIGZyb20gdGhlIGR1bW15X2NzLmMKKyAqIGRyaXZlciBvZiB0aGUgTGludXggUENNQ0lBIENhcmQgU2VydmljZXMgcGFja2FnZS4KKyAqCisgKiBUaGUgaW5pdGlhbCBkZXZlbG9wZXIgb2YgdGhlIG9yaWdpbmFsIGNvZGUgaXMgRGF2aWQgQS4gSGluZHMKKyAqIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uICBQb3J0aW9ucyBjcmVhdGVkIGJ5IERhdmlkIEEuIEhpbmRzCisgKiBhcmUgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIEhpbmRzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLwogCi0gICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQotICAgIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KLSAgICBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiwyMDAzIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgUENNQ0lBIHN1cHBvcnQgY29kZSBmb3IgdGhpcyBkcml2ZXIgaXMgYWRhcHRlZCBmcm9tIHRoZSBkdW1teV9jcy5jCi0gICAgZHJpdmVyIG9mIHRoZSBMaW51eCBQQ01DSUEgQ2FyZCBTZXJ2aWNlcyBwYWNrYWdlLgotCi0gICAgVGhlIGluaXRpYWwgZGV2ZWxvcGVyIG9mIHRoZSBvcmlnaW5hbCBjb2RlIGlzIERhdmlkIEEuIEhpbmRzCi0gICAgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0Pi4gIFBvcnRpb25zIGNyZWF0ZWQgYnkgRGF2aWQgQS4gSGluZHMKLSAgICBhcmUgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIEhpbmRzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSovCiAvKgotRHJpdmVyOiBkYXMwOF9jcwotRGVzY3JpcHRpb246IERBUy0wOCBQQ01DSUEgYm9hcmRzCi1BdXRob3I6IFdhcnJlbiBKYXNwZXIsIGRzLCBGcmFuayBIZXNzCi1EZXZpY2VzOiBbQ29tcHV0ZXJCb2FyZHNdIFBDTS1EQVMwOCAocGNtLWRhczA4KQotU3RhdHVzOiB3b3JrcwotCi1UaGlzIGlzIHRoZSBQQ01DSUEtc3BlY2lmaWMgc3VwcG9ydCBzcGxpdCBvZmYgZnJvbSB0aGUKLWRhczA4IGRyaXZlci4KLQotT3B0aW9ucyAoZm9yIHBjbS1kYXMwOCk6Ci0JTk9ORQotCi1Db21tYW5kIHN1cHBvcnQgZG9lcyBub3QgZXhpc3QsIGJ1dCBjb3VsZCBiZSBhZGRlZCBmb3IgdGhpcyBib2FyZC4KLSovCisgKiBEcml2ZXI6IGRhczA4X2NzCisgKiBEZXNjcmlwdGlvbjogREFTLTA4IFBDTUNJQSBib2FyZHMKKyAqIEF1dGhvcjogV2FycmVuIEphc3BlciwgZHMsIEZyYW5rIEhlc3MKKyAqIERldmljZXM6IFtDb21wdXRlckJvYXJkc10gUENNLURBUzA4IChwY20tZGFzMDgpCisgKiBTdGF0dXM6IHdvcmtzCisgKgorICogVGhpcyBpcyB0aGUgUENNQ0lBLXNwZWNpZmljIHN1cHBvcnQgc3BsaXQgb2ZmIGZyb20gdGhlCisgKiBkYXMwOCBkcml2ZXIuCisgKgorICogQ29uZmlndXJhdGlvbiBPcHRpb25zOiBub25lLCB1c2VzIFBDTUNJQSBhdXRvIGNvbmZpZworICoKKyAqIENvbW1hbmQgc3VwcG9ydCBkb2VzIG5vdCBleGlzdCwgYnV0IGNvdWxkIGJlIGFkZGVkIGZvciB0aGlzIGJvYXJkLgorICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxMS5jCmluZGV4IDkwNGY2Mzc3Li5mY2Q4NTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxMS5jCkBAIC05NiwxMSArOTYsMTEgQEAKICAqICAgIDYgICAgICA2ICAgICAgMTAwIGtIegkgNiAgIDEwMDAwMDAKICAqICAgIDcgICAgIDEyICAgICAgIDUwIGtIegkgNyAgIDEwMDAwMDAwCiAgKi8KLWNvbnN0IHVuc2lnbmVkIGludCBkdDI4MTFfY2xrX2RpdmlkZXJzW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR0MjgxMV9jbGtfZGl2aWRlcnNbXSA9IHsKIAkxLCAxMCwgMiwgMywgNCwgNSwgNiwgMTIKIH07CiAKLWNvbnN0IHVuc2lnbmVkIGludCBkdDI4MTFfY2xrX211bHRpcGxpZXJzW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR0MjgxMV9jbGtfbXVsdGlwbGllcnNbXSA9IHsKIAkxLCAxMCwgMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCAxMDAwMDAwLCAxMDAwMDAwMAogfTsKIApAQCAtNTg4LDggKzU4OCw4IEBACiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMF07CiAJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9BSTsKIAlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfUkVBREFCTEUgfAotCQkJICAoaXQtPm9wdGlvbnNbMl0gPT0gMSkgPyBTREZfRElGRiA6Ci0JCQkgIChpdC0+b3B0aW9uc1syXSA9PSAyKSA/IFNERl9DT01NT04gOiBTREZfR1JPVU5EOworCQkJICAoKGl0LT5vcHRpb25zWzJdID09IDEpID8gU0RGX0RJRkYgOgorCQkJICAgKGl0LT5vcHRpb25zWzJdID09IDIpID8gU0RGX0NPTU1PTiA6IFNERl9HUk9VTkQpOwogCXMtPm5fY2hhbgk9IChpdC0+b3B0aW9uc1syXSA9PSAxKSA/IDggOiAxNjsKIAlzLT5tYXhkYXRhCT0gMHgwZmZmOwogCXMtPnJhbmdlX3RhYmxlCT0gYm9hcmQtPmlzX3BnaCA/ICZkdDI4MTFfcGdoX2FpX3JhbmdlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0OTgxMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0OTgxMi5jCmluZGV4IDMyOTViYjQuLjdlYmNhODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDk4MTIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQ5ODEyLmMKQEAgLTY2MCwxMiArNjYwLDEyIEBACiAJCWNhc2UgMToKIAkJCWRpciA9IFVTQl9ESVJfT1VUOwogCQkJZGV2cHJpdi0+Y21kX3dyLmFkZHIgPSBlcC0+YkVuZHBvaW50QWRkcmVzczsKLQkJCWRldnByaXYtPmNtZF93ci5zaXplID0gbGUxNl90b19jcHUoZXAtPndNYXhQYWNrZXRTaXplKTsKKwkJCWRldnByaXYtPmNtZF93ci5zaXplID0gdXNiX2VuZHBvaW50X21heHAoZXApOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKIAkJCWRpciA9IFVTQl9ESVJfSU47CiAJCQlkZXZwcml2LT5jbWRfcmQuYWRkciA9IGVwLT5iRW5kcG9pbnRBZGRyZXNzOwotCQkJZGV2cHJpdi0+Y21kX3JkLnNpemUgPSBsZTE2X3RvX2NwdShlcC0+d01heFBhY2tldFNpemUpOworCQkJZGV2cHJpdi0+Y21kX3JkLnNpemUgPSB1c2JfZW5kcG9pbnRfbWF4cChlcCk7CiAJCQlicmVhazsKIAkJY2FzZSAzOgogCQkJLyogdW51c2VkIHdyaXRlIHN0cmVhbSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZ3NjX2hwZGkuYwppbmRleCBhZjRiNDE3Li5lNWI5NDg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZ3NjX2hwZGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZ3NjX2hwZGkuYwpAQCAtNTgyLDcgKzU4Miw3IEBACiAJYml0cyB8PSBQTFhfRE1BTU9ERV9ERU1BTkQ7CiAJLyogZW5hYmxlIGxvY2FsIGJ1cnN0IG1vZGUgKi8KIAliaXRzIHw9IFBMWF9ETUFNT0RFX0JVUlNURU47Ci0JYml0cyB8PSBQTFhfRE1BTU9ERV9XSURUSDMyOworCWJpdHMgfD0gUExYX0RNQU1PREVfV0lEVEhfMzI7CiAJd3JpdGVsKGJpdHMsIHBseF9pb2Jhc2UgKyBQTFhfUkVHX0RNQU1PREUwKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMKaW5kZXggNmM0ZmYwMi4uNzAzOTBkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5jCkBAIC0xNDEsNyArMTQxLDcgQEAKIHsKIAlpbnQgaTsKIAotCW51bSAmPSAweDAwMGY7CQkvKiAgTWFrZSBzdXJlIHRoYXQgMCA8PSBudW0gPD0gMTUgKi8KKwludW0gJj0gMHgwMDBmOwkJLyogTWFrZSBzdXJlIHRoYXQgMCA8PSBudW0gPD0gMTUgKi8KIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAJCXNldF91MTYoJmNoYW5uZWwtPnRyYW5zZm9ybXNbbnVtXS5saW5rW2ldLmxpbmtfdHlwZSwKIAkJCXRyYW5zZi5saW5rW2ldLmxpbmtfdHlwZSk7CkBAIC0zMjMsMTAgKzMyMywxMCBAQAogCWludCB2YWx1ZTsKIAogCWlmIChwb3MgJiYgdmFsKSB7Ci0JCS8qICBTa2lwIG92ZXIgbm9uIGhleCAqLworCQkvKiBTa2lwIG92ZXIgbm9uIGhleCAqLwogCQlmb3IgKDsgKnBvcyA8IHNpemUgJiYgIWlzeGRpZ2l0KGRhdGFbKnBvc10pOyAoKnBvcykrKykKIAkJCTsKLQkJLyogIENvbGxlY3QgdmFsdWUgKi8KKwkJLyogQ29sbGVjdCB2YWx1ZSAqLwogCQkqdmFsID0gMDsKIAkJZm9yICg7ICpwb3MgPCBzaXplOyAoKnBvcykrKykgewogCQkJdmFsdWUgPSBoZXhfdG9fYmluKGRhdGFbKnBvc10pOwpAQCAtNDQ4LDcgKzQ0OCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QganIzX3BjaV9wb2xsX2RlbGF5IGpyM19wY2lfcG9sbF9zdWJkZXZpY2Uoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCitzdGF0aWMgc3RydWN0IGpyM19wY2lfcG9sbF9kZWxheQoranIzX3BjaV9wb2xsX3N1YmRldmljZShzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqc3ByaXYgPSBzLT5wcml2YXRlOwogCXN0cnVjdCBqcjNfcGNpX3BvbGxfZGVsYXkgcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDEwMDAsIDIwMDApOwpAQCAtNzMzLDEzICs3MzQsMTMgQEAKIAkJfQogCX0KIAotCS8qICBSZXNldCBEU1AgY2FyZCAqLworCS8qIFJlc2V0IERTUCBjYXJkICovCiAJd3JpdGVsKDAsICZkZXZwcml2LT5pb2Jhc2UtPmNoYW5uZWxbMF0ucmVzZXQpOwogCiAJcmV0ID0gY29tZWRpX2xvYWRfZmlybXdhcmUoZGV2LCAmY29tZWRpX3RvX3BjaV9kZXYoZGV2KS0+ZGV2LAogCQkJCSAgICJjb21lZGkvanIzcGNpLmlkbSIsCiAJCQkJICAganIzX2Rvd25sb2FkX2Zpcm13YXJlLCAwKTsKLQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiRmlybWFyZSBsb2FkICVkXG4iLCByZXQpOworCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJGaXJtd2FyZSBsb2FkICVkXG4iLCByZXQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCS8qCkBAIC03NjMsNyArNzY0LDcgQEAKIAkJCQlkYXRhLmNvcHlyaWdodFtpXSkgPj4gOCk7CiAJfQogCi0JLyogIFN0YXJ0IGNhcmQgdGltZXIgKi8KKwkvKiBTdGFydCBjYXJkIHRpbWVyICovCiAJZm9yIChpID0gMDsgaSA8IGRldi0+bl9zdWJkZXZpY2VzOyBpKyspIHsKIAkJcyA9ICZkZXYtPnN1YmRldmljZXNbaV07CiAJCXNwcml2ID0gcy0+cHJpdmF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5oCmluZGV4IDM1NjgxMWQuLmYxMGE4NGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuaApAQCAtMSw0ICsxLDUgQEAKLS8qIEhlbHBlciB0eXBlcyB0byB0YWtlIGNhcmUgb2YgdGhlIGZhY3QgdGhhdCB0aGUgRFNQIGNhcmQgbWVtb3J5CisvKgorICogSGVscGVyIHR5cGVzIHRvIHRha2UgY2FyZSBvZiB0aGUgZmFjdCB0aGF0IHRoZSBEU1AgY2FyZCBtZW1vcnkKICAqIGlzIDE2IGJpdHMsIGJ1dCBhbGlnbmVkIG9uIGEgMzIgYml0IFBDSSBib3VuZGFyeQogICovCiAKQEAgLTIyLDcgKzIzLDggQEAKIAl3cml0ZWwodmFsLCBwKTsKIH0KIAotLyogVGhlIHJhdyBkYXRhIGlzIHN0b3JlZCBpbiBhIGZvcm1hdCB3aGljaCBmYWNpbGl0YXRlcyByYXBpZAorLyoKKyAqIFRoZSByYXcgZGF0YSBpcyBzdG9yZWQgaW4gYSBmb3JtYXQgd2hpY2ggZmFjaWxpdGF0ZXMgcmFwaWQKICAqIHByb2Nlc3NpbmcgYnkgdGhlIEpSMyBEU1AgY2hpcC4gVGhlIHJhd19jaGFubmVsIHN0cnVjdHVyZSBzaG93cyB0aGUKICAqIGZvcm1hdCBmb3IgYSBzaW5nbGUgY2hhbm5lbCBvZiBkYXRhLiBFYWNoIGNoYW5uZWwgdGFrZXMgZm91ciwKICAqIHR3by1ieXRlIHdvcmRzLgpAQCAtNDcsNyArNDksOCBAQAogCXMzMiByZXNlcnZlZFsyXTsKIH07CiAKLS8qIFRoZSBmb3JjZV9hcnJheSBzdHJ1Y3R1cmUgc2hvd3MgdGhlIGxheW91dCBmb3IgdGhlIGRlY291cGxlZCBhbmQKKy8qCisgKiBUaGUgZm9yY2VfYXJyYXkgc3RydWN0dXJlIHNob3dzIHRoZSBsYXlvdXQgZm9yIHRoZSBkZWNvdXBsZWQgYW5kCiAgKiBmaWx0ZXJlZCBmb3JjZSBkYXRhLgogICovCiBzdHJ1Y3QgZm9yY2VfYXJyYXkgewpAQCAtNjEsNyArNjQsOCBAQAogCXMzMiB2MjsKIH07CiAKLS8qIFRoZSBzaXhfYXhpc19hcnJheSBzdHJ1Y3R1cmUgc2hvd3MgdGhlIGxheW91dCBmb3IgdGhlIG9mZnNldHMgYW5kCisvKgorICogVGhlIHNpeF9heGlzX2FycmF5IHN0cnVjdHVyZSBzaG93cyB0aGUgbGF5b3V0IGZvciB0aGUgb2Zmc2V0cyBhbmQKICAqIHRoZSBmdWxsIHNjYWxlcy4KICAqLwogc3RydWN0IHNpeF9heGlzX2FycmF5IHsKQEAgLTc0LDcgKzc4LDggQEAKIH07CiAKIC8qIFZFQ1RfQklUUyAqLwotLyogVGhlIHZlY3RfYml0cyBzdHJ1Y3R1cmUgc2hvd3MgdGhlIGxheW91dCBmb3IgaW5kaWNhdGluZworLyoKKyAqIFRoZSB2ZWN0X2JpdHMgc3RydWN0dXJlIHNob3dzIHRoZSBsYXlvdXQgZm9yIGluZGljYXRpbmcKICAqIHdoaWNoIGF4ZXMgdG8gdXNlIGluIGNvbXB1dGluZyB0aGUgdmVjdG9ycy4gRWFjaCBiaXQgc2lnbmlmaWVzCiAgKiBzZWxlY3Rpb24gb2YgYSBzaW5nbGUgYXhpcy4gVGhlIFYxeCBheGlzIGJpdCBjb3JyZXNwb25kcyB0byBhIGhleAogICogdmFsdWUgb2YgMHgwMDAxIGFuZCB0aGUgVjJ6IGJpdCBjb3JyZXNwb25kcyB0byBhIGhleCB2YWx1ZSBvZgpAQCAtMTAwLDEyICsxMDUsMTQgQEAKIH07CiAKIC8qIFdBUk5JTkdfQklUUyAqLwotLyogVGhlIHdhcm5pbmdfYml0cyBzdHJ1Y3R1cmUgc2hvd3MgdGhlIGJpdCBwYXR0ZXJuIGZvciB0aGUgd2FybmluZworLyoKKyAqIFRoZSB3YXJuaW5nX2JpdHMgc3RydWN0dXJlIHNob3dzIHRoZSBiaXQgcGF0dGVybiBmb3IgdGhlIHdhcm5pbmcKICAqIHdvcmQuIFRoZSBiaXQgZmllbGRzIGFyZSBzaG93biBmcm9tIGJpdCAwIChsc2IpIHRvIGJpdCAxNSAobXNiKS4KICAqLwogCi0vKiAgWFhfTkVBUl9TRVQgKi8KLS8qIFRoZSB4eF9uZWFyX3NhdCBiaXRzIHNpZ25pZnkgdGhhdCB0aGUgaW5kaWNhdGVkIGF4aXMgaGFzIHJlYWNoZWQgb3IKKy8qIFhYX05FQVJfU0VUICovCisvKgorICogVGhlIHh4X25lYXJfc2F0IGJpdHMgc2lnbmlmeSB0aGF0IHRoZSBpbmRpY2F0ZWQgYXhpcyBoYXMgcmVhY2hlZCBvcgogICogZXhjZWVkZWQgdGhlIG5lYXIgc2F0dXJhdGlvbiB2YWx1ZS4KICAqLwogCkBAIC0xMTgsMTIgKzEyNSwxMyBAQAogCW16X25lYXJfc2F0ID0gMHgwMDIwCiB9OwogCi0vKiAgRVJST1JfQklUUyAqLwotLyogIFhYX1NBVCAqLwotLyogIE1FTU9SWV9FUlJPUiAqLwotLyogIFNFTlNPUl9DSEFOR0UgKi8KKy8qIEVSUk9SX0JJVFMgKi8KKy8qIFhYX1NBVCAqLworLyogTUVNT1JZX0VSUk9SICovCisvKiBTRU5TT1JfQ0hBTkdFICovCiAKLS8qIFRoZSBlcnJvcl9iaXRzIHN0cnVjdHVyZSBzaG93cyB0aGUgYml0IHBhdHRlcm4gZm9yIHRoZSBlcnJvciB3b3JkLgorLyoKKyAqIFRoZSBlcnJvcl9iaXRzIHN0cnVjdHVyZSBzaG93cyB0aGUgYml0IHBhdHRlcm4gZm9yIHRoZSBlcnJvciB3b3JkLgogICogVGhlIGJpdCBmaWVsZHMgYXJlIHNob3duIGZyb20gYml0IDAgKGxzYikgdG8gYml0IDE1IChtc2IpLiBUaGUKICAqIHh4X3NhdCBiaXRzIHNpZ25pZnkgdGhhdCB0aGUgaW5kaWNhdGVkIGF4aXMgaGFzIHJlYWNoZWQgb3IgZXhjZWVkZWQKICAqIHRoZSBzYXR1cmF0aW9uIHZhbHVlLiBUaGUgbWVtb3J5X2Vycm9yIGJpdCBpbmRpY2F0ZXMgdGhhdCBhIHByb2JsZW0KQEAgLTEzNCw5ICsxNDIsMTAgQEAKICAqCiAgKi8KIAotLyogIFNZU1RFTV9CVVNZICovCisvKiBTWVNURU1fQlVTWSAqLwogCi0vKiBUaGUgc3lzdGVtX2J1c3kgYml0IGluZGljYXRlcyB0aGF0IHRoZSBKUjMgRFNQIGlzIGN1cnJlbnRseSBidXN5CisvKgorICogVGhlIHN5c3RlbV9idXN5IGJpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgSlIzIERTUCBpcyBjdXJyZW50bHkgYnVzeQogICogYW5kIGlzIG5vdCBjYWxjdWxhdGluZyBmb3JjZSBkYXRhLiBUaGlzIG9jY3VycyB3aGVuIGEgbmV3CiAgKiBjb29yZGluYXRlIHRyYW5zZm9ybWF0aW9uLCBvciBuZXcgc2Vuc29yIGZ1bGwgc2NhbGUgaXMgc2V0IGJ5IHRoZQogICogdXNlci4gQSB2ZXJ5IGZhc3Qgc3lzdGVtIHVzaW5nIHRoZSBmb3JjZSBkYXRhIGZvciBmZWVkYmFjayBtaWdodApAQCAtMTQ2LDkgKzE1NSwxMCBAQAogICogY2FsaWJyYXRpb24gQ1JDLgogICovCiAKLS8qICBDQUxfQ1JDX0JBRCAqLworLyogQ0FMX0NSQ19CQUQgKi8KIAotLyogVGhlIGNhbF9jcmNfYmFkIGJpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsaWJyYXRpb24gQ1JDIGhhcyBub3QKKy8qCisgKiBUaGUgY2FsX2NyY19iYWQgYml0IGluZGljYXRlcyB0aGF0IHRoZSBjYWxpYnJhdGlvbiBDUkMgaGFzIG5vdAogICogY2FsY3VsYXRlZCB0byB6ZXJvLiBDUkMgaXMgc2hvcnQgZm9yIGN5Y2xpYyByZWR1bmRhbmN5IGNvZGUuIEl0IGlzCiAgKiBhIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgdGhlIGludGVncml0eSBvZiBtZXNzYWdlcyBpbiBkYXRhCiAgKiBjb21tdW5pY2F0aW9uLiBUaGUgY2FsaWJyYXRpb24gZGF0YSBzdG9yZWQgaW5zaWRlIHRoZSBzZW5zb3IgaXMKQEAgLTE2OCw3ICsxNzgsOCBAQAogLyogV0FUQ0hfRE9HICovCiAvKiBXQVRDSF9ET0cyICovCiAKLS8qIFRoZSB3YXRjaF9kb2cgYW5kIHdhdGNoX2RvZzIgYml0cyBhcmUgc2Vuc29yLCBub3QgcHJvY2Vzc29yLCB3YXRjaAorLyoKKyAqIFRoZSB3YXRjaF9kb2cgYW5kIHdhdGNoX2RvZzIgYml0cyBhcmUgc2Vuc29yLCBub3QgcHJvY2Vzc29yLCB3YXRjaAogICogZG9nIGJpdHMuIFdhdGNoX2RvZyBpbmRpY2F0ZXMgdGhhdCB0aGUgc2Vuc29yIGRhdGEgbGluZSBzZWVtcyB0byBiZQogICogYWN0aW5nIGNvcnJlY3RseSwgd2hpbGUgd2F0Y2hfZG9nMiBpbmRpY2F0ZXMgdGhhdCBzZW5zb3IgZGF0YSBhbmQKICAqIGNsb2NrIGFyZSBiZWluZyByZWNlaXZlZC4gSXQgaXMgcG9zc2libGUgZm9yIHdhdGNoX2RvZzIgdG8gZ28gb2ZmCkBAIC0xOTIsOSArMjAzLDEwIEBACiAJd2F0Y2hfZG9nID0gMHg4MDAwCiB9OwogCi0vKiAgVEhSRVNIX1NUUlVDVCAqLworLyogVEhSRVNIX1NUUlVDVCAqLwogCi0vKiBUaGlzIHN0cnVjdHVyZSBzaG93cyB0aGUgbGF5b3V0IGZvciBhIHNpbmdsZSB0aHJlc2hvbGQgcGFja2V0IGluc2lkZSBvZiBhCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgc2hvd3MgdGhlIGxheW91dCBmb3IgYSBzaW5nbGUgdGhyZXNob2xkIHBhY2tldCBpbnNpZGUgb2YgYQogICogbG9hZCBlbnZlbG9wZS4gRWFjaCBsb2FkIGVudmVsb3BlIGNhbiBjb250YWluIHNldmVyYWwgdGhyZXNob2xkIHN0cnVjdHVyZXMuCiAgKiAxLiBkYXRhX2FkZHJlc3MgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgZm9yIHRoYXQgdGhyZXNob2xkLiBUaGlzCiAgKiAgICBpbmNsdWRlcyBmaWx0ZXJlZCwgdW5maWx0ZXJlZCwgcmF3LCByYXRlLCBjb3VudGVycywgZXJyb3IgYW5kIHdhcm5pbmcgZGF0YQpAQCAtMjEwLDkgKzIyMiwxMCBAQAogCXMzMiBiaXRfcGF0dGVybjsKIH07CiAKLS8qICBMRV9TVFJVQ1QgKi8KKy8qIExFX1NUUlVDVCAqLwogCi0vKiBMYXlvdXQgb2YgYSBsb2FkIGVudmVsb3BlZCBwYWNrZXQuIEZvdXIgdGhyZXNob2xkcyBhcmUgc2hvd2VkIC4uLiBmb3IgbW9yZQorLyoKKyAqIExheW91dCBvZiBhIGxvYWQgZW52ZWxvcGVkIHBhY2tldC4gRm91ciB0aHJlc2hvbGRzIGFyZSBzaG93ZWQgLi4uIGZvciBtb3JlCiAgKiBzZWUgbWFudWFsIChwYWcuMjUpCiAgKiAxLiBsYXRjaF9iaXRzIGlzIGEgYml0IHBhdHRlcm4gdGhhdCBzaG93IHdoaWNoIGJpdHMgdGhlIHVzZXIgd2FudHMgdG8gbGF0Y2guCiAgKiAgICBUaGUgbGF0Y2hlZCBiaXRzIHdpbGwgbm90IGJlIHJlc2V0IG9uY2UgdGhlIHRocmVzaG9sZCB3aGljaCBzZXQgdGhlbSBpcwpAQCAtMjI4LDggKzI0MSw5IEBACiAJczMyIHJlc2VydmVkOwogfTsKIAotLyogIExJTktfVFlQRVMgKi8KLS8qIExpbmsgdHlwZXMgaXMgYW4gZW51bWVyYXRlZCB2YWx1ZSBzaG93aW5nIHRoZSBkaWZmZXJlbnQgcG9zc2libGUgdHJhbnNmb3JtCisvKiBMSU5LX1RZUEVTICovCisvKgorICogTGluayB0eXBlcyBpcyBhbiBlbnVtZXJhdGVkIHZhbHVlIHNob3dpbmcgdGhlIGRpZmZlcmVudCBwb3NzaWJsZSB0cmFuc2Zvcm0KICAqIGxpbmsgdHlwZXMuCiAgKiAwIC0gZW5kIHRyYW5zZm9ybSBwYWNrZXQKICAqIDEgLSB0cmFuc2xhdGUgYWxvbmcgWCBheGlzIChUWCkKQEAgLTI1Miw4ICsyNjYsOCBAQAogCW5lZwogfTsKIAotLyogIFRSQU5TRk9STSAqLwotLyogIFN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGEgdHJhbnNmb3JtLiAqLworLyogVFJBTlNGT1JNICovCisvKiBTdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIHRyYW5zZm9ybS4gKi8KIHN0cnVjdCBpbnRlcm5fdHJhbnNmb3JtIHsKIAlzdHJ1Y3QgewogCQl1MzIgbGlua190eXBlOwpAQCAtMjYxLDIzICsyNzUsMjkgQEAKIAl9IGxpbmtbOF07CiB9OwogCi0vKiAgSlIzIGZvcmNlL3RvcnF1ZSBzZW5zb3IgZGF0YSBkZWZpbml0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgc2Vuc29yCi0gKiAgYW5kIGhhcmR3YXJlIG1hbnVhbHMuCisvKgorICogSlIzIGZvcmNlL3RvcnF1ZSBzZW5zb3IgZGF0YSBkZWZpbml0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgc2Vuc29yCisgKiBhbmQgaGFyZHdhcmUgbWFudWFscy4KICAqLwogCiBzdHJ1Y3QganIzX2NoYW5uZWwgewotCS8qICBSYXdfY2hhbm5lbHMgaXMgdGhlIGFyZWEgdXNlZCB0byBzdG9yZSB0aGUgcmF3IGRhdGEgY29taW5nIGZyb20gKi8KLQkvKiAgdGhlIHNlbnNvci4gKi8KKwkvKgorCSAqIFJhd19jaGFubmVscyBpcyB0aGUgYXJlYSB1c2VkIHRvIHN0b3JlIHRoZSByYXcgZGF0YSBjb21pbmcgZnJvbQorCSAqIHRoZSBzZW5zb3IuCisJICovCiAKIAlzdHJ1Y3QgcmF3X2NoYW5uZWwgcmF3X2NoYW5uZWxzWzE2XTsJLyogb2Zmc2V0IDB4MDAwMCAqLwogCi0JLyogIENvcHlyaWdodCBpcyBhIG51bGwgdGVybWluYXRlZCBBU0NJSSBzdHJpbmcgY29udGFpbmluZyB0aGUgSlIzICovCi0JLyogIGNvcHlyaWdodCBub3RpY2UuICovCisJLyoKKwkgKiBDb3B5cmlnaHQgaXMgYSBudWxsIHRlcm1pbmF0ZWQgQVNDSUkgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIEpSMworCSAqIGNvcHlyaWdodCBub3RpY2UuCisJICovCiAKIAl1MzIgY29weXJpZ2h0WzB4MDAxOF07CS8qIG9mZnNldCAweDAwNDAgKi8KIAlzMzIgcmVzZXJ2ZWQxWzB4MDAwOF07CS8qIG9mZnNldCAweDAwNTggKi8KIAotCS8qIFNodW50cyBjb250YWlucyB0aGUgc2Vuc29yIHNodW50IHJlYWRpbmdzLiBTb21lIEpSMyBzZW5zb3JzIGhhdmUKKwkvKgorCSAqIFNodW50cyBjb250YWlucyB0aGUgc2Vuc29yIHNodW50IHJlYWRpbmdzLiBTb21lIEpSMyBzZW5zb3JzIGhhdmUKIAkgKiB0aGUgYWJpbGl0eSB0byBoYXZlIHRoZWlyIGdhaW5zIGFkanVzdGVkLiBUaGlzIGFsbG93cyB0aGUKIAkgKiBoYXJkd2FyZSBmdWxsIHNjYWxlcyB0byBiZSBhZGp1c3RlZCB0byBwb3RlbnRpYWxseSBhbGxvdwogCSAqIGJldHRlciByZXNvbHV0aW9uIG9yIGR5bmFtaWMgcmFuZ2UuIEZvciBzZW5zb3JzIHRoYXQgaGF2ZQpAQCAtMjk4LDI1ICszMTgsMjkgQEAKIAkgKiBjb21tYW5kICgxMCkgc2V0IG5ldyBmdWxsIHNjYWxlcyAocGcuIDM4KS4KIAkgKi8KIAotCXN0cnVjdCBzaXhfYXhpc19hcnJheSBzaHVudHM7CS8qIG9mZnNldCAweDAwNjAgKi8KLQlzMzIgcmVzZXJ2ZWQyWzJdOwkvKiBvZmZzZXQgMHgwMDY2ICovCisJc3RydWN0IHNpeF9heGlzX2FycmF5IHNodW50czsJCS8qIG9mZnNldCAweDAwNjAgKi8KKwlzMzIgcmVzZXJ2ZWQyWzJdOwkJCS8qIG9mZnNldCAweDAwNjYgKi8KIAotCS8qIERlZmF1bHRfRlMgY29udGFpbnMgdGhlIGZ1bGwgc2NhbGUgdGhhdCBpcyB1c2VkIGlmIHRoZSB1c2VyIGRvZXMgKi8KLQkvKiBub3Qgc2V0IGEgZnVsbCBzY2FsZS4gKi8KKwkvKgorCSAqIERlZmF1bHRfRlMgY29udGFpbnMgdGhlIGZ1bGwgc2NhbGUgdGhhdCBpcyB1c2VkIGlmIHRoZSB1c2VyIGRvZXMKKwkgKiBub3Qgc2V0IGEgZnVsbCBzY2FsZS4KKwkgKi8KIAogCXN0cnVjdCBzaXhfYXhpc19hcnJheSBkZWZhdWx0X0ZTOwkvKiBvZmZzZXQgMHgwMDY4ICovCi0JczMyIHJlc2VydmVkMzsJCS8qIG9mZnNldCAweDAwNmUgKi8KKwlzMzIgcmVzZXJ2ZWQzOwkJCQkvKiBvZmZzZXQgMHgwMDZlICovCiAKLQkvKiBMb2FkX2VudmVsb3BlX251bSBpcyB0aGUgbG9hZCBlbnZlbG9wZSBudW1iZXIgdGhhdCBpcyBjdXJyZW50bHkKKwkvKgorCSAqIExvYWRfZW52ZWxvcGVfbnVtIGlzIHRoZSBsb2FkIGVudmVsb3BlIG51bWJlciB0aGF0IGlzIGN1cnJlbnRseQogCSAqIGluIHVzZS4gVGhpcyB2YWx1ZSBpcyBzZXQgYnkgdGhlIHVzZXIgYWZ0ZXIgb25lIG9mIHRoZSBsb2FkCiAJICogZW52ZWxvcGVzIGhhcyBiZWVuIGluaXRpYWxpemVkLgogCSAqLwogCi0JczMyIGxvYWRfZW52ZWxvcGVfbnVtOwkvKiBvZmZzZXQgMHgwMDZmICovCisJczMyIGxvYWRfZW52ZWxvcGVfbnVtOwkJCS8qIG9mZnNldCAweDAwNmYgKi8KIAogCS8qIE1pbl9mdWxsX3NjYWxlIGlzIHRoZSByZWNvbW1lbmQgbWluaW11bSBmdWxsIHNjYWxlLiAqLwogCi0JLyogVGhlc2UgdmFsdWVzIGluIGNvbmp1bmN0aW9uIHdpdGggbWF4X2Z1bGxfc2NhbGUgKHBnLiA5KSBoZWxwcworCS8qCisJICogVGhlc2UgdmFsdWVzIGluIGNvbmp1bmN0aW9uIHdpdGggbWF4X2Z1bGxfc2NhbGUgKHBnLiA5KSBoZWxwcwogCSAqIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgZm9yIHNldHRpbmcgdGhlIGZ1bGwgc2NhbGVzLiBUaGUKIAkgKiBzb2Z0d2FyZSBhbGxvd3MgdGhlIHVzZXIgdG8gc2V0IHRoZSBzZW5zb3IgZnVsbCBzY2FsZSB0byBhbgogCSAqIGFyYml0cmFyeSB2YWx1ZS4gQnV0IHNldHRpbmcgdGhlIGZ1bGwgc2NhbGVzIGhhcyBzb21lIGhhemFyZHMuIElmCkBAIC0zNDIsMzAgKzM2NiwzNSBAQAogCSAqLwogCiAJc3RydWN0IHNpeF9heGlzX2FycmF5IG1pbl9mdWxsX3NjYWxlOwkvKiBvZmZzZXQgMHgwMDcwICovCi0JczMyIHJlc2VydmVkNDsJCS8qIG9mZnNldCAweDAwNzYgKi8KKwlzMzIgcmVzZXJ2ZWQ0OwkJCQkvKiBvZmZzZXQgMHgwMDc2ICovCiAKLQkvKiBUcmFuc2Zvcm1fbnVtIGlzIHRoZSB0cmFuc2Zvcm0gbnVtYmVyIHRoYXQgaXMgY3VycmVudGx5IGluIHVzZS4KKwkvKgorCSAqIFRyYW5zZm9ybV9udW0gaXMgdGhlIHRyYW5zZm9ybSBudW1iZXIgdGhhdCBpcyBjdXJyZW50bHkgaW4gdXNlLgogCSAqIFRoaXMgdmFsdWUgaXMgc2V0IGJ5IHRoZSBKUjMgRFNQIGFmdGVyIHRoZSB1c2VyIGhhcyB1c2VkIGNvbW1hbmQKIAkgKiAoNSkgdXNlIHRyYW5zZm9ybSAjIChwZy4gMzMpLgogCSAqLwogCi0JczMyIHRyYW5zZm9ybV9udW07CS8qIG9mZnNldCAweDAwNzcgKi8KKwlzMzIgdHJhbnNmb3JtX251bTsJCQkvKiBvZmZzZXQgMHgwMDc3ICovCiAKLQkvKiAgTWF4X2Z1bGxfc2NhbGUgaXMgdGhlIHJlY29tbWVuZGVkIG1heGltdW0gZnVsbCBzY2FsZS4gU2VlICovCi0JLyogIG1pbl9mdWxsX3NjYWxlIChwZy4gOSkgZm9yIG1vcmUgZGV0YWlscy4gKi8KKwkvKgorCSAqIE1heF9mdWxsX3NjYWxlIGlzIHRoZSByZWNvbW1lbmRlZCBtYXhpbXVtIGZ1bGwgc2NhbGUuCisJICogU2VlIG1pbl9mdWxsX3NjYWxlIChwZy4gOSkgZm9yIG1vcmUgZGV0YWlscy4KKwkgKi8KIAogCXN0cnVjdCBzaXhfYXhpc19hcnJheSBtYXhfZnVsbF9zY2FsZTsJLyogb2Zmc2V0IDB4MDA3OCAqLwotCXMzMiByZXNlcnZlZDU7CQkvKiBvZmZzZXQgMHgwMDdlICovCisJczMyIHJlc2VydmVkNTsJCQkJLyogb2Zmc2V0IDB4MDA3ZSAqLwogCi0JLyogUGVha19hZGRyZXNzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHdoaWNoIHdpbGwgYmUgbW9uaXRvcmVkCisJLyoKKwkgKiBQZWFrX2FkZHJlc3MgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgd2hpY2ggd2lsbCBiZSBtb25pdG9yZWQKIAkgKiBieSB0aGUgcGVhayByb3V0aW5lLiBUaGlzIHZhbHVlIGlzIHNldCBieSB0aGUgdXNlci4gVGhlIHBlYWsKIAkgKiByb3V0aW5lIHdpbGwgbW9uaXRvciBhbnkgOCBjb250aWd1b3VzIGFkZHJlc3NlcyBmb3IgcGVhayB2YWx1ZXMuCiAJICogKGV4LiB0byB3YXRjaCBmaWx0ZXIzIGRhdGEgZm9yIHBlYWtzLCBzZXQgdGhpcyB2YWx1ZSB0byAweDAwYTgpLgogCSAqLwogCi0JczMyIHBlYWtfYWRkcmVzczsJLyogb2Zmc2V0IDB4MDA3ZiAqLworCXMzMiBwZWFrX2FkZHJlc3M7CQkJLyogb2Zmc2V0IDB4MDA3ZiAqLwogCi0JLyogRnVsbF9zY2FsZSBpcyB0aGUgc2Vuc29yIGZ1bGwgc2NhbGVzIHdoaWNoIGFyZSBjdXJyZW50bHkgaW4gdXNlLgorCS8qCisJICogRnVsbF9zY2FsZSBpcyB0aGUgc2Vuc29yIGZ1bGwgc2NhbGVzIHdoaWNoIGFyZSBjdXJyZW50bHkgaW4gdXNlLgogCSAqIERlY291cGxlZCBhbmQgZmlsdGVyZWQgZGF0YSBpcyBzY2FsZWQgc28gdGhhdCArLy0gMTYzODQgaXMgZXF1YWwKIAkgKiB0byB0aGUgZnVsbCBzY2FsZXMuIFRoZSBlbmdpbmVlcmluZyB1bml0cyB1c2VkIGFyZSBpbmRpY2F0ZWQgYnkKIAkgKiB0aGUgdW5pdHMgdmFsdWUgZGlzY3Vzc2VkIG9uIHBhZ2UgMTYuIFRoZSBmdWxsIHNjYWxlcyBmb3IgRngsIEZ5LApAQCAtMzc3LDkgKzQwNiwxMCBAQAogCSAqIGF4ZXMgdXNlZCBmb3IgZWFjaCB2ZWN0b3IgcmVzcGVjdGl2ZWx5LgogCSAqLwogCi0Jc3RydWN0IGZvcmNlX2FycmF5IGZ1bGxfc2NhbGU7CS8qIG9mZnNldCAweDAwODAgKi8KKwlzdHJ1Y3QgZm9yY2VfYXJyYXkgZnVsbF9zY2FsZTsJCS8qIG9mZnNldCAweDAwODAgKi8KIAotCS8qIE9mZnNldHMgY29udGFpbnMgdGhlIHNlbnNvciBvZmZzZXRzLiBUaGVzZSB2YWx1ZXMgYXJlIHN1YnRyYWN0ZWQgZnJvbQorCS8qCisJICogT2Zmc2V0cyBjb250YWlucyB0aGUgc2Vuc29yIG9mZnNldHMuIFRoZXNlIHZhbHVlcyBhcmUgc3VidHJhY3RlZCBmcm9tCiAJICogdGhlIHNlbnNvciBkYXRhIHRvIG9idGFpbiB0aGUgZGVjb3VwbGVkIGRhdGEuIFRoZSBvZmZzZXRzIGFyZSBzZXQgYQogCSAqIGZldyBzZWNvbmRzICg8IDEwKSBhZnRlciB0aGUgY2FsaWJyYXRpb24gZGF0YSBoYXMgYmVlbiByZWNlaXZlZC4KIAkgKiBUaGV5IGFyZSBzZXQgc28gdGhhdCB0aGUgb3V0cHV0IGRhdGEgd2lsbCBiZSB6ZXJvLiBUaGVzZSB2YWx1ZXMKQEAgLTM5MiwyMyArNDIyLDI2IEBACiAJICogYWJvdXQgWiBieSA5MCBkZWdyZWVzLCBGWSB3b3VsZCBiZSA1IGFuZCBhbGwgb3RoZXJzIHdvdWxkIGJlIHplcm8uCiAJICovCiAKLQlzdHJ1Y3Qgc2l4X2F4aXNfYXJyYXkgb2Zmc2V0czsJLyogb2Zmc2V0IDB4MDA4OCAqLworCXN0cnVjdCBzaXhfYXhpc19hcnJheSBvZmZzZXRzOwkJLyogb2Zmc2V0IDB4MDA4OCAqLwogCi0JLyogT2Zmc2V0X251bSBpcyB0aGUgbnVtYmVyIG9mIHRoZSBvZmZzZXQgY3VycmVudGx5IGluIHVzZS4gVGhpcworCS8qCisJICogT2Zmc2V0X251bSBpcyB0aGUgbnVtYmVyIG9mIHRoZSBvZmZzZXQgY3VycmVudGx5IGluIHVzZS4gVGhpcwogCSAqIHZhbHVlIGlzIHNldCBieSB0aGUgSlIzIERTUCBhZnRlciB0aGUgdXNlciBoYXMgZXhlY3V0ZWQgdGhlIHVzZQogCSAqIG9mZnNldCAjIGNvbW1hbmQgKHBnLiAzNCkuIEl0IGNhbiB2YXJ5IGJldHdlZW4gMCBhbmQgMTUuCiAJICovCiAKLQlzMzIgb2Zmc2V0X251bTsJCS8qIG9mZnNldCAweDAwOGUgKi8KKwlzMzIgb2Zmc2V0X251bTsJCQkJLyogb2Zmc2V0IDB4MDA4ZSAqLwogCi0JLyogVmVjdF9heGVzIGlzIGEgYml0IG1hcCBzaG93aW5nIHdoaWNoIG9mIHRoZSBheGVzIGFyZSBiZWluZyB1c2VkCisJLyoKKwkgKiBWZWN0X2F4ZXMgaXMgYSBiaXQgbWFwIHNob3dpbmcgd2hpY2ggb2YgdGhlIGF4ZXMgYXJlIGJlaW5nIHVzZWQKIAkgKiBpbiB0aGUgdmVjdG9yIGNhbGN1bGF0aW9ucy4gVGhpcyB2YWx1ZSBpcyBzZXQgYnkgdGhlIEpSMyBEU1AKIAkgKiBhZnRlciB0aGUgdXNlciBoYXMgZXhlY3V0ZWQgdGhlIHNldCB2ZWN0b3IgYXhlcyBjb21tYW5kIChwZy4gMzcpLgogCSAqLwogCi0JdTMyIHZlY3RfYXhlczsJCS8qIG9mZnNldCAweDAwOGYgKi8KKwl1MzIgdmVjdF9heGVzOwkJCQkvKiBvZmZzZXQgMHgwMDhmICovCiAKLQkvKiBGaWx0ZXIwIGlzIHRoZSBkZWNvdXBsZWQsIHVuZmlsdGVyZWQgZGF0YSBmcm9tIHRoZSBKUjMgc2Vuc29yLgorCS8qCisJICogRmlsdGVyMCBpcyB0aGUgZGVjb3VwbGVkLCB1bmZpbHRlcmVkIGRhdGEgZnJvbSB0aGUgSlIzIHNlbnNvci4KIAkgKiBUaGlzIGRhdGEgaGFzIGhhZCB0aGUgb2Zmc2V0cyByZW1vdmVkLgogCSAqCiAJICogVGhlc2UgZm9yY2VfYXJyYXlzIGhvbGQgdGhlIGZpbHRlcmVkIGRhdGEuIFRoZSBkZWNvdXBsZWQgZGF0YSBpcwpAQCAtNDIwLDIzICs0NTMsMjcgQEAKIAkgKiBjdXRvZmYgYXQgMTI1IEh6LCAzMS4yNSBIeiwgNy44MTMgSHosIDEuOTUzIEh6IGFuZCAwLjQ4ODMgSHouCiAJICovCiAKLQlzdHJ1Y3QgZm9yY2VfYXJyYXkgZmlsdGVyWzddOwkvKiBvZmZzZXQgMHgwMDkwLAotCQkJCQkgICBvZmZzZXQgMHgwMDk4LAotCQkJCQkgICBvZmZzZXQgMHgwMGEwLAotCQkJCQkgICBvZmZzZXQgMHgwMGE4LAotCQkJCQkgICBvZmZzZXQgMHgwMGIwLAotCQkJCQkgICBvZmZzZXQgMHgwMGI4ICwKLQkJCQkJICAgb2Zmc2V0IDB4MDBjMCAqLworCXN0cnVjdCBmb3JjZV9hcnJheSBmaWx0ZXJbN107CQkvKgorCQkJCQkJICogb2Zmc2V0IDB4MDA5MCwKKwkJCQkJCSAqIG9mZnNldCAweDAwOTgsCisJCQkJCQkgKiBvZmZzZXQgMHgwMGEwLAorCQkJCQkJICogb2Zmc2V0IDB4MDBhOCwKKwkJCQkJCSAqIG9mZnNldCAweDAwYjAsCisJCQkJCQkgKiBvZmZzZXQgMHgwMGI4LAorCQkJCQkJICogb2Zmc2V0IDB4MDBjMAorCQkJCQkJICovCiAKLQkvKiBSYXRlX2RhdGEgaXMgdGhlIGNhbGN1bGF0ZWQgcmF0ZSBkYXRhLiBJdCBpcyBhIGZpcnN0IGRlcml2YXRpdmUKKwkvKgorCSAqIFJhdGVfZGF0YSBpcyB0aGUgY2FsY3VsYXRlZCByYXRlIGRhdGEuIEl0IGlzIGEgZmlyc3QgZGVyaXZhdGl2ZQogCSAqIGNhbGN1bGF0aW9uLiBJdCBpcyBjYWxjdWxhdGVkIGF0IGEgZnJlcXVlbmN5IHNwZWNpZmllZCBieSB0aGUKIAkgKiB2YXJpYWJsZSByYXRlX2Rpdmlzb3IgKHBnLiAxMikuIFRoZSBkYXRhIG9uIHdoaWNoIHRoZSByYXRlIGlzCiAJICogY2FsY3VsYXRlZCBpcyBzcGVjaWZpZWQgYnkgdGhlIHZhcmlhYmxlIHJhdGVfYWRkcmVzcyAocGcuIDEyKS4KIAkgKi8KIAotCXN0cnVjdCBmb3JjZV9hcnJheSByYXRlX2RhdGE7CS8qIG9mZnNldCAweDAwYzggKi8KKwlzdHJ1Y3QgZm9yY2VfYXJyYXkgcmF0ZV9kYXRhOwkJLyogb2Zmc2V0IDB4MDBjOCAqLwogCi0JLyogTWluaW11bV9kYXRhICYgbWF4aW11bV9kYXRhIGFyZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSAocGVhaykKKwkvKgorCSAqIE1pbmltdW1fZGF0YSAmIG1heGltdW1fZGF0YSBhcmUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gKHBlYWspCiAJICogZGF0YSB2YWx1ZXMuIFRoZSBKUjMgRFNQIGNhbiBtb25pdG9yIGFueSA4IGNvbnRpZ3VvdXMgZGF0YSBpdGVtcwogCSAqIGZvciBtaW5pbXVtcyBhbmQgbWF4aW11bXMgYXQgZnVsbCBzZW5zb3IgYmFuZHdpZHRoLiBUaGlzIGFyZWEgaXMKIAkgKiBvbmx5IHVwZGF0ZWQgYXQgdXNlciByZXF1ZXN0LiBUaGlzIGlzIGRvbmUgc28gdGhhdCB0aGUgdXNlciBkb2VzCkBAIC00NTEsNyArNDg4LDggQEAKIAlzdHJ1Y3QgZm9yY2VfYXJyYXkgbWluaW11bV9kYXRhOwkvKiBvZmZzZXQgMHgwMGQwICovCiAJc3RydWN0IGZvcmNlX2FycmF5IG1heGltdW1fZGF0YTsJLyogb2Zmc2V0IDB4MDBkOCAqLwogCi0JLyogTmVhcl9zYXRfdmFsdWUgJiBzYXRfdmFsdWUgY29udGFpbiB0aGUgdmFsdWUgdXNlZCB0byBkZXRlcm1pbmUgaWYKKwkvKgorCSAqIE5lYXJfc2F0X3ZhbHVlICYgc2F0X3ZhbHVlIGNvbnRhaW4gdGhlIHZhbHVlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmCiAJICogdGhlIHJhdyBzZW5zb3IgaXMgc2F0dXJhdGVkLiBCZWNhdXNlIG9mIGRlY291cGxpbmcgYW5kIG9mZnNldAogCSAqIHJlbW92YWwsIGl0IGlzIGRpZmZpY3VsdCB0byB0ZWxsIGZyb20gdGhlIHByb2Nlc3NlZCBkYXRhIGlmIHRoZQogCSAqIHNlbnNvciBpcyBzYXR1cmF0ZWQuIFRoZXNlIHZhbHVlcywgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgZXJyb3IKQEAgLTQ2NSwxMCArNTAzLDExIEBACiAJICogICBzYXRfdmFsdWUgPSAzMjc2OCAtIDJeKDE2IC0gQURDIGJpdHMpCiAJICovCiAKLQlzMzIgbmVhcl9zYXRfdmFsdWU7CS8qIG9mZnNldCAweDAwZTAgKi8KLQlzMzIgc2F0X3ZhbHVlOwkJLyogb2Zmc2V0IDB4MDBlMSAqLworCXMzMiBuZWFyX3NhdF92YWx1ZTsJCQkvKiBvZmZzZXQgMHgwMGUwICovCisJczMyIHNhdF92YWx1ZTsJCQkJLyogb2Zmc2V0IDB4MDBlMSAqLwogCi0JLyogUmF0ZV9hZGRyZXNzLCByYXRlX2Rpdmlzb3IgJiByYXRlX2NvdW50IGNvbnRhaW4gdGhlIGRhdGEgdXNlZCB0bworCS8qCisJICogUmF0ZV9hZGRyZXNzLCByYXRlX2Rpdmlzb3IgJiByYXRlX2NvdW50IGNvbnRhaW4gdGhlIGRhdGEgdXNlZCB0bwogCSAqIGNvbnRyb2wgdGhlIGNhbGN1bGF0aW9ucyBvZiB0aGUgcmF0ZXMuIFJhdGVfYWRkcmVzcyBpcyB0aGUKIAkgKiBhZGRyZXNzIG9mIHRoZSBkYXRhIHVzZWQgZm9yIHRoZSByYXRlIGNhbGN1bGF0aW9uLiBUaGUgSlIzIERTUAogCSAqIHdpbGwgY2FsY3VsYXRlIHJhdGVzIGZvciBhbnkgOCBjb250aWd1b3VzIHZhbHVlcyAoZXguIHRvCkBAIC00ODUsMTEgKzUyNCwxMiBAQAogCSAqIHdpbGwgbWluaW1pemUgdGhlIHRpbWUgbmVjZXNzYXJ5IHRvIHN0YXJ0IHRoZSByYXRlIGNhbGN1bGF0aW9ucy4KIAkgKi8KIAotCXMzMiByYXRlX2FkZHJlc3M7CS8qIG9mZnNldCAweDAwZTIgKi8KLQl1MzIgcmF0ZV9kaXZpc29yOwkvKiBvZmZzZXQgMHgwMGUzICovCi0JdTMyIHJhdGVfY291bnQ7CQkvKiBvZmZzZXQgMHgwMGU0ICovCisJczMyIHJhdGVfYWRkcmVzczsJCQkvKiBvZmZzZXQgMHgwMGUyICovCisJdTMyIHJhdGVfZGl2aXNvcjsJCQkvKiBvZmZzZXQgMHgwMGUzICovCisJdTMyIHJhdGVfY291bnQ7CQkJCS8qIG9mZnNldCAweDAwZTQgKi8KIAotCS8qIENvbW1hbmRfd29yZDIgdGhyb3VnaCBjb21tYW5kX3dvcmQwIGFyZSB0aGUgbG9jYXRpb25zIHVzZWQgdG8KKwkvKgorCSAqIENvbW1hbmRfd29yZDIgdGhyb3VnaCBjb21tYW5kX3dvcmQwIGFyZSB0aGUgbG9jYXRpb25zIHVzZWQgdG8KIAkgKiBzZW5kIGNvbW1hbmRzIHRvIHRoZSBKUjMgRFNQLiBUaGVpciB1c2FnZSB2YXJpZXMgd2l0aCB0aGUgY29tbWFuZAogCSAqIGFuZCBpcyBkZXRhaWxlZCBsYXRlciBpbiB0aGUgQ29tbWFuZCBEZWZpbml0aW9ucyBzZWN0aW9uIChwZy4KIAkgKiAyOSkuIEluIGdlbmVyYWwgdGhlIHVzZXIgcGxhY2VzIHZhbHVlcyBpbnRvIHZhcmlvdXMgbWVtb3J5CkBAIC01MDIsMTEgKzU0MiwxMiBAQAogCSAqIGNvbW1hbmRfd29yZDEpLgogCSAqLwogCi0JczMyIGNvbW1hbmRfd29yZDI7CS8qIG9mZnNldCAweDAwZTUgKi8KLQlzMzIgY29tbWFuZF93b3JkMTsJLyogb2Zmc2V0IDB4MDBlNiAqLwotCXMzMiBjb21tYW5kX3dvcmQwOwkvKiBvZmZzZXQgMHgwMGU3ICovCisJczMyIGNvbW1hbmRfd29yZDI7CQkJLyogb2Zmc2V0IDB4MDBlNSAqLworCXMzMiBjb21tYW5kX3dvcmQxOwkJCS8qIG9mZnNldCAweDAwZTYgKi8KKwlzMzIgY29tbWFuZF93b3JkMDsJCQkvKiBvZmZzZXQgMHgwMGU3ICovCiAKLQkvKiBDb3VudDEgdGhyb3VnaCBjb3VudDYgYXJlIHVuc2lnbmVkIGNvdW50ZXJzIHdoaWNoIGFyZSBpbmNyZW1lbnRlZAorCS8qCisJICogQ291bnQxIHRocm91Z2ggY291bnQ2IGFyZSB1bnNpZ25lZCBjb3VudGVycyB3aGljaCBhcmUgaW5jcmVtZW50ZWQKIAkgKiBldmVyeSB0aW1lIHRoZSBtYXRjaGluZyBmaWx0ZXJzIGFyZSBjYWxjdWxhdGVkLiBGaWx0ZXIxIGlzCiAJICogY2FsY3VsYXRlZCBhdCB0aGUgc2Vuc29yIGRhdGEgYmFuZHdpZHRoLiBTbyB0aGlzIGNvdW50ZXIgd291bGQKIAkgKiBpbmNyZW1lbnQgYXQgOCBrSHogZm9yIGEgdHlwaWNhbCBzZW5zb3IuIFRoZSByZXN0IG9mIHRoZSBjb3VudGVycwpAQCAtNTE4LDE0ICs1NTksMTUgQEAKIAkgKiBvbmNlLgogCSAqLwogCi0JdTMyIGNvdW50MTsJCS8qIG9mZnNldCAweDAwZTggKi8KLQl1MzIgY291bnQyOwkJLyogb2Zmc2V0IDB4MDBlOSAqLwotCXUzMiBjb3VudDM7CQkvKiBvZmZzZXQgMHgwMGVhICovCi0JdTMyIGNvdW50NDsJCS8qIG9mZnNldCAweDAwZWIgKi8KLQl1MzIgY291bnQ1OwkJLyogb2Zmc2V0IDB4MDBlYyAqLwotCXUzMiBjb3VudDY7CQkvKiBvZmZzZXQgMHgwMGVkICovCisJdTMyIGNvdW50MTsJCQkJLyogb2Zmc2V0IDB4MDBlOCAqLworCXUzMiBjb3VudDI7CQkJCS8qIG9mZnNldCAweDAwZTkgKi8KKwl1MzIgY291bnQzOwkJCQkvKiBvZmZzZXQgMHgwMGVhICovCisJdTMyIGNvdW50NDsJCQkJLyogb2Zmc2V0IDB4MDBlYiAqLworCXUzMiBjb3VudDU7CQkJCS8qIG9mZnNldCAweDAwZWMgKi8KKwl1MzIgY291bnQ2OwkJCQkvKiBvZmZzZXQgMHgwMGVkICovCiAKLQkvKiBFcnJvcl9jb3VudCBpcyBhIHJ1bm5pbmcgY291bnQgb2YgZGF0YSByZWNlcHRpb24gZXJyb3JzLiBJZiB0aGlzCisJLyoKKwkgKiBFcnJvcl9jb3VudCBpcyBhIHJ1bm5pbmcgY291bnQgb2YgZGF0YSByZWNlcHRpb24gZXJyb3JzLiBJZiB0aGlzCiAJICogY291bnRlciBpcyBjaGFuZ2luZyByYXBpZGx5LCBpdCBwcm9iYWJseSBpbmRpY2F0ZXMgYSBiYWQgc2Vuc29yCiAJICogY2FibGUgY29ubmVjdGlvbiBvciBvdGhlciBoYXJkd2FyZSBwcm9ibGVtLiBJbiBtb3N0IGluc3RhbGxhdGlvbnMKIAkgKiBlcnJvcl9jb3VudCBzaG91bGQgbm90IGNoYW5nZSBhdCBhbGwuIEJ1dCBpdCBpcyBwb3NzaWJsZSBpbiBhbgpAQCAtNTM1LDc1ICs1NzcsODQgQEAKIAkgKiB3aGVyZSB0aGlzIGNvdW50ZXIgY291bnRzIGEgYmFkIHNhbXBsZSwgdGhhdCBzYW1wbGUgaXMgaWdub3JlZC4KIAkgKi8KIAotCXUzMiBlcnJvcl9jb3VudDsJLyogb2Zmc2V0IDB4MDBlZSAqLworCXUzMiBlcnJvcl9jb3VudDsJCQkvKiBvZmZzZXQgMHgwMGVlICovCiAKLQkvKiBDb3VudF94IGlzIGEgY291bnRlciB3aGljaCBpcyBpbmNyZW1lbnRlZCBldmVyeSB0aW1lIHRoZSBKUjMgRFNQCisJLyoKKwkgKiBDb3VudF94IGlzIGEgY291bnRlciB3aGljaCBpcyBpbmNyZW1lbnRlZCBldmVyeSB0aW1lIHRoZSBKUjMgRFNQCiAJICogc2VhcmNoZXMgaXRzIGpvYiBxdWV1ZXMgYW5kIGZpbmRzIG5vdGhpbmcgdG8gZG8uIEl0IGluZGljYXRlcyB0aGUKIAkgKiBhbW91bnQgb2YgaWRsZSB0aW1lIHRoZSBKUjMgRFNQIGhhcyBhdmFpbGFibGUuIEl0IGNhbiBhbHNvIGJlCiAJICogdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIEpSMyBEU1AgaXMgYWxpdmUuIFNlZSB0aGUgUGVyZm9ybWFuY2UKIAkgKiBJc3N1ZXMgc2VjdGlvbiBvbiBwZy4gNDkgZm9yIG1vcmUgZGV0YWlscy4KIAkgKi8KIAotCXUzMiBjb3VudF94OwkJLyogb2Zmc2V0IDB4MDBlZiAqLworCXUzMiBjb3VudF94OwkJCQkvKiBvZmZzZXQgMHgwMGVmICovCiAKLQkvKiBXYXJuaW5ncyAmIGVycm9ycyBjb250YWluIHRoZSB3YXJuaW5nIGFuZCBlcnJvciBiaXRzCisJLyoKKwkgKiBXYXJuaW5ncyAmIGVycm9ycyBjb250YWluIHRoZSB3YXJuaW5nIGFuZCBlcnJvciBiaXRzCiAJICogcmVzcGVjdGl2ZWx5LiBUaGUgZm9ybWF0IG9mIHRoZXNlIHR3byB3b3JkcyBpcyBkaXNjdXNzZWQgb24gcGFnZQogCSAqIDIxIHVuZGVyIHRoZSBoZWFkaW5ncyB3YXJuaW5nc19iaXRzIGFuZCBlcnJvcl9iaXRzLgogCSAqLwogCi0JdTMyIHdhcm5pbmdzOwkJLyogb2Zmc2V0IDB4MDBmMCAqLwotCXUzMiBlcnJvcnM7CQkvKiBvZmZzZXQgMHgwMGYxICovCisJdTMyIHdhcm5pbmdzOwkJCQkvKiBvZmZzZXQgMHgwMGYwICovCisJdTMyIGVycm9yczsJCQkJLyogb2Zmc2V0IDB4MDBmMSAqLwogCi0JLyogVGhyZXNob2xkX2JpdHMgaXMgYSB3b3JkIGNvbnRhaW5pbmcgdGhlIGJpdHMgdGhhdCBhcmUgc2V0IGJ5IHRoZQorCS8qCisJICogVGhyZXNob2xkX2JpdHMgaXMgYSB3b3JkIGNvbnRhaW5pbmcgdGhlIGJpdHMgdGhhdCBhcmUgc2V0IGJ5IHRoZQogCSAqIGxvYWQgZW52ZWxvcGVzLiBTZWUgbG9hZF9lbnZlbG9wZXMgKHBnLiAxNykgYW5kIHRocmVzaF9zdHJ1Y3QKIAkgKiAocGcuIDIzKSBmb3IgbW9yZSBkZXRhaWxzLgogCSAqLwogCi0JczMyIHRocmVzaG9sZF9iaXRzOwkvKiBvZmZzZXQgMHgwMGYyICovCisJczMyIHRocmVzaG9sZF9iaXRzOwkJCS8qIG9mZnNldCAweDAwZjIgKi8KIAotCS8qIExhc3RfY3JjIGlzIHRoZSB2YWx1ZSB0aGF0IHNob3dzIHRoZSBhY3R1YWwgY2FsY3VsYXRlZCBDUkMuIENSQworCS8qCisJICogTGFzdF9jcmMgaXMgdGhlIHZhbHVlIHRoYXQgc2hvd3MgdGhlIGFjdHVhbCBjYWxjdWxhdGVkIENSQy4gQ1JDCiAJICogaXMgc2hvcnQgZm9yIGN5Y2xpYyByZWR1bmRhbmN5IGNvZGUuIEl0IHNob3VsZCBiZSB6ZXJvLiBTZWUgdGhlCiAJICogZGVzY3JpcHRpb24gZm9yIGNhbF9jcmNfYmFkIChwZy4gMjEpIGZvciBtb3JlIGluZm9ybWF0aW9uLgogCSAqLwogCi0JczMyIGxhc3RfQ1JDOwkJLyogb2Zmc2V0IDB4MDBmMyAqLworCXMzMiBsYXN0X0NSQzsJCQkJLyogb2Zmc2V0IDB4MDBmMyAqLwogCi0JLyogRUVQcm9tX3Zlcl9ubyBjb250YWlucyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHNlbnNvciBFRVByb20uCisJLyoKKwkgKiBFRVByb21fdmVyX25vIGNvbnRhaW5zIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgc2Vuc29yIEVFUHJvbS4KIAkgKiBFRVByb20gdmVyc2lvbiBudW1iZXJzIGNhbiB2YXJ5IGJldHdlZW4gMCBhbmQgMjU1LgogCSAqIFNvZnR3YXJlX3Zlcl9ubyBjb250YWlucyB0aGUgc29mdHdhcmUgdmVyc2lvbiBudW1iZXIuIFZlcnNpb24KIAkgKiAzLjAyIHdvdWxkIGJlIHN0b3JlZCBhcyAzMDIuCiAJICovCiAKLQlzMzIgZWVwcm9tX3Zlcl9ubzsJLyogb2Zmc2V0IDB4MDBmNCAqLwotCXMzMiBzb2Z0d2FyZV92ZXJfbm87CS8qIG9mZnNldCAweDAwZjUgKi8KKwlzMzIgZWVwcm9tX3Zlcl9ubzsJCQkvKiBvZmZzZXQgMHgwMGY0ICovCisJczMyIHNvZnR3YXJlX3Zlcl9ubzsJCQkvKiBvZmZzZXQgMHgwMGY1ICovCiAKLQkvKiBTb2Z0d2FyZV9kYXkgJiBzb2Z0d2FyZV95ZWFyIGFyZSB0aGUgcmVsZWFzZSBkYXRlIG9mIHRoZSBzb2Z0d2FyZQorCS8qCisJICogU29mdHdhcmVfZGF5ICYgc29mdHdhcmVfeWVhciBhcmUgdGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgc29mdHdhcmUKIAkgKiB0aGUgSlIzIERTUCBpcyBjdXJyZW50bHkgcnVubmluZy4gRGF5IGlzIHRoZSBkYXkgb2YgdGhlIHllYXIsCiAJICogd2l0aCBKYW51YXJ5IDEgYmVpbmcgMSwgYW5kIERlY2VtYmVyIDMxLCBiZWluZyAzNjUgZm9yIG5vbiBsZWFwCiAJICogeWVhcnMuCiAJICovCiAKLQlzMzIgc29mdHdhcmVfZGF5OwkvKiBvZmZzZXQgMHgwMGY2ICovCi0JczMyIHNvZnR3YXJlX3llYXI7CS8qIG9mZnNldCAweDAwZjcgKi8KKwlzMzIgc29mdHdhcmVfZGF5OwkJCS8qIG9mZnNldCAweDAwZjYgKi8KKwlzMzIgc29mdHdhcmVfeWVhcjsJCQkvKiBvZmZzZXQgMHgwMGY3ICovCiAKLQkvKiBTZXJpYWxfbm8gJiBtb2RlbF9ubyBhcmUgdGhlIHR3byB2YWx1ZXMgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZnkgYQorCS8qCisJICogU2VyaWFsX25vICYgbW9kZWxfbm8gYXJlIHRoZSB0d28gdmFsdWVzIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZ5IGEKIAkgKiBzZW5zb3IuIFRoaXMgbW9kZWwgbnVtYmVyIGRvZXMgbm90IGRpcmVjdGx5IGNvcnJlc3BvbmQgdG8gdGhlIEpSMwogCSAqIG1vZGVsIG51bWJlciwgYnV0IGl0IHdpbGwgcHJvdmlkZSBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvcgogCSAqIGRpZmZlcmVudCBzZW5zb3IgY29uZmlndXJhdGlvbnMuCiAJICovCiAKLQl1MzIgc2VyaWFsX25vOwkJLyogb2Zmc2V0IDB4MDBmOCAqLwotCXUzMiBtb2RlbF9ubzsJCS8qIG9mZnNldCAweDAwZjkgKi8KKwl1MzIgc2VyaWFsX25vOwkJCQkvKiBvZmZzZXQgMHgwMGY4ICovCisJdTMyIG1vZGVsX25vOwkJCQkvKiBvZmZzZXQgMHgwMGY5ICovCiAKLQkvKiBDYWxfZGF5ICYgY2FsX3llYXIgYXJlIHRoZSBzZW5zb3IgY2FsaWJyYXRpb24gZGF0ZS4gRGF5IGlzIHRoZQorCS8qCisJICogQ2FsX2RheSAmIGNhbF95ZWFyIGFyZSB0aGUgc2Vuc29yIGNhbGlicmF0aW9uIGRhdGUuIERheSBpcyB0aGUKIAkgKiBkYXkgb2YgdGhlIHllYXIsIHdpdGggSmFudWFyeSAxIGJlaW5nIDEsIGFuZCBEZWNlbWJlciAzMSwgYmVpbmcKIAkgKiAzNjYgZm9yIGxlYXAgeWVhcnMuCiAJICovCiAKLQlzMzIgY2FsX2RheTsJCS8qIG9mZnNldCAweDAwZmEgKi8KLQlzMzIgY2FsX3llYXI7CQkvKiBvZmZzZXQgMHgwMGZiICovCisJczMyIGNhbF9kYXk7CQkJCS8qIG9mZnNldCAweDAwZmEgKi8KKwlzMzIgY2FsX3llYXI7CQkJCS8qIG9mZnNldCAweDAwZmIgKi8KIAotCS8qIFVuaXRzIGlzIGFuIGVudW1lcmF0ZWQgcmVhZCBvbmx5IHZhbHVlIGRlZmluaW5nIHRoZSBlbmdpbmVlcmluZworCS8qCisJICogVW5pdHMgaXMgYW4gZW51bWVyYXRlZCByZWFkIG9ubHkgdmFsdWUgZGVmaW5pbmcgdGhlIGVuZ2luZWVyaW5nCiAJICogdW5pdHMgdXNlZCBpbiB0aGUgc2Vuc29yIGZ1bGwgc2NhbGUuIFRoZSBtZWFuaW5ncyBvZiBwYXJ0aWN1bGFyCiAJICogdmFsdWVzIGFyZSBkaXNjdXNzZWQgaW4gdGhlIHNlY3Rpb24gZGV0YWlsaW5nIHRoZSBmb3JjZV91bml0cwogCSAqIHN0cnVjdHVyZSBvbiBwYWdlIDIyLiBUaGUgZW5naW5lZXJpbmcgdW5pdHMgYXJlIHNldHRvIGN1c3RvbWVyCkBAIC02MjYsMjAgKzY3NywyMiBAQAogCSAqIHJlY2VpdmVkLgogCSAqLwogCi0JdTMyIHVuaXRzOwkJLyogb2Zmc2V0IDB4MDBmYyAqLwotCXMzMiBiaXRzOwkJLyogb2Zmc2V0IDB4MDBmZCAqLwotCXMzMiBjaGFubmVsczsJCS8qIG9mZnNldCAweDAwZmUgKi8KKwl1MzIgdW5pdHM7CQkJCS8qIG9mZnNldCAweDAwZmMgKi8KKwlzMzIgYml0czsJCQkJLyogb2Zmc2V0IDB4MDBmZCAqLworCXMzMiBjaGFubmVsczsJCQkJLyogb2Zmc2V0IDB4MDBmZSAqLwogCi0JLyogVGhpY2tuZXNzIHNwZWNpZmllcyB0aGUgb3ZlcmFsbCB0aGlja25lc3Mgb2YgdGhlIHNlbnNvciBmcm9tCisJLyoKKwkgKiBUaGlja25lc3Mgc3BlY2lmaWVzIHRoZSBvdmVyYWxsIHRoaWNrbmVzcyBvZiB0aGUgc2Vuc29yIGZyb20KIAkgKiBmbGFuZ2UgdG8gZmxhbmdlLiBUaGUgZW5naW5lZXJpbmcgdW5pdHMgZm9yIHRoaXMgdmFsdWUgYXJlCiAJICogY29udGFpbmVkIGluIHVuaXRzIChwZy4gMTYpLiBUaGUgc2Vuc29yIGNhbGlicmF0aW9uIGlzIHJlbGF0aXZlCiAJICogdG8gdGhlIGNlbnRlciBvZiB0aGUgc2Vuc29yLiBUaGlzIHZhbHVlIGFsbG93cyBlYXN5IGNvb3JkaW5hdGUKIAkgKiB0cmFuc2Zvcm1hdGlvbiBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIHNlbnNvciB0byBlaXRoZXIgZmxhbmdlLgogCSAqLwogCi0JczMyIHRoaWNrbmVzczsJCS8qIG9mZnNldCAweDAwZmYgKi8KKwlzMzIgdGhpY2tuZXNzOwkJCQkvKiBvZmZzZXQgMHgwMGZmICovCiAKLQkvKiBMb2FkX2VudmVsb3BlcyBpcyBhIHRhYmxlIGNvbnRhaW5pbmcgdGhlIGxvYWQgZW52ZWxvcGUKKwkvKgorCSAqIExvYWRfZW52ZWxvcGVzIGlzIGEgdGFibGUgY29udGFpbmluZyB0aGUgbG9hZCBlbnZlbG9wZQogCSAqIGRlc2NyaXB0aW9ucy4gVGhlcmUgYXJlIDE2IHBvc3NpYmxlIGxvYWQgZW52ZWxvcGUgc2xvdHMgaW4gdGhlCiAJICogdGFibGUuIFRoZSBzbG90cyBhcmUgb24gMTYgd29yZCBib3VuZGFyaWVzIGFuZCBhcmUgbnVtYmVyZWQgMC0xNS4KIAkgKiBFYWNoIGxvYWQgZW52ZWxvcGUgbmVlZHMgdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHNsb3QgYnV0CkBAIC02NTUsNyArNzA4LDggQEAKIAogCXN0cnVjdCBsZV9zdHJ1Y3QgbG9hZF9lbnZlbG9wZXNbMHgxMF07CS8qIG9mZnNldCAweDAxMDAgKi8KIAotCS8qIFRyYW5zZm9ybXMgaXMgYSB0YWJsZSBjb250YWluaW5nIHRoZSB0cmFuc2Zvcm0gZGVzY3JpcHRpb25zLgorCS8qCisJICogVHJhbnNmb3JtcyBpcyBhIHRhYmxlIGNvbnRhaW5pbmcgdGhlIHRyYW5zZm9ybSBkZXNjcmlwdGlvbnMuCiAJICogVGhlcmUgYXJlIDE2IHBvc3NpYmxlIHRyYW5zZm9ybSBzbG90cyBpbiB0aGUgdGFibGUuIFRoZSBzbG90cyBhcmUKIAkgKiBvbiAxNiB3b3JkIGJvdW5kYXJpZXMgYW5kIGFyZSBudW1iZXJlZCAwLTE1LiBFYWNoIHRyYW5zZm9ybSBuZWVkcwogCSAqIHRvIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBzbG90IGJ1dCBuZWVkIG5vdCBiZSBmdWxseQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY3MHguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NzB4LmMKaW5kZXggM2U3MjcxODgwLi43NDkxMWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjcweC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NzB4LmMKQEAgLTEsNDAgKzEsMzQgQEAKIC8qCi0gICAgY29tZWRpL2RyaXZlcnMvbmlfNjcweC5jCi0gICAgSGFyZHdhcmUgZHJpdmVyIGZvciBOSSA2NzB4IGRldmljZXMKLQotICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMSBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKi8KLS8qCi1Ecml2ZXI6IG5pXzY3MHgKLURlc2NyaXB0aW9uOiBOYXRpb25hbCBJbnN0cnVtZW50cyA2NzB4Ci1BdXRob3I6IEJhcnQgSm9yaXMgPGJqb3Jpc0BhZHZhbHZhcy5iZT4KLVVwZGF0ZWQ6IFdlZCwgMTEgRGVjIDIwMDIgMTg6MjU6MzUgLTA4MDAKLURldmljZXM6IFtOYXRpb25hbCBJbnN0cnVtZW50c10gUENJLTY3MDMgKG5pXzY3MHgpLCBQQ0ktNjcwNAotU3RhdHVzOiB1bmtub3duCi0KLUNvbW1hbmRzIGFyZSBub3Qgc3VwcG9ydGVkLgotKi8KKyAqIENvbWVkaSBkcml2ZXIgZm9yIE5JIDY3MHggZGV2aWNlcworICoKKyAqIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMTk5Ny0yMDAxIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLwogCiAvKgotCUJhcnQgSm9yaXMgPGJqb3Jpc0BhZHZhbHZhcy5iZT4gTGFzdCB1cGRhdGVkIG9uIDIwLzA4LzIwMDEKLQotCU1hbnVhbHM6Ci0KLQkzMjIxMTBhLnBkZglQQ0kvUFhJLTY3MDQgVXNlciBNYW51YWwKLQkzMjIxMTBiLnBkZglQQ0kvUFhJLTY3MDMvNjcwNCBVc2VyIE1hbnVhbAotCi0qLworICogRHJpdmVyOiBuaV82NzB4CisgKiBEZXNjcmlwdGlvbjogTmF0aW9uYWwgSW5zdHJ1bWVudHMgNjcweAorICogQXV0aG9yOiBCYXJ0IEpvcmlzIDxiam9yaXNAYWR2YWx2YXMuYmU+CisgKiBVcGRhdGVkOiBXZWQsIDExIERlYyAyMDAyIDE4OjI1OjM1IC0wODAwCisgKiBEZXZpY2VzOiBbTmF0aW9uYWwgSW5zdHJ1bWVudHNdIFBDSS02NzAzIChuaV82NzB4KSwgUENJLTY3MDQKKyAqIFN0YXR1czogdW5rbm93bgorICoKKyAqIENvbW1hbmRzIGFyZSBub3Qgc3VwcG9ydGVkLgorICoKKyAqIE1hbnVhbHM6CisgKiAgIDMyMjExMGEucGRmCVBDSS9QWEktNjcwNCBVc2VyIE1hbnVhbAorICogICAzMjIxMTBiLnBkZglQQ0kvUFhJLTY3MDMvNjcwNCBVc2VyIE1hbnVhbAorICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hMjE1MC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2EyMTUwLmMKaW5kZXggOWI0NDRmOC4uNWE0ZGNjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2EyMTUwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2EyMTUwLmMKQEAgLTEsNjIgKzEsNDcgQEAKIC8qCi0gICAgY29tZWRpL2RyaXZlcnMvbmlfYXRfYTIxNTAuYwotICAgIERyaXZlciBmb3IgTmF0aW9uYWwgSW5zdHJ1bWVudHMgQVQtQTIxNTAgYm9hcmRzCi0gICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqIENvbWVkaSBkcml2ZXIgZm9yIE5hdGlvbmFsIEluc3RydW1lbnRzIEFULUEyMTUwIGJvYXJkcworICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCiAKLSAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCi0gICAgQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qLwogLyoKLURyaXZlcjogbmlfYXRfYTIxNTAKLURlc2NyaXB0aW9uOiBOYXRpb25hbCBJbnN0cnVtZW50cyBBVC1BMjE1MAotQXV0aG9yOiBGcmFuayBNb3JpIEhlc3MKLVN0YXR1czogd29ya3MKLURldmljZXM6IFtOYXRpb25hbCBJbnN0cnVtZW50c10gQVQtQTIxNTBDIChhdF9hMjE1MGMpLCBBVC0yMTUwUyAoYXRfYTIxNTBzKQotCi1JZiB5b3Ugd2FudCB0byBhYyBjb3VwbGUgdGhlIGJvYXJkJ3MgaW5wdXRzLCB1c2UgQVJFRl9PVEhFUi4KLQotQ29uZmlndXJhdGlvbiBvcHRpb25zOgotICBbMF0gLSBJL08gcG9ydCBiYXNlIGFkZHJlc3MKLSAgWzFdIC0gSVJRIChvcHRpb25hbCwgcmVxdWlyZWQgZm9yIHRpbWVkIGNvbnZlcnNpb25zKQotICBbMl0gLSBETUEgKG9wdGlvbmFsLCByZXF1aXJlZCBmb3IgdGltZWQgY29udmVyc2lvbnMpCi0KLSovCi0vKgotWWV0IGFub3RoZXIgZHJpdmVyIGZvciBvYnNvbGV0ZSBoYXJkd2FyZSBicm91Z2h0IHRvIHlvdSBieSBGcmFuayBIZXNzLgotVGVzdGluZyBhbmQgZGVidWdnaW5nIGhlbHAgcHJvdmlkZWQgYnkgRGF2ZSBBbmRydWN6eWsuCi0KLVRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBib2FyZHM6Ci0KLUFULUEyMTUwQwotQVQtQTIxNTBTCi0KLVRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhlaXIgbWFzdGVyIGNsb2NrIGZyZXF1ZW5jaWVzLgotCi1PcHRpb25zOgotCVswXSAtIGJhc2UgaW8gYWRkcmVzcwotCVsxXSAtIGlycQotCVsyXSAtIGRtYSBjaGFubmVsCi0KLVJlZmVyZW5jZXMgKGZyb20gZnRwOi8vZnRwLm5hdGluc3QuY29tL3N1cHBvcnQvbWFudWFscyk6Ci0KLQkgICAzMjAzNjAucGRmICBBVC1BMjE1MCBVc2VyIE1hbnVhbAotCi1UT0RPOgotCi1hbmFsb2cgbGV2ZWwgdHJpZ2dlcmluZwotVFJJR19XQUtFX0VPUwotCi0qLworICogRHJpdmVyOiBuaV9hdF9hMjE1MAorICogRGVzY3JpcHRpb246IE5hdGlvbmFsIEluc3RydW1lbnRzIEFULUEyMTUwCisgKiBBdXRob3I6IEZyYW5rIE1vcmkgSGVzcworICogU3RhdHVzOiB3b3JrcworICogRGV2aWNlczogW05hdGlvbmFsIEluc3RydW1lbnRzXSBBVC1BMjE1MEMgKGF0X2EyMTUwYyksIEFULTIxNTBTIChhdF9hMjE1MHMpCisgKgorICogQ29uZmlndXJhdGlvbiBvcHRpb25zOgorICogICBbMF0gLSBJL08gcG9ydCBiYXNlIGFkZHJlc3MKKyAqICAgWzFdIC0gSVJRIChvcHRpb25hbCwgcmVxdWlyZWQgZm9yIHRpbWVkIGNvbnZlcnNpb25zKQorICogICBbMl0gLSBETUEgKG9wdGlvbmFsLCByZXF1aXJlZCBmb3IgdGltZWQgY29udmVyc2lvbnMpCisgKgorICogWWV0IGFub3RoZXIgZHJpdmVyIGZvciBvYnNvbGV0ZSBoYXJkd2FyZSBicm91Z2h0IHRvIHlvdSBieSBGcmFuayBIZXNzLgorICogVGVzdGluZyBhbmQgZGVidWdnaW5nIGhlbHAgcHJvdmlkZWQgYnkgRGF2ZSBBbmRydWN6eWsuCisgKgorICogSWYgeW91IHdhbnQgdG8gYWMgY291cGxlIHRoZSBib2FyZCdzIGlucHV0cywgdXNlIEFSRUZfT1RIRVIuCisgKgorICogVGhlIG9ubHkgZGlmZmVyZW5jZSBpbiB0aGUgYm9hcmRzIGlzIHRoZWlyIG1hc3RlciBjbG9jayBmcmVxdWVuY2llcy4KKyAqCisgKiBSZWZlcmVuY2VzIChmcm9tIGZ0cDovL2Z0cC5uYXRpbnN0LmNvbS9zdXBwb3J0L21hbnVhbHMpOgorICogICAzMjAzNjAucGRmICBBVC1BMjE1MCBVc2VyIE1hbnVhbAorICoKKyAqIFRPRE86CisgKiAtIGFuYWxvZyBsZXZlbCB0cmlnZ2VyaW5nCisgKiAtIFRSSUdfV0FLRV9FT1MKKyAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTczLDQ4ICs1OCw1MiBAQAogCiAvKiBSZWdpc3RlcnMgYW5kIGJpdHMgKi8KICNkZWZpbmUgQ09ORklHX1JFRwkJMHgwCi0jZGVmaW5lICAgQ0hBTk5FTF9CSVRTKHgpCQkoKHgpICYgMHg3KQorI2RlZmluZSAgIENIQU5ORUxfQklUUyh4KQkoKHgpICYgMHg3KQogI2RlZmluZSAgIENIQU5ORUxfTUFTSwkJMHg3Ci0jZGVmaW5lICAgQ0xPQ0tfU0VMRUNUX0JJVFMoeCkJCSgoKHgpICYgMHgzKSA8PCAzKQotI2RlZmluZSAgIENMT0NLX0RJVklTT1JfQklUUyh4KQkJKCgoeCkgJiAweDMpIDw8IDUpCisjZGVmaW5lICAgQ0xPQ0tfU0VMRUNUX0JJVFMoeCkJKCgoeCkgJiAweDMpIDw8IDMpCisjZGVmaW5lICAgQ0xPQ0tfRElWSVNPUl9CSVRTKHgpCSgoKHgpICYgMHgzKSA8PCA1KQogI2RlZmluZSAgIENMT0NLX01BU0sJCSgweGYgPDwgMykKLSNkZWZpbmUgICBFTkFCTEUwX0JJVAkJMHg4MAkvKiAgZW5hYmxlIChkb24ndCBpbnRlcm5hbGx5IGdyb3VuZCkgY2hhbm5lbHMgMCBhbmQgMSAqLwotI2RlZmluZSAgIEVOQUJMRTFfQklUCQkweDEwMAkvKiAgZW5hYmxlIChkb24ndCBpbnRlcm5hbGx5IGdyb3VuZCkgY2hhbm5lbHMgMiBhbmQgMyAqLwotI2RlZmluZSAgIEFDMF9CSVQJCTB4MjAwCS8qICBhYyBjb3VwbGUgY2hhbm5lbHMgMCwxICovCi0jZGVmaW5lICAgQUMxX0JJVAkJMHg0MDAJLyogIGFjIGNvdXBsZSBjaGFubmVscyAyLDMgKi8KLSNkZWZpbmUgICBBUERfQklUCQkweDgwMAkvKiAgYW5hbG9nIHBvd2VyIGRvd24gKi8KLSNkZWZpbmUgICBEUERfQklUCQkweDEwMDAJLyogIGRpZ2l0YWwgcG93ZXIgZG93biAqLwotI2RlZmluZSBUUklHR0VSX1JFRwkJMHgyCS8qICB0cmlnZ2VyIGNvbmZpZyByZWdpc3RlciAqLwotI2RlZmluZSAgIFBPU1RfVFJJR0dFUl9CSVRTCQkweDIKLSNkZWZpbmUgICBERUxBWV9UUklHR0VSX0JJVFMJCTB4MwotI2RlZmluZSAgIEhXX1RSSUdfRU4JCTB4MTAJLyogIGVuYWJsZSBoYXJkd2FyZSB0cmlnZ2VyICovCi0jZGVmaW5lIEZJRk9fU1RBUlRfUkVHCQkweDYJLyogIHNvZnR3YXJlIHN0YXJ0IGFxdWlzdGlvbiB0cmlnZ2VyICovCi0jZGVmaW5lIEZJRk9fUkVTRVRfUkVHCQkweDgJLyogIGNsZWFycyBmaWZvICsgZmlmbyBmbGFncyAqLwotI2RlZmluZSBGSUZPX0RBVEFfUkVHCQkweGEJLyogIHJlYWQgZGF0YSAqLwotI2RlZmluZSBETUFfVENfQ0xFQVJfUkVHCQkweGUJLyogIGNsZWFyIGRtYSB0ZXJtaW5hbCBjb3VudCBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgU1RBVFVTX1JFRwkJMHgxMgkvKiAgcmVhZCBvbmx5ICovCi0jZGVmaW5lICAgRk5FX0JJVAkJMHgxCS8qICBmaWZvIG5vdCBlbXB0eSAqLwotI2RlZmluZSAgIE9WRkxfQklUCQkweDgJLyogIGZpZm8gb3ZlcmZsb3cgKi8KLSNkZWZpbmUgICBFREFRX0JJVAkJMHgxMAkvKiAgZW5kIG9mIGFjcXVpc2l0aW9uIGludGVycnVwdCAqLwotI2RlZmluZSAgIERDQUxfQklUCQkweDIwCS8qICBvZmZzZXQgY2FsaWJyYXRpb24gaW4gcHJvZ3Jlc3MgKi8KLSNkZWZpbmUgICBJTlRSX0JJVAkJMHg0MAkvKiAgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCAqLwotI2RlZmluZSAgIERNQV9UQ19CSVQJCTB4ODAJLyogIGRtYSB0ZXJtaW5hbCBjb3VudCBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkICovCi0jZGVmaW5lICAgSURfQklUUyh4KQkoKCh4KSA+PiA4KSAmIDB4MykKLSNkZWZpbmUgSVJRX0RNQV9DTlRSTF9SRUcJCTB4MTIJLyogIHdyaXRlIG9ubHkgKi8KLSNkZWZpbmUgICBETUFfQ0hBTl9CSVRTKHgpCQkoKHgpICYgMHg3KQkvKiAgc2V0cyBkbWEgY2hhbm5lbCAqLwotI2RlZmluZSAgIERNQV9FTl9CSVQJCTB4OAkvKiAgZW5hYmxlcyBkbWEgKi8KLSNkZWZpbmUgICBJUlFfTFZMX0JJVFMoeCkJCSgoKHgpICYgMHhmKSA8PCA0KQkvKiAgc2V0cyBpcnEgbGV2ZWwgKi8KLSNkZWZpbmUgICBGSUZPX0lOVFJfRU5fQklUCQkweDEwMAkvKiAgZW5hYmxlIGZpZm8gaW50ZXJydXB0cyAqLwotI2RlZmluZSAgIEZJRk9fSU5UUl9GSEZfQklUCQkweDIwMAkvKiAgaW50ZXJydXB0IGZpZm8gaGFsZiBmdWxsICovCi0jZGVmaW5lICAgRE1BX0lOVFJfRU5fQklUCQkweDgwMAkvKiAgZW5hYmxlIGludGVycnVwdCBvbiBkbWEgdGVybWluYWwgY291bnQgKi8KLSNkZWZpbmUgICBETUFfREVNX0VOX0JJVAkweDEwMDAJLyogIGVuYWJsZXMgZGVtYW5kIG1vZGUgZG1hICovCisvKiBlbmFibGUgKGRvbid0IGludGVybmFsbHkgZ3JvdW5kKSBjaGFubmVscyAwIGFuZCAxICovCisjZGVmaW5lICAgRU5BQkxFMF9CSVQJCTB4ODAKKy8qIGVuYWJsZSAoZG9uJ3QgaW50ZXJuYWxseSBncm91bmQpIGNoYW5uZWxzIDIgYW5kIDMgKi8KKyNkZWZpbmUgICBFTkFCTEUxX0JJVAkJMHgxMDAKKyNkZWZpbmUgICBBQzBfQklUCQkweDIwMAkvKiBhYyBjb3VwbGUgY2hhbm5lbHMgMCwxICovCisjZGVmaW5lICAgQUMxX0JJVAkJMHg0MDAJLyogYWMgY291cGxlIGNoYW5uZWxzIDIsMyAqLworI2RlZmluZSAgIEFQRF9CSVQJCTB4ODAwCS8qIGFuYWxvZyBwb3dlciBkb3duICovCisjZGVmaW5lICAgRFBEX0JJVAkJMHgxMDAwCS8qIGRpZ2l0YWwgcG93ZXIgZG93biAqLworI2RlZmluZSBUUklHR0VSX1JFRwkJMHgyCS8qIHRyaWdnZXIgY29uZmlnIHJlZ2lzdGVyICovCisjZGVmaW5lICAgUE9TVF9UUklHR0VSX0JJVFMJMHgyCisjZGVmaW5lICAgREVMQVlfVFJJR0dFUl9CSVRTCTB4MworI2RlZmluZSAgIEhXX1RSSUdfRU4JCTB4MTAJLyogZW5hYmxlIGhhcmR3YXJlIHRyaWdnZXIgKi8KKyNkZWZpbmUgRklGT19TVEFSVF9SRUcJCTB4NgkvKiBzb2Z0d2FyZSBzdGFydCBhcXVpc3Rpb24gdHJpZ2dlciAqLworI2RlZmluZSBGSUZPX1JFU0VUX1JFRwkJMHg4CS8qIGNsZWFycyBmaWZvICsgZmlmbyBmbGFncyAqLworI2RlZmluZSBGSUZPX0RBVEFfUkVHCQkweGEJLyogcmVhZCBkYXRhICovCisjZGVmaW5lIERNQV9UQ19DTEVBUl9SRUcJMHhlCS8qIGNsZWFyIGRtYSB0ZXJtaW5hbCBjb3VudCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU1RBVFVTX1JFRwkJMHgxMgkvKiByZWFkIG9ubHkgKi8KKyNkZWZpbmUgICBGTkVfQklUCQkweDEJLyogZmlmbyBub3QgZW1wdHkgKi8KKyNkZWZpbmUgICBPVkZMX0JJVAkJMHg4CS8qIGZpZm8gb3ZlcmZsb3cgKi8KKyNkZWZpbmUgICBFREFRX0JJVAkJMHgxMAkvKiBlbmQgb2YgYWNxdWlzaXRpb24gaW50ZXJydXB0ICovCisjZGVmaW5lICAgRENBTF9CSVQJCTB4MjAJLyogb2Zmc2V0IGNhbGlicmF0aW9uIGluIHByb2dyZXNzICovCisjZGVmaW5lICAgSU5UUl9CSVQJCTB4NDAJLyogaW50ZXJydXB0IGhhcyBvY2N1cnJlZCAqLworLyogZG1hIHRlcm1pbmFsIGNvdW50IGludGVycnVwdCBoYXMgb2NjdXJyZWQgKi8KKyNkZWZpbmUgICBETUFfVENfQklUCQkweDgwCisjZGVmaW5lICAgSURfQklUUyh4KQkJKCgoeCkgPj4gOCkgJiAweDMpCisjZGVmaW5lIElSUV9ETUFfQ05UUkxfUkVHCTB4MTIJCQkvKiB3cml0ZSBvbmx5ICovCisjZGVmaW5lICAgRE1BX0NIQU5fQklUUyh4KQkoKHgpICYgMHg3KQkJLyogc2V0cyBkbWEgY2hhbm5lbCAqLworI2RlZmluZSAgIERNQV9FTl9CSVQJCTB4OAkJCS8qIGVuYWJsZXMgZG1hICovCisjZGVmaW5lICAgSVJRX0xWTF9CSVRTKHgpCSgoKHgpICYgMHhmKSA8PCA0KQkvKiBzZXRzIGlycSBsZXZlbCAqLworI2RlZmluZSAgIEZJRk9fSU5UUl9FTl9CSVQJMHgxMDAJLyogZW5hYmxlIGZpZm8gaW50ZXJydXB0cyAqLworI2RlZmluZSAgIEZJRk9fSU5UUl9GSEZfQklUCTB4MjAwCS8qIGludGVycnVwdCBmaWZvIGhhbGYgZnVsbCAqLworLyogZW5hYmxlIGludGVycnVwdCBvbiBkbWEgdGVybWluYWwgY291bnQgKi8KKyNkZWZpbmUgICBETUFfSU5UUl9FTl9CSVQJMHg4MDAKKyNkZWZpbmUgICBETUFfREVNX0VOX0JJVAkweDEwMDAJLyogZW5hYmxlcyBkZW1hbmQgbW9kZSBkbWEgKi8KICNkZWZpbmUgSTgyNTNfQkFTRV9SRUcJCTB4MTQKIAogc3RydWN0IGEyMTUwX2JvYXJkIHsKIAljb25zdCBjaGFyICpuYW1lOwotCWludCBjbG9ja1s0XTsJCS8qICBtYXN0ZXIgY2xvY2sgcGVyaW9kcywgaW4gbmFub3NlY29uZHMgKi8KLQlpbnQgbnVtX2Nsb2NrczsJCS8qICBudW1iZXIgb2YgYXZhaWxhYmxlIG1hc3RlciBjbG9jayBzcGVlZHMgKi8KLQlpbnQgYWlfc3BlZWQ7CQkvKiAgbWF4aW11bSBjb252ZXJzaW9uIHJhdGUgaW4gbmFub3NlY29uZHMgKi8KKwlpbnQgY2xvY2tbNF07CQkvKiBtYXN0ZXIgY2xvY2sgcGVyaW9kcywgaW4gbmFub3NlY29uZHMgKi8KKwlpbnQgbnVtX2Nsb2NrczsJCS8qIG51bWJlciBvZiBhdmFpbGFibGUgbWFzdGVyIGNsb2NrIHNwZWVkcyAqLworCWludCBhaV9zcGVlZDsJCS8qIG1heGltdW0gY29udmVyc2lvbiByYXRlIGluIG5hbm9zZWNvbmRzICovCiB9OwogCiAvKiBhbmFsb2cgaW5wdXQgcmFuZ2UgKi8KQEAgLTE0NCw4ICsxMzMsOCBAQAogc3RydWN0IGEyMTUwX3ByaXZhdGUgewogCXN0cnVjdCBjb21lZGlfaXNhZG1hICpkbWE7CiAJdW5zaWduZWQgaW50IGNvdW50OwkvKiBudW1iZXIgb2YgZGF0YSBwb2ludHMgbGVmdCB0byBiZSB0YWtlbiAqLwotCWludCBpcnFfZG1hX2JpdHM7CS8qICBpcnEvZG1hIHJlZ2lzdGVyIGJpdHMgKi8KLQlpbnQgY29uZmlnX2JpdHM7CS8qICBjb25maWcgcmVnaXN0ZXIgYml0cyAqLworCWludCBpcnFfZG1hX2JpdHM7CS8qIGlycS9kbWEgcmVnaXN0ZXIgYml0cyAqLworCWludCBjb25maWdfYml0czsJLyogY29uZmlnIHJlZ2lzdGVyIGJpdHMgKi8KIH07CiAKIC8qIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKi8KQEAgLTE4OSwxMyArMTc4LDEzIEBACiAJICovCiAJcmVzaWR1ZSA9IGNvbWVkaV9pc2FkbWFfZGlzYWJsZShkZXNjLT5jaGFuKTsKIAotCS8qICBmaWd1cmUgb3V0IGhvdyBtYW55IHBvaW50cyB0byByZWFkICovCisJLyogZmlndXJlIG91dCBob3cgbWFueSBwb2ludHMgdG8gcmVhZCAqLwogCW1heF9wb2ludHMgPSBjb21lZGlfYnl0ZXNfdG9fc2FtcGxlcyhzLCBkZXNjLT5zaXplKTsKIAludW1fcG9pbnRzID0gbWF4X3BvaW50cyAtIGNvbWVkaV9ieXRlc190b19zYW1wbGVzKHMsIHJlc2lkdWUpOwogCWlmIChkZXZwcml2LT5jb3VudCA8IG51bV9wb2ludHMgJiYgY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQogCQludW1fcG9pbnRzID0gZGV2cHJpdi0+Y291bnQ7CiAKLQkvKiAgZmlndXJlIG91dCBob3cgbWFueSBwb2ludHMgd2lsbCBiZSBzdG9yZWQgbmV4dCB0aW1lICovCisJLyogZmlndXJlIG91dCBob3cgbWFueSBwb2ludHMgd2lsbCBiZSBzdG9yZWQgbmV4dCB0aW1lICovCiAJbGVmdG92ZXIgPSAwOwogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfTk9ORSkgewogCQlsZWZ0b3ZlciA9IGNvbWVkaV9ieXRlc190b19zYW1wbGVzKHMsIGRlc2MtPnNpemUpOwpAQCAtMjA0LDcgKzE5Myw4IEBACiAJCWlmIChsZWZ0b3ZlciA+IG1heF9wb2ludHMpCiAJCQlsZWZ0b3ZlciA9IG1heF9wb2ludHM7CiAJfQotCS8qIHRoZXJlIHNob3VsZCBvbmx5IGJlIGEgcmVzaWR1ZSBpZiBjb2xsZWN0aW9uIHdhcyBzdG9wcGVkIGJ5IGhhdmluZworCS8qCisJICogVGhlcmUgc2hvdWxkIG9ubHkgYmUgYSByZXNpZHVlIGlmIGNvbGxlY3Rpb24gd2FzIHN0b3BwZWQgYnkgaGF2aW5nCiAJICogdGhlIHN0b3Bfc3JjIHNldCB0byBhbiBleHRlcm5hbCB0cmlnZ2VyLCBpbiB3aGljaCBjYXNlIHRoZXJlCiAJICogd2lsbCBiZSBubyBtb3JlIGRhdGEKIAkgKi8KQEAgLTIxNCw3ICsyMDQsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBudW1fcG9pbnRzOyBpKyspIHsKIAkJLyogd3JpdGUgZGF0YSBwb2ludCB0byBjb21lZGkgYnVmZmVyICovCiAJCWRwbnQgPSBidWZbaV07Ci0JCS8qICBjb252ZXJ0IGZyb20gMidzIGNvbXBsZW1lbnQgdG8gdW5zaWduZWQgY29kaW5nICovCisJCS8qIGNvbnZlcnQgZnJvbSAyJ3MgY29tcGxlbWVudCB0byB1bnNpZ25lZCBjb2RpbmcgKi8KIAkJZHBudCBePSAweDgwMDA7CiAJCWNvbWVkaV9idWZfd3JpdGVfc2FtcGxlcyhzLCAmZHBudCwgMSk7CiAJCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKQEAgLTI0NCwxNCArMjM0LDE0IEBACiAJc3RydWN0IGNvbWVkaV9pc2FkbWEgKmRtYSA9IGRldnByaXYtPmRtYTsKIAlzdHJ1Y3QgY29tZWRpX2lzYWRtYV9kZXNjICpkZXNjID0gJmRtYS0+ZGVzY1swXTsKIAotCS8qICBkaXNhYmxlIGRtYSBvbiBjYXJkICovCisJLyogZGlzYWJsZSBkbWEgb24gY2FyZCAqLwogCWRldnByaXYtPmlycV9kbWFfYml0cyAmPSB+RE1BX0lOVFJfRU5fQklUICYgfkRNQV9FTl9CSVQ7CiAJb3V0dyhkZXZwcml2LT5pcnFfZG1hX2JpdHMsIGRldi0+aW9iYXNlICsgSVJRX0RNQV9DTlRSTF9SRUcpOwogCi0JLyogIGRpc2FibGUgY29tcHV0ZXIncyBkbWEgKi8KKwkvKiBkaXNhYmxlIGNvbXB1dGVyJ3MgZG1hICovCiAJY29tZWRpX2lzYWRtYV9kaXNhYmxlKGRlc2MtPmNoYW4pOwogCi0JLyogIGNsZWFyIGZpZm8gYW5kIHJlc2V0IHRyaWdnZXJpbmcgY2lyY3VpdHJ5ICovCisJLyogY2xlYXIgZmlmbyBhbmQgcmVzZXQgdHJpZ2dlcmluZyBjaXJjdWl0cnkgKi8KIAlvdXR3KDAsIGRldi0+aW9iYXNlICsgRklGT19SRVNFVF9SRUcpOwogCiAJcmV0dXJuIDA7CkBAIC0yNzAsNyArMjYwLDcgQEAKIAlpbnQgbHViX2Rpdmlzb3Jfc2hpZnQsIGx1Yl9pbmRleCwgZ2xiX2Rpdmlzb3Jfc2hpZnQsIGdsYl9pbmRleDsKIAlpbnQgaSwgajsKIAotCS8qICBpbml0aWFsaXplIGdyZWF0ZXN0IGxvd2VyIGFuZCBsZWFzdCB1cHBlciBib3VuZHMgKi8KKwkvKiBpbml0aWFsaXplIGdyZWF0ZXN0IGxvd2VyIGFuZCBsZWFzdCB1cHBlciBib3VuZHMgKi8KIAlsdWJfZGl2aXNvcl9zaGlmdCA9IDM7CiAJbHViX2luZGV4ID0gMDsKIAlsdWIgPSBib2FyZC0+Y2xvY2tbbHViX2luZGV4XSAqICgxIDw8IGx1Yl9kaXZpc29yX3NoaWZ0KTsKQEAgLTI3OCwxOSArMjY4LDE5IEBACiAJZ2xiX2luZGV4ID0gYm9hcmQtPm51bV9jbG9ja3MgLSAxOwogCWdsYiA9IGJvYXJkLT5jbG9ja1tnbGJfaW5kZXhdICogKDEgPDwgZ2xiX2Rpdmlzb3Jfc2hpZnQpOwogCi0JLyogIG1ha2Ugc3VyZSBwZXJpb2QgaXMgaW4gYXZhaWxhYmxlIHJhbmdlICovCisJLyogbWFrZSBzdXJlIHBlcmlvZCBpcyBpbiBhdmFpbGFibGUgcmFuZ2UgKi8KIAlpZiAoKnBlcmlvZCA8IGdsYikKIAkJKnBlcmlvZCA9IGdsYjsKIAlpZiAoKnBlcmlvZCA+IGx1YikKIAkJKnBlcmlvZCA9IGx1YjsKIAotCS8qICB3ZSBjYW4gbXVsdGlwbHkgcGVyaW9kIGJ5IDEsIDIsIDQsIG9yIDgsIHVzaW5nICgxIDw8IGkpICovCisJLyogd2UgY2FuIG11bHRpcGx5IHBlcmlvZCBieSAxLCAyLCA0LCBvciA4LCB1c2luZyAoMSA8PCBpKSAqLwogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJLyogIHRoZXJlIGFyZSBhIG1heGltdW0gb2YgNCBtYXN0ZXIgY2xvY2tzICovCisJCS8qIHRoZXJlIGFyZSBhIG1heGltdW0gb2YgNCBtYXN0ZXIgY2xvY2tzICovCiAJCWZvciAoaiA9IDA7IGogPCBib2FyZC0+bnVtX2Nsb2NrczsgaisrKSB7Ci0JCQkvKiAgdGVtcCBpcyB0aGUgcGVyaW9kIGluIG5hbm9zZWMgd2UgYXJlIGV2YWx1YXRpbmcgKi8KKwkJCS8qIHRlbXAgaXMgdGhlIHBlcmlvZCBpbiBuYW5vc2VjIHdlIGFyZSBldmFsdWF0aW5nICovCiAJCQl0ZW1wID0gYm9hcmQtPmNsb2NrW2pdICogKDEgPDwgaSk7Ci0JCQkvKiAgaWYgaXQgaXMgdGhlIGJlc3QgbWF0Y2ggeWV0ICovCisJCQkvKiBpZiBpdCBpcyB0aGUgYmVzdCBtYXRjaCB5ZXQgKi8KIAkJCWlmICh0ZW1wIDwgbHViICYmIHRlbXAgPj0gKnBlcmlvZCkgewogCQkJCWx1Yl9kaXZpc29yX3NoaWZ0ID0gaTsKIAkJCQlsdWJfaW5kZXggPSBqOwpAQCAtMzA2LDcgKzI5Niw3IEBACiAJc3dpdGNoIChmbGFncyAmIENNREZfUk9VTkRfTUFTSykgewogCWNhc2UgQ01ERl9ST1VORF9ORUFSRVNUOgogCWRlZmF1bHQ6Ci0JCS8qICBpZiBsZWFzdCB1cHBlciBib3VuZCBpcyBiZXR0ZXIgYXBwcm94aW1hdGlvbiAqLworCQkvKiBpZiBsZWFzdCB1cHBlciBib3VuZCBpcyBiZXR0ZXIgYXBwcm94aW1hdGlvbiAqLwogCQlpZiAobHViIC0gKnBlcmlvZCA8ICpwZXJpb2QgLSBnbGIpCiAJCQkqcGVyaW9kID0gbHViOwogCQllbHNlCkBAIC0zMjAsNyArMzEwLDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JLyogIHNldCBjbG9jayBiaXRzIGZvciBjb25maWcgcmVnaXN0ZXIgYXBwcm9wcmlhdGVseSAqLworCS8qIHNldCBjbG9jayBiaXRzIGZvciBjb25maWcgcmVnaXN0ZXIgYXBwcm9wcmlhdGVseSAqLwogCWRldnByaXYtPmNvbmZpZ19iaXRzICY9IH5DTE9DS19NQVNLOwogCWlmICgqcGVyaW9kID09IGx1YikgewogCQlkZXZwcml2LT5jb25maWdfYml0cyB8PQpAQCAtNDk1LDcgKzQ4NSw3IEBACiAJCQkiZG1hIGluY29tcGF0aWJsZSB3aXRoIGhhcmQgcmVhbC10aW1lIGludGVycnVwdCAoQ01ERl9QUklPUklUWSksIGFib3J0aW5nXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KLQkvKiAgY2xlYXIgZmlmbyBhbmQgcmVzZXQgdHJpZ2dlcmluZyBjaXJjdWl0cnkgKi8KKwkvKiBjbGVhciBmaWZvIGFuZCByZXNldCB0cmlnZ2VyaW5nIGNpcmN1aXRyeSAqLwogCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBGSUZPX1JFU0VUX1JFRyk7CiAKIAkvKiBzZXR1cCBjaGFubGlzdCAqLwpAQCAtNTAzLDcgKzQ5Myw3IEBACiAJCQkgICAgICAgY21kLT5jaGFubGlzdF9sZW4pIDwgMCkKIAkJcmV0dXJuIC0xOwogCi0JLyogIHNldHVwIGFjL2RjIGNvdXBsaW5nICovCisJLyogc2V0dXAgYWMvZGMgY291cGxpbmcgKi8KIAlpZiAoQ1JfQVJFRihjbWQtPmNoYW5saXN0WzBdKSA9PSBBUkVGX09USEVSKQogCQlkZXZwcml2LT5jb25maWdfYml0cyB8PSBBQzBfQklUOwogCWVsc2UKQEAgLTUxMywxOCArNTAzLDE4IEBACiAJZWxzZQogCQlkZXZwcml2LT5jb25maWdfYml0cyAmPSB+QUMxX0JJVDsKIAotCS8qICBzZXR1cCB0aW1pbmcgKi8KKwkvKiBzZXR1cCB0aW1pbmcgKi8KIAlhMjE1MF9nZXRfdGltaW5nKGRldiwgJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGNtZC0+ZmxhZ3MpOwogCi0JLyogIHNlbmQgdGltaW5nLCBjaGFubmVsLCBjb25maWcgYml0cyAqLworCS8qIHNlbmQgdGltaW5nLCBjaGFubmVsLCBjb25maWcgYml0cyAqLwogCW91dHcoZGV2cHJpdi0+Y29uZmlnX2JpdHMsIGRldi0+aW9iYXNlICsgQ09ORklHX1JFRyk7CiAKLQkvKiAgaW5pdGlhbGl6ZSBudW1iZXIgb2Ygc2FtcGxlcyByZW1haW5pbmcgKi8KKwkvKiBpbml0aWFsaXplIG51bWJlciBvZiBzYW1wbGVzIHJlbWFpbmluZyAqLwogCWRldnByaXYtPmNvdW50ID0gY21kLT5zdG9wX2FyZyAqIGNtZC0+Y2hhbmxpc3RfbGVuOwogCiAJY29tZWRpX2lzYWRtYV9kaXNhYmxlKGRlc2MtPmNoYW4pOwogCi0JLyogIHNldCBzaXplIG9mIHRyYW5zZmVyIHRvIGZpbGwgaW4gMS8zIHNlY29uZCAqLworCS8qIHNldCBzaXplIG9mIHRyYW5zZmVyIHRvIGZpbGwgaW4gMS8zIHNlY29uZCAqLwogI2RlZmluZSBPTkVfVEhJUkRfU0VDT05EIDMzMzMzMzMzMwogCWRlc2MtPnNpemUgPSBjb21lZGlfYnl0ZXNfcGVyX3NhbXBsZShzKSAqIGNtZC0+Y2hhbmxpc3RfbGVuICoKIAkJICAgIE9ORV9USElSRF9TRUNPTkQgLyBjbWQtPnNjYW5fYmVnaW5fYXJnOwpAQCAtNTM2LDQwICs1MjYsNDUgQEAKIAogCWNvbWVkaV9pc2FkbWFfcHJvZ3JhbShkZXNjKTsKIAotCS8qIGNsZWFyIGRtYSBpbnRlcnJ1cHQgYmVmb3JlIGVuYWJsaW5nIGl0LCB0byB0cnkgYW5kIGdldCByaWQgb2YgdGhhdAotCSAqIG9uZSBzcHVyaW91cyBpbnRlcnJ1cHQgdGhhdCBoYXMgYmVlbiBoYXBwZW5pbmcgKi8KKwkvKgorCSAqIENsZWFyIGRtYSBpbnRlcnJ1cHQgYmVmb3JlIGVuYWJsaW5nIGl0LCB0byB0cnkgYW5kIGdldCByaWQgb2YKKwkgKiB0aGF0IG9uZSBzcHVyaW91cyBpbnRlcnJ1cHQgdGhhdCBoYXMgYmVlbiBoYXBwZW5pbmcuCisJICovCiAJb3V0dygweDAwLCBkZXYtPmlvYmFzZSArIERNQV9UQ19DTEVBUl9SRUcpOwogCi0JLyogIGVuYWJsZSBkbWEgb24gY2FyZCAqLworCS8qIGVuYWJsZSBkbWEgb24gY2FyZCAqLwogCWRldnByaXYtPmlycV9kbWFfYml0cyB8PSBETUFfSU5UUl9FTl9CSVQgfCBETUFfRU5fQklUOwogCW91dHcoZGV2cHJpdi0+aXJxX2RtYV9iaXRzLCBkZXYtPmlvYmFzZSArIElSUV9ETUFfQ05UUkxfUkVHKTsKIAotCS8qICBtYXkgbmVlZCB0byB3YWl0IDcyIHNhbXBsaW5nIHBlcmlvZHMgaWYgdGltaW5nIHdhcyBjaGFuZ2VkICovCisJLyogbWF5IG5lZWQgdG8gd2FpdCA3MiBzYW1wbGluZyBwZXJpb2RzIGlmIHRpbWluZyB3YXMgY2hhbmdlZCAqLwogCWNvbWVkaV84MjU0X2xvYWQoZGV2LT5wYWNlciwgMiwgNzIsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKIAotCS8qICBzZXR1cCBzdGFydCB0cmlnZ2VyaW5nICovCisJLyogc2V0dXAgc3RhcnQgdHJpZ2dlcmluZyAqLwogCXRyaWdnZXJfYml0cyA9IDA7Ci0JLyogIGRlY2lkZSBpZiB3ZSBuZWVkIHRvIHdhaXQgNzIgcGVyaW9kcyBmb3IgdmFsaWQgZGF0YSAqLworCS8qIGRlY2lkZSBpZiB3ZSBuZWVkIHRvIHdhaXQgNzIgcGVyaW9kcyBmb3IgdmFsaWQgZGF0YSAqLwogCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVyAmJgogCSAgICAob2xkX2NvbmZpZ19iaXRzICYgQ0xPQ0tfTUFTSykgIT0KIAkgICAgKGRldnByaXYtPmNvbmZpZ19iaXRzICYgQ0xPQ0tfTUFTSykpIHsKLQkJLyogIHNldCB0cmlnZ2VyIHNvdXJjZSB0byBkZWxheSB0cmlnZ2VyICovCisJCS8qIHNldCB0cmlnZ2VyIHNvdXJjZSB0byBkZWxheSB0cmlnZ2VyICovCiAJCXRyaWdnZXJfYml0cyB8PSBERUxBWV9UUklHR0VSX0JJVFM7CiAJfSBlbHNlIHsKLQkJLyogIG90aGVyd2lzZSBubyBkZWxheSAqLworCQkvKiBvdGhlcndpc2Ugbm8gZGVsYXkgKi8KIAkJdHJpZ2dlcl9iaXRzIHw9IFBPU1RfVFJJR0dFUl9CSVRTOwogCX0KLQkvKiAgZW5hYmxlIGV4dGVybmFsIGhhcmR3YXJlIHRyaWdnZXIgKi8KKwkvKiBlbmFibGUgZXh0ZXJuYWwgaGFyZHdhcmUgdHJpZ2dlciAqLwogCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCkgewogCQl0cmlnZ2VyX2JpdHMgfD0gSFdfVFJJR19FTjsKIAl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfT1RIRVIpIHsKLQkJLyogIFhYWCBhZGQgc3VwcG9ydCBmb3IgbGV2ZWwvc2xvcGUgc3RhcnQgdHJpZ2dlciB1c2luZyBUUklHX09USEVSICovCisJCS8qCisJCSAqIFhYWCBhZGQgc3VwcG9ydCBmb3IgbGV2ZWwvc2xvcGUgc3RhcnQgdHJpZ2dlcgorCQkgKiB1c2luZyBUUklHX09USEVSCisJCSAqLwogCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAieW91IHNob3VsZG4ndCBzZWUgdGhpcz9cbiIpOwogCX0KLQkvKiAgc2VuZCB0cmlnZ2VyIGNvbmZpZyBiaXRzICovCisJLyogc2VuZCB0cmlnZ2VyIGNvbmZpZyBiaXRzICovCiAJb3V0dyh0cmlnZ2VyX2JpdHMsIGRldi0+aW9iYXNlICsgVFJJR0dFUl9SRUcpOwogCi0JLyogIHN0YXJ0IGFjcXVpc2l0aW9uIGZvciBzb2Z0IHRyaWdnZXIgKi8KKwkvKiBzdGFydCBhY3F1aXNpdGlvbiBmb3Igc29mdCB0cmlnZ2VyICovCiAJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XKQogCQlvdXR3KDAsIGRldi0+aW9iYXNlICsgRklGT19TVEFSVF9SRUcpOwogCkBAIC01OTYsMjggKzU5MSwyOCBAQAogCXVuc2lnbmVkIGludCBuOwogCWludCByZXQ7CiAKLQkvKiAgY2xlYXIgZmlmbyBhbmQgcmVzZXQgdHJpZ2dlcmluZyBjaXJjdWl0cnkgKi8KKwkvKiBjbGVhciBmaWZvIGFuZCByZXNldCB0cmlnZ2VyaW5nIGNpcmN1aXRyeSAqLwogCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBGSUZPX1JFU0VUX1JFRyk7CiAKIAkvKiBzZXR1cCBjaGFubGlzdCAqLwogCWlmIChhMjE1MF9zZXRfY2hhbmxpc3QoZGV2LCBDUl9DSEFOKGluc24tPmNoYW5zcGVjKSwgMSkgPCAwKQogCQlyZXR1cm4gLTE7CiAKLQkvKiAgc2V0IGRjIGNvdXBsaW5nICovCisJLyogc2V0IGRjIGNvdXBsaW5nICovCiAJZGV2cHJpdi0+Y29uZmlnX2JpdHMgJj0gfkFDMF9CSVQ7CiAJZGV2cHJpdi0+Y29uZmlnX2JpdHMgJj0gfkFDMV9CSVQ7CiAKLQkvKiAgc2VuZCB0aW1pbmcsIGNoYW5uZWwsIGNvbmZpZyBiaXRzICovCisJLyogc2VuZCB0aW1pbmcsIGNoYW5uZWwsIGNvbmZpZyBiaXRzICovCiAJb3V0dyhkZXZwcml2LT5jb25maWdfYml0cywgZGV2LT5pb2Jhc2UgKyBDT05GSUdfUkVHKTsKIAotCS8qICBkaXNhYmxlIGRtYSBvbiBjYXJkICovCisJLyogZGlzYWJsZSBkbWEgb24gY2FyZCAqLwogCWRldnByaXYtPmlycV9kbWFfYml0cyAmPSB+RE1BX0lOVFJfRU5fQklUICYgfkRNQV9FTl9CSVQ7CiAJb3V0dyhkZXZwcml2LT5pcnFfZG1hX2JpdHMsIGRldi0+aW9iYXNlICsgSVJRX0RNQV9DTlRSTF9SRUcpOwogCi0JLyogIHNldHVwIHN0YXJ0IHRyaWdnZXJpbmcgKi8KKwkvKiBzZXR1cCBzdGFydCB0cmlnZ2VyaW5nICovCiAJb3V0dygwLCBkZXYtPmlvYmFzZSArIFRSSUdHRVJfUkVHKTsKIAotCS8qICBzdGFydCBhY3F1aXNpdGlvbiBmb3Igc29mdCB0cmlnZ2VyICovCisJLyogc3RhcnQgYWNxdWlzaXRpb24gZm9yIHNvZnQgdHJpZ2dlciAqLwogCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBGSUZPX1NUQVJUX1JFRyk7CiAKIAkvKgpAQCAtNjMyLDcgKzYyNyw3IEBACiAJCWludyhkZXYtPmlvYmFzZSArIEZJRk9fREFUQV9SRUcpOwogCX0KIAotCS8qICByZWFkIGRhdGEgKi8KKwkvKiByZWFkIGRhdGEgKi8KIAlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CiAJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgYTIxNTBfYWlfZW9jLCAwKTsKIAkJaWYgKHJldCkKQEAgLTY0Miw3ICs2MzcsNyBAQAogCQlkYXRhW25dIF49IDB4ODAwMDsKIAl9CiAKLQkvKiAgY2xlYXIgZmlmbyBhbmQgcmVzZXQgdHJpZ2dlcmluZyBjaXJjdWl0cnkgKi8KKwkvKiBjbGVhciBmaWZvIGFuZCByZXNldCB0cmlnZ2VyaW5nIGNpcmN1aXRyeSAqLwogCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBGSUZPX1JFU0VUX1JFRyk7CiAKIAlyZXR1cm4gbjsKQEAgLTc0OSwxNiArNzQ0LDE2IEBACiAJCXMtPmNhbmNlbCA9IGEyMTUwX2NhbmNlbDsKIAl9CiAKLQkvKiAgc2V0IGNhcmQncyBpcnEgYW5kIGRtYSBsZXZlbHMgKi8KKwkvKiBzZXQgY2FyZCdzIGlycSBhbmQgZG1hIGxldmVscyAqLwogCW91dHcoZGV2cHJpdi0+aXJxX2RtYV9iaXRzLCBkZXYtPmlvYmFzZSArIElSUV9ETUFfQ05UUkxfUkVHKTsKIAotCS8qICByZXNldCBhbmQgc3luYyBhZGMgY2xvY2sgY2lyY3VpdHJ5ICovCisJLyogcmVzZXQgYW5kIHN5bmMgYWRjIGNsb2NrIGNpcmN1aXRyeSAqLwogCW91dHdfcChEUERfQklUIHwgQVBEX0JJVCwgZGV2LT5pb2Jhc2UgKyBDT05GSUdfUkVHKTsKIAlvdXR3X3AoRFBEX0JJVCwgZGV2LT5pb2Jhc2UgKyBDT05GSUdfUkVHKTsKLQkvKiAgaW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJLyogaW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCiAJZGV2cHJpdi0+Y29uZmlnX2JpdHMgPSAwOwogCW91dHcoZGV2cHJpdi0+Y29uZmlnX2JpdHMsIGRldi0+aW9iYXNlICsgQ09ORklHX1JFRyk7Ci0JLyogIHdhaXQgdW50aWwgb2Zmc2V0IGNhbGlicmF0aW9uIGlzIGRvbmUsIHRoZW4gZW5hYmxlIGFuYWxvZyBpbnB1dHMgKi8KKwkvKiB3YWl0IHVudGlsIG9mZnNldCBjYWxpYnJhdGlvbiBpcyBkb25lLCB0aGVuIGVuYWJsZSBhbmFsb2cgaW5wdXRzICovCiAJZm9yIChpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgewogCQlpZiAoKERDQUxfQklUICYgaW53KGRldi0+aW9iYXNlICsgU1RBVFVTX1JFRykpID09IDApCiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvLmMKaW5kZXggOTU0MzViOC4uZmZjZjdhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvLmMKQEAgLTEsOTMgKzEsODQgQEAKIC8qCi0gICAgY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8uYwotICAgIEhhcmR3YXJlIGRyaXZlciBmb3IgTkkgQVQtTUlPIEUgc2VyaWVzIGNhcmRzCisgKiBDb21lZGkgZHJpdmVyIGZvciBOSSBBVC1NSU8gRSBzZXJpZXMgY2FyZHMKKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMSBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KIAotICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMSBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKi8KIC8qCi1Ecml2ZXI6IG5pX2F0bWlvCi1EZXNjcmlwdGlvbjogTmF0aW9uYWwgSW5zdHJ1bWVudHMgQVQtTUlPLUUgc2VyaWVzCi1BdXRob3I6IGRzCi1EZXZpY2VzOiBbTmF0aW9uYWwgSW5zdHJ1bWVudHNdIEFULU1JTy0xNkUtMSAobmlfYXRtaW8pLAotICBBVC1NSU8tMTZFLTIsIEFULU1JTy0xNkUtMTAsIEFULU1JTy0xNkRFLTEwLCBBVC1NSU8tNjRFLTMsCi0gIEFULU1JTy0xNlhFLTUwLCBBVC1NSU8tMTZYRS0xMCwgQVQtQUktMTZYRS0xMAotU3RhdHVzOiB3b3JrcwotVXBkYXRlZDogVGh1IE1heSAgMSAyMDowMzowMiBDRFQgMjAwMworICogRHJpdmVyOiBuaV9hdG1pbworICogRGVzY3JpcHRpb246IE5hdGlvbmFsIEluc3RydW1lbnRzIEFULU1JTy1FIHNlcmllcworICogQXV0aG9yOiBkcworICogRGV2aWNlczogW05hdGlvbmFsIEluc3RydW1lbnRzXSBBVC1NSU8tMTZFLTEgKG5pX2F0bWlvKSwKKyAqICAgQVQtTUlPLTE2RS0yLCBBVC1NSU8tMTZFLTEwLCBBVC1NSU8tMTZERS0xMCwgQVQtTUlPLTY0RS0zLAorICogICBBVC1NSU8tMTZYRS01MCwgQVQtTUlPLTE2WEUtMTAsIEFULUFJLTE2WEUtMTAKKyAqIFN0YXR1czogd29ya3MKKyAqIFVwZGF0ZWQ6IFRodSBNYXkgIDEgMjA6MDM6MDIgQ0RUIDIwMDMKKyAqCisgKiBUaGUgZHJpdmVyIGhhcyAyLjYga2VybmVsIGlzYXBucCBzdXBwb3J0LCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHByb2JlIGZvcgorICogYSBzdXBwb3J0ZWQgYm9hcmQgaWYgdGhlIEkvTyBiYXNlIGlzIGxlZnQgdW5zcGVjaWZpZWQgd2l0aCBjb21lZGlfY29uZmlnLgorICogSG93ZXZlciwgbWFueSBvZiB0aGUgaXNhcG5wIGlkIG51bWJlcnMgYXJlIHVua25vd24uIElmIHlvdXIgYm9hcmQgaXMgbm90CisgKiByZWNvZ25pemVkLCBwbGVhc2Ugc2VuZCB0aGUgb3V0cHV0IG9mICdjYXQgL3Byb2MvaXNhcG5wJyAoeW91IG1heSBuZWVkIHRvCisgKiBtb2Rwcm9iZSB0aGUgaXNhLXBucCBtb2R1bGUgZm9yIC9wcm9jL2lzYXBucCB0byBleGlzdCkgc28gdGhlIGlkIG51bWJlcnMKKyAqIGZvciB5b3VyIGJvYXJkIGNhbiBiZSBhZGRlZCB0byB0aGUgZHJpdmVyLgorICoKKyAqIE90aGVyd2lzZSwgeW91IGNhbiB1c2UgdGhlIGlzYXBucHRvb2xzIHBhY2thZ2UgdG8gY29uZmlndXJlIHlvdXIgYm9hcmQuCisgKiBVc2UgaXNhcG5wIHRvIGNvbmZpZ3VyZSB0aGUgSS9PIGJhc2UgYW5kIElSUSBmb3IgdGhlIGJvYXJkLCBhbmQgdGhlbiBwYXNzCisgKiB0aGUgc2FtZSB2YWx1ZXMgYXMgcGFyYW1ldGVycyBpbiBjb21lZGlfY29uZmlnLiBBIHNhbXBsZSBpc2FwbnAuY29uZiBmaWxlCisgKiBpcyBpbmNsdWRlZCBpbiB0aGUgZXRjLyBkaXJlY3Rvcnkgb2YgQ29tZWRpbGliLgorICoKKyAqIENvbWVkaWxpYiBpbmNsdWRlcyBhIHV0aWxpdHkgdG8gYXV0b2NhbGlicmF0ZSB0aGVzZSBib2FyZHMuIFRoZSBib2FyZHMKKyAqIHNlZW0gdG8gYm9vdCBpbnRvIGEgc3RhdGUgd2hlcmUgdGhlIGFsbCBjYWxpYnJhdGlvbiBEQUNzIGFyZSBhdCBvbmUKKyAqIGV4dHJlbWUgb2YgdGhlaXIgcmFuZ2UsIHRodXMgdGhlIGRlZmF1bHQgY2FsaWJyYXRpb24gaXMgdGVycmlibGUuCisgKiBDYWxpYnJhdGlvbiBhdCBib290IGlzIHN0cm9uZ2x5IGVuY291cmFnZWQuCisgKgorICogVG8gdXNlIHRoZSBleHRlbmRlZCBkaWdpdGFsIEkvTyBvbiBzb21lIG9mIHRoZSBib2FyZHMsIGVuYWJsZSB0aGUKKyAqIDgyNTUgZHJpdmVyIHdoZW4gY29uZmlndXJpbmcgdGhlIENvbWVkaSBzb3VyY2UgdHJlZS4KKyAqCisgKiBFeHRlcm5hbCB0cmlnZ2VyaW5nIGlzIHN1cHBvcnRlZCBmb3Igc29tZSBldmVudHMuIFRoZSBjaGFubmVsIGluZGV4CisgKiAoc2Nhbl9iZWdpbl9hcmcsIGV0Yy4pIG1hcHMgdG8gUEZJMCAtIFBGSTkuCisgKgorICogU29tZSBvZiB0aGUgbW9yZSBlc290ZXJpYyB0cmlnZ2VyaW5nIHBvc3NpYmlsaXRpZXMgb2YgdGhlc2UgYm9hcmRzIGFyZQorICogbm90IHN1cHBvcnRlZC4KKyAqLwogCi1UaGUgZHJpdmVyIGhhcyAyLjYga2VybmVsIGlzYXBucCBzdXBwb3J0LCBhbmQKLXdpbGwgYXV0b21hdGljYWxseSBwcm9iZSBmb3IgYSBzdXBwb3J0ZWQgYm9hcmQgaWYgdGhlCi1JL08gYmFzZSBpcyBsZWZ0IHVuc3BlY2lmaWVkIHdpdGggY29tZWRpX2NvbmZpZy4KLUhvd2V2ZXIsIG1hbnkgb2YKLXRoZSBpc2FwbnAgaWQgbnVtYmVycyBhcmUgdW5rbm93bi4gIElmIHlvdXIgYm9hcmQgaXMgbm90Ci1yZWNvZ25pemVkLCBwbGVhc2Ugc2VuZCB0aGUgb3V0cHV0IG9mICdjYXQgL3Byb2MvaXNhcG5wJwotKHlvdSBtYXkgbmVlZCB0byBtb2Rwcm9iZSB0aGUgaXNhLXBucCBtb2R1bGUgZm9yCi0vcHJvYy9pc2FwbnAgdG8gZXhpc3QpIHNvIHRoZQotaWQgbnVtYmVycyBmb3IgeW91ciBib2FyZCBjYW4gYmUgYWRkZWQgdG8gdGhlIGRyaXZlci4KLQotT3RoZXJ3aXNlLCB5b3UgY2FuIHVzZSB0aGUgaXNhcG5wdG9vbHMgcGFja2FnZSB0byBjb25maWd1cmUKLXlvdXIgYm9hcmQuICBVc2UgaXNhcG5wIHRvCi1jb25maWd1cmUgdGhlIEkvTyBiYXNlIGFuZCBJUlEgZm9yIHRoZSBib2FyZCwgYW5kIHRoZW4gcGFzcwotdGhlIHNhbWUgdmFsdWVzIGFzCi1wYXJhbWV0ZXJzIGluIGNvbWVkaV9jb25maWcuICBBIHNhbXBsZSBpc2FwbnAuY29uZiBmaWxlIGlzIGluY2x1ZGVkCi1pbiB0aGUgZXRjLyBkaXJlY3Rvcnkgb2YgQ29tZWRpbGliLgotCi1Db21lZGlsaWIgaW5jbHVkZXMgYSB1dGlsaXR5IHRvIGF1dG9jYWxpYnJhdGUgdGhlc2UgYm9hcmRzLiAgVGhlCi1ib2FyZHMgc2VlbSB0byBib290IGludG8gYSBzdGF0ZSB3aGVyZSB0aGUgYWxsIGNhbGlicmF0aW9uIERBQ3MKLWFyZSBhdCBvbmUgZXh0cmVtZSBvZiB0aGVpciByYW5nZSwgdGh1cyB0aGUgZGVmYXVsdCBjYWxpYnJhdGlvbgotaXMgdGVycmlibGUuICBDYWxpYnJhdGlvbiBhdCBib290IGlzIHN0cm9uZ2x5IGVuY291cmFnZWQuCi0KLVRvIHVzZSB0aGUgZXh0ZW5kZWQgZGlnaXRhbCBJL08gb24gc29tZSBvZiB0aGUgYm9hcmRzLCBlbmFibGUgdGhlCi04MjU1IGRyaXZlciB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBDb21lZGkgc291cmNlIHRyZWUuCi0KLUV4dGVybmFsIHRyaWdnZXJpbmcgaXMgc3VwcG9ydGVkIGZvciBzb21lIGV2ZW50cy4gIFRoZSBjaGFubmVsIGluZGV4Ci0oc2Nhbl9iZWdpbl9hcmcsIGV0Yy4pIG1hcHMgdG8gUEZJMCAtIFBGSTkuCi0KLVNvbWUgb2YgdGhlIG1vcmUgZXNvdGVyaWMgdHJpZ2dlcmluZyBwb3NzaWJpbGl0aWVzIG9mIHRoZXNlIGJvYXJkcwotYXJlIG5vdCBzdXBwb3J0ZWQuCi0qLwogLyoKLQlUaGUgcmVhbCBndXRzIG9mIHRoZSBkcml2ZXIgaXMgaW4gbmlfbWlvX2NvbW1vbi5jLCB3aGljaCBpcyBpbmNsdWRlZAotCWJvdGggaGVyZSBhbmQgaW4gbmlfcGNpbWlvLmMKLQotCUludGVycnVwdCBzdXBwb3J0IGFkZGVkIGJ5IFRydXh0b24gRnVsdG9uIDx0cnV4QHRydXh0b24uY29tPgotCi0JUmVmZXJlbmNlcyBmb3Igc3BlY2lmaWNhdGlvbnM6Ci0KLQkgICAzNDA3NDdiLnBkZiAgUmVnaXN0ZXIgTGV2ZWwgUHJvZ3JhbW1lciBNYW51YWwgKG9ic29sZXRlKQotCSAgIDM0MDc0N2MucGRmICBSZWdpc3RlciBMZXZlbCBQcm9ncmFtbWVyIE1hbnVhbCAobmV3KQotCSAgIERBUS1TVEMgcmVmZXJlbmNlIG1hbnVhbAotCi0JT3RoZXIgcG9zc2libHkgcmVsZXZhbnQgaW5mbzoKLQotCSAgIDMyMDUxN2MucGRmICBVc2VyIG1hbnVhbCAob2Jzb2xldGUpCi0JICAgMzIwNTE3Zi5wZGYgIFVzZXIgbWFudWFsIChuZXcpCi0JICAgMzIwODg5YS5wZGYgIGRlbGV0ZQotCSAgIDMyMDkwNmMucGRmICBtYXhpbXVtIHNpZ25hbCByYXRpbmdzCi0JICAgMzIxMDY2YS5wZGYgIGFib3V0IDE2eAotCSAgIDMyMTc5MWEucGRmICBkaXNjb250aW51YXRpb24gb2YgYXQtbWlvLTE2ZS0xMCByZXYuIGMKLQkgICAzMjE4MDhhLnBkZiAgYWJvdXQgYXQtbWlvLTE2ZS0xMCByZXYgUAotCSAgIDMyMTgzN2EucGRmICBkaXNjb250aW51YXRpb24gb2YgYXQtbWlvLTE2ZGUtMTAgcmV2IGQKLQkgICAzMjE4MzhhLnBkZiAgYWJvdXQgYXQtbWlvLTE2ZGUtMTAgcmV2IE4KLQotCUlTU1VFUzoKLQotCW5lZWQgdG8gZGVhbCB3aXRoIGV4dGVybmFsIHJlZmVyZW5jZSBmb3IgREFDLCBhbmQgb3RoZXIgREFDCi0JcHJvcGVydGllcyBpbiBib2FyZCBwcm9wZXJ0aWVzCi0KLQlkZWFsIHdpdGggYXQtbWlvLTE2ZGUtMTAgcmV2aXNpb24gRCB0byBOIGNoYW5nZXMsIGV0Yy4KLQotKi8KKyAqIFRoZSByZWFsIGd1dHMgb2YgdGhlIGRyaXZlciBpcyBpbiBuaV9taW9fY29tbW9uLmMsIHdoaWNoIGlzIGluY2x1ZGVkCisgKiBib3RoIGhlcmUgYW5kIGluIG5pX3BjaW1pby5jCisgKgorICogSW50ZXJydXB0IHN1cHBvcnQgYWRkZWQgYnkgVHJ1eHRvbiBGdWx0b24gPHRydXhAdHJ1eHRvbi5jb20+CisgKgorICogUmVmZXJlbmNlcyBmb3Igc3BlY2lmaWNhdGlvbnM6CisgKgkzNDA3NDdiLnBkZiAgUmVnaXN0ZXIgTGV2ZWwgUHJvZ3JhbW1lciBNYW51YWwgKG9ic29sZXRlKQorICoJMzQwNzQ3Yy5wZGYgIFJlZ2lzdGVyIExldmVsIFByb2dyYW1tZXIgTWFudWFsIChuZXcpCisgKgkJICAgICBEQVEtU1RDIHJlZmVyZW5jZSBtYW51YWwKKyAqCisgKiBPdGhlciBwb3NzaWJseSByZWxldmFudCBpbmZvOgorICoJMzIwNTE3Yy5wZGYgIFVzZXIgbWFudWFsIChvYnNvbGV0ZSkKKyAqCTMyMDUxN2YucGRmICBVc2VyIG1hbnVhbCAobmV3KQorICoJMzIwODg5YS5wZGYgIGRlbGV0ZQorICoJMzIwOTA2Yy5wZGYgIG1heGltdW0gc2lnbmFsIHJhdGluZ3MKKyAqCTMyMTA2NmEucGRmICBhYm91dCAxNngKKyAqCTMyMTc5MWEucGRmICBkaXNjb250aW51YXRpb24gb2YgYXQtbWlvLTE2ZS0xMCByZXYuIGMKKyAqCTMyMTgwOGEucGRmICBhYm91dCBhdC1taW8tMTZlLTEwIHJldiBQCisgKgkzMjE4MzdhLnBkZiAgZGlzY29udGludWF0aW9uIG9mIGF0LW1pby0xNmRlLTEwIHJldiBkCisgKgkzMjE4MzhhLnBkZiAgYWJvdXQgYXQtbWlvLTE2ZGUtMTAgcmV2IE4KKyAqCisgKiBJU1NVRVM6CisgKiAtIG5lZWQgdG8gZGVhbCB3aXRoIGV4dGVybmFsIHJlZmVyZW5jZSBmb3IgREFDLCBhbmQgb3RoZXIgREFDCisgKiAgIHByb3BlcnRpZXMgaW4gYm9hcmQgcHJvcGVydGllcworICogLSBkZWFsIHdpdGggYXQtbWlvLTE2ZGUtMTAgcmV2aXNpb24gRCB0byBOIGNoYW5nZXMsIGV0Yy4KKyAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC05OCwxMCArODksNyBAQAogI2luY2x1ZGUgIm5pX3N0Yy5oIgogI2luY2x1ZGUgIjgyNTUuaCIKIAotLyoKLSAqICBBVCBzcGVjaWZpYyBzZXR1cAotICovCi0KKy8qIEFUIHNwZWNpZmljIHNldHVwICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5pX2JvYXJkX3N0cnVjdCBuaV9ib2FyZHNbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJhdC1taW8tMTZlLTEiLApAQCAtMjE1LDcgKzIwMyw3IEBACiAJCS5uX2FkY2hhbgk9IDE2LAogCQkuYWlfbWF4ZGF0YQk9IDB4ZmZmZiwKIAkJLmFpX2ZpZm9fZGVwdGgJPSA1MTIsCi0JCS5hbHdheXNkaXRoZXIJPSAxLAkvKiB1bmtub3duICovCisJCS5hbHdheXNkaXRoZXIJPSAxLAkJLyogdW5rbm93biAqLwogCQkuZ2FpbmxrdXAJPSBhaV9nYWluXzE0LAogCQkuYWlfc3BlZWQJPSAxMDAwMCwKIAkJLmNhbGRhYwkJPSB7IGRhYzg4MDAsIGRhYzgwNDMsIGFkODUyMiB9LApAQCAtMjg3LDEwICsyNzUsMTAgQEAKIAl9CiAJaWYgKGRldmljZV9pZCA9PSAyNTUpCiAJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJjYW4ndCBmaW5kIGJvYXJkXG4iKTsKLQkgZWxzZSBpZiAoZGV2aWNlX2lkID09IDApCisJZWxzZSBpZiAoZGV2aWNlX2lkID09IDApCiAJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCiAJCQkiRUVQUk9NIHJlYWQgZXJyb3IgKD8pIG9yIGRldmljZSBub3QgZm91bmRcbiIpOwotCSBlbHNlCisJZWxzZQogCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAogCQkJInVua25vd24gZGV2aWNlIElEICVkIC0tIGNvbnRhY3QgYXV0aG9yXG4iLCBkZXZpY2VfaWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pbzE2ZC5jCmluZGV4IGMzZWI1NDYuLmZiNTliMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pbzE2ZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pbzE2ZC5jCkBAIC0xLDI1ICsxLDQxIEBACiAvKgotICAgY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYwotICAgSGFyZHdhcmUgZHJpdmVyIGZvciBOYXRpb25hbCBJbnN0cnVtZW50cyBBVC1NSU8xNkQgYm9hcmQKLSAgIENvcHlyaWdodCAoQykgMjAwMCBDaHJpcyBSLiBCYXVnaGVyIDxiYXVnaGVyQGVudGVyYWN0LmNvbT4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIENvbWVkaSBkcml2ZXIgZm9yIE5hdGlvbmFsIEluc3RydW1lbnRzIEFULU1JTzE2RCBib2FyZAorICogQ29weXJpZ2h0IChDKSAyMDAwIENocmlzIFIuIEJhdWdoZXIgPGJhdWdoZXJAZW50ZXJhY3QuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLworCiAvKgotRHJpdmVyOiBuaV9hdG1pbzE2ZAotRGVzY3JpcHRpb246IE5hdGlvbmFsIEluc3RydW1lbnRzIEFULU1JTy0xNkQKLUF1dGhvcjogQ2hyaXMgUi4gQmF1Z2hlciA8YmF1Z2hlckBlbnRlcmFjdC5jb20+Ci1TdGF0dXM6IHVua25vd24KLURldmljZXM6IFtOYXRpb25hbCBJbnN0cnVtZW50c10gQVQtTUlPLTE2IChhdG1pbzE2KSwgQVQtTUlPLTE2RCAoYXRtaW8xNmQpCi0qLworICogRHJpdmVyOiBuaV9hdG1pbzE2ZAorICogRGVzY3JpcHRpb246IE5hdGlvbmFsIEluc3RydW1lbnRzIEFULU1JTy0xNkQKKyAqIEF1dGhvcjogQ2hyaXMgUi4gQmF1Z2hlciA8YmF1Z2hlckBlbnRlcmFjdC5jb20+CisgKiBTdGF0dXM6IHVua25vd24KKyAqIERldmljZXM6IFtOYXRpb25hbCBJbnN0cnVtZW50c10gQVQtTUlPLTE2IChhdG1pbzE2KSwgQVQtTUlPLTE2RCAoYXRtaW8xNmQpCisgKgorICogQ29uZmlndXJhdGlvbiBvcHRpb25zOgorICogICBbMF0gLSBJL08gcG9ydAorICogICBbMV0gLSBNSU8gaXJxICgwID09IG5vIGlycTsgb3IgMyw0LDUsNiw3LDksMTAsMTEsMTIsMTQsMTUpCisgKiAgIFsyXSAtIERJTyBpcnEgKDAgPT0gbm8gaXJxOyBvciAzLDQsNSw2LDcsOSkKKyAqICAgWzNdIC0gRE1BMSBjaGFubmVsICgwID09IG5vIERNQTsgb3IgNSw2LDcpCisgKiAgIFs0XSAtIERNQTIgY2hhbm5lbCAoMCA9PSBubyBETUE7IG9yIDUsNiw3KQorICogICBbNV0gLSBhL2QgbXV4ICgwPWRpZmZlcmVudGlhbDsgMT1zaW5nbGUpCisgKiAgIFs2XSAtIGEvZCByYW5nZSAoMD1iaXBvbGFyMTA7IDE9Ymlwb2xhcjU7IDI9dW5pcG9sYXIxMCkKKyAqICAgWzddIC0gZGFjMCByYW5nZSAoMD1iaXBvbGFyOyAxPXVuaXBvbGFyKQorICogICBbOF0gLSBkYWMwIHJlZmVyZW5jZSAoMD1pbnRlcm5hbDsgMT1leHRlcm5hbCkKKyAqICAgWzldIC0gZGFjMCBjb2RpbmcgKDA9MidzIGNvbXA7IDE9c3RyYWlnaHQgYmluYXJ5KQorICogICBbMTBdIC0gZGFjMSByYW5nZSAoc2FtZSBhcyBkYWMwIG9wdGlvbnMpCisgKiAgIFsxMV0gLSBkYWMxIHJlZmVyZW5jZSAoc2FtZSBhcyBkYWMwIG9wdGlvbnMpCisgKiAgIFsxMl0gLSBkYWMxIGNvZGluZyAoc2FtZSBhcyBkYWMwIG9wdGlvbnMpCisgKi8KKwogLyoKICAqIEkgbXVzdCBnaXZlIGNyZWRpdCBoZXJlIHRvIE1pY2hhbCBEb2JlcyA8ZG9iZXNAdGVzbmV0LmN6PiB3aG8KICAqIHdyb3RlIHRoZSBkcml2ZXIgZm9yIEFkdmFudGVjJ3MgcGNsODEyIGJvYXJkcy4gSSB1c2VkIHRoZSBpbnRlcnJ1cHQKQEAgLTI5NSw4ICszMTEsMTAgQEAKIAl1bnNpZ25lZCBpbnQgc2FtcGxlX2NvdW50LCB0bXAsIGNoYW4sIGdhaW47CiAJaW50IGk7CiAKLQkvKiBUaGlzIGlzIHNsb3dseSBiZWNvbWluZyBhIHdvcmtpbmcgY29tbWFuZCBpbnRlcmZhY2UuICoKLQkgKiBJdCBpcyBzdGlsbCB1YmVyLWV4cGVyaW1lbnRhbCAqLworCS8qCisJICogVGhpcyBpcyBzbG93bHkgYmVjb21pbmcgYSB3b3JraW5nIGNvbW1hbmQgaW50ZXJmYWNlLgorCSAqIEl0IGlzIHN0aWxsIHViZXItZXhwZXJpbWVudGFsCisJICovCiAKIAlyZXNldF9jb3VudGVycyhkZXYpOwogCkBAIC0zMjIsOSArMzQwLDEwIEBACiAJCW91dHcodG1wLCBkZXYtPmlvYmFzZSArIE1VWF9HQUlOX1JFRyk7CiAJfQogCi0JLyogTm93IHByb2dyYW0gdGhlIHNhbXBsZSBpbnRlcnZhbCB0aW1lciAqLwotCS8qIEZpZ3VyZSBvdXQgd2hpY2ggY2xvY2sgdG8gdXNlIHRoZW4gZ2V0IGFuCi0JICogYXBwcm9wcmlhdGUgdGltZXIgdmFsdWUgKi8KKwkvKgorCSAqIE5vdyBwcm9ncmFtIHRoZSBzYW1wbGUgaW50ZXJ2YWwgdGltZXIuCisJICogRmlndXJlIG91dCB3aGljaCBjbG9jayB0byB1c2UgdGhlbiBnZXQgYW4gYXBwcm9wcmlhdGUgdGltZXIgdmFsdWUuCisJICovCiAJaWYgKGNtZC0+Y29udmVydF9hcmcgPCA2NTUzNjAwMCkgewogCQliYXNlX2Nsb2NrID0gQ0xPQ0tfMV9NSFo7CiAJCXRpbWVyID0gY21kLT5jb252ZXJ0X2FyZyAvIDEwMDA7CkBAIC0zODYsOSArNDA1LDEwIEBACiAJCW91dHcoZGV2cHJpdi0+Y29tX3JlZ18xX3N0YXRlLCBkZXYtPmlvYmFzZSArIENPTV9SRUdfMSk7CiAJfQogCi0JLyogUHJvZ3JhbSB0aGUgc2NhbiBpbnRlcnZhbCB0aW1lciBPTkxZIElGIFNDQU5OSU5HIElTIEVOQUJMRUQgKi8KLQkvKiBGaWd1cmUgb3V0IHdoaWNoIGNsb2NrIHRvIHVzZSB0aGVuIGdldCBhbgotCSAqIGFwcHJvcHJpYXRlIHRpbWVyIHZhbHVlICovCisJLyoKKwkgKiBQcm9ncmFtIHRoZSBzY2FuIGludGVydmFsIHRpbWVyIE9OTFkgSUYgU0NBTk5JTkcgSVMgRU5BQkxFRC4KKwkgKiBGaWd1cmUgb3V0IHdoaWNoIGNsb2NrIHRvIHVzZSB0aGVuIGdldCBhbiBhcHByb3ByaWF0ZSB0aW1lciB2YWx1ZS4KKwkgKi8KIAlpZiAoY21kLT5jaGFubGlzdF9sZW4gPiAxKSB7CiAJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnIDwgNjU1MzYwMDApIHsKIAkJCWJhc2VfY2xvY2sgPSBDTE9DS18xX01IWjsKQEAgLTU2NiwzOCArNTg2LDYgQEAKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAotLyoKLSAgIG9wdGlvbnNbMF0gLSBJL08gcG9ydAotICAgb3B0aW9uc1sxXSAtIE1JTyBpcnEKLQkJMCA9PSBubyBpcnEKLQkJTiA9PSBpcnEgTiB7Myw0LDUsNiw3LDksMTAsMTEsMTIsMTQsMTV9Ci0gICBvcHRpb25zWzJdIC0gRElPIGlycQotCQkwID09IG5vIGlycQotCQlOID09IGlycSBOIHszLDQsNSw2LDcsOX0KLSAgIG9wdGlvbnNbM10gLSBETUExIGNoYW5uZWwKLQkJMCA9PSBubyBETUEKLQkJTiA9PSBETUEgTiB7NSw2LDd9Ci0gICBvcHRpb25zWzRdIC0gRE1BMiBjaGFubmVsCi0JCTAgPT0gbm8gRE1BCi0JCU4gPT0gRE1BIE4gezUsNiw3fQotCi0gICBvcHRpb25zWzVdIC0gYS9kIG11eAotCTA9ZGlmZmVyZW50aWFsLCAxPXNpbmdsZQotICAgb3B0aW9uc1s2XSAtIGEvZCByYW5nZQotCTA9Ymlwb2xhcjEwLCAxPWJpcG9sYXI1LCAyPXVuaXBvbGFyMTAKLQotICAgb3B0aW9uc1s3XSAtIGRhYzAgcmFuZ2UKLQkwPWJpcG9sYXIsIDE9dW5pcG9sYXIKLSAgIG9wdGlvbnNbOF0gLSBkYWMwIHJlZmVyZW5jZQotCTA9aW50ZXJuYWwsIDE9ZXh0ZXJuYWwKLSAgIG9wdGlvbnNbOV0gLSBkYWMwIGNvZGluZwotCTA9MidzIGNvbXAsIDE9c3RyYWlnaHQgYmluYXJ5Ci0KLSAgIG9wdGlvbnNbMTBdIC0gZGFjMSByYW5nZQotICAgb3B0aW9uc1sxMV0gLSBkYWMxIHJlZmVyZW5jZQotICAgb3B0aW9uc1sxMl0gLSBkYWMxIGNvZGluZwotICovCi0KIHN0YXRpYyBpbnQgYXRtaW8xNmRfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxX2RpbzI0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxX2RpbzI0LmMKaW5kZXggZDlkZTgzYS4uNzMzZDNmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2RhcV9kaW8yNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9kYXFfZGlvMjQuYwpAQCAtMSwzNSArMSwzNSBAQAogLyoKLSAgICBjb21lZGkvZHJpdmVycy9uaV9kYXFfZGlvMjQuYwotICAgIERyaXZlciBmb3IgTmF0aW9uYWwgSW5zdHJ1bWVudHMgUENNQ0lBIERBUS1DYXJkIERJTy0yNAotICAgIENvcHlyaWdodCAoQykgMjAwMiBEYW5pZWwgVmVjaW5vIENhc3RlbCA8ZHZlY2lub0BhYmxlLmVzPgorICogQ29tZWRpIGRyaXZlciBmb3IgTmF0aW9uYWwgSW5zdHJ1bWVudHMgUENNQ0lBIERBUS1DYXJkIERJTy0yNAorICogQ29weXJpZ2h0IChDKSAyMDAyIERhbmllbCBWZWNpbm8gQ2FzdGVsIDxkdmVjaW5vQGFibGUuZXM+CisgKgorICogUENNQ0lBIGNyYXAgYXQgZW5kIG9mIGZpbGUgaXMgYWRhcHRlZCBmcm9tIGR1bW15X2NzLmMgMS4zMQorICogMjAwMS8wOC8yNCAxMjoxMzoxMyBmcm9tIHRoZSBwY21jaWEgcGFja2FnZS4KKyAqIFRoZSBpbml0aWFsIGRldmVsb3BlciBvZiB0aGUgcGNtY2lhIGR1bW15X2NzLmMgY29kZSBpcyBEYXZpZCBBLiBIaW5kcworICogPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0Pi4gIFBvcnRpb25zIGNyZWF0ZWQgYnkgRGF2aWQgQS4gSGluZHMKKyAqIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgQS4gSGluZHMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLwogCi0gICAgUENNQ0lBIGNyYXAgYXQgZW5kIG9mIGZpbGUgaXMgYWRhcHRlZCBmcm9tIGR1bW15X2NzLmMgMS4zMQotICAgIDIwMDEvMDgvMjQgMTI6MTM6MTMgZnJvbSB0aGUgcGNtY2lhIHBhY2thZ2UuCi0gICAgVGhlIGluaXRpYWwgZGV2ZWxvcGVyIG9mIHRoZSBwY21jaWEgZHVtbXlfY3MuYyBjb2RlIGlzIERhdmlkIEEuIEhpbmRzCi0gICAgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0Pi4gIFBvcnRpb25zIGNyZWF0ZWQgYnkgRGF2aWQgQS4gSGluZHMKLSAgICBhcmUgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIEhpbmRzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKi8KIC8qCi1Ecml2ZXI6IG5pX2RhcV9kaW8yNAotRGVzY3JpcHRpb246IE5hdGlvbmFsIEluc3RydW1lbnRzIFBDTUNJQSBEQVEtQ2FyZCBESU8tMjQKLUF1dGhvcjogRGFuaWVsIFZlY2lubyBDYXN0ZWwgPGR2ZWNpbm9AYWJsZS5lcz4KLURldmljZXM6IFtOYXRpb25hbCBJbnN0cnVtZW50c10gUENNQ0lBIERBUS1DYXJkIERJTy0yNCAobmlfZGFxX2RpbzI0KQotU3RhdHVzOiA/Ci1VcGRhdGVkOiBUaHUsIDA3IE5vdiAyMDAyIDIxOjUzOjA2IC0wODAwCi0KLVRoaXMgaXMganVzdCBhIHdyYXBwZXIgYXJvdW5kIHRoZSA4MjU1Lm8gZHJpdmVyIHRvIHByb3Blcmx5IGhhbmRsZQotdGhlIFBDTUNJQSBpbnRlcmZhY2UuCi0qLworICogRHJpdmVyOiBuaV9kYXFfZGlvMjQKKyAqIERlc2NyaXB0aW9uOiBOYXRpb25hbCBJbnN0cnVtZW50cyBQQ01DSUEgREFRLUNhcmQgRElPLTI0CisgKiBBdXRob3I6IERhbmllbCBWZWNpbm8gQ2FzdGVsIDxkdmVjaW5vQGFibGUuZXM+CisgKiBEZXZpY2VzOiBbTmF0aW9uYWwgSW5zdHJ1bWVudHNdIFBDTUNJQSBEQVEtQ2FyZCBESU8tMjQgKG5pX2RhcV9kaW8yNCkKKyAqIFN0YXR1czogPworICogVXBkYXRlZDogVGh1LCAwNyBOb3YgMjAwMiAyMTo1MzowNiAtMDgwMAorICoKKyAqIFRoaXMgaXMganVzdCBhIHdyYXBwZXIgYXJvdW5kIHRoZSA4MjU1Lm8gZHJpdmVyIHRvIHByb3Blcmx5IGhhbmRsZQorICogdGhlIFBDTUNJQSBpbnRlcmZhY2UuCisgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgIi4uL2NvbWVkaV9wY21jaWEuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY29tbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NvbW1vbi5jCmluZGV4IDhkYWJiMTkuLjBmOTdkN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jb21tb24uYwpAQCAtMjc3Miw3ICsyNzcyLDE1IEBACiAJaW50IGk7CiAJc3RhdGljIGNvbnN0IGludCB0aW1lb3V0ID0gMTAwMDsKIAotCWlmICh0cmlnX251bSAhPSBjbWQtPnN0YXJ0X2FyZykKKwkvKgorCSAqIFJlcXVpcmUgdHJpZ19udW0gPT0gY21kLT5zdGFydF9hcmcgd2hlbiBjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0lOVC4KKwkgKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGFsc28gYWxsb3cgdHJpZ19udW0gPT0gMCB3aGVuCisJICogY21kLT5zdGFydF9zcmMgIT0gVFJJR19JTlQgKGkuZS4gd2hlbiBjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCk7CisJICogaW4gdGhhdCBjYXNlLCB0aGUgaW50ZXJuYWwgdHJpZ2dlciBpcyBiZWluZyB1c2VkIGFzIGEgcHJlLXRyaWdnZXIKKwkgKiBiZWZvcmUgdGhlIGV4dGVybmFsIHRyaWdnZXIuCisJICovCisJaWYgKCEodHJpZ19udW0gPT0gY21kLT5zdGFydF9hcmcgfHwKKwkgICAgICAodHJpZ19udW0gPT0gMCAmJiBjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX0lOVCkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qCkBAIC01NDgwLDcgKzU0ODgsNyBAQAogCQlzLT5tYXhkYXRhCT0gKGRldnByaXYtPmlzX21fc2VyaWVzKSA/IDB4ZmZmZmZmZmYKIAkJCQkJCQkgOiAweDAwZmZmZmZmOwogCQlzLT5pbnNuX3JlYWQJPSBuaV90aW9faW5zbl9yZWFkOwotCQlzLT5pbnNuX3dyaXRlCT0gbmlfdGlvX2luc25fcmVhZDsKKwkJcy0+aW5zbl93cml0ZQk9IG5pX3Rpb19pbnNuX3dyaXRlOwogCQlzLT5pbnNuX2NvbmZpZwk9IG5pX3Rpb19pbnNuX2NvbmZpZzsKICNpZmRlZiBQQ0lETUEKIAkJaWYgKGRldi0+aXJxICYmIGRldnByaXYtPm1pdGUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY3MuYwppbmRleCBlM2Q4MjFiLi4yMWY4MjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jcy5jCkBAIC0xLDQwICsxLDM5IEBACiAvKgotICAgIGNvbWVkaS9kcml2ZXJzL25pX21pb19jcy5jCi0gICAgSGFyZHdhcmUgZHJpdmVyIGZvciBOSSBQQ01DSUEgTUlPIEUgc2VyaWVzIGNhcmRzCisgKiBDb21lZGkgZHJpdmVyIGZvciBOSSBQQ01DSUEgTUlPIEUgc2VyaWVzIGNhcmRzCisgKgorICogQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICogQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCiAKLSAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSovCiAvKgotRHJpdmVyOiBuaV9taW9fY3MKLURlc2NyaXB0aW9uOiBOYXRpb25hbCBJbnN0cnVtZW50cyBEQVFDYXJkIEUgc2VyaWVzCi1BdXRob3I6IGRzCi1TdGF0dXM6IHdvcmtzCi1EZXZpY2VzOiBbTmF0aW9uYWwgSW5zdHJ1bWVudHNdIERBUUNhcmQtQUktMTZYRS01MCAobmlfbWlvX2NzKSwKLSAgREFRQ2FyZC1BSS0xNkUtNCwgREFRQ2FyZC02MDYyRSwgREFRQ2FyZC02MDI0RSwgREFRQ2FyZC02MDM2RQotVXBkYXRlZDogVGh1IE9jdCAyMyAxOTo0MzoxNyBDRFQgMjAwMworICogRHJpdmVyOiBuaV9taW9fY3MKKyAqIERlc2NyaXB0aW9uOiBOYXRpb25hbCBJbnN0cnVtZW50cyBEQVFDYXJkIEUgc2VyaWVzCisgKiBBdXRob3I6IGRzCisgKiBTdGF0dXM6IHdvcmtzCisgKiBEZXZpY2VzOiBbTmF0aW9uYWwgSW5zdHJ1bWVudHNdIERBUUNhcmQtQUktMTZYRS01MCAobmlfbWlvX2NzKSwKKyAqICAgREFRQ2FyZC1BSS0xNkUtNCwgREFRQ2FyZC02MDYyRSwgREFRQ2FyZC02MDI0RSwgREFRQ2FyZC02MDM2RQorICogVXBkYXRlZDogVGh1IE9jdCAyMyAxOTo0MzoxNyBDRFQgMjAwMworICoKKyAqIFNlZSB0aGUgbm90ZXMgaW4gdGhlIG5pX2F0bWlvLm8gZHJpdmVyLgorICovCiAKLVNlZSB0aGUgbm90ZXMgaW4gdGhlIG5pX2F0bWlvLm8gZHJpdmVyLgotKi8KIC8qCi0JVGhlIHJlYWwgZ3V0cyBvZiB0aGUgZHJpdmVyIGlzIGluIG5pX21pb19jb21tb24uYywgd2hpY2ggaXMKLQlpbmNsdWRlZCBieSBhbGwgdGhlIEUgc2VyaWVzIGRyaXZlcnMuCi0KLQlSZWZlcmVuY2VzIGZvciBzcGVjaWZpY2F0aW9uczoKLQotCSAgIDM0MTA4MGEucGRmICBEQVFDYXJkIEUgU2VyaWVzIFJlZ2lzdGVyIExldmVsIFByb2dyYW1tZXIgTWFudWFsCi0KLSovCisgKiBUaGUgcmVhbCBndXRzIG9mIHRoZSBkcml2ZXIgaXMgaW4gbmlfbWlvX2NvbW1vbi5jLCB3aGljaCBpcworICogaW5jbHVkZWQgYnkgYWxsIHRoZSBFIHNlcmllcyBkcml2ZXJzLgorICoKKyAqIFJlZmVyZW5jZXMgZm9yIHNwZWNpZmljYXRpb25zOgorICoJMzQxMDgwYS5wZGYgIERBUUNhcmQgRSBTZXJpZXMgUmVnaXN0ZXIgTGV2ZWwgUHJvZ3JhbW1lciBNYW51YWwKKyAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2lkaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2lkaW8uYwppbmRleCAzNWVmMTkyLi5kYWViNGFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jCkBAIC0xLDUwICsxLDQ5IEBACiAvKgotICAgIGNvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jCi0gICAgZHJpdmVyIGZvciBOYXRpb25hbCBJbnN0cnVtZW50cyBQQ0ktRElPLTMySFMKKyAqIENvbWVkaSBkcml2ZXIgZm9yIE5hdGlvbmFsIEluc3RydW1lbnRzIFBDSS1ESU8tMzJIUworICoKKyAqIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAyIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLwogCi0gICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQotICAgIENvcHlyaWdodCAoQykgMTk5OSwyMDAyIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qLwogLyoKLURyaXZlcjogbmlfcGNpZGlvCi1EZXNjcmlwdGlvbjogTmF0aW9uYWwgSW5zdHJ1bWVudHMgUENJLURJTzMySFMsIFBDSS02NTMzCi1BdXRob3I6IGRzCi1TdGF0dXM6IHdvcmtzCi1EZXZpY2VzOiBbTmF0aW9uYWwgSW5zdHJ1bWVudHNdIFBDSS1ESU8tMzJIUyAobmlfcGNpZGlvKQotCSBbTmF0aW9uYWwgSW5zdHJ1bWVudHNdIFBYSS02NTMzLCBQQ0ktNjUzMyAocHhpLTY1MzMpCi0JIFtOYXRpb25hbCBJbnN0cnVtZW50c10gUENJLTY1MzQgKHBjaS02NTM0KQotVXBkYXRlZDogTW9uLCAwOSBKYW4gMjAxMiAxNDoyNzoyMyArMDAwMAotCi1UaGUgRElPMzJIUyBib2FyZCBhcHBlYXJzIGFzIG9uZSBzdWJkZXZpY2UsIHdpdGggMzIgY2hhbm5lbHMuCi1FYWNoIGNoYW5uZWwgaXMgaW5kaXZpZHVhbGx5IEkvTyBjb25maWd1cmFibGUuICBUaGUgY2hhbm5lbCBvcmRlcgotaXMgMD1BMCwgMT1BMSwgMj1BMiwgLi4uIDg9QjAsIDE2PUMwLCAyND1EMC4gIFRoZSBkcml2ZXIgb25seQotc3VwcG9ydHMgc2ltcGxlIGRpZ2l0YWwgSS9POyBubyBoYW5kc2hha2luZyBpcyBzdXBwb3J0ZWQuCi0KLURNQSBtb3N0bHkgd29ya3MgZm9yIHRoZSBQQ0ktRElPMzJIUywgYnV0IG9ubHkgaW4gdGltZWQgaW5wdXQgbW9kZS4KLQotVGhlIFBDSS1ESU8tMzJIUy9QQ0ktNjUzMyBoYXMgYSBjb25maWd1cmFibGUgZXh0ZXJuYWwgdHJpZ2dlci4gU2V0dGluZwotc2Nhbl9iZWdpbl9hcmcgdG8gMCBvciBDUl9FREdFIHRyaWdnZXJzIG9uIHRoZSBsZWFkaW5nIGVkZ2UuIFNldHRpbmcKLXNjYW5fYmVnaW5fYXJnIHRvIENSX0lOVkVSVCBvciAoQ1JfRURHRSB8IENSX0lOVkVSVCkgdHJpZ2dlcnMgb24gdGhlCi10cmFpbGluZyBlZGdlLgotCi1UaGlzIGRyaXZlciBjb3VsZCBiZSBlYXNpbHkgbW9kaWZpZWQgdG8gc3VwcG9ydCBBVC1NSU8zMkhTIGFuZAotQVQtTUlPOTYuCi0KLVRoZSBQQ0ktNjUzNCByZXF1aXJlcyBhIGZpcm13YXJlIHVwbG9hZCBhZnRlciBwb3dlci11cCB0byB3b3JrLCB0aGUKLWZpcm13YXJlIGRhdGEgYW5kIGluc3RydWN0aW9ucyBmb3IgbG9hZGluZyBpdCB3aXRoIGNvbWVkaV9jb25maWcKLWl0IGFyZSBjb250YWluZWQgaW4gdGhlCi1jb21lZGlfbm9uZnJlZV9maXJtd2FyZSB0YXJiYWxsIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cuY29tZWRpLm9yZwotKi8KKyAqIERyaXZlcjogbmlfcGNpZGlvCisgKiBEZXNjcmlwdGlvbjogTmF0aW9uYWwgSW5zdHJ1bWVudHMgUENJLURJTzMySFMsIFBDSS02NTMzCisgKiBBdXRob3I6IGRzCisgKiBTdGF0dXM6IHdvcmtzCisgKiBEZXZpY2VzOiBbTmF0aW9uYWwgSW5zdHJ1bWVudHNdIFBDSS1ESU8tMzJIUyAobmlfcGNpZGlvKQorICogICBbTmF0aW9uYWwgSW5zdHJ1bWVudHNdIFBYSS02NTMzLCBQQ0ktNjUzMyAocHhpLTY1MzMpCisgKiAgIFtOYXRpb25hbCBJbnN0cnVtZW50c10gUENJLTY1MzQgKHBjaS02NTM0KQorICogVXBkYXRlZDogTW9uLCAwOSBKYW4gMjAxMiAxNDoyNzoyMyArMDAwMAorICoKKyAqIFRoZSBESU8zMkhTIGJvYXJkIGFwcGVhcnMgYXMgb25lIHN1YmRldmljZSwgd2l0aCAzMiBjaGFubmVscy4gRWFjaAorICogY2hhbm5lbCBpcyBpbmRpdmlkdWFsbHkgSS9PIGNvbmZpZ3VyYWJsZS4gVGhlIGNoYW5uZWwgb3JkZXIgaXMgMD1BMCwKKyAqIDE9QTEsIDI9QTIsIC4uLiA4PUIwLCAxNj1DMCwgMjQ9RDAuIFRoZSBkcml2ZXIgb25seSBzdXBwb3J0cyBzaW1wbGUKKyAqIGRpZ2l0YWwgSS9POyBubyBoYW5kc2hha2luZyBpcyBzdXBwb3J0ZWQuCisgKgorICogRE1BIG1vc3RseSB3b3JrcyBmb3IgdGhlIFBDSS1ESU8zMkhTLCBidXQgb25seSBpbiB0aW1lZCBpbnB1dCBtb2RlLgorICoKKyAqIFRoZSBQQ0ktRElPLTMySFMvUENJLTY1MzMgaGFzIGEgY29uZmlndXJhYmxlIGV4dGVybmFsIHRyaWdnZXIuIFNldHRpbmcKKyAqIHNjYW5fYmVnaW5fYXJnIHRvIDAgb3IgQ1JfRURHRSB0cmlnZ2VycyBvbiB0aGUgbGVhZGluZyBlZGdlLiBTZXR0aW5nCisgKiBzY2FuX2JlZ2luX2FyZyB0byBDUl9JTlZFUlQgb3IgKENSX0VER0UgfCBDUl9JTlZFUlQpIHRyaWdnZXJzIG9uIHRoZQorICogdHJhaWxpbmcgZWRnZS4KKyAqCisgKiBUaGlzIGRyaXZlciBjb3VsZCBiZSBlYXNpbHkgbW9kaWZpZWQgdG8gc3VwcG9ydCBBVC1NSU8zMkhTIGFuZCBBVC1NSU85Ni4KKyAqCisgKiBUaGUgUENJLTY1MzQgcmVxdWlyZXMgYSBmaXJtd2FyZSB1cGxvYWQgYWZ0ZXIgcG93ZXItdXAgdG8gd29yaywgdGhlCisgKiBmaXJtd2FyZSBkYXRhIGFuZCBpbnN0cnVjdGlvbnMgZm9yIGxvYWRpbmcgaXQgd2l0aCBjb21lZGlfY29uZmlnCisgKiBpdCBhcmUgY29udGFpbmVkIGluIHRoZSBjb21lZGlfbm9uZnJlZV9maXJtd2FyZSB0YXJiYWxsIGF2YWlsYWJsZSBmcm9tCisgKiBodHRwOi8vd3d3LmNvbWVkaS5vcmcKKyAqLwogCiAjZGVmaW5lIFVTRV9ETUEKIApAQCAtNjEsMzYgKzYwLDM2IEBACiAKICNkZWZpbmUgV2luZG93X0FkZHJlc3MJCQk0CS8qIFcgKi8KICNkZWZpbmUgSW50ZXJydXB0X0FuZF9XaW5kb3dfU3RhdHVzCTQJLyogUiAqLwotI2RlZmluZSBJbnRTdGF0dXMxCQkJCSgxPDwwKQotI2RlZmluZSBJbnRTdGF0dXMyCQkJCSgxPDwxKQorI2RlZmluZSBJbnRTdGF0dXMxCQkJCUJJVCgwKQorI2RlZmluZSBJbnRTdGF0dXMyCQkJCUJJVCgxKQogI2RlZmluZSBXaW5kb3dBZGRyZXNzU3RhdHVzX21hc2sJCTB4N2MKIAogI2RlZmluZSBNYXN0ZXJfRE1BX0FuZF9JbnRlcnJ1cHRfQ29udHJvbCA1CS8qIFcgKi8KICNkZWZpbmUgSW50ZXJydXB0TGluZSh4KQkJCSgoeCkmMykKLSNkZWZpbmUgT3BlbkludAkJCQkoMTw8MikKKyNkZWZpbmUgT3BlbkludAkJCQlCSVQoMikKICNkZWZpbmUgR3JvdXBfU3RhdHVzCQkJNQkvKiBSICovCi0jZGVmaW5lIERhdGFMZWZ0CQkJCSgxPDwwKQotI2RlZmluZSBSZXEJCQkJCSgxPDwyKQotI2RlZmluZSBTdG9wVHJpZwkJCQkoMTw8MykKKyNkZWZpbmUgRGF0YUxlZnQJCQkJQklUKDApCisjZGVmaW5lIFJlcQkJCQkJQklUKDIpCisjZGVmaW5lIFN0b3BUcmlnCQkJCUJJVCgzKQogCiAjZGVmaW5lIEdyb3VwXzFfRmxhZ3MJCQk2CS8qIFIgKi8KICNkZWZpbmUgR3JvdXBfMl9GbGFncwkJCTcJLyogUiAqLwotI2RlZmluZSBUcmFuc2ZlclJlYWR5CQkJCSgxPDwwKQotI2RlZmluZSBDb3VudEV4cGlyZWQJCQkJKDE8PDEpCi0jZGVmaW5lIFdhaXRlZAkJCQkoMTw8NSkKLSNkZWZpbmUgUHJpbWFyeVRDCQkJCSgxPDw2KQotI2RlZmluZSBTZWNvbmRhcnlUQwkJCQkoMTw8NykKKyNkZWZpbmUgVHJhbnNmZXJSZWFkeQkJCQlCSVQoMCkKKyNkZWZpbmUgQ291bnRFeHBpcmVkCQkJCUJJVCgxKQorI2RlZmluZSBXYWl0ZWQJCQkJCUJJVCg1KQorI2RlZmluZSBQcmltYXJ5VEMJCQkJQklUKDYpCisjZGVmaW5lIFNlY29uZGFyeVRDCQkJCUJJVCg3KQogICAvKiAjZGVmaW5lIFNlcmlhbFJvc2UgKi8KICAgLyogI2RlZmluZSBSZXFSb3NlICovCiAgIC8qICNkZWZpbmUgUGF1c2VkICovCiAKICNkZWZpbmUgR3JvdXBfMV9GaXJzdF9DbGVhcgkJNgkvKiBXICovCiAjZGVmaW5lIEdyb3VwXzJfRmlyc3RfQ2xlYXIJCTcJLyogVyAqLwotI2RlZmluZSBDbGVhcldhaXRlZAkJCQkoMTw8MykKLSNkZWZpbmUgQ2xlYXJQcmltYXJ5VEMJCQkoMTw8NCkKLSNkZWZpbmUgQ2xlYXJTZWNvbmRhcnlUQwkJCSgxPDw1KQotI2RlZmluZSBETUFSZXNldAkJCQkoMTw8NikKLSNkZWZpbmUgRklGT1Jlc2V0CQkJCSgxPDw3KQorI2RlZmluZSBDbGVhcldhaXRlZAkJCQlCSVQoMykKKyNkZWZpbmUgQ2xlYXJQcmltYXJ5VEMJCQkJQklUKDQpCisjZGVmaW5lIENsZWFyU2Vjb25kYXJ5VEMJCQlCSVQoNSkKKyNkZWZpbmUgRE1BUmVzZXQJCQkJQklUKDYpCisjZGVmaW5lIEZJRk9SZXNldAkJCQlCSVQoNykKICNkZWZpbmUgQ2xlYXJBbGwJCQkJMHhmOAogCiAjZGVmaW5lIEdyb3VwXzFfRklGTwkJCTgJLyogVyAqLwpAQCAtMTExLDI3ICsxMTAsMjcgQEAKIAogI2RlZmluZSBHcm91cF8xX1NlY29uZF9DbGVhcgkJNDYJLyogVyAqLwogI2RlZmluZSBHcm91cF8yX1NlY29uZF9DbGVhcgkJNDcJLyogVyAqLwotI2RlZmluZSBDbGVhckV4cGlyZWQJCQkJKDE8PDApCisjZGVmaW5lIENsZWFyRXhwaXJlZAkJCQlCSVQoMCkKIAogI2RlZmluZSBQb3J0X1BhdHRlcm4oeCkJCQkoNDgrKHgpKQogCiAjZGVmaW5lIERhdGFfUGF0aAkJCTY0Ci0jZGVmaW5lIEZJRk9FbmFibGVBCQkoMTw8MCkKLSNkZWZpbmUgRklGT0VuYWJsZUIJCSgxPDwxKQotI2RlZmluZSBGSUZPRW5hYmxlQwkJKDE8PDIpCi0jZGVmaW5lIEZJRk9FbmFibGVECQkoMTw8MykKKyNkZWZpbmUgRklGT0VuYWJsZUEJCUJJVCgwKQorI2RlZmluZSBGSUZPRW5hYmxlQgkJQklUKDEpCisjZGVmaW5lIEZJRk9FbmFibGVDCQlCSVQoMikKKyNkZWZpbmUgRklGT0VuYWJsZUQJCUJJVCgzKQogI2RlZmluZSBGdW5uZWxpbmcoeCkJCSgoKHgpJjMpPDw0KQotI2RlZmluZSBHcm91cERpcmVjdGlvbgkoMTw8NykKKyNkZWZpbmUgR3JvdXBEaXJlY3Rpb24JCUJJVCg3KQogCiAjZGVmaW5lIFByb3RvY29sX1JlZ2lzdGVyXzEJCTY1CiAjZGVmaW5lIE9wTW9kZQkJCQlQcm90b2NvbF9SZWdpc3Rlcl8xCiAjZGVmaW5lIFJ1bk1vZGUoeCkJCSgoeCkmNykKLSNkZWZpbmUgTnVtYmVyZWQJCSgxPDwzKQorI2RlZmluZSBOdW1iZXJlZAkJQklUKDMpCiAKICNkZWZpbmUgUHJvdG9jb2xfUmVnaXN0ZXJfMgkJNjYKICNkZWZpbmUgQ2xvY2tSZWcJCQlQcm90b2NvbF9SZWdpc3Rlcl8yCiAjZGVmaW5lIENsb2NrTGluZSh4KQkJKCgoeCkmMyk8PDUpCi0jZGVmaW5lIEludmVydFN0b3BUcmlnCSgxPDw3KQorI2RlZmluZSBJbnZlcnRTdG9wVHJpZwkJQklUKDcpCiAjZGVmaW5lIERhdGFMYXRjaGluZyh4KSAgICAgICAoKCh4KSYzKTw8NSkKIAogI2RlZmluZSBQcm90b2NvbF9SZWdpc3Rlcl8zCQk2NwpAQCAtMTUyLDE3ICsxNTEsMTcgQEAKIAogI2RlZmluZSBQcm90b2NvbF9SZWdpc3Rlcl82CQk3MwogI2RlZmluZSBMaW5lUG9sYXJpdGllcwkJCVByb3RvY29sX1JlZ2lzdGVyXzYKLSNkZWZpbmUgSW52ZXJ0QWNrCQkoMTw8MCkKLSNkZWZpbmUgSW52ZXJ0UmVxCQkoMTw8MSkKLSNkZWZpbmUgSW52ZXJ0Q2xvY2sJCSgxPDwyKQotI2RlZmluZSBJbnZlcnRTZXJpYWwJCSgxPDwzKQotI2RlZmluZSBPcGVuQWNrCQkoMTw8NCkKLSNkZWZpbmUgT3BlbkNsb2NrCQkoMTw8NSkKKyNkZWZpbmUgSW52ZXJ0QWNrCQlCSVQoMCkKKyNkZWZpbmUgSW52ZXJ0UmVxCQlCSVQoMSkKKyNkZWZpbmUgSW52ZXJ0Q2xvY2sJCUJJVCgyKQorI2RlZmluZSBJbnZlcnRTZXJpYWwJCUJJVCgzKQorI2RlZmluZSBPcGVuQWNrCQlCSVQoNCkKKyNkZWZpbmUgT3BlbkNsb2NrCQlCSVQoNSkKIAogI2RlZmluZSBQcm90b2NvbF9SZWdpc3Rlcl83CQk3NAogI2RlZmluZSBBY2tTZXIJCQkJUHJvdG9jb2xfUmVnaXN0ZXJfNwogI2RlZmluZSBBY2tMaW5lKHgpCQkoKCh4KSYzKTw8MikKLSNkZWZpbmUgRXhjaGFuZ2VQaW5zCQkoMTw8NykKKyNkZWZpbmUgRXhjaGFuZ2VQaW5zCQlCSVQoNykKIAogI2RlZmluZSBJbnRlcnJ1cHRfQ29udHJvbAkJNzUKICAgLyogYml0cyBzYW1lIGFzIGZsYWdzICovCkBAIC0xODMsMjAgKzE4MiwyMCBAQAogI2RlZmluZSBUcmFuc2Zlcl9TaXplX0NvbnRyb2wJCTc3CiAjZGVmaW5lIFRyYW5zZmVyV2lkdGgoeCkJKCh4KSYzKQogI2RlZmluZSBUcmFuc2Zlckxlbmd0aCh4KQkoKCh4KSYzKTw8MykKLSNkZWZpbmUgUmVxdWlyZVJMZXZlbAkJKDE8PDUpCisjZGVmaW5lIFJlcXVpcmVSTGV2ZWwJCUJJVCg1KQogCiAjZGVmaW5lIFByb3RvY29sX1JlZ2lzdGVyXzE1CQk3OQogI2RlZmluZSBEQVFPcHRpb25zCQkJUHJvdG9jb2xfUmVnaXN0ZXJfMTUKICNkZWZpbmUgU3RhcnRTb3VyY2UoeCkJCQkoKHgpJjB4MykKLSNkZWZpbmUgSW52ZXJ0U3RhcnQJCQkJKDE8PDIpCisjZGVmaW5lIEludmVydFN0YXJ0CQkJCUJJVCgyKQogI2RlZmluZSBTdG9wU291cmNlKHgpCQkJCSgoKHgpJjB4Myk8PDMpCi0jZGVmaW5lIFJlcVN0YXJ0CQkJCSgxPDw2KQotI2RlZmluZSBQcmVTdGFydAkJCQkoMTw8NykKKyNkZWZpbmUgUmVxU3RhcnQJCQkJQklUKDYpCisjZGVmaW5lIFByZVN0YXJ0CQkJCUJJVCg3KQogCiAjZGVmaW5lIFBhdHRlcm5fRGV0ZWN0aW9uCQk4MQotI2RlZmluZSBEZXRlY3Rpb25NZXRob2QJCQkoMTw8MCkKLSNkZWZpbmUgSW52ZXJ0TWF0Y2gJCQkJKDE8PDEpCi0jZGVmaW5lIElFX1BhdHRlcm5fRGV0ZWN0aW9uCQkJKDE8PDIpCisjZGVmaW5lIERldGVjdGlvbk1ldGhvZAkJCUJJVCgwKQorI2RlZmluZSBJbnZlcnRNYXRjaAkJCQlCSVQoMSkKKyNkZWZpbmUgSUVfUGF0dGVybl9EZXRlY3Rpb24JCQlCSVQoMikKIAogI2RlZmluZSBQcm90b2NvbF9SZWdpc3Rlcl85CQk4MgogI2RlZmluZSBSZXFEZWxheQkJCVByb3RvY29sX1JlZ2lzdGVyXzkKQEAgLTY0OSw4ICs2NDgsMTAgQEAKIAkJd3JpdGViKDEsIGRldi0+bW1pbyArIEFja0RlbGF5KTsKIAkJd3JpdGViKDB4MGIsIGRldi0+bW1pbyArIEFja05vdERlbGF5KTsKIAkJd3JpdGViKDB4MDEsIGRldi0+bW1pbyArIERhdGExRGVsYXkpOwotCQkvKiBtYW51YWwsIHBhZ2UgNC01OiBDbG9ja1NwZWVkIGNvbW1lbnQgaXMgaW5jb3JyZWN0bHkgbGlzdGVkCi0JCSAqIG9uIERBUU9wdGlvbnMgKi8KKwkJLyoKKwkJICogbWFudWFsLCBwYWdlIDQtNToKKwkJICogQ2xvY2tTcGVlZCBjb21tZW50IGlzIGluY29ycmVjdGx5IGxpc3RlZCBvbiBEQVFPcHRpb25zCisJCSAqLwogCQl3cml0ZXcoMCwgZGV2LT5tbWlvICsgQ2xvY2tTcGVlZCk7CiAJCXdyaXRlYigwLCBkZXYtPm1taW8gKyBEQVFPcHRpb25zKTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaW1pby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaW1pby5jCmluZGV4IGQ4OTE3MzkuLmYxM2EyZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2ltaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpbWlvLmMKQEAgLTEsMTExICsxLDEwNiBAQAogLyoKLSAgICBjb21lZGkvZHJpdmVycy9uaV9wY2ltaW8uYwotICAgIEhhcmR3YXJlIGRyaXZlciBmb3IgTkkgUENJLU1JTyBFIHNlcmllcyBjYXJkcworICogQ29tZWRpIGRyaXZlciBmb3IgTkkgUENJLU1JTyBFIHNlcmllcyBjYXJkcworICoKKyAqIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMTk5Ny04IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLwogCi0gICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQotICAgIENvcHlyaWdodCAoQykgMTk5Ny04IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qLwogLyoKLURyaXZlcjogbmlfcGNpbWlvCi1EZXNjcmlwdGlvbjogTmF0aW9uYWwgSW5zdHJ1bWVudHMgUENJLU1JTy1FIHNlcmllcyBhbmQgTSBzZXJpZXMgKGFsbCBib2FyZHMpCi1BdXRob3I6IGRzLCBKb2huIEhhbGxlbiwgRnJhbmsgTW9yaSBIZXNzLCBSb2xmIE11ZWxsZXIsIEhlcmJlcnQgUGVyZW1hbnMsCi0gIEhlcm1hbiBCcnV5bmluY2t4LCBUZXJyeSBCYXJuYWJ5Ci1TdGF0dXM6IHdvcmtzCi1EZXZpY2VzOiBbTmF0aW9uYWwgSW5zdHJ1bWVudHNdIFBDSS1NSU8tMTZYRS01MCAobmlfcGNpbWlvKSwKLSAgUENJLU1JTy0xNlhFLTEwLCBQWEktNjAzMEUsIFBDSS1NSU8tMTZFLTEsIFBDSS1NSU8tMTZFLTQsIFBDSS02MDE0LCBQQ0ktNjA0MEUsCi0gIFBYSS02MDQwRSwgUENJLTYwMzBFLCBQQ0ktNjAzMUUsIFBDSS02MDMyRSwgUENJLTYwMzNFLCBQQ0ktNjA3MUUsIFBDSS02MDIzRSwKLSAgUENJLTYwMjRFLCBQQ0ktNjAyNUUsIFBYSS02MDI1RSwgUENJLTYwMzRFLCBQQ0ktNjAzNUUsIFBDSS02MDUyRSwKLSAgUENJLTYxMTAsIFBDSS02MTExLCBQQ0ktNjIyMCwgUENJLTYyMjEsIFBDSS02MjI0LCBQWEktNjIyNCwKLSAgUENJLTYyMjUsIFBYSS02MjI1LCBQQ0ktNjIyOSwgUENJLTYyNTAsCi0gIFBDSS02MjUxLCBQWEktNjI1MSwgUENJZS02MjUxLCBQWEllLTYyNTEsCi0gIFBDSS02MjU0LCBQQ0ktNjI1OSwgUENJZS02MjU5LAotICBQQ0ktNjI4MCwgUENJLTYyODEsIFBYSS02MjgxLCBQQ0ktNjI4NCwgUENJLTYyODksCi0gIFBDSS02NzExLCBQWEktNjcxMSwgUENJLTY3MTMsIFBYSS02NzEzLAotICBQWEktNjA3MUUsIFBDSS02MDcwRSwgUFhJLTYwNzBFLAotICBQWEktNjA1MkUsIFBDSS02MDM2RSwgUENJLTY3MzEsIFBDSS02NzMzLCBQWEktNjczMywKLSAgUENJLTYxNDMsIFBYSS02MTQzCi1VcGRhdGVkOiBNb24sIDA5IEphbiAyMDEyIDE0OjUyOjQ4ICswMDAwCisgKiBEcml2ZXI6IG5pX3BjaW1pbworICogRGVzY3JpcHRpb246IE5hdGlvbmFsIEluc3RydW1lbnRzIFBDSS1NSU8tRSBzZXJpZXMgYW5kIE0gc2VyaWVzIChhbGwgYm9hcmRzKQorICogQXV0aG9yOiBkcywgSm9obiBIYWxsZW4sIEZyYW5rIE1vcmkgSGVzcywgUm9sZiBNdWVsbGVyLCBIZXJiZXJ0IFBlcmVtYW5zLAorICogICBIZXJtYW4gQnJ1eW5pbmNreCwgVGVycnkgQmFybmFieQorICogU3RhdHVzOiB3b3JrcworICogRGV2aWNlczogW05hdGlvbmFsIEluc3RydW1lbnRzXSBQQ0ktTUlPLTE2WEUtNTAgKG5pX3BjaW1pbyksCisgKiAgIFBDSS1NSU8tMTZYRS0xMCwgUFhJLTYwMzBFLCBQQ0ktTUlPLTE2RS0xLCBQQ0ktTUlPLTE2RS00LCBQQ0ktNjAxNCwKKyAqICAgUENJLTYwNDBFLCBQWEktNjA0MEUsIFBDSS02MDMwRSwgUENJLTYwMzFFLCBQQ0ktNjAzMkUsIFBDSS02MDMzRSwKKyAqICAgUENJLTYwNzFFLCBQQ0ktNjAyM0UsIFBDSS02MDI0RSwgUENJLTYwMjVFLCBQWEktNjAyNUUsIFBDSS02MDM0RSwKKyAqICAgUENJLTYwMzVFLCBQQ0ktNjA1MkUsCisgKiAgIFBDSS02MTEwLCBQQ0ktNjExMSwgUENJLTYyMjAsIFBDSS02MjIxLCBQQ0ktNjIyNCwgUFhJLTYyMjQsCisgKiAgIFBDSS02MjI1LCBQWEktNjIyNSwgUENJLTYyMjksIFBDSS02MjUwLAorICogICBQQ0ktNjI1MSwgUFhJLTYyNTEsIFBDSWUtNjI1MSwgUFhJZS02MjUxLAorICogICBQQ0ktNjI1NCwgUENJLTYyNTksIFBDSWUtNjI1OSwKKyAqICAgUENJLTYyODAsIFBDSS02MjgxLCBQWEktNjI4MSwgUENJLTYyODQsIFBDSS02Mjg5LAorICogICBQQ0ktNjcxMSwgUFhJLTY3MTEsIFBDSS02NzEzLCBQWEktNjcxMywKKyAqICAgUFhJLTYwNzFFLCBQQ0ktNjA3MEUsIFBYSS02MDcwRSwKKyAqICAgUFhJLTYwNTJFLCBQQ0ktNjAzNkUsIFBDSS02NzMxLCBQQ0ktNjczMywgUFhJLTY3MzMsCisgKiAgIFBDSS02MTQzLCBQWEktNjE0MworICogVXBkYXRlZDogTW9uLCAwOSBKYW4gMjAxMiAxNDo1Mjo0OCArMDAwMAorICoKKyAqIFRoZXNlIGJvYXJkcyBhcmUgYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgQVQtTUlPIEUgc2VyaWVzLCBleGNlcHQgdGhhdAorICogdGhleSB1c2UgdGhlIFBDSSBidXMgaW5zdGVhZCBvZiBJU0EgKGkuZS4sIEFUKS4gU2VlIHRoZSBub3RlcyBmb3IgdGhlCisgKiBuaV9hdG1pby5vIGRyaXZlciBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBib2FyZHMuCisgKgorICogQXV0b2NhbGlicmF0aW9uIGlzIHN1cHBvcnRlZCBvbiBtYW55IG9mIHRoZSBkZXZpY2VzLCB1c2luZyB0aGUKKyAqIGNvbWVkaV9jYWxpYnJhdGUgKG9yIGNvbWVkaV9zb2Z0X2NhbGlicmF0ZSBmb3IgbS1zZXJpZXMpIHV0aWxpdHkuCisgKiBNLVNlcmllcyBib2FyZHMgZG8gYW5hbG9nIGlucHV0IGFuZCBhbmFsb2cgb3V0cHV0IGNhbGlicmF0aW9uIGVudGlyZWx5CisgKiBpbiBzb2Z0d2FyZS4gVGhlIHNvZnR3YXJlIGNhbGlicmF0aW9uIGNvcnJlY3RzIHRoZSBhbmFsb2cgaW5wdXQgZm9yCisgKiBvZmZzZXQsIGdhaW4gYW5kIG5vbmxpbmVhcml0eS4gVGhlIGFuYWxvZyBvdXRwdXRzIGFyZSBjb3JyZWN0ZWQgZm9yCisgKiBvZmZzZXQgYW5kIGdhaW4uIFNlZSB0aGUgY29tZWRpbGliIGRvY3VtZW50YXRpb24gb24KKyAqIGNvbWVkaV9nZXRfc29mdGNhbF9jb252ZXJ0ZXIoKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBCeSBkZWZhdWx0LCB0aGUgZHJpdmVyIHVzZXMgRE1BIHRvIHRyYW5zZmVyIGFuYWxvZyBpbnB1dCBkYXRhIHRvCisgKiBtZW1vcnkuICBXaGVuIERNQSBpcyBlbmFibGVkLCBub3QgYWxsIHRyaWdnZXJpbmcgZmVhdHVyZXMgYXJlCisgKiBzdXBwb3J0ZWQuCisgKgorICogRGlnaXRhbCBJL08gbWF5IG5vdCB3b3JrIG9uIDY3M3guCisgKgorICogTm90ZSB0aGF0IHRoZSBQQ0ktNjE0MyBpcyBhIHNpbXVsdGFpbmVvdXMgc2FtcGxpbmcgZGV2aWNlIHdpdGggOAorICogY29udmVydG9ycy4gV2l0aCB0aGlzIGJvYXJkIGFsbCBvZiB0aGUgY29udmVydG9ycyBwZXJmb3JtIG9uZQorICogc2ltdWx0YWluZW91cyBzYW1wbGUgZHVyaW5nIGEgc2NhbiBpbnRlcnZhbC4gVGhlIHBlcmlvZCBmb3IgYSBzY2FuCisgKiBpcyB1c2VkIGZvciB0aGUgY29udmVydCB0aW1lIGluIGEgQ29tZWRpIGNtZC4gVGhlIGNvbnZlcnQgdHJpZ2dlcgorICogc291cmNlIGlzIG5vcm1hbGx5IHNldCB0byBUUklHX05PVyBieSBkZWZhdWx0LgorICoKKyAqIFRoZSBSVFNJIHRyaWdnZXIgYnVzIGlzIHN1cHBvcnRlZCBvbiB0aGVzZSBjYXJkcyBvbiBzdWJkZXZpY2UgMTAuCisgKiBTZWUgdGhlIGNvbWVkaWxpYiBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgorICoKKyAqIEluZm9ybWF0aW9uIChudW1iZXIgb2YgY2hhbm5lbHMsIGJpdHMsIGV0Yy4pIGZvciBzb21lIGRldmljZXMgbWF5IGJlCisgKiBpbmNvcnJlY3QuIFBsZWFzZSBjaGVjayB0aGlzIGFuZCBzdWJtaXQgYSBidWcgaWYgdGhlcmUgYXJlIHByb2JsZW1zCisgKiBmb3IgeW91ciBkZXZpY2UuCisgKgorICogU0NYSSBpcyBwcm9iYWJseSBicm9rZW4gZm9yIG0tc2VyaWVzIGJvYXJkcy4KKyAqCisgKiBCdWdzOgorICogLSBXaGVuIERNQSBpcyBlbmFibGVkLCBDT01FRElfRVZfQ09OVkVSVCBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseS4KKyAqLwogCi1UaGVzZSBib2FyZHMgYXJlIGFsbW9zdCBpZGVudGljYWwgdG8gdGhlIEFULU1JTyBFIHNlcmllcywgZXhjZXB0IHRoYXQKLXRoZXkgdXNlIHRoZSBQQ0kgYnVzIGluc3RlYWQgb2YgSVNBIChpLmUuLCBBVCkuICBTZWUgdGhlIG5vdGVzIGZvcgotdGhlIG5pX2F0bWlvLm8gZHJpdmVyIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZXNlIGJvYXJkcy4KLQotQXV0b2NhbGlicmF0aW9uIGlzIHN1cHBvcnRlZCBvbiBtYW55IG9mIHRoZSBkZXZpY2VzLCB1c2luZyB0aGUKLWNvbWVkaV9jYWxpYnJhdGUgKG9yIGNvbWVkaV9zb2Z0X2NhbGlicmF0ZSBmb3IgbS1zZXJpZXMpIHV0aWxpdHkuCi1NLVNlcmllcyBib2FyZHMgZG8gYW5hbG9nIGlucHV0IGFuZCBhbmFsb2cgb3V0cHV0IGNhbGlicmF0aW9uIGVudGlyZWx5Ci1pbiBzb2Z0d2FyZS4gVGhlIHNvZnR3YXJlIGNhbGlicmF0aW9uIGNvcnJlY3RzCi10aGUgYW5hbG9nIGlucHV0IGZvciBvZmZzZXQsIGdhaW4gYW5kCi1ub25saW5lYXJpdHkuICBUaGUgYW5hbG9nIG91dHB1dHMgYXJlIGNvcnJlY3RlZCBmb3Igb2Zmc2V0IGFuZCBnYWluLgotU2VlIHRoZSBjb21lZGlsaWIgZG9jdW1lbnRhdGlvbiBvbiBjb21lZGlfZ2V0X3NvZnRjYWxfY29udmVydGVyKCkgZm9yCi1tb3JlIGluZm9ybWF0aW9uLgotCi1CeSBkZWZhdWx0LCB0aGUgZHJpdmVyIHVzZXMgRE1BIHRvIHRyYW5zZmVyIGFuYWxvZyBpbnB1dCBkYXRhIHRvCi1tZW1vcnkuICBXaGVuIERNQSBpcyBlbmFibGVkLCBub3QgYWxsIHRyaWdnZXJpbmcgZmVhdHVyZXMgYXJlCi1zdXBwb3J0ZWQuCi0KLURpZ2l0YWwgSS9PIG1heSBub3Qgd29yayBvbiA2NzN4LgotCi1Ob3RlIHRoYXQgdGhlIFBDSS02MTQzIGlzIGEgc2ltdWx0YWluZW91cyBzYW1wbGluZyBkZXZpY2Ugd2l0aCA4IGNvbnZlcnRvcnMuCi1XaXRoIHRoaXMgYm9hcmQgYWxsIG9mIHRoZSBjb252ZXJ0b3JzIHBlcmZvcm0gb25lIHNpbXVsdGFpbmVvdXMgc2FtcGxlIGR1cmluZwotYSBzY2FuIGludGVydmFsLiBUaGUgcGVyaW9kIGZvciBhIHNjYW4gaXMgdXNlZCBmb3IgdGhlIGNvbnZlcnQgdGltZSBpbiBhCi1Db21lZGkgY21kLiBUaGUgY29udmVydCB0cmlnZ2VyIHNvdXJjZSBpcyBub3JtYWxseSBzZXQgdG8gVFJJR19OT1cgYnkgZGVmYXVsdC4KLQotVGhlIFJUU0kgdHJpZ2dlciBidXMgaXMgc3VwcG9ydGVkIG9uIHRoZXNlIGNhcmRzIG9uCi1zdWJkZXZpY2UgMTAuIFNlZSB0aGUgY29tZWRpbGliIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCi0KLUluZm9ybWF0aW9uIChudW1iZXIgb2YgY2hhbm5lbHMsIGJpdHMsIGV0Yy4pIGZvciBzb21lIGRldmljZXMgbWF5IGJlCi1pbmNvcnJlY3QuICBQbGVhc2UgY2hlY2sgdGhpcyBhbmQgc3VibWl0IGEgYnVnIGlmIHRoZXJlIGFyZSBwcm9ibGVtcwotZm9yIHlvdXIgZGV2aWNlLgotCi1TQ1hJIGlzIHByb2JhYmx5IGJyb2tlbiBmb3IgbS1zZXJpZXMgYm9hcmRzLgotCi1CdWdzOgotIC0gV2hlbiBETUEgaXMgZW5hYmxlZCwgQ09NRURJX0VWX0NPTlZFUlQgZG9lcwotICAgbm90IHdvcmsgY29ycmVjdGx5LgotCi0qLwogLyoKLQlUaGUgUENJLU1JTyBFIHNlcmllcyBkcml2ZXIgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieQotCVRvbWFzeiBNb3R5bGV3c2tpIDwuLi4+LCBhbmQgcG9ydGVkIHRvIGNvbWVkaSBieSBkcy4KLQotCVJlZmVyZW5jZXM6Ci0KLQkgICAzNDEwNzliLnBkZiAgUENJIEUgU2VyaWVzIFJlZ2lzdGVyLUxldmVsIFByb2dyYW1tZXIgTWFudWFsCi0JICAgMzQwOTM0Yi5wZGYgIERBUS1TVEMgcmVmZXJlbmNlIG1hbnVhbAotCi0JICAgMzIyMDgwYi5wZGYgIDY3MTEvNjcxMy82NzE1IFVzZXIgTWFudWFsCi0KLQkgICAzMjA5NDVjLnBkZiAgUENJIEUgU2VyaWVzIFVzZXIgTWFudWFsCi0JICAgMzIyMTM4YS5wZGYgIFBDSS02MDUyRSBhbmQgREFRUGFkLTYwNTJFIFVzZXIgTWFudWFsCi0KLQlJU1NVRVM6Ci0KLQluZWVkIHRvIGRlYWwgd2l0aCBleHRlcm5hbCByZWZlcmVuY2UgZm9yIERBQywgYW5kIG90aGVyIERBQwotCXByb3BlcnRpZXMgaW4gYm9hcmQgcHJvcGVydGllcwotCi0JZGVhbCB3aXRoIGF0LW1pby0xNmRlLTEwIHJldmlzaW9uIEQgdG8gTiBjaGFuZ2VzLCBldGMuCi0KLQluZWVkIHRvIGFkZCBvdGhlciBDQUxEQUMgdHlwZQotCi0JbmVlZCB0byBzbG93IGRvd24gREFDIGxvYWRpbmcuICBJIGRvbid0IHRydXN0IE5JJ3MgY2xhaW0gdGhhdAotCXR3byB3cml0ZXMgdG8gdGhlIFBDSSBidXMgc2xvd3MgSU8gZW5vdWdoLiAgSSB3b3VsZCBwcmVmZXIgdG8KLQl1c2UgdWRlbGF5KCkuICBUaW1pbmcgc3BlY3M6IChjbG9jaykKLQkJQUQ4NTIyCQkzMG5zCi0JCURBQzgwNDMJCTEyMG5zCi0JCURBQzg4MDAJCTYwbnMKLQkJTUI4ODM0MQkJPwotCi0qLworICogVGhlIFBDSS1NSU8gRSBzZXJpZXMgZHJpdmVyIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkKKyAqIFRvbWFzeiBNb3R5bGV3c2tpIDwuLi4+LCBhbmQgcG9ydGVkIHRvIGNvbWVkaSBieSBkcy4KKyAqCisgKiBSZWZlcmVuY2VzOgorICoJMzQxMDc5Yi5wZGYgIFBDSSBFIFNlcmllcyBSZWdpc3Rlci1MZXZlbCBQcm9ncmFtbWVyIE1hbnVhbAorICoJMzQwOTM0Yi5wZGYgIERBUS1TVEMgcmVmZXJlbmNlIG1hbnVhbAorICoKKyAqCTMyMjA4MGIucGRmICA2NzExLzY3MTMvNjcxNSBVc2VyIE1hbnVhbAorICoKKyAqCTMyMDk0NWMucGRmICBQQ0kgRSBTZXJpZXMgVXNlciBNYW51YWwKKyAqCTMyMjEzOGEucGRmICBQQ0ktNjA1MkUgYW5kIERBUVBhZC02MDUyRSBVc2VyIE1hbnVhbAorICoKKyAqIElTU1VFUzoKKyAqIC0gbmVlZCB0byBkZWFsIHdpdGggZXh0ZXJuYWwgcmVmZXJlbmNlIGZvciBEQUMsIGFuZCBvdGhlciBEQUMKKyAqICAgcHJvcGVydGllcyBpbiBib2FyZCBwcm9wZXJ0aWVzCisgKiAtIGRlYWwgd2l0aCBhdC1taW8tMTZkZS0xMCByZXZpc2lvbiBEIHRvIE4gY2hhbmdlcywgZXRjLgorICogLSBuZWVkIHRvIGFkZCBvdGhlciBDQUxEQUMgdHlwZQorICogLSBuZWVkIHRvIHNsb3cgZG93biBEQUMgbG9hZGluZy4gSSBkb24ndCB0cnVzdCBOSSdzIGNsYWltIHRoYXQKKyAqICAgdHdvIHdyaXRlcyB0byB0aGUgUENJIGJ1cyBzbG93cyBJTyBlbm91Z2guIEkgd291bGQgcHJlZmVyIHRvCisgKiAgIHVzZSB1ZGVsYXkoKS4KKyAqICAgVGltaW5nIHNwZWNzOiAoY2xvY2spCisgKglBRDg1MjIJCTMwbnMKKyAqCURBQzgwNDMJCTEyMG5zCisgKglEQUM4ODAwCQk2MG5zCisgKglNQjg4MzQxCQk/CisgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0xMTksMTMgKzExNCwxNCBAQAogCiAjZGVmaW5lIFBDSURNQQogCi0vKiBUaGVzZSBhcmUgbm90IGFsbCB0aGUgcG9zc2libGUgYW8gcmFuZ2VzIGZvciA2Mjh4IGJvYXJkcy4KLSBUaGV5IGNhbiBkbyBPRkZTRVQgKy0gUkVGRVJFTkNFIHdoZXJlIE9GRlNFVCBjYW4gYmUKLSAwViwgNVYsIEFQRkk8MCwxPiwgb3IgQU88MC4uLjM+IGFuZCBSQU5HRSBjYW4KLSBiZSAxMFYsIDVWLCAyViwgMVYsIEFQRkk8MCwxPiwgQU88MC4uLjM+LiAgVGhhdCdzCi0gNjMgZGlmZmVyZW50IHBvc3NpYmlsaXRpZXMuICBBbiBBTyBjaGFubmVsCi0gY2FuIG5vdCBhY3QgYXMgaXQncyBvd24gT0ZGU0VUIG9yIFJFRkVSRU5DRS4KLSovCisvKgorICogVGhlc2UgYXJlIG5vdCBhbGwgdGhlIHBvc3NpYmxlIGFvIHJhbmdlcyBmb3IgNjI4eCBib2FyZHMuCisgKiBUaGV5IGNhbiBkbyBPRkZTRVQgKy0gUkVGRVJFTkNFIHdoZXJlIE9GRlNFVCBjYW4gYmUKKyAqIDBWLCA1ViwgQVBGSTwwLDE+LCBvciBBTzwwLi4uMz4gYW5kIFJBTkdFIGNhbgorICogYmUgMTBWLCA1ViwgMlYsIDFWLCBBUEZJPDAsMT4sIEFPPDAuLi4zPi4gIFRoYXQncworICogNjMgZGlmZmVyZW50IHBvc3NpYmlsaXRpZXMuICBBbiBBTyBjaGFubmVsCisgKiBjYW4gbm90IGFjdCBhcyBpdCdzIG93biBPRkZTRVQgb3IgUkVGRVJFTkNFLgorICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfbmlfTV82Mjh4X2FvID0gewogCTgsIHsKIAkJQklQX1JBTkdFKDEwKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV91c2I2NTAxLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfdXNiNjUwMS5jCmluZGV4IDk1YjUzN2EuLjUwMzZlZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV91c2I2NTAxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3VzYjY1MDEuYwpAQCAtNDY1LDEyICs0NjUsMTIgQEAKIAlzdHJ1Y3Qgbmk2NTAxX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJc2l6ZV90IHNpemU7CiAKLQlzaXplID0gbGUxNl90b19jcHUoZGV2cHJpdi0+ZXBfcngtPndNYXhQYWNrZXRTaXplKTsKKwlzaXplID0gdXNiX2VuZHBvaW50X21heHAoZGV2cHJpdi0+ZXBfcngpOwogCWRldnByaXYtPnVzYl9yeF9idWYgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmICghZGV2cHJpdi0+dXNiX3J4X2J1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzaXplID0gbGUxNl90b19jcHUoZGV2cHJpdi0+ZXBfdHgtPndNYXhQYWNrZXRTaXplKTsKKwlzaXplID0gdXNiX2VuZHBvaW50X21heHAoZGV2cHJpdi0+ZXBfdHgpOwogCWRldnByaXYtPnVzYl90eF9idWYgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmICghZGV2cHJpdi0+dXNiX3R4X2J1ZikgewogCQlrZnJlZShkZXZwcml2LT51c2JfcnhfYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wbHg5MDgwLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGx4OTA4MC5oCmluZGV4IDBlMjBjYzUuLmUyM2U2M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wbHg5MDgwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BseDkwODAuaApAQCAtNjAsOSArNjAsOSBAQAogI2RlZmluZSBQTFhfUkVHX0xBUzFSUgkJMHgwMGYwCiAKICNkZWZpbmUgUExYX0xBU1JSX0lPCQlCSVQoMCkJCS8qIE1hcCB0bzogMT1JL08sIDA9TWVtICovCi0jZGVmaW5lIFBMWF9MQVNSUl9BTlkzMgkJKEJJVCgxKSAqIDApCS8qIExvY2F0ZSBhbnl3aGVyZSBpbiAzMiBiaXQgKi8KLSNkZWZpbmUgUExYX0xBU1JSX0xUMU1CCQkoQklUKDEpICogMSkJLyogTG9jYXRlIGluIDFzdCBtZWcgKi8KLSNkZWZpbmUgUExYX0xBU1JSX0FOWTY0CQkoQklUKDEpICogMikJLyogTG9jYXRlIGFueXdoZXJlIGluIDY0IGJpdCAqLworI2RlZmluZSBQTFhfTEFTUlJfTUxPQ19BTlkzMgkoQklUKDEpICogMCkJLyogTG9jYXRlIGFueXdoZXJlIGluIDMyIGJpdCAqLworI2RlZmluZSBQTFhfTEFTUlJfTUxPQ19MVDFNQgkoQklUKDEpICogMSkJLyogTG9jYXRlIGluIDFzdCBtZWcgKi8KKyNkZWZpbmUgUExYX0xBU1JSX01MT0NfQU5ZNjQJKEJJVCgxKSAqIDIpCS8qIExvY2F0ZSBhbnl3aGVyZSBpbiA2NCBiaXQgKi8KICNkZWZpbmUgUExYX0xBU1JSX01MT0NfTUFTSwlHRU5NQVNLKDIsIDEpCS8qIE1lbW9yeSBsb2NhdGlvbiBiaXRzICovCiAjZGVmaW5lIFBMWF9MQVNSUl9QUkVGRVRDSAlCSVQoMykJCS8qIE1lbW9yeSBpcyBwcmVmZXRjaGFibGUgKi8KIC8qIGJpdHMgdGhhdCBzcGVjaWZ5IHJhbmdlIGZvciBtZW1vcnkgc3BhY2UgZGVjb2RlIGJpdHMgKi8KQEAgLTg5LDExICs4OSwxMSBAQAogLyogTG9jYWwgQnVzIExhdGVuY3kgVGltZXIgKi8KICNkZWZpbmUgUExYX01BUkJSX0xUKHgpCQkoQklUKDApICogKCh4KSAmIDB4ZmYpKQogI2RlZmluZSBQTFhfTUFSQlJfTFRfTUFTSwlHRU5NQVNLKDcsIDApCi0jZGVmaW5lIFBMWF9NQVJCUl9MVF9TSElGVAkwCisjZGVmaW5lIFBMWF9NQVJCUl9UT19MVChyKQkoKHIpICYgUExYX01BUkJSX0xUX01BU0spCiAvKiBMb2NhbCBCdXMgUGF1c2UgVGltZXIgKi8KICNkZWZpbmUgUExYX01BUkJSX1BUKHgpCQkoQklUKDgpICogKCh4KSAmIDB4ZmYpKQogI2RlZmluZSBQTFhfTUFSQlJfUFRfTUFTSwlHRU5NQVNLKDE1LCA4KQotI2RlZmluZSBQTFhfTUFSQlJfUFRfU0hJRlQJOAorI2RlZmluZSBQTFhfTUFSQlJfVE9fUFQocikJKCgocikgJiBQTFhfTUFSQlJfUFRfTUFTSykgPj4gOCkKIC8qIExvY2FsIEJ1cyBMYXRlbmN5IFRpbWVyIEVuYWJsZSAqLwogI2RlZmluZSBQTFhfTUFSQlJfTFRFTgkJQklUKDE2KQogLyogTG9jYWwgQnVzIFBhdXNlIFRpbWVyIEVuYWJsZSAqLwpAQCAtMTY2LDE2ICsxNjYsMTUgQEAKICNkZWZpbmUgUExYX1JFR19MQlJEMQkJMHgwMGY4CiAKIC8qIE1lbW9yeSBTcGFjZSBMb2NhbCBCdXMgV2lkdGggKi8KLSNkZWZpbmUgUExYX0xCUkRfTVNXSURUSDgJKEJJVCgwKSAqIDApCS8qIDggYml0cyB3aWRlICovCi0jZGVmaW5lIFBMWF9MQlJEX01TV0lEVEgxNgkoQklUKDApICogMSkJLyogMTYgYml0cyB3aWRlICovCi0jZGVmaW5lIFBMWF9MQlJEX01TV0lEVEgzMgkoQklUKDApICogMikJLyogMzIgYml0cyB3aWRlICovCi0jZGVmaW5lIFBMWF9MQlJEX01TV0lEVEgzMkEJKEJJVCgwKSAqIDMpCS8qIDMyIGJpdHMgd2lkZSAqLworI2RlZmluZSBQTFhfTEJSRF9NU1dJRFRIXzgJKEJJVCgwKSAqIDApCS8qIDggYml0cyB3aWRlICovCisjZGVmaW5lIFBMWF9MQlJEX01TV0lEVEhfMTYJKEJJVCgwKSAqIDEpCS8qIDE2IGJpdHMgd2lkZSAqLworI2RlZmluZSBQTFhfTEJSRF9NU1dJRFRIXzMyCShCSVQoMCkgKiAyKQkvKiAzMiBiaXRzIHdpZGUgKi8KKyNkZWZpbmUgUExYX0xCUkRfTVNXSURUSF8zMkEJKEJJVCgwKSAqIDMpCS8qIDMyIGJpdHMgd2lkZSAqLwogI2RlZmluZSBQTFhfTEJSRF9NU1dJRFRIX01BU0sJR0VOTUFTSygxLCAwKQotI2RlZmluZSBQTFhfTEJSRF9NU1dJRFRIX1NISUZUCTAKIC8qIE1lbW9yeSBTcGFjZSBJbnRlcm5hbCBXYWl0IFN0YXRlcyAqLwogI2RlZmluZSBQTFhfTEJSRF9NU0lXUyh4KQkoQklUKDIpICogKCh4KSAmIDB4ZikpCiAjZGVmaW5lIFBMWF9MQlJEX01TSVdTX01BU0sJR0VOTUFTSyg1LCAyKQotI2RlZmluZSBQTFhfTEJSRF9NU0lXU19TSElGVAkyCisjZGVmaW5lIFBMWF9MQlJEX1RPX01TSVdTKHIpCSgoKHIpICYgUExTX0xCUkRfTVNJV1NfTUFTSykgPj4gMikKIC8qIE1lbW9yeSBTcGFjZSBSZWFkeSBJbnB1dCBFbmFibGUgKi8KICNkZWZpbmUgUExYX0xCUkRfTVNSRUFEWUlFTglCSVQoNikKIC8qIE1lbW9yeSBTcGFjZSBCVEVSTSMgSW5wdXQgRW5hYmxlICovCkBAIC0xOTMsMTggKzE5MiwxNyBAQAogLyogUHJlZmV0Y2ggQ291bnRlciAqLwogI2RlZmluZSBQTFhfTEJSRF9QRkNPVU5UKHgpCShCSVQoMTEpICogKCh4KSAmIDB4ZikpCiAjZGVmaW5lIFBMWF9MQlJEX1BGQ09VTlRfTUFTSwlHRU5NQVNLKDE0LCAxMSkKLSNkZWZpbmUgUExYX0xCUkRfUEZDT1VOVF9TSElGVAkxMQorI2RlZmluZSBQTFhfTEJSRF9UT19QRkNPVU5UKHIpCSgoKHIpICYgUExYX0xCUkRfUEZDT1VOVF9NQVNLKSA+PiAxMSkKIC8qIEV4cGFuc2lvbiBST00gU3BhY2UgTG9jYWwgQnVzIFdpZHRoIChMQlJEMCBvbmx5KSAqLwotI2RlZmluZSBQTFhfTEJSRDBfRVJPTVdJRFRIOAkoQklUKDE2KSAqIDApCS8qIDggYml0cyB3aWRlICovCi0jZGVmaW5lIFBMWF9MQlJEMF9FUk9NV0lEVEgxNgkoQklUKDE2KSAqIDEpCS8qIDE2IGJpdHMgd2lkZSAqLwotI2RlZmluZSBQTFhfTEJSRDBfRVJPTVdJRFRIMzIJKEJJVCgxNikgKiAyKQkvKiAzMiBiaXRzIHdpZGUgKi8KLSNkZWZpbmUgUExYX0xCUkQwX0VST01XSURUSDMyQQkoQklUKDE2KSAqIDMpCS8qIDMyIGJpdHMgd2lkZSAqLworI2RlZmluZSBQTFhfTEJSRDBfRVJPTVdJRFRIXzgJKEJJVCgxNikgKiAwKQkvKiA4IGJpdHMgd2lkZSAqLworI2RlZmluZSBQTFhfTEJSRDBfRVJPTVdJRFRIXzE2CShCSVQoMTYpICogMSkJLyogMTYgYml0cyB3aWRlICovCisjZGVmaW5lIFBMWF9MQlJEMF9FUk9NV0lEVEhfMzIJKEJJVCgxNikgKiAyKQkvKiAzMiBiaXRzIHdpZGUgKi8KKyNkZWZpbmUgUExYX0xCUkQwX0VST01XSURUSF8zMkEJKEJJVCgxNikgKiAzKQkvKiAzMiBiaXRzIHdpZGUgKi8KICNkZWZpbmUgUExYX0xCUkQwX0VST01XSURUSF9NQVNLCUdFTk1BU0soMTcsIDE2KQotI2RlZmluZSBQTFhfTEJSRDBfRVJPTVdJRFRIX1NISUZUCTE2CiAvKiBFeHBhbnNpb24gUk9NIFNwYWNlIEludGVybmFsIFdhaXQgU3RhdGVzIChMQlJEMCBvbmx5KSAqLwogI2RlZmluZSBQTFhfTEJSRDBfRVJPTUlXUyh4KQkoQklUKDE4KSAqICgoeCkgJiAweGYpKQogI2RlZmluZSBQTFhfTEJSRDBfRVJPTUlXU19NQVNLCUdFTk1BU0soMjEsIDE4KQotI2RlZmluZSBQTFhfTEJSRDBfRVJPTUlXU19TSElGVAkxOAorI2RlZmluZSBQTFhfTEJSRDBfVE9fRVJPTUlXUyhyKQkoKChyKSAmIFBMWF9MQlJEMF9FUk9NSVdTX01BU0spID4+IDE4KQogLyogRXhwYW5zaW9uIFJPTSBTcGFjZSBSZWFkeSBJbnB1dCBFbmFibGUgKExCRFIwIG9ubHkpICovCiAjZGVmaW5lIFBMWF9MQlJEMF9FUk9NUkVBRFlJRU4JQklUKDIyKQogLyogRXhwYW5zaW9uIFJPTSBTcGFjZSBCVEVSTSMgSW5wdXQgRW5hYmxlIChMQlJEMCBvbmx5KSAqLwpAQCAtMjIwLDcgKzIxOCw3IEBACiAvKiBQQ0kgVGFyZ2V0IFJldHJ5IERlbGF5IENsb2NrcyAvIDggKExCUkQwIG9ubHkpICovCiAjZGVmaW5lIFBMWF9MQlJEMF9UUkRFTEFZKHgpCShCSVQoMjgpICogKCh4KSAmIDB4RikpCiAjZGVmaW5lIFBMWF9MQlJEMF9UUkRFTEFZX01BU0sJR0VOTUFTSygzMSwgMjgpCi0jZGVmaW5lIFBMWF9MQlJEMF9UUkRFTEFZX1NISUZUCTI4CisjZGVmaW5lIFBMWF9MQlJEMF9UT19UUkRFTEFZKHIpCSgoKHIpICYgUExYX0xCUkQwX1RSREVMQVlfTUFTSykgPj4gMjgpCiAKIC8qIExvY2FsIFJhbmdlIFJlZ2lzdGVyIGZvciBEaXJlY3QgTWFzdGVyIHRvIFBDSSAqLwogI2RlZmluZSBQTFhfUkVHX0RNUlIJCTB4MDAxYwpAQCAtMjQxLDEwICsyMzksMTAgQEAKIC8qIExMT0NLIyBJbnB1dCBFbmFibGUgKi8KICNkZWZpbmUgUExYX0RNUEJBTV9MTE9DS0lFTglCSVQoMikKIC8qIERpcmVjdCBNYXN0ZXIgUmVhZCBQcmVmZXRjaCBTaXplIENvbnRyb2wgKGJpdHMgMTIsIDMpICovCi0jZGVmaW5lIFBMWF9ETVBCQU1fUlBTSVpFQ09OVAkoKEJJVCgxMikgKiAwKSB8IChCSVQoMykgKiAwKSkKLSNkZWZpbmUgUExYX0RNUEJBTV9SUFNJWkU0CSgoQklUKDEyKSAqIDApIHwgKEJJVCgzKSAqIDEpKQotI2RlZmluZSBQTFhfRE1QQkFNX1JQU0laRTgJKChCSVQoMTIpICogMSkgfCAoQklUKDMpICogMCkpCi0jZGVmaW5lIFBMWF9ETVBCQU1fUlBTSVpFMTYJKChCSVQoMTIpICogMSkgfCAoQklUKDMpICogMSkpCisjZGVmaW5lIFBMWF9ETVBCQU1fUlBTSVpFX0NPTlQJKChCSVQoMTIpICogMCkgfCAoQklUKDMpICogMCkpCisjZGVmaW5lIFBMWF9ETVBCQU1fUlBTSVpFXzQJKChCSVQoMTIpICogMCkgfCAoQklUKDMpICogMSkpCisjZGVmaW5lIFBMWF9ETVBCQU1fUlBTSVpFXzgJKChCSVQoMTIpICogMSkgfCAoQklUKDMpICogMCkpCisjZGVmaW5lIFBMWF9ETVBCQU1fUlBTSVpFXzE2CSgoQklUKDEyKSAqIDEpIHwgKEJJVCgzKSAqIDEpKQogI2RlZmluZSBQTFhfRE1QQkFNX1JQU0laRV9NQVNLCShCSVQoMTIpIHwgQklUKDMpKQogLyogRGlyZWN0IE1hc3RlciBQQ0kgUmVhZCBNb2RlIC0gZGVhc3NlcnQgSVJEWSB3aGVuIEZJRk8gZnVsbCAqLwogI2RlZmluZSBQTFhfRE1QQkFNX1JNSVJEWQlCSVQoNCkKQEAgLTI2MSwxMCArMjU5LDEwIEBACiAvKiBJL08gUmVtYXAgU2VsZWN0ICovCiAjZGVmaW5lIFBMWF9ETVBCQU1fSU9SRU1BUFNFTAlCSVQoMTMpCiAvKiBEaXJlY3QgTWFzdGVyIFdyaXRlIERlbGF5ICovCi0jZGVmaW5lIFBMWF9ETVBCQU1fV0RFTEFZTk9ORQkoQklUKDE0KSAqIDApCi0jZGVmaW5lIFBMWF9ETVBCQU1fV0RFTEFZNAkoQklUKDE0KSAqIDEpCi0jZGVmaW5lIFBMWF9ETVBCQU1fV0RFTEFZOAkoQklUKDE0KSAqIDIpCi0jZGVmaW5lIFBMWF9ETVBCQU1fV0RFTEFZMTYJKEJJVCgxNCkgKiAzKQorI2RlZmluZSBQTFhfRE1QQkFNX1dERUxBWV9OT05FCShCSVQoMTQpICogMCkKKyNkZWZpbmUgUExYX0RNUEJBTV9XREVMQVlfNAkoQklUKDE0KSAqIDEpCisjZGVmaW5lIFBMWF9ETVBCQU1fV0RFTEFZXzgJKEJJVCgxNCkgKiAyKQorI2RlZmluZSBQTFhfRE1QQkFNX1dERUxBWV8xNgkoQklUKDE0KSAqIDMpCiAjZGVmaW5lIFBMWF9ETVBCQU1fV0RFTEFZX01BU0sJR0VOTUFTSygxNSwgMTQpCiAvKiBSZW1hcCBvZiBMb2NhbC10by1QQ0kgU3BhY2UgSW50byBQQ0kgQWRkcmVzcyBTcGFjZSAqLwogI2RlZmluZSBQTFhfRE1QQkFNX1JFTUFQX01BU0sJR0VOTUFTSygzMSwgMTYpCkBAIC0yNzksMTkgKzI3NywxOSBAQAogLyogUmVnaXN0ZXIgTnVtYmVyICovCiAjZGVmaW5lIFBMWF9ETUNGR0FfUkVHTlVNKHgpCShCSVQoMikgKiAoKHgpICYgMHgzZikpCiAjZGVmaW5lIFBMWF9ETUNGR0FfUkVHTlVNX01BU0sJR0VOTUFTSyg3LCAyKQotI2RlZmluZSBQTFhfRE1DRkdBX1JFR05VTV9TSElGVAkyCisjZGVmaW5lIFBMWF9ETUNGR0FfVE9fUkVHTlVNKHIpCSgoKHIpICYgUExYX0RNQ0ZHQV9SRUdOVU1fTUFTSykgPj4gMikKIC8qIEZ1bmN0aW9uIE51bWJlciAqLwogI2RlZmluZSBQTFhfRE1DRkdBX0ZVTkNOVU0oeCkJKEJJVCg4KSAqICgoeCkgJiAweDcpKQogI2RlZmluZSBQTFhfRE1DRkdBX0ZVTkNOVU1fTUFTSwlHRU5NQVNLKDEwLCA4KQotI2RlZmluZSBQTFhfRE1DRkdBX0ZVTkNOVU1fU0hJRlQgOAorI2RlZmluZSBQTFhfRE1DRkdBX1RPX0ZVTkNOVU0ocikgKCgocikgJiBQTFhfRE1DRkdBX0ZVTkNOVU1fTUFTSykgPj4gOCkKIC8qIERldmljZSBOdW1iZXIgKi8KICNkZWZpbmUgUExYX0RNQ0ZHQV9ERVZOVU0oeCkJKEJJVCgxMSkgKiAoKHgpICYgMHgxZikpCiAjZGVmaW5lIFBMWF9ETUNGR0FfREVWTlVNX01BU0sJR0VOTUFTSygxNSwgMTEpCi0jZGVmaW5lIFBMWF9ETUNGR0FfREVWTlVNX1NISUZUCTExCisjZGVmaW5lIFBMWF9ETUNGR0FfVE9fREVWTlVNKHIpCSgoKHIpICYgUExYX0RNQ0ZHQV9ERVZOVU1fTUFTSykgPj4gMTEpCiAvKiBCdXMgTnVtYmVyICovCiAjZGVmaW5lIFBMWF9ETUNGR0FfQlVTTlVNKHgpCShCSVQoMTYpICogKCh4KSAmIDB4ZmYpKQogI2RlZmluZSBQTFhfRE1DRkdBX0JVU05VTV9NQVNLCUdFTk1BU0soMjMsIDE2KQotI2RlZmluZSBQTFhfRE1DRkdBX0JVU05VTV9TSElGVAkxNgorI2RlZmluZSBQTFhfRE1DRkdBX1RPX0JVU05VTShyKQkoKChyKSAmIFBMWF9ETUNGR0FfQlVTTlVNX01BU0spID4+IDE2KQogLyogQ29uZmlndXJhdGlvbiBFbmFibGUgKi8KICNkZWZpbmUgUExYX0RNQ0ZHQV9DT05GSUdFTglCSVQoMzEpCiAKQEAgLTQwMiwyMiArNDAwLDIyIEBACiAvKiBQQ0kgUmVhZCBDb21tYW5kIENvZGUgRm9yIERNQSAqLwogI2RlZmluZSBQTFhfQ05UUkxfQ0NSRE1BKHgpCShCSVQoMCkgKiAoKHgpICYgMHhmKSkKICNkZWZpbmUgUExYX0NOVFJMX0NDUkRNQV9NQVNLCUdFTk1BU0soMywgMCkKLSNkZWZpbmUgUExYX0NOVFJMX0NDUkRNQV9TSElGVAkwCisjZGVmaW5lIFBMWF9DTlRSTF9UT19DQ1JETUEocikJKChyKSAmIFBMWF9DTlRSTF9DQ1JETUFfTUFTSykKICNkZWZpbmUgUExYX0NOVFJMX0NDUkRNQV9OT1JNQUwJUExYX0NOVFJMX0NDUkRNQSgxNCkJLyogdmFsdWUgYWZ0ZXIgcmVzZXQgKi8KIC8qIFBDSSBXcml0ZSBDb21tYW5kIENvZGUgRm9yIERNQSAwICovCiAjZGVmaW5lIFBMWF9DTlRSTF9DQ1dETUEoeCkJKEJJVCg0KSAqICgoeCkgJiAweGYpKQogI2RlZmluZSBQTFhfQ05UUkxfQ0NXRE1BX01BU0sJR0VOTUFTSyg3LCA0KQotI2RlZmluZSBQTFhfQ05UUkxfQ0NXRE1BX1NISUZUCTQKKyNkZWZpbmUgUExYX0NOVFJMX1RPX0NDV0RNQShyKQkoKChyKSAmIFBMWF9DTlRSTF9DQ1dETUFfTUFTSykgPj4gNCkKICNkZWZpbmUgUExYX0NOVFJMX0NDV0RNQV9OT1JNQUwJUExYX0NOVFJMX0NDV0RNQSg3KQkvKiB2YWx1ZSBhZnRlciByZXNldCAqLwogLyogUENJIE1lbW9yeSBSZWFkIENvbW1hbmQgQ29kZSBGb3IgRGlyZWN0IE1hc3RlciAqLwogI2RlZmluZSBQTFhfQ05UUkxfQ0NSRE0oeCkJKEJJVCg4KSAqICgoeCkgJiAweGYpKQogI2RlZmluZSBQTFhfQ05UUkxfQ0NSRE1fTUFTSwlHRU5NQVNLKDExLCA4KQotI2RlZmluZSBQTFhfQ05UUkxfQ0NSRE1fU0hJRlQJOAorI2RlZmluZSBQTFhfQ05UUkxfVE9fQ0NSRE0ocikJKCgocikgJiBQTFhfQ05UUkxfQ0NSRE1fTUFTSykgPj4gOCkKICNkZWZpbmUgUExYX0NOVFJMX0NDUkRNX05PUk1BTAlQTFhfQ05UUkxfQ0NSRE0oNikJLyogdmFsdWUgYWZ0ZXIgcmVzZXQgKi8KIC8qIFBDSSBNZW1vcnkgV3JpdGUgQ29tbWFuZCBDb2RlIEZvciBEaXJlY3QgTWFzdGVyICovCiAjZGVmaW5lIFBMWF9DTlRSTF9DQ1dETSh4KQkoQklUKDEyKSAqICgoeCkgJiAweGYpKQogI2RlZmluZSBQTFhfQ05UUkxfQ0NXRE1fTUFTSwlHRU5NQVNLKDE1LCAxMikKLSNkZWZpbmUgUExYX0NOVFJMX0NDV0RNX1NISUZUCTEyCisjZGVmaW5lIFBMWF9DTlRSTF9UT19DQ1dETShyKQkoKChyKSAmIFBMWF9DTlRSTF9DQ1dETV9NQVNLKSA+PiAxMikKICNkZWZpbmUgUExYX0NOVFJMX0NDV0RNX05PUk1BTAlQTFhfQ05UUkxfQ0NXRE0oNykJLyogdmFsdWUgYWZ0ZXIgcmVzZXQgKi8KIC8qIEdlbmVyYWwgUHVycG9zZSBPdXRwdXQgKFVTRVJPKSAqLwogI2RlZmluZSBQTFhfQ05UUkxfVVNFUk8JCUJJVCgxNikKQEAgLTQ2NCwxNiArNDYyLDE1IEBACiAjZGVmaW5lIFBMWF9SRUdfRE1BTU9ERTEJMHgwMDk0CiAKIC8qIExvY2FsIEJ1cyBXaWR0aCAqLwotI2RlZmluZSBQTFhfRE1BTU9ERV9XSURUSDgJKEJJVCgwKSAqIDApCS8qIDggYml0cyB3aWRlICovCi0jZGVmaW5lIFBMWF9ETUFNT0RFX1dJRFRIMTYJKEJJVCgwKSAqIDEpCS8qIDE2IGJpdHMgd2lkZSAqLwotI2RlZmluZSBQTFhfRE1BTU9ERV9XSURUSDMyCShCSVQoMCkgKiAyKQkvKiAzMiBiaXRzIHdpZGUgKi8KLSNkZWZpbmUgUExYX0RNQU1PREVfV0lEVEgzMkEJKEJJVCgwKSAqIDMpCS8qIDMyIGJpdHMgd2lkZSAqLworI2RlZmluZSBQTFhfRE1BTU9ERV9XSURUSF84CShCSVQoMCkgKiAwKQkvKiA4IGJpdHMgd2lkZSAqLworI2RlZmluZSBQTFhfRE1BTU9ERV9XSURUSF8xNgkoQklUKDApICogMSkJLyogMTYgYml0cyB3aWRlICovCisjZGVmaW5lIFBMWF9ETUFNT0RFX1dJRFRIXzMyCShCSVQoMCkgKiAyKQkvKiAzMiBiaXRzIHdpZGUgKi8KKyNkZWZpbmUgUExYX0RNQU1PREVfV0lEVEhfMzJBCShCSVQoMCkgKiAzKQkvKiAzMiBiaXRzIHdpZGUgKi8KICNkZWZpbmUgUExYX0RNQU1PREVfV0lEVEhfTUFTSwlHRU5NQVNLKDEsIDApCi0jZGVmaW5lIFBMWF9ETUFNT0RFX1dJRFRIX1NISUZUCTAKIC8qIEludGVybmFsIFdhaXQgU3RhdGVzICovCiAjZGVmaW5lIFBMWF9ETUFNT0RFX0lXUyh4KQkoQklUKDIpICogKCh4KSAmIDB4ZikpCiAjZGVmaW5lIFBMWF9ETUFNT0RFX0lXU19NQVNLCUdFTk1BU0soNSwgMikKLSNkZWZpbmUgUExYX0RNQU1PREVfU0hJRlQJMgorI2RlZmluZSBQTFhfRE1BTU9ERV9UT19JV1MocikJKCgocikgJiBQTFhfRE1BTU9ERV9JV1NfTUFTSykgPj4gMikKIC8qIFJlYWR5IElucHV0IEVuYWJsZSAqLwogI2RlZmluZSBQTFhfRE1BTU9ERV9SRUFEWUlFTglCSVQoNikKIC8qIEJURVJNIyBJbnB1dCBFbmFibGUgKi8KQEAgLTU2MCwzNSArNTU3LDM1IEBACiAvKiBETUEgQ2hhbm5lbCAwIFBDSS10by1Mb2NhbCBBbG1vc3QgRnVsbCAoZGl2aWRlZCBieSAyLCBtaW51cyAxKSAqLwogI2RlZmluZSBQTFhfRE1BVEhSX0MwUExBRih4KQkoQklUKDApICogKCh4KSAmIDB4ZikpCiAjZGVmaW5lIFBMWF9ETUFUSFJfQzBQTEFGX01BU0sJR0VOTUFTSygzLCAwKQotI2RlZmluZSBQTFhfRE1BVEhSX0MwUExBRl9TSElGVAkwCisjZGVmaW5lIFBMWF9ETUFUSFJfVE9fQzBQTEFGKHIpCSgocikgJiBQTFhfRE1BVEhSX0MwUExBRl9NQVNLKQogLyogRE1BIENoYW5uZWwgMCBMb2NhbC10by1QQ0kgQWxtb3N0IEVtcHR5IChkaXZpZGVkIGJ5IDIsIG1pbnVzIDEpICovCiAjZGVmaW5lIFBMWF9ETUFUSFJfQzBMUEFFKHgpCShCSVQoNCkgKiAoKHgpICYgMHhmKSkKICNkZWZpbmUgUExYX0RNQVRIUl9DMExQQUVfTUFTSwlHRU5NQVNLKDcsIDQpCi0jZGVmaW5lIFBMWF9ETUFUSFJfQzBMUEFFX1NISUZUCTQKKyNkZWZpbmUgUExYX0RNQVRIUl9UT19DMExQQUUocikJKCgocikgJiBQTFhfRE1BVEhSX0MwTFBBRV9NQVNLKSA+PiA0KQogLyogRE1BIENoYW5uZWwgMCBMb2NhbC10by1QQ0kgQWxtb3N0IEZ1bGwgKGRpdmlkZWQgYnkgMiwgbWludXMgMSkgKi8KICNkZWZpbmUgUExYX0RNQVRIUl9DMExQQUYoeCkJKEJJVCg4KSAqICgoeCkgJiAweGYpKQogI2RlZmluZSBQTFhfRE1BVEhSX0MwTFBBRl9NQVNLCUdFTk1BU0soMTEsIDgpCi0jZGVmaW5lIFBMWF9ETUFUSFJfQzBMUEFGX1NISUZUCTgKKyNkZWZpbmUgUExYX0RNQVRIUl9UT19DMExQQUYocikJKCgocikgJiBQTFhfRE1BVEhSX0MwTFBBRl9NQVNLKSA+PiA4KQogLyogRE1BIENoYW5uZWwgMCBQQ0ktdG8tTG9jYWwgQWxtb3N0IEVtcHR5IChkaXZpZGVkIGJ5IDIsIG1pbnVzIDEpICovCiAjZGVmaW5lIFBMWF9ETUFUSFJfQzBQTEFFKHgpCShCSVQoMTIpICogKCh4KSAmIDB4ZikpCiAjZGVmaW5lIFBMWF9ETUFUSFJfQzBQTEFFX01BU0sJR0VOTUFTSygxNSwgMTIpCi0jZGVmaW5lIFBMWF9ETUFUSFJfQzBQTEFFX1NISUZUCTEyCisjZGVmaW5lIFBMWF9ETUFUSFJfVE9fQzBQTEFFKHIpCSgoKHIpICYgUExYX0RNQVRIUl9DMFBMQUVfTUFTSykgPj4gMTIpCiAvKiBETUEgQ2hhbm5lbCAxIFBDSS10by1Mb2NhbCBBbG1vc3QgRnVsbCAoZGl2aWRlZCBieSAyLCBtaW51cyAxKSAqLwogI2RlZmluZSBQTFhfRE1BVEhSX0MxUExBRih4KQkoQklUKDE2KSAqICgoeCkgJiAweGYpKQogI2RlZmluZSBQTFhfRE1BVEhSX0MxUExBRl9NQVNLCUdFTk1BU0soMTksIDE2KQotI2RlZmluZSBQTFhfRE1BVEhSX0MxUExBRl9TSElGVAkxNgorI2RlZmluZSBQTFhfRE1BVEhSX1RPX0MxUExBRihyKQkoKChyKSAmIFBMWF9ETUFUSFJfQzFQTEFGX01BU0spID4+IDE2KQogLyogRE1BIENoYW5uZWwgMSBMb2NhbC10by1QQ0kgQWxtb3N0IEVtcHR5IChkaXZpZGVkIGJ5IDIsIG1pbnVzIDEpICovCiAjZGVmaW5lIFBMWF9ETUFUSFJfQzFMUEFFKHgpCShCSVQoMjApICogKCh4KSAmIDB4ZikpCiAjZGVmaW5lIFBMWF9ETUFUSFJfQzFMUEFFX01BU0sJR0VOTUFTSygyMywgMjApCi0jZGVmaW5lIFBMWF9ETUFUSFJfQzFMUEFFX1NISUZUCTIwCisjZGVmaW5lIFBMWF9ETUFUSFJfVE9fQzFMUEFFKHIpCSgoKHIpICYgUExYX0RNQVRIUl9DMUxQQUVfTUFTSykgPj4gMjApCiAvKiBETUEgQ2hhbm5lbCAxIExvY2FsLXRvLVBDSSBBbG1vc3QgRnVsbCAoZGl2aWRlZCBieSAyLCBtaW51cyAxKSAqLwogI2RlZmluZSBQTFhfRE1BVEhSX0MxTFBBRih4KQkoQklUKDI0KSAqICgoeCkgJiAweGYpKQogI2RlZmluZSBQTFhfRE1BVEhSX0MxTFBBRl9NQVNLCUdFTk1BU0soMjcsIDI0KQotI2RlZmluZSBQTFhfRE1BVEhSX0MxTFBBRl9TSElGVAkyNAorI2RlZmluZSBQTFhfRE1BVEhSX1RPX0MxTFBBRihyKQkoKChyKSAmIFBMWF9ETUFUSFJfQzFMUEFGX01BU0spID4+IDI0KQogLyogRE1BIENoYW5uZWwgMSBQQ0ktdG8tTG9jYWwgQWxtb3N0IEVtcHR5IChkaXZpZGVkIGJ5IDIsIG1pbnVzIDEpICovCiAjZGVmaW5lIFBMWF9ETUFUSFJfQzFQTEFFKHgpCShCSVQoMjgpICogKCh4KSAmIDB4ZikpCiAjZGVmaW5lIFBMWF9ETUFUSFJfQzFQTEFFX01BU0sJR0VOTUFTSygzMSwgMjgpCi0jZGVmaW5lIFBMWF9ETUFUSFJfQzFQTEFFX1NISUZUCTI4CisjZGVmaW5lIFBMWF9ETUFUSFJfVE9fQzFQTEFFKHIpCSgoKHIpICYgUExYX0RNQVRIUl9DMVBMQUVfTUFTSykgPj4gMjgpCiAKIC8qCiAgKiBNZXNzYWdpbmcgUXVldWUgUmVnaXN0ZXJzIE9QTEZJUywgT1BMRklNLCBJUVAsIE9RUCwgTVFDUiwgUUJBUiwgSUZIUFIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYwppbmRleCA0YTg3YjRiLi5jMTRhMDI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMKQEAgLTY5NywxMzQgKzY5Nyw2IEBACiAJczYyNl9kZWJpX3JlcGxhY2UoZGV2LCBTNjI2X0xQX0NSQihjaGFuKSwgflM2MjZfQ1JCTVNLX0lOVENUUkwsIHNldCk7CiB9CiAKLSNpZmRlZiB1bnVzZWQKLS8qCi0gKiBSZXR1cm4gY291bnRlciBzZXR1cCBpbiBhIGZvcm1hdCAoQ09VTlRFUl9TRVRVUCkgdGhhdCBpcyBjb25zaXN0ZW50Ci0gKiBmb3IgYm90aCBBIGFuZCBCIGNvdW50ZXJzLgotICovCi1zdGF0aWMgdWludDE2X3QgczYyNl9nZXRfbW9kZV9hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJdW5zaWduZWQgaW50IGNoYW4pCi17Ci0JdWludDE2X3QgY3JhOwotCXVpbnQxNl90IGNyYjsKLQl1aW50MTZfdCBzZXR1cDsKLQl1bnNpZ25lZCBpbnQgY250c3JjLCBjbGttdWx0LCBjbGtwb2wsIGVuY21vZGU7Ci0KLQkvKiBGZXRjaCBDUkEgYW5kIENSQiByZWdpc3RlciBpbWFnZXMuICovCi0JY3JhID0gczYyNl9kZWJpX3JlYWQoZGV2LCBTNjI2X0xQX0NSQShjaGFuKSk7Ci0JY3JiID0gczYyNl9kZWJpX3JlYWQoZGV2LCBTNjI2X0xQX0NSQihjaGFuKSk7Ci0KLQkvKgotCSAqIFBvcHVsYXRlIHRoZSBzdGFuZGFyZGl6ZWQgY291bnRlciBzZXR1cCBiaXQgZmllbGRzLgotCSAqLwotCXNldHVwID0KLQkJLyogTG9hZFNyYyAgPSBMb2FkU3JjQS4gKi8KLQkJUzYyNl9TRVRfU1REX0xPQURTUkMoUzYyNl9HRVRfQ1JBX0xPQURTUkNfQShjcmEpKSB8Ci0JCS8qIExhdGNoU3JjID0gTGF0Y2hTcmNBLiAqLwotCQlTNjI2X1NFVF9TVERfTEFUQ0hTUkMoUzYyNl9HRVRfQ1JCX0xBVENIU1JDKGNyYikpIHwKLQkJLyogSW50U3JjICAgPSBJbnRTcmNBLiAqLwotCQlTNjI2X1NFVF9TVERfSU5UU1JDKFM2MjZfR0VUX0NSQV9JTlRTUkNfQShjcmEpKSB8Ci0JCS8qIEluZHhTcmMgID0gSW5keFNyY0EuICovCi0JCVM2MjZfU0VUX1NURF9JTkRYU1JDKFM2MjZfR0VUX0NSQV9JTkRYU1JDX0EoY3JhKSkgfAotCQkvKiBJbmR4UG9sICA9IEluZHhQb2xBLiAqLwotCQlTNjI2X1NFVF9TVERfSU5EWFBPTChTNjI2X0dFVF9DUkFfSU5EWFBPTF9BKGNyYSkpIHwKLQkJLyogQ2xrRW5hYiAgPSBDbGtFbmFiQS4gKi8KLQkJUzYyNl9TRVRfU1REX0NMS0VOQUIoUzYyNl9HRVRfQ1JCX0NMS0VOQUJfQShjcmIpKTsKLQotCS8qIEFkanVzdCBtb2RlLWRlcGVuZGVudCBwYXJhbWV0ZXJzLiAqLwotCWNudHNyYyA9IFM2MjZfR0VUX0NSQV9DTlRTUkNfQShjcmEpOwotCWlmIChjbnRzcmMgJiBTNjI2X0NOVFNSQ19TWVNDTEspIHsKLQkJLyogVGltZXIgbW9kZSAoQ250U3JjQTwxPiA9PSAxKTogKi8KLQkJZW5jbW9kZSA9IFM2MjZfRU5DTU9ERV9USU1FUjsKLQkJLyogU2V0IENsa1BvbCB0byBpbmRpY2F0ZSBjb3VudCBkaXJlY3Rpb24gKENudFNyY0E8MD4pLiAqLwotCQljbGtwb2wgPSBjbnRzcmMgJiAxOwotCQkvKiBDbGtNdWx0IG11c3QgYmUgMXggaW4gVGltZXIgbW9kZS4gKi8KLQkJY2xrbXVsdCA9IFM2MjZfQ0xLTVVMVF8xWDsKLQl9IGVsc2UgewotCQkvKiBDb3VudGVyIG1vZGUgKENudFNyY0E8MT4gPT0gMCk6ICovCi0JCWVuY21vZGUgPSBTNjI2X0VOQ01PREVfQ09VTlRFUjsKLQkJLyogUGFzcyB0aHJvdWdoIENsa1BvbC4gKi8KLQkJY2xrcG9sID0gUzYyNl9HRVRfQ1JBX0NMS1BPTF9BKGNyYSk7Ci0JCS8qIEZvcmNlIENsa011bHQgdG8gMXggaWYgbm90IGxlZ2FsLCBlbHNlIHBhc3MgdGhyb3VnaC4gKi8KLQkJY2xrbXVsdCA9IFM2MjZfR0VUX0NSQV9DTEtNVUxUX0EoY3JhKTsKLQkJaWYgKGNsa211bHQgPT0gUzYyNl9DTEtNVUxUX1NQRUNJQUwpCi0JCQljbGttdWx0ID0gUzYyNl9DTEtNVUxUXzFYOwotCX0KLQlzZXR1cCB8PSBTNjI2X1NFVF9TVERfRU5DTU9ERShlbmNtb2RlKSB8IFM2MjZfU0VUX1NURF9DTEtNVUxUKGNsa211bHQpIHwKLQkJIFM2MjZfU0VUX1NURF9DTEtQT0woY2xrcG9sKTsKLQotCS8qIFJldHVybiBhZGp1c3RlZCBjb3VudGVyIHNldHVwLiAqLwotCXJldHVybiBzZXR1cDsKLX0KLQotc3RhdGljIHVpbnQxNl90IHM2MjZfZ2V0X21vZGVfYihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCXVuc2lnbmVkIGludCBjaGFuKQotewotCXVpbnQxNl90IGNyYTsKLQl1aW50MTZfdCBjcmI7Ci0JdWludDE2X3Qgc2V0dXA7Ci0JdW5zaWduZWQgaW50IGNudHNyYywgY2xrbXVsdCwgY2xrcG9sLCBlbmNtb2RlOwotCi0JLyogRmV0Y2ggQ1JBIGFuZCBDUkIgcmVnaXN0ZXIgaW1hZ2VzLiAqLwotCWNyYSA9IHM2MjZfZGViaV9yZWFkKGRldiwgUzYyNl9MUF9DUkEoY2hhbikpOwotCWNyYiA9IHM2MjZfZGViaV9yZWFkKGRldiwgUzYyNl9MUF9DUkIoY2hhbikpOwotCi0JLyoKLQkgKiBQb3B1bGF0ZSB0aGUgc3RhbmRhcmRpemVkIGNvdW50ZXIgc2V0dXAgYml0IGZpZWxkcy4KLQkgKi8KLQlzZXR1cCA9Ci0JCS8qIEludFNyYyAgID0gSW50U3JjQi4gKi8KLQkJUzYyNl9TRVRfU1REX0lOVFNSQyhTNjI2X0dFVF9DUkJfSU5UU1JDX0IoY3JiKSkgfAotCQkvKiBMYXRjaFNyYyA9IExhdGNoU3JjQi4gKi8KLQkJUzYyNl9TRVRfU1REX0xBVENIU1JDKFM2MjZfR0VUX0NSQl9MQVRDSFNSQyhjcmIpKSB8Ci0JCS8qIExvYWRTcmMgID0gTG9hZFNyY0IuICovCi0JCVM2MjZfU0VUX1NURF9MT0FEU1JDKFM2MjZfR0VUX0NSQl9MT0FEU1JDX0IoY3JiKSkgfAotCQkvKiBJbmR4UG9sICA9IEluZHhQb2xCLiAqLwotCQlTNjI2X1NFVF9TVERfSU5EWFBPTChTNjI2X0dFVF9DUkJfSU5EWFBPTF9CKGNyYikpIHwKLQkJLyogQ2xrRW5hYiAgPSBDbGtFbmFiQi4gKi8KLQkJUzYyNl9TRVRfU1REX0NMS0VOQUIoUzYyNl9HRVRfQ1JCX0NMS0VOQUJfQihjcmIpKSB8Ci0JCS8qIEluZHhTcmMgID0gSW5keFNyY0IuICovCi0JCVM2MjZfU0VUX1NURF9JTkRYU1JDKFM2MjZfR0VUX0NSQV9JTkRYU1JDX0IoY3JhKSk7Ci0KLQkvKiBBZGp1c3QgbW9kZS1kZXBlbmRlbnQgcGFyYW1ldGVycy4gKi8KLQljbnRzcmMgPSBTNjI2X0dFVF9DUkFfQ05UU1JDX0IoY3JhKTsKLQljbGttdWx0ID0gUzYyNl9HRVRfQ1JCX0NMS01VTFRfQihjcmIpOwotCWlmIChjbGttdWx0ID09IFM2MjZfQ0xLTVVMVF9TUEVDSUFMKSB7Ci0JCS8qIEV4dGVuZGVyIG1vZGUgKENsa011bHRCID09IFM2MjZfQ0xLTVVMVF9TUEVDSUFMKTogKi8KLQkJZW5jbW9kZSA9IFM2MjZfRU5DTU9ERV9FWFRFTkRFUjsKLQkJLyogSW5kaWNhdGUgbXVsdGlwbGllciBpcyAxeC4gKi8KLQkJY2xrbXVsdCA9IFM2MjZfQ0xLTVVMVF8xWDsKLQkJLyogU2V0IENsa1BvbCBlcXVhbCB0byBUaW1lciBjb3VudCBkaXJlY3Rpb24gKENudFNyY0I8MD4pLiAqLwotCQljbGtwb2wgPSBjbnRzcmMgJiAxOwotCX0gZWxzZSBpZiAoY250c3JjICYgUzYyNl9DTlRTUkNfU1lTQ0xLKSB7Ci0JCS8qIFRpbWVyIG1vZGUgKENudFNyY0I8MT4gPT0gMSk6ICovCi0JCWVuY21vZGUgPSBTNjI2X0VOQ01PREVfVElNRVI7Ci0JCS8qIEluZGljYXRlIG11bHRpcGxpZXIgaXMgMXguICovCi0JCWNsa211bHQgPSBTNjI2X0NMS01VTFRfMVg7Ci0JCS8qIFNldCBDbGtQb2wgZXF1YWwgdG8gVGltZXIgY291bnQgZGlyZWN0aW9uIChDbnRTcmNCPDA+KS4gKi8KLQkJY2xrcG9sID0gY250c3JjICYgMTsKLQl9IGVsc2UgewotCQkvKiBJZiBDb3VudGVyIG1vZGUgKENudFNyY0I8MT4gPT0gMCk6ICovCi0JCWVuY21vZGUgPSBTNjI2X0VOQ01PREVfQ09VTlRFUjsKLQkJLyogQ2xvY2sgbXVsdGlwbGllciBpcyBwYXNzZWQgdGhyb3VnaC4gKi8KLQkJLyogQ2xvY2sgcG9sYXJpdHkgaXMgcGFzc2VkIHRocm91Z2guICovCi0JCWNsa3BvbCA9IFM2MjZfR0VUX0NSQl9DTEtQT0xfQihjcmIpOwotCX0KLQlzZXR1cCB8PSBTNjI2X1NFVF9TVERfRU5DTU9ERShlbmNtb2RlKSB8IFM2MjZfU0VUX1NURF9DTEtNVUxUKGNsa211bHQpIHwKLQkJIFM2MjZfU0VUX1NURF9DTEtQT0woY2xrcG9sKTsKLQotCS8qIFJldHVybiBhZGp1c3RlZCBjb3VudGVyIHNldHVwLiAqLwotCXJldHVybiBzZXR1cDsKLX0KLQotc3RhdGljIHVpbnQxNl90IHM2MjZfZ2V0X21vZGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBjaGFuKQotewotCXJldHVybiAoY2hhbiA8IDMpID8gczYyNl9nZXRfbW9kZV9hKGRldiwgY2hhbikKLQkJCSAgOiBzNjI2X2dldF9tb2RlX2IoZGV2LCBjaGFuKTsKLX0KLSNlbmRpZgotCiAvKgogICogU2V0IHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHNwZWNpZmllZCBjb3VudGVyLiAgVGhlIHNldHVwCiAgKiBwYXJhbWV0ZXIgaXMgdHJlYXRlZCBhcyBhIENPVU5URVJfU0VUVVAgZGF0YSB0eXBlLiAgVGhlIGZvbGxvd2luZwpAQCAtMTAyMywyNSArODk1LDYgQEAKIAlzNjI2X2RlYmlfcmVwbGFjZShkZXYsIFM2MjZfTFBfQ1JCKGNoYW4pLCB+bWFzaywgc2V0KTsKIH0KIAotI2lmZGVmIHVudXNlZAotc3RhdGljIHVpbnQxNl90IHM2MjZfZ2V0X2VuYWJsZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCXVuc2lnbmVkIGludCBjaGFuKQotewotCXVpbnQxNl90IGNyYiA9IHM2MjZfZGViaV9yZWFkKGRldiwgUzYyNl9MUF9DUkIoY2hhbikpOwotCi0JcmV0dXJuIChjaGFuIDwgMykgPyBTNjI2X0dFVF9DUkJfQ0xLRU5BQl9BKGNyYikKLQkJCSAgOiBTNjI2X0dFVF9DUkJfQ0xLRU5BQl9CKGNyYik7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIHVudXNlZAotc3RhdGljIHVpbnQxNl90IHM2MjZfZ2V0X2xhdGNoX3NvdXJjZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBjaGFuKQotewotCXJldHVybiBTNjI2X0dFVF9DUkJfTEFUQ0hTUkMoczYyNl9kZWJpX3JlYWQoZGV2LCBTNjI2X0xQX0NSQihjaGFuKSkpOwotfQotI2VuZGlmCi0KIC8qCiAgKiBSZXR1cm4vc2V0IHRoZSBldmVudCB0aGF0IHdpbGwgdHJpZ2dlciB0cmFuc2ZlciBvZiB0aGUgcHJlbG9hZAogICogcmVnaXN0ZXIgaW50byB0aGUgY291bnRlci4gIDA9VGhpc0NudHJfSW5kZXgsIDE9VGhpc0NudHJfT3ZlcmZsb3csCkBAIC0xMDY2LDE5ICs5MTksNiBAQAogCXM2MjZfZGViaV9yZXBsYWNlKGRldiwgcmVnLCB+bWFzaywgc2V0KTsKIH0KIAotI2lmZGVmIHVudXNlZAotc3RhdGljIHVpbnQxNl90IHM2MjZfZ2V0X2xvYWRfdHJpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgIHVuc2lnbmVkIGludCBjaGFuKQotewotCWlmIChjaGFuIDwgMykKLQkJcmV0dXJuIFM2MjZfR0VUX0NSQV9MT0FEU1JDX0EoczYyNl9kZWJpX3JlYWQoZGV2LAotCQkJCQkJCVM2MjZfTFBfQ1JBKGNoYW4pKSk7Ci0JZWxzZQotCQlyZXR1cm4gUzYyNl9HRVRfQ1JCX0xPQURTUkNfQihzNjI2X2RlYmlfcmVhZChkZXYsCi0JCQkJCQkJUzYyNl9MUF9DUkIoY2hhbikpKTsKLX0KLSNlbmRpZgotCiAvKgogICogUmV0dXJuL3NldCBjb3VudGVyIGludGVycnVwdCBzb3VyY2UgYW5kIGNsZWFyIGFueSBjYXB0dXJlZAogICogaW5kZXgvb3ZlcmZsb3cgZXZlbnRzLiAgaW50X3NvdXJjZTogMD1EaXNhYmxlZCwgMT1PdmVyZmxvd09ubHksCkBAIC0xMTM4LDkzICs5NzgsNiBAQAogCX0KIH0KIAotI2lmZGVmIHVudXNlZAotc3RhdGljIHVpbnQxNl90IHM2MjZfZ2V0X2ludF9zcmMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgdW5zaWduZWQgaW50IGNoYW4pCi17Ci0JaWYgKGNoYW4gPCAzKQotCQlyZXR1cm4gUzYyNl9HRVRfQ1JBX0lOVFNSQ19BKHM2MjZfZGViaV9yZWFkKGRldiwKLQkJCQkJCQlTNjI2X0xQX0NSQShjaGFuKSkpOwotCWVsc2UKLQkJcmV0dXJuIFM2MjZfR0VUX0NSQl9JTlRTUkNfQihzNjI2X2RlYmlfcmVhZChkZXYsCi0JCQkJCQkJUzYyNl9MUF9DUkIoY2hhbikpKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgdW51c2VkCi0vKgotICogUmV0dXJuL3NldCB0aGUgY2xvY2sgbXVsdGlwbGllci4KLSAqLwotc3RhdGljIHZvaWQgczYyNl9zZXRfY2xrX211bHQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBjaGFuLCB1aW50MTZfdCB2YWx1ZSkKLXsKLQl1aW50MTZfdCBtb2RlOwotCi0JbW9kZSA9IHM2MjZfZ2V0X21vZGUoZGV2LCBjaGFuKTsKLQltb2RlICY9IH5TNjI2X1NURE1TS19DTEtNVUxUOwotCW1vZGUgfD0gUzYyNl9TRVRfU1REX0NMS01VTFQodmFsdWUpOwotCi0JczYyNl9zZXRfbW9kZShkZXYsIGNoYW4sIG1vZGUsIGZhbHNlKTsKLX0KLQotLyoKLSAqIFJldHVybi9zZXQgdGhlIGNsb2NrIHBvbGFyaXR5LgotICovCi1zdGF0aWMgdm9pZCBzNjI2X3NldF9jbGtfcG9sKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgIHVuc2lnbmVkIGludCBjaGFuLCB1aW50MTZfdCB2YWx1ZSkKLXsKLQl1aW50MTZfdCBtb2RlOwotCi0JbW9kZSA9IHM2MjZfZ2V0X21vZGUoZGV2LCBjaGFuKTsKLQltb2RlICY9IH5TNjI2X1NURE1TS19DTEtQT0w7Ci0JbW9kZSB8PSBTNjI2X1NFVF9TVERfQ0xLUE9MKHZhbHVlKTsKLQotCXM2MjZfc2V0X21vZGUoZGV2LCBjaGFuLCBtb2RlLCBmYWxzZSk7Ci19Ci0KLS8qCi0gKiBSZXR1cm4vc2V0IHRoZSBlbmNvZGVyIG1vZGUuCi0gKi8KLXN0YXRpYyB2b2lkIHM2MjZfc2V0X2VuY19tb2RlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgY2hhbiwgdWludDE2X3QgdmFsdWUpCi17Ci0JdWludDE2X3QgbW9kZTsKLQotCW1vZGUgPSBzNjI2X2dldF9tb2RlKGRldiwgY2hhbik7Ci0JbW9kZSAmPSB+UzYyNl9TVERNU0tfRU5DTU9ERTsKLQltb2RlIHw9IFM2MjZfU0VUX1NURF9FTkNNT0RFKHZhbHVlKTsKLQotCXM2MjZfc2V0X21vZGUoZGV2LCBjaGFuLCBtb2RlLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBzNjI2X2dldF9pbmRleF9wb2woc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICB1bnNpZ25lZCBpbnQgY2hhbikKLXsKLQlyZXR1cm4gUzYyNl9HRVRfU1REX0lORFhQT0woczYyNl9nZXRfbW9kZShkZXYsIGNoYW4pKTsKLX0KLQotLyoKLSAqIFJldHVybi9zZXQgdGhlIGluZGV4IHNvdXJjZS4KLSAqLwotc3RhdGljIHZvaWQgczYyNl9zZXRfaW5kZXhfc3JjKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGNoYW4sIHVpbnQxNl90IHZhbHVlKQotewotCXVpbnQxNl90IG1vZGU7Ci0KLQltb2RlID0gczYyNl9nZXRfbW9kZShkZXYsIGNoYW4pOwotCW1vZGUgJj0gflM2MjZfU1RETVNLX0lORFhTUkM7Ci0JbW9kZSB8PSBTNjI2X1NFVF9TVERfSU5EWFNSQyh2YWx1ZSAhPSAwKTsKLQotCXM2MjZfc2V0X21vZGUoZGV2LCBjaGFuLCBtb2RlLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBzNjI2X2dldF9pbmRleF9zcmMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICB1bnNpZ25lZCBpbnQgY2hhbikKLXsKLQlyZXR1cm4gUzYyNl9HRVRfU1REX0lORFhTUkMoczYyNl9nZXRfbW9kZShkZXYsIGNoYW4pKTsKLX0KLSNlbmRpZgotCiAvKgogICogR2VuZXJhdGUgYW4gaW5kZXggcHVsc2UuCiAgKi8KQEAgLTE3MTcsNDMgKzE0NzAsNiBAQAogCS8qIEVuZCBvZiBSUFMgcHJvZ3JhbSBidWlsZCAqLwogfQogCi0jaWZkZWYgdW51c2VkX2NvZGUKLXN0YXRpYyBpbnQgczYyNl9haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0Jc3RydWN0IHM2MjZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1aW50OF90IGk7Ci0JaW50MzJfdCAqcmVhZGFkZHI7Ci0KLQkvKiBUcmlnZ2VyIEFEQyBzY2FuIGxvb3Agc3RhcnQgKi8KLQlzNjI2X21jX2VuYWJsZShkZXYsIFM2MjZfTUMyX0FEQ19SUFMsIFM2MjZfUF9NQzIpOwotCi0JLyogV2FpdCB1bnRpbCBBREMgc2NhbiBsb29wIGlzIGZpbmlzaGVkIChSUFMgU2lnbmFsIDAgcmVzZXQpICovCi0Jd2hpbGUgKHM2MjZfbWNfdGVzdChkZXYsIFM2MjZfTUMyX0FEQ19SUFMsIFM2MjZfUF9NQzIpKQotCQk7Ci0KLQkvKgotCSAqIEluaXQgcHRyIHRvIERNQSBidWZmZXIgdGhhdCBob2xkcyBuZXcgQURDIGRhdGEuICBXZSBza2lwIHRoZQotCSAqIGZpcnN0IHVpbnQxNl90IGluIHRoZSBidWZmZXIgYmVjYXVzZSBpdCBjb250YWlucyBqdW5rIGRhdGEgZnJvbQotCSAqIHRoZSBmaW5hbCBBREMgb2YgdGhlIHByZXZpb3VzIHBvbGwgbGlzdCBzY2FuLgotCSAqLwotCXJlYWRhZGRyID0gKHVpbnQzMl90ICopZGV2cHJpdi0+YW5hX2J1Zi5sb2dpY2FsX2Jhc2UgKyAxOwotCi0JLyoKLQkgKiBDb252ZXJ0IEFEQyBkYXRhIHRvIDE2LWJpdCBpbnRlZ2VyIHZhbHVlcyBhbmQKLQkgKiBjb3B5IHRvIGFwcGxpY2F0aW9uIGJ1ZmZlci4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZGV2cHJpdi0+YWRjX2l0ZW1zOyBpKyspIHsKLQkJKmRhdGEgPSBzNjI2X2FpX3JlZ190b191aW50KCpyZWFkYWRkcisrKTsKLQkJZGF0YSsrOwotCX0KLQotCXJldHVybiBpOwotfQotI2VuZGlmCi0KIHN0YXRpYyBpbnQgczYyNl9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLApAQCAtMjUwMCw3ICsyMjE2LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCXdyaXRlbChTNjI2X0kyQ19DTEtTRUwsIGRldi0+bW1pbyArIFM2MjZfUF9JMkNTVEFUKTsKIAkJczYyNl9tY19lbmFibGUoZGV2LCBTNjI2X01DMl9VUExEX0lJQywgUzYyNl9QX01DMik7Ci0JCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgTlVMTCwgTlVMTCwgczYyNl9pMmNfaGFuZHNoYWtlX2VvYywgMCk7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgTlVMTCwKKwkJCQkgICAgIE5VTEwsIHM2MjZfaTJjX2hhbmRzaGFrZV9lb2MsIDApOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuaAppbmRleCA2YTAwYTY0Li40Y2VmNDUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmgKQEAgLTc5LDcgKzc5LDcgQEAKIC8qIEFkZHJlc3Mgb2Zmc2V0cywgaW4gRFdPUkRTLCBmcm9tIGJhc2Ugb2YgRE1BIGJ1ZmZlci4gKi8KICNkZWZpbmUgUzYyNl9EQUNfV0RNQUJVRl9PUwlTNjI2X0FEQ19ETUFCVUZfRFdPUkRTCiAKLS8qICBJbnRlcnJ1cHQgZW5hYmxlIGJpdCBpbiBJU1IgYW5kIElFUi4gKi8KKy8qIEludGVycnVwdCBlbmFibGUgYml0IGluIElTUiBhbmQgSUVSLiAqLwogI2RlZmluZSBTNjI2X0lSUV9HUElPMwkJMHgwMDAwMDA0MAkvKiBJUlEgZW5hYmxlIGZvciBHUElPMy4gKi8KICNkZWZpbmUgUzYyNl9JUlFfUlBTMQkJMHgxMDAwMDAwMAogI2RlZmluZSBTNjI2X0lTUl9BRk9VCQkweDAwMDAwODAwCkBAIC0zMjksNyArMzI5LDcgQEAKIAkJCQkJCSAqIFdTMS1XUzQgPSBDUyogb3V0cHV0cy4KIAkJCQkJCSAqLwogCi0jaWYgUzYyNl9QTEFURk9STSA9PSBTNjI2X0lOVEVMCQkvKgorI2lmIChTNjI2X1BMQVRGT1JNID09IFM2MjZfSU5URUwpCS8qCiAJCQkJCSAqIEJhc2UgQUNPTjEgY29uZmlnOiBhbHdheXMgcnVuCiAJCQkJCSAqIEExIGJhc2VkIG9uIFRTTDEuCiAJCQkJCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhmYXN0LmMKaW5kZXggMTBmOTRlYy4uNjA4NDAzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jCkBAIC05NDYsMTAgKzk0Niw4IEBACiAJfQogCiAJZGV2cHJpdi0+dXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldnByaXYtPnVyYikgewotCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiQ291bGQgbm90IGFsbG9jLiB1cmJcbiIpOworCWlmICghZGV2cHJpdi0+dXJiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlkZXZwcml2LT5pbmJ1ZiA9IGttYWxsb2MoU0laRUlOQlVGLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldnByaXYtPmluYnVmKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3ZtazgweHguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy92bWs4MHh4LmMKaW5kZXggOGM3MzkzZS4uYTAwNGFlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3ZtazgweHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdm1rODB4eC5jCkBAIC0xNzcsNyArMTc3LDcgQEAKIAkgKiBUaGUgbWF4IHBhY2tldCBzaXplIGF0dHJpYnV0ZXMgb2YgdGhlIEs4MDYxCiAJICogaW5wdXQvb3V0cHV0IGVuZHBvaW50cyBhcmUgaWRlbnRpY2FsCiAJICovCi0Jc2l6ZSA9IGxlMTZfdG9fY3B1KGRldnByaXYtPmVwX3R4LT53TWF4UGFja2V0U2l6ZSk7CisJc2l6ZSA9IHVzYl9lbmRwb2ludF9tYXhwKGRldnByaXYtPmVwX3R4KTsKIAogCXVzYl9idWxrX21zZyh1c2IsIHR4X3BpcGUsIGRldnByaXYtPnVzYl90eF9idWYsCiAJCSAgICAgc2l6ZSwgTlVMTCwgZGV2cHJpdi0+ZXBfdHgtPmJJbnRlcnZhbCk7CkBAIC0xOTksNyArMTk5LDcgQEAKIAllcCA9IGRldnByaXYtPmVwX3J4OwogCXBpcGUgPSB1c2JfcmN2aW50cGlwZSh1c2IsIGVwLT5iRW5kcG9pbnRBZGRyZXNzKTsKIAlyZXR1cm4gdXNiX2ludGVycnVwdF9tc2codXNiLCBwaXBlLCBkZXZwcml2LT51c2JfcnhfYnVmLAotCQkJCSBsZTE2X3RvX2NwdShlcC0+d01heFBhY2tldFNpemUpLCBOVUxMLAorCQkJCSB1c2JfZW5kcG9pbnRfbWF4cChlcCksIE5VTEwsCiAJCQkJIEhaICogMTApOwogfQogCkBAIC0yMjAsNyArMjIwLDcgQEAKIAllcCA9IGRldnByaXYtPmVwX3R4OwogCXBpcGUgPSB1c2Jfc25kaW50cGlwZSh1c2IsIGVwLT5iRW5kcG9pbnRBZGRyZXNzKTsKIAlyZXR1cm4gdXNiX2ludGVycnVwdF9tc2codXNiLCBwaXBlLCBkZXZwcml2LT51c2JfdHhfYnVmLAotCQkJCSBsZTE2X3RvX2NwdShlcC0+d01heFBhY2tldFNpemUpLCBOVUxMLAorCQkJCSB1c2JfZW5kcG9pbnRfbWF4cChlcCksIE5VTEwsCiAJCQkJIEhaICogMTApOwogfQogCkBAIC0yMzAsNyArMjMwLDcgQEAKIAlzaXplX3Qgc2l6ZTsKIAlpbnQgcmV0dmFsOwogCi0Jc2l6ZSA9IGxlMTZfdG9fY3B1KGRldnByaXYtPmVwX3R4LT53TWF4UGFja2V0U2l6ZSk7CisJc2l6ZSA9IHVzYl9lbmRwb2ludF9tYXhwKGRldnByaXYtPmVwX3R4KTsKIAltZW1zZXQoZGV2cHJpdi0+dXNiX3R4X2J1ZiwgMCwgc2l6ZSk7CiAJcmV0dmFsID0gdm1rODB4eF93cml0ZV9wYWNrZXQoZGV2LCBWTUs4MDU1X0NNRF9SU1QpOwogCWlmIChyZXR2YWwpCkBAIC02ODQsMTIgKzY4NCwxMiBAQAogCXN0cnVjdCB2bWs4MHh4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJc2l6ZV90IHNpemU7CiAKLQlzaXplID0gbGUxNl90b19jcHUoZGV2cHJpdi0+ZXBfcngtPndNYXhQYWNrZXRTaXplKTsKKwlzaXplID0gdXNiX2VuZHBvaW50X21heHAoZGV2cHJpdi0+ZXBfcngpOwogCWRldnByaXYtPnVzYl9yeF9idWYgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmICghZGV2cHJpdi0+dXNiX3J4X2J1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzaXplID0gbGUxNl90b19jcHUoZGV2cHJpdi0+ZXBfdHgtPndNYXhQYWNrZXRTaXplKTsKKwlzaXplID0gdXNiX2VuZHBvaW50X21heHAoZGV2cHJpdi0+ZXBfdHgpOwogCWRldnByaXYtPnVzYl90eF9idWYgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmICghZGV2cHJpdi0+dXNiX3R4X2J1ZikgewogCQlrZnJlZShkZXZwcml2LT51c2JfcnhfYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfY2xzLmMgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2Nscy5jCmluZGV4IDQ2YzA1MGMuLmFlZGNhNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfY2xzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19jbHMuYwpAQCAtMjYsNTYgKzI2LDYgQEAKICNpbmNsdWRlICJkZ25jX2Nscy5oIgogI2luY2x1ZGUgImRnbmNfdHR5LmgiCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjbHNfcGFyc2VfaXNyKHN0cnVjdCBkZ25jX2JvYXJkICpicmQsIHVpbnQgcG9ydCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgY2xzX2NsZWFyX2JyZWFrKHN0cnVjdCBjaGFubmVsX3QgKmNoLCBpbnQgZm9yY2UpOwotc3RhdGljIGlubGluZSB2b2lkIGNsc19zZXRfY3RzX2Zsb3dfY29udHJvbChzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgY2xzX3NldF9ydHNfZmxvd19jb250cm9sKHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBjbHNfc2V0X2l4b25fZmxvd19jb250cm9sKHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBjbHNfc2V0X2l4b2ZmX2Zsb3dfY29udHJvbChzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgY2xzX3NldF9ub19vdXRwdXRfZmxvd19jb250cm9sKHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBjbHNfc2V0X25vX2lucHV0X2Zsb3dfY29udHJvbChzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci1zdGF0aWMgdm9pZCBjbHNfcGFyc2VfbW9kZW0oc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVuc2lnbmVkIGNoYXIgc2lnbmFscyk7Ci1zdGF0aWMgdm9pZCBjbHNfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgY2xzX3ZwZChzdHJ1Y3QgZGduY19ib2FyZCAqYnJkKTsKLXN0YXRpYyB2b2lkIGNsc191YXJ0X2luaXQoc3RydWN0IGNoYW5uZWxfdCAqY2gpOwotc3RhdGljIHZvaWQgY2xzX3VhcnRfb2ZmKHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLXN0YXRpYyBpbnQgY2xzX2RyYWluKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVpbnQgc2Vjb25kcyk7Ci1zdGF0aWMgdm9pZCBjbHNfcGFyYW0oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdm9pZCBjbHNfYXNzZXJ0X21vZGVtX3NpZ25hbHMoc3RydWN0IGNoYW5uZWxfdCAqY2gpOwotc3RhdGljIHZvaWQgY2xzX2ZsdXNoX3VhcnRfd3JpdGUoc3RydWN0IGNoYW5uZWxfdCAqY2gpOwotc3RhdGljIHZvaWQgY2xzX2ZsdXNoX3VhcnRfcmVhZChzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci1zdGF0aWMgdm9pZCBjbHNfZGlzYWJsZV9yZWNlaXZlcihzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci1zdGF0aWMgdm9pZCBjbHNfZW5hYmxlX3JlY2VpdmVyKHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLXN0YXRpYyB2b2lkIGNsc19zZW5kX2JyZWFrKHN0cnVjdCBjaGFubmVsX3QgKmNoLCBpbnQgbXNlY3MpOwotc3RhdGljIHZvaWQgY2xzX3NlbmRfc3RhcnRfY2hhcmFjdGVyKHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLXN0YXRpYyB2b2lkIGNsc19zZW5kX3N0b3BfY2hhcmFjdGVyKHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLXN0YXRpYyB2b2lkIGNsc19jb3B5X2RhdGFfZnJvbV91YXJ0X3RvX3F1ZXVlKHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLXN0YXRpYyB2b2lkIGNsc19jb3B5X2RhdGFfZnJvbV9xdWV1ZV90b191YXJ0KHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLXN0YXRpYyB1aW50IGNsc19nZXRfdWFydF9ieXRlc19sZWZ0KHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLXN0YXRpYyB2b2lkIGNsc19zZW5kX2ltbWVkaWF0ZV9jaGFyKHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1bnNpZ25lZCBjaGFyKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBjbHNfaW50cihpbnQgaXJxLCB2b2lkICp2b2lkYnJkKTsKLQotc3RydWN0IGJvYXJkX29wcyBkZ25jX2Nsc19vcHMgPSB7Ci0JLnRhc2tsZXQgPQkJCWNsc190YXNrbGV0LAotCS5pbnRyID0JCQkJY2xzX2ludHIsCi0JLnVhcnRfaW5pdCA9CQkJY2xzX3VhcnRfaW5pdCwKLQkudWFydF9vZmYgPQkJCWNsc191YXJ0X29mZiwKLQkuZHJhaW4gPQkJCWNsc19kcmFpbiwKLQkucGFyYW0gPQkJCWNsc19wYXJhbSwKLQkudnBkID0JCQkJY2xzX3ZwZCwKLQkuYXNzZXJ0X21vZGVtX3NpZ25hbHMgPQkJY2xzX2Fzc2VydF9tb2RlbV9zaWduYWxzLAotCS5mbHVzaF91YXJ0X3dyaXRlID0JCWNsc19mbHVzaF91YXJ0X3dyaXRlLAotCS5mbHVzaF91YXJ0X3JlYWQgPQkJY2xzX2ZsdXNoX3VhcnRfcmVhZCwKLQkuZGlzYWJsZV9yZWNlaXZlciA9CQljbHNfZGlzYWJsZV9yZWNlaXZlciwKLQkuZW5hYmxlX3JlY2VpdmVyID0JCWNsc19lbmFibGVfcmVjZWl2ZXIsCi0JLnNlbmRfYnJlYWsgPQkJCWNsc19zZW5kX2JyZWFrLAotCS5zZW5kX3N0YXJ0X2NoYXJhY3RlciA9CQljbHNfc2VuZF9zdGFydF9jaGFyYWN0ZXIsCi0JLnNlbmRfc3RvcF9jaGFyYWN0ZXIgPQkJY2xzX3NlbmRfc3RvcF9jaGFyYWN0ZXIsCi0JLmNvcHlfZGF0YV9mcm9tX3F1ZXVlX3RvX3VhcnQgPSBjbHNfY29weV9kYXRhX2Zyb21fcXVldWVfdG9fdWFydCwKLQkuZ2V0X3VhcnRfYnl0ZXNfbGVmdCA9CQljbHNfZ2V0X3VhcnRfYnl0ZXNfbGVmdCwKLQkuc2VuZF9pbW1lZGlhdGVfY2hhciA9CQljbHNfc2VuZF9pbW1lZGlhdGVfY2hhcgotfTsKLQogc3RhdGljIGlubGluZSB2b2lkIGNsc19zZXRfY3RzX2Zsb3dfY29udHJvbChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKIAl1bnNpZ25lZCBjaGFyIGxjcmIgPSByZWFkYigmY2gtPmNoX2Nsc191YXJ0LT5sY3IpOwpAQCAtMzU3LDYgKzMwNywyNTMgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgdm9pZCBjbHNfY29weV9kYXRhX2Zyb21fdWFydF90b19xdWV1ZShzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKK3sKKwlpbnQgcWxlZnQgPSAwOworCXVuc2lnbmVkIGNoYXIgbGluZXN0YXR1cyA9IDA7CisJdW5zaWduZWQgY2hhciBlcnJvcl9tYXNrID0gMDsKKwl1c2hvcnQgaGVhZDsKKwl1c2hvcnQgdGFpbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdOQ19DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKKworCS8qIGNhY2hlIGhlYWQgYW5kIHRhaWwgb2YgcXVldWUgKi8KKwloZWFkID0gY2gtPmNoX3JfaGVhZDsKKwl0YWlsID0gY2gtPmNoX3JfdGFpbDsKKworCS8qIFN0b3JlIGhvdyBtdWNoIHNwYWNlIHdlIGhhdmUgbGVmdCBpbiB0aGUgcXVldWUgKi8KKwlxbGVmdCA9IHRhaWwgLSBoZWFkIC0gMTsKKwlpZiAocWxlZnQgPCAwKQorCQlxbGVmdCArPSBSUVVFVUVNQVNLICsgMTsKKworCS8qCisJICogQ3JlYXRlIGEgbWFzayB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBzaG91bGQKKwkgKiBpbnNlcnQgdGhlIGNoYXJhY3RlciAoaWYgYW55KSBpbnRvIG91ciBxdWV1ZS4KKwkgKi8KKwlpZiAoY2gtPmNoX2NfaWZsYWcgJiBJR05CUkspCisJCWVycm9yX21hc2sgfD0gVUFSVF9MU1JfQkk7CisKKwl3aGlsZSAoMSkgeworCQlsaW5lc3RhdHVzID0gcmVhZGIoJmNoLT5jaF9jbHNfdWFydC0+bHNyKTsKKworCQlpZiAoIShsaW5lc3RhdHVzICYgKFVBUlRfTFNSX0RSKSkpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBEaXNjYXJkIGNoYXJhY3RlciBpZiB3ZSBhcmUgaWdub3JpbmcgdGhlIGVycm9yIG1hc2suCisJCSAqLworCQlpZiAobGluZXN0YXR1cyAmIGVycm9yX21hc2spICB7CisJCQlsaW5lc3RhdHVzID0gMDsKKwkJCXJlYWRiKCZjaC0+Y2hfY2xzX3VhcnQtPnR4cngpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBJZiBvdXIgcXVldWUgaXMgZnVsbCwgd2UgaGF2ZSBubyBjaG9pY2UgYnV0IHRvIGRyb3Agc29tZQorCQkgKiBkYXRhLiBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IEhXRkxPVyBvciBTV0ZMT1cgc2hvdWxkIGhhdmUKKwkJICogc3RvcHBlZCB0aGluZ3Mgd2F5IHdheSBiZWZvcmUgd2UgZ290IHRvIHRoaXMgcG9pbnQuCisJCSAqCisJCSAqIEkgZGVjaWRlZCB0aGF0IEkgd2FudGVkIHRvIGRpdGNoIHRoZSBvbGRlc3QgZGF0YSBmaXJzdCwKKwkJICogSSBob3BlIHRoYXRzIG9rYXkgd2l0aCBldmVyeW9uZT8gWWVzPyBHb29kLgorCQkgKi8KKwkJd2hpbGUgKHFsZWZ0IDwgMSkgeworCQkJdGFpbCA9ICh0YWlsICsgMSkgJiBSUVVFVUVNQVNLOworCQkJY2gtPmNoX3JfdGFpbCA9IHRhaWw7CisJCQljaC0+Y2hfZXJyX292ZXJydW4rKzsKKwkJCXFsZWZ0Kys7CisJCX0KKworCQljaC0+Y2hfZXF1ZXVlW2hlYWRdID0gbGluZXN0YXR1cyAmIChVQVJUX0xTUl9CSSB8IFVBUlRfTFNSX1BFCisJCQkJCQkJCSB8IFVBUlRfTFNSX0ZFKTsKKwkJY2gtPmNoX3JxdWV1ZVtoZWFkXSA9IHJlYWRiKCZjaC0+Y2hfY2xzX3VhcnQtPnR4cngpOworCisJCXFsZWZ0LS07CisKKwkJaWYgKGNoLT5jaF9lcXVldWVbaGVhZF0gJiBVQVJUX0xTUl9QRSkKKwkJCWNoLT5jaF9lcnJfcGFyaXR5Kys7CisJCWlmIChjaC0+Y2hfZXF1ZXVlW2hlYWRdICYgVUFSVF9MU1JfQkkpCisJCQljaC0+Y2hfZXJyX2JyZWFrKys7CisJCWlmIChjaC0+Y2hfZXF1ZXVlW2hlYWRdICYgVUFSVF9MU1JfRkUpCisJCQljaC0+Y2hfZXJyX2ZyYW1lKys7CisKKwkJLyogQWRkIHRvLCBhbmQgZmxpcCBoZWFkIGlmIG5lZWRlZCAqLworCQloZWFkID0gKGhlYWQgKyAxKSAmIFJRVUVVRU1BU0s7CisJCWNoLT5jaF9yeGNvdW50Kys7CisJfQorCisJLyoKKwkgKiBXcml0ZSBuZXcgZmluYWwgaGVhZHMgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUuCisJICovCisJY2gtPmNoX3JfaGVhZCA9IGhlYWQgJiBSUVVFVUVNQVNLOworCWNoLT5jaF9lX2hlYWQgPSBoZWFkICYgRVFVRVVFTUFTSzsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7Cit9CisKKy8qIE1ha2UgdGhlIFVBUlQgcmFpc2UgYW55IG9mIHRoZSBvdXRwdXQgc2lnbmFscyB3ZSB3YW50IHVwICovCitzdGF0aWMgdm9pZCBjbHNfYXNzZXJ0X21vZGVtX3NpZ25hbHMoc3RydWN0IGNoYW5uZWxfdCAqY2gpCit7CisJdW5zaWduZWQgY2hhciBvdXQ7CisKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER05DX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCW91dCA9IGNoLT5jaF9tb3N0YXQ7CisKKwlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfTE9PUEJBQ0spCisJCW91dCB8PSBVQVJUX01DUl9MT09QOworCisJd3JpdGViKG91dCwgJmNoLT5jaF9jbHNfdWFydC0+bWNyKTsKKworCS8qIEdpdmUgdGltZSBmb3IgdGhlIFVBUlQgdG8gYWN0dWFsbHkgZHJvcCB0aGUgc2lnbmFscyAqLworCXVkZWxheSgxMCk7Cit9CisKK3N0YXRpYyB2b2lkIGNsc19jb3B5X2RhdGFfZnJvbV9xdWV1ZV90b191YXJ0KHN0cnVjdCBjaGFubmVsX3QgKmNoKQoreworCXVzaG9ydCBoZWFkOworCXVzaG9ydCB0YWlsOworCWludCBuOworCWludCBxbGVuOworCXVpbnQgbGVuX3dyaXR0ZW4gPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER05DX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOworCisJLyogTm8gZGF0YSB0byB3cml0ZSB0byB0aGUgVUFSVCAqLworCWlmIChjaC0+Y2hfd190YWlsID09IGNoLT5jaF93X2hlYWQpCisJCWdvdG8gZXhpdF91bmxvY2s7CisKKwkvKiBJZiBwb3J0IGlzICJzdG9wcGVkIiwgZG9uJ3Qgc2VuZCBhbnkgZGF0YSB0byB0aGUgVUFSVCAqLworCWlmICgoY2gtPmNoX2ZsYWdzICYgQ0hfRk9SQ0VEX1NUT1ApIHx8CisJICAgIChjaC0+Y2hfZmxhZ3MgJiBDSF9CUkVBS19TRU5ESU5HKSkKKwkJZ290byBleGl0X3VubG9jazsKKworCWlmICghKGNoLT5jaF9mbGFncyAmIChDSF9UWF9GSUZPX0VNUFRZIHwgQ0hfVFhfRklGT19MV00pKSkKKwkJZ290byBleGl0X3VubG9jazsKKworCW4gPSAzMjsKKworCS8qIGNhY2hlIGhlYWQgYW5kIHRhaWwgb2YgcXVldWUgKi8KKwloZWFkID0gY2gtPmNoX3dfaGVhZCAmIFdRVUVVRU1BU0s7CisJdGFpbCA9IGNoLT5jaF93X3RhaWwgJiBXUVVFVUVNQVNLOworCXFsZW4gPSAoaGVhZCAtIHRhaWwpICYgV1FVRVVFTUFTSzsKKworCS8qIEZpbmQgbWluaW11bSBvZiB0aGUgRklGTyBzcGFjZSwgdmVyc3VzIHF1ZXVlIGxlbmd0aCAqLworCW4gPSBtaW4obiwgcWxlbik7CisKKwl3aGlsZSAobiA+IDApIHsKKwkJLyoKKwkJICogSWYgUlRTIFRvZ2dsZSBtb2RlIGlzIG9uLCB0dXJuIG9uIFJUUyBub3cgaWYgbm90IGFscmVhZHkgc2V0LAorCQkgKiBhbmQgbWFrZSBzdXJlIHdlIGdldCBhbiBldmVudCB3aGVuIHRoZSBkYXRhIHRyYW5zZmVyIGhhcworCQkgKiBjb21wbGV0ZWQuCisJCSAqLworCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfUlRTX1RPR0dMRSkgeworCQkJaWYgKCEoY2gtPmNoX21vc3RhdCAmIFVBUlRfTUNSX1JUUykpIHsKKwkJCQljaC0+Y2hfbW9zdGF0IHw9IChVQVJUX01DUl9SVFMpOworCQkJCWNsc19hc3NlcnRfbW9kZW1fc2lnbmFscyhjaCk7CisJCQl9CisJCQljaC0+Y2hfdHVuLnVuX2ZsYWdzIHw9IChVTl9FTVBUWSk7CisJCX0KKworCQkvKgorCQkgKiBJZiBEVFIgVG9nZ2xlIG1vZGUgaXMgb24sIHR1cm4gb24gRFRSIG5vdyBpZiBub3QgYWxyZWFkeSBzZXQsCisJCSAqIGFuZCBtYWtlIHN1cmUgd2UgZ2V0IGFuIGV2ZW50IHdoZW4gdGhlIGRhdGEgdHJhbnNmZXIgaGFzCisJCSAqIGNvbXBsZXRlZC4KKwkJICovCisJCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9EVFJfVE9HR0xFKSB7CisJCQlpZiAoIShjaC0+Y2hfbW9zdGF0ICYgVUFSVF9NQ1JfRFRSKSkgeworCQkJCWNoLT5jaF9tb3N0YXQgfD0gKFVBUlRfTUNSX0RUUik7CisJCQkJY2xzX2Fzc2VydF9tb2RlbV9zaWduYWxzKGNoKTsKKwkJCX0KKwkJCWNoLT5jaF90dW4udW5fZmxhZ3MgfD0gKFVOX0VNUFRZKTsKKwkJfQorCQl3cml0ZWIoY2gtPmNoX3dxdWV1ZVtjaC0+Y2hfd190YWlsXSwgJmNoLT5jaF9jbHNfdWFydC0+dHhyeCk7CisJCWNoLT5jaF93X3RhaWwrKzsKKwkJY2gtPmNoX3dfdGFpbCAmPSBXUVVFVUVNQVNLOworCQljaC0+Y2hfdHhjb3VudCsrOworCQlsZW5fd3JpdHRlbisrOworCQluLS07CisJfQorCisJaWYgKGxlbl93cml0dGVuID4gMCkKKwkJY2gtPmNoX2ZsYWdzICY9IH4oQ0hfVFhfRklGT19FTVBUWSB8IENIX1RYX0ZJRk9fTFdNKTsKKworZXhpdF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgY2xzX3BhcnNlX21vZGVtKHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1bnNpZ25lZCBjaGFyIHNpZ25hbHMpCit7CisJdW5zaWduZWQgY2hhciBtc2lnbmFscyA9IHNpZ25hbHM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHTkNfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBEbyBhbHRwaW4gc3dpdGNoaW5nLiBBbHRwaW4gc3dpdGNoZXMgRENEIGFuZCBEU1IuCisJICogVGhpcyBwcm9sbHkgYnJlYWtzIERTUlBBQ0UsIHNvIHdlIHNob3VsZCBiZSBtb3JlIGNsZXZlciBoZXJlLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9BTFRQSU4pIHsKKwkJdW5zaWduZWQgY2hhciBtc3dhcCA9IHNpZ25hbHM7CisKKwkJaWYgKG1zd2FwICYgVUFSVF9NU1JfRERDRCkgeworCQkJbXNpZ25hbHMgJj0gflVBUlRfTVNSX0REQ0Q7CisJCQltc2lnbmFscyB8PSBVQVJUX01TUl9ERFNSOworCQl9CisJCWlmIChtc3dhcCAmIFVBUlRfTVNSX0REU1IpIHsKKwkJCW1zaWduYWxzICY9IH5VQVJUX01TUl9ERFNSOworCQkJbXNpZ25hbHMgfD0gVUFSVF9NU1JfRERDRDsKKwkJfQorCQlpZiAobXN3YXAgJiBVQVJUX01TUl9EQ0QpIHsKKwkJCW1zaWduYWxzICY9IH5VQVJUX01TUl9EQ0Q7CisJCQltc2lnbmFscyB8PSBVQVJUX01TUl9EU1I7CisJCX0KKwkJaWYgKG1zd2FwICYgVUFSVF9NU1JfRFNSKSB7CisJCQltc2lnbmFscyAmPSB+VUFSVF9NU1JfRFNSOworCQkJbXNpZ25hbHMgfD0gVUFSVF9NU1JfRENEOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFNjcnViIG9mZiBsb3dlciBiaXRzLiBUaGV5IHNpZ25pZnkgZGVsdGEncywgd2hpY2ggSSBkb24ndAorCSAqIGNhcmUgYWJvdXQKKwkgKi8KKwlzaWduYWxzICY9IDB4ZjA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKKwlpZiAobXNpZ25hbHMgJiBVQVJUX01TUl9EQ0QpCisJCWNoLT5jaF9taXN0YXQgfD0gVUFSVF9NU1JfRENEOworCWVsc2UKKwkJY2gtPmNoX21pc3RhdCAmPSB+VUFSVF9NU1JfRENEOworCisJaWYgKG1zaWduYWxzICYgVUFSVF9NU1JfRFNSKQorCQljaC0+Y2hfbWlzdGF0IHw9IFVBUlRfTVNSX0RTUjsKKwllbHNlCisJCWNoLT5jaF9taXN0YXQgJj0gflVBUlRfTVNSX0RTUjsKKworCWlmIChtc2lnbmFscyAmIFVBUlRfTVNSX1JJKQorCQljaC0+Y2hfbWlzdGF0IHw9IFVBUlRfTVNSX1JJOworCWVsc2UKKwkJY2gtPmNoX21pc3RhdCAmPSB+VUFSVF9NU1JfUkk7CisKKwlpZiAobXNpZ25hbHMgJiBVQVJUX01TUl9DVFMpCisJCWNoLT5jaF9taXN0YXQgfD0gVUFSVF9NU1JfQ1RTOworCWVsc2UKKwkJY2gtPmNoX21pc3RhdCAmPSB+VUFSVF9NU1JfQ1RTOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7Cit9CisKIC8qIFBhcnNlIHRoZSBJU1IgcmVnaXN0ZXIgZm9yIHRoZSBzcGVjaWZpYyBwb3J0ICovCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xzX3BhcnNlX2lzcihzdHJ1Y3QgZGduY19ib2FyZCAqYnJkLCB1aW50IHBvcnQpCiB7CkBAIC0zODcsOCArNTg0LDYgQEAKIAkJLyogUmVjZWl2ZSBJbnRlcnJ1cHQgcGVuZGluZyAqLwogCQlpZiAoaXNyICYgKFVBUlRfSUlSX1JESSB8IFVBUlRfSUlSX1JESV9USU1FT1VUKSkgewogCQkJLyogUmVhZCBkYXRhIGZyb20gdWFydCAtPiBxdWV1ZSAqLwotCQkJYnJkLT5pbnRyX3J4Kys7Ci0JCQljaC0+Y2hfaW50cl9yeCsrOwogCQkJY2xzX2NvcHlfZGF0YV9mcm9tX3VhcnRfdG9fcXVldWUoY2gpOwogCQkJZGduY19jaGVja19xdWV1ZV9mbG93X2NvbnRyb2woY2gpOwogCQl9CkBAIC0zOTgsMjcgKzU5Myw0OCBAQAogCQkJLyogVHJhbnNmZXIgZGF0YSAoaWYgYW55KSBmcm9tIFdyaXRlIFF1ZXVlIC0+IFVBUlQuICovCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKIAkJCWNoLT5jaF9mbGFncyB8PSAoQ0hfVFhfRklGT19FTVBUWSB8IENIX1RYX0ZJRk9fTFdNKTsKLQkJCWJyZC0+aW50cl90eCsrOwotCQkJY2gtPmNoX2ludHJfdHgrKzsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CiAJCQljbHNfY29weV9kYXRhX2Zyb21fcXVldWVfdG9fdWFydChjaCk7CiAJCX0KIAotCQkvKiBDVFMvUlRTIGNoYW5nZSBvZiBzdGF0ZSAqLwotCQlpZiAoaXNyICYgVUFSVF9JSVJfQ1RTUlRTKSB7Ci0JCQlicmQtPmludHJfbW9kZW0rKzsKLQkJCWNoLT5jaF9pbnRyX21vZGVtKys7Ci0JCQkvKgotCQkJICogRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZywgdGhlIGNsc19wYXJzZV9tb2RlbQotCQkJICogYmVsb3cgd2lsbCBncmFiIHRoZSB1cGRhdGVkIG1vZGVtIHNpZ25hbHMuCi0JCQkgKi8KLQkJfQotCiAJCS8qIFBhcnNlIGFueSBtb2RlbSBzaWduYWwgY2hhbmdlcyAqLwogCQljbHNfcGFyc2VfbW9kZW0oY2gsIHJlYWRiKCZjaC0+Y2hfY2xzX3VhcnQtPm1zcikpOwogCX0KIH0KIAorLyogQ2hhbm5lbCBsb2NrIE1VU1QgYmUgaGVsZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uISAqLworc3RhdGljIHZvaWQgY2xzX2ZsdXNoX3VhcnRfd3JpdGUoc3RydWN0IGNoYW5uZWxfdCAqY2gpCit7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdOQ19DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwl3cml0ZWIoKFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCksCisJICAgICAgICZjaC0+Y2hfY2xzX3VhcnQtPmlzcl9mY3IpOworCXVzbGVlcF9yYW5nZSgxMCwgMjApOworCisJY2gtPmNoX2ZsYWdzIHw9IChDSF9UWF9GSUZPX0VNUFRZIHwgQ0hfVFhfRklGT19MV00pOworfQorCisvKiBDaGFubmVsIGxvY2sgTVVTVCBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24hICovCitzdGF0aWMgdm9pZCBjbHNfZmx1c2hfdWFydF9yZWFkKHN0cnVjdCBjaGFubmVsX3QgKmNoKQoreworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHTkNfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBGb3IgY29tcGxldGUgUE9TSVggY29tcGF0aWJpbGl0eSwgd2Ugc2hvdWxkIGJlIHB1cmdpbmcgdGhlCisJICogcmVhZCBGSUZPIGluIHRoZSBVQVJUIGhlcmUuCisJICoKKwkgKiBIb3dldmVyLCBjbGVhcmluZyB0aGUgcmVhZCBGSUZPIChVQVJUX0ZDUl9DTEVBUl9SQ1ZSKSBhbHNvCisJICogaW5jb3JyZWN0bHkgZmx1c2hlcyB3cml0ZSBkYXRhIGFzIHdlbGwgYXMganVzdCBiYXNpY2FsbHkgdHJhc2hpbmcgdGhlCisJICogRklGTy4KKwkgKgorCSAqIFByZXN1bWFibHksIHRoaXMgaXMgYSBidWcgaW4gdGhpcyBVQVJULgorCSAqLworCisJdWRlbGF5KDEwKTsKK30KKwogLyoKICAqIGNsc19wYXJhbSgpCiAgKiBTZW5kIGFueS9hbGwgY2hhbmdlcyB0byB0aGUgbGluZSB0byB0aGUgVUFSVC4KQEAgLTc2MCw4ICs5NzYsNiBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJyZC0+YmRfaW50cl9sb2NrLCBmbGFncyk7CiAKLQlicmQtPmludHJfY291bnQrKzsKLQogCS8qCiAJICogQ2hlY2sgdGhlIGJvYXJkJ3MgZ2xvYmFsIGludGVycnVwdCBvZmZzZXQgdG8gc2VlIGlmIHdlCiAJICogd2UgYWN0dWFsbHkgZG8gaGF2ZSBhbiBpbnRlcnJ1cHQgcGVuZGluZyBmb3IgdXMuCkBAIC04MDQsOTMgKzEwMTgsNiBAQAogCXdyaXRlYih0bXAsICZjaC0+Y2hfY2xzX3VhcnQtPmllcik7CiB9CiAKLXN0YXRpYyB2b2lkIGNsc19jb3B5X2RhdGFfZnJvbV91YXJ0X3RvX3F1ZXVlKHN0cnVjdCBjaGFubmVsX3QgKmNoKQotewotCWludCBxbGVmdCA9IDA7Ci0JdW5zaWduZWQgY2hhciBsaW5lc3RhdHVzID0gMDsKLQl1bnNpZ25lZCBjaGFyIGVycm9yX21hc2sgPSAwOwotCXVzaG9ydCBoZWFkOwotCXVzaG9ydCB0YWlsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER05DX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotCi0JLyogY2FjaGUgaGVhZCBhbmQgdGFpbCBvZiBxdWV1ZSAqLwotCWhlYWQgPSBjaC0+Y2hfcl9oZWFkOwotCXRhaWwgPSBjaC0+Y2hfcl90YWlsOwotCi0JLyogU3RvcmUgaG93IG11Y2ggc3BhY2Ugd2UgaGF2ZSBsZWZ0IGluIHRoZSBxdWV1ZSAqLwotCXFsZWZ0ID0gdGFpbCAtIGhlYWQgLSAxOwotCWlmIChxbGVmdCA8IDApCi0JCXFsZWZ0ICs9IFJRVUVVRU1BU0sgKyAxOwotCi0JLyoKLQkgKiBDcmVhdGUgYSBtYXNrIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIHNob3VsZAotCSAqIGluc2VydCB0aGUgY2hhcmFjdGVyIChpZiBhbnkpIGludG8gb3VyIHF1ZXVlLgotCSAqLwotCWlmIChjaC0+Y2hfY19pZmxhZyAmIElHTkJSSykKLQkJZXJyb3JfbWFzayB8PSBVQVJUX0xTUl9CSTsKLQotCXdoaWxlICgxKSB7Ci0JCWxpbmVzdGF0dXMgPSByZWFkYigmY2gtPmNoX2Nsc191YXJ0LT5sc3IpOwotCi0JCWlmICghKGxpbmVzdGF0dXMgJiAoVUFSVF9MU1JfRFIpKSkKLQkJCWJyZWFrOwotCi0JCS8qCi0JCSAqIERpc2NhcmQgY2hhcmFjdGVyIGlmIHdlIGFyZSBpZ25vcmluZyB0aGUgZXJyb3IgbWFzay4KLQkJKi8KLQkJaWYgKGxpbmVzdGF0dXMgJiBlcnJvcl9tYXNrKSAgewotCQkJbGluZXN0YXR1cyA9IDA7Ci0JCQlyZWFkYigmY2gtPmNoX2Nsc191YXJ0LT50eHJ4KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyoKLQkJICogSWYgb3VyIHF1ZXVlIGlzIGZ1bGwsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBkcm9wIHNvbWUKLQkJICogZGF0YS4gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCBIV0ZMT1cgb3IgU1dGTE9XIHNob3VsZCBoYXZlCi0JCSAqIHN0b3BwZWQgdGhpbmdzIHdheSB3YXkgYmVmb3JlIHdlIGdvdCB0byB0aGlzIHBvaW50LgotCQkgKgotCQkgKiBJIGRlY2lkZWQgdGhhdCBJIHdhbnRlZCB0byBkaXRjaCB0aGUgb2xkZXN0IGRhdGEgZmlyc3QsCi0JCSAqIEkgaG9wZSB0aGF0cyBva2F5IHdpdGggZXZlcnlvbmU/IFllcz8gR29vZC4KLQkJICovCi0JCXdoaWxlIChxbGVmdCA8IDEpIHsKLQkJCXRhaWwgPSAodGFpbCArIDEpICYgUlFVRVVFTUFTSzsKLQkJCWNoLT5jaF9yX3RhaWwgPSB0YWlsOwotCQkJY2gtPmNoX2Vycl9vdmVycnVuKys7Ci0JCQlxbGVmdCsrOwotCQl9Ci0KLQkJY2gtPmNoX2VxdWV1ZVtoZWFkXSA9IGxpbmVzdGF0dXMgJiAoVUFSVF9MU1JfQkkgfCBVQVJUX0xTUl9QRQotCQkJCQkJCQkgfCBVQVJUX0xTUl9GRSk7Ci0JCWNoLT5jaF9ycXVldWVbaGVhZF0gPSByZWFkYigmY2gtPmNoX2Nsc191YXJ0LT50eHJ4KTsKLQotCQlxbGVmdC0tOwotCi0JCWlmIChjaC0+Y2hfZXF1ZXVlW2hlYWRdICYgVUFSVF9MU1JfUEUpCi0JCQljaC0+Y2hfZXJyX3Bhcml0eSsrOwotCQlpZiAoY2gtPmNoX2VxdWV1ZVtoZWFkXSAmIFVBUlRfTFNSX0JJKQotCQkJY2gtPmNoX2Vycl9icmVhaysrOwotCQlpZiAoY2gtPmNoX2VxdWV1ZVtoZWFkXSAmIFVBUlRfTFNSX0ZFKQotCQkJY2gtPmNoX2Vycl9mcmFtZSsrOwotCi0JCS8qIEFkZCB0bywgYW5kIGZsaXAgaGVhZCBpZiBuZWVkZWQgKi8KLQkJaGVhZCA9IChoZWFkICsgMSkgJiBSUVVFVUVNQVNLOwotCQljaC0+Y2hfcnhjb3VudCsrOwotCX0KLQotCS8qCi0JICogV3JpdGUgbmV3IGZpbmFsIGhlYWRzIHRvIGNoYW5uZWwgc3RydWN0dXJlLgotCSAqLwotCWNoLT5jaF9yX2hlYWQgPSBoZWFkICYgUlFVRVVFTUFTSzsKLQljaC0+Y2hfZV9oZWFkID0gaGVhZCAmIEVRVUVVRU1BU0s7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotfQotCiAvKgogICogVGhpcyBmdW5jdGlvbiBiYXNpY2FsbHkgZ29lcyB0byBzbGVlcCBmb3Igc2Vjcywgb3IgdW50aWwKICAqIGl0IGdldHMgc2lnbmFsbGVkIHRoYXQgdGhlIHBvcnQgaGFzIGZ1bGx5IGRyYWluZWQuCkBAIC05MjYsMTk5ICsxMDUzLDYgQEAKIAkJCQkJICgodW4tPnVuX2ZsYWdzICYgVU5fRU1QVFkpID09IDApKTsKIH0KIAotLyogQ2hhbm5lbCBsb2NrIE1VU1QgYmUgaGVsZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uISAqLwotc3RhdGljIHZvaWQgY2xzX2ZsdXNoX3VhcnRfd3JpdGUoc3RydWN0IGNoYW5uZWxfdCAqY2gpCi17Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdOQ19DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQl3cml0ZWIoKFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCksCi0JICAgICAgICZjaC0+Y2hfY2xzX3VhcnQtPmlzcl9mY3IpOwotCXVzbGVlcF9yYW5nZSgxMCwgMjApOwotCi0JY2gtPmNoX2ZsYWdzIHw9IChDSF9UWF9GSUZPX0VNUFRZIHwgQ0hfVFhfRklGT19MV00pOwotfQotCi0vKiBDaGFubmVsIGxvY2sgTVVTVCBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24hICovCi1zdGF0aWMgdm9pZCBjbHNfZmx1c2hfdWFydF9yZWFkKHN0cnVjdCBjaGFubmVsX3QgKmNoKQotewotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHTkNfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBGb3IgY29tcGxldGUgUE9TSVggY29tcGF0aWJpbGl0eSwgd2Ugc2hvdWxkIGJlIHB1cmdpbmcgdGhlCi0JICogcmVhZCBGSUZPIGluIHRoZSBVQVJUIGhlcmUuCi0JICoKLQkgKiBIb3dldmVyLCBjbGVhcmluZyB0aGUgcmVhZCBGSUZPIChVQVJUX0ZDUl9DTEVBUl9SQ1ZSKSBhbHNvCi0JICogaW5jb3JyZWN0bHkgZmx1c2hlcyB3cml0ZSBkYXRhIGFzIHdlbGwgYXMganVzdCBiYXNpY2FsbHkgdHJhc2hpbmcgdGhlCi0JICogRklGTy4KLQkgKgotCSAqIFByZXN1bWFibHksIHRoaXMgaXMgYSBidWcgaW4gdGhpcyBVQVJULgotCSAqLwotCi0JdWRlbGF5KDEwKTsKLX0KLQotc3RhdGljIHZvaWQgY2xzX2NvcHlfZGF0YV9mcm9tX3F1ZXVlX3RvX3VhcnQoc3RydWN0IGNoYW5uZWxfdCAqY2gpCi17Ci0JdXNob3J0IGhlYWQ7Ci0JdXNob3J0IHRhaWw7Ci0JaW50IG47Ci0JaW50IHFsZW47Ci0JdWludCBsZW5fd3JpdHRlbiA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHTkNfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7Ci0KLQkvKiBObyBkYXRhIHRvIHdyaXRlIHRvIHRoZSBVQVJUICovCi0JaWYgKGNoLT5jaF93X3RhaWwgPT0gY2gtPmNoX3dfaGVhZCkKLQkJZ290byBleGl0X3VubG9jazsKLQotCS8qIElmIHBvcnQgaXMgInN0b3BwZWQiLCBkb24ndCBzZW5kIGFueSBkYXRhIHRvIHRoZSBVQVJUICovCi0JaWYgKChjaC0+Y2hfZmxhZ3MgJiBDSF9GT1JDRURfU1RPUCkgfHwKLQkgICAgKGNoLT5jaF9mbGFncyAmIENIX0JSRUFLX1NFTkRJTkcpKQotCQlnb3RvIGV4aXRfdW5sb2NrOwotCi0JaWYgKCEoY2gtPmNoX2ZsYWdzICYgKENIX1RYX0ZJRk9fRU1QVFkgfCBDSF9UWF9GSUZPX0xXTSkpKQotCQlnb3RvIGV4aXRfdW5sb2NrOwotCi0JbiA9IDMyOwotCi0JLyogY2FjaGUgaGVhZCBhbmQgdGFpbCBvZiBxdWV1ZSAqLwotCWhlYWQgPSBjaC0+Y2hfd19oZWFkICYgV1FVRVVFTUFTSzsKLQl0YWlsID0gY2gtPmNoX3dfdGFpbCAmIFdRVUVVRU1BU0s7Ci0JcWxlbiA9IChoZWFkIC0gdGFpbCkgJiBXUVVFVUVNQVNLOwotCi0JLyogRmluZCBtaW5pbXVtIG9mIHRoZSBGSUZPIHNwYWNlLCB2ZXJzdXMgcXVldWUgbGVuZ3RoICovCi0JbiA9IG1pbihuLCBxbGVuKTsKLQotCXdoaWxlIChuID4gMCkgewotCQkvKgotCQkgKiBJZiBSVFMgVG9nZ2xlIG1vZGUgaXMgb24sIHR1cm4gb24gUlRTIG5vdyBpZiBub3QgYWxyZWFkeSBzZXQsCi0JCSAqIGFuZCBtYWtlIHN1cmUgd2UgZ2V0IGFuIGV2ZW50IHdoZW4gdGhlIGRhdGEgdHJhbnNmZXIgaGFzCi0JCSAqIGNvbXBsZXRlZC4KLQkJICovCi0JCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9SVFNfVE9HR0xFKSB7Ci0JCQlpZiAoIShjaC0+Y2hfbW9zdGF0ICYgVUFSVF9NQ1JfUlRTKSkgewotCQkJCWNoLT5jaF9tb3N0YXQgfD0gKFVBUlRfTUNSX1JUUyk7Ci0JCQkJY2xzX2Fzc2VydF9tb2RlbV9zaWduYWxzKGNoKTsKLQkJCX0KLQkJCWNoLT5jaF90dW4udW5fZmxhZ3MgfD0gKFVOX0VNUFRZKTsKLQkJfQotCi0JCS8qCi0JCSAqIElmIERUUiBUb2dnbGUgbW9kZSBpcyBvbiwgdHVybiBvbiBEVFIgbm93IGlmIG5vdCBhbHJlYWR5IHNldCwKLQkJICogYW5kIG1ha2Ugc3VyZSB3ZSBnZXQgYW4gZXZlbnQgd2hlbiB0aGUgZGF0YSB0cmFuc2ZlciBoYXMKLQkJICogY29tcGxldGVkLgotCQkgKi8KLQkJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX0RUUl9UT0dHTEUpIHsKLQkJCWlmICghKGNoLT5jaF9tb3N0YXQgJiBVQVJUX01DUl9EVFIpKSB7Ci0JCQkJY2gtPmNoX21vc3RhdCB8PSAoVUFSVF9NQ1JfRFRSKTsKLQkJCQljbHNfYXNzZXJ0X21vZGVtX3NpZ25hbHMoY2gpOwotCQkJfQotCQkJY2gtPmNoX3R1bi51bl9mbGFncyB8PSAoVU5fRU1QVFkpOwotCQl9Ci0JCXdyaXRlYihjaC0+Y2hfd3F1ZXVlW2NoLT5jaF93X3RhaWxdLCAmY2gtPmNoX2Nsc191YXJ0LT50eHJ4KTsKLQkJY2gtPmNoX3dfdGFpbCsrOwotCQljaC0+Y2hfd190YWlsICY9IFdRVUVVRU1BU0s7Ci0JCWNoLT5jaF90eGNvdW50Kys7Ci0JCWxlbl93cml0dGVuKys7Ci0JCW4tLTsKLQl9Ci0KLQlpZiAobGVuX3dyaXR0ZW4gPiAwKQotCQljaC0+Y2hfZmxhZ3MgJj0gfihDSF9UWF9GSUZPX0VNUFRZIHwgQ0hfVFhfRklGT19MV00pOwotCi1leGl0X3VubG9jazoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBjbHNfcGFyc2VfbW9kZW0oc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVuc2lnbmVkIGNoYXIgc2lnbmFscykKLXsKLQl1bnNpZ25lZCBjaGFyIG1zaWduYWxzID0gc2lnbmFsczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdOQ19DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIERvIGFsdHBpbiBzd2l0Y2hpbmcuIEFsdHBpbiBzd2l0Y2hlcyBEQ0QgYW5kIERTUi4KLQkgKiBUaGlzIHByb2xseSBicmVha3MgRFNSUEFDRSwgc28gd2Ugc2hvdWxkIGJlIG1vcmUgY2xldmVyIGhlcmUuCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7Ci0JaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX0FMVFBJTikgewotCQl1bnNpZ25lZCBjaGFyIG1zd2FwID0gc2lnbmFsczsKLQotCQlpZiAobXN3YXAgJiBVQVJUX01TUl9ERENEKSB7Ci0JCQltc2lnbmFscyAmPSB+VUFSVF9NU1JfRERDRDsKLQkJCW1zaWduYWxzIHw9IFVBUlRfTVNSX0REU1I7Ci0JCX0KLQkJaWYgKG1zd2FwICYgVUFSVF9NU1JfRERTUikgewotCQkJbXNpZ25hbHMgJj0gflVBUlRfTVNSX0REU1I7Ci0JCQltc2lnbmFscyB8PSBVQVJUX01TUl9ERENEOwotCQl9Ci0JCWlmIChtc3dhcCAmIFVBUlRfTVNSX0RDRCkgewotCQkJbXNpZ25hbHMgJj0gflVBUlRfTVNSX0RDRDsKLQkJCW1zaWduYWxzIHw9IFVBUlRfTVNSX0RTUjsKLQkJfQotCQlpZiAobXN3YXAgJiBVQVJUX01TUl9EU1IpIHsKLQkJCW1zaWduYWxzICY9IH5VQVJUX01TUl9EU1I7Ci0JCQltc2lnbmFscyB8PSBVQVJUX01TUl9EQ0Q7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKLQotCS8qCi0JICogU2NydWIgb2ZmIGxvd2VyIGJpdHMuIFRoZXkgc2lnbmlmeSBkZWx0YSdzLCB3aGljaCBJIGRvbid0Ci0JICogY2FyZSBhYm91dAotCSAqLwotCXNpZ25hbHMgJj0gMHhmMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotCWlmIChtc2lnbmFscyAmIFVBUlRfTVNSX0RDRCkKLQkJY2gtPmNoX21pc3RhdCB8PSBVQVJUX01TUl9EQ0Q7Ci0JZWxzZQotCQljaC0+Y2hfbWlzdGF0ICY9IH5VQVJUX01TUl9EQ0Q7Ci0KLQlpZiAobXNpZ25hbHMgJiBVQVJUX01TUl9EU1IpCi0JCWNoLT5jaF9taXN0YXQgfD0gVUFSVF9NU1JfRFNSOwotCWVsc2UKLQkJY2gtPmNoX21pc3RhdCAmPSB+VUFSVF9NU1JfRFNSOwotCi0JaWYgKG1zaWduYWxzICYgVUFSVF9NU1JfUkkpCi0JCWNoLT5jaF9taXN0YXQgfD0gVUFSVF9NU1JfUkk7Ci0JZWxzZQotCQljaC0+Y2hfbWlzdGF0ICY9IH5VQVJUX01TUl9SSTsKLQotCWlmIChtc2lnbmFscyAmIFVBUlRfTVNSX0NUUykKLQkJY2gtPmNoX21pc3RhdCB8PSBVQVJUX01TUl9DVFM7Ci0JZWxzZQotCQljaC0+Y2hfbWlzdGF0ICY9IH5VQVJUX01TUl9DVFM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKLX0KLQotLyogTWFrZSB0aGUgVUFSVCByYWlzZSBhbnkgb2YgdGhlIG91dHB1dCBzaWduYWxzIHdlIHdhbnQgdXAgKi8KLXN0YXRpYyB2b2lkIGNsc19hc3NlcnRfbW9kZW1fc2lnbmFscyhzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKLXsKLQl1bnNpZ25lZCBjaGFyIG91dDsKLQotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHTkNfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuOwotCi0Jb3V0ID0gY2gtPmNoX21vc3RhdDsKLQotCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9MT09QQkFDSykKLQkJb3V0IHw9IFVBUlRfTUNSX0xPT1A7Ci0KLQl3cml0ZWIob3V0LCAmY2gtPmNoX2Nsc191YXJ0LT5tY3IpOwotCi0JLyogR2l2ZSB0aW1lIGZvciB0aGUgVUFSVCB0byBhY3R1YWxseSBkcm9wIHRoZSBzaWduYWxzICovCi0JdWRlbGF5KDEwKTsKLX0KLQogc3RhdGljIHZvaWQgY2xzX3NlbmRfc3RhcnRfY2hhcmFjdGVyKHN0cnVjdCBjaGFubmVsX3QgKmNoKQogewogCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHTkNfQ0hBTk5FTF9NQUdJQykKQEAgLTEyOTgsMyArMTIzMiwyNCBAQAogCiAJaW91bm1hcChyZV9tYXBfdnBkYmFzZSk7CiB9CisKK3N0cnVjdCBib2FyZF9vcHMgZGduY19jbHNfb3BzID0geworCS50YXNrbGV0ID0JCQljbHNfdGFza2xldCwKKwkuaW50ciA9CQkJCWNsc19pbnRyLAorCS51YXJ0X2luaXQgPQkJCWNsc191YXJ0X2luaXQsCisJLnVhcnRfb2ZmID0JCQljbHNfdWFydF9vZmYsCisJLmRyYWluID0JCQljbHNfZHJhaW4sCisJLnBhcmFtID0JCQljbHNfcGFyYW0sCisJLnZwZCA9CQkJCWNsc192cGQsCisJLmFzc2VydF9tb2RlbV9zaWduYWxzID0JCWNsc19hc3NlcnRfbW9kZW1fc2lnbmFscywKKwkuZmx1c2hfdWFydF93cml0ZSA9CQljbHNfZmx1c2hfdWFydF93cml0ZSwKKwkuZmx1c2hfdWFydF9yZWFkID0JCWNsc19mbHVzaF91YXJ0X3JlYWQsCisJLmRpc2FibGVfcmVjZWl2ZXIgPQkJY2xzX2Rpc2FibGVfcmVjZWl2ZXIsCisJLmVuYWJsZV9yZWNlaXZlciA9CQljbHNfZW5hYmxlX3JlY2VpdmVyLAorCS5zZW5kX2JyZWFrID0JCQljbHNfc2VuZF9icmVhaywKKwkuc2VuZF9zdGFydF9jaGFyYWN0ZXIgPQkJY2xzX3NlbmRfc3RhcnRfY2hhcmFjdGVyLAorCS5zZW5kX3N0b3BfY2hhcmFjdGVyID0JCWNsc19zZW5kX3N0b3BfY2hhcmFjdGVyLAorCS5jb3B5X2RhdGFfZnJvbV9xdWV1ZV90b191YXJ0ID0gY2xzX2NvcHlfZGF0YV9mcm9tX3F1ZXVlX3RvX3VhcnQsCisJLmdldF91YXJ0X2J5dGVzX2xlZnQgPQkJY2xzX2dldF91YXJ0X2J5dGVzX2xlZnQsCisJLnNlbmRfaW1tZWRpYXRlX2NoYXIgPQkJY2xzX3NlbmRfaW1tZWRpYXRlX2NoYXIKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2RyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19kcml2ZXIuYwppbmRleCBhZjJlODM1Li5mZDM3MmQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfZHJpdmVyLmMKQEAgLTM3LDEzICszNywxNCBAQAogICoKICAqLwogc3RhdGljIGludAkJZGduY19zdGFydCh2b2lkKTsKLXN0YXRpYyBpbnQJCWRnbmNfZmluYWxpemVfYm9hcmRfaW5pdChzdHJ1Y3QgZGduY19ib2FyZCAqYnJkKTsKLXN0YXRpYyBpbnQJCWRnbmNfZm91bmRfYm9hcmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBpZCk7CitzdGF0aWMgaW50IGRnbmNfcmVxdWVzdF9pcnEoc3RydWN0IGRnbmNfYm9hcmQgKmJyZCk7CitzdGF0aWMgdm9pZCBkZ25jX2ZyZWVfaXJxKHN0cnVjdCBkZ25jX2JvYXJkICpicmQpOworc3RhdGljIHN0cnVjdCBkZ25jX2JvYXJkICpkZ25jX2ZvdW5kX2JvYXJkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgaWQpOwogc3RhdGljIHZvaWQJCWRnbmNfY2xlYW51cF9ib2FyZChzdHJ1Y3QgZGduY19ib2FyZCAqYnJkKTsKIHN0YXRpYyB2b2lkCQlkZ25jX3BvbGxfaGFuZGxlcih1bG9uZyBkdW1teSk7CiBzdGF0aWMgaW50CQlkZ25jX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwotc3RhdGljIHZvaWQJCWRnbmNfZG9fcmVtYXAoc3RydWN0IGRnbmNfYm9hcmQgKmJyZCk7CitzdGF0aWMgaW50CQlkZ25jX2RvX3JlbWFwKHN0cnVjdCBkZ25jX2JvYXJkICpicmQpOwogCiAvKgogICogRmlsZSBvcGVyYXRpb25zIHBlcm1pdHRlZCBvbiBDb250cm9sL01hbmFnZW1lbnQgbWFqb3IuCkBAIC0xNDYsNyArMTQ3LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBkZ25jX251bV9ib2FyZHM7ICsraSkgewogCQlkZ25jX3JlbW92ZV9wb3J0c19zeXNmaWxlcyhkZ25jX2JvYXJkW2ldKTsKLQkJZGduY190dHlfdW5pbml0KGRnbmNfYm9hcmRbaV0pOworCQlkZ25jX2NsZWFudXBfdHR5KGRnbmNfYm9hcmRbaV0pOwogCQlkZ25jX2NsZWFudXBfYm9hcmQoZGduY19ib2FyZFtpXSk7CiAJfQogCkBAIC0xNTgsNyArMTU5LDcgQEAKICAqCiAgKiBNb2R1bGUgdW5sb2FkLiAgVGhpcyBpcyB3aGVyZSBpdCBhbGwgZW5kcy4KICAqLwotc3RhdGljIHZvaWQgZGduY19jbGVhbnVwX21vZHVsZSh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGRnbmNfY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAljbGVhbnVwKHRydWUpOwogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZGduY19kcml2ZXIpOwpAQCAtMjc0LDYgKzI3NSw3IEBACiBzdGF0aWMgaW50IGRnbmNfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJaW50IHJjOworCXN0cnVjdCBkZ25jX2JvYXJkICpicmQ7CiAKIAkvKiB3YWtlIHVwIGFuZCBlbmFibGUgZGV2aWNlICovCiAJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKQEAgLTI4MSw5ICsyODMsNDggQEAKIAlpZiAocmMpCiAJCXJldHVybiAtRUlPOwogCi0JcmMgPSBkZ25jX2ZvdW5kX2JvYXJkKHBkZXYsIGVudC0+ZHJpdmVyX2RhdGEpOwotCWlmIChyYyA9PSAwKQotCQlkZ25jX251bV9ib2FyZHMrKzsKKwlicmQgPSBkZ25jX2ZvdW5kX2JvYXJkKHBkZXYsIGVudC0+ZHJpdmVyX2RhdGEpOworCWlmIChJU19FUlIoYnJkKSkKKwkJcmV0dXJuIFBUUl9FUlIoYnJkKTsKKworCS8qCisJICogRG8gdHR5IGRldmljZSBpbml0aWFsaXphdGlvbi4KKwkgKi8KKworCXJjID0gZGduY190dHlfcmVnaXN0ZXIoYnJkKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycihEUlZTVFIgIjogQ2FuJ3QgcmVnaXN0ZXIgdHR5IGRldmljZXMgKCVkKVxuIiwgcmMpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlyYyA9IGRnbmNfcmVxdWVzdF9pcnEoYnJkKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycihEUlZTVFIgIjogQ2FuJ3QgZmluYWxpemUgYm9hcmQgaW5pdCAoJWQpXG4iLCByYyk7CisJCWdvdG8gdW5yZWdpc3Rlcl90dHk7CisJfQorCisJcmMgPSBkZ25jX3R0eV9pbml0KGJyZCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoRFJWU1RSICI6IENhbid0IGluaXQgdHR5IGRldmljZXMgKCVkKVxuIiwgcmMpOworCQlnb3RvIGZyZWVfaXJxOworCX0KKworCWJyZC0+c3RhdGUgPSBCT0FSRF9SRUFEWTsKKwlicmQtPmRwYXN0YXR1cyA9IEJEX1JVTk5JTkc7CisKKwlkZ25jX2NyZWF0ZV9wb3J0c19zeXNmaWxlcyhicmQpOworCisJZGduY19ib2FyZFtkZ25jX251bV9ib2FyZHMrK10gPSBicmQ7CisKKwlyZXR1cm4gMDsKKworZnJlZV9pcnE6CisJZGduY19mcmVlX2lycShicmQpOwordW5yZWdpc3Rlcl90dHk6CisJZGduY190dHlfdW5yZWdpc3RlcihicmQpOworCitmYWlsZWQ6CisJa2ZyZWUoYnJkKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTMyNCwxNyArMzY1LDYgQEAKIAkJYnJkLT5yZV9tYXBfbWVtYmFzZSA9IE5VTEw7CiAJfQogCi0JaWYgKGJyZC0+bXNnYnVmX2hlYWQpIHsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGduY19nbG9iYWxfbG9jaywgZmxhZ3MpOwotCQlicmQtPm1zZ2J1ZiA9IE5VTEw7Ci0JCWRldl9kYmcoJmJyZC0+cGRldi0+ZGV2LCAiJXNcbiIsIGJyZC0+bXNnYnVmX2hlYWQpOwotCQlrZnJlZShicmQtPm1zZ2J1Zl9oZWFkKTsKLQkJYnJkLT5tc2didWZfaGVhZCA9IE5VTEw7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRnbmNfZ2xvYmFsX2xvY2ssIGZsYWdzKTsKLQl9Ci0KIAkvKiBGcmVlIGFsbCBhbGxvY2F0ZWQgY2hhbm5lbHMgc3RydWN0cyAqLwogCWZvciAoaSA9IDA7IGkgPCBNQVhQT1JUUyA7IGkrKykgewogCQlpZiAoYnJkLT5jaGFubmVsc1tpXSkgewpAQCAtMzU2LDI5ICszODYsMTcgQEAKICAqCiAgKiBBIGJvYXJkIGhhcyBiZWVuIGZvdW5kLCBpbml0IGl0LgogICovCi1zdGF0aWMgaW50IGRnbmNfZm91bmRfYm9hcmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBpZCkKK3N0YXRpYyBzdHJ1Y3QgZGduY19ib2FyZCAqZGduY19mb3VuZF9ib2FyZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGlkKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpicmQ7CiAJdW5zaWduZWQgaW50IHBjaV9pcnE7CiAJaW50IGkgPSAwOwogCWludCByYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIGdldCB0aGUgYm9hcmQgc3RydWN0dXJlIGFuZCBwcmVwIGl0ICovCi0JZGduY19ib2FyZFtkZ25jX251bV9ib2FyZHNdID0ga3phbGxvYyhzaXplb2YoKmJyZCksIEdGUF9LRVJORUwpOwotCWJyZCA9IGRnbmNfYm9hcmRbZGduY19udW1fYm9hcmRzXTsKLQorCWJyZCA9IGt6YWxsb2Moc2l6ZW9mKCpicmQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJyZCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBtYWtlIGEgdGVtcG9yYXJ5IG1lc3NhZ2UgYnVmZmVyIGZvciB0aGUgYm9vdCBtZXNzYWdlcyAqLwotCWJyZC0+bXNnYnVmX2hlYWQgPSBrY2FsbG9jKDgxOTIsIHNpemVvZih1OCksIEdGUF9LRVJORUwpOwotCWJyZC0+bXNnYnVmID0gYnJkLT5tc2didWZfaGVhZDsKLQotCWlmICghYnJkLT5tc2didWYpIHsKLQkJa2ZyZWUoYnJkKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCS8qIHN0b3JlIHRoZSBpbmZvIGZvciB0aGUgYm9hcmQgd2UndmUgZm91bmQgKi8KIAlicmQtPm1hZ2ljID0gREdOQ19CT0FSRF9NQUdJQzsKQEAgLTQwMCw5ICs0MTgsNiBAQAogCiAJYnJkLT5zdGF0ZQkJPSBCT0FSRF9GT1VORDsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhQT1JUUzsgaSsrKQotCQlicmQtPmNoYW5uZWxzW2ldID0gTlVMTDsKLQogCS8qIHN0b3JlIHdoaWNoIGNhcmQgJiByZXZpc2lvbiB3ZSBoYXZlICovCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZicmQtPnN1YnZlbmRvcik7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX1NVQlNZU1RFTV9JRCwgJmJyZC0+c3ViZGV2aWNlKTsKQEAgLTQzNSw3ICs0NTAsOCBAQAogCQlpZiAoIWJyZC0+bWVtYmFzZSkgewogCQkJZGV2X2VycigmYnJkLT5wZGV2LT5kZXYsCiAJCQkJIkNhcmQgaGFzIG5vIFBDSSBJTyByZXNvdXJjZXMsIGZhaWxpbmcuXG4iKTsKLQkJCXJldHVybiAtRU5PREVWOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsZWQ7CiAJCX0KIAogCQlicmQtPm1lbWJhc2VfZW5kID0gcGNpX3Jlc291cmNlX2VuZChwZGV2LCA0KTsKQEAgLTQ1NSw3ICs0NzEsMTAgQEAKIAkJYnJkLT5iZF91YXJ0X29mZnNldCA9IDB4ODsKIAkJYnJkLT5iZF9kaXZpZGVuZCA9IDkyMTYwMDsKIAotCQlkZ25jX2RvX3JlbWFwKGJyZCk7CisJCXJjID0gZGduY19kb19yZW1hcChicmQpOworCisJCWlmIChyYyA8IDApCisJCQlnb3RvIGZhaWxlZDsKIAogCQkvKiBHZXQgYW5kIHN0b3JlIHRoZSBib2FyZCBWUEQsIGlmIGl0IGV4aXN0cyAqLwogCQlicmQtPmJkX29wcy0+dnBkKGJyZCk7CkBAIC01MDcsODEgKzUyNiw0NSBAQAogCQlicmQtPmJkX3VhcnRfb2Zmc2V0ID0gMHgyMDA7CiAJCWJyZC0+YmRfZGl2aWRlbmQgPSA5MjE2MDA7CiAKLQkJZGduY19kb19yZW1hcChicmQpOworCQlyYyA9IGRnbmNfZG9fcmVtYXAoYnJkKTsKIAotCQlpZiAoYnJkLT5yZV9tYXBfbWVtYmFzZSkgewotCQkJLyogUmVhZCBhbmQgc3RvcmUgdGhlIGR2aWQgYWZ0ZXIgcmVtYXBwaW5nICovCi0JCQlicmQtPmR2aWQgPSByZWFkYihicmQtPnJlX21hcF9tZW1iYXNlICsgMHg4RCk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIGZhaWxlZDsKIAotCQkJLyogR2V0IGFuZCBzdG9yZSB0aGUgYm9hcmQgVlBELCBpZiBpdCBleGlzdHMgKi8KLQkJCWJyZC0+YmRfb3BzLT52cGQoYnJkKTsKLQkJfQorCQkvKiBSZWFkIGFuZCBzdG9yZSB0aGUgZHZpZCBhZnRlciByZW1hcHBpbmcgKi8KKwkJYnJkLT5kdmlkID0gcmVhZGIoYnJkLT5yZV9tYXBfbWVtYmFzZSArIDB4OEQpOworCisJCS8qIEdldCBhbmQgc3RvcmUgdGhlIGJvYXJkIFZQRCwgaWYgaXQgZXhpc3RzICovCisJCWJyZC0+YmRfb3BzLT52cGQoYnJkKTsKKwogCQlicmVhazsKIAogCWRlZmF1bHQ6CiAJCWRldl9lcnIoJmJyZC0+cGRldi0+ZGV2LAogCQkJIkRpZG4ndCBmaW5kIGFueSBjb21wYXRpYmxlIE5lby9DbGFzc2ljIFBDSSBib2FyZHMuXG4iKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQkvKgotCSAqIERvIHR0eSBkZXZpY2UgaW5pdGlhbGl6YXRpb24uCi0JICovCi0KLQlyYyA9IGRnbmNfdHR5X3JlZ2lzdGVyKGJyZCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoRFJWU1RSICI6IENhbid0IHJlZ2lzdGVyIHR0eSBkZXZpY2VzICglZClcbiIsIHJjKTsKKwkJcmMgPSAtRU5YSU87CiAJCWdvdG8gZmFpbGVkOwogCX0KIAotCXJjID0gZGduY19maW5hbGl6ZV9ib2FyZF9pbml0KGJyZCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoRFJWU1RSICI6IENhbid0IGZpbmFsaXplIGJvYXJkIGluaXQgKCVkKVxuIiwgcmMpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQlyYyA9IGRnbmNfdHR5X2luaXQoYnJkKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycihEUlZTVFIgIjogQ2FuJ3QgaW5pdCB0dHkgZGV2aWNlcyAoJWQpXG4iLCByYyk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCWJyZC0+c3RhdGUgPSBCT0FSRF9SRUFEWTsKLQlicmQtPmRwYXN0YXR1cyA9IEJEX1JVTk5JTkc7Ci0KLQlkZ25jX2NyZWF0ZV9wb3J0c19zeXNmaWxlcyhicmQpOwotCiAJLyogaW5pdCBvdXIgcG9sbCBoZWxwZXIgdGFza2xldCAqLwogCXRhc2tsZXRfaW5pdCgmYnJkLT5oZWxwZXJfdGFza2xldCwKIAkJICAgICBicmQtPmJkX29wcy0+dGFza2xldCwKIAkJICAgICAodW5zaWduZWQgbG9uZylicmQpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRnbmNfZ2xvYmFsX2xvY2ssIGZsYWdzKTsKLQlicmQtPm1zZ2J1ZiA9IE5VTEw7Ci0JZGV2X2RiZygmYnJkLT5wZGV2LT5kZXYsICIlc1xuIiwgYnJkLT5tc2didWZfaGVhZCk7Ci0Ja2ZyZWUoYnJkLT5tc2didWZfaGVhZCk7Ci0JYnJkLT5tc2didWZfaGVhZCA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGduY19nbG9iYWxfbG9jaywgZmxhZ3MpOwotCiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZicmQtPnN0YXRlX3dhaXQpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGJyZDsKIAogZmFpbGVkOgotCWRnbmNfdHR5X3VuaW5pdChicmQpOwotCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7Ci0JYnJkLT5kcGFzdGF0dXMgPSBCRF9OT0ZFUDsKKwlrZnJlZShicmQpOwogCi0JcmV0dXJuIC1FTlhJTzsKKwlyZXR1cm4gRVJSX1BUUihyYyk7CiB9CiAKLXN0YXRpYyBpbnQgZGduY19maW5hbGl6ZV9ib2FyZF9pbml0KHN0cnVjdCBkZ25jX2JvYXJkICpicmQpCitzdGF0aWMgaW50IGRnbmNfcmVxdWVzdF9pcnEoc3RydWN0IGRnbmNfYm9hcmQgKmJyZCkKIHsKIAlpbnQgcmMgPSAwOwogCi0JaWYgKCFicmQgfHwgYnJkLT5tYWdpYyAhPSBER05DX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCWlmIChicmQtPmlycSkgewogCQlyYyA9IHJlcXVlc3RfaXJxKGJyZC0+aXJxLCBicmQtPmJkX29wcy0+aW50ciwKIAkJCQkgSVJRRl9TSEFSRUQsICJER05DIiwgYnJkKTsKQEAgLTU5Nyw0MiArNTgwLDUxIEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgdm9pZCBkZ25jX2ZyZWVfaXJxKHN0cnVjdCBkZ25jX2JvYXJkICpicmQpCit7CisJaWYgKGJyZC0+aXJxKQorCQlmcmVlX2lycShicmQtPmlycSwgYnJkKTsKK30KKwogLyoKICAqIFJlbWFwIFBDSSBtZW1vcnkuCiAgKi8KLXN0YXRpYyB2b2lkIGRnbmNfZG9fcmVtYXAoc3RydWN0IGRnbmNfYm9hcmQgKmJyZCkKK3N0YXRpYyBpbnQgZGduY19kb19yZW1hcChzdHJ1Y3QgZGduY19ib2FyZCAqYnJkKQogewotCWlmICghYnJkIHx8IGJyZC0+bWFnaWMgIT0gREdOQ19CT0FSRF9NQUdJQykKLQkJcmV0dXJuOworCWludCByYyA9IDA7CiAKIAlicmQtPnJlX21hcF9tZW1iYXNlID0gaW9yZW1hcChicmQtPm1lbWJhc2UsIDB4MTAwMCk7CisJaWYgKCFicmQtPnJlX21hcF9tZW1iYXNlKQorCQlyYyA9IC1FTk9NRU07CisKKwlyZXR1cm4gcmM7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjoKLSoKLSogICAgZGduY19wb2xsX2hhbmRsZXIKLSoKLSogQXV0aG9yOgotKgotKiAgICBTY290dCBIIEtpbGF1Ci0qCi0qIFBhcmFtZXRlcnM6Ci0qCi0qICAgIGR1bW15IC0tIGlnbm9yZWQKLSoKLSogUmV0dXJuIFZhbHVlczoKLSoKLSogICAgbm9uZQotKgotKiBEZXNjcmlwdGlvbjoKLSoKLSogICAgQXMgZWFjaCB0aW1lciBleHBpcmVzLCBpdCBkZXRlcm1pbmVzIChhKSB3aGV0aGVyIHRoZSAidHJhbnNtaXQiCi0qICAgIHdhaXRlciBuZWVkcyB0byBiZSB3b2tlbiB1cCwgYW5kIChiKSB3aGV0aGVyIHRoZSBwb2xsZXIgbmVlZHMgdG8KLSogICAgYmUgcmVzY2hlZHVsZWQuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICoKKyAqIEZ1bmN0aW9uOgorICoKKyAqICAgIGRnbmNfcG9sbF9oYW5kbGVyCisgKgorICogQXV0aG9yOgorICoKKyAqICAgIFNjb3R0IEggS2lsYXUKKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqICAgIGR1bW15IC0tIGlnbm9yZWQKKyAqCisgKiBSZXR1cm4gVmFsdWVzOgorICoKKyAqICAgIG5vbmUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiAgICBBcyBlYWNoIHRpbWVyIGV4cGlyZXMsIGl0IGRldGVybWluZXMgKGEpIHdoZXRoZXIgdGhlICJ0cmFuc21pdCIKKyAqICAgIHdhaXRlciBuZWVkcyB0byBiZSB3b2tlbiB1cCwgYW5kIChiKSB3aGV0aGVyIHRoZSBwb2xsZXIgbmVlZHMgdG8KKyAqICAgIGJlIHJlc2NoZWR1bGVkLgorICoKKyAqLwogCiBzdGF0aWMgdm9pZCBkZ25jX3BvbGxfaGFuZGxlcih1bG9uZyBkdW1teSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfZHJpdmVyLmggYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2RyaXZlci5oCmluZGV4IDk1ZWM3MjkuLjg3OTIwMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfZHJpdmVyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19kcml2ZXIuaApAQCAtMTgzLDEwICsxODMsNiBAQAogCXVpbnQJCW5hc3luYzsJCS8qIE51bWJlciBvZiBwb3J0cyBvbiBjYXJkICovCiAKIAl1aW50CQlpcnE7CQkvKiBJbnRlcnJ1cHQgcmVxdWVzdCBudW1iZXIgKi8KLQl1bG9uZwkJaW50cl9jb3VudDsJLyogQ291bnQgb2YgaW50ZXJydXB0cyAqLwotCXVsb25nCQlpbnRyX21vZGVtOwkvKiBDb3VudCBvZiBpbnRlcnJ1cHRzICovCi0JdWxvbmcJCWludHJfdHg7CS8qIENvdW50IG9mIGludGVycnVwdHMgKi8KLQl1bG9uZwkJaW50cl9yeDsJLyogQ291bnQgb2YgaW50ZXJydXB0cyAqLwogCiAJdWxvbmcJCW1lbWJhc2U7CS8qIFN0YXJ0IG9mIGJhc2UgbWVtb3J5IG9mIHRoZSBjYXJkICovCiAJdWxvbmcJCW1lbWJhc2VfZW5kOwkvKiBFbmQgb2YgYmFzZSBtZW1vcnkgb2YgdGhlIGNhcmQgKi8KQEAgLTIwNyw5ICsyMDMsNiBAQAogCXN0cnVjdCB0dHlfZHJpdmVyICpwcmludF9kcml2ZXI7CiAJY2hhcgkJcHJpbnRfbmFtZVsyMDBdOwogCi0JYm9vbAkJZGduY19tYWpvcl9zZXJpYWxfcmVnaXN0ZXJlZDsKLQlib29sCQlkZ25jX21ham9yX3RyYW5zcGFyZW50X3ByaW50X3JlZ2lzdGVyZWQ7Ci0KIAl1MTYJCWRwYXR5cGU7CS8qIFRoZSBib2FyZCAidHlwZSIsCiAJCQkJCSAqIGFzIGRlZmluZWQgYnkgRFBBCiAJCQkJCSAqLwpAQCAtMjE3LDEyICsyMTAsNiBAQAogCQkJCQkgKiBhcyBkZWZpbmVkIGJ5IERQQQogCQkJCQkgKi8KIAotCS8qCi0JICoJTWdtdCBkYXRhLgotCSAqLwotCWNoYXIJCSptc2didWZfaGVhZDsKLQljaGFyCQkqbXNnYnVmOwotCiAJdWludAkJYmRfZGl2aWRlbmQ7CS8qIEJvYXJkL1VBUlRzIHNwZWNpZmljIGRpdmlkZW5kICovCiAKIAlzdHJ1Y3QgYm9hcmRfb3BzICpiZF9vcHM7CkBAIC0zODEsMTAgKzM2OCw2IEBACiAJdWxvbmcJCWNoX3hvbl9zZW5kczsJLyogQ291bnQgb2YgeG9ucyB0cmFuc21pdHRlZCAqLwogCXVsb25nCQljaF94b2ZmX3NlbmRzOwkvKiBDb3VudCBvZiB4b2ZmcyB0cmFuc21pdHRlZCAqLwogCi0JdWxvbmcJCWNoX2ludHJfbW9kZW07CS8qIENvdW50IG9mIGludGVycnVwdHMgKi8KLQl1bG9uZwkJY2hfaW50cl90eDsJLyogQ291bnQgb2YgaW50ZXJydXB0cyAqLwotCXVsb25nCQljaF9pbnRyX3J4OwkvKiBDb3VudCBvZiBpbnRlcnJ1cHRzICovCi0KIAkvKiAvcHJvYy88Ym9hcmQ+LzxjaGFubmVsPiBlbnRyaWVzICovCiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2VudHJ5X3BvaW50ZXI7CiAJc3RydWN0IGRnbmNfcHJvY19lbnRyeSAqZGduY19jaGFubmVsX3RhYmxlOwpAQCAtMzk4LDcgKzM4MSw3IEBACiBleHRlcm4gaW50CQlkZ25jX3BvbGxfdGljazsJCS8qIFBvbGwgaW50ZXJ2YWwgLSAyMCBtcyAqLwogZXh0ZXJuIHNwaW5sb2NrX3QJZGduY19nbG9iYWxfbG9jazsJLyogRHJpdmVyIGdsb2JhbCBzcGlubG9jayAqLwogZXh0ZXJuIHNwaW5sb2NrX3QJZGduY19wb2xsX2xvY2s7CQkvKiBQb2xsIHNjaGVkdWxpbmcgbG9jayAqLwotZXh0ZXJuIHVpbnQJCWRnbmNfbnVtX2JvYXJkczsJCS8qIFRvdGFsIG51bWJlciBvZiBib2FyZHMgKi8KK2V4dGVybiB1aW50CQlkZ25jX251bV9ib2FyZHM7CS8qIFRvdGFsIG51bWJlciBvZiBib2FyZHMgKi8KIGV4dGVybiBzdHJ1Y3QgZGduY19ib2FyZAkqZGduY19ib2FyZFtNQVhCT0FSRFNdOwkvKiBBcnJheSBvZiBib2FyZAogCQkJCQkJCSAqIHN0cnVjdHMKIAkJCQkJCQkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbmVvLmMgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX25lby5jCmluZGV4IGJhNTdlOTUuLjViZWNiMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbmVvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19uZW8uYwpAQCAtMTA3LDcgKzEwNyw5IEBACiAJLyogVHVybiBvZmYgYXV0byBYb24gZmxvdyBjb250cm9sICovCiAJZWZyICY9IH5VQVJUXzE3MTU4X0VGUl9JWE9OOwogCi0JLyogV2h5PyBCZWN1eiBFeGFyJ3Mgc3BlYyBzYXlzIHdlIGhhdmUgdG8gemVybyBpdCBvdXQgYmVmb3JlIHNldHRpbmcgaXQgKi8KKwkvKiBXaHk/IEJlY2F1c2UgRXhhcidzIHNwZWMgc2F5cyB3ZSBoYXZlIHRvIHplcm8gaXQKKwkgKiBvdXQgYmVmb3JlIHNldHRpbmcgaXQKKwkgKi8KIAl3cml0ZWIoMCwgJmNoLT5jaF9uZW9fdWFydC0+ZWZyKTsKIAogCS8qIFR1cm4gb24gVUFSVCBlbmhhbmNlZCBiaXRzICovCkBAIC0xNDMsNyArMTQ1LDkgQEAKIAlpZXIgJj0gflVBUlRfMTcxNThfSUVSX1hPRkY7CiAJZWZyICY9IH5VQVJUXzE3MTU4X0VGUl9JWE9GRjsKIAotCS8qIFdoeT8gQmVjdXogRXhhcidzIHNwZWMgc2F5cyB3ZSBoYXZlIHRvIHplcm8gaXQgb3V0IGJlZm9yZSBzZXR0aW5nIGl0ICovCisJLyogV2h5PyBCZWNhdXNlIEV4YXIncyBzcGVjIHNheXMgd2UgaGF2ZSB0byB6ZXJvIGl0CisJICogb3V0IGJlZm9yZSBzZXR0aW5nIGl0CisJICovCiAJd3JpdGViKDAsICZjaC0+Y2hfbmVvX3VhcnQtPmVmcik7CiAKIAkvKiBUdXJuIG9uIFVBUlQgZW5oYW5jZWQgYml0cyAqLwpAQCAtMTgxLDcgKzE4NSw5IEBACiAJLyogVHVybiBvbiBhdXRvIFhvbiBmbG93IGNvbnRyb2wgKi8KIAllZnIgfD0gKFVBUlRfMTcxNThfRUZSX0VDQiB8IFVBUlRfMTcxNThfRUZSX0lYT04pOwogCi0JLyogV2h5PyBCZWN1eiBFeGFyJ3Mgc3BlYyBzYXlzIHdlIGhhdmUgdG8gemVybyBpdCBvdXQgYmVmb3JlIHNldHRpbmcgaXQgKi8KKwkvKiBXaHk/IEJlY2F1c2UgRXhhcidzIHNwZWMgc2F5cyB3ZSBoYXZlIHRvIHplcm8gaXQKKwkgKiBvdXQgYmVmb3JlIHNldHRpbmcgaXQKKwkgKi8KIAl3cml0ZWIoMCwgJmNoLT5jaF9uZW9fdWFydC0+ZWZyKTsKIAogCS8qIFR1cm4gb24gVUFSVCBlbmhhbmNlZCBiaXRzICovCkBAIC0yMTksNyArMjI1LDkgQEAKIAlpZXIgfD0gVUFSVF8xNzE1OF9JRVJfWE9GRjsKIAllZnIgfD0gKFVBUlRfMTcxNThfRUZSX0VDQiB8IFVBUlRfMTcxNThfRUZSX0lYT0ZGKTsKIAotCS8qIFdoeT8gQmVjdXogRXhhcidzIHNwZWMgc2F5cyB3ZSBoYXZlIHRvIHplcm8gaXQgb3V0IGJlZm9yZSBzZXR0aW5nIGl0ICovCisJLyogV2h5PyBCZWNhdXNlIEV4YXIncyBzcGVjIHNheXMgd2UgaGF2ZSB0byB6ZXJvIGl0CisJICogb3V0IGJlZm9yZSBzZXR0aW5nIGl0CisJICovCiAJd3JpdGViKDAsICZjaC0+Y2hfbmVvX3VhcnQtPmVmcik7CiAKIAkvKiBUdXJuIG9uIFVBUlQgZW5oYW5jZWQgYml0cyAqLwpAQCAtMjYwLDcgKzI2OCw5IEBACiAJZWxzZQogCQllZnIgJj0gfihVQVJUXzE3MTU4X0VGUl9FQ0IgfCBVQVJUXzE3MTU4X0VGUl9JWE9GRik7CiAKLQkvKiBXaHk/IEJlY3V6IEV4YXIncyBzcGVjIHNheXMgd2UgaGF2ZSB0byB6ZXJvIGl0IG91dCBiZWZvcmUgc2V0dGluZyBpdCAqLworCS8qIFdoeT8gQmVjYXVzZSBFeGFyJ3Mgc3BlYyBzYXlzIHdlIGhhdmUgdG8gemVybworCSAqIGl0IG91dCBiZWZvcmUgc2V0dGluZyBpdAorCSAqLwogCXdyaXRlYigwLCAmY2gtPmNoX25lb191YXJ0LT5lZnIpOwogCiAJLyogVHVybiBvbiBVQVJUIGVuaGFuY2VkIGJpdHMgKi8KQEAgLTI5OCw3ICszMDgsOSBAQAogCWVsc2UKIAkJZWZyICY9IH4oVUFSVF8xNzE1OF9FRlJfRUNCIHwgVUFSVF8xNzE1OF9FRlJfSVhPTik7CiAKLQkvKiBXaHk/IEJlY3V6IEV4YXIncyBzcGVjIHNheXMgd2UgaGF2ZSB0byB6ZXJvIGl0IG91dCBiZWZvcmUgc2V0dGluZyBpdCAqLworCS8qIFdoeT8gQmVjYXVzZSBFeGFyJ3Mgc3BlYyBzYXlzIHdlIGhhdmUgdG8gemVybyBpdAorCSAqIG91dCBiZWZvcmUgc2V0dGluZyBpdAorCSAqLwogCXdyaXRlYigwLCAmY2gtPmNoX25lb191YXJ0LT5lZnIpOwogCiAJLyogVHVybiBvbiBVQVJUIGVuaGFuY2VkIGJpdHMgKi8KQEAgLTM5OSwxOSArNDExLDE3IEBACiAKIAkJaWYgKGlzciAmIChVQVJUXzE3MTU4X0lJUl9SRElfVElNRU9VVCB8IFVBUlRfSUlSX1JESSkpIHsKIAkJCS8qIFJlYWQgZGF0YSBmcm9tIHVhcnQgLT4gcXVldWUgKi8KLQkJCWJyZC0+aW50cl9yeCsrOwotCQkJY2gtPmNoX2ludHJfcngrKzsKIAkJCW5lb19jb3B5X2RhdGFfZnJvbV91YXJ0X3RvX3F1ZXVlKGNoKTsKIAotCQkJLyogQ2FsbCBvdXIgdHR5IGxheWVyIHRvIGVuZm9yY2UgcXVldWUgZmxvdyBjb250cm9sIGlmIG5lZWRlZC4gKi8KKwkJCS8qIENhbGwgb3VyIHR0eSBsYXllciB0byBlbmZvcmNlIHF1ZXVlCisJCQkgKiBmbG93IGNvbnRyb2wgaWYgbmVlZGVkLgorCQkJICovCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKIAkJCWRnbmNfY2hlY2tfcXVldWVfZmxvd19jb250cm9sKGNoKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CiAJCX0KIAogCQlpZiAoaXNyICYgVUFSVF9JSVJfVEhSSSkgewotCQkJYnJkLT5pbnRyX3R4Kys7Ci0JCQljaC0+Y2hfaW50cl90eCsrOwogCQkJLyogVHJhbnNmZXIgZGF0YSAoaWYgYW55KSBmcm9tIFdyaXRlIFF1ZXVlIC0+IFVBUlQuICovCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKIAkJCWNoLT5jaF9mbGFncyB8PSAoQ0hfVFhfRklGT19FTVBUWSB8IENIX1RYX0ZJRk9fTFdNKTsKQEAgLTQyOCw3ICs0MzgsOSBAQAogCQkJICogb25lIGl0IHdhcywgc28gd2UgY2FuIHN1c3BlbmQgb3IgcmVzdW1lIGRhdGEgZmxvdy4KIAkJCSAqLwogCQkJaWYgKGNhdXNlID09IFVBUlRfMTcxNThfWE9OX0RFVEVDVCkgewotCQkJCS8qIElzIG91dHB1dCBzdG9wcGVkIHJpZ2h0IG5vdywgaWYgc28sIHJlc3VtZSBpdCAqLworCQkJCS8qIElzIG91dHB1dCBzdG9wcGVkIHJpZ2h0IG5vdywgaWYgc28sCisJCQkJICogcmVzdW1lIGl0CisJCQkJICovCiAJCQkJaWYgKGJyZC0+Y2hhbm5lbHNbcG9ydF0tPmNoX2ZsYWdzICYgQ0hfU1RPUCkgewogCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssCiAJCQkJCQkJICBmbGFncyk7CkBAIC00MzcsNyArNDQ5LDggQEAKIAkJCQkJCQkgICAgICAgZmxhZ3MpOwogCQkJCX0KIAkJCX0gZWxzZSBpZiAoY2F1c2UgPT0gVUFSVF8xNzE1OF9YT0ZGX0RFVEVDVCkgewotCQkJCWlmICghKGJyZC0+Y2hhbm5lbHNbcG9ydF0tPmNoX2ZsYWdzICYgQ0hfU1RPUCkpIHsKKwkJCQlpZiAoIShicmQtPmNoYW5uZWxzW3BvcnRdLT5jaF9mbGFncyAmCisJCQkJICAgICAgQ0hfU1RPUCkpIHsKIAkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLAogCQkJCQkJCSAgZmxhZ3MpOwogCQkJCQljaC0+Y2hfZmxhZ3MgfD0gQ0hfU1RPUDsKQEAgLTQ0OSwxMSArNDYyLDEwIEBACiAKIAkJaWYgKGlzciAmIFVBUlRfMTcxNThfSUlSX0hXRkxPV19TVEFURV9DSEFOR0UpIHsKIAkJCS8qCi0JCQkgKiBJZiB3ZSBnZXQgaGVyZSwgdGhpcyBtZWFucyB0aGUgaGFyZHdhcmUgaXMgZG9pbmcgYXV0byBmbG93IGNvbnRyb2wuCi0JCQkgKiBDaGVjayB0byBzZWUgd2hldGhlciBSVFMvRFRSIG9yIENUUy9EU1IgY2F1c2VkIHRoaXMgaW50ZXJydXB0LgorCQkJICogSWYgd2UgZ2V0IGhlcmUsIHRoaXMgbWVhbnMgdGhlIGhhcmR3YXJlIGlzCisJCQkgKiBkb2luZyBhdXRvIGZsb3cgY29udHJvbC4gQ2hlY2sgdG8gc2VlIHdoZXRoZXIKKwkJCSAqIFJUUy9EVFIgb3IgQ1RTL0RTUiBjYXVzZWQgdGhpcyBpbnRlcnJ1cHQuCiAJCQkgKi8KLQkJCWJyZC0+aW50cl9tb2RlbSsrOwotCQkJY2gtPmNoX2ludHJfbW9kZW0rKzsKIAkJCWNhdXNlID0gcmVhZGIoJmNoLT5jaF9uZW9fdWFydC0+bWNyKTsKIAkJCS8qIFdoaWNoIHBpbiBpcyBkb2luZyBhdXRvIGZsb3c/IFJUUyBvciBEVFI/ICovCiAJCQlpZiAoKGNhdXNlICYgMHg0KSA9PSAwKSB7CkBAIC01MTcsOCArNTI5LDYgQEAKIAljaC0+Y2hfY2FjaGVkX2xzciB8PSBsaW5lc3RhdHVzOwogCiAJaWYgKGNoLT5jaF9jYWNoZWRfbHNyICYgVUFSVF9MU1JfRFIpIHsKLQkJYnJkLT5pbnRyX3J4Kys7Ci0JCWNoLT5jaF9pbnRyX3J4Kys7CiAJCS8qIFJlYWQgZGF0YSBmcm9tIHVhcnQgLT4gcXVldWUgKi8KIAkJbmVvX2NvcHlfZGF0YV9mcm9tX3VhcnRfdG9fcXVldWUoY2gpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKQEAgLTU0NSwxNCArNTU1LDEzIEBACiAJCSAqIFJ4IE9ydW5zLiBFeGFyIHNheXMgdGhhdCBhbiBvcnVuIHdpbGwgTk9UIGNvcnJ1cHQKIAkJICogdGhlIEZJRk8uIEl0IHdpbGwganVzdCByZXBsYWNlIHRoZSBob2xkaW5nIHJlZ2lzdGVyCiAJCSAqIHdpdGggdGhpcyBuZXcgZGF0YSBieXRlLiBTbyBiYXNpY2FsbHkganVzdCBpZ25vcmUgdGhpcy4KLQkJICogUHJvYmFibHkgd2Ugc2hvdWxkIGV2ZW50dWFsbHkgaGF2ZSBhbiBvcnVuIHN0YXQgaW4gb3VyIGRyaXZlci4uLgorCQkgKiBQcm9iYWJseSB3ZSBzaG91bGQgZXZlbnR1YWxseSBoYXZlIGFuIG9ydW4gc3RhdCBpbiBvdXIKKwkJICogZHJpdmVyLi4uCiAJCSAqLwogCQljaC0+Y2hfZXJyX292ZXJydW4rKzsKIAl9CiAKIAlpZiAobGluZXN0YXR1cyAmIFVBUlRfTFNSX1RIUkUpIHsKLQkJYnJkLT5pbnRyX3R4Kys7Ci0JCWNoLT5jaF9pbnRyX3R4Kys7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwogCQljaC0+Y2hfZmxhZ3MgfD0gKENIX1RYX0ZJRk9fRU1QVFkgfCBDSF9UWF9GSUZPX0xXTSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CkBAIC01NjAsOCArNTY5LDYgQEAKIAkJLyogVHJhbnNmZXIgZGF0YSAoaWYgYW55KSBmcm9tIFdyaXRlIFF1ZXVlIC0+IFVBUlQuICovCiAJCW5lb19jb3B5X2RhdGFfZnJvbV9xdWV1ZV90b191YXJ0KGNoKTsKIAl9IGVsc2UgaWYgKGxpbmVzdGF0dXMgJiBVQVJUXzE3MTU4X1RYX0FORF9GSUZPX0NMUikgewotCQlicmQtPmludHJfdHgrKzsKLQkJY2gtPmNoX2ludHJfdHgrKzsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CiAJCWNoLT5jaF9mbGFncyB8PSAoQ0hfVFhfRklGT19FTVBUWSB8IENIX1RYX0ZJRk9fTFdNKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKQEAgLTY2NSw3ICs2NzIsOSBAQAogCQkJCTQ4MDAsICAgOTYwMCwgICAxOTIwMCwgIDM4NDAwIH0KIAkJfTsKIAotCQkvKiBPbmx5IHVzZSB0aGUgVFhQcmludCBiYXVkIHJhdGUgaWYgdGhlIHRlcm1pbmFsIHVuaXQgaXMgTk9UIG9wZW4gKi8KKwkJLyogT25seSB1c2UgdGhlIFRYUHJpbnQgYmF1ZCByYXRlIGlmIHRoZSB0ZXJtaW5hbCB1bml0CisJCSAqIGlzIE5PVCBvcGVuCisJCSAqLwogCQlpZiAoIShjaC0+Y2hfdHVuLnVuX2ZsYWdzICYgVU5fSVNPUEVOKSAmJgogCQkgICAgKHVuLT51bl90eXBlID09IERHTkNfUFJJTlQpKQogCQkJYmF1ZCA9IENfQkFVRChjaC0+Y2hfcHVuLnVuX3R0eSkgJiAweGZmOwpAQCAtNzg4LDcgKzc5Nyw5IEBACiAJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBDVFNQQUNFIHx8IGNoLT5jaF9jX2NmbGFnICYgQ1JUU0NUUykgewogCQluZW9fc2V0X2N0c19mbG93X2NvbnRyb2woY2gpOwogCX0gZWxzZSBpZiAoY2gtPmNoX2NfaWZsYWcgJiBJWE9OKSB7Ci0JCS8qIElmIHN0YXJ0L3N0b3AgaXMgc2V0IHRvIGRpc2FibGUsIHRoZW4gd2Ugc2hvdWxkIGRpc2FibGUgZmxvdyBjb250cm9sICovCisJCS8qIElmIHN0YXJ0L3N0b3AgaXMgc2V0IHRvIGRpc2FibGUsIHRoZW4gd2Ugc2hvdWxkCisJCSAqIGRpc2FibGUgZmxvdyBjb250cm9sCisJCSAqLwogCQlpZiAoKGNoLT5jaF9zdGFydGMgPT0gX1BPU0lYX1ZESVNBQkxFKSB8fAogCQkgICAgKGNoLT5jaF9zdG9wYyA9PSBfUE9TSVhfVkRJU0FCTEUpKQogCQkJbmVvX3NldF9ub19vdXRwdXRfZmxvd19jb250cm9sKGNoKTsKQEAgLTgwMSw3ICs4MTIsOSBAQAogCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgUlRTUEFDRSB8fCBjaC0+Y2hfY19jZmxhZyAmIENSVFNDVFMpIHsKIAkJbmVvX3NldF9ydHNfZmxvd19jb250cm9sKGNoKTsKIAl9IGVsc2UgaWYgKGNoLT5jaF9jX2lmbGFnICYgSVhPRkYpIHsKLQkJLyogSWYgc3RhcnQvc3RvcCBpcyBzZXQgdG8gZGlzYWJsZSwgdGhlbiB3ZSBzaG91bGQgZGlzYWJsZSBmbG93IGNvbnRyb2wgKi8KKwkJLyogSWYgc3RhcnQvc3RvcCBpcyBzZXQgdG8gZGlzYWJsZSwgdGhlbiB3ZSBzaG91bGQKKwkJICogZGlzYWJsZSBmbG93IGNvbnRyb2wKKwkJICovCiAJCWlmICgoY2gtPmNoX3N0YXJ0YyA9PSBfUE9TSVhfVkRJU0FCTEUpIHx8CiAJCSAgICAoY2gtPmNoX3N0b3BjID09IF9QT1NJWF9WRElTQUJMRSkpCiAJCQluZW9fc2V0X25vX2lucHV0X2Zsb3dfY29udHJvbChjaCk7CkBAIC05MjYsOCArOTM5LDYgQEAKIAlpZiAoIWJyZCB8fCBicmQtPm1hZ2ljICE9IERHTkNfQk9BUkRfTUFHSUMpCiAJCXJldHVybiBJUlFfTk9ORTsKIAotCWJyZC0+aW50cl9jb3VudCsrOwotCiAJLyogTG9jayBvdXQgdGhlIHNsb3cgcG9sbGVyIGZyb20gcnVubmluZyBvbiB0aGlzIGJvYXJkLiAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZicmQtPmJkX2ludHJfbG9jaywgZmxhZ3MpOwogCkBAIC05NDAsMTQgKzk1MSwxOCBAQAogCiAJLyoKIAkgKiBJZiAwLCBubyBpbnRlcnJ1cHRzIHBlbmRpbmcuCi0JICogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBJUlEgaXMgc2hhcmVkIGFtb25nIGEgY291cGxlIE5lby9DbGFzc2ljIGJvYXJkcy4KKwkgKiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIElSUSBpcyBzaGFyZWQgYW1vbmcgYSBjb3VwbGUgTmVvL0NsYXNzaWMKKwkgKiBib2FyZHMuCiAJICovCiAJaWYgKCF1YXJ0X3BvbGwpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnJkLT5iZF9pbnRyX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KIAotCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgYXQgbGVhc3QgU09NRVRISU5HIHRvIHNlcnZpY2UsIGRpZyBmdXJ0aGVyLi4uICovCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGF0IGxlYXN0IFNPTUVUSElORyB0byBzZXJ2aWNlLCBkaWcKKwkgKiBmdXJ0aGVyLi4uCisJICovCiAKIAkvKiBMb29wIG9uIGVhY2ggcG9ydCAqLwogCXdoaWxlICgodWFydF9wb2xsICYgMHhmZikgIT0gMCkgewpAQCAtOTcxLDcgKzk4NiwxMCBAQAogCQkJY2ggPSBicmQtPmNoYW5uZWxzW3BvcnRdOwogCQkJbmVvX2NvcHlfZGF0YV9mcm9tX3VhcnRfdG9fcXVldWUoY2gpOwogCi0JCQkvKiBDYWxsIG91ciB0dHkgbGF5ZXIgdG8gZW5mb3JjZSBxdWV1ZSBmbG93IGNvbnRyb2wgaWYgbmVlZGVkLiAqLworCQkJLyoKKwkJCSAqIENhbGwgb3VyIHR0eSBsYXllciB0byBlbmZvcmNlIHF1ZXVlIGZsb3cgY29udHJvbCBpZgorCQkJICogbmVlZGVkLgorCQkJICovCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGZsYWdzMik7CiAJCQlkZ25jX2NoZWNrX3F1ZXVlX2Zsb3dfY29udHJvbChjaCk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MyKTsKQEAgLTk4NywxNiArMTAwNSwxOCBAQAogCiAJCWNhc2UgVUFSVF8xNzE1OF9UWFJEWToKIAkJCS8qCi0JCQkgKiBUWFJEWSBpbnRlcnJ1cHQgY2xlYXJzIGFmdGVyIHJlYWRpbmcgSVNSIHJlZ2lzdGVyIGZvciB0aGUgVUFSVCBjaGFubmVsLgorCQkJICogVFhSRFkgaW50ZXJydXB0IGNsZWFycyBhZnRlciByZWFkaW5nIElTUiByZWdpc3RlcgorCQkJICogZm9yIHRoZSBVQVJUIGNoYW5uZWwuCiAJCQkgKi8KIAogCQkJLyoKIAkJCSAqIFllcywgdGhpcyBpcyBvZGQuLi4KIAkJCSAqIFdoeSB3b3VsZCBJIGNoZWNrIEVWRVJZIHBvc3NpYmlsaXR5IG9mIHR5cGUgb2YKIAkJCSAqIGludGVycnVwdCwgd2hlbiB3ZSBrbm93IGl0cyBUWFJEWT8/PwotCQkJICogQmVjdXogZm9yIHNvbWUgcmVhc29uLCBldmVuIHRobyB3ZSBnb3QgdHJpZ2dlcmVkIGZvciBUWFJEWSwKLQkJCSAqIGl0IHNlZW1zIHRvIGJlIG9jY2FzaW9uYWxseSB3cm9uZy4gSW5zdGVhZCBvZiBUWCwgd2hpY2gKLQkJCSAqIGl0IHNob3VsZCBiZSwgSSB3YXMgZ2V0dGluZyB0aGluZ3MgbGlrZSBSWERZIHRvby4gV2VpcmQuCisJCQkgKiBCZWN1eiBmb3Igc29tZSByZWFzb24sIGV2ZW4gdGhvIHdlIGdvdCB0cmlnZ2VyZWQgZm9yCisJCQkgKiBUWFJEWSwgaXQgc2VlbXMgdG8gYmUgb2NjYXNpb25hbGx5IHdyb25nLiBJbnN0ZWFkIG9mCisJCQkgKiBUWCwgd2hpY2ggaXQgc2hvdWxkIGJlLCBJIHdhcyBnZXR0aW5nIHRoaW5ncyBsaWtlCisJCQkgKiBSWERZIHRvby4gV2VpcmQuCiAJCQkgKi8KIAkJCW5lb19wYXJzZV9pc3IoYnJkLCBwb3J0KTsKIAkJCWJyZWFrOwpAQCAtMTAxMSw4ICsxMDMxLDggQEAKIAkJZGVmYXVsdDoKIAkJCS8qCiAJCQkgKiBUaGUgVUFSVCB0cmlnZ2VyZWQgdXMgd2l0aCBhIGJvZ3VzIGludGVycnVwdCB0eXBlLgotCQkJICogSXQgYXBwZWFycyB0aGUgRXhhciBjaGlwLCB3aGVuIFJFQUxMWSBib2dnZWQgZG93biwgd2lsbCB0aHJvdwotCQkJICogdGhlc2Ugb25jZSBhbmQgYXdoaWxlLgorCQkJICogSXQgYXBwZWFycyB0aGUgRXhhciBjaGlwLCB3aGVuIFJFQUxMWSBib2dnZWQgZG93biwKKwkJCSAqIHdpbGwgdGhyb3cgdGhlc2Ugb25jZSBhbmQgYXdoaWxlLgogCQkJICogSXRzIGhhcm1sZXNzLCBqdXN0IGlnbm9yZSBpdCBhbmQgbW92ZSBvbi4KIAkJCSAqLwogCQkJYnJlYWs7CkBAIC0xMjMwLDcgKzEyNTAsOCBAQAogCQl9CiAKIAkJLyoKLQkJICogSWYgb3VyIHF1ZXVlIGlzIGZ1bGwsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBkcm9wIHNvbWUgZGF0YS4KKwkJICogSWYgb3VyIHF1ZXVlIGlzIGZ1bGwsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBkcm9wIHNvbWUKKwkJICogZGF0YS4KIAkJICogVGhlIGFzc3VtcHRpb24gaXMgdGhhdCBIV0ZMT1cgb3IgU1dGTE9XIHNob3VsZCBoYXZlIHN0b3BwZWQKIAkJICogdGhpbmdzIHdheSB3YXkgYmVmb3JlIHdlIGdvdCB0byB0aGlzIHBvaW50LgogCQkgKgpAQCAtMTMyMyw3ICsxMzQ0LDEwIEBACiAJbmVvX3BjaV9wb3N0aW5nX2ZsdXNoKGNoLT5jaF9iZCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkvKiBDaGVjayB0byBzZWUgaWYgdGhlIFVBUlQgZmVlbHMgaXQgY29tcGxldGVseSBmbHVzaGVkIHRoZSBGSUZPLiAqLworCQkvKgorCQkgKiBDaGVjayB0byBzZWUgaWYgdGhlIFVBUlQgZmVlbHMgaXQgY29tcGxldGVseSBmbHVzaGVkIHRoZQorCQkgKiBGSUZPLgorCQkgKi8KIAkJdG1wID0gcmVhZGIoJmNoLT5jaF9uZW9fdWFydC0+aXNyX2Zjcik7CiAJCWlmICh0bXAgJiA0KQogCQkJdWRlbGF5KDEwKTsKQEAgLTEzNTIsNyArMTM3NiwxMCBAQAogCW5lb19wY2lfcG9zdGluZ19mbHVzaChjaC0+Y2hfYmQpOwogCiAJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBVQVJUIGZlZWxzIGl0IGNvbXBsZXRlbHkgZmx1c2hlZCB0aGUgRklGTy4gKi8KKwkJLyoKKwkJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBVQVJUIGZlZWxzIGl0IGNvbXBsZXRlbHkgZmx1c2hlZCB0aGUKKwkJICogRklGTy4KKwkJICovCiAJCXRtcCA9IHJlYWRiKCZjaC0+Y2hfbmVvX3VhcnQtPmlzcl9mY3IpOwogCQlpZiAodG1wICYgMikKIAkJCXVkZWxheSgxMCk7CkBAIC0xMzk3LDggKzE0MjQsOSBAQAogCQkJY2gtPmNoX2NhY2hlZF9sc3IgJj0gfihVQVJUX0xTUl9USFJFKTsKIAogCQkJLyoKLQkJCSAqIElmIFJUUyBUb2dnbGUgbW9kZSBpcyBvbiwgdHVybiBvbiBSVFMgbm93IGlmIG5vdCBhbHJlYWR5IHNldCwKLQkJCSAqIGFuZCBtYWtlIHN1cmUgd2UgZ2V0IGFuIGV2ZW50IHdoZW4gdGhlIGRhdGEgdHJhbnNmZXIgaGFzIGNvbXBsZXRlZC4KKwkJCSAqIElmIFJUUyBUb2dnbGUgbW9kZSBpcyBvbiwgdHVybiBvbiBSVFMgbm93IGlmIG5vdAorCQkJICogYWxyZWFkeSBzZXQsIGFuZCBtYWtlIHN1cmUgd2UgZ2V0IGFuIGV2ZW50IHdoZW4gdGhlCisJCQkgKiBkYXRhIHRyYW5zZmVyIGhhcyBjb21wbGV0ZWQuCiAJCQkgKi8KIAkJCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9SVFNfVE9HR0xFKSB7CiAJCQkJaWYgKCEoY2gtPmNoX21vc3RhdCAmIFVBUlRfTUNSX1JUUykpIHsKQEAgLTE0MDgsOCArMTQzNiw5IEBACiAJCQkJY2gtPmNoX3R1bi51bl9mbGFncyB8PSAoVU5fRU1QVFkpOwogCQkJfQogCQkJLyoKLQkJCSAqIElmIERUUiBUb2dnbGUgbW9kZSBpcyBvbiwgdHVybiBvbiBEVFIgbm93IGlmIG5vdCBhbHJlYWR5IHNldCwKLQkJCSAqIGFuZCBtYWtlIHN1cmUgd2UgZ2V0IGFuIGV2ZW50IHdoZW4gdGhlIGRhdGEgdHJhbnNmZXIgaGFzIGNvbXBsZXRlZC4KKwkJCSAqIElmIERUUiBUb2dnbGUgbW9kZSBpcyBvbiwgdHVybiBvbiBEVFIgbm93IGlmIG5vdAorCQkJICogYWxyZWFkeSBzZXQsIGFuZCBtYWtlIHN1cmUgd2UgZ2V0IGFuIGV2ZW50IHdoZW4gdGhlCisJCQkgKiBkYXRhIHRyYW5zZmVyIGhhcyBjb21wbGV0ZWQuCiAJCQkgKi8KIAkJCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9EVFJfVE9HR0xFKSB7CiAJCQkJaWYgKCEoY2gtPmNoX21vc3RhdCAmIFVBUlRfTUNSX0RUUikpIHsKQEAgLTE0NjUsNyArMTQ5NCw4IEBACiAKIAkJLyoKIAkJICogSWYgUlRTIFRvZ2dsZSBtb2RlIGlzIG9uLCB0dXJuIG9uIFJUUyBub3cgaWYgbm90IGFscmVhZHkgc2V0LAotCQkgKiBhbmQgbWFrZSBzdXJlIHdlIGdldCBhbiBldmVudCB3aGVuIHRoZSBkYXRhIHRyYW5zZmVyIGhhcyBjb21wbGV0ZWQuCisJCSAqIGFuZCBtYWtlIHN1cmUgd2UgZ2V0IGFuIGV2ZW50IHdoZW4gdGhlIGRhdGEgdHJhbnNmZXIgaGFzCisJCSAqIGNvbXBsZXRlZC4KIAkJICovCiAJCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9SVFNfVE9HR0xFKSB7CiAJCQlpZiAoIShjaC0+Y2hfbW9zdGF0ICYgVUFSVF9NQ1JfUlRTKSkgewpAQCAtMTQ3Nyw3ICsxNTA3LDggQEAKIAogCQkvKgogCQkgKiBJZiBEVFIgVG9nZ2xlIG1vZGUgaXMgb24sIHR1cm4gb24gRFRSIG5vdyBpZiBub3QgYWxyZWFkeSBzZXQsCi0JCSAqIGFuZCBtYWtlIHN1cmUgd2UgZ2V0IGFuIGV2ZW50IHdoZW4gdGhlIGRhdGEgdHJhbnNmZXIgaGFzIGNvbXBsZXRlZC4KKwkJICogYW5kIG1ha2Ugc3VyZSB3ZSBnZXQgYW4gZXZlbnQgd2hlbiB0aGUgZGF0YSB0cmFuc2ZlciBoYXMKKwkJICogY29tcGxldGVkLgogCQkgKi8KIAkJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX0RUUl9UT0dHTEUpIHsKIAkJCWlmICghKGNoLT5jaF9tb3N0YXQgJiBVQVJUX01DUl9EVFIpKSB7CkBAIC0xNTQxLDcgKzE1NzIsMTAgQEAKIAkJfQogCX0KIAotCS8qIFNjcnViIG9mZiBsb3dlciBiaXRzLiBUaGV5IHNpZ25pZnkgZGVsdGEncywgd2hpY2ggSSBkb24ndCBjYXJlIGFib3V0ICovCisJLyoKKwkgKiBTY3J1YiBvZmYgbG93ZXIgYml0cy4gVGhleSBzaWduaWZ5IGRlbHRhJ3MsIHdoaWNoIEkgZG9uJ3QgY2FyZQorCSAqIGFib3V0CisJICovCiAJbXNpZ25hbHMgJj0gMHhmMDsKIAogCWlmIChtc2lnbmFscyAmIFVBUlRfTVNSX0RDRCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfc3lzZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfc3lzZnMuYwppbmRleCBiOGQ0MWM1Li4yOTBiZjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19zeXNmcy5jCkBAIC0yNSwzMSArMjUsMzEgQEAKICNpbmNsdWRlICJkZ25jX2RyaXZlci5oIgogI2luY2x1ZGUgImRnbmNfbWdtdC5oIgogCi1zdGF0aWMgc3NpemVfdCBkZ25jX2RyaXZlcl92ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgdmVyc2lvbl9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKIHsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgREdfUEFSVCk7CiB9Ci1zdGF0aWMgRFJJVkVSX0FUVFIodmVyc2lvbiwgU19JUlVTUiwgZGduY19kcml2ZXJfdmVyc2lvbl9zaG93LCBOVUxMKTsKK3N0YXRpYyBEUklWRVJfQVRUUl9STyh2ZXJzaW9uKTsKIAotc3RhdGljIHNzaXplX3QgZGduY19kcml2ZXJfYm9hcmRzX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgYm9hcmRzX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQogewogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBkZ25jX251bV9ib2FyZHMpOwogfQotc3RhdGljIERSSVZFUl9BVFRSKGJvYXJkcywgU19JUlVTUiwgZGduY19kcml2ZXJfYm9hcmRzX3Nob3csIE5VTEwpOworc3RhdGljIERSSVZFUl9BVFRSX1JPKGJvYXJkcyk7CiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfZHJpdmVyX21heGJvYXJkc19zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IG1heGJvYXJkc19zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKIHsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgTUFYQk9BUkRTKTsKIH0KLXN0YXRpYyBEUklWRVJfQVRUUihtYXhib2FyZHMsIFNfSVJVU1IsIGRnbmNfZHJpdmVyX21heGJvYXJkc19zaG93LCBOVUxMKTsKK3N0YXRpYyBEUklWRVJfQVRUUl9STyhtYXhib2FyZHMpOwogCi1zdGF0aWMgc3NpemVfdCBkZ25jX2RyaXZlcl9wb2xscmF0ZV9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHBvbGxyYXRlX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQogewogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkbXNcbiIsIGRnbmNfcG9sbF90aWNrKTsKIH0KIAotc3RhdGljIHNzaXplX3QgZGduY19kcml2ZXJfcG9sbHJhdGVfc3RvcmUoc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwKLQkJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHBvbGxyYXRlX3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsCisJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCB0aWNrOwpAQCAtNjUsOCArNjUsNyBAQAogCiAJcmV0dXJuIGNvdW50OwogfQotc3RhdGljIERSSVZFUl9BVFRSKHBvbGxyYXRlLCAoU19JUlVTUiB8IFNfSVdVU1IpLCBkZ25jX2RyaXZlcl9wb2xscmF0ZV9zaG93LAotCQkgICBkZ25jX2RyaXZlcl9wb2xscmF0ZV9zdG9yZSk7CitzdGF0aWMgRFJJVkVSX0FUVFJfUlcocG9sbHJhdGUpOwogCiB2b2lkIGRnbmNfY3JlYXRlX2RyaXZlcl9zeXNmaWxlcyhzdHJ1Y3QgcGNpX2RyaXZlciAqZGduY19kcml2ZXIpCiB7CkBAIC0xMDMsOCArMTAyLDggQEAKIAkJCXJldHVybiAwOwkJCQlcCiAJfSB3aGlsZSAoMCkKIAotc3RhdGljIHNzaXplX3QgZGduY192cGRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgdnBkX3Nob3coc3RydWN0IGRldmljZSAqcCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCiB7CiAJc3RydWN0IGRnbmNfYm9hcmQgKmJkOwogCWludCBjb3VudCA9IDA7CkBAIC0xMjMsMTAgKzEyMiwxMCBAQAogCiAJcmV0dXJuIGNvdW50OwogfQotc3RhdGljIERFVklDRV9BVFRSKHZwZCwgU19JUlVTUiwgZGduY192cGRfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8odnBkKTsKIAotc3RhdGljIHNzaXplX3QgZGduY19zZXJpYWxfbnVtYmVyX3Nob3coc3RydWN0IGRldmljZSAqcCwKLQkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNlcmlhbF9udW1iZXJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJaW50IGNvdW50ID0gMDsKQEAgLTE0MCwxMCArMTM5LDEwIEBACiAKIAlyZXR1cm4gY291bnQ7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIoc2VyaWFsX251bWJlciwgU19JUlVTUiwgZGduY19zZXJpYWxfbnVtYmVyX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHNlcmlhbF9udW1iZXIpOwogCi1zdGF0aWMgc3NpemVfdCBkZ25jX3BvcnRzX3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqcCwKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwb3J0c19zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKnAsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJaW50IGNvdW50ID0gMDsKQEAgLTE1OCwxMCArMTU3LDEwIEBACiAJfQogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19zdGF0ZSwgU19JUlVTUiwgZGduY19wb3J0c19zdGF0ZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwb3J0c19zdGF0ZSk7CiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfcG9ydHNfYmF1ZF9zaG93KHN0cnVjdCBkZXZpY2UgKnAsCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwb3J0c19iYXVkX3Nob3coc3RydWN0IGRldmljZSAqcCwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlpbnQgY291bnQgPSAwOwpAQCAtMTc2LDExICsxNzUsMTAgQEAKIAl9CiAJcmV0dXJuIGNvdW50OwogfQotc3RhdGljIERFVklDRV9BVFRSKHBvcnRzX2JhdWQsIFNfSVJVU1IsIGRnbmNfcG9ydHNfYmF1ZF9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwb3J0c19iYXVkKTsKIAotc3RhdGljIHNzaXplX3QgZGduY19wb3J0c19tc2lnbmFsc19zaG93KHN0cnVjdCBkZXZpY2UgKnAsCi0JCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQljaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwb3J0c19tc2lnbmFsc19zaG93KHN0cnVjdCBkZXZpY2UgKnAsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJaW50IGNvdW50ID0gMDsKQEAgLTIwOCwxMCArMjA2LDEwIEBACiAJfQogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19tc2lnbmFscywgU19JUlVTUiwgZGduY19wb3J0c19tc2lnbmFsc19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwb3J0c19tc2lnbmFscyk7CiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfcG9ydHNfaWZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAotCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHBvcnRzX2lmbGFnX3Nob3coc3RydWN0IGRldmljZSAqcCwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlpbnQgY291bnQgPSAwOwpAQCAtMjI2LDEwICsyMjQsMTAgQEAKIAl9CiAJcmV0dXJuIGNvdW50OwogfQotc3RhdGljIERFVklDRV9BVFRSKHBvcnRzX2lmbGFnLCBTX0lSVVNSLCBkZ25jX3BvcnRzX2lmbGFnX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHBvcnRzX2lmbGFnKTsKIAotc3RhdGljIHNzaXplX3QgZGduY19wb3J0c19jZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKnAsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcG9ydHNfY2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGRnbmNfYm9hcmQgKmJkOwogCWludCBjb3VudCA9IDA7CkBAIC0yNDQsMTAgKzI0MiwxMCBAQAogCX0KIAlyZXR1cm4gY291bnQ7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfY2ZsYWcsIFNfSVJVU1IsIGRnbmNfcG9ydHNfY2ZsYWdfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocG9ydHNfY2ZsYWcpOwogCi1zdGF0aWMgc3NpemVfdCBkZ25jX3BvcnRzX29mbGFnX3Nob3coc3RydWN0IGRldmljZSAqcCwKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwb3J0c19vZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKnAsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJaW50IGNvdW50ID0gMDsKQEAgLTI2MiwxMCArMjYwLDEwIEBACiAJfQogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19vZmxhZywgU19JUlVTUiwgZGduY19wb3J0c19vZmxhZ19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwb3J0c19vZmxhZyk7CiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfcG9ydHNfbGZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAotCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHBvcnRzX2xmbGFnX3Nob3coc3RydWN0IGRldmljZSAqcCwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlpbnQgY291bnQgPSAwOwpAQCAtMjgwLDExICsyNzgsMTAgQEAKIAl9CiAJcmV0dXJuIGNvdW50OwogfQotc3RhdGljIERFVklDRV9BVFRSKHBvcnRzX2xmbGFnLCBTX0lSVVNSLCBkZ25jX3BvcnRzX2xmbGFnX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHBvcnRzX2xmbGFnKTsKIAotc3RhdGljIHNzaXplX3QgZGduY19wb3J0c19kaWdpX2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAotCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwb3J0c19kaWdpX2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlpbnQgY291bnQgPSAwOwpAQCAtMjk5LDEwICsyOTYsMTAgQEAKIAl9CiAJcmV0dXJuIGNvdW50OwogfQotc3RhdGljIERFVklDRV9BVFRSKHBvcnRzX2RpZ2lfZmxhZywgU19JUlVTUiwgZGduY19wb3J0c19kaWdpX2ZsYWdfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocG9ydHNfZGlnaV9mbGFnKTsKIAotc3RhdGljIHNzaXplX3QgZGduY19wb3J0c19yeGNvdW50X3Nob3coc3RydWN0IGRldmljZSAqcCwKLQkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHBvcnRzX3J4Y291bnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJaW50IGNvdW50ID0gMDsKQEAgLTMxNywxMCArMzE0LDEwIEBACiAJfQogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19yeGNvdW50LCBTX0lSVVNSLCBkZ25jX3BvcnRzX3J4Y291bnRfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocG9ydHNfcnhjb3VudCk7CiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfcG9ydHNfdHhjb3VudF9zaG93KHN0cnVjdCBkZXZpY2UgKnAsCi0JCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwb3J0c190eGNvdW50X3Nob3coc3RydWN0IGRldmljZSAqcCwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGRnbmNfYm9hcmQgKmJkOwogCWludCBjb3VudCA9IDA7CkBAIC0zMzUsNyArMzMyLDcgQEAKIAl9CiAJcmV0dXJuIGNvdW50OwogfQotc3RhdGljIERFVklDRV9BVFRSKHBvcnRzX3R4Y291bnQsIFNfSVJVU1IsIGRnbmNfcG9ydHNfdHhjb3VudF9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwb3J0c190eGNvdW50KTsKIAogLyogdGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRoZSBzeXMgZmlsZXMgdGhhdCB3aWxsIGV4cG9ydCBlYWNoIHNpZ25hbCBzdGF0dXMKICAqIHRvIHN5c2ZzIGVhY2ggdmFsdWUgd2lsbCBiZSBwdXQgaW4gYSBzZXBhcmF0ZSBmaWxlbmFtZQpAQCAtMzc4LDggKzM3NSw4IEBACiAJZGV2aWNlX3JlbW92ZV9maWxlKCZiZC0+cGRldi0+ZGV2LCAmZGV2X2F0dHJfc2VyaWFsX251bWJlcik7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfdHR5X3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZCwKLQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgdHR5X3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZCwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGRnbmNfYm9hcmQgKmJkOwogCXN0cnVjdCBjaGFubmVsX3QgKmNoOwpAQCAtNDAyLDEwICszOTksMTAgQEAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyIsCiAJCQl1bi0+dW5fb3Blbl9jb3VudCA/ICJPcGVuIiA6ICJDbG9zZWQiKTsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihzdGF0ZSwgU19JUlVTUiwgZGduY190dHlfc3RhdGVfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8odHR5X3N0YXRlKTsKIAotc3RhdGljIHNzaXplX3QgZGduY190dHlfYmF1ZF9zaG93KHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgdHR5X2JhdWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKQEAgLTQyNywxMCArNDI0LDEwIEBACiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgY2gtPmNoX29sZF9iYXVkKTsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihiYXVkLCBTX0lSVVNSLCBkZ25jX3R0eV9iYXVkX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHR0eV9iYXVkKTsKIAotc3RhdGljIHNzaXplX3QgZGduY190dHlfbXNpZ25hbHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCB0dHlfbXNpZ25hbHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKQEAgLTQ2MSwxMCArNDU4LDEwIEBACiAJfQogCXJldHVybiAwOwogfQotc3RhdGljIERFVklDRV9BVFRSKG1zaWduYWxzLCBTX0lSVVNSLCBkZ25jX3R0eV9tc2lnbmFsc19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyh0dHlfbXNpZ25hbHMpOwogCi1zdGF0aWMgc3NpemVfdCBkZ25jX3R0eV9pZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHR0eV9pZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKQEAgLTQ4NiwxMCArNDgzLDEwIEBACiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2NfaWZsYWcpOwogfQotc3RhdGljIERFVklDRV9BVFRSKGlmbGFnLCBTX0lSVVNSLCBkZ25jX3R0eV9pZmxhZ19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyh0dHlfaWZsYWcpOwogCi1zdGF0aWMgc3NpemVfdCBkZ25jX3R0eV9jZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHR0eV9jZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKQEAgLTUxMSwxMCArNTA4LDEwIEBACiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2NfY2ZsYWcpOwogfQotc3RhdGljIERFVklDRV9BVFRSKGNmbGFnLCBTX0lSVVNSLCBkZ25jX3R0eV9jZmxhZ19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyh0dHlfY2ZsYWcpOwogCi1zdGF0aWMgc3NpemVfdCBkZ25jX3R0eV9vZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHR0eV9vZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKQEAgLTUzNiwxMCArNTMzLDEwIEBACiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2Nfb2ZsYWcpOwogfQotc3RhdGljIERFVklDRV9BVFRSKG9mbGFnLCBTX0lSVVNSLCBkZ25jX3R0eV9vZmxhZ19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyh0dHlfb2ZsYWcpOwogCi1zdGF0aWMgc3NpemVfdCBkZ25jX3R0eV9sZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHR0eV9sZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKQEAgLTU2MSwxMCArNTU4LDEwIEBACiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2NfbGZsYWcpOwogfQotc3RhdGljIERFVklDRV9BVFRSKGxmbGFnLCBTX0lSVVNSLCBkZ25jX3R0eV9sZmxhZ19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyh0dHlfbGZsYWcpOwogCi1zdGF0aWMgc3NpemVfdCBkZ25jX3R0eV9kaWdpX2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgdHR5X2RpZ2lfZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKQEAgLTU4NiwxMCArNTgzLDEwIEBACiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyk7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGlnaV9mbGFnLCBTX0lSVVNSLCBkZ25jX3R0eV9kaWdpX2ZsYWdfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8odHR5X2RpZ2lfZmxhZyk7CiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfdHR5X3J4Y291bnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHR0eV9yeGNvdW50X3Nob3coc3RydWN0IGRldmljZSAqZCwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKQEAgLTYxMSwxMCArNjA4LDEwIEBACiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGRcbiIsIGNoLT5jaF9yeGNvdW50KTsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihyeGNvdW50LCBTX0lSVVNSLCBkZ25jX3R0eV9yeGNvdW50X3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHR0eV9yeGNvdW50KTsKIAotc3RhdGljIHNzaXplX3QgZGduY190dHlfdHhjb3VudF9zaG93KHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgdHR5X3R4Y291bnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGRnbmNfYm9hcmQgKmJkOwogCXN0cnVjdCBjaGFubmVsX3QgKmNoOwpAQCAtNjM2LDEwICs2MzMsMTAgQEAKIAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsZFxuIiwgY2gtPmNoX3R4Y291bnQpOwogfQotc3RhdGljIERFVklDRV9BVFRSKHR4Y291bnQsIFNfSVJVU1IsIGRnbmNfdHR5X3R4Y291bnRfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8odHR5X3R4Y291bnQpOwogCi1zdGF0aWMgc3NpemVfdCBkZ25jX3R0eV9uYW1lX3Nob3coc3RydWN0IGRldmljZSAqZCwKLQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCB0dHlfY3VzdG9tX25hbWVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKQEAgLTY2MywyNCArNjYwLDI0IEBACiAJCSh1bi0+dW5fdHlwZSA9PSBER05DX1BSSU5UKSA/ICJwciIgOiAidHR5IiwKIAkJYmQtPmJvYXJkbnVtICsgMSwgJ2EnICsgY2gtPmNoX3BvcnRudW0pOwogfQotc3RhdGljIERFVklDRV9BVFRSKGN1c3RvbV9uYW1lLCBTX0lSVVNSLCBkZ25jX3R0eV9uYW1lX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHR0eV9jdXN0b21fbmFtZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkZ25jX3N5c2ZzX3R0eV9lbnRyaWVzW10gPSB7Ci0JJmRldl9hdHRyX3N0YXRlLmF0dHIsCi0JJmRldl9hdHRyX2JhdWQuYXR0ciwKLQkmZGV2X2F0dHJfbXNpZ25hbHMuYXR0ciwKLQkmZGV2X2F0dHJfaWZsYWcuYXR0ciwKLQkmZGV2X2F0dHJfY2ZsYWcuYXR0ciwKLQkmZGV2X2F0dHJfb2ZsYWcuYXR0ciwKLQkmZGV2X2F0dHJfbGZsYWcuYXR0ciwKLQkmZGV2X2F0dHJfZGlnaV9mbGFnLmF0dHIsCi0JJmRldl9hdHRyX3J4Y291bnQuYXR0ciwKLQkmZGV2X2F0dHJfdHhjb3VudC5hdHRyLAotCSZkZXZfYXR0cl9jdXN0b21fbmFtZS5hdHRyLAorCSZkZXZfYXR0cl90dHlfc3RhdGUuYXR0ciwKKwkmZGV2X2F0dHJfdHR5X2JhdWQuYXR0ciwKKwkmZGV2X2F0dHJfdHR5X21zaWduYWxzLmF0dHIsCisJJmRldl9hdHRyX3R0eV9pZmxhZy5hdHRyLAorCSZkZXZfYXR0cl90dHlfY2ZsYWcuYXR0ciwKKwkmZGV2X2F0dHJfdHR5X29mbGFnLmF0dHIsCisJJmRldl9hdHRyX3R0eV9sZmxhZy5hdHRyLAorCSZkZXZfYXR0cl90dHlfZGlnaV9mbGFnLmF0dHIsCisJJmRldl9hdHRyX3R0eV9yeGNvdW50LmF0dHIsCisJJmRldl9hdHRyX3R0eV90eGNvdW50LmF0dHIsCisJJmRldl9hdHRyX3R0eV9jdXN0b21fbmFtZS5hdHRyLAogCU5VTEwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGRnbmNfdHR5X2F0dHJpYnV0ZV9ncm91cCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGRnbmNfdHR5X2F0dHJpYnV0ZV9ncm91cCA9IHsKIAkubmFtZSA9IE5VTEwsCiAJLmF0dHJzID0gZGduY19zeXNmc190dHlfZW50cmllcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R0eS5jIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190dHkuYwppbmRleCA0ZWVlY2M5Li45NTNkOTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R0eS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdHR5LmMKQEAgLTQ1LDcgKzQ1LDYgQEAKIC8qCiAgKiBpbnRlcm5hbCB2YXJpYWJsZXMKICAqLwotc3RhdGljIHN0cnVjdCBkZ25jX2JvYXJkCSpkZ25jX0JvYXJkc0J5TWFqb3JbMjU2XTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyCQkqZGduY19UbXBXcml0ZUJ1ZjsKIAogLyoKQEAgLTEwMCw3ICs5OSw3IEBACiBzdGF0aWMgdm9pZCBkZ25jX3R0eV9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIHN0YXRpYyB2b2lkIGRnbmNfdHR5X2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIHN0YXRpYyB2b2lkIGRnbmNfdHR5X2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyBpbnQgZGduY19zZXRfbW9kZW1faW5mbyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBpbnQgY29tbWFuZCwKK3N0YXRpYyBpbnQgZGduY19zZXRfbW9kZW1faW5mbyhzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdW5zaWduZWQgaW50IGNvbW1hbmQsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IF9fdXNlciAqdmFsdWUpOwogc3RhdGljIGludCBkZ25jX2dldF9tb2RlbV9pbmZvKHN0cnVjdCBjaGFubmVsX3QgKmNoLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBfX3VzZXIgKnZhbHVlKTsKQEAgLTE4Niw3ICsxODUsOCBAQAogCWlmIChJU19FUlIoYnJkLT5zZXJpYWxfZHJpdmVyKSkKIAkJcmV0dXJuIFBUUl9FUlIoYnJkLT5zZXJpYWxfZHJpdmVyKTsKIAotCXNucHJpbnRmKGJyZC0+c2VyaWFsX25hbWUsIE1BWFRUWU5BTUVMRU4sICJ0dHlfZGduY18lZF8iLCBicmQtPmJvYXJkbnVtKTsKKwlzbnByaW50ZihicmQtPnNlcmlhbF9uYW1lLCBNQVhUVFlOQU1FTEVOLCAidHR5X2RnbmNfJWRfIiwKKwkJIGJyZC0+Ym9hcmRudW0pOwogCiAJYnJkLT5zZXJpYWxfZHJpdmVyLT5uYW1lID0gYnJkLT5zZXJpYWxfbmFtZTsKIAlicmQtPnNlcmlhbF9kcml2ZXItPm5hbWVfYmFzZSA9IDA7CkBAIC0yMDMsMTUgKzIwMywxMSBAQAogCSAqLwogCXR0eV9zZXRfb3BlcmF0aW9ucyhicmQtPnNlcmlhbF9kcml2ZXIsICZkZ25jX3R0eV9vcHMpOwogCi0JaWYgKCFicmQtPmRnbmNfbWFqb3Jfc2VyaWFsX3JlZ2lzdGVyZWQpIHsKLQkJLyogUmVnaXN0ZXIgdHR5IGRldmljZXMgKi8KLQkJcmMgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKGJyZC0+c2VyaWFsX2RyaXZlcik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCWRldl9kYmcoJmJyZC0+cGRldi0+ZGV2LAotCQkJCSJDYW4ndCByZWdpc3RlciB0dHkgZGV2aWNlICglZClcbiIsIHJjKTsKLQkJCWdvdG8gZnJlZV9zZXJpYWxfZHJpdmVyOwotCQl9Ci0JCWJyZC0+ZGduY19tYWpvcl9zZXJpYWxfcmVnaXN0ZXJlZCA9IHRydWU7CisJcmMgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKGJyZC0+c2VyaWFsX2RyaXZlcik7CisJaWYgKHJjIDwgMCkgeworCQlkZXZfZGJnKCZicmQtPnBkZXYtPmRldiwKKwkJCSJDYW4ndCByZWdpc3RlciB0dHkgZGV2aWNlICglZClcbiIsIHJjKTsKKwkJZ290byBmcmVlX3NlcmlhbF9kcml2ZXI7CiAJfQogCiAJLyoKQEAgLTI0NiwyMCArMjQyLDE0IEBACiAJICovCiAJdHR5X3NldF9vcGVyYXRpb25zKGJyZC0+cHJpbnRfZHJpdmVyLCAmZGduY190dHlfb3BzKTsKIAotCWlmICghYnJkLT5kZ25jX21ham9yX3RyYW5zcGFyZW50X3ByaW50X3JlZ2lzdGVyZWQpIHsKLQkJLyogUmVnaXN0ZXIgVHJhbnNwYXJlbnQgUHJpbnQgZGV2aWNlcyAqLwotCQlyYyA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoYnJkLT5wcmludF9kcml2ZXIpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlkZXZfZGJnKCZicmQtPnBkZXYtPmRldiwKLQkJCQkiQ2FuJ3QgcmVnaXN0ZXIgVHJhbnNwYXJlbnQgUHJpbnQgZGV2aWNlKCVkKVxuIiwKLQkJCQlyYyk7Ci0JCQlnb3RvIGZyZWVfcHJpbnRfZHJpdmVyOwotCQl9Ci0JCWJyZC0+ZGduY19tYWpvcl90cmFuc3BhcmVudF9wcmludF9yZWdpc3RlcmVkID0gdHJ1ZTsKKwlyYyA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoYnJkLT5wcmludF9kcml2ZXIpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2RiZygmYnJkLT5wZGV2LT5kZXYsCisJCQkiQ2FuJ3QgcmVnaXN0ZXIgVHJhbnNwYXJlbnQgUHJpbnQgZGV2aWNlKCVkKVxuIiwKKwkJCXJjKTsKKwkJZ290byBmcmVlX3ByaW50X2RyaXZlcjsKIAl9CiAKLQlkZ25jX0JvYXJkc0J5TWFqb3JbYnJkLT5zZXJpYWxfZHJpdmVyLT5tYWpvcl0gPSBicmQ7Ci0KIAlyZXR1cm4gMDsKIAogZnJlZV9wcmludF9kcml2ZXI6CkBAIC0yNzIsNiArMjYyLDE0IEBACiAJcmV0dXJuIHJjOwogfQogCit2b2lkIGRnbmNfdHR5X3VucmVnaXN0ZXIoc3RydWN0IGRnbmNfYm9hcmQgKmJyZCkKK3sKKwl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoYnJkLT5wcmludF9kcml2ZXIpOworCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihicmQtPnNlcmlhbF9kcml2ZXIpOworCXB1dF90dHlfZHJpdmVyKGJyZC0+cHJpbnRfZHJpdmVyKTsKKwlwdXRfdHR5X2RyaXZlcihicmQtPnNlcmlhbF9kcml2ZXIpOworfQorCiAvKgogICogZGduY190dHlfaW5pdCgpCiAgKgpAQCAtMzc4LDM4ICszNzYsMzAgQEAKIH0KIAogLyoKLSAqIGRnbmNfdHR5X3VuaW5pdCgpCisgKiBkZ25jX2NsZWFudXBfdHR5KCkKICAqCiAgKiBVbmluaXRpYWxpemUgdGhlIFRUWSBwb3J0aW9uIG9mIHRoaXMgZHJpdmVyLiAgRnJlZSBhbGwgbWVtb3J5IGFuZAogICogcmVzb3VyY2VzLgogICovCi12b2lkIGRnbmNfdHR5X3VuaW5pdChzdHJ1Y3QgZGduY19ib2FyZCAqYnJkKQordm9pZCBkZ25jX2NsZWFudXBfdHR5KHN0cnVjdCBkZ25jX2JvYXJkICpicmQpCiB7CiAJaW50IGkgPSAwOwogCi0JaWYgKGJyZC0+ZGduY19tYWpvcl9zZXJpYWxfcmVnaXN0ZXJlZCkgewotCQlkZ25jX0JvYXJkc0J5TWFqb3JbYnJkLT5zZXJpYWxfZHJpdmVyLT5tYWpvcl0gPSBOVUxMOwotCQlmb3IgKGkgPSAwOyBpIDwgYnJkLT5uYXN5bmM7IGkrKykgewotCQkJaWYgKGJyZC0+Y2hhbm5lbHNbaV0pCi0JCQkJZGduY19yZW1vdmVfdHR5X3N5c2ZzKGJyZC0+Y2hhbm5lbHNbaV0tPgotCQkJCQkJICAgICAgY2hfdHVuLnVuX3N5c2ZzKTsKLQkJCXR0eV91bnJlZ2lzdGVyX2RldmljZShicmQtPnNlcmlhbF9kcml2ZXIsIGkpOwotCQl9Ci0JCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihicmQtPnNlcmlhbF9kcml2ZXIpOwotCQlicmQtPmRnbmNfbWFqb3Jfc2VyaWFsX3JlZ2lzdGVyZWQgPSBmYWxzZTsKKwlmb3IgKGkgPSAwOyBpIDwgYnJkLT5uYXN5bmM7IGkrKykgeworCQlpZiAoYnJkLT5jaGFubmVsc1tpXSkKKwkJCWRnbmNfcmVtb3ZlX3R0eV9zeXNmcyhicmQtPmNoYW5uZWxzW2ldLT4KKwkJCQkJICAgICAgY2hfdHVuLnVuX3N5c2ZzKTsKKwkJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKGJyZC0+c2VyaWFsX2RyaXZlciwgaSk7CiAJfQorCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihicmQtPnNlcmlhbF9kcml2ZXIpOwogCi0JaWYgKGJyZC0+ZGduY19tYWpvcl90cmFuc3BhcmVudF9wcmludF9yZWdpc3RlcmVkKSB7Ci0JCWRnbmNfQm9hcmRzQnlNYWpvclticmQtPnByaW50X2RyaXZlci0+bWFqb3JdID0gTlVMTDsKLQkJZm9yIChpID0gMDsgaSA8IGJyZC0+bmFzeW5jOyBpKyspIHsKLQkJCWlmIChicmQtPmNoYW5uZWxzW2ldKQotCQkJCWRnbmNfcmVtb3ZlX3R0eV9zeXNmcyhicmQtPmNoYW5uZWxzW2ldLT4KLQkJCQkJCSAgICAgIGNoX3B1bi51bl9zeXNmcyk7Ci0JCQl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UoYnJkLT5wcmludF9kcml2ZXIsIGkpOwotCQl9Ci0JCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihicmQtPnByaW50X2RyaXZlcik7Ci0JCWJyZC0+ZGduY19tYWpvcl90cmFuc3BhcmVudF9wcmludF9yZWdpc3RlcmVkID0gZmFsc2U7CisJZm9yIChpID0gMDsgaSA8IGJyZC0+bmFzeW5jOyBpKyspIHsKKwkJaWYgKGJyZC0+Y2hhbm5lbHNbaV0pCisJCQlkZ25jX3JlbW92ZV90dHlfc3lzZnMoYnJkLT5jaGFubmVsc1tpXS0+CisJCQkJCSAgICAgIGNoX3B1bi51bl9zeXNmcyk7CisJCXR0eV91bnJlZ2lzdGVyX2RldmljZShicmQtPnByaW50X2RyaXZlciwgaSk7CiAJfQorCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihicmQtPnByaW50X2RyaXZlcik7CiAKIAlwdXRfdHR5X2RyaXZlcihicmQtPnNlcmlhbF9kcml2ZXIpOwogCXB1dF90dHlfZHJpdmVyKGJyZC0+cHJpbnRfZHJpdmVyKTsKQEAgLTY0MCwxOSArNjMwLDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBkZ25jX2NhcnJpZXIoc3RydWN0IGNoYW5uZWxfdCAqY2gpCiB7Ci0Jc3RydWN0IGRnbmNfYm9hcmQgKmJkOwotCiAJaW50IHZpcnRfY2FycmllciA9IDA7CiAJaW50IHBoeXNfY2FycmllciA9IDA7CiAKIAlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER05DX0NIQU5ORUxfTUFHSUMpCiAJCXJldHVybjsKIAotCWJkID0gY2gtPmNoX2JkOwotCi0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdOQ19CT0FSRF9NQUdJQykKLQkJcmV0dXJuOwotCiAJaWYgKGNoLT5jaF9taXN0YXQgJiBVQVJUX01TUl9EQ0QpCiAJCXBoeXNfY2FycmllciA9IDE7CiAKQEAgLTk0Nyw2ICs5MzAsMjQgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwogfQogCitzdHJ1Y3QgZGduY19ib2FyZCAqZmluZF9ib2FyZF9ieV9tYWpvcih1bnNpZ25lZCBpbnQgbWFqb3IpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYQk9BUkRTOyBpKyspIHsKKwkJc3RydWN0IGRnbmNfYm9hcmQgKmJyZCA9IGRnbmNfYm9hcmRbaV07CisKKwkJaWYgKCFicmQpCisJCQlyZXR1cm4gTlVMTDsKKworCQlpZiAobWFqb3IgPT0gYnJkLT5zZXJpYWxfZHJpdmVyLT5tYWpvciB8fAorCQkgICAgbWFqb3IgPT0gYnJkLT5wcmludF9kcml2ZXItPm1ham9yKQorCQkJcmV0dXJuIGJyZDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFRUWSBFbnRyeSBwb2ludHMgYW5kIGhlbHBlciBmdW5jdGlvbnMKQEAgLTk3Niw3ICs5NzcsNyBAQAogCQlyZXR1cm4gLUVOWElPOwogCiAJLyogR2V0IGJvYXJkIHBvaW50ZXIgZnJvbSBvdXIgYXJyYXkgb2YgbWFqb3JzIHdlIGhhdmUgYWxsb2NhdGVkICovCi0JYnJkID0gZGduY19Cb2FyZHNCeU1ham9yW21ham9yXTsKKwlicmQgPSBmaW5kX2JvYXJkX2J5X21ham9yKG1ham9yKTsKIAlpZiAoIWJyZCkKIAkJcmV0dXJuIC1FTlhJTzsKIApAQCAtMTE3MiwxNyArMTE3MywxMiBAQAogCQkJCXN0cnVjdCBjaGFubmVsX3QgKmNoKQogewogCWludCByZXR2YWwgPSAwOwotCXN0cnVjdCB1bl90ICp1biA9IE5VTEw7CisJc3RydWN0IHVuX3QgKnVuID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVpbnQJb2xkX2ZsYWdzID0gMDsKIAlpbnQJc2xlZXBfb25fdW5fZmxhZ3MgPSAwOwogCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMgfHwgIWZpbGUgfHwgIWNoIHx8Ci0JICAgIGNoLT5tYWdpYyAhPSBER05DX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAtRU5YSU87Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdOQ19VTklUX01BR0lDKQorCWlmICghZmlsZSkKIAkJcmV0dXJuIC1FTlhJTzsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwpAQCAtMTMwMSwxNSArMTI5Nyw5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGRnbmNfdHR5X2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCB1bl90CSp1bjsKLQogCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQogCQlyZXR1cm47CiAKLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdOQ19VTklUX01BR0lDKQotCQlyZXR1cm47Ci0KIAkvKiBmbHVzaCB0aGUgdHJhbnNtaXQgcXVldWVzICovCiAJZGduY190dHlfZmx1c2hfYnVmZmVyKHR0eSk7CiB9CkBAIC0xNTEwLDE4ICsxNTAwLDggQEAKICAqIHJldHVybnMgdGhlIG5ldyBieXRlc19hdmFpbGFibGUuICBUaGlzIG9ubHkgYWZmZWN0cyBwcmludGVyCiAgKiBvdXRwdXQuCiAgKi8KLXN0YXRpYyBpbnQgZGduY19tYXhjcHNfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnl0ZXNfYXZhaWxhYmxlKQorc3RhdGljIGludCBkZ25jX21heGNwc19yb29tKHN0cnVjdCBjaGFubmVsX3QgKmNoLCBpbnQgYnl0ZXNfYXZhaWxhYmxlKQogewotCXN0cnVjdCB1bl90ICp1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2ggPSB1bi0+dW5fY2g7Ci0KLQkvKgotCSAqIElmIGl0cyBub3QgdGhlIFRyYW5zcGFyZW50IHByaW50IGRldmljZSwgcmV0dXJuCi0JICogdGhlIGZ1bGwgZGF0YSBhbW91bnQuCi0JICovCi0JaWYgKHVuLT51bl90eXBlICE9IERHTkNfUFJJTlQpCi0JCXJldHVybiBieXRlc19hdmFpbGFibGU7Ci0KIAlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9tYXhjcHMgPiAwICYmIGNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZSA+IDApIHsKIAkJaW50IGNwc19saW1pdCA9IDA7CiAJCXVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lID0gamlmZmllczsKQEAgLTE1ODUsNyArMTU2NSw4IEBACiAJCXJldCArPSBXUVVFVUVTSVpFOwogCiAJLyogTGltaXQgcHJpbnRlciB0byBtYXhjcHMgKi8KLQlyZXQgPSBkZ25jX21heGNwc19yb29tKHR0eSwgcmV0KTsKKwlpZiAodW4tPnVuX3R5cGUgIT0gREdOQ19QUklOVCkKKwkJcmV0ID0gZGduY19tYXhjcHNfcm9vbShjaCwgcmV0KTsKIAogCS8qCiAJICogSWYgd2UgYXJlIHByaW50ZXIgZGV2aWNlLCBsZWF2ZSBzcGFjZSBmb3IKQEAgLTE2NzcsNyArMTY1OCw4IEBACiAJICogTGltaXQgcHJpbnRlciBvdXRwdXQgdG8gbWF4Y3BzIG92ZXJhbGwsIHdpdGggYnVyc3RzIGFsbG93ZWQKIAkgKiB1cCB0byBidWZzaXplIGNoYXJhY3RlcnMuCiAJICovCi0JYnVmY291bnQgPSBkZ25jX21heGNwc19yb29tKHR0eSwgYnVmY291bnQpOworCWlmICh1bi0+dW5fdHlwZSAhPSBER05DX1BSSU5UKQorCQlidWZjb3VudCA9IGRnbmNfbWF4Y3BzX3Jvb20oY2gsIGJ1ZmNvdW50KTsKIAogCS8qCiAJICogVGFrZSBtaW5pbXVtIG9mIHdoYXQgdGhlIHVzZXIgd2FudHMgdG8gc2VuZCwgYW5kIHRoZQpAQCAtMTk4NCw3ICsxOTY2LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGRnbmNfZ2V0X21zdGF0KHN0cnVjdCBjaGFubmVsX3QgKmNoKQogewogCXVuc2lnbmVkIGNoYXIgbXN0YXQ7Ci0JaW50IHJlc3VsdCA9IC1FSU87CisJaW50IHJlc3VsdCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHTkNfQ0hBTk5FTF9NQUdJQykKQEAgLTE5OTYsOCArMTk3OCw2IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwogCi0JcmVzdWx0ID0gMDsKLQogCWlmIChtc3RhdCAmIFVBUlRfTUNSX0RUUikKIAkJcmVzdWx0IHw9IFRJT0NNX0RUUjsKIAlpZiAobXN0YXQgJiBVQVJUX01DUl9SVFMpCkBAIC0yMDI4LDMyICsyMDA4LDE0IEBACiAgKgogICogU2V0IG1vZGVtIHNpZ25hbHMsIGNhbGxlZCBieSBsZC4KICAqLwotc3RhdGljIGludCBkZ25jX3NldF9tb2RlbV9pbmZvKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCitzdGF0aWMgaW50IGRnbmNfc2V0X21vZGVtX2luZm8oc3RydWN0IGNoYW5uZWxfdCAqY2gsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGNvbW1hbmQsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IF9fdXNlciAqdmFsdWUpCiB7Ci0Jc3RydWN0IGRnbmNfYm9hcmQgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKIAlpbnQgcmV0ID0gLUVOWElPOwogCXVuc2lnbmVkIGludCBhcmcgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER05DX1VOSVRfTUFHSUMpCi0JCXJldHVybiByZXQ7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER05DX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiByZXQ7Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER05DX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCiAJcmV0ID0gZ2V0X3VzZXIoYXJnLCB2YWx1ZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTI1OTMsOSArMjU1NSw4IEBACiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKIAotCQlyYyA9IHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwKLQkJCSAgICAgICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZyk7Ci0JCXJldHVybiByYzsKKwkJcmV0dXJuIHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwKKwkJCQkodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcpOwogCiAJY2FzZSBUSU9DU1NPRlRDQVI6CiAKQEAgLTI2MjAsNyArMjU4MSw3IEBACiAJY2FzZSBUSU9DTUJJQzoKIAljYXNlIFRJT0NNU0VUOgogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gZGduY19zZXRfbW9kZW1faW5mbyh0dHksIGNtZCwgdWFyZyk7CisJCXJldHVybiBkZ25jX3NldF9tb2RlbV9pbmZvKGNoLCBjbWQsIHVhcmcpOwogCiAJCS8qCiAJCSAqIEhlcmUgYXJlIGFueSBhZGRpdGlvbmFsIGlvY3RsJ3MgdGhhdCB3ZSB3YW50IHRvIGltcGxlbWVudApAQCAtMjc2Niw4ICsyNzI3LDggQEAKIAogCWNhc2UgRElHSV9HRVRDVVNUT01CQVVEOgogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotCQlyYyA9IHB1dF91c2VyKGNoLT5jaF9jdXN0b21fc3BlZWQsICh1bnNpZ25lZCBpbnQgX191c2VyICopYXJnKTsKLQkJcmV0dXJuIHJjOworCQlyZXR1cm4gcHV0X3VzZXIoY2gtPmNoX2N1c3RvbV9zcGVlZCwKKwkJCQkodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7CiAKIAljYXNlIERJR0lfU0VUQ1VTVE9NQkFVRDoKIAl7CkBAIC0yODUzLDggKzI4MTQsNyBAQAogCQkJZXZlbnRzIHw9IChFVl9JUFUgfCBFVl9JUFMpOwogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gcHV0X3VzZXIoZXZlbnRzLCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7Ci0JCXJldHVybiByYzsKKwkJcmV0dXJuIHB1dF91c2VyKGV2ZW50cywgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpOwogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R0eS5oIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190dHkuaAppbmRleCAyMWQzMzY5Li4yNGM5YTQxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190dHkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R0eS5oCkBAIC0xOSwxMiArMTksMTMgQEAKICNpbmNsdWRlICJkZ25jX2RyaXZlci5oIgogCiBpbnQJZGduY190dHlfcmVnaXN0ZXIoc3RydWN0IGRnbmNfYm9hcmQgKmJyZCk7Cit2b2lkIGRnbmNfdHR5X3VucmVnaXN0ZXIoc3RydWN0IGRnbmNfYm9hcmQgKmJyZCk7CiAKIGludAlkZ25jX3R0eV9wcmVpbml0KHZvaWQpOwogaW50ICAgICBkZ25jX3R0eV9pbml0KHN0cnVjdCBkZ25jX2JvYXJkICopOwogCiB2b2lkCWRnbmNfdHR5X3Bvc3RfdW5pbml0KHZvaWQpOwotdm9pZAlkZ25jX3R0eV91bmluaXQoc3RydWN0IGRnbmNfYm9hcmQgKik7Cit2b2lkCWRnbmNfY2xlYW51cF90dHkoc3RydWN0IGRnbmNfYm9hcmQgKik7CiAKIHZvaWQJZGduY19pbnB1dChzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7CiB2b2lkCWRnbmNfY2FycmllcihzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZW14eF91ZGMvZW14eF91ZGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9lbXh4X3VkYy9lbXh4X3VkYy5jCmluZGV4IDNiNTZiMjguLmMzZTI5ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lbXh4X3VkYy9lbXh4X3VkYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lbXh4X3VkYy9lbXh4X3VkYy5jCkBAIC0xMzEsNyArMTMxLDYgQEAKIAkJcmVnX2RhdGEgPSAgX25idTJzc19yZWFkbCgKIAkJCSh1MzIgKilJT19BRERSRVNTKFVTQl9CQVNFX0FERFJFU1MgKyBpICsgMTIpKTsKIAkJZGV2X2RiZygmdWRjLT5kZXYsICIgJTA4eFxuIiwgKGludClyZWdfZGF0YSk7Ci0KIAl9CiAKIAlzcGluX2xvY2soJnVkYy0+bG9jayk7CkBAIC00NzgsOSArNDc3LDkgQEAKICkKIHsKIAlpZiAocmVxLT5yZXEuZG1hID09IERNQV9BRERSX0lOVkFMSUQpIHsKLQkJaWYgKHJlcS0+dW5hbGlnbmVkKQorCQlpZiAocmVxLT51bmFsaWduZWQpIHsKIAkJCXJlcS0+cmVxLmRtYSA9IGVwLT5waHlzX2J1ZjsKLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQlyZXEtPnJlcS5kbWEgPSBkbWFfbWFwX3NpbmdsZSgKIAkJCQl1ZGMtPmdhZGdldC5kZXYucGFyZW50LAogCQkJCXJlcS0+cmVxLmJ1ZiwKQEAgLTEyMzYsOSArMTIzNSw5IEBACiAJcmVxLT5kbWFfZmxhZyA9IEZBTFNFOwogCXJlcS0+ZGl2X2xlbiA9IDA7CiAKLQlpZiAocmVxLT5yZXEubGVuZ3RoID09IDApCisJaWYgKHJlcS0+cmVxLmxlbmd0aCA9PSAwKSB7CiAJCXJlcS0+emVybyA9IGZhbHNlOwotCWVsc2UgeworCX0gZWxzZSB7CiAJCWlmICgocmVxLT5yZXEubGVuZ3RoICUgZXAtPmVwLm1heHBhY2tldCkgPT0gMCkKIAkJCXJlcS0+emVybyA9IHJlcS0+cmVxLnplcm87CiAJCWVsc2UKQEAgLTE5NDEsOSArMTk0MCw5IEBACiAJaWYgKGxpa2VseShyZXEtPnJlcS5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSkKIAkJcmVxLT5yZXEuc3RhdHVzID0gc3RhdHVzOwogCi0JaWYgKGVwLT5zdGFsbGVkKQorCWlmIChlcC0+c3RhbGxlZCkgewogCQlfbmJ1MnNzX2Vwbl9zZXRfc3RhbGwodWRjLCBlcCk7Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJaWYgKCFsaXN0X2VtcHR5KCZlcC0+cXVldWUpKQogCQkJX25idTJzc19yZXN0ZXJ0X3RyYW5zZmVyKGVwKTsKIAl9CkBAIC0yMjY0LDkgKzIyNjMsNyBAQAogCWlmICh1ZGMtPnVkY19lbmFibGVkKQogCQlyZXR1cm4gMDsKIAotCS8qCi0JCVJlc2V0Ci0JKi8KKwkvKiBSZXNldCAqLwogCV9uYnUyc3NfYml0c2V0KCZ1ZGMtPnBfcmVncy0+RVBDVFIsIChESVJQRCB8IEVQQ19SU1QpKTsKIAl1ZGVsYXkoRVBDX1JTVF9ESVNBQkxFX1RJTUUpOwkvKiAxdXMgd2FpdCAqLwogCkBAIC0yNDc2LDggKzI0NzMsOSBAQAogCQkJX25idTJzc193cml0ZWwoJnByZWctPlVTQl9JTlRfU1RBLCB+VVNCX0lOVF9TVEFfUlcpOwogCQkJX25idTJzc193cml0ZWwoJnByZWctPlVTQl9JTlRfRU5BLCAwKTsKIAkJCXN0YXR1cyA9IDA7Ci0JCX0gZWxzZQorCQl9IGVsc2UgewogCQkJc3RhdHVzID0gX25idTJzc19yZWFkbCgmcHJlZy0+VVNCX0lOVF9TVEEpOworCQl9CiAKIAkJaWYgKHN0YXR1cyA9PSAwKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZW14eF91ZGMvZW14eF91ZGMuaCBiL2RyaXZlcnMvc3RhZ2luZy9lbXh4X3VkYy9lbXh4X3VkYy5oCmluZGV4IDM5NzY5ZTMuLjc4OWJmYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lbXh4X3VkYy9lbXh4X3VkYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lbXh4X3VkYy9lbXh4X3VkYy5oCkBAIC01ODYsNyArNTg2LDcgQEAKIAl1bnNpZ25lZAkJcmVtb3RlX3dha2V1cDoxOwogCXVuc2lnbmVkCQl1ZGNfZW5hYmxlZDoxOwogCi0JdW5zaWduZWQJCW1BOworCXVuc2lnbmVkIGludAkJbUE7CiAKIAl1MzIJCWN1cnJfY29uZmlnOwkvKiBDdXJyZW50IENvbmZpZ3VyYXRpb24gTnVtYmVyICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9hZ20xMjY0ay1mbC5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2FnbTEyNjRrLWZsLmMKaW5kZXggODJiNDZjZC4uNzU2MTM4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2FnbTEyNjRrLWZsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2FnbTEyNjRrLWZsLmMKQEAgLTM1MCw4ICszNTAsOCBAQAogCQkJCX0KIAkJfQogCi0JIC8qIDEgc3RyaW5nID0gMiBwYWdlcyAqLwotCSBmb3IgKHkgPSBhZGRyX3dpbi55c19wYWdlOyB5IDw9IGFkZHJfd2luLnllX3BhZ2U7ICsreSkgeworCS8qIDEgc3RyaW5nID0gMiBwYWdlcyAqLworCWZvciAoeSA9IGFkZHJfd2luLnlzX3BhZ2U7IHkgPD0gYWRkcl93aW4ueWVfcGFnZTsgKyt5KSB7CiAJCS8qIGxlZnQgaGFsZiBvZiBkaXNwbGF5ICovCiAJCWlmIChhZGRyX3dpbi54cyA8IHBhci0+aW5mby0+dmFyLnhyZXMgLyAyKSB7CiAJCQljb25zdHJ1Y3RfbGluZV9iaXRtYXAocGFyLCBidWYsIGNvbnZlcnRfYnVmLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzMjAuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5MzIwLmMKaW5kZXggNmZmMjIyZC4uMjc4ZTRjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzMjAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTMyMC5jCkBAIC0yOSw3ICsyOSw3IEBACiAjZGVmaW5lIERFRkFVTFRfR0FNTUEJIjA3IDA3IDYgMCAwIDAgNSA1IDQgMFxuIiBcCiAJCQkiMDcgMDggNCA3IDUgMSAyIDAgNyA3IgogCi1zdGF0aWMgdW5zaWduZWQgcmVhZF9kZXZpY2Vjb2RlKHN0cnVjdCBmYnRmdF9wYXIgKnBhcikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVhZF9kZXZpY2Vjb2RlKHN0cnVjdCBmYnRmdF9wYXIgKnBhcikKIHsKIAlpbnQgcmV0OwogCXU4IHJ4YnVmWzhdID0gezAsIH07CkBAIC00MSw3ICs0MSw3IEBACiAKIHN0YXRpYyBpbnQgaW5pdF9kaXNwbGF5KHN0cnVjdCBmYnRmdF9wYXIgKnBhcikKIHsKLQl1bnNpZ25lZCBkZXZjb2RlOworCXVuc2lnbmVkIGludCBkZXZjb2RlOwogCiAJcGFyLT5mYnRmdG9wcy5yZXNldChwYXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTMyNS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzMjUuYwppbmRleCBmZGY5OGQzLi5jMzFlMmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTMyNS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5MzI1LmMKQEAgLTMyLDI2ICszMiwyNiBAQAogI2RlZmluZSBERUZBVUxUX0dBTU1BCSIwRiAwMCA3IDIgMCAwIDYgNSA0IDFcbiIgXAogCQkJIjA0IDE2IDIgNyA2IDMgMiAxIDcgNyIKIAotc3RhdGljIHVuc2lnbmVkIGJ0ID0gNjsgLyogVkdMPVZjaSo0ICwgVkdIPVZjaSo0ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGJ0ID0gNjsgLyogVkdMPVZjaSo0ICwgVkdIPVZjaSo0ICovCiBtb2R1bGVfcGFyYW0oYnQsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhidCwgIlNldHMgdGhlIGZhY3RvciB1c2VkIGluIHRoZSBzdGVwLXVwIGNpcmN1aXRzIik7CiAKLXN0YXRpYyB1bnNpZ25lZCB2YyA9IDB4MDM7IC8qIFZjaTE9VmNpKjAuODAgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmMgPSAweDAzOyAvKiBWY2kxPVZjaSowLjgwICovCiBtb2R1bGVfcGFyYW0odmMsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh2YywKICJTZXRzIHRoZSByYXRpbyBmYWN0b3Igb2YgVmNpIHRvIGdlbmVyYXRlIHRoZSByZWZlcmVuY2Ugdm9sdGFnZXMgVmNpMSIpOwogCi1zdGF0aWMgdW5zaWduZWQgdnJoID0gMHgwZDsgLyogVlJFRzFPVVQ9VmNpKjEuODUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdnJoID0gMHgwZDsgLyogVlJFRzFPVVQ9VmNpKjEuODUgKi8KIG1vZHVsZV9wYXJhbSh2cmgsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh2cmgsCiAiU2V0IHRoZSBhbXBsaWZ5aW5nIHJhdGUgKDEuNiB+IDEuOSkgb2YgVmNpIGFwcGxpZWQgdG8gb3V0cHV0IHRoZSBWUkVHMU9VVCIpOwogCi1zdGF0aWMgdW5zaWduZWQgdmR2ID0gMHgxMjsgLyogVkNPTUggYW1wbGl0dWRlPVZSRUcxT1VUKjAuOTggKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmR2ID0gMHgxMjsgLyogVkNPTUggYW1wbGl0dWRlPVZSRUcxT1VUKjAuOTggKi8KIG1vZHVsZV9wYXJhbSh2ZHYsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh2ZHYsCiAiU2VsZWN0IHRoZSBmYWN0b3Igb2YgVlJFRzFPVVQgdG8gc2V0IHRoZSBhbXBsaXR1ZGUgb2YgVmNvbSIpOwogCi1zdGF0aWMgdW5zaWduZWQgdmNtID0gMHgwYTsgLyogVkNPTUg9VlJFRzFPVVQqMC43MzUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmNtID0gMHgwYTsgLyogVkNPTUg9VlJFRzFPVVQqMC43MzUgKi8KIG1vZHVsZV9wYXJhbSh2Y20sIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh2Y20sICJTZXQgdGhlIGludGVybmFsIFZjb21IIHZvbHRhZ2UiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3BjZDg1NDQuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9wY2Q4NTQ0LmMKaW5kZXggYTZiNDMzMi4uYTQ3MTBkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3BjZDg1NDQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfcGNkODU0NC5jCkBAIC0zMiwxMSArMzIsMTEgQEAKICNkZWZpbmUgVFhCVUZMRU4gICAgICAgKDg0ICogNikKICNkZWZpbmUgREVGQVVMVF9HQU1NQSAgIjQwIiAvKiBnYW1tYSBjb250cm9scyB0aGUgY29udHJhc3QgaW4gdGhpcyBkcml2ZXIgKi8KIAotc3RhdGljIHVuc2lnbmVkIHRjOworc3RhdGljIHVuc2lnbmVkIGludCB0YzsKIG1vZHVsZV9wYXJhbSh0YywgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHRjLCAiVENbMTowXSBUZW1wZXJhdHVyZSBjb2VmZmljaWVudDogMC0zIChkZWZhdWx0OiAwKSIpOwogCi1zdGF0aWMgdW5zaWduZWQgYnMgPSA0Oworc3RhdGljIHVuc2lnbmVkIGludCBicyA9IDQ7CiBtb2R1bGVfcGFyYW0oYnMsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhicywgIkJTWzI6MF0gQmlhcyB2b2x0YWdlIGxldmVsOiAwLTcgKGRlZmF1bHQ6IDQpIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zNmQwMmExLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfczZkMDJhMS5jCmluZGV4IDMxMTMzNTUuLjc3NGIwZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zNmQwMmExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3M2ZDAyYTEuYwpAQCAtMTEzLDEyICsxMTMsMTQgQEAKICNkZWZpbmUgTVYgQklUKDUpCiBzdGF0aWMgaW50IHNldF92YXIoc3RydWN0IGZidGZ0X3BhciAqcGFyKQogewotCS8qIE1lbW9yeSBkYXRhIGFjY2VzcyBjb250cm9sICgweDM2aCkKLQkgICAgIFJHQi9CR1I6Ci0JCTEuIE1vZGUgc2VsZWN0aW9uIHBpbiBTUkdCCi0JCQlSR0IgSC9XIHBpbiBmb3IgY29sb3IgZmlsdGVyIHNldHRpbmc6IDA9UkdCLCAxPUJHUgotCQkyLiBNQURDVEwgUkdCIGJpdAotCQkJUkdCLUJHUiBPUkRFUiBjb2xvciBmaWx0ZXIgcGFuZWw6IDA9UkdCLCAxPUJHUiAqLworCS8qCisJICogTWVtb3J5IGRhdGEgYWNjZXNzIGNvbnRyb2wgKDB4MzZoKQorCSAqIFJHQi9CR1I6CisJICoJMS4gTW9kZSBzZWxlY3Rpb24gcGluIFNSR0IKKwkgKgkJUkdCIEgvVyBwaW4gZm9yIGNvbG9yIGZpbHRlciBzZXR0aW5nOiAwPVJHQiwgMT1CR1IKKwkgKgkyLiBNQURDVEwgUkdCIGJpdAorCSAqCQlSR0ItQkdSIE9SREVSIGNvbG9yIGZpbHRlciBwYW5lbDogMD1SR0IsIDE9QkdSCisJICovCiAJc3dpdGNoIChwYXItPmluZm8tPnZhci5yb3RhdGUpIHsKIAljYXNlIDA6CiAJCXdyaXRlX3JlZyhwYXIsIE1JUElfRENTX1NFVF9BRERSRVNTX01PREUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfczZkMTEyMS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3M2ZDExMjEuYwppbmRleCBkNmFlNzZiLi45YjFkNzBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfczZkMTEyMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zNmQxMTIxLmMKQEAgLTEyNSwxMCArMTI1LDEwIEBACiB9CiAKIC8qCi0gIEdhbW1hIHN0cmluZyBmb3JtYXQ6Ci0gICAgUEtQMCBQS1AxIFBLUDIgUEtQMyBQS1A0IFBLUDUgUEtQNiBQS1A3IFBLUDggUEtQOSBQS1AxMCBQS1AxMSBWUlAwIFZSUDEKLSAgICBQS04wIFBLTjEgUEtOMiBQS04zIFBLTjQgUEtONSBQS042IFBLTjcgUFJOOCBQUk45IFBSTjEwIFBSTjExIFZSTjAgVlJOMQotKi8KKyAqIEdhbW1hIHN0cmluZyBmb3JtYXQ6CisgKiBQS1AwIFBLUDEgUEtQMiBQS1AzIFBLUDQgUEtQNSBQS1A2IFBLUDcgUEtQOCBQS1A5IFBLUDEwIFBLUDExIFZSUDAgVlJQMQorICogUEtOMCBQS04xIFBLTjIgUEtOMyBQS040IFBLTjUgUEtONiBQS043IFBSTjggUFJOOSBQUk4xMCBQUk4xMSBWUk4wIFZSTjEKKyAqLwogI2RlZmluZSBDVVJWRShudW0sIGlkeCkgIGN1cnZlc1tudW0gKiBwYXItPmdhbW1hLm51bV92YWx1ZXMgKyBpZHhdCiBzdGF0aWMgaW50IHNldF9nYW1tYShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIHVuc2lnbmVkIGxvbmcgKmN1cnZlcykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMjg5LmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTI4OS5jCmluZGV4IDExNjJjMDguLjI1ZjlmYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMjg5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEyODkuYwpAQCAtMjksNyArMjksNyBAQAogI2RlZmluZSBERUZBVUxUX0dBTU1BCSIwMiAwMyAyIDUgNyA3IDQgMiA0IDJcbiIgXAogCQkJIjAyIDAzIDIgNSA3IDUgNCAyIDQgMiIKIAotc3RhdGljIHVuc2lnbmVkIHJlZzExID0gMHg2MDQwOworc3RhdGljIHVuc2lnbmVkIGludCByZWcxMSA9IDB4NjA0MDsKIG1vZHVsZV9wYXJhbShyZWcxMSwgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHJlZzExLCAiUmVnaXN0ZXIgMTFoIHZhbHVlIik7CiAKQEAgLTEzMSwxMCArMTMxLDEwIEBACiB9CiAKIC8qCi0gIEdhbW1hIHN0cmluZyBmb3JtYXQ6Ci0gICAgVlJQMCBWUlAxIFBSUDAgUFJQMSBQS1AwIFBLUDEgUEtQMiBQS1AzIFBLUDQgUEtQNQotICAgIFZSTjAgVlJOMSBQUk4wIFBSTjEgUEtOMCBQS04xIFBLTjIgUEtOMyBQS040IFBLTjUKLSovCisgKiBHYW1tYSBzdHJpbmcgZm9ybWF0OgorICogVlJQMCBWUlAxIFBSUDAgUFJQMSBQS1AwIFBLUDEgUEtQMiBQS1AzIFBLUDQgUEtQNQorICogVlJOMCBWUk4xIFBSTjAgUFJOMSBQS04wIFBLTjEgUEtOMiBQS04zIFBLTjQgUEtONQorICovCiAjZGVmaW5lIENVUlZFKG51bSwgaWR4KSAgY3VydmVzW251bSAqIHBhci0+Z2FtbWEubnVtX3ZhbHVlcyArIGlkeF0KIHN0YXRpYyBpbnQgc2V0X2dhbW1hKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgdW5zaWduZWQgbG9uZyAqY3VydmVzKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEzMDYuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzA2LmMKaW5kZXggZTBiMzRhNC4uODBmYzU3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEzMDYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTMwNi5jCkBAIC0yNywxNSArMjcsMTUgQEAKICNkZWZpbmUgSEVJR0hUCQk2NAogCiAvKgotICB3cml0ZV9yZWcoKSBjYXZlYXQ6Ci0KLSAgICAgVGhpcyBkb2Vzbid0IHdvcmsgYmVjYXVzZSBEL0MgaGFzIHRvIGJlIExPVyBmb3IgYm90aCB2YWx1ZXM6Ci0gICAgICAgd3JpdGVfcmVnKHBhciwgdmFsMSwgdmFsMik7Ci0KLSAgICAgRG8gaXQgbGlrZSB0aGlzOgotICAgICAgIHdyaXRlX3JlZyhwYXIsIHZhbDEpOwotICAgICAgIHdyaXRlX3JlZyhwYXIsIHZhbDIpOwotKi8KKyAqIHdyaXRlX3JlZygpIGNhdmVhdDoKKyAqCisgKiBUaGlzIGRvZXNuJ3Qgd29yayBiZWNhdXNlIEQvQyBoYXMgdG8gYmUgTE9XIGZvciBib3RoIHZhbHVlczoKKyAqIHdyaXRlX3JlZyhwYXIsIHZhbDEsIHZhbDIpOworICoKKyAqIERvIGl0IGxpa2UgdGhpczoKKyAqIHdyaXRlX3JlZyhwYXIsIHZhbDEpOworICogd3JpdGVfcmVnKHBhciwgdmFsMik7CisgKi8KIAogLyogSW5pdCBzZXF1ZW5jZSB0YWtlbiBmcm9tIHRoZSBBZGFmcnVpdCBTU0QxMzA2IEFyZHVpbm8gbGlicmFyeSAqLwogc3RhdGljIGludCBpbml0X2Rpc3BsYXkoc3RydWN0IGZidGZ0X3BhciAqcGFyKQpAQCAtMTEzLDggKzExMyw5IEBACiAJd3JpdGVfcmVnKHBhciwgMHhBNCk7CiAKIAkvKiBTZXQgTm9ybWFsIERpc3BsYXkKLQkgICAwIGluIFJBTTogT0ZGIGluIGRpc3BsYXkgcGFuZWwKLQkgICAxIGluIFJBTTogT04gaW4gZGlzcGxheSBwYW5lbCAqLworCSAqIDAgaW4gUkFNOiBPRkYgaW4gZGlzcGxheSBwYW5lbAorCSAqIDEgaW4gUkFNOiBPTiBpbiBkaXNwbGF5IHBhbmVsCisJICovCiAJd3JpdGVfcmVnKHBhciwgMHhBNik7CiAKIAkvKiBTZXQgRGlzcGxheSBPTiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEzMzEuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzMxLmMKaW5kZXggYmQyOTRmOC4uMWQ3NGFjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEzMzEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTMzMS5jCkBAIC0xMDIsMjYgKzEwMiwyNiBAQAogfQogCiAvKgotCUdyYXlzY2FsZSBMb29rdXAgVGFibGUKLQlHUzEgLSBHUzYzCi0JVGhlIGRyaXZlciBHYW1tYSBjdXJ2ZSBjb250YWlucyB0aGUgcmVsYXRpdmUgdmFsdWVzIGJldHdlZW4gdGhlIGVudHJpZXMKLQlpbiB0aGUgTG9va3VwIHRhYmxlLgotCi0JRnJvbSBkYXRhc2hlZXQ6Ci0JOC44IEdyYXkgU2NhbGUgRGVjb2RlcgotCi0JCXRoZXJlIGFyZSB0b3RhbCAxODAgR2FtbWEgU2V0dGluZ3MgKFNldHRpbmcgMCB0byBTZXR0aW5nIDE4MCkKLQkJYXZhaWxhYmxlIGZvciB0aGUgR3JheSBTY2FsZSB0YWJsZS4KLQotCQlUaGUgZ3JheSBzY2FsZSBpcyBkZWZpbmVkIGluIGluY3JlbWVudGFsIHdheSwgd2l0aCByZWZlcmVuY2UKLQkJdG8gdGhlIGxlbmd0aCBvZiBwcmV2aW91cyB0YWJsZSBlbnRyeToKLQkJCVNldHRpbmcgb2YgR1MxIGhhcyB0byBiZSA+PSAwCi0JCQlTZXR0aW5nIG9mIEdTMiBoYXMgdG8gYmUgPiBTZXR0aW5nIG9mIEdTMSArMQotCQkJU2V0dGluZyBvZiBHUzMgaGFzIHRvIGJlID4gU2V0dGluZyBvZiBHUzIgKzEKLQkJCToKLQkJCVNldHRpbmcgb2YgR1M2MyBoYXMgdG8gYmUgPiBTZXR0aW5nIG9mIEdTNjIgKzEKLQotKi8KKyAqIEdyYXlzY2FsZSBMb29rdXAgVGFibGUKKyAqIEdTMSAtIEdTNjMKKyAqIFRoZSBkcml2ZXIgR2FtbWEgY3VydmUgY29udGFpbnMgdGhlIHJlbGF0aXZlIHZhbHVlcyBiZXR3ZWVuIHRoZSBlbnRyaWVzCisgKiBpbiB0aGUgTG9va3VwIHRhYmxlLgorICoKKyAqIEZyb20gZGF0YXNoZWV0OgorICogOC44IEdyYXkgU2NhbGUgRGVjb2RlcgorICoKKyAqIHRoZXJlIGFyZSB0b3RhbCAxODAgR2FtbWEgU2V0dGluZ3MgKFNldHRpbmcgMCB0byBTZXR0aW5nIDE4MCkKKyAqIGF2YWlsYWJsZSBmb3IgdGhlIEdyYXkgU2NhbGUgdGFibGUuCisgKgorICogVGhlIGdyYXkgc2NhbGUgaXMgZGVmaW5lZCBpbiBpbmNyZW1lbnRhbCB3YXksIHdpdGggcmVmZXJlbmNlCisgKiB0byB0aGUgbGVuZ3RoIG9mIHByZXZpb3VzIHRhYmxlIGVudHJ5OgorICogU2V0dGluZyBvZiBHUzEgaGFzIHRvIGJlID49IDAKKyAqIFNldHRpbmcgb2YgR1MyIGhhcyB0byBiZSA+IFNldHRpbmcgb2YgR1MxICsxCisgKiBTZXR0aW5nIG9mIEdTMyBoYXMgdG8gYmUgPiBTZXR0aW5nIG9mIEdTMiArMQorICogOgorICogU2V0dGluZyBvZiBHUzYzIGhhcyB0byBiZSA+IFNldHRpbmcgb2YgR1M2MiArMQorICoKKyAqLwogc3RhdGljIGludCBzZXRfZ2FtbWEoc3RydWN0IGZidGZ0X3BhciAqcGFyLCB1bnNpZ25lZCBsb25nICpjdXJ2ZXMpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXBbR0FNTUFfTlVNICogR0FNTUFfTEVOXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzUxLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTM1MS5jCmluZGV4IGNlZjMzZTQuLjIwMGFhOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzUxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEzNTEuYwpAQCAtMjUsOCArMjUsOCBAQAogCiBzdGF0aWMgaW50IGluaXRfZGlzcGxheShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIpCiB7Ci0JaWYgKHBhci0+cGRhdGEKLQkJJiYgcGFyLT5wZGF0YS0+ZGlzcGxheS5iYWNrbGlnaHQgPT0gRkJURlRfT05CT0FSRF9CQUNLTElHSFQpIHsKKwlpZiAocGFyLT5wZGF0YSAmJgorCSAgICBwYXItPnBkYXRhLT5kaXNwbGF5LmJhY2tsaWdodCA9PSBGQlRGVF9PTkJPQVJEX0JBQ0tMSUdIVCkgewogCQkvKiBtb2R1bGUgdXNlcyBvbmJvYXJkIEdQSU8gZm9yIHBhbmVsIHBvd2VyICovCiAJCXBhci0+ZmJ0ZnRvcHMucmVnaXN0ZXJfYmFja2xpZ2h0ID0gcmVnaXN0ZXJfb25ib2FyZF9iYWNrbGlnaHQ7CiAJfQpAQCAtNjYsNyArNjYsNyBAQAogCiBzdGF0aWMgaW50IHNldF92YXIoc3RydWN0IGZidGZ0X3BhciAqcGFyKQogewotCXVuc2lnbmVkIHJlbWFwOworCXVuc2lnbmVkIGludCByZW1hcDsKIAogCWlmIChwYXItPmZidGZ0b3BzLmluaXRfZGlzcGxheSAhPSBpbml0X2Rpc3BsYXkpIHsKIAkJLyogZG9uJ3QgcmlzayBtZXNzaW5nIHVwIHJlZ2lzdGVyIEEwaCAqLwpAQCAtODAsMTAgKzgwLDEwIEBACiAKIAlzd2l0Y2ggKHBhci0+aW5mby0+dmFyLnJvdGF0ZSkgewogCWNhc2UgMDoKLQkJd3JpdGVfcmVnKHBhciwgMHhBMCwgcmVtYXAgfCAweDAwIHwgMTw8NCk7CisJCXdyaXRlX3JlZyhwYXIsIDB4QTAsIHJlbWFwIHwgMHgwMCB8IDEgPDwgNCk7CiAJCWJyZWFrOwogCWNhc2UgMjcwOgotCQl3cml0ZV9yZWcocGFyLCAweEEwLCByZW1hcCB8IDB4MDMgfCAxPDw0KTsKKwkJd3JpdGVfcmVnKHBhciwgMHhBMCwgcmVtYXAgfCAweDAzIHwgMSA8PCA0KTsKIAkJYnJlYWs7CiAJY2FzZSAxODA6CiAJCXdyaXRlX3JlZyhwYXIsIDB4QTAsIHJlbWFwIHwgMHgwMik7CkBAIC0xODksOCArMTg5LDggQEAKIAkJIiVzOiBwb3dlcj0lZCwgZmJfYmxhbms9JWRcbiIsCiAJCV9fZnVuY19fLCBiZC0+cHJvcHMucG93ZXIsIGJkLT5wcm9wcy5mYl9ibGFuayk7CiAKLQlvbiA9IChiZC0+cHJvcHMucG93ZXIgPT0gRkJfQkxBTktfVU5CTEFOSykKLQkJJiYgKGJkLT5wcm9wcy5mYl9ibGFuayA9PSBGQl9CTEFOS19VTkJMQU5LKTsKKwlvbiA9IChiZC0+cHJvcHMucG93ZXIgPT0gRkJfQkxBTktfVU5CTEFOSykgJiYKKwkgICAgIChiZC0+cHJvcHMuZmJfYmxhbmsgPT0gRkJfQkxBTktfVU5CTEFOSyk7CiAJLyogT25ib2FyZCBiYWNrbGlnaHQgY29ubmVjdGVkIHRvIEdQSU8wIG9uIFNTRDEzNTEsIEdQSU8xIHVudXNlZCAqLwogCXdyaXRlX3JlZyhwYXIsIDB4QjUsIG9uID8gMHgwMyA6IDB4MDIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3Q3NzM1ci5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3N0NzczNXIuYwppbmRleCBjNWU1MWZlLi42NjcwZjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3Q3NzM1ci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zdDc3MzVyLmMKQEAgLTMzLDM1ICszMyw0MyBAQAogCS0yLCA1MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlbGF5ICovCiAKIAkvKiBGUk1DVFIxIC0gZnJhbWUgcmF0ZSBjb250cm9sOiBub3JtYWwgbW9kZQotCSAgICAgZnJhbWUgcmF0ZSA9IGZvc2MgLyAoMSB4IDIgKyA0MCkgKiAoTElORSArIDJDICsgMkQpICovCisJICogZnJhbWUgcmF0ZSA9IGZvc2MgLyAoMSB4IDIgKyA0MCkgKiAoTElORSArIDJDICsgMkQpCisJICovCiAJLTEsIDB4QjEsIDB4MDEsIDB4MkMsIDB4MkQsCiAKIAkvKiBGUk1DVFIyIC0gZnJhbWUgcmF0ZSBjb250cm9sOiBpZGxlIG1vZGUKLQkgICAgIGZyYW1lIHJhdGUgPSBmb3NjIC8gKDEgeCAyICsgNDApICogKExJTkUgKyAyQyArIDJEKSAqLworCSAqIGZyYW1lIHJhdGUgPSBmb3NjIC8gKDEgeCAyICsgNDApICogKExJTkUgKyAyQyArIDJEKQorCSAqLwogCS0xLCAweEIyLCAweDAxLCAweDJDLCAweDJELAogCiAJLyogRlJNQ1RSMyAtIGZyYW1lIHJhdGUgY29udHJvbCAtIHBhcnRpYWwgbW9kZQotCSAgICAgZG90IGludmVyc2lvbiBtb2RlLCBsaW5lIGludmVyc2lvbiBtb2RlICovCisJICogZG90IGludmVyc2lvbiBtb2RlLCBsaW5lIGludmVyc2lvbiBtb2RlCisJICovCiAJLTEsIDB4QjMsIDB4MDEsIDB4MkMsIDB4MkQsIDB4MDEsIDB4MkMsIDB4MkQsCiAKIAkvKiBJTlZDVFIgLSBkaXNwbGF5IGludmVyc2lvbiBjb250cm9sCi0JICAgICBubyBpbnZlcnNpb24gKi8KKwkgKiBubyBpbnZlcnNpb24KKwkgKi8KIAktMSwgMHhCNCwgMHgwNywKIAogCS8qIFBXQ1RSMSAtIFBvd2VyIENvbnRyb2wKLQkgICAgIC00LjZWLCBBVVRPIG1vZGUgKi8KKwkgKiAtNC42ViwgQVVUTyBtb2RlCisJICovCiAJLTEsIDB4QzAsIDB4QTIsIDB4MDIsIDB4ODQsCiAKIAkvKiBQV0NUUjIgLSBQb3dlciBDb250cm9sCi0JICAgICBWR0gyNSA9IDIuNEMgVkdTRUwgPSAtMTAgVkdIID0gMyAqIEFWREQgKi8KKwkgKiBWR0gyNSA9IDIuNEMgVkdTRUwgPSAtMTAgVkdIID0gMyAqIEFWREQKKwkgKi8KIAktMSwgMHhDMSwgMHhDNSwKIAogCS8qIFBXQ1RSMyAtIFBvd2VyIENvbnRyb2wKLQkgICAgIE9wYW1wIGN1cnJlbnQgc21hbGwsIEJvb3N0IGZyZXF1ZW5jeSAqLworCSAqIE9wYW1wIGN1cnJlbnQgc21hbGwsIEJvb3N0IGZyZXF1ZW5jeQorCSAqLwogCS0xLCAweEMyLCAweDBBLCAweDAwLAogCiAJLyogUFdDVFI0IC0gUG93ZXIgQ29udHJvbAotCSAgICAgQkNMSy8yLCBPcGFtcCBjdXJyZW50IHNtYWxsICYgTWVkaXVtIGxvdyAqLworCSAqIEJDTEsvMiwgT3BhbXAgY3VycmVudCBzbWFsbCAmIE1lZGl1bSBsb3cKKwkgKi8KIAktMSwgMHhDMywgMHg4QSwgMHgyQSwKIAogCS8qIFBXQ1RSNSAtIFBvd2VyIENvbnRyb2wgKi8KQEAgLTEwMSwxMSArMTA5LDEyIEBACiBzdGF0aWMgaW50IHNldF92YXIoc3RydWN0IGZidGZ0X3BhciAqcGFyKQogewogCS8qIE1BRENUTCAtIE1lbW9yeSBkYXRhIGFjY2VzcyBjb250cm9sCi0JICAgICBSR0IvQkdSOgotCSAgICAgMS4gTW9kZSBzZWxlY3Rpb24gcGluIFNSR0IKLQkJUkdCIEgvVyBwaW4gZm9yIGNvbG9yIGZpbHRlciBzZXR0aW5nOiAwPVJHQiwgMT1CR1IKLQkgICAgIDIuIE1BRENUTCBSR0IgYml0Ci0JCVJHQi1CR1IgT1JERVIgY29sb3IgZmlsdGVyIHBhbmVsOiAwPVJHQiwgMT1CR1IgKi8KKwkgKiBSR0IvQkdSOgorCSAqIDEuIE1vZGUgc2VsZWN0aW9uIHBpbiBTUkdCCisJICogICAgUkdCIEgvVyBwaW4gZm9yIGNvbG9yIGZpbHRlciBzZXR0aW5nOiAwPVJHQiwgMT1CR1IKKwkgKiAyLiBNQURDVEwgUkdCIGJpdAorCSAqICAgIFJHQi1CR1IgT1JERVIgY29sb3IgZmlsdGVyIHBhbmVsOiAwPVJHQiwgMT1CR1IKKwkgKi8KIAlzd2l0Y2ggKHBhci0+aW5mby0+dmFyLnJvdGF0ZSkgewogCWNhc2UgMDoKIAkJd3JpdGVfcmVnKHBhciwgTUlQSV9EQ1NfU0VUX0FERFJFU1NfTU9ERSwKQEAgLTEyOSwxMCArMTM4LDEwIEBACiB9CiAKIC8qCi0gIEdhbW1hIHN0cmluZyBmb3JtYXQ6Ci0gICAgVlJGMFAgVk9TMFAgUEswUCBQSzFQIFBLMlAgUEszUCBQSzRQIFBLNVAgUEs2UCBQSzdQIFBLOFAgUEs5UCBTRUxWMFAgU0VMVjFQIFNFTFY2MlAgU0VMVjYzUAotICAgIFZSRjBOIFZPUzBOIFBLME4gUEsxTiBQSzJOIFBLM04gUEs0TiBQSzVOIFBLNk4gUEs3TiBQSzhOIFBLOU4gU0VMVjBOIFNFTFYxTiBTRUxWNjJOIFNFTFY2M04KLSovCisgKiBHYW1tYSBzdHJpbmcgZm9ybWF0OgorICogVlJGMFAgVk9TMFAgUEswUCBQSzFQIFBLMlAgUEszUCBQSzRQIFBLNVAgUEs2UCBQSzdQIFBLOFAgUEs5UCBTRUxWMFAgU0VMVjFQIFNFTFY2MlAgU0VMVjYzUAorICogVlJGME4gVk9TME4gUEswTiBQSzFOIFBLMk4gUEszTiBQSzROIFBLNU4gUEs2TiBQSzdOIFBLOE4gUEs5TiBTRUxWME4gU0VMVjFOIFNFTFY2Mk4gU0VMVjYzTgorICovCiAjZGVmaW5lIENVUlZFKG51bSwgaWR4KSAgY3VydmVzW251bSAqIHBhci0+Z2FtbWEubnVtX3ZhbHVlcyArIGlkeF0KIHN0YXRpYyBpbnQgc2V0X2dhbW1hKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgdW5zaWduZWQgbG9uZyAqY3VydmVzKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3RsczgyMDQuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl90bHM4MjA0LmMKaW5kZXggMjE4M2Y5OC4uZWEyZGRhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3RsczgyMDQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfdGxzODIwNC5jCkBAIC0zNSw3ICszNSw3IEBACiAvKiBnYW1tYSBpcyB1c2VkIHRvIGNvbnRyb2wgY29udHJhc3QgaW4gdGhpcyBkcml2ZXIgKi8KICNkZWZpbmUgREVGQVVMVF9HQU1NQQkiNDAiCiAKLXN0YXRpYyB1bnNpZ25lZCBicyA9IDQ7CitzdGF0aWMgdW5zaWduZWQgaW50IGJzID0gNDsKIG1vZHVsZV9wYXJhbShicywgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGJzLCAiQlNbMjowXSBCaWFzIHZvbHRhZ2UgbGV2ZWw6IDAtNyAoZGVmYXVsdDogNCkiKTsKIApAQCAtNDQsMjEgKzQ0LDIxIEBACiAJcGFyLT5mYnRmdG9wcy5yZXNldChwYXIpOwogCiAJLyogRW50ZXIgZXh0ZW5kZWQgY29tbWFuZCBtb2RlICovCi0Jd3JpdGVfcmVnKHBhciwgMHgyMSk7IC8qIDU6MSAgMQotCQkJCSAyOjAgIFBEIC0gUG93ZXJkb3duIGNvbnRyb2w6IGNoaXAgaXMgYWN0aXZlCi0JCQkJIDE6MCAgViAgLSBFbnRyeSBtb2RlOiBob3Jpem9udGFsIGFkZHJlc3NpbmcKLQkJCQkgMDoxICBIICAtIEV4dGVuZGVkIGluc3RydWN0aW9uIHNldCBjb250cm9sOgotCQkJCQkJZXh0ZW5kZWQKLQkJCSAgICAgICovCisJd3JpdGVfcmVnKHBhciwgMHgyMSk7CS8qIDU6MSAgMQorCQkJCSAqIDI6MCAgUEQgLSBQb3dlcmRvd24gY29udHJvbDogY2hpcCBpcyBhY3RpdmUKKwkJCQkgKiAxOjAgIFYgIC0gRW50cnkgbW9kZTogaG9yaXpvbnRhbCBhZGRyZXNzaW5nCisJCQkJICogMDoxICBIICAtIEV4dGVuZGVkIGluc3RydWN0aW9uIHNldCBjb250cm9sOgorCQkJCSAqCSAgICAgZXh0ZW5kZWQKKwkJCQkgKi8KIAogCS8qIEg9MSBCaWFzIHN5c3RlbSAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MTAgfCAoYnMgJiAweDcpKTsgLyoKLQkJCQkgNDoxICAxCi0JCQkJIDM6MCAgMAotCQkJCSAyOnggIEJTMiAtIEJpYXMgU3lzdGVtCi0JCQkJIDE6eCAgQlMxCi0JCQkJIDA6eCAgQlMwCi0JCQkgICAgICAqLworCXdyaXRlX3JlZyhwYXIsIDB4MTAgfCAoYnMgJiAweDcpKTsKKwkJCQkvKiA0OjEgIDEKKwkJCQkgKiAzOjAgIDAKKwkJCQkgKiAyOnggIEJTMiAtIEJpYXMgU3lzdGVtCisJCQkJICogMTp4ICBCUzEKKwkJCQkgKiAwOnggIEJTMAorCQkJCSAqLwogCiAJLyogU2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBkaXNwbGF5IGxpbmUuICovCiAJd3JpdGVfcmVnKHBhciwgMHgwNCB8ICg2NCA+PiA2KSk7CkBAIC02OCwxMiArNjgsMTIgQEAKIAl3cml0ZV9yZWcocGFyLCAweDIwKTsKIAogCS8qIEg9MCBEaXNwbGF5IGNvbnRyb2wgKi8KLQl3cml0ZV9yZWcocGFyLCAweDA4IHwgNCk7IC8qCi0JCQkJIDM6MSAgMQotCQkJCSAyOjEgIEQgIC0gREU6IDEwPW5vcm1hbCBtb2RlCi0JCQkJIDE6MCAgMAotCQkJCSAwOjAgIEUKLQkJCSAgICAgICovCisJd3JpdGVfcmVnKHBhciwgMHgwOCB8IDQpOworCQkJCS8qIDM6MSAgMQorCQkJCSAqIDI6MSAgRCAtIERFOiAxMD1ub3JtYWwgbW9kZQorCQkJCSAqIDE6MCAgMAorCQkJCSAqIDA6MCAgRQorCQkJCSAqLwogCiAJcmV0dXJuIDA7CiB9CkBAIC04MSwxNSArODEsMTUgQEAKIHN0YXRpYyB2b2lkIHNldF9hZGRyX3dpbihzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIGludCB4cywgaW50IHlzLCBpbnQgeGUsIGludCB5ZSkKIHsKIAkvKiBIPTAgU2V0IFggYWRkcmVzcyBvZiBSQU0gKi8KLQl3cml0ZV9yZWcocGFyLCAweDgwKTsgLyogNzoxICAxCi0JCQkJIDYtMDogWFs2OjBdIC0gMHgwMAotCQkJICAgICAgKi8KKwl3cml0ZV9yZWcocGFyLCAweDgwKTsJLyogNzoxICAxCisJCQkJICogNi0wOiBYWzY6MF0gLSAweDAwCisJCQkJICovCiAKIAkvKiBIPTAgU2V0IFkgYWRkcmVzcyBvZiBSQU0gKi8KLQl3cml0ZV9yZWcocGFyLCAweDQwKTsgLyogNzowICAwCi0JCQkJIDY6MSAgMQotCQkJCSAyLTA6IFlbMjowXSAtIDB4MAotCQkJICAgICAgKi8KKwl3cml0ZV9yZWcocGFyLCAweDQwKTsJLyogNzowICAwCisJCQkJICogNjoxICAxCisJCQkJICogMi0wOiBZWzI6MF0gLSAweDAKKwkJCQkgKi8KIH0KIAogc3RhdGljIGludCB3cml0ZV92bWVtKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbikKQEAgLTEwMCw4ICsxMDAsOSBAQAogCiAJZm9yICh5ID0gMDsgeSA8IEhFSUdIVCAvIDg7IHkrKykgewogCQl1OCAqYnVmID0gcGFyLT50eGJ1Zi5idWY7Ci0JCS8qIFRoZSBkaXNwbGF5IGlzIDEwMng2OCBidXQgdGhlIExDRCBpcyA4NHg0OC4gIFNldAotCQkgICB0aGUgd3JpdGUgcG9pbnRlciBhdCB0aGUgc3RhcnQgb2YgZWFjaCByb3cuICovCisJCS8qIFRoZSBkaXNwbGF5IGlzIDEwMng2OCBidXQgdGhlIExDRCBpcyA4NHg0OC4KKwkJICogU2V0IHRoZSB3cml0ZSBwb2ludGVyIGF0IHRoZSBzdGFydCBvZiBlYWNoIHJvdy4KKwkJICovCiAJCWdwaW9fc2V0X3ZhbHVlKHBhci0+Z3Bpby5kYywgMCk7CiAJCXdyaXRlX3JlZyhwYXIsIDB4ODAgfCAwKTsKIAkJd3JpdGVfcmVnKHBhciwgMHg0MCB8IHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3VjMTYxMS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3VjMTYxMS5jCmluZGV4IGU4NzQwMWEuLmIzM2I3M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl91YzE2MTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfdWMxNjExLmMKQEAgLTQxLDMwICs0MSwzMCBAQAogICovCiAKIC8qIEJSIC0+IGFjdHVhbCByYXRpbzogMC0zIC0+IDUsIDEwLCAxMSwgMTMgKi8KLXN0YXRpYyB1bnNpZ25lZCByYXRpbyA9IDI7CitzdGF0aWMgdW5zaWduZWQgaW50IHJhdGlvID0gMjsKIG1vZHVsZV9wYXJhbShyYXRpbywgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHJhdGlvLCAiQlJbMTowXSBCaWFzIHZvbHRhZ2UgcmF0aW86IDAtMyAoZGVmYXVsdDogMikiKTsKIAotc3RhdGljIHVuc2lnbmVkIGdhaW4gPSAzOworc3RhdGljIHVuc2lnbmVkIGludCBnYWluID0gMzsKIG1vZHVsZV9wYXJhbShnYWluLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZ2FpbiwgIkdOWzE6MF0gQmlhcyB2b2x0YWdlIGdhaW46IDAtMyAoZGVmYXVsdDogMykiKTsKIAotc3RhdGljIHVuc2lnbmVkIHBvdCA9IDE2Oworc3RhdGljIHVuc2lnbmVkIGludCBwb3QgPSAxNjsKIG1vZHVsZV9wYXJhbShwb3QsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhwb3QsICJQTVs2OjBdIEJpYXMgdm9sdGFnZSBwb3QuOiAwLTYzIChkZWZhdWx0OiAxNikiKTsKIAogLyogVEMgLT4gJSBjb21wZW5zYXRpb24gcGVyIGRlZyBDOiAwLTMgLT4gLS4wNSwgLS4xMCwgLS4wMTUsIC0uMjAgKi8KLXN0YXRpYyB1bnNpZ25lZCB0ZW1wOworc3RhdGljIHVuc2lnbmVkIGludCB0ZW1wOwogbW9kdWxlX3BhcmFtKHRlbXAsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh0ZW1wLCAiVENbMTowXSBUZW1wZXJhdHVyZSBjb21wZW5zYXRpb246IDAtMyAoZGVmYXVsdDogMCkiKTsKIAogLyogUENbMTowXSAtPiBMQ0QgY2FwYWNpdGFuY2U6IDAtMyAtPiA8MjBuRiwgMjAtMjggbkYsIDI5LTQwIG5GLCA0MC01NiBuRiAqLwotc3RhdGljIHVuc2lnbmVkIGxvYWQgPSAxOworc3RhdGljIHVuc2lnbmVkIGludCBsb2FkID0gMTsKIG1vZHVsZV9wYXJhbShsb2FkLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobG9hZCwgIlBDWzE6MF0gUGFuZWwgTG9hZGluZzogMC0zIChkZWZhdWx0OiAxKSIpOwogCiAvKiBQQ1szOjJdIC0+IFZfTENEOiAwLCAxLCAzIC0+IGV4dC4sIGludC4gd2l0aCByYXRpbyA9IDUsIGludC4gc3RhbmRhcmQgKi8KLXN0YXRpYyB1bnNpZ25lZCBwdW1wID0gMzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHVtcCA9IDM7CiBtb2R1bGVfcGFyYW0ocHVtcCwgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHB1bXAsICJQQ1szOjJdIFB1bXAgY29udHJvbDogMCwxLDMgKGRlZmF1bHQ6IDMpIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl93YXR0ZXJvdHQuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl93YXR0ZXJvdHQuYwppbmRleCBmOGNiNjEwLi5hNTJlMjhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfd2F0dGVyb3R0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3dhdHRlcm90dC5jCkBAIC02Nyw3ICs2Nyw3IEBACiAKIHN0YXRpYyBpbnQgd3JpdGVfdm1lbShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW4pCiB7Ci0JdW5zaWduZWQgc3RhcnRfbGluZSwgZW5kX2xpbmU7CisJdW5zaWduZWQgaW50IHN0YXJ0X2xpbmUsIGVuZF9saW5lOwogCXUxNiAqdm1lbTE2ID0gKHUxNiAqKShwYXItPmluZm8tPnNjcmVlbl9idWZmZXIgKyBvZmZzZXQpOwogCXUxNiAqcG9zID0gcGFyLT50eGJ1Zi5idWYgKyAxOwogCXUxNiAqYnVmMTYgPSBwYXItPnR4YnVmLmJ1ZiArIDEwOwpAQCAtMTA0LDcgKzEwNCw3IEBACiAKIHN0YXRpYyBpbnQgd3JpdGVfdm1lbV84Yml0KHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbikKIHsKLQl1bnNpZ25lZCBzdGFydF9saW5lLCBlbmRfbGluZTsKKwl1bnNpZ25lZCBpbnQgc3RhcnRfbGluZSwgZW5kX2xpbmU7CiAJdTE2ICp2bWVtMTYgPSAodTE2ICopKHBhci0+aW5mby0+c2NyZWVuX2J1ZmZlciArIG9mZnNldCk7CiAJdTE2ICpwb3MgPSBwYXItPnR4YnVmLmJ1ZiArIDE7CiAJdTggKmJ1ZjggPSBwYXItPnR4YnVmLmJ1ZiArIDEwOwpAQCAtMTM3LDcgKzEzNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBmaXJtd2FyZV92ZXJzaW9uKHN0cnVjdCBmYnRmdF9wYXIgKnBhcikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmlybXdhcmVfdmVyc2lvbihzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIpCiB7CiAJdTggcnhidWZbNF0gPSB7MCwgfTsKIApAQCAtMTUyLDcgKzE1Miw3IEBACiBzdGF0aWMgaW50IGluaXRfZGlzcGxheShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIpCiB7CiAJaW50IHJldDsKLQl1bnNpZ25lZCB2ZXJzaW9uOworCXVuc2lnbmVkIGludCB2ZXJzaW9uOwogCXU4IHNhdmVfbW9kZTsKIAogCS8qIGVuYWJsZSBTUEkgaW50ZXJmYWNlIGJ5IGhhdmluZyBDUyBhbmQgTU9TSSBsb3cgZHVyaW5nIHJlc2V0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQtYnVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQtYnVzLmMKaW5kZXggODM1MDViYy4uZWM0NTA0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LWJ1cy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC1idXMuYwpAQCAtOTIsNyArOTIsOCBAQAogCiAJaWYgKHBhci0+c3BpICYmIChwYXItPnNwaS0+Yml0c19wZXJfd29yZCA9PSA4KSkgewogCQkvKiB3ZSdyZSBlbXVsYXRpbmcgOS1iaXQsIHBhZCBzdGFydCBvZiBidWZmZXIgd2l0aCBuby1vcHMKLQkJICAgKGFzc3VtaW5nIGhlcmUgdGhhdCB6ZXJvIGlzIGEgbm8tb3ApICovCisJCSAqIChhc3N1bWluZyBoZXJlIHRoYXQgemVybyBpcyBhIG5vLW9wKQorCQkgKi8KIAkJcGFkID0gKGxlbiAlIDQpID8gNCAtIChsZW4gJSA0KSA6IDA7CiAJCWZvciAoaSA9IDA7IGkgPCBwYWQ7IGkrKykKIAkJCSpidWYrKyA9IDB4MDAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LWNvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC1jb3JlLmMKaW5kZXggMGMxYTc3Yy4uNTg3ZjY4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LWNvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQtY29yZS5jCkBAIC0zNDEsOCArMzQxLDggQEAKIAltZGVsYXkoMTIwKTsKIH0KIAotc3RhdGljIHZvaWQgZmJ0ZnRfdXBkYXRlX2Rpc3BsYXkoc3RydWN0IGZidGZ0X3BhciAqcGFyLCB1bnNpZ25lZCBzdGFydF9saW5lLAotCQkJCSB1bnNpZ25lZCBlbmRfbGluZSkKK3N0YXRpYyB2b2lkIGZidGZ0X3VwZGF0ZV9kaXNwbGF5KHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgdW5zaWduZWQgaW50IHN0YXJ0X2xpbmUsCisJCQkJIHVuc2lnbmVkIGludCBlbmRfbGluZSkKIHsKIAlzaXplX3Qgb2Zmc2V0LCBsZW47CiAJa3RpbWVfdCB0c19zdGFydCwgdHNfZW5kOwpAQCAtMzkxLDExICszOTEsMTEgQEAKIAogCWlmICh1bmxpa2VseSh0aW1laXQpKSB7CiAJCXRzX2VuZCA9IGt0aW1lX2dldCgpOwotCQlpZiAoa3RpbWVfdG9fbnMocGFyLT51cGRhdGVfdGltZSkpCisJCWlmICgha3RpbWVfdG9fbnMocGFyLT51cGRhdGVfdGltZSkpCiAJCQlwYXItPnVwZGF0ZV90aW1lID0gdHNfc3RhcnQ7CiAKLQkJcGFyLT51cGRhdGVfdGltZSA9IHRzX3N0YXJ0OwogCQlmcHMgPSBrdGltZV91c19kZWx0YSh0c19zdGFydCwgcGFyLT51cGRhdGVfdGltZSk7CisJCXBhci0+dXBkYXRlX3RpbWUgPSB0c19zdGFydDsKIAkJZnBzID0gZnBzID8gMTAwMDAwMCAvIGZwcyA6IDA7CiAKIAkJdGhyb3VnaHB1dCA9IGt0aW1lX3VzX2RlbHRhKHRzX2VuZCwgdHNfc3RhcnQpOwpAQCAtNDM1LDEwICs0MzUsMTAgQEAKIHN0YXRpYyB2b2lkIGZidGZ0X2RlZmVycmVkX2lvKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlbGlzdCkKIHsKIAlzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIgPSBpbmZvLT5wYXI7Ci0JdW5zaWduZWQgZGlydHlfbGluZXNfc3RhcnQsIGRpcnR5X2xpbmVzX2VuZDsKKwl1bnNpZ25lZCBpbnQgZGlydHlfbGluZXNfc3RhcnQsIGRpcnR5X2xpbmVzX2VuZDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAl1bnNpZ25lZCBsb25nIGluZGV4OwotCXVuc2lnbmVkIHlfbG93ID0gMCwgeV9oaWdoID0gMDsKKwl1bnNpZ25lZCBpbnQgeV9sb3cgPSAwLCB5X2hpZ2ggPSAwOwogCWludCBjb3VudCA9IDA7CiAKIAlzcGluX2xvY2soJnBhci0+ZGlydHlfbG9jayk7CkBAIC01MjYsMTggKzUyNiwxOCBAQAogfQogCiAvKiBmcm9tIHB4YWZiLmMgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY2hhbl90b19maWVsZCh1bnNpZ25lZCBjaGFuLCBzdHJ1Y3QgZmJfYml0ZmllbGQgKmJmKQorc3RhdGljIHVuc2lnbmVkIGludCBjaGFuX3RvX2ZpZWxkKHVuc2lnbmVkIGludCBjaGFuLCBzdHJ1Y3QgZmJfYml0ZmllbGQgKmJmKQogewogCWNoYW4gJj0gMHhmZmZmOwogCWNoYW4gPj49IDE2IC0gYmYtPmxlbmd0aDsKIAlyZXR1cm4gY2hhbiA8PCBiZi0+b2Zmc2V0OwogfQogCi1zdGF0aWMgaW50IGZidGZ0X2ZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKLQkJCSAgICAgIHVuc2lnbmVkIGJsdWUsIHVuc2lnbmVkIHRyYW5zcCwKK3N0YXRpYyBpbnQgZmJ0ZnRfZmJfc2V0Y29scmVnKHVuc2lnbmVkIGludCByZWdubywgdW5zaWduZWQgaW50IHJlZCwgdW5zaWduZWQgaW50IGdyZWVuLAorCQkJICAgICAgdW5zaWduZWQgaW50IGJsdWUsIHVuc2lnbmVkIGludCB0cmFuc3AsCiAJCQkgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQl1bnNpZ25lZCB2YWw7CisJdW5zaWduZWQgaW50IHZhbDsKIAlpbnQgcmV0ID0gMTsKIAogCWRldl9kYmcoaW5mby0+ZGV2LApAQCAtNjU0LDExICs2NTQsMTEgQEAKIAl1OCAqdm1lbSA9IE5VTEw7CiAJdm9pZCAqdHhidWYgPSBOVUxMOwogCXZvaWQgKmJ1ZiA9IE5VTEw7Ci0JdW5zaWduZWQgd2lkdGg7Ci0JdW5zaWduZWQgaGVpZ2h0OworCXVuc2lnbmVkIGludCB3aWR0aDsKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0OwogCWludCB0eGJ1ZmxlbiA9IGRpc3BsYXktPnR4YnVmbGVuOwotCXVuc2lnbmVkIGJwcCA9IGRpc3BsYXktPmJwcDsKLQl1bnNpZ25lZCBmcHMgPSBkaXNwbGF5LT5mcHM7CisJdW5zaWduZWQgaW50IGJwcCA9IGRpc3BsYXktPmJwcDsKKwl1bnNpZ25lZCBpbnQgZnBzID0gZGlzcGxheS0+ZnBzOwogCWludCB2bWVtX3NpemUsIGk7CiAJaW50ICppbml0X3NlcXVlbmNlID0gZGlzcGxheS0+aW5pdF9zZXF1ZW5jZTsKIAljaGFyICpnYW1tYSA9IGRpc3BsYXktPmdhbW1hOwpAQCAtODIwLDYgKzgyMCw4IEBACiAJLyogVHJhbnNtaXQgYnVmZmVyICovCiAJaWYgKHR4YnVmbGVuID09IC0xKQogCQl0eGJ1ZmxlbiA9IHZtZW1fc2l6ZSArIDI7IC8qIGFkZCBpbiBjYXNlIHN0YXJ0Ynl0ZSBpcyB1c2VkICovCisJaWYgKHR4YnVmbGVuID49IHZtZW1fc2l6ZSArIDIpCisJCXR4YnVmbGVuID0gMDsKIAogI2lmZGVmIF9fTElUVExFX0VORElBTgogCWlmICgoIXR4YnVmbGVuKSAmJiAoYnBwID4gOCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC5oCmluZGV4IGQzYmMzOTQuLjg5YzRiNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC5oCkBAIC0zOCw3ICszOCw3IEBACiAgKi8KIHN0cnVjdCBmYnRmdF9ncGlvIHsKIAljaGFyIG5hbWVbRkJURlRfR1BJT19OQU1FX1NJWkVdOwotCXVuc2lnbmVkIGdwaW87CisJdW5zaWduZWQgaW50IGdwaW87CiB9OwogCiBzdHJ1Y3QgZmJ0ZnRfcGFyOwpAQCAtNzksNyArNzksNyBAQAogCXZvaWQgKCpyZXNldCkoc3RydWN0IGZidGZ0X3BhciAqcGFyKTsKIAl2b2lkICgqbWtkaXJ0eSkoc3RydWN0IGZiX2luZm8gKmluZm8sIGludCBmcm9tLCBpbnQgdG8pOwogCXZvaWQgKCp1cGRhdGVfZGlzcGxheSkoc3RydWN0IGZidGZ0X3BhciAqcGFyLAotCQkJCXVuc2lnbmVkIHN0YXJ0X2xpbmUsIHVuc2lnbmVkIGVuZF9saW5lKTsKKwkJCQl1bnNpZ25lZCBpbnQgc3RhcnRfbGluZSwgdW5zaWduZWQgaW50IGVuZF9saW5lKTsKIAlpbnQgKCppbml0X2Rpc3BsYXkpKHN0cnVjdCBmYnRmdF9wYXIgKnBhcik7CiAJaW50ICgqYmxhbmspKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgYm9vbCBvbik7CiAKQEAgLTExNSwxNCArMTE1LDE0IEBACiAgKiBUaGlzIHN0cnVjdHVyZSBpcyBub3Qgc3RvcmVkIGJ5IEZCVEZUIGV4Y2VwdCBmb3IgaW5pdF9zZXF1ZW5jZS4KICAqLwogc3RydWN0IGZidGZ0X2Rpc3BsYXkgewotCXVuc2lnbmVkIHdpZHRoOwotCXVuc2lnbmVkIGhlaWdodDsKLQl1bnNpZ25lZCByZWd3aWR0aDsKLQl1bnNpZ25lZCBidXN3aWR0aDsKLQl1bnNpZ25lZCBiYWNrbGlnaHQ7CisJdW5zaWduZWQgaW50IHdpZHRoOworCXVuc2lnbmVkIGludCBoZWlnaHQ7CisJdW5zaWduZWQgaW50IHJlZ3dpZHRoOworCXVuc2lnbmVkIGludCBidXN3aWR0aDsKKwl1bnNpZ25lZCBpbnQgYmFja2xpZ2h0OwogCXN0cnVjdCBmYnRmdF9vcHMgZmJ0ZnRvcHM7Ci0JdW5zaWduZWQgYnBwOwotCXVuc2lnbmVkIGZwczsKKwl1bnNpZ25lZCBpbnQgYnBwOworCXVuc2lnbmVkIGludCBmcHM7CiAJaW50IHR4YnVmbGVuOwogCWludCAqaW5pdF9zZXF1ZW5jZTsKIAljaGFyICpnYW1tYTsKQEAgLTE0Niw5ICsxNDYsOSBAQAogc3RydWN0IGZidGZ0X3BsYXRmb3JtX2RhdGEgewogCXN0cnVjdCBmYnRmdF9kaXNwbGF5IGRpc3BsYXk7CiAJY29uc3Qgc3RydWN0IGZidGZ0X2dwaW8gKmdwaW9zOwotCXVuc2lnbmVkIHJvdGF0ZTsKKwl1bnNpZ25lZCBpbnQgcm90YXRlOwogCWJvb2wgYmdyOwotCXVuc2lnbmVkIGZwczsKKwl1bnNpZ25lZCBpbnQgZnBzOwogCWludCB0eGJ1ZmxlbjsKIAl1OCBzdGFydGJ5dGU7CiAJY2hhciAqZ2FtbWE7CkBAIC0yMTYsOCArMjE2LDggQEAKIAl1OCBzdGFydGJ5dGU7CiAJc3RydWN0IGZidGZ0X29wcyBmYnRmdG9wczsKIAlzcGlubG9ja190IGRpcnR5X2xvY2s7Ci0JdW5zaWduZWQgZGlydHlfbGluZXNfc3RhcnQ7Ci0JdW5zaWduZWQgZGlydHlfbGluZXNfZW5kOworCXVuc2lnbmVkIGludCBkaXJ0eV9saW5lc19zdGFydDsKKwl1bnNpZ25lZCBpbnQgZGlydHlfbGluZXNfZW5kOwogCXN0cnVjdCB7CiAJCWludCByZXNldDsKIAkJaW50IGRjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0X2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0X2RldmljZS5jCmluZGV4IGU0YTM1NWEuLmU5MjExODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdF9kZXZpY2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnRfZGV2aWNlLmMKQEAgLTMyLDIwICszMiwyMCBAQAogbW9kdWxlX3BhcmFtKG5hbWUsIGNoYXJwLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobmFtZSwgIkRldmljZW5hbWUgKHJlcXVpcmVkKS4gbmFtZT1saXN0ID0+IGxpc3QgYWxsIHN1cHBvcnRlZCBkZXZpY2VzLiIpOwogCi1zdGF0aWMgdW5zaWduZWQgcm90YXRlOworc3RhdGljIHVuc2lnbmVkIGludCByb3RhdGU7CiBtb2R1bGVfcGFyYW0ocm90YXRlLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0Mocm90YXRlLAogIkFuZ2xlIHRvIHJvdGF0ZSBkaXNwbGF5IGNvdW50ZXIgY2xvY2t3aXNlOiAwLCA5MCwgMTgwLCAyNzAiKTsKIAotc3RhdGljIHVuc2lnbmVkIGJ1c251bTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnVzbnVtOwogbW9kdWxlX3BhcmFtKGJ1c251bSwgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGJ1c251bSwgIlNQSSBidXMgbnVtYmVyIChkZWZhdWx0PTApIik7CiAKLXN0YXRpYyB1bnNpZ25lZCBjczsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3M7CiBtb2R1bGVfcGFyYW0oY3MsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhjcywgIlNQSSBjaGlwIHNlbGVjdCAoZGVmYXVsdD0wKSIpOwogCi1zdGF0aWMgdW5zaWduZWQgc3BlZWQ7CitzdGF0aWMgdW5zaWduZWQgaW50IHNwZWVkOwogbW9kdWxlX3BhcmFtKHNwZWVkLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0Moc3BlZWQsICJTUEkgc3BlZWQgKG92ZXJyaWRlIGRldmljZSBkZWZhdWx0KSIpOwogCkBAIC01OCw3ICs1OCw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKGdwaW9zLAogIkxpc3Qgb2YgZ3Bpb3MuIENvbW1hIHNlcGFyYXRlZCB3aXRoIHRoZSBmb3JtOiByZXNldDoyMyxkYzoyNCAod2hlbiBvdmVycmlkaW5nIHRoZSBkZWZhdWx0LCBhbGwgZ3Bpb3MgbXVzdCBiZSBzcGVjaWZpZWQpIik7CiAKLXN0YXRpYyB1bnNpZ25lZCBmcHM7CitzdGF0aWMgdW5zaWduZWQgaW50IGZwczsKIG1vZHVsZV9wYXJhbShmcHMsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhmcHMsICJGcmFtZXMgcGVyIHNlY29uZCAob3ZlcnJpZGUgZHJpdmVyIGRlZmF1bHQpIik7CiAKQEAgLTc2LDcgKzc2LDcgQEAKIE1PRFVMRV9QQVJNX0RFU0MoYmdyLAogIkJHUiBiaXQgKHN1cHBvcnRlZCBieSBzb21lIGRyaXZlcnMpLiIpOwogCi1zdGF0aWMgdW5zaWduZWQgc3RhcnRieXRlOworc3RhdGljIHVuc2lnbmVkIGludCBzdGFydGJ5dGU7CiBtb2R1bGVfcGFyYW0oc3RhcnRieXRlLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0Moc3RhcnRieXRlLCAiU2V0cyB0aGUgU3RhcnQgYnl0ZSB1c2VkIGJ5IHNvbWUgU1BJIGRpc3BsYXlzLiIpOwogCkBAIC04NCwxNSArODQsMTUgQEAKIG1vZHVsZV9wYXJhbShjdXN0b20sIGJvb2wsIDApOwogTU9EVUxFX1BBUk1fREVTQyhjdXN0b20sICJBZGQgYSBjdXN0b20gZGlzcGxheSBkZXZpY2UuIFVzZSBzcGVlZD0gYXJndW1lbnQgdG8gbWFrZSBpdCBhIFNQSSBkZXZpY2UsIGVsc2UgcGxhdGZvcm1fZGV2aWNlIik7CiAKLXN0YXRpYyB1bnNpZ25lZCB3aWR0aDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd2lkdGg7CiBtb2R1bGVfcGFyYW0od2lkdGgsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh3aWR0aCwgIkRpc3BsYXkgd2lkdGgsIHVzZWQgd2l0aCB0aGUgY3VzdG9tIGFyZ3VtZW50Iik7CiAKLXN0YXRpYyB1bnNpZ25lZCBoZWlnaHQ7CitzdGF0aWMgdW5zaWduZWQgaW50IGhlaWdodDsKIG1vZHVsZV9wYXJhbShoZWlnaHQsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhoZWlnaHQsICJEaXNwbGF5IGhlaWdodCwgdXNlZCB3aXRoIHRoZSBjdXN0b20gYXJndW1lbnQiKTsKIAotc3RhdGljIHVuc2lnbmVkIGJ1c3dpZHRoID0gODsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnVzd2lkdGggPSA4OwogbW9kdWxlX3BhcmFtKGJ1c3dpZHRoLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoYnVzd2lkdGgsICJEaXNwbGF5IGJ1cyB3aWR0aCwgdXNlZCB3aXRoIHRoZSBjdXN0b20gYXJndW1lbnQiKTsKIApAQCAtMTA2LDcgKzEwNiw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLAogImxldmVsOiAwLTcgKHRoZSByZW1haW5pbmcgMjkgYml0cyBpcyBmb3IgYWR2YW5jZWQgdXNhZ2UpIik7CiAKLXN0YXRpYyB1bnNpZ25lZCB2ZXJib3NlID0gMzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmVyYm9zZSA9IDM7CiBtb2R1bGVfcGFyYW0odmVyYm9zZSwgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHZlcmJvc2UsCiAiMCBzaWxlbnQsID4wIHNob3cgZ3Bpb3MsID4xIHNob3cgZGV2aWNlcywgPjIgc2hvdyBkZXZpY2VzIGJlZm9yZSAoZGVmYXVsdD0zKSIpOwpAQCAtMTIxNSw3ICsxMjE1LDggQEAKIAkJfQogCX0sIHsKIAkJLyogVGhpcyBzaG91bGQgYmUgdGhlIGxhc3QgaXRlbS4KLQkJICAgVXNlZCB3aXRoIHRoZSBjdXN0b20gYXJndW1lbnQgKi8KKwkJICogVXNlZCB3aXRoIHRoZSBjdXN0b20gYXJndW1lbnQKKwkJICovCiAJCS5uYW1lID0gIiIsCiAJCS5zcGkgPSAmKHN0cnVjdCBzcGlfYm9hcmRfaW5mbykgewogCQkJLm1vZGFsaWFzID0gIiIsCkBAIC0xMzA2LDggKzEzMDcsOSBAQAogc3RhdGljIHZvaWQgZmJ0ZnRfZGV2aWNlX3BkZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAvKiBOZWVkZWQgdG8gc2lsZW5jZSB0aGlzIG1lc3NhZ2U6Ci1EZXZpY2UgJ3h4eCcgZG9lcyBub3QgaGF2ZSBhIHJlbGVhc2UoKSBmdW5jdGlvbiwgaXQgaXMgYnJva2VuIGFuZCBtdXN0IGJlIGZpeGVkCi0qLworICogRGV2aWNlICd4eHgnIGRvZXMgbm90IGhhdmUgYSByZWxlYXNlKCkgZnVuY3Rpb24sCisgKiBpdCBpcyBicm9rZW4gYW5kIG11c3QgYmUgZml4ZWQKKyAqLwogfQogCiBzdGF0aWMgaW50IHNwaV9kZXZpY2VfZm91bmQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQpAQCAtMTM0Niw3ICsxMzQ4LDcgQEAKIH0KIAogI2lmZGVmIE1PRFVMRQotc3RhdGljIHZvaWQgZmJ0ZnRfZGV2aWNlX3NwaV9kZWxldGUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwgdW5zaWduZWQgY3MpCitzdGF0aWMgdm9pZCBmYnRmdF9kZXZpY2Vfc3BpX2RlbGV0ZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCB1bnNpZ25lZCBpbnQgY3MpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCWNoYXIgc3RyWzMyXTsKQEAgLTEzOTksNyArMTQwMSw3IEBACiAJbG9uZyB2YWw7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAobmFtZSA9PSBOVUxMKSB7CisJaWYgKCFuYW1lKSB7CiAjaWZkZWYgTU9EVUxFCiAJCXByX2VycigibWlzc2luZyBtb2R1bGUgcGFyYW1ldGVyOiAnbmFtZSdcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE0MTYsMTQgKzE0MTgsMTQgQEAKIAogCS8qIHBhcnNlIG1vZHVsZSBwYXJhbWV0ZXI6IGdwaW9zICovCiAJd2hpbGUgKChwX2dwaW8gPSBzdHJzZXAoJmdwaW9zLCAiLCIpKSkgewotCQlpZiAoc3RyY2hyKHBfZ3BpbywgJzonKSA9PSBOVUxMKSB7CisJCWlmICghc3RyY2hyKHBfZ3BpbywgJzonKSkgewogCQkJcHJfZXJyKCJlcnJvcjogbWlzc2luZyAnOicgaW4gZ3Bpb3MgcGFyYW1ldGVyOiAlc1xuIiwKIAkJCSAgICAgICBwX2dwaW8pOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJcF9udW0gPSBwX2dwaW87CiAJCXBfbmFtZSA9IHN0cnNlcCgmcF9udW0sICI6Iik7Ci0JCWlmIChwX25hbWUgPT0gTlVMTCB8fCBwX251bSA9PSBOVUxMKSB7CisJCWlmICghcF9uYW1lIHx8ICFwX251bSkgewogCQkJcHJfZXJyKCJzb21ldGhpbmcgYmFkIGhhcHBlbmVkIHBhcnNpbmcgZ3Bpb3MgcGFyYW1ldGVyOiAlc1xuIiwKIAkJCSAgICAgICBwX2dwaW8pOwogCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL01ha2VmaWxlCmluZGV4IGU3MzE1MTcuLjM4NzE2ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL01ha2VmaWxlCkBAIC03LDEzICs3LDE0IEBACiAjCiBvYmotJChDT05GSUdfRlNMX01DX0JVUykgKz0gbWMtYnVzLWRyaXZlci5vCiAKLW1jLWJ1cy1kcml2ZXItb2JqcyA6PSBtYy1idXMubyBcCittYy1idXMtZHJpdmVyLW9ianMgOj0gZnNsLW1jLWJ1cy5vIFwKIAkJICAgICAgbWMtc3lzLm8gXAorCQkgICAgICBtYy1pby5vIFwKIAkJICAgICAgZHByYy5vIFwKIAkJICAgICAgZHBtbmcubyBcCiAJCSAgICAgIGRwcmMtZHJpdmVyLm8gXAotCQkgICAgICBtYy1hbGxvY2F0b3IubyBcCi0JCSAgICAgIG1jLW1zaS5vIFwKKwkJICAgICAgZnNsLW1jLWFsbG9jYXRvci5vIFwKKwkJICAgICAgZnNsLW1jLW1zaS5vIFwKIAkJICAgICAgaXJxLWdpYy12My1pdHMtZnNsLW1jLW1zaS5vIFwKIAkJICAgICAgZHBtY3AubyBcCiAJCSAgICAgIGRwYnAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBicC5jIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBicC5jCmluZGV4IGZlMjcxZmIuLjVkNGNkODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwYnAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcGJwLmMKQEAgLTEsMzQgKzEsMzQgQEAKIC8qIENvcHlyaWdodCAyMDEzLTIwMTYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0qICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZQotKiBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSoKLSoKLSogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQotKiBsYXRlciB2ZXJzaW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLSogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQotKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSovCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisgKiBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KICNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXN5cy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtY21kLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9kcGJwLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcG1jcC5jIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtY3AuYwppbmRleCAwNjQ0MDE3Li41NTc2NmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcG1jcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwbWNwLmMKQEAgLTMxLDYgKzMxLDcgQEAKICAqLwogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1jbWQuaCIKKwogI2luY2x1ZGUgImRwbWNwLmgiCiAjaW5jbHVkZSAiZHBtY3AtY21kLmgiCiAKQEAgLTM2OCw3ICszNjksNiBAQAogCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OwogCXN0cnVjdCBkcG1jcF9jbWRfc2V0X2lycV9tYXNrICpjbWRfcGFyYW1zOwogCi0KIAkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KIAljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBNQ1BfQ01ESURfU0VUX0lSUV9NQVNLLAogCQkJCQkgIGNtZF9mbGFncywgdG9rZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtbmctY21kLmggYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcG1uZy1jbWQuaAppbmRleCA3NzliZjljLi5hN2I3N2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcG1uZy1jbWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcG1uZy1jbWQuaApAQCAtMSw0ICsxLDUgQEAKLS8qIENvcHlyaWdodCAyMDEzLTIwMTYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorLyoKKyAqIENvcHlyaWdodCAyMDEzLTIwMTYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CkBAIC0zMCwxMiArMzEsMTIgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qCi0gZHBtbmctY21kLmgKLQotIGRlZmluZXMgcG9ydGFsIGNvbW1hbmRzCi0KLSAqLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBkcG1uZy1jbWQuaAorICoKKyAqIGRlZmluZXMgcG9ydGFsIGNvbW1hbmRzCisgKgorICovCiAKICNpZm5kZWYgX19GU0xfRFBNTkdfQ01EX0gKICNkZWZpbmUgX19GU0xfRFBNTkdfQ01EX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwbW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcG1uZy5jCmluZGV4IDY2MGJiZTcuLjk2YjFkNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwbW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtbmcuYwpAQCAtMSwzNyArMSwzOCBAQAogLyogQ29weXJpZ2h0IDIwMTMtMjAxNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0qICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCi0qIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0qIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotKgotKgotKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0qIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0qIGxhdGVyIHZlcnNpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFCi0qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotKi8KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUKKyAqIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1jbWQuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2RwbW5nLmgiCisKICNpbmNsdWRlICJkcG1uZy1jbWQuaCIKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcHJjLWNtZC5oIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHByYy1jbWQuaAppbmRleCBiYjEyN2Y0Li4wMDlkNjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcHJjLWNtZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwcmMtY21kLmgKQEAgLTEsNCArMSw1IEBACi0vKiBDb3B5cmlnaHQgMjAxMy0yMDE2IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKy8qCisgKiBDb3B5cmlnaHQgMjAxMy0yMDE2IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgpAQCAtMzAsMTIgKzMxLDEyIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKgotIGRwcmMtY21kLmgKLQotIGRlZmluZXMgZHByYyBwb3J0YWwgY29tbWFuZHMKLQotICovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRwcmMtY21kLmgKKyAqCisgKiBkZWZpbmVzIGRwcmMgcG9ydGFsIGNvbW1hbmRzCisgKgorICovCiAKICNpZm5kZWYgX0ZTTF9EUFJDX0NNRF9ICiAjZGVmaW5lIF9GU0xfRFBSQ19DTURfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHByYy1kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwcmMtZHJpdmVyLmMKaW5kZXggZDJhNzFmMS4uYzVlZTQ2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHByYy1kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcHJjLWRyaXZlci5jCkBAIC05LDEzICs5LDIxIEBACiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KIAotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtcHJpdmF0ZS5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21zaS5oPgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtYnVzLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1zeXMuaCIKKwogI2luY2x1ZGUgImRwcmMtY21kLmgiCisjaW5jbHVkZSAiZnNsLW1jLXByaXZhdGUuaCIKKworI2RlZmluZSBGU0xfTUNfRFBSQ19EUklWRVJfTkFNRSAgICAiZnNsX21jX2RwcmMiCisKKyNkZWZpbmUgRlNMX01DX0RFVklDRV9NQVRDSChfbWNfZGV2LCBfb2JqX2Rlc2MpIFwKKwkoc3RyY21wKChfbWNfZGV2KS0+b2JqX2Rlc2MudHlwZSwgKF9vYmpfZGVzYyktPnR5cGUpID09IDAgJiYgXAorCSAoX21jX2RldiktPm9ial9kZXNjLmlkID09IChfb2JqX2Rlc2MpLT5pZCkKIAogc3RydWN0IGRwcmNfY2hpbGRfb2JqcyB7CiAJaW50IGNoaWxkX2NvdW50OwpAQCAtMTkwLDU1ICsxOTgsNiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgZHByY19pbml0X2FsbF9yZXNvdXJjZV9wb29scyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldikKLXsKLQlpbnQgcG9vbF90eXBlOwotCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2J1c19kZXYpOwotCi0JZm9yIChwb29sX3R5cGUgPSAwOyBwb29sX3R5cGUgPCBGU0xfTUNfTlVNX1BPT0xfVFlQRVM7IHBvb2xfdHlwZSsrKSB7Ci0JCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAqcmVzX3Bvb2wgPQotCQkgICAgJm1jX2J1cy0+cmVzb3VyY2VfcG9vbHNbcG9vbF90eXBlXTsKLQotCQlyZXNfcG9vbC0+dHlwZSA9IHBvb2xfdHlwZTsKLQkJcmVzX3Bvb2wtPm1heF9jb3VudCA9IDA7Ci0JCXJlc19wb29sLT5mcmVlX2NvdW50ID0gMDsKLQkJcmVzX3Bvb2wtPm1jX2J1cyA9IG1jX2J1czsKLQkJSU5JVF9MSVNUX0hFQUQoJnJlc19wb29sLT5mcmVlX2xpc3QpOwotCQltdXRleF9pbml0KCZyZXNfcG9vbC0+bXV0ZXgpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZHByY19jbGVhbnVwX3Jlc291cmNlX3Bvb2woc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYsCi0JCQkJICAgICAgIGVudW0gZnNsX21jX3Bvb2xfdHlwZSBwb29sX3R5cGUpCi17Ci0Jc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2U7Ci0Jc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqbmV4dDsKLQlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19idXNfZGV2KTsKLQlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnJlc19wb29sID0KLQkJCQkJJm1jX2J1cy0+cmVzb3VyY2VfcG9vbHNbcG9vbF90eXBlXTsKLQlpbnQgZnJlZV9jb3VudCA9IDA7Ci0KLQlXQVJOX09OKHJlc19wb29sLT50eXBlICE9IHBvb2xfdHlwZSk7Ci0JV0FSTl9PTihyZXNfcG9vbC0+ZnJlZV9jb3VudCAhPSByZXNfcG9vbC0+bWF4X2NvdW50KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXNvdXJjZSwgbmV4dCwgJnJlc19wb29sLT5mcmVlX2xpc3QsIG5vZGUpIHsKLQkJZnJlZV9jb3VudCsrOwotCQlXQVJOX09OKHJlc291cmNlLT50eXBlICE9IHJlc19wb29sLT50eXBlKTsKLQkJV0FSTl9PTihyZXNvdXJjZS0+cGFyZW50X3Bvb2wgIT0gcmVzX3Bvb2wpOwotCQlkZXZtX2tmcmVlKCZtY19idXNfZGV2LT5kZXYsIHJlc291cmNlKTsKLQl9Ci0KLQlXQVJOX09OKGZyZWVfY291bnQgIT0gcmVzX3Bvb2wtPmZyZWVfY291bnQpOwotfQotCi1zdGF0aWMgdm9pZCBkcHJjX2NsZWFudXBfYWxsX3Jlc291cmNlX3Bvb2xzKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2KQotewotCWludCBwb29sX3R5cGU7Ci0KLQlmb3IgKHBvb2xfdHlwZSA9IDA7IHBvb2xfdHlwZSA8IEZTTF9NQ19OVU1fUE9PTF9UWVBFUzsgcG9vbF90eXBlKyspCi0JCWRwcmNfY2xlYW51cF9yZXNvdXJjZV9wb29sKG1jX2J1c19kZXYsIHBvb2xfdHlwZSk7Ci19Ci0KIC8qKgogICogZHByY19zY2FuX29iamVjdHMgLSBEaXNjb3ZlciBvYmplY3RzIGluIGEgRFBSQwogICoKQEAgLTM2Myw3ICszMjIsNyBAQAogCXVuc2lnbmVkIGludCBpcnFfY291bnQ7CiAJc3RydWN0IGZzbF9tY19idXMgKm1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfYnVzX2Rldik7CiAKLQlkcHJjX2luaXRfYWxsX3Jlc291cmNlX3Bvb2xzKG1jX2J1c19kZXYpOworCWZzbF9tY19pbml0X2FsbF9yZXNvdXJjZV9wb29scyhtY19idXNfZGV2KTsKIAogCS8qCiAJICogRGlzY292ZXIgb2JqZWN0cyBpbiB0aGUgRFBSQzoKQEAgLTM5MCw3ICszNDksNyBAQAogCiAJcmV0dXJuIDA7CiBlcnJvcjoKLQlkcHJjX2NsZWFudXBfYWxsX3Jlc291cmNlX3Bvb2xzKG1jX2J1c19kZXYpOworCWZzbF9tY19jbGVhbnVwX2FsbF9yZXNvdXJjZV9wb29scyhtY19idXNfZGV2KTsKIAlyZXR1cm4gZXJyb3I7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkcHJjX3NjYW5fY29udGFpbmVyKTsKQEAgLTY0OSw3ICs2MDgsNyBAQAogCQkvKgogCQkgKiBUaGlzIGlzIGEgY2hpbGQgRFBSQzoKIAkJICovCi0JCWlmIChXQVJOX09OKHBhcmVudF9kZXYtPmJ1cyAhPSAmZnNsX21jX2J1c190eXBlKSkKKwkJaWYgKFdBUk5fT04oIWRldl9pc19mc2xfbWMocGFyZW50X2RldikpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJaWYgKFdBUk5fT04obWNfZGV2LT5vYmpfZGVzYy5yZWdpb25fY291bnQgPT0gMCkpCkBAIC02ODEsNyArNjQwLDcgQEAKIAkJICovCiAJCXN0cnVjdCBpcnFfZG9tYWluICptY19tc2lfZG9tYWluOwogCi0JCWlmIChXQVJOX09OKHBhcmVudF9kZXYtPmJ1cyA9PSAmZnNsX21jX2J1c190eXBlKSkKKwkJaWYgKFdBUk5fT04oZGV2X2lzX2ZzbF9tYyhwYXJlbnRfZGV2KSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQllcnJvciA9IGZzbF9tY19maW5kX21zaV9kb21haW4ocGFyZW50X2RldiwKQEAgLTgwMiw3ICs3NjEsNyBAQAogCQlkZXZfc2V0X21zaV9kb21haW4oJm1jX2Rldi0+ZGV2LCBOVUxMKTsKIAl9CiAKLQlkcHJjX2NsZWFudXBfYWxsX3Jlc291cmNlX3Bvb2xzKG1jX2Rldik7CisJZnNsX21jX2NsZWFudXBfYWxsX3Jlc291cmNlX3Bvb2xzKG1jX2Rldik7CiAKIAllcnJvciA9IGRwcmNfY2xvc2UobWNfZGV2LT5tY19pbywgMCwgbWNfZGV2LT5tY19oYW5kbGUpOwogCWlmIChlcnJvciA8IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcHJjLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcHJjLmMKaW5kZXggYzI2MDU0OS4uOWZlYTNkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHByYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwcmMuYwpAQCAtMSwzNyArMSwzOCBAQAogLyogQ29weXJpZ2h0IDIwMTMtMjAxNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0qICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCi0qIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0qIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotKgotKgotKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0qIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0qIGxhdGVyIHZlcnNpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFCi0qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotKi8KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUKKyAqIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1jbWQuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2RwcmMuaCIKKwogI2luY2x1ZGUgImRwcmMtY21kLmgiCiAKIC8qKgpAQCAtMTMzNCwyMCArMTMzNSwyMCBAQAogfQogCiAvKioKLSogZHByY19nZXRfY29ubmVjdGlvbigpIC0gR2V0IGNvbm5lY3RlZCBlbmRwb2ludCBhbmQgbGluayBzdGF0dXMgaWYgY29ubmVjdGlvbgotKgkJCWV4aXN0cy4KLSogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKLSogQGNtZF9mbGFnczoJQ29tbWFuZCBmbGFnczsgb25lIG9yIG1vcmUgb2YgJ01DX0NNRF9GTEFHXycKLSogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAotKiBAZW5kcG9pbnQxOglFbmRwb2ludCAxIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwotKiBAZW5kcG9pbnQyOglSZXR1cm5lZCBlbmRwb2ludCAyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwotKiBAc3RhdGU6CVJldHVybmVkIGxpbmsgc3RhdGU6Ci0qCQkxIC0gbGluayBpcyB1cDsKLSoJCTAgLSBsaW5rIGlzIGRvd247Ci0qCQktMSAtIG5vIGNvbm5lY3Rpb24gKGVuZHBvaW50MiBpbmZvcm1hdGlvbiBpcyBpcnJlbGV2YW50KQotKgotKiBSZXR1cm46ICAgICAnMCcgb24gU3VjY2VzczsgLUVOQVZBSUwgaWYgY29ubmVjdGlvbiBkb2VzIG5vdCBleGlzdC4KLSovCisgKiBkcHJjX2dldF9jb25uZWN0aW9uKCkgLSBHZXQgY29ubmVjdGVkIGVuZHBvaW50IGFuZCBsaW5rIHN0YXR1cyBpZiBjb25uZWN0aW9uCisgKgkJCWV4aXN0cy4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAY21kX2ZsYWdzOglDb21tYW5kIGZsYWdzOyBvbmUgb3IgbW9yZSBvZiAnTUNfQ01EX0ZMQUdfJworICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQGVuZHBvaW50MToJRW5kcG9pbnQgMSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqIEBlbmRwb2ludDI6CVJldHVybmVkIGVuZHBvaW50IDIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKiBAc3RhdGU6CVJldHVybmVkIGxpbmsgc3RhdGU6CisgKgkJMSAtIGxpbmsgaXMgdXA7CisgKgkJMCAtIGxpbmsgaXMgZG93bjsKKyAqCQktMSAtIG5vIGNvbm5lY3Rpb24gKGVuZHBvaW50MiBpbmZvcm1hdGlvbiBpcyBpcnJlbGV2YW50KQorICoKKyAqIFJldHVybjogICAgICcwJyBvbiBTdWNjZXNzOyAtRU5BVkFJTCBpZiBjb25uZWN0aW9uIGRvZXMgbm90IGV4aXN0LgorICovCiBpbnQgZHByY19nZXRfY29ubmVjdGlvbihzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKIAkJCXUzMiBjbWRfZmxhZ3MsCiAJCQl1MTYgdG9rZW4sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9mc2wtbWMtYWxsb2NhdG9yLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9mc2wtbWMtYWxsb2NhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzYWI1MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2ZzbC1tYy1hbGxvY2F0b3IuYwpAQCAtMCwwICsxLDY2OCBAQAorLyoKKyAqIEZyZWVzY2FsZSBNQyBvYmplY3QgZGV2aWNlIGFsbG9jYXRvciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tc2kuaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLWJ1cy5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9kcGJwLWNtZC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZHBjb24tY21kLmgiCisKKyNpbmNsdWRlICJmc2wtbWMtcHJpdmF0ZS5oIgorCisjZGVmaW5lIEZTTF9NQ19JU19BTExPQ0FUQUJMRShfb2JqX3R5cGUpIFwKKwkoc3RyY21wKF9vYmpfdHlwZSwgImRwYnAiKSA9PSAwIHx8IFwKKwkgc3RyY21wKF9vYmpfdHlwZSwgImRwbWNwIikgPT0gMCB8fCBcCisJIHN0cmNtcChfb2JqX3R5cGUsICJkcGNvbiIpID09IDApCisKKy8qKgorICogZnNsX21jX3Jlc291cmNlX3Bvb2xfYWRkX2RldmljZSAtIGFkZCBhbGxvY2F0YWJsZSBkZXZpY2UgdG8gYSByZXNvdXJjZQorICogcG9vbCBvZiBhIGdpdmVuIE1DIGJ1cworICoKKyAqIEBtY19idXM6IHBvaW50ZXIgdG8gdGhlIE1DIGJ1cworICogQHBvb2xfdHlwZTogTUMgYnVzIHBvb2wgdHlwZQorICogQG1jX2RldjogUG9pbnRlciB0byBhbGxvY2F0YWJsZSBNQyBvYmplY3QgZGV2aWNlCisgKgorICogSXQgYWRkcyBhbiBhbGxvY2F0YWJsZSBNQyBvYmplY3QgZGV2aWNlIHRvIGEgY29udGFpbmVyJ3MgcmVzb3VyY2UgcG9vbCBvZgorICogdGhlIGdpdmVuIHJlc291cmNlIHR5cGUKKyAqLworc3RhdGljIGludCBfX211c3RfY2hlY2sgZnNsX21jX3Jlc291cmNlX3Bvb2xfYWRkX2RldmljZShzdHJ1Y3QgZnNsX21jX2J1cworCQkJCQkJCQkqbWNfYnVzLAorCQkJCQkJCWVudW0gZnNsX21jX3Bvb2xfdHlwZQorCQkJCQkJCQlwb29sX3R5cGUsCisJCQkJCQkJc3RydWN0IGZzbF9tY19kZXZpY2UKKwkJCQkJCQkJKm1jX2RldikKK3sKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnJlc19wb29sOworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2ID0gJm1jX2J1cy0+bWNfZGV2OworCWludCBlcnJvciA9IC1FSU5WQUw7CisKKwlpZiAoV0FSTl9PTihwb29sX3R5cGUgPCAwIHx8IHBvb2xfdHlwZSA+PSBGU0xfTUNfTlVNX1BPT0xfVFlQRVMpKQorCQlnb3RvIG91dDsKKwlpZiAoV0FSTl9PTighRlNMX01DX0lTX0FMTE9DQVRBQkxFKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSkpKQorCQlnb3RvIG91dDsKKwlpZiAoV0FSTl9PTihtY19kZXYtPnJlc291cmNlKSkKKwkJZ290byBvdXQ7CisKKwlyZXNfcG9vbCA9ICZtY19idXMtPnJlc291cmNlX3Bvb2xzW3Bvb2xfdHlwZV07CisJaWYgKFdBUk5fT04ocmVzX3Bvb2wtPnR5cGUgIT0gcG9vbF90eXBlKSkKKwkJZ290byBvdXQ7CisJaWYgKFdBUk5fT04ocmVzX3Bvb2wtPm1jX2J1cyAhPSBtY19idXMpKQorCQlnb3RvIG91dDsKKworCW11dGV4X2xvY2soJnJlc19wb29sLT5tdXRleCk7CisKKwlpZiAoV0FSTl9PTihyZXNfcG9vbC0+bWF4X2NvdW50IDwgMCkpCisJCWdvdG8gb3V0X3VubG9jazsKKwlpZiAoV0FSTl9PTihyZXNfcG9vbC0+ZnJlZV9jb3VudCA8IDAgfHwKKwkJICAgIHJlc19wb29sLT5mcmVlX2NvdW50ID4gcmVzX3Bvb2wtPm1heF9jb3VudCkpCisJCWdvdG8gb3V0X3VubG9jazsKKworCXJlc291cmNlID0gZGV2bV9remFsbG9jKCZtY19idXNfZGV2LT5kZXYsIHNpemVvZigqcmVzb3VyY2UpLAorCQkJCUdGUF9LRVJORUwpOworCWlmICghcmVzb3VyY2UpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlkZXZfZXJyKCZtY19idXNfZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZnNsX21jX3Jlc291cmNlXG4iKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXJlc291cmNlLT50eXBlID0gcG9vbF90eXBlOworCXJlc291cmNlLT5pZCA9IG1jX2Rldi0+b2JqX2Rlc2MuaWQ7CisJcmVzb3VyY2UtPmRhdGEgPSBtY19kZXY7CisJcmVzb3VyY2UtPnBhcmVudF9wb29sID0gcmVzX3Bvb2w7CisJSU5JVF9MSVNUX0hFQUQoJnJlc291cmNlLT5ub2RlKTsKKwlsaXN0X2FkZF90YWlsKCZyZXNvdXJjZS0+bm9kZSwgJnJlc19wb29sLT5mcmVlX2xpc3QpOworCW1jX2Rldi0+cmVzb3VyY2UgPSByZXNvdXJjZTsKKwlyZXNfcG9vbC0+ZnJlZV9jb3VudCsrOworCXJlc19wb29sLT5tYXhfY291bnQrKzsKKwllcnJvciA9IDA7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmcmVzX3Bvb2wtPm11dGV4KTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogZnNsX21jX3Jlc291cmNlX3Bvb2xfcmVtb3ZlX2RldmljZSAtIHJlbW92ZSBhbiBhbGxvY2F0YWJsZSBkZXZpY2UgZnJvbSBhCisgKiByZXNvdXJjZSBwb29sCisgKgorICogQG1jX2RldjogUG9pbnRlciB0byBhbGxvY2F0YWJsZSBNQyBvYmplY3QgZGV2aWNlCisgKgorICogSXQgcGVybWFuZW50bHkgcmVtb3ZlcyBhbiBhbGxvY2F0YWJsZSBNQyBvYmplY3QgZGV2aWNlIGZyb20gdGhlIHJlc291cmNlCisgKiBwb29sLCB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBpbiwgYXMgbG9uZyBhcyBpdCBpcyBpbiB0aGUgcG9vbCdzIGZyZWUgbGlzdC4KKyAqLworc3RhdGljIGludCBfX211c3RfY2hlY2sgZnNsX21jX3Jlc291cmNlX3Bvb2xfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZnNsX21jX2RldmljZQorCQkJCQkJCQkgICAqbWNfZGV2KQoreworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2OworCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXM7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sICpyZXNfcG9vbDsKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZTsKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCisJaWYgKFdBUk5fT04oIUZTTF9NQ19JU19BTExPQ0FUQUJMRShtY19kZXYtPm9ial9kZXNjLnR5cGUpKSkKKwkJZ290byBvdXQ7CisKKwlyZXNvdXJjZSA9IG1jX2Rldi0+cmVzb3VyY2U7CisJaWYgKFdBUk5fT04oIXJlc291cmNlIHx8IHJlc291cmNlLT5kYXRhICE9IG1jX2RldikpCisJCWdvdG8gb3V0OworCisJbWNfYnVzX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UobWNfZGV2LT5kZXYucGFyZW50KTsKKwltY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2J1c19kZXYpOworCXJlc19wb29sID0gcmVzb3VyY2UtPnBhcmVudF9wb29sOworCWlmIChXQVJOX09OKHJlc19wb29sICE9ICZtY19idXMtPnJlc291cmNlX3Bvb2xzW3Jlc291cmNlLT50eXBlXSkpCisJCWdvdG8gb3V0OworCisJbXV0ZXhfbG9jaygmcmVzX3Bvb2wtPm11dGV4KTsKKworCWlmIChXQVJOX09OKHJlc19wb29sLT5tYXhfY291bnQgPD0gMCkpCisJCWdvdG8gb3V0X3VubG9jazsKKwlpZiAoV0FSTl9PTihyZXNfcG9vbC0+ZnJlZV9jb3VudCA8PSAwIHx8CisJCSAgICByZXNfcG9vbC0+ZnJlZV9jb3VudCA+IHJlc19wb29sLT5tYXhfY291bnQpKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGFsbG9jYXRlZCwgaXRzIHJlc291cmNlIGlzIG5vdAorCSAqIGluIHRoZSBmcmVlIGxpc3QgYW5kIHRodXMsIHRoZSBkZXZpY2UgY2Fubm90IGJlIHJlbW92ZWQuCisJICovCisJaWYgKGxpc3RfZW1wdHkoJnJlc291cmNlLT5ub2RlKSkgeworCQllcnJvciA9IC1FQlVTWTsKKwkJZGV2X2VycigmbWNfYnVzX2Rldi0+ZGV2LAorCQkJIkRldmljZSAlcyBjYW5ub3QgYmUgcmVtb3ZlZCBmcm9tIHJlc291cmNlIHBvb2xcbiIsCisJCQlkZXZfbmFtZSgmbWNfZGV2LT5kZXYpKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWxpc3RfZGVsX2luaXQoJnJlc291cmNlLT5ub2RlKTsKKwlyZXNfcG9vbC0+ZnJlZV9jb3VudC0tOworCXJlc19wb29sLT5tYXhfY291bnQtLTsKKworCWRldm1fa2ZyZWUoJm1jX2J1c19kZXYtPmRldiwgcmVzb3VyY2UpOworCW1jX2Rldi0+cmVzb3VyY2UgPSBOVUxMOworCWVycm9yID0gMDsKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGZzbF9tY19wb29sX3R5cGVfc3RyaW5nc1tdID0geworCVtGU0xfTUNfUE9PTF9EUE1DUF0gPSAiZHBtY3AiLAorCVtGU0xfTUNfUE9PTF9EUEJQXSA9ICJkcGJwIiwKKwlbRlNMX01DX1BPT0xfRFBDT05dID0gImRwY29uIiwKKwlbRlNMX01DX1BPT0xfSVJRXSA9ICJpcnEiLAorfTsKKworc3RhdGljIGludCBfX211c3RfY2hlY2sgb2JqZWN0X3R5cGVfdG9fcG9vbF90eXBlKGNvbnN0IGNoYXIgKm9iamVjdF90eXBlLAorCQkJCQkJIGVudW0gZnNsX21jX3Bvb2xfdHlwZQorCQkJCQkJCQkqcG9vbF90eXBlKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZnNsX21jX3Bvb2xfdHlwZV9zdHJpbmdzKTsgaSsrKSB7CisJCWlmIChzdHJjbXAob2JqZWN0X3R5cGUsIGZzbF9tY19wb29sX3R5cGVfc3RyaW5nc1tpXSkgPT0gMCkgeworCQkJKnBvb2xfdHlwZSA9IGk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitpbnQgX19tdXN0X2NoZWNrIGZzbF9tY19yZXNvdXJjZV9hbGxvY2F0ZShzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzLAorCQkJCQkgIGVudW0gZnNsX21jX3Bvb2xfdHlwZSBwb29sX3R5cGUsCisJCQkJCSAgc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqKm5ld19yZXNvdXJjZSkKK3sKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnJlc19wb29sOworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2ID0gJm1jX2J1cy0+bWNfZGV2OworCWludCBlcnJvciA9IC1FSU5WQUw7CisKKwlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShmc2xfbWNfcG9vbF90eXBlX3N0cmluZ3MpICE9CisJCSAgICAgRlNMX01DX05VTV9QT09MX1RZUEVTKTsKKworCSpuZXdfcmVzb3VyY2UgPSBOVUxMOworCWlmIChXQVJOX09OKHBvb2xfdHlwZSA8IDAgfHwgcG9vbF90eXBlID49IEZTTF9NQ19OVU1fUE9PTF9UWVBFUykpCisJCWdvdG8gb3V0OworCisJcmVzX3Bvb2wgPSAmbWNfYnVzLT5yZXNvdXJjZV9wb29sc1twb29sX3R5cGVdOworCWlmIChXQVJOX09OKHJlc19wb29sLT5tY19idXMgIT0gbWNfYnVzKSkKKwkJZ290byBvdXQ7CisKKwltdXRleF9sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOworCXJlc291cmNlID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZyZXNfcG9vbC0+ZnJlZV9saXN0LAorCQkJCQkgICAgc3RydWN0IGZzbF9tY19yZXNvdXJjZSwgbm9kZSk7CisKKwlpZiAoIXJlc291cmNlKSB7CisJCVdBUk5fT04ocmVzX3Bvb2wtPmZyZWVfY291bnQgIT0gMCk7CisJCWVycm9yID0gLUVOWElPOworCQlkZXZfZXJyKCZtY19idXNfZGV2LT5kZXYsCisJCQkiTm8gbW9yZSByZXNvdXJjZXMgb2YgdHlwZSAlcyBsZWZ0XG4iLAorCQkJZnNsX21jX3Bvb2xfdHlwZV9zdHJpbmdzW3Bvb2xfdHlwZV0pOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaWYgKFdBUk5fT04ocmVzb3VyY2UtPnR5cGUgIT0gcG9vbF90eXBlKSkKKwkJZ290byBvdXRfdW5sb2NrOworCWlmIChXQVJOX09OKHJlc291cmNlLT5wYXJlbnRfcG9vbCAhPSByZXNfcG9vbCkpCisJCWdvdG8gb3V0X3VubG9jazsKKwlpZiAoV0FSTl9PTihyZXNfcG9vbC0+ZnJlZV9jb3VudCA8PSAwIHx8CisJCSAgICByZXNfcG9vbC0+ZnJlZV9jb3VudCA+IHJlc19wb29sLT5tYXhfY291bnQpKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlsaXN0X2RlbF9pbml0KCZyZXNvdXJjZS0+bm9kZSk7CisKKwlyZXNfcG9vbC0+ZnJlZV9jb3VudC0tOworCWVycm9yID0gMDsKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOworCSpuZXdfcmVzb3VyY2UgPSByZXNvdXJjZTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfcmVzb3VyY2VfYWxsb2NhdGUpOworCit2b2lkIGZzbF9tY19yZXNvdXJjZV9mcmVlKHN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlKQoreworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAqcmVzX3Bvb2w7CisKKwlyZXNfcG9vbCA9IHJlc291cmNlLT5wYXJlbnRfcG9vbDsKKwlpZiAoV0FSTl9PTihyZXNvdXJjZS0+dHlwZSAhPSByZXNfcG9vbC0+dHlwZSkpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJnJlc19wb29sLT5tdXRleCk7CisJaWYgKFdBUk5fT04ocmVzX3Bvb2wtPmZyZWVfY291bnQgPCAwIHx8CisJCSAgICByZXNfcG9vbC0+ZnJlZV9jb3VudCA+PSByZXNfcG9vbC0+bWF4X2NvdW50KSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJaWYgKFdBUk5fT04oIWxpc3RfZW1wdHkoJnJlc291cmNlLT5ub2RlKSkpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWxpc3RfYWRkX3RhaWwoJnJlc291cmNlLT5ub2RlLCAmcmVzX3Bvb2wtPmZyZWVfbGlzdCk7CisJcmVzX3Bvb2wtPmZyZWVfY291bnQrKzsKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX3Jlc291cmNlX2ZyZWUpOworCisvKioKKyAqIGZzbF9tY19vYmplY3RfYWxsb2NhdGUgLSBBbGxvY2F0ZXMgYSBNQyBvYmplY3QgZGV2aWNlIG9mIHRoZSBnaXZlbgorICogcG9vbCB0eXBlIGZyb20gYSBnaXZlbiBNQyBidXMKKyAqCisgKiBAbWNfZGV2OiBNQyBkZXZpY2UgZm9yIHdoaWNoIHRoZSBNQyBvYmplY3QgZGV2aWNlIGlzIHRvIGJlIGFsbG9jYXRlZAorICogQHBvb2xfdHlwZTogTUMgYnVzIHJlc291cmNlIHBvb2wgdHlwZQorICogQG5ld19tY19kZXY6IFBvaW50ZXIgdG8gYXJlYSB3aGVyZSB0aGUgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkCisgKiBNQyBvYmplY3QgZGV2aWNlIGlzIHRvIGJlIHJldHVybmVkCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBNQyBvYmplY3QgZGV2aWNlIGZyb20gdGhlIGRldmljZSdzIHBhcmVudCBEUFJDLAorICogZnJvbSB0aGUgY29ycmVzcG9uZGluZyBNQyBidXMnIHBvb2wgb2YgYWxsb2NhdGFibGUgTUMgb2JqZWN0IGRldmljZXMgb2YKKyAqIHRoZSBnaXZlbiByZXNvdXJjZSB0eXBlLiBtY19kZXYgY2Fubm90IGJlIGEgRFBSQyBpdHNlbGYuCisgKgorICogTk9URTogcG9vbF90eXBlIG11c3QgYmUgZGlmZmVyZW50IGZyb20gRlNMX01DX1BPT0xfTUNQLCBzaW5jZSBNQworICogcG9ydGFscyBhcmUgYWxsb2NhdGVkIHVzaW5nIGZzbF9tY19wb3J0YWxfYWxsb2NhdGUoKSwgaW5zdGVhZCBvZgorICogdGhpcyBmdW5jdGlvbi4KKyAqLworaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfb2JqZWN0X2FsbG9jYXRlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYsCisJCQkJCWVudW0gZnNsX21jX3Bvb2xfdHlwZSBwb29sX3R5cGUsCisJCQkJCXN0cnVjdCBmc2xfbWNfZGV2aWNlICoqbmV3X21jX2FkZXYpCit7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXY7CisJc3RydWN0IGZzbF9tY19idXMgKm1jX2J1czsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYWRldjsKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlID0gTlVMTDsKKworCSpuZXdfbWNfYWRldiA9IE5VTEw7CisJaWYgKFdBUk5fT04obWNfZGV2LT5mbGFncyAmIEZTTF9NQ19JU19EUFJDKSkKKwkJZ290byBlcnJvcjsKKworCWlmIChXQVJOX09OKCFkZXZfaXNfZnNsX21jKG1jX2Rldi0+ZGV2LnBhcmVudCkpKQorCQlnb3RvIGVycm9yOworCisJaWYgKFdBUk5fT04ocG9vbF90eXBlID09IEZTTF9NQ19QT09MX0RQTUNQKSkKKwkJZ290byBlcnJvcjsKKworCW1jX2J1c19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKG1jX2Rldi0+ZGV2LnBhcmVudCk7CisJbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19idXNfZGV2KTsKKwllcnJvciA9IGZzbF9tY19yZXNvdXJjZV9hbGxvY2F0ZShtY19idXMsIHBvb2xfdHlwZSwgJnJlc291cmNlKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycm9yOworCisJbWNfYWRldiA9IHJlc291cmNlLT5kYXRhOworCWlmIChXQVJOX09OKCFtY19hZGV2KSkKKwkJZ290byBlcnJvcjsKKworCSpuZXdfbWNfYWRldiA9IG1jX2FkZXY7CisJcmV0dXJuIDA7CitlcnJvcjoKKwlpZiAocmVzb3VyY2UpCisJCWZzbF9tY19yZXNvdXJjZV9mcmVlKHJlc291cmNlKTsKKworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19vYmplY3RfYWxsb2NhdGUpOworCisvKioKKyAqIGZzbF9tY19vYmplY3RfZnJlZSAtIFJldHVybnMgYW4gYWxsb2NhdGFibGUgTUMgb2JqZWN0IGRldmljZSB0byB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgcG9vbCBvZiBhIGdpdmVuIE1DIGJ1cy4KKyAqCisgKiBAbWNfYWRldjogUG9pbnRlciB0byB0aGUgTUMgb2JqZWN0IGRldmljZQorICovCit2b2lkIGZzbF9tY19vYmplY3RfZnJlZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYWRldikKK3sKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZTsKKworCXJlc291cmNlID0gbWNfYWRldi0+cmVzb3VyY2U7CisJaWYgKFdBUk5fT04ocmVzb3VyY2UtPnR5cGUgPT0gRlNMX01DX1BPT0xfRFBNQ1ApKQorCQlyZXR1cm47CisJaWYgKFdBUk5fT04ocmVzb3VyY2UtPmRhdGEgIT0gbWNfYWRldikpCisJCXJldHVybjsKKworCWZzbF9tY19yZXNvdXJjZV9mcmVlKHJlc291cmNlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19vYmplY3RfZnJlZSk7CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBpbnRlcnJ1cHQgcG9vbCBhc3NvY2lhdGVkIHdpdGggYSBNQyBidXMuCisgKiBJdCBhbGxvY2F0ZXMgYSBibG9jayBvZiBJUlFzIGZyb20gdGhlIEdJQy1JVFMKKyAqLworaW50IGZzbF9tY19wb3B1bGF0ZV9pcnFfcG9vbChzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzLAorCQkJICAgICB1bnNpZ25lZCBpbnQgaXJxX2NvdW50KQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBtc2lfZGVzYyAqbXNpX2Rlc2M7CisJc3RydWN0IGZzbF9tY19kZXZpY2VfaXJxICppcnFfcmVzb3VyY2VzOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlX2lycSAqbWNfZGV2X2lycTsKKwlpbnQgZXJyb3I7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYgPSAmbWNfYnVzLT5tY19kZXY7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sICpyZXNfcG9vbCA9CisJCQkmbWNfYnVzLT5yZXNvdXJjZV9wb29sc1tGU0xfTUNfUE9PTF9JUlFdOworCisJaWYgKFdBUk5fT04oaXJxX2NvdW50ID09IDAgfHwKKwkJICAgIGlycV9jb3VudCA+IEZTTF9NQ19JUlFfUE9PTF9NQVhfVE9UQUxfSVJRUykpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyb3IgPSBmc2xfbWNfbXNpX2RvbWFpbl9hbGxvY19pcnFzKCZtY19idXNfZGV2LT5kZXYsIGlycV9jb3VudCk7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJaXJxX3Jlc291cmNlcyA9IGRldm1fa3phbGxvYygmbWNfYnVzX2Rldi0+ZGV2LAorCQkJCSAgICAgc2l6ZW9mKCppcnFfcmVzb3VyY2VzKSAqIGlycV9jb3VudCwKKwkJCQkgICAgIEdGUF9LRVJORUwpOworCWlmICghaXJxX3Jlc291cmNlcykgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cF9tc2lfaXJxczsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaXJxX2NvdW50OyBpKyspIHsKKwkJbWNfZGV2X2lycSA9ICZpcnFfcmVzb3VyY2VzW2ldOworCisJCS8qCisJCSAqIE5PVEU6IFRoaXMgbWNfZGV2X2lycSdzIE1TSSBhZGRyL3ZhbHVlIHBhaXIgd2lsbCBiZSBzZXQKKwkJICogYnkgdGhlIGZzbF9tY19tc2lfd3JpdGVfbXNnKCkgY2FsbGJhY2sKKwkJICovCisJCW1jX2Rldl9pcnEtPnJlc291cmNlLnR5cGUgPSByZXNfcG9vbC0+dHlwZTsKKwkJbWNfZGV2X2lycS0+cmVzb3VyY2UuZGF0YSA9IG1jX2Rldl9pcnE7CisJCW1jX2Rldl9pcnEtPnJlc291cmNlLnBhcmVudF9wb29sID0gcmVzX3Bvb2w7CisJCUlOSVRfTElTVF9IRUFEKCZtY19kZXZfaXJxLT5yZXNvdXJjZS5ub2RlKTsKKwkJbGlzdF9hZGRfdGFpbCgmbWNfZGV2X2lycS0+cmVzb3VyY2Uubm9kZSwgJnJlc19wb29sLT5mcmVlX2xpc3QpOworCX0KKworCWZvcl9lYWNoX21zaV9lbnRyeShtc2lfZGVzYywgJm1jX2J1c19kZXYtPmRldikgeworCQltY19kZXZfaXJxID0gJmlycV9yZXNvdXJjZXNbbXNpX2Rlc2MtPmZzbF9tYy5tc2lfaW5kZXhdOworCQltY19kZXZfaXJxLT5tc2lfZGVzYyA9IG1zaV9kZXNjOworCQltY19kZXZfaXJxLT5yZXNvdXJjZS5pZCA9IG1zaV9kZXNjLT5pcnE7CisJfQorCisJcmVzX3Bvb2wtPm1heF9jb3VudCA9IGlycV9jb3VudDsKKwlyZXNfcG9vbC0+ZnJlZV9jb3VudCA9IGlycV9jb3VudDsKKwltY19idXMtPmlycV9yZXNvdXJjZXMgPSBpcnFfcmVzb3VyY2VzOworCXJldHVybiAwOworCitjbGVhbnVwX21zaV9pcnFzOgorCWZzbF9tY19tc2lfZG9tYWluX2ZyZWVfaXJxcygmbWNfYnVzX2Rldi0+ZGV2KTsKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfcG9wdWxhdGVfaXJxX3Bvb2wpOworCisvKioKKyAqIFRlYXJkb3duIHRoZSBpbnRlcnJ1cHQgcG9vbCBhc3NvY2lhdGVkIHdpdGggYW4gTUMgYnVzLgorICogSXQgZnJlZXMgdGhlIElSUXMgdGhhdCB3ZXJlIGFsbG9jYXRlZCB0byB0aGUgcG9vbCwgYmFjayB0byB0aGUgR0lDLUlUUy4KKyAqLwordm9pZCBmc2xfbWNfY2xlYW51cF9pcnFfcG9vbChzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzKQoreworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2ID0gJm1jX2J1cy0+bWNfZGV2OworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAqcmVzX3Bvb2wgPQorCQkJJm1jX2J1cy0+cmVzb3VyY2VfcG9vbHNbRlNMX01DX1BPT0xfSVJRXTsKKworCWlmIChXQVJOX09OKCFtY19idXMtPmlycV9yZXNvdXJjZXMpKQorCQlyZXR1cm47CisKKwlpZiAoV0FSTl9PTihyZXNfcG9vbC0+bWF4X2NvdW50ID09IDApKQorCQlyZXR1cm47CisKKwlpZiAoV0FSTl9PTihyZXNfcG9vbC0+ZnJlZV9jb3VudCAhPSByZXNfcG9vbC0+bWF4X2NvdW50KSkKKwkJcmV0dXJuOworCisJSU5JVF9MSVNUX0hFQUQoJnJlc19wb29sLT5mcmVlX2xpc3QpOworCXJlc19wb29sLT5tYXhfY291bnQgPSAwOworCXJlc19wb29sLT5mcmVlX2NvdW50ID0gMDsKKwltY19idXMtPmlycV9yZXNvdXJjZXMgPSBOVUxMOworCWZzbF9tY19tc2lfZG9tYWluX2ZyZWVfaXJxcygmbWNfYnVzX2Rldi0+ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19jbGVhbnVwX2lycV9wb29sKTsKKworLyoqCisgKiBJdCBhbGxvY2F0ZXMgdGhlIElSUXMgcmVxdWlyZWQgYnkgYSBnaXZlbiBNQyBvYmplY3QgZGV2aWNlLiBUaGUKKyAqIElSUXMgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZSBpbnRlcnJ1cHQgcG9vbCBhc3NvY2lhdGVkIHdpdGggdGhlCisgKiBNQyBidXMgdGhhdCBjb250YWlucyB0aGUgZGV2aWNlLCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBhIERQUkMgZGV2aWNlLgorICogT3RoZXJ3aXNlLCB0aGUgSVJRcyBhcmUgYWxsb2NhdGVkIGZyb20gdGhlIGludGVycnVwdCBwb29sIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhlIE1DIGJ1cyB0aGF0IHJlcHJlc2VudHMgdGhlIERQUkMgZGV2aWNlIGl0c2VsZi4KKyAqLworaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfYWxsb2NhdGVfaXJxcyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2KQoreworCWludCBpOworCWludCBpcnFfY291bnQ7CisJaW50IHJlc19hbGxvY2F0ZWRfY291bnQgPSAwOworCWludCBlcnJvciA9IC1FSU5WQUw7CisJc3RydWN0IGZzbF9tY19kZXZpY2VfaXJxICoqaXJxcyA9IE5VTEw7CisJc3RydWN0IGZzbF9tY19idXMgKm1jX2J1czsKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnJlc19wb29sOworCisJaWYgKFdBUk5fT04obWNfZGV2LT5pcnFzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpcnFfY291bnQgPSBtY19kZXYtPm9ial9kZXNjLmlycV9jb3VudDsKKwlpZiAoV0FSTl9PTihpcnFfY291bnQgPT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHN0cmNtcChtY19kZXYtPm9ial9kZXNjLnR5cGUsICJkcHJjIikgPT0gMCkKKwkJbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19kZXYpOworCWVsc2UKKwkJbWNfYnVzID0gdG9fZnNsX21jX2J1cyh0b19mc2xfbWNfZGV2aWNlKG1jX2Rldi0+ZGV2LnBhcmVudCkpOworCisJaWYgKFdBUk5fT04oIW1jX2J1cy0+aXJxX3Jlc291cmNlcykpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVzX3Bvb2wgPSAmbWNfYnVzLT5yZXNvdXJjZV9wb29sc1tGU0xfTUNfUE9PTF9JUlFdOworCWlmIChyZXNfcG9vbC0+ZnJlZV9jb3VudCA8IGlycV9jb3VudCkgeworCQlkZXZfZXJyKCZtY19kZXYtPmRldiwKKwkJCSJOb3QgYWJsZSB0byBhbGxvY2F0ZSAldSBpcnFzIGZvciBkZXZpY2VcbiIsIGlycV9jb3VudCk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCWlycXMgPSBkZXZtX2t6YWxsb2MoJm1jX2Rldi0+ZGV2LCBpcnFfY291bnQgKiBzaXplb2YoaXJxc1swXSksCisJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFpcnFzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBpcnFfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZTsKKworCQllcnJvciA9IGZzbF9tY19yZXNvdXJjZV9hbGxvY2F0ZShtY19idXMsIEZTTF9NQ19QT09MX0lSUSwKKwkJCQkJCSAmcmVzb3VyY2UpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBlcnJvcl9yZXNvdXJjZV9hbGxvYzsKKworCQlpcnFzW2ldID0gdG9fZnNsX21jX2lycShyZXNvdXJjZSk7CisJCXJlc19hbGxvY2F0ZWRfY291bnQrKzsKKworCQlXQVJOX09OKGlycXNbaV0tPm1jX2Rldik7CisJCWlycXNbaV0tPm1jX2RldiA9IG1jX2RldjsKKwkJaXJxc1tpXS0+ZGV2X2lycV9pbmRleCA9IGk7CisJfQorCisJbWNfZGV2LT5pcnFzID0gaXJxczsKKwlyZXR1cm4gMDsKKworZXJyb3JfcmVzb3VyY2VfYWxsb2M6CisJZm9yIChpID0gMDsgaSA8IHJlc19hbGxvY2F0ZWRfY291bnQ7IGkrKykgeworCQlpcnFzW2ldLT5tY19kZXYgPSBOVUxMOworCQlmc2xfbWNfcmVzb3VyY2VfZnJlZSgmaXJxc1tpXS0+cmVzb3VyY2UpOworCX0KKworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19hbGxvY2F0ZV9pcnFzKTsKKworLyoKKyAqIEl0IGZyZWVzIHRoZSBJUlFzIHRoYXQgd2VyZSBhbGxvY2F0ZWQgZm9yIGEgTUMgb2JqZWN0IGRldmljZSwgYnkKKyAqIHJldHVybmluZyB0aGVtIHRvIHRoZSBjb3JyZXNwb25kaW5nIGludGVycnVwdCBwb29sLgorICovCit2b2lkIGZzbF9tY19mcmVlX2lycXMoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldikKK3sKKwlpbnQgaTsKKwlpbnQgaXJxX2NvdW50OworCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXM7CisJc3RydWN0IGZzbF9tY19kZXZpY2VfaXJxICoqaXJxcyA9IG1jX2Rldi0+aXJxczsKKworCWlmIChXQVJOX09OKCFpcnFzKSkKKwkJcmV0dXJuOworCisJaXJxX2NvdW50ID0gbWNfZGV2LT5vYmpfZGVzYy5pcnFfY291bnQ7CisKKwlpZiAoc3RyY21wKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSwgImRwcmMiKSA9PSAwKQorCQltY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2Rldik7CisJZWxzZQorCQltY19idXMgPSB0b19mc2xfbWNfYnVzKHRvX2ZzbF9tY19kZXZpY2UobWNfZGV2LT5kZXYucGFyZW50KSk7CisKKwlpZiAoV0FSTl9PTighbWNfYnVzLT5pcnFfcmVzb3VyY2VzKSkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IGlycV9jb3VudDsgaSsrKSB7CisJCVdBUk5fT04oIWlycXNbaV0tPm1jX2Rldik7CisJCWlycXNbaV0tPm1jX2RldiA9IE5VTEw7CisJCWZzbF9tY19yZXNvdXJjZV9mcmVlKCZpcnFzW2ldLT5yZXNvdXJjZSk7CisJfQorCisJbWNfZGV2LT5pcnFzID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19mcmVlX2lycXMpOworCit2b2lkIGZzbF9tY19pbml0X2FsbF9yZXNvdXJjZV9wb29scyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldikKK3sKKwlpbnQgcG9vbF90eXBlOworCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2J1c19kZXYpOworCisJZm9yIChwb29sX3R5cGUgPSAwOyBwb29sX3R5cGUgPCBGU0xfTUNfTlVNX1BPT0xfVFlQRVM7IHBvb2xfdHlwZSsrKSB7CisJCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAqcmVzX3Bvb2wgPQorCQkgICAgJm1jX2J1cy0+cmVzb3VyY2VfcG9vbHNbcG9vbF90eXBlXTsKKworCQlyZXNfcG9vbC0+dHlwZSA9IHBvb2xfdHlwZTsKKwkJcmVzX3Bvb2wtPm1heF9jb3VudCA9IDA7CisJCXJlc19wb29sLT5mcmVlX2NvdW50ID0gMDsKKwkJcmVzX3Bvb2wtPm1jX2J1cyA9IG1jX2J1czsKKwkJSU5JVF9MSVNUX0hFQUQoJnJlc19wb29sLT5mcmVlX2xpc3QpOworCQltdXRleF9pbml0KCZyZXNfcG9vbC0+bXV0ZXgpOworCX0KK30KKworc3RhdGljIHZvaWQgZnNsX21jX2NsZWFudXBfcmVzb3VyY2VfcG9vbChzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldiwKKwkJCQkJIGVudW0gZnNsX21jX3Bvb2xfdHlwZSBwb29sX3R5cGUpCit7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2U7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqbmV4dDsKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19idXNfZGV2KTsKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnJlc19wb29sID0KKwkJCQkJJm1jX2J1cy0+cmVzb3VyY2VfcG9vbHNbcG9vbF90eXBlXTsKKwlpbnQgZnJlZV9jb3VudCA9IDA7CisKKwlXQVJOX09OKHJlc19wb29sLT50eXBlICE9IHBvb2xfdHlwZSk7CisJV0FSTl9PTihyZXNfcG9vbC0+ZnJlZV9jb3VudCAhPSByZXNfcG9vbC0+bWF4X2NvdW50KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXNvdXJjZSwgbmV4dCwgJnJlc19wb29sLT5mcmVlX2xpc3QsIG5vZGUpIHsKKwkJZnJlZV9jb3VudCsrOworCQlXQVJOX09OKHJlc291cmNlLT50eXBlICE9IHJlc19wb29sLT50eXBlKTsKKwkJV0FSTl9PTihyZXNvdXJjZS0+cGFyZW50X3Bvb2wgIT0gcmVzX3Bvb2wpOworCQlkZXZtX2tmcmVlKCZtY19idXNfZGV2LT5kZXYsIHJlc291cmNlKTsKKwl9CisKKwlXQVJOX09OKGZyZWVfY291bnQgIT0gcmVzX3Bvb2wtPmZyZWVfY291bnQpOworfQorCit2b2lkIGZzbF9tY19jbGVhbnVwX2FsbF9yZXNvdXJjZV9wb29scyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldikKK3sKKwlpbnQgcG9vbF90eXBlOworCisJZm9yIChwb29sX3R5cGUgPSAwOyBwb29sX3R5cGUgPCBGU0xfTUNfTlVNX1BPT0xfVFlQRVM7IHBvb2xfdHlwZSsrKQorCQlmc2xfbWNfY2xlYW51cF9yZXNvdXJjZV9wb29sKG1jX2J1c19kZXYsIHBvb2xfdHlwZSk7Cit9CisKKy8qKgorICogZnNsX21jX2FsbG9jYXRvcl9wcm9iZSAtIGNhbGxiYWNrIGludm9rZWQgd2hlbiBhbiBhbGxvY2F0YWJsZSBkZXZpY2UgaXMKKyAqIGJlaW5nIGFkZGVkIHRvIHRoZSBzeXN0ZW0KKyAqLworc3RhdGljIGludCBmc2xfbWNfYWxsb2NhdG9yX3Byb2JlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYpCit7CisJZW51bSBmc2xfbWNfcG9vbF90eXBlIHBvb2xfdHlwZTsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldjsKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzOworCWludCBlcnJvcjsKKworCWlmIChXQVJOX09OKCFGU0xfTUNfSVNfQUxMT0NBVEFCTEUobWNfZGV2LT5vYmpfZGVzYy50eXBlKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJbWNfYnVzX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UobWNfZGV2LT5kZXYucGFyZW50KTsKKwlpZiAoV0FSTl9PTighZGV2X2lzX2ZzbF9tYygmbWNfYnVzX2Rldi0+ZGV2KSkpCisJCXJldHVybiAtRUlOVkFMOworCisJbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19idXNfZGV2KTsKKwllcnJvciA9IG9iamVjdF90eXBlX3RvX3Bvb2xfdHlwZShtY19kZXYtPm9ial9kZXNjLnR5cGUsICZwb29sX3R5cGUpOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0gZnNsX21jX3Jlc291cmNlX3Bvb2xfYWRkX2RldmljZShtY19idXMsIHBvb2xfdHlwZSwgbWNfZGV2KTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwlkZXZfZGJnKCZtY19kZXYtPmRldiwKKwkJIkFsbG9jYXRhYmxlIE1DIG9iamVjdCBkZXZpY2UgYm91bmQgdG8gZnNsX21jX2FsbG9jYXRvciBkcml2ZXIiKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmc2xfbWNfYWxsb2NhdG9yX3JlbW92ZSAtIGNhbGxiYWNrIGludm9rZWQgd2hlbiBhbiBhbGxvY2F0YWJsZSBkZXZpY2UgaXMKKyAqIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtCisgKi8KK3N0YXRpYyBpbnQgZnNsX21jX2FsbG9jYXRvcl9yZW1vdmUoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldikKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoV0FSTl9PTighRlNMX01DX0lTX0FMTE9DQVRBQkxFKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtY19kZXYtPnJlc291cmNlKSB7CisJCWVycm9yID0gZnNsX21jX3Jlc291cmNlX3Bvb2xfcmVtb3ZlX2RldmljZShtY19kZXYpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJcmV0dXJuIGVycm9yOworCX0KKworCWRldl9kYmcoJm1jX2Rldi0+ZGV2LAorCQkiQWxsb2NhdGFibGUgTUMgb2JqZWN0IGRldmljZSB1bmJvdW5kIGZyb20gZnNsX21jX2FsbG9jYXRvciBkcml2ZXIiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmc2xfbWNfZGV2aWNlX2lkIG1hdGNoX2lkX3RhYmxlW10gPSB7CisJeworCSAudmVuZG9yID0gRlNMX01DX1ZFTkRPUl9GUkVFU0NBTEUsCisJIC5vYmpfdHlwZSA9ICJkcGJwIiwKKwl9LAorCXsKKwkgLnZlbmRvciA9IEZTTF9NQ19WRU5ET1JfRlJFRVNDQUxFLAorCSAub2JqX3R5cGUgPSAiZHBtY3AiLAorCX0sCisJeworCSAudmVuZG9yID0gRlNMX01DX1ZFTkRPUl9GUkVFU0NBTEUsCisJIC5vYmpfdHlwZSA9ICJkcGNvbiIsCisJfSwKKwl7LnZlbmRvciA9IDB4MH0sCit9OworCitzdGF0aWMgc3RydWN0IGZzbF9tY19kcml2ZXIgZnNsX21jX2FsbG9jYXRvcl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAiZnNsX21jX2FsbG9jYXRvciIsCisJCSAgIC5wbSA9IE5VTEwsCisJCSAgIH0sCisJLm1hdGNoX2lkX3RhYmxlID0gbWF0Y2hfaWRfdGFibGUsCisJLnByb2JlID0gZnNsX21jX2FsbG9jYXRvcl9wcm9iZSwKKwkucmVtb3ZlID0gZnNsX21jX2FsbG9jYXRvcl9yZW1vdmUsCit9OworCitpbnQgX19pbml0IGZzbF9tY19hbGxvY2F0b3JfZHJpdmVyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZnNsX21jX2RyaXZlcl9yZWdpc3RlcigmZnNsX21jX2FsbG9jYXRvcl9kcml2ZXIpOworfQorCit2b2lkIGZzbF9tY19hbGxvY2F0b3JfZHJpdmVyX2V4aXQodm9pZCkKK3sKKwlmc2xfbWNfZHJpdmVyX3VucmVnaXN0ZXIoJmZzbF9tY19hbGxvY2F0b3JfZHJpdmVyKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2ZzbC1tYy1idXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2ZzbC1tYy1idXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGY2NGI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZnNsLW1jLWJ1cy5jCkBAIC0wLDAgKzEsOTIwIEBACisvKgorICogRnJlZXNjYWxlIE1hbmFnZW1lbnQgQ29tcGxleCAoTUMpIGJ1cyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIEF1dGhvcjogR2VybWFuIFJpdmVyYSA8R2VybWFuLlJpdmVyYUBmcmVlc2NhbGUuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvbXNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLWJ1cy5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZHBtbmcuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXN5cy5oIgorCisjaW5jbHVkZSAiZnNsLW1jLXByaXZhdGUuaCIKKyNpbmNsdWRlICJkcHJjLWNtZC5oIgorCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKm1jX2Rldl9jYWNoZTsKKworLyoqCisgKiBEZWZhdWx0IERNQSBtYXNrIGZvciBkZXZpY2VzIG9uIGEgZnNsLW1jIGJ1cworICovCisjZGVmaW5lIEZTTF9NQ19ERUZBVUxUX0RNQV9NQVNLCSh+MFVMTCkKKworLyoqCisgKiBzdHJ1Y3QgZnNsX21jIC0gUHJpdmF0ZSBkYXRhIG9mIGEgImZzbCxxb3JpcS1tYyIgcGxhdGZvcm0gZGV2aWNlCisgKiBAcm9vdF9tY19idXNfZGV2OiBNQyBvYmplY3QgZGV2aWNlIHJlcHJlc2VudGluZyB0aGUgcm9vdCBEUFJDCisgKiBAbnVtX3RyYW5zbGF0aW9uX3JhbmdlczogbnVtYmVyIG9mIGVudHJpZXMgaW4gYWRkcl90cmFuc2xhdGlvbl9yYW5nZXMKKyAqIEB0cmFuc2xhdGlvbl9yYW5nZXM6IGFycmF5IG9mIGJ1cyB0byBzeXN0ZW0gYWRkcmVzcyB0cmFuc2xhdGlvbiByYW5nZXMKKyAqLworc3RydWN0IGZzbF9tYyB7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKnJvb3RfbWNfYnVzX2RldjsKKwl1OCBudW1fdHJhbnNsYXRpb25fcmFuZ2VzOworCXN0cnVjdCBmc2xfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZSAqdHJhbnNsYXRpb25fcmFuZ2VzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZnNsX21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2UgLSBidXMgdG8gc3lzdGVtIGFkZHJlc3MgdHJhbnNsYXRpb24KKyAqIHJhbmdlCisgKiBAbWNfcmVnaW9uX3R5cGU6IFR5cGUgb2YgTUMgcmVnaW9uIGZvciB0aGUgcmFuZ2UgYmVpbmcgdHJhbnNsYXRlZAorICogQHN0YXJ0X21jX29mZnNldDogU3RhcnQgTUMgb2Zmc2V0IG9mIHRoZSByYW5nZSBiZWluZyB0cmFuc2xhdGVkCisgKiBAZW5kX21jX29mZnNldDogTUMgb2Zmc2V0IG9mIHRoZSBmaXJzdCBieXRlIGFmdGVyIHRoZSByYW5nZSAobGFzdCBNQworICogb2Zmc2V0IG9mIHRoZSByYW5nZSBpcyBlbmRfbWNfb2Zmc2V0IC0gMSkKKyAqIEBzdGFydF9waHlzX2FkZHI6IHN5c3RlbSBwaHlzaWNhbCBhZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gc3RhcnRfbWNfYWRkcgorICovCitzdHJ1Y3QgZnNsX21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2UgeworCWVudW0gZHByY19yZWdpb25fdHlwZSBtY19yZWdpb25fdHlwZTsKKwl1NjQgc3RhcnRfbWNfb2Zmc2V0OworCXU2NCBlbmRfbWNfb2Zmc2V0OworCXBoeXNfYWRkcl90IHN0YXJ0X3BoeXNfYWRkcjsKK307CisKKy8qKgorICogZnNsX21jX2J1c19tYXRjaCAtIGRldmljZSB0byBkcml2ZXIgbWF0Y2hpbmcgY2FsbGJhY2sKKyAqIEBkZXY6IHRoZSBNQyBvYmplY3QgZGV2aWNlIHN0cnVjdHVyZSB0byBtYXRjaCBhZ2FpbnN0CisgKiBAZHJ2OiB0aGUgZGV2aWNlIGRyaXZlciB0byBzZWFyY2ggZm9yIG1hdGNoaW5nIE1DIG9iamVjdCBkZXZpY2UgaWQKKyAqIHN0cnVjdHVyZXMKKyAqCisgKiBSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgZnNsX21jX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJY29uc3Qgc3RydWN0IGZzbF9tY19kZXZpY2VfaWQgKmlkOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKGRldik7CisJc3RydWN0IGZzbF9tY19kcml2ZXIgKm1jX2RydiA9IHRvX2ZzbF9tY19kcml2ZXIoZHJ2KTsKKwlib29sIGZvdW5kID0gZmFsc2U7CisKKwlpZiAoV0FSTl9PTighZnNsX21jX2J1c19leGlzdHMoKSkpCisJCWdvdG8gb3V0OworCisJaWYgKCFtY19kcnYtPm1hdGNoX2lkX3RhYmxlKQorCQlnb3RvIG91dDsKKworCS8qCisJICogSWYgdGhlIG9iamVjdCBpcyBub3QgJ3BsdWdnZWQnIGRvbid0IG1hdGNoLgorCSAqIE9ubHkgZXhjZXB0aW9uIGlzIHRoZSByb290IERQUkMsIHdoaWNoIGlzIGEgc3BlY2lhbCBjYXNlLgorCSAqLworCWlmICgobWNfZGV2LT5vYmpfZGVzYy5zdGF0ZSAmIERQUkNfT0JKX1NUQVRFX1BMVUdHRUQpID09IDAgJiYKKwkgICAgIWZzbF9tY19pc19yb290X2RwcmMoJm1jX2Rldi0+ZGV2KSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIFRyYXZlcnNlIHRoZSBtYXRjaF9pZCB0YWJsZSBvZiB0aGUgZ2l2ZW4gZHJpdmVyLCB0cnlpbmcgdG8gZmluZAorCSAqIGEgbWF0Y2hpbmcgZm9yIHRoZSBnaXZlbiBNQyBvYmplY3QgZGV2aWNlLgorCSAqLworCWZvciAoaWQgPSBtY19kcnYtPm1hdGNoX2lkX3RhYmxlOyBpZC0+dmVuZG9yICE9IDB4MDsgaWQrKykgeworCQlpZiAoaWQtPnZlbmRvciA9PSBtY19kZXYtPm9ial9kZXNjLnZlbmRvciAmJgorCQkgICAgc3RyY21wKGlkLT5vYmpfdHlwZSwgbWNfZGV2LT5vYmpfZGVzYy50eXBlKSA9PSAwKSB7CisJCQlmb3VuZCA9IHRydWU7CisKKwkJCWJyZWFrOworCQl9CisJfQorCitvdXQ6CisJZGV2X2RiZyhkZXYsICIlc21hdGNoZWRcbiIsIGZvdW5kID8gIiIgOiAibm90ICIpOworCXJldHVybiBmb3VuZDsKK30KKworLyoqCisgKiBmc2xfbWNfYnVzX3VldmVudCAtIGNhbGxiYWNrIGludm9rZWQgd2hlbiBhIGRldmljZSBpcyBhZGRlZAorICovCitzdGF0aWMgaW50IGZzbF9tY19idXNfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQoreworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKGRldik7CisKKwlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiTU9EQUxJQVM9ZnNsLW1jOnYlMDhYZCVzIiwKKwkJCSAgIG1jX2Rldi0+b2JqX2Rlc2MudmVuZG9yLAorCQkJICAgbWNfZGV2LT5vYmpfZGVzYy50eXBlKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgbW9kYWxpYXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgImZzbC1tYzp2JTA4WGQlc1xuIiwgbWNfZGV2LT5vYmpfZGVzYy52ZW5kb3IsCisJCSAgICAgICBtY19kZXYtPm9ial9kZXNjLnR5cGUpOworfQorc3RhdGljIERFVklDRV9BVFRSX1JPKG1vZGFsaWFzKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmZzbF9tY19kZXZfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfbW9kYWxpYXMuYXR0ciwKKwlOVUxMLAorfTsKKworQVRUUklCVVRFX0dST1VQUyhmc2xfbWNfZGV2KTsKKworc3RydWN0IGJ1c190eXBlIGZzbF9tY19idXNfdHlwZSA9IHsKKwkubmFtZSA9ICJmc2wtbWMiLAorCS5tYXRjaCA9IGZzbF9tY19idXNfbWF0Y2gsCisJLnVldmVudCA9IGZzbF9tY19idXNfdWV2ZW50LAorCS5kZXZfZ3JvdXBzID0gZnNsX21jX2Rldl9ncm91cHMsCit9OworRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX2J1c190eXBlKTsKKworc3RhdGljIGF0b21pY190IHJvb3RfZHByY19jb3VudCA9IEFUT01JQ19JTklUKDApOworCitzdGF0aWMgaW50IGZzbF9tY19kcml2ZXJfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBmc2xfbWNfZHJpdmVyICptY19kcnY7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UoZGV2KTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoV0FSTl9PTighZGV2LT5kcml2ZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1jX2RydiA9IHRvX2ZzbF9tY19kcml2ZXIoZGV2LT5kcml2ZXIpOworCWlmIChXQVJOX09OKCFtY19kcnYtPnByb2JlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnJvciA9IG1jX2Rydi0+cHJvYmUobWNfZGV2KTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiTUMgb2JqZWN0IGRldmljZSBwcm9iZSBjYWxsYmFjayBmYWlsZWQ6ICVkXG4iLAorCQkJZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNsX21jX2RyaXZlcl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBmc2xfbWNfZHJpdmVyICptY19kcnYgPSB0b19mc2xfbWNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2ID0gdG9fZnNsX21jX2RldmljZShkZXYpOworCWludCBlcnJvcjsKKworCWlmIChXQVJOX09OKCFkZXYtPmRyaXZlcikpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyb3IgPSBtY19kcnYtPnJlbW92ZShtY19kZXYpOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycihkZXYsCisJCQkiTUMgb2JqZWN0IGRldmljZSByZW1vdmUgY2FsbGJhY2sgZmFpbGVkOiAlZFxuIiwKKwkJCWVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmc2xfbWNfZHJpdmVyX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZnNsX21jX2RyaXZlciAqbWNfZHJ2ID0gdG9fZnNsX21jX2RyaXZlcihkZXYtPmRyaXZlcik7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UoZGV2KTsKKworCW1jX2Rydi0+c2h1dGRvd24obWNfZGV2KTsKK30KKworLyoqCisgKiBfX2ZzbF9tY19kcml2ZXJfcmVnaXN0ZXIgLSByZWdpc3RlcnMgYSBjaGlsZCBkZXZpY2UgZHJpdmVyIHdpdGggdGhlCisgKiBNQyBidXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGltcGxpY2l0bHkgaW52b2tlZCBmcm9tIHRoZSByZWdpc3RyYXRpb24gZnVuY3Rpb24gb2YKKyAqIGZzbF9tYyBkZXZpY2UgZHJpdmVycywgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IHRoZQorICogbW9kdWxlX2ZzbF9tY19kcml2ZXIoKSBtYWNyby4KKyAqLworaW50IF9fZnNsX21jX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgZnNsX21jX2RyaXZlciAqbWNfZHJpdmVyLAorCQkJICAgICBzdHJ1Y3QgbW9kdWxlICpvd25lcikKK3sKKwlpbnQgZXJyb3I7CisKKwltY19kcml2ZXItPmRyaXZlci5vd25lciA9IG93bmVyOworCW1jX2RyaXZlci0+ZHJpdmVyLmJ1cyA9ICZmc2xfbWNfYnVzX3R5cGU7CisKKwlpZiAobWNfZHJpdmVyLT5wcm9iZSkKKwkJbWNfZHJpdmVyLT5kcml2ZXIucHJvYmUgPSBmc2xfbWNfZHJpdmVyX3Byb2JlOworCisJaWYgKG1jX2RyaXZlci0+cmVtb3ZlKQorCQltY19kcml2ZXItPmRyaXZlci5yZW1vdmUgPSBmc2xfbWNfZHJpdmVyX3JlbW92ZTsKKworCWlmIChtY19kcml2ZXItPnNodXRkb3duKQorCQltY19kcml2ZXItPmRyaXZlci5zaHV0ZG93biA9IGZzbF9tY19kcml2ZXJfc2h1dGRvd247CisKKwllcnJvciA9IGRyaXZlcl9yZWdpc3RlcigmbWNfZHJpdmVyLT5kcml2ZXIpOworCWlmIChlcnJvciA8IDApIHsKKwkJcHJfZXJyKCJkcml2ZXJfcmVnaXN0ZXIoKSBmYWlsZWQgZm9yICVzOiAlZFxuIiwKKwkJICAgICAgIG1jX2RyaXZlci0+ZHJpdmVyLm5hbWUsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCXByX2luZm8oIk1DIG9iamVjdCBkZXZpY2UgZHJpdmVyICVzIHJlZ2lzdGVyZWRcbiIsCisJCW1jX2RyaXZlci0+ZHJpdmVyLm5hbWUpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19mc2xfbWNfZHJpdmVyX3JlZ2lzdGVyKTsKKworLyoqCisgKiBmc2xfbWNfZHJpdmVyX3VucmVnaXN0ZXIgLSB1bnJlZ2lzdGVycyBhIGRldmljZSBkcml2ZXIgZnJvbSB0aGUKKyAqIE1DIGJ1cworICovCit2b2lkIGZzbF9tY19kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgZnNsX21jX2RyaXZlciAqbWNfZHJpdmVyKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZtY19kcml2ZXItPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfZHJpdmVyX3VucmVnaXN0ZXIpOworCisvKioKKyAqIGZzbF9tY19idXNfZXhpc3RzIC0gY2hlY2sgaWYgYSByb290IGRwcmMgZXhpc3RzCisgKi8KK2Jvb2wgZnNsX21jX2J1c19leGlzdHModm9pZCkKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJnJvb3RfZHByY19jb3VudCkgPiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX2J1c19leGlzdHMpOworCisvKioKKyAqIGZzbF9tY19nZXRfcm9vdF9kcHJjIC0gZnVuY3Rpb24gdG8gdHJhdmVyc2UgdG8gdGhlIHJvb3QgZHByYworICovCit2b2lkIGZzbF9tY19nZXRfcm9vdF9kcHJjKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGRldmljZSAqKnJvb3RfZHByY19kZXYpCit7CisJaWYgKFdBUk5fT04oIWRldikpIHsKKwkJKnJvb3RfZHByY19kZXYgPSBOVUxMOworCX0gZWxzZSBpZiAoV0FSTl9PTighZGV2X2lzX2ZzbF9tYyhkZXYpKSkgeworCQkqcm9vdF9kcHJjX2RldiA9IE5VTEw7CisJfSBlbHNlIHsKKwkJKnJvb3RfZHByY19kZXYgPSBkZXY7CisJCXdoaWxlIChkZXZfaXNfZnNsX21jKCgqcm9vdF9kcHJjX2RldiktPnBhcmVudCkpCisJCQkqcm9vdF9kcHJjX2RldiA9ICgqcm9vdF9kcHJjX2RldiktPnBhcmVudDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfZ2V0X3Jvb3RfZHByYyk7CisKK3N0YXRpYyBpbnQgZ2V0X2RwcmNfYXR0cihzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCSBpbnQgY29udGFpbmVyX2lkLCBzdHJ1Y3QgZHByY19hdHRyaWJ1dGVzICphdHRyKQoreworCXUxNiBkcHJjX2hhbmRsZTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRwcmNfb3BlbihtY19pbywgMCwgY29udGFpbmVyX2lkLCAmZHByY19oYW5kbGUpOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycihtY19pby0+ZGV2LCAiZHByY19vcGVuKCkgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJbWVtc2V0KGF0dHIsIDAsIHNpemVvZihzdHJ1Y3QgZHByY19hdHRyaWJ1dGVzKSk7CisJZXJyb3IgPSBkcHJjX2dldF9hdHRyaWJ1dGVzKG1jX2lvLCAwLCBkcHJjX2hhbmRsZSwgYXR0cik7CisJaWYgKGVycm9yIDwgMCkgeworCQlkZXZfZXJyKG1jX2lvLT5kZXYsICJkcHJjX2dldF9hdHRyaWJ1dGVzKCkgZmFpbGVkOiAlZFxuIiwKKwkJCWVycm9yKTsKKwkJZ290byBjb21tb25fY2xlYW51cDsKKwl9CisKKwllcnJvciA9IDA7CisKK2NvbW1vbl9jbGVhbnVwOgorCSh2b2lkKWRwcmNfY2xvc2UobWNfaW8sIDAsIGRwcmNfaGFuZGxlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2RwcmNfaWNpZChzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCSBpbnQgY29udGFpbmVyX2lkLCB1MTYgKmljaWQpCit7CisJc3RydWN0IGRwcmNfYXR0cmlidXRlcyBhdHRyOworCWludCBlcnJvcjsKKworCWVycm9yID0gZ2V0X2RwcmNfYXR0cihtY19pbywgY29udGFpbmVyX2lkLCAmYXR0cik7CisJaWYgKGVycm9yID09IDApCisJCSppY2lkID0gYXR0ci5pY2lkOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGdldF9kcHJjX3ZlcnNpb24oc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQkgICAgaW50IGNvbnRhaW5lcl9pZCwgdTE2ICptYWpvciwgdTE2ICptaW5vcikKK3sKKwlzdHJ1Y3QgZHByY19hdHRyaWJ1dGVzIGF0dHI7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBnZXRfZHByY19hdHRyKG1jX2lvLCBjb250YWluZXJfaWQsICZhdHRyKTsKKwlpZiAoZXJyb3IgPT0gMCkgeworCQkqbWFqb3IgPSBhdHRyLnZlcnNpb24ubWFqb3I7CisJCSptaW5vciA9IGF0dHIudmVyc2lvbi5taW5vcjsKKwl9CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNsYXRlX21jX2FkZHIoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiwKKwkJCSAgICAgZW51bSBkcHJjX3JlZ2lvbl90eXBlIG1jX3JlZ2lvbl90eXBlLAorCQkJICAgICB1NjQgbWNfb2Zmc2V0LCBwaHlzX2FkZHJfdCAqcGh5c19hZGRyKQoreworCWludCBpOworCXN0cnVjdCBkZXZpY2UgKnJvb3RfZHByY19kZXY7CisJc3RydWN0IGZzbF9tYyAqbWM7CisKKwlmc2xfbWNfZ2V0X3Jvb3RfZHByYygmbWNfZGV2LT5kZXYsICZyb290X2RwcmNfZGV2KTsKKwlpZiAoV0FSTl9PTighcm9vdF9kcHJjX2RldikpCisJCXJldHVybiAtRUlOVkFMOworCW1jID0gZGV2X2dldF9kcnZkYXRhKHJvb3RfZHByY19kZXYtPnBhcmVudCk7CisKKwlpZiAobWMtPm51bV90cmFuc2xhdGlvbl9yYW5nZXMgPT0gMCkgeworCQkvKgorCQkgKiBEbyBpZGVudGl0eSBtYXBwaW5nOgorCQkgKi8KKwkJKnBoeXNfYWRkciA9IG1jX29mZnNldDsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1jLT5udW1fdHJhbnNsYXRpb25fcmFuZ2VzOyBpKyspIHsKKwkJc3RydWN0IGZzbF9tY19hZGRyX3RyYW5zbGF0aW9uX3JhbmdlICpyYW5nZSA9CisJCQkmbWMtPnRyYW5zbGF0aW9uX3Jhbmdlc1tpXTsKKworCQlpZiAobWNfcmVnaW9uX3R5cGUgPT0gcmFuZ2UtPm1jX3JlZ2lvbl90eXBlICYmCisJCSAgICBtY19vZmZzZXQgPj0gcmFuZ2UtPnN0YXJ0X21jX29mZnNldCAmJgorCQkgICAgbWNfb2Zmc2V0IDwgcmFuZ2UtPmVuZF9tY19vZmZzZXQpIHsKKwkJCSpwaHlzX2FkZHIgPSByYW5nZS0+c3RhcnRfcGh5c19hZGRyICsKKwkJCQkgICAgIChtY19vZmZzZXQgLSByYW5nZS0+c3RhcnRfbWNfb2Zmc2V0KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK3N0YXRpYyBpbnQgZnNsX21jX2RldmljZV9nZXRfbW1pb19yZWdpb25zKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYsCisJCQkJCSAgc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYpCit7CisJaW50IGk7CisJaW50IGVycm9yOworCXN0cnVjdCByZXNvdXJjZSAqcmVnaW9uczsKKwlzdHJ1Y3QgZHByY19vYmpfZGVzYyAqb2JqX2Rlc2MgPSAmbWNfZGV2LT5vYmpfZGVzYzsKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnRfZGV2ID0gbWNfZGV2LT5kZXYucGFyZW50OworCWVudW0gZHByY19yZWdpb25fdHlwZSBtY19yZWdpb25fdHlwZTsKKworCWlmIChzdHJjbXAob2JqX2Rlc2MtPnR5cGUsICJkcHJjIikgPT0gMCB8fAorCSAgICBzdHJjbXAob2JqX2Rlc2MtPnR5cGUsICJkcG1jcCIpID09IDApIHsKKwkJbWNfcmVnaW9uX3R5cGUgPSBEUFJDX1JFR0lPTl9UWVBFX01DX1BPUlRBTDsKKwl9IGVsc2UgaWYgKHN0cmNtcChvYmpfZGVzYy0+dHlwZSwgImRwaW8iKSA9PSAwKSB7CisJCW1jX3JlZ2lvbl90eXBlID0gRFBSQ19SRUdJT05fVFlQRV9RQk1BTl9QT1JUQUw7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGhhdmUgYmVlbiBjYWxsZWQgZm9yIHRoaXMgTUMgb2JqZWN0CisJCSAqIHR5cGUsIGFzIHRoaXMgb2JqZWN0IHR5cGUgaXMgbm90IHN1cHBvc2VkIHRvIGhhdmUgTU1JTworCQkgKiByZWdpb25zCisJCSAqLworCQlXQVJOX09OKHRydWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZWdpb25zID0ga21hbGxvY19hcnJheShvYmpfZGVzYy0+cmVnaW9uX2NvdW50LAorCQkJCXNpemVvZihyZWdpb25zWzBdKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZWdpb25zKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBvYmpfZGVzYy0+cmVnaW9uX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGRwcmNfcmVnaW9uX2Rlc2MgcmVnaW9uX2Rlc2M7CisKKwkJZXJyb3IgPSBkcHJjX2dldF9vYmpfcmVnaW9uKG1jX2J1c19kZXYtPm1jX2lvLAorCQkJCQkgICAgMCwKKwkJCQkJICAgIG1jX2J1c19kZXYtPm1jX2hhbmRsZSwKKwkJCQkJICAgIG9ial9kZXNjLT50eXBlLAorCQkJCQkgICAgb2JqX2Rlc2MtPmlkLCBpLCAmcmVnaW9uX2Rlc2MpOworCQlpZiAoZXJyb3IgPCAwKSB7CisJCQlkZXZfZXJyKHBhcmVudF9kZXYsCisJCQkJImRwcmNfZ2V0X29ial9yZWdpb24oKSBmYWlsZWQ6ICVkXG4iLCBlcnJvcik7CisJCQlnb3RvIGVycm9yX2NsZWFudXBfcmVnaW9uczsKKwkJfQorCisJCVdBUk5fT04ocmVnaW9uX2Rlc2Muc2l6ZSA9PSAwKTsKKwkJZXJyb3IgPSB0cmFuc2xhdGVfbWNfYWRkcihtY19kZXYsIG1jX3JlZ2lvbl90eXBlLAorCQkJCQkgIHJlZ2lvbl9kZXNjLmJhc2Vfb2Zmc2V0LAorCQkJCQkgICZyZWdpb25zW2ldLnN0YXJ0KTsKKwkJaWYgKGVycm9yIDwgMCkgeworCQkJZGV2X2VycihwYXJlbnRfZGV2LAorCQkJCSJJbnZhbGlkIE1DIG9mZnNldDogJSN4IChmb3IgJXMuJWRcJ3MgcmVnaW9uICVkKVxuIiwKKwkJCQlyZWdpb25fZGVzYy5iYXNlX29mZnNldCwKKwkJCQlvYmpfZGVzYy0+dHlwZSwgb2JqX2Rlc2MtPmlkLCBpKTsKKwkJCWdvdG8gZXJyb3JfY2xlYW51cF9yZWdpb25zOworCQl9CisKKwkJcmVnaW9uc1tpXS5lbmQgPSByZWdpb25zW2ldLnN0YXJ0ICsgcmVnaW9uX2Rlc2Muc2l6ZSAtIDE7CisJCXJlZ2lvbnNbaV0ubmFtZSA9ICJmc2wtbWMgb2JqZWN0IE1NSU8gcmVnaW9uIjsKKwkJcmVnaW9uc1tpXS5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisJCWlmIChyZWdpb25fZGVzYy5mbGFncyAmIERQUkNfUkVHSU9OX0NBQ0hFQUJMRSkKKwkJCXJlZ2lvbnNbaV0uZmxhZ3MgfD0gSU9SRVNPVVJDRV9DQUNIRUFCTEU7CisJfQorCisJbWNfZGV2LT5yZWdpb25zID0gcmVnaW9uczsKKwlyZXR1cm4gMDsKKworZXJyb3JfY2xlYW51cF9yZWdpb25zOgorCWtmcmVlKHJlZ2lvbnMpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBmc2xfbWNfaXNfcm9vdF9kcHJjIC0gZnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBnaXZlbiBkZXZpY2UgaXMgYSByb290IGRwcmMKKyAqLworYm9vbCBmc2xfbWNfaXNfcm9vdF9kcHJjKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpyb290X2RwcmNfZGV2OworCisJZnNsX21jX2dldF9yb290X2RwcmMoZGV2LCAmcm9vdF9kcHJjX2Rldik7CisJaWYgKCFyb290X2RwcmNfZGV2KQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIGRldiA9PSByb290X2RwcmNfZGV2OworfQorCisvKioKKyAqIEFkZCBhIG5ld2x5IGRpc2NvdmVyZWQgTUMgb2JqZWN0IGRldmljZSB0byBiZSB2aXNpYmxlIGluIExpbnV4CisgKi8KK2ludCBmc2xfbWNfZGV2aWNlX2FkZChzdHJ1Y3QgZHByY19vYmpfZGVzYyAqb2JqX2Rlc2MsCisJCSAgICAgIHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkgICAgICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnRfZGV2LAorCQkgICAgICBzdHJ1Y3QgZnNsX21jX2RldmljZSAqKm5ld19tY19kZXYpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYgPSBOVUxMOworCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXMgPSBOVUxMOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICpwYXJlbnRfbWNfZGV2OworCisJaWYgKGRldl9pc19mc2xfbWMocGFyZW50X2RldikpCisJCXBhcmVudF9tY19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKHBhcmVudF9kZXYpOworCWVsc2UKKwkJcGFyZW50X21jX2RldiA9IE5VTEw7CisKKwlpZiAoc3RyY21wKG9ial9kZXNjLT50eXBlLCAiZHByYyIpID09IDApIHsKKwkJLyoKKwkJICogQWxsb2NhdGUgYW4gTUMgYnVzIGRldmljZSBvYmplY3Q6CisJCSAqLworCQltY19idXMgPSBkZXZtX2t6YWxsb2MocGFyZW50X2Rldiwgc2l6ZW9mKCptY19idXMpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtY19idXMpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQltY19kZXYgPSAmbWNfYnVzLT5tY19kZXY7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQWxsb2NhdGUgYSByZWd1bGFyIGZzbF9tY19kZXZpY2Ugb2JqZWN0OgorCQkgKi8KKwkJbWNfZGV2ID0ga21lbV9jYWNoZV96YWxsb2MobWNfZGV2X2NhY2hlLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtY19kZXYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltY19kZXYtPm9ial9kZXNjID0gKm9ial9kZXNjOworCW1jX2Rldi0+bWNfaW8gPSBtY19pbzsKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmbWNfZGV2LT5kZXYpOworCW1jX2Rldi0+ZGV2LnBhcmVudCA9IHBhcmVudF9kZXY7CisJbWNfZGV2LT5kZXYuYnVzID0gJmZzbF9tY19idXNfdHlwZTsKKwlkZXZfc2V0X25hbWUoJm1jX2Rldi0+ZGV2LCAiJXMuJWQiLCBvYmpfZGVzYy0+dHlwZSwgb2JqX2Rlc2MtPmlkKTsKKworCWlmIChzdHJjbXAob2JqX2Rlc2MtPnR5cGUsICJkcHJjIikgPT0gMCkgeworCQlzdHJ1Y3QgZnNsX21jX2lvICptY19pbzI7CisKKwkJbWNfZGV2LT5mbGFncyB8PSBGU0xfTUNfSVNfRFBSQzsKKworCQkvKgorCQkgKiBUbyBnZXQgdGhlIERQUkMncyBJQ0lELCB3ZSBuZWVkIHRvIG9wZW4gdGhlIERQUkMKKwkJICogaW4gZ2V0X2RwcmNfaWNpZCgpLiBGb3IgY2hpbGQgRFBSQ3MsIHdlIGRvIHNvIHVzaW5nIHRoZQorCQkgKiBwYXJlbnQgRFBSQydzIE1DIHBvcnRhbCBpbnN0ZWFkIG9mIHRoZSBjaGlsZCBEUFJDJ3MgTUMKKwkJICogcG9ydGFsLCBpbiBjYXNlIHRoZSBjaGlsZCBEUFJDIGlzIGFscmVhZHkgb3BlbmVkIHdpdGgKKwkJICogaXRzIG93biBwb3J0YWwgKGUuZy4sIHRoZSBEUFJDIHVzZWQgYnkgQUlPUCkuCisJCSAqCisJCSAqIE5PVEU6IFRoZXJlIGNhbm5vdCBiZSBtb3JlIHRoYW4gb25lIGFjdGl2ZSBvcGVuIGZvciBhCisJCSAqIGdpdmVuIE1DIG9iamVjdCwgdXNpbmcgdGhlIHNhbWUgTUMgcG9ydGFsLgorCQkgKi8KKwkJaWYgKHBhcmVudF9tY19kZXYpIHsKKwkJCS8qCisJCQkgKiBkZXZpY2UgYmVpbmcgYWRkZWQgaXMgYSBjaGlsZCBEUFJDIGRldmljZQorCQkJICovCisJCQltY19pbzIgPSBwYXJlbnRfbWNfZGV2LT5tY19pbzsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBkZXZpY2UgYmVpbmcgYWRkZWQgaXMgdGhlIHJvb3QgRFBSQyBkZXZpY2UKKwkJCSAqLworCQkJaWYgKFdBUk5fT04oIW1jX2lvKSkgeworCQkJCWVycm9yID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycm9yX2NsZWFudXBfZGV2OworCQkJfQorCisJCQltY19pbzIgPSBtY19pbzsKKworCQkJYXRvbWljX2luYygmcm9vdF9kcHJjX2NvdW50KTsKKwkJfQorCisJCWVycm9yID0gZ2V0X2RwcmNfaWNpZChtY19pbzIsIG9ial9kZXNjLT5pZCwgJm1jX2Rldi0+aWNpZCk7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIGVycm9yX2NsZWFudXBfZGV2OworCX0gZWxzZSB7CisJCS8qCisJCSAqIEEgbm9uLURQUkMgTUMgb2JqZWN0IGRldmljZSBoYXMgdG8gYmUgYSBjaGlsZCBvZiBhbm90aGVyCisJCSAqIE1DIG9iamVjdCAoc3BlY2lmaWNhbGx5IGEgRFBSQyBvYmplY3QpCisJCSAqLworCQltY19kZXYtPmljaWQgPSBwYXJlbnRfbWNfZGV2LT5pY2lkOworCQltY19kZXYtPmRtYV9tYXNrID0gRlNMX01DX0RFRkFVTFRfRE1BX01BU0s7CisJCW1jX2Rldi0+ZGV2LmRtYV9tYXNrID0gJm1jX2Rldi0+ZG1hX21hc2s7CisJCWRldl9zZXRfbXNpX2RvbWFpbigmbWNfZGV2LT5kZXYsCisJCQkJICAgZGV2X2dldF9tc2lfZG9tYWluKCZwYXJlbnRfbWNfZGV2LT5kZXYpKTsKKwl9CisKKwkvKgorCSAqIEdldCBNTUlPIHJlZ2lvbnMgZm9yIHRoZSBkZXZpY2UgZnJvbSB0aGUgTUM6CisJICoKKwkgKiBOT1RFOiB0aGUgcm9vdCBEUFJDIGlzIGEgc3BlY2lhbCBjYXNlIGFzIGl0cyBNTUlPIHJlZ2lvbiBpcworCSAqIG9idGFpbmVkIGZyb20gdGhlIGRldmljZSB0cmVlCisJICovCisJaWYgKHBhcmVudF9tY19kZXYgJiYgb2JqX2Rlc2MtPnJlZ2lvbl9jb3VudCAhPSAwKSB7CisJCWVycm9yID0gZnNsX21jX2RldmljZV9nZXRfbW1pb19yZWdpb25zKG1jX2RldiwKKwkJCQkJCSAgICAgICBwYXJlbnRfbWNfZGV2KTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gZXJyb3JfY2xlYW51cF9kZXY7CisJfQorCisJLyogT2JqZWN0cyBhcmUgY29oZXJlbnQsIHVubGVzcyAnbm8gc2hhcmVhYmlsaXR5JyBmbGFnIHNldC4gKi8KKwlpZiAoIShvYmpfZGVzYy0+ZmxhZ3MgJiBEUFJDX09CSl9GTEFHX05PX01FTV9TSEFSRUFCSUxJVFkpKQorCQlhcmNoX3NldHVwX2RtYV9vcHMoJm1jX2Rldi0+ZGV2LCAwLCAwLCBOVUxMLCB0cnVlKTsKKworCS8qCisJICogVGhlIGRldmljZS1zcGVjaWZpYyBwcm9iZSBjYWxsYmFjayB3aWxsIGdldCBpbnZva2VkIGJ5IGRldmljZV9hZGQoKQorCSAqLworCWVycm9yID0gZGV2aWNlX2FkZCgmbWNfZGV2LT5kZXYpOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycihwYXJlbnRfZGV2LAorCQkJImRldmljZV9hZGQoKSBmYWlsZWQgZm9yIGRldmljZSAlczogJWRcbiIsCisJCQlkZXZfbmFtZSgmbWNfZGV2LT5kZXYpLCBlcnJvcik7CisJCWdvdG8gZXJyb3JfY2xlYW51cF9kZXY7CisJfQorCisJKHZvaWQpZ2V0X2RldmljZSgmbWNfZGV2LT5kZXYpOworCWRldl9kYmcocGFyZW50X2RldiwgIkFkZGVkIE1DIG9iamVjdCBkZXZpY2UgJXNcbiIsCisJCWRldl9uYW1lKCZtY19kZXYtPmRldikpOworCisJKm5ld19tY19kZXYgPSBtY19kZXY7CisJcmV0dXJuIDA7CisKK2Vycm9yX2NsZWFudXBfZGV2OgorCWtmcmVlKG1jX2Rldi0+cmVnaW9ucyk7CisJaWYgKG1jX2J1cykKKwkJZGV2bV9rZnJlZShwYXJlbnRfZGV2LCBtY19idXMpOworCWVsc2UKKwkJa21lbV9jYWNoZV9mcmVlKG1jX2Rldl9jYWNoZSwgbWNfZGV2KTsKKworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19kZXZpY2VfYWRkKTsKKworLyoqCisgKiBmc2xfbWNfZGV2aWNlX3JlbW92ZSAtIFJlbW92ZSBhIE1DIG9iamVjdCBkZXZpY2UgZnJvbSBiZWluZyB2aXNpYmxlIHRvCisgKiBMaW51eAorICoKKyAqIEBtY19kZXY6IFBvaW50ZXIgdG8gYSBNQyBvYmplY3QgZGV2aWNlIG9iamVjdAorICovCit2b2lkIGZzbF9tY19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYpCit7CisJc3RydWN0IGZzbF9tY19idXMgKm1jX2J1cyA9IE5VTEw7CisKKwlrZnJlZShtY19kZXYtPnJlZ2lvbnMpOworCisJLyoKKwkgKiBUaGUgZGV2aWNlLXNwZWNpZmljIHJlbW92ZSBjYWxsYmFjayB3aWxsIGdldCBpbnZva2VkIGJ5IGRldmljZV9kZWwoKQorCSAqLworCWRldmljZV9kZWwoJm1jX2Rldi0+ZGV2KTsKKwlwdXRfZGV2aWNlKCZtY19kZXYtPmRldik7CisKKwlpZiAoc3RyY21wKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSwgImRwcmMiKSA9PSAwKSB7CisJCW1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfZGV2KTsKKworCQlpZiAoZnNsX21jX2lzX3Jvb3RfZHByYygmbWNfZGV2LT5kZXYpKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJnJvb3RfZHByY19jb3VudCkgPiAwKQorCQkJCWF0b21pY19kZWMoJnJvb3RfZHByY19jb3VudCk7CisJCQllbHNlCisJCQkJV0FSTl9PTigxKTsKKwkJfQorCX0KKworCWlmIChtY19idXMpCisJCWRldm1fa2ZyZWUobWNfZGV2LT5kZXYucGFyZW50LCBtY19idXMpOworCWVsc2UKKwkJa21lbV9jYWNoZV9mcmVlKG1jX2Rldl9jYWNoZSwgbWNfZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19kZXZpY2VfcmVtb3ZlKTsKKworc3RhdGljIGludCBwYXJzZV9tY19yYW5nZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgaW50ICpwYWRkcl9jZWxscywKKwkJCSAgIGludCAqbWNfYWRkcl9jZWxscywKKwkJCSAgIGludCAqbWNfc2l6ZV9jZWxscywKKwkJCSAgIGNvbnN0IF9fYmUzMiAqKnJhbmdlc19zdGFydCwKKwkJCSAgIHU4ICpudW1fcmFuZ2VzKQoreworCWNvbnN0IF9fYmUzMiAqcHJvcDsKKwlpbnQgcmFuZ2VfdHVwbGVfY2VsbF9jb3VudDsKKwlpbnQgcmFuZ2VzX2xlbjsKKwlpbnQgdHVwbGVfbGVuOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbWNfbm9kZSA9IGRldi0+b2Zfbm9kZTsKKworCSpyYW5nZXNfc3RhcnQgPSBvZl9nZXRfcHJvcGVydHkobWNfbm9kZSwgInJhbmdlcyIsICZyYW5nZXNfbGVuKTsKKwlpZiAoISgqcmFuZ2VzX3N0YXJ0KSB8fCAhcmFuZ2VzX2xlbikgeworCQlkZXZfd2FybihkZXYsCisJCQkgIm1pc3Npbmcgb3IgZW1wdHkgcmFuZ2VzIHByb3BlcnR5IGZvciBkZXZpY2UgdHJlZSBub2RlICclcydcbiIsCisJCQkgbWNfbm9kZS0+bmFtZSk7CisKKwkJKm51bV9yYW5nZXMgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwkqcGFkZHJfY2VsbHMgPSBvZl9uX2FkZHJfY2VsbHMobWNfbm9kZSk7CisKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG1jX25vZGUsICIjYWRkcmVzcy1jZWxscyIsIE5VTEwpOworCWlmIChwcm9wKQorCQkqbWNfYWRkcl9jZWxscyA9IGJlMzJfdG9fY3B1cChwcm9wKTsKKwllbHNlCisJCSptY19hZGRyX2NlbGxzID0gKnBhZGRyX2NlbGxzOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShtY19ub2RlLCAiI3NpemUtY2VsbHMiLCBOVUxMKTsKKwlpZiAocHJvcCkKKwkJKm1jX3NpemVfY2VsbHMgPSBiZTMyX3RvX2NwdXAocHJvcCk7CisJZWxzZQorCQkqbWNfc2l6ZV9jZWxscyA9IG9mX25fc2l6ZV9jZWxscyhtY19ub2RlKTsKKworCXJhbmdlX3R1cGxlX2NlbGxfY291bnQgPSAqcGFkZHJfY2VsbHMgKyAqbWNfYWRkcl9jZWxscyArCisJCQkJICptY19zaXplX2NlbGxzOworCisJdHVwbGVfbGVuID0gcmFuZ2VfdHVwbGVfY2VsbF9jb3VudCAqIHNpemVvZihfX2JlMzIpOworCWlmIChyYW5nZXNfbGVuICUgdHVwbGVfbGVuICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJtYWxmb3JtZWQgcmFuZ2VzIHByb3BlcnR5ICclcydcbiIsIG1jX25vZGUtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqbnVtX3JhbmdlcyA9IHJhbmdlc19sZW4gLyB0dXBsZV9sZW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2VzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3QgZnNsX21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2UKKwkJCQkJCSoqcmFuZ2VzLAorCQkJCQkgIHU4ICpudW1fcmFuZ2VzKQoreworCWludCBlcnJvcjsKKwlpbnQgcGFkZHJfY2VsbHM7CisJaW50IG1jX2FkZHJfY2VsbHM7CisJaW50IG1jX3NpemVfY2VsbHM7CisJaW50IGk7CisJY29uc3QgX19iZTMyICpyYW5nZXNfc3RhcnQ7CisJY29uc3QgX19iZTMyICpjZWxsOworCisJZXJyb3IgPSBwYXJzZV9tY19yYW5nZXMoZGV2LAorCQkJCSZwYWRkcl9jZWxscywKKwkJCQkmbWNfYWRkcl9jZWxscywKKwkJCQkmbWNfc2l6ZV9jZWxscywKKwkJCQkmcmFuZ2VzX3N0YXJ0LAorCQkJCW51bV9yYW5nZXMpOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKKworCWlmICghKCpudW1fcmFuZ2VzKSkgeworCQkvKgorCQkgKiBNaXNzaW5nIG9yIGVtcHR5IHJhbmdlcyBwcm9wZXJ0eSAoInJhbmdlczsiKSBmb3IgdGhlCisJCSAqICdmc2wscW9yaXEtbWMnIG5vZGUuIEluIHRoaXMgY2FzZSwgaWRlbnRpdHkgbWFwcGluZworCQkgKiB3aWxsIGJlIHVzZWQuCisJCSAqLworCQkqcmFuZ2VzID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJKnJhbmdlcyA9IGRldm1fa2NhbGxvYyhkZXYsICpudW1fcmFuZ2VzLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZnNsX21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2UpLAorCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghKCpyYW5nZXMpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNlbGwgPSByYW5nZXNfc3RhcnQ7CisJZm9yIChpID0gMDsgaSA8ICpudW1fcmFuZ2VzOyArK2kpIHsKKwkJc3RydWN0IGZzbF9tY19hZGRyX3RyYW5zbGF0aW9uX3JhbmdlICpyYW5nZSA9ICYoKnJhbmdlcylbaV07CisKKwkJcmFuZ2UtPm1jX3JlZ2lvbl90eXBlID0gb2ZfcmVhZF9udW1iZXIoY2VsbCwgMSk7CisJCXJhbmdlLT5zdGFydF9tY19vZmZzZXQgPSBvZl9yZWFkX251bWJlcihjZWxsICsgMSwKKwkJCQkJCQltY19hZGRyX2NlbGxzIC0gMSk7CisJCWNlbGwgKz0gbWNfYWRkcl9jZWxsczsKKwkJcmFuZ2UtPnN0YXJ0X3BoeXNfYWRkciA9IG9mX3JlYWRfbnVtYmVyKGNlbGwsIHBhZGRyX2NlbGxzKTsKKwkJY2VsbCArPSBwYWRkcl9jZWxsczsKKwkJcmFuZ2UtPmVuZF9tY19vZmZzZXQgPSByYW5nZS0+c3RhcnRfbWNfb2Zmc2V0ICsKKwkJCQkgICAgIG9mX3JlYWRfbnVtYmVyKGNlbGwsIG1jX3NpemVfY2VsbHMpOworCisJCWNlbGwgKz0gbWNfc2l6ZV9jZWxsczsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmc2xfbWNfYnVzX3Byb2JlIC0gY2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSByb290IE1DIGJ1cyBpcyBiZWluZworICogYWRkZWQKKyAqLworc3RhdGljIGludCBmc2xfbWNfYnVzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRwcmNfb2JqX2Rlc2Mgb2JqX2Rlc2M7CisJaW50IGVycm9yOworCXN0cnVjdCBmc2xfbWMgKm1jOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZnNsX21jX2lvICptY19pbyA9IE5VTEw7CisJaW50IGNvbnRhaW5lcl9pZDsKKwlwaHlzX2FkZHJfdCBtY19wb3J0YWxfcGh5c19hZGRyOworCXUzMiBtY19wb3J0YWxfc2l6ZTsKKwlzdHJ1Y3QgbWNfdmVyc2lvbiBtY192ZXJzaW9uOworCXN0cnVjdCByZXNvdXJjZSByZXM7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiUm9vdCBNQyBidXMgZGV2aWNlIHByb2JlZCIpOworCisJbWMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCptYyksIEdGUF9LRVJORUwpOworCWlmICghbWMpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWMpOworCisJLyoKKwkgKiBHZXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBNQyBwb3J0YWwgZm9yIHRoZSByb290IERQUkM6CisJICovCisJZXJyb3IgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHBkZXYtPmRldi5vZl9ub2RlLCAwLCAmcmVzKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJvZl9hZGRyZXNzX3RvX3Jlc291cmNlKCkgZmFpbGVkIGZvciAlc1xuIiwKKwkJCXBkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJbWNfcG9ydGFsX3BoeXNfYWRkciA9IHJlcy5zdGFydDsKKwltY19wb3J0YWxfc2l6ZSA9IHJlc291cmNlX3NpemUoJnJlcyk7CisJZXJyb3IgPSBmc2xfY3JlYXRlX21jX2lvKCZwZGV2LT5kZXYsIG1jX3BvcnRhbF9waHlzX2FkZHIsCisJCQkJIG1jX3BvcnRhbF9zaXplLCBOVUxMLAorCQkJCSBGU0xfTUNfSU9fQVRPTUlDX0NPTlRFWFRfUE9SVEFMLCAmbWNfaW8pOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0gbWNfZ2V0X3ZlcnNpb24obWNfaW8sIDAsICZtY192ZXJzaW9uKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkibWNfZ2V0X3ZlcnNpb24oKSBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgZXJyb3IpOworCQlnb3RvIGVycm9yX2NsZWFudXBfbWNfaW87CisJfQorCisJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJICJGcmVlc2NhbGUgTWFuYWdlbWVudCBDb21wbGV4IEZpcm13YXJlIHZlcnNpb246ICV1LiV1LiV1XG4iLAorCQkgbWNfdmVyc2lvbi5tYWpvciwgbWNfdmVyc2lvbi5taW5vciwgbWNfdmVyc2lvbi5yZXZpc2lvbik7CisKKwllcnJvciA9IGdldF9tY19hZGRyX3RyYW5zbGF0aW9uX3JhbmdlcygmcGRldi0+ZGV2LAorCQkJCQkgICAgICAgJm1jLT50cmFuc2xhdGlvbl9yYW5nZXMsCisJCQkJCSAgICAgICAmbWMtPm51bV90cmFuc2xhdGlvbl9yYW5nZXMpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gZXJyb3JfY2xlYW51cF9tY19pbzsKKworCWVycm9yID0gZHBtbmdfZ2V0X2NvbnRhaW5lcl9pZChtY19pbywgMCwgJmNvbnRhaW5lcl9pZCk7CisJaWYgKGVycm9yIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiZHBtbmdfZ2V0X2NvbnRhaW5lcl9pZCgpIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKKwkJZ290byBlcnJvcl9jbGVhbnVwX21jX2lvOworCX0KKworCW1lbXNldCgmb2JqX2Rlc2MsIDAsIHNpemVvZihzdHJ1Y3QgZHByY19vYmpfZGVzYykpOworCWVycm9yID0gZ2V0X2RwcmNfdmVyc2lvbihtY19pbywgY29udGFpbmVyX2lkLAorCQkJCSAmb2JqX2Rlc2MudmVyX21ham9yLCAmb2JqX2Rlc2MudmVyX21pbm9yKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycm9yX2NsZWFudXBfbWNfaW87CisKKwlvYmpfZGVzYy52ZW5kb3IgPSBGU0xfTUNfVkVORE9SX0ZSRUVTQ0FMRTsKKwlzdHJjcHkob2JqX2Rlc2MudHlwZSwgImRwcmMiKTsKKwlvYmpfZGVzYy5pZCA9IGNvbnRhaW5lcl9pZDsKKwlvYmpfZGVzYy5pcnFfY291bnQgPSAxOworCW9ial9kZXNjLnJlZ2lvbl9jb3VudCA9IDA7CisKKwllcnJvciA9IGZzbF9tY19kZXZpY2VfYWRkKCZvYmpfZGVzYywgbWNfaW8sICZwZGV2LT5kZXYsICZtY19idXNfZGV2KTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycm9yX2NsZWFudXBfbWNfaW87CisKKwltYy0+cm9vdF9tY19idXNfZGV2ID0gbWNfYnVzX2RldjsKKwlyZXR1cm4gMDsKKworZXJyb3JfY2xlYW51cF9tY19pbzoKKwlmc2xfZGVzdHJveV9tY19pbyhtY19pbyk7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGZzbF9tY19idXNfcmVtb3ZlIC0gY2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSByb290IE1DIGJ1cyBpcyBiZWluZworICogcmVtb3ZlZAorICovCitzdGF0aWMgaW50IGZzbF9tY19idXNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGZzbF9tYyAqbWMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChXQVJOX09OKCFmc2xfbWNfaXNfcm9vdF9kcHJjKCZtYy0+cm9vdF9tY19idXNfZGV2LT5kZXYpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmc2xfbWNfZGV2aWNlX3JlbW92ZShtYy0+cm9vdF9tY19idXNfZGV2KTsKKworCWZzbF9kZXN0cm95X21jX2lvKG1jLT5yb290X21jX2J1c19kZXYtPm1jX2lvKTsKKwltYy0+cm9vdF9tY19idXNfZGV2LT5tY19pbyA9IE5VTEw7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiUm9vdCBNQyBidXMgZGV2aWNlIHJlbW92ZWQiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZnNsX21jX2J1c19tYXRjaF90YWJsZVtdID0geworCXsuY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWMiLH0sCisJe30sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBmc2xfbWNfYnVzX21hdGNoX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZnNsX21jX2J1c19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAiZnNsX21jX2J1cyIsCisJCSAgIC5wbSA9IE5VTEwsCisJCSAgIC5vZl9tYXRjaF90YWJsZSA9IGZzbF9tY19idXNfbWF0Y2hfdGFibGUsCisJCSAgIH0sCisJLnByb2JlID0gZnNsX21jX2J1c19wcm9iZSwKKwkucmVtb3ZlID0gZnNsX21jX2J1c19yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBmc2xfbWNfYnVzX2RyaXZlcl9pbml0KHZvaWQpCit7CisJaW50IGVycm9yOworCisJbWNfZGV2X2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImZzbF9tY19kZXZpY2UiLAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBmc2xfbWNfZGV2aWNlKSwgMCwgMCwKKwkJCQkJIE5VTEwpOworCWlmICghbWNfZGV2X2NhY2hlKSB7CisJCXByX2VycigiQ291bGQgbm90IGNyZWF0ZSBmc2xfbWNfZGV2aWNlIGNhY2hlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZXJyb3IgPSBidXNfcmVnaXN0ZXIoJmZzbF9tY19idXNfdHlwZSk7CisJaWYgKGVycm9yIDwgMCkgeworCQlwcl9lcnIoImZzbC1tYyBidXMgdHlwZSByZWdpc3RyYXRpb24gZmFpbGVkOiAlZFxuIiwgZXJyb3IpOworCQlnb3RvIGVycm9yX2NsZWFudXBfY2FjaGU7CisJfQorCisJcHJfaW5mbygiZnNsLW1jIGJ1cyB0eXBlIHJlZ2lzdGVyZWRcbiIpOworCisJZXJyb3IgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmZzbF9tY19idXNfZHJpdmVyKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCXByX2VycigicGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCkgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOworCQlnb3RvIGVycm9yX2NsZWFudXBfYnVzOworCX0KKworCWVycm9yID0gZHByY19kcml2ZXJfaW5pdCgpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gZXJyb3JfY2xlYW51cF9kcml2ZXI7CisKKwllcnJvciA9IGZzbF9tY19hbGxvY2F0b3JfZHJpdmVyX2luaXQoKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycm9yX2NsZWFudXBfZHByY19kcml2ZXI7CisKKwllcnJvciA9IGl0c19mc2xfbWNfbXNpX2luaXQoKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycm9yX2NsZWFudXBfbWNfYWxsb2NhdG9yOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2NsZWFudXBfbWNfYWxsb2NhdG9yOgorCWZzbF9tY19hbGxvY2F0b3JfZHJpdmVyX2V4aXQoKTsKKworZXJyb3JfY2xlYW51cF9kcHJjX2RyaXZlcjoKKwlkcHJjX2RyaXZlcl9leGl0KCk7CisKK2Vycm9yX2NsZWFudXBfZHJpdmVyOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmc2xfbWNfYnVzX2RyaXZlcik7CisKK2Vycm9yX2NsZWFudXBfYnVzOgorCWJ1c191bnJlZ2lzdGVyKCZmc2xfbWNfYnVzX3R5cGUpOworCitlcnJvcl9jbGVhbnVwX2NhY2hlOgorCWttZW1fY2FjaGVfZGVzdHJveShtY19kZXZfY2FjaGUpOworCXJldHVybiBlcnJvcjsKK30KK3Bvc3Rjb3JlX2luaXRjYWxsKGZzbF9tY19idXNfZHJpdmVyX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZnNsLW1jLW1zaS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZnNsLW1jLW1zaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNDZiMWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9mc2wtbWMtbXNpLmMKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiBGcmVlc2NhbGUgTWFuYWdlbWVudCBDb21wbGV4IChNQykgYnVzIGRyaXZlciBNU0kgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQXV0aG9yOiBHZXJtYW4gUml2ZXJhIDxHZXJtYW4uUml2ZXJhQGZyZWVzY2FsZS5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvYXJtLWdpYy12My5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L21zaS5oPgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtYnVzLmgiCisKKy8qCisgKiBHZW5lcmF0ZSBhIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgaW50ZXJydXB0IChvbmx5IHVzZWQgd2l0aGluIHRoZSBNU0kKKyAqIGlycWRvbWFpbi4gIENvbWJpbmUgdGhlIGljaWQgd2l0aCB0aGUgaW50ZXJydXB0IGluZGV4LgorICovCitzdGF0aWMgaXJxX2h3X251bWJlcl90IGZzbF9tY19kb21haW5fY2FsY19od2lycShzdHJ1Y3QgZnNsX21jX2RldmljZSAqZGV2LAorCQkJCQkJc3RydWN0IG1zaV9kZXNjICpkZXNjKQoreworCS8qCisJICogTWFrZSB0aGUgYmFzZSBod2lycSB2YWx1ZSBmb3IgSUNJRCoxMDAwMCBzbyBpdCBpcyByZWFkYWJsZQorCSAqIGFzIGEgZGVjaW1hbCB2YWx1ZSBpbiAvcHJvYy9pbnRlcnJ1cHRzLgorCSAqLworCXJldHVybiAoaXJxX2h3X251bWJlcl90KShkZXNjLT5mc2xfbWMubXNpX2luZGV4ICsgKGRldi0+aWNpZCAqIDEwMDAwKSk7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9tY19tc2lfc2V0X2Rlc2MobXNpX2FsbG9jX2luZm9fdCAqYXJnLAorCQkJCXN0cnVjdCBtc2lfZGVzYyAqZGVzYykKK3sKKwlhcmctPmRlc2MgPSBkZXNjOworCWFyZy0+aHdpcnEgPSBmc2xfbWNfZG9tYWluX2NhbGNfaHdpcnEodG9fZnNsX21jX2RldmljZShkZXNjLT5kZXYpLAorCQkJCQkgICAgICBkZXNjKTsKK30KKworc3RhdGljIHZvaWQgZnNsX21jX21zaV91cGRhdGVfZG9tX29wcyhzdHJ1Y3QgbXNpX2RvbWFpbl9pbmZvICppbmZvKQoreworCXN0cnVjdCBtc2lfZG9tYWluX29wcyAqb3BzID0gaW5mby0+b3BzOworCisJaWYgKFdBUk5fT04oIW9wcykpCisJCXJldHVybjsKKworCS8qCisJICogc2V0X2Rlc2Mgc2hvdWxkIG5vdCBiZSBzZXQgYnkgdGhlIGNhbGxlcgorCSAqLworCWlmICghb3BzLT5zZXRfZGVzYykKKwkJb3BzLT5zZXRfZGVzYyA9IGZzbF9tY19tc2lfc2V0X2Rlc2M7Cit9CisKK3N0YXRpYyB2b2lkIF9fZnNsX21jX21zaV93cml0ZV9tc2coc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYsCisJCQkJICAgc3RydWN0IGZzbF9tY19kZXZpY2VfaXJxICptY19kZXZfaXJxKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqb3duZXJfbWNfZGV2ID0gbWNfZGV2X2lycS0+bWNfZGV2OworCXN0cnVjdCBtc2lfZGVzYyAqbXNpX2Rlc2MgPSBtY19kZXZfaXJxLT5tc2lfZGVzYzsKKwlzdHJ1Y3QgZHByY19pcnFfY2ZnIGlycV9jZmc7CisKKwkvKgorCSAqIG1zaV9kZXNjLT5tc2cuYWRkcmVzcyBpcyAweDAgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgaW4KKwkgKiB0aGUgZnJlZV9pcnEoKSBjb2RlIHBhdGguIEluIHRoaXMgY2FzZSwgZm9yIHRoZSBNQywgd2UgZG9uJ3QKKwkgKiByZWFsbHkgbmVlZCB0byAidW5wcm9ncmFtIiB0aGUgTVNJLCBzbyB3ZSBqdXN0IHJldHVybi4KKwkgKi8KKwlpZiAobXNpX2Rlc2MtPm1zZy5hZGRyZXNzX2xvID09IDB4MCAmJiBtc2lfZGVzYy0+bXNnLmFkZHJlc3NfaGkgPT0gMHgwKQorCQlyZXR1cm47CisKKwlpZiAoV0FSTl9PTighb3duZXJfbWNfZGV2KSkKKwkJcmV0dXJuOworCisJaXJxX2NmZy5wYWRkciA9ICgodTY0KW1zaV9kZXNjLT5tc2cuYWRkcmVzc19oaSA8PCAzMikgfAorCQkJbXNpX2Rlc2MtPm1zZy5hZGRyZXNzX2xvOworCWlycV9jZmcudmFsID0gbXNpX2Rlc2MtPm1zZy5kYXRhOworCWlycV9jZmcuaXJxX251bSA9IG1zaV9kZXNjLT5pcnE7CisKKwlpZiAob3duZXJfbWNfZGV2ID09IG1jX2J1c19kZXYpIHsKKwkJLyoKKwkJICogSVJRIGlzIGZvciB0aGUgbWNfYnVzX2RldidzIERQUkMgaXRzZWxmCisJCSAqLworCQllcnJvciA9IGRwcmNfc2V0X2lycShtY19idXNfZGV2LT5tY19pbywKKwkJCQkgICAgIE1DX0NNRF9GTEFHX0lOVFJfRElTIHwgTUNfQ01EX0ZMQUdfUFJJLAorCQkJCSAgICAgbWNfYnVzX2Rldi0+bWNfaGFuZGxlLAorCQkJCSAgICAgbWNfZGV2X2lycS0+ZGV2X2lycV9pbmRleCwKKwkJCQkgICAgICZpcnFfY2ZnKTsKKwkJaWYgKGVycm9yIDwgMCkgeworCQkJZGV2X2Vycigmb3duZXJfbWNfZGV2LT5kZXYsCisJCQkJImRwcmNfc2V0X2lycSgpIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIElSUSBpcyBmb3IgZm9yIGEgY2hpbGQgZGV2aWNlIG9mIG1jX2J1c19kZXYKKwkJICovCisJCWVycm9yID0gZHByY19zZXRfb2JqX2lycShtY19idXNfZGV2LT5tY19pbywKKwkJCQkJIE1DX0NNRF9GTEFHX0lOVFJfRElTIHwgTUNfQ01EX0ZMQUdfUFJJLAorCQkJCQkgbWNfYnVzX2Rldi0+bWNfaGFuZGxlLAorCQkJCQkgb3duZXJfbWNfZGV2LT5vYmpfZGVzYy50eXBlLAorCQkJCQkgb3duZXJfbWNfZGV2LT5vYmpfZGVzYy5pZCwKKwkJCQkJIG1jX2Rldl9pcnEtPmRldl9pcnFfaW5kZXgsCisJCQkJCSAmaXJxX2NmZyk7CisJCWlmIChlcnJvciA8IDApIHsKKwkJCWRldl9lcnIoJm93bmVyX21jX2Rldi0+ZGV2LAorCQkJCSJkcHJjX29ial9zZXRfaXJxKCkgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOworCQl9CisJfQorfQorCisvKgorICogTk9URTogVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAorICovCitzdGF0aWMgdm9pZCBmc2xfbWNfbXNpX3dyaXRlX21zZyhzdHJ1Y3QgaXJxX2RhdGEgKmlycV9kYXRhLAorCQkJCSBzdHJ1Y3QgbXNpX21zZyAqbXNnKQoreworCXN0cnVjdCBtc2lfZGVzYyAqbXNpX2Rlc2MgPSBpcnFfZGF0YV9nZXRfbXNpX2Rlc2MoaXJxX2RhdGEpOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2ID0gdG9fZnNsX21jX2RldmljZShtc2lfZGVzYy0+ZGV2KTsKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19idXNfZGV2KTsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZV9pcnEgKm1jX2Rldl9pcnEgPQorCQkmbWNfYnVzLT5pcnFfcmVzb3VyY2VzW21zaV9kZXNjLT5mc2xfbWMubXNpX2luZGV4XTsKKworCVdBUk5fT04obWNfZGV2X2lycS0+bXNpX2Rlc2MgIT0gbXNpX2Rlc2MpOworCW1zaV9kZXNjLT5tc2cgPSAqbXNnOworCisJLyoKKwkgKiBQcm9ncmFtIHRoZSBNU0kgKHBhZGRyLCB2YWx1ZSkgcGFpciBpbiB0aGUgZGV2aWNlOgorCSAqLworCV9fZnNsX21jX21zaV93cml0ZV9tc2cobWNfYnVzX2RldiwgbWNfZGV2X2lycSk7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9tY19tc2lfdXBkYXRlX2NoaXBfb3BzKHN0cnVjdCBtc2lfZG9tYWluX2luZm8gKmluZm8pCit7CisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaW5mby0+Y2hpcDsKKworCWlmIChXQVJOX09OKCghY2hpcCkpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIGlycV93cml0ZV9tc2lfbXNnIHNob3VsZCBub3QgYmUgc2V0IGJ5IHRoZSBjYWxsZXIKKwkgKi8KKwlpZiAoIWNoaXAtPmlycV93cml0ZV9tc2lfbXNnKQorCQljaGlwLT5pcnFfd3JpdGVfbXNpX21zZyA9IGZzbF9tY19tc2lfd3JpdGVfbXNnOworfQorCisvKioKKyAqIGZzbF9tY19tc2lfY3JlYXRlX2lycV9kb21haW4gLSBDcmVhdGUgYSBmc2wtbWMgTVNJIGludGVycnVwdCBkb21haW4KKyAqIEBucDoJCU9wdGlvbmFsIGRldmljZS10cmVlIG5vZGUgb2YgdGhlIGludGVycnVwdCBjb250cm9sbGVyCisgKiBAaW5mbzoJTVNJIGRvbWFpbiBpbmZvCisgKiBAcGFyZW50OglQYXJlbnQgaXJxIGRvbWFpbgorICoKKyAqIFVwZGF0ZXMgdGhlIGRvbWFpbiBhbmQgY2hpcCBvcHMgYW5kIGNyZWF0ZXMgYSBmc2wtbWMgTVNJCisgKiBpbnRlcnJ1cHQgZG9tYWluLgorICoKKyAqIFJldHVybnM6CisgKiBBIGRvbWFpbiBwb2ludGVyIG9yIE5VTEwgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitzdHJ1Y3QgaXJxX2RvbWFpbiAqZnNsX21jX21zaV9jcmVhdGVfaXJxX2RvbWFpbihzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlLAorCQkJCQkJc3RydWN0IG1zaV9kb21haW5faW5mbyAqaW5mbywKKwkJCQkJCXN0cnVjdCBpcnFfZG9tYWluICpwYXJlbnQpCit7CisJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbjsKKworCWlmIChpbmZvLT5mbGFncyAmIE1TSV9GTEFHX1VTRV9ERUZfRE9NX09QUykKKwkJZnNsX21jX21zaV91cGRhdGVfZG9tX29wcyhpbmZvKTsKKwlpZiAoaW5mby0+ZmxhZ3MgJiBNU0lfRkxBR19VU0VfREVGX0NISVBfT1BTKQorCQlmc2xfbWNfbXNpX3VwZGF0ZV9jaGlwX29wcyhpbmZvKTsKKworCWRvbWFpbiA9IG1zaV9jcmVhdGVfaXJxX2RvbWFpbihmd25vZGUsIGluZm8sIHBhcmVudCk7CisJaWYgKGRvbWFpbikKKwkJZG9tYWluLT5idXNfdG9rZW4gPSBET01BSU5fQlVTX0ZTTF9NQ19NU0k7CisKKwlyZXR1cm4gZG9tYWluOworfQorCitpbnQgZnNsX21jX2ZpbmRfbXNpX2RvbWFpbihzdHJ1Y3QgZGV2aWNlICptY19wbGF0Zm9ybV9kZXYsCisJCQkgICBzdHJ1Y3QgaXJxX2RvbWFpbiAqKm1jX21zaV9kb21haW4pCit7CisJc3RydWN0IGlycV9kb21haW4gKm1zaV9kb21haW47CisJc3RydWN0IGRldmljZV9ub2RlICptY19vZl9ub2RlID0gbWNfcGxhdGZvcm1fZGV2LT5vZl9ub2RlOworCisJbXNpX2RvbWFpbiA9IG9mX21zaV9nZXRfZG9tYWluKG1jX3BsYXRmb3JtX2RldiwgbWNfb2Zfbm9kZSwKKwkJCQkgICAgICAgRE9NQUlOX0JVU19GU0xfTUNfTVNJKTsKKwlpZiAoIW1zaV9kb21haW4pIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gZmluZCBmc2wtbWMgTVNJIGRvbWFpbiBmb3IgJXNcbiIsCisJCSAgICAgICBtY19vZl9ub2RlLT5mdWxsX25hbWUpOworCisJCXJldHVybiAtRU5PRU5UOworCX0KKworCSptY19tc2lfZG9tYWluID0gbXNpX2RvbWFpbjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnNsX21jX21zaV9mcmVlX2Rlc2NzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MsICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgdG1wLCBkZXZfdG9fbXNpX2xpc3QoZGV2KSwgbGlzdCkgeworCQlsaXN0X2RlbCgmZGVzYy0+bGlzdCk7CisJCWZyZWVfbXNpX2VudHJ5KGRlc2MpOworCX0KK30KKworc3RhdGljIGludCBmc2xfbWNfbXNpX2FsbG9jX2Rlc2NzKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlycV9jb3VudCkKKworeworCXVuc2lnbmVkIGludCBpOworCWludCBlcnJvcjsKKwlzdHJ1Y3QgbXNpX2Rlc2MgKm1zaV9kZXNjOworCisJZm9yIChpID0gMDsgaSA8IGlycV9jb3VudDsgaSsrKSB7CisJCW1zaV9kZXNjID0gYWxsb2NfbXNpX2VudHJ5KGRldiwgMSwgTlVMTCk7CisJCWlmICghbXNpX2Rlc2MpIHsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1zaSBlbnRyeVxuIik7CisJCQllcnJvciA9IC1FTk9NRU07CisJCQlnb3RvIGNsZWFudXBfbXNpX2Rlc2NzOworCQl9CisKKwkJbXNpX2Rlc2MtPmZzbF9tYy5tc2lfaW5kZXggPSBpOworCQlJTklUX0xJU1RfSEVBRCgmbXNpX2Rlc2MtPmxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZtc2lfZGVzYy0+bGlzdCwgZGV2X3RvX21zaV9saXN0KGRldikpOworCX0KKworCXJldHVybiAwOworCitjbGVhbnVwX21zaV9kZXNjczoKKwlmc2xfbWNfbXNpX2ZyZWVfZGVzY3MoZGV2KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludCBmc2xfbWNfbXNpX2RvbWFpbl9hbGxvY19pcnFzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgdW5zaWduZWQgaW50IGlycV9jb3VudCkKK3sKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqbXNpX2RvbWFpbjsKKwlpbnQgZXJyb3I7CisKKwlpZiAoV0FSTl9PTighbGlzdF9lbXB0eShkZXZfdG9fbXNpX2xpc3QoZGV2KSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVycm9yID0gZnNsX21jX21zaV9hbGxvY19kZXNjcyhkZXYsIGlycV9jb3VudCk7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJbXNpX2RvbWFpbiA9IGRldl9nZXRfbXNpX2RvbWFpbihkZXYpOworCWlmIChXQVJOX09OKCFtc2lfZG9tYWluKSkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gY2xlYW51cF9tc2lfZGVzY3M7CisJfQorCisJLyoKKwkgKiBOT1RFOiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCB0cmlnZ2VyIHRoZSBpbnZvY2F0aW9uIG9mIHRoZQorCSAqIGl0c19mc2xfbWNfbXNpX3ByZXBhcmUoKSBjYWxsYmFjaworCSAqLworCWVycm9yID0gbXNpX2RvbWFpbl9hbGxvY19pcnFzKG1zaV9kb21haW4sIGRldiwgaXJxX2NvdW50KTsKKworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBJUlFzXG4iKTsKKwkJZ290byBjbGVhbnVwX21zaV9kZXNjczsKKwl9CisKKwlyZXR1cm4gMDsKKworY2xlYW51cF9tc2lfZGVzY3M6CisJZnNsX21jX21zaV9mcmVlX2Rlc2NzKGRldik7CisJcmV0dXJuIGVycm9yOworfQorCit2b2lkIGZzbF9tY19tc2lfZG9tYWluX2ZyZWVfaXJxcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlycV9kb21haW4gKm1zaV9kb21haW47CisKKwltc2lfZG9tYWluID0gZGV2X2dldF9tc2lfZG9tYWluKGRldik7CisJaWYgKFdBUk5fT04oIW1zaV9kb21haW4pKQorCQlyZXR1cm47CisKKwltc2lfZG9tYWluX2ZyZWVfaXJxcyhtc2lfZG9tYWluLCBkZXYpOworCisJaWYgKFdBUk5fT04obGlzdF9lbXB0eShkZXZfdG9fbXNpX2xpc3QoZGV2KSkpKQorCQlyZXR1cm47CisKKwlmc2xfbWNfbXNpX2ZyZWVfZGVzY3MoZGV2KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2ZzbC1tYy1wcml2YXRlLmggYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9mc2wtbWMtcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NTljMjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9mc2wtbWMtcHJpdmF0ZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBGcmVlc2NhbGUgTWFuYWdlbWVudCBDb21wbGV4IChNQykgYnVzIHByaXZhdGUgZGVjbGFyYXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworI2lmbmRlZiBfRlNMX01DX1BSSVZBVEVfSF8KKyNkZWZpbmUgX0ZTTF9NQ19QUklWQVRFX0hfCisKK2ludCBfX211c3RfY2hlY2sgZnNsX21jX2RldmljZV9hZGQoc3RydWN0IGRwcmNfb2JqX2Rlc2MgKm9ial9kZXNjLAorCQkJCSAgIHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJCSAgIHN0cnVjdCBkZXZpY2UgKnBhcmVudF9kZXYsCisJCQkJICAgc3RydWN0IGZzbF9tY19kZXZpY2UgKipuZXdfbWNfZGV2KTsKKwordm9pZCBmc2xfbWNfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2KTsKKworaW50IF9faW5pdCBkcHJjX2RyaXZlcl9pbml0KHZvaWQpOworCit2b2lkIGRwcmNfZHJpdmVyX2V4aXQodm9pZCk7CisKK2ludCBfX2luaXQgZnNsX21jX2FsbG9jYXRvcl9kcml2ZXJfaW5pdCh2b2lkKTsKKwordm9pZCBmc2xfbWNfYWxsb2NhdG9yX2RyaXZlcl9leGl0KHZvaWQpOworCitpbnQgX19tdXN0X2NoZWNrIGZzbF9tY19yZXNvdXJjZV9hbGxvY2F0ZShzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzLAorCQkJCQkgIGVudW0gZnNsX21jX3Bvb2xfdHlwZSBwb29sX3R5cGUsCisJCQkJCSAgc3RydWN0IGZzbF9tY19yZXNvdXJjZQorCQkJCQkJCSAgKipuZXdfcmVzb3VyY2UpOworCit2b2lkIGZzbF9tY19yZXNvdXJjZV9mcmVlKHN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlKTsKKworaW50IGZzbF9tY19tc2lfZG9tYWluX2FsbG9jX2lycXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSB1bnNpZ25lZCBpbnQgaXJxX2NvdW50KTsKKwordm9pZCBmc2xfbWNfbXNpX2RvbWFpbl9mcmVlX2lycXMoc3RydWN0IGRldmljZSAqZGV2KTsKKworaW50IF9faW5pdCBpdHNfZnNsX21jX21zaV9pbml0KHZvaWQpOworCit2b2lkIGl0c19mc2xfbWNfbXNpX2NsZWFudXAodm9pZCk7CisKK2ludCBfX211c3RfY2hlY2sgZnNsX2NyZWF0ZV9tY19pbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBwaHlzX2FkZHJfdCBtY19wb3J0YWxfcGh5c19hZGRyLAorCQkJCSAgdTMyIG1jX3BvcnRhbF9zaXplLAorCQkJCSAgc3RydWN0IGZzbF9tY19kZXZpY2UgKmRwbWNwX2RldiwKKwkJCQkgIHUzMiBmbGFncywgc3RydWN0IGZzbF9tY19pbyAqKm5ld19tY19pbyk7CisKK3ZvaWQgZnNsX2Rlc3Ryb3lfbWNfaW8oc3RydWN0IGZzbF9tY19pbyAqbWNfaW8pOworCisjZW5kaWYgLyogX0ZTTF9NQ19QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9pcnEtZ2ljLXYzLWl0cy1mc2wtbWMtbXNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9pcnEtZ2ljLXYzLWl0cy1mc2wtbWMtbXNpLmMKaW5kZXggNzIwZTJiMC4uN2E2YWM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvaXJxLWdpYy12My1pdHMtZnNsLW1jLW1zaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2lycS1naWMtdjMtaXRzLWZzbC1tYy1tc2kuYwpAQCAtOSw3ICs5LDYgQEAKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1wcml2YXRlLmgiCiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvYXJtLWdpYy12My5oPgpAQCAtMTcsOCArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21zaS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+Ci0jaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1zeXMuaCIKLSNpbmNsdWRlICJkcHJjLWNtZC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtYnVzLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaXRzX21zaV9pcnFfY2hpcCA9IHsKIAkubmFtZSA9ICJmc2wtbWMtYnVzLW1zaSIsCkBAIC0zNSw3ICszMyw3IEBACiAJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXY7CiAJc3RydWN0IG1zaV9kb21haW5faW5mbyAqbXNpX2luZm87CiAKLQlpZiAoV0FSTl9PTihkZXYtPmJ1cyAhPSAmZnNsX21jX2J1c190eXBlKSkKKwlpZiAoV0FSTl9PTighZGV2X2lzX2ZzbF9tYyhkZXYpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltY19idXNfZGV2ID0gdG9fZnNsX21jX2RldmljZShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtYWxsb2NhdG9yLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9tYy1hbGxvY2F0b3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU5ZDg1MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9tYy1hbGxvY2F0b3IuYworKysgL2Rldi9udWxsCkBAIC0xLDc1NSArMCwwIEBACi0vKgotICogRnJlZXNjYWxlIE1DIG9iamVjdCBkZXZpY2UgYWxsb2NhdG9yIGRyaXZlcgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgotICoKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55Ci0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLQotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtcHJpdmF0ZS5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSAiLi4vaW5jbHVkZS9kcGJwLWNtZC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvZHBjb24tY21kLmgiCi0jaW5jbHVkZSAiZHBtY3AtY21kLmgiCi0jaW5jbHVkZSAiZHBtY3AuaCIKLSNpbmNsdWRlIDxsaW51eC9tc2kuaD4KLQotLyoqCi0gKiBmc2xfbWNfcmVzb3VyY2VfcG9vbF9hZGRfZGV2aWNlIC0gYWRkIGFsbG9jYXRhYmxlIGRldmljZSB0byBhIHJlc291cmNlCi0gKiBwb29sIG9mIGEgZ2l2ZW4gTUMgYnVzCi0gKgotICogQG1jX2J1czogcG9pbnRlciB0byB0aGUgTUMgYnVzCi0gKiBAcG9vbF90eXBlOiBNQyBidXMgcG9vbCB0eXBlCi0gKiBAbWNfZGV2OiBQb2ludGVyIHRvIGFsbG9jYXRhYmxlIE1DIG9iamVjdCBkZXZpY2UKLSAqCi0gKiBJdCBhZGRzIGFuIGFsbG9jYXRhYmxlIE1DIG9iamVjdCBkZXZpY2UgdG8gYSBjb250YWluZXIncyByZXNvdXJjZSBwb29sIG9mCi0gKiB0aGUgZ2l2ZW4gcmVzb3VyY2UgdHlwZQotICovCi1zdGF0aWMgaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfcmVzb3VyY2VfcG9vbF9hZGRfZGV2aWNlKHN0cnVjdCBmc2xfbWNfYnVzCi0JCQkJCQkJCSptY19idXMsCi0JCQkJCQkJZW51bSBmc2xfbWNfcG9vbF90eXBlCi0JCQkJCQkJCXBvb2xfdHlwZSwKLQkJCQkJCQlzdHJ1Y3QgZnNsX21jX2RldmljZQotCQkJCQkJCQkqbWNfZGV2KQotewotCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAqcmVzX3Bvb2w7Ci0Jc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2U7Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYgPSAmbWNfYnVzLT5tY19kZXY7Ci0JaW50IGVycm9yID0gLUVJTlZBTDsKLQotCWlmIChXQVJOX09OKHBvb2xfdHlwZSA8IDAgfHwgcG9vbF90eXBlID49IEZTTF9NQ19OVU1fUE9PTF9UWVBFUykpCi0JCWdvdG8gb3V0OwotCWlmIChXQVJOX09OKCFGU0xfTUNfSVNfQUxMT0NBVEFCTEUobWNfZGV2LT5vYmpfZGVzYy50eXBlKSkpCi0JCWdvdG8gb3V0OwotCWlmIChXQVJOX09OKG1jX2Rldi0+cmVzb3VyY2UpKQotCQlnb3RvIG91dDsKLQotCXJlc19wb29sID0gJm1jX2J1cy0+cmVzb3VyY2VfcG9vbHNbcG9vbF90eXBlXTsKLQlpZiAoV0FSTl9PTihyZXNfcG9vbC0+dHlwZSAhPSBwb29sX3R5cGUpKQotCQlnb3RvIG91dDsKLQlpZiAoV0FSTl9PTihyZXNfcG9vbC0+bWNfYnVzICE9IG1jX2J1cykpCi0JCWdvdG8gb3V0OwotCi0JbXV0ZXhfbG9jaygmcmVzX3Bvb2wtPm11dGV4KTsKLQotCWlmIChXQVJOX09OKHJlc19wb29sLT5tYXhfY291bnQgPCAwKSkKLQkJZ290byBvdXRfdW5sb2NrOwotCWlmIChXQVJOX09OKHJlc19wb29sLT5mcmVlX2NvdW50IDwgMCB8fAotCQkgICAgcmVzX3Bvb2wtPmZyZWVfY291bnQgPiByZXNfcG9vbC0+bWF4X2NvdW50KSkKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JcmVzb3VyY2UgPSBkZXZtX2t6YWxsb2MoJm1jX2J1c19kZXYtPmRldiwgc2l6ZW9mKCpyZXNvdXJjZSksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZXNvdXJjZSkgewotCQllcnJvciA9IC1FTk9NRU07Ci0JCWRldl9lcnIoJm1jX2J1c19kZXYtPmRldiwKLQkJCSJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBmc2xfbWNfcmVzb3VyY2VcbiIpOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JcmVzb3VyY2UtPnR5cGUgPSBwb29sX3R5cGU7Ci0JcmVzb3VyY2UtPmlkID0gbWNfZGV2LT5vYmpfZGVzYy5pZDsKLQlyZXNvdXJjZS0+ZGF0YSA9IG1jX2RldjsKLQlyZXNvdXJjZS0+cGFyZW50X3Bvb2wgPSByZXNfcG9vbDsKLQlJTklUX0xJU1RfSEVBRCgmcmVzb3VyY2UtPm5vZGUpOwotCWxpc3RfYWRkX3RhaWwoJnJlc291cmNlLT5ub2RlLCAmcmVzX3Bvb2wtPmZyZWVfbGlzdCk7Ci0JbWNfZGV2LT5yZXNvdXJjZSA9IHJlc291cmNlOwotCXJlc19wb29sLT5mcmVlX2NvdW50Kys7Ci0JcmVzX3Bvb2wtPm1heF9jb3VudCsrOwotCWVycm9yID0gMDsKLW91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOwotb3V0OgotCXJldHVybiBlcnJvcjsKLX0KLQotLyoqCi0gKiBmc2xfbWNfcmVzb3VyY2VfcG9vbF9yZW1vdmVfZGV2aWNlIC0gcmVtb3ZlIGFuIGFsbG9jYXRhYmxlIGRldmljZSBmcm9tIGEKLSAqIHJlc291cmNlIHBvb2wKLSAqCi0gKiBAbWNfZGV2OiBQb2ludGVyIHRvIGFsbG9jYXRhYmxlIE1DIG9iamVjdCBkZXZpY2UKLSAqCi0gKiBJdCBwZXJtYW5lbnRseSByZW1vdmVzIGFuIGFsbG9jYXRhYmxlIE1DIG9iamVjdCBkZXZpY2UgZnJvbSB0aGUgcmVzb3VyY2UKLSAqIHBvb2wsIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGluLCBhcyBsb25nIGFzIGl0IGlzIGluIHRoZSBwb29sJ3MgZnJlZSBsaXN0LgotICovCi1zdGF0aWMgaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfcmVzb3VyY2VfcG9vbF9yZW1vdmVfZGV2aWNlKHN0cnVjdCBmc2xfbWNfZGV2aWNlCi0JCQkJCQkJCSAgICptY19kZXYpCi17Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXY7Ci0Jc3RydWN0IGZzbF9tY19idXMgKm1jX2J1czsKLQlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnJlc19wb29sOwotCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlOwotCWludCBlcnJvciA9IC1FSU5WQUw7Ci0KLQlpZiAoV0FSTl9PTighRlNMX01DX0lTX0FMTE9DQVRBQkxFKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSkpKQotCQlnb3RvIG91dDsKLQotCXJlc291cmNlID0gbWNfZGV2LT5yZXNvdXJjZTsKLQlpZiAoV0FSTl9PTighcmVzb3VyY2UgfHwgcmVzb3VyY2UtPmRhdGEgIT0gbWNfZGV2KSkKLQkJZ290byBvdXQ7Ci0KLQltY19idXNfZGV2ID0gdG9fZnNsX21jX2RldmljZShtY19kZXYtPmRldi5wYXJlbnQpOwotCW1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfYnVzX2Rldik7Ci0JcmVzX3Bvb2wgPSByZXNvdXJjZS0+cGFyZW50X3Bvb2w7Ci0JaWYgKFdBUk5fT04ocmVzX3Bvb2wgIT0gJm1jX2J1cy0+cmVzb3VyY2VfcG9vbHNbcmVzb3VyY2UtPnR5cGVdKSkKLQkJZ290byBvdXQ7Ci0KLQltdXRleF9sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOwotCi0JaWYgKFdBUk5fT04ocmVzX3Bvb2wtPm1heF9jb3VudCA8PSAwKSkKLQkJZ290byBvdXRfdW5sb2NrOwotCWlmIChXQVJOX09OKHJlc19wb29sLT5mcmVlX2NvdW50IDw9IDAgfHwKLQkJICAgIHJlc19wb29sLT5mcmVlX2NvdW50ID4gcmVzX3Bvb2wtPm1heF9jb3VudCkpCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCS8qCi0JICogSWYgdGhlIGRldmljZSBpcyBjdXJyZW50bHkgYWxsb2NhdGVkLCBpdHMgcmVzb3VyY2UgaXMgbm90Ci0JICogaW4gdGhlIGZyZWUgbGlzdCBhbmQgdGh1cywgdGhlIGRldmljZSBjYW5ub3QgYmUgcmVtb3ZlZC4KLQkgKi8KLQlpZiAobGlzdF9lbXB0eSgmcmVzb3VyY2UtPm5vZGUpKSB7Ci0JCWVycm9yID0gLUVCVVNZOwotCQlkZXZfZXJyKCZtY19idXNfZGV2LT5kZXYsCi0JCQkiRGV2aWNlICVzIGNhbm5vdCBiZSByZW1vdmVkIGZyb20gcmVzb3VyY2UgcG9vbFxuIiwKLQkJCWRldl9uYW1lKCZtY19kZXYtPmRldikpOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JbGlzdF9kZWwoJnJlc291cmNlLT5ub2RlKTsKLQlJTklUX0xJU1RfSEVBRCgmcmVzb3VyY2UtPm5vZGUpOwotCXJlc19wb29sLT5mcmVlX2NvdW50LS07Ci0JcmVzX3Bvb2wtPm1heF9jb3VudC0tOwotCi0JZGV2bV9rZnJlZSgmbWNfYnVzX2Rldi0+ZGV2LCByZXNvdXJjZSk7Ci0JbWNfZGV2LT5yZXNvdXJjZSA9IE5VTEw7Ci0JZXJyb3IgPSAwOwotb3V0X3VubG9jazoKLQltdXRleF91bmxvY2soJnJlc19wb29sLT5tdXRleCk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZnNsX21jX3Bvb2xfdHlwZV9zdHJpbmdzW10gPSB7Ci0JW0ZTTF9NQ19QT09MX0RQTUNQXSA9ICJkcG1jcCIsCi0JW0ZTTF9NQ19QT09MX0RQQlBdID0gImRwYnAiLAotCVtGU0xfTUNfUE9PTF9EUENPTl0gPSAiZHBjb24iLAotCVtGU0xfTUNfUE9PTF9JUlFdID0gImlycSIsCi19OwotCi1zdGF0aWMgaW50IF9fbXVzdF9jaGVjayBvYmplY3RfdHlwZV90b19wb29sX3R5cGUoY29uc3QgY2hhciAqb2JqZWN0X3R5cGUsCi0JCQkJCQkgZW51bSBmc2xfbWNfcG9vbF90eXBlCi0JCQkJCQkJCSpwb29sX3R5cGUpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmc2xfbWNfcG9vbF90eXBlX3N0cmluZ3MpOyBpKyspIHsKLQkJaWYgKHN0cmNtcChvYmplY3RfdHlwZSwgZnNsX21jX3Bvb2xfdHlwZV9zdHJpbmdzW2ldKSA9PSAwKSB7Ci0JCQkqcG9vbF90eXBlID0gaTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLWludCBfX211c3RfY2hlY2sgZnNsX21jX3Jlc291cmNlX2FsbG9jYXRlKHN0cnVjdCBmc2xfbWNfYnVzICptY19idXMsCi0JCQkJCSAgZW51bSBmc2xfbWNfcG9vbF90eXBlIHBvb2xfdHlwZSwKLQkJCQkJICBzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICoqbmV3X3Jlc291cmNlKQotewotCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAqcmVzX3Bvb2w7Ci0Jc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2U7Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYgPSAmbWNfYnVzLT5tY19kZXY7Ci0JaW50IGVycm9yID0gLUVJTlZBTDsKLQotCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKGZzbF9tY19wb29sX3R5cGVfc3RyaW5ncykgIT0KLQkJICAgICBGU0xfTUNfTlVNX1BPT0xfVFlQRVMpOwotCi0JKm5ld19yZXNvdXJjZSA9IE5VTEw7Ci0JaWYgKFdBUk5fT04ocG9vbF90eXBlIDwgMCB8fCBwb29sX3R5cGUgPj0gRlNMX01DX05VTV9QT09MX1RZUEVTKSkKLQkJZ290byBvdXQ7Ci0KLQlyZXNfcG9vbCA9ICZtY19idXMtPnJlc291cmNlX3Bvb2xzW3Bvb2xfdHlwZV07Ci0JaWYgKFdBUk5fT04ocmVzX3Bvb2wtPm1jX2J1cyAhPSBtY19idXMpKQotCQlnb3RvIG91dDsKLQotCW11dGV4X2xvY2soJnJlc19wb29sLT5tdXRleCk7Ci0JcmVzb3VyY2UgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJnJlc19wb29sLT5mcmVlX2xpc3QsCi0JCQkJCSAgICBzdHJ1Y3QgZnNsX21jX3Jlc291cmNlLCBub2RlKTsKLQotCWlmICghcmVzb3VyY2UpIHsKLQkJV0FSTl9PTihyZXNfcG9vbC0+ZnJlZV9jb3VudCAhPSAwKTsKLQkJZXJyb3IgPSAtRU5YSU87Ci0JCWRldl9lcnIoJm1jX2J1c19kZXYtPmRldiwKLQkJCSJObyBtb3JlIHJlc291cmNlcyBvZiB0eXBlICVzIGxlZnRcbiIsCi0JCQlmc2xfbWNfcG9vbF90eXBlX3N0cmluZ3NbcG9vbF90eXBlXSk7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KLQlpZiAoV0FSTl9PTihyZXNvdXJjZS0+dHlwZSAhPSBwb29sX3R5cGUpKQotCQlnb3RvIG91dF91bmxvY2s7Ci0JaWYgKFdBUk5fT04ocmVzb3VyY2UtPnBhcmVudF9wb29sICE9IHJlc19wb29sKSkKLQkJZ290byBvdXRfdW5sb2NrOwotCWlmIChXQVJOX09OKHJlc19wb29sLT5mcmVlX2NvdW50IDw9IDAgfHwKLQkJICAgIHJlc19wb29sLT5mcmVlX2NvdW50ID4gcmVzX3Bvb2wtPm1heF9jb3VudCkpCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCWxpc3RfZGVsKCZyZXNvdXJjZS0+bm9kZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnJlc291cmNlLT5ub2RlKTsKLQotCXJlc19wb29sLT5mcmVlX2NvdW50LS07Ci0JZXJyb3IgPSAwOwotb3V0X3VubG9jazoKLQltdXRleF91bmxvY2soJnJlc19wb29sLT5tdXRleCk7Ci0JKm5ld19yZXNvdXJjZSA9IHJlc291cmNlOwotb3V0OgotCXJldHVybiBlcnJvcjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19yZXNvdXJjZV9hbGxvY2F0ZSk7Ci0KLXZvaWQgZnNsX21jX3Jlc291cmNlX2ZyZWUoc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2UpCi17Ci0Jc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sICpyZXNfcG9vbDsKLQotCXJlc19wb29sID0gcmVzb3VyY2UtPnBhcmVudF9wb29sOwotCWlmIChXQVJOX09OKHJlc291cmNlLT50eXBlICE9IHJlc19wb29sLT50eXBlKSkKLQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jaygmcmVzX3Bvb2wtPm11dGV4KTsKLQlpZiAoV0FSTl9PTihyZXNfcG9vbC0+ZnJlZV9jb3VudCA8IDAgfHwKLQkJICAgIHJlc19wb29sLT5mcmVlX2NvdW50ID49IHJlc19wb29sLT5tYXhfY291bnQpKQotCQlnb3RvIG91dF91bmxvY2s7Ci0KLQlpZiAoV0FSTl9PTighbGlzdF9lbXB0eSgmcmVzb3VyY2UtPm5vZGUpKSkKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JbGlzdF9hZGRfdGFpbCgmcmVzb3VyY2UtPm5vZGUsICZyZXNfcG9vbC0+ZnJlZV9saXN0KTsKLQlyZXNfcG9vbC0+ZnJlZV9jb3VudCsrOwotb3V0X3VubG9jazoKLQltdXRleF91bmxvY2soJnJlc19wb29sLT5tdXRleCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfcmVzb3VyY2VfZnJlZSk7Ci0KLS8qKgotICogZnNsX21jX3BvcnRhbF9hbGxvY2F0ZSAtIEFsbG9jYXRlcyBhbiBNQyBwb3J0YWwKLSAqCi0gKiBAbWNfZGV2OiBNQyBkZXZpY2UgZm9yIHdoaWNoIHRoZSBNQyBwb3J0YWwgaXMgdG8gYmUgYWxsb2NhdGVkCi0gKiBAbWNfaW9fZmxhZ3M6IEZsYWdzIGZvciB0aGUgZnNsX21jX2lvIG9iamVjdCB0aGF0IHdyYXBzIHRoZSBhbGxvY2F0ZWQKLSAqIE1DIHBvcnRhbC4KLSAqIEBuZXdfbWNfaW86IFBvaW50ZXIgdG8gYXJlYSB3aGVyZSB0aGUgcG9pbnRlciB0byB0aGUgZnNsX21jX2lvIG9iamVjdAotICogdGhhdCB3cmFwcyB0aGUgYWxsb2NhdGVkIE1DIHBvcnRhbCBpcyB0byBiZSByZXR1cm5lZAotICoKLSAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGFuIE1DIHBvcnRhbCBmcm9tIHRoZSBkZXZpY2UncyBwYXJlbnQgRFBSQywKLSAqIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgTUMgYnVzJyBwb29sIG9mIE1DIHBvcnRhbHMgYW5kIHdyYXBzCi0gKiBpdCBpbiBhIG5ldyBmc2xfbWNfaW8gb2JqZWN0LiBJZiAnbWNfZGV2JyBpcyBhIERQUkMgaXRzZWxmLCB0aGUKLSAqIHBvcnRhbCBpcyBhbGxvY2F0ZWQgZnJvbSBpdHMgb3duIE1DIGJ1cy4KLSAqLwotaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfcG9ydGFsX2FsbG9jYXRlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYsCi0JCQkJCXUxNiBtY19pb19mbGFncywKLQkJCQkJc3RydWN0IGZzbF9tY19pbyAqKm5ld19tY19pbykKLXsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldjsKLQlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzOwotCXBoeXNfYWRkcl90IG1jX3BvcnRhbF9waHlzX2FkZHI7Ci0Jc2l6ZV90IG1jX3BvcnRhbF9zaXplOwotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICpkcG1jcF9kZXY7Ci0JaW50IGVycm9yID0gLUVJTlZBTDsKLQlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZSA9IE5VTEw7Ci0Jc3RydWN0IGZzbF9tY19pbyAqbWNfaW8gPSBOVUxMOwotCi0JaWYgKG1jX2Rldi0+ZmxhZ3MgJiBGU0xfTUNfSVNfRFBSQykgewotCQltY19idXNfZGV2ID0gbWNfZGV2OwotCX0gZWxzZSB7Ci0JCWlmIChXQVJOX09OKG1jX2Rldi0+ZGV2LnBhcmVudC0+YnVzICE9ICZmc2xfbWNfYnVzX3R5cGUpKQotCQkJcmV0dXJuIGVycm9yOwotCi0JCW1jX2J1c19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKG1jX2Rldi0+ZGV2LnBhcmVudCk7Ci0JfQotCi0JbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19idXNfZGV2KTsKLQkqbmV3X21jX2lvID0gTlVMTDsKLQllcnJvciA9IGZzbF9tY19yZXNvdXJjZV9hbGxvY2F0ZShtY19idXMsIEZTTF9NQ19QT09MX0RQTUNQLCAmcmVzb3VyY2UpOwotCWlmIChlcnJvciA8IDApCi0JCXJldHVybiBlcnJvcjsKLQotCWVycm9yID0gLUVJTlZBTDsKLQlkcG1jcF9kZXYgPSByZXNvdXJjZS0+ZGF0YTsKLQlpZiAoV0FSTl9PTighZHBtY3BfZGV2KSkKLQkJZ290byBlcnJvcl9jbGVhbnVwX3Jlc291cmNlOwotCi0JaWYgKGRwbWNwX2Rldi0+b2JqX2Rlc2MudmVyX21ham9yIDwgRFBNQ1BfTUlOX1ZFUl9NQUpPUiB8fAotCSAgICAoZHBtY3BfZGV2LT5vYmpfZGVzYy52ZXJfbWFqb3IgPT0gRFBNQ1BfTUlOX1ZFUl9NQUpPUiAmJgotCSAgICAgZHBtY3BfZGV2LT5vYmpfZGVzYy52ZXJfbWlub3IgPCBEUE1DUF9NSU5fVkVSX01JTk9SKSkgewotCQlkZXZfZXJyKCZkcG1jcF9kZXYtPmRldiwKLQkJCSJFUlJPUjogVmVyc2lvbiAlZC4lZCBvZiBEUE1DUCBub3Qgc3VwcG9ydGVkLlxuIiwKLQkJCWRwbWNwX2Rldi0+b2JqX2Rlc2MudmVyX21ham9yLAotCQkJZHBtY3BfZGV2LT5vYmpfZGVzYy52ZXJfbWlub3IpOwotCQllcnJvciA9IC1FTk9UU1VQUDsKLQkJZ290byBlcnJvcl9jbGVhbnVwX3Jlc291cmNlOwotCX0KLQotCWlmIChXQVJOX09OKGRwbWNwX2Rldi0+b2JqX2Rlc2MucmVnaW9uX2NvdW50ID09IDApKQotCQlnb3RvIGVycm9yX2NsZWFudXBfcmVzb3VyY2U7Ci0KLQltY19wb3J0YWxfcGh5c19hZGRyID0gZHBtY3BfZGV2LT5yZWdpb25zWzBdLnN0YXJ0OwotCW1jX3BvcnRhbF9zaXplID0gZHBtY3BfZGV2LT5yZWdpb25zWzBdLmVuZCAtCi0JCQkgZHBtY3BfZGV2LT5yZWdpb25zWzBdLnN0YXJ0ICsgMTsKLQotCWlmIChXQVJOX09OKG1jX3BvcnRhbF9zaXplICE9IG1jX2J1c19kZXYtPm1jX2lvLT5wb3J0YWxfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfY2xlYW51cF9yZXNvdXJjZTsKLQotCWVycm9yID0gZnNsX2NyZWF0ZV9tY19pbygmbWNfYnVzX2Rldi0+ZGV2LAotCQkJCSBtY19wb3J0YWxfcGh5c19hZGRyLAotCQkJCSBtY19wb3J0YWxfc2l6ZSwgZHBtY3BfZGV2LAotCQkJCSBtY19pb19mbGFncywgJm1jX2lvKTsKLQlpZiAoZXJyb3IgPCAwKQotCQlnb3RvIGVycm9yX2NsZWFudXBfcmVzb3VyY2U7Ci0KLQkqbmV3X21jX2lvID0gbWNfaW87Ci0JcmV0dXJuIDA7Ci0KLWVycm9yX2NsZWFudXBfcmVzb3VyY2U6Ci0JZnNsX21jX3Jlc291cmNlX2ZyZWUocmVzb3VyY2UpOwotCXJldHVybiBlcnJvcjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19wb3J0YWxfYWxsb2NhdGUpOwotCi0vKioKLSAqIGZzbF9tY19wb3J0YWxfZnJlZSAtIFJldHVybnMgYW4gTUMgcG9ydGFsIHRvIHRoZSBwb29sIG9mIGZyZWUgTUMgcG9ydGFscwotICogb2YgYSBnaXZlbiBNQyBidXMKLSAqCi0gKiBAbWNfaW86IFBvaW50ZXIgdG8gdGhlIGZzbF9tY19pbyBvYmplY3QgdGhhdCB3cmFwcyB0aGUgTUMgcG9ydGFsIHRvIGZyZWUKLSAqLwotdm9pZCBmc2xfbWNfcG9ydGFsX2ZyZWUoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8pCi17Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2UgKmRwbWNwX2RldjsKLQlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZTsKLQotCS8qCi0JICogRXZlcnkgbWNfaW8gb2J0YWluZWQgYnkgY2FsbGluZyBmc2xfbWNfcG9ydGFsX2FsbG9jYXRlKCkgaXMgc3VwcG9zZWQKLQkgKiB0byBoYXZlIGEgRFBNQ1Agb2JqZWN0IGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlkcG1jcF9kZXYgPSBtY19pby0+ZHBtY3BfZGV2OwotCWlmIChXQVJOX09OKCFkcG1jcF9kZXYpKQotCQlyZXR1cm47Ci0KLQlyZXNvdXJjZSA9IGRwbWNwX2Rldi0+cmVzb3VyY2U7Ci0JaWYgKFdBUk5fT04oIXJlc291cmNlIHx8IHJlc291cmNlLT50eXBlICE9IEZTTF9NQ19QT09MX0RQTUNQKSkKLQkJcmV0dXJuOwotCi0JaWYgKFdBUk5fT04ocmVzb3VyY2UtPmRhdGEgIT0gZHBtY3BfZGV2KSkKLQkJcmV0dXJuOwotCi0JZnNsX2Rlc3Ryb3lfbWNfaW8obWNfaW8pOwotCWZzbF9tY19yZXNvdXJjZV9mcmVlKHJlc291cmNlKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19wb3J0YWxfZnJlZSk7Ci0KLS8qKgotICogZnNsX21jX3BvcnRhbF9yZXNldCAtIFJlc2V0cyB0aGUgZHBtY3Agb2JqZWN0IGZvciBhIGdpdmVuIGZzbF9tY19pbyBvYmplY3QKLSAqCi0gKiBAbWNfaW86IFBvaW50ZXIgdG8gdGhlIGZzbF9tY19pbyBvYmplY3QgdGhhdCB3cmFwcyB0aGUgTUMgcG9ydGFsIHRvIGZyZWUKLSAqLwotaW50IGZzbF9tY19wb3J0YWxfcmVzZXQoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8pCi17Ci0JaW50IGVycm9yOwotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICpkcG1jcF9kZXYgPSBtY19pby0+ZHBtY3BfZGV2OwotCi0JaWYgKFdBUk5fT04oIWRwbWNwX2RldikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZXJyb3IgPSBkcG1jcF9yZXNldChtY19pbywgMCwgZHBtY3BfZGV2LT5tY19oYW5kbGUpOwotCWlmIChlcnJvciA8IDApIHsKLQkJZGV2X2VycigmZHBtY3BfZGV2LT5kZXYsICJkcG1jcF9yZXNldCgpIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX3BvcnRhbF9yZXNldCk7Ci0KLS8qKgotICogZnNsX21jX29iamVjdF9hbGxvY2F0ZSAtIEFsbG9jYXRlcyBhIE1DIG9iamVjdCBkZXZpY2Ugb2YgdGhlIGdpdmVuCi0gKiBwb29sIHR5cGUgZnJvbSBhIGdpdmVuIE1DIGJ1cwotICoKLSAqIEBtY19kZXY6IE1DIGRldmljZSBmb3Igd2hpY2ggdGhlIE1DIG9iamVjdCBkZXZpY2UgaXMgdG8gYmUgYWxsb2NhdGVkCi0gKiBAcG9vbF90eXBlOiBNQyBidXMgcmVzb3VyY2UgcG9vbCB0eXBlCi0gKiBAbmV3X21jX2RldjogUG9pbnRlciB0byBhcmVhIHdoZXJlIHRoZSBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQKLSAqIE1DIG9iamVjdCBkZXZpY2UgaXMgdG8gYmUgcmV0dXJuZWQKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIE1DIG9iamVjdCBkZXZpY2UgZnJvbSB0aGUgZGV2aWNlJ3MgcGFyZW50IERQUkMsCi0gKiBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIE1DIGJ1cycgcG9vbCBvZiBhbGxvY2F0YWJsZSBNQyBvYmplY3QgZGV2aWNlcyBvZgotICogdGhlIGdpdmVuIHJlc291cmNlIHR5cGUuIG1jX2RldiBjYW5ub3QgYmUgYSBEUFJDIGl0c2VsZi4KLSAqCi0gKiBOT1RFOiBwb29sX3R5cGUgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSBGU0xfTUNfUE9PTF9NQ1AsIHNpbmNlIE1DCi0gKiBwb3J0YWxzIGFyZSBhbGxvY2F0ZWQgdXNpbmcgZnNsX21jX3BvcnRhbF9hbGxvY2F0ZSgpLCBpbnN0ZWFkIG9mCi0gKiB0aGlzIGZ1bmN0aW9uLgotICovCi1pbnQgX19tdXN0X2NoZWNrIGZzbF9tY19vYmplY3RfYWxsb2NhdGUoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiwKLQkJCQkJZW51bSBmc2xfbWNfcG9vbF90eXBlIHBvb2xfdHlwZSwKLQkJCQkJc3RydWN0IGZzbF9tY19kZXZpY2UgKipuZXdfbWNfYWRldikKLXsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldjsKLQlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzOwotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19hZGV2OwotCWludCBlcnJvciA9IC1FSU5WQUw7Ci0Jc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2UgPSBOVUxMOwotCi0JKm5ld19tY19hZGV2ID0gTlVMTDsKLQlpZiAoV0FSTl9PTihtY19kZXYtPmZsYWdzICYgRlNMX01DX0lTX0RQUkMpKQotCQlnb3RvIGVycm9yOwotCi0JaWYgKFdBUk5fT04obWNfZGV2LT5kZXYucGFyZW50LT5idXMgIT0gJmZzbF9tY19idXNfdHlwZSkpCi0JCWdvdG8gZXJyb3I7Ci0KLQlpZiAoV0FSTl9PTihwb29sX3R5cGUgPT0gRlNMX01DX1BPT0xfRFBNQ1ApKQotCQlnb3RvIGVycm9yOwotCi0JbWNfYnVzX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UobWNfZGV2LT5kZXYucGFyZW50KTsKLQltY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2J1c19kZXYpOwotCWVycm9yID0gZnNsX21jX3Jlc291cmNlX2FsbG9jYXRlKG1jX2J1cywgcG9vbF90eXBlLCAmcmVzb3VyY2UpOwotCWlmIChlcnJvciA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQltY19hZGV2ID0gcmVzb3VyY2UtPmRhdGE7Ci0JaWYgKFdBUk5fT04oIW1jX2FkZXYpKQotCQlnb3RvIGVycm9yOwotCi0JKm5ld19tY19hZGV2ID0gbWNfYWRldjsKLQlyZXR1cm4gMDsKLWVycm9yOgotCWlmIChyZXNvdXJjZSkKLQkJZnNsX21jX3Jlc291cmNlX2ZyZWUocmVzb3VyY2UpOwotCi0JcmV0dXJuIGVycm9yOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX29iamVjdF9hbGxvY2F0ZSk7Ci0KLS8qKgotICogZnNsX21jX29iamVjdF9mcmVlIC0gUmV0dXJucyBhbiBhbGxvY2F0YWJsZSBNQyBvYmplY3QgZGV2aWNlIHRvIHRoZQotICogY29ycmVzcG9uZGluZyByZXNvdXJjZSBwb29sIG9mIGEgZ2l2ZW4gTUMgYnVzLgotICoKLSAqIEBtY19hZGV2OiBQb2ludGVyIHRvIHRoZSBNQyBvYmplY3QgZGV2aWNlCi0gKi8KLXZvaWQgZnNsX21jX29iamVjdF9mcmVlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19hZGV2KQotewotCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlOwotCi0JcmVzb3VyY2UgPSBtY19hZGV2LT5yZXNvdXJjZTsKLQlpZiAoV0FSTl9PTihyZXNvdXJjZS0+dHlwZSA9PSBGU0xfTUNfUE9PTF9EUE1DUCkpCi0JCXJldHVybjsKLQlpZiAoV0FSTl9PTihyZXNvdXJjZS0+ZGF0YSAhPSBtY19hZGV2KSkKLQkJcmV0dXJuOwotCi0JZnNsX21jX3Jlc291cmNlX2ZyZWUocmVzb3VyY2UpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX29iamVjdF9mcmVlKTsKLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIGludGVycnVwdCBwb29sIGFzc29jaWF0ZWQgd2l0aCBhIE1DIGJ1cy4KLSAqIEl0IGFsbG9jYXRlcyBhIGJsb2NrIG9mIElSUXMgZnJvbSB0aGUgR0lDLUlUUwotICovCi1pbnQgZnNsX21jX3BvcHVsYXRlX2lycV9wb29sKHN0cnVjdCBmc2xfbWNfYnVzICptY19idXMsCi0JCQkgICAgIHVuc2lnbmVkIGludCBpcnFfY291bnQpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IG1zaV9kZXNjICptc2lfZGVzYzsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZV9pcnEgKmlycV9yZXNvdXJjZXM7Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2VfaXJxICptY19kZXZfaXJxOwotCWludCBlcnJvcjsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldiA9ICZtY19idXMtPm1jX2RldjsKLQlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnJlc19wb29sID0KLQkJCSZtY19idXMtPnJlc291cmNlX3Bvb2xzW0ZTTF9NQ19QT09MX0lSUV07Ci0KLQlpZiAoV0FSTl9PTihpcnFfY291bnQgPT0gMCB8fAotCQkgICAgaXJxX2NvdW50ID4gRlNMX01DX0lSUV9QT09MX01BWF9UT1RBTF9JUlFTKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQllcnJvciA9IGZzbF9tY19tc2lfZG9tYWluX2FsbG9jX2lycXMoJm1jX2J1c19kZXYtPmRldiwgaXJxX2NvdW50KTsKLQlpZiAoZXJyb3IgPCAwKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQlpcnFfcmVzb3VyY2VzID0gZGV2bV9remFsbG9jKCZtY19idXNfZGV2LT5kZXYsCi0JCQkJICAgICBzaXplb2YoKmlycV9yZXNvdXJjZXMpICogaXJxX2NvdW50LAotCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpcnFfcmVzb3VyY2VzKSB7Ci0JCWVycm9yID0gLUVOT01FTTsKLQkJZ290byBjbGVhbnVwX21zaV9pcnFzOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBpcnFfY291bnQ7IGkrKykgewotCQltY19kZXZfaXJxID0gJmlycV9yZXNvdXJjZXNbaV07Ci0KLQkJLyoKLQkJICogTk9URTogVGhpcyBtY19kZXZfaXJxJ3MgTVNJIGFkZHIvdmFsdWUgcGFpciB3aWxsIGJlIHNldAotCQkgKiBieSB0aGUgZnNsX21jX21zaV93cml0ZV9tc2coKSBjYWxsYmFjawotCQkgKi8KLQkJbWNfZGV2X2lycS0+cmVzb3VyY2UudHlwZSA9IHJlc19wb29sLT50eXBlOwotCQltY19kZXZfaXJxLT5yZXNvdXJjZS5kYXRhID0gbWNfZGV2X2lycTsKLQkJbWNfZGV2X2lycS0+cmVzb3VyY2UucGFyZW50X3Bvb2wgPSByZXNfcG9vbDsKLQkJSU5JVF9MSVNUX0hFQUQoJm1jX2Rldl9pcnEtPnJlc291cmNlLm5vZGUpOwotCQlsaXN0X2FkZF90YWlsKCZtY19kZXZfaXJxLT5yZXNvdXJjZS5ub2RlLCAmcmVzX3Bvb2wtPmZyZWVfbGlzdCk7Ci0JfQotCi0JZm9yX2VhY2hfbXNpX2VudHJ5KG1zaV9kZXNjLCAmbWNfYnVzX2Rldi0+ZGV2KSB7Ci0JCW1jX2Rldl9pcnEgPSAmaXJxX3Jlc291cmNlc1ttc2lfZGVzYy0+ZnNsX21jLm1zaV9pbmRleF07Ci0JCW1jX2Rldl9pcnEtPm1zaV9kZXNjID0gbXNpX2Rlc2M7Ci0JCW1jX2Rldl9pcnEtPnJlc291cmNlLmlkID0gbXNpX2Rlc2MtPmlycTsKLQl9Ci0KLQlyZXNfcG9vbC0+bWF4X2NvdW50ID0gaXJxX2NvdW50OwotCXJlc19wb29sLT5mcmVlX2NvdW50ID0gaXJxX2NvdW50OwotCW1jX2J1cy0+aXJxX3Jlc291cmNlcyA9IGlycV9yZXNvdXJjZXM7Ci0JcmV0dXJuIDA7Ci0KLWNsZWFudXBfbXNpX2lycXM6Ci0JZnNsX21jX21zaV9kb21haW5fZnJlZV9pcnFzKCZtY19idXNfZGV2LT5kZXYpOwotCXJldHVybiBlcnJvcjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19wb3B1bGF0ZV9pcnFfcG9vbCk7Ci0KLS8qKgotICogVGVhcmRvd24gdGhlIGludGVycnVwdCBwb29sIGFzc29jaWF0ZWQgd2l0aCBhbiBNQyBidXMuCi0gKiBJdCBmcmVlcyB0aGUgSVJRcyB0aGF0IHdlcmUgYWxsb2NhdGVkIHRvIHRoZSBwb29sLCBiYWNrIHRvIHRoZSBHSUMtSVRTLgotICovCi12b2lkIGZzbF9tY19jbGVhbnVwX2lycV9wb29sKHN0cnVjdCBmc2xfbWNfYnVzICptY19idXMpCi17Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYgPSAmbWNfYnVzLT5tY19kZXY7Ci0Jc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sICpyZXNfcG9vbCA9Ci0JCQkmbWNfYnVzLT5yZXNvdXJjZV9wb29sc1tGU0xfTUNfUE9PTF9JUlFdOwotCi0JaWYgKFdBUk5fT04oIW1jX2J1cy0+aXJxX3Jlc291cmNlcykpCi0JCXJldHVybjsKLQotCWlmIChXQVJOX09OKHJlc19wb29sLT5tYXhfY291bnQgPT0gMCkpCi0JCXJldHVybjsKLQotCWlmIChXQVJOX09OKHJlc19wb29sLT5mcmVlX2NvdW50ICE9IHJlc19wb29sLT5tYXhfY291bnQpKQotCQlyZXR1cm47Ci0KLQlJTklUX0xJU1RfSEVBRCgmcmVzX3Bvb2wtPmZyZWVfbGlzdCk7Ci0JcmVzX3Bvb2wtPm1heF9jb3VudCA9IDA7Ci0JcmVzX3Bvb2wtPmZyZWVfY291bnQgPSAwOwotCW1jX2J1cy0+aXJxX3Jlc291cmNlcyA9IE5VTEw7Ci0JZnNsX21jX21zaV9kb21haW5fZnJlZV9pcnFzKCZtY19idXNfZGV2LT5kZXYpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX2NsZWFudXBfaXJxX3Bvb2wpOwotCi0vKioKLSAqIEl0IGFsbG9jYXRlcyB0aGUgSVJRcyByZXF1aXJlZCBieSBhIGdpdmVuIE1DIG9iamVjdCBkZXZpY2UuIFRoZQotICogSVJRcyBhcmUgYWxsb2NhdGVkIGZyb20gdGhlIGludGVycnVwdCBwb29sIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAqIE1DIGJ1cyB0aGF0IGNvbnRhaW5zIHRoZSBkZXZpY2UsIGlmIHRoZSBkZXZpY2UgaXMgbm90IGEgRFBSQyBkZXZpY2UuCi0gKiBPdGhlcndpc2UsIHRoZSBJUlFzIGFyZSBhbGxvY2F0ZWQgZnJvbSB0aGUgaW50ZXJydXB0IHBvb2wgYXNzb2NpYXRlZAotICogd2l0aCB0aGUgTUMgYnVzIHRoYXQgcmVwcmVzZW50cyB0aGUgRFBSQyBkZXZpY2UgaXRzZWxmLgotICovCi1pbnQgX19tdXN0X2NoZWNrIGZzbF9tY19hbGxvY2F0ZV9pcnFzKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYpCi17Ci0JaW50IGk7Ci0JaW50IGlycV9jb3VudDsKLQlpbnQgcmVzX2FsbG9jYXRlZF9jb3VudCA9IDA7Ci0JaW50IGVycm9yID0gLUVJTlZBTDsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZV9pcnEgKippcnFzID0gTlVMTDsKLQlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzOwotCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAqcmVzX3Bvb2w7Ci0KLQlpZiAoV0FSTl9PTihtY19kZXYtPmlycXMpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlycV9jb3VudCA9IG1jX2Rldi0+b2JqX2Rlc2MuaXJxX2NvdW50OwotCWlmIChXQVJOX09OKGlycV9jb3VudCA9PSAwKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoc3RyY21wKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSwgImRwcmMiKSA9PSAwKQotCQltY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2Rldik7Ci0JZWxzZQotCQltY19idXMgPSB0b19mc2xfbWNfYnVzKHRvX2ZzbF9tY19kZXZpY2UobWNfZGV2LT5kZXYucGFyZW50KSk7Ci0KLQlpZiAoV0FSTl9PTighbWNfYnVzLT5pcnFfcmVzb3VyY2VzKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXNfcG9vbCA9ICZtY19idXMtPnJlc291cmNlX3Bvb2xzW0ZTTF9NQ19QT09MX0lSUV07Ci0JaWYgKHJlc19wb29sLT5mcmVlX2NvdW50IDwgaXJxX2NvdW50KSB7Ci0JCWRldl9lcnIoJm1jX2Rldi0+ZGV2LAotCQkJIk5vdCBhYmxlIHRvIGFsbG9jYXRlICV1IGlycXMgZm9yIGRldmljZVxuIiwgaXJxX2NvdW50KTsKLQkJcmV0dXJuIC1FTk9TUEM7Ci0JfQotCi0JaXJxcyA9IGRldm1fa3phbGxvYygmbWNfZGV2LT5kZXYsIGlycV9jb3VudCAqIHNpemVvZihpcnFzWzBdKSwKLQkJCSAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIWlycXMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZm9yIChpID0gMDsgaSA8IGlycV9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlOwotCi0JCWVycm9yID0gZnNsX21jX3Jlc291cmNlX2FsbG9jYXRlKG1jX2J1cywgRlNMX01DX1BPT0xfSVJRLAotCQkJCQkJICZyZXNvdXJjZSk7Ci0JCWlmIChlcnJvciA8IDApCi0JCQlnb3RvIGVycm9yX3Jlc291cmNlX2FsbG9jOwotCi0JCWlycXNbaV0gPSB0b19mc2xfbWNfaXJxKHJlc291cmNlKTsKLQkJcmVzX2FsbG9jYXRlZF9jb3VudCsrOwotCi0JCVdBUk5fT04oaXJxc1tpXS0+bWNfZGV2KTsKLQkJaXJxc1tpXS0+bWNfZGV2ID0gbWNfZGV2OwotCQlpcnFzW2ldLT5kZXZfaXJxX2luZGV4ID0gaTsKLQl9Ci0KLQltY19kZXYtPmlycXMgPSBpcnFzOwotCXJldHVybiAwOwotCi1lcnJvcl9yZXNvdXJjZV9hbGxvYzoKLQlmb3IgKGkgPSAwOyBpIDwgcmVzX2FsbG9jYXRlZF9jb3VudDsgaSsrKSB7Ci0JCWlycXNbaV0tPm1jX2RldiA9IE5VTEw7Ci0JCWZzbF9tY19yZXNvdXJjZV9mcmVlKCZpcnFzW2ldLT5yZXNvdXJjZSk7Ci0JfQotCi0JcmV0dXJuIGVycm9yOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX2FsbG9jYXRlX2lycXMpOwotCi0vKgotICogSXQgZnJlZXMgdGhlIElSUXMgdGhhdCB3ZXJlIGFsbG9jYXRlZCBmb3IgYSBNQyBvYmplY3QgZGV2aWNlLCBieQotICogcmV0dXJuaW5nIHRoZW0gdG8gdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0IHBvb2wuCi0gKi8KLXZvaWQgZnNsX21jX2ZyZWVfaXJxcyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2KQotewotCWludCBpOwotCWludCBpcnFfY291bnQ7Ci0Jc3RydWN0IGZzbF9tY19idXMgKm1jX2J1czsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZV9pcnEgKippcnFzID0gbWNfZGV2LT5pcnFzOwotCi0JaWYgKFdBUk5fT04oIWlycXMpKQotCQlyZXR1cm47Ci0KLQlpcnFfY291bnQgPSBtY19kZXYtPm9ial9kZXNjLmlycV9jb3VudDsKLQotCWlmIChzdHJjbXAobWNfZGV2LT5vYmpfZGVzYy50eXBlLCAiZHByYyIpID09IDApCi0JCW1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfZGV2KTsKLQllbHNlCi0JCW1jX2J1cyA9IHRvX2ZzbF9tY19idXModG9fZnNsX21jX2RldmljZShtY19kZXYtPmRldi5wYXJlbnQpKTsKLQotCWlmIChXQVJOX09OKCFtY19idXMtPmlycV9yZXNvdXJjZXMpKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaXJxX2NvdW50OyBpKyspIHsKLQkJV0FSTl9PTighaXJxc1tpXS0+bWNfZGV2KTsKLQkJaXJxc1tpXS0+bWNfZGV2ID0gTlVMTDsKLQkJZnNsX21jX3Jlc291cmNlX2ZyZWUoJmlycXNbaV0tPnJlc291cmNlKTsKLQl9Ci0KLQltY19kZXYtPmlycXMgPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX2ZyZWVfaXJxcyk7Ci0KLS8qKgotICogZnNsX21jX2FsbG9jYXRvcl9wcm9iZSAtIGNhbGxiYWNrIGludm9rZWQgd2hlbiBhbiBhbGxvY2F0YWJsZSBkZXZpY2UgaXMKLSAqIGJlaW5nIGFkZGVkIHRvIHRoZSBzeXN0ZW0KLSAqLwotc3RhdGljIGludCBmc2xfbWNfYWxsb2NhdG9yX3Byb2JlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYpCi17Ci0JZW51bSBmc2xfbWNfcG9vbF90eXBlIHBvb2xfdHlwZTsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldjsKLQlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzOwotCWludCBlcnJvcjsKLQotCWlmIChXQVJOX09OKCFGU0xfTUNfSVNfQUxMT0NBVEFCTEUobWNfZGV2LT5vYmpfZGVzYy50eXBlKSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWNfYnVzX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UobWNfZGV2LT5kZXYucGFyZW50KTsKLQlpZiAoV0FSTl9PTihtY19idXNfZGV2LT5kZXYuYnVzICE9ICZmc2xfbWNfYnVzX3R5cGUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfYnVzX2Rldik7Ci0JZXJyb3IgPSBvYmplY3RfdHlwZV90b19wb29sX3R5cGUobWNfZGV2LT5vYmpfZGVzYy50eXBlLCAmcG9vbF90eXBlKTsKLQlpZiAoZXJyb3IgPCAwKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQllcnJvciA9IGZzbF9tY19yZXNvdXJjZV9wb29sX2FkZF9kZXZpY2UobWNfYnVzLCBwb29sX3R5cGUsIG1jX2Rldik7Ci0JaWYgKGVycm9yIDwgMCkKLQkJcmV0dXJuIGVycm9yOwotCi0JZGV2X2RiZygmbWNfZGV2LT5kZXYsCi0JCSJBbGxvY2F0YWJsZSBNQyBvYmplY3QgZGV2aWNlIGJvdW5kIHRvIGZzbF9tY19hbGxvY2F0b3IgZHJpdmVyIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogZnNsX21jX2FsbG9jYXRvcl9yZW1vdmUgLSBjYWxsYmFjayBpbnZva2VkIHdoZW4gYW4gYWxsb2NhdGFibGUgZGV2aWNlIGlzCi0gKiBiZWluZyByZW1vdmVkIGZyb20gdGhlIHN5c3RlbQotICovCi1zdGF0aWMgaW50IGZzbF9tY19hbGxvY2F0b3JfcmVtb3ZlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYpCi17Ci0JaW50IGVycm9yOwotCi0JaWYgKFdBUk5fT04oIUZTTF9NQ19JU19BTExPQ0FUQUJMRShtY19kZXYtPm9ial9kZXNjLnR5cGUpKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAobWNfZGV2LT5yZXNvdXJjZSkgewotCQllcnJvciA9IGZzbF9tY19yZXNvdXJjZV9wb29sX3JlbW92ZV9kZXZpY2UobWNfZGV2KTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlkZXZfZGJnKCZtY19kZXYtPmRldiwKLQkJIkFsbG9jYXRhYmxlIE1DIG9iamVjdCBkZXZpY2UgdW5ib3VuZCBmcm9tIGZzbF9tY19hbGxvY2F0b3IgZHJpdmVyIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZnNsX21jX2RldmljZV9pZCBtYXRjaF9pZF90YWJsZVtdID0gewotCXsKLQkgLnZlbmRvciA9IEZTTF9NQ19WRU5ET1JfRlJFRVNDQUxFLAotCSAub2JqX3R5cGUgPSAiZHBicCIsCi0JfSwKLQl7Ci0JIC52ZW5kb3IgPSBGU0xfTUNfVkVORE9SX0ZSRUVTQ0FMRSwKLQkgLm9ial90eXBlID0gImRwbWNwIiwKLQl9LAotCXsKLQkgLnZlbmRvciA9IEZTTF9NQ19WRU5ET1JfRlJFRVNDQUxFLAotCSAub2JqX3R5cGUgPSAiZHBjb24iLAotCX0sCi0Jey52ZW5kb3IgPSAweDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBmc2xfbWNfZHJpdmVyIGZzbF9tY19hbGxvY2F0b3JfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCSAgIC5uYW1lID0gImZzbF9tY19hbGxvY2F0b3IiLAotCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKLQkJICAgLnBtID0gTlVMTCwKLQkJICAgfSwKLQkubWF0Y2hfaWRfdGFibGUgPSBtYXRjaF9pZF90YWJsZSwKLQkucHJvYmUgPSBmc2xfbWNfYWxsb2NhdG9yX3Byb2JlLAotCS5yZW1vdmUgPSBmc2xfbWNfYWxsb2NhdG9yX3JlbW92ZSwKLX07Ci0KLWludCBfX2luaXQgZnNsX21jX2FsbG9jYXRvcl9kcml2ZXJfaW5pdCh2b2lkKQotewotCXJldHVybiBmc2xfbWNfZHJpdmVyX3JlZ2lzdGVyKCZmc2xfbWNfYWxsb2NhdG9yX2RyaXZlcik7Ci19Ci0KLXZvaWQgZnNsX21jX2FsbG9jYXRvcl9kcml2ZXJfZXhpdCh2b2lkKQotewotCWZzbF9tY19kcml2ZXJfdW5yZWdpc3RlcigmZnNsX21jX2FsbG9jYXRvcl9kcml2ZXIpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtYnVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9tYy1idXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzYWZkYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9tYy1idXMuYworKysgL2Rldi9udWxsCkBAIC0xLDkxMSArMCwwIEBACi0vKgotICogRnJlZXNjYWxlIE1hbmFnZW1lbnQgQ29tcGxleCAoTUMpIGJ1cyBkcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KLSAqIEF1dGhvcjogR2VybWFuIFJpdmVyYSA8R2VybWFuLlJpdmVyYUBmcmVlc2NhbGUuY29tPgotICoKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55Ci0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLQotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtcHJpdmF0ZS5oIgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbGltaXRzLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNpLmg+Ci0jaW5jbHVkZSAiLi4vaW5jbHVkZS9kcG1uZy5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCi0jaW5jbHVkZSAiZHByYy1jbWQuaCIKLQotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICptY19kZXZfY2FjaGU7Ci0KLS8qKgotICogZnNsX21jX2J1c19tYXRjaCAtIGRldmljZSB0byBkcml2ZXIgbWF0Y2hpbmcgY2FsbGJhY2sKLSAqIEBkZXY6IHRoZSBNQyBvYmplY3QgZGV2aWNlIHN0cnVjdHVyZSB0byBtYXRjaCBhZ2FpbnN0Ci0gKiBAZHJ2OiB0aGUgZGV2aWNlIGRyaXZlciB0byBzZWFyY2ggZm9yIG1hdGNoaW5nIE1DIG9iamVjdCBkZXZpY2UgaWQKLSAqIHN0cnVjdHVyZXMKLSAqCi0gKiBSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyBpbnQgZnNsX21jX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCi17Ci0JY29uc3Qgc3RydWN0IGZzbF9tY19kZXZpY2VfaWQgKmlkOwotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKGRldik7Ci0Jc3RydWN0IGZzbF9tY19kcml2ZXIgKm1jX2RydiA9IHRvX2ZzbF9tY19kcml2ZXIoZHJ2KTsKLQlib29sIGZvdW5kID0gZmFsc2U7Ci0KLQlpZiAoV0FSTl9PTighZnNsX21jX2J1c19leGlzdHMoKSkpCi0JCWdvdG8gb3V0OwotCi0JaWYgKCFtY19kcnYtPm1hdGNoX2lkX3RhYmxlKQotCQlnb3RvIG91dDsKLQotCS8qCi0JICogSWYgdGhlIG9iamVjdCBpcyBub3QgJ3BsdWdnZWQnIGRvbid0IG1hdGNoLgotCSAqIE9ubHkgZXhjZXB0aW9uIGlzIHRoZSByb290IERQUkMsIHdoaWNoIGlzIGEgc3BlY2lhbCBjYXNlLgotCSAqLwotCWlmICgobWNfZGV2LT5vYmpfZGVzYy5zdGF0ZSAmIERQUkNfT0JKX1NUQVRFX1BMVUdHRUQpID09IDAgJiYKLQkgICAgIWZzbF9tY19pc19yb290X2RwcmMoJm1jX2Rldi0+ZGV2KSkKLQkJZ290byBvdXQ7Ci0KLQkvKgotCSAqIFRyYXZlcnNlIHRoZSBtYXRjaF9pZCB0YWJsZSBvZiB0aGUgZ2l2ZW4gZHJpdmVyLCB0cnlpbmcgdG8gZmluZAotCSAqIGEgbWF0Y2hpbmcgZm9yIHRoZSBnaXZlbiBNQyBvYmplY3QgZGV2aWNlLgotCSAqLwotCWZvciAoaWQgPSBtY19kcnYtPm1hdGNoX2lkX3RhYmxlOyBpZC0+dmVuZG9yICE9IDB4MDsgaWQrKykgewotCQlpZiAoaWQtPnZlbmRvciA9PSBtY19kZXYtPm9ial9kZXNjLnZlbmRvciAmJgotCQkgICAgc3RyY21wKGlkLT5vYmpfdHlwZSwgbWNfZGV2LT5vYmpfZGVzYy50eXBlKSA9PSAwKSB7Ci0JCQlmb3VuZCA9IHRydWU7Ci0KLQkJCWJyZWFrOwotCQl9Ci0JfQotCi1vdXQ6Ci0JZGV2X2RiZyhkZXYsICIlc21hdGNoZWRcbiIsIGZvdW5kID8gIiIgOiAibm90ICIpOwotCXJldHVybiBmb3VuZDsKLX0KLQotLyoqCi0gKiBmc2xfbWNfYnVzX3VldmVudCAtIGNhbGxiYWNrIGludm9rZWQgd2hlbiBhIGRldmljZSBpcyBhZGRlZAotICovCi1zdGF0aWMgaW50IGZzbF9tY19idXNfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQotewotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKGRldik7Ci0KLQlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiTU9EQUxJQVM9ZnNsLW1jOnYlMDhYZCVzIiwKLQkJCSAgIG1jX2Rldi0+b2JqX2Rlc2MudmVuZG9yLAotCQkJICAgbWNfZGV2LT5vYmpfZGVzYy50eXBlKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgbW9kYWxpYXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UoZGV2KTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgImZzbC1tYzp2JTA4WGQlc1xuIiwgbWNfZGV2LT5vYmpfZGVzYy52ZW5kb3IsCi0JCSAgICAgICBtY19kZXYtPm9ial9kZXNjLnR5cGUpOwotfQotc3RhdGljIERFVklDRV9BVFRSX1JPKG1vZGFsaWFzKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmZzbF9tY19kZXZfYXR0cnNbXSA9IHsKLQkmZGV2X2F0dHJfbW9kYWxpYXMuYXR0ciwKLQlOVUxMLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZnNsX21jX2Rldl9ncm91cCA9IHsKLQkuYXR0cnMgPSBmc2xfbWNfZGV2X2F0dHJzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmZzbF9tY19kZXZfZ3JvdXBzW10gPSB7Ci0JJmZzbF9tY19kZXZfZ3JvdXAsCi0JTlVMTCwKLX07Ci0KLXN0cnVjdCBidXNfdHlwZSBmc2xfbWNfYnVzX3R5cGUgPSB7Ci0JLm5hbWUgPSAiZnNsLW1jIiwKLQkubWF0Y2ggPSBmc2xfbWNfYnVzX21hdGNoLAotCS51ZXZlbnQgPSBmc2xfbWNfYnVzX3VldmVudCwKLQkuZGV2X2dyb3VwcyA9IGZzbF9tY19kZXZfZ3JvdXBzLAotfTsKLUVYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19idXNfdHlwZSk7Ci0KLXN0YXRpYyBhdG9taWNfdCByb290X2RwcmNfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKLQotc3RhdGljIGludCBmc2xfbWNfZHJpdmVyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZnNsX21jX2RyaXZlciAqbWNfZHJ2OwotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKGRldik7Ci0JaW50IGVycm9yOwotCi0JaWYgKFdBUk5fT04oIWRldi0+ZHJpdmVyKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltY19kcnYgPSB0b19mc2xfbWNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAoV0FSTl9PTighbWNfZHJ2LT5wcm9iZSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZXJyb3IgPSBtY19kcnYtPnByb2JlKG1jX2Rldik7Ci0JaWYgKGVycm9yIDwgMCkgewotCQlkZXZfZXJyKGRldiwgIk1DIG9iamVjdCBkZXZpY2UgcHJvYmUgY2FsbGJhY2sgZmFpbGVkOiAlZFxuIiwKLQkJCWVycm9yKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZzbF9tY19kcml2ZXJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZnNsX21jX2RyaXZlciAqbWNfZHJ2ID0gdG9fZnNsX21jX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UoZGV2KTsKLQlpbnQgZXJyb3I7Ci0KLQlpZiAoV0FSTl9PTighZGV2LT5kcml2ZXIpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWVycm9yID0gbWNfZHJ2LT5yZW1vdmUobWNfZGV2KTsKLQlpZiAoZXJyb3IgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LAotCQkJIk1DIG9iamVjdCBkZXZpY2UgcmVtb3ZlIGNhbGxiYWNrIGZhaWxlZDogJWRcbiIsCi0JCQllcnJvcik7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZnNsX21jX2RyaXZlcl9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGZzbF9tY19kcml2ZXIgKm1jX2RydiA9IHRvX2ZzbF9tY19kcml2ZXIoZGV2LT5kcml2ZXIpOwotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKGRldik7Ci0KLQltY19kcnYtPnNodXRkb3duKG1jX2Rldik7Ci19Ci0KLS8qKgotICogX19mc2xfbWNfZHJpdmVyX3JlZ2lzdGVyIC0gcmVnaXN0ZXJzIGEgY2hpbGQgZGV2aWNlIGRyaXZlciB3aXRoIHRoZQotICogTUMgYnVzCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbXBsaWNpdGx5IGludm9rZWQgZnJvbSB0aGUgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIG9mCi0gKiBmc2xfbWMgZGV2aWNlIGRyaXZlcnMsIHdoaWNoIGlzIGdlbmVyYXRlZCBieSB0aGUKLSAqIG1vZHVsZV9mc2xfbWNfZHJpdmVyKCkgbWFjcm8uCi0gKi8KLWludCBfX2ZzbF9tY19kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGZzbF9tY19kcml2ZXIgKm1jX2RyaXZlciwKLQkJCSAgICAgc3RydWN0IG1vZHVsZSAqb3duZXIpCi17Ci0JaW50IGVycm9yOwotCi0JbWNfZHJpdmVyLT5kcml2ZXIub3duZXIgPSBvd25lcjsKLQltY19kcml2ZXItPmRyaXZlci5idXMgPSAmZnNsX21jX2J1c190eXBlOwotCi0JaWYgKG1jX2RyaXZlci0+cHJvYmUpCi0JCW1jX2RyaXZlci0+ZHJpdmVyLnByb2JlID0gZnNsX21jX2RyaXZlcl9wcm9iZTsKLQotCWlmIChtY19kcml2ZXItPnJlbW92ZSkKLQkJbWNfZHJpdmVyLT5kcml2ZXIucmVtb3ZlID0gZnNsX21jX2RyaXZlcl9yZW1vdmU7Ci0KLQlpZiAobWNfZHJpdmVyLT5zaHV0ZG93bikKLQkJbWNfZHJpdmVyLT5kcml2ZXIuc2h1dGRvd24gPSBmc2xfbWNfZHJpdmVyX3NodXRkb3duOwotCi0JZXJyb3IgPSBkcml2ZXJfcmVnaXN0ZXIoJm1jX2RyaXZlci0+ZHJpdmVyKTsKLQlpZiAoZXJyb3IgPCAwKSB7Ci0JCXByX2VycigiZHJpdmVyX3JlZ2lzdGVyKCkgZmFpbGVkIGZvciAlczogJWRcbiIsCi0JCSAgICAgICBtY19kcml2ZXItPmRyaXZlci5uYW1lLCBlcnJvcik7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlwcl9pbmZvKCJNQyBvYmplY3QgZGV2aWNlIGRyaXZlciAlcyByZWdpc3RlcmVkXG4iLAotCQltY19kcml2ZXItPmRyaXZlci5uYW1lKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKF9fZnNsX21jX2RyaXZlcl9yZWdpc3Rlcik7Ci0KLS8qKgotICogZnNsX21jX2RyaXZlcl91bnJlZ2lzdGVyIC0gdW5yZWdpc3RlcnMgYSBkZXZpY2UgZHJpdmVyIGZyb20gdGhlCi0gKiBNQyBidXMKLSAqLwotdm9pZCBmc2xfbWNfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IGZzbF9tY19kcml2ZXIgKm1jX2RyaXZlcikKLXsKLQlkcml2ZXJfdW5yZWdpc3RlcigmbWNfZHJpdmVyLT5kcml2ZXIpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX2RyaXZlcl91bnJlZ2lzdGVyKTsKLQotLyoqCi0gKiBmc2xfbWNfYnVzX2V4aXN0cyAtIGNoZWNrIGlmIGEgcm9vdCBkcHJjIGV4aXN0cwotICovCi1ib29sIGZzbF9tY19idXNfZXhpc3RzKHZvaWQpCi17Ci0JcmV0dXJuIGF0b21pY19yZWFkKCZyb290X2RwcmNfY291bnQpID4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19idXNfZXhpc3RzKTsKLQotLyoqCi0qIGZzbF9tY19nZXRfcm9vdF9kcHJjIC0gZnVuY3Rpb24gdG8gdHJhdmVyc2UgdG8gdGhlIHJvb3QgZHByYwotKi8KLXN0YXRpYyB2b2lkIGZzbF9tY19nZXRfcm9vdF9kcHJjKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGRldmljZSAqKnJvb3RfZHByY19kZXYpCi17Ci0JaWYgKFdBUk5fT04oIWRldikpIHsKLQkJKnJvb3RfZHByY19kZXYgPSBOVUxMOwotCX0gZWxzZSBpZiAoV0FSTl9PTihkZXYtPmJ1cyAhPSAmZnNsX21jX2J1c190eXBlKSkgewotCQkqcm9vdF9kcHJjX2RldiA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJKnJvb3RfZHByY19kZXYgPSBkZXY7Ci0JCXdoaWxlICgoKnJvb3RfZHByY19kZXYpLT5wYXJlbnQtPmJ1cyA9PSAmZnNsX21jX2J1c190eXBlKQotCQkJKnJvb3RfZHByY19kZXYgPSAoKnJvb3RfZHByY19kZXYpLT5wYXJlbnQ7Ci0JfQotfQotCi1zdGF0aWMgaW50IGdldF9kcHJjX2F0dHIoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCi0JCQkgaW50IGNvbnRhaW5lcl9pZCwgc3RydWN0IGRwcmNfYXR0cmlidXRlcyAqYXR0cikKLXsKLQl1MTYgZHByY19oYW5kbGU7Ci0JaW50IGVycm9yOwotCi0JZXJyb3IgPSBkcHJjX29wZW4obWNfaW8sIDAsIGNvbnRhaW5lcl9pZCwgJmRwcmNfaGFuZGxlKTsKLQlpZiAoZXJyb3IgPCAwKSB7Ci0JCWRldl9lcnIobWNfaW8tPmRldiwgImRwcmNfb3BlbigpIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCW1lbXNldChhdHRyLCAwLCBzaXplb2Yoc3RydWN0IGRwcmNfYXR0cmlidXRlcykpOwotCWVycm9yID0gZHByY19nZXRfYXR0cmlidXRlcyhtY19pbywgMCwgZHByY19oYW5kbGUsIGF0dHIpOwotCWlmIChlcnJvciA8IDApIHsKLQkJZGV2X2VycihtY19pby0+ZGV2LCAiZHByY19nZXRfYXR0cmlidXRlcygpIGZhaWxlZDogJWRcbiIsCi0JCQllcnJvcik7Ci0JCWdvdG8gY29tbW9uX2NsZWFudXA7Ci0JfQotCi0JZXJyb3IgPSAwOwotCi1jb21tb25fY2xlYW51cDoKLQkodm9pZClkcHJjX2Nsb3NlKG1jX2lvLCAwLCBkcHJjX2hhbmRsZSk7Ci0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgaW50IGdldF9kcHJjX2ljaWQoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCi0JCQkgaW50IGNvbnRhaW5lcl9pZCwgdTE2ICppY2lkKQotewotCXN0cnVjdCBkcHJjX2F0dHJpYnV0ZXMgYXR0cjsKLQlpbnQgZXJyb3I7Ci0KLQllcnJvciA9IGdldF9kcHJjX2F0dHIobWNfaW8sIGNvbnRhaW5lcl9pZCwgJmF0dHIpOwotCWlmIChlcnJvciA9PSAwKQotCQkqaWNpZCA9IGF0dHIuaWNpZDsKLQotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIGludCBnZXRfZHByY192ZXJzaW9uKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAotCQkJICAgIGludCBjb250YWluZXJfaWQsIHUxNiAqbWFqb3IsIHUxNiAqbWlub3IpCi17Ci0Jc3RydWN0IGRwcmNfYXR0cmlidXRlcyBhdHRyOwotCWludCBlcnJvcjsKLQotCWVycm9yID0gZ2V0X2RwcmNfYXR0cihtY19pbywgY29udGFpbmVyX2lkLCAmYXR0cik7Ci0JaWYgKGVycm9yID09IDApIHsKLQkJKm1ham9yID0gYXR0ci52ZXJzaW9uLm1ham9yOwotCQkqbWlub3IgPSBhdHRyLnZlcnNpb24ubWlub3I7Ci0JfQotCi0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgaW50IHRyYW5zbGF0ZV9tY19hZGRyKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYsCi0JCQkgICAgIGVudW0gZHByY19yZWdpb25fdHlwZSBtY19yZWdpb25fdHlwZSwKLQkJCSAgICAgdTY0IG1jX29mZnNldCwgcGh5c19hZGRyX3QgKnBoeXNfYWRkcikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgZGV2aWNlICpyb290X2RwcmNfZGV2OwotCXN0cnVjdCBmc2xfbWMgKm1jOwotCi0JZnNsX21jX2dldF9yb290X2RwcmMoJm1jX2Rldi0+ZGV2LCAmcm9vdF9kcHJjX2Rldik7Ci0JaWYgKFdBUk5fT04oIXJvb3RfZHByY19kZXYpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQltYyA9IGRldl9nZXRfZHJ2ZGF0YShyb290X2RwcmNfZGV2LT5wYXJlbnQpOwotCi0JaWYgKG1jLT5udW1fdHJhbnNsYXRpb25fcmFuZ2VzID09IDApIHsKLQkJLyoKLQkJICogRG8gaWRlbnRpdHkgbWFwcGluZzoKLQkJICovCi0JCSpwaHlzX2FkZHIgPSBtY19vZmZzZXQ7Ci0JCXJldHVybiAwOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBtYy0+bnVtX3RyYW5zbGF0aW9uX3JhbmdlczsgaSsrKSB7Ci0JCXN0cnVjdCBmc2xfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZSAqcmFuZ2UgPQotCQkJJm1jLT50cmFuc2xhdGlvbl9yYW5nZXNbaV07Ci0KLQkJaWYgKG1jX3JlZ2lvbl90eXBlID09IHJhbmdlLT5tY19yZWdpb25fdHlwZSAmJgotCQkgICAgbWNfb2Zmc2V0ID49IHJhbmdlLT5zdGFydF9tY19vZmZzZXQgJiYKLQkJICAgIG1jX29mZnNldCA8IHJhbmdlLT5lbmRfbWNfb2Zmc2V0KSB7Ci0JCQkqcGh5c19hZGRyID0gcmFuZ2UtPnN0YXJ0X3BoeXNfYWRkciArCi0JCQkJICAgICAobWNfb2Zmc2V0IC0gcmFuZ2UtPnN0YXJ0X21jX29mZnNldCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXJldHVybiAtRUZBVUxUOwotfQotCi1zdGF0aWMgaW50IGZzbF9tY19kZXZpY2VfZ2V0X21taW9fcmVnaW9ucyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2LAotCQkJCQkgIHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2KQotewotCWludCBpOwotCWludCBlcnJvcjsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ2lvbnM7Ci0Jc3RydWN0IGRwcmNfb2JqX2Rlc2MgKm9ial9kZXNjID0gJm1jX2Rldi0+b2JqX2Rlc2M7Ci0Jc3RydWN0IGRldmljZSAqcGFyZW50X2RldiA9IG1jX2Rldi0+ZGV2LnBhcmVudDsKLQllbnVtIGRwcmNfcmVnaW9uX3R5cGUgbWNfcmVnaW9uX3R5cGU7Ci0KLQlpZiAoc3RyY21wKG9ial9kZXNjLT50eXBlLCAiZHByYyIpID09IDAgfHwKLQkgICAgc3RyY21wKG9ial9kZXNjLT50eXBlLCAiZHBtY3AiKSA9PSAwKSB7Ci0JCW1jX3JlZ2lvbl90eXBlID0gRFBSQ19SRUdJT05fVFlQRV9NQ19QT1JUQUw7Ci0JfSBlbHNlIGlmIChzdHJjbXAob2JqX2Rlc2MtPnR5cGUsICJkcGlvIikgPT0gMCkgewotCQltY19yZWdpb25fdHlwZSA9IERQUkNfUkVHSU9OX1RZUEVfUUJNQU5fUE9SVEFMOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIE1DIG9iamVjdAotCQkgKiB0eXBlLCBhcyB0aGlzIG9iamVjdCB0eXBlIGlzIG5vdCBzdXBwb3NlZCB0byBoYXZlIE1NSU8KLQkJICogcmVnaW9ucwotCQkgKi8KLQkJV0FSTl9PTih0cnVlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmVnaW9ucyA9IGttYWxsb2NfYXJyYXkob2JqX2Rlc2MtPnJlZ2lvbl9jb3VudCwKLQkJCQlzaXplb2YocmVnaW9uc1swXSksIEdGUF9LRVJORUwpOwotCWlmICghcmVnaW9ucykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgb2JqX2Rlc2MtPnJlZ2lvbl9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBkcHJjX3JlZ2lvbl9kZXNjIHJlZ2lvbl9kZXNjOwotCi0JCWVycm9yID0gZHByY19nZXRfb2JqX3JlZ2lvbihtY19idXNfZGV2LT5tY19pbywKLQkJCQkJICAgIDAsCi0JCQkJCSAgICBtY19idXNfZGV2LT5tY19oYW5kbGUsCi0JCQkJCSAgICBvYmpfZGVzYy0+dHlwZSwKLQkJCQkJICAgIG9ial9kZXNjLT5pZCwgaSwgJnJlZ2lvbl9kZXNjKTsKLQkJaWYgKGVycm9yIDwgMCkgewotCQkJZGV2X2VycihwYXJlbnRfZGV2LAotCQkJCSJkcHJjX2dldF9vYmpfcmVnaW9uKCkgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOwotCQkJZ290byBlcnJvcl9jbGVhbnVwX3JlZ2lvbnM7Ci0JCX0KLQotCQlXQVJOX09OKHJlZ2lvbl9kZXNjLnNpemUgPT0gMCk7Ci0JCWVycm9yID0gdHJhbnNsYXRlX21jX2FkZHIobWNfZGV2LCBtY19yZWdpb25fdHlwZSwKLQkJCQkJICByZWdpb25fZGVzYy5iYXNlX29mZnNldCwKLQkJCQkJICAmcmVnaW9uc1tpXS5zdGFydCk7Ci0JCWlmIChlcnJvciA8IDApIHsKLQkJCWRldl9lcnIocGFyZW50X2RldiwKLQkJCQkiSW52YWxpZCBNQyBvZmZzZXQ6ICUjeCAoZm9yICVzLiVkXCdzIHJlZ2lvbiAlZClcbiIsCi0JCQkJcmVnaW9uX2Rlc2MuYmFzZV9vZmZzZXQsCi0JCQkJb2JqX2Rlc2MtPnR5cGUsIG9ial9kZXNjLT5pZCwgaSk7Ci0JCQlnb3RvIGVycm9yX2NsZWFudXBfcmVnaW9uczsKLQkJfQotCi0JCXJlZ2lvbnNbaV0uZW5kID0gcmVnaW9uc1tpXS5zdGFydCArIHJlZ2lvbl9kZXNjLnNpemUgLSAxOwotCQlyZWdpb25zW2ldLm5hbWUgPSAiZnNsLW1jIG9iamVjdCBNTUlPIHJlZ2lvbiI7Ci0JCXJlZ2lvbnNbaV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwotCQlpZiAocmVnaW9uX2Rlc2MuZmxhZ3MgJiBEUFJDX1JFR0lPTl9DQUNIRUFCTEUpCi0JCQlyZWdpb25zW2ldLmZsYWdzIHw9IElPUkVTT1VSQ0VfQ0FDSEVBQkxFOwotCX0KLQotCW1jX2Rldi0+cmVnaW9ucyA9IHJlZ2lvbnM7Ci0JcmV0dXJuIDA7Ci0KLWVycm9yX2NsZWFudXBfcmVnaW9uczoKLQlrZnJlZShyZWdpb25zKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qKgotICogZnNsX21jX2lzX3Jvb3RfZHByYyAtIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgZ2l2ZW4gZGV2aWNlIGlzIGEgcm9vdCBkcHJjCi0gKi8KLWJvb2wgZnNsX21jX2lzX3Jvb3RfZHByYyhzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGRldmljZSAqcm9vdF9kcHJjX2RldjsKLQotCWZzbF9tY19nZXRfcm9vdF9kcHJjKGRldiwgJnJvb3RfZHByY19kZXYpOwotCWlmICghcm9vdF9kcHJjX2RldikKLQkJcmV0dXJuIGZhbHNlOwotCXJldHVybiBkZXYgPT0gcm9vdF9kcHJjX2RldjsKLX0KLQotLyoqCi0gKiBBZGQgYSBuZXdseSBkaXNjb3ZlcmVkIE1DIG9iamVjdCBkZXZpY2UgdG8gYmUgdmlzaWJsZSBpbiBMaW51eAotICovCi1pbnQgZnNsX21jX2RldmljZV9hZGQoc3RydWN0IGRwcmNfb2JqX2Rlc2MgKm9ial9kZXNjLAotCQkgICAgICBzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKLQkJICAgICAgc3RydWN0IGRldmljZSAqcGFyZW50X2RldiwKLQkJICAgICAgc3RydWN0IGZzbF9tY19kZXZpY2UgKipuZXdfbWNfZGV2KQotewotCWludCBlcnJvcjsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzID0gTlVMTDsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqcGFyZW50X21jX2RldjsKLQotCWlmIChwYXJlbnRfZGV2LT5idXMgPT0gJmZzbF9tY19idXNfdHlwZSkKLQkJcGFyZW50X21jX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UocGFyZW50X2Rldik7Ci0JZWxzZQotCQlwYXJlbnRfbWNfZGV2ID0gTlVMTDsKLQotCWlmIChzdHJjbXAob2JqX2Rlc2MtPnR5cGUsICJkcHJjIikgPT0gMCkgewotCQkvKgotCQkgKiBBbGxvY2F0ZSBhbiBNQyBidXMgZGV2aWNlIG9iamVjdDoKLQkJICovCi0JCW1jX2J1cyA9IGRldm1fa3phbGxvYyhwYXJlbnRfZGV2LCBzaXplb2YoKm1jX2J1cyksIEdGUF9LRVJORUwpOwotCQlpZiAoIW1jX2J1cykKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCW1jX2RldiA9ICZtY19idXMtPm1jX2RldjsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBBbGxvY2F0ZSBhIHJlZ3VsYXIgZnNsX21jX2RldmljZSBvYmplY3Q6Ci0JCSAqLwotCQltY19kZXYgPSBrbWVtX2NhY2hlX3phbGxvYyhtY19kZXZfY2FjaGUsIEdGUF9LRVJORUwpOwotCQlpZiAoIW1jX2RldikKLQkJCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW1jX2Rldi0+b2JqX2Rlc2MgPSAqb2JqX2Rlc2M7Ci0JbWNfZGV2LT5tY19pbyA9IG1jX2lvOwotCWRldmljZV9pbml0aWFsaXplKCZtY19kZXYtPmRldik7Ci0JbWNfZGV2LT5kZXYucGFyZW50ID0gcGFyZW50X2RldjsKLQltY19kZXYtPmRldi5idXMgPSAmZnNsX21jX2J1c190eXBlOwotCWRldl9zZXRfbmFtZSgmbWNfZGV2LT5kZXYsICIlcy4lZCIsIG9ial9kZXNjLT50eXBlLCBvYmpfZGVzYy0+aWQpOwotCi0JaWYgKHN0cmNtcChvYmpfZGVzYy0+dHlwZSwgImRwcmMiKSA9PSAwKSB7Ci0JCXN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvMjsKLQotCQltY19kZXYtPmZsYWdzIHw9IEZTTF9NQ19JU19EUFJDOwotCi0JCS8qCi0JCSAqIFRvIGdldCB0aGUgRFBSQydzIElDSUQsIHdlIG5lZWQgdG8gb3BlbiB0aGUgRFBSQwotCQkgKiBpbiBnZXRfZHByY19pY2lkKCkuIEZvciBjaGlsZCBEUFJDcywgd2UgZG8gc28gdXNpbmcgdGhlCi0JCSAqIHBhcmVudCBEUFJDJ3MgTUMgcG9ydGFsIGluc3RlYWQgb2YgdGhlIGNoaWxkIERQUkMncyBNQwotCQkgKiBwb3J0YWwsIGluIGNhc2UgdGhlIGNoaWxkIERQUkMgaXMgYWxyZWFkeSBvcGVuZWQgd2l0aAotCQkgKiBpdHMgb3duIHBvcnRhbCAoZS5nLiwgdGhlIERQUkMgdXNlZCBieSBBSU9QKS4KLQkJICoKLQkJICogTk9URTogVGhlcmUgY2Fubm90IGJlIG1vcmUgdGhhbiBvbmUgYWN0aXZlIG9wZW4gZm9yIGEKLQkJICogZ2l2ZW4gTUMgb2JqZWN0LCB1c2luZyB0aGUgc2FtZSBNQyBwb3J0YWwuCi0JCSAqLwotCQlpZiAocGFyZW50X21jX2RldikgewotCQkJLyoKLQkJCSAqIGRldmljZSBiZWluZyBhZGRlZCBpcyBhIGNoaWxkIERQUkMgZGV2aWNlCi0JCQkgKi8KLQkJCW1jX2lvMiA9IHBhcmVudF9tY19kZXYtPm1jX2lvOwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIGRldmljZSBiZWluZyBhZGRlZCBpcyB0aGUgcm9vdCBEUFJDIGRldmljZQotCQkJICovCi0JCQlpZiAoV0FSTl9PTighbWNfaW8pKSB7Ci0JCQkJZXJyb3IgPSAtRUlOVkFMOwotCQkJCWdvdG8gZXJyb3JfY2xlYW51cF9kZXY7Ci0JCQl9Ci0KLQkJCW1jX2lvMiA9IG1jX2lvOwotCi0JCQlhdG9taWNfaW5jKCZyb290X2RwcmNfY291bnQpOwotCQl9Ci0KLQkJZXJyb3IgPSBnZXRfZHByY19pY2lkKG1jX2lvMiwgb2JqX2Rlc2MtPmlkLCAmbWNfZGV2LT5pY2lkKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gZXJyb3JfY2xlYW51cF9kZXY7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogQSBub24tRFBSQyBNQyBvYmplY3QgZGV2aWNlIGhhcyB0byBiZSBhIGNoaWxkIG9mIGFub3RoZXIKLQkJICogTUMgb2JqZWN0IChzcGVjaWZpY2FsbHkgYSBEUFJDIG9iamVjdCkKLQkJICovCi0JCW1jX2Rldi0+aWNpZCA9IHBhcmVudF9tY19kZXYtPmljaWQ7Ci0JCW1jX2Rldi0+ZG1hX21hc2sgPSBGU0xfTUNfREVGQVVMVF9ETUFfTUFTSzsKLQkJbWNfZGV2LT5kZXYuZG1hX21hc2sgPSAmbWNfZGV2LT5kbWFfbWFzazsKLQkJZGV2X3NldF9tc2lfZG9tYWluKCZtY19kZXYtPmRldiwKLQkJCQkgICBkZXZfZ2V0X21zaV9kb21haW4oJnBhcmVudF9tY19kZXYtPmRldikpOwotCX0KLQotCS8qCi0JICogR2V0IE1NSU8gcmVnaW9ucyBmb3IgdGhlIGRldmljZSBmcm9tIHRoZSBNQzoKLQkgKgotCSAqIE5PVEU6IHRoZSByb290IERQUkMgaXMgYSBzcGVjaWFsIGNhc2UgYXMgaXRzIE1NSU8gcmVnaW9uIGlzCi0JICogb2J0YWluZWQgZnJvbSB0aGUgZGV2aWNlIHRyZWUKLQkgKi8KLQlpZiAocGFyZW50X21jX2RldiAmJiBvYmpfZGVzYy0+cmVnaW9uX2NvdW50ICE9IDApIHsKLQkJZXJyb3IgPSBmc2xfbWNfZGV2aWNlX2dldF9tbWlvX3JlZ2lvbnMobWNfZGV2LAotCQkJCQkJICAgICAgIHBhcmVudF9tY19kZXYpOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJZ290byBlcnJvcl9jbGVhbnVwX2RldjsKLQl9Ci0KLQkvKiBPYmplY3RzIGFyZSBjb2hlcmVudCwgdW5sZXNzICdubyBzaGFyZWFiaWxpdHknIGZsYWcgc2V0LiAqLwotCWlmICghKG9ial9kZXNjLT5mbGFncyAmIERQUkNfT0JKX0ZMQUdfTk9fTUVNX1NIQVJFQUJJTElUWSkpCi0JCWFyY2hfc2V0dXBfZG1hX29wcygmbWNfZGV2LT5kZXYsIDAsIDAsIE5VTEwsIHRydWUpOwotCi0JLyoKLQkgKiBUaGUgZGV2aWNlLXNwZWNpZmljIHByb2JlIGNhbGxiYWNrIHdpbGwgZ2V0IGludm9rZWQgYnkgZGV2aWNlX2FkZCgpCi0JICovCi0JZXJyb3IgPSBkZXZpY2VfYWRkKCZtY19kZXYtPmRldik7Ci0JaWYgKGVycm9yIDwgMCkgewotCQlkZXZfZXJyKHBhcmVudF9kZXYsCi0JCQkiZGV2aWNlX2FkZCgpIGZhaWxlZCBmb3IgZGV2aWNlICVzOiAlZFxuIiwKLQkJCWRldl9uYW1lKCZtY19kZXYtPmRldiksIGVycm9yKTsKLQkJZ290byBlcnJvcl9jbGVhbnVwX2RldjsKLQl9Ci0KLQkodm9pZClnZXRfZGV2aWNlKCZtY19kZXYtPmRldik7Ci0JZGV2X2RiZyhwYXJlbnRfZGV2LCAiQWRkZWQgTUMgb2JqZWN0IGRldmljZSAlc1xuIiwKLQkJZGV2X25hbWUoJm1jX2Rldi0+ZGV2KSk7Ci0KLQkqbmV3X21jX2RldiA9IG1jX2RldjsKLQlyZXR1cm4gMDsKLQotZXJyb3JfY2xlYW51cF9kZXY6Ci0Ja2ZyZWUobWNfZGV2LT5yZWdpb25zKTsKLQlpZiAobWNfYnVzKQotCQlkZXZtX2tmcmVlKHBhcmVudF9kZXYsIG1jX2J1cyk7Ci0JZWxzZQotCQlrbWVtX2NhY2hlX2ZyZWUobWNfZGV2X2NhY2hlLCBtY19kZXYpOwotCi0JcmV0dXJuIGVycm9yOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX2RldmljZV9hZGQpOwotCi0vKioKLSAqIGZzbF9tY19kZXZpY2VfcmVtb3ZlIC0gUmVtb3ZlIGEgTUMgb2JqZWN0IGRldmljZSBmcm9tIGJlaW5nIHZpc2libGUgdG8KLSAqIExpbnV4Ci0gKgotICogQG1jX2RldjogUG9pbnRlciB0byBhIE1DIG9iamVjdCBkZXZpY2Ugb2JqZWN0Ci0gKi8KLXZvaWQgZnNsX21jX2RldmljZV9yZW1vdmUoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldikKLXsKLQlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzID0gTlVMTDsKLQotCWtmcmVlKG1jX2Rldi0+cmVnaW9ucyk7Ci0KLQkvKgotCSAqIFRoZSBkZXZpY2Utc3BlY2lmaWMgcmVtb3ZlIGNhbGxiYWNrIHdpbGwgZ2V0IGludm9rZWQgYnkgZGV2aWNlX2RlbCgpCi0JICovCi0JZGV2aWNlX2RlbCgmbWNfZGV2LT5kZXYpOwotCXB1dF9kZXZpY2UoJm1jX2Rldi0+ZGV2KTsKLQotCWlmIChzdHJjbXAobWNfZGV2LT5vYmpfZGVzYy50eXBlLCAiZHByYyIpID09IDApIHsKLQkJbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19kZXYpOwotCi0JCWlmIChmc2xfbWNfaXNfcm9vdF9kcHJjKCZtY19kZXYtPmRldikpIHsKLQkJCWlmIChhdG9taWNfcmVhZCgmcm9vdF9kcHJjX2NvdW50KSA+IDApCi0JCQkJYXRvbWljX2RlYygmcm9vdF9kcHJjX2NvdW50KTsKLQkJCWVsc2UKLQkJCQlXQVJOX09OKDEpOwotCQl9Ci0JfQotCi0JaWYgKG1jX2J1cykKLQkJZGV2bV9rZnJlZShtY19kZXYtPmRldi5wYXJlbnQsIG1jX2J1cyk7Ci0JZWxzZQotCQlrbWVtX2NhY2hlX2ZyZWUobWNfZGV2X2NhY2hlLCBtY19kZXYpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX2RldmljZV9yZW1vdmUpOwotCi1zdGF0aWMgaW50IHBhcnNlX21jX3JhbmdlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICBpbnQgKnBhZGRyX2NlbGxzLAotCQkJICAgaW50ICptY19hZGRyX2NlbGxzLAotCQkJICAgaW50ICptY19zaXplX2NlbGxzLAotCQkJICAgY29uc3QgX19iZTMyICoqcmFuZ2VzX3N0YXJ0LAotCQkJICAgdTggKm51bV9yYW5nZXMpCi17Ci0JY29uc3QgX19iZTMyICpwcm9wOwotCWludCByYW5nZV90dXBsZV9jZWxsX2NvdW50OwotCWludCByYW5nZXNfbGVuOwotCWludCB0dXBsZV9sZW47Ci0Jc3RydWN0IGRldmljZV9ub2RlICptY19ub2RlID0gZGV2LT5vZl9ub2RlOwotCi0JKnJhbmdlc19zdGFydCA9IG9mX2dldF9wcm9wZXJ0eShtY19ub2RlLCAicmFuZ2VzIiwgJnJhbmdlc19sZW4pOwotCWlmICghKCpyYW5nZXNfc3RhcnQpIHx8ICFyYW5nZXNfbGVuKSB7Ci0JCWRldl93YXJuKGRldiwKLQkJCSAibWlzc2luZyBvciBlbXB0eSByYW5nZXMgcHJvcGVydHkgZm9yIGRldmljZSB0cmVlIG5vZGUgJyVzJ1xuIiwKLQkJCSBtY19ub2RlLT5uYW1lKTsKLQotCQkqbnVtX3JhbmdlcyA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQotCSpwYWRkcl9jZWxscyA9IG9mX25fYWRkcl9jZWxscyhtY19ub2RlKTsKLQotCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobWNfbm9kZSwgIiNhZGRyZXNzLWNlbGxzIiwgTlVMTCk7Ci0JaWYgKHByb3ApCi0JCSptY19hZGRyX2NlbGxzID0gYmUzMl90b19jcHVwKHByb3ApOwotCWVsc2UKLQkJKm1jX2FkZHJfY2VsbHMgPSAqcGFkZHJfY2VsbHM7Ci0KLQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG1jX25vZGUsICIjc2l6ZS1jZWxscyIsIE5VTEwpOwotCWlmIChwcm9wKQotCQkqbWNfc2l6ZV9jZWxscyA9IGJlMzJfdG9fY3B1cChwcm9wKTsKLQllbHNlCi0JCSptY19zaXplX2NlbGxzID0gb2Zfbl9zaXplX2NlbGxzKG1jX25vZGUpOwotCi0JcmFuZ2VfdHVwbGVfY2VsbF9jb3VudCA9ICpwYWRkcl9jZWxscyArICptY19hZGRyX2NlbGxzICsKLQkJCQkgKm1jX3NpemVfY2VsbHM7Ci0KLQl0dXBsZV9sZW4gPSByYW5nZV90dXBsZV9jZWxsX2NvdW50ICogc2l6ZW9mKF9fYmUzMik7Ci0JaWYgKHJhbmdlc19sZW4gJSB0dXBsZV9sZW4gIT0gMCkgewotCQlkZXZfZXJyKGRldiwgIm1hbGZvcm1lZCByYW5nZXMgcHJvcGVydHkgJyVzJ1xuIiwgbWNfbm9kZS0+bmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCSpudW1fcmFuZ2VzID0gcmFuZ2VzX2xlbiAvIHR1cGxlX2xlbjsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnZXRfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZXMoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgIHN0cnVjdCBmc2xfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZQotCQkJCQkJKipyYW5nZXMsCi0JCQkJCSAgdTggKm51bV9yYW5nZXMpCi17Ci0JaW50IGVycm9yOwotCWludCBwYWRkcl9jZWxsczsKLQlpbnQgbWNfYWRkcl9jZWxsczsKLQlpbnQgbWNfc2l6ZV9jZWxsczsKLQlpbnQgaTsKLQljb25zdCBfX2JlMzIgKnJhbmdlc19zdGFydDsKLQljb25zdCBfX2JlMzIgKmNlbGw7Ci0KLQllcnJvciA9IHBhcnNlX21jX3JhbmdlcyhkZXYsCi0JCQkJJnBhZGRyX2NlbGxzLAotCQkJCSZtY19hZGRyX2NlbGxzLAotCQkJCSZtY19zaXplX2NlbGxzLAotCQkJCSZyYW5nZXNfc3RhcnQsCi0JCQkJbnVtX3Jhbmdlcyk7Ci0JaWYgKGVycm9yIDwgMCkKLQkJcmV0dXJuIGVycm9yOwotCi0JaWYgKCEoKm51bV9yYW5nZXMpKSB7Ci0JCS8qCi0JCSAqIE1pc3Npbmcgb3IgZW1wdHkgcmFuZ2VzIHByb3BlcnR5ICgicmFuZ2VzOyIpIGZvciB0aGUKLQkJICogJ2ZzbCxxb3JpcS1tYycgbm9kZS4gSW4gdGhpcyBjYXNlLCBpZGVudGl0eSBtYXBwaW5nCi0JCSAqIHdpbGwgYmUgdXNlZC4KLQkJICovCi0JCSpyYW5nZXMgPSBOVUxMOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkqcmFuZ2VzID0gZGV2bV9rY2FsbG9jKGRldiwgKm51bV9yYW5nZXMsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBmc2xfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZSksCi0JCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEoKnJhbmdlcykpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY2VsbCA9IHJhbmdlc19zdGFydDsKLQlmb3IgKGkgPSAwOyBpIDwgKm51bV9yYW5nZXM7ICsraSkgewotCQlzdHJ1Y3QgZnNsX21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2UgKnJhbmdlID0gJigqcmFuZ2VzKVtpXTsKLQotCQlyYW5nZS0+bWNfcmVnaW9uX3R5cGUgPSBvZl9yZWFkX251bWJlcihjZWxsLCAxKTsKLQkJcmFuZ2UtPnN0YXJ0X21jX29mZnNldCA9IG9mX3JlYWRfbnVtYmVyKGNlbGwgKyAxLAotCQkJCQkJCW1jX2FkZHJfY2VsbHMgLSAxKTsKLQkJY2VsbCArPSBtY19hZGRyX2NlbGxzOwotCQlyYW5nZS0+c3RhcnRfcGh5c19hZGRyID0gb2ZfcmVhZF9udW1iZXIoY2VsbCwgcGFkZHJfY2VsbHMpOwotCQljZWxsICs9IHBhZGRyX2NlbGxzOwotCQlyYW5nZS0+ZW5kX21jX29mZnNldCA9IHJhbmdlLT5zdGFydF9tY19vZmZzZXQgKwotCQkJCSAgICAgb2ZfcmVhZF9udW1iZXIoY2VsbCwgbWNfc2l6ZV9jZWxscyk7Ci0KLQkJY2VsbCArPSBtY19zaXplX2NlbGxzOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGZzbF9tY19idXNfcHJvYmUgLSBjYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIHJvb3QgTUMgYnVzIGlzIGJlaW5nCi0gKiBhZGRlZAotICovCi1zdGF0aWMgaW50IGZzbF9tY19idXNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZHByY19vYmpfZGVzYyBvYmpfZGVzYzsKLQlpbnQgZXJyb3I7Ci0Jc3RydWN0IGZzbF9tYyAqbWM7Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYgPSBOVUxMOwotCXN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvID0gTlVMTDsKLQlpbnQgY29udGFpbmVyX2lkOwotCXBoeXNfYWRkcl90IG1jX3BvcnRhbF9waHlzX2FkZHI7Ci0JdTMyIG1jX3BvcnRhbF9zaXplOwotCXN0cnVjdCBtY192ZXJzaW9uIG1jX3ZlcnNpb247Ci0Jc3RydWN0IHJlc291cmNlIHJlczsKLQotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJSb290IE1DIGJ1cyBkZXZpY2UgcHJvYmVkIik7Ci0KLQltYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKm1jKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYyk7Ci0KLQkvKgotCSAqIEdldCBwaHlzaWNhbCBhZGRyZXNzIG9mIE1DIHBvcnRhbCBmb3IgdGhlIHJvb3QgRFBSQzoKLQkgKi8KLQllcnJvciA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UocGRldi0+ZGV2Lm9mX25vZGUsIDAsICZyZXMpOwotCWlmIChlcnJvciA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIm9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoKSBmYWlsZWQgZm9yICVzXG4iLAotCQkJcGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQltY19wb3J0YWxfcGh5c19hZGRyID0gcmVzLnN0YXJ0OwotCW1jX3BvcnRhbF9zaXplID0gcmVzb3VyY2Vfc2l6ZSgmcmVzKTsKLQllcnJvciA9IGZzbF9jcmVhdGVfbWNfaW8oJnBkZXYtPmRldiwgbWNfcG9ydGFsX3BoeXNfYWRkciwKLQkJCQkgbWNfcG9ydGFsX3NpemUsIE5VTEwsCi0JCQkJIEZTTF9NQ19JT19BVE9NSUNfQ09OVEVYVF9QT1JUQUwsICZtY19pbyk7Ci0JaWYgKGVycm9yIDwgMCkKLQkJcmV0dXJuIGVycm9yOwotCi0JZXJyb3IgPSBtY19nZXRfdmVyc2lvbihtY19pbywgMCwgJm1jX3ZlcnNpb24pOwotCWlmIChlcnJvciAhPSAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSJtY19nZXRfdmVyc2lvbigpIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCBlcnJvcik7Ci0JCWdvdG8gZXJyb3JfY2xlYW51cF9tY19pbzsKLQl9Ci0KLQlkZXZfaW5mbygmcGRldi0+ZGV2LAotCQkgIkZyZWVzY2FsZSBNYW5hZ2VtZW50IENvbXBsZXggRmlybXdhcmUgdmVyc2lvbjogJXUuJXUuJXVcbiIsCi0JCSBtY192ZXJzaW9uLm1ham9yLCBtY192ZXJzaW9uLm1pbm9yLCBtY192ZXJzaW9uLnJldmlzaW9uKTsKLQotCWVycm9yID0gZ2V0X21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2VzKCZwZGV2LT5kZXYsCi0JCQkJCSAgICAgICAmbWMtPnRyYW5zbGF0aW9uX3JhbmdlcywKLQkJCQkJICAgICAgICZtYy0+bnVtX3RyYW5zbGF0aW9uX3Jhbmdlcyk7Ci0JaWYgKGVycm9yIDwgMCkKLQkJZ290byBlcnJvcl9jbGVhbnVwX21jX2lvOwotCi0JZXJyb3IgPSBkcG1uZ19nZXRfY29udGFpbmVyX2lkKG1jX2lvLCAwLCAmY29udGFpbmVyX2lkKTsKLQlpZiAoZXJyb3IgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSJkcG1uZ19nZXRfY29udGFpbmVyX2lkKCkgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOwotCQlnb3RvIGVycm9yX2NsZWFudXBfbWNfaW87Ci0JfQotCi0JbWVtc2V0KCZvYmpfZGVzYywgMCwgc2l6ZW9mKHN0cnVjdCBkcHJjX29ial9kZXNjKSk7Ci0JZXJyb3IgPSBnZXRfZHByY192ZXJzaW9uKG1jX2lvLCBjb250YWluZXJfaWQsCi0JCQkJICZvYmpfZGVzYy52ZXJfbWFqb3IsICZvYmpfZGVzYy52ZXJfbWlub3IpOwotCWlmIChlcnJvciA8IDApCi0JCWdvdG8gZXJyb3JfY2xlYW51cF9tY19pbzsKLQotCW9ial9kZXNjLnZlbmRvciA9IEZTTF9NQ19WRU5ET1JfRlJFRVNDQUxFOwotCXN0cmNweShvYmpfZGVzYy50eXBlLCAiZHByYyIpOwotCW9ial9kZXNjLmlkID0gY29udGFpbmVyX2lkOwotCW9ial9kZXNjLmlycV9jb3VudCA9IDE7Ci0Jb2JqX2Rlc2MucmVnaW9uX2NvdW50ID0gMDsKLQotCWVycm9yID0gZnNsX21jX2RldmljZV9hZGQoJm9ial9kZXNjLCBtY19pbywgJnBkZXYtPmRldiwgJm1jX2J1c19kZXYpOwotCWlmIChlcnJvciA8IDApCi0JCWdvdG8gZXJyb3JfY2xlYW51cF9tY19pbzsKLQotCW1jLT5yb290X21jX2J1c19kZXYgPSBtY19idXNfZGV2OwotCXJldHVybiAwOwotCi1lcnJvcl9jbGVhbnVwX21jX2lvOgotCWZzbF9kZXN0cm95X21jX2lvKG1jX2lvKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qKgotICogZnNsX21jX2J1c19yZW1vdmUgLSBjYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIHJvb3QgTUMgYnVzIGlzIGJlaW5nCi0gKiByZW1vdmVkCi0gKi8KLXN0YXRpYyBpbnQgZnNsX21jX2J1c19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZnNsX21jICptYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JaWYgKFdBUk5fT04oIWZzbF9tY19pc19yb290X2RwcmMoJm1jLT5yb290X21jX2J1c19kZXYtPmRldikpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWZzbF9tY19kZXZpY2VfcmVtb3ZlKG1jLT5yb290X21jX2J1c19kZXYpOwotCi0JZnNsX2Rlc3Ryb3lfbWNfaW8obWMtPnJvb3RfbWNfYnVzX2Rldi0+bWNfaW8pOwotCW1jLT5yb290X21jX2J1c19kZXYtPm1jX2lvID0gTlVMTDsKLQotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJSb290IE1DIGJ1cyBkZXZpY2UgcmVtb3ZlZCIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBmc2xfbWNfYnVzX21hdGNoX3RhYmxlW10gPSB7Ci0Jey5jb21wYXRpYmxlID0gImZzbCxxb3JpcS1tYyIsfSwKLQl7fSwKLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGZzbF9tY19idXNfbWF0Y2hfdGFibGUpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBmc2xfbWNfYnVzX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkgICAubmFtZSA9ICJmc2xfbWNfYnVzIiwKLQkJICAgLnBtID0gTlVMTCwKLQkJICAgLm9mX21hdGNoX3RhYmxlID0gZnNsX21jX2J1c19tYXRjaF90YWJsZSwKLQkJICAgfSwKLQkucHJvYmUgPSBmc2xfbWNfYnVzX3Byb2JlLAotCS5yZW1vdmUgPSBmc2xfbWNfYnVzX3JlbW92ZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGZzbF9tY19idXNfZHJpdmVyX2luaXQodm9pZCkKLXsKLQlpbnQgZXJyb3I7Ci0KLQltY19kZXZfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZnNsX21jX2RldmljZSIsCi0JCQkJCSBzaXplb2Yoc3RydWN0IGZzbF9tY19kZXZpY2UpLCAwLCAwLAotCQkJCQkgTlVMTCk7Ci0JaWYgKCFtY19kZXZfY2FjaGUpIHsKLQkJcHJfZXJyKCJDb3VsZCBub3QgY3JlYXRlIGZzbF9tY19kZXZpY2UgY2FjaGVcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQllcnJvciA9IGJ1c19yZWdpc3RlcigmZnNsX21jX2J1c190eXBlKTsKLQlpZiAoZXJyb3IgPCAwKSB7Ci0JCXByX2VycigiZnNsLW1jIGJ1cyB0eXBlIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICVkXG4iLCBlcnJvcik7Ci0JCWdvdG8gZXJyb3JfY2xlYW51cF9jYWNoZTsKLQl9Ci0KLQlwcl9pbmZvKCJmc2wtbWMgYnVzIHR5cGUgcmVnaXN0ZXJlZFxuIik7Ci0KLQllcnJvciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZnNsX21jX2J1c19kcml2ZXIpOwotCWlmIChlcnJvciA8IDApIHsKLQkJcHJfZXJyKCJwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoKSBmYWlsZWQ6ICVkXG4iLCBlcnJvcik7Ci0JCWdvdG8gZXJyb3JfY2xlYW51cF9idXM7Ci0JfQotCi0JZXJyb3IgPSBkcHJjX2RyaXZlcl9pbml0KCk7Ci0JaWYgKGVycm9yIDwgMCkKLQkJZ290byBlcnJvcl9jbGVhbnVwX2RyaXZlcjsKLQotCWVycm9yID0gZnNsX21jX2FsbG9jYXRvcl9kcml2ZXJfaW5pdCgpOwotCWlmIChlcnJvciA8IDApCi0JCWdvdG8gZXJyb3JfY2xlYW51cF9kcHJjX2RyaXZlcjsKLQotCWVycm9yID0gaXRzX2ZzbF9tY19tc2lfaW5pdCgpOwotCWlmIChlcnJvciA8IDApCi0JCWdvdG8gZXJyb3JfY2xlYW51cF9tY19hbGxvY2F0b3I7Ci0KLQlyZXR1cm4gMDsKLQotZXJyb3JfY2xlYW51cF9tY19hbGxvY2F0b3I6Ci0JZnNsX21jX2FsbG9jYXRvcl9kcml2ZXJfZXhpdCgpOwotCi1lcnJvcl9jbGVhbnVwX2RwcmNfZHJpdmVyOgotCWRwcmNfZHJpdmVyX2V4aXQoKTsKLQotZXJyb3JfY2xlYW51cF9kcml2ZXI6Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmZzbF9tY19idXNfZHJpdmVyKTsKLQotZXJyb3JfY2xlYW51cF9idXM6Ci0JYnVzX3VucmVnaXN0ZXIoJmZzbF9tY19idXNfdHlwZSk7Ci0KLWVycm9yX2NsZWFudXBfY2FjaGU6Ci0Ja21lbV9jYWNoZV9kZXN0cm95KG1jX2Rldl9jYWNoZSk7Ci0JcmV0dXJuIGVycm9yOwotfQotCi1wb3N0Y29yZV9pbml0Y2FsbChmc2xfbWNfYnVzX2RyaXZlcl9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGZzbF9tY19idXNfZHJpdmVyX2V4aXQodm9pZCkKLXsKLQlpZiAoV0FSTl9PTighbWNfZGV2X2NhY2hlKSkKLQkJcmV0dXJuOwotCi0JaXRzX2ZzbF9tY19tc2lfY2xlYW51cCgpOwotCWZzbF9tY19hbGxvY2F0b3JfZHJpdmVyX2V4aXQoKTsKLQlkcHJjX2RyaXZlcl9leGl0KCk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmZzbF9tY19idXNfZHJpdmVyKTsKLQlidXNfdW5yZWdpc3RlcigmZnNsX21jX2J1c190eXBlKTsKLQlrbWVtX2NhY2hlX2Rlc3Ryb3kobWNfZGV2X2NhY2hlKTsKLQlwcl9pbmZvKCJNQyBidXMgdW5yZWdpc3RlcmVkXG4iKTsKLX0KLQotbW9kdWxlX2V4aXQoZnNsX21jX2J1c19kcml2ZXJfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIkZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRnJlZXNjYWxlIE1hbmFnZW1lbnQgQ29tcGxleCAoTUMpIGJ1cyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL21jLWlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9tYy1pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OGM5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9tYy1pby5jCkBAIC0wLDAgKzEsMzIwIEBACisvKiBDb3B5cmlnaHQgMjAxMy0yMDE2IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLWJ1cy5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCisKKyNpbmNsdWRlICJmc2wtbWMtcHJpdmF0ZS5oIgorI2luY2x1ZGUgImRwbWNwLmgiCisjaW5jbHVkZSAiZHBtY3AtY21kLmgiCisKK3N0YXRpYyBpbnQgZnNsX21jX2lvX3NldF9kcG1jcChzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCSAgICAgICBzdHJ1Y3QgZnNsX21jX2RldmljZSAqZHBtY3BfZGV2KQoreworCWludCBlcnJvcjsKKworCWlmIChXQVJOX09OKCFkcG1jcF9kZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChXQVJOX09OKG1jX2lvLT5kcG1jcF9kZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChXQVJOX09OKGRwbWNwX2Rldi0+bWNfaW8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVycm9yID0gZHBtY3Bfb3BlbihtY19pbywKKwkJCSAgIDAsCisJCQkgICBkcG1jcF9kZXYtPm9ial9kZXNjLmlkLAorCQkJICAgJmRwbWNwX2Rldi0+bWNfaGFuZGxlKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwltY19pby0+ZHBtY3BfZGV2ID0gZHBtY3BfZGV2OworCWRwbWNwX2Rldi0+bWNfaW8gPSBtY19pbzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnNsX21jX2lvX3Vuc2V0X2RwbWNwKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqZHBtY3BfZGV2ID0gbWNfaW8tPmRwbWNwX2RldjsKKworCWlmIChXQVJOX09OKCFkcG1jcF9kZXYpKQorCQlyZXR1cm47CisKKwlpZiAoV0FSTl9PTihkcG1jcF9kZXYtPm1jX2lvICE9IG1jX2lvKSkKKwkJcmV0dXJuOworCisJZXJyb3IgPSBkcG1jcF9jbG9zZShtY19pbywKKwkJCSAgICAwLAorCQkJICAgIGRwbWNwX2Rldi0+bWNfaGFuZGxlKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIoJmRwbWNwX2Rldi0+ZGV2LCAiZHBtY3BfY2xvc2UoKSBmYWlsZWQ6ICVkXG4iLAorCQkJZXJyb3IpOworCX0KKworCW1jX2lvLT5kcG1jcF9kZXYgPSBOVUxMOworCWRwbWNwX2Rldi0+bWNfaW8gPSBOVUxMOworfQorCisvKioKKyAqIENyZWF0ZXMgYW4gTUMgSS9PIG9iamVjdAorICoKKyAqIEBkZXY6IGRldmljZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIE1DIEkvTyBvYmplY3QKKyAqIEBtY19wb3J0YWxfcGh5c19hZGRyOiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBNQyBwb3J0YWwgdG8gdXNlCisgKiBAbWNfcG9ydGFsX3NpemU6IHNpemUgaW4gYnl0ZXMgb2YgdGhlIE1DIHBvcnRhbAorICogQGRwbWNwLWRldjogUG9pbnRlciB0byB0aGUgRFBNQ1Agb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1DIEkvTworICogb2JqZWN0IG9yIE5VTEwgaWYgbm9uZS4KKyAqIEBmbGFnczogZmxhZ3MgZm9yIHRoZSBuZXcgTUMgSS9PIG9iamVjdAorICogQG5ld19tY19pbzogQXJlYSB0byByZXR1cm4gcG9pbnRlciB0byBuZXdseSBjcmVhdGVkIE1DIEkvTyBvYmplY3QKKyAqCisgKiBSZXR1cm5zICcwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IF9fbXVzdF9jaGVjayBmc2xfY3JlYXRlX21jX2lvKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHBoeXNfYWRkcl90IG1jX3BvcnRhbF9waHlzX2FkZHIsCisJCQkJICB1MzIgbWNfcG9ydGFsX3NpemUsCisJCQkJICBzdHJ1Y3QgZnNsX21jX2RldmljZSAqZHBtY3BfZGV2LAorCQkJCSAgdTMyIGZsYWdzLCBzdHJ1Y3QgZnNsX21jX2lvICoqbmV3X21jX2lvKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgZnNsX21jX2lvICptY19pbzsKKwl2b2lkIF9faW9tZW0gKm1jX3BvcnRhbF92aXJ0X2FkZHI7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwltY19pbyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbWNfaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1jX2lvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1jX2lvLT5kZXYgPSBkZXY7CisJbWNfaW8tPmZsYWdzID0gZmxhZ3M7CisJbWNfaW8tPnBvcnRhbF9waHlzX2FkZHIgPSBtY19wb3J0YWxfcGh5c19hZGRyOworCW1jX2lvLT5wb3J0YWxfc2l6ZSA9IG1jX3BvcnRhbF9zaXplOworCWlmIChmbGFncyAmIEZTTF9NQ19JT19BVE9NSUNfQ09OVEVYVF9QT1JUQUwpCisJCXNwaW5fbG9ja19pbml0KCZtY19pby0+c3BpbmxvY2spOworCWVsc2UKKwkJbXV0ZXhfaW5pdCgmbWNfaW8tPm11dGV4KTsKKworCXJlcyA9IGRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKGRldiwKKwkJCQkgICAgICBtY19wb3J0YWxfcGh5c19hZGRyLAorCQkJCSAgICAgIG1jX3BvcnRhbF9zaXplLAorCQkJCSAgICAgICJtY19wb3J0YWwiKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKGRldiwKKwkJCSJkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbiBmYWlsZWQgZm9yIE1DIHBvcnRhbCAlI2xseFxuIiwKKwkJCW1jX3BvcnRhbF9waHlzX2FkZHIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCW1jX3BvcnRhbF92aXJ0X2FkZHIgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZShkZXYsCisJCQkJCQkgICBtY19wb3J0YWxfcGh5c19hZGRyLAorCQkJCQkJICAgbWNfcG9ydGFsX3NpemUpOworCWlmICghbWNfcG9ydGFsX3ZpcnRfYWRkcikgeworCQlkZXZfZXJyKGRldiwKKwkJCSJkZXZtX2lvcmVtYXBfbm9jYWNoZSBmYWlsZWQgZm9yIE1DIHBvcnRhbCAlI2xseFxuIiwKKwkJCW1jX3BvcnRhbF9waHlzX2FkZHIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCW1jX2lvLT5wb3J0YWxfdmlydF9hZGRyID0gbWNfcG9ydGFsX3ZpcnRfYWRkcjsKKwlpZiAoZHBtY3BfZGV2KSB7CisJCWVycm9yID0gZnNsX21jX2lvX3NldF9kcG1jcChtY19pbywgZHBtY3BfZGV2KTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gZXJyb3JfZGVzdHJveV9tY19pbzsKKwl9CisKKwkqbmV3X21jX2lvID0gbWNfaW87CisJcmV0dXJuIDA7CisKK2Vycm9yX2Rlc3Ryb3lfbWNfaW86CisJZnNsX2Rlc3Ryb3lfbWNfaW8obWNfaW8pOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBEZXN0cm95cyBhbiBNQyBJL08gb2JqZWN0CisgKgorICogQG1jX2lvOiBNQyBJL08gb2JqZWN0IHRvIGRlc3Ryb3kKKyAqLwordm9pZCBmc2xfZGVzdHJveV9tY19pbyhzdHJ1Y3QgZnNsX21jX2lvICptY19pbykKK3sKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqZHBtY3BfZGV2ID0gbWNfaW8tPmRwbWNwX2RldjsKKworCWlmIChkcG1jcF9kZXYpCisJCWZzbF9tY19pb191bnNldF9kcG1jcChtY19pbyk7CisKKwlkZXZtX2lvdW5tYXAobWNfaW8tPmRldiwgbWNfaW8tPnBvcnRhbF92aXJ0X2FkZHIpOworCWRldm1fcmVsZWFzZV9tZW1fcmVnaW9uKG1jX2lvLT5kZXYsCisJCQkJbWNfaW8tPnBvcnRhbF9waHlzX2FkZHIsCisJCQkJbWNfaW8tPnBvcnRhbF9zaXplKTsKKworCW1jX2lvLT5wb3J0YWxfdmlydF9hZGRyID0gTlVMTDsKKwlkZXZtX2tmcmVlKG1jX2lvLT5kZXYsIG1jX2lvKTsKK30KKworLyoqCisgKiBmc2xfbWNfcG9ydGFsX2FsbG9jYXRlIC0gQWxsb2NhdGVzIGFuIE1DIHBvcnRhbAorICoKKyAqIEBtY19kZXY6IE1DIGRldmljZSBmb3Igd2hpY2ggdGhlIE1DIHBvcnRhbCBpcyB0byBiZSBhbGxvY2F0ZWQKKyAqIEBtY19pb19mbGFnczogRmxhZ3MgZm9yIHRoZSBmc2xfbWNfaW8gb2JqZWN0IHRoYXQgd3JhcHMgdGhlIGFsbG9jYXRlZAorICogTUMgcG9ydGFsLgorICogQG5ld19tY19pbzogUG9pbnRlciB0byBhcmVhIHdoZXJlIHRoZSBwb2ludGVyIHRvIHRoZSBmc2xfbWNfaW8gb2JqZWN0CisgKiB0aGF0IHdyYXBzIHRoZSBhbGxvY2F0ZWQgTUMgcG9ydGFsIGlzIHRvIGJlIHJldHVybmVkCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYW4gTUMgcG9ydGFsIGZyb20gdGhlIGRldmljZSdzIHBhcmVudCBEUFJDLAorICogZnJvbSB0aGUgY29ycmVzcG9uZGluZyBNQyBidXMnIHBvb2wgb2YgTUMgcG9ydGFscyBhbmQgd3JhcHMKKyAqIGl0IGluIGEgbmV3IGZzbF9tY19pbyBvYmplY3QuIElmICdtY19kZXYnIGlzIGEgRFBSQyBpdHNlbGYsIHRoZQorICogcG9ydGFsIGlzIGFsbG9jYXRlZCBmcm9tIGl0cyBvd24gTUMgYnVzLgorICovCitpbnQgX19tdXN0X2NoZWNrIGZzbF9tY19wb3J0YWxfYWxsb2NhdGUoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiwKKwkJCQkJdTE2IG1jX2lvX2ZsYWdzLAorCQkJCQlzdHJ1Y3QgZnNsX21jX2lvICoqbmV3X21jX2lvKQoreworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2OworCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXM7CisJcGh5c19hZGRyX3QgbWNfcG9ydGFsX3BoeXNfYWRkcjsKKwlzaXplX3QgbWNfcG9ydGFsX3NpemU7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKmRwbWNwX2RldjsKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlID0gTlVMTDsKKwlzdHJ1Y3QgZnNsX21jX2lvICptY19pbyA9IE5VTEw7CisKKwlpZiAobWNfZGV2LT5mbGFncyAmIEZTTF9NQ19JU19EUFJDKSB7CisJCW1jX2J1c19kZXYgPSBtY19kZXY7CisJfSBlbHNlIHsKKwkJaWYgKFdBUk5fT04oIWRldl9pc19mc2xfbWMobWNfZGV2LT5kZXYucGFyZW50KSkpCisJCQlyZXR1cm4gZXJyb3I7CisKKwkJbWNfYnVzX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UobWNfZGV2LT5kZXYucGFyZW50KTsKKwl9CisKKwltY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2J1c19kZXYpOworCSpuZXdfbWNfaW8gPSBOVUxMOworCWVycm9yID0gZnNsX21jX3Jlc291cmNlX2FsbG9jYXRlKG1jX2J1cywgRlNMX01DX1BPT0xfRFBNQ1AsICZyZXNvdXJjZSk7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSAtRUlOVkFMOworCWRwbWNwX2RldiA9IHJlc291cmNlLT5kYXRhOworCWlmIChXQVJOX09OKCFkcG1jcF9kZXYpKQorCQlnb3RvIGVycm9yX2NsZWFudXBfcmVzb3VyY2U7CisKKwlpZiAoZHBtY3BfZGV2LT5vYmpfZGVzYy52ZXJfbWFqb3IgPCBEUE1DUF9NSU5fVkVSX01BSk9SIHx8CisJICAgIChkcG1jcF9kZXYtPm9ial9kZXNjLnZlcl9tYWpvciA9PSBEUE1DUF9NSU5fVkVSX01BSk9SICYmCisJICAgICBkcG1jcF9kZXYtPm9ial9kZXNjLnZlcl9taW5vciA8IERQTUNQX01JTl9WRVJfTUlOT1IpKSB7CisJCWRldl9lcnIoJmRwbWNwX2Rldi0+ZGV2LAorCQkJIkVSUk9SOiBWZXJzaW9uICVkLiVkIG9mIERQTUNQIG5vdCBzdXBwb3J0ZWQuXG4iLAorCQkJZHBtY3BfZGV2LT5vYmpfZGVzYy52ZXJfbWFqb3IsCisJCQlkcG1jcF9kZXYtPm9ial9kZXNjLnZlcl9taW5vcik7CisJCWVycm9yID0gLUVOT1RTVVBQOworCQlnb3RvIGVycm9yX2NsZWFudXBfcmVzb3VyY2U7CisJfQorCisJaWYgKFdBUk5fT04oZHBtY3BfZGV2LT5vYmpfZGVzYy5yZWdpb25fY291bnQgPT0gMCkpCisJCWdvdG8gZXJyb3JfY2xlYW51cF9yZXNvdXJjZTsKKworCW1jX3BvcnRhbF9waHlzX2FkZHIgPSBkcG1jcF9kZXYtPnJlZ2lvbnNbMF0uc3RhcnQ7CisJbWNfcG9ydGFsX3NpemUgPSBkcG1jcF9kZXYtPnJlZ2lvbnNbMF0uZW5kIC0KKwkJCSBkcG1jcF9kZXYtPnJlZ2lvbnNbMF0uc3RhcnQgKyAxOworCisJaWYgKFdBUk5fT04obWNfcG9ydGFsX3NpemUgIT0gbWNfYnVzX2Rldi0+bWNfaW8tPnBvcnRhbF9zaXplKSkKKwkJZ290byBlcnJvcl9jbGVhbnVwX3Jlc291cmNlOworCisJZXJyb3IgPSBmc2xfY3JlYXRlX21jX2lvKCZtY19idXNfZGV2LT5kZXYsCisJCQkJIG1jX3BvcnRhbF9waHlzX2FkZHIsCisJCQkJIG1jX3BvcnRhbF9zaXplLCBkcG1jcF9kZXYsCisJCQkJIG1jX2lvX2ZsYWdzLCAmbWNfaW8pOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gZXJyb3JfY2xlYW51cF9yZXNvdXJjZTsKKworCSpuZXdfbWNfaW8gPSBtY19pbzsKKwlyZXR1cm4gMDsKKworZXJyb3JfY2xlYW51cF9yZXNvdXJjZToKKwlmc2xfbWNfcmVzb3VyY2VfZnJlZShyZXNvdXJjZSk7CisJcmV0dXJuIGVycm9yOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX3BvcnRhbF9hbGxvY2F0ZSk7CisKKy8qKgorICogZnNsX21jX3BvcnRhbF9mcmVlIC0gUmV0dXJucyBhbiBNQyBwb3J0YWwgdG8gdGhlIHBvb2wgb2YgZnJlZSBNQyBwb3J0YWxzCisgKiBvZiBhIGdpdmVuIE1DIGJ1cworICoKKyAqIEBtY19pbzogUG9pbnRlciB0byB0aGUgZnNsX21jX2lvIG9iamVjdCB0aGF0IHdyYXBzIHRoZSBNQyBwb3J0YWwgdG8gZnJlZQorICovCit2b2lkIGZzbF9tY19wb3J0YWxfZnJlZShzdHJ1Y3QgZnNsX21jX2lvICptY19pbykKK3sKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqZHBtY3BfZGV2OworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlOworCisJLyoKKwkgKiBFdmVyeSBtY19pbyBvYnRhaW5lZCBieSBjYWxsaW5nIGZzbF9tY19wb3J0YWxfYWxsb2NhdGUoKSBpcyBzdXBwb3NlZAorCSAqIHRvIGhhdmUgYSBEUE1DUCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoLgorCSAqLworCWRwbWNwX2RldiA9IG1jX2lvLT5kcG1jcF9kZXY7CisJaWYgKFdBUk5fT04oIWRwbWNwX2RldikpCisJCXJldHVybjsKKworCXJlc291cmNlID0gZHBtY3BfZGV2LT5yZXNvdXJjZTsKKwlpZiAoV0FSTl9PTighcmVzb3VyY2UgfHwgcmVzb3VyY2UtPnR5cGUgIT0gRlNMX01DX1BPT0xfRFBNQ1ApKQorCQlyZXR1cm47CisKKwlpZiAoV0FSTl9PTihyZXNvdXJjZS0+ZGF0YSAhPSBkcG1jcF9kZXYpKQorCQlyZXR1cm47CisKKwlmc2xfZGVzdHJveV9tY19pbyhtY19pbyk7CisJZnNsX21jX3Jlc291cmNlX2ZyZWUocmVzb3VyY2UpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX3BvcnRhbF9mcmVlKTsKKworLyoqCisgKiBmc2xfbWNfcG9ydGFsX3Jlc2V0IC0gUmVzZXRzIHRoZSBkcG1jcCBvYmplY3QgZm9yIGEgZ2l2ZW4gZnNsX21jX2lvIG9iamVjdAorICoKKyAqIEBtY19pbzogUG9pbnRlciB0byB0aGUgZnNsX21jX2lvIG9iamVjdCB0aGF0IHdyYXBzIHRoZSBNQyBwb3J0YWwgdG8gZnJlZQorICovCitpbnQgZnNsX21jX3BvcnRhbF9yZXNldChzdHJ1Y3QgZnNsX21jX2lvICptY19pbykKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKmRwbWNwX2RldiA9IG1jX2lvLT5kcG1jcF9kZXY7CisKKwlpZiAoV0FSTl9PTighZHBtY3BfZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnJvciA9IGRwbWNwX3Jlc2V0KG1jX2lvLCAwLCBkcG1jcF9kZXYtPm1jX2hhbmRsZSk7CisJaWYgKGVycm9yIDwgMCkgeworCQlkZXZfZXJyKCZkcG1jcF9kZXYtPmRldiwgImRwbWNwX3Jlc2V0KCkgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfcG9ydGFsX3Jlc2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL21jLW1zaS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtbXNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YmUxNTYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtbXNpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoKLSAqIEZyZWVzY2FsZSBNYW5hZ2VtZW50IENvbXBsZXggKE1DKSBidXMgZHJpdmVyIE1TSSBzdXBwb3J0Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDE1IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCi0gKiBBdXRob3I6IEdlcm1hbiBSaXZlcmEgPEdlcm1hbi5SaXZlcmFAZnJlZXNjYWxlLmNvbT4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQotICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICovCi0KLSNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXByaXZhdGUuaCIKLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxY2hpcC9hcm0tZ2ljLXYzLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNpLmg+Ci0jaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1zeXMuaCIKLSNpbmNsdWRlICJkcHJjLWNtZC5oIgotCi0vKgotICogR2VuZXJhdGUgYSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIGludGVycnVwdCAob25seSB1c2VkIHdpdGhpbiB0aGUgTVNJCi0gKiBpcnFkb21haW4uICBDb21iaW5lIHRoZSBpY2lkIHdpdGggdGhlIGludGVycnVwdCBpbmRleC4KLSAqLwotc3RhdGljIGlycV9od19udW1iZXJfdCBmc2xfbWNfZG9tYWluX2NhbGNfaHdpcnEoc3RydWN0IGZzbF9tY19kZXZpY2UgKmRldiwKLQkJCQkJCXN0cnVjdCBtc2lfZGVzYyAqZGVzYykKLXsKLQkvKgotCSAqIE1ha2UgdGhlIGJhc2UgaHdpcnEgdmFsdWUgZm9yIElDSUQqMTAwMDAgc28gaXQgaXMgcmVhZGFibGUKLQkgKiBhcyBhIGRlY2ltYWwgdmFsdWUgaW4gL3Byb2MvaW50ZXJydXB0cy4KLQkgKi8KLQlyZXR1cm4gKGlycV9od19udW1iZXJfdCkoZGVzYy0+ZnNsX21jLm1zaV9pbmRleCArIChkZXYtPmljaWQgKiAxMDAwMCkpOwotfQotCi1zdGF0aWMgdm9pZCBmc2xfbWNfbXNpX3NldF9kZXNjKG1zaV9hbGxvY19pbmZvX3QgKmFyZywKLQkJCQlzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MpCi17Ci0JYXJnLT5kZXNjID0gZGVzYzsKLQlhcmctPmh3aXJxID0gZnNsX21jX2RvbWFpbl9jYWxjX2h3aXJxKHRvX2ZzbF9tY19kZXZpY2UoZGVzYy0+ZGV2KSwKLQkJCQkJICAgICAgZGVzYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZzbF9tY19tc2lfdXBkYXRlX2RvbV9vcHMoc3RydWN0IG1zaV9kb21haW5faW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3QgbXNpX2RvbWFpbl9vcHMgKm9wcyA9IGluZm8tPm9wczsKLQotCWlmIChXQVJOX09OKCFvcHMpKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIHNldF9kZXNjIHNob3VsZCBub3QgYmUgc2V0IGJ5IHRoZSBjYWxsZXIKLQkgKi8KLQlpZiAob3BzLT5zZXRfZGVzYyA9PSBOVUxMKQotCQlvcHMtPnNldF9kZXNjID0gZnNsX21jX21zaV9zZXRfZGVzYzsKLX0KLQotc3RhdGljIHZvaWQgX19mc2xfbWNfbXNpX3dyaXRlX21zZyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldiwKLQkJCQkgICBzdHJ1Y3QgZnNsX21jX2RldmljZV9pcnEgKm1jX2Rldl9pcnEpCi17Ci0JaW50IGVycm9yOwotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICpvd25lcl9tY19kZXYgPSBtY19kZXZfaXJxLT5tY19kZXY7Ci0Jc3RydWN0IG1zaV9kZXNjICptc2lfZGVzYyA9IG1jX2Rldl9pcnEtPm1zaV9kZXNjOwotCXN0cnVjdCBkcHJjX2lycV9jZmcgaXJxX2NmZzsKLQotCS8qCi0JICogbXNpX2Rlc2MtPm1zZy5hZGRyZXNzIGlzIDB4MCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCBpbgotCSAqIHRoZSBmcmVlX2lycSgpIGNvZGUgcGF0aC4gSW4gdGhpcyBjYXNlLCBmb3IgdGhlIE1DLCB3ZSBkb24ndAotCSAqIHJlYWxseSBuZWVkIHRvICJ1bnByb2dyYW0iIHRoZSBNU0ksIHNvIHdlIGp1c3QgcmV0dXJuLgotCSAqLwotCWlmIChtc2lfZGVzYy0+bXNnLmFkZHJlc3NfbG8gPT0gMHgwICYmIG1zaV9kZXNjLT5tc2cuYWRkcmVzc19oaSA9PSAweDApCi0JCXJldHVybjsKLQotCWlmIChXQVJOX09OKCFvd25lcl9tY19kZXYpKQotCQlyZXR1cm47Ci0KLQlpcnFfY2ZnLnBhZGRyID0gKCh1NjQpbXNpX2Rlc2MtPm1zZy5hZGRyZXNzX2hpIDw8IDMyKSB8Ci0JCQltc2lfZGVzYy0+bXNnLmFkZHJlc3NfbG87Ci0JaXJxX2NmZy52YWwgPSBtc2lfZGVzYy0+bXNnLmRhdGE7Ci0JaXJxX2NmZy5pcnFfbnVtID0gbXNpX2Rlc2MtPmlycTsKLQotCWlmIChvd25lcl9tY19kZXYgPT0gbWNfYnVzX2RldikgewotCQkvKgotCQkgKiBJUlEgaXMgZm9yIHRoZSBtY19idXNfZGV2J3MgRFBSQyBpdHNlbGYKLQkJICovCi0JCWVycm9yID0gZHByY19zZXRfaXJxKG1jX2J1c19kZXYtPm1jX2lvLAotCQkJCSAgICAgTUNfQ01EX0ZMQUdfSU5UUl9ESVMgfCBNQ19DTURfRkxBR19QUkksCi0JCQkJICAgICBtY19idXNfZGV2LT5tY19oYW5kbGUsCi0JCQkJICAgICBtY19kZXZfaXJxLT5kZXZfaXJxX2luZGV4LAotCQkJCSAgICAgJmlycV9jZmcpOwotCQlpZiAoZXJyb3IgPCAwKSB7Ci0JCQlkZXZfZXJyKCZvd25lcl9tY19kZXYtPmRldiwKLQkJCQkiZHByY19zZXRfaXJxKCkgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogSVJRIGlzIGZvciBmb3IgYSBjaGlsZCBkZXZpY2Ugb2YgbWNfYnVzX2RldgotCQkgKi8KLQkJZXJyb3IgPSBkcHJjX3NldF9vYmpfaXJxKG1jX2J1c19kZXYtPm1jX2lvLAotCQkJCQkgTUNfQ01EX0ZMQUdfSU5UUl9ESVMgfCBNQ19DTURfRkxBR19QUkksCi0JCQkJCSBtY19idXNfZGV2LT5tY19oYW5kbGUsCi0JCQkJCSBvd25lcl9tY19kZXYtPm9ial9kZXNjLnR5cGUsCi0JCQkJCSBvd25lcl9tY19kZXYtPm9ial9kZXNjLmlkLAotCQkJCQkgbWNfZGV2X2lycS0+ZGV2X2lycV9pbmRleCwKLQkJCQkJICZpcnFfY2ZnKTsKLQkJaWYgKGVycm9yIDwgMCkgewotCQkJZGV2X2Vycigmb3duZXJfbWNfZGV2LT5kZXYsCi0JCQkJImRwcmNfb2JqX3NldF9pcnEoKSBmYWlsZWQ6ICVkXG4iLCBlcnJvcik7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkCi0gKi8KLXN0YXRpYyB2b2lkIGZzbF9tY19tc2lfd3JpdGVfbXNnKHN0cnVjdCBpcnFfZGF0YSAqaXJxX2RhdGEsCi0JCQkJIHN0cnVjdCBtc2lfbXNnICptc2cpCi17Ci0Jc3RydWN0IG1zaV9kZXNjICptc2lfZGVzYyA9IGlycV9kYXRhX2dldF9tc2lfZGVzYyhpcnFfZGF0YSk7Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKG1zaV9kZXNjLT5kZXYpOwotCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2J1c19kZXYpOwotCXN0cnVjdCBmc2xfbWNfZGV2aWNlX2lycSAqbWNfZGV2X2lycSA9Ci0JCSZtY19idXMtPmlycV9yZXNvdXJjZXNbbXNpX2Rlc2MtPmZzbF9tYy5tc2lfaW5kZXhdOwotCi0JV0FSTl9PTihtY19kZXZfaXJxLT5tc2lfZGVzYyAhPSBtc2lfZGVzYyk7Ci0JbXNpX2Rlc2MtPm1zZyA9ICptc2c7Ci0KLQkvKgotCSAqIFByb2dyYW0gdGhlIE1TSSAocGFkZHIsIHZhbHVlKSBwYWlyIGluIHRoZSBkZXZpY2U6Ci0JICovCi0JX19mc2xfbWNfbXNpX3dyaXRlX21zZyhtY19idXNfZGV2LCBtY19kZXZfaXJxKTsKLX0KLQotc3RhdGljIHZvaWQgZnNsX21jX21zaV91cGRhdGVfY2hpcF9vcHMoc3RydWN0IG1zaV9kb21haW5faW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpbmZvLT5jaGlwOwotCi0JaWYgKFdBUk5fT04oKCFjaGlwKSkpCi0JCXJldHVybjsKLQotCS8qCi0JICogaXJxX3dyaXRlX21zaV9tc2cgc2hvdWxkIG5vdCBiZSBzZXQgYnkgdGhlIGNhbGxlcgotCSAqLwotCWlmIChjaGlwLT5pcnFfd3JpdGVfbXNpX21zZyA9PSBOVUxMKQotCQljaGlwLT5pcnFfd3JpdGVfbXNpX21zZyA9IGZzbF9tY19tc2lfd3JpdGVfbXNnOwotfQotCi0vKioKLSAqIGZzbF9tY19tc2lfY3JlYXRlX2lycV9kb21haW4gLSBDcmVhdGUgYSBmc2wtbWMgTVNJIGludGVycnVwdCBkb21haW4KLSAqIEBucDoJCU9wdGlvbmFsIGRldmljZS10cmVlIG5vZGUgb2YgdGhlIGludGVycnVwdCBjb250cm9sbGVyCi0gKiBAaW5mbzoJTVNJIGRvbWFpbiBpbmZvCi0gKiBAcGFyZW50OglQYXJlbnQgaXJxIGRvbWFpbgotICoKLSAqIFVwZGF0ZXMgdGhlIGRvbWFpbiBhbmQgY2hpcCBvcHMgYW5kIGNyZWF0ZXMgYSBmc2wtbWMgTVNJCi0gKiBpbnRlcnJ1cHQgZG9tYWluLgotICoKLSAqIFJldHVybnM6Ci0gKiBBIGRvbWFpbiBwb2ludGVyIG9yIE5VTEwgaW4gY2FzZSBvZiBmYWlsdXJlLgotICovCi1zdHJ1Y3QgaXJxX2RvbWFpbiAqZnNsX21jX21zaV9jcmVhdGVfaXJxX2RvbWFpbihzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlLAotCQkJCQkJc3RydWN0IG1zaV9kb21haW5faW5mbyAqaW5mbywKLQkJCQkJCXN0cnVjdCBpcnFfZG9tYWluICpwYXJlbnQpCi17Ci0Jc3RydWN0IGlycV9kb21haW4gKmRvbWFpbjsKLQotCWlmIChpbmZvLT5mbGFncyAmIE1TSV9GTEFHX1VTRV9ERUZfRE9NX09QUykKLQkJZnNsX21jX21zaV91cGRhdGVfZG9tX29wcyhpbmZvKTsKLQlpZiAoaW5mby0+ZmxhZ3MgJiBNU0lfRkxBR19VU0VfREVGX0NISVBfT1BTKQotCQlmc2xfbWNfbXNpX3VwZGF0ZV9jaGlwX29wcyhpbmZvKTsKLQotCWRvbWFpbiA9IG1zaV9jcmVhdGVfaXJxX2RvbWFpbihmd25vZGUsIGluZm8sIHBhcmVudCk7Ci0JaWYgKGRvbWFpbikKLQkJZG9tYWluLT5idXNfdG9rZW4gPSBET01BSU5fQlVTX0ZTTF9NQ19NU0k7Ci0KLQlyZXR1cm4gZG9tYWluOwotfQotCi1pbnQgZnNsX21jX2ZpbmRfbXNpX2RvbWFpbihzdHJ1Y3QgZGV2aWNlICptY19wbGF0Zm9ybV9kZXYsCi0JCQkgICBzdHJ1Y3QgaXJxX2RvbWFpbiAqKm1jX21zaV9kb21haW4pCi17Ci0Jc3RydWN0IGlycV9kb21haW4gKm1zaV9kb21haW47Ci0Jc3RydWN0IGRldmljZV9ub2RlICptY19vZl9ub2RlID0gbWNfcGxhdGZvcm1fZGV2LT5vZl9ub2RlOwotCi0JbXNpX2RvbWFpbiA9IG9mX21zaV9nZXRfZG9tYWluKG1jX3BsYXRmb3JtX2RldiwgbWNfb2Zfbm9kZSwKLQkJCQkgICAgICAgRE9NQUlOX0JVU19GU0xfTUNfTVNJKTsKLQlpZiAoIW1zaV9kb21haW4pIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gZmluZCBmc2wtbWMgTVNJIGRvbWFpbiBmb3IgJXNcbiIsCi0JCSAgICAgICBtY19vZl9ub2RlLT5mdWxsX25hbWUpOwotCi0JCXJldHVybiAtRU5PRU5UOwotCX0KLQotCSptY19tc2lfZG9tYWluID0gbXNpX2RvbWFpbjsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZnNsX21jX21zaV9mcmVlX2Rlc2NzKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MsICp0bXA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgdG1wLCBkZXZfdG9fbXNpX2xpc3QoZGV2KSwgbGlzdCkgewotCQlsaXN0X2RlbCgmZGVzYy0+bGlzdCk7Ci0JCWZyZWVfbXNpX2VudHJ5KGRlc2MpOwotCX0KLX0KLQotc3RhdGljIGludCBmc2xfbWNfbXNpX2FsbG9jX2Rlc2NzKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlycV9jb3VudCkKLQotewotCXVuc2lnbmVkIGludCBpOwotCWludCBlcnJvcjsKLQlzdHJ1Y3QgbXNpX2Rlc2MgKm1zaV9kZXNjOwotCi0JZm9yIChpID0gMDsgaSA8IGlycV9jb3VudDsgaSsrKSB7Ci0JCW1zaV9kZXNjID0gYWxsb2NfbXNpX2VudHJ5KGRldik7Ci0JCWlmICghbXNpX2Rlc2MpIHsKLQkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1zaSBlbnRyeVxuIik7Ci0JCQllcnJvciA9IC1FTk9NRU07Ci0JCQlnb3RvIGNsZWFudXBfbXNpX2Rlc2NzOwotCQl9Ci0KLQkJbXNpX2Rlc2MtPmZzbF9tYy5tc2lfaW5kZXggPSBpOwotCQltc2lfZGVzYy0+bnZlY191c2VkID0gMTsKLQkJSU5JVF9MSVNUX0hFQUQoJm1zaV9kZXNjLT5saXN0KTsKLQkJbGlzdF9hZGRfdGFpbCgmbXNpX2Rlc2MtPmxpc3QsIGRldl90b19tc2lfbGlzdChkZXYpKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotY2xlYW51cF9tc2lfZGVzY3M6Ci0JZnNsX21jX21zaV9mcmVlX2Rlc2NzKGRldik7Ci0JcmV0dXJuIGVycm9yOwotfQotCi1pbnQgZnNsX21jX21zaV9kb21haW5fYWxsb2NfaXJxcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJIHVuc2lnbmVkIGludCBpcnFfY291bnQpCi17Ci0Jc3RydWN0IGlycV9kb21haW4gKm1zaV9kb21haW47Ci0JaW50IGVycm9yOwotCi0JaWYgKFdBUk5fT04oIWxpc3RfZW1wdHkoZGV2X3RvX21zaV9saXN0KGRldikpKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQllcnJvciA9IGZzbF9tY19tc2lfYWxsb2NfZGVzY3MoZGV2LCBpcnFfY291bnQpOwotCWlmIChlcnJvciA8IDApCi0JCXJldHVybiBlcnJvcjsKLQotCW1zaV9kb21haW4gPSBkZXZfZ2V0X21zaV9kb21haW4oZGV2KTsKLQlpZiAoV0FSTl9PTighbXNpX2RvbWFpbikpIHsKLQkJZXJyb3IgPSAtRUlOVkFMOwotCQlnb3RvIGNsZWFudXBfbXNpX2Rlc2NzOwotCX0KLQotCS8qCi0JICogTk9URTogQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgdHJpZ2dlciB0aGUgaW52b2NhdGlvbiBvZiB0aGUKLQkgKiBpdHNfZnNsX21jX21zaV9wcmVwYXJlKCkgY2FsbGJhY2sKLQkgKi8KLQllcnJvciA9IG1zaV9kb21haW5fYWxsb2NfaXJxcyhtc2lfZG9tYWluLCBkZXYsIGlycV9jb3VudCk7Ci0KLQlpZiAoZXJyb3IpIHsKLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgSVJRc1xuIik7Ci0JCWdvdG8gY2xlYW51cF9tc2lfZGVzY3M7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWNsZWFudXBfbXNpX2Rlc2NzOgotCWZzbF9tY19tc2lfZnJlZV9kZXNjcyhkZXYpOwotCXJldHVybiBlcnJvcjsKLX0KLQotdm9pZCBmc2xfbWNfbXNpX2RvbWFpbl9mcmVlX2lycXMoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBpcnFfZG9tYWluICptc2lfZG9tYWluOwotCi0JbXNpX2RvbWFpbiA9IGRldl9nZXRfbXNpX2RvbWFpbihkZXYpOwotCWlmIChXQVJOX09OKCFtc2lfZG9tYWluKSkKLQkJcmV0dXJuOwotCi0JbXNpX2RvbWFpbl9mcmVlX2lycXMobXNpX2RvbWFpbiwgZGV2KTsKLQotCWlmIChXQVJOX09OKGxpc3RfZW1wdHkoZGV2X3RvX21zaV9saXN0KGRldikpKSkKLQkJcmV0dXJuOwotCi0JZnNsX21jX21zaV9mcmVlX2Rlc2NzKGRldik7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9tYy1zeXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL21jLXN5cy5jCmluZGV4IDBjMTg1YWIuLjI4NTkxN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL21jLXN5cy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL21jLXN5cy5jCkBAIC0zMiwxMyArMzIsMTUgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKLSNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXN5cy5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtY21kLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy5oIgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1zeXMuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLWNtZC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMuaCIKKwogI2luY2x1ZGUgImRwbWNwLmgiCiAKIC8qKgpAQCAtNjgsMTUzICs3MCw2IEBACiAJcmV0dXJuIChjbWRfaWQgJiBNQ19DTURfSERSX0NNRElEX01BU0spID4+IE1DX0NNRF9IRFJfQ01ESURfU0hJRlQ7CiB9CiAKLS8qKgotICogQ3JlYXRlcyBhbiBNQyBJL08gb2JqZWN0Ci0gKgotICogQGRldjogZGV2aWNlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgTUMgSS9PIG9iamVjdAotICogQG1jX3BvcnRhbF9waHlzX2FkZHI6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIE1DIHBvcnRhbCB0byB1c2UKLSAqIEBtY19wb3J0YWxfc2l6ZTogc2l6ZSBpbiBieXRlcyBvZiB0aGUgTUMgcG9ydGFsCi0gKiBAZHBtY3AtZGV2OiBQb2ludGVyIHRvIHRoZSBEUE1DUCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgTUMgSS9PCi0gKiBvYmplY3Qgb3IgTlVMTCBpZiBub25lLgotICogQGZsYWdzOiBmbGFncyBmb3IgdGhlIG5ldyBNQyBJL08gb2JqZWN0Ci0gKiBAbmV3X21jX2lvOiBBcmVhIHRvIHJldHVybiBwb2ludGVyIHRvIG5ld2x5IGNyZWF0ZWQgTUMgSS9PIG9iamVjdAotICoKLSAqIFJldHVybnMgJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgotICovCi1pbnQgX19tdXN0X2NoZWNrIGZzbF9jcmVhdGVfbWNfaW8oc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgcGh5c19hZGRyX3QgbWNfcG9ydGFsX3BoeXNfYWRkciwKLQkJCQkgIHUzMiBtY19wb3J0YWxfc2l6ZSwKLQkJCQkgIHN0cnVjdCBmc2xfbWNfZGV2aWNlICpkcG1jcF9kZXYsCi0JCQkJICB1MzIgZmxhZ3MsIHN0cnVjdCBmc2xfbWNfaW8gKipuZXdfbWNfaW8pCi17Ci0JaW50IGVycm9yOwotCXN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvOwotCXZvaWQgX19pb21lbSAqbWNfcG9ydGFsX3ZpcnRfYWRkcjsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQotCW1jX2lvID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCptY19pbyksIEdGUF9LRVJORUwpOwotCWlmICghbWNfaW8pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWNfaW8tPmRldiA9IGRldjsKLQltY19pby0+ZmxhZ3MgPSBmbGFnczsKLQltY19pby0+cG9ydGFsX3BoeXNfYWRkciA9IG1jX3BvcnRhbF9waHlzX2FkZHI7Ci0JbWNfaW8tPnBvcnRhbF9zaXplID0gbWNfcG9ydGFsX3NpemU7Ci0JaWYgKGZsYWdzICYgRlNMX01DX0lPX0FUT01JQ19DT05URVhUX1BPUlRBTCkKLQkJc3Bpbl9sb2NrX2luaXQoJm1jX2lvLT5zcGlubG9jayk7Ci0JZWxzZQotCQltdXRleF9pbml0KCZtY19pby0+bXV0ZXgpOwotCi0JcmVzID0gZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oZGV2LAotCQkJCSAgICAgIG1jX3BvcnRhbF9waHlzX2FkZHIsCi0JCQkJICAgICAgbWNfcG9ydGFsX3NpemUsCi0JCQkJICAgICAgIm1jX3BvcnRhbCIpOwotCWlmICghcmVzKSB7Ci0JCWRldl9lcnIoZGV2LAotCQkJImRldm1fcmVxdWVzdF9tZW1fcmVnaW9uIGZhaWxlZCBmb3IgTUMgcG9ydGFsICUjbGx4XG4iLAotCQkJbWNfcG9ydGFsX3BoeXNfYWRkcik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JbWNfcG9ydGFsX3ZpcnRfYWRkciA9IGRldm1faW9yZW1hcF9ub2NhY2hlKGRldiwKLQkJCQkJCSAgIG1jX3BvcnRhbF9waHlzX2FkZHIsCi0JCQkJCQkgICBtY19wb3J0YWxfc2l6ZSk7Ci0JaWYgKCFtY19wb3J0YWxfdmlydF9hZGRyKSB7Ci0JCWRldl9lcnIoZGV2LAotCQkJImRldm1faW9yZW1hcF9ub2NhY2hlIGZhaWxlZCBmb3IgTUMgcG9ydGFsICUjbGx4XG4iLAotCQkJbWNfcG9ydGFsX3BoeXNfYWRkcik7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JbWNfaW8tPnBvcnRhbF92aXJ0X2FkZHIgPSBtY19wb3J0YWxfdmlydF9hZGRyOwotCWlmIChkcG1jcF9kZXYpIHsKLQkJZXJyb3IgPSBmc2xfbWNfaW9fc2V0X2RwbWNwKG1jX2lvLCBkcG1jcF9kZXYpOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJZ290byBlcnJvcl9kZXN0cm95X21jX2lvOwotCX0KLQotCSpuZXdfbWNfaW8gPSBtY19pbzsKLQlyZXR1cm4gMDsKLQotZXJyb3JfZGVzdHJveV9tY19pbzoKLQlmc2xfZGVzdHJveV9tY19pbyhtY19pbyk7Ci0JcmV0dXJuIGVycm9yOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZnNsX2NyZWF0ZV9tY19pbyk7Ci0KLS8qKgotICogRGVzdHJveXMgYW4gTUMgSS9PIG9iamVjdAotICoKLSAqIEBtY19pbzogTUMgSS9PIG9iamVjdCB0byBkZXN0cm95Ci0gKi8KLXZvaWQgZnNsX2Rlc3Ryb3lfbWNfaW8oc3RydWN0IGZzbF9tY19pbyAqbWNfaW8pCi17Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2UgKmRwbWNwX2RldiA9IG1jX2lvLT5kcG1jcF9kZXY7Ci0KLQlpZiAoZHBtY3BfZGV2KQotCQlmc2xfbWNfaW9fdW5zZXRfZHBtY3AobWNfaW8pOwotCi0JZGV2bV9pb3VubWFwKG1jX2lvLT5kZXYsIG1jX2lvLT5wb3J0YWxfdmlydF9hZGRyKTsKLQlkZXZtX3JlbGVhc2VfbWVtX3JlZ2lvbihtY19pby0+ZGV2LAotCQkJCW1jX2lvLT5wb3J0YWxfcGh5c19hZGRyLAotCQkJCW1jX2lvLT5wb3J0YWxfc2l6ZSk7Ci0KLQltY19pby0+cG9ydGFsX3ZpcnRfYWRkciA9IE5VTEw7Ci0JZGV2bV9rZnJlZShtY19pby0+ZGV2LCBtY19pbyk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChmc2xfZGVzdHJveV9tY19pbyk7Ci0KLWludCBmc2xfbWNfaW9fc2V0X2RwbWNwKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAotCQkJc3RydWN0IGZzbF9tY19kZXZpY2UgKmRwbWNwX2RldikKLXsKLQlpbnQgZXJyb3I7Ci0KLQlpZiAoV0FSTl9PTighZHBtY3BfZGV2KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoV0FSTl9PTihtY19pby0+ZHBtY3BfZGV2KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoV0FSTl9PTihkcG1jcF9kZXYtPm1jX2lvKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQllcnJvciA9IGRwbWNwX29wZW4obWNfaW8sCi0JCQkgICAwLAotCQkJICAgZHBtY3BfZGV2LT5vYmpfZGVzYy5pZCwKLQkJCSAgICZkcG1jcF9kZXYtPm1jX2hhbmRsZSk7Ci0JaWYgKGVycm9yIDwgMCkKLQkJcmV0dXJuIGVycm9yOwotCi0JbWNfaW8tPmRwbWNwX2RldiA9IGRwbWNwX2RldjsKLQlkcG1jcF9kZXYtPm1jX2lvID0gbWNfaW87Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfaW9fc2V0X2RwbWNwKTsKLQotdm9pZCBmc2xfbWNfaW9fdW5zZXRfZHBtY3Aoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8pCi17Ci0JaW50IGVycm9yOwotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICpkcG1jcF9kZXYgPSBtY19pby0+ZHBtY3BfZGV2OwotCi0JaWYgKFdBUk5fT04oIWRwbWNwX2RldikpCi0JCXJldHVybjsKLQotCWlmIChXQVJOX09OKGRwbWNwX2Rldi0+bWNfaW8gIT0gbWNfaW8pKQotCQlyZXR1cm47Ci0KLQllcnJvciA9IGRwbWNwX2Nsb3NlKG1jX2lvLAotCQkJICAgIDAsCi0JCQkgICAgZHBtY3BfZGV2LT5tY19oYW5kbGUpOwotCWlmIChlcnJvciA8IDApIHsKLQkJZGV2X2VycigmZHBtY3BfZGV2LT5kZXYsICJkcG1jcF9jbG9zZSgpIGZhaWxlZDogJWRcbiIsCi0JCQllcnJvcik7Ci0JfQotCi0JbWNfaW8tPmRwbWNwX2RldiA9IE5VTEw7Ci0JZHBtY3BfZGV2LT5tY19pbyA9IE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfaW9fdW5zZXRfZHBtY3ApOwotCiBzdGF0aWMgaW50IG1jX3N0YXR1c190b19lcnJvcihlbnVtIG1jX2NtZF9zdGF0dXMgc3RhdHVzKQogewogCXN0YXRpYyBjb25zdCBpbnQgbWNfc3RhdHVzX3RvX2Vycm9yX21hcFtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL2RwYnAtY21kLmggYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvZHBicC1jbWQuaAppbmRleCA0ODI4Y2NkLi4yODYwNDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvZHBicC1jbWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvZHBicC1jbWQuaApAQCAtMSwzNCArMSwzNCBAQAogLyogQ29weXJpZ2h0IDIwMTMtMjAxNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0qICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCi0qIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0qIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotKgotKgotKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0qIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0qIGxhdGVyIHZlcnNpb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFCi0qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotKi8KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUKKyAqIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwogI2lmbmRlZiBfRlNMX0RQQlBfQ01EX0gKICNkZWZpbmUgX0ZTTF9EUEJQX0NNRF9ICiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9tYy1idXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9tYy1idXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzA2ODRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLWJ1cy5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogRnJlZXNjYWxlIE1hbmFnZW1lbnQgQ29tcGxleCAoTUMpIGJ1cyBkZWNsYXJhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIEF1dGhvcjogR2VybWFuIFJpdmVyYSA8R2VybWFuLlJpdmVyYUBmcmVlc2NhbGUuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKyNpZm5kZWYgX0ZTTF9NQ19NQ0JVU19IXworI2RlZmluZSBfRlNMX01DX01DQlVTX0hfCisKKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLmgiCisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKworc3RydWN0IGlycV9kb21haW47CitzdHJ1Y3QgbXNpX2RvbWFpbl9pbmZvOworCisvKioKKyAqIE1heGltdW0gbnVtYmVyIG9mIHRvdGFsIElSUXMgdGhhdCBjYW4gYmUgcHJlLWFsbG9jYXRlZCBmb3IgYW4gTUMgYnVzJworICogSVJRIHBvb2wKKyAqLworI2RlZmluZSBGU0xfTUNfSVJRX1BPT0xfTUFYX1RPVEFMX0lSUVMJMjU2CisKKyNpZmRlZiBDT05GSUdfRlNMX01DX0JVUworI2RlZmluZSBkZXZfaXNfZnNsX21jKF9kZXYpICgoX2RldiktPmJ1cyA9PSAmZnNsX21jX2J1c190eXBlKQorI2Vsc2UKKy8qIElmIGZzbC1tYyBidXMgaXMgbm90IHByZXNlbnQgZGV2aWNlIGNhbm5vdCBiZWxvbmcgdG8gZnNsLW1jIGJ1cyAqLworI2RlZmluZSBkZXZfaXNfZnNsX21jKF9kZXYpICgwKQorI2VuZGlmCisKKy8qKgorICogc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sIC0gUG9vbCBvZiBNQyByZXNvdXJjZXMgb2YgYSBnaXZlbgorICogdHlwZQorICogQHR5cGU6IHR5cGUgb2YgcmVzb3VyY2VzIGluIHRoZSBwb29sCisgKiBAbWF4X2NvdW50OiBtYXhpbXVtIG51bWJlciBvZiByZXNvdXJjZXMgaW4gdGhlIHBvb2wKKyAqIEBmcmVlX2NvdW50OiBudW1iZXIgb2YgZnJlZSByZXNvdXJjZXMgaW4gdGhlIHBvb2wKKyAqIEBtdXRleDogbXV0ZXggdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcG9vbCdzIGZyZWUgbGlzdAorICogQGZyZWVfbGlzdDogYW5jaG9yIG5vZGUgb2YgbGlzdCBvZiBmcmVlIHJlc291cmNlcyBpbiB0aGUgcG9vbAorICogQG1jX2J1czogcG9pbnRlciB0byB0aGUgTUMgYnVzIHRoYXQgb3ducyB0aGlzIHJlc291cmNlIHBvb2wKKyAqLworc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sIHsKKwllbnVtIGZzbF9tY19wb29sX3R5cGUgdHlwZTsKKwlpbnQxNl90IG1heF9jb3VudDsKKwlpbnQxNl90IGZyZWVfY291bnQ7CisJc3RydWN0IG11dGV4IG11dGV4OwkvKiBzZXJpYWxpemVzIGFjY2VzcyB0byBmcmVlX2xpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfbGlzdDsKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZnNsX21jX2J1cyAtIGxvZ2ljYWwgYnVzIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBwaHlzaWNhbCBEUFJDCisgKiBAbWNfZGV2OiBmc2wtbWMgZGV2aWNlIGZvciB0aGUgYnVzIGRldmljZSBpdHNlbGYuCisgKiBAcmVzb3VyY2VfcG9vbHM6IGFycmF5IG9mIHJlc291cmNlIHBvb2xzIChvbmUgcG9vbCBwZXIgcmVzb3VyY2UgdHlwZSkKKyAqIGZvciB0aGlzIE1DIGJ1cy4gVGhlc2UgcmVzb3VyY2VzIHJlcHJlc2VudCBhbGxvY2F0YWJsZSBlbnRpdGllcworICogZnJvbSB0aGUgcGh5c2ljYWwgRFBSQy4KKyAqIEBpcnFfcmVzb3VyY2VzOiBQb2ludGVyIHRvIGFycmF5IG9mIElSUSBvYmplY3RzIGZvciB0aGUgSVJRIHBvb2wKKyAqIEBzY2FuX211dGV4OiBTZXJpYWxpemVzIGJ1cyBzY2FubmluZworICogQGRwcmNfYXR0cjogRFBSQyBhdHRyaWJ1dGVzCisgKi8KK3N0cnVjdCBmc2xfbWNfYnVzIHsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSBtY19kZXY7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sIHJlc291cmNlX3Bvb2xzW0ZTTF9NQ19OVU1fUE9PTF9UWVBFU107CisJc3RydWN0IGZzbF9tY19kZXZpY2VfaXJxICppcnFfcmVzb3VyY2VzOworCXN0cnVjdCBtdXRleCBzY2FuX211dGV4OyAgICAvKiBzZXJpYWxpemVzIGJ1cyBzY2FubmluZyAqLworCXN0cnVjdCBkcHJjX2F0dHJpYnV0ZXMgZHByY19hdHRyOworfTsKKworI2RlZmluZSB0b19mc2xfbWNfYnVzKF9tY19kZXYpIFwKKwljb250YWluZXJfb2YoX21jX2Rldiwgc3RydWN0IGZzbF9tY19idXMsIG1jX2RldikKKworaW50IGRwcmNfc2Nhbl9jb250YWluZXIoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYpOworCitpbnQgZHByY19zY2FuX29iamVjdHMoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYsCisJCSAgICAgIHVuc2lnbmVkIGludCAqdG90YWxfaXJxX2NvdW50KTsKKworaW50IF9faW5pdCBkcHJjX2RyaXZlcl9pbml0KHZvaWQpOworCit2b2lkIGRwcmNfZHJpdmVyX2V4aXQodm9pZCk7CisKK2ludCBfX2luaXQgZnNsX21jX2FsbG9jYXRvcl9kcml2ZXJfaW5pdCh2b2lkKTsKKwordm9pZCBmc2xfbWNfYWxsb2NhdG9yX2RyaXZlcl9leGl0KHZvaWQpOworCitzdHJ1Y3QgaXJxX2RvbWFpbiAqZnNsX21jX21zaV9jcmVhdGVfaXJxX2RvbWFpbihzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlLAorCQkJCQkJc3RydWN0IG1zaV9kb21haW5faW5mbyAqaW5mbywKKwkJCQkJCXN0cnVjdCBpcnFfZG9tYWluICpwYXJlbnQpOworCitpbnQgZnNsX21jX2ZpbmRfbXNpX2RvbWFpbihzdHJ1Y3QgZGV2aWNlICptY19wbGF0Zm9ybV9kZXYsCisJCQkgICBzdHJ1Y3QgaXJxX2RvbWFpbiAqKm1jX21zaV9kb21haW4pOworCitpbnQgZnNsX21jX3BvcHVsYXRlX2lycV9wb29sKHN0cnVjdCBmc2xfbWNfYnVzICptY19idXMsCisJCQkgICAgIHVuc2lnbmVkIGludCBpcnFfY291bnQpOworCit2b2lkIGZzbF9tY19jbGVhbnVwX2lycV9wb29sKHN0cnVjdCBmc2xfbWNfYnVzICptY19idXMpOworCit2b2lkIGZzbF9tY19pbml0X2FsbF9yZXNvdXJjZV9wb29scyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2Rldik7CisKK3ZvaWQgZnNsX21jX2NsZWFudXBfYWxsX3Jlc291cmNlX3Bvb2xzKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2KTsKKworYm9vbCBmc2xfbWNfYnVzX2V4aXN0cyh2b2lkKTsKKwordm9pZCBmc2xfbWNfZ2V0X3Jvb3RfZHByYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBkZXZpY2UgKipyb290X2RwcmNfZGV2KTsKKworYm9vbCBmc2xfbWNfaXNfcm9vdF9kcHJjKHN0cnVjdCBkZXZpY2UgKmRldik7CisKK2V4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgZnNsX21jX2J1c190eXBlOworCisjZW5kaWYgLyogX0ZTTF9NQ19NQ0JVU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLXByaXZhdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9tYy1wcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYjFhZTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLXByaXZhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKgotICogRnJlZXNjYWxlIE1hbmFnZW1lbnQgQ29tcGxleCAoTUMpIGJ1cyBwcml2YXRlIGRlY2xhcmF0aW9ucwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgotICogQXV0aG9yOiBHZXJtYW4gUml2ZXJhIDxHZXJtYW4uUml2ZXJhQGZyZWVzY2FsZS5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqLwotI2lmbmRlZiBfRlNMX01DX1BSSVZBVEVfSF8KLSNkZWZpbmUgX0ZTTF9NQ19QUklWQVRFX0hfCi0KLSNpbmNsdWRlICIuLi9pbmNsdWRlL21jLmgiCi0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KLQotI2RlZmluZSBGU0xfTUNfRFBSQ19EUklWRVJfTkFNRSAgICAiZnNsX21jX2RwcmMiCi0KLSNkZWZpbmUgRlNMX01DX0RFVklDRV9NQVRDSChfbWNfZGV2LCBfb2JqX2Rlc2MpIFwKLQkoc3RyY21wKChfbWNfZGV2KS0+b2JqX2Rlc2MudHlwZSwgKF9vYmpfZGVzYyktPnR5cGUpID09IDAgJiYgXAotCSAoX21jX2RldiktPm9ial9kZXNjLmlkID09IChfb2JqX2Rlc2MpLT5pZCkKLQotI2RlZmluZSBGU0xfTUNfSVNfQUxMT0NBVEFCTEUoX29ial90eXBlKSBcCi0JKHN0cmNtcChfb2JqX3R5cGUsICJkcGJwIikgPT0gMCB8fCBcCi0JIHN0cmNtcChfb2JqX3R5cGUsICJkcG1jcCIpID09IDAgfHwgXAotCSBzdHJjbXAoX29ial90eXBlLCAiZHBjb24iKSA9PSAwKQotCi1zdHJ1Y3QgaXJxX2RvbWFpbjsKLXN0cnVjdCBtc2lfZG9tYWluX2luZm87Ci0KLS8qKgotICogTWF4aW11bSBudW1iZXIgb2YgdG90YWwgSVJRcyB0aGF0IGNhbiBiZSBwcmUtYWxsb2NhdGVkIGZvciBhbiBNQyBidXMnCi0gKiBJUlEgcG9vbAotICovCi0jZGVmaW5lIEZTTF9NQ19JUlFfUE9PTF9NQVhfVE9UQUxfSVJRUwkyNTYKLQotc3RydWN0IGRldmljZV9ub2RlOwotc3RydWN0IGlycV9kb21haW47Ci1zdHJ1Y3QgbXNpX2RvbWFpbl9pbmZvOwotCi0vKioKLSAqIHN0cnVjdCBmc2xfbWMgLSBQcml2YXRlIGRhdGEgb2YgYSAiZnNsLHFvcmlxLW1jIiBwbGF0Zm9ybSBkZXZpY2UKLSAqIEByb290X21jX2J1c19kZXY6IE1DIG9iamVjdCBkZXZpY2UgcmVwcmVzZW50aW5nIHRoZSByb290IERQUkMKLSAqIEBudW1fdHJhbnNsYXRpb25fcmFuZ2VzOiBudW1iZXIgb2YgZW50cmllcyBpbiBhZGRyX3RyYW5zbGF0aW9uX3JhbmdlcwotICogQHRyYW5zbGF0aW9uX3JhbmdlczogYXJyYXkgb2YgYnVzIHRvIHN5c3RlbSBhZGRyZXNzIHRyYW5zbGF0aW9uIHJhbmdlcwotICovCi1zdHJ1Y3QgZnNsX21jIHsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqcm9vdF9tY19idXNfZGV2OwotCXU4IG51bV90cmFuc2xhdGlvbl9yYW5nZXM7Ci0Jc3RydWN0IGZzbF9tY19hZGRyX3RyYW5zbGF0aW9uX3JhbmdlICp0cmFuc2xhdGlvbl9yYW5nZXM7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBmc2xfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZSAtIGJ1cyB0byBzeXN0ZW0gYWRkcmVzcyB0cmFuc2xhdGlvbgotICogcmFuZ2UKLSAqIEBtY19yZWdpb25fdHlwZTogVHlwZSBvZiBNQyByZWdpb24gZm9yIHRoZSByYW5nZSBiZWluZyB0cmFuc2xhdGVkCi0gKiBAc3RhcnRfbWNfb2Zmc2V0OiBTdGFydCBNQyBvZmZzZXQgb2YgdGhlIHJhbmdlIGJlaW5nIHRyYW5zbGF0ZWQKLSAqIEBlbmRfbWNfb2Zmc2V0OiBNQyBvZmZzZXQgb2YgdGhlIGZpcnN0IGJ5dGUgYWZ0ZXIgdGhlIHJhbmdlIChsYXN0IE1DCi0gKiBvZmZzZXQgb2YgdGhlIHJhbmdlIGlzIGVuZF9tY19vZmZzZXQgLSAxKQotICogQHN0YXJ0X3BoeXNfYWRkcjogc3lzdGVtIHBoeXNpY2FsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byBzdGFydF9tY19hZGRyCi0gKi8KLXN0cnVjdCBmc2xfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZSB7Ci0JZW51bSBkcHJjX3JlZ2lvbl90eXBlIG1jX3JlZ2lvbl90eXBlOwotCXU2NCBzdGFydF9tY19vZmZzZXQ7Ci0JdTY0IGVuZF9tY19vZmZzZXQ7Ci0JcGh5c19hZGRyX3Qgc3RhcnRfcGh5c19hZGRyOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgLSBQb29sIG9mIE1DIHJlc291cmNlcyBvZiBhIGdpdmVuCi0gKiB0eXBlCi0gKiBAdHlwZTogdHlwZSBvZiByZXNvdXJjZXMgaW4gdGhlIHBvb2wKLSAqIEBtYXhfY291bnQ6IG1heGltdW0gbnVtYmVyIG9mIHJlc291cmNlcyBpbiB0aGUgcG9vbAotICogQGZyZWVfY291bnQ6IG51bWJlciBvZiBmcmVlIHJlc291cmNlcyBpbiB0aGUgcG9vbAotICogQG11dGV4OiBtdXRleCB0byBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBwb29sJ3MgZnJlZSBsaXN0Ci0gKiBAZnJlZV9saXN0OiBhbmNob3Igbm9kZSBvZiBsaXN0IG9mIGZyZWUgcmVzb3VyY2VzIGluIHRoZSBwb29sCi0gKiBAbWNfYnVzOiBwb2ludGVyIHRvIHRoZSBNQyBidXMgdGhhdCBvd25zIHRoaXMgcmVzb3VyY2UgcG9vbAotICovCi1zdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgewotCWVudW0gZnNsX21jX3Bvb2xfdHlwZSB0eXBlOwotCWludDE2X3QgbWF4X2NvdW50OwotCWludDE2X3QgZnJlZV9jb3VudDsKLQlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CS8qIHNlcmlhbGl6ZXMgYWNjZXNzIHRvIGZyZWVfbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9saXN0OwotCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXM7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBmc2xfbWNfYnVzIC0gbG9naWNhbCBidXMgdGhhdCBjb3JyZXNwb25kcyB0byBhIHBoeXNpY2FsIERQUkMKLSAqIEBtY19kZXY6IGZzbC1tYyBkZXZpY2UgZm9yIHRoZSBidXMgZGV2aWNlIGl0c2VsZi4KLSAqIEByZXNvdXJjZV9wb29sczogYXJyYXkgb2YgcmVzb3VyY2UgcG9vbHMgKG9uZSBwb29sIHBlciByZXNvdXJjZSB0eXBlKQotICogZm9yIHRoaXMgTUMgYnVzLiBUaGVzZSByZXNvdXJjZXMgcmVwcmVzZW50IGFsbG9jYXRhYmxlIGVudGl0aWVzCi0gKiBmcm9tIHRoZSBwaHlzaWNhbCBEUFJDLgotICogQGlycV9yZXNvdXJjZXM6IFBvaW50ZXIgdG8gYXJyYXkgb2YgSVJRIG9iamVjdHMgZm9yIHRoZSBJUlEgcG9vbAotICogQHNjYW5fbXV0ZXg6IFNlcmlhbGl6ZXMgYnVzIHNjYW5uaW5nCi0gKiBAZHByY19hdHRyOiBEUFJDIGF0dHJpYnV0ZXMKLSAqLwotc3RydWN0IGZzbF9tY19idXMgewotCXN0cnVjdCBmc2xfbWNfZGV2aWNlIG1jX2RldjsKLQlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgcmVzb3VyY2VfcG9vbHNbRlNMX01DX05VTV9QT09MX1RZUEVTXTsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZV9pcnEgKmlycV9yZXNvdXJjZXM7Ci0Jc3RydWN0IG11dGV4IHNjYW5fbXV0ZXg7ICAgIC8qIHNlcmlhbGl6ZXMgYnVzIHNjYW5uaW5nICovCi0Jc3RydWN0IGRwcmNfYXR0cmlidXRlcyBkcHJjX2F0dHI7Ci19OwotCi0jZGVmaW5lIHRvX2ZzbF9tY19idXMoX21jX2RldikgXAotCWNvbnRhaW5lcl9vZihfbWNfZGV2LCBzdHJ1Y3QgZnNsX21jX2J1cywgbWNfZGV2KQotCi1pbnQgX19tdXN0X2NoZWNrIGZzbF9tY19kZXZpY2VfYWRkKHN0cnVjdCBkcHJjX29ial9kZXNjICpvYmpfZGVzYywKLQkJCQkgICBzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKLQkJCQkgICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnRfZGV2LAotCQkJCSAgIHN0cnVjdCBmc2xfbWNfZGV2aWNlICoqbmV3X21jX2Rldik7Ci0KLXZvaWQgZnNsX21jX2RldmljZV9yZW1vdmUoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2Rldik7Ci0KLWludCBkcHJjX3NjYW5fY29udGFpbmVyKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2KTsKLQotaW50IGRwcmNfc2Nhbl9vYmplY3RzKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2LAotCQkgICAgICB1bnNpZ25lZCBpbnQgKnRvdGFsX2lycV9jb3VudCk7Ci0KLWludCBfX2luaXQgZHByY19kcml2ZXJfaW5pdCh2b2lkKTsKLQotdm9pZCBkcHJjX2RyaXZlcl9leGl0KHZvaWQpOwotCi1pbnQgX19pbml0IGZzbF9tY19hbGxvY2F0b3JfZHJpdmVyX2luaXQodm9pZCk7Ci0KLXZvaWQgZnNsX21jX2FsbG9jYXRvcl9kcml2ZXJfZXhpdCh2b2lkKTsKLQotaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfcmVzb3VyY2VfYWxsb2NhdGUoc3RydWN0IGZzbF9tY19idXMgKm1jX2J1cywKLQkJCQkJICBlbnVtIGZzbF9tY19wb29sX3R5cGUgcG9vbF90eXBlLAotCQkJCQkgIHN0cnVjdCBmc2xfbWNfcmVzb3VyY2UKLQkJCQkJCQkgICoqbmV3X3Jlc291cmNlKTsKLQotdm9pZCBmc2xfbWNfcmVzb3VyY2VfZnJlZShzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZSk7Ci0KLXN0cnVjdCBpcnFfZG9tYWluICpmc2xfbWNfbXNpX2NyZWF0ZV9pcnFfZG9tYWluKHN0cnVjdCBmd25vZGVfaGFuZGxlICpmd25vZGUsCi0JCQkJCQlzdHJ1Y3QgbXNpX2RvbWFpbl9pbmZvICppbmZvLAotCQkJCQkJc3RydWN0IGlycV9kb21haW4gKnBhcmVudCk7Ci0KLWludCBmc2xfbWNfZmluZF9tc2lfZG9tYWluKHN0cnVjdCBkZXZpY2UgKm1jX3BsYXRmb3JtX2RldiwKLQkJCSAgIHN0cnVjdCBpcnFfZG9tYWluICoqbWNfbXNpX2RvbWFpbik7Ci0KLWludCBmc2xfbWNfbXNpX2RvbWFpbl9hbGxvY19pcnFzKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgdW5zaWduZWQgaW50IGlycV9jb3VudCk7Ci0KLXZvaWQgZnNsX21jX21zaV9kb21haW5fZnJlZV9pcnFzKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0KLWludCBfX2luaXQgaXRzX2ZzbF9tY19tc2lfaW5pdCh2b2lkKTsKLQotdm9pZCBpdHNfZnNsX21jX21zaV9jbGVhbnVwKHZvaWQpOwotCi1pbnQgZnNsX21jX3BvcHVsYXRlX2lycV9wb29sKHN0cnVjdCBmc2xfbWNfYnVzICptY19idXMsCi0JCQkgICAgIHVuc2lnbmVkIGludCBpcnFfY291bnQpOwotCi12b2lkIGZzbF9tY19jbGVhbnVwX2lycV9wb29sKHN0cnVjdCBmc2xfbWNfYnVzICptY19idXMpOwotCi0jZW5kaWYgLyogX0ZTTF9NQ19QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvbWMtc3lzLmggYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvbWMtc3lzLmgKaW5kZXggYzUwMzhjYy4uODlhZDBjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLXN5cy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9tYy1zeXMuaApAQCAtMzcsOCArMzcsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKQEAgLTk1LDE5ICs5Myw2IEBACiAJfTsKIH07CiAKLWludCBfX211c3RfY2hlY2sgZnNsX2NyZWF0ZV9tY19pbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICBwaHlzX2FkZHJfdCBtY19wb3J0YWxfcGh5c19hZGRyLAotCQkJCSAgdTMyIG1jX3BvcnRhbF9zaXplLAotCQkJCSAgc3RydWN0IGZzbF9tY19kZXZpY2UgKmRwbWNwX2RldiwKLQkJCQkgIHUzMiBmbGFncywgc3RydWN0IGZzbF9tY19pbyAqKm5ld19tY19pbyk7Ci0KLXZvaWQgZnNsX2Rlc3Ryb3lfbWNfaW8oc3RydWN0IGZzbF9tY19pbyAqbWNfaW8pOwotCi1pbnQgZnNsX21jX2lvX3NldF9kcG1jcChzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKLQkJCXN0cnVjdCBmc2xfbWNfZGV2aWNlICpkcG1jcF9kZXYpOwotCi12b2lkIGZzbF9tY19pb191bnNldF9kcG1jcChzdHJ1Y3QgZnNsX21jX2lvICptY19pbyk7Ci0KIGludCBtY19zZW5kX2NvbW1hbmQoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIHN0cnVjdCBtY19jb21tYW5kICpjbWQpOwogCiAjZW5kaWYgLyogX0ZTTF9NQ19TWVNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLmggYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvbWMuaAppbmRleCA4NTNjYmYzLi5mNmU3MjBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvbWMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvbWMuaApAQCAtMTMsNyArMTMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZHByYy5oIgogCkBAIC0yMSw3ICsyMCw2IEBACiAKIHN0cnVjdCBmc2xfbWNfZGV2aWNlOwogc3RydWN0IGZzbF9tY19pbzsKLXN0cnVjdCBmc2xfbWNfYnVzOwogCiAvKioKICAqIHN0cnVjdCBmc2xfbWNfZHJpdmVyIC0gTUMgb2JqZWN0IGRldmljZSBkcml2ZXIgb2JqZWN0CkBAIC0xMTIsMTEgKzExMCw2IEBACiAjZGVmaW5lIEZTTF9NQ19JU19EUFJDCTB4MDAwMQogCiAvKioKLSAqIERlZmF1bHQgRE1BIG1hc2sgZm9yIGRldmljZXMgb24gYSBmc2wtbWMgYnVzCi0gKi8KLSNkZWZpbmUgRlNMX01DX0RFRkFVTFRfRE1BX01BU0sJKH4wVUxMKQotCi0vKioKICAqIHN0cnVjdCBmc2xfbWNfZGV2aWNlIC0gTUMgb2JqZWN0IGRldmljZSBvYmplY3QKICAqIEBkZXY6IExpbnV4IGRyaXZlciBtb2RlbCBkZXZpY2Ugb2JqZWN0CiAgKiBAZG1hX21hc2s6IERlZmF1bHQgRE1BIG1hc2sKQEAgLTE4Nyw4ICsxODAsNiBAQAogCiB2b2lkIGZzbF9tY19kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgZnNsX21jX2RyaXZlciAqZHJpdmVyKTsKIAotYm9vbCBmc2xfbWNfYnVzX2V4aXN0cyh2b2lkKTsKLQogaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfcG9ydGFsX2FsbG9jYXRlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYsCiAJCQkJCXUxNiBtY19pb19mbGFncywKIAkJCQkJc3RydWN0IGZzbF9tY19pbyAqKm5ld19tY19pbyk7CkBAIC0yMDcsOCArMTk4LDQgQEAKIAogdm9pZCBmc2xfbWNfZnJlZV9pcnFzKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYpOwogCi1ib29sIGZzbF9tY19pc19yb290X2RwcmMoc3RydWN0IGRldmljZSAqZGV2KTsKLQotZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBmc2xfbWNfYnVzX3R5cGU7Ci0KICNlbmRpZiAvKiBfRlNMX01DX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZndzZXJpYWwvZndzZXJpYWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9md3NlcmlhbC9md3NlcmlhbC5jCmluZGV4IGMyNDFjMGEuLjQ5YzcxOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9md3NlcmlhbC9md3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9md3NlcmlhbC9md3NlcmlhbC5jCkBAIC0zOSw5ICszOSw5IEBACiBzdGF0aWMgYm9vbCBhdXRvX2Nvbm5lY3QgPSB0cnVlOyAgICAvKiB0cnkgdG8gVklSVF9DQUJMRSB0byBldmVyeSBwZWVyICAgICAgICAqLwogc3RhdGljIGJvb2wgY3JlYXRlX2xvb3BfZGV2ID0gdHJ1ZTsgLyogY3JlYXRlIGEgbG9vcGJhY2sgZGV2aWNlIGZvciBlYWNoIGNhcmQgKi8KIAotbW9kdWxlX3BhcmFtX25hbWVkKHR0eXMsIG51bV90dHlzLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKLW1vZHVsZV9wYXJhbV9uYW1lZChhdXRvLCBhdXRvX2Nvbm5lY3QsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKLW1vZHVsZV9wYXJhbV9uYW1lZChsb29wLCBjcmVhdGVfbG9vcF9kZXYsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbV9uYW1lZCh0dHlzLCBudW1fdHR5cywgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbV9uYW1lZChhdXRvLCBhdXRvX2Nvbm5lY3QsIGJvb2wsIDA2NDQpOworbW9kdWxlX3BhcmFtX25hbWVkKGxvb3AsIGNyZWF0ZV9sb29wX2RldiwgYm9vbCwgMDY0NCk7CiAKIC8qCiAgKiBUaHJlc2hvbGQgYmVsb3cgd2hpY2ggdGhlIHR0eSBpcyB3b2tlbiBmb3Igd3JpdGluZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX2x0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX2x0ZS5jCmluZGV4IGJiNTUyMTkuLmU3MmRmYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9sdGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbHRlLmMKQEAgLTgyOCw3ICs4MjgsNyBAQAogCQkJCXJ4X2NvbXBsZXRlLCBwaHlfZGV2LCBVU0JfQ09NUExFVEUpOwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGdkbV9uZXRkZXZfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBnZG1fbmV0ZGV2X29wcyA9IHsKIAkubmRvX29wZW4JCQk9IGdkbV9sdGVfb3BlbiwKIAkubmRvX3N0b3AJCQk9IGdkbV9sdGVfY2xvc2UsCiAJLm5kb19zZXRfY29uZmlnCQkJPSBnZG1fbHRlX3NldF9jb25maWcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbXV4LmggYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbXV4LmgKaW5kZXggM2Q1MDM4My4uMDg3MWI4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX211eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9tdXguaApAQCAtMjcsOCArMjcsOCBAQAogCiAjZGVmaW5lIFNUQVJUX0ZMQUcgMHhBNTEyNDg1QQogI2RlZmluZSBNVVhfSEVBREVSX1NJWkUgMTQKLSNkZWZpbmUgTVVYX1RYX01BWF9TSVpFICgxMDI0KjEwKQotI2RlZmluZSBNVVhfUlhfTUFYX1NJWkUgKDEwMjQqMzApCisjZGVmaW5lIE1VWF9UWF9NQVhfU0laRSAoMTAyNCAqIDEwKQorI2RlZmluZSBNVVhfUlhfTUFYX1NJWkUgKDEwMjQgKiAzMCkKICNkZWZpbmUgQVRfUEtUX1RZUEUgMHhGMDExCiAjZGVmaW5lIERNX1BLVF9UWVBFIDB4RjAxMAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fdHR5LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fdHR5LmMKaW5kZXggZWI3ZTI1Mi4uYWUzOTY2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX3R0eS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV90dHkuYwpAQCAtMjI1LDcgKzIyNSw2IEBACiAJaW50IGo7CiAKIAlmb3IgKGkgPSAwOyBpIDwgVFRZX01BWF9DT1VOVDsgaSsrKSB7Ci0KIAkJZ2RtID0ga21hbGxvYyhzaXplb2YoKmdkbSksIEdGUF9LRVJORUwpOwogCQlpZiAoIWdkbSkKIAkJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX3VzYi5jCmluZGV4IGQ2NTBkNzcuLjE1YTdlODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV91c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fdXNiLmMKQEAgLTQxNSwxMCArNDE1LDEwIEBACiAJCXN3aXRjaCAoY21kX2V2dCkgewogCQljYXNlIExURV9HRVRfSU5GT1JNQVRJT05fUkVTVUxUOgogCQkJaWYgKHNldF9tYWNfYWRkcmVzcyhoY2ktPmRhdGEsIHItPmNiX2RhdGEpID09IDApIHsKLQkJCQlyZXQgPSByLT5jYWxsYmFjayhyLT5jYl9kYXRhLAotCQkJCQkJICByLT5idWYsCi0JCQkJCQkgIHItPnVyYi0+YWN0dWFsX2xlbmd0aCwKLQkJCQkJCSAgS0VSTkVMX1RIUkVBRCk7CisJCQkJci0+Y2FsbGJhY2soci0+Y2JfZGF0YSwKKwkJCQkJICAgIHItPmJ1ZiwKKwkJCQkJICAgIHItPnVyYi0+YWN0dWFsX2xlbmd0aCwKKwkJCQkJICAgIEtFUk5FTF9USFJFQUQpOwogCQkJfQogCQkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV91c2IuaCBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV91c2IuaAppbmRleCBlNjQ4NmU3Li5mZmIzZDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fdXNiLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX3VzYi5oCkBAIC0yNiwxMCArMjYsMTAgQEAKICNkZWZpbmUgUE1fU1VTUEVORCAxCiAjZGVmaW5lIEFVVE9fU1VTUEVORF9USU1FUiA1MDAwIC8qIG1zICovCiAKLSNkZWZpbmUgUlhfQlVGX1NJWkUJCSgxMDI0KjMyKQotI2RlZmluZSBUWF9CVUZfU0laRQkJKDEwMjQqMzIpCisjZGVmaW5lIFJYX0JVRl9TSVpFCQkoMTAyNCAqIDMyKQorI2RlZmluZSBUWF9CVUZfU0laRQkJKDEwMjQgKiAzMikKICNkZWZpbmUgU0RVX0JVRl9TSVpFCTIwNDgKLSNkZWZpbmUgTUFYX1NEVV9TSVpFCSgxMDI0KjMwKQorI2RlZmluZSBNQVhfU0RVX1NJWkUJKDEwMjQgKiAzMCkKICNkZWZpbmUgTUFYX1BBQ0tFVF9JTl9NVUxUSV9TRFUJMjU2CiAKICNkZWZpbmUgVklEX0dDVAkJCTB4MTA3NgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvaGNpX3BhY2tldC5oIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvaGNpX3BhY2tldC5oCmluZGV4IGRiYzQ0NDYuLjQ2NDRmODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2hjaV9wYWNrZXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9oY2lfcGFja2V0LmgKQEAgLTg5LDUgKzg5LDQgQEAKIAl1MzIgY29ubmVjdDsKIH0gX19wYWNrZWQ7CiAKLQogI2VuZGlmIC8qIF9IQ0lfUEFDS0VUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9uZXRsaW5rX2suYyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L25ldGxpbmtfay5jCmluZGV4IGEwMjMyZTguLmFiZTI0MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L25ldGxpbmtfay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L25ldGxpbmtfay5jCkBAIC0xNCw2ICsxNCw3IEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KQEAgLTIxLDEzICsyMiw3IEBACiAKICNpbmNsdWRlICJuZXRsaW5rX2suaCIKIAotI2lmIGRlZmluZWQoREVGSU5FX01VVEVYKQogc3RhdGljIERFRklORV9NVVRFWChuZXRsaW5rX211dGV4KTsKLSNlbHNlCi1zdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBuZXRsaW5rX211dGV4OwotI2RlZmluZSBtdXRleF9sb2NrKHgpCQlkb3duKHgpCi0jZGVmaW5lIG11dGV4X3VubG9jayh4KQkJdXAoeCkKLSNlbmRpZgogCiAjZGVmaW5lIE5EX01BWF9HUk9VUAkJMzAKICNkZWZpbmUgTkRfSUZJTkRFWF9MRU4JCXNpemVvZihpbnQpCkBAIC05NiwxMCArOTEsNiBAQAogCQkuaW5wdXQgID0gbmV0bGlua19yY3YsCiAJfTsKIAotI2lmICFkZWZpbmVkKERFRklORV9NVVRFWCkKLQlpbml0X01VVEVYKCZuZXRsaW5rX211dGV4KTsKLSNlbmRpZgotCiAJc29jayA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZSgmaW5pdF9uZXQsIHVuaXQsICZjZmcpOwogCiAJaWYgKHNvY2spCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9Eb2N1bWVudGF0aW9uL2Zpcm13YXJlL2F1dGhlbnRpY2F0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvRG9jdW1lbnRhdGlvbi9maXJtd2FyZS9hdXRoZW50aWNhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjA2ODhhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvRG9jdW1lbnRhdGlvbi9maXJtd2FyZS9hdXRoZW50aWNhdGUuYwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIFNhbXBsZSBjb2RlIHRvIHRlc3QgQ0FQIHByb3RvY29sCisgKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMTYgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDE2IExpbmFybyBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDE2IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQoYykgMjAxNiBMaW5hcm8gTHRkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG9yIExpbmFybyBMdGQuIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEdPT0dMRSBJTkMuIE9SCisgKiBMSU5BUk8gTFRELiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICIuLi8uLi9ncmV5YnVzX2F1dGhlbnRpY2F0aW9uLmgiCisKK3N0cnVjdCBjYXBfaW9jX2dldF9lbmRwb2ludF91aWQgdWlkOworc3RydWN0IGNhcF9pb2NfZ2V0X2ltc19jZXJ0aWZpY2F0ZSBjZXJ0ID0geworCS5jZXJ0aWZpY2F0ZV9jbGFzcyA9IDAsCisJLmNlcnRpZmljYXRlX2lkID0gMCwKK307CisKK3N0cnVjdCBjYXBfaW9jX2F1dGhlbnRpY2F0ZSBhdXRoZW50aWNhdGUgPSB7CisJLmF1dGhfdHlwZSA9IDAsCisJLmNoYWxsZW5nZSA9IHswfSwKK307CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdW5zaWduZWQgaW50IHRpbWVvdXQgPSAxMDAwMDsKKwljaGFyICpjYXBkZXY7CisJaW50IGZkLCByZXQ7CisKKwkvKiBNYWtlIHN1cmUgYXJndW1lbnRzIGFyZSBjb3JyZWN0ICovCisJaWYgKGFyZ2MgIT0gMikgeworCQlwcmludGYoIlxuVXNhZ2U6IC4vZmlybXdhcmUgPFBhdGggb2YgdGhlIGdiLWNhcC1YIGRldj5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljYXBkZXYgPSBhcmd2WzFdOworCisJcHJpbnRmKCJPcGVuaW5nICVzIGF1dGhlbnRpY2F0aW9uIGRldmljZVxuIiwgY2FwZGV2KTsKKworCWZkID0gb3BlbihjYXBkZXYsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkgeworCQlwcmludGYoIkZhaWxlZCB0byBvcGVuOiAlc1xuIiwgY2FwZGV2KTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEdldCBVSUQgKi8KKwlwcmludGYoIkdldCBVSURcbiIpOworCisJcmV0ID0gaW9jdGwoZmQsIENBUF9JT0NfR0VUX0VORFBPSU5UX1VJRCwgJnVpZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRmKCJGYWlsZWQgdG8gZ2V0IFVJRDogJXMgKCVkKVxuIiwgY2FwZGV2LCByZXQpOworCQlyZXQgPSAtMTsKKwkJZ290byBjbG9zZV9mZDsKKwl9CisKKwlwcmludGYoIlVJRCByZWNlaXZlZDogMHglbGx4XG4iLCAqKGxvbmcgbG9uZyB1bnNpZ25lZCBpbnQgKikodWlkLnVpZCkpOworCisJLyogR2V0IGNlcnRpZmljYXRlICovCisJcHJpbnRmKCJHZXQgSU1TIGNlcnRpZmljYXRlXG4iKTsKKworCXJldCA9IGlvY3RsKGZkLCBDQVBfSU9DX0dFVF9JTVNfQ0VSVElGSUNBVEUsICZjZXJ0KTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGYoIkZhaWxlZCB0byBnZXQgSU1TIGNlcnRpZmljYXRlOiAlcyAoJWQpXG4iLCBjYXBkZXYsIHJldCk7CisJCXJldCA9IC0xOworCQlnb3RvIGNsb3NlX2ZkOworCX0KKworCXByaW50ZigiSU1TIENlcnRpZmljYXRlIHNpemU6ICVkXG4iLCBjZXJ0LmNlcnRfc2l6ZSk7CisKKwkvKiBBdXRoZW50aWNhdGUgKi8KKwlwcmludGYoIkF1dGhlbnRpY2F0ZSBtb2R1bGVcbiIpOworCisJbWVtY3B5KGF1dGhlbnRpY2F0ZS51aWQsIHVpZC51aWQsIDgpOworCisJcmV0ID0gaW9jdGwoZmQsIENBUF9JT0NfQVVUSEVOVElDQVRFLCAmYXV0aGVudGljYXRlKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGYoIkZhaWxlZCB0byBhdXRoZW50aWNhdGUgbW9kdWxlOiAlcyAoJWQpXG4iLCBjYXBkZXYsIHJldCk7CisJCXJldCA9IC0xOworCQlnb3RvIGNsb3NlX2ZkOworCX0KKworCXByaW50ZigiQXV0aGVudGljYXRlZCwgcmVzdWx0ICglMDJ4KSwgc2lnLXNpemUgKCUwMngpXG4iLAorCQlhdXRoZW50aWNhdGUucmVzdWx0X2NvZGUsIGF1dGhlbnRpY2F0ZS5zaWduYXR1cmVfc2l6ZSk7CisKK2Nsb3NlX2ZkOgorCWNsb3NlKGZkKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9Eb2N1bWVudGF0aW9uL2Zpcm13YXJlL2Zpcm13YXJlLW1hbmFnZW1lbnQgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9Eb2N1bWVudGF0aW9uL2Zpcm13YXJlL2Zpcm13YXJlLW1hbmFnZW1lbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxODI1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL0RvY3VtZW50YXRpb24vZmlybXdhcmUvZmlybXdhcmUtbWFuYWdlbWVudApAQCAtMCwwICsxLDMzMyBAQAorCitGaXJtd2FyZSBNYW5hZ2VtZW50CistLS0tLS0tLS0tLS0tLS0tLS0tCisgQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4KKyBDb3B5cmlnaHQgMjAxNiBMaW5hcm8gTHRkLgorCitJbnRlcmZhY2UtTWFuaWZlc3QKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitBbGwgZmlybXdhcmUgcGFja2FnZXMgb24gdGhlIE1vZHVsZXMgb3IgSW50ZXJmYWNlcyBhcmUgbWFuYWdlZCBieSBhIHNwZWNpYWwKK0Zpcm13YXJlIE1hbmFnZW1lbnQgUHJvdG9jb2wuIFRvIHN1cHBvcnQgRmlybXdhcmUgTWFuYWdlbWVudCBieSB0aGUgQVAsIHRoZQorSW50ZXJmYWNlIE1hbmlmZXN0IHNoYWxsIGF0IGxlYXN0IGNvbnRhaW4gdGhlIEZpcm13YXJlIE1hbmFnZW1lbnQgQnVuZGxlIGFuZCBhCitGaXJtd2FyZSBNYW5hZ2VtZW50IFByb3RvY29sIENQb3J0IHdpdGhpbiBpdC4KKworVGhlIGJ1bmRsZSBtYXkgY29udGFpbiBhZGRpdGlvbmFsIENQb3J0cyBiYXNlZCBvbiB0aGUgZXh0cmEgZnVuY3Rpb25hbGl0eQorcmVxdWlyZWQgdG8gbWFuYWdlIGZpcm13YXJlIHBhY2thZ2VzLgorCitGb3IgZXhhbXBsZSwgdGhpcyBpcyBob3cgdGhlIEZpcm13YXJlIE1hbmFnZW1lbnQgcGFydCBvZiB0aGUgSW50ZXJmYWNlIE1hbmlmZXN0CittYXkgbG9vayBsaWtlOgorCisJOyBGaXJtd2FyZSBNYW5hZ2VtZW50IEJ1bmRsZSAoQnVuZGxlIDEpOgorCVtidW5kbGUtZGVzY3JpcHRvciAxXQorCWNsYXNzID0gMHgxNgorCisJOyAoTWFuZGF0b3J5KSBGaXJtd2FyZSBNYW5hZ2VtZW50IFByb3RvY29sIG9uIENQb3J0IDEKKwlbY3BvcnQtZGVzY3JpcHRvciAyXQorCWJ1bmRsZSA9IDEKKwlwcm90b2NvbCA9IDB4MTgKKworCTsgKE9wdGlvbmFsKSBGaXJtd2FyZSBEb3dubG9hZCBQcm90b2NvbCBvbiBDUG9ydCAyCisJW2Nwb3J0LWRlc2NyaXB0b3IgMV0KKwlidW5kbGUgPSAxCisJcHJvdG9jb2wgPSAweDE3CisKKwk7IChPcHRpb25hbCkgU1BJIHByb3RvY29sIG9uIENQb3J0IDMKKwlbY3BvcnQtZGVzY3JpcHRvciAzXQorCWJ1bmRsZSA9IDEKKwlwcm90b2NvbCA9IDB4MGIKKworCTsgKE9wdGlvbmFsKSBDb21wb25lbnQgQXV0aGVudGljYXRpb24gUHJvdG9jb2wgKENBUCkgb24gQ1BvcnQgNAorCVtjcG9ydC1kZXNjcmlwdG9yIDRdCisJYnVuZGxlID0gMQorCXByb3RvY29sID0gMHgxOQorCisKK1N5c2ZzIEludGVyZmFjZXMgLSBGaXJtd2FyZSBNYW5hZ2VtZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgRmlybXdhcmUgTWFuYWdlbWVudCBQcm90b2NvbCBpbnRlcmFjdHMgd2l0aCBVc2Vyc3BhY2UgdXNpbmcgdGhlIGNoYXJhY3RlcgorZGV2aWNlIGludGVyZmFjZS4gVGhlIGNoYXJhY3RlciBkZXZpY2Ugd2lsbCBiZSBwcmVzZW50IGluIC9kZXYvIGRpcmVjdG9yeQorYW5kIHdpbGwgYmUgbmFtZWQgZ2ItZnctbWdtdC08Tj4uIFRoZSBudW1iZXIgPE4+IGlzIGFzc2lnbmVkIGF0IHJ1bnRpbWUuCisKK0lkZW50aWZ5aW5nIHRoZSBDaGFyYWN0ZXIgRGV2aWNlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGVyZSBjYW4gYmUgbXVsdGlwbGUgZGV2aWNlcyBwcmVzZW50IGluIC9kZXYvIGRpcmVjdG9yeSB3aXRoIG5hbWUgZ2ItZnctbWdtdC1OCithbmQgdXNlciBmaXJzdCBuZWVkcyB0byBpZGVudGlmeSB0aGUgY2hhcmFjdGVyIGRldmljZSB1c2VkIGZvcgorZmlybXdhcmUtbWFuYWdlbWVudCBmb3IgYSBwYXJ0aWN1bGFyIGludGVyZmFjZS4KKworVGhlIEZpcm13YXJlIE1hbmFnZW1lbnQgY29yZSBjcmVhdGVzIGEgZGV2aWNlIG9mIGNsYXNzICdnYl9md19tZ210Jywgd2hpY2ggc2hhbGwKK2JlIHVzZWQgYnkgdGhlIHVzZXIgdG8gaWRlbnRpZnkgdGhlIHJpZ2h0IGNoYXJhY3RlciBkZXZpY2UgZm9yIGl0LiBUaGUgY2xhc3MKK2RldmljZSBpcyBjcmVhdGVkIHdpdGhpbiB0aGUgQnVuZGxlIGRpcmVjdG9yeSBmb3IgYSBwYXJ0aWN1bGFyIEludGVyZmFjZS4KKworRm9yIGV4YW1wbGUgdGhpcyBpcyBob3cgdGhlIGNsYXNzLWRldmljZSBjYW4gYmUgcHJlc2VudDoKKworL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMS8xLTEuMS8xLTEuMS4xL2diX2Z3X21nbXQvZ2ItZnctbWdtdC0wCisKK1RoZSBsYXN0IG5hbWUgaW4gdGhpcyBwYXRoOiBnYi1mdy1tZ210LTAgaXMgcHJlY2lzZWx5IHRoZSBuYW1lIG9mIHRoZSBjaGFyCitkZXZpY2UgYW5kIHNvIHRoZSBkZXZpY2UgaW4gdGhpcyBjYXNlIHdpbGwgYmU6CisKKy9kZXYvZ2ItZnctbWdtdC0wLgorCitPcGVyYXRpb25zIG9uIHRoZSBDaGFyIGRldmljZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIENoYXJhY3RlciBkZXZpY2UgKGdiLWZ3LW1nbXQtMCBpbiBleGFtcGxlKSBjYW4gYmUgb3BlbmVkIGJ5IHRoZSB1c2Vyc3BhY2UKK2FwcGxpY2F0aW9uIGFuZCBpdCBjYW4gcGVyZm9ybSB2YXJpb3VzICdpb2N0bCcgb3BlcmF0aW9ucyBvbiB0aGUgZGV2aWNlLiBUaGUKK2RldmljZSBkb2Vzbid0IHN1cHBvcnQgYW55IHJlYWQvd3JpdGUgb3BlcmF0aW9ucy4KKworRm9sbG93aW5nIGFyZSB0aGUgSU9DVExzIGFuZCB0aGVpciBkYXRhIHN0cnVjdHVyZXMgYXZhaWxhYmxlIHRvIHRoZSB1c2VyOgorCisvKiBJT0NUTCBzdXBwb3J0ICovCisjZGVmaW5lIEdCX0ZXX0xPQURfTUVUSE9EX1VOSVBSTwkJMHgwMQorI2RlZmluZSBHQl9GV19MT0FEX01FVEhPRF9JTlRFUk5BTAkJMHgwMgorCisjZGVmaW5lIEdCX0ZXX0xPQURfU1RBVFVTX0ZBSUxFRAkJMHgwMAorI2RlZmluZSBHQl9GV19MT0FEX1NUQVRVU19VTlZBTElEQVRFRAkJMHgwMQorI2RlZmluZSBHQl9GV19MT0FEX1NUQVRVU19WQUxJREFURUQJCTB4MDIKKyNkZWZpbmUgR0JfRldfTE9BRF9TVEFUVVNfVkFMSURBVElPTl9GQUlMRUQJMHgwMworCisjZGVmaW5lIEdCX0ZXX0JBQ0tFTkRfRldfU1RBVFVTX1NVQ0NFU1MJCTB4MDEKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9GV19TVEFUVVNfRkFJTF9GSU5ECTB4MDIKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9GV19TVEFUVVNfRkFJTF9GRVRDSAkweDAzCisjZGVmaW5lIEdCX0ZXX0JBQ0tFTkRfRldfU1RBVFVTX0ZBSUxfV1JJVEUJMHgwNAorI2RlZmluZSBHQl9GV19CQUNLRU5EX0ZXX1NUQVRVU19JTlQJCTB4MDUKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9GV19TVEFUVVNfUkVUUlkJCTB4MDYKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9GV19TVEFUVVNfTk9UX1NVUFBPUlRFRAkweDA3CisKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9WRVJTSU9OX1NUQVRVU19TVUNDRVNTCQkweDAxCisjZGVmaW5lIEdCX0ZXX0JBQ0tFTkRfVkVSU0lPTl9TVEFUVVNfTk9UX0FWQUlMQUJMRQkweDAyCisjZGVmaW5lIEdCX0ZXX0JBQ0tFTkRfVkVSU0lPTl9TVEFUVVNfTk9UX1NVUFBPUlRFRAkweDAzCisjZGVmaW5lIEdCX0ZXX0JBQ0tFTkRfVkVSU0lPTl9TVEFUVVNfUkVUUlkJCTB4MDQKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9WRVJTSU9OX1NUQVRVU19GQUlMX0lOVAkJMHgwNQorCisKK3N0cnVjdCBmd19tZ210X2lvY19nZXRfaW50Zl92ZXJzaW9uIHsKKwlfX3U4IGZpcm13YXJlX3RhZ1tHQl9GSVJNV0FSRV9VX1RBR19NQVhfU0laRV07CisJX191MTYgbWFqb3I7CisJX191MTYgbWlub3I7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBmd19tZ210X2lvY19nZXRfYmFja2VuZF92ZXJzaW9uIHsKKwlfX3U4IGZpcm13YXJlX3RhZ1tHQl9GSVJNV0FSRV9VX1RBR19NQVhfU0laRV07CisJX191MTYgbWFqb3I7CisJX191MTYgbWlub3I7CisJX191OCBzdGF0dXM7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBmd19tZ210X2lvY19pbnRmX2xvYWRfYW5kX3ZhbGlkYXRlIHsKKwlfX3U4CQkJZmlybXdhcmVfdGFnW0dCX0ZJUk1XQVJFX1RBR19NQVhfU0laRV07CisJX191OAkJCWxvYWRfbWV0aG9kOworCV9fdTgJCQlzdGF0dXM7CisJX191MTYJCQltYWpvcjsKKwlfX3UxNgkJCW1pbm9yOworfSBfX3BhY2tlZDsKKworc3RydWN0IGZ3X21nbXRfaW9jX2JhY2tlbmRfZndfdXBkYXRlIHsKKwlfX3U4CQkJZmlybXdhcmVfdGFnW0dCX0ZJUk1XQVJFX1RBR19NQVhfU0laRV07CisJX191OAkJCXN0YXR1czsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgRldfTUdNVF9JT0NUTF9CQVNFCQkJJ1MnCisjZGVmaW5lIEZXX01HTVRfSU9DX0dFVF9JTlRGX0ZXCQkJX0lPUihGV19NR01UX0lPQ1RMX0JBU0UsIDAsIHN0cnVjdCBmd19tZ210X2lvY19nZXRfaW50Zl92ZXJzaW9uKQorI2RlZmluZSBGV19NR01UX0lPQ19HRVRfQkFDS0VORF9GVwkJX0lPV1IoRldfTUdNVF9JT0NUTF9CQVNFLCAxLCBzdHJ1Y3QgZndfbWdtdF9pb2NfZ2V0X2JhY2tlbmRfdmVyc2lvbikKKyNkZWZpbmUgRldfTUdNVF9JT0NfSU5URl9MT0FEX0FORF9WQUxJREFURQlfSU9XUihGV19NR01UX0lPQ1RMX0JBU0UsIDIsIHN0cnVjdCBmd19tZ210X2lvY19pbnRmX2xvYWRfYW5kX3ZhbGlkYXRlKQorI2RlZmluZSBGV19NR01UX0lPQ19JTlRGX0JBQ0tFTkRfRldfVVBEQVRFCV9JT1dSKEZXX01HTVRfSU9DVExfQkFTRSwgMywgc3RydWN0IGZ3X21nbXRfaW9jX2JhY2tlbmRfZndfdXBkYXRlKQorI2RlZmluZSBGV19NR01UX0lPQ19TRVRfVElNRU9VVF9NUwkJX0lPVyhGV19NR01UX0lPQ1RMX0JBU0UsIDQsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgRldfTUdNVF9JT0NfTU9ERV9TV0lUQ0gJCQlfSU8oRldfTUdNVF9JT0NUTF9CQVNFLCA1KQorCisxLiBGV19NR01UX0lPQ19HRVRfSU5URl9GVzoKKworICAgVGhpcyBpb2N0bCBzaGFsbCBiZSB1c2VkIGJ5IHRoZSB1c2VyIHRvIGdldCB0aGUgdmVyc2lvbiBhbmQgZmlybXdhcmUtdGFnIG9mCisgICB0aGUgY3VycmVudGx5IHJ1bm5pbmcgSW50ZXJmYWNlIEZpcm13YXJlLiBBbGwgdGhlIGZpZWxkcyBvZiB0aGUgJ3N0cnVjdAorICAgZndfbWdtdF9pb2NfZ2V0X2Z3JyBhcmUgZmlsbGVkIGJ5IHRoZSBrZXJuZWwuCisKKzIuIEZXX01HTVRfSU9DX0dFVF9CQUNLRU5EX0ZXOgorCisgICBUaGlzIGlvY3RsIHNoYWxsIGJlIHVzZWQgYnkgdGhlIHVzZXIgdG8gZ2V0IHRoZSB2ZXJzaW9uIG9mIGEgY3VycmVudGx5CisgICBydW5uaW5nIEJhY2tlbmQgSW50ZXJmYWNlIEZpcm13YXJlIGlkZW50aWZpZWQgYnkgYSBmaXJtd2FyZS10YWcuIFRoZSB1c2VyIGlzCisgICByZXF1aXJlZCB0byBmaWxsIHRoZSAnZmlybXdhcmVfdGFnJyBmaWVsZCBvZiB0aGUgJ3N0cnVjdCBmd19tZ210X2lvY19nZXRfZncnCisgICBpbiB0aGlzIGNhc2UuIFRoZSAnbWFqb3InIGFuZCAnbWlub3InIGZpZWxkcyBhcmUgc2V0IGJ5IHRoZSBrZXJuZWwgaW4KKyAgIHJlc3BvbnNlLgorCiszLiBGV19NR01UX0lPQ19JTlRGX0xPQURfQU5EX1ZBTElEQVRFOgorCisgICBUaGlzIGlvY3RsIHNoYWxsIGJlIHVzZWQgYnkgdGhlIHVzZXIgdG8gbG9hZCBhbiBJbnRlcmZhY2UgRmlybXdhcmUgcGFja2FnZSBvbgorICAgYW4gSW50ZXJmYWNlLiBUaGUgdXNlciBuZWVkcyB0byBmaWxsIHRoZSAnZmlybXdhcmVfdGFnJyBhbmQgJ2xvYWRfbWV0aG9kJworICAgZmllbGRzIG9mIHRoZSAnc3RydWN0IGZ3X21nbXRfaW9jX2ludGZfbG9hZF9hbmRfdmFsaWRhdGUnLiBUaGUgJ3N0YXR1cycsCisgICAnbWFqb3InIGFuZCAnbWlub3InIGZpZWxkcyBhcmUgc2V0IGJ5IHRoZSBrZXJuZWwgaW4gcmVzcG9uc2UuCisKKzQuIEZXX01HTVRfSU9DX0lOVEZfQkFDS0VORF9GV19VUERBVEU6CisKKyAgIFRoaXMgaW9jdGwgc2hhbGwgYmUgdXNlZCBieSB0aGUgdXNlciB0byByZXF1ZXN0IGFuIEludGVyZmFjZSB0byB1cGRhdGUgYQorICAgQmFja2VuZCBJbnRlcmZhY2UgRmlybXdhcmUuICBUaGUgdXNlciBpcyByZXF1aXJlZCB0byBmaWxsIHRoZSAnZmlybXdhcmVfdGFnJworICAgZmllbGQgb2YgdGhlICdzdHJ1Y3QgZndfbWdtdF9pb2NfZ2V0X2Z3JyBpbiB0aGlzIGNhc2UuIFRoZSAnc3RhdHVzJyBmaWVsZCBpcworICAgc2V0IGJ5IHRoZSBrZXJuZWwgaW4gcmVzcG9uc2UuCisKKzUuIEZXX01HTVRfSU9DX1NFVF9USU1FT1VUX01TOgorCisgICBUaGlzIGlvY3RsIHNoYWxsIGJlIHVzZWQgYnkgdGhlIHVzZXIgdG8gaW5jcmVhc2UgdGhlIHRpbWVvdXQgaW50ZXJ2YWwgd2l0aGluCisgICB3aGljaCB0aGUgZmlybXdhcmUgbXVzdCBnZXQgbG9hZGVkIGJ5IHRoZSBNb2R1bGUuIFRoZSBkZWZhdWx0IHRpbWVvdXQgaXMgMQorICAgc2Vjb25kLiBUaGUgdXNlciBuZWVkcyB0byBwYXNzIHRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KKworNi4gRldfTUdNVF9JT0NfTU9ERV9TV0lUQ0g6CisKKyAgIFRoaXMgaW9jdGwgc2hhbGwgYmUgdXNlZCBieSB0aGUgdXNlciB0byBtb2RlLXN3aXRjaCB0aGUgbW9kdWxlIHRvIHRoZQorICAgcHJldmlvdXNseSBsb2FkZWQgaW50ZXJmYWNlIGZpcm13YXJlLiBJZiB0aGUgaW50ZXJmYWNlIGZpcm13YXJlIGlzbid0IGxvYWRlZAorICAgcHJldmlvdXNseSwgb3IgaWYgYW5vdGhlciB1bnN1Y2Nlc3NmdWwgRldfTUdNVF9JT0NfSU5URl9MT0FEX0FORF9WQUxJREFURQorICAgb3BlcmF0aW9uIGlzIHN0YXJ0ZWQgYWZ0ZXIgbG9hZGluZyBpbnRlcmZhY2UgZmlybXdhcmUsIHRoZW4gdGhlIGZpcm13YXJlIGNvcmUKKyAgIHdvdWxkbid0IGFsbG93IG1vZGUtc3dpdGNoLgorCisKK1N5c2ZzIEludGVyZmFjZXMgLSBBdXRoZW50aWNhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBDb21wb25lbnQgQXV0aGVudGljYXRpb24gUHJvdG9jb2wgaW50ZXJhY3RzIHdpdGggVXNlcnNwYWNlIHVzaW5nIHRoZQorY2hhcmFjdGVyIGRldmljZSBpbnRlcmZhY2UuIFRoZSBjaGFyYWN0ZXIgZGV2aWNlIHdpbGwgYmUgcHJlc2VudCBpbiAvZGV2LworZGlyZWN0b3J5IGFuZCB3aWxsIGJlIG5hbWVkIGdiLWF1dGhlbnRpY2F0ZS08Tj4uIFRoZSBudW1iZXIgPE4+IGlzIGFzc2lnbmVkIGF0CitydW50aW1lLgorCitJZGVudGlmeWluZyB0aGUgQ2hhcmFjdGVyIERldmljZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlcmUgY2FuIGJlIG11bHRpcGxlIGRldmljZXMgcHJlc2VudCBpbiAvZGV2LyBkaXJlY3Rvcnkgd2l0aCBuYW1lCitnYi1hdXRoZW50aWNhdGUtTiBhbmQgdXNlciBmaXJzdCBuZWVkcyB0byBpZGVudGlmeSB0aGUgY2hhcmFjdGVyIGRldmljZSB1c2VkIGZvcgorYXV0aGVudGljYXRpb24gYSBvZiBwYXJ0aWN1bGFyIGludGVyZmFjZS4KKworVGhlIEF1dGhlbnRpY2F0aW9uIGNvcmUgY3JlYXRlcyBhIGRldmljZSBvZiBjbGFzcyAnZ2JfYXV0aGVudGljYXRlJywgd2hpY2ggc2hhbGwKK2JlIHVzZWQgYnkgdGhlIHVzZXIgdG8gaWRlbnRpZnkgdGhlIHJpZ2h0IGNoYXJhY3RlciBkZXZpY2UgZm9yIGl0LiBUaGUgY2xhc3MKK2RldmljZSBpcyBjcmVhdGVkIHdpdGhpbiB0aGUgQnVuZGxlIGRpcmVjdG9yeSBmb3IgYSBwYXJ0aWN1bGFyIEludGVyZmFjZS4KKworRm9yIGV4YW1wbGUgdGhpcyBpcyBob3cgdGhlIGNsYXNzLWRldmljZSBjYW4gYmUgcHJlc2VudDoKKworL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMS8xLTEuMS8xLTEuMS4xL2diX2F1dGhlbnRpY2F0ZS9nYi1hdXRoZW50aWNhdGUtMAorCitUaGUgbGFzdCBuYW1lIGluIHRoaXMgcGF0aDogZ2ItYXV0aGVudGljYXRlLTAgaXMgcHJlY2lzZWx5IHRoZSBuYW1lIG9mIHRoZSBjaGFyCitkZXZpY2UgYW5kIHNvIHRoZSBkZXZpY2UgaW4gdGhpcyBjYXNlIHdpbGwgYmU6CisKKy9kZXYvZ2ItYXV0aGVudGljYXRlLTAuCisKK09wZXJhdGlvbnMgb24gdGhlIENoYXIgZGV2aWNlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgQ2hhcmFjdGVyIGRldmljZSAoL2Rldi9nYi1hdXRoZW50aWNhdGUtMCBpbiBhYm92ZSBleGFtcGxlKSBjYW4gYmUgb3BlbmVkIGJ5Cit0aGUgdXNlcnNwYWNlIGFwcGxpY2F0aW9uIGFuZCBpdCBjYW4gcGVyZm9ybSB2YXJpb3VzICdpb2N0bCcgb3BlcmF0aW9ucyBvbiB0aGUKK2RldmljZS4gVGhlIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgYW55IHJlYWQvd3JpdGUgb3BlcmF0aW9ucy4KKworRm9sbG93aW5nIGFyZSB0aGUgSU9DVExzIGFuZCB0aGVpciBkYXRhIHN0cnVjdHVyZXMgYXZhaWxhYmxlIHRvIHRoZSB1c2VyOgorCisjZGVmaW5lIENBUF9DRVJUSUZJQ0FURV9NQVhfU0laRQkxNjAwCisjZGVmaW5lIENBUF9TSUdOQVRVUkVfTUFYX1NJWkUJCTMyMAorCisvKiBDZXJ0aWZpY2F0ZSBjbGFzcyB0eXBlcyAqLworI2RlZmluZSBDQVBfQ0VSVF9JTVNfRUFQQwkJMHgwMDAwMDAwMQorI2RlZmluZSBDQVBfQ0VSVF9JTVNfRUFTQwkJMHgwMDAwMDAwMgorI2RlZmluZSBDQVBfQ0VSVF9JTVNfRUFSQwkJMHgwMDAwMDAwMworI2RlZmluZSBDQVBfQ0VSVF9JTVNfSUFQQwkJMHgwMDAwMDAwNAorI2RlZmluZSBDQVBfQ0VSVF9JTVNfSUFTQwkJMHgwMDAwMDAwNQorI2RlZmluZSBDQVBfQ0VSVF9JTVNfSUFSQwkJMHgwMDAwMDAwNgorCisvKiBJTVMgQ2VydGlmaWNhdGUgcmVzcG9uc2UgcmVzdWx0IGNvZGVzICovCisjZGVmaW5lIENBUF9JTVNfUkVTVUxUX0NFUlRfRk9VTkQJMHgwMAorI2RlZmluZSBDQVBfSU1TX1JFU1VMVF9DRVJUX0NMQVNTX0lOVkFMCTB4MDEKKyNkZWZpbmUgQ0FQX0lNU19SRVNVTFRfQ0VSVF9DT1JSVVBUCTB4MDIKKyNkZWZpbmUgQ0FQX0lNU19SRVNVTFRfQ0VSVF9OT1RfRk9VTkQJMHgwMworCisvKiBBdXRoZW50aWNhdGlvbiB0eXBlcyAqLworI2RlZmluZSBDQVBfQVVUSF9JTVNfUFJJCQkweDAwMDAwMDAxCisjZGVmaW5lIENBUF9BVVRIX0lNU19TRUMJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQ0FQX0FVVEhfSU1TX1JTQQkJMHgwMDAwMDAwMworCisvKiBBdXRoZW50aWNhdGUgcmVzcG9uc2UgcmVzdWx0IGNvZGVzICovCisjZGVmaW5lIENBUF9BVVRIX1JFU1VMVF9DUl9TVUNDRVNTCTB4MDAKKyNkZWZpbmUgQ0FQX0FVVEhfUkVTVUxUX0NSX0JBRF9UWVBFCTB4MDEKKyNkZWZpbmUgQ0FQX0FVVEhfUkVTVUxUX0NSX1dST05HX0VQCTB4MDIKKyNkZWZpbmUgQ0FQX0FVVEhfUkVTVUxUX0NSX05PX0tFWQkweDAzCisjZGVmaW5lIENBUF9BVVRIX1JFU1VMVF9DUl9TSUdfRkFJTAkweDA0CisKKworLyogSU9DVEwgc3VwcG9ydCAqLworc3RydWN0IGNhcF9pb2NfZ2V0X2VuZHBvaW50X3VpZCB7CisJX191OAkJCXVpZFs4XTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGNhcF9pb2NfZ2V0X2ltc19jZXJ0aWZpY2F0ZSB7CisJX191MzIJCQljZXJ0aWZpY2F0ZV9jbGFzczsKKwlfX3UzMgkJCWNlcnRpZmljYXRlX2lkOworCisJX191OAkJCXJlc3VsdF9jb2RlOworCV9fdTMyCQkJY2VydF9zaXplOworCV9fdTgJCQljZXJ0aWZpY2F0ZVtDQVBfQ0VSVElGSUNBVEVfTUFYX1NJWkVdOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgY2FwX2lvY19hdXRoZW50aWNhdGUgeworCV9fdTMyCQkJYXV0aF90eXBlOworCV9fdTgJCQl1aWRbOF07CisJX191OAkJCWNoYWxsZW5nZVszMl07CisKKwlfX3U4CQkJcmVzdWx0X2NvZGU7CisJX191OAkJCXJlc3BvbnNlWzY0XTsKKwlfX3UzMgkJCXNpZ25hdHVyZV9zaXplOworCV9fdTgJCQlzaWduYXR1cmVbQ0FQX1NJR05BVFVSRV9NQVhfU0laRV07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgQ0FQX0lPQ1RMX0JBU0UJCQknQycKKyNkZWZpbmUgQ0FQX0lPQ19HRVRfRU5EUE9JTlRfVUlECV9JT1IoQ0FQX0lPQ1RMX0JBU0UsIDAsIHN0cnVjdCBjYXBfaW9jX2dldF9lbmRwb2ludF91aWQpCisjZGVmaW5lIENBUF9JT0NfR0VUX0lNU19DRVJUSUZJQ0FURQlfSU9XUihDQVBfSU9DVExfQkFTRSwgMSwgc3RydWN0IGNhcF9pb2NfZ2V0X2ltc19jZXJ0aWZpY2F0ZSkKKyNkZWZpbmUgQ0FQX0lPQ19BVVRIRU5USUNBVEUJCV9JT1dSKENBUF9JT0NUTF9CQVNFLCAyLCBzdHJ1Y3QgY2FwX2lvY19hdXRoZW50aWNhdGUpCisKKworMS4gQ0FQX0lPQ19HRVRfRU5EUE9JTlRfVUlEOgorCisgICBUaGlzIGlvY3RsIHNoYWxsIGJlIHVzZWQgYnkgdGhlIHVzZXIgdG8gZ2V0IHRoZSBlbmRwb2ludCBVSUQgYXNzb2NpYXRlZCB3aXRoCisgICB0aGUgSW50ZXJmYWNlLiAgQWxsIHRoZSBmaWVsZHMgb2YgdGhlICdzdHJ1Y3QgY2FwX2lvY19nZXRfZW5kcG9pbnRfdWlkJyBhcmUKKyAgIGZpbGxlZCBieSB0aGUga2VybmVsLgorCisyLiBDQVBfSU9DX0dFVF9JTVNfQ0VSVElGSUNBVEU6CisKKyAgIFRoaXMgaW9jdGwgc2hhbGwgYmUgdXNlZCBieSB0aGUgdXNlciB0byByZXRyaWV2ZSBvbmUgb2YgdGhlIGF2YWlsYWJsZQorICAgY3J5cHRvZ3JhcGhpYyBjZXJ0aWZpY2F0ZXMgaGVsZCBieSB0aGUgSW50ZXJmYWNlIGZvciB1c2UgaW4gQ29tcG9uZW50CisgICBBdXRoZW50aWNhdGlvbi4gVGhlIHVzZXIgaXMgcmVxdWlyZWQgdG8gZmlsbCB0aGUgJ2NlcnRpZmljYXRlX2NsYXNzJyBhbmQKKyAgICdjZXJ0aWZpY2F0ZV9pZCcgZmllbGQgb2YgdGhlICdzdHJ1Y3QgY2FwX2lvY19nZXRfaW1zX2NlcnRpZmljYXRlJyBpbiB0aGlzCisgICBjYXNlLiBUaGUgb3RoZXIgZmllbGRzIHdpbGwgYmUgc2V0IGJ5IHRoZSBrZXJuZWwgaW4gcmVzcG9uc2UuIFRoZSBmaXJzdAorICAgJ2NlcnRfc2l6ZScgYnl0ZXMgb2YgdGhlICdjZXJ0aWZpY2F0ZScgc2hhbGwgYmUgcmVhZCBieSB0aGUgdXNlciBhbmQgb3RoZXJzCisgICBtdXN0IGJlIGRpc2NhcmRlZC4KKworMy4gQ0FQX0lPQ19BVVRIRU5USUNBVEU6CisKKyAgIFRoaXMgaW9jdGwgc2hhbGwgYmUgdXNlZCBieSB0aGUgdXNlciB0byBhdXRoZW50aWNhdGUgdGhlIE1vZHVsZSBhdHRhY2hlZCB0bworICAgYW4gSW50ZXJmYWNlLiAgVGhlIHVzZXIgbmVlZHMgdG8gZmlsbCB0aGUgJ2F1dGhfdHlwZScsICd1aWQnLCBhbmQgJ2NoYWxsZW5nZScKKyAgIGZpZWxkcyBvZiB0aGUgJ3N0cnVjdCBjYXBfaW9jX2F1dGhlbnRpY2F0ZScuIFRoZSBvdGhlciBmaWVsZHMgd2lsbCBiZSBzZXQgYnkKKyAgIHRoZSBrZXJuZWwgaW4gcmVzcG9uc2UuICBUaGUgZmlyc3QgJ3NpZ25hdHVyZV9zaXplJyBieXRlcyBvZiB0aGUgJ3NpZ25hdHVyZScKKyAgIHNoYWxsIGJlIHJlYWQgYnkgdGhlIHVzZXIgYW5kIG90aGVycyBtdXN0IGJlIGRpc2NhcmRlZC4KKworCitTeXNmcyBJbnRlcmZhY2VzIC0gRmlybXdhcmUgRG93bmxvYWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgRmlybXdhcmUgRG93bmxvYWQgUHJvdG9jb2wgdXNlcyB0aGUgZXhpc3RpbmcgTGludXggS2VybmVsJ3MgRmlybXdhcmUgY2xhc3MKK2FuZCB0aGUgaW50ZXJmYWNlIHByb3ZpZGVkIHRvIHVzZXJzcGFjZSBhcmUgZGVzY3JpYmVkIGluOgorRG9jdW1lbnRhdGlvbi9maXJtd2FyZV9jbGFzcy8uCisKKworU3lzZnMgSW50ZXJmYWNlcyAtIFNQSSBGbGFzaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgU1BJIGZsYXNoIGlzIGV4cG9zZWQgaW4gdXNlcnNwYWNlIGFzIGEgTVREIGRldmljZSBhbmQgaXMgY3JlYXRlZAord2l0aGluIHRoZSBCdW5kbGUgZGlyZWN0b3J5LiBGb3IgZXhhbXBsZSwgdGhpcyBpcyBob3cgdGhlIHBhdGggbWF5IGxvb2sgbGlrZToKKworJCBscyAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0xLzEtMS4xLzEtMS4xLjEvc3BpX21hc3Rlci9zcGkzMjc2Ni9zcGkzMjc2Ni4wL210ZAorbXRkMCAgICBtdGQwcm8KKworCitTYW1wbGUgQXBwbGljYXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBjdXJyZW50IGRpcmVjdG9yeSBhbHNvIHByb3ZpZGVzIGEgZmlybXdhcmUuYyB0ZXN0IGFwcGxpY2F0aW9uLCB3aGljaCBjYW4gYmUKK3JlZmVyZW5jZWQgd2hpbGUgZGV2ZWxvcGluZyB1c2Vyc3BhY2UgYXBwbGljYXRpb24gdG8gdGFsayB0byBmaXJtd2FyZS1tYW5hZ2VtZW50Citwcm90b2NvbC4KKworVGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFsc28gcHJvdmlkZXMgYSBhdXRoZW50aWNhdGUuYyB0ZXN0IGFwcGxpY2F0aW9uLCB3aGljaCBjYW4KK2JlIHJlZmVyZW5jZWQgd2hpbGUgZGV2ZWxvcGluZyB1c2Vyc3BhY2UgYXBwbGljYXRpb24gdG8gdGFsayB0bworY29tcG9uZW50IGF1dGhlbnRpY2F0aW9uIHByb3RvY29sLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvRG9jdW1lbnRhdGlvbi9maXJtd2FyZS9maXJtd2FyZS5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvRG9jdW1lbnRhdGlvbi9maXJtd2FyZS9maXJtd2FyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOTM4MjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9Eb2N1bWVudGF0aW9uL2Zpcm13YXJlL2Zpcm13YXJlLmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBTYW1wbGUgY29kZSB0byB0ZXN0IGZpcm13YXJlLW1hbmFnZW1lbnQgcHJvdG9jb2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAxNiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0KGMpIDIwMTYgTGluYXJvIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMTYgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDE2IExpbmFybyBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gb3IgTGluYXJvIEx0ZC4gbm9yIHRoZSBuYW1lcyBvZgorICogICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgR09PR0xFIElOQy4gT1IKKyAqIExJTkFSTyBMVEQuIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgIi4uLy4uL2dyZXlidXNfZmlybXdhcmUuaCIKKworI2RlZmluZSBGV19ERVZfREVGQVVMVAkJIi9kZXYvZ2ItZnctbWdtdC0wIgorI2RlZmluZSBGV19UQUdfSU5UX0RFRkFVTFQJInMzZiIKKyNkZWZpbmUgRldfVEFHX0JDTkRfREVGQVVMVAkiYmZfMDEiCisjZGVmaW5lIEZXX1VQREFURV9UWVBFX0RFRkFVTFQJMAorI2RlZmluZSBGV19USU1FT1VUX0RFRkFVTFQJMTAwMDA7CisKK3N0YXRpYyBjb25zdCBjaGFyICpmaXJtd2FyZV90YWc7CitzdGF0aWMgY29uc3QgY2hhciAqZndkZXYgPSBGV19ERVZfREVGQVVMVDsKK3N0YXRpYyBpbnQgZndfdXBkYXRlX3R5cGUgPSBGV19VUERBVEVfVFlQRV9ERUZBVUxUOworc3RhdGljIGludCBmd190aW1lb3V0ID0gRldfVElNRU9VVF9ERUZBVUxUOworCitzdGF0aWMgc3RydWN0IGZ3X21nbXRfaW9jX2dldF9pbnRmX3ZlcnNpb24gaW50Zl9md19pbmZvOworc3RhdGljIHN0cnVjdCBmd19tZ210X2lvY19nZXRfYmFja2VuZF92ZXJzaW9uIGJhY2tlbmRfZndfaW5mbzsKK3N0YXRpYyBzdHJ1Y3QgZndfbWdtdF9pb2NfaW50Zl9sb2FkX2FuZF92YWxpZGF0ZSBpbnRmX2xvYWQ7CitzdGF0aWMgc3RydWN0IGZ3X21nbXRfaW9jX2JhY2tlbmRfZndfdXBkYXRlIGJhY2tlbmRfdXBkYXRlOworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCXByaW50ZigiXG5Vc2FnZTogLi9maXJtd2FyZSA8Z2ItZnctbWdtdC1YIChkZWZhdWx0OiBnYi1mdy1tZ210LTApPiA8aW50ZXJmYWNlOiAwLCBiYWNrZW5kOiAxIChkZWZhdWx0OiAwKT4gPGZpcm13YXJlLXRhZz4gKGRlZmF1bHQ6IFwiczNmXCIvXCJiZl8wMVwiKSA8dGltZW91dCAoZGVmYXVsdDogMTAwMDAgbXMpPlxuIik7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX2ludGZfZmlybXdhcmUoaW50IGZkKQoreworCWludCByZXQ7CisKKwkvKiBHZXQgSW50ZXJmYWNlIEZpcm13YXJlIFZlcnNpb24gKi8KKwlwcmludGYoIkdldCBJbnRlcmZhY2UgRmlybXdhcmUgVmVyc2lvblxuIik7CisKKwlyZXQgPSBpb2N0bChmZCwgRldfTUdNVF9JT0NfR0VUX0lOVEZfRlcsICZpbnRmX2Z3X2luZm8pOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ZigiRmFpbGVkIHRvIGdldCBpbnRlcmZhY2UgZmlybXdhcmUgdmVyc2lvbjogJXMgKCVkKVxuIiwKKwkJCWZ3ZGV2LCByZXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHJpbnRmKCJJbnRlcmZhY2UgRmlybXdhcmUgdGFnICglcyksIG1ham9yICglZCksIG1pbm9yICglZClcbiIsCisJCWludGZfZndfaW5mby5maXJtd2FyZV90YWcsIGludGZfZndfaW5mby5tYWpvciwKKwkJaW50Zl9md19pbmZvLm1pbm9yKTsKKworCS8qIFRyeSBJbnRlcmZhY2UgRmlybXdhcmUgbG9hZCBvdmVyIFVuaXBybyAqLworCXByaW50ZigiTG9hZGluZyBJbnRlcmZhY2UgRmlybXdhcmVcbiIpOworCisJaW50Zl9sb2FkLmxvYWRfbWV0aG9kID0gR0JfRldfVV9MT0FEX01FVEhPRF9VTklQUk87CisJaW50Zl9sb2FkLnN0YXR1cyA9IDA7CisJaW50Zl9sb2FkLm1ham9yID0gMDsKKwlpbnRmX2xvYWQubWlub3IgPSAwOworCisJc3RybmNweSgoY2hhciAqKSZpbnRmX2xvYWQuZmlybXdhcmVfdGFnLCBmaXJtd2FyZV90YWcsCisJCUdCX0ZJUk1XQVJFX1VfVEFHX01BWF9TSVpFKTsKKworCXJldCA9IGlvY3RsKGZkLCBGV19NR01UX0lPQ19JTlRGX0xPQURfQU5EX1ZBTElEQVRFLCAmaW50Zl9sb2FkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGYoIkZhaWxlZCB0byBsb2FkIGludGVyZmFjZSBmaXJtd2FyZTogJXMgKCVkKVxuIiwgZndkZXYsCisJCQlyZXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGludGZfbG9hZC5zdGF0dXMgIT0gR0JfRldfVV9MT0FEX1NUQVRVU19WQUxJREFURUQgJiYKKwkgICAgaW50Zl9sb2FkLnN0YXR1cyAhPSBHQl9GV19VX0xPQURfU1RBVFVTX1VOVkFMSURBVEVEKSB7CisJCXByaW50ZigiTG9hZCBzdGF0dXMgc2F5cyBsb2FkaW5nIGZhaWxlZDogJWRcbiIsCisJCQlpbnRmX2xvYWQuc3RhdHVzKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXByaW50ZigiSW50ZXJmYWNlIEZpcm13YXJlICglcykgTG9hZCBkb25lOiBtYWpvcjogJWQsIG1pbm9yOiAlZCwgc3RhdHVzOiAlZFxuIiwKKwkJZmlybXdhcmVfdGFnLCBpbnRmX2xvYWQubWFqb3IsIGludGZfbG9hZC5taW5vciwKKwkJaW50Zl9sb2FkLnN0YXR1cyk7CisKKwkvKiBJbml0aWF0ZSBNb2RlLXN3aXRjaCB0byB0aGUgbmV3bHkgbG9hZGVkIGZpcm13YXJlICovCisJcHJpbnRmKCJJbml0aWF0ZSBNb2RlIHN3aXRjaFxuIik7CisKKwlyZXQgPSBpb2N0bChmZCwgRldfTUdNVF9JT0NfTU9ERV9TV0lUQ0gpOworCWlmIChyZXQgPCAwKQorCQlwcmludGYoIkZhaWxlZCB0byBpbml0aWF0ZSBtb2RlLXN3aXRjaCAoJWQpXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB1cGRhdGVfYmFja2VuZF9maXJtd2FyZShpbnQgZmQpCit7CisJaW50IHJldDsKKworCS8qIEdldCBCYWNrZW5kIEZpcm13YXJlIFZlcnNpb24gKi8KKwlwcmludGYoIkdldHRpbmcgQmFja2VuZCBGaXJtd2FyZSBWZXJzaW9uXG4iKTsKKworCXN0cm5jcHkoKGNoYXIgKikmYmFja2VuZF9md19pbmZvLmZpcm13YXJlX3RhZywgZmlybXdhcmVfdGFnLAorCQlHQl9GSVJNV0FSRV9VX1RBR19NQVhfU0laRSk7CisKK3JldHJ5X2Z3X3ZlcnNpb246CisJcmV0ID0gaW9jdGwoZmQsIEZXX01HTVRfSU9DX0dFVF9CQUNLRU5EX0ZXLCAmYmFja2VuZF9md19pbmZvKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGYoIkZhaWxlZCB0byBnZXQgYmFja2VuZCBmaXJtd2FyZSB2ZXJzaW9uOiAlcyAoJWQpXG4iLAorCQkJZndkZXYsIHJldCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcmludGYoIkJhY2tlbmQgRmlybXdhcmUgdGFnICglcyksIG1ham9yICglZCksIG1pbm9yICglZCksIHN0YXR1cyAoJWQpXG4iLAorCQliYWNrZW5kX2Z3X2luZm8uZmlybXdhcmVfdGFnLCBiYWNrZW5kX2Z3X2luZm8ubWFqb3IsCisJCWJhY2tlbmRfZndfaW5mby5taW5vciwgYmFja2VuZF9md19pbmZvLnN0YXR1cyk7CisKKwlpZiAoYmFja2VuZF9md19pbmZvLnN0YXR1cyA9PSBHQl9GV19VX0JBQ0tFTkRfVkVSU0lPTl9TVEFUVVNfUkVUUlkpCisJCWdvdG8gcmV0cnlfZndfdmVyc2lvbjsKKworCWlmICgoYmFja2VuZF9md19pbmZvLnN0YXR1cyAhPSBHQl9GV19VX0JBQ0tFTkRfVkVSU0lPTl9TVEFUVVNfU1VDQ0VTUykKKwkgICAgJiYgKGJhY2tlbmRfZndfaW5mby5zdGF0dXMgIT0gR0JfRldfVV9CQUNLRU5EX1ZFUlNJT05fU1RBVFVTX05PVF9BVkFJTEFCTEUpKSB7CisJCXByaW50ZigiRmFpbGVkIHRvIGdldCBiYWNrZW5kIGZpcm13YXJlIHZlcnNpb246ICVzICglZClcbiIsCisJCQlmd2RldiwgYmFja2VuZF9md19pbmZvLnN0YXR1cyk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBUcnkgQmFja2VuZCBGaXJtd2FyZSBVcGRhdGUgb3ZlciBVbmlwcm8gKi8KKwlwcmludGYoIlVwZGF0aW5nIEJhY2tlbmQgRmlybXdhcmVcbiIpOworCisJc3RybmNweSgoY2hhciAqKSZiYWNrZW5kX3VwZGF0ZS5maXJtd2FyZV90YWcsIGZpcm13YXJlX3RhZywKKwkJR0JfRklSTVdBUkVfVV9UQUdfTUFYX1NJWkUpOworCityZXRyeV9md191cGRhdGU6CisJYmFja2VuZF91cGRhdGUuc3RhdHVzID0gMDsKKworCXJldCA9IGlvY3RsKGZkLCBGV19NR01UX0lPQ19JTlRGX0JBQ0tFTkRfRldfVVBEQVRFLCAmYmFja2VuZF91cGRhdGUpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ZigiRmFpbGVkIHRvIGxvYWQgYmFja2VuZCBmaXJtd2FyZTogJXMgKCVkKVxuIiwgZndkZXYsIHJldCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoYmFja2VuZF91cGRhdGUuc3RhdHVzID09IEdCX0ZXX1VfQkFDS0VORF9GV19TVEFUVVNfUkVUUlkpIHsKKwkJcHJpbnRmKCJSZXRyeWluZyBmaXJtd2FyZSB1cGRhdGU6ICVkXG4iLCBiYWNrZW5kX3VwZGF0ZS5zdGF0dXMpOworCQlnb3RvIHJldHJ5X2Z3X3VwZGF0ZTsKKwl9CisKKwlpZiAoYmFja2VuZF91cGRhdGUuc3RhdHVzICE9IEdCX0ZXX1VfQkFDS0VORF9GV19TVEFUVVNfU1VDQ0VTUykgeworCQlwcmludGYoIkxvYWQgc3RhdHVzIHNheXMgbG9hZGluZyBmYWlsZWQ6ICVkXG4iLAorCQkJYmFja2VuZF91cGRhdGUuc3RhdHVzKTsKKwl9IGVsc2UgeworCQlwcmludGYoIkJhY2tlbmQgRmlybXdhcmUgKCVzKSBMb2FkIGRvbmU6IHN0YXR1czogJWRcbiIsCisJCQkJZmlybXdhcmVfdGFnLCBiYWNrZW5kX3VwZGF0ZS5zdGF0dXMpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBmZCwgcmV0OworCisJaWYgKGFyZ2MgPiAxICYmCisJICAgICghc3RyY21wKGFyZ3ZbMV0sICItaCIpIHx8ICFzdHJjbXAoYXJndlsxXSwgIi0taGVscCIpKSkgeworCQl1c2FnZSgpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGFyZ2MgPiAxKQorCQlmd2RldiA9IGFyZ3ZbMV07CisKKwlpZiAoYXJnYyA+IDIpCisJCXNzY2FuZihhcmd2WzJdLCAiJXUiLCAmZndfdXBkYXRlX3R5cGUpOworCisJaWYgKGFyZ2MgPiAzKSB7CisJCWZpcm13YXJlX3RhZyA9IGFyZ3ZbM107CisJfSBlbHNlIGlmICghZndfdXBkYXRlX3R5cGUpIHsKKwkJZmlybXdhcmVfdGFnID0gRldfVEFHX0lOVF9ERUZBVUxUOworCX0gZWxzZSB7CisJCWZpcm13YXJlX3RhZyA9IEZXX1RBR19CQ05EX0RFRkFVTFQ7CisJfQorCisJaWYgKGFyZ2MgPiA0KQorCQlzc2NhbmYoYXJndls0XSwgIiV1IiwgJmZ3X3RpbWVvdXQpOworCisJcHJpbnRmKCJUcnlpbmcgRmlybXdhcmUgdXBkYXRlOiBmd2RldjogJXMsIHR5cGU6ICVzLCB0YWc6ICVzLCB0aW1lb3V0OiAlZFxuIiwKKwkJZndkZXYsIGZ3X3VwZGF0ZV90eXBlID09IDAgPyAiaW50ZXJmYWNlIiA6ICJiYWNrZW5kIiwKKwkJZmlybXdhcmVfdGFnLCBmd190aW1lb3V0KTsKKworCXByaW50ZigiT3BlbmluZyAlcyBmaXJtd2FyZSBtYW5hZ2VtZW50IGRldmljZVxuIiwgZndkZXYpOworCisJZmQgPSBvcGVuKGZ3ZGV2LCBPX1JEV1IpOworCWlmIChmZCA8IDApIHsKKwkJcHJpbnRmKCJGYWlsZWQgdG8gb3BlbjogJXNcbiIsIGZ3ZGV2KTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFNldCBUaW1lb3V0ICovCisJcHJpbnRmKCJTZXR0aW5nIHRpbWVvdXQgdG8gJXUgbXNcbiIsIGZ3X3RpbWVvdXQpOworCisJcmV0ID0gaW9jdGwoZmQsIEZXX01HTVRfSU9DX1NFVF9USU1FT1VUX01TLCAmZndfdGltZW91dCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRmKCJGYWlsZWQgdG8gc2V0IHRpbWVvdXQ6ICVzICglZClcbiIsIGZ3ZGV2LCByZXQpOworCQlyZXQgPSAtMTsKKwkJZ290byBjbG9zZV9mZDsKKwl9CisKKwlpZiAoIWZ3X3VwZGF0ZV90eXBlKQorCQlyZXQgPSB1cGRhdGVfaW50Zl9maXJtd2FyZShmZCk7CisJZWxzZQorCQlyZXQgPSB1cGRhdGVfYmFja2VuZF9maXJtd2FyZShmZCk7CisKK2Nsb3NlX2ZkOgorCWNsb3NlKGZkKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9Eb2N1bWVudGF0aW9uL3N5c2ZzLWJ1cy1ncmV5YnVzIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvRG9jdW1lbnRhdGlvbi9zeXNmcy1idXMtZ3JleWJ1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTk5ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvRG9jdW1lbnRhdGlvbi9zeXNmcy1idXMtZ3JleWJ1cwpAQCAtMCwwICsxLDI3NSBAQAorV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9ncmV5YnVzTgorRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgInJvb3QiIGdyZXlidXMgZGV2aWNlIGZvciB0aGUgR3JleWJ1cyBkZXZpY2UgdHJlZSwgb3IgYnVzLAorCQl3aGVyZSBOIGlzIGEgZHluYW1pY2FsbHkgYXNzaWduZWQgMS1iYXNlZCBpZC4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9ncmV5YnVzTi9idXNfaWQKK0RhdGU6CQlBcHJpbCAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCVRoZSBJRCBvZiB0aGUgInJvb3QiIGdyZXlidXMgZGV2aWNlLCBvciBidXMuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1NCitEYXRlOgkJTWFyY2ggMjAxNgorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlBIE1vZHVsZSBNIG9uIHRoZSBidXMgTiwgd2hlcmUgTSBpcyB0aGUgMS1ieXRlIGludGVyZmFjZQorCQlJRCBvZiB0aGUgbW9kdWxlJ3MgcHJpbWFyeSBpbnRlcmZhY2UuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1NL2VqZWN0CitEYXRlOgkJTWFyY2ggMjAxNgorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlXcml0aW5nIGEgbm9uLXplcm8gYXJndW1lbnQgdG8gdGhpcyBhdHRpYnV0ZSBkaXNhYmxlcyB0aGUKKwkJbW9kdWxlJ3MgaW50ZXJmYWNlcyBiZWZvcmUgcGh5c2ljYWxseSBlamVjdGluZyBpdC4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLU0vbW9kdWxlX2lkCitEYXRlOgkJTWFyY2ggMjAxNgorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgSUQgb2YgYSBHcmV5YnVzIG1vZHVsZSwgY29ycmVzcG9uZGluZyB0byB0aGUgSUQgb2YgaXRzCisJCXByaW1hcnkgaW50ZXJmYWNlLgorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tTS9udW1faW50ZXJmYWNlcworRGF0ZToJCU1hcmNoIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlIG51bWJlciBvZiBpbnRlcmZhY2VzIG9mIGEgbW9kdWxlLgorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tTS5JCitEYXRlOgkJT2N0b2JlciAyMDE1CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCUFuIEludGVyZmFjZSBJIG9uIHRoZSBidXMgTiBhbmQgbW9kdWxlIE4tTSwgd2hlcmUgSSBpcyB0aGUKKwkJMS1ieXRlIGludGVyZmFjZSBJRC4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLU0uSS9jdXJyZW50X25vdworRGF0ZToJCU1hcmNoIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJQ3VycmVudCBtZWFzdXJlbWVudCBvZiB0aGUgaW50ZXJmYWNlIGluIG1pY3JvYW1wcyAodUEpCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1NLkkvZGRibDFfbWFudWZhY3R1cmVyX2lkCitEYXRlOgkJT2N0b2JlciAyMDE1CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCVVuaXBybyBEZXZpY2UgRGVzY3JpcHRvciBCbG9jayBMZXZlbCAxIG1hbnVmYWN0dXJlciBJRCBmb3IgdGhlCisJCWdyZXlidXMgSW50ZXJmYWNlLgorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tTS5JL2RkYmwxX3Byb2R1Y3RfaWQKK0RhdGU6CQlPY3RvYmVyIDIwMTUKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVW5pcHJvIERldmljZSBEZXNjcmlwdG9yIEJsb2NrIExldmVsIDEgcHJvZHVjdCBJRCBmb3IgdGhlCisJCWdyZXlidXMgSW50ZXJmYWNlLgorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tTS5JL2ludGVyZmFjZV9pZAorRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgSUQgb2YgYSBHcmV5YnVzIGludGVyZmFjZS4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLU0uSS9pbnRlcmZhY2VfdHlwZQorRGF0ZToJCUp1bmUgMjAxNgorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgdHlwZSBvZiBhIEdyZXlidXMgaW50ZXJmYWNlOyAiZHVtbXkiLCAidW5pcHJvIiwgImdyZXlidXMiLAorCQlvciAidW5rbm93biIuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1NLkkvcG93ZXJfbm93CitEYXRlOgkJTWFyY2ggMjAxNgorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlQb3dlciBtZWFzdXJlbWVudCBvZiB0aGUgaW50ZXJmYWNlIGluIG1pY3Jvd2F0dHMgKHVXKQorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tTS5JL3Bvd2VyX3N0YXRlCitEYXRlOgkJTWFyY2ggMjAxNgorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGlzIGZpbGUgcmVmbGVjdHMgdGhlIHBvd2VyIHN0YXRlIG9mIGEgR3JleWJ1cyBpbnRlcmZhY2UuIElmCisJCXRoZSB2YWx1ZSByZWFkIGZyb20gaXQgaXMgIm9uIiwgdGhlbiBwb3dlciBpcyBjdXJyZW50bHkKKwkJc3VwcGxpZWQgdG8gdGhlIGludGVyZmFjZS4gT3RoZXJ3aXNlIGl0IHdpbGwgcmVhZCAib2ZmIiBhbmQKKwkJcG93ZXIgaXMgY3VycmVudGx5IG5vdCBzdXBwbGllZCB0byB0aGUgaW50ZXJmYWNlLgorCisJCUlmIHRoZSB2YWx1ZSByZWFkIGlzICJvZmYiLCB0aGVuIHdyaXRpbmcgIm9uIiAob3IgJzEnLCAneScsCisJCSdZJykgdG8gdGhpcyBmaWxlIHdpbGwgZW5hYmxlIHBvd2VyIHRvIHRoZSBpbnRlcmZhY2UgYW5kIGFuCisJCWF0dGVtcHQgdG8gYm9vdCBhbmQgcG9zc2libHkgZW51bWVyYXRlIGl0IHdpbGwgYmUgbWFkZS4gTm90ZQorCQl0aGF0IG9uIGVycm9ycywgdGhlIGludGVyZmFjZSB3aWxsIGFnYWluIGJlIHBvd2VyZWQgZG93bi4KKworCQlJZiB0aGUgdmFsdWUgcmVhZCBpcyAib24iLCB0aGVuIHdyaXRpbmcgIm9mZiIgKG9yICcwJywgJ24nLAorCQknTicpIHRvIHRoaXMgZmlsZSB3aWxsIHBvd2VyIGRvd24gdGhlIGludGVyZmFjZS4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLU0uSS9wcm9kdWN0X2lkCitEYXRlOgkJT2N0b2JlciAyMDE1CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCVByb2R1Y3QgSUQgb2YgYSBHcmV5YnVzIGludGVyZmFjZS4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLU0uSS9zZXJpYWxfbnVtYmVyCitEYXRlOgkJT2N0b2JlciAyMDE1CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCVNlcmlhbCBOdW1iZXIgb2YgdGhlIEdyZXlidXMgaW50ZXJmYWNlLCByZXByZXNlbnRlZCBieSBhIDY0IGJpdAorCQloZXhhZGVjaW1hbCBudW1iZXIuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1NLkkvdmVuZG9yX2lkCitEYXRlOgkJT2N0b2JlciAyMDE1CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCVZlbmRvciBJRCBvZiBhIEdyZXlidXMgaW50ZXJmYWNlLgorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tTS5JL3ZvbHRhZ2Vfbm93CitEYXRlOgkJTWFyY2ggMjAxNgorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlWb2x0YWdlIG1lYXN1cmVtZW50IG9mIHRoZSBpbnRlcmZhY2UgaW4gbWljcm92b2x0cyAodVYpCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1NLkkuY3RybAorRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlBYnN0cmFjdCBjb250cm9sIGRldmljZSBmb3IgaW50ZXJmYWNlIEkgdGhhdCByZXByZXNlbnRzIHRoZQorCQljdXJyZW50IG1vZGUgb2YgYW4gZW51bWVyYXRlZCBHcmV5YnVzIGludGVyZmFjZS4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLU0uSS5jdHJsL3Byb2R1Y3Rfc3RyaW5nCitEYXRlOgkJT2N0b2JlciAyMDE1CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCVByb2R1Y3QgSUQgc3RyaW5nIG9mIGEgR3JleWJ1cyBpbnRlcmZhY2UuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1NLkkuY3RybC92ZW5kb3Jfc3RyaW5nCitEYXRlOgkJT2N0b2JlciAyMDE1CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCVZlbmRvciBJRCBzdHJpbmcgb2YgYSBHcmV5YnVzIGludGVyZmFjZS4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLU0uSS5CCitEYXRlOgkJT2N0b2JlciAyMDE1CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCUEgYnVuZGxlIEIgb24gdGhlIEludGVyZmFjZSBJLCBCIGlzIHJlcGxhY2VkIGJ5IGEgMS1ieXRlCisJCW51bWJlciByZXByZXNlbnRpbmcgdGhlIGJ1bmRsZS4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLU0uSS5CL2J1bmRsZV9jbGFzcworRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgZ3JleWJ1cyBjbGFzcyBvZiB0aGUgYnVuZGxlIEIuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1NLkkuQi9idW5kbGVfaWQKK0RhdGU6CQlPY3RvYmVyIDIwMTUKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlIGludGVyZmFjZS11bmlxdWUgaWQgb2YgdGhlIGJ1bmRsZSBCLgorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tTS5JLkIvZ3BiWAorRGF0ZToJCUFwcmlsIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlIEdlbmVyYWwgUHVycG9zZSBCcmlkZ2VkIFBIWSBkZXZpY2Ugb2YgdGhlIGJ1bmRsZSBCLAorCQl3aGVyZSBYIGlzIGEgZHluYW1pY2FsbHkgYXNzaWduZWQgMC1iYXNlZCBpZC4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLU0uSS5CL3N0YXRlCitEYXRlOgkJT2N0b2JlciAyMDE1CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCUEgYnVuZGxlIGhhcyBhIHN0YXRlIHRoYXQgaXMgbWFuYWdlZCBieSB0aGUgdXNlcnNwYWNlCisJCUVuZG8gcHJvY2Vzcy4gIFRoaXMgZmlsZSBhbGxvd3MgdGhhdCBFbmRvIHRvIHNpZ25hbAorCQlvdGhlciBBbmRyb2lkIEhBTHMgdGhhdCB0aGUgc3RhdGUgb2YgdGhlIGJ1bmRsZSBoYXMKKwkJY2hhbmdlZCB0byBhIHNwZWNpZmljIHZhbHVlLiAgV2hlbiB3cml0dGVuIHRvLCBhbnkKKwkJcHJvY2VzcyB3YXRjaGluZyB0aGUgZmlsZSB3aWxsIGJlIHdva2VuIHVwLCBhbmQgdGhlIG5ldworCQl2YWx1ZSBjYW4gYmUgcmVhZC4gSXQncyBhICJwb29yLW1hbidzIElQQyIsIHllcywgYnV0CisJCXNpbXBsaWZpZXMgdGhlIEFuZHJvaWQgdXNlcnNwYWNlIGNvZGUgaW1tZW5zZWx5LgorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tc3ZjCitEYXRlOgkJT2N0b2JlciAyMDE1CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCVRoZSBzaW5nbGV0b24gU1ZDIGRldmljZSBvZiBidXMgTi4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLXN2Yy9hcF9pbnRmX2lkCitEYXRlOgkJT2N0b2JlciAyMDE1CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCVRoZSBBUCBpbnRlcmZhY2UgSUQsIGEgMS1ieXRlIG5vbi16ZXJvIGludGVnZXIgd2hpY2gKKwkJZGVmaW5lcyB0aGUgcG9zaXRpb24gb2YgdGhlIEFQIG1vZHVsZSBvbiB0aGUgZnJhbWUuCisJCVRoZSBpbnRlcmZhY2UgcG9zaXRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBHTVAKKwkJTW9kdWxlIERldmVsb3BlciBLaXQuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1zdmMvZW5kb19pZAorRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgRW5kbyBJRCwgd2hpY2ggaXMgYSAyLWJ5dGUgaGV4YWRlY2ltYWwgdmFsdWUKKwkJZGVmaW5lZCBieSB0aGUgRW5kbyBsYXlvdXQgc2NoZW1lLCBkb2N1bWVudGVkIGluCisJCXRoZSBHTVAgTW9kdWxlIERldmVsb3BlciBLaXQuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1zdmMvaW50Zl9lamVjdAorRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlXcml0ZSB0aGUgbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCB5b3Ugd2lzaCB0bworCQlmb3JjaWJseSBlamVjdCBmcm9tIHRoZSBzeXN0ZW0uCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1zdmMvdmVyc2lvbgorRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGZpcm13YXJlIGluIHRoZSBTVkMgZGV2aWNlLgorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tc3ZjL3dhdGNoZG9nCitEYXRlOgkJT2N0b2JlciAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCUlmIHRoZSBTVkMgd2F0Y2hkb2cgaXMgZW5hYmxlZCBvciBub3QuICBXcml0aW5nIDAgdG8gdGhpcworCQlmaWxlIHdpbGwgZGlzYWJsZSB0aGUgd2F0Y2hkb2csIHdyaXRpbmcgMSB3aWxsIGVuYWJsZSBpdC4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLXN2Yy93YXRjaGRvZ19hY3Rpb24KK0RhdGU6CQlKdWx5IDIwMTYKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhpcyBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoZSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIHVwb24gU1ZDCisJCXdhdGNoZG9nIGJpdGUuCisKKwkJVGhlIGFjdGlvbiBjYW4gYmUgb25lIG9mIHRoZSAicmVzZXQiIG9yICJwYW5pYyIuIFdyaXRpbmcgZWl0aGVyCisJCW9uZSBvZiB0aGUgInJlc2V0IiBvciAicGFuaWMiIHdpbGwgY2hhbmdlIHRoZSBiZWhhdmlvciBvZiBTVkMKKwkJd2F0Y2hkb2cgYml0ZS4gRGVmYXVsdCB2YWx1ZSBpcyAicmVzZXQiLgorCisJCSJyZXNldCIgbWVhbnMgdGhlIFVuaVBybyBzdWJzeXN0ZW0gaXMgdG8gYmUgcmVzZXQuCisKKwkJInBhbmljIiBtZWFucyBTVkMgd2F0Y2hkb2cgYml0ZSB3aWxsIGNhdXNlIGtlcm5lbCB0byBwYW5pYy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZGUyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9LY29uZmlnCkBAIC0wLDAgKzEsMjE5IEBACittZW51Y29uZmlnIEdSRVlCVVMKKwl0cmlzdGF0ZSAiR3JleWJ1cyBzdXBwb3J0IgorCWRlcGVuZHMgb24gU1lTRlMKKwktLS1oZWxwLS0tCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBHcmV5YnVzIGRyaXZlciBjb3JlLiAgR3JleWJ1cyBpcyBhbgorCSAgaGFyZHdhcmUgcHJvdG9jb2wgdGhhdCB3YXMgZGVzaWduZWQgdG8gcHJvdmlkZSBVbmlwcm8gd2l0aCBhCisJICBzYW5lIGFwcGxpY2F0aW9uIGxheWVyLiAgSXQgd2FzIG9yaWdpbmFsbHkgZGVzaWduZWQgZm9yIHRoZQorCSAgQVJBIHByb2plY3QsIGEgbW9kdWxlIHBob25lIHN5c3RlbSwgYnV0IGhhcyBzaG93biB1cCBpbiBvdGhlcgorCSAgcGhvbmVzLCBhbmQgY2FuIGJlIHR1bm5lbGVkIG92ZXIgb3RoZXIgYnVzc2VzIGluIG9yZGVyIHRvCisJICBjb250cm9sIGhhcmR3YXJlIGRldmljZXMuCisKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZXNlIHR5cGVzIG9mIGRyaXZlcnMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdyZXlidXMua28KKworaWYgR1JFWUJVUworCitjb25maWcgR1JFWUJVU19FUzIKKwl0cmlzdGF0ZSAiR3JleWJ1cyBFUzMgVVNCIGhvc3QgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIFVTQgorCS0tLWhlbHAtLS0KKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIFRvc2hpYmEgRVMzIFVTQiBkZXZpY2UgdGhhdAorCSAgYWN0cyBhcyBhIEdyZXlidXMgImhvc3QgY29udHJvbGxlciIuICBUaGlzIGRldmljZSBpcyBhIGJyaWRnZQorCSAgZnJvbSBhIFVTQiBkZXZpY2UgdG8gYSBVbmlwcm8gbmV0d29yay4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2ItZXMyLmtvCisKK2NvbmZpZyBHUkVZQlVTX0FVRElPCisJdHJpc3RhdGUgIkdyZXlidXMgQXVkaW8gQ2xhc3MgZHJpdmVyIgorCWRlcGVuZHMgb24gU09VTkQKKwktLS1oZWxwLS0tCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBkZXZpY2UgdGhhdCBmb2xsb3dzIHRoZQorCSAgR3JleWJ1cyBBdWRpbyBDbGFzcyBzcGVjaWZpY2F0aW9uLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBnYi1hdWRpby5rbworCitjb25maWcgR1JFWUJVU19CT09UUk9NCisJdHJpc3RhdGUgIkdyZXlidXMgQm9vdHJvbSBDbGFzcyBkcml2ZXIiCisJLS0taGVscC0tLQorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgZGV2aWNlIHRoYXQgZm9sbG93cyB0aGUKKwkgIEdyZXlidXMgQm9vdHJvbSBDbGFzcyBzcGVjaWZpY2F0aW9uLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBnYi1ib290cm9tLmtvCisKK2NvbmZpZyBHUkVZQlVTX0NBTUVSQQorCXRyaXN0YXRlICJHcmV5YnVzIENhbWVyYSBDbGFzcyBkcml2ZXIiCisJZGVwZW5kcyBvbiBNRURJQV9TVVBQT1JUICYmIExFRFNfQ0xBU1NfRkxBU0ggJiYgQlJPS0VOCisJLS0taGVscC0tLQorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgZGV2aWNlIHRoYXQgZm9sbG93cyB0aGUKKwkgIEdyZXlidXMgQ2FtZXJhIENsYXNzIHNwZWNpZmljYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdiLWNhbWVyYS5rbworCitjb25maWcgR1JFWUJVU19GSVJNV0FSRQorCXRyaXN0YXRlICJHcmV5YnVzIEZpcm13YXJlIERvd25sb2FkIENsYXNzIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCS0tLWhlbHAtLS0KKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIGRldmljZSB0aGF0IGZvbGxvd3MgdGhlCisJICBHcmV5YnVzIEZpcm13YXJlIERvd25sb2FkIENsYXNzIHNwZWNpZmljYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdiLWZpcm13YXJlLmtvCisKK2NvbmZpZyBHUkVZQlVTX0hJRAorCXRyaXN0YXRlICJHcmV5YnVzIEhJRCBDbGFzcyBkcml2ZXIiCisJZGVwZW5kcyBvbiBISUQgJiYgSU5QVVQKKwktLS1oZWxwLS0tCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBkZXZpY2UgdGhhdCBmb2xsb3dzIHRoZQorCSAgR3JleWJ1cyBISUQgQ2xhc3Mgc3BlY2lmaWNhdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2ItaGlkLmtvCisKK2NvbmZpZyBHUkVZQlVTX0xJR0hUCisJdHJpc3RhdGUgIkdyZXlidXMgTEVEIENsYXNzIGRyaXZlciIKKwlkZXBlbmRzIG9uIExFRFNfQ0xBU1MKKwktLS1oZWxwLS0tCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBkZXZpY2UgdGhhdCBmb2xsb3dzIHRoZQorCSAgR3JleWJ1cyBMRUQgQ2xhc3Mgc3BlY2lmaWNhdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2ItbGlnaHQua28KKworY29uZmlnIEdSRVlCVVNfTE9HCisJdHJpc3RhdGUgIkdyZXlidXMgRGVidWcgTG9nIENsYXNzIGRyaXZlciIKKwktLS1oZWxwLS0tCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBkZXZpY2UgdGhhdCBmb2xsb3dzIHRoZQorCSAgR3JleWJ1cyBEZWJ1ZyBMb2cgQ2xhc3Mgc3BlY2lmaWNhdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2ItbG9nLmtvCisKK2NvbmZpZyBHUkVZQlVTX0xPT1BCQUNLCisJdHJpc3RhdGUgIkdyZXlidXMgTG9vcGJhY2sgQ2xhc3MgZHJpdmVyIgorCS0tLWhlbHAtLS0KKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIGRldmljZSB0aGF0IGZvbGxvd3MgdGhlCisJICBHcmV5YnVzIERlYnVnIExvZyBDbGFzcyBzcGVjaWZpY2F0aW9uLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBnYi1sb2cua28KKworY29uZmlnIEdSRVlCVVNfUE9XRVIKKwl0cmlzdGF0ZSAiR3JleWJ1cyBQb3dlcnN1cHBseSBDbGFzcyBkcml2ZXIiCisJZGVwZW5kcyBvbiBQT1dFUl9TVVBQTFkKKwktLS1oZWxwLS0tCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBkZXZpY2UgdGhhdCBmb2xsb3dzIHRoZQorCSAgR3JleWJ1cyBQb3dlcnN1cHBseSBDbGFzcyBzcGVjaWZpY2F0aW9uLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBnYi1wb3dlci1zdXBwbHkua28KKworY29uZmlnIEdSRVlCVVNfUkFXCisJdHJpc3RhdGUgIkdyZXlidXMgUmF3IENsYXNzIGRyaXZlciIKKwktLS1oZWxwLS0tCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBkZXZpY2UgdGhhdCBmb2xsb3dzIHRoZQorCSAgR3JleWJ1cyBSYXcgQ2xhc3Mgc3BlY2lmaWNhdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2ItcmF3LmtvCisKK2NvbmZpZyBHUkVZQlVTX1ZJQlJBVE9SCisJdHJpc3RhdGUgIkdyZXlidXMgVmlicmF0b3IgTW90b3IgQ2xhc3MgZHJpdmVyIgorCS0tLWhlbHAtLS0KKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIGRldmljZSB0aGF0IGZvbGxvd3MgdGhlCisJICBHcmV5YnVzIFZpYnJhdG9yIE1vdG9yIENsYXNzIHNwZWNpZmljYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdiLXZpYnJhdG9yLmtvCisKK21lbnVjb25maWcgR1JFWUJVU19CUklER0VEX1BIWQorCXRyaXN0YXRlICJHcmV5YnVzIEJyaWRnZWQgUEhZIENsYXNzIGRyaXZlcnMiCisJLS0taGVscC0tLQorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIHBpY2sgZnJvbSBhIHZhcmlldHkgb2YgR3JleWJ1cyBCcmlkZ2VkCisJICBQSFkgY2xhc3MgZHJpdmVycy4gIFRoZXNlIGRyaXZlcnMgZW11bGF0ZSBhIG51bWJlciBvZgorCSAgZGlmZmVyZW50ICJ0cmFkaXRpb25hbCIgYnVzc2VzIGJ5IHR1bm5lbGluZyB0aGVtIG92ZXIgR3JleWJ1cy4KKwkgIEV4YW1wbGVzIG9mIHRoaXMgaW5jbHVkZSBzZXJpYWwsIFNQSSwgVVNCLCBhbmQgb3RoZXJzLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBnYi1waHkua28KKworaWYgR1JFWUJVU19CUklER0VEX1BIWQorCitjb25maWcgR1JFWUJVU19HUElPCisJdHJpc3RhdGUgIkdyZXlidXMgR1BJTyBCcmlkZ2VkIFBIWSBkcml2ZXIiCisJZGVwZW5kcyBvbiBHUElPTElCCisJLS0taGVscC0tLQorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgZGV2aWNlIHRoYXQgZm9sbG93cyB0aGUKKwkgIEdyZXlidXMgR1BJTyBCcmlkZ2VkIFBIWSBDbGFzcyBzcGVjaWZpY2F0aW9uLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBnYi1ncGlvLmtvCisKK2NvbmZpZyBHUkVZQlVTX0kyQworCXRyaXN0YXRlICJHcmV5YnVzIEkyQyBCcmlkZ2VkIFBIWSBkcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwktLS1oZWxwLS0tCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBkZXZpY2UgdGhhdCBmb2xsb3dzIHRoZQorCSAgR3JleWJ1cyBJMkMgQnJpZGdlZCBQSFkgQ2xhc3Mgc3BlY2lmaWNhdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2ItaTJjLmtvCisKK2NvbmZpZyBHUkVZQlVTX1BXTQorCXRyaXN0YXRlICJHcmV5YnVzIFBXTSBCcmlkZ2VkIFBIWSBkcml2ZXIiCisJZGVwZW5kcyBvbiBQV00KKwktLS1oZWxwLS0tCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBkZXZpY2UgdGhhdCBmb2xsb3dzIHRoZQorCSAgR3JleWJ1cyBQV00gQnJpZGdlZCBQSFkgQ2xhc3Mgc3BlY2lmaWNhdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2ItcHdtLmtvCisKK2NvbmZpZyBHUkVZQlVTX1NESU8KKwl0cmlzdGF0ZSAiR3JleWJ1cyBTRElPIEJyaWRnZWQgUEhZIGRyaXZlciIKKwlkZXBlbmRzIG9uIE1NQworCS0tLWhlbHAtLS0KKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIGRldmljZSB0aGF0IGZvbGxvd3MgdGhlCisJICBHcmV5YnVzIFNESU8gQnJpZGdlZCBQSFkgQ2xhc3Mgc3BlY2lmaWNhdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2Itc2Rpby5rbworCitjb25maWcgR1JFWUJVU19TUEkKKwl0cmlzdGF0ZSAiR3JleWJ1cyBTUEkgQnJpZGdlZCBQSFkgZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJLS0taGVscC0tLQorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgZGV2aWNlIHRoYXQgZm9sbG93cyB0aGUKKwkgIEdyZXlidXMgU1BJIEJyaWRnZWQgUEhZIENsYXNzIHNwZWNpZmljYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdiLXNwaS5rbworCitjb25maWcgR1JFWUJVU19VQVJUCisJdHJpc3RhdGUgIkdyZXlidXMgVUFSVCBCcmlkZ2VkIFBIWSBkcml2ZXIiCisJZGVwZW5kcyBvbiBUVFkKKwktLS1oZWxwLS0tCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBkZXZpY2UgdGhhdCBmb2xsb3dzIHRoZQorCSAgR3JleWJ1cyBVQVJUIEJyaWRnZWQgUEhZIENsYXNzIHNwZWNpZmljYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdiLXVhcnQua28KKworY29uZmlnIEdSRVlCVVNfVVNCCisJdHJpc3RhdGUgIkdyZXlidXMgVVNCIEhvc3QgQnJpZGdlZCBQSFkgZHJpdmVyIgorCWRlcGVuZHMgb24gVVNCCisJLS0taGVscC0tLQorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgZGV2aWNlIHRoYXQgZm9sbG93cyB0aGUKKwkgIEdyZXlidXMgVVNCIEhvc3QgQnJpZGdlZCBQSFkgQ2xhc3Mgc3BlY2lmaWNhdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2ItdXNiLmtvCisKK2VuZGlmCSMgR1JFWUJVU19CUklER0VEX1BIWQorZW5kaWYJIyBHUkVZQlVTCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzdiN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9NYWtlZmlsZQpAQCAtMCwwICsxLDk2IEBACisjIEdyZXlidXMgY29yZQorZ3JleWJ1cy15IDo9CWNvcmUubwkJXAorCQlkZWJ1Z2ZzLm8JXAorCQloZC5vCQlcCisJCW1hbmlmZXN0Lm8JXAorCQltb2R1bGUubwlcCisJCWludGVyZmFjZS5vCVwKKwkJYnVuZGxlLm8JXAorCQljb25uZWN0aW9uLm8JXAorCQljb250cm9sLm8JXAorCQlzdmMubwkJXAorCQlzdmNfd2F0Y2hkb2cubwlcCisJCW9wZXJhdGlvbi5vCVwKKwkJdGltZXN5bmMubwlcCisJCXRpbWVzeW5jX3BsYXRmb3JtLm8KKworb2JqLSQoQ09ORklHX0dSRVlCVVMpCQkrPSBncmV5YnVzLm8KKworIyBuZWVkZWQgZm9yIHRyYWNlIGV2ZW50cworY2NmbGFncy15ICs9IC1JJChzcmMpCisKKworIyBHcmV5YnVzIEhvc3QgY29udHJvbGxlciBkcml2ZXJzCitnYi1lczIteSA6PSBlczIubworCitvYmotJChDT05GSUdfR1JFWUJVU19FUzIpCSs9IGdiLWVzMi5vCisKKyMgR3JleWJ1cyBjbGFzcyBkcml2ZXJzCitnYi1ib290cm9tLXkJCTo9IGJvb3Ryb20ubworZ2ItY2FtZXJhLXkJCTo9IGNhbWVyYS5vCitnYi1maXJtd2FyZS15CQk6PSBmdy1jb3JlLm8gZnctZG93bmxvYWQubyBmdy1tYW5hZ2VtZW50Lm8gYXV0aGVudGljYXRpb24ubworZ2Itc3BpbGliLXkJCTo9IHNwaWxpYi5vCitnYi1oaWQteQkJOj0gaGlkLm8KK2diLWxpZ2h0LXkJCTo9IGxpZ2h0Lm8KK2diLWxvZy15CQk6PSBsb2cubworZ2ItbG9vcGJhY2steQkJOj0gbG9vcGJhY2subworZ2ItcG93ZXItc3VwcGx5LXkJOj0gcG93ZXJfc3VwcGx5Lm8KK2diLXJhdy15CQk6PSByYXcubworZ2ItdmlicmF0b3IteQkJOj0gdmlicmF0b3IubworCitvYmotJChDT05GSUdfR1JFWUJVU19CT09UUk9NKQkrPSBnYi1ib290cm9tLm8KK29iai0kKENPTkZJR19HUkVZQlVTX0NBTUVSQSkJKz0gZ2ItY2FtZXJhLm8KK29iai0kKENPTkZJR19HUkVZQlVTX0ZJUk1XQVJFKQkrPSBnYi1maXJtd2FyZS5vIGdiLXNwaWxpYi5vCitvYmotJChDT05GSUdfR1JFWUJVU19ISUQpCSs9IGdiLWhpZC5vCitvYmotJChDT05GSUdfR1JFWUJVU19MSUdIVCkJKz0gZ2ItbGlnaHQubworb2JqLSQoQ09ORklHX0dSRVlCVVNfTE9HKQkrPSBnYi1sb2cubworb2JqLSQoQ09ORklHX0dSRVlCVVNfTE9PUEJBQ0spCSs9IGdiLWxvb3BiYWNrLm8KK29iai0kKENPTkZJR19HUkVZQlVTX1BPV0VSKQkrPSBnYi1wb3dlci1zdXBwbHkubworb2JqLSQoQ09ORklHX0dSRVlCVVNfUkFXKQkrPSBnYi1yYXcubworb2JqLSQoQ09ORklHX0dSRVlCVVNfVklCUkFUT1IpCSs9IGdiLXZpYnJhdG9yLm8KKworIyBHcmV5YnVzIEF1ZGlvIGlzIGEgYnVuY2ggb2YgbW9kdWxlcworZ2ItYXVkaW8tbW9kdWxlLXkJOj0gYXVkaW9fbW9kdWxlLm8gYXVkaW9fdG9wb2xvZ3kubworZ2ItYXVkaW8tY29kZWMteQk6PSBhdWRpb19jb2RlYy5vCitnYi1hdWRpby1nYi15CQk6PSBhdWRpb19nYi5vCitnYi1hdWRpby1hcGJyaWRnZWEteQk6PSBhdWRpb19hcGJyaWRnZWEubworZ2ItYXVkaW8tbWFuYWdlci15CTo9IGF1ZGlvX21hbmFnZXIubyBhdWRpb19tYW5hZ2VyX21vZHVsZS5vCisKKyMgR3JleWJ1cyBBdWRpbyBzeXNmcyBoZWxwZXJzIGNhbiBiZSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcKKyNHQl9BVURJT19NQU5BR0VSX1NZU0ZTID89IHRydWUKKyNpZmVxICgkKEdCX0FVRElPX01BTkFHRVJfU1lTRlMpLHRydWUpCisjZ2ItYXVkaW8tbWFuYWdlci15ICs9IGF1ZGlvX21hbmFnZXJfc3lzZnMubworI2NjZmxhZ3MteSArPSAtREdCX0FVRElPX01BTkFHRVJfU1lTRlMKKyNlbmRpZgorCitvYmotJChDT05GSUdfR1JFWUJVU19BVURJT19NU004OTk0KQkrPSBnYi1hdWRpby1jb2RlYy5vCitvYmotJChDT05GSUdfR1JFWUJVU19BVURJT19NU004OTk0KQkrPSBnYi1hdWRpby1tb2R1bGUubworb2JqLSQoQ09ORklHX0dSRVlCVVNfQVVESU8pCQkrPSBnYi1hdWRpby1nYi5vCitvYmotJChDT05GSUdfR1JFWUJVU19BVURJTykJCSs9IGdiLWF1ZGlvLWFwYnJpZGdlYS5vCitvYmotJChDT05GSUdfR1JFWUJVU19BVURJTykJCSs9IGdiLWF1ZGlvLW1hbmFnZXIubworCisKKyMgR3JleWJ1cyBCcmlkZ2VkIFBIWSBkcml2ZXJzCitnYi1nYnBoeS15IDo9IGdicGh5Lm8KK2diLWdwaW8teSA6PSBncGlvLm8KK2diLWkyYy15IDo9IGkyYy5vCitnYi1wd20teSA6PSBwd20ubworZ2Itc2Rpby15IDo9IHNkaW8ubworZ2Itc3BpLXkgOj0gc3BpLm8KK2diLXVhcnQteSA6PSB1YXJ0Lm8KK2diLXVzYi15IDo9IHVzYi5vCisKK29iai0kKENPTkZJR19HUkVZQlVTX0JSSURHRURfUEhZKQkrPSBnYi1nYnBoeS5vCitvYmotJChDT05GSUdfR1JFWUJVU19HUElPKQkJKz0gZ2ItZ3Bpby5vCitvYmotJChDT05GSUdfR1JFWUJVU19JMkMpCQkrPSBnYi1pMmMubworb2JqLSQoQ09ORklHX0dSRVlCVVNfUFdNKQkJKz0gZ2ItcHdtLm8KK29iai0kKENPTkZJR19HUkVZQlVTX1NESU8pCQkrPSBnYi1zZGlvLm8KK29iai0kKENPTkZJR19HUkVZQlVTX1NQSSkJCSs9IGdiLXNwaS5vIGdiLXNwaWxpYi5vCitvYmotJChDT05GSUdfR1JFWUJVU19VQVJUKQkJKz0gZ2ItdWFydC5vCitvYmotJChDT05GSUdfR1JFWUJVU19VU0IpCQkrPSBnYi11c2IubworCisKKyMgR3JleWJ1cyBQbGF0Zm9ybSBkcml2ZXIKK2diLWFyY2hlLXkJOj0gYXJjaGUtcGxhdGZvcm0ubyBhcmNoZS1hcGItY3RybC5vCisKK29iai0kKENPTkZJR19VU0JfSFNJQ19VU0IzNjEzKQkrPSBnYi1hcmNoZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hcmNoZS1hcGItY3RybC5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXJjaGUtYXBiLWN0cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDMyM2FhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXJjaGUtYXBiLWN0cmwuYwpAQCAtMCwwICsxLDUyMiBAQAorLyoKKyAqIEFyY2hlIFBsYXRmb3JtIGRyaXZlciB0byBjb250cm9sIEFQQi4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgImFyY2hlX3BsYXRmb3JtLmgiCisKKworc3RydWN0IGFyY2hlX2FwYl9jdHJsX2RydmRhdGEgeworCS8qIENvbnRyb2wgR1BJTyBzaWduYWxzIHRvIGFuZCBmcm9tIEFQIDw9PiBBUCBCcmlkZ2VzICovCisJaW50IHJlc2V0bl9ncGlvOworCWludCBib290X3JldF9ncGlvOworCWludCBwd3JvZmZfZ3BpbzsKKwlpbnQgd2FrZV9pbl9ncGlvOworCWludCB3YWtlX291dF9ncGlvOworCWludCBwd3Jkbl9ncGlvOworCisJZW51bSBhcmNoZV9wbGF0Zm9ybV9zdGF0ZSBzdGF0ZTsKKwlib29sIGluaXRfZGlzYWJsZWQ7CisKKwlzdHJ1Y3QgcmVndWxhdG9yICp2Y29yZTsKKwlzdHJ1Y3QgcmVndWxhdG9yICp2aW87CisKKwlpbnQgY2xrX2VuX2dwaW87CisJc3RydWN0IGNsayAqY2xrOworCisJc3RydWN0IHBpbmN0cmwgKnBpbmN0cmw7CisJc3RydWN0IHBpbmN0cmxfc3RhdGUgKnBpbl9kZWZhdWx0OworCisJLyogVjI6IFNQSSBCdXMgY29udHJvbCAgKi8KKwlpbnQgc3BpX2VuX2dwaW87CisJYm9vbCBzcGlfZW5fcG9sYXJpdHlfaGlnaDsKK307CisKKy8qCisgKiBOb3RlIHRoYXQgdGhlc2UgbG93IGxldmVsIGFwaSdzIGFyZSBhY3RpdmUgaGlnaAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVhc3NlcnRfcmVzZXQodW5zaWduZWQgaW50IGdwaW8pCit7CisJZ3Bpb19zZXRfdmFsdWUoZ3BpbywgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhc3NlcnRfcmVzZXQodW5zaWduZWQgaW50IGdwaW8pCit7CisJZ3Bpb19zZXRfdmFsdWUoZ3BpbywgMCk7Cit9CisKKy8qCisgKiBOb3RlOiBQbGVhc2UgZG8gbm90IG1vZGlmeSB0aGUgYmVsb3cgc2VxdWVuY2UsIGFzIGl0IGlzIGFzIHBlciB0aGUgc3BlYworICovCitzdGF0aWMgaW50IGNvbGRib290X3NlcShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGFyY2hlX2FwYl9jdHJsX2RydmRhdGEgKmFwYiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCByZXQ7CisKKwlpZiAoYXBiLT5pbml0X2Rpc2FibGVkIHx8CisJCQlhcGItPnN0YXRlID09IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX0FDVElWRSkKKwkJcmV0dXJuIDA7CisKKwkvKiBIb2xkIEFQQiBpbiByZXNldCBzdGF0ZSAqLworCWFzc2VydF9yZXNldChhcGItPnJlc2V0bl9ncGlvKTsKKworCWlmIChhcGItPnN0YXRlID09IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX0ZXX0ZMQVNISU5HICYmCisJCQlncGlvX2lzX3ZhbGlkKGFwYi0+c3BpX2VuX2dwaW8pKQorCQlkZXZtX2dwaW9fZnJlZShkZXYsIGFwYi0+c3BpX2VuX2dwaW8pOworCisJLyogRW5hYmxlIHBvd2VyIHRvIEFQQiAqLworCWlmICghSVNfRVJSKGFwYi0+dmNvcmUpKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoYXBiLT52Y29yZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBjb3JlIHJlZ3VsYXRvclxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKCFJU19FUlIoYXBiLT52aW8pKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoYXBiLT52aW8pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBlbmFibGUgSU8gcmVndWxhdG9yXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlhcGJfYm9vdHJldF9kZWFzc2VydChkZXYpOworCisJLyogT24gREIzIGNsb2NrIHdhcyBub3QgbWFuZGF0b3J5ICovCisJaWYgKGdwaW9faXNfdmFsaWQoYXBiLT5jbGtfZW5fZ3BpbykpCisJCWdwaW9fc2V0X3ZhbHVlKGFwYi0+Y2xrX2VuX2dwaW8sIDEpOworCisJdXNsZWVwX3JhbmdlKDEwMCwgMjAwKTsKKworCS8qIGRlYXNzZXJ0IHJlc2V0IHRvIEFQQiA6IEFjdGl2ZS1sb3cgc2lnbmFsICovCisJZGVhc3NlcnRfcmVzZXQoYXBiLT5yZXNldG5fZ3Bpbyk7CisKKwlhcGItPnN0YXRlID0gQVJDSEVfUExBVEZPUk1fU1RBVEVfQUNUSVZFOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZndfZmxhc2hpbmdfc2VxKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgYXJjaGVfYXBiX2N0cmxfZHJ2ZGF0YSAqYXBiID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IHJldDsKKworCWlmIChhcGItPmluaXRfZGlzYWJsZWQgfHwKKwkJCWFwYi0+c3RhdGUgPT0gQVJDSEVfUExBVEZPUk1fU1RBVEVfRldfRkxBU0hJTkcpCisJCXJldHVybiAwOworCisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShhcGItPnZjb3JlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBjb3JlIHJlZ3VsYXRvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShhcGItPnZpbyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBlbmFibGUgSU8gcmVndWxhdG9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoZ3Bpb19pc192YWxpZChhcGItPnNwaV9lbl9ncGlvKSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWlmIChhcGItPnNwaV9lbl9wb2xhcml0eV9oaWdoKQorCQkJZmxhZ3MgPSBHUElPRl9PVVRfSU5JVF9ISUdIOworCQllbHNlCisJCQlmbGFncyA9IEdQSU9GX09VVF9JTklUX0xPVzsKKworCQlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoZGV2LCBhcGItPnNwaV9lbl9ncGlvLAorCQkJCWZsYWdzLCAiYXBiX3NwaV9lbiIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCByZXF1ZXN0aW5nIFNQSSBidXMgZW4gZ3BpbyAlZFxuIiwKKwkJCQlhcGItPnNwaV9lbl9ncGlvKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwkvKiBmb3IgZmxhc2hpbmcgZGV2aWNlIHNob3VsZCBiZSBpbiByZXNldCBzdGF0ZSAqLworCWFzc2VydF9yZXNldChhcGItPnJlc2V0bl9ncGlvKTsKKwlhcGItPnN0YXRlID0gQVJDSEVfUExBVEZPUk1fU1RBVEVfRldfRkxBU0hJTkc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGFuZGJ5X2Jvb3Rfc2VxKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgYXJjaGVfYXBiX2N0cmxfZHJ2ZGF0YSAqYXBiID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoYXBiLT5pbml0X2Rpc2FibGVkKQorCQlyZXR1cm4gMDsKKworCS8qIEV2ZW4gaWYgaXQgaXMgaW4gT0ZGIHN0YXRlLCB0aGVuIHdlIGRvIG5vdCB3YW50IHRvIGNoYW5nZSB0aGUgc3RhdGUgKi8KKwlpZiAoYXBiLT5zdGF0ZSA9PSBBUkNIRV9QTEFURk9STV9TVEFURV9TVEFOREJZIHx8CisJCQlhcGItPnN0YXRlID09IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX09GRikKKwkJcmV0dXJuIDA7CisKKwlpZiAoYXBiLT5zdGF0ZSA9PSBBUkNIRV9QTEFURk9STV9TVEFURV9GV19GTEFTSElORyAmJgorCQkJZ3Bpb19pc192YWxpZChhcGItPnNwaV9lbl9ncGlvKSkKKwkJZGV2bV9ncGlvX2ZyZWUoZGV2LCBhcGItPnNwaV9lbl9ncGlvKTsKKworCS8qCisJICogQXMgcGVyIFdETSBzcGVjLCBkbyBub3RoaW5nCisJICoKKwkgKiBQYXN0ZWQgZnJvbSBXRE0gc3BlYywKKwkgKiAgLSBBIGZhbGxpbmcgZWRnZSBvbiBQT1dFUk9GRl9MIGlzIGRldGVjdGVkIChhKQorCSAqICAtIFdETSBlbnRlcnMgc3RhbmRieSBtb2RlLCBidXQgbm8gb3V0cHV0IHNpZ25hbHMgYXJlIGNoYW5nZWQKKwkgKiAqLworCisJLyogVE9ETzogUE9XRVJPRkZfTCBpcyBpbnB1dCB0byBXRE0gbW9kdWxlICAqLworCWFwYi0+c3RhdGUgPSBBUkNIRV9QTEFURk9STV9TVEFURV9TVEFOREJZOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwb3dlcm9mZl9zZXEoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBhcmNoZV9hcGJfY3RybF9kcnZkYXRhICphcGIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChhcGItPmluaXRfZGlzYWJsZWQgfHwgYXBiLT5zdGF0ZSA9PSBBUkNIRV9QTEFURk9STV9TVEFURV9PRkYpCisJCXJldHVybjsKKworCWlmIChhcGItPnN0YXRlID09IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX0ZXX0ZMQVNISU5HICYmCisJCQlncGlvX2lzX3ZhbGlkKGFwYi0+c3BpX2VuX2dwaW8pKQorCQlkZXZtX2dwaW9fZnJlZShkZXYsIGFwYi0+c3BpX2VuX2dwaW8pOworCisJLyogZGlzYWJsZSB0aGUgY2xvY2sgKi8KKwlpZiAoZ3Bpb19pc192YWxpZChhcGItPmNsa19lbl9ncGlvKSkKKwkJZ3Bpb19zZXRfdmFsdWUoYXBiLT5jbGtfZW5fZ3BpbywgMCk7CisKKwlpZiAoIUlTX0VSUihhcGItPnZjb3JlKSAmJiByZWd1bGF0b3JfaXNfZW5hYmxlZChhcGItPnZjb3JlKSA+IDApCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGFwYi0+dmNvcmUpOworCisJaWYgKCFJU19FUlIoYXBiLT52aW8pICYmIHJlZ3VsYXRvcl9pc19lbmFibGVkKGFwYi0+dmlvKSA+IDApCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGFwYi0+dmlvKTsKKworCS8qIEFzIHBhcnQgb2YgZXhpdCwgcHV0IEFQQiBiYWNrIGluIHJlc2V0IHN0YXRlICovCisJYXNzZXJ0X3Jlc2V0KGFwYi0+cmVzZXRuX2dwaW8pOworCWFwYi0+c3RhdGUgPSBBUkNIRV9QTEFURk9STV9TVEFURV9PRkY7CisKKwkvKiBUT0RPOiBNYXkgaGF2ZSB0byBzZW5kIGFuIGV2ZW50IHRvIFNWQyBhYm91dCB0aGlzIGV4aXQgKi8KK30KKwordm9pZCBhcGJfYm9vdHJldF9hc3NlcnQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmNoZV9hcGJfY3RybF9kcnZkYXRhICphcGIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWdwaW9fc2V0X3ZhbHVlKGFwYi0+Ym9vdF9yZXRfZ3BpbywgMSk7Cit9CisKK3ZvaWQgYXBiX2Jvb3RyZXRfZGVhc3NlcnQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmNoZV9hcGJfY3RybF9kcnZkYXRhICphcGIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWdwaW9fc2V0X3ZhbHVlKGFwYi0+Ym9vdF9yZXRfZ3BpbywgMCk7Cit9CisKK2ludCBhcGJfY3RybF9jb2xkYm9vdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGNvbGRib290X3NlcSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7Cit9CisKK2ludCBhcGJfY3RybF9md19mbGFzaGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGZ3X2ZsYXNoaW5nX3NlcSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7Cit9CisKK2ludCBhcGJfY3RybF9zdGFuZGJ5X2Jvb3Qoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBzdGFuZGJ5X2Jvb3Rfc2VxKHRvX3BsYXRmb3JtX2RldmljZShkZXYpKTsKK30KKwordm9pZCBhcGJfY3RybF9wb3dlcm9mZihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcG93ZXJvZmZfc2VxKHRvX3BsYXRmb3JtX2RldmljZShkZXYpKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RhdGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBhcmNoZV9hcGJfY3RybF9kcnZkYXRhICphcGIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcmV0ID0gMDsKKwlib29sIGlzX2Rpc2FibGVkOworCisJaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgIm9mZiIpKSB7CisJCWlmIChhcGItPnN0YXRlID09IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX09GRikKKwkJCXJldHVybiBjb3VudDsKKworCQlwb3dlcm9mZl9zZXEocGRldik7CisJfSBlbHNlIGlmIChzeXNmc19zdHJlcShidWYsICJhY3RpdmUiKSkgeworCQlpZiAoYXBiLT5zdGF0ZSA9PSBBUkNIRV9QTEFURk9STV9TVEFURV9BQ1RJVkUpCisJCQlyZXR1cm4gY291bnQ7CisKKwkJcG93ZXJvZmZfc2VxKHBkZXYpOworCQlpc19kaXNhYmxlZCA9IGFwYi0+aW5pdF9kaXNhYmxlZDsKKwkJYXBiLT5pbml0X2Rpc2FibGVkID0gZmFsc2U7CisJCXJldCA9IGNvbGRib290X3NlcShwZGV2KTsKKwkJaWYgKHJldCkKKwkJCWFwYi0+aW5pdF9kaXNhYmxlZCA9IGlzX2Rpc2FibGVkOworCX0gZWxzZSBpZiAoc3lzZnNfc3RyZXEoYnVmLCAic3RhbmRieSIpKSB7CisJCWlmIChhcGItPnN0YXRlID09IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX1NUQU5EQlkpCisJCQlyZXR1cm4gY291bnQ7CisKKwkJcmV0ID0gc3RhbmRieV9ib290X3NlcShwZGV2KTsKKwl9IGVsc2UgaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgImZ3X2ZsYXNoaW5nIikpIHsKKwkJaWYgKGFwYi0+c3RhdGUgPT0gQVJDSEVfUExBVEZPUk1fU1RBVEVfRldfRkxBU0hJTkcpCisJCQlyZXR1cm4gY291bnQ7CisKKwkJLyogRmlyc3Qgd2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgcG93ZXIgb2ZmIGV2ZXJ5dGhpbmcKKwkJICogYW5kIHRoZW4gZW50ZXIgRlcgZmxhc2hpbmcgc3RhdGUgKi8KKwkJcG93ZXJvZmZfc2VxKHBkZXYpOworCQlyZXQgPSBmd19mbGFzaGluZ19zZXEocGRldik7CisJfSBlbHNlIHsKKwkJZGV2X2VycihkZXYsICJ1bmtub3duIHN0YXRlXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhcmNoZV9hcGJfY3RybF9kcnZkYXRhICphcGIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXN3aXRjaCAoYXBiLT5zdGF0ZSkgeworCWNhc2UgQVJDSEVfUExBVEZPUk1fU1RBVEVfT0ZGOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJvZmYlc1xuIiwKKwkJCQlhcGItPmluaXRfZGlzYWJsZWQgPyAiLGRpc2FibGVkIiA6ICIiKTsKKwljYXNlIEFSQ0hFX1BMQVRGT1JNX1NUQVRFX0FDVElWRToKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiYWN0aXZlXG4iKTsKKwljYXNlIEFSQ0hFX1BMQVRGT1JNX1NUQVRFX1NUQU5EQlk6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInN0YW5kYnlcbiIpOworCWNhc2UgQVJDSEVfUExBVEZPUk1fU1RBVEVfRldfRkxBU0hJTkc6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImZ3X2ZsYXNoaW5nXG4iKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJ1bmtub3duIHN0YXRlXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUl9SVyhzdGF0ZSk7CisKK3N0YXRpYyBpbnQgYXBiX2N0cmxfZ2V0X2RldnRyZWVfZGF0YShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQlzdHJ1Y3QgYXJjaGVfYXBiX2N0cmxfZHJ2ZGF0YSAqYXBiKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKKwlpbnQgcmV0OworCisJYXBiLT5yZXNldG5fZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAicmVzZXQtZ3Bpb3MiLCAwKTsKKwlpZiAoYXBiLT5yZXNldG5fZ3BpbyA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHJlc2V0IGdwaW9cbiIpOworCQlyZXR1cm4gYXBiLT5yZXNldG5fZ3BpbzsKKwl9CisJcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKGRldiwgYXBiLT5yZXNldG5fZ3BpbywKKwkJCUdQSU9GX09VVF9JTklUX0xPVywgImFwYi1yZXNldCIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgcmVxdWVzdGluZyByZXNldCBncGlvICVkXG4iLAorCQkJCWFwYi0+cmVzZXRuX2dwaW8pOworCQlyZXR1cm4gcmV0OworCX0KKworCWFwYi0+Ym9vdF9yZXRfZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAiYm9vdC1yZXQtZ3Bpb3MiLCAwKTsKKwlpZiAoYXBiLT5ib290X3JldF9ncGlvIDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgYm9vdCByZXRlbnRpb24gZ3Bpb1xuIik7CisJCXJldHVybiBhcGItPmJvb3RfcmV0X2dwaW87CisJfQorCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZShkZXYsIGFwYi0+Ym9vdF9yZXRfZ3BpbywKKwkJCUdQSU9GX09VVF9JTklUX0xPVywgImJvb3QgcmV0ZW50aW9uIik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCByZXF1ZXN0aW5nIGJvb3RyZXQgZ3BpbyAlZFxuIiwKKwkJCQlhcGItPmJvb3RfcmV0X2dwaW8pOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEl0J3Mgbm90IG1hbmRhdG9yeSB0byBzdXBwb3J0IHBvd2VyIG1hbmFnZW1lbnQgaW50ZXJmYWNlICovCisJYXBiLT5wd3JvZmZfZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAicHdyLW9mZi1ncGlvcyIsIDApOworCWlmIChhcGItPnB3cm9mZl9ncGlvIDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgcG93ZXIgb2ZmIGdwaW9cbiIpOworCQlyZXR1cm4gYXBiLT5wd3JvZmZfZ3BpbzsKKwl9CisJcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKGRldiwgYXBiLT5wd3JvZmZfZ3BpbywKKwkJCUdQSU9GX0lOLCAicHdyb2ZmX24iKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHJlcXVlc3RpbmcgcHdyb2ZmX24gZ3BpbyAlZFxuIiwKKwkJCQlhcGItPnB3cm9mZl9ncGlvKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBEbyBub3QgbWFrZSBjbG9jayBtYW5kYXRvcnkgYXMgb2Ygbm93IChmb3IgREIzKSAqLworCWFwYi0+Y2xrX2VuX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgImNsb2NrLWVuLWdwaW8iLCAwKTsKKwlpZiAoYXBiLT5jbGtfZW5fZ3BpbyA8IDApIHsKKwkJZGV2X3dhcm4oZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9jayBlbiBncGlvXG4iKTsKKwl9IGVsc2UgaWYgKGdwaW9faXNfdmFsaWQoYXBiLT5jbGtfZW5fZ3BpbykpIHsKKwkJcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKGRldiwgYXBiLT5jbGtfZW5fZ3BpbywKKwkJCQlHUElPRl9PVVRfSU5JVF9MT1csICJhcGJfY2xrX2VuIik7CisJCWlmIChyZXQpIHsKKwkJCWRldl93YXJuKGRldiwgIkZhaWxlZCByZXF1ZXN0aW5nIEFQQiBjbG9jayBlbiBncGlvICVkXG4iLAorCQkJCQlhcGItPmNsa19lbl9ncGlvKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlhcGItPnB3cmRuX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgInB3ci1kb3duLWdwaW9zIiwgMCk7CisJaWYgKGFwYi0+cHdyZG5fZ3BpbyA8IDApCisJCWRldl93YXJuKGRldiwgImZhaWxlZCB0byBnZXQgcG93ZXIgZG93biBncGlvXG4iKTsKKworCS8qIFJlZ3VsYXRvcnMgYXJlIG9wdGlvbmFsLCBhcyB3ZSBtYXkgaGF2ZSBmaXhlZCBzdXBwbHkgY29taW5nIGluICovCisJYXBiLT52Y29yZSA9IGRldm1fcmVndWxhdG9yX2dldChkZXYsICJ2Y29yZSIpOworCWlmIChJU19FUlIoYXBiLT52Y29yZSkpCisJCWRldl93YXJuKGRldiwgIm5vIGNvcmUgcmVndWxhdG9yIGZvdW5kXG4iKTsKKworCWFwYi0+dmlvID0gZGV2bV9yZWd1bGF0b3JfZ2V0KGRldiwgInZpbyIpOworCWlmIChJU19FUlIoYXBiLT52aW8pKQorCQlkZXZfd2FybihkZXYsICJubyBJTyByZWd1bGF0b3IgZm91bmRcbiIpOworCisJYXBiLT5waW5jdHJsID0gZGV2bV9waW5jdHJsX2dldCgmcGRldi0+ZGV2KTsKKwlpZiAoSVNfRVJSKGFwYi0+cGluY3RybCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGdldCBwaW5jdHJsIGhhbmRsZVxuIik7CisJCXJldHVybiBQVFJfRVJSKGFwYi0+cGluY3RybCk7CisJfQorCWFwYi0+cGluX2RlZmF1bHQgPSBwaW5jdHJsX2xvb2t1cF9zdGF0ZShhcGItPnBpbmN0cmwsICJkZWZhdWx0Iik7CisJaWYgKElTX0VSUihhcGItPnBpbl9kZWZhdWx0KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IGRlZmF1bHQgcGluIHN0YXRlXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoYXBiLT5waW5fZGVmYXVsdCk7CisJfQorCisJLyogT25seSBhcHBsaWNhYmxlIGZvciBwbGF0Zm9ybSA+PSBWMiAqLworCWFwYi0+c3BpX2VuX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgInNwaS1lbi1ncGlvIiwgMCk7CisJaWYgKGFwYi0+c3BpX2VuX2dwaW8gPj0gMCkgeworCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkic3BpLWVuLWFjdGl2ZS1oaWdoIikpCisJCQlhcGItPnNwaV9lbl9wb2xhcml0eV9oaWdoID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcmNoZV9hcGJfY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IGFyY2hlX2FwYl9jdHJsX2RydmRhdGEgKmFwYjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCisJYXBiID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqYXBiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhcGIpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gYXBiX2N0cmxfZ2V0X2RldnRyZWVfZGF0YShwZGV2LCBhcGIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGFwYiBkZXZpY2V0cmVlIGRhdGEgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogSW5pdGlhbGx5IHNldCBBUEIgdG8gT0ZGIHN0YXRlICovCisJYXBiLT5zdGF0ZSA9IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX09GRjsKKwkvKiBDaGVjayB3aGV0aGVyIGRldmljZSBuZWVkcyB0byBiZSBlbmFibGVkIG9uIGJvb3QgKi8KKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLCAiYXJjaGUsaW5pdC1kaXNhYmxlIikpCisJCWFwYi0+aW5pdF9kaXNhYmxlZCA9IHRydWU7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBhcGIpOworCisJLyogQ3JlYXRlIHN5c2ZzIGludGVyZmFjZSB0byBhbGxvdyB1c2VyIHRvIGNoYW5nZSBzdGF0ZSBkeW5hbWljYWxseSAqLworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9zdGF0ZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjcmVhdGUgc3RhdGUgZmlsZSBpbiBzeXNmc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkRldmljZSByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJjaGVfYXBiX2N0cmxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9zdGF0ZSk7CisJcG93ZXJvZmZfc2VxKHBkZXYpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJjaGVfYXBiX2N0cmxfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKiBJZiB0aW1pbmcgcHJvZmlsZSBwZXJtaXRzLCB3ZSBtYXkgc2h1dGRvd24gYnJpZGdlCisJICogY29tcGxldGVseQorCSAqCisJICogVE9ETzogc2VxdWVuY2UgPz8KKwkgKgorCSAqIEFsc28sIG5lZWQgdG8gbWFrZSBzdXJlIHdlIG1lZXQgcHJlY29uZGl0aW9uIGZvciB1bmlwcm8gc3VzcGVuZAorCSAqIFByZWNvbmRpdGlvbjogRGVmaW5pdGlvbiA/Pz8KKwkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcmNoZV9hcGJfY3RybF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCS8qCisJICogQXRsZWFzdCBmb3IgRVMyIHdlIGhhdmUgdG8gbWVldCB0aGUgZGVsYXkgcmVxdWlyZW1lbnQgYmV0d2VlbgorCSAqIHVuaXBybyBzd2l0Y2ggYW5kIEFQIGJyaWRnZSBpbml0LCBkZXBlbmRpbmcgb24gd2hldGhlciBicmlkZ2UgaXMgaW4KKwkgKiBPRkYgc3RhdGUgb3Igc3RhbmRieSBzdGF0ZS4KKwkgKgorCSAqIEJhc2VkIG9uIHdoZXRoZXIgYnJpZGdlIGlzIGluIHN0YW5kYnkgb3IgT0ZGIHN0YXRlIHdlIG1heSBoYXZlIHRvCisJICogYXNzZXJ0IG11bHRpcGxlIHNpZ25hbHMuIFBsZWFzZSByZWZlciB0byBXRE0gc3BlYywgZm9yIG1vcmUgaW5mby4KKwkgKgorCSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhcmNoZV9hcGJfY3RybF9zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWFwYl9jdHJsX3Bvd2Vyb2ZmKCZwZGV2LT5kZXYpOworfQorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoYXJjaGVfYXBiX2N0cmxfcG1fb3BzLCBhcmNoZV9hcGJfY3RybF9zdXNwZW5kLAorCQkJIGFyY2hlX2FwYl9jdHJsX3Jlc3VtZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFyY2hlX2FwYl9jdHJsX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ1c2JmZmZmLDIiLCB9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFyY2hlX2FwYl9jdHJsX2RldmljZV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGFyY2hlX2FwYl9jdHJsX3Byb2JlLAorCS5yZW1vdmUJCT0gYXJjaGVfYXBiX2N0cmxfcmVtb3ZlLAorCS5zaHV0ZG93bgk9IGFyY2hlX2FwYl9jdHJsX3NodXRkb3duLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJhcmNoZS1hcGItY3RybCIsCisJCS5wbQk9ICZhcmNoZV9hcGJfY3RybF9wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IGFyY2hlX2FwYl9jdHJsX29mX21hdGNoLAorCX0KK307CisKK2ludCBfX2luaXQgYXJjaGVfYXBiX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhcmNoZV9hcGJfY3RybF9kZXZpY2VfZHJpdmVyKTsKK30KKwordm9pZCBfX2V4aXQgYXJjaGVfYXBiX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXJjaGVfYXBiX2N0cmxfZGV2aWNlX2RyaXZlcik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hcmNoZS1wbGF0Zm9ybS5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXJjaGUtcGxhdGZvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzZlZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXJjaGUtcGxhdGZvcm0uYwpAQCAtMCwwICsxLDgyNyBAQAorLyoKKyAqIEFyY2hlIFBsYXRmb3JtIGRyaXZlciB0byBlbmFibGUgVW5pcHJvIGxpbmsuCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQtMjAxNSBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlICJhcmNoZV9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgImdyZXlidXMuaCIKKworI2luY2x1ZGUgPGxpbnV4L3VzYi91c2IzNjEzLmg+CisKKyNkZWZpbmUgV0RfQ09MREJPT1RfUFVMU0VfV0lEVEhfTVMJMzAKKworZW51bSBzdmNfd2FrZWRldGVjdF9zdGF0ZSB7CisJV0RfU1RBVEVfSURMRSwJCQkvKiBEZWZhdWx0IHN0YXRlID0gcHVsbGVkIGhpZ2gvbG93ICovCisJV0RfU1RBVEVfQk9PVF9JTklULAkJLyogV0QgPSBmYWxsaW5nIGVkZ2UgKGxvdykgKi8KKwlXRF9TVEFURV9DT0xEQk9PVF9UUklHLAkJLyogV0QgPSByaXNpbmcgZWRnZSAoaGlnaCksID4gMzBtc2VjICovCisJV0RfU1RBVEVfU1RBTkRCWUJPT1RfVFJJRywJLyogQXMgb2Ygbm93IG5vdCB1c2VkID8/ICovCisJV0RfU1RBVEVfQ09MREJPT1RfU1RBUlQsCS8qIENvbGQgYm9vdCBwcm9jZXNzIHN0YXJ0ZWQgKi8KKwlXRF9TVEFURV9TVEFOREJZQk9PVF9TVEFSVCwJLyogTm90IHVzZWQgKi8KKwlXRF9TVEFURV9USU1FU1lOQywKK307CisKK3N0cnVjdCBhcmNoZV9wbGF0Zm9ybV9kcnZkYXRhIHsKKwkvKiBDb250cm9sIEdQSU8gc2lnbmFscyB0byBhbmQgZnJvbSBBUCA8PT4gU1ZDICovCisJaW50IHN2Y19yZXNldF9ncGlvOworCWJvb2wgaXNfcmVzZXRfYWN0X2hpOworCWludCBzdmNfc3lzYm9vdF9ncGlvOworCWludCB3YWtlX2RldGVjdF9ncGlvOyAvKiBiaS1kaXIsbWFwcyB0byBXQUtFX01PRCAmIFdBS0VfRlJBTUUgc2lnbmFscyAqLworCisJZW51bSBhcmNoZV9wbGF0Zm9ybV9zdGF0ZSBzdGF0ZTsKKworCWludCBzdmNfcmVmY2xrX3JlcTsKKwlzdHJ1Y3QgY2xrICpzdmNfcmVmX2NsazsKKworCXN0cnVjdCBwaW5jdHJsICpwaW5jdHJsOworCXN0cnVjdCBwaW5jdHJsX3N0YXRlICpwaW5fZGVmYXVsdDsKKworCWludCBudW1fYXBiczsKKworCWVudW0gc3ZjX3dha2VkZXRlY3Rfc3RhdGUgd2FrZV9kZXRlY3Rfc3RhdGU7CisJaW50IHdha2VfZGV0ZWN0X2lycTsKKwlzcGlubG9ja190IHdha2VfbG9jazsJCQkvKiBQcm90ZWN0IHdha2VfZGV0ZWN0X3N0YXRlICovCisJc3RydWN0IG11dGV4IHBsYXRmb3JtX3N0YXRlX211dGV4OwkvKiBQcm90ZWN0IHN0YXRlICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7CQkJLyogV1EgZm9yIGFyY2hlX3BkYXRhLT5zdGF0ZSAqLworCXVuc2lnbmVkIGxvbmcgd2FrZV9kZXRlY3Rfc3RhcnQ7CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBtX25vdGlmaWVyOworCisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2Y19wZGF0YTsKK307CisKK3N0YXRpYyBpbnQgYXJjaGVfYXBiX2Jvb3RyZXRfYXNzZXJ0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlhcGJfYm9vdHJldF9hc3NlcnQoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcmNoZV9hcGJfYm9vdHJldF9kZWFzc2VydChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJYXBiX2Jvb3RyZXRfZGVhc3NlcnQoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyogUmVxdWlyZXMgY2FsbGluZyBjb250ZXh0IHRvIGhvbGQgYXJjaGVfcGRhdGEtPnBsYXRmb3JtX3N0YXRlX211dGV4ICovCitzdGF0aWMgdm9pZCBhcmNoZV9wbGF0Zm9ybV9zZXRfc3RhdGUoc3RydWN0IGFyY2hlX3BsYXRmb3JtX2RydmRhdGEgKmFyY2hlX3BkYXRhLAorCQkJCSAgICAgZW51bSBhcmNoZV9wbGF0Zm9ybV9zdGF0ZSBzdGF0ZSkKK3sKKwlhcmNoZV9wZGF0YS0+c3RhdGUgPSBzdGF0ZTsKK30KKworLyoKKyAqIGFyY2hlX3BsYXRmb3JtX2NoYW5nZV9zdGF0ZTogQ2hhbmdlIHRoZSBvcGVyYXRpb25hbCBzdGF0ZQorICoKKyAqIFRoaXMgZXhwb3J0ZWQgZnVuY3Rpb24gYWxsb3dzIGV4dGVybmFsIGRyaXZlcnMgdG8gY2hhbmdlIHRoZSBzdGF0ZQorICogb2YgdGhlIGFyY2hlLXBsYXRmb3JtIGRyaXZlci4KKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgdHJhbnNpdGlvbnMgYmV0d2VlbiB0d28gc3RhdGVzCisgKiB3aXRoIGxpbWl0ZWQgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiAgLSBBUkNIRV9QTEFURk9STV9TVEFURV9USU1FX1NZTkM6CisgKiAgICBPbmNlIHNldCwgYWxsb3dzIHRpbWVzeW5jIG9wZXJhdGlvbnMgYmV0d2VlbiBTVkMgPD0+IEFQIGFuZCBtYWtlcworICogICAgc3VyZSB0aGF0IGFyY2hlLXBsYXRmb3JtIGRyaXZlciBpZ25vcmVzIGFueSBzdWJzZXF1ZW50IGV2ZW50cy9wdWxzZXMKKyAqICAgIGZyb20gU1ZDIG92ZXIgd2FrZS9kZXRlY3QuCisgKgorICogIC0gQVJDSEVfUExBVEZPUk1fU1RBVEVfQUNUSVZFOgorICogICAgUHV0cyBiYWNrIGRyaXZlciB0byBhY3RpdmUgc3RhdGUsIHdoZXJlIGFueSBwdWxzZSBmcm9tIFNWQyBvbiB3YWtlL2RldGVjdAorICogICAgbGluZSB3b3VsZCB0cmlnZ2VyIGVpdGhlciBjb2xkL3N0YW5kYnkgYm9vdC4KKyAqICAgIE5vdGU6IFRyYW5zaXRpb24gcmVxdWVzdCBmcm9tIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdHJpZ2dlciBjb2xkL3N0YW5kYnkKKyAqICAgICAgICAgIGJvb3QuIEl0IGp1c3QgcHV0cyBiYWNrIGRyaXZlciBib29rIGtlZXBpbmcgdmFyaWFibGUgYmFjayB0byBBQ1RJVkUKKyAqICAgICAgICAgIHN0YXRlIGFuZCByZXN0b3JlcyB0aGUgaW50ZXJydXB0LgorICoKKyAqIFJldHVybnMgLUVOT0RFViBpZiBkZXZpY2Ugbm90IGZvdW5kLCAtRUFHQUlOIGlmIHRoZSBkcml2ZXIgY2Fubm90IGN1cnJlbnRseQorICogc2F0aXNmeSB0aGUgcmVxdWVzdGVkIHN0YXRlLXRyYW5zaXRpb24gb3IgLUVJTlZBTCBmb3IgYWxsIG90aGVyCisgKiBzdGF0ZS10cmFuc2l0aW9uIHJlcXVlc3RzLgorICovCitpbnQgYXJjaGVfcGxhdGZvcm1fY2hhbmdlX3N0YXRlKGVudW0gYXJjaGVfcGxhdGZvcm1fc3RhdGUgc3RhdGUsCisJCQkJc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjX3BkYXRhKQoreworCXN0cnVjdCBhcmNoZV9wbGF0Zm9ybV9kcnZkYXRhICphcmNoZV9wZGF0YTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJaW50IHJldCA9IC1FQUdBSU47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImdvb2dsZSxhcmNoZS1wbGF0Zm9ybSIpOworCWlmICghbnApIHsKKwkJcHJfZXJyKCJnb29nbGUsYXJjaGUtcGxhdGZvcm0gZGV2aWNlIG5vZGUgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGRldiA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUobnApOworCWlmICghcGRldikgeworCQlwcl9lcnIoImFyY2hlLXBsYXRmb3JtIGRldmljZSBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlhcmNoZV9wZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJbXV0ZXhfbG9jaygmYXJjaGVfcGRhdGEtPnBsYXRmb3JtX3N0YXRlX211dGV4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXJjaGVfcGRhdGEtPndha2VfbG9jaywgZmxhZ3MpOworCisJaWYgKGFyY2hlX3BkYXRhLT5zdGF0ZSA9PSBzdGF0ZSkgeworCQlyZXQgPSAwOworCQlnb3RvIGV4aXQ7CisJfQorCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgQVJDSEVfUExBVEZPUk1fU1RBVEVfVElNRV9TWU5DOgorCQlpZiAoYXJjaGVfcGRhdGEtPnN0YXRlICE9IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX0FDVElWRSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQlpZiAoYXJjaGVfcGRhdGEtPndha2VfZGV0ZWN0X3N0YXRlICE9IFdEX1NUQVRFX0lETEUpIHsKKwkJCWRldl9lcnIoYXJjaGVfcGRhdGEtPmRldiwKKwkJCQkiZHJpdmVyIGJ1c3kgd2l0aCB3YWtlL2RldGVjdCBsaW5lIG9wc1xuIik7CisJCQlnb3RvICBleGl0OworCQl9CisJCWRldmljZV9mb3JfZWFjaF9jaGlsZChhcmNoZV9wZGF0YS0+ZGV2LCBOVUxMLAorCQkJCSAgICAgIGFyY2hlX2FwYl9ib290cmV0X2Fzc2VydCk7CisJCWFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9zdGF0ZSA9IFdEX1NUQVRFX1RJTUVTWU5DOworCQlicmVhazsKKwljYXNlIEFSQ0hFX1BMQVRGT1JNX1NUQVRFX0FDVElWRToKKwkJaWYgKGFyY2hlX3BkYXRhLT5zdGF0ZSAhPSBBUkNIRV9QTEFURk9STV9TVEFURV9USU1FX1NZTkMpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKGFyY2hlX3BkYXRhLT5kZXYsIE5VTEwsCisJCQkJICAgICAgYXJjaGVfYXBiX2Jvb3RyZXRfZGVhc3NlcnQpOworCQlhcmNoZV9wZGF0YS0+d2FrZV9kZXRlY3Rfc3RhdGUgPSBXRF9TVEFURV9JRExFOworCQlicmVhazsKKwljYXNlIEFSQ0hFX1BMQVRGT1JNX1NUQVRFX09GRjoKKwljYXNlIEFSQ0hFX1BMQVRGT1JNX1NUQVRFX1NUQU5EQlk6CisJY2FzZSBBUkNIRV9QTEFURk9STV9TVEFURV9GV19GTEFTSElORzoKKwkJZGV2X2VycihhcmNoZV9wZGF0YS0+ZGV2LCAiYnVzeSwgcmVxdWVzdCB0byByZXRyeSBsYXRlclxuIik7CisJCWdvdG8gZXhpdDsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlkZXZfZXJyKGFyY2hlX3BkYXRhLT5kZXYsCisJCQkiaW52YWxpZCBzdGF0ZSB0cmFuc2l0aW9uIHJlcXVlc3RcbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCWFyY2hlX3BkYXRhLT50aW1lc3luY19zdmNfcGRhdGEgPSB0aW1lc3luY19zdmNfcGRhdGE7CisJYXJjaGVfcGxhdGZvcm1fc2V0X3N0YXRlKGFyY2hlX3BkYXRhLCBzdGF0ZSk7CisJaWYgKHN0YXRlID09IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX0FDVElWRSkKKwkJd2FrZV91cCgmYXJjaGVfcGRhdGEtPndxKTsKKworCXJldCA9IDA7CitleGl0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyY2hlX3BkYXRhLT53YWtlX2xvY2ssIGZsYWdzKTsKKwltdXRleF91bmxvY2soJmFyY2hlX3BkYXRhLT5wbGF0Zm9ybV9zdGF0ZV9tdXRleCk7CisJb2Zfbm9kZV9wdXQobnApOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhcmNoZV9wbGF0Zm9ybV9jaGFuZ2Vfc3RhdGUpOworCisvKiBSZXF1aXJlcyBhcmNoZV9wZGF0YS0+d2FrZV9sb2NrIGlzIGhlbGQgYnkgY2FsbGluZyBjb250ZXh0ICovCitzdGF0aWMgdm9pZCBhcmNoZV9wbGF0Zm9ybV9zZXRfd2FrZV9kZXRlY3Rfc3RhdGUoCisJCQkJc3RydWN0IGFyY2hlX3BsYXRmb3JtX2RydmRhdGEgKmFyY2hlX3BkYXRhLAorCQkJCWVudW0gc3ZjX3dha2VkZXRlY3Rfc3RhdGUgc3RhdGUpCit7CisJYXJjaGVfcGRhdGEtPndha2VfZGV0ZWN0X3N0YXRlID0gc3RhdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdmNfcmVzZXRfb25vZmYodW5zaWduZWQgaW50IGdwaW8sIGJvb2wgb25vZmYpCit7CisJZ3Bpb19zZXRfdmFsdWUoZ3Bpbywgb25vZmYpOworfQorCitzdGF0aWMgaW50IGFwYl9jb2xkX2Jvb3Qoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCWludCByZXQ7CisKKwlyZXQgPSBhcGJfY3RybF9jb2xkYm9vdChkZXYpOworCWlmIChyZXQpCisJCWRldl93YXJuKGRldiwgImZhaWxlZCB0byBjb2xkYm9vdFxuIik7CisKKwkvKkNoaWxkIG5vZGVzIGFyZSBpbmRlcGVuZGVudCwgc28gZG8gbm90IGV4aXQgY29sZGJvb3Qgb3BlcmF0aW9uICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXBiX3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlhcGJfY3RybF9wb3dlcm9mZihkZXYpOworCisJLyogRW5hYmxlIEhVQjM2MTMgaW50byBIVUIgbW9kZS4gKi8KKwlpZiAodXNiMzYxM19odWJfbW9kZV9jdHJsKGZhbHNlKSkKKwkJZGV2X3dhcm4oZGV2LCAiZmFpbGVkIHRvIGNvbnRyb2wgaHViIGRldmljZVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXJjaGVfcGxhdGZvcm1fd2RfaXJxX2VuKHN0cnVjdCBhcmNoZV9wbGF0Zm9ybV9kcnZkYXRhICphcmNoZV9wZGF0YSkKK3sKKwkvKiBFbmFibGUgaW50ZXJydXB0IGhlcmUsIHRvIHJlYWQgZXZlbnQgYmFjayBmcm9tIFNWQyAqLworCWdwaW9fZGlyZWN0aW9uX2lucHV0KGFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9ncGlvKTsKKwllbmFibGVfaXJxKGFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9pcnEpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYXJjaGVfcGxhdGZvcm1fd2RfaXJxX3RocmVhZChpbnQgaXJxLCB2b2lkICpkZXZpZCkKK3sKKwlzdHJ1Y3QgYXJjaGVfcGxhdGZvcm1fZHJ2ZGF0YSAqYXJjaGVfcGRhdGEgPSBkZXZpZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFyY2hlX3BkYXRhLT53YWtlX2xvY2ssIGZsYWdzKTsKKwlpZiAoYXJjaGVfcGRhdGEtPndha2VfZGV0ZWN0X3N0YXRlICE9IFdEX1NUQVRFX0NPTERCT09UX1RSSUcpIHsKKwkJLyogU29tZXRoaW5nIGlzIHdyb25nICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyY2hlX3BkYXRhLT53YWtlX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWFyY2hlX3BsYXRmb3JtX3NldF93YWtlX2RldGVjdF9zdGF0ZShhcmNoZV9wZGF0YSwKKwkJCQkJICAgICBXRF9TVEFURV9DT0xEQk9PVF9TVEFSVCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXJjaGVfcGRhdGEtPndha2VfbG9jaywgZmxhZ3MpOworCisJLyogSXQgc2hvdWxkIGNvbXBsZXRlIHBvd2VyIGN5Y2xlLCBzbyBmaXJzdCBtYWtlIHN1cmUgaXQgaXMgcG93ZXJvZmYgKi8KKwlkZXZpY2VfZm9yX2VhY2hfY2hpbGQoYXJjaGVfcGRhdGEtPmRldiwgTlVMTCwgYXBiX3Bvd2Vyb2ZmKTsKKworCS8qIEJyaW5nIEFQQiBvdXQgb2YgcmVzZXQ6IGNvbGQgYm9vdCBzZXF1ZW5jZSAqLworCWRldmljZV9mb3JfZWFjaF9jaGlsZChhcmNoZV9wZGF0YS0+ZGV2LCBOVUxMLCBhcGJfY29sZF9ib290KTsKKworCS8qIEVuYWJsZSBIVUIzNjEzIGludG8gSFVCIG1vZGUuICovCisJaWYgKHVzYjM2MTNfaHViX21vZGVfY3RybCh0cnVlKSkKKwkJZGV2X3dhcm4oYXJjaGVfcGRhdGEtPmRldiwgImZhaWxlZCB0byBjb250cm9sIGh1YiBkZXZpY2VcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFyY2hlX3BkYXRhLT53YWtlX2xvY2ssIGZsYWdzKTsKKwlhcmNoZV9wbGF0Zm9ybV9zZXRfd2FrZV9kZXRlY3Rfc3RhdGUoYXJjaGVfcGRhdGEsIFdEX1NUQVRFX0lETEUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyY2hlX3BkYXRhLT53YWtlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGFyY2hlX3BsYXRmb3JtX3dkX2lycShpbnQgaXJxLCB2b2lkICpkZXZpZCkKK3sKKwlzdHJ1Y3QgYXJjaGVfcGxhdGZvcm1fZHJ2ZGF0YSAqYXJjaGVfcGRhdGEgPSBkZXZpZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFyY2hlX3BkYXRhLT53YWtlX2xvY2ssIGZsYWdzKTsKKworCWlmIChhcmNoZV9wZGF0YS0+d2FrZV9kZXRlY3Rfc3RhdGUgPT0gV0RfU1RBVEVfVElNRVNZTkMpIHsKKwkJZ2JfdGltZXN5bmNfaXJxKGFyY2hlX3BkYXRhLT50aW1lc3luY19zdmNfcGRhdGEpOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKGdwaW9fZ2V0X3ZhbHVlKGFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9ncGlvKSkgeworCQkvKiB3YWtlL2RldGVjdCByaXNpbmcgKi8KKworCQkvKgorCQkgKiBJZiB3YWtlL2RldGVjdCBsaW5lIGdvZXMgaGlnaCBhZnRlciBsb3csIHdpdGhpbiBsZXNzIHRoYW4KKwkJICogMzBtc2VjLCB0aGVuIHN0YW5kYnkgYm9vdCBzZXF1ZW5jZSBpcyBpbml0aWF0ZWQsIHdoaWNoIGlzIG5vdAorCQkgKiBzdXBwb3J0ZWQvaW1wbGVtZW50ZWQgYXMgb2Ygbm93LiBTbyBpZ25vcmUgaXQuCisJCSAqLworCQlpZiAoYXJjaGVfcGRhdGEtPndha2VfZGV0ZWN0X3N0YXRlID09IFdEX1NUQVRFX0JPT1RfSU5JVCkgeworCQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsCisJCQkJCWFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9zdGFydCArCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoV0RfQ09MREJPT1RfUFVMU0VfV0lEVEhfTVMpKSkgeworCQkJCWFyY2hlX3BsYXRmb3JtX3NldF93YWtlX2RldGVjdF9zdGF0ZShhcmNoZV9wZGF0YSwKKwkJCQkJCQkJICAgICBXRF9TVEFURV9JRExFKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogQ2hlY2sgd2UgYXJlIG5vdCBpbiBtaWRkbGUgb2YgaXJxIHRocmVhZCBhbHJlYWR5ICovCisJCQkJaWYgKGFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9zdGF0ZSAhPQorCQkJCQkJV0RfU1RBVEVfQ09MREJPT1RfU1RBUlQpIHsKKwkJCQkJYXJjaGVfcGxhdGZvcm1fc2V0X3dha2VfZGV0ZWN0X3N0YXRlKGFyY2hlX3BkYXRhLAorCQkJCQkJCQkJICAgICBXRF9TVEFURV9DT0xEQk9PVF9UUklHKTsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKKwkJCQkJCSZhcmNoZV9wZGF0YS0+d2FrZV9sb2NrLAorCQkJCQkJZmxhZ3MpOworCQkJCQlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qIHdha2UvZGV0ZWN0IGZhbGxpbmcgKi8KKwkJaWYgKGFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9zdGF0ZSA9PSBXRF9TVEFURV9JRExFKSB7CisJCQlhcmNoZV9wZGF0YS0+d2FrZV9kZXRlY3Rfc3RhcnQgPSBqaWZmaWVzOworCQkJLyoKKwkJCSAqIEluIHRoZSBiZWdpbmluZywgd2hlbiB3YWtlL2RldGVjdCBnb2VzIGxvdyAoZmlyc3QgdGltZSksIHdlIGFzc3VtZQorCQkJICogaXQgaXMgbWVhbnQgZm9yIGNvbGRib290IGFuZCBzZXQgdGhlIGZsYWcuIElmIHdha2UvZGV0ZWN0IGxpbmUgc3RheXMgbG93CisJCQkgKiBiZXlvbmQgMzBtc2VjLCB0aGVuIGl0IGlzIGNvbGRib290IGVsc2UgZmFsbGJhY2sgdG8gc3RhbmRieSBib290LgorCQkJICovCisJCQlhcmNoZV9wbGF0Zm9ybV9zZXRfd2FrZV9kZXRlY3Rfc3RhdGUoYXJjaGVfcGRhdGEsCisJCQkJCQkJICAgICBXRF9TVEFURV9CT09UX0lOSVQpOworCQl9CisJfQorCitleGl0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyY2hlX3BkYXRhLT53YWtlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIFJlcXVpcmVzIGFyY2hlX3BkYXRhLT5wbGF0Zm9ybV9zdGF0ZV9tdXRleCB0byBiZSBoZWxkCisgKi8KK3N0YXRpYyBpbnQgYXJjaGVfcGxhdGZvcm1fY29sZGJvb3Rfc2VxKHN0cnVjdCBhcmNoZV9wbGF0Zm9ybV9kcnZkYXRhICphcmNoZV9wZGF0YSkKK3sKKwlpbnQgcmV0OworCisJaWYgKGFyY2hlX3BkYXRhLT5zdGF0ZSA9PSBBUkNIRV9QTEFURk9STV9TVEFURV9BQ1RJVkUpCisJCXJldHVybiAwOworCisJZGV2X2luZm8oYXJjaGVfcGRhdGEtPmRldiwgIkJvb3RpbmcgZnJvbSBjb2xkIGJvb3Qgc3RhdGVcbiIpOworCisJc3ZjX3Jlc2V0X29ub2ZmKGFyY2hlX3BkYXRhLT5zdmNfcmVzZXRfZ3BpbywKKwkJCWFyY2hlX3BkYXRhLT5pc19yZXNldF9hY3RfaGkpOworCisJZ3Bpb19zZXRfdmFsdWUoYXJjaGVfcGRhdGEtPnN2Y19zeXNib290X2dwaW8sIDApOworCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoYXJjaGVfcGRhdGEtPnN2Y19yZWZfY2xrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoYXJjaGVfcGRhdGEtPmRldiwgImZhaWxlZCB0byBlbmFibGUgc3ZjX3JlZl9jbGs6ICVkXG4iLAorCQkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogYnJpbmcgU1ZDIG91dCBvZiByZXNldCAqLworCXN2Y19yZXNldF9vbm9mZihhcmNoZV9wZGF0YS0+c3ZjX3Jlc2V0X2dwaW8sCisJCQkhYXJjaGVfcGRhdGEtPmlzX3Jlc2V0X2FjdF9oaSk7CisKKwlhcmNoZV9wbGF0Zm9ybV9zZXRfc3RhdGUoYXJjaGVfcGRhdGEsIEFSQ0hFX1BMQVRGT1JNX1NUQVRFX0FDVElWRSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlcXVpcmVzIGFyY2hlX3BkYXRhLT5wbGF0Zm9ybV9zdGF0ZV9tdXRleCB0byBiZSBoZWxkCisgKi8KK3N0YXRpYyBpbnQgYXJjaGVfcGxhdGZvcm1fZndfZmxhc2hpbmdfc2VxKHN0cnVjdCBhcmNoZV9wbGF0Zm9ybV9kcnZkYXRhICphcmNoZV9wZGF0YSkKK3sKKwlpbnQgcmV0OworCisJaWYgKGFyY2hlX3BkYXRhLT5zdGF0ZSA9PSBBUkNIRV9QTEFURk9STV9TVEFURV9GV19GTEFTSElORykKKwkJcmV0dXJuIDA7CisKKwlkZXZfaW5mbyhhcmNoZV9wZGF0YS0+ZGV2LCAiU3dpdGNoaW5nIHRvIEZXIGZsYXNoaW5nIHN0YXRlXG4iKTsKKworCXN2Y19yZXNldF9vbm9mZihhcmNoZV9wZGF0YS0+c3ZjX3Jlc2V0X2dwaW8sCisJCQlhcmNoZV9wZGF0YS0+aXNfcmVzZXRfYWN0X2hpKTsKKworCWdwaW9fc2V0X3ZhbHVlKGFyY2hlX3BkYXRhLT5zdmNfc3lzYm9vdF9ncGlvLCAxKTsKKworCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoYXJjaGVfcGRhdGEtPnN2Y19yZWZfY2xrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoYXJjaGVfcGRhdGEtPmRldiwgImZhaWxlZCB0byBlbmFibGUgc3ZjX3JlZl9jbGs6ICVkXG4iLAorCQkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc3ZjX3Jlc2V0X29ub2ZmKGFyY2hlX3BkYXRhLT5zdmNfcmVzZXRfZ3BpbywKKwkJCSFhcmNoZV9wZGF0YS0+aXNfcmVzZXRfYWN0X2hpKTsKKworCWFyY2hlX3BsYXRmb3JtX3NldF9zdGF0ZShhcmNoZV9wZGF0YSwgQVJDSEVfUExBVEZPUk1fU1RBVEVfRldfRkxBU0hJTkcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXF1aXJlcyBhcmNoZV9wZGF0YS0+cGxhdGZvcm1fc3RhdGVfbXV0ZXggdG8gYmUgaGVsZAorICovCitzdGF0aWMgdm9pZCBhcmNoZV9wbGF0Zm9ybV9wb3dlcm9mZl9zZXEoc3RydWN0IGFyY2hlX3BsYXRmb3JtX2RydmRhdGEgKmFyY2hlX3BkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoYXJjaGVfcGRhdGEtPnN0YXRlID09IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX09GRikKKwkJcmV0dXJuOworCisJLyogSWYgaW4gZndfZmxhc2hpbmcgbW9kZSwgdGhlbiBubyBuZWVkIHRvIHJlcGVhdGUgdGhpbmdzIGFnYWluICovCisJaWYgKGFyY2hlX3BkYXRhLT5zdGF0ZSAhPSBBUkNIRV9QTEFURk9STV9TVEFURV9GV19GTEFTSElORykgeworCQlkaXNhYmxlX2lycShhcmNoZV9wZGF0YS0+d2FrZV9kZXRlY3RfaXJxKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXJjaGVfcGRhdGEtPndha2VfbG9jaywgZmxhZ3MpOworCQlhcmNoZV9wbGF0Zm9ybV9zZXRfd2FrZV9kZXRlY3Rfc3RhdGUoYXJjaGVfcGRhdGEsCisJCQkJCQkgICAgIFdEX1NUQVRFX0lETEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcmNoZV9wZGF0YS0+d2FrZV9sb2NrLCBmbGFncyk7CisJfQorCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFyY2hlX3BkYXRhLT5zdmNfcmVmX2Nsayk7CisKKwkvKiBBcyBwYXJ0IG9mIGV4aXQsIHB1dCBBUEIgYmFjayBpbiByZXNldCBzdGF0ZSAqLworCXN2Y19yZXNldF9vbm9mZihhcmNoZV9wZGF0YS0+c3ZjX3Jlc2V0X2dwaW8sCisJCQlhcmNoZV9wZGF0YS0+aXNfcmVzZXRfYWN0X2hpKTsKKworCWFyY2hlX3BsYXRmb3JtX3NldF9zdGF0ZShhcmNoZV9wZGF0YSwgQVJDSEVfUExBVEZPUk1fU1RBVEVfT0ZGKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RhdGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBhcmNoZV9wbGF0Zm9ybV9kcnZkYXRhICphcmNoZV9wZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCByZXQgPSAwOworCityZXRyeToKKwltdXRleF9sb2NrKCZhcmNoZV9wZGF0YS0+cGxhdGZvcm1fc3RhdGVfbXV0ZXgpOworCWlmIChhcmNoZV9wZGF0YS0+c3RhdGUgPT0gQVJDSEVfUExBVEZPUk1fU1RBVEVfVElNRV9TWU5DKSB7CisJCW11dGV4X3VubG9jaygmYXJjaGVfcGRhdGEtPnBsYXRmb3JtX3N0YXRlX211dGV4KTsKKwkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAorCQkJYXJjaGVfcGRhdGEtPndxLAorCQkJYXJjaGVfcGRhdGEtPnN0YXRlICE9IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX1RJTUVfU1lOQyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlnb3RvIHJldHJ5OworCX0KKworCWlmIChzeXNmc19zdHJlcShidWYsICJvZmYiKSkgeworCQlpZiAoYXJjaGVfcGRhdGEtPnN0YXRlID09IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX09GRikKKwkJCWdvdG8gZXhpdDsKKworCQkvKiAgSWYgU1ZDIGdvZXMgZG93biwgYnJpbmcgZG93biBBUEIncyBhcyB3ZWxsICovCisJCWRldmljZV9mb3JfZWFjaF9jaGlsZChhcmNoZV9wZGF0YS0+ZGV2LCBOVUxMLCBhcGJfcG93ZXJvZmYpOworCisJCWFyY2hlX3BsYXRmb3JtX3Bvd2Vyb2ZmX3NlcShhcmNoZV9wZGF0YSk7CisKKwl9IGVsc2UgaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgImFjdGl2ZSIpKSB7CisJCWlmIChhcmNoZV9wZGF0YS0+c3RhdGUgPT0gQVJDSEVfUExBVEZPUk1fU1RBVEVfQUNUSVZFKQorCQkJZ290byBleGl0OworCisJCS8qIEZpcnN0IHdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIHBvd2VyIG9mZiBldmVyeXRoaW5nCisJCSAqIGFuZCB0aGVuIGFjdGl2YXRlIGJhY2sgYWdhaW4gKi8KKwkJZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKGFyY2hlX3BkYXRhLT5kZXYsIE5VTEwsIGFwYl9wb3dlcm9mZik7CisJCWFyY2hlX3BsYXRmb3JtX3Bvd2Vyb2ZmX3NlcShhcmNoZV9wZGF0YSk7CisKKwkJYXJjaGVfcGxhdGZvcm1fd2RfaXJxX2VuKGFyY2hlX3BkYXRhKTsKKwkJcmV0ID0gYXJjaGVfcGxhdGZvcm1fY29sZGJvb3Rfc2VxKGFyY2hlX3BkYXRhKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXhpdDsKKworCX0gZWxzZSBpZiAoc3lzZnNfc3RyZXEoYnVmLCAic3RhbmRieSIpKSB7CisJCWlmIChhcmNoZV9wZGF0YS0+c3RhdGUgPT0gQVJDSEVfUExBVEZPUk1fU1RBVEVfU1RBTkRCWSkKKwkJCWdvdG8gZXhpdDsKKworCQlkZXZfd2FybihhcmNoZV9wZGF0YS0+ZGV2LCAic3RhbmRieSBzdGF0ZSBub3Qgc3VwcG9ydGVkXG4iKTsKKwl9IGVsc2UgaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgImZ3X2ZsYXNoaW5nIikpIHsKKwkJaWYgKGFyY2hlX3BkYXRhLT5zdGF0ZSA9PSBBUkNIRV9QTEFURk9STV9TVEFURV9GV19GTEFTSElORykKKwkJCWdvdG8gZXhpdDsKKworCQkvKgorCQkgKiBIZXJlIHdlIG9ubHkgY29udHJvbCBTVkMuCisJCSAqCisJCSAqIEluIGNhc2Ugb2YgRldfRkxBU0hJTkcgbW9kZSB3ZSBkbyBub3Qgd2FudCB0byBjb250cm9sCisJCSAqIEFQQnMsIGFzIGluIGNhc2Ugb2YgVjIsIFNQSSBidXMgaXMgc2hhcmVkIGJldHdlZW4gYm90aAorCQkgKiB0aGUgQVBCcy4gU28gbGV0IHVzZXIgY2hvc2Ugd2hpY2ggQVBCIGhlIHdhbnRzIHRvIGZsYXNoLgorCQkgKi8KKwkJYXJjaGVfcGxhdGZvcm1fcG93ZXJvZmZfc2VxKGFyY2hlX3BkYXRhKTsKKworCQlyZXQgPSBhcmNoZV9wbGF0Zm9ybV9md19mbGFzaGluZ19zZXEoYXJjaGVfcGRhdGEpOworCQlpZiAocmV0KQorCQkJZ290byBleGl0OworCX0gZWxzZSB7CisJCWRldl9lcnIoYXJjaGVfcGRhdGEtPmRldiwgInVua25vd24gc3RhdGVcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworZXhpdDoKKwltdXRleF91bmxvY2soJmFyY2hlX3BkYXRhLT5wbGF0Zm9ybV9zdGF0ZV9tdXRleCk7CisJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYXJjaGVfcGxhdGZvcm1fZHJ2ZGF0YSAqYXJjaGVfcGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXN3aXRjaCAoYXJjaGVfcGRhdGEtPnN0YXRlKSB7CisJY2FzZSBBUkNIRV9QTEFURk9STV9TVEFURV9PRkY6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm9mZlxuIik7CisJY2FzZSBBUkNIRV9QTEFURk9STV9TVEFURV9BQ1RJVkU6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImFjdGl2ZVxuIik7CisJY2FzZSBBUkNIRV9QTEFURk9STV9TVEFURV9TVEFOREJZOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJzdGFuZGJ5XG4iKTsKKwljYXNlIEFSQ0hFX1BMQVRGT1JNX1NUQVRFX0ZXX0ZMQVNISU5HOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJmd19mbGFzaGluZ1xuIik7CisJY2FzZSBBUkNIRV9QTEFURk9STV9TVEFURV9USU1FX1NZTkM6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInRpbWVfc3luY1xuIik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAidW5rbm93biBzdGF0ZVxuIik7CisJfQorfQorCitzdGF0aWMgREVWSUNFX0FUVFJfUlcoc3RhdGUpOworCitzdGF0aWMgaW50IGFyY2hlX3BsYXRmb3JtX3BtX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwbV9ldmVudCwgdm9pZCAqdW51c2VkKQoreworCXN0cnVjdCBhcmNoZV9wbGF0Zm9ybV9kcnZkYXRhICphcmNoZV9wZGF0YSA9CisJCWNvbnRhaW5lcl9vZihub3RpZmllciwgc3RydWN0IGFyY2hlX3BsYXRmb3JtX2RydmRhdGEsCisJCQkgICAgIHBtX25vdGlmaWVyKTsKKwlpbnQgcmV0ID0gTk9USUZZX0RPTkU7CisKKwltdXRleF9sb2NrKCZhcmNoZV9wZGF0YS0+cGxhdGZvcm1fc3RhdGVfbXV0ZXgpOworCXN3aXRjaCAocG1fZXZlbnQpIHsKKwljYXNlIFBNX1NVU1BFTkRfUFJFUEFSRToKKwkJaWYgKGFyY2hlX3BkYXRhLT5zdGF0ZSAhPSBBUkNIRV9QTEFURk9STV9TVEFURV9BQ1RJVkUpIHsKKwkJCXJldCA9IE5PVElGWV9TVE9QOworCQkJYnJlYWs7CisJCX0KKwkJZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKGFyY2hlX3BkYXRhLT5kZXYsIE5VTEwsIGFwYl9wb3dlcm9mZik7CisJCWFyY2hlX3BsYXRmb3JtX3Bvd2Vyb2ZmX3NlcShhcmNoZV9wZGF0YSk7CisJCWJyZWFrOworCWNhc2UgUE1fUE9TVF9TVVNQRU5EOgorCQlpZiAoYXJjaGVfcGRhdGEtPnN0YXRlICE9IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX09GRikKKwkJCWJyZWFrOworCisJCWFyY2hlX3BsYXRmb3JtX3dkX2lycV9lbihhcmNoZV9wZGF0YSk7CisJCWFyY2hlX3BsYXRmb3JtX2NvbGRib290X3NlcShhcmNoZV9wZGF0YSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJmFyY2hlX3BkYXRhLT5wbGF0Zm9ybV9zdGF0ZV9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFyY2hlX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFyY2hlX3BsYXRmb3JtX2RydmRhdGEgKmFyY2hlX3BkYXRhOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKKwlpbnQgcmV0OworCisJYXJjaGVfcGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCphcmNoZV9wZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghYXJjaGVfcGRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogc2V0dXAgc3ZjIHJlc2V0IGdwaW8gKi8KKwlhcmNoZV9wZGF0YS0+aXNfcmVzZXRfYWN0X2hpID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLAorCQkJCQkic3ZjLHJlc2V0LWFjdGl2ZS1oaWdoIik7CisJYXJjaGVfcGRhdGEtPnN2Y19yZXNldF9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJzdmMscmVzZXQtZ3BpbyIsIDApOworCWlmIChhcmNoZV9wZGF0YS0+c3ZjX3Jlc2V0X2dwaW8gPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCByZXNldC1ncGlvXG4iKTsKKwkJcmV0dXJuIGFyY2hlX3BkYXRhLT5zdmNfcmVzZXRfZ3BpbzsKKwl9CisJcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3QoZGV2LCBhcmNoZV9wZGF0YS0+c3ZjX3Jlc2V0X2dwaW8sICJzdmMtcmVzZXQiKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3Qgc3ZjLXJlc2V0IGdwaW86JWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChhcmNoZV9wZGF0YS0+c3ZjX3Jlc2V0X2dwaW8sCisJCQkJCWFyY2hlX3BkYXRhLT5pc19yZXNldF9hY3RfaGkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2V0IHN2Yy1yZXNldCBncGlvIGRpcjolZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJYXJjaGVfcGxhdGZvcm1fc2V0X3N0YXRlKGFyY2hlX3BkYXRhLCBBUkNIRV9QTEFURk9STV9TVEFURV9PRkYpOworCisJYXJjaGVfcGRhdGEtPnN2Y19zeXNib290X2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwKKwkJCQkJInN2YyxzeXNib290LWdwaW8iLCAwKTsKKwlpZiAoYXJjaGVfcGRhdGEtPnN2Y19zeXNib290X2dwaW8gPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBzeXNib290IGdwaW9cbiIpOworCQlyZXR1cm4gYXJjaGVfcGRhdGEtPnN2Y19zeXNib290X2dwaW87CisJfQorCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0KGRldiwgYXJjaGVfcGRhdGEtPnN2Y19zeXNib290X2dwaW8sICJzeXNib290MCIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBzeXNib290MCBncGlvOiVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoYXJjaGVfcGRhdGEtPnN2Y19zeXNib290X2dwaW8sIDApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2V0IHN2Yy1yZXNldCBncGlvIGRpcjolZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBzZXR1cCB0aGUgY2xvY2sgcmVxdWVzdCBncGlvIGZpcnN0ICovCisJYXJjaGVfcGRhdGEtPnN2Y19yZWZjbGtfcmVxID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsCisJCQkJCSJzdmMscmVmY2xrLXJlcS1ncGlvIiwgMCk7CisJaWYgKGFyY2hlX3BkYXRhLT5zdmNfcmVmY2xrX3JlcSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHN2YyBjbG9jay1yZXEgZ3Bpb1xuIik7CisJCXJldHVybiBhcmNoZV9wZGF0YS0+c3ZjX3JlZmNsa19yZXE7CisJfQorCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0KGRldiwgYXJjaGVfcGRhdGEtPnN2Y19yZWZjbGtfcmVxLCAic3ZjLWNsay1yZXEiKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3Qgc3ZjLWNsay1yZXEgZ3BpbzogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KGFyY2hlX3BkYXRhLT5zdmNfcmVmY2xrX3JlcSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBzZXQgc3ZjLWNsay1yZXEgZ3BpbyBkaXIgOiVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHNldHVwIHJlZmNsazIgdG8gZm9sbG93IHRoZSBwaW4gKi8KKwlhcmNoZV9wZGF0YS0+c3ZjX3JlZl9jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAic3ZjX3JlZl9jbGsiKTsKKwlpZiAoSVNfRVJSKGFyY2hlX3BkYXRhLT5zdmNfcmVmX2NsaykpIHsKKwkJcmV0ID0gUFRSX0VSUihhcmNoZV9wZGF0YS0+c3ZjX3JlZl9jbGspOworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgc3ZjX3JlZl9jbGs6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGFyY2hlX3BkYXRhKTsKKworCWFyY2hlX3BkYXRhLT5udW1fYXBicyA9IG9mX2dldF9jaGlsZF9jb3VudChucCk7CisJZGV2X2RiZyhkZXYsICJOdW1iZXIgb2YgQVBCJ3MgYXZhaWxhYmxlIC0gJWRcbiIsIGFyY2hlX3BkYXRhLT5udW1fYXBicyk7CisKKwlhcmNoZV9wZGF0YS0+d2FrZV9kZXRlY3RfZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAic3ZjLHdha2UtZGV0ZWN0LWdwaW8iLCAwKTsKKwlpZiAoYXJjaGVfcGRhdGEtPndha2VfZGV0ZWN0X2dwaW8gPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCB3YWtlIGRldGVjdCBncGlvXG4iKTsKKwkJcmV0dXJuIGFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9ncGlvOworCX0KKworCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0KGRldiwgYXJjaGVfcGRhdGEtPndha2VfZGV0ZWN0X2dwaW8sICJ3YWtlIGRldGVjdCIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgcmVxdWVzdGluZyB3YWtlX2RldGVjdCBncGlvICVkXG4iLAorCQkJCWFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9ncGlvKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhcmNoZV9wbGF0Zm9ybV9zZXRfd2FrZV9kZXRlY3Rfc3RhdGUoYXJjaGVfcGRhdGEsIFdEX1NUQVRFX0lETEUpOworCisJYXJjaGVfcGRhdGEtPmRldiA9ICZwZGV2LT5kZXY7CisKKwlzcGluX2xvY2tfaW5pdCgmYXJjaGVfcGRhdGEtPndha2VfbG9jayk7CisJbXV0ZXhfaW5pdCgmYXJjaGVfcGRhdGEtPnBsYXRmb3JtX3N0YXRlX211dGV4KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhcmNoZV9wZGF0YS0+d3EpOworCWFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9pcnEgPQorCQlncGlvX3RvX2lycShhcmNoZV9wZGF0YS0+d2FrZV9kZXRlY3RfZ3Bpbyk7CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKGRldiwgYXJjaGVfcGRhdGEtPndha2VfZGV0ZWN0X2lycSwKKwkJCWFyY2hlX3BsYXRmb3JtX3dkX2lycSwKKwkJCWFyY2hlX3BsYXRmb3JtX3dkX2lycV90aHJlYWQsCisJCQlJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX09ORVNIT1QsCisJCQlkZXZfbmFtZShkZXYpLCBhcmNoZV9wZGF0YSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXF1ZXN0IHdha2UgZGV0ZWN0IElSUSAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZGlzYWJsZV9pcnEoYXJjaGVfcGRhdGEtPndha2VfZGV0ZWN0X2lycSk7CisKKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3RhdGUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN0YXRlIGZpbGUgaW4gc3lzZnNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IG9mX3BsYXRmb3JtX3BvcHVsYXRlKG5wLCBOVUxMLCBOVUxMLCBkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcG9wdWxhdGUgY2hpbGQgbm9kZXMgJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2RldmljZV9yZW1vdmU7CisJfQorCisJYXJjaGVfcGRhdGEtPnBtX25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBhcmNoZV9wbGF0Zm9ybV9wbV9ub3RpZmllcjsKKwlyZXQgPSByZWdpc3Rlcl9wbV9ub3RpZmllcigmYXJjaGVfcGRhdGEtPnBtX25vdGlmaWVyKTsKKworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgcG0gbm90aWZpZXIgJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2RldmljZV9yZW1vdmU7CisJfQorCisJLyogUmVnaXN0ZXIgY2FsbGJhY2sgcG9pbnRlciAqLworCWFyY2hlX3BsYXRmb3JtX2NoYW5nZV9zdGF0ZV9jYiA9IGFyY2hlX3BsYXRmb3JtX2NoYW5nZV9zdGF0ZTsKKworCS8qIEV4cGxpY2l0bHkgcG93ZXIgb2ZmIGlmIHJlcXVlc3RlZCAqLworCWlmICghb2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLCAiYXJjaGUsaW5pdC1vZmYiKSkgeworCQltdXRleF9sb2NrKCZhcmNoZV9wZGF0YS0+cGxhdGZvcm1fc3RhdGVfbXV0ZXgpOworCQlyZXQgPSBhcmNoZV9wbGF0Zm9ybV9jb2xkYm9vdF9zZXEoYXJjaGVfcGRhdGEpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBjb2xkIGJvb3Qgc3ZjICVkXG4iLCByZXQpOworCQkJZ290byBlcnJfY29sZGJvb3Q7CisJCX0KKwkJYXJjaGVfcGxhdGZvcm1fd2RfaXJxX2VuKGFyY2hlX3BkYXRhKTsKKwkJbXV0ZXhfdW5sb2NrKCZhcmNoZV9wZGF0YS0+cGxhdGZvcm1fc3RhdGVfbXV0ZXgpOworCX0KKworCWRldl9pbmZvKGRldiwgIkRldmljZSByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseVxuIik7CisJcmV0dXJuIDA7CisKK2Vycl9jb2xkYm9vdDoKKwltdXRleF91bmxvY2soJmFyY2hlX3BkYXRhLT5wbGF0Zm9ybV9zdGF0ZV9tdXRleCk7CitlcnJfZGV2aWNlX3JlbW92ZToKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX3N0YXRlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFyY2hlX3JlbW92ZV9jaGlsZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFyY2hlX3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhcmNoZV9wbGF0Zm9ybV9kcnZkYXRhICphcmNoZV9wZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJdW5yZWdpc3Rlcl9wbV9ub3RpZmllcigmYXJjaGVfcGRhdGEtPnBtX25vdGlmaWVyKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX3N0YXRlKTsKKwlkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJnBkZXYtPmRldiwgTlVMTCwgYXJjaGVfcmVtb3ZlX2NoaWxkKTsKKwlhcmNoZV9wbGF0Zm9ybV9wb3dlcm9mZl9zZXEoYXJjaGVfcGRhdGEpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJaWYgKHVzYjM2MTNfaHViX21vZGVfY3RybChmYWxzZSkpCisJCWRldl93YXJuKGFyY2hlX3BkYXRhLT5kZXYsICJmYWlsZWQgdG8gY29udHJvbCBodWIgZGV2aWNlXG4iKTsKKwkJLyogVE9ETzogU2hvdWxkIHdlIGRvIGFueXRoaW5nIG1vcmUgaGVyZSA/PyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFyY2hlX3BsYXRmb3JtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCS8qCisJICogSWYgdGltaW5nIHByb2ZpbGUgcHJlbWl0cywgd2UgbWF5IHNodXRkb3duIGJyaWRnZQorCSAqIGNvbXBsZXRlbHkKKwkgKgorCSAqIFRPRE86IHNlcXVlbmNlID8/CisJICoKKwkgKiBBbHNvLCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBtZWV0IHByZWNvbmRpdGlvbiBmb3IgdW5pcHJvIHN1c3BlbmQKKwkgKiBQcmVjb25kaXRpb246IERlZmluaXRpb24gPz8/CisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJjaGVfcGxhdGZvcm1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKgorCSAqIEF0bGVhc3QgZm9yIEVTMiB3ZSBoYXZlIHRvIG1lZXQgdGhlIGRlbGF5IHJlcXVpcmVtZW50IGJldHdlZW4KKwkgKiB1bmlwcm8gc3dpdGNoIGFuZCBBUCBicmlkZ2UgaW5pdCwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgYnJpZGdlIGlzIGluCisJICogT0ZGIHN0YXRlIG9yIHN0YW5kYnkgc3RhdGUuCisJICoKKwkgKiBCYXNlZCBvbiB3aGV0aGVyIGJyaWRnZSBpcyBpbiBzdGFuZGJ5IG9yIE9GRiBzdGF0ZSB3ZSBtYXkgaGF2ZSB0bworCSAqIGFzc2VydCBtdWx0aXBsZSBzaWduYWxzLiBQbGVhc2UgcmVmZXIgdG8gV0RNIHNwZWMsIGZvciBtb3JlIGluZm8uCisJICoKKwkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXJjaGVfcGxhdGZvcm1fc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYXJjaGVfcGxhdGZvcm1fZHJ2ZGF0YSAqYXJjaGVfcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWFyY2hlX3BsYXRmb3JtX3Bvd2Vyb2ZmX3NlcShhcmNoZV9wZGF0YSk7CisKKwl1c2IzNjEzX2h1Yl9tb2RlX2N0cmwoZmFsc2UpOworfQorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoYXJjaGVfcGxhdGZvcm1fcG1fb3BzLAorCQkJYXJjaGVfcGxhdGZvcm1fc3VzcGVuZCwKKwkJCWFyY2hlX3BsYXRmb3JtX3Jlc3VtZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFyY2hlX3BsYXRmb3JtX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJnb29nbGUsYXJjaGUtcGxhdGZvcm0iLCB9LCAvKiBVc2UgUElEL1ZJRCBvZiBTVkMgZGV2aWNlICovCisJeyB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXJjaGVfY29tYmluZWRfaWRbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImdvb2dsZSxhcmNoZS1wbGF0Zm9ybSIsIH0sIC8qIFVzZSBQSUQvVklEIG9mIFNWQyBkZXZpY2UgKi8KKwl7IC5jb21wYXRpYmxlID0gInVzYmZmZmYsMiIsIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFyY2hlX2NvbWJpbmVkX2lkKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXJjaGVfcGxhdGZvcm1fZGV2aWNlX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gYXJjaGVfcGxhdGZvcm1fcHJvYmUsCisJLnJlbW92ZQkJPSBhcmNoZV9wbGF0Zm9ybV9yZW1vdmUsCisJLnNodXRkb3duCT0gYXJjaGVfcGxhdGZvcm1fc2h1dGRvd24sCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImFyY2hlLXBsYXRmb3JtLWN0cmwiLAorCQkucG0JPSAmYXJjaGVfcGxhdGZvcm1fcG1fb3BzLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhcmNoZV9wbGF0Zm9ybV9vZl9tYXRjaCwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBhcmNoZV9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXJjaGVfcGxhdGZvcm1fZGV2aWNlX2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IGFyY2hlX2FwYl9pbml0KCk7CisJaWYgKHJldHZhbCkKKwkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFyY2hlX3BsYXRmb3JtX2RldmljZV9kcml2ZXIpOworCisJcmV0dXJuIHJldHZhbDsKK30KK21vZHVsZV9pbml0KGFyY2hlX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYXJjaGVfZXhpdCh2b2lkKQoreworCWFyY2hlX2FwYl9leGl0KCk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFyY2hlX3BsYXRmb3JtX2RldmljZV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYXJjaGVfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIlZhaWJoYXYgSGlyZW1hdGggPHZhaWJoYXYuaGlyZW1hdGhAbGluYXJvLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQXJjaGUgUGxhdGZvcm0gRHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hcmNoZV9wbGF0Zm9ybS5oIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXJjaGVfcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDEyMzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXJjaGVfcGxhdGZvcm0uaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQXJjaGUgUGxhdGZvcm0gZHJpdmVyIHRvIGVuYWJsZSBVbmlwcm8gbGluay4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2lmbmRlZiBfX0FSQ0hFX1BMQVRGT1JNX0gKKyNkZWZpbmUgX19BUkNIRV9QTEFURk9STV9ICisKKyNpbmNsdWRlICJ0aW1lc3luYy5oIgorCitlbnVtIGFyY2hlX3BsYXRmb3JtX3N0YXRlIHsKKwlBUkNIRV9QTEFURk9STV9TVEFURV9PRkYsCisJQVJDSEVfUExBVEZPUk1fU1RBVEVfQUNUSVZFLAorCUFSQ0hFX1BMQVRGT1JNX1NUQVRFX1NUQU5EQlksCisJQVJDSEVfUExBVEZPUk1fU1RBVEVfRldfRkxBU0hJTkcsCisJQVJDSEVfUExBVEZPUk1fU1RBVEVfVElNRV9TWU5DLAorfTsKKworaW50IGFyY2hlX3BsYXRmb3JtX2NoYW5nZV9zdGF0ZShlbnVtIGFyY2hlX3BsYXRmb3JtX3N0YXRlIHN0YXRlLAorCQkJCXN0cnVjdCBnYl90aW1lc3luY19zdmMgKnBkYXRhKTsKKworZXh0ZXJuIGludCAoKmFyY2hlX3BsYXRmb3JtX2NoYW5nZV9zdGF0ZV9jYikoZW51bSBhcmNoZV9wbGF0Zm9ybV9zdGF0ZSBzdGF0ZSwKKwkJCQkJICAgICBzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICpwZGF0YSk7CitpbnQgX19pbml0IGFyY2hlX2FwYl9pbml0KHZvaWQpOwordm9pZCBfX2V4aXQgYXJjaGVfYXBiX2V4aXQodm9pZCk7CisKKy8qIE9wZXJhdGlvbmFsIHN0YXRlcyBmb3IgdGhlIEFQQiBkZXZpY2UgKi8KK2ludCBhcGJfY3RybF9jb2xkYm9vdChzdHJ1Y3QgZGV2aWNlICpkZXYpOworaW50IGFwYl9jdHJsX2Z3X2ZsYXNoaW5nKHN0cnVjdCBkZXZpY2UgKmRldik7CitpbnQgYXBiX2N0cmxfc3RhbmRieV9ib290KHN0cnVjdCBkZXZpY2UgKmRldik7Cit2b2lkIGFwYl9jdHJsX3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldik7Cit2b2lkIGFwYl9ib290cmV0X2Fzc2VydChzdHJ1Y3QgZGV2aWNlICpkZXYpOwordm9pZCBhcGJfYm9vdHJldF9kZWFzc2VydChzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisjZW5kaWYJLyogX19BUkNIRV9QTEFURk9STV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hcnBjLmggYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hcnBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiZGRmYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2FycGMuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDE2IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQoYykgMjAxNiBMaW5hcm8gTHRkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAxNiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0KGMpIDIwMTYgTGluYXJvIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBvciBMaW5hcm8gTHRkLiBub3IgdGhlIG5hbWVzIG9mCisgKiAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBHT09HTEUgSU5DLiBPUgorICogTElOQVJPIExURC4gQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfX0FSUENfSAorI2RlZmluZSBfX0FSUENfSAorCisvKiBBUEJyaWRnZUEgUlBDIChBUlBDKSAqLworCitlbnVtIGFycGNfcmVzdWx0IHsKKwlBUlBDX1NVQ0NFU1MJCT0gMHgwMCwKKwlBUlBDX05PX01FTU9SWQkJPSAweDAxLAorCUFSUENfSU5WQUxJRAkJPSAweDAyLAorCUFSUENfVElNRU9VVAkJPSAweDAzLAorCUFSUENfVU5LTk9XTl9FUlJPUgk9IDB4ZmYsCit9OworCitzdHJ1Y3QgYXJwY19yZXF1ZXN0X21lc3NhZ2UgeworCV9fbGUxNglpZDsJCS8qIFJQQyB1bmlxdWUgaWQgKi8KKwlfX2xlMTYJc2l6ZTsJCS8qIFNpemUgaW4gYnl0ZXMgb2YgaGVhZGVyICsgcGF5bG9hZCAqLworCV9fdTgJdHlwZTsJCS8qIFJQQyB0eXBlICovCisJX191OAlkYXRhWzBdOwkvKiBBUlBDIGRhdGEgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhcnBjX3Jlc3BvbnNlX21lc3NhZ2UgeworCV9fbGUxNglpZDsJCS8qIFJQQyB1bmlxdWUgaWQgKi8KKwlfX3U4CXJlc3VsdDsJCS8qIFJlc3VsdCBvZiBSUEMgKi8KK30gX19wYWNrZWQ7CisKKworLyogQVJQQyByZXF1ZXN0cyAqLworI2RlZmluZSBBUlBDX1RZUEVfQ1BPUlRfQ09OTkVDVEVECQkweDAxCisjZGVmaW5lIEFSUENfVFlQRV9DUE9SVF9RVUlFU0NFCQkJMHgwMgorI2RlZmluZSBBUlBDX1RZUEVfQ1BPUlRfQ0xFQVIJCQkweDAzCisjZGVmaW5lIEFSUENfVFlQRV9DUE9SVF9GTFVTSAkJCTB4MDQKKyNkZWZpbmUgQVJQQ19UWVBFX0NQT1JUX1NIVVRET1dOCQkweDA1CisKK3N0cnVjdCBhcnBjX2Nwb3J0X2Nvbm5lY3RlZF9yZXEgeworCV9fbGUxNiBjcG9ydF9pZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhcnBjX2Nwb3J0X3F1aWVzY2VfcmVxIHsKKwlfX2xlMTYgY3BvcnRfaWQ7CisJX19sZTE2IHBlZXJfc3BhY2U7CisJX19sZTE2IHRpbWVvdXQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXJwY19jcG9ydF9jbGVhcl9yZXEgeworCV9fbGUxNiBjcG9ydF9pZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhcnBjX2Nwb3J0X2ZsdXNoX3JlcSB7CisJX19sZTE2IGNwb3J0X2lkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFycGNfY3BvcnRfc2h1dGRvd25fcmVxIHsKKwlfX2xlMTYgY3BvcnRfaWQ7CisJX19sZTE2IHRpbWVvdXQ7CisJX191OCBwaGFzZTsKK30gX19wYWNrZWQ7CisKKyNlbmRpZgkvKiBfX0FSUENfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fYXBicmlkZ2VhLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19hcGJyaWRnZWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjQyNTJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fYXBicmlkZ2VhLmMKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBHcmV5YnVzIEF1ZGlvIERldmljZSBDbGFzcyBQcm90b2NvbCBoZWxwZXJzCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBHb29nbGUgSW5jLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlICJncmV5YnVzLmgiCisjaW5jbHVkZSAiZ3JleWJ1c19wcm90b2NvbHMuaCIKKyNpbmNsdWRlICJhdWRpb19hcGJyaWRnZWEuaCIKKyNpbmNsdWRlICJhdWRpb19jb2RlYy5oIgorCitpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3NldF9jb25maWcoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICBfX3UxNiBpMnNfcG9ydCwgX191MzIgZm9ybWF0LCBfX3UzMiByYXRlLAorCQkJCSAgX191MzIgbWNsa19mcmVxKQoreworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfc2V0X2NvbmZpZ19yZXF1ZXN0IHJlcTsKKworCXJlcS5oZHIudHlwZSA9IEFVRElPX0FQQlJJREdFQV9UWVBFX1NFVF9DT05GSUc7CisJcmVxLmhkci5pMnNfcG9ydCA9IGNwdV90b19sZTE2KGkyc19wb3J0KTsKKwlyZXEuZm9ybWF0ID0gY3B1X3RvX2xlMzIoZm9ybWF0KTsKKwlyZXEucmF0ZSA9IGNwdV90b19sZTMyKHJhdGUpOworCXJlcS5tY2xrX2ZyZXEgPSBjcHVfdG9fbGUzMihtY2xrX2ZyZXEpOworCisJcmV0dXJuIGdiX2hkX291dHB1dChjb25uZWN0aW9uLT5oZCwgJnJlcSwgc2l6ZW9mKHJlcSksCisJCQkgICAgR0JfQVBCX1JFUVVFU1RfQVVESU9fQ09OVFJPTCwgdHJ1ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19hcGJyaWRnZWFfc2V0X2NvbmZpZyk7CisKK2ludCBnYl9hdWRpb19hcGJyaWRnZWFfcmVnaXN0ZXJfY3BvcnQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgICAgX191MTYgaTJzX3BvcnQsIF9fdTE2IGNwb3J0aWQsCisJCQkJICAgICAgX191OCBkaXJlY3Rpb24pCit7CisJc3RydWN0IGF1ZGlvX2FwYnJpZGdlYV9yZWdpc3Rlcl9jcG9ydF9yZXF1ZXN0IHJlcTsKKwlpbnQgcmV0OworCisJcmVxLmhkci50eXBlID0gQVVESU9fQVBCUklER0VBX1RZUEVfUkVHSVNURVJfQ1BPUlQ7CisJcmVxLmhkci5pMnNfcG9ydCA9IGNwdV90b19sZTE2KGkyc19wb3J0KTsKKwlyZXEuY3BvcnQgPSBjcHVfdG9fbGUxNihjcG9ydGlkKTsKKwlyZXEuZGlyZWN0aW9uID0gZGlyZWN0aW9uOworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhjb25uZWN0aW9uLT5idW5kbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gZ2JfaGRfb3V0cHV0KGNvbm5lY3Rpb24tPmhkLCAmcmVxLCBzaXplb2YocmVxKSwKKwkJCSAgICBHQl9BUEJfUkVRVUVTVF9BVURJT19DT05UUk9MLCB0cnVlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX2FwYnJpZGdlYV9yZWdpc3Rlcl9jcG9ydCk7CisKK2ludCBnYl9hdWRpb19hcGJyaWRnZWFfdW5yZWdpc3Rlcl9jcG9ydChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJX191MTYgaTJzX3BvcnQsIF9fdTE2IGNwb3J0aWQsCisJCQkJCV9fdTggZGlyZWN0aW9uKQoreworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfdW5yZWdpc3Rlcl9jcG9ydF9yZXF1ZXN0IHJlcTsKKwlpbnQgcmV0OworCisJcmVxLmhkci50eXBlID0gQVVESU9fQVBCUklER0VBX1RZUEVfVU5SRUdJU1RFUl9DUE9SVDsKKwlyZXEuaGRyLmkyc19wb3J0ID0gY3B1X3RvX2xlMTYoaTJzX3BvcnQpOworCXJlcS5jcG9ydCA9IGNwdV90b19sZTE2KGNwb3J0aWQpOworCXJlcS5kaXJlY3Rpb24gPSBkaXJlY3Rpb247CisKKwlyZXQgPSBnYl9oZF9vdXRwdXQoY29ubmVjdGlvbi0+aGQsICZyZXEsIHNpemVvZihyZXEpLAorCQkJICAgR0JfQVBCX1JFUVVFU1RfQVVESU9fQ09OVFJPTCwgdHJ1ZSk7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChjb25uZWN0aW9uLT5idW5kbGUpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX2FwYnJpZGdlYV91bnJlZ2lzdGVyX2Nwb3J0KTsKKworaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9zZXRfdHhfZGF0YV9zaXplKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQlfX3UxNiBpMnNfcG9ydCwgX191MTYgc2l6ZSkKK3sKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3NldF90eF9kYXRhX3NpemVfcmVxdWVzdCByZXE7CisKKwlyZXEuaGRyLnR5cGUgPSBBVURJT19BUEJSSURHRUFfVFlQRV9TRVRfVFhfREFUQV9TSVpFOworCXJlcS5oZHIuaTJzX3BvcnQgPSBjcHVfdG9fbGUxNihpMnNfcG9ydCk7CisJcmVxLnNpemUgPSBjcHVfdG9fbGUxNihzaXplKTsKKworCXJldHVybiBnYl9oZF9vdXRwdXQoY29ubmVjdGlvbi0+aGQsICZyZXEsIHNpemVvZihyZXEpLAorCQkJICAgIEdCX0FQQl9SRVFVRVNUX0FVRElPX0NPTlRST0wsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fYXBicmlkZ2VhX3NldF90eF9kYXRhX3NpemUpOworCitpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3ByZXBhcmVfdHgoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICBfX3UxNiBpMnNfcG9ydCkKK3sKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3ByZXBhcmVfdHhfcmVxdWVzdCByZXE7CisKKwlyZXEuaGRyLnR5cGUgPSBBVURJT19BUEJSSURHRUFfVFlQRV9QUkVQQVJFX1RYOworCXJlcS5oZHIuaTJzX3BvcnQgPSBjcHVfdG9fbGUxNihpMnNfcG9ydCk7CisKKwlyZXR1cm4gZ2JfaGRfb3V0cHV0KGNvbm5lY3Rpb24tPmhkLCAmcmVxLCBzaXplb2YocmVxKSwKKwkJCSAgICBHQl9BUEJfUkVRVUVTVF9BVURJT19DT05UUk9MLCB0cnVlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX2FwYnJpZGdlYV9wcmVwYXJlX3R4KTsKKworaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9zdGFydF90eChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQlfX3UxNiBpMnNfcG9ydCwgX191NjQgdGltZXN0YW1wKQoreworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfc3RhcnRfdHhfcmVxdWVzdCByZXE7CisKKwlyZXEuaGRyLnR5cGUgPSBBVURJT19BUEJSSURHRUFfVFlQRV9TVEFSVF9UWDsKKwlyZXEuaGRyLmkyc19wb3J0ID0gY3B1X3RvX2xlMTYoaTJzX3BvcnQpOworCXJlcS50aW1lc3RhbXAgPSBjcHVfdG9fbGU2NCh0aW1lc3RhbXApOworCisJcmV0dXJuIGdiX2hkX291dHB1dChjb25uZWN0aW9uLT5oZCwgJnJlcSwgc2l6ZW9mKHJlcSksCisJCQkgICAgR0JfQVBCX1JFUVVFU1RfQVVESU9fQ09OVFJPTCwgdHJ1ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19hcGJyaWRnZWFfc3RhcnRfdHgpOworCitpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3N0b3BfdHgoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIF9fdTE2IGkyc19wb3J0KQoreworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfc3RvcF90eF9yZXF1ZXN0IHJlcTsKKworCXJlcS5oZHIudHlwZSA9IEFVRElPX0FQQlJJREdFQV9UWVBFX1NUT1BfVFg7CisJcmVxLmhkci5pMnNfcG9ydCA9IGNwdV90b19sZTE2KGkyc19wb3J0KTsKKworCXJldHVybiBnYl9oZF9vdXRwdXQoY29ubmVjdGlvbi0+aGQsICZyZXEsIHNpemVvZihyZXEpLAorCQkJICAgIEdCX0FQQl9SRVFVRVNUX0FVRElPX0NPTlRST0wsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fYXBicmlkZ2VhX3N0b3BfdHgpOworCitpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3NodXRkb3duX3R4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgIF9fdTE2IGkyc19wb3J0KQoreworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfc2h1dGRvd25fdHhfcmVxdWVzdCByZXE7CisKKwlyZXEuaGRyLnR5cGUgPSBBVURJT19BUEJSSURHRUFfVFlQRV9TSFVURE9XTl9UWDsKKwlyZXEuaGRyLmkyc19wb3J0ID0gY3B1X3RvX2xlMTYoaTJzX3BvcnQpOworCisJcmV0dXJuIGdiX2hkX291dHB1dChjb25uZWN0aW9uLT5oZCwgJnJlcSwgc2l6ZW9mKHJlcSksCisJCQkgICAgR0JfQVBCX1JFUVVFU1RfQVVESU9fQ09OVFJPTCwgdHJ1ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19hcGJyaWRnZWFfc2h1dGRvd25fdHgpOworCitpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3NldF9yeF9kYXRhX3NpemUoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCV9fdTE2IGkyc19wb3J0LCBfX3UxNiBzaXplKQoreworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfc2V0X3J4X2RhdGFfc2l6ZV9yZXF1ZXN0IHJlcTsKKworCXJlcS5oZHIudHlwZSA9IEFVRElPX0FQQlJJREdFQV9UWVBFX1NFVF9SWF9EQVRBX1NJWkU7CisJcmVxLmhkci5pMnNfcG9ydCA9IGNwdV90b19sZTE2KGkyc19wb3J0KTsKKwlyZXEuc2l6ZSA9IGNwdV90b19sZTE2KHNpemUpOworCisJcmV0dXJuIGdiX2hkX291dHB1dChjb25uZWN0aW9uLT5oZCwgJnJlcSwgc2l6ZW9mKHJlcSksCisJCQkgICAgR0JfQVBCX1JFUVVFU1RfQVVESU9fQ09OVFJPTCwgdHJ1ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19hcGJyaWRnZWFfc2V0X3J4X2RhdGFfc2l6ZSk7CisKK2ludCBnYl9hdWRpb19hcGJyaWRnZWFfcHJlcGFyZV9yeChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgIF9fdTE2IGkyc19wb3J0KQoreworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfcHJlcGFyZV9yeF9yZXF1ZXN0IHJlcTsKKworCXJlcS5oZHIudHlwZSA9IEFVRElPX0FQQlJJREdFQV9UWVBFX1BSRVBBUkVfUlg7CisJcmVxLmhkci5pMnNfcG9ydCA9IGNwdV90b19sZTE2KGkyc19wb3J0KTsKKworCXJldHVybiBnYl9oZF9vdXRwdXQoY29ubmVjdGlvbi0+aGQsICZyZXEsIHNpemVvZihyZXEpLAorCQkJICAgIEdCX0FQQl9SRVFVRVNUX0FVRElPX0NPTlRST0wsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fYXBicmlkZ2VhX3ByZXBhcmVfcngpOworCitpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3N0YXJ0X3J4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCV9fdTE2IGkyc19wb3J0KQoreworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfc3RhcnRfcnhfcmVxdWVzdCByZXE7CisKKwlyZXEuaGRyLnR5cGUgPSBBVURJT19BUEJSSURHRUFfVFlQRV9TVEFSVF9SWDsKKwlyZXEuaGRyLmkyc19wb3J0ID0gY3B1X3RvX2xlMTYoaTJzX3BvcnQpOworCisJcmV0dXJuIGdiX2hkX291dHB1dChjb25uZWN0aW9uLT5oZCwgJnJlcSwgc2l6ZW9mKHJlcSksCisJCQkgICAgR0JfQVBCX1JFUVVFU1RfQVVESU9fQ09OVFJPTCwgdHJ1ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19hcGJyaWRnZWFfc3RhcnRfcngpOworCitpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3N0b3Bfcngoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIF9fdTE2IGkyc19wb3J0KQoreworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfc3RvcF9yeF9yZXF1ZXN0IHJlcTsKKworCXJlcS5oZHIudHlwZSA9IEFVRElPX0FQQlJJREdFQV9UWVBFX1NUT1BfUlg7CisJcmVxLmhkci5pMnNfcG9ydCA9IGNwdV90b19sZTE2KGkyc19wb3J0KTsKKworCXJldHVybiBnYl9oZF9vdXRwdXQoY29ubmVjdGlvbi0+aGQsICZyZXEsIHNpemVvZihyZXEpLAorCQkJICAgIEdCX0FQQl9SRVFVRVNUX0FVRElPX0NPTlRST0wsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fYXBicmlkZ2VhX3N0b3BfcngpOworCitpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3NodXRkb3duX3J4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgIF9fdTE2IGkyc19wb3J0KQoreworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfc2h1dGRvd25fcnhfcmVxdWVzdCByZXE7CisKKwlyZXEuaGRyLnR5cGUgPSBBVURJT19BUEJSSURHRUFfVFlQRV9TSFVURE9XTl9SWDsKKwlyZXEuaGRyLmkyc19wb3J0ID0gY3B1X3RvX2xlMTYoaTJzX3BvcnQpOworCisJcmV0dXJuIGdiX2hkX291dHB1dChjb25uZWN0aW9uLT5oZCwgJnJlcSwgc2l6ZW9mKHJlcSksCisJCQkgICAgR0JfQVBCX1JFUVVFU1RfQVVESU9fQ09OVFJPTCwgdHJ1ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19hcGJyaWRnZWFfc2h1dGRvd25fcngpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoImdyZXlidXM6YXVkaW8tYXBicmlkZ2VhIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdyZXlidXMgU3BlY2lhbCBBUEJyaWRnZUEgQXVkaW8gUHJvdG9jb2wgbGlicmFyeSIpOworTU9EVUxFX0FVVEhPUigiTWFyayBHcmVlciA8bWdyZWVyQGFuaW1hbGNyZWVrLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX2FwYnJpZGdlYS5oIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fYXBicmlkZ2VhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0Y2IwNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX2FwYnJpZGdlYS5oCkBAIC0wLDAgKzEsMTU2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKiBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CisgKiBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCisgKiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCisgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworLyoKKyAqIFRoaXMgaXMgYSBzcGVjaWFsIHByb3RvY29sIGZvciBjb25maWd1cmluZyBjb21tdW5pY2F0aW9uIG92ZXIgdGhlCisgKiBJMlMgYnVzIGJldHdlZW4gdGhlIERTUCBvbiB0aGUgTVNNODk5NCBhbmQgQVBCcmlkZ2VBLiAgVGhlcmVmb3JlLAorICogd2UgY2FuIHByZWRlZmluZSBzZXZlcmFsIGxvdy1sZXZlbCBhdHRyaWJ1dGVzIG9mIHRoZSBjb21tdW5pY2F0aW9uCisgKiBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuICBJbiBwYXJ0aWN1bGFyLCB0aGUgZm9sbG93aW5nCisgKiBhc3N1bXB0aW9ucyBhcmUgbWFkZToKKyAqCS0gdGhlcmUgYXJlIHR3byBjaGFubmVscyAoaS5lLiwgc3RlcmVvKQorICoJLSB0aGUgbG93LWxldmVsIHByb3RvY29sIGlzIEkyUyBhcyBkZWZpbmVkIGJ5IFBoaWxpcHMvTlhQCisgKgktIHRoZSBEU1Agb24gdGhlIE1TTTg5OTQgaXMgdGhlIGNsb2NrIG1hc3RlciBmb3IgTUNMSywgQkNMSywgYW5kIFdDTEsKKyAqCS0gV0NMSyBjaGFuZ2VzIG9uIHRoZSBmYWxsaW5nIGVkZ2Ugb2YgQkNMSworICoJLSBXQ0xLIGxvdyBmb3IgbGVmdCBjaGFubmVsOyBoaWdoIGZvciByaWdodCBjaGFubmVsCisgKgktIFRYIGRhdGEgaXMgc2VudCBvbiB0aGUgZmFsbGluZyBlZGdlIG9mIEJDTEsKKyAqCS0gUlggZGF0YSBpcyByZWNlaXZlZC9sYXRjaGVkIG9uIHRoZSByaXNpbmcgZWRnZSBvZiBCQ0xLCisgKi8KKworI2lmbmRlZiBfX0FVRElPX0FQQlJJREdFQV9ICisjZGVmaW5lIF9fQVVESU9fQVBCUklER0VBX0gKKworI2RlZmluZSBBVURJT19BUEJSSURHRUFfVFlQRV9TRVRfQ09ORklHCQkJMHgwMQorI2RlZmluZSBBVURJT19BUEJSSURHRUFfVFlQRV9SRUdJU1RFUl9DUE9SVAkJMHgwMgorI2RlZmluZSBBVURJT19BUEJSSURHRUFfVFlQRV9VTlJFR0lTVEVSX0NQT1JUCQkweDAzCisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9UWVBFX1NFVF9UWF9EQVRBX1NJWkUJCTB4MDQKKwkJCQkJCQkvKiAweDA1IHVudXNlZCAqLworI2RlZmluZSBBVURJT19BUEJSSURHRUFfVFlQRV9QUkVQQVJFX1RYCQkJMHgwNgorI2RlZmluZSBBVURJT19BUEJSSURHRUFfVFlQRV9TVEFSVF9UWAkJCTB4MDcKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1RZUEVfU1RPUF9UWAkJCTB4MDgKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1RZUEVfU0hVVERPV05fVFgJCTB4MDkKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1RZUEVfU0VUX1JYX0RBVEFfU0laRQkJMHgwYQorCQkJCQkJCS8qIDB4MGIgdW51c2VkICovCisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9UWVBFX1BSRVBBUkVfUlgJCQkweDBjCisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9UWVBFX1NUQVJUX1JYCQkJMHgwZAorI2RlZmluZSBBVURJT19BUEJSSURHRUFfVFlQRV9TVE9QX1JYCQkJMHgwZQorI2RlZmluZSBBVURJT19BUEJSSURHRUFfVFlQRV9TSFVURE9XTl9SWAkJMHgwZgorCisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9QQ01fRk1UXzgJCQlCSVQoMCkKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1BDTV9GTVRfMTYJCQlCSVQoMSkKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1BDTV9GTVRfMjQJCQlCSVQoMikKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1BDTV9GTVRfMzIJCQlCSVQoMykKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1BDTV9GTVRfNjQJCQlCSVQoNCkKKworI2RlZmluZSBBVURJT19BUEJSSURHRUFfUENNX1JBVEVfNTUxMgkJCUJJVCgwKQorI2RlZmluZSBBVURJT19BUEJSSURHRUFfUENNX1JBVEVfODAwMAkJCUJJVCgxKQorI2RlZmluZSBBVURJT19BUEJSSURHRUFfUENNX1JBVEVfMTEwMjUJCQlCSVQoMikKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1BDTV9SQVRFXzE2MDAwCQkJQklUKDMpCisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9QQ01fUkFURV8yMjA1MAkJCUJJVCg0KQorI2RlZmluZSBBVURJT19BUEJSSURHRUFfUENNX1JBVEVfMzIwMDAJCQlCSVQoNSkKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1BDTV9SQVRFXzQ0MTAwCQkJQklUKDYpCisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9QQ01fUkFURV80ODAwMAkJCUJJVCg3KQorI2RlZmluZSBBVURJT19BUEJSSURHRUFfUENNX1JBVEVfNjQwMDAJCQlCSVQoOCkKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1BDTV9SQVRFXzg4MjAwCQkJQklUKDkpCisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9QQ01fUkFURV85NjAwMAkJCUJJVCgxMCkKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1BDTV9SQVRFXzE3NjQwMAkJCUJJVCgxMSkKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1BDTV9SQVRFXzE5MjAwMAkJCUJJVCgxMikKKworI2RlZmluZSBBVURJT19BUEJSSURHRUFfRElSRUNUSU9OX1RYCQkJQklUKDApCisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9ESVJFQ1RJT05fUlgJCQlCSVQoMSkKKworLyogVGhlIEkyUyBwb3J0IGlzIHBhc3NlZCBpbiB0aGUgJ2luZGV4JyBwYXJhbWV0ZXIgb2YgdGhlIFVTQiByZXF1ZXN0ICovCisvKiBUaGUgQ1BvcnQgaXMgcGFzc2VkIGluIHRoZSAndmFsdWUnIHBhcmFtZXRlciBvZiB0aGUgVVNCIHJlcXVlc3QgKi8KKworc3RydWN0IGF1ZGlvX2FwYnJpZGdlYV9oZHIgeworCV9fdTgJdHlwZTsKKwlfX2xlMTYJaTJzX3BvcnQ7CisJX191OAlkYXRhWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGF1ZGlvX2FwYnJpZGdlYV9zZXRfY29uZmlnX3JlcXVlc3QgeworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfaGRyCWhkcjsKKwlfX2xlMzIJCQkJZm9ybWF0OwkvKiBBVURJT19BUEJSSURHRUFfUENNX0ZNVF8qICovCisJX19sZTMyCQkJCXJhdGU7CS8qIEFVRElPX0FQQlJJREdFQV9QQ01fUkFURV8qICovCisJX19sZTMyCQkJCW1jbGtfZnJlcTsgLyogWFhYIFJlbW92ZT8gKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhdWRpb19hcGJyaWRnZWFfcmVnaXN0ZXJfY3BvcnRfcmVxdWVzdCB7CisJc3RydWN0IGF1ZGlvX2FwYnJpZGdlYV9oZHIJaGRyOworCV9fbGUxNgkJCQljcG9ydDsKKwlfX3U4CQkJCWRpcmVjdGlvbjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhdWRpb19hcGJyaWRnZWFfdW5yZWdpc3Rlcl9jcG9ydF9yZXF1ZXN0IHsKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX2hkcgloZHI7CisJX19sZTE2CQkJCWNwb3J0OworCV9fdTgJCQkJZGlyZWN0aW9uOworfSBfX3BhY2tlZDsKKworc3RydWN0IGF1ZGlvX2FwYnJpZGdlYV9zZXRfdHhfZGF0YV9zaXplX3JlcXVlc3QgeworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfaGRyCWhkcjsKKwlfX2xlMTYJCQkJc2l6ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhdWRpb19hcGJyaWRnZWFfcHJlcGFyZV90eF9yZXF1ZXN0IHsKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX2hkcgloZHI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3N0YXJ0X3R4X3JlcXVlc3QgeworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfaGRyCWhkcjsKKwlfX2xlNjQJCQkJdGltZXN0YW1wOworfSBfX3BhY2tlZDsKKworc3RydWN0IGF1ZGlvX2FwYnJpZGdlYV9zdG9wX3R4X3JlcXVlc3QgeworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfaGRyCWhkcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhdWRpb19hcGJyaWRnZWFfc2h1dGRvd25fdHhfcmVxdWVzdCB7CisJc3RydWN0IGF1ZGlvX2FwYnJpZGdlYV9oZHIJaGRyOworfSBfX3BhY2tlZDsKKworc3RydWN0IGF1ZGlvX2FwYnJpZGdlYV9zZXRfcnhfZGF0YV9zaXplX3JlcXVlc3QgeworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfaGRyCWhkcjsKKwlfX2xlMTYJCQkJc2l6ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhdWRpb19hcGJyaWRnZWFfcHJlcGFyZV9yeF9yZXF1ZXN0IHsKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX2hkcgloZHI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3N0YXJ0X3J4X3JlcXVlc3QgeworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfaGRyCWhkcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhdWRpb19hcGJyaWRnZWFfc3RvcF9yeF9yZXF1ZXN0IHsKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX2hkcgloZHI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3NodXRkb3duX3J4X3JlcXVlc3QgeworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfaGRyCWhkcjsKK30gX19wYWNrZWQ7CisKKyNlbmRpZiAvKl9fQVVESU9fQVBCUklER0VBX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX2NvZGVjLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19jb2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMDc0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19jb2RlYy5jCkBAIC0wLDAgKzEsMTEzMiBAQAorLyoKKyAqIEFQQnJpZGdlIEFMU0EgU29DIGR1bW15IGNvZGVjIGRyaXZlcgorICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE2IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvaW5wdXQuaD4KKworI2luY2x1ZGUgImF1ZGlvX2NvZGVjLmgiCisjaW5jbHVkZSAiYXVkaW9fYXBicmlkZ2VhLmgiCisjaW5jbHVkZSAiYXVkaW9fbWFuYWdlci5oIgorCitzdGF0aWMgc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyAqZ2Jjb2RlYzsKKworc3RhdGljIHN0cnVjdCBnYmF1ZGlvX2RhdGFfY29ubmVjdGlvbiAqCitmaW5kX2RhdGEoc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSwgaW50IGlkKQoreworCXN0cnVjdCBnYmF1ZGlvX2RhdGFfY29ubmVjdGlvbiAqZGF0YTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGF0YSwgJm1vZHVsZS0+ZGF0YV9saXN0LCBsaXN0KSB7CisJCWlmIChpZCA9PSBkYXRhLT5pZCkKKwkJCXJldHVybiBkYXRhOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBnYmF1ZGlvX3N0cmVhbV9wYXJhbXMgKgorZmluZF9kYWlfc3RyZWFtX3BhcmFtcyhzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvICpjb2RlYywgaW50IGlkLCBpbnQgc3RyZWFtKQoreworCXN0cnVjdCBnYmF1ZGlvX2NvZGVjX2RhaSAqZGFpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkYWksICZjb2RlYy0+ZGFpX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGRhaS0+aWQgPT0gaWQpCisJCQlyZXR1cm4gJmRhaS0+cGFyYW1zW3N0cmVhbV07CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGdiYXVkaW9fbW9kdWxlX2VuYWJsZV90eChzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvICpjb2RlYywKKwkJCQkgICAgc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSwgaW50IGlkKQoreworCWludCBtb2R1bGVfc3RhdGUsIHJldCA9IDA7CisJdTE2IGRhdGFfY3BvcnQsIGkyc19wb3J0LCBjcG9ydGlkOworCXU4IHNpZ19iaXRzLCBjaGFubmVsczsKKwl1aW50MzJfdCBmb3JtYXQsIHJhdGU7CisJc3RydWN0IGdiYXVkaW9fZGF0YV9jb25uZWN0aW9uICpkYXRhOworCXN0cnVjdCBnYmF1ZGlvX3N0cmVhbV9wYXJhbXMgKnBhcmFtczsKKworCS8qIGZpbmQgdGhlIGRhaSAqLworCWRhdGEgPSBmaW5kX2RhdGEobW9kdWxlLCBpZCk7CisJaWYgKCFkYXRhKSB7CisJCWRldl9lcnIobW9kdWxlLT5kZXYsICIlZDpEQVRBIGNvbm5lY3Rpb24gbWlzc2luZ1xuIiwgaWQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJbW9kdWxlX3N0YXRlID0gZGF0YS0+c3RhdGVbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS107CisKKwlwYXJhbXMgPSBmaW5kX2RhaV9zdHJlYW1fcGFyYW1zKGNvZGVjLCBpZCwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyk7CisJaWYgKCFwYXJhbXMpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGZldGNoIGRhaV9zdHJlYW0gcG9pbnRlclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHJlZ2lzdGVyIGNwb3J0ICovCisJaWYgKG1vZHVsZV9zdGF0ZSA8IEdCQVVESU9fQ09ERUNfU1RBUlRVUCkgeworCQlpMnNfcG9ydCA9IDA7CS8qIGZpeGVkIGZvciBub3cgKi8KKwkJY3BvcnRpZCA9IGRhdGEtPmNvbm5lY3Rpb24tPmhkX2Nwb3J0X2lkOworCQlyZXQgPSBnYl9hdWRpb19hcGJyaWRnZWFfcmVnaXN0ZXJfY3BvcnQoZGF0YS0+Y29ubmVjdGlvbiwKKwkJCQkJCWkyc19wb3J0LCBjcG9ydGlkLAorCQkJCQkJQVVESU9fQVBCUklER0VBX0RJUkVDVElPTl9UWCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnJfcmF0ZWxpbWl0ZWQobW9kdWxlLT5kZXYsCisJCQkJCSAgICAicmVnX2Nwb3J0IGZhaWxlZDolZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZGF0YS0+c3RhdGVbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPQorCQkJR0JBVURJT19DT0RFQ19TVEFSVFVQOworCQlkZXZfZGJnKG1vZHVsZS0+ZGV2LCAiRHluYW1pYyBSZWdpc3RlciAlZCBEQUlcbiIsIGNwb3J0aWQpOworCX0KKworCS8qIGh3X3BhcmFtcyAqLworCWlmIChtb2R1bGVfc3RhdGUgPCBHQkFVRElPX0NPREVDX0hXUEFSQU1TKSB7CisJCWZvcm1hdCA9IHBhcmFtcy0+Zm9ybWF0OworCQljaGFubmVscyA9IHBhcmFtcy0+Y2hhbm5lbHM7CisJCXJhdGUgPSBwYXJhbXMtPnJhdGU7CisJCXNpZ19iaXRzID0gcGFyYW1zLT5zaWdfYml0czsKKwkJZGF0YV9jcG9ydCA9IGRhdGEtPmNvbm5lY3Rpb24tPmludGZfY3BvcnRfaWQ7CisJCXJldCA9IGdiX2F1ZGlvX2diX3NldF9wY20obW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24sIGRhdGFfY3BvcnQsCisJCQkJCSAgZm9ybWF0LCByYXRlLCBjaGFubmVscywgc2lnX2JpdHMpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LCAic2V0X3BjbSBmYWlsZWQ6JWRcbiIsCisJCQkJCSAgICByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlkYXRhLT5zdGF0ZVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9CisJCQlHQkFVRElPX0NPREVDX0hXUEFSQU1TOworCQlkZXZfZGJnKG1vZHVsZS0+ZGV2LCAiRHluYW1pYyBod19wYXJhbXMgJWQgREFJXG4iLCBkYXRhX2Nwb3J0KTsKKwl9CisKKwkvKiBwcmVwYXJlICovCisJaWYgKG1vZHVsZV9zdGF0ZSA8IEdCQVVESU9fQ09ERUNfUFJFUEFSRSkgeworCQlkYXRhX2Nwb3J0ID0gZGF0YS0+Y29ubmVjdGlvbi0+aW50Zl9jcG9ydF9pZDsKKwkJcmV0ID0gZ2JfYXVkaW9fZ2Jfc2V0X3R4X2RhdGFfc2l6ZShtb2R1bGUtPm1nbXRfY29ubmVjdGlvbiwKKwkJCQkJCSAgIGRhdGFfY3BvcnQsIDE5Mik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnJfcmF0ZWxpbWl0ZWQobW9kdWxlLT5kZXYsCisJCQkJCSAgICAic2V0X3R4X2RhdGFfc2l6ZSBmYWlsZWQ6JWRcbiIsCisJCQkJCSAgICByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZXQgPSBnYl9hdWRpb19nYl9hY3RpdmF0ZV90eChtb2R1bGUtPm1nbXRfY29ubmVjdGlvbiwKKwkJCQkJICAgICAgZGF0YV9jcG9ydCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnJfcmF0ZWxpbWl0ZWQobW9kdWxlLT5kZXYsCisJCQkJCSAgICAiYWN0aXZhdGVfdHggZmFpbGVkOiVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlkYXRhLT5zdGF0ZVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9CisJCQlHQkFVRElPX0NPREVDX1BSRVBBUkU7CisJCWRldl9kYmcobW9kdWxlLT5kZXYsICJEeW5hbWljIHByZXBhcmUgJWQgREFJXG4iLCBkYXRhX2Nwb3J0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX21vZHVsZV9kaXNhYmxlX3R4KHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUsIGludCBpZCkKK3sKKwlpbnQgcmV0OworCXUxNiBkYXRhX2Nwb3J0LCBjcG9ydGlkLCBpMnNfcG9ydDsKKwlpbnQgbW9kdWxlX3N0YXRlOworCXN0cnVjdCBnYmF1ZGlvX2RhdGFfY29ubmVjdGlvbiAqZGF0YTsKKworCS8qIGZpbmQgdGhlIGRhaSAqLworCWRhdGEgPSBmaW5kX2RhdGEobW9kdWxlLCBpZCk7CisJaWYgKCFkYXRhKSB7CisJCWRldl9lcnIobW9kdWxlLT5kZXYsICIlZDpEQVRBIGNvbm5lY3Rpb24gbWlzc2luZ1xuIiwgaWQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJbW9kdWxlX3N0YXRlID0gZGF0YS0+c3RhdGVbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS107CisKKwlpZiAobW9kdWxlX3N0YXRlID4gR0JBVURJT19DT0RFQ19IV1BBUkFNUykgeworCQlkYXRhX2Nwb3J0ID0gZGF0YS0+Y29ubmVjdGlvbi0+aW50Zl9jcG9ydF9pZDsKKwkJcmV0ID0gZ2JfYXVkaW9fZ2JfZGVhY3RpdmF0ZV90eChtb2R1bGUtPm1nbXRfY29ubmVjdGlvbiwKKwkJCQkJCWRhdGFfY3BvcnQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LAorCQkJCQkgICAgImRlYWN0aXZhdGVfdHggZmFpbGVkOiVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlkZXZfZGJnKG1vZHVsZS0+ZGV2LCAiRHluYW1pYyBkZWFjdGl2YXRlICVkIERBSVxuIiwgZGF0YV9jcG9ydCk7CisJCWRhdGEtPnN0YXRlW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0KKwkJCUdCQVVESU9fQ09ERUNfSFdQQVJBTVM7CisJfQorCisJaWYgKG1vZHVsZV9zdGF0ZSA+IEdCQVVESU9fQ09ERUNfU0hVVERPV04pIHsKKwkJaTJzX3BvcnQgPSAwOwkvKiBmaXhlZCBmb3Igbm93ICovCisJCWNwb3J0aWQgPSBkYXRhLT5jb25uZWN0aW9uLT5oZF9jcG9ydF9pZDsKKwkJcmV0ID0gZ2JfYXVkaW9fYXBicmlkZ2VhX3VucmVnaXN0ZXJfY3BvcnQoZGF0YS0+Y29ubmVjdGlvbiwKKwkJCQkJCWkyc19wb3J0LCBjcG9ydGlkLAorCQkJCQkJQVVESU9fQVBCUklER0VBX0RJUkVDVElPTl9UWCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnJfcmF0ZWxpbWl0ZWQobW9kdWxlLT5kZXYsCisJCQkJCSAgICAidW5yZWdpc3Rlcl9jcG9ydCBmYWlsZWQ6JWRcbiIsCisJCQkJCSAgICByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlkZXZfZGJnKG1vZHVsZS0+ZGV2LCAiRHluYW1pYyBVbnJlZ2lzdGVyICVkIERBSVxuIiwgY3BvcnRpZCk7CisJCWRhdGEtPnN0YXRlW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0KKwkJCUdCQVVESU9fQ09ERUNfU0hVVERPV047CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JhdWRpb19tb2R1bGVfZW5hYmxlX3J4KHN0cnVjdCBnYmF1ZGlvX2NvZGVjX2luZm8gKmNvZGVjLAorCQkJCSAgICBzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlLCBpbnQgaWQpCit7CisJaW50IG1vZHVsZV9zdGF0ZSwgcmV0ID0gMDsKKwl1MTYgZGF0YV9jcG9ydCwgaTJzX3BvcnQsIGNwb3J0aWQ7CisJdTggc2lnX2JpdHMsIGNoYW5uZWxzOworCXVpbnQzMl90IGZvcm1hdCwgcmF0ZTsKKwlzdHJ1Y3QgZ2JhdWRpb19kYXRhX2Nvbm5lY3Rpb24gKmRhdGE7CisJc3RydWN0IGdiYXVkaW9fc3RyZWFtX3BhcmFtcyAqcGFyYW1zOworCisJLyogZmluZCB0aGUgZGFpICovCisJZGF0YSA9IGZpbmRfZGF0YShtb2R1bGUsIGlkKTsKKwlpZiAoIWRhdGEpIHsKKwkJZGV2X2Vycihtb2R1bGUtPmRldiwgIiVkOkRBVEEgY29ubmVjdGlvbiBtaXNzaW5nXG4iLCBpZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwltb2R1bGVfc3RhdGUgPSBkYXRhLT5zdGF0ZVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdOworCisJcGFyYW1zID0gZmluZF9kYWlfc3RyZWFtX3BhcmFtcyhjb2RlYywgaWQsIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CisJaWYgKCFwYXJhbXMpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGZldGNoIGRhaV9zdHJlYW0gcG9pbnRlclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHJlZ2lzdGVyIGNwb3J0ICovCisJaWYgKG1vZHVsZV9zdGF0ZSA8IEdCQVVESU9fQ09ERUNfU1RBUlRVUCkgeworCQlpMnNfcG9ydCA9IDA7CS8qIGZpeGVkIGZvciBub3cgKi8KKwkJY3BvcnRpZCA9IGRhdGEtPmNvbm5lY3Rpb24tPmhkX2Nwb3J0X2lkOworCQlyZXQgPSBnYl9hdWRpb19hcGJyaWRnZWFfcmVnaXN0ZXJfY3BvcnQoZGF0YS0+Y29ubmVjdGlvbiwKKwkJCQkJCWkyc19wb3J0LCBjcG9ydGlkLAorCQkJCQkJQVVESU9fQVBCUklER0VBX0RJUkVDVElPTl9SWCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnJfcmF0ZWxpbWl0ZWQobW9kdWxlLT5kZXYsCisJCQkJCSAgICAicmVnX2Nwb3J0IGZhaWxlZDolZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZGF0YS0+c3RhdGVbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9CisJCQlHQkFVRElPX0NPREVDX1NUQVJUVVA7CisJCWRldl9kYmcobW9kdWxlLT5kZXYsICJEeW5hbWljIFJlZ2lzdGVyICVkIERBSVxuIiwgY3BvcnRpZCk7CisJfQorCisJLyogaHdfcGFyYW1zICovCisJaWYgKG1vZHVsZV9zdGF0ZSA8IEdCQVVESU9fQ09ERUNfSFdQQVJBTVMpIHsKKwkJZm9ybWF0ID0gcGFyYW1zLT5mb3JtYXQ7CisJCWNoYW5uZWxzID0gcGFyYW1zLT5jaGFubmVsczsKKwkJcmF0ZSA9IHBhcmFtcy0+cmF0ZTsKKwkJc2lnX2JpdHMgPSBwYXJhbXMtPnNpZ19iaXRzOworCQlkYXRhX2Nwb3J0ID0gZGF0YS0+Y29ubmVjdGlvbi0+aW50Zl9jcG9ydF9pZDsKKwkJcmV0ID0gZ2JfYXVkaW9fZ2Jfc2V0X3BjbShtb2R1bGUtPm1nbXRfY29ubmVjdGlvbiwgZGF0YV9jcG9ydCwKKwkJCQkJICBmb3JtYXQsIHJhdGUsIGNoYW5uZWxzLCBzaWdfYml0cyk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnJfcmF0ZWxpbWl0ZWQobW9kdWxlLT5kZXYsICJzZXRfcGNtIGZhaWxlZDolZFxuIiwKKwkJCQkJICAgIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWRhdGEtPnN0YXRlW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0gPQorCQkJR0JBVURJT19DT0RFQ19IV1BBUkFNUzsKKwkJZGV2X2RiZyhtb2R1bGUtPmRldiwgIkR5bmFtaWMgaHdfcGFyYW1zICVkIERBSVxuIiwgZGF0YV9jcG9ydCk7CisJfQorCisJLyogcHJlcGFyZSAqLworCWlmIChtb2R1bGVfc3RhdGUgPCBHQkFVRElPX0NPREVDX1BSRVBBUkUpIHsKKwkJZGF0YV9jcG9ydCA9IGRhdGEtPmNvbm5lY3Rpb24tPmludGZfY3BvcnRfaWQ7CisJCXJldCA9IGdiX2F1ZGlvX2diX3NldF9yeF9kYXRhX3NpemUobW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24sCisJCQkJCQkgICBkYXRhX2Nwb3J0LCAxOTIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LAorCQkJCQkgICAgInNldF9yeF9kYXRhX3NpemUgZmFpbGVkOiVkXG4iLAorCQkJCQkgICAgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0ID0gZ2JfYXVkaW9fZ2JfYWN0aXZhdGVfcngobW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24sCisJCQkJCSAgICAgIGRhdGFfY3BvcnQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LAorCQkJCQkgICAgImFjdGl2YXRlX3J4IGZhaWxlZDolZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZGF0YS0+c3RhdGVbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9CisJCQlHQkFVRElPX0NPREVDX1BSRVBBUkU7CisJCWRldl9kYmcobW9kdWxlLT5kZXYsICJEeW5hbWljIHByZXBhcmUgJWQgREFJXG4iLCBkYXRhX2Nwb3J0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX21vZHVsZV9kaXNhYmxlX3J4KHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUsIGludCBpZCkKK3sKKwlpbnQgcmV0OworCXUxNiBkYXRhX2Nwb3J0LCBjcG9ydGlkLCBpMnNfcG9ydDsKKwlpbnQgbW9kdWxlX3N0YXRlOworCXN0cnVjdCBnYmF1ZGlvX2RhdGFfY29ubmVjdGlvbiAqZGF0YTsKKworCS8qIGZpbmQgdGhlIGRhaSAqLworCWRhdGEgPSBmaW5kX2RhdGEobW9kdWxlLCBpZCk7CisJaWYgKCFkYXRhKSB7CisJCWRldl9lcnIobW9kdWxlLT5kZXYsICIlZDpEQVRBIGNvbm5lY3Rpb24gbWlzc2luZ1xuIiwgaWQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJbW9kdWxlX3N0YXRlID0gZGF0YS0+c3RhdGVbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXTsKKworCWlmIChtb2R1bGVfc3RhdGUgPiBHQkFVRElPX0NPREVDX0hXUEFSQU1TKSB7CisJCWRhdGFfY3BvcnQgPSBkYXRhLT5jb25uZWN0aW9uLT5pbnRmX2Nwb3J0X2lkOworCQlyZXQgPSBnYl9hdWRpb19nYl9kZWFjdGl2YXRlX3J4KG1vZHVsZS0+bWdtdF9jb25uZWN0aW9uLAorCQkJCQkJZGF0YV9jcG9ydCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnJfcmF0ZWxpbWl0ZWQobW9kdWxlLT5kZXYsCisJCQkJCSAgICAiZGVhY3RpdmF0ZV9yeCBmYWlsZWQ6JWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWRldl9kYmcobW9kdWxlLT5kZXYsICJEeW5hbWljIGRlYWN0aXZhdGUgJWQgREFJXG4iLCBkYXRhX2Nwb3J0KTsKKwkJZGF0YS0+c3RhdGVbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9CisJCQlHQkFVRElPX0NPREVDX0hXUEFSQU1TOworCX0KKworCWlmIChtb2R1bGVfc3RhdGUgPiBHQkFVRElPX0NPREVDX1NIVVRET1dOKSB7CisJCWkyc19wb3J0ID0gMDsJLyogZml4ZWQgZm9yIG5vdyAqLworCQljcG9ydGlkID0gZGF0YS0+Y29ubmVjdGlvbi0+aGRfY3BvcnRfaWQ7CisJCXJldCA9IGdiX2F1ZGlvX2FwYnJpZGdlYV91bnJlZ2lzdGVyX2Nwb3J0KGRhdGEtPmNvbm5lY3Rpb24sCisJCQkJCQlpMnNfcG9ydCwgY3BvcnRpZCwKKwkJCQkJCUFVRElPX0FQQlJJREdFQV9ESVJFQ1RJT05fUlgpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LAorCQkJCQkgICAgInVucmVnaXN0ZXJfY3BvcnQgZmFpbGVkOiVkXG4iLAorCQkJCQkgICAgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZGV2X2RiZyhtb2R1bGUtPmRldiwgIkR5bmFtaWMgVW5yZWdpc3RlciAlZCBEQUlcbiIsIGNwb3J0aWQpOworCQlkYXRhLT5zdGF0ZVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0KKwkJCUdCQVVESU9fQ09ERUNfU0hVVERPV047CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYmF1ZGlvX21vZHVsZV91cGRhdGUoc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyAqY29kZWMsCisJCQkgIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJICBzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlLCBpbnQgZW5hYmxlKQoreworCWludCBkYWlfaWQsIHJldDsKKwljaGFyIGludGZfbmFtZVtOQU1FX1NJWkVdLCBkaXJbTkFNRV9TSVpFXTsKKworCWRldl9kYmcobW9kdWxlLT5kZXYsICIlczpNb2R1bGUgdXBkYXRlICVzIHNlcXVlbmNlXG4iLCB3LT5uYW1lLAorCQllbmFibGUgPyAiRW5hYmxlIjoiRGlzYWJsZSIpOworCisJaWYgKCh3LT5pZCAhPSBzbmRfc29jX2RhcG1fYWlmX2luKSAmJiAody0+aWQgIT0gc25kX3NvY19kYXBtX2FpZl9vdXQpKSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIk5vIGFjdGlvbiByZXF1aXJlZCBmb3IgJXNcbiIsIHctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBwYXJzZSBkYWlfaWQgZnJvbSBBSUYgd2lkZ2V0J3Mgc3RyZWFtX25hbWUgKi8KKwlyZXQgPSBzc2NhbmYody0+c25hbWUsICIlcyAlZCAlcyIsIGludGZfbmFtZSwgJmRhaV9pZCwgZGlyKTsKKwlpZiAocmV0IDwgMykgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJFcnJvciB3aGlsZSBwYXJzaW5nIGRhaV9pZCBmb3IgJXNcbiIsCisJCQl3LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmY29kZWMtPmxvY2spOworCWlmICh3LT5pZCA9PSBzbmRfc29jX2RhcG1fYWlmX2luKSB7CisJCWlmIChlbmFibGUpCisJCQlyZXQgPSBnYmF1ZGlvX21vZHVsZV9lbmFibGVfdHgoY29kZWMsIG1vZHVsZSwgZGFpX2lkKTsKKwkJZWxzZQorCQkJcmV0ID0gZ2JhdWRpb19tb2R1bGVfZGlzYWJsZV90eChtb2R1bGUsIGRhaV9pZCk7CisJfSBlbHNlIGlmICh3LT5pZCA9PSBzbmRfc29jX2RhcG1fYWlmX291dCkgeworCQlpZiAoZW5hYmxlKQorCQkJcmV0ID0gZ2JhdWRpb19tb2R1bGVfZW5hYmxlX3J4KGNvZGVjLCBtb2R1bGUsIGRhaV9pZCk7CisJCWVsc2UKKwkJCXJldCA9IGdiYXVkaW9fbW9kdWxlX2Rpc2FibGVfcngobW9kdWxlLCBkYWlfaWQpOworCX0KKworCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZ2JhdWRpb19tb2R1bGVfdXBkYXRlKTsKKworLyoKKyAqIGNvZGVjIERBSSBvcHMKKyAqLworc3RhdGljIGludCBnYmNvZGVjX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvICpjb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisJc3RydWN0IGdiYXVkaW9fc3RyZWFtX3BhcmFtcyAqcGFyYW1zOworCisJbXV0ZXhfbG9jaygmY29kZWMtPmxvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJmNvZGVjLT5tb2R1bGVfbGlzdCkpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiTm8gY29kZWMgbW9kdWxlIGF2YWlsYWJsZVxuIik7CisJCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwYXJhbXMgPSBmaW5kX2RhaV9zdHJlYW1fcGFyYW1zKGNvZGVjLCBkYWktPmlkLCBzdWJzdHJlYW0tPnN0cmVhbSk7CisJaWYgKCFwYXJhbXMpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGZldGNoIGRhaV9zdHJlYW0gcG9pbnRlclxuIik7CisJCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGFyYW1zLT5zdGF0ZSA9IEdCQVVESU9fQ09ERUNfU1RBUlRVUDsKKwltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwkvKiB0byBwcmV2ZW50IHN1c3BlbmQgaW4gY2FzZSBvZiBhY3RpdmUgYXVkaW8gKi8KKwlwbV9zdGF5X2F3YWtlKGRhaS0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnYmNvZGVjX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvICpjb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisJc3RydWN0IGdiYXVkaW9fc3RyZWFtX3BhcmFtcyAqcGFyYW1zOworCisJbXV0ZXhfbG9jaygmY29kZWMtPmxvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJmNvZGVjLT5tb2R1bGVfbGlzdCkpCisJCWRldl9pbmZvKGNvZGVjLT5kZXYsICJObyBjb2RlYyBtb2R1bGUgYXZhaWxhYmxlIGR1cmluZyBzaHV0ZG93blxuIik7CisKKwlwYXJhbXMgPSBmaW5kX2RhaV9zdHJlYW1fcGFyYW1zKGNvZGVjLCBkYWktPmlkLCBzdWJzdHJlYW0tPnN0cmVhbSk7CisJaWYgKCFwYXJhbXMpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGZldGNoIGRhaV9zdHJlYW0gcG9pbnRlclxuIik7CisJCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCQlyZXR1cm47CisJfQorCXBhcmFtcy0+c3RhdGUgPSBHQkFVRElPX0NPREVDX1NIVVRET1dOOworCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCXBtX3JlbGF4KGRhaS0+ZGV2KTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgZ2Jjb2RlY19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdwYXJhbXMsCisJCQkgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCWludCByZXQ7CisJdTggc2lnX2JpdHMsIGNoYW5uZWxzOworCXVpbnQzMl90IGZvcm1hdCwgcmF0ZTsKKwlzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlOworCXN0cnVjdCBnYmF1ZGlvX2RhdGFfY29ubmVjdGlvbiAqZGF0YTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGU7CisJc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOworCXN0cnVjdCBnYmF1ZGlvX3N0cmVhbV9wYXJhbXMgKnBhcmFtczsKKworCW11dGV4X2xvY2soJmNvZGVjLT5sb2NrKTsKKworCWlmIChsaXN0X2VtcHR5KCZjb2RlYy0+bW9kdWxlX2xpc3QpKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIk5vIGNvZGVjIG1vZHVsZSBhdmFpbGFibGVcbiIpOworCQltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyoKKwkgKiBhc3N1bWluZywgY3VycmVudGx5IG9ubHkgNDgwMDAgSHosIDE2QklUX0xFLCBzdGVyZW8KKwkgKiBpcyBzdXBwb3J0ZWQsIHZhbGlkYXRlIHBhcmFtcyBiZWZvcmUgY29uZmlndXJpbmcgY29kZWMKKwkgKi8KKwlpZiAocGFyYW1zX2NoYW5uZWxzKGh3cGFyYW1zKSAhPSAyKSB7CisJCWRldl9lcnIoZGFpLT5kZXYsICJJbnZhbGlkIGNoYW5uZWwgY291bnQ6JWRcbiIsCisJCQlwYXJhbXNfY2hhbm5lbHMoaHdwYXJhbXMpKTsKKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhod3BhcmFtcyk7CisKKwlpZiAocGFyYW1zX3JhdGUoaHdwYXJhbXMpICE9IDQ4MDAwKSB7CisJCWRldl9lcnIoZGFpLT5kZXYsICJJbnZhbGlkIHNhbXBsaW5nIHJhdGU6JWRcbiIsCisJCQlwYXJhbXNfcmF0ZShod3BhcmFtcykpOworCQltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJhdGUgPSBHQl9BVURJT19QQ01fUkFURV80ODAwMDsKKworCWlmIChwYXJhbXNfZm9ybWF0KGh3cGFyYW1zKSAhPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSkgeworCQlkZXZfZXJyKGRhaS0+ZGV2LCAiSW52YWxpZCBmb3JtYXQ6JWRcbiIsCisJCQlwYXJhbXNfZm9ybWF0KGh3cGFyYW1zKSk7CisJCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZm9ybWF0ID0gR0JfQVVESU9fUENNX0ZNVF9TMTZfTEU7CisKKwkvKiBmaW5kIHRoZSBkYXRhIGNvbm5lY3Rpb24gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZHVsZSwgJmNvZGVjLT5tb2R1bGVfbGlzdCwgbGlzdCkgeworCQlkYXRhID0gZmluZF9kYXRhKG1vZHVsZSwgZGFpLT5pZCk7CisJCWlmIChkYXRhKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFkYXRhKSB7CisJCWRldl9lcnIoZGFpLT5kZXYsICJEQVRBIGNvbm5lY3Rpb24gbWlzc2luZ1xuIik7CisJCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwYXJhbXMgPSBmaW5kX2RhaV9zdHJlYW1fcGFyYW1zKGNvZGVjLCBkYWktPmlkLCBzdWJzdHJlYW0tPnN0cmVhbSk7CisJaWYgKCFwYXJhbXMpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGZldGNoIGRhaV9zdHJlYW0gcG9pbnRlclxuIik7CisJCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlidW5kbGUgPSB0b19nYl9idW5kbGUobW9kdWxlLT5kZXYpOworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0KSB7CisJCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGdiX2F1ZGlvX2FwYnJpZGdlYV9zZXRfY29uZmlnKGRhdGEtPmNvbm5lY3Rpb24sIDAsCisJCQkJCSAgICBBVURJT19BUEJSSURHRUFfUENNX0ZNVF8xNiwKKwkJCQkJICAgIEFVRElPX0FQQlJJREdFQV9QQ01fUkFURV80ODAwMCwKKwkJCQkJICAgIDYxNDQwMDApOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChkYWktPmRldiwgIiVkOiBFcnJvciBkdXJpbmcgc2V0X2NvbmZpZ1xuIiwKKwkJCQkgICAgcmV0KTsKKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bG9jayk7CisJCXJldHVybiByZXQ7CisJfQorCisJZ2JfcG1fcnVudGltZV9wdXRfbm9pZGxlKGJ1bmRsZSk7CisKKwlwYXJhbXMtPnN0YXRlID0gR0JBVURJT19DT0RFQ19IV1BBUkFNUzsKKwlwYXJhbXMtPmZvcm1hdCA9IGZvcm1hdDsKKwlwYXJhbXMtPnJhdGUgPSByYXRlOworCXBhcmFtcy0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKwlwYXJhbXMtPnNpZ19iaXRzID0gc2lnX2JpdHM7CisKKwltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYmNvZGVjX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGU7CisJc3RydWN0IGdiYXVkaW9fZGF0YV9jb25uZWN0aW9uICpkYXRhOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZTsKKwlzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvICpjb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisJc3RydWN0IGdiYXVkaW9fc3RyZWFtX3BhcmFtcyAqcGFyYW1zOworCisJbXV0ZXhfbG9jaygmY29kZWMtPmxvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJmNvZGVjLT5tb2R1bGVfbGlzdCkpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiTm8gY29kZWMgbW9kdWxlIGF2YWlsYWJsZVxuIik7CisJCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZHVsZSwgJmNvZGVjLT5tb2R1bGVfbGlzdCwgbGlzdCkgeworCQkvKiBmaW5kIHRoZSBkYWkgKi8KKwkJZGF0YSA9IGZpbmRfZGF0YShtb2R1bGUsIGRhaS0+aWQpOworCQlpZiAoZGF0YSkKKwkJCWJyZWFrOworCX0KKwlpZiAoIWRhdGEpIHsKKwkJZGV2X2VycihkYWktPmRldiwgIkRBVEEgY29ubmVjdGlvbiBtaXNzaW5nXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bG9jayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBhcmFtcyA9IGZpbmRfZGFpX3N0cmVhbV9wYXJhbXMoY29kZWMsIGRhaS0+aWQsIHN1YnN0cmVhbS0+c3RyZWFtKTsKKwlpZiAoIXBhcmFtcykgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gZmV0Y2ggZGFpX3N0cmVhbSBwb2ludGVyXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJ1bmRsZSA9IHRvX2diX2J1bmRsZShtb2R1bGUtPmRldik7CisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bG9jayk7CisJCXJldHVybiByZXQ7CisJfQorCisJc3dpdGNoIChzdWJzdHJlYW0tPnN0cmVhbSkgeworCWNhc2UgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzoKKwkJcmV0ID0gZ2JfYXVkaW9fYXBicmlkZ2VhX3NldF90eF9kYXRhX3NpemUoZGF0YS0+Y29ubmVjdGlvbiwgMCwKKwkJCQkJCQkgIDE5Mik7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFOgorCQlyZXQgPSBnYl9hdWRpb19hcGJyaWRnZWFfc2V0X3J4X2RhdGFfc2l6ZShkYXRhLT5jb25uZWN0aW9uLCAwLAorCQkJCQkJCSAgMTkyKTsKKwkJYnJlYWs7CisJfQorCWlmIChyZXQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bG9jayk7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoZGFpLT5kZXYsICJzZXRfZGF0YV9zaXplIGZhaWxlZDolZFxuIiwKKwkJCQkgICAgIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZ2JfcG1fcnVudGltZV9wdXRfbm9pZGxlKGJ1bmRsZSk7CisKKwlwYXJhbXMtPnN0YXRlID0gR0JBVURJT19DT0RFQ19QUkVQQVJFOworCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiY29kZWNfbXV0ZV9zdHJlYW0oc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBtdXRlLCBpbnQgc3RyZWFtKQoreworCWludCByZXQ7CisJc3RydWN0IGdiYXVkaW9fZGF0YV9jb25uZWN0aW9uICpkYXRhOworCXN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGU7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlOworCXN0cnVjdCBnYmF1ZGlvX2NvZGVjX2luZm8gKmNvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKwlzdHJ1Y3QgZ2JhdWRpb19zdHJlYW1fcGFyYW1zICpwYXJhbXM7CisKKworCWRldl9kYmcoZGFpLT5kZXYsICJNdXRlOiVkLCBEaXJlY3Rpb246JXNcbiIsIG11dGUsCisJCXN0cmVhbSA/ICJDQVBUVVJFIjoiUExBWUJBQ0siKTsKKworCW11dGV4X2xvY2soJmNvZGVjLT5sb2NrKTsKKworCXBhcmFtcyA9IGZpbmRfZGFpX3N0cmVhbV9wYXJhbXMoY29kZWMsIGRhaS0+aWQsIHN0cmVhbSk7CisJaWYgKCFwYXJhbXMpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGZldGNoIGRhaV9zdHJlYW0gcG9pbnRlclxuIik7CisJCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobGlzdF9lbXB0eSgmY29kZWMtPm1vZHVsZV9saXN0KSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJObyBjb2RlYyBtb2R1bGUgYXZhaWxhYmxlXG4iKTsKKwkJaWYgKG11dGUpIHsKKwkJCXBhcmFtcy0+c3RhdGUgPSBHQkFVRElPX0NPREVDX1NUT1A7CisJCQlyZXQgPSAwOworCQl9IGVsc2UgeworCQkJcmV0ID0gLUVOT0RFVjsKKwkJfQorCQltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZHVsZSwgJmNvZGVjLT5tb2R1bGVfbGlzdCwgbGlzdCkgeworCQkvKiBmaW5kIHRoZSBkYWkgKi8KKwkJZGF0YSA9IGZpbmRfZGF0YShtb2R1bGUsIGRhaS0+aWQpOworCQlpZiAoZGF0YSkKKwkJCWJyZWFrOworCX0KKwlpZiAoIWRhdGEpIHsKKwkJZGV2X2VycihkYWktPmRldiwgIiVzOiVzIERBVEEgY29ubmVjdGlvbiBtaXNzaW5nXG4iLAorCQkJZGFpLT5uYW1lLCBtb2R1bGUtPm5hbWUpOworCQltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJYnVuZGxlID0gdG9fZ2JfYnVuZGxlKG1vZHVsZS0+ZGV2KTsKKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGJ1bmRsZSk7CisJaWYgKHJldCkgeworCQltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIW11dGUgJiYgIXN0cmVhbSkgey8qIHN0YXJ0IHBsYXliYWNrICovCisJCXJldCA9IGdiX2F1ZGlvX2FwYnJpZGdlYV9wcmVwYXJlX3R4KGRhdGEtPmNvbm5lY3Rpb24sCisJCQkJCQkgICAgMCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gZ2JfYXVkaW9fYXBicmlkZ2VhX3N0YXJ0X3R4KGRhdGEtPmNvbm5lY3Rpb24sCisJCQkJCQkJICAwLCAwKTsKKwkJcGFyYW1zLT5zdGF0ZSA9IEdCQVVESU9fQ09ERUNfU1RBUlQ7CisJfSBlbHNlIGlmICghbXV0ZSAmJiBzdHJlYW0pIHsvKiBzdGFydCBjYXB0dXJlICovCisJCXJldCA9IGdiX2F1ZGlvX2FwYnJpZGdlYV9wcmVwYXJlX3J4KGRhdGEtPmNvbm5lY3Rpb24sCisJCQkJCQkgICAgMCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gZ2JfYXVkaW9fYXBicmlkZ2VhX3N0YXJ0X3J4KGRhdGEtPmNvbm5lY3Rpb24sCisJCQkJCQkJICAwKTsKKwkJcGFyYW1zLT5zdGF0ZSA9IEdCQVVESU9fQ09ERUNfU1RBUlQ7CisJfSBlbHNlIGlmIChtdXRlICYmICFzdHJlYW0pIHsvKiBzdG9wIHBsYXliYWNrICovCisJCXJldCA9IGdiX2F1ZGlvX2FwYnJpZGdlYV9zdG9wX3R4KGRhdGEtPmNvbm5lY3Rpb24sIDApOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGdiX2F1ZGlvX2FwYnJpZGdlYV9zaHV0ZG93bl90eChkYXRhLT5jb25uZWN0aW9uLAorCQkJCQkJCSAgICAgMCk7CisJCXBhcmFtcy0+c3RhdGUgPSBHQkFVRElPX0NPREVDX1NUT1A7CisJfSBlbHNlIGlmIChtdXRlICYmIHN0cmVhbSkgey8qIHN0b3AgY2FwdHVyZSAqLworCQlyZXQgPSBnYl9hdWRpb19hcGJyaWRnZWFfc3RvcF9yeChkYXRhLT5jb25uZWN0aW9uLCAwKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBnYl9hdWRpb19hcGJyaWRnZWFfc2h1dGRvd25fcngoZGF0YS0+Y29ubmVjdGlvbiwKKwkJCQkJCQkgICAgIDApOworCQlwYXJhbXMtPnN0YXRlID0gR0JBVURJT19DT0RFQ19TVE9QOworCX0gZWxzZQorCQlyZXQgPSAtRUlOVkFMOworCWlmIChyZXQpCisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoZGFpLT5kZXYsCisJCQkJICAgICIlczpFcnJvciBkdXJpbmcgJXMgJXMgc3RyZWFtOiVkXG4iLAorCQkJCSAgICBtb2R1bGUtPm5hbWUsIG11dGUgPyAiTXV0ZSIgOiAiVW5tdXRlIiwKKwkJCQkgICAgc3RyZWFtID8gIkNhcHR1cmUiIDogIlBsYXliYWNrIiwgcmV0KTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X25vaWRsZShidW5kbGUpOworCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIGdiY29kZWNfZGFpX29wcyA9IHsKKwkuc3RhcnR1cCA9IGdiY29kZWNfc3RhcnR1cCwKKwkuc2h1dGRvd24gPSBnYmNvZGVjX3NodXRkb3duLAorCS5od19wYXJhbXMgPSBnYmNvZGVjX2h3X3BhcmFtcywKKwkucHJlcGFyZSA9IGdiY29kZWNfcHJlcGFyZSwKKwkubXV0ZV9zdHJlYW0gPSBnYmNvZGVjX211dGVfc3RyZWFtLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgZ2JhdWRpb19kYWlbXSA9IHsKKwl7CisJCS5uYW1lID0gImFwYi1pMnMwIiwKKwkJLmlkID0gMCwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkkyUyAwIFBsYXliYWNrIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQkJLnJhdGVfbWluID0gNDgwMDAsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJJMlMgMCBDYXB0dXJlIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQkJLnJhdGVfbWluID0gNDgwMDAsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQl9LAorCQkub3BzID0gJmdiY29kZWNfZGFpX29wcywKKwl9LAorfTsKKworc3RhdGljIGludCBnYmF1ZGlvX2luaXRfamFjayhzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlLAorCQkJICAgICBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IHJldDsKKworCWlmICghbW9kdWxlLT5qYWNrX21hc2spCisJCXJldHVybiAwOworCisJc25wcmludGYobW9kdWxlLT5qYWNrX25hbWUsIE5BTUVfU0laRSwgIkdCICVkIEhlYWRzZXQgSmFjayIsCisJCSBtb2R1bGUtPmRldl9pZCk7CisJcmV0ID0gc25kX3NvY19qYWNrX25ldyhjb2RlYywgbW9kdWxlLT5qYWNrX25hbWUsIG1vZHVsZS0+amFja19tYXNrLAorCQkJICAgICAgICZtb2R1bGUtPmhlYWRzZXRfamFjayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBuZXcgamFja1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFtb2R1bGUtPmJ1dHRvbl9tYXNrKQorCQlyZXR1cm4gMDsKKworCXNucHJpbnRmKG1vZHVsZS0+YnV0dG9uX25hbWUsIE5BTUVfU0laRSwgIkdCICVkIEJ1dHRvbiBKYWNrIiwKKwkJIG1vZHVsZS0+ZGV2X2lkKTsKKwlyZXQgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCBtb2R1bGUtPmJ1dHRvbl9uYW1lLCBtb2R1bGUtPmJ1dHRvbl9tYXNrLAorCQkJICAgICAgICZtb2R1bGUtPmJ1dHRvbl9qYWNrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIobW9kdWxlLT5kZXYsICJGYWlsZWQgdG8gY3JlYXRlIGJ1dHRvbiBqYWNrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIEN1cnJlbnRseSwgbWF4IDQgYnV0dG9ucyBhcmUgc3VwcG9ydGVkIHdpdGggZm9sbG93aW5nIGtleSBtYXBwaW5nCisJICogQlROXzAgPSBLRVlfTUVESUEKKwkgKiBCVE5fMSA9IEtFWV9WT0lDRUNPTU1BTkQKKwkgKiBCVE5fMiA9IEtFWV9WT0xVTUVVUAorCSAqIEJUTl8zID0gS0VZX1ZPTFVNRURPV04KKwkgKi8KKworCWlmIChtb2R1bGUtPmJ1dHRvbl9tYXNrICYgU05EX0pBQ0tfQlROXzApIHsKKwkJcmV0ID0gc25kX2phY2tfc2V0X2tleShtb2R1bGUtPmJ1dHRvbl9qYWNrLmphY2ssIFNORF9KQUNLX0JUTl8wLAorCQkJCSAgICAgICBLRVlfTUVESUEpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LCAiRmFpbGVkIHRvIHNldCBCVE5fMFxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKG1vZHVsZS0+YnV0dG9uX21hc2sgJiBTTkRfSkFDS19CVE5fMSkgeworCQlyZXQgPSBzbmRfamFja19zZXRfa2V5KG1vZHVsZS0+YnV0dG9uX2phY2suamFjaywgU05EX0pBQ0tfQlROXzEsCisJCQkJICAgICAgIEtFWV9WT0lDRUNPTU1BTkQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LCAiRmFpbGVkIHRvIHNldCBCVE5fMVxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKG1vZHVsZS0+YnV0dG9uX21hc2sgJiBTTkRfSkFDS19CVE5fMikgeworCQlyZXQgPSBzbmRfamFja19zZXRfa2V5KG1vZHVsZS0+YnV0dG9uX2phY2suamFjaywgU05EX0pBQ0tfQlROXzIsCisJCQkJICAgICAgIEtFWV9WT0xVTUVVUCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIobW9kdWxlLT5kZXYsICJGYWlsZWQgdG8gc2V0IEJUTl8yXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlpZiAobW9kdWxlLT5idXR0b25fbWFzayAmIFNORF9KQUNLX0JUTl8zKSB7CisJCXJldCA9IHNuZF9qYWNrX3NldF9rZXkobW9kdWxlLT5idXR0b25famFjay5qYWNrLCBTTkRfSkFDS19CVE5fMywKKwkJCQkgICAgICAgS0VZX1ZPTFVNRURPV04pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LCAiRmFpbGVkIHRvIHNldCBCVE5fMFxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJLyogRklYTUUKKwkgKiB2ZXJpZnkgaWYgdGhpcyBpcyByZWFsbHkgcmVxdWlyZWQKKwlzZXRfYml0KElOUFVUX1BST1BfTk9fRFVNTVlfUkVMRUFTRSwKKwkJbW9kdWxlLT5idXR0b25famFjay5qYWNrLT5pbnB1dF9kZXYtPnByb3BiaXQpOworCSovCisKKwlyZXR1cm4gMDsKK30KKworaW50IGdiYXVkaW9fcmVnaXN0ZXJfbW9kdWxlKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkOworCXN0cnVjdCBzbmRfc29jX2phY2sgKmphY2sgPSBOVUxMOworCisJaWYgKCFnYmNvZGVjKSB7CisJCWRldl9lcnIobW9kdWxlLT5kZXYsICJHQiBDb2RlYyBub3QgeWV0IHByb2JlZFxuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWNvZGVjID0gZ2Jjb2RlYy0+Y29kZWM7CisJY2FyZCA9IGNvZGVjLT5jYXJkLT5zbmRfY2FyZDsKKworCWRvd25fd3JpdGUoJmNhcmQtPmNvbnRyb2xzX3J3c2VtKTsKKworCWlmIChtb2R1bGUtPm51bV9kYWlzKSB7CisJCWRldl9lcnIoZ2Jjb2RlYy0+ZGV2LAorCQkJIiVkOkRBSXMgbm90IHN1cHBvcnRlZCB2aWEgZ2Jjb2RlYyBkcml2ZXJcbiIsCisJCQltb2R1bGUtPm51bV9kYWlzKTsKKwkJdXBfd3JpdGUoJmNhcmQtPmNvbnRyb2xzX3J3c2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gZ2JhdWRpb19pbml0X2phY2sobW9kdWxlLCBjb2RlYyk7CisJaWYgKHJldCkgeworCQl1cF93cml0ZSgmY2FyZC0+Y29udHJvbHNfcndzZW0pOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChtb2R1bGUtPmRhcG1fd2lkZ2V0cykKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9scygmY29kZWMtPmRhcG0sIG1vZHVsZS0+ZGFwbV93aWRnZXRzLAorCQkJCQkgIG1vZHVsZS0+bnVtX2RhcG1fd2lkZ2V0cyk7CisJaWYgKG1vZHVsZS0+Y29udHJvbHMpCisJCXNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBtb2R1bGUtPmNvbnRyb2xzLAorCQkJCSAgICAgbW9kdWxlLT5udW1fY29udHJvbHMpOworCWlmIChtb2R1bGUtPmRhcG1fcm91dGVzKQorCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcygmY29kZWMtPmRhcG0sIG1vZHVsZS0+ZGFwbV9yb3V0ZXMsCisJCQkJCW1vZHVsZS0+bnVtX2RhcG1fcm91dGVzKTsKKworCS8qIGNhcmQgYWxyZWFkeSBpbnN0YW50aWF0ZWQsIGNyZWF0ZSB3aWRnZXRzIGhlcmUgb25seSAqLworCWlmIChjb2RlYy0+Y2FyZC0+aW5zdGFudGlhdGVkKSB7CisJCXNuZF9zb2NfZGFwbV9saW5rX2NvbXBvbmVudF9kYWlfd2lkZ2V0cyhjb2RlYy0+Y2FyZCwKKwkJCQkJCQkmY29kZWMtPmRhcG0pOworI2lmZGVmIENPTkZJR19TTkRfSkFDSworCQkvKiByZWdpc3RlciBqYWNrIGRldmljZXMgZm9yIHRoaXMgbW9kdWxlIGZyb20gY29kZWMtPmphY2tfbGlzdCAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGphY2ssICZjb2RlYy0+amFja19saXN0LCBsaXN0KSB7CisJCQlpZiAoKGphY2sgPT0gJm1vZHVsZS0+aGVhZHNldF9qYWNrKQorCQkJICAgIHx8IChqYWNrID09ICZtb2R1bGUtPmJ1dHRvbl9qYWNrKSkKKwkJCQlzbmRfZGV2aWNlX3JlZ2lzdGVyKGNvZGVjLT5jYXJkLT5zbmRfY2FyZCwKKwkJCQkJCSAgICBqYWNrLT5qYWNrKTsKKwkJfQorI2VuZGlmCisJfQorCisJbXV0ZXhfbG9jaygmZ2Jjb2RlYy0+bG9jayk7CisJbGlzdF9hZGQoJm1vZHVsZS0+bGlzdCwgJmdiY29kZWMtPm1vZHVsZV9saXN0KTsKKwltdXRleF91bmxvY2soJmdiY29kZWMtPmxvY2spOworCisJaWYgKGNvZGVjLT5jYXJkLT5pbnN0YW50aWF0ZWQpCisJCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfd2lkZ2V0cygmY29kZWMtPmRhcG0pOworCWRldl9kYmcoY29kZWMtPmRldiwgIlJlZ2lzdGVyZWQgJXMgbW9kdWxlXG4iLCBtb2R1bGUtPm5hbWUpOworCisJdXBfd3JpdGUoJmNhcmQtPmNvbnRyb2xzX3J3c2VtKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChnYmF1ZGlvX3JlZ2lzdGVyX21vZHVsZSk7CisKK3N0YXRpYyB2b2lkIGdiYXVkaW9fY29kZWNfY2xlYW5fZGF0YV90eChzdHJ1Y3QgZ2JhdWRpb19kYXRhX2Nvbm5lY3Rpb24gKmRhdGEpCit7CisJdTE2IGkyc19wb3J0LCBjcG9ydGlkOworCWludCByZXQ7CisKKwlpZiAobGlzdF9pc19zaW5ndWxhcigmZ2Jjb2RlYy0+bW9kdWxlX2xpc3QpKSB7CisJCXJldCA9IGdiX2F1ZGlvX2FwYnJpZGdlYV9zdG9wX3R4KGRhdGEtPmNvbm5lY3Rpb24sIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuOworCQlyZXQgPSBnYl9hdWRpb19hcGJyaWRnZWFfc2h1dGRvd25fdHgoZGF0YS0+Y29ubmVjdGlvbiwKKwkJCQkJCSAgICAgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm47CisJfQorCWkyc19wb3J0ID0gMDsJLyogZml4ZWQgZm9yIG5vdyAqLworCWNwb3J0aWQgPSBkYXRhLT5jb25uZWN0aW9uLT5oZF9jcG9ydF9pZDsKKwlyZXQgPSBnYl9hdWRpb19hcGJyaWRnZWFfdW5yZWdpc3Rlcl9jcG9ydChkYXRhLT5jb25uZWN0aW9uLAorCQkJCQkJICBpMnNfcG9ydCwgY3BvcnRpZCwKKwkJCQkJCSAgQVVESU9fQVBCUklER0VBX0RJUkVDVElPTl9UWCk7CisJZGF0YS0+c3RhdGVbMF0gPSBHQkFVRElPX0NPREVDX1NIVVRET1dOOworfQorCitzdGF0aWMgdm9pZCBnYmF1ZGlvX2NvZGVjX2NsZWFuX2RhdGFfcngoc3RydWN0IGdiYXVkaW9fZGF0YV9jb25uZWN0aW9uICpkYXRhKQoreworCXUxNiBpMnNfcG9ydCwgY3BvcnRpZDsKKwlpbnQgcmV0OworCisJaWYgKGxpc3RfaXNfc2luZ3VsYXIoJmdiY29kZWMtPm1vZHVsZV9saXN0KSkgeworCQlyZXQgPSBnYl9hdWRpb19hcGJyaWRnZWFfc3RvcF9yeChkYXRhLT5jb25uZWN0aW9uLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybjsKKwkJcmV0ID0gZ2JfYXVkaW9fYXBicmlkZ2VhX3NodXRkb3duX3J4KGRhdGEtPmNvbm5lY3Rpb24sCisJCQkJCQkgICAgIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuOworCX0KKwlpMnNfcG9ydCA9IDA7CS8qIGZpeGVkIGZvciBub3cgKi8KKwljcG9ydGlkID0gZGF0YS0+Y29ubmVjdGlvbi0+aGRfY3BvcnRfaWQ7CisJcmV0ID0gZ2JfYXVkaW9fYXBicmlkZ2VhX3VucmVnaXN0ZXJfY3BvcnQoZGF0YS0+Y29ubmVjdGlvbiwKKwkJCQkJCSAgaTJzX3BvcnQsIGNwb3J0aWQsCisJCQkJCQkgIEFVRElPX0FQQlJJREdFQV9ESVJFQ1RJT05fUlgpOworCWRhdGEtPnN0YXRlWzFdID0gR0JBVURJT19DT0RFQ19TSFVURE9XTjsKK30KKworCitzdGF0aWMgdm9pZCBnYmF1ZGlvX2NvZGVjX2NsZWFudXAoc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSkKK3sKKwlzdHJ1Y3QgZ2JhdWRpb19kYXRhX2Nvbm5lY3Rpb24gKmRhdGE7CisJaW50IHBiX3N0YXRlLCBjYXBfc3RhdGU7CisKKwlkZXZfZGJnKGdiY29kZWMtPmRldiwgIiVzOiByZW1vdmVkLCBjbGVhbnVwIEFQQnJpZGdlXG4iLCBtb2R1bGUtPm5hbWUpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGF0YSwgJm1vZHVsZS0+ZGF0YV9saXN0LCBsaXN0KSB7CisJCXBiX3N0YXRlID0gZGF0YS0+c3RhdGVbMF07CisJCWNhcF9zdGF0ZSA9IGRhdGEtPnN0YXRlWzFdOworCisJCWlmIChwYl9zdGF0ZSA+IEdCQVVESU9fQ09ERUNfU0hVVERPV04pCisJCQlnYmF1ZGlvX2NvZGVjX2NsZWFuX2RhdGFfdHgoZGF0YSk7CisKKwkJaWYgKGNhcF9zdGF0ZSA+IEdCQVVESU9fQ09ERUNfU0hVVERPV04pCisJCQlnYmF1ZGlvX2NvZGVjX2NsZWFuX2RhdGFfcngoZGF0YSk7CisKKwl9Cit9CisKK3ZvaWQgZ2JhdWRpb191bnJlZ2lzdGVyX21vZHVsZShzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGdiY29kZWMtPmNvZGVjOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGNvZGVjLT5jYXJkLT5zbmRfY2FyZDsKKwlzdHJ1Y3Qgc25kX3NvY19qYWNrICpqYWNrLCAqbmV4dF9qOworCWludCBtYXNrOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiVW5yZWdpc3RlciAlcyBtb2R1bGVcbiIsIG1vZHVsZS0+bmFtZSk7CisKKwlkb3duX3dyaXRlKCZjYXJkLT5jb250cm9sc19yd3NlbSk7CisJbXV0ZXhfbG9jaygmZ2Jjb2RlYy0+bG9jayk7CisJZ2JhdWRpb19jb2RlY19jbGVhbnVwKG1vZHVsZSk7CisJbGlzdF9kZWwoJm1vZHVsZS0+bGlzdCk7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiUHJvY2VzcyBVbnJlZ2lzdGVyICVzIG1vZHVsZVxuIiwgbW9kdWxlLT5uYW1lKTsKKwltdXRleF91bmxvY2soJmdiY29kZWMtPmxvY2spOworCisjaWZkZWYgQ09ORklHX1NORF9KQUNLCisJLyogZnJlZSBqYWNrIGRldmljZXMgZm9yIHRoaXMgbW9kdWxlIGZyb20gY29kZWMtPmphY2tfbGlzdCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShqYWNrLCBuZXh0X2osICZjb2RlYy0+amFja19saXN0LCBsaXN0KSB7CisJCWlmIChqYWNrID09ICZtb2R1bGUtPmhlYWRzZXRfamFjaykKKwkJCW1hc2sgPSBHQkNPREVDX0pBQ0tfTUFTSzsKKwkJZWxzZSBpZiAoamFjayA9PSAmbW9kdWxlLT5idXR0b25famFjaykKKwkJCW1hc2sgPSBHQkNPREVDX0pBQ0tfQlVUVE9OX01BU0s7CisJCWVsc2UKKwkJCW1hc2sgPSAwOworCQlpZiAobWFzaykgeworCQkJZGV2X2RiZyhtb2R1bGUtPmRldiwgIlJlcG9ydCAlcyByZW1vdmFsXG4iLAorCQkJCWphY2stPmphY2stPmlkKTsKKwkJCXNuZF9zb2NfamFja19yZXBvcnQoamFjaywgMCwgbWFzayk7CisJCQlzbmRfZGV2aWNlX2ZyZWUoY29kZWMtPmNhcmQtPnNuZF9jYXJkLCBqYWNrLT5qYWNrKTsKKwkJCWxpc3RfZGVsKCZqYWNrLT5saXN0KTsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKG1vZHVsZS0+ZGFwbV9yb3V0ZXMpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiUmVtb3ZpbmcgJWQgcm91dGVzXG4iLAorCQkJbW9kdWxlLT5udW1fZGFwbV9yb3V0ZXMpOworCQlzbmRfc29jX2RhcG1fZGVsX3JvdXRlcygmY29kZWMtPmRhcG0sIG1vZHVsZS0+ZGFwbV9yb3V0ZXMsCisJCQkJCW1vZHVsZS0+bnVtX2RhcG1fcm91dGVzKTsKKwl9CisJaWYgKG1vZHVsZS0+Y29udHJvbHMpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiUmVtb3ZpbmcgJWQgY29udHJvbHNcbiIsCisJCQltb2R1bGUtPm51bV9jb250cm9scyk7CisJCXNuZF9zb2NfcmVtb3ZlX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBtb2R1bGUtPmNvbnRyb2xzLAorCQkJCQkgIG1vZHVsZS0+bnVtX2NvbnRyb2xzKTsKKwl9CisJaWYgKG1vZHVsZS0+ZGFwbV93aWRnZXRzKSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIlJlbW92aW5nICVkIHdpZGdldHNcbiIsCisJCQltb2R1bGUtPm51bV9kYXBtX3dpZGdldHMpOworCQlzbmRfc29jX2RhcG1fZnJlZV9jb250cm9scygmY29kZWMtPmRhcG0sIG1vZHVsZS0+ZGFwbV93aWRnZXRzLAorCQkJCQkgICBtb2R1bGUtPm51bV9kYXBtX3dpZGdldHMpOworCX0KKworCWRldl9kYmcoY29kZWMtPmRldiwgIlVucmVnaXN0ZXJlZCAlcyBtb2R1bGVcbiIsIG1vZHVsZS0+bmFtZSk7CisKKwl1cF93cml0ZSgmY2FyZC0+Y29udHJvbHNfcndzZW0pOworfQorRVhQT1JUX1NZTUJPTChnYmF1ZGlvX3VucmVnaXN0ZXJfbW9kdWxlKTsKKworLyoKKyAqIGNvZGVjIGRyaXZlciBvcHMKKyAqLworc3RhdGljIGludCBnYmNvZGVjX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvICppbmZvOworCXN0cnVjdCBnYmF1ZGlvX2NvZGVjX2RhaSAqZGFpOworCisJaW5mbyA9IGRldm1fa3phbGxvYyhjb2RlYy0+ZGV2LCBzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRU5PTUVNOworCisJaW5mby0+ZGV2ID0gY29kZWMtPmRldjsKKwlJTklUX0xJU1RfSEVBRCgmaW5mby0+bW9kdWxlX2xpc3QpOworCW11dGV4X2luaXQoJmluZm8tPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZpbmZvLT5kYWlfbGlzdCk7CisKKwkvKiBpbml0IGRhaV9saXN0IHVzZWQgdG8gbWFpbnRhaW4gcnVudGltZSBzdHJlYW0gaW5mbyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdiYXVkaW9fZGFpKTsgaSsrKSB7CisJCWRhaSA9IGRldm1fa3phbGxvYyhjb2RlYy0+ZGV2LCBzaXplb2YoKmRhaSksIEdGUF9LRVJORUwpOworCQlpZiAoIWRhaSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlkYWktPmlkID0gZ2JhdWRpb19kYWlbaV0uaWQ7CisJCWxpc3RfYWRkKCZkYWktPmxpc3QsICZpbmZvLT5kYWlfbGlzdCk7CisJfQorCisJaW5mby0+Y29kZWMgPSBjb2RlYzsKKwlzbmRfc29jX2NvZGVjX3NldF9kcnZkYXRhKGNvZGVjLCBpbmZvKTsKKwlnYmNvZGVjID0gaW5mbzsKKworCWRldmljZV9pbml0X3dha2V1cChjb2RlYy0+ZGV2LCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYmNvZGVjX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJLyogRW1wdHkgZnVuY3Rpb24gZm9yIG5vdyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdTggZ2Jjb2RlY19yZWdbR0JDT0RFQ19SRUdfQ09VTlRdID0geworCVtHQkNPREVDX0NUTF9SRUddID0gR0JDT0RFQ19DVExfUkVHX0RFRkFVTFQsCisJW0dCQ09ERUNfTVVURV9SRUddID0gR0JDT0RFQ19NVVRFX1JFR19ERUZBVUxULAorCVtHQkNPREVDX1BCX0xWT0xfUkVHXSA9IEdCQ09ERUNfUEJfVk9MX1JFR19ERUZBVUxULAorCVtHQkNPREVDX1BCX1JWT0xfUkVHXSA9IEdCQ09ERUNfUEJfVk9MX1JFR19ERUZBVUxULAorCVtHQkNPREVDX0NBUF9MVk9MX1JFR10gPSBHQkNPREVDX0NBUF9WT0xfUkVHX0RFRkFVTFQsCisJW0dCQ09ERUNfQ0FQX1JWT0xfUkVHXSA9IEdCQ09ERUNfQ0FQX1ZPTF9SRUdfREVGQVVMVCwKKwlbR0JDT0RFQ19BUEIxX01VWF9SRUddID0gR0JDT0RFQ19BUEIxX01VWF9SRUdfREVGQVVMVCwKKwlbR0JDT0RFQ19BUEIyX01VWF9SRUddID0gR0JDT0RFQ19BUEIyX01VWF9SRUdfREVGQVVMVCwKK307CisKK3N0YXRpYyBpbnQgZ2Jjb2RlY193cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCisJCQkgdW5zaWduZWQgaW50IHZhbHVlKQoreworCWludCByZXQgPSAwOworCisJaWYgKHJlZyA9PSBTTkRfU09DX05PUE0pCisJCXJldHVybiAwOworCisJQlVHX09OKHJlZyA+PSBHQkNPREVDX1JFR19DT1VOVCk7CisKKwlnYmNvZGVjX3JlZ1tyZWddID0gdmFsdWU7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAicmVnWyVkXSA9IDB4JXhcbiIsIHJlZywgdmFsdWUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBnYmNvZGVjX3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSB1bnNpZ25lZCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCisJaWYgKHJlZyA9PSBTTkRfU09DX05PUE0pCisJCXJldHVybiAwOworCisJQlVHX09OKHJlZyA+PSBHQkNPREVDX1JFR19DT1VOVCk7CisKKwl2YWwgPSBnYmNvZGVjX3JlZ1tyZWddOworCWRldl9kYmcoY29kZWMtPmRldiwgInJlZ1slZF0gPSAweCV4XG4iLCByZWcsIHZhbCk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfZ2JhdWRpbyA9IHsKKwkucHJvYmUJPSBnYmNvZGVjX3Byb2JlLAorCS5yZW1vdmUJPSBnYmNvZGVjX3JlbW92ZSwKKworCS5yZWFkID0gZ2Jjb2RlY19yZWFkLAorCS53cml0ZSA9IGdiY29kZWNfd3JpdGUsCisKKwkucmVnX2NhY2hlX3NpemUgPSBHQkNPREVDX1JFR19DT1VOVCwKKwkucmVnX2NhY2hlX2RlZmF1bHQgPSBnYmNvZGVjX3JlZ19kZWZhdWx0cywKKwkucmVnX3dvcmRfc2l6ZSA9IDEsCisKKwkuaWRsZV9iaWFzX29mZiA9IHRydWUsCisJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCit9OworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGdiYXVkaW9fY29kZWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZGV2X2RiZyhkZXYsICIlczogc3VzcGVuZFxuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiYXVkaW9fY29kZWNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlkZXZfZGJnKGRldiwgIiVzOiByZXN1bWVcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGdiYXVkaW9fY29kZWNfcG1fb3BzID0geworCS5zdXNwZW5kCT0gZ2JhdWRpb19jb2RlY19zdXNwZW5kLAorCS5yZXN1bWUJCT0gZ2JhdWRpb19jb2RlY19yZXN1bWUsCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgZ2JhdWRpb19jb2RlY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZwZGV2LT5kZXYsICZzb2NfY29kZWNfZGV2X2diYXVkaW8sCisJCQlnYmF1ZGlvX2RhaSwgQVJSQVlfU0laRShnYmF1ZGlvX2RhaSkpOworfQorCitzdGF0aWMgaW50IGdiYXVkaW9fY29kZWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZwZGV2LT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBncmV5YnVzX2Fzb2NfbWFjaGluZV9vZl9tYXRjaFtdICA9IHsKKwl7IC5jb21wYXRpYmxlID0gInRvc2hpYmEsYXBiLWR1bW15LWNvZGVjIiwgfSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdiYXVkaW9fY29kZWNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFwYi1kdW1teS1jb2RlYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0gPSAmZ2JhdWRpb19jb2RlY19wbV9vcHMsCisjZW5kaWYKKwkJLm9mX21hdGNoX3RhYmxlID0gZ3JleWJ1c19hc29jX21hY2hpbmVfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBnYmF1ZGlvX2NvZGVjX3Byb2JlLAorCS5yZW1vdmUgPSBnYmF1ZGlvX2NvZGVjX3JlbW92ZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGdiYXVkaW9fY29kZWNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBUEJyaWRnZSBBTFNBIFNvQyBkdW1teSBjb2RlYyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlZhaWJoYXYgQWdhcndhbCA8dmFpYmhhdi5hZ2Fyd2FsQGxpbmFyby5vcmc+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmFwYi1kdW1teS1jb2RlYyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fY29kZWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX2NvZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwMjdiZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX2NvZGVjLmgKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBHcmV5YnVzIGF1ZGlvIGRyaXZlcgorICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0dCQVVESU9fQ09ERUNfSAorI2RlZmluZSBfX0xJTlVYX0dCQVVESU9fQ09ERUNfSAorCisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvamFjay5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImdyZXlidXNfcHJvdG9jb2xzLmgiCisKKyNkZWZpbmUgTkFNRV9TSVpFCTMyCisjZGVmaW5lIE1BWF9EQUlTCTIJLyogQVBCMSwgQVBCMiAqLworCitlbnVtIHsKKwlBUEIxX1BDTSA9IDAsCisJQVBCMl9QQ00sCisJTlVNX0NPREVDX0RBSVMsCit9OworCitlbnVtIGdiY29kZWNfcmVnX2luZGV4IHsKKwlHQkNPREVDX0NUTF9SRUcsCisJR0JDT0RFQ19NVVRFX1JFRywKKwlHQkNPREVDX1BCX0xWT0xfUkVHLAorCUdCQ09ERUNfUEJfUlZPTF9SRUcsCisJR0JDT0RFQ19DQVBfTFZPTF9SRUcsCisJR0JDT0RFQ19DQVBfUlZPTF9SRUcsCisJR0JDT0RFQ19BUEIxX01VWF9SRUcsCisJR0JDT0RFQ19BUEIyX01VWF9SRUcsCisJR0JDT0RFQ19SRUdfQ09VTlQKK307CisKKy8qIGRldmljZV90eXBlIHNob3VsZCBiZSBzYW1lIGFzIGRlZmluZWQgaW4gYXVkaW8uaCAoQW5kcm9pZCBtZWRpYSBsYXllcikgKi8KK2VudW0geworCUdCQVVESU9fREVWSUNFX05PTkUgICAgICAgICAgICAgICAgICAgICA9IDB4MCwKKwkvKiByZXNlcnZlZCBiaXRzICovCisJR0JBVURJT19ERVZJQ0VfQklUX0lOICAgICAgICAgICAgICAgICAgID0gMHg4MDAwMDAwMCwKKwlHQkFVRElPX0RFVklDRV9CSVRfREVGQVVMVCAgICAgICAgICAgICAgPSAweDQwMDAwMDAwLAorCS8qIG91dHB1dCBkZXZpY2VzICovCisJR0JBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIgICAgICAgICAgICAgID0gMHgyLAorCUdCQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUICAgICAgICA9IDB4NCwKKwlHQkFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FICAgICAgPSAweDgsCisJLyogaW5wdXQgZGV2aWNlcyAqLworCUdCQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDICAgICAgICAgICA9IEdCQVVESU9fREVWSUNFX0JJVF9JTiB8IDB4NCwKKwlHQkFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUICAgICAgICAgPSBHQkFVRElPX0RFVklDRV9CSVRfSU4gfCAweDEwLAorfTsKKworLyogYml0IDAtU1BLLCAxLUhQLCAyLURBQywKKyAqIDQtTUlDLCA1LUhTTUlDLCA2LU1JQzIKKyAqLworI2RlZmluZSBHQkNPREVDX0NUTF9SRUdfREVGQVVMVAkJMHgwMAorCisvKiBiaXQgMCwxIC0gQVBCMS1QQi1ML1IKKyAqIGJpdCAyLDMgLSBBUEIyLVBCLUwvUgorICogYml0IDQsNSAtIEFQQjEtQ2FwLUwvUgorICogYml0IDYsNyAtIEFQQjItQ2FwLUwvUgorICovCisjZGVmaW5lCUdCQ09ERUNfTVVURV9SRUdfREVGQVVMVAkweDAwCisKKy8qIDAtMTI3IHN0ZXBzICovCisjZGVmaW5lCUdCQ09ERUNfUEJfVk9MX1JFR19ERUZBVUxUCTB4MDAKKyNkZWZpbmUJR0JDT0RFQ19DQVBfVk9MX1JFR19ERUZBVUxUCTB4MDAKKworLyogYml0IDAsMSwyIC0gUEIgc3RlcmVvLCBsZWZ0LCByaWdodAorICogYml0IDgsOSwxMCAtIENhcCBzdGVyZW8sIGxlZnQsIHJpZ2h0CisgKi8KKyNkZWZpbmUgR0JDT0RFQ19BUEIxX01VWF9SRUdfREVGQVVMVAkweDAwCisjZGVmaW5lIEdCQ09ERUNfQVBCMl9NVVhfUkVHX0RFRkFVTFQJMHgwMAorCisjZGVmaW5lIEdCQ09ERUNfSkFDS19NQVNLCQkweDAwMDBGRkZGCisjZGVmaW5lIEdCQ09ERUNfSkFDS19CVVRUT05fTUFTSwkweEZGRkYwMDAwCisKK3N0YXRpYyBjb25zdCB1OCBnYmNvZGVjX3JlZ19kZWZhdWx0c1tHQkNPREVDX1JFR19DT1VOVF0gPSB7CisJR0JDT0RFQ19DVExfUkVHX0RFRkFVTFQsCisJR0JDT0RFQ19NVVRFX1JFR19ERUZBVUxULAorCUdCQ09ERUNfUEJfVk9MX1JFR19ERUZBVUxULAorCUdCQ09ERUNfUEJfVk9MX1JFR19ERUZBVUxULAorCUdCQ09ERUNfQ0FQX1ZPTF9SRUdfREVGQVVMVCwKKwlHQkNPREVDX0NBUF9WT0xfUkVHX0RFRkFVTFQsCisJR0JDT0RFQ19BUEIxX01VWF9SRUdfREVGQVVMVCwKKwlHQkNPREVDX0FQQjJfTVVYX1JFR19ERUZBVUxULAorfTsKKworZW51bSBnYmF1ZGlvX2NvZGVjX3N0YXRlIHsKKwlHQkFVRElPX0NPREVDX1NIVVRET1dOID0gMCwKKwlHQkFVRElPX0NPREVDX1NUQVJUVVAsCisJR0JBVURJT19DT0RFQ19IV1BBUkFNUywKKwlHQkFVRElPX0NPREVDX1BSRVBBUkUsCisJR0JBVURJT19DT0RFQ19TVEFSVCwKKwlHQkFVRElPX0NPREVDX1NUT1AsCit9OworCitzdHJ1Y3QgZ2JhdWRpb19zdHJlYW1fcGFyYW1zIHsKKwlpbnQgc3RhdGU7CisJdTggc2lnX2JpdHMsIGNoYW5uZWxzOworCXVpbnQzMl90IGZvcm1hdCwgcmF0ZTsKK307CisKK3N0cnVjdCBnYmF1ZGlvX2NvZGVjX2RhaSB7CisJaW50IGlkOworCS8qIHJ1bnRpbWUgcGFyYW1zIGZvciBwbGF5YmFjay9jYXB0dXJlIHN0cmVhbXMgKi8KKwlzdHJ1Y3QgZ2JhdWRpb19zdHJlYW1fcGFyYW1zIHBhcmFtc1syXTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCBsaXN0X2hlYWQgbW9kdWxlX2xpc3Q7CisJLyogdG8gbWFpbnRhaW4gcnVudGltZSBzdHJlYW0gcGFyYW1zIGZvciBlYWNoIERBSSAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGFpX2xpc3Q7CisJc3RydWN0IG11dGV4IGxvY2s7CisJdTggcmVnW0dCQ09ERUNfUkVHX0NPVU5UXTsKK307CisKK3N0cnVjdCBnYmF1ZGlvX3dpZGdldCB7CisJX191OCBpZDsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCBnYmF1ZGlvX2NvbnRyb2wgeworCV9fdTggaWQ7CisJY2hhciAqbmFtZTsKKwljaGFyICp3bmFtZTsKKwljb25zdCBjaGFyICogY29uc3QgKnRleHRzOworCWludCBpdGVtczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgZ2JhdWRpb19kYXRhX2Nvbm5lY3Rpb24geworCWludCBpZDsKKwlfX2xlMTYgZGF0YV9jcG9ydDsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJLyogbWFpbnRhaW4gcnVudGltZSBzdGF0ZSBmb3IgcGxheWJhY2svY2FwdHVyZSBzdHJlYW0gKi8KKwlpbnQgc3RhdGVbMl07Cit9OworCisvKiBzdHJlYW0gZGlyZWN0aW9uICovCisjZGVmaW5lIEdCX1BMQVlCQUNLCUJJVCgwKQorI2RlZmluZSBHQl9DQVBUVVJFCUJJVCgxKQorCitlbnVtIGdiYXVkaW9fbW9kdWxlX3N0YXRlIHsKKwlHQkFVRElPX01PRFVMRV9PRkYgPSAwLAorCUdCQVVESU9fTU9EVUxFX09OLAorfTsKKworc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8geworCS8qIG1vZHVsZSBpbmZvICovCisJc3RydWN0IGRldmljZSAqZGV2OworCWludCBkZXZfaWQ7CS8qIGNoZWNrIGlmIGl0IHNob3VsZCBiZSBidW5kbGVfaWQvaGRfY3BvcnRfaWQgKi8KKwlpbnQgdmlkOworCWludCBwaWQ7CisJaW50IHNsb3Q7CisJaW50IHR5cGU7CisJaW50IHNldF91ZXZlbnQ7CisJY2hhciB2c3RyW05BTUVfU0laRV07CisJY2hhciBwc3RyW05BTUVfU0laRV07CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCS8qIG5lZWQgdG8gc2hhcmUgdGhpcyBpbmZvIHRvIGFib3ZlIHVzZXIgc3BhY2UgKi8KKwlpbnQgbWFuYWdlcl9pZDsKKwljaGFyIG5hbWVbTkFNRV9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgaXBfZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgb3BfZGV2aWNlczsKKworCS8qIGphY2sgcmVsYXRlZCAqLworCWNoYXIgamFja19uYW1lW05BTUVfU0laRV07CisJY2hhciBidXR0b25fbmFtZVtOQU1FX1NJWkVdOworCWludCBqYWNrX3R5cGU7CisJaW50IGphY2tfbWFzazsKKwlpbnQgYnV0dG9uX21hc2s7CisJaW50IGJ1dHRvbl9zdGF0dXM7CisJc3RydWN0IHNuZF9zb2NfamFjayBoZWFkc2V0X2phY2s7CisJc3RydWN0IHNuZF9zb2NfamFjayBidXR0b25famFjazsKKworCS8qIGNvbm5lY3Rpb24gaW5mbyAqLworCXN0cnVjdCBnYl9jb25uZWN0aW9uICptZ210X2Nvbm5lY3Rpb247CisJc2l6ZV90IG51bV9kYXRhX2Nvbm5lY3Rpb25zOworCXN0cnVjdCBsaXN0X2hlYWQgZGF0YV9saXN0OworCisJLyogdG9wb2xvZ3kgcmVsYXRlZCAqLworCWludCBudW1fZGFpczsKKwlpbnQgbnVtX2NvbnRyb2xzOworCWludCBudW1fZGFwbV93aWRnZXRzOworCWludCBudW1fZGFwbV9yb3V0ZXM7CisJdW5zaWduZWQgbG9uZyBkYWlfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgd2lkZ2V0X29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGNvbnRyb2xfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgcm91dGVfb2Zmc2V0OworCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpjb250cm9sczsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqZGFwbV93aWRnZXRzOworCXN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgKmRhcG1fcm91dGVzOworCXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaXM7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIHdpZGdldF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgY3RsX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCB3aWRnZXRfY3RsX2xpc3Q7CisKKwlzdHJ1Y3QgZ2JfYXVkaW9fdG9wb2xvZ3kgKnRvcG9sb2d5OworfTsKKworaW50IGdiYXVkaW9fdHBsZ19wYXJzZV9kYXRhKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUsCisJCQkgICAgICAgc3RydWN0IGdiX2F1ZGlvX3RvcG9sb2d5ICp0cGxnX2RhdGEpOwordm9pZCBnYmF1ZGlvX3RwbGdfcmVsZWFzZShzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlKTsKKworaW50IGdiYXVkaW9fbW9kdWxlX3VwZGF0ZShzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvICpjb2RlYywKKwkJCSAgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkgIHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUsCisJCQkgIGludCBlbmFibGUpOworaW50IGdiYXVkaW9fcmVnaXN0ZXJfbW9kdWxlKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUpOwordm9pZCBnYmF1ZGlvX3VucmVnaXN0ZXJfbW9kdWxlKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUpOworCisvKiBwcm90b2NvbCByZWxhdGVkICovCitleHRlcm4gaW50IGdiX2F1ZGlvX2diX2dldF90b3BvbG9neShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgICAgc3RydWN0IGdiX2F1ZGlvX3RvcG9sb2d5ICoqdG9wb2xvZ3kpOworZXh0ZXJuIGludCBnYl9hdWRpb19nYl9nZXRfY29udHJvbChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgICB1OCBjb250cm9sX2lkLCB1OCBpbmRleCwKKwkJCQkgICBzdHJ1Y3QgZ2JfYXVkaW9fY3RsX2VsZW1fdmFsdWUgKnZhbHVlKTsKK2V4dGVybiBpbnQgZ2JfYXVkaW9fZ2Jfc2V0X2NvbnRyb2woc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgdTggY29udHJvbF9pZCwgdTggaW5kZXgsCisJCQkJICAgc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSk7CitleHRlcm4gaW50IGdiX2F1ZGlvX2diX2VuYWJsZV93aWRnZXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgICB1OCB3aWRnZXRfaWQpOworZXh0ZXJuIGludCBnYl9hdWRpb19nYl9kaXNhYmxlX3dpZGdldChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgICAgICB1OCB3aWRnZXRfaWQpOworZXh0ZXJuIGludCBnYl9hdWRpb19nYl9nZXRfcGNtKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJICAgICAgIHUxNiBkYXRhX2Nwb3J0LCB1aW50MzJfdCAqZm9ybWF0LAorCQkJICAgICAgIHVpbnQzMl90ICpyYXRlLCB1OCAqY2hhbm5lbHMsCisJCQkgICAgICAgdTggKnNpZ19iaXRzKTsKK2V4dGVybiBpbnQgZ2JfYXVkaW9fZ2Jfc2V0X3BjbShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCSAgICAgICB1MTYgZGF0YV9jcG9ydCwgdWludDMyX3QgZm9ybWF0LAorCQkJICAgICAgIHVpbnQzMl90IHJhdGUsIHU4IGNoYW5uZWxzLAorCQkJICAgICAgIHU4IHNpZ19iaXRzKTsKK2V4dGVybiBpbnQgZ2JfYXVkaW9fZ2Jfc2V0X3R4X2RhdGFfc2l6ZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJdTE2IGRhdGFfY3BvcnQsIHUxNiBzaXplKTsKK2V4dGVybiBpbnQgZ2JfYXVkaW9fZ2JfYWN0aXZhdGVfdHgoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgdTE2IGRhdGFfY3BvcnQpOworZXh0ZXJuIGludCBnYl9hdWRpb19nYl9kZWFjdGl2YXRlX3R4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgICAgdTE2IGRhdGFfY3BvcnQpOworZXh0ZXJuIGludCBnYl9hdWRpb19nYl9zZXRfcnhfZGF0YV9zaXplKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQl1MTYgZGF0YV9jcG9ydCwgdTE2IHNpemUpOworZXh0ZXJuIGludCBnYl9hdWRpb19nYl9hY3RpdmF0ZV9yeChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgICB1MTYgZGF0YV9jcG9ydCk7CitleHRlcm4gaW50IGdiX2F1ZGlvX2diX2RlYWN0aXZhdGVfcngoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgICB1MTYgZGF0YV9jcG9ydCk7CitleHRlcm4gaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9zZXRfY29uZmlnKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkgX191MTYgaTJzX3BvcnQsIF9fdTMyIGZvcm1hdCwKKwkJCQkJIF9fdTMyIHJhdGUsIF9fdTMyIG1jbGtfZnJlcSk7CitleHRlcm4gaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9yZWdpc3Rlcl9jcG9ydChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgICBfX3UxNiBpMnNfcG9ydCwgX191MTYgY3BvcnRpZCwKKwkJCQkJICAgICBfX3U4IGRpcmVjdGlvbik7CitleHRlcm4gaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV91bnJlZ2lzdGVyX2Nwb3J0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkgICAgICAgX191MTYgaTJzX3BvcnQsIF9fdTE2IGNwb3J0aWQsCisJCQkJCSAgICAgICBfX3U4IGRpcmVjdGlvbik7CitleHRlcm4gaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9zZXRfdHhfZGF0YV9zaXplKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkgICAgICAgX191MTYgaTJzX3BvcnQsIF9fdTE2IHNpemUpOworZXh0ZXJuIGludCBnYl9hdWRpb19hcGJyaWRnZWFfcHJlcGFyZV90eChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJIF9fdTE2IGkyc19wb3J0KTsKK2V4dGVybiBpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3N0YXJ0X3R4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgICAgICBfX3UxNiBpMnNfcG9ydCwgX191NjQgdGltZXN0YW1wKTsKK2V4dGVybiBpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3N0b3BfdHgoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgICAgX191MTYgaTJzX3BvcnQpOworZXh0ZXJuIGludCBnYl9hdWRpb19hcGJyaWRnZWFfc2h1dGRvd25fdHgoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgX191MTYgaTJzX3BvcnQpOworZXh0ZXJuIGludCBnYl9hdWRpb19hcGJyaWRnZWFfc2V0X3J4X2RhdGFfc2l6ZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgICAgIF9fdTE2IGkyc19wb3J0LCBfX3UxNiBzaXplKTsKK2V4dGVybiBpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3ByZXBhcmVfcngoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSBfX3UxNiBpMnNfcG9ydCk7CitleHRlcm4gaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9zdGFydF9yeChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgICAgICAgX191MTYgaTJzX3BvcnQpOworZXh0ZXJuIGludCBnYl9hdWRpb19hcGJyaWRnZWFfc3RvcF9yeChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgICAgICBfX3UxNiBpMnNfcG9ydCk7CitleHRlcm4gaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9zaHV0ZG93bl9yeChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICBfX3UxNiBpMnNfcG9ydCk7CisKKyNlbmRpZiAvKiBfX0xJTlVYX0dCQVVESU9fQ09ERUNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fZ2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX2diLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJmMjg3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX2diLmMKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiBHcmV5YnVzIEF1ZGlvIERldmljZSBDbGFzcyBQcm90b2NvbCBoZWxwZXJzCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBHb29nbGUgSW5jLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlICJncmV5YnVzLmgiCisjaW5jbHVkZSAiZ3JleWJ1c19wcm90b2NvbHMuaCIKKyNpbmNsdWRlICJvcGVyYXRpb24uaCIKKyNpbmNsdWRlICJhdWRpb19jb2RlYy5oIgorCisvKiBUT0RPOiBTcGxpdCBpbnRvIHNlcGFyYXRlIGNhbGxzICovCitpbnQgZ2JfYXVkaW9fZ2JfZ2V0X3RvcG9sb2d5KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJICAgICBzdHJ1Y3QgZ2JfYXVkaW9fdG9wb2xvZ3kgKip0b3BvbG9neSkKK3sKKwlzdHJ1Y3QgZ2JfYXVkaW9fZ2V0X3RvcG9sb2d5X3NpemVfcmVzcG9uc2Ugc2l6ZV9yZXNwOworCXN0cnVjdCBnYl9hdWRpb190b3BvbG9neSAqdG9wbzsKKwl1MTYgc2l6ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfQVVESU9fVFlQRV9HRVRfVE9QT0xPR1lfU0laRSwKKwkJCQlOVUxMLCAwLCAmc2l6ZV9yZXNwLCBzaXplb2Yoc2l6ZV9yZXNwKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXNpemUgPSBsZTE2X3RvX2NwdShzaXplX3Jlc3Auc2l6ZSk7CisJaWYgKHNpemUgPCBzaXplb2YoKnRvcG8pKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwl0b3BvID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRvcG8pCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfQVVESU9fVFlQRV9HRVRfVE9QT0xPR1ksIE5VTEwsIDAsCisJCQkJdG9wbywgc2l6ZSk7CisJaWYgKHJldCkgeworCQlrZnJlZSh0b3BvKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkqdG9wb2xvZ3kgPSB0b3BvOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19nYl9nZXRfdG9wb2xvZ3kpOworCitpbnQgZ2JfYXVkaW9fZ2JfZ2V0X2NvbnRyb2woc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkgICAgdTggY29udHJvbF9pZCwgdTggaW5kZXgsCisJCQkgICAgc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgZ2JfYXVkaW9fZ2V0X2NvbnRyb2xfcmVxdWVzdCByZXE7CisJc3RydWN0IGdiX2F1ZGlvX2dldF9jb250cm9sX3Jlc3BvbnNlIHJlc3A7CisJaW50IHJldDsKKworCXJlcS5jb250cm9sX2lkID0gY29udHJvbF9pZDsKKwlyZXEuaW5kZXggPSBpbmRleDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0FVRElPX1RZUEVfR0VUX0NPTlRST0wsCisJCQkJJnJlcSwgc2l6ZW9mKHJlcSksICZyZXNwLCBzaXplb2YocmVzcCkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltZW1jcHkodmFsdWUsICZyZXNwLnZhbHVlLCBzaXplb2YoKnZhbHVlKSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX2diX2dldF9jb250cm9sKTsKKworaW50IGdiX2F1ZGlvX2diX3NldF9jb250cm9sKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJICAgIHU4IGNvbnRyb2xfaWQsIHU4IGluZGV4LAorCQkJICAgIHN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IGdiX2F1ZGlvX3NldF9jb250cm9sX3JlcXVlc3QgcmVxOworCisJcmVxLmNvbnRyb2xfaWQgPSBjb250cm9sX2lkOworCXJlcS5pbmRleCA9IGluZGV4OworCW1lbWNweSgmcmVxLnZhbHVlLCB2YWx1ZSwgc2l6ZW9mKHJlcS52YWx1ZSkpOworCisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0FVRElPX1RZUEVfU0VUX0NPTlRST0wsCisJCQkJICZyZXEsIHNpemVvZihyZXEpLCBOVUxMLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX2diX3NldF9jb250cm9sKTsKKworaW50IGdiX2F1ZGlvX2diX2VuYWJsZV93aWRnZXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkgICAgICB1OCB3aWRnZXRfaWQpCit7CisJc3RydWN0IGdiX2F1ZGlvX2VuYWJsZV93aWRnZXRfcmVxdWVzdCByZXE7CisKKwlyZXEud2lkZ2V0X2lkID0gd2lkZ2V0X2lkOworCisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0FVRElPX1RZUEVfRU5BQkxFX1dJREdFVCwKKwkJCQkgJnJlcSwgc2l6ZW9mKHJlcSksIE5VTEwsIDApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fZ2JfZW5hYmxlX3dpZGdldCk7CisKK2ludCBnYl9hdWRpb19nYl9kaXNhYmxlX3dpZGdldChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCSAgICAgICB1OCB3aWRnZXRfaWQpCit7CisJc3RydWN0IGdiX2F1ZGlvX2Rpc2FibGVfd2lkZ2V0X3JlcXVlc3QgcmVxOworCisJcmVxLndpZGdldF9pZCA9IHdpZGdldF9pZDsKKworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9BVURJT19UWVBFX0RJU0FCTEVfV0lER0VULAorCQkJCSAmcmVxLCBzaXplb2YocmVxKSwgTlVMTCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19nYl9kaXNhYmxlX3dpZGdldCk7CisKK2ludCBnYl9hdWRpb19nYl9nZXRfcGNtKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1MTYgZGF0YV9jcG9ydCwKKwkJCXVpbnQzMl90ICpmb3JtYXQsIHVpbnQzMl90ICpyYXRlLCB1OCAqY2hhbm5lbHMsCisJCQl1OCAqc2lnX2JpdHMpCit7CisJc3RydWN0IGdiX2F1ZGlvX2dldF9wY21fcmVxdWVzdCByZXE7CisJc3RydWN0IGdiX2F1ZGlvX2dldF9wY21fcmVzcG9uc2UgcmVzcDsKKwlpbnQgcmV0OworCisJcmVxLmRhdGFfY3BvcnQgPSBjcHVfdG9fbGUxNihkYXRhX2Nwb3J0KTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0FVRElPX1RZUEVfR0VUX1BDTSwKKwkJCQkmcmVxLCBzaXplb2YocmVxKSwgJnJlc3AsIHNpemVvZihyZXNwKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCSpmb3JtYXQgPSBsZTMyX3RvX2NwdShyZXNwLmZvcm1hdCk7CisJKnJhdGUgPSBsZTMyX3RvX2NwdShyZXNwLnJhdGUpOworCSpjaGFubmVscyA9IHJlc3AuY2hhbm5lbHM7CisJKnNpZ19iaXRzID0gcmVzcC5zaWdfYml0czsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fZ2JfZ2V0X3BjbSk7CisKK2ludCBnYl9hdWRpb19nYl9zZXRfcGNtKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1MTYgZGF0YV9jcG9ydCwKKwkJCXVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgcmF0ZSwgdTggY2hhbm5lbHMsCisJCQl1OCBzaWdfYml0cykKK3sKKwlzdHJ1Y3QgZ2JfYXVkaW9fc2V0X3BjbV9yZXF1ZXN0IHJlcTsKKworCXJlcS5kYXRhX2Nwb3J0ID0gY3B1X3RvX2xlMTYoZGF0YV9jcG9ydCk7CisJcmVxLmZvcm1hdCA9IGNwdV90b19sZTMyKGZvcm1hdCk7CisJcmVxLnJhdGUgPSBjcHVfdG9fbGUzMihyYXRlKTsKKwlyZXEuY2hhbm5lbHMgPSBjaGFubmVsczsKKwlyZXEuc2lnX2JpdHMgPSBzaWdfYml0czsKKworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9BVURJT19UWVBFX1NFVF9QQ00sCisJCQkJICZyZXEsIHNpemVvZihyZXEpLCBOVUxMLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX2diX3NldF9wY20pOworCitpbnQgZ2JfYXVkaW9fZ2Jfc2V0X3R4X2RhdGFfc2l6ZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgdTE2IGRhdGFfY3BvcnQsIHUxNiBzaXplKQoreworCXN0cnVjdCBnYl9hdWRpb19zZXRfdHhfZGF0YV9zaXplX3JlcXVlc3QgcmVxOworCisJcmVxLmRhdGFfY3BvcnQgPSBjcHVfdG9fbGUxNihkYXRhX2Nwb3J0KTsKKwlyZXEuc2l6ZSA9IGNwdV90b19sZTE2KHNpemUpOworCisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0FVRElPX1RZUEVfU0VUX1RYX0RBVEFfU0laRSwKKwkJCQkgJnJlcSwgc2l6ZW9mKHJlcSksIE5VTEwsIDApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fZ2Jfc2V0X3R4X2RhdGFfc2l6ZSk7CisKK2ludCBnYl9hdWRpb19nYl9hY3RpdmF0ZV90eChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCSAgICB1MTYgZGF0YV9jcG9ydCkKK3sKKwlzdHJ1Y3QgZ2JfYXVkaW9fYWN0aXZhdGVfdHhfcmVxdWVzdCByZXE7CisKKwlyZXEuZGF0YV9jcG9ydCA9IGNwdV90b19sZTE2KGRhdGFfY3BvcnQpOworCisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0FVRElPX1RZUEVfQUNUSVZBVEVfVFgsCisJCQkJICZyZXEsIHNpemVvZihyZXEpLCBOVUxMLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX2diX2FjdGl2YXRlX3R4KTsKKworaW50IGdiX2F1ZGlvX2diX2RlYWN0aXZhdGVfdHgoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkgICAgICB1MTYgZGF0YV9jcG9ydCkKK3sKKwlzdHJ1Y3QgZ2JfYXVkaW9fZGVhY3RpdmF0ZV90eF9yZXF1ZXN0IHJlcTsKKworCXJlcS5kYXRhX2Nwb3J0ID0gY3B1X3RvX2xlMTYoZGF0YV9jcG9ydCk7CisKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfQVVESU9fVFlQRV9ERUFDVElWQVRFX1RYLAorCQkJCSAmcmVxLCBzaXplb2YocmVxKSwgTlVMTCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19nYl9kZWFjdGl2YXRlX3R4KTsKKworaW50IGdiX2F1ZGlvX2diX3NldF9yeF9kYXRhX3NpemUoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJIHUxNiBkYXRhX2Nwb3J0LCB1MTYgc2l6ZSkKK3sKKwlzdHJ1Y3QgZ2JfYXVkaW9fc2V0X3J4X2RhdGFfc2l6ZV9yZXF1ZXN0IHJlcTsKKworCXJlcS5kYXRhX2Nwb3J0ID0gY3B1X3RvX2xlMTYoZGF0YV9jcG9ydCk7CisJcmVxLnNpemUgPSBjcHVfdG9fbGUxNihzaXplKTsKKworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9BVURJT19UWVBFX1NFVF9SWF9EQVRBX1NJWkUsCisJCQkJICZyZXEsIHNpemVvZihyZXEpLCBOVUxMLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX2diX3NldF9yeF9kYXRhX3NpemUpOworCitpbnQgZ2JfYXVkaW9fZ2JfYWN0aXZhdGVfcngoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkgICAgdTE2IGRhdGFfY3BvcnQpCit7CisJc3RydWN0IGdiX2F1ZGlvX2FjdGl2YXRlX3J4X3JlcXVlc3QgcmVxOworCisJcmVxLmRhdGFfY3BvcnQgPSBjcHVfdG9fbGUxNihkYXRhX2Nwb3J0KTsKKworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9BVURJT19UWVBFX0FDVElWQVRFX1JYLAorCQkJCSAmcmVxLCBzaXplb2YocmVxKSwgTlVMTCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19nYl9hY3RpdmF0ZV9yeCk7CisKK2ludCBnYl9hdWRpb19nYl9kZWFjdGl2YXRlX3J4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJICAgICAgdTE2IGRhdGFfY3BvcnQpCit7CisJc3RydWN0IGdiX2F1ZGlvX2RlYWN0aXZhdGVfcnhfcmVxdWVzdCByZXE7CisKKwlyZXEuZGF0YV9jcG9ydCA9IGNwdV90b19sZTE2KGRhdGFfY3BvcnQpOworCisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0FVRElPX1RZUEVfREVBQ1RJVkFURV9SWCwKKwkJCQkgJnJlcSwgc2l6ZW9mKHJlcSksIE5VTEwsIDApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fZ2JfZGVhY3RpdmF0ZV9yeCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygiZ3JleWJ1czphdWRpby1nYiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHcmV5YnVzIEF1ZGlvIERldmljZSBDbGFzcyBQcm90b2NvbCBsaWJyYXJ5Iik7CitNT0RVTEVfQVVUSE9SKCJNYXJrIEdyZWVyIDxtZ3JlZXJAYW5pbWFsY3JlZWsuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbWFuYWdlci5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbWFuYWdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNjUwOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19tYW5hZ2VyLmMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBHcmV5YnVzIG9wZXJhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2IEdvb2dsZSBJbmMuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J3bG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorCisjaW5jbHVkZSAiYXVkaW9fbWFuYWdlci5oIgorI2luY2x1ZGUgImF1ZGlvX21hbmFnZXJfcHJpdmF0ZS5oIgorCitzdGF0aWMgc3RydWN0IGtzZXQgKm1hbmFnZXJfa3NldDsKKworc3RhdGljIExJU1RfSEVBRChtb2R1bGVzX2xpc3QpOworc3RhdGljIERFQ0xBUkVfUldTRU0obW9kdWxlc19yd3NlbSk7CitzdGF0aWMgREVGSU5FX0lEQShtb2R1bGVfaWQpOworCisvKiBoZWxwZXJzICovCitzdGF0aWMgc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICpnYl9hdWRpb19tYW5hZ2VyX2dldF9sb2NrZWQoaW50IGlkKQoreworCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqbW9kdWxlOworCisJaWYgKGlkIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZHVsZSwgJm1vZHVsZXNfbGlzdCwgbGlzdCkgeworCQlpZiAobW9kdWxlLT5pZCA9PSBpZCkKKwkJCXJldHVybiBtb2R1bGU7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIHB1YmxpYyBBUEkgKi8KK2ludCBnYl9hdWRpb19tYW5hZ2VyX2FkZChzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfZGVzY3JpcHRvciAqZGVzYykKK3sKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZTsKKwlpbnQgaWQ7CisJaW50IGVycjsKKworCWlkID0gaWRhX3NpbXBsZV9nZXQoJm1vZHVsZV9pZCwgMCwgMCwgR0ZQX0tFUk5FTCk7CisJZXJyID0gZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfY3JlYXRlKCZtb2R1bGUsIG1hbmFnZXJfa3NldCwKKwkJCQkJICAgICBpZCwgZGVzYyk7CisJaWYgKGVycikgeworCQlpZGFfc2ltcGxlX3JlbW92ZSgmbW9kdWxlX2lkLCBpZCk7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogQWRkIGl0IHRvIHRoZSBsaXN0ICovCisJZG93bl93cml0ZSgmbW9kdWxlc19yd3NlbSk7CisJbGlzdF9hZGRfdGFpbCgmbW9kdWxlLT5saXN0LCAmbW9kdWxlc19saXN0KTsKKwl1cF93cml0ZSgmbW9kdWxlc19yd3NlbSk7CisKKwlyZXR1cm4gbW9kdWxlLT5pZDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX21hbmFnZXJfYWRkKTsKKworaW50IGdiX2F1ZGlvX21hbmFnZXJfcmVtb3ZlKGludCBpZCkKK3sKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZTsKKworCWRvd25fd3JpdGUoJm1vZHVsZXNfcndzZW0pOworCisJbW9kdWxlID0gZ2JfYXVkaW9fbWFuYWdlcl9nZXRfbG9ja2VkKGlkKTsKKwlpZiAoIW1vZHVsZSkgeworCQl1cF93cml0ZSgmbW9kdWxlc19yd3NlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlsaXN0X2RlbCgmbW9kdWxlLT5saXN0KTsKKwlrb2JqZWN0X3B1dCgmbW9kdWxlLT5rb2JqKTsKKwl1cF93cml0ZSgmbW9kdWxlc19yd3NlbSk7CisJaWRhX3NpbXBsZV9yZW1vdmUoJm1vZHVsZV9pZCwgaWQpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fbWFuYWdlcl9yZW1vdmUpOworCit2b2lkIGdiX2F1ZGlvX21hbmFnZXJfcmVtb3ZlX2FsbCh2b2lkKQoreworCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqbW9kdWxlLCAqbmV4dDsKKwlpbnQgaXNfZW1wdHkgPSAxOworCisJZG93bl93cml0ZSgmbW9kdWxlc19yd3NlbSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobW9kdWxlLCBuZXh0LCAmbW9kdWxlc19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZtb2R1bGUtPmxpc3QpOworCQlrb2JqZWN0X3B1dCgmbW9kdWxlLT5rb2JqKTsKKwkJaWRhX3NpbXBsZV9yZW1vdmUoJm1vZHVsZV9pZCwgbW9kdWxlLT5pZCk7CisJfQorCisJaXNfZW1wdHkgPSBsaXN0X2VtcHR5KCZtb2R1bGVzX2xpc3QpOworCisJdXBfd3JpdGUoJm1vZHVsZXNfcndzZW0pOworCisJaWYgKCFpc19lbXB0eSkKKwkJcHJfd2FybigiTm90IGFsbCBub2RlcyB3ZXJlIGRlbGV0ZWRcbiIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fbWFuYWdlcl9yZW1vdmVfYWxsKTsKKworc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICpnYl9hdWRpb19tYW5hZ2VyX2dldF9tb2R1bGUoaW50IGlkKQoreworCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqbW9kdWxlOworCisJZG93bl9yZWFkKCZtb2R1bGVzX3J3c2VtKTsKKwltb2R1bGUgPSBnYl9hdWRpb19tYW5hZ2VyX2dldF9sb2NrZWQoaWQpOworCWtvYmplY3RfZ2V0KCZtb2R1bGUtPmtvYmopOworCXVwX3JlYWQoJm1vZHVsZXNfcndzZW0pOworCXJldHVybiBtb2R1bGU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19tYW5hZ2VyX2dldF9tb2R1bGUpOworCit2b2lkIGdiX2F1ZGlvX21hbmFnZXJfcHV0X21vZHVsZShzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZSkKK3sKKwlrb2JqZWN0X3B1dCgmbW9kdWxlLT5rb2JqKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX21hbmFnZXJfcHV0X21vZHVsZSk7CisKK2ludCBnYl9hdWRpb19tYW5hZ2VyX2R1bXBfbW9kdWxlKGludCBpZCkKK3sKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZTsKKworCWRvd25fcmVhZCgmbW9kdWxlc19yd3NlbSk7CisJbW9kdWxlID0gZ2JfYXVkaW9fbWFuYWdlcl9nZXRfbG9ja2VkKGlkKTsKKwl1cF9yZWFkKCZtb2R1bGVzX3J3c2VtKTsKKworCWlmICghbW9kdWxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2R1bXAobW9kdWxlKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX21hbmFnZXJfZHVtcF9tb2R1bGUpOworCit2b2lkIGdiX2F1ZGlvX21hbmFnZXJfZHVtcF9hbGwodm9pZCkKK3sKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZTsKKwlpbnQgY291bnQgPSAwOworCisJZG93bl9yZWFkKCZtb2R1bGVzX3J3c2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZHVsZSwgJm1vZHVsZXNfbGlzdCwgbGlzdCkgeworCQlnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9kdW1wKG1vZHVsZSk7CisJCWNvdW50Kys7CisJfQorCXVwX3JlYWQoJm1vZHVsZXNfcndzZW0pOworCisJcHJfaW5mbygiTnVtYmVyIG9mIGNvbm5lY3RlZCBtb2R1bGVzOiAlZFxuIiwgY291bnQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fbWFuYWdlcl9kdW1wX2FsbCk7CisKKy8qCisgKiBtb2R1bGUgaW5pdC9kZWluaXQKKyAqLworc3RhdGljIGludCBfX2luaXQgbWFuYWdlcl9pbml0KHZvaWQpCit7CisJbWFuYWdlcl9rc2V0ID0ga3NldF9jcmVhdGVfYW5kX2FkZChHQl9BVURJT19NQU5BR0VSX05BTUUsIE5VTEwsCisJCQkJCSAgIGtlcm5lbF9rb2JqKTsKKwlpZiAoIW1hbmFnZXJfa3NldCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKyNpZmRlZiBHQl9BVURJT19NQU5BR0VSX1NZU0ZTCisJZ2JfYXVkaW9fbWFuYWdlcl9zeXNmc19pbml0KCZtYW5hZ2VyX2tzZXQtPmtvYmopOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1hbmFnZXJfZXhpdCh2b2lkKQoreworCWdiX2F1ZGlvX21hbmFnZXJfcmVtb3ZlX2FsbCgpOworCWtzZXRfdW5yZWdpc3RlcihtYW5hZ2VyX2tzZXQpOworCWlkYV9kZXN0cm95KCZtb2R1bGVfaWQpOworfQorCittb2R1bGVfaW5pdChtYW5hZ2VyX2luaXQpOworbW9kdWxlX2V4aXQobWFuYWdlcl9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiU3ZldGxpbiBBbmtvdiA8YW5rb3Zfc3ZldGxpbkBwcm9qZWN0YXJhLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGNhMDk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbWFuYWdlci5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBHcmV5YnVzIG9wZXJhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2IEdvb2dsZSBJbmMuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2lmbmRlZiBfR0JfQVVESU9fTUFOQUdFUl9IXworI2RlZmluZSBfR0JfQVVESU9fTUFOQUdFUl9IXworCisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2RlZmluZSBHQl9BVURJT19NQU5BR0VSX05BTUUgImdiX2F1ZGlvX21hbmFnZXIiCisjZGVmaW5lIEdCX0FVRElPX01BTkFHRVJfTU9EVUxFX05BTUVfTEVOIDY0CisjZGVmaW5lIEdCX0FVRElPX01BTkFHRVJfTU9EVUxFX05BTUVfTEVOX1NTQ0FORiAiNjMiCisKK3N0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9kZXNjcmlwdG9yIHsKKwljaGFyIG5hbWVbR0JfQVVESU9fTUFOQUdFUl9NT0RVTEVfTkFNRV9MRU5dOworCWludCBzbG90OworCWludCB2aWQ7CisJaW50IHBpZDsKKwlpbnQgY3BvcnQ7CisJdW5zaWduZWQgaW50IGlwX2RldmljZXM7CisJdW5zaWduZWQgaW50IG9wX2RldmljZXM7Cit9OworCitzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgeworCXN0cnVjdCBrb2JqZWN0IGtvYmo7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWludCBpZDsKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfZGVzY3JpcHRvciBkZXNjOworfTsKKworLyoKKyAqIENyZWF0ZXMgYSBuZXcgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfZGVzY3JpcHRvciwgdXNpbmcgdGhlIHNwZWNpZmllZAorICogZGVzY3JpcHRvci4KKyAqCisgKiBSZXR1cm5zIGEgbmVnYXRpdmUgcmVzdWx0IG9uIGVycm9yLCBvciB0aGUgaWQgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgbW9kdWxlLgorICoKKyAqLworaW50IGdiX2F1ZGlvX21hbmFnZXJfYWRkKHN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9kZXNjcmlwdG9yICpkZXNjKTsKKworLyoKKyAqIFJlbW92ZXMgYSBjb25uZWN0ZWQgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfZGVzY3JpcHRvciBmb3IgdGhlIHNwZWNpZmllZCBJRC4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4KKyAqLworaW50IGdiX2F1ZGlvX21hbmFnZXJfcmVtb3ZlKGludCBpZCk7CisKKy8qCisgKiBSZW1vdmVzIGFsbCBjb25uZWN0ZWQgZ2JfYXVkaW9fbW9kdWxlcworICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLgorICovCit2b2lkIGdiX2F1ZGlvX21hbmFnZXJfcmVtb3ZlX2FsbCh2b2lkKTsKKworLyoKKyAqIFJldHJpZXZlcyBhIGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgaWQuCisgKiBSZXR1cm5zIHRoZSBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9kZXNjcmlwdG9yIHN0cnVjdHVyZSwKKyAqIG9yIE5VTEwgaWYgdGhlcmUgaXMgbm8gbW9kdWxlIHdpdGggdGhlIHNwZWNpZmllZCBJRC4KKyAqLworc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICpnYl9hdWRpb19tYW5hZ2VyX2dldF9tb2R1bGUoaW50IGlkKTsKKworLyoKKyAqIERlY3JlYXNlcyB0aGUgcmVmY291bnQgb2YgdGhlIG1vZHVsZSwgb2J0YWluZWQgYnkgdGhlIGdldCBmdW5jdGlvbi4KKyAqIE1vZHVsZXMgYXJlIHJlbW92ZWQgdmlhIGdiX2F1ZGlvX21hbmFnZXJfcmVtb3ZlCisgKi8KK3ZvaWQgZ2JfYXVkaW9fbWFuYWdlcl9wdXRfbW9kdWxlKHN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqbW9kdWxlKTsKKworLyoKKyAqIER1bXBzIHRoZSBtb2R1bGUgZm9yIHRoZSBzcGVjaWZpZWQgaWQKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MKKyAqLworaW50IGdiX2F1ZGlvX21hbmFnZXJfZHVtcF9tb2R1bGUoaW50IGlkKTsKKworLyoKKyAqIER1bXBzIGFsbCBjb25uZWN0ZWQgbW9kdWxlcworICovCit2b2lkIGdiX2F1ZGlvX21hbmFnZXJfZHVtcF9hbGwodm9pZCk7CisKKyNlbmRpZiAvKiBfR0JfQVVESU9fTUFOQUdFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbWFuYWdlcl9tb2R1bGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXJfbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwZTk2YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXJfbW9kdWxlLmMKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBHcmV5YnVzIG9wZXJhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2IEdvb2dsZSBJbmMuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgImF1ZGlvX21hbmFnZXIuaCIKKyNpbmNsdWRlICJhdWRpb19tYW5hZ2VyX3ByaXZhdGUuaCIKKworI2RlZmluZSB0b19nYl9hdWRpb19tb2R1bGVfYXR0cih4KQlcCisJCWNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfYXR0cmlidXRlLCBhdHRyKQorI2RlZmluZSB0b19nYl9hdWRpb19tb2R1bGUoeCkJCVwKKwkJY29udGFpbmVyX29mKHgsIHN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSwga29iaikKKworc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZSB7CisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZSwKKwkJCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpOworCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICptb2R1bGUsCisJCQkgc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7Cit9OworCitzdGF0aWMgc3NpemVfdCBnYl9hdWRpb19tb2R1bGVfYXR0cl9zaG93KAorCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZSAqYXR0cmlidXRlOworCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqbW9kdWxlOworCisJYXR0cmlidXRlID0gdG9fZ2JfYXVkaW9fbW9kdWxlX2F0dHIoYXR0cik7CisJbW9kdWxlID0gdG9fZ2JfYXVkaW9fbW9kdWxlKGtvYmopOworCisJaWYgKCFhdHRyaWJ1dGUtPnNob3cpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGF0dHJpYnV0ZS0+c2hvdyhtb2R1bGUsIGF0dHJpYnV0ZSwgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QgZ2JfYXVkaW9fbW9kdWxlX2F0dHJfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJCSAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZSAqYXR0cmlidXRlOworCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqbW9kdWxlOworCisJYXR0cmlidXRlID0gdG9fZ2JfYXVkaW9fbW9kdWxlX2F0dHIoYXR0cik7CisJbW9kdWxlID0gdG9fZ2JfYXVkaW9fbW9kdWxlKGtvYmopOworCisJaWYgKCFhdHRyaWJ1dGUtPnN0b3JlKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBhdHRyaWJ1dGUtPnN0b3JlKG1vZHVsZSwgYXR0cmlidXRlLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIGdiX2F1ZGlvX21vZHVsZV9zeXNmc19vcHMgPSB7CisJLnNob3cgPSBnYl9hdWRpb19tb2R1bGVfYXR0cl9zaG93LAorCS5zdG9yZSA9IGdiX2F1ZGlvX21vZHVsZV9hdHRyX3N0b3JlLAorfTsKKworc3RhdGljIHZvaWQgZ2JfYXVkaW9fbW9kdWxlX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICptb2R1bGUgPSB0b19nYl9hdWRpb19tb2R1bGUoa29iaik7CisKKwlwcl9pbmZvKCJEZXN0cm95aW5nIGF1ZGlvIG1vZHVsZSAjJWRcbiIsIG1vZHVsZS0+aWQpOworCS8qIFRPRE8gLT4gZGVsZXRlIGZyb20gbGlzdCAqLworCWtmcmVlKG1vZHVsZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdiX2F1ZGlvX21vZHVsZV9uYW1lX3Nob3coCisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICptb2R1bGUsCisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzIiwgbW9kdWxlLT5kZXNjLm5hbWUpOworfQorCitzdGF0aWMgc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZSBnYl9hdWRpb19tb2R1bGVfbmFtZV9hdHRyaWJ1dGUgPQorCV9fQVRUUihuYW1lLCAwNjY0LCBnYl9hdWRpb19tb2R1bGVfbmFtZV9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZ2JfYXVkaW9fbW9kdWxlX3Nsb3Rfc2hvdygKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZSwKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQiLCBtb2R1bGUtPmRlc2Muc2xvdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfYXR0cmlidXRlIGdiX2F1ZGlvX21vZHVsZV9zbG90X2F0dHJpYnV0ZSA9CisJX19BVFRSKHNsb3QsIDA2NjQsIGdiX2F1ZGlvX21vZHVsZV9zbG90X3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBnYl9hdWRpb19tb2R1bGVfdmlkX3Nob3coCisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICptb2R1bGUsCisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkIiwgbW9kdWxlLT5kZXNjLnZpZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfYXR0cmlidXRlIGdiX2F1ZGlvX21vZHVsZV92aWRfYXR0cmlidXRlID0KKwlfX0FUVFIodmlkLCAwNjY0LCBnYl9hdWRpb19tb2R1bGVfdmlkX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBnYl9hdWRpb19tb2R1bGVfcGlkX3Nob3coCisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICptb2R1bGUsCisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkIiwgbW9kdWxlLT5kZXNjLnBpZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfYXR0cmlidXRlIGdiX2F1ZGlvX21vZHVsZV9waWRfYXR0cmlidXRlID0KKwlfX0FUVFIocGlkLCAwNjY0LCBnYl9hdWRpb19tb2R1bGVfcGlkX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBnYl9hdWRpb19tb2R1bGVfY3BvcnRfc2hvdygKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZSwKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQiLCBtb2R1bGUtPmRlc2MuY3BvcnQpOworfQorCitzdGF0aWMgc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZQorCQkJCQlnYl9hdWRpb19tb2R1bGVfY3BvcnRfYXR0cmlidXRlID0KKwlfX0FUVFIoY3BvcnQsIDA2NjQsIGdiX2F1ZGlvX21vZHVsZV9jcG9ydF9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZ2JfYXVkaW9fbW9kdWxlX2lwX2RldmljZXNfc2hvdygKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZSwKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglWCIsIG1vZHVsZS0+ZGVzYy5pcF9kZXZpY2VzKTsKK30KKworc3RhdGljIHN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9hdHRyaWJ1dGUKKwkJCQkJZ2JfYXVkaW9fbW9kdWxlX2lwX2RldmljZXNfYXR0cmlidXRlID0KKwlfX0FUVFIoaXBfZGV2aWNlcywgMDY2NCwgZ2JfYXVkaW9fbW9kdWxlX2lwX2RldmljZXNfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGdiX2F1ZGlvX21vZHVsZV9vcF9kZXZpY2VzX3Nob3coCisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICptb2R1bGUsCisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JVgiLCBtb2R1bGUtPmRlc2Mub3BfZGV2aWNlcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfYXR0cmlidXRlCisJCQkJCWdiX2F1ZGlvX21vZHVsZV9vcF9kZXZpY2VzX2F0dHJpYnV0ZSA9CisJX19BVFRSKG9wX2RldmljZXMsIDA2NjQsIGdiX2F1ZGlvX21vZHVsZV9vcF9kZXZpY2VzX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZ2JfYXVkaW9fbW9kdWxlX2RlZmF1bHRfYXR0cnNbXSA9IHsKKwkmZ2JfYXVkaW9fbW9kdWxlX25hbWVfYXR0cmlidXRlLmF0dHIsCisJJmdiX2F1ZGlvX21vZHVsZV9zbG90X2F0dHJpYnV0ZS5hdHRyLAorCSZnYl9hdWRpb19tb2R1bGVfdmlkX2F0dHJpYnV0ZS5hdHRyLAorCSZnYl9hdWRpb19tb2R1bGVfcGlkX2F0dHJpYnV0ZS5hdHRyLAorCSZnYl9hdWRpb19tb2R1bGVfY3BvcnRfYXR0cmlidXRlLmF0dHIsCisJJmdiX2F1ZGlvX21vZHVsZV9pcF9kZXZpY2VzX2F0dHJpYnV0ZS5hdHRyLAorCSZnYl9hdWRpb19tb2R1bGVfb3BfZGV2aWNlc19hdHRyaWJ1dGUuYXR0ciwKKwlOVUxMLCAgIC8qIG5lZWQgdG8gTlVMTCB0ZXJtaW5hdGUgdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyAqLworfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgZ2JfYXVkaW9fbW9kdWxlX3R5cGUgPSB7CisJLnN5c2ZzX29wcyA9ICZnYl9hdWRpb19tb2R1bGVfc3lzZnNfb3BzLAorCS5yZWxlYXNlID0gZ2JfYXVkaW9fbW9kdWxlX3JlbGVhc2UsCisJLmRlZmF1bHRfYXR0cnMgPSBnYl9hdWRpb19tb2R1bGVfZGVmYXVsdF9hdHRycywKK307CisKK3N0YXRpYyB2b2lkIHNlbmRfYWRkX3VldmVudChzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZSkKK3sKKwljaGFyIG5hbWVfc3RyaW5nWzEyOF07CisJY2hhciBzbG90X3N0cmluZ1s2NF07CisJY2hhciB2aWRfc3RyaW5nWzY0XTsKKwljaGFyIHBpZF9zdHJpbmdbNjRdOworCWNoYXIgY3BvcnRfc3RyaW5nWzY0XTsKKwljaGFyIGlwX2RldmljZXNfc3RyaW5nWzY0XTsKKwljaGFyIG9wX2RldmljZXNfc3RyaW5nWzY0XTsKKworCWNoYXIgKmVudnBbXSA9IHsKKwkJbmFtZV9zdHJpbmcsCisJCXNsb3Rfc3RyaW5nLAorCQl2aWRfc3RyaW5nLAorCQlwaWRfc3RyaW5nLAorCQljcG9ydF9zdHJpbmcsCisJCWlwX2RldmljZXNfc3RyaW5nLAorCQlvcF9kZXZpY2VzX3N0cmluZywKKwkJTlVMTAorCX07CisKKwlzbnByaW50ZihuYW1lX3N0cmluZywgMTI4LCAiTkFNRT0lcyIsIG1vZHVsZS0+ZGVzYy5uYW1lKTsKKwlzbnByaW50ZihzbG90X3N0cmluZywgNjQsICJTTE9UPSVkIiwgbW9kdWxlLT5kZXNjLnNsb3QpOworCXNucHJpbnRmKHZpZF9zdHJpbmcsIDY0LCAiVklEPSVkIiwgbW9kdWxlLT5kZXNjLnZpZCk7CisJc25wcmludGYocGlkX3N0cmluZywgNjQsICJQSUQ9JWQiLCBtb2R1bGUtPmRlc2MucGlkKTsKKwlzbnByaW50ZihjcG9ydF9zdHJpbmcsIDY0LCAiQ1BPUlQ9JWQiLCBtb2R1bGUtPmRlc2MuY3BvcnQpOworCXNucHJpbnRmKGlwX2RldmljZXNfc3RyaW5nLCA2NCwgIkkvUCBERVZJQ0VTPTB4JVgiLAorCQkgbW9kdWxlLT5kZXNjLmlwX2RldmljZXMpOworCXNucHJpbnRmKG9wX2RldmljZXNfc3RyaW5nLCA2NCwgIk8vUCBERVZJQ0VTPTB4JVgiLAorCQkgbW9kdWxlLT5kZXNjLm9wX2RldmljZXMpOworCisJa29iamVjdF91ZXZlbnRfZW52KCZtb2R1bGUtPmtvYmosIEtPQkpfQURELCBlbnZwKTsKK30KKworaW50IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2NyZWF0ZSgKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKiptb2R1bGUsCisJc3RydWN0IGtzZXQgKm1hbmFnZXJfa3NldCwKKwlpbnQgaWQsIHN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9kZXNjcmlwdG9yICpkZXNjKQoreworCWludCBlcnI7CisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICptOworCisJbSA9IGt6YWxsb2Moc2l6ZW9mKCptKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEluaXRpYWxpemUgdGhlIG5vZGUgKi8KKwlJTklUX0xJU1RfSEVBRCgmbS0+bGlzdCk7CisKKwkvKiBTZXQgdGhlIG1vZHVsZSBpZCAqLworCW0tPmlkID0gaWQ7CisKKwkvKiBDb3B5IHRoZSBwcm92aWRlZCBkZXNjcmlwdG9yICovCisJbWVtY3B5KCZtLT5kZXNjLCBkZXNjLCBzaXplb2YoKmRlc2MpKTsKKworCS8qIHNldCB0aGUga3NldCAqLworCW0tPmtvYmoua3NldCA9IG1hbmFnZXJfa3NldDsKKworCS8qCisJICogSW5pdGlhbGl6ZSBhbmQgYWRkIHRoZSBrb2JqZWN0IHRvIHRoZSBrZXJuZWwuICBBbGwgdGhlIGRlZmF1bHQgZmlsZXMKKwkgKiB3aWxsIGJlIGNyZWF0ZWQgaGVyZS4gIEFzIHdlIGhhdmUgYWxyZWFkeSBzcGVjaWZpZWQgYSBrc2V0IGZvciB0aGlzCisJICoga29iamVjdCwgd2UgZG9uJ3QgaGF2ZSB0byBzZXQgYSBwYXJlbnQgZm9yIHRoZSBrb2JqZWN0LCB0aGUga29iamVjdAorCSAqIHdpbGwgYmUgcGxhY2VkIGJlbmVhdGggdGhhdCBrc2V0IGF1dG9tYXRpY2FsbHkuCisJICovCisJZXJyID0ga29iamVjdF9pbml0X2FuZF9hZGQoJm0tPmtvYmosICZnYl9hdWRpb19tb2R1bGVfdHlwZSwgTlVMTCwgIiVkIiwKKwkJCQkgICBpZCk7CisJaWYgKGVycikgeworCQlwcl9lcnIoImZhaWxlZCBpbml0aWFsaXppbmcga29iamVjdCBmb3IgYXVkaW8gbW9kdWxlICMlZFxuIiwKKwkJICAgICAgIGlkKTsKKwkJa29iamVjdF9wdXQoJm0tPmtvYmopOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qCisJICogTm90aWZ5IHRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQKKwkgKi8KKwlzZW5kX2FkZF91ZXZlbnQobSk7CisKKwkqbW9kdWxlID0gbTsKKwlwcl9pbmZvKCJDcmVhdGVkIGF1ZGlvIG1vZHVsZSAjJWRcbiIsIGlkKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9kdW1wKHN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqbW9kdWxlKQoreworCXByX2luZm8oImF1ZGlvIG1vZHVsZSAjJWQgbmFtZT0lcyBzbG90PSVkIHZpZD0lZCBwaWQ9JWQgY3BvcnQ9JWQgaS9wIGRldmljZXM9MHglWCBvL3AgZGV2aWNlcz0weCVYXG4iLAorCQltb2R1bGUtPmlkLAorCQltb2R1bGUtPmRlc2MubmFtZSwKKwkJbW9kdWxlLT5kZXNjLnNsb3QsCisJCW1vZHVsZS0+ZGVzYy52aWQsCisJCW1vZHVsZS0+ZGVzYy5waWQsCisJCW1vZHVsZS0+ZGVzYy5jcG9ydCwKKwkJbW9kdWxlLT5kZXNjLmlwX2RldmljZXMsCisJCW1vZHVsZS0+ZGVzYy5vcF9kZXZpY2VzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXJfcHJpdmF0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbWFuYWdlcl9wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5Y2U5NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXJfcHJpdmF0ZS5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBHcmV5YnVzIG9wZXJhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2IEdvb2dsZSBJbmMuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2lmbmRlZiBfR0JfQVVESU9fTUFOQUdFUl9QUklWQVRFX0hfCisjZGVmaW5lIF9HQl9BVURJT19NQU5BR0VSX1BSSVZBVEVfSF8KKworI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKworI2luY2x1ZGUgImF1ZGlvX21hbmFnZXIuaCIKKworaW50IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2NyZWF0ZSgKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKiptb2R1bGUsCisJc3RydWN0IGtzZXQgKm1hbmFnZXJfa3NldCwKKwlpbnQgaWQsIHN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9kZXNjcmlwdG9yICpkZXNjKTsKKworLyogbW9kdWxlIGRlc3Ryb3llZCB2aWEga29iamVjdF9wdXQgKi8KKwordm9pZCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9kdW1wKHN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqbW9kdWxlKTsKKworLyogc3lzZnMgY29udHJvbCAqLwordm9pZCBnYl9hdWRpb19tYW5hZ2VyX3N5c2ZzX2luaXQoc3RydWN0IGtvYmplY3QgKmtvYmopOworCisjZW5kaWYgLyogX0dCX0FVRElPX01BTkFHRVJfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbWFuYWdlcl9zeXNmcy5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbWFuYWdlcl9zeXNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YmY4NTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19tYW5hZ2VyX3N5c2ZzLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBHcmV5YnVzIG9wZXJhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2IEdvb2dsZSBJbmMuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisKKyNpbmNsdWRlICJhdWRpb19tYW5hZ2VyLmgiCisjaW5jbHVkZSAiYXVkaW9fbWFuYWdlcl9wcml2YXRlLmgiCisKK3N0YXRpYyBzc2l6ZV90IG1hbmFnZXJfc3lzZnNfYWRkX3N0b3JlKAorCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgZGVzYyA9IHsgezB9IH07CisKKwlpbnQgbnVtID0gc3NjYW5mKGJ1ZiwKKwkJCSJuYW1lPSUiIEdCX0FVRElPX01BTkFHRVJfTU9EVUxFX05BTUVfTEVOX1NTQ0FORiAicyAiCisJCQkic2xvdD0lZCB2aWQ9JWQgcGlkPSVkIGNwb3J0PSVkIGkvcCBkZXZpY2VzPTB4JVgiCisJCQkiby9wIGRldmljZXM9MHglWCIsCisJCQlkZXNjLm5hbWUsICZkZXNjLnNsb3QsICZkZXNjLnZpZCwgJmRlc2MucGlkLAorCQkJJmRlc2MuY3BvcnQsICZkZXNjLmlwX2RldmljZXMsICZkZXNjLm9wX2RldmljZXMpOworCisJaWYgKG51bSAhPSA3KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW51bSA9IGdiX2F1ZGlvX21hbmFnZXJfYWRkKCZkZXNjKTsKKwlpZiAobnVtIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgbWFuYWdlcl9hZGRfYXR0cmlidXRlID0KKwlfX0FUVFIoYWRkLCAwNjY0LCBOVUxMLCBtYW5hZ2VyX3N5c2ZzX2FkZF9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IG1hbmFnZXJfc3lzZnNfcmVtb3ZlX3N0b3JlKAorCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IGlkOworCisJaW50IG51bSA9IHNzY2FuZihidWYsICIlZCIsICZpZCk7CisKKwlpZiAobnVtICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJbnVtID0gZ2JfYXVkaW9fbWFuYWdlcl9yZW1vdmUoaWQpOworCWlmIChudW0pCisJCXJldHVybiBudW07CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgbWFuYWdlcl9yZW1vdmVfYXR0cmlidXRlID0KKwlfX0FUVFIocmVtb3ZlLCAwNjY0LCBOVUxMLCBtYW5hZ2VyX3N5c2ZzX3JlbW92ZV9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IG1hbmFnZXJfc3lzZnNfZHVtcF9zdG9yZSgKKwlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBpZDsKKworCWludCBudW0gPSBzc2NhbmYoYnVmLCAiJWQiLCAmaWQpOworCisJaWYgKG51bSA9PSAxKSB7CisJCW51bSA9IGdiX2F1ZGlvX21hbmFnZXJfZHVtcF9tb2R1bGUoaWQpOworCQlpZiAobnVtKQorCQkJcmV0dXJuIG51bTsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKCJhbGwiLCBidWYsIDMpKQorCQlnYl9hdWRpb19tYW5hZ2VyX2R1bXBfYWxsKCk7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBtYW5hZ2VyX2R1bXBfYXR0cmlidXRlID0KKwlfX0FUVFIoZHVtcCwgMDY2NCwgTlVMTCwgbWFuYWdlcl9zeXNmc19kdW1wX3N0b3JlKTsKKworc3RhdGljIHZvaWQgbWFuYWdlcl9zeXNmc19pbml0X2F0dHJpYnV0ZSgKKwkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqa2F0dHIpCit7CisJaW50IGVycjsKKworCWVyciA9IHN5c2ZzX2NyZWF0ZV9maWxlKGtvYmosICZrYXR0ci0+YXR0cik7CisJaWYgKGVycikgeworCQlwcl93YXJuKCJjcmVhdGluZyB0aGUgc3lzZnMgZW50cnkgZm9yICVzIGZhaWxlZDogJWRcbiIsCisJCQlrYXR0ci0+YXR0ci5uYW1lLCBlcnIpOworCX0KK30KKwordm9pZCBnYl9hdWRpb19tYW5hZ2VyX3N5c2ZzX2luaXQoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJbWFuYWdlcl9zeXNmc19pbml0X2F0dHJpYnV0ZShrb2JqLCAmbWFuYWdlcl9hZGRfYXR0cmlidXRlKTsKKwltYW5hZ2VyX3N5c2ZzX2luaXRfYXR0cmlidXRlKGtvYmosICZtYW5hZ2VyX3JlbW92ZV9hdHRyaWJ1dGUpOworCW1hbmFnZXJfc3lzZnNfaW5pdF9hdHRyaWJ1dGUoa29iaiwgJm1hbmFnZXJfZHVtcF9hdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19tb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTFjMGZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbW9kdWxlLmMKQEAgLTAsMCArMSw0ODIgQEAKKy8qCisgKiBHcmV5YnVzIGF1ZGlvIGRyaXZlcgorICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisKKyNpbmNsdWRlICJhdWRpb19jb2RlYy5oIgorI2luY2x1ZGUgImF1ZGlvX2FwYnJpZGdlYS5oIgorI2luY2x1ZGUgImF1ZGlvX21hbmFnZXIuaCIKKworLyoKKyAqIGdiX3NuZCBtYW5hZ2VtZW50IGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgZ2JhdWRpb19yZXF1ZXN0X2phY2soc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSwKKwkJCQkgIHN0cnVjdCBnYl9hdWRpb19qYWNrX2V2ZW50X3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmVwb3J0OworCXN0cnVjdCBzbmRfamFjayAqamFjayA9IG1vZHVsZS0+aGVhZHNldF9qYWNrLmphY2s7CisJc3RydWN0IHNuZF9qYWNrICpidG5famFjayA9IG1vZHVsZS0+YnV0dG9uX2phY2suamFjazsKKworCWlmICghamFjaykgeworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LAorCQkJIkludmFsaWQgamFjayBldmVudCByZWNlaXZlZDp0eXBlOiAldSwgZXZlbnQ6ICV1XG4iLAorCQkJcmVxLT5qYWNrX2F0dHJpYnV0ZSwgcmVxLT5ldmVudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl93YXJuX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LAorCQkJICAgICAiSmFjayBFdmVudCByZWNlaXZlZDogdHlwZTogJXUsIGV2ZW50OiAldVxuIiwKKwkJCSAgICAgcmVxLT5qYWNrX2F0dHJpYnV0ZSwgcmVxLT5ldmVudCk7CisKKwlpZiAocmVxLT5ldmVudCA9PSBHQl9BVURJT19KQUNLX0VWRU5UX1JFTU9WQUwpIHsKKwkJbW9kdWxlLT5qYWNrX3R5cGUgPSAwOworCQlpZiAoYnRuX2phY2sgJiYgbW9kdWxlLT5idXR0b25fc3RhdHVzKSB7CisJCQlzbmRfc29jX2phY2tfcmVwb3J0KCZtb2R1bGUtPmJ1dHRvbl9qYWNrLCAwLAorCQkJCQkgICAgbW9kdWxlLT5idXR0b25fbWFzayk7CisJCQltb2R1bGUtPmJ1dHRvbl9zdGF0dXMgPSAwOworCQl9CisJCXNuZF9zb2NfamFja19yZXBvcnQoJm1vZHVsZS0+aGVhZHNldF9qYWNrLCAwLAorCQkJCSAgICBtb2R1bGUtPmphY2tfbWFzayk7CisJCXJldHVybiAwOworCX0KKworCXJlcG9ydCA9IHJlcS0+amFja19hdHRyaWJ1dGUgJiBtb2R1bGUtPmphY2tfbWFzazsKKwlpZiAoIXJlcG9ydCkgeworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LAorCQkJIkludmFsaWQgamFjayBldmVudCByZWNlaXZlZDp0eXBlOiAldSwgZXZlbnQ6ICV1XG4iLAorCQkJcmVxLT5qYWNrX2F0dHJpYnV0ZSwgcmVxLT5ldmVudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChtb2R1bGUtPmphY2tfdHlwZSkKKwkJZGV2X3dhcm5fcmF0ZWxpbWl0ZWQobW9kdWxlLT5kZXYsCisJCQkJICAgICAiTW9kaWZ5aW5nIGphY2sgZnJvbSAlZCB0byAlZFxuIiwKKwkJCQkgICAgIG1vZHVsZS0+amFja190eXBlLCByZXBvcnQpOworCisJbW9kdWxlLT5qYWNrX3R5cGUgPSByZXBvcnQ7CisJc25kX3NvY19qYWNrX3JlcG9ydCgmbW9kdWxlLT5oZWFkc2V0X2phY2ssIHJlcG9ydCwgbW9kdWxlLT5qYWNrX21hc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JhdWRpb19yZXF1ZXN0X2J1dHRvbihzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlLAorCQkJCSAgc3RydWN0IGdiX2F1ZGlvX2J1dHRvbl9ldmVudF9yZXF1ZXN0ICpyZXEpCit7CisJaW50IHNvY19idXR0b25faWQsIHJlcG9ydDsKKwlzdHJ1Y3Qgc25kX2phY2sgKmJ0bl9qYWNrID0gbW9kdWxlLT5idXR0b25famFjay5qYWNrOworCisJaWYgKCFidG5famFjaykgeworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LAorCQkJIkludmFsaWQgYnV0dG9uIGV2ZW50IHJlY2VpdmVkOnR5cGU6ICV1LCBldmVudDogJXVcbiIsCisJCQlyZXEtPmJ1dHRvbl9pZCwgcmVxLT5ldmVudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl93YXJuX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LAorCQkJICAgICAiQnV0dG9uIEV2ZW50IHJlY2VpdmVkOiBpZDogJXUsIGV2ZW50OiAldVxuIiwKKwkJCSAgICAgcmVxLT5idXR0b25faWQsIHJlcS0+ZXZlbnQpOworCisJLyogY3VycmVudGx5IHN1cHBvcnRzIDQgYnV0dG9ucyBvbmx5ICovCisJaWYgKCFtb2R1bGUtPmphY2tfdHlwZSkgeworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LAorCQkJCSAgICAiSmFjayBub3QgcHJlc2VudC4gQm9ndXMgZXZlbnQhIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcG9ydCA9IG1vZHVsZS0+YnV0dG9uX3N0YXR1cyAmIG1vZHVsZS0+YnV0dG9uX21hc2s7CisJc29jX2J1dHRvbl9pZCA9IDA7CisKKwlzd2l0Y2ggKHJlcS0+YnV0dG9uX2lkKSB7CisJY2FzZSAxOgorCQlzb2NfYnV0dG9uX2lkID0gU05EX0pBQ0tfQlROXzAgJiBtb2R1bGUtPmJ1dHRvbl9tYXNrOworCQlicmVhazsKKworCWNhc2UgMjoKKwkJc29jX2J1dHRvbl9pZCA9IFNORF9KQUNLX0JUTl8xICYgbW9kdWxlLT5idXR0b25fbWFzazsKKwkJYnJlYWs7CisKKwljYXNlIDM6CisJCXNvY19idXR0b25faWQgPSBTTkRfSkFDS19CVE5fMiAmIG1vZHVsZS0+YnV0dG9uX21hc2s7CisJCWJyZWFrOworCisJY2FzZSA0OgorCQlzb2NfYnV0dG9uX2lkID0gU05EX0pBQ0tfQlROXzMgJiBtb2R1bGUtPmJ1dHRvbl9tYXNrOworCQlicmVhazsKKwl9CisKKwlpZiAoIXNvY19idXR0b25faWQpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChtb2R1bGUtPmRldiwKKwkJCQkgICAgIkludmFsaWQgYnV0dG9uIHJlcXVlc3QgcmVjZWl2ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocmVxLT5ldmVudCA9PSBHQl9BVURJT19CVVRUT05fRVZFTlRfUFJFU1MpCisJCXJlcG9ydCA9IHJlcG9ydCB8IHNvY19idXR0b25faWQ7CisJZWxzZQorCQlyZXBvcnQgPSByZXBvcnQgJiB+c29jX2J1dHRvbl9pZDsKKworCW1vZHVsZS0+YnV0dG9uX3N0YXR1cyA9IHJlcG9ydDsKKworCXNuZF9zb2NfamFja19yZXBvcnQoJm1vZHVsZS0+YnV0dG9uX2phY2ssIHJlcG9ydCwgbW9kdWxlLT5idXR0b25fbWFzayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX3JlcXVlc3Rfc3RyZWFtKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUsCisJCQkJICBzdHJ1Y3QgZ2JfYXVkaW9fc3RyZWFtaW5nX2V2ZW50X3JlcXVlc3QgKnJlcSkKK3sKKwlkZXZfd2Fybihtb2R1bGUtPmRldiwgIkF1ZGlvIEV2ZW50IHJlY2VpdmVkOiBjcG9ydDogJXUsIGV2ZW50OiAldVxuIiwKKwkJIHJlcS0+ZGF0YV9jcG9ydCwgcmVxLT5ldmVudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX2NvZGVjX3JlcXVlc3RfaGFuZGxlcihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUgPQorCQlncmV5YnVzX2dldF9kcnZkYXRhKGNvbm5lY3Rpb24tPmJ1bmRsZSk7CisJc3RydWN0IGdiX29wZXJhdGlvbl9tc2dfaGRyICpoZWFkZXIgPSBvcC0+cmVxdWVzdC0+aGVhZGVyOworCXN0cnVjdCBnYl9hdWRpb19zdHJlYW1pbmdfZXZlbnRfcmVxdWVzdCAqc3RyZWFtX3JlcTsKKwlzdHJ1Y3QgZ2JfYXVkaW9famFja19ldmVudF9yZXF1ZXN0ICpqYWNrX3JlcTsKKwlzdHJ1Y3QgZ2JfYXVkaW9fYnV0dG9uX2V2ZW50X3JlcXVlc3QgKmJ1dHRvbl9yZXE7CisJaW50IHJldDsKKworCXN3aXRjaCAoaGVhZGVyLT50eXBlKSB7CisJY2FzZSBHQl9BVURJT19UWVBFX1NUUkVBTUlOR19FVkVOVDoKKwkJc3RyZWFtX3JlcSA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCQlyZXQgPSBnYmF1ZGlvX3JlcXVlc3Rfc3RyZWFtKG1vZHVsZSwgc3RyZWFtX3JlcSk7CisJCWJyZWFrOworCisJY2FzZSBHQl9BVURJT19UWVBFX0pBQ0tfRVZFTlQ6CisJCWphY2tfcmVxID0gb3AtPnJlcXVlc3QtPnBheWxvYWQ7CisJCXJldCA9IGdiYXVkaW9fcmVxdWVzdF9qYWNrKG1vZHVsZSwgamFja19yZXEpOworCQlicmVhazsKKworCWNhc2UgR0JfQVVESU9fVFlQRV9CVVRUT05fRVZFTlQ6CisJCWJ1dHRvbl9yZXEgPSBvcC0+cmVxdWVzdC0+cGF5bG9hZDsKKwkJcmV0ID0gZ2JhdWRpb19yZXF1ZXN0X2J1dHRvbihtb2R1bGUsIGJ1dHRvbl9yZXEpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJCSAgICAiSW52YWxpZCBBdWRpbyBFdmVudCByZWNlaXZlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfYXVkaW9fYWRkX21nbXRfY29ubmVjdGlvbihzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqZ2Jtb2R1bGUsCisJCQkJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9jcG9ydCAqY3BvcnRfZGVzYywKKwkJCQlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKwkvKiBNYW5hZ2VtZW50IENwb3J0ICovCisJaWYgKGdibW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24pIHsKKwkJZGV2X2VycigmYnVuZGxlLT5kZXYsCisJCQkiQ2FuJ3QgaGF2ZSBtdWx0aXBsZSBNYW5hZ2VtZW50IGNvbm5lY3Rpb25zXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY29ubmVjdGlvbiA9IGdiX2Nvbm5lY3Rpb25fY3JlYXRlKGJ1bmRsZSwgbGUxNl90b19jcHUoY3BvcnRfZGVzYy0+aWQpLAorCQkJCQkgIGdiYXVkaW9fY29kZWNfcmVxdWVzdF9oYW5kbGVyKTsKKwlpZiAoSVNfRVJSKGNvbm5lY3Rpb24pKQorCQlyZXR1cm4gUFRSX0VSUihjb25uZWN0aW9uKTsKKworCWdyZXlidXNfc2V0X2RydmRhdGEoYnVuZGxlLCBnYm1vZHVsZSk7CisJZ2Jtb2R1bGUtPm1nbXRfY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9hdWRpb19hZGRfZGF0YV9jb25uZWN0aW9uKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICpnYm1vZHVsZSwKKwkJCQlzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2Nwb3J0ICpjcG9ydF9kZXNjLAorCQkJCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JhdWRpb19kYXRhX2Nvbm5lY3Rpb24gKmRhaTsKKworCWRhaSA9IGRldm1fa3phbGxvYyhnYm1vZHVsZS0+ZGV2LCBzaXplb2YoKmRhaSksIEdGUF9LRVJORUwpOworCWlmICghZGFpKSB7CisJCWRldl9lcnIoZ2Jtb2R1bGUtPmRldiwgIkRBSSBNYWxsb2MgZmFpbHVyZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNvbm5lY3Rpb24gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZV9vZmZsb2FkZWQoYnVuZGxlLAorCQkJCQlsZTE2X3RvX2NwdShjcG9ydF9kZXNjLT5pZCksCisJCQkJCUdCX0NPTk5FQ1RJT05fRkxBR19DU0QpOworCWlmIChJU19FUlIoY29ubmVjdGlvbikpIHsKKwkJZGV2bV9rZnJlZShnYm1vZHVsZS0+ZGV2LCBkYWkpOworCQlyZXR1cm4gUFRSX0VSUihjb25uZWN0aW9uKTsKKwl9CisKKwlncmV5YnVzX3NldF9kcnZkYXRhKGJ1bmRsZSwgZ2Jtb2R1bGUpOworCWRhaS0+aWQgPSAwOworCWRhaS0+ZGF0YV9jcG9ydCA9IGNvbm5lY3Rpb24tPmludGZfY3BvcnRfaWQ7CisJZGFpLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKwlsaXN0X2FkZCgmZGFpLT5saXN0LCAmZ2Jtb2R1bGUtPmRhdGFfbGlzdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGJhc2ljIGhvb2sgZ2V0IHRoaW5ncyBpbml0aWFsaXplZCBhbmQgcmVnaXN0ZXJlZCB3LyBnYgorICovCisKK3N0YXRpYyBpbnQgZ2JfYXVkaW9fcHJvYmUoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlLAorCQkJICBjb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgKmlkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZidW5kbGUtPmRldjsKKwlzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqZ2Jtb2R1bGU7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9jcG9ydCAqY3BvcnRfZGVzYzsKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfZGVzY3JpcHRvciBkZXNjOworCXN0cnVjdCBnYmF1ZGlvX2RhdGFfY29ubmVjdGlvbiAqZGFpLCAqX2RhaTsKKwlpbnQgcmV0LCBpOworCXN0cnVjdCBnYl9hdWRpb190b3BvbG9neSAqdG9wb2xvZ3k7CisKKwkvKiBUaGVyZSBzaG91bGQgYmUgYXQgbGVhc3Qgb25lIE1hbmFnZW1lbnQgYW5kIG9uZSBEYXRhIGNwb3J0ICovCisJaWYgKGJ1bmRsZS0+bnVtX2Nwb3J0cyA8IDIpCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKwkgKiBUaGVyZSBjYW4gYmUgb25seSBvbmUgTWFuYWdlbWVudCBjb25uZWN0aW9uIGFuZCBhbnkgbnVtYmVyIG9mIGRhdGEKKwkgKiBjb25uZWN0aW9ucy4KKwkgKi8KKwlnYm1vZHVsZSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZ2Jtb2R1bGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdibW9kdWxlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWdibW9kdWxlLT5udW1fZGF0YV9jb25uZWN0aW9ucyA9IGJ1bmRsZS0+bnVtX2Nwb3J0cyAtIDE7CisJSU5JVF9MSVNUX0hFQUQoJmdibW9kdWxlLT5kYXRhX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZnYm1vZHVsZS0+d2lkZ2V0X2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZnYm1vZHVsZS0+Y3RsX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZnYm1vZHVsZS0+d2lkZ2V0X2N0bF9saXN0KTsKKwlnYm1vZHVsZS0+ZGV2ID0gZGV2OworCXNucHJpbnRmKGdibW9kdWxlLT5uYW1lLCBOQU1FX1NJWkUsICIlcy4lcyIsIGRldi0+ZHJpdmVyLT5uYW1lLAorCQkgZGV2X25hbWUoZGV2KSk7CisJZ3JleWJ1c19zZXRfZHJ2ZGF0YShidW5kbGUsIGdibW9kdWxlKTsKKworCS8qIENyZWF0ZSBhbGwgY29ubmVjdGlvbnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYnVuZGxlLT5udW1fY3BvcnRzOyBpKyspIHsKKwkJY3BvcnRfZGVzYyA9ICZidW5kbGUtPmNwb3J0X2Rlc2NbaV07CisKKwkJc3dpdGNoIChjcG9ydF9kZXNjLT5wcm90b2NvbF9pZCkgeworCQljYXNlIEdSRVlCVVNfUFJPVE9DT0xfQVVESU9fTUdNVDoKKwkJCXJldCA9IGdiX2F1ZGlvX2FkZF9tZ210X2Nvbm5lY3Rpb24oZ2Jtb2R1bGUsIGNwb3J0X2Rlc2MsCisJCQkJCQkJICAgYnVuZGxlKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBkZXN0cm95X2Nvbm5lY3Rpb25zOworCQkJYnJlYWs7CisJCWNhc2UgR1JFWUJVU19QUk9UT0NPTF9BVURJT19EQVRBOgorCQkJcmV0ID0gZ2JfYXVkaW9fYWRkX2RhdGFfY29ubmVjdGlvbihnYm1vZHVsZSwgY3BvcnRfZGVzYywKKwkJCQkJCQkgICBidW5kbGUpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGRlc3Ryb3lfY29ubmVjdGlvbnM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoZGV2LCAiVW5zdXBwb3J0ZWQgcHJvdG9jb2w6IDB4JTAyeFxuIiwKKwkJCQljcG9ydF9kZXNjLT5wcm90b2NvbF9pZCk7CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBkZXN0cm95X2Nvbm5lY3Rpb25zOworCQl9CisJfQorCisJLyogVGhlcmUgbXVzdCBiZSBhIG1hbmFnZW1lbnQgY3BvcnQgKi8KKwlpZiAoIWdibW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24pIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZGV2X2VycihkZXYsICJNaXNzaW5nIG1hbmFnZW1lbnQgY29ubmVjdGlvblxuIik7CisJCWdvdG8gZGVzdHJveV9jb25uZWN0aW9uczsKKwl9CisKKwkvKiBJbml0aWFsaXplIG1hbmFnZW1lbnQgY29ubmVjdGlvbiAqLworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGdibW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICIlZDogRXJyb3Igd2hpbGUgZW5hYmxpbmcgbWdtdCBjb25uZWN0aW9uXG4iLCByZXQpOworCQlnb3RvIGRlc3Ryb3lfY29ubmVjdGlvbnM7CisJfQorCWdibW9kdWxlLT5kZXZfaWQgPSBnYm1vZHVsZS0+bWdtdF9jb25uZWN0aW9uLT5pbnRmLT5pbnRlcmZhY2VfaWQ7CisKKwkvKgorCSAqIEZJWE1FOiBtYWxsb2MgZm9yIHRvcG9sb2d5IGhhcHBlbnMgdmlhIGF1ZGlvX2diIGRyaXZlcgorCSAqIHNob3VsZCBiZSBkb25lIHdpdGhpbiBjb2RlYyBkcml2ZXIgaXRzZWxmCisJICovCisJcmV0ID0gZ2JfYXVkaW9fZ2JfZ2V0X3RvcG9sb2d5KGdibW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24sICZ0b3BvbG9neSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIiVkOkVycm9yIHdoaWxlIGZldGNoaW5nIHRvcG9sb2d5XG4iLCByZXQpOworCQlnb3RvIGRpc2FibGVfY29ubmVjdGlvbjsKKwl9CisKKwkvKiBwcm9jZXNzIHRvcG9sb2d5IGRhdGEgKi8KKwlyZXQgPSBnYmF1ZGlvX3RwbGdfcGFyc2VfZGF0YShnYm1vZHVsZSwgdG9wb2xvZ3kpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICIlZDpFcnJvciB3aGlsZSBwYXJzaW5nIHRvcG9sb2d5IGRhdGFcbiIsCisJCQkgIHJldCk7CisJCWdvdG8gZnJlZV90b3BvbG9neTsKKwl9CisJZ2Jtb2R1bGUtPnRvcG9sb2d5ID0gdG9wb2xvZ3k7CisKKwkvKiBJbml0aWFsaXplIGRhdGEgY29ubmVjdGlvbnMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRhaSwgJmdibW9kdWxlLT5kYXRhX2xpc3QsIGxpc3QpIHsKKwkJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoZGFpLT5jb25uZWN0aW9uKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsCisJCQkJIiVkOkVycm9yIHdoaWxlIGVuYWJsaW5nICVkOmRhdGEgY29ubmVjdGlvblxuIiwKKwkJCQlyZXQsIGRhaS0+ZGF0YV9jcG9ydCk7CisJCQlnb3RvIGRpc2FibGVfZGF0YV9jb25uZWN0aW9uOworCQl9CisJfQorCisJLyogcmVnaXN0ZXIgbW9kdWxlIHdpdGggZ2Jjb2RlYyAqLworCXJldCA9IGdiYXVkaW9fcmVnaXN0ZXJfbW9kdWxlKGdibW9kdWxlKTsKKwlpZiAocmV0KQorCQlnb3RvIGRpc2FibGVfZGF0YV9jb25uZWN0aW9uOworCisJLyogaW5mb3JtIGFib3ZlIGxheWVyIGZvciB1ZXZlbnQgKi8KKwlkZXZfZGJnKGRldiwgIkluZm9ybSBzZXRfZXZlbnQ6JWQgdG8gYWJvdmUgbGF5ZXJcbiIsIDEpOworCS8qIHByZXBhcmUgZm9yIHRoZSBhdWRpbyBtYW5hZ2VyICovCisJc3RybGNweShkZXNjLm5hbWUsIGdibW9kdWxlLT5uYW1lLCBHQl9BVURJT19NQU5BR0VSX01PRFVMRV9OQU1FX0xFTik7CisJZGVzYy5zbG90ID0gMTsgLyogdG9kbyAqLworCWRlc2MudmlkID0gMjsgLyogdG9kbyAqLworCWRlc2MucGlkID0gMzsgLyogdG9kbyAqLworCWRlc2MuY3BvcnQgPSBnYm1vZHVsZS0+ZGV2X2lkOworCWRlc2Mub3BfZGV2aWNlcyA9IGdibW9kdWxlLT5vcF9kZXZpY2VzOworCWRlc2MuaXBfZGV2aWNlcyA9IGdibW9kdWxlLT5pcF9kZXZpY2VzOworCWdibW9kdWxlLT5tYW5hZ2VyX2lkID0gZ2JfYXVkaW9fbWFuYWdlcl9hZGQoJmRlc2MpOworCisJZGV2X2RiZyhkZXYsICJBZGQgR0IgQXVkaW8gZGV2aWNlOiVzXG4iLCBnYm1vZHVsZS0+bmFtZSk7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCisJcmV0dXJuIDA7CisKK2Rpc2FibGVfZGF0YV9jb25uZWN0aW9uOgorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkYWksIF9kYWksICZnYm1vZHVsZS0+ZGF0YV9saXN0LCBsaXN0KQorCQlnYl9jb25uZWN0aW9uX2Rpc2FibGUoZGFpLT5jb25uZWN0aW9uKTsKKwlnYmF1ZGlvX3RwbGdfcmVsZWFzZShnYm1vZHVsZSk7CisJZ2Jtb2R1bGUtPnRvcG9sb2d5ID0gTlVMTDsKKworZnJlZV90b3BvbG9neToKKwlrZnJlZSh0b3BvbG9neSk7CisKK2Rpc2FibGVfY29ubmVjdGlvbjoKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoZ2Jtb2R1bGUtPm1nbXRfY29ubmVjdGlvbik7CisKK2Rlc3Ryb3lfY29ubmVjdGlvbnM6CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRhaSwgX2RhaSwgJmdibW9kdWxlLT5kYXRhX2xpc3QsIGxpc3QpIHsKKwkJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGRhaS0+Y29ubmVjdGlvbik7CisJCWxpc3RfZGVsKCZkYWktPmxpc3QpOworCQlkZXZtX2tmcmVlKGRldiwgZGFpKTsKKwl9CisKKwlpZiAoZ2Jtb2R1bGUtPm1nbXRfY29ubmVjdGlvbikKKwkJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGdibW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24pOworCisJZGV2bV9rZnJlZShkZXYsIGdibW9kdWxlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2F1ZGlvX2Rpc2Nvbm5lY3Qoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKQoreworCXN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICpnYm1vZHVsZSA9IGdyZXlidXNfZ2V0X2RydmRhdGEoYnVuZGxlKTsKKwlzdHJ1Y3QgZ2JhdWRpb19kYXRhX2Nvbm5lY3Rpb24gKmRhaSwgKl9kYWk7CisKKwlnYl9wbV9ydW50aW1lX2dldF9zeW5jKGJ1bmRsZSk7CisKKwkvKiBjbGVhbnVwIG1vZHVsZSByZWxhdGVkIHJlc291cmNlcyBmaXJzdCAqLworCWdiYXVkaW9fdW5yZWdpc3Rlcl9tb2R1bGUoZ2Jtb2R1bGUpOworCisJLyogaW5mb3JtIHVldmVudCB0byBhYm92ZSBsYXllcnMgKi8KKwlnYl9hdWRpb19tYW5hZ2VyX3JlbW92ZShnYm1vZHVsZS0+bWFuYWdlcl9pZCk7CisKKwlnYmF1ZGlvX3RwbGdfcmVsZWFzZShnYm1vZHVsZSk7CisJa2ZyZWUoZ2Jtb2R1bGUtPnRvcG9sb2d5KTsKKwlnYm1vZHVsZS0+dG9wb2xvZ3kgPSBOVUxMOworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShnYm1vZHVsZS0+bWdtdF9jb25uZWN0aW9uKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGFpLCBfZGFpLCAmZ2Jtb2R1bGUtPmRhdGFfbGlzdCwgbGlzdCkgeworCQlnYl9jb25uZWN0aW9uX2Rpc2FibGUoZGFpLT5jb25uZWN0aW9uKTsKKwkJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGRhaS0+Y29ubmVjdGlvbik7CisJCWxpc3RfZGVsKCZkYWktPmxpc3QpOworCQlkZXZtX2tmcmVlKGdibW9kdWxlLT5kZXYsIGRhaSk7CisJfQorCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShnYm1vZHVsZS0+bWdtdF9jb25uZWN0aW9uKTsKKwlnYm1vZHVsZS0+bWdtdF9jb25uZWN0aW9uID0gTlVMTDsKKworCWRldm1fa2ZyZWUoJmJ1bmRsZS0+ZGV2LCBnYm1vZHVsZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgZ2JfYXVkaW9faWRfdGFibGVbXSA9IHsKKwl7IEdSRVlCVVNfREVWSUNFX0NMQVNTKEdSRVlCVVNfQ0xBU1NfQVVESU8pIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShncmV5YnVzLCBnYl9hdWRpb19pZF90YWJsZSk7CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgZ2JfYXVkaW9fc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlID0gdG9fZ2JfYnVuZGxlKGRldik7CisJc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKmdibW9kdWxlID0gZ3JleWJ1c19nZXRfZHJ2ZGF0YShidW5kbGUpOworCXN0cnVjdCBnYmF1ZGlvX2RhdGFfY29ubmVjdGlvbiAqZGFpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkYWksICZnYm1vZHVsZS0+ZGF0YV9saXN0LCBsaXN0KQorCQlnYl9jb25uZWN0aW9uX2Rpc2FibGUoZGFpLT5jb25uZWN0aW9uKTsKKworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShnYm1vZHVsZS0+bWdtdF9jb25uZWN0aW9uKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2F1ZGlvX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlID0gdG9fZ2JfYnVuZGxlKGRldik7CisJc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKmdibW9kdWxlID0gZ3JleWJ1c19nZXRfZHJ2ZGF0YShidW5kbGUpOworCXN0cnVjdCBnYmF1ZGlvX2RhdGFfY29ubmVjdGlvbiAqZGFpOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9jb25uZWN0aW9uX2VuYWJsZShnYm1vZHVsZS0+bWdtdF9jb25uZWN0aW9uKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiJWQ6RXJyb3Igd2hpbGUgZW5hYmxpbmcgbWdtdCBjb25uZWN0aW9uXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGFpLCAmZ2Jtb2R1bGUtPmRhdGFfbGlzdCwgbGlzdCkgeworCQlyZXQgPSBnYl9jb25uZWN0aW9uX2VuYWJsZShkYWktPmNvbm5lY3Rpb24pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwKKwkJCQkiJWQ6RXJyb3Igd2hpbGUgZW5hYmxpbmcgJWQ6ZGF0YSBjb25uZWN0aW9uXG4iLAorCQkJCXJldCwgZGFpLT5kYXRhX2Nwb3J0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgZ2JfYXVkaW9fcG1fb3BzID0geworCVNFVF9SVU5USU1FX1BNX09QUyhnYl9hdWRpb19zdXNwZW5kLCBnYl9hdWRpb19yZXN1bWUsIE5VTEwpCit9OworCitzdGF0aWMgc3RydWN0IGdyZXlidXNfZHJpdmVyIGdiX2F1ZGlvX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZ2ItYXVkaW8iLAorCS5wcm9iZQkJPSBnYl9hdWRpb19wcm9iZSwKKwkuZGlzY29ubmVjdAk9IGdiX2F1ZGlvX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gZ2JfYXVkaW9faWRfdGFibGUsCisJLmRyaXZlci5wbQk9ICZnYl9hdWRpb19wbV9vcHMsCit9OworbW9kdWxlX2dyZXlidXNfZHJpdmVyKGdiX2F1ZGlvX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiR3JleWJ1cyBBdWRpbyBtb2R1bGUgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJWYWliaGF2IEFnYXJ3YWwgPHZhaWJoYXYuYWdhcndhbEBsaW5hcm8ub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpnYmF1ZGlvLW1vZHVsZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fdG9wb2xvZ3kuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX3RvcG9sb2d5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYyNTE2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX3RvcG9sb2d5LmMKQEAgLTAsMCArMSwxNDQzIEBACisvKgorICogR3JleWJ1cyBhdWRpbyBkcml2ZXIKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1LTIwMTYgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSAiYXVkaW9fY29kZWMuaCIKKyNpbmNsdWRlICJncmV5YnVzX3Byb3RvY29scy5oIgorCisjZGVmaW5lIEdCQVVESU9fSU5WQUxJRF9JRAkweEZGCisKKy8qIG1peGVyIGNvbnRyb2wgKi8KK3N0cnVjdCBnYl9taXhlcl9jb250cm9sIHsKKwlpbnQgbWluLCBtYXg7CisJdW5zaWduZWQgaW50IHJlZywgcnJlZywgc2hpZnQsIHJzaGlmdCwgaW52ZXJ0OworfTsKKworc3RydWN0IGdiYXVkaW9fY3RsX3B2dCB7CisJdW5zaWduZWQgaW50IGN0bF9pZDsKKwl1bnNpZ25lZCBpbnQgZGF0YV9jcG9ydDsKKwl1bnNpZ25lZCBpbnQgYWNjZXNzOworCXVuc2lnbmVkIGludCB2Y291bnQ7CisJc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX2luZm8gKmluZm87Cit9OworCitzdGF0aWMgc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKmZpbmRfZ2JfbW9kdWxlKAorCQkJCQlzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvICpjb2RlYywKKwkJCQkJY2hhciBjb25zdCAqbmFtZSkKK3sKKwlpbnQgZGV2X2lkLCByZXQ7CisJY2hhciBiZWdpbltOQU1FX1NJWkVdOworCXN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGU7CisKKwlpZiAoIW5hbWUpCisJCXJldHVybiBOVUxMOworCisJcmV0ID0gc3NjYW5mKG5hbWUsICIlcyAlZCIsIGJlZ2luLCAmZGV2X2lkKTsKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczpGaW5kIG1vZHVsZSMlZFxuIiwgX19mdW5jX18sIGRldl9pZCk7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2R1bGUsICZjb2RlYy0+bW9kdWxlX2xpc3QsIGxpc3QpIHsKKwkJaWYgKG1vZHVsZS0+ZGV2X2lkID09IGRldl9pZCkgeworCQkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bG9jayk7CisJCQlyZXR1cm4gbW9kdWxlOworCQl9CisJfQorCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCWRldl93YXJuKGNvZGVjLT5kZXYsICIlczogbW9kdWxlIyVkIG1pc3NpbmcgaW4gY29kZWMgbGlzdFxuIiwgbmFtZSwKKwkJIGRldl9pZCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpnYmF1ZGlvX21hcF9jb250cm9saWQoc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSwKKwkJCQkJIF9fdTggY29udHJvbF9pZCwgX191OCBpbmRleCkKK3sKKwlzdHJ1Y3QgZ2JhdWRpb19jb250cm9sICpjb250cm9sOworCisJaWYgKGNvbnRyb2xfaWQgPT0gR0JBVURJT19JTlZBTElEX0lEKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29udHJvbCwgJm1vZHVsZS0+Y3RsX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGNvbnRyb2wtPmlkID09IGNvbnRyb2xfaWQpIHsKKwkJCWlmIChpbmRleCA9PSBHQkFVRElPX0lOVkFMSURfSUQpCisJCQkJcmV0dXJuIGNvbnRyb2wtPm5hbWU7CisJCQlpZiAoaW5kZXggPj0gY29udHJvbC0+aXRlbXMpCisJCQkJcmV0dXJuIE5VTEw7CisJCQlyZXR1cm4gY29udHJvbC0+dGV4dHNbaW5kZXhdOworCQl9CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkoY29udHJvbCwgJm1vZHVsZS0+d2lkZ2V0X2N0bF9saXN0LCBsaXN0KSB7CisJCWlmIChjb250cm9sLT5pZCA9PSBjb250cm9sX2lkKSB7CisJCQlpZiAoaW5kZXggPT0gR0JBVURJT19JTlZBTElEX0lEKQorCQkJCXJldHVybiBjb250cm9sLT5uYW1lOworCQkJaWYgKGluZGV4ID49IGNvbnRyb2wtPml0ZW1zKQorCQkJCXJldHVybiBOVUxMOworCQkJcmV0dXJuIGNvbnRyb2wtPnRleHRzW2luZGV4XTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX21hcF9jb250cm9sbmFtZShzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlLAorCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGdiYXVkaW9fY29udHJvbCAqY29udHJvbDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29udHJvbCwgJm1vZHVsZS0+Y3RsX2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFzdHJuY21wKGNvbnRyb2wtPm5hbWUsIG5hbWUsIE5BTUVfU0laRSkpCisJCQlyZXR1cm4gY29udHJvbC0+aWQ7CisJfQorCisJZGV2X3dhcm4obW9kdWxlLT5kZXYsICIlczogbWlzc2luZyBpbiBtb2R1bGVzIGNvbnRyb2xzIGxpc3RcbiIsIG5hbWUpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgZ2JhdWRpb19tYXBfd2NvbnRyb2xuYW1lKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUsCisJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGdiYXVkaW9fY29udHJvbCAqY29udHJvbDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29udHJvbCwgJm1vZHVsZS0+d2lkZ2V0X2N0bF9saXN0LCBsaXN0KSB7CisJCWlmICghc3RybmNtcChjb250cm9sLT53bmFtZSwgbmFtZSwgTkFNRV9TSVpFKSkKKwkJCXJldHVybiBjb250cm9sLT5pZDsKKwl9CisJZGV2X3dhcm4obW9kdWxlLT5kZXYsICIlczogbWlzc2luZyBpbiBtb2R1bGVzIGNvbnRyb2xzIGxpc3RcbiIsIG5hbWUpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgZ2JhdWRpb19tYXBfd2lkZ2V0bmFtZShzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlLAorCQkJCSAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZ2JhdWRpb193aWRnZXQgKndpZGdldDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdpZGdldCwgJm1vZHVsZS0+d2lkZ2V0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFzdHJuY21wKHdpZGdldC0+bmFtZSwgbmFtZSwgTkFNRV9TSVpFKSkKKwkJCXJldHVybiB3aWRnZXQtPmlkOworCX0KKwlkZXZfd2Fybihtb2R1bGUtPmRldiwgIiVzOiBtaXNzaW5nIGluIG1vZHVsZXMgd2lkZ2V0cyBsaXN0XG4iLCBuYW1lKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2JhdWRpb19tYXBfd2lkZ2V0aWQoc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSwKKwkJCQkJX191OCB3aWRnZXRfaWQpCit7CisJc3RydWN0IGdiYXVkaW9fd2lkZ2V0ICp3aWRnZXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdpZGdldCwgJm1vZHVsZS0+d2lkZ2V0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKHdpZGdldC0+aWQgPT0gd2lkZ2V0X2lkKQorCQkJcmV0dXJuIHdpZGdldC0+bmFtZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoqZ2JfZ2VuZXJhdGVfZW51bV9zdHJpbmdzKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICpnYiwKKwkJCQkJICAgICBzdHJ1Y3QgZ2JfYXVkaW9fZW51bWVyYXRlZCAqZ2JlbnVtKQoreworCWNvbnN0IGNoYXIgKipzdHJpbmdzOworCWludCBpOworCV9fdTggKmRhdGE7CisKKwlzdHJpbmdzID0gZGV2bV9remFsbG9jKGdiLT5kZXYsIHNpemVvZihjaGFyICopICogZ2JlbnVtLT5pdGVtcywKKwkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlkYXRhID0gZ2JlbnVtLT5uYW1lczsKKworCWZvciAoaSA9IDA7IGkgPCBnYmVudW0tPml0ZW1zOyBpKyspIHsKKwkJc3RyaW5nc1tpXSA9IChjb25zdCBjaGFyICopZGF0YTsKKwkJd2hpbGUgKCpkYXRhICE9ICdcMCcpCisJCQlkYXRhKys7CisJCWRhdGErKzsKKwl9CisKKwlyZXR1cm4gc3RyaW5nczsKK30KKworc3RhdGljIGludCBnYmNvZGVjX21peGVyX2N0bF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdW5zaWduZWQgaW50IG1heDsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBnYmF1ZGlvX2N0bF9wdnQgKmRhdGE7CisJc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX2luZm8gKmluZm87CisJc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyAqZ2Jjb2RlYyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRW50ZXJlZCAlczolc1xuIiwgX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwlkYXRhID0gKHN0cnVjdCBnYmF1ZGlvX2N0bF9wdnQgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlpbmZvID0gKHN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV9pbmZvICopZGF0YS0+aW5mbzsKKworCWlmICghaW5mbykgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJOVUxMIGluZm8gZm9yICVzXG4iLCB1aW5mby0+aWQubmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHVwZGF0ZSB1aW5mbyAqLworCXVpbmZvLT5hY2Nlc3MgPSBkYXRhLT5hY2Nlc3M7CisJdWluZm8tPmNvdW50ID0gZGF0YS0+dmNvdW50OworCXVpbmZvLT50eXBlID0gKHNuZF9jdGxfZWxlbV90eXBlX3QpaW5mby0+dHlwZTsKKworCXN3aXRjaCAoaW5mby0+dHlwZSkgeworCWNhc2UgR0JfQVVESU9fQ1RMX0VMRU1fVFlQRV9CT09MRUFOOgorCWNhc2UgR0JfQVVESU9fQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOgorCQl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSBpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbjsKKwkJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gaW5mby0+dmFsdWUuaW50ZWdlci5tYXg7CisJCWJyZWFrOworCWNhc2UgR0JfQVVESU9fQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOgorCQltYXggPSBpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zOworCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IG1heDsKKwkJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiBtYXggLSAxKQorCQkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IG1heCAtIDE7CisJCW1vZHVsZSA9IGZpbmRfZ2JfbW9kdWxlKGdiY29kZWMsIGtjb250cm9sLT5pZC5uYW1lKTsKKwkJaWYgKCFtb2R1bGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbmFtZSA9IGdiYXVkaW9fbWFwX2NvbnRyb2xpZChtb2R1bGUsIGRhdGEtPmN0bF9pZCwKKwkJCQkJICAgICB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtKTsKKwkJc3RybGNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCBuYW1lLCBOQU1FX1NJWkUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbnZhbGlkIHR5cGU6ICVkIGZvciAlczprY29udHJvbFxuIiwKKwkJCWluZm8tPnR5cGUsIGtjb250cm9sLT5pZC5uYW1lKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiY29kZWNfbWl4ZXJfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV9pbmZvICppbmZvOworCXN0cnVjdCBnYmF1ZGlvX2N0bF9wdnQgKmRhdGE7CisJc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX3ZhbHVlIGdidmFsdWU7CisJc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyAqZ2IgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGU7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJFbnRlcmVkICVzOiVzXG4iLCBfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCW1vZHVsZSA9IGZpbmRfZ2JfbW9kdWxlKGdiLCBrY29udHJvbC0+aWQubmFtZSk7CisJaWYgKCFtb2R1bGUpCisJCXJldHVybiAtRUlOVkFMOworCisJZGF0YSA9IChzdHJ1Y3QgZ2JhdWRpb19jdGxfcHZ0ICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJaW5mbyA9IChzdHJ1Y3QgZ2JfYXVkaW9fY3RsX2VsZW1faW5mbyAqKWRhdGEtPmluZm87CisJYnVuZGxlID0gdG9fZ2JfYnVuZGxlKG1vZHVsZS0+ZGV2KTsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2JfYXVkaW9fZ2JfZ2V0X2NvbnRyb2wobW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24sIGRhdGEtPmN0bF9pZCwKKwkJCQkgICAgICBHQl9BVURJT19JTlZBTElEX0lOREVYLCAmZ2J2YWx1ZSk7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGNvZGVjLT5kZXYsICIlZDpFcnJvciBpbiAlcyBmb3IgJXNcbiIsIHJldCwKKwkJCQkgICAgX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiB1cGRhdGUgdWNvbnRyb2wgKi8KKwlzd2l0Y2ggKGluZm8tPnR5cGUpIHsKKwljYXNlIEdCX0FVRElPX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjoKKwljYXNlIEdCX0FVRElPX0NUTF9FTEVNX1RZUEVfSU5URUdFUjoKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQorCQkJZ2J2YWx1ZS52YWx1ZS5pbnRlZ2VyX3ZhbHVlWzBdOworCQlpZiAoZGF0YS0+dmNvdW50ID09IDIpCisJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9CisJCQkJZ2J2YWx1ZS52YWx1ZS5pbnRlZ2VyX3ZhbHVlWzFdOworCQlicmVhazsKKwljYXNlIEdCX0FVRElPX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDoKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJCQlnYnZhbHVlLnZhbHVlLmVudW1lcmF0ZWRfaXRlbVswXTsKKwkJaWYgKGRhdGEtPnZjb3VudCA9PSAyKQorCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA9CisJCQkJZ2J2YWx1ZS52YWx1ZS5lbnVtZXJhdGVkX2l0ZW1bMV07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgdHlwZTogJWQgZm9yICVzOmtjb250cm9sXG4iLAorCQkJaW5mby0+dHlwZSwga2NvbnRyb2wtPmlkLm5hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYmNvZGVjX21peGVyX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZ2JfYXVkaW9fY3RsX2VsZW1faW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZ2JhdWRpb19jdGxfcHZ0ICpkYXRhOworCXN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV92YWx1ZSBnYnZhbHVlOworCXN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGU7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBnYmF1ZGlvX2NvZGVjX2luZm8gKmdiID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRW50ZXJlZCAlczolc1xuIiwgX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwltb2R1bGUgPSBmaW5kX2diX21vZHVsZShnYiwga2NvbnRyb2wtPmlkLm5hbWUpOworCWlmICghbW9kdWxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRhdGEgPSAoc3RydWN0IGdiYXVkaW9fY3RsX3B2dCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWluZm8gPSAoc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX2luZm8gKilkYXRhLT5pbmZvOworCWJ1bmRsZSA9IHRvX2diX2J1bmRsZShtb2R1bGUtPmRldik7CisKKwkvKiB1cGRhdGUgdWNvbnRyb2wgKi8KKwlzd2l0Y2ggKGluZm8tPnR5cGUpIHsKKwljYXNlIEdCX0FVRElPX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjoKKwljYXNlIEdCX0FVRElPX0NUTF9FTEVNX1RZUEVfSU5URUdFUjoKKwkJZ2J2YWx1ZS52YWx1ZS5pbnRlZ2VyX3ZhbHVlWzBdID0KKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCQlpZiAoZGF0YS0+dmNvdW50ID09IDIpCisJCQlnYnZhbHVlLnZhbHVlLmludGVnZXJfdmFsdWVbMV0gPQorCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCQlicmVhazsKKwljYXNlIEdCX0FVRElPX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDoKKwkJZ2J2YWx1ZS52YWx1ZS5lbnVtZXJhdGVkX2l0ZW1bMF0gPQorCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwkJaWYgKGRhdGEtPnZjb3VudCA9PSAyKQorCQkJZ2J2YWx1ZS52YWx1ZS5lbnVtZXJhdGVkX2l0ZW1bMV0gPQorCQkJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgdHlwZTogJWQgZm9yICVzOmtjb250cm9sXG4iLAorCQkJaW5mby0+dHlwZSwga2NvbnRyb2wtPmlkLm5hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9hdWRpb19nYl9zZXRfY29udHJvbChtb2R1bGUtPm1nbXRfY29ubmVjdGlvbiwgZGF0YS0+Y3RsX2lkLAorCQkJCSAgICAgIEdCX0FVRElPX0lOVkFMSURfSU5ERVgsICZnYnZhbHVlKTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKKwlpZiAocmV0KSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoY29kZWMtPmRldiwgIiVkOkVycm9yIGluICVzIGZvciAlc1xuIiwgcmV0LAorCQkJCSAgICBfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgU09DX01JWEVSX0dCKHhuYW1lLCBrY291bnQsIGRhdGEpIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKwkuY291bnQgPSBrY291bnQsIC5pbmZvID0gZ2Jjb2RlY19taXhlcl9jdGxfaW5mbywgXAorCS5nZXQgPSBnYmNvZGVjX21peGVyX2N0bF9nZXQsIC5wdXQgPSBnYmNvZGVjX21peGVyX2N0bF9wdXQsIFwKKwkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKWRhdGEgfQorCisvKgorICogYWx0aG91Z2ggYmVsb3cgY2FsbGJhY2sgZnVuY3Rpb25zIHNlZW1zIHJlZHVuZGFudCB0byBhYm92ZSBmdW5jdGlvbnMuCisgKiBzYW1lIGFyZSBrZXB0IHRvIGFsbG93IHByb3Zpc2lvbiBmb3IgZGlmZmVyZW50IGhhbmRsaW5nIGluIGNhc2UKKyAqIG9mIERBUE0gcmVsYXRlZCBzZXF1ZW5jaW5nLCBldGMuCisgKi8KK3N0YXRpYyBpbnQgZ2Jjb2RlY19taXhlcl9kYXBtX2N0bF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJaW50IHBsYXRmb3JtX21heCwgcGxhdGZvcm1fbWluOworCXN0cnVjdCBnYmF1ZGlvX2N0bF9wdnQgKmRhdGE7CisJc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX2luZm8gKmluZm87CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHdpZGdldC0+Y29kZWM7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJFbnRlcmVkICVzOiVzXG4iLCBfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCWRhdGEgPSAoc3RydWN0IGdiYXVkaW9fY3RsX3B2dCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWluZm8gPSAoc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX2luZm8gKilkYXRhLT5pbmZvOworCisJLyogdXBkYXRlIHVpbmZvICovCisJcGxhdGZvcm1fbWF4ID0gaW5mby0+dmFsdWUuaW50ZWdlci5tYXg7CisJcGxhdGZvcm1fbWluID0gaW5mby0+dmFsdWUuaW50ZWdlci5taW47CisKKwlpZiAocGxhdGZvcm1fbWF4ID09IDEgJiYKKwkgICAgIXN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICIgVm9sdW1lIiwgTkFNRV9TSVpFKSkKKwkJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJZWxzZQorCQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKworCXVpbmZvLT5jb3VudCA9IGRhdGEtPnZjb3VudDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCWlmIChpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA8IDAgJiYKKwkgICAgKHVpbmZvLT50eXBlID09IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUikpCisJCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IHBsYXRmb3JtX21heCAtIHBsYXRmb3JtX21pbjsKKwllbHNlCisJCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IHBsYXRmb3JtX21heDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiY29kZWNfbWl4ZXJfZGFwbV9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCByZXQ7CisJc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX2luZm8gKmluZm87CisJc3RydWN0IGdiYXVkaW9fY3RsX3B2dCAqZGF0YTsKKwlzdHJ1Y3QgZ2JfYXVkaW9fY3RsX2VsZW1fdmFsdWUgZ2J2YWx1ZTsKKwlzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0X2xpc3QgKndsaXN0ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSB3bGlzdC0+d2lkZ2V0c1swXTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3aWRnZXQtPmNvZGVjOworCXN0cnVjdCBnYmF1ZGlvX2NvZGVjX2luZm8gKmdiID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRW50ZXJlZCAlczolc1xuIiwgX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwltb2R1bGUgPSBmaW5kX2diX21vZHVsZShnYiwga2NvbnRyb2wtPmlkLm5hbWUpOworCWlmICghbW9kdWxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRhdGEgPSAoc3RydWN0IGdiYXVkaW9fY3RsX3B2dCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWluZm8gPSAoc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX2luZm8gKilkYXRhLT5pbmZvOworCWJ1bmRsZSA9IHRvX2diX2J1bmRsZShtb2R1bGUtPmRldik7CisKKwlpZiAoZGF0YS0+dmNvdW50ID09IDIpCisJCWRldl93YXJuKHdpZGdldC0+ZGFwbS0+ZGV2LAorCQkJICJHQjogQ29udHJvbCAnJXMnIGlzIHN0ZXJlbywgd2hpY2ggaXMgbm90IHN1cHBvcnRlZFxuIiwKKwkJCSBrY29udHJvbC0+aWQubmFtZSk7CisKKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGJ1bmRsZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdiX2F1ZGlvX2diX2dldF9jb250cm9sKG1vZHVsZS0+bWdtdF9jb25uZWN0aW9uLCBkYXRhLT5jdGxfaWQsCisJCQkJICAgICAgR0JfQVVESU9fSU5WQUxJRF9JTkRFWCwgJmdidmFsdWUpOworCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKworCWlmIChyZXQpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChjb2RlYy0+ZGV2LCAiJWQ6RXJyb3IgaW4gJXMgZm9yICVzXG4iLCByZXQsCisJCQkJICAgIF9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCS8qIHVwZGF0ZSB1Y29udHJvbCAqLworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gZ2J2YWx1ZS52YWx1ZS5pbnRlZ2VyX3ZhbHVlWzBdOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYmNvZGVjX21peGVyX2RhcG1fY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCByZXQsIHdpLCBtYXgsIGNvbm5lY3Q7CisJdW5zaWduZWQgaW50IG1hc2ssIHZhbDsKKwlzdHJ1Y3QgZ2JfYXVkaW9fY3RsX2VsZW1faW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZ2JhdWRpb19jdGxfcHZ0ICpkYXRhOworCXN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV92YWx1ZSBnYnZhbHVlOworCXN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGU7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHdpZGdldC0+Y29kZWM7CisJc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyAqZ2IgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGU7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJFbnRlcmVkICVzOiVzXG4iLCBfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCW1vZHVsZSA9IGZpbmRfZ2JfbW9kdWxlKGdiLCBrY29udHJvbC0+aWQubmFtZSk7CisJaWYgKCFtb2R1bGUpCisJCXJldHVybiAtRUlOVkFMOworCisJZGF0YSA9IChzdHJ1Y3QgZ2JhdWRpb19jdGxfcHZ0ICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJaW5mbyA9IChzdHJ1Y3QgZ2JfYXVkaW9fY3RsX2VsZW1faW5mbyAqKWRhdGEtPmluZm87CisJYnVuZGxlID0gdG9fZ2JfYnVuZGxlKG1vZHVsZS0+ZGV2KTsKKworCWlmIChkYXRhLT52Y291bnQgPT0gMikKKwkJZGV2X3dhcm4od2lkZ2V0LT5kYXBtLT5kZXYsCisJCQkgIkdCOiBDb250cm9sICclcycgaXMgc3RlcmVvLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkXG4iLAorCQkJIGtjb250cm9sLT5pZC5uYW1lKTsKKworCW1heCA9IGluZm8tPnZhbHVlLmludGVnZXIubWF4OworCW1hc2sgPSAoMSA8PCBmbHMobWF4KSkgLSAxOworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzazsKKwljb25uZWN0ID0gISF2YWw7CisKKwkvKiB1cGRhdGUgdWNvbnRyb2wgKi8KKwlpZiAoZ2J2YWx1ZS52YWx1ZS5pbnRlZ2VyX3ZhbHVlWzBdICE9IHZhbCkgeworCQlmb3IgKHdpID0gMDsgd2kgPCB3bGlzdC0+bnVtX3dpZGdldHM7IHdpKyspIHsKKwkJCXdpZGdldCA9IHdsaXN0LT53aWRnZXRzW3dpXTsKKworCQkJd2lkZ2V0LT52YWx1ZSA9IHZhbDsKKwkJCXdpZGdldC0+ZGFwbS0+dXBkYXRlID0gTlVMTDsKKwkJCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LCBrY29udHJvbCwKKwkJCQkJCQljb25uZWN0KTsKKwkJfQorCQlnYnZhbHVlLnZhbHVlLmludGVnZXJfdmFsdWVbMF0gPQorCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwkJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBnYl9hdWRpb19nYl9zZXRfY29udHJvbChtb2R1bGUtPm1nbXRfY29ubmVjdGlvbiwKKwkJCQkJICAgICAgZGF0YS0+Y3RsX2lkLAorCQkJCQkgICAgICBHQl9BVURJT19JTlZBTElEX0lOREVYLCAmZ2J2YWx1ZSk7CisKKwkJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGNvZGVjLT5kZXYsCisJCQkJCSAgICAiJWQ6RXJyb3IgaW4gJXMgZm9yICVzXG4iLCByZXQsCisJCQkJCSAgICBfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFNPQ19EQVBNX01JWEVSX0dCKHhuYW1lLCBrY291bnQsIGRhdGEpIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKwkuY291bnQgPSBrY291bnQsIC5pbmZvID0gZ2Jjb2RlY19taXhlcl9kYXBtX2N0bF9pbmZvLCBcCisJLmdldCA9IGdiY29kZWNfbWl4ZXJfZGFwbV9jdGxfZ2V0LCAucHV0ID0gZ2Jjb2RlY19taXhlcl9kYXBtX2N0bF9wdXQsIFwKKwkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKWRhdGF9CisKK3N0YXRpYyBpbnQgZ2Jjb2RlY19ldmVudF9zcGsoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmssIGludCBldmVudCkKK3sKKwkvKiBFbnN1cmUgR0Igc3BlYWtlciBpcyBjb25uZWN0ZWQgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiY29kZWNfZXZlbnRfaHAoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmssIGludCBldmVudCkKK3sKKwkvKiBFbnN1cmUgR0IgbW9kdWxlIHN1cHBvcnRzIGphY2sgc2xvdCAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2Jjb2RlY19ldmVudF9pbnRfbWljKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprLCBpbnQgZXZlbnQpCit7CisJLyogRW5zdXJlIEdCIG1vZHVsZSBzdXBwb3J0cyBqYWNrIHNsb3QgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiYXVkaW9fdmFsaWRhdGVfa2NvbnRyb2xfY291bnQoc3RydWN0IGdiX2F1ZGlvX3dpZGdldCAqdykKK3sKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAody0+dHlwZSkgeworCWNhc2Ugc25kX3NvY19kYXBtX3NwazoKKwljYXNlIHNuZF9zb2NfZGFwbV9ocDoKKwljYXNlIHNuZF9zb2NfZGFwbV9taWM6CisJY2FzZSBzbmRfc29jX2RhcG1fb3V0cHV0OgorCWNhc2Ugc25kX3NvY19kYXBtX2lucHV0OgorCQlpZiAody0+bmNvbnRyb2xzKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBzbmRfc29jX2RhcG1fc3dpdGNoOgorCWNhc2Ugc25kX3NvY19kYXBtX211eDoKKwkJaWYgKHctPm5jb250cm9scyAhPSAxKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYmNvZGVjX2VudW1fY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmV0LCBjdGxfaWQ7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlzdHJ1Y3QgZ2JfYXVkaW9fY3RsX2VsZW1fdmFsdWUgZ2J2YWx1ZTsKKwlzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlOworCXN0cnVjdCBnYmF1ZGlvX2NvZGVjX2luZm8gKmdiID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlOworCisJbW9kdWxlID0gZmluZF9nYl9tb2R1bGUoZ2IsIGtjb250cm9sLT5pZC5uYW1lKTsKKwlpZiAoIW1vZHVsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljdGxfaWQgPSBnYmF1ZGlvX21hcF9jb250cm9sbmFtZShtb2R1bGUsIGtjb250cm9sLT5pZC5uYW1lKTsKKwlpZiAoY3RsX2lkIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidW5kbGUgPSB0b19nYl9idW5kbGUobW9kdWxlLT5kZXYpOworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9hdWRpb19nYl9nZXRfY29udHJvbChtb2R1bGUtPm1nbXRfY29ubmVjdGlvbiwgY3RsX2lkLAorCQkJCSAgICAgIEdCX0FVRElPX0lOVkFMSURfSU5ERVgsICZnYnZhbHVlKTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKKwlpZiAocmV0KSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoY29kZWMtPmRldiwgIiVkOkVycm9yIGluICVzIGZvciAlc1xuIiwgcmV0LAorCQkJCSAgICBfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBnYnZhbHVlLnZhbHVlLmVudW1lcmF0ZWRfaXRlbVswXTsKKwlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKQorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0KKwkJCWdidmFsdWUudmFsdWUuZW51bWVyYXRlZF9pdGVtWzFdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2Jjb2RlY19lbnVtX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJldCwgY3RsX2lkOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX3ZhbHVlIGdidmFsdWU7CisJc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZTsKKwlzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvICpnYiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZTsKKworCW1vZHVsZSA9IGZpbmRfZ2JfbW9kdWxlKGdiLCBrY29udHJvbC0+aWQubmFtZSk7CisJaWYgKCFtb2R1bGUpCisJCXJldHVybiAtRUlOVkFMOworCisJY3RsX2lkID0gZ2JhdWRpb19tYXBfY29udHJvbG5hbWUobW9kdWxlLCBrY29udHJvbC0+aWQubmFtZSk7CisJaWYgKGN0bF9pZCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiBlLT5tYXggLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlnYnZhbHVlLnZhbHVlLmVudW1lcmF0ZWRfaXRlbVswXSA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisKKwlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKSB7CisJCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID4gZS0+bWF4IC0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlnYnZhbHVlLnZhbHVlLmVudW1lcmF0ZWRfaXRlbVsxXSA9CisJCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdOworCX0KKworCWJ1bmRsZSA9IHRvX2diX2J1bmRsZShtb2R1bGUtPmRldik7CisKKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGJ1bmRsZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdiX2F1ZGlvX2diX3NldF9jb250cm9sKG1vZHVsZS0+bWdtdF9jb25uZWN0aW9uLCBjdGxfaWQsCisJCQkJICAgICAgR0JfQVVESU9fSU5WQUxJRF9JTkRFWCwgJmdidmFsdWUpOworCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKworCWlmIChyZXQpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChjb2RlYy0+ZGV2LCAiJWQ6RXJyb3IgaW4gJXMgZm9yICVzXG4iLCByZXQsCisJCQkJICAgIF9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX3RwbGdfY3JlYXRlX2VudW1fa2N0bChzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqZ2IsCisJCQkJCSBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa2N0bCwKKwkJCQkJIHN0cnVjdCBnYl9hdWRpb19jb250cm9sICpjdGwpCit7CisJc3RydWN0IHNvY19lbnVtICpnYmU7CisJc3RydWN0IGdiX2F1ZGlvX2VudW1lcmF0ZWQgKmdiX2VudW07CisJaW50IGk7CisKKwlnYmUgPSBkZXZtX2t6YWxsb2MoZ2ItPmRldiwgc2l6ZW9mKCpnYmUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdiZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlnYl9lbnVtID0gJmN0bC0+aW5mby52YWx1ZS5lbnVtZXJhdGVkOworCisJLyogc2luY2UgY291bnQ9MSwgYW5kIHJlZyBpcyBkdW1teSAqLworCWdiZS0+bWF4ID0gZ2JfZW51bS0+aXRlbXM7CisJZ2JlLT50ZXh0cyA9IGdiX2dlbmVyYXRlX2VudW1fc3RyaW5ncyhnYiwgZ2JfZW51bSk7CisKKwkvKiBkZWJ1ZyBlbnVtIGluZm8gKi8KKwlkZXZfZGJnKGdiLT5kZXYsICJNYXg6JWQsIG5hbWVfbGVuZ3RoOiVkXG4iLCBnYl9lbnVtLT5pdGVtcywKKwkJIGdiX2VudW0tPm5hbWVzX2xlbmd0aCk7CisJZm9yIChpID0gMDsgaSA8IGdiX2VudW0tPml0ZW1zOyBpKyspCisJCWRldl9kYmcoZ2ItPmRldiwgInNyY1slZF06ICVzXG4iLCBpLCBnYmUtPnRleHRzW2ldKTsKKworCSprY3RsID0gKHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3KQorCQlTT0NfRU5VTV9FWFQoY3RsLT5uYW1lLCAqZ2JlLCBnYmNvZGVjX2VudW1fY3RsX2dldCwKKwkJCSAgICAgZ2Jjb2RlY19lbnVtX2N0bF9wdXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiYXVkaW9fdHBsZ19jcmVhdGVfa2NvbnRyb2woc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKmdiLAorCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa2N0bCwKKwkJCQkJc3RydWN0IGdiX2F1ZGlvX2NvbnRyb2wgKmN0bCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZ2JhdWRpb19jdGxfcHZ0ICpjdGxkYXRhOworCisJc3dpdGNoIChjdGwtPmlmYWNlKSB7CisJY2FzZSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUjoKKwkJc3dpdGNoIChjdGwtPmluZm8udHlwZSkgeworCQljYXNlIEdCX0FVRElPX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDoKKwkJCXJldCA9IGdiYXVkaW9fdHBsZ19jcmVhdGVfZW51bV9rY3RsKGdiLCBrY3RsLCBjdGwpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljdGxkYXRhID0gZGV2bV9remFsbG9jKGdiLT5kZXYsCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGdiYXVkaW9fY3RsX3B2dCksCisJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJCWlmICghY3RsZGF0YSkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWN0bGRhdGEtPmN0bF9pZCA9IGN0bC0+aWQ7CisJCQljdGxkYXRhLT5kYXRhX2Nwb3J0ID0gY3RsLT5kYXRhX2Nwb3J0OworCQkJY3RsZGF0YS0+YWNjZXNzID0gY3RsLT5hY2Nlc3M7CisJCQljdGxkYXRhLT52Y291bnQgPSBjdGwtPmNvdW50X3ZhbHVlczsKKwkJCWN0bGRhdGEtPmluZm8gPSAmY3RsLT5pbmZvOworCQkJKmtjdGwgPSAoc3RydWN0IHNuZF9rY29udHJvbF9uZXcpCisJCQkJU09DX01JWEVSX0dCKGN0bC0+bmFtZSwgY3RsLT5jb3VudCwgY3RsZGF0YSk7CisJCQljdGxkYXRhID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9kYmcoZ2ItPmRldiwgIiVzOiVkIGNvbnRyb2wgY3JlYXRlZFxuIiwgY3RsLT5uYW1lLCBjdGwtPmlkKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiY29kZWNfZW51bV9kYXBtX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmV0LCBjdGxfaWQ7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGU7CisJc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX3ZhbHVlIGdidmFsdWU7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gd2lkZ2V0LT5jb2RlYzsKKwlzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvICpnYiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGU7CisKKwltb2R1bGUgPSBmaW5kX2diX21vZHVsZShnYiwga2NvbnRyb2wtPmlkLm5hbWUpOworCWlmICghbW9kdWxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWN0bF9pZCA9IGdiYXVkaW9fbWFwX3djb250cm9sbmFtZShtb2R1bGUsIGtjb250cm9sLT5pZC5uYW1lKTsKKwlpZiAoY3RsX2lkIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidW5kbGUgPSB0b19nYl9idW5kbGUobW9kdWxlLT5kZXYpOworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9hdWRpb19nYl9nZXRfY29udHJvbChtb2R1bGUtPm1nbXRfY29ubmVjdGlvbiwgY3RsX2lkLAorCQkJCSAgICAgIEdCX0FVRElPX0lOVkFMSURfSU5ERVgsICZnYnZhbHVlKTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKKwlpZiAocmV0KSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoY29kZWMtPmRldiwgIiVkOkVycm9yIGluICVzIGZvciAlc1xuIiwgcmV0LAorCQkJCSAgICBfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBnYnZhbHVlLnZhbHVlLmVudW1lcmF0ZWRfaXRlbVswXTsKKwlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKQorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0KKwkJCWdidmFsdWUudmFsdWUuZW51bWVyYXRlZF9pdGVtWzFdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2Jjb2RlY19lbnVtX2RhcG1fY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCByZXQsIHdpLCBjdGxfaWQ7CisJdW5zaWduZWQgaW50IHZhbCwgbXV4LCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IG1hc2s7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV92YWx1ZSBnYnZhbHVlOworCXN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGU7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gd2lkZ2V0LT5jb2RlYzsKKwlzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvICpnYiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGU7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IGUtPm1heCAtIDEpCisJCXJldHVybiAtRUlOVkFMOworCisJbW9kdWxlID0gZmluZF9nYl9tb2R1bGUoZ2IsIGtjb250cm9sLT5pZC5uYW1lKTsKKwlpZiAoIW1vZHVsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljdGxfaWQgPSBnYmF1ZGlvX21hcF93Y29udHJvbG5hbWUobW9kdWxlLCBrY29udHJvbC0+aWQubmFtZSk7CisJaWYgKGN0bF9pZCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJY2hhbmdlID0gMDsKKwlidW5kbGUgPSB0b19nYl9idW5kbGUobW9kdWxlLT5kZXYpOworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9hdWRpb19nYl9nZXRfY29udHJvbChtb2R1bGUtPm1nbXRfY29ubmVjdGlvbiwgY3RsX2lkLAorCQkJCSAgICAgIEdCX0FVRElPX0lOVkFMSURfSU5ERVgsICZnYnZhbHVlKTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKKwlpZiAocmV0KSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoY29kZWMtPmRldiwgIiVkOkVycm9yIGluICVzIGZvciAlc1xuIiwgcmV0LAorCQkJCSAgICBfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCW11eCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJdmFsID0gbXV4IDw8IGUtPnNoaWZ0X2w7CisJbWFzayA9IGUtPm1hc2sgPDwgZS0+c2hpZnRfbDsKKworCWlmIChnYnZhbHVlLnZhbHVlLmVudW1lcmF0ZWRfaXRlbVswXSAhPQorCSAgICB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKSB7CisJCWNoYW5nZSA9IDE7CisJCWdidmFsdWUudmFsdWUuZW51bWVyYXRlZF9pdGVtWzBdID0KKwkJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJfQorCisJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgeworCQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IGUtPm1heCAtIDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdmFsIHw9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPDwgZS0+c2hpZnRfcjsKKwkJbWFzayB8PSBlLT5tYXNrIDw8IGUtPnNoaWZ0X3I7CisJCWlmIChnYnZhbHVlLnZhbHVlLmVudW1lcmF0ZWRfaXRlbVsxXSAhPQorCQkgICAgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSkgeworCQkJY2hhbmdlID0gMTsKKwkJCWdidmFsdWUudmFsdWUuZW51bWVyYXRlZF9pdGVtWzFdID0KKwkJCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdOworCQl9CisJfQorCisJaWYgKGNoYW5nZSkgeworCQlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGJ1bmRsZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGdiX2F1ZGlvX2diX3NldF9jb250cm9sKG1vZHVsZS0+bWdtdF9jb25uZWN0aW9uLCBjdGxfaWQsCisJCQkJCSAgICAgIEdCX0FVRElPX0lOVkFMSURfSU5ERVgsICZnYnZhbHVlKTsKKworCQlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoY29kZWMtPmRldiwKKwkJCQkJICAgICIlZDpFcnJvciBpbiAlcyBmb3IgJXNcbiIsIHJldCwKKwkJCQkJICAgIF9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJCX0KKwkJZm9yICh3aSA9IDA7IHdpIDwgd2xpc3QtPm51bV93aWRnZXRzOyB3aSsrKSB7CisJCQl3aWRnZXQgPSB3bGlzdC0+d2lkZ2V0c1t3aV07CisKKwkJCXdpZGdldC0+dmFsdWUgPSB2YWw7CisJCQl3aWRnZXQtPmRhcG0tPnVwZGF0ZSA9IE5VTEw7CisJCQlzbmRfc29jX2RhcG1fbXV4X3VwZGF0ZV9wb3dlcih3aWRnZXQsIGtjb250cm9sLCBtdXgsIGUpOworCQl9CisJfQorCisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX3RwbGdfY3JlYXRlX2VudW1fY3RsKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICpnYiwKKwkJCQkJc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtjdGwsCisJCQkJCXN0cnVjdCBnYl9hdWRpb19jb250cm9sICpjdGwpCit7CisJc3RydWN0IHNvY19lbnVtICpnYmU7CisJc3RydWN0IGdiX2F1ZGlvX2VudW1lcmF0ZWQgKmdiX2VudW07CisJaW50IGk7CisKKwlnYmUgPSBkZXZtX2t6YWxsb2MoZ2ItPmRldiwgc2l6ZW9mKCpnYmUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdiZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlnYl9lbnVtID0gJmN0bC0+aW5mby52YWx1ZS5lbnVtZXJhdGVkOworCisJLyogc2luY2UgY291bnQ9MSwgYW5kIHJlZyBpcyBkdW1teSAqLworCWdiZS0+bWF4ID0gZ2JfZW51bS0+aXRlbXM7CisJZ2JlLT50ZXh0cyA9IGdiX2dlbmVyYXRlX2VudW1fc3RyaW5ncyhnYiwgZ2JfZW51bSk7CisKKwkvKiBkZWJ1ZyBlbnVtIGluZm8gKi8KKwlkZXZfZGJnKGdiLT5kZXYsICJNYXg6JWQsIG5hbWVfbGVuZ3RoOiVkXG4iLCBnYl9lbnVtLT5pdGVtcywKKwkJIGdiX2VudW0tPm5hbWVzX2xlbmd0aCk7CisJZm9yIChpID0gMDsgaSA8IGdiX2VudW0tPml0ZW1zOyBpKyspCisJCWRldl9kYmcoZ2ItPmRldiwgInNyY1slZF06ICVzXG4iLCBpLCBnYmUtPnRleHRzW2ldKTsKKworCSprY3RsID0gKHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3KQorCQlTT0NfREFQTV9FTlVNX0VYVChjdGwtPm5hbWUsICpnYmUsIGdiY29kZWNfZW51bV9kYXBtX2N0bF9nZXQsCisJCQkJICBnYmNvZGVjX2VudW1fZGFwbV9jdGxfcHV0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX3RwbGdfY3JlYXRlX21peGVyX2N0bChzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqZ2IsCisJCQkJCSAgICAgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtjdGwsCisJCQkJCSAgICAgc3RydWN0IGdiX2F1ZGlvX2NvbnRyb2wgKmN0bCkKK3sKKwlzdHJ1Y3QgZ2JhdWRpb19jdGxfcHZ0ICpjdGxkYXRhOworCisJY3RsZGF0YSA9IGRldm1fa3phbGxvYyhnYi0+ZGV2LCBzaXplb2Yoc3RydWN0IGdiYXVkaW9fY3RsX3B2dCksCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdGxkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwljdGxkYXRhLT5jdGxfaWQgPSBjdGwtPmlkOworCWN0bGRhdGEtPmRhdGFfY3BvcnQgPSBjdGwtPmRhdGFfY3BvcnQ7CisJY3RsZGF0YS0+YWNjZXNzID0gY3RsLT5hY2Nlc3M7CisJY3RsZGF0YS0+dmNvdW50ID0gY3RsLT5jb3VudF92YWx1ZXM7CisJY3RsZGF0YS0+aW5mbyA9ICZjdGwtPmluZm87CisJKmtjdGwgPSAoc3RydWN0IHNuZF9rY29udHJvbF9uZXcpCisJCVNPQ19EQVBNX01JWEVSX0dCKGN0bC0+bmFtZSwgY3RsLT5jb3VudCwgY3RsZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX3RwbGdfY3JlYXRlX3djb250cm9sKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICpnYiwKKwkJCQkJICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa2N0bCwKKwkJCQkJICAgICBzdHJ1Y3QgZ2JfYXVkaW9fY29udHJvbCAqY3RsKQoreworCWludCByZXQ7CisKKwlzd2l0Y2ggKGN0bC0+aWZhY2UpIHsKKwljYXNlIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSOgorCQlzd2l0Y2ggKGN0bC0+aW5mby50eXBlKSB7CisJCWNhc2UgR0JfQVVESU9fQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOgorCQkJcmV0ID0gZ2JhdWRpb190cGxnX2NyZWF0ZV9lbnVtX2N0bChnYiwga2N0bCwgY3RsKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gZ2JhdWRpb190cGxnX2NyZWF0ZV9taXhlcl9jdGwoZ2IsIGtjdGwsIGN0bCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKworCX0KKworCWRldl9kYmcoZ2ItPmRldiwgIiVzOiVkIERBUE0gY29udHJvbCBjcmVhdGVkLCByZXQ6JWRcbiIsIGN0bC0+bmFtZSwKKwkJY3RsLT5pZCwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiYXVkaW9fd2lkZ2V0X2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJaW50IHdpZDsKKwlpbnQgcmV0OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHctPmNvZGVjOworCXN0cnVjdCBnYmF1ZGlvX2NvZGVjX2luZm8gKmdiY29kZWMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOworCisJLyogRmluZCByZWxldmFudCBtb2R1bGUgKi8KKwltb2R1bGUgPSBmaW5kX2diX21vZHVsZShnYmNvZGVjLCB3LT5uYW1lKTsKKwlpZiAoIW1vZHVsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBtYXAgbmFtZSB0byB3aWRnZXQgaWQgKi8KKwl3aWQgPSBnYmF1ZGlvX21hcF93aWRnZXRuYW1lKG1vZHVsZSwgdy0+bmFtZSk7CisJaWYgKHdpZCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCB3aWRnZXQgbmFtZTolc1xuIiwgdy0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJ1bmRsZSA9IHRvX2diX2J1bmRsZShtb2R1bGUtPmRldik7CisKKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGJ1bmRsZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlyZXQgPSBnYl9hdWRpb19nYl9lbmFibGVfd2lkZ2V0KG1vZHVsZS0+bWdtdF9jb25uZWN0aW9uLCB3aWQpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGdiYXVkaW9fbW9kdWxlX3VwZGF0ZShnYmNvZGVjLCB3LCBtb2R1bGUsIDEpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJcmV0ID0gZ2JfYXVkaW9fZ2JfZGlzYWJsZV93aWRnZXQobW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24sIHdpZCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gZ2JhdWRpb19tb2R1bGVfdXBkYXRlKGdiY29kZWMsIHcsIG1vZHVsZSwgMCk7CisJCWJyZWFrOworCX0KKwlpZiAocmV0KQorCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGNvZGVjLT5kZXYsCisJCQkJICAgICIlZDogd2lkZ2V0LCBldmVudDolZCBmYWlsZWQ6JWRcbiIsIHdpZCwKKwkJCQkgICAgZXZlbnQsIHJldCk7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX3RwbGdfY3JlYXRlX3dpZGdldChzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpkdywKKwkJCQkgICAgICBzdHJ1Y3QgZ2JfYXVkaW9fd2lkZ2V0ICp3LCBpbnQgKndfc2l6ZSkKK3sKKwlpbnQgaSwgcmV0LCBjc2l6ZTsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqd2lkZ2V0X2tjdGxzOworCXN0cnVjdCBnYl9hdWRpb19jb250cm9sICpjdXJyOworCXN0cnVjdCBnYmF1ZGlvX2NvbnRyb2wgKmNvbnRyb2wsICpfY29udHJvbDsKKwlzaXplX3Qgc2l6ZTsKKwljaGFyIHRlbXBfbmFtZVtOQU1FX1NJWkVdOworCisJcmV0ID0gZ2JhdWRpb192YWxpZGF0ZV9rY29udHJvbF9jb3VudCh3KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIobW9kdWxlLT5kZXYsICJJbmF2bGlkIGtjb250cm9sIGNvdW50PSVkIGZvciAlc1xuIiwKKwkJCXctPm5jb250cm9scywgdy0+bmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBrY29udHJvbCAqLworCWlmICh3LT5uY29udHJvbHMpIHsKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc25kX2tjb250cm9sX25ldykgKiB3LT5uY29udHJvbHM7CisJCXdpZGdldF9rY3RscyA9IGRldm1fa3phbGxvYyhtb2R1bGUtPmRldiwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghd2lkZ2V0X2tjdGxzKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJKndfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZ2JfYXVkaW9fd2lkZ2V0KTsKKworCS8qIGNyZWF0ZSByZWxldmFudCBrY29udHJvbHMgKi8KKwljdXJyID0gdy0+Y3RsOworCWZvciAoaSA9IDA7IGkgPCB3LT5uY29udHJvbHM7IGkrKykgeworCQlyZXQgPSBnYmF1ZGlvX3RwbGdfY3JlYXRlX3djb250cm9sKG1vZHVsZSwgJndpZGdldF9rY3Rsc1tpXSwKKwkJCQkJCSAgIGN1cnIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LAorCQkJCSIlczolZCB0eXBlIHdpZGdldF9jdGwgbm90IHN1cHBvcnRlZFxuIiwKKwkJCQljdXJyLT5uYW1lLCBjdXJyLT5pZmFjZSk7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWNvbnRyb2wgPSBkZXZtX2t6YWxsb2MobW9kdWxlLT5kZXYsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZ2JhdWRpb19jb250cm9sKSwKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghY29udHJvbCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJY29udHJvbC0+aWQgPSBjdXJyLT5pZDsKKwkJY29udHJvbC0+bmFtZSA9IGN1cnItPm5hbWU7CisJCWNvbnRyb2wtPnduYW1lID0gdy0+bmFtZTsKKworCQlpZiAoY3Vyci0+aW5mby50eXBlID09IEdCX0FVRElPX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRCkgeworCQkJc3RydWN0IGdiX2F1ZGlvX2VudW1lcmF0ZWQgKmdiZW51bSA9CisJCQkJJmN1cnItPmluZm8udmFsdWUuZW51bWVyYXRlZDsKKworCQkJY3NpemUgPSBvZmZzZXRvZihzdHJ1Y3QgZ2JfYXVkaW9fY29udHJvbCwgaW5mbyk7CisJCQljc2l6ZSArPSBvZmZzZXRvZihzdHJ1Y3QgZ2JfYXVkaW9fY3RsX2VsZW1faW5mbywgdmFsdWUpOworCQkJY3NpemUgKz0gb2Zmc2V0b2Yoc3RydWN0IGdiX2F1ZGlvX2VudW1lcmF0ZWQsIG5hbWVzKTsKKwkJCWNzaXplICs9IGdiZW51bS0+bmFtZXNfbGVuZ3RoOworCQkJY29udHJvbC0+dGV4dHMgPSAoY29uc3QgY2hhciAqIGNvbnN0ICopCisJCQkJZ2JfZ2VuZXJhdGVfZW51bV9zdHJpbmdzKG1vZHVsZSwgZ2JlbnVtKTsKKwkJCWNvbnRyb2wtPml0ZW1zID0gZ2JlbnVtLT5pdGVtczsKKwkJfSBlbHNlCisJCQljc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZ2JfYXVkaW9fY29udHJvbCk7CisJCSp3X3NpemUgKz0gY3NpemU7CisJCWN1cnIgPSAodm9pZCAqKWN1cnIgKyBjc2l6ZTsKKwkJbGlzdF9hZGQoJmNvbnRyb2wtPmxpc3QsICZtb2R1bGUtPndpZGdldF9jdGxfbGlzdCk7CisJCWRldl9kYmcobW9kdWxlLT5kZXYsICIlczogY29udHJvbCBvZiB0eXBlICVkIGNyZWF0ZWRcbiIsCisJCQl3aWRnZXRfa2N0bHNbaV0ubmFtZSwgd2lkZ2V0X2tjdGxzW2ldLmlmYWNlKTsKKwl9CisKKwkvKiBQcmVmaXggZGV2X2lkIHRvIHdpZGdldCBjb250cm9sX25hbWUgKi8KKwlzdHJsY3B5KHRlbXBfbmFtZSwgdy0+bmFtZSwgTkFNRV9TSVpFKTsKKwlzbnByaW50Zih3LT5uYW1lLCBOQU1FX1NJWkUsICJHQiAlZCAlcyIsIG1vZHVsZS0+ZGV2X2lkLCB0ZW1wX25hbWUpOworCisJc3dpdGNoICh3LT50eXBlKSB7CisJY2FzZSBzbmRfc29jX2RhcG1fc3BrOgorCQkqZHcgPSAoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQpCisJCQlTTkRfU09DX0RBUE1fU1BLKHctPm5hbWUsIGdiY29kZWNfZXZlbnRfc3BrKTsKKwkJbW9kdWxlLT5vcF9kZXZpY2VzIHw9IEdCQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9ocDoKKwkJKmR3ID0gKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0KQorCQkJU05EX1NPQ19EQVBNX0hQKHctPm5hbWUsIGdiY29kZWNfZXZlbnRfaHApOworCQltb2R1bGUtPm9wX2RldmljZXMgfD0gKEdCQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUCisJCQkJCXwgR0JBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSk7CisJCW1vZHVsZS0+aXBfZGV2aWNlcyB8PSBHQkFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUOworCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9taWM6CisJCSpkdyA9IChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCkKKwkJCVNORF9TT0NfREFQTV9NSUMody0+bmFtZSwgZ2Jjb2RlY19ldmVudF9pbnRfbWljKTsKKwkJbW9kdWxlLT5pcF9kZXZpY2VzIHw9IEdCQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOworCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9vdXRwdXQ6CisJCSpkdyA9IChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldClTTkRfU09DX0RBUE1fT1VUUFVUKHctPm5hbWUpOworCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9pbnB1dDoKKwkJKmR3ID0gKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0KVNORF9TT0NfREFQTV9JTlBVVCh3LT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBzbmRfc29jX2RhcG1fc3dpdGNoOgorCQkqZHcgPSAoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQpCisJCQlTTkRfU09DX0RBUE1fU1dJVENIX0Uody0+bmFtZSwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCQkgICAgd2lkZ2V0X2tjdGxzLCBnYmF1ZGlvX3dpZGdldF9ldmVudCwKKwkJCQkJICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJCQkJICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCk7CisJCWJyZWFrOworCWNhc2Ugc25kX3NvY19kYXBtX3BnYToKKwkJKmR3ID0gKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0KQorCQkJU05EX1NPQ19EQVBNX1BHQV9FKHctPm5hbWUsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCwKKwkJCQkJICAgZ2JhdWRpb193aWRnZXRfZXZlbnQsCisJCQkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKTsKKwkJYnJlYWs7CisJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXI6CisJCSpkdyA9IChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCkKKwkJCVNORF9TT0NfREFQTV9NSVhFUl9FKHctPm5hbWUsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwKKwkJCQkJICAgMCwgZ2JhdWRpb193aWRnZXRfZXZlbnQsCisJCQkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKTsKKwkJYnJlYWs7CisJY2FzZSBzbmRfc29jX2RhcG1fbXV4OgorCQkqZHcgPSAoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQpCisJCQlTTkRfU09DX0RBUE1fTVVYX0Uody0+bmFtZSwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCQkgd2lkZ2V0X2tjdGxzLCBnYmF1ZGlvX3dpZGdldF9ldmVudCwKKwkJCQkJIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJCQkJIFNORF9TT0NfREFQTV9QT1NUX1BNRCk7CisJCWJyZWFrOworCWNhc2Ugc25kX3NvY19kYXBtX2FpZl9pbjoKKwkJKmR3ID0gKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0KQorCQkJU05EX1NPQ19EQVBNX0FJRl9JTl9FKHctPm5hbWUsIHctPnNuYW1lLCAwLAorCQkJCQkgICAgICBTTkRfU09DX05PUE0sCisJCQkJCSAgICAgIDAsIDAsIGdiYXVkaW9fd2lkZ2V0X2V2ZW50LAorCQkJCQkgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCQkJCSAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCk7CisJCWJyZWFrOworCWNhc2Ugc25kX3NvY19kYXBtX2FpZl9vdXQ6CisJCSpkdyA9IChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCkKKwkJCVNORF9TT0NfREFQTV9BSUZfT1VUX0Uody0+bmFtZSwgdy0+c25hbWUsIDAsCisJCQkJCSAgICAgICBTTkRfU09DX05PUE0sCisJCQkJCSAgICAgICAwLCAwLCBnYmF1ZGlvX3dpZGdldF9ldmVudCwKKwkJCQkJICAgICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGV2X2RiZyhtb2R1bGUtPmRldiwgIiVzOiB3aWRnZXQgb2YgdHlwZSAlZCBjcmVhdGVkXG4iLCBkdy0+bmFtZSwKKwkJZHctPmlkKTsKKwlyZXR1cm4gMDsKK2Vycm9yOgorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjb250cm9sLCBfY29udHJvbCwgJm1vZHVsZS0+d2lkZ2V0X2N0bF9saXN0LAorCQkJCSBsaXN0KSB7CisJCWxpc3RfZGVsKCZjb250cm9sLT5saXN0KTsKKwkJZGV2bV9rZnJlZShtb2R1bGUtPmRldiwgY29udHJvbCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JhdWRpb190cGxnX3Byb2Nlc3Nfa2NvbnRyb2xzKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUsCisJCQkJICAgc3RydWN0IGdiX2F1ZGlvX2NvbnRyb2wgKmNvbnRyb2xzKQoreworCWludCBpLCBjc2l6ZSwgcmV0OworCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpkYXBtX2tjdGxzOworCXN0cnVjdCBnYl9hdWRpb19jb250cm9sICpjdXJyOworCXN0cnVjdCBnYmF1ZGlvX2NvbnRyb2wgKmNvbnRyb2wsICpfY29udHJvbDsKKwlzaXplX3Qgc2l6ZTsKKwljaGFyIHRlbXBfbmFtZVtOQU1FX1NJWkVdOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc25kX2tjb250cm9sX25ldykgKiBtb2R1bGUtPm51bV9jb250cm9sczsKKwlkYXBtX2tjdGxzID0gZGV2bV9remFsbG9jKG1vZHVsZS0+ZGV2LCBzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhcG1fa2N0bHMpCisJCXJldHVybiAtRU5PTUVNOworCisJY3VyciA9IGNvbnRyb2xzOworCWZvciAoaSA9IDA7IGkgPCBtb2R1bGUtPm51bV9jb250cm9sczsgaSsrKSB7CisJCXJldCA9IGdiYXVkaW9fdHBsZ19jcmVhdGVfa2NvbnRyb2wobW9kdWxlLCAmZGFwbV9rY3Rsc1tpXSwKKwkJCQkJCSAgIGN1cnIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LCAiJXM6JWQgdHlwZSBub3Qgc3VwcG9ydGVkXG4iLAorCQkJCWN1cnItPm5hbWUsIGN1cnItPmlmYWNlKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJY29udHJvbCA9IGRldm1fa3phbGxvYyhtb2R1bGUtPmRldiwgc2l6ZW9mKHN0cnVjdAorCQkJCQkJCSAgIGdiYXVkaW9fY29udHJvbCksCisJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghY29udHJvbCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJY29udHJvbC0+aWQgPSBjdXJyLT5pZDsKKwkJLyogUHJlZml4IGRldl9pZCB0byB3aWRnZXRfbmFtZSAqLworCQlzdHJsY3B5KHRlbXBfbmFtZSwgY3Vyci0+bmFtZSwgTkFNRV9TSVpFKTsKKwkJc25wcmludGYoY3Vyci0+bmFtZSwgTkFNRV9TSVpFLCAiR0IgJWQgJXMiLCBtb2R1bGUtPmRldl9pZCwKKwkJCSB0ZW1wX25hbWUpOworCQljb250cm9sLT5uYW1lID0gY3Vyci0+bmFtZTsKKwkJaWYgKGN1cnItPmluZm8udHlwZSA9PSBHQl9BVURJT19DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQpIHsKKwkJCXN0cnVjdCBnYl9hdWRpb19lbnVtZXJhdGVkICpnYmVudW0gPQorCQkJCSZjdXJyLT5pbmZvLnZhbHVlLmVudW1lcmF0ZWQ7CisKKwkJCWNzaXplID0gb2Zmc2V0b2Yoc3RydWN0IGdiX2F1ZGlvX2NvbnRyb2wsIGluZm8pOworCQkJY3NpemUgKz0gb2Zmc2V0b2Yoc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX2luZm8sIHZhbHVlKTsKKwkJCWNzaXplICs9IG9mZnNldG9mKHN0cnVjdCBnYl9hdWRpb19lbnVtZXJhdGVkLCBuYW1lcyk7CisJCQljc2l6ZSArPSBnYmVudW0tPm5hbWVzX2xlbmd0aDsKKwkJCWNvbnRyb2wtPnRleHRzID0gKGNvbnN0IGNoYXIgKiBjb25zdCAqKQorCQkJCWdiX2dlbmVyYXRlX2VudW1fc3RyaW5ncyhtb2R1bGUsIGdiZW51bSk7CisJCQljb250cm9sLT5pdGVtcyA9IGdiZW51bS0+aXRlbXM7CisJCX0gZWxzZQorCQkJY3NpemUgPSBzaXplb2Yoc3RydWN0IGdiX2F1ZGlvX2NvbnRyb2wpOworCisJCWxpc3RfYWRkKCZjb250cm9sLT5saXN0LCAmbW9kdWxlLT5jdGxfbGlzdCk7CisJCWRldl9kYmcobW9kdWxlLT5kZXYsICIlZDolcyBjcmVhdGVkIG9mIHR5cGUgJWRcbiIsIGN1cnItPmlkLAorCQkJY3Vyci0+bmFtZSwgY3Vyci0+aW5mby50eXBlKTsKKwkJY3VyciA9ICh2b2lkICopY3VyciArIGNzaXplOworCX0KKwltb2R1bGUtPmNvbnRyb2xzID0gZGFwbV9rY3RsczsKKworCXJldHVybiAwOworZXJyb3I6CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbnRyb2wsIF9jb250cm9sLCAmbW9kdWxlLT5jdGxfbGlzdCwKKwkJCQkgbGlzdCkgeworCQlsaXN0X2RlbCgmY29udHJvbC0+bGlzdCk7CisJCWRldm1fa2ZyZWUobW9kdWxlLT5kZXYsIGNvbnRyb2wpOworCX0KKwlkZXZtX2tmcmVlKG1vZHVsZS0+ZGV2LCBkYXBtX2tjdGxzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiYXVkaW9fdHBsZ19wcm9jZXNzX3dpZGdldHMoc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSwKKwkJCQkgICBzdHJ1Y3QgZ2JfYXVkaW9fd2lkZ2V0ICp3aWRnZXRzKQoreworCWludCBpLCByZXQsIHdfc2l6ZTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqZGFwbV93aWRnZXRzOworCXN0cnVjdCBnYl9hdWRpb193aWRnZXQgKmN1cnI7CisJc3RydWN0IGdiYXVkaW9fd2lkZ2V0ICp3aWRnZXQsICpfd2lkZ2V0OworCXNpemVfdCBzaXplOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCkgKiBtb2R1bGUtPm51bV9kYXBtX3dpZGdldHM7CisJZGFwbV93aWRnZXRzID0gZGV2bV9remFsbG9jKG1vZHVsZS0+ZGV2LCBzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhcG1fd2lkZ2V0cykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljdXJyID0gd2lkZ2V0czsKKwlmb3IgKGkgPSAwOyBpIDwgbW9kdWxlLT5udW1fZGFwbV93aWRnZXRzOyBpKyspIHsKKwkJcmV0ID0gZ2JhdWRpb190cGxnX2NyZWF0ZV93aWRnZXQobW9kdWxlLCAmZGFwbV93aWRnZXRzW2ldLAorCQkJCQkJIGN1cnIsICZ3X3NpemUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LCAiJXM6JWQgdHlwZSBub3Qgc3VwcG9ydGVkXG4iLAorCQkJCWN1cnItPm5hbWUsIGN1cnItPnR5cGUpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQl3aWRnZXQgPSBkZXZtX2t6YWxsb2MobW9kdWxlLT5kZXYsIHNpemVvZihzdHJ1Y3QKKwkJCQkJCQkgICBnYmF1ZGlvX3dpZGdldCksCisJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghd2lkZ2V0KSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnJvcjsKKwkJfQorCQl3aWRnZXQtPmlkID0gY3Vyci0+aWQ7CisJCXdpZGdldC0+bmFtZSA9IGN1cnItPm5hbWU7CisJCWxpc3RfYWRkKCZ3aWRnZXQtPmxpc3QsICZtb2R1bGUtPndpZGdldF9saXN0KTsKKwkJY3VyciA9ICh2b2lkICopY3VyciArIHdfc2l6ZTsKKwl9CisJbW9kdWxlLT5kYXBtX3dpZGdldHMgPSBkYXBtX3dpZGdldHM7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdpZGdldCwgX3dpZGdldCwgJm1vZHVsZS0+d2lkZ2V0X2xpc3QsCisJCQkJIGxpc3QpIHsKKwkJbGlzdF9kZWwoJndpZGdldC0+bGlzdCk7CisJCWRldm1fa2ZyZWUobW9kdWxlLT5kZXYsIHdpZGdldCk7CisJfQorCWRldm1fa2ZyZWUobW9kdWxlLT5kZXYsIGRhcG1fd2lkZ2V0cyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX3RwbGdfcHJvY2Vzc19yb3V0ZXMoc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSwKKwkJCQkgICBzdHJ1Y3QgZ2JfYXVkaW9fcm91dGUgKnJvdXRlcykKK3sKKwlpbnQgaSwgcmV0OworCXN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgKmRhcG1fcm91dGVzOworCXN0cnVjdCBnYl9hdWRpb19yb3V0ZSAqY3VycjsKKwlzaXplX3Qgc2l6ZTsKKworCXNpemUgPSBzaXplb2Yoc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSkgKiBtb2R1bGUtPm51bV9kYXBtX3JvdXRlczsKKwlkYXBtX3JvdXRlcyA9IGRldm1fa3phbGxvYyhtb2R1bGUtPmRldiwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXBtX3JvdXRlcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltb2R1bGUtPmRhcG1fcm91dGVzID0gZGFwbV9yb3V0ZXM7CisJY3VyciA9IHJvdXRlczsKKworCWZvciAoaSA9IDA7IGkgPCBtb2R1bGUtPm51bV9kYXBtX3JvdXRlczsgaSsrKSB7CisJCWRhcG1fcm91dGVzLT5zaW5rID0KKwkJCWdiYXVkaW9fbWFwX3dpZGdldGlkKG1vZHVsZSwgY3Vyci0+ZGVzdGluYXRpb25faWQpOworCQlpZiAoIWRhcG1fcm91dGVzLT5zaW5rKSB7CisJCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LCAiJWQ6JWQ6JWQ6JWQgLSBJbnZhbGlkIHNpbmtcbiIsCisJCQkJY3Vyci0+c291cmNlX2lkLCBjdXJyLT5kZXN0aW5hdGlvbl9pZCwKKwkJCQljdXJyLT5jb250cm9sX2lkLCBjdXJyLT5pbmRleCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlkYXBtX3JvdXRlcy0+c291cmNlID0KKwkJCWdiYXVkaW9fbWFwX3dpZGdldGlkKG1vZHVsZSwgY3Vyci0+c291cmNlX2lkKTsKKwkJaWYgKCFkYXBtX3JvdXRlcy0+c291cmNlKSB7CisJCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LCAiJWQ6JWQ6JWQ6JWQgLSBJbnZhbGlkIHNvdXJjZVxuIiwKKwkJCQljdXJyLT5zb3VyY2VfaWQsIGN1cnItPmRlc3RpbmF0aW9uX2lkLAorCQkJCWN1cnItPmNvbnRyb2xfaWQsIGN1cnItPmluZGV4KTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWRhcG1fcm91dGVzLT5jb250cm9sID0KKwkJCWdiYXVkaW9fbWFwX2NvbnRyb2xpZChtb2R1bGUsCisJCQkJCQkgICAgICBjdXJyLT5jb250cm9sX2lkLAorCQkJCQkJICAgICAgY3Vyci0+aW5kZXgpOworCQlpZiAoKGN1cnItPmNvbnRyb2xfaWQgIT0gIEdCQVVESU9fSU5WQUxJRF9JRCkgJiYKKwkJICAgICFkYXBtX3JvdXRlcy0+Y29udHJvbCkgeworCQkJZGV2X2Vycihtb2R1bGUtPmRldiwgIiVkOiVkOiVkOiVkIC0gSW52YWxpZCBjb250cm9sXG4iLAorCQkJCWN1cnItPnNvdXJjZV9pZCwgY3Vyci0+ZGVzdGluYXRpb25faWQsCisJCQkJY3Vyci0+Y29udHJvbF9pZCwgY3Vyci0+aW5kZXgpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZGV2X2RiZyhtb2R1bGUtPmRldiwgIlJvdXRlIHslcywgJXMsICVzfVxuIiwgZGFwbV9yb3V0ZXMtPnNpbmssCisJCQkoZGFwbV9yb3V0ZXMtPmNvbnRyb2wpID8gZGFwbV9yb3V0ZXMtPmNvbnRyb2w6Ik5VTEwiLAorCQkJZGFwbV9yb3V0ZXMtPnNvdXJjZSk7CisJCWRhcG1fcm91dGVzKys7CisJCWN1cnIrKzsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJZGV2bV9rZnJlZShtb2R1bGUtPmRldiwgbW9kdWxlLT5kYXBtX3JvdXRlcyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX3RwbGdfcHJvY2Vzc19oZWFkZXIoc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSwKKwkJCQkgc3RydWN0IGdiX2F1ZGlvX3RvcG9sb2d5ICp0cGxnX2RhdGEpCit7CisJLyogZmV0Y2ggbm8uIG9mIGtjb250cm9scywgd2lkZ2V0cyAmIHJvdXRlcyAqLworCW1vZHVsZS0+bnVtX2NvbnRyb2xzID0gdHBsZ19kYXRhLT5udW1fY29udHJvbHM7CisJbW9kdWxlLT5udW1fZGFwbV93aWRnZXRzID0gdHBsZ19kYXRhLT5udW1fd2lkZ2V0czsKKwltb2R1bGUtPm51bV9kYXBtX3JvdXRlcyA9IHRwbGdfZGF0YS0+bnVtX3JvdXRlczsKKworCS8qIHVwZGF0ZSBibG9jayBvZmZzZXQgKi8KKwltb2R1bGUtPmRhaV9vZmZzZXQgPSAodW5zaWduZWQgbG9uZykmdHBsZ19kYXRhLT5kYXRhOworCW1vZHVsZS0+Y29udHJvbF9vZmZzZXQgPSBtb2R1bGUtPmRhaV9vZmZzZXQgKyB0cGxnX2RhdGEtPnNpemVfZGFpczsKKwltb2R1bGUtPndpZGdldF9vZmZzZXQgPSBtb2R1bGUtPmNvbnRyb2xfb2Zmc2V0ICsKKwkJdHBsZ19kYXRhLT5zaXplX2NvbnRyb2xzOworCW1vZHVsZS0+cm91dGVfb2Zmc2V0ID0gbW9kdWxlLT53aWRnZXRfb2Zmc2V0ICsKKwkJdHBsZ19kYXRhLT5zaXplX3dpZGdldHM7CisKKwlkZXZfZGJnKG1vZHVsZS0+ZGV2LCAiREFJIG9mZnNldCBpcyAweCVseFxuIiwgbW9kdWxlLT5kYWlfb2Zmc2V0KTsKKwlkZXZfZGJnKG1vZHVsZS0+ZGV2LCAiY29udHJvbCBvZmZzZXQgaXMgJWx4XG4iLAorCQltb2R1bGUtPmNvbnRyb2xfb2Zmc2V0KTsKKwlkZXZfZGJnKG1vZHVsZS0+ZGV2LCAid2lkZ2V0IG9mZnNldCBpcyAlbHhcbiIsIG1vZHVsZS0+d2lkZ2V0X29mZnNldCk7CisJZGV2X2RiZyhtb2R1bGUtPmRldiwgInJvdXRlIG9mZnNldCBpcyAlbHhcbiIsIG1vZHVsZS0+cm91dGVfb2Zmc2V0KTsKKworCXJldHVybiAwOworfQorCitpbnQgZ2JhdWRpb190cGxnX3BhcnNlX2RhdGEoc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSwKKwkJCSAgICAgICBzdHJ1Y3QgZ2JfYXVkaW9fdG9wb2xvZ3kgKnRwbGdfZGF0YSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBnYl9hdWRpb19jb250cm9sICpjb250cm9sczsKKwlzdHJ1Y3QgZ2JfYXVkaW9fd2lkZ2V0ICp3aWRnZXRzOworCXN0cnVjdCBnYl9hdWRpb19yb3V0ZSAqcm91dGVzOworCisJaWYgKCF0cGxnX2RhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gZ2JhdWRpb190cGxnX3Byb2Nlc3NfaGVhZGVyKG1vZHVsZSwgdHBsZ19kYXRhKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIobW9kdWxlLT5kZXYsICIlZDogRXJyb3IgaW4gcGFyc2luZyB0b3BvbG9neSBoZWFkZXJcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHByb2Nlc3MgY29udHJvbCAqLworCWNvbnRyb2xzID0gKHN0cnVjdCBnYl9hdWRpb19jb250cm9sICopbW9kdWxlLT5jb250cm9sX29mZnNldDsKKwlyZXQgPSBnYmF1ZGlvX3RwbGdfcHJvY2Vzc19rY29udHJvbHMobW9kdWxlLCBjb250cm9scyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LAorCQkJIiVkOiBFcnJvciBpbiBwYXJzaW5nIGNvbnRyb2xzIGRhdGFcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCWRldl9kYmcobW9kdWxlLT5kZXYsICJDb250cm9sIHBhcnNpbmcgZmluaXNoZWRcbiIpOworCisJLyogcHJvY2VzcyB3aWRnZXRzICovCisJd2lkZ2V0cyA9IChzdHJ1Y3QgZ2JfYXVkaW9fd2lkZ2V0ICopbW9kdWxlLT53aWRnZXRfb2Zmc2V0OworCXJldCA9IGdiYXVkaW9fdHBsZ19wcm9jZXNzX3dpZGdldHMobW9kdWxlLCB3aWRnZXRzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIobW9kdWxlLT5kZXYsCisJCQkiJWQ6IEVycm9yIGluIHBhcnNpbmcgd2lkZ2V0cyBkYXRhXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlkZXZfZGJnKG1vZHVsZS0+ZGV2LCAiV2lkZ2V0IHBhcnNpbmcgZmluaXNoZWRcbiIpOworCisJLyogcHJvY2VzcyByb3V0ZSAqLworCXJvdXRlcyA9IChzdHJ1Y3QgZ2JfYXVkaW9fcm91dGUgKiltb2R1bGUtPnJvdXRlX29mZnNldDsKKwlyZXQgPSBnYmF1ZGlvX3RwbGdfcHJvY2Vzc19yb3V0ZXMobW9kdWxlLCByb3V0ZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihtb2R1bGUtPmRldiwKKwkJCSIlZDogRXJyb3IgaW4gcGFyc2luZyByb3V0ZXMgZGF0YVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZGV2X2RiZyhtb2R1bGUtPmRldiwgIlJvdXRlIHBhcnNpbmcgZmluaXNoZWRcbiIpOworCisJLyogcGFyc2UgamFjayBjYXBhYmlsaXRpZXMgKi8KKwlpZiAodHBsZ19kYXRhLT5qYWNrX3R5cGUpIHsKKwkJbW9kdWxlLT5qYWNrX21hc2sgPSB0cGxnX2RhdGEtPmphY2tfdHlwZSAmIEdCQ09ERUNfSkFDS19NQVNLOworCQltb2R1bGUtPmJ1dHRvbl9tYXNrID0gdHBsZ19kYXRhLT5qYWNrX3R5cGUgJgorCQkJR0JDT0RFQ19KQUNLX0JVVFRPTl9NQVNLOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgZ2JhdWRpb190cGxnX3JlbGVhc2Uoc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSkKK3sKKwlzdHJ1Y3QgZ2JhdWRpb19jb250cm9sICpjb250cm9sLCAqX2NvbnRyb2w7CisJc3RydWN0IGdiYXVkaW9fd2lkZ2V0ICp3aWRnZXQsICpfd2lkZ2V0OworCisJaWYgKCFtb2R1bGUtPnRvcG9sb2d5KQorCQlyZXR1cm47CisKKwkvKiByZWxlYXNlIGtjb250cm9scyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjb250cm9sLCBfY29udHJvbCwgJm1vZHVsZS0+Y3RsX2xpc3QsCisJCQkJIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmNvbnRyb2wtPmxpc3QpOworCQlkZXZtX2tmcmVlKG1vZHVsZS0+ZGV2LCBjb250cm9sKTsKKwl9CisJaWYgKG1vZHVsZS0+Y29udHJvbHMpCisJCWRldm1fa2ZyZWUobW9kdWxlLT5kZXYsIG1vZHVsZS0+Y29udHJvbHMpOworCisJLyogcmVsZWFzZSB3aWRnZXQgY29udHJvbHMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY29udHJvbCwgX2NvbnRyb2wsICZtb2R1bGUtPndpZGdldF9jdGxfbGlzdCwKKwkJCQkgbGlzdCkgeworCQlsaXN0X2RlbCgmY29udHJvbC0+bGlzdCk7CisJCWRldm1fa2ZyZWUobW9kdWxlLT5kZXYsIGNvbnRyb2wpOworCX0KKworCS8qIHJlbGVhc2Ugd2lkZ2V0cyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3aWRnZXQsIF93aWRnZXQsICZtb2R1bGUtPndpZGdldF9saXN0LAorCQkJCSBsaXN0KSB7CisJCWxpc3RfZGVsKCZ3aWRnZXQtPmxpc3QpOworCQlkZXZtX2tmcmVlKG1vZHVsZS0+ZGV2LCB3aWRnZXQpOworCX0KKwlpZiAobW9kdWxlLT5kYXBtX3dpZGdldHMpCisJCWRldm1fa2ZyZWUobW9kdWxlLT5kZXYsIG1vZHVsZS0+ZGFwbV93aWRnZXRzKTsKKworCS8qIHJlbGVhc2Ugcm91dGVzICovCisJaWYgKG1vZHVsZS0+ZGFwbV9yb3V0ZXMpCisJCWRldm1fa2ZyZWUobW9kdWxlLT5kZXYsIG1vZHVsZS0+ZGFwbV9yb3V0ZXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXV0aGVudGljYXRpb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1dGhlbnRpY2F0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4NjI2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1dGhlbnRpY2F0aW9uLmMKQEAgLTAsMCArMSw0MjkgQEAKKy8qCisgKiBHcmV5YnVzIENvbXBvbmVudCBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCAoQ0FQKSBEcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE2IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKworI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiZ3JleWJ1c19hdXRoZW50aWNhdGlvbi5oIgorI2luY2x1ZGUgImZpcm13YXJlLmgiCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorCisjZGVmaW5lIENBUF9USU1FT1VUX01TCQkxMDAwCisKKy8qCisgKiBOdW1iZXIgb2YgbWlub3IgZGV2aWNlcyB0aGlzIGRyaXZlciBzdXBwb3J0cy4KKyAqIFRoZXJlIHdpbGwgYmUgZXhhY3RseSBvbmUgcmVxdWlyZWQgcGVyIEludGVyZmFjZS4KKyAqLworI2RlZmluZSBOVU1fTUlOT1JTCQlVOF9NQVgKKworc3RydWN0IGdiX2NhcCB7CisJc3RydWN0IGRldmljZQkJKnBhcmVudDsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbgkqY29ubmVjdGlvbjsKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CisJYm9vbAkJCWRpc2FibGVkOyAvKiBjb25uZWN0aW9uIGdldHRpbmcgZGlzYWJsZWQgKi8KKworCXN0cnVjdCBtdXRleAkJbXV0ZXg7CisJc3RydWN0IGNkZXYJCWNkZXY7CisJc3RydWN0IGRldmljZQkJKmNsYXNzX2RldmljZTsKKwlkZXZfdAkJCWRldl9udW07Cit9OworCitzdGF0aWMgc3RydWN0IGNsYXNzICpjYXBfY2xhc3M7CitzdGF0aWMgZGV2X3QgY2FwX2Rldl9udW07CitzdGF0aWMgREVGSU5FX0lEQShjYXBfbWlub3JzX21hcCk7CitzdGF0aWMgTElTVF9IRUFEKGNhcF9saXN0KTsKK3N0YXRpYyBERUZJTkVfTVVURVgobGlzdF9tdXRleCk7CisKK3N0YXRpYyB2b2lkIGNhcF9rcmVmX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGdiX2NhcCAqY2FwID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBnYl9jYXAsIGtyZWYpOworCisJa2ZyZWUoY2FwKTsKK30KKworLyoKKyAqIEFsbCB1c2VycyBvZiBjYXAgdGFrZSBhIHJlZmVyZW5jZSAoZnJvbSB3aXRoaW4gbGlzdF9tdXRleCBsb2NrKSwgYmVmb3JlCisgKiB0aGV5IGdldCBhIHBvaW50ZXIgdG8gcGxheSB3aXRoLiBBbmQgdGhlIHN0cnVjdHVyZSB3aWxsIGJlIGZyZWVkIG9ubHkgYWZ0ZXIKKyAqIHRoZSBsYXN0IHVzZXIgaGFzIHB1dCB0aGUgcmVmZXJlbmNlIHRvIGl0LgorICovCitzdGF0aWMgdm9pZCBwdXRfY2FwKHN0cnVjdCBnYl9jYXAgKmNhcCkKK3sKKwlrcmVmX3B1dCgmY2FwLT5rcmVmLCBjYXBfa3JlZl9yZWxlYXNlKTsKK30KKworLyogQ2FsbGVyIG11c3QgY2FsbCBwdXRfY2FwKCkgYWZ0ZXIgdXNpbmcgc3RydWN0IGdiX2NhcCAqLworc3RhdGljIHN0cnVjdCBnYl9jYXAgKmdldF9jYXAoc3RydWN0IGNkZXYgKmNkZXYpCit7CisJc3RydWN0IGdiX2NhcCAqY2FwOworCisJbXV0ZXhfbG9jaygmbGlzdF9tdXRleCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhcCwgJmNhcF9saXN0LCBub2RlKSB7CisJCWlmICgmY2FwLT5jZGV2ID09IGNkZXYpIHsKKwkJCWtyZWZfZ2V0KCZjYXAtPmtyZWYpOworCQkJZ290byB1bmxvY2s7CisJCX0KKwl9CisKKwljYXAgPSBOVUxMOworCit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZsaXN0X211dGV4KTsKKworCXJldHVybiBjYXA7Cit9CisKK3N0YXRpYyBpbnQgY2FwX2dldF9lbmRwb2ludF91aWQoc3RydWN0IGdiX2NhcCAqY2FwLCB1OCAqZXVpZCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGNhcC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfY2FwX2dldF9lbmRwb2ludF91aWRfcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IHJldDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0NBUF9UWVBFX0dFVF9FTkRQT0lOVF9VSUQsIE5VTEwsCisJCQkJMCwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY2FwLT5wYXJlbnQsICJmYWlsZWQgdG8gZ2V0IGVuZHBvaW50IHVpZCAoJWQpXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCW1lbWNweShldWlkLCByZXNwb25zZS51aWQsIHNpemVvZihyZXNwb25zZS51aWQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhcF9nZXRfaW1zX2NlcnRpZmljYXRlKHN0cnVjdCBnYl9jYXAgKmNhcCwgdTMyIGNsYXNzLCB1MzIgaWQsCisJCQkJICAgdTggKmNlcnRpZmljYXRlLCB1MzIgKnNpemUsIHU4ICpyZXN1bHQpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBjYXAtPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX2NhcF9nZXRfaW1zX2NlcnRpZmljYXRlX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdiX2NhcF9nZXRfaW1zX2NlcnRpZmljYXRlX3Jlc3BvbnNlICpyZXNwb25zZTsKKwlzaXplX3QgbWF4X3NpemUgPSBnYl9vcGVyYXRpb25fZ2V0X3BheWxvYWRfc2l6ZV9tYXgoY29ubmVjdGlvbik7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3A7CisJaW50IHJldDsKKworCW9wID0gZ2Jfb3BlcmF0aW9uX2NyZWF0ZV9mbGFncyhjb25uZWN0aW9uLAorCQkJCSAgICAgICBHQl9DQVBfVFlQRV9HRVRfSU1TX0NFUlRJRklDQVRFLAorCQkJCSAgICAgICBzaXplb2YoKnJlcXVlc3QpLCBtYXhfc2l6ZSwKKwkJCQkgICAgICAgR0JfT1BFUkFUSU9OX0ZMQUdfU0hPUlRfUkVTUE9OU0UsCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghb3ApCisJCXJldHVybiAtRU5PTUVNOworCisJcmVxdWVzdCA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCXJlcXVlc3QtPmNlcnRpZmljYXRlX2NsYXNzID0gY3B1X3RvX2xlMzIoY2xhc3MpOworCXJlcXVlc3QtPmNlcnRpZmljYXRlX2lkID0gY3B1X3RvX2xlMzIoaWQpOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZF9zeW5jKG9wKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY2FwLT5wYXJlbnQsICJmYWlsZWQgdG8gZ2V0IGNlcnRpZmljYXRlICglZClcbiIsIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXNwb25zZSA9IG9wLT5yZXNwb25zZS0+cGF5bG9hZDsKKwkqcmVzdWx0ID0gcmVzcG9uc2UtPnJlc3VsdF9jb2RlOworCSpzaXplID0gb3AtPnJlc3BvbnNlLT5wYXlsb2FkX3NpemUgLSBzaXplb2YoKnJlc3BvbnNlKTsKKwltZW1jcHkoY2VydGlmaWNhdGUsIHJlc3BvbnNlLT5jZXJ0aWZpY2F0ZSwgKnNpemUpOworCitkb25lOgorCWdiX29wZXJhdGlvbl9wdXQob3ApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2FwX2F1dGhlbnRpY2F0ZShzdHJ1Y3QgZ2JfY2FwICpjYXAsIHUzMiBhdXRoX3R5cGUsIHU4ICp1aWQsCisJCQkgICAgdTggKmNoYWxsZW5nZSwgdTggKnJlc3VsdCwgdTggKmF1dGhfcmVzcG9uc2UsCisJCQkgICAgdTMyICpzaWduYXR1cmVfc2l6ZSwgdTggKnNpZ25hdHVyZSkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGNhcC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfY2FwX2F1dGhlbnRpY2F0ZV9yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBnYl9jYXBfYXV0aGVudGljYXRlX3Jlc3BvbnNlICpyZXNwb25zZTsKKwlzaXplX3QgbWF4X3NpemUgPSBnYl9vcGVyYXRpb25fZ2V0X3BheWxvYWRfc2l6ZV9tYXgoY29ubmVjdGlvbik7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3A7CisJaW50IHJldDsKKworCW9wID0gZ2Jfb3BlcmF0aW9uX2NyZWF0ZV9mbGFncyhjb25uZWN0aW9uLCBHQl9DQVBfVFlQRV9BVVRIRU5USUNBVEUsCisJCQkJICAgICAgIHNpemVvZigqcmVxdWVzdCksIG1heF9zaXplLAorCQkJCSAgICAgICBHQl9PUEVSQVRJT05fRkxBR19TSE9SVF9SRVNQT05TRSwKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFvcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXF1ZXN0ID0gb3AtPnJlcXVlc3QtPnBheWxvYWQ7CisJcmVxdWVzdC0+YXV0aF90eXBlID0gY3B1X3RvX2xlMzIoYXV0aF90eXBlKTsKKwltZW1jcHkocmVxdWVzdC0+dWlkLCB1aWQsIHNpemVvZihyZXF1ZXN0LT51aWQpKTsKKwltZW1jcHkocmVxdWVzdC0+Y2hhbGxlbmdlLCBjaGFsbGVuZ2UsIHNpemVvZihyZXF1ZXN0LT5jaGFsbGVuZ2UpKTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmRfc3luYyhvcCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNhcC0+cGFyZW50LCAiZmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSAoJWQpXG4iLCByZXQpOworCQlnb3RvIGRvbmU7CisJfQorCisJcmVzcG9uc2UgPSBvcC0+cmVzcG9uc2UtPnBheWxvYWQ7CisJKnJlc3VsdCA9IHJlc3BvbnNlLT5yZXN1bHRfY29kZTsKKwkqc2lnbmF0dXJlX3NpemUgPSBvcC0+cmVzcG9uc2UtPnBheWxvYWRfc2l6ZSAtIHNpemVvZigqcmVzcG9uc2UpOworCW1lbWNweShhdXRoX3Jlc3BvbnNlLCByZXNwb25zZS0+cmVzcG9uc2UsIHNpemVvZihyZXNwb25zZS0+cmVzcG9uc2UpKTsKKwltZW1jcHkoc2lnbmF0dXJlLCByZXNwb25zZS0+c2lnbmF0dXJlLCAqc2lnbmF0dXJlX3NpemUpOworCitkb25lOgorCWdiX29wZXJhdGlvbl9wdXQob3ApOworCXJldHVybiByZXQ7Cit9CisKKy8qIENoYXIgZGV2aWNlIGZvcHMgKi8KKworc3RhdGljIGludCBjYXBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZ2JfY2FwICpjYXAgPSBnZXRfY2FwKGlub2RlLT5pX2NkZXYpOworCisJLyogY2FwIHN0cnVjdHVyZSBjYW4ndCBnZXQgZnJlZWQgdW50aWwgZmlsZSBkZXNjcmlwdG9yIGlzIGNsb3NlZCAqLworCWlmIChjYXApIHsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FwOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBjYXBfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZ2JfY2FwICpjYXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlwdXRfY2FwKGNhcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FwX2lvY3RsKHN0cnVjdCBnYl9jYXAgKmNhcCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSB2b2lkIF9fdXNlciAqYnVmKQoreworCXN0cnVjdCBjYXBfaW9jX2dldF9lbmRwb2ludF91aWQgZW5kcG9pbnRfdWlkOworCXN0cnVjdCBjYXBfaW9jX2dldF9pbXNfY2VydGlmaWNhdGUgKmltc19jZXJ0OworCXN0cnVjdCBjYXBfaW9jX2F1dGhlbnRpY2F0ZSAqYXV0aGVudGljYXRlOworCXNpemVfdCBzaXplOworCWludCByZXQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQ0FQX0lPQ19HRVRfRU5EUE9JTlRfVUlEOgorCQlyZXQgPSBjYXBfZ2V0X2VuZHBvaW50X3VpZChjYXAsIGVuZHBvaW50X3VpZC51aWQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJmVuZHBvaW50X3VpZCwgc2l6ZW9mKGVuZHBvaW50X3VpZCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIDA7CisJY2FzZSBDQVBfSU9DX0dFVF9JTVNfQ0VSVElGSUNBVEU6CisJCXNpemUgPSBzaXplb2YoKmltc19jZXJ0KTsKKwkJaW1zX2NlcnQgPSBtZW1kdXBfdXNlcihidWYsIHNpemUpOworCQlpZiAoSVNfRVJSKGltc19jZXJ0KSkKKwkJCXJldHVybiBQVFJfRVJSKGltc19jZXJ0KTsKKworCQlyZXQgPSBjYXBfZ2V0X2ltc19jZXJ0aWZpY2F0ZShjYXAsIGltc19jZXJ0LT5jZXJ0aWZpY2F0ZV9jbGFzcywKKwkJCQkJICAgICAgaW1zX2NlcnQtPmNlcnRpZmljYXRlX2lkLAorCQkJCQkgICAgICBpbXNfY2VydC0+Y2VydGlmaWNhdGUsCisJCQkJCSAgICAgICZpbXNfY2VydC0+Y2VydF9zaXplLAorCQkJCQkgICAgICAmaW1zX2NlcnQtPnJlc3VsdF9jb2RlKTsKKwkJaWYgKCFyZXQgJiYgY29weV90b191c2VyKGJ1ZiwgaW1zX2NlcnQsIHNpemUpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJa2ZyZWUoaW1zX2NlcnQpOworCisJCXJldHVybiByZXQ7CisJY2FzZSBDQVBfSU9DX0FVVEhFTlRJQ0FURToKKwkJc2l6ZSA9IHNpemVvZigqYXV0aGVudGljYXRlKTsKKwkJYXV0aGVudGljYXRlID0gbWVtZHVwX3VzZXIoYnVmLCBzaXplKTsKKwkJaWYgKElTX0VSUihhdXRoZW50aWNhdGUpKQorCQkJcmV0dXJuIFBUUl9FUlIoYXV0aGVudGljYXRlKTsKKworCQlyZXQgPSBjYXBfYXV0aGVudGljYXRlKGNhcCwgYXV0aGVudGljYXRlLT5hdXRoX3R5cGUsCisJCQkJICAgICAgIGF1dGhlbnRpY2F0ZS0+dWlkLAorCQkJCSAgICAgICBhdXRoZW50aWNhdGUtPmNoYWxsZW5nZSwKKwkJCQkgICAgICAgJmF1dGhlbnRpY2F0ZS0+cmVzdWx0X2NvZGUsCisJCQkJICAgICAgIGF1dGhlbnRpY2F0ZS0+cmVzcG9uc2UsCisJCQkJICAgICAgICZhdXRoZW50aWNhdGUtPnNpZ25hdHVyZV9zaXplLAorCQkJCSAgICAgICBhdXRoZW50aWNhdGUtPnNpZ25hdHVyZSk7CisJCWlmICghcmV0ICYmIGNvcHlfdG9fdXNlcihidWYsIGF1dGhlbnRpY2F0ZSwgc2l6ZSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlrZnJlZShhdXRoZW50aWNhdGUpOworCisJCXJldHVybiByZXQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorfQorCitzdGF0aWMgbG9uZyBjYXBfaW9jdGxfdW5sb2NrZWQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGdiX2NhcCAqY2FwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IGNhcC0+Y29ubmVjdGlvbi0+YnVuZGxlOworCWludCByZXQgPSAtRU5PREVWOworCisJLyoKKwkgKiBTZXJpYWxpemUgaW9jdGxzLgorCSAqCisJICogV2UgZG9uJ3Qgd2FudCB0aGUgdXNlciB0byBkbyBtdWx0aXBsZSBhdXRoZW50aWNhdGlvbiBvcGVyYXRpb25zIGluCisJICogcGFyYWxsZWwuCisJICoKKwkgKiBUaGlzIGlzIGFsc28gdXNlZCB0byBwcm90ZWN0IC0+ZGlzYWJsZWQsIHdoaWNoIGlzIHVzZWQgdG8gY2hlY2sgaWYKKwkgKiB0aGUgY29ubmVjdGlvbiBpcyBnZXR0aW5nIGRpc2Nvbm5lY3RlZCwgc28gdGhhdCB3ZSBkb24ndCBzdGFydCBhbnkKKwkgKiBuZXcgb3BlcmF0aW9ucy4KKwkgKi8KKwltdXRleF9sb2NrKCZjYXAtPm11dGV4KTsKKwlpZiAoIWNhcC0+ZGlzYWJsZWQpIHsKKwkJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCQlpZiAoIXJldCkgeworCQkJcmV0ID0gY2FwX2lvY3RsKGNhcCwgY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworCQkJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmNhcC0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2FwX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGNhcF9vcGVuLAorCS5yZWxlYXNlCT0gY2FwX3JlbGVhc2UsCisJLnVubG9ja2VkX2lvY3RsCT0gY2FwX2lvY3RsX3VubG9ja2VkLAorfTsKKworaW50IGdiX2NhcF9jb25uZWN0aW9uX2luaXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IGdiX2NhcCAqY2FwOworCWludCByZXQsIG1pbm9yOworCisJaWYgKCFjb25uZWN0aW9uKQorCQlyZXR1cm4gMDsKKworCWNhcCA9IGt6YWxsb2Moc2l6ZW9mKCpjYXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljYXAtPnBhcmVudCA9ICZjb25uZWN0aW9uLT5idW5kbGUtPmRldjsKKwljYXAtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCW11dGV4X2luaXQoJmNhcC0+bXV0ZXgpOworCWdiX2Nvbm5lY3Rpb25fc2V0X2RhdGEoY29ubmVjdGlvbiwgY2FwKTsKKwlrcmVmX2luaXQoJmNhcC0+a3JlZik7CisKKwltdXRleF9sb2NrKCZsaXN0X211dGV4KTsKKwlsaXN0X2FkZCgmY2FwLT5ub2RlLCAmY2FwX2xpc3QpOworCW11dGV4X3VubG9jaygmbGlzdF9tdXRleCk7CisKKwlyZXQgPSBnYl9jb25uZWN0aW9uX2VuYWJsZShjb25uZWN0aW9uKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9saXN0X2RlbDsKKworCW1pbm9yID0gaWRhX3NpbXBsZV9nZXQoJmNhcF9taW5vcnNfbWFwLCAwLCBOVU1fTUlOT1JTLCBHRlBfS0VSTkVMKTsKKwlpZiAobWlub3IgPCAwKSB7CisJCXJldCA9IG1pbm9yOworCQlnb3RvIGVycl9jb25uZWN0aW9uX2Rpc2FibGU7CisJfQorCisJLyogQWRkIGEgY2hhciBkZXZpY2UgdG8gYWxsb3cgdXNlcnNwYWNlIHRvIGludGVyYWN0IHdpdGggY2FwICovCisJY2FwLT5kZXZfbnVtID0gTUtERVYoTUFKT1IoY2FwX2Rldl9udW0pLCBtaW5vcik7CisJY2Rldl9pbml0KCZjYXAtPmNkZXYsICZjYXBfZm9wcyk7CisKKwlyZXQgPSBjZGV2X2FkZCgmY2FwLT5jZGV2LCBjYXAtPmRldl9udW0sIDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3JlbW92ZV9pZGE7CisKKwkvKiBBZGQgYSBzb2Z0IGxpbmsgdG8gdGhlIHByZXZpb3VzbHkgYWRkZWQgY2hhci1kZXYgd2l0aGluIHRoZSBidW5kbGUgKi8KKwljYXAtPmNsYXNzX2RldmljZSA9IGRldmljZV9jcmVhdGUoY2FwX2NsYXNzLCBjYXAtPnBhcmVudCwgY2FwLT5kZXZfbnVtLAorCQkJCQkgIE5VTEwsICJnYi1hdXRoZW50aWNhdGUtJWQiLCBtaW5vcik7CisJaWYgKElTX0VSUihjYXAtPmNsYXNzX2RldmljZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihjYXAtPmNsYXNzX2RldmljZSk7CisJCWdvdG8gZXJyX2RlbF9jZGV2OworCX0KKworCXJldHVybiAwOworCitlcnJfZGVsX2NkZXY6CisJY2Rldl9kZWwoJmNhcC0+Y2Rldik7CitlcnJfcmVtb3ZlX2lkYToKKwlpZGFfc2ltcGxlX3JlbW92ZSgmY2FwX21pbm9yc19tYXAsIG1pbm9yKTsKK2Vycl9jb25uZWN0aW9uX2Rpc2FibGU6CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworZXJyX2xpc3RfZGVsOgorCW11dGV4X2xvY2soJmxpc3RfbXV0ZXgpOworCWxpc3RfZGVsKCZjYXAtPm5vZGUpOworCW11dGV4X3VubG9jaygmbGlzdF9tdXRleCk7CisKKwlwdXRfY2FwKGNhcCk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGdiX2NhcF9jb25uZWN0aW9uX2V4aXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IGdiX2NhcCAqY2FwOworCisJaWYgKCFjb25uZWN0aW9uKQorCQlyZXR1cm47CisKKwljYXAgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKGNvbm5lY3Rpb24pOworCisJZGV2aWNlX2Rlc3Ryb3koY2FwX2NsYXNzLCBjYXAtPmRldl9udW0pOworCWNkZXZfZGVsKCZjYXAtPmNkZXYpOworCWlkYV9zaW1wbGVfcmVtb3ZlKCZjYXBfbWlub3JzX21hcCwgTUlOT1IoY2FwLT5kZXZfbnVtKSk7CisKKwkvKgorCSAqIERpc2FsbG93IGFueSBuZXcgaW9jdGwgb3BlcmF0aW9ucyBvbiB0aGUgY2hhciBkZXZpY2UgYW5kIHdhaXQgZm9yCisJICogZXhpc3Rpbmcgb25lcyB0byBmaW5pc2guCisJICovCisJbXV0ZXhfbG9jaygmY2FwLT5tdXRleCk7CisJY2FwLT5kaXNhYmxlZCA9IHRydWU7CisJbXV0ZXhfdW5sb2NrKCZjYXAtPm11dGV4KTsKKworCS8qIEFsbCBwZW5kaW5nIGdyZXlidXMgb3BlcmF0aW9ucyBzaG91bGQgaGF2ZSBmaW5pc2hlZCBieSBub3cgKi8KKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY2FwLT5jb25uZWN0aW9uKTsKKworCS8qIERpc2FsbG93IG5ldyB1c2VycyB0byBnZXQgYWNjZXNzIHRvIHRoZSBjYXAgc3RydWN0dXJlICovCisJbXV0ZXhfbG9jaygmbGlzdF9tdXRleCk7CisJbGlzdF9kZWwoJmNhcC0+bm9kZSk7CisJbXV0ZXhfdW5sb2NrKCZsaXN0X211dGV4KTsKKworCS8qCisJICogQWxsIGN1cnJlbnQgdXNlcnMgb2YgY2FwIHdvdWxkIGhhdmUgdGFrZW4gYSByZWZlcmVuY2UgdG8gaXQgYnkKKwkgKiBub3csIHdlIGNhbiBkcm9wIG91ciByZWZlcmVuY2UgYW5kIHdhaXQgdGhlIGxhc3QgdXNlciB3aWxsIGdldAorCSAqIGNhcCBmcmVlZC4KKwkgKi8KKwlwdXRfY2FwKGNhcCk7Cit9CisKK2ludCBjYXBfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwljYXBfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJnYl9hdXRoZW50aWNhdGUiKTsKKwlpZiAoSVNfRVJSKGNhcF9jbGFzcykpCisJCXJldHVybiBQVFJfRVJSKGNhcF9jbGFzcyk7CisKKwlyZXQgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZjYXBfZGV2X251bSwgMCwgTlVNX01JTk9SUywKKwkJCQkgICJnYl9hdXRoZW50aWNhdGUiKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZW1vdmVfY2xhc3M7CisKKwlyZXR1cm4gMDsKKworZXJyX3JlbW92ZV9jbGFzczoKKwljbGFzc19kZXN0cm95KGNhcF9jbGFzcyk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBjYXBfZXhpdCh2b2lkKQoreworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihjYXBfZGV2X251bSwgTlVNX01JTk9SUyk7CisJY2xhc3NfZGVzdHJveShjYXBfY2xhc3MpOworCWlkYV9kZXN0cm95KCZjYXBfbWlub3JzX21hcCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ib290cm9tLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ib290cm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY5MDcyMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Jvb3Ryb20uYwpAQCAtMCwwICsxLDUyNCBAQAorLyoKKyAqIEJPT1RST00gR3JleWJ1cyBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE2IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlICJncmV5YnVzLmgiCisjaW5jbHVkZSAiZmlybXdhcmUuaCIKKworLyogVGltZW91dCwgaW4gamlmZmllcywgd2l0aGluIHdoaWNoIHRoZSBuZXh0IHJlcXVlc3QgbXVzdCBiZSByZWNlaXZlZCAqLworI2RlZmluZSBORVhUX1JFUV9USU1FT1VUX01TCTEwMDAKKworLyoKKyAqIEZJWE1FOiBSZWR1Y2UgdGhpcyB0aW1lb3V0IG9uY2Ugc3ZjIGNvcmUgaGFuZGxlcyBwYXJhbGxlbCBwcm9jZXNzaW5nIG9mCisgKiBldmVudHMgZnJvbSB0aGUgU1ZDLCB3aGljaCBhcmUgaGFuZGxlZCBzZXF1ZW50aWFsbHkgdG9kYXkuCisgKi8KKyNkZWZpbmUgTU9ERV9TV0lUQ0hfVElNRU9VVF9NUwkxMDAwMAorCitlbnVtIG5leHRfcmVxdWVzdF90eXBlIHsKKwlORVhUX1JFUV9GSVJNV0FSRV9TSVpFLAorCU5FWFRfUkVRX0dFVF9GSVJNV0FSRSwKKwlORVhUX1JFUV9SRUFEWV9UT19CT09ULAorCU5FWFRfUkVRX01PREVfU1dJVENILAorfTsKKworc3RydWN0IGdiX2Jvb3Ryb20geworCXN0cnVjdCBnYl9jb25uZWN0aW9uCSpjb25uZWN0aW9uOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZQkqZnc7CisJdTgJCQlwcm90b2NvbF9tYWpvcjsKKwl1OAkJCXByb3RvY29sX21pbm9yOworCWVudW0gbmV4dF9yZXF1ZXN0X3R5cGUJbmV4dF9yZXF1ZXN0OworCXN0cnVjdCBkZWxheWVkX3dvcmsJZHdvcms7CisJc3RydWN0IG11dGV4CQltdXRleDsgLyogUHJvdGVjdHMgYm9vdHJvbS0+ZncgKi8KK307CisKK3N0YXRpYyB2b2lkIGZyZWVfZmlybXdhcmUoc3RydWN0IGdiX2Jvb3Ryb20gKmJvb3Ryb20pCit7CisJaWYgKCFib290cm9tLT5mdykKKwkJcmV0dXJuOworCisJcmVsZWFzZV9maXJtd2FyZShib290cm9tLT5mdyk7CisJYm9vdHJvbS0+ZncgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBnYl9ib290cm9tX3RpbWVkb3V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKKwlzdHJ1Y3QgZ2JfYm9vdHJvbSAqYm9vdHJvbSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGdiX2Jvb3Ryb20sIGR3b3JrKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYm9vdHJvbS0+Y29ubmVjdGlvbi0+YnVuZGxlLT5kZXY7CisJY29uc3QgY2hhciAqcmVhc29uOworCisJc3dpdGNoIChib290cm9tLT5uZXh0X3JlcXVlc3QpIHsKKwljYXNlIE5FWFRfUkVRX0ZJUk1XQVJFX1NJWkU6CisJCXJlYXNvbiA9ICJGaXJtd2FyZSBTaXplIFJlcXVlc3QiOworCQlicmVhazsKKwljYXNlIE5FWFRfUkVRX0dFVF9GSVJNV0FSRToKKwkJcmVhc29uID0gIkdldCBGaXJtd2FyZSBSZXF1ZXN0IjsKKwkJYnJlYWs7CisJY2FzZSBORVhUX1JFUV9SRUFEWV9UT19CT09UOgorCQlyZWFzb24gPSAiUmVhZHkgdG8gQm9vdCBSZXF1ZXN0IjsKKwkJYnJlYWs7CisJY2FzZSBORVhUX1JFUV9NT0RFX1NXSVRDSDoKKwkJcmVhc29uID0gIkludGVyZmFjZSBNb2RlIFN3aXRjaCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlYXNvbiA9IE5VTEw7CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBuZXh0LXJlcXVlc3Q6ICV1IiwgYm9vdHJvbS0+bmV4dF9yZXF1ZXN0KTsKKwkJYnJlYWs7CisJfQorCisJZGV2X2VycihkZXYsICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgJXMgZnJvbSB0aGUgTW9kdWxlXG4iLCByZWFzb24pOworCisJbXV0ZXhfbG9jaygmYm9vdHJvbS0+bXV0ZXgpOworCWZyZWVfZmlybXdhcmUoYm9vdHJvbSk7CisJbXV0ZXhfdW5sb2NrKCZib290cm9tLT5tdXRleCk7CisKKwkvKiBUT0RPOiBQb3dlci1vZmYgTW9kdWxlID8gKi8KK30KKworc3RhdGljIHZvaWQgZ2JfYm9vdHJvbV9zZXRfdGltZW91dChzdHJ1Y3QgZ2JfYm9vdHJvbSAqYm9vdHJvbSwKKwkJCWVudW0gbmV4dF9yZXF1ZXN0X3R5cGUgbmV4dCwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCWJvb3Ryb20tPm5leHRfcmVxdWVzdCA9IG5leHQ7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZib290cm9tLT5kd29yaywgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2Jvb3Ryb21fY2FuY2VsX3RpbWVvdXQoc3RydWN0IGdiX2Jvb3Ryb20gKmJvb3Ryb20pCit7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZib290cm9tLT5kd29yayk7Cit9CisKKy8qCisgKiBUaGUgZXMyIGNoaXAgZG9lc24ndCBoYXZlIFZJRC9QSUQgcHJvZ3JhbW1lZCBpbnRvIHRoZSBoYXJkd2FyZSBhbmQgd2UgbmVlZCB0bworICogaGFjayB0aGF0IHVwIHRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBtb2R1bGVzIGFuZCB0aGVpciBmaXJtd2FyZSBibG9icy4KKyAqCisgKiBUaGlzIGZldGNoZXMgVklEL1BJRCAob3ZlciBib290cm9tIHByb3RvY29sKSBmb3IgZXMyIGNoaXAgb25seSwgd2hlbiBWSUQvUElECisgKiBhbHJlYWR5IHNlbnQgZHVyaW5nIGhvdHBsdWcgYXJlIDAuCisgKgorICogT3RoZXJ3aXNlLCB3ZSBrZWVwIGludGYtPnZlbmRvcl9pZC9wcm9kdWN0X2lkIHNhbWUgYXMgd2hhdCdzIHBhc3NlZAorICogZHVyaW5nIGhvdHBsdWcuCisgKi8KK3N0YXRpYyB2b2lkIGJvb3Ryb21fZXMyX2ZpeHVwX3ZpZF9waWQoc3RydWN0IGdiX2Jvb3Ryb20gKmJvb3Ryb20pCit7CisJc3RydWN0IGdiX2Jvb3Ryb21fZ2V0X3ZpZF9waWRfcmVzcG9uc2UgcmVzcG9uc2U7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBib290cm9tLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSBjb25uZWN0aW9uLT5idW5kbGUtPmludGY7CisJaW50IHJldDsKKworCWlmICghKGludGYtPnF1aXJrcyAmIEdCX0lOVEVSRkFDRV9RVUlSS19OT19HTVBfSURTKSkKKwkJcmV0dXJuOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfQk9PVFJPTV9UWVBFX0dFVF9WSURfUElELAorCQkJCU5VTEwsIDAsICZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCSJCb290cm9tIGdldCB2aWQvcGlkIG9wZXJhdGlvbiBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogTk9URTogVGhpcyBpcyBoYWNrZWQsIHNvIHRoYXQgdGhlIHNhbWUgdmFsdWVzIG9mIFZJRC9QSUQgY2FuIGJlIHVzZWQKKwkgKiBieSBuZXh0IGZpcm13YXJlIGxldmVsIGFzIHdlbGwuIFRoZSB1ZXZlbnQgZm9yIGJvb3Ryb20gd2lsbCBzdGlsbAorCSAqIGhhdmUgVklEL1BJRCBhcyAwLCB0aG91Z2ggYWZ0ZXIgdGhpcyBwb2ludCB0aGUgc3lzZnMgZmlsZXMgd2lsbCBzdGFydAorCSAqIHNob3dpbmcgdGhlIHVwZGF0ZWQgdmFsdWVzLiBCdXQgeWVhaCwgdGhhdCdzIGEgYml0IHJhY3kgYXMgdGhlIHNhbWUKKwkgKiBzeXNmcyBmaWxlcyB3b3VsZCBiZSBzaG93aW5nIDAgYmVmb3JlIHRoaXMgcG9pbnQuCisJICovCisJaW50Zi0+dmVuZG9yX2lkID0gbGUzMl90b19jcHUocmVzcG9uc2UudmVuZG9yX2lkKTsKKwlpbnRmLT5wcm9kdWN0X2lkID0gbGUzMl90b19jcHUocmVzcG9uc2UucHJvZHVjdF9pZCk7CisKKwlkZXZfZGJnKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwgIkJvb3Ryb20gZ290IHZpZCAoMHgleCkvcGlkICgweCV4KVxuIiwKKwkJaW50Zi0+dmVuZG9yX2lkLCBpbnRmLT5wcm9kdWN0X2lkKTsKK30KKworLyogVGhpcyByZXR1cm5zIHBhdGggb2YgdGhlIGZpcm13YXJlIGJsb2Igb24gdGhlIGRpc2sgKi8KK3N0YXRpYyBpbnQgZmluZF9maXJtd2FyZShzdHJ1Y3QgZ2JfYm9vdHJvbSAqYm9vdHJvbSwgdTggc3RhZ2UpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBib290cm9tLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSBjb25uZWN0aW9uLT5idW5kbGUtPmludGY7CisJY2hhciBmaXJtd2FyZV9uYW1lWzQ5XTsKKwlpbnQgcmM7CisKKwkvKiBBbHJlYWR5IGhhdmUgYSBmaXJtd2FyZSwgZnJlZSBpdCAqLworCWZyZWVfZmlybXdhcmUoYm9vdHJvbSk7CisKKwkvKiBCb290cm9tIHByb3RvY29sIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBsb2FkaW5nIFN0YWdlIDIgZmlybXdhcmUgKi8KKwlpZiAoc3RhZ2UgIT0gMikgeworCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwgIkludmFsaWQgYm9vdCBzdGFnZTogJXVcbiIsCisJCQlzdGFnZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogQ3JlYXRlIGZpcm13YXJlIG5hbWUKKwkgKgorCSAqIFhYWCBOYW1lIGl0IHByb3Blcmx5Li4KKwkgKi8KKwlzbnByaW50ZihmaXJtd2FyZV9uYW1lLCBzaXplb2YoZmlybXdhcmVfbmFtZSksCisJCSBGV19OQU1FX1BSRUZJWCAiJTA4eF8lMDh4XyUwOHhfJTA4eF9zMmwudGZ0ZiIsCisJCSBpbnRmLT5kZGJsMV9tYW51ZmFjdHVyZXJfaWQsIGludGYtPmRkYmwxX3Byb2R1Y3RfaWQsCisJCSBpbnRmLT52ZW5kb3JfaWQsIGludGYtPnByb2R1Y3RfaWQpOworCisJLy8gRklYTUU6CisJLy8gVHVybiB0byBkZXZfZGJnIGxhdGVyIGFmdGVyIGV2ZXJ5b25lIGhhcyB2YWxpZCBib290bG9hZGVycyB3aXRoIGdvb2QKKwkvLyBpZHMsIGJ1dCBsZWF2ZSB0aGlzIGFzIGRldl9pbmZvIGZvciBub3cgdG8gbWFrZSBpdCBlYXNpZXIgdG8gdHJhY2sKKwkvLyBkb3duICJlbXB0eSIgdmlkL3BpZCBtb2R1bGVzLgorCWRldl9pbmZvKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwgIkZpcm13YXJlIGZpbGUgJyVzJyByZXF1ZXN0ZWRcbiIsCisJCSBmaXJtd2FyZV9uYW1lKTsKKworCXJjID0gcmVxdWVzdF9maXJtd2FyZSgmYm9vdHJvbS0+ZncsIGZpcm13YXJlX25hbWUsCisJCSZjb25uZWN0aW9uLT5idW5kbGUtPmRldik7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJImZhaWxlZCB0byBmaW5kICVzIGZpcm13YXJlICglZClcbiIsIGZpcm13YXJlX25hbWUsIHJjKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ2JfYm9vdHJvbV9maXJtd2FyZV9zaXplX3JlcXVlc3Qoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2Jvb3Ryb20gKmJvb3Ryb20gPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKG9wLT5jb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2JfYm9vdHJvbV9maXJtd2FyZV9zaXplX3JlcXVlc3QgKnNpemVfcmVxdWVzdCA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCXN0cnVjdCBnYl9ib290cm9tX2Zpcm13YXJlX3NpemVfcmVzcG9uc2UgKnNpemVfcmVzcG9uc2U7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJm9wLT5jb25uZWN0aW9uLT5idW5kbGUtPmRldjsKKwlpbnQgcmV0OworCisJLyogRGlzYWJsZSB0aW1lb3V0cyAqLworCWdiX2Jvb3Ryb21fY2FuY2VsX3RpbWVvdXQoYm9vdHJvbSk7CisKKwlpZiAob3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSAhPSBzaXplb2YoKnNpemVfcmVxdWVzdCkpIHsKKwkJZGV2X2VycihkZXYsICIlczogaWxsZWdhbCBzaXplIG9mIGZpcm13YXJlIHNpemUgcmVxdWVzdCAoJXp1ICE9ICV6dSlcbiIsCisJCQlfX2Z1bmNfXywgb3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSwKKwkJCXNpemVvZigqc2l6ZV9yZXF1ZXN0KSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gcXVldWVfd29yazsKKwl9CisKKwltdXRleF9sb2NrKCZib290cm9tLT5tdXRleCk7CisKKwlyZXQgPSBmaW5kX2Zpcm13YXJlKGJvb3Ryb20sIHNpemVfcmVxdWVzdC0+c3RhZ2UpOworCWlmIChyZXQpCisJCWdvdG8gdW5sb2NrOworCisJaWYgKCFnYl9vcGVyYXRpb25fcmVzcG9uc2VfYWxsb2Mob3AsIHNpemVvZigqc2l6ZV9yZXNwb25zZSksCisJCQkJCSBHRlBfS0VSTkVMKSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiBlcnJvciBhbGxvY2F0aW5nIHJlc3BvbnNlXG4iLCBfX2Z1bmNfXyk7CisJCWZyZWVfZmlybXdhcmUoYm9vdHJvbSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gdW5sb2NrOworCX0KKworCXNpemVfcmVzcG9uc2UgPSBvcC0+cmVzcG9uc2UtPnBheWxvYWQ7CisJc2l6ZV9yZXNwb25zZS0+c2l6ZSA9IGNwdV90b19sZTMyKGJvb3Ryb20tPmZ3LT5zaXplKTsKKworCWRldl9kYmcoZGV2LCAiJXM6IGZpcm13YXJlIHNpemUgJWQgYnl0ZXNcbiIsIF9fZnVuY19fLCBzaXplX3Jlc3BvbnNlLT5zaXplKTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmYm9vdHJvbS0+bXV0ZXgpOworCitxdWV1ZV93b3JrOgorCWlmICghcmV0KSB7CisJCS8qIFJlZnJlc2ggdGltZW91dCAqLworCQlnYl9ib290cm9tX3NldF90aW1lb3V0KGJvb3Ryb20sIE5FWFRfUkVRX0dFVF9GSVJNV0FSRSwKKwkJCQkgICAgICAgTkVYVF9SRVFfVElNRU9VVF9NUyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9ib290cm9tX2dldF9maXJtd2FyZShzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2JfYm9vdHJvbSAqYm9vdHJvbSA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEob3AtPmNvbm5lY3Rpb24pOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJc3RydWN0IGdiX2Jvb3Ryb21fZ2V0X2Zpcm13YXJlX3JlcXVlc3QgKmZpcm13YXJlX3JlcXVlc3Q7CisJc3RydWN0IGdiX2Jvb3Ryb21fZ2V0X2Zpcm13YXJlX3Jlc3BvbnNlICpmaXJtd2FyZV9yZXNwb25zZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmb3AtPmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2OworCXVuc2lnbmVkIGludCBvZmZzZXQsIHNpemU7CisJZW51bSBuZXh0X3JlcXVlc3RfdHlwZSBuZXh0X3JlcXVlc3Q7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIHRpbWVvdXRzICovCisJZ2JfYm9vdHJvbV9jYW5jZWxfdGltZW91dChib290cm9tKTsKKworCWlmIChvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplICE9IHNpemVvZigqZmlybXdhcmVfcmVxdWVzdCkpIHsKKwkJZGV2X2VycihkZXYsICIlczogSWxsZWdhbCBzaXplIG9mIGdldCBmaXJtd2FyZSByZXF1ZXN0ICglenUgJXp1KVxuIiwKKwkJCV9fZnVuY19fLCBvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplLAorCQkJc2l6ZW9mKCpmaXJtd2FyZV9yZXF1ZXN0KSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gcXVldWVfd29yazsKKwl9CisKKwltdXRleF9sb2NrKCZib290cm9tLT5tdXRleCk7CisKKwlmdyA9IGJvb3Ryb20tPmZ3OworCWlmICghZncpIHsKKwkJZGV2X2VycihkZXYsICIlczogZmlybXdhcmUgbm90IGF2YWlsYWJsZVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlmaXJtd2FyZV9yZXF1ZXN0ID0gb3AtPnJlcXVlc3QtPnBheWxvYWQ7CisJb2Zmc2V0ID0gbGUzMl90b19jcHUoZmlybXdhcmVfcmVxdWVzdC0+b2Zmc2V0KTsKKwlzaXplID0gbGUzMl90b19jcHUoZmlybXdhcmVfcmVxdWVzdC0+c2l6ZSk7CisKKwlpZiAob2Zmc2V0ID49IGZ3LT5zaXplIHx8IHNpemUgPiBmdy0+c2l6ZSAtIG9mZnNldCkgeworCQlkZXZfd2FybihkZXYsICJiYWQgZmlybXdhcmUgcmVxdWVzdCAob2ZmcyA9ICV1LCBzaXplID0gJXUpXG4iLAorCQkJCW9mZnNldCwgc2l6ZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWlmICghZ2Jfb3BlcmF0aW9uX3Jlc3BvbnNlX2FsbG9jKG9wLCBzaXplb2YoKmZpcm13YXJlX3Jlc3BvbnNlKSArIHNpemUsCisJCQkJCSBHRlBfS0VSTkVMKSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiBlcnJvciBhbGxvY2F0aW5nIHJlc3BvbnNlXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gdW5sb2NrOworCX0KKworCWZpcm13YXJlX3Jlc3BvbnNlID0gb3AtPnJlc3BvbnNlLT5wYXlsb2FkOworCW1lbWNweShmaXJtd2FyZV9yZXNwb25zZS0+ZGF0YSwgZnctPmRhdGEgKyBvZmZzZXQsIHNpemUpOworCisJZGV2X2RiZyhkZXYsICJyZXNwb25kaW5nIHdpdGggZmlybXdhcmUgKG9mZnMgPSAldSwgc2l6ZSA9ICV1KVxuIiwgb2Zmc2V0LAorCQlzaXplKTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmYm9vdHJvbS0+bXV0ZXgpOworCitxdWV1ZV93b3JrOgorCS8qIFJlZnJlc2ggdGltZW91dCAqLworCWlmICghcmV0ICYmIChvZmZzZXQgKyBzaXplID09IGZ3LT5zaXplKSkKKwkJbmV4dF9yZXF1ZXN0ID0gTkVYVF9SRVFfUkVBRFlfVE9fQk9PVDsKKwllbHNlCisJCW5leHRfcmVxdWVzdCA9IE5FWFRfUkVRX0dFVF9GSVJNV0FSRTsKKworCWdiX2Jvb3Ryb21fc2V0X3RpbWVvdXQoYm9vdHJvbSwgbmV4dF9yZXF1ZXN0LCBORVhUX1JFUV9USU1FT1VUX01TKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfYm9vdHJvbV9yZWFkeV90b19ib290KHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3AtPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX2Jvb3Ryb20gKmJvb3Ryb20gPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKGNvbm5lY3Rpb24pOworCXN0cnVjdCBnYl9ib290cm9tX3JlYWR5X3RvX2Jvb3RfcmVxdWVzdCAqcnRiX3JlcXVlc3Q7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2OworCXU4IHN0YXR1czsKKwlpbnQgcmV0ID0gMDsKKworCS8qIERpc2FibGUgdGltZW91dHMgKi8KKwlnYl9ib290cm9tX2NhbmNlbF90aW1lb3V0KGJvb3Ryb20pOworCisJaWYgKG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUgIT0gc2l6ZW9mKCpydGJfcmVxdWVzdCkpIHsKKwkJZGV2X2VycihkZXYsICIlczogSWxsZWdhbCBzaXplIG9mIHJlYWR5IHRvIGJvb3QgcmVxdWVzdCAoJXp1ICV6dSlcbiIsCisJCQlfX2Z1bmNfXywgb3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSwKKwkJCXNpemVvZigqcnRiX3JlcXVlc3QpKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBxdWV1ZV93b3JrOworCX0KKworCXJ0Yl9yZXF1ZXN0ID0gb3AtPnJlcXVlc3QtPnBheWxvYWQ7CisJc3RhdHVzID0gcnRiX3JlcXVlc3QtPnN0YXR1czsKKworCS8qIFJldHVybiBlcnJvciBpZiB0aGUgYmxvYiB3YXMgaW52YWxpZCAqLworCWlmIChzdGF0dXMgPT0gR0JfQk9PVFJPTV9CT09UX1NUQVRVU19JTlZBTElEKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gcXVldWVfd29yazsKKwl9CisKKwkvKgorCSAqIFhYWCBTaG91bGQgd2UgcmV0dXJuIGVycm9yIGZvciBpbnNlY3VyZSBmaXJtd2FyZT8KKwkgKi8KKwlkZXZfZGJnKGRldiwgInJlYWR5IHRvIGJvb3Q6IDB4JXgsIDBcbiIsIHN0YXR1cyk7CisKK3F1ZXVlX3dvcms6CisJLyoKKwkgKiBSZWZyZXNoIHRpbWVvdXQsIHRoZSBJbnRlcmZhY2Ugc2hhbGwgbG9hZCB0aGUgbmV3IHBlcnNvbmFsaXR5IGFuZAorCSAqIHNlbmQgYSBuZXcgaG90cGx1ZyByZXF1ZXN0LCB3aGljaCBzaGFsbCBnZXQgcmlkIG9mIHRoZSBib290cm9tCisJICogY29ubmVjdGlvbi4gQXMgdGhhdCBjYW4gdGFrZSBzb21lIHRpbWUsIGluY3JlYXNlIHRoZSB0aW1lb3V0IGEgYml0LgorCSAqLworCWdiX2Jvb3Ryb21fc2V0X3RpbWVvdXQoYm9vdHJvbSwgTkVYVF9SRVFfTU9ERV9TV0lUQ0gsCisJCQkgICAgICAgTU9ERV9TV0lUQ0hfVElNRU9VVF9NUyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2Jvb3Ryb21fcmVxdWVzdF9oYW5kbGVyKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wKQoreworCXU4IHR5cGUgPSBvcC0+dHlwZTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgR0JfQk9PVFJPTV9UWVBFX0ZJUk1XQVJFX1NJWkU6CisJCXJldHVybiBnYl9ib290cm9tX2Zpcm13YXJlX3NpemVfcmVxdWVzdChvcCk7CisJY2FzZSBHQl9CT09UUk9NX1RZUEVfR0VUX0ZJUk1XQVJFOgorCQlyZXR1cm4gZ2JfYm9vdHJvbV9nZXRfZmlybXdhcmUob3ApOworCWNhc2UgR0JfQk9PVFJPTV9UWVBFX1JFQURZX1RPX0JPT1Q6CisJCXJldHVybiBnYl9ib290cm9tX3JlYWR5X3RvX2Jvb3Qob3ApOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJm9wLT5jb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCSJ1bnN1cHBvcnRlZCByZXF1ZXN0OiAldVxuIiwgdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBnYl9ib290cm9tX2dldF92ZXJzaW9uKHN0cnVjdCBnYl9ib290cm9tICpib290cm9tKQoreworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IGJvb3Ryb20tPmNvbm5lY3Rpb24tPmJ1bmRsZTsKKwlzdHJ1Y3QgZ2JfYm9vdHJvbV92ZXJzaW9uX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfYm9vdHJvbV92ZXJzaW9uX3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQ7CisKKwlyZXF1ZXN0Lm1ham9yID0gR0JfQk9PVFJPTV9WRVJTSU9OX01BSk9SOworCXJlcXVlc3QubWlub3IgPSBHQl9CT09UUk9NX1ZFUlNJT05fTUlOT1I7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhib290cm9tLT5jb25uZWN0aW9uLAorCQkJCUdCX0JPT1RST01fVFlQRV9WRVJTSU9OLAorCQkJCSZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksICZyZXNwb25zZSwKKwkJCQlzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmJ1bmRsZS0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gZ2V0IHByb3RvY29sIHZlcnNpb246ICVkXG4iLAorCQkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHJlc3BvbnNlLm1ham9yID4gcmVxdWVzdC5tYWpvcikgeworCQlkZXZfZXJyKCZidW5kbGUtPmRldiwKKwkJCQkidW5zdXBwb3J0ZWQgbWFqb3IgcHJvdG9jb2wgdmVyc2lvbiAoJXUgPiAldSlcbiIsCisJCQkJcmVzcG9uc2UubWFqb3IsIHJlcXVlc3QubWFqb3IpOworCQlyZXR1cm4gLUVOT1RTVVBQOworCX0KKworCWJvb3Ryb20tPnByb3RvY29sX21ham9yID0gcmVzcG9uc2UubWFqb3I7CisJYm9vdHJvbS0+cHJvdG9jb2xfbWlub3IgPSByZXNwb25zZS5taW5vcjsKKworCWRldl9kYmcoJmJ1bmRsZS0+ZGV2LCAiJXMgLSAldS4ldVxuIiwgX19mdW5jX18sIHJlc3BvbnNlLm1ham9yLAorCQkJcmVzcG9uc2UubWlub3IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfYm9vdHJvbV9wcm9iZShzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsCisJCQkJCWNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCAqaWQpCit7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9jcG9ydCAqY3BvcnRfZGVzYzsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfYm9vdHJvbSAqYm9vdHJvbTsKKwlpbnQgcmV0OworCisJaWYgKGJ1bmRsZS0+bnVtX2Nwb3J0cyAhPSAxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNwb3J0X2Rlc2MgPSAmYnVuZGxlLT5jcG9ydF9kZXNjWzBdOworCWlmIChjcG9ydF9kZXNjLT5wcm90b2NvbF9pZCAhPSBHUkVZQlVTX1BST1RPQ09MX0JPT1RST00pCisJCXJldHVybiAtRU5PREVWOworCisJYm9vdHJvbSA9IGt6YWxsb2Moc2l6ZW9mKCpib290cm9tKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFib290cm9tKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbm5lY3Rpb24gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZShidW5kbGUsCisJCQkJCQlsZTE2X3RvX2NwdShjcG9ydF9kZXNjLT5pZCksCisJCQkJCQlnYl9ib290cm9tX3JlcXVlc3RfaGFuZGxlcik7CisJaWYgKElTX0VSUihjb25uZWN0aW9uKSkgeworCQlyZXQgPSBQVFJfRVJSKGNvbm5lY3Rpb24pOworCQlnb3RvIGVycl9mcmVlX2Jvb3Ryb207CisJfQorCisJZ2JfY29ubmVjdGlvbl9zZXRfZGF0YShjb25uZWN0aW9uLCBib290cm9tKTsKKworCWJvb3Ryb20tPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCisJbXV0ZXhfaW5pdCgmYm9vdHJvbS0+bXV0ZXgpOworCUlOSVRfREVMQVlFRF9XT1JLKCZib290cm9tLT5kd29yaywgZ2JfYm9vdHJvbV90aW1lZG91dCk7CisJZ3JleWJ1c19zZXRfZHJ2ZGF0YShidW5kbGUsIGJvb3Ryb20pOworCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGVfdHgoY29ubmVjdGlvbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfY29ubmVjdGlvbl9kZXN0cm95OworCisJcmV0ID0gZ2JfYm9vdHJvbV9nZXRfdmVyc2lvbihib290cm9tKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9jb25uZWN0aW9uX2Rpc2FibGU7CisKKwlib290cm9tX2VzMl9maXh1cF92aWRfcGlkKGJvb3Ryb20pOworCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfY29ubmVjdGlvbl9kaXNhYmxlOworCisJLyogUmVmcmVzaCB0aW1lb3V0ICovCisJZ2JfYm9vdHJvbV9zZXRfdGltZW91dChib290cm9tLCBORVhUX1JFUV9GSVJNV0FSRV9TSVpFLAorCQkJICAgICAgIE5FWFRfUkVRX1RJTUVPVVRfTVMpOworCisJLyogVGVsbCBib290cm9tIHdlJ3JlIHJlYWR5LiAqLworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0JPT1RST01fVFlQRV9BUF9SRUFEWSwgTlVMTCwgMCwKKwkJCQlOVUxMLCAwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gc2VuZCBBUCBSRUFEWTogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2NhbmNlbF90aW1lb3V0OworCX0KKworCWRldl9kYmcoJmJ1bmRsZS0+ZGV2LCAiQVBfUkVBRFkgc2VudFxuIik7CisKKwlyZXR1cm4gMDsKKworZXJyX2NhbmNlbF90aW1lb3V0OgorCWdiX2Jvb3Ryb21fY2FuY2VsX3RpbWVvdXQoYm9vdHJvbSk7CitlcnJfY29ubmVjdGlvbl9kaXNhYmxlOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKK2Vycl9jb25uZWN0aW9uX2Rlc3Ryb3k6CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGNvbm5lY3Rpb24pOworZXJyX2ZyZWVfYm9vdHJvbToKKwlrZnJlZShib290cm9tKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2Jvb3Ryb21fZGlzY29ubmVjdChzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpCit7CisJc3RydWN0IGdiX2Jvb3Ryb20gKmJvb3Ryb20gPSBncmV5YnVzX2dldF9kcnZkYXRhKGJ1bmRsZSk7CisKKwlkZXZfZGJnKCZidW5kbGUtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoYm9vdHJvbS0+Y29ubmVjdGlvbik7CisKKwkvKiBEaXNhYmxlIHRpbWVvdXRzICovCisJZ2JfYm9vdHJvbV9jYW5jZWxfdGltZW91dChib290cm9tKTsKKworCS8qCisJICogUmVsZWFzZSBmaXJtd2FyZToKKwkgKgorCSAqIEFzIHRoZSBjb25uZWN0aW9uIGFuZCB0aGUgZGVsYXllZCB3b3JrIGFyZSBhbHJlYWR5IGRpc2FibGVkLCB3ZSBkb24ndAorCSAqIG5lZWQgdG8gbG9jayBhY2Nlc3MgdG8gYm9vdHJvbS0+ZncgaGVyZS4KKwkgKi8KKwlmcmVlX2Zpcm13YXJlKGJvb3Ryb20pOworCisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGJvb3Ryb20tPmNvbm5lY3Rpb24pOworCWtmcmVlKGJvb3Ryb20pOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkIGdiX2Jvb3Ryb21faWRfdGFibGVbXSA9IHsKKwl7IEdSRVlCVVNfREVWSUNFX0NMQVNTKEdSRVlCVVNfQ0xBU1NfQk9PVFJPTSkgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3JleWJ1c19kcml2ZXIgZ2JfYm9vdHJvbV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImJvb3Ryb20iLAorCS5wcm9iZQkJPSBnYl9ib290cm9tX3Byb2JlLAorCS5kaXNjb25uZWN0CT0gZ2JfYm9vdHJvbV9kaXNjb25uZWN0LAorCS5pZF90YWJsZQk9IGdiX2Jvb3Ryb21faWRfdGFibGUsCit9OworCittb2R1bGVfZ3JleWJ1c19kcml2ZXIoZ2JfYm9vdHJvbV9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9idW5kbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2J1bmRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZWY1N2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9idW5kbGUuYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIEdyZXlidXMgYnVuZGxlcworICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImdyZXlidXNfdHJhY2UuaCIKKworc3RhdGljIHNzaXplX3QgYnVuZGxlX2NsYXNzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IHRvX2diX2J1bmRsZShkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBidW5kbGUtPmNsYXNzKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhidW5kbGVfY2xhc3MpOworCitzdGF0aWMgc3NpemVfdCBidW5kbGVfaWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IHRvX2diX2J1bmRsZShkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGJ1bmRsZS0+aWQpOworfQorc3RhdGljIERFVklDRV9BVFRSX1JPKGJ1bmRsZV9pZCk7CisKK3N0YXRpYyBzc2l6ZV90IHN0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IHRvX2diX2J1bmRsZShkZXYpOworCisJaWYgKGJ1bmRsZS0+c3RhdGUgPT0gTlVMTCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiXG4iKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBidW5kbGUtPnN0YXRlKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RhdGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlID0gdG9fZ2JfYnVuZGxlKGRldik7CisKKwlrZnJlZShidW5kbGUtPnN0YXRlKTsKKwlidW5kbGUtPnN0YXRlID0ga3N0cmR1cChidWYsIEdGUF9LRVJORUwpOworCWlmICghYnVuZGxlLT5zdGF0ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBUZWxsIHVzZXJzcGFjZSB0aGF0IHRoZSBmaWxlIGNvbnRlbnRzIGNoYW5nZWQgKi8KKwlzeXNmc19ub3RpZnkoJmJ1bmRsZS0+ZGV2LmtvYmosIE5VTEwsICJzdGF0ZSIpOworCisJcmV0dXJuIHNpemU7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUlcoc3RhdGUpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYnVuZGxlX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2J1bmRsZV9jbGFzcy5hdHRyLAorCSZkZXZfYXR0cl9idW5kbGVfaWQuYXR0ciwKKwkmZGV2X2F0dHJfc3RhdGUuYXR0ciwKKwlOVUxMLAorfTsKKworQVRUUklCVVRFX0dST1VQUyhidW5kbGUpOworCitzdGF0aWMgc3RydWN0IGdiX2J1bmRsZSAqZ2JfYnVuZGxlX2ZpbmQoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQkJCQl1OCBidW5kbGVfaWQpCit7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShidW5kbGUsICZpbnRmLT5idW5kbGVzLCBsaW5rcykgeworCQlpZiAoYnVuZGxlLT5pZCA9PSBidW5kbGVfaWQpCisJCQlyZXR1cm4gYnVuZGxlOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBnYl9idW5kbGVfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlID0gdG9fZ2JfYnVuZGxlKGRldik7CisKKwl0cmFjZV9nYl9idW5kbGVfcmVsZWFzZShidW5kbGUpOworCisJa2ZyZWUoYnVuZGxlLT5zdGF0ZSk7CisJa2ZyZWUoYnVuZGxlLT5jcG9ydF9kZXNjKTsKKwlrZnJlZShidW5kbGUpOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgdm9pZCBnYl9idW5kbGVfZGlzYWJsZV9hbGxfY29ubmVjdGlvbnMoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0aW9uLCAmYnVuZGxlLT5jb25uZWN0aW9ucywgYnVuZGxlX2xpbmtzKQorCQlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2J1bmRsZV9lbmFibGVfYWxsX2Nvbm5lY3Rpb25zKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdGlvbiwgJmJ1bmRsZS0+Y29ubmVjdGlvbnMsIGJ1bmRsZV9saW5rcykKKwkJZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyBpbnQgZ2JfYnVuZGxlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IHRvX2diX2J1bmRsZShkZXYpOworCWNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzICpwbSA9IGRldi0+ZHJpdmVyLT5wbTsKKwlpbnQgcmV0OworCisJaWYgKHBtICYmIHBtLT5ydW50aW1lX3N1c3BlbmQpIHsKKwkJcmV0ID0gcG0tPnJ1bnRpbWVfc3VzcGVuZCgmYnVuZGxlLT5kZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlnYl9idW5kbGVfZGlzYWJsZV9hbGxfY29ubmVjdGlvbnMoYnVuZGxlKTsKKwl9CisKKwlyZXQgPSBnYl9jb250cm9sX2J1bmRsZV9zdXNwZW5kKGJ1bmRsZS0+aW50Zi0+Y29udHJvbCwgYnVuZGxlLT5pZCk7CisJaWYgKHJldCkgeworCQlpZiAocG0gJiYgcG0tPnJ1bnRpbWVfcmVzdW1lKQorCQkJcmV0ID0gcG0tPnJ1bnRpbWVfcmVzdW1lKGRldik7CisJCWVsc2UKKwkJCWdiX2J1bmRsZV9lbmFibGVfYWxsX2Nvbm5lY3Rpb25zKGJ1bmRsZSk7CisKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9idW5kbGVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSB0b19nYl9idW5kbGUoZGV2KTsKKwljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG0gPSBkZXYtPmRyaXZlci0+cG07CisJaW50IHJldDsKKworCXJldCA9IGdiX2NvbnRyb2xfYnVuZGxlX3Jlc3VtZShidW5kbGUtPmludGYtPmNvbnRyb2wsIGJ1bmRsZS0+aWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAocG0gJiYgcG0tPnJ1bnRpbWVfcmVzdW1lKSB7CisJCXJldCA9IHBtLT5ydW50aW1lX3Jlc3VtZShkZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlnYl9idW5kbGVfZW5hYmxlX2FsbF9jb25uZWN0aW9ucyhidW5kbGUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2J1bmRsZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGRldik7CisJcG1fcmVxdWVzdF9hdXRvc3VzcGVuZChkZXYpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGdiX2J1bmRsZV9wbV9vcHMgPSB7CisJU0VUX1JVTlRJTUVfUE1fT1BTKGdiX2J1bmRsZV9zdXNwZW5kLCBnYl9idW5kbGVfcmVzdW1lLCBnYl9idW5kbGVfaWRsZSkKK307CisKK3N0cnVjdCBkZXZpY2VfdHlwZSBncmV5YnVzX2J1bmRsZV90eXBlID0geworCS5uYW1lID0JCSJncmV5YnVzX2J1bmRsZSIsCisJLnJlbGVhc2UgPQlnYl9idW5kbGVfcmVsZWFzZSwKKwkucG0gPQkJJmdiX2J1bmRsZV9wbV9vcHMsCit9OworCisvKgorICogQ3JlYXRlIGEgZ2JfYnVuZGxlIHN0cnVjdHVyZSB0byByZXByZXNlbnQgYSBkaXNjb3ZlcmVkCisgKiBidW5kbGUuICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV3IGJ1bmRsZSBvciBhIG51bGwKKyAqIHBvaW50ZXIgaWYgYSBmYWlsdXJlIG9jY3VycyBkdWUgdG8gbWVtb3J5IGV4aGF1c3Rpb24uCisgKi8KK3N0cnVjdCBnYl9idW5kbGUgKmdiX2J1bmRsZV9jcmVhdGUoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiwgdTggYnVuZGxlX2lkLAorCQkJCSAgIHU4IGNsYXNzKQoreworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZTsKKworCWlmIChidW5kbGVfaWQgPT0gQlVORExFX0lEX05PTkUpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiY2FuJ3QgdXNlIGJ1bmRsZSBpZCAldVxuIiwgYnVuZGxlX2lkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkgKiBSZWplY3QgYW55IGF0dGVtcHQgdG8gcmV1c2UgYSBidW5kbGUgaWQuICBXZSBpbml0aWFsaXplCisJICogdGhlc2Ugc2VyaWFsbHksIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byB3b3JyeSBhYm91dCBrZWVwaW5nCisJICogdGhlIGludGVyZmFjZSBidW5kbGUgbGlzdCBsb2NrZWQgaGVyZS4KKwkgKi8KKwlpZiAoZ2JfYnVuZGxlX2ZpbmQoaW50ZiwgYnVuZGxlX2lkKSkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJkdXBsaWNhdGUgYnVuZGxlIGlkICV1XG4iLCBidW5kbGVfaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlidW5kbGUgPSBremFsbG9jKHNpemVvZigqYnVuZGxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidW5kbGUpCisJCXJldHVybiBOVUxMOworCisJYnVuZGxlLT5pbnRmID0gaW50ZjsKKwlidW5kbGUtPmlkID0gYnVuZGxlX2lkOworCWJ1bmRsZS0+Y2xhc3MgPSBjbGFzczsKKwlJTklUX0xJU1RfSEVBRCgmYnVuZGxlLT5jb25uZWN0aW9ucyk7CisKKwlidW5kbGUtPmRldi5wYXJlbnQgPSAmaW50Zi0+ZGV2OworCWJ1bmRsZS0+ZGV2LmJ1cyA9ICZncmV5YnVzX2J1c190eXBlOworCWJ1bmRsZS0+ZGV2LnR5cGUgPSAmZ3JleWJ1c19idW5kbGVfdHlwZTsKKwlidW5kbGUtPmRldi5ncm91cHMgPSBidW5kbGVfZ3JvdXBzOworCWJ1bmRsZS0+ZGV2LmRtYV9tYXNrID0gaW50Zi0+ZGV2LmRtYV9tYXNrOworCWRldmljZV9pbml0aWFsaXplKCZidW5kbGUtPmRldik7CisJZGV2X3NldF9uYW1lKCZidW5kbGUtPmRldiwgIiVzLiVkIiwgZGV2X25hbWUoJmludGYtPmRldiksIGJ1bmRsZV9pZCk7CisKKwlsaXN0X2FkZCgmYnVuZGxlLT5saW5rcywgJmludGYtPmJ1bmRsZXMpOworCisJdHJhY2VfZ2JfYnVuZGxlX2NyZWF0ZShidW5kbGUpOworCisJcmV0dXJuIGJ1bmRsZTsKK30KKworaW50IGdiX2J1bmRsZV9hZGQoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBkZXZpY2VfYWRkKCZidW5kbGUtPmRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZidW5kbGUtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBidW5kbGU6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXRyYWNlX2diX2J1bmRsZV9hZGQoYnVuZGxlKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGVhciBkb3duIGEgcHJldmlvdXNseSBzZXQgdXAgYnVuZGxlLgorICovCit2b2lkIGdiX2J1bmRsZV9kZXN0cm95KHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwl0cmFjZV9nYl9idW5kbGVfZGVzdHJveShidW5kbGUpOworCisJaWYgKGRldmljZV9pc19yZWdpc3RlcmVkKCZidW5kbGUtPmRldikpCisJCWRldmljZV9kZWwoJmJ1bmRsZS0+ZGV2KTsKKworCWxpc3RfZGVsKCZidW5kbGUtPmxpbmtzKTsKKworCXB1dF9kZXZpY2UoJmJ1bmRsZS0+ZGV2KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2J1bmRsZS5oIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYnVuZGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzNDkxZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2J1bmRsZS5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBHcmV5YnVzIGJ1bmRsZXMKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaWZuZGVmIF9fQlVORExFX0gKKyNkZWZpbmUgX19CVU5ETEVfSAorCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjZGVmaW5lCUJVTkRMRV9JRF9OT05FCVU4X01BWAorCisvKiBHcmV5YnVzICJwdWJsaWMiIGRlZmluaXRpb25zIiAqLworc3RydWN0IGdiX2J1bmRsZSB7CisJc3RydWN0IGRldmljZQkJZGV2OworCXN0cnVjdCBnYl9pbnRlcmZhY2UJKmludGY7CisKKwl1OAkJCWlkOworCXU4CQkJY2xhc3M7CisJdTgJCQljbGFzc19tYWpvcjsKKwl1OAkJCWNsYXNzX21pbm9yOworCisJc2l6ZV90CQkJbnVtX2Nwb3J0czsKKwlzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2Nwb3J0ICpjcG9ydF9kZXNjOworCisJc3RydWN0IGxpc3RfaGVhZAljb25uZWN0aW9uczsKKwl1OAkJCSpzdGF0ZTsKKworCXN0cnVjdCBsaXN0X2hlYWQJbGlua3M7CS8qIGludGVyZmFjZS0+YnVuZGxlcyAqLworfTsKKyNkZWZpbmUgdG9fZ2JfYnVuZGxlKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgZ2JfYnVuZGxlLCBkZXYpCisKKy8qIEdyZXlidXMgInByaXZhdGUiIGRlZmluaXRpb25zIiAqLworc3RydWN0IGdiX2J1bmRsZSAqZ2JfYnVuZGxlX2NyZWF0ZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmLCB1OCBidW5kbGVfaWQsCisJCQkJICAgdTggY2xhc3MpOworaW50IGdiX2J1bmRsZV9hZGQoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKTsKK3ZvaWQgZ2JfYnVuZGxlX2Rlc3Ryb3koc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKTsKKworLyogQnVuZGxlIFJ1bnRpbWUgUE0gd3JhcHBlcnMgKi8KKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbmxpbmUgaW50IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBwbV9ydW50aW1lX2dldF9zeW5jKCZidW5kbGUtPmRldik7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGV2X2VycigmYnVuZGxlLT5kZXYsCisJCQkicG1fcnVudGltZV9nZXRfc3luYyBmYWlsZWQ6ICVkXG4iLCByZXR2YWwpOworCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJmJ1bmRsZS0+ZGV2KTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKQoreworCWludCByZXR2YWw7CisKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KCZidW5kbGUtPmRldik7CisJcmV0dmFsID0gcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoJmJ1bmRsZS0+ZGV2KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnYl9wbV9ydW50aW1lX2dldF9ub3Jlc3VtZShzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpCit7CisJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoJmJ1bmRsZS0+ZGV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdiX3BtX3J1bnRpbWVfcHV0X25vaWRsZShzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpCit7CisJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZidW5kbGUtPmRldik7Cit9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBnYl9wbV9ydW50aW1lX2dldF9zeW5jKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sgcmV0dXJuIDA7IH0KKworc3RhdGljIGlubGluZSB2b2lkIGdiX3BtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBnYl9wbV9ydW50aW1lX3B1dF9ub2lkbGUoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKSB7fQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0JVTkRMRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9jYW1lcmEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2NhbWVyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MWJkZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9jYW1lcmEuYwpAQCAtMCwwICsxLDE0MDAgQEAKKy8qCisgKiBHcmV5YnVzIENhbWVyYSBwcm90b2NvbCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSAiZ2ItY2FtZXJhLmgiCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImdyZXlidXNfcHJvdG9jb2xzLmgiCisKK2VudW0gZ2JfY2FtZXJhX2RlYnVnc19idWZmZXJfaWQgeworCUdCX0NBTUVSQV9ERUJVR0ZTX0JVRkZFUl9DQVBBQklMSVRJRVMsCisJR0JfQ0FNRVJBX0RFQlVHRlNfQlVGRkVSX1NUUkVBTVMsCisJR0JfQ0FNRVJBX0RFQlVHRlNfQlVGRkVSX0NBUFRVUkUsCisJR0JfQ0FNRVJBX0RFQlVHRlNfQlVGRkVSX0ZMVVNILAorCUdCX0NBTUVSQV9ERUJVR0ZTX0JVRkZFUl9NQVgsCit9OworCitzdHJ1Y3QgZ2JfY2FtZXJhX2RlYnVnZnNfYnVmZmVyIHsKKwljaGFyIGRhdGFbUEFHRV9TSVpFXTsKKwlzaXplX3QgbGVuZ3RoOworfTsKKworZW51bSBnYl9jYW1lcmFfc3RhdGUgeworCUdCX0NBTUVSQV9TVEFURV9VTkNPTkZJR1VSRUQsCisJR0JfQ0FNRVJBX1NUQVRFX0NPTkZJR1VSRUQsCit9OworCisvKioKKyAqIHN0cnVjdCBnYl9jYW1lcmEgLSBBIEdyZXlidXMgQ2FtZXJhIERldmljZQorICogQGNvbm5lY3Rpb246IHRoZSBncmV5YnVzIGNvbm5lY3Rpb24gZm9yIGNhbWVyYSBtYW5hZ2VtZW50CisgKiBAZGF0YV9jb25uZWN0aW9uOiB0aGUgZ3JleWJ1cyBjb25uZWN0aW9uIGZvciBjYW1lcmEgZGF0YQorICogQGRhdGFfY3BvcnRfaWQ6IHRoZSBkYXRhIENQb3J0IElEIG9uIHRoZSBtb2R1bGUgc2lkZQorICogQG11dGV4OiBwcm90ZWN0cyB0aGUgY29ubmVjdGlvbiBhbmQgc3RhdGUgZmllbGRzCisgKiBAc3RhdGU6IHRoZSBjdXJyZW50IG1vZHVsZSBzdGF0ZQorICogQGRlYnVnZnM6IGRlYnVnZnMgZW50cmllcyBmb3IgY2FtZXJhIHByb3RvY29sIG9wZXJhdGlvbnMgdGVzdGluZworICogQG1vZHVsZTogR3JleWJ1cyBjYW1lcmEgbW9kdWxlIHJlZ2lzdGVyZWQgdG8gSE9TVCBwcm9jZXNzb3IuCisgKi8KK3N0cnVjdCBnYl9jYW1lcmEgeworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZTsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqZGF0YV9jb25uZWN0aW9uOworCXUxNiBkYXRhX2Nwb3J0X2lkOworCisJc3RydWN0IG11dGV4IG11dGV4OworCWVudW0gZ2JfY2FtZXJhX3N0YXRlIHN0YXRlOworCisJc3RydWN0IHsKKwkJc3RydWN0IGRlbnRyeSAqcm9vdDsKKwkJc3RydWN0IGdiX2NhbWVyYV9kZWJ1Z2ZzX2J1ZmZlciAqYnVmZmVyczsKKwl9IGRlYnVnZnM7CisKKwlzdHJ1Y3QgZ2JfY2FtZXJhX21vZHVsZSBtb2R1bGU7Cit9OworCitzdHJ1Y3QgZ2JfY2FtZXJhX3N0cmVhbV9jb25maWcgeworCXVuc2lnbmVkIGludCB3aWR0aDsKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0OworCXVuc2lnbmVkIGludCBmb3JtYXQ7CisJdW5zaWduZWQgaW50IHZjOworCXVuc2lnbmVkIGludCBkdFsyXTsKKwl1bnNpZ25lZCBpbnQgbWF4X3NpemU7Cit9OworCitzdHJ1Y3QgZ2JfY2FtZXJhX2ZtdF9pbmZvIHsKKwllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgbWJ1c19jb2RlOworCXVuc2lnbmVkIGludCBnYl9mb3JtYXQ7CisJdW5zaWduZWQgaW50IGJwcDsKK307CisKKy8qIEdCIGZvcm1hdCB0byBtZWRpYSBjb2RlIG1hcCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBnYl9jYW1lcmFfZm10X2luZm8gZ2JfZm10X2luZm9bXSA9IHsKKwl7CisJCS5tYnVzX2NvZGUgPSBWNEwyX01CVVNfRk1UX1VZVlk4XzFYMTYsCisJCS5nYl9mb3JtYXQgPSAweDAxLAorCQkuYnBwCSAgID0gMTYsCisJfSwKKwl7CisJCS5tYnVzX2NvZGUgPSBWNEwyX01CVVNfRk1UX05WMTJfMXg4LAorCQkuZ2JfZm9ybWF0ID0gMHgxMiwKKwkJLmJwcAkgICA9IDEyLAorCX0sCisJeworCQkubWJ1c19jb2RlID0gVjRMMl9NQlVTX0ZNVF9OVjIxXzF4OCwKKwkJLmdiX2Zvcm1hdCA9IDB4MTMsCisJCS5icHAJICAgPSAxMiwKKwl9LAorCXsKKwkJLm1idXNfY29kZSA9IFY0TDJfTUJVU19GTVRfWVUxMl8xeDgsCisJCS5nYl9mb3JtYXQgPSAweDE2LAorCQkuYnBwCSAgID0gMTIsCisJfSwKKwl7CisJCS5tYnVzX2NvZGUgPSBWNEwyX01CVVNfRk1UX1lWMTJfMXg4LAorCQkuZ2JfZm9ybWF0ID0gMHgxNywKKwkJLmJwcAkgICA9IDEyLAorCX0sCisJeworCQkubWJ1c19jb2RlID0gVjRMMl9NQlVTX0ZNVF9KUEVHXzFYOCwKKwkJLmdiX2Zvcm1hdCA9IDB4NDAsCisJCS5icHAJICAgPSAwLAorCX0sCisJeworCQkubWJ1c19jb2RlID0gVjRMMl9NQlVTX0ZNVF9HQl9DQU1fTUVUQURBVEFfMVg4LAorCQkuZ2JfZm9ybWF0ID0gMHg0MSwKKwkJLmJwcAkgICA9IDAsCisJfSwKKwl7CisJCS5tYnVzX2NvZGUgPSBWNEwyX01CVVNfRk1UX0dCX0NBTV9ERUJVR19EQVRBXzFYOCwKKwkJLmdiX2Zvcm1hdCA9IDB4NDIsCisJCS5icHAJICAgPSAwLAorCX0sCisJeworCQkubWJ1c19jb2RlID0gVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzFYMTAsCisJCS5nYl9mb3JtYXQgPSAweDgwLAorCQkuYnBwCSAgID0gMTAsCisJfSwKKwl7CisJCS5tYnVzX2NvZGUgPSBWNEwyX01CVVNfRk1UX1NHQlJHMTBfMVgxMCwKKwkJLmdiX2Zvcm1hdCA9IDB4ODEsCisJCS5icHAJICAgPSAxMCwKKwl9LAorCXsKKwkJLm1idXNfY29kZSA9IFY0TDJfTUJVU19GTVRfU0dSQkcxMF8xWDEwLAorCQkuZ2JfZm9ybWF0ID0gMHg4MiwKKwkJLmJwcAkgICA9IDEwLAorCX0sCisJeworCQkubWJ1c19jb2RlID0gVjRMMl9NQlVTX0ZNVF9TUkdHQjEwXzFYMTAsCisJCS5nYl9mb3JtYXQgPSAweDgzLAorCQkuYnBwCSAgID0gMTAsCisJfSwKKwl7CisJCS5tYnVzX2NvZGUgPSBWNEwyX01CVVNfRk1UX1NCR0dSMTJfMVgxMiwKKwkJLmdiX2Zvcm1hdCA9IDB4ODQsCisJCS5icHAJICAgPSAxMiwKKwl9LAorCXsKKwkJLm1idXNfY29kZSA9IFY0TDJfTUJVU19GTVRfU0dCUkcxMl8xWDEyLAorCQkuZ2JfZm9ybWF0ID0gMHg4NSwKKwkJLmJwcAkgICA9IDEyLAorCX0sCisJeworCQkubWJ1c19jb2RlID0gVjRMMl9NQlVTX0ZNVF9TR1JCRzEyXzFYMTIsCisJCS5nYl9mb3JtYXQgPSAweDg2LAorCQkuYnBwCSAgID0gMTIsCisJfSwKKwl7CisJCS5tYnVzX2NvZGUgPSBWNEwyX01CVVNfRk1UX1NSR0dCMTJfMVgxMiwKKwkJLmdiX2Zvcm1hdCA9IDB4ODcsCisJCS5icHAJICAgPSAxMiwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnYl9jYW1lcmFfZm10X2luZm8gKmdiX2NhbWVyYV9nZXRfZm9ybWF0X2luZm8odTE2IGdiX2ZtdCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdiX2ZtdF9pbmZvKTsgaSsrKSB7CisJCWlmIChnYl9mbXRfaW5mb1tpXS5nYl9mb3JtYXQgPT0gZ2JfZm10KQorCQkJcmV0dXJuICZnYl9mbXRfaW5mb1tpXTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworI2RlZmluZSBFUzJfQVBCX0NEU0kwX0NQT1JUCQkxNgorI2RlZmluZSBFUzJfQVBCX0NEU0kxX0NQT1JUCQkxNworCisjZGVmaW5lIEdCX0NBTUVSQV9NQVhfU0VUVElOR1NfU0laRQk4MTkyCisKKyNkZWZpbmUgZ2NhbV9kYmcoZ2NhbSwgZm9ybWF0Li4uKQlkZXZfZGJnKCZnY2FtLT5idW5kbGUtPmRldiwgZm9ybWF0KQorI2RlZmluZSBnY2FtX2luZm8oZ2NhbSwgZm9ybWF0Li4uKQlkZXZfaW5mbygmZ2NhbS0+YnVuZGxlLT5kZXYsIGZvcm1hdCkKKyNkZWZpbmUgZ2NhbV9lcnIoZ2NhbSwgZm9ybWF0Li4uKQlkZXZfZXJyKCZnY2FtLT5idW5kbGUtPmRldiwgZm9ybWF0KQorCitzdGF0aWMgaW50IGdiX2NhbWVyYV9vcGVyYXRpb25fc3luY19mbGFncyhzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGZsYWdzLAorCQkJCQkgIHZvaWQgKnJlcXVlc3QsIHNpemVfdCByZXF1ZXN0X3NpemUsCisJCQkJCSAgdm9pZCAqcmVzcG9uc2UsIHNpemVfdCAqcmVzcG9uc2Vfc2l6ZSkKK3sKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJaW50IHJldDsKKworCW9wZXJhdGlvbiA9IGdiX29wZXJhdGlvbl9jcmVhdGVfZmxhZ3MoY29ubmVjdGlvbiwgdHlwZSwgcmVxdWVzdF9zaXplLAorCQkJCQkgICAgICAqcmVzcG9uc2Vfc2l6ZSwgZmxhZ3MsCisJCQkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghb3BlcmF0aW9uKQorCQlyZXR1cm4gIC1FTk9NRU07CisKKwlpZiAocmVxdWVzdF9zaXplKQorCQltZW1jcHkob3BlcmF0aW9uLT5yZXF1ZXN0LT5wYXlsb2FkLCByZXF1ZXN0LCByZXF1ZXN0X3NpemUpOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZF9zeW5jKG9wZXJhdGlvbik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5oZC0+ZGV2LAorCQkJIiVzOiBzeW5jaHJvbm91cyBvcGVyYXRpb24gb2YgdHlwZSAweCUwMnggZmFpbGVkOiAlZFxuIiwKKwkJCWNvbm5lY3Rpb24tPm5hbWUsIHR5cGUsIHJldCk7CisJfSBlbHNlIHsKKwkJKnJlc3BvbnNlX3NpemUgPSBvcGVyYXRpb24tPnJlc3BvbnNlLT5wYXlsb2FkX3NpemU7CisKKwkJaWYgKG9wZXJhdGlvbi0+cmVzcG9uc2UtPnBheWxvYWRfc2l6ZSkKKwkJCW1lbWNweShyZXNwb25zZSwgb3BlcmF0aW9uLT5yZXNwb25zZS0+cGF5bG9hZCwKKwkJCSAgICAgICBvcGVyYXRpb24tPnJlc3BvbnNlLT5wYXlsb2FkX3NpemUpOworCX0KKworCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfY2FtZXJhX2dldF9tYXhfcGt0X3NpemUoc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSwKKwkJc3RydWN0IGdiX2NhbWVyYV9jb25maWd1cmVfc3RyZWFtc19yZXNwb25zZSAqcmVzcCkKK3sKKwl1bnNpZ25lZCBpbnQgbWF4X3BrdF9zaXplID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCByZXNwLT5udW1fc3RyZWFtczsgaSsrKSB7CisJCXN0cnVjdCBnYl9jYW1lcmFfc3RyZWFtX2NvbmZpZ19yZXNwb25zZSAqY2ZnID0gJnJlc3AtPmNvbmZpZ1tpXTsKKwkJY29uc3Qgc3RydWN0IGdiX2NhbWVyYV9mbXRfaW5mbyAqZm10X2luZm87CisJCXVuc2lnbmVkIGludCBwa3Rfc2l6ZTsKKworCQlmbXRfaW5mbyA9IGdiX2NhbWVyYV9nZXRfZm9ybWF0X2luZm8oY2ZnLT5mb3JtYXQpOworCQlpZiAoIWZtdF9pbmZvKSB7CisJCQlnY2FtX2VycihnY2FtLCAidW5zdXBwb3J0ZWQgZ3JleWJ1cyBpbWFnZSBmb3JtYXQ6ICVkXG4iLAorCQkJCSBjZmctPmZvcm1hdCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWlmIChmbXRfaW5mby0+YnBwID09IDApIHsKKwkJCXBrdF9zaXplID0gbGUzMl90b19jcHUoY2ZnLT5tYXhfcGt0X3NpemUpOworCisJCQlpZiAocGt0X3NpemUgPT0gMCkgeworCQkJCWdjYW1fZXJyKGdjYW0sCisJCQkJCSAiU3RyZWFtICV1OiBpbnZhbGlkIHplcm8gbWF4aW11bSBwYWNrZXQgc2l6ZVxuIiwKKwkJCQkJIGkpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9IGVsc2UgeworCQkJcGt0X3NpemUgPSBsZTE2X3RvX2NwdShjZmctPndpZHRoKSAqIGZtdF9pbmZvLT5icHAgLyA4OworCisJCQlpZiAocGt0X3NpemUgIT0gbGUzMl90b19jcHUoY2ZnLT5tYXhfcGt0X3NpemUpKSB7CisJCQkJZ2NhbV9lcnIoZ2NhbSwKKwkJCQkJICJTdHJlYW0gJXU6IG1heGltdW0gcGFja2V0IHNpemUgbWlzbWF0Y2ggKCV1LyV1KVxuIiwKKwkJCQkJIGksIHBrdF9zaXplLCBjZmctPm1heF9wa3Rfc2l6ZSk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKworCQltYXhfcGt0X3NpemUgPSBtYXgocGt0X3NpemUsIG1heF9wa3Rfc2l6ZSk7CisJfQorCisJcmV0dXJuIG1heF9wa3Rfc2l6ZTsKK30KKworLyoKKyAqIFZhbGlkYXRlIHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbiByZXNwb25zZSB2ZXJpZnlpbmcgcGFkZGluZyBpcyBjb3JyZWN0bHkKKyAqIHNldCBhbmQgdGhlIHJldHVybmVkIG51bWJlciBvZiBzdHJlYW1zIGlzIHN1cHBvcnRlZAorICovCitzdGF0aWMgY29uc3QgaW50IGdiX2NhbWVyYV9jb25maWd1cmVfc3RyZWFtc192YWxpZGF0ZV9yZXNwb25zZSgKKwkJc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSwKKwkJc3RydWN0IGdiX2NhbWVyYV9jb25maWd1cmVfc3RyZWFtc19yZXNwb25zZSAqcmVzcCwKKwkJdW5zaWduZWQgaW50IG5zdHJlYW1zKQoreworCXVuc2lnbmVkIGludCBpOworCisJLyogVmFsaWRhdGUgdGhlIHJldHVybmVkIHJlc3BvbnNlIHN0cnVjdHVyZSAqLworCWlmIChyZXNwLT5wYWRkaW5nWzBdIHx8IHJlc3AtPnBhZGRpbmdbMV0pIHsKKwkJZ2NhbV9lcnIoZ2NhbSwgInJlc3BvbnNlIHBhZGRpbmcgIT0gMFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChyZXNwLT5udW1fc3RyZWFtcyA+IG5zdHJlYW1zKSB7CisJCWdjYW1fZXJyKGdjYW0sICJnb3QgI3N0cmVhbXMgJXUgPiByZXF1ZXN0ICV1XG4iLAorCQkJIHJlc3AtPm51bV9zdHJlYW1zLCBuc3RyZWFtcyk7CisJCXJldHVybiAtRUlPOworCX0KKworCWZvciAoaSA9IDA7IGkgPCByZXNwLT5udW1fc3RyZWFtczsgaSsrKSB7CisJCXN0cnVjdCBnYl9jYW1lcmFfc3RyZWFtX2NvbmZpZ19yZXNwb25zZSAqY2ZnID0gJnJlc3AtPmNvbmZpZ1tpXTsKKwkJaWYgKGNmZy0+cGFkZGluZykgeworCQkJZ2NhbV9lcnIoZ2NhbSwgInN0cmVhbSAjJXUgcGFkZGluZyAhPSAwXG4iLCBpKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBIYXJkd2FyZSBDb25maWd1cmF0aW9uCisgKi8KKworc3RhdGljIGludCBnYl9jYW1lcmFfc2V0X2ludGZfcG93ZXJfbW9kZShzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtLCB1OCBpbnRmX2lkLAorCQkJCQkgYm9vbCBocykKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBnY2FtLT5jb25uZWN0aW9uLT5oZC0+c3ZjOworCWludCByZXQ7CisKKwlpZiAoaHMpCisJCXJldCA9IGdiX3N2Y19pbnRmX3NldF9wb3dlcl9tb2RlKHN2YywgaW50Zl9pZCwKKwkJCQkJCSBHQl9TVkNfVU5JUFJPX0hTX1NFUklFU19BLAorCQkJCQkJIEdCX1NWQ19VTklQUk9fRkFTVF9NT0RFLCAyLCAyLAorCQkJCQkJIEdCX1NWQ19TTUFMTF9BTVBMSVRVREUsCisJCQkJCQkgR0JfU1ZDX05PX0RFX0VNUEhBU0lTLAorCQkJCQkJIEdCX1NWQ19VTklQUk9fRkFTVF9NT0RFLCAyLCAyLAorCQkJCQkJIEdCX1NWQ19QV1JNX1JYVEVSTUlOQVRJT04gfAorCQkJCQkJIEdCX1NWQ19QV1JNX1RYVEVSTUlOQVRJT04sIDAsCisJCQkJCQkgTlVMTCwgTlVMTCk7CisJZWxzZQorCQlyZXQgPSBnYl9zdmNfaW50Zl9zZXRfcG93ZXJfbW9kZShzdmMsIGludGZfaWQsCisJCQkJCQkgR0JfU1ZDX1VOSVBST19IU19TRVJJRVNfQSwKKwkJCQkJCSBHQl9TVkNfVU5JUFJPX1NMT1dfQVVUT19NT0RFLAorCQkJCQkJIDIsIDEsCisJCQkJCQkgR0JfU1ZDX1NNQUxMX0FNUExJVFVERSwKKwkJCQkJCSBHQl9TVkNfTk9fREVfRU1QSEFTSVMsCisJCQkJCQkgR0JfU1ZDX1VOSVBST19TTE9XX0FVVE9fTU9ERSwKKwkJCQkJCSAyLCAxLAorCQkJCQkJIDAsIDAsCisJCQkJCQkgTlVMTCwgTlVMTCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2NhbWVyYV9zZXRfcG93ZXJfbW9kZShzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtLCBib29sIGhzKQoreworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSBnY2FtLT5jb25uZWN0aW9uLT5pbnRmOworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IGdjYW0tPmNvbm5lY3Rpb24tPmhkLT5zdmM7CisJaW50IHJldDsKKworCXJldCA9IGdiX2NhbWVyYV9zZXRfaW50Zl9wb3dlcl9tb2RlKGdjYW0sIGludGYtPmludGVyZmFjZV9pZCwgaHMpOworCWlmIChyZXQgPCAwKSB7CisJCWdjYW1fZXJyKGdjYW0sICJmYWlsZWQgdG8gc2V0IG1vZHVsZSBpbnRlcmZhY2UgdG8gJXMgKCVkKVxuIiwKKwkJCSBocyA/ICJIUyIgOiAiUFdNIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBnYl9jYW1lcmFfc2V0X2ludGZfcG93ZXJfbW9kZShnY2FtLCBzdmMtPmFwX2ludGZfaWQsIGhzKTsKKwlpZiAocmV0IDwgMCkgeworCQlnYl9jYW1lcmFfc2V0X2ludGZfcG93ZXJfbW9kZShnY2FtLCBpbnRmLT5pbnRlcmZhY2VfaWQsICFocyk7CisJCWdjYW1fZXJyKGdjYW0sICJmYWlsZWQgdG8gc2V0IEFQIGludGVyZmFjZSB0byAlcyAoJWQpXG4iLAorCQkJIGhzID8gIkhTIiA6ICJQV00iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgYXBfY3NpX2NvbmZpZ19yZXF1ZXN0IHsKKwlfX3U4IGNzaV9pZDsKKwlfX3U4IGZsYWdzOworI2RlZmluZSBHQl9DQU1FUkFfQ1NJX0ZMQUdfQ0xPQ0tfQ09OVElOVU9VUyAweDAxCisJX191OCBudW1fbGFuZXM7CisJX191OCBwYWRkaW5nOworCV9fbGUzMiBjc2lfY2xrX2ZyZXE7CisJX19sZTMyIG1heF9wa3Rfc2l6ZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBUT0RPOiBDb21wdXRlIHRoZSBudW1iZXIgb2YgbGFuZXMgZHluYW1pY2FsbHkgYmFzZWQgb24gYmFuZHdpZHRoCisgKiByZXF1aXJlbWVudHMuCisgKi8KKyNkZWZpbmUgR0JfQ0FNRVJBX0NTSV9OVU1fREFUQV9MQU5FUwkJNAorCisjZGVmaW5lIEdCX0NBTUVSQV9DU0lfQ0xLX0ZSRVFfTUFYCQk5OTkwMDAwMDBVCisjZGVmaW5lIEdCX0NBTUVSQV9DU0lfQ0xLX0ZSRVFfTUlOCQkxMDAwMDAwMDBVCisjZGVmaW5lIEdCX0NBTUVSQV9DU0lfQ0xLX0ZSRVFfTUFSR0lOCQkxNTAwMDAwMDBVCisKK3N0YXRpYyBpbnQgZ2JfY2FtZXJhX3NldHVwX2RhdGFfY29ubmVjdGlvbihzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtLAorCQlzdHJ1Y3QgZ2JfY2FtZXJhX2NvbmZpZ3VyZV9zdHJlYW1zX3Jlc3BvbnNlICpyZXNwLAorCQlzdHJ1Y3QgZ2JfY2FtZXJhX2NzaV9wYXJhbXMgKmNzaV9wYXJhbXMpCit7CisJc3RydWN0IGFwX2NzaV9jb25maWdfcmVxdWVzdCBjc2lfY2ZnOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uOworCXVuc2lnbmVkIGludCBjbGtfZnJlcTsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBDcmVhdGUgdGhlIGRhdGEgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBjYW1lcmEgbW9kdWxlIGRhdGEgQ1BvcnQgYW5kCisJICogQVBCIENEU0kxLiBUaGUgQ0RTSTEgQ1BvcnQgSUQgaXMgaGFyZGNvZGVkIGJ5IHRoZSBFUzIgYnJpZGdlLgorCSAqLworCWNvbm4gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZV9vZmZsb2FkZWQoZ2NhbS0+YnVuZGxlLCBnY2FtLT5kYXRhX2Nwb3J0X2lkLAorCQkJCQkgICAgICBHQl9DT05ORUNUSU9OX0ZMQUdfTk9fRkxPV0NUUkwgfAorCQkJCQkgICAgICBHQl9DT05ORUNUSU9OX0ZMQUdfQ0RTSTEpOworCWlmIChJU19FUlIoY29ubikpCisJCXJldHVybiBQVFJfRVJSKGNvbm4pOworCisJZ2NhbS0+ZGF0YV9jb25uZWN0aW9uID0gY29ubjsKKwlnYl9jb25uZWN0aW9uX3NldF9kYXRhKGNvbm4sIGdjYW0pOworCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9jb25uX2Rlc3Ryb3k7CisKKwkvKiBTZXQgdGhlIFVuaVBybyBsaW5rIHRvIGhpZ2ggc3BlZWQgbW9kZS4gKi8KKwlyZXQgPSBnYl9jYW1lcmFfc2V0X3Bvd2VyX21vZGUoZ2NhbSwgdHJ1ZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfY29ubl9kaXNhYmxlOworCisJLyoKKwkgKiBDb25maWd1cmUgdGhlIEFQQi1BIENTSS0yIHRyYW5zbWl0dGVyLgorCSAqCisJICogSGFyZGNvZGUgdGhlIG51bWJlciBvZiBsYW5lcyB0byA0IGFuZCBjb21wdXRlIHRoZSBidXMgY2xvY2sgZnJlcXVlbmN5CisJICogYmFzZWQgb24gdGhlIG1vZHVsZSBiYW5kd2lkdGggcmVxdWlyZW1lbnRzIHdpdGggYSBzYWZldHkgbWFyZ2luLgorCSAqLworCW1lbXNldCgmY3NpX2NmZywgMCwgc2l6ZW9mKGNzaV9jZmcpKTsKKwljc2lfY2ZnLmNzaV9pZCA9IDE7CisJY3NpX2NmZy5mbGFncyA9IDA7CisJY3NpX2NmZy5udW1fbGFuZXMgPSBHQl9DQU1FUkFfQ1NJX05VTV9EQVRBX0xBTkVTOworCisJY2xrX2ZyZXEgPSByZXNwLT5kYXRhX3JhdGUgLyAyIC8gR0JfQ0FNRVJBX0NTSV9OVU1fREFUQV9MQU5FUzsKKwljbGtfZnJlcSA9IGNsYW1wKGNsa19mcmVxICsgR0JfQ0FNRVJBX0NTSV9DTEtfRlJFUV9NQVJHSU4sCisJCQkgR0JfQ0FNRVJBX0NTSV9DTEtfRlJFUV9NSU4sCisJCQkgR0JfQ0FNRVJBX0NTSV9DTEtfRlJFUV9NQVgpOworCWNzaV9jZmcuY3NpX2Nsa19mcmVxID0gY2xrX2ZyZXE7CisKKwlyZXQgPSBnYl9jYW1lcmFfZ2V0X21heF9wa3Rfc2l6ZShnY2FtLCByZXNwKTsKKwlpZiAocmV0IDwgMCkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycm9yX3Bvd2VyOworCX0KKwljc2lfY2ZnLm1heF9wa3Rfc2l6ZSA9IHJldDsKKworCXJldCA9IGdiX2hkX291dHB1dChnY2FtLT5jb25uZWN0aW9uLT5oZCwgJmNzaV9jZmcsCisJCQkgICBzaXplb2YoY3NpX2NmZyksCisJCQkgICBHQl9BUEJfUkVRVUVTVF9DU0lfVFhfQ09OVFJPTCwgZmFsc2UpOworCWlmIChyZXQgPCAwKSB7CisJCWdjYW1fZXJyKGdjYW0sICJmYWlsZWQgdG8gc3RhcnQgdGhlIENTSSB0cmFuc21pdHRlclxuIik7CisJCWdvdG8gZXJyb3JfcG93ZXI7CisJfQorCisJaWYgKGNzaV9wYXJhbXMpIHsKKwkJY3NpX3BhcmFtcy0+Y2xrX2ZyZXEgPSBjc2lfY2ZnLmNzaV9jbGtfZnJlcTsKKwkJY3NpX3BhcmFtcy0+bnVtX2xhbmVzID0gY3NpX2NmZy5udW1fbGFuZXM7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yX3Bvd2VyOgorCWdiX2NhbWVyYV9zZXRfcG93ZXJfbW9kZShnY2FtLCBmYWxzZSk7CitlcnJvcl9jb25uX2Rpc2FibGU6CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGdjYW0tPmRhdGFfY29ubmVjdGlvbik7CitlcnJvcl9jb25uX2Rlc3Ryb3k6CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGdjYW0tPmRhdGFfY29ubmVjdGlvbik7CisJZ2NhbS0+ZGF0YV9jb25uZWN0aW9uID0gTlVMTDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnYl9jYW1lcmFfdGVhcmRvd25fZGF0YV9jb25uZWN0aW9uKHN0cnVjdCBnYl9jYW1lcmEgKmdjYW0pCit7CisJc3RydWN0IGFwX2NzaV9jb25maWdfcmVxdWVzdCBjc2lfY2ZnOworCWludCByZXQ7CisKKwkvKiBTdG9wIHRoZSBBUEIxIENTSSB0cmFuc21pdHRlci4gKi8KKwltZW1zZXQoJmNzaV9jZmcsIDAsIHNpemVvZihjc2lfY2ZnKSk7CisJY3NpX2NmZy5jc2lfaWQgPSAxOworCisJcmV0ID0gZ2JfaGRfb3V0cHV0KGdjYW0tPmNvbm5lY3Rpb24tPmhkLCAmY3NpX2NmZywKKwkJCSAgIHNpemVvZihjc2lfY2ZnKSwKKwkJCSAgIEdCX0FQQl9SRVFVRVNUX0NTSV9UWF9DT05UUk9MLCBmYWxzZSk7CisKKwlpZiAocmV0IDwgMCkKKwkJZ2NhbV9lcnIoZ2NhbSwgImZhaWxlZCB0byBzdG9wIHRoZSBDU0kgdHJhbnNtaXR0ZXJcbiIpOworCisJLyogU2V0IHRoZSBVbmlQcm8gbGluayB0byBsb3cgc3BlZWQgbW9kZS4gKi8KKwlnYl9jYW1lcmFfc2V0X3Bvd2VyX21vZGUoZ2NhbSwgZmFsc2UpOworCisJLyogRGVzdHJveSB0aGUgZGF0YSBjb25uZWN0aW9uLiAqLworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShnY2FtLT5kYXRhX2Nvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShnY2FtLT5kYXRhX2Nvbm5lY3Rpb24pOworCWdjYW0tPmRhdGFfY29ubmVjdGlvbiA9IE5VTEw7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDYW1lcmEgUHJvdG9jb2wgT3BlcmF0aW9ucworICovCisKK3N0YXRpYyBpbnQgZ2JfY2FtZXJhX2NhcGFiaWxpdGllcyhzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtLAorCQkJCSAgdTggKmNhcGFiaWxpdGllcywgc2l6ZV90ICpzaXplKQoreworCWludCByZXQ7CisKKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGdjYW0tPmJ1bmRsZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmdjYW0tPm11dGV4KTsKKworCWlmICghZ2NhbS0+Y29ubmVjdGlvbikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gZ2JfY2FtZXJhX29wZXJhdGlvbl9zeW5jX2ZsYWdzKGdjYW0tPmNvbm5lY3Rpb24sCisJCQkJCSAgICAgR0JfQ0FNRVJBX1RZUEVfQ0FQQUJJTElUSUVTLAorCQkJCQkgICAgIEdCX09QRVJBVElPTl9GTEFHX1NIT1JUX1JFU1BPTlNFLAorCQkJCQkgICAgIE5VTEwsIDAsCisJCQkJCSAgICAgKHZvaWQgKiljYXBhYmlsaXRpZXMsIHNpemUpOworCWlmIChyZXQpCisJCWdjYW1fZXJyKGdjYW0sICJmYWlsZWQgdG8gcmV0cmlldmUgY2FwYWJpbGl0aWVzOiAlZFxuIiwgcmV0KTsKKworZG9uZToKKwltdXRleF91bmxvY2soJmdjYW0tPm11dGV4KTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdjYW0tPmJ1bmRsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2NhbWVyYV9jb25maWd1cmVfc3RyZWFtcyhzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9zdHJlYW1zLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmZsYWdzLAorCQkJCSAgICAgICBzdHJ1Y3QgZ2JfY2FtZXJhX3N0cmVhbV9jb25maWcgKnN0cmVhbXMsCisJCQkJICAgICAgIHN0cnVjdCBnYl9jYW1lcmFfY3NpX3BhcmFtcyAqY3NpX3BhcmFtcykKK3sKKwlzdHJ1Y3QgZ2JfY2FtZXJhX2NvbmZpZ3VyZV9zdHJlYW1zX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgZ2JfY2FtZXJhX2NvbmZpZ3VyZV9zdHJlYW1zX3Jlc3BvbnNlICpyZXNwOworCXVuc2lnbmVkIGludCBuc3RyZWFtcyA9ICpudW1fc3RyZWFtczsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzaXplX3QgcmVxX3NpemU7CisJc2l6ZV90IHJlc3Bfc2l6ZTsKKwlpbnQgcmV0OworCisJaWYgKG5zdHJlYW1zID4gR0JfQ0FNRVJBX01BWF9TVFJFQU1TKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlcV9zaXplID0gc2l6ZW9mKCpyZXEpICsgbnN0cmVhbXMgKiBzaXplb2YocmVxLT5jb25maWdbMF0pOworCXJlc3Bfc2l6ZSA9IHNpemVvZigqcmVzcCkgKyBuc3RyZWFtcyAqIHNpemVvZihyZXNwLT5jb25maWdbMF0pOworCisJcmVxID0ga21hbGxvYyhyZXFfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJcmVzcCA9IGttYWxsb2MocmVzcF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcSB8fCAhcmVzcCkgeworCQlrZnJlZShyZXEpOworCQlrZnJlZShyZXNwKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmVxLT5udW1fc3RyZWFtcyA9IG5zdHJlYW1zOworCXJlcS0+ZmxhZ3MgPSAqZmxhZ3M7CisJcmVxLT5wYWRkaW5nID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBuc3RyZWFtczsgKytpKSB7CisJCXN0cnVjdCBnYl9jYW1lcmFfc3RyZWFtX2NvbmZpZ19yZXF1ZXN0ICpjZmcgPSAmcmVxLT5jb25maWdbaV07CisKKwkJY2ZnLT53aWR0aCA9IGNwdV90b19sZTE2KHN0cmVhbXNbaV0ud2lkdGgpOworCQljZmctPmhlaWdodCA9IGNwdV90b19sZTE2KHN0cmVhbXNbaV0uaGVpZ2h0KTsKKwkJY2ZnLT5mb3JtYXQgPSBjcHVfdG9fbGUxNihzdHJlYW1zW2ldLmZvcm1hdCk7CisJCWNmZy0+cGFkZGluZyA9IDA7CisJfQorCisJbXV0ZXhfbG9jaygmZ2NhbS0+bXV0ZXgpOworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhnY2FtLT5idW5kbGUpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZV9za2lwX3BtX3B1dDsKKworCWlmICghZ2NhbS0+Y29ubmVjdGlvbikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gZ2JfY2FtZXJhX29wZXJhdGlvbl9zeW5jX2ZsYWdzKGdjYW0tPmNvbm5lY3Rpb24sCisJCQkJCSAgICAgR0JfQ0FNRVJBX1RZUEVfQ09ORklHVVJFX1NUUkVBTVMsCisJCQkJCSAgICAgR0JfT1BFUkFUSU9OX0ZMQUdfU0hPUlRfUkVTUE9OU0UsCisJCQkJCSAgICAgcmVxLCByZXFfc2l6ZSwKKwkJCQkJICAgICByZXNwLCAmcmVzcF9zaXplKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBkb25lOworCisJcmV0ID0gZ2JfY2FtZXJhX2NvbmZpZ3VyZV9zdHJlYW1zX3ZhbGlkYXRlX3Jlc3BvbnNlKGdjYW0sIHJlc3AsCisJCQkJCQkJICAgIG5zdHJlYW1zKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBkb25lOworCisJKmZsYWdzID0gcmVzcC0+ZmxhZ3M7CisJKm51bV9zdHJlYW1zID0gcmVzcC0+bnVtX3N0cmVhbXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVzcC0+bnVtX3N0cmVhbXM7ICsraSkgeworCQlzdHJ1Y3QgZ2JfY2FtZXJhX3N0cmVhbV9jb25maWdfcmVzcG9uc2UgKmNmZyA9ICZyZXNwLT5jb25maWdbaV07CisKKwkJc3RyZWFtc1tpXS53aWR0aCA9IGxlMTZfdG9fY3B1KGNmZy0+d2lkdGgpOworCQlzdHJlYW1zW2ldLmhlaWdodCA9IGxlMTZfdG9fY3B1KGNmZy0+aGVpZ2h0KTsKKwkJc3RyZWFtc1tpXS5mb3JtYXQgPSBsZTE2X3RvX2NwdShjZmctPmZvcm1hdCk7CisJCXN0cmVhbXNbaV0udmMgPSBjZmctPnZpcnR1YWxfY2hhbm5lbDsKKwkJc3RyZWFtc1tpXS5kdFswXSA9IGNmZy0+ZGF0YV90eXBlWzBdOworCQlzdHJlYW1zW2ldLmR0WzFdID0gY2ZnLT5kYXRhX3R5cGVbMV07CisJCXN0cmVhbXNbaV0ubWF4X3NpemUgPSBsZTMyX3RvX2NwdShjZmctPm1heF9zaXplKTsKKwl9CisKKwlpZiAoKHJlc3AtPmZsYWdzICYgR0JfQ0FNRVJBX0NPTkZJR1VSRV9TVFJFQU1TX0FESlVTVEVEKSB8fAorCSAgICAocmVxLT5mbGFncyAmIEdCX0NBTUVSQV9DT05GSUdVUkVfU1RSRUFNU19URVNUX09OTFkpKQorCQlnb3RvIGRvbmU7CisKKwlpZiAoZ2NhbS0+c3RhdGUgPT0gR0JfQ0FNRVJBX1NUQVRFX0NPTkZJR1VSRUQpIHsKKwkJZ2JfY2FtZXJhX3RlYXJkb3duX2RhdGFfY29ubmVjdGlvbihnY2FtKTsKKwkJZ2NhbS0+c3RhdGUgPSBHQl9DQU1FUkFfU1RBVEVfVU5DT05GSUdVUkVEOworCisJCS8qCisJCSAqIFdoZW4gdW5jb25maWd1cmluZyBzdHJlYW1zIHJlbGVhc2UgdGhlIFBNIHJ1bnRpbWUgcmVmZXJlbmNlCisJCSAqIHRoYXQgd2FzIGFjcXVpcmVkIHdoZW4gc3RyZWFtcyB3ZXJlIGNvbmZpZ3VyZWQuIFRoZSBidW5kbGUKKwkJICogd29uJ3QgYmUgc3VzcGVuZGVkIHVudGlsIHRoZSBQTSBydW50aW1lIHJlZmVyZW5jZSBhY3F1aXJlZCBhdAorCQkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgZnVuY3Rpb24gZ2V0cyByZWxlYXNlZCByaWdodCBiZWZvcmUKKwkJICogcmV0dXJuaW5nLgorCQkgKi8KKwkJZ2JfcG1fcnVudGltZV9wdXRfbm9pZGxlKGdjYW0tPmJ1bmRsZSk7CisJfQorCisJaWYgKHJlc3AtPm51bV9zdHJlYW1zID09IDApCisJCWdvdG8gZG9uZTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZSBidW5kbGUgd29uJ3QgYmUgc3VzcGVuZGVkIHVudGlsIHN0cmVhbXMgZ2V0CisJICogdW5jb25maWd1cmVkIGFmdGVyIHRoZSBzdHJlYW0gaXMgY29uZmlndXJlZCBzdWNjZXNzZnVsbHkKKwkgKi8KKwlnYl9wbV9ydW50aW1lX2dldF9ub3Jlc3VtZShnY2FtLT5idW5kbGUpOworCisJLyogU2V0dXAgQ1NJLTIgY29ubmVjdGlvbiBmcm9tIEFQQi1BIHRvIEFQICovCisJcmV0ID0gZ2JfY2FtZXJhX3NldHVwX2RhdGFfY29ubmVjdGlvbihnY2FtLCByZXNwLCBjc2lfcGFyYW1zKTsKKwlpZiAocmV0IDwgMCkgeworCQltZW1zZXQocmVxLCAwLCBzaXplb2YoKnJlcSkpOworCQlnYl9vcGVyYXRpb25fc3luYyhnY2FtLT5jb25uZWN0aW9uLAorCQkJCSAgR0JfQ0FNRVJBX1RZUEVfQ09ORklHVVJFX1NUUkVBTVMsCisJCQkJICByZXEsIHNpemVvZigqcmVxKSwKKwkJCQkgIHJlc3AsIHNpemVvZigqcmVzcCkpOworCQkqZmxhZ3MgPSAwOworCQkqbnVtX3N0cmVhbXMgPSAwOworCQlnYl9wbV9ydW50aW1lX3B1dF9ub2lkbGUoZ2NhbS0+YnVuZGxlKTsKKwkJZ290byBkb25lOworCX0KKworCWdjYW0tPnN0YXRlID0gR0JfQ0FNRVJBX1NUQVRFX0NPTkZJR1VSRUQ7CisKK2RvbmU6CisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ2NhbS0+YnVuZGxlKTsKKworZG9uZV9za2lwX3BtX3B1dDoKKwltdXRleF91bmxvY2soJmdjYW0tPm11dGV4KTsKKwlrZnJlZShyZXEpOworCWtmcmVlKHJlc3ApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfY2FtZXJhX2NhcHR1cmUoc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSwgdTMyIHJlcXVlc3RfaWQsCisJCQkgICAgIHVuc2lnbmVkIGludCBzdHJlYW1zLCB1bnNpZ25lZCBpbnQgbnVtX2ZyYW1lcywKKwkJCSAgICAgc2l6ZV90IHNldHRpbmdzX3NpemUsIGNvbnN0IHZvaWQgKnNldHRpbmdzKQoreworCXN0cnVjdCBnYl9jYW1lcmFfY2FwdHVyZV9yZXF1ZXN0ICpyZXE7CisJc2l6ZV90IHJlcV9zaXplOworCWludCByZXQ7CisKKwlpZiAoc2V0dGluZ3Nfc2l6ZSA+IEdCX0NBTUVSQV9NQVhfU0VUVElOR1NfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXFfc2l6ZSA9IHNpemVvZigqcmVxKSArIHNldHRpbmdzX3NpemU7CisJcmVxID0ga21hbGxvYyhyZXFfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVxLT5yZXF1ZXN0X2lkID0gY3B1X3RvX2xlMzIocmVxdWVzdF9pZCk7CisJcmVxLT5zdHJlYW1zID0gc3RyZWFtczsKKwlyZXEtPnBhZGRpbmcgPSAwOworCXJlcS0+bnVtX2ZyYW1lcyA9IGNwdV90b19sZTE2KG51bV9mcmFtZXMpOworCW1lbWNweShyZXEtPnNldHRpbmdzLCBzZXR0aW5ncywgc2V0dGluZ3Nfc2l6ZSk7CisKKwltdXRleF9sb2NrKCZnY2FtLT5tdXRleCk7CisKKwlpZiAoIWdjYW0tPmNvbm5lY3Rpb24pIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGdjYW0tPmNvbm5lY3Rpb24sIEdCX0NBTUVSQV9UWVBFX0NBUFRVUkUsCisJCQkJcmVxLCByZXFfc2l6ZSwgTlVMTCwgMCk7Citkb25lOgorCW11dGV4X3VubG9jaygmZ2NhbS0+bXV0ZXgpOworCisJa2ZyZWUocmVxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfY2FtZXJhX2ZsdXNoKHN0cnVjdCBnYl9jYW1lcmEgKmdjYW0sIHUzMiAqcmVxdWVzdF9pZCkKK3sKKwlzdHJ1Y3QgZ2JfY2FtZXJhX2ZsdXNoX3Jlc3BvbnNlIHJlc3A7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmdjYW0tPm11dGV4KTsKKworCWlmICghZ2NhbS0+Y29ubmVjdGlvbikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoZ2NhbS0+Y29ubmVjdGlvbiwgR0JfQ0FNRVJBX1RZUEVfRkxVU0gsIE5VTEwsIDAsCisJCQkJJnJlc3AsIHNpemVvZihyZXNwKSk7CisKKwlpZiAocmV0IDwgMCkKKwkJZ290byBkb25lOworCisJaWYgKHJlcXVlc3RfaWQpCisJCSpyZXF1ZXN0X2lkID0gbGUzMl90b19jcHUocmVzcC5yZXF1ZXN0X2lkKTsKKworZG9uZToKKwltdXRleF91bmxvY2soJmdjYW0tPm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfY2FtZXJhX3JlcXVlc3RfaGFuZGxlcihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShvcC0+Y29ubmVjdGlvbik7CisJc3RydWN0IGdiX2NhbWVyYV9tZXRhZGF0YV9yZXF1ZXN0ICpwYXlsb2FkOworCXN0cnVjdCBnYl9tZXNzYWdlICpyZXF1ZXN0OworCisJaWYgKG9wLT50eXBlICE9IEdCX0NBTUVSQV9UWVBFX01FVEFEQVRBKSB7CisJCWdjYW1fZXJyKGdjYW0sICJVbnN1cHBvcnRlZCB1bnNvbGljaXRlZCBldmVudDogJXVcbiIsIG9wLT50eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVxdWVzdCA9IG9wLT5yZXF1ZXN0OworCisJaWYgKHJlcXVlc3QtPnBheWxvYWRfc2l6ZSA8IHNpemVvZigqcGF5bG9hZCkpIHsKKwkJZ2NhbV9lcnIoZ2NhbSwgIldyb25nIGV2ZW50IHNpemUgcmVjZWl2ZWQgKCV6dSA8ICV6dSlcbiIsCisJCQkgcmVxdWVzdC0+cGF5bG9hZF9zaXplLCBzaXplb2YoKnBheWxvYWQpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGF5bG9hZCA9IHJlcXVlc3QtPnBheWxvYWQ7CisKKwlnY2FtX2RiZyhnY2FtLCAicmVjZWl2ZWQgbWV0YWRhdGEgZm9yIHJlcXVlc3QgJXUsIGZyYW1lICV1LCBzdHJlYW0gJXVcbiIsCisJCSBwYXlsb2FkLT5yZXF1ZXN0X2lkLCBwYXlsb2FkLT5mcmFtZV9udW1iZXIsIHBheWxvYWQtPnN0cmVhbSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEludGVyZmFjZSB3aXRoIEhPU1QgZ21wIGNhbWVyYS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBnYl9jYW1lcmFfbWJ1c190b19nYihlbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgbWJ1c19jb2RlKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ2JfZm10X2luZm8pOyBpKyspIHsKKwkJaWYgKGdiX2ZtdF9pbmZvW2ldLm1idXNfY29kZSA9PSBtYnVzX2NvZGUpCisJCQlyZXR1cm4gZ2JfZm10X2luZm9baV0uZ2JfZm9ybWF0OworCX0KKwlyZXR1cm4gZ2JfZm10X2luZm9bMF0uZ2JfZm9ybWF0OworfQorCitzdGF0aWMgZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIGdiX2NhbWVyYV9nYl90b19tYnVzKHUxNiBnYl9mbXQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShnYl9mbXRfaW5mbyk7IGkrKykgeworCQlpZiAoZ2JfZm10X2luZm9baV0uZ2JfZm9ybWF0ID09IGdiX2ZtdCkKKwkJCXJldHVybiBnYl9mbXRfaW5mb1tpXS5tYnVzX2NvZGU7CisJfQorCXJldHVybiBnYl9mbXRfaW5mb1swXS5tYnVzX2NvZGU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdiX2NhbWVyYV9vcF9jYXBhYmlsaXRpZXModm9pZCAqcHJpdiwgY2hhciAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtID0gcHJpdjsKKwlzaXplX3QgY2FwYWJpbGl0aWVzX2xlbiA9IGxlbjsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JfY2FtZXJhX2NhcGFiaWxpdGllcyhnY2FtLCBkYXRhLCAmY2FwYWJpbGl0aWVzX2xlbik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBjYXBhYmlsaXRpZXNfbGVuOworfQorCitzdGF0aWMgaW50IGdiX2NhbWVyYV9vcF9jb25maWd1cmVfc3RyZWFtcyh2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKm5zdHJlYW1zLAorCQl1bnNpZ25lZCBpbnQgKmZsYWdzLCBzdHJ1Y3QgZ2JfY2FtZXJhX3N0cmVhbSAqc3RyZWFtcywKKwkJc3RydWN0IGdiX2NhbWVyYV9jc2lfcGFyYW1zICpjc2lfcGFyYW1zKQoreworCXN0cnVjdCBnYl9jYW1lcmEgKmdjYW0gPSBwcml2OworCXN0cnVjdCBnYl9jYW1lcmFfc3RyZWFtX2NvbmZpZyAqZ2Jfc3RyZWFtczsKKwl1bnNpZ25lZCBpbnQgZ2JfZmxhZ3MgPSAwOworCXVuc2lnbmVkIGludCBnYl9uc3RyZWFtcyA9ICpuc3RyZWFtczsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJaWYgKGdiX25zdHJlYW1zID4gR0JfQ0FNRVJBX01BWF9TVFJFQU1TKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdiX3N0cmVhbXMgPSBremFsbG9jKGdiX25zdHJlYW1zICogc2l6ZW9mKCpnYl9zdHJlYW1zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnYl9zdHJlYW1zKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBnYl9uc3RyZWFtczsgaSsrKSB7CisJCWdiX3N0cmVhbXNbaV0ud2lkdGggPSBzdHJlYW1zW2ldLndpZHRoOworCQlnYl9zdHJlYW1zW2ldLmhlaWdodCA9IHN0cmVhbXNbaV0uaGVpZ2h0OworCQlnYl9zdHJlYW1zW2ldLmZvcm1hdCA9CisJCQlnYl9jYW1lcmFfbWJ1c190b19nYihzdHJlYW1zW2ldLnBpeGVsX2NvZGUpOworCX0KKworCWlmICgqZmxhZ3MgJiBHQl9DQU1FUkFfSU5fRkxBR19URVNUKQorCQlnYl9mbGFncyB8PSBHQl9DQU1FUkFfQ09ORklHVVJFX1NUUkVBTVNfVEVTVF9PTkxZOworCisJcmV0ID0gZ2JfY2FtZXJhX2NvbmZpZ3VyZV9zdHJlYW1zKGdjYW0sICZnYl9uc3RyZWFtcywKKwkJCQkJICAmZ2JfZmxhZ3MsIGdiX3N0cmVhbXMsIGNzaV9wYXJhbXMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGRvbmU7CisJaWYgKGdiX25zdHJlYW1zID4gKm5zdHJlYW1zKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkqZmxhZ3MgPSAwOworCWlmIChnYl9mbGFncyAmIEdCX0NBTUVSQV9DT05GSUdVUkVfU1RSRUFNU19BREpVU1RFRCkKKwkJKmZsYWdzIHw9IEdCX0NBTUVSQV9PVVRfRkxBR19BREpVU1RFRDsKKworCWZvciAoaSA9IDA7IGkgPCBnYl9uc3RyZWFtczsgaSsrKSB7CisJCXN0cmVhbXNbaV0ud2lkdGggPSBnYl9zdHJlYW1zW2ldLndpZHRoOworCQlzdHJlYW1zW2ldLmhlaWdodCA9IGdiX3N0cmVhbXNbaV0uaGVpZ2h0OworCQlzdHJlYW1zW2ldLnZjID0gZ2Jfc3RyZWFtc1tpXS52YzsKKwkJc3RyZWFtc1tpXS5kdFswXSA9IGdiX3N0cmVhbXNbaV0uZHRbMF07CisJCXN0cmVhbXNbaV0uZHRbMV0gPSBnYl9zdHJlYW1zW2ldLmR0WzFdOworCQlzdHJlYW1zW2ldLm1heF9zaXplID0gZ2Jfc3RyZWFtc1tpXS5tYXhfc2l6ZTsKKwkJc3RyZWFtc1tpXS5waXhlbF9jb2RlID0KKwkJCWdiX2NhbWVyYV9nYl90b19tYnVzKGdiX3N0cmVhbXNbaV0uZm9ybWF0KTsKKwl9CisJKm5zdHJlYW1zID0gZ2JfbnN0cmVhbXM7CisKK2RvbmU6CisJa2ZyZWUoZ2Jfc3RyZWFtcyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9jYW1lcmFfb3BfY2FwdHVyZSh2b2lkICpwcml2LCB1MzIgcmVxdWVzdF9pZCwKKwkJdW5zaWduZWQgaW50IHN0cmVhbXMsIHVuc2lnbmVkIGludCBudW1fZnJhbWVzLAorCQlzaXplX3Qgc2V0dGluZ3Nfc2l6ZSwgY29uc3Qgdm9pZCAqc2V0dGluZ3MpCit7CisJc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSA9IHByaXY7CisKKwlyZXR1cm4gZ2JfY2FtZXJhX2NhcHR1cmUoZ2NhbSwgcmVxdWVzdF9pZCwgc3RyZWFtcywgbnVtX2ZyYW1lcywKKwkJCQkgc2V0dGluZ3Nfc2l6ZSwgc2V0dGluZ3MpOworfQorCitzdGF0aWMgaW50IGdiX2NhbWVyYV9vcF9mbHVzaCh2b2lkICpwcml2LCB1MzIgKnJlcXVlc3RfaWQpCit7CisJc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSA9IHByaXY7CisKKwlyZXR1cm4gZ2JfY2FtZXJhX2ZsdXNoKGdjYW0sIHJlcXVlc3RfaWQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGdiX2NhbWVyYV9vcHMgZ2JfY2FtX29wcyA9IHsKKwkuY2FwYWJpbGl0aWVzID0gZ2JfY2FtZXJhX29wX2NhcGFiaWxpdGllcywKKwkuY29uZmlndXJlX3N0cmVhbXMgPSBnYl9jYW1lcmFfb3BfY29uZmlndXJlX3N0cmVhbXMsCisJLmNhcHR1cmUgPSBnYl9jYW1lcmFfb3BfY2FwdHVyZSwKKwkuZmx1c2ggPSBnYl9jYW1lcmFfb3BfZmx1c2gsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVidWdGUworICovCisKK3N0YXRpYyBzc2l6ZV90IGdiX2NhbWVyYV9kZWJ1Z2ZzX2NhcGFiaWxpdGllcyhzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtLAorCQljaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGdiX2NhbWVyYV9kZWJ1Z2ZzX2J1ZmZlciAqYnVmZmVyID0KKwkJJmdjYW0tPmRlYnVnZnMuYnVmZmVyc1tHQl9DQU1FUkFfREVCVUdGU19CVUZGRVJfQ0FQQUJJTElUSUVTXTsKKwlzaXplX3Qgc2l6ZSA9IDEwMjQ7CisJdW5zaWduZWQgaW50IGk7CisJdTggKmNhcHM7CisJaW50IHJldDsKKworCWNhcHMgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghY2FwcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBnYl9jYW1lcmFfY2FwYWJpbGl0aWVzKGdjYW0sIGNhcHMsICZzaXplKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBkb25lOworCisJLyoKKwkgKiBoZXhfZHVtcF90b19idWZmZXIoKSBkb2Vzbid0IHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGR1bXBlZCBwcmlvcgorCSAqIHRvIHY0LjAsIHdlIG5lZWQgb3VyIG93biBpbXBsZW1lbnRhdGlvbiA6LSgKKwkgKi8KKwlidWZmZXItPmxlbmd0aCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSAxNikgeworCQl1bnNpZ25lZCBpbnQgbmJ5dGVzID0gbWluX3QodW5zaWduZWQgaW50LCBzaXplIC0gaSwgMTYpOworCisJCWJ1ZmZlci0+bGVuZ3RoICs9IHNwcmludGYoYnVmZmVyLT5kYXRhICsgYnVmZmVyLT5sZW5ndGgsCisJCQkJCSAgIiUqcGhcbiIsIG5ieXRlcywgY2FwcyArIGkpOworCX0KKworZG9uZToKKwlrZnJlZShjYXBzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBnYl9jYW1lcmFfZGVidWdmc19jb25maWd1cmVfc3RyZWFtcyhzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtLAorCQljaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGdiX2NhbWVyYV9kZWJ1Z2ZzX2J1ZmZlciAqYnVmZmVyID0KKwkJJmdjYW0tPmRlYnVnZnMuYnVmZmVyc1tHQl9DQU1FUkFfREVCVUdGU19CVUZGRVJfU1RSRUFNU107CisJc3RydWN0IGdiX2NhbWVyYV9zdHJlYW1fY29uZmlnICpzdHJlYW1zOworCXVuc2lnbmVkIGludCBuc3RyZWFtczsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IGk7CisJY2hhciAqdG9rZW47CisJaW50IHJldDsKKworCS8qIFJldHJpZXZlIG51bWJlciBvZiBzdHJlYW1zIHRvIGNvbmZpZ3VyZSAqLworCXRva2VuID0gc3Ryc2VwKCZidWYsICI7Iik7CisJaWYgKHRva2VuID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0ga3N0cnRvdWludCh0b2tlbiwgMTAsICZuc3RyZWFtcyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAobnN0cmVhbXMgPiBHQl9DQU1FUkFfTUFYX1NUUkVBTVMpCisJCXJldHVybiAtRUlOVkFMOworCisJdG9rZW4gPSBzdHJzZXAoJmJ1ZiwgIjsiKTsKKwlpZiAodG9rZW4gPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBrc3RydG91aW50KHRva2VuLCAxMCwgJmZsYWdzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEZvciBlYWNoIHN0cmVhbSB0byBjb25maWd1cmUgcGFyc2Ugd2lkdGgsIGhlaWdodCBhbmQgZm9ybWF0ICovCisJc3RyZWFtcyA9IGt6YWxsb2MobnN0cmVhbXMgKiBzaXplb2YoKnN0cmVhbXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0cmVhbXMpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IG5zdHJlYW1zOyArK2kpIHsKKwkJc3RydWN0IGdiX2NhbWVyYV9zdHJlYW1fY29uZmlnICpzdHJlYW0gPSAmc3RyZWFtc1tpXTsKKworCQkvKiB3aWR0aCAqLworCQl0b2tlbiA9IHN0cnNlcCgmYnVmLCAiOyIpOworCQlpZiAodG9rZW4gPT0gTlVMTCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlyZXQgPSBrc3RydG91aW50KHRva2VuLCAxMCwgJnN0cmVhbS0+d2lkdGgpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZG9uZTsKKworCQkvKiBoZWlnaHQgKi8KKwkJdG9rZW4gPSBzdHJzZXAoJmJ1ZiwgIjsiKTsKKwkJaWYgKHRva2VuID09IE5VTEwpCisJCQlnb3RvIGRvbmU7CisKKwkJcmV0ID0ga3N0cnRvdWludCh0b2tlbiwgMTAsICZzdHJlYW0tPmhlaWdodCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBkb25lOworCisJCS8qIEltYWdlIGZvcm1hdCBjb2RlICovCisJCXRva2VuID0gc3Ryc2VwKCZidWYsICI7Iik7CisJCWlmICh0b2tlbiA9PSBOVUxMKQorCQkJZ290byBkb25lOworCisJCXJldCA9IGtzdHJ0b3VpbnQodG9rZW4sIDE2LCAmc3RyZWFtLT5mb3JtYXQpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSBnYl9jYW1lcmFfY29uZmlndXJlX3N0cmVhbXMoZ2NhbSwgJm5zdHJlYW1zLCAmZmxhZ3MsIHN0cmVhbXMsCisJCQkJCSAgTlVMTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZG9uZTsKKworCWJ1ZmZlci0+bGVuZ3RoID0gc3ByaW50ZihidWZmZXItPmRhdGEsICIldTsldTsiLCBuc3RyZWFtcywgZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IG5zdHJlYW1zOyArK2kpIHsKKwkJc3RydWN0IGdiX2NhbWVyYV9zdHJlYW1fY29uZmlnICpzdHJlYW0gPSAmc3RyZWFtc1tpXTsKKworCQlidWZmZXItPmxlbmd0aCArPSBzcHJpbnRmKGJ1ZmZlci0+ZGF0YSArIGJ1ZmZlci0+bGVuZ3RoLAorCQkJCQkgICIldTsldTsldTsldTsldTsldTsldTsiLAorCQkJCQkgIHN0cmVhbS0+d2lkdGgsIHN0cmVhbS0+aGVpZ2h0LAorCQkJCQkgIHN0cmVhbS0+Zm9ybWF0LCBzdHJlYW0tPnZjLAorCQkJCQkgIHN0cmVhbS0+ZHRbMF0sIHN0cmVhbS0+ZHRbMV0sCisJCQkJCSAgc3RyZWFtLT5tYXhfc2l6ZSk7CisJfQorCisJcmV0ID0gbGVuOworCitkb25lOgorCWtmcmVlKHN0cmVhbXMpOworCXJldHVybiByZXQ7Cit9OworCitzdGF0aWMgc3NpemVfdCBnYl9jYW1lcmFfZGVidWdmc19jYXB0dXJlKHN0cnVjdCBnYl9jYW1lcmEgKmdjYW0sCisJCWNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgcmVxdWVzdF9pZDsKKwl1bnNpZ25lZCBpbnQgc3RyZWFtc19tYXNrOworCXVuc2lnbmVkIGludCBudW1fZnJhbWVzOworCWNoYXIgKnRva2VuOworCWludCByZXQ7CisKKwkvKiBSZXF1ZXN0IGlkICovCisJdG9rZW4gPSBzdHJzZXAoJmJ1ZiwgIjsiKTsKKwlpZiAodG9rZW4gPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0ga3N0cnRvdWludCh0b2tlbiwgMTAsICZyZXF1ZXN0X2lkKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFN0cmVhbSBtYXNrICovCisJdG9rZW4gPSBzdHJzZXAoJmJ1ZiwgIjsiKTsKKwlpZiAodG9rZW4gPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0ga3N0cnRvdWludCh0b2tlbiwgMTYsICZzdHJlYW1zX21hc2spOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogbnVtYmVyIG9mIGZyYW1lcyAqLworCXRva2VuID0gc3Ryc2VwKCZidWYsICI7Iik7CisJaWYgKHRva2VuID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCXJldCA9IGtzdHJ0b3VpbnQodG9rZW4sIDEwLCAmbnVtX2ZyYW1lcyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9jYW1lcmFfY2FwdHVyZShnY2FtLCByZXF1ZXN0X2lkLCBzdHJlYW1zX21hc2ssIG51bV9mcmFtZXMsIDAsCisJCQkJTlVMTCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBnYl9jYW1lcmFfZGVidWdmc19mbHVzaChzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtLAorCQljaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGdiX2NhbWVyYV9kZWJ1Z2ZzX2J1ZmZlciAqYnVmZmVyID0KKwkJJmdjYW0tPmRlYnVnZnMuYnVmZmVyc1tHQl9DQU1FUkFfREVCVUdGU19CVUZGRVJfRkxVU0hdOworCXVuc2lnbmVkIGludCByZXFfaWQ7CisJaW50IHJldDsKKworCXJldCA9IGdiX2NhbWVyYV9mbHVzaChnY2FtLCAmcmVxX2lkKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWJ1ZmZlci0+bGVuZ3RoID0gc3ByaW50ZihidWZmZXItPmRhdGEsICIldSIsIHJlcV9pZCk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdHJ1Y3QgZ2JfY2FtZXJhX2RlYnVnZnNfZW50cnkgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdW5zaWduZWQgaW50IG1hc2s7CisJdW5zaWduZWQgaW50IGJ1ZmZlcjsKKwlzc2l6ZV90ICgqZXhlY3V0ZSkoc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSwgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2JfY2FtZXJhX2RlYnVnZnNfZW50cnkgZ2JfY2FtZXJhX2RlYnVnZnNfZW50cmllc1tdID0geworCXsKKwkJLm5hbWUgPSAiY2FwYWJpbGl0aWVzIiwKKwkJLm1hc2sgPSBTX0lGUkVHIHwgU19JUlVHTywKKwkJLmJ1ZmZlciA9IEdCX0NBTUVSQV9ERUJVR0ZTX0JVRkZFUl9DQVBBQklMSVRJRVMsCisJCS5leGVjdXRlID0gZ2JfY2FtZXJhX2RlYnVnZnNfY2FwYWJpbGl0aWVzLAorCX0sIHsKKwkJLm5hbWUgPSAiY29uZmlndXJlX3N0cmVhbXMiLAorCQkubWFzayA9IFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VHTywKKwkJLmJ1ZmZlciA9IEdCX0NBTUVSQV9ERUJVR0ZTX0JVRkZFUl9TVFJFQU1TLAorCQkuZXhlY3V0ZSA9IGdiX2NhbWVyYV9kZWJ1Z2ZzX2NvbmZpZ3VyZV9zdHJlYW1zLAorCX0sIHsKKwkJLm5hbWUgPSAiY2FwdHVyZSIsCisJCS5tYXNrID0gU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVUdPLAorCQkuYnVmZmVyID0gR0JfQ0FNRVJBX0RFQlVHRlNfQlVGRkVSX0NBUFRVUkUsCisJCS5leGVjdXRlID0gZ2JfY2FtZXJhX2RlYnVnZnNfY2FwdHVyZSwKKwl9LCB7CisJCS5uYW1lID0gImZsdXNoIiwKKwkJLm1hc2sgPSBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVR08sCisJCS5idWZmZXIgPSBHQl9DQU1FUkFfREVCVUdGU19CVUZGRVJfRkxVU0gsCisJCS5leGVjdXRlID0gZ2JfY2FtZXJhX2RlYnVnZnNfZmx1c2gsCisJfSwKK307CisKK3N0YXRpYyBzc2l6ZV90IGdiX2NhbWVyYV9kZWJ1Z2ZzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJY29uc3Qgc3RydWN0IGdiX2NhbWVyYV9kZWJ1Z2ZzX2VudHJ5ICpvcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtID0gZmlsZS0+Zl9pbm9kZS0+aV9wcml2YXRlOworCXN0cnVjdCBnYl9jYW1lcmFfZGVidWdmc19idWZmZXIgKmJ1ZmZlcjsKKwlzc2l6ZV90IHJldDsKKworCS8qIEZvciByZWFkLW9ubHkgZW50cmllcyB0aGUgb3BlcmF0aW9uIGlzIHRyaWdnZXJlZCBieSBhIHJlYWQuICovCisJaWYgKCEob3AtPm1hc2sgJiBTX0lXVUdPKSkgeworCQlyZXQgPSBvcC0+ZXhlY3V0ZShnY2FtLCBOVUxMLCAwKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCWJ1ZmZlciA9ICZnY2FtLT5kZWJ1Z2ZzLmJ1ZmZlcnNbb3AtPmJ1ZmZlcl07CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBsZW4sIG9mZnNldCwgYnVmZmVyLT5kYXRhLAorCQkJCSAgICAgICBidWZmZXItPmxlbmd0aCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdiX2NhbWVyYV9kZWJ1Z2ZzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLAorCQkJCSAgICAgICBsb2ZmX3QgKm9mZnNldCkKK3sKKwljb25zdCBzdHJ1Y3QgZ2JfY2FtZXJhX2RlYnVnZnNfZW50cnkgKm9wID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBnYl9jYW1lcmEgKmdjYW0gPSBmaWxlLT5mX2lub2RlLT5pX3ByaXZhdGU7CisJc3NpemVfdCByZXQ7CisJY2hhciAqa2J1ZjsKKworCWlmIChsZW4gPiAxMDI0KQorCSAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCWtidWYgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCWlmICgha2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIoa2J1ZiwgYnVmLCBsZW4pKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlrYnVmW2xlbl0gPSAnXDAnOworCisJcmV0ID0gb3AtPmV4ZWN1dGUoZ2NhbSwga2J1ZiwgbGVuKTsKKworZG9uZToKKwlrZnJlZShrYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2NhbWVyYV9kZWJ1Z2ZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShnYl9jYW1lcmFfZGVidWdmc19lbnRyaWVzKTsgKytpKSB7CisJCWNvbnN0IHN0cnVjdCBnYl9jYW1lcmFfZGVidWdmc19lbnRyeSAqZW50cnkgPQorCQkJJmdiX2NhbWVyYV9kZWJ1Z2ZzX2VudHJpZXNbaV07CisKKwkJaWYgKCFzdHJjbXAoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbmFtZSwgZW50cnktPm5hbWUpKSB7CisJCQlmaWxlLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKWVudHJ5OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ2JfY2FtZXJhX2RlYnVnZnNfb3BzID0geworCS5vcGVuID0gZ2JfY2FtZXJhX2RlYnVnZnNfb3BlbiwKKwkucmVhZCA9IGdiX2NhbWVyYV9kZWJ1Z2ZzX3JlYWQsCisJLndyaXRlID0gZ2JfY2FtZXJhX2RlYnVnZnNfd3JpdGUsCit9OworCitzdGF0aWMgaW50IGdiX2NhbWVyYV9kZWJ1Z2ZzX2luaXQoc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdjYW0tPmNvbm5lY3Rpb247CisJY2hhciBkaXJuYW1lWzI3XTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qCisJICogQ3JlYXRlIHJvb3QgZGVidWdmcyBlbnRyeSBhbmQgYSBmaWxlIGVudHJ5IGZvciBlYWNoIGNhbWVyYSBvcGVyYXRpb24uCisJICovCisJc25wcmludGYoZGlybmFtZSwgMjcsICJjYW1lcmEtJXUuJXUiLCBjb25uZWN0aW9uLT5pbnRmLT5pbnRlcmZhY2VfaWQsCisJCSBnY2FtLT5idW5kbGUtPmlkKTsKKworCWdjYW0tPmRlYnVnZnMucm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcihkaXJuYW1lLCBnYl9kZWJ1Z2ZzX2dldCgpKTsKKwlpZiAoSVNfRVJSKGdjYW0tPmRlYnVnZnMucm9vdCkpIHsKKwkJZ2NhbV9lcnIoZ2NhbSwgImRlYnVnZnMgcm9vdCBjcmVhdGUgZmFpbGVkICglbGQpXG4iLAorCQkJIFBUUl9FUlIoZ2NhbS0+ZGVidWdmcy5yb290KSk7CisJCXJldHVybiBQVFJfRVJSKGdjYW0tPmRlYnVnZnMucm9vdCk7CisJfQorCisJZ2NhbS0+ZGVidWdmcy5idWZmZXJzID0gdm1hbGxvYyhzaXplb2YoKmdjYW0tPmRlYnVnZnMuYnVmZmVycykgKgorCQkJCQlHQl9DQU1FUkFfREVCVUdGU19CVUZGRVJfTUFYKTsKKwlpZiAoIWdjYW0tPmRlYnVnZnMuYnVmZmVycykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShnYl9jYW1lcmFfZGVidWdmc19lbnRyaWVzKTsgKytpKSB7CisJCWNvbnN0IHN0cnVjdCBnYl9jYW1lcmFfZGVidWdmc19lbnRyeSAqZW50cnkgPQorCQkJJmdiX2NhbWVyYV9kZWJ1Z2ZzX2VudHJpZXNbaV07CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKworCQlnY2FtLT5kZWJ1Z2ZzLmJ1ZmZlcnNbaV0ubGVuZ3RoID0gMDsKKworCQlkZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGVudHJ5LT5uYW1lLCBlbnRyeS0+bWFzaywKKwkJCQkJICAgICBnY2FtLT5kZWJ1Z2ZzLnJvb3QsIGdjYW0sCisJCQkJCSAgICAgJmdiX2NhbWVyYV9kZWJ1Z2ZzX29wcyk7CisJCWlmIChJU19FUlIoZGVudHJ5KSkgeworCQkJZ2NhbV9lcnIoZ2NhbSwKKwkJCQkgImRlYnVnZnMgb3BlcmF0aW9uICVzIGNyZWF0ZSBmYWlsZWQgKCVsZClcbiIsCisJCQkJIGVudHJ5LT5uYW1lLCBQVFJfRVJSKGRlbnRyeSkpOworCQkJcmV0dXJuIFBUUl9FUlIoZGVudHJ5KTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnYl9jYW1lcmFfZGVidWdmc19jbGVhbnVwKHN0cnVjdCBnYl9jYW1lcmEgKmdjYW0pCit7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGdjYW0tPmRlYnVnZnMucm9vdCk7CisKKwl2ZnJlZShnY2FtLT5kZWJ1Z2ZzLmJ1ZmZlcnMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5pdCAmIENsZWFudXAKKyAqLworCitzdGF0aWMgdm9pZCBnYl9jYW1lcmFfY2xlYW51cChzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtKQoreworCWdiX2NhbWVyYV9kZWJ1Z2ZzX2NsZWFudXAoZ2NhbSk7CisKKwltdXRleF9sb2NrKCZnY2FtLT5tdXRleCk7CisJaWYgKGdjYW0tPmRhdGFfY29ubmVjdGlvbikgeworCQlnYl9jb25uZWN0aW9uX2Rpc2FibGUoZ2NhbS0+ZGF0YV9jb25uZWN0aW9uKTsKKwkJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGdjYW0tPmRhdGFfY29ubmVjdGlvbik7CisJCWdjYW0tPmRhdGFfY29ubmVjdGlvbiA9IE5VTEw7CisJfQorCisJaWYgKGdjYW0tPmNvbm5lY3Rpb24pIHsKKwkJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGdjYW0tPmNvbm5lY3Rpb24pOworCQlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koZ2NhbS0+Y29ubmVjdGlvbik7CisJCWdjYW0tPmNvbm5lY3Rpb24gPSBOVUxMOworCX0KKwltdXRleF91bmxvY2soJmdjYW0tPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgZ2JfY2FtZXJhX3JlbGVhc2VfbW9kdWxlKHN0cnVjdCBrcmVmICpyZWYpCit7CisJc3RydWN0IGdiX2NhbWVyYV9tb2R1bGUgKmNhbV9tb2QgPQorCQljb250YWluZXJfb2YocmVmLCBzdHJ1Y3QgZ2JfY2FtZXJhX21vZHVsZSwgcmVmY291bnQpOworCWtmcmVlKGNhbV9tb2QtPnByaXYpOworfQorCitzdGF0aWMgaW50IGdiX2NhbWVyYV9wcm9iZShzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsCisJCQkgICBjb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgKmlkKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCBnYl9jYW1lcmEgKmdjYW07CisJdTE2IG1nbXRfY3BvcnRfaWQgPSAwOworCXUxNiBkYXRhX2Nwb3J0X2lkID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBUaGUgY2FtZXJhIGJ1bmRsZSBtdXN0IGNvbnRhaW4gZXhhY3RseSB0d28gQ1BvcnRzLCBvbmUgZm9yIHRoZQorCSAqIGNhbWVyYSBtYW5hZ2VtZW50IHByb3RvY29sIGFuZCBvbmUgZm9yIHRoZSBjYW1lcmEgZGF0YSBwcm90b2NvbC4KKwkgKi8KKwlpZiAoYnVuZGxlLT5udW1fY3BvcnRzICE9IDIpCisJCXJldHVybiAtRU5PREVWOworCisJZm9yIChpID0gMDsgaSA8IGJ1bmRsZS0+bnVtX2Nwb3J0czsgKytpKSB7CisJCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfY3BvcnQgKmRlc2MgPSAmYnVuZGxlLT5jcG9ydF9kZXNjW2ldOworCisJCXN3aXRjaCAoZGVzYy0+cHJvdG9jb2xfaWQpIHsKKwkJY2FzZSBHUkVZQlVTX1BST1RPQ09MX0NBTUVSQV9NR01UOgorCQkJbWdtdF9jcG9ydF9pZCA9IGxlMTZfdG9fY3B1KGRlc2MtPmlkKTsKKwkJCWJyZWFrOworCQljYXNlIEdSRVlCVVNfUFJPVE9DT0xfQ0FNRVJBX0RBVEE6CisJCQlkYXRhX2Nwb3J0X2lkID0gbGUxNl90b19jcHUoZGVzYy0+aWQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCWlmICghbWdtdF9jcG9ydF9pZCB8fCAhZGF0YV9jcG9ydF9pZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlnY2FtID0ga3phbGxvYyhzaXplb2YoKmdjYW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdjYW0pCisJCXJldHVybiAtRU5PTUVNOworCisJbXV0ZXhfaW5pdCgmZ2NhbS0+bXV0ZXgpOworCisJZ2NhbS0+YnVuZGxlID0gYnVuZGxlOworCWdjYW0tPnN0YXRlID0gR0JfQ0FNRVJBX1NUQVRFX1VOQ09ORklHVVJFRDsKKwlnY2FtLT5kYXRhX2Nwb3J0X2lkID0gZGF0YV9jcG9ydF9pZDsKKworCWNvbm4gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZShidW5kbGUsIG1nbXRfY3BvcnRfaWQsCisJCQkJICAgIGdiX2NhbWVyYV9yZXF1ZXN0X2hhbmRsZXIpOworCWlmIChJU19FUlIoY29ubikpIHsKKwkJcmV0ID0gUFRSX0VSUihjb25uKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlnY2FtLT5jb25uZWN0aW9uID0gY29ubjsKKwlnYl9jb25uZWN0aW9uX3NldF9kYXRhKGNvbm4sIGdjYW0pOworCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IGdiX2NhbWVyYV9kZWJ1Z2ZzX2luaXQoZ2NhbSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlnY2FtLT5tb2R1bGUucHJpdiA9IGdjYW07CisJZ2NhbS0+bW9kdWxlLm9wcyA9ICZnYl9jYW1fb3BzOworCWdjYW0tPm1vZHVsZS5pbnRlcmZhY2VfaWQgPSBnY2FtLT5jb25uZWN0aW9uLT5pbnRmLT5pbnRlcmZhY2VfaWQ7CisJZ2NhbS0+bW9kdWxlLnJlbGVhc2UgPSBnYl9jYW1lcmFfcmVsZWFzZV9tb2R1bGU7CisJcmV0ID0gZ2JfY2FtZXJhX3JlZ2lzdGVyKCZnY2FtLT5tb2R1bGUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJZ3JleWJ1c19zZXRfZHJ2ZGF0YShidW5kbGUsIGdjYW0pOworCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ2NhbS0+YnVuZGxlKTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlnYl9jYW1lcmFfY2xlYW51cChnY2FtKTsKKwlrZnJlZShnY2FtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnYl9jYW1lcmFfZGlzY29ubmVjdChzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpCit7CisJc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSA9IGdyZXlidXNfZ2V0X2RydmRhdGEoYnVuZGxlKTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQpCisJCWdiX3BtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGJ1bmRsZSk7CisKKwlnYl9jYW1lcmFfY2xlYW51cChnY2FtKTsKKwlnYl9jYW1lcmFfdW5yZWdpc3RlcigmZ2NhbS0+bW9kdWxlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCBnYl9jYW1lcmFfaWRfdGFibGVbXSA9IHsKKwl7IEdSRVlCVVNfREVWSUNFX0NMQVNTKEdSRVlCVVNfQ0xBU1NfQ0FNRVJBKSB9LAorCXsgfSwKK307CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgZ2JfY2FtZXJhX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IHRvX2diX2J1bmRsZShkZXYpOworCXN0cnVjdCBnYl9jYW1lcmEgKmdjYW0gPSBncmV5YnVzX2dldF9kcnZkYXRhKGJ1bmRsZSk7CisKKwlpZiAoZ2NhbS0+ZGF0YV9jb25uZWN0aW9uKQorCQlnYl9jb25uZWN0aW9uX2Rpc2FibGUoZ2NhbS0+ZGF0YV9jb25uZWN0aW9uKTsKKworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShnY2FtLT5jb25uZWN0aW9uKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2NhbWVyYV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IHRvX2diX2J1bmRsZShkZXYpOworCXN0cnVjdCBnYl9jYW1lcmEgKmdjYW0gPSBncmV5YnVzX2dldF9kcnZkYXRhKGJ1bmRsZSk7CisJaW50IHJldDsKKworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGdjYW0tPmNvbm5lY3Rpb24pOworCWlmIChyZXQpIHsKKwkJZ2NhbV9lcnIoZ2NhbSwgImZhaWxlZCB0byBlbmFibGUgY29ubmVjdGlvbjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGdjYW0tPmRhdGFfY29ubmVjdGlvbikgeworCQlyZXQgPSBnYl9jb25uZWN0aW9uX2VuYWJsZShnY2FtLT5kYXRhX2Nvbm5lY3Rpb24pOworCQlpZiAocmV0KSB7CisJCQlnY2FtX2VycihnY2FtLAorCQkJCSAiZmFpbGVkIHRvIGVuYWJsZSBkYXRhIGNvbm5lY3Rpb246ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBnYl9jYW1lcmFfcG1fb3BzID0geworCVNFVF9SVU5USU1FX1BNX09QUyhnYl9jYW1lcmFfc3VzcGVuZCwgZ2JfY2FtZXJhX3Jlc3VtZSwgTlVMTCkKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3JleWJ1c19kcml2ZXIgZ2JfY2FtZXJhX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiY2FtZXJhIiwKKwkucHJvYmUJCT0gZ2JfY2FtZXJhX3Byb2JlLAorCS5kaXNjb25uZWN0CT0gZ2JfY2FtZXJhX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gZ2JfY2FtZXJhX2lkX3RhYmxlLAorCS5kcml2ZXIucG0JPSAmZ2JfY2FtZXJhX3BtX29wcywKK307CisKK21vZHVsZV9ncmV5YnVzX2RyaXZlcihnYl9jYW1lcmFfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvY29ubmVjdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvY29ubmVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NzA3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9jb25uZWN0aW9uLmMKQEAgLTAsMCArMSw5MzggQEAKKy8qCisgKiBHcmV5YnVzIGNvbm5lY3Rpb25zCisgKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImdyZXlidXNfdHJhY2UuaCIKKworCisjZGVmaW5lIEdCX0NPTk5FQ1RJT05fQ1BPUlRfUVVJRVNDRV9USU1FT1VUCTEwMDAKKworCitzdGF0aWMgdm9pZCBnYl9jb25uZWN0aW9uX2tyZWZfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZik7CisKKworc3RhdGljIERFRklORV9TUElOTE9DSyhnYl9jb25uZWN0aW9uc19sb2NrKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoZ2JfY29ubmVjdGlvbl9tdXRleCk7CisKKworLyogQ2FsbGVyIGhvbGRzIGdiX2Nvbm5lY3Rpb25fbXV0ZXguICovCitzdGF0aWMgYm9vbCBnYl9jb25uZWN0aW9uX2Nwb3J0X2luX3VzZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmLCB1MTYgY3BvcnRfaWQpCit7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCA9IGludGYtPmhkOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0aW9uLCAmaGQtPmNvbm5lY3Rpb25zLCBoZF9saW5rcykgeworCQlpZiAoY29ubmVjdGlvbi0+aW50ZiA9PSBpbnRmICYmCisJCQkJY29ubmVjdGlvbi0+aW50Zl9jcG9ydF9pZCA9PSBjcG9ydF9pZCkKKwkJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgZ2JfY29ubmVjdGlvbl9nZXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJa3JlZl9nZXQoJmNvbm5lY3Rpb24tPmtyZWYpOworCisJdHJhY2VfZ2JfY29ubmVjdGlvbl9nZXQoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2Nvbm5lY3Rpb25fcHV0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXRyYWNlX2diX2Nvbm5lY3Rpb25fcHV0KGNvbm5lY3Rpb24pOworCisJa3JlZl9wdXQoJmNvbm5lY3Rpb24tPmtyZWYsIGdiX2Nvbm5lY3Rpb25fa3JlZl9yZWxlYXNlKTsKK30KKworLyoKKyAqIFJldHVybnMgYSByZWZlcmVuY2UtY291bnRlZCBwb2ludGVyIHRvIHRoZSBjb25uZWN0aW9uIGlmIGZvdW5kLgorICovCitzdGF0aWMgc3RydWN0IGdiX2Nvbm5lY3Rpb24gKgorZ2JfY29ubmVjdGlvbl9oZF9maW5kKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdiX2Nvbm5lY3Rpb25zX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3Rpb24sICZoZC0+Y29ubmVjdGlvbnMsIGhkX2xpbmtzKQorCQlpZiAoY29ubmVjdGlvbi0+aGRfY3BvcnRfaWQgPT0gY3BvcnRfaWQpIHsKKwkJCWdiX2Nvbm5lY3Rpb25fZ2V0KGNvbm5lY3Rpb24pOworCQkJZ290byBmb3VuZDsKKwkJfQorCWNvbm5lY3Rpb24gPSBOVUxMOworZm91bmQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2JfY29ubmVjdGlvbnNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGNvbm5lY3Rpb247Cit9CisKKy8qCisgKiBDYWxsYmFjayBmcm9tIHRoZSBob3N0IGRyaXZlciB0byBsZXQgdXMga25vdyB0aGF0IGRhdGEgaGFzIGJlZW4KKyAqIHJlY2VpdmVkIG9uIHRoZSBidW5kbGUuCisgKi8KK3ZvaWQgZ3JleWJ1c19kYXRhX3JjdmQoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGNwb3J0X2lkLAorCQkJdTggKmRhdGEsIHNpemVfdCBsZW5ndGgpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKwl0cmFjZV9nYl9oZF9pbihoZCk7CisKKwljb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9oZF9maW5kKGhkLCBjcG9ydF9pZCk7CisJaWYgKCFjb25uZWN0aW9uKSB7CisJCWRldl9lcnIoJmhkLT5kZXYsCisJCQkibm9uZXhpc3RlbnQgY29ubmVjdGlvbiAoJXp1IGJ5dGVzIGRyb3BwZWQpXG4iLCBsZW5ndGgpOworCQlyZXR1cm47CisJfQorCWdiX2Nvbm5lY3Rpb25fcmVjdihjb25uZWN0aW9uLCBkYXRhLCBsZW5ndGgpOworCWdiX2Nvbm5lY3Rpb25fcHV0KGNvbm5lY3Rpb24pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ3JleWJ1c19kYXRhX3JjdmQpOworCitzdGF0aWMgdm9pZCBnYl9jb25uZWN0aW9uX2tyZWZfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworCWNvbm5lY3Rpb24gPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGdiX2Nvbm5lY3Rpb24sIGtyZWYpOworCisJdHJhY2VfZ2JfY29ubmVjdGlvbl9yZWxlYXNlKGNvbm5lY3Rpb24pOworCisJa2ZyZWUoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2Nvbm5lY3Rpb25faW5pdF9uYW1lKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXUxNiBoZF9jcG9ydF9pZCA9IGNvbm5lY3Rpb24tPmhkX2Nwb3J0X2lkOworCXUxNiBjcG9ydF9pZCA9IDA7CisJdTggaW50Zl9pZCA9IDA7CisKKwlpZiAoY29ubmVjdGlvbi0+aW50ZikgeworCQlpbnRmX2lkID0gY29ubmVjdGlvbi0+aW50Zi0+aW50ZXJmYWNlX2lkOworCQljcG9ydF9pZCA9IGNvbm5lY3Rpb24tPmludGZfY3BvcnRfaWQ7CisJfQorCisJc25wcmludGYoY29ubmVjdGlvbi0+bmFtZSwgc2l6ZW9mKGNvbm5lY3Rpb24tPm5hbWUpLAorCQkJIiV1LyV1OiV1IiwgaGRfY3BvcnRfaWQsIGludGZfaWQsIGNwb3J0X2lkKTsKK30KKworLyoKKyAqIF9nYl9jb25uZWN0aW9uX2NyZWF0ZSgpIC0gY3JlYXRlIGEgR3JleWJ1cyBjb25uZWN0aW9uCisgKiBAaGQ6CQkJaG9zdCBkZXZpY2Ugb2YgdGhlIGNvbm5lY3Rpb24KKyAqIEBoZF9jcG9ydF9pZDoJaG9zdC1kZXZpY2UgY3BvcnQgaWQsIG9yIC0xIGZvciBkeW5hbWljIGFsbG9jYXRpb24KKyAqIEBpbnRmOgkJcmVtb3RlIGludGVyZmFjZSwgb3IgTlVMTCBmb3Igc3RhdGljIGNvbm5lY3Rpb25zCisgKiBAYnVuZGxlOgkJcmVtb3RlLWludGVyZmFjZSBidW5kbGUgKG1heSBiZSBOVUxMKQorICogQGNwb3J0X2lkOgkJcmVtb3RlLWludGVyZmFjZSBjcG9ydCBpZCwgb3IgMCBmb3Igc3RhdGljIGNvbm5lY3Rpb25zCisgKiBAaGFuZGxlcjoJCXJlcXVlc3QgaGFuZGxlciAobWF5IGJlIE5VTEwpCisgKiBAZmxhZ3M6CQljb25uZWN0aW9uIGZsYWdzCisgKgorICogQ3JlYXRlIGEgR3JleWJ1cyBjb25uZWN0aW9uLCByZXByZXNlbnRpbmcgdGhlIGJpZGlyZWN0aW9uYWwgbGluaworICogYmV0d2VlbiBhIENQb3J0IG9uIGEgKGxvY2FsKSBHcmV5YnVzIGhvc3QgZGV2aWNlIGFuZCBhIENQb3J0IG9uCisgKiBhbm90aGVyIEdyZXlidXMgaW50ZXJmYWNlLgorICoKKyAqIEEgY29ubmVjdGlvbiBhbHNvIG1haW50YWlucyB0aGUgc3RhdGUgb2Ygb3BlcmF0aW9ucyBzZW50IG92ZXIgdGhlCisgKiBjb25uZWN0aW9uLgorICoKKyAqIFNlcmlhbGlzZWQgYWdhaW5zdCBjb25jdXJyZW50IGNyZWF0ZSBhbmQgZGVzdHJveSB1c2luZyB0aGUKKyAqIGdiX2Nvbm5lY3Rpb25fbXV0ZXguCisgKgorICogUmV0dXJuOiBBIHBvaW50ZXIgdG8gdGhlIG5ldyBjb25uZWN0aW9uIGlmIHN1Y2Nlc3NmdWwsIG9yIGFuIEVSUl9QVFIKKyAqIG90aGVyd2lzZS4KKyAqLworc3RhdGljIHN0cnVjdCBnYl9jb25uZWN0aW9uICoKK19nYl9jb25uZWN0aW9uX2NyZWF0ZShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCBpbnQgaGRfY3BvcnRfaWQsCisJCQkJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsIGludCBjcG9ydF9pZCwKKwkJCQlnYl9yZXF1ZXN0X2hhbmRsZXJfdCBoYW5kbGVyLAorCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmdiX2Nvbm5lY3Rpb25fbXV0ZXgpOworCisJaWYgKGludGYgJiYgZ2JfY29ubmVjdGlvbl9jcG9ydF9pbl91c2UoaW50ZiwgY3BvcnRfaWQpKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImNwb3J0ICV1IGFscmVhZHkgaW4gdXNlXG4iLCBjcG9ydF9pZCk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJfdW5sb2NrOworCX0KKworCXJldCA9IGdiX2hkX2Nwb3J0X2FsbG9jYXRlKGhkLCBoZF9jcG9ydF9pZCwgZmxhZ3MpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmhkLT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgY3BvcnQ6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl91bmxvY2s7CisJfQorCWhkX2Nwb3J0X2lkID0gcmV0OworCisJY29ubmVjdGlvbiA9IGt6YWxsb2Moc2l6ZW9mKCpjb25uZWN0aW9uKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb25uZWN0aW9uKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2hkX2Nwb3J0X3JlbGVhc2U7CisJfQorCisJY29ubmVjdGlvbi0+aGRfY3BvcnRfaWQgPSBoZF9jcG9ydF9pZDsKKwljb25uZWN0aW9uLT5pbnRmX2Nwb3J0X2lkID0gY3BvcnRfaWQ7CisJY29ubmVjdGlvbi0+aGQgPSBoZDsKKwljb25uZWN0aW9uLT5pbnRmID0gaW50ZjsKKwljb25uZWN0aW9uLT5idW5kbGUgPSBidW5kbGU7CisJY29ubmVjdGlvbi0+aGFuZGxlciA9IGhhbmRsZXI7CisJY29ubmVjdGlvbi0+ZmxhZ3MgPSBmbGFnczsKKwlpZiAoaW50ZiAmJiAoaW50Zi0+cXVpcmtzICYgR0JfSU5URVJGQUNFX1FVSVJLX05PX0NQT1JUX0ZFQVRVUkVTKSkKKwkJY29ubmVjdGlvbi0+ZmxhZ3MgfD0gR0JfQ09OTkVDVElPTl9GTEFHX05PX0ZMT1dDVFJMOworCWNvbm5lY3Rpb24tPnN0YXRlID0gR0JfQ09OTkVDVElPTl9TVEFURV9ESVNBQkxFRDsKKworCWF0b21pY19zZXQoJmNvbm5lY3Rpb24tPm9wX2N5Y2xlLCAwKTsKKwltdXRleF9pbml0KCZjb25uZWN0aW9uLT5tdXRleCk7CisJc3Bpbl9sb2NrX2luaXQoJmNvbm5lY3Rpb24tPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZjb25uZWN0aW9uLT5vcGVyYXRpb25zKTsKKworCWNvbm5lY3Rpb24tPndxID0gYWxsb2Nfd29ya3F1ZXVlKCIlczolZCIsIFdRX1VOQk9VTkQsIDEsCisJCQkJCSBkZXZfbmFtZSgmaGQtPmRldiksIGhkX2Nwb3J0X2lkKTsKKwlpZiAoIWNvbm5lY3Rpb24tPndxKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWVfY29ubmVjdGlvbjsKKwl9CisKKwlrcmVmX2luaXQoJmNvbm5lY3Rpb24tPmtyZWYpOworCisJZ2JfY29ubmVjdGlvbl9pbml0X25hbWUoY29ubmVjdGlvbik7CisKKwlzcGluX2xvY2tfaXJxKCZnYl9jb25uZWN0aW9uc19sb2NrKTsKKwlsaXN0X2FkZCgmY29ubmVjdGlvbi0+aGRfbGlua3MsICZoZC0+Y29ubmVjdGlvbnMpOworCisJaWYgKGJ1bmRsZSkKKwkJbGlzdF9hZGQoJmNvbm5lY3Rpb24tPmJ1bmRsZV9saW5rcywgJmJ1bmRsZS0+Y29ubmVjdGlvbnMpOworCWVsc2UKKwkJSU5JVF9MSVNUX0hFQUQoJmNvbm5lY3Rpb24tPmJ1bmRsZV9saW5rcyk7CisKKwlzcGluX3VubG9ja19pcnEoJmdiX2Nvbm5lY3Rpb25zX2xvY2spOworCisJbXV0ZXhfdW5sb2NrKCZnYl9jb25uZWN0aW9uX211dGV4KTsKKworCXRyYWNlX2diX2Nvbm5lY3Rpb25fY3JlYXRlKGNvbm5lY3Rpb24pOworCisJcmV0dXJuIGNvbm5lY3Rpb247CisKK2Vycl9mcmVlX2Nvbm5lY3Rpb246CisJa2ZyZWUoY29ubmVjdGlvbik7CitlcnJfaGRfY3BvcnRfcmVsZWFzZToKKwlnYl9oZF9jcG9ydF9yZWxlYXNlKGhkLCBoZF9jcG9ydF9pZCk7CitlcnJfdW5sb2NrOgorCW11dGV4X3VubG9jaygmZ2JfY29ubmVjdGlvbl9tdXRleCk7CisKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCitzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqCitnYl9jb25uZWN0aW9uX2NyZWF0ZV9zdGF0aWMoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGhkX2Nwb3J0X2lkLAorCQkJCQlnYl9yZXF1ZXN0X2hhbmRsZXJfdCBoYW5kbGVyKQoreworCXJldHVybiBfZ2JfY29ubmVjdGlvbl9jcmVhdGUoaGQsIGhkX2Nwb3J0X2lkLCBOVUxMLCBOVUxMLCAwLCBoYW5kbGVyLAorCQkJCQlHQl9DT05ORUNUSU9OX0ZMQUdfSElHSF9QUklPKTsKK30KKworc3RydWN0IGdiX2Nvbm5lY3Rpb24gKgorZ2JfY29ubmVjdGlvbl9jcmVhdGVfY29udHJvbChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCXJldHVybiBfZ2JfY29ubmVjdGlvbl9jcmVhdGUoaW50Zi0+aGQsIC0xLCBpbnRmLCBOVUxMLCAwLCBOVUxMLAorCQkJCQlHQl9DT05ORUNUSU9OX0ZMQUdfQ09OVFJPTCB8CisJCQkJCUdCX0NPTk5FQ1RJT05fRkxBR19ISUdIX1BSSU8pOworfQorCitzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqCitnYl9jb25uZWN0aW9uX2NyZWF0ZShzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsIHUxNiBjcG9ydF9pZCwKKwkJCQkJZ2JfcmVxdWVzdF9oYW5kbGVyX3QgaGFuZGxlcikKK3sKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gYnVuZGxlLT5pbnRmOworCisJcmV0dXJuIF9nYl9jb25uZWN0aW9uX2NyZWF0ZShpbnRmLT5oZCwgLTEsIGludGYsIGJ1bmRsZSwgY3BvcnRfaWQsCisJCQkJCWhhbmRsZXIsIDApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfY29ubmVjdGlvbl9jcmVhdGUpOworCitzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqCitnYl9jb25uZWN0aW9uX2NyZWF0ZV9mbGFncyhzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsIHUxNiBjcG9ydF9pZCwKKwkJCQkJZ2JfcmVxdWVzdF9oYW5kbGVyX3QgaGFuZGxlciwKKwkJCQkJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gYnVuZGxlLT5pbnRmOworCisJaWYgKFdBUk5fT05fT05DRShmbGFncyAmIEdCX0NPTk5FQ1RJT05fRkxBR19DT1JFX01BU0spKQorCQlmbGFncyAmPSB+R0JfQ09OTkVDVElPTl9GTEFHX0NPUkVfTUFTSzsKKworCXJldHVybiBfZ2JfY29ubmVjdGlvbl9jcmVhdGUoaW50Zi0+aGQsIC0xLCBpbnRmLCBidW5kbGUsIGNwb3J0X2lkLAorCQkJCQloYW5kbGVyLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9jb25uZWN0aW9uX2NyZWF0ZV9mbGFncyk7CisKK3N0cnVjdCBnYl9jb25uZWN0aW9uICoKK2diX2Nvbm5lY3Rpb25fY3JlYXRlX29mZmxvYWRlZChzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsIHUxNiBjcG9ydF9pZCwKKwkJCQkJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlmbGFncyB8PSBHQl9DT05ORUNUSU9OX0ZMQUdfT0ZGTE9BREVEOworCisJcmV0dXJuIGdiX2Nvbm5lY3Rpb25fY3JlYXRlX2ZsYWdzKGJ1bmRsZSwgY3BvcnRfaWQsIE5VTEwsIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2Nvbm5lY3Rpb25fY3JlYXRlX29mZmxvYWRlZCk7CisKK3N0YXRpYyBpbnQgZ2JfY29ubmVjdGlvbl9oZF9jcG9ydF9lbmFibGUoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCA9IGNvbm5lY3Rpb24tPmhkOworCWludCByZXQ7CisKKwlpZiAoIWhkLT5kcml2ZXItPmNwb3J0X2VuYWJsZSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBoZC0+ZHJpdmVyLT5jcG9ydF9lbmFibGUoaGQsIGNvbm5lY3Rpb24tPmhkX2Nwb3J0X2lkLAorCQkJCQljb25uZWN0aW9uLT5mbGFncyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZC0+ZGV2LCAiJXM6IGZhaWxlZCB0byBlbmFibGUgaG9zdCBjcG9ydDogJWRcbiIsCisJCQkJY29ubmVjdGlvbi0+bmFtZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2JfY29ubmVjdGlvbl9oZF9jcG9ydF9kaXNhYmxlKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSBjb25uZWN0aW9uLT5oZDsKKwlpbnQgcmV0OworCisJaWYgKCFoZC0+ZHJpdmVyLT5jcG9ydF9kaXNhYmxlKQorCQlyZXR1cm47CisKKwlyZXQgPSBoZC0+ZHJpdmVyLT5jcG9ydF9kaXNhYmxlKGhkLCBjb25uZWN0aW9uLT5oZF9jcG9ydF9pZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZC0+ZGV2LCAiJXM6IGZhaWxlZCB0byBkaXNhYmxlIGhvc3QgY3BvcnQ6ICVkXG4iLAorCQkJCWNvbm5lY3Rpb24tPm5hbWUsIHJldCk7CisJfQorfQorCitzdGF0aWMgaW50IGdiX2Nvbm5lY3Rpb25faGRfY3BvcnRfY29ubmVjdGVkKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSBjb25uZWN0aW9uLT5oZDsKKwlpbnQgcmV0OworCisJaWYgKCFoZC0+ZHJpdmVyLT5jcG9ydF9jb25uZWN0ZWQpCisJCXJldHVybiAwOworCisJcmV0ID0gaGQtPmRyaXZlci0+Y3BvcnRfY29ubmVjdGVkKGhkLCBjb25uZWN0aW9uLT5oZF9jcG9ydF9pZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZC0+ZGV2LCAiJXM6IGZhaWxlZCB0byBzZXQgY29ubmVjdGVkIHN0YXRlOiAlZFxuIiwKKwkJCQljb25uZWN0aW9uLT5uYW1lLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2Nvbm5lY3Rpb25faGRfY3BvcnRfZmx1c2goc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCA9IGNvbm5lY3Rpb24tPmhkOworCWludCByZXQ7CisKKwlpZiAoIWhkLT5kcml2ZXItPmNwb3J0X2ZsdXNoKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGhkLT5kcml2ZXItPmNwb3J0X2ZsdXNoKGhkLCBjb25uZWN0aW9uLT5oZF9jcG9ydF9pZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZC0+ZGV2LCAiJXM6IGZhaWxlZCB0byBmbHVzaCBob3N0IGNwb3J0OiAlZFxuIiwKKwkJCQljb25uZWN0aW9uLT5uYW1lLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2Nvbm5lY3Rpb25faGRfY3BvcnRfcXVpZXNjZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gY29ubmVjdGlvbi0+aGQ7CisJc2l6ZV90IHBlZXJfc3BhY2U7CisJaW50IHJldDsKKworCXBlZXJfc3BhY2UgPSBzaXplb2Yoc3RydWN0IGdiX29wZXJhdGlvbl9tc2dfaGRyKSArCisJCQlzaXplb2Yoc3RydWN0IGdiX2Nwb3J0X3NodXRkb3duX3JlcXVlc3QpOworCisJaWYgKGNvbm5lY3Rpb24tPm1vZGVfc3dpdGNoKQorCQlwZWVyX3NwYWNlICs9IHNpemVvZihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uX21zZ19oZHIpOworCisJcmV0ID0gaGQtPmRyaXZlci0+Y3BvcnRfcXVpZXNjZShoZCwgY29ubmVjdGlvbi0+aGRfY3BvcnRfaWQsCisJCQkJCXBlZXJfc3BhY2UsCisJCQkJCUdCX0NPTk5FQ1RJT05fQ1BPUlRfUVVJRVNDRV9USU1FT1VUKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkLT5kZXYsICIlczogZmFpbGVkIHRvIHF1aWVzY2UgaG9zdCBjcG9ydDogJWRcbiIsCisJCQkJY29ubmVjdGlvbi0+bmFtZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9jb25uZWN0aW9uX2hkX2Nwb3J0X2NsZWFyKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSBjb25uZWN0aW9uLT5oZDsKKwlpbnQgcmV0OworCisJcmV0ID0gaGQtPmRyaXZlci0+Y3BvcnRfY2xlYXIoaGQsIGNvbm5lY3Rpb24tPmhkX2Nwb3J0X2lkKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkLT5kZXYsICIlczogZmFpbGVkIHRvIGNsZWFyIGhvc3QgY3BvcnQ6ICVkXG4iLAorCQkJCWNvbm5lY3Rpb24tPm5hbWUsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXF1ZXN0IHRoZSBTVkMgdG8gY3JlYXRlIGEgY29ubmVjdGlvbiBmcm9tIEFQJ3MgY3BvcnQgdG8gaW50ZXJmYWNlJ3MKKyAqIGNwb3J0LgorICovCitzdGF0aWMgaW50CitnYl9jb25uZWN0aW9uX3N2Y19jb25uZWN0aW9uX2NyZWF0ZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gY29ubmVjdGlvbi0+aGQ7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZjsKKwl1OCBjcG9ydF9mbGFnczsKKwlpbnQgcmV0OworCisJaWYgKGdiX2Nvbm5lY3Rpb25faXNfc3RhdGljKGNvbm5lY3Rpb24pKQorCQlyZXR1cm4gMDsKKworCWludGYgPSBjb25uZWN0aW9uLT5pbnRmOworCisJLyoKKwkgKiBFbmFibGUgZWl0aGVyIEUyRUZDIG9yIENTRCwgdW5sZXNzIG5vIGZsb3cgY29udHJvbCBpcyByZXF1ZXN0ZWQuCisJICovCisJY3BvcnRfZmxhZ3MgPSBHQl9TVkNfQ1BPUlRfRkxBR19DU1ZfTjsKKwlpZiAoZ2JfY29ubmVjdGlvbl9mbG93X2NvbnRyb2xfZGlzYWJsZWQoY29ubmVjdGlvbikpIHsKKwkJY3BvcnRfZmxhZ3MgfD0gR0JfU1ZDX0NQT1JUX0ZMQUdfQ1NEX047CisJfSBlbHNlIGlmIChnYl9jb25uZWN0aW9uX2UyZWZjX2VuYWJsZWQoY29ubmVjdGlvbikpIHsKKwkJY3BvcnRfZmxhZ3MgfD0gR0JfU1ZDX0NQT1JUX0ZMQUdfQ1NEX04gfAorCQkJCUdCX1NWQ19DUE9SVF9GTEFHX0UyRUZDOworCX0KKworCXJldCA9IGdiX3N2Y19jb25uZWN0aW9uX2NyZWF0ZShoZC0+c3ZjLAorCQkJaGQtPnN2Yy0+YXBfaW50Zl9pZCwKKwkJCWNvbm5lY3Rpb24tPmhkX2Nwb3J0X2lkLAorCQkJaW50Zi0+aW50ZXJmYWNlX2lkLAorCQkJY29ubmVjdGlvbi0+aW50Zl9jcG9ydF9pZCwKKwkJCWNwb3J0X2ZsYWdzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmhkLT5kZXYsCisJCQkiJXM6IGZhaWxlZCB0byBjcmVhdGUgc3ZjIGNvbm5lY3Rpb246ICVkXG4iLAorCQkJY29ubmVjdGlvbi0+bmFtZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2diX2Nvbm5lY3Rpb25fc3ZjX2Nvbm5lY3Rpb25fZGVzdHJveShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlpZiAoZ2JfY29ubmVjdGlvbl9pc19zdGF0aWMoY29ubmVjdGlvbikpCisJCXJldHVybjsKKworCWdiX3N2Y19jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbi0+aGQtPnN2YywKKwkJCQkgIGNvbm5lY3Rpb24tPmhkLT5zdmMtPmFwX2ludGZfaWQsCisJCQkJICBjb25uZWN0aW9uLT5oZF9jcG9ydF9pZCwKKwkJCQkgIGNvbm5lY3Rpb24tPmludGYtPmludGVyZmFjZV9pZCwKKwkJCQkgIGNvbm5lY3Rpb24tPmludGZfY3BvcnRfaWQpOworfQorCisvKiBJbmZvcm0gSW50ZXJmYWNlIGFib3V0IGFjdGl2ZSBDUG9ydHMgKi8KK3N0YXRpYyBpbnQgZ2JfY29ubmVjdGlvbl9jb250cm9sX2Nvbm5lY3RlZChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbDsKKwl1MTYgY3BvcnRfaWQgPSBjb25uZWN0aW9uLT5pbnRmX2Nwb3J0X2lkOworCWludCByZXQ7CisKKwlpZiAoZ2JfY29ubmVjdGlvbl9pc19zdGF0aWMoY29ubmVjdGlvbikpCisJCXJldHVybiAwOworCisJaWYgKGdiX2Nvbm5lY3Rpb25faXNfY29udHJvbChjb25uZWN0aW9uKSkKKwkJcmV0dXJuIDA7CisKKwljb250cm9sID0gY29ubmVjdGlvbi0+aW50Zi0+Y29udHJvbDsKKworCXJldCA9IGdiX2NvbnRyb2xfY29ubmVjdGVkX29wZXJhdGlvbihjb250cm9sLCBjcG9ydF9pZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCSJmYWlsZWQgdG8gY29ubmVjdCBjcG9ydDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitnYl9jb25uZWN0aW9uX2NvbnRyb2xfZGlzY29ubmVjdGluZyhzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbDsKKwl1MTYgY3BvcnRfaWQgPSBjb25uZWN0aW9uLT5pbnRmX2Nwb3J0X2lkOworCWludCByZXQ7CisKKwlpZiAoZ2JfY29ubmVjdGlvbl9pc19zdGF0aWMoY29ubmVjdGlvbikpCisJCXJldHVybjsKKworCWNvbnRyb2wgPSBjb25uZWN0aW9uLT5pbnRmLT5jb250cm9sOworCisJcmV0ID0gZ2JfY29udHJvbF9kaXNjb25uZWN0aW5nX29wZXJhdGlvbihjb250cm9sLCBjcG9ydF9pZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5oZC0+ZGV2LAorCQkJCSIlczogZmFpbGVkIHRvIHNlbmQgZGlzY29ubmVjdGluZzogJWRcbiIsCisJCQkJY29ubmVjdGlvbi0+bmFtZSwgcmV0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitnYl9jb25uZWN0aW9uX2NvbnRyb2xfZGlzY29ubmVjdGVkKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXN0cnVjdCBnYl9jb250cm9sICpjb250cm9sOworCXUxNiBjcG9ydF9pZCA9IGNvbm5lY3Rpb24tPmludGZfY3BvcnRfaWQ7CisJaW50IHJldDsKKworCWlmIChnYl9jb25uZWN0aW9uX2lzX3N0YXRpYyhjb25uZWN0aW9uKSkKKwkJcmV0dXJuOworCisJY29udHJvbCA9IGNvbm5lY3Rpb24tPmludGYtPmNvbnRyb2w7CisKKwlpZiAoZ2JfY29ubmVjdGlvbl9pc19jb250cm9sKGNvbm5lY3Rpb24pKSB7CisJCWlmIChjb25uZWN0aW9uLT5tb2RlX3N3aXRjaCkgeworCQkJcmV0ID0gZ2JfY29udHJvbF9tb2RlX3N3aXRjaF9vcGVyYXRpb24oY29udHJvbCk7CisJCQlpZiAocmV0KSB7CisJCQkJLyoKKwkJCQkgKiBBbGxvdyBtb2RlIHN3aXRjaCB0byB0aW1lIG91dCB3YWl0aW5nIGZvcgorCQkJCSAqIG1haWxib3ggZXZlbnQuCisJCQkJICovCisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJcmV0dXJuOworCX0KKworCXJldCA9IGdiX2NvbnRyb2xfZGlzY29ubmVjdGVkX29wZXJhdGlvbihjb250cm9sLCBjcG9ydF9pZCk7CisJaWYgKHJldCkgeworCQlkZXZfd2FybigmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkgImZhaWxlZCB0byBkaXNjb25uZWN0IGNwb3J0OiAlZFxuIiwgcmV0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2JfY29ubmVjdGlvbl9zaHV0ZG93bl9vcGVyYXRpb24oc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCQl1OCBwaGFzZSkKK3sKKwlzdHJ1Y3QgZ2JfY3BvcnRfc2h1dGRvd25fcmVxdWVzdCAqcmVxOworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKwlpbnQgcmV0OworCisJb3BlcmF0aW9uID0gZ2Jfb3BlcmF0aW9uX2NyZWF0ZV9jb3JlKGNvbm5lY3Rpb24sCisJCQkJCQlHQl9SRVFVRVNUX1RZUEVfQ1BPUlRfU0hVVERPV04sCisJCQkJCQlzaXplb2YoKnJlcSksIDAsIDAsCisJCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIW9wZXJhdGlvbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXEgPSBvcGVyYXRpb24tPnJlcXVlc3QtPnBheWxvYWQ7CisJcmVxLT5waGFzZSA9IHBoYXNlOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZF9zeW5jKG9wZXJhdGlvbik7CisKKwlnYl9vcGVyYXRpb25fcHV0KG9wZXJhdGlvbik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2Nvbm5lY3Rpb25fY3BvcnRfc2h1dGRvd24oc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCXU4IHBoYXNlKQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSBjb25uZWN0aW9uLT5oZDsKKwljb25zdCBzdHJ1Y3QgZ2JfaGRfZHJpdmVyICpkcnYgPSBoZC0+ZHJpdmVyOworCWludCByZXQ7CisKKwlpZiAoZ2JfY29ubmVjdGlvbl9pc19zdGF0aWMoY29ubmVjdGlvbikpCisJCXJldHVybiAwOworCisJaWYgKGdiX2Nvbm5lY3Rpb25faXNfb2ZmbG9hZGVkKGNvbm5lY3Rpb24pKSB7CisJCWlmICghZHJ2LT5jcG9ydF9zaHV0ZG93bikKKwkJCXJldHVybiAwOworCisJCXJldCA9IGRydi0+Y3BvcnRfc2h1dGRvd24oaGQsIGNvbm5lY3Rpb24tPmhkX2Nwb3J0X2lkLCBwaGFzZSwKKwkJCQkJCUdCX09QRVJBVElPTl9USU1FT1VUX0RFRkFVTFQpOworCX0gZWxzZSB7CisJCXJldCA9IGdiX2Nvbm5lY3Rpb25fc2h1dGRvd25fb3BlcmF0aW9uKGNvbm5lY3Rpb24sIHBoYXNlKTsKKwl9CisKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkLT5kZXYsICIlczogZmFpbGVkIHRvIHNlbmQgY3BvcnQgc2h1dGRvd24gKHBoYXNlICVkKTogJWRcbiIsCisJCQkJY29ubmVjdGlvbi0+bmFtZSwgcGhhc2UsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2diX2Nvbm5lY3Rpb25fY3BvcnRfc2h1dGRvd25fcGhhc2VfMShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlyZXR1cm4gZ2JfY29ubmVjdGlvbl9jcG9ydF9zaHV0ZG93bihjb25uZWN0aW9uLCAxKTsKK30KKworc3RhdGljIGludAorZ2JfY29ubmVjdGlvbl9jcG9ydF9zaHV0ZG93bl9waGFzZV8yKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXJldHVybiBnYl9jb25uZWN0aW9uX2Nwb3J0X3NodXRkb3duKGNvbm5lY3Rpb24sIDIpOworfQorCisvKgorICogQ2FuY2VsIGFsbCBhY3RpdmUgb3BlcmF0aW9ucyBvbiBhIGNvbm5lY3Rpb24uCisgKgorICogTG9ja2luZzogQ2FsbGVkIHdpdGggY29ubmVjdGlvbiBsb2NrIGhlbGQgYW5kIHN0YXRlIHNldCB0byBESVNBQkxFRCBvcgorICogRElTQ09OTkVDVElORy4KKyAqLworc3RhdGljIHZvaWQgZ2JfY29ubmVjdGlvbl9jYW5jZWxfb3BlcmF0aW9ucyhzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJCWludCBlcnJubykKKwlfX211c3RfaG9sZCgmY29ubmVjdGlvbi0+bG9jaykKK3sKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNvbm5lY3Rpb24tPm9wZXJhdGlvbnMpKSB7CisJCW9wZXJhdGlvbiA9IGxpc3RfbGFzdF9lbnRyeSgmY29ubmVjdGlvbi0+b3BlcmF0aW9ucywKKwkJCQkJCXN0cnVjdCBnYl9vcGVyYXRpb24sIGxpbmtzKTsKKwkJZ2Jfb3BlcmF0aW9uX2dldChvcGVyYXRpb24pOworCQlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPmxvY2spOworCisJCWlmIChnYl9vcGVyYXRpb25faXNfaW5jb21pbmcob3BlcmF0aW9uKSkKKwkJCWdiX29wZXJhdGlvbl9jYW5jZWxfaW5jb21pbmcob3BlcmF0aW9uLCBlcnJubyk7CisJCWVsc2UKKwkJCWdiX29wZXJhdGlvbl9jYW5jZWwob3BlcmF0aW9uLCBlcnJubyk7CisKKwkJZ2Jfb3BlcmF0aW9uX3B1dChvcGVyYXRpb24pOworCisJCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPmxvY2spOworCX0KK30KKworLyoKKyAqIENhbmNlbCBhbGwgYWN0aXZlIGluY29taW5nIG9wZXJhdGlvbnMgb24gYSBjb25uZWN0aW9uLgorICoKKyAqIExvY2tpbmc6IENhbGxlZCB3aXRoIGNvbm5lY3Rpb24gbG9jayBoZWxkIGFuZCBzdGF0ZSBzZXQgdG8gRU5BQkxFRF9UWC4KKyAqLworc3RhdGljIHZvaWQKK2diX2Nvbm5lY3Rpb25fZmx1c2hfaW5jb21pbmdfb3BlcmF0aW9ucyhzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJCWludCBlcnJubykKKwlfX211c3RfaG9sZCgmY29ubmVjdGlvbi0+bG9jaykKK3sKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJYm9vbCBpbmNvbWluZzsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmY29ubmVjdGlvbi0+b3BlcmF0aW9ucykpIHsKKwkJaW5jb21pbmcgPSBmYWxzZTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShvcGVyYXRpb24sICZjb25uZWN0aW9uLT5vcGVyYXRpb25zLAorCQkJCQkJCQlsaW5rcykgeworCQkJaWYgKGdiX29wZXJhdGlvbl9pc19pbmNvbWluZyhvcGVyYXRpb24pKSB7CisJCQkJZ2Jfb3BlcmF0aW9uX2dldChvcGVyYXRpb24pOworCQkJCWluY29taW5nID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICghaW5jb21pbmcpCisJCQlicmVhazsKKworCQlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPmxvY2spOworCisJCS8qIEZJWE1FOiBmbHVzaCwgbm90IGNhbmNlbD8gKi8KKwkJZ2Jfb3BlcmF0aW9uX2NhbmNlbF9pbmNvbWluZyhvcGVyYXRpb24sIGVycm5vKTsKKwkJZ2Jfb3BlcmF0aW9uX3B1dChvcGVyYXRpb24pOworCisJCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPmxvY2spOworCX0KK30KKworLyoKKyAqIF9nYl9jb25uZWN0aW9uX2VuYWJsZSgpIC0gZW5hYmxlIGEgY29ubmVjdGlvbgorICogQGNvbm5lY3Rpb246CQljb25uZWN0aW9uIHRvIGVuYWJsZQorICogQHJ4OgkJCXdoZXRoZXIgdG8gZW5hYmxlIGluY29taW5nIHJlcXVlc3RzCisgKgorICogQ29ubmVjdGlvbi1lbmFibGUgaGVscGVyIGZvciBESVNBQkxFRC0+RU5BQkxFRCwgRElTQUJMRUQtPkVOQUJMRURfVFgsIGFuZAorICogRU5BQkxFRF9UWC0+RU5BQkxFRCBzdGF0ZSB0cmFuc2l0aW9ucy4KKyAqCisgKiBMb2NraW5nOiBDYWxsZXIgaG9sZHMgY29ubmVjdGlvbi0+bXV0ZXguCisgKi8KK3N0YXRpYyBpbnQgX2diX2Nvbm5lY3Rpb25fZW5hYmxlKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBib29sIHJ4KQoreworCWludCByZXQ7CisKKwkvKiBIYW5kbGUgRU5BQkxFRF9UWCAtPiBFTkFCTEVEIHRyYW5zaXRpb25zLiAqLworCWlmIChjb25uZWN0aW9uLT5zdGF0ZSA9PSBHQl9DT05ORUNUSU9OX1NUQVRFX0VOQUJMRURfVFgpIHsKKwkJaWYgKCEoY29ubmVjdGlvbi0+aGFuZGxlciAmJiByeCkpCisJCQlyZXR1cm4gMDsKKworCQlzcGluX2xvY2tfaXJxKCZjb25uZWN0aW9uLT5sb2NrKTsKKwkJY29ubmVjdGlvbi0+c3RhdGUgPSBHQl9DT05ORUNUSU9OX1NUQVRFX0VOQUJMRUQ7CisJCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+bG9jayk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9oZF9jcG9ydF9lbmFibGUoY29ubmVjdGlvbik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdiX2Nvbm5lY3Rpb25fc3ZjX2Nvbm5lY3Rpb25fY3JlYXRlKGNvbm5lY3Rpb24pOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2hkX2Nwb3J0X2NsZWFyOworCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9oZF9jcG9ydF9jb25uZWN0ZWQoY29ubmVjdGlvbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfc3ZjX2Nvbm5lY3Rpb25fZGVzdHJveTsKKworCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPmxvY2spOworCWlmIChjb25uZWN0aW9uLT5oYW5kbGVyICYmIHJ4KQorCQljb25uZWN0aW9uLT5zdGF0ZSA9IEdCX0NPTk5FQ1RJT05fU1RBVEVfRU5BQkxFRDsKKwllbHNlCisJCWNvbm5lY3Rpb24tPnN0YXRlID0gR0JfQ09OTkVDVElPTl9TVEFURV9FTkFCTEVEX1RYOworCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+bG9jayk7CisKKwlyZXQgPSBnYl9jb25uZWN0aW9uX2NvbnRyb2xfY29ubmVjdGVkKGNvbm5lY3Rpb24pOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2NvbnRyb2xfZGlzY29ubmVjdGluZzsKKworCXJldHVybiAwOworCitlcnJfY29udHJvbF9kaXNjb25uZWN0aW5nOgorCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPmxvY2spOworCWNvbm5lY3Rpb24tPnN0YXRlID0gR0JfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNUSU5HOworCWdiX2Nvbm5lY3Rpb25fY2FuY2VsX29wZXJhdGlvbnMoY29ubmVjdGlvbiwgLUVTSFVURE9XTik7CisJc3Bpbl91bmxvY2tfaXJxKCZjb25uZWN0aW9uLT5sb2NrKTsKKworCS8qIFRyYW5zbWl0IHF1ZXVlIHNob3VsZCBhbHJlYWR5IGJlIGVtcHR5LiAqLworCWdiX2Nvbm5lY3Rpb25faGRfY3BvcnRfZmx1c2goY29ubmVjdGlvbik7CisKKwlnYl9jb25uZWN0aW9uX2NvbnRyb2xfZGlzY29ubmVjdGluZyhjb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2Nwb3J0X3NodXRkb3duX3BoYXNlXzEoY29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9oZF9jcG9ydF9xdWllc2NlKGNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fY3BvcnRfc2h1dGRvd25fcGhhc2VfMihjb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2NvbnRyb2xfZGlzY29ubmVjdGVkKGNvbm5lY3Rpb24pOworCWNvbm5lY3Rpb24tPnN0YXRlID0gR0JfQ09OTkVDVElPTl9TVEFURV9ESVNBQkxFRDsKK2Vycl9zdmNfY29ubmVjdGlvbl9kZXN0cm95OgorCWdiX2Nvbm5lY3Rpb25fc3ZjX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKK2Vycl9oZF9jcG9ydF9jbGVhcjoKKwlnYl9jb25uZWN0aW9uX2hkX2Nwb3J0X2NsZWFyKGNvbm5lY3Rpb24pOworCisJZ2JfY29ubmVjdGlvbl9oZF9jcG9ydF9kaXNhYmxlKGNvbm5lY3Rpb24pOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmY29ubmVjdGlvbi0+bXV0ZXgpOworCisJaWYgKGNvbm5lY3Rpb24tPnN0YXRlID09IEdCX0NPTk5FQ1RJT05fU1RBVEVfRU5BQkxFRCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJcmV0ID0gX2diX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm5lY3Rpb24sIHRydWUpOworCWlmICghcmV0KQorCQl0cmFjZV9nYl9jb25uZWN0aW9uX2VuYWJsZShjb25uZWN0aW9uKTsKKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9jb25uZWN0aW9uX2VuYWJsZSk7CisKK2ludCBnYl9jb25uZWN0aW9uX2VuYWJsZV90eChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPm11dGV4KTsKKworCWlmIChjb25uZWN0aW9uLT5zdGF0ZSA9PSBHQl9DT05ORUNUSU9OX1NUQVRFX0VOQUJMRUQpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWlmIChjb25uZWN0aW9uLT5zdGF0ZSA9PSBHQl9DT05ORUNUSU9OX1NUQVRFX0VOQUJMRURfVFgpCisJCWdvdG8gb3V0X3VubG9jazsKKworCXJldCA9IF9nYl9jb25uZWN0aW9uX2VuYWJsZShjb25uZWN0aW9uLCBmYWxzZSk7CisJaWYgKCFyZXQpCisJCXRyYWNlX2diX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm5lY3Rpb24pOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2Nvbm5lY3Rpb25fZW5hYmxlX3R4KTsKKwordm9pZCBnYl9jb25uZWN0aW9uX2Rpc2FibGVfcngoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJbXV0ZXhfbG9jaygmY29ubmVjdGlvbi0+bXV0ZXgpOworCisJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+bG9jayk7CisJaWYgKGNvbm5lY3Rpb24tPnN0YXRlICE9IEdCX0NPTk5FQ1RJT05fU1RBVEVfRU5BQkxFRCkgeworCQlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPmxvY2spOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCWNvbm5lY3Rpb24tPnN0YXRlID0gR0JfQ09OTkVDVElPTl9TVEFURV9FTkFCTEVEX1RYOworCWdiX2Nvbm5lY3Rpb25fZmx1c2hfaW5jb21pbmdfb3BlcmF0aW9ucyhjb25uZWN0aW9uLCAtRVNIVVRET1dOKTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPmxvY2spOworCisJdHJhY2VfZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+bXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfY29ubmVjdGlvbl9kaXNhYmxlX3J4KTsKKwordm9pZCBnYl9jb25uZWN0aW9uX21vZGVfc3dpdGNoX3ByZXBhcmUoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJY29ubmVjdGlvbi0+bW9kZV9zd2l0Y2ggPSB0cnVlOworfQorCit2b2lkIGdiX2Nvbm5lY3Rpb25fbW9kZV9zd2l0Y2hfY29tcGxldGUoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJZ2JfY29ubmVjdGlvbl9zdmNfY29ubmVjdGlvbl9kZXN0cm95KGNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25faGRfY3BvcnRfY2xlYXIoY29ubmVjdGlvbik7CisKKwlnYl9jb25uZWN0aW9uX2hkX2Nwb3J0X2Rpc2FibGUoY29ubmVjdGlvbik7CisKKwljb25uZWN0aW9uLT5tb2RlX3N3aXRjaCA9IGZhbHNlOworfQorCit2b2lkIGdiX2Nvbm5lY3Rpb25fZGlzYWJsZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwltdXRleF9sb2NrKCZjb25uZWN0aW9uLT5tdXRleCk7CisKKwlpZiAoY29ubmVjdGlvbi0+c3RhdGUgPT0gR0JfQ09OTkVDVElPTl9TVEFURV9ESVNBQkxFRCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJdHJhY2VfZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworCisJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+bG9jayk7CisJY29ubmVjdGlvbi0+c3RhdGUgPSBHQl9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RJTkc7CisJZ2JfY29ubmVjdGlvbl9jYW5jZWxfb3BlcmF0aW9ucyhjb25uZWN0aW9uLCAtRVNIVVRET1dOKTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPmxvY2spOworCisJZ2JfY29ubmVjdGlvbl9oZF9jcG9ydF9mbHVzaChjb25uZWN0aW9uKTsKKworCWdiX2Nvbm5lY3Rpb25fY29udHJvbF9kaXNjb25uZWN0aW5nKGNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fY3BvcnRfc2h1dGRvd25fcGhhc2VfMShjb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2hkX2Nwb3J0X3F1aWVzY2UoY29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9jcG9ydF9zaHV0ZG93bl9waGFzZV8yKGNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fY29udHJvbF9kaXNjb25uZWN0ZWQoY29ubmVjdGlvbik7CisKKwljb25uZWN0aW9uLT5zdGF0ZSA9IEdCX0NPTk5FQ1RJT05fU1RBVEVfRElTQUJMRUQ7CisKKwkvKiBjb250cm9sLWNvbm5lY3Rpb24gdGVhciBkb3duIGlzIGRlZmVycmVkIHdoZW4gbW9kZSBzd2l0Y2hpbmcgKi8KKwlpZiAoIWNvbm5lY3Rpb24tPm1vZGVfc3dpdGNoKSB7CisJCWdiX2Nvbm5lY3Rpb25fc3ZjX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKKwkJZ2JfY29ubmVjdGlvbl9oZF9jcG9ydF9jbGVhcihjb25uZWN0aW9uKTsKKworCQlnYl9jb25uZWN0aW9uX2hkX2Nwb3J0X2Rpc2FibGUoY29ubmVjdGlvbik7CisJfQorCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+bXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfY29ubmVjdGlvbl9kaXNhYmxlKTsKKworLyogRGlzYWJsZSBhIGNvbm5lY3Rpb24gd2l0aG91dCBjb21tdW5pY2F0aW5nIHdpdGggdGhlIHJlbW90ZSBlbmQuICovCit2b2lkIGdiX2Nvbm5lY3Rpb25fZGlzYWJsZV9mb3JjZWQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJbXV0ZXhfbG9jaygmY29ubmVjdGlvbi0+bXV0ZXgpOworCisJaWYgKGNvbm5lY3Rpb24tPnN0YXRlID09IEdCX0NPTk5FQ1RJT05fU1RBVEVfRElTQUJMRUQpCisJCWdvdG8gb3V0X3VubG9jazsKKworCXRyYWNlX2diX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKKworCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPmxvY2spOworCWNvbm5lY3Rpb24tPnN0YXRlID0gR0JfQ09OTkVDVElPTl9TVEFURV9ESVNBQkxFRDsKKwlnYl9jb25uZWN0aW9uX2NhbmNlbF9vcGVyYXRpb25zKGNvbm5lY3Rpb24sIC1FU0hVVERPV04pOworCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+bG9jayk7CisKKwlnYl9jb25uZWN0aW9uX2hkX2Nwb3J0X2ZsdXNoKGNvbm5lY3Rpb24pOworCisJZ2JfY29ubmVjdGlvbl9zdmNfY29ubmVjdGlvbl9kZXN0cm95KGNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25faGRfY3BvcnRfY2xlYXIoY29ubmVjdGlvbik7CisKKwlnYl9jb25uZWN0aW9uX2hkX2Nwb3J0X2Rpc2FibGUoY29ubmVjdGlvbik7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+bXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfY29ubmVjdGlvbl9kaXNhYmxlX2ZvcmNlZCk7CisKKy8qIENhbGxlciBtdXN0IGhhdmUgZGlzYWJsZWQgdGhlIGNvbm5lY3Rpb24gYmVmb3JlIGRlc3Ryb3lpbmcgaXQuICovCit2b2lkIGdiX2Nvbm5lY3Rpb25fZGVzdHJveShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlpZiAoIWNvbm5lY3Rpb24pCisJCXJldHVybjsKKworCWlmIChXQVJOX09OKGNvbm5lY3Rpb24tPnN0YXRlICE9IEdCX0NPTk5FQ1RJT05fU1RBVEVfRElTQUJMRUQpKQorCQlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7CisKKwltdXRleF9sb2NrKCZnYl9jb25uZWN0aW9uX211dGV4KTsKKworCXNwaW5fbG9ja19pcnEoJmdiX2Nvbm5lY3Rpb25zX2xvY2spOworCWxpc3RfZGVsKCZjb25uZWN0aW9uLT5idW5kbGVfbGlua3MpOworCWxpc3RfZGVsKCZjb25uZWN0aW9uLT5oZF9saW5rcyk7CisJc3Bpbl91bmxvY2tfaXJxKCZnYl9jb25uZWN0aW9uc19sb2NrKTsKKworCWRlc3Ryb3lfd29ya3F1ZXVlKGNvbm5lY3Rpb24tPndxKTsKKworCWdiX2hkX2Nwb3J0X3JlbGVhc2UoY29ubmVjdGlvbi0+aGQsIGNvbm5lY3Rpb24tPmhkX2Nwb3J0X2lkKTsKKwljb25uZWN0aW9uLT5oZF9jcG9ydF9pZCA9IENQT1JUX0lEX0JBRDsKKworCW11dGV4X3VubG9jaygmZ2JfY29ubmVjdGlvbl9tdXRleCk7CisKKwlnYl9jb25uZWN0aW9uX3B1dChjb25uZWN0aW9uKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2Nvbm5lY3Rpb25fZGVzdHJveSk7CisKK3ZvaWQgZ2JfY29ubmVjdGlvbl9sYXRlbmN5X3RhZ19lbmFibGUoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCA9IGNvbm5lY3Rpb24tPmhkOworCWludCByZXQ7CisKKwlpZiAoIWhkLT5kcml2ZXItPmxhdGVuY3lfdGFnX2VuYWJsZSkKKwkJcmV0dXJuOworCisJcmV0ID0gaGQtPmRyaXZlci0+bGF0ZW5jeV90YWdfZW5hYmxlKGhkLCBjb25uZWN0aW9uLT5oZF9jcG9ydF9pZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5oZC0+ZGV2LAorCQkJIiVzOiBmYWlsZWQgdG8gZW5hYmxlIGxhdGVuY3kgdGFnOiAlZFxuIiwKKwkJCWNvbm5lY3Rpb24tPm5hbWUsIHJldCk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfY29ubmVjdGlvbl9sYXRlbmN5X3RhZ19lbmFibGUpOworCit2b2lkIGdiX2Nvbm5lY3Rpb25fbGF0ZW5jeV90YWdfZGlzYWJsZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gY29ubmVjdGlvbi0+aGQ7CisJaW50IHJldDsKKworCWlmICghaGQtPmRyaXZlci0+bGF0ZW5jeV90YWdfZGlzYWJsZSkKKwkJcmV0dXJuOworCisJcmV0ID0gaGQtPmRyaXZlci0+bGF0ZW5jeV90YWdfZGlzYWJsZShoZCwgY29ubmVjdGlvbi0+aGRfY3BvcnRfaWQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+aGQtPmRldiwKKwkJCSIlczogZmFpbGVkIHRvIGRpc2FibGUgbGF0ZW5jeSB0YWc6ICVkXG4iLAorCQkJY29ubmVjdGlvbi0+bmFtZSwgcmV0KTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9jb25uZWN0aW9uX2xhdGVuY3lfdGFnX2Rpc2FibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvY29ubmVjdGlvbi5oIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvY29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOWY0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9jb25uZWN0aW9uLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBHcmV5YnVzIGNvbm5lY3Rpb25zCisgKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2lmbmRlZiBfX0NPTk5FQ1RJT05fSAorI2RlZmluZSBfX0NPTk5FQ1RJT05fSAorCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisKKyNkZWZpbmUgR0JfQ09OTkVDVElPTl9GTEFHX0NTRAkJQklUKDApCisjZGVmaW5lIEdCX0NPTk5FQ1RJT05fRkxBR19OT19GTE9XQ1RSTAlCSVQoMSkKKyNkZWZpbmUgR0JfQ09OTkVDVElPTl9GTEFHX09GRkxPQURFRAlCSVQoMikKKyNkZWZpbmUgR0JfQ09OTkVDVElPTl9GTEFHX0NEU0kxCUJJVCgzKQorI2RlZmluZSBHQl9DT05ORUNUSU9OX0ZMQUdfQ09OVFJPTAlCSVQoNCkKKyNkZWZpbmUgR0JfQ09OTkVDVElPTl9GTEFHX0hJR0hfUFJJTwlCSVQoNSkKKworI2RlZmluZSBHQl9DT05ORUNUSU9OX0ZMQUdfQ09SRV9NQVNLCUdCX0NPTk5FQ1RJT05fRkxBR19DT05UUk9MCisKK2VudW0gZ2JfY29ubmVjdGlvbl9zdGF0ZSB7CisJR0JfQ09OTkVDVElPTl9TVEFURV9ESVNBQkxFRAkJPSAwLAorCUdCX0NPTk5FQ1RJT05fU1RBVEVfRU5BQkxFRF9UWAkJPSAxLAorCUdCX0NPTk5FQ1RJT05fU1RBVEVfRU5BQkxFRAkJPSAyLAorCUdCX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVElORwk9IDMsCit9OworCitzdHJ1Y3QgZ2Jfb3BlcmF0aW9uOworCit0eXBlZGVmIGludCAoKmdiX3JlcXVlc3RfaGFuZGxlcl90KShzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICopOworCitzdHJ1Y3QgZ2JfY29ubmVjdGlvbiB7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlCQkqaGQ7CisJc3RydWN0IGdiX2ludGVyZmFjZQkJKmludGY7CisJc3RydWN0IGdiX2J1bmRsZQkJKmJ1bmRsZTsKKwlzdHJ1Y3Qga3JlZgkJCWtyZWY7CisJdTE2CQkJCWhkX2Nwb3J0X2lkOworCXUxNgkJCQlpbnRmX2Nwb3J0X2lkOworCisJc3RydWN0IGxpc3RfaGVhZAkJaGRfbGlua3M7CisJc3RydWN0IGxpc3RfaGVhZAkJYnVuZGxlX2xpbmtzOworCisJZ2JfcmVxdWVzdF9oYW5kbGVyX3QJCWhhbmRsZXI7CisJdW5zaWduZWQgbG9uZwkJCWZsYWdzOworCisJc3RydWN0IG11dGV4CQkJbXV0ZXg7CisJc3BpbmxvY2tfdAkJCWxvY2s7CisJZW51bSBnYl9jb25uZWN0aW9uX3N0YXRlCXN0YXRlOworCXN0cnVjdCBsaXN0X2hlYWQJCW9wZXJhdGlvbnM7CisKKwljaGFyCQkJCW5hbWVbMTZdOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CQkqd3E7CisKKwlhdG9taWNfdAkJCW9wX2N5Y2xlOworCisJdm9pZAkJCQkqcHJpdmF0ZTsKKworCWJvb2wJCQkJbW9kZV9zd2l0Y2g7Cit9OworCitzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqZ2JfY29ubmVjdGlvbl9jcmVhdGVfc3RhdGljKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsCisJCQkJdTE2IGhkX2Nwb3J0X2lkLCBnYl9yZXF1ZXN0X2hhbmRsZXJfdCBoYW5kbGVyKTsKK3N0cnVjdCBnYl9jb25uZWN0aW9uICpnYl9jb25uZWN0aW9uX2NyZWF0ZV9jb250cm9sKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpOworc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmdiX2Nvbm5lY3Rpb25fY3JlYXRlKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSwKKwkJCQl1MTYgY3BvcnRfaWQsIGdiX3JlcXVlc3RfaGFuZGxlcl90IGhhbmRsZXIpOworc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmdiX2Nvbm5lY3Rpb25fY3JlYXRlX2ZsYWdzKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSwKKwkJCQl1MTYgY3BvcnRfaWQsIGdiX3JlcXVlc3RfaGFuZGxlcl90IGhhbmRsZXIsCisJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7CitzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqZ2JfY29ubmVjdGlvbl9jcmVhdGVfb2ZmbG9hZGVkKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSwKKwkJCQl1MTYgY3BvcnRfaWQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwordm9pZCBnYl9jb25uZWN0aW9uX2Rlc3Ryb3koc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCitzdGF0aWMgaW5saW5lIGJvb2wgZ2JfY29ubmVjdGlvbl9pc19zdGF0aWMoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJcmV0dXJuICFjb25uZWN0aW9uLT5pbnRmOworfQorCitpbnQgZ2JfY29ubmVjdGlvbl9lbmFibGUoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworaW50IGdiX2Nvbm5lY3Rpb25fZW5hYmxlX3R4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK3ZvaWQgZ2JfY29ubmVjdGlvbl9kaXNhYmxlX3J4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK3ZvaWQgZ2JfY29ubmVjdGlvbl9kaXNhYmxlKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK3ZvaWQgZ2JfY29ubmVjdGlvbl9kaXNhYmxlX2ZvcmNlZChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKK3ZvaWQgZ2JfY29ubmVjdGlvbl9tb2RlX3N3aXRjaF9wcmVwYXJlKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK3ZvaWQgZ2JfY29ubmVjdGlvbl9tb2RlX3N3aXRjaF9jb21wbGV0ZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKK3ZvaWQgZ3JleWJ1c19kYXRhX3JjdmQoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGNwb3J0X2lkLAorCQkJdTggKmRhdGEsIHNpemVfdCBsZW5ndGgpOworCit2b2lkIGdiX2Nvbm5lY3Rpb25fbGF0ZW5jeV90YWdfZW5hYmxlKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK3ZvaWQgZ2JfY29ubmVjdGlvbl9sYXRlbmN5X3RhZ19kaXNhYmxlKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKworc3RhdGljIGlubGluZSBib29sIGdiX2Nvbm5lY3Rpb25fZTJlZmNfZW5hYmxlZChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlyZXR1cm4gIShjb25uZWN0aW9uLT5mbGFncyAmIEdCX0NPTk5FQ1RJT05fRkxBR19DU0QpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK2diX2Nvbm5lY3Rpb25fZmxvd19jb250cm9sX2Rpc2FibGVkKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXJldHVybiBjb25uZWN0aW9uLT5mbGFncyAmIEdCX0NPTk5FQ1RJT05fRkxBR19OT19GTE9XQ1RSTDsKK30KKworc3RhdGljIGlubGluZSBib29sIGdiX2Nvbm5lY3Rpb25faXNfb2ZmbG9hZGVkKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXJldHVybiBjb25uZWN0aW9uLT5mbGFncyAmIEdCX0NPTk5FQ1RJT05fRkxBR19PRkZMT0FERUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBnYl9jb25uZWN0aW9uX2lzX2NvbnRyb2woc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJcmV0dXJuIGNvbm5lY3Rpb24tPmZsYWdzICYgR0JfQ09OTkVDVElPTl9GTEFHX0NPTlRST0w7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlyZXR1cm4gY29ubmVjdGlvbi0+cHJpdmF0ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdiX2Nvbm5lY3Rpb25fc2V0X2RhdGEoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgdm9pZCAqZGF0YSkKK3sKKwljb25uZWN0aW9uLT5wcml2YXRlID0gZGF0YTsKK30KKworI2VuZGlmIC8qIF9fQ09OTkVDVElPTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9jb250cm9sLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9jb250cm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcxNjE5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2NvbnRyb2wuYwpAQCAtMCwwICsxLDYzNSBAQAorLyoKKyAqIEdyZXlidXMgQ1BvcnQgY29udHJvbCBwcm90b2NvbC4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTUgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImdyZXlidXMuaCIKKworLyogSGlnaGVzdCBjb250cm9sLXByb3RvY29sIHZlcnNpb24gc3VwcG9ydGVkICovCisjZGVmaW5lIEdCX0NPTlRST0xfVkVSU0lPTl9NQUpPUgkwCisjZGVmaW5lIEdCX0NPTlRST0xfVkVSU0lPTl9NSU5PUgkxCisKKworc3RhdGljIGludCBnYl9jb250cm9sX2dldF92ZXJzaW9uKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKQoreworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSBjb250cm9sLT5jb25uZWN0aW9uLT5pbnRmOworCXN0cnVjdCBnYl9jb250cm9sX3ZlcnNpb25fcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9jb250cm9sX3ZlcnNpb25fcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IHJldDsKKworCXJlcXVlc3QubWFqb3IgPSBHQl9DT05UUk9MX1ZFUlNJT05fTUFKT1I7CisJcmVxdWVzdC5taW5vciA9IEdCX0NPTlRST0xfVkVSU0lPTl9NSU5PUjsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbnRyb2wtPmNvbm5lY3Rpb24sCisJCQkJR0JfQ09OVFJPTF9UWVBFX1ZFUlNJT04sCisJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgJnJlc3BvbnNlLAorCQkJCXNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gZ2V0IGNvbnRyb2wtcHJvdG9jb2wgdmVyc2lvbjogJWRcbiIsCisJCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocmVzcG9uc2UubWFqb3IgPiByZXF1ZXN0Lm1ham9yKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCQkidW5zdXBwb3J0ZWQgbWFqb3IgY29udHJvbC1wcm90b2NvbCB2ZXJzaW9uICgldSA+ICV1KVxuIiwKKwkJCQlyZXNwb25zZS5tYWpvciwgcmVxdWVzdC5tYWpvcik7CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorCisJY29udHJvbC0+cHJvdG9jb2xfbWFqb3IgPSByZXNwb25zZS5tYWpvcjsKKwljb250cm9sLT5wcm90b2NvbF9taW5vciA9IHJlc3BvbnNlLm1pbm9yOworCisJZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXMgLSAldS4ldVxuIiwgX19mdW5jX18sIHJlc3BvbnNlLm1ham9yLAorCQkJcmVzcG9uc2UubWlub3IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfY29udHJvbF9nZXRfYnVuZGxlX3ZlcnNpb24oc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wsCisJCQkJCQlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpCit7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiA9IGNvbnRyb2wtPmNvbm5lY3Rpb24tPmludGY7CisJc3RydWN0IGdiX2NvbnRyb2xfYnVuZGxlX3ZlcnNpb25fcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9jb250cm9sX2J1bmRsZV92ZXJzaW9uX3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQ7CisKKwlyZXF1ZXN0LmJ1bmRsZV9pZCA9IGJ1bmRsZS0+aWQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb250cm9sLT5jb25uZWN0aW9uLAorCQkJCUdCX0NPTlRST0xfVFlQRV9CVU5ETEVfVkVSU0lPTiwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLAorCQkJCSZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsCisJCQkJImZhaWxlZCB0byBnZXQgYnVuZGxlICV1IGNsYXNzIHZlcnNpb246ICVkXG4iLAorCQkJCWJ1bmRsZS0+aWQsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJYnVuZGxlLT5jbGFzc19tYWpvciA9IHJlc3BvbnNlLm1ham9yOworCWJ1bmRsZS0+Y2xhc3NfbWlub3IgPSByZXNwb25zZS5taW5vcjsKKworCWRldl9kYmcoJmludGYtPmRldiwgIiVzIC0gJXU6ICV1LiV1XG4iLCBfX2Z1bmNfXywgYnVuZGxlLT5pZCwKKwkJCXJlc3BvbnNlLm1ham9yLCByZXNwb25zZS5taW5vcik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdiX2NvbnRyb2xfZ2V0X2J1bmRsZV92ZXJzaW9ucyhzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCkKK3sKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gY29udHJvbC0+Y29ubmVjdGlvbi0+aW50ZjsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGU7CisJaW50IHJldDsKKworCWlmICghY29udHJvbC0+aGFzX2J1bmRsZV92ZXJzaW9uKQorCQlyZXR1cm4gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnVuZGxlLCAmaW50Zi0+YnVuZGxlcywgbGlua3MpIHsKKwkJcmV0ID0gZ2JfY29udHJvbF9nZXRfYnVuZGxlX3ZlcnNpb24oY29udHJvbCwgYnVuZGxlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEdldCBNYW5pZmVzdCdzIHNpemUgZnJvbSB0aGUgaW50ZXJmYWNlICovCitpbnQgZ2JfY29udHJvbF9nZXRfbWFuaWZlc3Rfc2l6ZV9vcGVyYXRpb24oc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbF9nZXRfbWFuaWZlc3Rfc2l6ZV9yZXNwb25zZSByZXNwb25zZTsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGludGYtPmNvbnRyb2wtPmNvbm5lY3Rpb247CisJaW50IHJldDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0NPTlRST0xfVFlQRV9HRVRfTUFOSUZFU1RfU0laRSwKKwkJCQlOVUxMLCAwLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+aW50Zi0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gZ2V0IG1hbmlmZXN0IHNpemU6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBsZTE2X3RvX2NwdShyZXNwb25zZS5zaXplKTsKK30KKworLyogUmVhZHMgTWFuaWZlc3QgZnJvbSB0aGUgaW50ZXJmYWNlICovCitpbnQgZ2JfY29udHJvbF9nZXRfbWFuaWZlc3Rfb3BlcmF0aW9uKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYsIHZvaWQgKm1hbmlmZXN0LAorCQkJCSAgICAgIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gaW50Zi0+Y29udHJvbC0+Y29ubmVjdGlvbjsKKworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9DT05UUk9MX1RZUEVfR0VUX01BTklGRVNULAorCQkJCU5VTEwsIDAsIG1hbmlmZXN0LCBzaXplKTsKK30KKworaW50IGdiX2NvbnRyb2xfY29ubmVjdGVkX29wZXJhdGlvbihzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCwgdTE2IGNwb3J0X2lkKQoreworCXN0cnVjdCBnYl9jb250cm9sX2Nvbm5lY3RlZF9yZXF1ZXN0IHJlcXVlc3Q7CisKKwlyZXF1ZXN0LmNwb3J0X2lkID0gY3B1X3RvX2xlMTYoY3BvcnRfaWQpOworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhjb250cm9sLT5jb25uZWN0aW9uLCBHQl9DT05UUk9MX1RZUEVfQ09OTkVDVEVELAorCQkJCSAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKK30KKworaW50IGdiX2NvbnRyb2xfZGlzY29ubmVjdGVkX29wZXJhdGlvbihzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCwgdTE2IGNwb3J0X2lkKQoreworCXN0cnVjdCBnYl9jb250cm9sX2Rpc2Nvbm5lY3RlZF9yZXF1ZXN0IHJlcXVlc3Q7CisKKwlyZXF1ZXN0LmNwb3J0X2lkID0gY3B1X3RvX2xlMTYoY3BvcnRfaWQpOworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhjb250cm9sLT5jb25uZWN0aW9uLAorCQkJCSBHQl9DT05UUk9MX1RZUEVfRElTQ09OTkVDVEVELCAmcmVxdWVzdCwKKwkJCQkgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKK30KKworaW50IGdiX2NvbnRyb2xfZGlzY29ubmVjdGluZ19vcGVyYXRpb24oc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wsCisJCQkJCXUxNiBjcG9ydF9pZCkKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbF9kaXNjb25uZWN0aW5nX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCWludCByZXQ7CisKKwlvcGVyYXRpb24gPSBnYl9vcGVyYXRpb25fY3JlYXRlX2NvcmUoY29udHJvbC0+Y29ubmVjdGlvbiwKKwkJCQkJR0JfQ09OVFJPTF9UWVBFX0RJU0NPTk5FQ1RJTkcsCisJCQkJCXNpemVvZigqcmVxdWVzdCksIDAsIDAsCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghb3BlcmF0aW9uKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcXVlc3QgPSBvcGVyYXRpb24tPnJlcXVlc3QtPnBheWxvYWQ7CisJcmVxdWVzdC0+Y3BvcnRfaWQgPSBjcHVfdG9fbGUxNihjcG9ydF9pZCk7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fcmVxdWVzdF9zZW5kX3N5bmMob3BlcmF0aW9uKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNvbnRyb2wtPmRldiwgImZhaWxlZCB0byBzZW5kIGRpc2Nvbm5lY3Rpbmc6ICVkXG4iLAorCQkJCXJldCk7CisJfQorCisJZ2Jfb3BlcmF0aW9uX3B1dChvcGVyYXRpb24pOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGdiX2NvbnRyb2xfbW9kZV9zd2l0Y2hfb3BlcmF0aW9uKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKQoreworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKwlpbnQgcmV0OworCisJb3BlcmF0aW9uID0gZ2Jfb3BlcmF0aW9uX2NyZWF0ZV9jb3JlKGNvbnRyb2wtPmNvbm5lY3Rpb24sCisJCQkJCUdCX0NPTlRST0xfVFlQRV9NT0RFX1NXSVRDSCwKKwkJCQkJMCwgMCwgR0JfT1BFUkFUSU9OX0ZMQUdfVU5JRElSRUNUSU9OQUwsCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghb3BlcmF0aW9uKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmRfc3luYyhvcGVyYXRpb24pOworCWlmIChyZXQpCisJCWRldl9lcnIoJmNvbnRyb2wtPmRldiwgImZhaWxlZCB0byBzZW5kIG1vZGUgc3dpdGNoOiAlZFxuIiwgcmV0KTsKKworCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBnYl9jb250cm9sX3RpbWVzeW5jX2VuYWJsZShzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCwgdTggY291bnQsCisJCQkgICAgICAgdTY0IGZyYW1lX3RpbWUsIHUzMiBzdHJvYmVfZGVsYXksIHUzMiByZWZjbGspCit7CisJc3RydWN0IGdiX2NvbnRyb2xfdGltZXN5bmNfZW5hYmxlX3JlcXVlc3QgcmVxdWVzdDsKKworCXJlcXVlc3QuY291bnQgPSBjb3VudDsKKwlyZXF1ZXN0LmZyYW1lX3RpbWUgPSBjcHVfdG9fbGU2NChmcmFtZV90aW1lKTsKKwlyZXF1ZXN0LnN0cm9iZV9kZWxheSA9IGNwdV90b19sZTMyKHN0cm9iZV9kZWxheSk7CisJcmVxdWVzdC5yZWZjbGsgPSBjcHVfdG9fbGUzMihyZWZjbGspOworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhjb250cm9sLT5jb25uZWN0aW9uLAorCQkJCSBHQl9DT05UUk9MX1RZUEVfVElNRVNZTkNfRU5BQkxFLCAmcmVxdWVzdCwKKwkJCQkgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKK30KKworaW50IGdiX2NvbnRyb2xfdGltZXN5bmNfZGlzYWJsZShzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCkKK3sKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmMoY29udHJvbC0+Y29ubmVjdGlvbiwKKwkJCQkgR0JfQ09OVFJPTF9UWVBFX1RJTUVTWU5DX0RJU0FCTEUsIE5VTEwsIDAsCisJCQkJIE5VTEwsIDApOworfQorCitpbnQgZ2JfY29udHJvbF90aW1lc3luY19nZXRfbGFzdF9ldmVudChzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCwKKwkJCQkgICAgICAgdTY0ICpmcmFtZV90aW1lKQoreworCXN0cnVjdCBnYl9jb250cm9sX3RpbWVzeW5jX2dldF9sYXN0X2V2ZW50X3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb250cm9sLT5jb25uZWN0aW9uLAorCQkJCUdCX0NPTlRST0xfVFlQRV9USU1FU1lOQ19HRVRfTEFTVF9FVkVOVCwKKwkJCQlOVUxMLCAwLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmICghcmV0KQorCQkqZnJhbWVfdGltZSA9IGxlNjRfdG9fY3B1KHJlc3BvbnNlLmZyYW1lX3RpbWUpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBnYl9jb250cm9sX3RpbWVzeW5jX2F1dGhvcml0YXRpdmUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wsCisJCQkJICAgICAgdTY0ICpmcmFtZV90aW1lKQoreworCXN0cnVjdCBnYl9jb250cm9sX3RpbWVzeW5jX2F1dGhvcml0YXRpdmVfcmVxdWVzdCByZXF1ZXN0OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEdCX1RJTUVTWU5DX01BWF9TVFJPQkVTOyBpKyspCisJCXJlcXVlc3QuZnJhbWVfdGltZVtpXSA9IGNwdV90b19sZTY0KGZyYW1lX3RpbWVbaV0pOworCisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jKGNvbnRyb2wtPmNvbm5lY3Rpb24sCisJCQkJIEdCX0NPTlRST0xfVFlQRV9USU1FU1lOQ19BVVRIT1JJVEFUSVZFLAorCQkJCSAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLAorCQkJCSBOVUxMLCAwKTsKK30KKworc3RhdGljIGludCBnYl9jb250cm9sX2J1bmRsZV9wbV9zdGF0dXNfbWFwKHU4IHN0YXR1cykKK3sKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgR0JfQ09OVFJPTF9CVU5ETEVfUE1fSU5WQUw6CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgR0JfQ09OVFJPTF9CVU5ETEVfUE1fQlVTWToKKwkJcmV0dXJuIC1FQlVTWTsKKwljYXNlIEdCX0NPTlRST0xfQlVORExFX1BNX05BOgorCQlyZXR1cm4gLUVOT01TRzsKKwljYXNlIEdCX0NPTlRST0xfQlVORExFX1BNX0ZBSUw6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorfQorCitpbnQgZ2JfY29udHJvbF9idW5kbGVfc3VzcGVuZChzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCwgdTggYnVuZGxlX2lkKQoreworCXN0cnVjdCBnYl9jb250cm9sX2J1bmRsZV9wbV9yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGdiX2NvbnRyb2xfYnVuZGxlX3BtX3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQ7CisKKwlyZXF1ZXN0LmJ1bmRsZV9pZCA9IGJ1bmRsZV9pZDsKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb250cm9sLT5jb25uZWN0aW9uLAorCQkJCUdCX0NPTlRST0xfVFlQRV9CVU5ETEVfU1VTUEVORCwgJnJlcXVlc3QsCisJCQkJc2l6ZW9mKHJlcXVlc3QpLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29udHJvbC0+ZGV2LCAiZmFpbGVkIHRvIHNlbmQgYnVuZGxlICV1IHN1c3BlbmQ6ICVkXG4iLAorCQkJYnVuZGxlX2lkLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZXNwb25zZS5zdGF0dXMgIT0gR0JfQ09OVFJPTF9CVU5ETEVfUE1fT0spIHsKKwkJZGV2X2VycigmY29udHJvbC0+ZGV2LCAiZmFpbGVkIHRvIHN1c3BlbmQgYnVuZGxlICV1OiAlZFxuIiwKKwkJCWJ1bmRsZV9pZCwgcmVzcG9uc2Uuc3RhdHVzKTsKKwkJcmV0dXJuIGdiX2NvbnRyb2xfYnVuZGxlX3BtX3N0YXR1c19tYXAocmVzcG9uc2Uuc3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdiX2NvbnRyb2xfYnVuZGxlX3Jlc3VtZShzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCwgdTggYnVuZGxlX2lkKQoreworCXN0cnVjdCBnYl9jb250cm9sX2J1bmRsZV9wbV9yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGdiX2NvbnRyb2xfYnVuZGxlX3BtX3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQ7CisKKwlyZXF1ZXN0LmJ1bmRsZV9pZCA9IGJ1bmRsZV9pZDsKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb250cm9sLT5jb25uZWN0aW9uLAorCQkJCUdCX0NPTlRST0xfVFlQRV9CVU5ETEVfUkVTVU1FLCAmcmVxdWVzdCwKKwkJCQlzaXplb2YocmVxdWVzdCksICZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjb250cm9sLT5kZXYsICJmYWlsZWQgdG8gc2VuZCBidW5kbGUgJXUgcmVzdW1lOiAlZFxuIiwKKwkJCWJ1bmRsZV9pZCwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocmVzcG9uc2Uuc3RhdHVzICE9IEdCX0NPTlRST0xfQlVORExFX1BNX09LKSB7CisJCWRldl9lcnIoJmNvbnRyb2wtPmRldiwgImZhaWxlZCB0byByZXN1bWUgYnVuZGxlICV1OiAlZFxuIiwKKwkJCWJ1bmRsZV9pZCwgcmVzcG9uc2Uuc3RhdHVzKTsKKwkJcmV0dXJuIGdiX2NvbnRyb2xfYnVuZGxlX3BtX3N0YXR1c19tYXAocmVzcG9uc2Uuc3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdiX2NvbnRyb2xfYnVuZGxlX2RlYWN0aXZhdGUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wsIHU4IGJ1bmRsZV9pZCkKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbF9idW5kbGVfcG1fcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9jb250cm9sX2J1bmRsZV9wbV9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCisJcmVxdWVzdC5idW5kbGVfaWQgPSBidW5kbGVfaWQ7CisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29udHJvbC0+Y29ubmVjdGlvbiwKKwkJCQlHQl9DT05UUk9MX1RZUEVfQlVORExFX0RFQUNUSVZBVEUsICZyZXF1ZXN0LAorCQkJCXNpemVvZihyZXF1ZXN0KSwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNvbnRyb2wtPmRldiwKKwkJCSJmYWlsZWQgdG8gc2VuZCBidW5kbGUgJXUgZGVhY3RpdmF0ZTogJWRcbiIsIGJ1bmRsZV9pZCwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHJlc3BvbnNlLnN0YXR1cyAhPSBHQl9DT05UUk9MX0JVTkRMRV9QTV9PSykgeworCQlkZXZfZXJyKCZjb250cm9sLT5kZXYsICJmYWlsZWQgdG8gZGVhY3RpdmF0ZSBidW5kbGUgJXU6ICVkXG4iLAorCQkJYnVuZGxlX2lkLCByZXNwb25zZS5zdGF0dXMpOworCQlyZXR1cm4gZ2JfY29udHJvbF9idW5kbGVfcG1fc3RhdHVzX21hcChyZXNwb25zZS5zdGF0dXMpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZ2JfY29udHJvbF9idW5kbGVfYWN0aXZhdGUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wsIHU4IGJ1bmRsZV9pZCkKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbF9idW5kbGVfcG1fcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9jb250cm9sX2J1bmRsZV9wbV9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCisJaWYgKCFjb250cm9sLT5oYXNfYnVuZGxlX2FjdGl2YXRlKQorCQlyZXR1cm4gMDsKKworCXJlcXVlc3QuYnVuZGxlX2lkID0gYnVuZGxlX2lkOworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbnRyb2wtPmNvbm5lY3Rpb24sCisJCQkJR0JfQ09OVFJPTF9UWVBFX0JVTkRMRV9BQ1RJVkFURSwgJnJlcXVlc3QsCisJCQkJc2l6ZW9mKHJlcXVlc3QpLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29udHJvbC0+ZGV2LAorCQkJImZhaWxlZCB0byBzZW5kIGJ1bmRsZSAldSBhY3RpdmF0ZTogJWRcbiIsIGJ1bmRsZV9pZCwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHJlc3BvbnNlLnN0YXR1cyAhPSBHQl9DT05UUk9MX0JVTkRMRV9QTV9PSykgeworCQlkZXZfZXJyKCZjb250cm9sLT5kZXYsICJmYWlsZWQgdG8gYWN0aXZhdGUgYnVuZGxlICV1OiAlZFxuIiwKKwkJCWJ1bmRsZV9pZCwgcmVzcG9uc2Uuc3RhdHVzKTsKKwkJcmV0dXJuIGdiX2NvbnRyb2xfYnVuZGxlX3BtX3N0YXR1c19tYXAocmVzcG9uc2Uuc3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9jb250cm9sX2ludGVyZmFjZV9wbV9zdGF0dXNfbWFwKHU4IHN0YXR1cykKK3sKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgR0JfQ09OVFJPTF9JTlRGX1BNX0JVU1k6CisJCXJldHVybiAtRUJVU1k7CisJY2FzZSBHQl9DT05UUk9MX0lOVEZfUE1fTkE6CisJCXJldHVybiAtRU5PTVNHOworCWRlZmF1bHQ6CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KK30KKworaW50IGdiX2NvbnRyb2xfaW50ZXJmYWNlX3N1c3BlbmRfcHJlcGFyZShzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCkKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbF9pbnRmX3BtX3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb250cm9sLT5jb25uZWN0aW9uLAorCQkJCUdCX0NPTlRST0xfVFlQRV9JTlRGX1NVU1BFTkRfUFJFUEFSRSwgTlVMTCwgMCwKKwkJCQkmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29udHJvbC0+ZGV2LAorCQkJImZhaWxlZCB0byBzZW5kIGludGVyZmFjZSBzdXNwZW5kIHByZXBhcmU6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZXNwb25zZS5zdGF0dXMgIT0gR0JfQ09OVFJPTF9JTlRGX1BNX09LKSB7CisJCWRldl9lcnIoJmNvbnRyb2wtPmRldiwgImludGVyZmFjZSBlcnJvciB3aGlsZSBwcmVwYXJpbmcgc3VzcGVuZDogJWRcbiIsCisJCQlyZXNwb25zZS5zdGF0dXMpOworCQlyZXR1cm4gZ2JfY29udHJvbF9pbnRlcmZhY2VfcG1fc3RhdHVzX21hcChyZXNwb25zZS5zdGF0dXMpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZ2JfY29udHJvbF9pbnRlcmZhY2VfZGVhY3RpdmF0ZV9wcmVwYXJlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKQoreworCXN0cnVjdCBnYl9jb250cm9sX2ludGZfcG1fcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IHJldDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbnRyb2wtPmNvbm5lY3Rpb24sCisJCQkJR0JfQ09OVFJPTF9UWVBFX0lOVEZfREVBQ1RJVkFURV9QUkVQQVJFLCBOVUxMLAorCQkJCTAsICZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjb250cm9sLT5kZXYsICJmYWlsZWQgdG8gc2VuZCBpbnRlcmZhY2UgZGVhY3RpdmF0ZSBwcmVwYXJlOiAlZFxuIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHJlc3BvbnNlLnN0YXR1cyAhPSBHQl9DT05UUk9MX0lOVEZfUE1fT0spIHsKKwkJZGV2X2VycigmY29udHJvbC0+ZGV2LCAiaW50ZXJmYWNlIGVycm9yIHdoaWxlIHByZXBhcmluZyBkZWFjdGl2YXRlOiAlZFxuIiwKKwkJCXJlc3BvbnNlLnN0YXR1cyk7CisJCXJldHVybiBnYl9jb250cm9sX2ludGVyZmFjZV9wbV9zdGF0dXNfbWFwKHJlc3BvbnNlLnN0YXR1cyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYl9jb250cm9sX2ludGVyZmFjZV9oaWJlcm5hdGVfYWJvcnQoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpCit7CisJc3RydWN0IGdiX2NvbnRyb2xfaW50Zl9wbV9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29udHJvbC0+Y29ubmVjdGlvbiwKKwkJCQlHQl9DT05UUk9MX1RZUEVfSU5URl9ISUJFUk5BVEVfQUJPUlQsIE5VTEwsIDAsCisJCQkJJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNvbnRyb2wtPmRldiwKKwkJCSJmYWlsZWQgdG8gc2VuZCBpbnRlcmZhY2UgYWJvcnRpbmcgaGliZXJuYXRlOiAlZFxuIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHJlc3BvbnNlLnN0YXR1cyAhPSBHQl9DT05UUk9MX0lOVEZfUE1fT0spIHsKKwkJZGV2X2VycigmY29udHJvbC0+ZGV2LCAiaW50ZXJmYWNlIGVycm9yIHdoaWxlIGFib3J0aW5nIGhpYmVybmF0ZTogJWRcbiIsCisJCQlyZXNwb25zZS5zdGF0dXMpOworCQlyZXR1cm4gZ2JfY29udHJvbF9pbnRlcmZhY2VfcG1fc3RhdHVzX21hcChyZXNwb25zZS5zdGF0dXMpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCB2ZW5kb3Jfc3RyaW5nX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCA9IHRvX2diX2NvbnRyb2woZGV2KTsKKworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgY29udHJvbC0+dmVuZG9yX3N0cmluZyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUk8odmVuZG9yX3N0cmluZyk7CisKK3N0YXRpYyBzc2l6ZV90IHByb2R1Y3Rfc3RyaW5nX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCA9IHRvX2diX2NvbnRyb2woZGV2KTsKKworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgY29udHJvbC0+cHJvZHVjdF9zdHJpbmcpOworfQorc3RhdGljIERFVklDRV9BVFRSX1JPKHByb2R1Y3Rfc3RyaW5nKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNvbnRyb2xfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfdmVuZG9yX3N0cmluZy5hdHRyLAorCSZkZXZfYXR0cl9wcm9kdWN0X3N0cmluZy5hdHRyLAorCU5VTEwsCit9OworQVRUUklCVVRFX0dST1VQUyhjb250cm9sKTsKKworc3RhdGljIHZvaWQgZ2JfY29udHJvbF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCA9IHRvX2diX2NvbnRyb2woZGV2KTsKKworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb250cm9sLT5jb25uZWN0aW9uKTsKKworCWtmcmVlKGNvbnRyb2wtPnZlbmRvcl9zdHJpbmcpOworCWtmcmVlKGNvbnRyb2wtPnByb2R1Y3Rfc3RyaW5nKTsKKworCWtmcmVlKGNvbnRyb2wpOworfQorCitzdHJ1Y3QgZGV2aWNlX3R5cGUgZ3JleWJ1c19jb250cm9sX3R5cGUgPSB7CisJLm5hbWUgPQkJImdyZXlidXNfY29udHJvbCIsCisJLnJlbGVhc2UgPQlnYl9jb250cm9sX3JlbGVhc2UsCit9OworCitzdHJ1Y3QgZ2JfY29udHJvbCAqZ2JfY29udHJvbF9jcmVhdGUoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbDsKKworCWNvbnRyb2wgPSBremFsbG9jKHNpemVvZigqY29udHJvbCksIEdGUF9LRVJORUwpOworCWlmICghY29udHJvbCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwljb250cm9sLT5pbnRmID0gaW50ZjsKKworCWNvbm5lY3Rpb24gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZV9jb250cm9sKGludGYpOworCWlmIChJU19FUlIoY29ubmVjdGlvbikpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gY3JlYXRlIGNvbnRyb2wgY29ubmVjdGlvbjogJWxkXG4iLAorCQkJCVBUUl9FUlIoY29ubmVjdGlvbikpOworCQlrZnJlZShjb250cm9sKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGNvbm5lY3Rpb24pOworCX0KKworCWNvbnRyb2wtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCisJY29udHJvbC0+ZGV2LnBhcmVudCA9ICZpbnRmLT5kZXY7CisJY29udHJvbC0+ZGV2LmJ1cyA9ICZncmV5YnVzX2J1c190eXBlOworCWNvbnRyb2wtPmRldi50eXBlID0gJmdyZXlidXNfY29udHJvbF90eXBlOworCWNvbnRyb2wtPmRldi5ncm91cHMgPSBjb250cm9sX2dyb3VwczsKKwljb250cm9sLT5kZXYuZG1hX21hc2sgPSBpbnRmLT5kZXYuZG1hX21hc2s7CisJZGV2aWNlX2luaXRpYWxpemUoJmNvbnRyb2wtPmRldik7CisJZGV2X3NldF9uYW1lKCZjb250cm9sLT5kZXYsICIlcy5jdHJsIiwgZGV2X25hbWUoJmludGYtPmRldikpOworCisJZ2JfY29ubmVjdGlvbl9zZXRfZGF0YShjb250cm9sLT5jb25uZWN0aW9uLCBjb250cm9sKTsKKworCXJldHVybiBjb250cm9sOworfQorCitpbnQgZ2JfY29udHJvbF9lbmFibGUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpCit7CisJaW50IHJldDsKKworCWRldl9kYmcoJmNvbnRyb2wtPmNvbm5lY3Rpb24tPmludGYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXQgPSBnYl9jb25uZWN0aW9uX2VuYWJsZV90eChjb250cm9sLT5jb25uZWN0aW9uKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNvbnRyb2wtPmNvbm5lY3Rpb24tPmludGYtPmRldiwKKwkJCQkiZmFpbGVkIHRvIGVuYWJsZSBjb250cm9sIGNvbm5lY3Rpb246ICVkXG4iLAorCQkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZ2JfY29udHJvbF9nZXRfdmVyc2lvbihjb250cm9sKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kaXNhYmxlX2Nvbm5lY3Rpb247CisKKwlpZiAoY29udHJvbC0+cHJvdG9jb2xfbWFqb3IgPiAwIHx8IGNvbnRyb2wtPnByb3RvY29sX21pbm9yID4gMSkKKwkJY29udHJvbC0+aGFzX2J1bmRsZV92ZXJzaW9uID0gdHJ1ZTsKKworCS8qIEZJWE1FOiB1c2UgcHJvdG9jb2wgdmVyc2lvbiBpbnN0ZWFkICovCisJaWYgKCEoY29udHJvbC0+aW50Zi0+cXVpcmtzICYgR0JfSU5URVJGQUNFX1FVSVJLX05PX0JVTkRMRV9BQ1RJVkFURSkpCisJCWNvbnRyb2wtPmhhc19idW5kbGVfYWN0aXZhdGUgPSB0cnVlOworCisJcmV0dXJuIDA7CisKK2Vycl9kaXNhYmxlX2Nvbm5lY3Rpb246CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbnRyb2wtPmNvbm5lY3Rpb24pOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBnYl9jb250cm9sX2Rpc2FibGUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpCit7CisJZGV2X2RiZygmY29udHJvbC0+Y29ubmVjdGlvbi0+aW50Zi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChjb250cm9sLT5pbnRmLT5kaXNjb25uZWN0ZWQpCisJCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZV9mb3JjZWQoY29udHJvbC0+Y29ubmVjdGlvbik7CisJZWxzZQorCQlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29udHJvbC0+Y29ubmVjdGlvbik7Cit9CisKK2ludCBnYl9jb250cm9sX3N1c3BlbmQoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpCit7CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbnRyb2wtPmNvbm5lY3Rpb24pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYl9jb250cm9sX3Jlc3VtZShzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGVfdHgoY29udHJvbC0+Y29ubmVjdGlvbik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjb250cm9sLT5jb25uZWN0aW9uLT5pbnRmLT5kZXYsCisJCQkiZmFpbGVkIHRvIGVuYWJsZSBjb250cm9sIGNvbm5lY3Rpb246ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZ2JfY29udHJvbF9hZGQoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpCit7CisJaW50IHJldDsKKworCXJldCA9IGRldmljZV9hZGQoJmNvbnRyb2wtPmRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjb250cm9sLT5kZXYsCisJCQkJImZhaWxlZCB0byByZWdpc3RlciBjb250cm9sIGRldmljZTogJWRcbiIsCisJCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBnYl9jb250cm9sX2RlbChzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCkKK3sKKwlpZiAoZGV2aWNlX2lzX3JlZ2lzdGVyZWQoJmNvbnRyb2wtPmRldikpCisJCWRldmljZV9kZWwoJmNvbnRyb2wtPmRldik7Cit9CisKK3N0cnVjdCBnYl9jb250cm9sICpnYl9jb250cm9sX2dldChzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCkKK3sKKwlnZXRfZGV2aWNlKCZjb250cm9sLT5kZXYpOworCisJcmV0dXJuIGNvbnRyb2w7Cit9CisKK3ZvaWQgZ2JfY29udHJvbF9wdXQoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpCit7CisJcHV0X2RldmljZSgmY29udHJvbC0+ZGV2KTsKK30KKwordm9pZCBnYl9jb250cm9sX21vZGVfc3dpdGNoX3ByZXBhcmUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpCit7CisJZ2JfY29ubmVjdGlvbl9tb2RlX3N3aXRjaF9wcmVwYXJlKGNvbnRyb2wtPmNvbm5lY3Rpb24pOworfQorCit2b2lkIGdiX2NvbnRyb2xfbW9kZV9zd2l0Y2hfY29tcGxldGUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpCit7CisJZ2JfY29ubmVjdGlvbl9tb2RlX3N3aXRjaF9jb21wbGV0ZShjb250cm9sLT5jb25uZWN0aW9uKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2NvbnRyb2wuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2NvbnRyb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWE2MGRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvY29udHJvbC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBHcmV5YnVzIENQb3J0IGNvbnRyb2wgcHJvdG9jb2wKKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTUgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaWZuZGVmIF9fQ09OVFJPTF9ICisjZGVmaW5lIF9fQ09OVFJPTF9ICisKK3N0cnVjdCBnYl9jb250cm9sIHsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmOworCisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKwl1OCBwcm90b2NvbF9tYWpvcjsKKwl1OCBwcm90b2NvbF9taW5vcjsKKworCWJvb2wgaGFzX2J1bmRsZV9hY3RpdmF0ZTsKKwlib29sIGhhc19idW5kbGVfdmVyc2lvbjsKKworCWNoYXIgKnZlbmRvcl9zdHJpbmc7CisJY2hhciAqcHJvZHVjdF9zdHJpbmc7Cit9OworI2RlZmluZSB0b19nYl9jb250cm9sKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgZ2JfY29udHJvbCwgZGV2KQorCitzdHJ1Y3QgZ2JfY29udHJvbCAqZ2JfY29udHJvbF9jcmVhdGUoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50Zik7CitpbnQgZ2JfY29udHJvbF9lbmFibGUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpOwordm9pZCBnYl9jb250cm9sX2Rpc2FibGUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpOworaW50IGdiX2NvbnRyb2xfc3VzcGVuZChzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCk7CitpbnQgZ2JfY29udHJvbF9yZXN1bWUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpOworaW50IGdiX2NvbnRyb2xfYWRkKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKTsKK3ZvaWQgZ2JfY29udHJvbF9kZWwoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpOworc3RydWN0IGdiX2NvbnRyb2wgKmdiX2NvbnRyb2xfZ2V0KHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKTsKK3ZvaWQgZ2JfY29udHJvbF9wdXQoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpOworCitpbnQgZ2JfY29udHJvbF9nZXRfYnVuZGxlX3ZlcnNpb25zKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKTsKK2ludCBnYl9jb250cm9sX2Nvbm5lY3RlZF9vcGVyYXRpb24oc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wsIHUxNiBjcG9ydF9pZCk7CitpbnQgZ2JfY29udHJvbF9kaXNjb25uZWN0ZWRfb3BlcmF0aW9uKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sLCB1MTYgY3BvcnRfaWQpOworaW50IGdiX2NvbnRyb2xfZGlzY29ubmVjdGluZ19vcGVyYXRpb24oc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wsCisJCQkJCXUxNiBjcG9ydF9pZCk7CitpbnQgZ2JfY29udHJvbF9tb2RlX3N3aXRjaF9vcGVyYXRpb24oc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpOwordm9pZCBnYl9jb250cm9sX21vZGVfc3dpdGNoX3ByZXBhcmUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpOwordm9pZCBnYl9jb250cm9sX21vZGVfc3dpdGNoX2NvbXBsZXRlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKTsKK2ludCBnYl9jb250cm9sX2dldF9tYW5pZmVzdF9zaXplX29wZXJhdGlvbihzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKTsKK2ludCBnYl9jb250cm9sX2dldF9tYW5pZmVzdF9vcGVyYXRpb24oc3RydWN0IGdiX2ludGVyZmFjZSAqaW50Ziwgdm9pZCAqbWFuaWZlc3QsCisJCQkJICAgICAgc2l6ZV90IHNpemUpOworaW50IGdiX2NvbnRyb2xfdGltZXN5bmNfZW5hYmxlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sLCB1OCBjb3VudCwKKwkJCSAgICAgICB1NjQgZnJhbWVfdGltZSwgdTMyIHN0cm9iZV9kZWxheSwgdTMyIHJlZmNsayk7CitpbnQgZ2JfY29udHJvbF90aW1lc3luY19kaXNhYmxlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKTsKK2ludCBnYl9jb250cm9sX3RpbWVzeW5jX2dldF9sYXN0X2V2ZW50KHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sLAorCQkJCSAgICAgICB1NjQgKmZyYW1lX3RpbWUpOworaW50IGdiX2NvbnRyb2xfdGltZXN5bmNfYXV0aG9yaXRhdGl2ZShzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCwKKwkJCQkgICAgICB1NjQgKmZyYW1lX3RpbWUpOworaW50IGdiX2NvbnRyb2xfYnVuZGxlX3N1c3BlbmQoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wsIHU4IGJ1bmRsZV9pZCk7CitpbnQgZ2JfY29udHJvbF9idW5kbGVfcmVzdW1lKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sLCB1OCBidW5kbGVfaWQpOworaW50IGdiX2NvbnRyb2xfYnVuZGxlX2RlYWN0aXZhdGUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wsIHU4IGJ1bmRsZV9pZCk7CitpbnQgZ2JfY29udHJvbF9idW5kbGVfYWN0aXZhdGUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wsIHU4IGJ1bmRsZV9pZCk7CitpbnQgZ2JfY29udHJvbF9pbnRlcmZhY2Vfc3VzcGVuZF9wcmVwYXJlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKTsKK2ludCBnYl9jb250cm9sX2ludGVyZmFjZV9kZWFjdGl2YXRlX3ByZXBhcmUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpOworaW50IGdiX2NvbnRyb2xfaW50ZXJmYWNlX2hpYmVybmF0ZV9hYm9ydChzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCk7CisjZW5kaWYgLyogX19DT05UUk9MX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDQ5ZTljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvY29yZS5jCkBAIC0wLDAgKzEsMzYxIEBACisvKgorICogR3JleWJ1cyAiQ29yZSIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKKyNpbmNsdWRlICJncmV5YnVzLmgiCisjaW5jbHVkZSAiZ3JleWJ1c190cmFjZS5oIgorCisjZGVmaW5lIEdCX0JVTkRMRV9BVVRPU1VTUEVORF9NUwkzMDAwCisKKy8qIEFsbG93IGdyZXlidXMgdG8gYmUgZGlzYWJsZWQgYXQgYm9vdCBpZiBuZWVkZWQgKi8KK3N0YXRpYyBib29sIG5vZ3JleWJ1czsKKyNpZmRlZiBNT0RVTEUKK21vZHVsZV9wYXJhbShub2dyZXlidXMsIGJvb2wsIDA0NDQpOworI2Vsc2UKK2NvcmVfcGFyYW0obm9ncmV5YnVzLCBub2dyZXlidXMsIGJvb2wsIDA0NDQpOworI2VuZGlmCitpbnQgZ3JleWJ1c19kaXNhYmxlZCh2b2lkKQoreworCXJldHVybiBub2dyZXlidXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChncmV5YnVzX2Rpc2FibGVkKTsKKworc3RhdGljIGJvb2wgZ3JleWJ1c19tYXRjaF9vbmVfaWQoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkICppZCkKK3sKKwlpZiAoKGlkLT5tYXRjaF9mbGFncyAmIEdSRVlCVVNfSURfTUFUQ0hfVkVORE9SKSAmJgorCSAgICAoaWQtPnZlbmRvciAhPSBidW5kbGUtPmludGYtPnZlbmRvcl9pZCkpCisJCXJldHVybiBmYWxzZTsKKworCWlmICgoaWQtPm1hdGNoX2ZsYWdzICYgR1JFWUJVU19JRF9NQVRDSF9QUk9EVUNUKSAmJgorCSAgICAoaWQtPnByb2R1Y3QgIT0gYnVuZGxlLT5pbnRmLT5wcm9kdWN0X2lkKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKChpZC0+bWF0Y2hfZmxhZ3MgJiBHUkVZQlVTX0lEX01BVENIX0NMQVNTKSAmJgorCSAgICAoaWQtPmNsYXNzICE9IGJ1bmRsZS0+Y2xhc3MpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCAqCitncmV5YnVzX21hdGNoX2lkKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSwgY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkICppZCkKK3sKKwlpZiAoaWQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKDsgaWQtPnZlbmRvciB8fCBpZC0+cHJvZHVjdCB8fCBpZC0+Y2xhc3MgfHwgaWQtPmRyaXZlcl9pbmZvOworCQkJCQkJCQkJaWQrKykgeworCQlpZiAoZ3JleWJ1c19tYXRjaF9vbmVfaWQoYnVuZGxlLCBpZCkpCisJCQlyZXR1cm4gaWQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZ3JleWJ1c19tYXRjaF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBncmV5YnVzX2RyaXZlciAqZHJpdmVyID0gdG9fZ3JleWJ1c19kcml2ZXIoZHJ2KTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGU7CisJY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkICppZDsKKworCWlmICghaXNfZ2JfYnVuZGxlKGRldikpCisJCXJldHVybiAwOworCisJYnVuZGxlID0gdG9fZ2JfYnVuZGxlKGRldik7CisKKwlpZCA9IGdyZXlidXNfbWF0Y2hfaWQoYnVuZGxlLCBkcml2ZXItPmlkX3RhYmxlKTsKKwlpZiAoaWQpCisJCXJldHVybiAxOworCS8qIEZJWE1FIC0gRHluYW1pYyBpZHM/ICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3JleWJ1c191ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCit7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZDsKKwlzdHJ1Y3QgZ2JfbW9kdWxlICptb2R1bGUgPSBOVUxMOworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSBOVUxMOworCXN0cnVjdCBnYl9jb250cm9sICpjb250cm9sID0gTlVMTDsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSBOVUxMOworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IE5VTEw7CisKKwlpZiAoaXNfZ2JfaG9zdF9kZXZpY2UoZGV2KSkgeworCQloZCA9IHRvX2diX2hvc3RfZGV2aWNlKGRldik7CisJfSBlbHNlIGlmIChpc19nYl9tb2R1bGUoZGV2KSkgeworCQltb2R1bGUgPSB0b19nYl9tb2R1bGUoZGV2KTsKKwkJaGQgPSBtb2R1bGUtPmhkOworCX0gZWxzZSBpZiAoaXNfZ2JfaW50ZXJmYWNlKGRldikpIHsKKwkJaW50ZiA9IHRvX2diX2ludGVyZmFjZShkZXYpOworCQltb2R1bGUgPSBpbnRmLT5tb2R1bGU7CisJCWhkID0gaW50Zi0+aGQ7CisJfSBlbHNlIGlmIChpc19nYl9jb250cm9sKGRldikpIHsKKwkJY29udHJvbCA9IHRvX2diX2NvbnRyb2woZGV2KTsKKwkJaW50ZiA9IGNvbnRyb2wtPmludGY7CisJCW1vZHVsZSA9IGludGYtPm1vZHVsZTsKKwkJaGQgPSBpbnRmLT5oZDsKKwl9IGVsc2UgaWYgKGlzX2diX2J1bmRsZShkZXYpKSB7CisJCWJ1bmRsZSA9IHRvX2diX2J1bmRsZShkZXYpOworCQlpbnRmID0gYnVuZGxlLT5pbnRmOworCQltb2R1bGUgPSBpbnRmLT5tb2R1bGU7CisJCWhkID0gaW50Zi0+aGQ7CisJfSBlbHNlIGlmIChpc19nYl9zdmMoZGV2KSkgeworCQlzdmMgPSB0b19nYl9zdmMoZGV2KTsKKwkJaGQgPSBzdmMtPmhkOworCX0gZWxzZSB7CisJCWRldl9XQVJOKGRldiwgInVldmVudCBmb3IgdW5rbm93biBncmV5YnVzIGRldmljZSBcInR5cGVcIiFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiQlVTPSV1IiwgaGQtPmJ1c19pZCkpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKG1vZHVsZSkgeworCQlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiTU9EVUxFPSV1IiwgbW9kdWxlLT5tb2R1bGVfaWQpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGludGYpIHsKKwkJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIklOVEVSRkFDRT0ldSIsIGludGYtPmludGVyZmFjZV9pZCkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIkdSRVlCVVNfSUQ9JTA4eC8lMDh4IiwKKwkJCQkgICBpbnRmLT52ZW5kb3JfaWQsIGludGYtPnByb2R1Y3RfaWQpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGJ1bmRsZSkgeworCQkvLyBGSVhNRQorCQkvLyBhZGQgYSB1ZXZlbnQgdGhhdCBjYW4gImxvYWQiIGEgYnVuZGxlIHR5cGUKKwkJLy8gVGhpcyBpcyB3aGF0IHdlIG5lZWQgdG8gYmluZCBhIGRyaXZlciB0byBzbyB1c2UgdGhlIGluZm8KKwkJLy8gaW4gZ21vZCBoZXJlIGFzIHdlbGwKKworCQlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiQlVORExFPSV1IiwgYnVuZGxlLT5pZCkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIkJVTkRMRV9DTEFTUz0lMDJ4IiwgYnVuZGxlLT5jbGFzcykpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ3JleWJ1c19zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKGlzX2diX2hvc3RfZGV2aWNlKGRldikpIHsKKwkJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZDsKKworCQloZCA9IHRvX2diX2hvc3RfZGV2aWNlKGRldik7CisJCWdiX2hkX3NodXRkb3duKGhkKTsKKwl9Cit9CisKK3N0cnVjdCBidXNfdHlwZSBncmV5YnVzX2J1c190eXBlID0geworCS5uYW1lID0JCSJncmV5YnVzIiwKKwkubWF0Y2ggPQlncmV5YnVzX21hdGNoX2RldmljZSwKKwkudWV2ZW50ID0JZ3JleWJ1c191ZXZlbnQsCisJLnNodXRkb3duID0JZ3JleWJ1c19zaHV0ZG93biwKK307CisKK3N0YXRpYyBpbnQgZ3JleWJ1c19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdyZXlidXNfZHJpdmVyICpkcml2ZXIgPSB0b19ncmV5YnVzX2RyaXZlcihkZXYtPmRyaXZlcik7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlID0gdG9fZ2JfYnVuZGxlKGRldik7CisJY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkICppZDsKKwlpbnQgcmV0dmFsOworCisJLyogbWF0Y2ggaWQgKi8KKwlpZCA9IGdyZXlidXNfbWF0Y2hfaWQoYnVuZGxlLCBkcml2ZXItPmlkX3RhYmxlKTsKKwlpZiAoIWlkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHZhbCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJmJ1bmRsZS0+aW50Zi0+ZGV2KTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJmJ1bmRsZS0+aW50Zi0+ZGV2KTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR2YWwgPSBnYl9jb250cm9sX2J1bmRsZV9hY3RpdmF0ZShidW5kbGUtPmludGYtPmNvbnRyb2wsIGJ1bmRsZS0+aWQpOworCWlmIChyZXR2YWwpIHsKKwkJcG1fcnVudGltZV9wdXQoJmJ1bmRsZS0+aW50Zi0+ZGV2KTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwkvKgorCSAqIFVuYm91bmQgYnVuZGxlIGRldmljZXMgYXJlIGFsd2F5cyBkZWFjdGl2YXRlZC4gRHVyaW5nIHByb2JlLCB0aGUKKwkgKiBSdW50aW1lIFBNIGlzIHNldCB0byBlbmFibGVkIGFuZCBhY3RpdmUgYW5kIHRoZSB1c2FnZSBjb3VudCBpcworCSAqIGluY3JlbWVudGVkLiBJZiB0aGUgZHJpdmVyIHN1cHBvcnRzIHJ1bnRpbWUgUE0sIGl0IHNob3VsZCBjYWxsCisJICogcG1fcnVudGltZV9wdXQoKSBpbiBpdHMgcHJvYmUgcm91dGluZSBhbmQgcG1fcnVudGltZV9nZXRfc3luYygpCisJICogaW4gcmVtb3ZlIHJvdXRpbmUuCisJICovCisJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoZGV2LCBHQl9CVU5ETEVfQVVUT1NVU1BFTkRfTVMpOworCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKGRldik7CisJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCisJcmV0dmFsID0gZHJpdmVyLT5wcm9iZShidW5kbGUsIGlkKTsKKwlpZiAocmV0dmFsKSB7CisJCS8qCisJCSAqIENhdGNoIGJ1Z2d5IGRyaXZlcnMgdGhhdCBmYWlsIHRvIGRlc3Ryb3kgdGhlaXIgY29ubmVjdGlvbnMuCisJCSAqLworCQlXQVJOX09OKCFsaXN0X2VtcHR5KCZidW5kbGUtPmNvbm5lY3Rpb25zKSk7CisKKwkJZ2JfY29udHJvbF9idW5kbGVfZGVhY3RpdmF0ZShidW5kbGUtPmludGYtPmNvbnRyb2wsIGJ1bmRsZS0+aWQpOworCisJCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCQlwbV9ydW50aW1lX3NldF9zdXNwZW5kZWQoZGV2KTsKKwkJcG1fcnVudGltZV9wdXRfbm9pZGxlKGRldik7CisJCXBtX3J1bnRpbWVfZG9udF91c2VfYXV0b3N1c3BlbmQoZGV2KTsKKwkJcG1fcnVudGltZV9wdXQoJmJ1bmRsZS0+aW50Zi0+ZGV2KTsKKworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWdiX3RpbWVzeW5jX3NjaGVkdWxlX3N5bmNocm9ub3VzKGJ1bmRsZS0+aW50Zik7CisKKwlwbV9ydW50aW1lX3B1dCgmYnVuZGxlLT5pbnRmLT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3JleWJ1c19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBncmV5YnVzX2RyaXZlciAqZHJpdmVyID0gdG9fZ3JleWJ1c19kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IHRvX2diX2J1bmRsZShkZXYpOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CisJaWYgKHJldHZhbCA8IDApCisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlc3VtZSBidW5kbGU6ICVkXG4iLCByZXR2YWwpOworCisJLyoKKwkgKiBEaXNhYmxlIChub24tb2ZmbG9hZGVkKSBjb25uZWN0aW9ucyBlYXJseSBpbiBjYXNlIHRoZSBpbnRlcmZhY2UgaXMKKwkgKiBhbHJlYWR5IGdvbmUgdG8gYXZvaWQgdW5jZWNjZXNzYXJ5IG9wZXJhdGlvbiB0aW1lb3V0cyBkdXJpbmcKKwkgKiBkcml2ZXIgZGlzY29ubmVjdC4gT3RoZXJ3aXNlLCBvbmx5IGRpc2FibGUgaW5jb21pbmcgcmVxdWVzdHMuCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0aW9uLCAmYnVuZGxlLT5jb25uZWN0aW9ucywgYnVuZGxlX2xpbmtzKSB7CisJCWlmIChnYl9jb25uZWN0aW9uX2lzX29mZmxvYWRlZChjb25uZWN0aW9uKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChidW5kbGUtPmludGYtPmRpc2Nvbm5lY3RlZCkKKwkJCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZV9mb3JjZWQoY29ubmVjdGlvbik7CisJCWVsc2UKKwkJCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZV9yeChjb25uZWN0aW9uKTsKKwl9CisKKwlkcml2ZXItPmRpc2Nvbm5lY3QoYnVuZGxlKTsKKworCS8qIENhdGNoIGJ1Z2d5IGRyaXZlcnMgdGhhdCBmYWlsIHRvIGRlc3Ryb3kgdGhlaXIgY29ubmVjdGlvbnMuICovCisJV0FSTl9PTighbGlzdF9lbXB0eSgmYnVuZGxlLT5jb25uZWN0aW9ucykpOworCisJaWYgKCFidW5kbGUtPmludGYtPmRpc2Nvbm5lY3RlZCkKKwkJZ2JfY29udHJvbF9idW5kbGVfZGVhY3RpdmF0ZShidW5kbGUtPmludGYtPmNvbnRyb2wsIGJ1bmRsZS0+aWQpOworCisJcG1fcnVudGltZV9wdXRfbm9pZGxlKGRldik7CisJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CisJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldik7CisJcG1fcnVudGltZV9kb250X3VzZV9hdXRvc3VzcGVuZChkZXYpOworCXBtX3J1bnRpbWVfcHV0X25vaWRsZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBncmV5YnVzX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgZ3JleWJ1c19kcml2ZXIgKmRyaXZlciwgc3RydWN0IG1vZHVsZSAqb3duZXIsCisJCWNvbnN0IGNoYXIgKm1vZF9uYW1lKQoreworCWludCByZXR2YWw7CisKKwlpZiAoZ3JleWJ1c19kaXNhYmxlZCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRyaXZlci0+ZHJpdmVyLmJ1cyA9ICZncmV5YnVzX2J1c190eXBlOworCWRyaXZlci0+ZHJpdmVyLm5hbWUgPSBkcml2ZXItPm5hbWU7CisJZHJpdmVyLT5kcml2ZXIucHJvYmUgPSBncmV5YnVzX3Byb2JlOworCWRyaXZlci0+ZHJpdmVyLnJlbW92ZSA9IGdyZXlidXNfcmVtb3ZlOworCWRyaXZlci0+ZHJpdmVyLm93bmVyID0gb3duZXI7CisJZHJpdmVyLT5kcml2ZXIubW9kX25hbWUgPSBtb2RfbmFtZTsKKworCXJldHZhbCA9IGRyaXZlcl9yZWdpc3RlcigmZHJpdmVyLT5kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlwcl9pbmZvKCJyZWdpc3RlcmVkIG5ldyBkcml2ZXIgJXNcbiIsIGRyaXZlci0+bmFtZSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChncmV5YnVzX3JlZ2lzdGVyX2RyaXZlcik7CisKK3ZvaWQgZ3JleWJ1c19kZXJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgZ3JleWJ1c19kcml2ZXIgKmRyaXZlcikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyLT5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ3JleWJ1c19kZXJlZ2lzdGVyX2RyaXZlcik7CisKK3N0YXRpYyBpbnQgX19pbml0IGdiX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKGdyZXlidXNfZGlzYWJsZWQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlCVUlMRF9CVUdfT04oQ1BPUlRfSURfTUFYID49IChsb25nKUNQT1JUX0lEX0JBRCk7CisKKwlnYl9kZWJ1Z2ZzX2luaXQoKTsKKworCXJldHZhbCA9IGJ1c19yZWdpc3RlcigmZ3JleWJ1c19idXNfdHlwZSk7CisJaWYgKHJldHZhbCkgeworCQlwcl9lcnIoImJ1c19yZWdpc3RlciBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKKwkJZ290byBlcnJvcl9idXM7CisJfQorCisJcmV0dmFsID0gZ2JfaGRfaW5pdCgpOworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCJnYl9oZF9pbml0IGZhaWxlZCAoJWQpXG4iLCByZXR2YWwpOworCQlnb3RvIGVycm9yX2hkOworCX0KKworCXJldHZhbCA9IGdiX29wZXJhdGlvbl9pbml0KCk7CisJaWYgKHJldHZhbCkgeworCQlwcl9lcnIoImdiX29wZXJhdGlvbl9pbml0IGZhaWxlZCAoJWQpXG4iLCByZXR2YWwpOworCQlnb3RvIGVycm9yX29wZXJhdGlvbjsKKwl9CisKKwlyZXR2YWwgPSBnYl90aW1lc3luY19pbml0KCk7CisJaWYgKHJldHZhbCkgeworCQlwcl9lcnIoImdiX3RpbWVzeW5jX2luaXQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcl90aW1lc3luYzsKKwl9CisJcmV0dXJuIDA7CS8qIFN1Y2Nlc3MgKi8KKworZXJyb3JfdGltZXN5bmM6CisJZ2Jfb3BlcmF0aW9uX2V4aXQoKTsKK2Vycm9yX29wZXJhdGlvbjoKKwlnYl9oZF9leGl0KCk7CitlcnJvcl9oZDoKKwlidXNfdW5yZWdpc3RlcigmZ3JleWJ1c19idXNfdHlwZSk7CitlcnJvcl9idXM6CisJZ2JfZGVidWdmc19jbGVhbnVwKCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorbW9kdWxlX2luaXQoZ2JfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBnYl9leGl0KHZvaWQpCit7CisJZ2JfdGltZXN5bmNfZXhpdCgpOworCWdiX29wZXJhdGlvbl9leGl0KCk7CisJZ2JfaGRfZXhpdCgpOworCWJ1c191bnJlZ2lzdGVyKCZncmV5YnVzX2J1c190eXBlKTsKKwlnYl9kZWJ1Z2ZzX2NsZWFudXAoKTsKKwl0cmFjZXBvaW50X3N5bmNocm9uaXplX3VucmVnaXN0ZXIoKTsKK30KK21vZHVsZV9leGl0KGdiX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FVVEhPUigiR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGludXhmb3VuZGF0aW9uLm9yZz4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2RlYnVnZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2RlYnVnZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWQ0ZDNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZGVidWdmcy5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBHcmV5YnVzIGRlYnVnZnMgY29kZQorICoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisKKyNpbmNsdWRlICJncmV5YnVzLmgiCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpnYl9kZWJ1Z19yb290OworCit2b2lkIF9faW5pdCBnYl9kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwlnYl9kZWJ1Z19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKCJncmV5YnVzIiwgTlVMTCk7Cit9CisKK3ZvaWQgZ2JfZGVidWdmc19jbGVhbnVwKHZvaWQpCit7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGdiX2RlYnVnX3Jvb3QpOworCWdiX2RlYnVnX3Jvb3QgPSBOVUxMOworfQorCitzdHJ1Y3QgZGVudHJ5ICpnYl9kZWJ1Z2ZzX2dldCh2b2lkKQoreworCXJldHVybiBnYl9kZWJ1Z19yb290OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfZGVidWdmc19nZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZXMyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9lczIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzFiYjFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZXMyLmMKQEAgLTAsMCArMSwxNTk3IEBACisvKgorICogR3JleWJ1cyAiQVAiIFVTQiBkcml2ZXIgZm9yICJFUzIiIGNvbnRyb2xsZXIgY2hpcHMKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc2l6ZXMuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSAiYXJwYy5oIgorI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJncmV5YnVzX3RyYWNlLmgiCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorCisKKy8qIERlZmF1bHQgdGltZW91dCBmb3IgVVNCIHZlbmRvciByZXF1ZXN0cy4gKi8KKyNkZWZpbmUgRVMyX1VTQl9DVFJMX1RJTUVPVVQJNTAwCisKKy8qIERlZmF1bHQgdGltZW91dCBmb3IgQVJQQyBDUG9ydCByZXF1ZXN0cyAqLworI2RlZmluZSBFUzJfQVJQQ19DUE9SVF9USU1FT1VUCTUwMAorCisvKiBGaXhlZCBDUG9ydCBudW1iZXJzICovCisjZGVmaW5lIEVTMl9DUE9SVF9DRFNJMAkJMTYKKyNkZWZpbmUgRVMyX0NQT1JUX0NEU0kxCQkxNworCisvKiBNZW1vcnkgc2l6ZXMgZm9yIHRoZSBidWZmZXJzIHNlbnQgdG8vZnJvbSB0aGUgRVMyIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRVMyX0dCVUZfTVNHX1NJWkVfTUFYCTIwNDgKKworLyogTWVtb3J5IHNpemVzIGZvciB0aGUgQVJQQyBidWZmZXJzICovCisjZGVmaW5lIEFSUENfT1VUX1NJWkVfTUFYCVUxNl9NQVgKKyNkZWZpbmUgQVJQQ19JTl9TSVpFX01BWAkxMjgKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlW10gPSB7CisJeyBVU0JfREVWSUNFKDB4MThkMSwgMHgxZWFmKSB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaWRfdGFibGUpOworCisjZGVmaW5lIEFQQjFfTE9HX1NJWkUJCVNaXzE2SworCisvKgorICogTnVtYmVyIG9mIENQb3J0IElOIHVyYnMgaW4gZmxpZ2h0IGF0IGFueSBwb2ludCBpbiB0aW1lLgorICogQWRqdXN0IGlmIHdlIGFyZSBoYXZpbmcgc3RhbGxzIGluIHRoZSBVU0IgYnVmZmVyIGR1ZSB0byBub3QgZW5vdWdoIHVyYnMgaW4KKyAqIGZsaWdodC4KKyAqLworI2RlZmluZSBOVU1fQ1BPUlRfSU5fVVJCCTQKKworLyogTnVtYmVyIG9mIENQb3J0IE9VVCB1cmJzIGluIGZsaWdodCBhdCBhbnkgcG9pbnQgaW4gdGltZS4KKyAqIEFkanVzdCBpZiB3ZSBnZXQgbWVzc2FnZXMgc2F5aW5nIHdlIGFyZSBvdXQgb2YgdXJicyBpbiB0aGUgc3lzdGVtIGxvZy4KKyAqLworI2RlZmluZSBOVU1fQ1BPUlRfT1VUX1VSQgk4CisKKy8qCisgKiBOdW1iZXIgb2YgQVJQQyBpbiB1cmJzIGluIGZsaWdodCBhdCBhbnkgcG9pbnQgaW4gdGltZS4KKyAqLworI2RlZmluZSBOVU1fQVJQQ19JTl9VUkIJCTIKKworLyoKKyAqIEBlbmRwb2ludDogYnVsayBpbiBlbmRwb2ludCBmb3IgQ1BvcnQgZGF0YQorICogQHVyYjogYXJyYXkgb2YgdXJicyBmb3IgdGhlIENQb3J0IGluIG1lc3NhZ2VzCisgKiBAYnVmZmVyOiBhcnJheSBvZiBidWZmZXJzIGZvciB0aGUgQGNwb3J0X2luX3VyYiB1cmJzCisgKi8KK3N0cnVjdCBlczJfY3BvcnRfaW4geworCV9fdTggZW5kcG9pbnQ7CisJc3RydWN0IHVyYiAqdXJiW05VTV9DUE9SVF9JTl9VUkJdOworCXU4ICpidWZmZXJbTlVNX0NQT1JUX0lOX1VSQl07Cit9OworCisvKioKKyAqIGVzMl9hcF9kZXYgLSBFUzIgVVNCIEJyaWRnZSB0byBBUCBzdHJ1Y3R1cmUKKyAqIEB1c2JfZGV2OiBwb2ludGVyIHRvIHRoZSBVU0IgZGV2aWNlIHdlIGFyZS4KKyAqIEB1c2JfaW50ZjogcG9pbnRlciB0byB0aGUgVVNCIGludGVyZmFjZSB3ZSBhcmUgYm91bmQgdG8uCisgKiBAaGQ6IHBvaW50ZXIgdG8gb3VyIGdiX2hvc3RfZGV2aWNlIHN0cnVjdHVyZQorCisgKiBAY3BvcnRfaW46IGVuZHBvaW50LCB1cmJzIGFuZCBidWZmZXIgZm9yIGNwb3J0IGluIG1lc3NhZ2VzCisgKiBAY3BvcnRfb3V0X2VuZHBvaW50OiBlbmRwb2ludCBmb3IgZm9yIGNwb3J0IG91dCBtZXNzYWdlcworICogQGNwb3J0X291dF91cmI6IGFycmF5IG9mIHVyYnMgZm9yIHRoZSBDUG9ydCBvdXQgbWVzc2FnZXMKKyAqIEBjcG9ydF9vdXRfdXJiX2J1c3k6IGFycmF5IG9mIGZsYWdzIHRvIHNlZSBpZiB0aGUgQGNwb3J0X291dF91cmIgaXMgYnVzeSBvcgorICoJCQlub3QuCisgKiBAY3BvcnRfb3V0X3VyYl9jYW5jZWxsZWQ6IGFycmF5IG9mIGZsYWdzIGluZGljYXRpbmcgd2hldGhlciB0aGUKKyAqCQkJY29ycmVzcG9uZGluZyBAY3BvcnRfb3V0X3VyYiBpcyBiZWluZyBjYW5jZWxsZWQKKyAqIEBjcG9ydF9vdXRfdXJiX2xvY2s6IGxvY2tzIHRoZSBAY3BvcnRfb3V0X3VyYl9idXN5ICJsaXN0IgorICoKKyAqIEBhcGJfbG9nX3Rhc2s6IHRhc2sgcG9pbnRlciBmb3IgbG9nZ2luZyB0aHJlYWQKKyAqIEBhcGJfbG9nX2RlbnRyeTogZmlsZSBzeXN0ZW0gZW50cnkgZm9yIHRoZSBsb2cgZmlsZSBpbnRlcmZhY2UKKyAqIEBhcGJfbG9nX2VuYWJsZV9kZW50cnk6IGZpbGUgc3lzdGVtIGVudHJ5IGZvciBlbmFibGluZyBsb2dnaW5nCisgKiBAYXBiX2xvZ19maWZvOiBrZXJuZWwgRklGTyB0byBjYXJyeSBsb2dnZWQgZGF0YQorICogQGFycGNfdXJiOiBhcnJheSBvZiB1cmJzIGZvciB0aGUgQVJQQyBpbiBtZXNzYWdlcworICogQGFycGNfYnVmZmVyOiBhcnJheSBvZiBidWZmZXJzIGZvciB0aGUgQGFycGNfdXJiIHVyYnMKKyAqIEBhcnBjX2VuZHBvaW50X2luOiBidWxrIGluIGVuZHBvaW50IGZvciBBUEJyaWRnZUEgUlBDCisgKiBAYXJwY19pZF9jeWNsZTogZ2l2ZXMgYW4gdW5pcXVlIGlkIHRvIEFSUEMKKyAqIEBhcnBjX2xvY2s6IGxvY2tzIEFSUEMgbGlzdAorICogQGFycGNzOiBsaXN0IG9mIGluIHByb2dyZXNzIEFSUENzCisgKi8KK3N0cnVjdCBlczJfYXBfZGV2IHsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdXNiX2ludGY7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZDsKKworCXN0cnVjdCBlczJfY3BvcnRfaW4gY3BvcnRfaW47CisJX191OCBjcG9ydF9vdXRfZW5kcG9pbnQ7CisJc3RydWN0IHVyYiAqY3BvcnRfb3V0X3VyYltOVU1fQ1BPUlRfT1VUX1VSQl07CisJYm9vbCBjcG9ydF9vdXRfdXJiX2J1c3lbTlVNX0NQT1JUX09VVF9VUkJdOworCWJvb2wgY3BvcnRfb3V0X3VyYl9jYW5jZWxsZWRbTlVNX0NQT1JUX09VVF9VUkJdOworCXNwaW5sb2NrX3QgY3BvcnRfb3V0X3VyYl9sb2NrOworCisJYm9vbCBjZHNpMV9pbl91c2U7CisKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmFwYl9sb2dfdGFzazsKKwlzdHJ1Y3QgZGVudHJ5ICphcGJfbG9nX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICphcGJfbG9nX2VuYWJsZV9kZW50cnk7CisJREVDTEFSRV9LRklGTyhhcGJfbG9nX2ZpZm8sIGNoYXIsIEFQQjFfTE9HX1NJWkUpOworCisJX191OCBhcnBjX2VuZHBvaW50X2luOworCXN0cnVjdCB1cmIgKmFycGNfdXJiW05VTV9BUlBDX0lOX1VSQl07CisJdTggKmFycGNfYnVmZmVyW05VTV9BUlBDX0lOX1VSQl07CisKKwlpbnQgYXJwY19pZF9jeWNsZTsKKwlzcGlubG9ja190IGFycGNfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGFycGNzOworfTsKKworLyoqCisgKiB0aW1lc3luY19lbmFibGVfcmVxdWVzdCAtIEVuYWJsZSB0aW1lc3luYyBpbiBhbiBBUEJyaWRnZQorICogQGNvdW50OiBudW1iZXIgb2YgVGltZVN5bmMgUHVsc2VzIHRvIGV4cGVjdAorICogQGZyYW1lX3RpbWU6IHRoZSBpbml0aWFsIEZyYW1lVGltZSBhdCB0aGUgZmlyc3QgVGltZVN5bmMgUHVsc2UKKyAqIEBzdHJvYmVfZGVsYXk6IHRoZSBleHBlY3RlZCBkZWxheSBpbiBtaWNyb3NlY29uZHMgYmV0d2VlbiBlYWNoIFRpbWVTeW5jIFB1bHNlCisgKiBAcmVmY2xrOiBUaGUgQVAgbWFuZGF0ZWQgcmVmZXJlbmNlIGNsb2NrIHRvIHJ1biBGcmFtZVRpbWUgYXQKKyAqLworc3RydWN0IHRpbWVzeW5jX2VuYWJsZV9yZXF1ZXN0IHsKKwlfX3U4CWNvdW50OworCV9fbGU2NAlmcmFtZV90aW1lOworCV9fbGUzMglzdHJvYmVfZGVsYXk7CisJX19sZTMyCXJlZmNsazsKK30gX19wYWNrZWQ7CisKKy8qKgorICogdGltZXN5bmNfYXV0aG9yaXRhdGl2ZV9yZXF1ZXN0IC0gVHJhbnNtaXQgYXV0aG9yaXRhdGl2ZSBGcmFtZVRpbWUgdG8gQVBCcmlkZ2UKKyAqIEBmcmFtZV90aW1lOiBBbiBhcnJheSBvZiBhdXRob3JpdGF0aXZlIEZyYW1lVGltZXMgcHJvdmlkZWQgYnkgdGhlIFNWQworICogICAgICAgICAgICAgIGFuZCByZWxheWVkIHRvIHRoZSBBUEJyaWRnZSBieSB0aGUgQVAKKyAqLworc3RydWN0IHRpbWVzeW5jX2F1dGhvcml0YXRpdmVfcmVxdWVzdCB7CisJX19sZTY0CWZyYW1lX3RpbWVbR0JfVElNRVNZTkNfTUFYX1NUUk9CRVNdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFycGMgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgYXJwY19yZXF1ZXN0X21lc3NhZ2UgKnJlcTsKKwlzdHJ1Y3QgYXJwY19yZXNwb25zZV9tZXNzYWdlICpyZXNwOworCXN0cnVjdCBjb21wbGV0aW9uIHJlc3BvbnNlX3JlY2VpdmVkOworCWJvb2wgYWN0aXZlOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXMyX2FwX2RldiAqaGRfdG9fZXMyKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQpCit7CisJcmV0dXJuIChzdHJ1Y3QgZXMyX2FwX2RldiAqKSZoZC0+aGRfcHJpdjsKK30KKworc3RhdGljIHZvaWQgY3BvcnRfb3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYik7CitzdGF0aWMgdm9pZCB1c2JfbG9nX2VuYWJsZShzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyKTsKK3N0YXRpYyB2b2lkIHVzYl9sb2dfZGlzYWJsZShzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyKTsKK3N0YXRpYyBpbnQgYXJwY19zeW5jKHN0cnVjdCBlczJfYXBfZGV2ICplczIsIHU4IHR5cGUsIHZvaWQgKnBheWxvYWQsCisJCSAgICAgc2l6ZV90IHNpemUsIGludCAqcmVzdWx0LCB1bnNpZ25lZCBpbnQgdGltZW91dCk7CisKK3N0YXRpYyBpbnQgb3V0cHV0X3N5bmMoc3RydWN0IGVzMl9hcF9kZXYgKmVzMiwgdm9pZCAqcmVxLCB1MTYgc2l6ZSwgdTggY21kKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gZXMyLT51c2JfZGV2OworCXU4ICpkYXRhOworCWludCByZXR2YWw7CisKKwlkYXRhID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShkYXRhLCByZXEsIHNpemUpOworCisJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCQkgY21kLAorCQkJCSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8CisJCQkJIFVTQl9SRUNJUF9JTlRFUkZBQ0UsCisJCQkJIDAsIDAsIGRhdGEsIHNpemUsIEVTMl9VU0JfQ1RSTF9USU1FT1VUKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAiJXM6IHJldHVybiBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJldHZhbCk7CisJZWxzZQorCQlyZXR2YWwgPSAwOworCisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgYXBfdXJiX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpkciA9IHVyYi0+Y29udGV4dDsKKworCWtmcmVlKGRyKTsKKwl1c2JfZnJlZV91cmIodXJiKTsKK30KKworc3RhdGljIGludCBvdXRwdXRfYXN5bmMoc3RydWN0IGVzMl9hcF9kZXYgKmVzMiwgdm9pZCAqcmVxLCB1MTYgc2l6ZSwgdTggY21kKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gZXMyLT51c2JfZGV2OworCXN0cnVjdCB1cmIgKnVyYjsKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpkcjsKKwl1OCAqYnVmOworCWludCByZXR2YWw7CisKKwl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCWlmICghdXJiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRyID0ga21hbGxvYyhzaXplb2YoKmRyKSArIHNpemUsIEdGUF9BVE9NSUMpOworCWlmICghZHIpIHsKKwkJdXNiX2ZyZWVfdXJiKHVyYik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJ1ZiA9ICh1OCAqKWRyICsgc2l6ZW9mKCpkcik7CisJbWVtY3B5KGJ1ZiwgcmVxLCBzaXplKTsKKworCWRyLT5iUmVxdWVzdCA9IGNtZDsKKwlkci0+YlJlcXVlc3RUeXBlID0gVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfSU5URVJGQUNFOworCWRyLT53VmFsdWUgPSAwOworCWRyLT53SW5kZXggPSAwOworCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoc2l6ZSk7CisKKwl1c2JfZmlsbF9jb250cm9sX3VyYih1cmIsIHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCSAgICAgKHVuc2lnbmVkIGNoYXIgKilkciwgYnVmLCBzaXplLAorCQkJICAgICBhcF91cmJfY29tcGxldGUsIGRyKTsKKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmIChyZXR2YWwpIHsKKwkJdXNiX2ZyZWVfdXJiKHVyYik7CisJCWtmcmVlKGRyKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBvdXRwdXQoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdm9pZCAqcmVxLCB1MTYgc2l6ZSwgdTggY21kLAorCQkgICAgIGJvb2wgYXN5bmMpCit7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IGhkX3RvX2VzMihoZCk7CisKKwlpZiAoYXN5bmMpCisJCXJldHVybiBvdXRwdXRfYXN5bmMoZXMyLCByZXEsIHNpemUsIGNtZCk7CisKKwlyZXR1cm4gb3V0cHV0X3N5bmMoZXMyLCByZXEsIHNpemUsIGNtZCk7Cit9CisKK3N0YXRpYyBpbnQgZXMyX2Nwb3J0X2luX2VuYWJsZShzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyLAorCQkJCXN0cnVjdCBlczJfY3BvcnRfaW4gKmNwb3J0X2luKQoreworCXN0cnVjdCB1cmIgKnVyYjsKKwlpbnQgcmV0OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9DUE9SVF9JTl9VUkI7ICsraSkgeworCQl1cmIgPSBjcG9ydF9pbi0+dXJiW2ldOworCisJCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0tFUk5FTCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJmVzMi0+dXNiX2Rldi0+ZGV2LAorCQkJCQkiZmFpbGVkIHRvIHN1Ym1pdCBpbi11cmI6ICVkXG4iLCByZXQpOworCQkJZ290byBlcnJfa2lsbF91cmJzOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9raWxsX3VyYnM6CisJZm9yICgtLWk7IGkgPj0gMDsgLS1pKSB7CisJCXVyYiA9IGNwb3J0X2luLT51cmJbaV07CisJCXVzYl9raWxsX3VyYih1cmIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGVzMl9jcG9ydF9pbl9kaXNhYmxlKHN0cnVjdCBlczJfYXBfZGV2ICplczIsCisJCQkJc3RydWN0IGVzMl9jcG9ydF9pbiAqY3BvcnRfaW4pCit7CisJc3RydWN0IHVyYiAqdXJiOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9DUE9SVF9JTl9VUkI7ICsraSkgeworCQl1cmIgPSBjcG9ydF9pbi0+dXJiW2ldOworCQl1c2Jfa2lsbF91cmIodXJiKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZXMyX2FycGNfaW5fZW5hYmxlKHN0cnVjdCBlczJfYXBfZGV2ICplczIpCit7CisJc3RydWN0IHVyYiAqdXJiOworCWludCByZXQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0FSUENfSU5fVVJCOyArK2kpIHsKKwkJdXJiID0gZXMyLT5hcnBjX3VyYltpXTsKKworCQlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZlczItPnVzYl9kZXYtPmRldiwKKwkJCQkiZmFpbGVkIHRvIHN1Ym1pdCBhcnBjIGluLXVyYjogJWRcbiIsIHJldCk7CisJCQlnb3RvIGVycl9raWxsX3VyYnM7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2tpbGxfdXJiczoKKwlmb3IgKC0taTsgaSA+PSAwOyAtLWkpIHsKKwkJdXJiID0gZXMyLT5hcnBjX3VyYltpXTsKKwkJdXNiX2tpbGxfdXJiKHVyYik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZXMyX2FycGNfaW5fZGlzYWJsZShzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyKQoreworCXN0cnVjdCB1cmIgKnVyYjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQVJQQ19JTl9VUkI7ICsraSkgeworCQl1cmIgPSBlczItPmFycGNfdXJiW2ldOworCQl1c2Jfa2lsbF91cmIodXJiKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXJiICpuZXh0X2ZyZWVfdXJiKHN0cnVjdCBlczJfYXBfZGV2ICplczIsIGdmcF90IGdmcF9tYXNrKQoreworCXN0cnVjdCB1cmIgKnVyYiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlczItPmNwb3J0X291dF91cmJfbG9jaywgZmxhZ3MpOworCisJLyogTG9vayBpbiBvdXIgcG9vbCBvZiBhbGxvY2F0ZWQgdXJicyBmaXJzdCwgYXMgdGhhdCdzIHRoZSAiZmFzdGVzdCIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NQT1JUX09VVF9VUkI7ICsraSkgeworCQlpZiAoZXMyLT5jcG9ydF9vdXRfdXJiX2J1c3lbaV0gPT0gZmFsc2UgJiYKKwkJCQllczItPmNwb3J0X291dF91cmJfY2FuY2VsbGVkW2ldID09IGZhbHNlKSB7CisJCQllczItPmNwb3J0X291dF91cmJfYnVzeVtpXSA9IHRydWU7CisJCQl1cmIgPSBlczItPmNwb3J0X291dF91cmJbaV07CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlczItPmNwb3J0X291dF91cmJfbG9jaywgZmxhZ3MpOworCWlmICh1cmIpCisJCXJldHVybiB1cmI7CisKKwkvKgorCSAqIENyYXAsIHBvb2wgaXMgZW1wdHksIGNvbXBsYWluIHRvIHRoZSBzeXNsb2cgYW5kIGdvIGFsbG9jYXRlIG9uZQorCSAqIGR5bmFtaWNhbGx5IGFzIHdlIGhhdmUgdG8gc3VjY2VlZC4KKwkgKi8KKwlkZXZfZGJnKCZlczItPnVzYl9kZXYtPmRldiwKKwkJIk5vIGZyZWUgQ1BvcnQgT1VUIHVyYnMsIGhhdmluZyB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSBvbmUhXG4iKTsKKwlyZXR1cm4gdXNiX2FsbG9jX3VyYigwLCBnZnBfbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfdXJiKHN0cnVjdCBlczJfYXBfZGV2ICplczIsIHN0cnVjdCB1cmIgKnVyYikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCS8qCisJICogU2VlIGlmIHRoaXMgd2FzIGFuIHVyYiBpbiBvdXIgcG9vbCwgaWYgc28gbWFyayBpdCAiZnJlZSIsIG90aGVyd2lzZQorCSAqIHdlIG5lZWQgdG8gZnJlZSBpdCBvdXJzZWx2ZXMuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVzMi0+Y3BvcnRfb3V0X3VyYl9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9DUE9SVF9PVVRfVVJCOyArK2kpIHsKKwkJaWYgKHVyYiA9PSBlczItPmNwb3J0X291dF91cmJbaV0pIHsKKwkJCWVzMi0+Y3BvcnRfb3V0X3VyYl9idXN5W2ldID0gZmFsc2U7CisJCQl1cmIgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXMyLT5jcG9ydF9vdXRfdXJiX2xvY2ssIGZsYWdzKTsKKworCS8qIElmIHVyYiBpcyBub3QgTlVMTCwgdGhlbiB3ZSBuZWVkIHRvIGZyZWUgdGhpcyB1cmIgKi8KKwl1c2JfZnJlZV91cmIodXJiKTsKK30KKworLyoKKyAqIFdlIChhYil1c2UgdGhlIG9wZXJhdGlvbi1tZXNzYWdlIGhlYWRlciBwYWQgYnl0ZXMgdG8gdHJhbnNmZXIgdGhlCisgKiBjcG9ydCBpZCBpbiBvcmRlciB0byBtaW5pbWlzZSBvdmVyaGVhZC4KKyAqLworc3RhdGljIHZvaWQKK2diX21lc3NhZ2VfY3BvcnRfcGFjayhzdHJ1Y3QgZ2Jfb3BlcmF0aW9uX21zZ19oZHIgKmhlYWRlciwgdTE2IGNwb3J0X2lkKQoreworCWhlYWRlci0+cGFkWzBdID0gY3BvcnRfaWQ7Cit9CisKKy8qIENsZWFyIHRoZSBwYWQgYnl0ZXMgdXNlZCBmb3IgdGhlIENQb3J0IGlkICovCitzdGF0aWMgdm9pZCBnYl9tZXNzYWdlX2Nwb3J0X2NsZWFyKHN0cnVjdCBnYl9vcGVyYXRpb25fbXNnX2hkciAqaGVhZGVyKQoreworCWhlYWRlci0+cGFkWzBdID0gMDsKK30KKworLyogRXh0cmFjdCB0aGUgQ1BvcnQgaWQgcGFja2VkIGludG8gdGhlIGhlYWRlciwgYW5kIGNsZWFyIGl0ICovCitzdGF0aWMgdTE2IGdiX21lc3NhZ2VfY3BvcnRfdW5wYWNrKHN0cnVjdCBnYl9vcGVyYXRpb25fbXNnX2hkciAqaGVhZGVyKQoreworCXUxNiBjcG9ydF9pZCA9IGhlYWRlci0+cGFkWzBdOworCisJZ2JfbWVzc2FnZV9jcG9ydF9jbGVhcihoZWFkZXIpOworCisJcmV0dXJuIGNwb3J0X2lkOworfQorCisvKgorICogUmV0dXJucyB6ZXJvIGlmIHRoZSBtZXNzYWdlIHdhcyBzdWNjZXNzZnVsbHkgcXVldWVkLCBvciBhIG5lZ2F0aXZlIGVycm5vCisgKiBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgbWVzc2FnZV9zZW5kKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCwKKwkJCXN0cnVjdCBnYl9tZXNzYWdlICptZXNzYWdlLCBnZnBfdCBnZnBfbWFzaykKK3sKKwlzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyID0gaGRfdG9fZXMyKGhkKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGVzMi0+dXNiX2RldjsKKwlzaXplX3QgYnVmZmVyX3NpemU7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogVGhlIGRhdGEgYWN0dWFsbHkgdHJhbnNmZXJyZWQgd2lsbCBpbmNsdWRlIGFuIGluZGljYXRpb24KKwkgKiBvZiB3aGVyZSB0aGUgZGF0YSBzaG91bGQgYmUgc2VudC4gIERvIG9uZSBsYXN0IGNoZWNrIG9mCisJICogdGhlIHRhcmdldCBDUG9ydCBpZCBiZWZvcmUgZmlsbGluZyBpdCBpbi4KKwkgKi8KKwlpZiAoIWNwb3J0X2lkX3ZhbGlkKGhkLCBjcG9ydF9pZCkpIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAiaW52YWxpZCBjcG9ydCAldVxuIiwgY3BvcnRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBGaW5kIGEgZnJlZSB1cmIgKi8KKwl1cmIgPSBuZXh0X2ZyZWVfdXJiKGVzMiwgZ2ZwX21hc2spOworCWlmICghdXJiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlczItPmNwb3J0X291dF91cmJfbG9jaywgZmxhZ3MpOworCW1lc3NhZ2UtPmhjcHJpdiA9IHVyYjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlczItPmNwb3J0X291dF91cmJfbG9jaywgZmxhZ3MpOworCisJLyogUGFjayB0aGUgY3BvcnQgaWQgaW50byB0aGUgbWVzc2FnZSBoZWFkZXIgKi8KKwlnYl9tZXNzYWdlX2Nwb3J0X3BhY2sobWVzc2FnZS0+aGVhZGVyLCBjcG9ydF9pZCk7CisKKwlidWZmZXJfc2l6ZSA9IHNpemVvZigqbWVzc2FnZS0+aGVhZGVyKSArIG1lc3NhZ2UtPnBheWxvYWRfc2l6ZTsKKworCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgdWRldiwKKwkJCSAgdXNiX3NuZGJ1bGtwaXBlKHVkZXYsCisJCQkJCSAgZXMyLT5jcG9ydF9vdXRfZW5kcG9pbnQpLAorCQkJICBtZXNzYWdlLT5idWZmZXIsIGJ1ZmZlcl9zaXplLAorCQkJICBjcG9ydF9vdXRfY2FsbGJhY2ssIG1lc3NhZ2UpOworCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX1pFUk9fUEFDS0VUOworCisJdHJhY2VfZ2JfbWVzc2FnZV9zdWJtaXQobWVzc2FnZSk7CisKKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYih1cmIsIGdmcF9tYXNrKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgImZhaWxlZCB0byBzdWJtaXQgb3V0LXVyYjogJWRcbiIsIHJldHZhbCk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmVzMi0+Y3BvcnRfb3V0X3VyYl9sb2NrLCBmbGFncyk7CisJCW1lc3NhZ2UtPmhjcHJpdiA9IE5VTEw7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVzMi0+Y3BvcnRfb3V0X3VyYl9sb2NrLCBmbGFncyk7CisKKwkJZnJlZV91cmIoZXMyLCB1cmIpOworCQlnYl9tZXNzYWdlX2Nwb3J0X2NsZWFyKG1lc3NhZ2UtPmhlYWRlcik7CisKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbiBub3QgYmUgY2FsbGVkIGluIGF0b21pYyBjb250ZXh0LgorICovCitzdGF0aWMgdm9pZCBtZXNzYWdlX2NhbmNlbChzdHJ1Y3QgZ2JfbWVzc2FnZSAqbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gbWVzc2FnZS0+b3BlcmF0aW9uLT5jb25uZWN0aW9uLT5oZDsKKwlzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyID0gaGRfdG9fZXMyKGhkKTsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJaW50IGk7CisKKwltaWdodF9zbGVlcCgpOworCisJc3Bpbl9sb2NrX2lycSgmZXMyLT5jcG9ydF9vdXRfdXJiX2xvY2spOworCXVyYiA9IG1lc3NhZ2UtPmhjcHJpdjsKKworCS8qIFByZXZlbnQgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHVyYiBmcm9tIGJlaW5nIGRlYWxsb2NhdGVkLiAqLworCXVzYl9nZXRfdXJiKHVyYik7CisKKwkvKiBQcmV2ZW50IHByZS1hbGxvY2F0ZWQgdXJiIGZyb20gYmVpbmcgcmV1c2VkLiAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ1BPUlRfT1VUX1VSQjsgKytpKSB7CisJCWlmICh1cmIgPT0gZXMyLT5jcG9ydF9vdXRfdXJiW2ldKSB7CisJCQllczItPmNwb3J0X291dF91cmJfY2FuY2VsbGVkW2ldID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycSgmZXMyLT5jcG9ydF9vdXRfdXJiX2xvY2spOworCisJdXNiX2tpbGxfdXJiKHVyYik7CisKKwlpZiAoaSA8IE5VTV9DUE9SVF9PVVRfVVJCKSB7CisJCXNwaW5fbG9ja19pcnEoJmVzMi0+Y3BvcnRfb3V0X3VyYl9sb2NrKTsKKwkJZXMyLT5jcG9ydF9vdXRfdXJiX2NhbmNlbGxlZFtpXSA9IGZhbHNlOworCQlzcGluX3VubG9ja19pcnEoJmVzMi0+Y3BvcnRfb3V0X3VyYl9sb2NrKTsKKwl9CisKKwl1c2JfZnJlZV91cmIodXJiKTsKK30KKworc3RhdGljIGludCBlczJfY3BvcnRfYWxsb2NhdGUoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgaW50IGNwb3J0X2lkLAorCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IGhkX3RvX2VzMihoZCk7CisJc3RydWN0IGlkYSAqaWRfbWFwID0gJmhkLT5jcG9ydF9pZF9tYXA7CisJaW50IGlkYV9zdGFydCwgaWRhX2VuZDsKKworCXN3aXRjaCAoY3BvcnRfaWQpIHsKKwljYXNlIEVTMl9DUE9SVF9DRFNJMDoKKwljYXNlIEVTMl9DUE9SVF9DRFNJMToKKwkJZGV2X2VycigmaGQtPmRldiwgImNwb3J0ICVkIG5vdCBhdmFpbGFibGVcbiIsIGNwb3J0X2lkKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoZmxhZ3MgJiBHQl9DT05ORUNUSU9OX0ZMQUdfT0ZGTE9BREVEICYmCisJCQlmbGFncyAmIEdCX0NPTk5FQ1RJT05fRkxBR19DRFNJMSkgeworCQlpZiAoZXMyLT5jZHNpMV9pbl91c2UpIHsKKwkJCWRldl9lcnIoJmhkLT5kZXYsICJDRFNJMSBhbHJlYWR5IGluIHVzZVxuIik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJZXMyLT5jZHNpMV9pbl91c2UgPSB0cnVlOworCisJCXJldHVybiBFUzJfQ1BPUlRfQ0RTSTE7CisJfQorCisJaWYgKGNwb3J0X2lkIDwgMCkgeworCQlpZGFfc3RhcnQgPSAwOworCQlpZGFfZW5kID0gaGQtPm51bV9jcG9ydHM7CisJfSBlbHNlIGlmIChjcG9ydF9pZCA8IGhkLT5udW1fY3BvcnRzKSB7CisJCWlkYV9zdGFydCA9IGNwb3J0X2lkOworCQlpZGFfZW5kID0gY3BvcnRfaWQgKyAxOworCX0gZWxzZSB7CisJCWRldl9lcnIoJmhkLT5kZXYsICJjcG9ydCAlZCBub3QgYXZhaWxhYmxlXG4iLCBjcG9ydF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBpZGFfc2ltcGxlX2dldChpZF9tYXAsIGlkYV9zdGFydCwgaWRhX2VuZCwgR0ZQX0tFUk5FTCk7Cit9CisKK3N0YXRpYyB2b2lkIGVzMl9jcG9ydF9yZWxlYXNlKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCkKK3sKKwlzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyID0gaGRfdG9fZXMyKGhkKTsKKworCXN3aXRjaCAoY3BvcnRfaWQpIHsKKwljYXNlIEVTMl9DUE9SVF9DRFNJMToKKwkJZXMyLT5jZHNpMV9pbl91c2UgPSBmYWxzZTsKKwkJcmV0dXJuOworCX0KKworCWlkYV9zaW1wbGVfcmVtb3ZlKCZoZC0+Y3BvcnRfaWRfbWFwLCBjcG9ydF9pZCk7Cit9CisKK3N0YXRpYyBpbnQgY3BvcnRfZW5hYmxlKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCwKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IGhkX3RvX2VzMihoZCk7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBlczItPnVzYl9kZXY7CisJc3RydWN0IGdiX2FwYl9yZXF1ZXN0X2Nwb3J0X2ZsYWdzICpyZXE7CisJdTMyIGNvbm5lY3Rpb25fZmxhZ3M7CisJaW50IHJldDsKKworCXJlcSA9IGt6YWxsb2Moc2l6ZW9mKCpyZXEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb25uZWN0aW9uX2ZsYWdzID0gMDsKKwlpZiAoZmxhZ3MgJiBHQl9DT05ORUNUSU9OX0ZMQUdfQ09OVFJPTCkKKwkJY29ubmVjdGlvbl9mbGFncyB8PSBHQl9BUEJfQ1BPUlRfRkxBR19DT05UUk9MOworCWlmIChmbGFncyAmIEdCX0NPTk5FQ1RJT05fRkxBR19ISUdIX1BSSU8pCisJCWNvbm5lY3Rpb25fZmxhZ3MgfD0gR0JfQVBCX0NQT1JUX0ZMQUdfSElHSF9QUklPOworCisJcmVxLT5mbGFncyA9IGNwdV90b19sZTMyKGNvbm5lY3Rpb25fZmxhZ3MpOworCisJZGV2X2RiZygmaGQtPmRldiwgIiVzIC0gY3BvcnQgPSAldSwgZmxhZ3MgPSAlMDJ4XG4iLCBfX2Z1bmNfXywKKwkJCWNwb3J0X2lkLCBjb25uZWN0aW9uX2ZsYWdzKTsKKworCXJldCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkJR0JfQVBCX1JFUVVFU1RfQ1BPUlRfRkxBR1MsCisJCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfAorCQkJCVVTQl9SRUNJUF9JTlRFUkZBQ0UsIGNwb3J0X2lkLCAwLAorCQkJCXJlcSwgc2l6ZW9mKCpyZXEpLCBFUzJfVVNCX0NUUkxfVElNRU9VVCk7CisJaWYgKHJldCAhPSBzaXplb2YoKnJlcSkpIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjcG9ydCBmbGFncyBmb3IgcG9ydCAlZFxuIiwKKwkJCQljcG9ydF9pZCk7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJldCA9IC1FSU87CisKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gMDsKK291dDoKKwlrZnJlZShyZXEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlczJfY3BvcnRfY29ubmVjdGVkKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCkKK3sKKwlzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyID0gaGRfdG9fZXMyKGhkKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZXMyLT51c2JfZGV2LT5kZXY7CisJc3RydWN0IGFycGNfY3BvcnRfY29ubmVjdGVkX3JlcSByZXE7CisJaW50IHJldDsKKworCXJlcS5jcG9ydF9pZCA9IGNwdV90b19sZTE2KGNwb3J0X2lkKTsKKwlyZXQgPSBhcnBjX3N5bmMoZXMyLCBBUlBDX1RZUEVfQ1BPUlRfQ09OTkVDVEVELCAmcmVxLCBzaXplb2YocmVxKSwKKwkJCU5VTEwsIEVTMl9BUlBDX0NQT1JUX1RJTUVPVVQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2V0IGNvbm5lY3RlZCBzdGF0ZSBmb3IgY3BvcnQgJXU6ICVkXG4iLAorCQkJCWNwb3J0X2lkLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVzMl9jcG9ydF9mbHVzaChzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQpCit7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IGhkX3RvX2VzMihoZCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmVzMi0+dXNiX2Rldi0+ZGV2OworCXN0cnVjdCBhcnBjX2Nwb3J0X2ZsdXNoX3JlcSByZXE7CisJaW50IHJldDsKKworCXJlcS5jcG9ydF9pZCA9IGNwdV90b19sZTE2KGNwb3J0X2lkKTsKKwlyZXQgPSBhcnBjX3N5bmMoZXMyLCBBUlBDX1RZUEVfQ1BPUlRfRkxVU0gsICZyZXEsIHNpemVvZihyZXEpLAorCQkJTlVMTCwgRVMyX0FSUENfQ1BPUlRfVElNRU9VVCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBmbHVzaCBjcG9ydCAldTogJWRcbiIsIGNwb3J0X2lkLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVzMl9jcG9ydF9zaHV0ZG93bihzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQsCisJCQkJdTggcGhhc2UsIHVuc2lnbmVkIGludCB0aW1lb3V0KQoreworCXN0cnVjdCBlczJfYXBfZGV2ICplczIgPSBoZF90b19lczIoaGQpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZlczItPnVzYl9kZXYtPmRldjsKKwlzdHJ1Y3QgYXJwY19jcG9ydF9zaHV0ZG93bl9yZXEgcmVxOworCWludCByZXN1bHQ7CisJaW50IHJldDsKKworCWlmICh0aW1lb3V0ID4gVTE2X01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXEuY3BvcnRfaWQgPSBjcHVfdG9fbGUxNihjcG9ydF9pZCk7CisJcmVxLnRpbWVvdXQgPSBjcHVfdG9fbGUxNih0aW1lb3V0KTsKKwlyZXEucGhhc2UgPSBwaGFzZTsKKwlyZXQgPSBhcnBjX3N5bmMoZXMyLCBBUlBDX1RZUEVfQ1BPUlRfU0hVVERPV04sICZyZXEsIHNpemVvZihyZXEpLAorCQkJJnJlc3VsdCwgRVMyX0FSUENfQ1BPUlRfVElNRU9VVCArIHRpbWVvdXQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2VuZCBzaHV0ZG93biBvdmVyIGNwb3J0ICV1OiAlZCAoJWQpXG4iLAorCQkJCWNwb3J0X2lkLCByZXQsIHJlc3VsdCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXMyX2Nwb3J0X3F1aWVzY2Uoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGNwb3J0X2lkLAorCQkJCXNpemVfdCBwZWVyX3NwYWNlLCB1bnNpZ25lZCBpbnQgdGltZW91dCkKK3sKKwlzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyID0gaGRfdG9fZXMyKGhkKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZXMyLT51c2JfZGV2LT5kZXY7CisJc3RydWN0IGFycGNfY3BvcnRfcXVpZXNjZV9yZXEgcmVxOworCWludCByZXN1bHQ7CisJaW50IHJldDsKKworCWlmIChwZWVyX3NwYWNlID4gVTE2X01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGltZW91dCA+IFUxNl9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVxLmNwb3J0X2lkID0gY3B1X3RvX2xlMTYoY3BvcnRfaWQpOworCXJlcS5wZWVyX3NwYWNlID0gY3B1X3RvX2xlMTYocGVlcl9zcGFjZSk7CisJcmVxLnRpbWVvdXQgPSBjcHVfdG9fbGUxNih0aW1lb3V0KTsKKwlyZXQgPSBhcnBjX3N5bmMoZXMyLCBBUlBDX1RZUEVfQ1BPUlRfUVVJRVNDRSwgJnJlcSwgc2l6ZW9mKHJlcSksCisJCQkmcmVzdWx0LCBFUzJfQVJQQ19DUE9SVF9USU1FT1VUICsgdGltZW91dCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBxdWllc2NlIGNwb3J0ICV1OiAlZCAoJWQpXG4iLAorCQkJCWNwb3J0X2lkLCByZXQsIHJlc3VsdCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXMyX2Nwb3J0X2NsZWFyKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCkKK3sKKwlzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyID0gaGRfdG9fZXMyKGhkKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZXMyLT51c2JfZGV2LT5kZXY7CisJc3RydWN0IGFycGNfY3BvcnRfY2xlYXJfcmVxIHJlcTsKKwlpbnQgcmV0OworCisJcmVxLmNwb3J0X2lkID0gY3B1X3RvX2xlMTYoY3BvcnRfaWQpOworCXJldCA9IGFycGNfc3luYyhlczIsIEFSUENfVFlQRV9DUE9SVF9DTEVBUiwgJnJlcSwgc2l6ZW9mKHJlcSksCisJCQlOVUxMLCBFUzJfQVJQQ19DUE9SVF9USU1FT1VUKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGNsZWFyIGNwb3J0ICV1OiAlZFxuIiwgY3BvcnRfaWQsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGF0ZW5jeV90YWdfZW5hYmxlKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBlczJfYXBfZGV2ICplczIgPSBoZF90b19lczIoaGQpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gZXMyLT51c2JfZGV2OworCisJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCQkgR0JfQVBCX1JFUVVFU1RfTEFURU5DWV9UQUdfRU4sCisJCQkJIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJCQkgVVNCX1JFQ0lQX0lOVEVSRkFDRSwgY3BvcnRfaWQsIDAsIE5VTEwsCisJCQkJIDAsIEVTMl9VU0JfQ1RSTF9USU1FT1VUKTsKKworCWlmIChyZXR2YWwgPCAwKQorCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJDYW5ub3QgZW5hYmxlIGxhdGVuY3kgdGFnIGZvciBjcG9ydCAlZFxuIiwKKwkJCWNwb3J0X2lkKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGxhdGVuY3lfdGFnX2Rpc2FibGUoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGNwb3J0X2lkKQoreworCWludCByZXR2YWw7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IGhkX3RvX2VzMihoZCk7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBlczItPnVzYl9kZXY7CisKKwlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJCSBHQl9BUEJfUkVRVUVTVF9MQVRFTkNZX1RBR19ESVMsCisJCQkJIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJCQkgVVNCX1JFQ0lQX0lOVEVSRkFDRSwgY3BvcnRfaWQsIDAsIE5VTEwsCisJCQkJIDAsIEVTMl9VU0JfQ1RSTF9USU1FT1VUKTsKKworCWlmIChyZXR2YWwgPCAwKQorCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJDYW5ub3QgZGlzYWJsZSBsYXRlbmN5IHRhZyBmb3IgY3BvcnQgJWRcbiIsCisJCQljcG9ydF9pZCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCB0aW1lc3luY19lbmFibGUoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTggY291bnQsCisJCQkgICB1NjQgZnJhbWVfdGltZSwgdTMyIHN0cm9iZV9kZWxheSwgdTMyIHJlZmNsaykKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBlczJfYXBfZGV2ICplczIgPSBoZF90b19lczIoaGQpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gZXMyLT51c2JfZGV2OworCXN0cnVjdCBnYl9jb250cm9sX3RpbWVzeW5jX2VuYWJsZV9yZXF1ZXN0ICpyZXF1ZXN0OworCisJcmVxdWVzdCA9IGt6YWxsb2Moc2l6ZW9mKCpyZXF1ZXN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXF1ZXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcXVlc3QtPmNvdW50ID0gY291bnQ7CisJcmVxdWVzdC0+ZnJhbWVfdGltZSA9IGNwdV90b19sZTY0KGZyYW1lX3RpbWUpOworCXJlcXVlc3QtPnN0cm9iZV9kZWxheSA9IGNwdV90b19sZTMyKHN0cm9iZV9kZWxheSk7CisJcmVxdWVzdC0+cmVmY2xrID0gY3B1X3RvX2xlMzIocmVmY2xrKTsKKwlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJCSBHQl9BUEJfUkVRVUVTVF9USU1FU1lOQ19FTkFCTEUsCisJCQkJIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJCQkgVVNCX1JFQ0lQX0lOVEVSRkFDRSwgMCwgMCwgcmVxdWVzdCwKKwkJCQkgc2l6ZW9mKCpyZXF1ZXN0KSwgRVMyX1VTQl9DVFJMX1RJTUVPVVQpOworCWlmIChyZXR2YWwgPCAwKQorCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJDYW5ub3QgZW5hYmxlIHRpbWVzeW5jICVkXG4iLCByZXR2YWwpOworCisJa2ZyZWUocmVxdWVzdCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCB0aW1lc3luY19kaXNhYmxlKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyID0gaGRfdG9fZXMyKGhkKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGVzMi0+dXNiX2RldjsKKworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkJIEdCX0FQQl9SRVFVRVNUX1RJTUVTWU5DX0RJU0FCTEUsCisJCQkJIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJCQkgVVNCX1JFQ0lQX0lOVEVSRkFDRSwgMCwgMCwgTlVMTCwKKwkJCQkgMCwgRVMyX1VTQl9DVFJMX1RJTUVPVVQpOworCWlmIChyZXR2YWwgPCAwKQorCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJDYW5ub3QgZGlzYWJsZSB0aW1lc3luYyAlZFxuIiwgcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgdGltZXN5bmNfYXV0aG9yaXRhdGl2ZShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1NjQgKmZyYW1lX3RpbWUpCit7CisJaW50IHJldHZhbCwgaTsKKwlzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyID0gaGRfdG9fZXMyKGhkKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGVzMi0+dXNiX2RldjsKKwlzdHJ1Y3QgdGltZXN5bmNfYXV0aG9yaXRhdGl2ZV9yZXF1ZXN0ICpyZXF1ZXN0OworCisJcmVxdWVzdCA9IGt6YWxsb2Moc2l6ZW9mKCpyZXF1ZXN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXF1ZXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBHQl9USU1FU1lOQ19NQVhfU1RST0JFUzsgaSsrKQorCQlyZXF1ZXN0LT5mcmFtZV90aW1lW2ldID0gY3B1X3RvX2xlNjQoZnJhbWVfdGltZVtpXSk7CisKKwlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJCSBHQl9BUEJfUkVRVUVTVF9USU1FU1lOQ19BVVRIT1JJVEFUSVZFLAorCQkJCSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8CisJCQkJIFVTQl9SRUNJUF9JTlRFUkZBQ0UsIDAsIDAsIHJlcXVlc3QsCisJCQkJIHNpemVvZigqcmVxdWVzdCksIEVTMl9VU0JfQ1RSTF9USU1FT1VUKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAiQ2Fubm90IHRpbWVzeW5jIGF1dGhvcml0YXRpdmUgb3V0ICVkXG4iLCByZXR2YWwpOworCisJa2ZyZWUocmVxdWVzdCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCB0aW1lc3luY19nZXRfbGFzdF9ldmVudChzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1NjQgKmZyYW1lX3RpbWUpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyID0gaGRfdG9fZXMyKGhkKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGVzMi0+dXNiX2RldjsKKwlfX2xlNjQgKnJlc3BvbnNlX2ZyYW1lX3RpbWU7CisKKwlyZXNwb25zZV9mcmFtZV90aW1lID0ga3phbGxvYyhzaXplb2YoKnJlc3BvbnNlX2ZyYW1lX3RpbWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlc3BvbnNlX2ZyYW1lX3RpbWUpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCQkgR0JfQVBCX1JFUVVFU1RfVElNRVNZTkNfR0VUX0xBU1RfRVZFTlQsCisJCQkJIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfAorCQkJCSBVU0JfUkVDSVBfSU5URVJGQUNFLCAwLCAwLCByZXNwb25zZV9mcmFtZV90aW1lLAorCQkJCSBzaXplb2YoKnJlc3BvbnNlX2ZyYW1lX3RpbWUpLAorCQkJCSBFUzJfVVNCX0NUUkxfVElNRU9VVCk7CisKKwlpZiAocmV0dmFsICE9IHNpemVvZigqcmVzcG9uc2VfZnJhbWVfdGltZSkpIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAiQ2Fubm90IGdldCBsYXN0IFRpbWVTeW5jIGV2ZW50OiAlZFxuIiwKKwkJCXJldHZhbCk7CisKKwkJaWYgKHJldHZhbCA+PSAwKQorCQkJcmV0dmFsID0gLUVJTzsKKworCQlnb3RvIG91dDsKKwl9CisJKmZyYW1lX3RpbWUgPSBsZTY0X3RvX2NwdSgqcmVzcG9uc2VfZnJhbWVfdGltZSk7CisJcmV0dmFsID0gMDsKK291dDoKKwlrZnJlZShyZXNwb25zZV9mcmFtZV90aW1lKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc3RydWN0IGdiX2hkX2RyaXZlciBlczJfZHJpdmVyID0geworCS5oZF9wcml2X3NpemUJCQk9IHNpemVvZihzdHJ1Y3QgZXMyX2FwX2RldiksCisJLm1lc3NhZ2Vfc2VuZAkJCT0gbWVzc2FnZV9zZW5kLAorCS5tZXNzYWdlX2NhbmNlbAkJCT0gbWVzc2FnZV9jYW5jZWwsCisJLmNwb3J0X2FsbG9jYXRlCQkJPSBlczJfY3BvcnRfYWxsb2NhdGUsCisJLmNwb3J0X3JlbGVhc2UJCQk9IGVzMl9jcG9ydF9yZWxlYXNlLAorCS5jcG9ydF9lbmFibGUJCQk9IGNwb3J0X2VuYWJsZSwKKwkuY3BvcnRfY29ubmVjdGVkCQk9IGVzMl9jcG9ydF9jb25uZWN0ZWQsCisJLmNwb3J0X2ZsdXNoCQkJPSBlczJfY3BvcnRfZmx1c2gsCisJLmNwb3J0X3NodXRkb3duCQkJPSBlczJfY3BvcnRfc2h1dGRvd24sCisJLmNwb3J0X3F1aWVzY2UJCQk9IGVzMl9jcG9ydF9xdWllc2NlLAorCS5jcG9ydF9jbGVhcgkJCT0gZXMyX2Nwb3J0X2NsZWFyLAorCS5sYXRlbmN5X3RhZ19lbmFibGUJCT0gbGF0ZW5jeV90YWdfZW5hYmxlLAorCS5sYXRlbmN5X3RhZ19kaXNhYmxlCQk9IGxhdGVuY3lfdGFnX2Rpc2FibGUsCisJLm91dHB1dAkJCQk9IG91dHB1dCwKKwkudGltZXN5bmNfZW5hYmxlCQk9IHRpbWVzeW5jX2VuYWJsZSwKKwkudGltZXN5bmNfZGlzYWJsZQkJPSB0aW1lc3luY19kaXNhYmxlLAorCS50aW1lc3luY19hdXRob3JpdGF0aXZlCQk9IHRpbWVzeW5jX2F1dGhvcml0YXRpdmUsCisJLnRpbWVzeW5jX2dldF9sYXN0X2V2ZW50CT0gdGltZXN5bmNfZ2V0X2xhc3RfZXZlbnQsCit9OworCisvKiBDb21tb24gZnVuY3Rpb24gdG8gcmVwb3J0IGNvbnNpc3RlbnQgd2FybmluZ3MgYmFzZWQgb24gVVJCIHN0YXR1cyAqLworc3RhdGljIGludCBjaGVja191cmJfc3RhdHVzKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmdXJiLT5kZXYtPmRldjsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CisKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgMDoKKwkJcmV0dXJuIDA7CisKKwljYXNlIC1FT1ZFUkZMT1c6CisJCWRldl9lcnIoZGV2LCAiJXM6IG92ZXJmbG93IGFjdHVhbCBsZW5ndGggaXMgJWRcbiIsCisJCQlfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJY2FzZSAtRUlMU0VROgorCWNhc2UgLUVQUk9UTzoKKwkJLyogZGV2aWNlIGlzIGdvbmUsIHN0b3Agc2VuZGluZyAqLworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlkZXZfZXJyKGRldiwgIiVzOiB1bmtub3duIHN0YXR1cyAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CisKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdGljIHZvaWQgZXMyX2Rlc3Ryb3koc3RydWN0IGVzMl9hcF9kZXYgKmVzMikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJaW50IGk7CisKKwlkZWJ1Z2ZzX3JlbW92ZShlczItPmFwYl9sb2dfZW5hYmxlX2RlbnRyeSk7CisJdXNiX2xvZ19kaXNhYmxlKGVzMik7CisKKwkvKiBUZWFyIGRvd24gZXZlcnl0aGluZyEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NQT1JUX09VVF9VUkI7ICsraSkgeworCQl1cmIgPSBlczItPmNwb3J0X291dF91cmJbaV07CisJCXVzYl9raWxsX3VyYih1cmIpOworCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJZXMyLT5jcG9ydF9vdXRfdXJiW2ldID0gTlVMTDsKKwkJZXMyLT5jcG9ydF9vdXRfdXJiX2J1c3lbaV0gPSBmYWxzZTsJLyoganVzdCB0byBiZSBhbmFsICovCisJfQorCisJZm9yIChpID0gMDsgaSA8IE5VTV9BUlBDX0lOX1VSQjsgKytpKSB7CisJCXVzYl9mcmVlX3VyYihlczItPmFycGNfdXJiW2ldKTsKKwkJa2ZyZWUoZXMyLT5hcnBjX2J1ZmZlcltpXSk7CisJCWVzMi0+YXJwY19idWZmZXJbaV0gPSBOVUxMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ1BPUlRfSU5fVVJCOyArK2kpIHsKKwkJdXNiX2ZyZWVfdXJiKGVzMi0+Y3BvcnRfaW4udXJiW2ldKTsKKwkJa2ZyZWUoZXMyLT5jcG9ydF9pbi5idWZmZXJbaV0pOworCQllczItPmNwb3J0X2luLmJ1ZmZlcltpXSA9IE5VTEw7CisJfQorCisJLyogcmVsZWFzZSByZXNlcnZlZCBDRFNJMCBhbmQgQ0RTSTEgY3BvcnRzICovCisJZ2JfaGRfY3BvcnRfcmVsZWFzZV9yZXNlcnZlZChlczItPmhkLCBFUzJfQ1BPUlRfQ0RTSTEpOworCWdiX2hkX2Nwb3J0X3JlbGVhc2VfcmVzZXJ2ZWQoZXMyLT5oZCwgRVMyX0NQT1JUX0NEU0kwKTsKKworCXVkZXYgPSBlczItPnVzYl9kZXY7CisJZ2JfaGRfcHV0KGVzMi0+aGQpOworCisJdXNiX3B1dF9kZXYodWRldik7Cit9CisKK3N0YXRpYyB2b2lkIGNwb3J0X2luX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ1cmItPmRldi0+ZGV2OworCXN0cnVjdCBnYl9vcGVyYXRpb25fbXNnX2hkciAqaGVhZGVyOworCWludCBzdGF0dXMgPSBjaGVja191cmJfc3RhdHVzKHVyYik7CisJaW50IHJldHZhbDsKKwl1MTYgY3BvcnRfaWQ7CisKKwlpZiAoc3RhdHVzKSB7CisJCWlmICgoc3RhdHVzID09IC1FQUdBSU4pIHx8IChzdGF0dXMgPT0gLUVQUk9UTykpCisJCQlnb3RvIGV4aXQ7CisKKwkJLyogVGhlIHVyYiBpcyBiZWluZyB1bmxpbmtlZCAqLworCQlpZiAoc3RhdHVzID09IC1FTk9FTlQgfHwgc3RhdHVzID09IC1FU0hVVERPV04pCisJCQlyZXR1cm47CisKKwkJZGV2X2VycihkZXYsICJ1cmIgY3BvcnQgaW4gZXJyb3IgJWQgKGRyb3BwZWQpXG4iLCBzdGF0dXMpOworCQlyZXR1cm47CisJfQorCisJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA8IHNpemVvZigqaGVhZGVyKSkgeworCQlkZXZfZXJyKGRldiwgInNob3J0IG1lc3NhZ2UgcmVjZWl2ZWRcbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogRXh0cmFjdCB0aGUgQ1BvcnQgaWQsIHdoaWNoIGlzIHBhY2tlZCBpbiB0aGUgbWVzc2FnZSBoZWFkZXIgKi8KKwloZWFkZXIgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwljcG9ydF9pZCA9IGdiX21lc3NhZ2VfY3BvcnRfdW5wYWNrKGhlYWRlcik7CisKKwlpZiAoY3BvcnRfaWRfdmFsaWQoaGQsIGNwb3J0X2lkKSkgeworCQlncmV5YnVzX2RhdGFfcmN2ZChoZCwgY3BvcnRfaWQsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCk7CisJfSBlbHNlIHsKKwkJZGV2X2VycihkZXYsICJpbnZhbGlkIGNwb3J0IGlkICV1IHJlY2VpdmVkXG4iLCBjcG9ydF9pZCk7CisJfQorZXhpdDoKKwkvKiBwdXQgb3VyIHVyYiBiYWNrIGluIHRoZSByZXF1ZXN0IHBvb2wgKi8KKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmIChyZXR2YWwpCisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlc3VibWl0IGluLXVyYjogJWRcbiIsIHJldHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGNwb3J0X291dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGdiX21lc3NhZ2UgKm1lc3NhZ2UgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCA9IG1lc3NhZ2UtPm9wZXJhdGlvbi0+Y29ubmVjdGlvbi0+aGQ7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IGhkX3RvX2VzMihoZCk7CisJaW50IHN0YXR1cyA9IGNoZWNrX3VyYl9zdGF0dXModXJiKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZ2JfbWVzc2FnZV9jcG9ydF9jbGVhcihtZXNzYWdlLT5oZWFkZXIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVzMi0+Y3BvcnRfb3V0X3VyYl9sb2NrLCBmbGFncyk7CisJbWVzc2FnZS0+aGNwcml2ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlczItPmNwb3J0X291dF91cmJfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBUZWxsIHRoZSBzdWJtaXR0ZXIgdGhhdCB0aGUgbWVzc2FnZSBzZW5kIChhdHRlbXB0KSBpcworCSAqIGNvbXBsZXRlLCBhbmQgcmVwb3J0IHRoZSBzdGF0dXMuCisJICovCisJZ3JleWJ1c19tZXNzYWdlX3NlbnQoaGQsIG1lc3NhZ2UsIHN0YXR1cyk7CisKKwlmcmVlX3VyYihlczIsIHVyYik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXJwYyAqYXJwY19hbGxvYyh2b2lkICpwYXlsb2FkLCB1MTYgc2l6ZSwgdTggdHlwZSkKK3sKKwlzdHJ1Y3QgYXJwYyAqcnBjOworCisJaWYgKHNpemUgKyBzaXplb2YoKnJwYy0+cmVxKSA+IEFSUENfT1VUX1NJWkVfTUFYKQorCQlyZXR1cm4gTlVMTDsKKworCXJwYyA9IGt6YWxsb2Moc2l6ZW9mKCpycGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJwYykKKwkJcmV0dXJuIE5VTEw7CisKKwlJTklUX0xJU1RfSEVBRCgmcnBjLT5saXN0KTsKKwlycGMtPnJlcSA9IGt6YWxsb2Moc2l6ZW9mKCpycGMtPnJlcSkgKyBzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJwYy0+cmVxKQorCQlnb3RvIGVycl9mcmVlX3JwYzsKKworCXJwYy0+cmVzcCA9IGt6YWxsb2Moc2l6ZW9mKCpycGMtPnJlc3ApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJwYy0+cmVzcCkKKwkJZ290byBlcnJfZnJlZV9yZXE7CisKKwlycGMtPnJlcS0+dHlwZSA9IHR5cGU7CisJcnBjLT5yZXEtPnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YocnBjLT5yZXEpICsgc2l6ZSk7CisJbWVtY3B5KHJwYy0+cmVxLT5kYXRhLCBwYXlsb2FkLCBzaXplKTsKKworCWluaXRfY29tcGxldGlvbigmcnBjLT5yZXNwb25zZV9yZWNlaXZlZCk7CisKKwlyZXR1cm4gcnBjOworCitlcnJfZnJlZV9yZXE6CisJa2ZyZWUocnBjLT5yZXEpOworZXJyX2ZyZWVfcnBjOgorCWtmcmVlKHJwYyk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgYXJwY19mcmVlKHN0cnVjdCBhcnBjICpycGMpCit7CisJa2ZyZWUocnBjLT5yZXEpOworCWtmcmVlKHJwYy0+cmVzcCk7CisJa2ZyZWUocnBjKTsKK30KKworc3RhdGljIHN0cnVjdCBhcnBjICphcnBjX2ZpbmQoc3RydWN0IGVzMl9hcF9kZXYgKmVzMiwgX19sZTE2IGlkKQoreworCXN0cnVjdCBhcnBjICpycGM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJwYywgJmVzMi0+YXJwY3MsIGxpc3QpIHsKKwkJaWYgKHJwYy0+cmVxLT5pZCA9PSBpZCkKKwkJCXJldHVybiBycGM7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGFycGNfYWRkKHN0cnVjdCBlczJfYXBfZGV2ICplczIsIHN0cnVjdCBhcnBjICpycGMpCit7CisJcnBjLT5hY3RpdmUgPSB0cnVlOworCXJwYy0+cmVxLT5pZCA9IGNwdV90b19sZTE2KGVzMi0+YXJwY19pZF9jeWNsZSsrKTsKKwlsaXN0X2FkZF90YWlsKCZycGMtPmxpc3QsICZlczItPmFycGNzKTsKK30KKworc3RhdGljIHZvaWQgYXJwY19kZWwoc3RydWN0IGVzMl9hcF9kZXYgKmVzMiwgc3RydWN0IGFycGMgKnJwYykKK3sKKwlpZiAocnBjLT5hY3RpdmUpIHsKKwkJcnBjLT5hY3RpdmUgPSBmYWxzZTsKKwkJbGlzdF9kZWwoJnJwYy0+bGlzdCk7CisJfQorfQorCitzdGF0aWMgaW50IGFycGNfc2VuZChzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyLCBzdHJ1Y3QgYXJwYyAqcnBjLCBpbnQgdGltZW91dCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGVzMi0+dXNiX2RldjsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCQkgR0JfQVBCX1JFUVVFU1RfQVJQQ19SVU4sCisJCQkJIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJCQkgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJCQkgMCwgMCwKKwkJCQkgcnBjLT5yZXEsIGxlMTZfdG9fY3B1KHJwYy0+cmVxLT5zaXplKSwKKwkJCQkgRVMyX1VTQl9DVFJMX1RJTUVPVVQpOworCWlmIChyZXR2YWwgIT0gbGUxNl90b19jcHUocnBjLT5yZXEtPnNpemUpKSB7CisJCWRldl9lcnIoJnVkZXYtPmRldiwKKwkJCSJmYWlsZWQgdG8gc2VuZCBBUlBDIHJlcXVlc3QgJWQ6ICVkXG4iLAorCQkJcnBjLT5yZXEtPnR5cGUsIHJldHZhbCk7CisJCWlmIChyZXR2YWwgPiAwKQorCQkJcmV0dmFsID0gLUVJTzsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcnBjX3N5bmMoc3RydWN0IGVzMl9hcF9kZXYgKmVzMiwgdTggdHlwZSwgdm9pZCAqcGF5bG9hZCwKKwkJICAgICBzaXplX3Qgc2l6ZSwgaW50ICpyZXN1bHQsIHVuc2lnbmVkIGludCB0aW1lb3V0KQoreworCXN0cnVjdCBhcnBjICpycGM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCisJaWYgKHJlc3VsdCkKKwkJKnJlc3VsdCA9IDA7CisKKwlycGMgPSBhcnBjX2FsbG9jKHBheWxvYWQsIHNpemUsIHR5cGUpOworCWlmICghcnBjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlczItPmFycGNfbG9jaywgZmxhZ3MpOworCWFycGNfYWRkKGVzMiwgcnBjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlczItPmFycGNfbG9jaywgZmxhZ3MpOworCisJcmV0dmFsID0gYXJwY19zZW5kKGVzMiwgcnBjLCB0aW1lb3V0KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dF9hcnBjX2RlbDsKKworCXJldHZhbCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQkJCQkJJnJwYy0+cmVzcG9uc2VfcmVjZWl2ZWQsCisJCQkJCQltc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKKwlpZiAocmV0dmFsIDw9IDApIHsKKwkJaWYgKCFyZXR2YWwpCisJCQlyZXR2YWwgPSAtRVRJTUVET1VUOworCQlnb3RvIG91dF9hcnBjX2RlbDsKKwl9CisKKwlpZiAocnBjLT5yZXNwLT5yZXN1bHQpIHsKKwkJcmV0dmFsID0gLUVSRU1PVEVJTzsKKwkJaWYgKHJlc3VsdCkKKwkJCSpyZXN1bHQgPSBycGMtPnJlc3AtPnJlc3VsdDsKKwl9IGVsc2UgeworCQlyZXR2YWwgPSAwOworCX0KKworb3V0X2FycGNfZGVsOgorCXNwaW5fbG9ja19pcnFzYXZlKCZlczItPmFycGNfbG9jaywgZmxhZ3MpOworCWFycGNfZGVsKGVzMiwgcnBjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlczItPmFycGNfbG9jaywgZmxhZ3MpOworCWFycGNfZnJlZShycGMpOworCisJaWYgKHJldHZhbCA8IDAgJiYgcmV0dmFsICE9IC1FUkVNT1RFSU8pIHsKKwkJZGV2X2VycigmZXMyLT51c2JfZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIGV4ZWN1dGUgQVJQQzogJWRcbiIsIHJldHZhbCk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgYXJwY19pbl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmdXJiLT5kZXYtPmRldjsKKwlpbnQgc3RhdHVzID0gY2hlY2tfdXJiX3N0YXR1cyh1cmIpOworCXN0cnVjdCBhcnBjICpycGM7CisJc3RydWN0IGFycGNfcmVzcG9uc2VfbWVzc2FnZSAqcmVzcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXR2YWw7CisKKwlpZiAoc3RhdHVzKSB7CisJCWlmICgoc3RhdHVzID09IC1FQUdBSU4pIHx8IChzdGF0dXMgPT0gLUVQUk9UTykpCisJCQlnb3RvIGV4aXQ7CisKKwkJLyogVGhlIHVyYiBpcyBiZWluZyB1bmxpbmtlZCAqLworCQlpZiAoc3RhdHVzID09IC1FTk9FTlQgfHwgc3RhdHVzID09IC1FU0hVVERPV04pCisJCQlyZXR1cm47CisKKwkJZGV2X2VycihkZXYsICJhcnBjIGluLXVyYiBlcnJvciAlZCAoZHJvcHBlZClcbiIsIHN0YXR1cyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoIDwgc2l6ZW9mKCpyZXNwKSkgeworCQlkZXZfZXJyKGRldiwgInNob3J0IGFwcmMgcmVzcG9uc2UgcmVjZWl2ZWRcbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCisJcmVzcCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCXNwaW5fbG9ja19pcnFzYXZlKCZlczItPmFycGNfbG9jaywgZmxhZ3MpOworCXJwYyA9IGFycGNfZmluZChlczIsIHJlc3AtPmlkKTsKKwlpZiAoIXJwYykgeworCQlkZXZfZXJyKGRldiwgImludmFsaWQgYXJwYyByZXNwb25zZSBpZCByZWNlaXZlZDogJXVcbiIsCisJCQlsZTE2X3RvX2NwdShyZXNwLT5pZCkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlczItPmFycGNfbG9jaywgZmxhZ3MpOworCQlnb3RvIGV4aXQ7CisJfQorCisJYXJwY19kZWwoZXMyLCBycGMpOworCW1lbWNweShycGMtPnJlc3AsIHJlc3AsIHNpemVvZigqcmVzcCkpOworCWNvbXBsZXRlKCZycGMtPnJlc3BvbnNlX3JlY2VpdmVkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlczItPmFycGNfbG9jaywgZmxhZ3MpOworCitleGl0OgorCS8qIHB1dCBvdXIgdXJiIGJhY2sgaW4gdGhlIHJlcXVlc3QgcG9vbCAqLworCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldHZhbCkKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVzdWJtaXQgYXJwYyBpbi11cmI6ICVkXG4iLCByZXR2YWwpOworfQorCisjZGVmaW5lIEFQQjFfTE9HX01TR19TSVpFCTY0CitzdGF0aWMgdm9pZCBhcGJfbG9nX2dldChzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyLCBjaGFyICpidWYpCit7CisJaW50IHJldHZhbDsKKworCWRvIHsKKwkJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKGVzMi0+dXNiX2RldiwKKwkJCQkJdXNiX3JjdmN0cmxwaXBlKGVzMi0+dXNiX2RldiwgMCksCisJCQkJCUdCX0FQQl9SRVFVRVNUX0xPRywKKwkJCQkJVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsCisJCQkJCTB4MDAsIDB4MDAsCisJCQkJCWJ1ZiwKKwkJCQkJQVBCMV9MT0dfTVNHX1NJWkUsCisJCQkJCUVTMl9VU0JfQ1RSTF9USU1FT1VUKTsKKwkJaWYgKHJldHZhbCA+IDApCisJCQlrZmlmb19pbigmZXMyLT5hcGJfbG9nX2ZpZm8sIGJ1ZiwgcmV0dmFsKTsKKwl9IHdoaWxlIChyZXR2YWwgPiAwKTsKK30KKworc3RhdGljIGludCBhcGJfbG9nX3BvbGwodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyID0gZGF0YTsKKwljaGFyICpidWY7CisKKwlidWYgPSBrbWFsbG9jKEFQQjFfTE9HX01TR19TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQltc2xlZXAoMTAwMCk7CisJCWFwYl9sb2dfZ2V0KGVzMiwgYnVmKTsKKwl9CisKKwlrZnJlZShidWYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFwYl9sb2dfcmVhZChzdHJ1Y3QgZmlsZSAqZiwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyID0gZi0+Zl9pbm9kZS0+aV9wcml2YXRlOworCXNzaXplX3QgcmV0OworCXNpemVfdCBjb3BpZWQ7CisJY2hhciAqdG1wX2J1ZjsKKworCWlmIChjb3VudCA+IEFQQjFfTE9HX1NJWkUpCisJCWNvdW50ID0gQVBCMV9MT0dfU0laRTsKKworCXRtcF9idWYgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRtcF9idWYpCisJCXJldHVybiAtRU5PTUVNOworCisJY29waWVkID0ga2ZpZm9fb3V0KCZlczItPmFwYl9sb2dfZmlmbywgdG1wX2J1ZiwgY291bnQpOworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIHRtcF9idWYsIGNvcGllZCk7CisKKwlrZnJlZSh0bXBfYnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFwYl9sb2dfZm9wcyA9IHsKKwkucmVhZAk9IGFwYl9sb2dfcmVhZCwKK307CisKK3N0YXRpYyB2b2lkIHVzYl9sb2dfZW5hYmxlKHN0cnVjdCBlczJfYXBfZGV2ICplczIpCit7CisJaWYgKCFJU19FUlJfT1JfTlVMTChlczItPmFwYl9sb2dfdGFzaykpCisJCXJldHVybjsKKworCS8qIGdldCBsb2cgZnJvbSBBUEIxICovCisJZXMyLT5hcGJfbG9nX3Rhc2sgPSBrdGhyZWFkX3J1bihhcGJfbG9nX3BvbGwsIGVzMiwgImFwYl9sb2ciKTsKKwlpZiAoSVNfRVJSKGVzMi0+YXBiX2xvZ190YXNrKSkKKwkJcmV0dXJuOworCS8qIFhYWCBXZSB3aWxsIG5lZWQgdG8gcmVuYW1lIHRoaXMgcGVyIEFQQiAqLworCWVzMi0+YXBiX2xvZ19kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhcGJfbG9nIiwgU19JUlVHTywKKwkJCQkJCWdiX2RlYnVnZnNfZ2V0KCksIGVzMiwKKwkJCQkJCSZhcGJfbG9nX2ZvcHMpOworfQorCitzdGF0aWMgdm9pZCB1c2JfbG9nX2Rpc2FibGUoc3RydWN0IGVzMl9hcF9kZXYgKmVzMikKK3sKKwlpZiAoSVNfRVJSX09SX05VTEwoZXMyLT5hcGJfbG9nX3Rhc2spKQorCQlyZXR1cm47CisKKwlkZWJ1Z2ZzX3JlbW92ZShlczItPmFwYl9sb2dfZGVudHJ5KTsKKwllczItPmFwYl9sb2dfZGVudHJ5ID0gTlVMTDsKKworCWt0aHJlYWRfc3RvcChlczItPmFwYl9sb2dfdGFzayk7CisJZXMyLT5hcGJfbG9nX3Rhc2sgPSBOVUxMOworfQorCitzdGF0aWMgc3NpemVfdCBhcGJfbG9nX2VuYWJsZV9yZWFkKHN0cnVjdCBmaWxlICpmLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBlczJfYXBfZGV2ICplczIgPSBmLT5mX2lub2RlLT5pX3ByaXZhdGU7CisJaW50IGVuYWJsZSA9ICFJU19FUlJfT1JfTlVMTChlczItPmFwYl9sb2dfdGFzayk7CisJY2hhciB0bXBfYnVmWzNdOworCisJc3ByaW50Zih0bXBfYnVmLCAiJWRcbiIsIGVuYWJsZSk7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIHRtcF9idWYsIDMpOworfQorCitzdGF0aWMgc3NpemVfdCBhcGJfbG9nX2VuYWJsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZiwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgZW5hYmxlOworCXNzaXplX3QgcmV0dmFsOworCXN0cnVjdCBlczJfYXBfZGV2ICplczIgPSBmLT5mX2lub2RlLT5pX3ByaXZhdGU7CisKKwlyZXR2YWwgPSBrc3RydG9pbnRfZnJvbV91c2VyKGJ1ZiwgY291bnQsIDEwLCAmZW5hYmxlKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKGVuYWJsZSkKKwkJdXNiX2xvZ19lbmFibGUoZXMyKTsKKwllbHNlCisJCXVzYl9sb2dfZGlzYWJsZShlczIpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhcGJfbG9nX2VuYWJsZV9mb3BzID0geworCS5yZWFkCT0gYXBiX2xvZ19lbmFibGVfcmVhZCwKKwkud3JpdGUJPSBhcGJfbG9nX2VuYWJsZV93cml0ZSwKK307CisKK3N0YXRpYyBpbnQgYXBiX2dldF9jcG9ydF9jb3VudChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3sKKwlpbnQgcmV0dmFsOworCV9fbGUxNiAqY3BvcnRfY291bnQ7CisKKwljcG9ydF9jb3VudCA9IGt6YWxsb2Moc2l6ZW9mKCpjcG9ydF9jb3VudCksIEdGUF9LRVJORUwpOworCWlmICghY3BvcnRfY291bnQpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCQkgR0JfQVBCX1JFUVVFU1RfQ1BPUlRfQ09VTlQsCisJCQkJIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfAorCQkJCSBVU0JfUkVDSVBfSU5URVJGQUNFLCAwLCAwLCBjcG9ydF9jb3VudCwKKwkJCQkgc2l6ZW9mKCpjcG9ydF9jb3VudCksIEVTMl9VU0JfQ1RSTF9USU1FT1VUKTsKKwlpZiAocmV0dmFsICE9IHNpemVvZigqY3BvcnRfY291bnQpKSB7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgIkNhbm5vdCByZXRyaWV2ZSBDUG9ydCBjb3VudDogJWRcbiIsCisJCQlyZXR2YWwpOworCisJCWlmIChyZXR2YWwgPj0gMCkKKwkJCXJldHZhbCA9IC1FSU87CisKKwkJZ290byBvdXQ7CisJfQorCisJcmV0dmFsID0gbGUxNl90b19jcHUoKmNwb3J0X2NvdW50KTsKKworCS8qIFdlIG5lZWQgdG8gZml0IGEgQ1BvcnQgSUQgaW4gb25lIGJ5dGUgb2YgYSBtZXNzYWdlIGhlYWRlciAqLworCWlmIChyZXR2YWwgPiBVOF9NQVgpIHsKKwkJcmV0dmFsID0gVThfTUFYOworCQlkZXZfd2FybigmdWRldi0+ZGV2LCAiTGltaXRpbmcgbnVtYmVyIG9mIENQb3J0cyB0byBVOF9NQVhcbiIpOworCX0KKworb3V0OgorCWtmcmVlKGNwb3J0X2NvdW50KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogVGhlIEVTMiBVU0IgQnJpZGdlIGRldmljZSBoYXMgMTUgZW5kcG9pbnRzCisgKiAxIENvbnRyb2wgLSB1c3VhbCBVU0Igc3R1ZmYgKyBBUCAtPiBBUEJyaWRnZUEgbWVzc2FnZXMKKyAqIDcgQnVsayBJTiAtIENQb3J0IGRhdGEgaW4KKyAqIDcgQnVsayBPVVQgLSBDUG9ydCBkYXRhIG91dAorICovCitzdGF0aWMgaW50IGFwX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJCSAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMjsKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKKwlfX3U4IGVwX2FkZHI7CisJaW50IHJldHZhbDsKKwlpbnQgaTsKKwlpbnQgbnVtX2Nwb3J0czsKKwlib29sIGJ1bGtfb3V0X2ZvdW5kID0gZmFsc2U7CisJYm9vbCBidWxrX2luX2ZvdW5kID0gZmFsc2U7CisJYm9vbCBhcnBjX2luX2ZvdW5kID0gZmFsc2U7CisKKwl1ZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKKworCW51bV9jcG9ydHMgPSBhcGJfZ2V0X2Nwb3J0X2NvdW50KHVkZXYpOworCWlmIChudW1fY3BvcnRzIDwgMCkgeworCQl1c2JfcHV0X2Rldih1ZGV2KTsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAiQ2Fubm90IHJldHJpZXZlIENQb3J0IGNvdW50OiAlZFxuIiwKKwkJCW51bV9jcG9ydHMpOworCQlyZXR1cm4gbnVtX2Nwb3J0czsKKwl9CisKKwloZCA9IGdiX2hkX2NyZWF0ZSgmZXMyX2RyaXZlciwgJnVkZXYtPmRldiwgRVMyX0dCVUZfTVNHX1NJWkVfTUFYLAorCQkJCW51bV9jcG9ydHMpOworCWlmIChJU19FUlIoaGQpKSB7CisJCXVzYl9wdXRfZGV2KHVkZXYpOworCQlyZXR1cm4gUFRSX0VSUihoZCk7CisJfQorCisJZXMyID0gaGRfdG9fZXMyKGhkKTsKKwllczItPmhkID0gaGQ7CisJZXMyLT51c2JfaW50ZiA9IGludGVyZmFjZTsKKwllczItPnVzYl9kZXYgPSB1ZGV2OworCXNwaW5fbG9ja19pbml0KCZlczItPmNwb3J0X291dF91cmJfbG9jayk7CisJSU5JVF9LRklGTyhlczItPmFwYl9sb2dfZmlmbyk7CisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIGVzMik7CisKKwkvKgorCSAqIFJlc2VydmUgdGhlIENEU0kwIGFuZCBDRFNJMSBDUG9ydHMgc28gdGhleSB3b24ndCBiZSBhbGxvY2F0ZWQKKwkgKiBkeW5hbWljYWxseS4KKwkgKi8KKwlyZXR2YWwgPSBnYl9oZF9jcG9ydF9yZXNlcnZlKGhkLCBFUzJfQ1BPUlRfQ0RTSTApOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3I7CisJcmV0dmFsID0gZ2JfaGRfY3BvcnRfcmVzZXJ2ZShoZCwgRVMyX0NQT1JUX0NEU0kxKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm9yOworCisJLyogZmluZCBhbGwgYnVsayBlbmRwb2ludHMgKi8KKwlpZmFjZV9kZXNjID0gaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZzsKKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKKwkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKKwkJZXBfYWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCisJCWlmICh1c2JfZW5kcG9pbnRfaXNfYnVsa19pbihlbmRwb2ludCkpIHsKKwkJCWlmICghYnVsa19pbl9mb3VuZCkgeworCQkJCWVzMi0+Y3BvcnRfaW4uZW5kcG9pbnQgPSBlcF9hZGRyOworCQkJCWJ1bGtfaW5fZm91bmQgPSB0cnVlOworCQkJfSBlbHNlIGlmICghYXJwY19pbl9mb3VuZCkgeworCQkJCWVzMi0+YXJwY19lbmRwb2ludF9pbiA9IGVwX2FkZHI7CisJCQkJYXJwY19pbl9mb3VuZCA9IHRydWU7CisJCQl9IGVsc2UgeworCQkJCWRldl93YXJuKCZ1ZGV2LT5kZXYsCisJCQkJCSAiVW51c2VkIGJ1bGsgSU4gZW5kcG9pbnQgZm91bmQ6IDB4JTAyeFxuIiwKKwkJCQkJIGVwX2FkZHIpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKHVzYl9lbmRwb2ludF9pc19idWxrX291dChlbmRwb2ludCkpIHsKKwkJCWlmICghYnVsa19vdXRfZm91bmQpIHsKKwkJCQllczItPmNwb3J0X291dF9lbmRwb2ludCA9IGVwX2FkZHI7CisJCQkJYnVsa19vdXRfZm91bmQgPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlkZXZfd2FybigmdWRldi0+ZGV2LAorCQkJCQkgIlVudXNlZCBidWxrIE9VVCBlbmRwb2ludCBmb3VuZDogMHglMDJ4XG4iLAorCQkJCQkgZXBfYWRkcik7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlkZXZfd2FybigmdWRldi0+ZGV2LAorCQkJICJVbmtub3duIGVuZHBvaW50IHR5cGUgZm91bmQsIGFkZHJlc3MgMHglMDJ4XG4iLAorCQkJIGVwX2FkZHIpOworCX0KKwlpZiAoIWJ1bGtfaW5fZm91bmQgfHwgIWFycGNfaW5fZm91bmQgfHwgIWJ1bGtfb3V0X2ZvdW5kKSB7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgIk5vdCBlbm91Z2ggZW5kcG9pbnRzIGZvdW5kIGluIGRldmljZSwgYWJvcnRpbmchXG4iKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBidWZmZXJzIGZvciBvdXIgY3BvcnQgaW4gbWVzc2FnZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NQT1JUX0lOX1VSQjsgKytpKSB7CisJCXN0cnVjdCB1cmIgKnVyYjsKKwkJdTggKmJ1ZmZlcjsKKworCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCQlpZiAoIXVyYikgeworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZXMyLT5jcG9ydF9pbi51cmJbaV0gPSB1cmI7CisKKwkJYnVmZmVyID0ga21hbGxvYyhFUzJfR0JVRl9NU0dfU0laRV9NQVgsIEdGUF9LRVJORUwpOworCQlpZiAoIWJ1ZmZlcikgeworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHVkZXYsCisJCQkJICB1c2JfcmN2YnVsa3BpcGUodWRldiwgZXMyLT5jcG9ydF9pbi5lbmRwb2ludCksCisJCQkJICBidWZmZXIsIEVTMl9HQlVGX01TR19TSVpFX01BWCwKKwkJCQkgIGNwb3J0X2luX2NhbGxiYWNrLCBoZCk7CisKKwkJZXMyLT5jcG9ydF9pbi5idWZmZXJbaV0gPSBidWZmZXI7CisJfQorCisJLyogQWxsb2NhdGUgYnVmZmVycyBmb3IgQVJQQyBpbiBtZXNzYWdlcyAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fQVJQQ19JTl9VUkI7ICsraSkgeworCQlzdHJ1Y3QgdXJiICp1cmI7CisJCXU4ICpidWZmZXI7CisKKwkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF1cmIpIHsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisJCWVzMi0+YXJwY191cmJbaV0gPSB1cmI7CisKKwkJYnVmZmVyID0ga21hbGxvYyhBUlBDX0lOX1NJWkVfTUFYLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidWZmZXIpIHsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJdXNiX2ZpbGxfYnVsa191cmIodXJiLCB1ZGV2LAorCQkJCSAgdXNiX3JjdmJ1bGtwaXBlKHVkZXYsCisJCQkJCQkgIGVzMi0+YXJwY19lbmRwb2ludF9pbiksCisJCQkJICBidWZmZXIsIEFSUENfSU5fU0laRV9NQVgsCisJCQkJICBhcnBjX2luX2NhbGxiYWNrLCBlczIpOworCisJCWVzMi0+YXJwY19idWZmZXJbaV0gPSBidWZmZXI7CisJfQorCisJLyogQWxsb2NhdGUgdXJicyBmb3Igb3VyIENQb3J0IE9VVCBtZXNzYWdlcyAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ1BPUlRfT1VUX1VSQjsgKytpKSB7CisJCXN0cnVjdCB1cmIgKnVyYjsKKworCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCQlpZiAoIXVyYikgeworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQllczItPmNwb3J0X291dF91cmJbaV0gPSB1cmI7CisJCWVzMi0+Y3BvcnRfb3V0X3VyYl9idXN5W2ldID0gZmFsc2U7CS8qIGp1c3QgdG8gYmUgYW5hbCAqLworCX0KKworCS8qIFhYWCBXZSB3aWxsIG5lZWQgdG8gcmVuYW1lIHRoaXMgcGVyIEFQQiAqLworCWVzMi0+YXBiX2xvZ19lbmFibGVfZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiYXBiX2xvZ19lbmFibGUiLAorCQkJCQkJCShTX0lXVVNSIHwgU19JUlVHTyksCisJCQkJCQkJZ2JfZGVidWdmc19nZXQoKSwgZXMyLAorCQkJCQkJCSZhcGJfbG9nX2VuYWJsZV9mb3BzKTsKKworCUlOSVRfTElTVF9IRUFEKCZlczItPmFycGNzKTsKKwlzcGluX2xvY2tfaW5pdCgmZXMyLT5hcnBjX2xvY2spOworCisJaWYgKGVzMl9hcnBjX2luX2VuYWJsZShlczIpKQorCQlnb3RvIGVycm9yOworCisJcmV0dmFsID0gZ2JfaGRfYWRkKGhkKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycl9kaXNhYmxlX2FycGNfaW47CisKKwlyZXR2YWwgPSBlczJfY3BvcnRfaW5fZW5hYmxlKGVzMiwgJmVzMi0+Y3BvcnRfaW4pOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyX2hkX2RlbDsKKworCXJldHVybiAwOworCitlcnJfaGRfZGVsOgorCWdiX2hkX2RlbChoZCk7CitlcnJfZGlzYWJsZV9hcnBjX2luOgorCWVzMl9hcnBjX2luX2Rpc2FibGUoZXMyKTsKK2Vycm9yOgorCWVzMl9kZXN0cm95KGVzMik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBhcF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKworCWdiX2hkX2RlbChlczItPmhkKTsKKworCWVzMl9jcG9ydF9pbl9kaXNhYmxlKGVzMiwgJmVzMi0+Y3BvcnRfaW4pOworCWVzMl9hcnBjX2luX2Rpc2FibGUoZXMyKTsKKworCWVzMl9kZXN0cm95KGVzMik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBlczJfYXBfZHJpdmVyID0geworCS5uYW1lID0JCSJlczJfYXBfZHJpdmVyIiwKKwkucHJvYmUgPQlhcF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CWFwX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0JaWRfdGFibGUsCisJLnNvZnRfdW5iaW5kID0JMSwKK307CisKK21vZHVsZV91c2JfZHJpdmVyKGVzMl9hcF9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKCJHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBsaW51eGZvdW5kYXRpb24ub3JnPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZmlybXdhcmUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Zpcm13YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRmMGRiMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Zpcm13YXJlLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIEdyZXlidXMgRmlybXdhcmUgTWFuYWdlbWVudCBIZWFkZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTYgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaWZuZGVmIF9fRklSTVdBUkVfSAorI2RlZmluZSBfX0ZJUk1XQVJFX0gKKworI2luY2x1ZGUgImdyZXlidXMuaCIKKworI2RlZmluZSBGV19OQU1FX1BSRUZJWAkiZ21wXyIKKworLyoKKyAqIExlbmd0aCBvZiB0aGUgc3RyaW5nIGluIGZvcm1hdDogIkZXX05BTUVfUFJFRklYIiIlMDh4XyUwOHhfJTA4eF8lMDh4XyVzLnRmdGYiCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyArIDEgKyA0ICogKDggKyAxKSArIDEwICsgMSArIDQgKyAxKQorICovCisjZGVmaW5lIEZXX05BTUVfU0laRQkJNTYKKworLyogRmlybXdhcmUgTWFuYWdlbWVudCBQcm90b2NvbCBzcGVjaWZpYyBmdW5jdGlvbnMgKi8KK2ludCBmd19tZ210X2luaXQodm9pZCk7Cit2b2lkIGZ3X21nbXRfZXhpdCh2b2lkKTsKK3N0cnVjdCBnYl9jb25uZWN0aW9uICp0b19md19tZ210X2Nvbm5lY3Rpb24oc3RydWN0IGRldmljZSAqZGV2KTsKK2ludCBnYl9md19tZ210X3JlcXVlc3RfaGFuZGxlcihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCk7CitpbnQgZ2JfZndfbWdtdF9jb25uZWN0aW9uX2luaXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOwordm9pZCBnYl9md19tZ210X2Nvbm5lY3Rpb25fZXhpdChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKKy8qIEZpcm13YXJlIERvd25sb2FkIFByb3RvY29sIHNwZWNpZmljIGZ1bmN0aW9ucyAqLworaW50IGdiX2Z3X2Rvd25sb2FkX3JlcXVlc3RfaGFuZGxlcihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCk7CitpbnQgZ2JfZndfZG93bmxvYWRfY29ubmVjdGlvbl9pbml0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK3ZvaWQgZ2JfZndfZG93bmxvYWRfY29ubmVjdGlvbl9leGl0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKworLyogQ0FQIFByb3RvY29sIHNwZWNpZmljIGZ1bmN0aW9ucyAqLworaW50IGNhcF9pbml0KHZvaWQpOwordm9pZCBjYXBfZXhpdCh2b2lkKTsKK2ludCBnYl9jYXBfY29ubmVjdGlvbl9pbml0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK3ZvaWQgZ2JfY2FwX2Nvbm5lY3Rpb25fZXhpdChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKKyNlbmRpZiAvKiBfX0ZJUk1XQVJFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Z3LWNvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Z3LWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTRhOTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZnctY29yZS5jCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogR3JleWJ1cyBGaXJtd2FyZSBDb3JlIEJ1bmRsZSBEcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE2IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSAiZmlybXdhcmUuaCIKKyNpbmNsdWRlICJncmV5YnVzLmgiCisjaW5jbHVkZSAic3BpbGliLmgiCisKK3N0cnVjdCBnYl9md19jb3JlIHsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbgkqZG93bmxvYWRfY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbgkqbWdtdF9jb25uZWN0aW9uOworCXN0cnVjdCBnYl9jb25uZWN0aW9uCSpzcGlfY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbgkqY2FwX2Nvbm5lY3Rpb247Cit9OworCitzdGF0aWMgc3RydWN0IHNwaWxpYl9vcHMgKnNwaWxpYl9vcHM7CisKK3N0cnVjdCBnYl9jb25uZWN0aW9uICp0b19md19tZ210X2Nvbm5lY3Rpb24oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnYl9md19jb3JlICpmd19jb3JlID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gZndfY29yZS0+bWdtdF9jb25uZWN0aW9uOworfQorCitzdGF0aWMgaW50IGdiX2Z3X3NwaV9jb25uZWN0aW9uX2luaXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJaW50IHJldDsKKworCWlmICghY29ubmVjdGlvbikKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBnYl9jb25uZWN0aW9uX2VuYWJsZShjb25uZWN0aW9uKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2Jfc3BpbGliX21hc3Rlcl9pbml0KGNvbm5lY3Rpb24sICZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCQkgICAgc3BpbGliX29wcyk7CisJaWYgKHJldCkgeworCQlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2Z3X3NwaV9jb25uZWN0aW9uX2V4aXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJaWYgKCFjb25uZWN0aW9uKQorCQlyZXR1cm47CisKKwlnYl9zcGlsaWJfbWFzdGVyX2V4aXQoY29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgaW50IGdiX2Z3X2NvcmVfcHJvYmUoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlLAorCQkJICAgIGNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCAqaWQpCit7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9jcG9ydCAqY3BvcnRfZGVzYzsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfZndfY29yZSAqZndfY29yZTsKKwlpbnQgcmV0LCBpOworCXUxNiBjcG9ydF9pZDsKKwl1OCBwcm90b2NvbF9pZDsKKworCWZ3X2NvcmUgPSBremFsbG9jKHNpemVvZigqZndfY29yZSksIEdGUF9LRVJORUwpOworCWlmICghZndfY29yZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBQYXJzZSBDUG9ydHMgYW5kIGNyZWF0ZSBjb25uZWN0aW9ucyAqLworCWZvciAoaSA9IDA7IGkgPCBidW5kbGUtPm51bV9jcG9ydHM7IGkrKykgeworCQljcG9ydF9kZXNjID0gJmJ1bmRsZS0+Y3BvcnRfZGVzY1tpXTsKKwkJY3BvcnRfaWQgPSBsZTE2X3RvX2NwdShjcG9ydF9kZXNjLT5pZCk7CisJCXByb3RvY29sX2lkID0gY3BvcnRfZGVzYy0+cHJvdG9jb2xfaWQ7CisKKwkJc3dpdGNoIChwcm90b2NvbF9pZCkgeworCQljYXNlIEdSRVlCVVNfUFJPVE9DT0xfRldfTUFOQUdFTUVOVDoKKwkJCS8qIERpc2FsbG93IG11bHRpcGxlIEZpcm13YXJlIE1hbmFnZW1lbnQgQ1BvcnRzICovCisJCQlpZiAoZndfY29yZS0+bWdtdF9jb25uZWN0aW9uKSB7CisJCQkJZGV2X2VycigmYnVuZGxlLT5kZXYsCisJCQkJCSJtdWx0aXBsZSBtYW5hZ2VtZW50IENQb3J0cyBmb3VuZFxuIik7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycl9kZXN0cm95X2Nvbm5lY3Rpb25zOworCQkJfQorCisJCQljb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGUoYnVuZGxlLCBjcG9ydF9pZCwKKwkJCQkJCWdiX2Z3X21nbXRfcmVxdWVzdF9oYW5kbGVyKTsKKwkJCWlmIChJU19FUlIoY29ubmVjdGlvbikpIHsKKwkJCQlyZXQgPSBQVFJfRVJSKGNvbm5lY3Rpb24pOworCQkJCWRldl9lcnIoJmJ1bmRsZS0+ZGV2LAorCQkJCQkiZmFpbGVkIHRvIGNyZWF0ZSBtYW5hZ2VtZW50IGNvbm5lY3Rpb24gKCVkKVxuIiwKKwkJCQkJcmV0KTsKKwkJCQlnb3RvIGVycl9kZXN0cm95X2Nvbm5lY3Rpb25zOworCQkJfQorCisJCQlmd19jb3JlLT5tZ210X2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgR1JFWUJVU19QUk9UT0NPTF9GV19ET1dOTE9BRDoKKwkJCS8qIERpc2FsbG93IG11bHRpcGxlIEZpcm13YXJlIERvd25sb2FkIENQb3J0cyAqLworCQkJaWYgKGZ3X2NvcmUtPmRvd25sb2FkX2Nvbm5lY3Rpb24pIHsKKwkJCQlkZXZfZXJyKCZidW5kbGUtPmRldiwKKwkJCQkJIm11bHRpcGxlIGRvd25sb2FkIENQb3J0cyBmb3VuZFxuIik7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycl9kZXN0cm95X2Nvbm5lY3Rpb25zOworCQkJfQorCisJCQljb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGUoYnVuZGxlLCBjcG9ydF9pZCwKKwkJCQkJCWdiX2Z3X2Rvd25sb2FkX3JlcXVlc3RfaGFuZGxlcik7CisJCQlpZiAoSVNfRVJSKGNvbm5lY3Rpb24pKSB7CisJCQkJZGV2X2VycigmYnVuZGxlLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIGRvd25sb2FkIGNvbm5lY3Rpb24gKCVsZClcbiIsCisJCQkJCVBUUl9FUlIoY29ubmVjdGlvbikpOworCQkJfSBlbHNlIHsKKwkJCQlmd19jb3JlLT5kb3dubG9hZF9jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKwkJCX0KKworCQkJYnJlYWs7CisJCWNhc2UgR1JFWUJVU19QUk9UT0NPTF9TUEk6CisJCQkvKiBEaXNhbGxvdyBtdWx0aXBsZSBTUEkgQ1BvcnRzICovCisJCQlpZiAoZndfY29yZS0+c3BpX2Nvbm5lY3Rpb24pIHsKKwkJCQlkZXZfZXJyKCZidW5kbGUtPmRldiwKKwkJCQkJIm11bHRpcGxlIFNQSSBDUG9ydHMgZm91bmRcbiIpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBlcnJfZGVzdHJveV9jb25uZWN0aW9uczsKKwkJCX0KKworCQkJY29ubmVjdGlvbiA9IGdiX2Nvbm5lY3Rpb25fY3JlYXRlKGJ1bmRsZSwgY3BvcnRfaWQsCisJCQkJCQkJICBOVUxMKTsKKwkJCWlmIChJU19FUlIoY29ubmVjdGlvbikpIHsKKwkJCQlkZXZfZXJyKCZidW5kbGUtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgU1BJIGNvbm5lY3Rpb24gKCVsZClcbiIsCisJCQkJCVBUUl9FUlIoY29ubmVjdGlvbikpOworCQkJfSBlbHNlIHsKKwkJCQlmd19jb3JlLT5zcGlfY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJCQl9CisKKwkJCWJyZWFrOworCQljYXNlIEdSRVlCVVNfUFJPVE9DT0xfQVVUSEVOVElDQVRJT046CisJCQkvKiBEaXNhbGxvdyBtdWx0aXBsZSBDQVAgQ1BvcnRzICovCisJCQlpZiAoZndfY29yZS0+Y2FwX2Nvbm5lY3Rpb24pIHsKKwkJCQlkZXZfZXJyKCZidW5kbGUtPmRldiwgIm11bHRpcGxlIEF1dGhlbnRpY2F0aW9uIENQb3J0cyBmb3VuZFxuIik7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycl9kZXN0cm95X2Nvbm5lY3Rpb25zOworCQkJfQorCisJCQljb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGUoYnVuZGxlLCBjcG9ydF9pZCwKKwkJCQkJCQkgIE5VTEwpOworCQkJaWYgKElTX0VSUihjb25uZWN0aW9uKSkgeworCQkJCWRldl9lcnIoJmJ1bmRsZS0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBBdXRoZW50aWNhdGlvbiBjb25uZWN0aW9uICglbGQpXG4iLAorCQkJCQlQVFJfRVJSKGNvbm5lY3Rpb24pKTsKKwkJCX0gZWxzZSB7CisJCQkJZndfY29yZS0+Y2FwX2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCQkJfQorCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoJmJ1bmRsZS0+ZGV2LCAiaW52YWxpZCBwcm90b2NvbCBpZCAoMHglMDJ4KVxuIiwKKwkJCQlwcm90b2NvbF9pZCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfZGVzdHJveV9jb25uZWN0aW9uczsKKwkJfQorCX0KKworCS8qIEZpcm13YXJlIE1hbmFnZW1lbnQgY29ubmVjdGlvbiBpcyBtYW5kYXRvcnkgKi8KKwlpZiAoIWZ3X2NvcmUtPm1nbXRfY29ubmVjdGlvbikgeworCQlkZXZfZXJyKCZidW5kbGUtPmRldiwgIm1pc3NpbmcgbWFuYWdlbWVudCBjb25uZWN0aW9uXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZGVzdHJveV9jb25uZWN0aW9uczsKKwl9CisKKwlyZXQgPSBnYl9md19kb3dubG9hZF9jb25uZWN0aW9uX2luaXQoZndfY29yZS0+ZG93bmxvYWRfY29ubmVjdGlvbik7CisJaWYgKHJldCkgeworCQkvKiBXZSBtYXkgc3RpbGwgYmUgYWJsZSB0byB3b3JrIHdpdGggdGhlIEludGVyZmFjZSAqLworCQlkZXZfZXJyKCZidW5kbGUtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIGZpcm13YXJlIGRvd25sb2FkIGNvbm5lY3Rpb24sIGRpc2FibGUgaXQgKCVkKVxuIiwKKwkJCXJldCk7CisJCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShmd19jb3JlLT5kb3dubG9hZF9jb25uZWN0aW9uKTsKKwkJZndfY29yZS0+ZG93bmxvYWRfY29ubmVjdGlvbiA9IE5VTEw7CisJfQorCisJcmV0ID0gZ2JfZndfc3BpX2Nvbm5lY3Rpb25faW5pdChmd19jb3JlLT5zcGlfY29ubmVjdGlvbik7CisJaWYgKHJldCkgeworCQkvKiBXZSBtYXkgc3RpbGwgYmUgYWJsZSB0byB3b3JrIHdpdGggdGhlIEludGVyZmFjZSAqLworCQlkZXZfZXJyKCZidW5kbGUtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIFNQSSBjb25uZWN0aW9uLCBkaXNhYmxlIGl0ICglZClcbiIsCisJCQlyZXQpOworCQlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koZndfY29yZS0+c3BpX2Nvbm5lY3Rpb24pOworCQlmd19jb3JlLT5zcGlfY29ubmVjdGlvbiA9IE5VTEw7CisJfQorCisJcmV0ID0gZ2JfY2FwX2Nvbm5lY3Rpb25faW5pdChmd19jb3JlLT5jYXBfY29ubmVjdGlvbik7CisJaWYgKHJldCkgeworCQkvKiBXZSBtYXkgc3RpbGwgYmUgYWJsZSB0byB3b3JrIHdpdGggdGhlIEludGVyZmFjZSAqLworCQlkZXZfZXJyKCZidW5kbGUtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIENBUCBjb25uZWN0aW9uLCBkaXNhYmxlIGl0ICglZClcbiIsCisJCQlyZXQpOworCQlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koZndfY29yZS0+Y2FwX2Nvbm5lY3Rpb24pOworCQlmd19jb3JlLT5jYXBfY29ubmVjdGlvbiA9IE5VTEw7CisJfQorCisJcmV0ID0gZ2JfZndfbWdtdF9jb25uZWN0aW9uX2luaXQoZndfY29yZS0+bWdtdF9jb25uZWN0aW9uKTsKKwlpZiAocmV0KSB7CisJCS8qIFdlIG1heSBzdGlsbCBiZSBhYmxlIHRvIHdvcmsgd2l0aCB0aGUgSW50ZXJmYWNlICovCisJCWRldl9lcnIoJmJ1bmRsZS0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgZmlybXdhcmUgbWFuYWdlbWVudCBjb25uZWN0aW9uLCBkaXNhYmxlIGl0ICglZClcbiIsCisJCQlyZXQpOworCQlnb3RvIGVycl9leGl0X2Nvbm5lY3Rpb25zOworCX0KKworCWdyZXlidXNfc2V0X2RydmRhdGEoYnVuZGxlLCBmd19jb3JlKTsKKworCS8qIEZJWE1FOiBSZW1vdmUgdGhpcyBhZnRlciBTMiBMb2FkZXIgZ2V0cyBydW50aW1lIFBNIHN1cHBvcnQgKi8KKwlpZiAoIShidW5kbGUtPmludGYtPnF1aXJrcyAmIEdCX0lOVEVSRkFDRV9RVUlSS19OT19QTSkpCisJCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKKwlyZXR1cm4gMDsKKworZXJyX2V4aXRfY29ubmVjdGlvbnM6CisJZ2JfY2FwX2Nvbm5lY3Rpb25fZXhpdChmd19jb3JlLT5jYXBfY29ubmVjdGlvbik7CisJZ2JfZndfc3BpX2Nvbm5lY3Rpb25fZXhpdChmd19jb3JlLT5zcGlfY29ubmVjdGlvbik7CisJZ2JfZndfZG93bmxvYWRfY29ubmVjdGlvbl9leGl0KGZ3X2NvcmUtPmRvd25sb2FkX2Nvbm5lY3Rpb24pOworZXJyX2Rlc3Ryb3lfY29ubmVjdGlvbnM6CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGZ3X2NvcmUtPm1nbXRfY29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGZ3X2NvcmUtPmNhcF9jb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koZndfY29yZS0+c3BpX2Nvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShmd19jb3JlLT5kb3dubG9hZF9jb25uZWN0aW9uKTsKKwlrZnJlZShmd19jb3JlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2Z3X2NvcmVfZGlzY29ubmVjdChzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpCit7CisJc3RydWN0IGdiX2Z3X2NvcmUgKmZ3X2NvcmUgPSBncmV5YnVzX2dldF9kcnZkYXRhKGJ1bmRsZSk7CisJaW50IHJldDsKKworCS8qIEZJWE1FOiBSZW1vdmUgdGhpcyBhZnRlciBTMiBMb2FkZXIgZ2V0cyBydW50aW1lIFBNIHN1cHBvcnQgKi8KKwlpZiAoIShidW5kbGUtPmludGYtPnF1aXJrcyAmIEdCX0lOVEVSRkFDRV9RVUlSS19OT19QTSkpIHsKKwkJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCQlpZiAocmV0KQorCQkJZ2JfcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoYnVuZGxlKTsKKwl9CisKKwlnYl9md19tZ210X2Nvbm5lY3Rpb25fZXhpdChmd19jb3JlLT5tZ210X2Nvbm5lY3Rpb24pOworCWdiX2NhcF9jb25uZWN0aW9uX2V4aXQoZndfY29yZS0+Y2FwX2Nvbm5lY3Rpb24pOworCWdiX2Z3X3NwaV9jb25uZWN0aW9uX2V4aXQoZndfY29yZS0+c3BpX2Nvbm5lY3Rpb24pOworCWdiX2Z3X2Rvd25sb2FkX2Nvbm5lY3Rpb25fZXhpdChmd19jb3JlLT5kb3dubG9hZF9jb25uZWN0aW9uKTsKKworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShmd19jb3JlLT5tZ210X2Nvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShmd19jb3JlLT5jYXBfY29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGZ3X2NvcmUtPnNwaV9jb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koZndfY29yZS0+ZG93bmxvYWRfY29ubmVjdGlvbik7CisKKwlrZnJlZShmd19jb3JlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCBnYl9md19jb3JlX2lkX3RhYmxlW10gPSB7CisJeyBHUkVZQlVTX0RFVklDRV9DTEFTUyhHUkVZQlVTX0NMQVNTX0ZXX01BTkFHRU1FTlQpIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGdyZXlidXNfZHJpdmVyIGdiX2Z3X2NvcmVfZHJpdmVyID0geworCS5uYW1lCQk9ICJnYi1maXJtd2FyZSIsCisJLnByb2JlCQk9IGdiX2Z3X2NvcmVfcHJvYmUsCisJLmRpc2Nvbm5lY3QJPSBnYl9md19jb3JlX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gZ2JfZndfY29yZV9pZF90YWJsZSwKK307CisKK3N0YXRpYyBpbnQgZndfY29yZV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGZ3X21nbXRfaW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBmdy1tZ210IGNvcmUgKCVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBjYXBfaW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb21wb25lbnQgYXV0aGVudGljYXRpb24gY29yZSAoJWQpXG4iLAorCQkgICAgICAgcmV0KTsKKwkJZ290byBmd19tZ210X2V4aXQ7CisJfQorCisJcmV0ID0gZ3JleWJ1c19yZWdpc3RlcigmZ2JfZndfY29yZV9kcml2ZXIpOworCWlmIChyZXQpCisJCWdvdG8gY2FwX2V4aXQ7CisKKwlyZXR1cm4gMDsKKworY2FwX2V4aXQ6CisJY2FwX2V4aXQoKTsKK2Z3X21nbXRfZXhpdDoKKwlmd19tZ210X2V4aXQoKTsKKworCXJldHVybiByZXQ7Cit9Cittb2R1bGVfaW5pdChmd19jb3JlX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZndfY29yZV9leGl0KHZvaWQpCit7CisJZ3JleWJ1c19kZXJlZ2lzdGVyKCZnYl9md19jb3JlX2RyaXZlcik7CisJY2FwX2V4aXQoKTsKKwlmd19tZ210X2V4aXQoKTsKK30KK21vZHVsZV9leGl0KGZ3X2NvcmVfZXhpdCk7CisKK01PRFVMRV9BTElBUygiZ3JleWJ1czpmaXJtd2FyZSIpOworTU9EVUxFX0FVVEhPUigiVmlyZXNoIEt1bWFyIDx2aXJlc2gua3VtYXJAbGluYXJvLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR3JleWJ1cyBGaXJtd2FyZSBCdW5kbGUgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9mdy1kb3dubG9hZC5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZnctZG93bmxvYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDcyNDY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZnctZG93bmxvYWQuYwpAQCAtMCwwICsxLDQ2NSBAQAorLyoKKyAqIEdyZXlidXMgRmlybXdhcmUgRG93bmxvYWQgUHJvdG9jb2wgRHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNiBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgImZpcm13YXJlLmgiCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorCisvKiBFc3RpbWF0ZWQgbWluaW11bSBidWZmZXIgc2l6ZSwgYWN0dWFsIHNpemUgY2FuIGJlIHNtYWxsZXIgdGhhbiB0aGlzICovCisjZGVmaW5lIE1JTl9GRVRDSF9TSVpFCQk1MTIKKy8qIFRpbWVvdXQsIGluIGppZmZpZXMsIHdpdGhpbiB3aGljaCBmZXRjaCBvciByZWxlYXNlIGZpcm13YXJlIG11c3QgYmUgY2FsbGVkICovCisjZGVmaW5lIE5FWFRfUkVRX1RJTUVPVVRfSgltc2Vjc190b19qaWZmaWVzKDEwMDApCisKK3N0cnVjdCBmd19yZXF1ZXN0IHsKKwl1OAkJCWZpcm13YXJlX2lkOworCWJvb2wJCQlkaXNhYmxlZDsKKwlib29sCQkJdGltZWRvdXQ7CisJY2hhcgkJCW5hbWVbRldfTkFNRV9TSVpFXTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUJKmZ3OworCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKKworCXN0cnVjdCBkZWxheWVkX3dvcmsJZHdvcms7CisJLyogVGltZW91dCwgaW4gamlmZmllcywgd2l0aGluIHdoaWNoIHRoZSBmaXJtd2FyZSBzaGFsbCBkb3dubG9hZCAqLworCXVuc2lnbmVkIGxvbmcJCXJlbGVhc2VfdGltZW91dF9qOworCXN0cnVjdCBrcmVmCQlrcmVmOworCXN0cnVjdCBmd19kb3dubG9hZAkqZndfZG93bmxvYWQ7Cit9OworCitzdHJ1Y3QgZndfZG93bmxvYWQgeworCXN0cnVjdCBkZXZpY2UJCSpwYXJlbnQ7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24JKmNvbm5lY3Rpb247CisJc3RydWN0IGxpc3RfaGVhZAlmd19yZXF1ZXN0czsKKwlzdHJ1Y3QgaWRhCQlpZF9tYXA7CisJc3RydWN0IG11dGV4CQltdXRleDsKK307CisKK3N0YXRpYyB2b2lkIGZ3X3JlcV9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBmd19yZXF1ZXN0ICpmd19yZXEgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGZ3X3JlcXVlc3QsIGtyZWYpOworCisJZGV2X2RiZyhmd19yZXEtPmZ3X2Rvd25sb2FkLT5wYXJlbnQsICJmaXJtd2FyZSAlcyByZWxlYXNlZFxuIiwKKwkJZndfcmVxLT5uYW1lKTsKKworCXJlbGVhc2VfZmlybXdhcmUoZndfcmVxLT5mdyk7CisKKwkvKgorCSAqIFRoZSByZXF1ZXN0IHRpbWVkIG91dCBhbmQgdGhlIG1vZHVsZSBtYXkgc2VuZCBhIGZldGNoLWZ3IG9yCisJICogcmVsZWFzZS1mdyByZXF1ZXN0IGxhdGVyLiBMZXRzIGJsb2NrIHRoZSBpZCB3ZSBhbGxvY2F0ZWQgZm9yIHRoaXMKKwkgKiByZXF1ZXN0LCBzbyB0aGF0IHRoZSBBUCBkb2Vzbid0IHJlZmVyIHRvIGEgbGF0ZXIgZnctcmVxdWVzdCAod2l0aAorCSAqIHNhbWUgZmlybXdhcmVfaWQpIGZvciB0aGUgb2xkIHRpbWVkb3V0IGZ3LXJlcXVlc3QuCisJICoKKwkgKiBOT1RFOgorCSAqCisJICogVGhpcyBhbHNvIG1lYW5zIHRoYXQgYWZ0ZXIgMjU1IHRpbWVvdXRzIHdlIHdpbGwgZmFpbCB0byBzZXJ2aWNlIG5ldworCSAqIGZpcm13YXJlIGRvd25sb2Fkcy4gQnV0IHdoYXQgZWxzZSBjYW4gd2UgZG8gaW4gdGhhdCBjYXNlIGFueXdheT8gTGV0cworCSAqIGp1c3QgaG9wZSB0aGF0IGl0IG5ldmVyIGhhcHBlbnMuCisJICovCisJaWYgKCFmd19yZXEtPnRpbWVkb3V0KQorCQlpZGFfc2ltcGxlX3JlbW92ZSgmZndfcmVxLT5md19kb3dubG9hZC0+aWRfbWFwLAorCQkJCSAgZndfcmVxLT5maXJtd2FyZV9pZCk7CisKKwlrZnJlZShmd19yZXEpOworfQorCisvKgorICogSW5jb21pbmcgcmVxdWVzdHMgYXJlIHNlcmlhbGl6ZWQgZm9yIGEgY29ubmVjdGlvbiwgYW5kIHRoZSBvbmx5IHJhY2UgcG9zc2libGUKKyAqIGlzIGJldHdlZW4gdGhlIHRpbWVvdXQgaGFuZGxlciBmcmVlaW5nIHRoaXMgYW5kIGFuIGluY29taW5nIHJlcXVlc3QuCisgKgorICogVGhlIG9wZXJhdGlvbnMgb24gdGhlIGZ3LXJlcXVlc3QgbGlzdCBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBtdXRleCBhbmQKKyAqIGdldF9md19yZXEoKSBpbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgYmVmb3JlIHJldHVybmluZyBhIGZ3X3JlcSBwb2ludGVyCisgKiB0byB0aGUgdXNlcnMuCisgKgorICogZnJlZV9maXJtd2FyZSgpIGFsc28gdGFrZXMgdGhlIG11dGV4IHdoaWxlIHJlbW92aW5nIGFuIGVudHJ5IGZyb20gdGhlIGxpc3QsCisgKiBpdCBndWFyYW50ZWVzIHRoYXQgZXZlcnkgdXNlciBvZiBmd19yZXEgaGFzIHRha2VuIGEga3JlZi1yZWZlcmVuY2UgYnkgbm93IGFuZAorICogd2Ugd291bGRuJ3QgaGF2ZSBhbnkgbmV3IHVzZXJzLgorICoKKyAqIE9uY2UgdGhlIGxhc3QgdXNlciBkcm9wcyB0aGUgcmVmZXJlbmNlLCB0aGUgZndfcmVxIHN0cnVjdHVyZSBpcyBmcmVlZC4KKyAqLworc3RhdGljIHZvaWQgcHV0X2Z3X3JlcShzdHJ1Y3QgZndfcmVxdWVzdCAqZndfcmVxKQoreworCWtyZWZfcHV0KCZmd19yZXEtPmtyZWYsIGZ3X3JlcV9yZWxlYXNlKTsKK30KKworLyogQ2FsbGVyIG11c3QgY2FsbCBwdXRfZndfcmVxKCkgYWZ0ZXIgdXNpbmcgc3RydWN0IGZ3X3JlcXVlc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgZndfcmVxdWVzdCAqZ2V0X2Z3X3JlcShzdHJ1Y3QgZndfZG93bmxvYWQgKmZ3X2Rvd25sb2FkLAorCQkJCSAgICAgdTggZmlybXdhcmVfaWQpCit7CisJc3RydWN0IGZ3X3JlcXVlc3QgKmZ3X3JlcTsKKworCW11dGV4X2xvY2soJmZ3X2Rvd25sb2FkLT5tdXRleCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZ3X3JlcSwgJmZ3X2Rvd25sb2FkLT5md19yZXF1ZXN0cywgbm9kZSkgeworCQlpZiAoZndfcmVxLT5maXJtd2FyZV9pZCA9PSBmaXJtd2FyZV9pZCkgeworCQkJa3JlZl9nZXQoJmZ3X3JlcS0+a3JlZik7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCX0KKworCWZ3X3JlcSA9IE5VTEw7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJmZ3X2Rvd25sb2FkLT5tdXRleCk7CisKKwlyZXR1cm4gZndfcmVxOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2Zpcm13YXJlKHN0cnVjdCBmd19kb3dubG9hZCAqZndfZG93bmxvYWQsCisJCQkgIHN0cnVjdCBmd19yZXF1ZXN0ICpmd19yZXEpCit7CisJLyogQWxyZWFkeSBkaXNhYmxlZCBmcm9tIHRpbWVvdXQgaGFuZGxlcnMgKi8KKwlpZiAoZndfcmVxLT5kaXNhYmxlZCkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmZndfZG93bmxvYWQtPm11dGV4KTsKKwlsaXN0X2RlbCgmZndfcmVxLT5ub2RlKTsKKwltdXRleF91bmxvY2soJmZ3X2Rvd25sb2FkLT5tdXRleCk7CisKKwlmd19yZXEtPmRpc2FibGVkID0gdHJ1ZTsKKwlwdXRfZndfcmVxKGZ3X3JlcSk7Cit9CisKK3N0YXRpYyB2b2lkIGZ3X3JlcXVlc3RfdGltZWRvdXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOworCXN0cnVjdCBmd19yZXF1ZXN0ICpmd19yZXEgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBmd19yZXF1ZXN0LCBkd29yayk7CisJc3RydWN0IGZ3X2Rvd25sb2FkICpmd19kb3dubG9hZCA9IGZ3X3JlcS0+ZndfZG93bmxvYWQ7CisKKwlkZXZfZXJyKGZ3X2Rvd25sb2FkLT5wYXJlbnQsCisJCSJUaW1lZCBvdXQgd2FpdGluZyBmb3IgZmV0Y2ggLyByZWxlYXNlIGZpcm13YXJlIHJlcXVlc3RzOiAldVxuIiwKKwkJZndfcmVxLT5maXJtd2FyZV9pZCk7CisKKwlmd19yZXEtPnRpbWVkb3V0ID0gdHJ1ZTsKKwlmcmVlX2Zpcm13YXJlKGZ3X2Rvd25sb2FkLCBmd19yZXEpOworfQorCitzdGF0aWMgaW50IGV4Y2VlZHNfcmVsZWFzZV90aW1lb3V0KHN0cnVjdCBmd19yZXF1ZXN0ICpmd19yZXEpCit7CisJc3RydWN0IGZ3X2Rvd25sb2FkICpmd19kb3dubG9hZCA9IGZ3X3JlcS0+ZndfZG93bmxvYWQ7CisKKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywgZndfcmVxLT5yZWxlYXNlX3RpbWVvdXRfaikpCisJCXJldHVybiAwOworCisJZGV2X2Vycihmd19kb3dubG9hZC0+cGFyZW50LAorCQkiRmlybXdhcmUgZG93bmxvYWQgZGlkbid0IGZpbmlzaCBpbiB0aW1lLCBhYm9ydDogJWRcbiIsCisJCWZ3X3JlcS0+ZmlybXdhcmVfaWQpOworCisJZndfcmVxLT50aW1lZG91dCA9IHRydWU7CisJZnJlZV9maXJtd2FyZShmd19kb3dubG9hZCwgZndfcmVxKTsKKworCXJldHVybiAtRVRJTUVET1VUOworfQorCisvKiBUaGlzIHJldHVybnMgcGF0aCBvZiB0aGUgZmlybXdhcmUgYmxvYiBvbiB0aGUgZGlzayAqLworc3RhdGljIHN0cnVjdCBmd19yZXF1ZXN0ICpmaW5kX2Zpcm13YXJlKHN0cnVjdCBmd19kb3dubG9hZCAqZndfZG93bmxvYWQsCisJCQkJCWNvbnN0IGNoYXIgKnRhZykKK3sKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gZndfZG93bmxvYWQtPmNvbm5lY3Rpb24tPmJ1bmRsZS0+aW50ZjsKKwlzdHJ1Y3QgZndfcmVxdWVzdCAqZndfcmVxOworCWludCByZXQsIHJlcV9jb3VudDsKKworCWZ3X3JlcSA9IGt6YWxsb2Moc2l6ZW9mKCpmd19yZXEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZ3X3JlcSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwkvKiBBbGxvY2F0ZSBpZHMgZnJvbSAxIHRvIDI1NSAodTgtbWF4KSwgMCBpcyBhbiBpbnZhbGlkIGlkICovCisJcmV0ID0gaWRhX3NpbXBsZV9nZXQoJmZ3X2Rvd25sb2FkLT5pZF9tYXAsIDEsIDI1NiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihmd19kb3dubG9hZC0+cGFyZW50LAorCQkJImZhaWxlZCB0byBhbGxvY2F0ZSBmaXJtd2FyZSBpZCAoJWQpXG4iLCByZXQpOworCQlnb3RvIGVycl9mcmVlX3JlcTsKKwl9CisJZndfcmVxLT5maXJtd2FyZV9pZCA9IHJldDsKKworCXNucHJpbnRmKGZ3X3JlcS0+bmFtZSwgc2l6ZW9mKGZ3X3JlcS0+bmFtZSksCisJCSBGV19OQU1FX1BSRUZJWCAiJTA4eF8lMDh4XyUwOHhfJTA4eF8lcy50ZnRmIiwKKwkJIGludGYtPmRkYmwxX21hbnVmYWN0dXJlcl9pZCwgaW50Zi0+ZGRibDFfcHJvZHVjdF9pZCwKKwkJIGludGYtPnZlbmRvcl9pZCwgaW50Zi0+cHJvZHVjdF9pZCwgdGFnKTsKKworCWRldl9pbmZvKGZ3X2Rvd25sb2FkLT5wYXJlbnQsICJSZXF1ZXN0ZWQgZmlybXdhcmUgcGFja2FnZSAnJXMnXG4iLAorCQkgZndfcmVxLT5uYW1lKTsKKworCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3X3JlcS0+ZncsIGZ3X3JlcS0+bmFtZSwgZndfZG93bmxvYWQtPnBhcmVudCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGZ3X2Rvd25sb2FkLT5wYXJlbnQsCisJCQkiZmlybXdhcmUgcmVxdWVzdCBmYWlsZWQgZm9yICVzICglZClcbiIsIGZ3X3JlcS0+bmFtZSwKKwkJCXJldCk7CisJCWdvdG8gZXJyX2ZyZWVfaWQ7CisJfQorCisJZndfcmVxLT5md19kb3dubG9hZCA9IGZ3X2Rvd25sb2FkOworCWtyZWZfaW5pdCgmZndfcmVxLT5rcmVmKTsKKworCW11dGV4X2xvY2soJmZ3X2Rvd25sb2FkLT5tdXRleCk7CisJbGlzdF9hZGQoJmZ3X3JlcS0+bm9kZSwgJmZ3X2Rvd25sb2FkLT5md19yZXF1ZXN0cyk7CisJbXV0ZXhfdW5sb2NrKCZmd19kb3dubG9hZC0+bXV0ZXgpOworCisJLyogVGltZW91dCwgaW4gamlmZmllcywgd2l0aGluIHdoaWNoIGZpcm13YXJlIHNob3VsZCBnZXQgbG9hZGVkICovCisJcmVxX2NvdW50ID0gRElWX1JPVU5EX1VQKGZ3X3JlcS0+ZnctPnNpemUsIE1JTl9GRVRDSF9TSVpFKTsKKwlmd19yZXEtPnJlbGVhc2VfdGltZW91dF9qID0gamlmZmllcyArIHJlcV9jb3VudCAqIE5FWFRfUkVRX1RJTUVPVVRfSjsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZmd19yZXEtPmR3b3JrLCBmd19yZXF1ZXN0X3RpbWVkb3V0KTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmZ3X3JlcS0+ZHdvcmssIE5FWFRfUkVRX1RJTUVPVVRfSik7CisKKwlyZXR1cm4gZndfcmVxOworCitlcnJfZnJlZV9pZDoKKwlpZGFfc2ltcGxlX3JlbW92ZSgmZndfZG93bmxvYWQtPmlkX21hcCwgZndfcmVxLT5maXJtd2FyZV9pZCk7CitlcnJfZnJlZV9yZXE6CisJa2ZyZWUoZndfcmVxKTsKKworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CisKK3N0YXRpYyBpbnQgZndfZG93bmxvYWRfZmluZF9maXJtd2FyZShzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wLT5jb25uZWN0aW9uOworCXN0cnVjdCBmd19kb3dubG9hZCAqZndfZG93bmxvYWQgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKGNvbm5lY3Rpb24pOworCXN0cnVjdCBnYl9md19kb3dubG9hZF9maW5kX2Zpcm13YXJlX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdiX2Z3X2Rvd25sb2FkX2ZpbmRfZmlybXdhcmVfcmVzcG9uc2UgKnJlc3BvbnNlOworCXN0cnVjdCBmd19yZXF1ZXN0ICpmd19yZXE7CisJY29uc3QgY2hhciAqdGFnOworCisJaWYgKG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUgIT0gc2l6ZW9mKCpyZXF1ZXN0KSkgeworCQlkZXZfZXJyKGZ3X2Rvd25sb2FkLT5wYXJlbnQsCisJCQkiaWxsZWdhbCBzaXplIG9mIGZpbmQgZmlybXdhcmUgcmVxdWVzdCAoJXp1ICE9ICV6dSlcbiIsCisJCQlvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplLCBzaXplb2YoKnJlcXVlc3QpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVxdWVzdCA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCXRhZyA9IChjb25zdCBjaGFyICopcmVxdWVzdC0+ZmlybXdhcmVfdGFnOworCisJLyogZmlybXdhcmVfdGFnIG11c3QgYmUgbnVsbC10ZXJtaW5hdGVkICovCisJaWYgKHN0cm5sZW4odGFnLCBHQl9GSVJNV0FSRV9UQUdfTUFYX1NJWkUpID09IEdCX0ZJUk1XQVJFX1RBR19NQVhfU0laRSkgeworCQlkZXZfZXJyKGZ3X2Rvd25sb2FkLT5wYXJlbnQsCisJCQkiZmlybXdhcmUtdGFnIGlzIG5vdCBudWxsLXRlcm1pbmF0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmd19yZXEgPSBmaW5kX2Zpcm13YXJlKGZ3X2Rvd25sb2FkLCB0YWcpOworCWlmIChJU19FUlIoZndfcmVxKSkKKwkJcmV0dXJuIFBUUl9FUlIoZndfcmVxKTsKKworCWlmICghZ2Jfb3BlcmF0aW9uX3Jlc3BvbnNlX2FsbG9jKG9wLCBzaXplb2YoKnJlc3BvbnNlKSwgR0ZQX0tFUk5FTCkpIHsKKwkJZGV2X2Vycihmd19kb3dubG9hZC0+cGFyZW50LCAiZXJyb3IgYWxsb2NhdGluZyByZXNwb25zZVxuIik7CisJCWZyZWVfZmlybXdhcmUoZndfZG93bmxvYWQsIGZ3X3JlcSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJlc3BvbnNlID0gb3AtPnJlc3BvbnNlLT5wYXlsb2FkOworCXJlc3BvbnNlLT5maXJtd2FyZV9pZCA9IGZ3X3JlcS0+ZmlybXdhcmVfaWQ7CisJcmVzcG9uc2UtPnNpemUgPSBjcHVfdG9fbGUzMihmd19yZXEtPmZ3LT5zaXplKTsKKworCWRldl9kYmcoZndfZG93bmxvYWQtPnBhcmVudCwKKwkJImZpcm13YXJlIHNpemUgaXMgJXp1IGJ5dGVzXG4iLCBmd19yZXEtPmZ3LT5zaXplKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ3X2Rvd25sb2FkX2ZldGNoX2Zpcm13YXJlKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3AtPmNvbm5lY3Rpb247CisJc3RydWN0IGZ3X2Rvd25sb2FkICpmd19kb3dubG9hZCA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoY29ubmVjdGlvbik7CisJc3RydWN0IGdiX2Z3X2Rvd25sb2FkX2ZldGNoX2Zpcm13YXJlX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdiX2Z3X2Rvd25sb2FkX2ZldGNoX2Zpcm13YXJlX3Jlc3BvbnNlICpyZXNwb25zZTsKKwlzdHJ1Y3QgZndfcmVxdWVzdCAqZndfcmVxOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJdW5zaWduZWQgaW50IG9mZnNldCwgc2l6ZTsKKwl1OCBmaXJtd2FyZV9pZDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplICE9IHNpemVvZigqcmVxdWVzdCkpIHsKKwkJZGV2X2Vycihmd19kb3dubG9hZC0+cGFyZW50LAorCQkJIklsbGVnYWwgc2l6ZSBvZiBmZXRjaCBmaXJtd2FyZSByZXF1ZXN0ICglenUgJXp1KVxuIiwKKwkJCW9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUsIHNpemVvZigqcmVxdWVzdCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXF1ZXN0ID0gb3AtPnJlcXVlc3QtPnBheWxvYWQ7CisJb2Zmc2V0ID0gbGUzMl90b19jcHUocmVxdWVzdC0+b2Zmc2V0KTsKKwlzaXplID0gbGUzMl90b19jcHUocmVxdWVzdC0+c2l6ZSk7CisJZmlybXdhcmVfaWQgPSByZXF1ZXN0LT5maXJtd2FyZV9pZDsKKworCWZ3X3JlcSA9IGdldF9md19yZXEoZndfZG93bmxvYWQsIGZpcm13YXJlX2lkKTsKKwlpZiAoIWZ3X3JlcSkgeworCQlkZXZfZXJyKGZ3X2Rvd25sb2FkLT5wYXJlbnQsCisJCQkiZmlybXdhcmUgbm90IGF2YWlsYWJsZSBmb3IgaWQ6ICUwMnVcbiIsIGZpcm13YXJlX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogTWFrZSBzdXJlIHdvcmsgaGFuZGxlciBpc24ndCBydW5uaW5nIGluIHBhcmFsbGVsICovCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZmd19yZXEtPmR3b3JrKTsKKworCS8qIFdlIHRpbWVkLW91dCBiZWZvcmUgcmVhY2hpbmcgaGVyZSA/ICovCisJaWYgKGZ3X3JlcS0+ZGlzYWJsZWQpIHsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBwdXRfZnc7CisJfQorCisJLyoKKwkgKiBGaXJtd2FyZSBkb3dubG9hZCBtdXN0IGZpbmlzaCB3aXRoaW4gYSBsaW1pdGVkIHRpbWUgaW50ZXJ2YWwuIElmIGl0CisJICogZG9lc24ndCwgdGhlbiB3ZSBtaWdodCBoYXZlIGEgYnVnZ3kgTW9kdWxlIG9uIHRoZSBvdGhlciBzaWRlLiBBYm9ydAorCSAqIGRvd25sb2FkLgorCSAqLworCXJldCA9IGV4Y2VlZHNfcmVsZWFzZV90aW1lb3V0KGZ3X3JlcSk7CisJaWYgKHJldCkKKwkJZ290byBwdXRfZnc7CisKKwlmdyA9IGZ3X3JlcS0+Znc7CisKKwlpZiAob2Zmc2V0ID49IGZ3LT5zaXplIHx8IHNpemUgPiBmdy0+c2l6ZSAtIG9mZnNldCkgeworCQlkZXZfZXJyKGZ3X2Rvd25sb2FkLT5wYXJlbnQsCisJCQkiYmFkIGZldGNoIGZpcm13YXJlIHJlcXVlc3QgKG9mZnMgPSAldSwgc2l6ZSA9ICV1KVxuIiwKKwkJCW9mZnNldCwgc2l6ZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gcHV0X2Z3OworCX0KKworCWlmICghZ2Jfb3BlcmF0aW9uX3Jlc3BvbnNlX2FsbG9jKG9wLCBzaXplb2YoKnJlc3BvbnNlKSArIHNpemUsCisJCQkJCSBHRlBfS0VSTkVMKSkgeworCQlkZXZfZXJyKGZ3X2Rvd25sb2FkLT5wYXJlbnQsCisJCQkiZXJyb3IgYWxsb2NhdGluZyBmZXRjaCBmaXJtd2FyZSByZXNwb25zZVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gcHV0X2Z3OworCX0KKworCXJlc3BvbnNlID0gb3AtPnJlc3BvbnNlLT5wYXlsb2FkOworCW1lbWNweShyZXNwb25zZS0+ZGF0YSwgZnctPmRhdGEgKyBvZmZzZXQsIHNpemUpOworCisJZGV2X2RiZyhmd19kb3dubG9hZC0+cGFyZW50LAorCQkicmVzcG9uZGluZyB3aXRoIGZpcm13YXJlIChvZmZzID0gJXUsIHNpemUgPSAldSlcbiIsIG9mZnNldCwKKwkJc2l6ZSk7CisKKwkvKiBSZWZyZXNoIHRpbWVvdXQgKi8KKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmZ3X3JlcS0+ZHdvcmssIE5FWFRfUkVRX1RJTUVPVVRfSik7CisKK3B1dF9mdzoKKwlwdXRfZndfcmVxKGZ3X3JlcSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZ3X2Rvd25sb2FkX3JlbGVhc2VfZmlybXdhcmUoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZndfZG93bmxvYWQgKmZ3X2Rvd25sb2FkID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2JfZndfZG93bmxvYWRfcmVsZWFzZV9maXJtd2FyZV9yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBmd19yZXF1ZXN0ICpmd19yZXE7CisJdTggZmlybXdhcmVfaWQ7CisKKwlpZiAob3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSAhPSBzaXplb2YoKnJlcXVlc3QpKSB7CisJCWRldl9lcnIoZndfZG93bmxvYWQtPnBhcmVudCwKKwkJCSJJbGxlZ2FsIHNpemUgb2YgcmVsZWFzZSBmaXJtd2FyZSByZXF1ZXN0ICglenUgJXp1KVxuIiwKKwkJCW9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUsIHNpemVvZigqcmVxdWVzdCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXF1ZXN0ID0gb3AtPnJlcXVlc3QtPnBheWxvYWQ7CisJZmlybXdhcmVfaWQgPSByZXF1ZXN0LT5maXJtd2FyZV9pZDsKKworCWZ3X3JlcSA9IGdldF9md19yZXEoZndfZG93bmxvYWQsIGZpcm13YXJlX2lkKTsKKwlpZiAoIWZ3X3JlcSkgeworCQlkZXZfZXJyKGZ3X2Rvd25sb2FkLT5wYXJlbnQsCisJCQkiZmlybXdhcmUgbm90IGF2YWlsYWJsZSBmb3IgaWQ6ICUwMnVcbiIsIGZpcm13YXJlX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZmd19yZXEtPmR3b3JrKTsKKworCWZyZWVfZmlybXdhcmUoZndfZG93bmxvYWQsIGZ3X3JlcSk7CisJcHV0X2Z3X3JlcShmd19yZXEpOworCisJZGV2X2RiZyhmd19kb3dubG9hZC0+cGFyZW50LCAicmVsZWFzZSBmaXJtd2FyZVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdiX2Z3X2Rvd25sb2FkX3JlcXVlc3RfaGFuZGxlcihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwl1OCB0eXBlID0gb3AtPnR5cGU7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdCX0ZXX0RPV05MT0FEX1RZUEVfRklORF9GSVJNV0FSRToKKwkJcmV0dXJuIGZ3X2Rvd25sb2FkX2ZpbmRfZmlybXdhcmUob3ApOworCWNhc2UgR0JfRldfRE9XTkxPQURfVFlQRV9GRVRDSF9GSVJNV0FSRToKKwkJcmV0dXJuIGZ3X2Rvd25sb2FkX2ZldGNoX2Zpcm13YXJlKG9wKTsKKwljYXNlIEdCX0ZXX0RPV05MT0FEX1RZUEVfUkVMRUFTRV9GSVJNV0FSRToKKwkJcmV0dXJuIGZ3X2Rvd25sb2FkX3JlbGVhc2VfZmlybXdhcmUob3ApOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJm9wLT5jb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCSJ1bnN1cHBvcnRlZCByZXF1ZXN0OiAldVxuIiwgdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworaW50IGdiX2Z3X2Rvd25sb2FkX2Nvbm5lY3Rpb25faW5pdChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgZndfZG93bmxvYWQgKmZ3X2Rvd25sb2FkOworCWludCByZXQ7CisKKwlpZiAoIWNvbm5lY3Rpb24pCisJCXJldHVybiAwOworCisJZndfZG93bmxvYWQgPSBremFsbG9jKHNpemVvZigqZndfZG93bmxvYWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZ3X2Rvd25sb2FkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZ3X2Rvd25sb2FkLT5wYXJlbnQgPSAmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXY7CisJSU5JVF9MSVNUX0hFQUQoJmZ3X2Rvd25sb2FkLT5md19yZXF1ZXN0cyk7CisJaWRhX2luaXQoJmZ3X2Rvd25sb2FkLT5pZF9tYXApOworCWdiX2Nvbm5lY3Rpb25fc2V0X2RhdGEoY29ubmVjdGlvbiwgZndfZG93bmxvYWQpOworCWZ3X2Rvd25sb2FkLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKwltdXRleF9pbml0KCZmd19kb3dubG9hZC0+bXV0ZXgpOworCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZGVzdHJveV9pZF9tYXA7CisKKwlyZXR1cm4gMDsKKworZXJyX2Rlc3Ryb3lfaWRfbWFwOgorCWlkYV9kZXN0cm95KCZmd19kb3dubG9hZC0+aWRfbWFwKTsKKwlrZnJlZShmd19kb3dubG9hZCk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGdiX2Z3X2Rvd25sb2FkX2Nvbm5lY3Rpb25fZXhpdChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgZndfZG93bmxvYWQgKmZ3X2Rvd25sb2FkOworCXN0cnVjdCBmd19yZXF1ZXN0ICpmd19yZXEsICp0bXA7CisKKwlpZiAoIWNvbm5lY3Rpb24pCisJCXJldHVybjsKKworCWZ3X2Rvd25sb2FkID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoZndfZG93bmxvYWQtPmNvbm5lY3Rpb24pOworCisJLyoKKwkgKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHJlZmVyZW5jZSB0byB0aGUgcGVuZGluZyByZXF1ZXN0cywgYmVmb3JlIHRoZXkKKwkgKiBhcmUgZnJlZWQgZnJvbSB0aGUgdGltZW91dCBoYW5kbGVyLgorCSAqLworCW11dGV4X2xvY2soJmZ3X2Rvd25sb2FkLT5tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmd19yZXEsICZmd19kb3dubG9hZC0+ZndfcmVxdWVzdHMsIG5vZGUpCisJCWtyZWZfZ2V0KCZmd19yZXEtPmtyZWYpOworCW11dGV4X3VubG9jaygmZndfZG93bmxvYWQtPm11dGV4KTsKKworCS8qIFJlbGVhc2UgcGVuZGluZyBmaXJtd2FyZSBwYWNrYWdlcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmd19yZXEsIHRtcCwgJmZ3X2Rvd25sb2FkLT5md19yZXF1ZXN0cywgbm9kZSkgeworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmZ3X3JlcS0+ZHdvcmspOworCQlmcmVlX2Zpcm13YXJlKGZ3X2Rvd25sb2FkLCBmd19yZXEpOworCQlwdXRfZndfcmVxKGZ3X3JlcSk7CisJfQorCisJaWRhX2Rlc3Ryb3koJmZ3X2Rvd25sb2FkLT5pZF9tYXApOworCWtmcmVlKGZ3X2Rvd25sb2FkKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Z3LW1hbmFnZW1lbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Z3LW1hbmFnZW1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2Q2Y2YwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZnctbWFuYWdlbWVudC5jCkBAIC0wLDAgKzEsNzIxIEBACisvKgorICogR3JleWJ1cyBGaXJtd2FyZSBNYW5hZ2VtZW50IFByb3RvY29sIERyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTYgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJmaXJtd2FyZS5oIgorI2luY2x1ZGUgImdyZXlidXNfZmlybXdhcmUuaCIKKyNpbmNsdWRlICJncmV5YnVzLmgiCisKKyNkZWZpbmUgRldfTUdNVF9USU1FT1VUX01TCQkxMDAwCisKK3N0cnVjdCBmd19tZ210IHsKKwlzdHJ1Y3QgZGV2aWNlCQkqcGFyZW50OworCXN0cnVjdCBnYl9jb25uZWN0aW9uCSpjb25uZWN0aW9uOworCXN0cnVjdCBrcmVmCQlrcmVmOworCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKKworCS8qIENvbW1vbiBpZC1tYXAgZm9yIGludGVyZmFjZSBhbmQgYmFja2VuZCBmaXJtd2FyZSByZXF1ZXN0cyAqLworCXN0cnVjdCBpZGEJCWlkX21hcDsKKwlzdHJ1Y3QgbXV0ZXgJCW11dGV4OworCXN0cnVjdCBjb21wbGV0aW9uCWNvbXBsZXRpb247CisJc3RydWN0IGNkZXYJCWNkZXY7CisJc3RydWN0IGRldmljZQkJKmNsYXNzX2RldmljZTsKKwlkZXZfdAkJCWRldl9udW07CisJdW5zaWduZWQgaW50CQl0aW1lb3V0X2ppZmZpZXM7CisJYm9vbAkJCWRpc2FibGVkOyAvKiBjb25uZWN0aW9uIGdldHRpbmcgZGlzYWJsZWQgKi8KKworCS8qIEludGVyZmFjZSBGaXJtd2FyZSBzcGVjaWZpYyBmaWVsZHMgKi8KKwlib29sCQkJbW9kZV9zd2l0Y2hfc3RhcnRlZDsKKwlib29sCQkJaW50Zl9md19sb2FkZWQ7CisJdTgJCQlpbnRmX2Z3X3JlcXVlc3RfaWQ7CisJdTgJCQlpbnRmX2Z3X3N0YXR1czsKKwl1MTYJCQlpbnRmX2Z3X21ham9yOworCXUxNgkJCWludGZfZndfbWlub3I7CisKKwkvKiBCYWNrZW5kIEZpcm13YXJlIHNwZWNpZmljIGZpZWxkcyAqLworCXU4CQkJYmFja2VuZF9md19yZXF1ZXN0X2lkOworCXU4CQkJYmFja2VuZF9md19zdGF0dXM7Cit9OworCisvKgorICogTnVtYmVyIG9mIG1pbm9yIGRldmljZXMgdGhpcyBkcml2ZXIgc3VwcG9ydHMuCisgKiBUaGVyZSB3aWxsIGJlIGV4YWN0bHkgb25lIHJlcXVpcmVkIHBlciBJbnRlcmZhY2UuCisgKi8KKyNkZWZpbmUgTlVNX01JTk9SUwkJVThfTUFYCisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKmZ3X21nbXRfY2xhc3M7CitzdGF0aWMgZGV2X3QgZndfbWdtdF9kZXZfbnVtOworc3RhdGljIERFRklORV9JREEoZndfbWdtdF9taW5vcnNfbWFwKTsKK3N0YXRpYyBMSVNUX0hFQUQoZndfbWdtdF9saXN0KTsKK3N0YXRpYyBERUZJTkVfTVVURVgobGlzdF9tdXRleCk7CisKK3N0YXRpYyB2b2lkIGZ3X21nbXRfa3JlZl9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBmd19tZ210ICpmd19tZ210ID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBmd19tZ210LCBrcmVmKTsKKworCWlkYV9kZXN0cm95KCZmd19tZ210LT5pZF9tYXApOworCWtmcmVlKGZ3X21nbXQpOworfQorCisvKgorICogQWxsIHVzZXJzIG9mIGZ3X21nbXQgdGFrZSBhIHJlZmVyZW5jZSAoZnJvbSB3aXRoaW4gbGlzdF9tdXRleCBsb2NrKSwgYmVmb3JlCisgKiB0aGV5IGdldCBhIHBvaW50ZXIgdG8gcGxheSB3aXRoLiBBbmQgdGhlIHN0cnVjdHVyZSB3aWxsIGJlIGZyZWVkIG9ubHkgYWZ0ZXIKKyAqIHRoZSBsYXN0IHVzZXIgaGFzIHB1dCB0aGUgcmVmZXJlbmNlIHRvIGl0LgorICovCitzdGF0aWMgdm9pZCBwdXRfZndfbWdtdChzdHJ1Y3QgZndfbWdtdCAqZndfbWdtdCkKK3sKKwlrcmVmX3B1dCgmZndfbWdtdC0+a3JlZiwgZndfbWdtdF9rcmVmX3JlbGVhc2UpOworfQorCisvKiBDYWxsZXIgbXVzdCBjYWxsIHB1dF9md19tZ210KCkgYWZ0ZXIgdXNpbmcgc3RydWN0IGZ3X21nbXQgKi8KK3N0YXRpYyBzdHJ1Y3QgZndfbWdtdCAqZ2V0X2Z3X21nbXQoc3RydWN0IGNkZXYgKmNkZXYpCit7CisJc3RydWN0IGZ3X21nbXQgKmZ3X21nbXQ7CisKKwltdXRleF9sb2NrKCZsaXN0X211dGV4KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZndfbWdtdCwgJmZ3X21nbXRfbGlzdCwgbm9kZSkgeworCQlpZiAoJmZ3X21nbXQtPmNkZXYgPT0gY2RldikgeworCQkJa3JlZl9nZXQoJmZ3X21nbXQtPmtyZWYpOworCQkJZ290byB1bmxvY2s7CisJCX0KKwl9CisKKwlmd19tZ210ID0gTlVMTDsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmbGlzdF9tdXRleCk7CisKKwlyZXR1cm4gZndfbWdtdDsKK30KKworc3RhdGljIGludCBmd19tZ210X2ludGVyZmFjZV9md192ZXJzaW9uX29wZXJhdGlvbihzdHJ1Y3QgZndfbWdtdCAqZndfbWdtdCwKKwkJc3RydWN0IGZ3X21nbXRfaW9jX2dldF9pbnRmX3ZlcnNpb24gKmZ3X2luZm8pCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBmd19tZ210LT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9md19tZ210X2ludGVyZmFjZV9md192ZXJzaW9uX3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLAorCQkJCUdCX0ZXX01HTVRfVFlQRV9JTlRFUkZBQ0VfRldfVkVSU0lPTiwgTlVMTCwgMCwKKwkJCQkmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsCisJCQkiZmFpbGVkIHRvIGdldCBpbnRlcmZhY2UgZmlybXdhcmUgdmVyc2lvbiAoJWQpXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZ3X2luZm8tPm1ham9yID0gbGUxNl90b19jcHUocmVzcG9uc2UubWFqb3IpOworCWZ3X2luZm8tPm1pbm9yID0gbGUxNl90b19jcHUocmVzcG9uc2UubWlub3IpOworCisJc3RybmNweShmd19pbmZvLT5maXJtd2FyZV90YWcsIHJlc3BvbnNlLmZpcm13YXJlX3RhZywKKwkJR0JfRklSTVdBUkVfVEFHX01BWF9TSVpFKTsKKworCS8qCisJICogVGhlIGZpcm13YXJlLXRhZyBzaG91bGQgYmUgTlVMTCB0ZXJtaW5hdGVkLCBvdGhlcndpc2UgdGhyb3cgZXJyb3IgYnV0CisJICogZG9uJ3QgZmFpbC4KKwkgKi8KKwlpZiAoZndfaW5mby0+ZmlybXdhcmVfdGFnW0dCX0ZJUk1XQVJFX1RBR19NQVhfU0laRSAtIDFdICE9ICdcMCcpIHsKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsCisJCQkiZnctdmVyc2lvbjogZmlybXdhcmUtdGFnIGlzIG5vdCBOVUxMIHRlcm1pbmF0ZWRcbiIpOworCQlmd19pbmZvLT5maXJtd2FyZV90YWdbR0JfRklSTVdBUkVfVEFHX01BWF9TSVpFIC0gMV0gPSAnXDAnOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ3X21nbXRfbG9hZF9hbmRfdmFsaWRhdGVfb3BlcmF0aW9uKHN0cnVjdCBmd19tZ210ICpmd19tZ210LAorCQkJCQkgICAgICAgdTggbG9hZF9tZXRob2QsIGNvbnN0IGNoYXIgKnRhZykKK3sKKwlzdHJ1Y3QgZ2JfZndfbWdtdF9sb2FkX2FuZF92YWxpZGF0ZV9md19yZXF1ZXN0IHJlcXVlc3Q7CisJaW50IHJldDsKKworCWlmIChsb2FkX21ldGhvZCAhPSBHQl9GV19MT0FEX01FVEhPRF9VTklQUk8gJiYKKwkgICAgbG9hZF9tZXRob2QgIT0gR0JfRldfTE9BRF9NRVRIT0RfSU5URVJOQUwpIHsKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsCisJCQkiaW52YWxpZCBsb2FkLW1ldGhvZCAoJWQpXG4iLCBsb2FkX21ldGhvZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcXVlc3QubG9hZF9tZXRob2QgPSBsb2FkX21ldGhvZDsKKwlzdHJuY3B5KHJlcXVlc3QuZmlybXdhcmVfdGFnLCB0YWcsIEdCX0ZJUk1XQVJFX1RBR19NQVhfU0laRSk7CisKKwkvKgorCSAqIFRoZSBmaXJtd2FyZS10YWcgc2hvdWxkIGJlIE5VTEwgdGVybWluYXRlZCwgb3RoZXJ3aXNlIHRocm93IGVycm9yIGFuZAorCSAqIGZhaWwuCisJICovCisJaWYgKHJlcXVlc3QuZmlybXdhcmVfdGFnW0dCX0ZJUk1XQVJFX1RBR19NQVhfU0laRSAtIDFdICE9ICdcMCcpIHsKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsICJsb2FkLWFuZC12YWxpZGF0ZTogZmlybXdhcmUtdGFnIGlzIG5vdCBOVUxMIHRlcm1pbmF0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBpZHMgZnJvbSAxIHRvIDI1NSAodTgtbWF4KSwgMCBpcyBhbiBpbnZhbGlkIGlkICovCisJcmV0ID0gaWRhX3NpbXBsZV9nZXQoJmZ3X21nbXQtPmlkX21hcCwgMSwgMjU2LCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGZ3X21nbXQtPnBhcmVudCwgImZhaWxlZCB0byBhbGxvY2F0ZSByZXF1ZXN0IGlkICglZClcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZ3X21nbXQtPmludGZfZndfcmVxdWVzdF9pZCA9IHJldDsKKwlmd19tZ210LT5pbnRmX2Z3X2xvYWRlZCA9IGZhbHNlOworCXJlcXVlc3QucmVxdWVzdF9pZCA9IHJldDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGZ3X21nbXQtPmNvbm5lY3Rpb24sCisJCQkJR0JfRldfTUdNVF9UWVBFX0xPQURfQU5EX1ZBTElEQVRFX0ZXLCAmcmVxdWVzdCwKKwkJCQlzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworCWlmIChyZXQpIHsKKwkJaWRhX3NpbXBsZV9yZW1vdmUoJmZ3X21nbXQtPmlkX21hcCwKKwkJCQkgIGZ3X21nbXQtPmludGZfZndfcmVxdWVzdF9pZCk7CisJCWZ3X21nbXQtPmludGZfZndfcmVxdWVzdF9pZCA9IDA7CisJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LAorCQkJImxvYWQgYW5kIHZhbGlkYXRlIGZpcm13YXJlIHJlcXVlc3QgZmFpbGVkICglZClcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ3X21nbXRfaW50ZXJmYWNlX2Z3X2xvYWRlZF9vcGVyYXRpb24oc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZndfbWdtdCAqZndfbWdtdCA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoY29ubmVjdGlvbik7CisJc3RydWN0IGdiX2Z3X21nbXRfbG9hZGVkX2Z3X3JlcXVlc3QgKnJlcXVlc3Q7CisKKwkvKiBObyBwZW5kaW5nIGxvYWQgYW5kIHZhbGlkYXRlIHJlcXVlc3QgPyAqLworCWlmICghZndfbWdtdC0+aW50Zl9md19yZXF1ZXN0X2lkKSB7CisJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LAorCQkJInVuZXhwZWN0ZWQgZmlybXdhcmUgbG9hZGVkIHJlcXVlc3QgcmVjZWl2ZWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAob3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSAhPSBzaXplb2YoKnJlcXVlc3QpKSB7CisJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LCAiaWxsZWdhbCBzaXplIG9mIGZpcm13YXJlIGxvYWRlZCByZXF1ZXN0ICglenUgIT0gJXp1KVxuIiwKKwkJCW9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUsIHNpemVvZigqcmVxdWVzdCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXF1ZXN0ID0gb3AtPnJlcXVlc3QtPnBheWxvYWQ7CisKKwkvKiBJbnZhbGlkIHJlcXVlc3QtaWQgPyAqLworCWlmIChyZXF1ZXN0LT5yZXF1ZXN0X2lkICE9IGZ3X21nbXQtPmludGZfZndfcmVxdWVzdF9pZCkgeworCQlkZXZfZXJyKGZ3X21nbXQtPnBhcmVudCwgImludmFsaWQgcmVxdWVzdCBpZCBmb3IgZmlybXdhcmUgbG9hZGVkIHJlcXVlc3QgKCUwMnUgIT0gJTAydSlcbiIsCisJCQlmd19tZ210LT5pbnRmX2Z3X3JlcXVlc3RfaWQsIHJlcXVlc3QtPnJlcXVlc3RfaWQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZGFfc2ltcGxlX3JlbW92ZSgmZndfbWdtdC0+aWRfbWFwLCBmd19tZ210LT5pbnRmX2Z3X3JlcXVlc3RfaWQpOworCWZ3X21nbXQtPmludGZfZndfcmVxdWVzdF9pZCA9IDA7CisJZndfbWdtdC0+aW50Zl9md19zdGF0dXMgPSByZXF1ZXN0LT5zdGF0dXM7CisJZndfbWdtdC0+aW50Zl9md19tYWpvciA9IGxlMTZfdG9fY3B1KHJlcXVlc3QtPm1ham9yKTsKKwlmd19tZ210LT5pbnRmX2Z3X21pbm9yID0gbGUxNl90b19jcHUocmVxdWVzdC0+bWlub3IpOworCisJaWYgKGZ3X21nbXQtPmludGZfZndfc3RhdHVzID09IEdCX0ZXX0xPQURfU1RBVFVTX0ZBSUxFRCkKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsCisJCQkiZmFpbGVkIHRvIGxvYWQgaW50ZXJmYWNlIGZpcm13YXJlLCBzdGF0dXM6JTAyeFxuIiwKKwkJCWZ3X21nbXQtPmludGZfZndfc3RhdHVzKTsKKwllbHNlIGlmIChmd19tZ210LT5pbnRmX2Z3X3N0YXR1cyA9PSBHQl9GV19MT0FEX1NUQVRVU19WQUxJREFUSU9OX0ZBSUxFRCkKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsCisJCQkiZmFpbGVkIHRvIHZhbGlkYXRlIGludGVyZmFjZSBmaXJtd2FyZSwgc3RhdHVzOiUwMnhcbiIsCisJCQlmd19tZ210LT5pbnRmX2Z3X3N0YXR1cyk7CisJZWxzZQorCQlmd19tZ210LT5pbnRmX2Z3X2xvYWRlZCA9IHRydWU7CisKKwljb21wbGV0ZSgmZndfbWdtdC0+Y29tcGxldGlvbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmd19tZ210X2JhY2tlbmRfZndfdmVyc2lvbl9vcGVyYXRpb24oc3RydWN0IGZ3X21nbXQgKmZ3X21nbXQsCisJCXN0cnVjdCBmd19tZ210X2lvY19nZXRfYmFja2VuZF92ZXJzaW9uICpmd19pbmZvKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZndfbWdtdC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfZndfbWdtdF9iYWNrZW5kX2Z3X3ZlcnNpb25fcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9md19tZ210X2JhY2tlbmRfZndfdmVyc2lvbl9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCisJc3RybmNweShyZXF1ZXN0LmZpcm13YXJlX3RhZywgZndfaW5mby0+ZmlybXdhcmVfdGFnLAorCQlHQl9GSVJNV0FSRV9UQUdfTUFYX1NJWkUpOworCisJLyoKKwkgKiBUaGUgZmlybXdhcmUtdGFnIHNob3VsZCBiZSBOVUxMIHRlcm1pbmF0ZWQsIG90aGVyd2lzZSB0aHJvdyBlcnJvciBhbmQKKwkgKiBmYWlsLgorCSAqLworCWlmIChyZXF1ZXN0LmZpcm13YXJlX3RhZ1tHQl9GSVJNV0FSRV9UQUdfTUFYX1NJWkUgLSAxXSAhPSAnXDAnKSB7CisJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LCAiYmFja2VuZC12ZXJzaW9uOiBmaXJtd2FyZS10YWcgaXMgbm90IE5VTEwgdGVybWluYXRlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sCisJCQkJR0JfRldfTUdNVF9UWVBFX0JBQ0tFTkRfRldfVkVSU0lPTiwgJnJlcXVlc3QsCisJCQkJc2l6ZW9mKHJlcXVlc3QpLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsICJmYWlsZWQgdG8gZ2V0IHZlcnNpb24gb2YgJXMgYmFja2VuZCBmaXJtd2FyZSAoJWQpXG4iLAorCQkJZndfaW5mby0+ZmlybXdhcmVfdGFnLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZ3X2luZm8tPnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1czsKKworCS8qIFJlc2V0IHZlcnNpb24gYXMgdGhhdCBzaG91bGQgYmUgbm9uLXplcm8gb25seSBmb3Igc3VjY2VzcyBjYXNlICovCisJZndfaW5mby0+bWFqb3IgPSAwOworCWZ3X2luZm8tPm1pbm9yID0gMDsKKworCXN3aXRjaCAoZndfaW5mby0+c3RhdHVzKSB7CisJY2FzZSBHQl9GV19CQUNLRU5EX1ZFUlNJT05fU1RBVFVTX1NVQ0NFU1M6CisJCWZ3X2luZm8tPm1ham9yID0gbGUxNl90b19jcHUocmVzcG9uc2UubWFqb3IpOworCQlmd19pbmZvLT5taW5vciA9IGxlMTZfdG9fY3B1KHJlc3BvbnNlLm1pbm9yKTsKKwkJYnJlYWs7CisJY2FzZSBHQl9GV19CQUNLRU5EX1ZFUlNJT05fU1RBVFVTX05PVF9BVkFJTEFCTEU6CisJY2FzZSBHQl9GV19CQUNLRU5EX1ZFUlNJT05fU1RBVFVTX1JFVFJZOgorCQlicmVhazsKKwljYXNlIEdCX0ZXX0JBQ0tFTkRfVkVSU0lPTl9TVEFUVVNfTk9UX1NVUFBPUlRFRDoKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsCisJCQkiRmlybXdhcmUgd2l0aCB0YWcgJXMgaXMgbm90IHN1cHBvcnRlZCBieSBJbnRlcmZhY2VcbiIsCisJCQlmd19pbmZvLT5maXJtd2FyZV90YWcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGZ3X21nbXQtPnBhcmVudCwgIkludmFsaWQgc3RhdHVzIHJlY2VpdmVkOiAldVxuIiwKKwkJCWZ3X2luZm8tPnN0YXR1cyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZndfbWdtdF9iYWNrZW5kX2Z3X3VwZGF0ZV9vcGVyYXRpb24oc3RydWN0IGZ3X21nbXQgKmZ3X21nbXQsCisJCQkJCSAgICAgICBjaGFyICp0YWcpCit7CisJc3RydWN0IGdiX2Z3X21nbXRfYmFja2VuZF9md191cGRhdGVfcmVxdWVzdCByZXF1ZXN0OworCWludCByZXQ7CisKKwlzdHJuY3B5KHJlcXVlc3QuZmlybXdhcmVfdGFnLCB0YWcsIEdCX0ZJUk1XQVJFX1RBR19NQVhfU0laRSk7CisKKwkvKgorCSAqIFRoZSBmaXJtd2FyZS10YWcgc2hvdWxkIGJlIE5VTEwgdGVybWluYXRlZCwgb3RoZXJ3aXNlIHRocm93IGVycm9yIGFuZAorCSAqIGZhaWwuCisJICovCisJaWYgKHJlcXVlc3QuZmlybXdhcmVfdGFnW0dCX0ZJUk1XQVJFX1RBR19NQVhfU0laRSAtIDFdICE9ICdcMCcpIHsKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsICJiYWNrZW5kLXVwZGF0ZTogZmlybXdhcmUtdGFnIGlzIG5vdCBOVUxMIHRlcm1pbmF0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBpZHMgZnJvbSAxIHRvIDI1NSAodTgtbWF4KSwgMCBpcyBhbiBpbnZhbGlkIGlkICovCisJcmV0ID0gaWRhX3NpbXBsZV9nZXQoJmZ3X21nbXQtPmlkX21hcCwgMSwgMjU2LCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGZ3X21nbXQtPnBhcmVudCwgImZhaWxlZCB0byBhbGxvY2F0ZSByZXF1ZXN0IGlkICglZClcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZ3X21nbXQtPmJhY2tlbmRfZndfcmVxdWVzdF9pZCA9IHJldDsKKwlyZXF1ZXN0LnJlcXVlc3RfaWQgPSByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhmd19tZ210LT5jb25uZWN0aW9uLAorCQkJCUdCX0ZXX01HTVRfVFlQRV9CQUNLRU5EX0ZXX1VQREFURSwgJnJlcXVlc3QsCisJCQkJc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKKwlpZiAocmV0KSB7CisJCWlkYV9zaW1wbGVfcmVtb3ZlKCZmd19tZ210LT5pZF9tYXAsCisJCQkJICBmd19tZ210LT5iYWNrZW5kX2Z3X3JlcXVlc3RfaWQpOworCQlmd19tZ210LT5iYWNrZW5kX2Z3X3JlcXVlc3RfaWQgPSAwOworCQlkZXZfZXJyKGZ3X21nbXQtPnBhcmVudCwKKwkJCSJiYWNrZW5kICVzIGZpcm13YXJlIHVwZGF0ZSByZXF1ZXN0IGZhaWxlZCAoJWQpXG4iLCB0YWcsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ3X21nbXRfYmFja2VuZF9md191cGRhdGVkX29wZXJhdGlvbihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wLT5jb25uZWN0aW9uOworCXN0cnVjdCBmd19tZ210ICpmd19tZ210ID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2JfZndfbWdtdF9iYWNrZW5kX2Z3X3VwZGF0ZWRfcmVxdWVzdCAqcmVxdWVzdDsKKworCS8qIE5vIHBlbmRpbmcgbG9hZCBhbmQgdmFsaWRhdGUgcmVxdWVzdCA/ICovCisJaWYgKCFmd19tZ210LT5iYWNrZW5kX2Z3X3JlcXVlc3RfaWQpIHsKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsICJ1bmV4cGVjdGVkIGJhY2tlbmQgZmlybXdhcmUgdXBkYXRlZCByZXF1ZXN0IHJlY2VpdmVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUgIT0gc2l6ZW9mKCpyZXF1ZXN0KSkgeworCQlkZXZfZXJyKGZ3X21nbXQtPnBhcmVudCwgImlsbGVnYWwgc2l6ZSBvZiBiYWNrZW5kIGZpcm13YXJlIHVwZGF0ZWQgcmVxdWVzdCAoJXp1ICE9ICV6dSlcbiIsCisJCQlvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplLCBzaXplb2YoKnJlcXVlc3QpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVxdWVzdCA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCisJLyogSW52YWxpZCByZXF1ZXN0LWlkID8gKi8KKwlpZiAocmVxdWVzdC0+cmVxdWVzdF9pZCAhPSBmd19tZ210LT5iYWNrZW5kX2Z3X3JlcXVlc3RfaWQpIHsKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsICJpbnZhbGlkIHJlcXVlc3QgaWQgZm9yIGJhY2tlbmQgZmlybXdhcmUgdXBkYXRlZCByZXF1ZXN0ICglMDJ1ICE9ICUwMnUpXG4iLAorCQkJZndfbWdtdC0+YmFja2VuZF9md19yZXF1ZXN0X2lkLCByZXF1ZXN0LT5yZXF1ZXN0X2lkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWRhX3NpbXBsZV9yZW1vdmUoJmZ3X21nbXQtPmlkX21hcCwgZndfbWdtdC0+YmFja2VuZF9md19yZXF1ZXN0X2lkKTsKKwlmd19tZ210LT5iYWNrZW5kX2Z3X3JlcXVlc3RfaWQgPSAwOworCWZ3X21nbXQtPmJhY2tlbmRfZndfc3RhdHVzID0gcmVxdWVzdC0+c3RhdHVzOworCisJaWYgKChmd19tZ210LT5iYWNrZW5kX2Z3X3N0YXR1cyAhPSBHQl9GV19CQUNLRU5EX0ZXX1NUQVRVU19TVUNDRVNTKSAmJgorCSAgICAoZndfbWdtdC0+YmFja2VuZF9md19zdGF0dXMgIT0gR0JfRldfQkFDS0VORF9GV19TVEFUVVNfUkVUUlkpKQorCQlkZXZfZXJyKGZ3X21nbXQtPnBhcmVudCwKKwkJCSJmYWlsZWQgdG8gbG9hZCBiYWNrZW5kIGZpcm13YXJlOiAlMDJ4XG4iLAorCQkJZndfbWdtdC0+YmFja2VuZF9md19zdGF0dXMpOworCisJY29tcGxldGUoJmZ3X21nbXQtPmNvbXBsZXRpb24pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXIgZGV2aWNlIGZvcHMgKi8KKworc3RhdGljIGludCBmd19tZ210X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGZ3X21nbXQgKmZ3X21nbXQgPSBnZXRfZndfbWdtdChpbm9kZS0+aV9jZGV2KTsKKworCS8qIGZ3X21nbXQgc3RydWN0dXJlIGNhbid0IGdldCBmcmVlZCB1bnRpbCBmaWxlIGRlc2NyaXB0b3IgaXMgY2xvc2VkICovCisJaWYgKGZ3X21nbXQpIHsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZndfbWdtdDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgZndfbWdtdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBmd19tZ210ICpmd19tZ210ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcHV0X2Z3X21nbXQoZndfbWdtdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZndfbWdtdF9pb2N0bChzdHJ1Y3QgZndfbWdtdCAqZndfbWdtdCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSB2b2lkIF9fdXNlciAqYnVmKQoreworCXN0cnVjdCBmd19tZ210X2lvY19nZXRfaW50Zl92ZXJzaW9uIGludGZfZndfaW5mbzsKKwlzdHJ1Y3QgZndfbWdtdF9pb2NfZ2V0X2JhY2tlbmRfdmVyc2lvbiBiYWNrZW5kX2Z3X2luZm87CisJc3RydWN0IGZ3X21nbXRfaW9jX2ludGZfbG9hZF9hbmRfdmFsaWRhdGUgaW50Zl9sb2FkOworCXN0cnVjdCBmd19tZ210X2lvY19iYWNrZW5kX2Z3X3VwZGF0ZSBiYWNrZW5kX3VwZGF0ZTsKKwl1bnNpZ25lZCBpbnQgdGltZW91dDsKKwlpbnQgcmV0OworCisJLyogUmVqZWN0IGFueSBvcGVyYXRpb25zIGFmdGVyIG1vZGUtc3dpdGNoIGhhcyBzdGFydGVkICovCisJaWYgKGZ3X21nbXQtPm1vZGVfc3dpdGNoX3N0YXJ0ZWQpCisJCXJldHVybiAtRUJVU1k7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRldfTUdNVF9JT0NfR0VUX0lOVEZfRlc6CisJCXJldCA9IGZ3X21nbXRfaW50ZXJmYWNlX2Z3X3ZlcnNpb25fb3BlcmF0aW9uKGZ3X21nbXQsCisJCQkJCQkJICAgICAmaW50Zl9md19pbmZvKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsICZpbnRmX2Z3X2luZm8sIHNpemVvZihpbnRmX2Z3X2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCWNhc2UgRldfTUdNVF9JT0NfR0VUX0JBQ0tFTkRfRlc6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmYmFja2VuZF9md19pbmZvLCBidWYsCisJCQkJICAgc2l6ZW9mKGJhY2tlbmRfZndfaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0ID0gZndfbWdtdF9iYWNrZW5kX2Z3X3ZlcnNpb25fb3BlcmF0aW9uKGZ3X21nbXQsCisJCQkJCQkJICAgJmJhY2tlbmRfZndfaW5mbyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmYmFja2VuZF9md19pbmZvLAorCQkJCSBzaXplb2YoYmFja2VuZF9md19pbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gMDsKKwljYXNlIEZXX01HTVRfSU9DX0lOVEZfTE9BRF9BTkRfVkFMSURBVEU6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmaW50Zl9sb2FkLCBidWYsIHNpemVvZihpbnRmX2xvYWQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldCA9IGZ3X21nbXRfbG9hZF9hbmRfdmFsaWRhdGVfb3BlcmF0aW9uKGZ3X21nbXQsCisJCQkJaW50Zl9sb2FkLmxvYWRfbWV0aG9kLCBpbnRmX2xvYWQuZmlybXdhcmVfdGFnKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmZ3X21nbXQtPmNvbXBsZXRpb24sCisJCQkJCQkgZndfbWdtdC0+dGltZW91dF9qaWZmaWVzKSkgeworCQkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsICJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgZmlybXdhcmUgbG9hZCBhbmQgdmFsaWRhdGlvbiB0byBmaW5pc2hcbiIpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKworCQlpbnRmX2xvYWQuc3RhdHVzID0gZndfbWdtdC0+aW50Zl9md19zdGF0dXM7CisJCWludGZfbG9hZC5tYWpvciA9IGZ3X21nbXQtPmludGZfZndfbWFqb3I7CisJCWludGZfbG9hZC5taW5vciA9IGZ3X21nbXQtPmludGZfZndfbWlub3I7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsICZpbnRmX2xvYWQsIHNpemVvZihpbnRmX2xvYWQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCWNhc2UgRldfTUdNVF9JT0NfSU5URl9CQUNLRU5EX0ZXX1VQREFURToKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZiYWNrZW5kX3VwZGF0ZSwgYnVmLAorCQkJCSAgIHNpemVvZihiYWNrZW5kX3VwZGF0ZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0ID0gZndfbWdtdF9iYWNrZW5kX2Z3X3VwZGF0ZV9vcGVyYXRpb24oZndfbWdtdCwKKwkJCQliYWNrZW5kX3VwZGF0ZS5maXJtd2FyZV90YWcpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZndfbWdtdC0+Y29tcGxldGlvbiwKKwkJCQkJCSBmd19tZ210LT50aW1lb3V0X2ppZmZpZXMpKSB7CisJCQlkZXZfZXJyKGZ3X21nbXQtPnBhcmVudCwgInRpbWVkIG91dCB3YWl0aW5nIGZvciBiYWNrZW5kIGZpcm13YXJlIHVwZGF0ZSB0byBmaW5pc2hcbiIpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKworCQliYWNrZW5kX3VwZGF0ZS5zdGF0dXMgPSBmd19tZ210LT5iYWNrZW5kX2Z3X3N0YXR1czsKKworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJmJhY2tlbmRfdXBkYXRlLCBzaXplb2YoYmFja2VuZF91cGRhdGUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCWNhc2UgRldfTUdNVF9JT0NfU0VUX1RJTUVPVVRfTVM6CisJCWlmIChnZXRfdXNlcih0aW1lb3V0LCAodW5zaWduZWQgaW50IF9fdXNlciAqKWJ1ZikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoIXRpbWVvdXQpIHsKKwkJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LCAidGltZW91dCBjYW4ndCBiZSB6ZXJvXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZndfbWdtdC0+dGltZW91dF9qaWZmaWVzID0gbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KTsKKworCQlyZXR1cm4gMDsKKwljYXNlIEZXX01HTVRfSU9DX01PREVfU1dJVENIOgorCQlpZiAoIWZ3X21nbXQtPmludGZfZndfbG9hZGVkKSB7CisJCQlkZXZfZXJyKGZ3X21nbXQtPnBhcmVudCwKKwkJCQkiRmlybXdhcmUgbm90IGxvYWRlZCBmb3IgbW9kZS1zd2l0Y2hcbiIpOworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCisJCS8qCisJCSAqIERpc2FsbG93IG5ldyBpb2N0bHMgYXMgdGhlIGZ3LWNvcmUgYnVuZGxlIGRyaXZlciBpcyBnb2luZyB0bworCQkgKiBnZXQgZGlzY29ubmVjdGVkIHNvb24gYW5kIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIHdpbGwgZ2V0CisJCSAqIHJlbW92ZWQuCisJCSAqLworCQlmd19tZ210LT5tb2RlX3N3aXRjaF9zdGFydGVkID0gdHJ1ZTsKKworCQlyZXQgPSBnYl9pbnRlcmZhY2VfcmVxdWVzdF9tb2RlX3N3aXRjaChmd19tZ210LT5jb25uZWN0aW9uLT5pbnRmKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsICJNb2RlLXN3aXRjaCBmYWlsZWQ6ICVkXG4iLAorCQkJCXJldCk7CisJCQlmd19tZ210LT5tb2RlX3N3aXRjaF9zdGFydGVkID0gZmFsc2U7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorfQorCitzdGF0aWMgbG9uZyBmd19tZ210X2lvY3RsX3VubG9ja2VkKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBmd19tZ210ICpmd19tZ210ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IGZ3X21nbXQtPmNvbm5lY3Rpb24tPmJ1bmRsZTsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworCS8qCisJICogU2VyaWFsaXplIGlvY3Rscy4KKwkgKgorCSAqIFdlIGRvbid0IHdhbnQgdGhlIHVzZXIgdG8gZG8gZmV3IG9wZXJhdGlvbnMgaW4gcGFyYWxsZWwuIEZvciBleGFtcGxlLAorCSAqIHVwZGF0aW5nIEludGVyZmFjZSBmaXJtd2FyZSBpbiBwYXJhbGxlbCBmb3IgdGhlIHNhbWUgSW50ZXJmYWNlLiBUaGVyZQorCSAqIGlzIG5vIG5lZWQgdG8gZG8gdGhpbmdzIGluIHBhcmFsbGVsIGZvciBzcGVlZCBhbmQgd2UgY2FuIGF2b2lkIGhhdmluZworCSAqIGNvbXBsaWNhdGVkIGNvZGUgZm9yIG5vdy4KKwkgKgorCSAqIFRoaXMgaXMgYWxzbyB1c2VkIHRvIHByb3RlY3QgLT5kaXNhYmxlZCwgd2hpY2ggaXMgdXNlZCB0byBjaGVjayBpZgorCSAqIHRoZSBjb25uZWN0aW9uIGlzIGdldHRpbmcgZGlzY29ubmVjdGVkLCBzbyB0aGF0IHdlIGRvbid0IHN0YXJ0IGFueQorCSAqIG5ldyBvcGVyYXRpb25zLgorCSAqLworCW11dGV4X2xvY2soJmZ3X21nbXQtPm11dGV4KTsKKwlpZiAoIWZ3X21nbXQtPmRpc2FibGVkKSB7CisJCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXJldCA9IGZ3X21nbXRfaW9jdGwoZndfbWdtdCwgY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworCQkJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmZ3X21nbXQtPm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ3X21nbXRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gZndfbWdtdF9vcGVuLAorCS5yZWxlYXNlCT0gZndfbWdtdF9yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bAk9IGZ3X21nbXRfaW9jdGxfdW5sb2NrZWQsCit9OworCitpbnQgZ2JfZndfbWdtdF9yZXF1ZXN0X2hhbmRsZXIoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJdTggdHlwZSA9IG9wLT50eXBlOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBHQl9GV19NR01UX1RZUEVfTE9BREVEX0ZXOgorCQlyZXR1cm4gZndfbWdtdF9pbnRlcmZhY2VfZndfbG9hZGVkX29wZXJhdGlvbihvcCk7CisJY2FzZSBHQl9GV19NR01UX1RZUEVfQkFDS0VORF9GV19VUERBVEVEOgorCQlyZXR1cm4gZndfbWdtdF9iYWNrZW5kX2Z3X3VwZGF0ZWRfb3BlcmF0aW9uKG9wKTsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZvcC0+Y29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkidW5zdXBwb3J0ZWQgcmVxdWVzdDogJXVcbiIsIHR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK2ludCBnYl9md19tZ210X2Nvbm5lY3Rpb25faW5pdChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgZndfbWdtdCAqZndfbWdtdDsKKwlpbnQgcmV0LCBtaW5vcjsKKworCWlmICghY29ubmVjdGlvbikKKwkJcmV0dXJuIDA7CisKKwlmd19tZ210ID0ga3phbGxvYyhzaXplb2YoKmZ3X21nbXQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZ3X21nbXQpCisJCXJldHVybiAtRU5PTUVNOworCisJZndfbWdtdC0+cGFyZW50ID0gJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2OworCWZ3X21nbXQtPnRpbWVvdXRfamlmZmllcyA9IG1zZWNzX3RvX2ppZmZpZXMoRldfTUdNVF9USU1FT1VUX01TKTsKKwlmd19tZ210LT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKworCWdiX2Nvbm5lY3Rpb25fc2V0X2RhdGEoY29ubmVjdGlvbiwgZndfbWdtdCk7CisJaW5pdF9jb21wbGV0aW9uKCZmd19tZ210LT5jb21wbGV0aW9uKTsKKwlpZGFfaW5pdCgmZndfbWdtdC0+aWRfbWFwKTsKKwltdXRleF9pbml0KCZmd19tZ210LT5tdXRleCk7CisJa3JlZl9pbml0KCZmd19tZ210LT5rcmVmKTsKKworCW11dGV4X2xvY2soJmxpc3RfbXV0ZXgpOworCWxpc3RfYWRkKCZmd19tZ210LT5ub2RlLCAmZndfbWdtdF9saXN0KTsKKwltdXRleF91bmxvY2soJmxpc3RfbXV0ZXgpOworCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfbGlzdF9kZWw7CisKKwltaW5vciA9IGlkYV9zaW1wbGVfZ2V0KCZmd19tZ210X21pbm9yc19tYXAsIDAsIE5VTV9NSU5PUlMsIEdGUF9LRVJORUwpOworCWlmIChtaW5vciA8IDApIHsKKwkJcmV0ID0gbWlub3I7CisJCWdvdG8gZXJyX2Nvbm5lY3Rpb25fZGlzYWJsZTsKKwl9CisKKwkvKiBBZGQgYSBjaGFyIGRldmljZSB0byBhbGxvdyB1c2Vyc3BhY2UgdG8gaW50ZXJhY3Qgd2l0aCBmdy1tZ210ICovCisJZndfbWdtdC0+ZGV2X251bSA9IE1LREVWKE1BSk9SKGZ3X21nbXRfZGV2X251bSksIG1pbm9yKTsKKwljZGV2X2luaXQoJmZ3X21nbXQtPmNkZXYsICZmd19tZ210X2ZvcHMpOworCisJcmV0ID0gY2Rldl9hZGQoJmZ3X21nbXQtPmNkZXYsIGZ3X21nbXQtPmRldl9udW0sIDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3JlbW92ZV9pZGE7CisKKwkvKiBBZGQgYSBzb2Z0IGxpbmsgdG8gdGhlIHByZXZpb3VzbHkgYWRkZWQgY2hhci1kZXYgd2l0aGluIHRoZSBidW5kbGUgKi8KKwlmd19tZ210LT5jbGFzc19kZXZpY2UgPSBkZXZpY2VfY3JlYXRlKGZ3X21nbXRfY2xhc3MsIGZ3X21nbXQtPnBhcmVudCwKKwkJCQkJICAgICAgZndfbWdtdC0+ZGV2X251bSwgTlVMTCwKKwkJCQkJICAgICAgImdiLWZ3LW1nbXQtJWQiLCBtaW5vcik7CisJaWYgKElTX0VSUihmd19tZ210LT5jbGFzc19kZXZpY2UpKSB7CisJCXJldCA9IFBUUl9FUlIoZndfbWdtdC0+Y2xhc3NfZGV2aWNlKTsKKwkJZ290byBlcnJfZGVsX2NkZXY7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9kZWxfY2RldjoKKwljZGV2X2RlbCgmZndfbWdtdC0+Y2Rldik7CitlcnJfcmVtb3ZlX2lkYToKKwlpZGFfc2ltcGxlX3JlbW92ZSgmZndfbWdtdF9taW5vcnNfbWFwLCBtaW5vcik7CitlcnJfY29ubmVjdGlvbl9kaXNhYmxlOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKK2Vycl9saXN0X2RlbDoKKwltdXRleF9sb2NrKCZsaXN0X211dGV4KTsKKwlsaXN0X2RlbCgmZndfbWdtdC0+bm9kZSk7CisJbXV0ZXhfdW5sb2NrKCZsaXN0X211dGV4KTsKKworCXB1dF9md19tZ210KGZ3X21nbXQpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBnYl9md19tZ210X2Nvbm5lY3Rpb25fZXhpdChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgZndfbWdtdCAqZndfbWdtdDsKKworCWlmICghY29ubmVjdGlvbikKKwkJcmV0dXJuOworCisJZndfbWdtdCA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoY29ubmVjdGlvbik7CisKKwlkZXZpY2VfZGVzdHJveShmd19tZ210X2NsYXNzLCBmd19tZ210LT5kZXZfbnVtKTsKKwljZGV2X2RlbCgmZndfbWdtdC0+Y2Rldik7CisJaWRhX3NpbXBsZV9yZW1vdmUoJmZ3X21nbXRfbWlub3JzX21hcCwgTUlOT1IoZndfbWdtdC0+ZGV2X251bSkpOworCisJLyoKKwkgKiBEaXNhbGxvdyBhbnkgbmV3IGlvY3RsIG9wZXJhdGlvbnMgb24gdGhlIGNoYXIgZGV2aWNlIGFuZCB3YWl0IGZvcgorCSAqIGV4aXN0aW5nIG9uZXMgdG8gZmluaXNoLgorCSAqLworCW11dGV4X2xvY2soJmZ3X21nbXQtPm11dGV4KTsKKwlmd19tZ210LT5kaXNhYmxlZCA9IHRydWU7CisJbXV0ZXhfdW5sb2NrKCZmd19tZ210LT5tdXRleCk7CisKKwkvKiBBbGwgcGVuZGluZyBncmV5YnVzIG9wZXJhdGlvbnMgc2hvdWxkIGhhdmUgZmluaXNoZWQgYnkgbm93ICovCisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGZ3X21nbXQtPmNvbm5lY3Rpb24pOworCisJLyogRGlzYWxsb3cgbmV3IHVzZXJzIHRvIGdldCBhY2Nlc3MgdG8gdGhlIGZ3X21nbXQgc3RydWN0dXJlICovCisJbXV0ZXhfbG9jaygmbGlzdF9tdXRleCk7CisJbGlzdF9kZWwoJmZ3X21nbXQtPm5vZGUpOworCW11dGV4X3VubG9jaygmbGlzdF9tdXRleCk7CisKKwkvKgorCSAqIEFsbCBjdXJyZW50IHVzZXJzIG9mIGZ3X21nbXQgd291bGQgaGF2ZSB0YWtlbiBhIHJlZmVyZW5jZSB0byBpdCBieQorCSAqIG5vdywgd2UgY2FuIGRyb3Agb3VyIHJlZmVyZW5jZSBhbmQgd2FpdCB0aGUgbGFzdCB1c2VyIHdpbGwgZ2V0CisJICogZndfbWdtdCBmcmVlZC4KKwkgKi8KKwlwdXRfZndfbWdtdChmd19tZ210KTsKK30KKworaW50IGZ3X21nbXRfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlmd19tZ210X2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiZ2JfZndfbWdtdCIpOworCWlmIChJU19FUlIoZndfbWdtdF9jbGFzcykpCisJCXJldHVybiBQVFJfRVJSKGZ3X21nbXRfY2xhc3MpOworCisJcmV0ID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmZndfbWdtdF9kZXZfbnVtLCAwLCBOVU1fTUlOT1JTLAorCQkJCSAgImdiX2Z3X21nbXQiKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZW1vdmVfY2xhc3M7CisKKwlyZXR1cm4gMDsKKworZXJyX3JlbW92ZV9jbGFzczoKKwljbGFzc19kZXN0cm95KGZ3X21nbXRfY2xhc3MpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgZndfbWdtdF9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGZ3X21nbXRfZGV2X251bSwgTlVNX01JTk9SUyk7CisJY2xhc3NfZGVzdHJveShmd19tZ210X2NsYXNzKTsKKwlpZGFfZGVzdHJveSgmZndfbWdtdF9taW5vcnNfbWFwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2diLWNhbWVyYS5oIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ2ItY2FtZXJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ1ZGFiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2diLWNhbWVyYS5oCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogR3JleWJ1cyBDYW1lcmEgcHJvdG9jb2wgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKyNpZm5kZWYgX19HQl9DQU1FUkFfSAorI2RlZmluZSBfX0dCX0NBTUVSQV9ICisKKyNpbmNsdWRlIDxsaW51eC92NGwyLW1lZGlhYnVzLmg+CisKKy8qIElucHV0IGZsYWdzIG5lZWQgdG8gYmUgc2V0IGZyb20gdGhlIGNhbGxlciAqLworI2RlZmluZSBHQl9DQU1FUkFfSU5fRkxBR19URVNUCQkoMSA8PCAwKQorLyogT3V0cHV0IGZsYWdzIHJldHVybmVkICovCisjZGVmaW5lIEdCX0NBTUVSQV9PVVRfRkxBR19BREpVU1RFRAkoMSA8PCAwKQorCisvKioKKyAqIHN0cnVjdCBnYl9jYW1lcmFfc3RyZWFtIC0gUmVwcmVzZW50cyBncmV5YnVzIGNhbWVyYSBzdHJlYW0uCisgKiBAd2lkdGg6IFN0cmVhbSB3aWR0aCBpbiBwaXhlbHMuCisgKiBAaGVpZ2h0OiBTdHJlYW0gaGVpZ2h0IGluIHBpeGVscy4KKyAqIEBwaXhlbF9jb2RlOiBNZWRpYSBidXMgcGl4ZWwgY29kZS4KKyAqIEB2YzogTUlQSSBDU0kgdmlydHVhbCBjaGFubmVsLgorICogQGR0OiBNSVBJIENTSSBkYXRhIHR5cGVzLiBNb3N0IGZvcm1hdHMgdXNlIGEgc2luZ2xlIGRhdGEgdHlwZSwgaW4gd2hpY2ggY2FzZQorICogICAgICB0aGUgc2Vjb25kIGVsZW1lbnQgd2lsbCBiZSBpZ25vcmVkLgorICogQG1heF9zaXplOiBNYXhpbXVtIHNpemUgb2YgYSBmcmFtZSBpbiBieXRlcy4gVGhlIGNhbWVyYSBtb2R1bGUgZ3VhcmFudGVlcworICogICAgICAgICAgICB0aGF0IGFsbCBkYXRhIGJldHdlZW4gdGhlIEZyYW1lIFN0YXJ0IGFuZCBGcmFtZSBFbmQgcGFja2V0IGZvcgorICogICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCB2aXJ0dWFsIGNoYW5uZWwgYW5kIGRhdGEgdHlwZShzKSB3aWxsIG5vdCBleGNlZWQKKyAqICAgICAgICAgICAgdGhpcyBzaXplLgorICovCitzdHJ1Y3QgZ2JfY2FtZXJhX3N0cmVhbSB7CisJdW5zaWduZWQgaW50IHdpZHRoOworCXVuc2lnbmVkIGludCBoZWlnaHQ7CisJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIHBpeGVsX2NvZGU7CisJdW5zaWduZWQgaW50IHZjOworCXVuc2lnbmVkIGludCBkdFsyXTsKKwl1bnNpZ25lZCBpbnQgbWF4X3NpemU7Cit9OworCisvKioKKyAqIHN0cnVjdCBnYl9jYW1lcmFfY3NpX3BhcmFtcyAtIENTSSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqIEBudW1fbGFuZXM6IG51bWJlciBvZiBDU0kgZGF0YSBsYW5lcworICogQGNsa19mcmVxOiBDU0kgY2xvY2sgZnJlcXVlbmN5IGluIEh6CisgKi8KK3N0cnVjdCBnYl9jYW1lcmFfY3NpX3BhcmFtcyB7CisJdW5zaWduZWQgaW50IG51bV9sYW5lczsKKwl1bnNpZ25lZCBpbnQgY2xrX2ZyZXE7Cit9OworCisvKioKKyAqIHN0cnVjdCBnYl9jYW1lcmFfb3BzIC0gR3JleWJ1cyBjYW1lcmEgb3BlcmF0aW9ucywgdXNlZCBieSB0aGUgR3JleWJ1cyBjYW1lcmEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyIHRvIGV4cG9zZSBvcGVyYXRpb25zIHRvIHRoZSBob3N0IGNhbWVyYSBkcml2ZXIuCisgKiBAY2FwYWJpbGl0aWVzOiBSZXRyaWV2ZSBjYW1lcmEgY2FwYWJpbGl0aWVzIGFuZCBzdG9yZSB0aGVtIGluIHRoZSBidWZmZXIKKyAqICAgICAgICAgICAgICAgICdidWYnIGNhcGFiaWxpdGllcy4gVGhlIGJ1ZmZlciBtYXhpbXVtIHNpemUgaXMgc3BlY2lmaWVkIGJ5CisgKiAgICAgICAgICAgICAgICB0aGUgY2FsbGVyIGluIHRoZSAnc2l6ZScgcGFyYW1ldGVyLCBhbmQgdGhlIGVmZmVjdGl2ZQorICogICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzIHNpemUgaXMgcmV0dXJuZWQgZnJvbSB0aGUgZnVuY3Rpb24uIElmIHRoZSBidWZmZXIKKyAqICAgICAgICAgICAgICAgIHNpemUgaXMgdG9vIHNtYWxsIHRvIGhvbGQgdGhlIGNhcGFiaWxpdGllcyBhbiBlcnJvciBpcworICogICAgICAgICAgICAgICAgcmV0dXJuZWQgYW5kIHRoZSBidWZmZXIgaXMgbGVmdCB1bnRvdWNoZWQuCisgKgorICogQGNvbmZpZ3VyZV9zdHJlYW1zOiBOZWdvdGlhdGUgY29uZmlndXJhdGlvbiBhbmQgcHJlcGFyZSB0aGUgbW9kdWxlIGZvciB2aWRlbworICogICAgICAgICAgICAgICAgICAgICBjYXB0dXJlLiBUaGUgY2FsbGVyIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHN0cmVhbXMgaXQKKyAqICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMgaW4gdGhlICduc3RyZWFtcycgYXJndW1lbnQgYW5kIHRoZSBhc3NvY2lhdGVkCisgKiAgICAgICAgICAgICAgICAgICAgIHN0cmVhbXMgY29uZmlndXJhdGlvbnMgaW4gdGhlICdzdHJlYW1zJyBhcmd1bWVudC4gVGhlCisgKiAgICAgICAgICAgICAgICAgICAgIEdCX0NBTUVSQV9JTl9GTEFHX1RFU1QgJ2ZsYWcnIGNhbiBiZSBzZXQgdG8gdGVzdCBhCisgKiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gd2l0aG91dCBhcHBseWluZyBpdCwgb3RoZXJ3aXNlIHRoZQorICogICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGlzIGFwcGxpZWQgYnkgdGhlIG1vZHVsZS4gVGhlIG1vZHVsZSBjYW4KKyAqICAgICAgICAgICAgICAgICAgICAgZGVjaWRlIHRvIG1vZGlmeSB0aGUgcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZworICogICAgICAgICAgICAgICAgICAgICB1c2luZyBhIGRpZmZlcmVudCBudW1iZXIgb2Ygc3RyZWFtcy4gSW4gdGhhdCBjYXNlIHRoZQorICogICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCBjb25maWd1cmF0aW9uIHdvbid0IGJlIGFwcGxpZWQsIHRoZQorICogICAgICAgICAgICAgICAgICAgICBHQl9DQU1FUkFfT1VUX0ZMQUdfQURKVVNURUQgJ2ZsYWcnIHdpbGwgYmUgc2V0IHVwb24KKyAqICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLCBhbmQgdGhlIG1vZGlmaWVkIGNvbmZpZ3VyYXRpb24gYW5kIG51bWJlciBvZgorICogICAgICAgICAgICAgICAgICAgICBzdHJlYW1zIHN0b3JlZCBpbiAnc3RyZWFtcycgYW5kICdhcnJheScuIFRoZSBtb2R1bGUKKyAqICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBpdHMgQ1NJLTIgYnVzIHBhcmFtZXRlcnMgaW4gdGhlICdjc2lfcGFyYW1zJworICogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgaW4gYWxsIGNhc2VzLgorICoKKyAqIEBjYXB0dXJlOiBTdWJtaXQgYSBjYXB0dXJlIHJlcXVlc3QuIFRoZSBzdXBwbGllZCAncmVxdWVzdF9pZCcgbXVzdCBiZSB1bmlxdWUKKyAqICAgICAgICAgICBhbmQgaGlnaGVyIHRoYW4gdGhlIElEcyBvZiBhbGwgdGhlIHByZXZpb3VzbHkgc3VibWl0dGVkIHJlcXVlc3RzLgorICogICAgICAgICAgIFRoZSAnc3RyZWFtcycgYXJndW1lbnQgc3BlY2lmaWVzIHdoaWNoIHN0cmVhbXMgYXJlIGFmZmVjdGVkIGJ5IHRoZQorICogICAgICAgICAgIHJlcXVlc3QgaW4gdGhlIGZvcm0gb2YgYSBiaXRtYXNrLCB3aXRoIGJpdHMgY29ycmVzcG9uZGluZyB0byB0aGUKKyAqICAgICAgICAgICBjb25maWd1cmVkIHN0cmVhbXMgaW5kZXhlcy4gSWYgdGhlIHJlcXVlc3QgY29udGFpbnMgc2V0dGluZ3MsIHRoZQorICogICAgICAgICAgICdzZXR0aW5ncycgYXJndW1lbnQgcG9pbnRzIHRvIHRoZSBzZXR0aW5ncyBidWZmZXIgYW5kIGl0cyBzaXplIGlzCisgKiAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSAnc2V0dGluZ3Nfc2l6ZScgYXJndW1lbnQuIE90aGVyd2lzZSB0aGUgJ3NldHRpbmdzJworICogICAgICAgICAgIGFyZ3VtZW50IHNob3VsZCBiZSBzZXQgdG8gTlVMTCBhbmQgJ3NldHRpbmdzX3NpemUnIHRvIDAuCisgKgorICogQGZsdXNoOiBGbHVzaCB0aGUgY2FwdHVyZSByZXF1ZXN0cyBxdWV1ZS4gUmV0dXJuIHRoZSBJRCBvZiB0aGUgbGFzdCByZXF1ZXN0CisgKiAgICAgICAgIHRoYXQgd2lsbCBwcm9jZXNzZWQgYnkgdGhlIGRldmljZSBiZWZvcmUgaXQgc3RvcHMgdHJhbnNtaXR0aW5nIHZpZGVvCisgKiAgICAgICAgIGZyYW1lcy4gQWxsIHF1ZXVlZCBjYXB0dXJlIHJlcXVlc3RzIHdpdGggSURzIGhpZ2hlciB0aGFuIHRoZSByZXR1cm5lZAorICogICAgICAgICBJRCB3aWxsIGJlIGRyb3BwZWQgd2l0aG91dCBiZWluZyBwcm9jZXNzZWQuCisgKi8KK3N0cnVjdCBnYl9jYW1lcmFfb3BzIHsKKwlzc2l6ZV90ICgqY2FwYWJpbGl0aWVzKSh2b2lkICpwcml2LCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworCWludCAoKmNvbmZpZ3VyZV9zdHJlYW1zKSh2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKm5zdHJlYW1zLAorCQkJdW5zaWduZWQgaW50ICpmbGFncywgc3RydWN0IGdiX2NhbWVyYV9zdHJlYW0gKnN0cmVhbXMsCisJCQlzdHJ1Y3QgZ2JfY2FtZXJhX2NzaV9wYXJhbXMgKmNzaV9wYXJhbXMpOworCWludCAoKmNhcHR1cmUpKHZvaWQgKnByaXYsIHUzMiByZXF1ZXN0X2lkLAorCQkJdW5zaWduZWQgaW50IHN0cmVhbXMsIHVuc2lnbmVkIGludCBudW1fZnJhbWVzLAorCQkJc2l6ZV90IHNldHRpbmdzX3NpemUsIGNvbnN0IHZvaWQgKnNldHRpbmdzKTsKKwlpbnQgKCpmbHVzaCkodm9pZCAqcHJpdiwgdTMyICpyZXF1ZXN0X2lkKTsKK307CisKKy8qKgorICogc3RydWN0IGdiX2NhbWVyYV9tb2R1bGUgLSBSZXByZXNlbnRzIGdyZXlidXMgY2FtZXJhIG1vZHVsZS4KKyAqIEBwcml2OiBNb2R1bGUgcHJpdmF0ZSBkYXRhLCBwYXNzZWQgdG8gYWxsIGNhbWVyYSBvcGVyYXRpb25zLgorICogQG9wczogR3JleWJ1cyBjYW1lcmEgb3BlcmF0aW9uIGNhbGxiYWNrcy4KKyAqIEBpbnRlcmZhY2VfaWQ6IEludGVyZmFjZSBpZCBvZiB0aGUgbW9kdWxlLgorICogQHJlZmNvdW50OiBSZWZlcmVuY2UgY291bnRpbmcgb2JqZWN0LgorICogQHJlbGVhc2U6IE1vZHVsZSByZWxlYXNlIGZ1bmN0aW9uLgorICogQGxpc3Q6IExpc3QgZW50cnkgaW4gdGhlIGNhbWVyYSBtb2R1bGVzIGxpc3QuCisgKi8KK3N0cnVjdCBnYl9jYW1lcmFfbW9kdWxlIHsKKwl2b2lkICpwcml2OworCWNvbnN0IHN0cnVjdCBnYl9jYW1lcmFfb3BzICpvcHM7CisKKwl1bnNpZ25lZCBpbnQgaW50ZXJmYWNlX2lkOworCXN0cnVjdCBrcmVmIHJlZmNvdW50OworCXZvaWQgKCpyZWxlYXNlKShzdHJ1Y3Qga3JlZiAqa3JlZik7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAvKiBHbG9iYWwgbGlzdCAqLworfTsKKworI2RlZmluZSBnYl9jYW1lcmFfY2FsbChmLCBvcCwgYXJncy4uLikgICAgICBcCisJKCEoZikgPyAtRU5PREVWIDogKCgoZiktPm9wcy0+b3ApID8gIFwKKwkoZiktPm9wcy0+b3AoKGYpLT5wcml2LCAjI2FyZ3MpIDogLUVOT0lPQ1RMQ01EKSkKKworaW50IGdiX2NhbWVyYV9yZWdpc3RlcihzdHJ1Y3QgZ2JfY2FtZXJhX21vZHVsZSAqbW9kdWxlKTsKK2ludCBnYl9jYW1lcmFfdW5yZWdpc3RlcihzdHJ1Y3QgZ2JfY2FtZXJhX21vZHVsZSAqbW9kdWxlKTsKKworI2VuZGlmIC8qIF9fR0JfQ0FNRVJBX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dicGh5LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9nYnBoeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZGU3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9nYnBoeS5jCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICogR3JleWJ1cyBCcmlkZ2VkLVBoeSBCdXMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJnYnBoeS5oIgorCisjZGVmaW5lIEdCX0dCUEhZX0FVVE9TVVNQRU5EX01TCTMwMDAKKworc3RydWN0IGdicGh5X2hvc3QgeworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldmljZXM7Cit9OworCitzdGF0aWMgREVGSU5FX0lEQShnYnBoeV9pZCk7CisKK3N0YXRpYyBzc2l6ZV90IHByb3RvY29sX2lkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldiA9IHRvX2dicGh5X2RldihkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBnYnBoeV9kZXYtPmNwb3J0X2Rlc2MtPnByb3RvY29sX2lkKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwcm90b2NvbF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpnYnBoeV9kZXZfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfcHJvdG9jb2xfaWQuYXR0ciwKKwlOVUxMLAorfTsKKworQVRUUklCVVRFX0dST1VQUyhnYnBoeV9kZXYpOworCitzdGF0aWMgdm9pZCBnYnBoeV9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2ID0gdG9fZ2JwaHlfZGV2KGRldik7CisKKwlpZGFfc2ltcGxlX3JlbW92ZSgmZ2JwaHlfaWQsIGdicGh5X2Rldi0+aWQpOworCWtmcmVlKGdicGh5X2Rldik7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgZ2JfZ2JwaHlfaWRsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShkZXYpOworCXBtX3JlcXVlc3RfYXV0b3N1c3BlbmQoZGV2KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgZ2JfZ2JwaHlfcG1fb3BzID0geworCVNFVF9SVU5USU1FX1BNX09QUyhwbV9nZW5lcmljX3J1bnRpbWVfc3VzcGVuZCwKKwkJCSAgIHBtX2dlbmVyaWNfcnVudGltZV9yZXN1bWUsCisJCQkgICBnYl9nYnBoeV9pZGxlKQorfTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfdHlwZSBncmV5YnVzX2dicGh5X2Rldl90eXBlID0geworCS5uYW1lCSA9CSJnYnBoeV9kZXZpY2UiLAorCS5yZWxlYXNlID0JZ2JwaHlfZGV2X3JlbGVhc2UsCisJLnBtCT0JJmdiX2dicGh5X3BtX29wcywKK307CisKK3N0YXRpYyBpbnQgZ2JwaHlfZGV2X3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKK3sKKwlzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYgPSB0b19nYnBoeV9kZXYoZGV2KTsKKwlzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2Nwb3J0ICpjcG9ydF9kZXNjID0gZ2JwaHlfZGV2LT5jcG9ydF9kZXNjOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IGdicGh5X2Rldi0+YnVuZGxlOworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSBidW5kbGUtPmludGY7CisJc3RydWN0IGdiX21vZHVsZSAqbW9kdWxlID0gaW50Zi0+bW9kdWxlOworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSBpbnRmLT5oZDsKKworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJCVVM9JXUiLCBoZC0+YnVzX2lkKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIk1PRFVMRT0ldSIsIG1vZHVsZS0+bW9kdWxlX2lkKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIklOVEVSRkFDRT0ldSIsIGludGYtPmludGVyZmFjZV9pZCkpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJHUkVZQlVTX0lEPSUwOHgvJTA4eCIsCisJCQkgICBpbnRmLT52ZW5kb3JfaWQsIGludGYtPnByb2R1Y3RfaWQpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiQlVORExFPSV1IiwgZ2JwaHlfZGV2LT5idW5kbGUtPmlkKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIkJVTkRMRV9DTEFTUz0lMDJ4IiwgYnVuZGxlLT5jbGFzcykpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJHQlBIWT0ldSIsIGdicGh5X2Rldi0+aWQpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiUFJPVE9DT0xfSUQ9JTAyeCIsIGNwb3J0X2Rlc2MtPnByb3RvY29sX2lkKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBnYnBoeV9kZXZpY2VfaWQgKgorZ2JwaHlfZGV2X21hdGNoX2lkKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2Rldiwgc3RydWN0IGdicGh5X2RyaXZlciAqZ2JwaHlfZHJ2KQoreworCWNvbnN0IHN0cnVjdCBnYnBoeV9kZXZpY2VfaWQgKmlkID0gZ2JwaHlfZHJ2LT5pZF90YWJsZTsKKworCWlmICghaWQpCisJCXJldHVybiBOVUxMOworCisJZm9yICg7IGlkLT5wcm90b2NvbF9pZDsgaWQrKykKKwkJaWYgKGlkLT5wcm90b2NvbF9pZCA9PSBnYnBoeV9kZXYtPmNwb3J0X2Rlc2MtPnByb3RvY29sX2lkKQorCQkJcmV0dXJuIGlkOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZ2JwaHlfZGV2X21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlzdHJ1Y3QgZ2JwaHlfZHJpdmVyICpnYnBoeV9kcnYgPSB0b19nYnBoeV9kcml2ZXIoZHJ2KTsKKwlzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYgPSB0b19nYnBoeV9kZXYoZGV2KTsKKwljb25zdCBzdHJ1Y3QgZ2JwaHlfZGV2aWNlX2lkICppZDsKKworCWlkID0gZ2JwaHlfZGV2X21hdGNoX2lkKGdicGh5X2RldiwgZ2JwaHlfZHJ2KTsKKwlpZiAoaWQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JwaHlfZGV2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2JwaHlfZHJpdmVyICpnYnBoeV9kcnYgPSB0b19nYnBoeV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldiA9IHRvX2dicGh5X2RldihkZXYpOworCWNvbnN0IHN0cnVjdCBnYnBoeV9kZXZpY2VfaWQgKmlkOworCWludCByZXQ7CisKKwlpZCA9IGdicGh5X2Rldl9tYXRjaF9pZChnYnBoeV9kZXYsIGdicGh5X2Rydik7CisJaWYgKCFpZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBmb3Igb2xkIGtlcm5lbHMgd2UgbmVlZCBnZXRfc3luYyB0byByZXN1bWUgcGFyZW50IGRldmljZXMgKi8KKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGdicGh5X2Rldi0+YnVuZGxlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KGRldiwgR0JfR0JQSFlfQVVUT1NVU1BFTkRfTVMpOworCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKGRldik7CisJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCisJLyoKKwkgKiBEcml2ZXJzIHNob3VsZCBjYWxsIHB1dCBvbiB0aGUgZ2JwaHkgZGV2IGJlZm9yZSByZXR1cm5pbmcKKwkgKiBmcm9tIHByb2JlIGlmIHRoZXkgc3VwcG9ydCBydW50aW1lIHBtLgorCSAqLworCXJldCA9IGdicGh5X2Rydi0+cHJvYmUoZ2JwaHlfZGV2LCBpZCk7CisJaWYgKHJldCkgeworCQlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKwkJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldik7CisJCXBtX3J1bnRpbWVfcHV0X25vaWRsZShkZXYpOworCQlwbV9ydW50aW1lX2RvbnRfdXNlX2F1dG9zdXNwZW5kKGRldik7CisJfQorCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ2JwaHlfZGV2LT5idW5kbGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYnBoeV9kZXZfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2JwaHlfZHJpdmVyICpnYnBoeV9kcnYgPSB0b19nYnBoeV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldiA9IHRvX2dicGh5X2RldihkZXYpOworCisJZ2JwaHlfZHJ2LT5yZW1vdmUoZ2JwaHlfZGV2KTsKKworCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZChkZXYpOworCXBtX3J1bnRpbWVfcHV0X25vaWRsZShkZXYpOworCXBtX3J1bnRpbWVfZG9udF91c2VfYXV0b3N1c3BlbmQoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1c190eXBlIGdicGh5X2J1c190eXBlID0geworCS5uYW1lID0JCSJnYnBoeSIsCisJLm1hdGNoID0JZ2JwaHlfZGV2X21hdGNoLAorCS5wcm9iZSA9CWdicGh5X2Rldl9wcm9iZSwKKwkucmVtb3ZlID0JZ2JwaHlfZGV2X3JlbW92ZSwKKwkudWV2ZW50ID0JZ2JwaHlfZGV2X3VldmVudCwKK307CisKK2ludCBnYl9nYnBoeV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGdicGh5X2RyaXZlciAqZHJpdmVyLAorCQkJICAgICBzdHJ1Y3QgbW9kdWxlICpvd25lciwgY29uc3QgY2hhciAqbW9kX25hbWUpCit7CisJaW50IHJldHZhbDsKKworCWlmIChncmV5YnVzX2Rpc2FibGVkKCkpCisJCXJldHVybiAtRU5PREVWOworCisJZHJpdmVyLT5kcml2ZXIuYnVzID0gJmdicGh5X2J1c190eXBlOworCWRyaXZlci0+ZHJpdmVyLm5hbWUgPSBkcml2ZXItPm5hbWU7CisJZHJpdmVyLT5kcml2ZXIub3duZXIgPSBvd25lcjsKKwlkcml2ZXItPmRyaXZlci5tb2RfbmFtZSA9IG1vZF9uYW1lOworCisJcmV0dmFsID0gZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXItPmRyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXByX2luZm8oInJlZ2lzdGVyZWQgbmV3IGRyaXZlciAlc1xuIiwgZHJpdmVyLT5uYW1lKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2dicGh5X3JlZ2lzdGVyX2RyaXZlcik7CisKK3ZvaWQgZ2JfZ2JwaHlfZGVyZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGdicGh5X2RyaXZlciAqZHJpdmVyKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXItPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9nYnBoeV9kZXJlZ2lzdGVyX2RyaXZlcik7CisKK3N0YXRpYyBzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYl9nYnBoeV9jcmVhdGVfZGV2KHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSwKKwkJCQlzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2Nwb3J0ICpjcG9ydF9kZXNjKQoreworCXN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldjsKKwlpbnQgcmV0dmFsOworCWludCBpZDsKKworCWlkID0gaWRhX3NpbXBsZV9nZXQoJmdicGh5X2lkLCAxLCAwLCBHRlBfS0VSTkVMKTsKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gRVJSX1BUUihpZCk7CisKKwlnYnBoeV9kZXYgPSBremFsbG9jKHNpemVvZigqZ2JwaHlfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnYnBoeV9kZXYpIHsKKwkJaWRhX3NpbXBsZV9yZW1vdmUoJmdicGh5X2lkLCBpZCk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCWdicGh5X2Rldi0+aWQgPSBpZDsKKwlnYnBoeV9kZXYtPmJ1bmRsZSA9IGJ1bmRsZTsKKwlnYnBoeV9kZXYtPmNwb3J0X2Rlc2MgPSBjcG9ydF9kZXNjOworCWdicGh5X2Rldi0+ZGV2LnBhcmVudCA9ICZidW5kbGUtPmRldjsKKwlnYnBoeV9kZXYtPmRldi5idXMgPSAmZ2JwaHlfYnVzX3R5cGU7CisJZ2JwaHlfZGV2LT5kZXYudHlwZSA9ICZncmV5YnVzX2dicGh5X2Rldl90eXBlOworCWdicGh5X2Rldi0+ZGV2Lmdyb3VwcyA9IGdicGh5X2Rldl9ncm91cHM7CisJZ2JwaHlfZGV2LT5kZXYuZG1hX21hc2sgPSBidW5kbGUtPmRldi5kbWFfbWFzazsKKwlkZXZfc2V0X25hbWUoJmdicGh5X2Rldi0+ZGV2LCAiZ2JwaHklZCIsIGlkKTsKKworCXJldHZhbCA9IGRldmljZV9yZWdpc3RlcigmZ2JwaHlfZGV2LT5kZXYpOworCWlmIChyZXR2YWwpIHsKKwkJcHV0X2RldmljZSgmZ2JwaHlfZGV2LT5kZXYpOworCQlyZXR1cm4gRVJSX1BUUihyZXR2YWwpOworCX0KKworCXJldHVybiBnYnBoeV9kZXY7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2dicGh5X2Rpc2Nvbm5lY3Qoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKQoreworCXN0cnVjdCBnYnBoeV9ob3N0ICpnYnBoeV9ob3N0ID0gZ3JleWJ1c19nZXRfZHJ2ZGF0YShidW5kbGUpOworCXN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldiwgKnRlbXA7CisJaW50IHJldDsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ2JfcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoYnVuZGxlKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShnYnBoeV9kZXYsIHRlbXAsICZnYnBoeV9ob3N0LT5kZXZpY2VzLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZnYnBoeV9kZXYtPmxpc3QpOworCQlkZXZpY2VfdW5yZWdpc3RlcigmZ2JwaHlfZGV2LT5kZXYpOworCX0KKworCWtmcmVlKGdicGh5X2hvc3QpOworfQorCitzdGF0aWMgaW50IGdiX2dicGh5X3Byb2JlKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSwKKwkJCSAgY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZ2JwaHlfaG9zdCAqZ2JwaHlfaG9zdDsKKwlzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXY7CisJaW50IGk7CisKKwlpZiAoYnVuZGxlLT5udW1fY3BvcnRzID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJZ2JwaHlfaG9zdCA9IGt6YWxsb2Moc2l6ZW9mKCpnYnBoeV9ob3N0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnYnBoeV9ob3N0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWdicGh5X2hvc3QtPmJ1bmRsZSA9IGJ1bmRsZTsKKwlJTklUX0xJU1RfSEVBRCgmZ2JwaHlfaG9zdC0+ZGV2aWNlcyk7CisJZ3JleWJ1c19zZXRfZHJ2ZGF0YShidW5kbGUsIGdicGh5X2hvc3QpOworCisJLyoKKwkgKiBDcmVhdGUgYSBidW5jaCBvZiBjaGlsZHJlbiBkZXZpY2VzLCBvbmUgcGVyIGNwb3J0LCBhbmQgYmluZCB0aGUKKwkgKiBicmlkZ2VkIHBoeSBkcml2ZXJzIHRvIHRoZW0uCisJICovCisJZm9yIChpID0gMDsgaSA8IGJ1bmRsZS0+bnVtX2Nwb3J0czsgKytpKSB7CisJCWdicGh5X2RldiA9IGdiX2dicGh5X2NyZWF0ZV9kZXYoYnVuZGxlLCAmYnVuZGxlLT5jcG9ydF9kZXNjW2ldKTsKKwkJaWYgKElTX0VSUihnYnBoeV9kZXYpKSB7CisJCQlnYl9nYnBoeV9kaXNjb25uZWN0KGJ1bmRsZSk7CisJCQlyZXR1cm4gUFRSX0VSUihnYnBoeV9kZXYpOworCQl9CisJCWxpc3RfYWRkKCZnYnBoeV9kZXYtPmxpc3QsICZnYnBoeV9ob3N0LT5kZXZpY2VzKTsKKwl9CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgZ2JfZ2JwaHlfaWRfdGFibGVbXSA9IHsKKwl7IEdSRVlCVVNfREVWSUNFX0NMQVNTKEdSRVlCVVNfQ0xBU1NfQlJJREdFRF9QSFkpIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZ3JleWJ1cywgZ2JfZ2JwaHlfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGdyZXlidXNfZHJpdmVyIGdiX2dicGh5X2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZ2JwaHkiLAorCS5wcm9iZQkJPSBnYl9nYnBoeV9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IGdiX2dicGh5X2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gZ2JfZ2JwaHlfaWRfdGFibGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBnYnBoeV9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGJ1c19yZWdpc3RlcigmZ2JwaHlfYnVzX3R5cGUpOworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCJnYnBoeSBidXMgcmVnaXN0ZXIgZmFpbGVkICglZClcbiIsIHJldHZhbCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dmFsID0gZ3JleWJ1c19yZWdpc3RlcigmZ2JfZ2JwaHlfZHJpdmVyKTsKKwlpZiAocmV0dmFsKSB7CisJCXByX2VycigiZXJyb3IgcmVnaXN0ZXJpbmcgZ3JleWJ1cyBkcml2ZXJcbiIpOworCQlnb3RvIGVycm9yX2dicGh5OworCX0KKworCXJldHVybiAwOworCitlcnJvcl9nYnBoeToKKwlidXNfdW5yZWdpc3RlcigmZ2JwaHlfYnVzX3R5cGUpOworCWlkYV9kZXN0cm95KCZnYnBoeV9pZCk7CisJcmV0dXJuIHJldHZhbDsKK30KK21vZHVsZV9pbml0KGdicGh5X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZ2JwaHlfZXhpdCh2b2lkKQoreworCWdyZXlidXNfZGVyZWdpc3RlcigmZ2JfZ2JwaHlfZHJpdmVyKTsKKwlidXNfdW5yZWdpc3RlcigmZ2JwaHlfYnVzX3R5cGUpOworCWlkYV9kZXN0cm95KCZnYnBoeV9pZCk7Cit9Cittb2R1bGVfZXhpdChnYnBoeV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ2JwaHkuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dicGh5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVlNjgwNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dicGh5LmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBHcmV5YnVzIEJyaWRnZWQtUGh5IEJ1cyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpZm5kZWYgX19HQlBIWV9ICisjZGVmaW5lIF9fR0JQSFlfSAorCitzdHJ1Y3QgZ2JwaHlfZGV2aWNlIHsKKwl1MzIgaWQ7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9jcG9ydCAqY3BvcnRfZGVzYzsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGU7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBkZXZpY2UgZGV2OworfTsKKyNkZWZpbmUgdG9fZ2JwaHlfZGV2KGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgZ2JwaHlfZGV2aWNlLCBkZXYpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZ2JfZ2JwaHlfZ2V0X2RhdGEoc3RydWN0IGdicGh5X2RldmljZSAqZ2RldikKK3sKKwlyZXR1cm4gZGV2X2dldF9kcnZkYXRhKCZnZGV2LT5kZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2JfZ2JwaHlfc2V0X2RhdGEoc3RydWN0IGdicGh5X2RldmljZSAqZ2Rldiwgdm9pZCAqZGF0YSkKK3sKKwlkZXZfc2V0X2RydmRhdGEoJmdkZXYtPmRldiwgZGF0YSk7Cit9CisKK3N0cnVjdCBnYnBoeV9kZXZpY2VfaWQgeworCV9fdTggcHJvdG9jb2xfaWQ7Cit9OworCisjZGVmaW5lIEdCUEhZX1BST1RPQ09MKHApCQlcCisJLnByb3RvY29sX2lkCT0gKHApLAorCitzdHJ1Y3QgZ2JwaHlfZHJpdmVyIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKnByb2JlKShzdHJ1Y3QgZ2JwaHlfZGV2aWNlICosCisJCSAgICAgY29uc3Qgc3RydWN0IGdicGh5X2RldmljZV9pZCAqaWQpOworCXZvaWQgKCpyZW1vdmUpKHN0cnVjdCBnYnBoeV9kZXZpY2UgKik7CisJY29uc3Qgc3RydWN0IGdicGh5X2RldmljZV9pZCAqaWRfdGFibGU7CisKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7Cit9OworI2RlZmluZSB0b19nYnBoeV9kcml2ZXIoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBnYnBoeV9kcml2ZXIsIGRyaXZlcikKKworaW50IGdiX2dicGh5X3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgZ2JwaHlfZHJpdmVyICpkcml2ZXIsCisJCQkgICAgIHN0cnVjdCBtb2R1bGUgKm93bmVyLCBjb25zdCBjaGFyICptb2RfbmFtZSk7Cit2b2lkIGdiX2dicGh5X2RlcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBnYnBoeV9kcml2ZXIgKmRyaXZlcik7CisKKyNkZWZpbmUgZ2JfZ2JwaHlfcmVnaXN0ZXIoZHJpdmVyKSBcCisJZ2JfZ2JwaHlfcmVnaXN0ZXJfZHJpdmVyKGRyaXZlciwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKQorI2RlZmluZSBnYl9nYnBoeV9kZXJlZ2lzdGVyKGRyaXZlcikgXAorCWdiX2dicGh5X2RlcmVnaXN0ZXJfZHJpdmVyKGRyaXZlcikKKworLyoqCisgKiBtb2R1bGVfZ2JwaHlfZHJpdmVyKCkgLSBIZWxwZXIgbWFjcm8gZm9yIHJlZ2lzdGVyaW5nIGEgZ2JwaHkgZHJpdmVyCisgKiBAX19nYnBoeV9kcml2ZXI6IGdicGh5X2RyaXZlciBzdHJ1Y3R1cmUKKyAqCisgKiBIZWxwZXIgbWFjcm8gZm9yIGdicGh5IGRyaXZlcnMgdG8gc2V0IHVwIHByb3BlciBtb2R1bGUgaW5pdCAvIGV4aXQKKyAqIGZ1bmN0aW9ucy4gIFJlcGxhY2VzIG1vZHVsZV9pbml0KCkgYW5kIG1vZHVsZV9leGl0KCkgYW5kIGtlZXBzIHBlb3BsZSBmcm9tCisgKiBwcmludGluZyBwb2ludGxlc3MgdGhpbmdzIHRvIHRoZSBrZXJuZWwgbG9nIHdoZW4gdGhlaXIgZHJpdmVyIGlzIGxvYWRlZC4KKyAqLworI2RlZmluZSBtb2R1bGVfZ2JwaHlfZHJpdmVyKF9fZ2JwaHlfZHJpdmVyKQlcCisJbW9kdWxlX2RyaXZlcihfX2dicGh5X2RyaXZlciwgZ2JfZ2JwaHlfcmVnaXN0ZXIsIGdiX2dicGh5X2RlcmVnaXN0ZXIpCisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbmxpbmUgaW50IGdicGh5X3J1bnRpbWVfZ2V0X3N5bmMoc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZnYnBoeV9kZXYtPmRldjsKKwlpbnQgcmV0OworCisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAicG1fcnVudGltZV9nZXRfc3luYyBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdicGh5X3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZ2JwaHlfZGV2LT5kZXY7CisKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZGV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdicGh5X3J1bnRpbWVfZ2V0X25vcmVzdW1lKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldikKK3sKKwlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZSgmZ2JwaHlfZGV2LT5kZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2JwaHlfcnVudGltZV9wdXRfbm9pZGxlKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldikKK3sKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJmdicGh5X2Rldi0+ZGV2KTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBnYnBoeV9ydW50aW1lX2dldF9zeW5jKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldikgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIGdicGh5X3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2Rldikge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBnYnBoeV9ydW50aW1lX2dldF9ub3Jlc3VtZShzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgZ2JwaHlfcnVudGltZV9wdXRfbm9pZGxlKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2Rldikge30KKyNlbmRpZgorCisjZW5kaWYgLyogX19HQlBIWV9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dwaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTA2ZTQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3Bpby5jCkBAIC0wLDAgKzEsNzY2IEBACisvKgorICogR1BJTyBHcmV5YnVzIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImdicGh5LmgiCisKK3N0cnVjdCBnYl9ncGlvX2xpbmUgeworCS8qIFRoZSBmb2xsb3dpbmcgaGFzIHRvIGJlIGFuIGFycmF5IG9mIGxpbmVfbWF4IGVudHJpZXMgKi8KKwkvKiAtLT4gbWFrZSB0aGVtIGp1c3QgYSBmbGFncyBmaWVsZCAqLworCXU4CQkJYWN0aXZlOiAgICAxLAorCQkJCWRpcmVjdGlvbjogMSwJLyogMCA9IG91dHB1dCwgMSA9IGlucHV0ICovCisJCQkJdmFsdWU6ICAgICAxOwkvKiAwID0gbG93LCAxID0gaGlnaCAqLworCXUxNgkJCWRlYm91bmNlX3VzZWM7CisKKwl1OAkJCWlycV90eXBlOworCWJvb2wJCQlpcnFfdHlwZV9wZW5kaW5nOworCWJvb2wJCQltYXNrZWQ7CisJYm9vbAkJCW1hc2tlZF9wZW5kaW5nOworfTsKKworc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciB7CisJc3RydWN0IGdicGh5X2RldmljZQkqZ2JwaHlfZGV2OworCXN0cnVjdCBnYl9jb25uZWN0aW9uCSpjb25uZWN0aW9uOworCXU4CQkJbGluZV9tYXg7CS8qIG1heCBsaW5lIG51bWJlciAqLworCXN0cnVjdCBnYl9ncGlvX2xpbmUJKmxpbmVzOworCisJc3RydWN0IGdwaW9fY2hpcAljaGlwOworCXN0cnVjdCBpcnFfY2hpcAkJaXJxYzsKKwlzdHJ1Y3QgaXJxX2NoaXAJCSppcnFjaGlwOworCXN0cnVjdCBpcnFfZG9tYWluCSppcnFkb21haW47CisJdW5zaWduZWQgaW50CQlpcnFfYmFzZTsKKwlpcnFfZmxvd19oYW5kbGVyX3QJaXJxX2hhbmRsZXI7CisJdW5zaWduZWQgaW50CQlpcnFfZGVmYXVsdF90eXBlOworCXN0cnVjdCBtdXRleAkJaXJxX2xvY2s7Cit9OworI2RlZmluZSBncGlvX2NoaXBfdG9fZ2JfZ3Bpb19jb250cm9sbGVyKGNoaXApIFwKKwljb250YWluZXJfb2YoY2hpcCwgc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciwgY2hpcCkKKyNkZWZpbmUgaXJxX2RhdGFfdG9fZ3Bpb19jaGlwKGQpIChkLT5kb21haW4tPmhvc3RfZGF0YSkKKworc3RhdGljIGludCBnYl9ncGlvX2xpbmVfY291bnRfb3BlcmF0aW9uKHN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYykKK3sKKwlzdHJ1Y3QgZ2JfZ3Bpb19saW5lX2NvdW50X3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhnZ2MtPmNvbm5lY3Rpb24sIEdCX0dQSU9fVFlQRV9MSU5FX0NPVU5ULAorCQkJCU5VTEwsIDAsICZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKCFyZXQpCisJCWdnYy0+bGluZV9tYXggPSByZXNwb25zZS5jb3VudDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2dwaW9fYWN0aXZhdGVfb3BlcmF0aW9uKHN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYywgdTggd2hpY2gpCit7CisJc3RydWN0IGdiX2dwaW9fYWN0aXZhdGVfcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldiA9IGdnYy0+Z2JwaHlfZGV2OworCWludCByZXQ7CisKKwlyZXQgPSBnYnBoeV9ydW50aW1lX2dldF9zeW5jKGdicGh5X2Rldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJlcXVlc3Qud2hpY2ggPSB3aGljaDsKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhnZ2MtPmNvbm5lY3Rpb24sIEdCX0dQSU9fVFlQRV9BQ1RJVkFURSwKKwkJCQkgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgTlVMTCwgMCk7CisJaWYgKHJldCkgeworCQlnYnBoeV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChnYnBoeV9kZXYpOworCQlyZXR1cm4gcmV0OworCX0KKworCWdnYy0+bGluZXNbd2hpY2hdLmFjdGl2ZSA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2JfZ3Bpb19kZWFjdGl2YXRlX29wZXJhdGlvbihzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MsCisJCQkJCXU4IHdoaWNoKQoreworCXN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldiA9IGdnYy0+Z2JwaHlfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZnYnBoeV9kZXYtPmRldjsKKwlzdHJ1Y3QgZ2JfZ3Bpb19kZWFjdGl2YXRlX3JlcXVlc3QgcmVxdWVzdDsKKwlpbnQgcmV0OworCisJcmVxdWVzdC53aGljaCA9IHdoaWNoOworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGdnYy0+Y29ubmVjdGlvbiwgR0JfR1BJT19UWVBFX0RFQUNUSVZBVEUsCisJCQkJICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZGVhY3RpdmF0ZSBncGlvICV1XG4iLCB3aGljaCk7CisJCWdvdG8gb3V0X3BtX3B1dDsKKwl9CisKKwlnZ2MtPmxpbmVzW3doaWNoXS5hY3RpdmUgPSBmYWxzZTsKKworb3V0X3BtX3B1dDoKKwlnYnBoeV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChnYnBoeV9kZXYpOworfQorCitzdGF0aWMgaW50IGdiX2dwaW9fZ2V0X2RpcmVjdGlvbl9vcGVyYXRpb24oc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djLAorCQkJCQl1OCB3aGljaCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZ2djLT5nYnBoeV9kZXYtPmRldjsKKwlzdHJ1Y3QgZ2JfZ3Bpb19nZXRfZGlyZWN0aW9uX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfZ3Bpb19nZXRfZGlyZWN0aW9uX3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQ7CisJdTggZGlyZWN0aW9uOworCisJcmVxdWVzdC53aGljaCA9IHdoaWNoOworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGdnYy0+Y29ubmVjdGlvbiwgR0JfR1BJT19UWVBFX0dFVF9ESVJFQ1RJT04sCisJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwKKwkJCQkmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlkaXJlY3Rpb24gPSByZXNwb25zZS5kaXJlY3Rpb247CisJaWYgKGRpcmVjdGlvbiAmJiBkaXJlY3Rpb24gIT0gMSkgeworCQlkZXZfd2FybihkZXYsICJncGlvICV1IGRpcmVjdGlvbiB3YXMgJXUgKHNob3VsZCBiZSAwIG9yIDEpXG4iLAorCQkJIHdoaWNoLCBkaXJlY3Rpb24pOworCX0KKwlnZ2MtPmxpbmVzW3doaWNoXS5kaXJlY3Rpb24gPSBkaXJlY3Rpb24gPyAxIDogMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9ncGlvX2RpcmVjdGlvbl9pbl9vcGVyYXRpb24oc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djLAorCQkJCQl1OCB3aGljaCkKK3sKKwlzdHJ1Y3QgZ2JfZ3Bpb19kaXJlY3Rpb25faW5fcmVxdWVzdCByZXF1ZXN0OworCWludCByZXQ7CisKKwlyZXF1ZXN0LndoaWNoID0gd2hpY2g7CisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoZ2djLT5jb25uZWN0aW9uLCBHQl9HUElPX1RZUEVfRElSRUNUSU9OX0lOLAorCQkJCSZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworCWlmICghcmV0KQorCQlnZ2MtPmxpbmVzW3doaWNoXS5kaXJlY3Rpb24gPSAxOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfZ3Bpb19kaXJlY3Rpb25fb3V0X29wZXJhdGlvbihzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MsCisJCQkJCXU4IHdoaWNoLCBib29sIHZhbHVlX2hpZ2gpCit7CisJc3RydWN0IGdiX2dwaW9fZGlyZWN0aW9uX291dF9yZXF1ZXN0IHJlcXVlc3Q7CisJaW50IHJldDsKKworCXJlcXVlc3Qud2hpY2ggPSB3aGljaDsKKwlyZXF1ZXN0LnZhbHVlID0gdmFsdWVfaGlnaCA/IDEgOiAwOworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGdnYy0+Y29ubmVjdGlvbiwgR0JfR1BJT19UWVBFX0RJUkVDVElPTl9PVVQsCisJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgTlVMTCwgMCk7CisJaWYgKCFyZXQpCisJCWdnYy0+bGluZXNbd2hpY2hdLmRpcmVjdGlvbiA9IDA7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9ncGlvX2dldF92YWx1ZV9vcGVyYXRpb24oc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djLAorCQkJCQl1OCB3aGljaCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZ2djLT5nYnBoeV9kZXYtPmRldjsKKwlzdHJ1Y3QgZ2JfZ3Bpb19nZXRfdmFsdWVfcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9ncGlvX2dldF92YWx1ZV9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCXU4IHZhbHVlOworCisJcmVxdWVzdC53aGljaCA9IHdoaWNoOworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGdnYy0+Y29ubmVjdGlvbiwgR0JfR1BJT19UWVBFX0dFVF9WQUxVRSwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLAorCQkJCSZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgdmFsdWUgb2YgZ3BpbyAldVxuIiwgd2hpY2gpOworCQlyZXR1cm4gcmV0OworCX0KKworCXZhbHVlID0gcmVzcG9uc2UudmFsdWU7CisJaWYgKHZhbHVlICYmIHZhbHVlICE9IDEpIHsKKwkJZGV2X3dhcm4oZGV2LCAiZ3BpbyAldSB2YWx1ZSB3YXMgJXUgKHNob3VsZCBiZSAwIG9yIDEpXG4iLAorCQkJIHdoaWNoLCB2YWx1ZSk7CisJfQorCWdnYy0+bGluZXNbd2hpY2hdLnZhbHVlID0gdmFsdWUgPyAxIDogMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2JfZ3Bpb19zZXRfdmFsdWVfb3BlcmF0aW9uKHN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYywKKwkJCQkJdTggd2hpY2gsIGJvb2wgdmFsdWVfaGlnaCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZ2djLT5nYnBoeV9kZXYtPmRldjsKKwlzdHJ1Y3QgZ2JfZ3Bpb19zZXRfdmFsdWVfcmVxdWVzdCByZXF1ZXN0OworCWludCByZXQ7CisKKwlpZiAoZ2djLT5saW5lc1t3aGljaF0uZGlyZWN0aW9uID09IDEpIHsKKwkJZGV2X3dhcm4oZGV2LCAicmVmdXNpbmcgdG8gc2V0IHZhbHVlIG9mIGlucHV0IGdwaW8gJXVcbiIsCisJCQkgd2hpY2gpOworCQlyZXR1cm47CisJfQorCisJcmVxdWVzdC53aGljaCA9IHdoaWNoOworCXJlcXVlc3QudmFsdWUgPSB2YWx1ZV9oaWdoID8gMSA6IDA7CisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoZ2djLT5jb25uZWN0aW9uLCBHQl9HUElPX1RZUEVfU0VUX1ZBTFVFLAorCQkJCSZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2V0IHZhbHVlIG9mIGdwaW8gJXVcbiIsIHdoaWNoKTsKKwkJcmV0dXJuOworCX0KKworCWdnYy0+bGluZXNbd2hpY2hdLnZhbHVlID0gcmVxdWVzdC52YWx1ZTsKK30KKworc3RhdGljIGludCBnYl9ncGlvX3NldF9kZWJvdW5jZV9vcGVyYXRpb24oc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djLAorCQkJCQl1OCB3aGljaCwgdTE2IGRlYm91bmNlX3VzZWMpCit7CisJc3RydWN0IGdiX2dwaW9fc2V0X2RlYm91bmNlX3JlcXVlc3QgcmVxdWVzdDsKKwlpbnQgcmV0OworCisJcmVxdWVzdC53aGljaCA9IHdoaWNoOworCXJlcXVlc3QudXNlYyA9IGNwdV90b19sZTE2KGRlYm91bmNlX3VzZWMpOworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGdnYy0+Y29ubmVjdGlvbiwgR0JfR1BJT19UWVBFX1NFVF9ERUJPVU5DRSwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKKwlpZiAoIXJldCkKKwkJZ2djLT5saW5lc1t3aGljaF0uZGVib3VuY2VfdXNlYyA9IGRlYm91bmNlX3VzZWM7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX2diX2dwaW9faXJxX21hc2soc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djLCB1OCBod2lycSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZ2djLT5nYnBoeV9kZXYtPmRldjsKKwlzdHJ1Y3QgZ2JfZ3Bpb19pcnFfbWFza19yZXF1ZXN0IHJlcXVlc3Q7CisJaW50IHJldDsKKworCXJlcXVlc3Qud2hpY2ggPSBod2lycTsKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhnZ2MtPmNvbm5lY3Rpb24sCisJCQkJR0JfR1BJT19UWVBFX0lSUV9NQVNLLAorCQkJCSZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworCWlmIChyZXQpCisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIG1hc2sgaXJxOiAlZFxuIiwgcmV0KTsKK30KKworc3RhdGljIHZvaWQgX2diX2dwaW9faXJxX3VubWFzayhzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MsIHU4IGh3aXJxKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZnZ2MtPmdicGh5X2Rldi0+ZGV2OworCXN0cnVjdCBnYl9ncGlvX2lycV91bm1hc2tfcmVxdWVzdCByZXF1ZXN0OworCWludCByZXQ7CisKKwlyZXF1ZXN0LndoaWNoID0gaHdpcnE7CisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoZ2djLT5jb25uZWN0aW9uLAorCQkJCUdCX0dQSU9fVFlQRV9JUlFfVU5NQVNLLAorCQkJCSZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworCWlmIChyZXQpCisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHVubWFzayBpcnE6ICVkXG4iLCByZXQpOworfQorCitzdGF0aWMgdm9pZCBfZ2JfZ3Bpb19pcnFfc2V0X3R5cGUoc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djLAorCQkJCQl1OCBod2lycSwgdTggdHlwZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZ2djLT5nYnBoeV9kZXYtPmRldjsKKwlzdHJ1Y3QgZ2JfZ3Bpb19pcnFfdHlwZV9yZXF1ZXN0IHJlcXVlc3Q7CisJaW50IHJldDsKKworCXJlcXVlc3Qud2hpY2ggPSBod2lycTsKKwlyZXF1ZXN0LnR5cGUgPSB0eXBlOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoZ2djLT5jb25uZWN0aW9uLAorCQkJCUdCX0dQSU9fVFlQRV9JUlFfVFlQRSwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBzZXQgaXJxIHR5cGU6ICVkXG4iLCByZXQpOworfQorCitzdGF0aWMgdm9pZCBnYl9ncGlvX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwID0gaXJxX2RhdGFfdG9fZ3Bpb19jaGlwKGQpOworCXN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYyA9IGdwaW9fY2hpcF90b19nYl9ncGlvX2NvbnRyb2xsZXIoY2hpcCk7CisJc3RydWN0IGdiX2dwaW9fbGluZSAqbGluZSA9ICZnZ2MtPmxpbmVzW2QtPmh3aXJxXTsKKworCWxpbmUtPm1hc2tlZCA9IHRydWU7CisJbGluZS0+bWFza2VkX3BlbmRpbmcgPSB0cnVlOworfQorCitzdGF0aWMgdm9pZCBnYl9ncGlvX2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV90b19ncGlvX2NoaXAoZCk7CisJc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djID0gZ3Bpb19jaGlwX3RvX2diX2dwaW9fY29udHJvbGxlcihjaGlwKTsKKwlzdHJ1Y3QgZ2JfZ3Bpb19saW5lICpsaW5lID0gJmdnYy0+bGluZXNbZC0+aHdpcnFdOworCisJbGluZS0+bWFza2VkID0gZmFsc2U7CisJbGluZS0+bWFza2VkX3BlbmRpbmcgPSB0cnVlOworfQorCitzdGF0aWMgaW50IGdiX2dwaW9faXJxX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcCA9IGlycV9kYXRhX3RvX2dwaW9fY2hpcChkKTsKKwlzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MgPSBncGlvX2NoaXBfdG9fZ2JfZ3Bpb19jb250cm9sbGVyKGNoaXApOworCXN0cnVjdCBnYl9ncGlvX2xpbmUgKmxpbmUgPSAmZ2djLT5saW5lc1tkLT5od2lycV07CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmdnYy0+Z2JwaHlfZGV2LT5kZXY7CisJdTggaXJxX3R5cGU7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElSUV9UWVBFX05PTkU6CisJCWlycV90eXBlID0gR0JfR1BJT19JUlFfVFlQRV9OT05FOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgorCQlpcnFfdHlwZSA9IEdCX0dQSU9fSVJRX1RZUEVfRURHRV9SSVNJTkc7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgorCQlpcnFfdHlwZSA9IEdCX0dQSU9fSVJRX1RZUEVfRURHRV9GQUxMSU5HOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwkJaXJxX3R5cGUgPSBHQl9HUElPX0lSUV9UWVBFX0VER0VfQk9USDsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9MT1c6CisJCWlycV90eXBlID0gR0JfR1BJT19JUlFfVFlQRV9MRVZFTF9MT1c7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfTEVWRUxfSElHSDoKKwkJaXJxX3R5cGUgPSBHQl9HUElPX0lSUV9UWVBFX0xFVkVMX0hJR0g7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAidW5zdXBwb3J0ZWQgaXJxIHR5cGU6ICV1XG4iLCB0eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGluZS0+aXJxX3R5cGUgPSBpcnFfdHlwZTsKKwlsaW5lLT5pcnFfdHlwZV9wZW5kaW5nID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnYl9ncGlvX2lycV9idXNfbG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcCA9IGlycV9kYXRhX3RvX2dwaW9fY2hpcChkKTsKKwlzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MgPSBncGlvX2NoaXBfdG9fZ2JfZ3Bpb19jb250cm9sbGVyKGNoaXApOworCisJbXV0ZXhfbG9jaygmZ2djLT5pcnFfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2dwaW9faXJxX2J1c19zeW5jX3VubG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcCA9IGlycV9kYXRhX3RvX2dwaW9fY2hpcChkKTsKKwlzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MgPSBncGlvX2NoaXBfdG9fZ2JfZ3Bpb19jb250cm9sbGVyKGNoaXApOworCXN0cnVjdCBnYl9ncGlvX2xpbmUgKmxpbmUgPSAmZ2djLT5saW5lc1tkLT5od2lycV07CisKKwlpZiAobGluZS0+aXJxX3R5cGVfcGVuZGluZykgeworCQlfZ2JfZ3Bpb19pcnFfc2V0X3R5cGUoZ2djLCBkLT5od2lycSwgbGluZS0+aXJxX3R5cGUpOworCQlsaW5lLT5pcnFfdHlwZV9wZW5kaW5nID0gZmFsc2U7CisJfQorCisJaWYgKGxpbmUtPm1hc2tlZF9wZW5kaW5nKSB7CisJCWlmIChsaW5lLT5tYXNrZWQpCisJCQlfZ2JfZ3Bpb19pcnFfbWFzayhnZ2MsIGQtPmh3aXJxKTsKKwkJZWxzZQorCQkJX2diX2dwaW9faXJxX3VubWFzayhnZ2MsIGQtPmh3aXJxKTsKKwkJbGluZS0+bWFza2VkX3BlbmRpbmcgPSBmYWxzZTsKKwl9CisKKwltdXRleF91bmxvY2soJmdnYy0+aXJxX2xvY2spOworfQorCitzdGF0aWMgaW50IGdiX2dwaW9fcmVxdWVzdF9oYW5kbGVyKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3AtPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZ2djLT5nYnBoeV9kZXYtPmRldjsKKwlzdHJ1Y3QgZ2JfbWVzc2FnZSAqcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfZ3Bpb19pcnFfZXZlbnRfcmVxdWVzdCAqZXZlbnQ7CisJdTggdHlwZSA9IG9wLT50eXBlOworCWludCBpcnE7CisJc3RydWN0IGlycV9kZXNjICpkZXNjOworCisJaWYgKHR5cGUgIT0gR0JfR1BJT19UWVBFX0lSUV9FVkVOVCkgeworCQlkZXZfZXJyKGRldiwgInVuc3VwcG9ydGVkIHVuc29saWNpdGVkIHJlcXVlc3Q6ICV1XG4iLCB0eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVxdWVzdCA9IG9wLT5yZXF1ZXN0OworCisJaWYgKHJlcXVlc3QtPnBheWxvYWRfc2l6ZSA8IHNpemVvZigqZXZlbnQpKSB7CisJCWRldl9lcnIoZGV2LCAic2hvcnQgZXZlbnQgcmVjZWl2ZWQgKCV6dSA8ICV6dSlcbiIsCisJCQlyZXF1ZXN0LT5wYXlsb2FkX3NpemUsIHNpemVvZigqZXZlbnQpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXZlbnQgPSByZXF1ZXN0LT5wYXlsb2FkOworCWlmIChldmVudC0+d2hpY2ggPiBnZ2MtPmxpbmVfbWF4KSB7CisJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBodyBpcnE6ICVkXG4iLCBldmVudC0+d2hpY2gpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpcnEgPSBpcnFfZmluZF9tYXBwaW5nKGdnYy0+aXJxZG9tYWluLCBldmVudC0+d2hpY2gpOworCWlmICghaXJxKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGZpbmQgSVJRXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCWlmICghZGVzYykgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBsb29rIHVwIGlycVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJZ2VuZXJpY19oYW5kbGVfaXJxX2Rlc2MoZGVzYyk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfZ3Bpb19yZXF1ZXN0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MgPSBncGlvX2NoaXBfdG9fZ2JfZ3Bpb19jb250cm9sbGVyKGNoaXApOworCisJcmV0dXJuIGdiX2dwaW9fYWN0aXZhdGVfb3BlcmF0aW9uKGdnYywgKHU4KW9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2dwaW9fZnJlZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djID0gZ3Bpb19jaGlwX3RvX2diX2dwaW9fY29udHJvbGxlcihjaGlwKTsKKworCWdiX2dwaW9fZGVhY3RpdmF0ZV9vcGVyYXRpb24oZ2djLCAodTgpb2Zmc2V0KTsKK30KKworc3RhdGljIGludCBnYl9ncGlvX2dldF9kaXJlY3Rpb24oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYyA9IGdwaW9fY2hpcF90b19nYl9ncGlvX2NvbnRyb2xsZXIoY2hpcCk7CisJdTggd2hpY2g7CisJaW50IHJldDsKKworCXdoaWNoID0gKHU4KW9mZnNldDsKKwlyZXQgPSBnYl9ncGlvX2dldF9kaXJlY3Rpb25fb3BlcmF0aW9uKGdnYywgd2hpY2gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gZ2djLT5saW5lc1t3aGljaF0uZGlyZWN0aW9uID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYyA9IGdwaW9fY2hpcF90b19nYl9ncGlvX2NvbnRyb2xsZXIoY2hpcCk7CisKKwlyZXR1cm4gZ2JfZ3Bpb19kaXJlY3Rpb25faW5fb3BlcmF0aW9uKGdnYywgKHU4KW9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKKwkJCQkJaW50IHZhbHVlKQoreworCXN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYyA9IGdwaW9fY2hpcF90b19nYl9ncGlvX2NvbnRyb2xsZXIoY2hpcCk7CisKKwlyZXR1cm4gZ2JfZ3Bpb19kaXJlY3Rpb25fb3V0X29wZXJhdGlvbihnZ2MsICh1OClvZmZzZXQsICEhdmFsdWUpOworfQorCitzdGF0aWMgaW50IGdiX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MgPSBncGlvX2NoaXBfdG9fZ2JfZ3Bpb19jb250cm9sbGVyKGNoaXApOworCXU4IHdoaWNoOworCWludCByZXQ7CisKKwl3aGljaCA9ICh1OClvZmZzZXQ7CisJcmV0ID0gZ2JfZ3Bpb19nZXRfdmFsdWVfb3BlcmF0aW9uKGdnYywgd2hpY2gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gZ2djLT5saW5lc1t3aGljaF0udmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYyA9IGdwaW9fY2hpcF90b19nYl9ncGlvX2NvbnRyb2xsZXIoY2hpcCk7CisKKwlnYl9ncGlvX3NldF92YWx1ZV9vcGVyYXRpb24oZ2djLCAodTgpb2Zmc2V0LCAhIXZhbHVlKTsKK30KKworc3RhdGljIGludCBnYl9ncGlvX3NldF9kZWJvdW5jZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsCisJCQkJCXVuc2lnbmVkIGRlYm91bmNlKQoreworCXN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYyA9IGdwaW9fY2hpcF90b19nYl9ncGlvX2NvbnRyb2xsZXIoY2hpcCk7CisJdTE2IHVzZWM7CisKKwlpZiAoZGVib3VuY2UgPiBVMTZfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl1c2VjID0gKHUxNilkZWJvdW5jZTsKKworCXJldHVybiBnYl9ncGlvX3NldF9kZWJvdW5jZV9vcGVyYXRpb24oZ2djLCAodTgpb2Zmc2V0LCB1c2VjKTsKK30KKworc3RhdGljIGludCBnYl9ncGlvX2NvbnRyb2xsZXJfc2V0dXAoc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djKQoreworCWludCByZXQ7CisKKwkvKiBOb3cgZmluZCBvdXQgaG93IG1hbnkgbGluZXMgdGhlcmUgYXJlICovCisJcmV0ID0gZ2JfZ3Bpb19saW5lX2NvdW50X29wZXJhdGlvbihnZ2MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlnZ2MtPmxpbmVzID0ga2NhbGxvYyhnZ2MtPmxpbmVfbWF4ICsgMSwgc2l6ZW9mKCpnZ2MtPmxpbmVzKSwKKwkJCSAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFnZ2MtPmxpbmVzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZ2JfZ3Bpb19pcnFfbWFwKCkgLSBtYXBzIGFuIElSUSBpbnRvIGEgR0IgZ3BpbyBpcnFjaGlwCisgKiBAZDogdGhlIGlycWRvbWFpbiB1c2VkIGJ5IHRoaXMgaXJxY2hpcAorICogQGlycTogdGhlIGdsb2JhbCBpcnEgbnVtYmVyIHVzZWQgYnkgdGhpcyBHQiBncGlvIGlycWNoaXAgaXJxCisgKiBAaHdpcnE6IHRoZSBsb2NhbCBJUlEvR1BJTyBsaW5lIG9mZnNldCBvbiB0aGlzIEdCIGdwaW8KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2V0IHVwIHRoZSBtYXBwaW5nIGZvciBhIGNlcnRhaW4gSVJRIGxpbmUgb24gYQorICogR0IgZ3BpbyBieSBhc3NpZ25pbmcgdGhlIEdCIGdwaW8gYXMgY2hpcCBkYXRhLCBhbmQgdXNpbmcgdGhlIGlycWNoaXAKKyAqIHN0b3JlZCBpbnNpZGUgdGhlIEdCIGdwaW8uCisgKi8KK3N0YXRpYyBpbnQgZ2JfZ3Bpb19pcnFfbWFwKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGludCBpcnEsCisJCQkgICBpcnFfaHdfbnVtYmVyX3QgaHdpcnEpCit7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcCA9IGRvbWFpbi0+aG9zdF9kYXRhOworCXN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYyA9IGdwaW9fY2hpcF90b19nYl9ncGlvX2NvbnRyb2xsZXIoY2hpcCk7CisKKwlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIGdnYyk7CisJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgZ2djLT5pcnFjaGlwLCBnZ2MtPmlycV9oYW5kbGVyKTsKKwlpcnFfc2V0X25vcHJvYmUoaXJxKTsKKwkvKgorCSAqIE5vIHNldC11cCBvZiB0aGUgaGFyZHdhcmUgd2lsbCBoYXBwZW4gaWYgSVJRX1RZUEVfTk9ORQorCSAqIGlzIHBhc3NlZCBhcyBkZWZhdWx0IHR5cGUuCisJICovCisJaWYgKGdnYy0+aXJxX2RlZmF1bHRfdHlwZSAhPSBJUlFfVFlQRV9OT05FKQorCQlpcnFfc2V0X2lycV90eXBlKGlycSwgZ2djLT5pcnFfZGVmYXVsdF90eXBlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnYl9ncGlvX2lycV91bm1hcChzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwgdW5zaWduZWQgaW50IGlycSkKK3sKKwlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCBOVUxMLCBOVUxMKTsKKwlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIE5VTEwpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzIGdiX2dwaW9fZG9tYWluX29wcyA9IHsKKwkubWFwCT0gZ2JfZ3Bpb19pcnFfbWFwLAorCS51bm1hcAk9IGdiX2dwaW9faXJxX3VubWFwLAorfTsKKworLyoqCisgKiBnYl9ncGlvX2lycWNoaXBfcmVtb3ZlKCkgLSByZW1vdmVzIGFuIGlycWNoaXAgYWRkZWQgdG8gYSBnYl9ncGlvX2NvbnRyb2xsZXIKKyAqIEBnZ2M6IHRoZSBnYl9ncGlvX2NvbnRyb2xsZXIgdG8gcmVtb3ZlIHRoZSBpcnFjaGlwIGZyb20KKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBvbmx5IGZyb20gZ2JfZ3Bpb19yZW1vdmUoKQorICovCitzdGF0aWMgdm9pZCBnYl9ncGlvX2lycWNoaXBfcmVtb3ZlKHN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYykKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCisJLyogUmVtb3ZlIGFsbCBJUlEgbWFwcGluZ3MgYW5kIGRlbGV0ZSB0aGUgZG9tYWluICovCisJaWYgKGdnYy0+aXJxZG9tYWluKSB7CisJCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgKGdnYy0+bGluZV9tYXggKyAxKTsgb2Zmc2V0KyspCisJCQlpcnFfZGlzcG9zZV9tYXBwaW5nKGlycV9maW5kX21hcHBpbmcoZ2djLT5pcnFkb21haW4sIG9mZnNldCkpOworCQlpcnFfZG9tYWluX3JlbW92ZShnZ2MtPmlycWRvbWFpbik7CisJfQorCisJaWYgKGdnYy0+aXJxY2hpcCkKKwkJZ2djLT5pcnFjaGlwID0gTlVMTDsKK30KKworLyoqCisgKiBnYl9ncGlvX2lycWNoaXBfYWRkKCkgLSBhZGRzIGFuIGlycWNoaXAgdG8gYSBncGlvIGNoaXAKKyAqIEBjaGlwOiB0aGUgZ3BpbyBjaGlwIHRvIGFkZCB0aGUgaXJxY2hpcCB0bworICogQGlycWNoaXA6IHRoZSBpcnFjaGlwIHRvIGFkZCB0byB0aGUgYWRhcHRlcgorICogQGZpcnN0X2lycTogaWYgbm90IGR5bmFtaWNhbGx5IGFzc2lnbmVkLCB0aGUgYmFzZSAoZmlyc3QpIElSUSB0bworICogYWxsb2NhdGUgZ3BpbyBpcnFzIGZyb20KKyAqIEBoYW5kbGVyOiB0aGUgaXJxIGhhbmRsZXIgdG8gdXNlIChvZnRlbiBhIHByZWRlZmluZWQgaXJxIGNvcmUgZnVuY3Rpb24pCisgKiBAdHlwZTogdGhlIGRlZmF1bHQgdHlwZSBmb3IgSVJRcyBvbiB0aGlzIGlycWNoaXAsIHBhc3MgSVJRX1RZUEVfTk9ORQorICogdG8gaGF2ZSB0aGUgY29yZSBhdm9pZCBzZXR0aW5nIHVwIGFueSBkZWZhdWx0IHR5cGUgaW4gdGhlIGhhcmR3YXJlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2xvc2VseSBhc3NvY2lhdGVzIGEgY2VydGFpbiBpcnFjaGlwIHdpdGggYSBjZXJ0YWluCisgKiBncGlvIGNoaXAsIHByb3ZpZGluZyBhbiBpcnEgZG9tYWluIHRvIHRyYW5zbGF0ZSB0aGUgbG9jYWwgSVJRcyB0bworICogZ2xvYmFsIGlycXMsIGFuZCBtYWtpbmcgc3VyZSB0aGF0IHRoZSBncGlvIGNoaXAKKyAqIGlzIHBhc3NlZCBhcyBjaGlwIGRhdGEgdG8gYWxsIHJlbGF0ZWQgZnVuY3Rpb25zLiBEcml2ZXIgY2FsbGJhY2tzCisgKiBuZWVkIHRvIHVzZSBjb250YWluZXJfb2YoKSB0byBnZXQgdGhlaXIgbG9jYWwgc3RhdGUgY29udGFpbmVycyBiYWNrCisgKiBmcm9tIHRoZSBncGlvIGNoaXAgcGFzc2VkIGFzIGNoaXAgZGF0YS4gQW4gaXJxZG9tYWluIHdpbGwgYmUgc3RvcmVkCisgKiBpbiB0aGUgZ3BpbyBjaGlwIHRoYXQgc2hhbGwgYmUgdXNlZCBieSB0aGUgZHJpdmVyIHRvIGhhbmRsZSBJUlEgbnVtYmVyCisgKiB0cmFuc2xhdGlvbi4gVGhlIGdwaW8gY2hpcCB3aWxsIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgYW5kIHJlZ2lzdGVyZWQKKyAqIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgZ2JfZ3Bpb19pcnFjaGlwX2FkZChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJIHN0cnVjdCBpcnFfY2hpcCAqaXJxY2hpcCwKKwkJCSB1bnNpZ25lZCBpbnQgZmlyc3RfaXJxLAorCQkJIGlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGVyLAorCQkJIHVuc2lnbmVkIGludCB0eXBlKQoreworCXN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYzsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGlycV9iYXNlOworCisJaWYgKCFjaGlwIHx8ICFpcnFjaGlwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdnYyA9IGdwaW9fY2hpcF90b19nYl9ncGlvX2NvbnRyb2xsZXIoY2hpcCk7CisKKwlnZ2MtPmlycWNoaXAgPSBpcnFjaGlwOworCWdnYy0+aXJxX2hhbmRsZXIgPSBoYW5kbGVyOworCWdnYy0+aXJxX2RlZmF1bHRfdHlwZSA9IHR5cGU7CisJZ2djLT5pcnFkb21haW4gPSBpcnFfZG9tYWluX2FkZF9zaW1wbGUoTlVMTCwKKwkJCQkJZ2djLT5saW5lX21heCArIDEsIGZpcnN0X2lycSwKKwkJCQkJJmdiX2dwaW9fZG9tYWluX29wcywgY2hpcCk7CisJaWYgKCFnZ2MtPmlycWRvbWFpbikgeworCQlnZ2MtPmlycWNoaXAgPSBOVUxMOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIFByZXBhcmUgdGhlIG1hcHBpbmcgc2luY2UgdGhlIGlycWNoaXAgc2hhbGwgYmUgb3J0aG9nb25hbCB0bworCSAqIGFueSBncGlvIGNhbGxzLiBJZiB0aGUgZmlyc3RfaXJxIHdhcyB6ZXJvLCB0aGlzIGlzCisJICogbmVjZXNzYXJ5IHRvIGFsbG9jYXRlIGRlc2NyaXB0b3JzIGZvciBhbGwgSVJRcy4KKwkgKi8KKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IChnZ2MtPmxpbmVfbWF4ICsgMSk7IG9mZnNldCsrKSB7CisJCWlycV9iYXNlID0gaXJxX2NyZWF0ZV9tYXBwaW5nKGdnYy0+aXJxZG9tYWluLCBvZmZzZXQpOworCQlpZiAob2Zmc2V0ID09IDApCisJCQlnZ2MtPmlycV9iYXNlID0gaXJxX2Jhc2U7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfZ3Bpb190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYyA9IGdwaW9fY2hpcF90b19nYl9ncGlvX2NvbnRyb2xsZXIoY2hpcCk7CisKKwlyZXR1cm4gaXJxX2ZpbmRfbWFwcGluZyhnZ2MtPmlycWRvbWFpbiwgb2Zmc2V0KTsKK30KKworc3RhdGljIGludCBnYl9ncGlvX3Byb2JlKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldiwKKwkJCSBjb25zdCBzdHJ1Y3QgZ2JwaHlfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2M7CisJc3RydWN0IGdwaW9fY2hpcCAqZ3BpbzsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmlycWM7CisJaW50IHJldDsKKworCWdnYyA9IGt6YWxsb2Moc2l6ZW9mKCpnZ2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdnYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGUoZ2JwaHlfZGV2LT5idW5kbGUsCisJCQkJCSAgbGUxNl90b19jcHUoZ2JwaHlfZGV2LT5jcG9ydF9kZXNjLT5pZCksCisJCQkJCSAgZ2JfZ3Bpb19yZXF1ZXN0X2hhbmRsZXIpOworCWlmIChJU19FUlIoY29ubmVjdGlvbikpIHsKKwkJcmV0ID0gUFRSX0VSUihjb25uZWN0aW9uKTsKKwkJZ290byBleGl0X2dnY19mcmVlOworCX0KKworCWdnYy0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJZ2JfY29ubmVjdGlvbl9zZXRfZGF0YShjb25uZWN0aW9uLCBnZ2MpOworCWdnYy0+Z2JwaHlfZGV2ID0gZ2JwaHlfZGV2OworCWdiX2dicGh5X3NldF9kYXRhKGdicGh5X2RldiwgZ2djKTsKKworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlX3R4KGNvbm5lY3Rpb24pOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9jb25uZWN0aW9uX2Rlc3Ryb3k7CisKKwlyZXQgPSBnYl9ncGlvX2NvbnRyb2xsZXJfc2V0dXAoZ2djKTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXRfY29ubmVjdGlvbl9kaXNhYmxlOworCisJaXJxYyA9ICZnZ2MtPmlycWM7CisJaXJxYy0+aXJxX21hc2sgPSBnYl9ncGlvX2lycV9tYXNrOworCWlycWMtPmlycV91bm1hc2sgPSBnYl9ncGlvX2lycV91bm1hc2s7CisJaXJxYy0+aXJxX3NldF90eXBlID0gZ2JfZ3Bpb19pcnFfc2V0X3R5cGU7CisJaXJxYy0+aXJxX2J1c19sb2NrID0gZ2JfZ3Bpb19pcnFfYnVzX2xvY2s7CisJaXJxYy0+aXJxX2J1c19zeW5jX3VubG9jayA9IGdiX2dwaW9faXJxX2J1c19zeW5jX3VubG9jazsKKwlpcnFjLT5uYW1lID0gImdyZXlidXNfZ3BpbyI7CisKKwltdXRleF9pbml0KCZnZ2MtPmlycV9sb2NrKTsKKworCWdwaW8gPSAmZ2djLT5jaGlwOworCisJZ3Bpby0+bGFiZWwgPSAiZ3JleWJ1c19ncGlvIjsKKwlncGlvLT5wYXJlbnQgPSAmZ2JwaHlfZGV2LT5kZXY7CisJZ3Bpby0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCWdwaW8tPnJlcXVlc3QgPSBnYl9ncGlvX3JlcXVlc3Q7CisJZ3Bpby0+ZnJlZSA9IGdiX2dwaW9fZnJlZTsKKwlncGlvLT5nZXRfZGlyZWN0aW9uID0gZ2JfZ3Bpb19nZXRfZGlyZWN0aW9uOworCWdwaW8tPmRpcmVjdGlvbl9pbnB1dCA9IGdiX2dwaW9fZGlyZWN0aW9uX2lucHV0OworCWdwaW8tPmRpcmVjdGlvbl9vdXRwdXQgPSBnYl9ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7CisJZ3Bpby0+Z2V0ID0gZ2JfZ3Bpb19nZXQ7CisJZ3Bpby0+c2V0ID0gZ2JfZ3Bpb19zZXQ7CisJZ3Bpby0+c2V0X2RlYm91bmNlID0gZ2JfZ3Bpb19zZXRfZGVib3VuY2U7CisJZ3Bpby0+dG9faXJxID0gZ2JfZ3Bpb190b19pcnE7CisJZ3Bpby0+YmFzZSA9IC0xOwkJLyogQWxsb2NhdGUgYmFzZSBkeW5hbWljYWxseSAqLworCWdwaW8tPm5ncGlvID0gZ2djLT5saW5lX21heCArIDE7CisJZ3Bpby0+Y2FuX3NsZWVwID0gdHJ1ZTsKKworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm5lY3Rpb24pOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9saW5lX2ZyZWU7CisKKwlyZXQgPSBnYl9ncGlvX2lycWNoaXBfYWRkKGdwaW8sIGlycWMsIDAsCisJCQkJICAgaGFuZGxlX2xldmVsX2lycSwgSVJRX1RZUEVfTk9ORSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCSJmYWlsZWQgdG8gYWRkIGlycSBjaGlwOiAlZFxuIiwgcmV0KTsKKwkJZ290byBleGl0X2xpbmVfZnJlZTsKKwl9CisKKwlyZXQgPSBncGlvY2hpcF9hZGQoZ3Bpbyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCSJmYWlsZWQgdG8gYWRkIGdwaW8gY2hpcDogJWRcbiIsIHJldCk7CisJCWdvdG8gZXhpdF9ncGlvX2lycWNoaXBfcmVtb3ZlOworCX0KKworCWdicGh5X3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdicGh5X2Rldik7CisJcmV0dXJuIDA7CisKK2V4aXRfZ3Bpb19pcnFjaGlwX3JlbW92ZToKKwlnYl9ncGlvX2lycWNoaXBfcmVtb3ZlKGdnYyk7CitleGl0X2xpbmVfZnJlZToKKwlrZnJlZShnZ2MtPmxpbmVzKTsKK2V4aXRfY29ubmVjdGlvbl9kaXNhYmxlOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKK2V4aXRfY29ubmVjdGlvbl9kZXN0cm95OgorCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKK2V4aXRfZ2djX2ZyZWU6CisJa2ZyZWUoZ2djKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnYl9ncGlvX3JlbW92ZShzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYpCit7CisJc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djID0gZ2JfZ2JwaHlfZ2V0X2RhdGEoZ2JwaHlfZGV2KTsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdnYy0+Y29ubmVjdGlvbjsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JwaHlfcnVudGltZV9nZXRfc3luYyhnYnBoeV9kZXYpOworCWlmIChyZXQpCisJCWdicGh5X3J1bnRpbWVfZ2V0X25vcmVzdW1lKGdicGh5X2Rldik7CisKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGVfcngoY29ubmVjdGlvbik7CisJZ3Bpb2NoaXBfcmVtb3ZlKCZnZ2MtPmNoaXApOworCWdiX2dwaW9faXJxY2hpcF9yZW1vdmUoZ2djKTsKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGNvbm5lY3Rpb24pOworCWtmcmVlKGdnYy0+bGluZXMpOworCWtmcmVlKGdnYyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2JwaHlfZGV2aWNlX2lkIGdiX2dwaW9faWRfdGFibGVbXSA9IHsKKwl7IEdCUEhZX1BST1RPQ09MKEdSRVlCVVNfUFJPVE9DT0xfR1BJTykgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShnYnBoeSwgZ2JfZ3Bpb19pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZ2JwaHlfZHJpdmVyIGdwaW9fZHJpdmVyID0geworCS5uYW1lCQk9ICJncGlvIiwKKwkucHJvYmUJCT0gZ2JfZ3Bpb19wcm9iZSwKKwkucmVtb3ZlCQk9IGdiX2dwaW9fcmVtb3ZlLAorCS5pZF90YWJsZQk9IGdiX2dwaW9faWRfdGFibGUsCit9OworCittb2R1bGVfZ2JwaHlfZHJpdmVyKGdwaW9fZHJpdmVyKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dyZXlidXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dyZXlidXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjUyNjg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3JleWJ1cy5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogR3JleWJ1cyBkcml2ZXIgYW5kIGRldmljZSBBUEkKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0dSRVlCVVNfSAorI2RlZmluZSBfX0xJTlVYX0dSRVlCVVNfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKworI2luY2x1ZGUgImdyZXlidXNfaWQuaCIKKyNpbmNsdWRlICJncmV5YnVzX21hbmlmZXN0LmgiCisjaW5jbHVkZSAiZ3JleWJ1c19wcm90b2NvbHMuaCIKKyNpbmNsdWRlICJtYW5pZmVzdC5oIgorI2luY2x1ZGUgImhkLmgiCisjaW5jbHVkZSAic3ZjLmgiCisjaW5jbHVkZSAiY29udHJvbC5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgorI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImJ1bmRsZS5oIgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJvcGVyYXRpb24uaCIKKyNpbmNsdWRlICJ0aW1lc3luYy5oIgorCisvKiBNYXRjaGVzIHVwIHdpdGggdGhlIEdyZXlidXMgUHJvdG9jb2wgc3BlY2lmaWNhdGlvbiBkb2N1bWVudCAqLworI2RlZmluZSBHUkVZQlVTX1ZFUlNJT05fTUFKT1IJMHgwMAorI2RlZmluZSBHUkVZQlVTX1ZFUlNJT05fTUlOT1IJMHgwMQorCisjZGVmaW5lIEdSRVlCVVNfSURfTUFUQ0hfREVWSUNFIFwKKwkoR1JFWUJVU19JRF9NQVRDSF9WRU5ET1IgfCBHUkVZQlVTX0lEX01BVENIX1BST0RVQ1QpCisKKyNkZWZpbmUgR1JFWUJVU19ERVZJQ0UodiwgcCkJCQkJCVwKKwkubWF0Y2hfZmxhZ3MJPSBHUkVZQlVTX0lEX01BVENIX0RFVklDRSwJCVwKKwkudmVuZG9yCQk9ICh2KSwJCQkJCVwKKwkucHJvZHVjdAk9IChwKSwKKworI2RlZmluZSBHUkVZQlVTX0RFVklDRV9DTEFTUyhjKQkJCQkJXAorCS5tYXRjaF9mbGFncwk9IEdSRVlCVVNfSURfTUFUQ0hfQ0xBU1MsCQlcCisJLmNsYXNzCQk9IChjKSwKKworLyogTWF4aW11bSBudW1iZXIgb2YgQ1BvcnRzICovCisjZGVmaW5lIENQT1JUX0lEX01BWAk0MDk1CQkvKiBVbmlQcm8gbWF4IGlkIGlzIDQwOTUgKi8KKyNkZWZpbmUgQ1BPUlRfSURfQkFECVUxNl9NQVgKKworc3RydWN0IGdyZXlidXNfZHJpdmVyIHsKKwljb25zdCBjaGFyICpuYW1lOworCisJaW50ICgqcHJvYmUpKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSwKKwkJICAgICBjb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgKmlkKTsKKwl2b2lkICgqZGlzY29ubmVjdCkoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKTsKKworCWNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCAqaWRfdGFibGU7CisKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7Cit9OworI2RlZmluZSB0b19ncmV5YnVzX2RyaXZlcihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGdyZXlidXNfZHJpdmVyLCBkcml2ZXIpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncmV5YnVzX3NldF9kcnZkYXRhKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSwgdm9pZCAqZGF0YSkKK3sKKwlkZXZfc2V0X2RydmRhdGEoJmJ1bmRsZS0+ZGV2LCBkYXRhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpncmV5YnVzX2dldF9kcnZkYXRhKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwlyZXR1cm4gZGV2X2dldF9kcnZkYXRhKCZidW5kbGUtPmRldik7Cit9CisKKy8qIERvbid0IGNhbGwgdGhlc2UgZGlyZWN0bHksIHVzZSB0aGUgbW9kdWxlX2dyZXlidXNfZHJpdmVyKCkgbWFjcm8gaW5zdGVhZCAqLworaW50IGdyZXlidXNfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBncmV5YnVzX2RyaXZlciAqZHJpdmVyLAorCQkJICAgIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwgY29uc3QgY2hhciAqbW9kX25hbWUpOwordm9pZCBncmV5YnVzX2RlcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBncmV5YnVzX2RyaXZlciAqZHJpdmVyKTsKKworLyogZGVmaW5lIHRvIGdldCBwcm9wZXIgVEhJU19NT0RVTEUgYW5kIEtCVUlMRF9NT0ROQU1FIHZhbHVlcyAqLworI2RlZmluZSBncmV5YnVzX3JlZ2lzdGVyKGRyaXZlcikgXAorCWdyZXlidXNfcmVnaXN0ZXJfZHJpdmVyKGRyaXZlciwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKQorI2RlZmluZSBncmV5YnVzX2RlcmVnaXN0ZXIoZHJpdmVyKSBcCisJZ3JleWJ1c19kZXJlZ2lzdGVyX2RyaXZlcihkcml2ZXIpCisKKy8qKgorICogbW9kdWxlX2dyZXlidXNfZHJpdmVyKCkgLSBIZWxwZXIgbWFjcm8gZm9yIHJlZ2lzdGVyaW5nIGEgR3JleWJ1cyBkcml2ZXIKKyAqIEBfX2dyZXlidXNfZHJpdmVyOiBncmV5YnVzX2RyaXZlciBzdHJ1Y3R1cmUKKyAqCisgKiBIZWxwZXIgbWFjcm8gZm9yIEdyZXlidXMgZHJpdmVycyB0byBzZXQgdXAgcHJvcGVyIG1vZHVsZSBpbml0IC8gZXhpdAorICogZnVuY3Rpb25zLiAgUmVwbGFjZXMgbW9kdWxlX2luaXQoKSBhbmQgbW9kdWxlX2V4aXQoKSBhbmQga2VlcHMgcGVvcGxlIGZyb20KKyAqIHByaW50aW5nIHBvaW50bGVzcyB0aGluZ3MgdG8gdGhlIGtlcm5lbCBsb2cgd2hlbiB0aGVpciBkcml2ZXIgaXMgbG9hZGVkLgorICovCisjZGVmaW5lIG1vZHVsZV9ncmV5YnVzX2RyaXZlcihfX2dyZXlidXNfZHJpdmVyKQlcCisJbW9kdWxlX2RyaXZlcihfX2dyZXlidXNfZHJpdmVyLCBncmV5YnVzX3JlZ2lzdGVyLCBncmV5YnVzX2RlcmVnaXN0ZXIpCisKK2ludCBncmV5YnVzX2Rpc2FibGVkKHZvaWQpOworCit2b2lkIGdiX2RlYnVnZnNfaW5pdCh2b2lkKTsKK3ZvaWQgZ2JfZGVidWdmc19jbGVhbnVwKHZvaWQpOworc3RydWN0IGRlbnRyeSAqZ2JfZGVidWdmc19nZXQodm9pZCk7CisKK2V4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgZ3JleWJ1c19idXNfdHlwZTsKKworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfdHlwZSBncmV5YnVzX2hkX3R5cGU7CitleHRlcm4gc3RydWN0IGRldmljZV90eXBlIGdyZXlidXNfbW9kdWxlX3R5cGU7CitleHRlcm4gc3RydWN0IGRldmljZV90eXBlIGdyZXlidXNfaW50ZXJmYWNlX3R5cGU7CitleHRlcm4gc3RydWN0IGRldmljZV90eXBlIGdyZXlidXNfY29udHJvbF90eXBlOworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfdHlwZSBncmV5YnVzX2J1bmRsZV90eXBlOworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfdHlwZSBncmV5YnVzX3N2Y190eXBlOworCitzdGF0aWMgaW5saW5lIGludCBpc19nYl9ob3N0X2RldmljZShjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+dHlwZSA9PSAmZ3JleWJ1c19oZF90eXBlOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19nYl9tb2R1bGUoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPnR5cGUgPT0gJmdyZXlidXNfbW9kdWxlX3R5cGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2diX2ludGVyZmFjZShjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+dHlwZSA9PSAmZ3JleWJ1c19pbnRlcmZhY2VfdHlwZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfZ2JfY29udHJvbChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+dHlwZSA9PSAmZ3JleWJ1c19jb250cm9sX3R5cGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2diX2J1bmRsZShjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+dHlwZSA9PSAmZ3JleWJ1c19idW5kbGVfdHlwZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfZ2Jfc3ZjKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2LT50eXBlID09ICZncmV5YnVzX3N2Y190eXBlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgY3BvcnRfaWRfdmFsaWQoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGNwb3J0X2lkKQoreworCXJldHVybiBjcG9ydF9pZCAhPSBDUE9SVF9JRF9CQUQgJiYgY3BvcnRfaWQgPCBoZC0+bnVtX2Nwb3J0czsKK30KKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX0xJTlVYX0dSRVlCVVNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3JleWJ1c19hdXRoZW50aWNhdGlvbi5oIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3JleWJ1c19hdXRoZW50aWNhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ODRlZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncmV5YnVzX2F1dGhlbnRpY2F0aW9uLmgKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBHcmV5YnVzIENvbXBvbmVudCBBdXRoZW50aWNhdGlvbiBVc2VyIEhlYWRlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDE2IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQoYykgMjAxNiBMaW5hcm8gTHRkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAxNiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0KGMpIDIwMTYgTGluYXJvIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBvciBMaW5hcm8gTHRkLiBub3IgdGhlIG5hbWVzIG9mCisgKiAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBHT09HTEUgSU5DLiBPUgorICogTElOQVJPIExURC4gQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfX0dSRVlCVVNfQVVUSEVOVElDQVRJT05fVVNFUl9ICisjZGVmaW5lIF9fR1JFWUJVU19BVVRIRU5USUNBVElPTl9VU0VSX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBDQVBfQ0VSVElGSUNBVEVfTUFYX1NJWkUJMTYwMAorI2RlZmluZSBDQVBfU0lHTkFUVVJFX01BWF9TSVpFCQkzMjAKKworLyogQ2VydGlmaWNhdGUgY2xhc3MgdHlwZXMgKi8KKyNkZWZpbmUgQ0FQX0NFUlRfSU1TX0VBUEMJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ0FQX0NFUlRfSU1TX0VBU0MJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQ0FQX0NFUlRfSU1TX0VBUkMJCTB4MDAwMDAwMDMKKyNkZWZpbmUgQ0FQX0NFUlRfSU1TX0lBUEMJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ0FQX0NFUlRfSU1TX0lBU0MJCTB4MDAwMDAwMDUKKyNkZWZpbmUgQ0FQX0NFUlRfSU1TX0lBUkMJCTB4MDAwMDAwMDYKKworLyogSU1TIENlcnRpZmljYXRlIHJlc3BvbnNlIHJlc3VsdCBjb2RlcyAqLworI2RlZmluZSBDQVBfSU1TX1JFU1VMVF9DRVJUX0ZPVU5ECTB4MDAKKyNkZWZpbmUgQ0FQX0lNU19SRVNVTFRfQ0VSVF9DTEFTU19JTlZBTAkweDAxCisjZGVmaW5lIENBUF9JTVNfUkVTVUxUX0NFUlRfQ09SUlVQVAkweDAyCisjZGVmaW5lIENBUF9JTVNfUkVTVUxUX0NFUlRfTk9UX0ZPVU5ECTB4MDMKKworLyogQXV0aGVudGljYXRpb24gdHlwZXMgKi8KKyNkZWZpbmUgQ0FQX0FVVEhfSU1TX1BSSQkJMHgwMDAwMDAwMQorI2RlZmluZSBDQVBfQVVUSF9JTVNfU0VDCQkweDAwMDAwMDAyCisjZGVmaW5lIENBUF9BVVRIX0lNU19SU0EJCTB4MDAwMDAwMDMKKworLyogQXV0aGVudGljYXRlIHJlc3BvbnNlIHJlc3VsdCBjb2RlcyAqLworI2RlZmluZSBDQVBfQVVUSF9SRVNVTFRfQ1JfU1VDQ0VTUwkweDAwCisjZGVmaW5lIENBUF9BVVRIX1JFU1VMVF9DUl9CQURfVFlQRQkweDAxCisjZGVmaW5lIENBUF9BVVRIX1JFU1VMVF9DUl9XUk9OR19FUAkweDAyCisjZGVmaW5lIENBUF9BVVRIX1JFU1VMVF9DUl9OT19LRVkJMHgwMworI2RlZmluZSBDQVBfQVVUSF9SRVNVTFRfQ1JfU0lHX0ZBSUwJMHgwNAorCisKKy8qIElPQ1RMIHN1cHBvcnQgKi8KK3N0cnVjdCBjYXBfaW9jX2dldF9lbmRwb2ludF91aWQgeworCV9fdTgJCQl1aWRbOF07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBjYXBfaW9jX2dldF9pbXNfY2VydGlmaWNhdGUgeworCV9fdTMyCQkJY2VydGlmaWNhdGVfY2xhc3M7CisJX191MzIJCQljZXJ0aWZpY2F0ZV9pZDsKKworCV9fdTgJCQlyZXN1bHRfY29kZTsKKwlfX3UzMgkJCWNlcnRfc2l6ZTsKKwlfX3U4CQkJY2VydGlmaWNhdGVbQ0FQX0NFUlRJRklDQVRFX01BWF9TSVpFXTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGNhcF9pb2NfYXV0aGVudGljYXRlIHsKKwlfX3UzMgkJCWF1dGhfdHlwZTsKKwlfX3U4CQkJdWlkWzhdOworCV9fdTgJCQljaGFsbGVuZ2VbMzJdOworCisJX191OAkJCXJlc3VsdF9jb2RlOworCV9fdTgJCQlyZXNwb25zZVs2NF07CisJX191MzIJCQlzaWduYXR1cmVfc2l6ZTsKKwlfX3U4CQkJc2lnbmF0dXJlW0NBUF9TSUdOQVRVUkVfTUFYX1NJWkVdOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisjZGVmaW5lIENBUF9JT0NUTF9CQVNFCQkJJ0MnCisjZGVmaW5lIENBUF9JT0NfR0VUX0VORFBPSU5UX1VJRAlfSU9SKENBUF9JT0NUTF9CQVNFLCAwLCBzdHJ1Y3QgY2FwX2lvY19nZXRfZW5kcG9pbnRfdWlkKQorI2RlZmluZSBDQVBfSU9DX0dFVF9JTVNfQ0VSVElGSUNBVEUJX0lPV1IoQ0FQX0lPQ1RMX0JBU0UsIDEsIHN0cnVjdCBjYXBfaW9jX2dldF9pbXNfY2VydGlmaWNhdGUpCisjZGVmaW5lIENBUF9JT0NfQVVUSEVOVElDQVRFCQlfSU9XUihDQVBfSU9DVExfQkFTRSwgMiwgc3RydWN0IGNhcF9pb2NfYXV0aGVudGljYXRlKQorCisjZW5kaWYgLyogX19HUkVZQlVTX0FVVEhFTlRJQ0FUSU9OX1VTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3JleWJ1c19maXJtd2FyZS5oIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3JleWJ1c19maXJtd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3N2EyYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncmV5YnVzX2Zpcm13YXJlLmgKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBHcmV5YnVzIEZpcm13YXJlIE1hbmFnZW1lbnQgVXNlciBIZWFkZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAxNiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0KGMpIDIwMTYgTGluYXJvIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMTYgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDE2IExpbmFybyBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gb3IgTGluYXJvIEx0ZC4gbm9yIHRoZSBuYW1lcyBvZgorICogICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgR09PR0xFIElOQy4gT1IKKyAqIExJTkFSTyBMVEQuIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX19HUkVZQlVTX0ZJUk1XQVJFX1VTRVJfSAorI2RlZmluZSBfX0dSRVlCVVNfRklSTVdBUkVfVVNFUl9ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgR0JfRklSTVdBUkVfVV9UQUdfTUFYX1NJWkUJCTEwCisKKyNkZWZpbmUgR0JfRldfVV9MT0FEX01FVEhPRF9VTklQUk8JCTB4MDEKKyNkZWZpbmUgR0JfRldfVV9MT0FEX01FVEhPRF9JTlRFUk5BTAkJMHgwMgorCisjZGVmaW5lIEdCX0ZXX1VfTE9BRF9TVEFUVVNfRkFJTEVECQkweDAwCisjZGVmaW5lIEdCX0ZXX1VfTE9BRF9TVEFUVVNfVU5WQUxJREFURUQJCTB4MDEKKyNkZWZpbmUgR0JfRldfVV9MT0FEX1NUQVRVU19WQUxJREFURUQJCTB4MDIKKyNkZWZpbmUgR0JfRldfVV9MT0FEX1NUQVRVU19WQUxJREFUSU9OX0ZBSUxFRAkweDAzCisKKyNkZWZpbmUgR0JfRldfVV9CQUNLRU5EX0ZXX1NUQVRVU19TVUNDRVNTCTB4MDEKKyNkZWZpbmUgR0JfRldfVV9CQUNLRU5EX0ZXX1NUQVRVU19GQUlMX0ZJTkQJMHgwMgorI2RlZmluZSBHQl9GV19VX0JBQ0tFTkRfRldfU1RBVFVTX0ZBSUxfRkVUQ0gJMHgwMworI2RlZmluZSBHQl9GV19VX0JBQ0tFTkRfRldfU1RBVFVTX0ZBSUxfV1JJVEUJMHgwNAorI2RlZmluZSBHQl9GV19VX0JBQ0tFTkRfRldfU1RBVFVTX0lOVAkJMHgwNQorI2RlZmluZSBHQl9GV19VX0JBQ0tFTkRfRldfU1RBVFVTX1JFVFJZCQkweDA2CisjZGVmaW5lIEdCX0ZXX1VfQkFDS0VORF9GV19TVEFUVVNfTk9UX1NVUFBPUlRFRAkweDA3CisKKyNkZWZpbmUgR0JfRldfVV9CQUNLRU5EX1ZFUlNJT05fU1RBVFVTX1NVQ0NFU1MJCTB4MDEKKyNkZWZpbmUgR0JfRldfVV9CQUNLRU5EX1ZFUlNJT05fU1RBVFVTX05PVF9BVkFJTEFCTEUJMHgwMgorI2RlZmluZSBHQl9GV19VX0JBQ0tFTkRfVkVSU0lPTl9TVEFUVVNfTk9UX1NVUFBPUlRFRAkweDAzCisjZGVmaW5lIEdCX0ZXX1VfQkFDS0VORF9WRVJTSU9OX1NUQVRVU19SRVRSWQkJMHgwNAorI2RlZmluZSBHQl9GV19VX0JBQ0tFTkRfVkVSU0lPTl9TVEFUVVNfRkFJTF9JTlQJCTB4MDUKKworLyogSU9DVEwgc3VwcG9ydCAqLworc3RydWN0IGZ3X21nbXRfaW9jX2dldF9pbnRmX3ZlcnNpb24geworCV9fdTggZmlybXdhcmVfdGFnW0dCX0ZJUk1XQVJFX1VfVEFHX01BWF9TSVpFXTsKKwlfX3UxNiBtYWpvcjsKKwlfX3UxNiBtaW5vcjsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGZ3X21nbXRfaW9jX2dldF9iYWNrZW5kX3ZlcnNpb24geworCV9fdTggZmlybXdhcmVfdGFnW0dCX0ZJUk1XQVJFX1VfVEFHX01BWF9TSVpFXTsKKwlfX3UxNiBtYWpvcjsKKwlfX3UxNiBtaW5vcjsKKwlfX3U4IHN0YXR1czsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGZ3X21nbXRfaW9jX2ludGZfbG9hZF9hbmRfdmFsaWRhdGUgeworCV9fdTggZmlybXdhcmVfdGFnW0dCX0ZJUk1XQVJFX1VfVEFHX01BWF9TSVpFXTsKKwlfX3U4IGxvYWRfbWV0aG9kOworCV9fdTggc3RhdHVzOworCV9fdTE2IG1ham9yOworCV9fdTE2IG1pbm9yOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgZndfbWdtdF9pb2NfYmFja2VuZF9md191cGRhdGUgeworCV9fdTggZmlybXdhcmVfdGFnW0dCX0ZJUk1XQVJFX1VfVEFHX01BWF9TSVpFXTsKKwlfX3U4IHN0YXR1czsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBGV19NR01UX0lPQ1RMX0JBU0UJCQknRicKKyNkZWZpbmUgRldfTUdNVF9JT0NfR0VUX0lOVEZfRlcJCQlfSU9SKEZXX01HTVRfSU9DVExfQkFTRSwgMCwgc3RydWN0IGZ3X21nbXRfaW9jX2dldF9pbnRmX3ZlcnNpb24pCisjZGVmaW5lIEZXX01HTVRfSU9DX0dFVF9CQUNLRU5EX0ZXCQlfSU9XUihGV19NR01UX0lPQ1RMX0JBU0UsIDEsIHN0cnVjdCBmd19tZ210X2lvY19nZXRfYmFja2VuZF92ZXJzaW9uKQorI2RlZmluZSBGV19NR01UX0lPQ19JTlRGX0xPQURfQU5EX1ZBTElEQVRFCV9JT1dSKEZXX01HTVRfSU9DVExfQkFTRSwgMiwgc3RydWN0IGZ3X21nbXRfaW9jX2ludGZfbG9hZF9hbmRfdmFsaWRhdGUpCisjZGVmaW5lIEZXX01HTVRfSU9DX0lOVEZfQkFDS0VORF9GV19VUERBVEUJX0lPV1IoRldfTUdNVF9JT0NUTF9CQVNFLCAzLCBzdHJ1Y3QgZndfbWdtdF9pb2NfYmFja2VuZF9md191cGRhdGUpCisjZGVmaW5lIEZXX01HTVRfSU9DX1NFVF9USU1FT1VUX01TCQlfSU9XKEZXX01HTVRfSU9DVExfQkFTRSwgNCwgdW5zaWduZWQgaW50KQorI2RlZmluZSBGV19NR01UX0lPQ19NT0RFX1NXSVRDSAkJCV9JTyhGV19NR01UX0lPQ1RMX0JBU0UsIDUpCisKKyNlbmRpZiAvKiBfX0dSRVlCVVNfRklSTVdBUkVfVVNFUl9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dyZXlidXNfaWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dyZXlidXNfaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmIxZmMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3JleWJ1c19pZC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIEZJWE1FCisgKiBtb3ZlIHRoaXMgdG8gaW5jbHVkZS9saW51eC9tb2RfZGV2aWNldGFibGUuaCB3aGVuIG1lcmdpbmcKKyAqLworCisjaWZuZGVmIF9fTElOVVhfR1JFWUJVU19JRF9ICisjZGVmaW5lIF9fTElOVVhfR1JFWUJVU19JRF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorCisKK3N0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCB7CisJX191MTYJbWF0Y2hfZmxhZ3M7CisJX191MzIJdmVuZG9yOworCV9fdTMyCXByb2R1Y3Q7CisJX191OAljbGFzczsKKworCWtlcm5lbF91bG9uZ190CWRyaXZlcl9pbmZvIF9fYWxpZ25lZChzaXplb2Yoa2VybmVsX3Vsb25nX3QpKTsKK307CisKKy8qIFVzZWQgdG8gbWF0Y2ggdGhlIGdyZXlidXNfYnVuZGxlX2lkICovCisjZGVmaW5lIEdSRVlCVVNfSURfTUFUQ0hfVkVORE9SCQlCSVQoMCkKKyNkZWZpbmUgR1JFWUJVU19JRF9NQVRDSF9QUk9EVUNUCUJJVCgxKQorI2RlZmluZSBHUkVZQlVTX0lEX01BVENIX0NMQVNTCQlCSVQoMikKKworI2VuZGlmIC8qIF9fTElOVVhfR1JFWUJVU19JRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncmV5YnVzX21hbmlmZXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncmV5YnVzX21hbmlmZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzNTk0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dyZXlidXNfbWFuaWZlc3QuaApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIEdyZXlidXMgbWFuaWZlc3QgZGVmaW5pdGlvbgorICoKKyAqIFNlZSAiR3JleWJ1cyBBcHBsaWNhdGlvbiBQcm90b2NvbCIgZG9jdW1lbnQgKHZlcnNpb24gMC4xKSBmb3IKKyAqIGRldGFpbHMgb24gdGhlc2UgdmFsdWVzIGFuZCBzdHJ1Y3R1cmVzLgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgYW5kIEJTRCBsaWNlbnNlcy4KKyAqLworCisjaWZuZGVmIF9fR1JFWUJVU19NQU5JRkVTVF9ICisjZGVmaW5lIF9fR1JFWUJVU19NQU5JRkVTVF9ICisKK2VudW0gZ3JleWJ1c19kZXNjcmlwdG9yX3R5cGUgeworCUdSRVlCVVNfVFlQRV9JTlZBTElECQk9IDB4MDAsCisJR1JFWUJVU19UWVBFX0lOVEVSRkFDRQkJPSAweDAxLAorCUdSRVlCVVNfVFlQRV9TVFJJTkcJCT0gMHgwMiwKKwlHUkVZQlVTX1RZUEVfQlVORExFCQk9IDB4MDMsCisJR1JFWUJVU19UWVBFX0NQT1JUCQk9IDB4MDQsCit9OworCitlbnVtIGdyZXlidXNfcHJvdG9jb2wgeworCUdSRVlCVVNfUFJPVE9DT0xfQ09OVFJPTAk9IDB4MDAsCisJLyogMHgwMSBpcyB1bnVzZWQgKi8KKwlHUkVZQlVTX1BST1RPQ09MX0dQSU8JCT0gMHgwMiwKKwlHUkVZQlVTX1BST1RPQ09MX0kyQwkJPSAweDAzLAorCUdSRVlCVVNfUFJPVE9DT0xfVUFSVAkJPSAweDA0LAorCUdSRVlCVVNfUFJPVE9DT0xfSElECQk9IDB4MDUsCisJR1JFWUJVU19QUk9UT0NPTF9VU0IJCT0gMHgwNiwKKwlHUkVZQlVTX1BST1RPQ09MX1NESU8JCT0gMHgwNywKKwlHUkVZQlVTX1BST1RPQ09MX1BPV0VSX1NVUFBMWQk9IDB4MDgsCisJR1JFWUJVU19QUk9UT0NPTF9QV00JCT0gMHgwOSwKKwkvKiAweDBhIGlzIHVudXNlZCAqLworCUdSRVlCVVNfUFJPVE9DT0xfU1BJCQk9IDB4MGIsCisJR1JFWUJVU19QUk9UT0NPTF9ESVNQTEFZCT0gMHgwYywKKwlHUkVZQlVTX1BST1RPQ09MX0NBTUVSQV9NR01UCT0gMHgwZCwKKwlHUkVZQlVTX1BST1RPQ09MX1NFTlNPUgkJPSAweDBlLAorCUdSRVlCVVNfUFJPVE9DT0xfTElHSFRTCQk9IDB4MGYsCisJR1JFWUJVU19QUk9UT0NPTF9WSUJSQVRPUgk9IDB4MTAsCisJR1JFWUJVU19QUk9UT0NPTF9MT09QQkFDSwk9IDB4MTEsCisJR1JFWUJVU19QUk9UT0NPTF9BVURJT19NR01UCT0gMHgxMiwKKwlHUkVZQlVTX1BST1RPQ09MX0FVRElPX0RBVEEJPSAweDEzLAorCUdSRVlCVVNfUFJPVE9DT0xfU1ZDICAgICAgICAgICAgPSAweDE0LAorCUdSRVlCVVNfUFJPVE9DT0xfQk9PVFJPTQk9IDB4MTUsCisJR1JFWUJVU19QUk9UT0NPTF9DQU1FUkFfREFUQQk9IDB4MTYsCisJR1JFWUJVU19QUk9UT0NPTF9GV19ET1dOTE9BRAk9IDB4MTcsCisJR1JFWUJVU19QUk9UT0NPTF9GV19NQU5BR0VNRU5UCT0gMHgxOCwKKwlHUkVZQlVTX1BST1RPQ09MX0FVVEhFTlRJQ0FUSU9OCT0gMHgxOSwKKwlHUkVZQlVTX1BST1RPQ09MX0xPRwkJPSAweDFhLAorCQkvKiAuLi4gKi8KKwlHUkVZQlVTX1BST1RPQ09MX1JBVwkJPSAweGZlLAorCUdSRVlCVVNfUFJPVE9DT0xfVkVORE9SCQk9IDB4ZmYsCit9OworCitlbnVtIGdyZXlidXNfY2xhc3NfdHlwZSB7CisJR1JFWUJVU19DTEFTU19DT05UUk9MCQk9IDB4MDAsCisJLyogMHgwMSBpcyB1bnVzZWQgKi8KKwkvKiAweDAyIGlzIHVudXNlZCAqLworCS8qIDB4MDMgaXMgdW51c2VkICovCisJLyogMHgwNCBpcyB1bnVzZWQgKi8KKwlHUkVZQlVTX0NMQVNTX0hJRAkJPSAweDA1LAorCS8qIDB4MDYgaXMgdW51c2VkICovCisJLyogMHgwNyBpcyB1bnVzZWQgKi8KKwlHUkVZQlVTX0NMQVNTX1BPV0VSX1NVUFBMWQk9IDB4MDgsCisJLyogMHgwOSBpcyB1bnVzZWQgKi8KKwlHUkVZQlVTX0NMQVNTX0JSSURHRURfUEhZCT0gMHgwYSwKKwkvKiAweDBiIGlzIHVudXNlZCAqLworCUdSRVlCVVNfQ0xBU1NfRElTUExBWQkJPSAweDBjLAorCUdSRVlCVVNfQ0xBU1NfQ0FNRVJBCQk9IDB4MGQsCisJR1JFWUJVU19DTEFTU19TRU5TT1IJCT0gMHgwZSwKKwlHUkVZQlVTX0NMQVNTX0xJR0hUUwkJPSAweDBmLAorCUdSRVlCVVNfQ0xBU1NfVklCUkFUT1IJCT0gMHgxMCwKKwlHUkVZQlVTX0NMQVNTX0xPT1BCQUNLCQk9IDB4MTEsCisJR1JFWUJVU19DTEFTU19BVURJTwkJPSAweDEyLAorCS8qIDB4MTMgaXMgdW51c2VkICovCisJLyogMHgxNCBpcyB1bnVzZWQgKi8KKwlHUkVZQlVTX0NMQVNTX0JPT1RST00JCT0gMHgxNSwKKwlHUkVZQlVTX0NMQVNTX0ZXX01BTkFHRU1FTlQJPSAweDE2LAorCUdSRVlCVVNfQ0xBU1NfTE9HCQk9IDB4MTcsCisJCS8qIC4uLiAqLworCUdSRVlCVVNfQ0xBU1NfUkFXCQk9IDB4ZmUsCisJR1JFWUJVU19DTEFTU19WRU5ET1IJCT0gMHhmZiwKK307CisKK2VudW0geworCUdSRVlCVVNfSU5URVJGQUNFX0ZFQVRVUkVfVElNRVNZTkMgPSBCSVQoMCksCit9OworCisvKgorICogVGhlIHN0cmluZyBpbiBhIHN0cmluZyBkZXNjcmlwdG9yIGlzIG5vdCBOVUwtdGVybWluYXRlZC4gIFRoZQorICogc2l6ZSBvZiB0aGUgZGVzY3JpcHRvciB3aWxsIGJlIHJvdW5kZWQgdXAgdG8gYSBtdWx0aXBsZSBvZiA0CisgKiBieXRlcywgYnkgcGFkZGluZyB0aGUgc3RyaW5nIHdpdGggMHgwMCBieXRlcyBpZiBuZWNlc3NhcnkuCisgKi8KK3N0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3Jfc3RyaW5nIHsKKwlfX3U4CWxlbmd0aDsKKwlfX3U4CWlkOworCV9fdTgJc3RyaW5nWzBdOworfSBfX3BhY2tlZDsKKworLyoKKyAqIEFuIGludGVyZmFjZSBkZXNjcmlwdG9yIGRlc2NyaWJlcyBpbmZvcm1hdGlvbiBhYm91dCBhbiBpbnRlcmZhY2UgYXMgYSB3aG9sZSwKKyAqICpub3QqIHRoZSBmdW5jdGlvbnMgd2l0aGluIGl0LgorICovCitzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2ludGVyZmFjZSB7CisJX191OAl2ZW5kb3Jfc3RyaW5naWQ7CisJX191OAlwcm9kdWN0X3N0cmluZ2lkOworCV9fdTgJZmVhdHVyZXM7CisJX191OAlwYWQ7Cit9IF9fcGFja2VkOworCisvKgorICogQW4gYnVuZGxlIGRlc2NyaXB0b3IgZGVmaW5lcyBhbiBpZGVudGlmaWNhdGlvbiBudW1iZXIgYW5kIGEgY2xhc3MgZm9yCisgKiBlYWNoIGJ1bmRsZS4KKyAqCisgKiBAaWQ6IFVuaXF1ZWx5IGlkZW50aWZpZXMgYSBidW5kbGUgd2l0aGluIGEgaW50ZXJmYWNlLCBpdHMgc29sZSBwdXJwb3NlIGlzIHRvCisgKiBhbGxvdyBDUG9ydCBkZXNjcmlwdG9ycyB0byBzcGVjaWZ5IHdoaWNoIGJ1bmRsZSB0aGV5IGFyZSBhc3NvY2lhdGVkIHdpdGguCisgKiBUaGUgZmlyc3QgYnVuZGxlIHdpbGwgaGF2ZSBpZCAwLCBzZWNvbmQgd2lsbCBoYXZlIDEgYW5kIHNvIG9uLgorICoKKyAqIFRoZSBsYXJnZXN0IENQb3J0IGlkIGFzc29jaWF0ZWQgd2l0aCBhbiBidW5kbGUgKGRlZmluZWQgYnkgYQorICogQ1BvcnQgZGVzY3JpcHRvciBpbiB0aGUgbWFuaWZlc3QpIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdyB0bworICogZW5jb2RlIHRoZSBkZXZpY2UgaWQgYW5kIG1vZHVsZSBudW1iZXIgaW4gVW5pUHJvIHBhY2tldHMKKyAqIHRoYXQgdXNlIHRoZSBidW5kbGUuCisgKgorICogQGNsYXNzOiBJdCBpcyB1c2VkIGJ5IGtlcm5lbCB0byBrbm93IHRoZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IHRoZQorICogYnVuZGxlIGFuZCB3aWxsIGJlIG1hdGNoZWQgYWdhaW5zdCBkcml2ZXJzIGZ1bmN0aW5hbGl0eSB3aGlsZSBwcm9iaW5nIGdyZXlidXMKKyAqIGRyaXZlci4gSXQgc2hvdWxkIGNvbnRhaW4gb25lIG9mIHRoZSB2YWx1ZXMgZGVmaW5lZCBpbgorICogJ2VudW0gZ3JleWJ1c19jbGFzc190eXBlJy4KKyAqCisgKi8KK3N0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfYnVuZGxlIHsKKwlfX3U4CWlkOwkvKiBpbnRlcmZhY2UtcmVsYXRpdmUgaWQgKDAuLikgKi8KKwlfX3U4CWNsYXNzOworCV9fdTgJcGFkWzJdOworfSBfX3BhY2tlZDsKKworLyoKKyAqIEEgQ1BvcnQgZGVzY3JpcHRvciBpbmRpY2F0ZXMgdGhlIGlkIG9mIHRoZSBidW5kbGUgd2l0aGluIHRoZQorICogbW9kdWxlIGl0J3MgYXNzb2NpYXRlZCB3aXRoLCBhbG9uZyB3aXRoIHRoZSBDUG9ydCBpZCB1c2VkIHRvCisgKiBhZGRyZXNzIHRoZSBDUG9ydC4gIFRoZSBwcm90b2NvbCBpZCBkZWZpbmVzIHRoZSBmb3JtYXQgb2YgbWVzc2FnZXMKKyAqIGV4Y2hhbmdlZCB1c2luZyB0aGUgQ1BvcnQuCisgKi8KK3N0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfY3BvcnQgeworCV9fbGUxNglpZDsKKwlfX3U4CWJ1bmRsZTsKKwlfX3U4CXByb3RvY29sX2lkOwkvKiBlbnVtIGdyZXlidXNfcHJvdG9jb2wgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfaGVhZGVyIHsKKwlfX2xlMTYJc2l6ZTsKKwlfX3U4CXR5cGU7CQkvKiBlbnVtIGdyZXlidXNfZGVzY3JpcHRvcl90eXBlICovCisJX191OAlwYWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yIHsKKwlzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2hlYWRlcgkJaGVhZGVyOworCXVuaW9uIHsKKwkJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9zdHJpbmcJc3RyaW5nOworCQlzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2ludGVyZmFjZQlpbnRlcmZhY2U7CisJCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfYnVuZGxlCWJ1bmRsZTsKKwkJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9jcG9ydAkJY3BvcnQ7CisJfTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBncmV5YnVzX21hbmlmZXN0X2hlYWRlciB7CisJX19sZTE2CXNpemU7CisJX191OAl2ZXJzaW9uX21ham9yOworCV9fdTgJdmVyc2lvbl9taW5vcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBncmV5YnVzX21hbmlmZXN0IHsKKwlzdHJ1Y3QgZ3JleWJ1c19tYW5pZmVzdF9oZWFkZXIJCWhlYWRlcjsKKwlzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yCQlkZXNjcmlwdG9yc1swXTsKK30gX19wYWNrZWQ7CisKKyNlbmRpZiAvKiBfX0dSRVlCVVNfTUFOSUZFU1RfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3JleWJ1c19wcm90b2NvbHMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dyZXlidXNfcHJvdG9jb2xzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5NTc4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dyZXlidXNfcHJvdG9jb2xzLmgKQEAgLTAsMCArMSwyMjY4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMTQgLSAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQoYykgMjAxNCAtIDIwMTUgTGluYXJvIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMTQgLSAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQoYykgMjAxNCAtIDIwMTUgTGluYXJvIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBvciBMaW5hcm8gTHRkLiBub3IgdGhlIG5hbWVzIG9mCisgKiAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBHT09HTEUgSU5DLiBPUgorICogTElOQVJPIExURC4gQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfX0dSRVlCVVNfUFJPVE9DT0xTX0gKKyNkZWZpbmUgX19HUkVZQlVTX1BST1RPQ09MU19ICisKKy8qIEZpeGVkIElEcyBmb3IgY29udHJvbC9zdmMgcHJvdG9jb2xzICovCisKKy8qIFNWQyBzd2l0Y2gtcG9ydCBkZXZpY2UgaWRzICovCisjZGVmaW5lIEdCX1NWQ19ERVZJQ0VfSURfU1ZDCQkJMAorI2RlZmluZSBHQl9TVkNfREVWSUNFX0lEX0FQCQkJMQorI2RlZmluZSBHQl9TVkNfREVWSUNFX0lEX01JTgkJCTIKKyNkZWZpbmUgR0JfU1ZDX0RFVklDRV9JRF9NQVgJCQkzMQorCisjZGVmaW5lIEdCX1NWQ19DUE9SVF9JRAkJCQkwCisjZGVmaW5lIEdCX0NPTlRST0xfQlVORExFX0lECQkJMAorI2RlZmluZSBHQl9DT05UUk9MX0NQT1JUX0lECQkJMAorCisKKy8qCisgKiBBbGwgb3BlcmF0aW9uIG1lc3NhZ2VzIChib3RoIHJlcXVlc3RzIGFuZCByZXNwb25zZXMpIGJlZ2luIHdpdGgKKyAqIGEgaGVhZGVyIHRoYXQgZW5jb2RlcyB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZSAoaGVhZGVyIGluY2x1ZGVkKS4KKyAqIFRoaXMgaGVhZGVyIGFsc28gY29udGFpbnMgYSB1bmlxdWUgaWRlbnRpZmllciwgdGhhdCBhc3NvY2lhdGVzIGEKKyAqIHJlc3BvbnNlIG1lc3NhZ2Ugd2l0aCBpdHMgb3BlcmF0aW9uLiAgVGhlIGhlYWRlciBjb250YWlucyBhbgorICogb3BlcmF0aW9uIHR5cGUgZmllbGQsIHdob3NlIGludGVycHJldGF0aW9uIGlzIGRlcGVuZGVudCBvbiB3aGF0CisgKiB0eXBlIG9mIHByb3RvY29sIGlzIHVzZWQgb3ZlciB0aGUgY29ubmVjdGlvbi4gIFRoZSBoaWdoIGJpdAorICogKDB4ODApIG9mIHRoZSBvcGVyYXRpb24gdHlwZSBmaWVsZCBpcyB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIKKyAqIHRoZSBtZXNzYWdlIGlzIGEgcmVxdWVzdCAoY2xlYXIpIG9yIGEgcmVzcG9uc2UgKHNldCkuCisgKgorICogUmVzcG9uc2UgbWVzc2FnZXMgaW5jbHVkZSBhbiBhZGRpdGlvbmFsIHJlc3VsdCBieXRlLCB3aGljaAorICogY29tbXVuaWNhdGVzIHRoZSByZXN1bHQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcmVxdWVzdC4gIEEgemVybworICogcmVzdWx0IHZhbHVlIG1lYW5zIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4gIEFueQorICogb3RoZXIgdmFsdWUgaW5kaWNhdGVzIGFuIGVycm9yOyBpbiB0aGlzIGNhc2UsIHRoZSBwYXlsb2FkIG9mIHRoZQorICogcmVzcG9uc2UgbWVzc2FnZSAoaWYgYW55KSBpcyBpZ25vcmVkLiAgVGhlIHJlc3VsdCBieXRlIG11c3QgYmUKKyAqIHplcm8gaW4gdGhlIGhlYWRlciBmb3IgYSByZXF1ZXN0IG1lc3NhZ2UuCisgKgorICogVGhlIHdpcmUgZm9ybWF0IGZvciBhbGwgbnVtZXJpYyBmaWVsZHMgaW4gdGhlIGhlYWRlciBpcyBsaXR0bGUKKyAqIGVuZGlhbi4gIEFueSBvcGVyYXRpb24tc3BlY2lmaWMgZGF0YSBiZWdpbnMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCisgKiBoZWFkZXIuCisgKi8KK3N0cnVjdCBnYl9vcGVyYXRpb25fbXNnX2hkciB7CisJX19sZTE2CXNpemU7CQkvKiBTaXplIGluIGJ5dGVzIG9mIGhlYWRlciArIHBheWxvYWQgKi8KKwlfX2xlMTYJb3BlcmF0aW9uX2lkOwkvKiBPcGVyYXRpb24gdW5pcXVlIGlkICovCisJX191OAl0eXBlOwkJLyogRS5nIEdCX0kyQ19UWVBFXyogb3IgR0JfR1BJT19UWVBFXyogKi8KKwlfX3U4CXJlc3VsdDsJCS8qIFJlc3VsdCBvZiByZXF1ZXN0IChpbiByZXNwb25zZXMgb25seSkgKi8KKwlfX3U4CXBhZFsyXTsJCS8qIG11c3QgYmUgemVybyAoaWdub3JlIHdoZW4gcmVhZCkgKi8KK30gX19wYWNrZWQ7CisKKworLyogR2VuZXJpYyByZXF1ZXN0IHR5cGVzICovCisjZGVmaW5lIEdCX1JFUVVFU1RfVFlQRV9DUE9SVF9TSFVURE9XTgkJMHgwMAorI2RlZmluZSBHQl9SRVFVRVNUX1RZUEVfSU5WQUxJRAkJCTB4N2YKKworc3RydWN0IGdiX2Nwb3J0X3NodXRkb3duX3JlcXVlc3QgeworCV9fdTggcGhhc2U7Cit9IF9fcGFja2VkOworCisKKy8qIENvbnRyb2wgUHJvdG9jb2wgKi8KKworLyogR3JleWJ1cyBjb250cm9sIHJlcXVlc3QgdHlwZXMgKi8KKyNkZWZpbmUgR0JfQ09OVFJPTF9UWVBFX1ZFUlNJT04JCQkweDAxCisjZGVmaW5lIEdCX0NPTlRST0xfVFlQRV9QUk9CRV9BUAkJMHgwMgorI2RlZmluZSBHQl9DT05UUk9MX1RZUEVfR0VUX01BTklGRVNUX1NJWkUJMHgwMworI2RlZmluZSBHQl9DT05UUk9MX1RZUEVfR0VUX01BTklGRVNUCQkweDA0CisjZGVmaW5lIEdCX0NPTlRST0xfVFlQRV9DT05ORUNURUQJCTB4MDUKKyNkZWZpbmUgR0JfQ09OVFJPTF9UWVBFX0RJU0NPTk5FQ1RFRAkJMHgwNgorI2RlZmluZSBHQl9DT05UUk9MX1RZUEVfVElNRVNZTkNfRU5BQkxFCQkweDA3CisjZGVmaW5lIEdCX0NPTlRST0xfVFlQRV9USU1FU1lOQ19ESVNBQkxFCTB4MDgKKyNkZWZpbmUgR0JfQ09OVFJPTF9UWVBFX1RJTUVTWU5DX0FVVEhPUklUQVRJVkUJMHgwOQorLyoJVW51c2VkCQkJCQkweDBhICovCisjZGVmaW5lIEdCX0NPTlRST0xfVFlQRV9CVU5ETEVfVkVSU0lPTgkJMHgwYgorI2RlZmluZSBHQl9DT05UUk9MX1RZUEVfRElTQ09OTkVDVElORwkJMHgwYworI2RlZmluZSBHQl9DT05UUk9MX1RZUEVfVElNRVNZTkNfR0VUX0xBU1RfRVZFTlQJMHgwZAorI2RlZmluZSBHQl9DT05UUk9MX1RZUEVfTU9ERV9TV0lUQ0gJCTB4MGUKKyNkZWZpbmUgR0JfQ09OVFJPTF9UWVBFX0JVTkRMRV9TVVNQRU5ECQkweDBmCisjZGVmaW5lIEdCX0NPTlRST0xfVFlQRV9CVU5ETEVfUkVTVU1FCQkweDEwCisjZGVmaW5lIEdCX0NPTlRST0xfVFlQRV9CVU5ETEVfREVBQ1RJVkFURQkweDExCisjZGVmaW5lIEdCX0NPTlRST0xfVFlQRV9CVU5ETEVfQUNUSVZBVEUJCTB4MTIKKyNkZWZpbmUgR0JfQ09OVFJPTF9UWVBFX0lOVEZfU1VTUEVORF9QUkVQQVJFCQkweDEzCisjZGVmaW5lIEdCX0NPTlRST0xfVFlQRV9JTlRGX0RFQUNUSVZBVEVfUFJFUEFSRQkweDE0CisjZGVmaW5lIEdCX0NPTlRST0xfVFlQRV9JTlRGX0hJQkVSTkFURV9BQk9SVAkweDE1CisKK3N0cnVjdCBnYl9jb250cm9sX3ZlcnNpb25fcmVxdWVzdCB7CisJX191OAltYWpvcjsKKwlfX3U4CW1pbm9yOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2NvbnRyb2xfdmVyc2lvbl9yZXNwb25zZSB7CisJX191OAltYWpvcjsKKwlfX3U4CW1pbm9yOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2NvbnRyb2xfYnVuZGxlX3ZlcnNpb25fcmVxdWVzdCB7CisJX191OAlidW5kbGVfaWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfY29udHJvbF9idW5kbGVfdmVyc2lvbl9yZXNwb25zZSB7CisJX191OAltYWpvcjsKKwlfX3U4CW1pbm9yOworfSBfX3BhY2tlZDsKKworLyogQ29udHJvbCBwcm90b2NvbCBtYW5pZmVzdCBnZXQgc2l6ZSByZXF1ZXN0IGhhcyBubyBwYXlsb2FkKi8KK3N0cnVjdCBnYl9jb250cm9sX2dldF9tYW5pZmVzdF9zaXplX3Jlc3BvbnNlIHsKKwlfX2xlMTYJCQlzaXplOworfSBfX3BhY2tlZDsKKworLyogQ29udHJvbCBwcm90b2NvbCBtYW5pZmVzdCBnZXQgcmVxdWVzdCBoYXMgbm8gcGF5bG9hZCAqLworc3RydWN0IGdiX2NvbnRyb2xfZ2V0X21hbmlmZXN0X3Jlc3BvbnNlIHsKKwlfX3U4CQkJZGF0YVswXTsKK30gX19wYWNrZWQ7CisKKy8qIENvbnRyb2wgcHJvdG9jb2wgW2Rpc11jb25uZWN0ZWQgcmVxdWVzdCAqLworc3RydWN0IGdiX2NvbnRyb2xfY29ubmVjdGVkX3JlcXVlc3QgeworCV9fbGUxNgkJCWNwb3J0X2lkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2NvbnRyb2xfZGlzY29ubmVjdGluZ19yZXF1ZXN0IHsKKwlfX2xlMTYJCQljcG9ydF9pZDsKK30gX19wYWNrZWQ7CisvKiBkaXNjb25uZWN0aW5nIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKK3N0cnVjdCBnYl9jb250cm9sX2Rpc2Nvbm5lY3RlZF9yZXF1ZXN0IHsKKwlfX2xlMTYJCQljcG9ydF9pZDsKK30gX19wYWNrZWQ7CisvKiBDb250cm9sIHByb3RvY29sIFtkaXNdY29ubmVjdGVkIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKKyNkZWZpbmUgR0JfVElNRVNZTkNfTUFYX1NUUk9CRVMJCQkweDA0CisKK3N0cnVjdCBnYl9jb250cm9sX3RpbWVzeW5jX2VuYWJsZV9yZXF1ZXN0IHsKKwlfX3U4CWNvdW50OworCV9fbGU2NAlmcmFtZV90aW1lOworCV9fbGUzMglzdHJvYmVfZGVsYXk7CisJX19sZTMyCXJlZmNsazsKK30gX19wYWNrZWQ7CisvKiB0aW1lc3luYyBlbmFibGUgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworc3RydWN0IGdiX2NvbnRyb2xfdGltZXN5bmNfYXV0aG9yaXRhdGl2ZV9yZXF1ZXN0IHsKKwlfX2xlNjQJZnJhbWVfdGltZVtHQl9USU1FU1lOQ19NQVhfU1RST0JFU107Cit9IF9fcGFja2VkOworLyogdGltZXN5bmMgYXV0aG9yaXRhdGl2ZSByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCisvKiB0aW1lc3luYyBnZXRfbGFzdF9ldmVudF9yZXF1ZXN0IGhhcyBubyBwYXlsb2FkICovCitzdHJ1Y3QgZ2JfY29udHJvbF90aW1lc3luY19nZXRfbGFzdF9ldmVudF9yZXNwb25zZSB7CisJX19sZTY0CWZyYW1lX3RpbWU7Cit9IF9fcGFja2VkOworCisvKgorICogQWxsIEJ1bmRsZSBwb3dlciBtYW5hZ2VtZW50IG9wZXJhdGlvbnMgdXNlIHRoZSBzYW1lIHJlcXVlc3QgYW5kIHJlc3BvbnNlCisgKiBsYXlvdXQgYW5kIHN0YXR1cyBjb2Rlcy4KKyAqLworCisjZGVmaW5lIEdCX0NPTlRST0xfQlVORExFX1BNX09LCQkweDAwCisjZGVmaW5lIEdCX0NPTlRST0xfQlVORExFX1BNX0lOVkFMCTB4MDEKKyNkZWZpbmUgR0JfQ09OVFJPTF9CVU5ETEVfUE1fQlVTWQkweDAyCisjZGVmaW5lIEdCX0NPTlRST0xfQlVORExFX1BNX0ZBSUwJMHgwMworI2RlZmluZSBHQl9DT05UUk9MX0JVTkRMRV9QTV9OQQkJMHgwNAorCitzdHJ1Y3QgZ2JfY29udHJvbF9idW5kbGVfcG1fcmVxdWVzdCB7CisJX191OAlidW5kbGVfaWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfY29udHJvbF9idW5kbGVfcG1fcmVzcG9uc2UgeworCV9fdTgJc3RhdHVzOworfSBfX3BhY2tlZDsKKworLyoKKyAqIEludGVyZmFjZSBTdXNwZW5kIFByZXBhcmUgYW5kIERlYWN0aXZhdGUgUHJlcGFyZSBvcGVyYXRpb25zIHVzZSB0aGUgc2FtZQorICogcmVzcG9uc2UgbGF5b3V0IGFuZCBlcnJvciBjb2Rlcy4gRGVmaW5lIGEgc2luZ2xlIHJlc3BvbnNlIHN0cnVjdHVyZSBhbmQgcmV1c2UKKyAqIGl0LiBCb3RoIG9wZXJhdGlvbnMgaGF2ZSBubyBwYXlsb2FkLgorICovCisKKyNkZWZpbmUgR0JfQ09OVFJPTF9JTlRGX1BNX09LCQkweDAwCisjZGVmaW5lIEdCX0NPTlRST0xfSU5URl9QTV9CVVNZCQkweDAxCisjZGVmaW5lIEdCX0NPTlRST0xfSU5URl9QTV9OQQkJMHgwMgorCitzdHJ1Y3QgZ2JfY29udHJvbF9pbnRmX3BtX3Jlc3BvbnNlIHsKKwlfX3U4CXN0YXR1czsKK30gX19wYWNrZWQ7CisKKy8qIEFQQnJpZGdlIHByb3RvY29sICovCisKKy8qIHJlcXVlc3QgQVBCMSBsb2cgKi8KKyNkZWZpbmUgR0JfQVBCX1JFUVVFU1RfTE9HCQkJMHgwMgorCisvKiByZXF1ZXN0IHRvIG1hcCBhIGNwb3J0IHRvIGJ1bGsgaW4gYW5kIGJ1bGsgb3V0IGVuZHBvaW50cyAqLworI2RlZmluZSBHQl9BUEJfUkVRVUVTVF9FUF9NQVBQSU5HCQkweDAzCisKKy8qIHJlcXVlc3QgdG8gZ2V0IHRoZSBudW1iZXIgb2YgY3BvcnRzIGF2YWlsYWJsZSAqLworI2RlZmluZSBHQl9BUEJfUkVRVUVTVF9DUE9SVF9DT1VOVAkJMHgwNAorCisvKiByZXF1ZXN0IHRvIHJlc2V0IGEgY3BvcnQgc3RhdGUgKi8KKyNkZWZpbmUgR0JfQVBCX1JFUVVFU1RfUkVTRVRfQ1BPUlQJCTB4MDUKKworLyogcmVxdWVzdCB0byB0aW1lIHRoZSBsYXRlbmN5IG9mIG1lc3NhZ2VzIG9uIGEgZ2l2ZW4gY3BvcnQgKi8KKyNkZWZpbmUgR0JfQVBCX1JFUVVFU1RfTEFURU5DWV9UQUdfRU4JCTB4MDYKKyNkZWZpbmUgR0JfQVBCX1JFUVVFU1RfTEFURU5DWV9UQUdfRElTCQkweDA3CisKKy8qIHJlcXVlc3QgdG8gY29udHJvbCB0aGUgQ1NJIHRyYW5zbWl0dGVyICovCisjZGVmaW5lIEdCX0FQQl9SRVFVRVNUX0NTSV9UWF9DT05UUk9MCQkweDA4CisKKy8qIHJlcXVlc3QgdG8gY29udHJvbCBhdWRpbyBzdHJlYW1pbmcgKi8KKyNkZWZpbmUgR0JfQVBCX1JFUVVFU1RfQVVESU9fQ09OVFJPTAkJMHgwOQorCisvKiBUaW1lU3luYyByZXF1ZXN0cyAqLworI2RlZmluZSBHQl9BUEJfUkVRVUVTVF9USU1FU1lOQ19FTkFCTEUJCTB4MGQKKyNkZWZpbmUgR0JfQVBCX1JFUVVFU1RfVElNRVNZTkNfRElTQUJMRQkJMHgwZQorI2RlZmluZSBHQl9BUEJfUkVRVUVTVF9USU1FU1lOQ19BVVRIT1JJVEFUSVZFCTB4MGYKKyNkZWZpbmUgR0JfQVBCX1JFUVVFU1RfVElNRVNZTkNfR0VUX0xBU1RfRVZFTlQJMHgxMAorCisvKiByZXF1ZXN0cyB0byBzZXQgR3JleWJ1cyBDUG9ydCBmbGFncyAqLworI2RlZmluZSBHQl9BUEJfUkVRVUVTVF9DUE9SVF9GTEFHUwkJMHgxMQorCisvKiBBUlBDIHJlcXVlc3QgKi8KKyNkZWZpbmUgR0JfQVBCX1JFUVVFU1RfQVJQQ19SVU4JCQkweDEyCisKK3N0cnVjdCBnYl9hcGJfcmVxdWVzdF9jcG9ydF9mbGFncyB7CisJX19sZTMyCWZsYWdzOworI2RlZmluZSBHQl9BUEJfQ1BPUlRfRkxBR19DT05UUk9MCQkweDAxCisjZGVmaW5lIEdCX0FQQl9DUE9SVF9GTEFHX0hJR0hfUFJJTwkJMHgwMgorfSBfX3BhY2tlZDsKKworCisvKiBGaXJtd2FyZSBEb3dubG9hZCBQcm90b2NvbCAqLworCisvKiBSZXF1ZXN0IFR5cGVzICovCisjZGVmaW5lIEdCX0ZXX0RPV05MT0FEX1RZUEVfRklORF9GSVJNV0FSRQkweDAxCisjZGVmaW5lIEdCX0ZXX0RPV05MT0FEX1RZUEVfRkVUQ0hfRklSTVdBUkUJMHgwMgorI2RlZmluZSBHQl9GV19ET1dOTE9BRF9UWVBFX1JFTEVBU0VfRklSTVdBUkUJMHgwMworCisjZGVmaW5lIEdCX0ZJUk1XQVJFX1RBR19NQVhfU0laRQkJMTAKKworLyogZmlybXdhcmUgZG93bmxvYWQgZmluZCBmaXJtd2FyZSByZXF1ZXN0L3Jlc3BvbnNlICovCitzdHJ1Y3QgZ2JfZndfZG93bmxvYWRfZmluZF9maXJtd2FyZV9yZXF1ZXN0IHsKKwlfX3U4CQkJZmlybXdhcmVfdGFnW0dCX0ZJUk1XQVJFX1RBR19NQVhfU0laRV07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfZndfZG93bmxvYWRfZmluZF9maXJtd2FyZV9yZXNwb25zZSB7CisJX191OAkJCWZpcm13YXJlX2lkOworCV9fbGUzMgkJCXNpemU7Cit9IF9fcGFja2VkOworCisvKiBmaXJtd2FyZSBkb3dubG9hZCBmZXRjaCBmaXJtd2FyZSByZXF1ZXN0L3Jlc3BvbnNlICovCitzdHJ1Y3QgZ2JfZndfZG93bmxvYWRfZmV0Y2hfZmlybXdhcmVfcmVxdWVzdCB7CisJX191OAkJCWZpcm13YXJlX2lkOworCV9fbGUzMgkJCW9mZnNldDsKKwlfX2xlMzIJCQlzaXplOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2Z3X2Rvd25sb2FkX2ZldGNoX2Zpcm13YXJlX3Jlc3BvbnNlIHsKKwlfX3U4CQkJZGF0YVswXTsKK30gX19wYWNrZWQ7CisKKy8qIGZpcm13YXJlIGRvd25sb2FkIHJlbGVhc2UgZmlybXdhcmUgcmVxdWVzdCAqLworc3RydWN0IGdiX2Z3X2Rvd25sb2FkX3JlbGVhc2VfZmlybXdhcmVfcmVxdWVzdCB7CisJX191OAkJCWZpcm13YXJlX2lkOworfSBfX3BhY2tlZDsKKy8qIGZpcm13YXJlIGRvd25sb2FkIHJlbGVhc2UgZmlybXdhcmUgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworCisvKiBGaXJtd2FyZSBNYW5hZ2VtZW50IFByb3RvY29sICovCisKKy8qIFJlcXVlc3QgVHlwZXMgKi8KKyNkZWZpbmUgR0JfRldfTUdNVF9UWVBFX0lOVEVSRkFDRV9GV19WRVJTSU9OCTB4MDEKKyNkZWZpbmUgR0JfRldfTUdNVF9UWVBFX0xPQURfQU5EX1ZBTElEQVRFX0ZXCTB4MDIKKyNkZWZpbmUgR0JfRldfTUdNVF9UWVBFX0xPQURFRF9GVwkJMHgwMworI2RlZmluZSBHQl9GV19NR01UX1RZUEVfQkFDS0VORF9GV19WRVJTSU9OCTB4MDQKKyNkZWZpbmUgR0JfRldfTUdNVF9UWVBFX0JBQ0tFTkRfRldfVVBEQVRFCTB4MDUKKyNkZWZpbmUgR0JfRldfTUdNVF9UWVBFX0JBQ0tFTkRfRldfVVBEQVRFRAkweDA2CisKKyNkZWZpbmUgR0JfRldfTE9BRF9NRVRIT0RfVU5JUFJPCQkweDAxCisjZGVmaW5lIEdCX0ZXX0xPQURfTUVUSE9EX0lOVEVSTkFMCQkweDAyCisKKyNkZWZpbmUgR0JfRldfTE9BRF9TVEFUVVNfRkFJTEVECQkweDAwCisjZGVmaW5lIEdCX0ZXX0xPQURfU1RBVFVTX1VOVkFMSURBVEVECQkweDAxCisjZGVmaW5lIEdCX0ZXX0xPQURfU1RBVFVTX1ZBTElEQVRFRAkJMHgwMgorI2RlZmluZSBHQl9GV19MT0FEX1NUQVRVU19WQUxJREFUSU9OX0ZBSUxFRAkweDAzCisKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9GV19TVEFUVVNfU1VDQ0VTUwkJMHgwMQorI2RlZmluZSBHQl9GV19CQUNLRU5EX0ZXX1NUQVRVU19GQUlMX0ZJTkQJMHgwMgorI2RlZmluZSBHQl9GV19CQUNLRU5EX0ZXX1NUQVRVU19GQUlMX0ZFVENICTB4MDMKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9GV19TVEFUVVNfRkFJTF9XUklURQkweDA0CisjZGVmaW5lIEdCX0ZXX0JBQ0tFTkRfRldfU1RBVFVTX0lOVAkJMHgwNQorI2RlZmluZSBHQl9GV19CQUNLRU5EX0ZXX1NUQVRVU19SRVRSWQkJMHgwNgorI2RlZmluZSBHQl9GV19CQUNLRU5EX0ZXX1NUQVRVU19OT1RfU1VQUE9SVEVECTB4MDcKKworI2RlZmluZSBHQl9GV19CQUNLRU5EX1ZFUlNJT05fU1RBVFVTX1NVQ0NFU1MJCTB4MDEKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9WRVJTSU9OX1NUQVRVU19OT1RfQVZBSUxBQkxFCTB4MDIKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9WRVJTSU9OX1NUQVRVU19OT1RfU1VQUE9SVEVECTB4MDMKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9WRVJTSU9OX1NUQVRVU19SRVRSWQkJMHgwNAorI2RlZmluZSBHQl9GV19CQUNLRU5EX1ZFUlNJT05fU1RBVFVTX0ZBSUxfSU5UCQkweDA1CisKKy8qIGZpcm13YXJlIG1hbmFnZW1lbnQgaW50ZXJmYWNlIGZpcm13YXJlIHZlcnNpb24gcmVxdWVzdCBoYXMgbm8gcGF5bG9hZCAqLworc3RydWN0IGdiX2Z3X21nbXRfaW50ZXJmYWNlX2Z3X3ZlcnNpb25fcmVzcG9uc2UgeworCV9fdTgJCQlmaXJtd2FyZV90YWdbR0JfRklSTVdBUkVfVEFHX01BWF9TSVpFXTsKKwlfX2xlMTYJCQltYWpvcjsKKwlfX2xlMTYJCQltaW5vcjsKK30gX19wYWNrZWQ7CisKKy8qIGZpcm13YXJlIG1hbmFnZW1lbnQgbG9hZCBhbmQgdmFsaWRhdGUgZmlybXdhcmUgcmVxdWVzdC9yZXNwb25zZSAqLworc3RydWN0IGdiX2Z3X21nbXRfbG9hZF9hbmRfdmFsaWRhdGVfZndfcmVxdWVzdCB7CisJX191OAkJCXJlcXVlc3RfaWQ7CisJX191OAkJCWxvYWRfbWV0aG9kOworCV9fdTgJCQlmaXJtd2FyZV90YWdbR0JfRklSTVdBUkVfVEFHX01BWF9TSVpFXTsKK30gX19wYWNrZWQ7CisvKiBmaXJtd2FyZSBtYW5hZ2VtZW50IGxvYWQgYW5kIHZhbGlkYXRlIGZpcm13YXJlIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkKi8KKworLyogZmlybXdhcmUgbWFuYWdlbWVudCBsb2FkZWQgZmlybXdhcmUgcmVxdWVzdCAqLworc3RydWN0IGdiX2Z3X21nbXRfbG9hZGVkX2Z3X3JlcXVlc3QgeworCV9fdTgJCQlyZXF1ZXN0X2lkOworCV9fdTgJCQlzdGF0dXM7CisJX19sZTE2CQkJbWFqb3I7CisJX19sZTE2CQkJbWlub3I7Cit9IF9fcGFja2VkOworLyogZmlybXdhcmUgbWFuYWdlbWVudCBsb2FkZWQgZmlybXdhcmUgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworLyogZmlybXdhcmUgbWFuYWdlbWVudCBiYWNrZW5kIGZpcm13YXJlIHZlcnNpb24gcmVxdWVzdC9yZXNwb25zZSAqLworc3RydWN0IGdiX2Z3X21nbXRfYmFja2VuZF9md192ZXJzaW9uX3JlcXVlc3QgeworCV9fdTgJCQlmaXJtd2FyZV90YWdbR0JfRklSTVdBUkVfVEFHX01BWF9TSVpFXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9md19tZ210X2JhY2tlbmRfZndfdmVyc2lvbl9yZXNwb25zZSB7CisJX19sZTE2CQkJbWFqb3I7CisJX19sZTE2CQkJbWlub3I7CisJX191OAkJCXN0YXR1czsKK30gX19wYWNrZWQ7CisKKy8qIGZpcm13YXJlIG1hbmFnZW1lbnQgYmFja2VuZCBmaXJtd2FyZSB1cGRhdGUgcmVxdWVzdCAqLworc3RydWN0IGdiX2Z3X21nbXRfYmFja2VuZF9md191cGRhdGVfcmVxdWVzdCB7CisJX191OAkJCXJlcXVlc3RfaWQ7CisJX191OAkJCWZpcm13YXJlX3RhZ1tHQl9GSVJNV0FSRV9UQUdfTUFYX1NJWkVdOworfSBfX3BhY2tlZDsKKy8qIGZpcm13YXJlIG1hbmFnZW1lbnQgYmFja2VuZCBmaXJtd2FyZSB1cGRhdGUgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworLyogZmlybXdhcmUgbWFuYWdlbWVudCBiYWNrZW5kIGZpcm13YXJlIHVwZGF0ZWQgcmVxdWVzdCAqLworc3RydWN0IGdiX2Z3X21nbXRfYmFja2VuZF9md191cGRhdGVkX3JlcXVlc3QgeworCV9fdTgJCQlyZXF1ZXN0X2lkOworCV9fdTgJCQlzdGF0dXM7Cit9IF9fcGFja2VkOworLyogZmlybXdhcmUgbWFuYWdlbWVudCBiYWNrZW5kIGZpcm13YXJlIHVwZGF0ZWQgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworCisvKiBDb21wb25lbnQgQXV0aGVudGljYXRpb24gUHJvdG9jb2wgKENBUCkgKi8KKworLyogUmVxdWVzdCBUeXBlcyAqLworI2RlZmluZSBHQl9DQVBfVFlQRV9HRVRfRU5EUE9JTlRfVUlECTB4MDEKKyNkZWZpbmUgR0JfQ0FQX1RZUEVfR0VUX0lNU19DRVJUSUZJQ0FURQkweDAyCisjZGVmaW5lIEdCX0NBUF9UWVBFX0FVVEhFTlRJQ0FURQkweDAzCisKKy8qIENBUCBnZXQgZW5kcG9pbnQgdWlkIHJlcXVlc3QgaGFzIG5vIHBheWxvYWQgKi8KK3N0cnVjdCBnYl9jYXBfZ2V0X2VuZHBvaW50X3VpZF9yZXNwb25zZSB7CisJX191OAkJCXVpZFs4XTsKK30gX19wYWNrZWQ7CisKKy8qIENBUCBnZXQgZW5kcG9pbnQgaW1zIGNlcnRpZmljYXRlIHJlcXVlc3QvcmVzcG9uc2UgKi8KK3N0cnVjdCBnYl9jYXBfZ2V0X2ltc19jZXJ0aWZpY2F0ZV9yZXF1ZXN0IHsKKwlfX2xlMzIJCQljZXJ0aWZpY2F0ZV9jbGFzczsKKwlfX2xlMzIJCQljZXJ0aWZpY2F0ZV9pZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9jYXBfZ2V0X2ltc19jZXJ0aWZpY2F0ZV9yZXNwb25zZSB7CisJX191OAkJCXJlc3VsdF9jb2RlOworCV9fdTgJCQljZXJ0aWZpY2F0ZVswXTsKK30gX19wYWNrZWQ7CisKKy8qIENBUCBhdXRoZW50aWNhdGUgcmVxdWVzdC9yZXNwb25zZSAqLworc3RydWN0IGdiX2NhcF9hdXRoZW50aWNhdGVfcmVxdWVzdCB7CisJX19sZTMyCQkJYXV0aF90eXBlOworCV9fdTgJCQl1aWRbOF07CisJX191OAkJCWNoYWxsZW5nZVszMl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfY2FwX2F1dGhlbnRpY2F0ZV9yZXNwb25zZSB7CisJX191OAkJCXJlc3VsdF9jb2RlOworCV9fdTgJCQlyZXNwb25zZVs2NF07CisJX191OAkJCXNpZ25hdHVyZVswXTsKK30gX19wYWNrZWQ7CisKKworLyogQm9vdHJvbSBQcm90b2NvbCAqLworCisvKiBWZXJzaW9uIG9mIHRoZSBHcmV5YnVzIGJvb3Ryb20gcHJvdG9jb2wgd2Ugc3VwcG9ydCAqLworI2RlZmluZSBHQl9CT09UUk9NX1ZFUlNJT05fTUFKT1IJCTB4MDAKKyNkZWZpbmUgR0JfQk9PVFJPTV9WRVJTSU9OX01JTk9SCQkweDAxCisKKy8qIEdyZXlidXMgYm9vdHJvbSByZXF1ZXN0IHR5cGVzICovCisjZGVmaW5lIEdCX0JPT1RST01fVFlQRV9WRVJTSU9OCQkJMHgwMQorI2RlZmluZSBHQl9CT09UUk9NX1RZUEVfRklSTVdBUkVfU0laRQkJMHgwMgorI2RlZmluZSBHQl9CT09UUk9NX1RZUEVfR0VUX0ZJUk1XQVJFCQkweDAzCisjZGVmaW5lIEdCX0JPT1RST01fVFlQRV9SRUFEWV9UT19CT09UCQkweDA0CisjZGVmaW5lIEdCX0JPT1RST01fVFlQRV9BUF9SRUFEWQkJMHgwNQkvKiBSZXF1ZXN0IHdpdGggbm8tcGF5bG9hZCAqLworI2RlZmluZSBHQl9CT09UUk9NX1RZUEVfR0VUX1ZJRF9QSUQJCTB4MDYJLyogUmVxdWVzdCB3aXRoIG5vLXBheWxvYWQgKi8KKworLyogR3JleWJ1cyBib290cm9tIGJvb3Qgc3RhZ2VzICovCisjZGVmaW5lIEdCX0JPT1RST01fQk9PVF9TVEFHRV9PTkUJCTB4MDEgLyogUmVzZXJ2ZWQgZm9yIHRoZSBib290IFJPTSAqLworI2RlZmluZSBHQl9CT09UUk9NX0JPT1RfU1RBR0VfVFdPCQkweDAyIC8qIEJvb3Ryb20gcGFja2FnZSB0byBiZSBsb2FkZWQgYnkgdGhlIGJvb3QgUk9NICovCisjZGVmaW5lIEdCX0JPT1RST01fQk9PVF9TVEFHRV9USFJFRQkJMHgwMyAvKiBNb2R1bGUgcGVyc29uYWxpdHkgcGFja2FnZSBsb2FkZWQgYnkgU3RhZ2UgMiBmaXJtd2FyZSAqLworCisvKiBHcmV5YnVzIGJvb3Ryb20gcmVhZHkgdG8gYm9vdCBzdGF0dXMgKi8KKyNkZWZpbmUgR0JfQk9PVFJPTV9CT09UX1NUQVRVU19JTlZBTElECQkweDAwIC8qIEZpcm13YXJlIGJsb2IgY291bGQgbm90IGJlIHZhbGlkYXRlZCAqLworI2RlZmluZSBHQl9CT09UUk9NX0JPT1RfU1RBVFVTX0lOU0VDVVJFCQkweDAxIC8qIEZpcm13YXJlIGJsb2IgaXMgdmFsaWQgYnV0IGluc2VjdXJlICovCisjZGVmaW5lIEdCX0JPT1RST01fQk9PVF9TVEFUVVNfU0VDVVJFCQkweDAyIC8qIEZpcm13YXJlIGJsb2IgaXMgdmFsaWQgYW5kIHNlY3VyZSAqLworCisvKiBNYXggYm9vdHJvbSBkYXRhIGZldGNoIHNpemUgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgR0JfQk9PVFJPTV9GRVRDSF9NQVgJCQkyMDAwCisKK3N0cnVjdCBnYl9ib290cm9tX3ZlcnNpb25fcmVxdWVzdCB7CisJX191OAltYWpvcjsKKwlfX3U4CW1pbm9yOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2Jvb3Ryb21fdmVyc2lvbl9yZXNwb25zZSB7CisJX191OAltYWpvcjsKKwlfX3U4CW1pbm9yOworfSBfX3BhY2tlZDsKKworLyogQm9vdHJvbSBwcm90b2NvbCBmaXJtd2FyZSBzaXplIHJlcXVlc3QvcmVzcG9uc2UgKi8KK3N0cnVjdCBnYl9ib290cm9tX2Zpcm13YXJlX3NpemVfcmVxdWVzdCB7CisJX191OAkJCXN0YWdlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2Jvb3Ryb21fZmlybXdhcmVfc2l6ZV9yZXNwb25zZSB7CisJX19sZTMyCQkJc2l6ZTsKK30gX19wYWNrZWQ7CisKKy8qIEJvb3Ryb20gcHJvdG9jb2wgZ2V0IGZpcm13YXJlIHJlcXVlc3QvcmVzcG9uc2UgKi8KK3N0cnVjdCBnYl9ib290cm9tX2dldF9maXJtd2FyZV9yZXF1ZXN0IHsKKwlfX2xlMzIJCQlvZmZzZXQ7CisJX19sZTMyCQkJc2l6ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9ib290cm9tX2dldF9maXJtd2FyZV9yZXNwb25zZSB7CisJX191OAkJCWRhdGFbMF07Cit9IF9fcGFja2VkOworCisvKiBCb290cm9tIHByb3RvY29sIFJlYWR5IHRvIGJvb3QgcmVxdWVzdCAqLworc3RydWN0IGdiX2Jvb3Ryb21fcmVhZHlfdG9fYm9vdF9yZXF1ZXN0IHsKKwlfX3U4CQkJc3RhdHVzOworfSBfX3BhY2tlZDsKKy8qIEJvb3Ryb20gcHJvdG9jb2wgUmVhZHkgdG8gYm9vdCByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCisvKiBCb290cm9tIHByb3RvY29sIGdldCBWSUQvUElEIHJlcXVlc3QgaGFzIG5vIHBheWxvYWQgKi8KK3N0cnVjdCBnYl9ib290cm9tX2dldF92aWRfcGlkX3Jlc3BvbnNlIHsKKwlfX2xlMzIJCQl2ZW5kb3JfaWQ7CisJX19sZTMyCQkJcHJvZHVjdF9pZDsKK30gX19wYWNrZWQ7CisKKworLyogUG93ZXIgU3VwcGx5ICovCisKKy8qIEdyZXlidXMgcG93ZXIgc3VwcGx5IHJlcXVlc3QgdHlwZXMgKi8KKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1RZUEVfR0VUX1NVUFBMSUVTCQkweDAyCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9UWVBFX0dFVF9ERVNDUklQVElPTgkJMHgwMworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfVFlQRV9HRVRfUFJPUF9ERVNDUklQVE9SUwkweDA0CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9UWVBFX0dFVF9QUk9QRVJUWQkJMHgwNQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfVFlQRV9TRVRfUFJPUEVSVFkJCTB4MDYKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1RZUEVfRVZFTlQJCQkweDA3CisKKy8qIEdyZXlidXMgcG93ZXIgc3VwcGx5IGJhdHRlcnkgdGVjaG5vbG9naWVzIHR5cGVzICovCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9URUNIX1VOS05PV04JCQkweDAwMDAKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1RFQ0hfTmlNSAkJCTB4MDAwMQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfVEVDSF9MSU9OCQkJMHgwMDAyCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9URUNIX0xJUE8JCQkweDAwMDMKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1RFQ0hfTGlGZQkJCTB4MDAwNAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfVEVDSF9OaUNkCQkJMHgwMDA1CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9URUNIX0xpTW4JCQkweDAwMDYKKworLyogR3JleWJ1cyBwb3dlciBzdXBwbHkgdHlwZXMgKi8KKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1VOS05PV05fVFlQRQkJCTB4MDAwMAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfQkFUVEVSWV9UWVBFCQkJMHgwMDAxCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9VUFNfVFlQRQkJCTB4MDAwMgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfTUFJTlNfVFlQRQkJCTB4MDAwMworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfVVNCX1RZUEUJCQkweDAwMDQKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1VTQl9EQ1BfVFlQRQkJCTB4MDAwNQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfVVNCX0NEUF9UWVBFCQkJMHgwMDA2CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9VU0JfQUNBX1RZUEUJCQkweDAwMDcKKworLyogR3JleWJ1cyBwb3dlciBzdXBwbHkgaGVhbHRoIHZhbHVlcyAqLworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfSEVBTFRIX1VOS05PV04JCQkweDAwMDAKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX0hFQUxUSF9HT09ECQkJMHgwMDAxCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUkhFQVQJCQkweDAwMDIKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFECQkJMHgwMDAzCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0UJCTB4MDAwNAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFCQkweDAwMDUKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX0hFQUxUSF9DT0xECQkJMHgwMDA2CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9IRUFMVEhfV0FUQ0hET0dfVElNRVJfRVhQSVJFCTB4MDAwNworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfSEVBTFRIX1NBRkVUWV9USU1FUl9FWFBJUkUJMHgwMDA4CisKKy8qIEdyZXlidXMgcG93ZXIgc3VwcGx5IHN0YXR1cyB2YWx1ZXMgKi8KKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOCQkJMHgwMDAwCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkcJCQkweDAwMDEKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORwkJMHgwMDAyCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HCQkweDAwMDMKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMCQkJMHgwMDA0CisKKy8qIEdyZXlidXMgcG93ZXIgc3VwcGx5IGNhcGFjaXR5IGxldmVsIHZhbHVlcyAqLworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfVU5LTk9XTgkJMHgwMDAwCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9DUklUSUNBTAkJMHgwMDAxCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9MT1cJCTB4MDAwMgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfTk9STUFMCQkweDAwMDMKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0hJR0gJCTB4MDAwNAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfRlVMTAkJMHgwMDA1CisKKy8qIEdyZXlidXMgcG93ZXIgc3VwcGx5IHNjb3BlIHZhbHVlcyAqLworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfU0NPUEVfVU5LTk9XTgkJCTB4MDAwMAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfU0NPUEVfU1lTVEVNCQkJMHgwMDAxCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9TQ09QRV9ERVZJQ0UJCQkweDAwMDIKKworc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9nZXRfc3VwcGxpZXNfcmVzcG9uc2UgeworCV9fdTgJc3VwcGxpZXNfY291bnQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X2dldF9kZXNjcmlwdGlvbl9yZXF1ZXN0IHsKKwlfX3U4CXBzeV9pZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9wb3dlcl9zdXBwbHlfZ2V0X2Rlc2NyaXB0aW9uX3Jlc3BvbnNlIHsKKwlfX3U4CW1hbnVmYWN0dXJlclszMl07CisJX191OAltb2RlbFszMl07CisJX191OAlzZXJpYWxfbnVtYmVyWzMyXTsKKwlfX2xlMTYJdHlwZTsKKwlfX3U4CXByb3BlcnRpZXNfY291bnQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X3Byb3BzX2Rlc2MgeworCV9fdTgJcHJvcGVydHk7CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUwkJCQkweDAwCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9UWVBFCQkJMHgwMQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgJCQkJMHgwMgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UCQkJCTB4MDMKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfT05MSU5FCQkJCTB4MDQKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfQVVUSEVOVElDCQkJCTB4MDUKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWQkJCQkweDA2CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NZQ0xFX0NPVU5UCQkJMHgwNworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWAkJCTB4MDgKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU4JCQkweDA5CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTgkJCTB4MEEKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOCQkJMHgwQgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVwkJCTB4MEMKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9BVkcJCQkweDBECisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfT0NWCQkJMHgwRQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX0JPT1QJCQkweDBGCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTUFYCQkJMHgxMAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVwkJCTB4MTEKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9BVkcJCQkweDEyCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQk9PVAkJCTB4MTMKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfUE9XRVJfTk9XCQkJCTB4MTQKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfUE9XRVJfQVZHCQkJCTB4MTUKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOCQkJMHgxNgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRU1QVFlfREVTSUdOCQkweDE3CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMCQkJMHgxOAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRU1QVFkJCQkweDE5CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1cJCQkJMHgxQQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQVZHCQkJCTB4MUIKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0NPVU5URVIJCQkweDFDCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UCQkweDFECisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UX01BWAkweDFFCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFCQkweDFGCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFX01BWAkweDIwCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9DT05UUk9MX0xJTUlUCQkweDIxCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9DT05UUk9MX0xJTUlUX01BWAkJMHgyMgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJTUlUCQkweDIzCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9GVUxMX0RFU0lHTgkJCTB4MjQKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0VNUFRZX0RFU0lHTgkJMHgyNQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTAkJCTB4MjYKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0VNUFRZCQkJMHgyNworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfTk9XCQkJCTB4MjgKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0FWRwkJCQkweDI5CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZCQkJCTB4MkEKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfQUxFUlRfTUlOCQkJMHgyQgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9BTEVSVF9NQVgJCQkweDJDCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0xFVkVMCQkJMHgyRAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9URU1QCQkJCTB4MkUKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfVEVNUF9NQVgJCQkJMHgyRgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9URU1QX01JTgkJCQkweDMwCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUlOCQkJMHgzMQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FMRVJUX01BWAkJCTB4MzIKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTUJJRU5UCQkJMHgzMworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FNQklFTlRfQUxFUlRfTUlOCQkweDM0CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQU1CSUVOVF9BTEVSVF9NQVgJCTB4MzUKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19FTVBUWV9OT1cJCQkweDM2CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfQVZHCQkJMHgzNworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0ZVTExfTk9XCQkJMHgzOAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0ZVTExfQVZHCQkJMHgzOQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9UWVBFCQkJCTB4M0EKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfU0NPUEUJCQkJMHgzQgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVEVSTV9DVVJSRU5UCQkweDNDCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NBTElCUkFURQkJCQkweDNECisJX191OAlpc193cml0ZWFibGU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eV9kZXNjcmlwdG9yc19yZXF1ZXN0IHsKKwlfX3U4CXBzeV9pZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9wb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5X2Rlc2NyaXB0b3JzX3Jlc3BvbnNlIHsKKwlfX3U4CXByb3BlcnRpZXNfY291bnQ7CisJc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9wcm9wc19kZXNjIHByb3BzW107Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eV9yZXF1ZXN0IHsKKwlfX3U4CXBzeV9pZDsKKwlfX3U4CXByb3BlcnR5OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9nZXRfcHJvcGVydHlfcmVzcG9uc2UgeworCV9fbGUzMglwcm9wX3ZhbDsKK307CisKK3N0cnVjdCBnYl9wb3dlcl9zdXBwbHlfc2V0X3Byb3BlcnR5X3JlcXVlc3QgeworCV9fdTgJcHN5X2lkOworCV9fdTgJcHJvcGVydHk7CisJX19sZTMyCXByb3BfdmFsOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9ldmVudF9yZXF1ZXN0IHsKKwlfX3U4CXBzeV9pZDsKKwlfX3U4CWV2ZW50OworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfVVBEQVRFCQkweDAxCit9IF9fcGFja2VkOworCisKKy8qIEhJRCAqLworCisvKiBHcmV5YnVzIEhJRCBvcGVyYXRpb24gdHlwZXMgKi8KKyNkZWZpbmUgR0JfSElEX1RZUEVfR0VUX0RFU0MJCTB4MDIKKyNkZWZpbmUgR0JfSElEX1RZUEVfR0VUX1JFUE9SVF9ERVNDCTB4MDMKKyNkZWZpbmUgR0JfSElEX1RZUEVfUFdSX09OCQkweDA0CisjZGVmaW5lIEdCX0hJRF9UWVBFX1BXUl9PRkYJCTB4MDUKKyNkZWZpbmUgR0JfSElEX1RZUEVfR0VUX1JFUE9SVAkJMHgwNgorI2RlZmluZSBHQl9ISURfVFlQRV9TRVRfUkVQT1JUCQkweDA3CisjZGVmaW5lIEdCX0hJRF9UWVBFX0lSUV9FVkVOVAkJMHgwOAorCisvKiBSZXBvcnQgdHlwZSAqLworI2RlZmluZSBHQl9ISURfSU5QVVRfUkVQT1JUCQkwCisjZGVmaW5lIEdCX0hJRF9PVVRQVVRfUkVQT1JUCQkxCisjZGVmaW5lIEdCX0hJRF9GRUFUVVJFX1JFUE9SVAkJMgorCisvKiBEaWZmZXJlbnQgcmVxdWVzdC9yZXNwb25zZSBzdHJ1Y3R1cmVzICovCisvKiBISUQgZ2V0IGRlc2NyaXB0b3IgcmVzcG9uc2UgKi8KK3N0cnVjdCBnYl9oaWRfZGVzY19yZXNwb25zZSB7CisJX191OAkJCQliTGVuZ3RoOworCV9fbGUxNgkJCQl3UmVwb3J0RGVzY0xlbmd0aDsKKwlfX2xlMTYJCQkJYmNkSElEOworCV9fbGUxNgkJCQl3UHJvZHVjdElEOworCV9fbGUxNgkJCQl3VmVuZG9ySUQ7CisJX191OAkJCQliQ291bnRyeUNvZGU7Cit9IF9fcGFja2VkOworCisvKiBISUQgZ2V0IHJlcG9ydCByZXF1ZXN0L3Jlc3BvbnNlICovCitzdHJ1Y3QgZ2JfaGlkX2dldF9yZXBvcnRfcmVxdWVzdCB7CisJX191OAkJCQlyZXBvcnRfdHlwZTsKKwlfX3U4CQkJCXJlcG9ydF9pZDsKK30gX19wYWNrZWQ7CisKKy8qIEhJRCBzZXQgcmVwb3J0IHJlcXVlc3QgKi8KK3N0cnVjdCBnYl9oaWRfc2V0X3JlcG9ydF9yZXF1ZXN0IHsKKwlfX3U4CQkJCXJlcG9ydF90eXBlOworCV9fdTgJCQkJcmVwb3J0X2lkOworCV9fdTgJCQkJcmVwb3J0WzBdOworfSBfX3BhY2tlZDsKKworLyogSElEIGlucHV0IHJlcG9ydCByZXF1ZXN0LCB2aWEgaW50ZXJydXB0IHBpcGUgKi8KK3N0cnVjdCBnYl9oaWRfaW5wdXRfcmVwb3J0X3JlcXVlc3QgeworCV9fdTgJCQkJcmVwb3J0WzBdOworfSBfX3BhY2tlZDsKKworCisvKiBJMkMgKi8KKworLyogR3JleWJ1cyBpMmMgcmVxdWVzdCB0eXBlcyAqLworI2RlZmluZSBHQl9JMkNfVFlQRV9GVU5DVElPTkFMSVRZCTB4MDIKKyNkZWZpbmUgR0JfSTJDX1RZUEVfVFJBTlNGRVIJCTB4MDUKKworLyogZnVuY3Rpb25hbGl0eSByZXF1ZXN0IGhhcyBubyBwYXlsb2FkICovCitzdHJ1Y3QgZ2JfaTJjX2Z1bmN0aW9uYWxpdHlfcmVzcG9uc2UgeworCV9fbGUzMglmdW5jdGlvbmFsaXR5OworfSBfX3BhY2tlZDsKKworLyoKKyAqIE91dGdvaW5nIGRhdGEgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgb3AgY291bnQgYW5kIG9wcyBhcnJheS4KKyAqIFRoZSBkYXRhIGZvciBlYWNoIHdyaXRlIChtYXN0ZXIgLT4gc2xhdmUpIG9wIGluIHRoZSBhcnJheSBpcyBzZW50CisgKiBpbiBvcmRlciwgd2l0aCBubyAoZS5nLiBwYWQpIGJ5dGVzIHNlcGFyYXRpbmcgdGhlbS4KKyAqCisgKiBTaG9ydCByZWFkcyBjYXVzZSB0aGUgZW50aXJlIHRyYW5zZmVyIHJlcXVlc3QgdG8gZmFpbCBTbyByZXNwb25zZQorICogcGF5bG9hZCBjb25zaXN0cyBvbmx5IG9mIGJ5dGVzIHJlYWQsIGFuZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGlzCisgKiBleGFjdGx5IHdoYXQgd2FzIHNwZWNpZmllZCBpbiB0aGUgY29ycmVzcG9uZGluZyBvcC4gIExpa2UKKyAqIG91dGdvaW5nIGRhdGEsIHRoZSBpbmNvbWluZyBkYXRhIGlzIGluIG9yZGVyIGFuZCBjb250aWd1b3VzLgorICovCitzdHJ1Y3QgZ2JfaTJjX3RyYW5zZmVyX29wIHsKKwlfX2xlMTYJYWRkcjsKKwlfX2xlMTYJZmxhZ3M7CisJX19sZTE2CXNpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfaTJjX3RyYW5zZmVyX3JlcXVlc3QgeworCV9fbGUxNgkJCQlvcF9jb3VudDsKKwlzdHJ1Y3QgZ2JfaTJjX3RyYW5zZmVyX29wCW9wc1swXTsJCS8qIG9wX2NvdW50IG9mIHRoZXNlICovCit9IF9fcGFja2VkOworc3RydWN0IGdiX2kyY190cmFuc2Zlcl9yZXNwb25zZSB7CisJX191OAkJCQlkYXRhWzBdOwkvKiBpbmJvdW5kIGRhdGEgKi8KK30gX19wYWNrZWQ7CisKKworLyogR1BJTyAqLworCisvKiBHcmV5YnVzIEdQSU8gcmVxdWVzdCB0eXBlcyAqLworI2RlZmluZSBHQl9HUElPX1RZUEVfTElORV9DT1VOVAkJMHgwMgorI2RlZmluZSBHQl9HUElPX1RZUEVfQUNUSVZBVEUJCTB4MDMKKyNkZWZpbmUgR0JfR1BJT19UWVBFX0RFQUNUSVZBVEUJCTB4MDQKKyNkZWZpbmUgR0JfR1BJT19UWVBFX0dFVF9ESVJFQ1RJT04JMHgwNQorI2RlZmluZSBHQl9HUElPX1RZUEVfRElSRUNUSU9OX0lOCTB4MDYKKyNkZWZpbmUgR0JfR1BJT19UWVBFX0RJUkVDVElPTl9PVVQJMHgwNworI2RlZmluZSBHQl9HUElPX1RZUEVfR0VUX1ZBTFVFCQkweDA4CisjZGVmaW5lIEdCX0dQSU9fVFlQRV9TRVRfVkFMVUUJCTB4MDkKKyNkZWZpbmUgR0JfR1BJT19UWVBFX1NFVF9ERUJPVU5DRQkweDBhCisjZGVmaW5lIEdCX0dQSU9fVFlQRV9JUlFfVFlQRQkJMHgwYgorI2RlZmluZSBHQl9HUElPX1RZUEVfSVJRX01BU0sJCTB4MGMKKyNkZWZpbmUgR0JfR1BJT19UWVBFX0lSUV9VTk1BU0sJCTB4MGQKKyNkZWZpbmUgR0JfR1BJT19UWVBFX0lSUV9FVkVOVAkJMHgwZQorCisjZGVmaW5lIEdCX0dQSU9fSVJRX1RZUEVfTk9ORQkJMHgwMAorI2RlZmluZSBHQl9HUElPX0lSUV9UWVBFX0VER0VfUklTSU5HCTB4MDEKKyNkZWZpbmUgR0JfR1BJT19JUlFfVFlQRV9FREdFX0ZBTExJTkcJMHgwMgorI2RlZmluZSBHQl9HUElPX0lSUV9UWVBFX0VER0VfQk9USAkweDAzCisjZGVmaW5lIEdCX0dQSU9fSVJRX1RZUEVfTEVWRUxfSElHSAkweDA0CisjZGVmaW5lIEdCX0dQSU9fSVJRX1RZUEVfTEVWRUxfTE9XCTB4MDgKKworLyogbGluZSBjb3VudCByZXF1ZXN0IGhhcyBubyBwYXlsb2FkICovCitzdHJ1Y3QgZ2JfZ3Bpb19saW5lX2NvdW50X3Jlc3BvbnNlIHsKKwlfX3U4CWNvdW50OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2dwaW9fYWN0aXZhdGVfcmVxdWVzdCB7CisJX191OAl3aGljaDsKK30gX19wYWNrZWQ7CisvKiBhY3RpdmF0ZSByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCitzdHJ1Y3QgZ2JfZ3Bpb19kZWFjdGl2YXRlX3JlcXVlc3QgeworCV9fdTgJd2hpY2g7Cit9IF9fcGFja2VkOworLyogZGVhY3RpdmF0ZSByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCitzdHJ1Y3QgZ2JfZ3Bpb19nZXRfZGlyZWN0aW9uX3JlcXVlc3QgeworCV9fdTgJd2hpY2g7Cit9IF9fcGFja2VkOworc3RydWN0IGdiX2dwaW9fZ2V0X2RpcmVjdGlvbl9yZXNwb25zZSB7CisJX191OAlkaXJlY3Rpb247Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfZ3Bpb19kaXJlY3Rpb25faW5fcmVxdWVzdCB7CisJX191OAl3aGljaDsKK30gX19wYWNrZWQ7CisvKiBkaXJlY3Rpb24gaW4gcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworc3RydWN0IGdiX2dwaW9fZGlyZWN0aW9uX291dF9yZXF1ZXN0IHsKKwlfX3U4CXdoaWNoOworCV9fdTgJdmFsdWU7Cit9IF9fcGFja2VkOworLyogZGlyZWN0aW9uIG91dCByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCitzdHJ1Y3QgZ2JfZ3Bpb19nZXRfdmFsdWVfcmVxdWVzdCB7CisJX191OAl3aGljaDsKK30gX19wYWNrZWQ7CitzdHJ1Y3QgZ2JfZ3Bpb19nZXRfdmFsdWVfcmVzcG9uc2UgeworCV9fdTgJdmFsdWU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfZ3Bpb19zZXRfdmFsdWVfcmVxdWVzdCB7CisJX191OAl3aGljaDsKKwlfX3U4CXZhbHVlOworfSBfX3BhY2tlZDsKKy8qIHNldCB2YWx1ZSByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCitzdHJ1Y3QgZ2JfZ3Bpb19zZXRfZGVib3VuY2VfcmVxdWVzdCB7CisJX191OAl3aGljaDsKKwlfX2xlMTYJdXNlYzsKK30gX19wYWNrZWQ7CisvKiBkZWJvdW5jZSByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCitzdHJ1Y3QgZ2JfZ3Bpb19pcnFfdHlwZV9yZXF1ZXN0IHsKKwlfX3U4CXdoaWNoOworCV9fdTgJdHlwZTsKK30gX19wYWNrZWQ7CisvKiBpcnEgdHlwZSByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCitzdHJ1Y3QgZ2JfZ3Bpb19pcnFfbWFza19yZXF1ZXN0IHsKKwlfX3U4CXdoaWNoOworfSBfX3BhY2tlZDsKKy8qIGlycSBtYXNrIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKK3N0cnVjdCBnYl9ncGlvX2lycV91bm1hc2tfcmVxdWVzdCB7CisJX191OAl3aGljaDsKK30gX19wYWNrZWQ7CisvKiBpcnEgdW5tYXNrIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKKy8qIGlycSBldmVudCByZXF1ZXN0cyBvcmlnaW5hdGUgb24gYW5vdGhlciBtb2R1bGUgYW5kIGFyZSBoYW5kbGVkIG9uIHRoZSBBUCAqLworc3RydWN0IGdiX2dwaW9faXJxX2V2ZW50X3JlcXVlc3QgeworCV9fdTgJd2hpY2g7Cit9IF9fcGFja2VkOworLyogaXJxIGV2ZW50IGhhcyBubyByZXNwb25zZSAqLworCisKKy8qIFBXTSAqLworCisvKiBHcmV5YnVzIFBXTSBvcGVyYXRpb24gdHlwZXMgKi8KKyNkZWZpbmUgR0JfUFdNX1RZUEVfUFdNX0NPVU5UCQkweDAyCisjZGVmaW5lIEdCX1BXTV9UWVBFX0FDVElWQVRFCQkweDAzCisjZGVmaW5lIEdCX1BXTV9UWVBFX0RFQUNUSVZBVEUJCTB4MDQKKyNkZWZpbmUgR0JfUFdNX1RZUEVfQ09ORklHCQkweDA1CisjZGVmaW5lIEdCX1BXTV9UWVBFX1BPTEFSSVRZCQkweDA2CisjZGVmaW5lIEdCX1BXTV9UWVBFX0VOQUJMRQkJMHgwNworI2RlZmluZSBHQl9QV01fVFlQRV9ESVNBQkxFCQkweDA4CisKKy8qIHB3bSBjb3VudCByZXF1ZXN0IGhhcyBubyBwYXlsb2FkICovCitzdHJ1Y3QgZ2JfcHdtX2NvdW50X3Jlc3BvbnNlIHsKKwlfX3U4CWNvdW50OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3B3bV9hY3RpdmF0ZV9yZXF1ZXN0IHsKKwlfX3U4CXdoaWNoOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3B3bV9kZWFjdGl2YXRlX3JlcXVlc3QgeworCV9fdTgJd2hpY2g7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfcHdtX2NvbmZpZ19yZXF1ZXN0IHsKKwlfX3U4CXdoaWNoOworCV9fbGUzMglkdXR5OworCV9fbGUzMglwZXJpb2Q7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfcHdtX3BvbGFyaXR5X3JlcXVlc3QgeworCV9fdTgJd2hpY2g7CisJX191OAlwb2xhcml0eTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9wd21fZW5hYmxlX3JlcXVlc3QgeworCV9fdTgJd2hpY2g7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfcHdtX2Rpc2FibGVfcmVxdWVzdCB7CisJX191OAl3aGljaDsKK30gX19wYWNrZWQ7CisKKy8qIFNQSSAqLworCisvKiBTaG91bGQgbWF0Y2ggdXAgd2l0aCBtb2RlcyBpbiBsaW51eC9zcGkvc3BpLmggKi8KKyNkZWZpbmUgR0JfU1BJX01PREVfQ1BIQQkJMHgwMQkJLyogY2xvY2sgcGhhc2UgKi8KKyNkZWZpbmUgR0JfU1BJX01PREVfQ1BPTAkJMHgwMgkJLyogY2xvY2sgcG9sYXJpdHkgKi8KKyNkZWZpbmUgR0JfU1BJX01PREVfTU9ERV8wCQkoMHwwKQkJLyogKG9yaWdpbmFsIE1pY3JvV2lyZSkgKi8KKyNkZWZpbmUgR0JfU1BJX01PREVfTU9ERV8xCQkoMHxHQl9TUElfTU9ERV9DUEhBKQorI2RlZmluZSBHQl9TUElfTU9ERV9NT0RFXzIJCShHQl9TUElfTU9ERV9DUE9MfDApCisjZGVmaW5lIEdCX1NQSV9NT0RFX01PREVfMwkJKEdCX1NQSV9NT0RFX0NQT0x8R0JfU1BJX01PREVfQ1BIQSkKKyNkZWZpbmUgR0JfU1BJX01PREVfQ1NfSElHSAkJMHgwNAkJLyogY2hpcHNlbGVjdCBhY3RpdmUgaGlnaD8gKi8KKyNkZWZpbmUgR0JfU1BJX01PREVfTFNCX0ZJUlNUCQkweDA4CQkvKiBwZXItd29yZCBiaXRzLW9uLXdpcmUgKi8KKyNkZWZpbmUgR0JfU1BJX01PREVfM1dJUkUJCTB4MTAJCS8qIFNJL1NPIHNpZ25hbHMgc2hhcmVkICovCisjZGVmaW5lIEdCX1NQSV9NT0RFX0xPT1AJCTB4MjAJCS8qIGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgR0JfU1BJX01PREVfTk9fQ1MJCTB4NDAJCS8qIDEgZGV2L2J1cywgbm8gY2hpcHNlbGVjdCAqLworI2RlZmluZSBHQl9TUElfTU9ERV9SRUFEWQkJMHg4MAkJLyogc2xhdmUgcHVsbHMgbG93IHRvIHBhdXNlICovCisKKy8qIFNob3VsZCBtYXRjaCB1cCB3aXRoIGZsYWdzIGluIGxpbnV4L3NwaS9zcGkuaCAqLworI2RlZmluZSBHQl9TUElfRkxBR19IQUxGX0RVUExFWAkJQklUKDApCQkvKiBjYW4ndCBkbyBmdWxsIGR1cGxleCAqLworI2RlZmluZSBHQl9TUElfRkxBR19OT19SWAkJQklUKDEpCQkvKiBjYW4ndCBkbyBidWZmZXIgcmVhZCAqLworI2RlZmluZSBHQl9TUElfRkxBR19OT19UWAkJQklUKDIpCQkvKiBjYW4ndCBkbyBidWZmZXIgd3JpdGUgKi8KKworLyogR3JleWJ1cyBzcGkgb3BlcmF0aW9uIHR5cGVzICovCisjZGVmaW5lIEdCX1NQSV9UWVBFX01BU1RFUl9DT05GSUcJMHgwMgorI2RlZmluZSBHQl9TUElfVFlQRV9ERVZJQ0VfQ09ORklHCTB4MDMKKyNkZWZpbmUgR0JfU1BJX1RZUEVfVFJBTlNGRVIJCTB4MDQKKworLyogbW9kZSByZXF1ZXN0IGhhcyBubyBwYXlsb2FkICovCitzdHJ1Y3QgZ2Jfc3BpX21hc3Rlcl9jb25maWdfcmVzcG9uc2UgeworCV9fbGUzMgliaXRzX3Blcl93b3JkX21hc2s7CisJX19sZTMyCW1pbl9zcGVlZF9oejsKKwlfX2xlMzIJbWF4X3NwZWVkX2h6OworCV9fbGUxNgltb2RlOworCV9fbGUxNglmbGFnczsKKwlfX3U4CW51bV9jaGlwc2VsZWN0OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3NwaV9kZXZpY2VfY29uZmlnX3JlcXVlc3QgeworCV9fdTgJY2hpcF9zZWxlY3Q7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2Jfc3BpX2RldmljZV9jb25maWdfcmVzcG9uc2UgeworCV9fbGUxNgltb2RlOworCV9fdTgJYml0c19wZXJfd29yZDsKKwlfX2xlMzIJbWF4X3NwZWVkX2h6OworCV9fdTgJZGV2aWNlX3R5cGU7CisjZGVmaW5lIEdCX1NQSV9TUElfREVWCQkweDAwCisjZGVmaW5lIEdCX1NQSV9TUElfTk9SCQkweDAxCisjZGVmaW5lIEdCX1NQSV9TUElfTU9EQUxJQVMJMHgwMgorCV9fdTgJbmFtZVszMl07Cit9IF9fcGFja2VkOworCisvKioKKyAqIHN0cnVjdCBnYl9zcGlfdHJhbnNmZXIgLSBhIHJlYWQvd3JpdGUgYnVmZmVyIHBhaXIKKyAqIEBzcGVlZF9oejogU2VsZWN0IGEgc3BlZWQgb3RoZXIgdGhhbiB0aGUgZGV2aWNlIGRlZmF1bHQgZm9yIHRoaXMgdHJhbnNmZXIuIElmCisgKgkwIHRoZSBkZWZhdWx0IChmcm9tIEBzcGlfZGV2aWNlKSBpcyB1c2VkLgorICogQGxlbjogc2l6ZSBvZiByeCBhbmQgdHggYnVmZmVycyAoaW4gYnl0ZXMpCisgKiBAZGVsYXlfdXNlY3M6IG1pY3Jvc2Vjb25kcyB0byBkZWxheSBhZnRlciB0aGlzIHRyYW5zZmVyIGJlZm9yZSAob3B0aW9uYWxseSkKKyAqIAljaGFuZ2luZyB0aGUgY2hpcHNlbGVjdCBzdGF0dXMsIHRoZW4gc3RhcnRpbmcgdGhlIG5leHQgdHJhbnNmZXIgb3IKKyAqIAljb21wbGV0aW5nIHRoaXMgc3BpX21lc3NhZ2UuCisgKiBAY3NfY2hhbmdlOiBhZmZlY3RzIGNoaXBzZWxlY3QgYWZ0ZXIgdGhpcyB0cmFuc2ZlciBjb21wbGV0ZXMKKyAqIEBiaXRzX3Blcl93b3JkOiBzZWxlY3QgYSBiaXRzX3Blcl93b3JkIG90aGVyIHRoYW4gdGhlIGRldmljZSBkZWZhdWx0IGZvciB0aGlzCisgKgl0cmFuc2Zlci4gSWYgMCB0aGUgZGVmYXVsdCAoZnJvbSBAc3BpX2RldmljZSkgaXMgdXNlZC4KKyAqLworc3RydWN0IGdiX3NwaV90cmFuc2ZlciB7CisJX19sZTMyCQlzcGVlZF9oejsKKwlfX2xlMzIJCWxlbjsKKwlfX2xlMTYJCWRlbGF5X3VzZWNzOworCV9fdTgJCWNzX2NoYW5nZTsKKwlfX3U4CQliaXRzX3Blcl93b3JkOworCV9fdTgJCXhmZXJfZmxhZ3M7CisjZGVmaW5lIEdCX1NQSV9YRkVSX1JFQUQJMHgwMQorI2RlZmluZSBHQl9TUElfWEZFUl9XUklURQkweDAyCisjZGVmaW5lIEdCX1NQSV9YRkVSX0lOUFJPR1JFU1MJMHgwNAorfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3NwaV90cmFuc2Zlcl9yZXF1ZXN0IHsKKwlfX3U4CQkJY2hpcF9zZWxlY3Q7CS8qIG9mIHRoZSBzcGkgZGV2aWNlICovCisJX191OAkJCW1vZGU7CQkvKiBvZiB0aGUgc3BpIGRldmljZSAqLworCV9fbGUxNgkJCWNvdW50OworCXN0cnVjdCBnYl9zcGlfdHJhbnNmZXIJdHJhbnNmZXJzWzBdOwkvKiBjb3VudCBvZiB0aGVzZSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3NwaV90cmFuc2Zlcl9yZXNwb25zZSB7CisJX191OAkJCWRhdGFbMF07CS8qIGluYm91bmQgZGF0YSAqLworfSBfX3BhY2tlZDsKKworLyogVmVyc2lvbiBvZiB0aGUgR3JleWJ1cyBTVkMgcHJvdG9jb2wgd2Ugc3VwcG9ydCAqLworI2RlZmluZSBHQl9TVkNfVkVSU0lPTl9NQUpPUgkJMHgwMAorI2RlZmluZSBHQl9TVkNfVkVSU0lPTl9NSU5PUgkJMHgwMQorCisvKiBHcmV5YnVzIFNWQyByZXF1ZXN0IHR5cGVzICovCisjZGVmaW5lIEdCX1NWQ19UWVBFX1BST1RPQ09MX1ZFUlNJT04JCTB4MDEKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfU1ZDX0hFTExPCQkJMHgwMgorI2RlZmluZSBHQl9TVkNfVFlQRV9JTlRGX0RFVklDRV9JRAkJMHgwMworI2RlZmluZSBHQl9TVkNfVFlQRV9JTlRGX1JFU0VUCQkJMHgwNgorI2RlZmluZSBHQl9TVkNfVFlQRV9DT05OX0NSRUFURQkJCTB4MDcKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfQ09OTl9ERVNUUk9ZCQkweDA4CisjZGVmaW5lIEdCX1NWQ19UWVBFX0RNRV9QRUVSX0dFVAkJMHgwOQorI2RlZmluZSBHQl9TVkNfVFlQRV9ETUVfUEVFUl9TRVQJCTB4MGEKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfUk9VVEVfQ1JFQVRFCQkweDBiCisjZGVmaW5lIEdCX1NWQ19UWVBFX1JPVVRFX0RFU1RST1kJCTB4MGMKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfVElNRVNZTkNfRU5BQkxFCQkweDBkCisjZGVmaW5lIEdCX1NWQ19UWVBFX1RJTUVTWU5DX0RJU0FCTEUJCTB4MGUKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfVElNRVNZTkNfQVVUSE9SSVRBVElWRQkweDBmCisjZGVmaW5lIEdCX1NWQ19UWVBFX0lOVEZfU0VUX1BXUk0JCTB4MTAKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfSU5URl9FSkVDVAkJCTB4MTEKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfUElORwkJCTB4MTMKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfUFdSTU9OX1JBSUxfQ09VTlRfR0VUCTB4MTQKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfUFdSTU9OX1JBSUxfTkFNRVNfR0VUCTB4MTUKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfUFdSTU9OX1NBTVBMRV9HRVQJCTB4MTYKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfUFdSTU9OX0lOVEZfU0FNUExFX0dFVAkweDE3CisjZGVmaW5lIEdCX1NWQ19UWVBFX1RJTUVTWU5DX1dBS0VfUElOU19BQ1FVSVJFCTB4MTgKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfVElNRVNZTkNfV0FLRV9QSU5TX1JFTEVBU0UJMHgxOQorI2RlZmluZSBHQl9TVkNfVFlQRV9USU1FU1lOQ19QSU5HCQkweDFhCisjZGVmaW5lIEdCX1NWQ19UWVBFX01PRFVMRV9JTlNFUlRFRAkJMHgxZgorI2RlZmluZSBHQl9TVkNfVFlQRV9NT0RVTEVfUkVNT1ZFRAkJMHgyMAorI2RlZmluZSBHQl9TVkNfVFlQRV9JTlRGX1ZTWVNfRU5BQkxFCQkweDIxCisjZGVmaW5lIEdCX1NWQ19UWVBFX0lOVEZfVlNZU19ESVNBQkxFCQkweDIyCisjZGVmaW5lIEdCX1NWQ19UWVBFX0lOVEZfUkVGQ0xLX0VOQUJMRQkJMHgyMworI2RlZmluZSBHQl9TVkNfVFlQRV9JTlRGX1JFRkNMS19ESVNBQkxFCQkweDI0CisjZGVmaW5lIEdCX1NWQ19UWVBFX0lOVEZfVU5JUFJPX0VOQUJMRQkJMHgyNQorI2RlZmluZSBHQl9TVkNfVFlQRV9JTlRGX1VOSVBST19ESVNBQkxFCQkweDI2CisjZGVmaW5lIEdCX1NWQ19UWVBFX0lOVEZfQUNUSVZBVEUJCTB4MjcKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfSU5URl9SRVNVTUUJCQkweDI4CisjZGVmaW5lIEdCX1NWQ19UWVBFX0lOVEZfTUFJTEJPWF9FVkVOVAkJMHgyOQorI2RlZmluZSBHQl9TVkNfVFlQRV9JTlRGX09PUFMJCQkweDJhCisKKy8qIEdyZXlidXMgU1ZDIHByb3RvY29sIHN0YXR1cyB2YWx1ZXMgKi8KKyNkZWZpbmUgR0JfU1ZDX09QX1NVQ0NFU1MJCQkweDAwCisjZGVmaW5lIEdCX1NWQ19PUF9VTktOT1dOX0VSUk9SCQkJMHgwMQorI2RlZmluZSBHQl9TVkNfSU5URl9OT1RfREVURUNURUQJCTB4MDIKKyNkZWZpbmUgR0JfU1ZDX0lOVEZfTk9fVVBST19MSU5LCQkweDAzCisjZGVmaW5lIEdCX1NWQ19JTlRGX1VQUk9fTk9UX0RPV04JCTB4MDQKKyNkZWZpbmUgR0JfU1ZDX0lOVEZfVVBST19OT1RfSElCRVJOQVRFRAkJMHgwNQorI2RlZmluZSBHQl9TVkNfSU5URl9OT19WX1NZUwkJCTB4MDYKKyNkZWZpbmUgR0JfU1ZDX0lOVEZfVl9DSEcJCQkweDA3CisjZGVmaW5lIEdCX1NWQ19JTlRGX1dBS0VfQlVTWQkJCTB4MDgKKyNkZWZpbmUgR0JfU1ZDX0lOVEZfTk9fUkVGQ0xLCQkJMHgwOQorI2RlZmluZSBHQl9TVkNfSU5URl9SRUxFQVNJTkcJCQkweDBhCisjZGVmaW5lIEdCX1NWQ19JTlRGX05PX09SREVSCQkJMHgwYgorI2RlZmluZSBHQl9TVkNfSU5URl9NQk9YX1NFVAkJCTB4MGMKKyNkZWZpbmUgR0JfU1ZDX0lOVEZfQkFEX01CT1gJCQkweDBkCisjZGVmaW5lIEdCX1NWQ19JTlRGX09QX1RJTUVPVVQJCQkweDBlCisjZGVmaW5lIEdCX1NWQ19QV1JNT05fT1BfTk9UX1BSRVNFTlQJCTB4MGYKKworc3RydWN0IGdiX3N2Y192ZXJzaW9uX3JlcXVlc3QgeworCV9fdTgJbWFqb3I7CisJX191OAltaW5vcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9zdmNfdmVyc2lvbl9yZXNwb25zZSB7CisJX191OAltYWpvcjsKKwlfX3U4CW1pbm9yOworfSBfX3BhY2tlZDsKKworLyogU1ZDIHByb3RvY29sIGhlbGxvIHJlcXVlc3QgKi8KK3N0cnVjdCBnYl9zdmNfaGVsbG9fcmVxdWVzdCB7CisJX19sZTE2CQkJZW5kb19pZDsKKwlfX3U4CQkJaW50ZXJmYWNlX2lkOworfSBfX3BhY2tlZDsKKy8qIGhlbGxvIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKK3N0cnVjdCBnYl9zdmNfaW50Zl9kZXZpY2VfaWRfcmVxdWVzdCB7CisJX191OAlpbnRmX2lkOworCV9fdTgJZGV2aWNlX2lkOworfSBfX3BhY2tlZDsKKy8qIGRldmljZSBpZCByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCitzdHJ1Y3QgZ2Jfc3ZjX2ludGZfcmVzZXRfcmVxdWVzdCB7CisJX191OAlpbnRmX2lkOworfSBfX3BhY2tlZDsKKy8qIGludGVyZmFjZSByZXNldCByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCitzdHJ1Y3QgZ2Jfc3ZjX2ludGZfZWplY3RfcmVxdWVzdCB7CisJX191OAlpbnRmX2lkOworfSBfX3BhY2tlZDsKKy8qIGludGVyZmFjZSBlamVjdCByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCitzdHJ1Y3QgZ2Jfc3ZjX2Nvbm5fY3JlYXRlX3JlcXVlc3QgeworCV9fdTgJaW50ZjFfaWQ7CisJX19sZTE2CWNwb3J0MV9pZDsKKwlfX3U4CWludGYyX2lkOworCV9fbGUxNgljcG9ydDJfaWQ7CisJX191OAl0YzsKKwlfX3U4CWZsYWdzOworfSBfX3BhY2tlZDsKKy8qIGNvbm5lY3Rpb24gY3JlYXRlIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKK3N0cnVjdCBnYl9zdmNfY29ubl9kZXN0cm95X3JlcXVlc3QgeworCV9fdTgJaW50ZjFfaWQ7CisJX19sZTE2CWNwb3J0MV9pZDsKKwlfX3U4CWludGYyX2lkOworCV9fbGUxNgljcG9ydDJfaWQ7Cit9IF9fcGFja2VkOworLyogY29ubmVjdGlvbiBkZXN0cm95IHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKK3N0cnVjdCBnYl9zdmNfZG1lX3BlZXJfZ2V0X3JlcXVlc3QgeworCV9fdTgJaW50Zl9pZDsKKwlfX2xlMTYJYXR0cjsKKwlfX2xlMTYJc2VsZWN0b3I7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2Jfc3ZjX2RtZV9wZWVyX2dldF9yZXNwb25zZSB7CisJX19sZTE2CXJlc3VsdF9jb2RlOworCV9fbGUzMglhdHRyX3ZhbHVlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3N2Y19kbWVfcGVlcl9zZXRfcmVxdWVzdCB7CisJX191OAlpbnRmX2lkOworCV9fbGUxNglhdHRyOworCV9fbGUxNglzZWxlY3RvcjsKKwlfX2xlMzIJdmFsdWU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2Jfc3ZjX2RtZV9wZWVyX3NldF9yZXNwb25zZSB7CisJX19sZTE2CXJlc3VsdF9jb2RlOworfSBfX3BhY2tlZDsKKworLyogR3JleWJ1cyBpbml0LXN0YXR1cyB2YWx1ZXMsIGN1cnJlbnRseSByZXRyaWV2ZWQgdXNpbmcgRE1FIHBlZXIgZ2V0cy4gKi8KKyNkZWZpbmUgR0JfSU5JVF9TUElfQk9PVF9TVEFSVEVECQkJMHgwMgorI2RlZmluZSBHQl9JTklUX1RSVVNURURfU1BJX0JPT1RfRklOSVNIRUQJCTB4MDMKKyNkZWZpbmUgR0JfSU5JVF9VTlRSVVNURURfU1BJX0JPT1RfRklOSVNIRUQJCTB4MDQKKyNkZWZpbmUgR0JfSU5JVF9CT09UUk9NX1VOSVBST19CT09UX1NUQVJURUQJCTB4MDYKKyNkZWZpbmUgR0JfSU5JVF9CT09UUk9NX0ZBTExCQUNLX1VOSVBST19CT09UX1NUQVJURUQJMHgwOQorI2RlZmluZSBHQl9JTklUX1MyX0xPQURFUl9CT09UX1NUQVJURUQJCQkweDBECisKK3N0cnVjdCBnYl9zdmNfcm91dGVfY3JlYXRlX3JlcXVlc3QgeworCV9fdTgJaW50ZjFfaWQ7CisJX191OAlkZXYxX2lkOworCV9fdTgJaW50ZjJfaWQ7CisJX191OAlkZXYyX2lkOworfSBfX3BhY2tlZDsKKy8qIHJvdXRlIGNyZWF0ZSByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCitzdHJ1Y3QgZ2Jfc3ZjX3JvdXRlX2Rlc3Ryb3lfcmVxdWVzdCB7CisJX191OAlpbnRmMV9pZDsKKwlfX3U4CWludGYyX2lkOworfSBfX3BhY2tlZDsKKy8qIHJvdXRlIGRlc3Ryb3kgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworLyogdXNlZCBmb3Igc3ZjX2ludGZfdnN5c197ZW5hYmxlLGRpc2FibGV9ICovCitzdHJ1Y3QgZ2Jfc3ZjX2ludGZfdnN5c19yZXF1ZXN0IHsKKwlfX3U4CWludGZfaWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2Jfc3ZjX2ludGZfdnN5c19yZXNwb25zZSB7CisJX191OAlyZXN1bHRfY29kZTsKKyNkZWZpbmUgR0JfU1ZDX0lOVEZfVlNZU19PSwkJCQkweDAwCisJLyogMHgwMSBpcyByZXNlcnZlZCAqLworI2RlZmluZSBHQl9TVkNfSU5URl9WU1lTX0ZBSUwJCQkJMHgwMgorfSBfX3BhY2tlZDsKKworLyogdXNlZCBmb3Igc3ZjX2ludGZfcmVmY2xrX3tlbmFibGUsZGlzYWJsZX0gKi8KK3N0cnVjdCBnYl9zdmNfaW50Zl9yZWZjbGtfcmVxdWVzdCB7CisJX191OAlpbnRmX2lkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3N2Y19pbnRmX3JlZmNsa19yZXNwb25zZSB7CisJX191OAlyZXN1bHRfY29kZTsKKyNkZWZpbmUgR0JfU1ZDX0lOVEZfUkVGQ0xLX09LCQkJCTB4MDAKKwkvKiAweDAxIGlzIHJlc2VydmVkICovCisjZGVmaW5lIEdCX1NWQ19JTlRGX1JFRkNMS19GQUlMCQkJCTB4MDIKK30gX19wYWNrZWQ7CisKKy8qIHVzZWQgZm9yIHN2Y19pbnRmX3VuaXByb197ZW5hYmxlLGRpc2FibGV9ICovCitzdHJ1Y3QgZ2Jfc3ZjX2ludGZfdW5pcHJvX3JlcXVlc3QgeworCV9fdTgJaW50Zl9pZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9zdmNfaW50Zl91bmlwcm9fcmVzcG9uc2UgeworCV9fdTgJcmVzdWx0X2NvZGU7CisjZGVmaW5lIEdCX1NWQ19JTlRGX1VOSVBST19PSwkJCQkweDAwCisJLyogMHgwMSBpcyByZXNlcnZlZCAqLworI2RlZmluZSBHQl9TVkNfSU5URl9VTklQUk9fRkFJTAkJCQkweDAyCisjZGVmaW5lIEdCX1NWQ19JTlRGX1VOSVBST19OT1RfT0ZGCQkJMHgwMworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3N2Y190aW1lc3luY19lbmFibGVfcmVxdWVzdCB7CisJX191OAljb3VudDsKKwlfX2xlNjQJZnJhbWVfdGltZTsKKwlfX2xlMzIJc3Ryb2JlX2RlbGF5OworCV9fbGUzMglyZWZjbGs7Cit9IF9fcGFja2VkOworLyogdGltZXN5bmMgZW5hYmxlIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKKy8qIHRpbWVzeW5jIGF1dGhvcml0YXRpdmUgcmVxdWVzdCBoYXMgbm8gcGF5bG9hZCAqLworc3RydWN0IGdiX3N2Y190aW1lc3luY19hdXRob3JpdGF0aXZlX3Jlc3BvbnNlIHsKKwlfX2xlNjQJZnJhbWVfdGltZVtHQl9USU1FU1lOQ19NQVhfU1RST0JFU107Cit9OworCitzdHJ1Y3QgZ2Jfc3ZjX3RpbWVzeW5jX3dha2VfcGluc19hY3F1aXJlX3JlcXVlc3QgeworCV9fbGUzMglzdHJvYmVfbWFzazsKK307CisKKy8qIHRpbWVzeW5jIHdha2UgcGlucyBhY3F1aXJlIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKKy8qIHRpbWVzeW5jIHdha2UgcGlucyByZWxlYXNlIHJlcXVlc3QgaGFzIG5vIHBheWxvYWQgKi8KKy8qIHRpbWVzeW5jIHdha2UgcGlucyByZWxlYXNlIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKKy8qIHRpbWVzeW5jIHN2YyBwaW5nIHJlcXVlc3QgaGFzIG5vIHBheWxvYWQgKi8KK3N0cnVjdCBnYl9zdmNfdGltZXN5bmNfcGluZ19yZXNwb25zZSB7CisJX19sZTY0CWZyYW1lX3RpbWU7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEdCX1NWQ19VTklQUk9fRkFTVF9NT0RFCQkJMHgwMQorI2RlZmluZSBHQl9TVkNfVU5JUFJPX1NMT1dfTU9ERQkJCTB4MDIKKyNkZWZpbmUgR0JfU1ZDX1VOSVBST19GQVNUX0FVVE9fTU9ERQkJMHgwNAorI2RlZmluZSBHQl9TVkNfVU5JUFJPX1NMT1dfQVVUT19NT0RFCQkweDA1CisjZGVmaW5lIEdCX1NWQ19VTklQUk9fTU9ERV9VTkNIQU5HRUQJCTB4MDcKKyNkZWZpbmUgR0JfU1ZDX1VOSVBST19ISUJFUk5BVEVfTU9ERQkJMHgxMQorI2RlZmluZSBHQl9TVkNfVU5JUFJPX09GRl9NT0RFCQkJMHgxMgorCisjZGVmaW5lIEdCX1NWQ19TTUFMTF9BTVBMSVRVREUgICAgICAgICAgMHgwMQorI2RlZmluZSBHQl9TVkNfTEFSR0VfQU1QTElUVURFICAgICAgICAgIDB4MDIKKworI2RlZmluZSBHQl9TVkNfTk9fREVfRU1QSEFTSVMgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgR0JfU1ZDX1NNQUxMX0RFX0VNUEhBU0lTICAgICAgICAweDAxCisjZGVmaW5lIEdCX1NWQ19MQVJHRV9ERV9FTVBIQVNJUyAgICAgICAgMHgwMgorCisjZGVmaW5lIEdCX1NWQ19QV1JNX1JYVEVSTUlOQVRJT04JCTB4MDEKKyNkZWZpbmUgR0JfU1ZDX1BXUk1fVFhURVJNSU5BVElPTgkJMHgwMgorI2RlZmluZSBHQl9TVkNfUFdSTV9MSU5FX1JFU0VUCQkJMHgwNAorI2RlZmluZSBHQl9TVkNfUFdSTV9TQ1JBTUJMSU5HCQkJMHgyMAorCisjZGVmaW5lIEdCX1NWQ19QV1JNX1FVSVJLX0hTU0VSCQkJMHgwMDAwMDAwMQorCisjZGVmaW5lIEdCX1NWQ19VTklQUk9fSFNfU0VSSUVTX0EJCTB4MDEKKyNkZWZpbmUgR0JfU1ZDX1VOSVBST19IU19TRVJJRVNfQgkJMHgwMgorCisjZGVmaW5lIEdCX1NWQ19TRVRQV1JNX1BXUl9PSyAgICAgICAgICAgMHgwMAorI2RlZmluZSBHQl9TVkNfU0VUUFdSTV9QV1JfTE9DQUwgICAgICAgIDB4MDEKKyNkZWZpbmUgR0JfU1ZDX1NFVFBXUk1fUFdSX1JFTU9URSAgICAgICAweDAyCisjZGVmaW5lIEdCX1NWQ19TRVRQV1JNX1BXUl9CVVNZICAgICAgICAgMHgwMworI2RlZmluZSBHQl9TVkNfU0VUUFdSTV9QV1JfRVJST1JfQ0FQICAgIDB4MDQKKyNkZWZpbmUgR0JfU1ZDX1NFVFBXUk1fUFdSX0ZBVEFMX0VSUk9SICAweDA1CisKK3N0cnVjdCBnYl9zdmNfbDJfdGltZXJfY2ZnIHsKKwlfX2xlMTYgdHNiX2ZjMF9wcm90ZWN0aW9uX3RpbWVvdXQ7CisJX19sZTE2IHRzYl90YzBfcmVwbGF5X3RpbWVvdXQ7CisJX19sZTE2IHRzYl9hZmMwX3JlcV90aW1lb3V0OworCV9fbGUxNiB0c2JfZmMxX3Byb3RlY3Rpb25fdGltZW91dDsKKwlfX2xlMTYgdHNiX3RjMV9yZXBsYXlfdGltZW91dDsKKwlfX2xlMTYgdHNiX2FmYzFfcmVxX3RpbWVvdXQ7CisJX19sZTE2IHJlc2VydmVkX2Zvcl90YzJbM107CisJX19sZTE2IHJlc2VydmVkX2Zvcl90YzNbM107Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2Jfc3ZjX2ludGZfc2V0X3B3cm1fcmVxdWVzdCB7CisJX191OAlpbnRmX2lkOworCV9fdTgJaHNfc2VyaWVzOworCV9fdTgJdHhfbW9kZTsKKwlfX3U4CXR4X2dlYXI7CisJX191OAl0eF9ubGFuZXM7CisJX191OAl0eF9hbXBsaXR1ZGU7CisJX191OAl0eF9oc19lcXVhbGl6ZXI7CisJX191OAlyeF9tb2RlOworCV9fdTgJcnhfZ2VhcjsKKwlfX3U4CXJ4X25sYW5lczsKKwlfX3U4CWZsYWdzOworCV9fbGUzMglxdWlya3M7CisJc3RydWN0IGdiX3N2Y19sMl90aW1lcl9jZmcgbG9jYWxfbDJ0aW1lcmRhdGEsIHJlbW90ZV9sMnRpbWVyZGF0YTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9zdmNfaW50Zl9zZXRfcHdybV9yZXNwb25zZSB7CisJX191OAlyZXN1bHRfY29kZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9zdmNfa2V5X2V2ZW50X3JlcXVlc3QgeworCV9fbGUxNiAga2V5X2NvZGU7CisjZGVmaW5lIEdCX0tFWUNPREVfQVJBICAgICAgICAgMHgwMAorCisJX191OCAgICBrZXlfZXZlbnQ7CisjZGVmaW5lIEdCX1NWQ19LRVlfUkVMRUFTRUQgICAgMHgwMAorI2RlZmluZSBHQl9TVkNfS0VZX1BSRVNTRUQgICAgIDB4MDEKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgR0JfU1ZDX1BXUk1PTl9NQVhfUkFJTF9DT1VOVAkJMjU0CisKK3N0cnVjdCBnYl9zdmNfcHdybW9uX3JhaWxfY291bnRfZ2V0X3Jlc3BvbnNlIHsKKwlfX3U4CXJhaWxfY291bnQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEdCX1NWQ19QV1JNT05fUkFJTF9OQU1FX0JVRlNJWkUJCTMyCisKK3N0cnVjdCBnYl9zdmNfcHdybW9uX3JhaWxfbmFtZXNfZ2V0X3Jlc3BvbnNlIHsKKwlfX3U4CXN0YXR1czsKKwlfX3U4CW5hbWVbMF1bR0JfU1ZDX1BXUk1PTl9SQUlMX05BTUVfQlVGU0laRV07Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEdCX1NWQ19QV1JNT05fVFlQRV9DVVJSCQkJMHgwMQorI2RlZmluZSBHQl9TVkNfUFdSTU9OX1RZUEVfVk9MCQkJMHgwMgorI2RlZmluZSBHQl9TVkNfUFdSTU9OX1RZUEVfUFdSCQkJMHgwMworCisjZGVmaW5lIEdCX1NWQ19QV1JNT05fR0VUX1NBTVBMRV9PSwkJMHgwMAorI2RlZmluZSBHQl9TVkNfUFdSTU9OX0dFVF9TQU1QTEVfSU5WQUwJCTB4MDEKKyNkZWZpbmUgR0JfU1ZDX1BXUk1PTl9HRVRfU0FNUExFX05PU1VQUAkJMHgwMgorI2RlZmluZSBHQl9TVkNfUFdSTU9OX0dFVF9TQU1QTEVfSFdFUlIJCTB4MDMKKworc3RydWN0IGdiX3N2Y19wd3Jtb25fc2FtcGxlX2dldF9yZXF1ZXN0IHsKKwlfX3U4CXJhaWxfaWQ7CisJX191OAltZWFzdXJlbWVudF90eXBlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3N2Y19wd3Jtb25fc2FtcGxlX2dldF9yZXNwb25zZSB7CisJX191OAlyZXN1bHQ7CisJX19sZTMyCW1lYXN1cmVtZW50OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3N2Y19wd3Jtb25faW50Zl9zYW1wbGVfZ2V0X3JlcXVlc3QgeworCV9fdTgJaW50Zl9pZDsKKwlfX3U4CW1lYXN1cmVtZW50X3R5cGU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2Jfc3ZjX3B3cm1vbl9pbnRmX3NhbXBsZV9nZXRfcmVzcG9uc2UgeworCV9fdTgJcmVzdWx0OworCV9fbGUzMgltZWFzdXJlbWVudDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgR0JfU1ZDX01PRFVMRV9JTlNFUlRFRF9GTEFHX05PX1BSSU1BUlkJMHgwMDAxCisKK3N0cnVjdCBnYl9zdmNfbW9kdWxlX2luc2VydGVkX3JlcXVlc3QgeworCV9fdTgJcHJpbWFyeV9pbnRmX2lkOworCV9fdTgJaW50Zl9jb3VudDsKKwlfX2xlMTYJZmxhZ3M7Cit9IF9fcGFja2VkOworLyogbW9kdWxlX2luc2VydGVkIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKK3N0cnVjdCBnYl9zdmNfbW9kdWxlX3JlbW92ZWRfcmVxdWVzdCB7CisJX191OAlwcmltYXJ5X2ludGZfaWQ7Cit9IF9fcGFja2VkOworLyogbW9kdWxlX3JlbW92ZWQgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworc3RydWN0IGdiX3N2Y19pbnRmX2FjdGl2YXRlX3JlcXVlc3QgeworCV9fdTgJaW50Zl9pZDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgR0JfU1ZDX0lOVEZfVFlQRV9VTktOT1dOCQkweDAwCisjZGVmaW5lIEdCX1NWQ19JTlRGX1RZUEVfRFVNTVkJCQkweDAxCisjZGVmaW5lIEdCX1NWQ19JTlRGX1RZUEVfVU5JUFJPCQkJMHgwMgorI2RlZmluZSBHQl9TVkNfSU5URl9UWVBFX0dSRVlCVVMJCTB4MDMKKworc3RydWN0IGdiX3N2Y19pbnRmX2FjdGl2YXRlX3Jlc3BvbnNlIHsKKwlfX3U4CXN0YXR1czsKKwlfX3U4CWludGZfdHlwZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9zdmNfaW50Zl9yZXN1bWVfcmVxdWVzdCB7CisJX191OAlpbnRmX2lkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3N2Y19pbnRmX3Jlc3VtZV9yZXNwb25zZSB7CisJX191OAlzdGF0dXM7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEdCX1NWQ19JTlRGX01BSUxCT1hfTk9ORQkJMHgwMAorI2RlZmluZSBHQl9TVkNfSU5URl9NQUlMQk9YX0FQCQkJMHgwMQorI2RlZmluZSBHQl9TVkNfSU5URl9NQUlMQk9YX0dSRVlCVVMJCTB4MDIKKworc3RydWN0IGdiX3N2Y19pbnRmX21haWxib3hfZXZlbnRfcmVxdWVzdCB7CisJX191OAlpbnRmX2lkOworCV9fbGUxNglyZXN1bHRfY29kZTsKKwlfX2xlMzIJbWFpbGJveDsKK30gX19wYWNrZWQ7CisvKiBpbnRmX21haWxib3hfZXZlbnQgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworc3RydWN0IGdiX3N2Y19pbnRmX29vcHNfcmVxdWVzdCB7CisJX191OAlpbnRmX2lkOworCV9fdTgJcmVhc29uOworfSBfX3BhY2tlZDsKKy8qIGludGZfb29wcyByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCisKKy8qIFJBVyAqLworCisvKiBHcmV5YnVzIHJhdyByZXF1ZXN0IHR5cGVzICovCisjZGVmaW5lCUdCX1JBV19UWVBFX1NFTkQJCQkweDAyCisKK3N0cnVjdCBnYl9yYXdfc2VuZF9yZXF1ZXN0IHsKKwlfX2xlMzIJbGVuOworCV9fdTgJZGF0YVswXTsKK30gX19wYWNrZWQ7CisKKworLyogVUFSVCAqLworCisvKiBHcmV5YnVzIFVBUlQgb3BlcmF0aW9uIHR5cGVzICovCisjZGVmaW5lIEdCX1VBUlRfVFlQRV9TRU5EX0RBVEEJCQkweDAyCisjZGVmaW5lIEdCX1VBUlRfVFlQRV9SRUNFSVZFX0RBVEEJCTB4MDMJLyogVW5zb2xpY2l0ZWQgZGF0YSAqLworI2RlZmluZSBHQl9VQVJUX1RZUEVfU0VUX0xJTkVfQ09ESU5HCQkweDA0CisjZGVmaW5lIEdCX1VBUlRfVFlQRV9TRVRfQ09OVFJPTF9MSU5FX1NUQVRFCTB4MDUKKyNkZWZpbmUgR0JfVUFSVF9UWVBFX1NFTkRfQlJFQUsJCQkweDA2CisjZGVmaW5lIEdCX1VBUlRfVFlQRV9TRVJJQUxfU1RBVEUJCTB4MDcJLyogVW5zb2xpY2l0ZWQgZGF0YSAqLworI2RlZmluZSBHQl9VQVJUX1RZUEVfUkVDRUlWRV9DUkVESVRTCQkweDA4CisjZGVmaW5lIEdCX1VBUlRfVFlQRV9GTFVTSF9GSUZPUwkJMHgwOQorCisvKiBSZXByZXNlbnRzIGRhdGEgZnJvbSBBUCAtPiBNb2R1bGUgKi8KK3N0cnVjdCBnYl91YXJ0X3NlbmRfZGF0YV9yZXF1ZXN0IHsKKwlfX2xlMTYJc2l6ZTsKKwlfX3U4CWRhdGFbMF07Cit9IF9fcGFja2VkOworCisvKiByZWN2LWRhdGEtcmVxdWVzdCBmbGFncyAqLworI2RlZmluZSBHQl9VQVJUX1JFQ1ZfRkxBR19GUkFNSU5HCQkweDAxCS8qIEZyYW1pbmcgZXJyb3IgKi8KKyNkZWZpbmUgR0JfVUFSVF9SRUNWX0ZMQUdfUEFSSVRZCQkweDAyCS8qIFBhcml0eSBlcnJvciAqLworI2RlZmluZSBHQl9VQVJUX1JFQ1ZfRkxBR19PVkVSUlVOCQkweDA0CS8qIE92ZXJydW4gZXJyb3IgKi8KKyNkZWZpbmUgR0JfVUFSVF9SRUNWX0ZMQUdfQlJFQUsJCQkweDA4CS8qIEJyZWFrICovCisKKy8qIFJlcHJlc2VudHMgZGF0YSBmcm9tIE1vZHVsZSAtPiBBUCAqLworc3RydWN0IGdiX3VhcnRfcmVjdl9kYXRhX3JlcXVlc3QgeworCV9fbGUxNglzaXplOworCV9fdTgJZmxhZ3M7CisJX191OAlkYXRhWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3VhcnRfcmVjZWl2ZV9jcmVkaXRzX3JlcXVlc3QgeworCV9fbGUxNiAgY291bnQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfdWFydF9zZXRfbGluZV9jb2RpbmdfcmVxdWVzdCB7CisJX19sZTMyCXJhdGU7CisJX191OAlmb3JtYXQ7CisjZGVmaW5lIEdCX1NFUklBTF8xX1NUT1BfQklUUwkJCTAKKyNkZWZpbmUgR0JfU0VSSUFMXzFfNV9TVE9QX0JJVFMJCQkxCisjZGVmaW5lIEdCX1NFUklBTF8yX1NUT1BfQklUUwkJCTIKKworCV9fdTgJcGFyaXR5OworI2RlZmluZSBHQl9TRVJJQUxfTk9fUEFSSVRZCQkJMAorI2RlZmluZSBHQl9TRVJJQUxfT0REX1BBUklUWQkJCTEKKyNkZWZpbmUgR0JfU0VSSUFMX0VWRU5fUEFSSVRZCQkJMgorI2RlZmluZSBHQl9TRVJJQUxfTUFSS19QQVJJVFkJCQkzCisjZGVmaW5lIEdCX1NFUklBTF9TUEFDRV9QQVJJVFkJCQk0CisKKwlfX3U4CWRhdGFfYml0czsKKworCV9fdTgJZmxvd19jb250cm9sOworI2RlZmluZSBHQl9TRVJJQUxfQVVUT19SVFNDVFNfRU4JCTB4MQorfSBfX3BhY2tlZDsKKworLyogb3V0cHV0IGNvbnRyb2wgbGluZXMgKi8KKyNkZWZpbmUgR0JfVUFSVF9DVFJMX0RUUgkJCTB4MDEKKyNkZWZpbmUgR0JfVUFSVF9DVFJMX1JUUwkJCTB4MDIKKworc3RydWN0IGdiX3VhcnRfc2V0X2NvbnRyb2xfbGluZV9zdGF0ZV9yZXF1ZXN0IHsKKwlfX3U4CWNvbnRyb2w7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfdWFydF9zZXRfYnJlYWtfcmVxdWVzdCB7CisJX191OAlzdGF0ZTsKK30gX19wYWNrZWQ7CisKKy8qIGlucHV0IGNvbnRyb2wgbGluZXMgYW5kIGxpbmUgZXJyb3JzICovCisjZGVmaW5lIEdCX1VBUlRfQ1RSTF9EQ0QJCQkweDAxCisjZGVmaW5lIEdCX1VBUlRfQ1RSTF9EU1IJCQkweDAyCisjZGVmaW5lIEdCX1VBUlRfQ1RSTF9SSQkJCQkweDA0CisKK3N0cnVjdCBnYl91YXJ0X3NlcmlhbF9zdGF0ZV9yZXF1ZXN0IHsKKwlfX3U4CWNvbnRyb2w7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfdWFydF9zZXJpYWxfZmx1c2hfcmVxdWVzdCB7CisJX191OCAgICBmbGFnczsKKyNkZWZpbmUgR0JfU0VSSUFMX0ZMQUdfRkxVU0hfVFJBTlNNSVRURVIJMHgwMQorI2RlZmluZSBHQl9TRVJJQUxfRkxBR19GTFVTSF9SRUNFSVZFUgkJMHgwMgorfSBfX3BhY2tlZDsKKworLyogTG9vcGJhY2sgKi8KKworLyogR3JleWJ1cyBsb29wYmFjayByZXF1ZXN0IHR5cGVzICovCisjZGVmaW5lIEdCX0xPT1BCQUNLX1RZUEVfUElORwkJCTB4MDIKKyNkZWZpbmUgR0JfTE9PUEJBQ0tfVFlQRV9UUkFOU0ZFUgkJMHgwMworI2RlZmluZSBHQl9MT09QQkFDS19UWVBFX1NJTksJCQkweDA0CisKKy8qCisgKiBMb29wYmFjayByZXF1ZXN0L3Jlc3BvbnNlIGhlYWRlciBmb3JtYXQgc2hvdWxkIGJlIGlkZW50aWNhbAorICogdG8gc2ltcGxpZnkgYmFuZHdpZHRoIGFuZCBkYXRhIG1vdmVtZW50IGFuYWx5c2lzLgorICovCitzdHJ1Y3QgZ2JfbG9vcGJhY2tfdHJhbnNmZXJfcmVxdWVzdCB7CisJX19sZTMyCWxlbjsKKwlfX2xlMzIgIHJlc2VydmVkMDsKKwlfX2xlMzIgIHJlc2VydmVkMTsKKwlfX3U4CWRhdGFbMF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfbG9vcGJhY2tfdHJhbnNmZXJfcmVzcG9uc2UgeworCV9fbGUzMglsZW47CisJX19sZTMyCXJlc2VydmVkMDsKKwlfX2xlMzIJcmVzZXJ2ZWQxOworCV9fdTgJZGF0YVswXTsKK30gX19wYWNrZWQ7CisKKy8qIFNESU8gKi8KKy8qIEdyZXlidXMgU0RJTyBvcGVyYXRpb24gdHlwZXMgKi8KKyNkZWZpbmUgR0JfU0RJT19UWVBFX0dFVF9DQVBBQklMSVRJRVMJCTB4MDIKKyNkZWZpbmUgR0JfU0RJT19UWVBFX1NFVF9JT1MJCQkweDAzCisjZGVmaW5lIEdCX1NESU9fVFlQRV9DT01NQU5ECQkJMHgwNAorI2RlZmluZSBHQl9TRElPX1RZUEVfVFJBTlNGRVIJCQkweDA1CisjZGVmaW5lIEdCX1NESU9fVFlQRV9FVkVOVAkJCTB4MDYKKworLyogZ2V0IGNhcHMgcmVzcG9uc2U6IHJlcXVlc3QgaGFzIG5vIHBheWxvYWQgKi8KK3N0cnVjdCBnYl9zZGlvX2dldF9jYXBzX3Jlc3BvbnNlIHsKKwlfX2xlMzIJY2FwczsKKyNkZWZpbmUgR0JfU0RJT19DQVBfTk9OUkVNT1ZBQkxFCTB4MDAwMDAwMDEKKyNkZWZpbmUgR0JfU0RJT19DQVBfNF9CSVRfREFUQQkJMHgwMDAwMDAwMgorI2RlZmluZSBHQl9TRElPX0NBUF84X0JJVF9EQVRBCQkweDAwMDAwMDA0CisjZGVmaW5lIEdCX1NESU9fQ0FQX01NQ19IUwkJMHgwMDAwMDAwOAorI2RlZmluZSBHQl9TRElPX0NBUF9TRF9IUwkJMHgwMDAwMDAxMAorI2RlZmluZSBHQl9TRElPX0NBUF9FUkFTRQkJMHgwMDAwMDAyMAorI2RlZmluZSBHQl9TRElPX0NBUF8xXzJWX0REUgkJMHgwMDAwMDA0MAorI2RlZmluZSBHQl9TRElPX0NBUF8xXzhWX0REUgkJMHgwMDAwMDA4MAorI2RlZmluZSBHQl9TRElPX0NBUF9QT1dFUl9PRkZfQ0FSRAkweDAwMDAwMTAwCisjZGVmaW5lIEdCX1NESU9fQ0FQX1VIU19TRFIxMgkJMHgwMDAwMDIwMAorI2RlZmluZSBHQl9TRElPX0NBUF9VSFNfU0RSMjUJCTB4MDAwMDA0MDAKKyNkZWZpbmUgR0JfU0RJT19DQVBfVUhTX1NEUjUwCQkweDAwMDAwODAwCisjZGVmaW5lIEdCX1NESU9fQ0FQX1VIU19TRFIxMDQJCTB4MDAwMDEwMDAKKyNkZWZpbmUgR0JfU0RJT19DQVBfVUhTX0REUjUwCQkweDAwMDAyMDAwCisjZGVmaW5lIEdCX1NESU9fQ0FQX0RSSVZFUl9UWVBFX0EJMHgwMDAwNDAwMAorI2RlZmluZSBHQl9TRElPX0NBUF9EUklWRVJfVFlQRV9DCTB4MDAwMDgwMDAKKyNkZWZpbmUgR0JfU0RJT19DQVBfRFJJVkVSX1RZUEVfRAkweDAwMDEwMDAwCisjZGVmaW5lIEdCX1NESU9fQ0FQX0hTMjAwXzFfMlYJCTB4MDAwMjAwMDAKKyNkZWZpbmUgR0JfU0RJT19DQVBfSFMyMDBfMV84VgkJMHgwMDA0MDAwMAorI2RlZmluZSBHQl9TRElPX0NBUF9IUzQwMF8xXzJWCQkweDAwMDgwMDAwCisjZGVmaW5lIEdCX1NESU9fQ0FQX0hTNDAwXzFfOFYJCTB4MDAxMDAwMDAKKworCS8qIHNlZSBwb3NzaWJsZSB2YWx1ZXMgYmVsb3cgYXQgdmRkICovCisJX19sZTMyIG9jcjsKKwlfX2xlMzIgZl9taW47CisJX19sZTMyIGZfbWF4OworCV9fbGUxNiBtYXhfYmxrX2NvdW50OworCV9fbGUxNiBtYXhfYmxrX3NpemU7Cit9IF9fcGFja2VkOworCisvKiBzZXQgaW9zIHJlcXVlc3Q6IHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCitzdHJ1Y3QgZ2Jfc2Rpb19zZXRfaW9zX3JlcXVlc3QgeworCV9fbGUzMgljbG9jazsKKwlfX2xlMzIJdmRkOworI2RlZmluZSBHQl9TRElPX1ZERF8xNjVfMTk1CTB4MDAwMDAwMDEKKyNkZWZpbmUgR0JfU0RJT19WRERfMjBfMjEJMHgwMDAwMDAwMgorI2RlZmluZSBHQl9TRElPX1ZERF8yMV8yMgkweDAwMDAwMDA0CisjZGVmaW5lIEdCX1NESU9fVkREXzIyXzIzCTB4MDAwMDAwMDgKKyNkZWZpbmUgR0JfU0RJT19WRERfMjNfMjQJMHgwMDAwMDAxMAorI2RlZmluZSBHQl9TRElPX1ZERF8yNF8yNQkweDAwMDAwMDIwCisjZGVmaW5lIEdCX1NESU9fVkREXzI1XzI2CTB4MDAwMDAwNDAKKyNkZWZpbmUgR0JfU0RJT19WRERfMjZfMjcJMHgwMDAwMDA4MAorI2RlZmluZSBHQl9TRElPX1ZERF8yN18yOAkweDAwMDAwMTAwCisjZGVmaW5lIEdCX1NESU9fVkREXzI4XzI5CTB4MDAwMDAyMDAKKyNkZWZpbmUgR0JfU0RJT19WRERfMjlfMzAJMHgwMDAwMDQwMAorI2RlZmluZSBHQl9TRElPX1ZERF8zMF8zMQkweDAwMDAwODAwCisjZGVmaW5lIEdCX1NESU9fVkREXzMxXzMyCTB4MDAwMDEwMDAKKyNkZWZpbmUgR0JfU0RJT19WRERfMzJfMzMJMHgwMDAwMjAwMAorI2RlZmluZSBHQl9TRElPX1ZERF8zM18zNAkweDAwMDA0MDAwCisjZGVmaW5lIEdCX1NESU9fVkREXzM0XzM1CTB4MDAwMDgwMDAKKyNkZWZpbmUgR0JfU0RJT19WRERfMzVfMzYJMHgwMDAxMDAwMAorCisJX191OAlidXNfbW9kZTsKKyNkZWZpbmUgR0JfU0RJT19CVVNNT0RFX09QRU5EUkFJTgkweDAwCisjZGVmaW5lIEdCX1NESU9fQlVTTU9ERV9QVVNIUFVMTAkweDAxCisKKwlfX3U4CXBvd2VyX21vZGU7CisjZGVmaW5lIEdCX1NESU9fUE9XRVJfT0ZGCTB4MDAKKyNkZWZpbmUgR0JfU0RJT19QT1dFUl9VUAkweDAxCisjZGVmaW5lIEdCX1NESU9fUE9XRVJfT04JMHgwMgorI2RlZmluZSBHQl9TRElPX1BPV0VSX1VOREVGSU5FRAkweDAzCisKKwlfX3U4CWJ1c193aWR0aDsKKyNkZWZpbmUgR0JfU0RJT19CVVNfV0lEVEhfMQkweDAwCisjZGVmaW5lIEdCX1NESU9fQlVTX1dJRFRIXzQJMHgwMgorI2RlZmluZSBHQl9TRElPX0JVU19XSURUSF84CTB4MDMKKworCV9fdTgJdGltaW5nOworI2RlZmluZSBHQl9TRElPX1RJTUlOR19MRUdBQ1kJCTB4MDAKKyNkZWZpbmUgR0JfU0RJT19USU1JTkdfTU1DX0hTCQkweDAxCisjZGVmaW5lIEdCX1NESU9fVElNSU5HX1NEX0hTCQkweDAyCisjZGVmaW5lIEdCX1NESU9fVElNSU5HX1VIU19TRFIxMgkweDAzCisjZGVmaW5lIEdCX1NESU9fVElNSU5HX1VIU19TRFIyNQkweDA0CisjZGVmaW5lIEdCX1NESU9fVElNSU5HX1VIU19TRFI1MAkweDA1CisjZGVmaW5lIEdCX1NESU9fVElNSU5HX1VIU19TRFIxMDQJMHgwNgorI2RlZmluZSBHQl9TRElPX1RJTUlOR19VSFNfRERSNTAJMHgwNworI2RlZmluZSBHQl9TRElPX1RJTUlOR19NTUNfRERSNTIJMHgwOAorI2RlZmluZSBHQl9TRElPX1RJTUlOR19NTUNfSFMyMDAJMHgwOQorI2RlZmluZSBHQl9TRElPX1RJTUlOR19NTUNfSFM0MDAJMHgwQQorCisJX191OAlzaWduYWxfdm9sdGFnZTsKKyNkZWZpbmUgR0JfU0RJT19TSUdOQUxfVk9MVEFHRV8zMzAJMHgwMAorI2RlZmluZSBHQl9TRElPX1NJR05BTF9WT0xUQUdFXzE4MAkweDAxCisjZGVmaW5lIEdCX1NESU9fU0lHTkFMX1ZPTFRBR0VfMTIwCTB4MDIKKworCV9fdTgJZHJ2X3R5cGU7CisjZGVmaW5lIEdCX1NESU9fU0VUX0RSSVZFUl9UWVBFX0IJMHgwMAorI2RlZmluZSBHQl9TRElPX1NFVF9EUklWRVJfVFlQRV9BCTB4MDEKKyNkZWZpbmUgR0JfU0RJT19TRVRfRFJJVkVSX1RZUEVfQwkweDAyCisjZGVmaW5lIEdCX1NESU9fU0VUX0RSSVZFUl9UWVBFX0QJMHgwMworfSBfX3BhY2tlZDsKKworLyogY29tbWFuZCByZXF1ZXN0ICovCitzdHJ1Y3QgZ2Jfc2Rpb19jb21tYW5kX3JlcXVlc3QgeworCV9fdTgJY21kOworCV9fdTgJY21kX2ZsYWdzOworI2RlZmluZSBHQl9TRElPX1JTUF9OT05FCQkweDAwCisjZGVmaW5lIEdCX1NESU9fUlNQX1BSRVNFTlQJCTB4MDEKKyNkZWZpbmUgR0JfU0RJT19SU1BfMTM2CQkJMHgwMgorI2RlZmluZSBHQl9TRElPX1JTUF9DUkMJCQkweDA0CisjZGVmaW5lIEdCX1NESU9fUlNQX0JVU1kJCTB4MDgKKyNkZWZpbmUgR0JfU0RJT19SU1BfT1BDT0RFCQkweDEwCisKKwlfX3U4CWNtZF90eXBlOworI2RlZmluZSBHQl9TRElPX0NNRF9BQwkJMHgwMAorI2RlZmluZSBHQl9TRElPX0NNRF9BRFRDCTB4MDEKKyNkZWZpbmUgR0JfU0RJT19DTURfQkMJCTB4MDIKKyNkZWZpbmUgR0JfU0RJT19DTURfQkNSCQkweDAzCisKKwlfX2xlMzIJY21kX2FyZzsKKwlfX2xlMTYJZGF0YV9ibG9ja3M7CisJX19sZTE2CWRhdGFfYmxrc3o7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2Jfc2Rpb19jb21tYW5kX3Jlc3BvbnNlIHsKKwlfX2xlMzIJcmVzcFs0XTsKK30gX19wYWNrZWQ7CisKKy8qIHRyYW5zZmVyIHJlcXVlc3QgKi8KK3N0cnVjdCBnYl9zZGlvX3RyYW5zZmVyX3JlcXVlc3QgeworCV9fdTgJZGF0YV9mbGFnczsKKyNkZWZpbmUgR0JfU0RJT19EQVRBX1dSSVRFCTB4MDEKKyNkZWZpbmUgR0JfU0RJT19EQVRBX1JFQUQJMHgwMgorI2RlZmluZSBHQl9TRElPX0RBVEFfU1RSRUFNCTB4MDQKKworCV9fbGUxNglkYXRhX2Jsb2NrczsKKwlfX2xlMTYJZGF0YV9ibGtzejsKKwlfX3U4CWRhdGFbMF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2Jfc2Rpb190cmFuc2Zlcl9yZXNwb25zZSB7CisJX19sZTE2CWRhdGFfYmxvY2tzOworCV9fbGUxNglkYXRhX2Jsa3N6OworCV9fdTgJZGF0YVswXTsKK30gX19wYWNrZWQ7CisKKy8qIGV2ZW50IHJlcXVlc3Q6IGdlbmVyYXRlZCBieSBtb2R1bGUgYW5kIGlzIGRlZmluZWQgYXMgdW5pZGlyZWN0aW9uYWwgKi8KK3N0cnVjdCBnYl9zZGlvX2V2ZW50X3JlcXVlc3QgeworCV9fdTgJZXZlbnQ7CisjZGVmaW5lIEdCX1NESU9fQ0FSRF9JTlNFUlRFRAkweDAxCisjZGVmaW5lIEdCX1NESU9fQ0FSRF9SRU1PVkVECTB4MDIKKyNkZWZpbmUgR0JfU0RJT19XUAkJMHgwNAorfSBfX3BhY2tlZDsKKworLyogQ2FtZXJhICovCisKKy8qIEdyZXlidXMgQ2FtZXJhIHJlcXVlc3QgdHlwZXMgKi8KKyNkZWZpbmUgR0JfQ0FNRVJBX1RZUEVfQ0FQQUJJTElUSUVTCQkweDAyCisjZGVmaW5lIEdCX0NBTUVSQV9UWVBFX0NPTkZJR1VSRV9TVFJFQU1TCTB4MDMKKyNkZWZpbmUgR0JfQ0FNRVJBX1RZUEVfQ0FQVFVSRQkJCTB4MDQKKyNkZWZpbmUgR0JfQ0FNRVJBX1RZUEVfRkxVU0gJCQkweDA1CisjZGVmaW5lIEdCX0NBTUVSQV9UWVBFX01FVEFEQVRBCQkJMHgwNgorCisjZGVmaW5lIEdCX0NBTUVSQV9NQVhfU1RSRUFNUwkJCTQKKyNkZWZpbmUgR0JfQ0FNRVJBX01BWF9TRVRUSU5HU19TSVpFCQk4MTkyCisKKy8qIEdyZXlidXMgQ2FtZXJhIENvbmZpZ3VyZSBTdHJlYW1zIHJlcXVlc3QgcGF5bG9hZCAqLworc3RydWN0IGdiX2NhbWVyYV9zdHJlYW1fY29uZmlnX3JlcXVlc3QgeworCV9fbGUxNiB3aWR0aDsKKwlfX2xlMTYgaGVpZ2h0OworCV9fbGUxNiBmb3JtYXQ7CisJX19sZTE2IHBhZGRpbmc7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfY2FtZXJhX2NvbmZpZ3VyZV9zdHJlYW1zX3JlcXVlc3QgeworCV9fdTggbnVtX3N0cmVhbXM7CisJX191OCBmbGFnczsKKyNkZWZpbmUgR0JfQ0FNRVJBX0NPTkZJR1VSRV9TVFJFQU1TX1RFU1RfT05MWQkweDAxCisJX19sZTE2IHBhZGRpbmc7CisJc3RydWN0IGdiX2NhbWVyYV9zdHJlYW1fY29uZmlnX3JlcXVlc3QgY29uZmlnWzBdOworfSBfX3BhY2tlZDsKKworLyogR3JleWJ1cyBDYW1lcmEgQ29uZmlndXJlIFN0cmVhbXMgcmVzcG9uc2UgcGF5bG9hZCAqLworc3RydWN0IGdiX2NhbWVyYV9zdHJlYW1fY29uZmlnX3Jlc3BvbnNlIHsKKwlfX2xlMTYgd2lkdGg7CisJX19sZTE2IGhlaWdodDsKKwlfX2xlMTYgZm9ybWF0OworCV9fdTggdmlydHVhbF9jaGFubmVsOworCV9fdTggZGF0YV90eXBlWzJdOworCV9fbGUxNiBtYXhfcGt0X3NpemU7CisJX191OCBwYWRkaW5nOworCV9fbGUzMiBtYXhfc2l6ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9jYW1lcmFfY29uZmlndXJlX3N0cmVhbXNfcmVzcG9uc2UgeworCV9fdTggbnVtX3N0cmVhbXM7CisjZGVmaW5lIEdCX0NBTUVSQV9DT05GSUdVUkVfU1RSRUFNU19BREpVU1RFRAkweDAxCisJX191OCBmbGFnczsKKwlfX3U4IHBhZGRpbmdbMl07CisJX19sZTMyIGRhdGFfcmF0ZTsKKwlzdHJ1Y3QgZ2JfY2FtZXJhX3N0cmVhbV9jb25maWdfcmVzcG9uc2UgY29uZmlnWzBdOworfTsKKworLyogR3JleWJ1cyBDYW1lcmEgQ2FwdHVyZSByZXF1ZXN0IHBheWxvYWQgLSByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworc3RydWN0IGdiX2NhbWVyYV9jYXB0dXJlX3JlcXVlc3QgeworCV9fbGUzMiByZXF1ZXN0X2lkOworCV9fdTggc3RyZWFtczsKKwlfX3U4IHBhZGRpbmc7CisJX19sZTE2IG51bV9mcmFtZXM7CisJX191OCBzZXR0aW5nc1swXTsKK30gX19wYWNrZWQ7CisKKy8qIEdyZXlidXMgQ2FtZXJhIEZsdXNoIHJlc3BvbnNlIHBheWxvYWQgLSByZXF1ZXN0IGhhcyBubyBwYXlsb2FkICovCitzdHJ1Y3QgZ2JfY2FtZXJhX2ZsdXNoX3Jlc3BvbnNlIHsKKwlfX2xlMzIgcmVxdWVzdF9pZDsKK30gX19wYWNrZWQ7CisKKy8qIEdyZXlidXMgQ2FtZXJhIE1ldGFkYXRhIHJlcXVlc3QgcGF5bG9hZCAtIG9wZXJhdGlvbiBoYXMgbm8gcmVzcG9uc2UgKi8KK3N0cnVjdCBnYl9jYW1lcmFfbWV0YWRhdGFfcmVxdWVzdCB7CisJX19sZTMyIHJlcXVlc3RfaWQ7CisJX19sZTE2IGZyYW1lX251bWJlcjsKKwlfX3U4IHN0cmVhbTsKKwlfX3U4IHBhZGRpbmc7CisJX191OCBtZXRhZGF0YVswXTsKK30gX19wYWNrZWQ7CisKKy8qIExpZ2h0cyAqLworCisvKiBHcmV5YnVzIExpZ2h0cyByZXF1ZXN0IHR5cGVzICovCisjZGVmaW5lIEdCX0xJR0hUU19UWVBFX0dFVF9MSUdIVFMJCTB4MDIKKyNkZWZpbmUgR0JfTElHSFRTX1RZUEVfR0VUX0xJR0hUX0NPTkZJRwkJMHgwMworI2RlZmluZSBHQl9MSUdIVFNfVFlQRV9HRVRfQ0hBTk5FTF9DT05GSUcJMHgwNAorI2RlZmluZSBHQl9MSUdIVFNfVFlQRV9HRVRfQ0hBTk5FTF9GTEFTSF9DT05GSUcJMHgwNQorI2RlZmluZSBHQl9MSUdIVFNfVFlQRV9TRVRfQlJJR0hUTkVTUwkJMHgwNgorI2RlZmluZSBHQl9MSUdIVFNfVFlQRV9TRVRfQkxJTksJCTB4MDcKKyNkZWZpbmUgR0JfTElHSFRTX1RZUEVfU0VUX0NPTE9SCQkweDA4CisjZGVmaW5lIEdCX0xJR0hUU19UWVBFX1NFVF9GQURFCQkJMHgwOQorI2RlZmluZSBHQl9MSUdIVFNfVFlQRV9FVkVOVAkJCTB4MEEKKyNkZWZpbmUgR0JfTElHSFRTX1RZUEVfU0VUX0ZMQVNIX0lOVEVOU0lUWQkweDBCCisjZGVmaW5lIEdCX0xJR0hUU19UWVBFX1NFVF9GTEFTSF9TVFJPQkUJCTB4MEMKKyNkZWZpbmUgR0JfTElHSFRTX1RZUEVfU0VUX0ZMQVNIX1RJTUVPVVQJMHgwRAorI2RlZmluZSBHQl9MSUdIVFNfVFlQRV9HRVRfRkxBU0hfRkFVTFQJCTB4MEUKKworLyogR3JleWJ1cyBMaWdodCBtb2RlcyAqLworCisvKgorICogaWYgeW91IGFkZCBhbnkgc3BlY2lmaWMgbW9kZSBiZWxvdywgdXBkYXRlIGFsc28gdGhlCisgKiBHQl9DSEFOTkVMX01PREVfREVGSU5FRF9SQU5HRSB2YWx1ZSBhY2NvcmRpbmdseQorICovCisjZGVmaW5lIEdCX0NIQU5ORUxfTU9ERV9OT05FCQkweDAwMDAwMDAwCisjZGVmaW5lIEdCX0NIQU5ORUxfTU9ERV9CQVRURVJZCQkweDAwMDAwMDAxCisjZGVmaW5lIEdCX0NIQU5ORUxfTU9ERV9QT1dFUgkJMHgwMDAwMDAwMgorI2RlZmluZSBHQl9DSEFOTkVMX01PREVfV0lSRUxFU1MJMHgwMDAwMDAwNAorI2RlZmluZSBHQl9DSEFOTkVMX01PREVfQkxVRVRPT1RICTB4MDAwMDAwMDgKKyNkZWZpbmUgR0JfQ0hBTk5FTF9NT0RFX0tFWUJPQVJECTB4MDAwMDAwMTAKKyNkZWZpbmUgR0JfQ0hBTk5FTF9NT0RFX0JVVFRPTlMJCTB4MDAwMDAwMjAKKyNkZWZpbmUgR0JfQ0hBTk5FTF9NT0RFX05PVElGSUNBVElPTgkweDAwMDAwMDQwCisjZGVmaW5lIEdCX0NIQU5ORUxfTU9ERV9BVFRFTlRJT04JMHgwMDAwMDA4MAorI2RlZmluZSBHQl9DSEFOTkVMX01PREVfRkxBU0gJCTB4MDAwMDAxMDAKKyNkZWZpbmUgR0JfQ0hBTk5FTF9NT0RFX1RPUkNICQkweDAwMDAwMjAwCisjZGVmaW5lIEdCX0NIQU5ORUxfTU9ERV9JTkRJQ0FUT1IJMHgwMDAwMDQwMAorCisvKiBMaWdodHMgTW9kZSB2YWxpZCBiaXQgdmFsdWVzICovCisjZGVmaW5lIEdCX0NIQU5ORUxfTU9ERV9ERUZJTkVEX1JBTkdFCTB4MDAwMDA0RkYKKyNkZWZpbmUgR0JfQ0hBTk5FTF9NT0RFX1ZFTkRPUl9SQU5HRQkweDAwRjAwMDAwCisKKy8qIEdyZXlidXMgTGlnaHQgQ2hhbm5lbHMgRmxhZ3MgKi8KKyNkZWZpbmUgR0JfTElHSFRfQ0hBTk5FTF9NVUxUSUNPTE9SCTB4MDAwMDAwMDEKKyNkZWZpbmUgR0JfTElHSFRfQ0hBTk5FTF9GQURFUgkJMHgwMDAwMDAwMgorI2RlZmluZSBHQl9MSUdIVF9DSEFOTkVMX0JMSU5LCQkweDAwMDAwMDA0CisKKy8qIGdldCBjb3VudCBvZiBsaWdodHMgaW4gbW9kdWxlICovCitzdHJ1Y3QgZ2JfbGlnaHRzX2dldF9saWdodHNfcmVzcG9uc2UgeworCV9fdTgJbGlnaHRzX2NvdW50OworfSBfX3BhY2tlZDsKKworLyogbGlnaHQgY29uZmlnIHJlcXVlc3QgcGF5bG9hZCAqLworc3RydWN0IGdiX2xpZ2h0c19nZXRfbGlnaHRfY29uZmlnX3JlcXVlc3QgeworCV9fdTgJaWQ7Cit9IF9fcGFja2VkOworCisvKiBsaWdodCBjb25maWcgcmVzcG9uc2UgcGF5bG9hZCAqLworc3RydWN0IGdiX2xpZ2h0c19nZXRfbGlnaHRfY29uZmlnX3Jlc3BvbnNlIHsKKwlfX3U4CWNoYW5uZWxfY291bnQ7CisJX191OAluYW1lWzMyXTsKK30gX19wYWNrZWQ7CisKKy8qIGNoYW5uZWwgY29uZmlnIHJlcXVlc3QgcGF5bG9hZCAqLworc3RydWN0IGdiX2xpZ2h0c19nZXRfY2hhbm5lbF9jb25maWdfcmVxdWVzdCB7CisJX191OAlsaWdodF9pZDsKKwlfX3U4CWNoYW5uZWxfaWQ7Cit9IF9fcGFja2VkOworCisvKiBjaGFubmVsIGZsYXNoIGNvbmZpZyByZXF1ZXN0IHBheWxvYWQgKi8KK3N0cnVjdCBnYl9saWdodHNfZ2V0X2NoYW5uZWxfZmxhc2hfY29uZmlnX3JlcXVlc3QgeworCV9fdTgJbGlnaHRfaWQ7CisJX191OAljaGFubmVsX2lkOworfSBfX3BhY2tlZDsKKworLyogY2hhbm5lbCBjb25maWcgcmVzcG9uc2UgcGF5bG9hZCAqLworc3RydWN0IGdiX2xpZ2h0c19nZXRfY2hhbm5lbF9jb25maWdfcmVzcG9uc2UgeworCV9fdTgJbWF4X2JyaWdodG5lc3M7CisJX19sZTMyCWZsYWdzOworCV9fbGUzMgljb2xvcjsKKwlfX3U4CWNvbG9yX25hbWVbMzJdOworCV9fbGUzMgltb2RlOworCV9fdTgJbW9kZV9uYW1lWzMyXTsKK30gX19wYWNrZWQ7CisKKy8qIGNoYW5uZWwgZmxhc2ggY29uZmlnIHJlc3BvbnNlIHBheWxvYWQgKi8KK3N0cnVjdCBnYl9saWdodHNfZ2V0X2NoYW5uZWxfZmxhc2hfY29uZmlnX3Jlc3BvbnNlIHsKKwlfX2xlMzIJaW50ZW5zaXR5X21pbl91QTsKKwlfX2xlMzIJaW50ZW5zaXR5X21heF91QTsKKwlfX2xlMzIJaW50ZW5zaXR5X3N0ZXBfdUE7CisJX19sZTMyCXRpbWVvdXRfbWluX3VzOworCV9fbGUzMgl0aW1lb3V0X21heF91czsKKwlfX2xlMzIJdGltZW91dF9zdGVwX3VzOworfSBfX3BhY2tlZDsKKworLyogYmxpbmsgcmVxdWVzdCBwYXlsb2FkOiByZXNwb25zZSBoYXZlIG5vIHBheWxvYWQgKi8KK3N0cnVjdCBnYl9saWdodHNfYmxpbmtfcmVxdWVzdCB7CisJX191OAlsaWdodF9pZDsKKwlfX3U4CWNoYW5uZWxfaWQ7CisJX19sZTE2CXRpbWVfb25fbXM7CisJX19sZTE2CXRpbWVfb2ZmX21zOworfSBfX3BhY2tlZDsKKworLyogc2V0IGJyaWdodG5lc3MgcmVxdWVzdCBwYXlsb2FkOiByZXNwb25zZSBoYXZlIG5vIHBheWxvYWQgKi8KK3N0cnVjdCBnYl9saWdodHNfc2V0X2JyaWdodG5lc3NfcmVxdWVzdCB7CisJX191OAlsaWdodF9pZDsKKwlfX3U4CWNoYW5uZWxfaWQ7CisJX191OAlicmlnaHRuZXNzOworfSBfX3BhY2tlZDsKKworLyogc2V0IGNvbG9yIHJlcXVlc3QgcGF5bG9hZDogcmVzcG9uc2UgaGF2ZSBubyBwYXlsb2FkICovCitzdHJ1Y3QgZ2JfbGlnaHRzX3NldF9jb2xvcl9yZXF1ZXN0IHsKKwlfX3U4CWxpZ2h0X2lkOworCV9fdTgJY2hhbm5lbF9pZDsKKwlfX2xlMzIJY29sb3I7Cit9IF9fcGFja2VkOworCisvKiBzZXQgZmFkZSByZXF1ZXN0IHBheWxvYWQ6IHJlc3BvbnNlIGhhdmUgbm8gcGF5bG9hZCAqLworc3RydWN0IGdiX2xpZ2h0c19zZXRfZmFkZV9yZXF1ZXN0IHsKKwlfX3U4CWxpZ2h0X2lkOworCV9fdTgJY2hhbm5lbF9pZDsKKwlfX3U4CWZhZGVfaW47CisJX191OAlmYWRlX291dDsKK30gX19wYWNrZWQ7CisKKy8qIGV2ZW50IHJlcXVlc3Q6IGdlbmVyYXRlZCBieSBtb2R1bGUgKi8KK3N0cnVjdCBnYl9saWdodHNfZXZlbnRfcmVxdWVzdCB7CisJX191OAlsaWdodF9pZDsKKwlfX3U4CWV2ZW50OworI2RlZmluZSBHQl9MSUdIVFNfTElHSFRfQ09ORklHCQkweDAxCit9IF9fcGFja2VkOworCisvKiBzZXQgZmxhc2ggaW50ZW5zaXR5IHJlcXVlc3QgcGF5bG9hZDogcmVzcG9uc2UgaGF2ZSBubyBwYXlsb2FkICovCitzdHJ1Y3QgZ2JfbGlnaHRzX3NldF9mbGFzaF9pbnRlbnNpdHlfcmVxdWVzdCB7CisJX191OAlsaWdodF9pZDsKKwlfX3U4CWNoYW5uZWxfaWQ7CisJX19sZTMyCWludGVuc2l0eV91QTsKK30gX19wYWNrZWQ7CisKKy8qIHNldCBmbGFzaCBzdHJvYmUgc3RhdGUgcmVxdWVzdCBwYXlsb2FkOiByZXNwb25zZSBoYXZlIG5vIHBheWxvYWQgKi8KK3N0cnVjdCBnYl9saWdodHNfc2V0X2ZsYXNoX3N0cm9iZV9yZXF1ZXN0IHsKKwlfX3U4CWxpZ2h0X2lkOworCV9fdTgJY2hhbm5lbF9pZDsKKwlfX3U4CXN0YXRlOworfSBfX3BhY2tlZDsKKworLyogc2V0IGZsYXNoIHRpbWVvdXQgcmVxdWVzdCBwYXlsb2FkOiByZXNwb25zZSBoYXZlIG5vIHBheWxvYWQgKi8KK3N0cnVjdCBnYl9saWdodHNfc2V0X2ZsYXNoX3RpbWVvdXRfcmVxdWVzdCB7CisJX191OAlsaWdodF9pZDsKKwlfX3U4CWNoYW5uZWxfaWQ7CisJX19sZTMyCXRpbWVvdXRfdXM7Cit9IF9fcGFja2VkOworCisvKiBnZXQgZmxhc2ggZmF1bHQgcmVxdWVzdCBwYXlsb2FkICovCitzdHJ1Y3QgZ2JfbGlnaHRzX2dldF9mbGFzaF9mYXVsdF9yZXF1ZXN0IHsKKwlfX3U4CWxpZ2h0X2lkOworCV9fdTgJY2hhbm5lbF9pZDsKK30gX19wYWNrZWQ7CisKKy8qIGdldCBmbGFzaCBmYXVsdCByZXNwb25zZSBwYXlsb2FkICovCitzdHJ1Y3QgZ2JfbGlnaHRzX2dldF9mbGFzaF9mYXVsdF9yZXNwb25zZSB7CisJX19sZTMyCWZhdWx0OworI2RlZmluZSBHQl9MSUdIVFNfRkxBU0hfRkFVTFRfT1ZFUl9WT0xUQUdFCQkweDAwMDAwMDAwCisjZGVmaW5lIEdCX0xJR0hUU19GTEFTSF9GQVVMVF9USU1FT1VUCQkJMHgwMDAwMDAwMQorI2RlZmluZSBHQl9MSUdIVFNfRkxBU0hfRkFVTFRfT1ZFUl9URU1QRVJBVFVSRQkJMHgwMDAwMDAwMgorI2RlZmluZSBHQl9MSUdIVFNfRkxBU0hfRkFVTFRfU0hPUlRfQ0lSQ1VJVAkJMHgwMDAwMDAwNAorI2RlZmluZSBHQl9MSUdIVFNfRkxBU0hfRkFVTFRfT1ZFUl9DVVJSRU5UCQkweDAwMDAwMDA4CisjZGVmaW5lIEdCX0xJR0hUU19GTEFTSF9GQVVMVF9JTkRJQ0FUT1IJCQkweDAwMDAwMDEwCisjZGVmaW5lIEdCX0xJR0hUU19GTEFTSF9GQVVMVF9VTkRFUl9WT0xUQUdFCQkweDAwMDAwMDIwCisjZGVmaW5lIEdCX0xJR0hUU19GTEFTSF9GQVVMVF9JTlBVVF9WT0xUQUdFCQkweDAwMDAwMDQwCisjZGVmaW5lIEdCX0xJR0hUU19GTEFTSF9GQVVMVF9MRURfT1ZFUl9URU1QRVJBVFVSRQkweDAwMDAwMDgwCit9IF9fcGFja2VkOworCisvKiBBdWRpbyAqLworCisjZGVmaW5lIEdCX0FVRElPX1RZUEVfR0VUX1RPUE9MT0dZX1NJWkUJCTB4MDIKKyNkZWZpbmUgR0JfQVVESU9fVFlQRV9HRVRfVE9QT0xPR1kJCTB4MDMKKyNkZWZpbmUgR0JfQVVESU9fVFlQRV9HRVRfQ09OVFJPTAkJMHgwNAorI2RlZmluZSBHQl9BVURJT19UWVBFX1NFVF9DT05UUk9MCQkweDA1CisjZGVmaW5lIEdCX0FVRElPX1RZUEVfRU5BQkxFX1dJREdFVAkJMHgwNgorI2RlZmluZSBHQl9BVURJT19UWVBFX0RJU0FCTEVfV0lER0VUCQkweDA3CisjZGVmaW5lIEdCX0FVRElPX1RZUEVfR0VUX1BDTQkJCTB4MDgKKyNkZWZpbmUgR0JfQVVESU9fVFlQRV9TRVRfUENNCQkJMHgwOQorI2RlZmluZSBHQl9BVURJT19UWVBFX1NFVF9UWF9EQVRBX1NJWkUJCTB4MGEKKwkJCQkJCS8qIDB4MGIgdW51c2VkICovCisjZGVmaW5lIEdCX0FVRElPX1RZUEVfQUNUSVZBVEVfVFgJCTB4MGMKKyNkZWZpbmUgR0JfQVVESU9fVFlQRV9ERUFDVElWQVRFX1RYCQkweDBkCisjZGVmaW5lIEdCX0FVRElPX1RZUEVfU0VUX1JYX0RBVEFfU0laRQkJMHgwZQorCQkJCQkJLyogMHgwZiB1bnVzZWQgKi8KKyNkZWZpbmUgR0JfQVVESU9fVFlQRV9BQ1RJVkFURV9SWAkJMHgxMAorI2RlZmluZSBHQl9BVURJT19UWVBFX0RFQUNUSVZBVEVfUlgJCTB4MTEKKyNkZWZpbmUgR0JfQVVESU9fVFlQRV9KQUNLX0VWRU5UCQkweDEyCisjZGVmaW5lIEdCX0FVRElPX1RZUEVfQlVUVE9OX0VWRU5UCQkweDEzCisjZGVmaW5lIEdCX0FVRElPX1RZUEVfU1RSRUFNSU5HX0VWRU5UCQkweDE0CisjZGVmaW5lIEdCX0FVRElPX1RZUEVfU0VORF9EQVRBCQkJMHgxNQorCisvKiBNb2R1bGUgbXVzdCBiZSBhYmxlIHRvIGJ1ZmZlciAxMG1zIG9mIGF1ZGlvIGRhdGEsIG1pbmltdW0gKi8KKyNkZWZpbmUgR0JfQVVESU9fU0FNUExFX0JVRkZFUl9NSU5fVVMJCTEwMDAwCisKKyNkZWZpbmUgR0JfQVVESU9fUENNX05BTUVfTUFYCQkJMzIKKyNkZWZpbmUgQVVESU9fREFJX05BTUVfTUFYCQkJMzIKKyNkZWZpbmUgQVVESU9fQ09OVFJPTF9OQU1FX01BWAkJCTMyCisjZGVmaW5lIEFVRElPX0NUTF9FTEVNX05BTUVfTUFYCQkJNDQKKyNkZWZpbmUgQVVESU9fRU5VTV9OQU1FX01BWAkJCTY0CisjZGVmaW5lIEFVRElPX1dJREdFVF9OQU1FX01BWAkJCTMyCisKKy8qIFNlZSBTTkRSVl9QQ01fRk1UQklUXyogaW4gTGludXggc291cmNlICovCisjZGVmaW5lIEdCX0FVRElPX1BDTV9GTVRfUzgJCQlCSVQoMCkKKyNkZWZpbmUgR0JfQVVESU9fUENNX0ZNVF9VOAkJCUJJVCgxKQorI2RlZmluZSBHQl9BVURJT19QQ01fRk1UX1MxNl9MRQkJCUJJVCgyKQorI2RlZmluZSBHQl9BVURJT19QQ01fRk1UX1MxNl9CRQkJCUJJVCgzKQorI2RlZmluZSBHQl9BVURJT19QQ01fRk1UX1UxNl9MRQkJCUJJVCg0KQorI2RlZmluZSBHQl9BVURJT19QQ01fRk1UX1UxNl9CRQkJCUJJVCg1KQorI2RlZmluZSBHQl9BVURJT19QQ01fRk1UX1MyNF9MRQkJCUJJVCg2KQorI2RlZmluZSBHQl9BVURJT19QQ01fRk1UX1MyNF9CRQkJCUJJVCg3KQorI2RlZmluZSBHQl9BVURJT19QQ01fRk1UX1UyNF9MRQkJCUJJVCg4KQorI2RlZmluZSBHQl9BVURJT19QQ01fRk1UX1UyNF9CRQkJCUJJVCg5KQorI2RlZmluZSBHQl9BVURJT19QQ01fRk1UX1MzMl9MRQkJCUJJVCgxMCkKKyNkZWZpbmUgR0JfQVVESU9fUENNX0ZNVF9TMzJfQkUJCQlCSVQoMTEpCisjZGVmaW5lIEdCX0FVRElPX1BDTV9GTVRfVTMyX0xFCQkJQklUKDEyKQorI2RlZmluZSBHQl9BVURJT19QQ01fRk1UX1UzMl9CRQkJCUJJVCgxMykKKworLyogU2VlIFNORFJWX1BDTV9SQVRFXyogaW4gTGludXggc291cmNlICovCisjZGVmaW5lIEdCX0FVRElPX1BDTV9SQVRFXzU1MTIJCQlCSVQoMCkKKyNkZWZpbmUgR0JfQVVESU9fUENNX1JBVEVfODAwMAkJCUJJVCgxKQorI2RlZmluZSBHQl9BVURJT19QQ01fUkFURV8xMTAyNQkJCUJJVCgyKQorI2RlZmluZSBHQl9BVURJT19QQ01fUkFURV8xNjAwMAkJCUJJVCgzKQorI2RlZmluZSBHQl9BVURJT19QQ01fUkFURV8yMjA1MAkJCUJJVCg0KQorI2RlZmluZSBHQl9BVURJT19QQ01fUkFURV8zMjAwMAkJCUJJVCg1KQorI2RlZmluZSBHQl9BVURJT19QQ01fUkFURV80NDEwMAkJCUJJVCg2KQorI2RlZmluZSBHQl9BVURJT19QQ01fUkFURV80ODAwMAkJCUJJVCg3KQorI2RlZmluZSBHQl9BVURJT19QQ01fUkFURV82NDAwMAkJCUJJVCg4KQorI2RlZmluZSBHQl9BVURJT19QQ01fUkFURV84ODIwMAkJCUJJVCg5KQorI2RlZmluZSBHQl9BVURJT19QQ01fUkFURV85NjAwMAkJCUJJVCgxMCkKKyNkZWZpbmUgR0JfQVVESU9fUENNX1JBVEVfMTc2NDAwCQlCSVQoMTEpCisjZGVmaW5lIEdCX0FVRElPX1BDTV9SQVRFXzE5MjAwMAkJQklUKDEyKQorCisjZGVmaW5lIEdCX0FVRElPX1NUUkVBTV9UWVBFX0NBUFRVUkUJCTB4MQorI2RlZmluZSBHQl9BVURJT19TVFJFQU1fVFlQRV9QTEFZQkFDSwkJMHgyCisKKyNkZWZpbmUgR0JfQVVESU9fQ1RMX0VMRU1fQUNDRVNTX1JFQUQJCUJJVCgwKQorI2RlZmluZSBHQl9BVURJT19DVExfRUxFTV9BQ0NFU1NfV1JJVEUJCUJJVCgxKQorCisvKiBTZWUgU05EUlZfQ1RMX0VMRU1fVFlQRV8qIGluIExpbnV4IHNvdXJjZSAqLworI2RlZmluZSBHQl9BVURJT19DVExfRUxFTV9UWVBFX0JPT0xFQU4JCTB4MDEKKyNkZWZpbmUgR0JfQVVESU9fQ1RMX0VMRU1fVFlQRV9JTlRFR0VSCQkweDAyCisjZGVmaW5lIEdCX0FVRElPX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRAkweDAzCisjZGVmaW5lIEdCX0FVRElPX0NUTF9FTEVNX1RZUEVfSU5URUdFUjY0CTB4MDYKKworLyogU2VlIFNORFJWX0NUTF9FTEVNX0lGQUNFXyogaW4gTGludXggc291cmNlICovCisjZGVmaW5lIEdCX0FVRElPX0NUTF9FTEVNX0lGQUNFX0NBUkQJCTB4MDAKKyNkZWZpbmUgR0JfQVVESU9fQ1RMX0VMRU1fSUZBQ0VfSFdERVAJCTB4MDEKKyNkZWZpbmUgR0JfQVVESU9fQ1RMX0VMRU1fSUZBQ0VfTUlYRVIJCTB4MDIKKyNkZWZpbmUgR0JfQVVESU9fQ1RMX0VMRU1fSUZBQ0VfUENNCQkweDAzCisjZGVmaW5lIEdCX0FVRElPX0NUTF9FTEVNX0lGQUNFX1JBV01JREkJCTB4MDQKKyNkZWZpbmUgR0JfQVVESU9fQ1RMX0VMRU1fSUZBQ0VfVElNRVIJCTB4MDUKKyNkZWZpbmUgR0JfQVVESU9fQ1RMX0VMRU1fSUZBQ0VfU0VRVUVOQ0VSCTB4MDYKKworLyogU05EUlZfQ1RMX0VMRU1fQUNDRVNTXyogaW4gTGludXggc291cmNlICovCisjZGVmaW5lIEdCX0FVRElPX0FDQ0VTU19SRUFECQkJQklUKDApCisjZGVmaW5lIEdCX0FVRElPX0FDQ0VTU19XUklURQkJCUJJVCgxKQorI2RlZmluZSBHQl9BVURJT19BQ0NFU1NfVk9MQVRJTEUJCUJJVCgyKQorI2RlZmluZSBHQl9BVURJT19BQ0NFU1NfVElNRVNUQU1QCQlCSVQoMykKKyNkZWZpbmUgR0JfQVVESU9fQUNDRVNTX1RMVl9SRUFECQlCSVQoNCkKKyNkZWZpbmUgR0JfQVVESU9fQUNDRVNTX1RMVl9XUklURQkJQklUKDUpCisjZGVmaW5lIEdCX0FVRElPX0FDQ0VTU19UTFZfQ09NTUFORAkJQklUKDYpCisjZGVmaW5lIEdCX0FVRElPX0FDQ0VTU19JTkFDVElWRQkJQklUKDcpCisjZGVmaW5lIEdCX0FVRElPX0FDQ0VTU19MT0NLCQkJQklUKDgpCisjZGVmaW5lIEdCX0FVRElPX0FDQ0VTU19PV05FUgkJCUJJVCg5KQorCisvKiBlbnVtIHNuZF9zb2NfZGFwbV90eXBlICovCisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX0lOUFVUCQkweDAKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfT1VUUFVUCQkweDEKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfTVVYCQkweDIKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfVklSVF9NVVgJCTB4MworI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9WQUxVRV9NVVgJCTB4NAorI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9NSVhFUgkJMHg1CisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX01JWEVSX05BTUVEX0NUTAkweDYKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfUEdBCQkweDcKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfT1VUX0RSVgkJMHg4CisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX0FEQwkJMHg5CisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX0RBQwkJMHhhCisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX01JQ0JJQVMJCTB4YgorI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9NSUMJCTB4YworI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9IUAkJCTB4ZAorI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9TUEsJCTB4ZQorI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9MSU5FCQkweGYKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfU1dJVENICQkweDEwCisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX1ZNSUQJCTB4MTEKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfUFJFCQkweDEyCisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX1BPU1QJCTB4MTMKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfU1VQUExZCQkweDE0CisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX1JFR1VMQVRPUl9TVVBQTFkJMHgxNQorI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9DTE9DS19TVVBQTFkJMHgxNgorI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9BSUZfSU4JCTB4MTcKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfQUlGX09VVAkJMHgxOAorI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9TSUdHRU4JCTB4MTkKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfREFJX0lOCQkweDFhCisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX0RBSV9PVVQJCTB4MWIKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfREFJX0xJTksJCTB4MWMKKworI2RlZmluZSBHQl9BVURJT19XSURHRVRfU1RBVEVfRElTQUJMRUQJCTB4MDEKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1NUQVRFX0VOQUFCTEVECQkweDAyCisKKyNkZWZpbmUgR0JfQVVESU9fSkFDS19FVkVOVF9JTlNFUlRJT04JCTB4MQorI2RlZmluZSBHQl9BVURJT19KQUNLX0VWRU5UX1JFTU9WQUwJCTB4MgorCisjZGVmaW5lIEdCX0FVRElPX0JVVFRPTl9FVkVOVF9QUkVTUwkJMHgxCisjZGVmaW5lIEdCX0FVRElPX0JVVFRPTl9FVkVOVF9SRUxFQVNFCQkweDIKKworI2RlZmluZSBHQl9BVURJT19TVFJFQU1JTkdfRVZFTlRfVU5TUEVDSUZJRUQJMHgxCisjZGVmaW5lIEdCX0FVRElPX1NUUkVBTUlOR19FVkVOVF9IQUxUCQkweDIKKyNkZWZpbmUgR0JfQVVESU9fU1RSRUFNSU5HX0VWRU5UX0lOVEVSTkFMX0VSUk9SCTB4MworI2RlZmluZSBHQl9BVURJT19TVFJFQU1JTkdfRVZFTlRfUFJPVE9DT0xfRVJST1IJMHg0CisjZGVmaW5lIEdCX0FVRElPX1NUUkVBTUlOR19FVkVOVF9GQUlMVVJFCTB4NQorI2RlZmluZSBHQl9BVURJT19TVFJFQU1JTkdfRVZFTlRfVU5ERVJSVU4JMHg2CisjZGVmaW5lIEdCX0FVRElPX1NUUkVBTUlOR19FVkVOVF9PVkVSUlVOCTB4NworI2RlZmluZSBHQl9BVURJT19TVFJFQU1JTkdfRVZFTlRfQ0xPQ0tJTkcJMHg4CisjZGVmaW5lIEdCX0FVRElPX1NUUkVBTUlOR19FVkVOVF9EQVRBX0xFTgkweDkKKworI2RlZmluZSBHQl9BVURJT19JTlZBTElEX0lOREVYCQkJMHhmZgorCisvKiBlbnVtIHNuZF9qYWNrX3R5cGVzICovCisjZGVmaW5lIEdCX0FVRElPX0pBQ0tfSEVBRFBIT05FCQkJMHgwMDAwMDAxCisjZGVmaW5lIEdCX0FVRElPX0pBQ0tfTUlDUk9QSE9ORQkJMHgwMDAwMDAyCisjZGVmaW5lIEdCX0FVRElPX0pBQ0tfSEVBRFNFVAkJCShHQl9BVURJT19KQUNLX0hFQURQSE9ORSB8IFwKKwkJCQkJCSBHQl9BVURJT19KQUNLX01JQ1JPUEhPTkUpCisjZGVmaW5lIEdCX0FVRElPX0pBQ0tfTElORU9VVAkJCTB4MDAwMDAwNAorI2RlZmluZSBHQl9BVURJT19KQUNLX01FQ0hBTklDQUwJCTB4MDAwMDAwOAorI2RlZmluZSBHQl9BVURJT19KQUNLX1ZJREVPT1VUCQkJMHgwMDAwMDEwCisjZGVmaW5lIEdCX0FVRElPX0pBQ0tfQVZPVVQJCQkoR0JfQVVESU9fSkFDS19MSU5FT1VUIHwgXAorCQkJCQkJIEdCX0FVRElPX0pBQ0tfVklERU9PVVQpCisjZGVmaW5lIEdCX0FVRElPX0pBQ0tfTElORUlOCQkJMHgwMDAwMDIwCisjZGVmaW5lIEdCX0FVRElPX0pBQ0tfT0NfSFBITAkJCTB4MDAwMDA0MAorI2RlZmluZSBHQl9BVURJT19KQUNLX09DX0hQSFIJCQkweDAwMDAwODAKKyNkZWZpbmUgR0JfQVVESU9fSkFDS19NSUNST1BIT05FMgkJMHgwMDAwMjAwCisjZGVmaW5lIEdCX0FVRElPX0pBQ0tfQU5DX0hFQURQSE9ORQkJKEdCX0FVRElPX0pBQ0tfSEVBRFBIT05FIHwgXAorCQkJCQkJIEdCX0FVRElPX0pBQ0tfTUlDUk9QSE9ORSB8IFwKKwkJCQkJCSBHQl9BVURJT19KQUNLX01JQ1JPUEhPTkUyKQorLyogS2VwdCBzZXBhcmF0ZSBmcm9tIHN3aXRjaGVzIHRvIGZhY2lsaXRhdGUgaW1wbGVtZW50YXRpb24gKi8KKyNkZWZpbmUgR0JfQVVESU9fSkFDS19CVE5fMAkJCTB4NDAwMDAwMAorI2RlZmluZSBHQl9BVURJT19KQUNLX0JUTl8xCQkJMHgyMDAwMDAwCisjZGVmaW5lIEdCX0FVRElPX0pBQ0tfQlROXzIJCQkweDEwMDAwMDAKKyNkZWZpbmUgR0JfQVVESU9fSkFDS19CVE5fMwkJCTB4MDgwMDAwMAorCitzdHJ1Y3QgZ2JfYXVkaW9fcGNtIHsKKwlfX3U4CXN0cmVhbV9uYW1lW0dCX0FVRElPX1BDTV9OQU1FX01BWF07CisJX19sZTMyCWZvcm1hdHM7CS8qIEdCX0FVRElPX1BDTV9GTVRfKiAqLworCV9fbGUzMglyYXRlczsJCS8qIEdCX0FVRElPX1BDTV9SQVRFXyogKi8KKwlfX3U4CWNoYW5fbWluOworCV9fdTgJY2hhbl9tYXg7CisJX191OAlzaWdfYml0czsJLyogbnVtYmVyIG9mIGJpdHMgb2YgY29udGVudCAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX2RhaSB7CisJX191OAkJCW5hbWVbQVVESU9fREFJX05BTUVfTUFYXTsKKwlfX2xlMTYJCQlkYXRhX2Nwb3J0OworCXN0cnVjdCBnYl9hdWRpb19wY20JY2FwdHVyZTsKKwlzdHJ1Y3QgZ2JfYXVkaW9fcGNtCXBsYXliYWNrOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX2ludGVnZXIgeworCV9fbGUzMgltaW47CisJX19sZTMyCW1heDsKKwlfX2xlMzIJc3RlcDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19pbnRlZ2VyNjQgeworCV9fbGU2NAltaW47CisJX19sZTY0CW1heDsKKwlfX2xlNjQJc3RlcDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19lbnVtZXJhdGVkIHsKKwlfX2xlMzIJaXRlbXM7CisJX19sZTE2CW5hbWVzX2xlbmd0aDsKKwlfX3U4CW5hbWVzWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX2luZm8geyAvKiBTZWUgc25kX2N0bF9lbGVtX2luZm8gaW4gTGludXggc291cmNlICovCisJX191OAkJdHlwZTsJCS8qIEdCX0FVRElPX0NUTF9FTEVNX1RZUEVfKiAqLworCV9fbGUxNgkJZGltZW5bNF07CisJdW5pb24geworCQlzdHJ1Y3QgZ2JfYXVkaW9faW50ZWdlcgkJaW50ZWdlcjsKKwkJc3RydWN0IGdiX2F1ZGlvX2ludGVnZXI2NAlpbnRlZ2VyNjQ7CisJCXN0cnVjdCBnYl9hdWRpb19lbnVtZXJhdGVkCWVudW1lcmF0ZWQ7CisJfSB2YWx1ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV92YWx1ZSB7IC8qIFNlZSBzbmRfY3RsX2VsZW1fdmFsdWUgaW4gTGludXggc291cmNlICovCisJX19sZTY0CQkJCXRpbWVzdGFtcDsgLyogWFhYIG5lZWRlZD8gKi8KKwl1bmlvbiB7CisJCV9fbGUzMglpbnRlZ2VyX3ZhbHVlWzJdOwkvKiBjb25zaWRlciBDVExfRE9VQkxFX3h4eCAqLworCQlfX2xlNjQJaW50ZWdlcjY0X3ZhbHVlWzJdOworCQlfX2xlMzIJZW51bWVyYXRlZF9pdGVtWzJdOworCX0gdmFsdWU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfYXVkaW9fY29udHJvbCB7CisJX191OAluYW1lW0FVRElPX0NPTlRST0xfTkFNRV9NQVhdOworCV9fdTgJaWQ7CQkvKiAwLTYzICovCisJX191OAlpZmFjZTsJCS8qIEdCX0FVRElPX0lGQUNFXyogKi8KKwlfX2xlMTYJZGF0YV9jcG9ydDsKKwlfX2xlMzIJYWNjZXNzOwkJLyogR0JfQVVESU9fQUNDRVNTXyogKi8KKwlfX3U4ICAgIGNvdW50OwkJLyogY291bnQgb2Ygc2FtZSBlbGVtZW50cyAqLworCV9fdTgJY291bnRfdmFsdWVzOwkvKiBjb3VudCBvZiB2YWx1ZXMsIG1heD0yIGZvciBDVExfRE9VQkxFX3h4eCAqLworCXN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV9pbmZvCWluZm87Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfYXVkaW9fd2lkZ2V0IHsKKwlfX3U4CW5hbWVbQVVESU9fV0lER0VUX05BTUVfTUFYXTsKKwlfX3U4CXNuYW1lW0FVRElPX1dJREdFVF9OQU1FX01BWF07CisJX191OAlpZDsKKwlfX3U4CXR5cGU7CQkvKiBHQl9BVURJT19XSURHRVRfVFlQRV8qICovCisJX191OAlzdGF0ZTsJCS8qIEdCX0FVRElPX1dJREdFVF9TVEFURV8qICovCisJX191OAluY29udHJvbHM7CisJc3RydWN0IGdiX2F1ZGlvX2NvbnRyb2wJY3RsWzBdOwkvKiAnbmNvbnRyb2xzJyBlbnRyaWVzICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfYXVkaW9fcm91dGUgeworCV9fdTgJc291cmNlX2lkOwkvKiB3aWRnZXQgaWQgKi8KKwlfX3U4CWRlc3RpbmF0aW9uX2lkOwkvKiB3aWRnZXQgaWQgKi8KKwlfX3U4CWNvbnRyb2xfaWQ7CS8qIDAtNjMgKi8KKwlfX3U4CWluZGV4OwkJLyogU2VsZWN0aW9uIHdpdGhpbiB0aGUgY29udHJvbCAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX3RvcG9sb2d5IHsKKwlfX3U4CW51bV9kYWlzOworCV9fdTgJbnVtX2NvbnRyb2xzOworCV9fdTgJbnVtX3dpZGdldHM7CisJX191OAludW1fcm91dGVzOworCV9fbGUzMglzaXplX2RhaXM7CisJX19sZTMyCXNpemVfY29udHJvbHM7CisJX19sZTMyCXNpemVfd2lkZ2V0czsKKwlfX2xlMzIJc2l6ZV9yb3V0ZXM7CisJX19sZTMyCWphY2tfdHlwZTsKKwkvKgorCSAqIHN0cnVjdCBnYl9hdWRpb19kYWkJCWRhaVtudW1fZGFpc107CisJICogc3RydWN0IGdiX2F1ZGlvX2NvbnRyb2wJY29udHJvbHNbbnVtX2NvbnRyb2xzXTsKKwkgKiBzdHJ1Y3QgZ2JfYXVkaW9fd2lkZ2V0CXdpZGdldHNbbnVtX3dpZGdldHNdOworCSAqIHN0cnVjdCBnYl9hdWRpb19yb3V0ZQlyb3V0ZXNbbnVtX3JvdXRlc107CisJICovCisJX191OAlkYXRhWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX2dldF90b3BvbG9neV9zaXplX3Jlc3BvbnNlIHsKKwlfX2xlMTYJc2l6ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19nZXRfdG9wb2xvZ3lfcmVzcG9uc2UgeworCXN0cnVjdCBnYl9hdWRpb190b3BvbG9neQl0b3BvbG9neTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19nZXRfY29udHJvbF9yZXF1ZXN0IHsKKwlfX3U4CWNvbnRyb2xfaWQ7CisJX191OAlpbmRleDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19nZXRfY29udHJvbF9yZXNwb25zZSB7CisJc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX3ZhbHVlCXZhbHVlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX3NldF9jb250cm9sX3JlcXVlc3QgeworCV9fdTgJY29udHJvbF9pZDsKKwlfX3U4CWluZGV4OworCXN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV92YWx1ZQl2YWx1ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19lbmFibGVfd2lkZ2V0X3JlcXVlc3QgeworCV9fdTgJd2lkZ2V0X2lkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX2Rpc2FibGVfd2lkZ2V0X3JlcXVlc3QgeworCV9fdTgJd2lkZ2V0X2lkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX2dldF9wY21fcmVxdWVzdCB7CisJX19sZTE2CWRhdGFfY3BvcnQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfYXVkaW9fZ2V0X3BjbV9yZXNwb25zZSB7CisJX19sZTMyCWZvcm1hdDsKKwlfX2xlMzIJcmF0ZTsKKwlfX3U4CWNoYW5uZWxzOworCV9fdTgJc2lnX2JpdHM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfYXVkaW9fc2V0X3BjbV9yZXF1ZXN0IHsKKwlfX2xlMTYJZGF0YV9jcG9ydDsKKwlfX2xlMzIJZm9ybWF0OworCV9fbGUzMglyYXRlOworCV9fdTgJY2hhbm5lbHM7CisJX191OAlzaWdfYml0czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19zZXRfdHhfZGF0YV9zaXplX3JlcXVlc3QgeworCV9fbGUxNglkYXRhX2Nwb3J0OworCV9fbGUxNglzaXplOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX2FjdGl2YXRlX3R4X3JlcXVlc3QgeworCV9fbGUxNglkYXRhX2Nwb3J0OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX2RlYWN0aXZhdGVfdHhfcmVxdWVzdCB7CisJX19sZTE2CWRhdGFfY3BvcnQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfYXVkaW9fc2V0X3J4X2RhdGFfc2l6ZV9yZXF1ZXN0IHsKKwlfX2xlMTYJZGF0YV9jcG9ydDsKKwlfX2xlMTYJc2l6ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19hY3RpdmF0ZV9yeF9yZXF1ZXN0IHsKKwlfX2xlMTYJZGF0YV9jcG9ydDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19kZWFjdGl2YXRlX3J4X3JlcXVlc3QgeworCV9fbGUxNglkYXRhX2Nwb3J0OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX2phY2tfZXZlbnRfcmVxdWVzdCB7CisJX191OAl3aWRnZXRfaWQ7CisJX191OAlqYWNrX2F0dHJpYnV0ZTsKKwlfX3U4CWV2ZW50OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX2J1dHRvbl9ldmVudF9yZXF1ZXN0IHsKKwlfX3U4CXdpZGdldF9pZDsKKwlfX3U4CWJ1dHRvbl9pZDsKKwlfX3U4CWV2ZW50OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX3N0cmVhbWluZ19ldmVudF9yZXF1ZXN0IHsKKwlfX2xlMTYJZGF0YV9jcG9ydDsKKwlfX3U4CWV2ZW50OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX3NlbmRfZGF0YV9yZXF1ZXN0IHsKKwlfX2xlNjQJdGltZXN0YW1wOworCV9fdTgJZGF0YVswXTsKK30gX19wYWNrZWQ7CisKKworLyogTG9nICovCisKKy8qIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgR0JfTE9HX1RZUEVfU0VORF9MT0cJMHgwMgorCisvKiBsZW5ndGggKi8KKyNkZWZpbmUgR0JfTE9HX01BWF9MRU4JCTEwMjQKKworc3RydWN0IGdiX2xvZ19zZW5kX2xvZ19yZXF1ZXN0IHsKKwlfX2xlMTYJbGVuOworCV9fdTggICAgbXNnWzBdOworfSBfX3BhY2tlZDsKKworI2VuZGlmIC8qIF9fR1JFWUJVU19QUk9UT0NPTFNfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncmV5YnVzX3RyYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncmV5YnVzX3RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4NjkyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dyZXlidXNfdHJhY2UuaApAQCAtMCwwICsxLDUzMSBAQAorLyoKKyAqIEdyZXlidXMgZHJpdmVyIGFuZCBkZXZpY2UgQVBJCisgKgorICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKyN1bmRlZiBUUkFDRV9TWVNURU0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIGdyZXlidXMKKworI2lmICFkZWZpbmVkKF9UUkFDRV9HUkVZQlVTX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9UUkFDRV9HUkVZQlVTX0gKKworI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworc3RydWN0IGdiX21lc3NhZ2U7CitzdHJ1Y3QgZ2Jfb3BlcmF0aW9uOworc3RydWN0IGdiX2Nvbm5lY3Rpb247CitzdHJ1Y3QgZ2JfYnVuZGxlOworc3RydWN0IGdiX2hvc3RfZGV2aWNlOworCitERUNMQVJFX0VWRU5UX0NMQVNTKGdiX21lc3NhZ2UsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgZ2JfbWVzc2FnZSAqbWVzc2FnZSksCisKKwlUUF9BUkdTKG1lc3NhZ2UpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCh1MTYsIHNpemUpCisJCV9fZmllbGQodTE2LCBvcGVyYXRpb25faWQpCisJCV9fZmllbGQodTgsIHR5cGUpCisJCV9fZmllbGQodTgsIHJlc3VsdCkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnNpemUgPSBsZTE2X3RvX2NwdShtZXNzYWdlLT5oZWFkZXItPnNpemUpOworCQlfX2VudHJ5LT5vcGVyYXRpb25faWQgPQorCQkJbGUxNl90b19jcHUobWVzc2FnZS0+aGVhZGVyLT5vcGVyYXRpb25faWQpOworCQlfX2VudHJ5LT50eXBlID0gbWVzc2FnZS0+aGVhZGVyLT50eXBlOworCQlfX2VudHJ5LT5yZXN1bHQgPSBtZXNzYWdlLT5oZWFkZXItPnJlc3VsdDsKKwkpLAorCisJVFBfcHJpbnRrKCJzaXplPSVodSBvcGVyYXRpb25faWQ9MHglMDR4IHR5cGU9MHglMDJ4IHJlc3VsdD0weCUwMngiLAorCQkgIF9fZW50cnktPnNpemUsIF9fZW50cnktPm9wZXJhdGlvbl9pZCwKKwkJICBfX2VudHJ5LT50eXBlLCBfX2VudHJ5LT5yZXN1bHQpCispOworCisjZGVmaW5lIERFRklORV9NRVNTQUdFX0VWRU5UKG5hbWUpCQkJCQlcCisJCURFRklORV9FVkVOVChnYl9tZXNzYWdlLCBuYW1lLAkJCQlcCisJCQkJVFBfUFJPVE8oc3RydWN0IGdiX21lc3NhZ2UgKm1lc3NhZ2UpLAlcCisJCQkJVFBfQVJHUyhtZXNzYWdlKSkKKworLyoKKyAqIE9jY3VycyBpbW1lZGlhdGVseSBiZWZvcmUgY2FsbGluZyBhIGhvc3QgZGV2aWNlJ3MgbWVzc2FnZV9zZW5kKCkKKyAqIG1ldGhvZC4KKyAqLworREVGSU5FX01FU1NBR0VfRVZFTlQoZ2JfbWVzc2FnZV9zZW5kKTsKKworLyoKKyAqIE9jY3VycyBhZnRlciBhbiBpbmNvbWluZyByZXF1ZXN0IG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQKKyAqLworREVGSU5FX01FU1NBR0VfRVZFTlQoZ2JfbWVzc2FnZV9yZWN2X3JlcXVlc3QpOworCisvKgorICogT2NjdXJzIGFmdGVyIGFuIGluY29taW5nIHJlc3BvbnNlIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQsCisgKiBhZnRlciBpdHMgbWF0Y2hpbmcgcmVxdWVzdCBoYXMgYmVlbiBmb3VuZC4KKyAqLworREVGSU5FX01FU1NBR0VfRVZFTlQoZ2JfbWVzc2FnZV9yZWN2X3Jlc3BvbnNlKTsKKworLyoKKyAqIE9jY3VycyBhZnRlciBhbiBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsZWQsIHBvc3NpYmx5IGJlZm9yZSB0aGUKKyAqIGNhbmNlbGxhdGlvbiBpcyBjb21wbGV0ZS4KKyAqLworREVGSU5FX01FU1NBR0VfRVZFTlQoZ2JfbWVzc2FnZV9jYW5jZWxfb3V0Z29pbmcpOworCisvKgorICogT2NjdXJzIHdoZW4gYW4gaW5jb21pbmcgcmVxdWVzdCBpcyBjYW5jZWxsZWQ7IGlmIHRoZSByZXNwb25zZSBoYXMKKyAqIGJlZW4gcXVldWVkIGZvciBzZW5kaW5nLCB0aGlzIG9jY3VycyBhZnRlciBpdCBpcyBzZW50LgorICovCitERUZJTkVfTUVTU0FHRV9FVkVOVChnYl9tZXNzYWdlX2NhbmNlbF9pbmNvbWluZyk7CisKKy8qCisgKiBPY2N1cnMgaW4gdGhlIGhvc3QgZHJpdmVyIG1lc3NhZ2Vfc2VuZCgpIGZ1bmN0aW9uIGp1c3QgcHJpb3IgdG8KKyAqIGhhbmRpbmcgb2ZmIHRoZSBkYXRhIHRvIGJlIHByb2Nlc3NlZCBieSBoYXJkd2FyZS4KKyAqLworREVGSU5FX01FU1NBR0VfRVZFTlQoZ2JfbWVzc2FnZV9zdWJtaXQpOworCisjdW5kZWYgREVGSU5FX01FU1NBR0VfRVZFTlQKKworREVDTEFSRV9FVkVOVF9DTEFTUyhnYl9vcGVyYXRpb24sCisKKwlUUF9QUk9UTyhzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24pLAorCisJVFBfQVJHUyhvcGVyYXRpb24pLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCh1MTYsIGNwb3J0X2lkKQkvKiBDUG9ydCBvZiBIRCBzaWRlIG9mIGNvbm5lY3Rpb24gKi8KKwkJX19maWVsZCh1MTYsIGlkKQkvKiBPcGVyYXRpb24gSUQgKi8KKwkJX19maWVsZCh1OCwgdHlwZSkKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBmbGFncykKKwkJX19maWVsZChpbnQsIGFjdGl2ZSkKKwkJX19maWVsZChpbnQsIHdhaXRlcnMpCisJCV9fZmllbGQoaW50LCBlcnJubykKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmNwb3J0X2lkID0gb3BlcmF0aW9uLT5jb25uZWN0aW9uLT5oZF9jcG9ydF9pZDsKKwkJX19lbnRyeS0+aWQgPSBvcGVyYXRpb24tPmlkOworCQlfX2VudHJ5LT50eXBlID0gb3BlcmF0aW9uLT50eXBlOworCQlfX2VudHJ5LT5mbGFncyA9IG9wZXJhdGlvbi0+ZmxhZ3M7CisJCV9fZW50cnktPmFjdGl2ZSA9IG9wZXJhdGlvbi0+YWN0aXZlOworCQlfX2VudHJ5LT53YWl0ZXJzID0gYXRvbWljX3JlYWQoJm9wZXJhdGlvbi0+d2FpdGVycyk7CisJCV9fZW50cnktPmVycm5vID0gb3BlcmF0aW9uLT5lcnJubzsKKwkpLAorCisJVFBfcHJpbnRrKCJpZD0lMDR4IHR5cGU9MHglMDJ4IGNwb3J0X2lkPSUwNHggZmxhZ3M9MHglbHggYWN0aXZlPSVkIHdhaXRlcnM9JWQgZXJybm89JWQiLAorCQkgIF9fZW50cnktPmlkLCBfX2VudHJ5LT5jcG9ydF9pZCwgX19lbnRyeS0+dHlwZSwgX19lbnRyeS0+ZmxhZ3MsCisJCSAgX19lbnRyeS0+YWN0aXZlLCBfX2VudHJ5LT53YWl0ZXJzLCBfX2VudHJ5LT5lcnJubykKKyk7CisKKyNkZWZpbmUgREVGSU5FX09QRVJBVElPTl9FVkVOVChuYW1lKQkJCQkJXAorCQlERUZJTkVfRVZFTlQoZ2Jfb3BlcmF0aW9uLCBuYW1lLAkJCVwKKwkJCQlUUF9QUk9UTyhzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24pLCBcCisJCQkJVFBfQVJHUyhvcGVyYXRpb24pKQorCisvKgorICogT2NjdXJzIGFmdGVyIGEgbmV3IG9wZXJhdGlvbiBpcyBjcmVhdGVkIGZvciBhbiBvdXRnb2luZyByZXF1ZXN0CisgKiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY3JlYXRlZC4KKyAqLworREVGSU5FX09QRVJBVElPTl9FVkVOVChnYl9vcGVyYXRpb25fY3JlYXRlKTsKKworLyoKKyAqIE9jY3VycyBhZnRlciBhIG5ldyBjb3JlIG9wZXJhdGlvbiBoYXMgYmVlbiBjcmVhdGVkLgorICovCitERUZJTkVfT1BFUkFUSU9OX0VWRU5UKGdiX29wZXJhdGlvbl9jcmVhdGVfY29yZSk7CisKKy8qCisgKiBPY2N1cnMgYWZ0ZXIgYSBuZXcgb3BlcmF0aW9uIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGFuIGluY29taW5nCisgKiByZXF1ZXN0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZC4KKyAqLworREVGSU5FX09QRVJBVElPTl9FVkVOVChnYl9vcGVyYXRpb25fY3JlYXRlX2luY29taW5nKTsKKworLyoKKyAqIE9jY3VycyB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhbiBvcGVyYXRpb24gaGFzIGJlZW4gZHJvcHBlZCwKKyAqIHByaW9yIHRvIGZyZWVpbmcgcmVzb3VyY2VzLgorICovCitERUZJTkVfT1BFUkFUSU9OX0VWRU5UKGdiX29wZXJhdGlvbl9kZXN0cm95KTsKKworLyoKKyAqIE9jY3VycyB3aGVuIGFuIG9wZXJhdGlvbiBoYXMgYmVlbiBtYXJrZWQgYWN0aXZlLCBhZnRlciB1cGRhdGluZworICogaXRzIGFjdGl2ZSBjb3VudC4KKyAqLworREVGSU5FX09QRVJBVElPTl9FVkVOVChnYl9vcGVyYXRpb25fZ2V0X2FjdGl2ZSk7CisKKy8qCisgKiBPY2N1cnMgd2hlbiBhbiBvcGVyYXRpb24gaGFzIGJlZW4gbWFya2VkIGFjdGl2ZSwgYmVmb3JlIHVwZGF0aW5nCisgKiBpdHMgYWN0aXZlIGNvdW50LgorICovCitERUZJTkVfT1BFUkFUSU9OX0VWRU5UKGdiX29wZXJhdGlvbl9wdXRfYWN0aXZlKTsKKworI3VuZGVmIERFRklORV9PUEVSQVRJT05fRVZFTlQKKworREVDTEFSRV9FVkVOVF9DTEFTUyhnYl9jb25uZWN0aW9uLAorCisJVFBfUFJPVE8oc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pLAorCisJVFBfQVJHUyhjb25uZWN0aW9uKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoaW50LCBoZF9idXNfaWQpCisJCV9fZmllbGQodTgsIGJ1bmRsZV9pZCkKKwkJLyogbmFtZSBjb250YWlucyAiaGRfY3BvcnRfaWQvaW50Zl9pZDpjcG9ydF9pZCIgKi8KKwkJX19keW5hbWljX2FycmF5KGNoYXIsIG5hbWUsIHNpemVvZihjb25uZWN0aW9uLT5uYW1lKSkKKwkJX19maWVsZChlbnVtIGdiX2Nvbm5lY3Rpb25fc3RhdGUsIHN0YXRlKQorCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIGZsYWdzKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aGRfYnVzX2lkID0gY29ubmVjdGlvbi0+aGQtPmJ1c19pZDsKKwkJX19lbnRyeS0+YnVuZGxlX2lkID0gY29ubmVjdGlvbi0+YnVuZGxlID8KKwkJCQljb25uZWN0aW9uLT5idW5kbGUtPmlkIDogQlVORExFX0lEX05PTkU7CisJCW1lbWNweShfX2dldF9zdHIobmFtZSksIGNvbm5lY3Rpb24tPm5hbWUsCisJCQkJCXNpemVvZihjb25uZWN0aW9uLT5uYW1lKSk7CisJCV9fZW50cnktPnN0YXRlID0gY29ubmVjdGlvbi0+c3RhdGU7CisJCV9fZW50cnktPmZsYWdzID0gY29ubmVjdGlvbi0+ZmxhZ3M7CisJKSwKKworCVRQX3ByaW50aygiaGRfYnVzX2lkPSVkIGJ1bmRsZV9pZD0weCUwMnggbmFtZT1cIiVzXCIgc3RhdGU9JXUgZmxhZ3M9MHglbHgiLAorCQkgIF9fZW50cnktPmhkX2J1c19pZCwgX19lbnRyeS0+YnVuZGxlX2lkLCBfX2dldF9zdHIobmFtZSksCisJCSAgKHVuc2lnbmVkIGludClfX2VudHJ5LT5zdGF0ZSwgX19lbnRyeS0+ZmxhZ3MpCispOworCisjZGVmaW5lIERFRklORV9DT05ORUNUSU9OX0VWRU5UKG5hbWUpCQkJCQlcCisJCURFRklORV9FVkVOVChnYl9jb25uZWN0aW9uLCBuYW1lLAkJCVwKKwkJCQlUUF9QUk9UTyhzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiksIFwKKwkJCQlUUF9BUkdTKGNvbm5lY3Rpb24pKQorCisvKgorICogT2NjdXJzIGFmdGVyIGEgbmV3IGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuCisgKi8KK0RFRklORV9DT05ORUNUSU9OX0VWRU5UKGdiX2Nvbm5lY3Rpb25fY3JlYXRlKTsKKworLyoKKyAqIE9jY3VycyB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhIGNvbm5lY3Rpb24gaGFzIGJlZW4gZHJvcHBlZCwKKyAqIGJlZm9yZSBpdHMgcmVzb3VyY2VzIGFyZSBmcmVlZC4KKyAqLworREVGSU5FX0NPTk5FQ1RJT05fRVZFTlQoZ2JfY29ubmVjdGlvbl9yZWxlYXNlKTsKKworLyoKKyAqIE9jY3VycyB3aGVuIGEgbmV3IHJlZmVyZW5jZSB0byBjb25uZWN0aW9uIGlzIGFkZGVkLCBjdXJyZW50bHkKKyAqIG9ubHkgd2hlbiBhIG1lc3NhZ2Ugb3ZlciB0aGUgY29ubmVjdGlvbiBpcyByZWNlaXZlZC4KKyAqLworREVGSU5FX0NPTk5FQ1RJT05fRVZFTlQoZ2JfY29ubmVjdGlvbl9nZXQpOworCisvKgorICogT2NjdXJzIHdoZW4gYSBuZXcgcmVmZXJlbmNlIHRvIGNvbm5lY3Rpb24gaXMgZHJvcHBlZCwgYWZ0ZXIgYQorICogYSByZWNlaXZlZCBtZXNzYWdlIGlzIGhhbmRsZWQsIG9yIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMKKyAqIGRlc3Ryb3llZC4KKyAqLworREVGSU5FX0NPTk5FQ1RJT05fRVZFTlQoZ2JfY29ubmVjdGlvbl9wdXQpOworCisvKgorICogT2NjdXJzIHdoZW4gYSByZXF1ZXN0IHRvIGVuYWJsZSBhIGNvbm5lY3Rpb24gaXMgbWFkZSwgZWl0aGVyIGZvcgorICogdHJhbnNtaXQgb25seSwgb3IgZm9yIGJvdGggdHJhbnNtaXQgYW5kIHJlY2VpdmUuCisgKi8KK0RFRklORV9DT05ORUNUSU9OX0VWRU5UKGdiX2Nvbm5lY3Rpb25fZW5hYmxlKTsKKworLyoKKyAqIE9jY3VycyB3aGVuIGEgcmVxdWVzdCB0byBkaXNhYmxlIGEgY29ubmVjdGlvbiBpcyBtYWRlLCBlaXRoZXIgZm9yCisgKiByZWNlaXZlIG9ubHksIG9yIGZvciBib3RoIHRyYW5zbWl0IGFuZCByZWNlaXZlLiAgQWxzbyBvY2N1cnMgd2hlbgorICogYSByZXF1ZXN0IHRvIGZvcmNlZnVsbHkgZGlzYWJsZSBhIGNvbm5lY3Rpb24gaXMgbWFkZS4KKyAqLworREVGSU5FX0NPTk5FQ1RJT05fRVZFTlQoZ2JfY29ubmVjdGlvbl9kaXNhYmxlKTsKKworI3VuZGVmIERFRklORV9DT05ORUNUSU9OX0VWRU5UCisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MoZ2JfYnVuZGxlLAorCisJVFBfUFJPVE8oc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKSwKKworCVRQX0FSR1MoYnVuZGxlKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQodTgsIGludGZfaWQpCisJCV9fZmllbGQodTgsIGlkKQorCQlfX2ZpZWxkKHU4LCBjbGFzcykKKwkJX19maWVsZChzaXplX3QsIG51bV9jcG9ydHMpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5pbnRmX2lkID0gYnVuZGxlLT5pbnRmLT5pbnRlcmZhY2VfaWQ7CisJCV9fZW50cnktPmlkID0gYnVuZGxlLT5pZDsKKwkJX19lbnRyeS0+Y2xhc3MgPSBidW5kbGUtPmNsYXNzOworCQlfX2VudHJ5LT5udW1fY3BvcnRzID0gYnVuZGxlLT5udW1fY3BvcnRzOworCSksCisKKwlUUF9wcmludGsoImludGZfaWQ9MHglMDJ4IGlkPSUwMnggY2xhc3M9MHglMDJ4IG51bV9jcG9ydHM9JXp1IiwKKwkJICBfX2VudHJ5LT5pbnRmX2lkLCBfX2VudHJ5LT5pZCwgX19lbnRyeS0+Y2xhc3MsCisJCSAgX19lbnRyeS0+bnVtX2Nwb3J0cykKKyk7CisKKyNkZWZpbmUgREVGSU5FX0JVTkRMRV9FVkVOVChuYW1lKQkJCQkJXAorCQlERUZJTkVfRVZFTlQoZ2JfYnVuZGxlLCBuYW1lLAkJCVwKKwkJCQlUUF9QUk9UTyhzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpLCBcCisJCQkJVFBfQVJHUyhidW5kbGUpKQorCisvKgorICogT2NjdXJzIGFmdGVyIGEgbmV3IGJ1bmRsZSBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4KKyAqLworREVGSU5FX0JVTkRMRV9FVkVOVChnYl9idW5kbGVfY3JlYXRlKTsKKworLyoKKyAqIE9jY3VycyB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhIGJ1bmRsZSBoYXMgYmVlbiBkcm9wcGVkLAorICogYmVmb3JlIGl0cyByZXNvdXJjZXMgYXJlIGZyZWVkLgorICovCitERUZJTkVfQlVORExFX0VWRU5UKGdiX2J1bmRsZV9yZWxlYXNlKTsKKworLyoKKyAqIE9jY3VycyB3aGVuIGEgYnVuZGxlIGlzIGFkZGVkIHRvIGFuIGludGVyZmFjZSB3aGVuIHRoZSBpbnRlcmZhY2UKKyAqIGlzIGVuYWJsZWQuCisgKi8KK0RFRklORV9CVU5ETEVfRVZFTlQoZ2JfYnVuZGxlX2FkZCk7CisKKy8qCisgKiBPY2N1cnMgd2hlbiBhIHJlZ2lzdGVyZWQgYnVuZGxlIGdldHMgZGVzdHJveWVkLCBub3JtYWxseSBhdCB0aGUKKyAqIHRpbWUgYW4gaW50ZXJmYWNlIGlzIGRpc2FibGVkLgorICovCitERUZJTkVfQlVORExFX0VWRU5UKGdiX2J1bmRsZV9kZXN0cm95KTsKKworI3VuZGVmIERFRklORV9CVU5ETEVfRVZFTlQKKworREVDTEFSRV9FVkVOVF9DTEFTUyhnYl9pbnRlcmZhY2UsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKSwKKworCVRQX0FSR1MoaW50ZiksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKHU4LCBtb2R1bGVfaWQpCisJCV9fZmllbGQodTgsIGlkKQkJLyogSW50ZXJmYWNlIGlkICovCisJCV9fZmllbGQodTgsIGRldmljZV9pZCkKKwkJX19maWVsZChpbnQsIGRpc2Nvbm5lY3RlZCkJLyogYm9vbCAqLworCQlfX2ZpZWxkKGludCwgZWplY3RlZCkJCS8qIGJvb2wgKi8KKwkJX19maWVsZChpbnQsIGFjdGl2ZSkJCS8qIGJvb2wgKi8KKwkJX19maWVsZChpbnQsIGVuYWJsZWQpCQkvKiBib29sICovCisJCV9fZmllbGQoaW50LCBtb2RlX3N3aXRjaCkJLyogYm9vbCAqLworCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+bW9kdWxlX2lkID0gaW50Zi0+bW9kdWxlLT5tb2R1bGVfaWQ7CisJCV9fZW50cnktPmlkID0gaW50Zi0+aW50ZXJmYWNlX2lkOworCQlfX2VudHJ5LT5kZXZpY2VfaWQgPSBpbnRmLT5kZXZpY2VfaWQ7CisJCV9fZW50cnktPmRpc2Nvbm5lY3RlZCA9IGludGYtPmRpc2Nvbm5lY3RlZDsKKwkJX19lbnRyeS0+ZWplY3RlZCA9IGludGYtPmVqZWN0ZWQ7CisJCV9fZW50cnktPmFjdGl2ZSA9IGludGYtPmFjdGl2ZTsKKwkJX19lbnRyeS0+ZW5hYmxlZCA9IGludGYtPmVuYWJsZWQ7CisJCV9fZW50cnktPm1vZGVfc3dpdGNoID0gaW50Zi0+bW9kZV9zd2l0Y2g7CisJKSwKKworCVRQX3ByaW50aygiaW50Zl9pZD0laGh1IGRldmljZV9pZD0laGh1IG1vZHVsZV9pZD0laGh1IEQ9JWQgSj0lZCBBPSVkIEU9JWQgTT0lZCIsCisJCV9fZW50cnktPmlkLCBfX2VudHJ5LT5kZXZpY2VfaWQsIF9fZW50cnktPm1vZHVsZV9pZCwKKwkJX19lbnRyeS0+ZGlzY29ubmVjdGVkLCBfX2VudHJ5LT5lamVjdGVkLCBfX2VudHJ5LT5hY3RpdmUsCisJCV9fZW50cnktPmVuYWJsZWQsIF9fZW50cnktPm1vZGVfc3dpdGNoKQorKTsKKworI2RlZmluZSBERUZJTkVfSU5URVJGQUNFX0VWRU5UKG5hbWUpCQkJCQlcCisJCURFRklORV9FVkVOVChnYl9pbnRlcmZhY2UsIG5hbWUsCQkJXAorCQkJCVRQX1BST1RPKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpLAlcCisJCQkJVFBfQVJHUyhpbnRmKSkKKworLyoKKyAqIE9jY3VycyBhZnRlciBhIG5ldyBpbnRlcmZhY2UgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuCisgKi8KK0RFRklORV9JTlRFUkZBQ0VfRVZFTlQoZ2JfaW50ZXJmYWNlX2NyZWF0ZSk7CisKKy8qCisgKiBPY2N1cnMgYWZ0ZXIgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGFuIGludGVyZmFjZSBoYXMgYmVlbiBkcm9wcGVkLgorICovCitERUZJTkVfSU5URVJGQUNFX0VWRU5UKGdiX2ludGVyZmFjZV9yZWxlYXNlKTsKKworLyoKKyAqIE9jY3VycyBhZnRlciBhbiBpbnRlcmZhY2UgYmVlbiByZWdpc3RlcmQuCisgKi8KK0RFRklORV9JTlRFUkZBQ0VfRVZFTlQoZ2JfaW50ZXJmYWNlX2FkZCk7CisKKy8qCisgKiBPY2N1cnMgd2hlbiBhIHJlZ2lzdGVyZWQgaW50ZXJmYWNlIGdldHMgZGVyZWdpc3RlcmQuCisgKi8KK0RFRklORV9JTlRFUkZBQ0VfRVZFTlQoZ2JfaW50ZXJmYWNlX2RlbCk7CisKKy8qCisgKiBPY2N1cnMgd2hlbiBhIHJlZ2lzdGVyZWQgaW50ZXJmYWNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQorICogYWN0aXZhdGVkLgorICovCitERUZJTkVfSU5URVJGQUNFX0VWRU5UKGdiX2ludGVyZmFjZV9hY3RpdmF0ZSk7CisKKy8qCisgKiBPY2N1cnMgd2hlbiBhbiBhY3RpdmF0ZWQgaW50ZXJmYWNlIGlzIGJlaW5nIGRlYWN0aXZhdGVkLgorICovCitERUZJTkVfSU5URVJGQUNFX0VWRU5UKGdiX2ludGVyZmFjZV9kZWFjdGl2YXRlKTsKKworLyoKKyAqIE9jY3VycyB3aGVuIGFuIGludGVyZmFjZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZW5hYmxlZC4KKyAqLworREVGSU5FX0lOVEVSRkFDRV9FVkVOVChnYl9pbnRlcmZhY2VfZW5hYmxlKTsKKworLyoKKyAqIE9jY3VycyB3aGVuIGFuIGVuYWJsZWQgaW50ZXJmYWNlIGlzIGJlaW5nIGRpc2FibGVkLgorICovCitERUZJTkVfSU5URVJGQUNFX0VWRU5UKGdiX2ludGVyZmFjZV9kaXNhYmxlKTsKKworI3VuZGVmIERFRklORV9JTlRFUkZBQ0VfRVZFTlQKKworREVDTEFSRV9FVkVOVF9DTEFTUyhnYl9tb2R1bGUsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgZ2JfbW9kdWxlICptb2R1bGUpLAorCisJVFBfQVJHUyhtb2R1bGUpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZChpbnQsIGhkX2J1c19pZCkKKwkJX19maWVsZCh1OCwgbW9kdWxlX2lkKQorCQlfX2ZpZWxkKHNpemVfdCwgbnVtX2ludGVyZmFjZXMpCisJCV9fZmllbGQoaW50LCBkaXNjb25uZWN0ZWQpCS8qIGJvb2wgKi8KKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmhkX2J1c19pZCA9IG1vZHVsZS0+aGQtPmJ1c19pZDsKKwkJX19lbnRyeS0+bW9kdWxlX2lkID0gbW9kdWxlLT5tb2R1bGVfaWQ7CisJCV9fZW50cnktPm51bV9pbnRlcmZhY2VzID0gbW9kdWxlLT5udW1faW50ZXJmYWNlczsKKwkJX19lbnRyeS0+ZGlzY29ubmVjdGVkID0gbW9kdWxlLT5kaXNjb25uZWN0ZWQ7CisJKSwKKworCVRQX3ByaW50aygiaGRfYnVzX2lkPSVkIG1vZHVsZV9pZD0laGh1IG51bV9pbnRlcmZhY2VzPSV6dSBkaXNjb25uZWN0ZWQ9JWQiLAorCQlfX2VudHJ5LT5oZF9idXNfaWQsIF9fZW50cnktPm1vZHVsZV9pZCwKKwkJX19lbnRyeS0+bnVtX2ludGVyZmFjZXMsIF9fZW50cnktPmRpc2Nvbm5lY3RlZCkKKyk7CisKKyNkZWZpbmUgREVGSU5FX01PRFVMRV9FVkVOVChuYW1lKQkJCQkJXAorCQlERUZJTkVfRVZFTlQoZ2JfbW9kdWxlLCBuYW1lLAkJCQlcCisJCQkJVFBfUFJPVE8oc3RydWN0IGdiX21vZHVsZSAqbW9kdWxlKSwJXAorCQkJCVRQX0FSR1MobW9kdWxlKSkKKworLyoKKyAqIE9jY3VycyBhZnRlciBhIG5ldyBtb2R1bGUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIGJlZm9yZQorICogY3JlYXRpbmcgYW55IG9mIGl0cyBpbnRlcmZhY2VzLgorICovCitERUZJTkVfTU9EVUxFX0VWRU5UKGdiX21vZHVsZV9jcmVhdGUpOworCisvKgorICogT2NjdXJzIGFmdGVyIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhIG1vZHVsZSBoYXMgYmVlbiBkcm9wcGVkLgorICovCitERUZJTkVfTU9EVUxFX0VWRU5UKGdiX21vZHVsZV9yZWxlYXNlKTsKKworLyoKKyAqIE9jY3VycyBhZnRlciBhIG1vZHVsZSBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgYmVmb3JlIHJlZ2lzdGVyaW5nCisgKiBhbnkgb2YgaXRzIGludGVyZmFjZXMuCisgKi8KK0RFRklORV9NT0RVTEVfRVZFTlQoZ2JfbW9kdWxlX2FkZCk7CisKKy8qCisgKiBPY2N1cnMgd2hlbiBhIG1vZHVsZSBpcyBkZWxldGVkLCBiZWZvcmUgZGVyZWdpc3RlcmluZyBpdHMKKyAqIGludGVyZmFjZXMuCisgKi8KK0RFRklORV9NT0RVTEVfRVZFTlQoZ2JfbW9kdWxlX2RlbCk7CisKKyN1bmRlZiBERUZJTkVfTU9EVUxFX0VWRU5UCisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MoZ2JfaG9zdF9kZXZpY2UsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkKSwKKworCVRQX0FSR1MoaGQpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZChpbnQsIGJ1c19pZCkKKwkJX19maWVsZChzaXplX3QsIG51bV9jcG9ydHMpCisJCV9fZmllbGQoc2l6ZV90LCBidWZmZXJfc2l6ZV9tYXgpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5idXNfaWQgPSBoZC0+YnVzX2lkOworCQlfX2VudHJ5LT5udW1fY3BvcnRzID0gaGQtPm51bV9jcG9ydHM7CisJCV9fZW50cnktPmJ1ZmZlcl9zaXplX21heCA9IGhkLT5idWZmZXJfc2l6ZV9tYXg7CisJKSwKKworCVRQX3ByaW50aygiYnVzX2lkPSVkIG51bV9jcG9ydHM9JXp1IG10dT0lenUiLAorCQlfX2VudHJ5LT5idXNfaWQsIF9fZW50cnktPm51bV9jcG9ydHMsCisJCV9fZW50cnktPmJ1ZmZlcl9zaXplX21heCkKKyk7CisKKyNkZWZpbmUgREVGSU5FX0hEX0VWRU5UKG5hbWUpCQkJCQkJXAorCQlERUZJTkVfRVZFTlQoZ2JfaG9zdF9kZXZpY2UsIG5hbWUsCQkJXAorCQkJCVRQX1BST1RPKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQpLAlcCisJCQkJVFBfQVJHUyhoZCkpCisKKy8qCisgKiBPY2N1cnMgYWZ0ZXIgYSBuZXcgaG9zdCBkZXZpY2UgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIGJlZm9yZQorICogaXRzIFNWQyBoYXMgYmVlbiBzZXQgdXAuCisgKi8KK0RFRklORV9IRF9FVkVOVChnYl9oZF9jcmVhdGUpOworCisvKgorICogT2NjdXJzIGFmdGVyIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhIGhvc3QgZGV2aWNlIGhhcyBiZWVuCisgKiBkcm9wcGVkLgorICovCitERUZJTkVfSERfRVZFTlQoZ2JfaGRfcmVsZWFzZSk7CisKKy8qCisgKiBPY2N1cnMgYWZ0ZXIgYSBuZXcgaG9zdCBkZXZpY2UgaGFzIGJlZW4gYWRkZWQsIGFmdGVyIHRoZQorICogY29ubmVjdGlvbiB0byBpdHMgU1ZDIGhhcyBiZWVuIGVuYWJsZWQuCisgKi8KK0RFRklORV9IRF9FVkVOVChnYl9oZF9hZGQpOworCisvKgorICogT2NjdXJzIHdoZW4gYSBob3N0IGRldmljZSBpcyBiZWluZyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgQVAgVVNCCisgKiBob3N0IGNvbnRyb2xsZXIuCisgKi8KK0RFRklORV9IRF9FVkVOVChnYl9oZF9kZWwpOworCisvKgorICogT2NjdXJzIHdoZW4gYSBob3N0IGRldmljZSBoYXMgcGFzc2VkIHJlY2VpdmVkIGRhdGEgdG8gdGhlIEdyZXlidXMKKyAqIGNvcmUsIGFmdGVyIGl0IGhhcyBiZWVuIGRldGVybWluZWQgaXQgaXMgZGVzdGluZWQgZm9yIGEgdmFsaWQKKyAqIENQb3J0LgorICovCitERUZJTkVfSERfRVZFTlQoZ2JfaGRfaW4pOworCisjdW5kZWYgREVGSU5FX0hEX0VWRU5UCisKKy8qCisgKiBPY2N1cnMgb24gYSBUaW1lU3luYyBzeW5jaHJvbml6YXRpb24gZXZlbnQgb3IgYSBUaW1lU3luYyBwaW5nIGV2ZW50LgorICovCitUUkFDRV9FVkVOVChnYl90aW1lc3luY19pcnEsCisKKwlUUF9QUk9UTyh1OCBwaW5nLCB1OCBzdHJvYmUsIHU4IGNvdW50LCB1NjQgZnJhbWVfdGltZSksCisKKwlUUF9BUkdTKHBpbmcsIHN0cm9iZSwgY291bnQsIGZyYW1lX3RpbWUpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCh1OCwgcGluZykKKwkJX19maWVsZCh1OCwgc3Ryb2JlKQorCQlfX2ZpZWxkKHU4LCBjb3VudCkKKwkJX19maWVsZCh1NjQsIGZyYW1lX3RpbWUpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5waW5nID0gcGluZzsKKwkJX19lbnRyeS0+c3Ryb2JlID0gc3Ryb2JlOworCQlfX2VudHJ5LT5jb3VudCA9IGNvdW50OworCQlfX2VudHJ5LT5mcmFtZV90aW1lID0gZnJhbWVfdGltZTsKKwkpLAorCisJVFBfcHJpbnRrKCIlcyAlZC8lZCBmcmFtZS10aW1lICVsbHVcbiIsCisJCSAgX19lbnRyeS0+cGluZyA/ICJwaW5nIiA6ICJzdHJvYmUiLCBfX2VudHJ5LT5zdHJvYmUsCisJCSAgX19lbnRyeS0+Y291bnQsIF9fZW50cnktPmZyYW1lX3RpbWUpCispOworCisjZW5kaWYgLyogX1RSQUNFX0dSRVlCVVNfSCAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyN1bmRlZiBUUkFDRV9JTkNMVURFX1BBVEgKKyNkZWZpbmUgVFJBQ0VfSU5DTFVERV9QQVRIIC4KKworLyoKKyAqIFRSQUNFX0lOQ0xVREVfRklMRSBpcyBub3QgbmVlZGVkIGlmIHRoZSBmaWxlbmFtZSBhbmQgVFJBQ0VfU1lTVEVNIGFyZSBlcXVhbAorICovCisjdW5kZWYgVFJBQ0VfSU5DTFVERV9GSUxFCisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfRklMRSBncmV5YnVzX3RyYWNlCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2hkLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9oZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NWFlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9oZC5jCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogR3JleWJ1cyBIb3N0IERldmljZQorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImdyZXlidXNfdHJhY2UuaCIKKworRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTChnYl9oZF9jcmVhdGUpOworRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTChnYl9oZF9yZWxlYXNlKTsKK0VYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoZ2JfaGRfYWRkKTsKK0VYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoZ2JfaGRfZGVsKTsKK0VYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoZ2JfaGRfaW4pOworRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTChnYl9tZXNzYWdlX3N1Ym1pdCk7CisKK3N0YXRpYyBzdHJ1Y3QgaWRhIGdiX2hkX2J1c19pZF9tYXA7CisKK2ludCBnYl9oZF9vdXRwdXQoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdm9pZCAqcmVxLCB1MTYgc2l6ZSwgdTggY21kLAorCQkgYm9vbCBhc3luYykKK3sKKwlpZiAoIWhkIHx8ICFoZC0+ZHJpdmVyIHx8ICFoZC0+ZHJpdmVyLT5vdXRwdXQpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBoZC0+ZHJpdmVyLT5vdXRwdXQoaGQsIHJlcSwgc2l6ZSwgY21kLCBhc3luYyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9oZF9vdXRwdXQpOworCitzdGF0aWMgc3NpemVfdCBidXNfaWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gdG9fZ2JfaG9zdF9kZXZpY2UoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBoZC0+YnVzX2lkKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhidXNfaWQpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYnVzX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2J1c19pZC5hdHRyLAorCU5VTEwKK307CitBVFRSSUJVVEVfR1JPVVBTKGJ1cyk7CisKK2ludCBnYl9oZF9jcG9ydF9yZXNlcnZlKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCkKK3sKKwlzdHJ1Y3QgaWRhICppZF9tYXAgPSAmaGQtPmNwb3J0X2lkX21hcDsKKwlpbnQgcmV0OworCisJcmV0ID0gaWRhX3NpbXBsZV9nZXQoaWRfbWFwLCBjcG9ydF9pZCwgY3BvcnRfaWQgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZoZC0+ZGV2LCAiZmFpbGVkIHRvIHJlc2VydmUgY3BvcnQgJXVcbiIsIGNwb3J0X2lkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2hkX2Nwb3J0X3Jlc2VydmUpOworCit2b2lkIGdiX2hkX2Nwb3J0X3JlbGVhc2VfcmVzZXJ2ZWQoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGNwb3J0X2lkKQoreworCXN0cnVjdCBpZGEgKmlkX21hcCA9ICZoZC0+Y3BvcnRfaWRfbWFwOworCisJaWRhX3NpbXBsZV9yZW1vdmUoaWRfbWFwLCBjcG9ydF9pZCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9oZF9jcG9ydF9yZWxlYXNlX3Jlc2VydmVkKTsKKworLyogTG9ja2luZzogQ2FsbGVyIGd1YXJhbnRlZXMgc2VyaWFsaXNhdGlvbiAqLworaW50IGdiX2hkX2Nwb3J0X2FsbG9jYXRlKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIGludCBjcG9ydF9pZCwKKwkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBpZGEgKmlkX21hcCA9ICZoZC0+Y3BvcnRfaWRfbWFwOworCWludCBpZGFfc3RhcnQsIGlkYV9lbmQ7CisKKwlpZiAoaGQtPmRyaXZlci0+Y3BvcnRfYWxsb2NhdGUpCisJCXJldHVybiBoZC0+ZHJpdmVyLT5jcG9ydF9hbGxvY2F0ZShoZCwgY3BvcnRfaWQsIGZsYWdzKTsKKworCWlmIChjcG9ydF9pZCA8IDApIHsKKwkJaWRhX3N0YXJ0ID0gMDsKKwkJaWRhX2VuZCA9IGhkLT5udW1fY3BvcnRzOworCX0gZWxzZSBpZiAoY3BvcnRfaWQgPCBoZC0+bnVtX2Nwb3J0cykgeworCQlpZGFfc3RhcnQgPSBjcG9ydF9pZDsKKwkJaWRhX2VuZCA9IGNwb3J0X2lkICsgMTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZoZC0+ZGV2LCAiY3BvcnQgJWQgbm90IGF2YWlsYWJsZVxuIiwgY3BvcnRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gaWRhX3NpbXBsZV9nZXQoaWRfbWFwLCBpZGFfc3RhcnQsIGlkYV9lbmQsIEdGUF9LRVJORUwpOworfQorCisvKiBMb2NraW5nOiBDYWxsZXIgZ3VhcmFudGVlcyBzZXJpYWxpc2F0aW9uICovCit2b2lkIGdiX2hkX2Nwb3J0X3JlbGVhc2Uoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGNwb3J0X2lkKQoreworCWlmIChoZC0+ZHJpdmVyLT5jcG9ydF9yZWxlYXNlKSB7CisJCWhkLT5kcml2ZXItPmNwb3J0X3JlbGVhc2UoaGQsIGNwb3J0X2lkKTsKKwkJcmV0dXJuOworCX0KKworCWlkYV9zaW1wbGVfcmVtb3ZlKCZoZC0+Y3BvcnRfaWRfbWFwLCBjcG9ydF9pZCk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2hkX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSB0b19nYl9ob3N0X2RldmljZShkZXYpOworCisJdHJhY2VfZ2JfaGRfcmVsZWFzZShoZCk7CisKKwlpZiAoaGQtPnN2YykKKwkJZ2Jfc3ZjX3B1dChoZC0+c3ZjKTsKKwlpZGFfc2ltcGxlX3JlbW92ZSgmZ2JfaGRfYnVzX2lkX21hcCwgaGQtPmJ1c19pZCk7CisJaWRhX2Rlc3Ryb3koJmhkLT5jcG9ydF9pZF9tYXApOworCWtmcmVlKGhkKTsKK30KKworc3RydWN0IGRldmljZV90eXBlIGdyZXlidXNfaGRfdHlwZSA9IHsKKwkubmFtZQkJPSAiZ3JleWJ1c19ob3N0X2RldmljZSIsCisJLnJlbGVhc2UJPSBnYl9oZF9yZWxlYXNlLAorfTsKKworc3RydWN0IGdiX2hvc3RfZGV2aWNlICpnYl9oZF9jcmVhdGUoc3RydWN0IGdiX2hkX2RyaXZlciAqZHJpdmVyLAorCQkJCQlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCQkJCXNpemVfdCBidWZmZXJfc2l6ZV9tYXgsCisJCQkJCXNpemVfdCBudW1fY3BvcnRzKQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQ7CisJaW50IHJldDsKKworCS8qCisJICogVmFsaWRhdGUgdGhhdCB0aGUgZHJpdmVyIGltcGxlbWVudHMgYWxsIG9mIHRoZSBjYWxsYmFja3MKKwkgKiBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZXZlcnkgdGltZSB3ZSBtYWtlIHRoZW0uCisJICovCisJaWYgKCghZHJpdmVyLT5tZXNzYWdlX3NlbmQpIHx8ICghZHJpdmVyLT5tZXNzYWdlX2NhbmNlbCkpIHsKKwkJZGV2X2VycihwYXJlbnQsICJtYW5kYXRvcnkgaGQtY2FsbGJhY2tzIG1pc3NpbmdcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlpZiAoYnVmZmVyX3NpemVfbWF4IDwgR0JfT1BFUkFUSU9OX01FU1NBR0VfU0laRV9NSU4pIHsKKwkJZGV2X2VycihwYXJlbnQsICJncmV5YnVzIGhvc3QtZGV2aWNlIGJ1ZmZlcnMgdG9vIHNtYWxsXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJaWYgKG51bV9jcG9ydHMgPT0gMCB8fCBudW1fY3BvcnRzID4gQ1BPUlRfSURfTUFYICsgMSkgeworCQlkZXZfZXJyKHBhcmVudCwgIkludmFsaWQgbnVtYmVyIG9mIENQb3J0czogJXp1XG4iLCBudW1fY3BvcnRzKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJLyoKKwkgKiBNYWtlIHN1cmUgdG8gbmV2ZXIgYWxsb2NhdGUgbWVzc2FnZXMgbGFyZ2VyIHRoYW4gd2hhdCB0aGUgR3JleWJ1cworCSAqIHByb3RvY29sIHN1cHBvcnRzLgorCSAqLworCWlmIChidWZmZXJfc2l6ZV9tYXggPiBHQl9PUEVSQVRJT05fTUVTU0FHRV9TSVpFX01BWCkgeworCQlkZXZfd2FybihwYXJlbnQsICJsaW1pdGluZyBidWZmZXIgc2l6ZSB0byAldVxuIiwKKwkJCSBHQl9PUEVSQVRJT05fTUVTU0FHRV9TSVpFX01BWCk7CisJCWJ1ZmZlcl9zaXplX21heCA9IEdCX09QRVJBVElPTl9NRVNTQUdFX1NJWkVfTUFYOworCX0KKworCWhkID0ga3phbGxvYyhzaXplb2YoKmhkKSArIGRyaXZlci0+aGRfcHJpdl9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhkKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXJldCA9IGlkYV9zaW1wbGVfZ2V0KCZnYl9oZF9idXNfaWRfbWFwLCAxLCAwLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0IDwgMCkgeworCQlrZnJlZShoZCk7CisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQorCWhkLT5idXNfaWQgPSByZXQ7CisKKwloZC0+ZHJpdmVyID0gZHJpdmVyOworCUlOSVRfTElTVF9IRUFEKCZoZC0+bW9kdWxlcyk7CisJSU5JVF9MSVNUX0hFQUQoJmhkLT5jb25uZWN0aW9ucyk7CisJaWRhX2luaXQoJmhkLT5jcG9ydF9pZF9tYXApOworCWhkLT5idWZmZXJfc2l6ZV9tYXggPSBidWZmZXJfc2l6ZV9tYXg7CisJaGQtPm51bV9jcG9ydHMgPSBudW1fY3BvcnRzOworCisJaGQtPmRldi5wYXJlbnQgPSBwYXJlbnQ7CisJaGQtPmRldi5idXMgPSAmZ3JleWJ1c19idXNfdHlwZTsKKwloZC0+ZGV2LnR5cGUgPSAmZ3JleWJ1c19oZF90eXBlOworCWhkLT5kZXYuZ3JvdXBzID0gYnVzX2dyb3VwczsKKwloZC0+ZGV2LmRtYV9tYXNrID0gaGQtPmRldi5wYXJlbnQtPmRtYV9tYXNrOworCWRldmljZV9pbml0aWFsaXplKCZoZC0+ZGV2KTsKKwlkZXZfc2V0X25hbWUoJmhkLT5kZXYsICJncmV5YnVzJWQiLCBoZC0+YnVzX2lkKTsKKworCXRyYWNlX2diX2hkX2NyZWF0ZShoZCk7CisKKwloZC0+c3ZjID0gZ2Jfc3ZjX2NyZWF0ZShoZCk7CisJaWYgKCFoZC0+c3ZjKSB7CisJCWRldl9lcnIoJmhkLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN2Y1xuIik7CisJCXB1dF9kZXZpY2UoJmhkLT5kZXYpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlyZXR1cm4gaGQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9oZF9jcmVhdGUpOworCitpbnQgZ2JfaGRfYWRkKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQpCit7CisJaW50IHJldDsKKworCXJldCA9IGRldmljZV9hZGQoJmhkLT5kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9zdmNfYWRkKGhkLT5zdmMpOworCWlmIChyZXQpIHsKKwkJZGV2aWNlX2RlbCgmaGQtPmRldik7CisJCXJldHVybiByZXQ7CisJfQorCisJdHJhY2VfZ2JfaGRfYWRkKGhkKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfaGRfYWRkKTsKKwordm9pZCBnYl9oZF9kZWwoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCkKK3sKKwl0cmFjZV9nYl9oZF9kZWwoaGQpOworCisJLyoKKwkgKiBUZWFyIGRvd24gdGhlIHN2YyBhbmQgZmx1c2ggYW55IG9uLWdvaW5nIGhvdHBsdWcgcHJvY2Vzc2luZyBiZWZvcmUKKwkgKiByZW1vdmluZyB0aGUgcmVtYWluaW5nIGludGVyZmFjZXMuCisJICovCisJZ2Jfc3ZjX2RlbChoZC0+c3ZjKTsKKworCWRldmljZV9kZWwoJmhkLT5kZXYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfaGRfZGVsKTsKKwordm9pZCBnYl9oZF9zaHV0ZG93bihzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkKQoreworCWdiX3N2Y19kZWwoaGQtPnN2Yyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9oZF9zaHV0ZG93bik7CisKK3ZvaWQgZ2JfaGRfcHV0KHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQpCit7CisJcHV0X2RldmljZSgmaGQtPmRldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9oZF9wdXQpOworCitpbnQgX19pbml0IGdiX2hkX2luaXQodm9pZCkKK3sKKwlpZGFfaW5pdCgmZ2JfaGRfYnVzX2lkX21hcCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBnYl9oZF9leGl0KHZvaWQpCit7CisJaWRhX2Rlc3Ryb3koJmdiX2hkX2J1c19pZF9tYXApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvaGQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2hkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyNTBjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9oZC5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBHcmV5YnVzIEhvc3QgRGV2aWNlCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQtMjAxNSBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpZm5kZWYgX19IRF9ICisjZGVmaW5lIF9fSERfSAorCitzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2U7CitzdHJ1Y3QgZ2JfbWVzc2FnZTsKKworc3RydWN0IGdiX2hkX2RyaXZlciB7CisJc2l6ZV90CWhkX3ByaXZfc2l6ZTsKKworCWludCAoKmNwb3J0X2FsbG9jYXRlKShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCBpbnQgY3BvcnRfaWQsCisJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7CisJdm9pZCAoKmNwb3J0X3JlbGVhc2UpKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCk7CisJaW50ICgqY3BvcnRfZW5hYmxlKShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQsCisJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7CisJaW50ICgqY3BvcnRfZGlzYWJsZSkoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGNwb3J0X2lkKTsKKwlpbnQgKCpjcG9ydF9jb25uZWN0ZWQpKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCk7CisJaW50ICgqY3BvcnRfZmx1c2gpKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCk7CisJaW50ICgqY3BvcnRfc2h1dGRvd24pKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCwKKwkJCQl1OCBwaGFzZSwgdW5zaWduZWQgaW50IHRpbWVvdXQpOworCWludCAoKmNwb3J0X3F1aWVzY2UpKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCwKKwkJCQlzaXplX3QgcGVlcl9zcGFjZSwgdW5zaWduZWQgaW50IHRpbWVvdXQpOworCWludCAoKmNwb3J0X2NsZWFyKShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQpOworCisJaW50ICgqbWVzc2FnZV9zZW5kKShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgZGVzdF9jcG9ydF9pZCwKKwkJCXN0cnVjdCBnYl9tZXNzYWdlICptZXNzYWdlLCBnZnBfdCBnZnBfbWFzayk7CisJdm9pZCAoKm1lc3NhZ2VfY2FuY2VsKShzdHJ1Y3QgZ2JfbWVzc2FnZSAqbWVzc2FnZSk7CisJaW50ICgqbGF0ZW5jeV90YWdfZW5hYmxlKShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQpOworCWludCAoKmxhdGVuY3lfdGFnX2Rpc2FibGUpKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCk7CisJaW50ICgqb3V0cHV0KShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB2b2lkICpyZXEsIHUxNiBzaXplLCB1OCBjbWQsCisJCSAgICAgIGJvb2wgYXN5bmMpOworCWludCAoKnRpbWVzeW5jX2VuYWJsZSkoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTggY291bnQsCisJCQkgICAgICAgdTY0IGZyYW1lX3RpbWUsIHUzMiBzdHJvYmVfZGVsYXksIHUzMiByZWZjbGspOworCWludCAoKnRpbWVzeW5jX2Rpc2FibGUpKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQpOworCWludCAoKnRpbWVzeW5jX2F1dGhvcml0YXRpdmUpKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsCisJCQkJICAgICAgdTY0ICpmcmFtZV90aW1lKTsKKwlpbnQgKCp0aW1lc3luY19nZXRfbGFzdF9ldmVudCkoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwKKwkJCQkgICAgICAgdTY0ICpmcmFtZV90aW1lKTsKK307CisKK3N0cnVjdCBnYl9ob3N0X2RldmljZSB7CisJc3RydWN0IGRldmljZSBkZXY7CisJaW50IGJ1c19pZDsKKwljb25zdCBzdHJ1Y3QgZ2JfaGRfZHJpdmVyICpkcml2ZXI7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1vZHVsZXM7CisJc3RydWN0IGxpc3RfaGVhZCBjb25uZWN0aW9uczsKKwlzdHJ1Y3QgaWRhIGNwb3J0X2lkX21hcDsKKworCS8qIE51bWJlciBvZiBDUG9ydHMgc3VwcG9ydGVkIGJ5IHRoZSBVbmlQcm8gSVAgKi8KKwlzaXplX3QgbnVtX2Nwb3J0czsKKworCS8qIEhvc3QgZGV2aWNlIGJ1ZmZlciBjb25zdHJhaW50cyAqLworCXNpemVfdCBidWZmZXJfc2l6ZV9tYXg7CisKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmM7CisJLyogUHJpdmF0ZSBkYXRhIGZvciB0aGUgaG9zdCBkcml2ZXIgKi8KKwl1bnNpZ25lZCBsb25nIGhkX3ByaXZbMF0gX19hbGlnbmVkKHNpemVvZihzNjQpKTsKK307CisjZGVmaW5lIHRvX2diX2hvc3RfZGV2aWNlKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UsIGRldikKKworaW50IGdiX2hkX2Nwb3J0X3Jlc2VydmUoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGNwb3J0X2lkKTsKK3ZvaWQgZ2JfaGRfY3BvcnRfcmVsZWFzZV9yZXNlcnZlZChzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQpOworaW50IGdiX2hkX2Nwb3J0X2FsbG9jYXRlKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIGludCBjcG9ydF9pZCwKKwkJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7Cit2b2lkIGdiX2hkX2Nwb3J0X3JlbGVhc2Uoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGNwb3J0X2lkKTsKKworc3RydWN0IGdiX2hvc3RfZGV2aWNlICpnYl9oZF9jcmVhdGUoc3RydWN0IGdiX2hkX2RyaXZlciAqZHJpdmVyLAorCQkJCQlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCQkJCXNpemVfdCBidWZmZXJfc2l6ZV9tYXgsCisJCQkJCXNpemVfdCBudW1fY3BvcnRzKTsKK2ludCBnYl9oZF9hZGQoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCk7Cit2b2lkIGdiX2hkX2RlbChzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkKTsKK3ZvaWQgZ2JfaGRfc2h1dGRvd24oc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCk7Cit2b2lkIGdiX2hkX3B1dChzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkKTsKK2ludCBnYl9oZF9vdXRwdXQoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdm9pZCAqcmVxLCB1MTYgc2l6ZSwgdTggY21kLAorCQkgYm9vbCBpbl9pcnEpOworCitpbnQgZ2JfaGRfaW5pdCh2b2lkKTsKK3ZvaWQgZ2JfaGRfZXhpdCh2b2lkKTsKKworI2VuZGlmCS8qIF9fSERfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvaGlkLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9oaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzBkNzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvaGlkLmMKQEAgLTAsMCArMSw1MzYgQEAKKy8qCisgKiBISUQgY2xhc3MgZHJpdmVyIGZvciB0aGUgR3JleWJ1cy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJncmV5YnVzLmgiCisKKy8qIEdyZXlidXMgSElEIGRldmljZSdzIHN0cnVjdHVyZSAqLworc3RydWN0IGdiX2hpZCB7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlOworCXN0cnVjdCBnYl9jb25uZWN0aW9uCQkqY29ubmVjdGlvbjsKKworCXN0cnVjdCBoaWRfZGV2aWNlCQkqaGlkOworCXN0cnVjdCBnYl9oaWRfZGVzY19yZXNwb25zZQloZGVzYzsKKworCXVuc2lnbmVkIGxvbmcJCQlmbGFnczsKKyNkZWZpbmUgR0JfSElEX1NUQVJURUQJCQkweDAxCisjZGVmaW5lIEdCX0hJRF9SRUFEX1BFTkRJTkcJCTB4MDQKKworCXVuc2lnbmVkIGludAkJCWJ1ZnNpemU7CisJY2hhcgkJCQkqaW5idWY7Cit9OworCitzdGF0aWMgREVGSU5FX01VVEVYKGdiX2hpZF9vcGVuX211dGV4KTsKKworLyogUm91dGluZXMgdG8gZ2V0IGNvbnRyb2xsZXIncyBpbmZvcm1hdGlvbiBvdmVyIGdyZXlidXMgKi8KKworLyogT3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gZ3JleWJ1cyAqLworc3RhdGljIGludCBnYl9oaWRfZ2V0X2Rlc2Moc3RydWN0IGdiX2hpZCAqZ2hpZCkKK3sKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmMoZ2hpZC0+Y29ubmVjdGlvbiwgR0JfSElEX1RZUEVfR0VUX0RFU0MsIE5VTEwsCisJCQkJIDAsICZnaGlkLT5oZGVzYywgc2l6ZW9mKGdoaWQtPmhkZXNjKSk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfaGlkX2dldF9yZXBvcnRfZGVzYyhzdHJ1Y3QgZ2JfaGlkICpnaGlkLCBjaGFyICpyZGVzYykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhnaGlkLT5idW5kbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhnaGlkLT5jb25uZWN0aW9uLCBHQl9ISURfVFlQRV9HRVRfUkVQT1JUX0RFU0MsCisJCQkJIE5VTEwsIDAsIHJkZXNjLAorCQkJCSBsZTE2X3RvX2NwdShnaGlkLT5oZGVzYy53UmVwb3J0RGVzY0xlbmd0aCkpOworCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ2hpZC0+YnVuZGxlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfaGlkX3NldF9wb3dlcihzdHJ1Y3QgZ2JfaGlkICpnaGlkLCBpbnQgdHlwZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhnaGlkLT5idW5kbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhnaGlkLT5jb25uZWN0aW9uLCB0eXBlLCBOVUxMLCAwLCBOVUxMLCAwKTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdoaWQtPmJ1bmRsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2hpZF9nZXRfcmVwb3J0KHN0cnVjdCBnYl9oaWQgKmdoaWQsIHU4IHJlcG9ydF90eXBlLCB1OCByZXBvcnRfaWQsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgZ2JfaGlkX2dldF9yZXBvcnRfcmVxdWVzdCByZXF1ZXN0OworCWludCByZXQ7CisKKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGdoaWQtPmJ1bmRsZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJlcXVlc3QucmVwb3J0X3R5cGUgPSByZXBvcnRfdHlwZTsKKwlyZXF1ZXN0LnJlcG9ydF9pZCA9IHJlcG9ydF9pZDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGdoaWQtPmNvbm5lY3Rpb24sIEdCX0hJRF9UWVBFX0dFVF9SRVBPUlQsCisJCQkJICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIGJ1ZiwgbGVuKTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdoaWQtPmJ1bmRsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2hpZF9zZXRfcmVwb3J0KHN0cnVjdCBnYl9oaWQgKmdoaWQsIHU4IHJlcG9ydF90eXBlLCB1OCByZXBvcnRfaWQsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgZ2JfaGlkX3NldF9yZXBvcnRfcmVxdWVzdCAqcmVxdWVzdDsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJaW50IHJldCwgc2l6ZSA9IHNpemVvZigqcmVxdWVzdCkgKyBsZW4gLSAxOworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhnaGlkLT5idW5kbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlvcGVyYXRpb24gPSBnYl9vcGVyYXRpb25fY3JlYXRlKGdoaWQtPmNvbm5lY3Rpb24sCisJCQkJCUdCX0hJRF9UWVBFX1NFVF9SRVBPUlQsIHNpemUsIDAsCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghb3BlcmF0aW9uKSB7CisJCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdoaWQtPmJ1bmRsZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJlcXVlc3QgPSBvcGVyYXRpb24tPnJlcXVlc3QtPnBheWxvYWQ7CisJcmVxdWVzdC0+cmVwb3J0X3R5cGUgPSByZXBvcnRfdHlwZTsKKwlyZXF1ZXN0LT5yZXBvcnRfaWQgPSByZXBvcnRfaWQ7CisJbWVtY3B5KHJlcXVlc3QtPnJlcG9ydCwgYnVmLCBsZW4pOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZF9zeW5jKG9wZXJhdGlvbik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZvcGVyYXRpb24tPmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJImZhaWxlZCB0byBzZXQgcmVwb3J0OiAlZFxuIiwgcmV0KTsKKwl9IGVsc2UgeworCQlyZXQgPSBsZW47CisJfQorCisJZ2Jfb3BlcmF0aW9uX3B1dChvcGVyYXRpb24pOworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdoaWQtPmJ1bmRsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2hpZF9yZXF1ZXN0X2hhbmRsZXIoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfaGlkICpnaGlkID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2JfaGlkX2lucHV0X3JlcG9ydF9yZXF1ZXN0ICpyZXF1ZXN0ID0gb3AtPnJlcXVlc3QtPnBheWxvYWQ7CisKKwlpZiAob3AtPnR5cGUgIT0gR0JfSElEX1RZUEVfSVJRX0VWRU5UKSB7CisJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJInVuc3VwcG9ydGVkIHVuc29saWNpdGVkIHJlcXVlc3RcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodGVzdF9iaXQoR0JfSElEX1NUQVJURUQsICZnaGlkLT5mbGFncykpCisJCWhpZF9pbnB1dF9yZXBvcnQoZ2hpZC0+aGlkLCBISURfSU5QVVRfUkVQT1JULAorCQkJCSByZXF1ZXN0LT5yZXBvcnQsIG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfaGlkX3JlcG9ydF9sZW4oc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCkKK3sKKwlyZXR1cm4gKChyZXBvcnQtPnNpemUgLSAxKSA+PiAzKSArIDEgKworCQlyZXBvcnQtPmRldmljZS0+cmVwb3J0X2VudW1bcmVwb3J0LT50eXBlXS5udW1iZXJlZDsKK30KKworc3RhdGljIHZvaWQgZ2JfaGlkX2ZpbmRfbWF4X3JlcG9ydChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKm1heCkKK3sKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCXVuc2lnbmVkIGludCBzaXplOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXBvcnQsICZoaWQtPnJlcG9ydF9lbnVtW3R5cGVdLnJlcG9ydF9saXN0LCBsaXN0KSB7CisJCXNpemUgPSBnYl9oaWRfcmVwb3J0X2xlbihyZXBvcnQpOworCQlpZiAoKm1heCA8IHNpemUpCisJCQkqbWF4ID0gc2l6ZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdiX2hpZF9mcmVlX2J1ZmZlcnMoc3RydWN0IGdiX2hpZCAqZ2hpZCkKK3sKKwlrZnJlZShnaGlkLT5pbmJ1Zik7CisJZ2hpZC0+aW5idWYgPSBOVUxMOworCWdoaWQtPmJ1ZnNpemUgPSAwOworfQorCitzdGF0aWMgaW50IGdiX2hpZF9hbGxvY19idWZmZXJzKHN0cnVjdCBnYl9oaWQgKmdoaWQsIHNpemVfdCBidWZzaXplKQoreworCWdoaWQtPmluYnVmID0ga3phbGxvYyhidWZzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdoaWQtPmluYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWdoaWQtPmJ1ZnNpemUgPSBidWZzaXplOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJvdXRpbmVzIGRlYWxpbmcgd2l0aCByZXBvcnRzICovCitzdGF0aWMgdm9pZCBnYl9oaWRfaW5pdF9yZXBvcnQoc3RydWN0IGdiX2hpZCAqZ2hpZCwgc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCkKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCXNpemUgPSBnYl9oaWRfcmVwb3J0X2xlbihyZXBvcnQpOworCWlmIChnYl9oaWRfZ2V0X3JlcG9ydChnaGlkLCByZXBvcnQtPnR5cGUsIHJlcG9ydC0+aWQsIGdoaWQtPmluYnVmLAorCQkJICAgICAgc2l6ZSkpCisJCXJldHVybjsKKworCS8qCisJICogaGlkLT5kcml2ZXJfbG9jayBpcyBoZWxkIGFzIHdlIGFyZSBpbiBwcm9iZSBmdW5jdGlvbiwKKwkgKiB3ZSBqdXN0IG5lZWQgdG8gc2V0dXAgdGhlIGlucHV0IGZpZWxkcywgc28gdXNpbmcKKwkgKiBoaWRfcmVwb3J0X3Jhd19ldmVudCBpcyBzYWZlLgorCSAqLworCWhpZF9yZXBvcnRfcmF3X2V2ZW50KGdoaWQtPmhpZCwgcmVwb3J0LT50eXBlLCBnaGlkLT5pbmJ1Ziwgc2l6ZSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2hpZF9pbml0X3JlcG9ydHMoc3RydWN0IGdiX2hpZCAqZ2hpZCkKK3sKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gZ2hpZC0+aGlkOworCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcG9ydCwKKwkJJmhpZC0+cmVwb3J0X2VudW1bSElEX0lOUFVUX1JFUE9SVF0ucmVwb3J0X2xpc3QsIGxpc3QpCisJCWdiX2hpZF9pbml0X3JlcG9ydChnaGlkLCByZXBvcnQpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXBvcnQsCisJCSZoaWQtPnJlcG9ydF9lbnVtW0hJRF9GRUFUVVJFX1JFUE9SVF0ucmVwb3J0X2xpc3QsIGxpc3QpCisJCWdiX2hpZF9pbml0X3JlcG9ydChnaGlkLCByZXBvcnQpOworfQorCitzdGF0aWMgaW50IF9fZ2JfaGlkX2dldF9yYXdfcmVwb3J0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsCisJCXVuc2lnbmVkIGNoYXIgcmVwb3J0X251bWJlciwgX191OCAqYnVmLCBzaXplX3QgY291bnQsCisJCXVuc2lnbmVkIGNoYXIgcmVwb3J0X3R5cGUpCit7CisJc3RydWN0IGdiX2hpZCAqZ2hpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisJaW50IHJldDsKKworCWlmIChyZXBvcnRfdHlwZSA9PSBISURfT1VUUFVUX1JFUE9SVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBnYl9oaWRfZ2V0X3JlcG9ydChnaGlkLCByZXBvcnRfdHlwZSwgcmVwb3J0X251bWJlciwgYnVmLCBjb3VudCk7CisJaWYgKCFyZXQpCisJCXJldCA9IGNvdW50OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2diX2hpZF9vdXRwdXRfcmF3X3JlcG9ydChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBfX3U4ICpidWYsCisJCQkJICAgICAgc2l6ZV90IGxlbiwgdW5zaWduZWQgY2hhciByZXBvcnRfdHlwZSkKK3sKKwlzdHJ1Y3QgZ2JfaGlkICpnaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKKwlpbnQgcmVwb3J0X2lkID0gYnVmWzBdOworCWludCByZXQ7CisKKwlpZiAocmVwb3J0X3R5cGUgPT0gSElEX0lOUFVUX1JFUE9SVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmVwb3J0X2lkKSB7CisJCWJ1ZisrOworCQlsZW4tLTsKKwl9CisKKwlyZXQgPSBnYl9oaWRfc2V0X3JlcG9ydChnaGlkLCByZXBvcnRfdHlwZSwgcmVwb3J0X2lkLCBidWYsIGxlbik7CisJaWYgKHJlcG9ydF9pZCAmJiByZXQgPj0gMCkKKwkJcmV0Kys7IC8qIGFkZCByZXBvcnRfaWQgdG8gdGhlIG51bWJlciBvZiB0cmFuc2ZlcmVkIGJ5dGVzICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9oaWRfcmF3X3JlcXVlc3Qoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgdW5zaWduZWQgY2hhciByZXBvcnRudW0sCisJCQkgICAgICAgX191OCAqYnVmLCBzaXplX3QgbGVuLCB1bnNpZ25lZCBjaGFyIHJ0eXBlLAorCQkJICAgICAgIGludCByZXF0eXBlKQoreworCXN3aXRjaCAocmVxdHlwZSkgeworCWNhc2UgSElEX1JFUV9HRVRfUkVQT1JUOgorCQlyZXR1cm4gX19nYl9oaWRfZ2V0X3Jhd19yZXBvcnQoaGlkLCByZXBvcnRudW0sIGJ1ZiwgbGVuLCBydHlwZSk7CisJY2FzZSBISURfUkVRX1NFVF9SRVBPUlQ6CisJCWlmIChidWZbMF0gIT0gcmVwb3J0bnVtKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBfX2diX2hpZF9vdXRwdXRfcmF3X3JlcG9ydChoaWQsIGJ1ZiwgbGVuLCBydHlwZSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU87CisJfQorfQorCisvKiBISUQgQ2FsbGJhY2tzICovCitzdGF0aWMgaW50IGdiX2hpZF9wYXJzZShzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQoreworCXN0cnVjdCBnYl9oaWQgKmdoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGludCByc2l6ZTsKKwljaGFyICpyZGVzYzsKKwlpbnQgcmV0OworCisJcnNpemUgPSBsZTE2X3RvX2NwdShnaGlkLT5oZGVzYy53UmVwb3J0RGVzY0xlbmd0aCk7CisJaWYgKCFyc2l6ZSB8fCByc2l6ZSA+IEhJRF9NQVhfREVTQ1JJUFRPUl9TSVpFKSB7CisJCWRiZ19oaWQoIndlaXJkIHNpemUgb2YgcmVwb3J0IGRlc2NyaXB0b3IgKCV1KVxuIiwgcnNpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZGVzYyA9IGt6YWxsb2MocnNpemUsIEdGUF9LRVJORUwpOworCWlmICghcmRlc2MpIHsKKwkJZGJnX2hpZCgiY291bGRuJ3QgYWxsb2NhdGUgcmRlc2MgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gZ2JfaGlkX2dldF9yZXBvcnRfZGVzYyhnaGlkLCByZGVzYyk7CisJaWYgKHJldCkgeworCQloaWRfZXJyKGhpZCwgInJlYWRpbmcgcmVwb3J0IGRlc2NyaXB0b3IgZmFpbGVkXG4iKTsKKwkJZ290byBmcmVlX3JkZXNjOworCX0KKworCXJldCA9IGhpZF9wYXJzZV9yZXBvcnQoaGlkLCByZGVzYywgcnNpemUpOworCWlmIChyZXQpCisJCWRiZ19oaWQoInBhcnNpbmcgcmVwb3J0IGRlc2NyaXB0b3IgZmFpbGVkXG4iKTsKKworZnJlZV9yZGVzYzoKKwlrZnJlZShyZGVzYyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2hpZF9zdGFydChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQoreworCXN0cnVjdCBnYl9oaWQgKmdoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGludCBidWZzaXplID0gSElEX01JTl9CVUZGRVJfU0laRTsKKwlpbnQgcmV0OworCisJZ2JfaGlkX2ZpbmRfbWF4X3JlcG9ydChoaWQsIEhJRF9JTlBVVF9SRVBPUlQsICZidWZzaXplKTsKKwlnYl9oaWRfZmluZF9tYXhfcmVwb3J0KGhpZCwgSElEX09VVFBVVF9SRVBPUlQsICZidWZzaXplKTsKKwlnYl9oaWRfZmluZF9tYXhfcmVwb3J0KGhpZCwgSElEX0ZFQVRVUkVfUkVQT1JULCAmYnVmc2l6ZSk7CisKKwlpZiAoYnVmc2l6ZSA+IEhJRF9NQVhfQlVGRkVSX1NJWkUpCisJCWJ1ZnNpemUgPSBISURfTUFYX0JVRkZFUl9TSVpFOworCisJcmV0ID0gZ2JfaGlkX2FsbG9jX2J1ZmZlcnMoZ2hpZCwgYnVmc2l6ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICghKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX05PX0lOSVRfUkVQT1JUUykpCisJCWdiX2hpZF9pbml0X3JlcG9ydHMoZ2hpZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2JfaGlkX3N0b3Aoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK3sKKwlzdHJ1Y3QgZ2JfaGlkICpnaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKKworCWdiX2hpZF9mcmVlX2J1ZmZlcnMoZ2hpZCk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfaGlkX29wZW4oc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK3sKKwlzdHJ1Y3QgZ2JfaGlkICpnaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmdiX2hpZF9vcGVuX211dGV4KTsKKwlpZiAoIWhpZC0+b3BlbisrKSB7CisJCXJldCA9IGdiX2hpZF9zZXRfcG93ZXIoZ2hpZCwgR0JfSElEX1RZUEVfUFdSX09OKTsKKwkJaWYgKHJldCA8IDApCisJCQloaWQtPm9wZW4tLTsKKwkJZWxzZQorCQkJc2V0X2JpdChHQl9ISURfU1RBUlRFRCwgJmdoaWQtPmZsYWdzKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZnYl9oaWRfb3Blbl9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnYl9oaWRfY2xvc2Uoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK3sKKwlzdHJ1Y3QgZ2JfaGlkICpnaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBQcm90ZWN0aW5nIGhpZC0+b3BlbiB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgcmVzdGFydCBkYXRhIGFjcXVpc3Rpb24KKwkgKiBkdWUgdG8gYSByZXN1bXB0aW9uIHdlIG5vIGxvbmdlciBjYXJlIGFib3V0Li4KKwkgKi8KKwltdXRleF9sb2NrKCZnYl9oaWRfb3Blbl9tdXRleCk7CisJaWYgKCEtLWhpZC0+b3BlbikgeworCQljbGVhcl9iaXQoR0JfSElEX1NUQVJURUQsICZnaGlkLT5mbGFncyk7CisKKwkJLyogU2F2ZSBzb21lIHBvd2VyICovCisJCXJldCA9IGdiX2hpZF9zZXRfcG93ZXIoZ2hpZCwgR0JfSElEX1RZUEVfUFdSX09GRik7CisJCWlmIChyZXQpCisJCQlkZXZfZXJyKCZnaGlkLT5jb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCQkiZmFpbGVkIHRvIHBvd2VyIG9mZiAoJWQpXG4iLCByZXQpOworCX0KKwltdXRleF91bmxvY2soJmdiX2hpZF9vcGVuX211dGV4KTsKK30KKworc3RhdGljIGludCBnYl9oaWRfcG93ZXIoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgaW50IGx2bCkKK3sKKwlzdHJ1Y3QgZ2JfaGlkICpnaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKKworCXN3aXRjaCAobHZsKSB7CisJY2FzZSBQTV9ISU5UX0ZVTExPTjoKKwkJcmV0dXJuIGdiX2hpZF9zZXRfcG93ZXIoZ2hpZCwgR0JfSElEX1RZUEVfUFdSX09OKTsKKwljYXNlIFBNX0hJTlRfTk9STUFMOgorCQlyZXR1cm4gZ2JfaGlkX3NldF9wb3dlcihnaGlkLCBHQl9ISURfVFlQRV9QV1JfT0ZGKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogSElEIHN0cnVjdHVyZSB0byBwYXNzIGNhbGxiYWNrcyAqLworc3RhdGljIHN0cnVjdCBoaWRfbGxfZHJpdmVyIGdiX2hpZF9sbF9kcml2ZXIgPSB7CisJLnBhcnNlID0gZ2JfaGlkX3BhcnNlLAorCS5zdGFydCA9IGdiX2hpZF9zdGFydCwKKwkuc3RvcCA9IGdiX2hpZF9zdG9wLAorCS5vcGVuID0gZ2JfaGlkX29wZW4sCisJLmNsb3NlID0gZ2JfaGlkX2Nsb3NlLAorCS5wb3dlciA9IGdiX2hpZF9wb3dlciwKKwkucmF3X3JlcXVlc3QgPSBnYl9oaWRfcmF3X3JlcXVlc3QsCit9OworCitzdGF0aWMgaW50IGdiX2hpZF9pbml0KHN0cnVjdCBnYl9oaWQgKmdoaWQpCit7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGdoaWQtPmhpZDsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JfaGlkX2dldF9kZXNjKGdoaWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwloaWQtPnZlcnNpb24gPSBsZTE2X3RvX2NwdShnaGlkLT5oZGVzYy5iY2RISUQpOworCWhpZC0+dmVuZG9yID0gbGUxNl90b19jcHUoZ2hpZC0+aGRlc2Mud1ZlbmRvcklEKTsKKwloaWQtPnByb2R1Y3QgPSBsZTE2X3RvX2NwdShnaGlkLT5oZGVzYy53UHJvZHVjdElEKTsKKwloaWQtPmNvdW50cnkgPSBnaGlkLT5oZGVzYy5iQ291bnRyeUNvZGU7CisKKwloaWQtPmRyaXZlcl9kYXRhID0gZ2hpZDsKKwloaWQtPmxsX2RyaXZlciA9ICZnYl9oaWRfbGxfZHJpdmVyOworCWhpZC0+ZGV2LnBhcmVudCA9ICZnaGlkLT5jb25uZWN0aW9uLT5idW5kbGUtPmRldjsKKy8vCWhpZC0+YnVzID0gQlVTX0dSRVlCVVM7IC8qIE5lZWQgYSBidXN0eXBlIGZvciBHUkVZQlVTIGluIDxsaW51eC9pbnB1dC5oPiAqLworCisJLyogU2V0IEhJRCBkZXZpY2UncyBuYW1lICovCisJc25wcmludGYoaGlkLT5uYW1lLCBzaXplb2YoaGlkLT5uYW1lKSwgIiVzICUwNFg6JTA0WCIsCisJCSBkZXZfbmFtZSgmZ2hpZC0+Y29ubmVjdGlvbi0+YnVuZGxlLT5kZXYpLAorCQkgaGlkLT52ZW5kb3IsIGhpZC0+cHJvZHVjdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9oaWRfcHJvYmUoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlLAorCQkJY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2Nwb3J0ICpjcG9ydF9kZXNjOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQ7CisJc3RydWN0IGdiX2hpZCAqZ2hpZDsKKwlpbnQgcmV0OworCisJaWYgKGJ1bmRsZS0+bnVtX2Nwb3J0cyAhPSAxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNwb3J0X2Rlc2MgPSAmYnVuZGxlLT5jcG9ydF9kZXNjWzBdOworCWlmIChjcG9ydF9kZXNjLT5wcm90b2NvbF9pZCAhPSBHUkVZQlVTX1BST1RPQ09MX0hJRCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlnaGlkID0ga3phbGxvYyhzaXplb2YoKmdoaWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdoaWQpCisJCXJldHVybiAtRU5PTUVNOworCisJY29ubmVjdGlvbiA9IGdiX2Nvbm5lY3Rpb25fY3JlYXRlKGJ1bmRsZSwgbGUxNl90b19jcHUoY3BvcnRfZGVzYy0+aWQpLAorCQkJCQkJZ2JfaGlkX3JlcXVlc3RfaGFuZGxlcik7CisJaWYgKElTX0VSUihjb25uZWN0aW9uKSkgeworCQlyZXQgPSBQVFJfRVJSKGNvbm5lY3Rpb24pOworCQlnb3RvIGVycl9mcmVlX2doaWQ7CisJfQorCisJZ2JfY29ubmVjdGlvbl9zZXRfZGF0YShjb25uZWN0aW9uLCBnaGlkKTsKKwlnaGlkLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKworCWhpZCA9IGhpZF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoSVNfRVJSKGhpZCkpIHsKKwkJcmV0ID0gUFRSX0VSUihoaWQpOworCQlnb3RvIGVycl9jb25uZWN0aW9uX2Rlc3Ryb3k7CisJfQorCisJZ2hpZC0+aGlkID0gaGlkOworCWdoaWQtPmJ1bmRsZSA9IGJ1bmRsZTsKKworCWdyZXlidXNfc2V0X2RydmRhdGEoYnVuZGxlLCBnaGlkKTsKKworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm5lY3Rpb24pOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Rlc3Ryb3lfaGlkOworCisJcmV0ID0gZ2JfaGlkX2luaXQoZ2hpZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfY29ubmVjdGlvbl9kaXNhYmxlOworCisJcmV0ID0gaGlkX2FkZF9kZXZpY2UoaGlkKTsKKwlpZiAocmV0KSB7CisJCWhpZF9lcnIoaGlkLCAiY2FuJ3QgYWRkIGhpZCBkZXZpY2U6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9jb25uZWN0aW9uX2Rpc2FibGU7CisJfQorCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKworCXJldHVybiAwOworCitlcnJfY29ubmVjdGlvbl9kaXNhYmxlOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKK2Vycl9kZXN0cm95X2hpZDoKKwloaWRfZGVzdHJveV9kZXZpY2UoaGlkKTsKK2Vycl9jb25uZWN0aW9uX2Rlc3Ryb3k6CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGNvbm5lY3Rpb24pOworZXJyX2ZyZWVfZ2hpZDoKKwlrZnJlZShnaGlkKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2hpZF9kaXNjb25uZWN0KHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwlzdHJ1Y3QgZ2JfaGlkICpnaGlkID0gZ3JleWJ1c19nZXRfZHJ2ZGF0YShidW5kbGUpOworCisJaWYgKGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKSkKKwkJZ2JfcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoYnVuZGxlKTsKKworCWhpZF9kZXN0cm95X2RldmljZShnaGlkLT5oaWQpOworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShnaGlkLT5jb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koZ2hpZC0+Y29ubmVjdGlvbik7CisJa2ZyZWUoZ2hpZCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgZ2JfaGlkX2lkX3RhYmxlW10gPSB7CisJeyBHUkVZQlVTX0RFVklDRV9DTEFTUyhHUkVZQlVTX0NMQVNTX0hJRCkgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGdyZXlidXMsIGdiX2hpZF9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZ3JleWJ1c19kcml2ZXIgZ2JfaGlkX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiaGlkIiwKKwkucHJvYmUJCT0gZ2JfaGlkX3Byb2JlLAorCS5kaXNjb25uZWN0CT0gZ2JfaGlkX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gZ2JfaGlkX2lkX3RhYmxlLAorfTsKK21vZHVsZV9ncmV5YnVzX2RyaXZlcihnYl9oaWRfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvaTJjLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmE1MDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvaTJjLmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBJMkMgYnJpZGdlIGRyaXZlciBmb3IgdGhlIEdyZXlidXMgImdlbmVyaWMiIEkyQyBtb2R1bGUuCisgKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJnYnBoeS5oIgorCitzdHJ1Y3QgZ2JfaTJjX2RldmljZSB7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24JKmNvbm5lY3Rpb247CisJc3RydWN0IGdicGh5X2RldmljZQkqZ2JwaHlfZGV2OworCisJdTMyCQkJZnVuY3Rpb25hbGl0eTsKKworCXN0cnVjdCBpMmNfYWRhcHRlcglhZGFwdGVyOworfTsKKworLyoKKyAqIE1hcCBHcmV5YnVzIGkyYyBmdW5jdGlvbmFsaXR5IGJpdHMgaW50byBMaW51eCBvbmVzCisgKi8KK3N0YXRpYyB1MzIgZ2JfaTJjX2Z1bmN0aW9uYWxpdHlfbWFwKHUzMiBnYl9pMmNfZnVuY3Rpb25hbGl0eSkKK3sKKwlyZXR1cm4gZ2JfaTJjX2Z1bmN0aW9uYWxpdHk7CS8qIEFsbCBiaXRzIHRoZSBzYW1lIGZvciBub3cgKi8KK30KKworc3RhdGljIGludCBnYl9pMmNfZnVuY3Rpb25hbGl0eV9vcGVyYXRpb24oc3RydWN0IGdiX2kyY19kZXZpY2UgKmdiX2kyY19kZXYpCit7CisJc3RydWN0IGdiX2kyY19mdW5jdGlvbmFsaXR5X3Jlc3BvbnNlIHJlc3BvbnNlOworCXUzMiBmdW5jdGlvbmFsaXR5OworCWludCByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhnYl9pMmNfZGV2LT5jb25uZWN0aW9uLAorCQkJCUdCX0kyQ19UWVBFX0ZVTkNUSU9OQUxJVFksCisJCQkJTlVMTCwgMCwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZnVuY3Rpb25hbGl0eSA9IGxlMzJfdG9fY3B1KHJlc3BvbnNlLmZ1bmN0aW9uYWxpdHkpOworCWdiX2kyY19kZXYtPmZ1bmN0aW9uYWxpdHkgPSBnYl9pMmNfZnVuY3Rpb25hbGl0eV9tYXAoZnVuY3Rpb25hbGl0eSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE1hcCBMaW51eCBpMmNfbXNnIGZsYWdzIGludG8gR3JleWJ1cyBpMmMgdHJhbnNmZXIgb3AgZmxhZ3MuCisgKi8KK3N0YXRpYyB1MTYgZ2JfaTJjX3RyYW5zZmVyX29wX2ZsYWdzX21hcCh1MTYgZmxhZ3MpCit7CisJcmV0dXJuIGZsYWdzOwkvKiBBbGwgZmxhZ3MgdGhlIHNhbWUgZm9yIG5vdyAqLworfQorCitzdGF0aWMgdm9pZAorZ2JfaTJjX2ZpbGxfdHJhbnNmZXJfb3Aoc3RydWN0IGdiX2kyY190cmFuc2Zlcl9vcCAqb3AsIHN0cnVjdCBpMmNfbXNnICptc2cpCit7CisJdTE2IGZsYWdzID0gZ2JfaTJjX3RyYW5zZmVyX29wX2ZsYWdzX21hcChtc2ctPmZsYWdzKTsKKworCW9wLT5hZGRyID0gY3B1X3RvX2xlMTYobXNnLT5hZGRyKTsKKwlvcC0+ZmxhZ3MgPSBjcHVfdG9fbGUxNihmbGFncyk7CisJb3AtPnNpemUgPSBjcHVfdG9fbGUxNihtc2ctPmxlbik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICoKK2diX2kyY19vcGVyYXRpb25fY3JlYXRlKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJc3RydWN0IGkyY19tc2cgKm1zZ3MsIHUzMiBtc2dfY291bnQpCit7CisJc3RydWN0IGdiX2kyY19kZXZpY2UgKmdiX2kyY19kZXYgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKGNvbm5lY3Rpb24pOworCXN0cnVjdCBnYl9pMmNfdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdDsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJc3RydWN0IGdiX2kyY190cmFuc2Zlcl9vcCAqb3A7CisJc3RydWN0IGkyY19tc2cgKm1zZzsKKwl1MzIgZGF0YV9vdXRfc2l6ZSA9IDA7CisJdTMyIGRhdGFfaW5fc2l6ZSA9IDA7CisJc2l6ZV90IHJlcXVlc3Rfc2l6ZTsKKwl2b2lkICpkYXRhOworCXUxNiBvcF9jb3VudDsKKwl1MzIgaTsKKworCWlmIChtc2dfY291bnQgPiAodTMyKVUxNl9NQVgpIHsKKwkJZGV2X2VycigmZ2JfaTJjX2Rldi0+Z2JwaHlfZGV2LT5kZXYsICJtc2dfY291bnQgKCV1KSB0b28gYmlnXG4iLAorCQkJbXNnX2NvdW50KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW9wX2NvdW50ID0gKHUxNiltc2dfY291bnQ7CisKKwkvKgorCSAqIEluIGFkZGl0aW9uIHRvIHNwYWNlIGZvciBhbGwgbWVzc2FnZSBkZXNjcmlwdG9ycyB3ZSBuZWVkCisJICogdG8gaGF2ZSBlbm91Z2ggdG8gaG9sZCBhbGwgb3V0Ym91bmQgbWVzc2FnZSBkYXRhLgorCSAqLworCW1zZyA9IG1zZ3M7CisJZm9yIChpID0gMDsgaSA8IG1zZ19jb3VudDsgaSsrLCBtc2crKykKKwkJaWYgKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkKKwkJCWRhdGFfaW5fc2l6ZSArPSAodTMyKW1zZy0+bGVuOworCQllbHNlCisJCQlkYXRhX291dF9zaXplICs9ICh1MzIpbXNnLT5sZW47CisKKwlyZXF1ZXN0X3NpemUgPSBzaXplb2YoKnJlcXVlc3QpOworCXJlcXVlc3Rfc2l6ZSArPSBtc2dfY291bnQgKiBzaXplb2YoKm9wKTsKKwlyZXF1ZXN0X3NpemUgKz0gZGF0YV9vdXRfc2l6ZTsKKworCS8qIFJlc3BvbnNlIGNvbnNpc3RzIG9ubHkgb2YgaW5jb21pbmcgZGF0YSAqLworCW9wZXJhdGlvbiA9IGdiX29wZXJhdGlvbl9jcmVhdGUoY29ubmVjdGlvbiwgR0JfSTJDX1RZUEVfVFJBTlNGRVIsCisJCQkJcmVxdWVzdF9zaXplLCBkYXRhX2luX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghb3BlcmF0aW9uKQorCQlyZXR1cm4gTlVMTDsKKworCXJlcXVlc3QgPSBvcGVyYXRpb24tPnJlcXVlc3QtPnBheWxvYWQ7CisJcmVxdWVzdC0+b3BfY291bnQgPSBjcHVfdG9fbGUxNihvcF9jb3VudCk7CisJLyogRmlsbCBpbiB0aGUgb3BzIGFycmF5ICovCisJb3AgPSAmcmVxdWVzdC0+b3BzWzBdOworCW1zZyA9IG1zZ3M7CisJZm9yIChpID0gMDsgaSA8IG1zZ19jb3VudDsgaSsrKQorCQlnYl9pMmNfZmlsbF90cmFuc2Zlcl9vcChvcCsrLCBtc2crKyk7CisKKwlpZiAoIWRhdGFfb3V0X3NpemUpCisJCXJldHVybiBvcGVyYXRpb247CisKKwkvKiBDb3B5IG92ZXIgdGhlIG91dGdvaW5nIGRhdGE7IGl0IHN0YXJ0cyBhZnRlciB0aGUgbGFzdCBvcCAqLworCWRhdGEgPSBvcDsKKwltc2cgPSBtc2dzOworCWZvciAoaSA9IDA7IGkgPCBtc2dfY291bnQ7IGkrKykgeworCQlpZiAoIShtc2ctPmZsYWdzICYgSTJDX01fUkQpKSB7CisJCQltZW1jcHkoZGF0YSwgbXNnLT5idWYsIG1zZy0+bGVuKTsKKwkJCWRhdGEgKz0gbXNnLT5sZW47CisJCX0KKwkJbXNnKys7CisJfQorCisJcmV0dXJuIG9wZXJhdGlvbjsKK30KKworc3RhdGljIHZvaWQgZ2JfaTJjX2RlY29kZV9yZXNwb25zZShzdHJ1Y3QgaTJjX21zZyAqbXNncywgdTMyIG1zZ19jb3VudCwKKwkJCQlzdHJ1Y3QgZ2JfaTJjX3RyYW5zZmVyX3Jlc3BvbnNlICpyZXNwb25zZSkKK3sKKwlzdHJ1Y3QgaTJjX21zZyAqbXNnID0gbXNnczsKKwl1OCAqZGF0YTsKKwl1MzIgaTsKKworCWlmICghcmVzcG9uc2UpCisJCXJldHVybjsKKwlkYXRhID0gcmVzcG9uc2UtPmRhdGE7CisJZm9yIChpID0gMDsgaSA8IG1zZ19jb3VudDsgaSsrKSB7CisJCWlmIChtc2ctPmZsYWdzICYgSTJDX01fUkQpIHsKKwkJCW1lbWNweShtc2ctPmJ1ZiwgZGF0YSwgbXNnLT5sZW4pOworCQkJZGF0YSArPSBtc2ctPmxlbjsKKwkJfQorCQltc2crKzsKKwl9Cit9CisKKy8qCisgKiBTb21lIGkyYyB0cmFuc2ZlciBvcGVyYXRpb25zIHJldHVybiByZXN1bHRzIHRoYXQgYXJlIGV4cGVjdGVkLgorICovCitzdGF0aWMgYm9vbCBnYl9pMmNfZXhwZWN0ZWRfdHJhbnNmZXJfZXJyb3IoaW50IGVycm5vKQoreworCXJldHVybiBlcnJubyA9PSAtRUFHQUlOIHx8IGVycm5vID09IC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgZ2JfaTJjX3RyYW5zZmVyX29wZXJhdGlvbihzdHJ1Y3QgZ2JfaTJjX2RldmljZSAqZ2JfaTJjX2RldiwKKwkJCQkJc3RydWN0IGkyY19tc2cgKm1zZ3MsIHUzMiBtc2dfY291bnQpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnYl9pMmNfZGV2LT5jb25uZWN0aW9uOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZnYl9pMmNfZGV2LT5nYnBoeV9kZXYtPmRldjsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJaW50IHJldDsKKworCW9wZXJhdGlvbiA9IGdiX2kyY19vcGVyYXRpb25fY3JlYXRlKGNvbm5lY3Rpb24sIG1zZ3MsIG1zZ19jb3VudCk7CisJaWYgKCFvcGVyYXRpb24pCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gZ2JwaHlfcnVudGltZV9nZXRfc3luYyhnYl9pMmNfZGV2LT5nYnBoeV9kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9vcGVyYXRpb25fcHV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZF9zeW5jKG9wZXJhdGlvbik7CisJaWYgKCFyZXQpIHsKKwkJc3RydWN0IGdiX2kyY190cmFuc2Zlcl9yZXNwb25zZSAqcmVzcG9uc2U7CisKKwkJcmVzcG9uc2UgPSBvcGVyYXRpb24tPnJlc3BvbnNlLT5wYXlsb2FkOworCQlnYl9pMmNfZGVjb2RlX3Jlc3BvbnNlKG1zZ3MsIG1zZ19jb3VudCwgcmVzcG9uc2UpOworCQlyZXQgPSBtc2dfY291bnQ7CisJfSBlbHNlIGlmICghZ2JfaTJjX2V4cGVjdGVkX3RyYW5zZmVyX2Vycm9yKHJldCkpIHsKKwkJZGV2X2VycihkZXYsICJ0cmFuc2ZlciBvcGVyYXRpb24gZmFpbGVkICglZClcbiIsIHJldCk7CisJfQorCisJZ2JwaHlfcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ2JfaTJjX2Rldi0+Z2JwaHlfZGV2KTsKKworZXhpdF9vcGVyYXRpb25fcHV0OgorCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfaTJjX21hc3Rlcl94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZ3MsCisJCWludCBtc2dfY291bnQpCit7CisJc3RydWN0IGdiX2kyY19kZXZpY2UgKmdiX2kyY19kZXY7CisKKwlnYl9pMmNfZGV2ID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKKworCXJldHVybiBnYl9pMmNfdHJhbnNmZXJfb3BlcmF0aW9uKGdiX2kyY19kZXYsIG1zZ3MsIG1zZ19jb3VudCk7Cit9CisKKyNpZiAwCisvKiBMYXRlciAqLworc3RhdGljIGludCBnYl9pMmNfc21idXNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsCisJCQl1MTYgYWRkciwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNoYXIgcmVhZF93cml0ZSwKKwkJCXU4IGNvbW1hbmQsIGludCBzaXplLCB1bmlvbiBpMmNfc21idXNfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ2JfaTJjX2RldmljZSAqZ2JfaTJjX2RldjsKKworCWdiX2kyY19kZXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHUzMiBnYl9pMmNfZnVuY3Rpb25hbGl0eShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IGdiX2kyY19kZXZpY2UgKmdiX2kyY19kZXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCisJcmV0dXJuIGdiX2kyY19kZXYtPmZ1bmN0aW9uYWxpdHk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBnYl9pMmNfYWxnb3JpdGhtID0geworCS5tYXN0ZXJfeGZlcgk9IGdiX2kyY19tYXN0ZXJfeGZlciwKKwkvKiAuc21idXNfeGZlcgk9IGdiX2kyY19zbWJ1c194ZmVyLCAqLworCS5mdW5jdGlvbmFsaXR5CT0gZ2JfaTJjX2Z1bmN0aW9uYWxpdHksCit9OworCisvKgorICogRG8gaW5pdGlhbCBzZXR1cCBvZiB0aGUgaTJjIGRldmljZS4gIFRoaXMgaW5jbHVkZXMgdmVyaWZ5aW5nIHdlCisgKiBjYW4gc3VwcG9ydCBpdCAoYmFzZWQgb24gdGhlIHByb3RvY29sIHZlcnNpb24gaXQgYWR2ZXJ0aXNlcykuCisgKiBJZiB0aGF0J3MgT0ssIHdlIGdldCBhbmQgY2FjaGVkIGl0cyBmdW5jdGlvbmFsaXR5IGJpdHMuCisgKgorICogTm90ZTogZ2JfaTJjX2Rldi0+Y29ubmVjdGlvbiBpcyBhc3N1bWVkIHRvIGhhdmUgYmVlbiB2YWxpZC4KKyAqLworc3RhdGljIGludCBnYl9pMmNfZGV2aWNlX3NldHVwKHN0cnVjdCBnYl9pMmNfZGV2aWNlICpnYl9pMmNfZGV2KQoreworCS8qIEFzc3VtZSB0aGUgZnVuY3Rpb25hbGl0eSBuZXZlciBjaGFuZ2VzLCBqdXN0IGdldCBpdCBvbmNlICovCisJcmV0dXJuIGdiX2kyY19mdW5jdGlvbmFsaXR5X29wZXJhdGlvbihnYl9pMmNfZGV2KTsKK30KKworc3RhdGljIGludCBnYl9pMmNfcHJvYmUoc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2LAorCQkJIGNvbnN0IHN0cnVjdCBnYnBoeV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCXN0cnVjdCBnYl9pMmNfZGV2aWNlICpnYl9pMmNfZGV2OworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsKKwlpbnQgcmV0OworCisJZ2JfaTJjX2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpnYl9pMmNfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnYl9pMmNfZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbm5lY3Rpb24gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZShnYnBoeV9kZXYtPmJ1bmRsZSwKKwkJCQkJICBsZTE2X3RvX2NwdShnYnBoeV9kZXYtPmNwb3J0X2Rlc2MtPmlkKSwKKwkJCQkJICBOVUxMKTsKKwlpZiAoSVNfRVJSKGNvbm5lY3Rpb24pKSB7CisJCXJldCA9IFBUUl9FUlIoY29ubmVjdGlvbik7CisJCWdvdG8gZXhpdF9pMmNkZXZfZnJlZTsKKwl9CisKKwlnYl9pMmNfZGV2LT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKwlnYl9jb25uZWN0aW9uX3NldF9kYXRhKGNvbm5lY3Rpb24sIGdiX2kyY19kZXYpOworCWdiX2kyY19kZXYtPmdicGh5X2RldiA9IGdicGh5X2RldjsKKwlnYl9nYnBoeV9zZXRfZGF0YShnYnBoeV9kZXYsIGdiX2kyY19kZXYpOworCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbik7CisJaWYgKHJldCkKKwkJZ290byBleGl0X2Nvbm5lY3Rpb25fZGVzdHJveTsKKworCXJldCA9IGdiX2kyY19kZXZpY2Vfc2V0dXAoZ2JfaTJjX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBleGl0X2Nvbm5lY3Rpb25fZGlzYWJsZTsKKworCS8qIExvb2tzIGdvb2Q7IHVwIG91ciBpMmMgYWRhcHRlciAqLworCWFkYXB0ZXIgPSAmZ2JfaTJjX2Rldi0+YWRhcHRlcjsKKwlhZGFwdGVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCWFkYXB0ZXItPmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OIHwgSTJDX0NMQVNTX1NQRDsKKwlhZGFwdGVyLT5hbGdvID0gJmdiX2kyY19hbGdvcml0aG07CisJLyogYWRhcHRlci0+YWxnb19kYXRhID0gd2hhdD8gKi8KKworCWFkYXB0ZXItPmRldi5wYXJlbnQgPSAmZ2JwaHlfZGV2LT5kZXY7CisJc25wcmludGYoYWRhcHRlci0+bmFtZSwgc2l6ZW9mKGFkYXB0ZXItPm5hbWUpLCAiR3JleWJ1cyBpMmMgYWRhcHRlciIpOworCWkyY19zZXRfYWRhcGRhdGEoYWRhcHRlciwgZ2JfaTJjX2Rldik7CisKKwlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoYWRhcHRlcik7CisJaWYgKHJldCkKKwkJZ290byBleGl0X2Nvbm5lY3Rpb25fZGlzYWJsZTsKKworCWdicGh5X3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdicGh5X2Rldik7CisJcmV0dXJuIDA7CisKK2V4aXRfY29ubmVjdGlvbl9kaXNhYmxlOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKK2V4aXRfY29ubmVjdGlvbl9kZXN0cm95OgorCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKK2V4aXRfaTJjZGV2X2ZyZWU6CisJa2ZyZWUoZ2JfaTJjX2Rldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnYl9pMmNfcmVtb3ZlKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldikKK3sKKwlzdHJ1Y3QgZ2JfaTJjX2RldmljZSAqZ2JfaTJjX2RldiA9IGdiX2dicGh5X2dldF9kYXRhKGdicGh5X2Rldik7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnYl9pMmNfZGV2LT5jb25uZWN0aW9uOworCWludCByZXQ7CisKKwlyZXQgPSBnYnBoeV9ydW50aW1lX2dldF9zeW5jKGdicGh5X2Rldik7CisJaWYgKHJldCkKKwkJZ2JwaHlfcnVudGltZV9nZXRfbm9yZXN1bWUoZ2JwaHlfZGV2KTsKKworCWkyY19kZWxfYWRhcHRlcigmZ2JfaTJjX2Rldi0+YWRhcHRlcik7CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKKwlrZnJlZShnYl9pMmNfZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBnYnBoeV9kZXZpY2VfaWQgZ2JfaTJjX2lkX3RhYmxlW10gPSB7CisJeyBHQlBIWV9QUk9UT0NPTChHUkVZQlVTX1BST1RPQ09MX0kyQykgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShnYnBoeSwgZ2JfaTJjX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBnYnBoeV9kcml2ZXIgaTJjX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiaTJjIiwKKwkucHJvYmUJCT0gZ2JfaTJjX3Byb2JlLAorCS5yZW1vdmUJCT0gZ2JfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBnYl9pMmNfaWRfdGFibGUsCit9OworCittb2R1bGVfZ2JwaHlfZHJpdmVyKGkyY19kcml2ZXIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDZiMDkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvaW50ZXJmYWNlLmMKQEAgLTAsMCArMSwxMzE2IEBACisvKgorICogR3JleWJ1cyBpbnRlcmZhY2UgY29kZQorICoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImdyZXlidXNfdHJhY2UuaCIKKworI2RlZmluZSBHQl9JTlRFUkZBQ0VfTU9ERV9TV0lUQ0hfVElNRU9VVAkyMDAwCisKKyNkZWZpbmUgR0JfSU5URVJGQUNFX0RFVklDRV9JRF9CQUQJMHhmZgorCisjZGVmaW5lIEdCX0lOVEVSRkFDRV9BVVRPU1VTUEVORF9NUwkJCTMwMDAKKworLyogVGltZSByZXF1aXJlZCBmb3IgaW50ZXJmYWNlIHRvIGVudGVyIHN0YW5kYnkgYmVmb3JlIGRpc2FibGluZyBSRUZDTEsgKi8KKyNkZWZpbmUgR0JfSU5URVJGQUNFX1NVU1BFTkRfSElCRVJOQVRFX0RFTEFZX01TCQkJMjAKKworLyogRG9uJ3QtY2FyZSBzZWxlY3RvciBpbmRleCAqLworI2RlZmluZSBETUVfU0VMRUNUT1JfSU5ERVhfTlVMTAkJMAorCisvKiBETUUgYXR0cmlidXRlcyAqLworLyogRklYTUU6IHJlbW92ZSBFUzIgc3VwcG9ydCBhbmQgRE1FX1RfVFNUX1NSQ19JTkNSRU1FTlQgKi8KKyNkZWZpbmUgRE1FX1RfVFNUX1NSQ19JTkNSRU1FTlQJCTB4NDA4MworCisjZGVmaW5lIERNRV9EREJMMV9NQU5VRkFDVFVSRVJJRAkweDUwMDMKKyNkZWZpbmUgRE1FX0REQkwxX1BST0RVQ1RJRAkJMHg1MDA0CisKKyNkZWZpbmUgRE1FX1RPU0hJQkFfR01QX1ZJRAkJMHg2MDAwCisjZGVmaW5lIERNRV9UT1NISUJBX0dNUF9QSUQJCTB4NjAwMQorI2RlZmluZSBETUVfVE9TSElCQV9HTVBfU04wCQkweDYwMDIKKyNkZWZpbmUgRE1FX1RPU0hJQkFfR01QX1NOMQkJMHg2MDAzCisjZGVmaW5lIERNRV9UT1NISUJBX0dNUF9JTklUX1NUQVRVUwkweDYxMDEKKworLyogRERCTDEgTWFudWZhY3R1cmVyIGFuZCBQcm9kdWN0IGlkcyAqLworI2RlZmluZSBUT1NISUJBX0RNSUQJCQkweDAxMjYKKyNkZWZpbmUgVE9TSElCQV9FUzJfQlJJREdFX0RQSUQJCTB4MTAwMAorI2RlZmluZSBUT1NISUJBX0VTM19BUEJSSURHRV9EUElECTB4MTAwMQorI2RlZmluZSBUT1NISUJBX0VTM19HQlBIWV9EUElECTB4MTAwMgorCitzdGF0aWMgaW50IGdiX2ludGVyZmFjZV9oaWJlcm5hdGVfbGluayhzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKTsKK3N0YXRpYyBpbnQgZ2JfaW50ZXJmYWNlX3JlZmNsa19zZXQoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiwgYm9vbCBlbmFibGUpOworCitzdGF0aWMgaW50IGdiX2ludGVyZmFjZV9kbWVfYXR0cl9nZXQoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQkJCQl1MTYgYXR0ciwgdTMyICp2YWwpCit7CisJcmV0dXJuIGdiX3N2Y19kbWVfcGVlcl9nZXQoaW50Zi0+aGQtPnN2YywgaW50Zi0+aW50ZXJmYWNlX2lkLAorCQkJCQlhdHRyLCBETUVfU0VMRUNUT1JfSU5ERVhfTlVMTCwgdmFsKTsKK30KKworc3RhdGljIGludCBnYl9pbnRlcmZhY2VfcmVhZF9hcmFfZG1lKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpCit7CisJdTMyIHNuMCwgc24xOworCWludCByZXQ7CisKKwkvKgorCSAqIFVubGVzcyB0aGlzIGlzIGEgVG9zaGliYSBicmlkZ2UsIGJhaWwgb3V0IHVudGlsIHdlIGhhdmUgZGVmaW5lZAorCSAqIHN0YW5kYXJkIEdNUCBhdHRyaWJ1dGVzLgorCSAqLworCWlmIChpbnRmLT5kZGJsMV9tYW51ZmFjdHVyZXJfaWQgIT0gVE9TSElCQV9ETUlEKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgInVua25vd24gbWFudWZhY3R1cmVyICUwOHhcbiIsCisJCQkJaW50Zi0+ZGRibDFfbWFudWZhY3R1cmVyX2lkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0ID0gZ2JfaW50ZXJmYWNlX2RtZV9hdHRyX2dldChpbnRmLCBETUVfVE9TSElCQV9HTVBfVklELAorCQkJCQkmaW50Zi0+dmVuZG9yX2lkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2JfaW50ZXJmYWNlX2RtZV9hdHRyX2dldChpbnRmLCBETUVfVE9TSElCQV9HTVBfUElELAorCQkJCQkmaW50Zi0+cHJvZHVjdF9pZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdiX2ludGVyZmFjZV9kbWVfYXR0cl9nZXQoaW50ZiwgRE1FX1RPU0hJQkFfR01QX1NOMCwgJnNuMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdiX2ludGVyZmFjZV9kbWVfYXR0cl9nZXQoaW50ZiwgRE1FX1RPU0hJQkFfR01QX1NOMSwgJnNuMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWludGYtPnNlcmlhbF9udW1iZXIgPSAodTY0KXNuMSA8PCAzMiB8IHNuMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2ludGVyZmFjZV9yZWFkX2RtZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCWludCByZXQ7CisKKwkvKiBETUUgYXR0cmlidXRlcyBoYXZlIGFscmVhZHkgYmVlbiByZWFkICovCisJaWYgKGludGYtPmRtZV9yZWFkKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGdiX2ludGVyZmFjZV9kbWVfYXR0cl9nZXQoaW50ZiwgRE1FX0REQkwxX01BTlVGQUNUVVJFUklELAorCQkJCQkmaW50Zi0+ZGRibDFfbWFudWZhY3R1cmVyX2lkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2JfaW50ZXJmYWNlX2RtZV9hdHRyX2dldChpbnRmLCBETUVfRERCTDFfUFJPRFVDVElELAorCQkJCQkmaW50Zi0+ZGRibDFfcHJvZHVjdF9pZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChpbnRmLT5kZGJsMV9tYW51ZmFjdHVyZXJfaWQgPT0gVE9TSElCQV9ETUlEICYmCisJCQlpbnRmLT5kZGJsMV9wcm9kdWN0X2lkID09IFRPU0hJQkFfRVMyX0JSSURHRV9EUElEKSB7CisJCWludGYtPnF1aXJrcyB8PSBHQl9JTlRFUkZBQ0VfUVVJUktfTk9fR01QX0lEUzsKKwkJaW50Zi0+cXVpcmtzIHw9IEdCX0lOVEVSRkFDRV9RVUlSS19OT19JTklUX1NUQVRVUzsKKwl9CisKKwlyZXQgPSBnYl9pbnRlcmZhY2VfcmVhZF9hcmFfZG1lKGludGYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpbnRmLT5kbWVfcmVhZCA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9pbnRlcmZhY2Vfcm91dGVfY3JlYXRlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gaW50Zi0+aGQtPnN2YzsKKwl1OCBpbnRmX2lkID0gaW50Zi0+aW50ZXJmYWNlX2lkOworCXU4IGRldmljZV9pZDsKKwlpbnQgcmV0OworCisJLyogQWxsb2NhdGUgYW4gaW50ZXJmYWNlIGRldmljZSBpZC4gKi8KKwlyZXQgPSBpZGFfc2ltcGxlX2dldCgmc3ZjLT5kZXZpY2VfaWRfbWFwLAorCQkJICAgICBHQl9TVkNfREVWSUNFX0lEX01JTiwgR0JfU1ZDX0RFVklDRV9JRF9NQVggKyAxLAorCQkJICAgICBHRlBfS0VSTkVMKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgZGV2aWNlIGlkOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZGV2aWNlX2lkID0gcmV0OworCisJcmV0ID0gZ2Jfc3ZjX2ludGZfZGV2aWNlX2lkKHN2YywgaW50Zl9pZCwgZGV2aWNlX2lkKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImZhaWxlZCB0byBzZXQgZGV2aWNlIGlkICV1OiAlZFxuIiwKKwkJCQlkZXZpY2VfaWQsIHJldCk7CisJCWdvdG8gZXJyX2lkYV9yZW1vdmU7CisJfQorCisJLyogRklYTUU6IEhhcmQtY29kZWQgQVAgZGV2aWNlIGlkLiAqLworCXJldCA9IGdiX3N2Y19yb3V0ZV9jcmVhdGUoc3ZjLCBzdmMtPmFwX2ludGZfaWQsIEdCX1NWQ19ERVZJQ0VfSURfQVAsCisJCQkJICBpbnRmX2lkLCBkZXZpY2VfaWQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSByb3V0ZTogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX3N2Y19pZF9mcmVlOworCX0KKworCWludGYtPmRldmljZV9pZCA9IGRldmljZV9pZDsKKworCXJldHVybiAwOworCitlcnJfc3ZjX2lkX2ZyZWU6CisJLyoKKwkgKiBYWFggU2hvdWxkIHdlIHRlbGwgU1ZDIHRoYXQgdGhpcyBpZCBkb2Vzbid0IGJlbG9uZyB0byBpbnRlcmZhY2UKKwkgKiBYWFggYW55bW9yZS4KKwkgKi8KK2Vycl9pZGFfcmVtb3ZlOgorCWlkYV9zaW1wbGVfcmVtb3ZlKCZzdmMtPmRldmljZV9pZF9tYXAsIGRldmljZV9pZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnYl9pbnRlcmZhY2Vfcm91dGVfZGVzdHJveShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IGludGYtPmhkLT5zdmM7CisKKwlpZiAoaW50Zi0+ZGV2aWNlX2lkID09IEdCX0lOVEVSRkFDRV9ERVZJQ0VfSURfQkFEKQorCQlyZXR1cm47CisKKwlnYl9zdmNfcm91dGVfZGVzdHJveShzdmMsIHN2Yy0+YXBfaW50Zl9pZCwgaW50Zi0+aW50ZXJmYWNlX2lkKTsKKwlpZGFfc2ltcGxlX3JlbW92ZSgmc3ZjLT5kZXZpY2VfaWRfbWFwLCBpbnRmLT5kZXZpY2VfaWQpOworCWludGYtPmRldmljZV9pZCA9IEdCX0lOVEVSRkFDRV9ERVZJQ0VfSURfQkFEOworfQorCisvKiBMb2NraW5nOiBDYWxsZXIgaG9sZHMgdGhlIGludGVyZmFjZSBtdXRleC4gKi8KK3N0YXRpYyBpbnQgZ2JfaW50ZXJmYWNlX2xlZ2FjeV9tb2RlX3N3aXRjaChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCWludCByZXQ7CisKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAibGVnYWN5IG1vZGUgc3dpdGNoIGRldGVjdGVkXG4iKTsKKworCS8qIE1hcmsgYXMgZGlzY29ubmVjdGVkIHRvIHByZXZlbnQgSS9PIGR1cmluZyBkaXNhYmxlLiAqLworCWludGYtPmRpc2Nvbm5lY3RlZCA9IHRydWU7CisJZ2JfaW50ZXJmYWNlX2Rpc2FibGUoaW50Zik7CisJaW50Zi0+ZGlzY29ubmVjdGVkID0gZmFsc2U7CisKKwlyZXQgPSBnYl9pbnRlcmZhY2VfZW5hYmxlKGludGYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiZmFpbGVkIHRvIHJlLWVuYWJsZSBpbnRlcmZhY2U6ICVkXG4iLCByZXQpOworCQlnYl9pbnRlcmZhY2VfZGVhY3RpdmF0ZShpbnRmKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGdiX2ludGVyZmFjZV9tYWlsYm94X2V2ZW50KHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYsIHUxNiByZXN1bHQsCisJCQkJCQkJCXUzMiBtYWlsYm94KQoreworCW11dGV4X2xvY2soJmludGYtPm11dGV4KTsKKworCWlmIChyZXN1bHQpIHsKKwkJZGV2X3dhcm4oJmludGYtPmRldiwKKwkJCQkibWFpbGJveCBldmVudCB3aXRoIFVuaVBybyBlcnJvcjogMHglMDR4XG4iLAorCQkJCXJlc3VsdCk7CisJCWdvdG8gZXJyX2Rpc2FibGU7CisJfQorCisJaWYgKG1haWxib3ggIT0gR0JfU1ZDX0lOVEZfTUFJTEJPWF9HUkVZQlVTKSB7CisJCWRldl93YXJuKCZpbnRmLT5kZXYsCisJCQkJIm1haWxib3ggZXZlbnQgd2l0aCB1bmV4cGVjdGVkIHZhbHVlOiAweCUwOHhcbiIsCisJCQkJbWFpbGJveCk7CisJCWdvdG8gZXJyX2Rpc2FibGU7CisJfQorCisJaWYgKGludGYtPnF1aXJrcyAmIEdCX0lOVEVSRkFDRV9RVUlSS19MRUdBQ1lfTU9ERV9TV0lUQ0gpIHsKKwkJZ2JfaW50ZXJmYWNlX2xlZ2FjeV9tb2RlX3N3aXRjaChpbnRmKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWlmICghaW50Zi0+bW9kZV9zd2l0Y2gpIHsKKwkJZGV2X3dhcm4oJmludGYtPmRldiwgInVuZXhwZWN0ZWQgbWFpbGJveCBldmVudDogMHglMDh4XG4iLAorCQkJCW1haWxib3gpOworCQlnb3RvIGVycl9kaXNhYmxlOworCX0KKworCWRldl9pbmZvKCZpbnRmLT5kZXYsICJtb2RlIHN3aXRjaCBkZXRlY3RlZFxuIik7CisKKwljb21wbGV0ZSgmaW50Zi0+bW9kZV9zd2l0Y2hfY29tcGxldGlvbik7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZpbnRmLT5tdXRleCk7CisKKwlyZXR1cm47CisKK2Vycl9kaXNhYmxlOgorCWdiX2ludGVyZmFjZV9kaXNhYmxlKGludGYpOworCWdiX2ludGVyZmFjZV9kZWFjdGl2YXRlKGludGYpOworCW11dGV4X3VubG9jaygmaW50Zi0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBnYl9pbnRlcmZhY2VfbW9kZV9zd2l0Y2hfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZjsKKwlzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJaW50IHJldDsKKworCWludGYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGdiX2ludGVyZmFjZSwgbW9kZV9zd2l0Y2hfd29yayk7CisKKwltdXRleF9sb2NrKCZpbnRmLT5tdXRleCk7CisJLyogTWFrZSBzdXJlIGludGVyZmFjZSBpcyBzdGlsbCBlbmFibGVkLiAqLworCWlmICghaW50Zi0+ZW5hYmxlZCkgeworCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJtb2RlIHN3aXRjaCBhYm9ydGVkXG4iKTsKKwkJaW50Zi0+bW9kZV9zd2l0Y2ggPSBmYWxzZTsKKwkJbXV0ZXhfdW5sb2NrKCZpbnRmLT5tdXRleCk7CisJCWdvdG8gb3V0X2ludGVyZmFjZV9wdXQ7CisJfQorCisJLyoKKwkgKiBQcmVwYXJlIHRoZSBjb250cm9sIGRldmljZSBmb3IgbW9kZSBzd2l0Y2ggYW5kIG1ha2Ugc3VyZSB0byBnZXQgYW4KKwkgKiBleHRyYSByZWZlcmVuY2UgYmVmb3JlIGl0IGdvZXMgYXdheSBkdXJpbmcgaW50ZXJmYWNlIGRpc2FibGUuCisJICovCisJY29udHJvbCA9IGdiX2NvbnRyb2xfZ2V0KGludGYtPmNvbnRyb2wpOworCWdiX2NvbnRyb2xfbW9kZV9zd2l0Y2hfcHJlcGFyZShjb250cm9sKTsKKwlnYl9pbnRlcmZhY2VfZGlzYWJsZShpbnRmKTsKKwltdXRleF91bmxvY2soJmludGYtPm11dGV4KTsKKworCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKEdCX0lOVEVSRkFDRV9NT0RFX1NXSVRDSF9USU1FT1VUKTsKKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKwkJCSZpbnRmLT5tb2RlX3N3aXRjaF9jb21wbGV0aW9uLCB0aW1lb3V0KTsKKworCS8qIEZpbmFsaXNlIGNvbnRyb2wtY29ubmVjdGlvbiBtb2RlIHN3aXRjaC4gKi8KKwlnYl9jb250cm9sX21vZGVfc3dpdGNoX2NvbXBsZXRlKGNvbnRyb2wpOworCWdiX2NvbnRyb2xfcHV0KGNvbnRyb2wpOworCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAibW9kZSBzd2l0Y2ggaW50ZXJydXB0ZWRcbiIpOworCQlnb3RvIGVycl9kZWFjdGl2YXRlOworCX0gZWxzZSBpZiAocmV0ID09IDApIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAibW9kZSBzd2l0Y2ggdGltZWQgb3V0XG4iKTsKKwkJZ290byBlcnJfZGVhY3RpdmF0ZTsKKwl9CisKKwkvKiBSZS1lbmFibGUgKHJlLWVudW1lcmF0ZSkgaW50ZXJmYWNlIGlmIHN0aWxsIGFjdGl2ZS4gKi8KKwltdXRleF9sb2NrKCZpbnRmLT5tdXRleCk7CisJaW50Zi0+bW9kZV9zd2l0Y2ggPSBmYWxzZTsKKwlpZiAoaW50Zi0+YWN0aXZlKSB7CisJCXJldCA9IGdiX2ludGVyZmFjZV9lbmFibGUoaW50Zik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJmludGYtPmRldiwgImZhaWxlZCB0byByZS1lbmFibGUgaW50ZXJmYWNlOiAlZFxuIiwKKwkJCQkJcmV0KTsKKwkJCWdiX2ludGVyZmFjZV9kZWFjdGl2YXRlKGludGYpOworCQl9CisJfQorCW11dGV4X3VubG9jaygmaW50Zi0+bXV0ZXgpOworCitvdXRfaW50ZXJmYWNlX3B1dDoKKwlnYl9pbnRlcmZhY2VfcHV0KGludGYpOworCisJcmV0dXJuOworCitlcnJfZGVhY3RpdmF0ZToKKwltdXRleF9sb2NrKCZpbnRmLT5tdXRleCk7CisJaW50Zi0+bW9kZV9zd2l0Y2ggPSBmYWxzZTsKKwlnYl9pbnRlcmZhY2VfZGVhY3RpdmF0ZShpbnRmKTsKKwltdXRleF91bmxvY2soJmludGYtPm11dGV4KTsKKworCWdiX2ludGVyZmFjZV9wdXQoaW50Zik7Cit9CisKK2ludCBnYl9pbnRlcmZhY2VfcmVxdWVzdF9tb2RlX3N3aXRjaChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmaW50Zi0+bXV0ZXgpOworCWlmIChpbnRmLT5tb2RlX3N3aXRjaCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlpbnRmLT5tb2RlX3N3aXRjaCA9IHRydWU7CisJcmVpbml0X2NvbXBsZXRpb24oJmludGYtPm1vZGVfc3dpdGNoX2NvbXBsZXRpb24pOworCisJLyoKKwkgKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGludGVyZmFjZSBkZXZpY2UsIHdoaWNoIHdpbGwgYmUgcHV0IG9uY2UgdGhlCisJICogbW9kZSBzd2l0Y2ggaXMgY29tcGxldGUuCisJICovCisJZ2V0X2RldmljZSgmaW50Zi0+ZGV2KTsKKworCWlmICghcXVldWVfd29yayhzeXN0ZW1fbG9uZ193cSwgJmludGYtPm1vZGVfc3dpdGNoX3dvcmspKSB7CisJCXB1dF9kZXZpY2UoJmludGYtPmRldik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmludGYtPm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9pbnRlcmZhY2VfcmVxdWVzdF9tb2RlX3N3aXRjaCk7CisKKy8qCisgKiBUX1RzdFNyY0luY3JlbWVudCBpcyB3cml0dGVuIGJ5IHRoZSBtb2R1bGUgb24gRVMyIGFzIGEgc3RhbmQtaW4gZm9yIHRoZQorICogaW5pdC1zdGF0dXMgYXR0cmlidXRlIERNRV9UT1NISUJBX0lOSVRfU1RBVFVTLiBUaGUgQVAgbmVlZHMgdG8gcmVhZCBhbmQKKyAqIGNsZWFyIGl0IGFmdGVyIHJlYWRpbmcgYSBub24temVybyB2YWx1ZSBmcm9tIGl0LgorICoKKyAqIEZJWE1FOiBUaGlzIGlzIG1vZHVsZS1oYXJkd2FyZSBkZXBlbmRlbnQgYW5kIG5lZWRzIHRvIGJlIGV4dGVuZGVkIGZvciBldmVyeQorICogdHlwZSBvZiBtb2R1bGUgd2Ugd2FudCB0byBzdXBwb3J0LgorICovCitzdGF0aWMgaW50IGdiX2ludGVyZmFjZV9yZWFkX2FuZF9jbGVhcl9pbml0X3N0YXR1cyhzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSBpbnRmLT5oZDsKKwl1bnNpZ25lZCBsb25nIGJvb3Ryb21fcXVpcmtzOworCXVuc2lnbmVkIGxvbmcgczJsX3F1aXJrczsKKwlpbnQgcmV0OworCXUzMiB2YWx1ZTsKKwl1MTYgYXR0cjsKKwl1OCBpbml0X3N0YXR1czsKKworCS8qCisJICogRVMyIGJyaWRnZXMgdXNlIFRfVHN0U3JjSW5jcmVtZW50IGZvciB0aGUgaW5pdCBzdGF0dXMuCisJICoKKwkgKiBGSVhNRTogUmVtb3ZlIEVTMiBzdXBwb3J0CisJICovCisJaWYgKGludGYtPnF1aXJrcyAmIEdCX0lOVEVSRkFDRV9RVUlSS19OT19JTklUX1NUQVRVUykKKwkJYXR0ciA9IERNRV9UX1RTVF9TUkNfSU5DUkVNRU5UOworCWVsc2UKKwkJYXR0ciA9IERNRV9UT1NISUJBX0dNUF9JTklUX1NUQVRVUzsKKworCXJldCA9IGdiX3N2Y19kbWVfcGVlcl9nZXQoaGQtPnN2YywgaW50Zi0+aW50ZXJmYWNlX2lkLCBhdHRyLAorCQkJCSAgRE1FX1NFTEVDVE9SX0lOREVYX05VTEwsICZ2YWx1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogQSBub256ZXJvIGluaXQgc3RhdHVzIGluZGljYXRlcyB0aGUgbW9kdWxlIGhhcyBmaW5pc2hlZAorCSAqIGluaXRpYWxpemluZy4KKwkgKi8KKwlpZiAoIXZhbHVlKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImludmFsaWQgaW5pdCBzdGF0dXNcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKgorCSAqIEV4dHJhY3QgdGhlIGluaXQgc3RhdHVzLgorCSAqCisJICogRm9yIEVTMjogV2UgbmVlZCB0byBjaGVjayBsb3dlc3QgOCBiaXRzIG9mICd2YWx1ZScuCisJICogRm9yIEVTMzogV2UgbmVlZCB0byBjaGVjayBoaWdoZXN0IDggYml0cyBvdXQgb2YgMzIgb2YgJ3ZhbHVlJy4KKwkgKgorCSAqIEZJWE1FOiBSZW1vdmUgRVMyIHN1cHBvcnQKKwkgKi8KKwlpZiAoaW50Zi0+cXVpcmtzICYgR0JfSU5URVJGQUNFX1FVSVJLX05PX0lOSVRfU1RBVFVTKQorCQlpbml0X3N0YXR1cyA9IHZhbHVlICYgMHhmZjsKKwllbHNlCisJCWluaXRfc3RhdHVzID0gdmFsdWUgPj4gMjQ7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZXhlY3V0aW5nIHRoZSBxdWlya3kgRVMzIGJvb3Ryb20gdGhhdCwKKwkgKiBmb3IgZXhhbXBsZSwgcmVxdWlyZXMgRTJFRkMsIENTRCBhbmQgQ1NWIHRvIGJlIGRpc2FibGVkLgorCSAqLworCWJvb3Ryb21fcXVpcmtzID0gR0JfSU5URVJGQUNFX1FVSVJLX05PX0NQT1JUX0ZFQVRVUkVTIHwKKwkJCQlHQl9JTlRFUkZBQ0VfUVVJUktfRk9SQ0VEX0RJU0FCTEUgfAorCQkJCUdCX0lOVEVSRkFDRV9RVUlSS19MRUdBQ1lfTU9ERV9TV0lUQ0ggfAorCQkJCUdCX0lOVEVSRkFDRV9RVUlSS19OT19CVU5ETEVfQUNUSVZBVEU7CisKKwlzMmxfcXVpcmtzID0gR0JfSU5URVJGQUNFX1FVSVJLX05PX1BNOworCisJc3dpdGNoIChpbml0X3N0YXR1cykgeworCWNhc2UgR0JfSU5JVF9CT09UUk9NX1VOSVBST19CT09UX1NUQVJURUQ6CisJY2FzZSBHQl9JTklUX0JPT1RST01fRkFMTEJBQ0tfVU5JUFJPX0JPT1RfU1RBUlRFRDoKKwkJaW50Zi0+cXVpcmtzIHw9IGJvb3Ryb21fcXVpcmtzOworCQlicmVhazsKKwljYXNlIEdCX0lOSVRfUzJfTE9BREVSX0JPT1RfU1RBUlRFRDoKKwkJLyogUzIgTG9hZGVyIGRvZXNuJ3Qgc3VwcG9ydCBydW50aW1lIFBNICovCisJCWludGYtPnF1aXJrcyAmPSB+Ym9vdHJvbV9xdWlya3M7CisJCWludGYtPnF1aXJrcyB8PSBzMmxfcXVpcmtzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpbnRmLT5xdWlya3MgJj0gfmJvb3Ryb21fcXVpcmtzOworCQlpbnRmLT5xdWlya3MgJj0gfnMybF9xdWlya3M7CisJfQorCisJLyogQ2xlYXIgdGhlIGluaXQgc3RhdHVzLiAqLworCXJldHVybiBnYl9zdmNfZG1lX3BlZXJfc2V0KGhkLT5zdmMsIGludGYtPmludGVyZmFjZV9pZCwgYXR0ciwKKwkJCQkgICBETUVfU0VMRUNUT1JfSU5ERVhfTlVMTCwgMCk7Cit9CisKKy8qIGludGVyZmFjZSBzeXNmcyBhdHRyaWJ1dGVzICovCisjZGVmaW5lIGdiX2ludGVyZmFjZV9hdHRyKGZpZWxkLCB0eXBlKQkJCQkJXAorc3RhdGljIHNzaXplX3QgZmllbGQjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwJCQkJXAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAkJXAorCQkJICAgIGNoYXIgKmJ1ZikJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiA9IHRvX2diX2ludGVyZmFjZShkZXYpOwkJXAorCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsIHR5cGUiXG4iLCBpbnRmLT5maWVsZCk7CVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFJfUk8oZmllbGQpCisKK2diX2ludGVyZmFjZV9hdHRyKGRkYmwxX21hbnVmYWN0dXJlcl9pZCwgIjB4JTA4eCIpOworZ2JfaW50ZXJmYWNlX2F0dHIoZGRibDFfcHJvZHVjdF9pZCwgIjB4JTA4eCIpOworZ2JfaW50ZXJmYWNlX2F0dHIoaW50ZXJmYWNlX2lkLCAiJXUiKTsKK2diX2ludGVyZmFjZV9hdHRyKHZlbmRvcl9pZCwgIjB4JTA4eCIpOworZ2JfaW50ZXJmYWNlX2F0dHIocHJvZHVjdF9pZCwgIjB4JTA4eCIpOworZ2JfaW50ZXJmYWNlX2F0dHIoc2VyaWFsX251bWJlciwgIjB4JTAxNmxseCIpOworCitzdGF0aWMgc3NpemVfdCB2b2x0YWdlX25vd19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSB0b19nYl9pbnRlcmZhY2UoZGV2KTsKKwlpbnQgcmV0OworCXUzMiBtZWFzdXJlbWVudDsKKworCXJldCA9IGdiX3N2Y19wd3Jtb25faW50Zl9zYW1wbGVfZ2V0KGludGYtPmhkLT5zdmMsIGludGYtPmludGVyZmFjZV9pZCwKKwkJCQkJICAgIEdCX1NWQ19QV1JNT05fVFlQRV9WT0wsCisJCQkJCSAgICAmbWVhc3VyZW1lbnQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiZmFpbGVkIHRvIGdldCB2b2x0YWdlIHNhbXBsZSAoJWQpXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBtZWFzdXJlbWVudCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUk8odm9sdGFnZV9ub3cpOworCitzdGF0aWMgc3NpemVfdCBjdXJyZW50X25vd19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSB0b19nYl9pbnRlcmZhY2UoZGV2KTsKKwlpbnQgcmV0OworCXUzMiBtZWFzdXJlbWVudDsKKworCXJldCA9IGdiX3N2Y19wd3Jtb25faW50Zl9zYW1wbGVfZ2V0KGludGYtPmhkLT5zdmMsIGludGYtPmludGVyZmFjZV9pZCwKKwkJCQkJICAgIEdCX1NWQ19QV1JNT05fVFlQRV9DVVJSLAorCQkJCQkgICAgJm1lYXN1cmVtZW50KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImZhaWxlZCB0byBnZXQgY3VycmVudCBzYW1wbGUgKCVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgbWVhc3VyZW1lbnQpOworfQorc3RhdGljIERFVklDRV9BVFRSX1JPKGN1cnJlbnRfbm93KTsKKworc3RhdGljIHNzaXplX3QgcG93ZXJfbm93X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gdG9fZ2JfaW50ZXJmYWNlKGRldik7CisJaW50IHJldDsKKwl1MzIgbWVhc3VyZW1lbnQ7CisKKwlyZXQgPSBnYl9zdmNfcHdybW9uX2ludGZfc2FtcGxlX2dldChpbnRmLT5oZC0+c3ZjLCBpbnRmLT5pbnRlcmZhY2VfaWQsCisJCQkJCSAgICBHQl9TVkNfUFdSTU9OX1RZUEVfUFdSLAorCQkJCQkgICAgJm1lYXN1cmVtZW50KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImZhaWxlZCB0byBnZXQgcG93ZXIgc2FtcGxlICglZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIG1lYXN1cmVtZW50KTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwb3dlcl9ub3cpOworCitzdGF0aWMgc3NpemVfdCBwb3dlcl9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSB0b19nYl9pbnRlcmZhY2UoZGV2KTsKKworCWlmIChpbnRmLT5hY3RpdmUpCisJCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJvblxuIik7CisJZWxzZQorCQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAib2ZmXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgcG93ZXJfc3RhdGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAorCQkJCSBzaXplX3QgbGVuKQoreworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSB0b19nYl9pbnRlcmZhY2UoZGV2KTsKKwlib29sIGFjdGl2YXRlOworCWludCByZXQgPSAwOworCisJaWYgKGtzdHJ0b2Jvb2woYnVmLCAmYWN0aXZhdGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmludGYtPm11dGV4KTsKKworCWlmIChhY3RpdmF0ZSA9PSBpbnRmLT5hY3RpdmUpCisJCWdvdG8gdW5sb2NrOworCisJaWYgKGFjdGl2YXRlKSB7CisJCXJldCA9IGdiX2ludGVyZmFjZV9hY3RpdmF0ZShpbnRmKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gYWN0aXZhdGUgaW50ZXJmYWNlOiAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisKKwkJcmV0ID0gZ2JfaW50ZXJmYWNlX2VuYWJsZShpbnRmKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gZW5hYmxlIGludGVyZmFjZTogJWRcbiIsIHJldCk7CisJCQlnYl9pbnRlcmZhY2VfZGVhY3RpdmF0ZShpbnRmKTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisJfSBlbHNlIHsKKwkJZ2JfaW50ZXJmYWNlX2Rpc2FibGUoaW50Zik7CisJCWdiX2ludGVyZmFjZV9kZWFjdGl2YXRlKGludGYpOworCX0KKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmaW50Zi0+bXV0ZXgpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBsZW47Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUlcocG93ZXJfc3RhdGUpOworCitzdGF0aWMgY29uc3QgY2hhciAqZ2JfaW50ZXJmYWNlX3R5cGVfc3RyaW5nKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0geworCQlbR0JfSU5URVJGQUNFX1RZUEVfSU5WQUxJRF0gPSAiaW52YWxpZCIsCisJCVtHQl9JTlRFUkZBQ0VfVFlQRV9VTktOT1dOXSA9ICJ1bmtub3duIiwKKwkJW0dCX0lOVEVSRkFDRV9UWVBFX0RVTU1ZXSA9ICJkdW1teSIsCisJCVtHQl9JTlRFUkZBQ0VfVFlQRV9VTklQUk9dID0gInVuaXBybyIsCisJCVtHQl9JTlRFUkZBQ0VfVFlQRV9HUkVZQlVTXSA9ICJncmV5YnVzIiwKKwl9OworCisJcmV0dXJuIHR5cGVzW2ludGYtPnR5cGVdOworfQorCitzdGF0aWMgc3NpemVfdCBpbnRlcmZhY2VfdHlwZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSB0b19nYl9pbnRlcmZhY2UoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBnYl9pbnRlcmZhY2VfdHlwZV9zdHJpbmcoaW50ZikpOworfQorc3RhdGljIERFVklDRV9BVFRSX1JPKGludGVyZmFjZV90eXBlKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmludGVyZmFjZV91bmlwcm9fYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfZGRibDFfbWFudWZhY3R1cmVyX2lkLmF0dHIsCisJJmRldl9hdHRyX2RkYmwxX3Byb2R1Y3RfaWQuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaW50ZXJmYWNlX2dyZXlidXNfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfdmVuZG9yX2lkLmF0dHIsCisJJmRldl9hdHRyX3Byb2R1Y3RfaWQuYXR0ciwKKwkmZGV2X2F0dHJfc2VyaWFsX251bWJlci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppbnRlcmZhY2VfcG93ZXJfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfdm9sdGFnZV9ub3cuYXR0ciwKKwkmZGV2X2F0dHJfY3VycmVudF9ub3cuYXR0ciwKKwkmZGV2X2F0dHJfcG93ZXJfbm93LmF0dHIsCisJJmRldl9hdHRyX3Bvd2VyX3N0YXRlLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmludGVyZmFjZV9jb21tb25fYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfaW50ZXJmYWNlX2lkLmF0dHIsCisJJmRldl9hdHRyX2ludGVyZmFjZV90eXBlLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHVtb2RlX3QgaW50ZXJmYWNlX3VuaXByb19pc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgaW50IG4pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSB0b19nYl9pbnRlcmZhY2UoZGV2KTsKKworCXN3aXRjaCAoaW50Zi0+dHlwZSkgeworCWNhc2UgR0JfSU5URVJGQUNFX1RZUEVfVU5JUFJPOgorCWNhc2UgR0JfSU5URVJGQUNFX1RZUEVfR1JFWUJVUzoKKwkJcmV0dXJuIGF0dHItPm1vZGU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdW1vZGVfdCBpbnRlcmZhY2VfZ3JleWJ1c19pc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgaW50IG4pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSB0b19nYl9pbnRlcmZhY2UoZGV2KTsKKworCXN3aXRjaCAoaW50Zi0+dHlwZSkgeworCWNhc2UgR0JfSU5URVJGQUNFX1RZUEVfR1JFWUJVUzoKKwkJcmV0dXJuIGF0dHItPm1vZGU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdW1vZGVfdCBpbnRlcmZhY2VfcG93ZXJfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGludCBuKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gdG9fZ2JfaW50ZXJmYWNlKGRldik7CisKKwlzd2l0Y2ggKGludGYtPnR5cGUpIHsKKwljYXNlIEdCX0lOVEVSRkFDRV9UWVBFX1VOSVBSTzoKKwljYXNlIEdCX0lOVEVSRkFDRV9UWVBFX0dSRVlCVVM6CisJCXJldHVybiBhdHRyLT5tb2RlOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaW50ZXJmYWNlX3VuaXByb19ncm91cCA9IHsKKwkuaXNfdmlzaWJsZQk9IGludGVyZmFjZV91bmlwcm9faXNfdmlzaWJsZSwKKwkuYXR0cnMJCT0gaW50ZXJmYWNlX3VuaXByb19hdHRycywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGludGVyZmFjZV9ncmV5YnVzX2dyb3VwID0geworCS5pc192aXNpYmxlCT0gaW50ZXJmYWNlX2dyZXlidXNfaXNfdmlzaWJsZSwKKwkuYXR0cnMJCT0gaW50ZXJmYWNlX2dyZXlidXNfYXR0cnMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpbnRlcmZhY2VfcG93ZXJfZ3JvdXAgPSB7CisJLmlzX3Zpc2libGUJPSBpbnRlcmZhY2VfcG93ZXJfaXNfdmlzaWJsZSwKKwkuYXR0cnMJCT0gaW50ZXJmYWNlX3Bvd2VyX2F0dHJzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaW50ZXJmYWNlX2NvbW1vbl9ncm91cCA9IHsKKwkuYXR0cnMJCT0gaW50ZXJmYWNlX2NvbW1vbl9hdHRycywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICppbnRlcmZhY2VfZ3JvdXBzW10gPSB7CisJJmludGVyZmFjZV91bmlwcm9fZ3JvdXAsCisJJmludGVyZmFjZV9ncmV5YnVzX2dyb3VwLAorCSZpbnRlcmZhY2VfcG93ZXJfZ3JvdXAsCisJJmludGVyZmFjZV9jb21tb25fZ3JvdXAsCisJTlVMTAorfTsKKworc3RhdGljIHZvaWQgZ2JfaW50ZXJmYWNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSB0b19nYl9pbnRlcmZhY2UoZGV2KTsKKworCXRyYWNlX2diX2ludGVyZmFjZV9yZWxlYXNlKGludGYpOworCisJa2ZyZWUoaW50Zik7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgZ2JfaW50ZXJmYWNlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSB0b19nYl9pbnRlcmZhY2UoZGV2KTsKKwlpbnQgcmV0LCB0aW1lc3luY19yZXQ7CisKKwlyZXQgPSBnYl9jb250cm9sX2ludGVyZmFjZV9zdXNwZW5kX3ByZXBhcmUoaW50Zi0+Y29udHJvbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWdiX3RpbWVzeW5jX2ludGVyZmFjZV9yZW1vdmUoaW50Zik7CisKKwlyZXQgPSBnYl9jb250cm9sX3N1c3BlbmQoaW50Zi0+Y29udHJvbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfaGliZXJuYXRlX2Fib3J0OworCisJcmV0ID0gZ2JfaW50ZXJmYWNlX2hpYmVybmF0ZV9saW5rKGludGYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBEZWxheSB0byBhbGxvdyBpbnRlcmZhY2UgdG8gZW50ZXIgc3RhbmRieSBiZWZvcmUgZGlzYWJsaW5nIHJlZmNsayAqLworCW1zbGVlcChHQl9JTlRFUkZBQ0VfU1VTUEVORF9ISUJFUk5BVEVfREVMQVlfTVMpOworCisJcmV0ID0gZ2JfaW50ZXJmYWNlX3JlZmNsa19zZXQoaW50ZiwgZmFsc2UpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKKworZXJyX2hpYmVybmF0ZV9hYm9ydDoKKwlnYl9jb250cm9sX2ludGVyZmFjZV9oaWJlcm5hdGVfYWJvcnQoaW50Zi0+Y29udHJvbCk7CisKKwl0aW1lc3luY19yZXQgPSBnYl90aW1lc3luY19pbnRlcmZhY2VfYWRkKGludGYpOworCWlmICh0aW1lc3luY19yZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWRkIHRvIHRpbWVzeW5jOiAlZFxuIiwgdGltZXN5bmNfcmV0KTsKKwkJcmV0dXJuIHRpbWVzeW5jX3JldDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2ludGVyZmFjZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSB0b19nYl9pbnRlcmZhY2UoZGV2KTsKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBpbnRmLT5oZC0+c3ZjOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9pbnRlcmZhY2VfcmVmY2xrX3NldChpbnRmLCB0cnVlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2Jfc3ZjX2ludGZfcmVzdW1lKHN2YywgaW50Zi0+aW50ZXJmYWNlX2lkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2JfY29udHJvbF9yZXN1bWUoaW50Zi0+Y29udHJvbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdiX3RpbWVzeW5jX2ludGVyZmFjZV9hZGQoaW50Zik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhZGQgdG8gdGltZXN5bmM6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGdiX3RpbWVzeW5jX3NjaGVkdWxlX3N5bmNocm9ub3VzKGludGYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc3luY2hyb25pemUgRnJhbWVUaW1lOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9pbnRlcmZhY2VfcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGRldik7CisJcG1fcmVxdWVzdF9hdXRvc3VzcGVuZChkZXYpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGdiX2ludGVyZmFjZV9wbV9vcHMgPSB7CisJU0VUX1JVTlRJTUVfUE1fT1BTKGdiX2ludGVyZmFjZV9zdXNwZW5kLCBnYl9pbnRlcmZhY2VfcmVzdW1lLAorCQkJICAgZ2JfaW50ZXJmYWNlX3J1bnRpbWVfaWRsZSkKK307CisKK3N0cnVjdCBkZXZpY2VfdHlwZSBncmV5YnVzX2ludGVyZmFjZV90eXBlID0geworCS5uYW1lID0JCSJncmV5YnVzX2ludGVyZmFjZSIsCisJLnJlbGVhc2UgPQlnYl9pbnRlcmZhY2VfcmVsZWFzZSwKKwkucG0gPQkJJmdiX2ludGVyZmFjZV9wbV9vcHMsCit9OworCisvKgorICogQSBHcmV5YnVzIG1vZHVsZSByZXByZXNlbnRzIGEgdXNlci1yZXBsYWNlYWJsZSBjb21wb25lbnQgb24gYSBHTVAKKyAqIHBob25lLiAgQW4gaW50ZXJmYWNlIGlzIHRoZSBwaHlzaWNhbCBjb25uZWN0aW9uIG9uIHRoYXQgbW9kdWxlLiAgQQorICogbW9kdWxlIG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgaW50ZXJmYWNlLgorICoKKyAqIENyZWF0ZSBhIGdiX2ludGVyZmFjZSBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IGEgZGlzY292ZXJlZCBpbnRlcmZhY2UuCisgKiBUaGUgcG9zaXRpb24gb2YgaW50ZXJmYWNlIHdpdGhpbiB0aGUgRW5kbyBpcyBlbmNvZGVkIGluICJpbnRlcmZhY2VfaWQiCisgKiBhcmd1bWVudC4KKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV3IGludGVyZmNlIG9yIGEgbnVsbCBwb2ludGVyIGlmIGEKKyAqIGZhaWx1cmUgb2NjdXJzIGR1ZSB0byBtZW1vcnkgZXhoYXVzdGlvbi4KKyAqLworc3RydWN0IGdiX2ludGVyZmFjZSAqZ2JfaW50ZXJmYWNlX2NyZWF0ZShzdHJ1Y3QgZ2JfbW9kdWxlICptb2R1bGUsCisJCQkJCSB1OCBpbnRlcmZhY2VfaWQpCit7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCA9IG1vZHVsZS0+aGQ7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZjsKKworCWludGYgPSBremFsbG9jKHNpemVvZigqaW50ZiksIEdGUF9LRVJORUwpOworCWlmICghaW50ZikKKwkJcmV0dXJuIE5VTEw7CisKKwlpbnRmLT5oZCA9IGhkOwkJLyogWFhYIHJlZmNvdW50PyAqLworCWludGYtPm1vZHVsZSA9IG1vZHVsZTsKKwlpbnRmLT5pbnRlcmZhY2VfaWQgPSBpbnRlcmZhY2VfaWQ7CisJSU5JVF9MSVNUX0hFQUQoJmludGYtPmJ1bmRsZXMpOworCUlOSVRfTElTVF9IRUFEKCZpbnRmLT5tYW5pZmVzdF9kZXNjcyk7CisJbXV0ZXhfaW5pdCgmaW50Zi0+bXV0ZXgpOworCUlOSVRfV09SSygmaW50Zi0+bW9kZV9zd2l0Y2hfd29yaywgZ2JfaW50ZXJmYWNlX21vZGVfc3dpdGNoX3dvcmspOworCWluaXRfY29tcGxldGlvbigmaW50Zi0+bW9kZV9zd2l0Y2hfY29tcGxldGlvbik7CisKKwkvKiBJbnZhbGlkIGRldmljZSBpZCB0byBzdGFydCB3aXRoICovCisJaW50Zi0+ZGV2aWNlX2lkID0gR0JfSU5URVJGQUNFX0RFVklDRV9JRF9CQUQ7CisKKwlpbnRmLT5kZXYucGFyZW50ID0gJm1vZHVsZS0+ZGV2OworCWludGYtPmRldi5idXMgPSAmZ3JleWJ1c19idXNfdHlwZTsKKwlpbnRmLT5kZXYudHlwZSA9ICZncmV5YnVzX2ludGVyZmFjZV90eXBlOworCWludGYtPmRldi5ncm91cHMgPSBpbnRlcmZhY2VfZ3JvdXBzOworCWludGYtPmRldi5kbWFfbWFzayA9IG1vZHVsZS0+ZGV2LmRtYV9tYXNrOworCWRldmljZV9pbml0aWFsaXplKCZpbnRmLT5kZXYpOworCWRldl9zZXRfbmFtZSgmaW50Zi0+ZGV2LCAiJXMuJXUiLCBkZXZfbmFtZSgmbW9kdWxlLT5kZXYpLAorCQkJaW50ZXJmYWNlX2lkKTsKKworCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KCZpbnRmLT5kZXYsCisJCQkJCSBHQl9JTlRFUkZBQ0VfQVVUT1NVU1BFTkRfTVMpOworCisJdHJhY2VfZ2JfaW50ZXJmYWNlX2NyZWF0ZShpbnRmKTsKKworCXJldHVybiBpbnRmOworfQorCitzdGF0aWMgaW50IGdiX2ludGVyZmFjZV92c3lzX3NldChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBpbnRmLT5oZC0+c3ZjOworCWludCByZXQ7CisKKwlkZXZfZGJnKCZpbnRmLT5kZXYsICIlcyAtICVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKKworCXJldCA9IGdiX3N2Y19pbnRmX3ZzeXNfc2V0KHN2YywgaW50Zi0+aW50ZXJmYWNlX2lkLCBlbmFibGUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiZmFpbGVkIHRvIHNldCB2X3N5czogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfaW50ZXJmYWNlX3JlZmNsa19zZXQoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiwgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gaW50Zi0+aGQtPnN2YzsKKwlpbnQgcmV0OworCisJZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXMgLSAlZFxuIiwgX19mdW5jX18sIGVuYWJsZSk7CisKKwlyZXQgPSBnYl9zdmNfaW50Zl9yZWZjbGtfc2V0KHN2YywgaW50Zi0+aW50ZXJmYWNlX2lkLCBlbmFibGUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiZmFpbGVkIHRvIHNldCByZWZjbGs6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2ludGVyZmFjZV91bmlwcm9fc2V0KHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IGludGYtPmhkLT5zdmM7CisJaW50IHJldDsKKworCWRldl9kYmcoJmludGYtPmRldiwgIiVzIC0gJWRcbiIsIF9fZnVuY19fLCBlbmFibGUpOworCisJcmV0ID0gZ2Jfc3ZjX2ludGZfdW5pcHJvX3NldChzdmMsIGludGYtPmludGVyZmFjZV9pZCwgZW5hYmxlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImZhaWxlZCB0byBzZXQgVW5pUHJvOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9pbnRlcmZhY2VfYWN0aXZhdGVfb3BlcmF0aW9uKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYsCisJCQkJCSAgIGVudW0gZ2JfaW50ZXJmYWNlX3R5cGUgKmludGZfdHlwZSkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBpbnRmLT5oZC0+c3ZjOworCXU4IHR5cGU7CisJaW50IHJldDsKKworCWRldl9kYmcoJmludGYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXQgPSBnYl9zdmNfaW50Zl9hY3RpdmF0ZShzdmMsIGludGYtPmludGVyZmFjZV9pZCwgJnR5cGUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiZmFpbGVkIHRvIGFjdGl2YXRlOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdCX1NWQ19JTlRGX1RZUEVfRFVNTVk6CisJCSppbnRmX3R5cGUgPSBHQl9JTlRFUkZBQ0VfVFlQRV9EVU1NWTsKKwkJLyogRklYTUU6IGhhbmRsZSBhcyBhbiBlcnJvciBmb3Igbm93ICovCisJCXJldHVybiAtRU5PREVWOworCWNhc2UgR0JfU1ZDX0lOVEZfVFlQRV9VTklQUk86CisJCSppbnRmX3R5cGUgPSBHQl9JTlRFUkZBQ0VfVFlQRV9VTklQUk87CisJCWRldl9lcnIoJmludGYtPmRldiwgImludGVyZmFjZSB0eXBlIFVuaVBybyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJLyogRklYTUU6IGhhbmRsZSBhcyBhbiBlcnJvciBmb3Igbm93ICovCisJCXJldHVybiAtRU5PREVWOworCWNhc2UgR0JfU1ZDX0lOVEZfVFlQRV9HUkVZQlVTOgorCQkqaW50Zl90eXBlID0gR0JfSU5URVJGQUNFX1RZUEVfR1JFWUJVUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAidW5rbm93biBpbnRlcmZhY2UgdHlwZTogJXVcbiIsIHR5cGUpOworCQkqaW50Zl90eXBlID0gR0JfSU5URVJGQUNFX1RZUEVfVU5LTk9XTjsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfaW50ZXJmYWNlX2hpYmVybmF0ZV9saW5rKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gaW50Zi0+aGQtPnN2YzsKKworCXJldHVybiBnYl9zdmNfaW50Zl9zZXRfcG93ZXJfbW9kZV9oaWJlcm5hdGUoc3ZjLCBpbnRmLT5pbnRlcmZhY2VfaWQpOworfQorCitzdGF0aWMgaW50IF9nYl9pbnRlcmZhY2VfYWN0aXZhdGUoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQkgIGVudW0gZ2JfaW50ZXJmYWNlX3R5cGUgKnR5cGUpCit7CisJaW50IHJldDsKKworCSp0eXBlID0gR0JfSU5URVJGQUNFX1RZUEVfVU5LTk9XTjsKKworCWlmIChpbnRmLT5lamVjdGVkIHx8IGludGYtPnJlbW92ZWQpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gZ2JfaW50ZXJmYWNlX3ZzeXNfc2V0KGludGYsIHRydWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9pbnRlcmZhY2VfcmVmY2xrX3NldChpbnRmLCB0cnVlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl92c3lzX2Rpc2FibGU7CisKKwlyZXQgPSBnYl9pbnRlcmZhY2VfdW5pcHJvX3NldChpbnRmLCB0cnVlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZWZjbGtfZGlzYWJsZTsKKworCXJldCA9IGdiX2ludGVyZmFjZV9hY3RpdmF0ZV9vcGVyYXRpb24oaW50ZiwgdHlwZSk7CisJaWYgKHJldCkgeworCQlzd2l0Y2ggKCp0eXBlKSB7CisJCWNhc2UgR0JfSU5URVJGQUNFX1RZUEVfVU5JUFJPOgorCQljYXNlIEdCX0lOVEVSRkFDRV9UWVBFX0dSRVlCVVM6CisJCQlnb3RvIGVycl9oaWJlcm5hdGVfbGluazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZXJyX3VuaXByb19kaXNhYmxlOworCQl9CisJfQorCisJcmV0ID0gZ2JfaW50ZXJmYWNlX3JlYWRfZG1lKGludGYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2hpYmVybmF0ZV9saW5rOworCisJcmV0ID0gZ2JfaW50ZXJmYWNlX3JvdXRlX2NyZWF0ZShpbnRmKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9oaWJlcm5hdGVfbGluazsKKworCWludGYtPmFjdGl2ZSA9IHRydWU7CisKKwl0cmFjZV9nYl9pbnRlcmZhY2VfYWN0aXZhdGUoaW50Zik7CisKKwlyZXR1cm4gMDsKKworZXJyX2hpYmVybmF0ZV9saW5rOgorCWdiX2ludGVyZmFjZV9oaWJlcm5hdGVfbGluayhpbnRmKTsKK2Vycl91bmlwcm9fZGlzYWJsZToKKwlnYl9pbnRlcmZhY2VfdW5pcHJvX3NldChpbnRmLCBmYWxzZSk7CitlcnJfcmVmY2xrX2Rpc2FibGU6CisJZ2JfaW50ZXJmYWNlX3JlZmNsa19zZXQoaW50ZiwgZmFsc2UpOworZXJyX3ZzeXNfZGlzYWJsZToKKwlnYl9pbnRlcmZhY2VfdnN5c19zZXQoaW50ZiwgZmFsc2UpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEF0IHByZXNlbnQsIHdlIGFzc3VtZSBhIFVuaVByby1vbmx5IG1vZHVsZSB0byBiZSBhIEdyZXlidXMgbW9kdWxlIHRoYXQKKyAqIGZhaWxlZCB0byBzZW5kIGl0cyBtYWlsYm94IHBva2UuIFRoZXJlIGlzIHNvbWUgcmVhc29uIHRvIGJlbGlldmUgdGhhdCB0aGlzCisgKiBpcyBiZWNhdXNlIG9mIGEgYnVnIGluIHRoZSBFUzMgYm9vdHJvbS4KKyAqCisgKiBGSVhNRTogQ2hlY2sgaWYgdGhpcyBpcyBhIFRvc2hpYmEgYnJpZGdlIGJlZm9yZSByZXRyeWluZz8KKyAqLworc3RhdGljIGludCBfZ2JfaW50ZXJmYWNlX2FjdGl2YXRlX2VzM19oYWNrKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYsCisJCQkJCSAgIGVudW0gZ2JfaW50ZXJmYWNlX3R5cGUgKnR5cGUpCit7CisJaW50IHJldHJpZXMgPSAzOworCWludCByZXQ7CisKKwl3aGlsZSAocmV0cmllcy0tKSB7CisJCXJldCA9IF9nYl9pbnRlcmZhY2VfYWN0aXZhdGUoaW50ZiwgdHlwZSk7CisJCWlmIChyZXQgPT0gLUVOT0RFViAmJiAqdHlwZSA9PSBHQl9JTlRFUkZBQ0VfVFlQRV9VTklQUk8pCisJCQljb250aW51ZTsKKworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQWN0aXZhdGUgYW4gaW50ZXJmYWNlLgorICoKKyAqIExvY2tpbmc6IENhbGxlciBob2xkcyB0aGUgaW50ZXJmYWNlIG11dGV4LgorICovCitpbnQgZ2JfaW50ZXJmYWNlX2FjdGl2YXRlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpCit7CisJZW51bSBnYl9pbnRlcmZhY2VfdHlwZSB0eXBlOworCWludCByZXQ7CisKKwlzd2l0Y2ggKGludGYtPnR5cGUpIHsKKwljYXNlIEdCX0lOVEVSRkFDRV9UWVBFX0lOVkFMSUQ6CisJY2FzZSBHQl9JTlRFUkZBQ0VfVFlQRV9HUkVZQlVTOgorCQlyZXQgPSBfZ2JfaW50ZXJmYWNlX2FjdGl2YXRlX2VzM19oYWNrKGludGYsICZ0eXBlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gX2diX2ludGVyZmFjZV9hY3RpdmF0ZShpbnRmLCAmdHlwZSk7CisJfQorCisJLyogTWFrZSBzdXJlIHR5cGUgaXMgZGV0ZWN0ZWQgY29ycmVjdGx5IGR1cmluZyByZWFjdGl2YXRpb24uICovCisJaWYgKGludGYtPnR5cGUgIT0gR0JfSU5URVJGQUNFX1RZUEVfSU5WQUxJRCkgeworCQlpZiAodHlwZSAhPSBpbnRmLT50eXBlKSB7CisJCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJmYWlsZWQgdG8gZGV0ZWN0IGludGVyZmFjZSB0eXBlXG4iKTsKKworCQkJaWYgKCFyZXQpCisJCQkJZ2JfaW50ZXJmYWNlX2RlYWN0aXZhdGUoaW50Zik7CisKKwkJCXJldHVybiAtRUlPOworCQl9CisJfSBlbHNlIHsKKwkJaW50Zi0+dHlwZSA9IHR5cGU7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIERlYWN0aXZhdGUgYW4gaW50ZXJmYWNlLgorICoKKyAqIExvY2tpbmc6IENhbGxlciBob2xkcyB0aGUgaW50ZXJmYWNlIG11dGV4LgorICovCit2b2lkIGdiX2ludGVyZmFjZV9kZWFjdGl2YXRlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpCit7CisJaWYgKCFpbnRmLT5hY3RpdmUpCisJCXJldHVybjsKKworCXRyYWNlX2diX2ludGVyZmFjZV9kZWFjdGl2YXRlKGludGYpOworCisJLyogQWJvcnQgYW55IG9uZ29pbmcgbW9kZSBzd2l0Y2guICovCisJaWYgKGludGYtPm1vZGVfc3dpdGNoKQorCQljb21wbGV0ZSgmaW50Zi0+bW9kZV9zd2l0Y2hfY29tcGxldGlvbik7CisKKwlnYl9pbnRlcmZhY2Vfcm91dGVfZGVzdHJveShpbnRmKTsKKwlnYl9pbnRlcmZhY2VfaGliZXJuYXRlX2xpbmsoaW50Zik7CisJZ2JfaW50ZXJmYWNlX3VuaXByb19zZXQoaW50ZiwgZmFsc2UpOworCWdiX2ludGVyZmFjZV9yZWZjbGtfc2V0KGludGYsIGZhbHNlKTsKKwlnYl9pbnRlcmZhY2VfdnN5c19zZXQoaW50ZiwgZmFsc2UpOworCisJaW50Zi0+YWN0aXZlID0gZmFsc2U7Cit9CisKKy8qCisgKiBFbmFibGUgYW4gaW50ZXJmYWNlIGJ5IGVuYWJsaW5nIGl0cyBjb250cm9sIGNvbm5lY3Rpb24sIGZldGNoaW5nIHRoZQorICogbWFuaWZlc3QgYW5kIG90aGVyIGluZm9ybWF0aW9uIG92ZXIgaXQsIGFuZCBmaW5hbGx5IHJlZ2lzdGVyaW5nIGl0cyBjaGlsZAorICogZGV2aWNlcy4KKyAqCisgKiBMb2NraW5nOiBDYWxsZXIgaG9sZHMgdGhlIGludGVyZmFjZSBtdXRleC4KKyAqLworaW50IGdiX2ludGVyZmFjZV9lbmFibGUoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbDsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsICp0bXA7CisJaW50IHJldCwgc2l6ZTsKKwl2b2lkICptYW5pZmVzdDsKKworCXJldCA9IGdiX2ludGVyZmFjZV9yZWFkX2FuZF9jbGVhcl9pbml0X3N0YXR1cyhpbnRmKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImZhaWxlZCB0byBjbGVhciBpbml0IHN0YXR1czogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogRXN0YWJsaXNoIGNvbnRyb2wgY29ubmVjdGlvbiAqLworCWNvbnRyb2wgPSBnYl9jb250cm9sX2NyZWF0ZShpbnRmKTsKKwlpZiAoSVNfRVJSKGNvbnRyb2wpKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgY29udHJvbCBkZXZpY2U6ICVsZFxuIiwKKwkJCQlQVFJfRVJSKGNvbnRyb2wpKTsKKwkJcmV0dXJuIFBUUl9FUlIoY29udHJvbCk7CisJfQorCWludGYtPmNvbnRyb2wgPSBjb250cm9sOworCisJcmV0ID0gZ2JfY29udHJvbF9lbmFibGUoaW50Zi0+Y29udHJvbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcHV0X2NvbnRyb2w7CisKKwkvKiBHZXQgbWFuaWZlc3Qgc2l6ZSB1c2luZyBjb250cm9sIHByb3RvY29sIG9uIENQb3J0ICovCisJc2l6ZSA9IGdiX2NvbnRyb2xfZ2V0X21hbmlmZXN0X3NpemVfb3BlcmF0aW9uKGludGYpOworCWlmIChzaXplIDw9IDApIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBtYW5pZmVzdCBzaXplOiAlZFxuIiwgc2l6ZSk7CisKKwkJaWYgKHNpemUpCisJCQlyZXQgPSBzaXplOworCQllbHNlCisJCQlyZXQgPSAgLUVJTlZBTDsKKworCQlnb3RvIGVycl9kaXNhYmxlX2NvbnRyb2w7CisJfQorCisJbWFuaWZlc3QgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghbWFuaWZlc3QpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfZGlzYWJsZV9jb250cm9sOworCX0KKworCS8qIEdldCBtYW5pZmVzdCB1c2luZyBjb250cm9sIHByb3RvY29sIG9uIENQb3J0ICovCisJcmV0ID0gZ2JfY29udHJvbF9nZXRfbWFuaWZlc3Rfb3BlcmF0aW9uKGludGYsIG1hbmlmZXN0LCBzaXplKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImZhaWxlZCB0byBnZXQgbWFuaWZlc3Q6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9mcmVlX21hbmlmZXN0OworCX0KKworCS8qCisJICogUGFyc2UgdGhlIG1hbmlmZXN0IGFuZCBidWlsZCB1cCBvdXIgZGF0YSBzdHJ1Y3R1cmVzIHJlcHJlc2VudGluZworCSAqIHdoYXQncyBpbiBpdC4KKwkgKi8KKwlpZiAoIWdiX21hbmlmZXN0X3BhcnNlKGludGYsIG1hbmlmZXN0LCBzaXplKSkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJmYWlsZWQgdG8gcGFyc2UgbWFuaWZlc3RcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9kZXN0cm95X2J1bmRsZXM7CisJfQorCisJcmV0ID0gZ2JfY29udHJvbF9nZXRfYnVuZGxlX3ZlcnNpb25zKGludGYtPmNvbnRyb2wpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Rlc3Ryb3lfYnVuZGxlczsKKworCXJldCA9IGdiX3RpbWVzeW5jX2ludGVyZmFjZV9hZGQoaW50Zik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJmYWlsZWQgdG8gYWRkIHRvIHRpbWVzeW5jOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZGVzdHJveV9idW5kbGVzOworCX0KKworCS8qIFJlZ2lzdGVyIHRoZSBjb250cm9sIGRldmljZSBhbmQgYW55IGJ1bmRsZXMgKi8KKwlyZXQgPSBnYl9jb250cm9sX2FkZChpbnRmLT5jb250cm9sKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZW1vdmVfdGltZXN5bmM7CisKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZCgmaW50Zi0+ZGV2KTsKKwlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZSgmaW50Zi0+ZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoJmludGYtPmRldik7CisJcG1fcnVudGltZV9lbmFibGUoJmludGYtPmRldik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZShidW5kbGUsIHRtcCwgJmludGYtPmJ1bmRsZXMsIGxpbmtzKSB7CisJCXJldCA9IGdiX2J1bmRsZV9hZGQoYnVuZGxlKTsKKwkJaWYgKHJldCkgeworCQkJZ2JfYnVuZGxlX2Rlc3Ryb3koYnVuZGxlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJa2ZyZWUobWFuaWZlc3QpOworCisJaW50Zi0+ZW5hYmxlZCA9IHRydWU7CisKKwlwbV9ydW50aW1lX3B1dCgmaW50Zi0+ZGV2KTsKKworCXRyYWNlX2diX2ludGVyZmFjZV9lbmFibGUoaW50Zik7CisKKwlyZXR1cm4gMDsKKworZXJyX3JlbW92ZV90aW1lc3luYzoKKwlnYl90aW1lc3luY19pbnRlcmZhY2VfcmVtb3ZlKGludGYpOworZXJyX2Rlc3Ryb3lfYnVuZGxlczoKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnVuZGxlLCB0bXAsICZpbnRmLT5idW5kbGVzLCBsaW5rcykKKwkJZ2JfYnVuZGxlX2Rlc3Ryb3koYnVuZGxlKTsKK2Vycl9mcmVlX21hbmlmZXN0OgorCWtmcmVlKG1hbmlmZXN0KTsKK2Vycl9kaXNhYmxlX2NvbnRyb2w6CisJZ2JfY29udHJvbF9kaXNhYmxlKGludGYtPmNvbnRyb2wpOworZXJyX3B1dF9jb250cm9sOgorCWdiX2NvbnRyb2xfcHV0KGludGYtPmNvbnRyb2wpOworCWludGYtPmNvbnRyb2wgPSBOVUxMOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIERpc2FibGUgYW4gaW50ZXJmYWNlIGFuZCBkZXN0cm95IGl0cyBidW5kbGVzLgorICoKKyAqIExvY2tpbmc6IENhbGxlciBob2xkcyB0aGUgaW50ZXJmYWNlIG11dGV4LgorICovCit2b2lkIGdiX2ludGVyZmFjZV9kaXNhYmxlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlOworCXN0cnVjdCBnYl9idW5kbGUgKm5leHQ7CisKKwlpZiAoIWludGYtPmVuYWJsZWQpCisJCXJldHVybjsKKworCXRyYWNlX2diX2ludGVyZmFjZV9kaXNhYmxlKGludGYpOworCisJcG1fcnVudGltZV9nZXRfc3luYygmaW50Zi0+ZGV2KTsKKworCS8qIFNldCBkaXNjb25uZWN0ZWQgZmxhZyB0byBhdm9pZCBJL08gZHVyaW5nIGNvbm5lY3Rpb24gdGVhciBkb3duLiAqLworCWlmIChpbnRmLT5xdWlya3MgJiBHQl9JTlRFUkZBQ0VfUVVJUktfRk9SQ0VEX0RJU0FCTEUpCisJCWludGYtPmRpc2Nvbm5lY3RlZCA9IHRydWU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnVuZGxlLCBuZXh0LCAmaW50Zi0+YnVuZGxlcywgbGlua3MpCisJCWdiX2J1bmRsZV9kZXN0cm95KGJ1bmRsZSk7CisKKwlpZiAoIWludGYtPm1vZGVfc3dpdGNoICYmICFpbnRmLT5kaXNjb25uZWN0ZWQpCisJCWdiX2NvbnRyb2xfaW50ZXJmYWNlX2RlYWN0aXZhdGVfcHJlcGFyZShpbnRmLT5jb250cm9sKTsKKworCWdiX2NvbnRyb2xfZGVsKGludGYtPmNvbnRyb2wpOworCWdiX3RpbWVzeW5jX2ludGVyZmFjZV9yZW1vdmUoaW50Zik7CisJZ2JfY29udHJvbF9kaXNhYmxlKGludGYtPmNvbnRyb2wpOworCWdiX2NvbnRyb2xfcHV0KGludGYtPmNvbnRyb2wpOworCWludGYtPmNvbnRyb2wgPSBOVUxMOworCisJaW50Zi0+ZW5hYmxlZCA9IGZhbHNlOworCisJcG1fcnVudGltZV9kaXNhYmxlKCZpbnRmLT5kZXYpOworCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZCgmaW50Zi0+ZGV2KTsKKwlwbV9ydW50aW1lX2RvbnRfdXNlX2F1dG9zdXNwZW5kKCZpbnRmLT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmaW50Zi0+ZGV2KTsKK30KKworLyogRW5hYmxlIFRpbWVTeW5jIG9uIGFuIEludGVyZmFjZSBjb250cm9sIGNvbm5lY3Rpb24uICovCitpbnQgZ2JfaW50ZXJmYWNlX3RpbWVzeW5jX2VuYWJsZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmLCB1OCBjb3VudCwKKwkJCQkgdTY0IGZyYW1lX3RpbWUsIHUzMiBzdHJvYmVfZGVsYXksIHUzMiByZWZjbGspCit7CisJcmV0dXJuIGdiX2NvbnRyb2xfdGltZXN5bmNfZW5hYmxlKGludGYtPmNvbnRyb2wsIGNvdW50LAorCQkJCQkgIGZyYW1lX3RpbWUsIHN0cm9iZV9kZWxheSwKKwkJCQkJICByZWZjbGspOworfQorCisvKiBEaXNhYmxlIFRpbWVTeW5jIG9uIGFuIEludGVyZmFjZSBjb250cm9sIGNvbm5lY3Rpb24uICovCitpbnQgZ2JfaW50ZXJmYWNlX3RpbWVzeW5jX2Rpc2FibGUoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlyZXR1cm4gZ2JfY29udHJvbF90aW1lc3luY19kaXNhYmxlKGludGYtPmNvbnRyb2wpOworfQorCisvKiBUcmFuc21pdCB0aGUgQXV0aG9yaXRhdGl2ZSBGcmFtZVRpbWUgdmlhIGFuIEludGVyZmFjZSBjb250cm9sIGNvbm5lY3Rpb24uICovCitpbnQgZ2JfaW50ZXJmYWNlX3RpbWVzeW5jX2F1dGhvcml0YXRpdmUoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQkJdTY0ICpmcmFtZV90aW1lKQoreworCXJldHVybiBnYl9jb250cm9sX3RpbWVzeW5jX2F1dGhvcml0YXRpdmUoaW50Zi0+Y29udHJvbCwKKwkJCQkJCWZyYW1lX3RpbWUpOworfQorCisvKiBSZWdpc3RlciBhbiBpbnRlcmZhY2UuICovCitpbnQgZ2JfaW50ZXJmYWNlX2FkZChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCWludCByZXQ7CisKKwlyZXQgPSBkZXZpY2VfYWRkKCZpbnRmLT5kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGludGVyZmFjZTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJdHJhY2VfZ2JfaW50ZXJmYWNlX2FkZChpbnRmKTsKKworCWRldl9pbmZvKCZpbnRmLT5kZXYsICJJbnRlcmZhY2UgYWRkZWQgKCVzKVxuIiwKKwkJCWdiX2ludGVyZmFjZV90eXBlX3N0cmluZyhpbnRmKSk7CisKKwlzd2l0Y2ggKGludGYtPnR5cGUpIHsKKwljYXNlIEdCX0lOVEVSRkFDRV9UWVBFX0dSRVlCVVM6CisJCWRldl9pbmZvKCZpbnRmLT5kZXYsICJHTVAgVklEPTB4JTA4eCwgUElEPTB4JTA4eFxuIiwKKwkJCQlpbnRmLT52ZW5kb3JfaWQsIGludGYtPnByb2R1Y3RfaWQpOworCQkvKiBmYWxsLXRocm91Z2ggKi8KKwljYXNlIEdCX0lOVEVSRkFDRV9UWVBFX1VOSVBSTzoKKwkJZGV2X2luZm8oJmludGYtPmRldiwgIkREQkwxIE1hbnVmYWN0dXJlcj0weCUwOHgsIFByb2R1Y3Q9MHglMDh4XG4iLAorCQkJCWludGYtPmRkYmwxX21hbnVmYWN0dXJlcl9pZCwKKwkJCQlpbnRmLT5kZGJsMV9wcm9kdWN0X2lkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIERlcmVnaXN0ZXIgYW4gaW50ZXJmYWNlLiAqLwordm9pZCBnYl9pbnRlcmZhY2VfZGVsKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpCit7CisJaWYgKGRldmljZV9pc19yZWdpc3RlcmVkKCZpbnRmLT5kZXYpKSB7CisJCXRyYWNlX2diX2ludGVyZmFjZV9kZWwoaW50Zik7CisKKwkJZGV2aWNlX2RlbCgmaW50Zi0+ZGV2KTsKKwkJZGV2X2luZm8oJmludGYtPmRldiwgIkludGVyZmFjZSByZW1vdmVkXG4iKTsKKwl9Cit9CisKK3ZvaWQgZ2JfaW50ZXJmYWNlX3B1dChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCXB1dF9kZXZpY2UoJmludGYtPmRldik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9pbnRlcmZhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjk5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogR3JleWJ1cyBJbnRlcmZhY2UgQmxvY2sgY29kZQorICoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpZm5kZWYgX19JTlRFUkZBQ0VfSAorI2RlZmluZSBfX0lOVEVSRkFDRV9ICisKK2VudW0gZ2JfaW50ZXJmYWNlX3R5cGUgeworCUdCX0lOVEVSRkFDRV9UWVBFX0lOVkFMSUQgPSAwLAorCUdCX0lOVEVSRkFDRV9UWVBFX1VOS05PV04sCisJR0JfSU5URVJGQUNFX1RZUEVfRFVNTVksCisJR0JfSU5URVJGQUNFX1RZUEVfVU5JUFJPLAorCUdCX0lOVEVSRkFDRV9UWVBFX0dSRVlCVVMsCit9OworCisjZGVmaW5lIEdCX0lOVEVSRkFDRV9RVUlSS19OT19DUE9SVF9GRUFUVVJFUwkJQklUKDApCisjZGVmaW5lIEdCX0lOVEVSRkFDRV9RVUlSS19OT19JTklUX1NUQVRVUwkJQklUKDEpCisjZGVmaW5lIEdCX0lOVEVSRkFDRV9RVUlSS19OT19HTVBfSURTCQkJQklUKDIpCisjZGVmaW5lIEdCX0lOVEVSRkFDRV9RVUlSS19GT1JDRURfRElTQUJMRQkJQklUKDMpCisjZGVmaW5lIEdCX0lOVEVSRkFDRV9RVUlSS19MRUdBQ1lfTU9ERV9TV0lUQ0gJCUJJVCg0KQorI2RlZmluZSBHQl9JTlRFUkZBQ0VfUVVJUktfTk9fQlVORExFX0FDVElWQVRFCQlCSVQoNSkKKyNkZWZpbmUgR0JfSU5URVJGQUNFX1FVSVJLX05PX1BNCQkJQklUKDYpCisKK3N0cnVjdCBnYl9pbnRlcmZhY2UgeworCXN0cnVjdCBkZXZpY2UgZGV2OworCXN0cnVjdCBnYl9jb250cm9sICpjb250cm9sOworCisJc3RydWN0IGxpc3RfaGVhZCBidW5kbGVzOworCXN0cnVjdCBsaXN0X2hlYWQgbW9kdWxlX25vZGU7CisJc3RydWN0IGxpc3RfaGVhZCBtYW5pZmVzdF9kZXNjczsKKwl1OCBpbnRlcmZhY2VfaWQ7CS8qIFBoeXNpY2FsIGxvY2F0aW9uIHdpdGhpbiB0aGUgRW5kbyAqLworCXU4IGRldmljZV9pZDsKKwl1OCBmZWF0dXJlczsJCS8qIEZlYXR1cmUgZmxhZ3Mgc2V0IGluIHRoZSBtYW5pZmVzdCAqLworCisJZW51bSBnYl9pbnRlcmZhY2VfdHlwZSB0eXBlOworCisJdTMyIGRkYmwxX21hbnVmYWN0dXJlcl9pZDsKKwl1MzIgZGRibDFfcHJvZHVjdF9pZDsKKwl1MzIgdmVuZG9yX2lkOworCXUzMiBwcm9kdWN0X2lkOworCXU2NCBzZXJpYWxfbnVtYmVyOworCisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZDsKKwlzdHJ1Y3QgZ2JfbW9kdWxlICptb2R1bGU7CisKKwl1bnNpZ25lZCBsb25nIHF1aXJrczsKKworCXN0cnVjdCBtdXRleCBtdXRleDsKKworCWJvb2wgZGlzY29ubmVjdGVkOworCisJYm9vbCBlamVjdGVkOworCWJvb2wgcmVtb3ZlZDsKKwlib29sIGFjdGl2ZTsKKwlib29sIGVuYWJsZWQ7CisJYm9vbCBtb2RlX3N3aXRjaDsKKwlib29sIGRtZV9yZWFkOworCisJc3RydWN0IHdvcmtfc3RydWN0IG1vZGVfc3dpdGNoX3dvcms7CisJc3RydWN0IGNvbXBsZXRpb24gbW9kZV9zd2l0Y2hfY29tcGxldGlvbjsKK307CisjZGVmaW5lIHRvX2diX2ludGVyZmFjZShkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGdiX2ludGVyZmFjZSwgZGV2KQorCitzdHJ1Y3QgZ2JfaW50ZXJmYWNlICpnYl9pbnRlcmZhY2VfY3JlYXRlKHN0cnVjdCBnYl9tb2R1bGUgKm1vZHVsZSwKKwkJCQkJIHU4IGludGVyZmFjZV9pZCk7CitpbnQgZ2JfaW50ZXJmYWNlX2FjdGl2YXRlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpOwordm9pZCBnYl9pbnRlcmZhY2VfZGVhY3RpdmF0ZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKTsKK2ludCBnYl9pbnRlcmZhY2VfZW5hYmxlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpOwordm9pZCBnYl9pbnRlcmZhY2VfZGlzYWJsZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKTsKK2ludCBnYl9pbnRlcmZhY2VfdGltZXN5bmNfZW5hYmxlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYsIHU4IGNvdW50LAorCQkJCSB1NjQgZnJhbWVfdGltZSwgdTMyIHN0cm9iZV9kZWxheSwgdTMyIHJlZmNsayk7CitpbnQgZ2JfaW50ZXJmYWNlX3RpbWVzeW5jX2F1dGhvcml0YXRpdmUoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQkJdTY0ICpmcmFtZV90aW1lKTsKK2ludCBnYl9pbnRlcmZhY2VfdGltZXN5bmNfZGlzYWJsZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKTsKK2ludCBnYl9pbnRlcmZhY2VfYWRkKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpOwordm9pZCBnYl9pbnRlcmZhY2VfZGVsKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpOwordm9pZCBnYl9pbnRlcmZhY2VfcHV0KHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpOwordm9pZCBnYl9pbnRlcmZhY2VfbWFpbGJveF9ldmVudChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmLCB1MTYgcmVzdWx0LAorCQkJCQkJCQl1MzIgbWFpbGJveCk7CisKK2ludCBnYl9pbnRlcmZhY2VfcmVxdWVzdF9tb2RlX3N3aXRjaChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKTsKKworI2VuZGlmIC8qIF9fSU5URVJGQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2xpZ2h0LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9saWdodC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZmZkOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9saWdodC5jCkBAIC0wLDAgKzEsMTM2MSBAQAorLyoKKyAqIEdyZXlidXMgTGlnaHRzIHByb3RvY29sIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTUgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZC1jbGFzcy1mbGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1mbGFzaC1sZWQtY2xhc3MuaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJncmV5YnVzX3Byb3RvY29scy5oIgorCisjZGVmaW5lIE5BTUVTX01BWAkzMgorCitzdHJ1Y3QgZ2JfY2hhbm5lbCB7CisJdTgJCQkJaWQ7CisJdTMyCQkJCWZsYWdzOworCXUzMgkJCQljb2xvcjsKKwljaGFyCQkJCSpjb2xvcl9uYW1lOworCXU4CQkJCWZhZGVfaW47CisJdTgJCQkJZmFkZV9vdXQ7CisJdTMyCQkJCW1vZGU7CisJY2hhcgkJCQkqbW9kZV9uYW1lOworCXN0cnVjdCBhdHRyaWJ1dGUJCSoqYXR0cnM7CisJc3RydWN0IGF0dHJpYnV0ZV9ncm91cAkJKmF0dHJfZ3JvdXA7CisJY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cAkqKmF0dHJfZ3JvdXBzOworCXN0cnVjdCBsZWRfY2xhc3NkZXYJCSpsZWQ7CisjaWYgSVNfUkVBQ0hBQkxFKENPTkZJR19MRURTX0NMQVNTX0ZMQVNIKQorCXN0cnVjdCBsZWRfY2xhc3NkZXZfZmxhc2gJZmxlZDsKKwlzdHJ1Y3QgbGVkX2ZsYXNoX3NldHRpbmcJaW50ZW5zaXR5X3VBOworCXN0cnVjdCBsZWRfZmxhc2hfc2V0dGluZwl0aW1lb3V0X3VzOworI2Vsc2UKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2CQljbGVkOworI2VuZGlmCisJc3RydWN0IGdiX2xpZ2h0CQkJKmxpZ2h0OworCWJvb2wJCQkJaXNfcmVnaXN0ZXJlZDsKKwlib29sCQkJCXJlbGVhc2luZzsKKwlib29sCQkJCXN0cm9iZV9zdGF0ZTsKKwlib29sCQkJCWFjdGl2ZTsKKwlzdHJ1Y3QgbXV0ZXgJCQlsb2NrOworfTsKKworc3RydWN0IGdiX2xpZ2h0IHsKKwl1OAkJCWlkOworCWNoYXIJCQkqbmFtZTsKKwlzdHJ1Y3QgZ2JfbGlnaHRzCSpnbGlnaHRzOworCXUzMgkJCWZsYWdzOworCXU4CQkJY2hhbm5lbHNfY291bnQ7CisJc3RydWN0IGdiX2NoYW5uZWwJKmNoYW5uZWxzOworCWJvb2wJCQloYXNfZmxhc2g7CisJYm9vbAkJCXJlYWR5OworI2lmIElTX1JFQUNIQUJMRShDT05GSUdfVjRMMl9GTEFTSF9MRURfQ0xBU1MpCisJc3RydWN0IHY0bDJfZmxhc2gJKnY0bDJfZmxhc2g7CisjZW5kaWYKK307CisKK3N0cnVjdCBnYl9saWdodHMgeworCXN0cnVjdCBnYl9jb25uZWN0aW9uCSpjb25uZWN0aW9uOworCXU4CQkJbGlnaHRzX2NvdW50OworCXN0cnVjdCBnYl9saWdodAkJKmxpZ2h0czsKKwlzdHJ1Y3QgbXV0ZXgJCWxpZ2h0c19sb2NrOworfTsKKworc3RhdGljIHZvaWQgZ2JfbGlnaHRzX2NoYW5uZWxfZnJlZShzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCk7CisKK3N0YXRpYyBzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqZ2V0X2Nvbm5fZnJvbV9jaGFubmVsKHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsKQoreworCXJldHVybiBjaGFubmVsLT5saWdodC0+Z2xpZ2h0cy0+Y29ubmVjdGlvbjsKK30KKworc3RhdGljIHN0cnVjdCBnYl9jb25uZWN0aW9uICpnZXRfY29ubl9mcm9tX2xpZ2h0KHN0cnVjdCBnYl9saWdodCAqbGlnaHQpCit7CisJcmV0dXJuIGxpZ2h0LT5nbGlnaHRzLT5jb25uZWN0aW9uOworfQorCitzdGF0aWMgYm9vbCBpc19jaGFubmVsX2ZsYXNoKHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsKQoreworCXJldHVybiAhIShjaGFubmVsLT5tb2RlICYgKEdCX0NIQU5ORUxfTU9ERV9GTEFTSCB8IEdCX0NIQU5ORUxfTU9ERV9UT1JDSAorCQkJCSAgIHwgR0JfQ0hBTk5FTF9NT0RFX0lORElDQVRPUikpOworfQorCisjaWYgSVNfUkVBQ0hBQkxFKENPTkZJR19MRURTX0NMQVNTX0ZMQVNIKQorc3RhdGljIHN0cnVjdCBnYl9jaGFubmVsICpnZXRfY2hhbm5lbF9mcm9tX2NkZXYoc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldikKK3sKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2X2ZsYXNoICpmbGVkX2NkZXYgPSBsY2Rldl90b19mbGNkZXYoY2Rldik7CisKKwlyZXR1cm4gY29udGFpbmVyX29mKGZsZWRfY2Rldiwgc3RydWN0IGdiX2NoYW5uZWwsIGZsZWQpOworfQorCitzdGF0aWMgc3RydWN0IGxlZF9jbGFzc2RldiAqZ2V0X2NoYW5uZWxfY2RldihzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlyZXR1cm4gJmNoYW5uZWwtPmZsZWQubGVkX2NkZXY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2JfY2hhbm5lbCAqZ2V0X2NoYW5uZWxfZnJvbV9tb2RlKHN0cnVjdCBnYl9saWdodCAqbGlnaHQsCisJCQkJCQl1MzIgbW9kZSkKK3sKKwlzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCA9IE5VTEw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGlnaHQtPmNoYW5uZWxzX2NvdW50OyBpKyspIHsKKwkJY2hhbm5lbCA9ICZsaWdodC0+Y2hhbm5lbHNbaV07CisJCWlmIChjaGFubmVsICYmIGNoYW5uZWwtPm1vZGUgPT0gbW9kZSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gY2hhbm5lbDsKK30KKworc3RhdGljIGludCBfX2diX2xpZ2h0c19mbGFzaF9pbnRlbnNpdHlfc2V0KHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsLAorCQkJCQkgICB1MzIgaW50ZW5zaXR5KQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2V0X2Nvbm5fZnJvbV9jaGFubmVsKGNoYW5uZWwpOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IGNvbm5lY3Rpb24tPmJ1bmRsZTsKKwlzdHJ1Y3QgZ2JfbGlnaHRzX3NldF9mbGFzaF9pbnRlbnNpdHlfcmVxdWVzdCByZXE7CisJaW50IHJldDsKKworCWlmIChjaGFubmVsLT5yZWxlYXNpbmcpCisJCXJldHVybiAtRVNIVVRET1dOOworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmVxLmxpZ2h0X2lkID0gY2hhbm5lbC0+bGlnaHQtPmlkOworCXJlcS5jaGFubmVsX2lkID0gY2hhbm5lbC0+aWQ7CisJcmVxLmludGVuc2l0eV91QSA9IGNwdV90b19sZTMyKGludGVuc2l0eSk7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9MSUdIVFNfVFlQRV9TRVRfRkxBU0hfSU5URU5TSVRZLAorCQkJCSZyZXEsIHNpemVvZihyZXEpLCBOVUxMLCAwKTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZ2JfbGlnaHRzX2ZsYXNoX2JyaWdodG5lc3Nfc2V0KHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsKQoreworCXUzMiBpbnRlbnNpdHk7CisKKwkvKiBJZiB0aGUgY2hhbm5lbCBpcyBmbGFzaCB3ZSBuZWVkIHRvIGdldCB0aGUgYXR0YWNoZWQgdG9yY2ggY2hhbm5lbCAqLworCWlmIChjaGFubmVsLT5tb2RlICYgR0JfQ0hBTk5FTF9NT0RFX0ZMQVNIKQorCQljaGFubmVsID0gZ2V0X2NoYW5uZWxfZnJvbV9tb2RlKGNoYW5uZWwtPmxpZ2h0LAorCQkJCQkJR0JfQ0hBTk5FTF9NT0RFX1RPUkNIKTsKKworCS8qIEZvciBub3QgZmxhc2ggd2UgbmVlZCB0byBjb252ZXJ0IGJyaWdodG5lc3MgdG8gaW50ZW5zaXR5ICovCisJaW50ZW5zaXR5ID0gY2hhbm5lbC0+aW50ZW5zaXR5X3VBLm1pbiArCisJCQkoY2hhbm5lbC0+aW50ZW5zaXR5X3VBLnN0ZXAgKiBjaGFubmVsLT5sZWQtPmJyaWdodG5lc3MpOworCisJcmV0dXJuIF9fZ2JfbGlnaHRzX2ZsYXNoX2ludGVuc2l0eV9zZXQoY2hhbm5lbCwgaW50ZW5zaXR5KTsKK30KKyNlbHNlCitzdGF0aWMgc3RydWN0IGdiX2NoYW5uZWwgKmdldF9jaGFubmVsX2Zyb21fY2RldihzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2KQoreworCXJldHVybiBjb250YWluZXJfb2YoY2Rldiwgc3RydWN0IGdiX2NoYW5uZWwsIGNsZWQpOworfQorCitzdGF0aWMgc3RydWN0IGxlZF9jbGFzc2RldiAqZ2V0X2NoYW5uZWxfY2RldihzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlyZXR1cm4gJmNoYW5uZWwtPmNsZWQ7Cit9CisKK3N0YXRpYyBpbnQgX19nYl9saWdodHNfZmxhc2hfYnJpZ2h0bmVzc19zZXQoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBnYl9saWdodHNfY29sb3Jfc2V0KHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsLCB1MzIgY29sb3IpOworc3RhdGljIGludCBnYl9saWdodHNfZmFkZV9zZXQoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpOworCitzdGF0aWMgdm9pZCBsZWRfbG9jayhzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2KQoreworCW11dGV4X2xvY2soJmNkZXYtPmxlZF9hY2Nlc3MpOworfQorCitzdGF0aWMgdm9pZCBsZWRfdW5sb2NrKHN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXYpCit7CisJbXV0ZXhfdW5sb2NrKCZjZGV2LT5sZWRfYWNjZXNzKTsKK30KKworI2RlZmluZSBnYl9saWdodHNfZmFkZV9hdHRyKF9fZGlyKQkJCQkJXAorc3RhdGljIHNzaXplX3QgZmFkZV8jI19fZGlyIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCisJCQkJICAgY2hhciAqYnVmKQkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKKwlzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCA9IGdldF9jaGFubmVsX2Zyb21fY2RldihjZGV2KTsJXAorCQkJCQkJCQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBjaGFubmVsLT5mYWRlXyMjX19kaXIpOwkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGZhZGVfIyNfX2RpciMjX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCisJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAorCXN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsID0gZ2V0X2NoYW5uZWxfZnJvbV9jZGV2KGNkZXYpOwlcCisJdTggZmFkZTsJCQkJCQkJXAorCWludCByZXQ7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlsZWRfbG9jayhjZGV2KTsJCQkJCQkJXAorCWlmIChsZWRfc3lzZnNfaXNfZGlzYWJsZWQoY2RldikpIHsJCQkJXAorCQlyZXQgPSAtRUJVU1k7CQkJCQkJXAorCQlnb3RvIHVubG9jazsJCQkJCQlcCisJfQkJCQkJCQkJXAorCQkJCQkJCQkJXAorCXJldCA9IGtzdHJ0b3U4KGJ1ZiwgMCwgJmZhZGUpOwkJCQkJXAorCWlmIChyZXQgPCAwKSB7CQkJCQkJCVwKKwkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgcGFyc2UgZmFkZSB2YWx1ZSAlZFxuIiwgcmV0KTsJXAorCQlnb3RvIHVubG9jazsJCQkJCQlcCisJfQkJCQkJCQkJXAorCWlmIChjaGFubmVsLT5mYWRlXyMjX19kaXIgPT0gZmFkZSkJCQkJXAorCQlnb3RvIHVubG9jazsJCQkJCQlcCisJY2hhbm5lbC0+ZmFkZV8jI19fZGlyID0gZmFkZTsJCQkJCVwKKwkJCQkJCQkJCVwKKwlyZXQgPSBnYl9saWdodHNfZmFkZV9zZXQoY2hhbm5lbCk7CQkJCVwKKwlpZiAocmV0IDwgMCkJCQkJCQkJXAorCQlnb3RvIHVubG9jazsJCQkJCQlcCisJCQkJCQkJCQlcCisJcmV0ID0gc2l6ZTsJCQkJCQkJXAordW5sb2NrOgkJCQkJCQkJCVwKKwlsZWRfdW5sb2NrKGNkZXYpOwkJCQkJCVwKKwlyZXR1cm4gcmV0OwkJCQkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSX1JXKGZhZGVfIyNfX2RpcikKKworZ2JfbGlnaHRzX2ZhZGVfYXR0cihpbik7CitnYl9saWdodHNfZmFkZV9hdHRyKG91dCk7CisKK3N0YXRpYyBzc2l6ZV90IGNvbG9yX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCA9IGdldF9jaGFubmVsX2Zyb21fY2RldihjZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwgY2hhbm5lbC0+Y29sb3IpOworfQorCitzdGF0aWMgc3NpemVfdCBjb2xvcl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwgPSBnZXRfY2hhbm5lbF9mcm9tX2NkZXYoY2Rldik7CisJdTMyIGNvbG9yOworCWludCByZXQ7CisKKwlsZWRfbG9jayhjZGV2KTsKKwlpZiAobGVkX3N5c2ZzX2lzX2Rpc2FibGVkKGNkZXYpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byB1bmxvY2s7CisJfQorCXJldCA9IGtzdHJ0b3UzMihidWYsIDAsICZjb2xvcik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgcGFyc2UgY29sb3IgdmFsdWUgJWRcbiIsIHJldCk7CisJCWdvdG8gdW5sb2NrOworCX0KKworCXJldCA9IGdiX2xpZ2h0c19jb2xvcl9zZXQoY2hhbm5lbCwgY29sb3IpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHVubG9jazsKKworCWNoYW5uZWwtPmNvbG9yID0gY29sb3I7CisJcmV0ID0gc2l6ZTsKK3VubG9jazoKKwlsZWRfdW5sb2NrKGNkZXYpOworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUlcoY29sb3IpOworCitzdGF0aWMgaW50IGNoYW5uZWxfYXR0cl9ncm91cHNfc2V0KHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsLAorCQkJCSAgIHN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXYpCit7CisJaW50IGF0dHIgPSAwOworCWludCBzaXplID0gMDsKKworCWlmIChjaGFubmVsLT5mbGFncyAmIEdCX0xJR0hUX0NIQU5ORUxfTVVMVElDT0xPUikKKwkJc2l6ZSsrOworCWlmIChjaGFubmVsLT5mbGFncyAmIEdCX0xJR0hUX0NIQU5ORUxfRkFERVIpCisJCXNpemUgKz0gMjsKKworCWlmICghc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTZXQgYXR0cmlidXRlcyBiYXNlZCBpbiB0aGUgY2hhbm5lbCBmbGFncyAqLworCWNoYW5uZWwtPmF0dHJzID0ga2NhbGxvYyhzaXplICsgMSwgc2l6ZW9mKCpjaGFubmVsLT5hdHRycyksIEdGUF9LRVJORUwpOworCWlmICghY2hhbm5lbC0+YXR0cnMpCisJCXJldHVybiAtRU5PTUVNOworCWNoYW5uZWwtPmF0dHJfZ3JvdXAgPSBrY2FsbG9jKDEsIHNpemVvZigqY2hhbm5lbC0+YXR0cl9ncm91cCksCisJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGFubmVsLT5hdHRyX2dyb3VwKQorCQlyZXR1cm4gLUVOT01FTTsKKwljaGFubmVsLT5hdHRyX2dyb3VwcyA9IGtjYWxsb2MoMiwgc2l6ZW9mKCpjaGFubmVsLT5hdHRyX2dyb3VwcyksCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghY2hhbm5lbC0+YXR0cl9ncm91cHMpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGNoYW5uZWwtPmZsYWdzICYgR0JfTElHSFRfQ0hBTk5FTF9NVUxUSUNPTE9SKQorCQljaGFubmVsLT5hdHRyc1thdHRyKytdID0gJmRldl9hdHRyX2NvbG9yLmF0dHI7CisJaWYgKGNoYW5uZWwtPmZsYWdzICYgR0JfTElHSFRfQ0hBTk5FTF9GQURFUikgeworCQljaGFubmVsLT5hdHRyc1thdHRyKytdID0gJmRldl9hdHRyX2ZhZGVfaW4uYXR0cjsKKwkJY2hhbm5lbC0+YXR0cnNbYXR0cisrXSA9ICZkZXZfYXR0cl9mYWRlX291dC5hdHRyOworCX0KKworCWNoYW5uZWwtPmF0dHJfZ3JvdXAtPmF0dHJzID0gY2hhbm5lbC0+YXR0cnM7CisKKwljaGFubmVsLT5hdHRyX2dyb3Vwc1swXSA9IGNoYW5uZWwtPmF0dHJfZ3JvdXA7CisKKwljZGV2LT5ncm91cHMgPSBjaGFubmVsLT5hdHRyX2dyb3VwczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2xpZ2h0c19mYWRlX3NldChzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fY2hhbm5lbChjaGFubmVsKTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSBjb25uZWN0aW9uLT5idW5kbGU7CisJc3RydWN0IGdiX2xpZ2h0c19zZXRfZmFkZV9yZXF1ZXN0IHJlcTsKKwlpbnQgcmV0OworCisJaWYgKGNoYW5uZWwtPnJlbGVhc2luZykKKwkJcmV0dXJuIC1FU0hVVERPV047CisKKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGJ1bmRsZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXEubGlnaHRfaWQgPSBjaGFubmVsLT5saWdodC0+aWQ7CisJcmVxLmNoYW5uZWxfaWQgPSBjaGFubmVsLT5pZDsKKwlyZXEuZmFkZV9pbiA9IGNoYW5uZWwtPmZhZGVfaW47CisJcmVxLmZhZGVfb3V0ID0gY2hhbm5lbC0+ZmFkZV9vdXQ7CisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfTElHSFRTX1RZUEVfU0VUX0ZBREUsCisJCQkJJnJlcSwgc2l6ZW9mKHJlcSksIE5VTEwsIDApOworCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX2NvbG9yX3NldChzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCwgdTMyIGNvbG9yKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2V0X2Nvbm5fZnJvbV9jaGFubmVsKGNoYW5uZWwpOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IGNvbm5lY3Rpb24tPmJ1bmRsZTsKKwlzdHJ1Y3QgZ2JfbGlnaHRzX3NldF9jb2xvcl9yZXF1ZXN0IHJlcTsKKwlpbnQgcmV0OworCisJaWYgKGNoYW5uZWwtPnJlbGVhc2luZykKKwkJcmV0dXJuIC1FU0hVVERPV047CisKKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGJ1bmRsZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXEubGlnaHRfaWQgPSBjaGFubmVsLT5saWdodC0+aWQ7CisJcmVxLmNoYW5uZWxfaWQgPSBjaGFubmVsLT5pZDsKKwlyZXEuY29sb3IgPSBjcHVfdG9fbGUzMihjb2xvcik7CisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfTElHSFRTX1RZUEVfU0VUX0NPTE9SLAorCQkJCSZyZXEsIHNpemVvZihyZXEpLCBOVUxMLCAwKTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZ2JfbGlnaHRzX2xlZF9icmlnaHRuZXNzX3NldChzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgZ2JfbGlnaHRzX3NldF9icmlnaHRuZXNzX3JlcXVlc3QgcmVxOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2V0X2Nvbm5fZnJvbV9jaGFubmVsKGNoYW5uZWwpOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IGNvbm5lY3Rpb24tPmJ1bmRsZTsKKwlib29sIG9sZF9hY3RpdmU7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNoYW5uZWwtPmxvY2spOworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJb2xkX2FjdGl2ZSA9IGNoYW5uZWwtPmFjdGl2ZTsKKworCXJlcS5saWdodF9pZCA9IGNoYW5uZWwtPmxpZ2h0LT5pZDsKKwlyZXEuY2hhbm5lbF9pZCA9IGNoYW5uZWwtPmlkOworCXJlcS5icmlnaHRuZXNzID0gKHU4KWNoYW5uZWwtPmxlZC0+YnJpZ2h0bmVzczsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0xJR0hUU19UWVBFX1NFVF9CUklHSFRORVNTLAorCQkJCSZyZXEsIHNpemVvZihyZXEpLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfcG1fcHV0OworCisJaWYgKGNoYW5uZWwtPmxlZC0+YnJpZ2h0bmVzcykKKwkJY2hhbm5lbC0+YWN0aXZlID0gdHJ1ZTsKKwllbHNlCisJCWNoYW5uZWwtPmFjdGl2ZSA9IGZhbHNlOworCisJLyogd2UgbmVlZCB0byBrZWVwIG1vZHVsZSBhbGl2ZSB3aGVuIHR1cm5pbmcgdG8gYWN0aXZlIHN0YXRlICovCisJaWYgKCFvbGRfYWN0aXZlICYmIGNoYW5uZWwtPmFjdGl2ZSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJLyoKKwkgKiBvbiB0aGUgb3RoZXIgaGFuZCBpZiBnb2luZyB0byBpbmFjdGl2ZSB3ZSBzdGlsbCBob2xkIGEgcmVmZXJlbmNlIGFuZAorCSAqIG5lZWQgdG8gcHV0IGl0LCBzbyB3ZSBjb3VsZCBnbyB0byBzdXNwZW5kLgorCSAqLworCWlmIChvbGRfYWN0aXZlICYmICFjaGFubmVsLT5hY3RpdmUpCisJCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKK291dF9wbV9wdXQ6CisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZjaGFubmVsLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19nYl9saWdodHNfYnJpZ2h0bmVzc19zZXQoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJaW50IHJldDsKKworCWlmIChjaGFubmVsLT5yZWxlYXNpbmcpCisJCXJldHVybiAwOworCisJaWYgKGlzX2NoYW5uZWxfZmxhc2goY2hhbm5lbCkpCisJCXJldCA9IF9fZ2JfbGlnaHRzX2ZsYXNoX2JyaWdodG5lc3Nfc2V0KGNoYW5uZWwpOworCWVsc2UKKwkJcmV0ID0gX19nYl9saWdodHNfbGVkX2JyaWdodG5lc3Nfc2V0KGNoYW5uZWwpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9icmlnaHRuZXNzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2LAorCQkJICAgICBlbnVtIGxlZF9icmlnaHRuZXNzIHZhbHVlKQoreworCXN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsID0gZ2V0X2NoYW5uZWxfZnJvbV9jZGV2KGNkZXYpOworCisJY2hhbm5lbC0+bGVkLT5icmlnaHRuZXNzID0gdmFsdWU7CisKKwlyZXR1cm4gX19nYl9saWdodHNfYnJpZ2h0bmVzc19zZXQoY2hhbm5lbCk7Cit9CisKK3N0YXRpYyBlbnVtIGxlZF9icmlnaHRuZXNzIGdiX2JyaWdodG5lc3NfZ2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXYpCisKK3sKKwlzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCA9IGdldF9jaGFubmVsX2Zyb21fY2RldihjZGV2KTsKKworCXJldHVybiBjaGFubmVsLT5sZWQtPmJyaWdodG5lc3M7Cit9CisKK3N0YXRpYyBpbnQgZ2JfYmxpbmtfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXYsIHVuc2lnbmVkIGxvbmcgKmRlbGF5X29uLAorCQkJdW5zaWduZWQgbG9uZyAqZGVsYXlfb2ZmKQoreworCXN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsID0gZ2V0X2NoYW5uZWxfZnJvbV9jZGV2KGNkZXYpOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2V0X2Nvbm5fZnJvbV9jaGFubmVsKGNoYW5uZWwpOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IGNvbm5lY3Rpb24tPmJ1bmRsZTsKKwlzdHJ1Y3QgZ2JfbGlnaHRzX2JsaW5rX3JlcXVlc3QgcmVxOworCWJvb2wgb2xkX2FjdGl2ZTsKKwlpbnQgcmV0OworCisJaWYgKGNoYW5uZWwtPnJlbGVhc2luZykKKwkJcmV0dXJuIC1FU0hVVERPV047CisKKwlpZiAoIWRlbGF5X29uIHx8ICFkZWxheV9vZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmY2hhbm5lbC0+bG9jayk7CisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlvbGRfYWN0aXZlID0gY2hhbm5lbC0+YWN0aXZlOworCisJcmVxLmxpZ2h0X2lkID0gY2hhbm5lbC0+bGlnaHQtPmlkOworCXJlcS5jaGFubmVsX2lkID0gY2hhbm5lbC0+aWQ7CisJcmVxLnRpbWVfb25fbXMgPSBjcHVfdG9fbGUxNigqZGVsYXlfb24pOworCXJlcS50aW1lX29mZl9tcyA9IGNwdV90b19sZTE2KCpkZWxheV9vZmYpOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfTElHSFRTX1RZUEVfU0VUX0JMSU5LLCAmcmVxLAorCQkJCXNpemVvZihyZXEpLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfcG1fcHV0OworCisJaWYgKCpkZWxheV9vbikKKwkJY2hhbm5lbC0+YWN0aXZlID0gdHJ1ZTsKKwllbHNlCisJCWNoYW5uZWwtPmFjdGl2ZSA9IGZhbHNlOworCisJLyogd2UgbmVlZCB0byBrZWVwIG1vZHVsZSBhbGl2ZSB3aGVuIHR1cm5pbmcgdG8gYWN0aXZlIHN0YXRlICovCisJaWYgKCFvbGRfYWN0aXZlICYmIGNoYW5uZWwtPmFjdGl2ZSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJLyoKKwkgKiBvbiB0aGUgb3RoZXIgaGFuZCBpZiBnb2luZyB0byBpbmFjdGl2ZSB3ZSBzdGlsbCBob2xkIGEgcmVmZXJlbmNlIGFuZAorCSAqIG5lZWQgdG8gcHV0IGl0LCBzbyB3ZSBjb3VsZCBnbyB0byBzdXNwZW5kLgorCSAqLworCWlmIChvbGRfYWN0aXZlICYmICFjaGFubmVsLT5hY3RpdmUpCisJCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKK291dF9wbV9wdXQ6CisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZjaGFubmVsLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xpZ2h0c19sZWRfb3BlcmF0aW9uc19zZXQoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkJCSBzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2KQoreworCWNkZXYtPmJyaWdodG5lc3NfZ2V0ID0gZ2JfYnJpZ2h0bmVzc19nZXQ7CisJY2Rldi0+YnJpZ2h0bmVzc19zZXRfYmxvY2tpbmcgPSBnYl9icmlnaHRuZXNzX3NldDsKKworCWlmIChjaGFubmVsLT5mbGFncyAmIEdCX0xJR0hUX0NIQU5ORUxfQkxJTkspCisJCWNkZXYtPmJsaW5rX3NldCA9IGdiX2JsaW5rX3NldDsKK30KKworI2lmIElTX1JFQUNIQUJMRShDT05GSUdfVjRMMl9GTEFTSF9MRURfQ0xBU1MpCisvKiBWNEwyIHNwZWNpZmljIGhlbHBlcnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9mbGFzaF9vcHMgdjRsMl9mbGFzaF9vcHM7CisKK3N0YXRpYyB2b2lkIF9fZ2JfbGlnaHRzX2NoYW5uZWxfdjRsMl9jb25maWcoc3RydWN0IGxlZF9mbGFzaF9zZXR0aW5nICpjaGFubmVsX3MsCisJCQkJCSAgICBzdHJ1Y3QgbGVkX2ZsYXNoX3NldHRpbmcgKnY0bDJfcykKK3sKKwl2NGwyX3MtPm1pbiA9IGNoYW5uZWxfcy0+bWluOworCXY0bDJfcy0+bWF4ID0gY2hhbm5lbF9zLT5tYXg7CisJdjRsMl9zLT5zdGVwID0gY2hhbm5lbF9zLT5zdGVwOworCS8qIEZvciB2NGwyIHZhbCBpcyB0aGUgZGVmYXVsdCB2YWx1ZSAqLworCXY0bDJfcy0+dmFsID0gY2hhbm5lbF9zLT5tYXg7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX2xpZ2h0X3Y0bDJfcmVnaXN0ZXIoc3RydWN0IGdiX2xpZ2h0ICpsaWdodCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fbGlnaHQobGlnaHQpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjb25uZWN0aW9uLT5idW5kbGUtPmRldjsKKwlzdHJ1Y3QgdjRsMl9mbGFzaF9jb25maWcgKnNkX2NmZzsKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2X2ZsYXNoICpmbGVkOworCXN0cnVjdCBsZWRfY2xhc3NkZXZfZmxhc2ggKmlsZWQgPSBOVUxMOworCXN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsX3RvcmNoLCAqY2hhbm5lbF9pbmQsICpjaGFubmVsX2ZsYXNoOworCWludCByZXQgPSAwOworCisJc2RfY2ZnID0ga2NhbGxvYygxLCBzaXplb2YoKnNkX2NmZyksIEdGUF9LRVJORUwpOworCWlmICghc2RfY2ZnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNoYW5uZWxfdG9yY2ggPSBnZXRfY2hhbm5lbF9mcm9tX21vZGUobGlnaHQsIEdCX0NIQU5ORUxfTU9ERV9UT1JDSCk7CisJaWYgKGNoYW5uZWxfdG9yY2gpCisJCV9fZ2JfbGlnaHRzX2NoYW5uZWxfdjRsMl9jb25maWcoJmNoYW5uZWxfdG9yY2gtPmludGVuc2l0eV91QSwKKwkJCQkJCSZzZF9jZmctPnRvcmNoX2ludGVuc2l0eSk7CisKKwljaGFubmVsX2luZCA9IGdldF9jaGFubmVsX2Zyb21fbW9kZShsaWdodCwgR0JfQ0hBTk5FTF9NT0RFX0lORElDQVRPUik7CisJaWYgKGNoYW5uZWxfaW5kKSB7CisJCV9fZ2JfbGlnaHRzX2NoYW5uZWxfdjRsMl9jb25maWcoJmNoYW5uZWxfaW5kLT5pbnRlbnNpdHlfdUEsCisJCQkJCQkmc2RfY2ZnLT5pbmRpY2F0b3JfaW50ZW5zaXR5KTsKKwkJaWxlZCA9ICZjaGFubmVsX2luZC0+ZmxlZDsKKwl9CisKKwljaGFubmVsX2ZsYXNoID0gZ2V0X2NoYW5uZWxfZnJvbV9tb2RlKGxpZ2h0LCBHQl9DSEFOTkVMX01PREVfRkxBU0gpOworCVdBUk5fT04oIWNoYW5uZWxfZmxhc2gpOworCisJZmxlZCA9ICZjaGFubmVsX2ZsYXNoLT5mbGVkOworCisJc25wcmludGYoc2RfY2ZnLT5kZXZfbmFtZSwgc2l6ZW9mKHNkX2NmZy0+ZGV2X25hbWUpLCAiJXMiLCBsaWdodC0+bmFtZSk7CisKKwkvKiBTZXQgdGhlIHBvc3NpYmxlIHZhbHVlcyB0byBmYXVsdHMsIGluIG91ciBjYXNlIGFsbCBmYXVsdHMgKi8KKwlzZF9jZmctPmZsYXNoX2ZhdWx0cyA9IExFRF9GQVVMVF9PVkVSX1ZPTFRBR0UgfCBMRURfRkFVTFRfVElNRU9VVCB8CisJCUxFRF9GQVVMVF9PVkVSX1RFTVBFUkFUVVJFIHwgTEVEX0ZBVUxUX1NIT1JUX0NJUkNVSVQgfAorCQlMRURfRkFVTFRfT1ZFUl9DVVJSRU5UIHwgTEVEX0ZBVUxUX0lORElDQVRPUiB8CisJCUxFRF9GQVVMVF9VTkRFUl9WT0xUQUdFIHwgTEVEX0ZBVUxUX0lOUFVUX1ZPTFRBR0UgfAorCQlMRURfRkFVTFRfTEVEX09WRVJfVEVNUEVSQVRVUkU7CisKKwlsaWdodC0+djRsMl9mbGFzaCA9IHY0bDJfZmxhc2hfaW5pdChkZXYsIE5VTEwsIGZsZWQsIGlsZWQsCisJCQkJCSAgICAmdjRsMl9mbGFzaF9vcHMsIHNkX2NmZyk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGxpZ2h0LT52NGwyX2ZsYXNoKSkgeworCQlyZXQgPSBQVFJfRVJSKGxpZ2h0LT52NGwyX2ZsYXNoKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlyZXR1cm4gcmV0OworCitvdXRfZnJlZToKKwlrZnJlZShzZF9jZmcpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xpZ2h0c19saWdodF92NGwyX3VucmVnaXN0ZXIoc3RydWN0IGdiX2xpZ2h0ICpsaWdodCkKK3sKKwl2NGwyX2ZsYXNoX3JlbGVhc2UobGlnaHQtPnY0bDJfZmxhc2gpOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX2xpZ2h0X3Y0bDJfcmVnaXN0ZXIoc3RydWN0IGdiX2xpZ2h0ICpsaWdodCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fbGlnaHQobGlnaHQpOworCisJZGV2X2VycigmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsICJubyBzdXBwb3J0IGZvciB2NGwyIHN1YmRldmljZXNcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnYl9saWdodHNfbGlnaHRfdjRsMl91bnJlZ2lzdGVyKHN0cnVjdCBnYl9saWdodCAqbGlnaHQpCit7Cit9CisjZW5kaWYKKworI2lmIElTX1JFQUNIQUJMRShDT05GSUdfTEVEU19DTEFTU19GTEFTSCkKKy8qIEZsYXNoIHNwZWNpZmljIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX2ZsYXNoX2ludGVuc2l0eV9zZXQoc3RydWN0IGxlZF9jbGFzc2Rldl9mbGFzaCAqZmNkZXYsCisJCQkJCSB1MzIgYnJpZ2h0bmVzcykKK3sKKwlzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCA9IGNvbnRhaW5lcl9vZihmY2Rldiwgc3RydWN0IGdiX2NoYW5uZWwsCisJCQkJCQkgIGZsZWQpOworCWludCByZXQ7CisKKwlyZXQgPSBfX2diX2xpZ2h0c19mbGFzaF9pbnRlbnNpdHlfc2V0KGNoYW5uZWwsIGJyaWdodG5lc3MpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZmNkZXYtPmJyaWdodG5lc3MudmFsID0gYnJpZ2h0bmVzczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2xpZ2h0c19mbGFzaF9pbnRlbnNpdHlfZ2V0KHN0cnVjdCBsZWRfY2xhc3NkZXZfZmxhc2ggKmZjZGV2LAorCQkJCQkgdTMyICpicmlnaHRuZXNzKQoreworCSpicmlnaHRuZXNzID0gZmNkZXYtPmJyaWdodG5lc3MudmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX2ZsYXNoX3N0cm9iZV9zZXQoc3RydWN0IGxlZF9jbGFzc2Rldl9mbGFzaCAqZmNkZXYsCisJCQkJICAgICAgYm9vbCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCA9IGNvbnRhaW5lcl9vZihmY2Rldiwgc3RydWN0IGdiX2NoYW5uZWwsCisJCQkJCQkgIGZsZWQpOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2V0X2Nvbm5fZnJvbV9jaGFubmVsKGNoYW5uZWwpOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IGNvbm5lY3Rpb24tPmJ1bmRsZTsKKwlzdHJ1Y3QgZ2JfbGlnaHRzX3NldF9mbGFzaF9zdHJvYmVfcmVxdWVzdCByZXE7CisJaW50IHJldDsKKworCWlmIChjaGFubmVsLT5yZWxlYXNpbmcpCisJCXJldHVybiAtRVNIVVRET1dOOworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmVxLmxpZ2h0X2lkID0gY2hhbm5lbC0+bGlnaHQtPmlkOworCXJlcS5jaGFubmVsX2lkID0gY2hhbm5lbC0+aWQ7CisJcmVxLnN0YXRlID0gc3RhdGUgPyAxIDogMDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0xJR0hUU19UWVBFX1NFVF9GTEFTSF9TVFJPQkUsCisJCQkJJnJlcSwgc2l6ZW9mKHJlcSksIE5VTEwsIDApOworCWlmICghcmV0KQorCQljaGFubmVsLT5zdHJvYmVfc3RhdGUgPSBzdGF0ZTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2xpZ2h0c19mbGFzaF9zdHJvYmVfZ2V0KHN0cnVjdCBsZWRfY2xhc3NkZXZfZmxhc2ggKmZjZGV2LAorCQkJCSAgICAgIGJvb2wgKnN0YXRlKQoreworCXN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsID0gY29udGFpbmVyX29mKGZjZGV2LCBzdHJ1Y3QgZ2JfY2hhbm5lbCwKKwkJCQkJCSAgZmxlZCk7CisKKwkqc3RhdGUgPSBjaGFubmVsLT5zdHJvYmVfc3RhdGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX2ZsYXNoX3RpbWVvdXRfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXZfZmxhc2ggKmZjZGV2LAorCQkJCSAgICAgICB1MzIgdGltZW91dCkKK3sKKwlzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCA9IGNvbnRhaW5lcl9vZihmY2Rldiwgc3RydWN0IGdiX2NoYW5uZWwsCisJCQkJCQkgIGZsZWQpOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2V0X2Nvbm5fZnJvbV9jaGFubmVsKGNoYW5uZWwpOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IGNvbm5lY3Rpb24tPmJ1bmRsZTsKKwlzdHJ1Y3QgZ2JfbGlnaHRzX3NldF9mbGFzaF90aW1lb3V0X3JlcXVlc3QgcmVxOworCWludCByZXQ7CisKKwlpZiAoY2hhbm5lbC0+cmVsZWFzaW5nKQorCQlyZXR1cm4gLUVTSFVURE9XTjsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJlcS5saWdodF9pZCA9IGNoYW5uZWwtPmxpZ2h0LT5pZDsKKwlyZXEuY2hhbm5lbF9pZCA9IGNoYW5uZWwtPmlkOworCXJlcS50aW1lb3V0X3VzID0gY3B1X3RvX2xlMzIodGltZW91dCk7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9MSUdIVFNfVFlQRV9TRVRfRkxBU0hfVElNRU9VVCwKKwkJCQkmcmVxLCBzaXplb2YocmVxKSwgTlVMTCwgMCk7CisJaWYgKCFyZXQpCisJCWZjZGV2LT50aW1lb3V0LnZhbCA9IHRpbWVvdXQ7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9saWdodHNfZmxhc2hfZmF1bHRfZ2V0KHN0cnVjdCBsZWRfY2xhc3NkZXZfZmxhc2ggKmZjZGV2LAorCQkJCSAgICAgdTMyICpmYXVsdCkKK3sKKwlzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCA9IGNvbnRhaW5lcl9vZihmY2Rldiwgc3RydWN0IGdiX2NoYW5uZWwsCisJCQkJCQkgIGZsZWQpOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2V0X2Nvbm5fZnJvbV9jaGFubmVsKGNoYW5uZWwpOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IGNvbm5lY3Rpb24tPmJ1bmRsZTsKKwlzdHJ1Y3QgZ2JfbGlnaHRzX2dldF9mbGFzaF9mYXVsdF9yZXF1ZXN0IHJlcTsKKwlzdHJ1Y3QgZ2JfbGlnaHRzX2dldF9mbGFzaF9mYXVsdF9yZXNwb25zZSByZXNwOworCWludCByZXQ7CisKKwlpZiAoY2hhbm5lbC0+cmVsZWFzaW5nKQorCQlyZXR1cm4gLUVTSFVURE9XTjsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJlcS5saWdodF9pZCA9IGNoYW5uZWwtPmxpZ2h0LT5pZDsKKwlyZXEuY2hhbm5lbF9pZCA9IGNoYW5uZWwtPmlkOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfTElHSFRTX1RZUEVfR0VUX0ZMQVNIX0ZBVUxULAorCQkJCSZyZXEsIHNpemVvZihyZXEpLCAmcmVzcCwgc2l6ZW9mKHJlc3ApKTsKKwlpZiAoIXJldCkKKwkJKmZhdWx0ID0gbGUzMl90b19jcHUocmVzcC5mYXVsdCk7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBsZWRfZmxhc2hfb3BzIGdiX2xpZ2h0c19mbGFzaF9vcHMgPSB7CisJLmZsYXNoX2JyaWdodG5lc3Nfc2V0CT0gZ2JfbGlnaHRzX2ZsYXNoX2ludGVuc2l0eV9zZXQsCisJLmZsYXNoX2JyaWdodG5lc3NfZ2V0CT0gZ2JfbGlnaHRzX2ZsYXNoX2ludGVuc2l0eV9nZXQsCisJLnN0cm9iZV9zZXQJCT0gZ2JfbGlnaHRzX2ZsYXNoX3N0cm9iZV9zZXQsCisJLnN0cm9iZV9nZXQJCT0gZ2JfbGlnaHRzX2ZsYXNoX3N0cm9iZV9nZXQsCisJLnRpbWVvdXRfc2V0CQk9IGdiX2xpZ2h0c19mbGFzaF90aW1lb3V0X3NldCwKKwkuZmF1bHRfZ2V0CQk9IGdiX2xpZ2h0c19mbGFzaF9mYXVsdF9nZXQsCit9OworCitzdGF0aWMgaW50IF9fZ2JfbGlnaHRzX2NoYW5uZWxfdG9yY2hfYXR0YWNoKHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsLAorCQkJCQkgICAgc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWxfdG9yY2gpCit7CisJY2hhciAqbmFtZTsKKworCS8qIHdlIGNhbiBvbmx5IGF0dGFjaCB0b3JjaCB0byBhIGZsYXNoIGNoYW5uZWwgKi8KKwlpZiAoIShjaGFubmVsLT5tb2RlICYgR0JfQ0hBTk5FTF9NT0RFX0ZMQVNIKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBNb3ZlIHRvcmNoIGJyaWdodG5lc3MgdG8gdGhlIGRlc3RpbmF0aW9uICovCisJY2hhbm5lbC0+bGVkLT5tYXhfYnJpZ2h0bmVzcyA9IGNoYW5uZWxfdG9yY2gtPmxlZC0+bWF4X2JyaWdodG5lc3M7CisKKwkvKiBhcHBlbmQgbW9kZSBuYW1lIHRvIGZsYXNoIG5hbWUgKi8KKwluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lcyIsIGNoYW5uZWwtPmxlZC0+bmFtZSwKKwkJCSBjaGFubmVsX3RvcmNoLT5tb2RlX25hbWUpOworCWlmICghbmFtZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJa2ZyZWUoY2hhbm5lbC0+bGVkLT5uYW1lKTsKKwljaGFubmVsLT5sZWQtPm5hbWUgPSBuYW1lOworCisJY2hhbm5lbF90b3JjaC0+bGVkID0gY2hhbm5lbC0+bGVkOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19nYl9saWdodHNfZmxhc2hfbGVkX3JlZ2lzdGVyKHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2V0X2Nvbm5fZnJvbV9jaGFubmVsKGNoYW5uZWwpOworCXN0cnVjdCBsZWRfY2xhc3NkZXZfZmxhc2ggKmZsZWQgPSAmY2hhbm5lbC0+ZmxlZDsKKwlzdHJ1Y3QgbGVkX2ZsYXNoX3NldHRpbmcgKmZzZXQ7CisJc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWxfdG9yY2g7CisJaW50IHJldDsKKworCWZsZWQtPm9wcyA9ICZnYl9saWdodHNfZmxhc2hfb3BzOworCisJZmxlZC0+bGVkX2NkZXYuZmxhZ3MgfD0gTEVEX0RFVl9DQVBfRkxBU0g7CisKKwlmc2V0ID0gJmZsZWQtPmJyaWdodG5lc3M7CisJZnNldC0+bWluID0gY2hhbm5lbC0+aW50ZW5zaXR5X3VBLm1pbjsKKwlmc2V0LT5tYXggPSBjaGFubmVsLT5pbnRlbnNpdHlfdUEubWF4OworCWZzZXQtPnN0ZXAgPSBjaGFubmVsLT5pbnRlbnNpdHlfdUEuc3RlcDsKKwlmc2V0LT52YWwgPSBjaGFubmVsLT5pbnRlbnNpdHlfdUEubWF4OworCisJLyogT25seSB0aGUgZmxhc2ggbW9kZSBoYXZlIHRoZSB0aW1lb3V0IGNvbnN0cmFpbnRzIHNldHRpbmdzICovCisJaWYgKGNoYW5uZWwtPm1vZGUgJiBHQl9DSEFOTkVMX01PREVfRkxBU0gpIHsKKwkJZnNldCA9ICZmbGVkLT50aW1lb3V0OworCQlmc2V0LT5taW4gPSBjaGFubmVsLT50aW1lb3V0X3VzLm1pbjsKKwkJZnNldC0+bWF4ID0gY2hhbm5lbC0+dGltZW91dF91cy5tYXg7CisJCWZzZXQtPnN0ZXAgPSBjaGFubmVsLT50aW1lb3V0X3VzLnN0ZXA7CisJCWZzZXQtPnZhbCA9IGNoYW5uZWwtPnRpbWVvdXRfdXMubWF4OworCX0KKworCS8qCisJICogSWYgbGlnaHQgaGF2ZSB0b3JjaCBtb2RlIGNoYW5uZWwsIHRoaXMgY2hhbm5lbCB3aWxsIGJlIHRoZSBsZWQKKwkgKiBjbGFzc2RldiBvZiB0aGUgcmVnaXN0ZXJlZCBhYm92ZSBmbGFzaCBjbGFzc2RldgorCSAqLworCWNoYW5uZWxfdG9yY2ggPSBnZXRfY2hhbm5lbF9mcm9tX21vZGUoY2hhbm5lbC0+bGlnaHQsCisJCQkJCSAgICAgIEdCX0NIQU5ORUxfTU9ERV9UT1JDSCk7CisJaWYgKGNoYW5uZWxfdG9yY2gpIHsKKwkJcmV0ID0gX19nYl9saWdodHNfY2hhbm5lbF90b3JjaF9hdHRhY2goY2hhbm5lbCwgY2hhbm5lbF90b3JjaCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBmYWlsOworCX0KKworCXJldCA9IGxlZF9jbGFzc2Rldl9mbGFzaF9yZWdpc3RlcigmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsIGZsZWQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZhaWw7CisKKwljaGFubmVsLT5pc19yZWdpc3RlcmVkID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK2ZhaWw6CisJY2hhbm5lbC0+bGVkID0gTlVMTDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2diX2xpZ2h0c19mbGFzaF9sZWRfdW5yZWdpc3RlcihzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlpZiAoIWNoYW5uZWwtPmlzX3JlZ2lzdGVyZWQpCisJCXJldHVybjsKKworCWxlZF9jbGFzc2Rldl9mbGFzaF91bnJlZ2lzdGVyKCZjaGFubmVsLT5mbGVkKTsKK30KKworc3RhdGljIGludCBnYl9saWdodHNfY2hhbm5lbF9mbGFzaF9jb25maWcoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnZXRfY29ubl9mcm9tX2NoYW5uZWwoY2hhbm5lbCk7CisJc3RydWN0IGdiX2xpZ2h0c19nZXRfY2hhbm5lbF9mbGFzaF9jb25maWdfcmVxdWVzdCByZXE7CisJc3RydWN0IGdiX2xpZ2h0c19nZXRfY2hhbm5lbF9mbGFzaF9jb25maWdfcmVzcG9uc2UgY29uZjsKKwlzdHJ1Y3QgbGVkX2ZsYXNoX3NldHRpbmcgKmZzZXQ7CisJaW50IHJldDsKKworCXJlcS5saWdodF9pZCA9IGNoYW5uZWwtPmxpZ2h0LT5pZDsKKwlyZXEuY2hhbm5lbF9pZCA9IGNoYW5uZWwtPmlkOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwKKwkJCQlHQl9MSUdIVFNfVFlQRV9HRVRfQ0hBTk5FTF9GTEFTSF9DT05GSUcsCisJCQkJJnJlcSwgc2l6ZW9mKHJlcSksICZjb25mLCBzaXplb2YoY29uZikpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBJbnRlbnNpdHkgY29uc3RyYWludHMgZm9yIGZsYXNoIHJlbGF0ZWQgbW9kZXM6IGZsYXNoLCB0b3JjaCwKKwkgKiBpbmRpY2F0b3IuICBUaGV5IHdpbGwgYmUgbmVlZGVkIGZvciB2NGwyIHJlZ2lzdHJhdGlvbi4KKwkgKi8KKwlmc2V0ID0gJmNoYW5uZWwtPmludGVuc2l0eV91QTsKKwlmc2V0LT5taW4gPSBsZTMyX3RvX2NwdShjb25mLmludGVuc2l0eV9taW5fdUEpOworCWZzZXQtPm1heCA9IGxlMzJfdG9fY3B1KGNvbmYuaW50ZW5zaXR5X21heF91QSk7CisJZnNldC0+c3RlcCA9IGxlMzJfdG9fY3B1KGNvbmYuaW50ZW5zaXR5X3N0ZXBfdUEpOworCisJLyoKKwkgKiBPbiBmbGFzaCB0eXBlLCBtYXggYnJpZ2h0bmVzcyBpcyBzZXQgYXMgdGhlIG51bWJlciBvZiBpbnRlbnNpdHkgc3RlcHMKKwkgKiBhdmFpbGFibGUuCisJICovCisJY2hhbm5lbC0+bGVkLT5tYXhfYnJpZ2h0bmVzcyA9IChmc2V0LT5tYXggLSBmc2V0LT5taW4pIC8gZnNldC0+c3RlcDsKKworCS8qIE9ubHkgdGhlIGZsYXNoIG1vZGUgaGF2ZSB0aGUgdGltZW91dCBjb25zdHJhaW50cyBzZXR0aW5ncyAqLworCWlmIChjaGFubmVsLT5tb2RlICYgR0JfQ0hBTk5FTF9NT0RFX0ZMQVNIKSB7CisJCWZzZXQgPSAmY2hhbm5lbC0+dGltZW91dF91czsKKwkJZnNldC0+bWluID0gbGUzMl90b19jcHUoY29uZi50aW1lb3V0X21pbl91cyk7CisJCWZzZXQtPm1heCA9IGxlMzJfdG9fY3B1KGNvbmYudGltZW91dF9tYXhfdXMpOworCQlmc2V0LT5zdGVwID0gbGUzMl90b19jcHUoY29uZi50aW1lb3V0X3N0ZXBfdXMpOworCX0KKworCXJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX2NoYW5uZWxfZmxhc2hfY29uZmlnKHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2V0X2Nvbm5fZnJvbV9jaGFubmVsKGNoYW5uZWwpOworCisJZGV2X2VycigmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsICJubyBzdXBwb3J0IGZvciBmbGFzaCBkZXZpY2VzXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2diX2xpZ2h0c19mbGFzaF9sZWRfcmVnaXN0ZXIoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZ2JfbGlnaHRzX2ZsYXNoX2xlZF91bnJlZ2lzdGVyKHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsKQoreworfQorCisjZW5kaWYKKworc3RhdGljIGludCBfX2diX2xpZ2h0c19sZWRfcmVnaXN0ZXIoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnZXRfY29ubl9mcm9tX2NoYW5uZWwoY2hhbm5lbCk7CisJc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiA9IGdldF9jaGFubmVsX2NkZXYoY2hhbm5lbCk7CisJaW50IHJldDsKKworCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsIGNkZXYpOworCWlmIChyZXQgPCAwKQorCQljaGFubmVsLT5sZWQgPSBOVUxMOworCWVsc2UKKwkJY2hhbm5lbC0+aXNfcmVnaXN0ZXJlZCA9IHRydWU7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9saWdodHNfY2hhbm5lbF9yZWdpc3RlcihzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwkvKiBOb3JtYWwgTEVEIGNoYW5uZWwsIGp1c3QgcmVnaXN0ZXIgaW4gbGVkIGNsYXNzZGV2IGFuZCB3ZSBhcmUgZG9uZSAqLworCWlmICghaXNfY2hhbm5lbF9mbGFzaChjaGFubmVsKSkKKwkJcmV0dXJuIF9fZ2JfbGlnaHRzX2xlZF9yZWdpc3RlcihjaGFubmVsKTsKKworCS8qCisJICogRmxhc2ggVHlwZSBuZWVkIG1vcmUgd29yaywgcmVnaXN0ZXIgZmxhc2ggY2xhc3NkZXYsIGluZGljYXRvciBhcworCSAqIGZsYXNoIGNsYXNzZGV2LCB0b3JjaCB3aWxsIGJlIGxlZCBjbGFzc2RldiBvZiB0aGUgZmxhc2ggY2xhc3NkZXYuCisJICovCisJaWYgKCEoY2hhbm5lbC0+bW9kZSAmIEdCX0NIQU5ORUxfTU9ERV9UT1JDSCkpCisJCXJldHVybiBfX2diX2xpZ2h0c19mbGFzaF9sZWRfcmVnaXN0ZXIoY2hhbm5lbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19nYl9saWdodHNfbGVkX3VucmVnaXN0ZXIoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiA9IGdldF9jaGFubmVsX2NkZXYoY2hhbm5lbCk7CisKKwlpZiAoIWNoYW5uZWwtPmlzX3JlZ2lzdGVyZWQpCisJCXJldHVybjsKKworCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKGNkZXYpOworCWNoYW5uZWwtPmxlZCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xpZ2h0c19jaGFubmVsX3VucmVnaXN0ZXIoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJLyogVGhlIHNhbWUgYXMgcmVnaXN0ZXIsIGhhbmRsZSBjaGFubmVscyBkaWZmZXJlbnRseSAqLworCWlmICghaXNfY2hhbm5lbF9mbGFzaChjaGFubmVsKSkgeworCQlfX2diX2xpZ2h0c19sZWRfdW5yZWdpc3RlcihjaGFubmVsKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjaGFubmVsLT5tb2RlICYgR0JfQ0hBTk5FTF9NT0RFX1RPUkNIKQorCQlfX2diX2xpZ2h0c19sZWRfdW5yZWdpc3RlcihjaGFubmVsKTsKKwllbHNlCisJCV9fZ2JfbGlnaHRzX2ZsYXNoX2xlZF91bnJlZ2lzdGVyKGNoYW5uZWwpOworfQorCitzdGF0aWMgaW50IGdiX2xpZ2h0c19jaGFubmVsX2NvbmZpZyhzdHJ1Y3QgZ2JfbGlnaHQgKmxpZ2h0LAorCQkJCSAgICBzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgZ2JfbGlnaHRzX2dldF9jaGFubmVsX2NvbmZpZ19yZXNwb25zZSBjb25mOworCXN0cnVjdCBnYl9saWdodHNfZ2V0X2NoYW5uZWxfY29uZmlnX3JlcXVlc3QgcmVxOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2V0X2Nvbm5fZnJvbV9saWdodChsaWdodCk7CisJc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiA9IGdldF9jaGFubmVsX2NkZXYoY2hhbm5lbCk7CisJY2hhciAqbmFtZTsKKwlpbnQgcmV0OworCisJcmVxLmxpZ2h0X2lkID0gbGlnaHQtPmlkOworCXJlcS5jaGFubmVsX2lkID0gY2hhbm5lbC0+aWQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9MSUdIVFNfVFlQRV9HRVRfQ0hBTk5FTF9DT05GSUcsCisJCQkJJnJlcSwgc2l6ZW9mKHJlcSksICZjb25mLCBzaXplb2YoY29uZikpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJY2hhbm5lbC0+bGlnaHQgPSBsaWdodDsKKwljaGFubmVsLT5tb2RlID0gbGUzMl90b19jcHUoY29uZi5tb2RlKTsKKwljaGFubmVsLT5mbGFncyA9IGxlMzJfdG9fY3B1KGNvbmYuZmxhZ3MpOworCWNoYW5uZWwtPmNvbG9yID0gbGUzMl90b19jcHUoY29uZi5jb2xvcik7CisJY2hhbm5lbC0+Y29sb3JfbmFtZSA9IGtzdHJuZHVwKGNvbmYuY29sb3JfbmFtZSwgTkFNRVNfTUFYLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYW5uZWwtPmNvbG9yX25hbWUpCisJCXJldHVybiAtRU5PTUVNOworCWNoYW5uZWwtPm1vZGVfbmFtZSA9IGtzdHJuZHVwKGNvbmYubW9kZV9uYW1lLCBOQU1FU19NQVgsIEdGUF9LRVJORUwpOworCWlmICghY2hhbm5lbC0+bW9kZV9uYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNoYW5uZWwtPmxlZCA9IGNkZXY7CisKKwluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlczolczolcyIsIGxpZ2h0LT5uYW1lLAorCQkJIGNoYW5uZWwtPmNvbG9yX25hbWUsIGNoYW5uZWwtPm1vZGVfbmFtZSk7CisJaWYgKCFuYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNkZXYtPm5hbWUgPSBuYW1lOworCisJY2Rldi0+bWF4X2JyaWdodG5lc3MgPSBjb25mLm1heF9icmlnaHRuZXNzOworCisJcmV0ID0gY2hhbm5lbF9hdHRyX2dyb3Vwc19zZXQoY2hhbm5lbCwgY2Rldik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlnYl9saWdodHNfbGVkX29wZXJhdGlvbnNfc2V0KGNoYW5uZWwsIGNkZXYpOworCisJLyoKKwkgKiBJZiBpdCBpcyBub3QgYSBmbGFzaCByZWxhdGVkIGNoYW5uZWwgKGZsYXNoLCB0b3JjaCBvciBpbmRpY2F0b3IpIHdlCisJICogYXJlIGRvbmUgaGVyZS4gSWYgbm90LCBjb250aW51ZSBhbmQgZmV0Y2ggZmxhc2ggcmVsYXRlZAorCSAqIGNvbmZpZ3VyYXRpb25zLgorCSAqLworCWlmICghaXNfY2hhbm5lbF9mbGFzaChjaGFubmVsKSkKKwkJcmV0dXJuIHJldDsKKworCWxpZ2h0LT5oYXNfZmxhc2ggPSB0cnVlOworCisJcmV0ID0gZ2JfbGlnaHRzX2NoYW5uZWxfZmxhc2hfY29uZmlnKGNoYW5uZWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9saWdodHNfbGlnaHRfY29uZmlnKHN0cnVjdCBnYl9saWdodHMgKmdsaWdodHMsIHU4IGlkKQoreworCXN0cnVjdCBnYl9saWdodCAqbGlnaHQgPSAmZ2xpZ2h0cy0+bGlnaHRzW2lkXTsKKwlzdHJ1Y3QgZ2JfbGlnaHRzX2dldF9saWdodF9jb25maWdfcmVxdWVzdCByZXE7CisJc3RydWN0IGdiX2xpZ2h0c19nZXRfbGlnaHRfY29uZmlnX3Jlc3BvbnNlIGNvbmY7CisJaW50IHJldDsKKwlpbnQgaTsKKworCWxpZ2h0LT5nbGlnaHRzID0gZ2xpZ2h0czsKKwlsaWdodC0+aWQgPSBpZDsKKworCXJlcS5pZCA9IGlkOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoZ2xpZ2h0cy0+Y29ubmVjdGlvbiwKKwkJCQlHQl9MSUdIVFNfVFlQRV9HRVRfTElHSFRfQ09ORklHLAorCQkJCSZyZXEsIHNpemVvZihyZXEpLCAmY29uZiwgc2l6ZW9mKGNvbmYpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmICghY29uZi5jaGFubmVsX2NvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXN0cmxlbihjb25mLm5hbWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxpZ2h0LT5jaGFubmVsc19jb3VudCA9IGNvbmYuY2hhbm5lbF9jb3VudDsKKwlsaWdodC0+bmFtZSA9IGtzdHJuZHVwKGNvbmYubmFtZSwgTkFNRVNfTUFYLCBHRlBfS0VSTkVMKTsKKworCWxpZ2h0LT5jaGFubmVscyA9IGt6YWxsb2MobGlnaHQtPmNoYW5uZWxzX2NvdW50ICoKKwkJCQkgIHNpemVvZihzdHJ1Y3QgZ2JfY2hhbm5lbCksIEdGUF9LRVJORUwpOworCWlmICghbGlnaHQtPmNoYW5uZWxzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEZpcnN0IHdlIGNvbGxlY3QgYWxsIHRoZSBjb25maWd1cmF0aW9ucyBmb3IgYWxsIGNoYW5uZWxzICovCisJZm9yIChpID0gMDsgaSA8IGxpZ2h0LT5jaGFubmVsc19jb3VudDsgaSsrKSB7CisJCWxpZ2h0LT5jaGFubmVsc1tpXS5pZCA9IGk7CisJCXJldCA9IGdiX2xpZ2h0c19jaGFubmVsX2NvbmZpZyhsaWdodCwgJmxpZ2h0LT5jaGFubmVsc1tpXSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9saWdodHNfbGlnaHRfcmVnaXN0ZXIoc3RydWN0IGdiX2xpZ2h0ICpsaWdodCkKK3sKKwlpbnQgcmV0OworCWludCBpOworCisJLyoKKwkgKiBUaGVuLCBpZiBldmVyeXRoaW5nIHdlbnQgb2sgaW4gZ2V0dGluZyBjb25maWd1cmF0aW9ucywgd2UgcmVnaXN0ZXIKKwkgKiB0aGUgY2xhc3NkZXYsIGZsYXNoIGNsYXNzZGV2IGFuZCB2NGwyIHN1YnN5c3RlbSwgaWYgYSBmbGFzaCBkZXZpY2UgaXMKKwkgKiBmb3VuZC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGlnaHQtPmNoYW5uZWxzX2NvdW50OyBpKyspIHsKKwkJcmV0ID0gZ2JfbGlnaHRzX2NoYW5uZWxfcmVnaXN0ZXIoJmxpZ2h0LT5jaGFubmVsc1tpXSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQltdXRleF9pbml0KCZsaWdodC0+Y2hhbm5lbHNbaV0ubG9jayk7CisJfQorCisJbGlnaHQtPnJlYWR5ID0gdHJ1ZTsKKworCWlmIChsaWdodC0+aGFzX2ZsYXNoKSB7CisJCXJldCA9IGdiX2xpZ2h0c19saWdodF92NGwyX3JlZ2lzdGVyKGxpZ2h0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWxpZ2h0LT5oYXNfZmxhc2ggPSBmYWxzZTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2JfbGlnaHRzX2NoYW5uZWxfZnJlZShzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlrZnJlZShjaGFubmVsLT5hdHRycyk7CisJa2ZyZWUoY2hhbm5lbC0+YXR0cl9ncm91cCk7CisJa2ZyZWUoY2hhbm5lbC0+YXR0cl9ncm91cHMpOworCWtmcmVlKGNoYW5uZWwtPmNvbG9yX25hbWUpOworCWtmcmVlKGNoYW5uZWwtPm1vZGVfbmFtZSk7CisJbXV0ZXhfZGVzdHJveSgmY2hhbm5lbC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xpZ2h0c19jaGFubmVsX3JlbGVhc2Uoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJY2hhbm5lbC0+cmVsZWFzaW5nID0gdHJ1ZTsKKworCWdiX2xpZ2h0c19jaGFubmVsX3VucmVnaXN0ZXIoY2hhbm5lbCk7CisKKwlnYl9saWdodHNfY2hhbm5lbF9mcmVlKGNoYW5uZWwpOworfQorCitzdGF0aWMgdm9pZCBnYl9saWdodHNfbGlnaHRfcmVsZWFzZShzdHJ1Y3QgZ2JfbGlnaHQgKmxpZ2h0KQoreworCWludCBpOworCWludCBjb3VudDsKKworCWxpZ2h0LT5yZWFkeSA9IGZhbHNlOworCisJY291bnQgPSBsaWdodC0+Y2hhbm5lbHNfY291bnQ7CisKKwlpZiAobGlnaHQtPmhhc19mbGFzaCkKKwkJZ2JfbGlnaHRzX2xpZ2h0X3Y0bDJfdW5yZWdpc3RlcihsaWdodCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlnYl9saWdodHNfY2hhbm5lbF9yZWxlYXNlKCZsaWdodC0+Y2hhbm5lbHNbaV0pOworCQlsaWdodC0+Y2hhbm5lbHNfY291bnQtLTsKKwl9CisJa2ZyZWUobGlnaHQtPmNoYW5uZWxzKTsKKwlrZnJlZShsaWdodC0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xpZ2h0c19yZWxlYXNlKHN0cnVjdCBnYl9saWdodHMgKmdsaWdodHMpCit7CisJaW50IGk7CisKKwlpZiAoIWdsaWdodHMpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmdsaWdodHMtPmxpZ2h0c19sb2NrKTsKKwlpZiAoIWdsaWdodHMtPmxpZ2h0cykKKwkJZ290byBmcmVlX2dsaWdodHM7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ2xpZ2h0cy0+bGlnaHRzX2NvdW50OyBpKyspCisJCWdiX2xpZ2h0c19saWdodF9yZWxlYXNlKCZnbGlnaHRzLT5saWdodHNbaV0pOworCisJa2ZyZWUoZ2xpZ2h0cy0+bGlnaHRzKTsKKworZnJlZV9nbGlnaHRzOgorCW11dGV4X3VubG9jaygmZ2xpZ2h0cy0+bGlnaHRzX2xvY2spOworCW11dGV4X2Rlc3Ryb3koJmdsaWdodHMtPmxpZ2h0c19sb2NrKTsKKwlrZnJlZShnbGlnaHRzKTsKK30KKworc3RhdGljIGludCBnYl9saWdodHNfZ2V0X2NvdW50KHN0cnVjdCBnYl9saWdodHMgKmdsaWdodHMpCit7CisJc3RydWN0IGdiX2xpZ2h0c19nZXRfbGlnaHRzX3Jlc3BvbnNlIHJlc3A7CisJaW50IHJldDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGdsaWdodHMtPmNvbm5lY3Rpb24sIEdCX0xJR0hUU19UWVBFX0dFVF9MSUdIVFMsCisJCQkJTlVMTCwgMCwgJnJlc3AsIHNpemVvZihyZXNwKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoIXJlc3AubGlnaHRzX2NvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdsaWdodHMtPmxpZ2h0c19jb3VudCA9IHJlc3AubGlnaHRzX2NvdW50OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX2NyZWF0ZV9hbGwoc3RydWN0IGdiX2xpZ2h0cyAqZ2xpZ2h0cykKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdsaWdodHMtPmNvbm5lY3Rpb247CisJaW50IHJldDsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJmdsaWdodHMtPmxpZ2h0c19sb2NrKTsKKwlyZXQgPSBnYl9saWdodHNfZ2V0X2NvdW50KGdsaWdodHMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWdsaWdodHMtPmxpZ2h0cyA9IGt6YWxsb2MoZ2xpZ2h0cy0+bGlnaHRzX2NvdW50ICoKKwkJCQkgIHNpemVvZihzdHJ1Y3QgZ2JfbGlnaHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdsaWdodHMtPmxpZ2h0cykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZ2xpZ2h0cy0+bGlnaHRzX2NvdW50OyBpKyspIHsKKwkJcmV0ID0gZ2JfbGlnaHRzX2xpZ2h0X2NvbmZpZyhnbGlnaHRzLCBpKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJCSJGYWlsIHRvIGNvbmZpZ3VyZSBsaWdodHMgZGV2aWNlXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZnbGlnaHRzLT5saWdodHNfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9saWdodHNfcmVnaXN0ZXJfYWxsKHN0cnVjdCBnYl9saWdodHMgKmdsaWdodHMpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnbGlnaHRzLT5jb25uZWN0aW9uOworCWludCByZXQgPSAwOworCWludCBpOworCisJbXV0ZXhfbG9jaygmZ2xpZ2h0cy0+bGlnaHRzX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBnbGlnaHRzLT5saWdodHNfY291bnQ7IGkrKykgeworCQlyZXQgPSBnYl9saWdodHNfbGlnaHRfcmVnaXN0ZXIoJmdsaWdodHMtPmxpZ2h0c1tpXSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCQkiRmFpbCB0byBlbmFibGUgbGlnaHRzIGRldmljZVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmZ2xpZ2h0cy0+bGlnaHRzX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX3JlcXVlc3RfaGFuZGxlcihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wLT5jb25uZWN0aW9uOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjb25uZWN0aW9uLT5idW5kbGUtPmRldjsKKwlzdHJ1Y3QgZ2JfbGlnaHRzICpnbGlnaHRzID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2JfbGlnaHQgKmxpZ2h0OworCXN0cnVjdCBnYl9tZXNzYWdlICpyZXF1ZXN0OworCXN0cnVjdCBnYl9saWdodHNfZXZlbnRfcmVxdWVzdCAqcGF5bG9hZDsKKwlpbnQgcmV0ID0gIDA7CisJdTggbGlnaHRfaWQ7CisJdTggZXZlbnQ7CisKKwlpZiAob3AtPnR5cGUgIT0gR0JfTElHSFRTX1RZUEVfRVZFTlQpIHsKKwkJZGV2X2VycihkZXYsICJVbnN1cHBvcnRlZCB1bnNvbGljaXRlZCBldmVudDogJXVcbiIsIG9wLT50eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVxdWVzdCA9IG9wLT5yZXF1ZXN0OworCisJaWYgKHJlcXVlc3QtPnBheWxvYWRfc2l6ZSA8IHNpemVvZigqcGF5bG9hZCkpIHsKKwkJZGV2X2VycihkZXYsICJXcm9uZyBldmVudCBzaXplIHJlY2VpdmVkICglenUgPCAlenUpXG4iLAorCQkJcmVxdWVzdC0+cGF5bG9hZF9zaXplLCBzaXplb2YoKnBheWxvYWQpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGF5bG9hZCA9IHJlcXVlc3QtPnBheWxvYWQ7CisJbGlnaHRfaWQgPSBwYXlsb2FkLT5saWdodF9pZDsKKworCWlmIChsaWdodF9pZCA+PSBnbGlnaHRzLT5saWdodHNfY291bnQgfHwKKwkgICAgIWdsaWdodHMtPmxpZ2h0c1tsaWdodF9pZF0ucmVhZHkpIHsKKwkJZGV2X2VycihkZXYsICJFdmVudCByZWNlaXZlZCBmb3IgdW5jb25maWd1cmVkIGxpZ2h0IGlkOiAlZFxuIiwKKwkJCWxpZ2h0X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXZlbnQgPSBwYXlsb2FkLT5ldmVudDsKKworCWlmIChldmVudCAmIEdCX0xJR0hUU19MSUdIVF9DT05GSUcpIHsKKwkJbGlnaHQgPSAmZ2xpZ2h0cy0+bGlnaHRzW2xpZ2h0X2lkXTsKKworCQltdXRleF9sb2NrKCZnbGlnaHRzLT5saWdodHNfbG9jayk7CisJCWdiX2xpZ2h0c19saWdodF9yZWxlYXNlKGxpZ2h0KTsKKwkJcmV0ID0gZ2JfbGlnaHRzX2xpZ2h0X2NvbmZpZyhnbGlnaHRzLCBsaWdodF9pZCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gZ2JfbGlnaHRzX2xpZ2h0X3JlZ2lzdGVyKGxpZ2h0KTsKKwkJaWYgKHJldCA8IDApCisJCQlnYl9saWdodHNfbGlnaHRfcmVsZWFzZShsaWdodCk7CisJCW11dGV4X3VubG9jaygmZ2xpZ2h0cy0+bGlnaHRzX2xvY2spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX3Byb2JlKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSwKKwkJCSAgIGNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCAqaWQpCit7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9jcG9ydCAqY3BvcnRfZGVzYzsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfbGlnaHRzICpnbGlnaHRzOworCWludCByZXQ7CisKKwlpZiAoYnVuZGxlLT5udW1fY3BvcnRzICE9IDEpCisJCXJldHVybiAtRU5PREVWOworCisJY3BvcnRfZGVzYyA9ICZidW5kbGUtPmNwb3J0X2Rlc2NbMF07CisJaWYgKGNwb3J0X2Rlc2MtPnByb3RvY29sX2lkICE9IEdSRVlCVVNfUFJPVE9DT0xfTElHSFRTKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWdsaWdodHMgPSBremFsbG9jKHNpemVvZigqZ2xpZ2h0cyksIEdGUF9LRVJORUwpOworCWlmICghZ2xpZ2h0cykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9pbml0KCZnbGlnaHRzLT5saWdodHNfbG9jayk7CisKKwljb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGUoYnVuZGxlLCBsZTE2X3RvX2NwdShjcG9ydF9kZXNjLT5pZCksCisJCQkJCSAgZ2JfbGlnaHRzX3JlcXVlc3RfaGFuZGxlcik7CisJaWYgKElTX0VSUihjb25uZWN0aW9uKSkgeworCQlyZXQgPSBQVFJfRVJSKGNvbm5lY3Rpb24pOworCQlnb3RvIG91dDsKKwl9CisKKwlnbGlnaHRzLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKwlnYl9jb25uZWN0aW9uX3NldF9kYXRhKGNvbm5lY3Rpb24sIGdsaWdodHMpOworCisJZ3JleWJ1c19zZXRfZHJ2ZGF0YShidW5kbGUsIGdsaWdodHMpOworCisJLyogV2UgYXJlbid0IHJlYWR5IHRvIHJlY2VpdmUgYW4gaW5jb21pbmcgcmVxdWVzdCB5ZXQgKi8KKwlyZXQgPSBnYl9jb25uZWN0aW9uX2VuYWJsZV90eChjb25uZWN0aW9uKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2Nvbm5lY3Rpb25fZGVzdHJveTsKKworCS8qCisJICogU2V0dXAgYWxsIHRoZSBsaWdodHMgZGV2aWNlcyBvdmVyIHRoaXMgY29ubmVjdGlvbiwgaWYgYW55dGhpbmcgZ29lcworCSAqIHdyb25nIHRlYXIgZG93biBhbGwgbGlnaHRzCisJICovCisJcmV0ID0gZ2JfbGlnaHRzX2NyZWF0ZV9hbGwoZ2xpZ2h0cyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfY29ubmVjdGlvbl9kaXNhYmxlOworCisJLyogV2UgYXJlIHJlYWR5IHRvIHJlY2VpdmUgYW4gaW5jb21pbmcgcmVxdWVzdCBub3csIGVuYWJsZSBSWCBhcyB3ZWxsICovCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9jb25uZWN0aW9uX2Rpc2FibGU7CisKKwkvKiBFbmFibGUgJiByZWdpc3RlciBsaWdodHMgKi8KKwlyZXQgPSBnYl9saWdodHNfcmVnaXN0ZXJfYWxsKGdsaWdodHMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2Nvbm5lY3Rpb25fZGlzYWJsZTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfY29ubmVjdGlvbl9kaXNhYmxlOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKK2Vycm9yX2Nvbm5lY3Rpb25fZGVzdHJveToKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7CitvdXQ6CisJZ2JfbGlnaHRzX3JlbGVhc2UoZ2xpZ2h0cyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ2JfbGlnaHRzX2Rpc2Nvbm5lY3Qoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKQoreworCXN0cnVjdCBnYl9saWdodHMgKmdsaWdodHMgPSBncmV5YnVzX2dldF9kcnZkYXRhKGJ1bmRsZSk7CisKKwlpZiAoZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpKQorCQlnYl9wbV9ydW50aW1lX2dldF9ub3Jlc3VtZShidW5kbGUpOworCisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGdsaWdodHMtPmNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShnbGlnaHRzLT5jb25uZWN0aW9uKTsKKworCWdiX2xpZ2h0c19yZWxlYXNlKGdsaWdodHMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkIGdiX2xpZ2h0c19pZF90YWJsZVtdID0geworCXsgR1JFWUJVU19ERVZJQ0VfQ0xBU1MoR1JFWUJVU19DTEFTU19MSUdIVFMpIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShncmV5YnVzLCBnYl9saWdodHNfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGdyZXlidXNfZHJpdmVyIGdiX2xpZ2h0c19kcml2ZXIgPSB7CisJLm5hbWUJCT0gImxpZ2h0cyIsCisJLnByb2JlCQk9IGdiX2xpZ2h0c19wcm9iZSwKKwkuZGlzY29ubmVjdAk9IGdiX2xpZ2h0c19kaXNjb25uZWN0LAorCS5pZF90YWJsZQk9IGdiX2xpZ2h0c19pZF90YWJsZSwKK307Cittb2R1bGVfZ3JleWJ1c19kcml2ZXIoZ2JfbGlnaHRzX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2xvZy5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBkZDllNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2xvZy5jCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogR3JleWJ1cyBkcml2ZXIgZm9yIHRoZSBsb2cgcHJvdG9jb2wKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NpemVzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorCitzdHJ1Y3QgZ2JfbG9nIHsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKK307CisKK3N0YXRpYyBpbnQgZ2JfbG9nX3JlcXVlc3RfaGFuZGxlcihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wLT5jb25uZWN0aW9uOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjb25uZWN0aW9uLT5idW5kbGUtPmRldjsKKwlzdHJ1Y3QgZ2JfbG9nX3NlbmRfbG9nX3JlcXVlc3QgKnJlY2VpdmU7CisJdTE2IGxlbjsKKworCWlmIChvcC0+dHlwZSAhPSBHQl9MT0dfVFlQRV9TRU5EX0xPRykgeworCQlkZXZfZXJyKGRldiwgInVua25vd24gcmVxdWVzdCB0eXBlIDB4JTAyeFxuIiwgb3AtPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBWZXJpZnkgc2l6ZSBvZiBwYXlsb2FkICovCisJaWYgKG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUgPCBzaXplb2YoKnJlY2VpdmUpKSB7CisJCWRldl9lcnIoZGV2LCAibG9nIHJlcXVlc3QgdG9vIHNtYWxsICglenUgPCAlenUpXG4iLAorCQkJCW9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUsIHNpemVvZigqcmVjZWl2ZSkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmVjZWl2ZSA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCWxlbiA9IGxlMTZfdG9fY3B1KHJlY2VpdmUtPmxlbik7CisJaWYgKGxlbiAhPSAoaW50KShvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplIC0gc2l6ZW9mKCpyZWNlaXZlKSkpIHsKKwkJZGV2X2VycihkZXYsICJsb2cgcmVxdWVzdCB3cm9uZyBzaXplICVkIHZzICVkXG4iLCBsZW4sCisJCQkJKGludCkob3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSAtIHNpemVvZigqcmVjZWl2ZSkpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChsZW4gPT0gMCkgeworCQlkZXZfZXJyKGRldiwgImxvZyByZXF1ZXN0IG9mIDAgYnl0ZXM/XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGxlbiA+IEdCX0xPR19NQVhfTEVOKSB7CisJCWRldl9lcnIoZGV2LCAibG9nIHJlcXVlc3QgdG9vIGJpZzogJWRcbiIsIGxlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEVuc3VyZSB0aGUgYnVmZmVyIGlzIDAgdGVybWluYXRlZCAqLworCXJlY2VpdmUtPm1zZ1tsZW4gLSAxXSA9ICdcMCc7CisKKwkvKiBQcmludCB3aXRoIGRldl9kYmcoKSBzbyB0aGF0IGl0IGNhbiBiZSBlYXNpbHkgdHVybmVkIG9mZiB1c2luZworCSAqIGR5bmFtaWMgZGVidWdnaW5nIChhbmQgcHJldmVudCBhbnkgRG9TKSAqLworCWRldl9kYmcoZGV2LCAiJXMiLCByZWNlaXZlLT5tc2cpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbG9nX3Byb2JlKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSwKKwkJCWNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCAqaWQpCit7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9jcG9ydCAqY3BvcnRfZGVzYzsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfbG9nICpsb2c7CisJaW50IHJldHZhbDsKKworCWlmIChidW5kbGUtPm51bV9jcG9ydHMgIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljcG9ydF9kZXNjID0gJmJ1bmRsZS0+Y3BvcnRfZGVzY1swXTsKKwlpZiAoY3BvcnRfZGVzYy0+cHJvdG9jb2xfaWQgIT0gR1JFWUJVU19QUk9UT0NPTF9MT0cpCisJCXJldHVybiAtRU5PREVWOworCisJbG9nID0ga3phbGxvYyhzaXplb2YoKmxvZyksIEdGUF9LRVJORUwpOworCWlmICghbG9nKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbm5lY3Rpb24gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZShidW5kbGUsIGxlMTZfdG9fY3B1KGNwb3J0X2Rlc2MtPmlkKSwKKwkJCWdiX2xvZ19yZXF1ZXN0X2hhbmRsZXIpOworCWlmIChJU19FUlIoY29ubmVjdGlvbikpIHsKKwkJcmV0dmFsID0gUFRSX0VSUihjb25uZWN0aW9uKTsKKwkJZ290byBlcnJvcl9mcmVlOworCX0KKworCWxvZy0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJZ3JleWJ1c19zZXRfZHJ2ZGF0YShidW5kbGUsIGxvZyk7CisKKwlyZXR2YWwgPSBnYl9jb25uZWN0aW9uX2VuYWJsZShjb25uZWN0aW9uKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm9yX2Nvbm5lY3Rpb25fZGVzdHJveTsKKworCXJldHVybiAwOworCitlcnJvcl9jb25uZWN0aW9uX2Rlc3Ryb3k6CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGNvbm5lY3Rpb24pOworZXJyb3JfZnJlZToKKwlrZnJlZShsb2cpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xvZ19kaXNjb25uZWN0KHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwlzdHJ1Y3QgZ2JfbG9nICpsb2cgPSBncmV5YnVzX2dldF9kcnZkYXRhKGJ1bmRsZSk7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBsb2ctPmNvbm5lY3Rpb247CisKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGNvbm5lY3Rpb24pOworCisJa2ZyZWUobG9nKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCBnYl9sb2dfaWRfdGFibGVbXSA9IHsKKwl7IEdSRVlCVVNfREVWSUNFX0NMQVNTKEdSRVlCVVNfQ0xBU1NfTE9HKSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZ3JleWJ1cywgZ2JfbG9nX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBncmV5YnVzX2RyaXZlciBnYl9sb2dfZHJpdmVyID0geworCS5uYW1lICAgICAgICAgICA9ICJsb2ciLAorCS5wcm9iZSAgICAgICAgICA9IGdiX2xvZ19wcm9iZSwKKwkuZGlzY29ubmVjdCAgICAgPSBnYl9sb2dfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgICAgICAgPSBnYl9sb2dfaWRfdGFibGUsCit9OworbW9kdWxlX2dyZXlidXNfZHJpdmVyKGdiX2xvZ19kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9sb29wYmFjay5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvbG9vcGJhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODgyMzA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvbG9vcGJhY2suYwpAQCAtMCwwICsxLDEzNjQgQEAKKy8qCisgKiBMb29wYmFjayBicmlkZ2UgZHJpdmVyIGZvciB0aGUgR3JleWJ1cyBsb29wYmFjayBtb2R1bGUuCisgKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2l6ZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0X3NvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKworI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKworI2RlZmluZSBOU0VDX1BFUl9EQVkgODY0MDAwMDAwMDAwMDBVTEwKKworc3RydWN0IGdiX2xvb3BiYWNrX3N0YXRzIHsKKwl1MzIgbWluOworCXUzMiBtYXg7CisJdTY0IHN1bTsKKwl1MzIgY291bnQ7Cit9OworCitzdHJ1Y3QgZ2JfbG9vcGJhY2tfZGV2aWNlIHsKKwlzdHJ1Y3QgZGVudHJ5ICpyb290OworCXUzMiBjb3VudDsKKwlzaXplX3Qgc2l6ZV9tYXg7CisKKwkvKiBXZSBuZWVkIHRvIHRha2UgYSBsb2NrIGluIGF0b21pYyBjb250ZXh0ICovCisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Rfb3BfYXN5bmM7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7Cit9OworCitzdGF0aWMgc3RydWN0IGdiX2xvb3BiYWNrX2RldmljZSBnYl9kZXY7CisKK3N0cnVjdCBnYl9sb29wYmFja19hc3luY19vcGVyYXRpb24geworCXN0cnVjdCBnYl9sb29wYmFjayAqZ2I7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCXN0cnVjdCB0aW1ldmFsIHRzOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IGtyZWYga3JlZjsKKwlib29sIHBlbmRpbmc7CisJaW50ICgqY29tcGxldGlvbikoc3RydWN0IGdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbiAqb3BfYXN5bmMpOworfTsKKworc3RydWN0IGdiX2xvb3BiYWNrIHsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworCXN0cnVjdCBkZW50cnkgKmZpbGU7CisJc3RydWN0IGtmaWZvIGtmaWZvX2xhdDsKKwlzdHJ1Y3Qga2ZpZm8ga2ZpZm9fdHM7CisJc3RydWN0IG11dGV4IG11dGV4OworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cV9jb21wbGV0aW9uOworCWF0b21pY190IG91dHN0YW5kaW5nX29wZXJhdGlvbnM7CisKKwkvKiBQZXIgY29ubmVjdGlvbiBzdGF0cyAqLworCXN0cnVjdCB0aW1ldmFsIHRzOworCXN0cnVjdCBnYl9sb29wYmFja19zdGF0cyBsYXRlbmN5OworCXN0cnVjdCBnYl9sb29wYmFja19zdGF0cyB0aHJvdWdocHV0OworCXN0cnVjdCBnYl9sb29wYmFja19zdGF0cyByZXF1ZXN0c19wZXJfc2Vjb25kOworCXN0cnVjdCBnYl9sb29wYmFja19zdGF0cyBhcGJyaWRnZV91bmlwcm9fbGF0ZW5jeTsKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2tfc3RhdHMgZ2JwaHlfZmlybXdhcmVfbGF0ZW5jeTsKKworCWludCB0eXBlOworCWludCBhc3luYzsKKwlpbnQgaWQ7CisJdTMyIHNpemU7CisJdTMyIGl0ZXJhdGlvbl9tYXg7CisJdTMyIGl0ZXJhdGlvbl9jb3VudDsKKwlpbnQgdXNfd2FpdDsKKwl1MzIgZXJyb3I7CisJdTMyIHJlcXVlc3RzX2NvbXBsZXRlZDsKKwl1MzIgcmVxdWVzdHNfdGltZWRvdXQ7CisJdTMyIHRpbWVvdXQ7CisJdTMyIGppZmZ5X3RpbWVvdXQ7CisJdTMyIHRpbWVvdXRfbWluOworCXUzMiB0aW1lb3V0X21heDsKKwl1MzIgb3V0c3RhbmRpbmdfb3BlcmF0aW9uc19tYXg7CisJdTMyIGxiaWQ7CisJdTY0IGVsYXBzZWRfbnNlY3M7CisJdTMyIGFwYnJpZGdlX2xhdGVuY3lfdHM7CisJdTMyIGdicGh5X2xhdGVuY3lfdHM7CisKKwl1MzIgc2VuZF9jb3VudDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgbG9vcGJhY2tfY2xhc3MgPSB7CisJLm5hbWUJCT0gImdiX2xvb3BiYWNrIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9Oworc3RhdGljIERFRklORV9JREEobG9vcGJhY2tfaWRhKTsKKworLyogTWluL21heCB2YWx1ZXMgaW4gamlmZmllcyAqLworI2RlZmluZSBHQl9MT09QQkFDS19USU1FT1VUX01JTgkJCQkxCisjZGVmaW5lIEdCX0xPT1BCQUNLX1RJTUVPVVRfTUFYCQkJCTEwMDAwCisKKyNkZWZpbmUgR0JfTE9PUEJBQ0tfRklGT19ERUZBVUxUCQkJODE5MgorCitzdGF0aWMgdW5zaWduZWQga2ZpZm9fZGVwdGggPSBHQl9MT09QQkFDS19GSUZPX0RFRkFVTFQ7Cittb2R1bGVfcGFyYW0oa2ZpZm9fZGVwdGgsIHVpbnQsIDA0NDQpOworCisvKiBNYXhpbXVtIHNpemUgb2YgYW55IG9uZSBzZW5kIGRhdGEgYnVmZmVyIHdlIHN1cHBvcnQgKi8KKyNkZWZpbmUgTUFYX1BBQ0tFVF9TSVpFIChQQUdFX1NJWkUgKiAyKQorCisjZGVmaW5lIEdCX0xPT1BCQUNLX1VTX1dBSVRfTUFYCQkJCTEwMDAwMDAKKworLyogaW50ZXJmYWNlIHN5c2ZzIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgZ2JfbG9vcGJhY2tfcm9fYXR0cihmaWVsZCkJCQkJXAorc3RhdGljIHNzaXplX3QgZmllbGQjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCQlcCisJCQkgICAgY2hhciAqYnVmKQkJCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBnYi0+ZmllbGQpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFJfUk8oZmllbGQpCisKKyNkZWZpbmUgZ2JfbG9vcGJhY2tfcm9fc3RhdHNfYXR0cihuYW1lLCBmaWVsZCwgdHlwZSkJCVwKK3N0YXRpYyBzc2l6ZV90IG5hbWUjI18jI2ZpZWxkIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCVwKKwkJCSAgICBjaGFyICpidWYpCQkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBnYl9sb29wYmFjayAqZ2IgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCisJLyogUmVwb3J0IDAgZm9yIG1pbiBhbmQgbWF4IGlmIG5vIHRyYW5zZmVyIHN1Y2Nlc3NlZCAqLwkJXAorCWlmICghZ2ItPnJlcXVlc3RzX2NvbXBsZXRlZCkJCQkJCVwKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiMFxuIik7CQkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlIiN0eXBlIlxuIiwgZ2ItPm5hbWUuZmllbGQpOwlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSX1JPKG5hbWUjI18jI2ZpZWxkKQorCisjZGVmaW5lIGdiX2xvb3BiYWNrX3JvX2F2Z19hdHRyKG5hbWUpCQkJXAorc3RhdGljIHNzaXplX3QgbmFtZSMjX2F2Z19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwJCVwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCVwKKwkJCSAgICBjaGFyICpidWYpCQkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBnYl9sb29wYmFja19zdGF0cyAqc3RhdHM7CQkJCVwKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiOwkJCQkJCVwKKwl1NjQgYXZnLCByZW07CQkJCQkJCVwKKwl1MzIgY291bnQ7CQkJCQkJCVwKKwlnYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwlzdGF0cyA9ICZnYi0+bmFtZTsJCQkJCVwKKwljb3VudCA9IHN0YXRzLT5jb3VudCA/IHN0YXRzLT5jb3VudCA6IDE7CQkJXAorCWF2ZyA9IHN0YXRzLT5zdW0gKyBjb3VudCAvIDIwMDAwMDA7IC8qIHJvdW5kIGNsb3Nlc3QgKi8JCVwKKwlyZW0gPSBkb19kaXYoYXZnLCBjb3VudCk7CQkJCQlcCisJcmVtICo9IDEwMDAwMDA7CQkJCQkJCVwKKwlkb19kaXYocmVtLCBjb3VudCk7CQkJCQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsbHUuJTA2dVxuIiwgYXZnLCAodTMyKXJlbSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSX1JPKG5hbWUjI19hdmcpCisKKyNkZWZpbmUgZ2JfbG9vcGJhY2tfc3RhdHNfYXR0cnMoZmllbGQpCQkJCVwKKwlnYl9sb29wYmFja19yb19zdGF0c19hdHRyKGZpZWxkLCBtaW4sIHUpOwkJXAorCWdiX2xvb3BiYWNrX3JvX3N0YXRzX2F0dHIoZmllbGQsIG1heCwgdSk7CQlcCisJZ2JfbG9vcGJhY2tfcm9fYXZnX2F0dHIoZmllbGQpCisKKyNkZWZpbmUgZ2JfbG9vcGJhY2tfYXR0cihmaWVsZCwgdHlwZSkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGZpZWxkIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJCVwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCVwKKwkJCSAgICBjaGFyICpidWYpCQkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBnYl9sb29wYmFjayAqZ2IgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJSIjdHlwZSJcbiIsIGdiLT5maWVsZCk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGZpZWxkIyNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCVwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsCQkJCVwKKwkJCSAgICBzaXplX3QgbGVuKQkJCQkJXAorewkJCQkJCQkJCVwKKwlpbnQgcmV0OwkJCQkJCQlcCisJc3RydWN0IGdiX2xvb3BiYWNrICpnYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwltdXRleF9sb2NrKCZnYi0+bXV0ZXgpOwkJCQkJCVwKKwlyZXQgPSBzc2NhbmYoYnVmLCAiJSIjdHlwZSwgJmdiLT5maWVsZCk7CQkJXAorCWlmIChyZXQgIT0gMSkJCQkJCQkJXAorCQlsZW4gPSAtRUlOVkFMOwkJCQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCWdiX2xvb3BiYWNrX2NoZWNrX2F0dHIoZ2IsIGJ1bmRsZSk7CQkJXAorCW11dGV4X3VubG9jaygmZ2ItPm11dGV4KTsJCQkJCVwKKwlyZXR1cm4gbGVuOwkJCQkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSX1JXKGZpZWxkKQorCisjZGVmaW5lIGdiX2Rldl9sb29wYmFja19yb19hdHRyKGZpZWxkLCBjb25uKQkJCQlcCitzdGF0aWMgc3NpemVfdCBmaWVsZCMjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAkJXAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAkJXAorCQkJICAgIGNoYXIgKmJ1ZikJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGdiX2xvb3BiYWNrICpnYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZ2ItPmZpZWxkKTsJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhmaWVsZCkKKworI2RlZmluZSBnYl9kZXZfbG9vcGJhY2tfcndfYXR0cihmaWVsZCwgdHlwZSkJCQkJXAorc3RhdGljIHNzaXplX3QgZmllbGQjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwJCQkJXAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAkJXAorCQkJICAgIGNoYXIgKmJ1ZikJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGdiX2xvb3BiYWNrICpnYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlIiN0eXBlIlxuIiwgZ2ItPmZpZWxkKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3QgZmllbGQjI19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAkJXAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1ZiwJCQkJXAorCQkJICAgIHNpemVfdCBsZW4pCQkJCQlcCit7CQkJCQkJCQkJXAorCWludCByZXQ7CQkJCQkJCVwKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQkJXAorCW11dGV4X2xvY2soJmdiLT5tdXRleCk7CQkJCQkJXAorCXJldCA9IHNzY2FuZihidWYsICIlIiN0eXBlLCAmZ2ItPmZpZWxkKTsJCQlcCisJaWYgKHJldCAhPSAxKQkJCQkJCQlcCisJCWxlbiA9IC1FSU5WQUw7CQkJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJZ2JfbG9vcGJhY2tfY2hlY2tfYXR0cihnYik7CQlcCisJbXV0ZXhfdW5sb2NrKCZnYi0+bXV0ZXgpOwkJCQkJXAorCXJldHVybiBsZW47CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFJfUlcoZmllbGQpCisKK3N0YXRpYyB2b2lkIGdiX2xvb3BiYWNrX3Jlc2V0X3N0YXRzKHN0cnVjdCBnYl9sb29wYmFjayAqZ2IpOworc3RhdGljIHZvaWQgZ2JfbG9vcGJhY2tfY2hlY2tfYXR0cihzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiKQoreworCWlmIChnYi0+dXNfd2FpdCA+IEdCX0xPT1BCQUNLX1VTX1dBSVRfTUFYKQorCQlnYi0+dXNfd2FpdCA9IEdCX0xPT1BCQUNLX1VTX1dBSVRfTUFYOworCWlmIChnYi0+c2l6ZSA+IGdiX2Rldi5zaXplX21heCkKKwkJZ2ItPnNpemUgPSBnYl9kZXYuc2l6ZV9tYXg7CisJZ2ItPnJlcXVlc3RzX3RpbWVkb3V0ID0gMDsKKwlnYi0+cmVxdWVzdHNfY29tcGxldGVkID0gMDsKKwlnYi0+aXRlcmF0aW9uX2NvdW50ID0gMDsKKwlnYi0+c2VuZF9jb3VudCA9IDA7CisJZ2ItPmVycm9yID0gMDsKKworCWlmIChrZmlmb19kZXB0aCA8IGdiLT5pdGVyYXRpb25fbWF4KSB7CisJCWRldl93YXJuKGdiLT5kZXYsCisJCQkgImNhbm5vdCBsb2cgYnl0ZXMgJXUga2ZpZm9fZGVwdGggJXVcbiIsCisJCQkgZ2ItPml0ZXJhdGlvbl9tYXgsIGtmaWZvX2RlcHRoKTsKKwl9CisJa2ZpZm9fcmVzZXRfb3V0KCZnYi0+a2ZpZm9fbGF0KTsKKwlrZmlmb19yZXNldF9vdXQoJmdiLT5rZmlmb190cyk7CisKKwlzd2l0Y2ggKGdiLT50eXBlKSB7CisJY2FzZSBHQl9MT09QQkFDS19UWVBFX1BJTkc6CisJY2FzZSBHQl9MT09QQkFDS19UWVBFX1RSQU5TRkVSOgorCWNhc2UgR0JfTE9PUEJBQ0tfVFlQRV9TSU5LOgorCQlnYi0+amlmZnlfdGltZW91dCA9IHVzZWNzX3RvX2ppZmZpZXMoZ2ItPnRpbWVvdXQpOworCQlpZiAoIWdiLT5qaWZmeV90aW1lb3V0KQorCQkJZ2ItPmppZmZ5X3RpbWVvdXQgPSBHQl9MT09QQkFDS19USU1FT1VUX01JTjsKKwkJZWxzZSBpZiAoZ2ItPmppZmZ5X3RpbWVvdXQgPiBHQl9MT09QQkFDS19USU1FT1VUX01BWCkKKwkJCWdiLT5qaWZmeV90aW1lb3V0ID0gR0JfTE9PUEJBQ0tfVElNRU9VVF9NQVg7CisJCWdiX2xvb3BiYWNrX3Jlc2V0X3N0YXRzKGdiKTsKKwkJd2FrZV91cCgmZ2ItPndxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ2ItPnR5cGUgPSAwOworCQlicmVhazsKKwl9Cit9CisKKy8qIFRpbWUgdG8gc2VuZCBhbmQgcmVjZWl2ZSBvbmUgbWVzc2FnZSAqLworZ2JfbG9vcGJhY2tfc3RhdHNfYXR0cnMobGF0ZW5jeSk7CisvKiBOdW1iZXIgb2YgcmVxdWVzdHMgc2VudCBwZXIgc2Vjb25kIG9uIHRoaXMgY3BvcnQgKi8KK2diX2xvb3BiYWNrX3N0YXRzX2F0dHJzKHJlcXVlc3RzX3Blcl9zZWNvbmQpOworLyogUXVhbnRpdHkgb2YgZGF0YSBzZW50IGFuZCByZWNlaXZlZCBvbiB0aGlzIGNwb3J0ICovCitnYl9sb29wYmFja19zdGF0c19hdHRycyh0aHJvdWdocHV0KTsKKy8qIExhdGVuY3kgYWNyb3NzIHRoZSBVbmlQcm8gbGluayBmcm9tIEFQQnJpZGdlJ3MgcGVyc3BlY3RpdmUgKi8KK2diX2xvb3BiYWNrX3N0YXRzX2F0dHJzKGFwYnJpZGdlX3VuaXByb19sYXRlbmN5KTsKKy8qIEZpcm13YXJlIGluZHVjZWQgb3ZlcmhlYWQgaW4gdGhlIEdQQnJpZGdlICovCitnYl9sb29wYmFja19zdGF0c19hdHRycyhnYnBoeV9maXJtd2FyZV9sYXRlbmN5KTsKKworLyogTnVtYmVyIG9mIGVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgbG9vcCAqLworZ2JfbG9vcGJhY2tfcm9fYXR0cihlcnJvcik7CisvKiBOdW1iZXIgb2YgcmVxdWVzdHMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCBhc3luYyAqLworZ2JfbG9vcGJhY2tfcm9fYXR0cihyZXF1ZXN0c19jb21wbGV0ZWQpOworLyogTnVtYmVyIG9mIHJlcXVlc3RzIHRpbWVkIG91dCBhc3luYyAqLworZ2JfbG9vcGJhY2tfcm9fYXR0cihyZXF1ZXN0c190aW1lZG91dCk7CisvKiBUaW1lb3V0IG1pbmltdW0gaW4gdXNlY29uZHMgKi8KK2diX2xvb3BiYWNrX3JvX2F0dHIodGltZW91dF9taW4pOworLyogVGltZW91dCBtaW5pbXVtIGluIHVzZWNvbmRzICovCitnYl9sb29wYmFja19yb19hdHRyKHRpbWVvdXRfbWF4KTsKKworLyoKKyAqIFR5cGUgb2YgbG9vcGJhY2sgbWVzc2FnZSB0byBzZW5kIGJhc2VkIG9uIHByb3RvY29sIHR5cGUgZGVmaW5pdGlvbnMKKyAqIDAgPT4gRG9uJ3Qgc2VuZCBtZXNzYWdlCisgKiAyID0+IFNlbmQgcGluZyBtZXNzYWdlIGNvbnRpbnVvdXNseSAobWVzc2FnZSB3aXRob3V0IHBheWxvYWQpCisgKiAzID0+IFNlbmQgdHJhbnNmZXIgbWVzc2FnZSBjb250aW51b3VzbHkgKG1lc3NhZ2Ugd2l0aCBwYXlsb2FkLAorICoJCQkJCSAgIHBheWxvYWQgcmV0dXJuZWQgaW4gcmVzcG9uc2UpCisgKiA0ID0+IFNlbmQgYSBzaW5rIG1lc3NhZ2UgKG1lc3NhZ2Ugd2l0aCBwYXlsb2FkLCBubyBwYXlsb2FkIGluIHJlc3BvbnNlKQorICovCitnYl9kZXZfbG9vcGJhY2tfcndfYXR0cih0eXBlLCBkKTsKKy8qIFNpemUgb2YgdHJhbnNmZXIgbWVzc2FnZSBwYXlsb2FkOiAwLTQwOTYgYnl0ZXMgKi8KK2diX2Rldl9sb29wYmFja19yd19hdHRyKHNpemUsIHUpOworLyogVGltZSB0byB3YWl0IGJldHdlZW4gdHdvIG1lc3NhZ2VzOiAwLTEwMDAgbXMgKi8KK2diX2Rldl9sb29wYmFja19yd19hdHRyKHVzX3dhaXQsIGQpOworLyogTWF4aW11bSBpdGVyYXRpb25zIGZvciBhIGdpdmVuIG9wZXJhdGlvbjogMS0oMl4zMi0xKSwgMCBpbXBsaWVzIGluZmluaXRlICovCitnYl9kZXZfbG9vcGJhY2tfcndfYXR0cihpdGVyYXRpb25fbWF4LCB1KTsKKy8qIFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBmb3IgKGkgPSAwOyBpIDwgaXRlcmF0aW9uX21heDsgaSsrKSBsb29wICovCitnYl9kZXZfbG9vcGJhY2tfcm9fYXR0cihpdGVyYXRpb25fY291bnQsIGZhbHNlKTsKKy8qIEEgZmxhZyB0byBpbmRpY2F0ZSBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyAqLworZ2JfZGV2X2xvb3BiYWNrX3J3X2F0dHIoYXN5bmMsIHUpOworLyogVGltZW91dCBvZiBhbiBpbmRpdmlkdWFsIGFzeW5jaHJvbm91cyByZXF1ZXN0ICovCitnYl9kZXZfbG9vcGJhY2tfcndfYXR0cih0aW1lb3V0LCB1KTsKKy8qIE1heGltdW0gbnVtYmVyIG9mIGluLWZsaWdodCBvcGVyYXRpb25zIGJlZm9yZSBiYWNrLW9mZiAqLworZ2JfZGV2X2xvb3BiYWNrX3J3X2F0dHIob3V0c3RhbmRpbmdfb3BlcmF0aW9uc19tYXgsIHUpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG9vcGJhY2tfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfbGF0ZW5jeV9taW4uYXR0ciwKKwkmZGV2X2F0dHJfbGF0ZW5jeV9tYXguYXR0ciwKKwkmZGV2X2F0dHJfbGF0ZW5jeV9hdmcuYXR0ciwKKwkmZGV2X2F0dHJfcmVxdWVzdHNfcGVyX3NlY29uZF9taW4uYXR0ciwKKwkmZGV2X2F0dHJfcmVxdWVzdHNfcGVyX3NlY29uZF9tYXguYXR0ciwKKwkmZGV2X2F0dHJfcmVxdWVzdHNfcGVyX3NlY29uZF9hdmcuYXR0ciwKKwkmZGV2X2F0dHJfdGhyb3VnaHB1dF9taW4uYXR0ciwKKwkmZGV2X2F0dHJfdGhyb3VnaHB1dF9tYXguYXR0ciwKKwkmZGV2X2F0dHJfdGhyb3VnaHB1dF9hdmcuYXR0ciwKKwkmZGV2X2F0dHJfYXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWluLmF0dHIsCisJJmRldl9hdHRyX2FwYnJpZGdlX3VuaXByb19sYXRlbmN5X21heC5hdHRyLAorCSZkZXZfYXR0cl9hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9hdmcuYXR0ciwKKwkmZGV2X2F0dHJfZ2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9taW4uYXR0ciwKKwkmZGV2X2F0dHJfZ2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9tYXguYXR0ciwKKwkmZGV2X2F0dHJfZ2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9hdmcuYXR0ciwKKwkmZGV2X2F0dHJfdHlwZS5hdHRyLAorCSZkZXZfYXR0cl9zaXplLmF0dHIsCisJJmRldl9hdHRyX3VzX3dhaXQuYXR0ciwKKwkmZGV2X2F0dHJfaXRlcmF0aW9uX2NvdW50LmF0dHIsCisJJmRldl9hdHRyX2l0ZXJhdGlvbl9tYXguYXR0ciwKKwkmZGV2X2F0dHJfYXN5bmMuYXR0ciwKKwkmZGV2X2F0dHJfZXJyb3IuYXR0ciwKKwkmZGV2X2F0dHJfcmVxdWVzdHNfY29tcGxldGVkLmF0dHIsCisJJmRldl9hdHRyX3JlcXVlc3RzX3RpbWVkb3V0LmF0dHIsCisJJmRldl9hdHRyX3RpbWVvdXQuYXR0ciwKKwkmZGV2X2F0dHJfb3V0c3RhbmRpbmdfb3BlcmF0aW9uc19tYXguYXR0ciwKKwkmZGV2X2F0dHJfdGltZW91dF9taW4uYXR0ciwKKwkmZGV2X2F0dHJfdGltZW91dF9tYXguYXR0ciwKKwlOVUxMLAorfTsKK0FUVFJJQlVURV9HUk9VUFMobG9vcGJhY2spOworCitzdGF0aWMgdm9pZCBnYl9sb29wYmFja19jYWxjdWxhdGVfc3RhdHMoc3RydWN0IGdiX2xvb3BiYWNrICpnYiwgYm9vbCBlcnJvcik7CisKK3N0YXRpYyB1MzIgZ2JfbG9vcGJhY2tfbnNlY190b191c2VjX2xhdGVuY3kodTY0IGVsYXBzZWRfbnNlY3MpCit7CisJdTMyIGxhdDsKKworCWRvX2RpdihlbGFwc2VkX25zZWNzLCBOU0VDX1BFUl9VU0VDKTsKKwlsYXQgPSBlbGFwc2VkX25zZWNzOworCXJldHVybiBsYXQ7Cit9CisKK3N0YXRpYyB1NjQgX19nYl9sb29wYmFja19jYWxjX2xhdGVuY3kodTY0IHQxLCB1NjQgdDIpCit7CisJaWYgKHQyID4gdDEpCisJCXJldHVybiB0MiAtIHQxOworCWVsc2UKKwkJcmV0dXJuIE5TRUNfUEVSX0RBWSAtIHQyICsgdDE7Cit9CisKK3N0YXRpYyB1NjQgZ2JfbG9vcGJhY2tfY2FsY19sYXRlbmN5KHN0cnVjdCB0aW1ldmFsICp0cywgc3RydWN0IHRpbWV2YWwgKnRlKQoreworCXU2NCB0MSwgdDI7CisKKwl0MSA9IHRpbWV2YWxfdG9fbnModHMpOworCXQyID0gdGltZXZhbF90b19ucyh0ZSk7CisKKwlyZXR1cm4gX19nYl9sb29wYmFja19jYWxjX2xhdGVuY3kodDEsIHQyKTsKK30KKworc3RhdGljIHZvaWQgZ2JfbG9vcGJhY2tfcHVzaF9sYXRlbmN5X3RzKHN0cnVjdCBnYl9sb29wYmFjayAqZ2IsCisJCQkJCXN0cnVjdCB0aW1ldmFsICp0cywgc3RydWN0IHRpbWV2YWwgKnRlKQoreworCWtmaWZvX2luKCZnYi0+a2ZpZm9fdHMsICh1bnNpZ25lZCBjaGFyICopdHMsIHNpemVvZigqdHMpKTsKKwlrZmlmb19pbigmZ2ItPmtmaWZvX3RzLCAodW5zaWduZWQgY2hhciAqKXRlLCBzaXplb2YoKnRlKSk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbG9vcGJhY2tfb3BlcmF0aW9uX3N5bmMoc3RydWN0IGdiX2xvb3BiYWNrICpnYiwgaW50IHR5cGUsCisJCQkJICAgICAgdm9pZCAqcmVxdWVzdCwgaW50IHJlcXVlc3Rfc2l6ZSwKKwkJCQkgICAgICB2b2lkICpyZXNwb25zZSwgaW50IHJlc3BvbnNlX3NpemUpCit7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCXN0cnVjdCB0aW1ldmFsIHRzLCB0ZTsKKwlpbnQgcmV0OworCisJZG9fZ2V0dGltZW9mZGF5KCZ0cyk7CisJb3BlcmF0aW9uID0gZ2Jfb3BlcmF0aW9uX2NyZWF0ZShnYi0+Y29ubmVjdGlvbiwgdHlwZSwgcmVxdWVzdF9zaXplLAorCQkJCQlyZXNwb25zZV9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9wZXJhdGlvbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAocmVxdWVzdF9zaXplKQorCQltZW1jcHkob3BlcmF0aW9uLT5yZXF1ZXN0LT5wYXlsb2FkLCByZXF1ZXN0LCByZXF1ZXN0X3NpemUpOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZF9zeW5jKG9wZXJhdGlvbik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZnYi0+Y29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkic3luY2hyb25vdXMgb3BlcmF0aW9uIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0X3B1dF9vcGVyYXRpb247CisJfSBlbHNlIHsKKwkJaWYgKHJlc3BvbnNlX3NpemUgPT0gb3BlcmF0aW9uLT5yZXNwb25zZS0+cGF5bG9hZF9zaXplKSB7CisJCQltZW1jcHkocmVzcG9uc2UsIG9wZXJhdGlvbi0+cmVzcG9uc2UtPnBheWxvYWQsCisJCQkgICAgICAgcmVzcG9uc2Vfc2l6ZSk7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKCZnYi0+Y29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkJInJlc3BvbnNlIHNpemUgJXp1IGV4cGVjdGVkICVkXG4iLAorCQkJCW9wZXJhdGlvbi0+cmVzcG9uc2UtPnBheWxvYWRfc2l6ZSwKKwkJCQlyZXNwb25zZV9zaXplKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9wdXRfb3BlcmF0aW9uOworCQl9CisJfQorCisJZG9fZ2V0dGltZW9mZGF5KCZ0ZSk7CisKKwkvKiBDYWxjdWxhdGUgdGhlIHRvdGFsIHRpbWUgdGhlIG1lc3NhZ2UgdG9vayAqLworCWdiX2xvb3BiYWNrX3B1c2hfbGF0ZW5jeV90cyhnYiwgJnRzLCAmdGUpOworCWdiLT5lbGFwc2VkX25zZWNzID0gZ2JfbG9vcGJhY2tfY2FsY19sYXRlbmN5KCZ0cywgJnRlKTsKKworb3V0X3B1dF9vcGVyYXRpb246CisJZ2Jfb3BlcmF0aW9uX3B1dChvcGVyYXRpb24pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19nYl9sb29wYmFja19hc3luY19vcGVyYXRpb25fZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uICpvcF9hc3luYzsKKworCW9wX2FzeW5jID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBnYl9sb29wYmFja19hc3luY19vcGVyYXRpb24sIGtyZWYpOworCisJbGlzdF9kZWwoJm9wX2FzeW5jLT5lbnRyeSk7CisJaWYgKG9wX2FzeW5jLT5vcGVyYXRpb24pCisJCWdiX29wZXJhdGlvbl9wdXQob3BfYXN5bmMtPm9wZXJhdGlvbik7CisJYXRvbWljX2RlYygmb3BfYXN5bmMtPmdiLT5vdXRzdGFuZGluZ19vcGVyYXRpb25zKTsKKwl3YWtlX3VwKCZvcF9hc3luYy0+Z2ItPndxX2NvbXBsZXRpb24pOworCWtmcmVlKG9wX2FzeW5jKTsKK30KKworc3RhdGljIHZvaWQgZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uX2dldChzdHJ1Y3QgZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uCisJCQkJCSAgICAqb3BfYXN5bmMpCit7CisJa3JlZl9nZXQoJm9wX2FzeW5jLT5rcmVmKTsKK30KKworc3RhdGljIHZvaWQgZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uX3B1dChzdHJ1Y3QgZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uCisJCQkJCSAgICAqb3BfYXN5bmMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZnYl9kZXYubG9jaywgZmxhZ3MpOworCWtyZWZfcHV0KCZvcF9hc3luYy0+a3JlZiwgX19nYl9sb29wYmFja19hc3luY19vcGVyYXRpb25fZGVzdHJveSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2JfZGV2LmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHN0cnVjdCBnYl9sb29wYmFja19hc3luY19vcGVyYXRpb24gKgorCWdiX2xvb3BiYWNrX29wZXJhdGlvbl9maW5kKHUxNiBpZCkKK3sKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uICpvcF9hc3luYzsKKwlib29sIGZvdW5kID0gZmFsc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZnYl9kZXYubG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkob3BfYXN5bmMsICZnYl9kZXYubGlzdF9vcF9hc3luYywgZW50cnkpIHsKKwkJaWYgKG9wX2FzeW5jLT5vcGVyYXRpb24tPmlkID09IGlkKSB7CisJCQlnYl9sb29wYmFja19hc3luY19vcGVyYXRpb25fZ2V0KG9wX2FzeW5jKTsKKwkJCWZvdW5kID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdiX2Rldi5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZm91bmQgPyBvcF9hc3luYyA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xvb3BiYWNrX2FzeW5jX3dhaXRfYWxsKHN0cnVjdCBnYl9sb29wYmFjayAqZ2IpCit7CisJd2FpdF9ldmVudChnYi0+d3FfY29tcGxldGlvbiwKKwkJICAgIWF0b21pY19yZWFkKCZnYi0+b3V0c3RhbmRpbmdfb3BlcmF0aW9ucykpOworfQorCitzdGF0aWMgdm9pZCBnYl9sb29wYmFja19hc3luY19vcGVyYXRpb25fY2FsbGJhY2soc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKQoreworCXN0cnVjdCBnYl9sb29wYmFja19hc3luY19vcGVyYXRpb24gKm9wX2FzeW5jOworCXN0cnVjdCBnYl9sb29wYmFjayAqZ2I7CisJc3RydWN0IHRpbWV2YWwgdGU7CisJYm9vbCBlcnIgPSBmYWxzZTsKKworCWRvX2dldHRpbWVvZmRheSgmdGUpOworCW9wX2FzeW5jID0gZ2JfbG9vcGJhY2tfb3BlcmF0aW9uX2ZpbmQob3BlcmF0aW9uLT5pZCk7CisJaWYgKCFvcF9hc3luYykKKwkJcmV0dXJuOworCisJZ2IgPSBvcF9hc3luYy0+Z2I7CisJbXV0ZXhfbG9jaygmZ2ItPm11dGV4KTsKKworCWlmICghb3BfYXN5bmMtPnBlbmRpbmcgfHwgZ2Jfb3BlcmF0aW9uX3Jlc3VsdChvcGVyYXRpb24pKSB7CisJCWVyciA9IHRydWU7CisJfSBlbHNlIHsKKwkJaWYgKG9wX2FzeW5jLT5jb21wbGV0aW9uKQorCQkJaWYgKG9wX2FzeW5jLT5jb21wbGV0aW9uKG9wX2FzeW5jKSkKKwkJCQllcnIgPSB0cnVlOworCX0KKworCWlmICghZXJyKSB7CisJCWdiX2xvb3BiYWNrX3B1c2hfbGF0ZW5jeV90cyhnYiwgJm9wX2FzeW5jLT50cywgJnRlKTsKKwkJZ2ItPmVsYXBzZWRfbnNlY3MgPSBnYl9sb29wYmFja19jYWxjX2xhdGVuY3koJm9wX2FzeW5jLT50cywKKwkJCQkJCQkgICAgICZ0ZSk7CisJfQorCisJaWYgKG9wX2FzeW5jLT5wZW5kaW5nKSB7CisJCWlmIChlcnIpCisJCQlnYi0+ZXJyb3IrKzsKKwkJZ2ItPml0ZXJhdGlvbl9jb3VudCsrOworCQlvcF9hc3luYy0+cGVuZGluZyA9IGZhbHNlOworCQlkZWxfdGltZXJfc3luYygmb3BfYXN5bmMtPnRpbWVyKTsKKwkJZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uX3B1dChvcF9hc3luYyk7CisJCWdiX2xvb3BiYWNrX2NhbGN1bGF0ZV9zdGF0cyhnYiwgZXJyKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZnYi0+bXV0ZXgpOworCisJZGV2X2RiZygmZ2ItPmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LCAiY29tcGxldGUgb3BlcmF0aW9uICVkXG4iLAorCQlvcGVyYXRpb24tPmlkKTsKKworCWdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbl9wdXQob3BfYXN5bmMpOworfQorCitzdGF0aWMgdm9pZCBnYl9sb29wYmFja19hc3luY19vcGVyYXRpb25fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGdiX2xvb3BiYWNrICpnYjsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJc3RydWN0IGdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbiAqb3BfYXN5bmM7CisKKwlvcF9hc3luYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uLCB3b3JrKTsKKwlnYiA9IG9wX2FzeW5jLT5nYjsKKwlvcGVyYXRpb24gPSBvcF9hc3luYy0+b3BlcmF0aW9uOworCisJbXV0ZXhfbG9jaygmZ2ItPm11dGV4KTsKKwlpZiAob3BfYXN5bmMtPnBlbmRpbmcpIHsKKwkJZ2ItPnJlcXVlc3RzX3RpbWVkb3V0Kys7CisJCWdiLT5lcnJvcisrOworCQlnYi0+aXRlcmF0aW9uX2NvdW50Kys7CisJCW9wX2FzeW5jLT5wZW5kaW5nID0gZmFsc2U7CisJCWdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbl9wdXQob3BfYXN5bmMpOworCQlnYl9sb29wYmFja19jYWxjdWxhdGVfc3RhdHMoZ2IsIHRydWUpOworCX0KKwltdXRleF91bmxvY2soJmdiLT5tdXRleCk7CisKKwlkZXZfZGJnKCZnYi0+Y29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsICJ0aW1lb3V0IG9wZXJhdGlvbiAlZFxuIiwKKwkJb3BlcmF0aW9uLT5pZCk7CisKKwlnYl9vcGVyYXRpb25fY2FuY2VsKG9wZXJhdGlvbiwgLUVUSU1FRE9VVCk7CisJZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uX3B1dChvcF9hc3luYyk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbl90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uICpvcF9hc3luYzsKKwl1MTYgaWQgPSBkYXRhOworCisJb3BfYXN5bmMgPSBnYl9sb29wYmFja19vcGVyYXRpb25fZmluZChpZCk7CisJaWYgKCFvcF9hc3luYykgeworCQlwcl9lcnIoIm9wZXJhdGlvbiAlZCBub3QgZm91bmQgLSB0aW1lIG91dCA/XG4iLCBpZCk7CisJCXJldHVybjsKKwl9CisJc2NoZWR1bGVfd29yaygmb3BfYXN5bmMtPndvcmspOworfQorCitzdGF0aWMgaW50IGdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbihzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiLCBpbnQgdHlwZSwKKwkJCQkgICAgICAgdm9pZCAqcmVxdWVzdCwgaW50IHJlcXVlc3Rfc2l6ZSwKKwkJCQkgICAgICAgaW50IHJlc3BvbnNlX3NpemUsCisJCQkJICAgICAgIHZvaWQgKmNvbXBsZXRpb24pCit7CisJc3RydWN0IGdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbiAqb3BfYXN5bmM7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW9wX2FzeW5jID0ga3phbGxvYyhzaXplb2YoKm9wX2FzeW5jKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvcF9hc3luYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlJTklUX1dPUksoJm9wX2FzeW5jLT53b3JrLCBnYl9sb29wYmFja19hc3luY19vcGVyYXRpb25fd29yayk7CisJa3JlZl9pbml0KCZvcF9hc3luYy0+a3JlZik7CisKKwlvcGVyYXRpb24gPSBnYl9vcGVyYXRpb25fY3JlYXRlKGdiLT5jb25uZWN0aW9uLCB0eXBlLCByZXF1ZXN0X3NpemUsCisJCQkJCXJlc3BvbnNlX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghb3BlcmF0aW9uKSB7CisJCWtmcmVlKG9wX2FzeW5jKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKHJlcXVlc3Rfc2l6ZSkKKwkJbWVtY3B5KG9wZXJhdGlvbi0+cmVxdWVzdC0+cGF5bG9hZCwgcmVxdWVzdCwgcmVxdWVzdF9zaXplKTsKKworCW9wX2FzeW5jLT5nYiA9IGdiOworCW9wX2FzeW5jLT5vcGVyYXRpb24gPSBvcGVyYXRpb247CisJb3BfYXN5bmMtPmNvbXBsZXRpb24gPSBjb21wbGV0aW9uOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdiX2Rldi5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmb3BfYXN5bmMtPmVudHJ5LCAmZ2JfZGV2Lmxpc3Rfb3BfYXN5bmMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdiX2Rldi5sb2NrLCBmbGFncyk7CisKKwlkb19nZXR0aW1lb2ZkYXkoJm9wX2FzeW5jLT50cyk7CisJb3BfYXN5bmMtPnBlbmRpbmcgPSB0cnVlOworCWF0b21pY19pbmMoJmdiLT5vdXRzdGFuZGluZ19vcGVyYXRpb25zKTsKKwltdXRleF9sb2NrKCZnYi0+bXV0ZXgpOworCXJldCA9IGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmQob3BlcmF0aW9uLAorCQkJCQlnYl9sb29wYmFja19hc3luY19vcGVyYXRpb25fY2FsbGJhY2ssCisJCQkJCUdGUF9LRVJORUwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlzZXR1cF90aW1lcigmb3BfYXN5bmMtPnRpbWVyLCBnYl9sb29wYmFja19hc3luY19vcGVyYXRpb25fdGltZW91dCwKKwkJCSh1bnNpZ25lZCBsb25nKW9wZXJhdGlvbi0+aWQpOworCW9wX2FzeW5jLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIGdiLT5qaWZmeV90aW1lb3V0OworCWFkZF90aW1lcigmb3BfYXN5bmMtPnRpbWVyKTsKKworCWdvdG8gZG9uZTsKK2Vycm9yOgorCWdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbl9wdXQob3BfYXN5bmMpOworZG9uZToKKwltdXRleF91bmxvY2soJmdiLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9sb29wYmFja19zeW5jX3Npbmsoc3RydWN0IGdiX2xvb3BiYWNrICpnYiwgdTMyIGxlbikKK3sKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2tfdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdDsKKwlpbnQgcmV0dmFsOworCisJcmVxdWVzdCA9IGttYWxsb2MobGVuICsgc2l6ZW9mKCpyZXF1ZXN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXF1ZXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcXVlc3QtPmxlbiA9IGNwdV90b19sZTMyKGxlbik7CisJcmV0dmFsID0gZ2JfbG9vcGJhY2tfb3BlcmF0aW9uX3N5bmMoZ2IsIEdCX0xPT1BCQUNLX1RZUEVfU0lOSywKKwkJCQkJICAgIHJlcXVlc3QsIGxlbiArIHNpemVvZigqcmVxdWVzdCksCisJCQkJCSAgICBOVUxMLCAwKTsKKwlrZnJlZShyZXF1ZXN0KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGdiX2xvb3BiYWNrX3N5bmNfdHJhbnNmZXIoc3RydWN0IGdiX2xvb3BiYWNrICpnYiwgdTMyIGxlbikKK3sKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2tfdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2tfdHJhbnNmZXJfcmVzcG9uc2UgKnJlc3BvbnNlOworCWludCByZXR2YWw7CisKKwlnYi0+YXBicmlkZ2VfbGF0ZW5jeV90cyA9IDA7CisJZ2ItPmdicGh5X2xhdGVuY3lfdHMgPSAwOworCisJcmVxdWVzdCA9IGttYWxsb2MobGVuICsgc2l6ZW9mKCpyZXF1ZXN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXF1ZXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXNwb25zZSA9IGttYWxsb2MobGVuICsgc2l6ZW9mKCpyZXNwb25zZSksIEdGUF9LRVJORUwpOworCWlmICghcmVzcG9uc2UpIHsKKwkJa2ZyZWUocmVxdWVzdCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChyZXF1ZXN0LT5kYXRhLCAweDVBLCBsZW4pOworCisJcmVxdWVzdC0+bGVuID0gY3B1X3RvX2xlMzIobGVuKTsKKwlyZXR2YWwgPSBnYl9sb29wYmFja19vcGVyYXRpb25fc3luYyhnYiwgR0JfTE9PUEJBQ0tfVFlQRV9UUkFOU0ZFUiwKKwkJCQkJICAgIHJlcXVlc3QsIGxlbiArIHNpemVvZigqcmVxdWVzdCksCisJCQkJCSAgICByZXNwb25zZSwgbGVuICsgc2l6ZW9mKCpyZXNwb25zZSkpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZ2JfZXJyb3I7CisKKwlpZiAobWVtY21wKHJlcXVlc3QtPmRhdGEsIHJlc3BvbnNlLT5kYXRhLCBsZW4pKSB7CisJCWRldl9lcnIoJmdiLT5jb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCSJMb29wYmFjayBEYXRhIGRvZXNuJ3QgbWF0Y2hcbiIpOworCQlyZXR2YWwgPSAtRVJFTU9URUlPOworCX0KKwlnYi0+YXBicmlkZ2VfbGF0ZW5jeV90cyA9ICh1MzIpX19sZTMyX3RvX2NwdShyZXNwb25zZS0+cmVzZXJ2ZWQwKTsKKwlnYi0+Z2JwaHlfbGF0ZW5jeV90cyA9ICh1MzIpX19sZTMyX3RvX2NwdShyZXNwb25zZS0+cmVzZXJ2ZWQxKTsKKworZ2JfZXJyb3I6CisJa2ZyZWUocmVxdWVzdCk7CisJa2ZyZWUocmVzcG9uc2UpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBnYl9sb29wYmFja19zeW5jX3Bpbmcoc3RydWN0IGdiX2xvb3BiYWNrICpnYikKK3sKKwlyZXR1cm4gZ2JfbG9vcGJhY2tfb3BlcmF0aW9uX3N5bmMoZ2IsIEdCX0xPT1BCQUNLX1RZUEVfUElORywKKwkJCQkJICBOVUxMLCAwLCBOVUxMLCAwKTsKK30KKworc3RhdGljIGludCBnYl9sb29wYmFja19hc3luY19zaW5rKHN0cnVjdCBnYl9sb29wYmFjayAqZ2IsIHUzMiBsZW4pCit7CisJc3RydWN0IGdiX2xvb3BiYWNrX3RyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3Q7CisJaW50IHJldHZhbDsKKworCXJlcXVlc3QgPSBrbWFsbG9jKGxlbiArIHNpemVvZigqcmVxdWVzdCksIEdGUF9LRVJORUwpOworCWlmICghcmVxdWVzdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXF1ZXN0LT5sZW4gPSBjcHVfdG9fbGUzMihsZW4pOworCXJldHZhbCA9IGdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbihnYiwgR0JfTE9PUEJBQ0tfVFlQRV9TSU5LLAorCQkJCQkgICAgIHJlcXVlc3QsIGxlbiArIHNpemVvZigqcmVxdWVzdCksCisJCQkJCSAgICAgMCwgTlVMTCk7CisJa2ZyZWUocmVxdWVzdCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBnYl9sb29wYmFja19hc3luY190cmFuc2Zlcl9jb21wbGV0ZSgKKwkJCQlzdHJ1Y3QgZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uICpvcF9hc3luYykKK3sKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiOworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2tfdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2tfdHJhbnNmZXJfcmVzcG9uc2UgKnJlc3BvbnNlOworCXNpemVfdCBsZW47CisJaW50IHJldHZhbCA9IDA7CisKKwlnYiA9IG9wX2FzeW5jLT5nYjsKKwlvcGVyYXRpb24gPSBvcF9hc3luYy0+b3BlcmF0aW9uOworCXJlcXVlc3QgPSBvcGVyYXRpb24tPnJlcXVlc3QtPnBheWxvYWQ7CisJcmVzcG9uc2UgPSBvcGVyYXRpb24tPnJlc3BvbnNlLT5wYXlsb2FkOworCWxlbiA9IGxlMzJfdG9fY3B1KHJlcXVlc3QtPmxlbik7CisKKwlpZiAobWVtY21wKHJlcXVlc3QtPmRhdGEsIHJlc3BvbnNlLT5kYXRhLCBsZW4pKSB7CisJCWRldl9lcnIoJmdiLT5jb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCSJMb29wYmFjayBEYXRhIGRvZXNuJ3QgbWF0Y2ggb3BlcmF0aW9uIGlkICVkXG4iLAorCQkJb3BlcmF0aW9uLT5pZCk7CisJCXJldHZhbCA9IC1FUkVNT1RFSU87CisJfSBlbHNlIHsKKwkJZ2ItPmFwYnJpZGdlX2xhdGVuY3lfdHMgPQorCQkJKHUzMilfX2xlMzJfdG9fY3B1KHJlc3BvbnNlLT5yZXNlcnZlZDApOworCQlnYi0+Z2JwaHlfbGF0ZW5jeV90cyA9CisJCQkodTMyKV9fbGUzMl90b19jcHUocmVzcG9uc2UtPnJlc2VydmVkMSk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBnYl9sb29wYmFja19hc3luY190cmFuc2ZlcihzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiLCB1MzIgbGVuKQoreworCXN0cnVjdCBnYl9sb29wYmFja190cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0OworCWludCByZXR2YWwsIHJlc3BvbnNlX2xlbjsKKworCXJlcXVlc3QgPSBrbWFsbG9jKGxlbiArIHNpemVvZigqcmVxdWVzdCksIEdGUF9LRVJORUwpOworCWlmICghcmVxdWVzdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQocmVxdWVzdC0+ZGF0YSwgMHg1QSwgbGVuKTsKKworCXJlcXVlc3QtPmxlbiA9IGNwdV90b19sZTMyKGxlbik7CisJcmVzcG9uc2VfbGVuID0gc2l6ZW9mKHN0cnVjdCBnYl9sb29wYmFja190cmFuc2Zlcl9yZXNwb25zZSk7CisJcmV0dmFsID0gZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uKGdiLCBHQl9MT09QQkFDS19UWVBFX1RSQU5TRkVSLAorCQkJCQkgICAgIHJlcXVlc3QsIGxlbiArIHNpemVvZigqcmVxdWVzdCksCisJCQkJCSAgICAgbGVuICsgcmVzcG9uc2VfbGVuLAorCQkJCQkgICAgIGdiX2xvb3BiYWNrX2FzeW5jX3RyYW5zZmVyX2NvbXBsZXRlKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGdiX2Vycm9yOworCitnYl9lcnJvcjoKKwlrZnJlZShyZXF1ZXN0KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGdiX2xvb3BiYWNrX2FzeW5jX3Bpbmcoc3RydWN0IGdiX2xvb3BiYWNrICpnYikKK3sKKwlyZXR1cm4gZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uKGdiLCBHQl9MT09QQkFDS19UWVBFX1BJTkcsCisJCQkJCSAgIE5VTEwsIDAsIDAsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGdiX2xvb3BiYWNrX3JlcXVlc3RfaGFuZGxlcihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24pCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcGVyYXRpb24tPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX2xvb3BiYWNrX3RyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdiX2xvb3BiYWNrX3RyYW5zZmVyX3Jlc3BvbnNlICpyZXNwb25zZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXY7CisJc2l6ZV90IGxlbjsKKworCS8qIEJ5IGNvbnZlbnRpb24sIHRoZSBBUCBpbml0aWF0ZXMgdGhlIHZlcnNpb24gb3BlcmF0aW9uICovCisJc3dpdGNoIChvcGVyYXRpb24tPnR5cGUpIHsKKwljYXNlIEdCX0xPT1BCQUNLX1RZUEVfUElORzoKKwljYXNlIEdCX0xPT1BCQUNLX1RZUEVfU0lOSzoKKwkJcmV0dXJuIDA7CisJY2FzZSBHQl9MT09QQkFDS19UWVBFX1RSQU5TRkVSOgorCQlpZiAob3BlcmF0aW9uLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUgPCBzaXplb2YoKnJlcXVlc3QpKSB7CisJCQlkZXZfZXJyKGRldiwgInRyYW5zZmVyIHJlcXVlc3QgdG9vIHNtYWxsICglenUgPCAlenUpXG4iLAorCQkJCW9wZXJhdGlvbi0+cmVxdWVzdC0+cGF5bG9hZF9zaXplLAorCQkJCXNpemVvZigqcmVxdWVzdCkpOworCQkJcmV0dXJuIC1FSU5WQUw7CS8qIC1FTVNHU0laRSAqLworCQl9CisJCXJlcXVlc3QgPSBvcGVyYXRpb24tPnJlcXVlc3QtPnBheWxvYWQ7CisJCWxlbiA9IGxlMzJfdG9fY3B1KHJlcXVlc3QtPmxlbik7CisJCWlmIChsZW4gPiBnYl9kZXYuc2l6ZV9tYXgpIHsKKwkJCWRldl9lcnIoZGV2LCAidHJhbnNmZXIgcmVxdWVzdCB0b28gbGFyZ2UgKCV6dSA+ICV6dSlcbiIsCisJCQkJbGVuLCBnYl9kZXYuc2l6ZV9tYXgpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoIWdiX29wZXJhdGlvbl9yZXNwb25zZV9hbGxvYyhvcGVyYXRpb24sCisJCQkJbGVuICsgc2l6ZW9mKCpyZXNwb25zZSksIEdGUF9LRVJORUwpKSB7CisJCQlkZXZfZXJyKGRldiwgImVycm9yIGFsbG9jYXRpbmcgcmVzcG9uc2VcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJcmVzcG9uc2UgPSBvcGVyYXRpb24tPnJlc3BvbnNlLT5wYXlsb2FkOworCQlyZXNwb25zZS0+bGVuID0gY3B1X3RvX2xlMzIobGVuKTsKKwkJaWYgKGxlbikKKwkJCW1lbWNweShyZXNwb25zZS0+ZGF0YSwgcmVxdWVzdC0+ZGF0YSwgbGVuKTsKKworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgInVuc3VwcG9ydGVkIHJlcXVlc3Q6ICV1XG4iLCBvcGVyYXRpb24tPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xvb3BiYWNrX3Jlc2V0X3N0YXRzKHN0cnVjdCBnYl9sb29wYmFjayAqZ2IpCit7CisJc3RydWN0IGdiX2xvb3BiYWNrX3N0YXRzIHJlc2V0ID0geworCQkubWluID0gVTMyX01BWCwKKwl9OworCisJLyogUmVzZXQgcGVyLWNvbm5lY3Rpb24gc3RhdHMgKi8KKwltZW1jcHkoJmdiLT5sYXRlbmN5LCAmcmVzZXQsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgZ2JfbG9vcGJhY2tfc3RhdHMpKTsKKwltZW1jcHkoJmdiLT50aHJvdWdocHV0LCAmcmVzZXQsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgZ2JfbG9vcGJhY2tfc3RhdHMpKTsKKwltZW1jcHkoJmdiLT5yZXF1ZXN0c19wZXJfc2Vjb25kLCAmcmVzZXQsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgZ2JfbG9vcGJhY2tfc3RhdHMpKTsKKwltZW1jcHkoJmdiLT5hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeSwgJnJlc2V0LAorCSAgICAgICBzaXplb2Yoc3RydWN0IGdiX2xvb3BiYWNrX3N0YXRzKSk7CisJbWVtY3B5KCZnYi0+Z2JwaHlfZmlybXdhcmVfbGF0ZW5jeSwgJnJlc2V0LAorCSAgICAgICBzaXplb2Yoc3RydWN0IGdiX2xvb3BiYWNrX3N0YXRzKSk7CisKKwkvKiBTaG91bGQgYmUgaW5pdGlhbGl6ZWQgYXQgbGVhc3Qgb25jZSBwZXIgdHJhbnNhY3Rpb24gc2V0ICovCisJZ2ItPmFwYnJpZGdlX2xhdGVuY3lfdHMgPSAwOworCWdiLT5nYnBoeV9sYXRlbmN5X3RzID0gMDsKKwltZW1zZXQoJmdiLT50cywgMCwgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xvb3BiYWNrX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgZ2JfbG9vcGJhY2tfc3RhdHMgKnN0YXRzLCB1MzIgdmFsKQoreworCWlmIChzdGF0cy0+bWluID4gdmFsKQorCQlzdGF0cy0+bWluID0gdmFsOworCWlmIChzdGF0cy0+bWF4IDwgdmFsKQorCQlzdGF0cy0+bWF4ID0gdmFsOworCXN0YXRzLT5zdW0gKz0gdmFsOworCXN0YXRzLT5jb3VudCsrOworfQorCitzdGF0aWMgdm9pZCBnYl9sb29wYmFja191cGRhdGVfc3RhdHNfd2luZG93KHN0cnVjdCBnYl9sb29wYmFja19zdGF0cyAqc3RhdHMsCisJCQkJCSAgICB1NjQgdmFsLCB1MzIgY291bnQpCit7CisJc3RhdHMtPnN1bSArPSB2YWw7CisJc3RhdHMtPmNvdW50ICs9IGNvdW50OworCisJZG9fZGl2KHZhbCwgY291bnQpOworCWlmIChzdGF0cy0+bWluID4gdmFsKQorCQlzdGF0cy0+bWluID0gdmFsOworCWlmIChzdGF0cy0+bWF4IDwgdmFsKQorCQlzdGF0cy0+bWF4ID0gdmFsOworfQorCitzdGF0aWMgdm9pZCBnYl9sb29wYmFja19yZXF1ZXN0c191cGRhdGUoc3RydWN0IGdiX2xvb3BiYWNrICpnYiwgdTMyIGxhdGVuY3kpCit7CisJdTY0IHJlcSA9IGdiLT5yZXF1ZXN0c19jb21wbGV0ZWQgKiBVU0VDX1BFUl9TRUM7CisKKwlnYl9sb29wYmFja191cGRhdGVfc3RhdHNfd2luZG93KCZnYi0+cmVxdWVzdHNfcGVyX3NlY29uZCwgcmVxLCBsYXRlbmN5KTsKK30KKworc3RhdGljIHZvaWQgZ2JfbG9vcGJhY2tfdGhyb3VnaHB1dF91cGRhdGUoc3RydWN0IGdiX2xvb3BiYWNrICpnYiwgdTMyIGxhdGVuY3kpCit7CisJdTY0IGFnZ3JlZ2F0ZV9zaXplID0gc2l6ZW9mKHN0cnVjdCBnYl9vcGVyYXRpb25fbXNnX2hkcikgKiAyOworCisJc3dpdGNoIChnYi0+dHlwZSkgeworCWNhc2UgR0JfTE9PUEJBQ0tfVFlQRV9QSU5HOgorCQlicmVhazsKKwljYXNlIEdCX0xPT1BCQUNLX1RZUEVfU0lOSzoKKwkJYWdncmVnYXRlX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBnYl9sb29wYmFja190cmFuc2Zlcl9yZXF1ZXN0KSArCisJCQkJICBnYi0+c2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBHQl9MT09QQkFDS19UWVBFX1RSQU5TRkVSOgorCQlhZ2dyZWdhdGVfc2l6ZSArPSBzaXplb2Yoc3RydWN0IGdiX2xvb3BiYWNrX3RyYW5zZmVyX3JlcXVlc3QpICsKKwkJCQkgIHNpemVvZihzdHJ1Y3QgZ2JfbG9vcGJhY2tfdHJhbnNmZXJfcmVzcG9uc2UpICsKKwkJCQkgIGdiLT5zaXplICogMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCWFnZ3JlZ2F0ZV9zaXplICo9IGdiLT5yZXF1ZXN0c19jb21wbGV0ZWQ7CisJYWdncmVnYXRlX3NpemUgKj0gVVNFQ19QRVJfU0VDOworCWdiX2xvb3BiYWNrX3VwZGF0ZV9zdGF0c193aW5kb3coJmdiLT50aHJvdWdocHV0LCBhZ2dyZWdhdGVfc2l6ZSwKKwkJCQkJbGF0ZW5jeSk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xvb3BiYWNrX2NhbGN1bGF0ZV9sYXRlbmN5X3N0YXRzKHN0cnVjdCBnYl9sb29wYmFjayAqZ2IpCit7CisJdTMyIGxhdDsKKworCS8qIEV4cHJlc3MgbGF0ZW5jeSBpbiB0ZXJtcyBvZiBtaWNyb3NlY29uZHMgKi8KKwlsYXQgPSBnYl9sb29wYmFja19uc2VjX3RvX3VzZWNfbGF0ZW5jeShnYi0+ZWxhcHNlZF9uc2Vjcyk7CisKKwkvKiBMb2cgbGF0ZW5jeSBzdGFzdGljICovCisJZ2JfbG9vcGJhY2tfdXBkYXRlX3N0YXRzKCZnYi0+bGF0ZW5jeSwgbGF0KTsKKworCS8qIFJhdyBsYXRlbmN5IGxvZyBvbiBhIHBlciB0aHJlYWQgYmFzaXMgKi8KKwlrZmlmb19pbigmZ2ItPmtmaWZvX2xhdCwgKHVuc2lnbmVkIGNoYXIgKikmbGF0LCBzaXplb2YobGF0KSk7CisKKwkvKiBMb2cgdGhlIGZpcm13YXJlIHN1cHBsaWVkIGxhdGVuY3kgdmFsdWVzICovCisJZ2JfbG9vcGJhY2tfdXBkYXRlX3N0YXRzKCZnYi0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3ksCisJCQkJIGdiLT5hcGJyaWRnZV9sYXRlbmN5X3RzKTsKKwlnYl9sb29wYmFja191cGRhdGVfc3RhdHMoJmdiLT5nYnBoeV9maXJtd2FyZV9sYXRlbmN5LAorCQkJCSBnYi0+Z2JwaHlfbGF0ZW5jeV90cyk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xvb3BiYWNrX2NhbGN1bGF0ZV9zdGF0cyhzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiLCBib29sIGVycm9yKQoreworCXU2NCBubGF0OworCXUzMiBsYXQ7CisJc3RydWN0IHRpbWV2YWwgdGU7CisKKwlpZiAoIWVycm9yKSB7CisJCWdiLT5yZXF1ZXN0c19jb21wbGV0ZWQrKzsKKwkJZ2JfbG9vcGJhY2tfY2FsY3VsYXRlX2xhdGVuY3lfc3RhdHMoZ2IpOworCX0KKworCWRvX2dldHRpbWVvZmRheSgmdGUpOworCW5sYXQgPSBnYl9sb29wYmFja19jYWxjX2xhdGVuY3koJmdiLT50cywgJnRlKTsKKwlpZiAobmxhdCA+PSBOU0VDX1BFUl9TRUMgfHwgZ2ItPml0ZXJhdGlvbl9jb3VudCA9PSBnYi0+aXRlcmF0aW9uX21heCkgeworCQlsYXQgPSBnYl9sb29wYmFja19uc2VjX3RvX3VzZWNfbGF0ZW5jeShubGF0KTsKKworCQlnYl9sb29wYmFja190aHJvdWdocHV0X3VwZGF0ZShnYiwgbGF0KTsKKwkJZ2JfbG9vcGJhY2tfcmVxdWVzdHNfdXBkYXRlKGdiLCBsYXQpOworCisJCWlmIChnYi0+aXRlcmF0aW9uX2NvdW50ICE9IGdiLT5pdGVyYXRpb25fbWF4KSB7CisJCQlnYi0+dHMgPSB0ZTsKKwkJCWdiLT5yZXF1ZXN0c19jb21wbGV0ZWQgPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBnYl9sb29wYmFja19hc3luY193YWl0X3RvX3NlbmQoc3RydWN0IGdiX2xvb3BiYWNrICpnYikKK3sKKwlpZiAoIShnYi0+YXN5bmMgJiYgZ2ItPm91dHN0YW5kaW5nX29wZXJhdGlvbnNfbWF4KSkKKwkJcmV0dXJuOworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShnYi0+d3FfY29tcGxldGlvbiwKKwkJCQkgKGF0b21pY19yZWFkKCZnYi0+b3V0c3RhbmRpbmdfb3BlcmF0aW9ucykgPAorCQkJCSAgZ2ItPm91dHN0YW5kaW5nX29wZXJhdGlvbnNfbWF4KSB8fAorCQkJCSAga3RocmVhZF9zaG91bGRfc3RvcCgpKTsKK30KKworc3RhdGljIGludCBnYl9sb29wYmFja19mbih2b2lkICpkYXRhKQoreworCWludCBlcnJvciA9IDA7CisJaW50IHVzX3dhaXQgPSAwOworCWludCB0eXBlOworCWludCByZXQ7CisJdTMyIHNpemU7CisKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiID0gZGF0YTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSBnYi0+Y29ubmVjdGlvbi0+YnVuZGxlOworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoIWdiLT50eXBlKSB7CisJCQlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGdiLT53cSwgZ2ItPnR5cGUgfHwKKwkJCQkJCSBrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOworCQkJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJCWJyZWFrOworCisJCS8qIExpbWl0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbi1mbGlnaHQgYXN5bmMgb3BlcmF0aW9ucyAqLworCQlnYl9sb29wYmFja19hc3luY193YWl0X3RvX3NlbmQoZ2IpOworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJYnJlYWs7CisKKwkJbXV0ZXhfbG9jaygmZ2ItPm11dGV4KTsKKworCQkvKiBPcHRpb25hbGx5IHRlcm1pbmF0ZSAqLworCQlpZiAoZ2ItPnNlbmRfY291bnQgPT0gZ2ItPml0ZXJhdGlvbl9tYXgpIHsKKwkJCWlmIChnYi0+aXRlcmF0aW9uX2NvdW50ID09IGdiLT5pdGVyYXRpb25fbWF4KSB7CisJCQkJZ2ItPnR5cGUgPSAwOworCQkJCWdiLT5zZW5kX2NvdW50ID0gMDsKKwkJCQlzeXNmc19ub3RpZnkoJmdiLT5kZXYtPmtvYmosICBOVUxMLAorCQkJCQkJIml0ZXJhdGlvbl9jb3VudCIpOworCQkJfQorCQkJbXV0ZXhfdW5sb2NrKCZnYi0+bXV0ZXgpOworCQkJY29udGludWU7CisJCX0KKwkJc2l6ZSA9IGdiLT5zaXplOworCQl1c193YWl0ID0gZ2ItPnVzX3dhaXQ7CisJCXR5cGUgPSBnYi0+dHlwZTsKKwkJaWYgKGdiLT50cy50dl91c2VjID09IDAgJiYgZ2ItPnRzLnR2X3NlYyA9PSAwKQorCQkJZG9fZ2V0dGltZW9mZGF5KCZnYi0+dHMpOworCQltdXRleF91bmxvY2soJmdiLT5tdXRleCk7CisKKwkJLyogRWxzZSBvcGVyYXRpb25zIHRvIHBlcmZvcm0gKi8KKwkJaWYgKGdiLT5hc3luYykgeworCQkJaWYgKHR5cGUgPT0gR0JfTE9PUEJBQ0tfVFlQRV9QSU5HKSB7CisJCQkJZXJyb3IgPSBnYl9sb29wYmFja19hc3luY19waW5nKGdiKTsKKwkJCX0gZWxzZSBpZiAodHlwZSA9PSBHQl9MT09QQkFDS19UWVBFX1RSQU5TRkVSKSB7CisJCQkJZXJyb3IgPSBnYl9sb29wYmFja19hc3luY190cmFuc2ZlcihnYiwgc2l6ZSk7CisJCQl9IGVsc2UgaWYgKHR5cGUgPT0gR0JfTE9PUEJBQ0tfVFlQRV9TSU5LKSB7CisJCQkJZXJyb3IgPSBnYl9sb29wYmFja19hc3luY19zaW5rKGdiLCBzaXplKTsKKwkJCX0KKworCQkJaWYgKGVycm9yKQorCQkJCWdiLT5lcnJvcisrOworCQl9IGVsc2UgeworCQkJLyogV2UgYXJlIGVmZmVjdGl2ZWx5IHNpbmdsZSB0aHJlYWRlZCBoZXJlICovCisJCQlpZiAodHlwZSA9PSBHQl9MT09QQkFDS19UWVBFX1BJTkcpCisJCQkJZXJyb3IgPSBnYl9sb29wYmFja19zeW5jX3BpbmcoZ2IpOworCQkJZWxzZSBpZiAodHlwZSA9PSBHQl9MT09QQkFDS19UWVBFX1RSQU5TRkVSKQorCQkJCWVycm9yID0gZ2JfbG9vcGJhY2tfc3luY190cmFuc2ZlcihnYiwgc2l6ZSk7CisJCQllbHNlIGlmICh0eXBlID09IEdCX0xPT1BCQUNLX1RZUEVfU0lOSykKKwkJCQllcnJvciA9IGdiX2xvb3BiYWNrX3N5bmNfc2luayhnYiwgc2l6ZSk7CisKKwkJCWlmIChlcnJvcikKKwkJCQlnYi0+ZXJyb3IrKzsKKwkJCWdiLT5pdGVyYXRpb25fY291bnQrKzsKKwkJCWdiX2xvb3BiYWNrX2NhbGN1bGF0ZV9zdGF0cyhnYiwgISFlcnJvcik7CisJCX0KKwkJZ2ItPnNlbmRfY291bnQrKzsKKwkJaWYgKHVzX3dhaXQpCisJCQl1ZGVsYXkodXNfd2FpdCk7CisJfQorCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2xvb3BiYWNrX2RiZ2ZzX2xhdGVuY3lfc2hvd19jb21tb24oc3RydWN0IHNlcV9maWxlICpzLAorCQkJCQkJIHN0cnVjdCBrZmlmbyAqa2ZpZm8sCisJCQkJCQkgc3RydWN0IG11dGV4ICptdXRleCkKK3sKKwl1MzIgbGF0ZW5jeTsKKwlpbnQgcmV0dmFsOworCisJaWYgKGtmaWZvX2xlbihrZmlmbykgPT0gMCkgeworCQlyZXR2YWwgPSAtRUFHQUlOOworCQlnb3RvIGRvbmU7CisJfQorCisJbXV0ZXhfbG9jayhtdXRleCk7CisJcmV0dmFsID0ga2ZpZm9fb3V0KGtmaWZvLCAmbGF0ZW5jeSwgc2l6ZW9mKGxhdGVuY3kpKTsKKwlpZiAocmV0dmFsID4gMCkgeworCQlzZXFfcHJpbnRmKHMsICIldSIsIGxhdGVuY3kpOworCQlyZXR2YWwgPSAwOworCX0KKwltdXRleF91bmxvY2sobXV0ZXgpOworZG9uZToKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGdiX2xvb3BiYWNrX2RiZ2ZzX2xhdGVuY3lfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiID0gcy0+cHJpdmF0ZTsKKworCXJldHVybiBnYl9sb29wYmFja19kYmdmc19sYXRlbmN5X3Nob3dfY29tbW9uKHMsICZnYi0+a2ZpZm9fbGF0LAorCQkJCQkJICAgICAmZ2ItPm11dGV4KTsKK30KKworc3RhdGljIGludCBnYl9sb29wYmFja19sYXRlbmN5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGdiX2xvb3BiYWNrX2RiZ2ZzX2xhdGVuY3lfc2hvdywKKwkJCSAgIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBnYl9sb29wYmFja19kZWJ1Z2ZzX2xhdGVuY3lfb3BzID0geworCS5vcGVuCQk9IGdiX2xvb3BiYWNrX2xhdGVuY3lfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBnYl9sb29wYmFja19idXNfaWRfY29tcGFyZSh2b2lkICpwcml2LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaGEsCisJCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGhiKQoreworCXN0cnVjdCBnYl9sb29wYmFjayAqYSA9IGxpc3RfZW50cnkobGhhLCBzdHJ1Y3QgZ2JfbG9vcGJhY2ssIGVudHJ5KTsKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmIgPSBsaXN0X2VudHJ5KGxoYiwgc3RydWN0IGdiX2xvb3BiYWNrLCBlbnRyeSk7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNhID0gYS0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY2IgPSBiLT5jb25uZWN0aW9uOworCisJaWYgKGNhLT5idW5kbGUtPmludGYtPmludGVyZmFjZV9pZCA8IGNiLT5idW5kbGUtPmludGYtPmludGVyZmFjZV9pZCkKKwkJcmV0dXJuIC0xOworCWlmIChjYi0+YnVuZGxlLT5pbnRmLT5pbnRlcmZhY2VfaWQgPCBjYS0+YnVuZGxlLT5pbnRmLT5pbnRlcmZhY2VfaWQpCisJCXJldHVybiAxOworCWlmIChjYS0+YnVuZGxlLT5pZCA8IGNiLT5idW5kbGUtPmlkKQorCQlyZXR1cm4gLTE7CisJaWYgKGNiLT5idW5kbGUtPmlkIDwgY2EtPmJ1bmRsZS0+aWQpCisJCXJldHVybiAxOworCWlmIChjYS0+aW50Zl9jcG9ydF9pZCA8IGNiLT5pbnRmX2Nwb3J0X2lkKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAoY2ItPmludGZfY3BvcnRfaWQgPCBjYS0+aW50Zl9jcG9ydF9pZCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2JfbG9vcGJhY2tfaW5zZXJ0X2lkKHN0cnVjdCBnYl9sb29wYmFjayAqZ2IpCit7CisJc3RydWN0IGdiX2xvb3BiYWNrICpnYl9saXN0OworCXUzMiBuZXdfbGJpZCA9IDA7CisKKwkvKiBwZXJmb3JtIGFuIGluc2VydGlvbiBzb3J0ICovCisJbGlzdF9hZGRfdGFpbCgmZ2ItPmVudHJ5LCAmZ2JfZGV2Lmxpc3QpOworCWxpc3Rfc29ydChOVUxMLCAmZ2JfZGV2Lmxpc3QsIGdiX2xvb3BiYWNrX2J1c19pZF9jb21wYXJlKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdiX2xpc3QsICZnYl9kZXYubGlzdCwgZW50cnkpIHsKKwkJZ2JfbGlzdC0+bGJpZCA9IDEgPDwgbmV3X2xiaWQ7CisJCW5ld19sYmlkKys7CisJfQorfQorCisjZGVmaW5lIERFQlVHRlNfTkFNRUxFTiAzMgorCitzdGF0aWMgaW50IGdiX2xvb3BiYWNrX3Byb2JlKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2Nwb3J0ICpjcG9ydF9kZXNjOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCXN0cnVjdCBnYl9sb29wYmFjayAqZ2I7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCByZXR2YWw7CisJY2hhciBuYW1lW0RFQlVHRlNfTkFNRUxFTl07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChidW5kbGUtPm51bV9jcG9ydHMgIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljcG9ydF9kZXNjID0gJmJ1bmRsZS0+Y3BvcnRfZGVzY1swXTsKKwlpZiAoY3BvcnRfZGVzYy0+cHJvdG9jb2xfaWQgIT0gR1JFWUJVU19QUk9UT0NPTF9MT09QQkFDSykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlnYiA9IGt6YWxsb2Moc2l6ZW9mKCpnYiksIEdGUF9LRVJORUwpOworCWlmICghZ2IpCisJCXJldHVybiAtRU5PTUVNOworCisJY29ubmVjdGlvbiA9IGdiX2Nvbm5lY3Rpb25fY3JlYXRlKGJ1bmRsZSwgbGUxNl90b19jcHUoY3BvcnRfZGVzYy0+aWQpLAorCQkJCQkgIGdiX2xvb3BiYWNrX3JlcXVlc3RfaGFuZGxlcik7CisJaWYgKElTX0VSUihjb25uZWN0aW9uKSkgeworCQlyZXR2YWwgPSBQVFJfRVJSKGNvbm5lY3Rpb24pOworCQlnb3RvIG91dF9remFsbG9jOworCX0KKworCWdiLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKwlncmV5YnVzX3NldF9kcnZkYXRhKGJ1bmRsZSwgZ2IpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmZ2ItPndxKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZnYi0+d3FfY29tcGxldGlvbik7CisJYXRvbWljX3NldCgmZ2ItPm91dHN0YW5kaW5nX29wZXJhdGlvbnMsIDApOworCWdiX2xvb3BiYWNrX3Jlc2V0X3N0YXRzKGdiKTsKKworCS8qIFJlcG9ydGVkIHZhbHVlcyB0byB1c2VyLXNwYWNlIGZvciBtaW4vbWF4IHRpbWVvdXRzICovCisJZ2ItPnRpbWVvdXRfbWluID0gamlmZmllc190b191c2VjcyhHQl9MT09QQkFDS19USU1FT1VUX01JTik7CisJZ2ItPnRpbWVvdXRfbWF4ID0gamlmZmllc190b191c2VjcyhHQl9MT09QQkFDS19USU1FT1VUX01BWCk7CisKKwlpZiAoIWdiX2Rldi5jb3VudCkgeworCQkvKiBDYWxjdWxhdGUgbWF4aW11bSBwYXlsb2FkICovCisJCWdiX2Rldi5zaXplX21heCA9IGdiX29wZXJhdGlvbl9nZXRfcGF5bG9hZF9zaXplX21heChjb25uZWN0aW9uKTsKKwkJaWYgKGdiX2Rldi5zaXplX21heCA8PQorCQkJc2l6ZW9mKHN0cnVjdCBnYl9sb29wYmFja190cmFuc2Zlcl9yZXF1ZXN0KSkgeworCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2Nvbm5lY3Rpb25fZGVzdHJveTsKKwkJfQorCQlnYl9kZXYuc2l6ZV9tYXggLT0gc2l6ZW9mKHN0cnVjdCBnYl9sb29wYmFja190cmFuc2Zlcl9yZXF1ZXN0KTsKKwl9CisKKwkvKiBDcmVhdGUgcGVyLWNvbm5lY3Rpb24gc3lzZnMgYW5kIGRlYnVnZnMgZGF0YS1wb2ludHMgKi8KKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJyYXdfbGF0ZW5jeV8lcyIsCisJCSBkZXZfbmFtZSgmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYpKTsKKwlnYi0+ZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IFNfSVJVR08sIGdiX2Rldi5yb290LCBnYiwKKwkJCQkgICAgICAgJmdiX2xvb3BiYWNrX2RlYnVnZnNfbGF0ZW5jeV9vcHMpOworCisJZ2ItPmlkID0gaWRhX3NpbXBsZV9nZXQoJmxvb3BiYWNrX2lkYSwgMCwgMCwgR0ZQX0tFUk5FTCk7CisJaWYgKGdiLT5pZCA8IDApIHsKKwkJcmV0dmFsID0gZ2ItPmlkOworCQlnb3RvIG91dF9kZWJ1Z2ZzX3JlbW92ZTsKKwl9CisKKwlyZXR2YWwgPSBnYl9jb25uZWN0aW9uX2VuYWJsZShjb25uZWN0aW9uKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dF9pZGFfcmVtb3ZlOworCisJZGV2ID0gZGV2aWNlX2NyZWF0ZV93aXRoX2dyb3VwcygmbG9vcGJhY2tfY2xhc3MsCisJCQkJCSZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCQkJTUtERVYoMCwgMCksIGdiLCBsb29wYmFja19ncm91cHMsCisJCQkJCSJnYl9sb29wYmFjayVkIiwgZ2ItPmlkKTsKKwlpZiAoSVNfRVJSKGRldikpIHsKKwkJcmV0dmFsID0gUFRSX0VSUihkZXYpOworCQlnb3RvIG91dF9jb25uZWN0aW9uX2Rpc2FibGU7CisJfQorCWdiLT5kZXYgPSBkZXY7CisKKwkvKiBBbGxvY2F0ZSBrZmlmbyAqLworCWlmIChrZmlmb19hbGxvYygmZ2ItPmtmaWZvX2xhdCwga2ZpZm9fZGVwdGggKiBzaXplb2YodTMyKSwKKwkJCSAgR0ZQX0tFUk5FTCkpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBvdXRfY29ubjsKKwl9CisJaWYgKGtmaWZvX2FsbG9jKCZnYi0+a2ZpZm9fdHMsIGtmaWZvX2RlcHRoICogc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSAqIDIsCisJCQkgIEdGUF9LRVJORUwpKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2tmaWZvMDsKKwl9CisKKwkvKiBGb3JrIHdvcmtlciB0aHJlYWQgKi8KKwltdXRleF9pbml0KCZnYi0+bXV0ZXgpOworCWdiLT50YXNrID0ga3RocmVhZF9ydW4oZ2JfbG9vcGJhY2tfZm4sIGdiLCAiZ2JfbG9vcGJhY2siKTsKKwlpZiAoSVNfRVJSKGdiLT50YXNrKSkgeworCQlyZXR2YWwgPSBQVFJfRVJSKGdiLT50YXNrKTsKKwkJZ290byBvdXRfa2ZpZm8xOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZnYl9kZXYubG9jaywgZmxhZ3MpOworCWdiX2xvb3BiYWNrX2luc2VydF9pZChnYik7CisJZ2JfZGV2LmNvdW50Kys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2JfZGV2LmxvY2ssIGZsYWdzKTsKKworCWdiX2Nvbm5lY3Rpb25fbGF0ZW5jeV90YWdfZW5hYmxlKGNvbm5lY3Rpb24pOworCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKworCXJldHVybiAwOworCitvdXRfa2ZpZm8xOgorCWtmaWZvX2ZyZWUoJmdiLT5rZmlmb190cyk7CitvdXRfa2ZpZm8wOgorCWtmaWZvX2ZyZWUoJmdiLT5rZmlmb19sYXQpOworb3V0X2Nvbm46CisJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKK291dF9jb25uZWN0aW9uX2Rpc2FibGU6CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworb3V0X2lkYV9yZW1vdmU6CisJaWRhX3NpbXBsZV9yZW1vdmUoJmxvb3BiYWNrX2lkYSwgZ2ItPmlkKTsKK291dF9kZWJ1Z2ZzX3JlbW92ZToKKwlkZWJ1Z2ZzX3JlbW92ZShnYi0+ZmlsZSk7CitvdXRfY29ubmVjdGlvbl9kZXN0cm95OgorCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKK291dF9remFsbG9jOgorCWtmcmVlKGdiKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xvb3BiYWNrX2Rpc2Nvbm5lY3Qoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKQoreworCXN0cnVjdCBnYl9sb29wYmFjayAqZ2IgPSBncmV5YnVzX2dldF9kcnZkYXRhKGJ1bmRsZSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQpCisJCWdiX3BtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGJ1bmRsZSk7CisKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoZ2ItPmNvbm5lY3Rpb24pOworCisJaWYgKCFJU19FUlJfT1JfTlVMTChnYi0+dGFzaykpCisJCWt0aHJlYWRfc3RvcChnYi0+dGFzayk7CisKKwlrZmlmb19mcmVlKCZnYi0+a2ZpZm9fbGF0KTsKKwlrZmlmb19mcmVlKCZnYi0+a2ZpZm9fdHMpOworCWdiX2Nvbm5lY3Rpb25fbGF0ZW5jeV90YWdfZGlzYWJsZShnYi0+Y29ubmVjdGlvbik7CisJZGVidWdmc19yZW1vdmUoZ2ItPmZpbGUpOworCisJLyoKKwkgKiBGSVhNRTogZ2JfbG9vcGJhY2tfYXN5bmNfd2FpdF9hbGwoKSBpcyByZWR1bmRhbnQgbm93LCBhcyBjb25uZWN0aW9uCisJICogaXMgZGlzYWJsZWQgYXQgdGhlIGJlZ2lubmluZyBhbmQgc28gd2UgY2FuJ3QgaGF2ZSBhbnkgbW9yZQorCSAqIGluY29taW5nL291dGdvaW5nIHJlcXVlc3RzLgorCSAqLworCWdiX2xvb3BiYWNrX2FzeW5jX3dhaXRfYWxsKGdiKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZnYl9kZXYubG9jaywgZmxhZ3MpOworCWdiX2Rldi5jb3VudC0tOworCWxpc3RfZGVsKCZnYi0+ZW50cnkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdiX2Rldi5sb2NrLCBmbGFncyk7CisKKwlkZXZpY2VfdW5yZWdpc3RlcihnYi0+ZGV2KTsKKwlpZGFfc2ltcGxlX3JlbW92ZSgmbG9vcGJhY2tfaWRhLCBnYi0+aWQpOworCisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGdiLT5jb25uZWN0aW9uKTsKKwlrZnJlZShnYik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgZ2JfbG9vcGJhY2tfaWRfdGFibGVbXSA9IHsKKwl7IEdSRVlCVVNfREVWSUNFX0NMQVNTKEdSRVlCVVNfQ0xBU1NfTE9PUEJBQ0spIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShncmV5YnVzLCBnYl9sb29wYmFja19pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZ3JleWJ1c19kcml2ZXIgZ2JfbG9vcGJhY2tfZHJpdmVyID0geworCS5uYW1lCQk9ICJsb29wYmFjayIsCisJLnByb2JlCQk9IGdiX2xvb3BiYWNrX3Byb2JlLAorCS5kaXNjb25uZWN0CT0gZ2JfbG9vcGJhY2tfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUJPSBnYl9sb29wYmFja19pZF90YWJsZSwKK307CisKK3N0YXRpYyBpbnQgbG9vcGJhY2tfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlJTklUX0xJU1RfSEVBRCgmZ2JfZGV2Lmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZnYl9kZXYubGlzdF9vcF9hc3luYyk7CisJc3Bpbl9sb2NrX2luaXQoJmdiX2Rldi5sb2NrKTsKKwlnYl9kZXYucm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigiZ2JfbG9vcGJhY2siLCBOVUxMKTsKKworCXJldHZhbCA9IGNsYXNzX3JlZ2lzdGVyKCZsb29wYmFja19jbGFzcyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnI7CisKKwlyZXR2YWwgPSBncmV5YnVzX3JlZ2lzdGVyKCZnYl9sb29wYmFja19kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyX3VucmVnaXN0ZXI7CisKKwlyZXR1cm4gMDsKKworZXJyX3VucmVnaXN0ZXI6CisJY2xhc3NfdW5yZWdpc3RlcigmbG9vcGJhY2tfY2xhc3MpOworZXJyOgorCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShnYl9kZXYucm9vdCk7CisJcmV0dXJuIHJldHZhbDsKK30KK21vZHVsZV9pbml0KGxvb3BiYWNrX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbG9vcGJhY2tfZXhpdCh2b2lkKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShnYl9kZXYucm9vdCk7CisJZ3JleWJ1c19kZXJlZ2lzdGVyKCZnYl9sb29wYmFja19kcml2ZXIpOworCWNsYXNzX3VucmVnaXN0ZXIoJmxvb3BiYWNrX2NsYXNzKTsKKwlpZGFfZGVzdHJveSgmbG9vcGJhY2tfaWRhKTsKK30KK21vZHVsZV9leGl0KGxvb3BiYWNrX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9tYW5pZmVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvbWFuaWZlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjkwMzc3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvbWFuaWZlc3QuYwpAQCAtMCwwICsxLDUzNSBAQAorLyoKKyAqIEdyZXlidXMgbWFuaWZlc3QgcGFyc2luZworICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2Rlc2NyaXB0b3JfdHlwZV9zdHJpbmcodTggdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdSRVlCVVNfVFlQRV9JTlZBTElEOgorCQlyZXR1cm4gImludmFsaWQiOworCWNhc2UgR1JFWUJVU19UWVBFX1NUUklORzoKKwkJcmV0dXJuICJzdHJpbmciOworCWNhc2UgR1JFWUJVU19UWVBFX0lOVEVSRkFDRToKKwkJcmV0dXJuICJpbnRlcmZhY2UiOworCWNhc2UgR1JFWUJVU19UWVBFX0NQT1JUOgorCQlyZXR1cm4gImNwb3J0IjsKKwljYXNlIEdSRVlCVVNfVFlQRV9CVU5ETEU6CisJCXJldHVybiAiYnVuZGxlIjsKKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOworCQlyZXR1cm4gInVua25vd24iOworCX0KK30KKworLyoKKyAqIFdlIHNjYW4gdGhlIG1hbmlmZXN0IG9uY2UgdG8gaWRlbnRpZnkgd2hlcmUgYWxsIHRoZSBkZXNjcmlwdG9ycworICogYXJlLiAgVGhlIHJlc3VsdCBpcyBhIGxpc3Qgb2YgdGhlc2UgbWFuaWZlc3RfZGVzYyBzdHJ1Y3R1cmVzLiAgV2UKKyAqIHRoZW4gcGljayB0aHJvdWdoIHRoZW0gZm9yIHdoYXQgd2UncmUgbG9va2luZyBmb3IgKHN0YXJ0aW5nIHdpdGgKKyAqIHRoZSBpbnRlcmZhY2UgZGVzY3JpcHRvcikuICBBcyBlYWNoIGlzIHByb2Nlc3NlZCB3ZSByZW1vdmUgaXQgZnJvbQorICogdGhlIGxpc3QuICBXaGVuIHdlJ3JlIGRvbmUgdGhlIGxpc3Qgc2hvdWxkIChwcm9iYWJseSkgYmUgZW1wdHkuCisgKi8KK3N0cnVjdCBtYW5pZmVzdF9kZXNjIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlsaW5rczsKKworCXNpemVfdAkJCQlzaXplOworCXZvaWQJCQkJKmRhdGE7CisJZW51bSBncmV5YnVzX2Rlc2NyaXB0b3JfdHlwZQl0eXBlOworfTsKKworc3RhdGljIHZvaWQgcmVsZWFzZV9tYW5pZmVzdF9kZXNjcmlwdG9yKHN0cnVjdCBtYW5pZmVzdF9kZXNjICpkZXNjcmlwdG9yKQoreworCWxpc3RfZGVsKCZkZXNjcmlwdG9yLT5saW5rcyk7CisJa2ZyZWUoZGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfbWFuaWZlc3RfZGVzY3JpcHRvcnMoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgbWFuaWZlc3RfZGVzYyAqZGVzY3JpcHRvcjsKKwlzdHJ1Y3QgbWFuaWZlc3RfZGVzYyAqbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjcmlwdG9yLCBuZXh0LCAmaW50Zi0+bWFuaWZlc3RfZGVzY3MsIGxpbmtzKQorCQlyZWxlYXNlX21hbmlmZXN0X2Rlc2NyaXB0b3IoZGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfY3BvcnRfZGVzY3JpcHRvcnMoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgdTggYnVuZGxlX2lkKQoreworCXN0cnVjdCBtYW5pZmVzdF9kZXNjICpkZXNjLCAqdG1wOworCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfY3BvcnQgKmRlc2NfY3BvcnQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgdG1wLCBoZWFkLCBsaW5rcykgeworCQlkZXNjX2Nwb3J0ID0gZGVzYy0+ZGF0YTsKKworCQlpZiAoZGVzYy0+dHlwZSAhPSBHUkVZQlVTX1RZUEVfQ1BPUlQpCisJCQljb250aW51ZTsKKworCQlpZiAoZGVzY19jcG9ydC0+YnVuZGxlID09IGJ1bmRsZV9pZCkKKwkJCXJlbGVhc2VfbWFuaWZlc3RfZGVzY3JpcHRvcihkZXNjKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFuaWZlc3RfZGVzYyAqZ2V0X25leHRfYnVuZGxlX2Rlc2Moc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgbWFuaWZlc3RfZGVzYyAqZGVzY3JpcHRvcjsKKwlzdHJ1Y3QgbWFuaWZlc3RfZGVzYyAqbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjcmlwdG9yLCBuZXh0LCAmaW50Zi0+bWFuaWZlc3RfZGVzY3MsIGxpbmtzKQorCQlpZiAoZGVzY3JpcHRvci0+dHlwZSA9PSBHUkVZQlVTX1RZUEVfQlVORExFKQorCQkJcmV0dXJuIGRlc2NyaXB0b3I7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFZhbGlkYXRlIHRoZSBnaXZlbiBkZXNjcmlwdG9yLiAgSXRzIHJlcG9ydGVkIHNpemUgbXVzdCBmaXQgd2l0aGluCisgKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZywgYW5kIGl0IG11c3QgaGF2ZSBhIHJlY29nbml6ZWQKKyAqIHR5cGUuICBDaGVjayB0aGF0IHRoZSByZXBvcnRlZCBzaXplIGlzIGF0IGxlYXN0IGFzIGJpZyBhcyB3aGF0CisgKiB3ZSBleHBlY3QgdG8gc2VlLiAgKEl0IGNvdWxkIGJlIGJpZ2dlciwgcGVyaGFwcyBmb3IgYSBuZXcgdmVyc2lvbgorICogb2YgdGhlIGZvcm1hdC4pCisgKgorICogUmV0dXJucyB0aGUgKG5vbi16ZXJvKSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYnkgdGhlIGRlc2NyaXB0b3IsCisgKiBvciBhIG5lZ2F0aXZlIGVycm5vLgorICovCitzdGF0aWMgaW50IGlkZW50aWZ5X2Rlc2NyaXB0b3Ioc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiwKKwkJCSAgICAgICBzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yICpkZXNjLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2hlYWRlciAqZGVzY19oZWFkZXIgPSAmZGVzYy0+aGVhZGVyOworCXN0cnVjdCBtYW5pZmVzdF9kZXNjICpkZXNjcmlwdG9yOworCXNpemVfdCBkZXNjX3NpemU7CisJc2l6ZV90IGV4cGVjdGVkX3NpemU7CisKKwlpZiAoc2l6ZSA8IHNpemVvZigqZGVzY19oZWFkZXIpKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIm1hbmlmZXN0IHRvbyBzbWFsbCAoJXp1IDwgJXp1KVxuIiwKKwkJCQlzaXplLCBzaXplb2YoKmRlc2NfaGVhZGVyKSk7CisJCXJldHVybiAtRUlOVkFMOwkJLyogTXVzdCBhdCBsZWFzdCBoYXZlIGhlYWRlciAqLworCX0KKworCWRlc2Nfc2l6ZSA9IGxlMTZfdG9fY3B1KGRlc2NfaGVhZGVyLT5zaXplKTsKKwlpZiAoZGVzY19zaXplID4gc2l6ZSkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJkZXNjcmlwdG9yIHRvbyBiaWcgKCV6dSA+ICV6dSlcbiIsCisJCQkJZGVzY19zaXplLCBzaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRGVzY3JpcHRvciBuZWVkcyB0byBhdCBsZWFzdCBoYXZlIGEgaGVhZGVyICovCisJZXhwZWN0ZWRfc2l6ZSA9IHNpemVvZigqZGVzY19oZWFkZXIpOworCisJc3dpdGNoIChkZXNjX2hlYWRlci0+dHlwZSkgeworCWNhc2UgR1JFWUJVU19UWVBFX1NUUklORzoKKwkJZXhwZWN0ZWRfc2l6ZSArPSBzaXplb2Yoc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9zdHJpbmcpOworCQlleHBlY3RlZF9zaXplICs9IGRlc2MtPnN0cmluZy5sZW5ndGg7CisKKwkJLyogU3RyaW5nIGRlc2NyaXB0b3JzIGFyZSBwYWRkZWQgdG8gNCBieXRlIGJvdW5kYXJpZXMgKi8KKwkJZXhwZWN0ZWRfc2l6ZSA9IEFMSUdOKGV4cGVjdGVkX3NpemUsIDQpOworCQlicmVhazsKKwljYXNlIEdSRVlCVVNfVFlQRV9JTlRFUkZBQ0U6CisJCWV4cGVjdGVkX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfaW50ZXJmYWNlKTsKKwkJYnJlYWs7CisJY2FzZSBHUkVZQlVTX1RZUEVfQlVORExFOgorCQlleHBlY3RlZF9zaXplICs9IHNpemVvZihzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2J1bmRsZSk7CisJCWJyZWFrOworCWNhc2UgR1JFWUJVU19UWVBFX0NQT1JUOgorCQlleHBlY3RlZF9zaXplICs9IHNpemVvZihzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2Nwb3J0KTsKKwkJYnJlYWs7CisJY2FzZSBHUkVZQlVTX1RZUEVfSU5WQUxJRDoKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJpbnZhbGlkIGRlc2NyaXB0b3IgdHlwZSAoJXUpXG4iLAorCQkJCWRlc2NfaGVhZGVyLT50eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGRlc2Nfc2l6ZSA8IGV4cGVjdGVkX3NpemUpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiJXMgZGVzY3JpcHRvciB0b28gc21hbGwgKCV6dSA8ICV6dSlcbiIsCisJCQkJZ2V0X2Rlc2NyaXB0b3JfdHlwZV9zdHJpbmcoZGVzY19oZWFkZXItPnR5cGUpLAorCQkJCWRlc2Nfc2l6ZSwgZXhwZWN0ZWRfc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIERlc2NyaXB0b3IgYmlnZ2VyIHRoYW4gd2hhdCB3ZSBleHBlY3QgKi8KKwlpZiAoZGVzY19zaXplID4gZXhwZWN0ZWRfc2l6ZSkgeworCQlkZXZfd2FybigmaW50Zi0+ZGV2LCAiJXMgZGVzY3JpcHRvciBzaXplIG1pc21hdGNoICh3YW50ICV6dSBnb3QgJXp1KVxuIiwKKwkJCQlnZXRfZGVzY3JpcHRvcl90eXBlX3N0cmluZyhkZXNjX2hlYWRlci0+dHlwZSksCisJCQkJZXhwZWN0ZWRfc2l6ZSwgZGVzY19zaXplKTsKKwl9CisKKwlkZXNjcmlwdG9yID0ga3phbGxvYyhzaXplb2YoKmRlc2NyaXB0b3IpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlc2NyaXB0b3IpCisJCXJldHVybiAtRU5PTUVNOworCisJZGVzY3JpcHRvci0+c2l6ZSA9IGRlc2Nfc2l6ZTsKKwlkZXNjcmlwdG9yLT5kYXRhID0gKGNoYXIgKilkZXNjICsgc2l6ZW9mKCpkZXNjX2hlYWRlcik7CisJZGVzY3JpcHRvci0+dHlwZSA9IGRlc2NfaGVhZGVyLT50eXBlOworCWxpc3RfYWRkX3RhaWwoJmRlc2NyaXB0b3ItPmxpbmtzLCAmaW50Zi0+bWFuaWZlc3RfZGVzY3MpOworCisJLyogZGVzY19zaXplIGlzIHBvc2l0aXZlIGFuZCBpcyBrbm93biB0byBmaXQgaW4gYSBzaWduZWQgaW50ICovCisKKwlyZXR1cm4gZGVzY19zaXplOworfQorCisvKgorICogRmluZCB0aGUgc3RyaW5nIGRlc2NyaXB0b3IgaGF2aW5nIHRoZSBnaXZlbiBpZCwgdmFsaWRhdGUgaXQsIGFuZAorICogYWxsb2NhdGUgYSBkdXBsaWNhdGUgY29weSBvZiBpdC4gIFRoZSBkdXBsaWNhdGUgaGFzIGFuIGV4dHJhIGJ5dGUKKyAqIHdoaWNoIGd1YXJhbnRlZXMgdGhlIHJldHVybmVkIHN0cmluZyBpcyBOVUwtdGVybWluYXRlZC4KKyAqCisgKiBTdHJpbmcgaW5kZXggMCBpcyB2YWxpZCAoaXQgcmVwcmVzZW50cyAibm8gc3RyaW5nIiksIGFuZCBmb3IKKyAqIHRoYXQgYSBudWxsIHBvaW50ZXIgaXMgcmV0dXJuZWQuCisgKgorICogT3RoZXJ3aXNlIHJldHVybnMgYSBwb2ludGVyIHRvIGEgbmV3bHktYWxsb2NhdGVkIGNvcHkgb2YgdGhlCisgKiBkZXNjcmlwdG9yIHN0cmluZywgb3IgYW4gZXJyb3ItY29kZWQgcG9pbnRlciBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgY2hhciAqZ2Jfc3RyaW5nX2dldChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmLCB1OCBzdHJpbmdfaWQpCit7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9zdHJpbmcgKmRlc2Nfc3RyaW5nOworCXN0cnVjdCBtYW5pZmVzdF9kZXNjICpkZXNjcmlwdG9yOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKwljaGFyICpzdHJpbmc7CisKKwkvKiBBIHplcm8gc3RyaW5nIGlkIG1lYW5zIG5vIHN0cmluZyAoYnV0IG5vIGVycm9yKSAqLworCWlmICghc3RyaW5nX2lkKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzY3JpcHRvciwgJmludGYtPm1hbmlmZXN0X2Rlc2NzLCBsaW5rcykgeworCQlpZiAoZGVzY3JpcHRvci0+dHlwZSAhPSBHUkVZQlVTX1RZUEVfU1RSSU5HKQorCQkJY29udGludWU7CisKKwkJZGVzY19zdHJpbmcgPSBkZXNjcmlwdG9yLT5kYXRhOworCQlpZiAoZGVzY19zdHJpbmctPmlkID09IHN0cmluZ19pZCkgeworCQkJZm91bmQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFmb3VuZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisKKwkvKiBBbGxvY2F0ZSBhbiBleHRyYSBieXRlIHNvIHdlIGNhbiBndWFyYW50ZWUgaXQncyBOVUwtdGVybWluYXRlZCAqLworCXN0cmluZyA9IGttZW1kdXAoJmRlc2Nfc3RyaW5nLT5zdHJpbmcsIGRlc2Nfc3RyaW5nLT5sZW5ndGggKyAxLAorCQkJCUdGUF9LRVJORUwpOworCWlmICghc3RyaW5nKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlzdHJpbmdbZGVzY19zdHJpbmctPmxlbmd0aF0gPSAnXDAnOworCisJLyogT2sgd2UndmUgdXNlZCB0aGlzIHN0cmluZywgc28gd2UncmUgZG9uZSB3aXRoIGl0ICovCisJcmVsZWFzZV9tYW5pZmVzdF9kZXNjcmlwdG9yKGRlc2NyaXB0b3IpOworCisJcmV0dXJuIHN0cmluZzsKK30KKworLyoKKyAqIEZpbmQgY3BvcnQgZGVzY3JpcHRvcnMgaW4gdGhlIG1hbmlmZXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4KKyAqIGJ1bmRsZSwgYW5kIHNldCB1cCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSBmdW5jdGlvbnMgdGhhdCB1c2UKKyAqIHRoZW0uICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY3BvcnRzIHNldCB1cCBmb3IgdGhlIGJ1bmRsZSwgb3IgMAorICogaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgKi8KK3N0YXRpYyB1MzIgZ2JfbWFuaWZlc3RfcGFyc2VfY3BvcnRzKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gYnVuZGxlLT5pbnRmOworCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfY3BvcnQgKmRlc2NfY3BvcnQ7CisJc3RydWN0IG1hbmlmZXN0X2Rlc2MgKmRlc2MsICpuZXh0LCAqdG1wOworCUxJU1RfSEVBRChsaXN0KTsKKwl1OCBidW5kbGVfaWQgPSBidW5kbGUtPmlkOworCXUxNiBjcG9ydF9pZDsKKwl1MzIgY291bnQgPSAwOworCWludCBpOworCisJLyogU2V0IHVwIGFsbCBjcG9ydCBkZXNjcmlwdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBidW5kbGUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgbmV4dCwgJmludGYtPm1hbmlmZXN0X2Rlc2NzLCBsaW5rcykgeworCQlpZiAoZGVzYy0+dHlwZSAhPSBHUkVZQlVTX1RZUEVfQ1BPUlQpCisJCQljb250aW51ZTsKKworCQlkZXNjX2Nwb3J0ID0gZGVzYy0+ZGF0YTsKKwkJaWYgKGRlc2NfY3BvcnQtPmJ1bmRsZSAhPSBidW5kbGVfaWQpCisJCQljb250aW51ZTsKKworCQljcG9ydF9pZCA9IGxlMTZfdG9fY3B1KGRlc2NfY3BvcnQtPmlkKTsKKwkJaWYgKGNwb3J0X2lkID4gQ1BPUlRfSURfTUFYKQorCQkJZ290byBleGl0OworCisJCS8qIE5vdGhpbmcgZWxzZSBzaG91bGQgaGF2ZSBpdHMgY3BvcnRfaWQgYXMgY29udHJvbCBjcG9ydCBpZCAqLworCQlpZiAoY3BvcnRfaWQgPT0gR0JfQ09OVFJPTF9DUE9SVF9JRCkgeworCQkJZGV2X2VycigmYnVuZGxlLT5kZXYsICJpbnZhbGlkIGNwb3J0IGlkIGZvdW5kICglMDJ1KVxuIiwKKwkJCQljcG9ydF9pZCk7CisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQkvKgorCQkgKiBGb3VuZCBvbmUsIG1vdmUgaXQgdG8gb3VyIHRlbXBvcmFyeSBsaXN0IGFmdGVyIGNoZWNraW5nIGZvcgorCQkgKiBkdXBsaWNhdGVzLgorCQkgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZsaXN0LCBsaW5rcykgeworCQkJZGVzY19jcG9ydCA9IHRtcC0+ZGF0YTsKKwkJCWlmIChjcG9ydF9pZCA9PSBsZTE2X3RvX2NwdShkZXNjX2Nwb3J0LT5pZCkpIHsKKwkJCQlkZXZfZXJyKCZidW5kbGUtPmRldiwKKwkJCQkJCSJkdXBsaWNhdGUgQ1BvcnQgJXUgZm91bmRcbiIsCisJCQkJCQljcG9ydF9pZCk7CisJCQkJZ290byBleGl0OworCQkJfQorCQl9CisJCWxpc3RfbW92ZV90YWlsKCZkZXNjLT5saW5rcywgJmxpc3QpOworCQljb3VudCsrOworCX0KKworCWlmICghY291bnQpCisJCXJldHVybiAwOworCisJYnVuZGxlLT5jcG9ydF9kZXNjID0ga2NhbGxvYyhjb3VudCwgc2l6ZW9mKCpidW5kbGUtPmNwb3J0X2Rlc2MpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1bmRsZS0+Y3BvcnRfZGVzYykKKwkJZ290byBleGl0OworCisJYnVuZGxlLT5udW1fY3BvcnRzID0gY291bnQ7CisKKwlpID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgbmV4dCwgJmxpc3QsIGxpbmtzKSB7CisJCWRlc2NfY3BvcnQgPSBkZXNjLT5kYXRhOworCQltZW1jcHkoJmJ1bmRsZS0+Y3BvcnRfZGVzY1tpKytdLCBkZXNjX2Nwb3J0LAorCQkJCXNpemVvZigqZGVzY19jcG9ydCkpOworCisJCS8qIFJlbGVhc2UgdGhlIGNwb3J0IGRlc2NyaXB0b3IgKi8KKwkJcmVsZWFzZV9tYW5pZmVzdF9kZXNjcmlwdG9yKGRlc2MpOworCX0KKworCXJldHVybiBjb3VudDsKK2V4aXQ6CisJcmVsZWFzZV9jcG9ydF9kZXNjcmlwdG9ycygmbGlzdCwgYnVuZGxlX2lkKTsKKwkvKgorCSAqIEZyZWUgYWxsIGNwb3J0cyBmb3IgdGhpcyBidW5kbGUgdG8gYXZvaWQgJ2V4Y2VzcyBkZXNjcmlwdG9ycycKKwkgKiB3YXJuaW5ncy4KKwkgKi8KKwlyZWxlYXNlX2Nwb3J0X2Rlc2NyaXB0b3JzKCZpbnRmLT5tYW5pZmVzdF9kZXNjcywgYnVuZGxlX2lkKTsKKworCXJldHVybiAwOwkvKiBFcnJvcjsgY291bnQgc2hvdWxkIGFsc28gYmUgMCAqLworfQorCisvKgorICogRmluZCBidW5kbGUgZGVzY3JpcHRvcnMgaW4gdGhlIG1hbmlmZXN0IGFuZCBzZXQgdXAgdGhlaXIgZGF0YQorICogc3RydWN0dXJlcy4gIFJldHVybnMgdGhlIG51bWJlciBvZiBidW5kbGVzIHNldCB1cCBmb3IgdGhlCisgKiBnaXZlbiBpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyB1MzIgZ2JfbWFuaWZlc3RfcGFyc2VfYnVuZGxlcyhzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBtYW5pZmVzdF9kZXNjICpkZXNjOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGVfbmV4dDsKKwl1MzIgY291bnQgPSAwOworCXU4IGJ1bmRsZV9pZDsKKwl1OCBjbGFzczsKKworCXdoaWxlICgoZGVzYyA9IGdldF9uZXh0X2J1bmRsZV9kZXNjKGludGYpKSkgeworCQlzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2J1bmRsZSAqZGVzY19idW5kbGU7CisKKwkJLyogRm91bmQgb25lLiAgU2V0IHVwIGl0cyBidW5kbGUgc3RydWN0dXJlKi8KKwkJZGVzY19idW5kbGUgPSBkZXNjLT5kYXRhOworCQlidW5kbGVfaWQgPSBkZXNjX2J1bmRsZS0+aWQ7CisJCWNsYXNzID0gZGVzY19idW5kbGUtPmNsYXNzOworCisJCS8qIERvbmUgd2l0aCB0aGlzIGJ1bmRsZSBkZXNjcmlwdG9yICovCisJCXJlbGVhc2VfbWFuaWZlc3RfZGVzY3JpcHRvcihkZXNjKTsKKworCQkvKiBJZ25vcmUgYW55IGxlZ2FjeSBjb250cm9sIGJ1bmRsZXMgKi8KKwkJaWYgKGJ1bmRsZV9pZCA9PSBHQl9DT05UUk9MX0JVTkRMRV9JRCkgeworCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXMgLSBpZ25vcmluZyBjb250cm9sIGJ1bmRsZVxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJcmVsZWFzZV9jcG9ydF9kZXNjcmlwdG9ycygmaW50Zi0+bWFuaWZlc3RfZGVzY3MsCisJCQkJCQkJCWJ1bmRsZV9pZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIE5vdGhpbmcgZWxzZSBzaG91bGQgaGF2ZSBpdHMgY2xhc3Mgc2V0IHRvIGNvbnRyb2wgY2xhc3MgKi8KKwkJaWYgKGNsYXNzID09IEdSRVlCVVNfQ0xBU1NfQ09OVFJPTCkgeworCQkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJCSJidW5kbGUgJXUgY2Fubm90IHVzZSBjb250cm9sIGNsYXNzXG4iLAorCQkJCWJ1bmRsZV9pZCk7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQlidW5kbGUgPSBnYl9idW5kbGVfY3JlYXRlKGludGYsIGJ1bmRsZV9pZCwgY2xhc3MpOworCQlpZiAoIWJ1bmRsZSkKKwkJCWdvdG8gY2xlYW51cDsKKworCQkvKgorCQkgKiBOb3cgZ28gc2V0IHVwIHRoaXMgYnVuZGxlJ3MgZnVuY3Rpb25zIGFuZCBjcG9ydHMuCisJCSAqCisJCSAqIEEgJ2J1bmRsZScgcmVwcmVzZW50cyBhIGRldmljZSBpbiBncmV5YnVzLiBJdCBtYXkgcmVxdWlyZQorCQkgKiBtdWx0aXBsZSBjcG9ydHMgZm9yIGl0cyBmdW5jdGlvbmluZy4gSWYgd2UgZmFpbCB0byBzZXR1cCBhbnkKKwkJICogY3BvcnQgb2YgYSBidW5kbGUsIHdlIGJldHRlciByZWplY3QgdGhlIGNvbXBsZXRlIGJ1bmRsZSBhcworCQkgKiB0aGUgZGV2aWNlIG1heSBub3QgYmUgYWJsZSB0byBmdW5jdGlvbiBwcm9wZXJseSB0aGVuLgorCQkgKgorCQkgKiBCdXQsIGZhaWxpbmcgdG8gc2V0dXAgYSBjcG9ydCBvZiBidW5kbGUgWCBkb2Vzbid0IG1lYW4gdGhhdAorCQkgKiB0aGUgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8gYnVuZGxlIFkgd2lsbCBub3Qgd29yayBwcm9wZXJseS4KKwkJICogQnVuZGxlcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBzZXBhcmF0ZSBpbmRlcGVuZGVudCBkZXZpY2VzLgorCQkgKgorCQkgKiBXaGlsZSBwYXJzaW5nIG1hbmlmZXN0IGZvciBhbiBpbnRlcmZhY2UsIHRyZWF0IGJ1bmRsZXMgYXMKKwkJICogc2VwYXJhdGUgZW50aXRpZXMgYW5kIGRvbid0IHJlamVjdCBlbnRpcmUgaW50ZXJmYWNlIGFuZCBpdHMKKwkJICogYnVuZGxlcyBvbiBmYWlsaW5nIHRvIGluaXRpYWxpemUgYSBjcG9ydC4gQnV0IG1ha2Ugc3VyZSB0aGUKKwkJICogYnVuZGxlIHdoaWNoIG5lZWRzIHRoZSBjcG9ydCwgZ2V0cyBkZXN0cm95ZWQgcHJvcGVybHkuCisJCSAqLworCQlpZiAoIWdiX21hbmlmZXN0X3BhcnNlX2Nwb3J0cyhidW5kbGUpKSB7CisJCQlnYl9idW5kbGVfZGVzdHJveShidW5kbGUpOworCQkJY29udGludWU7CisJCX0KKworCQljb3VudCsrOworCX0KKworCXJldHVybiBjb3VudDsKK2NsZWFudXA6CisJLyogQW4gZXJyb3Igb2NjdXJyZWQ7IHVuZG8gYW55IGNoYW5nZXMgd2UndmUgbWFkZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShidW5kbGUsIGJ1bmRsZV9uZXh0LCAmaW50Zi0+YnVuZGxlcywgbGlua3MpIHsKKwkJZ2JfYnVuZGxlX2Rlc3Ryb3koYnVuZGxlKTsKKwkJY291bnQtLTsKKwl9CisJcmV0dXJuIDA7CS8qIEVycm9yOyBjb3VudCBzaG91bGQgYWxzbyBiZSAwICovCit9CisKK3N0YXRpYyBib29sIGdiX21hbmlmZXN0X3BhcnNlX2ludGVyZmFjZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmLAorCQkJCQlzdHJ1Y3QgbWFuaWZlc3RfZGVzYyAqaW50ZXJmYWNlX2Rlc2MpCit7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9pbnRlcmZhY2UgKmRlc2NfaW50ZiA9IGludGVyZmFjZV9kZXNjLT5kYXRhOworCXN0cnVjdCBnYl9jb250cm9sICpjb250cm9sID0gaW50Zi0+Y29udHJvbDsKKwljaGFyICpzdHI7CisKKwkvKiBIYW5kbGUgdGhlIHN0cmluZ3MgZmlyc3QtLXRoZXkgY2FuIGZhaWwgKi8KKwlzdHIgPSBnYl9zdHJpbmdfZ2V0KGludGYsIGRlc2NfaW50Zi0+dmVuZG9yX3N0cmluZ2lkKTsKKwlpZiAoSVNfRVJSKHN0cikpCisJCXJldHVybiBmYWxzZTsKKwljb250cm9sLT52ZW5kb3Jfc3RyaW5nID0gc3RyOworCisJc3RyID0gZ2Jfc3RyaW5nX2dldChpbnRmLCBkZXNjX2ludGYtPnByb2R1Y3Rfc3RyaW5naWQpOworCWlmIChJU19FUlIoc3RyKSkKKwkJZ290byBvdXRfZnJlZV92ZW5kb3Jfc3RyaW5nOworCWNvbnRyb2wtPnByb2R1Y3Rfc3RyaW5nID0gc3RyOworCisJLyogQXNzaWduIGZlYXR1cmUgZmxhZ3MgY29tbXVuaWNhdGVkIHZpYSBtYW5pZmVzdCAqLworCWludGYtPmZlYXR1cmVzID0gZGVzY19pbnRmLT5mZWF0dXJlczsKKworCS8qIFJlbGVhc2UgdGhlIGludGVyZmFjZSBkZXNjcmlwdG9yLCBub3cgdGhhdCB3ZSdyZSBkb25lIHdpdGggaXQgKi8KKwlyZWxlYXNlX21hbmlmZXN0X2Rlc2NyaXB0b3IoaW50ZXJmYWNlX2Rlc2MpOworCisJLyogQW4gaW50ZXJmYWNlIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYnVuZGxlIGRlc2NyaXB0b3IgKi8KKwlpZiAoIWdiX21hbmlmZXN0X3BhcnNlX2J1bmRsZXMoaW50ZikpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAibWFuaWZlc3QgYnVuZGxlIGRlc2NyaXB0b3JzIG5vdCB2YWxpZFxuIik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK291dF9lcnI6CisJa2ZyZWUoY29udHJvbC0+cHJvZHVjdF9zdHJpbmcpOworCWNvbnRyb2wtPnByb2R1Y3Rfc3RyaW5nID0gTlVMTDsKK291dF9mcmVlX3ZlbmRvcl9zdHJpbmc6CisJa2ZyZWUoY29udHJvbC0+dmVuZG9yX3N0cmluZyk7CisJY29udHJvbC0+dmVuZG9yX3N0cmluZyA9IE5VTEw7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiBQYXJzZSBhIGJ1ZmZlciBjb250YWluaW5nIGFuIGludGVyZmFjZSBtYW5pZmVzdC4KKyAqCisgKiBJZiB3ZSBmaW5kIGFueXRoaW5nIHdyb25nIHdpdGggdGhlIGNvbnRlbnQvZm9ybWF0IG9mIHRoZSBidWZmZXIKKyAqIHdlIHJlamVjdCBpdC4KKyAqCisgKiBUaGUgZmlyc3QgcmVxdWlyZW1lbnQgaXMgdGhhdCB0aGUgbWFuaWZlc3QncyB2ZXJzaW9uIGlzCisgKiBvbmUgd2UgY2FuIHBhcnNlLgorICoKKyAqIFdlIG1ha2UgYW4gaW5pdGlhbCBwYXNzIHRocm91Z2ggdGhlIGJ1ZmZlciBhbmQgaWRlbnRpZnkgYWxsIG9mCisgKiB0aGUgZGVzY3JpcHRvcnMgaXQgY29udGFpbnMsIGtlZXBpbmcgdHJhY2sgZm9yIGVhY2ggaXRzIHR5cGUKKyAqIGFuZCB0aGUgbG9jYXRpb24gc2l6ZSBvZiBpdHMgZGF0YSBpbiB0aGUgYnVmZmVyLgorICoKKyAqIE5leHQgd2Ugc2NhbiB0aGUgZGVzY3JpcHRvcnMsIGxvb2tpbmcgZm9yIGFuIGludGVyZmFjZSBkZXNjcmlwdG9yOworICogdGhlcmUgbXVzdCBiZSBleGFjdGx5IG9uZSBvZiB0aG9zZS4gIFdoZW4gZm91bmQsIHdlIHJlY29yZCB0aGUKKyAqIGluZm9ybWF0aW9uIGl0IGNvbnRhaW5zLCBhbmQgdGhlbiByZW1vdmUgdGhhdCBkZXNjcmlwdG9yIChhbmQgYW55CisgKiBzdHJpbmcgZGVzY3JpcHRvcnMgaXQgcmVmZXJzIHRvKSBmcm9tIGZ1cnRoZXIgY29uc2lkZXJhdGlvbi4KKyAqCisgKiBBZnRlciB0aGF0IHdlIGxvb2sgZm9yIHRoZSBpbnRlcmZhY2UncyBidW5kbGVzLS10aGVyZSBtdXN0IGJlIGF0CisgKiBsZWFzdCBvbmUgb2YgdGhvc2UuCisgKgorICogUmV0dXJucyB0cnVlIGlmIHBhcnNpbmcgd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZS4KKyAqLworYm9vbCBnYl9tYW5pZmVzdF9wYXJzZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZ3JleWJ1c19tYW5pZmVzdCAqbWFuaWZlc3Q7CisJc3RydWN0IGdyZXlidXNfbWFuaWZlc3RfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvciAqZGVzYzsKKwlzdHJ1Y3QgbWFuaWZlc3RfZGVzYyAqZGVzY3JpcHRvcjsKKwlzdHJ1Y3QgbWFuaWZlc3RfZGVzYyAqaW50ZXJmYWNlX2Rlc2MgPSBOVUxMOworCXUxNiBtYW5pZmVzdF9zaXplOworCXUzMiBmb3VuZCA9IDA7CisJYm9vbCByZXN1bHQ7CisKKwkvKiBNYW5pZmVzdCBkZXNjcmlwdG9yIGxpc3Qgc2hvdWxkIGJlIGVtcHR5IGhlcmUgKi8KKwlpZiAoV0FSTl9PTighbGlzdF9lbXB0eSgmaW50Zi0+bWFuaWZlc3RfZGVzY3MpKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogd2UgaGF2ZSB0byBoYXZlIGF0IF9sZWFzdF8gdGhlIG1hbmlmZXN0IGhlYWRlciAqLworCWlmIChzaXplIDwgc2l6ZW9mKCpoZWFkZXIpKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgInNob3J0IG1hbmlmZXN0ICglenUgPCAlenUpXG4iLAorCQkJCXNpemUsIHNpemVvZigqaGVhZGVyKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiBNYWtlIHN1cmUgdGhlIHNpemUgaXMgcmlnaHQgKi8KKwltYW5pZmVzdCA9IGRhdGE7CisJaGVhZGVyID0gJm1hbmlmZXN0LT5oZWFkZXI7CisJbWFuaWZlc3Rfc2l6ZSA9IGxlMTZfdG9fY3B1KGhlYWRlci0+c2l6ZSk7CisJaWYgKG1hbmlmZXN0X3NpemUgIT0gc2l6ZSkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJtYW5pZmVzdCBzaXplIG1pc21hdGNoICglenUgIT0gJXUpXG4iLAorCQkJCXNpemUsIG1hbmlmZXN0X3NpemUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyogVmFsaWRhdGUgbWFqb3IvbWlub3IgbnVtYmVyICovCisJaWYgKGhlYWRlci0+dmVyc2lvbl9tYWpvciA+IEdSRVlCVVNfVkVSU0lPTl9NQUpPUikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJtYW5pZmVzdCB2ZXJzaW9uIHRvbyBuZXcgKCV1LiV1ID4gJXUuJXUpXG4iLAorCQkJCWhlYWRlci0+dmVyc2lvbl9tYWpvciwgaGVhZGVyLT52ZXJzaW9uX21pbm9yLAorCQkJCUdSRVlCVVNfVkVSU0lPTl9NQUpPUiwgR1JFWUJVU19WRVJTSU9OX01JTk9SKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIE9LLCBmaW5kIGFsbCB0aGUgZGVzY3JpcHRvcnMgKi8KKwlkZXNjID0gbWFuaWZlc3QtPmRlc2NyaXB0b3JzOworCXNpemUgLT0gc2l6ZW9mKCpoZWFkZXIpOworCXdoaWxlIChzaXplKSB7CisJCWludCBkZXNjX3NpemU7CisKKwkJZGVzY19zaXplID0gaWRlbnRpZnlfZGVzY3JpcHRvcihpbnRmLCBkZXNjLCBzaXplKTsKKwkJaWYgKGRlc2Nfc2l6ZSA8IDApIHsKKwkJCXJlc3VsdCA9IGZhbHNlOworCQkJZ290byBvdXQ7CisJCX0KKwkJZGVzYyA9IChzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yICopKChjaGFyICopZGVzYyArIGRlc2Nfc2l6ZSk7CisJCXNpemUgLT0gZGVzY19zaXplOworCX0KKworCS8qIFRoZXJlIG11c3QgYmUgYSBzaW5nbGUgaW50ZXJmYWNlIGRlc2NyaXB0b3IgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc2NyaXB0b3IsICZpbnRmLT5tYW5pZmVzdF9kZXNjcywgbGlua3MpIHsKKwkJaWYgKGRlc2NyaXB0b3ItPnR5cGUgPT0gR1JFWUJVU19UWVBFX0lOVEVSRkFDRSkKKwkJCWlmICghZm91bmQrKykKKwkJCQlpbnRlcmZhY2VfZGVzYyA9IGRlc2NyaXB0b3I7CisJfQorCWlmIChmb3VuZCAhPSAxKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIm1hbmlmZXN0IG11c3QgaGF2ZSAxIGludGVyZmFjZSBkZXNjcmlwdG9yICgldSBmb3VuZClcbiIsCisJCQkJZm91bmQpOworCQlyZXN1bHQgPSBmYWxzZTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogUGFyc2UgdGhlIG1hbmlmZXN0LCBzdGFydGluZyB3aXRoIHRoZSBpbnRlcmZhY2UgZGVzY3JpcHRvciAqLworCXJlc3VsdCA9IGdiX21hbmlmZXN0X3BhcnNlX2ludGVyZmFjZShpbnRmLCBpbnRlcmZhY2VfZGVzYyk7CisKKwkvKgorCSAqIFdlIHJlYWxseSBzaG91bGQgaGF2ZSBubyByZW1haW5pbmcgZGVzY3JpcHRvcnMsIGJ1dCB3ZQorCSAqIGRvbid0IGtub3cgd2hhdCBuZXdlciBmb3JtYXQgbWFuaWZlc3RzIG1pZ2h0IGxlYXZlLgorCSAqLworCWlmIChyZXN1bHQgJiYgIWxpc3RfZW1wdHkoJmludGYtPm1hbmlmZXN0X2Rlc2NzKSkKKwkJZGV2X2luZm8oJmludGYtPmRldiwgImV4Y2VzcyBkZXNjcmlwdG9ycyBpbiBpbnRlcmZhY2UgbWFuaWZlc3RcbiIpOworb3V0OgorCXJlbGVhc2VfbWFuaWZlc3RfZGVzY3JpcHRvcnMoaW50Zik7CisKKwlyZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvbWFuaWZlc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL21hbmlmZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2NDI4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL21hbmlmZXN0LmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIEdyZXlidXMgbWFuaWZlc3QgcGFyc2luZworICoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpZm5kZWYgX19NQU5JRkVTVF9ICisjZGVmaW5lIF9fTUFOSUZFU1RfSAorCitzdHJ1Y3QgZ2JfaW50ZXJmYWNlOworYm9vbCBnYl9tYW5pZmVzdF9wYXJzZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyNlbmRpZiAvKiBfX01BTklGRVNUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL21vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmNjdkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL21vZHVsZS5jCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogR3JleWJ1cyBNb2R1bGUgY29kZQorICoKKyAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNiBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlICJncmV5YnVzLmgiCisjaW5jbHVkZSAiZ3JleWJ1c190cmFjZS5oIgorCisKK3N0YXRpYyBzc2l6ZV90IGVqZWN0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGdiX21vZHVsZSAqbW9kdWxlID0gdG9fZ2JfbW9kdWxlKGRldik7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZjsKKwlzaXplX3QgaTsKKwlsb25nIHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0ga3N0cnRvbChidWYsIDAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIXZhbCkKKwkJcmV0dXJuIGxlbjsKKworCWZvciAoaSA9IDA7IGkgPCBtb2R1bGUtPm51bV9pbnRlcmZhY2VzOyArK2kpIHsKKwkJaW50ZiA9IG1vZHVsZS0+aW50ZXJmYWNlc1tpXTsKKworCQltdXRleF9sb2NrKCZpbnRmLT5tdXRleCk7CisJCS8qIFNldCBmbGFnIHRvIHByZXZlbnQgY29uY3VycmVudCBhY3RpdmF0aW9uLiAqLworCQlpbnRmLT5lamVjdGVkID0gdHJ1ZTsKKwkJZ2JfaW50ZXJmYWNlX2Rpc2FibGUoaW50Zik7CisJCWdiX2ludGVyZmFjZV9kZWFjdGl2YXRlKGludGYpOworCQltdXRleF91bmxvY2soJmludGYtPm11dGV4KTsKKwl9CisKKwkvKiBUZWxsIHRoZSBTVkMgdG8gZWplY3QgdGhlIHByaW1hcnkgaW50ZXJmYWNlLiAqLworCXJldCA9IGdiX3N2Y19pbnRmX2VqZWN0KG1vZHVsZS0+aGQtPnN2YywgbW9kdWxlLT5tb2R1bGVfaWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIERFVklDRV9BVFRSX1dPKGVqZWN0KTsKKworc3RhdGljIHNzaXplX3QgbW9kdWxlX2lkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGdiX21vZHVsZSAqbW9kdWxlID0gdG9fZ2JfbW9kdWxlKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgbW9kdWxlLT5tb2R1bGVfaWQpOworfQorc3RhdGljIERFVklDRV9BVFRSX1JPKG1vZHVsZV9pZCk7CisKK3N0YXRpYyBzc2l6ZV90IG51bV9pbnRlcmZhY2VzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGdiX21vZHVsZSAqbW9kdWxlID0gdG9fZ2JfbW9kdWxlKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlenVcbiIsIG1vZHVsZS0+bnVtX2ludGVyZmFjZXMpOworfQorc3RhdGljIERFVklDRV9BVFRSX1JPKG51bV9pbnRlcmZhY2VzKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm1vZHVsZV9hdHRyc1tdID0geworCSZkZXZfYXR0cl9lamVjdC5hdHRyLAorCSZkZXZfYXR0cl9tb2R1bGVfaWQuYXR0ciwKKwkmZGV2X2F0dHJfbnVtX2ludGVyZmFjZXMuYXR0ciwKKwlOVUxMLAorfTsKK0FUVFJJQlVURV9HUk9VUFMobW9kdWxlKTsKKworc3RhdGljIHZvaWQgZ2JfbW9kdWxlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnYl9tb2R1bGUgKm1vZHVsZSA9IHRvX2diX21vZHVsZShkZXYpOworCisJdHJhY2VfZ2JfbW9kdWxlX3JlbGVhc2UobW9kdWxlKTsKKworCWtmcmVlKG1vZHVsZSk7Cit9CisKK3N0cnVjdCBkZXZpY2VfdHlwZSBncmV5YnVzX21vZHVsZV90eXBlID0geworCS5uYW1lCQk9ICJncmV5YnVzX21vZHVsZSIsCisJLnJlbGVhc2UJPSBnYl9tb2R1bGVfcmVsZWFzZSwKK307CisKK3N0cnVjdCBnYl9tb2R1bGUgKmdiX21vZHVsZV9jcmVhdGUoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTggbW9kdWxlX2lkLAorCQkJCQlzaXplX3QgbnVtX2ludGVyZmFjZXMpCit7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZjsKKwlzdHJ1Y3QgZ2JfbW9kdWxlICptb2R1bGU7CisJaW50IGk7CisKKwltb2R1bGUgPSBremFsbG9jKHNpemVvZigqbW9kdWxlKSArIG51bV9pbnRlcmZhY2VzICogc2l6ZW9mKGludGYpLAorCQkJCUdGUF9LRVJORUwpOworCWlmICghbW9kdWxlKQorCQlyZXR1cm4gTlVMTDsKKworCW1vZHVsZS0+aGQgPSBoZDsKKwltb2R1bGUtPm1vZHVsZV9pZCA9IG1vZHVsZV9pZDsKKwltb2R1bGUtPm51bV9pbnRlcmZhY2VzID0gbnVtX2ludGVyZmFjZXM7CisKKwltb2R1bGUtPmRldi5wYXJlbnQgPSAmaGQtPmRldjsKKwltb2R1bGUtPmRldi5idXMgPSAmZ3JleWJ1c19idXNfdHlwZTsKKwltb2R1bGUtPmRldi50eXBlID0gJmdyZXlidXNfbW9kdWxlX3R5cGU7CisJbW9kdWxlLT5kZXYuZ3JvdXBzID0gbW9kdWxlX2dyb3VwczsKKwltb2R1bGUtPmRldi5kbWFfbWFzayA9IGhkLT5kZXYuZG1hX21hc2s7CisJZGV2aWNlX2luaXRpYWxpemUoJm1vZHVsZS0+ZGV2KTsKKwlkZXZfc2V0X25hbWUoJm1vZHVsZS0+ZGV2LCAiJWQtJXUiLCBoZC0+YnVzX2lkLCBtb2R1bGVfaWQpOworCisJdHJhY2VfZ2JfbW9kdWxlX2NyZWF0ZShtb2R1bGUpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9pbnRlcmZhY2VzOyArK2kpIHsKKwkJaW50ZiA9IGdiX2ludGVyZmFjZV9jcmVhdGUobW9kdWxlLCBtb2R1bGVfaWQgKyBpKTsKKwkJaWYgKCFpbnRmKSB7CisJCQlkZXZfZXJyKCZtb2R1bGUtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgaW50ZXJmYWNlICV1XG4iLAorCQkJCQltb2R1bGVfaWQgKyBpKTsKKwkJCWdvdG8gZXJyX3B1dF9pbnRlcmZhY2VzOworCQl9CisJCW1vZHVsZS0+aW50ZXJmYWNlc1tpXSA9IGludGY7CisJfQorCisJcmV0dXJuIG1vZHVsZTsKKworZXJyX3B1dF9pbnRlcmZhY2VzOgorCWZvciAoLS1pOyBpID4gMDsgLS1pKQorCQlnYl9pbnRlcmZhY2VfcHV0KG1vZHVsZS0+aW50ZXJmYWNlc1tpXSk7CisKKwlwdXRfZGV2aWNlKCZtb2R1bGUtPmRldik7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFJlZ2lzdGVyIGFuZCBlbmFibGUgYW4gaW50ZXJmYWNlIGFmdGVyIGZpcnN0IGF0dGVtcHRpbmcgdG8gYWN0aXZhdGUgaXQuCisgKi8KK3N0YXRpYyB2b2lkIGdiX21vZHVsZV9yZWdpc3Rlcl9pbnRlcmZhY2Uoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgZ2JfbW9kdWxlICptb2R1bGUgPSBpbnRmLT5tb2R1bGU7CisJdTggaW50Zl9pZCA9IGludGYtPmludGVyZmFjZV9pZDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmaW50Zi0+bXV0ZXgpOworCisJcmV0ID0gZ2JfaW50ZXJmYWNlX2FjdGl2YXRlKGludGYpOworCWlmIChyZXQpIHsKKwkJaWYgKGludGYtPnR5cGUgIT0gR0JfSU5URVJGQUNFX1RZUEVfRFVNTVkpIHsKKwkJCWRldl9lcnIoJm1vZHVsZS0+ZGV2LAorCQkJCQkiZmFpbGVkIHRvIGFjdGl2YXRlIGludGVyZmFjZSAldTogJWRcbiIsCisJCQkJCWludGZfaWQsIHJldCk7CisJCX0KKworCQlnYl9pbnRlcmZhY2VfYWRkKGludGYpOworCQlnb3RvIGVycl91bmxvY2s7CisJfQorCisJcmV0ID0gZ2JfaW50ZXJmYWNlX2FkZChpbnRmKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9pbnRlcmZhY2VfZGVhY3RpdmF0ZTsKKworCXJldCA9IGdiX2ludGVyZmFjZV9lbmFibGUoaW50Zik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZtb2R1bGUtPmRldiwgImZhaWxlZCB0byBlbmFibGUgaW50ZXJmYWNlICV1OiAlZFxuIiwKKwkJCQlpbnRmX2lkLCByZXQpOworCQlnb3RvIGVycl9pbnRlcmZhY2VfZGVhY3RpdmF0ZTsKKwl9CisKKwltdXRleF91bmxvY2soJmludGYtPm11dGV4KTsKKworCXJldHVybjsKKworZXJyX2ludGVyZmFjZV9kZWFjdGl2YXRlOgorCWdiX2ludGVyZmFjZV9kZWFjdGl2YXRlKGludGYpOworZXJyX3VubG9jazoKKwltdXRleF91bmxvY2soJmludGYtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgZ2JfbW9kdWxlX2RlcmVnaXN0ZXJfaW50ZXJmYWNlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpCit7CisJLyogTWFyayBhcyBkaXNjb25uZWN0ZWQgdG8gcHJldmVudCBJL08gZHVyaW5nIGRpc2FibGUuICovCisJaWYgKGludGYtPm1vZHVsZS0+ZGlzY29ubmVjdGVkKQorCQlpbnRmLT5kaXNjb25uZWN0ZWQgPSB0cnVlOworCisJbXV0ZXhfbG9jaygmaW50Zi0+bXV0ZXgpOworCWludGYtPnJlbW92ZWQgPSB0cnVlOworCWdiX2ludGVyZmFjZV9kaXNhYmxlKGludGYpOworCWdiX2ludGVyZmFjZV9kZWFjdGl2YXRlKGludGYpOworCW11dGV4X3VubG9jaygmaW50Zi0+bXV0ZXgpOworCisJZ2JfaW50ZXJmYWNlX2RlbChpbnRmKTsKK30KKworLyogUmVnaXN0ZXIgYSBtb2R1bGUgYW5kIGl0cyBpbnRlcmZhY2VzLiAqLworaW50IGdiX21vZHVsZV9hZGQoc3RydWN0IGdiX21vZHVsZSAqbW9kdWxlKQoreworCXNpemVfdCBpOworCWludCByZXQ7CisKKwlyZXQgPSBkZXZpY2VfYWRkKCZtb2R1bGUtPmRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZtb2R1bGUtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBtb2R1bGU6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXRyYWNlX2diX21vZHVsZV9hZGQobW9kdWxlKTsKKworCWZvciAoaSA9IDA7IGkgPCBtb2R1bGUtPm51bV9pbnRlcmZhY2VzOyArK2kpCisJCWdiX21vZHVsZV9yZWdpc3Rlcl9pbnRlcmZhY2UobW9kdWxlLT5pbnRlcmZhY2VzW2ldKTsKKworCXJldHVybiAwOworfQorCisvKiBEZXJlZ2lzdGVyIGEgbW9kdWxlIGFuZCBpdHMgaW50ZXJmYWNlcy4gKi8KK3ZvaWQgZ2JfbW9kdWxlX2RlbChzdHJ1Y3QgZ2JfbW9kdWxlICptb2R1bGUpCit7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbW9kdWxlLT5udW1faW50ZXJmYWNlczsgKytpKQorCQlnYl9tb2R1bGVfZGVyZWdpc3Rlcl9pbnRlcmZhY2UobW9kdWxlLT5pbnRlcmZhY2VzW2ldKTsKKworCXRyYWNlX2diX21vZHVsZV9kZWwobW9kdWxlKTsKKworCWRldmljZV9kZWwoJm1vZHVsZS0+ZGV2KTsKK30KKwordm9pZCBnYl9tb2R1bGVfcHV0KHN0cnVjdCBnYl9tb2R1bGUgKm1vZHVsZSkKK3sKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtb2R1bGUtPm51bV9pbnRlcmZhY2VzOyArK2kpCisJCWdiX2ludGVyZmFjZV9wdXQobW9kdWxlLT5pbnRlcmZhY2VzW2ldKTsKKworCXB1dF9kZXZpY2UoJm1vZHVsZS0+ZGV2KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL21vZHVsZS5oIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvbW9kdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhhOTdjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL21vZHVsZS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBHcmV5YnVzIE1vZHVsZSBjb2RlCisgKgorICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE2IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2lmbmRlZiBfX01PRFVMRV9ICisjZGVmaW5lIF9fTU9EVUxFX0gKKworc3RydWN0IGdiX21vZHVsZSB7CisJc3RydWN0IGRldmljZSBkZXY7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZDsKKworCXN0cnVjdCBsaXN0X2hlYWQgaGRfbm9kZTsKKworCXU4IG1vZHVsZV9pZDsKKwlzaXplX3QgbnVtX2ludGVyZmFjZXM7CisKKwlib29sIGRpc2Nvbm5lY3RlZDsKKworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGVyZmFjZXNbMF07Cit9OworI2RlZmluZSB0b19nYl9tb2R1bGUoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBnYl9tb2R1bGUsIGRldikKKworc3RydWN0IGdiX21vZHVsZSAqZ2JfbW9kdWxlX2NyZWF0ZShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1OCBtb2R1bGVfaWQsCisJCQkJICAgc2l6ZV90IG51bV9pbnRlcmZhY2VzKTsKK2ludCBnYl9tb2R1bGVfYWRkKHN0cnVjdCBnYl9tb2R1bGUgKm1vZHVsZSk7Cit2b2lkIGdiX21vZHVsZV9kZWwoc3RydWN0IGdiX21vZHVsZSAqbW9kdWxlKTsKK3ZvaWQgZ2JfbW9kdWxlX3B1dChzdHJ1Y3QgZ2JfbW9kdWxlICptb2R1bGUpOworCisjZW5kaWYgLyogX19NT0RVTEVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvb3BlcmF0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9vcGVyYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTIzMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvb3BlcmF0aW9uLmMKQEAgLTAsMCArMSwxMjM5IEBACisvKgorICogR3JleWJ1cyBvcGVyYXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQtMjAxNSBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlICJncmV5YnVzLmgiCisjaW5jbHVkZSAiZ3JleWJ1c190cmFjZS5oIgorCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmdiX29wZXJhdGlvbl9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZ2JfbWVzc2FnZV9jYWNoZTsKKworLyogV29ya3F1ZXVlIHRvIGhhbmRsZSBHcmV5YnVzIG9wZXJhdGlvbiBjb21wbGV0aW9ucy4gKi8KK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZ2Jfb3BlcmF0aW9uX2NvbXBsZXRpb25fd3E7CisKKy8qIFdhaXQgcXVldWUgZm9yIHN5bmNocm9ub3VzIGNhbmNlbGxhdGlvbnMuICovCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZ2Jfb3BlcmF0aW9uX2NhbmNlbGxhdGlvbl9xdWV1ZSk7CisKKy8qCisgKiBQcm90ZWN0cyB1cGRhdGVzIHRvIG9wZXJhdGlvbi0+ZXJybm8uCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ2Jfb3BlcmF0aW9uc19sb2NrKTsKKworc3RhdGljIGludCBnYl9vcGVyYXRpb25fcmVzcG9uc2Vfc2VuZChzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24sCisJCQkJCWludCBlcnJubyk7CisKKy8qCisgKiBJbmNyZW1lbnQgb3BlcmF0aW9uIGFjdGl2ZSBjb3VudCBhbmQgYWRkIHRvIGNvbm5lY3Rpb24gbGlzdCB1bmxlc3MgdGhlCisgKiBjb25uZWN0aW9uIGlzIGdvaW5nIGF3YXkuCisgKgorICogQ2FsbGVyIGhvbGRzIG9wZXJhdGlvbiByZWZlcmVuY2UuCisgKi8KK3N0YXRpYyBpbnQgZ2Jfb3BlcmF0aW9uX2dldF9hY3RpdmUoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3BlcmF0aW9uLT5jb25uZWN0aW9uOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29ubmVjdGlvbi0+bG9jaywgZmxhZ3MpOworCXN3aXRjaCAoY29ubmVjdGlvbi0+c3RhdGUpIHsKKwljYXNlIEdCX0NPTk5FQ1RJT05fU1RBVEVfRU5BQkxFRDoKKwkJYnJlYWs7CisJY2FzZSBHQl9DT05ORUNUSU9OX1NUQVRFX0VOQUJMRURfVFg6CisJCWlmIChnYl9vcGVyYXRpb25faXNfaW5jb21pbmcob3BlcmF0aW9uKSkKKwkJCWdvdG8gZXJyX3VubG9jazsKKwkJYnJlYWs7CisJY2FzZSBHQl9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RJTkc6CisJCWlmICghZ2Jfb3BlcmF0aW9uX2lzX2NvcmUob3BlcmF0aW9uKSkKKwkJCWdvdG8gZXJyX3VubG9jazsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBlcnJfdW5sb2NrOworCX0KKworCWlmIChvcGVyYXRpb24tPmFjdGl2ZSsrID09IDApCisJCWxpc3RfYWRkX3RhaWwoJm9wZXJhdGlvbi0+bGlua3MsICZjb25uZWN0aW9uLT5vcGVyYXRpb25zKTsKKworCXRyYWNlX2diX29wZXJhdGlvbl9nZXRfYWN0aXZlKG9wZXJhdGlvbik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25uZWN0aW9uLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKKworZXJyX3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25uZWN0aW9uLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gLUVOT1RDT05OOworfQorCisvKiBDYWxsZXIgaG9sZHMgb3BlcmF0aW9uIHJlZmVyZW5jZS4gKi8KK3N0YXRpYyB2b2lkIGdiX29wZXJhdGlvbl9wdXRfYWN0aXZlKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbikKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wZXJhdGlvbi0+Y29ubmVjdGlvbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbm5lY3Rpb24tPmxvY2ssIGZsYWdzKTsKKworCXRyYWNlX2diX29wZXJhdGlvbl9wdXRfYWN0aXZlKG9wZXJhdGlvbik7CisKKwlpZiAoLS1vcGVyYXRpb24tPmFjdGl2ZSA9PSAwKSB7CisJCWxpc3RfZGVsKCZvcGVyYXRpb24tPmxpbmtzKTsKKwkJaWYgKGF0b21pY19yZWFkKCZvcGVyYXRpb24tPndhaXRlcnMpKQorCQkJd2FrZV91cCgmZ2Jfb3BlcmF0aW9uX2NhbmNlbGxhdGlvbl9xdWV1ZSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbm5lY3Rpb24tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGJvb2wgZ2Jfb3BlcmF0aW9uX2lzX2FjdGl2ZShzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24pCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcGVyYXRpb24tPmNvbm5lY3Rpb247CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25uZWN0aW9uLT5sb2NrLCBmbGFncyk7CisJcmV0ID0gb3BlcmF0aW9uLT5hY3RpdmU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29ubmVjdGlvbi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFNldCBhbiBvcGVyYXRpb24ncyByZXN1bHQuCisgKgorICogSW5pdGlhbGx5IGFuIG91dGdvaW5nIG9wZXJhdGlvbidzIGVycm5vIHZhbHVlIGlzIC1FQkFEUi4KKyAqIElmIG5vIGVycm9yIG9jY3VycyBiZWZvcmUgc2VuZGluZyB0aGUgcmVxdWVzdCBtZXNzYWdlIHRoZSBvbmx5CisgKiB2YWxpZCB2YWx1ZSBvcGVyYXRpb24tPmVycm5vIGNhbiBiZSBzZXQgdG8gaXMgLUVJTlBST0dSRVNTLAorICogaW5kaWNhdGluZyB0aGUgcmVxdWVzdCBoYXMgYmVlbiAob3IgcmF0aGVyIGlzIGFib3V0IHRvIGJlKSBzZW50LgorICogQXQgdGhhdCBwb2ludCBub2JvZHkgc2hvdWxkIGJlIGxvb2tpbmcgYXQgdGhlIHJlc3VsdCB1bnRpbCB0aGUKKyAqIHJlc3BvbnNlIGFycml2ZXMuCisgKgorICogVGhlIGZpcnN0IHRpbWUgdGhlIHJlc3VsdCBnZXRzIHNldCBhZnRlciB0aGUgcmVxdWVzdCBoYXMgYmVlbgorICogc2VudCwgdGhhdCByZXN1bHQgInN0aWNrcy4iICBUaGF0IGlzLCBpZiB0d28gY29uY3VycmVudCB0aHJlYWRzCisgKiByYWNlIHRvIHNldCB0aGUgcmVzdWx0LCB0aGUgZmlyc3Qgb25lIHdpbnMuICBUaGUgcmV0dXJuIHZhbHVlCisgKiB0ZWxscyB0aGUgY2FsbGVyIHdoZXRoZXIgaXRzIHJlc3VsdCB3YXMgcmVjb3JkZWQ7IGlmIG5vdCB0aGUKKyAqIGNhbGxlciBoYXMgbm90aGluZyBtb3JlIHRvIGRvLgorICoKKyAqIFRoZSByZXN1bHQgdmFsdWUgLUVJTFNFUSBpcyByZXNlcnZlZCB0byBzaWduYWwgYW4gaW1wbGVtZW50YXRpb24KKyAqIGVycm9yOyBpZiBpdCdzIGV2ZXIgb2JzZXJ2ZWQsIHRoZSBjb2RlIHBlcmZvcm1pbmcgdGhlIHJlcXVlc3QgaGFzCisgKiBkb25lIHNvbWV0aGluZyBmdW5kYW1lbnRhbGx5IHdyb25nLiAgSXQgaXMgYW4gZXJyb3IgdG8gdHJ5IHRvIHNldAorICogdGhlIHJlc3VsdCB0byAtRUJBRFIsIGFuZCBhdHRlbXB0cyB0byBkbyBzbyByZXN1bHQgaW4gYSB3YXJuaW5nLAorICogYW5kIC1FSUxTRVEgaXMgdXNlZCBpbnN0ZWFkLiAgU2ltaWxhcmx5LCB0aGUgb25seSB2YWxpZCByZXN1bHQKKyAqIHZhbHVlIHRvIHNldCBmb3IgYW4gb3BlcmF0aW9uIGluIGluaXRpYWwgc3RhdGUgaXMgLUVJTlBST0dSRVNTLgorICogQXR0ZW1wdHMgdG8gZG8gb3RoZXJ3aXNlIHdpbGwgYWxzbyByZWNvcmQgYSAoc3VjY2Vzc2Z1bCkgLUVJTFNFUQorICogb3BlcmF0aW9uIHJlc3VsdC4KKyAqLworc3RhdGljIGJvb2wgZ2Jfb3BlcmF0aW9uX3Jlc3VsdF9zZXQoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uLCBpbnQgcmVzdWx0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHByZXY7CisKKwlpZiAocmVzdWx0ID09IC1FSU5QUk9HUkVTUykgeworCQkvKgorCQkgKiAtRUlOUFJPR1JFU1MgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgcmVxdWVzdCBpcworCQkgKiBpbiBmbGlnaHQuICBJdCBzaG91bGQgYmUgdGhlIGZpcnN0IHJlc3VsdCB2YWx1ZQorCQkgKiBzZXQgYWZ0ZXIgdGhlIGluaXRpYWwgLUVCQURSLiAgSXNzdWUgYSB3YXJuaW5nCisJCSAqIGFuZCByZWNvcmQgYW4gaW1wbGVtZW50YXRpb24gZXJyb3IgaWYgaXQncworCQkgKiBzZXQgYXQgYW55IG90aGVyIHRpbWUuCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2Jfb3BlcmF0aW9uc19sb2NrLCBmbGFncyk7CisJCXByZXYgPSBvcGVyYXRpb24tPmVycm5vOworCQlpZiAocHJldiA9PSAtRUJBRFIpCisJCQlvcGVyYXRpb24tPmVycm5vID0gcmVzdWx0OworCQllbHNlCisJCQlvcGVyYXRpb24tPmVycm5vID0gLUVJTFNFUTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2Jfb3BlcmF0aW9uc19sb2NrLCBmbGFncyk7CisJCVdBUk5fT04ocHJldiAhPSAtRUJBRFIpOworCisJCXJldHVybiB0cnVlOworCX0KKworCS8qCisJICogVGhlIGZpcnN0IHJlc3VsdCB2YWx1ZSBzZXQgYWZ0ZXIgYSByZXF1ZXN0IGhhcyBiZWVuIHNlbnQKKwkgKiB3aWxsIGJlIHRoZSBmaW5hbCByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4gIFN1YnNlcXVlbnQKKwkgKiBhdHRlbXB0cyB0byBzZXQgdGhlIHJlc3VsdCBhcmUgaWdub3JlZC4KKwkgKgorCSAqIE5vdGUgdGhhdCAtRUJBRFIgaXMgYSByZXNlcnZlZCAiaW5pdGlhbCBzdGF0ZSIgcmVzdWx0CisJICogdmFsdWUuICBBdHRlbXB0cyB0byBzZXQgdGhpcyB2YWx1ZSByZXN1bHQgaW4gYSB3YXJuaW5nLAorCSAqIGFuZCB0aGUgcmVzdWx0IGNvZGUgaXMgc2V0IHRvIC1FSUxTRVEgaW5zdGVhZC4KKwkgKi8KKwlpZiAoV0FSTl9PTihyZXN1bHQgPT0gLUVCQURSKSkKKwkJcmVzdWx0ID0gLUVJTFNFUTsgLyogTm9ib2R5IHNob3VsZCBiZSBzZXR0aW5nIC1FQkFEUiAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdiX29wZXJhdGlvbnNfbG9jaywgZmxhZ3MpOworCXByZXYgPSBvcGVyYXRpb24tPmVycm5vOworCWlmIChwcmV2ID09IC1FSU5QUk9HUkVTUykKKwkJb3BlcmF0aW9uLT5lcnJubyA9IHJlc3VsdDsJLyogRmlyc3QgYW5kIGZpbmFsIHJlc3VsdCAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdiX29wZXJhdGlvbnNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHByZXYgPT0gLUVJTlBST0dSRVNTOworfQorCitpbnQgZ2Jfb3BlcmF0aW9uX3Jlc3VsdChzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24pCit7CisJaW50IHJlc3VsdCA9IG9wZXJhdGlvbi0+ZXJybm87CisKKwlXQVJOX09OKHJlc3VsdCA9PSAtRUJBRFIpOworCVdBUk5fT04ocmVzdWx0ID09IC1FSU5QUk9HUkVTUyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2Jfb3BlcmF0aW9uX3Jlc3VsdCk7CisKKy8qCisgKiBMb29rcyB1cCBhbiBvdXRnb2luZyBvcGVyYXRpb24gb24gYSBjb25uZWN0aW9uIGFuZCByZXR1cm5zIGEgcmVmY291bnRlZAorICogcG9pbnRlciBpZiBmb3VuZCwgb3IgTlVMTCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICoKK2diX29wZXJhdGlvbl9maW5kX291dGdvaW5nKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1MTYgb3BlcmF0aW9uX2lkKQoreworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25uZWN0aW9uLT5sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvcGVyYXRpb24sICZjb25uZWN0aW9uLT5vcGVyYXRpb25zLCBsaW5rcykKKwkJaWYgKG9wZXJhdGlvbi0+aWQgPT0gb3BlcmF0aW9uX2lkICYmCisJCQkJIWdiX29wZXJhdGlvbl9pc19pbmNvbWluZyhvcGVyYXRpb24pKSB7CisJCQlnYl9vcGVyYXRpb25fZ2V0KG9wZXJhdGlvbik7CisJCQlmb3VuZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbm5lY3Rpb24tPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBmb3VuZCA/IG9wZXJhdGlvbiA6IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbWVzc2FnZV9zZW5kKHN0cnVjdCBnYl9tZXNzYWdlICptZXNzYWdlLCBnZnBfdCBnZnApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBtZXNzYWdlLT5vcGVyYXRpb24tPmNvbm5lY3Rpb247CisKKwl0cmFjZV9nYl9tZXNzYWdlX3NlbmQobWVzc2FnZSk7CisJcmV0dXJuIGNvbm5lY3Rpb24tPmhkLT5kcml2ZXItPm1lc3NhZ2Vfc2VuZChjb25uZWN0aW9uLT5oZCwKKwkJCQkJY29ubmVjdGlvbi0+aGRfY3BvcnRfaWQsCisJCQkJCW1lc3NhZ2UsCisJCQkJCWdmcCk7Cit9CisKKy8qCisgKiBDYW5jZWwgYSBtZXNzYWdlIHdlIGhhdmUgcGFzc2VkIHRvIHRoZSBob3N0IGRldmljZSBsYXllciB0byBiZSBzZW50LgorICovCitzdGF0aWMgdm9pZCBnYl9tZXNzYWdlX2NhbmNlbChzdHJ1Y3QgZ2JfbWVzc2FnZSAqbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gbWVzc2FnZS0+b3BlcmF0aW9uLT5jb25uZWN0aW9uLT5oZDsKKworCWhkLT5kcml2ZXItPm1lc3NhZ2VfY2FuY2VsKG1lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZCBnYl9vcGVyYXRpb25fcmVxdWVzdF9oYW5kbGUoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3BlcmF0aW9uLT5jb25uZWN0aW9uOworCWludCBzdGF0dXM7CisJaW50IHJldDsKKworCWlmIChjb25uZWN0aW9uLT5oYW5kbGVyKSB7CisJCXN0YXR1cyA9IGNvbm5lY3Rpb24tPmhhbmRsZXIob3BlcmF0aW9uKTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5oZC0+ZGV2LAorCQkJIiVzOiB1bmV4cGVjdGVkIGluY29taW5nIHJlcXVlc3Qgb2YgdHlwZSAweCUwMnhcbiIsCisJCQljb25uZWN0aW9uLT5uYW1lLCBvcGVyYXRpb24tPnR5cGUpOworCisJCXN0YXR1cyA9IC1FUFJPVE9OT1NVUFBPUlQ7CisJfQorCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3Jlc3BvbnNlX3NlbmQob3BlcmF0aW9uLCBzdGF0dXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+aGQtPmRldiwKKwkJCSIlczogZmFpbGVkIHRvIHNlbmQgcmVzcG9uc2UgJWQgZm9yIHR5cGUgMHglMDJ4OiAlZFxuIiwKKwkJCWNvbm5lY3Rpb24tPm5hbWUsIHN0YXR1cywgb3BlcmF0aW9uLT50eXBlLCByZXQpOworCQlyZXR1cm47CisJfQorfQorCisvKgorICogUHJvY2VzcyBvcGVyYXRpb24gd29yay4KKyAqCisgKiBGb3IgaW5jb21pbmcgcmVxdWVzdHMsIGNhbGwgdGhlIHByb3RvY29sIHJlcXVlc3QgaGFuZGxlci4gVGhlIG9wZXJhdGlvbgorICogcmVzdWx0IHNob3VsZCBiZSAtRUlOUFJPR1JFU1MgYXQgdGhpcyBwb2ludC4KKyAqCisgKiBGb3Igb3V0Z29pbmcgcmVxdWVzdHMsIHRoZSBvcGVyYXRpb24gcmVzdWx0IHZhbHVlIHNob3VsZCBoYXZlCisgKiBiZWVuIHNldCBiZWZvcmUgcXVldWVpbmcgdGhpcy4gIFRoZSBvcGVyYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24KKyAqIGFsbG93cyB0aGUgb3JpZ2luYWwgcmVxdWVzdGVyIHRvIGtub3cgdGhlIHJlcXVlc3QgaGFzIGNvbXBsZXRlZAorICogYW5kIGl0cyByZXN1bHQgaXMgYXZhaWxhYmxlLgorICovCitzdGF0aWMgdm9pZCBnYl9vcGVyYXRpb25fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCisJb3BlcmF0aW9uID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBnYl9vcGVyYXRpb24sIHdvcmspOworCisJaWYgKGdiX29wZXJhdGlvbl9pc19pbmNvbWluZyhvcGVyYXRpb24pKQorCQlnYl9vcGVyYXRpb25fcmVxdWVzdF9oYW5kbGUob3BlcmF0aW9uKTsKKwllbHNlCisJCW9wZXJhdGlvbi0+Y2FsbGJhY2sob3BlcmF0aW9uKTsKKworCWdiX29wZXJhdGlvbl9wdXRfYWN0aXZlKG9wZXJhdGlvbik7CisJZ2Jfb3BlcmF0aW9uX3B1dChvcGVyYXRpb24pOworfQorCitzdGF0aWMgdm9pZCBnYl9vcGVyYXRpb25fbWVzc2FnZV9pbml0KHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsCisJCQkJc3RydWN0IGdiX21lc3NhZ2UgKm1lc3NhZ2UsIHUxNiBvcGVyYXRpb25faWQsCisJCQkJc2l6ZV90IHBheWxvYWRfc2l6ZSwgdTggdHlwZSkKK3sKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uX21zZ19oZHIgKmhlYWRlcjsKKworCWhlYWRlciA9IG1lc3NhZ2UtPmJ1ZmZlcjsKKworCW1lc3NhZ2UtPmhlYWRlciA9IGhlYWRlcjsKKwltZXNzYWdlLT5wYXlsb2FkID0gcGF5bG9hZF9zaXplID8gaGVhZGVyICsgMSA6IE5VTEw7CisJbWVzc2FnZS0+cGF5bG9hZF9zaXplID0gcGF5bG9hZF9zaXplOworCisJLyoKKwkgKiBUaGUgdHlwZSBzdXBwbGllZCBmb3IgaW5jb21pbmcgbWVzc2FnZSBidWZmZXJzIHdpbGwgYmUKKwkgKiBHQl9SRVFVRVNUX1RZUEVfSU5WQUxJRC4gU3VjaCBidWZmZXJzIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkKKwkgKiBhcnJpdmluZyBkYXRhIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBpbml0aWFsaXplIHRoZSBtZXNzYWdlIGhlYWRlci4KKwkgKi8KKwlpZiAodHlwZSAhPSBHQl9SRVFVRVNUX1RZUEVfSU5WQUxJRCkgeworCQl1MTYgbWVzc2FnZV9zaXplID0gKHUxNikoc2l6ZW9mKCpoZWFkZXIpICsgcGF5bG9hZF9zaXplKTsKKworCQkvKgorCQkgKiBGb3IgYSByZXF1ZXN0LCB0aGUgb3BlcmF0aW9uIGlkIGdldHMgZmlsbGVkIGluCisJCSAqIHdoZW4gdGhlIG1lc3NhZ2UgaXMgc2VudC4gIEZvciBhIHJlc3BvbnNlLCBpdAorCQkgKiB3aWxsIGJlIGNvcGllZCBmcm9tIHRoZSByZXF1ZXN0IGJ5IHRoZSBjYWxsZXIuCisJCSAqCisJCSAqIFRoZSByZXN1bHQgZmllbGQgaW4gYSByZXF1ZXN0IG1lc3NhZ2UgbXVzdCBiZQorCQkgKiB6ZXJvLiAgSXQgd2lsbCBiZSBzZXQganVzdCBwcmlvciB0byBzZW5kaW5nIGZvcgorCQkgKiBhIHJlc3BvbnNlLgorCQkgKi8KKwkJaGVhZGVyLT5zaXplID0gY3B1X3RvX2xlMTYobWVzc2FnZV9zaXplKTsKKwkJaGVhZGVyLT5vcGVyYXRpb25faWQgPSAwOworCQloZWFkZXItPnR5cGUgPSB0eXBlOworCQloZWFkZXItPnJlc3VsdCA9IDA7CisJfQorfQorCisvKgorICogQWxsb2NhdGUgYSBtZXNzYWdlIHRvIGJlIHVzZWQgZm9yIGFuIG9wZXJhdGlvbiByZXF1ZXN0IG9yIHJlc3BvbnNlLgorICogQm90aCB0eXBlcyBvZiBtZXNzYWdlIGNvbnRhaW4gYSBjb21tb24gaGVhZGVyLiAgVGhlIHJlcXVlc3QgbWVzc2FnZQorICogZm9yIGFuIG91dGdvaW5nIG9wZXJhdGlvbiBpcyBvdXRib3VuZCwgYXMgaXMgdGhlIHJlc3BvbnNlIG1lc3NhZ2UKKyAqIGZvciBhbiBpbmNvbWluZyBvcGVyYXRpb24uICBUaGUgbWVzc2FnZSBoZWFkZXIgZm9yIGFuIG91dGJvdW5kCisgKiBtZXNzYWdlIGlzIHBhcnRpYWxseSBpbml0aWFsaXplZCBoZXJlLgorICoKKyAqIFRoZSBoZWFkZXJzIGZvciBpbmJvdW5kIG1lc3NhZ2VzIGRvbid0IG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQ7CisgKiB0aGV5J2xsIGJlIGZpbGxlZCBpbiBieSBhcnJpdmluZyBkYXRhLgorICoKKyAqIE91ciBtZXNzYWdlIGJ1ZmZlcnMgaGF2ZSB0aGUgZm9sbG93aW5nIGxheW91dDoKKyAqCW1lc3NhZ2UgaGVhZGVyICBcXyB0aGVzZSBjb21iaW5lZCBhcmUKKyAqCW1lc3NhZ2UgcGF5bG9hZCAvICB0aGUgbWVzc2FnZSBzaXplCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZ2JfbWVzc2FnZSAqCitnYl9vcGVyYXRpb25fbWVzc2FnZV9hbGxvYyhzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1OCB0eXBlLAorCQkJCXNpemVfdCBwYXlsb2FkX3NpemUsIGdmcF90IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3QgZ2JfbWVzc2FnZSAqbWVzc2FnZTsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uX21zZ19oZHIgKmhlYWRlcjsKKwlzaXplX3QgbWVzc2FnZV9zaXplID0gcGF5bG9hZF9zaXplICsgc2l6ZW9mKCpoZWFkZXIpOworCisJaWYgKG1lc3NhZ2Vfc2l6ZSA+IGhkLT5idWZmZXJfc2l6ZV9tYXgpIHsKKwkJZGV2X3dhcm4oJmhkLT5kZXYsICJyZXF1ZXN0ZWQgbWVzc2FnZSBzaXplIHRvbyBiaWcgKCV6dSA+ICV6dSlcbiIsCisJCQkJbWVzc2FnZV9zaXplLCBoZC0+YnVmZmVyX3NpemVfbWF4KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogQWxsb2NhdGUgdGhlIG1lc3NhZ2Ugc3RydWN0dXJlIGFuZCBidWZmZXIuICovCisJbWVzc2FnZSA9IGttZW1fY2FjaGVfemFsbG9jKGdiX21lc3NhZ2VfY2FjaGUsIGdmcF9mbGFncyk7CisJaWYgKCFtZXNzYWdlKQorCQlyZXR1cm4gTlVMTDsKKworCW1lc3NhZ2UtPmJ1ZmZlciA9IGt6YWxsb2MobWVzc2FnZV9zaXplLCBnZnBfZmxhZ3MpOworCWlmICghbWVzc2FnZS0+YnVmZmVyKQorCQlnb3RvIGVycl9mcmVlX21lc3NhZ2U7CisKKwkvKiBJbml0aWFsaXplIHRoZSBtZXNzYWdlLiAgT3BlcmF0aW9uIGlkIGlzIGZpbGxlZCBpbiBsYXRlci4gKi8KKwlnYl9vcGVyYXRpb25fbWVzc2FnZV9pbml0KGhkLCBtZXNzYWdlLCAwLCBwYXlsb2FkX3NpemUsIHR5cGUpOworCisJcmV0dXJuIG1lc3NhZ2U7CisKK2Vycl9mcmVlX21lc3NhZ2U6CisJa21lbV9jYWNoZV9mcmVlKGdiX21lc3NhZ2VfY2FjaGUsIG1lc3NhZ2UpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGdiX29wZXJhdGlvbl9tZXNzYWdlX2ZyZWUoc3RydWN0IGdiX21lc3NhZ2UgKm1lc3NhZ2UpCit7CisJa2ZyZWUobWVzc2FnZS0+YnVmZmVyKTsKKwlrbWVtX2NhY2hlX2ZyZWUoZ2JfbWVzc2FnZV9jYWNoZSwgbWVzc2FnZSk7Cit9CisKKy8qCisgKiBNYXAgYW4gZW51bSBnYl9vcGVyYXRpb25fc3RhdHVzIHZhbHVlICh3aGljaCBpcyByZXByZXNlbnRlZCBpbiBhCisgKiBtZXNzYWdlIGFzIGEgc2luZ2xlIGJ5dGUpIHRvIGFuIGFwcHJvcHJpYXRlIExpbnV4IG5lZ2F0aXZlIGVycm5vLgorICovCitzdGF0aWMgaW50IGdiX29wZXJhdGlvbl9zdGF0dXNfbWFwKHU4IHN0YXR1cykKK3sKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgR0JfT1BfU1VDQ0VTUzoKKwkJcmV0dXJuIDA7CisJY2FzZSBHQl9PUF9JTlRFUlJVUFRFRDoKKwkJcmV0dXJuIC1FSU5UUjsKKwljYXNlIEdCX09QX1RJTUVPVVQ6CisJCXJldHVybiAtRVRJTUVET1VUOworCWNhc2UgR0JfT1BfTk9fTUVNT1JZOgorCQlyZXR1cm4gLUVOT01FTTsKKwljYXNlIEdCX09QX1BST1RPQ09MX0JBRDoKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisJY2FzZSBHQl9PUF9PVkVSRkxPVzoKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwljYXNlIEdCX09QX0lOVkFMSUQ6CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgR0JfT1BfUkVUUlk6CisJCXJldHVybiAtRUFHQUlOOworCWNhc2UgR0JfT1BfTk9ORVhJU1RFTlQ6CisJCXJldHVybiAtRU5PREVWOworCWNhc2UgR0JfT1BfTUFMRlVOQ1RJT046CisJCXJldHVybiAtRUlMU0VROworCWNhc2UgR0JfT1BfVU5LTk9XTl9FUlJPUjoKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTzsKKwl9Cit9CisKKy8qCisgKiBNYXAgYSBMaW51eCBlcnJubyB2YWx1ZSAoZnJvbSBvcGVyYXRpb24tPmVycm5vKSBpbnRvIHRoZSB2YWx1ZQorICogdGhhdCBzaG91bGQgcmVwcmVzZW50IGl0IGluIGEgcmVzcG9uc2UgbWVzc2FnZSBzdGF0dXMgc2VudAorICogb3ZlciB0aGUgd2lyZS4gIFJldHVybnMgYW4gZW51bSBnYl9vcGVyYXRpb25fc3RhdHVzIHZhbHVlICh3aGljaAorICogaXMgcmVwcmVzZW50ZWQgaW4gYSBtZXNzYWdlIGFzIGEgc2luZ2xlIGJ5dGUpLgorICovCitzdGF0aWMgdTggZ2Jfb3BlcmF0aW9uX2Vycm5vX21hcChpbnQgZXJybm8pCit7CisJc3dpdGNoIChlcnJubykgeworCWNhc2UgMDoKKwkJcmV0dXJuIEdCX09QX1NVQ0NFU1M7CisJY2FzZSAtRUlOVFI6CisJCXJldHVybiBHQl9PUF9JTlRFUlJVUFRFRDsKKwljYXNlIC1FVElNRURPVVQ6CisJCXJldHVybiBHQl9PUF9USU1FT1VUOworCWNhc2UgLUVOT01FTToKKwkJcmV0dXJuIEdCX09QX05PX01FTU9SWTsKKwljYXNlIC1FUFJPVE9OT1NVUFBPUlQ6CisJCXJldHVybiBHQl9PUF9QUk9UT0NPTF9CQUQ7CisJY2FzZSAtRU1TR1NJWkU6CisJCXJldHVybiBHQl9PUF9PVkVSRkxPVzsJLyogQ291bGQgYmUgdW5kZXJmbG93IHRvbyAqLworCWNhc2UgLUVJTlZBTDoKKwkJcmV0dXJuIEdCX09QX0lOVkFMSUQ7CisJY2FzZSAtRUFHQUlOOgorCQlyZXR1cm4gR0JfT1BfUkVUUlk7CisJY2FzZSAtRUlMU0VROgorCQlyZXR1cm4gR0JfT1BfTUFMRlVOQ1RJT047CisJY2FzZSAtRU5PREVWOgorCQlyZXR1cm4gR0JfT1BfTk9ORVhJU1RFTlQ7CisJY2FzZSAtRUlPOgorCWRlZmF1bHQ6CisJCXJldHVybiBHQl9PUF9VTktOT1dOX0VSUk9SOworCX0KK30KKworYm9vbCBnYl9vcGVyYXRpb25fcmVzcG9uc2VfYWxsb2Moc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uLAorCQkJCQlzaXplX3QgcmVzcG9uc2Vfc2l6ZSwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSBvcGVyYXRpb24tPmNvbm5lY3Rpb24tPmhkOworCXN0cnVjdCBnYl9vcGVyYXRpb25fbXNnX2hkciAqcmVxdWVzdF9oZWFkZXI7CisJc3RydWN0IGdiX21lc3NhZ2UgKnJlc3BvbnNlOworCXU4IHR5cGU7CisKKwl0eXBlID0gb3BlcmF0aW9uLT50eXBlIHwgR0JfTUVTU0FHRV9UWVBFX1JFU1BPTlNFOworCXJlc3BvbnNlID0gZ2Jfb3BlcmF0aW9uX21lc3NhZ2VfYWxsb2MoaGQsIHR5cGUsIHJlc3BvbnNlX3NpemUsIGdmcCk7CisJaWYgKCFyZXNwb25zZSkKKwkJcmV0dXJuIGZhbHNlOworCXJlc3BvbnNlLT5vcGVyYXRpb24gPSBvcGVyYXRpb247CisKKwkvKgorCSAqIFNpemUgYW5kIHR5cGUgZ2V0IGluaXRpYWxpemVkIHdoZW4gdGhlIG1lc3NhZ2UgaXMKKwkgKiBhbGxvY2F0ZWQuICBUaGUgZXJybm8gd2lsbCBiZSBzZXQgYmVmb3JlIHNlbmRpbmcuICBBbGwKKwkgKiB0aGF0J3MgbGVmdCBpcyB0aGUgb3BlcmF0aW9uIGlkLCB3aGljaCB3ZSBjb3B5IGZyb20gdGhlCisJICogcmVxdWVzdCBtZXNzYWdlIGhlYWRlciAoYXMtaXMsIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIpLgorCSAqLworCXJlcXVlc3RfaGVhZGVyID0gb3BlcmF0aW9uLT5yZXF1ZXN0LT5oZWFkZXI7CisJcmVzcG9uc2UtPmhlYWRlci0+b3BlcmF0aW9uX2lkID0gcmVxdWVzdF9oZWFkZXItPm9wZXJhdGlvbl9pZDsKKwlvcGVyYXRpb24tPnJlc3BvbnNlID0gcmVzcG9uc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX29wZXJhdGlvbl9yZXNwb25zZV9hbGxvYyk7CisKKy8qCisgKiBDcmVhdGUgYSBHcmV5YnVzIG9wZXJhdGlvbiB0byBiZSBzZW50IG92ZXIgdGhlIGdpdmVuIGNvbm5lY3Rpb24uCisgKiBUaGUgcmVxdWVzdCBidWZmZXIgd2lsbCBiZSBiaWcgZW5vdWdoIGZvciBhIHBheWxvYWQgb2YgdGhlIGdpdmVuCisgKiBzaXplLgorICoKKyAqIEZvciBvdXRnb2luZyByZXF1ZXN0cywgdGhlIHJlcXVlc3QgbWVzc2FnZSdzIGhlYWRlciB3aWxsIGJlCisgKiBpbml0aWFsaXplZCB3aXRoIHRoZSB0eXBlIG9mIHRoZSByZXF1ZXN0IGFuZCB0aGUgbWVzc2FnZSBzaXplLgorICogT3V0Z29pbmcgb3BlcmF0aW9ucyBtdXN0IGFsc28gc3BlY2lmeSB0aGUgcmVzcG9uc2UgYnVmZmVyIHNpemUsCisgKiB3aGljaCBtdXN0IGJlIHN1ZmZpY2llbnQgdG8gaG9sZCBhbGwgZXhwZWN0ZWQgcmVzcG9uc2UgZGF0YS4gIFRoZQorICogcmVzcG9uc2UgbWVzc2FnZSBoZWFkZXIgd2lsbCBldmVudHVhbGx5IGJlIG92ZXJ3cml0dGVuLCBzbyB0aGVyZSdzCisgKiBubyBuZWVkIHRvIGluaXRpYWxpemUgaXQgaGVyZS4KKyAqCisgKiBSZXF1ZXN0IG1lc3NhZ2VzIGZvciBpbmNvbWluZyBvcGVyYXRpb25zIGNhbiBhcnJpdmUgaW4gaW50ZXJydXB0CisgKiBjb250ZXh0LCBzbyB0aGV5IG11c3QgYmUgYWxsb2NhdGVkIHdpdGggR0ZQX0FUT01JQy4gIEluIHRoaXMgY2FzZQorICogdGhlIHJlcXVlc3QgYnVmZmVyIHdpbGwgYmUgaW1tZWRpYXRlbHkgb3ZlcndyaXR0ZW4sIHNvIHRoZXJlIGlzCisgKiBubyBuZWVkIHRvIGluaXRpYWxpemUgdGhlIG1lc3NhZ2UgaGVhZGVyLiAgUmVzcG9uc2liaWxpdHkgZm9yCisgKiBhbGxvY2F0aW5nIGEgcmVzcG9uc2UgYnVmZmVyIGxpZXMgd2l0aCB0aGUgaW5jb21pbmcgcmVxdWVzdAorICogaGFuZGxlciBmb3IgYSBwcm90b2NvbC4gIFNvIHdlIGRvbid0IGFsbG9jYXRlIHRoYXQgaGVyZS4KKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV3IG9wZXJhdGlvbiBvciBhIG51bGwgcG9pbnRlciBpZiBhbgorICogZXJyb3Igb2NjdXJzLgorICovCitzdGF0aWMgc3RydWN0IGdiX29wZXJhdGlvbiAqCitnYl9vcGVyYXRpb25fY3JlYXRlX2NvbW1vbihzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdTggdHlwZSwKKwkJCQlzaXplX3QgcmVxdWVzdF9zaXplLCBzaXplX3QgcmVzcG9uc2Vfc2l6ZSwKKwkJCQl1bnNpZ25lZCBsb25nIG9wX2ZsYWdzLCBnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCA9IGNvbm5lY3Rpb24tPmhkOworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKworCW9wZXJhdGlvbiA9IGttZW1fY2FjaGVfemFsbG9jKGdiX29wZXJhdGlvbl9jYWNoZSwgZ2ZwX2ZsYWdzKTsKKwlpZiAoIW9wZXJhdGlvbikKKwkJcmV0dXJuIE5VTEw7CisJb3BlcmF0aW9uLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKworCW9wZXJhdGlvbi0+cmVxdWVzdCA9IGdiX29wZXJhdGlvbl9tZXNzYWdlX2FsbG9jKGhkLCB0eXBlLCByZXF1ZXN0X3NpemUsCisJCQkJCQkJZ2ZwX2ZsYWdzKTsKKwlpZiAoIW9wZXJhdGlvbi0+cmVxdWVzdCkKKwkJZ290byBlcnJfY2FjaGU7CisJb3BlcmF0aW9uLT5yZXF1ZXN0LT5vcGVyYXRpb24gPSBvcGVyYXRpb247CisKKwkvKiBBbGxvY2F0ZSB0aGUgcmVzcG9uc2UgYnVmZmVyIGZvciBvdXRnb2luZyBvcGVyYXRpb25zICovCisJaWYgKCEob3BfZmxhZ3MgJiBHQl9PUEVSQVRJT05fRkxBR19JTkNPTUlORykpIHsKKwkJaWYgKCFnYl9vcGVyYXRpb25fcmVzcG9uc2VfYWxsb2Mob3BlcmF0aW9uLCByZXNwb25zZV9zaXplLAorCQkJCQkJIGdmcF9mbGFncykpIHsKKwkJCWdvdG8gZXJyX3JlcXVlc3Q7CisJCX0KKwl9CisKKwlvcGVyYXRpb24tPmZsYWdzID0gb3BfZmxhZ3M7CisJb3BlcmF0aW9uLT50eXBlID0gdHlwZTsKKwlvcGVyYXRpb24tPmVycm5vID0gLUVCQURSOyAgLyogSW5pdGlhbCB2YWx1ZS0tbWVhbnMgIm5ldmVyIHNldCIgKi8KKworCUlOSVRfV09SSygmb3BlcmF0aW9uLT53b3JrLCBnYl9vcGVyYXRpb25fd29yayk7CisJaW5pdF9jb21wbGV0aW9uKCZvcGVyYXRpb24tPmNvbXBsZXRpb24pOworCWtyZWZfaW5pdCgmb3BlcmF0aW9uLT5rcmVmKTsKKwlhdG9taWNfc2V0KCZvcGVyYXRpb24tPndhaXRlcnMsIDApOworCisJcmV0dXJuIG9wZXJhdGlvbjsKKworZXJyX3JlcXVlc3Q6CisJZ2Jfb3BlcmF0aW9uX21lc3NhZ2VfZnJlZShvcGVyYXRpb24tPnJlcXVlc3QpOworZXJyX2NhY2hlOgorCWttZW1fY2FjaGVfZnJlZShnYl9vcGVyYXRpb25fY2FjaGUsIG9wZXJhdGlvbik7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIENyZWF0ZSBhIG5ldyBvcGVyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb25uZWN0aW9uLiAgVGhlCisgKiByZXF1ZXN0IGFuZCByZXNwb25zZSBzaXplcyBwcm92aWRlZCBhcmUgdGhlIG51bWJlciBvZiBieXRlcworICogcmVxdWlyZWQgdG8gaG9sZCB0aGUgcmVxdWVzdC9yZXNwb25zZSBwYXlsb2FkIG9ubHkuICBCb3RoIG9mCisgKiB0aGVzZSBhcmUgYWxsb3dlZCB0byBiZSAwLiAgTm90ZSB0aGF0IDB4MDAgaXMgcmVzZXJ2ZWQgYXMgYW4KKyAqIGludmFsaWQgb3BlcmF0aW9uIHR5cGUgZm9yIGFsbCBwcm90b2NvbHMsIGFuZCB0aGlzIGlzIGVuZm9yY2VkCisgKiBoZXJlLgorICovCitzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICoKK2diX29wZXJhdGlvbl9jcmVhdGVfZmxhZ3Moc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJdTggdHlwZSwgc2l6ZV90IHJlcXVlc3Rfc2l6ZSwKKwkJCQlzaXplX3QgcmVzcG9uc2Vfc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCQlnZnBfdCBnZnApCit7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCisJaWYgKFdBUk5fT05fT05DRSh0eXBlID09IEdCX1JFUVVFU1RfVFlQRV9JTlZBTElEKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKFdBUk5fT05fT05DRSh0eXBlICYgR0JfTUVTU0FHRV9UWVBFX1JFU1BPTlNFKSkKKwkJdHlwZSAmPSB+R0JfTUVTU0FHRV9UWVBFX1JFU1BPTlNFOworCisJaWYgKFdBUk5fT05fT05DRShmbGFncyAmIH5HQl9PUEVSQVRJT05fRkxBR19VU0VSX01BU0spKQorCQlmbGFncyAmPSBHQl9PUEVSQVRJT05fRkxBR19VU0VSX01BU0s7CisKKwlvcGVyYXRpb24gPSBnYl9vcGVyYXRpb25fY3JlYXRlX2NvbW1vbihjb25uZWN0aW9uLCB0eXBlLAorCQkJCQkJcmVxdWVzdF9zaXplLCByZXNwb25zZV9zaXplLAorCQkJCQkJZmxhZ3MsIGdmcCk7CisJaWYgKG9wZXJhdGlvbikKKwkJdHJhY2VfZ2Jfb3BlcmF0aW9uX2NyZWF0ZShvcGVyYXRpb24pOworCisJcmV0dXJuIG9wZXJhdGlvbjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX29wZXJhdGlvbl9jcmVhdGVfZmxhZ3MpOworCitzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICoKK2diX29wZXJhdGlvbl9jcmVhdGVfY29yZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQl1OCB0eXBlLCBzaXplX3QgcmVxdWVzdF9zaXplLAorCQkJCXNpemVfdCByZXNwb25zZV9zaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJCWdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisKKwlmbGFncyB8PSBHQl9PUEVSQVRJT05fRkxBR19DT1JFOworCisJb3BlcmF0aW9uID0gZ2Jfb3BlcmF0aW9uX2NyZWF0ZV9jb21tb24oY29ubmVjdGlvbiwgdHlwZSwKKwkJCQkJCXJlcXVlc3Rfc2l6ZSwgcmVzcG9uc2Vfc2l6ZSwKKwkJCQkJCWZsYWdzLCBnZnApOworCWlmIChvcGVyYXRpb24pCisJCXRyYWNlX2diX29wZXJhdGlvbl9jcmVhdGVfY29yZShvcGVyYXRpb24pOworCisJcmV0dXJuIG9wZXJhdGlvbjsKK30KKy8qIERvIG5vdCBleHBvcnQgdGhpcyBmdW5jdGlvbi4gKi8KKworc2l6ZV90IGdiX29wZXJhdGlvbl9nZXRfcGF5bG9hZF9zaXplX21heChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gY29ubmVjdGlvbi0+aGQ7CisKKwlyZXR1cm4gaGQtPmJ1ZmZlcl9zaXplX21heCAtIHNpemVvZihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uX21zZ19oZHIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2Jfb3BlcmF0aW9uX2dldF9wYXlsb2FkX3NpemVfbWF4KTsKKworc3RhdGljIHN0cnVjdCBnYl9vcGVyYXRpb24gKgorZ2Jfb3BlcmF0aW9uX2NyZWF0ZV9pbmNvbWluZyhzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdTE2IGlkLAorCQkJCXU4IHR5cGUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKwlzaXplX3QgcmVxdWVzdF9zaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBHQl9PUEVSQVRJT05fRkxBR19JTkNPTUlORzsKKworCS8qIENhbGxlciBoYXMgbWFkZSBzdXJlIHdlIGF0IGxlYXN0IGhhdmUgYSBtZXNzYWdlIGhlYWRlci4gKi8KKwlyZXF1ZXN0X3NpemUgPSBzaXplIC0gc2l6ZW9mKHN0cnVjdCBnYl9vcGVyYXRpb25fbXNnX2hkcik7CisKKwlpZiAoIWlkKQorCQlmbGFncyB8PSBHQl9PUEVSQVRJT05fRkxBR19VTklESVJFQ1RJT05BTDsKKworCW9wZXJhdGlvbiA9IGdiX29wZXJhdGlvbl9jcmVhdGVfY29tbW9uKGNvbm5lY3Rpb24sIHR5cGUsCisJCQkJCQlyZXF1ZXN0X3NpemUsCisJCQkJCQlHQl9SRVFVRVNUX1RZUEVfSU5WQUxJRCwKKwkJCQkJCWZsYWdzLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW9wZXJhdGlvbikKKwkJcmV0dXJuIE5VTEw7CisKKwlvcGVyYXRpb24tPmlkID0gaWQ7CisJbWVtY3B5KG9wZXJhdGlvbi0+cmVxdWVzdC0+aGVhZGVyLCBkYXRhLCBzaXplKTsKKwl0cmFjZV9nYl9vcGVyYXRpb25fY3JlYXRlX2luY29taW5nKG9wZXJhdGlvbik7CisKKwlyZXR1cm4gb3BlcmF0aW9uOworfQorCisvKgorICogR2V0IGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIG9uIGFuIG9wZXJhdGlvbi4KKyAqLwordm9pZCBnYl9vcGVyYXRpb25fZ2V0KHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbikKK3sKKwlrcmVmX2dldCgmb3BlcmF0aW9uLT5rcmVmKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX29wZXJhdGlvbl9nZXQpOworCisvKgorICogRGVzdHJveSBhIHByZXZpb3VzbHkgY3JlYXRlZCBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIF9nYl9vcGVyYXRpb25fZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisKKwlvcGVyYXRpb24gPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGdiX29wZXJhdGlvbiwga3JlZik7CisKKwl0cmFjZV9nYl9vcGVyYXRpb25fZGVzdHJveShvcGVyYXRpb24pOworCisJaWYgKG9wZXJhdGlvbi0+cmVzcG9uc2UpCisJCWdiX29wZXJhdGlvbl9tZXNzYWdlX2ZyZWUob3BlcmF0aW9uLT5yZXNwb25zZSk7CisJZ2Jfb3BlcmF0aW9uX21lc3NhZ2VfZnJlZShvcGVyYXRpb24tPnJlcXVlc3QpOworCisJa21lbV9jYWNoZV9mcmVlKGdiX29wZXJhdGlvbl9jYWNoZSwgb3BlcmF0aW9uKTsKK30KKworLyoKKyAqIERyb3AgYSByZWZlcmVuY2Ugb24gYW4gb3BlcmF0aW9uLCBhbmQgZGVzdHJveSBpdCB3aGVuIHRoZSBsYXN0CisgKiBvbmUgaXMgZ29uZS4KKyAqLwordm9pZCBnYl9vcGVyYXRpb25fcHV0KHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbikKK3sKKwlpZiAoV0FSTl9PTighb3BlcmF0aW9uKSkKKwkJcmV0dXJuOworCisJa3JlZl9wdXQoJm9wZXJhdGlvbi0+a3JlZiwgX2diX29wZXJhdGlvbl9kZXN0cm95KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX29wZXJhdGlvbl9wdXQpOworCisvKiBUZWxsIHRoZSByZXF1ZXN0ZXIgd2UncmUgZG9uZSAqLworc3RhdGljIHZvaWQgZ2Jfb3BlcmF0aW9uX3N5bmNfY2FsbGJhY2soc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKQoreworCWNvbXBsZXRlKCZvcGVyYXRpb24tPmNvbXBsZXRpb24pOworfQorCisvKioKKyAqIGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmQoKSAtIHNlbmQgYW4gb3BlcmF0aW9uIHJlcXVlc3QgbWVzc2FnZQorICogQG9wZXJhdGlvbjoJdGhlIG9wZXJhdGlvbiB0byBpbml0aWF0ZQorICogQGNhbGxiYWNrOgl0aGUgb3BlcmF0aW9uIGNvbXBsZXRpb24gY2FsbGJhY2sKKyAqIEBnZnA6CXRoZSBtZW1vcnkgZmxhZ3MgdG8gdXNlIGZvciBhbnkgYWxsb2NhdGlvbnMKKyAqCisgKiBUaGUgY2FsbGVyIGhhcyBmaWxsZWQgaW4gYW55IHBheWxvYWQgc28gdGhlIHJlcXVlc3QgbWVzc2FnZSBpcyByZWFkeSB0byBnby4KKyAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBzdXBwbGllZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSByZXNwb25zZSBtZXNzYWdlIGhhcworICogYXJyaXZlZCwgYSB1bmlkaXJlY3Rpb25hbCByZXF1ZXN0IGhhcyBiZWVuIHNlbnQsIG9yIHRoZSBvcGVyYXRpb24gaXMKKyAqIGNhbmNlbGxlZCwgaW5kaWNhdGluZyB0aGF0IHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGUuIFRoZSBjYWxsYmFjayBmdW5jdGlvbgorICogY2FuIGZldGNoIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiB1c2luZyBnYl9vcGVyYXRpb25fcmVzdWx0KCkgaWYKKyAqIGRlc2lyZWQuCisgKgorICogUmV0dXJuOiAwIGlmIHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcXVldWVkIGluIHRoZSBob3N0LWRyaXZlciBxdWV1ZXMsCisgKiBvciBhIG5lZ2F0aXZlIGVycm5vLgorICovCitpbnQgZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZChzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24sCisJCQkJZ2Jfb3BlcmF0aW9uX2NhbGxiYWNrIGNhbGxiYWNrLAorCQkJCWdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wZXJhdGlvbi0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uX21zZ19oZHIgKmhlYWRlcjsKKwl1bnNpZ25lZCBpbnQgY3ljbGU7CisJaW50IHJldDsKKworCWlmIChnYl9jb25uZWN0aW9uX2lzX29mZmxvYWRlZChjb25uZWN0aW9uKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICghY2FsbGJhY2spCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBSZWNvcmQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLCB3aGljaCBpcyBleGVjdXRlZCBpbgorCSAqIG5vbi1hdG9taWMgKHdvcmtxdWV1ZSkgY29udGV4dCB3aGVuIHRoZSBmaW5hbCByZXN1bHQKKwkgKiBvZiBhbiBvcGVyYXRpb24gaGFzIGJlZW4gc2V0LgorCSAqLworCW9wZXJhdGlvbi0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKKworCS8qCisJICogQXNzaWduIHRoZSBvcGVyYXRpb24ncyBpZCwgYW5kIHN0b3JlIGl0IGluIHRoZSByZXF1ZXN0IGhlYWRlci4KKwkgKiBaZXJvIGlzIGEgcmVzZXJ2ZWQgb3BlcmF0aW9uIGlkIGZvciB1bmlkaXJlY3Rpb25hbCBvcGVyYXRpb25zLgorCSAqLworCWlmIChnYl9vcGVyYXRpb25faXNfdW5pZGlyZWN0aW9uYWwob3BlcmF0aW9uKSkgeworCQlvcGVyYXRpb24tPmlkID0gMDsKKwl9IGVsc2UgeworCQljeWNsZSA9ICh1bnNpZ25lZCBpbnQpYXRvbWljX2luY19yZXR1cm4oJmNvbm5lY3Rpb24tPm9wX2N5Y2xlKTsKKwkJb3BlcmF0aW9uLT5pZCA9ICh1MTYpKGN5Y2xlICUgVTE2X01BWCArIDEpOworCX0KKworCWhlYWRlciA9IG9wZXJhdGlvbi0+cmVxdWVzdC0+aGVhZGVyOworCWhlYWRlci0+b3BlcmF0aW9uX2lkID0gY3B1X3RvX2xlMTYob3BlcmF0aW9uLT5pZCk7CisKKwlnYl9vcGVyYXRpb25fcmVzdWx0X3NldChvcGVyYXRpb24sIC1FSU5QUk9HUkVTUyk7CisKKwkvKgorCSAqIEdldCBhbiBleHRyYSByZWZlcmVuY2Ugb24gdGhlIG9wZXJhdGlvbi4gSXQnbGwgYmUgZHJvcHBlZCB3aGVuIHRoZQorCSAqIG9wZXJhdGlvbiBjb21wbGV0ZXMuCisJICovCisJZ2Jfb3BlcmF0aW9uX2dldChvcGVyYXRpb24pOworCXJldCA9IGdiX29wZXJhdGlvbl9nZXRfYWN0aXZlKG9wZXJhdGlvbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcHV0OworCisJcmV0ID0gZ2JfbWVzc2FnZV9zZW5kKG9wZXJhdGlvbi0+cmVxdWVzdCwgZ2ZwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9wdXRfYWN0aXZlOworCisJcmV0dXJuIDA7CisKK2Vycl9wdXRfYWN0aXZlOgorCWdiX29wZXJhdGlvbl9wdXRfYWN0aXZlKG9wZXJhdGlvbik7CitlcnJfcHV0OgorCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9vcGVyYXRpb25fcmVxdWVzdF9zZW5kKTsKKworLyoKKyAqIFNlbmQgYSBzeW5jaHJvbm91cyBvcGVyYXRpb24uICBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvCisgKiBibG9jaywgcmV0dXJuaW5nIG9ubHkgd2hlbiB0aGUgcmVzcG9uc2UgaGFzIGFycml2ZWQsIChvciB3aGVuIGFuCisgKiBlcnJvciBpcyBkZXRlY3RlZC4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHJlc3VsdCBvZiB0aGUKKyAqIG9wZXJhdGlvbi4KKyAqLworaW50IGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmRfc3luY190aW1lb3V0KHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbiwKKwkJCQkJCXVuc2lnbmVkIGludCB0aW1lb3V0KQoreworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0X2ppZmZpZXM7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fcmVxdWVzdF9zZW5kKG9wZXJhdGlvbiwgZ2Jfb3BlcmF0aW9uX3N5bmNfY2FsbGJhY2ssCisJCQkJCUdGUF9LRVJORUwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodGltZW91dCkKKwkJdGltZW91dF9qaWZmaWVzID0gbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KTsKKwllbHNlCisJCXRpbWVvdXRfamlmZmllcyA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCisJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJm9wZXJhdGlvbi0+Y29tcGxldGlvbiwKKwkJCQkJCQl0aW1lb3V0X2ppZmZpZXMpOworCWlmIChyZXQgPCAwKSB7CisJCS8qIENhbmNlbCB0aGUgb3BlcmF0aW9uIGlmIGludGVycnVwdGVkICovCisJCWdiX29wZXJhdGlvbl9jYW5jZWwob3BlcmF0aW9uLCAtRUNBTkNFTEVEKTsKKwl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisJCS8qIENhbmNlbCB0aGUgb3BlcmF0aW9uIGlmIG9wIHRpbWVkIG91dCAqLworCQlnYl9vcGVyYXRpb25fY2FuY2VsKG9wZXJhdGlvbiwgLUVUSU1FRE9VVCk7CisJfQorCisJcmV0dXJuIGdiX29wZXJhdGlvbl9yZXN1bHQob3BlcmF0aW9uKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmRfc3luY190aW1lb3V0KTsKKworLyoKKyAqIFNlbmQgYSByZXNwb25zZSBmb3IgYW4gaW5jb21pbmcgb3BlcmF0aW9uIHJlcXVlc3QuICBBIG5vbi16ZXJvCisgKiBlcnJubyBpbmRpY2F0ZXMgYSBmYWlsZWQgb3BlcmF0aW9uLgorICoKKyAqIElmIHRoZXJlIGlzIGFueSByZXNwb25zZSBwYXlsb2FkLCB0aGUgaW5jb21pbmcgcmVxdWVzdCBoYW5kbGVyIGlzCisgKiByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZyB0aGUgcmVzcG9uc2UgbWVzc2FnZS4gIE90aGVyd2lzZSB0aGUKKyAqIGl0IGNhbiBzaW1wbHkgc3VwcGx5IHRoZSByZXN1bHQgZXJybm87IHRoaXMgZnVuY3Rpb24gd2lsbAorICogYWxsb2NhdGUgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgaWYgbmVjZXNzYXJ5LgorICovCitzdGF0aWMgaW50IGdiX29wZXJhdGlvbl9yZXNwb25zZV9zZW5kKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbiwKKwkJCQkJaW50IGVycm5vKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3BlcmF0aW9uLT5jb25uZWN0aW9uOworCWludCByZXQ7CisKKwlpZiAoIW9wZXJhdGlvbi0+cmVzcG9uc2UgJiYKKwkJCSFnYl9vcGVyYXRpb25faXNfdW5pZGlyZWN0aW9uYWwob3BlcmF0aW9uKSkgeworCQlpZiAoIWdiX29wZXJhdGlvbl9yZXNwb25zZV9hbGxvYyhvcGVyYXRpb24sIDAsIEdGUF9LRVJORUwpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogUmVjb3JkIHRoZSByZXN1bHQgKi8KKwlpZiAoIWdiX29wZXJhdGlvbl9yZXN1bHRfc2V0KG9wZXJhdGlvbiwgZXJybm8pKSB7CisJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmhkLT5kZXYsICJyZXF1ZXN0IHJlc3VsdCBhbHJlYWR5IHNldFxuIik7CisJCXJldHVybiAtRUlPOwkvKiBTaG91bGRuJ3QgaGFwcGVuICovCisJfQorCisJLyogU2VuZGVyIG9mIHJlcXVlc3QgZG9lcyBub3QgY2FyZSBhYm91dCByZXNwb25zZS4gKi8KKwlpZiAoZ2Jfb3BlcmF0aW9uX2lzX3VuaWRpcmVjdGlvbmFsKG9wZXJhdGlvbikpCisJCXJldHVybiAwOworCisJLyogUmVmZXJlbmNlIHdpbGwgYmUgZHJvcHBlZCB3aGVuIG1lc3NhZ2UgaGFzIGJlZW4gc2VudC4gKi8KKwlnYl9vcGVyYXRpb25fZ2V0KG9wZXJhdGlvbik7CisJcmV0ID0gZ2Jfb3BlcmF0aW9uX2dldF9hY3RpdmUob3BlcmF0aW9uKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9wdXQ7CisKKwkvKiBGaWxsIGluIHRoZSByZXNwb25zZSBoZWFkZXIgYW5kIHNlbmQgaXQgKi8KKwlvcGVyYXRpb24tPnJlc3BvbnNlLT5oZWFkZXItPnJlc3VsdCA9IGdiX29wZXJhdGlvbl9lcnJub19tYXAoZXJybm8pOworCisJcmV0ID0gZ2JfbWVzc2FnZV9zZW5kKG9wZXJhdGlvbi0+cmVzcG9uc2UsIEdGUF9LRVJORUwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3B1dF9hY3RpdmU7CisKKwlyZXR1cm4gMDsKKworZXJyX3B1dF9hY3RpdmU6CisJZ2Jfb3BlcmF0aW9uX3B1dF9hY3RpdmUob3BlcmF0aW9uKTsKK2Vycl9wdXQ6CisJZ2Jfb3BlcmF0aW9uX3B1dChvcGVyYXRpb24pOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBtZXNzYWdlIHNlbmQgcmVxdWVzdCBoYXMgY29tcGxldGVkLgorICovCit2b2lkIGdyZXlidXNfbWVzc2FnZV9zZW50KHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsCisJCQkJCXN0cnVjdCBnYl9tZXNzYWdlICptZXNzYWdlLCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbiA9IG1lc3NhZ2UtPm9wZXJhdGlvbjsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wZXJhdGlvbi0+Y29ubmVjdGlvbjsKKworCS8qCisJICogSWYgdGhlIG1lc3NhZ2Ugd2FzIGEgcmVzcG9uc2UsIHdlIGp1c3QgbmVlZCB0byBkcm9wIG91cgorCSAqIHJlZmVyZW5jZSB0byB0aGUgb3BlcmF0aW9uLiAgSWYgYW4gZXJyb3Igb2NjdXJyZWQsIHJlcG9ydAorCSAqIGl0LgorCSAqCisJICogRm9yIHJlcXVlc3RzLCBpZiB0aGVyZSdzIG5vIGVycm9yIGFuZCB0aGUgb3BlcmF0aW9uIGluIG5vdAorCSAqIHVuaWRpcmVjdGlvbmFsLCB0aGVyZSdzIG5vdGhpbmcgbW9yZSB0byBkbyB1bnRpbCB0aGUgcmVzcG9uc2UKKwkgKiBhcnJpdmVzLiBJZiBhbiBlcnJvciBvY2N1cnJlZCBhdHRlbXB0aW5nIHRvIHNlbmQgaXQsIG9yIGlmIHRoZQorCSAqIG9wZXJhdGlvbiBpcyB1bmlkcmVjdGlvbmFsLCByZWNvcmQgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIGFuZAorCSAqIHNjaGVkdWxlIGl0cyBjb21wbGV0aW9uLgorCSAqLworCWlmIChtZXNzYWdlID09IG9wZXJhdGlvbi0+cmVzcG9uc2UpIHsKKwkJaWYgKHN0YXR1cykgeworCQkJZGV2X2VycigmY29ubmVjdGlvbi0+aGQtPmRldiwKKwkJCQkiJXM6IGVycm9yIHNlbmRpbmcgcmVzcG9uc2UgMHglMDJ4OiAlZFxuIiwKKwkJCQljb25uZWN0aW9uLT5uYW1lLCBvcGVyYXRpb24tPnR5cGUsIHN0YXR1cyk7CisJCX0KKworCQlnYl9vcGVyYXRpb25fcHV0X2FjdGl2ZShvcGVyYXRpb24pOworCQlnYl9vcGVyYXRpb25fcHV0KG9wZXJhdGlvbik7CisJfSBlbHNlIGlmIChzdGF0dXMgfHwgZ2Jfb3BlcmF0aW9uX2lzX3VuaWRpcmVjdGlvbmFsKG9wZXJhdGlvbikpIHsKKwkJaWYgKGdiX29wZXJhdGlvbl9yZXN1bHRfc2V0KG9wZXJhdGlvbiwgc3RhdHVzKSkgeworCQkJcXVldWVfd29yayhnYl9vcGVyYXRpb25fY29tcGxldGlvbl93cSwKKwkJCQkJJm9wZXJhdGlvbi0+d29yayk7CisJCX0KKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChncmV5YnVzX21lc3NhZ2Vfc2VudCk7CisKKy8qCisgKiBXZSd2ZSByZWNlaXZlZCBkYXRhIG9uIGEgY29ubmVjdGlvbiwgYW5kIGl0IGRvZXNuJ3QgbG9vayBsaWtlIGEKKyAqIHJlc3BvbnNlLCBzbyB3ZSBhc3N1bWUgaXQncyBhIHJlcXVlc3QuCisgKgorICogVGhpcyBpcyBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQsIHNvIGp1c3QgY29weSB0aGUgaW5jb21pbmcKKyAqIGRhdGEgaW50byB0aGUgcmVxdWVzdCBidWZmZXIgYW5kIGhhbmRsZSB0aGUgcmVzdCB2aWEgd29ya3F1ZXVlLgorICovCitzdGF0aWMgdm9pZCBnYl9jb25uZWN0aW9uX3JlY3ZfcmVxdWVzdChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQljb25zdCBzdHJ1Y3QgZ2Jfb3BlcmF0aW9uX21zZ19oZHIgKmhlYWRlciwKKwkJCQl2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJdTE2IG9wZXJhdGlvbl9pZDsKKwl1OCB0eXBlOworCWludCByZXQ7CisKKwlvcGVyYXRpb25faWQgPSBsZTE2X3RvX2NwdShoZWFkZXItPm9wZXJhdGlvbl9pZCk7CisJdHlwZSA9IGhlYWRlci0+dHlwZTsKKworCW9wZXJhdGlvbiA9IGdiX29wZXJhdGlvbl9jcmVhdGVfaW5jb21pbmcoY29ubmVjdGlvbiwgb3BlcmF0aW9uX2lkLAorCQkJCQkJdHlwZSwgZGF0YSwgc2l6ZSk7CisJaWYgKCFvcGVyYXRpb24pIHsKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+aGQtPmRldiwKKwkJCSIlczogY2FuJ3QgY3JlYXRlIGluY29taW5nIG9wZXJhdGlvblxuIiwKKwkJCWNvbm5lY3Rpb24tPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX2dldF9hY3RpdmUob3BlcmF0aW9uKTsKKwlpZiAocmV0KSB7CisJCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKKwkJcmV0dXJuOworCX0KKwl0cmFjZV9nYl9tZXNzYWdlX3JlY3ZfcmVxdWVzdChvcGVyYXRpb24tPnJlcXVlc3QpOworCisJLyoKKwkgKiBUaGUgaW5pdGlhbCByZWZlcmVuY2UgdG8gdGhlIG9wZXJhdGlvbiB3aWxsIGJlIGRyb3BwZWQgd2hlbiB0aGUKKwkgKiByZXF1ZXN0IGhhbmRsZXIgcmV0dXJucy4KKwkgKi8KKwlpZiAoZ2Jfb3BlcmF0aW9uX3Jlc3VsdF9zZXQob3BlcmF0aW9uLCAtRUlOUFJPR1JFU1MpKQorCQlxdWV1ZV93b3JrKGNvbm5lY3Rpb24tPndxLCAmb3BlcmF0aW9uLT53b3JrKTsKK30KKworLyoKKyAqIFdlJ3ZlIHJlY2VpdmVkIGRhdGEgdGhhdCBhcHBlYXJzIHRvIGJlIGFuIG9wZXJhdGlvbiByZXNwb25zZQorICogbWVzc2FnZS4gIExvb2sgdXAgdGhlIG9wZXJhdGlvbiwgYW5kIHJlY29yZCB0aGF0IHdlJ3ZlIHJlY2VpdmVkCisgKiBpdHMgcmVzcG9uc2UuCisgKgorICogVGhpcyBpcyBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQsIHNvIGp1c3QgY29weSB0aGUgaW5jb21pbmcKKyAqIGRhdGEgaW50byB0aGUgcmVzcG9uc2UgYnVmZmVyIGFuZCBoYW5kbGUgdGhlIHJlc3QgdmlhIHdvcmtxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQgZ2JfY29ubmVjdGlvbl9yZWN2X3Jlc3BvbnNlKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCWNvbnN0IHN0cnVjdCBnYl9vcGVyYXRpb25fbXNnX2hkciAqaGVhZGVyLAorCQkJCXZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKwlzdHJ1Y3QgZ2JfbWVzc2FnZSAqbWVzc2FnZTsKKwlzaXplX3QgbWVzc2FnZV9zaXplOworCXUxNiBvcGVyYXRpb25faWQ7CisJaW50IGVycm5vOworCisJb3BlcmF0aW9uX2lkID0gbGUxNl90b19jcHUoaGVhZGVyLT5vcGVyYXRpb25faWQpOworCisJaWYgKCFvcGVyYXRpb25faWQpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZCgmY29ubmVjdGlvbi0+aGQtPmRldiwKKwkJCQkiJXM6IGludmFsaWQgcmVzcG9uc2UgaWQgMCByZWNlaXZlZFxuIiwKKwkJCQljb25uZWN0aW9uLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCW9wZXJhdGlvbiA9IGdiX29wZXJhdGlvbl9maW5kX291dGdvaW5nKGNvbm5lY3Rpb24sIG9wZXJhdGlvbl9pZCk7CisJaWYgKCFvcGVyYXRpb24pIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZCgmY29ubmVjdGlvbi0+aGQtPmRldiwKKwkJCQkiJXM6IHVuZXhwZWN0ZWQgcmVzcG9uc2UgaWQgMHglMDR4IHJlY2VpdmVkXG4iLAorCQkJCWNvbm5lY3Rpb24tPm5hbWUsIG9wZXJhdGlvbl9pZCk7CisJCXJldHVybjsKKwl9CisKKwllcnJubyA9IGdiX29wZXJhdGlvbl9zdGF0dXNfbWFwKGhlYWRlci0+cmVzdWx0KTsKKwltZXNzYWdlID0gb3BlcmF0aW9uLT5yZXNwb25zZTsKKwltZXNzYWdlX3NpemUgPSBzaXplb2YoKmhlYWRlcikgKyBtZXNzYWdlLT5wYXlsb2FkX3NpemU7CisJaWYgKCFlcnJubyAmJiBzaXplID4gbWVzc2FnZV9zaXplKSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJmNvbm5lY3Rpb24tPmhkLT5kZXYsCisJCQkJIiVzOiBtYWxmb3JtZWQgcmVzcG9uc2UgMHglMDJ4IHJlY2VpdmVkICglenUgPiAlenUpXG4iLAorCQkJCWNvbm5lY3Rpb24tPm5hbWUsIGhlYWRlci0+dHlwZSwKKwkJCQlzaXplLCBtZXNzYWdlX3NpemUpOworCQllcnJubyA9IC1FTVNHU0laRTsKKwl9IGVsc2UgaWYgKCFlcnJubyAmJiBzaXplIDwgbWVzc2FnZV9zaXplKSB7CisJCWlmIChnYl9vcGVyYXRpb25fc2hvcnRfcmVzcG9uc2VfYWxsb3dlZChvcGVyYXRpb24pKSB7CisJCQltZXNzYWdlLT5wYXlsb2FkX3NpemUgPSBzaXplIC0gc2l6ZW9mKCpoZWFkZXIpOworCQl9IGVsc2UgeworCQkJZGV2X2Vycl9yYXRlbGltaXRlZCgmY29ubmVjdGlvbi0+aGQtPmRldiwKKwkJCQkJIiVzOiBzaG9ydCByZXNwb25zZSAweCUwMnggcmVjZWl2ZWQgKCV6dSA8ICV6dSlcbiIsCisJCQkJCWNvbm5lY3Rpb24tPm5hbWUsIGhlYWRlci0+dHlwZSwKKwkJCQkJc2l6ZSwgbWVzc2FnZV9zaXplKTsKKwkJCWVycm5vID0gLUVNU0dTSVpFOworCQl9CisJfQorCisJLyogV2UgbXVzdCBpZ25vcmUgdGhlIHBheWxvYWQgaWYgYSBiYWQgc3RhdHVzIGlzIHJldHVybmVkICovCisJaWYgKGVycm5vKQorCQlzaXplID0gc2l6ZW9mKCpoZWFkZXIpOworCisJLyogVGhlIHJlc3Qgd2lsbCBiZSBoYW5kbGVkIGluIHdvcmsgcXVldWUgY29udGV4dCAqLworCWlmIChnYl9vcGVyYXRpb25fcmVzdWx0X3NldChvcGVyYXRpb24sIGVycm5vKSkgeworCQltZW1jcHkobWVzc2FnZS0+YnVmZmVyLCBkYXRhLCBzaXplKTsKKworCQl0cmFjZV9nYl9tZXNzYWdlX3JlY3ZfcmVzcG9uc2UobWVzc2FnZSk7CisKKwkJcXVldWVfd29yayhnYl9vcGVyYXRpb25fY29tcGxldGlvbl93cSwgJm9wZXJhdGlvbi0+d29yayk7CisJfQorCisJZ2Jfb3BlcmF0aW9uX3B1dChvcGVyYXRpb24pOworfQorCisvKgorICogSGFuZGxlIGRhdGEgYXJyaXZpbmcgb24gYSBjb25uZWN0aW9uLiAgQXMgc29vbiBhcyB3ZSByZXR1cm4gdGhlCisgKiBzdXBwbGllZCBkYXRhIGJ1ZmZlciB3aWxsIGJlIHJldXNlZCAoc28gdW5sZXNzIHdlIGRvIHNvbWV0aGluZworICogd2l0aCwgaXQncyBlZmZlY3RpdmVseSBkcm9wcGVkKS4KKyAqLwordm9pZCBnYl9jb25uZWN0aW9uX3JlY3Yoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGdiX29wZXJhdGlvbl9tc2dfaGRyIGhlYWRlcjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY29ubmVjdGlvbi0+aGQtPmRldjsKKwlzaXplX3QgbXNnX3NpemU7CisKKwlpZiAoY29ubmVjdGlvbi0+c3RhdGUgPT0gR0JfQ09OTkVDVElPTl9TVEFURV9ESVNBQkxFRCB8fAorCQkJZ2JfY29ubmVjdGlvbl9pc19vZmZsb2FkZWQoY29ubmVjdGlvbikpIHsKKwkJZGV2X3dhcm5fcmF0ZWxpbWl0ZWQoZGV2LCAiJXM6IGRyb3BwaW5nICV6dSByZWNlaXZlZCBieXRlc1xuIiwKKwkJCQljb25uZWN0aW9uLT5uYW1lLCBzaXplKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzaXplIDwgc2l6ZW9mKGhlYWRlcikpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChkZXYsICIlczogc2hvcnQgbWVzc2FnZSByZWNlaXZlZFxuIiwKKwkJCQljb25uZWN0aW9uLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFVzZSBtZW1jcHkgYXMgZGF0YSBtYXkgYmUgdW5hbGlnbmVkICovCisJbWVtY3B5KCZoZWFkZXIsIGRhdGEsIHNpemVvZihoZWFkZXIpKTsKKwltc2dfc2l6ZSA9IGxlMTZfdG9fY3B1KGhlYWRlci5zaXplKTsKKwlpZiAoc2l6ZSA8IG1zZ19zaXplKSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoZGV2LAorCQkJCSIlczogaW5jb21wbGV0ZSBtZXNzYWdlIDB4JTA0eCBvZiB0eXBlIDB4JTAyeCByZWNlaXZlZCAoJXp1IDwgJXp1KVxuIiwKKwkJCQljb25uZWN0aW9uLT5uYW1lLAorCQkJCWxlMTZfdG9fY3B1KGhlYWRlci5vcGVyYXRpb25faWQpLAorCQkJCWhlYWRlci50eXBlLCBzaXplLCBtc2dfc2l6ZSk7CisJCXJldHVybjsJCS8qIFhYWCBTaG91bGQgc3RpbGwgY29tcGxldGUgb3BlcmF0aW9uICovCisJfQorCisJaWYgKGhlYWRlci50eXBlICYgR0JfTUVTU0FHRV9UWVBFX1JFU1BPTlNFKSB7CisJCWdiX2Nvbm5lY3Rpb25fcmVjdl9yZXNwb25zZShjb25uZWN0aW9uLAkmaGVhZGVyLCBkYXRhLAorCQkJCQkJbXNnX3NpemUpOworCX0gZWxzZSB7CisJCWdiX2Nvbm5lY3Rpb25fcmVjdl9yZXF1ZXN0KGNvbm5lY3Rpb24sICZoZWFkZXIsIGRhdGEsCisJCQkJCQltc2dfc2l6ZSk7CisJfQorfQorCisvKgorICogQ2FuY2VsIGFuIG91dGdvaW5nIG9wZXJhdGlvbiBzeW5jaHJvbm91c2x5LCBhbmQgcmVjb3JkIHRoZSBnaXZlbiBlcnJvciB0bworICogaW5kaWNhdGUgd2h5LgorICovCit2b2lkIGdiX29wZXJhdGlvbl9jYW5jZWwoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uLCBpbnQgZXJybm8pCit7CisJaWYgKFdBUk5fT04oZ2Jfb3BlcmF0aW9uX2lzX2luY29taW5nKG9wZXJhdGlvbikpKQorCQlyZXR1cm47CisKKwlpZiAoZ2Jfb3BlcmF0aW9uX3Jlc3VsdF9zZXQob3BlcmF0aW9uLCBlcnJubykpIHsKKwkJZ2JfbWVzc2FnZV9jYW5jZWwob3BlcmF0aW9uLT5yZXF1ZXN0KTsKKwkJcXVldWVfd29yayhnYl9vcGVyYXRpb25fY29tcGxldGlvbl93cSwgJm9wZXJhdGlvbi0+d29yayk7CisJfQorCXRyYWNlX2diX21lc3NhZ2VfY2FuY2VsX291dGdvaW5nKG9wZXJhdGlvbi0+cmVxdWVzdCk7CisKKwlhdG9taWNfaW5jKCZvcGVyYXRpb24tPndhaXRlcnMpOworCXdhaXRfZXZlbnQoZ2Jfb3BlcmF0aW9uX2NhbmNlbGxhdGlvbl9xdWV1ZSwKKwkJCSFnYl9vcGVyYXRpb25faXNfYWN0aXZlKG9wZXJhdGlvbikpOworCWF0b21pY19kZWMoJm9wZXJhdGlvbi0+d2FpdGVycyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9vcGVyYXRpb25fY2FuY2VsKTsKKworLyoKKyAqIENhbmNlbCBhbiBpbmNvbWluZyBvcGVyYXRpb24gc3luY2hyb25vdXNseS4gQ2FsbGVkIGR1cmluZyBjb25uZWN0aW9uIHRlYXIKKyAqIGRvd24uCisgKi8KK3ZvaWQgZ2Jfb3BlcmF0aW9uX2NhbmNlbF9pbmNvbWluZyhzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24sIGludCBlcnJubykKK3sKKwlpZiAoV0FSTl9PTighZ2Jfb3BlcmF0aW9uX2lzX2luY29taW5nKG9wZXJhdGlvbikpKQorCQlyZXR1cm47CisKKwlpZiAoIWdiX29wZXJhdGlvbl9pc191bmlkaXJlY3Rpb25hbChvcGVyYXRpb24pKSB7CisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGUgcmVxdWVzdCBoYW5kbGVyIGhhcyBzdWJtaXR0ZWQgdGhlIHJlc3BvbnNlCisJCSAqIGJlZm9yZSBjYW5jZWxsaW5nIGl0LgorCQkgKi8KKwkJZmx1c2hfd29yaygmb3BlcmF0aW9uLT53b3JrKTsKKwkJaWYgKCFnYl9vcGVyYXRpb25fcmVzdWx0X3NldChvcGVyYXRpb24sIGVycm5vKSkKKwkJCWdiX21lc3NhZ2VfY2FuY2VsKG9wZXJhdGlvbi0+cmVzcG9uc2UpOworCX0KKwl0cmFjZV9nYl9tZXNzYWdlX2NhbmNlbF9pbmNvbWluZyhvcGVyYXRpb24tPnJlc3BvbnNlKTsKKworCWF0b21pY19pbmMoJm9wZXJhdGlvbi0+d2FpdGVycyk7CisJd2FpdF9ldmVudChnYl9vcGVyYXRpb25fY2FuY2VsbGF0aW9uX3F1ZXVlLAorCQkJIWdiX29wZXJhdGlvbl9pc19hY3RpdmUob3BlcmF0aW9uKSk7CisJYXRvbWljX2RlYygmb3BlcmF0aW9uLT53YWl0ZXJzKTsKK30KKworLyoqCisgKiBnYl9vcGVyYXRpb25fc3luY190aW1lb3V0KCkgLSBpbXBsZW1lbnQgYSAic2ltcGxlIiBzeW5jaHJvbm91cyBvcGVyYXRpb24KKyAqIEBjb25uZWN0aW9uOiB0aGUgR3JleWJ1cyBjb25uZWN0aW9uIHRvIHNlbmQgdGhpcyB0bworICogQHR5cGU6IHRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0byBzZW5kCisgKiBAcmVxdWVzdDogcG9pbnRlciB0byBhIG1lbW9yeSBidWZmZXIgdG8gY29weSB0aGUgcmVxdWVzdCBmcm9tCisgKiBAcmVxdWVzdF9zaXplOiBzaXplIG9mIEByZXF1ZXN0CisgKiBAcmVzcG9uc2U6IHBvaW50ZXIgdG8gYSBtZW1vcnkgYnVmZmVyIHRvIGNvcHkgdGhlIHJlc3BvbnNlIHRvCisgKiBAcmVzcG9uc2Vfc2l6ZTogdGhlIHNpemUgb2YgQHJlc3BvbnNlLgorICogQHRpbWVvdXQ6IG9wZXJhdGlvbiB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcworICoKKyAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBhIHNpbXBsZSBzeW5jaHJvbm91cyBHcmV5YnVzIG9wZXJhdGlvbi4gIEl0IHNlbmRzCisgKiB0aGUgcHJvdmlkZWQgb3BlcmF0aW9uIHJlcXVlc3QgYW5kIHdhaXRzIChzbGVlcHMpIHVudGlsIHRoZSBjb3JyZXNwb25kaW5nCisgKiBvcGVyYXRpb24gcmVzcG9uc2UgbWVzc2FnZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQsIG9yIGFuIGVycm9yCisgKiBvY2N1cnMuICBAcmVxdWVzdCBhbmQgQHJlc3BvbnNlIGFyZSBidWZmZXJzIHRvIGhvbGQgdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlCisgKiBkYXRhIHJlc3BlY3RpdmVseSwgYW5kIGlmIHRoZXkgYXJlIG5vdCBOVUxMLCB0aGVpciBzaXplIG11c3QgYmUgc3BlY2lmaWVkIGluCisgKiBAcmVxdWVzdF9zaXplIGFuZCBAcmVzcG9uc2Vfc2l6ZS4KKyAqCisgKiBJZiBhIHJlc3BvbnNlIHBheWxvYWQgaXMgdG8gY29tZSBiYWNrLCBhbmQgQHJlc3BvbnNlIGlzIG5vdCBOVUxMLAorICogQHJlc3BvbnNlX3NpemUgbnVtYmVyIG9mIGJ5dGVzIHdpbGwgYmUgY29waWVkIGludG8gQHJlc3BvbnNlIGlmIHRoZSBvcGVyYXRpb24KKyAqIGlzIHN1Y2Nlc3NmdWwuCisgKgorICogSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZSByZXNwb25zZSBidWZmZXIgaXMgbGVmdCBhbG9uZS4KKyAqLworaW50IGdiX29wZXJhdGlvbl9zeW5jX3RpbWVvdXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGludCB0eXBlLAorCQkJCXZvaWQgKnJlcXVlc3QsIGludCByZXF1ZXN0X3NpemUsCisJCQkJdm9pZCAqcmVzcG9uc2UsIGludCByZXNwb25zZV9zaXplLAorCQkJCXVuc2lnbmVkIGludCB0aW1lb3V0KQoreworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKwlpbnQgcmV0OworCisJaWYgKChyZXNwb25zZV9zaXplICYmICFyZXNwb25zZSkgfHwKKwkgICAgKHJlcXVlc3Rfc2l6ZSAmJiAhcmVxdWVzdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJb3BlcmF0aW9uID0gZ2Jfb3BlcmF0aW9uX2NyZWF0ZShjb25uZWN0aW9uLCB0eXBlLAorCQkJCQlyZXF1ZXN0X3NpemUsIHJlc3BvbnNlX3NpemUsCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghb3BlcmF0aW9uKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChyZXF1ZXN0X3NpemUpCisJCW1lbWNweShvcGVyYXRpb24tPnJlcXVlc3QtPnBheWxvYWQsIHJlcXVlc3QsIHJlcXVlc3Rfc2l6ZSk7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fcmVxdWVzdF9zZW5kX3N5bmNfdGltZW91dChvcGVyYXRpb24sIHRpbWVvdXQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+aGQtPmRldiwKKwkJCSIlczogc3luY2hyb25vdXMgb3BlcmF0aW9uIGlkIDB4JTA0eCBvZiB0eXBlIDB4JTAyeCBmYWlsZWQ6ICVkXG4iLAorCQkJY29ubmVjdGlvbi0+bmFtZSwgb3BlcmF0aW9uLT5pZCwgdHlwZSwgcmV0KTsKKwl9IGVsc2UgeworCQlpZiAocmVzcG9uc2Vfc2l6ZSkgeworCQkJbWVtY3B5KHJlc3BvbnNlLCBvcGVyYXRpb24tPnJlc3BvbnNlLT5wYXlsb2FkLAorCQkJICAgICAgIHJlc3BvbnNlX3NpemUpOworCQl9CisJfQorCisJZ2Jfb3BlcmF0aW9uX3B1dChvcGVyYXRpb24pOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX29wZXJhdGlvbl9zeW5jX3RpbWVvdXQpOworCisvKioKKyAqIGdiX29wZXJhdGlvbl91bmlkaXJlY3Rpb25hbF90aW1lb3V0KCkgLSBpbml0aWF0ZSBhIHVuaWRpcmVjdGlvbmFsIG9wZXJhdGlvbgorICogQGNvbm5lY3Rpb246CQljb25uZWN0aW9uIHRvIHVzZQorICogQHR5cGU6CQl0eXBlIG9mIG9wZXJhdGlvbiB0byBzZW5kCisgKiBAcmVxdWVzdDoJCW1lbW9yeSBidWZmZXIgdG8gY29weSB0aGUgcmVxdWVzdCBmcm9tCisgKiBAcmVxdWVzdF9zaXplOglzaXplIG9mIEByZXF1ZXN0CisgKiBAdGltZW91dDoJCXNlbmQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMKKyAqCisgKiBJbml0aWF0ZSBhIHVuaWRpcmVjdGlvbmFsIG9wZXJhdGlvbiBieSBzZW5kaW5nIGEgcmVxdWVzdCBtZXNzYWdlIGFuZAorICogd2FpdGluZyBmb3IgaXQgdG8gYmUgYWNrbm93bGVkZ2VkIGFzIHNlbnQgYnkgdGhlIGhvc3QgZGV2aWNlLgorICoKKyAqIE5vdGUgdGhhdCBzdWNjZXNzZnVsIHNlbmQgb2YgYSB1bmlkaXJlY3Rpb25hbCBvcGVyYXRpb24gZG9lcyBub3QgaW1wbHkgdGhhdAorICogdGhlIHJlcXVlc3QgYXMgYWN0dWFsbHkgcmVhY2hlZCB0aGUgcmVtb3RlIGVuZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAqLworaW50IGdiX29wZXJhdGlvbl91bmlkaXJlY3Rpb25hbF90aW1lb3V0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCWludCB0eXBlLCB2b2lkICpyZXF1ZXN0LCBpbnQgcmVxdWVzdF9zaXplLAorCQkJCXVuc2lnbmVkIGludCB0aW1lb3V0KQoreworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKwlpbnQgcmV0OworCisJaWYgKHJlcXVlc3Rfc2l6ZSAmJiAhcmVxdWVzdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvcGVyYXRpb24gPSBnYl9vcGVyYXRpb25fY3JlYXRlX2ZsYWdzKGNvbm5lY3Rpb24sIHR5cGUsCisJCQkJCXJlcXVlc3Rfc2l6ZSwgMCwKKwkJCQkJR0JfT1BFUkFUSU9OX0ZMQUdfVU5JRElSRUNUSU9OQUwsCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghb3BlcmF0aW9uKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChyZXF1ZXN0X3NpemUpCisJCW1lbWNweShvcGVyYXRpb24tPnJlcXVlc3QtPnBheWxvYWQsIHJlcXVlc3QsIHJlcXVlc3Rfc2l6ZSk7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fcmVxdWVzdF9zZW5kX3N5bmNfdGltZW91dChvcGVyYXRpb24sIHRpbWVvdXQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+aGQtPmRldiwKKwkJCSIlczogdW5pZGlyZWN0aW9uYWwgb3BlcmF0aW9uIG9mIHR5cGUgMHglMDJ4IGZhaWxlZDogJWRcbiIsCisJCQljb25uZWN0aW9uLT5uYW1lLCB0eXBlLCByZXQpOworCX0KKworCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9vcGVyYXRpb25fdW5pZGlyZWN0aW9uYWxfdGltZW91dCk7CisKK2ludCBfX2luaXQgZ2Jfb3BlcmF0aW9uX2luaXQodm9pZCkKK3sKKwlnYl9tZXNzYWdlX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImdiX21lc3NhZ2VfY2FjaGUiLAorCQkJCXNpemVvZihzdHJ1Y3QgZ2JfbWVzc2FnZSksIDAsIDAsIE5VTEwpOworCWlmICghZ2JfbWVzc2FnZV9jYWNoZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlnYl9vcGVyYXRpb25fY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZ2Jfb3BlcmF0aW9uX2NhY2hlIiwKKwkJCQlzaXplb2Yoc3RydWN0IGdiX29wZXJhdGlvbiksIDAsIDAsIE5VTEwpOworCWlmICghZ2Jfb3BlcmF0aW9uX2NhY2hlKQorCQlnb3RvIGVycl9kZXN0cm95X21lc3NhZ2VfY2FjaGU7CisKKwlnYl9vcGVyYXRpb25fY29tcGxldGlvbl93cSA9IGFsbG9jX3dvcmtxdWV1ZSgiZ3JleWJ1c19jb21wbGV0aW9uIiwKKwkJCQkwLCAwKTsKKwlpZiAoIWdiX29wZXJhdGlvbl9jb21wbGV0aW9uX3dxKQorCQlnb3RvIGVycl9kZXN0cm95X29wZXJhdGlvbl9jYWNoZTsKKworCXJldHVybiAwOworCitlcnJfZGVzdHJveV9vcGVyYXRpb25fY2FjaGU6CisJa21lbV9jYWNoZV9kZXN0cm95KGdiX29wZXJhdGlvbl9jYWNoZSk7CisJZ2Jfb3BlcmF0aW9uX2NhY2hlID0gTlVMTDsKK2Vycl9kZXN0cm95X21lc3NhZ2VfY2FjaGU6CisJa21lbV9jYWNoZV9kZXN0cm95KGdiX21lc3NhZ2VfY2FjaGUpOworCWdiX21lc3NhZ2VfY2FjaGUgPSBOVUxMOworCisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3ZvaWQgZ2Jfb3BlcmF0aW9uX2V4aXQodm9pZCkKK3sKKwlkZXN0cm95X3dvcmtxdWV1ZShnYl9vcGVyYXRpb25fY29tcGxldGlvbl93cSk7CisJZ2Jfb3BlcmF0aW9uX2NvbXBsZXRpb25fd3EgPSBOVUxMOworCWttZW1fY2FjaGVfZGVzdHJveShnYl9vcGVyYXRpb25fY2FjaGUpOworCWdiX29wZXJhdGlvbl9jYWNoZSA9IE5VTEw7CisJa21lbV9jYWNoZV9kZXN0cm95KGdiX21lc3NhZ2VfY2FjaGUpOworCWdiX21lc3NhZ2VfY2FjaGUgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvb3BlcmF0aW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9vcGVyYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTA5YTJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvb3BlcmF0aW9uLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBHcmV5YnVzIG9wZXJhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaWZuZGVmIF9fT1BFUkFUSU9OX0gKKyNkZWZpbmUgX19PUEVSQVRJT05fSAorCisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorCitzdHJ1Y3QgZ2Jfb3BlcmF0aW9uOworCisvKiBUaGUgZGVmYXVsdCBhbW91bnQgb2YgdGltZSBhIHJlcXVlc3QgaXMgZ2l2ZW4gdG8gY29tcGxldGUgKi8KKyNkZWZpbmUgR0JfT1BFUkFUSU9OX1RJTUVPVVRfREVGQVVMVAkxMDAwCS8qIG1pbGxpc2Vjb25kcyAqLworCisvKgorICogVGhlIHRvcCBiaXQgb2YgdGhlIHR5cGUgaW4gYW4gb3BlcmF0aW9uIG1lc3NhZ2UgaGVhZGVyIGluZGljYXRlcworICogd2hldGhlciB0aGUgbWVzc2FnZSBpcyBhIHJlcXVlc3QgKGJpdCBjbGVhcikgb3IgcmVzcG9uc2UgKGJpdCBzZXQpCisgKi8KKyNkZWZpbmUgR0JfTUVTU0FHRV9UWVBFX1JFU1BPTlNFCSgodTgpMHg4MCkKKworZW51bSBnYl9vcGVyYXRpb25fcmVzdWx0IHsKKwlHQl9PUF9TVUNDRVNTCQk9IDB4MDAsCisJR0JfT1BfSU5URVJSVVBURUQJPSAweDAxLAorCUdCX09QX1RJTUVPVVQJCT0gMHgwMiwKKwlHQl9PUF9OT19NRU1PUlkJCT0gMHgwMywKKwlHQl9PUF9QUk9UT0NPTF9CQUQJPSAweDA0LAorCUdCX09QX09WRVJGTE9XCQk9IDB4MDUsCisJR0JfT1BfSU5WQUxJRAkJPSAweDA2LAorCUdCX09QX1JFVFJZCQk9IDB4MDcsCisJR0JfT1BfTk9ORVhJU1RFTlQJPSAweDA4LAorCUdCX09QX1VOS05PV05fRVJST1IJPSAweGZlLAorCUdCX09QX01BTEZVTkNUSU9OCT0gMHhmZiwKK307CisKKyNkZWZpbmUgR0JfT1BFUkFUSU9OX01FU1NBR0VfU0laRV9NSU4Jc2l6ZW9mKHN0cnVjdCBnYl9vcGVyYXRpb25fbXNnX2hkcikKKyNkZWZpbmUgR0JfT1BFUkFUSU9OX01FU1NBR0VfU0laRV9NQVgJVTE2X01BWAorCisvKgorICogUHJvdG9jb2wgY29kZSBzaG91bGQgb25seSBleGFtaW5lIHRoZSBwYXlsb2FkIGFuZCBwYXlsb2FkX3NpemUgZmllbGRzLCBhbmQKKyAqIGhvc3QtY29udHJvbGxlciBkcml2ZXJzIG1heSB1c2UgdGhlIGhjcHJpdiBmaWVsZC4gQWxsIG90aGVyIGZpZWxkcyBhcmUKKyAqIGludGVuZGVkIHRvIGJlIHByaXZhdGUgdG8gdGhlIG9wZXJhdGlvbnMgY29yZSBjb2RlLgorICovCitzdHJ1Y3QgZ2JfbWVzc2FnZSB7CisJc3RydWN0IGdiX29wZXJhdGlvbgkJKm9wZXJhdGlvbjsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uX21zZ19oZHIJKmhlYWRlcjsKKworCXZvaWQJCQkJKnBheWxvYWQ7CisJc2l6ZV90CQkJCXBheWxvYWRfc2l6ZTsKKworCXZvaWQJCQkJKmJ1ZmZlcjsKKworCXZvaWQJCQkJKmhjcHJpdjsKK307CisKKyNkZWZpbmUgR0JfT1BFUkFUSU9OX0ZMQUdfSU5DT01JTkcJCUJJVCgwKQorI2RlZmluZSBHQl9PUEVSQVRJT05fRkxBR19VTklESVJFQ1RJT05BTAlCSVQoMSkKKyNkZWZpbmUgR0JfT1BFUkFUSU9OX0ZMQUdfU0hPUlRfUkVTUE9OU0UJQklUKDIpCisjZGVmaW5lIEdCX09QRVJBVElPTl9GTEFHX0NPUkUJCQlCSVQoMykKKworI2RlZmluZSBHQl9PUEVSQVRJT05fRkxBR19VU0VSX01BU0sJKEdCX09QRVJBVElPTl9GTEFHX1NIT1JUX1JFU1BPTlNFIHwgXAorCQkJCQkgR0JfT1BFUkFUSU9OX0ZMQUdfVU5JRElSRUNUSU9OQUwpCisKKy8qCisgKiBBIEdyZXlidXMgb3BlcmF0aW9uIGlzIGEgcmVtb3RlIHByb2NlZHVyZSBjYWxsIHBlcmZvcm1lZCBvdmVyIGEKKyAqIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gVW5pUHJvIGludGVyZmFjZXMuCisgKgorICogRXZlcnkgb3BlcmF0aW9uIGNvbnNpc3RzIG9mIGEgcmVxdWVzdCBtZXNzYWdlIHNlbnQgdG8gdGhlIG90aGVyCisgKiBlbmQgb2YgdGhlIGNvbm5lY3Rpb24gY291cGxlZCB3aXRoIGEgcmVwbHkgbWVzc2FnZSByZXR1cm5lZCB0bworICogdGhlIHNlbmRlci4gIEV2ZXJ5IG9wZXJhdGlvbiBoYXMgYSB0eXBlLCB3aG9zZSBpbnRlcnByZXRhdGlvbiBpcworICogZGVwZW5kZW50IG9uIHRoZSBwcm90b2NvbCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbm5lY3Rpb24uCisgKgorICogT25seSBmb3VyIHRoaW5ncyBpbiBhbiBvcGVyYXRpb24gc3RydWN0dXJlIGFyZSBpbnRlbmRlZCB0byBiZQorICogZGlyZWN0bHkgdXNhYmxlIGJ5IHByb3RvY29sIGhhbmRsZXJzOiAgdGhlIG9wZXJhdGlvbidzIGNvbm5lY3Rpb24KKyAqIHBvaW50ZXI7IHRoZSBvcGVyYXRpb24gdHlwZTsgdGhlIHJlcXVlc3QgbWVzc2FnZSBwYXlsb2FkIChhbmQKKyAqIHNpemUpOyBhbmQgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgcGF5bG9hZCAoYW5kIHNpemUpLiAgTm90ZSB0aGF0IGEKKyAqIG1lc3NhZ2Ugd2l0aCBhIDAtYnl0ZSBwYXlsb2FkIGhhcyBhIG51bGwgbWVzc2FnZSBwYXlsb2FkIHBvaW50ZXIuCisgKgorICogSW4gYWRkaXRpb24sIGV2ZXJ5IG9wZXJhdGlvbiBoYXMgYSByZXN1bHQsIHdoaWNoIGlzIGFuIGVycm5vCisgKiB2YWx1ZS4gIFByb3RvY29sIGhhbmRsZXJzIGFjY2VzcyB0aGUgb3BlcmF0aW9uIHJlc3VsdCB1c2luZworICogZ2Jfb3BlcmF0aW9uX3Jlc3VsdCgpLgorICovCit0eXBlZGVmIHZvaWQgKCpnYl9vcGVyYXRpb25fY2FsbGJhY2spKHN0cnVjdCBnYl9vcGVyYXRpb24gKik7CitzdHJ1Y3QgZ2Jfb3BlcmF0aW9uIHsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbgkqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfbWVzc2FnZQkqcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfbWVzc2FnZQkqcmVzcG9uc2U7CisKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwl1OAkJCXR5cGU7CisJdTE2CQkJaWQ7CisJaW50CQkJZXJybm87CQkvKiBPcGVyYXRpb24gcmVzdWx0ICovCisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKKwlnYl9vcGVyYXRpb25fY2FsbGJhY2sJY2FsbGJhY2s7CisJc3RydWN0IGNvbXBsZXRpb24JY29tcGxldGlvbjsKKworCXN0cnVjdCBrcmVmCQlrcmVmOworCWF0b21pY190CQl3YWl0ZXJzOworCisJaW50CQkJYWN0aXZlOworCXN0cnVjdCBsaXN0X2hlYWQJbGlua3M7CQkvKiBjb25uZWN0aW9uLT5vcGVyYXRpb25zICovCit9OworCitzdGF0aWMgaW5saW5lIGJvb2wKK2diX29wZXJhdGlvbl9pc19pbmNvbWluZyhzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24pCit7CisJcmV0dXJuIG9wZXJhdGlvbi0+ZmxhZ3MgJiBHQl9PUEVSQVRJT05fRkxBR19JTkNPTUlORzsKK30KKworc3RhdGljIGlubGluZSBib29sCitnYl9vcGVyYXRpb25faXNfdW5pZGlyZWN0aW9uYWwoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKQoreworCXJldHVybiBvcGVyYXRpb24tPmZsYWdzICYgR0JfT1BFUkFUSU9OX0ZMQUdfVU5JRElSRUNUSU9OQUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorZ2Jfb3BlcmF0aW9uX3Nob3J0X3Jlc3BvbnNlX2FsbG93ZWQoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKQoreworCXJldHVybiBvcGVyYXRpb24tPmZsYWdzICYgR0JfT1BFUkFUSU9OX0ZMQUdfU0hPUlRfUkVTUE9OU0U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBnYl9vcGVyYXRpb25faXNfY29yZShzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24pCit7CisJcmV0dXJuIG9wZXJhdGlvbi0+ZmxhZ3MgJiBHQl9PUEVSQVRJT05fRkxBR19DT1JFOworfQorCit2b2lkIGdiX2Nvbm5lY3Rpb25fcmVjdihzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCitpbnQgZ2Jfb3BlcmF0aW9uX3Jlc3VsdChzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24pOworCitzaXplX3QgZ2Jfb3BlcmF0aW9uX2dldF9wYXlsb2FkX3NpemVfbWF4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK3N0cnVjdCBnYl9vcGVyYXRpb24gKgorZ2Jfb3BlcmF0aW9uX2NyZWF0ZV9mbGFncyhzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQl1OCB0eXBlLCBzaXplX3QgcmVxdWVzdF9zaXplLAorCQkJCXNpemVfdCByZXNwb25zZV9zaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJCWdmcF90IGdmcCk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGdiX29wZXJhdGlvbiAqCitnYl9vcGVyYXRpb25fY3JlYXRlKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCXU4IHR5cGUsIHNpemVfdCByZXF1ZXN0X3NpemUsCisJCQkJc2l6ZV90IHJlc3BvbnNlX3NpemUsIGdmcF90IGdmcCkKK3sKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX2NyZWF0ZV9mbGFncyhjb25uZWN0aW9uLCB0eXBlLCByZXF1ZXN0X3NpemUsCisJCQkJCQlyZXNwb25zZV9zaXplLCAwLCBnZnApOworfQorCitzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICoKK2diX29wZXJhdGlvbl9jcmVhdGVfY29yZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQl1OCB0eXBlLCBzaXplX3QgcmVxdWVzdF9zaXplLAorCQkJCXNpemVfdCByZXNwb25zZV9zaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJCWdmcF90IGdmcCk7CisKK3ZvaWQgZ2Jfb3BlcmF0aW9uX2dldChzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24pOwordm9pZCBnYl9vcGVyYXRpb25fcHV0KHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbik7CisKK2Jvb2wgZ2Jfb3BlcmF0aW9uX3Jlc3BvbnNlX2FsbG9jKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbiwKKwkJCQkJc2l6ZV90IHJlc3BvbnNlX3NpemUsIGdmcF90IGdmcCk7CisKK2ludCBnYl9vcGVyYXRpb25fcmVxdWVzdF9zZW5kKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbiwKKwkJCQlnYl9vcGVyYXRpb25fY2FsbGJhY2sgY2FsbGJhY2ssCisJCQkJZ2ZwX3QgZ2ZwKTsKK2ludCBnYl9vcGVyYXRpb25fcmVxdWVzdF9zZW5kX3N5bmNfdGltZW91dChzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24sCisJCQkJCQl1bnNpZ25lZCBpbnQgdGltZW91dCk7CitzdGF0aWMgaW5saW5lIGludAorZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZF9zeW5jKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbikKK3sKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZF9zeW5jX3RpbWVvdXQob3BlcmF0aW9uLAorCQkJR0JfT1BFUkFUSU9OX1RJTUVPVVRfREVGQVVMVCk7Cit9CisKK3ZvaWQgZ2Jfb3BlcmF0aW9uX2NhbmNlbChzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24sIGludCBlcnJubyk7Cit2b2lkIGdiX29wZXJhdGlvbl9jYW5jZWxfaW5jb21pbmcoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uLCBpbnQgZXJybm8pOworCit2b2lkIGdyZXlidXNfbWVzc2FnZV9zZW50KHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsCisJCQkJc3RydWN0IGdiX21lc3NhZ2UgKm1lc3NhZ2UsIGludCBzdGF0dXMpOworCitpbnQgZ2Jfb3BlcmF0aW9uX3N5bmNfdGltZW91dChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IHR5cGUsCisJCQkJdm9pZCAqcmVxdWVzdCwgaW50IHJlcXVlc3Rfc2l6ZSwKKwkJCQl2b2lkICpyZXNwb25zZSwgaW50IHJlc3BvbnNlX3NpemUsCisJCQkJdW5zaWduZWQgaW50IHRpbWVvdXQpOworaW50IGdiX29wZXJhdGlvbl91bmlkaXJlY3Rpb25hbF90aW1lb3V0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCWludCB0eXBlLCB2b2lkICpyZXF1ZXN0LCBpbnQgcmVxdWVzdF9zaXplLAorCQkJCXVuc2lnbmVkIGludCB0aW1lb3V0KTsKKworc3RhdGljIGlubGluZSBpbnQgZ2Jfb3BlcmF0aW9uX3N5bmMoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGludCB0eXBlLAorCQkgICAgICB2b2lkICpyZXF1ZXN0LCBpbnQgcmVxdWVzdF9zaXplLAorCQkgICAgICB2b2lkICpyZXNwb25zZSwgaW50IHJlc3BvbnNlX3NpemUpCit7CisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jX3RpbWVvdXQoY29ubmVjdGlvbiwgdHlwZSwKKwkJCXJlcXVlc3QsIHJlcXVlc3Rfc2l6ZSwgcmVzcG9uc2UsIHJlc3BvbnNlX3NpemUsCisJCQlHQl9PUEVSQVRJT05fVElNRU9VVF9ERUZBVUxUKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2Jfb3BlcmF0aW9uX3VuaWRpcmVjdGlvbmFsKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCWludCB0eXBlLCB2b2lkICpyZXF1ZXN0LCBpbnQgcmVxdWVzdF9zaXplKQoreworCXJldHVybiBnYl9vcGVyYXRpb25fdW5pZGlyZWN0aW9uYWxfdGltZW91dChjb25uZWN0aW9uLCB0eXBlLAorCQkJcmVxdWVzdCwgcmVxdWVzdF9zaXplLCBHQl9PUEVSQVRJT05fVElNRU9VVF9ERUZBVUxUKTsKK30KKworaW50IGdiX29wZXJhdGlvbl9pbml0KHZvaWQpOwordm9pZCBnYl9vcGVyYXRpb25fZXhpdCh2b2lkKTsKKworI2VuZGlmIC8qICFfX09QRVJBVElPTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9wb3dlcl9zdXBwbHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3Bvd2VyX3N1cHBseS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NWM5ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9wb3dlcl9zdXBwbHkuYwpAQCAtMCwwICsxLDExNDEgQEAKKy8qCisgKiBQb3dlciBTdXBwbHkgZHJpdmVyIGZvciBhIEdyZXlidXMgbW9kdWxlLgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorCisjZGVmaW5lIFBST1BfTUFYIDMyCisKK3N0cnVjdCBnYl9wb3dlcl9zdXBwbHlfcHJvcCB7CisJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkJcHJvcDsKKwl1OAkJCQlnYl9wcm9wOworCWludAkJCQl2YWw7CisJaW50CQkJCXByZXZpb3VzX3ZhbDsKKwlib29sCQkJCWlzX3dyaXRlYWJsZTsKK307CisKK3N0cnVjdCBnYl9wb3dlcl9zdXBwbHkgeworCXU4CQkJCWlkOworCWJvb2wJCQkJcmVnaXN0ZXJlZDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5CQkqcHN5OworCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYwlkZXNjOworCWNoYXIJCQkJbmFtZVs2NF07CisJc3RydWN0IGdiX3Bvd2VyX3N1cHBsaWVzCSpzdXBwbGllczsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCQl3b3JrOworCWNoYXIJCQkJKm1hbnVmYWN0dXJlcjsKKwljaGFyCQkJCSptb2RlbF9uYW1lOworCWNoYXIJCQkJKnNlcmlhbF9udW1iZXI7CisJdTgJCQkJdHlwZTsKKwl1OAkJCQlwcm9wZXJ0aWVzX2NvdW50OworCXU4CQkJCXByb3BlcnRpZXNfY291bnRfc3RyOworCXVuc2lnbmVkIGxvbmcJCQlsYXN0X3VwZGF0ZTsKKwl1OAkJCQljYWNoZV9pbnZhbGlkOworCXVuc2lnbmVkIGludAkJCXVwZGF0ZV9pbnRlcnZhbDsKKwlib29sCQkJCWNoYW5nZWQ7CisJc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9wcm9wCSpwcm9wczsKKwllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eQkqcHJvcHNfcmF3OworCWJvb2wJCQkJcG1fYWNxdWlyZWQ7CisJc3RydWN0IG11dGV4CQkJc3VwcGx5X2xvY2s7Cit9OworCitzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGxpZXMgeworCXN0cnVjdCBnYl9jb25uZWN0aW9uCSpjb25uZWN0aW9uOworCXU4CQkJc3VwcGxpZXNfY291bnQ7CisJc3RydWN0IGdiX3Bvd2VyX3N1cHBseQkqc3VwcGx5OworCXN0cnVjdCBtdXRleAkJc3VwcGxpZXNfbG9jazsKK307CisKKyNkZWZpbmUgdG9fZ2JfcG93ZXJfc3VwcGx5KHgpIHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YSh4KQorCisvKgorICogR2VuZXJhbCBwb3dlciBzdXBwbHkgcHJvcGVydGllcyB0aGF0IGNvdWxkIGJlIGFic2VudCBmcm9tIHZhcmlvdXMgcmVhc29ucywKKyAqIGxpa2Uga2VybmVsIHZlcnNpb25zIG9yIHZlbmRvciBzcGVjaWZpYyB2ZXJzaW9ucworICovCisjaWZuZGVmIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQk9PVAorCSNkZWZpbmUgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9CT09UCS0xCisjZW5kaWYKKyNpZm5kZWYgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9CT09UCisJI2RlZmluZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0JPT1QJLTEKKyNlbmRpZgorI2lmbmRlZiBQT1dFUl9TVVBQTFlfUFJPUF9DQUxJQlJBVEUKKwkjZGVmaW5lIFBPV0VSX1NVUFBMWV9QUk9QX0NBTElCUkFURQktMQorI2VuZGlmCisKKy8qIGNhY2hlIHRpbWUgaW4gbWlsbGlzZWNvbmRzLCBpZiBjYWNoZV90aW1lIGlzIHNldCB0byAwIGNhY2hlIGlzIGRpc2FibGUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FjaGVfdGltZSA9IDEwMDA7CisvKgorICogdXBkYXRlIGludGVydmFsIGluaXRpYWwgYW5kIG1heGltdW0gdmFsdWUsIGJldHdlZW4gdGhlIHR3byB3aWxsCisgKiBiYWNrLW9mZiBleHBvbmVudGlhbAorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHVwZGF0ZV9pbnRlcnZhbF9pbml0ID0gMSAqIEhaOworc3RhdGljIHVuc2lnbmVkIGludCB1cGRhdGVfaW50ZXJ2YWxfbWF4ID0gMzAgKiBIWjsKKworc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9jaGFuZ2VzIHsKKwllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eQlwcm9wOworCXUzMgkJCQl0b2xlcmFuY2VfY2hhbmdlOworCXZvaWQgKCpwcm9wX2NoYW5nZWQpKHN0cnVjdCBnYl9wb3dlcl9zdXBwbHkgKmdicHN5LAorCQkJICAgICBzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X3Byb3AgKnByb3ApOworfTsKKworc3RhdGljIHZvaWQgZ2JfcG93ZXJfc3VwcGx5X3N0YXRlX2NoYW5nZShzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSwKKwkJCQkJIHN0cnVjdCBnYl9wb3dlcl9zdXBwbHlfcHJvcCAqcHJvcCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X2NoYW5nZXMgcHN5X3Byb3BzX2NoYW5nZXNbXSA9IHsKKwl7CS5wcm9wCQkJPSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsCisJCS50b2xlcmFuY2VfY2hhbmdlCT0gMCwKKwkJLnByb3BfY2hhbmdlZAkJPSBnYl9wb3dlcl9zdXBwbHlfc3RhdGVfY2hhbmdlLAorCX0sCisJewkucHJvcAkJCT0gR0JfUE9XRVJfU1VQUExZX1BST1BfVEVNUCwKKwkJLnRvbGVyYW5jZV9jaGFuZ2UJPSA1MDAsCisJCS5wcm9wX2NoYW5nZWQJCT0gTlVMTCwKKwl9LAorCXsJLnByb3AJCQk9IEdCX1BPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKKwkJLnRvbGVyYW5jZV9jaGFuZ2UJPSAwLAorCQkucHJvcF9jaGFuZ2VkCQk9IE5VTEwsCisJfSwKK307CisKK3N0YXRpYyBpbnQgZ2V0X3BzcF9mcm9tX2diX3Byb3AoaW50IGdiX3Byb3AsIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5ICpwc3ApCit7CisJaW50IHByb3A7CisKKwlzd2l0Y2ggKGdiX3Byb3ApIHsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRToKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9UWVBFOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfQVVUSEVOVElDOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfQVVUSEVOVElDOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NZQ0xFX0NPVU5UOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfQ1lDTEVfQ09VTlQ7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVg6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTjoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTjoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTjsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTl9ERVNJR046CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTl9ERVNJR047CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX0FWRzoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfT0NWOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9PQ1Y7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9CT09UOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9CT09UOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTUFYOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9NQVg7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1c6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRzoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQk9PVDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQk9PVDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9QT1dFUl9OT1c6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9QT1dFUl9OT1c7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfUE9XRVJfQVZHOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfUE9XRVJfQVZHOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTjoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTjsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRU1QVFlfREVTSUdOOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0VNUFRZX0RFU0lHTjsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9FTVBUWToKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9FTVBUWTsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQVZHOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0FWRzsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQ09VTlRFUjoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9DT1VOVEVSOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJFTlQ7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJFTlRfTUFYOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJFTlRfTUFYOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0U7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0VfTUFYOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0VfTUFYOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9DT05UUk9MX0xJTUlUOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0NPTlRST0xfTElNSVQ7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0NPTlRST0xfTElNSVRfTUFYOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0NPTlRST0xfTElNSVRfTUFYOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0lOUFVUX0NVUlJFTlRfTElNSVQ6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJTUlUOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9GVUxMX0RFU0lHTjoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9GVUxMX0RFU0lHTjsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRU1QVFlfREVTSUdOOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0VNUFRZX0RFU0lHTjsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9GVUxMOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9FTVBUWToKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9FTVBUWTsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfTk9XOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX05PVzsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfQVZHOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0FWRzsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWToKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0FMRVJUX01JTjoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0FMRVJUX01JTjsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9BTEVSVF9NQVg6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9BTEVSVF9NQVg7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfTEVWRUw6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9MRVZFTDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9URU1QOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfVEVNUDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9URU1QX01BWDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUFYOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUlOOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfVEVNUF9NSU47CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NSU46CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FMRVJUX01JTjsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FMRVJUX01BWDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUFYOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQU1CSUVOVDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQU1CSUVOVDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FNQklFTlRfQUxFUlRfTUlOOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTUJJRU5UX0FMRVJUX01JTjsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FNQklFTlRfQUxFUlRfTUFYOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTUJJRU5UX0FMRVJUX01BWDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX05PVzoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfTk9XOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfQVZHOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19FTVBUWV9BVkc7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19GVUxMX05PVzoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRlVMTF9OT1c7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19GVUxMX0FWRzoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRlVMTF9BVkc7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfVFlQRToKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1RZUEU7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfU0NPUEU6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9TQ09QRTsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVEVSTV9DVVJSRU5UOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RFUk1fQ1VSUkVOVDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DQUxJQlJBVEU6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9DQUxJQlJBVEU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByb3AgPSAtMTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHByb3AgPCAwKQorCQlyZXR1cm4gcHJvcDsKKworCSpwc3AgPSAoZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkpcHJvcDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmdldF9jb25uX2Zyb21fcHN5KHN0cnVjdCBnYl9wb3dlcl9zdXBwbHkgKmdicHN5KQoreworCXJldHVybiBnYnBzeS0+c3VwcGxpZXMtPmNvbm5lY3Rpb247Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X3Byb3AgKmdldF9wc3lfcHJvcChzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSwKKwkJCQkJCSBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3ApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ2Jwc3ktPnByb3BlcnRpZXNfY291bnQ7IGkrKykKKwkJaWYgKGdicHN5LT5wcm9wc1tpXS5wcm9wID09IHBzcCkKKwkJCXJldHVybiAmZ2Jwc3ktPnByb3BzW2ldOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGlzX3BzeV9wcm9wX3dyaXRlYWJsZShzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSwKKwkJCQkgICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCkKK3sKKwlzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X3Byb3AgKnByb3A7CisKKwlwcm9wID0gZ2V0X3BzeV9wcm9wKGdicHN5LCBwc3ApOworCWlmICghcHJvcCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJcmV0dXJuIHByb3AtPmlzX3dyaXRlYWJsZSA/IDEgOiAwOworfQorCitzdGF0aWMgaW50IGlzX3Byb3BfdmFsaW50KGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCkKK3sKKwlyZXR1cm4gKChwc3AgPCBQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FKSA/IDEgOiAwKTsKK30KKworc3RhdGljIHZvaWQgbmV4dF9pbnRlcnZhbChzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSkKK3sKKwlpZiAoZ2Jwc3ktPnVwZGF0ZV9pbnRlcnZhbCA9PSB1cGRhdGVfaW50ZXJ2YWxfbWF4KQorCQlyZXR1cm47CisKKwkvKiBkbyBzb21lIGV4cG9uZW50aWFsIGJhY2stb2ZmIGluIHRoZSB1cGRhdGUgaW50ZXJ2YWwgKi8KKwlnYnBzeS0+dXBkYXRlX2ludGVydmFsICo9IDI7CisJaWYgKGdicHN5LT51cGRhdGVfaW50ZXJ2YWwgPiB1cGRhdGVfaW50ZXJ2YWxfbWF4KQorCQlnYnBzeS0+dXBkYXRlX2ludGVydmFsID0gdXBkYXRlX2ludGVydmFsX21heDsKK30KKworc3RhdGljIHZvaWQgX19nYl9wb3dlcl9zdXBwbHlfY2hhbmdlZChzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSkKK3sKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChnYnBzeS0+cHN5KTsKK30KKworc3RhdGljIHZvaWQgZ2JfcG93ZXJfc3VwcGx5X3N0YXRlX2NoYW5nZShzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSwKKwkJCQkJIHN0cnVjdCBnYl9wb3dlcl9zdXBwbHlfcHJvcCAqcHJvcCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fcHN5KGdicHN5KTsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBDaGVjayBnYnBzeS0+cG1fYWNxdWlyZWQgdG8gbWFrZSBzdXJlIG9ubHkgb25lIHBhaXIgb2YgJ2dldF9zeW5jJworCSAqIGFuZCAncHV0X2F1dG9zdXNwZW5kJyBydW50aW1lIHBtIGNhbGwgZm9yIHN0YXRlIHByb3BlcnR5IGNoYW5nZS4KKwkgKi8KKwltdXRleF9sb2NrKCZnYnBzeS0+c3VwcGx5X2xvY2spOworCisJaWYgKChwcm9wLT52YWwgPT0gR0JfUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORykgJiYKKwkgICAgIWdicHN5LT5wbV9hY3F1aXJlZCkgeworCQlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGNvbm5lY3Rpb24tPmJ1bmRsZSk7CisJCWlmIChyZXQpCisJCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCQkiRmFpbCB0byBzZXQgd2FrZSBsb2NrIGZvciBjaGFyZ2luZyBzdGF0ZVxuIik7CisJCWVsc2UKKwkJCWdicHN5LT5wbV9hY3F1aXJlZCA9IHRydWU7CisJfSBlbHNlIHsKKwkJaWYgKGdicHN5LT5wbV9hY3F1aXJlZCkgeworCQkJcmV0ID0gZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoY29ubmVjdGlvbi0+YnVuZGxlKTsKKwkJCWlmIChyZXQpCisJCQkJZGV2X2VycigmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkJCSJGYWlsIHRvIHNldCB3YWtlIHVubG9jayBmb3Igbm9uZSBjaGFyZ2luZ1xuIik7CisJCQllbHNlCisJCQkJZ2Jwc3ktPnBtX2FjcXVpcmVkID0gZmFsc2U7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJmdicHN5LT5zdXBwbHlfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2NoYW5nZWQoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3ksCisJCQkgIHN0cnVjdCBnYl9wb3dlcl9zdXBwbHlfcHJvcCAqcHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X2NoYW5nZXMgKnBzeWM7CisJaW50IHZhbCA9IHByb3AtPnZhbDsKKwlpbnQgcHJldl92YWwgPSBwcm9wLT5wcmV2aW91c192YWw7CisJYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwc3lfcHJvcHNfY2hhbmdlcyk7IGkrKykgeworCQlwc3ljID0gJnBzeV9wcm9wc19jaGFuZ2VzW2ldOworCQlpZiAocHJvcC0+cHJvcCA9PSBwc3ljLT5wcm9wKSB7CisJCQlpZiAoIXBzeWMtPnRvbGVyYW5jZV9jaGFuZ2UpCisJCQkJY2hhbmdlZCA9IHRydWU7CisJCQllbHNlIGlmICh2YWwgPCBwcmV2X3ZhbCAmJgorCQkJCSBwcmV2X3ZhbCAtIHZhbCA+IHBzeWMtPnRvbGVyYW5jZV9jaGFuZ2UpCisJCQkJY2hhbmdlZCA9IHRydWU7CisJCQllbHNlIGlmICh2YWwgPiBwcmV2X3ZhbCAmJgorCQkJCSB2YWwgLSBwcmV2X3ZhbCA+IHBzeWMtPnRvbGVyYW5jZV9jaGFuZ2UpCisJCQkJY2hhbmdlZCA9IHRydWU7CisKKwkJCWlmIChjaGFuZ2VkICYmIHBzeWMtPnByb3BfY2hhbmdlZCkKKwkJCQlwc3ljLT5wcm9wX2NoYW5nZWQoZ2Jwc3ksIHByb3ApOworCisJCQlpZiAoY2hhbmdlZCkKKwkJCQlnYnBzeS0+Y2hhbmdlZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB0b3RhbF9wcm9wcyhzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSkKK3sKKwkvKiB0aGlzIHJldHVybiB0aGUgaW50dmFsIHBsdXMgdGhlIHN0cnZhbCBwcm9wZXJ0aWVzICovCisJcmV0dXJuIChnYnBzeS0+cHJvcGVydGllc19jb3VudCArIGdicHN5LT5wcm9wZXJ0aWVzX2NvdW50X3N0cik7Cit9CisKK3N0YXRpYyB2b2lkIHByb3BfYXBwZW5kKHN0cnVjdCBnYl9wb3dlcl9zdXBwbHkgKmdicHN5LAorCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHJvcCkKK3sKKwllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSAqbmV3X3Byb3BzX3JhdzsKKworCWdicHN5LT5wcm9wZXJ0aWVzX2NvdW50X3N0cisrOworCW5ld19wcm9wc19yYXcgPSBrcmVhbGxvYyhnYnBzeS0+cHJvcHNfcmF3LCB0b3RhbF9wcm9wcyhnYnBzeSkgKgorCQkJCSBzaXplb2YoZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkpLAorCQkJCSBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld19wcm9wc19yYXcpCisJCXJldHVybjsKKwlnYnBzeS0+cHJvcHNfcmF3ID0gbmV3X3Byb3BzX3JhdzsKKwlnYnBzeS0+cHJvcHNfcmF3W3RvdGFsX3Byb3BzKGdicHN5KSAtIDFdID0gcHJvcDsKK30KKworc3RhdGljIGludCBfX2diX3Bvd2VyX3N1cHBseV9zZXRfbmFtZShjaGFyICppbml0X25hbWUsIGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pCit7CisJdW5zaWduZWQgaW50IGkgPSAwOworCWludCByZXQgPSAwOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeTsKKworCWlmICghc3RybGVuKGluaXRfbmFtZSkpCisJCWluaXRfbmFtZSA9ICJnYl9wb3dlcl9zdXBwbHkiOworCXN0cmxjcHkobmFtZSwgaW5pdF9uYW1lLCBsZW4pOworCisJd2hpbGUgKChyZXQgPCBsZW4pICYmIChwc3kgPSBwb3dlcl9zdXBwbHlfZ2V0X2J5X25hbWUobmFtZSkpKSB7CisJCXBvd2VyX3N1cHBseV9wdXQocHN5KTsKKworCQlyZXQgPSBzbnByaW50ZihuYW1lLCBsZW4sICIlc18ldSIsIGluaXRfbmFtZSwgKytpKTsKKwl9CisJaWYgKHJldCA+PSBsZW4pCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBfZ2JfcG93ZXJfc3VwcGx5X2FwcGVuZF9wcm9wcyhzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSkKK3sKKwlpZiAoc3RybGVuKGdicHN5LT5tYW51ZmFjdHVyZXIpKQorCQlwcm9wX2FwcGVuZChnYnBzeSwgUE9XRVJfU1VQUExZX1BST1BfTUFOVUZBQ1RVUkVSKTsKKwlpZiAoc3RybGVuKGdicHN5LT5tb2RlbF9uYW1lKSkKKwkJcHJvcF9hcHBlbmQoZ2Jwc3ksIFBPV0VSX1NVUFBMWV9QUk9QX01PREVMX05BTUUpOworCWlmIChzdHJsZW4oZ2Jwc3ktPnNlcmlhbF9udW1iZXIpKQorCQlwcm9wX2FwcGVuZChnYnBzeSwgUE9XRVJfU1VQUExZX1BST1BfU0VSSUFMX05VTUJFUik7Cit9CisKK3N0YXRpYyBpbnQgZ2JfcG93ZXJfc3VwcGx5X2Rlc2NyaXB0aW9uX2dldChzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fcHN5KGdicHN5KTsKKwlzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X2dldF9kZXNjcmlwdGlvbl9yZXF1ZXN0IHJlcTsKKwlzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X2dldF9kZXNjcmlwdGlvbl9yZXNwb25zZSByZXNwOworCWludCByZXQ7CisKKwlyZXEucHN5X2lkID0gZ2Jwc3ktPmlkOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwKKwkJCQlHQl9QT1dFUl9TVVBQTFlfVFlQRV9HRVRfREVTQ1JJUFRJT04sCisJCQkJJnJlcSwgc2l6ZW9mKHJlcSksICZyZXNwLCBzaXplb2YocmVzcCkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZ2Jwc3ktPm1hbnVmYWN0dXJlciA9IGtzdHJuZHVwKHJlc3AubWFudWZhY3R1cmVyLCBQUk9QX01BWCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnYnBzeS0+bWFudWZhY3R1cmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlnYnBzeS0+bW9kZWxfbmFtZSA9IGtzdHJuZHVwKHJlc3AubW9kZWwsIFBST1BfTUFYLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdicHN5LT5tb2RlbF9uYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKwlnYnBzeS0+c2VyaWFsX251bWJlciA9IGtzdHJuZHVwKHJlc3Auc2VyaWFsX251bWJlciwgUFJPUF9NQVgsCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghZ2Jwc3ktPnNlcmlhbF9udW1iZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJZ2Jwc3ktPnR5cGUgPSBsZTE2X3RvX2NwdShyZXNwLnR5cGUpOworCWdicHN5LT5wcm9wZXJ0aWVzX2NvdW50ID0gcmVzcC5wcm9wZXJ0aWVzX2NvdW50OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfcG93ZXJfc3VwcGx5X3Byb3BfZGVzY3JpcHRvcnNfZ2V0KHN0cnVjdCBnYl9wb3dlcl9zdXBwbHkgKmdicHN5KQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2V0X2Nvbm5fZnJvbV9wc3koZ2Jwc3kpOworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5X2Rlc2NyaXB0b3JzX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eV9kZXNjcmlwdG9yc19yZXNwb25zZSAqcmVzcDsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcDsKKwl1OCBwcm9wc19jb3VudCA9IGdicHN5LT5wcm9wZXJ0aWVzX2NvdW50OworCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcDsKKwlpbnQgcmV0OworCWludCBpLCByID0gMDsKKworCWlmIChwcm9wc19jb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCW9wID0gZ2Jfb3BlcmF0aW9uX2NyZWF0ZShjb25uZWN0aW9uLAorCQkJCSBHQl9QT1dFUl9TVVBQTFlfVFlQRV9HRVRfUFJPUF9ERVNDUklQVE9SUywKKwkJCQkgc2l6ZW9mKHJlcSksIHNpemVvZigqcmVzcCkgKyBwcm9wc19jb3VudCAqCisJCQkJIHNpemVvZihzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X3Byb3BzX2Rlc2MpLAorCQkJCSBHRlBfS0VSTkVMKTsKKwlpZiAoIW9wKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcSA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCXJlcS0+cHN5X2lkID0gZ2Jwc3ktPmlkOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZF9zeW5jKG9wKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfcHV0X29wZXJhdGlvbjsKKworCXJlc3AgPSBvcC0+cmVzcG9uc2UtPnBheWxvYWQ7CisKKwkvKiB2YWxpZGF0ZSByZWNlaXZlZCBwcm9wZXJ0aWVzICovCisJZm9yIChpID0gMDsgaSA8IHByb3BzX2NvdW50OyBpKyspIHsKKwkJcmV0ID0gZ2V0X3BzcF9mcm9tX2diX3Byb3AocmVzcC0+cHJvcHNbaV0ucHJvcGVydHksICZwc3ApOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X3dhcm4oJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJCSAiZ3JleWJ1cyBwcm9wZXJ0eSAldSBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMga2VybmVsLCBkcm9wcGVkXG4iLAorCQkJCSByZXNwLT5wcm9wc1tpXS5wcm9wZXJ0eSk7CisJCQlnYnBzeS0+cHJvcGVydGllc19jb3VudC0tOworCQl9CisJfQorCisJZ2Jwc3ktPnByb3BzID0ga2NhbGxvYyhnYnBzeS0+cHJvcGVydGllc19jb3VudCwgc2l6ZW9mKCpnYnBzeS0+cHJvcHMpLAorCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFnYnBzeS0+cHJvcHMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfcHV0X29wZXJhdGlvbjsKKwl9CisKKwlnYnBzeS0+cHJvcHNfcmF3ID0ga2NhbGxvYyhnYnBzeS0+cHJvcGVydGllc19jb3VudCwKKwkJCQkgICBzaXplb2YoKmdicHN5LT5wcm9wc19yYXcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdicHN5LT5wcm9wc19yYXcpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfcHV0X29wZXJhdGlvbjsKKwl9CisKKwkvKiBTdG9yZSBhdmFpbGFibGUgcHJvcGVydGllcywgc2tpcCB0aGUgb25lcyB3ZSBkbyBub3Qgc3VwcG9ydCAqLworCWZvciAoaSA9IDA7IGkgPCBwcm9wc19jb3VudDsgaSsrKSB7CisJCXJldCA9IGdldF9wc3BfZnJvbV9nYl9wcm9wKHJlc3AtPnByb3BzW2ldLnByb3BlcnR5LCAmcHNwKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXIrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWdicHN5LT5wcm9wc1tpIC0gcl0ucHJvcCA9IHBzcDsKKwkJZ2Jwc3ktPnByb3BzW2kgLSByXS5nYl9wcm9wID0gcmVzcC0+cHJvcHNbaV0ucHJvcGVydHk7CisJCWdicHN5LT5wcm9wc19yYXdbaSAtIHJdID0gcHNwOworCQlpZiAocmVzcC0+cHJvcHNbaV0uaXNfd3JpdGVhYmxlKQorCQkJZ2Jwc3ktPnByb3BzW2kgLSByXS5pc193cml0ZWFibGUgPSB0cnVlOworCX0KKworCS8qCisJICogbm93IGFwcGVuZCB0aGUgcHJvcGVydGllcyB0aGF0IHdlIGFscmVhZHkgZ290IGluZm9ybWF0aW9uIGluIHRoZQorCSAqIGdldF9kZXNjcmlwdGlvbiBvcGVyYXRpb24uIChjaGFyICogb25lcykKKwkgKi8KKwlfZ2JfcG93ZXJfc3VwcGx5X2FwcGVuZF9wcm9wcyhnYnBzeSk7CisKKwlyZXQgPSAwOworb3V0X3B1dF9vcGVyYXRpb246CisJZ2Jfb3BlcmF0aW9uX3B1dChvcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZ2JfcG93ZXJfc3VwcGx5X3Byb3BlcnR5X3VwZGF0ZShzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSwKKwkJCQkJICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3ApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnZXRfY29ubl9mcm9tX3BzeShnYnBzeSk7CisJc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9wcm9wICpwcm9wOworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5X3JlcXVlc3QgcmVxOworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5X3Jlc3BvbnNlIHJlc3A7CisJaW50IHZhbDsKKwlpbnQgcmV0OworCisJcHJvcCA9IGdldF9wc3lfcHJvcChnYnBzeSwgcHNwKTsKKwlpZiAoIXByb3ApCisJCXJldHVybiAtRUlOVkFMOworCXJlcS5wc3lfaWQgPSBnYnBzeS0+aWQ7CisJcmVxLnByb3BlcnR5ID0gcHJvcC0+Z2JfcHJvcDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX1BPV0VSX1NVUFBMWV9UWVBFX0dFVF9QUk9QRVJUWSwKKwkJCQkmcmVxLCBzaXplb2YocmVxKSwgJnJlc3AsIHNpemVvZihyZXNwKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwl2YWwgPSBsZTMyX3RvX2NwdShyZXNwLnByb3BfdmFsKTsKKwlpZiAodmFsID09IHByb3AtPnZhbCkKKwkJcmV0dXJuIDA7CisKKwlwcm9wLT5wcmV2aW91c192YWwgPSBwcm9wLT52YWw7CisJcHJvcC0+dmFsID0gdmFsOworCisJY2hlY2tfY2hhbmdlZChnYnBzeSwgcHJvcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2diX3Bvd2VyX3N1cHBseV9wcm9wZXJ0eV9nZXQoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3ksCisJCQkJCSAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJCQkgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9wcm9wICpwcm9wOworCisJcHJvcCA9IGdldF9wc3lfcHJvcChnYnBzeSwgcHNwKTsKKwlpZiAoIXByb3ApCisJCXJldHVybiAtRUlOVkFMOworCisJdmFsLT5pbnR2YWwgPSBwcm9wLT52YWw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19nYl9wb3dlcl9zdXBwbHlfcHJvcGVydHlfc3RydmFsX2dldChzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSwKKwkJCQkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01PREVMX05BTUU6CisJCXZhbC0+c3RydmFsID0gZ2Jwc3ktPm1vZGVsX25hbWU7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTUFOVUZBQ1RVUkVSOgorCQl2YWwtPnN0cnZhbCA9IGdicHN5LT5tYW51ZmFjdHVyZXI7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU0VSSUFMX05VTUJFUjoKKwkJdmFsLT5zdHJ2YWwgPSBnYnBzeS0+c2VyaWFsX251bWJlcjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2diX3Bvd2VyX3N1cHBseV9wcm9wZXJ0eV9nZXQoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3ksCisJCQkJCSBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQkJCSB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2V0X2Nvbm5fZnJvbV9wc3koZ2Jwc3kpOworCWludCByZXQ7CisKKwkvKgorCSAqIFByb3BlcnRpZXMgb2YgdHlwZSBjb25zdCBjaGFyICosIHdlcmUgYWxyZWFkeSBmZXRjaGVkIG9uCisJICogZ2V0X2Rlc2NyaXB0aW9uIG9wZXJhdGlvbiBhbmQgc2hvdWxkIGJlIGNhY2hlZCBpbiBnYgorCSAqLworCWlmIChpc19wcm9wX3ZhbGludChwc3ApKQorCQlyZXQgPSBfX2diX3Bvd2VyX3N1cHBseV9wcm9wZXJ0eV9nZXQoZ2Jwc3ksIHBzcCwgdmFsKTsKKwllbHNlCisJCXJldCA9IF9fZ2JfcG93ZXJfc3VwcGx5X3Byb3BlcnR5X3N0cnZhbF9nZXQoZ2Jwc3ksIHBzcCwgdmFsKTsKKworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwgImdldCBwcm9wZXJ0eSAldVxuIiwgcHNwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzX2NhY2hlX3ZhbGlkKHN0cnVjdCBnYl9wb3dlcl9zdXBwbHkgKmdicHN5KQoreworCS8qIGNoZWNrIGlmIGNhY2hlIGlzIGdvb2QgZW5vdWdoIG9yIGl0IGhhcyBleHBpcmVkICovCisJaWYgKGdicHN5LT5jYWNoZV9pbnZhbGlkKSB7CisJCWdicHN5LT5jYWNoZV9pbnZhbGlkID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGdicHN5LT5sYXN0X3VwZGF0ZSAmJgorCSAgICB0aW1lX2lzX2FmdGVyX2ppZmZpZXMoZ2Jwc3ktPmxhc3RfdXBkYXRlICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoY2FjaGVfdGltZSkpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX3Bvd2VyX3N1cHBseV9zdGF0dXNfZ2V0KHN0cnVjdCBnYl9wb3dlcl9zdXBwbHkgKmdicHN5KQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2V0X2Nvbm5fZnJvbV9wc3koZ2Jwc3kpOworCWludCByZXQgPSAwOworCWludCBpOworCisJaWYgKGlzX2NhY2hlX3ZhbGlkKGdicHN5KSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGNvbm5lY3Rpb24tPmJ1bmRsZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBnYnBzeS0+cHJvcGVydGllc19jb3VudDsgaSsrKSB7CisJCXJldCA9IF9fZ2JfcG93ZXJfc3VwcGx5X3Byb3BlcnR5X3VwZGF0ZShnYnBzeSwKKwkJCQkJCQlnYnBzeS0+cHJvcHNbaV0ucHJvcCk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKHJldCA9PSAwKQorCQlnYnBzeS0+bGFzdF91cGRhdGUgPSBqaWZmaWVzOworCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoY29ubmVjdGlvbi0+YnVuZGxlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnYl9wb3dlcl9zdXBwbHlfc3RhdHVzX3VwZGF0ZShzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSkKK3sKKwkvKiBjaGVjayBpZiB0aGVyZSBhIGNoYW5nZSB0aGF0IG5lZWQgdG8gYmUgcmVwb3J0ZWQgKi8KKwlnYl9wb3dlcl9zdXBwbHlfc3RhdHVzX2dldChnYnBzeSk7CisKKwlpZiAoIWdicHN5LT5jaGFuZ2VkKQorCQlyZXR1cm47CisKKwlnYnBzeS0+dXBkYXRlX2ludGVydmFsID0gdXBkYXRlX2ludGVydmFsX2luaXQ7CisJX19nYl9wb3dlcl9zdXBwbHlfY2hhbmdlZChnYnBzeSk7CisJZ2Jwc3ktPmNoYW5nZWQgPSBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgZ2JfcG93ZXJfc3VwcGx5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHkgKmdicHN5ID0gY29udGFpbmVyX29mKHdvcmssCisJCQkJCQkgICAgIHN0cnVjdCBnYl9wb3dlcl9zdXBwbHksCisJCQkJCQkgICAgIHdvcmsud29yayk7CisKKwkvKgorCSAqIGlmIHRoZSBwb2xsIGludGVydmFsIGlzIG5vdCBzZXQsIGRpc2FibGUgcG9sbGluZywgdGhpcyBpcyBoZWxwZnVsCisJICogc3BlY2lhbGx5IGF0IHVucmVnaXN0ZXIgdGltZS4KKwkgKi8KKwlpZiAoIWdicHN5LT51cGRhdGVfaW50ZXJ2YWwpCisJCXJldHVybjsKKworCWdiX3Bvd2VyX3N1cHBseV9zdGF0dXNfdXBkYXRlKGdicHN5KTsKKwluZXh0X2ludGVydmFsKGdicHN5KTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmdicHN5LT53b3JrLCBnYnBzeS0+dXBkYXRlX2ludGVydmFsKTsKK30KKworc3RhdGljIGludCBnZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqYiwKKwkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3kgPSB0b19nYl9wb3dlcl9zdXBwbHkoYik7CisKKwlnYl9wb3dlcl9zdXBwbHlfc3RhdHVzX2dldChnYnBzeSk7CisKKwlyZXR1cm4gX2diX3Bvd2VyX3N1cHBseV9wcm9wZXJ0eV9nZXQoZ2Jwc3ksIHBzcCwgdmFsKTsKK30KKworc3RhdGljIGludCBnYl9wb3dlcl9zdXBwbHlfcHJvcGVydHlfc2V0KHN0cnVjdCBnYl9wb3dlcl9zdXBwbHkgKmdicHN5LAorCQkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQkJCWludCB2YWwpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnZXRfY29ubl9mcm9tX3BzeShnYnBzeSk7CisJc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9wcm9wICpwcm9wOworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHlfc2V0X3Byb3BlcnR5X3JlcXVlc3QgcmVxOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGNvbm5lY3Rpb24tPmJ1bmRsZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXByb3AgPSBnZXRfcHN5X3Byb3AoZ2Jwc3ksIHBzcCk7CisJaWYgKCFwcm9wKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJlcS5wc3lfaWQgPSBnYnBzeS0+aWQ7CisJcmVxLnByb3BlcnR5ID0gcHJvcC0+Z2JfcHJvcDsKKwlyZXEucHJvcF92YWwgPSBjcHVfdG9fbGUzMigoczMyKXZhbCk7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9QT1dFUl9TVVBQTFlfVFlQRV9TRVRfUFJPUEVSVFksCisJCQkJJnJlcSwgc2l6ZW9mKHJlcSksIE5VTEwsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIGNhY2hlIGltbWVkaWF0ZWx5IHRoZSBuZXcgdmFsdWUgKi8KKwlwcm9wLT52YWwgPSB2YWw7CisKK291dDoKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChjb25uZWN0aW9uLT5idW5kbGUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKmIsCisJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQljb25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHkgKmdicHN5ID0gdG9fZ2JfcG93ZXJfc3VwcGx5KGIpOworCisJcmV0dXJuIGdiX3Bvd2VyX3N1cHBseV9wcm9wZXJ0eV9zZXQoZ2Jwc3ksIHBzcCwgdmFsLT5pbnR2YWwpOworfQorCitzdGF0aWMgaW50IHByb3BlcnR5X2lzX3dyaXRlYWJsZShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiLAorCQkJCSBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3ApCit7CisJc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3kgPSB0b19nYl9wb3dlcl9zdXBwbHkoYik7CisKKwlyZXR1cm4gaXNfcHN5X3Byb3Bfd3JpdGVhYmxlKGdicHN5LCBwc3ApOworfQorCitzdGF0aWMgaW50IGdiX3Bvd2VyX3N1cHBseV9yZWdpc3RlcihzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fcHN5KGdicHN5KTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBjZmcgPSB7fTsKKworCWNmZy5kcnZfZGF0YSA9IGdicHN5OworCisJZ2Jwc3ktPmRlc2MubmFtZQkJPSBnYnBzeS0+bmFtZTsKKwlnYnBzeS0+ZGVzYy50eXBlCQk9IGdicHN5LT50eXBlOworCWdicHN5LT5kZXNjLnByb3BlcnRpZXMJCT0gZ2Jwc3ktPnByb3BzX3JhdzsKKwlnYnBzeS0+ZGVzYy5udW1fcHJvcGVydGllcwk9IHRvdGFsX3Byb3BzKGdicHN5KTsKKwlnYnBzeS0+ZGVzYy5nZXRfcHJvcGVydHkJPSBnZXRfcHJvcGVydHk7CisJZ2Jwc3ktPmRlc2Muc2V0X3Byb3BlcnR5CT0gc2V0X3Byb3BlcnR5OworCWdicHN5LT5kZXNjLnByb3BlcnR5X2lzX3dyaXRlYWJsZSA9IHByb3BlcnR5X2lzX3dyaXRlYWJsZTsKKworCWdicHN5LT5wc3kgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJCQkgICAmZ2Jwc3ktPmRlc2MsICZjZmcpOworCXJldHVybiBQVFJfRVJSX09SX1pFUk8oZ2Jwc3ktPnBzeSk7Cit9CisKK3N0YXRpYyB2b2lkIF9nYl9wb3dlcl9zdXBwbHlfZnJlZShzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSkKK3sKKwlrZnJlZShnYnBzeS0+c2VyaWFsX251bWJlcik7CisJa2ZyZWUoZ2Jwc3ktPm1vZGVsX25hbWUpOworCWtmcmVlKGdicHN5LT5tYW51ZmFjdHVyZXIpOworCWtmcmVlKGdicHN5LT5wcm9wc19yYXcpOworCWtmcmVlKGdicHN5LT5wcm9wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9nYl9wb3dlcl9zdXBwbHlfcmVsZWFzZShzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSkKK3sKKwlnYnBzeS0+dXBkYXRlX2ludGVydmFsID0gMDsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZ2Jwc3ktPndvcmspOworCisJaWYgKGdicHN5LT5yZWdpc3RlcmVkKQorCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihnYnBzeS0+cHN5KTsKKworCV9nYl9wb3dlcl9zdXBwbHlfZnJlZShnYnBzeSk7Cit9CisKK3N0YXRpYyB2b2lkIF9nYl9wb3dlcl9zdXBwbGllc19yZWxlYXNlKHN0cnVjdCBnYl9wb3dlcl9zdXBwbGllcyAqc3VwcGxpZXMpCit7CisJaW50IGk7CisKKwlpZiAoIXN1cHBsaWVzLT5zdXBwbHkpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJnN1cHBsaWVzLT5zdXBwbGllc19sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgc3VwcGxpZXMtPnN1cHBsaWVzX2NvdW50OyBpKyspCisJCV9nYl9wb3dlcl9zdXBwbHlfcmVsZWFzZSgmc3VwcGxpZXMtPnN1cHBseVtpXSk7CisJa2ZyZWUoc3VwcGxpZXMtPnN1cHBseSk7CisJbXV0ZXhfdW5sb2NrKCZzdXBwbGllcy0+c3VwcGxpZXNfbG9jayk7CisJa2ZyZWUoc3VwcGxpZXMpOworfQorCitzdGF0aWMgaW50IGdiX3Bvd2VyX3N1cHBsaWVzX2dldF9jb3VudChzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGxpZXMgKnN1cHBsaWVzKQoreworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHlfZ2V0X3N1cHBsaWVzX3Jlc3BvbnNlIHJlc3A7CisJaW50IHJldDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKHN1cHBsaWVzLT5jb25uZWN0aW9uLAorCQkJCUdCX1BPV0VSX1NVUFBMWV9UWVBFX0dFVF9TVVBQTElFUywKKwkJCQlOVUxMLCAwLCAmcmVzcCwgc2l6ZW9mKHJlc3ApKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmICAoIXJlc3Auc3VwcGxpZXNfY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJc3VwcGxpZXMtPnN1cHBsaWVzX2NvdW50ID0gcmVzcC5zdXBwbGllc19jb3VudDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfcG93ZXJfc3VwcGx5X2NvbmZpZyhzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGxpZXMgKnN1cHBsaWVzLCBpbnQgaWQpCit7CisJc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3kgPSAmc3VwcGxpZXMtPnN1cHBseVtpZF07CisJaW50IHJldDsKKworCWdicHN5LT5zdXBwbGllcyA9IHN1cHBsaWVzOworCWdicHN5LT5pZCA9IGlkOworCisJcmV0ID0gZ2JfcG93ZXJfc3VwcGx5X2Rlc2NyaXB0aW9uX2dldChnYnBzeSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gZ2JfcG93ZXJfc3VwcGx5X3Byb3BfZGVzY3JpcHRvcnNfZ2V0KGdicHN5KTsKK30KKworc3RhdGljIGludCBnYl9wb3dlcl9zdXBwbHlfZW5hYmxlKHN0cnVjdCBnYl9wb3dlcl9zdXBwbHkgKmdicHN5KQoreworCWludCByZXQ7CisKKwkvKiBndWFyYW50ZWUgdGhhdCB3ZSBoYXZlIGFuIHVuaXF1ZSBuYW1lLCBiZWZvcmUgcmVnaXN0ZXIgKi8KKwlyZXQgPSAgX19nYl9wb3dlcl9zdXBwbHlfc2V0X25hbWUoZ2Jwc3ktPm1vZGVsX25hbWUsIGdicHN5LT5uYW1lLAorCQkJCQkgIHNpemVvZihnYnBzeS0+bmFtZSkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfaW5pdCgmZ2Jwc3ktPnN1cHBseV9sb2NrKTsKKworCXJldCA9IGdiX3Bvd2VyX3N1cHBseV9yZWdpc3RlcihnYnBzeSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlnYnBzeS0+dXBkYXRlX2ludGVydmFsID0gdXBkYXRlX2ludGVydmFsX2luaXQ7CisJSU5JVF9ERUxBWUVEX1dPUksoJmdicHN5LT53b3JrLCBnYl9wb3dlcl9zdXBwbHlfd29yayk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZnYnBzeS0+d29yaywgMCk7CisKKwkvKiBldmVyeXRoaW5nIHdlbnQgZmluZSwgbWFyayBpdCBmb3IgcmVsZWFzZSBjb2RlIHRvIGtub3cgKi8KKwlnYnBzeS0+cmVnaXN0ZXJlZCA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9wb3dlcl9zdXBwbGllc19zZXR1cChzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGxpZXMgKnN1cHBsaWVzKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gc3VwcGxpZXMtPmNvbm5lY3Rpb247CisJaW50IHJldDsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJnN1cHBsaWVzLT5zdXBwbGllc19sb2NrKTsKKworCXJldCA9IGdiX3Bvd2VyX3N1cHBsaWVzX2dldF9jb3VudChzdXBwbGllcyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJc3VwcGxpZXMtPnN1cHBseSA9IGt6YWxsb2Moc3VwcGxpZXMtPnN1cHBsaWVzX2NvdW50ICoKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5KSwKKwkJCQkgICAgIEdGUF9LRVJORUwpOworCisJaWYgKCFzdXBwbGllcy0+c3VwcGx5KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzdXBwbGllcy0+c3VwcGxpZXNfY291bnQ7IGkrKykgeworCQlyZXQgPSBnYl9wb3dlcl9zdXBwbHlfY29uZmlnKHN1cHBsaWVzLCBpKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJCSJGYWlsIHRvIGNvbmZpZ3VyZSBzdXBwbGllcyBkZXZpY2VzXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmc3VwcGxpZXMtPnN1cHBsaWVzX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfcG93ZXJfc3VwcGxpZXNfcmVnaXN0ZXIoc3RydWN0IGdiX3Bvd2VyX3N1cHBsaWVzICpzdXBwbGllcykKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IHN1cHBsaWVzLT5jb25uZWN0aW9uOworCWludCByZXQgPSAwOworCWludCBpOworCisJbXV0ZXhfbG9jaygmc3VwcGxpZXMtPnN1cHBsaWVzX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IHN1cHBsaWVzLT5zdXBwbGllc19jb3VudDsgaSsrKSB7CisJCXJldCA9IGdiX3Bvd2VyX3N1cHBseV9lbmFibGUoJnN1cHBsaWVzLT5zdXBwbHlbaV0pOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkJIkZhaWwgdG8gZW5hYmxlIHN1cHBsaWVzIGRldmljZXNcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJnN1cHBsaWVzLT5zdXBwbGllc19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX3N1cHBsaWVzX3JlcXVlc3RfaGFuZGxlcihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbGllcyAqc3VwcGxpZXMgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKGNvbm5lY3Rpb24pOworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHkgKmdicHN5OworCXN0cnVjdCBnYl9tZXNzYWdlICpyZXF1ZXN0OworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHlfZXZlbnRfcmVxdWVzdCAqcGF5bG9hZDsKKwl1OCBwc3lfaWQ7CisJdTggZXZlbnQ7CisJaW50IHJldCA9IDA7CisKKwlpZiAob3AtPnR5cGUgIT0gR0JfUE9XRVJfU1VQUExZX1RZUEVfRVZFTlQpIHsKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkiVW5zdXBwb3J0ZWQgdW5zb2xpY2l0ZWQgZXZlbnQ6ICV1XG4iLCBvcC0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcXVlc3QgPSBvcC0+cmVxdWVzdDsKKworCWlmIChyZXF1ZXN0LT5wYXlsb2FkX3NpemUgPCBzaXplb2YoKnBheWxvYWQpKSB7CisJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJIldyb25nIGV2ZW50IHNpemUgcmVjZWl2ZWQgKCV6dSA8ICV6dSlcbiIsCisJCQlyZXF1ZXN0LT5wYXlsb2FkX3NpemUsIHNpemVvZigqcGF5bG9hZCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwYXlsb2FkID0gcmVxdWVzdC0+cGF5bG9hZDsKKwlwc3lfaWQgPSBwYXlsb2FkLT5wc3lfaWQ7CisJbXV0ZXhfbG9jaygmc3VwcGxpZXMtPnN1cHBsaWVzX2xvY2spOworCWlmIChwc3lfaWQgPj0gc3VwcGxpZXMtPnN1cHBsaWVzX2NvdW50IHx8CisJICAgICFzdXBwbGllcy0+c3VwcGx5W3BzeV9pZF0ucmVnaXN0ZXJlZCkgeworCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCSJFdmVudCByZWNlaXZlZCBmb3IgdW5jb25maWd1cmVkIHBvd2VyX3N1cHBseSBpZDogJWRcbiIsCisJCQlwc3lfaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJZXZlbnQgPSBwYXlsb2FkLT5ldmVudDsKKwkvKgorCSAqIHdlIHdpbGwgb25seSBoYW5kbGUgZXZlbnRzIGFmdGVyIHNldHVwIGlzIGRvbmUgYW5kIGJlZm9yZSByZWxlYXNlIGlzCisJICogcnVubmluZy4gRm9yIHRoYXQganVzdCBjaGVjayB1cGRhdGVfaW50ZXJ2YWwuCisJICovCisJZ2Jwc3kgPSAmc3VwcGxpZXMtPnN1cHBseVtwc3lfaWRdOworCWlmICghZ2Jwc3ktPnVwZGF0ZV9pbnRlcnZhbCkgeworCQlyZXQgPSAtRVNIVVRET1dOOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaWYgKGV2ZW50ICYgR0JfUE9XRVJfU1VQUExZX1VQREFURSkgeworCQkvKgorCQkgKiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBpbnZhbGlkYXRlIGNhY2hlLCBpZiBub3Qgbm8gbmV3CisJCSAqIHZhbHVlcyBmb3IgdGhlIHByb3BlcnRpZXMgd2lsbCBiZSBmZXRjaCBhbmQgdGhlIGFsbCBwcm9wb3NlCisJCSAqIG9mIHRoaXMgZXZlbnQgaXMgbWlzc2VkCisJCSAqLworCQlnYnBzeS0+Y2FjaGVfaW52YWxpZCA9IDE7CisJCWdiX3Bvd2VyX3N1cHBseV9zdGF0dXNfdXBkYXRlKGdicHN5KTsKKwl9CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZzdXBwbGllcy0+c3VwcGxpZXNfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9wb3dlcl9zdXBwbHlfcHJvYmUoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlLAorCQkJCSBjb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgKmlkKQoreworCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfY3BvcnQgKmNwb3J0X2Rlc2M7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJc3RydWN0IGdiX3Bvd2VyX3N1cHBsaWVzICpzdXBwbGllczsKKwlpbnQgcmV0OworCisJaWYgKGJ1bmRsZS0+bnVtX2Nwb3J0cyAhPSAxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNwb3J0X2Rlc2MgPSAmYnVuZGxlLT5jcG9ydF9kZXNjWzBdOworCWlmIChjcG9ydF9kZXNjLT5wcm90b2NvbF9pZCAhPSBHUkVZQlVTX1BST1RPQ09MX1BPV0VSX1NVUFBMWSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzdXBwbGllcyA9IGt6YWxsb2Moc2l6ZW9mKCpzdXBwbGllcyksIEdGUF9LRVJORUwpOworCWlmICghc3VwcGxpZXMpCisJCXJldHVybiAtRU5PTUVNOworCisJY29ubmVjdGlvbiA9IGdiX2Nvbm5lY3Rpb25fY3JlYXRlKGJ1bmRsZSwgbGUxNl90b19jcHUoY3BvcnRfZGVzYy0+aWQpLAorCQkJCQkgIGdiX3N1cHBsaWVzX3JlcXVlc3RfaGFuZGxlcik7CisJaWYgKElTX0VSUihjb25uZWN0aW9uKSkgeworCQlyZXQgPSBQVFJfRVJSKGNvbm5lY3Rpb24pOworCQlnb3RvIG91dDsKKwl9CisKKwlzdXBwbGllcy0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJZ2JfY29ubmVjdGlvbl9zZXRfZGF0YShjb25uZWN0aW9uLCBzdXBwbGllcyk7CisKKwltdXRleF9pbml0KCZzdXBwbGllcy0+c3VwcGxpZXNfbG9jayk7CisKKwlncmV5YnVzX3NldF9kcnZkYXRhKGJ1bmRsZSwgc3VwcGxpZXMpOworCisJLyogV2UgYXJlbid0IHJlYWR5IHRvIHJlY2VpdmUgYW4gaW5jb21pbmcgcmVxdWVzdCB5ZXQgKi8KKwlyZXQgPSBnYl9jb25uZWN0aW9uX2VuYWJsZV90eChjb25uZWN0aW9uKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2Nvbm5lY3Rpb25fZGVzdHJveTsKKworCXJldCA9IGdiX3Bvd2VyX3N1cHBsaWVzX3NldHVwKHN1cHBsaWVzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9jb25uZWN0aW9uX2Rpc2FibGU7CisKKwkvKiBXZSBhcmUgcmVhZHkgdG8gcmVjZWl2ZSBhbiBpbmNvbWluZyByZXF1ZXN0IG5vdywgZW5hYmxlIFJYIGFzIHdlbGwgKi8KKwlyZXQgPSBnYl9jb25uZWN0aW9uX2VuYWJsZShjb25uZWN0aW9uKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2Nvbm5lY3Rpb25fZGlzYWJsZTsKKworCXJldCA9IGdiX3Bvd2VyX3N1cHBsaWVzX3JlZ2lzdGVyKHN1cHBsaWVzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9jb25uZWN0aW9uX2Rpc2FibGU7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCXJldHVybiAwOworCitlcnJvcl9jb25uZWN0aW9uX2Rpc2FibGU6CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworZXJyb3JfY29ubmVjdGlvbl9kZXN0cm95OgorCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKK291dDoKKwlfZ2JfcG93ZXJfc3VwcGxpZXNfcmVsZWFzZShzdXBwbGllcyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ2JfcG93ZXJfc3VwcGx5X2Rpc2Nvbm5lY3Qoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKQoreworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbGllcyAqc3VwcGxpZXMgPSBncmV5YnVzX2dldF9kcnZkYXRhKGJ1bmRsZSk7CisKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoc3VwcGxpZXMtPmNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShzdXBwbGllcy0+Y29ubmVjdGlvbik7CisKKwlfZ2JfcG93ZXJfc3VwcGxpZXNfcmVsZWFzZShzdXBwbGllcyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgZ2JfcG93ZXJfc3VwcGx5X2lkX3RhYmxlW10gPSB7CisJeyBHUkVZQlVTX0RFVklDRV9DTEFTUyhHUkVZQlVTX0NMQVNTX1BPV0VSX1NVUFBMWSkgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGdyZXlidXMsIGdiX3Bvd2VyX3N1cHBseV9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZ3JleWJ1c19kcml2ZXIgZ2JfcG93ZXJfc3VwcGx5X2RyaXZlciA9IHsKKwkubmFtZQkJPSAicG93ZXJfc3VwcGx5IiwKKwkucHJvYmUJCT0gZ2JfcG93ZXJfc3VwcGx5X3Byb2JlLAorCS5kaXNjb25uZWN0CT0gZ2JfcG93ZXJfc3VwcGx5X2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gZ2JfcG93ZXJfc3VwcGx5X2lkX3RhYmxlLAorfTsKK21vZHVsZV9ncmV5YnVzX2RyaXZlcihnYl9wb3dlcl9zdXBwbHlfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvcHdtLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9wd20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGJmMzI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvcHdtLmMKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiBQV00gR3JleWJ1cyBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wd20uaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJnYnBoeS5oIgorCitzdHJ1Y3QgZ2JfcHdtX2NoaXAgeworCXN0cnVjdCBnYl9jb25uZWN0aW9uCSpjb25uZWN0aW9uOworCXU4CQkJcHdtX21heDsJLyogbWF4IHB3bSBudW1iZXIgKi8KKworCXN0cnVjdCBwd21fY2hpcAkJY2hpcDsKKwlzdHJ1Y3QgcHdtX2NoaXAJCSpwd207Cit9OworI2RlZmluZSBwd21fY2hpcF90b19nYl9wd21fY2hpcChjaGlwKSBcCisJY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBnYl9wd21fY2hpcCwgY2hpcCkKKworCitzdGF0aWMgaW50IGdiX3B3bV9jb3VudF9vcGVyYXRpb24oc3RydWN0IGdiX3B3bV9jaGlwICpwd21jKQoreworCXN0cnVjdCBnYl9wd21fY291bnRfcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IHJldDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKHB3bWMtPmNvbm5lY3Rpb24sIEdCX1BXTV9UWVBFX1BXTV9DT1VOVCwKKwkJCQlOVUxMLCAwLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcHdtYy0+cHdtX21heCA9IHJlc3BvbnNlLmNvdW50OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX3B3bV9hY3RpdmF0ZV9vcGVyYXRpb24oc3RydWN0IGdiX3B3bV9jaGlwICpwd21jLAorCQkJCSAgICAgdTggd2hpY2gpCit7CisJc3RydWN0IGdiX3B3bV9hY3RpdmF0ZV9yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2OworCWludCByZXQ7CisKKwlpZiAod2hpY2ggPiBwd21jLT5wd21fbWF4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlcXVlc3Qud2hpY2ggPSB3aGljaDsKKworCWdicGh5X2RldiA9IHRvX2dicGh5X2Rldihwd21jLT5jaGlwLmRldik7CisJcmV0ID0gZ2JwaHlfcnVudGltZV9nZXRfc3luYyhnYnBoeV9kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhwd21jLT5jb25uZWN0aW9uLCBHQl9QV01fVFlQRV9BQ1RJVkFURSwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKKworCWdicGh5X3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdicGh5X2Rldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX3B3bV9kZWFjdGl2YXRlX29wZXJhdGlvbihzdHJ1Y3QgZ2JfcHdtX2NoaXAgKnB3bWMsCisJCQkJICAgICAgIHU4IHdoaWNoKQoreworCXN0cnVjdCBnYl9wd21fZGVhY3RpdmF0ZV9yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2OworCWludCByZXQ7CisKKwlpZiAod2hpY2ggPiBwd21jLT5wd21fbWF4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlcXVlc3Qud2hpY2ggPSB3aGljaDsKKworCWdicGh5X2RldiA9IHRvX2dicGh5X2Rldihwd21jLT5jaGlwLmRldik7CisJcmV0ID0gZ2JwaHlfcnVudGltZV9nZXRfc3luYyhnYnBoeV9kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhwd21jLT5jb25uZWN0aW9uLCBHQl9QV01fVFlQRV9ERUFDVElWQVRFLAorCQkJCSZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworCisJZ2JwaHlfcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ2JwaHlfZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfcHdtX2NvbmZpZ19vcGVyYXRpb24oc3RydWN0IGdiX3B3bV9jaGlwICpwd21jLAorCQkJCSAgIHU4IHdoaWNoLCB1MzIgZHV0eSwgdTMyIHBlcmlvZCkKK3sKKwlzdHJ1Y3QgZ2JfcHdtX2NvbmZpZ19yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2OworCWludCByZXQ7CisKKwlpZiAod2hpY2ggPiBwd21jLT5wd21fbWF4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlcXVlc3Qud2hpY2ggPSB3aGljaDsKKwlyZXF1ZXN0LmR1dHkgPSBjcHVfdG9fbGUzMihkdXR5KTsKKwlyZXF1ZXN0LnBlcmlvZCA9IGNwdV90b19sZTMyKHBlcmlvZCk7CisKKwlnYnBoeV9kZXYgPSB0b19nYnBoeV9kZXYocHdtYy0+Y2hpcC5kZXYpOworCXJldCA9IGdicGh5X3J1bnRpbWVfZ2V0X3N5bmMoZ2JwaHlfZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMocHdtYy0+Y29ubmVjdGlvbiwgR0JfUFdNX1RZUEVfQ09ORklHLAorCQkJCSZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworCisJZ2JwaHlfcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ2JwaHlfZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfcHdtX3NldF9wb2xhcml0eV9vcGVyYXRpb24oc3RydWN0IGdiX3B3bV9jaGlwICpwd21jLAorCQkJCQkgdTggd2hpY2gsIHU4IHBvbGFyaXR5KQoreworCXN0cnVjdCBnYl9wd21fcG9sYXJpdHlfcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldjsKKwlpbnQgcmV0OworCisJaWYgKHdoaWNoID4gcHdtYy0+cHdtX21heCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXF1ZXN0LndoaWNoID0gd2hpY2g7CisJcmVxdWVzdC5wb2xhcml0eSA9IHBvbGFyaXR5OworCisJZ2JwaHlfZGV2ID0gdG9fZ2JwaHlfZGV2KHB3bWMtPmNoaXAuZGV2KTsKKwlyZXQgPSBnYnBoeV9ydW50aW1lX2dldF9zeW5jKGdicGh5X2Rldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKHB3bWMtPmNvbm5lY3Rpb24sIEdCX1BXTV9UWVBFX1BPTEFSSVRZLAorCQkJCSZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworCisJZ2JwaHlfcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ2JwaHlfZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfcHdtX2VuYWJsZV9vcGVyYXRpb24oc3RydWN0IGdiX3B3bV9jaGlwICpwd21jLAorCQkJCSAgIHU4IHdoaWNoKQoreworCXN0cnVjdCBnYl9wd21fZW5hYmxlX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXY7CisJaW50IHJldDsKKworCWlmICh3aGljaCA+IHB3bWMtPnB3bV9tYXgpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVxdWVzdC53aGljaCA9IHdoaWNoOworCisJZ2JwaHlfZGV2ID0gdG9fZ2JwaHlfZGV2KHB3bWMtPmNoaXAuZGV2KTsKKwlyZXQgPSBnYnBoeV9ydW50aW1lX2dldF9zeW5jKGdicGh5X2Rldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKHB3bWMtPmNvbm5lY3Rpb24sIEdCX1BXTV9UWVBFX0VOQUJMRSwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKKwlpZiAocmV0KQorCQlnYnBoeV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChnYnBoeV9kZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9wd21fZGlzYWJsZV9vcGVyYXRpb24oc3RydWN0IGdiX3B3bV9jaGlwICpwd21jLAorCQkJCSAgICB1OCB3aGljaCkKK3sKKwlzdHJ1Y3QgZ2JfcHdtX2Rpc2FibGVfcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldjsKKwlpbnQgcmV0OworCisJaWYgKHdoaWNoID4gcHdtYy0+cHdtX21heCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXF1ZXN0LndoaWNoID0gd2hpY2g7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhwd21jLT5jb25uZWN0aW9uLCBHQl9QV01fVFlQRV9ESVNBQkxFLAorCQkJCSZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworCisJZ2JwaHlfZGV2ID0gdG9fZ2JwaHlfZGV2KHB3bWMtPmNoaXAuZGV2KTsKKwlnYnBoeV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChnYnBoeV9kZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9wd21fcmVxdWVzdChzdHJ1Y3QgcHdtX2NoaXAgKmNoaXAsIHN0cnVjdCBwd21fZGV2aWNlICpwd20pCit7CisJc3RydWN0IGdiX3B3bV9jaGlwICpwd21jID0gcHdtX2NoaXBfdG9fZ2JfcHdtX2NoaXAoY2hpcCk7CisKKwlyZXR1cm4gZ2JfcHdtX2FjdGl2YXRlX29wZXJhdGlvbihwd21jLCBwd20tPmh3cHdtKTsKK307CisKK3N0YXRpYyB2b2lkIGdiX3B3bV9mcmVlKHN0cnVjdCBwd21fY2hpcCAqY2hpcCwgc3RydWN0IHB3bV9kZXZpY2UgKnB3bSkKK3sKKwlzdHJ1Y3QgZ2JfcHdtX2NoaXAgKnB3bWMgPSBwd21fY2hpcF90b19nYl9wd21fY2hpcChjaGlwKTsKKworCWlmIChwd21faXNfZW5hYmxlZChwd20pKQorCQlkZXZfd2FybihjaGlwLT5kZXYsICJmcmVlaW5nIFBXTSBkZXZpY2Ugd2l0aG91dCBkaXNhYmxpbmdcbiIpOworCisJZ2JfcHdtX2RlYWN0aXZhdGVfb3BlcmF0aW9uKHB3bWMsIHB3bS0+aHdwd20pOworfQorCitzdGF0aWMgaW50IGdiX3B3bV9jb25maWcoc3RydWN0IHB3bV9jaGlwICpjaGlwLCBzdHJ1Y3QgcHdtX2RldmljZSAqcHdtLAorCQkJIGludCBkdXR5X25zLCBpbnQgcGVyaW9kX25zKQoreworCXN0cnVjdCBnYl9wd21fY2hpcCAqcHdtYyA9IHB3bV9jaGlwX3RvX2diX3B3bV9jaGlwKGNoaXApOworCisJcmV0dXJuIGdiX3B3bV9jb25maWdfb3BlcmF0aW9uKHB3bWMsIHB3bS0+aHdwd20sIGR1dHlfbnMsIHBlcmlvZF9ucyk7Cit9OworCitzdGF0aWMgaW50IGdiX3B3bV9zZXRfcG9sYXJpdHkoc3RydWN0IHB3bV9jaGlwICpjaGlwLCBzdHJ1Y3QgcHdtX2RldmljZSAqcHdtLAorCQkJICAgICAgIGVudW0gcHdtX3BvbGFyaXR5IHBvbGFyaXR5KQoreworCXN0cnVjdCBnYl9wd21fY2hpcCAqcHdtYyA9IHB3bV9jaGlwX3RvX2diX3B3bV9jaGlwKGNoaXApOworCisJcmV0dXJuIGdiX3B3bV9zZXRfcG9sYXJpdHlfb3BlcmF0aW9uKHB3bWMsIHB3bS0+aHdwd20sIHBvbGFyaXR5KTsKK307CisKK3N0YXRpYyBpbnQgZ2JfcHdtX2VuYWJsZShzdHJ1Y3QgcHdtX2NoaXAgKmNoaXAsIHN0cnVjdCBwd21fZGV2aWNlICpwd20pCit7CisJc3RydWN0IGdiX3B3bV9jaGlwICpwd21jID0gcHdtX2NoaXBfdG9fZ2JfcHdtX2NoaXAoY2hpcCk7CisKKwlyZXR1cm4gZ2JfcHdtX2VuYWJsZV9vcGVyYXRpb24ocHdtYywgcHdtLT5od3B3bSk7Cit9OworCitzdGF0aWMgdm9pZCBnYl9wd21fZGlzYWJsZShzdHJ1Y3QgcHdtX2NoaXAgKmNoaXAsIHN0cnVjdCBwd21fZGV2aWNlICpwd20pCit7CisJc3RydWN0IGdiX3B3bV9jaGlwICpwd21jID0gcHdtX2NoaXBfdG9fZ2JfcHdtX2NoaXAoY2hpcCk7CisKKwlnYl9wd21fZGlzYWJsZV9vcGVyYXRpb24ocHdtYywgcHdtLT5od3B3bSk7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHB3bV9vcHMgZ2JfcHdtX29wcyA9IHsKKwkucmVxdWVzdCA9IGdiX3B3bV9yZXF1ZXN0LAorCS5mcmVlID0gZ2JfcHdtX2ZyZWUsCisJLmNvbmZpZyA9IGdiX3B3bV9jb25maWcsCisJLnNldF9wb2xhcml0eSA9IGdiX3B3bV9zZXRfcG9sYXJpdHksCisJLmVuYWJsZSA9IGdiX3B3bV9lbmFibGUsCisJLmRpc2FibGUgPSBnYl9wd21fZGlzYWJsZSwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgZ2JfcHdtX3Byb2JlKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldiwKKwkJCWNvbnN0IHN0cnVjdCBnYnBoeV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCXN0cnVjdCBnYl9wd21fY2hpcCAqcHdtYzsKKwlzdHJ1Y3QgcHdtX2NoaXAgKnB3bTsKKwlpbnQgcmV0OworCisJcHdtYyA9IGt6YWxsb2Moc2l6ZW9mKCpwd21jKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwd21jKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbm5lY3Rpb24gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZShnYnBoeV9kZXYtPmJ1bmRsZSwKKwkJCQkJICBsZTE2X3RvX2NwdShnYnBoeV9kZXYtPmNwb3J0X2Rlc2MtPmlkKSwKKwkJCQkJICBOVUxMKTsKKwlpZiAoSVNfRVJSKGNvbm5lY3Rpb24pKSB7CisJCXJldCA9IFBUUl9FUlIoY29ubmVjdGlvbik7CisJCWdvdG8gZXhpdF9wd21jX2ZyZWU7CisJfQorCisJcHdtYy0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJZ2JfY29ubmVjdGlvbl9zZXRfZGF0YShjb25uZWN0aW9uLCBwd21jKTsKKwlnYl9nYnBoeV9zZXRfZGF0YShnYnBoeV9kZXYsIHB3bWMpOworCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbik7CisJaWYgKHJldCkKKwkJZ290byBleGl0X2Nvbm5lY3Rpb25fZGVzdHJveTsKKworCS8qIFF1ZXJ5IG51bWJlciBvZiBwd21zIHByZXNlbnQgKi8KKwlyZXQgPSBnYl9wd21fY291bnRfb3BlcmF0aW9uKHB3bWMpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9jb25uZWN0aW9uX2Rpc2FibGU7CisKKwlwd20gPSAmcHdtYy0+Y2hpcDsKKworCXB3bS0+ZGV2ID0gJmdicGh5X2Rldi0+ZGV2OworCXB3bS0+b3BzID0gJmdiX3B3bV9vcHM7CisJcHdtLT5iYXNlID0gLTE7CQkJLyogQWxsb2NhdGUgYmFzZSBkeW5hbWljYWxseSAqLworCXB3bS0+bnB3bSA9IHB3bWMtPnB3bV9tYXggKyAxOworCXB3bS0+Y2FuX3NsZWVwID0gdHJ1ZTsJCS8qIEZJWE1FICovCisKKwlyZXQgPSBwd21jaGlwX2FkZChwd20pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmZ2JwaHlfZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIHJlZ2lzdGVyIFBXTTogJWRcbiIsIHJldCk7CisJCWdvdG8gZXhpdF9jb25uZWN0aW9uX2Rpc2FibGU7CisJfQorCisJZ2JwaHlfcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ2JwaHlfZGV2KTsKKwlyZXR1cm4gMDsKKworZXhpdF9jb25uZWN0aW9uX2Rpc2FibGU6CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworZXhpdF9jb25uZWN0aW9uX2Rlc3Ryb3k6CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGNvbm5lY3Rpb24pOworZXhpdF9wd21jX2ZyZWU6CisJa2ZyZWUocHdtYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ2JfcHdtX3JlbW92ZShzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYpCit7CisJc3RydWN0IGdiX3B3bV9jaGlwICpwd21jID0gZ2JfZ2JwaHlfZ2V0X2RhdGEoZ2JwaHlfZGV2KTsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IHB3bWMtPmNvbm5lY3Rpb247CisJaW50IHJldDsKKworCXJldCA9IGdicGh5X3J1bnRpbWVfZ2V0X3N5bmMoZ2JwaHlfZGV2KTsKKwlpZiAocmV0KQorCQlnYnBoeV9ydW50aW1lX2dldF9ub3Jlc3VtZShnYnBoeV9kZXYpOworCisJcHdtY2hpcF9yZW1vdmUoJnB3bWMtPmNoaXApOworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7CisJa2ZyZWUocHdtYyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2JwaHlfZGV2aWNlX2lkIGdiX3B3bV9pZF90YWJsZVtdID0geworCXsgR0JQSFlfUFJPVE9DT0woR1JFWUJVU19QUk9UT0NPTF9QV00pIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZ2JwaHksIGdiX3B3bV9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZ2JwaHlfZHJpdmVyIHB3bV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInB3bSIsCisJLnByb2JlCQk9IGdiX3B3bV9wcm9iZSwKKwkucmVtb3ZlCQk9IGdiX3B3bV9yZW1vdmUsCisJLmlkX3RhYmxlCT0gZ2JfcHdtX2lkX3RhYmxlLAorfTsKKworbW9kdWxlX2dicGh5X2RyaXZlcihwd21fZHJpdmVyKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3Jhdy5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvcmF3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5ZDI1OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3Jhdy5jCkBAIC0wLDAgKzEsMzgxIEBACisvKgorICogR3JleWJ1cyBkcml2ZXIgZm9yIHRoZSBSYXcgcHJvdG9jb2wKKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTUgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zaXplcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKworc3RydWN0IGdiX3JhdyB7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJaW50IGxpc3RfZGF0YTsKKwlzdHJ1Y3QgbXV0ZXggbGlzdF9sb2NrOworCWRldl90IGRldjsKKwlzdHJ1Y3QgY2RldiBjZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldmljZTsKK307CisKK3N0cnVjdCByYXdfZGF0YSB7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKKwl1MzIgbGVuOworCXU4IGRhdGFbMF07Cit9OworCitzdGF0aWMgc3RydWN0IGNsYXNzICpyYXdfY2xhc3M7CitzdGF0aWMgaW50IHJhd19tYWpvcjsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJhd19mb3BzOworc3RhdGljIERFRklORV9JREEobWlub3JzKTsKKworLyogTnVtYmVyIG9mIG1pbm9yIGRldmljZXMgdGhpcyBkcml2ZXIgc3VwcG9ydHMgKi8KKyNkZWZpbmUgTlVNX01JTk9SUwkyNTYKKworLyogTWF4aW11bSBzaXplIG9mIGFueSBvbmUgc2VuZCBkYXRhIGJ1ZmZlciB3ZSBzdXBwb3J0ICovCisjZGVmaW5lIE1BWF9QQUNLRVRfU0laRQkoUEFHRV9TSVpFICogMikKKworLyoKKyAqIE1heGltdW0gc2l6ZSBvZiB0aGUgZGF0YSBpbiB0aGUgcmVjZWl2ZSBidWZmZXIgd2UgYWxsb3cgYmVmb3JlIHdlIHN0YXJ0IHRvCisgKiBkcm9wIG1lc3NhZ2VzIG9uIHRoZSBmbG9vcgorICovCisjZGVmaW5lIE1BWF9EQVRBX1NJWkUJKE1BWF9QQUNLRVRfU0laRSAqIDgpCisKKy8qCisgKiBBZGQgdGhlIHJhdyBkYXRhIG1lc3NhZ2UgdG8gdGhlIGxpc3Qgb2YgcmVjZWl2ZWQgbWVzc2FnZXMuCisgKi8KK3N0YXRpYyBpbnQgcmVjZWl2ZV9kYXRhKHN0cnVjdCBnYl9yYXcgKnJhdywgdTMyIGxlbiwgdTggKmRhdGEpCit7CisJc3RydWN0IHJhd19kYXRhICpyYXdfZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcmF3LT5jb25uZWN0aW9uLT5idW5kbGUtPmRldjsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChsZW4gPiBNQVhfUEFDS0VUX1NJWkUpIHsKKwkJZGV2X2VycihkZXYsICJUb28gYmlnIG9mIGEgZGF0YSBwYWNrZXQsIHJlamVjdGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmcmF3LT5saXN0X2xvY2spOworCWlmICgocmF3LT5saXN0X2RhdGEgKyBsZW4pID4gTUFYX0RBVEFfU0laRSkgeworCQlkZXZfZXJyKGRldiwgIlRvbyBtdWNoIGRhdGEgaW4gcmVjZWl2ZSBidWZmZXIsIG5vdyBkcm9wcGluZyBwYWNrZXRzXG4iKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCXJhd19kYXRhID0ga21hbGxvYyhzaXplb2YoKnJhd19kYXRhKSArIGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyYXdfZGF0YSkgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJcmF3LT5saXN0X2RhdGEgKz0gbGVuOworCXJhd19kYXRhLT5sZW4gPSBsZW47CisJbWVtY3B5KCZyYXdfZGF0YS0+ZGF0YVswXSwgZGF0YSwgbGVuKTsKKworCWxpc3RfYWRkX3RhaWwoJnJhd19kYXRhLT5lbnRyeSwgJnJhdy0+bGlzdCk7CitleGl0OgorCW11dGV4X3VubG9jaygmcmF3LT5saXN0X2xvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZ2JfcmF3X3JlcXVlc3RfaGFuZGxlcihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wLT5jb25uZWN0aW9uOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjb25uZWN0aW9uLT5idW5kbGUtPmRldjsKKwlzdHJ1Y3QgZ2JfcmF3ICpyYXcgPSBncmV5YnVzX2dldF9kcnZkYXRhKGNvbm5lY3Rpb24tPmJ1bmRsZSk7CisJc3RydWN0IGdiX3Jhd19zZW5kX3JlcXVlc3QgKnJlY2VpdmU7CisJdTMyIGxlbjsKKworCWlmIChvcC0+dHlwZSAhPSBHQl9SQVdfVFlQRV9TRU5EKSB7CisJCWRldl9lcnIoZGV2LCAidW5rbm93biByZXF1ZXN0IHR5cGUgMHglMDJ4XG4iLCBvcC0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFZlcmlmeSBzaXplIG9mIHBheWxvYWQgKi8KKwlpZiAob3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSA8IHNpemVvZigqcmVjZWl2ZSkpIHsKKwkJZGV2X2VycihkZXYsICJyYXcgcmVjZWl2ZSByZXF1ZXN0IHRvbyBzbWFsbCAoJXp1IDwgJXp1KVxuIiwKKwkJCW9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUsIHNpemVvZigqcmVjZWl2ZSkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmVjZWl2ZSA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCWxlbiA9IGxlMzJfdG9fY3B1KHJlY2VpdmUtPmxlbik7CisJaWYgKGxlbiAhPSAoaW50KShvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplIC0gc2l6ZW9mKF9fbGUzMikpKSB7CisJCWRldl9lcnIoZGV2LCAicmF3IHJlY2VpdmUgcmVxdWVzdCB3cm9uZyBzaXplICVkIHZzICVkXG4iLCBsZW4sCisJCQkoaW50KShvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplIC0gc2l6ZW9mKF9fbGUzMikpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChsZW4gPT0gMCkgeworCQlkZXZfZXJyKGRldiwgInJhdyByZWNlaXZlIHJlcXVlc3Qgb2YgMCBieXRlcz9cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmVjZWl2ZV9kYXRhKHJhdywgbGVuLCByZWNlaXZlLT5kYXRhKTsKK30KKworc3RhdGljIGludCBnYl9yYXdfc2VuZChzdHJ1Y3QgZ2JfcmF3ICpyYXcsIHUzMiBsZW4sIGNvbnN0IGNoYXIgX191c2VyICpkYXRhKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gcmF3LT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9yYXdfc2VuZF9yZXF1ZXN0ICpyZXF1ZXN0OworCWludCByZXR2YWw7CisKKwlyZXF1ZXN0ID0ga21hbGxvYyhsZW4gKyBzaXplb2YoKnJlcXVlc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcXVlc3QpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LT5kYXRhWzBdLCBkYXRhLCBsZW4pKSB7CisJCWtmcmVlKHJlcXVlc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXF1ZXN0LT5sZW4gPSBjcHVfdG9fbGUzMihsZW4pOworCisJcmV0dmFsID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfUkFXX1RZUEVfU0VORCwKKwkJCQkgICByZXF1ZXN0LCBsZW4gKyBzaXplb2YoKnJlcXVlc3QpLAorCQkJCSAgIE5VTEwsIDApOworCisJa2ZyZWUocmVxdWVzdCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBnYl9yYXdfcHJvYmUoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlLAorCQkJY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2Nwb3J0ICpjcG9ydF9kZXNjOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCXN0cnVjdCBnYl9yYXcgKnJhdzsKKwlpbnQgcmV0dmFsOworCWludCBtaW5vcjsKKworCWlmIChidW5kbGUtPm51bV9jcG9ydHMgIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljcG9ydF9kZXNjID0gJmJ1bmRsZS0+Y3BvcnRfZGVzY1swXTsKKwlpZiAoY3BvcnRfZGVzYy0+cHJvdG9jb2xfaWQgIT0gR1JFWUJVU19QUk9UT0NPTF9SQVcpCisJCXJldHVybiAtRU5PREVWOworCisJcmF3ID0ga3phbGxvYyhzaXplb2YoKnJhdyksIEdGUF9LRVJORUwpOworCWlmICghcmF3KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbm5lY3Rpb24gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZShidW5kbGUsIGxlMTZfdG9fY3B1KGNwb3J0X2Rlc2MtPmlkKSwKKwkJCQkJICBnYl9yYXdfcmVxdWVzdF9oYW5kbGVyKTsKKwlpZiAoSVNfRVJSKGNvbm5lY3Rpb24pKSB7CisJCXJldHZhbCA9IFBUUl9FUlIoY29ubmVjdGlvbik7CisJCWdvdG8gZXJyb3JfZnJlZTsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmcmF3LT5saXN0KTsKKwltdXRleF9pbml0KCZyYXctPmxpc3RfbG9jayk7CisKKwlyYXctPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCWdyZXlidXNfc2V0X2RydmRhdGEoYnVuZGxlLCByYXcpOworCisJbWlub3IgPSBpZGFfc2ltcGxlX2dldCgmbWlub3JzLCAwLCAwLCBHRlBfS0VSTkVMKTsKKwlpZiAobWlub3IgPCAwKSB7CisJCXJldHZhbCA9IG1pbm9yOworCQlnb3RvIGVycm9yX2Nvbm5lY3Rpb25fZGVzdHJveTsKKwl9CisKKwlyYXctPmRldiA9IE1LREVWKHJhd19tYWpvciwgbWlub3IpOworCWNkZXZfaW5pdCgmcmF3LT5jZGV2LCAmcmF3X2ZvcHMpOworCisJcmV0dmFsID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbik7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcl9yZW1vdmVfaWRhOworCisJcmV0dmFsID0gY2Rldl9hZGQoJnJhdy0+Y2RldiwgcmF3LT5kZXYsIDEpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3JfY29ubmVjdGlvbl9kaXNhYmxlOworCisJcmF3LT5kZXZpY2UgPSBkZXZpY2VfY3JlYXRlKHJhd19jbGFzcywgJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJCSAgICByYXctPmRldiwgcmF3LCAiZ2IhcmF3JWQiLCBtaW5vcik7CisJaWYgKElTX0VSUihyYXctPmRldmljZSkpIHsKKwkJcmV0dmFsID0gUFRSX0VSUihyYXctPmRldmljZSk7CisJCWdvdG8gZXJyb3JfZGVsX2NkZXY7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yX2RlbF9jZGV2OgorCWNkZXZfZGVsKCZyYXctPmNkZXYpOworCitlcnJvcl9jb25uZWN0aW9uX2Rpc2FibGU6CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworCitlcnJvcl9yZW1vdmVfaWRhOgorCWlkYV9zaW1wbGVfcmVtb3ZlKCZtaW5vcnMsIG1pbm9yKTsKKworZXJyb3JfY29ubmVjdGlvbl9kZXN0cm95OgorCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKKworZXJyb3JfZnJlZToKKwlrZnJlZShyYXcpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3Jhd19kaXNjb25uZWN0KHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwlzdHJ1Y3QgZ2JfcmF3ICpyYXcgPSBncmV5YnVzX2dldF9kcnZkYXRhKGJ1bmRsZSk7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSByYXctPmNvbm5lY3Rpb247CisJc3RydWN0IHJhd19kYXRhICpyYXdfZGF0YTsKKwlzdHJ1Y3QgcmF3X2RhdGEgKnRlbXA7CisKKwkvLyBGSVhNRSAtIGhhbmRsZSByZW1vdmluZyBhIGNvbm5lY3Rpb24gd2hlbiB0aGUgY2hhciBkZXZpY2Ugbm9kZSBpcyBvcGVuLgorCWRldmljZV9kZXN0cm95KHJhd19jbGFzcywgcmF3LT5kZXYpOworCWNkZXZfZGVsKCZyYXctPmNkZXYpOworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKKwlpZGFfc2ltcGxlX3JlbW92ZSgmbWlub3JzLCBNSU5PUihyYXctPmRldikpOworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKKworCW11dGV4X2xvY2soJnJhdy0+bGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmF3X2RhdGEsIHRlbXAsICZyYXctPmxpc3QsIGVudHJ5KSB7CisJCWxpc3RfZGVsKCZyYXdfZGF0YS0+ZW50cnkpOworCQlrZnJlZShyYXdfZGF0YSk7CisJfQorCW11dGV4X3VubG9jaygmcmF3LT5saXN0X2xvY2spOworCisJa2ZyZWUocmF3KTsKK30KKworLyoKKyAqIENoYXJhY3RlciBkZXZpY2Ugbm9kZSBpbnRlcmZhY2VzLgorICoKKyAqIE5vdGUsIHdlIGFyZSB1c2luZyByZWFkL3dyaXRlIHRvIG9ubHkgYWxsb3cgYSBzaW5nbGUgcmVhZC93cml0ZSBwZXIgbWVzc2FnZS4KKyAqIFRoaXMgbWVhbnMgZm9yIHJlYWQoKSwgeW91IGhhdmUgdG8gcHJvdmlkZSBhIGJpZyBlbm91Z2ggYnVmZmVyIGZvciB0aGUgZnVsbAorICogbWVzc2FnZSB0byBiZSBjb3BpZWQgaW50by4gIElmIHRoZSBidWZmZXIgaXNuJ3QgYmlnIGVub3VnaCwgdGhlIHJlYWQoKSB3aWxsCisgKiBmYWlsIHdpdGggLUVOT1NQQy4KKyAqLworCitzdGF0aWMgaW50IHJhd19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBjZGV2ICpjZGV2ID0gaW5vZGUtPmlfY2RldjsKKwlzdHJ1Y3QgZ2JfcmF3ICpyYXcgPSBjb250YWluZXJfb2YoY2Rldiwgc3RydWN0IGdiX3JhdywgY2Rldik7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSByYXc7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJhd193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZ2JfcmF3ICpyYXcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldHZhbDsKKworCWlmICghY291bnQpCisJCXJldHVybiAwOworCisJaWYgKGNvdW50ID4gTUFYX1BBQ0tFVF9TSVpFKQorCQlyZXR1cm4gLUUyQklHOworCisJcmV0dmFsID0gZ2JfcmF3X3NlbmQocmF3LCBjb3VudCwgYnVmKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCByYXdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBnYl9yYXcgKnJhdyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgcmF3X2RhdGEgKnJhd19kYXRhOworCisJbXV0ZXhfbG9jaygmcmF3LT5saXN0X2xvY2spOworCWlmIChsaXN0X2VtcHR5KCZyYXctPmxpc3QpKQorCQlnb3RvIGV4aXQ7CisKKwlyYXdfZGF0YSA9IGxpc3RfZmlyc3RfZW50cnkoJnJhdy0+bGlzdCwgc3RydWN0IHJhd19kYXRhLCBlbnRyeSk7CisJaWYgKHJhd19kYXRhLT5sZW4gPiBjb3VudCkgeworCQlyZXR2YWwgPSAtRU5PU1BDOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKGNvcHlfdG9fdXNlcihidWYsICZyYXdfZGF0YS0+ZGF0YVswXSwgcmF3X2RhdGEtPmxlbikpIHsKKwkJcmV0dmFsID0gLUVGQVVMVDsKKwkJZ290byBleGl0OworCX0KKworCWxpc3RfZGVsKCZyYXdfZGF0YS0+ZW50cnkpOworCXJhdy0+bGlzdF9kYXRhIC09IHJhd19kYXRhLT5sZW47CisJcmV0dmFsID0gcmF3X2RhdGEtPmxlbjsKKwlrZnJlZShyYXdfZGF0YSk7CisKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZyYXctPmxpc3RfbG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmF3X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS53cml0ZQkJPSByYXdfd3JpdGUsCisJLnJlYWQJCT0gcmF3X3JlYWQsCisJLm9wZW4JCT0gcmF3X29wZW4sCisJLmxsc2VlawkJPSBub29wX2xsc2VlaywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgZ2JfcmF3X2lkX3RhYmxlW10gPSB7CisJeyBHUkVZQlVTX0RFVklDRV9DTEFTUyhHUkVZQlVTX0NMQVNTX1JBVykgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGdyZXlidXMsIGdiX3Jhd19pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZ3JleWJ1c19kcml2ZXIgZ2JfcmF3X2RyaXZlciA9IHsKKwkubmFtZQkJPSAicmF3IiwKKwkucHJvYmUJCT0gZ2JfcmF3X3Byb2JlLAorCS5kaXNjb25uZWN0CT0gZ2JfcmF3X2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gZ2JfcmF3X2lkX3RhYmxlLAorfTsKKworc3RhdGljIGludCByYXdfaW5pdCh2b2lkKQoreworCWRldl90IGRldjsKKwlpbnQgcmV0dmFsOworCisJcmF3X2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiZ2JfcmF3Iik7CisJaWYgKElTX0VSUihyYXdfY2xhc3MpKSB7CisJCXJldHZhbCA9IFBUUl9FUlIocmF3X2NsYXNzKTsKKwkJZ290byBlcnJvcl9jbGFzczsKKwl9CisKKwlyZXR2YWwgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZkZXYsIDAsIE5VTV9NSU5PUlMsICJnYl9yYXciKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBlcnJvcl9jaHJkZXY7CisKKwlyYXdfbWFqb3IgPSBNQUpPUihkZXYpOworCisJcmV0dmFsID0gZ3JleWJ1c19yZWdpc3RlcigmZ2JfcmF3X2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcl9nYjsKKworCXJldHVybiAwOworCitlcnJvcl9nYjoKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCBOVU1fTUlOT1JTKTsKK2Vycm9yX2NocmRldjoKKwljbGFzc19kZXN0cm95KHJhd19jbGFzcyk7CitlcnJvcl9jbGFzczoKKwlyZXR1cm4gcmV0dmFsOworfQorbW9kdWxlX2luaXQocmF3X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcmF3X2V4aXQodm9pZCkKK3sKKwlncmV5YnVzX2RlcmVnaXN0ZXIoJmdiX3Jhd19kcml2ZXIpOworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihyYXdfbWFqb3IsIDApLCBOVU1fTUlOT1JTKTsKKwljbGFzc19kZXN0cm95KHJhd19jbGFzcyk7CisJaWRhX2Rlc3Ryb3koJm1pbm9ycyk7Cit9Cittb2R1bGVfZXhpdChyYXdfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3NkaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3NkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjQ5ZWYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc2Rpby5jCkBAIC0wLDAgKzEsODg0IEBACisvKgorICogU0QvTU1DIEdyZXlidXMgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9tbWMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImdicGh5LmgiCisKK3N0cnVjdCBnYl9zZGlvX2hvc3QgeworCXN0cnVjdCBnYl9jb25uZWN0aW9uCSpjb25uZWN0aW9uOworCXN0cnVjdCBnYnBoeV9kZXZpY2UJKmdicGh5X2RldjsKKwlzdHJ1Y3QgbW1jX2hvc3QJCSptbWM7CisJc3RydWN0IG1tY19yZXF1ZXN0CSptcnE7CisJc3RydWN0IG11dGV4CQlsb2NrOwkvKiBsb2NrIGZvciB0aGlzIGhvc3QgKi8KKwlzaXplX3QJCQlkYXRhX21heDsKKwlzcGlubG9ja190CQl4ZmVyOwkvKiBsb2NrIHRvIGNhbmNlbCBvbmdvaW5nIHRyYW5zZmVyICovCisJYm9vbAkJCXhmZXJfc3RvcDsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkqbXJxX3dvcmtxdWV1ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJbXJxd29yazsKKwl1OAkJCXF1ZXVlZF9ldmVudHM7CisJYm9vbAkJCXJlbW92ZWQ7CisJYm9vbAkJCWNhcmRfcHJlc2VudDsKKwlib29sCQkJcmVhZF9vbmx5OworfTsKKworCisjZGVmaW5lIEdCX1NESU9fUlNQX1IxX1I1X1I2X1I3CShHQl9TRElPX1JTUF9QUkVTRU5UIHwgR0JfU0RJT19SU1BfQ1JDIHwgXAorCQkJCSBHQl9TRElPX1JTUF9PUENPREUpCisjZGVmaW5lIEdCX1NESU9fUlNQX1IzX1I0CShHQl9TRElPX1JTUF9QUkVTRU5UKQorI2RlZmluZSBHQl9TRElPX1JTUF9SMgkJKEdCX1NESU9fUlNQX1BSRVNFTlQgfCBHQl9TRElPX1JTUF9DUkMgfCBcCisJCQkJIEdCX1NESU9fUlNQXzEzNikKKyNkZWZpbmUgR0JfU0RJT19SU1BfUjFCCQkoR0JfU0RJT19SU1BfUFJFU0VOVCB8IEdCX1NESU9fUlNQX0NSQyB8IFwKKwkJCQkgR0JfU0RJT19SU1BfT1BDT0RFIHwgR0JfU0RJT19SU1BfQlVTWSkKKworLyoga2VybmVsIHZkZCBzdGFydHMgYXQgMHg4MCBhbmQgd2UgbmVlZCB0byB0cmFuc2xhdGUgdG8gZ3JleWJ1cyBvbmVzIDB4MDEgKi8KKyNkZWZpbmUgR0JfU0RJT19WRERfU0hJRlQJOAorCisjaWZuZGVmIE1NQ19DQVAyX0NPUkVfUlVOVElNRV9QTQorI2RlZmluZSBNTUNfQ0FQMl9DT1JFX1JVTlRJTUVfUE0JMAorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzaW5nbGVfb3Aoc3RydWN0IG1tY19jb21tYW5kICpjbWQpCit7CisJdWludDMyX3Qgb3Bjb2RlID0gY21kLT5vcGNvZGU7CisKKwlyZXR1cm4gb3Bjb2RlID09IE1NQ19XUklURV9CTE9DSyB8fAorCSAgICAgICBvcGNvZGUgPT0gTU1DX1JFQURfU0lOR0xFX0JMT0NLOworfQorCitzdGF0aWMgdm9pZCBfZ2Jfc2Rpb19zZXRfaG9zdF9jYXBzKHN0cnVjdCBnYl9zZGlvX2hvc3QgKmhvc3QsIHUzMiByKQoreworCXUzMiBjYXBzID0gMDsKKwl1MzIgY2FwczIgPSAwOworCisJY2FwcyA9ICgociAmIEdCX1NESU9fQ0FQX05PTlJFTU9WQUJMRSkgPyBNTUNfQ0FQX05PTlJFTU9WQUJMRSA6IDApIHwKKwkJKChyICYgR0JfU0RJT19DQVBfNF9CSVRfREFUQSkgPyBNTUNfQ0FQXzRfQklUX0RBVEEgOiAwKSB8CisJCSgociAmIEdCX1NESU9fQ0FQXzhfQklUX0RBVEEpID8gTU1DX0NBUF84X0JJVF9EQVRBIDogMCkgfAorCQkoKHIgJiBHQl9TRElPX0NBUF9NTUNfSFMpID8gTU1DX0NBUF9NTUNfSElHSFNQRUVEIDogMCkgfAorCQkoKHIgJiBHQl9TRElPX0NBUF9TRF9IUykgPyBNTUNfQ0FQX1NEX0hJR0hTUEVFRCA6IDApIHwKKwkJKChyICYgR0JfU0RJT19DQVBfRVJBU0UpID8gTU1DX0NBUF9FUkFTRSA6IDApIHwKKwkJKChyICYgR0JfU0RJT19DQVBfMV8yVl9ERFIpID8gTU1DX0NBUF8xXzJWX0REUiA6IDApIHwKKwkJKChyICYgR0JfU0RJT19DQVBfMV84Vl9ERFIpID8gTU1DX0NBUF8xXzhWX0REUiA6IDApIHwKKwkJKChyICYgR0JfU0RJT19DQVBfUE9XRVJfT0ZGX0NBUkQpID8gTU1DX0NBUF9QT1dFUl9PRkZfQ0FSRCA6IDApIHwKKwkJKChyICYgR0JfU0RJT19DQVBfVUhTX1NEUjEyKSA/IE1NQ19DQVBfVUhTX1NEUjEyIDogMCkgfAorCQkoKHIgJiBHQl9TRElPX0NBUF9VSFNfU0RSMjUpID8gTU1DX0NBUF9VSFNfU0RSMjUgOiAwKSB8CisJCSgociAmIEdCX1NESU9fQ0FQX1VIU19TRFI1MCkgPyBNTUNfQ0FQX1VIU19TRFI1MCA6IDApIHwKKwkJKChyICYgR0JfU0RJT19DQVBfVUhTX1NEUjEwNCkgPyBNTUNfQ0FQX1VIU19TRFIxMDQgOiAwKSB8CisJCSgociAmIEdCX1NESU9fQ0FQX1VIU19ERFI1MCkgPyBNTUNfQ0FQX1VIU19ERFI1MCA6IDApIHwKKwkJKChyICYgR0JfU0RJT19DQVBfRFJJVkVSX1RZUEVfQSkgPyBNTUNfQ0FQX0RSSVZFUl9UWVBFX0EgOiAwKSB8CisJCSgociAmIEdCX1NESU9fQ0FQX0RSSVZFUl9UWVBFX0MpID8gTU1DX0NBUF9EUklWRVJfVFlQRV9DIDogMCkgfAorCQkoKHIgJiBHQl9TRElPX0NBUF9EUklWRVJfVFlQRV9EKSA/IE1NQ19DQVBfRFJJVkVSX1RZUEVfRCA6IDApOworCisJY2FwczIgPSAoKHIgJiBHQl9TRElPX0NBUF9IUzIwMF8xXzJWKSA/IE1NQ19DQVAyX0hTMjAwXzFfMlZfU0RSIDogMCkgfAorCQkoKHIgJiBHQl9TRElPX0NBUF9IUzQwMF8xXzJWKSA/IE1NQ19DQVAyX0hTNDAwXzFfMlYgOiAwKSB8CisJCSgociAmIEdCX1NESU9fQ0FQX0hTNDAwXzFfOFYpID8gTU1DX0NBUDJfSFM0MDBfMV84ViA6IDApIHwKKwkJKChyICYgR0JfU0RJT19DQVBfSFMyMDBfMV84VikgPyBNTUNfQ0FQMl9IUzIwMF8xXzhWX1NEUiA6IDApOworCisJaG9zdC0+bW1jLT5jYXBzID0gY2FwczsKKwlob3N0LT5tbWMtPmNhcHMyID0gY2FwczIgfCBNTUNfQ0FQMl9DT1JFX1JVTlRJTUVfUE07CisKKwlpZiAoY2FwcyAmIE1NQ19DQVBfTk9OUkVNT1ZBQkxFKQorCQlob3N0LT5jYXJkX3ByZXNlbnQgPSB0cnVlOworfQorCitzdGF0aWMgdTMyIF9nYl9zZGlvX2dldF9ob3N0X29jcih1MzIgb2NyKQoreworCXJldHVybiAoKChvY3IgJiBHQl9TRElPX1ZERF8xNjVfMTk1KSA/IE1NQ19WRERfMTY1XzE5NSA6IDApIHwKKwkJKChvY3IgJiBHQl9TRElPX1ZERF8yMF8yMSkgPyBNTUNfVkREXzIwXzIxIDogMCkgfAorCQkoKG9jciAmIEdCX1NESU9fVkREXzIxXzIyKSA/IE1NQ19WRERfMjFfMjIgOiAwKSB8CisJCSgob2NyICYgR0JfU0RJT19WRERfMjJfMjMpID8gTU1DX1ZERF8yMl8yMyA6IDApIHwKKwkJKChvY3IgJiBHQl9TRElPX1ZERF8yM18yNCkgPyBNTUNfVkREXzIzXzI0IDogMCkgfAorCQkoKG9jciAmIEdCX1NESU9fVkREXzI0XzI1KSA/IE1NQ19WRERfMjRfMjUgOiAwKSB8CisJCSgob2NyICYgR0JfU0RJT19WRERfMjVfMjYpID8gTU1DX1ZERF8yNV8yNiA6IDApIHwKKwkJKChvY3IgJiBHQl9TRElPX1ZERF8yNl8yNykgPyBNTUNfVkREXzI2XzI3IDogMCkgfAorCQkoKG9jciAmIEdCX1NESU9fVkREXzI3XzI4KSA/IE1NQ19WRERfMjdfMjggOiAwKSB8CisJCSgob2NyICYgR0JfU0RJT19WRERfMjhfMjkpID8gTU1DX1ZERF8yOF8yOSA6IDApIHwKKwkJKChvY3IgJiBHQl9TRElPX1ZERF8yOV8zMCkgPyBNTUNfVkREXzI5XzMwIDogMCkgfAorCQkoKG9jciAmIEdCX1NESU9fVkREXzMwXzMxKSA/IE1NQ19WRERfMzBfMzEgOiAwKSB8CisJCSgob2NyICYgR0JfU0RJT19WRERfMzFfMzIpID8gTU1DX1ZERF8zMV8zMiA6IDApIHwKKwkJKChvY3IgJiBHQl9TRElPX1ZERF8zMl8zMykgPyBNTUNfVkREXzMyXzMzIDogMCkgfAorCQkoKG9jciAmIEdCX1NESU9fVkREXzMzXzM0KSA/IE1NQ19WRERfMzNfMzQgOiAwKSB8CisJCSgob2NyICYgR0JfU0RJT19WRERfMzRfMzUpID8gTU1DX1ZERF8zNF8zNSA6IDApIHwKKwkJKChvY3IgJiBHQl9TRElPX1ZERF8zNV8zNikgPyBNTUNfVkREXzM1XzM2IDogMCkKKwkJKTsKK30KKworc3RhdGljIGludCBnYl9zZGlvX2dldF9jYXBzKHN0cnVjdCBnYl9zZGlvX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGdiX3NkaW9fZ2V0X2NhcHNfcmVzcG9uc2UgcmVzcG9uc2U7CisJc3RydWN0IG1tY19ob3N0ICptbWMgPSBob3N0LT5tbWM7CisJdTE2IGRhdGFfbWF4OworCXUzMiBibGtzejsKKwl1MzIgb2NyOworCXUzMiByOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhob3N0LT5jb25uZWN0aW9uLCBHQl9TRElPX1RZUEVfR0VUX0NBUEFCSUxJVElFUywKKwkJCQlOVUxMLCAwLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXIgPSBsZTMyX3RvX2NwdShyZXNwb25zZS5jYXBzKTsKKworCV9nYl9zZGlvX3NldF9ob3N0X2NhcHMoaG9zdCwgcik7CisKKwkvKiBnZXQgdGhlIG1heCBibG9jayBzaXplIHRoYXQgY291bGQgZml0IG91ciBwYXlsb2FkICovCisJZGF0YV9tYXggPSBnYl9vcGVyYXRpb25fZ2V0X3BheWxvYWRfc2l6ZV9tYXgoaG9zdC0+Y29ubmVjdGlvbik7CisJZGF0YV9tYXggPSBtaW4oZGF0YV9tYXggLSBzaXplb2Yoc3RydWN0IGdiX3NkaW9fdHJhbnNmZXJfcmVxdWVzdCksCisJCSAgICAgICBkYXRhX21heCAtIHNpemVvZihzdHJ1Y3QgZ2Jfc2Rpb190cmFuc2Zlcl9yZXNwb25zZSkpOworCisJYmxrc3ogPSBtaW5fdCh1MTYsIGxlMTZfdG9fY3B1KHJlc3BvbnNlLm1heF9ibGtfc2l6ZSksIGRhdGFfbWF4KTsKKwlibGtzeiA9IG1heF90KHUzMiwgNTEyLCBibGtzeik7CisKKwltbWMtPm1heF9ibGtfc2l6ZSA9IHJvdW5kZG93bl9wb3dfb2ZfdHdvKGJsa3N6KTsKKwltbWMtPm1heF9ibGtfY291bnQgPSBsZTE2X3RvX2NwdShyZXNwb25zZS5tYXhfYmxrX2NvdW50KTsKKwlob3N0LT5kYXRhX21heCA9IGRhdGFfbWF4OworCisJLyogZ2V0IG9jciBzdXBwb3J0ZWQgdmFsdWVzICovCisJb2NyID0gX2diX3NkaW9fZ2V0X2hvc3Rfb2NyKGxlMzJfdG9fY3B1KHJlc3BvbnNlLm9jcikpOworCW1tYy0+b2NyX2F2YWlsID0gb2NyOworCW1tYy0+b2NyX2F2YWlsX3NkaW8gPSBtbWMtPm9jcl9hdmFpbDsKKwltbWMtPm9jcl9hdmFpbF9zZCA9IG1tYy0+b2NyX2F2YWlsOworCW1tYy0+b2NyX2F2YWlsX21tYyA9IG1tYy0+b2NyX2F2YWlsOworCisJLyogZ2V0IGZyZXF1ZW5jeSByYW5nZSB2YWx1ZXMgKi8KKwltbWMtPmZfbWluID0gbGUzMl90b19jcHUocmVzcG9uc2UuZl9taW4pOworCW1tYy0+Zl9tYXggPSBsZTMyX3RvX2NwdShyZXNwb25zZS5mX21heCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX2diX3F1ZXVlX2V2ZW50KHN0cnVjdCBnYl9zZGlvX2hvc3QgKmhvc3QsIHU4IGV2ZW50KQoreworCWlmIChldmVudCAmIEdCX1NESU9fQ0FSRF9JTlNFUlRFRCkKKwkJaG9zdC0+cXVldWVkX2V2ZW50cyAmPSB+R0JfU0RJT19DQVJEX1JFTU9WRUQ7CisJZWxzZSBpZiAoZXZlbnQgJiBHQl9TRElPX0NBUkRfUkVNT1ZFRCkKKwkJaG9zdC0+cXVldWVkX2V2ZW50cyAmPSB+R0JfU0RJT19DQVJEX0lOU0VSVEVEOworCisJaG9zdC0+cXVldWVkX2V2ZW50cyB8PSBldmVudDsKK30KKworc3RhdGljIGludCBfZ2Jfc2Rpb19wcm9jZXNzX2V2ZW50cyhzdHJ1Y3QgZ2Jfc2Rpb19ob3N0ICpob3N0LCB1OCBldmVudCkKK3sKKwl1OCBzdGF0ZV9jaGFuZ2VkID0gMDsKKworCWlmIChldmVudCAmIEdCX1NESU9fQ0FSRF9JTlNFUlRFRCkgeworCQlpZiAoaG9zdC0+bW1jLT5jYXBzICYgTU1DX0NBUF9OT05SRU1PVkFCTEUpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGhvc3QtPmNhcmRfcHJlc2VudCkKKwkJCXJldHVybiAwOworCQlob3N0LT5jYXJkX3ByZXNlbnQgPSB0cnVlOworCQlzdGF0ZV9jaGFuZ2VkID0gMTsKKwl9CisKKwlpZiAoZXZlbnQgJiBHQl9TRElPX0NBUkRfUkVNT1ZFRCkgeworCQlpZiAoaG9zdC0+bW1jLT5jYXBzICYgTU1DX0NBUF9OT05SRU1PVkFCTEUpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCEoaG9zdC0+Y2FyZF9wcmVzZW50KSkKKwkJCXJldHVybiAwOworCQlob3N0LT5jYXJkX3ByZXNlbnQgPSBmYWxzZTsKKwkJc3RhdGVfY2hhbmdlZCA9IDE7CisJfQorCisJaWYgKGV2ZW50ICYgR0JfU0RJT19XUCkgeworCQlob3N0LT5yZWFkX29ubHkgPSB0cnVlOworCX0KKworCWlmIChzdGF0ZV9jaGFuZ2VkKSB7CisJCWRldl9pbmZvKG1tY19kZXYoaG9zdC0+bW1jKSwgImNhcmQgJXMgbm93IGV2ZW50XG4iLAorCQkJIChob3N0LT5jYXJkX3ByZXNlbnQgPyAgImluc2VydGVkIiA6ICJyZW1vdmVkIikpOworCQltbWNfZGV0ZWN0X2NoYW5nZShob3N0LT5tbWMsIDApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX3NkaW9fcmVxdWVzdF9oYW5kbGVyKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wKQoreworCXN0cnVjdCBnYl9zZGlvX2hvc3QgKmhvc3QgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKG9wLT5jb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2JfbWVzc2FnZSAqcmVxdWVzdDsKKwlzdHJ1Y3QgZ2Jfc2Rpb19ldmVudF9yZXF1ZXN0ICpwYXlsb2FkOworCXU4IHR5cGUgPSBvcC0+dHlwZTsKKwlpbnQgcmV0ID0gIDA7CisJdTggZXZlbnQ7CisKKwlpZiAodHlwZSAhPSBHQl9TRElPX1RZUEVfRVZFTlQpIHsKKwkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksCisJCQkidW5zdXBwb3J0ZWQgdW5zb2xpY2l0ZWQgZXZlbnQ6ICV1XG4iLCB0eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVxdWVzdCA9IG9wLT5yZXF1ZXN0OworCisJaWYgKHJlcXVlc3QtPnBheWxvYWRfc2l6ZSA8IHNpemVvZigqcGF5bG9hZCkpIHsKKwkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksICJ3cm9uZyBldmVudCBzaXplIHJlY2VpdmVkICglenUgPCAlenUpXG4iLAorCQkJcmVxdWVzdC0+cGF5bG9hZF9zaXplLCBzaXplb2YoKnBheWxvYWQpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGF5bG9hZCA9IHJlcXVlc3QtPnBheWxvYWQ7CisJZXZlbnQgPSBwYXlsb2FkLT5ldmVudDsKKworCWlmIChob3N0LT5yZW1vdmVkKQorCQlfZ2JfcXVldWVfZXZlbnQoaG9zdCwgZXZlbnQpOworCWVsc2UKKwkJcmV0ID0gX2diX3NkaW9fcHJvY2Vzc19ldmVudHMoaG9zdCwgZXZlbnQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9zZGlvX3NldF9pb3Moc3RydWN0IGdiX3NkaW9faG9zdCAqaG9zdCwKKwkJCSAgIHN0cnVjdCBnYl9zZGlvX3NldF9pb3NfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JwaHlfcnVudGltZV9nZXRfc3luYyhob3N0LT5nYnBoeV9kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhob3N0LT5jb25uZWN0aW9uLCBHQl9TRElPX1RZUEVfU0VUX0lPUywgcmVxdWVzdCwKKwkJCQlzaXplb2YoKnJlcXVlc3QpLCBOVUxMLCAwKTsKKworCWdicGh5X3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGhvc3QtPmdicGh5X2Rldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9nYl9zZGlvX3NlbmQoc3RydWN0IGdiX3NkaW9faG9zdCAqaG9zdCwgc3RydWN0IG1tY19kYXRhICpkYXRhLAorCQkJIHNpemVfdCBsZW4sIHUxNiBuYmxvY2tzLCBvZmZfdCBza2lwKQoreworCXN0cnVjdCBnYl9zZGlvX3RyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdiX3NkaW9fdHJhbnNmZXJfcmVzcG9uc2UgKnJlc3BvbnNlOworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gZGF0YS0+c2c7CisJdW5zaWduZWQgaW50IHNnX2xlbiA9IGRhdGEtPnNnX2xlbjsKKwlzaXplX3QgY29waWVkOworCXUxNiBzZW5kX2Jsa3N6OworCXUxNiBzZW5kX2Jsb2NrczsKKwlpbnQgcmV0OworCisJV0FSTl9PTihsZW4gPiBob3N0LT5kYXRhX21heCk7CisKKwlvcGVyYXRpb24gPSBnYl9vcGVyYXRpb25fY3JlYXRlKGhvc3QtPmNvbm5lY3Rpb24sIEdCX1NESU9fVFlQRV9UUkFOU0ZFUiwKKwkJCQkJbGVuICsgc2l6ZW9mKCpyZXF1ZXN0KSwKKwkJCQkJc2l6ZW9mKCpyZXNwb25zZSksIEdGUF9LRVJORUwpOworCWlmICghb3BlcmF0aW9uKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcXVlc3QgPSBvcGVyYXRpb24tPnJlcXVlc3QtPnBheWxvYWQ7CisJcmVxdWVzdC0+ZGF0YV9mbGFncyA9IChkYXRhLT5mbGFncyA+PiA4KTsKKwlyZXF1ZXN0LT5kYXRhX2Jsb2NrcyA9IGNwdV90b19sZTE2KG5ibG9ja3MpOworCXJlcXVlc3QtPmRhdGFfYmxrc3ogPSBjcHVfdG9fbGUxNihkYXRhLT5ibGtzeik7CisKKwljb3BpZWQgPSBzZ19wY29weV90b19idWZmZXIoc2csIHNnX2xlbiwgJnJlcXVlc3QtPmRhdGFbMF0sIGxlbiwgc2tpcCk7CisKKwlpZiAoY29waWVkICE9IGxlbikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9wdXRfb3BlcmF0aW9uOworCX0KKworCXJldCA9IGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmRfc3luYyhvcGVyYXRpb24pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9wdXRfb3BlcmF0aW9uOworCisJcmVzcG9uc2UgPSBvcGVyYXRpb24tPnJlc3BvbnNlLT5wYXlsb2FkOworCisJc2VuZF9ibG9ja3MgPSBsZTE2X3RvX2NwdShyZXNwb25zZS0+ZGF0YV9ibG9ja3MpOworCXNlbmRfYmxrc3ogPSBsZTE2X3RvX2NwdShyZXNwb25zZS0+ZGF0YV9ibGtzeik7CisKKwlpZiAobGVuICE9IHNlbmRfYmxrc3ogKiBzZW5kX2Jsb2NrcykgeworCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwgInNlbmQ6IHNpemUgcmVjZWl2ZWQ6ICV6dSAhPSAlZFxuIiwKKwkJCWxlbiwgc2VuZF9ibGtzeiAqIHNlbmRfYmxvY2tzKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKK2Vycl9wdXRfb3BlcmF0aW9uOgorCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX2diX3NkaW9fcmVjdihzdHJ1Y3QgZ2Jfc2Rpb19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEsCisJCQkgc2l6ZV90IGxlbiwgdTE2IG5ibG9ja3MsIG9mZl90IHNraXApCit7CisJc3RydWN0IGdiX3NkaW9fdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdDsKKwlzdHJ1Y3QgZ2Jfc2Rpb190cmFuc2Zlcl9yZXNwb25zZSAqcmVzcG9uc2U7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBkYXRhLT5zZzsKKwl1bnNpZ25lZCBpbnQgc2dfbGVuID0gZGF0YS0+c2dfbGVuOworCXNpemVfdCBjb3BpZWQ7CisJdTE2IHJlY3ZfYmxrc3o7CisJdTE2IHJlY3ZfYmxvY2tzOworCWludCByZXQ7CisKKwlXQVJOX09OKGxlbiA+IGhvc3QtPmRhdGFfbWF4KTsKKworCW9wZXJhdGlvbiA9IGdiX29wZXJhdGlvbl9jcmVhdGUoaG9zdC0+Y29ubmVjdGlvbiwgR0JfU0RJT19UWVBFX1RSQU5TRkVSLAorCQkJCQlzaXplb2YoKnJlcXVlc3QpLAorCQkJCQlsZW4gKyBzaXplb2YoKnJlc3BvbnNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvcGVyYXRpb24pCisJCXJldHVybiAtRU5PTUVNOworCisJcmVxdWVzdCA9IG9wZXJhdGlvbi0+cmVxdWVzdC0+cGF5bG9hZDsKKwlyZXF1ZXN0LT5kYXRhX2ZsYWdzID0gKGRhdGEtPmZsYWdzID4+IDgpOworCXJlcXVlc3QtPmRhdGFfYmxvY2tzID0gY3B1X3RvX2xlMTYobmJsb2Nrcyk7CisJcmVxdWVzdC0+ZGF0YV9ibGtzeiA9IGNwdV90b19sZTE2KGRhdGEtPmJsa3N6KTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmRfc3luYyhvcGVyYXRpb24pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9wdXRfb3BlcmF0aW9uOworCisJcmVzcG9uc2UgPSBvcGVyYXRpb24tPnJlc3BvbnNlLT5wYXlsb2FkOworCXJlY3ZfYmxvY2tzID0gbGUxNl90b19jcHUocmVzcG9uc2UtPmRhdGFfYmxvY2tzKTsKKwlyZWN2X2Jsa3N6ID0gbGUxNl90b19jcHUocmVzcG9uc2UtPmRhdGFfYmxrc3opOworCisJaWYgKGxlbiAhPSByZWN2X2Jsa3N6ICogcmVjdl9ibG9ja3MpIHsKKwkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksICJyZWN2OiBzaXplIHJlY2VpdmVkOiAlZCAhPSAlenVcbiIsCisJCQlyZWN2X2Jsa3N6ICogcmVjdl9ibG9ja3MsIGxlbik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3B1dF9vcGVyYXRpb247CisJfQorCisJY29waWVkID0gc2dfcGNvcHlfZnJvbV9idWZmZXIoc2csIHNnX2xlbiwgJnJlc3BvbnNlLT5kYXRhWzBdLCBsZW4sCisJCQkJICAgICAgc2tpcCk7CisJaWYgKGNvcGllZCAhPSBsZW4pCisJCXJldCA9IC1FSU5WQUw7CisKK2Vycl9wdXRfb3BlcmF0aW9uOgorCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2Jfc2Rpb190cmFuc2ZlcihzdHJ1Y3QgZ2Jfc2Rpb19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpCit7CisJc2l6ZV90IGxlZnQsIGxlbjsKKwlvZmZfdCBza2lwID0gMDsKKwlpbnQgcmV0ID0gMDsKKwl1MTYgbmJsb2NrczsKKworCWlmIChzaW5nbGVfb3AoZGF0YS0+bXJxLT5jbWQpICYmIGRhdGEtPmJsb2NrcyA+IDEpIHsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBvdXQ7CisJfQorCisJbGVmdCA9IGRhdGEtPmJsa3N6ICogZGF0YS0+YmxvY2tzOworCisJd2hpbGUgKGxlZnQpIHsKKwkJLyogY2hlY2sgaXMgYSBzdG9wIHRyYW5zbWlzc2lvbiBpcyBwZW5kaW5nICovCisJCXNwaW5fbG9jaygmaG9zdC0+eGZlcik7CisJCWlmIChob3N0LT54ZmVyX3N0b3ApIHsKKwkJCWhvc3QtPnhmZXJfc3RvcCA9IGZhbHNlOworCQkJc3Bpbl91bmxvY2soJmhvc3QtPnhmZXIpOworCQkJcmV0ID0gLUVJTlRSOworCQkJZ290byBvdXQ7CisJCX0KKwkJc3Bpbl91bmxvY2soJmhvc3QtPnhmZXIpOworCQlsZW4gPSBtaW4obGVmdCwgaG9zdC0+ZGF0YV9tYXgpOworCQluYmxvY2tzID0gbGVuIC8gZGF0YS0+Ymxrc3o7CisJCWxlbiA9IG5ibG9ja3MgKiBkYXRhLT5ibGtzejsKKworCQlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFEKSB7CisJCQlyZXQgPSBfZ2Jfc2Rpb19yZWN2KGhvc3QsIGRhdGEsIGxlbiwgbmJsb2Nrcywgc2tpcCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IF9nYl9zZGlvX3NlbmQoaG9zdCwgZGF0YSwgbGVuLCBuYmxvY2tzLCBza2lwKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gb3V0OworCQl9CisJCWRhdGEtPmJ5dGVzX3hmZXJlZCArPSBsZW47CisJCWxlZnQgLT0gbGVuOworCQlza2lwICs9IGxlbjsKKwl9CisKK291dDoKKwlkYXRhLT5lcnJvciA9IHJldDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX3NkaW9fY29tbWFuZChzdHJ1Y3QgZ2Jfc2Rpb19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgZ2Jfc2Rpb19jb21tYW5kX3JlcXVlc3QgcmVxdWVzdCA9IHswfTsKKwlzdHJ1Y3QgZ2Jfc2Rpb19jb21tYW5kX3Jlc3BvbnNlIHJlc3BvbnNlOworCXN0cnVjdCBtbWNfZGF0YSAqZGF0YSA9IGhvc3QtPm1ycS0+ZGF0YTsKKwl1OCBjbWRfZmxhZ3M7CisJdTggY21kX3R5cGU7CisJaW50IGk7CisJaW50IHJldDsKKworCXN3aXRjaCAobW1jX3Jlc3BfdHlwZShjbWQpKSB7CisJY2FzZSBNTUNfUlNQX05PTkU6CisJCWNtZF9mbGFncyA9IEdCX1NESU9fUlNQX05PTkU7CisJCWJyZWFrOworCWNhc2UgTU1DX1JTUF9SMToKKwkJY21kX2ZsYWdzID0gR0JfU0RJT19SU1BfUjFfUjVfUjZfUjc7CisJCWJyZWFrOworCWNhc2UgTU1DX1JTUF9SMUI6CisJCWNtZF9mbGFncyA9IEdCX1NESU9fUlNQX1IxQjsKKwkJYnJlYWs7CisJY2FzZSBNTUNfUlNQX1IyOgorCQljbWRfZmxhZ3MgPSBHQl9TRElPX1JTUF9SMjsKKwkJYnJlYWs7CisJY2FzZSBNTUNfUlNQX1IzOgorCQljbWRfZmxhZ3MgPSBHQl9TRElPX1JTUF9SM19SNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksICJjbWQgZmxhZyBpbnZhbGlkIDB4JTA0eFxuIiwKKwkJCW1tY19yZXNwX3R5cGUoY21kKSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAobW1jX2NtZF90eXBlKGNtZCkpIHsKKwljYXNlIE1NQ19DTURfQkM6CisJCWNtZF90eXBlID0gR0JfU0RJT19DTURfQkM7CisJCWJyZWFrOworCWNhc2UgTU1DX0NNRF9CQ1I6CisJCWNtZF90eXBlID0gR0JfU0RJT19DTURfQkNSOworCQlicmVhazsKKwljYXNlIE1NQ19DTURfQUM6CisJCWNtZF90eXBlID0gR0JfU0RJT19DTURfQUM7CisJCWJyZWFrOworCWNhc2UgTU1DX0NNRF9BRFRDOgorCQljbWRfdHlwZSA9IEdCX1NESU9fQ01EX0FEVEM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAiY21kIHR5cGUgaW52YWxpZCAweCUwNHhcbiIsCisJCQltbWNfY21kX3R5cGUoY21kKSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJlcXVlc3QuY21kID0gY21kLT5vcGNvZGU7CisJcmVxdWVzdC5jbWRfZmxhZ3MgPSBjbWRfZmxhZ3M7CisJcmVxdWVzdC5jbWRfdHlwZSA9IGNtZF90eXBlOworCXJlcXVlc3QuY21kX2FyZyA9IGNwdV90b19sZTMyKGNtZC0+YXJnKTsKKwkvKiBzb21lIGNvbnRyb2xsZXJzIG5lZWQgdG8ga25vdyBhdCBjb21tYW5kIHRpbWUgZGF0YSBkZXRhaWxzICovCisJaWYgKGRhdGEpIHsKKwkJcmVxdWVzdC5kYXRhX2Jsb2NrcyA9IGNwdV90b19sZTE2KGRhdGEtPmJsb2Nrcyk7CisJCXJlcXVlc3QuZGF0YV9ibGtzeiA9IGNwdV90b19sZTE2KGRhdGEtPmJsa3N6KTsKKwl9CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhob3N0LT5jb25uZWN0aW9uLCBHQl9TRElPX1RZUEVfQ09NTUFORCwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCAmcmVzcG9uc2UsCisJCQkJc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJLyogbm8gcmVzcG9uc2UgZXhwZWN0ZWQgKi8KKwlpZiAoY21kX2ZsYWdzID09IEdCX1NESU9fUlNQX05PTkUpCisJCWdvdG8gb3V0OworCisJLyogbG9uZyByZXNwb25zZSBleHBlY3RlZCAqLworCWlmIChjbWRfZmxhZ3MgJiBHQl9TRElPX1JTUF9SMikKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWNtZC0+cmVzcFtpXSA9IGxlMzJfdG9fY3B1KHJlc3BvbnNlLnJlc3BbaV0pOworCWVsc2UKKwkJY21kLT5yZXNwWzBdID0gbGUzMl90b19jcHUocmVzcG9uc2UucmVzcFswXSk7CisKK291dDoKKwljbWQtPmVycm9yID0gcmV0OworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3NkaW9fbXJxX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBnYl9zZGlvX2hvc3QgKmhvc3Q7CisJc3RydWN0IG1tY19yZXF1ZXN0ICptcnE7CisJaW50IHJldDsKKworCWhvc3QgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGdiX3NkaW9faG9zdCwgbXJxd29yayk7CisKKwlyZXQgPSBnYnBoeV9ydW50aW1lX2dldF9zeW5jKGhvc3QtPmdicGh5X2Rldik7CisJaWYgKHJldCkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmaG9zdC0+bG9jayk7CisJbXJxID0gaG9zdC0+bXJxOworCWlmICghbXJxKSB7CisJCW11dGV4X3VubG9jaygmaG9zdC0+bG9jayk7CisJCWdicGh5X3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGhvc3QtPmdicGh5X2Rldik7CisJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAibW1jIHJlcXVlc3QgaXMgTlVMTCIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGhvc3QtPnJlbW92ZWQpIHsKKwkJbXJxLT5jbWQtPmVycm9yID0gLUVTSFVURE9XTjsKKwkJZ290byBkb25lOworCX0KKworCWlmIChtcnEtPnNiYykgeworCQlyZXQgPSBnYl9zZGlvX2NvbW1hbmQoaG9zdCwgbXJxLT5zYmMpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSBnYl9zZGlvX2NvbW1hbmQoaG9zdCwgbXJxLT5jbWQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGRvbmU7CisKKwlpZiAobXJxLT5kYXRhKSB7CisJCXJldCA9IGdiX3NkaW9fdHJhbnNmZXIoaG9zdCwgbXJxLT5kYXRhKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKG1ycS0+c3RvcCkgeworCQlyZXQgPSBnYl9zZGlvX2NvbW1hbmQoaG9zdCwgbXJxLT5zdG9wKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGRvbmU7CisJfQorCitkb25lOgorCWhvc3QtPm1ycSA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZob3N0LT5sb2NrKTsKKwltbWNfcmVxdWVzdF9kb25lKGhvc3QtPm1tYywgbXJxKTsKKwlnYnBoeV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChob3N0LT5nYnBoeV9kZXYpOworfQorCitzdGF0aWMgdm9pZCBnYl9tbWNfcmVxdWVzdChzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCit7CisJc3RydWN0IGdiX3NkaW9faG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CisJc3RydWN0IG1tY19jb21tYW5kICpjbWQgPSBtcnEtPmNtZDsKKworCS8qIENoZWNrIGlmIGl0IGlzIGEgY2FuY2VsIHRvIG9uZ29pbmcgdHJhbnNmZXIgKi8KKwlpZiAoY21kLT5vcGNvZGUgPT0gTU1DX1NUT1BfVFJBTlNNSVNTSU9OKSB7CisJCXNwaW5fbG9jaygmaG9zdC0+eGZlcik7CisJCWhvc3QtPnhmZXJfc3RvcCA9IHRydWU7CisJCXNwaW5fdW5sb2NrKCZob3N0LT54ZmVyKTsKKwl9CisKKwltdXRleF9sb2NrKCZob3N0LT5sb2NrKTsKKworCVdBUk5fT04oaG9zdC0+bXJxKTsKKwlob3N0LT5tcnEgPSBtcnE7CisKKwlpZiAoaG9zdC0+cmVtb3ZlZCkgeworCQltcnEtPmNtZC0+ZXJyb3IgPSAtRVNIVVRET1dOOworCQlnb3RvIG91dDsKKwl9CisJaWYgKCFob3N0LT5jYXJkX3ByZXNlbnQpIHsKKwkJbXJxLT5jbWQtPmVycm9yID0gLUVOT01FRElVTTsKKwkJZ290byBvdXQ7CisJfQorCisJcXVldWVfd29yayhob3N0LT5tcnFfd29ya3F1ZXVlLCAmaG9zdC0+bXJxd29yayk7CisKKwltdXRleF91bmxvY2soJmhvc3QtPmxvY2spOworCXJldHVybjsKKworb3V0OgorCWhvc3QtPm1ycSA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZob3N0LT5sb2NrKTsKKwltbWNfcmVxdWVzdF9kb25lKG1tYywgbXJxKTsKK30KKworc3RhdGljIHZvaWQgZ2JfbW1jX3NldF9pb3Moc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfaW9zICppb3MpCit7CisJc3RydWN0IGdiX3NkaW9faG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CisJc3RydWN0IGdiX3NkaW9fc2V0X2lvc19yZXF1ZXN0IHJlcXVlc3Q7CisJaW50IHJldDsKKwl1OCBwb3dlcl9tb2RlOworCXU4IGJ1c193aWR0aDsKKwl1OCB0aW1pbmc7CisJdTggc2lnbmFsX3ZvbHRhZ2U7CisJdTggZHJ2X3R5cGU7CisJdTMyIHZkZCA9IDA7CisKKwltdXRleF9sb2NrKCZob3N0LT5sb2NrKTsKKwlyZXF1ZXN0LmNsb2NrID0gY3B1X3RvX2xlMzIoaW9zLT5jbG9jayk7CisKKwlpZiAoaW9zLT52ZGQpCisJCXZkZCA9IDEgPDwgKGlvcy0+dmRkIC0gR0JfU0RJT19WRERfU0hJRlQpOworCXJlcXVlc3QudmRkID0gY3B1X3RvX2xlMzIodmRkKTsKKworCXJlcXVlc3QuYnVzX21vZGUgPSAoaW9zLT5idXNfbW9kZSA9PSBNTUNfQlVTTU9ERV9PUEVORFJBSU4gPworCQkJICAgIEdCX1NESU9fQlVTTU9ERV9PUEVORFJBSU4gOgorCQkJICAgIEdCX1NESU9fQlVTTU9ERV9QVVNIUFVMTCk7CisKKwlzd2l0Y2ggKGlvcy0+cG93ZXJfbW9kZSkgeworCWNhc2UgTU1DX1BPV0VSX09GRjoKKwlkZWZhdWx0OgorCQlwb3dlcl9tb2RlID0gR0JfU0RJT19QT1dFUl9PRkY7CisJCWJyZWFrOworCWNhc2UgTU1DX1BPV0VSX1VQOgorCQlwb3dlcl9tb2RlID0gR0JfU0RJT19QT1dFUl9VUDsKKwkJYnJlYWs7CisJY2FzZSBNTUNfUE9XRVJfT046CisJCXBvd2VyX21vZGUgPSBHQl9TRElPX1BPV0VSX09OOworCQlicmVhazsKKwljYXNlIE1NQ19QT1dFUl9VTkRFRklORUQ6CisJCXBvd2VyX21vZGUgPSBHQl9TRElPX1BPV0VSX1VOREVGSU5FRDsKKwkJYnJlYWs7CisJfQorCXJlcXVlc3QucG93ZXJfbW9kZSA9IHBvd2VyX21vZGU7CisKKwlzd2l0Y2ggKGlvcy0+YnVzX3dpZHRoKSB7CisJY2FzZSBNTUNfQlVTX1dJRFRIXzE6CisJCWJ1c193aWR0aCA9IEdCX1NESU9fQlVTX1dJRFRIXzE7CisJCWJyZWFrOworCWNhc2UgTU1DX0JVU19XSURUSF80OgorCWRlZmF1bHQ6CisJCWJ1c193aWR0aCA9IEdCX1NESU9fQlVTX1dJRFRIXzQ7CisJCWJyZWFrOworCWNhc2UgTU1DX0JVU19XSURUSF84OgorCQlidXNfd2lkdGggPSBHQl9TRElPX0JVU19XSURUSF84OworCQlicmVhazsKKwl9CisJcmVxdWVzdC5idXNfd2lkdGggPSBidXNfd2lkdGg7CisKKwlzd2l0Y2ggKGlvcy0+dGltaW5nKSB7CisJY2FzZSBNTUNfVElNSU5HX0xFR0FDWToKKwlkZWZhdWx0OgorCQl0aW1pbmcgPSBHQl9TRElPX1RJTUlOR19MRUdBQ1k7CisJCWJyZWFrOworCWNhc2UgTU1DX1RJTUlOR19NTUNfSFM6CisJCXRpbWluZyA9IEdCX1NESU9fVElNSU5HX01NQ19IUzsKKwkJYnJlYWs7CisJY2FzZSBNTUNfVElNSU5HX1NEX0hTOgorCQl0aW1pbmcgPSBHQl9TRElPX1RJTUlOR19TRF9IUzsKKwkJYnJlYWs7CisJY2FzZSBNTUNfVElNSU5HX1VIU19TRFIxMjoKKwkJdGltaW5nID0gR0JfU0RJT19USU1JTkdfVUhTX1NEUjEyOworCQlicmVhazsKKwljYXNlIE1NQ19USU1JTkdfVUhTX1NEUjI1OgorCQl0aW1pbmcgPSBHQl9TRElPX1RJTUlOR19VSFNfU0RSMjU7CisJCWJyZWFrOworCWNhc2UgTU1DX1RJTUlOR19VSFNfU0RSNTA6CisJCXRpbWluZyA9IEdCX1NESU9fVElNSU5HX1VIU19TRFI1MDsKKwkJYnJlYWs7CisJY2FzZSBNTUNfVElNSU5HX1VIU19TRFIxMDQ6CisJCXRpbWluZyA9IEdCX1NESU9fVElNSU5HX1VIU19TRFIxMDQ7CisJCWJyZWFrOworCWNhc2UgTU1DX1RJTUlOR19VSFNfRERSNTA6CisJCXRpbWluZyA9IEdCX1NESU9fVElNSU5HX1VIU19ERFI1MDsKKwkJYnJlYWs7CisJY2FzZSBNTUNfVElNSU5HX01NQ19ERFI1MjoKKwkJdGltaW5nID0gR0JfU0RJT19USU1JTkdfTU1DX0REUjUyOworCQlicmVhazsKKwljYXNlIE1NQ19USU1JTkdfTU1DX0hTMjAwOgorCQl0aW1pbmcgPSBHQl9TRElPX1RJTUlOR19NTUNfSFMyMDA7CisJCWJyZWFrOworCWNhc2UgTU1DX1RJTUlOR19NTUNfSFM0MDA6CisJCXRpbWluZyA9IEdCX1NESU9fVElNSU5HX01NQ19IUzQwMDsKKwkJYnJlYWs7CisJfQorCXJlcXVlc3QudGltaW5nID0gdGltaW5nOworCisJc3dpdGNoIChpb3MtPnNpZ25hbF92b2x0YWdlKSB7CisJY2FzZSBNTUNfU0lHTkFMX1ZPTFRBR0VfMzMwOgorCQlzaWduYWxfdm9sdGFnZSA9IEdCX1NESU9fU0lHTkFMX1ZPTFRBR0VfMzMwOworCQlicmVhazsKKwljYXNlIE1NQ19TSUdOQUxfVk9MVEFHRV8xODA6CisJZGVmYXVsdDoKKwkJc2lnbmFsX3ZvbHRhZ2UgPSBHQl9TRElPX1NJR05BTF9WT0xUQUdFXzE4MDsKKwkJYnJlYWs7CisJY2FzZSBNTUNfU0lHTkFMX1ZPTFRBR0VfMTIwOgorCQlzaWduYWxfdm9sdGFnZSA9IEdCX1NESU9fU0lHTkFMX1ZPTFRBR0VfMTIwOworCQlicmVhazsKKwl9CisJcmVxdWVzdC5zaWduYWxfdm9sdGFnZSA9IHNpZ25hbF92b2x0YWdlOworCisJc3dpdGNoIChpb3MtPmRydl90eXBlKSB7CisJY2FzZSBNTUNfU0VUX0RSSVZFUl9UWVBFX0E6CisJCWRydl90eXBlID0gR0JfU0RJT19TRVRfRFJJVkVSX1RZUEVfQTsKKwkJYnJlYWs7CisJY2FzZSBNTUNfU0VUX0RSSVZFUl9UWVBFX0M6CisJCWRydl90eXBlID0gR0JfU0RJT19TRVRfRFJJVkVSX1RZUEVfQzsKKwkJYnJlYWs7CisJY2FzZSBNTUNfU0VUX0RSSVZFUl9UWVBFX0Q6CisJCWRydl90eXBlID0gR0JfU0RJT19TRVRfRFJJVkVSX1RZUEVfRDsKKwkJYnJlYWs7CisJY2FzZSBNTUNfU0VUX0RSSVZFUl9UWVBFX0I6CisJZGVmYXVsdDoKKwkJZHJ2X3R5cGUgPSBHQl9TRElPX1NFVF9EUklWRVJfVFlQRV9COworCQlicmVhazsKKwl9CisJcmVxdWVzdC5kcnZfdHlwZSA9IGRydl90eXBlOworCisJcmV0ID0gZ2Jfc2Rpb19zZXRfaW9zKGhvc3QsICZyZXF1ZXN0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwltZW1jcHkoJm1tYy0+aW9zLCBpb3MsIHNpemVvZihtbWMtPmlvcykpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZob3N0LT5sb2NrKTsKK30KKworc3RhdGljIGludCBnYl9tbWNfZ2V0X3JvKHN0cnVjdCBtbWNfaG9zdCAqbW1jKQoreworCXN0cnVjdCBnYl9zZGlvX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOworCisJbXV0ZXhfbG9jaygmaG9zdC0+bG9jayk7CisJaWYgKGhvc3QtPnJlbW92ZWQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZob3N0LT5sb2NrKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfQorCW11dGV4X3VubG9jaygmaG9zdC0+bG9jayk7CisKKwlyZXR1cm4gaG9zdC0+cmVhZF9vbmx5OworfQorCitzdGF0aWMgaW50IGdiX21tY19nZXRfY2Qoc3RydWN0IG1tY19ob3N0ICptbWMpCit7CisJc3RydWN0IGdiX3NkaW9faG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CisKKwltdXRleF9sb2NrKCZob3N0LT5sb2NrKTsKKwlpZiAoaG9zdC0+cmVtb3ZlZCkgeworCQltdXRleF91bmxvY2soJmhvc3QtPmxvY2spOworCQlyZXR1cm4gLUVTSFVURE9XTjsKKwl9CisJbXV0ZXhfdW5sb2NrKCZob3N0LT5sb2NrKTsKKworCXJldHVybiBob3N0LT5jYXJkX3ByZXNlbnQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbW1jX3N3aXRjaF92b2x0YWdlKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX2lvcyAqaW9zKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1tY19ob3N0X29wcyBnYl9zZGlvX29wcyA9IHsKKwkucmVxdWVzdAk9IGdiX21tY19yZXF1ZXN0LAorCS5zZXRfaW9zCT0gZ2JfbW1jX3NldF9pb3MsCisJLmdldF9ybwkJPSBnYl9tbWNfZ2V0X3JvLAorCS5nZXRfY2QJCT0gZ2JfbW1jX2dldF9jZCwKKwkuc3RhcnRfc2lnbmFsX3ZvbHRhZ2Vfc3dpdGNoCT0gZ2JfbW1jX3N3aXRjaF92b2x0YWdlLAorfTsKKworc3RhdGljIGludCBnYl9zZGlvX3Byb2JlKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldiwKKwkJCSBjb25zdCBzdHJ1Y3QgZ2JwaHlfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgbW1jX2hvc3QgKm1tYzsKKwlzdHJ1Y3QgZ2Jfc2Rpb19ob3N0ICpob3N0OworCWludCByZXQgPSAwOworCisJbW1jID0gbW1jX2FsbG9jX2hvc3Qoc2l6ZW9mKCpob3N0KSwgJmdicGh5X2Rldi0+ZGV2KTsKKwlpZiAoIW1tYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGUoZ2JwaHlfZGV2LT5idW5kbGUsCisJCQkJCSAgbGUxNl90b19jcHUoZ2JwaHlfZGV2LT5jcG9ydF9kZXNjLT5pZCksCisJCQkJCSAgZ2Jfc2Rpb19yZXF1ZXN0X2hhbmRsZXIpOworCWlmIChJU19FUlIoY29ubmVjdGlvbikpIHsKKwkJcmV0ID0gUFRSX0VSUihjb25uZWN0aW9uKTsKKwkJZ290byBleGl0X21tY19mcmVlOworCX0KKworCWhvc3QgPSBtbWNfcHJpdihtbWMpOworCWhvc3QtPm1tYyA9IG1tYzsKKwlob3N0LT5yZW1vdmVkID0gdHJ1ZTsKKworCWhvc3QtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCWdiX2Nvbm5lY3Rpb25fc2V0X2RhdGEoY29ubmVjdGlvbiwgaG9zdCk7CisJaG9zdC0+Z2JwaHlfZGV2ID0gZ2JwaHlfZGV2OworCWdiX2dicGh5X3NldF9kYXRhKGdicGh5X2RldiwgaG9zdCk7CisKKwlyZXQgPSBnYl9jb25uZWN0aW9uX2VuYWJsZV90eChjb25uZWN0aW9uKTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXRfY29ubmVjdGlvbl9kZXN0cm95OworCisJcmV0ID0gZ2Jfc2Rpb19nZXRfY2Fwcyhob3N0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBleGl0X2Nvbm5lY3Rpb25fZGlzYWJsZTsKKworCW1tYy0+b3BzID0gJmdiX3NkaW9fb3BzOworCisJbW1jLT5tYXhfc2VncyA9IGhvc3QtPm1tYy0+bWF4X2Jsa19jb3VudDsKKworCS8qIGZvciBub3cgd2UgbWFrZSBhIG1hcCAxOjEgYmV0d2VlbiBtYXggcmVxdWVzdCBhbmQgc2VnbWVudCBzaXplICovCisJbW1jLT5tYXhfcmVxX3NpemUgPSBtbWMtPm1heF9ibGtfc2l6ZSAqIG1tYy0+bWF4X2Jsa19jb3VudDsKKwltbWMtPm1heF9zZWdfc2l6ZSA9IG1tYy0+bWF4X3JlcV9zaXplOworCisJbXV0ZXhfaW5pdCgmaG9zdC0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmhvc3QtPnhmZXIpOworCWhvc3QtPm1ycV93b3JrcXVldWUgPSBhbGxvY193b3JrcXVldWUoIm1tYy0lcyIsIDAsIDEsCisJCQkJCSAgICAgIGRldl9uYW1lKCZnYnBoeV9kZXYtPmRldikpOworCWlmICghaG9zdC0+bXJxX3dvcmtxdWV1ZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfY29ubmVjdGlvbl9kaXNhYmxlOworCX0KKwlJTklUX1dPUksoJmhvc3QtPm1ycXdvcmssIGdiX3NkaW9fbXJxX3dvcmspOworCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbik7CisJaWYgKHJldCkKKwkJZ290byBleGl0X3dxX2Rlc3Ryb3k7CisKKwlyZXQgPSBtbWNfYWRkX2hvc3QobW1jKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBleGl0X3dxX2Rlc3Ryb3k7CisJaG9zdC0+cmVtb3ZlZCA9IGZhbHNlOworCXJldCA9IF9nYl9zZGlvX3Byb2Nlc3NfZXZlbnRzKGhvc3QsIGhvc3QtPnF1ZXVlZF9ldmVudHMpOworCWhvc3QtPnF1ZXVlZF9ldmVudHMgPSAwOworCisJZ2JwaHlfcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ2JwaHlfZGV2KTsKKworCXJldHVybiByZXQ7CisKK2V4aXRfd3FfZGVzdHJveToKKwlkZXN0cm95X3dvcmtxdWV1ZShob3N0LT5tcnFfd29ya3F1ZXVlKTsKK2V4aXRfY29ubmVjdGlvbl9kaXNhYmxlOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKK2V4aXRfY29ubmVjdGlvbl9kZXN0cm95OgorCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKK2V4aXRfbW1jX2ZyZWU6CisJbW1jX2ZyZWVfaG9zdChtbWMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ2Jfc2Rpb19yZW1vdmUoc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2KQoreworCXN0cnVjdCBnYl9zZGlvX2hvc3QgKmhvc3QgPSBnYl9nYnBoeV9nZXRfZGF0YShnYnBoeV9kZXYpOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gaG9zdC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgbW1jX2hvc3QgKm1tYzsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JwaHlfcnVudGltZV9nZXRfc3luYyhnYnBoeV9kZXYpOworCWlmIChyZXQpCisJCWdicGh5X3J1bnRpbWVfZ2V0X25vcmVzdW1lKGdicGh5X2Rldik7CisKKwltdXRleF9sb2NrKCZob3N0LT5sb2NrKTsKKwlob3N0LT5yZW1vdmVkID0gdHJ1ZTsKKwltbWMgPSBob3N0LT5tbWM7CisJZ2JfY29ubmVjdGlvbl9zZXRfZGF0YShjb25uZWN0aW9uLCBOVUxMKTsKKwltdXRleF91bmxvY2soJmhvc3QtPmxvY2spOworCisJZmx1c2hfd29ya3F1ZXVlKGhvc3QtPm1ycV93b3JrcXVldWUpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGhvc3QtPm1ycV93b3JrcXVldWUpOworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZV9yeChjb25uZWN0aW9uKTsKKwltbWNfcmVtb3ZlX2hvc3QobW1jKTsKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGNvbm5lY3Rpb24pOworCW1tY19mcmVlX2hvc3QobW1jKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBnYnBoeV9kZXZpY2VfaWQgZ2Jfc2Rpb19pZF90YWJsZVtdID0geworCXsgR0JQSFlfUFJPVE9DT0woR1JFWUJVU19QUk9UT0NPTF9TRElPKSB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGdicGh5LCBnYl9zZGlvX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBnYnBoeV9kcml2ZXIgc2Rpb19kcml2ZXIgPSB7CisJLm5hbWUJCT0gInNkaW8iLAorCS5wcm9iZQkJPSBnYl9zZGlvX3Byb2JlLAorCS5yZW1vdmUJCT0gZ2Jfc2Rpb19yZW1vdmUsCisJLmlkX3RhYmxlCT0gZ2Jfc2Rpb19pZF90YWJsZSwKK307CisKK21vZHVsZV9nYnBoeV9kcml2ZXIoc2Rpb19kcml2ZXIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3BpLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODkzNTUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3BpLmMKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIFNQSSBicmlkZ2UgUEhZIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE2IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE2IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImdicGh5LmgiCisjaW5jbHVkZSAic3BpbGliLmgiCisKK3N0YXRpYyBzdHJ1Y3Qgc3BpbGliX29wcyAqc3BpbGliX29wczsKKworc3RhdGljIGludCBnYl9zcGlfcHJvYmUoc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2LAorCQkJY29uc3Qgc3RydWN0IGdicGh5X2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJaW50IHJldDsKKworCWNvbm5lY3Rpb24gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZShnYnBoeV9kZXYtPmJ1bmRsZSwKKwkJCQkJICBsZTE2X3RvX2NwdShnYnBoeV9kZXYtPmNwb3J0X2Rlc2MtPmlkKSwKKwkJCQkJICBOVUxMKTsKKwlpZiAoSVNfRVJSKGNvbm5lY3Rpb24pKQorCQlyZXR1cm4gUFRSX0VSUihjb25uZWN0aW9uKTsKKworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm5lY3Rpb24pOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9jb25uZWN0aW9uX2Rlc3Ryb3k7CisKKwlyZXQgPSBnYl9zcGlsaWJfbWFzdGVyX2luaXQoY29ubmVjdGlvbiwgJmdicGh5X2Rldi0+ZGV2LCBzcGlsaWJfb3BzKTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXRfY29ubmVjdGlvbl9kaXNhYmxlOworCisJZ2JfZ2JwaHlfc2V0X2RhdGEoZ2JwaHlfZGV2LCBjb25uZWN0aW9uKTsKKworCWdicGh5X3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdicGh5X2Rldik7CisJcmV0dXJuIDA7CisKK2V4aXRfY29ubmVjdGlvbl9kaXNhYmxlOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKK2V4aXRfY29ubmVjdGlvbl9kZXN0cm95OgorCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3NwaV9yZW1vdmUoc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2KQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2JfZ2JwaHlfZ2V0X2RhdGEoZ2JwaHlfZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JwaHlfcnVudGltZV9nZXRfc3luYyhnYnBoeV9kZXYpOworCWlmIChyZXQpCisJCWdicGh5X3J1bnRpbWVfZ2V0X25vcmVzdW1lKGdicGh5X2Rldik7CisKKwlnYl9zcGlsaWJfbWFzdGVyX2V4aXQoY29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBnYnBoeV9kZXZpY2VfaWQgZ2Jfc3BpX2lkX3RhYmxlW10gPSB7CisJeyBHQlBIWV9QUk9UT0NPTChHUkVZQlVTX1BST1RPQ09MX1NQSSkgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShnYnBoeSwgZ2Jfc3BpX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBnYnBoeV9kcml2ZXIgc3BpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAic3BpIiwKKwkucHJvYmUJCT0gZ2Jfc3BpX3Byb2JlLAorCS5yZW1vdmUJCT0gZ2Jfc3BpX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBnYl9zcGlfaWRfdGFibGUsCit9OworCittb2R1bGVfZ2JwaHlfZHJpdmVyKHNwaV9kcml2ZXIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3BpbGliLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zcGlsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTdiMTkxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3BpbGliLmMKQEAgLTAsMCArMSw1NjUgQEAKKy8qCisgKiBHcmV5YnVzIFNQSSBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgInNwaWxpYi5oIgorCitzdHJ1Y3QgZ2Jfc3BpbGliIHsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbgkqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZGV2aWNlCQkqcGFyZW50OworCXN0cnVjdCBzcGlfdHJhbnNmZXIJKmZpcnN0X3hmZXI7CisJc3RydWN0IHNwaV90cmFuc2ZlcgkqbGFzdF94ZmVyOworCXN0cnVjdCBzcGlsaWJfb3BzCSpvcHM7CisJdTMyCQkJcnhfeGZlcl9vZmZzZXQ7CisJdTMyCQkJdHhfeGZlcl9vZmZzZXQ7CisJdTMyCQkJbGFzdF94ZmVyX3NpemU7CisJdW5zaWduZWQgaW50CQlvcF90aW1lb3V0OworCXUxNgkJCW1vZGU7CisJdTE2CQkJZmxhZ3M7CisJdTMyCQkJYml0c19wZXJfd29yZF9tYXNrOworCXU4CQkJbnVtX2NoaXBzZWxlY3Q7CisJdTMyCQkJbWluX3NwZWVkX2h6OworCXUzMgkJCW1heF9zcGVlZF9oejsKK307CisKKyNkZWZpbmUgR0JfU1BJX1NUQVRFX01TR19ET05FCQkoKHZvaWQgKikwKQorI2RlZmluZSBHQl9TUElfU1RBVEVfTVNHX0lETEUJCSgodm9pZCAqKTEpCisjZGVmaW5lIEdCX1NQSV9TVEFURV9NU0dfUlVOTklORwkoKHZvaWQgKikyKQorI2RlZmluZSBHQl9TUElfU1RBVEVfT1BfUkVBRFkJCSgodm9pZCAqKTMpCisjZGVmaW5lIEdCX1NQSV9TVEFURV9PUF9ET05FCQkoKHZvaWQgKik0KQorI2RlZmluZSBHQl9TUElfU1RBVEVfTVNHX0VSUk9SCQkoKHZvaWQgKiktMSkKKworI2RlZmluZSBYRkVSX1RJTUVPVVRfVE9MRVJBTkNFCQkyMDAKKworc3RhdGljIHN0cnVjdCBzcGlfbWFzdGVyICpnZXRfbWFzdGVyX2Zyb21fc3BpKHN0cnVjdCBnYl9zcGlsaWIgKnNwaSkKK3sKKwlyZXR1cm4gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShzcGktPmNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgaW50IHR4X2hlYWRlcl9maXRfb3BlcmF0aW9uKHUzMiB0eF9zaXplLCB1MzIgY291bnQsIHNpemVfdCBkYXRhX21heCkKK3sKKwlzaXplX3QgaGVhZGVyc19zaXplOworCisJZGF0YV9tYXggLT0gc2l6ZW9mKHN0cnVjdCBnYl9zcGlfdHJhbnNmZXJfcmVxdWVzdCk7CisJaGVhZGVyc19zaXplID0gKGNvdW50ICsgMSkgKiBzaXplb2Yoc3RydWN0IGdiX3NwaV90cmFuc2Zlcik7CisKKwlyZXR1cm4gdHhfc2l6ZSArIGhlYWRlcnNfc2l6ZSA+IGRhdGFfbWF4ID8gMCA6IDE7Cit9CisKK3N0YXRpYyBzaXplX3QgY2FsY19yeF94ZmVyX3NpemUodTMyIHJ4X3NpemUsIHUzMiAqdHhfeGZlcl9zaXplLCB1MzIgbGVuLAorCQkJCXNpemVfdCBkYXRhX21heCkKK3sKKwlzaXplX3QgcnhfeGZlcl9zaXplOworCisJZGF0YV9tYXggLT0gc2l6ZW9mKHN0cnVjdCBnYl9zcGlfdHJhbnNmZXJfcmVzcG9uc2UpOworCisJaWYgKHJ4X3NpemUgKyBsZW4gPiBkYXRhX21heCkKKwkJcnhfeGZlcl9zaXplID0gZGF0YV9tYXggLSByeF9zaXplOworCWVsc2UKKwkJcnhfeGZlcl9zaXplID0gbGVuOworCisJLyogaWYgdGhpcyBpcyBhIHdyaXRlX3JlYWQsIGZvciBzeW1tZXRyeSByZWFkIHRoZSBzYW1lIGFzIHdyaXRlICovCisJaWYgKCp0eF94ZmVyX3NpemUgJiYgcnhfeGZlcl9zaXplID4gKnR4X3hmZXJfc2l6ZSkKKwkJcnhfeGZlcl9zaXplID0gKnR4X3hmZXJfc2l6ZTsKKwlpZiAoKnR4X3hmZXJfc2l6ZSAmJiByeF94ZmVyX3NpemUgPCAqdHhfeGZlcl9zaXplKQorCQkqdHhfeGZlcl9zaXplID0gcnhfeGZlcl9zaXplOworCisJcmV0dXJuIHJ4X3hmZXJfc2l6ZTsKK30KKworc3RhdGljIHNpemVfdCBjYWxjX3R4X3hmZXJfc2l6ZSh1MzIgdHhfc2l6ZSwgdTMyIGNvdW50LCBzaXplX3QgbGVuLAorCQkJCXNpemVfdCBkYXRhX21heCkKK3sKKwlzaXplX3QgaGVhZGVyc19zaXplOworCisJZGF0YV9tYXggLT0gc2l6ZW9mKHN0cnVjdCBnYl9zcGlfdHJhbnNmZXJfcmVxdWVzdCk7CisJaGVhZGVyc19zaXplID0gKGNvdW50ICsgMSkgKiBzaXplb2Yoc3RydWN0IGdiX3NwaV90cmFuc2Zlcik7CisKKwlpZiAodHhfc2l6ZSArIGhlYWRlcnNfc2l6ZSArIGxlbiA+IGRhdGFfbWF4KQorCQlyZXR1cm4gZGF0YV9tYXggLSAodHhfc2l6ZSArIHNpemVvZihzdHJ1Y3QgZ2Jfc3BpX3RyYW5zZmVyKSk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdm9pZCBjbGVhbl94ZmVyX3N0YXRlKHN0cnVjdCBnYl9zcGlsaWIgKnNwaSkKK3sKKwlzcGktPmZpcnN0X3hmZXIgPSBOVUxMOworCXNwaS0+bGFzdF94ZmVyID0gTlVMTDsKKwlzcGktPnJ4X3hmZXJfb2Zmc2V0ID0gMDsKKwlzcGktPnR4X3hmZXJfb2Zmc2V0ID0gMDsKKwlzcGktPmxhc3RfeGZlcl9zaXplID0gMDsKKwlzcGktPm9wX3RpbWVvdXQgPSAwOworfQorCitzdGF0aWMgYm9vbCBpc19sYXN0X3hmZXJfZG9uZShzdHJ1Y3QgZ2Jfc3BpbGliICpzcGkpCit7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqbGFzdF94ZmVyID0gc3BpLT5sYXN0X3hmZXI7CisKKwlpZiAoKHNwaS0+dHhfeGZlcl9vZmZzZXQgKyBzcGktPmxhc3RfeGZlcl9zaXplID09IGxhc3RfeGZlci0+bGVuKSB8fAorCSAgICAoc3BpLT5yeF94ZmVyX29mZnNldCArIHNwaS0+bGFzdF94ZmVyX3NpemUgPT0gbGFzdF94ZmVyLT5sZW4pKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCBzZXR1cF9uZXh0X3hmZXIoc3RydWN0IGdiX3NwaWxpYiAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICpsYXN0X3hmZXIgPSBzcGktPmxhc3RfeGZlcjsKKworCWlmIChtc2ctPnN0YXRlICE9IEdCX1NQSV9TVEFURV9PUF9ET05FKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogaWYgd2UgdHJhbnNmZXJyZWQgYWxsIGNvbnRlbnQgb2YgdGhlIGxhc3QgdHJhbnNmZXIsIHJlc2V0IHZhbHVlcyBhbmQKKwkgKiBjaGVjayBpZiB0aGlzIHdhcyB0aGUgbGFzdCB0cmFuc2ZlciBpbiB0aGUgbWVzc2FnZQorCSAqLworCWlmIChpc19sYXN0X3hmZXJfZG9uZShzcGkpKSB7CisJCXNwaS0+dHhfeGZlcl9vZmZzZXQgPSAwOworCQlzcGktPnJ4X3hmZXJfb2Zmc2V0ID0gMDsKKwkJc3BpLT5vcF90aW1lb3V0ID0gMDsKKwkJaWYgKGxhc3RfeGZlciA9PSBsaXN0X2xhc3RfZW50cnkoJm1zZy0+dHJhbnNmZXJzLAorCQkJCQkJIHN0cnVjdCBzcGlfdHJhbnNmZXIsCisJCQkJCQkgdHJhbnNmZXJfbGlzdCkpCisJCQltc2ctPnN0YXRlID0gR0JfU1BJX1NUQVRFX01TR19ET05FOworCQllbHNlCisJCQlzcGktPmZpcnN0X3hmZXIgPSBsaXN0X25leHRfZW50cnkobGFzdF94ZmVyLAorCQkJCQkJCSAgdHJhbnNmZXJfbGlzdCk7CisJCXJldHVybiAwOworCX0KKworCXNwaS0+Zmlyc3RfeGZlciA9IGxhc3RfeGZlcjsKKwlpZiAobGFzdF94ZmVyLT50eF9idWYpCisJCXNwaS0+dHhfeGZlcl9vZmZzZXQgKz0gc3BpLT5sYXN0X3hmZXJfc2l6ZTsKKworCWlmIChsYXN0X3hmZXItPnJ4X2J1ZikKKwkJc3BpLT5yeF94ZmVyX29mZnNldCArPSBzcGktPmxhc3RfeGZlcl9zaXplOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICpnZXRfbmV4dF94ZmVyKHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIsCisJCQkJCSAgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCit7CisJaWYgKHhmZXIgPT0gbGlzdF9sYXN0X2VudHJ5KCZtc2ctPnRyYW5zZmVycywgc3RydWN0IHNwaV90cmFuc2ZlciwKKwkJCQkgICAgdHJhbnNmZXJfbGlzdCkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGxpc3RfbmV4dF9lbnRyeSh4ZmVyLCB0cmFuc2Zlcl9saXN0KTsKK30KKworLyogUm91dGluZXMgdG8gdHJhbnNmZXIgZGF0YSAqLworc3RhdGljIHN0cnVjdCBnYl9vcGVyYXRpb24gKmdiX3NwaV9vcGVyYXRpb25fY3JlYXRlKHN0cnVjdCBnYl9zcGlsaWIgKnNwaSwKKwkJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCBnYl9zcGlfdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdDsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2ID0gbXNnLT5zcGk7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcjsKKwlzdHJ1Y3QgZ2Jfc3BpX3RyYW5zZmVyICpnYl94ZmVyOworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKwl1MzIgdHhfc2l6ZSA9IDAsIHJ4X3NpemUgPSAwLCBjb3VudCA9IDAsIHhmZXJfbGVuID0gMCwgcmVxdWVzdF9zaXplOworCXUzMiB0eF94ZmVyX3NpemUgPSAwLCByeF94ZmVyX3NpemUgPSAwLCBsZW47CisJdTMyIHRvdGFsX2xlbiA9IDA7CisJdW5zaWduZWQgaW50IHhmZXJfdGltZW91dDsKKwlzaXplX3QgZGF0YV9tYXg7CisJdm9pZCAqdHhfZGF0YTsKKworCWRhdGFfbWF4ID0gZ2Jfb3BlcmF0aW9uX2dldF9wYXlsb2FkX3NpemVfbWF4KGNvbm5lY3Rpb24pOworCXhmZXIgPSBzcGktPmZpcnN0X3hmZXI7CisKKwkvKiBGaW5kIG51bWJlciBvZiB0cmFuc2ZlcnMgcXVldWVkIGFuZCB0eC9yeCBsZW5ndGggaW4gdGhlIG1lc3NhZ2UgKi8KKworCXdoaWxlIChtc2ctPnN0YXRlICE9IEdCX1NQSV9TVEFURV9PUF9SRUFEWSkgeworCQltc2ctPnN0YXRlID0gR0JfU1BJX1NUQVRFX01TR19SVU5OSU5HOworCQlzcGktPmxhc3RfeGZlciA9IHhmZXI7CisKKwkJaWYgKCF4ZmVyLT50eF9idWYgJiYgIXhmZXItPnJ4X2J1ZikgeworCQkJZGV2X2VycihzcGktPnBhcmVudCwKKwkJCQkiYnVmZmVybGVzcyB0cmFuc2ZlciwgbGVuZ3RoICV1XG4iLCB4ZmVyLT5sZW4pOworCQkJbXNnLT5zdGF0ZSA9IEdCX1NQSV9TVEFURV9NU0dfRVJST1I7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCXR4X3hmZXJfc2l6ZSA9IDA7CisJCXJ4X3hmZXJfc2l6ZSA9IDA7CisKKwkJaWYgKHhmZXItPnR4X2J1ZikgeworCQkJbGVuID0geGZlci0+bGVuIC0gc3BpLT50eF94ZmVyX29mZnNldDsKKwkJCWlmICghdHhfaGVhZGVyX2ZpdF9vcGVyYXRpb24odHhfc2l6ZSwgY291bnQsIGRhdGFfbWF4KSkKKwkJCQlicmVhazsKKwkJCXR4X3hmZXJfc2l6ZSA9IGNhbGNfdHhfeGZlcl9zaXplKHR4X3NpemUsIGNvdW50LAorCQkJCQkJCSBsZW4sIGRhdGFfbWF4KTsKKwkJCXNwaS0+bGFzdF94ZmVyX3NpemUgPSB0eF94ZmVyX3NpemU7CisJCX0KKworCQlpZiAoeGZlci0+cnhfYnVmKSB7CisJCQlsZW4gPSB4ZmVyLT5sZW4gLSBzcGktPnJ4X3hmZXJfb2Zmc2V0OworCQkJcnhfeGZlcl9zaXplID0gY2FsY19yeF94ZmVyX3NpemUocnhfc2l6ZSwgJnR4X3hmZXJfc2l6ZSwKKwkJCQkJCQkgbGVuLCBkYXRhX21heCk7CisJCQlzcGktPmxhc3RfeGZlcl9zaXplID0gcnhfeGZlcl9zaXplOworCQl9CisKKwkJdHhfc2l6ZSArPSB0eF94ZmVyX3NpemU7CisJCXJ4X3NpemUgKz0gcnhfeGZlcl9zaXplOworCisJCXRvdGFsX2xlbiArPSBzcGktPmxhc3RfeGZlcl9zaXplOworCQljb3VudCsrOworCisJCXhmZXIgPSBnZXRfbmV4dF94ZmVyKHhmZXIsIG1zZyk7CisJCWlmICgheGZlciB8fCB0b3RhbF9sZW4gPj0gZGF0YV9tYXgpCisJCQltc2ctPnN0YXRlID0gR0JfU1BJX1NUQVRFX09QX1JFQURZOworCX0KKworCS8qCisJICogSW4gYWRkaXRpb24gdG8gc3BhY2UgZm9yIGFsbCBtZXNzYWdlIGRlc2NyaXB0b3JzIHdlIG5lZWQKKwkgKiB0byBoYXZlIGVub3VnaCB0byBob2xkIGFsbCB0eCBkYXRhLgorCSAqLworCXJlcXVlc3Rfc2l6ZSA9IHNpemVvZigqcmVxdWVzdCk7CisJcmVxdWVzdF9zaXplICs9IGNvdW50ICogc2l6ZW9mKCpnYl94ZmVyKTsKKwlyZXF1ZXN0X3NpemUgKz0gdHhfc2l6ZTsKKworCS8qIFJlc3BvbnNlIGNvbnNpc3RzIG9ubHkgb2YgaW5jb21pbmcgZGF0YSAqLworCW9wZXJhdGlvbiA9IGdiX29wZXJhdGlvbl9jcmVhdGUoY29ubmVjdGlvbiwgR0JfU1BJX1RZUEVfVFJBTlNGRVIsCisJCQkJCXJlcXVlc3Rfc2l6ZSwgcnhfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvcGVyYXRpb24pCisJCXJldHVybiBOVUxMOworCisJcmVxdWVzdCA9IG9wZXJhdGlvbi0+cmVxdWVzdC0+cGF5bG9hZDsKKwlyZXF1ZXN0LT5jb3VudCA9IGNwdV90b19sZTE2KGNvdW50KTsKKwlyZXF1ZXN0LT5tb2RlID0gZGV2LT5tb2RlOworCXJlcXVlc3QtPmNoaXBfc2VsZWN0ID0gZGV2LT5jaGlwX3NlbGVjdDsKKworCWdiX3hmZXIgPSAmcmVxdWVzdC0+dHJhbnNmZXJzWzBdOworCXR4X2RhdGEgPSBnYl94ZmVyICsgY291bnQ7CS8qIHBsYWNlIHR4IGRhdGEgYWZ0ZXIgbGFzdCBnYl94ZmVyICovCisKKwkvKiBGaWxsIGluIHRoZSB0cmFuc2ZlcnMgYXJyYXkgKi8KKwl4ZmVyID0gc3BpLT5maXJzdF94ZmVyOworCXdoaWxlIChtc2ctPnN0YXRlICE9IEdCX1NQSV9TVEFURV9PUF9ET05FKSB7CisJCWlmICh4ZmVyID09IHNwaS0+bGFzdF94ZmVyKQorCQkJeGZlcl9sZW4gPSBzcGktPmxhc3RfeGZlcl9zaXplOworCQllbHNlCisJCQl4ZmVyX2xlbiA9IHhmZXItPmxlbjsKKworCQkvKiBtYWtlIHN1cmUgd2UgZG8gbm90IHRpbWVvdXQgaW4gYSBzbG93IHRyYW5zZmVyICovCisJCXhmZXJfdGltZW91dCA9IHhmZXJfbGVuICogOCAqIE1TRUNfUEVSX1NFQyAvIHhmZXItPnNwZWVkX2h6OworCQl4ZmVyX3RpbWVvdXQgKz0gR0JfT1BFUkFUSU9OX1RJTUVPVVRfREVGQVVMVDsKKworCQlpZiAoeGZlcl90aW1lb3V0ID4gc3BpLT5vcF90aW1lb3V0KQorCQkJc3BpLT5vcF90aW1lb3V0ID0geGZlcl90aW1lb3V0OworCisJCWdiX3hmZXItPnNwZWVkX2h6ID0gY3B1X3RvX2xlMzIoeGZlci0+c3BlZWRfaHopOworCQlnYl94ZmVyLT5sZW4gPSBjcHVfdG9fbGUzMih4ZmVyX2xlbik7CisJCWdiX3hmZXItPmRlbGF5X3VzZWNzID0gY3B1X3RvX2xlMTYoeGZlci0+ZGVsYXlfdXNlY3MpOworCQlnYl94ZmVyLT5jc19jaGFuZ2UgPSB4ZmVyLT5jc19jaGFuZ2U7CisJCWdiX3hmZXItPmJpdHNfcGVyX3dvcmQgPSB4ZmVyLT5iaXRzX3Blcl93b3JkOworCisJCS8qIENvcHkgdHggZGF0YSAqLworCQlpZiAoeGZlci0+dHhfYnVmKSB7CisJCQlnYl94ZmVyLT54ZmVyX2ZsYWdzIHw9IEdCX1NQSV9YRkVSX1dSSVRFOworCQkJbWVtY3B5KHR4X2RhdGEsIHhmZXItPnR4X2J1ZiArIHNwaS0+dHhfeGZlcl9vZmZzZXQsCisJCQkgICAgICAgeGZlcl9sZW4pOworCQkJdHhfZGF0YSArPSB4ZmVyX2xlbjsKKwkJfQorCisJCWlmICh4ZmVyLT5yeF9idWYpCisJCQlnYl94ZmVyLT54ZmVyX2ZsYWdzIHw9IEdCX1NQSV9YRkVSX1JFQUQ7CisKKwkJaWYgKHhmZXIgPT0gc3BpLT5sYXN0X3hmZXIpIHsKKwkJCWlmICghaXNfbGFzdF94ZmVyX2RvbmUoc3BpKSkKKwkJCQlnYl94ZmVyLT54ZmVyX2ZsYWdzIHw9IEdCX1NQSV9YRkVSX0lOUFJPR1JFU1M7CisJCQltc2ctPnN0YXRlID0gR0JfU1BJX1NUQVRFX09QX0RPTkU7CisJCQljb250aW51ZTsKKwkJfQorCisJCWdiX3hmZXIrKzsKKwkJeGZlciA9IGdldF9uZXh0X3hmZXIoeGZlciwgbXNnKTsKKwl9CisKKwltc2ctPmFjdHVhbF9sZW5ndGggKz0gdG90YWxfbGVuOworCisJcmV0dXJuIG9wZXJhdGlvbjsKK30KKworc3RhdGljIHZvaWQgZ2Jfc3BpX2RlY29kZV9yZXNwb25zZShzdHJ1Y3QgZ2Jfc3BpbGliICpzcGksCisJCQkJICAgc3RydWN0IHNwaV9tZXNzYWdlICptc2csCisJCQkJICAgc3RydWN0IGdiX3NwaV90cmFuc2Zlcl9yZXNwb25zZSAqcmVzcG9uc2UpCit7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlciA9IHNwaS0+Zmlyc3RfeGZlcjsKKwl2b2lkICpyeF9kYXRhID0gcmVzcG9uc2UtPmRhdGE7CisJdTMyIHhmZXJfbGVuOworCisJd2hpbGUgKHhmZXIpIHsKKwkJLyogQ29weSByeCBkYXRhICovCisJCWlmICh4ZmVyLT5yeF9idWYpIHsKKwkJCWlmICh4ZmVyID09IHNwaS0+Zmlyc3RfeGZlcikKKwkJCQl4ZmVyX2xlbiA9IHhmZXItPmxlbiAtIHNwaS0+cnhfeGZlcl9vZmZzZXQ7CisJCQllbHNlIGlmICh4ZmVyID09IHNwaS0+bGFzdF94ZmVyKQorCQkJCXhmZXJfbGVuID0gc3BpLT5sYXN0X3hmZXJfc2l6ZTsKKwkJCWVsc2UKKwkJCQl4ZmVyX2xlbiA9IHhmZXItPmxlbjsKKworCQkJbWVtY3B5KHhmZXItPnJ4X2J1ZiArIHNwaS0+cnhfeGZlcl9vZmZzZXQsIHJ4X2RhdGEsCisJCQkgICAgICAgeGZlcl9sZW4pOworCQkJcnhfZGF0YSArPSB4ZmVyX2xlbjsKKwkJfQorCisJCWlmICh4ZmVyID09IHNwaS0+bGFzdF94ZmVyKQorCQkJYnJlYWs7CisKKwkJeGZlciA9IGxpc3RfbmV4dF9lbnRyeSh4ZmVyLCB0cmFuc2Zlcl9saXN0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2Jfc3BpX3RyYW5zZmVyX29uZV9tZXNzYWdlKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkJICAgICAgIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCBnYl9zcGlsaWIgKnNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IHNwaS0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2Jfc3BpX3RyYW5zZmVyX3Jlc3BvbnNlICpyZXNwb25zZTsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJaW50IHJldCA9IDA7CisKKwlzcGktPmZpcnN0X3hmZXIgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJm1zZy0+dHJhbnNmZXJzLAorCQkJCQkJICAgc3RydWN0IHNwaV90cmFuc2ZlciwKKwkJCQkJCSAgIHRyYW5zZmVyX2xpc3QpOworCWlmICghc3BpLT5maXJzdF94ZmVyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCW1zZy0+c3RhdGUgPSBHQl9TUElfU1RBVEVfTVNHX0lETEU7CisKKwl3aGlsZSAobXNnLT5zdGF0ZSAhPSBHQl9TUElfU1RBVEVfTVNHX0RPTkUgJiYKKwkgICAgICAgbXNnLT5zdGF0ZSAhPSBHQl9TUElfU1RBVEVfTVNHX0VSUk9SKSB7CisJCW9wZXJhdGlvbiA9IGdiX3NwaV9vcGVyYXRpb25fY3JlYXRlKHNwaSwgY29ubmVjdGlvbiwgbXNnKTsKKwkJaWYgKCFvcGVyYXRpb24pIHsKKwkJCW1zZy0+c3RhdGUgPSBHQl9TUElfU1RBVEVfTVNHX0VSUk9SOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmV0ID0gZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZF9zeW5jX3RpbWVvdXQob3BlcmF0aW9uLAorCQkJCQkJCSAgICAgc3BpLT5vcF90aW1lb3V0KTsKKwkJaWYgKCFyZXQpIHsKKwkJCXJlc3BvbnNlID0gb3BlcmF0aW9uLT5yZXNwb25zZS0+cGF5bG9hZDsKKwkJCWlmIChyZXNwb25zZSkKKwkJCQlnYl9zcGlfZGVjb2RlX3Jlc3BvbnNlKHNwaSwgbXNnLCByZXNwb25zZSk7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKHNwaS0+cGFyZW50LAorCQkJCSJ0cmFuc2ZlciBvcGVyYXRpb24gZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJCW1zZy0+c3RhdGUgPSBHQl9TUElfU1RBVEVfTVNHX0VSUk9SOworCQl9CisKKwkJZ2Jfb3BlcmF0aW9uX3B1dChvcGVyYXRpb24pOworCQlzZXR1cF9uZXh0X3hmZXIoc3BpLCBtc2cpOworCX0KKworb3V0OgorCW1zZy0+c3RhdHVzID0gcmV0OworCWNsZWFuX3hmZXJfc3RhdGUoc3BpKTsKKwlzcGlfZmluYWxpemVfY3VycmVudF9tZXNzYWdlKG1hc3Rlcik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX3NwaV9wcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCit7CisJc3RydWN0IGdiX3NwaWxpYiAqc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJcmV0dXJuIHNwaS0+b3BzLT5wcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlKHNwaS0+cGFyZW50KTsKK30KKworc3RhdGljIGludCBnYl9zcGlfdW5wcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCit7CisJc3RydWN0IGdiX3NwaWxpYiAqc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJc3BpLT5vcHMtPnVucHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZShzcGktPnBhcmVudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwkvKiBOb3RoaW5nIHRvIGRvIGZvciBub3cgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2Jfc3BpX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwkvKiBOb3RoaW5nIHRvIGRvIGZvciBub3cgKi8KK30KKworLyogUm91dGluZXMgdG8gZ2V0IGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gKi8KKworLyoKKyAqIE1hcCBHcmV5YnVzIHNwaSBtb2RlIGJpdHMvZmxhZ3MvYnB3IGludG8gTGludXggb25lcy4KKyAqIEFsbCBiaXRzIGFyZSBzYW1lIGZvciBub3cgYW5kIHNvIHRoZXNlIG1hY3JvJ3MgcmV0dXJuIHNhbWUgdmFsdWVzLgorICovCisjZGVmaW5lIGdiX3NwaV9tb2RlX21hcChtb2RlKSBtb2RlCisjZGVmaW5lIGdiX3NwaV9mbGFnc19tYXAoZmxhZ3MpIGZsYWdzCisKK3N0YXRpYyBpbnQgZ2Jfc3BpX2dldF9tYXN0ZXJfY29uZmlnKHN0cnVjdCBnYl9zcGlsaWIgKnNwaSkKK3sKKwlzdHJ1Y3QgZ2Jfc3BpX21hc3Rlcl9jb25maWdfcmVzcG9uc2UgcmVzcG9uc2U7CisJdTE2IG1vZGUsIGZsYWdzOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhzcGktPmNvbm5lY3Rpb24sIEdCX1NQSV9UWVBFX01BU1RFUl9DT05GSUcsCisJCQkJTlVMTCwgMCwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW1vZGUgPSBsZTE2X3RvX2NwdShyZXNwb25zZS5tb2RlKTsKKwlzcGktPm1vZGUgPSBnYl9zcGlfbW9kZV9tYXAobW9kZSk7CisKKwlmbGFncyA9IGxlMTZfdG9fY3B1KHJlc3BvbnNlLmZsYWdzKTsKKwlzcGktPmZsYWdzID0gZ2Jfc3BpX2ZsYWdzX21hcChmbGFncyk7CisKKwlzcGktPmJpdHNfcGVyX3dvcmRfbWFzayA9IGxlMzJfdG9fY3B1KHJlc3BvbnNlLmJpdHNfcGVyX3dvcmRfbWFzayk7CisJc3BpLT5udW1fY2hpcHNlbGVjdCA9IHJlc3BvbnNlLm51bV9jaGlwc2VsZWN0OworCisJc3BpLT5taW5fc3BlZWRfaHogPSBsZTMyX3RvX2NwdShyZXNwb25zZS5taW5fc3BlZWRfaHopOworCXNwaS0+bWF4X3NwZWVkX2h6ID0gbGUzMl90b19jcHUocmVzcG9uc2UubWF4X3NwZWVkX2h6KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX3NwaV9zZXR1cF9kZXZpY2Uoc3RydWN0IGdiX3NwaWxpYiAqc3BpLCB1OCBjcykKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZ2V0X21hc3Rlcl9mcm9tX3NwaShzcGkpOworCXN0cnVjdCBnYl9zcGlfZGV2aWNlX2NvbmZpZ19yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGdiX3NwaV9kZXZpY2VfY29uZmlnX3Jlc3BvbnNlIHJlc3BvbnNlOworCXN0cnVjdCBzcGlfYm9hcmRfaW5mbyBzcGlfYm9hcmQgPSB7IHswfSB9OworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlkZXY7CisJaW50IHJldDsKKwl1OCBkZXZfdHlwZTsKKworCXJlcXVlc3QuY2hpcF9zZWxlY3QgPSBjczsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKHNwaS0+Y29ubmVjdGlvbiwgR0JfU1BJX1RZUEVfREVWSUNFX0NPTkZJRywKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLAorCQkJCSZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlkZXZfdHlwZSA9IHJlc3BvbnNlLmRldmljZV90eXBlOworCisJaWYgKGRldl90eXBlID09IEdCX1NQSV9TUElfREVWKQorCQlzdHJsY3B5KHNwaV9ib2FyZC5tb2RhbGlhcywgInNwaWRldiIsCisJCQlzaXplb2Yoc3BpX2JvYXJkLm1vZGFsaWFzKSk7CisJZWxzZSBpZiAoZGV2X3R5cGUgPT0gR0JfU1BJX1NQSV9OT1IpCisJCXN0cmxjcHkoc3BpX2JvYXJkLm1vZGFsaWFzLCAic3BpLW5vciIsCisJCQlzaXplb2Yoc3BpX2JvYXJkLm1vZGFsaWFzKSk7CisJZWxzZSBpZiAoZGV2X3R5cGUgPT0gR0JfU1BJX1NQSV9NT0RBTElBUykKKwkJbWVtY3B5KHNwaV9ib2FyZC5tb2RhbGlhcywgcmVzcG9uc2UubmFtZSwKKwkJICAgICAgIHNpemVvZihzcGlfYm9hcmQubW9kYWxpYXMpKTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJc3BpX2JvYXJkLm1vZGUJCT0gbGUxNl90b19jcHUocmVzcG9uc2UubW9kZSk7CisJc3BpX2JvYXJkLmJ1c19udW0JPSBtYXN0ZXItPmJ1c19udW07CisJc3BpX2JvYXJkLmNoaXBfc2VsZWN0CT0gY3M7CisJc3BpX2JvYXJkLm1heF9zcGVlZF9oegk9IGxlMzJfdG9fY3B1KHJlc3BvbnNlLm1heF9zcGVlZF9oeik7CisKKwlzcGlkZXYgPSBzcGlfbmV3X2RldmljZShtYXN0ZXIsICZzcGlfYm9hcmQpOworCWlmICghc3BpZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitpbnQgZ2Jfc3BpbGliX21hc3Rlcl9pbml0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBzcGlsaWJfb3BzICpvcHMpCit7CisJc3RydWN0IGdiX3NwaWxpYiAqc3BpOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJaW50IHJldDsKKwl1OCBpOworCisJLyogQWxsb2NhdGUgbWFzdGVyIHdpdGggc3BhY2UgZm9yIGRhdGEgKi8KKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKGRldiwgc2l6ZW9mKCpzcGkpKTsKKwlpZiAoIW1hc3RlcikgeworCQlkZXZfZXJyKGRldiwgImNhbm5vdCBhbGxvYyBTUEkgbWFzdGVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXNwaS0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJZ2JfY29ubmVjdGlvbl9zZXRfZGF0YShjb25uZWN0aW9uLCBtYXN0ZXIpOworCXNwaS0+cGFyZW50ID0gZGV2OworCXNwaS0+b3BzID0gb3BzOworCisJLyogZ2V0IG1hc3RlciBjb25maWd1cmF0aW9uICovCisJcmV0ID0gZ2Jfc3BpX2dldF9tYXN0ZXJfY29uZmlnKHNwaSk7CisJaWYgKHJldCkKKwkJZ290byBleGl0X3NwaV9wdXQ7CisKKwltYXN0ZXItPmJ1c19udW0gPSAtMTsgLyogQWxsb3cgc3BpLWNvcmUgdG8gYWxsb2NhdGUgaXQgZHluYW1pY2FsbHkgKi8KKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gc3BpLT5udW1fY2hpcHNlbGVjdDsKKwltYXN0ZXItPm1vZGVfYml0cyA9IHNwaS0+bW9kZTsKKwltYXN0ZXItPmZsYWdzID0gc3BpLT5mbGFnczsKKwltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IHNwaS0+Yml0c19wZXJfd29yZF9tYXNrOworCisJLyogQXR0YWNoIG1ldGhvZHMgKi8KKwltYXN0ZXItPmNsZWFudXAgPSBnYl9zcGlfY2xlYW51cDsKKwltYXN0ZXItPnNldHVwID0gZ2Jfc3BpX3NldHVwOworCW1hc3Rlci0+dHJhbnNmZXJfb25lX21lc3NhZ2UgPSBnYl9zcGlfdHJhbnNmZXJfb25lX21lc3NhZ2U7CisKKwlpZiAob3BzICYmIG9wcy0+cHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZSkgeworCQltYXN0ZXItPnByZXBhcmVfdHJhbnNmZXJfaGFyZHdhcmUgPQorCQkJZ2Jfc3BpX3ByZXBhcmVfdHJhbnNmZXJfaGFyZHdhcmU7CisJfQorCisJaWYgKG9wcyAmJiBvcHMtPnVucHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZSkgeworCQltYXN0ZXItPnVucHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZSA9CisJCQlnYl9zcGlfdW5wcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlOworCX0KKworCW1hc3Rlci0+YXV0b19ydW50aW1lX3BtID0gdHJ1ZTsKKworCXJldCA9IHNwaV9yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBleGl0X3NwaV9wdXQ7CisKKwkvKiBub3csIGZldGNoIHRoZSBkZXZpY2VzIGNvbmZpZ3VyYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3BpLT5udW1fY2hpcHNlbGVjdDsgaSsrKSB7CisJCXJldCA9IGdiX3NwaV9zZXR1cF9kZXZpY2Uoc3BpLCBpKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHNwaSBkZXZpY2UgJWQ6ICVkXG4iLAorCQkJCWksIHJldCk7CisJCQlnb3RvIGV4aXRfc3BpX3VucmVnaXN0ZXI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworZXhpdF9zcGlfdW5yZWdpc3RlcjoKKwlzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKK2V4aXRfc3BpX3B1dDoKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX3NwaWxpYl9tYXN0ZXJfaW5pdCk7CisKK3ZvaWQgZ2Jfc3BpbGliX21hc3Rlcl9leGl0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKGNvbm5lY3Rpb24pOworCisJc3BpX3VucmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX3NwaWxpYl9tYXN0ZXJfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3NwaWxpYi5oIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3BpbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2ZDBkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3NwaWxpYi5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBHcmV5YnVzIFNQSSBsaWJyYXJ5IGhlYWRlcgorICoKKyAqIGNvcHlyaWdodCAyMDE2IGdvb2dsZSBpbmMuCisgKiBjb3B5cmlnaHQgMjAxNiBsaW5hcm8gbHRkLgorICoKKyAqIHJlbGVhc2VkIHVuZGVyIHRoZSBncGx2MiBvbmx5LgorICovCisKKyNpZm5kZWYgX19TUElMSUJfSAorI2RlZmluZSBfX1NQSUxJQl9ICisKK3N0cnVjdCBkZXZpY2U7CitzdHJ1Y3QgZ2JfY29ubmVjdGlvbjsKKworc3RydWN0IHNwaWxpYl9vcHMgeworCWludCAoKnByZXBhcmVfdHJhbnNmZXJfaGFyZHdhcmUpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJdm9pZCAoKnVucHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZSkoc3RydWN0IGRldmljZSAqZGV2KTsKK307CisKK2ludCBnYl9zcGlsaWJfbWFzdGVyX2luaXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNwaWxpYl9vcHMgKm9wcyk7Cit2b2lkIGdiX3NwaWxpYl9tYXN0ZXJfZXhpdChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKKyNlbmRpZiAvKiBfX1NQSUxJQl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zdmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3N2Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MDA1NWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zdmMuYwpAQCAtMCwwICsxLDE0ODYgQEAKKy8qCisgKiBTVkMgR3JleWJ1cyBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKworI2RlZmluZSBTVkNfSU5URl9FSkVDVF9USU1FT1VUCQk5MDAwCisjZGVmaW5lIFNWQ19JTlRGX0FDVElWQVRFX1RJTUVPVVQJNjAwMAorI2RlZmluZSBTVkNfSU5URl9SRVNVTUVfVElNRU9VVAkJMzAwMAorCitzdHJ1Y3QgZ2Jfc3ZjX2RlZmVycmVkX3JlcXVlc3QgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKK307CisKKworc3RhdGljIGludCBnYl9zdmNfcXVldWVfZGVmZXJyZWRfcmVxdWVzdChzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24pOworCitzdGF0aWMgc3NpemVfdCBlbmRvX2lkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSB0b19nYl9zdmMoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA0eFxuIiwgc3ZjLT5lbmRvX2lkKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhlbmRvX2lkKTsKKworc3RhdGljIHNzaXplX3QgYXBfaW50Zl9pZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gdG9fZ2Jfc3ZjKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgc3ZjLT5hcF9pbnRmX2lkKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhhcF9pbnRmX2lkKTsKKworLy8gRklYTUUKKy8vIFRoaXMgaXMgYSBoYWNrLCB3ZSBuZWVkIHRvIGRvIHRoaXMgInJpZ2h0IiBhbmQgY2xlYW4gdGhlIGludGVyZmFjZSB1cAorLy8gcHJvcGVybHksIG5vdCBqdXN0IGZvcmNpYmx5IHlhbmsgdGhlIHRoaW5nIG91dCBvZiB0aGUgc3lzdGVtIGFuZCBob3BlIGZvciB0aGUKKy8vIGJlc3QuICBCdXQgZm9yIG5vdywgcGVvcGxlIHdhbnQgdGhlaXIgbW9kdWxlcyB0byBjb21lIG91dCB3aXRob3V0IGhhdmluZyB0bworLy8gdGhyb3cgdGhlIHRoaW5nIHRvIHRoZSBncm91bmQgb3IgZ2V0IG91dCBhIHNjcmV3ZHJpdmVyLgorc3RhdGljIHNzaXplX3QgaW50Zl9lamVjdF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IHRvX2diX3N2YyhkZXYpOworCXVuc2lnbmVkIHNob3J0IGludGZfaWQ7CisJaW50IHJldDsKKworCXJldCA9IGtzdHJ0b3UxNihidWYsIDEwLCAmaW50Zl9pZCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlkZXZfd2FybihkZXYsICJGb3JjaWJseSB0cnlpbmcgdG8gZWplY3QgaW50ZXJmYWNlICVkXG4iLCBpbnRmX2lkKTsKKworCXJldCA9IGdiX3N2Y19pbnRmX2VqZWN0KHN2YywgaW50Zl9pZCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIERFVklDRV9BVFRSX1dPKGludGZfZWplY3QpOworCitzdGF0aWMgc3NpemVfdCB3YXRjaGRvZ19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSB0b19nYl9zdmMoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLAorCQkgICAgICAgZ2Jfc3ZjX3dhdGNoZG9nX2VuYWJsZWQoc3ZjKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworfQorCitzdGF0aWMgc3NpemVfdCB3YXRjaGRvZ19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSB0b19nYl9zdmMoZGV2KTsKKwlpbnQgcmV0dmFsOworCWJvb2wgdXNlcl9yZXF1ZXN0OworCisJcmV0dmFsID0gc3RydG9ib29sKGJ1ZiwgJnVzZXJfcmVxdWVzdCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlmICh1c2VyX3JlcXVlc3QpCisJCXJldHZhbCA9IGdiX3N2Y193YXRjaGRvZ19lbmFibGUoc3ZjKTsKKwllbHNlCisJCXJldHZhbCA9IGdiX3N2Y193YXRjaGRvZ19kaXNhYmxlKHN2Yyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIERFVklDRV9BVFRSX1JXKHdhdGNoZG9nKTsKKworc3RhdGljIHNzaXplX3Qgd2F0Y2hkb2dfYWN0aW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IHRvX2diX3N2YyhkZXYpOworCisJaWYgKHN2Yy0+YWN0aW9uID09IEdCX1NWQ19XQVRDSERPR19CSVRFX1BBTklDX0tFUk5FTCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAicGFuaWNcbiIpOworCWVsc2UgaWYgKHN2Yy0+YWN0aW9uID09IEdCX1NWQ19XQVRDSERPR19CSVRFX1JFU0VUX1VOSVBSTykKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAicmVzZXRcbiIpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHdhdGNoZG9nX2FjdGlvbl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSB0b19nYl9zdmMoZGV2KTsKKworCWlmIChzeXNmc19zdHJlcShidWYsICJwYW5pYyIpKQorCQlzdmMtPmFjdGlvbiA9IEdCX1NWQ19XQVRDSERPR19CSVRFX1BBTklDX0tFUk5FTDsKKwllbHNlIGlmIChzeXNmc19zdHJlcShidWYsICJyZXNldCIpKQorCQlzdmMtPmFjdGlvbiA9IEdCX1NWQ19XQVRDSERPR19CSVRFX1JFU0VUX1VOSVBSTzsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9SVyh3YXRjaGRvZ19hY3Rpb24pOworCitzdGF0aWMgaW50IGdiX3N2Y19wd3Jtb25fcmFpbF9jb3VudF9nZXQoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCAqdmFsdWUpCit7CisJc3RydWN0IGdiX3N2Y19wd3Jtb25fcmFpbF9jb3VudF9nZXRfcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IHJldDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKHN2Yy0+Y29ubmVjdGlvbiwKKwkJCQlHQl9TVkNfVFlQRV9QV1JNT05fUkFJTF9DT1VOVF9HRVQsIE5VTEwsIDAsCisJCQkJJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LCAiZmFpbGVkIHRvIGdldCByYWlsIGNvdW50OiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkqdmFsdWUgPSByZXNwb25zZS5yYWlsX2NvdW50OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2Jfc3ZjX3B3cm1vbl9yYWlsX25hbWVzX2dldChzdHJ1Y3QgZ2Jfc3ZjICpzdmMsCisJCXN0cnVjdCBnYl9zdmNfcHdybW9uX3JhaWxfbmFtZXNfZ2V0X3Jlc3BvbnNlICpyZXNwb25zZSwKKwkJc2l6ZV90IGJ1ZnNpemUpCit7CisJaW50IHJldDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKHN2Yy0+Y29ubmVjdGlvbiwKKwkJCQlHQl9TVkNfVFlQRV9QV1JNT05fUkFJTF9OQU1FU19HRVQsIE5VTEwsIDAsCisJCQkJcmVzcG9uc2UsIGJ1ZnNpemUpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsICJmYWlsZWQgdG8gZ2V0IHJhaWwgbmFtZXM6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZXNwb25zZS0+c3RhdHVzICE9IEdCX1NWQ19PUF9TVUNDRVNTKSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LAorCQkJIlNWQyBlcnJvciB3aGlsZSBnZXR0aW5nIHJhaWwgbmFtZXM6ICV1XG4iLAorCQkJcmVzcG9uc2UtPnN0YXR1cyk7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX3N2Y19wd3Jtb25fc2FtcGxlX2dldChzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IHJhaWxfaWQsCisJCQkJICAgIHU4IG1lYXN1cmVtZW50X3R5cGUsIHUzMiAqdmFsdWUpCit7CisJc3RydWN0IGdiX3N2Y19wd3Jtb25fc2FtcGxlX2dldF9yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGdiX3N2Y19wd3Jtb25fc2FtcGxlX2dldF9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCisJcmVxdWVzdC5yYWlsX2lkID0gcmFpbF9pZDsKKwlyZXF1ZXN0Lm1lYXN1cmVtZW50X3R5cGUgPSBtZWFzdXJlbWVudF90eXBlOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoc3ZjLT5jb25uZWN0aW9uLCBHQl9TVkNfVFlQRV9QV1JNT05fU0FNUExFX0dFVCwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLAorCQkJCSZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgImZhaWxlZCB0byBnZXQgcmFpbCBzYW1wbGU6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZXNwb25zZS5yZXN1bHQpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsCisJCQkiVW5pUHJvIGVycm9yIHdoaWxlIGdldHRpbmcgcmFpbCBwb3dlciBzYW1wbGUgKCVkICVkKTogJWRcbiIsCisJCQlyYWlsX2lkLCBtZWFzdXJlbWVudF90eXBlLCByZXNwb25zZS5yZXN1bHQpOworCQlzd2l0Y2ggKHJlc3BvbnNlLnJlc3VsdCkgeworCQljYXNlIEdCX1NWQ19QV1JNT05fR0VUX1NBTVBMRV9JTlZBTDoKKwkJCXJldHVybiAtRUlOVkFMOworCQljYXNlIEdCX1NWQ19QV1JNT05fR0VUX1NBTVBMRV9OT1NVUFA6CisJCQlyZXR1cm4gLUVOT01TRzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRVJFTU9URUlPOworCQl9CisJfQorCisJKnZhbHVlID0gbGUzMl90b19jcHUocmVzcG9uc2UubWVhc3VyZW1lbnQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYl9zdmNfcHdybW9uX2ludGZfc2FtcGxlX2dldChzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQsCisJCQkJICB1OCBtZWFzdXJlbWVudF90eXBlLCB1MzIgKnZhbHVlKQoreworCXN0cnVjdCBnYl9zdmNfcHdybW9uX2ludGZfc2FtcGxlX2dldF9yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGdiX3N2Y19wd3Jtb25faW50Zl9zYW1wbGVfZ2V0X3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQ7CisKKwlyZXF1ZXN0LmludGZfaWQgPSBpbnRmX2lkOworCXJlcXVlc3QubWVhc3VyZW1lbnRfdHlwZSA9IG1lYXN1cmVtZW50X3R5cGU7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhzdmMtPmNvbm5lY3Rpb24sCisJCQkJR0JfU1ZDX1RZUEVfUFdSTU9OX0lOVEZfU0FNUExFX0dFVCwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLAorCQkJCSZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgImZhaWxlZCB0byBnZXQgaW50ZiBzYW1wbGU6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZXNwb25zZS5yZXN1bHQpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsCisJCQkiVW5pUHJvIGVycm9yIHdoaWxlIGdldHRpbmcgaW50ZiBwb3dlciBzYW1wbGUgKCVkICVkKTogJWRcbiIsCisJCQlpbnRmX2lkLCBtZWFzdXJlbWVudF90eXBlLCByZXNwb25zZS5yZXN1bHQpOworCQlzd2l0Y2ggKHJlc3BvbnNlLnJlc3VsdCkgeworCQljYXNlIEdCX1NWQ19QV1JNT05fR0VUX1NBTVBMRV9JTlZBTDoKKwkJCXJldHVybiAtRUlOVkFMOworCQljYXNlIEdCX1NWQ19QV1JNT05fR0VUX1NBTVBMRV9OT1NVUFA6CisJCQlyZXR1cm4gLUVOT01TRzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRVJFTU9URUlPOworCQl9CisJfQorCisJKnZhbHVlID0gbGUzMl90b19jcHUocmVzcG9uc2UubWVhc3VyZW1lbnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpzdmNfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfZW5kb19pZC5hdHRyLAorCSZkZXZfYXR0cl9hcF9pbnRmX2lkLmF0dHIsCisJJmRldl9hdHRyX2ludGZfZWplY3QuYXR0ciwKKwkmZGV2X2F0dHJfd2F0Y2hkb2cuYXR0ciwKKwkmZGV2X2F0dHJfd2F0Y2hkb2dfYWN0aW9uLmF0dHIsCisJTlVMTCwKK307CitBVFRSSUJVVEVfR1JPVVBTKHN2Yyk7CisKK2ludCBnYl9zdmNfaW50Zl9kZXZpY2VfaWQoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBpbnRmX2lkLCB1OCBkZXZpY2VfaWQpCit7CisJc3RydWN0IGdiX3N2Y19pbnRmX2RldmljZV9pZF9yZXF1ZXN0IHJlcXVlc3Q7CisKKwlyZXF1ZXN0LmludGZfaWQgPSBpbnRmX2lkOworCXJlcXVlc3QuZGV2aWNlX2lkID0gZGV2aWNlX2lkOworCisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jKHN2Yy0+Y29ubmVjdGlvbiwgR0JfU1ZDX1RZUEVfSU5URl9ERVZJQ0VfSUQsCisJCQkJICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworfQorCitpbnQgZ2Jfc3ZjX2ludGZfZWplY3Qoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBpbnRmX2lkKQoreworCXN0cnVjdCBnYl9zdmNfaW50Zl9lamVjdF9yZXF1ZXN0IHJlcXVlc3Q7CisJaW50IHJldDsKKworCXJlcXVlc3QuaW50Zl9pZCA9IGludGZfaWQ7CisKKwkvKgorCSAqIFRoZSBwdWxzZSB3aWR0aCBmb3IgbW9kdWxlIHJlbGVhc2UgaW4gc3ZjIGlzIGxvbmcgc28gd2UgbmVlZCB0bworCSAqIGluY3JlYXNlIHRoZSB0aW1lb3V0IHNvIHRoZSBvcGVyYXRpb24gd2lsbCBub3QgcmV0dXJuIHRvIHNvb24uCisJICovCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmNfdGltZW91dChzdmMtPmNvbm5lY3Rpb24sCisJCQkJCUdCX1NWQ19UWVBFX0lOVEZfRUpFQ1QsICZyZXF1ZXN0LAorCQkJCQlzaXplb2YocmVxdWVzdCksIE5VTEwsIDAsCisJCQkJCVNWQ19JTlRGX0VKRUNUX1RJTUVPVVQpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsICJmYWlsZWQgdG8gZWplY3QgaW50ZXJmYWNlICV1XG4iLCBpbnRmX2lkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdiX3N2Y19pbnRmX3ZzeXNfc2V0KHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCwgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IGdiX3N2Y19pbnRmX3ZzeXNfcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9zdmNfaW50Zl92c3lzX3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCB0eXBlLCByZXQ7CisKKwlyZXF1ZXN0LmludGZfaWQgPSBpbnRmX2lkOworCisJaWYgKGVuYWJsZSkKKwkJdHlwZSA9IEdCX1NWQ19UWVBFX0lOVEZfVlNZU19FTkFCTEU7CisJZWxzZQorCQl0eXBlID0gR0JfU1ZDX1RZUEVfSU5URl9WU1lTX0RJU0FCTEU7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhzdmMtPmNvbm5lY3Rpb24sIHR5cGUsCisJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLAorCQkJJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAocmVzcG9uc2UucmVzdWx0X2NvZGUgIT0gR0JfU1ZDX0lOVEZfVlNZU19PSykKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJcmV0dXJuIDA7Cit9CisKK2ludCBnYl9zdmNfaW50Zl9yZWZjbGtfc2V0KHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCwgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IGdiX3N2Y19pbnRmX3JlZmNsa19yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGdiX3N2Y19pbnRmX3JlZmNsa19yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgdHlwZSwgcmV0OworCisJcmVxdWVzdC5pbnRmX2lkID0gaW50Zl9pZDsKKworCWlmIChlbmFibGUpCisJCXR5cGUgPSBHQl9TVkNfVFlQRV9JTlRGX1JFRkNMS19FTkFCTEU7CisJZWxzZQorCQl0eXBlID0gR0JfU1ZDX1RZUEVfSU5URl9SRUZDTEtfRElTQUJMRTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKHN2Yy0+Y29ubmVjdGlvbiwgdHlwZSwKKwkJCSZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksCisJCQkmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlmIChyZXNwb25zZS5yZXN1bHRfY29kZSAhPSBHQl9TVkNfSU5URl9SRUZDTEtfT0spCisJCXJldHVybiAtRVJFTU9URUlPOworCXJldHVybiAwOworfQorCitpbnQgZ2Jfc3ZjX2ludGZfdW5pcHJvX3NldChzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBnYl9zdmNfaW50Zl91bmlwcm9fcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9zdmNfaW50Zl91bmlwcm9fcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IHR5cGUsIHJldDsKKworCXJlcXVlc3QuaW50Zl9pZCA9IGludGZfaWQ7CisKKwlpZiAoZW5hYmxlKQorCQl0eXBlID0gR0JfU1ZDX1RZUEVfSU5URl9VTklQUk9fRU5BQkxFOworCWVsc2UKKwkJdHlwZSA9IEdCX1NWQ19UWVBFX0lOVEZfVU5JUFJPX0RJU0FCTEU7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhzdmMtPmNvbm5lY3Rpb24sIHR5cGUsCisJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLAorCQkJJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAocmVzcG9uc2UucmVzdWx0X2NvZGUgIT0gR0JfU1ZDX0lOVEZfVU5JUFJPX09LKQorCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwlyZXR1cm4gMDsKK30KKworaW50IGdiX3N2Y19pbnRmX2FjdGl2YXRlKHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCwgdTggKmludGZfdHlwZSkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX2ludGZfYWN0aXZhdGVfcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9zdmNfaW50Zl9hY3RpdmF0ZV9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCisJcmVxdWVzdC5pbnRmX2lkID0gaW50Zl9pZDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jX3RpbWVvdXQoc3ZjLT5jb25uZWN0aW9uLAorCQkJR0JfU1ZDX1RZUEVfSU5URl9BQ1RJVkFURSwKKwkJCSZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksCisJCQkmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSksCisJCQlTVkNfSU5URl9BQ1RJVkFURV9USU1FT1VUKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAocmVzcG9uc2Uuc3RhdHVzICE9IEdCX1NWQ19PUF9TVUNDRVNTKSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LCAiZmFpbGVkIHRvIGFjdGl2YXRlIGludGVyZmFjZSAldTogJXVcbiIsCisJCQkJaW50Zl9pZCwgcmVzcG9uc2Uuc3RhdHVzKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCisJKmludGZfdHlwZSA9IHJlc3BvbnNlLmludGZfdHlwZTsKKworCXJldHVybiAwOworfQorCitpbnQgZ2Jfc3ZjX2ludGZfcmVzdW1lKHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX2ludGZfcmVzdW1lX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2Jfc3ZjX2ludGZfcmVzdW1lX3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQ7CisKKwlyZXF1ZXN0LmludGZfaWQgPSBpbnRmX2lkOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmNfdGltZW91dChzdmMtPmNvbm5lY3Rpb24sCisJCQkJCUdCX1NWQ19UWVBFX0lOVEZfUkVTVU1FLAorCQkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLAorCQkJCQkmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSksCisJCQkJCVNWQ19JTlRGX1JFU1VNRV9USU1FT1VUKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgImZhaWxlZCB0byBzZW5kIGludGVyZmFjZSByZXN1bWUgJXU6ICVkXG4iLAorCQkJaW50Zl9pZCwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocmVzcG9uc2Uuc3RhdHVzICE9IEdCX1NWQ19PUF9TVUNDRVNTKSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LCAiZmFpbGVkIHRvIHJlc3VtZSBpbnRlcmZhY2UgJXU6ICV1XG4iLAorCQkJaW50Zl9pZCwgcmVzcG9uc2Uuc3RhdHVzKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYl9zdmNfZG1lX3BlZXJfZ2V0KHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCwgdTE2IGF0dHIsIHUxNiBzZWxlY3RvciwKKwkJCXUzMiAqdmFsdWUpCit7CisJc3RydWN0IGdiX3N2Y19kbWVfcGVlcl9nZXRfcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9zdmNfZG1lX3BlZXJfZ2V0X3Jlc3BvbnNlIHJlc3BvbnNlOworCXUxNiByZXN1bHQ7CisJaW50IHJldDsKKworCXJlcXVlc3QuaW50Zl9pZCA9IGludGZfaWQ7CisJcmVxdWVzdC5hdHRyID0gY3B1X3RvX2xlMTYoYXR0cik7CisJcmVxdWVzdC5zZWxlY3RvciA9IGNwdV90b19sZTE2KHNlbGVjdG9yKTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKHN2Yy0+Y29ubmVjdGlvbiwgR0JfU1ZDX1RZUEVfRE1FX1BFRVJfR0VULAorCQkJCSZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksCisJCQkJJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LCAiZmFpbGVkIHRvIGdldCBETUUgYXR0cmlidXRlICgldSAweCUwNHggJXUpOiAlZFxuIiwKKwkJCQlpbnRmX2lkLCBhdHRyLCBzZWxlY3RvciwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXN1bHQgPSBsZTE2X3RvX2NwdShyZXNwb25zZS5yZXN1bHRfY29kZSk7CisJaWYgKHJlc3VsdCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgIlVuaVBybyBlcnJvciB3aGlsZSBnZXR0aW5nIERNRSBhdHRyaWJ1dGUgKCV1IDB4JTA0eCAldSk6ICV1XG4iLAorCQkJCWludGZfaWQsIGF0dHIsIHNlbGVjdG9yLCByZXN1bHQpOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisKKwlpZiAodmFsdWUpCisJCSp2YWx1ZSA9IGxlMzJfdG9fY3B1KHJlc3BvbnNlLmF0dHJfdmFsdWUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYl9zdmNfZG1lX3BlZXJfc2V0KHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCwgdTE2IGF0dHIsIHUxNiBzZWxlY3RvciwKKwkJCXUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX2RtZV9wZWVyX3NldF9yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGdiX3N2Y19kbWVfcGVlcl9zZXRfcmVzcG9uc2UgcmVzcG9uc2U7CisJdTE2IHJlc3VsdDsKKwlpbnQgcmV0OworCisJcmVxdWVzdC5pbnRmX2lkID0gaW50Zl9pZDsKKwlyZXF1ZXN0LmF0dHIgPSBjcHVfdG9fbGUxNihhdHRyKTsKKwlyZXF1ZXN0LnNlbGVjdG9yID0gY3B1X3RvX2xlMTYoc2VsZWN0b3IpOworCXJlcXVlc3QudmFsdWUgPSBjcHVfdG9fbGUzMih2YWx1ZSk7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhzdmMtPmNvbm5lY3Rpb24sIEdCX1NWQ19UWVBFX0RNRV9QRUVSX1NFVCwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLAorCQkJCSZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgImZhaWxlZCB0byBzZXQgRE1FIGF0dHJpYnV0ZSAoJXUgMHglMDR4ICV1ICV1KTogJWRcbiIsCisJCQkJaW50Zl9pZCwgYXR0ciwgc2VsZWN0b3IsIHZhbHVlLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJlc3VsdCA9IGxlMTZfdG9fY3B1KHJlc3BvbnNlLnJlc3VsdF9jb2RlKTsKKwlpZiAocmVzdWx0KSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LCAiVW5pUHJvIGVycm9yIHdoaWxlIHNldHRpbmcgRE1FIGF0dHJpYnV0ZSAoJXUgMHglMDR4ICV1ICV1KTogJXVcbiIsCisJCQkJaW50Zl9pZCwgYXR0ciwgc2VsZWN0b3IsIHZhbHVlLCByZXN1bHQpOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdiX3N2Y19jb25uZWN0aW9uX2NyZWF0ZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsCisJCQkJdTggaW50ZjFfaWQsIHUxNiBjcG9ydDFfaWQsCisJCQkJdTggaW50ZjJfaWQsIHUxNiBjcG9ydDJfaWQsCisJCQkJdTggY3BvcnRfZmxhZ3MpCit7CisJc3RydWN0IGdiX3N2Y19jb25uX2NyZWF0ZV9yZXF1ZXN0IHJlcXVlc3Q7CisKKwlyZXF1ZXN0LmludGYxX2lkID0gaW50ZjFfaWQ7CisJcmVxdWVzdC5jcG9ydDFfaWQgPSBjcHVfdG9fbGUxNihjcG9ydDFfaWQpOworCXJlcXVlc3QuaW50ZjJfaWQgPSBpbnRmMl9pZDsKKwlyZXF1ZXN0LmNwb3J0Ml9pZCA9IGNwdV90b19sZTE2KGNwb3J0Ml9pZCk7CisJcmVxdWVzdC50YyA9IDA7CQkvKiBUQzAgKi8KKwlyZXF1ZXN0LmZsYWdzID0gY3BvcnRfZmxhZ3M7CisKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmMoc3ZjLT5jb25uZWN0aW9uLCBHQl9TVkNfVFlQRV9DT05OX0NSRUFURSwKKwkJCQkgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgTlVMTCwgMCk7Cit9CisKK3ZvaWQgZ2Jfc3ZjX2Nvbm5lY3Rpb25fZGVzdHJveShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGYxX2lkLCB1MTYgY3BvcnQxX2lkLAorCQkJICAgICAgIHU4IGludGYyX2lkLCB1MTYgY3BvcnQyX2lkKQoreworCXN0cnVjdCBnYl9zdmNfY29ubl9kZXN0cm95X3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IHN2Yy0+Y29ubmVjdGlvbjsKKwlpbnQgcmV0OworCisJcmVxdWVzdC5pbnRmMV9pZCA9IGludGYxX2lkOworCXJlcXVlc3QuY3BvcnQxX2lkID0gY3B1X3RvX2xlMTYoY3BvcnQxX2lkKTsKKwlyZXF1ZXN0LmludGYyX2lkID0gaW50ZjJfaWQ7CisJcmVxdWVzdC5jcG9ydDJfaWQgPSBjcHVfdG9fbGUxNihjcG9ydDJfaWQpOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfU1ZDX1RZUEVfQ09OTl9ERVNUUk9ZLAorCQkJCSZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsICJmYWlsZWQgdG8gZGVzdHJveSBjb25uZWN0aW9uICgldToldSAldToldSk6ICVkXG4iLAorCQkJCWludGYxX2lkLCBjcG9ydDFfaWQsIGludGYyX2lkLCBjcG9ydDJfaWQsIHJldCk7CisJfQorfQorCitpbnQgZ2Jfc3ZjX3RpbWVzeW5jX2VuYWJsZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGNvdW50LCB1NjQgZnJhbWVfdGltZSwKKwkJCSAgIHUzMiBzdHJvYmVfZGVsYXksIHUzMiByZWZjbGspCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBzdmMtPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX3N2Y190aW1lc3luY19lbmFibGVfcmVxdWVzdCByZXF1ZXN0OworCisJcmVxdWVzdC5jb3VudCA9IGNvdW50OworCXJlcXVlc3QuZnJhbWVfdGltZSA9IGNwdV90b19sZTY0KGZyYW1lX3RpbWUpOworCXJlcXVlc3Quc3Ryb2JlX2RlbGF5ID0gY3B1X3RvX2xlMzIoc3Ryb2JlX2RlbGF5KTsKKwlyZXF1ZXN0LnJlZmNsayA9IGNwdV90b19sZTMyKHJlZmNsayk7CisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sCisJCQkJIEdCX1NWQ19UWVBFX1RJTUVTWU5DX0VOQUJMRSwKKwkJCQkgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgTlVMTCwgMCk7Cit9CisKK2ludCBnYl9zdmNfdGltZXN5bmNfZGlzYWJsZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBzdmMtPmNvbm5lY3Rpb247CisKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwKKwkJCQkgR0JfU1ZDX1RZUEVfVElNRVNZTkNfRElTQUJMRSwKKwkJCQkgTlVMTCwgMCwgTlVMTCwgMCk7Cit9CisKK2ludCBnYl9zdmNfdGltZXN5bmNfYXV0aG9yaXRhdGl2ZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU2NCAqZnJhbWVfdGltZSkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IHN2Yy0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2Jfc3ZjX3RpbWVzeW5jX2F1dGhvcml0YXRpdmVfcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IHJldCwgaTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sCisJCQkJR0JfU1ZDX1RZUEVfVElNRVNZTkNfQVVUSE9SSVRBVElWRSwgTlVMTCwgMCwKKwkJCQkmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IEdCX1RJTUVTWU5DX01BWF9TVFJPQkVTOyBpKyspCisJCWZyYW1lX3RpbWVbaV0gPSBsZTY0X3RvX2NwdShyZXNwb25zZS5mcmFtZV90aW1lW2ldKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGdiX3N2Y190aW1lc3luY19waW5nKHN0cnVjdCBnYl9zdmMgKnN2YywgdTY0ICpmcmFtZV90aW1lKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gc3ZjLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9zdmNfdGltZXN5bmNfcGluZ19yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwKKwkJCQlHQl9TVkNfVFlQRV9USU1FU1lOQ19QSU5HLAorCQkJCU5VTEwsIDAsCisJCQkJJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCSpmcmFtZV90aW1lID0gbGU2NF90b19jcHUocmVzcG9uc2UuZnJhbWVfdGltZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBnYl9zdmNfdGltZXN5bmNfd2FrZV9waW5zX2FjcXVpcmUoc3RydWN0IGdiX3N2YyAqc3ZjLCB1MzIgc3Ryb2JlX21hc2spCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBzdmMtPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX3N2Y190aW1lc3luY193YWtlX3BpbnNfYWNxdWlyZV9yZXF1ZXN0IHJlcXVlc3Q7CisKKwlyZXF1ZXN0LnN0cm9iZV9tYXNrID0gY3B1X3RvX2xlMzIoc3Ryb2JlX21hc2spOworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLAorCQkJCSBHQl9TVkNfVFlQRV9USU1FU1lOQ19XQUtFX1BJTlNfQUNRVUlSRSwKKwkJCQkgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwKKwkJCQkgTlVMTCwgMCk7Cit9CisKK2ludCBnYl9zdmNfdGltZXN5bmNfd2FrZV9waW5zX3JlbGVhc2Uoc3RydWN0IGdiX3N2YyAqc3ZjKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gc3ZjLT5jb25uZWN0aW9uOworCisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sCisJCQkJIEdCX1NWQ19UWVBFX1RJTUVTWU5DX1dBS0VfUElOU19SRUxFQVNFLAorCQkJCSBOVUxMLCAwLCBOVUxMLCAwKTsKK30KKworLyogQ3JlYXRlcyBiaS1kaXJlY3Rpb25hbCByb3V0ZXMgYmV0d2VlbiB0aGUgZGV2aWNlcyAqLworaW50IGdiX3N2Y19yb3V0ZV9jcmVhdGUoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBpbnRmMV9pZCwgdTggZGV2MV9pZCwKKwkJCSAgICAgICB1OCBpbnRmMl9pZCwgdTggZGV2Ml9pZCkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX3JvdXRlX2NyZWF0ZV9yZXF1ZXN0IHJlcXVlc3Q7CisKKwlyZXF1ZXN0LmludGYxX2lkID0gaW50ZjFfaWQ7CisJcmVxdWVzdC5kZXYxX2lkID0gZGV2MV9pZDsKKwlyZXF1ZXN0LmludGYyX2lkID0gaW50ZjJfaWQ7CisJcmVxdWVzdC5kZXYyX2lkID0gZGV2Ml9pZDsKKworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhzdmMtPmNvbm5lY3Rpb24sIEdCX1NWQ19UWVBFX1JPVVRFX0NSRUFURSwKKwkJCQkgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgTlVMTCwgMCk7Cit9CisKKy8qIERlc3Ryb3lzIGJpLWRpcmVjdGlvbmFsIHJvdXRlcyBiZXR3ZWVuIHRoZSBkZXZpY2VzICovCit2b2lkIGdiX3N2Y19yb3V0ZV9kZXN0cm95KHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50ZjFfaWQsIHU4IGludGYyX2lkKQoreworCXN0cnVjdCBnYl9zdmNfcm91dGVfZGVzdHJveV9yZXF1ZXN0IHJlcXVlc3Q7CisJaW50IHJldDsKKworCXJlcXVlc3QuaW50ZjFfaWQgPSBpbnRmMV9pZDsKKwlyZXF1ZXN0LmludGYyX2lkID0gaW50ZjJfaWQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhzdmMtPmNvbm5lY3Rpb24sIEdCX1NWQ19UWVBFX1JPVVRFX0RFU1RST1ksCisJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgTlVMTCwgMCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgImZhaWxlZCB0byBkZXN0cm95IHJvdXRlICgldSAldSk6ICVkXG4iLAorCQkJCWludGYxX2lkLCBpbnRmMl9pZCwgcmV0KTsKKwl9Cit9CisKK2ludCBnYl9zdmNfaW50Zl9zZXRfcG93ZXJfbW9kZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQsIHU4IGhzX3NlcmllcywKKwkJCSAgICAgICB1OCB0eF9tb2RlLCB1OCB0eF9nZWFyLCB1OCB0eF9ubGFuZXMsCisJCQkgICAgICAgdTggdHhfYW1wbGl0dWRlLCB1OCB0eF9oc19lcXVhbGl6ZXIsCisJCQkgICAgICAgdTggcnhfbW9kZSwgdTggcnhfZ2VhciwgdTggcnhfbmxhbmVzLAorCQkJICAgICAgIHU4IGZsYWdzLCB1MzIgcXVpcmtzLAorCQkJICAgICAgIHN0cnVjdCBnYl9zdmNfbDJfdGltZXJfY2ZnICpsb2NhbCwKKwkJCSAgICAgICBzdHJ1Y3QgZ2Jfc3ZjX2wyX3RpbWVyX2NmZyAqcmVtb3RlKQoreworCXN0cnVjdCBnYl9zdmNfaW50Zl9zZXRfcHdybV9yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGdiX3N2Y19pbnRmX3NldF9wd3JtX3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQ7CisJdTE2IHJlc3VsdF9jb2RlOworCisJbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YocmVxdWVzdCkpOworCisJcmVxdWVzdC5pbnRmX2lkID0gaW50Zl9pZDsKKwlyZXF1ZXN0LmhzX3NlcmllcyA9IGhzX3NlcmllczsKKwlyZXF1ZXN0LnR4X21vZGUgPSB0eF9tb2RlOworCXJlcXVlc3QudHhfZ2VhciA9IHR4X2dlYXI7CisJcmVxdWVzdC50eF9ubGFuZXMgPSB0eF9ubGFuZXM7CisJcmVxdWVzdC50eF9hbXBsaXR1ZGUgPSB0eF9hbXBsaXR1ZGU7CisJcmVxdWVzdC50eF9oc19lcXVhbGl6ZXIgPSB0eF9oc19lcXVhbGl6ZXI7CisJcmVxdWVzdC5yeF9tb2RlID0gcnhfbW9kZTsKKwlyZXF1ZXN0LnJ4X2dlYXIgPSByeF9nZWFyOworCXJlcXVlc3QucnhfbmxhbmVzID0gcnhfbmxhbmVzOworCXJlcXVlc3QuZmxhZ3MgPSBmbGFnczsKKwlyZXF1ZXN0LnF1aXJrcyA9IGNwdV90b19sZTMyKHF1aXJrcyk7CisJaWYgKGxvY2FsKQorCQlyZXF1ZXN0LmxvY2FsX2wydGltZXJkYXRhID0gKmxvY2FsOworCWlmIChyZW1vdGUpCisJCXJlcXVlc3QucmVtb3RlX2wydGltZXJkYXRhID0gKnJlbW90ZTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKHN2Yy0+Y29ubmVjdGlvbiwgR0JfU1ZDX1RZUEVfSU5URl9TRVRfUFdSTSwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLAorCQkJCSZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXN1bHRfY29kZSA9IHJlc3BvbnNlLnJlc3VsdF9jb2RlOworCWlmIChyZXN1bHRfY29kZSAhPSBHQl9TVkNfU0VUUFdSTV9QV1JfTE9DQUwpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsICJzZXQgcG93ZXIgbW9kZSA9ICVkXG4iLCByZXN1bHRfY29kZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2Jfc3ZjX2ludGZfc2V0X3Bvd2VyX21vZGUpOworCitpbnQgZ2Jfc3ZjX2ludGZfc2V0X3Bvd2VyX21vZGVfaGliZXJuYXRlKHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX2ludGZfc2V0X3B3cm1fcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9zdmNfaW50Zl9zZXRfcHdybV9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCXUxNiByZXN1bHRfY29kZTsKKworCW1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKHJlcXVlc3QpKTsKKworCXJlcXVlc3QuaW50Zl9pZCA9IGludGZfaWQ7CisJcmVxdWVzdC5oc19zZXJpZXMgPSBHQl9TVkNfVU5JUFJPX0hTX1NFUklFU19BOworCXJlcXVlc3QudHhfbW9kZSA9IEdCX1NWQ19VTklQUk9fSElCRVJOQVRFX01PREU7CisJcmVxdWVzdC5yeF9tb2RlID0gR0JfU1ZDX1VOSVBST19ISUJFUk5BVEVfTU9ERTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKHN2Yy0+Y29ubmVjdGlvbiwgR0JfU1ZDX1RZUEVfSU5URl9TRVRfUFdSTSwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLAorCQkJCSZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsCisJCQkiZmFpbGVkIHRvIHNlbmQgc2V0IHBvd2VyIG1vZGUgb3BlcmF0aW9uIHRvIGludGVyZmFjZSAldTogJWRcbiIsCisJCQlpbnRmX2lkLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJlc3VsdF9jb2RlID0gcmVzcG9uc2UucmVzdWx0X2NvZGU7CisJaWYgKHJlc3VsdF9jb2RlICE9IEdCX1NWQ19TRVRQV1JNX1BXUl9PSykgeworCQlkZXZfZXJyKCZzdmMtPmRldiwKKwkJCSJmYWlsZWQgdG8gaGliZXJuYXRlIHRoZSBsaW5rIGZvciBpbnRlcmZhY2UgJXU6ICV1XG4iLAorCQkJaW50Zl9pZCwgcmVzdWx0X2NvZGUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdiX3N2Y19waW5nKHN0cnVjdCBnYl9zdmMgKnN2YykKK3sKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmNfdGltZW91dChzdmMtPmNvbm5lY3Rpb24sIEdCX1NWQ19UWVBFX1BJTkcsCisJCQkJCSBOVUxMLCAwLCBOVUxMLCAwLAorCQkJCQkgR0JfT1BFUkFUSU9OX1RJTUVPVVRfREVGQVVMVCAqIDIpOworfQorCitzdGF0aWMgaW50IGdiX3N2Y192ZXJzaW9uX3JlcXVlc3Qoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKGNvbm5lY3Rpb24pOworCXN0cnVjdCBnYl9zdmNfdmVyc2lvbl9yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBnYl9zdmNfdmVyc2lvbl9yZXNwb25zZSAqcmVzcG9uc2U7CisKKwlpZiAob3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSA8IHNpemVvZigqcmVxdWVzdCkpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsICJzaG9ydCB2ZXJzaW9uIHJlcXVlc3QgKCV6dSA8ICV6dSlcbiIsCisJCQkJb3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSwKKwkJCQlzaXplb2YoKnJlcXVlc3QpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVxdWVzdCA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCisJaWYgKHJlcXVlc3QtPm1ham9yID4gR0JfU1ZDX1ZFUlNJT05fTUFKT1IpIHsKKwkJZGV2X3dhcm4oJnN2Yy0+ZGV2LCAidW5zdXBwb3J0ZWQgbWFqb3IgdmVyc2lvbiAoJXUgPiAldSlcbiIsCisJCQkJcmVxdWVzdC0+bWFqb3IsIEdCX1NWQ19WRVJTSU9OX01BSk9SKTsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwlzdmMtPnByb3RvY29sX21ham9yID0gcmVxdWVzdC0+bWFqb3I7CisJc3ZjLT5wcm90b2NvbF9taW5vciA9IHJlcXVlc3QtPm1pbm9yOworCisJaWYgKCFnYl9vcGVyYXRpb25fcmVzcG9uc2VfYWxsb2Mob3AsIHNpemVvZigqcmVzcG9uc2UpLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXNwb25zZSA9IG9wLT5yZXNwb25zZS0+cGF5bG9hZDsKKwlyZXNwb25zZS0+bWFqb3IgPSBzdmMtPnByb3RvY29sX21ham9yOworCXJlc3BvbnNlLT5taW5vciA9IHN2Yy0+cHJvdG9jb2xfbWlub3I7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgcHdyX2RlYnVnZnNfdm9sdGFnZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCkKK3sKKwlzdHJ1Y3Qgc3ZjX2RlYnVnZnNfcHdybW9uX3JhaWwgKnB3cm1vbl9yYWlscyA9IGZpbGUtPmZfaW5vZGUtPmlfcHJpdmF0ZTsKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBwd3Jtb25fcmFpbHMtPnN2YzsKKwlpbnQgcmV0LCBkZXNjOworCXUzMiB2YWx1ZTsKKwljaGFyIGJ1ZmZbMTZdOworCisJcmV0ID0gZ2Jfc3ZjX3B3cm1vbl9zYW1wbGVfZ2V0KHN2YywgcHdybW9uX3JhaWxzLT5pZCwKKwkJCQkgICAgICAgR0JfU1ZDX1BXUk1PTl9UWVBFX1ZPTCwgJnZhbHVlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LAorCQkJImZhaWxlZCB0byBnZXQgdm9sdGFnZSBzYW1wbGUgJXU6ICVkXG4iLAorCQkJcHdybW9uX3JhaWxzLT5pZCwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXNjID0gc2NucHJpbnRmKGJ1ZmYsIHNpemVvZihidWZmKSwgIiV1XG4iLCB2YWx1ZSk7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBsZW4sIG9mZnNldCwgYnVmZiwgZGVzYyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHB3cl9kZWJ1Z2ZzX2N1cnJlbnRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJc3RydWN0IHN2Y19kZWJ1Z2ZzX3B3cm1vbl9yYWlsICpwd3Jtb25fcmFpbHMgPSBmaWxlLT5mX2lub2RlLT5pX3ByaXZhdGU7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gcHdybW9uX3JhaWxzLT5zdmM7CisJaW50IHJldCwgZGVzYzsKKwl1MzIgdmFsdWU7CisJY2hhciBidWZmWzE2XTsKKworCXJldCA9IGdiX3N2Y19wd3Jtb25fc2FtcGxlX2dldChzdmMsIHB3cm1vbl9yYWlscy0+aWQsCisJCQkJICAgICAgIEdCX1NWQ19QV1JNT05fVFlQRV9DVVJSLCAmdmFsdWUpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsCisJCQkiZmFpbGVkIHRvIGdldCBjdXJyZW50IHNhbXBsZSAldTogJWRcbiIsCisJCQlwd3Jtb25fcmFpbHMtPmlkLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRlc2MgPSBzY25wcmludGYoYnVmZiwgc2l6ZW9mKGJ1ZmYpLCAiJXVcbiIsIHZhbHVlKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGxlbiwgb2Zmc2V0LCBidWZmLCBkZXNjKTsKK30KKworc3RhdGljIHNzaXplX3QgcHdyX2RlYnVnZnNfcG93ZXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCkKK3sKKwlzdHJ1Y3Qgc3ZjX2RlYnVnZnNfcHdybW9uX3JhaWwgKnB3cm1vbl9yYWlscyA9IGZpbGUtPmZfaW5vZGUtPmlfcHJpdmF0ZTsKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBwd3Jtb25fcmFpbHMtPnN2YzsKKwlpbnQgcmV0LCBkZXNjOworCXUzMiB2YWx1ZTsKKwljaGFyIGJ1ZmZbMTZdOworCisJcmV0ID0gZ2Jfc3ZjX3B3cm1vbl9zYW1wbGVfZ2V0KHN2YywgcHdybW9uX3JhaWxzLT5pZCwKKwkJCQkgICAgICAgR0JfU1ZDX1BXUk1PTl9UWVBFX1BXUiwgJnZhbHVlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LCAiZmFpbGVkIHRvIGdldCBwb3dlciBzYW1wbGUgJXU6ICVkXG4iLAorCQkJcHdybW9uX3JhaWxzLT5pZCwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXNjID0gc2NucHJpbnRmKGJ1ZmYsIHNpemVvZihidWZmKSwgIiV1XG4iLCB2YWx1ZSk7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBsZW4sIG9mZnNldCwgYnVmZiwgZGVzYyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHB3cm1vbl9kZWJ1Z2ZzX3ZvbHRhZ2VfZm9wcyA9IHsKKwkucmVhZAkJPSBwd3JfZGVidWdmc192b2x0YWdlX3JlYWQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwd3Jtb25fZGVidWdmc19jdXJyZW50X2ZvcHMgPSB7CisJLnJlYWQJCT0gcHdyX2RlYnVnZnNfY3VycmVudF9yZWFkLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHdybW9uX2RlYnVnZnNfcG93ZXJfZm9wcyA9IHsKKwkucmVhZAkJPSBwd3JfZGVidWdmc19wb3dlcl9yZWFkLAorfTsKKworc3RhdGljIHZvaWQgZ2Jfc3ZjX3B3cm1vbl9kZWJ1Z2ZzX2luaXQoc3RydWN0IGdiX3N2YyAqc3ZjKQoreworCWludCBpOworCXNpemVfdCBidWZzaXplOworCXN0cnVjdCBkZW50cnkgKmRlbnQ7CisJc3RydWN0IGdiX3N2Y19wd3Jtb25fcmFpbF9uYW1lc19nZXRfcmVzcG9uc2UgKnJhaWxfbmFtZXM7CisJdTggcmFpbF9jb3VudDsKKworCWRlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInB3cm1vbiIsIHN2Yy0+ZGVidWdmc19kZW50cnkpOworCWlmIChJU19FUlJfT1JfTlVMTChkZW50KSkKKwkJcmV0dXJuOworCisJaWYgKGdiX3N2Y19wd3Jtb25fcmFpbF9jb3VudF9nZXQoc3ZjLCAmcmFpbF9jb3VudCkpCisJCWdvdG8gZXJyX3B3cm1vbl9kZWJ1Z2ZzOworCisJaWYgKCFyYWlsX2NvdW50IHx8IHJhaWxfY291bnQgPiBHQl9TVkNfUFdSTU9OX01BWF9SQUlMX0NPVU5UKQorCQlnb3RvIGVycl9wd3Jtb25fZGVidWdmczsKKworCWJ1ZnNpemUgPSBzaXplb2YoKnJhaWxfbmFtZXMpICsKKwkJR0JfU1ZDX1BXUk1PTl9SQUlMX05BTUVfQlVGU0laRSAqIHJhaWxfY291bnQ7CisKKwlyYWlsX25hbWVzID0ga3phbGxvYyhidWZzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJhaWxfbmFtZXMpCisJCWdvdG8gZXJyX3B3cm1vbl9kZWJ1Z2ZzOworCisJc3ZjLT5wd3Jtb25fcmFpbHMgPSBrY2FsbG9jKHJhaWxfY291bnQsIHNpemVvZigqc3ZjLT5wd3Jtb25fcmFpbHMpLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXN2Yy0+cHdybW9uX3JhaWxzKQorCQlnb3RvIGVycl9wd3Jtb25fZGVidWdmc19mcmVlOworCisJaWYgKGdiX3N2Y19wd3Jtb25fcmFpbF9uYW1lc19nZXQoc3ZjLCByYWlsX25hbWVzLCBidWZzaXplKSkKKwkJZ290byBlcnJfcHdybW9uX2RlYnVnZnNfZnJlZTsKKworCWZvciAoaSA9IDA7IGkgPCByYWlsX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGRlbnRyeSAqZGlyOworCQlzdHJ1Y3Qgc3ZjX2RlYnVnZnNfcHdybW9uX3JhaWwgKnJhaWwgPSAmc3ZjLT5wd3Jtb25fcmFpbHNbaV07CisJCWNoYXIgZm5hbWVbR0JfU1ZDX1BXUk1PTl9SQUlMX05BTUVfQlVGU0laRV07CisKKwkJc25wcmludGYoZm5hbWUsIHNpemVvZihmbmFtZSksICIlcyIsCisJCQkgKGNoYXIgKikmcmFpbF9uYW1lcy0+bmFtZVtpXSk7CisKKwkJcmFpbC0+aWQgPSBpOworCQlyYWlsLT5zdmMgPSBzdmM7CisKKwkJZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGZuYW1lLCBkZW50KTsKKwkJZGVidWdmc19jcmVhdGVfZmlsZSgidm9sdGFnZV9ub3ciLCBTX0lSVUdPLCBkaXIsIHJhaWwsCisJCQkJICAgICZwd3Jtb25fZGVidWdmc192b2x0YWdlX2ZvcHMpOworCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJjdXJyZW50X25vdyIsIFNfSVJVR08sIGRpciwgcmFpbCwKKwkJCQkgICAgJnB3cm1vbl9kZWJ1Z2ZzX2N1cnJlbnRfZm9wcyk7CisJCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInBvd2VyX25vdyIsIFNfSVJVR08sIGRpciwgcmFpbCwKKwkJCQkgICAgJnB3cm1vbl9kZWJ1Z2ZzX3Bvd2VyX2ZvcHMpOworCX0KKworCWtmcmVlKHJhaWxfbmFtZXMpOworCXJldHVybjsKKworZXJyX3B3cm1vbl9kZWJ1Z2ZzX2ZyZWU6CisJa2ZyZWUocmFpbF9uYW1lcyk7CisJa2ZyZWUoc3ZjLT5wd3Jtb25fcmFpbHMpOworCXN2Yy0+cHdybW9uX3JhaWxzID0gTlVMTDsKKworZXJyX3B3cm1vbl9kZWJ1Z2ZzOgorCWRlYnVnZnNfcmVtb3ZlKGRlbnQpOworfQorCitzdGF0aWMgdm9pZCBnYl9zdmNfZGVidWdmc19pbml0KHN0cnVjdCBnYl9zdmMgKnN2YykKK3sKKwlzdmMtPmRlYnVnZnNfZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZGlyKGRldl9uYW1lKCZzdmMtPmRldiksCisJCQkJCQkgZ2JfZGVidWdmc19nZXQoKSk7CisJZ2Jfc3ZjX3B3cm1vbl9kZWJ1Z2ZzX2luaXQoc3ZjKTsKK30KKworc3RhdGljIHZvaWQgZ2Jfc3ZjX2RlYnVnZnNfZXhpdChzdHJ1Y3QgZ2Jfc3ZjICpzdmMpCit7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHN2Yy0+ZGVidWdmc19kZW50cnkpOworCWtmcmVlKHN2Yy0+cHdybW9uX3JhaWxzKTsKKwlzdmMtPnB3cm1vbl9yYWlscyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZ2Jfc3ZjX2hlbGxvKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3AtPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2Jfc3ZjX2hlbGxvX3JlcXVlc3QgKmhlbGxvX3JlcXVlc3Q7CisJaW50IHJldDsKKworCWlmIChvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplIDwgc2l6ZW9mKCpoZWxsb19yZXF1ZXN0KSkgeworCQlkZXZfd2Fybigmc3ZjLT5kZXYsICJzaG9ydCBoZWxsbyByZXF1ZXN0ICglenUgPCAlenUpXG4iLAorCQkJCW9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUsCisJCQkJc2l6ZW9mKCpoZWxsb19yZXF1ZXN0KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWhlbGxvX3JlcXVlc3QgPSBvcC0+cmVxdWVzdC0+cGF5bG9hZDsKKwlzdmMtPmVuZG9faWQgPSBsZTE2X3RvX2NwdShoZWxsb19yZXF1ZXN0LT5lbmRvX2lkKTsKKwlzdmMtPmFwX2ludGZfaWQgPSBoZWxsb19yZXF1ZXN0LT5pbnRlcmZhY2VfaWQ7CisKKwlyZXQgPSBkZXZpY2VfYWRkKCZzdmMtPmRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBzdmMgZGV2aWNlOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBnYl9zdmNfd2F0Y2hkb2dfY3JlYXRlKHN2Yyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgd2F0Y2hkb2c6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl91bnJlZ2lzdGVyX2RldmljZTsKKwl9CisKKwlnYl9zdmNfZGVidWdmc19pbml0KHN2Yyk7CisKKwlyZXQgPSBnYl90aW1lc3luY19zdmNfYWRkKHN2Yyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgImZhaWxlZCB0byBhZGQgU1ZDIHRvIHRpbWVzeW5jOiAlZFxuIiwgcmV0KTsKKwkJZ2Jfc3ZjX2RlYnVnZnNfZXhpdChzdmMpOworCQlnb3RvIGVycl91bnJlZ2lzdGVyX2RldmljZTsKKwl9CisKKwlyZXR1cm4gZ2Jfc3ZjX3F1ZXVlX2RlZmVycmVkX3JlcXVlc3Qob3ApOworCitlcnJfdW5yZWdpc3Rlcl9kZXZpY2U6CisJZ2Jfc3ZjX3dhdGNoZG9nX2Rlc3Ryb3koc3ZjKTsKKwlkZXZpY2VfZGVsKCZzdmMtPmRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBnYl9pbnRlcmZhY2UgKmdiX3N2Y19pbnRlcmZhY2VfbG9va3VwKHN0cnVjdCBnYl9zdmMgKnN2YywKKwkJCQkJCQl1OCBpbnRmX2lkKQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSBzdmMtPmhkOworCXN0cnVjdCBnYl9tb2R1bGUgKm1vZHVsZTsKKwlzaXplX3QgbnVtX2ludGVyZmFjZXM7CisJdTggbW9kdWxlX2lkOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2R1bGUsICZoZC0+bW9kdWxlcywgaGRfbm9kZSkgeworCQltb2R1bGVfaWQgPSBtb2R1bGUtPm1vZHVsZV9pZDsKKwkJbnVtX2ludGVyZmFjZXMgPSBtb2R1bGUtPm51bV9pbnRlcmZhY2VzOworCisJCWlmIChpbnRmX2lkID49IG1vZHVsZV9pZCAmJgorCQkJCWludGZfaWQgPCBtb2R1bGVfaWQgKyBudW1faW50ZXJmYWNlcykgeworCQkJcmV0dXJuIG1vZHVsZS0+aW50ZXJmYWNlc1tpbnRmX2lkIC0gbW9kdWxlX2lkXTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGdiX21vZHVsZSAqZ2Jfc3ZjX21vZHVsZV9sb29rdXAoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBtb2R1bGVfaWQpCit7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCA9IHN2Yy0+aGQ7CisJc3RydWN0IGdiX21vZHVsZSAqbW9kdWxlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2R1bGUsICZoZC0+bW9kdWxlcywgaGRfbm9kZSkgeworCQlpZiAobW9kdWxlLT5tb2R1bGVfaWQgPT0gbW9kdWxlX2lkKQorCQkJcmV0dXJuIG1vZHVsZTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZ2Jfc3ZjX3Byb2Nlc3NfaGVsbG9fZGVmZXJyZWQoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3BlcmF0aW9uLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoY29ubmVjdGlvbik7CisJaW50IHJldDsKKworCS8qCisJICogWFhYIFRoaXMgaXMgYSBoYWNrL3dvcmstYXJvdW5kIHRvIHJlY29uZmlndXJlIHRoZSBBUEJyaWRnZUEtU3dpdGNoCisJICogbGluayB0byBQV00gRzIsIDEgTGFuZSwgU2xvdyBBdXRvLCBzbyB0aGF0IGl0IGhhcyBzdWZmaWNpZW50CisJICogYmFuZHdpZHRoIGZvciAzIGF1ZGlvIHN0cmVhbXMgcGx1cyBib290LW92ZXItVW5pUHJvIG9mIGEgaG90LXBsdWdnZWQKKwkgKiBtb2R1bGUuCisJICoKKwkgKiBUaGUgY29kZSBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIFNXLTIyMTcsIEhldXJpc3RpYyBmb3IgVW5pUHJvCisJICogUG93ZXIgTW9kZSBDaGFuZ2VzIGlzIHJlc29sdmVkLgorCSAqLworCXJldCA9IGdiX3N2Y19pbnRmX3NldF9wb3dlcl9tb2RlKHN2Yywgc3ZjLT5hcF9pbnRmX2lkLAorCQkJCQlHQl9TVkNfVU5JUFJPX0hTX1NFUklFU19BLAorCQkJCQlHQl9TVkNfVU5JUFJPX1NMT1dfQVVUT19NT0RFLAorCQkJCQkyLCAxLAorCQkJCQlHQl9TVkNfU01BTExfQU1QTElUVURFLCBHQl9TVkNfTk9fREVfRU1QSEFTSVMsCisJCQkJCUdCX1NWQ19VTklQUk9fU0xPV19BVVRPX01PREUsCisJCQkJCTIsIDEsCisJCQkJCTAsIDAsCisJCQkJCU5VTEwsIE5VTEwpOworCisJaWYgKHJldCkKKwkJZGV2X3dhcm4oJnN2Yy0+ZGV2LAorCQkJInBvd2VyIG1vZGUgY2hhbmdlIGZhaWxlZCBvbiBBUCB0byBzd2l0Y2ggbGluazogJWRcbiIsCisJCQlyZXQpOworfQorCitzdGF0aWMgdm9pZCBnYl9zdmNfcHJvY2Vzc19tb2R1bGVfaW5zZXJ0ZWQoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKQoreworCXN0cnVjdCBnYl9zdmNfbW9kdWxlX2luc2VydGVkX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcGVyYXRpb24tPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gc3ZjLT5oZDsKKwlzdHJ1Y3QgZ2JfbW9kdWxlICptb2R1bGU7CisJc2l6ZV90IG51bV9pbnRlcmZhY2VzOworCXU4IG1vZHVsZV9pZDsKKwl1MTYgZmxhZ3M7CisJaW50IHJldDsKKworCS8qIFRoZSByZXF1ZXN0IG1lc3NhZ2Ugc2l6ZSBoYXMgYWxyZWFkeSBiZWVuIHZlcmlmaWVkLiAqLworCXJlcXVlc3QgPSBvcGVyYXRpb24tPnJlcXVlc3QtPnBheWxvYWQ7CisJbW9kdWxlX2lkID0gcmVxdWVzdC0+cHJpbWFyeV9pbnRmX2lkOworCW51bV9pbnRlcmZhY2VzID0gcmVxdWVzdC0+aW50Zl9jb3VudDsKKwlmbGFncyA9IGxlMTZfdG9fY3B1KHJlcXVlc3QtPmZsYWdzKTsKKworCWRldl9kYmcoJnN2Yy0+ZGV2LCAiJXMgLSBpZCA9ICV1LCBudW1faW50ZXJmYWNlcyA9ICV6dSwgZmxhZ3MgPSAweCUwNHhcbiIsCisJCQlfX2Z1bmNfXywgbW9kdWxlX2lkLCBudW1faW50ZXJmYWNlcywgZmxhZ3MpOworCisJaWYgKGZsYWdzICYgR0JfU1ZDX01PRFVMRV9JTlNFUlRFRF9GTEFHX05PX1BSSU1BUlkpIHsKKwkJZGV2X3dhcm4oJnN2Yy0+ZGV2LCAibm8gcHJpbWFyeSBpbnRlcmZhY2UgZGV0ZWN0ZWQgb24gbW9kdWxlICV1XG4iLAorCQkJCW1vZHVsZV9pZCk7CisJfQorCisJbW9kdWxlID0gZ2Jfc3ZjX21vZHVsZV9sb29rdXAoc3ZjLCBtb2R1bGVfaWQpOworCWlmIChtb2R1bGUpIHsKKwkJZGV2X3dhcm4oJnN2Yy0+ZGV2LCAidW5leHBlY3RlZCBtb2R1bGUtaW5zZXJ0ZWQgZXZlbnQgJXVcbiIsCisJCQkJbW9kdWxlX2lkKTsKKwkJcmV0dXJuOworCX0KKworCW1vZHVsZSA9IGdiX21vZHVsZV9jcmVhdGUoaGQsIG1vZHVsZV9pZCwgbnVtX2ludGVyZmFjZXMpOworCWlmICghbW9kdWxlKSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBtb2R1bGVcbiIpOworCQlyZXR1cm47CisJfQorCisJcmV0ID0gZ2JfbW9kdWxlX2FkZChtb2R1bGUpOworCWlmIChyZXQpIHsKKwkJZ2JfbW9kdWxlX3B1dChtb2R1bGUpOworCQlyZXR1cm47CisJfQorCisJbGlzdF9hZGQoJm1vZHVsZS0+aGRfbm9kZSwgJmhkLT5tb2R1bGVzKTsKK30KKworc3RhdGljIHZvaWQgZ2Jfc3ZjX3Byb2Nlc3NfbW9kdWxlX3JlbW92ZWQoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKQoreworCXN0cnVjdCBnYl9zdmNfbW9kdWxlX3JlbW92ZWRfcmVxdWVzdCAqcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wZXJhdGlvbi0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKGNvbm5lY3Rpb24pOworCXN0cnVjdCBnYl9tb2R1bGUgKm1vZHVsZTsKKwl1OCBtb2R1bGVfaWQ7CisKKwkvKiBUaGUgcmVxdWVzdCBtZXNzYWdlIHNpemUgaGFzIGFscmVhZHkgYmVlbiB2ZXJpZmllZC4gKi8KKwlyZXF1ZXN0ID0gb3BlcmF0aW9uLT5yZXF1ZXN0LT5wYXlsb2FkOworCW1vZHVsZV9pZCA9IHJlcXVlc3QtPnByaW1hcnlfaW50Zl9pZDsKKworCWRldl9kYmcoJnN2Yy0+ZGV2LCAiJXMgLSBpZCA9ICV1XG4iLCBfX2Z1bmNfXywgbW9kdWxlX2lkKTsKKworCW1vZHVsZSA9IGdiX3N2Y19tb2R1bGVfbG9va3VwKHN2YywgbW9kdWxlX2lkKTsKKwlpZiAoIW1vZHVsZSkgeworCQlkZXZfd2Fybigmc3ZjLT5kZXYsICJ1bmV4cGVjdGVkIG1vZHVsZS1yZW1vdmVkIGV2ZW50ICV1XG4iLAorCQkJCW1vZHVsZV9pZCk7CisJCXJldHVybjsKKwl9CisKKwltb2R1bGUtPmRpc2Nvbm5lY3RlZCA9IHRydWU7CisKKwlnYl9tb2R1bGVfZGVsKG1vZHVsZSk7CisJbGlzdF9kZWwoJm1vZHVsZS0+aGRfbm9kZSk7CisJZ2JfbW9kdWxlX3B1dChtb2R1bGUpOworfQorCitzdGF0aWMgdm9pZCBnYl9zdmNfcHJvY2Vzc19pbnRmX29vcHMoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKQoreworCXN0cnVjdCBnYl9zdmNfaW50Zl9vb3BzX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcGVyYXRpb24tPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmOworCXU4IGludGZfaWQ7CisJdTggcmVhc29uOworCisJLyogVGhlIHJlcXVlc3QgbWVzc2FnZSBzaXplIGhhcyBhbHJlYWR5IGJlZW4gdmVyaWZpZWQuICovCisJcmVxdWVzdCA9IG9wZXJhdGlvbi0+cmVxdWVzdC0+cGF5bG9hZDsKKwlpbnRmX2lkID0gcmVxdWVzdC0+aW50Zl9pZDsKKwlyZWFzb24gPSByZXF1ZXN0LT5yZWFzb247CisKKwlpbnRmID0gZ2Jfc3ZjX2ludGVyZmFjZV9sb29rdXAoc3ZjLCBpbnRmX2lkKTsKKwlpZiAoIWludGYpIHsKKwkJZGV2X3dhcm4oJnN2Yy0+ZGV2LCAidW5leHBlY3RlZCBpbnRlcmZhY2Utb29wcyBldmVudCAldVxuIiwKKwkJCSBpbnRmX2lkKTsKKwkJcmV0dXJuOworCX0KKworCWRldl9pbmZvKCZzdmMtPmRldiwgIkRlYWN0aXZhdGluZyBpbnRlcmZhY2UgJXUsIGludGVyZmFjZSBvb3BzIHJlYXNvbiA9ICV1XG4iLAorCQkgaW50Zl9pZCwgcmVhc29uKTsKKworCW11dGV4X2xvY2soJmludGYtPm11dGV4KTsKKwlpbnRmLT5kaXNjb25uZWN0ZWQgPSB0cnVlOworCWdiX2ludGVyZmFjZV9kaXNhYmxlKGludGYpOworCWdiX2ludGVyZmFjZV9kZWFjdGl2YXRlKGludGYpOworCW11dGV4X3VubG9jaygmaW50Zi0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBnYl9zdmNfcHJvY2Vzc19pbnRmX21haWxib3hfZXZlbnQoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKQoreworCXN0cnVjdCBnYl9zdmNfaW50Zl9tYWlsYm94X2V2ZW50X3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcGVyYXRpb24tPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmOworCXU4IGludGZfaWQ7CisJdTE2IHJlc3VsdF9jb2RlOworCXUzMiBtYWlsYm94OworCisJLyogVGhlIHJlcXVlc3QgbWVzc2FnZSBzaXplIGhhcyBhbHJlYWR5IGJlZW4gdmVyaWZpZWQuICovCisJcmVxdWVzdCA9IG9wZXJhdGlvbi0+cmVxdWVzdC0+cGF5bG9hZDsKKwlpbnRmX2lkID0gcmVxdWVzdC0+aW50Zl9pZDsKKwlyZXN1bHRfY29kZSA9IGxlMTZfdG9fY3B1KHJlcXVlc3QtPnJlc3VsdF9jb2RlKTsKKwltYWlsYm94ID0gbGUzMl90b19jcHUocmVxdWVzdC0+bWFpbGJveCk7CisKKwlkZXZfZGJnKCZzdmMtPmRldiwgIiVzIC0gaWQgPSAldSwgcmVzdWx0ID0gMHglMDR4LCBtYWlsYm94ID0gMHglMDh4XG4iLAorCQkJX19mdW5jX18sIGludGZfaWQsIHJlc3VsdF9jb2RlLCBtYWlsYm94KTsKKworCWludGYgPSBnYl9zdmNfaW50ZXJmYWNlX2xvb2t1cChzdmMsIGludGZfaWQpOworCWlmICghaW50ZikgeworCQlkZXZfd2Fybigmc3ZjLT5kZXYsICJ1bmV4cGVjdGVkIG1haWxib3ggZXZlbnQgJXVcbiIsIGludGZfaWQpOworCQlyZXR1cm47CisJfQorCisJZ2JfaW50ZXJmYWNlX21haWxib3hfZXZlbnQoaW50ZiwgcmVzdWx0X2NvZGUsIG1haWxib3gpOworfQorCitzdGF0aWMgdm9pZCBnYl9zdmNfcHJvY2Vzc19kZWZlcnJlZF9yZXF1ZXN0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX2RlZmVycmVkX3JlcXVlc3QgKmRyOworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmM7CisJdTggdHlwZTsKKworCWRyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBnYl9zdmNfZGVmZXJyZWRfcmVxdWVzdCwgd29yayk7CisJb3BlcmF0aW9uID0gZHItPm9wZXJhdGlvbjsKKwlzdmMgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKG9wZXJhdGlvbi0+Y29ubmVjdGlvbik7CisJdHlwZSA9IG9wZXJhdGlvbi0+cmVxdWVzdC0+aGVhZGVyLT50eXBlOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBHQl9TVkNfVFlQRV9TVkNfSEVMTE86CisJCWdiX3N2Y19wcm9jZXNzX2hlbGxvX2RlZmVycmVkKG9wZXJhdGlvbik7CisJCWJyZWFrOworCWNhc2UgR0JfU1ZDX1RZUEVfTU9EVUxFX0lOU0VSVEVEOgorCQlnYl9zdmNfcHJvY2Vzc19tb2R1bGVfaW5zZXJ0ZWQob3BlcmF0aW9uKTsKKwkJYnJlYWs7CisJY2FzZSBHQl9TVkNfVFlQRV9NT0RVTEVfUkVNT1ZFRDoKKwkJZ2Jfc3ZjX3Byb2Nlc3NfbW9kdWxlX3JlbW92ZWQob3BlcmF0aW9uKTsKKwkJYnJlYWs7CisJY2FzZSBHQl9TVkNfVFlQRV9JTlRGX01BSUxCT1hfRVZFTlQ6CisJCWdiX3N2Y19wcm9jZXNzX2ludGZfbWFpbGJveF9ldmVudChvcGVyYXRpb24pOworCQlicmVhazsKKwljYXNlIEdCX1NWQ19UWVBFX0lOVEZfT09QUzoKKwkJZ2Jfc3ZjX3Byb2Nlc3NfaW50Zl9vb3BzKG9wZXJhdGlvbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJnN2Yy0+ZGV2LCAiYmFkIGRlZmVycmVkIHJlcXVlc3QgdHlwZTogMHglMDJ4XG4iLCB0eXBlKTsKKwl9CisKKwlnYl9vcGVyYXRpb25fcHV0KG9wZXJhdGlvbik7CisJa2ZyZWUoZHIpOworfQorCitzdGF0aWMgaW50IGdiX3N2Y19xdWV1ZV9kZWZlcnJlZF9yZXF1ZXN0KHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbikKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKG9wZXJhdGlvbi0+Y29ubmVjdGlvbik7CisJc3RydWN0IGdiX3N2Y19kZWZlcnJlZF9yZXF1ZXN0ICpkcjsKKworCWRyID0ga21hbGxvYyhzaXplb2YoKmRyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlnYl9vcGVyYXRpb25fZ2V0KG9wZXJhdGlvbik7CisKKwlkci0+b3BlcmF0aW9uID0gb3BlcmF0aW9uOworCUlOSVRfV09SSygmZHItPndvcmssIGdiX3N2Y19wcm9jZXNzX2RlZmVycmVkX3JlcXVlc3QpOworCisJcXVldWVfd29yayhzdmMtPndxLCAmZHItPndvcmspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2Jfc3ZjX2ludGZfcmVzZXRfcmVjdihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKG9wLT5jb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2JfbWVzc2FnZSAqcmVxdWVzdCA9IG9wLT5yZXF1ZXN0OworCXN0cnVjdCBnYl9zdmNfaW50Zl9yZXNldF9yZXF1ZXN0ICpyZXNldDsKKwl1OCBpbnRmX2lkOworCisJaWYgKHJlcXVlc3QtPnBheWxvYWRfc2l6ZSA8IHNpemVvZigqcmVzZXQpKSB7CisJCWRldl93YXJuKCZzdmMtPmRldiwgInNob3J0IHJlc2V0IHJlcXVlc3QgcmVjZWl2ZWQgKCV6dSA8ICV6dSlcbiIsCisJCQkJcmVxdWVzdC0+cGF5bG9hZF9zaXplLCBzaXplb2YoKnJlc2V0KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXNldCA9IHJlcXVlc3QtPnBheWxvYWQ7CisKKwlpbnRmX2lkID0gcmVzZXQtPmludGZfaWQ7CisKKwkvKiBGSVhNRSBSZXNldCB0aGUgaW50ZXJmYWNlIGhlcmUgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX3N2Y19tb2R1bGVfaW5zZXJ0ZWRfcmVjdihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKG9wLT5jb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2Jfc3ZjX21vZHVsZV9pbnNlcnRlZF9yZXF1ZXN0ICpyZXF1ZXN0OworCisJaWYgKG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUgPCBzaXplb2YoKnJlcXVlc3QpKSB7CisJCWRldl93YXJuKCZzdmMtPmRldiwgInNob3J0IG1vZHVsZS1pbnNlcnRlZCByZXF1ZXN0IHJlY2VpdmVkICglenUgPCAlenUpXG4iLAorCQkJCW9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUsIHNpemVvZigqcmVxdWVzdCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXF1ZXN0ID0gb3AtPnJlcXVlc3QtPnBheWxvYWQ7CisKKwlkZXZfZGJnKCZzdmMtPmRldiwgIiVzIC0gaWQgPSAldVxuIiwgX19mdW5jX18sCisJCQlyZXF1ZXN0LT5wcmltYXJ5X2ludGZfaWQpOworCisJcmV0dXJuIGdiX3N2Y19xdWV1ZV9kZWZlcnJlZF9yZXF1ZXN0KG9wKTsKK30KKworc3RhdGljIGludCBnYl9zdmNfbW9kdWxlX3JlbW92ZWRfcmVjdihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKG9wLT5jb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2Jfc3ZjX21vZHVsZV9yZW1vdmVkX3JlcXVlc3QgKnJlcXVlc3Q7CisKKwlpZiAob3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSA8IHNpemVvZigqcmVxdWVzdCkpIHsKKwkJZGV2X3dhcm4oJnN2Yy0+ZGV2LCAic2hvcnQgbW9kdWxlLXJlbW92ZWQgcmVxdWVzdCByZWNlaXZlZCAoJXp1IDwgJXp1KVxuIiwKKwkJCQlvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplLCBzaXplb2YoKnJlcXVlc3QpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVxdWVzdCA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCisJZGV2X2RiZygmc3ZjLT5kZXYsICIlcyAtIGlkID0gJXVcbiIsIF9fZnVuY19fLAorCQkJcmVxdWVzdC0+cHJpbWFyeV9pbnRmX2lkKTsKKworCXJldHVybiBnYl9zdmNfcXVldWVfZGVmZXJyZWRfcmVxdWVzdChvcCk7Cit9CisKK3N0YXRpYyBpbnQgZ2Jfc3ZjX2ludGZfb29wc19yZWN2KHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wKQoreworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEob3AtPmNvbm5lY3Rpb24pOworCXN0cnVjdCBnYl9zdmNfaW50Zl9vb3BzX3JlcXVlc3QgKnJlcXVlc3Q7CisKKwlpZiAob3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSA8IHNpemVvZigqcmVxdWVzdCkpIHsKKwkJZGV2X3dhcm4oJnN2Yy0+ZGV2LCAic2hvcnQgaW50Zi1vb3BzIHJlcXVlc3QgcmVjZWl2ZWQgKCV6dSA8ICV6dSlcbiIsCisJCQkgb3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSwgc2l6ZW9mKCpyZXF1ZXN0KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBnYl9zdmNfcXVldWVfZGVmZXJyZWRfcmVxdWVzdChvcCk7Cit9CisKK3N0YXRpYyBpbnQgZ2Jfc3ZjX2ludGZfbWFpbGJveF9ldmVudF9yZWN2KHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wKQoreworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEob3AtPmNvbm5lY3Rpb24pOworCXN0cnVjdCBnYl9zdmNfaW50Zl9tYWlsYm94X2V2ZW50X3JlcXVlc3QgKnJlcXVlc3Q7CisKKwlpZiAob3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSA8IHNpemVvZigqcmVxdWVzdCkpIHsKKwkJZGV2X3dhcm4oJnN2Yy0+ZGV2LCAic2hvcnQgbWFpbGJveCByZXF1ZXN0IHJlY2VpdmVkICglenUgPCAlenUpXG4iLAorCQkJCW9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUsIHNpemVvZigqcmVxdWVzdCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXF1ZXN0ID0gb3AtPnJlcXVlc3QtPnBheWxvYWQ7CisKKwlkZXZfZGJnKCZzdmMtPmRldiwgIiVzIC0gaWQgPSAldVxuIiwgX19mdW5jX18sIHJlcXVlc3QtPmludGZfaWQpOworCisJcmV0dXJuIGdiX3N2Y19xdWV1ZV9kZWZlcnJlZF9yZXF1ZXN0KG9wKTsKK30KKworc3RhdGljIGludCBnYl9zdmNfcmVxdWVzdF9oYW5kbGVyKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3AtPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwl1OCB0eXBlID0gb3AtPnR5cGU7CisJaW50IHJldCA9IDA7CisKKwkvKgorCSAqIFNWQyByZXF1ZXN0cyBuZWVkIHRvIGZvbGxvdyBhIHNwZWNpZmljIG9yZGVyIChhdCBsZWFzdCBpbml0aWFsbHkpIGFuZAorCSAqIGJlbG93IGNvZGUgdGFrZXMgY2FyZSBvZiBlbmZvcmNpbmcgdGhhdC4gVGhlIGV4cGVjdGVkIG9yZGVyIGlzOgorCSAqIC0gUFJPVE9DT0xfVkVSU0lPTgorCSAqIC0gU1ZDX0hFTExPCisJICogLSBBbnkgb3RoZXIgcmVxdWVzdCwgYnV0IHRoZSBlYXJsaWVyIHR3by4KKwkgKgorCSAqIEluY29taW5nIHJlcXVlc3RzIGFyZSBndWFyYW50ZWVkIHRvIGJlIHNlcmlhbGl6ZWQgYW5kIHNvIHdlIGRvbid0CisJICogbmVlZCB0byBwcm90ZWN0ICdzdGF0ZScgZm9yIGFueSByYWNlcy4KKwkgKi8KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdCX1NWQ19UWVBFX1BST1RPQ09MX1ZFUlNJT046CisJCWlmIChzdmMtPnN0YXRlICE9IEdCX1NWQ19TVEFURV9SRVNFVCkKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgR0JfU1ZDX1RZUEVfU1ZDX0hFTExPOgorCQlpZiAoc3ZjLT5zdGF0ZSAhPSBHQl9TVkNfU1RBVEVfUFJPVE9DT0xfVkVSU0lPTikKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChzdmMtPnN0YXRlICE9IEdCX1NWQ19TVEFURV9TVkNfSEVMTE8pCisJCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlpZiAocmV0KSB7CisJCWRldl93YXJuKCZzdmMtPmRldiwgInVuZXhwZWN0ZWQgcmVxdWVzdCAweCUwMnggcmVjZWl2ZWQgKHN0YXRlICV1KVxuIiwKKwkJCQl0eXBlLCBzdmMtPnN0YXRlKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdCX1NWQ19UWVBFX1BST1RPQ09MX1ZFUlNJT046CisJCXJldCA9IGdiX3N2Y192ZXJzaW9uX3JlcXVlc3Qob3ApOworCQlpZiAoIXJldCkKKwkJCXN2Yy0+c3RhdGUgPSBHQl9TVkNfU1RBVEVfUFJPVE9DT0xfVkVSU0lPTjsKKwkJcmV0dXJuIHJldDsKKwljYXNlIEdCX1NWQ19UWVBFX1NWQ19IRUxMTzoKKwkJcmV0ID0gZ2Jfc3ZjX2hlbGxvKG9wKTsKKwkJaWYgKCFyZXQpCisJCQlzdmMtPnN0YXRlID0gR0JfU1ZDX1NUQVRFX1NWQ19IRUxMTzsKKwkJcmV0dXJuIHJldDsKKwljYXNlIEdCX1NWQ19UWVBFX0lOVEZfUkVTRVQ6CisJCXJldHVybiBnYl9zdmNfaW50Zl9yZXNldF9yZWN2KG9wKTsKKwljYXNlIEdCX1NWQ19UWVBFX01PRFVMRV9JTlNFUlRFRDoKKwkJcmV0dXJuIGdiX3N2Y19tb2R1bGVfaW5zZXJ0ZWRfcmVjdihvcCk7CisJY2FzZSBHQl9TVkNfVFlQRV9NT0RVTEVfUkVNT1ZFRDoKKwkJcmV0dXJuIGdiX3N2Y19tb2R1bGVfcmVtb3ZlZF9yZWN2KG9wKTsKKwljYXNlIEdCX1NWQ19UWVBFX0lOVEZfTUFJTEJPWF9FVkVOVDoKKwkJcmV0dXJuIGdiX3N2Y19pbnRmX21haWxib3hfZXZlbnRfcmVjdihvcCk7CisJY2FzZSBHQl9TVkNfVFlQRV9JTlRGX09PUFM6CisJCXJldHVybiBnYl9zdmNfaW50Zl9vb3BzX3JlY3Yob3ApOworCWRlZmF1bHQ6CisJCWRldl93YXJuKCZzdmMtPmRldiwgInVuc3VwcG9ydGVkIHJlcXVlc3QgMHglMDJ4XG4iLCB0eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgdm9pZCBnYl9zdmNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gdG9fZ2Jfc3ZjKGRldik7CisKKwlpZiAoc3ZjLT5jb25uZWN0aW9uKQorCQlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koc3ZjLT5jb25uZWN0aW9uKTsKKwlpZGFfZGVzdHJveSgmc3ZjLT5kZXZpY2VfaWRfbWFwKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShzdmMtPndxKTsKKwlrZnJlZShzdmMpOworfQorCitzdHJ1Y3QgZGV2aWNlX3R5cGUgZ3JleWJ1c19zdmNfdHlwZSA9IHsKKwkubmFtZQkJPSAiZ3JleWJ1c19zdmMiLAorCS5yZWxlYXNlCT0gZ2Jfc3ZjX3JlbGVhc2UsCit9OworCitzdHJ1Y3QgZ2Jfc3ZjICpnYl9zdmNfY3JlYXRlKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQpCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjOworCisJc3ZjID0ga3phbGxvYyhzaXplb2YoKnN2YyksIEdGUF9LRVJORUwpOworCWlmICghc3ZjKQorCQlyZXR1cm4gTlVMTDsKKworCXN2Yy0+d3EgPSBhbGxvY193b3JrcXVldWUoIiVzOnN2YyIsIFdRX1VOQk9VTkQsIDEsIGRldl9uYW1lKCZoZC0+ZGV2KSk7CisJaWYgKCFzdmMtPndxKSB7CisJCWtmcmVlKHN2Yyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXN2Yy0+ZGV2LnBhcmVudCA9ICZoZC0+ZGV2OworCXN2Yy0+ZGV2LmJ1cyA9ICZncmV5YnVzX2J1c190eXBlOworCXN2Yy0+ZGV2LnR5cGUgPSAmZ3JleWJ1c19zdmNfdHlwZTsKKwlzdmMtPmRldi5ncm91cHMgPSBzdmNfZ3JvdXBzOworCXN2Yy0+ZGV2LmRtYV9tYXNrID0gc3ZjLT5kZXYucGFyZW50LT5kbWFfbWFzazsKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmc3ZjLT5kZXYpOworCisJZGV2X3NldF9uYW1lKCZzdmMtPmRldiwgIiVkLXN2YyIsIGhkLT5idXNfaWQpOworCisJaWRhX2luaXQoJnN2Yy0+ZGV2aWNlX2lkX21hcCk7CisJc3ZjLT5zdGF0ZSA9IEdCX1NWQ19TVEFURV9SRVNFVDsKKwlzdmMtPmhkID0gaGQ7CisKKwlzdmMtPmNvbm5lY3Rpb24gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZV9zdGF0aWMoaGQsIEdCX1NWQ19DUE9SVF9JRCwKKwkJCQkJCWdiX3N2Y19yZXF1ZXN0X2hhbmRsZXIpOworCWlmIChJU19FUlIoc3ZjLT5jb25uZWN0aW9uKSkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgY29ubmVjdGlvbjogJWxkXG4iLAorCQkJCVBUUl9FUlIoc3ZjLT5jb25uZWN0aW9uKSk7CisJCWdvdG8gZXJyX3B1dF9kZXZpY2U7CisJfQorCisJZ2JfY29ubmVjdGlvbl9zZXRfZGF0YShzdmMtPmNvbm5lY3Rpb24sIHN2Yyk7CisKKwlyZXR1cm4gc3ZjOworCitlcnJfcHV0X2RldmljZToKKwlwdXRfZGV2aWNlKCZzdmMtPmRldik7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBnYl9zdmNfYWRkKHN0cnVjdCBnYl9zdmMgKnN2YykKK3sKKwlpbnQgcmV0OworCisJLyoKKwkgKiBUaGUgU1ZDIHByb3RvY29sIGlzIGN1cnJlbnRseSBkcml2ZW4gYnkgdGhlIFNWQywgc28gdGhlIFNWQyBkZXZpY2UKKwkgKiBpcyBhZGRlZCBmcm9tIHRoZSBjb25uZWN0aW9uIHJlcXVlc3QgaGFuZGxlciB3aGVuIGVub3VnaAorCSAqIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlY2VpdmVkLgorCSAqLworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKHN2Yy0+Y29ubmVjdGlvbik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnYl9zdmNfcmVtb3ZlX21vZHVsZXMoc3RydWN0IGdiX3N2YyAqc3ZjKQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSBzdmMtPmhkOworCXN0cnVjdCBnYl9tb2R1bGUgKm1vZHVsZSwgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtb2R1bGUsIHRtcCwgJmhkLT5tb2R1bGVzLCBoZF9ub2RlKSB7CisJCWdiX21vZHVsZV9kZWwobW9kdWxlKTsKKwkJbGlzdF9kZWwoJm1vZHVsZS0+aGRfbm9kZSk7CisJCWdiX21vZHVsZV9wdXQobW9kdWxlKTsKKwl9Cit9CisKK3ZvaWQgZ2Jfc3ZjX2RlbChzdHJ1Y3QgZ2Jfc3ZjICpzdmMpCit7CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlX3J4KHN2Yy0+Y29ubmVjdGlvbik7CisKKwkvKgorCSAqIFRoZSBTVkMgZGV2aWNlIG1heSBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBmcm9tIHRoZSByZXF1ZXN0IGhhbmRsZXIuCisJICovCisJaWYgKGRldmljZV9pc19yZWdpc3RlcmVkKCZzdmMtPmRldikpIHsKKwkJZ2JfdGltZXN5bmNfc3ZjX3JlbW92ZShzdmMpOworCQlnYl9zdmNfZGVidWdmc19leGl0KHN2Yyk7CisJCWdiX3N2Y193YXRjaGRvZ19kZXN0cm95KHN2Yyk7CisJCWRldmljZV9kZWwoJnN2Yy0+ZGV2KTsKKwl9CisKKwlmbHVzaF93b3JrcXVldWUoc3ZjLT53cSk7CisKKwlnYl9zdmNfcmVtb3ZlX21vZHVsZXMoc3ZjKTsKKworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShzdmMtPmNvbm5lY3Rpb24pOworfQorCit2b2lkIGdiX3N2Y19wdXQoc3RydWN0IGdiX3N2YyAqc3ZjKQoreworCXB1dF9kZXZpY2UoJnN2Yy0+ZGV2KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3N2Yy5oIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3ZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkN2VmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3N2Yy5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogR3JleWJ1cyBTVkMgY29kZQorICoKKyAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNSBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpZm5kZWYgX19TVkNfSAorI2RlZmluZSBfX1NWQ19ICisKKyNkZWZpbmUgR0JfU1ZDX0NQT1JUX0ZMQUdfRTJFRkMJCUJJVCgwKQorI2RlZmluZSBHQl9TVkNfQ1BPUlRfRkxBR19DU0RfTgkJQklUKDEpCisjZGVmaW5lIEdCX1NWQ19DUE9SVF9GTEFHX0NTVl9OCQlCSVQoMikKKworZW51bSBnYl9zdmNfc3RhdGUgeworCUdCX1NWQ19TVEFURV9SRVNFVCwKKwlHQl9TVkNfU1RBVEVfUFJPVE9DT0xfVkVSU0lPTiwKKwlHQl9TVkNfU1RBVEVfU1ZDX0hFTExPLAorfTsKKworZW51bSBnYl9zdmNfd2F0Y2hkb2dfYml0ZSB7CisJR0JfU1ZDX1dBVENIRE9HX0JJVEVfUkVTRVRfVU5JUFJPID0gMCwKKwlHQl9TVkNfV0FUQ0hET0dfQklURV9QQU5JQ19LRVJORUwsCit9OworCitzdHJ1Y3QgZ2Jfc3ZjX3dhdGNoZG9nOworCitzdHJ1Y3Qgc3ZjX2RlYnVnZnNfcHdybW9uX3JhaWwgeworCXU4IGlkOworCXN0cnVjdCBnYl9zdmMgKnN2YzsKK307CisKK3N0cnVjdCBnYl9zdmMgeworCXN0cnVjdCBkZXZpY2UJCWRldjsKKworCXN0cnVjdCBnYl9ob3N0X2RldmljZQkqaGQ7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24JKmNvbm5lY3Rpb247CisJZW51bSBnYl9zdmNfc3RhdGUJc3RhdGU7CisJc3RydWN0IGlkYQkJZGV2aWNlX2lkX21hcDsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkqd3E7CisKKwl1MTYgZW5kb19pZDsKKwl1OCBhcF9pbnRmX2lkOworCisJdTggcHJvdG9jb2xfbWFqb3I7CisJdTggcHJvdG9jb2xfbWlub3I7CisKKwlzdHJ1Y3QgZ2Jfc3ZjX3dhdGNoZG9nCSp3YXRjaGRvZzsKKwllbnVtIGdiX3N2Y193YXRjaGRvZ19iaXRlIGFjdGlvbjsKKworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGVudHJ5OworCXN0cnVjdCBzdmNfZGVidWdmc19wd3Jtb25fcmFpbCAqcHdybW9uX3JhaWxzOworfTsKKyNkZWZpbmUgdG9fZ2Jfc3ZjKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgZ2Jfc3ZjLCBkZXYpCisKK3N0cnVjdCBnYl9zdmMgKmdiX3N2Y19jcmVhdGUoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCk7CitpbnQgZ2Jfc3ZjX2FkZChzdHJ1Y3QgZ2Jfc3ZjICpzdmMpOwordm9pZCBnYl9zdmNfZGVsKHN0cnVjdCBnYl9zdmMgKnN2Yyk7Cit2b2lkIGdiX3N2Y19wdXQoc3RydWN0IGdiX3N2YyAqc3ZjKTsKKworaW50IGdiX3N2Y19wd3Jtb25faW50Zl9zYW1wbGVfZ2V0KHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCwKKwkJCQkgIHU4IG1lYXN1cmVtZW50X3R5cGUsIHUzMiAqdmFsdWUpOworaW50IGdiX3N2Y19pbnRmX2RldmljZV9pZChzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQsIHU4IGRldmljZV9pZCk7CitpbnQgZ2Jfc3ZjX3JvdXRlX2NyZWF0ZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGYxX2lkLCB1OCBkZXYxX2lkLAorCQkJICAgICAgIHU4IGludGYyX2lkLCB1OCBkZXYyX2lkKTsKK3ZvaWQgZ2Jfc3ZjX3JvdXRlX2Rlc3Ryb3koc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBpbnRmMV9pZCwgdTggaW50ZjJfaWQpOworaW50IGdiX3N2Y19jb25uZWN0aW9uX2NyZWF0ZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGYxX2lkLCB1MTYgY3BvcnQxX2lkLAorCQkJICAgICB1OCBpbnRmMl9pZCwgdTE2IGNwb3J0Ml9pZCwgdTggY3BvcnRfZmxhZ3MpOwordm9pZCBnYl9zdmNfY29ubmVjdGlvbl9kZXN0cm95KHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50ZjFfaWQsIHUxNiBjcG9ydDFfaWQsCisJCQkgICAgICAgdTggaW50ZjJfaWQsIHUxNiBjcG9ydDJfaWQpOworaW50IGdiX3N2Y19pbnRmX2VqZWN0KHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCk7CitpbnQgZ2Jfc3ZjX2ludGZfdnN5c19zZXQoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBpbnRmX2lkLCBib29sIGVuYWJsZSk7CitpbnQgZ2Jfc3ZjX2ludGZfcmVmY2xrX3NldChzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQsIGJvb2wgZW5hYmxlKTsKK2ludCBnYl9zdmNfaW50Zl91bmlwcm9fc2V0KHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCwgYm9vbCBlbmFibGUpOworaW50IGdiX3N2Y19pbnRmX2FjdGl2YXRlKHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCwgdTggKmludGZfdHlwZSk7CitpbnQgZ2Jfc3ZjX2ludGZfcmVzdW1lKHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCk7CisKK2ludCBnYl9zdmNfZG1lX3BlZXJfZ2V0KHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCwgdTE2IGF0dHIsIHUxNiBzZWxlY3RvciwKKwkJCXUzMiAqdmFsdWUpOworaW50IGdiX3N2Y19kbWVfcGVlcl9zZXQoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBpbnRmX2lkLCB1MTYgYXR0ciwgdTE2IHNlbGVjdG9yLAorCQkJdTMyIHZhbHVlKTsKK2ludCBnYl9zdmNfaW50Zl9zZXRfcG93ZXJfbW9kZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQsIHU4IGhzX3NlcmllcywKKwkJCSAgICAgICB1OCB0eF9tb2RlLCB1OCB0eF9nZWFyLCB1OCB0eF9ubGFuZXMsCisJCQkgICAgICAgdTggdHhfYW1wbGl0dWRlLCB1OCB0eF9oc19lcXVhbGl6ZXIsCisJCQkgICAgICAgdTggcnhfbW9kZSwgdTggcnhfZ2VhciwgdTggcnhfbmxhbmVzLAorCQkJICAgICAgIHU4IGZsYWdzLCB1MzIgcXVpcmtzLAorCQkJICAgICAgIHN0cnVjdCBnYl9zdmNfbDJfdGltZXJfY2ZnICpsb2NhbCwKKwkJCSAgICAgICBzdHJ1Y3QgZ2Jfc3ZjX2wyX3RpbWVyX2NmZyAqcmVtb3RlKTsKK2ludCBnYl9zdmNfaW50Zl9zZXRfcG93ZXJfbW9kZV9oaWJlcm5hdGUoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBpbnRmX2lkKTsKK2ludCBnYl9zdmNfcGluZyhzdHJ1Y3QgZ2Jfc3ZjICpzdmMpOworaW50IGdiX3N2Y193YXRjaGRvZ19jcmVhdGUoc3RydWN0IGdiX3N2YyAqc3ZjKTsKK3ZvaWQgZ2Jfc3ZjX3dhdGNoZG9nX2Rlc3Ryb3koc3RydWN0IGdiX3N2YyAqc3ZjKTsKK2Jvb2wgZ2Jfc3ZjX3dhdGNoZG9nX2VuYWJsZWQoc3RydWN0IGdiX3N2YyAqc3ZjKTsKK2ludCBnYl9zdmNfd2F0Y2hkb2dfZW5hYmxlKHN0cnVjdCBnYl9zdmMgKnN2Yyk7CitpbnQgZ2Jfc3ZjX3dhdGNoZG9nX2Rpc2FibGUoc3RydWN0IGdiX3N2YyAqc3ZjKTsKK2ludCBnYl9zdmNfdGltZXN5bmNfZW5hYmxlKHN0cnVjdCBnYl9zdmMgKnN2YywgdTggY291bnQsIHU2NCBmcmFtZV90aW1lLAorCQkJICAgdTMyIHN0cm9iZV9kZWxheSwgdTMyIHJlZmNsayk7CitpbnQgZ2Jfc3ZjX3RpbWVzeW5jX2Rpc2FibGUoc3RydWN0IGdiX3N2YyAqc3ZjKTsKK2ludCBnYl9zdmNfdGltZXN5bmNfYXV0aG9yaXRhdGl2ZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU2NCAqZnJhbWVfdGltZSk7CitpbnQgZ2Jfc3ZjX3RpbWVzeW5jX3Bpbmcoc3RydWN0IGdiX3N2YyAqc3ZjLCB1NjQgKmZyYW1lX3RpbWUpOworaW50IGdiX3N2Y190aW1lc3luY193YWtlX3BpbnNfYWNxdWlyZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHUzMiBzdHJvYmVfbWFzayk7CitpbnQgZ2Jfc3ZjX3RpbWVzeW5jX3dha2VfcGluc19yZWxlYXNlKHN0cnVjdCBnYl9zdmMgKnN2Yyk7CisKK2ludCBnYl9zdmNfcHJvdG9jb2xfaW5pdCh2b2lkKTsKK3ZvaWQgZ2Jfc3ZjX3Byb3RvY29sX2V4aXQodm9pZCk7CisKKyNlbmRpZiAvKiBfX1NWQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zdmNfd2F0Y2hkb2cuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3N2Y193YXRjaGRvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3Mjk0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zdmNfd2F0Y2hkb2cuYwpAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIFNWQyBHcmV5YnVzICJ3YXRjaGRvZyIgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgImdyZXlidXMuaCIKKworI2RlZmluZSBTVkNfV0FUQ0hET0dfUEVSSU9ECSgyKkhaKQorCitzdHJ1Y3QgZ2Jfc3ZjX3dhdGNoZG9nIHsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCXdvcms7CisJc3RydWN0IGdiX3N2YwkJKnN2YzsKKwlib29sCQkJZW5hYmxlZDsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcG1fbm90aWZpZXI7Cit9OworCitzdGF0aWMgc3RydWN0IGRlbGF5ZWRfd29yayByZXNldF93b3JrOworCitzdGF0aWMgaW50IHN2Y193YXRjaGRvZ19wbV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIHBtX2V2ZW50LCB2b2lkICp1bnVzZWQpCit7CisJc3RydWN0IGdiX3N2Y193YXRjaGRvZyAqd2F0Y2hkb2cgPQorCQljb250YWluZXJfb2Yobm90aWZpZXIsIHN0cnVjdCBnYl9zdmNfd2F0Y2hkb2csIHBtX25vdGlmaWVyKTsKKworCXN3aXRjaCAocG1fZXZlbnQpIHsKKwljYXNlIFBNX1NVU1BFTkRfUFJFUEFSRToKKwkJZ2Jfc3ZjX3dhdGNoZG9nX2Rpc2FibGUod2F0Y2hkb2ctPnN2Yyk7CisJCWJyZWFrOworCWNhc2UgUE1fUE9TVF9TVVNQRU5EOgorCQlnYl9zdmNfd2F0Y2hkb2dfZW5hYmxlKHdhdGNoZG9nLT5zdmMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyB2b2lkIGdyZXlidXNfcmVzZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0YXRpYyBjaGFyIHN0YXJ0X3BhdGhbMjU2XSA9ICIvc3lzdGVtL2Jpbi9zdGFydCI7CisJc3RhdGljIGNoYXIgKmVudnBbXSA9IHsKKwkJIkhPTUU9LyIsCisJCSJQQVRIPS9zYmluOi92ZW5kb3IvYmluOi9zeXN0ZW0vc2Jpbjovc3lzdGVtL2Jpbjovc3lzdGVtL3hiaW4iLAorCQlOVUxMLAorCX07CisJc3RhdGljIGNoYXIgKmFyZ3ZbXSA9IHsKKwkJc3RhcnRfcGF0aCwKKwkJInVuaXByb19yZXNldCIsCisJCU5VTEwsCisJfTsKKworCXByaW50ayhLRVJOX0VSUiAic3ZjX3dhdGNoZG9nOiBjYWxsaW5nIFwiJXMgJXNcIiB0byByZXNldCBncmV5YnVzIG5ldHdvcmshXG4iLAorCSAgICAgICBhcmd2WzBdLCBhcmd2WzFdKTsKKwljYWxsX3VzZXJtb2RlaGVscGVyKHN0YXJ0X3BhdGgsIGFyZ3YsIGVudnAsIFVNSF9XQUlUX0VYRUMpOworfQorCitzdGF0aWMgdm9pZCBkb193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX3dhdGNoZG9nICp3YXRjaGRvZzsKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmM7CisJaW50IHJldHZhbDsKKworCXdhdGNoZG9nID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBnYl9zdmNfd2F0Y2hkb2csIHdvcmsud29yayk7CisJc3ZjID0gd2F0Y2hkb2ctPnN2YzsKKworCWRldl9kYmcoJnN2Yy0+ZGV2LCAiJXM6IHBpbmcuXG4iLCBfX2Z1bmNfXyk7CisJcmV0dmFsID0gZ2Jfc3ZjX3Bpbmcoc3ZjKTsKKwlpZiAocmV0dmFsKSB7CisJCS8qCisJCSAqIFNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZywgbGV0J3Mgd2FybiB1c2Vyc3BhY2UgYW5kIHRoZW4KKwkJICogcHVsbCB0aGUgcGx1ZyBhbmQgcmVzZXQgdGhlIHdob2xlIGdyZXlidXMgbmV0d29yay4KKwkJICogV2UgbmVlZCB0byBkbyB0aGlzIG91dHNpZGUgb2YgdGhpcyB3b3JrcXVldWUgYXMgd2Ugd2lsbCBiZQorCQkgKiB0ZWFyaW5nIGRvd24gdGhlIHN2YyBkZXZpY2UgaXRzZWxmLiAgU28gcXVldWUgdXAKKwkJICogeWV0LWFub3RoZXItY2FsbGJhY2sgdG8gZG8gdGhhdC4KKwkJICovCisJCWRldl9lcnIoJnN2Yy0+ZGV2LAorCQkJIlNWQyBwaW5nIGhhcyByZXR1cm5lZCAlZCwgc29tZXRoaW5nIGlzIHdyb25nISEhXG4iLAorCQkJcmV0dmFsKTsKKworCQlpZiAoc3ZjLT5hY3Rpb24gPT0gR0JfU1ZDX1dBVENIRE9HX0JJVEVfUEFOSUNfS0VSTkVMKSB7CisJCQlwYW5pYygiU1ZDIGlzIG5vdCByZXNwb25kaW5nXG4iKTsKKwkJfSBlbHNlIGlmIChzdmMtPmFjdGlvbiA9PSBHQl9TVkNfV0FUQ0hET0dfQklURV9SRVNFVF9VTklQUk8pIHsKKwkJCWRldl9lcnIoJnN2Yy0+ZGV2LCAiUmVzZXR0aW5nIHRoZSBncmV5YnVzIG5ldHdvcmssIHdhdGNoIG91dCEhIVxuIik7CisKKwkJCUlOSVRfREVMQVlFRF9XT1JLKCZyZXNldF93b3JrLCBncmV5YnVzX3Jlc2V0KTsKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcmVzZXRfd29yaywgSFogLyAyKTsKKworCQkJLyoKKwkJCSAqIERpc2FibGUgb3Vyc2VsdmVzLCB3ZSBkb24ndCB3YW50IHRvIHRyaXAgYWdhaW4gdW5sZXNzCisJCQkgKiB1c2Vyc3BhY2Ugd2FudHMgdXMgdG8uCisJCQkgKi8KKwkJCXdhdGNoZG9nLT5lbmFibGVkID0gZmFsc2U7CisJCX0KKwl9CisKKwkvKiByZXN1Ym1pdCBvdXIgd29yayB0byBoYXBwZW4gYWdhaW4sIGlmIHdlIGFyZSBzdGlsbCAiYWxpdmUiICovCisJaWYgKHdhdGNoZG9nLT5lbmFibGVkKQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJndhdGNoZG9nLT53b3JrLCBTVkNfV0FUQ0hET0dfUEVSSU9EKTsKK30KKworaW50IGdiX3N2Y193YXRjaGRvZ19jcmVhdGUoc3RydWN0IGdiX3N2YyAqc3ZjKQoreworCXN0cnVjdCBnYl9zdmNfd2F0Y2hkb2cgKndhdGNoZG9nOworCWludCByZXR2YWw7CisKKwlpZiAoc3ZjLT53YXRjaGRvZykKKwkJcmV0dXJuIDA7CisKKwl3YXRjaGRvZyA9IGttYWxsb2Moc2l6ZW9mKCp3YXRjaGRvZyksIEdGUF9LRVJORUwpOworCWlmICghd2F0Y2hkb2cpCisJCXJldHVybiAtRU5PTUVNOworCisJd2F0Y2hkb2ctPmVuYWJsZWQgPSBmYWxzZTsKKwl3YXRjaGRvZy0+c3ZjID0gc3ZjOworCUlOSVRfREVMQVlFRF9XT1JLKCZ3YXRjaGRvZy0+d29yaywgZG9fd29yayk7CisJc3ZjLT53YXRjaGRvZyA9IHdhdGNoZG9nOworCisJd2F0Y2hkb2ctPnBtX25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBzdmNfd2F0Y2hkb2dfcG1fbm90aWZpZXI7CisJcmV0dmFsID0gcmVnaXN0ZXJfcG1fbm90aWZpZXIoJndhdGNoZG9nLT5wbV9ub3RpZmllcik7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgImVycm9yIHJlZ2lzdGVyaW5nIHBtIG5vdGlmaWVyKCVkKVxuIiwKKwkJCXJldHZhbCk7CisJCWdvdG8gc3ZjX3dhdGNoZG9nX2NyZWF0ZV9lcnI7CisJfQorCisJcmV0dmFsID0gZ2Jfc3ZjX3dhdGNoZG9nX2VuYWJsZShzdmMpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsICJlcnJvciBlbmFibGluZyB3YXRjaGRvZyAoJWQpXG4iLCByZXR2YWwpOworCQl1bnJlZ2lzdGVyX3BtX25vdGlmaWVyKCZ3YXRjaGRvZy0+cG1fbm90aWZpZXIpOworCQlnb3RvIHN2Y193YXRjaGRvZ19jcmVhdGVfZXJyOworCX0KKwlyZXR1cm4gcmV0dmFsOworCitzdmNfd2F0Y2hkb2dfY3JlYXRlX2VycjoKKwlzdmMtPndhdGNoZG9nID0gTlVMTDsKKwlrZnJlZSh3YXRjaGRvZyk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCit2b2lkIGdiX3N2Y193YXRjaGRvZ19kZXN0cm95KHN0cnVjdCBnYl9zdmMgKnN2YykKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX3dhdGNoZG9nICp3YXRjaGRvZyA9IHN2Yy0+d2F0Y2hkb2c7CisKKwlpZiAoIXdhdGNoZG9nKQorCQlyZXR1cm47CisKKwl1bnJlZ2lzdGVyX3BtX25vdGlmaWVyKCZ3YXRjaGRvZy0+cG1fbm90aWZpZXIpOworCWdiX3N2Y193YXRjaGRvZ19kaXNhYmxlKHN2Yyk7CisJc3ZjLT53YXRjaGRvZyA9IE5VTEw7CisJa2ZyZWUod2F0Y2hkb2cpOworfQorCitib29sIGdiX3N2Y193YXRjaGRvZ19lbmFibGVkKHN0cnVjdCBnYl9zdmMgKnN2YykKK3sKKwlpZiAoIXN2YyB8fCAhc3ZjLT53YXRjaGRvZykKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiBzdmMtPndhdGNoZG9nLT5lbmFibGVkOworfQorCitpbnQgZ2Jfc3ZjX3dhdGNoZG9nX2VuYWJsZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMpCit7CisJc3RydWN0IGdiX3N2Y193YXRjaGRvZyAqd2F0Y2hkb2c7CisKKwlpZiAoIXN2Yy0+d2F0Y2hkb2cpCisJCXJldHVybiAtRU5PREVWOworCisJd2F0Y2hkb2cgPSBzdmMtPndhdGNoZG9nOworCWlmICh3YXRjaGRvZy0+ZW5hYmxlZCkKKwkJcmV0dXJuIDA7CisKKwl3YXRjaGRvZy0+ZW5hYmxlZCA9IHRydWU7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ3YXRjaGRvZy0+d29yaywgU1ZDX1dBVENIRE9HX1BFUklPRCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBnYl9zdmNfd2F0Y2hkb2dfZGlzYWJsZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMpCit7CisJc3RydWN0IGdiX3N2Y193YXRjaGRvZyAqd2F0Y2hkb2c7CisKKwlpZiAoIXN2Yy0+d2F0Y2hkb2cpCisJCXJldHVybiAtRU5PREVWOworCisJd2F0Y2hkb2cgPSBzdmMtPndhdGNoZG9nOworCWlmICghd2F0Y2hkb2ctPmVuYWJsZWQpCisJCXJldHVybiAwOworCisJd2F0Y2hkb2ctPmVuYWJsZWQgPSBmYWxzZTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJndhdGNoZG9nLT53b3JrKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3RpbWVzeW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90aW1lc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjhhZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90aW1lc3luYy5jCkBAIC0wLDAgKzEsMTM1NyBAQAorLyoKKyAqIFRpbWVTeW5jIEFQSSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE2IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJ0aW1lc3luYy5oIgorI2luY2x1ZGUgImdyZXlidXNfdHJhY2UuaCIKKworLyoKKyAqIE1pbmltdW0gaW50ZXItc3Ryb2JlIHZhbHVlIG9mIG9uZSBtaWxsaXNlY29uZCBpcyBjaG9zZW4gYmVjYXVzZSBpdAorICoganVzdC1hYm91dCBmaXRzIHRoZSBjb21tb24gZGVmaW5pdGlvbiBvZiBhIGppZmZ5LgorICoKKyAqIE1heGltdW0gdmFsdWUgT1RPSCBpcyBjb25zdHJhaW5lZCBieSB0aGUgbnVtYmVyIG9mIGJpdHMgdGhlIFNWQyBjYW4gZml0CisgKiBpbnRvIGEgMTYgYml0IHVwLWNvdW50ZXIuIFRoZSBTVkMgY29uZmlndXJlcyB0aGUgdGltZXIgaW4gbWljcm9zZWNvbmRzCisgKiBzbyB0aGUgbWF4aW11bSBhbGxvd2FibGUgdmFsdWUgaXMgNjU1MzUgbWljcm9zZWNvbmRzLiBXZSBjbGlwIHRoYXQgdmFsdWUKKyAqIHRvIDEwMDAwIG1pY3Jvc2Vjb25kcyBmb3IgdGhlIHNha2Ugb2YgdXNpbmcgbmljZSByb3VuZCBiYXNlIDEwIG51bWJlcnMKKyAqIGFuZCBzaW5jZSByaWdodC1ub3cgdGhlcmUncyBubyBpbWFnaW5hYmxlIHVzZS1jYXNlIHJlcXVpcmluZyBhbnl0aGluZworICogb3RoZXIgdGhhbiBhIG9uZSBtaWxsaXNlY29uZCBpbnRlci1zdHJvYmUgdGltZSwgbGV0IGFsb25lIHNvbWV0aGluZworICogaGlnaGVyIHRoYW4gdGVuIG1pbGxpc2Vjb25kcy4KKyAqLworI2RlZmluZSBHQl9USU1FU1lOQ19TVFJPQkVfREVMQVlfVVMJCTEwMDAKKyNkZWZpbmUgR0JfVElNRVNZTkNfREVGQVVMVF9PRkZTRVRfVVMJCTEwMDAKKworLyogV29yayBxdWV1ZSB0aW1lcnMgbG9uZywgc2hvcnQgYW5kIFNWQyBzdHJvYmUgdGltZW91dCAqLworI2RlZmluZSBHQl9USU1FU1lOQ19ERUxBWUVEX1dPUktfTE9ORwkJbXNlY3NfdG9famlmZmllcygxMCkKKyNkZWZpbmUgR0JfVElNRVNZTkNfREVMQVlFRF9XT1JLX1NIT1JUCQltc2Vjc190b19qaWZmaWVzKDEpCisjZGVmaW5lIEdCX1RJTUVTWU5DX01BWF9XQUlUX1NWQwkJbXNlY3NfdG9famlmZmllcyg1MDAwKQorI2RlZmluZSBHQl9USU1FU1lOQ19LVElNRV9VUERBVEUJCW1zZWNzX3RvX2ppZmZpZXMoMTAwMCkKKyNkZWZpbmUgR0JfVElNRVNZTkNfTUFYX0tUSU1FX0NPTlZFUlNJT04JMTUKKworLyogTWF4aW11bSBudW1iZXIgb2YgdGltZXMgd2UnbGwgcmV0cnkgYSBmYWlsZWQgc3luY2hyb25vdXMgc3luYyAqLworI2RlZmluZSBHQl9USU1FU1lOQ19NQVhfUkVUUklFUwkJCTUKKworLyogUmVwb3J0ZWQgbmFub3NlY29uZHMvZmVtdG9zZWNvbmRzIHBlciBjbG9jayAqLworc3RhdGljIHU2NCBnYl90aW1lc3luY19uc19wZXJfY2xvY2s7CitzdGF0aWMgdTY0IGdiX3RpbWVzeW5jX2ZzX3Blcl9jbG9jazsKKworLyogTWF4aW11bSBkaWZmZXJlbmNlIHdlIHdpbGwgYWNjZXB0IGNvbnZlcnRpbmcgRnJhbWVUaW1lIHRvIGt0aW1lICovCitzdGF0aWMgdTMyIGdiX3RpbWVzeW5jX21heF9rdGltZV9kaWZmOworCisvKiBSZXBvcnRlZCBjbG9jayByYXRlICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnYl90aW1lc3luY19jbG9ja19yYXRlOworCisvKiBXb3JrcXVldWUgKi8KK3N0YXRpYyB2b2lkIGdiX3RpbWVzeW5jX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCisvKiBMaXN0IG9mIFNWQ3Mgd2l0aCBvbmUgRnJhbWVUaW1lIHBlciBTVkMgKi8KK3N0YXRpYyBMSVNUX0hFQUQoZ2JfdGltZXN5bmNfc3ZjX2xpc3QpOworCisvKiBTeW5jaHJvbml6ZSBwYXJhbGxlbCBjb250ZXh0cyBhY2Nlc3NpbmcgYSB2YWxpZCB0aW1lc3luY19zdmMgcG9pbnRlciAqLworc3RhdGljIERFRklORV9NVVRFWChnYl90aW1lc3luY19zdmNfbGlzdF9tdXRleCk7CisKKy8qIFN0cnVjdHVyZSB0byBjb252ZXJ0IGZyb20gRnJhbWVUaW1lIHRvIHRpbWVzcGVjL2t0aW1lICovCitzdHJ1Y3QgZ2JfdGltZXN5bmNfZnJhbWVfdGltZV9kYXRhIHsKKwl1NjQgZnJhbWVfdGltZTsKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7Cit9OworCitzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBpbnRlcmZhY2VfbGlzdDsKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmM7CisJc3RydWN0IGdiX3RpbWVzeW5jX2hvc3RfZGV2aWNlICp0aW1lc3luY19oZDsKKworCXNwaW5sb2NrX3Qgc3BpbmxvY2s7CS8qIFBlciBTVkMgc3BpbmxvY2sgdG8gc3luYyB3aXRoIElTUiAqLworCXN0cnVjdCBtdXRleCBtdXRleDsJLyogUGVyIFNWQyBtdXRleCBmb3IgcmVndWxhciBzeW5jaHJvbml6YXRpb24gKi8KKworCXN0cnVjdCBkZW50cnkgKmZyYW1lX3RpbWVfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmZyYW1lX2t0aW1lX2RlbnRyeTsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya19xdWV1ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOworCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVsYXllZF93b3JrOworCXN0cnVjdCB0aW1lcl9saXN0IGt0aW1lX3RpbWVyOworCisJLyogVGhlIGN1cnJlbnQgbG9jYWwgRnJhbWVUaW1lICovCisJdTY0IGZyYW1lX3RpbWVfb2Zmc2V0OworCXN0cnVjdCBnYl90aW1lc3luY19mcmFtZV90aW1lX2RhdGEgc3Ryb2JlX2RhdGFbR0JfVElNRVNZTkNfTUFYX1NUUk9CRVNdOworCXN0cnVjdCBnYl90aW1lc3luY19mcmFtZV90aW1lX2RhdGEga3RpbWVfZGF0YTsKKworCS8qIFRoZSBTVkMgRnJhbWVUaW1lIGFuZCByZWxhdGl2ZSBBUCBGcmFtZVRpbWUgQCBsYXN0IFRJTUVTWU5DX1BJTkcgKi8KKwl1NjQgc3ZjX3BpbmdfZnJhbWVfdGltZTsKKwl1NjQgYXBfcGluZ19mcmFtZV90aW1lOworCisJLyogVHJhbnNpdG9yeSBzZXR0aW5ncyAqLworCXUzMiBzdHJvYmVfbWFzazsKKwlib29sIG9mZnNldF9kb3duOworCWJvb2wgcHJpbnRfcGluZzsKKwlib29sIGNhcHR1cmVfcGluZzsKKwlpbnQgc3Ryb2JlOworCisJLyogQ3VycmVudCBzdGF0ZSAqLworCWludCBzdGF0ZTsKK307CisKK3N0cnVjdCBnYl90aW1lc3luY19ob3N0X2RldmljZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQ7CisJdTY0IHBpbmdfZnJhbWVfdGltZTsKK307CisKK3N0cnVjdCBnYl90aW1lc3luY19pbnRlcmZhY2UgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJdTY0IHBpbmdfZnJhbWVfdGltZTsKK307CisKK2VudW0gZ2JfdGltZXN5bmNfc3RhdGUgeworCUdCX1RJTUVTWU5DX1NUQVRFX0lOVkFMSUQJCT0gMCwKKwlHQl9USU1FU1lOQ19TVEFURV9JTkFDVElWRQkJPSAxLAorCUdCX1RJTUVTWU5DX1NUQVRFX0lOSVQJCQk9IDIsCisJR0JfVElNRVNZTkNfU1RBVEVfV0FJVF9TVkMJCT0gMywKKwlHQl9USU1FU1lOQ19TVEFURV9BVVRIT1JJVEFUSVZFCQk9IDQsCisJR0JfVElNRVNZTkNfU1RBVEVfUElORwkJCT0gNSwKKwlHQl9USU1FU1lOQ19TVEFURV9BQ1RJVkUJCT0gNiwKK307CisKK3N0YXRpYyB2b2lkIGdiX3RpbWVzeW5jX2t0aW1lX3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKK3N0YXRpYyB1NjQgZ2JfdGltZXN5bmNfYWRqdXN0X2NvdW50KHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YywKKwkJCQkgICAgdTY0IGNvdW50cykKK3sKKwlpZiAodGltZXN5bmNfc3ZjLT5vZmZzZXRfZG93bikKKwkJcmV0dXJuIGNvdW50cyAtIHRpbWVzeW5jX3N2Yy0+ZnJhbWVfdGltZV9vZmZzZXQ7CisJZWxzZQorCQlyZXR1cm4gY291bnRzICsgdGltZXN5bmNfc3ZjLT5mcmFtZV90aW1lX29mZnNldDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIGF1dGhvcml0YXRpdmUgRnJhbWVUaW1lIHRvIGEgY2FsbGluZyBmdW5jdGlvbi4gSXQKKyAqIGlzIGRlc2lnbmVkIHRvIGJlIGxvY2tsZXNzIGFuZCBzaG91bGQgcmVtYWluIHRoYXQgd2F5IHRoZSBjYWxsZXIgaXMgYXNzdW1lZAorICogdG8gYmUgc3RhdGUtYXdhcmUuCisgKi8KK3N0YXRpYyB1NjQgX19nYl90aW1lc3luY19nZXRfZnJhbWVfdGltZShzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmMpCit7CisJdTY0IGNsb2NrcyA9IGdiX3RpbWVzeW5jX3BsYXRmb3JtX2dldF9jb3VudGVyKCk7CisKKwlyZXR1cm4gZ2JfdGltZXN5bmNfYWRqdXN0X2NvdW50KHRpbWVzeW5jX3N2YywgY2xvY2tzKTsKK30KKworc3RhdGljIHZvaWQgZ2JfdGltZXN5bmNfc2NoZWR1bGVfc3ZjX3RpbWVvdXQoc3RydWN0IGdiX3RpbWVzeW5jX3N2YworCQkJCQkgICAgICp0aW1lc3luY19zdmMpCit7CisJcXVldWVfZGVsYXllZF93b3JrKHRpbWVzeW5jX3N2Yy0+d29ya19xdWV1ZSwKKwkJCSAgICZ0aW1lc3luY19zdmMtPmRlbGF5ZWRfd29yaywKKwkJCSAgIEdCX1RJTUVTWU5DX01BWF9XQUlUX1NWQyk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3RpbWVzeW5jX3NldF9zdGF0ZShzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmMsCisJCQkJICBpbnQgc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgR0JfVElNRVNZTkNfU1RBVEVfSU5WQUxJRDoKKwkJdGltZXN5bmNfc3ZjLT5zdGF0ZSA9IHN0YXRlOworCQl3YWtlX3VwKCZ0aW1lc3luY19zdmMtPndhaXRfcXVldWUpOworCQlicmVhazsKKwljYXNlIEdCX1RJTUVTWU5DX1NUQVRFX0lOQUNUSVZFOgorCQl0aW1lc3luY19zdmMtPnN0YXRlID0gc3RhdGU7CisJCXdha2VfdXAoJnRpbWVzeW5jX3N2Yy0+d2FpdF9xdWV1ZSk7CisJCWJyZWFrOworCWNhc2UgR0JfVElNRVNZTkNfU1RBVEVfSU5JVDoKKwkJaWYgKHRpbWVzeW5jX3N2Yy0+c3RhdGUgIT0gR0JfVElNRVNZTkNfU1RBVEVfSU5WQUxJRCkgeworCQkJdGltZXN5bmNfc3ZjLT5zdHJvYmUgPSAwOworCQkJdGltZXN5bmNfc3ZjLT5mcmFtZV90aW1lX29mZnNldCA9IDA7CisJCQl0aW1lc3luY19zdmMtPnN0YXRlID0gc3RhdGU7CisJCQljYW5jZWxfZGVsYXllZF93b3JrKCZ0aW1lc3luY19zdmMtPmRlbGF5ZWRfd29yayk7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsodGltZXN5bmNfc3ZjLT53b3JrX3F1ZXVlLAorCQkJCQkgICAmdGltZXN5bmNfc3ZjLT5kZWxheWVkX3dvcmssCisJCQkJCSAgIEdCX1RJTUVTWU5DX0RFTEFZRURfV09SS19MT05HKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEdCX1RJTUVTWU5DX1NUQVRFX1dBSVRfU1ZDOgorCQlpZiAodGltZXN5bmNfc3ZjLT5zdGF0ZSA9PSBHQl9USU1FU1lOQ19TVEFURV9JTklUKQorCQkJdGltZXN5bmNfc3ZjLT5zdGF0ZSA9IHN0YXRlOworCQlicmVhazsKKwljYXNlIEdCX1RJTUVTWU5DX1NUQVRFX0FVVEhPUklUQVRJVkU6CisJCWlmICh0aW1lc3luY19zdmMtPnN0YXRlID09IEdCX1RJTUVTWU5DX1NUQVRFX1dBSVRfU1ZDKSB7CisJCQl0aW1lc3luY19zdmMtPnN0YXRlID0gc3RhdGU7CisJCQljYW5jZWxfZGVsYXllZF93b3JrKCZ0aW1lc3luY19zdmMtPmRlbGF5ZWRfd29yayk7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsodGltZXN5bmNfc3ZjLT53b3JrX3F1ZXVlLAorCQkJCQkgICAmdGltZXN5bmNfc3ZjLT5kZWxheWVkX3dvcmssIDApOworCQl9CisJCWJyZWFrOworCWNhc2UgR0JfVElNRVNZTkNfU1RBVEVfUElORzoKKwkJaWYgKHRpbWVzeW5jX3N2Yy0+c3RhdGUgPT0gR0JfVElNRVNZTkNfU1RBVEVfQUNUSVZFKSB7CisJCQl0aW1lc3luY19zdmMtPnN0YXRlID0gc3RhdGU7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsodGltZXN5bmNfc3ZjLT53b3JrX3F1ZXVlLAorCQkJCQkgICAmdGltZXN5bmNfc3ZjLT5kZWxheWVkX3dvcmssCisJCQkJCSAgIEdCX1RJTUVTWU5DX0RFTEFZRURfV09SS19TSE9SVCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHQl9USU1FU1lOQ19TVEFURV9BQ1RJVkU6CisJCWlmICh0aW1lc3luY19zdmMtPnN0YXRlID09IEdCX1RJTUVTWU5DX1NUQVRFX0FVVEhPUklUQVRJVkUgfHwKKwkJICAgIHRpbWVzeW5jX3N2Yy0+c3RhdGUgPT0gR0JfVElNRVNZTkNfU1RBVEVfUElORykgeworCQkJdGltZXN5bmNfc3ZjLT5zdGF0ZSA9IHN0YXRlOworCQkJd2FrZV91cCgmdGltZXN5bmNfc3ZjLT53YWl0X3F1ZXVlKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAoV0FSTl9PTih0aW1lc3luY19zdmMtPnN0YXRlICE9IHN0YXRlKSkgeworCQlwcl9lcnIoIkludmFsaWQgc3RhdGUgdHJhbnNpdGlvbiAlZD0+JWRcbiIsCisJCSAgICAgICB0aW1lc3luY19zdmMtPnN0YXRlLCBzdGF0ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBnYl90aW1lc3luY19zZXRfc3RhdGVfYXRvbWljKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YywKKwkJCQkJIGludCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpbWVzeW5jX3N2Yy0+c3BpbmxvY2ssIGZsYWdzKTsKKwlnYl90aW1lc3luY19zZXRfc3RhdGUodGltZXN5bmNfc3ZjLCBzdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGltZXN5bmNfc3ZjLT5zcGlubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdTY0IGdiX3RpbWVzeW5jX2RpZmYodTY0IHgsIHU2NCB5KQoreworCWlmICh4ID4geSkKKwkJcmV0dXJuIHggLSB5OworCWVsc2UKKwkJcmV0dXJuIHkgLSB4OworfQorCitzdGF0aWMgdm9pZCBnYl90aW1lc3luY19hZGp1c3RfdG9fc3ZjKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnN2YywKKwkJCQkgICAgICB1NjQgc3ZjX2ZyYW1lX3RpbWUsIHU2NCBhcF9mcmFtZV90aW1lKQoreworCWlmIChzdmNfZnJhbWVfdGltZSA+IGFwX2ZyYW1lX3RpbWUpIHsKKwkJc3ZjLT5mcmFtZV90aW1lX29mZnNldCA9IHN2Y19mcmFtZV90aW1lIC0gYXBfZnJhbWVfdGltZTsKKwkJc3ZjLT5vZmZzZXRfZG93biA9IGZhbHNlOworCX0gZWxzZSB7CisJCXN2Yy0+ZnJhbWVfdGltZV9vZmZzZXQgPSBhcF9mcmFtZV90aW1lIC0gc3ZjX2ZyYW1lX3RpbWU7CisJCXN2Yy0+b2Zmc2V0X2Rvd24gPSB0cnVlOworCX0KK30KKworLyoKKyAqIEFzc29jaWF0ZSBhIEZyYW1lVGltZSB3aXRoIGEga3RpbWUgdGltZXN0YW1wIHJlcHJlc2VudGVkIGFzIHN0cnVjdCB0aW1lc3BlYworICogUmVxdWlyZXMgdGhlIGNhbGxpbmcgY29udGV4dCB0byBob2xkIHRpbWVzeW5jX3N2Yy0+bXV0ZXgKKyAqLworc3RhdGljIHZvaWQgZ2JfdGltZXN5bmNfc3RvcmVfa3RpbWUoc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjLAorCQkJCSAgICBzdHJ1Y3QgdGltZXNwZWMgdHMsIHU2NCBmcmFtZV90aW1lKQoreworCXRpbWVzeW5jX3N2Yy0+a3RpbWVfZGF0YS50cyA9IHRzOworCXRpbWVzeW5jX3N2Yy0+a3RpbWVfZGF0YS5mcmFtZV90aW1lID0gZnJhbWVfdGltZTsKK30KKworLyoKKyAqIEZpbmQgdGhlIHR3byBwdWxzZXMgdGhhdCBiZXN0LW1hdGNoIG91ciBleHBlY3RlZCBpbnRlci1zdHJvYmUgZ2FwIGFuZAorICogdGhlbiBjYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgU1ZDIHRpbWUgYXQgdGhlIHNlY29uZCBwdWxzZQorICogdG8gdGhlIGxvY2FsIHRpbWUgYXQgdGhlIHNlY29uZCBwdWxzZS4KKyAqLworc3RhdGljIHZvaWQgZ2JfdGltZXN5bmNfY29sbGF0ZV9mcmFtZV90aW1lKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YywKKwkJCQkJICAgdTY0ICpmcmFtZV90aW1lKQoreworCWludCBpID0gMDsKKwl1NjQgZGVsdGEsIGFwX2ZyYW1lX3RpbWU7CisJdTY0IHN0cm9iZV9kZWxheV9ucyA9IEdCX1RJTUVTWU5DX1NUUk9CRV9ERUxBWV9VUyAqIE5TRUNfUEVSX1VTRUM7CisJdTY0IGxlYXN0ID0gMDsKKworCWZvciAoaSA9IDE7IGkgPCBHQl9USU1FU1lOQ19NQVhfU1RST0JFUzsgaSsrKSB7CisJCWRlbHRhID0gdGltZXN5bmNfc3ZjLT5zdHJvYmVfZGF0YVtpXS5mcmFtZV90aW1lIC0KKwkJCXRpbWVzeW5jX3N2Yy0+c3Ryb2JlX2RhdGFbaSAtIDFdLmZyYW1lX3RpbWU7CisJCWRlbHRhICo9IGdiX3RpbWVzeW5jX25zX3Blcl9jbG9jazsKKwkJZGVsdGEgPSBnYl90aW1lc3luY19kaWZmKGRlbHRhLCBzdHJvYmVfZGVsYXlfbnMpOworCisJCWlmICghbGVhc3QgfHwgZGVsdGEgPCBsZWFzdCkgeworCQkJbGVhc3QgPSBkZWx0YTsKKwkJCWdiX3RpbWVzeW5jX2FkanVzdF90b19zdmModGltZXN5bmNfc3ZjLCBmcmFtZV90aW1lW2ldLAorCQkJCQkJICB0aW1lc3luY19zdmMtPnN0cm9iZV9kYXRhW2ldLmZyYW1lX3RpbWUpOworCisJCQlhcF9mcmFtZV90aW1lID0gdGltZXN5bmNfc3ZjLT5zdHJvYmVfZGF0YVtpXS5mcmFtZV90aW1lOworCQkJYXBfZnJhbWVfdGltZSA9IGdiX3RpbWVzeW5jX2FkanVzdF9jb3VudCh0aW1lc3luY19zdmMsCisJCQkJCQkJCSBhcF9mcmFtZV90aW1lKTsKKwkJCWdiX3RpbWVzeW5jX3N0b3JlX2t0aW1lKHRpbWVzeW5jX3N2YywKKwkJCQkJCXRpbWVzeW5jX3N2Yy0+c3Ryb2JlX2RhdGFbaV0udHMsCisJCQkJCQlhcF9mcmFtZV90aW1lKTsKKworCQkJcHJfZGVidWcoImFkanVzdCAlcyBsb2NhbCAlbGx1IHN2YyAlbGx1IGRlbHRhICVsbHVcbiIsCisJCQkJIHRpbWVzeW5jX3N2Yy0+b2Zmc2V0X2Rvd24gPyAiZG93biIgOiAidXAiLAorCQkJCSB0aW1lc3luY19zdmMtPnN0cm9iZV9kYXRhW2ldLmZyYW1lX3RpbWUsCisJCQkJIGZyYW1lX3RpbWVbaV0sIGRlbHRhKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZ2JfdGltZXN5bmNfdGVhcmRvd24oc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjKQoreworCXN0cnVjdCBnYl90aW1lc3luY19pbnRlcmZhY2UgKnRpbWVzeW5jX2ludGVyZmFjZTsKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSB0aW1lc3luY19zdmMtPnN2YzsKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZDsKKwlpbnQgcmV0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aW1lc3luY19pbnRlcmZhY2UsCisJCQkgICAgJnRpbWVzeW5jX3N2Yy0+aW50ZXJmYWNlX2xpc3QsIGxpc3QpIHsKKwkJaW50ZXJmYWNlID0gdGltZXN5bmNfaW50ZXJmYWNlLT5pbnRlcmZhY2U7CisJCXJldCA9IGdiX2ludGVyZmFjZV90aW1lc3luY19kaXNhYmxlKGludGVyZmFjZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LAorCQkJCSJpbnRlcmZhY2UgdGltZXN5bmNfZGlzYWJsZSAlZFxuIiwgcmV0KTsKKwkJfQorCX0KKworCWhkID0gdGltZXN5bmNfc3ZjLT50aW1lc3luY19oZC0+aGQ7CisJcmV0ID0gaGQtPmRyaXZlci0+dGltZXN5bmNfZGlzYWJsZShoZCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaGQtPmRldiwgImhvc3QgdGltZXN5bmNfZGlzYWJsZSAlZFxuIiwKKwkJCXJldCk7CisJfQorCisJZ2Jfc3ZjX3RpbWVzeW5jX3dha2VfcGluc19yZWxlYXNlKHN2Yyk7CisJZ2Jfc3ZjX3RpbWVzeW5jX2Rpc2FibGUoc3ZjKTsKKwlnYl90aW1lc3luY19wbGF0Zm9ybV91bmxvY2tfYnVzKCk7CisKKwlnYl90aW1lc3luY19zZXRfc3RhdGVfYXRvbWljKHRpbWVzeW5jX3N2YywgR0JfVElNRVNZTkNfU1RBVEVfSU5BQ1RJVkUpOworfQorCitzdGF0aWMgdm9pZCBnYl90aW1lc3luY19wbGF0Zm9ybV9sb2NrX2J1c19mYWlsKHN0cnVjdCBnYl90aW1lc3luY19zdmMKKwkJCQkJCSp0aW1lc3luY19zdmMsIGludCByZXQpCit7CisJaWYgKHJldCA9PSAtRUFHQUlOKSB7CisJCWdiX3RpbWVzeW5jX3NldF9zdGF0ZSh0aW1lc3luY19zdmMsIHRpbWVzeW5jX3N2Yy0+c3RhdGUpOworCX0gZWxzZSB7CisJCXByX2VycigiRmFpbGVkIHRvIGxvY2sgdGltZXN5bmMgYnVzICVkXG4iLCByZXQpOworCQlnYl90aW1lc3luY19zZXRfc3RhdGUodGltZXN5bmNfc3ZjLCBHQl9USU1FU1lOQ19TVEFURV9JTkFDVElWRSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBnYl90aW1lc3luY19lbmFibGUoc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjKQoreworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IHRpbWVzeW5jX3N2Yy0+c3ZjOworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQ7CisJc3RydWN0IGdiX3RpbWVzeW5jX2ludGVyZmFjZSAqdGltZXN5bmNfaW50ZXJmYWNlOworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwl1NjQgaW5pdF9mcmFtZV90aW1lOworCXVuc2lnbmVkIGxvbmcgY2xvY2tfcmF0ZSA9IGdiX3RpbWVzeW5jX2Nsb2NrX3JhdGU7CisJaW50IHJldDsKKworCS8qCisJICogR2V0IGFjY2VzcyB0byB0aGUgd2FrZSBwaW5zIGluIHRoZSBBUCBhbmQgU1ZDCisJICogUmVsZWFzZSB0aGVzZSBwaW5zIGVpdGhlciBpbiBnYl90aW1lc3luY190ZWFyZG93bigpIG9yIGluCisJICogZ2JfdGltZXN5bmNfYXV0aG9yaXRhdGl2ZSgpCisJICovCisJcmV0ID0gZ2JfdGltZXN5bmNfcGxhdGZvcm1fbG9ja19idXModGltZXN5bmNfc3ZjKTsKKwlpZiAocmV0IDwgMCkgeworCQlnYl90aW1lc3luY19wbGF0Zm9ybV9sb2NrX2J1c19mYWlsKHRpbWVzeW5jX3N2YywgcmV0KTsKKwkJcmV0dXJuOworCX0KKwlyZXQgPSBnYl9zdmNfdGltZXN5bmNfd2FrZV9waW5zX2FjcXVpcmUoc3ZjLCB0aW1lc3luY19zdmMtPnN0cm9iZV9tYXNrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LAorCQkJImdiX3N2Y190aW1lc3luY193YWtlX3BpbnNfYWNxdWlyZSAlZFxuIiwgcmV0KTsKKwkJZ2JfdGltZXN5bmNfdGVhcmRvd24odGltZXN5bmNfc3ZjKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENob29zZSBhbiBpbml0aWFsIHRpbWUgaW4gdGhlIGZ1dHVyZSAqLworCWluaXRfZnJhbWVfdGltZSA9IF9fZ2JfdGltZXN5bmNfZ2V0X2ZyYW1lX3RpbWUodGltZXN5bmNfc3ZjKSArIDEwMDAwMFVMOworCisJLyogU2VuZCBlbmFibGUgY29tbWFuZCB0byBhbGwgcmVsZXZhbnQgcGFydGljaXBhbnRzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aW1lc3luY19pbnRlcmZhY2UsICZ0aW1lc3luY19zdmMtPmludGVyZmFjZV9saXN0LAorCQkJICAgIGxpc3QpIHsKKwkJaW50ZXJmYWNlID0gdGltZXN5bmNfaW50ZXJmYWNlLT5pbnRlcmZhY2U7CisJCXJldCA9IGdiX2ludGVyZmFjZV90aW1lc3luY19lbmFibGUoaW50ZXJmYWNlLAorCQkJCQkJICAgR0JfVElNRVNZTkNfTUFYX1NUUk9CRVMsCisJCQkJCQkgICBpbml0X2ZyYW1lX3RpbWUsCisJCQkJCQkgICBHQl9USU1FU1lOQ19TVFJPQkVfREVMQVlfVVMsCisJCQkJCQkgICBjbG9ja19yYXRlKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCisJCQkJImludGVyZmFjZSB0aW1lc3luY19lbmFibGUgJWRcbiIsIHJldCk7CisJCX0KKwl9CisKKwloZCA9IHRpbWVzeW5jX3N2Yy0+dGltZXN5bmNfaGQtPmhkOworCXJldCA9IGhkLT5kcml2ZXItPnRpbWVzeW5jX2VuYWJsZShoZCwgR0JfVElNRVNZTkNfTUFYX1NUUk9CRVMsCisJCQkJCSAgaW5pdF9mcmFtZV90aW1lLAorCQkJCQkgIEdCX1RJTUVTWU5DX1NUUk9CRV9ERUxBWV9VUywKKwkJCQkJICBjbG9ja19yYXRlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZoZC0+ZGV2LCAiaG9zdCB0aW1lc3luY19lbmFibGUgJWRcbiIsCisJCQlyZXQpOworCX0KKworCWdiX3RpbWVzeW5jX3NldF9zdGF0ZV9hdG9taWModGltZXN5bmNfc3ZjLCBHQl9USU1FU1lOQ19TVEFURV9XQUlUX1NWQyk7CisJcmV0ID0gZ2Jfc3ZjX3RpbWVzeW5jX2VuYWJsZShzdmMsIEdCX1RJTUVTWU5DX01BWF9TVFJPQkVTLAorCQkJCSAgICAgaW5pdF9mcmFtZV90aW1lLAorCQkJCSAgICAgR0JfVElNRVNZTkNfU1RST0JFX0RFTEFZX1VTLAorCQkJCSAgICAgY2xvY2tfcmF0ZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwKKwkJCSJnYl9zdmNfdGltZXN5bmNfZW5hYmxlICVkXG4iLCByZXQpOworCQlnYl90aW1lc3luY190ZWFyZG93bih0aW1lc3luY19zdmMpOworCQlyZXR1cm47CisJfQorCisJLyogU2NoZWR1bGUgYSB0aW1lb3V0IHdhaXRpbmcgZm9yIFNWQyB0byBjb21wbGV0ZSBzdHJvYmluZyAqLworCWdiX3RpbWVzeW5jX3NjaGVkdWxlX3N2Y190aW1lb3V0KHRpbWVzeW5jX3N2Yyk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3RpbWVzeW5jX2F1dGhvcml0YXRpdmUoc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjKQoreworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IHRpbWVzeW5jX3N2Yy0+c3ZjOworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQ7CisJc3RydWN0IGdiX3RpbWVzeW5jX2ludGVyZmFjZSAqdGltZXN5bmNfaW50ZXJmYWNlOworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwl1NjQgc3ZjX2ZyYW1lX3RpbWVbR0JfVElNRVNZTkNfTUFYX1NUUk9CRVNdOworCWludCByZXQ7CisKKwkvKiBHZXQgYXV0aG9yaXRhdGl2ZSB0aW1lIGZyb20gU1ZDIGFuZCBhZGp1c3QgbG9jYWwgY2xvY2sgKi8KKwlyZXQgPSBnYl9zdmNfdGltZXN5bmNfYXV0aG9yaXRhdGl2ZShzdmMsIHN2Y19mcmFtZV90aW1lKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LAorCQkJImdiX3N2Y190aW1lc3luY19hdXRob3JpdGF0aXZlICVkXG4iLCByZXQpOworCQlnYl90aW1lc3luY190ZWFyZG93bih0aW1lc3luY19zdmMpOworCQlyZXR1cm47CisJfQorCWdiX3RpbWVzeW5jX2NvbGxhdGVfZnJhbWVfdGltZSh0aW1lc3luY19zdmMsIHN2Y19mcmFtZV90aW1lKTsKKworCS8qIFRyYW5zbWl0IGF1dGhvcml0YXRpdmUgdGltZSB0byBkb3duc3RyZWFtIHNsYXZlcyAqLworCWhkID0gdGltZXN5bmNfc3ZjLT50aW1lc3luY19oZC0+aGQ7CisJcmV0ID0gaGQtPmRyaXZlci0+dGltZXN5bmNfYXV0aG9yaXRhdGl2ZShoZCwgc3ZjX2ZyYW1lX3RpbWUpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZoZC0+ZGV2LCAiaG9zdCB0aW1lc3luY19hdXRob3JpdGF0aXZlICVkXG4iLCByZXQpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aW1lc3luY19pbnRlcmZhY2UsCisJCQkgICAgJnRpbWVzeW5jX3N2Yy0+aW50ZXJmYWNlX2xpc3QsIGxpc3QpIHsKKwkJaW50ZXJmYWNlID0gdGltZXN5bmNfaW50ZXJmYWNlLT5pbnRlcmZhY2U7CisJCXJldCA9IGdiX2ludGVyZmFjZV90aW1lc3luY19hdXRob3JpdGF0aXZlKAorCQkJCQkJaW50ZXJmYWNlLAorCQkJCQkJc3ZjX2ZyYW1lX3RpbWUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwKKwkJCQkiaW50ZXJmYWNlIHRpbWVzeW5jX2F1dGhvcml0YXRpdmUgJWRcbiIsIHJldCk7CisJCX0KKwl9CisKKwkvKiBSZWxlYXNlIHdha2UgcGlucyAqLworCWdiX3N2Y190aW1lc3luY193YWtlX3BpbnNfcmVsZWFzZShzdmMpOworCWdiX3RpbWVzeW5jX3BsYXRmb3JtX3VubG9ja19idXMoKTsKKworCS8qIFRyYW5zaXRpb24gdG8gc3RhdGUgQUNUSVZFICovCisJZ2JfdGltZXN5bmNfc2V0X3N0YXRlX2F0b21pYyh0aW1lc3luY19zdmMsIEdCX1RJTUVTWU5DX1NUQVRFX0FDVElWRSk7CisKKwkvKiBTY2hlZHVsZSBhIHBpbmcgdG8gdmVyaWZ5IHRoZSBzeW5jaHJvbml6ZWQgc3lzdGVtIHRpbWUgKi8KKwl0aW1lc3luY19zdmMtPnByaW50X3BpbmcgPSB0cnVlOworCWdiX3RpbWVzeW5jX3NldF9zdGF0ZV9hdG9taWModGltZXN5bmNfc3ZjLCBHQl9USU1FU1lOQ19TVEFURV9QSU5HKTsKK30KKworc3RhdGljIGludCBfX2diX3RpbWVzeW5jX2dldF9zdGF0dXMoc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjKQoreworCWludCByZXQgPSAtRUlOVkFMOworCisJc3dpdGNoICh0aW1lc3luY19zdmMtPnN0YXRlKSB7CisJY2FzZSBHQl9USU1FU1lOQ19TVEFURV9JTlZBTElEOgorCWNhc2UgR0JfVElNRVNZTkNfU1RBVEVfSU5BQ1RJVkU6CisJCXJldCA9IC1FTk9ERVY7CisJCWJyZWFrOworCWNhc2UgR0JfVElNRVNZTkNfU1RBVEVfSU5JVDoKKwljYXNlIEdCX1RJTUVTWU5DX1NUQVRFX1dBSVRfU1ZDOgorCWNhc2UgR0JfVElNRVNZTkNfU1RBVEVfQVVUSE9SSVRBVElWRToKKwkJcmV0ID0gLUVBR0FJTjsKKwkJYnJlYWs7CisJY2FzZSBHQl9USU1FU1lOQ19TVEFURV9QSU5HOgorCWNhc2UgR0JfVElNRVNZTkNfU1RBVEVfQUNUSVZFOgorCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSB0YWtlcyBhIEZyYW1lVGltZSBhbmQgZGVyaXZlcyB0aGUgZGlmZmVyZW5jZSB3aXRoLXJlc3BlY3QKKyAqIHRvIGEgcmVmZXJlbmNlIEZyYW1lVGltZS9rdGltZSBwYWlyLiBJdCB0aGVuIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQKKyAqIGt0aW1lIGJhc2VkIG9uIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN1cHBsaWVkIEZyYW1lVGltZSBhbmQKKyAqIHRoZSByZWZlcmVuY2UgRnJhbWVUaW1lLgorICoKKyAqIFRoZSB0aW1lIGRpZmZlcmVuY2UgaXMgY2FsY3VsYXRlZCB0byBzaXggZGVjaW1hbCBwbGFjZXMuIFRha2luZyAxOS4yTUh6CisgKiBhcyBhbiBleGFtcGxlIHRoaXMgbWVhbnMgd2UgaGF2ZSA1Mi4wODMzMzN+IG5hbm9zZWNvbmRzIHBlciBjbG9jayBvcgorICogNTIwODMzMzN+IGZlbXRvc2Vjb25kcyBwZXIgY2xvY2suCisgKgorICogTmFpdmVseSB0YWtpbmcgdGhlIGNvdW50IGRpZmZlcmVuY2UgYW5kIGNvbnZlcnRpbmcgdG8KKyAqIHNlY29uZHMvbmFub3NlY29uZHMgd291bGQgcXVpY2tseSBzZWUgdGhlIDAuMDgzMyBjb21wb25lbnQgcHJvZHVjZQorICogbm90aWNlYWJsZSBlcnJvcnMuIEZvciBleGFtcGxlIGEgdGltZSBkaWZmZXJlbmNlIG9mIG9uZSBzZWNvbmQgd291bGQKKyAqIGxvb3NlIDE5MjAwMDAwICogMC4wODMzM3ggbmFub3NlY29uZHMgb3IgMS41OSBzZWNvbmRzLgorICoKKyAqIEluIGNvbnRyYXN0IGNhbGN1bGF0aW5nIGluIGZlbXRvc2Vjb25kcyB0aGUgc2FtZSBleGFtcGxlIG9mIDE5MjAwMDAwICoKKyAqIDAuMDAwMDAwMDgzMzMzeCBuYW5vc2Vjb25kcyBwZXIgY291bnQgb2YgZXJyb3IgaXMganVzdCAxLjU5IG5hbm9zZWNvbmRzIQorICoKKyAqIENvbnRpbnVpbmcgdGhlIGV4YW1wbGUgb2YgMTkuMiBNSHogd2UgY2FwIHRoZSBtYXhpbXVtIGVycm9yIGRpZmZlcmVuY2UKKyAqIGF0IGEgd29yc3QtY2FzZSAwLjMgbWljcm9zZWNvbmRzIG92ZXIgYSBwb3RlbnRpYWwgY2FsY3VsYXRpb24gd2luZG93IG9mCisgKiBhYm91bnQgMTUgc2Vjb25kcywgbWVhbmluZyB5b3UgY2FuIGNvbnZlcnQgYSBGcmFtZVRpbWUgdGhhdCBpcyA8PSAxNQorICogc2Vjb25kcyBvbGRlci95b3VuZ2VyIHRoYW4gdGhlIHJlZmVyZW5jZSB0aW1lIHdpdGggYSBtYXhpbXVtIGVycm9yIG9mCisgKiAwLjIzODUgdXNlY29uZHMuIE5vdGUgMTkuMk1IeiBpcyBhbiBleGFtcGxlIGZyZXF1ZW5jeSBub3QgYSByZXF1aXJlbWVudC4KKyAqLworc3RhdGljIGludCBnYl90aW1lc3luY190b190aW1lc3BlYyhzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmMsCisJCQkJICAgdTY0IGZyYW1lX3RpbWUsIHN0cnVjdCB0aW1lc3BlYyAqdHMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1NjQgZGVsdGFfZnMsIGNvdW50cywgc2VjLCBuc2VjOworCWJvb2wgYWRkOworCWludCByZXQgPSAwOworCisJbWVtc2V0KHRzLCAweDAwLCBzaXplb2YoKnRzKSk7CisJbXV0ZXhfbG9jaygmdGltZXN5bmNfc3ZjLT5tdXRleCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpbWVzeW5jX3N2Yy0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldCA9IF9fZ2JfdGltZXN5bmNfZ2V0X3N0YXR1cyh0aW1lc3luY19zdmMpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKworCS8qIFN1cHBvcnQgY2FsY3VsYXRpbmcga3RpbWUgdXB3YXJkcyBvciBkb3dud2FyZHMgZnJvbSB0aGUgcmVmZXJlbmNlICovCisJaWYgKGZyYW1lX3RpbWUgPCB0aW1lc3luY19zdmMtPmt0aW1lX2RhdGEuZnJhbWVfdGltZSkgeworCQlhZGQgPSBmYWxzZTsKKwkJY291bnRzID0gdGltZXN5bmNfc3ZjLT5rdGltZV9kYXRhLmZyYW1lX3RpbWUgLSBmcmFtZV90aW1lOworCX0gZWxzZSB7CisJCWFkZCA9IHRydWU7CisJCWNvdW50cyA9IGZyYW1lX3RpbWUgLSB0aW1lc3luY19zdmMtPmt0aW1lX2RhdGEuZnJhbWVfdGltZTsKKwl9CisKKwkvKiBFbmZvcmNlIHRoZSAuMjMgb2YgYSB1c2Vjb25kIGJvdW5kYXJ5IEAgMTkuMk1IeiAqLworCWlmIChjb3VudHMgPiBnYl90aW1lc3luY19tYXhfa3RpbWVfZGlmZikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogRGV0ZXJtaW5lIHRoZSB0aW1lIGRpZmZlcmVuY2UgaW4gZmVtdG9zZWNvbmRzICovCisJZGVsdGFfZnMgPSBjb3VudHMgKiBnYl90aW1lc3luY19mc19wZXJfY2xvY2s7CisKKwkvKiBDb252ZXJ0IHRvIHNlY29uZHMgKi8KKwlzZWMgPSBkZWx0YV9mczsKKwlkb19kaXYoc2VjLCBOU0VDX1BFUl9TRUMpOworCWRvX2RpdihzZWMsIDEwMDAwMDBVTCk7CisKKwkvKiBHZXQgdGhlIG5hbm9zZWNvbmQgcmVtYWluZGVyICovCisJbnNlYyA9IGRvX2RpdihkZWx0YV9mcywgc2VjKTsKKwlkb19kaXYobnNlYywgMTAwMDAwMFVMKTsKKworCWlmIChhZGQpIHsKKwkJLyogQWRkIHRoZSBjYWxjdWxhdGVkIG9mZnNldCAtIG92ZXJmbG93IG5hbm9zZWNvbmRzIHVwd2FyZHMgKi8KKwkJdHMtPnR2X3NlYyA9IHRpbWVzeW5jX3N2Yy0+a3RpbWVfZGF0YS50cy50dl9zZWMgKyBzZWM7CisJCXRzLT50dl9uc2VjID0gdGltZXN5bmNfc3ZjLT5rdGltZV9kYXRhLnRzLnR2X25zZWMgKyBuc2VjOworCQlpZiAodHMtPnR2X25zZWMgPj0gTlNFQ19QRVJfU0VDKSB7CisJCQl0cy0+dHZfc2VjKys7CisJCQl0cy0+dHZfbnNlYyAtPSBOU0VDX1BFUl9TRUM7CisJCX0KKwl9IGVsc2UgeworCQkvKiBTdWJ0cmFjdCB0aGUgZGlmZmVyZW5jZSBvdmVyL3VuZGVyZmxvdyBhcyBuZWNlc3NhcnkgKi8KKwkJaWYgKG5zZWMgPiB0aW1lc3luY19zdmMtPmt0aW1lX2RhdGEudHMudHZfbnNlYykgeworCQkJc2VjKys7CisJCQluc2VjID0gbnNlYyArIHRpbWVzeW5jX3N2Yy0+a3RpbWVfZGF0YS50cy50dl9uc2VjOworCQkJbnNlYyA9IGRvX2Rpdihuc2VjLCBOU0VDX1BFUl9TRUMpOworCQl9IGVsc2UgeworCQkJbnNlYyA9IHRpbWVzeW5jX3N2Yy0+a3RpbWVfZGF0YS50cy50dl9uc2VjIC0gbnNlYzsKKwkJfQorCQkvKiBDYW5ub3QgcmV0dXJuIGEgbmVnYXRpdmUgc2Vjb25kIHZhbHVlICovCisJCWlmIChzZWMgPiB0aW1lc3luY19zdmMtPmt0aW1lX2RhdGEudHMudHZfc2VjKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBkb25lOworCQl9CisJCXRzLT50dl9zZWMgPSB0aW1lc3luY19zdmMtPmt0aW1lX2RhdGEudHMudHZfc2VjIC0gc2VjOworCQl0cy0+dHZfbnNlYyA9IG5zZWM7CisJfQorZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aW1lc3luY19zdmMtPnNwaW5sb2NrLCBmbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZ0aW1lc3luY19zdmMtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc2l6ZV90IGdiX3RpbWVzeW5jX2xvZ19mcmFtZV90aW1lKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YywKKwkJCQkJIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSB0aW1lc3luY19zdmMtPnN2YzsKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkOworCXN0cnVjdCBnYl90aW1lc3luY19pbnRlcmZhY2UgKnRpbWVzeW5jX2ludGVyZmFjZTsKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJdW5zaWduZWQgaW50IGxlbjsKKwlzaXplX3Qgb2ZmOworCisJLyogQVAvU1ZDICovCisJb2ZmID0gc25wcmludGYoYnVmLCBidWZsZW4sICIlcyBmcmFtZXRpbWU6IGFwPSVsbHUgJXM9JWxsdSAiLAorCQkgICAgICAgZ3JleWJ1c19idXNfdHlwZS5uYW1lLAorCQkgICAgICAgdGltZXN5bmNfc3ZjLT5hcF9waW5nX2ZyYW1lX3RpbWUsIGRldl9uYW1lKCZzdmMtPmRldiksCisJCSAgICAgICB0aW1lc3luY19zdmMtPnN2Y19waW5nX2ZyYW1lX3RpbWUpOworCWxlbiA9IGJ1ZmxlbiAtIG9mZjsKKworCS8qIEFQQi9HUEIgKi8KKwlpZiAobGVuIDwgYnVmbGVuKSB7CisJCWhkID0gdGltZXN5bmNfc3ZjLT50aW1lc3luY19oZC0+aGQ7CisJCW9mZiArPSBzbnByaW50ZigmYnVmW29mZl0sIGxlbiwgIiVzPSVsbHUgIiwgZGV2X25hbWUoJmhkLT5kZXYpLAorCQkJCXRpbWVzeW5jX3N2Yy0+dGltZXN5bmNfaGQtPnBpbmdfZnJhbWVfdGltZSk7CisJCWxlbiA9IGJ1ZmxlbiAtIG9mZjsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpbWVzeW5jX2ludGVyZmFjZSwKKwkJCSAgICAmdGltZXN5bmNfc3ZjLT5pbnRlcmZhY2VfbGlzdCwgbGlzdCkgeworCQlpZiAobGVuIDwgYnVmbGVuKSB7CisJCQlpbnRlcmZhY2UgPSB0aW1lc3luY19pbnRlcmZhY2UtPmludGVyZmFjZTsKKwkJCW9mZiArPSBzbnByaW50ZigmYnVmW29mZl0sIGxlbiwgIiVzPSVsbHUgIiwKKwkJCQkJZGV2X25hbWUoJmludGVyZmFjZS0+ZGV2KSwKKwkJCQkJdGltZXN5bmNfaW50ZXJmYWNlLT5waW5nX2ZyYW1lX3RpbWUpOworCQkJbGVuID0gYnVmbGVuIC0gb2ZmOworCQl9CisJfQorCWlmIChsZW4gPCBidWZsZW4pCisJCW9mZiArPSBzbnByaW50ZigmYnVmW29mZl0sIGxlbiwgIlxuIik7CisJcmV0dXJuIG9mZjsKK30KKworc3RhdGljIHNpemVfdCBnYl90aW1lc3luY19sb2dfZnJhbWVfa3RpbWUoc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjLAorCQkJCQkgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSB0aW1lc3luY19zdmMtPnN2YzsKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkOworCXN0cnVjdCBnYl90aW1lc3luY19pbnRlcmZhY2UgKnRpbWVzeW5jX2ludGVyZmFjZTsKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCXVuc2lnbmVkIGludCBsZW47CisJc2l6ZV90IG9mZjsKKworCS8qIEFQICovCisJZ2JfdGltZXN5bmNfdG9fdGltZXNwZWModGltZXN5bmNfc3ZjLCB0aW1lc3luY19zdmMtPmFwX3BpbmdfZnJhbWVfdGltZSwKKwkJCQkmdHMpOworCW9mZiA9IHNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJXMgZnJhbWV0aW1lOiBhcD0lbHUuJWx1ICIsCisJCSAgICAgICBncmV5YnVzX2J1c190eXBlLm5hbWUsIHRzLnR2X3NlYywgdHMudHZfbnNlYyk7CisJbGVuID0gYnVmbGVuIC0gb2ZmOworCWlmIChsZW4gPj0gYnVmbGVuKQorCQlnb3RvIGRvbmU7CisKKwkvKiBTVkMgKi8KKwlnYl90aW1lc3luY190b190aW1lc3BlYyh0aW1lc3luY19zdmMsIHRpbWVzeW5jX3N2Yy0+c3ZjX3BpbmdfZnJhbWVfdGltZSwKKwkJCQkmdHMpOworCW9mZiArPSBzbnByaW50ZigmYnVmW29mZl0sIGxlbiwgIiVzPSVsdS4lbHUgIiwgZGV2X25hbWUoJnN2Yy0+ZGV2KSwKKwkJCXRzLnR2X3NlYywgdHMudHZfbnNlYyk7CisJbGVuID0gYnVmbGVuIC0gb2ZmOworCWlmIChsZW4gPj0gYnVmbGVuKQorCQlnb3RvIGRvbmU7CisKKwkvKiBBUEIvR1BCICovCisJaGQgPSB0aW1lc3luY19zdmMtPnRpbWVzeW5jX2hkLT5oZDsKKwlnYl90aW1lc3luY190b190aW1lc3BlYyh0aW1lc3luY19zdmMsCisJCQkJdGltZXN5bmNfc3ZjLT50aW1lc3luY19oZC0+cGluZ19mcmFtZV90aW1lLAorCQkJCSZ0cyk7CisJb2ZmICs9IHNucHJpbnRmKCZidWZbb2ZmXSwgbGVuLCAiJXM9JWx1LiVsdSAiLAorCQkJZGV2X25hbWUoJmhkLT5kZXYpLAorCQkJdHMudHZfc2VjLCB0cy50dl9uc2VjKTsKKwlsZW4gPSBidWZsZW4gLSBvZmY7CisJaWYgKGxlbiA+PSBidWZsZW4pCisJCWdvdG8gZG9uZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodGltZXN5bmNfaW50ZXJmYWNlLAorCQkJICAgICZ0aW1lc3luY19zdmMtPmludGVyZmFjZV9saXN0LCBsaXN0KSB7CisJCWludGVyZmFjZSA9IHRpbWVzeW5jX2ludGVyZmFjZS0+aW50ZXJmYWNlOworCQlnYl90aW1lc3luY190b190aW1lc3BlYyh0aW1lc3luY19zdmMsCisJCQkJCXRpbWVzeW5jX2ludGVyZmFjZS0+cGluZ19mcmFtZV90aW1lLAorCQkJCQkmdHMpOworCQlvZmYgKz0gc25wcmludGYoJmJ1ZltvZmZdLCBsZW4sICIlcz0lbHUuJWx1ICIsCisJCQkJZGV2X25hbWUoJmludGVyZmFjZS0+ZGV2KSwKKwkJCQl0cy50dl9zZWMsIHRzLnR2X25zZWMpOworCQlsZW4gPSBidWZsZW4gLSBvZmY7CisJCWlmIChsZW4gPj0gYnVmbGVuKQorCQkJZ290byBkb25lOworCX0KKwlvZmYgKz0gc25wcmludGYoJmJ1ZltvZmZdLCBsZW4sICJcbiIpOworZG9uZToKKwlyZXR1cm4gb2ZmOworfQorCisvKgorICogU2VuZCBhbiBTVkMgaW5pdGlhdGVkIHdha2UgJ3BpbmcnIHRvIGVhY2ggVGltZVN5bmMgcGFydGljaXBhbnQuCisgKiBHZXQgdGhlIEZyYW1lVGltZSBmcm9tIGVhY2ggcGFydGljaXBhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YWtlCisgKiBwaW5nLgorICovCitzdGF0aWMgdm9pZCBnYl90aW1lc3luY19waW5nKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YykKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSB0aW1lc3luY19zdmMtPnN2YzsKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkOworCXN0cnVjdCBnYl90aW1lc3luY19pbnRlcmZhY2UgKnRpbWVzeW5jX2ludGVyZmFjZTsKKwlzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbDsKKwl1NjQgKnBpbmdfZnJhbWVfdGltZTsKKwlpbnQgcmV0OworCisJLyogR2V0IGFjY2VzcyB0byB0aGUgd2FrZSBwaW5zIGluIHRoZSBBUCBhbmQgU1ZDICovCisJcmV0ID0gZ2JfdGltZXN5bmNfcGxhdGZvcm1fbG9ja19idXModGltZXN5bmNfc3ZjKTsKKwlpZiAocmV0IDwgMCkgeworCQlnYl90aW1lc3luY19wbGF0Zm9ybV9sb2NrX2J1c19mYWlsKHRpbWVzeW5jX3N2YywgcmV0KTsKKwkJcmV0dXJuOworCX0KKwlyZXQgPSBnYl9zdmNfdGltZXN5bmNfd2FrZV9waW5zX2FjcXVpcmUoc3ZjLCB0aW1lc3luY19zdmMtPnN0cm9iZV9tYXNrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LAorCQkJImdiX3N2Y190aW1lc3luY193YWtlX3BpbnNfYWNxdWlyZSAlZFxuIiwgcmV0KTsKKwkJZ2JfdGltZXN5bmNfdGVhcmRvd24odGltZXN5bmNfc3ZjKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEhhdmUgU1ZDIGdlbmVyYXRlIGEgdGltZXN5bmMgcGluZyAqLworCXRpbWVzeW5jX3N2Yy0+Y2FwdHVyZV9waW5nID0gdHJ1ZTsKKwl0aW1lc3luY19zdmMtPnN2Y19waW5nX2ZyYW1lX3RpbWUgPSAwOworCXJldCA9IGdiX3N2Y190aW1lc3luY19waW5nKHN2YywgJnRpbWVzeW5jX3N2Yy0+c3ZjX3BpbmdfZnJhbWVfdGltZSk7CisJdGltZXN5bmNfc3ZjLT5jYXB0dXJlX3BpbmcgPSBmYWxzZTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LAorCQkJImdiX3N2Y190aW1lc3luY19waW5nICVkXG4iLCByZXQpOworCQlnYl90aW1lc3luY190ZWFyZG93bih0aW1lc3luY19zdmMpOworCQlyZXR1cm47CisJfQorCisJLyogR2V0IHRoZSBwaW5nIEZyYW1lVGltZSBmcm9tIGVhY2ggQVBCL0dQQiAqLworCWhkID0gdGltZXN5bmNfc3ZjLT50aW1lc3luY19oZC0+aGQ7CisJdGltZXN5bmNfc3ZjLT50aW1lc3luY19oZC0+cGluZ19mcmFtZV90aW1lID0gMDsKKwlyZXQgPSBoZC0+ZHJpdmVyLT50aW1lc3luY19nZXRfbGFzdF9ldmVudChoZCwKKwkJJnRpbWVzeW5jX3N2Yy0+dGltZXN5bmNfaGQtPnBpbmdfZnJhbWVfdGltZSk7CisJaWYgKHJldCkKKwkJZGV2X2VycigmaGQtPmRldiwgImhvc3QgdGltZXN5bmNfZ2V0X2xhc3RfZXZlbnQgJWRcbiIsIHJldCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpbWVzeW5jX2ludGVyZmFjZSwKKwkJCSAgICAmdGltZXN5bmNfc3ZjLT5pbnRlcmZhY2VfbGlzdCwgbGlzdCkgeworCQljb250cm9sID0gdGltZXN5bmNfaW50ZXJmYWNlLT5pbnRlcmZhY2UtPmNvbnRyb2w7CisJCXRpbWVzeW5jX2ludGVyZmFjZS0+cGluZ19mcmFtZV90aW1lID0gMDsKKwkJcGluZ19mcmFtZV90aW1lID0gJnRpbWVzeW5jX2ludGVyZmFjZS0+cGluZ19mcmFtZV90aW1lOworCQlyZXQgPSBnYl9jb250cm9sX3RpbWVzeW5jX2dldF9sYXN0X2V2ZW50KGNvbnRyb2wsCisJCQkJCQkJIHBpbmdfZnJhbWVfdGltZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnRpbWVzeW5jX2ludGVyZmFjZS0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImdiX2NvbnRyb2xfdGltZXN5bmNfZ2V0X2xhc3RfZXZlbnQgJWRcbiIsIHJldCk7CisJCX0KKwl9CisKKwkvKiBQaW5nIHN1Y2Nlc3MgLSBtb3ZlIHRvIHRpbWVzeW5jIGFjdGl2ZSAqLworCWdiX3N2Y190aW1lc3luY193YWtlX3BpbnNfcmVsZWFzZShzdmMpOworCWdiX3RpbWVzeW5jX3BsYXRmb3JtX3VubG9ja19idXMoKTsKKwlnYl90aW1lc3luY19zZXRfc3RhdGVfYXRvbWljKHRpbWVzeW5jX3N2YywgR0JfVElNRVNZTkNfU1RBVEVfQUNUSVZFKTsKK30KKworc3RhdGljIHZvaWQgZ2JfdGltZXN5bmNfbG9nX3BpbmdfdGltZShzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmMpCit7CisJY2hhciAqYnVmOworCisJaWYgKCF0aW1lc3luY19zdmMtPnByaW50X3BpbmcpCisJCXJldHVybjsKKworCWJ1ZiA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmKSB7CisJCWdiX3RpbWVzeW5jX2xvZ19mcmFtZV90aW1lKHRpbWVzeW5jX3N2YywgYnVmLCBQQUdFX1NJWkUpOworCQlkZXZfZGJnKCZ0aW1lc3luY19zdmMtPnN2Yy0+ZGV2LCAiJXMiLCBidWYpOworCQlrZnJlZShidWYpOworCX0KK30KKworLyoKKyAqIFBlcmZvcm0gdGhlIGFjdHVhbCB3b3JrIG9mIHNjaGVkdWxlZCBUaW1lU3luYyBsb2dpYy4KKyAqLworc3RhdGljIHZvaWQgZ2JfdGltZXN5bmNfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkZWxheWVkX3dvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7CisJc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjID0KKwkJY29udGFpbmVyX29mKGRlbGF5ZWRfd29yaywgc3RydWN0IGdiX3RpbWVzeW5jX3N2YywgZGVsYXllZF93b3JrKTsKKworCW11dGV4X2xvY2soJnRpbWVzeW5jX3N2Yy0+bXV0ZXgpOworCisJc3dpdGNoICh0aW1lc3luY19zdmMtPnN0YXRlKSB7CisJY2FzZSBHQl9USU1FU1lOQ19TVEFURV9JTklUOgorCQlnYl90aW1lc3luY19lbmFibGUodGltZXN5bmNfc3ZjKTsKKwkJYnJlYWs7CisKKwljYXNlIEdCX1RJTUVTWU5DX1NUQVRFX1dBSVRfU1ZDOgorCQlkZXZfZXJyKCZ0aW1lc3luY19zdmMtPnN2Yy0+ZGV2LAorCQkJInRpbWVvdXQgU1ZDIHN0cm9iZSBjb21wbGV0aW9uICVkLyVkXG4iLAorCQkJdGltZXN5bmNfc3ZjLT5zdHJvYmUsIEdCX1RJTUVTWU5DX01BWF9TVFJPQkVTKTsKKwkJZ2JfdGltZXN5bmNfdGVhcmRvd24odGltZXN5bmNfc3ZjKTsKKwkJYnJlYWs7CisKKwljYXNlIEdCX1RJTUVTWU5DX1NUQVRFX0FVVEhPUklUQVRJVkU6CisJCWdiX3RpbWVzeW5jX2F1dGhvcml0YXRpdmUodGltZXN5bmNfc3ZjKTsKKwkJYnJlYWs7CisKKwljYXNlIEdCX1RJTUVTWU5DX1NUQVRFX1BJTkc6CisJCWdiX3RpbWVzeW5jX3BpbmcodGltZXN5bmNfc3ZjKTsKKwkJZ2JfdGltZXN5bmNfbG9nX3BpbmdfdGltZSh0aW1lc3luY19zdmMpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByX2VycigiSW52YWxpZCBzdGF0ZSAlZCBmb3IgZGVsYXllZCB3b3JrXG4iLAorCQkgICAgICAgdGltZXN5bmNfc3ZjLT5zdGF0ZSk7CisJCWJyZWFrOworCX0KKworCW11dGV4X3VubG9jaygmdGltZXN5bmNfc3ZjLT5tdXRleCk7Cit9CisKKy8qCisgKiBTY2hlZHVsZSBhIG5ldyBUaW1lU3luYyBJTklUIG9yIFBJTkcgb3BlcmF0aW9uIHNlcmlhbGl6ZWQgdy9yIHRvCisgKiBnYl90aW1lc3luY193b3JrZXIoKS4KKyAqLworc3RhdGljIGludCBnYl90aW1lc3luY19zY2hlZHVsZShzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmMsIGludCBzdGF0ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChzdGF0ZSAhPSBHQl9USU1FU1lOQ19TVEFURV9JTklUICYmIHN0YXRlICE9IEdCX1RJTUVTWU5DX1NUQVRFX1BJTkcpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmdGltZXN5bmNfc3ZjLT5tdXRleCk7CisJaWYgKHRpbWVzeW5jX3N2Yy0+c3RhdGUgIT0gIEdCX1RJTUVTWU5DX1NUQVRFX0lOVkFMSUQpIHsKKwkJZ2JfdGltZXN5bmNfc2V0X3N0YXRlX2F0b21pYyh0aW1lc3luY19zdmMsIHN0YXRlKTsKKwl9IGVsc2UgeworCQlyZXQgPSAtRU5PREVWOworCX0KKwltdXRleF91bmxvY2soJnRpbWVzeW5jX3N2Yy0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19nYl90aW1lc3luY19zY2hlZHVsZV9zeW5jaHJvbm91cygKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmMsIGludCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlyZXQgPSBnYl90aW1lc3luY19zY2hlZHVsZSh0aW1lc3luY19zdmMsIHN0YXRlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHRpbWVzeW5jX3N2Yy0+d2FpdF9xdWV1ZSwKKwkJCSh0aW1lc3luY19zdmMtPnN0YXRlID09IEdCX1RJTUVTWU5DX1NUQVRFX0FDVElWRSB8fAorCQkJIHRpbWVzeW5jX3N2Yy0+c3RhdGUgPT0gR0JfVElNRVNZTkNfU1RBVEVfSU5BQ1RJVkUgfHwKKwkJCSB0aW1lc3luY19zdmMtPnN0YXRlID09IEdCX1RJTUVTWU5DX1NUQVRFX0lOVkFMSUQpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmdGltZXN5bmNfc3ZjLT5tdXRleCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpbWVzeW5jX3N2Yy0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldCA9IF9fZ2JfdGltZXN5bmNfZ2V0X3N0YXR1cyh0aW1lc3luY19zdmMpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGltZXN5bmNfc3ZjLT5zcGlubG9jaywgZmxhZ3MpOworCW11dGV4X3VubG9jaygmdGltZXN5bmNfc3ZjLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqZ2JfdGltZXN5bmNfZmluZF90aW1lc3luY19zdmMoCisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCkKK3sKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpbWVzeW5jX3N2YywgJmdiX3RpbWVzeW5jX3N2Y19saXN0LCBsaXN0KSB7CisJCWlmICh0aW1lc3luY19zdmMtPnN2YyA9PSBoZC0+c3ZjKQorCQkJcmV0dXJuIHRpbWVzeW5jX3N2YzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2JfdGltZXN5bmNfaW50ZXJmYWNlICpnYl90aW1lc3luY19maW5kX3RpbWVzeW5jX2ludGVyZmFjZSgKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmMsCisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCBnYl90aW1lc3luY19pbnRlcmZhY2UgKnRpbWVzeW5jX2ludGVyZmFjZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodGltZXN5bmNfaW50ZXJmYWNlLCAmdGltZXN5bmNfc3ZjLT5pbnRlcmZhY2VfbGlzdCwgbGlzdCkgeworCQlpZiAodGltZXN5bmNfaW50ZXJmYWNlLT5pbnRlcmZhY2UgPT0gaW50ZXJmYWNlKQorCQkJcmV0dXJuIHRpbWVzeW5jX2ludGVyZmFjZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBnYl90aW1lc3luY19zY2hlZHVsZV9zeW5jaHJvbm91cyhzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmM7CisJaW50IHJldHJpZXM7CisKKwlpZiAoIShpbnRlcmZhY2UtPmZlYXR1cmVzICYgR1JFWUJVU19JTlRFUkZBQ0VfRkVBVFVSRV9USU1FU1lOQykpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmZ2JfdGltZXN5bmNfc3ZjX2xpc3RfbXV0ZXgpOworCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCBHQl9USU1FU1lOQ19NQVhfUkVUUklFUzsgcmV0cmllcysrKSB7CisJCXRpbWVzeW5jX3N2YyA9IGdiX3RpbWVzeW5jX2ZpbmRfdGltZXN5bmNfc3ZjKGludGVyZmFjZS0+aGQpOworCQlpZiAoIXRpbWVzeW5jX3N2YykgeworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCXJldCA9IF9fZ2JfdGltZXN5bmNfc2NoZWR1bGVfc3luY2hyb25vdXModGltZXN5bmNfc3ZjLAorCQkJCQkJIEdCX1RJTUVTWU5DX1NUQVRFX0lOSVQpOworCQlpZiAoIXJldCkKKwkJCWJyZWFrOworCX0KKwlpZiAocmV0ICYmIHJldHJpZXMgPT0gR0JfVElNRVNZTkNfTUFYX1JFVFJJRVMpCisJCXJldCA9IC1FVElNRURPVVQ7Citkb25lOgorCW11dGV4X3VubG9jaygmZ2JfdGltZXN5bmNfc3ZjX2xpc3RfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl90aW1lc3luY19zY2hlZHVsZV9zeW5jaHJvbm91cyk7CisKK3ZvaWQgZ2JfdGltZXN5bmNfc2NoZWR1bGVfYXN5bmNocm9ub3VzKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmM7CisKKwlpZiAoIShpbnRlcmZhY2UtPmZlYXR1cmVzICYgR1JFWUJVU19JTlRFUkZBQ0VfRkVBVFVSRV9USU1FU1lOQykpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmdiX3RpbWVzeW5jX3N2Y19saXN0X211dGV4KTsKKwl0aW1lc3luY19zdmMgPSBnYl90aW1lc3luY19maW5kX3RpbWVzeW5jX3N2YyhpbnRlcmZhY2UtPmhkKTsKKwlpZiAoIXRpbWVzeW5jX3N2YykKKwkJZ290byBkb25lOworCisJZ2JfdGltZXN5bmNfc2NoZWR1bGUodGltZXN5bmNfc3ZjLCBHQl9USU1FU1lOQ19TVEFURV9JTklUKTsKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZnYl90aW1lc3luY19zdmNfbGlzdF9tdXRleCk7CisJcmV0dXJuOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfdGltZXN5bmNfc2NoZWR1bGVfYXN5bmNocm9ub3VzKTsKKworc3RhdGljIHNzaXplX3QgZ2JfdGltZXN5bmNfcGluZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdWJ1ZiwKKwkJCQkgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0LCBib29sIGt0aW1lKQoreworCXN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YyA9IGZpbGUtPmZfaW5vZGUtPmlfcHJpdmF0ZTsKKwljaGFyICpidWY7CisJc3NpemVfdCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmZ2JfdGltZXN5bmNfc3ZjX2xpc3RfbXV0ZXgpOworCW11dGV4X2xvY2soJnRpbWVzeW5jX3N2Yy0+bXV0ZXgpOworCWlmIChsaXN0X2VtcHR5KCZ0aW1lc3luY19zdmMtPmludGVyZmFjZV9saXN0KSkKKwkJcmV0ID0gLUVOT0RFVjsKKwl0aW1lc3luY19zdmMtPnByaW50X3BpbmcgPSBmYWxzZTsKKwltdXRleF91bmxvY2soJnRpbWVzeW5jX3N2Yy0+bXV0ZXgpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKworCXJldCA9IF9fZ2JfdGltZXN5bmNfc2NoZWR1bGVfc3luY2hyb25vdXModGltZXN5bmNfc3ZjLAorCQkJCQkJIEdCX1RJTUVTWU5DX1NUQVRFX1BJTkcpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKworCWJ1ZiA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGt0aW1lKQorCQlyZXQgPSBnYl90aW1lc3luY19sb2dfZnJhbWVfa3RpbWUodGltZXN5bmNfc3ZjLCBidWYsIFBBR0VfU0laRSk7CisJZWxzZQorCQlyZXQgPSBnYl90aW1lc3luY19sb2dfZnJhbWVfdGltZSh0aW1lc3luY19zdmMsIGJ1ZiwgUEFHRV9TSVpFKTsKKwlpZiAocmV0ID4gMCkKKwkJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodWJ1ZiwgbGVuLCBvZmZzZXQsIGJ1ZiwgcmV0KTsKKwlrZnJlZShidWYpOworZG9uZToKKwltdXRleF91bmxvY2soJmdiX3RpbWVzeW5jX3N2Y19saXN0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBnYl90aW1lc3luY19waW5nX3JlYWRfZnJhbWVfdGltZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJCWNoYXIgX191c2VyICpidWYsCisJCQkJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCkKK3sKKwlyZXR1cm4gZ2JfdGltZXN5bmNfcGluZ19yZWFkKGZpbGUsIGJ1ZiwgbGVuLCBvZmZzZXQsIGZhbHNlKTsKK30KKworc3RhdGljIHNzaXplX3QgZ2JfdGltZXN5bmNfcGluZ19yZWFkX2ZyYW1lX2t0aW1lKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkJIGNoYXIgX191c2VyICpidWYsCisJCQkJCQkgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJcmV0dXJuIGdiX3RpbWVzeW5jX3BpbmdfcmVhZChmaWxlLCBidWYsIGxlbiwgb2Zmc2V0LCB0cnVlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ2JfdGltZXN5bmNfZGVidWdmc19mcmFtZV90aW1lX29wcyA9IHsKKwkucmVhZAkJPSBnYl90aW1lc3luY19waW5nX3JlYWRfZnJhbWVfdGltZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdiX3RpbWVzeW5jX2RlYnVnZnNfZnJhbWVfa3RpbWVfb3BzID0geworCS5yZWFkCQk9IGdiX3RpbWVzeW5jX3BpbmdfcmVhZF9mcmFtZV9rdGltZSwKK307CisKK3N0YXRpYyBpbnQgZ2JfdGltZXN5bmNfaGRfYWRkKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YywKKwkJCSAgICAgIHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQpCit7CisJc3RydWN0IGdiX3RpbWVzeW5jX2hvc3RfZGV2aWNlICp0aW1lc3luY19oZDsKKworCXRpbWVzeW5jX2hkID0ga3phbGxvYyhzaXplb2YoKnRpbWVzeW5jX2hkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0aW1lc3luY19oZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlXQVJOX09OKHRpbWVzeW5jX3N2Yy0+dGltZXN5bmNfaGQpOworCXRpbWVzeW5jX2hkLT5oZCA9IGhkOworCXRpbWVzeW5jX3N2Yy0+dGltZXN5bmNfaGQgPSB0aW1lc3luY19oZDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnYl90aW1lc3luY19oZF9yZW1vdmUoc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjLAorCQkJCSAgc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCkKK3sKKwlpZiAodGltZXN5bmNfc3ZjLT50aW1lc3luY19oZC0+aGQgPT0gaGQpIHsKKwkJa2ZyZWUodGltZXN5bmNfc3ZjLT50aW1lc3luY19oZCk7CisJCXRpbWVzeW5jX3N2Yy0+dGltZXN5bmNfaGQgPSBOVUxMOworCQlyZXR1cm47CisJfQorCVdBUk5fT04oMSk7Cit9CisKK2ludCBnYl90aW1lc3luY19zdmNfYWRkKHN0cnVjdCBnYl9zdmMgKnN2YykKK3sKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmM7CisJaW50IHJldDsKKworCXRpbWVzeW5jX3N2YyA9IGt6YWxsb2Moc2l6ZW9mKCp0aW1lc3luY19zdmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRpbWVzeW5jX3N2YykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0aW1lc3luY19zdmMtPndvcmtfcXVldWUgPQorCQljcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiZ2ItdGltZXN5bmMtd29ya19xdWV1ZSIpOworCisJaWYgKCF0aW1lc3luY19zdmMtPndvcmtfcXVldWUpIHsKKwkJa2ZyZWUodGltZXN5bmNfc3ZjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbXV0ZXhfbG9jaygmZ2JfdGltZXN5bmNfc3ZjX2xpc3RfbXV0ZXgpOworCUlOSVRfTElTVF9IRUFEKCZ0aW1lc3luY19zdmMtPmludGVyZmFjZV9saXN0KTsKKwlJTklUX0RFTEFZRURfV09SSygmdGltZXN5bmNfc3ZjLT5kZWxheWVkX3dvcmssIGdiX3RpbWVzeW5jX3dvcmtlcik7CisJbXV0ZXhfaW5pdCgmdGltZXN5bmNfc3ZjLT5tdXRleCk7CisJc3Bpbl9sb2NrX2luaXQoJnRpbWVzeW5jX3N2Yy0+c3BpbmxvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRpbWVzeW5jX3N2Yy0+d2FpdF9xdWV1ZSk7CisKKwl0aW1lc3luY19zdmMtPnN2YyA9IHN2YzsKKwl0aW1lc3luY19zdmMtPmZyYW1lX3RpbWVfb2Zmc2V0ID0gMDsKKwl0aW1lc3luY19zdmMtPmNhcHR1cmVfcGluZyA9IGZhbHNlOworCWdiX3RpbWVzeW5jX3NldF9zdGF0ZV9hdG9taWModGltZXN5bmNfc3ZjLCBHQl9USU1FU1lOQ19TVEFURV9JTkFDVElWRSk7CisKKwl0aW1lc3luY19zdmMtPmZyYW1lX3RpbWVfZGVudHJ5ID0KKwkJZGVidWdmc19jcmVhdGVfZmlsZSgiZnJhbWUtdGltZSIsIFNfSVJVR08sIHN2Yy0+ZGVidWdmc19kZW50cnksCisJCQkJICAgIHRpbWVzeW5jX3N2YywKKwkJCQkgICAgJmdiX3RpbWVzeW5jX2RlYnVnZnNfZnJhbWVfdGltZV9vcHMpOworCXRpbWVzeW5jX3N2Yy0+ZnJhbWVfa3RpbWVfZGVudHJ5ID0KKwkJZGVidWdmc19jcmVhdGVfZmlsZSgiZnJhbWUta3RpbWUiLCBTX0lSVUdPLCBzdmMtPmRlYnVnZnNfZGVudHJ5LAorCQkJCSAgICB0aW1lc3luY19zdmMsCisJCQkJICAgICZnYl90aW1lc3luY19kZWJ1Z2ZzX2ZyYW1lX2t0aW1lX29wcyk7CisKKwlsaXN0X2FkZCgmdGltZXN5bmNfc3ZjLT5saXN0LCAmZ2JfdGltZXN5bmNfc3ZjX2xpc3QpOworCXJldCA9IGdiX3RpbWVzeW5jX2hkX2FkZCh0aW1lc3luY19zdmMsIHN2Yy0+aGQpOworCWlmIChyZXQpIHsKKwkJbGlzdF9kZWwoJnRpbWVzeW5jX3N2Yy0+bGlzdCk7CisJCWRlYnVnZnNfcmVtb3ZlKHRpbWVzeW5jX3N2Yy0+ZnJhbWVfa3RpbWVfZGVudHJ5KTsKKwkJZGVidWdmc19yZW1vdmUodGltZXN5bmNfc3ZjLT5mcmFtZV90aW1lX2RlbnRyeSk7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKHRpbWVzeW5jX3N2Yy0+d29ya19xdWV1ZSk7CisJCWtmcmVlKHRpbWVzeW5jX3N2Yyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpbml0X3RpbWVyKCZ0aW1lc3luY19zdmMtPmt0aW1lX3RpbWVyKTsKKwl0aW1lc3luY19zdmMtPmt0aW1lX3RpbWVyLmZ1bmN0aW9uID0gZ2JfdGltZXN5bmNfa3RpbWVfdGltZXJfZm47CisJdGltZXN5bmNfc3ZjLT5rdGltZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIEdCX1RJTUVTWU5DX0tUSU1FX1VQREFURTsKKwl0aW1lc3luY19zdmMtPmt0aW1lX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyl0aW1lc3luY19zdmM7CisJYWRkX3RpbWVyKCZ0aW1lc3luY19zdmMtPmt0aW1lX3RpbWVyKTsKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZnYl90aW1lc3luY19zdmNfbGlzdF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX3RpbWVzeW5jX3N2Y19hZGQpOworCit2b2lkIGdiX3RpbWVzeW5jX3N2Y19yZW1vdmUoc3RydWN0IGdiX3N2YyAqc3ZjKQoreworCXN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YzsKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfaW50ZXJmYWNlICp0aW1lc3luY19pbnRlcmZhY2U7CisJc3RydWN0IGdiX3RpbWVzeW5jX2ludGVyZmFjZSAqbmV4dDsKKworCW11dGV4X2xvY2soJmdiX3RpbWVzeW5jX3N2Y19saXN0X211dGV4KTsKKwl0aW1lc3luY19zdmMgPSBnYl90aW1lc3luY19maW5kX3RpbWVzeW5jX3N2YyhzdmMtPmhkKTsKKwlpZiAoIXRpbWVzeW5jX3N2YykKKwkJZ290byBkb25lOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ0aW1lc3luY19zdmMtPmRlbGF5ZWRfd29yayk7CisKKwltdXRleF9sb2NrKCZ0aW1lc3luY19zdmMtPm11dGV4KTsKKworCWdiX3RpbWVzeW5jX3NldF9zdGF0ZV9hdG9taWModGltZXN5bmNfc3ZjLCBHQl9USU1FU1lOQ19TVEFURV9JTlZBTElEKTsKKwlkZWxfdGltZXJfc3luYygmdGltZXN5bmNfc3ZjLT5rdGltZV90aW1lcik7CisJZ2JfdGltZXN5bmNfdGVhcmRvd24odGltZXN5bmNfc3ZjKTsKKworCWdiX3RpbWVzeW5jX2hkX3JlbW92ZSh0aW1lc3luY19zdmMsIHN2Yy0+aGQpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0aW1lc3luY19pbnRlcmZhY2UsIG5leHQsCisJCQkJICZ0aW1lc3luY19zdmMtPmludGVyZmFjZV9saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZ0aW1lc3luY19pbnRlcmZhY2UtPmxpc3QpOworCQlrZnJlZSh0aW1lc3luY19pbnRlcmZhY2UpOworCX0KKwlkZWJ1Z2ZzX3JlbW92ZSh0aW1lc3luY19zdmMtPmZyYW1lX2t0aW1lX2RlbnRyeSk7CisJZGVidWdmc19yZW1vdmUodGltZXN5bmNfc3ZjLT5mcmFtZV90aW1lX2RlbnRyeSk7CisJZGVzdHJveV93b3JrcXVldWUodGltZXN5bmNfc3ZjLT53b3JrX3F1ZXVlKTsKKwlsaXN0X2RlbCgmdGltZXN5bmNfc3ZjLT5saXN0KTsKKworCW11dGV4X3VubG9jaygmdGltZXN5bmNfc3ZjLT5tdXRleCk7CisKKwlrZnJlZSh0aW1lc3luY19zdmMpOworZG9uZToKKwltdXRleF91bmxvY2soJmdiX3RpbWVzeW5jX3N2Y19saXN0X211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX3RpbWVzeW5jX3N2Y19yZW1vdmUpOworCisvKgorICogQWRkIGEgR3JleWJ1cyBJbnRlcmZhY2UgdG8gdGhlIHNldCBvZiBUaW1lU3luYyBJbnRlcmZhY2VzLgorICovCitpbnQgZ2JfdGltZXN5bmNfaW50ZXJmYWNlX2FkZChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjOworCXN0cnVjdCBnYl90aW1lc3luY19pbnRlcmZhY2UgKnRpbWVzeW5jX2ludGVyZmFjZTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghKGludGVyZmFjZS0+ZmVhdHVyZXMgJiBHUkVZQlVTX0lOVEVSRkFDRV9GRUFUVVJFX1RJTUVTWU5DKSkKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZnYl90aW1lc3luY19zdmNfbGlzdF9tdXRleCk7CisJdGltZXN5bmNfc3ZjID0gZ2JfdGltZXN5bmNfZmluZF90aW1lc3luY19zdmMoaW50ZXJmYWNlLT5oZCk7CisJaWYgKCF0aW1lc3luY19zdmMpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBkb25lOworCX0KKworCXRpbWVzeW5jX2ludGVyZmFjZSA9IGt6YWxsb2Moc2l6ZW9mKCp0aW1lc3luY19pbnRlcmZhY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRpbWVzeW5jX2ludGVyZmFjZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGRvbmU7CisJfQorCisJbXV0ZXhfbG9jaygmdGltZXN5bmNfc3ZjLT5tdXRleCk7CisJdGltZXN5bmNfaW50ZXJmYWNlLT5pbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisJbGlzdF9hZGQoJnRpbWVzeW5jX2ludGVyZmFjZS0+bGlzdCwgJnRpbWVzeW5jX3N2Yy0+aW50ZXJmYWNlX2xpc3QpOworCXRpbWVzeW5jX3N2Yy0+c3Ryb2JlX21hc2sgfD0gMSA8PCBpbnRlcmZhY2UtPmludGVyZmFjZV9pZDsKKwltdXRleF91bmxvY2soJnRpbWVzeW5jX3N2Yy0+bXV0ZXgpOworCitkb25lOgorCW11dGV4X3VubG9jaygmZ2JfdGltZXN5bmNfc3ZjX2xpc3RfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl90aW1lc3luY19pbnRlcmZhY2VfYWRkKTsKKworLyoKKyAqIFJlbW92ZSBhIEdyZXlidXMgSW50ZXJmYWNlIGZyb20gdGhlIHNldCBvZiBUaW1lU3luYyBJbnRlcmZhY2VzLgorICovCit2b2lkIGdiX3RpbWVzeW5jX2ludGVyZmFjZV9yZW1vdmUoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YzsKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfaW50ZXJmYWNlICp0aW1lc3luY19pbnRlcmZhY2U7CisKKwlpZiAoIShpbnRlcmZhY2UtPmZlYXR1cmVzICYgR1JFWUJVU19JTlRFUkZBQ0VfRkVBVFVSRV9USU1FU1lOQykpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmdiX3RpbWVzeW5jX3N2Y19saXN0X211dGV4KTsKKwl0aW1lc3luY19zdmMgPSBnYl90aW1lc3luY19maW5kX3RpbWVzeW5jX3N2YyhpbnRlcmZhY2UtPmhkKTsKKwlpZiAoIXRpbWVzeW5jX3N2YykKKwkJZ290byBkb25lOworCisJdGltZXN5bmNfaW50ZXJmYWNlID0gZ2JfdGltZXN5bmNfZmluZF90aW1lc3luY19pbnRlcmZhY2UodGltZXN5bmNfc3ZjLAorCQkJCQkJCQkgaW50ZXJmYWNlKTsKKwlpZiAoIXRpbWVzeW5jX2ludGVyZmFjZSkKKwkJZ290byBkb25lOworCisJbXV0ZXhfbG9jaygmdGltZXN5bmNfc3ZjLT5tdXRleCk7CisJdGltZXN5bmNfc3ZjLT5zdHJvYmVfbWFzayAmPSB+KDEgPDwgaW50ZXJmYWNlLT5pbnRlcmZhY2VfaWQpOworCWxpc3RfZGVsKCZ0aW1lc3luY19pbnRlcmZhY2UtPmxpc3QpOworCWtmcmVlKHRpbWVzeW5jX2ludGVyZmFjZSk7CisJbXV0ZXhfdW5sb2NrKCZ0aW1lc3luY19zdmMtPm11dGV4KTsKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZnYl90aW1lc3luY19zdmNfbGlzdF9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl90aW1lc3luY19pbnRlcmZhY2VfcmVtb3ZlKTsKKworLyoKKyAqIEdpdmUgdGhlIGF1dGhvcml0YXRpdmUgRnJhbWVUaW1lIHRvIHRoZSBjYWxsaW5nIGZ1bmN0aW9uLiBSZXR1cm5zIHplcm8gaWYgd2UKKyAqIGFyZSBub3QgaW4gR0JfVElNRVNZTkNfU1RBVEVfQUNUSVZFLgorICovCitzdGF0aWMgdTY0IGdiX3RpbWVzeW5jX2dldF9mcmFtZV90aW1lKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU2NCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGltZXN5bmNfc3ZjLT5zcGlubG9jaywgZmxhZ3MpOworCWlmICh0aW1lc3luY19zdmMtPnN0YXRlID09IEdCX1RJTUVTWU5DX1NUQVRFX0FDVElWRSkKKwkJcmV0ID0gX19nYl90aW1lc3luY19nZXRfZnJhbWVfdGltZSh0aW1lc3luY19zdmMpOworCWVsc2UKKwkJcmV0ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aW1lc3luY19zdmMtPnNwaW5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKwordTY0IGdiX3RpbWVzeW5jX2dldF9mcmFtZV90aW1lX2J5X2ludGVyZmFjZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjOworCXU2NCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmZ2JfdGltZXN5bmNfc3ZjX2xpc3RfbXV0ZXgpOworCXRpbWVzeW5jX3N2YyA9IGdiX3RpbWVzeW5jX2ZpbmRfdGltZXN5bmNfc3ZjKGludGVyZmFjZS0+aGQpOworCWlmICghdGltZXN5bmNfc3ZjKQorCQlnb3RvIGRvbmU7CisKKwlyZXQgPSBnYl90aW1lc3luY19nZXRfZnJhbWVfdGltZSh0aW1lc3luY19zdmMpOworZG9uZToKKwltdXRleF91bmxvY2soJmdiX3RpbWVzeW5jX3N2Y19saXN0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfdGltZXN5bmNfZ2V0X2ZyYW1lX3RpbWVfYnlfaW50ZXJmYWNlKTsKKwordTY0IGdiX3RpbWVzeW5jX2dldF9mcmFtZV90aW1lX2J5X3N2YyhzdHJ1Y3QgZ2Jfc3ZjICpzdmMpCit7CisJc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjOworCXU2NCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmZ2JfdGltZXN5bmNfc3ZjX2xpc3RfbXV0ZXgpOworCXRpbWVzeW5jX3N2YyA9IGdiX3RpbWVzeW5jX2ZpbmRfdGltZXN5bmNfc3ZjKHN2Yy0+aGQpOworCWlmICghdGltZXN5bmNfc3ZjKQorCQlnb3RvIGRvbmU7CisKKwlyZXQgPSBnYl90aW1lc3luY19nZXRfZnJhbWVfdGltZSh0aW1lc3luY19zdmMpOworZG9uZToKKwltdXRleF91bmxvY2soJmdiX3RpbWVzeW5jX3N2Y19saXN0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfdGltZXN5bmNfZ2V0X2ZyYW1lX3RpbWVfYnlfc3ZjKTsKKworLyogSW5jcmVtZW50YWxseSB1cGRhdGVzIHRoZSBjb252ZXJzaW9uIGJhc2UgZnJvbSBGcmFtZVRpbWUgdG8ga3RpbWUgKi8KK3N0YXRpYyB2b2lkIGdiX3RpbWVzeW5jX2t0aW1lX3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmMgPQorCQkoc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1NjQgZnJhbWVfdGltZTsKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGltZXN5bmNfc3ZjLT5zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKHRpbWVzeW5jX3N2Yy0+c3RhdGUgIT0gR0JfVElNRVNZTkNfU1RBVEVfQUNUSVZFKQorCQlnb3RvIGRvbmU7CisKKwlrdGltZV9nZXRfdHMoJnRzKTsKKwlmcmFtZV90aW1lID0gX19nYl90aW1lc3luY19nZXRfZnJhbWVfdGltZSh0aW1lc3luY19zdmMpOworCWdiX3RpbWVzeW5jX3N0b3JlX2t0aW1lKHRpbWVzeW5jX3N2YywgdHMsIGZyYW1lX3RpbWUpOworCitkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpbWVzeW5jX3N2Yy0+c3BpbmxvY2ssIGZsYWdzKTsKKwltb2RfdGltZXIoJnRpbWVzeW5jX3N2Yy0+a3RpbWVfdGltZXIsCisJCSAgamlmZmllcyArIEdCX1RJTUVTWU5DX0tUSU1FX1VQREFURSk7Cit9CisKK2ludCBnYl90aW1lc3luY190b190aW1lc3BlY19ieV9zdmMoc3RydWN0IGdiX3N2YyAqc3ZjLCB1NjQgZnJhbWVfdGltZSwKKwkJCQkgICBzdHJ1Y3QgdGltZXNwZWMgKnRzKQoreworCXN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YzsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmdiX3RpbWVzeW5jX3N2Y19saXN0X211dGV4KTsKKwl0aW1lc3luY19zdmMgPSBnYl90aW1lc3luY19maW5kX3RpbWVzeW5jX3N2YyhzdmMtPmhkKTsKKwlpZiAoIXRpbWVzeW5jX3N2YykgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGRvbmU7CisJfQorCXJldCA9IGdiX3RpbWVzeW5jX3RvX3RpbWVzcGVjKHRpbWVzeW5jX3N2YywgZnJhbWVfdGltZSwgdHMpOworZG9uZToKKwltdXRleF91bmxvY2soJmdiX3RpbWVzeW5jX3N2Y19saXN0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfdGltZXN5bmNfdG9fdGltZXNwZWNfYnlfc3ZjKTsKKworaW50IGdiX3RpbWVzeW5jX3RvX3RpbWVzcGVjX2J5X2ludGVyZmFjZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJCQkJCSB1NjQgZnJhbWVfdGltZSwgc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmM7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZnYl90aW1lc3luY19zdmNfbGlzdF9tdXRleCk7CisJdGltZXN5bmNfc3ZjID0gZ2JfdGltZXN5bmNfZmluZF90aW1lc3luY19zdmMoaW50ZXJmYWNlLT5oZCk7CisJaWYgKCF0aW1lc3luY19zdmMpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IGdiX3RpbWVzeW5jX3RvX3RpbWVzcGVjKHRpbWVzeW5jX3N2YywgZnJhbWVfdGltZSwgdHMpOworZG9uZToKKwltdXRleF91bmxvY2soJmdiX3RpbWVzeW5jX3N2Y19saXN0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfdGltZXN5bmNfdG9fdGltZXNwZWNfYnlfaW50ZXJmYWNlKTsKKwordm9pZCBnYl90aW1lc3luY19pcnEoc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTY0IHN0cm9iZV90aW1lOworCWJvb2wgc3Ryb2JlX2lzX3BpbmcgPSB0cnVlOworCXN0cnVjdCB0aW1lc3BlYyB0czsKKworCWt0aW1lX2dldF90cygmdHMpOworCXN0cm9iZV90aW1lID0gX19nYl90aW1lc3luY19nZXRfZnJhbWVfdGltZSh0aW1lc3luY19zdmMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpbWVzeW5jX3N2Yy0+c3BpbmxvY2ssIGZsYWdzKTsKKworCWlmICh0aW1lc3luY19zdmMtPnN0YXRlID09IEdCX1RJTUVTWU5DX1NUQVRFX1BJTkcpIHsKKwkJaWYgKCF0aW1lc3luY19zdmMtPmNhcHR1cmVfcGluZykKKwkJCWdvdG8gZG9uZV9ub2xvZzsKKwkJdGltZXN5bmNfc3ZjLT5hcF9waW5nX2ZyYW1lX3RpbWUgPSBzdHJvYmVfdGltZTsKKwkJZ290byBkb25lX2xvZzsKKwl9IGVsc2UgaWYgKHRpbWVzeW5jX3N2Yy0+c3RhdGUgIT0gR0JfVElNRVNZTkNfU1RBVEVfV0FJVF9TVkMpIHsKKwkJZ290byBkb25lX25vbG9nOworCX0KKworCXRpbWVzeW5jX3N2Yy0+c3Ryb2JlX2RhdGFbdGltZXN5bmNfc3ZjLT5zdHJvYmVdLmZyYW1lX3RpbWUgPSBzdHJvYmVfdGltZTsKKwl0aW1lc3luY19zdmMtPnN0cm9iZV9kYXRhW3RpbWVzeW5jX3N2Yy0+c3Ryb2JlXS50cyA9IHRzOworCisJaWYgKCsrdGltZXN5bmNfc3ZjLT5zdHJvYmUgPT0gR0JfVElNRVNZTkNfTUFYX1NUUk9CRVMpIHsKKwkJZ2JfdGltZXN5bmNfc2V0X3N0YXRlKHRpbWVzeW5jX3N2YywKKwkJCQkgICAgICBHQl9USU1FU1lOQ19TVEFURV9BVVRIT1JJVEFUSVZFKTsKKwl9CisJc3Ryb2JlX2lzX3BpbmcgPSBmYWxzZTsKK2RvbmVfbG9nOgorCXRyYWNlX2diX3RpbWVzeW5jX2lycShzdHJvYmVfaXNfcGluZywgdGltZXN5bmNfc3ZjLT5zdHJvYmUsCisJCQkgICAgICBHQl9USU1FU1lOQ19NQVhfU1RST0JFUywgc3Ryb2JlX3RpbWUpOworZG9uZV9ub2xvZzoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aW1lc3luY19zdmMtPnNwaW5sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGdiX3RpbWVzeW5jX2lycSk7CisKK2ludCBfX2luaXQgZ2JfdGltZXN5bmNfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisJcmV0ID0gZ2JfdGltZXN5bmNfcGxhdGZvcm1faW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJ0aW1lc3luYyBwbGF0Zm9ybSBpbml0IGZhaWwhXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlnYl90aW1lc3luY19jbG9ja19yYXRlID0gZ2JfdGltZXN5bmNfcGxhdGZvcm1fZ2V0X2Nsb2NrX3JhdGUoKTsKKworCS8qIENhbGN1bGF0ZSBuYW5vc2Vjb25kcyBhbmQgZmVtdG9zZWNvbmRzIHBlciBjbG9jayAqLworCWdiX3RpbWVzeW5jX2ZzX3Blcl9jbG9jayA9IEZTRUNfUEVSX1NFQzsKKwlkb19kaXYoZ2JfdGltZXN5bmNfZnNfcGVyX2Nsb2NrLCBnYl90aW1lc3luY19jbG9ja19yYXRlKTsKKwlnYl90aW1lc3luY19uc19wZXJfY2xvY2sgPSBOU0VDX1BFUl9TRUM7CisJZG9fZGl2KGdiX3RpbWVzeW5jX25zX3Blcl9jbG9jaywgZ2JfdGltZXN5bmNfY2xvY2tfcmF0ZSk7CisKKwkvKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNsb2NrcyB3ZSB3aWxsIGNvbnZlcnQgdG8ga3RpbWUgKi8KKwlnYl90aW1lc3luY19tYXhfa3RpbWVfZGlmZiA9CisJCUdCX1RJTUVTWU5DX01BWF9LVElNRV9DT05WRVJTSU9OICogZ2JfdGltZXN5bmNfY2xvY2tfcmF0ZTsKKworCXByX2luZm8oIlRpbWUtU3luYyBAICVsdSBIeiBtYXgga3RpbWUgY29udmVyc2lvbiArLy0gJWQgc2Vjb25kc1xuIiwKKwkJZ2JfdGltZXN5bmNfY2xvY2tfcmF0ZSwgR0JfVElNRVNZTkNfTUFYX0tUSU1FX0NPTlZFUlNJT04pOworCXJldHVybiAwOworfQorCit2b2lkIGdiX3RpbWVzeW5jX2V4aXQodm9pZCkKK3sKKwlnYl90aW1lc3luY19wbGF0Zm9ybV9leGl0KCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90aW1lc3luYy5oIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdGltZXN5bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmZjOWEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdGltZXN5bmMuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogVGltZVN5bmMgQVBJIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTYgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaWZuZGVmIF9fVElNRVNZTkNfSAorI2RlZmluZSBfX1RJTUVTWU5DX0gKKworc3RydWN0IGdiX3N2YzsKK3N0cnVjdCBnYl9pbnRlcmZhY2U7CitzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjOworCisvKiBQbGF0Zm9ybSAqLwordTY0IGdiX3RpbWVzeW5jX3BsYXRmb3JtX2dldF9jb3VudGVyKHZvaWQpOwordTMyIGdiX3RpbWVzeW5jX3BsYXRmb3JtX2dldF9jbG9ja19yYXRlKHZvaWQpOworaW50IGdiX3RpbWVzeW5jX3BsYXRmb3JtX2xvY2tfYnVzKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnBkYXRhKTsKK3ZvaWQgZ2JfdGltZXN5bmNfcGxhdGZvcm1fdW5sb2NrX2J1cyh2b2lkKTsKKworaW50IGdiX3RpbWVzeW5jX3BsYXRmb3JtX2luaXQodm9pZCk7Cit2b2lkIGdiX3RpbWVzeW5jX3BsYXRmb3JtX2V4aXQodm9pZCk7CisKKy8qIENvcmUgQVBJICovCitpbnQgZ2JfdGltZXN5bmNfaW50ZXJmYWNlX2FkZChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOwordm9pZCBnYl90aW1lc3luY19pbnRlcmZhY2VfcmVtb3ZlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGVyZmFjZSk7CitpbnQgZ2JfdGltZXN5bmNfc3ZjX2FkZChzdHJ1Y3QgZ2Jfc3ZjICpzdmMpOwordm9pZCBnYl90aW1lc3luY19zdmNfcmVtb3ZlKHN0cnVjdCBnYl9zdmMgKnN2Yyk7CisKK3U2NCBnYl90aW1lc3luY19nZXRfZnJhbWVfdGltZV9ieV9pbnRlcmZhY2Uoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZXJmYWNlKTsKK3U2NCBnYl90aW1lc3luY19nZXRfZnJhbWVfdGltZV9ieV9zdmMoc3RydWN0IGdiX3N2YyAqc3ZjKTsKK2ludCBnYl90aW1lc3luY190b190aW1lc3BlY19ieV9zdmMoc3RydWN0IGdiX3N2YyAqc3ZjLCB1NjQgZnJhbWVfdGltZSwKKwkJCQkgICBzdHJ1Y3QgdGltZXNwZWMgKnRzKTsKK2ludCBnYl90aW1lc3luY190b190aW1lc3BlY19ieV9pbnRlcmZhY2Uoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAorCQkJCQkgdTY0IGZyYW1lX3RpbWUsIHN0cnVjdCB0aW1lc3BlYyAqdHMpOworCitpbnQgZ2JfdGltZXN5bmNfc2NoZWR1bGVfc3luY2hyb25vdXMoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50Zik7Cit2b2lkIGdiX3RpbWVzeW5jX3NjaGVkdWxlX2FzeW5jaHJvbm91cyhzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKTsKK3ZvaWQgZ2JfdGltZXN5bmNfaXJxKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2Yyk7CitpbnQgZ2JfdGltZXN5bmNfaW5pdCh2b2lkKTsKK3ZvaWQgZ2JfdGltZXN5bmNfZXhpdCh2b2lkKTsKKworI2VuZGlmIC8qIF9fVElNRVNZTkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdGltZXN5bmNfcGxhdGZvcm0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3RpbWVzeW5jX3BsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzZjNkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3RpbWVzeW5jX3BsYXRmb3JtLmMKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIFRpbWVTeW5jIEFQSSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE2IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKgorICogVGhpcyBjb2RlIHJlYWRzIGRpcmVjdGx5IGZyb20gYW4gQVJNdjcgbWVtb3J5LW1hcHBlZCB0aW1lciB0aGF0IGxpdmVzIGluCisgKiBNTUlPIHNwYWNlLiBTaW5jZSB0aGlzIGNvdW50ZXIgbGl2ZXMgaW5zaWRlIG9mIE1NSU8gc3BhY2UgaXRzIHNoYXJlZCBiZXR3ZWVuCisgKiBjb3JlcyBhbmQgdGhhdCBtZWFucyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGlzc3VlcyBsaWtlIFRTQyBvbiB4ODYKKyAqIHdoZXJlIGVhY2ggdGltZS1zdGFtcC1jb3VudGVyIChUU0MpIGlzIGxvY2FsIHRvIGEgcGFydGljdWxhciBjb3JlLgorICoKKyAqIFJlZ2lzdGVyLWxldmVsIGFjY2VzcyBjb2RlIGlzIGJhc2VkIG9uCisgKiBkcml2ZXJzL2Nsb2Nrc291cmNlL2FybV9hcmNoX3RpbWVyLmMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImFyY2hlX3BsYXRmb3JtLmgiCisKKyNkZWZpbmUgREVGQVVMVF9GUkFNRVRJTUVfQ0xPQ0tfSFogMTkyMDAwMDAKKworc3RhdGljIHUzMiBnYl90aW1lc3luY19jbG9ja19mcmVxdWVuY3k7CitpbnQgKCphcmNoZV9wbGF0Zm9ybV9jaGFuZ2Vfc3RhdGVfY2IpKGVudW0gYXJjaGVfcGxhdGZvcm1fc3RhdGUgc3RhdGUsCisJCQkJICAgICAgc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqcGRhdGEpOworRVhQT1JUX1NZTUJPTF9HUEwoYXJjaGVfcGxhdGZvcm1fY2hhbmdlX3N0YXRlX2NiKTsKKwordTY0IGdiX3RpbWVzeW5jX3BsYXRmb3JtX2dldF9jb3VudGVyKHZvaWQpCit7CisJcmV0dXJuICh1NjQpZ2V0X2N5Y2xlcygpOworfQorCit1MzIgZ2JfdGltZXN5bmNfcGxhdGZvcm1fZ2V0X2Nsb2NrX3JhdGUodm9pZCkKK3sKKwlpZiAodW5saWtlbHkoIWdiX3RpbWVzeW5jX2Nsb2NrX2ZyZXF1ZW5jeSkpIHsKKwkJZ2JfdGltZXN5bmNfY2xvY2tfZnJlcXVlbmN5ID0gY3B1ZnJlcV9nZXQoMCk7CisJCWlmICghZ2JfdGltZXN5bmNfY2xvY2tfZnJlcXVlbmN5KQorCQkJZ2JfdGltZXN5bmNfY2xvY2tfZnJlcXVlbmN5ID0gREVGQVVMVF9GUkFNRVRJTUVfQ0xPQ0tfSFo7CisJfQorCisJcmV0dXJuIGdiX3RpbWVzeW5jX2Nsb2NrX2ZyZXF1ZW5jeTsKK30KKworaW50IGdiX3RpbWVzeW5jX3BsYXRmb3JtX2xvY2tfYnVzKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnBkYXRhKQoreworCXJldHVybiBhcmNoZV9wbGF0Zm9ybV9jaGFuZ2Vfc3RhdGVfY2IoQVJDSEVfUExBVEZPUk1fU1RBVEVfVElNRV9TWU5DLAorCQkJCQkgICAgICBwZGF0YSk7Cit9CisKK3ZvaWQgZ2JfdGltZXN5bmNfcGxhdGZvcm1fdW5sb2NrX2J1cyh2b2lkKQoreworCWFyY2hlX3BsYXRmb3JtX2NoYW5nZV9zdGF0ZV9jYihBUkNIRV9QTEFURk9STV9TVEFURV9BQ1RJVkUsIE5VTEwpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhcmNoX3RpbWVyX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSAgID0gImdvb2dsZSxncmV5YnVzLWZyYW1lLXRpbWUtY291bnRlciIsIH0sCisJe30sCit9OworCitpbnQgX19pbml0IGdiX3RpbWVzeW5jX3BsYXRmb3JtX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJbnAgPSBvZl9maW5kX21hdGNoaW5nX25vZGUoTlVMTCwgYXJjaF90aW1lcl9vZl9tYXRjaCk7CisJaWYgKCFucCkgeworCQkvKiBUb2xlcmF0ZSBub3QgZmluZGluZyB0byBhbGxvdyBCQkIgZXRjIHRvIGNvbnRpbnVlICovCisJCXByX3dhcm4oIlVuYWJsZSB0byBmaW5kIGEgY29tcGF0aWJsZSBBUk12NyB0aW1lclxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImNsb2NrLWZyZXF1ZW5jeSIsCisJCQkJICZnYl90aW1lc3luY19jbG9ja19mcmVxdWVuY3kpKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGZpbmQgdGltZXIgY2xvY2stZnJlcXVlbmN5XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZ2JfdGltZXN5bmNfcGxhdGZvcm1fZXhpdCh2b2lkKSB7fQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdG9vbHMvLmdpdGlnbm9yZSBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3Rvb2xzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzNjU0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3Rvb2xzLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorbG9vcGJhY2tfdGVzdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdG9vbHMvQW5kcm9pZC5tayBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3Rvb2xzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhZGJmNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3Rvb2xzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBsb29wYmFja190ZXN0LmMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEUgOj0gZ2JfbG9vcGJhY2tfdGVzdAorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdG9vbHMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90b29scy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTJiMTJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdG9vbHMvTWFrZWZpbGUKQEAgLTAsMCArMSwzMSBAQAoraWZlcSAoJChzdHJpcCAkKFYpKSwgMSkKKyAgUSA9CitlbHNlCisgIFEgPSBACitlbmRpZgorCitDRkxBR1MJKz0gLXN0ZD1nbnU5OSAtV2FsbCAtV2V4dHJhIC1nIFwKKwkgICAgLURfR05VX1NPVVJDRSBcCisJICAgIC1Xbm8tdW51c2VkLXBhcmFtZXRlciBcCisJICAgIC1XbWF5YmUtdW5pbml0aWFsaXplZCBcCisJICAgIC1XcmVkdW5kYW50LWRlY2xzIFwKKwkgICAgLVdjYXN0LWFsaWduIFwKKwkgICAgLVdzaWduLWNvbXBhcmUgXAorCSAgICAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzCisKK0NDCTo9ICQoQ1JPU1NfQ09NUElMRSlnY2MKKworVE9PTFMgPSBsb29wYmFja190ZXN0CisKK2FsbDogJChUT09MUykKKworJS5vOiAlLmMgLi4vZ3JleWJ1c19wcm90b2NvbHMuaAorCUBlY2hvICcgIFRBUkdFVF9DQyAkQCcKKwkkKFEpJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACisKK2xvb3BiYWNrXyU6IGxvb3BiYWNrXyUubworCUBlY2hvICcgIFRBUkdFVF9MRCAkQCcKKwkkKFEpJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgJF4gLW8gJEAKKworY2xlYW46OgorCXJtIC1mICoubyAkKFRPT0xTKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdG9vbHMvUkVBRE1FLmxvb3BiYWNrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdG9vbHMvUkVBRE1FLmxvb3BiYWNrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NWIwOGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90b29scy9SRUFETUUubG9vcGJhY2sKQEAgLTAsMCArMSwxOTggQEAKKworCisgICAgICAgIDEgLSBMT09QQkFDSyBEUklWRVIKKworVGhlIGRyaXZlciBpbXBsZW1lbnRzIHRoZSBtYWluIGxvZ2ljIG9mIHRoZSBsb29wYmFjayB0ZXN0IGFuZCBwcm92aWRlcworc3lzZnMgZmlsZXMgdG8gY29uZmlndXJlIHRoZSB0ZXN0IGFuZCByZXRyaWV2ZSB0aGUgcmVzdWx0cy4KK0EgdXNlciBjb3VsZCBydW4gYSB0ZXN0IHdpdGhvdXQgdGhlIG5lZWQgb2YgdGhlIHRlc3QgYXBwbGljYXRpb24gZ2l2ZW4KK3RoYXQgaGUgdW5kZXJzdGFuZHMgdGhlIHN5c2ZzIGludGVyZmFjZSBvZiB0aGUgbG9vcGJhY2sgZHJpdmVyLgorCitUaGUgbG9vcGJhY2sga2VybmVsIGRyaXZlciBuZWVkcyB0byBiZSBsb2FkZWQgYW5kIGF0IGxlYXN0IG9uZSBtb2R1bGUKK3dpdGggdGhlIGxvb3BiYWNrIGZlYXR1cmUgZW5hYmxlZCBtdXN0IGJlIHByZXNlbnQgZm9yIHRoZSBzeXNmcyBmaWxlcyB0byBiZQorY3JlYXRlZCBhbmQgZm9yIHRoZSBsb29wYmFjayB0ZXN0IGFwcGxpY2F0aW9uIHRvIGJlIGFibGUgdG8gcnVuLgorCitUbyBsb2FkIHRoZSBtb2R1bGU6CisjIG1vZHByb2JlIGdiLWxvb3BiYWNrCisKKworV2hlbiB0aGUgbW9kdWxlIGlzIHByb2JlZCwgIE5ldyBmaWxlcyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzeXNmcworZGlyZWN0b3J5IG9mIHRoZSBkZXRlY3RlZCBsb29wYmFjayBkZXZpY2UuCisodHlwaWNhbGx5IHVuZGVyICIvc3lzL2J1cy9ncmF5YnVzL2RldmljZXMiKS4KKworSGVyZSBpcyBhIHNob3J0IHN1bW1hcnkgb2YgdGhlIHN5c2ZzIGludGVyZmFjZSBmaWxlcyB0aGF0IHNob3VsZCBiZSB2aXNpYmxlOgorCisqIExvb3BiYWNrIENvbmZpZ3VyYXRpb24gRmlsZXM6CisgICAgYXN5bmMgLSBVc2UgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCisgICAgaXRlcmF0aW9uX21heCAtIE51bWJlciBvZiB0ZXN0cyBpdGVyYXRpb25zIHRvIHBlcmZvcm0uCisgICAgc2l6ZSAtIHBheWxvYWQgc2l6ZSBvZiB0aGUgdHJhbnNmZXIuCisgICAgdGltZW91dCAtIFRoZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIHRvIGdpdmUgYW4gaW5kaXZpZHVhbAorICAgICAgICAgICAgICBhc3luY2hyb25vdXMgcmVxdWVzdCBiZWZvcmUgdGltaW5nIG91dC4KKyAgICB1c193YWl0IC0gVGltZSB0byB3YWl0IGJldHdlZW4gMiBtZXNzYWdlcworICAgIHR5cGUgLSBCeSB3cml0aW5nIHRoZSB0ZXN0IHR5cGUgdG8gdGhpcyBmaWxlLCB0aGUgdGVzdCBzdGFydHMuCisgICAgICAgICAgIFZhbGlkIHRlc3RzIGFyZToKKyAgICAgICAgICAgICAwIHN0b3AgdGhlIHRlc3QKKyAgICAgICAgICAgICAyIC0gcGluZworICAgICAgICAgICAgIDMgLSB0cmFuc2ZlcgorICAgICAgICAgICAgIDQgLSBzaW5rCisKKyogTG9vcGJhY2sgZmVlZGJhY2sgZmlsZXM6CisgICAgZXJyb3IgLSBudW1iZXIgb2YgZXJyb3JzIHRoYXQgaGF2ZSBvY2N1cnJlZC4KKyAgICBpdGVyYXRpb25fY291bnQgLSBOdW1iZXIgb2YgaXRlcmF0aW9ucyBwZXJmb3JtZWQuCisgICAgcmVxdWVzdHNfY29tcGxldGVkIC0gTnVtYmVyIG9mIHJlcXVlc3RzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuCisgICAgcmVxdWVzdHNfdGltZWRvdXQgLSBOdW1iZXIgb2YgcmVxdWVzdHMgdGhhdCBoYXZlIHRpbWVkIG91dC4KKyAgICB0aW1lb3V0X21heCAtIE1heCBhbGxvd2VkIHRpbWVvdXQKKyAgICB0aW1lb3V0X21pbiAtIE1pbiBhbGxvd2VkIHRpbWVvdXQuCisKKyogTG9vcGJhY2sgcmVzdWx0IGZpbGVzOgorICAgIGFwYnJpZGdlX3VuaXByb19sYXRlbmN5X2F2ZworICAgIGFwYnJpZGdlX3VuaXByb19sYXRlbmN5X21heAorICAgIGFwYnJpZGdlX3VuaXByb19sYXRlbmN5X21pbgorICAgIGdwYnJpZGdlX2Zpcm13YXJlX2xhdGVuY3lfYXZnCisgICAgZ3BicmlkZ2VfZmlybXdhcmVfbGF0ZW5jeV9tYXgKKyAgICBncGJyaWRnZV9maXJtd2FyZV9sYXRlbmN5X21pbgorICAgIHJlcXVlc3RzX3Blcl9zZWNvbmRfYXZnCisgICAgcmVxdWVzdHNfcGVyX3NlY29uZF9tYXgKKyAgICByZXF1ZXN0c19wZXJfc2Vjb25kX21pbgorICAgIGxhdGVuY3lfYXZnCisgICAgbGF0ZW5jeV9tYXgKKyAgICBsYXRlbmN5X21pbgorICAgIHRocm91Z2hwdXRfYXZnCisgICAgdGhyb3VnaHB1dF9tYXgKKyAgICB0aHJvdWdocHV0X21pbgorCisKKworICAgICAgICAgICAgMiAtIExPT1BCQUNLIFRFU1QgQVBQTElDQVRJT04KKworVGhlIGxvb3BiYWNrIHRlc3QgYXBwbGljYXRpb24gbWFuYWdlcyBhbmQgZm9ybWF0cyB0aGUgcmVzdWx0cyBwcm92aWRlZCBieQordGhlIGxvb3BiYWNrIGtlcm5lbCBtb2R1bGUuIFRoZSBwdXJwb3NlIG9mIHRoaXMgYXBwbGljYXRpb24KK2lzIHRvOgorICAgIC0gU3RhcnQgYW5kIG1hbmFnZSBtdWx0aXBsZSBsb29wYmFjayBkZXZpY2UgdGVzdHMgY29uY3VycmVudGx5LgorICAgIC0gQ2FsY3VsYXRlIHRoZSBhZ2dyZWdhdGUgcmVzdWx0cyBmb3IgbXVsdGlwbGUgZGV2aWNlcy4KKyAgICAtIEdhdGhlciBhbmQgZm9ybWF0IHRlc3QgcmVzdWx0cyAoY3N2IG9yIGh1bWFuIHJlYWRhYmxlKS4KKworVGhlIGJlc3Qgd2F5IHRvIGdldCB1cCB0byBkYXRlIHVzYWdlIGluZm9ybWF0aW9uIGZvciB0aGUgYXBwbGljYXRpb24gaXMKK3VzdWFsbHkgdG8gcGFzcyB0aGUgIi1oIiBwYXJhbWV0ZXIuCitIZXJlIGlzIHRoZSBzdW1tYXJ5IG9mIHRoZSBhdmFpbGFibGUgb3B0aW9uczoKKworIE1hbmRhdG9yeSBhcmd1bWVudHMKKyAgIC10ICAgICBtdXN0IGJlIG9uZSBvZiB0aGUgdGVzdCBuYW1lcyAtIHNpbmssIHRyYW5zZmVyIG9yIHBpbmcKKyAgIC1pICAgICBpdGVyYXRpb24gY291bnQgLSB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gcnVuIHRoZSB0ZXN0IG92ZXIKKyBPcHRpb25hbCBhcmd1bWVudHMKKyAgIC1TICAgICBzeXNmcyBsb2NhdGlvbiAtIGxvY2F0aW9uIGZvciBncmV5YnVzICdlbmRvJyBlbnRpcmVzIGRlZmF1bHQgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLworICAgLUQgICAgIGRlYnVnZnMgbG9jYXRpb24gLSBsb2NhdGlvbiBmb3IgbG9vcGJhY2sgZGVidWdmcyBlbnRyaWVzIGRlZmF1bHQgL3N5cy9rZXJuZWwvZGVidWcvZ2JfbG9vcGJhY2svCisgICAtcyAgICAgc2l6ZSBvZiBkYXRhIHBhY2tldCB0byBzZW5kIGR1cmluZyB0ZXN0IC0gZGVmYXVsdHMgdG8gemVybworICAgLW0gICAgIG1hc2sgLSBhIGJpdCBtYXNrIG9mIGNvbm5lY3Rpb25zIHRvIGluY2x1ZGUgZXhhbXBsZTogLW0gOCA9IDR0aCBjb25uZWN0aW9uIC1tIDkgPSAxc3QgYW5kIDR0aCBjb25uZWN0aW9uIGV0YworICAgICAgICAgICAgICAgICBkZWZhdWx0IGlzIHplcm8gd2hpY2ggbWVhbnMgYnJvYWRjYXN0IHRvIGFsbCBjb25uZWN0aW9ucworICAgLXYgICAgIHZlcmJvc2Ugb3V0cHV0CisgICAtZCAgICAgZGVidWcgb3V0cHV0CisgICAtciAgICAgcmF3IGRhdGEgb3V0cHV0IC0gd2hlbiBzcGVjaWZpZWQgdGhlIGZ1bGwgbGlzdCBvZiBsYXRlbmN5IHZhbHVlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBDU1YKKyAgIC1wICAgICBwb3JjZWxhaW4gLSB3aGVuIHNwZWNpZmllZCBwcmludG91dCBpcyBpbiBhIHVzZXItZnJpZW5kbHkgbm9uLUNTViBmb3JtYXQuIFRoaXMgb3B0aW9uIHN1cHByZXNzZXMgd3JpdGluZyB0byBDU1YgZmlsZQorICAgLWEgICAgIGFnZ3JlZ2F0ZSAtIHNob3cgYWdncmVnYXRpb24gb2YgYWxsIGVuYWJsZWQgZGV2aWVzCisgICAtbCAgICAgbGlzdCBmb3VuZCBsb29wYmFjayBkZXZpY2VzIGFuZCBleGl0LgorICAgLXggICAgIEFzeW5jIC0gRW5hYmxlIGFzeW5jIHRyYW5zZmVycy4KKyAgIC1vICAgICBUaW1lb3V0IC0gVGltZW91dCBpbiBtaWNyb3NlY29uZHMgZm9yIGFzeW5jIG9wZXJhdGlvbnMuCisKKworCisgICAgICAgICAgICAgMyAtIFJFQUwgV09STEQgRVhBTVBMRSBVU0FHRVMKKworIDMuMSAtIFVzaW5nIHRoZSBkcml2ZXIgc3lzZnMgZmlsZXMgdG8gcnVuIGEgdGVzdCBvbiBhIHNpbmdsZSBkZXZpY2U6CisKKyogUnVuIGEgMTAwMCB0cmFuc2ZlcnMgb2YgYSAxMDAgYnl0ZSBwYWNrZXQuIEVhY2ggdHJhbnNmZXIgaXMgc3RhcnRlZCBvbmx5CithZnRlciB0aGUgcHJldmlvdXMgb25lIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseToKKyAgICBlY2hvIDAgPiAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L3R5cGUKKyAgICBlY2hvIDAgPiAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L2FzeW5jCisgICAgZWNobyAyMDAwID4gL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy91c193YWl0CisgICAgZWNobyAxMDAgPiAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L3NpemUKKyAgICBlY2hvIDEwMDAgPiAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L2l0ZXJhdGlvbl9tYXgKKyAgICBlY2hvIDAgPiAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L21hc2sKKyAgICBlY2hvIDIwMDAwMCA+IC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTIuMTcvdGltZW91dAorICAgIGVjaG8gMyA+IC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTIuMTcvdHlwZQorCisqIFJ1biBhIDEwMDAgdHJhbnNmZXJzIG9mIGEgMTAwIGJ5dGUgcGFja2V0LiBUcmFuc2ZlcnMgYXJlIHN0YXJ0ZWQgd2l0aG91dAord2FpdGluZyBmb3IgdGhlIHByZXZpb3VzIG9uZSB0byBmaW5pc2g6CisgICAgZWNobyAwID4gL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy90eXBlCisgICAgZWNobyAzID4gL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9hc3luYworICAgIGVjaG8gMCA+IC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTIuMTcvdXNfd2FpdAorICAgIGVjaG8gMTAwID4gL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9zaXplCisgICAgZWNobyAxMDAwID4gL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9pdGVyYXRpb25fbWF4CisgICAgZWNobyAwID4gL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9tYXNrCisgICAgZWNobyAyMDAwMDAgPiAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L3RpbWVvdXQKKyAgICBlY2hvIDMgPiAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L3R5cGUKKworKiBSZWFkIHRoZSByZXN1bHRzIGZyb20gc3lzZnM6CisgICAgY2F0IC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTIuMTcvcmVxdWVzdHNfcGVyX3NlY29uZF9taW4KKyAgICBjYXQgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9yZXF1ZXN0c19wZXJfc2Vjb25kX21heAorICAgIGNhdCAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L3JlcXVlc3RzX3Blcl9zZWNvbmRfYXZnCisKKyAgICBjYXQgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9sYXRlbmN5X21pbgorICAgIGNhdCAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L2xhdGVuY3lfbWF4CisgICAgY2F0IC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTIuMTcvbGF0ZW5jeV9hdmcKKworICAgIGNhdCAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L2FwYnJpZGdlX3VuaXByb19sYXRlbmN5X21pbgorICAgIGNhdCAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L2FwYnJpZGdlX3VuaXByb19sYXRlbmN5X21heAorICAgIGNhdCAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L2FwYnJpZGdlX3VuaXByb19sYXRlbmN5X2F2ZworCisgICAgY2F0IC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTIuMTcvZ3BicmlkZ2VfZmlybXdhcmVfbGF0ZW5jeV9taW4KKyAgICBjYXQgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9ncGJyaWRnZV9maXJtd2FyZV9sYXRlbmN5X21heAorICAgIGNhdCAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L2dwYnJpZGdlX2Zpcm13YXJlX2xhdGVuY3lfYXZnCisKKyAgICBjYXQgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9lcnJvcgorICAgIGNhdCAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L3JlcXVlc3RzX2NvbXBsZXRlZAorICAgIGNhdCAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L3JlcXVlc3RzX3RpbWVkb3V0CisKKworMy4yIC0gdXNpbmcgdGhlIHRlc3QgYXBwbGljYXRpb246CisKKyogUnVuIGEgdHJhbnNmZXIgdGVzdCAxMCBpdGVyYXRpb25zIG9mIHNpemUgMTAwIGJ5dGVzIG9uIGFsbCBhdmFpbGFibGUgZGV2aWNlcworICAgICMvbG9vcGJhY2tfdGVzdCAtdCB0cmFuc2ZlciAtaSAxMCAtcyAxMDAKKyAgICAxOTcwLTEtMSAwOjEwOjcsdHJhbnNmZXIsMS00LjE3LDEwMCwxMCwwLDQ0Myw1MDksNDcxLjcwMDAxMiw2NiwxOTYzLDIyNTYsMjEyNC42MDAwOTgsMjkzLDEwMjc3NiwxMTgwODgsMTA5MzE4Ljg5ODQzOCwxNTMxMiwxNjIwLDE5OTgsMTg5NC4wOTk5NzYsMzc4LDU2LDU3LDU2Ljc5OTk5OSwxCisgICAgMTk3MC0xLTEgMDoxMDo3LHRyYW5zZmVyLDEtNS4xNywxMDAsMTAsMCwzOTksNTQyLDQ2My4zOTk5OTQsMTQzLDE4NDUsMjUwNSwyMTc1LjgwMDA0OSw2NjAsOTI1NjgsMTI1NzQ0LDEwNzM5My4yOTY4NzUsMzMxNzYsMTQ2OSwyMzA1LDE4MDYuNTAwMDAwLDgzNiw1Niw1Nyw1Ni43OTk5OTksMQorCisKKyogU2hvdyB0aGUgYWdncmVnYXRlIHJlc3VsdHMgb2YgYm90aCBkZXZpY2VzLiAoIi1hIikKKyAgICAjL2xvb3BiYWNrX3Rlc3QgLXQgdHJhbnNmZXIgLWkgMTAgLXMgMTAwICAtYQorICAgIDE5NzAtMS0xIDA6MTA6MzUsdHJhbnNmZXIsMS00LjE3LDEwMCwxMCwwLDQ0OCw1ODAsNDk0LjEwMDAwNiwxMzIsMTcyMiwyMjMwLDIwMzkuNDAwMDI0LDUwOCwxMDM5MzYsMTM0NTYwLDExNDUxNS43MDMxMjUsMzA2MjQsMTUxMywxOTgwLDE4MDYuOTAwMDI0LDQ2Nyw1Niw1Nyw1Ny4yOTk5OTksMQorICAgIDE5NzAtMS0xIDA6MTA6MzUsdHJhbnNmZXIsMS01LjE3LDEwMCwxMCwwLDM4Myw1NTgsNDc4LjYwMDAwNiwxNzUsMTc5MSwyNjA2LDIxMTUuMTk5OTUxLDgxNSw4ODg1NiwxMjk0NTYsMTEwOTE5LjcwMzEyNSw0MDYwMCwxNDU3LDIyNDYsMTc3My41OTk5NzYsNzg5LDU2LDU3LDU3LjA5OTk5OCwxCisgICAgMTk3MC0xLTEgMDoxMDozNSx0cmFuc2ZlcixhZ2dyZWdhdGUsMTAwLDEwLDAsMzgzLDU4MCw0ODYuMDAwMDAwLDE5NywxNzIyLDI2MDYsMjA3Ny4wMDAwMDAsODg0LDg4ODU2LDEzNDU2MCwxMTI3MTcuMDAwMDAwLDQ1NzA0LDE0NTcsMjI0NiwxNzg5LjAwMDAwMCw3ODksNTYsNTcsNTcuMDAwMDAwLDEKKworKiBFeGFtcGxlIHVzYWdlIG9mIHRoZSBtYXNrIG9wdGlvbiB0byBzZWxlY3Qgd2hpY2ggZGV2aWNlcyB3aWxsCisgIHJ1biB0aGUgdGVzdCAoMXN0LCAybmQsIG9yIGJvdGggZGV2aWNlcyk6CisgICAgIyAvbG9vcGJhY2tfdGVzdCAtdCB0cmFuc2ZlciAtaSAxMCAtcyAxMDAgLW0gMQorICAgIDE5NzAtMS0xIDA6MTE6NTYsdHJhbnNmZXIsMS00LjE3LDEwMCwxMCwwLDUxNCw1NTgsNTQ0LjkwMDAyNCw0NCwxNzkxLDE5NDMsMTgzNi41OTk5NzYsMTUyLDExOTI0OCwxMjk0NTYsMTI2MzAxLjI5Njg3NSwxMDIwOCwxNjAwLDEwMDE2MDksMTAxNjEzLjYwMTU2MiwxMDAwMDA5LDU2LDU3LDU2LjkwMDAwMiwxCisgICAgIyAvbG9vcGJhY2tfdGVzdCAtdCB0cmFuc2ZlciAtaSAxMCAtcyAxMDAgLW0gMgorICAgIDE5NzAtMS0xIDA6MTI6MCx0cmFuc2ZlciwxLTUuMTcsMTAwLDEwLDAsNDY4LDU1NCw1MzkuMDAwMDAwLDg2LDE4MDQsMjEzNCwxODU5LjUwMDAwMCwzMzAsMTA4NTc2LDEyODUyOCwxMjQ5MzIuNTAwMDAwLDE5OTUyLDE2MDYsMTYyNiwxNjE5LjMwMDA0OSwyMCw1Niw1Nyw1Ny40MDAwMDIsMQorICAgICMgL2xvb3BiYWNrX3Rlc3QgLXQgdHJhbnNmZXIgLWkgMTAgLXMgMTAwIC1tIDMKKyAgICAxOTcwLTEtMSAwOjEyOjMsdHJhbnNmZXIsMS00LjE3LDEwMCwxMCwwLDQzMiw1MTAsNDY5LjM5OTk5NCw3OCwxOTU5LDIzMTMsMjEzNS44MDAwNDksMzU0LDEwMDIyNCwxMTgzMjAsMTA4Nzg1LjI5Njg3NSwxODA5NiwxNjEwLDIwMjQsMTg5My41MDAwMDAsNDE0LDU2LDU3LDU3LjIwMDAwMSwxCisgICAgMTk3MC0xLTEgMDoxMjozLHRyYW5zZmVyLDEtNS4xNywxMDAsMTAsMCw0MDQsNTQyLDQ2OC43OTk5ODgsMTM4LDE4NDMsMjQ3MiwyMTUyLjUwMDAwMCw2MjksOTM3MjgsMTI1NzQ0LDEwODY0Ni4xMDE1NjIsMzIwMTYsMTUwNCwyMjQ3LDE4NTMuMDk5OTc2LDc0Myw1Niw1Nyw1Ny4wOTk5OTgsMQorCisqIFNob3cgb3V0cHV0IGluIGh1bWFuIHJlYWRhYmxlIGZvcm1hdCAoIi1wIikKKyAgICAjIC9sb29wYmFja190ZXN0IC10IHRyYW5zZmVyIC1pIDEwIC1zIDEwMCAtbSAzIC1wCisKKyAgICAxOTcwLTEtMSAwOjEyOjM3CisgICAgdGVzdDogICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyCisgICAgcGF0aDogICAgICAgICAgICAgICAgICAgICAgIDEtNC4xNworICAgIHNpemU6ICAgICAgICAgICAgICAgICAgICAgICAxMDAKKyAgICBpdGVyYXRpb25zOiAgICAgICAgICAgICAgICAgMTAKKyAgICBlcnJvcnM6ICAgICAgICAgICAgICAgICAgICAgMAorICAgIGFzeW5jOiAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlZAorICAgIHJlcXVlc3RzIHBlci1zZWM6ICAgICAgICAgICBtaW49MzkwLCBtYXg9NTQ3LCBhdmVyYWdlPTQ2OS4yOTk5ODgsIGppdHRlcj0xNTcKKyAgICBhcC10aHJvdWdocHV0IEIvczogICAgICAgICAgbWluPTkwNDgwIG1heD0xMjY5MDQgYXZlcmFnZT0xMDg3NjIuMTAxNTYyIGppdHRlcj0zNjQyNAorICAgIGFwLWxhdGVuY3kgdXNlYzogICAgICAgICAgICBtaW49MTgyNiBtYXg9MjU2MCBhdmVyYWdlPTIxNDYuMDAwMDAwIGppdHRlcj03MzQKKyAgICBhcGJyaWRnZS1sYXRlbmN5IHVzZWM6ICAgICAgbWluPTE2MjAgbWF4PTE5ODIgYXZlcmFnZT0xODgyLjA5OTk3NiBqaXR0ZXI9MzYyCisgICAgZ3BicmlkZ2UtbGF0ZW5jeSB1c2VjOiAgICAgIG1pbj01NiBtYXg9NTcgYXZlcmFnZT01Ny4wOTk5OTggaml0dGVyPTEKKworCisgICAgMTk3MC0xLTEgMDoxMjozNworICAgIHRlc3Q6ICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcgorICAgIHBhdGg6ICAgICAgICAgICAgICAgICAgICAgICAxLTUuMTcKKyAgICBzaXplOiAgICAgICAgICAgICAgICAgICAgICAgMTAwCisgICAgaXRlcmF0aW9uczogICAgICAgICAgICAgICAgIDEwCisgICAgZXJyb3JzOiAgICAgICAgICAgICAgICAgICAgIDAKKyAgICBhc3luYzogICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZWQKKyAgICByZXF1ZXN0cyBwZXItc2VjOiAgICAgICAgICAgbWluPTM5NywgbWF4PTUzOCwgYXZlcmFnZT00NjEuNzAwMDEyLCBqaXR0ZXI9MTQxCisgICAgYXAtdGhyb3VnaHB1dCBCL3M6ICAgICAgICAgIG1pbj05MjEwNCBtYXg9MTI0ODE2IGF2ZXJhZ2U9MTA2OTk4Ljg5ODQzOCBqaXR0ZXI9MzI3MTIKKyAgICBhcC1sYXRlbmN5IHVzZWM6ICAgICAgICAgICAgbWluPTE4NTYgbWF4PTI1MTQgYXZlcmFnZT0yMTg1LjY5OTk1MSBqaXR0ZXI9NjU4CisgICAgYXBicmlkZ2UtbGF0ZW5jeSB1c2VjOiAgICAgIG1pbj0xNDYwIG1heD0yMjk2IGF2ZXJhZ2U9MTgyOC41OTk5NzYgaml0dGVyPTgzNgorICAgIGdwYnJpZGdlLWxhdGVuY3kgdXNlYzogICAgICBtaW49NTYgbWF4PTU3IGF2ZXJhZ2U9NTcuMDk5OTk4IGppdHRlcj0xCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90b29scy9sYnRlc3QgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90b29scy9sYnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDczNTNmMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3Rvb2xzL2xidGVzdApAQCAtMCwwICsxLDE2OCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMgQ29weXJpZ2h0IChjKSAyMDE1IEdvb2dsZSwgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgTGluYXJvLCBMdGQuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorIyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisjIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyMgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworIyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCisjIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorIyBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworIyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyMgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyMgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorIyBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoraW1wb3J0IGNzdgoraW1wb3J0IGRhdGV0aW1lCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQorCitkaWN0ID0geydwaW5nJzogJzInLCAndHJhbnNmZXInOiAnMycsICdzaW5rJzogJzQnfQordmVyYm9zZSA9IDEKKworZGVmIGFib3J0KCk6CisJc3lzLmV4aXQoMSkKKworZGVmIHVzYWdlKCk6CisJcHJpbnQoJ1VzYWdlOiBsb29wdGVzdCBURVNUIFNJWkUgSVRFUkFUSU9OUyBQQVRIXG5cbicKKwknICBSdW4gVEVTVCBmb3IgYSBudW1iZXIgb2YgSVRFUkFUSU9OUyB3aXRoIG9wZXJhdGlvbiBkYXRhIFNJWkUgYnl0ZXNcbicKKwknICBURVNUIG1heSBiZSBcJ3BpbmdcJyBcJ3RyYW5zZmVyXCcgb3IgXCdzaW5rXCdcbicKKwknICBTSVpFIGluZGljYXRlcyB0aGUgc2l6ZSBvZiB0cmFuc2ZlciA8PSBncmV5YnVzIG1heCBwYXlsb2FkIGJ5dGVzXG4nCisJJyAgSVRFUkFUSU9OUyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiB0aW1lcyB0byBleGVjdXRlIFRFU1QgYXQgU0laRSBieXRlc1xuJworCScgICAgICAgICAgICAgTm90ZSBpZiBJVEVSQVRJT05TIGlzIHNldCB0byB6ZXJvIHRoZW4gdGhpcyB1dGlsaXR5IHdpbGxcbicKKwknICAgICAgICAgICAgIGluaXRpYXRlIGFuIGluZmluaXRlIChub24gdGVybWluYXRpbmcpIHRlc3QgYW5kIGV4aXRcbicKKwknICAgICAgICAgICAgIHdpdGhvdXQgbG9nZ2luZyBhbnkgbWV0cmljcyBkYXRhXG4nCisJJyAgUEFUSCBpbmRpY2F0ZXMgdGhlIHN5c2ZzIHBhdGggZm9yIHRoZSBsb29wYmFjayBncmV5YnVzIGVudHJpZXMgZS5nLlxuJworCScgICAgICAgICAgICAgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL2VuZG8wOjE6MToxOjEvXG4nCisJJ0V4YW1wbGVzOlxuJworCScgIGxvb3B0ZXN0IHRyYW5zZmVyIDEyOCAxMDAwMFxuJworCScgIGxvb3B0ZXN0IHBpbmcgMCAxMjhcbicKKwknICBsb29wdGVzdCBzaW5rIDIwMzAgMzI3NjhcbicKKwkuZm9ybWF0KHN5cy5hcmd2WzBdKSwgZmlsZT1zeXMuc3RkZXJyKQorCisJYWJvcnQoKQorCitkZWYgcmVhZF9zeXNmc19pbnQocGF0aCk6CisJdHJ5OgorCQlmID0gb3BlbihwYXRoLCAiciIpOworCQl2YWwgPSBmLnJlYWQoKTsKKwkJZi5jbG9zZSgpCisJCXJldHVybiBpbnQodmFsKQorCWV4Y2VwdCBJT0Vycm9yIGFzIGU6CisJCXByaW50KCJJL08gZXJyb3IoezB9KTogezF9Ii5mb3JtYXQoZS5lcnJubywgZS5zdHJlcnJvcikpCisJCXByaW50KCJJbnZhbGlkIHBhdGggJXMiICUgcGF0aCkKKworZGVmIHdyaXRlX3N5c2ZzX3ZhbChwYXRoLCB2YWwpOgorCXRyeToKKwkJZiA9IG9wZW4ocGF0aCwgInIrIikKKwkJZi53cml0ZSh2YWwpCisJCWYuY2xvc2UoKQorCWV4Y2VwdCBJT0Vycm9yIGFzIGU6CisJCXByaW50KCJJL08gZXJyb3IoezB9KTogezF9Ii5mb3JtYXQoZS5lcnJubywgZS5zdHJlcnJvcikpCisJCXByaW50KCJJbnZhbGlkIHBhdGggJXMiICUgcGF0aCkKKworZGVmIGxvZ19jc3YodGVzdF9uYW1lLCBzaXplLCBpdGVyYXRpb25fbWF4LCBzeXNfcGZ4KToKKwkjIGZpbGUgbmFtZSB3aWxsIHRlc3RfbmFtZV9zaXplX2l0ZXJhdGlvbl9tYXguY3N2CisJIyBldmVyeSB0aW1lIHRoZSBzYW1lIHRlc3Qgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIGlzIHJ1biB3ZSB3aWxsIHRoZW4KKwkjIGFwcGVuZCB0byB0aGUgc2FtZSBDU1Ygd2l0aCBkYXRlc3RhbXAgLSByZXByZXNlbnRpbmcgZWFjaCB0ZXN0IGRhdGFzZXQKKwlmbmFtZSA9IHRlc3RfbmFtZSArICdfJyArIHNpemUgKyAnXycgKyBzdHIoaXRlcmF0aW9uX21heCkgKyAnLmNzdicKKworCXRyeToKKwkJIyBnYXRoZXIgZGF0YSBzZXQKKwkJZGF0ZSA9IHN0cihkYXRldGltZS5kYXRldGltZS5ub3coKSkKKwkJZXJyb3IgPSByZWFkX3N5c2ZzX2ludChzeXNfcGZ4ICsgJ2Vycm9yJykKKwkJcmVxdWVzdF9taW4gPSByZWFkX3N5c2ZzX2ludChzeXNfcGZ4ICsgJ3JlcXVlc3RzX3Blcl9zZWNvbmRfbWluJykKKwkJcmVxdWVzdF9tYXggPSByZWFkX3N5c2ZzX2ludChzeXNfcGZ4ICsgJ3JlcXVlc3RzX3Blcl9zZWNvbmRfbWF4JykKKwkJcmVxdWVzdF9hdmcgPSByZWFkX3N5c2ZzX2ludChzeXNfcGZ4ICsgJ3JlcXVlc3RzX3Blcl9zZWNvbmRfYXZnJykKKwkJbGF0ZW5jeV9taW4gPSByZWFkX3N5c2ZzX2ludChzeXNfcGZ4ICsgJ2xhdGVuY3lfbWluJykKKwkJbGF0ZW5jeV9tYXggPSByZWFkX3N5c2ZzX2ludChzeXNfcGZ4ICsgJ2xhdGVuY3lfbWF4JykKKwkJbGF0ZW5jeV9hdmcgPSByZWFkX3N5c2ZzX2ludChzeXNfcGZ4ICsgJ2xhdGVuY3lfYXZnJykKKwkJdGhyb3VnaHB1dF9taW4gPSByZWFkX3N5c2ZzX2ludChzeXNfcGZ4ICsgJ3Rocm91Z2hwdXRfbWluJykKKwkJdGhyb3VnaHB1dF9tYXggPSByZWFkX3N5c2ZzX2ludChzeXNfcGZ4ICsgJ3Rocm91Z2hwdXRfbWF4JykKKwkJdGhyb3VnaHB1dF9hdmcgPSByZWFkX3N5c2ZzX2ludChzeXNfcGZ4ICsgJ3Rocm91Z2hwdXRfYXZnJykKKworCQkjIGRlcml2ZSBqaXR0ZXIKKwkJcmVxdWVzdF9qaXR0ZXIgPSByZXF1ZXN0X21heCAtIHJlcXVlc3RfbWluCisJCWxhdGVuY3lfaml0dGVyID0gbGF0ZW5jeV9tYXggLSBsYXRlbmN5X21pbgorCQl0aHJvdWdocHV0X2ppdHRlciA9IHRocm91Z2hwdXRfbWF4IC0gdGhyb3VnaHB1dF9taW4KKworCQkjIGFwcGVuZCBkYXRhIHNldCB0byBmaWxlCisJCXdpdGggb3BlbihmbmFtZSwgJ2EnKSBhcyBjc3ZmOgorCQkJcm93ID0gY3N2LndyaXRlcihjc3ZmLCBkZWxpbWl0ZXI9IiwiLCBxdW90ZWNoYXI9IiciLAorCQkJCQlxdW90aW5nPWNzdi5RVU9URV9NSU5JTUFMKQorCQkJcm93LndyaXRlcm93KFtkYXRlLCB0ZXN0X25hbWUsIHNpemUsIGl0ZXJhdGlvbl9tYXgsIGVycm9yLAorCQkJCQlyZXF1ZXN0X21pbiwgcmVxdWVzdF9tYXgsIHJlcXVlc3RfYXZnLCByZXF1ZXN0X2ppdHRlciwKKwkJCQkJbGF0ZW5jeV9taW4sIGxhdGVuY3lfbWF4LCBsYXRlbmN5X2F2ZywgbGF0ZW5jeV9qaXR0ZXIsCisJCQkJCXRocm91Z2hwdXRfbWluLCB0aHJvdWdocHV0X21heCwgdGhyb3VnaHB1dF9hdmcsIHRocm91Z2hwdXRfaml0dGVyXSkKKwlleGNlcHQgSU9FcnJvciBhcyBlOgorCQlwcmludCgiSS9PIGVycm9yKHswfSk6IHsxfSIuZm9ybWF0KGUuZXJybm8sIGUuc3RyZXJyb3IpKQorCitkZWYgbG9vcGJhY2tfcnVuKHRlc3RfbmFtZSwgc2l6ZSwgaXRlcmF0aW9uX21heCwgc3lzX3BmeCk6CisJdGVzdF9pZCA9IGRpY3RbdGVzdF9uYW1lXQorCXRyeToKKwkJIyBUZXJtaW5hdGUgYW55IGN1cnJlbnRseSBydW5uaW5nIHRlc3QKKwkJd3JpdGVfc3lzZnNfdmFsKHN5c19wZnggKyAndHlwZScsICcwJykKKwkJIyBTZXQgcGFyYW1ldGVyIGZvciBubyB3YWl0IGJldHdlZW4gbWVzc2FnZXMKKwkJd3JpdGVfc3lzZnNfdmFsKHN5c19wZnggKyAnbXNfd2FpdCcsICcwJykKKwkJIyBTZXQgb3BlcmF0aW9uIHNpemUKKwkJd3JpdGVfc3lzZnNfdmFsKHN5c19wZnggKyAnc2l6ZScsIHNpemUpCisJCSMgU2V0IGl0ZXJhdGlvbnMKKwkJd3JpdGVfc3lzZnNfdmFsKHN5c19wZnggKyAnaXRlcmF0aW9uX21heCcsIHN0cihpdGVyYXRpb25fbWF4KSkKKwkJIyBJbml0aWF0ZSBieSBzZXR0aW5nIGxvb3BiYWNrIG9wZXJhdGlvbiB0eXBlCisJCXdyaXRlX3N5c2ZzX3ZhbChzeXNfcGZ4ICsgJ3R5cGUnLCB0ZXN0X2lkKQorCQl0aW1lLnNsZWVwKDEpCisKKwkJaWYgaXRlcmF0aW9uX21heCA9PSAwOgorCQkJcHJpbnQgKCJJbmZpbml0ZSB0ZXN0IGluaXRpYXRlZCBDU1Ygd29uJ3QgYmUgbG9nZ2VkXG4iKQorCQkJcmV0dXJuCisKKwkJcHJldmlvdXMgPSAwCisJCWVyciA9IDAKKwkJd2hpbGUgVHJ1ZToKKwkJCSMgZ2V0IGN1cnJlbnQgY291bnQgYmFpbCBvdXQgaWYgaXQgaGFzbid0IGNoYW5nZWQKKwkJCWl0ZXJhdGlvbl9jb3VudCA9IHJlYWRfc3lzZnNfaW50KHN5c19wZnggKyAnaXRlcmF0aW9uX2NvdW50JykKKwkJCWlmIHByZXZpb3VzID09IGl0ZXJhdGlvbl9jb3VudDoKKwkJCQllcnIgPSAxCisJCQkJYnJlYWsKKwkJCWVsaWYgaXRlcmF0aW9uX2NvdW50ID09IGl0ZXJhdGlvbl9tYXg6CisJCQkJYnJlYWsKKwkJCXByZXZpb3VzID0gaXRlcmF0aW9uX2NvdW50CisJCQlpZiB2ZXJib3NlOgorCQkJCXByaW50KCclMDJkJSUgY29tcGxldGUgJWQgb2YgJWQgJyAlCisJCQkJCSgxMDAgKiBpdGVyYXRpb25fY291bnQgLyBpdGVyYXRpb25fbWF4LAorCQkJCQlpdGVyYXRpb25fY291bnQsIGl0ZXJhdGlvbl9tYXgpKQorCQkJdGltZS5zbGVlcCgxKQorCQlpZiBlcnI6CisJCQlwcmludCAoJ1xuRXJyb3IgZXhlY3V0aW5nIHRlc3RcbicpCisJCWVsc2U6CisJCQlsb2dfY3N2KHRlc3RfbmFtZSwgc2l6ZSwgaXRlcmF0aW9uX21heCwgc3lzX3BmeCkKKwlleGNlcHQgVmFsdWVFcnJvciBhcyB2ZToKKwkJcHJpbnQoIkVycm9yOiAlcyAiICUgZm9ybWF0KGUuc3RyZXJyb3IpLCBmaWxlPXN5cy5zdGRlcnIpCisJCWFib3J0KCkKKworZGVmIG1haW4oKToKKwlpZiBsZW4oc3lzLmFyZ3YpIDwgNToKKwkJdXNhZ2UoKQorCisJaWYgc3lzLmFyZ3ZbMV0gaW4gZGljdC5rZXlzKCk6CisJCWxvb3BiYWNrX3J1bihzeXMuYXJndlsxXSwgc3lzLmFyZ3ZbMl0sIGludChzeXMuYXJndlszXSksIHN5cy5hcmd2WzRdKQorCWVsc2U6CisJCXVzYWdlKCkKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisJbWFpbigpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90b29scy9sb29wYmFja190ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90b29scy9sb29wYmFja190ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdmNGNkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3Rvb2xzL2xvb3BiYWNrX3Rlc3QuYwpAQCAtMCwwICsxLDEwMDAgQEAKKy8qCisgKiBMb29wYmFjayB0ZXN0IGFwcGxpY2F0aW9uCisgKgorICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1IExpbmFybyBMdGQuCisgKgorICogUHJvdmlkZWQgdW5kZXIgdGhlIHRocmVlIGNsYXVzZSBCU0QgbGljZW5zZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorICovCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2RlZmluZSBNQVhfTlVNX0RFVklDRVMgMTAKKyNkZWZpbmUgTUFYX1NZU0ZTX1BBVEgJMHgyMDAKKyNkZWZpbmUgQ1NWX01BWF9MSU5FCTB4MTAwMAorI2RlZmluZSBTWVNGU19NQVhfSU5UCTB4MjAKKyNkZWZpbmUgTUFYX1NUUl9MRU4JMjU1CisjZGVmaW5lIERFRkFVTFRfQVNZTkNfVElNRU9VVCAyMDAwMDAKKworc3RydWN0IGRpY3QgeworCWNoYXIgKm5hbWU7CisJaW50IHR5cGU7Cit9OworCitzdGF0aWMgc3RydWN0IGRpY3QgZGljdFtdID0geworCXsicGluZyIsIDJ9LAorCXsidHJhbnNmZXIiLCAzfSwKKwl7InNpbmsiLCA0fSwKKwl7TlVMTCx9CQkvKiBsaXN0IHRlcm1pbmF0aW9uICovCit9OworCitzdHJ1Y3QgbG9vcGJhY2tfcmVzdWx0cyB7CisJZmxvYXQgbGF0ZW5jeV9hdmc7CisJdWludDMyX3QgbGF0ZW5jeV9tYXg7CisJdWludDMyX3QgbGF0ZW5jeV9taW47CisJdWludDMyX3QgbGF0ZW5jeV9qaXR0ZXI7CisKKwlmbG9hdCByZXF1ZXN0X2F2ZzsKKwl1aW50MzJfdCByZXF1ZXN0X21heDsKKwl1aW50MzJfdCByZXF1ZXN0X21pbjsKKwl1aW50MzJfdCByZXF1ZXN0X2ppdHRlcjsKKworCWZsb2F0IHRocm91Z2hwdXRfYXZnOworCXVpbnQzMl90IHRocm91Z2hwdXRfbWF4OworCXVpbnQzMl90IHRocm91Z2hwdXRfbWluOworCXVpbnQzMl90IHRocm91Z2hwdXRfaml0dGVyOworCisJZmxvYXQgYXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfYXZnOworCXVpbnQzMl90IGFwYnJpZGdlX3VuaXByb19sYXRlbmN5X21heDsKKwl1aW50MzJfdCBhcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9taW47CisJdWludDMyX3QgYXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfaml0dGVyOworCisJZmxvYXQgZ2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9hdmc7CisJdWludDMyX3QgZ2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9tYXg7CisJdWludDMyX3QgZ2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9taW47CisJdWludDMyX3QgZ2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9qaXR0ZXI7CisKKwl1aW50MzJfdCBlcnJvcjsKK307CisKK3N0cnVjdCBsb29wYmFja19kZXZpY2UgeworCWNoYXIgbmFtZVtNQVhfU1lTRlNfUEFUSF07CisJY2hhciBzeXNmc19lbnRyeVtNQVhfU1lTRlNfUEFUSF07CisJY2hhciBkZWJ1Z2ZzX2VudHJ5W01BWF9TWVNGU19QQVRIXTsKKwlzdHJ1Y3QgbG9vcGJhY2tfcmVzdWx0cyByZXN1bHRzOworfTsKKworc3RydWN0IGxvb3BiYWNrX3Rlc3QgeworCWludCB2ZXJib3NlOworCWludCBkZWJ1ZzsKKwlpbnQgcmF3X2RhdGFfZHVtcDsKKwlpbnQgcG9yY2VsYWluOworCWludCBtYXNrOworCWludCBzaXplOworCWludCBpdGVyYXRpb25fbWF4OworCWludCBhZ2dyZWdhdGVfb3V0cHV0OworCWludCB0ZXN0X2lkOworCWludCBkZXZpY2VfY291bnQ7CisJaW50IGxpc3RfZGV2aWNlczsKKwlpbnQgdXNlX2FzeW5jOworCWludCBhc3luY190aW1lb3V0OworCWludCBhc3luY19vdXRzdGFuZGluZ19vcGVyYXRpb25zOworCWludCB1c193YWl0OworCWludCBmaWxlX291dHB1dDsKKwlpbnQgc3RvcF9hbGw7CisJaW50IHBvbGxfY291bnQ7CisJY2hhciB0ZXN0X25hbWVbTUFYX1NUUl9MRU5dOworCWNoYXIgc3lzZnNfcHJlZml4W01BWF9TWVNGU19QQVRIXTsKKwljaGFyIGRlYnVnZnNfcHJlZml4W01BWF9TWVNGU19QQVRIXTsKKwlzdHJ1Y3QgdGltZXNwZWMgcG9sbF90aW1lb3V0OworCXN0cnVjdCBsb29wYmFja19kZXZpY2UgZGV2aWNlc1tNQVhfTlVNX0RFVklDRVNdOworCXN0cnVjdCBsb29wYmFja19yZXN1bHRzIGFnZ3JlZ2F0ZV9yZXN1bHRzOworCXN0cnVjdCBwb2xsZmQgZmRzW01BWF9OVU1fREVWSUNFU107Cit9OworCitzdHJ1Y3QgbG9vcGJhY2tfdGVzdCB0OworCisvKiBIZWxwZXIgbWFjcm9zIHRvIGNhbGN1bGF0ZSB0aGUgYWdncmVnYXRlIHJlc3VsdHMgZm9yIGFsbCBkZXZpY2VzICovCitzdGF0aWMgaW5saW5lIGludCBkZXZpY2VfZW5hYmxlZChzdHJ1Y3QgbG9vcGJhY2tfdGVzdCAqdCwgaW50IGRldl9pZHgpOworCisjZGVmaW5lIEdFVF9NQVgoZmllbGQpCQkJCQkJCVwKK3N0YXRpYyBpbnQgZ2V0XyMjZmllbGQjI19hZ2dyZWdhdGUoc3RydWN0IGxvb3BiYWNrX3Rlc3QgKnQpCQlcCit7CQkJCQkJCQkJXAorCXVpbnQzMl90IG1heCA9IDA7CQkJCQkJXAorCWludCBpOwkJCQkJCQkJXAorCWZvciAoaSA9IDA7IGkgPCB0LT5kZXZpY2VfY291bnQ7IGkrKykgewkJCQlcCisJCWlmICghZGV2aWNlX2VuYWJsZWQodCwgaSkpCQkJCVwKKwkJCWNvbnRpbnVlOwkJCQkJXAorCQlpZiAodC0+ZGV2aWNlc1tpXS5yZXN1bHRzLmZpZWxkID4gbWF4KQkJCVwKKwkJCW1heCA9IHQtPmRldmljZXNbaV0ucmVzdWx0cy5maWVsZDsJCVwKKwl9CQkJCQkJCQlcCisJcmV0dXJuIG1heDsJCQkJCQkJXAorfQkJCQkJCQkJCVwKKworI2RlZmluZSBHRVRfTUlOKGZpZWxkKQkJCQkJCQlcCitzdGF0aWMgaW50IGdldF8jI2ZpZWxkIyNfYWdncmVnYXRlKHN0cnVjdCBsb29wYmFja190ZXN0ICp0KQkJXAorewkJCQkJCQkJCVwKKwl1aW50MzJfdCBtaW4gPSB+MDsJCQkJCQlcCisJaW50IGk7CQkJCQkJCQlcCisJZm9yIChpID0gMDsgaSA8IHQtPmRldmljZV9jb3VudDsgaSsrKSB7CQkJCVwKKwkJaWYgKCFkZXZpY2VfZW5hYmxlZCh0LCBpKSkJCQkJXAorCQkJY29udGludWU7CQkJCQlcCisJCWlmICh0LT5kZXZpY2VzW2ldLnJlc3VsdHMuZmllbGQgPCBtaW4pCQkJXAorCQkJbWluID0gdC0+ZGV2aWNlc1tpXS5yZXN1bHRzLmZpZWxkOwkJXAorCX0JCQkJCQkJCVwKKwlyZXR1cm4gbWluOwkJCQkJCQlcCit9CQkJCQkJCQkJXAorCisjZGVmaW5lIEdFVF9BVkcoZmllbGQpCQkJCQkJCVwKK3N0YXRpYyBpbnQgZ2V0XyMjZmllbGQjI19hZ2dyZWdhdGUoc3RydWN0IGxvb3BiYWNrX3Rlc3QgKnQpCQlcCit7CQkJCQkJCQkJXAorCXVpbnQzMl90IHZhbCA9IDA7CQkJCQkJXAorCXVpbnQzMl90IGNvdW50ID0gMDsJCQkJCQlcCisJaW50IGk7CQkJCQkJCQlcCisJZm9yIChpID0gMDsgaSA8IHQtPmRldmljZV9jb3VudDsgaSsrKSB7CQkJCVwKKwkJaWYgKCFkZXZpY2VfZW5hYmxlZCh0LCBpKSkJCQkJXAorCQkJY29udGludWU7CQkJCQlcCisJCWNvdW50Kys7CQkJCQkJXAorCQl2YWwgKz0gdC0+ZGV2aWNlc1tpXS5yZXN1bHRzLmZpZWxkOwkJCVwKKwl9CQkJCQkJCQlcCisJaWYgKGNvdW50KQkJCQkJCQlcCisJCXZhbCAvPSBjb3VudDsJCQkJCQlcCisJcmV0dXJuIHZhbDsJCQkJCQkJXAorfQkJCQkJCQkJCVwKKworR0VUX01BWCh0aHJvdWdocHV0X21heCk7CitHRVRfTUFYKHJlcXVlc3RfbWF4KTsKK0dFVF9NQVgobGF0ZW5jeV9tYXgpOworR0VUX01BWChhcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9tYXgpOworR0VUX01BWChnYnBoeV9maXJtd2FyZV9sYXRlbmN5X21heCk7CitHRVRfTUlOKHRocm91Z2hwdXRfbWluKTsKK0dFVF9NSU4ocmVxdWVzdF9taW4pOworR0VUX01JTihsYXRlbmN5X21pbik7CitHRVRfTUlOKGFwYnJpZGdlX3VuaXByb19sYXRlbmN5X21pbik7CitHRVRfTUlOKGdicGh5X2Zpcm13YXJlX2xhdGVuY3lfbWluKTsKK0dFVF9BVkcodGhyb3VnaHB1dF9hdmcpOworR0VUX0FWRyhyZXF1ZXN0X2F2Zyk7CitHRVRfQVZHKGxhdGVuY3lfYXZnKTsKK0dFVF9BVkcoYXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfYXZnKTsKK0dFVF9BVkcoZ2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9hdmcpOworCit2b2lkIGFib3J0KCkKK3sKKwlfZXhpdCgxKTsKK30KKwordm9pZCB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGxvb3BiYWNrX3Rlc3QgVEVTVCBbU0laRV0gSVRFUkFUSU9OUyBbU1lTUEFUSF0gW0RCR1BBVEhdXG5cbiIKKwkiICBSdW4gVEVTVCBmb3IgYSBudW1iZXIgb2YgSVRFUkFUSU9OUyB3aXRoIG9wZXJhdGlvbiBkYXRhIFNJWkUgYnl0ZXNcbiIKKwkiICBURVNUIG1heSBiZSBcJ3BpbmdcJyBcJ3RyYW5zZmVyXCcgb3IgXCdzaW5rXCdcbiIKKwkiICBTSVpFIGluZGljYXRlcyB0aGUgc2l6ZSBvZiB0cmFuc2ZlciA8PSBncmV5YnVzIG1heCBwYXlsb2FkIGJ5dGVzXG4iCisJIiAgSVRFUkFUSU9OUyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiB0aW1lcyB0byBleGVjdXRlIFRFU1QgYXQgU0laRSBieXRlc1xuIgorCSIgICAgICAgICAgICAgTm90ZSBpZiBJVEVSQVRJT05TIGlzIHNldCB0byB6ZXJvIHRoZW4gdGhpcyB1dGlsaXR5IHdpbGxcbiIKKwkiICAgICAgICAgICAgIGluaXRpYXRlIGFuIGluZmluaXRlIChub24gdGVybWluYXRpbmcpIHRlc3QgYW5kIGV4aXRcbiIKKwkiICAgICAgICAgICAgIHdpdGhvdXQgbG9nZ2luZyBhbnkgbWV0cmljcyBkYXRhXG4iCisJIiAgU1lTUEFUSCBpbmRpY2F0ZXMgdGhlIHN5c2ZzIHBhdGggZm9yIHRoZSBsb29wYmFjayBncmV5YnVzIGVudHJpZXMgZS5nLlxuIgorCSIgICAgICAgICAgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzXG4iCisJIiAgREJHUEFUSCBpbmRpY2F0ZXMgdGhlIGRlYnVnZnMgcGF0aCBmb3IgdGhlIGxvb3BiYWNrIGdyZXlidXMgZW50cmllcyBlLmcuXG4iCisJIiAgICAgICAgICAvc3lzL2tlcm5lbC9kZWJ1Zy9nYl9sb29wYmFjay9cbiIKKwkiIE1hbmRhdG9yeSBhcmd1bWVudHNcbiIKKwkiICAgLXQgICAgIG11c3QgYmUgb25lIG9mIHRoZSB0ZXN0IG5hbWVzIC0gc2luaywgdHJhbnNmZXIgb3IgcGluZ1xuIgorCSIgICAtaSAgICAgaXRlcmF0aW9uIGNvdW50IC0gdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHJ1biB0aGUgdGVzdCBvdmVyXG4iCisJIiBPcHRpb25hbCBhcmd1bWVudHNcbiIKKwkiICAgLVMgICAgIHN5c2ZzIGxvY2F0aW9uIC0gbG9jYXRpb24gZm9yIGdyZXlidXMgJ2VuZG8nIGVudGlyZXMgZGVmYXVsdCAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvXG4iCisJIiAgIC1EICAgICBkZWJ1Z2ZzIGxvY2F0aW9uIC0gbG9jYXRpb24gZm9yIGxvb3BiYWNrIGRlYnVnZnMgZW50cmllcyBkZWZhdWx0IC9zeXMva2VybmVsL2RlYnVnL2diX2xvb3BiYWNrL1xuIgorCSIgICAtcyAgICAgc2l6ZSBvZiBkYXRhIHBhY2tldCB0byBzZW5kIGR1cmluZyB0ZXN0IC0gZGVmYXVsdHMgdG8gemVyb1xuIgorCSIgICAtbSAgICAgbWFzayAtIGEgYml0IG1hc2sgb2YgY29ubmVjdGlvbnMgdG8gaW5jbHVkZSBleGFtcGxlOiAtbSA4ID0gNHRoIGNvbm5lY3Rpb24gLW0gOSA9IDFzdCBhbmQgNHRoIGNvbm5lY3Rpb24gZXRjXG4iCisJIiAgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyB6ZXJvIHdoaWNoIG1lYW5zIGJyb2FkY2FzdCB0byBhbGwgY29ubmVjdGlvbnNcbiIKKwkiICAgLXYgICAgIHZlcmJvc2Ugb3V0cHV0XG4iCisJIiAgIC1kICAgICBkZWJ1ZyBvdXRwdXRcbiIKKwkiICAgLXIgICAgIHJhdyBkYXRhIG91dHB1dCAtIHdoZW4gc3BlY2lmaWVkIHRoZSBmdWxsIGxpc3Qgb2YgbGF0ZW5jeSB2YWx1ZXMgYXJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgQ1NWXG4iCisJIiAgIC1wICAgICBwb3JjZWxhaW4gLSB3aGVuIHNwZWNpZmllZCBwcmludG91dCBpcyBpbiBhIHVzZXItZnJpZW5kbHkgbm9uLUNTViBmb3JtYXQuIFRoaXMgb3B0aW9uIHN1cHByZXNzZXMgd3JpdGluZyB0byBDU1YgZmlsZVxuIgorCSIgICAtYSAgICAgYWdncmVnYXRlIC0gc2hvdyBhZ2dyZWdhdGlvbiBvZiBhbGwgZW5hYmxlZCBkZXZpY2VzXG4iCisJIiAgIC1sICAgICBsaXN0IGZvdW5kIGxvb3BiYWNrIGRldmljZXMgYW5kIGV4aXRcbiIKKwkiICAgLXggICAgIEFzeW5jIC0gRW5hYmxlIGFzeW5jIHRyYW5zZmVyc1xuIgorCSIgICAtbyAgICAgQXN5bmMgVGltZW91dCAtIFRpbWVvdXQgaW4gdVNlYyBmb3IgYXN5bmMgb3BlcmF0aW9uc1xuIgorCSIgICAtTyAgICAgUG9sbCBsb29wIHRpbWUgb3V0IGluIHNlY29uZHMobWF4IHRpbWUgYSB0ZXN0IGlzIGV4cGVjdGVkIHRvIGxhc3QsIGRlZmF1bHQ6IDMwc2VjKVxuIgorCSIgICAtYyAgICAgTWF4IG51bWJlciBvZiBvdXRzdGFuZGluZyBvcGVyYXRpb25zIGZvciBhc3luYyBvcGVyYXRpb25zXG4iCisJIiAgIC13ICAgICBXYWl0IGluIHVTZWMgYmV0d2VlbiBvcGVyYXRpb25zXG4iCisJIiAgIC16ICAgICBFbmFibGUgb3V0cHV0IHRvIGEgQ1NWIGZpbGUgKGluY29tcGF0aWJsZSB3aXRoIC1wKVxuIgorCSIgICAtZiAgICAgV2hlbiBzdGFydGluZyBuZXcgbG9vcGJhY2sgdGVzdCwgc3RvcCBjdXJyZW50bHkgcnVubmluZyB0ZXN0cyBvbiBhbGwgZGV2aWNlc1xuIgorCSJFeGFtcGxlczpcbiIKKwkiICBTZW5kIDEwMDAwIHRyYW5zZmVycyB3aXRoIGEgcGFja2V0IHNpemUgb2YgMTI4IGJ5dGVzIHRvIGFsbCBhY3RpdmUgY29ubmVjdGlvbnNcbiIKKwkiICBsb29wYmFja190ZXN0IC10IHRyYW5zZmVyIC1zIDEyOCAtaSAxMDAwMCAtUyAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvIC1EIC9zeXMva2VybmVsL2RlYnVnL2diX2xvb3BiYWNrL1xuIgorCSIgIGxvb3BiYWNrX3Rlc3QgLXQgdHJhbnNmZXIgLXMgMTI4IC1pIDEwMDAwIC1tIDBcbiIKKwkiICBTZW5kIDEwMDAwIHRyYW5zZmVycyB3aXRoIGEgcGFja2V0IHNpemUgb2YgMTI4IGJ5dGVzIHRvIGNvbm5lY3Rpb24gMSBhbmQgNFxuIgorCSIgIGxvb3BiYWNrX3Rlc3QgLXQgdHJhbnNmZXIgLXMgMTI4IC1pIDEwMDAwIC1tIDlcbiIKKwkiICBsb29wYmFja190ZXN0IC10IHBpbmcgLXMgMCAxMjggLWkgLVMgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLyAtRCAvc3lzL2tlcm5lbC9kZWJ1Zy9nYl9sb29wYmFjay9cbiIKKwkiICBsb29wYmFja190ZXN0IC10IHNpbmsgLXMgMjAzMCAtaSAzMjc2OCAtUyAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvIC1EIC9zeXMva2VybmVsL2RlYnVnL2diX2xvb3BiYWNrL1xuIik7CisJYWJvcnQoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGV2aWNlX2VuYWJsZWQoc3RydWN0IGxvb3BiYWNrX3Rlc3QgKnQsIGludCBkZXZfaWR4KQoreworCWlmICghdC0+bWFzayB8fCAodC0+bWFzayAmICgxIDw8IGRldl9pZHgpKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hvd19sb29wYmFja19kZXZpY2VzKHN0cnVjdCBsb29wYmFja190ZXN0ICp0KQoreworCWludCBpOworCisJaWYgKHQtPmRldmljZV9jb3VudCA9PSAwKSB7CisJCXByaW50ZigiTm8gbG9vcGJhY2sgZGV2aWNlcy5cbiIpOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IHQtPmRldmljZV9jb3VudDsgaSsrKQorCQlwcmludGYoImRldmljZVslZF0gPSAlc1xuIiwgaSwgdC0+ZGV2aWNlc1tpXS5uYW1lKTsKKworfQorCitpbnQgb3Blbl9zeXNmcyhjb25zdCBjaGFyICpzeXNfcGZ4LCBjb25zdCBjaGFyICpub2RlLCBpbnQgZmxhZ3MpCit7CisJaW50IGZkOworCWNoYXIgcGF0aFtNQVhfU1lTRlNfUEFUSF07CisKKwlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIlcyVzIiwgc3lzX3BmeCwgbm9kZSk7CisJZmQgPSBvcGVuKHBhdGgsIGZsYWdzKTsKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIG9wZW4gJXNcbiIsIHBhdGgpOworCQlhYm9ydCgpOworCX0KKwlyZXR1cm4gZmQ7Cit9CisKK2ludCByZWFkX3N5c2ZzX2ludF9mZChpbnQgZmQsIGNvbnN0IGNoYXIgKnN5c19wZngsIGNvbnN0IGNoYXIgKm5vZGUpCit7CisJY2hhciBidWZbU1lTRlNfTUFYX0lOVF07CisKKwlpZiAocmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIHJlYWQgZnJvbSAlcyVzICVzXG4iLCBzeXNfcGZ4LCBub2RlLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoZmQpOworCQlhYm9ydCgpOworCX0KKwlyZXR1cm4gYXRvaShidWYpOworfQorCitmbG9hdCByZWFkX3N5c2ZzX2Zsb2F0X2ZkKGludCBmZCwgY29uc3QgY2hhciAqc3lzX3BmeCwgY29uc3QgY2hhciAqbm9kZSkKK3sKKwljaGFyIGJ1ZltTWVNGU19NQVhfSU5UXTsKKworCWlmIChyZWFkKGZkLCBidWYsIHNpemVvZihidWYpKSA8IDApIHsKKworCQlmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byByZWFkIGZyb20gJXMlcyAlc1xuIiwgc3lzX3BmeCwgbm9kZSwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGZkKTsKKwkJYWJvcnQoKTsKKwl9CisJcmV0dXJuIGF0b2YoYnVmKTsKK30KKworaW50IHJlYWRfc3lzZnNfaW50KGNvbnN0IGNoYXIgKnN5c19wZngsIGNvbnN0IGNoYXIgKm5vZGUpCit7CisJaW50IGZkLCB2YWw7CisKKwlmZCA9IG9wZW5fc3lzZnMoc3lzX3BmeCwgbm9kZSwgT19SRE9OTFkpOworCXZhbCA9IHJlYWRfc3lzZnNfaW50X2ZkKGZkLCBzeXNfcGZ4LCBub2RlKTsKKwljbG9zZShmZCk7CisJcmV0dXJuIHZhbDsKK30KKworZmxvYXQgcmVhZF9zeXNmc19mbG9hdChjb25zdCBjaGFyICpzeXNfcGZ4LCBjb25zdCBjaGFyICpub2RlKQoreworCWludCBmZDsKKwlmbG9hdCB2YWw7CisKKwlmZCA9IG9wZW5fc3lzZnMoc3lzX3BmeCwgbm9kZSwgT19SRE9OTFkpOworCXZhbCA9IHJlYWRfc3lzZnNfZmxvYXRfZmQoZmQsIHN5c19wZngsIG5vZGUpOworCWNsb3NlKGZkKTsKKwlyZXR1cm4gdmFsOworfQorCit2b2lkIHdyaXRlX3N5c2ZzX3ZhbChjb25zdCBjaGFyICpzeXNfcGZ4LCBjb25zdCBjaGFyICpub2RlLCBpbnQgdmFsKQoreworCWludCBmZCwgbGVuOworCWNoYXIgYnVmW1NZU0ZTX01BWF9JTlRdOworCisJZmQgPSBvcGVuX3N5c2ZzKHN5c19wZngsIG5vZGUsIE9fUkRXUik7CisJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkIiwgdmFsKTsKKwlpZiAod3JpdGUoZmQsIGJ1ZiwgbGVuKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gd3JpdGUgdG8gJXMlcyAlc1xuIiwgc3lzX3BmeCwgbm9kZSwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGZkKTsKKwkJYWJvcnQoKTsKKwl9CisJY2xvc2UoZmQpOworfQorCitzdGF0aWMgaW50IGdldF9yZXN1bHRzKHN0cnVjdCBsb29wYmFja190ZXN0ICp0KQoreworCXN0cnVjdCBsb29wYmFja19kZXZpY2UgKmQ7CisJc3RydWN0IGxvb3BiYWNrX3Jlc3VsdHMgKnI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdC0+ZGV2aWNlX2NvdW50OyBpKyspIHsKKwkJaWYgKCFkZXZpY2VfZW5hYmxlZCh0LCBpKSkKKwkJCWNvbnRpbnVlOworCisJCWQgPSAmdC0+ZGV2aWNlc1tpXTsKKwkJciA9ICZkLT5yZXN1bHRzOworCisJCXItPmVycm9yID0gcmVhZF9zeXNmc19pbnQoZC0+c3lzZnNfZW50cnksICJlcnJvciIpOworCQlyLT5yZXF1ZXN0X21pbiA9IHJlYWRfc3lzZnNfaW50KGQtPnN5c2ZzX2VudHJ5LCAicmVxdWVzdHNfcGVyX3NlY29uZF9taW4iKTsKKwkJci0+cmVxdWVzdF9tYXggPSByZWFkX3N5c2ZzX2ludChkLT5zeXNmc19lbnRyeSwgInJlcXVlc3RzX3Blcl9zZWNvbmRfbWF4Iik7CisJCXItPnJlcXVlc3RfYXZnID0gcmVhZF9zeXNmc19mbG9hdChkLT5zeXNmc19lbnRyeSwgInJlcXVlc3RzX3Blcl9zZWNvbmRfYXZnIik7CisKKwkJci0+bGF0ZW5jeV9taW4gPSByZWFkX3N5c2ZzX2ludChkLT5zeXNmc19lbnRyeSwgImxhdGVuY3lfbWluIik7CisJCXItPmxhdGVuY3lfbWF4ID0gcmVhZF9zeXNmc19pbnQoZC0+c3lzZnNfZW50cnksICJsYXRlbmN5X21heCIpOworCQlyLT5sYXRlbmN5X2F2ZyA9IHJlYWRfc3lzZnNfZmxvYXQoZC0+c3lzZnNfZW50cnksICJsYXRlbmN5X2F2ZyIpOworCisJCXItPnRocm91Z2hwdXRfbWluID0gcmVhZF9zeXNmc19pbnQoZC0+c3lzZnNfZW50cnksICJ0aHJvdWdocHV0X21pbiIpOworCQlyLT50aHJvdWdocHV0X21heCA9IHJlYWRfc3lzZnNfaW50KGQtPnN5c2ZzX2VudHJ5LCAidGhyb3VnaHB1dF9tYXgiKTsKKwkJci0+dGhyb3VnaHB1dF9hdmcgPSByZWFkX3N5c2ZzX2Zsb2F0KGQtPnN5c2ZzX2VudHJ5LCAidGhyb3VnaHB1dF9hdmciKTsKKworCQlyLT5hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9taW4gPQorCQkJcmVhZF9zeXNmc19pbnQoZC0+c3lzZnNfZW50cnksICJhcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9taW4iKTsKKwkJci0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWF4ID0KKwkJCXJlYWRfc3lzZnNfaW50KGQtPnN5c2ZzX2VudHJ5LCAiYXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWF4Iik7CisJCXItPmFwYnJpZGdlX3VuaXByb19sYXRlbmN5X2F2ZyA9CisJCQlyZWFkX3N5c2ZzX2Zsb2F0KGQtPnN5c2ZzX2VudHJ5LCAiYXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfYXZnIik7CisKKwkJci0+Z2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9taW4gPQorCQkJcmVhZF9zeXNmc19pbnQoZC0+c3lzZnNfZW50cnksICJnYnBoeV9maXJtd2FyZV9sYXRlbmN5X21pbiIpOworCQlyLT5nYnBoeV9maXJtd2FyZV9sYXRlbmN5X21heCA9CisJCQlyZWFkX3N5c2ZzX2ludChkLT5zeXNmc19lbnRyeSwgImdicGh5X2Zpcm13YXJlX2xhdGVuY3lfbWF4Iik7CisJCXItPmdicGh5X2Zpcm13YXJlX2xhdGVuY3lfYXZnID0KKwkJCXJlYWRfc3lzZnNfZmxvYXQoZC0+c3lzZnNfZW50cnksICJnYnBoeV9maXJtd2FyZV9sYXRlbmN5X2F2ZyIpOworCisJCXItPnJlcXVlc3Rfaml0dGVyID0gci0+cmVxdWVzdF9tYXggLSByLT5yZXF1ZXN0X21pbjsKKwkJci0+bGF0ZW5jeV9qaXR0ZXIgPSByLT5sYXRlbmN5X21heCAtIHItPmxhdGVuY3lfbWluOworCQlyLT50aHJvdWdocHV0X2ppdHRlciA9IHItPnRocm91Z2hwdXRfbWF4IC0gci0+dGhyb3VnaHB1dF9taW47CisJCXItPmFwYnJpZGdlX3VuaXByb19sYXRlbmN5X2ppdHRlciA9CisJCQlyLT5hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9tYXggLSByLT5hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9taW47CisJCXItPmdicGh5X2Zpcm13YXJlX2xhdGVuY3lfaml0dGVyID0KKwkJCXItPmdicGh5X2Zpcm13YXJlX2xhdGVuY3lfbWF4IC0gci0+Z2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9taW47CisKKwl9CisKKwkvKmNhbGN1bGF0ZSB0aGUgYWdncmVnYXRlIHJlc3VsdHMgb2YgYWxsIGVuYWJsZWQgZGV2aWNlcyAqLworCWlmICh0LT5hZ2dyZWdhdGVfb3V0cHV0KSB7CisJCXIgPSAmdC0+YWdncmVnYXRlX3Jlc3VsdHM7CisKKwkJci0+cmVxdWVzdF9taW4gPSBnZXRfcmVxdWVzdF9taW5fYWdncmVnYXRlKHQpOworCQlyLT5yZXF1ZXN0X21heCA9IGdldF9yZXF1ZXN0X21heF9hZ2dyZWdhdGUodCk7CisJCXItPnJlcXVlc3RfYXZnID0gZ2V0X3JlcXVlc3RfYXZnX2FnZ3JlZ2F0ZSh0KTsKKworCQlyLT5sYXRlbmN5X21pbiA9IGdldF9sYXRlbmN5X21pbl9hZ2dyZWdhdGUodCk7CisJCXItPmxhdGVuY3lfbWF4ID0gZ2V0X2xhdGVuY3lfbWF4X2FnZ3JlZ2F0ZSh0KTsKKwkJci0+bGF0ZW5jeV9hdmcgPSBnZXRfbGF0ZW5jeV9hdmdfYWdncmVnYXRlKHQpOworCisJCXItPnRocm91Z2hwdXRfbWluID0gZ2V0X3Rocm91Z2hwdXRfbWluX2FnZ3JlZ2F0ZSh0KTsKKwkJci0+dGhyb3VnaHB1dF9tYXggPSBnZXRfdGhyb3VnaHB1dF9tYXhfYWdncmVnYXRlKHQpOworCQlyLT50aHJvdWdocHV0X2F2ZyA9IGdldF90aHJvdWdocHV0X2F2Z19hZ2dyZWdhdGUodCk7CisKKwkJci0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWluID0KKwkJCWdldF9hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9taW5fYWdncmVnYXRlKHQpOworCQlyLT5hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9tYXggPQorCQkJZ2V0X2FwYnJpZGdlX3VuaXByb19sYXRlbmN5X21heF9hZ2dyZWdhdGUodCk7CisJCXItPmFwYnJpZGdlX3VuaXByb19sYXRlbmN5X2F2ZyA9CisJCQlnZXRfYXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfYXZnX2FnZ3JlZ2F0ZSh0KTsKKworCQlyLT5nYnBoeV9maXJtd2FyZV9sYXRlbmN5X21pbiA9CisJCQlnZXRfZ2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9taW5fYWdncmVnYXRlKHQpOworCQlyLT5nYnBoeV9maXJtd2FyZV9sYXRlbmN5X21heCA9CisJCQlnZXRfZ2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9tYXhfYWdncmVnYXRlKHQpOworCQlyLT5nYnBoeV9maXJtd2FyZV9sYXRlbmN5X2F2ZyA9CisJCQlnZXRfZ2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9hdmdfYWdncmVnYXRlKHQpOworCisJCXItPnJlcXVlc3Rfaml0dGVyID0gci0+cmVxdWVzdF9tYXggLSByLT5yZXF1ZXN0X21pbjsKKwkJci0+bGF0ZW5jeV9qaXR0ZXIgPSByLT5sYXRlbmN5X21heCAtIHItPmxhdGVuY3lfbWluOworCQlyLT50aHJvdWdocHV0X2ppdHRlciA9IHItPnRocm91Z2hwdXRfbWF4IC0gci0+dGhyb3VnaHB1dF9taW47CisJCXItPmFwYnJpZGdlX3VuaXByb19sYXRlbmN5X2ppdHRlciA9CisJCQlyLT5hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9tYXggLSByLT5hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9taW47CisJCXItPmdicGh5X2Zpcm13YXJlX2xhdGVuY3lfaml0dGVyID0KKwkJCXItPmdicGh5X2Zpcm13YXJlX2xhdGVuY3lfbWF4IC0gci0+Z2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9taW47CisKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBsb2dfY3N2X2Vycm9yKGludCBsZW4sIGludCBlcnIpCit7CisJZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gd3JpdGUgJWQgYnl0ZXMgdG8gY3N2ICVzXG4iLCBsZW4sCisJCXN0cmVycm9yKGVycikpOworfQorCitpbnQgZm9ybWF0X291dHB1dChzdHJ1Y3QgbG9vcGJhY2tfdGVzdCAqdCwKKwkJCXN0cnVjdCBsb29wYmFja19yZXN1bHRzICpyLAorCQkJY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQljaGFyICpidWYsIGludCBidWZfbGVuLAorCQkJc3RydWN0IHRtICp0bSkKK3sKKwlpbnQgbGVuID0gMDsKKworCW1lbXNldChidWYsIDB4MDAsIGJ1Zl9sZW4pOworCWxlbiA9IHNucHJpbnRmKGJ1ZiwgYnVmX2xlbiwgIiV1LSV1LSV1ICV1OiV1OiV1IiwKKwkJICAgICAgIHRtLT50bV95ZWFyICsgMTkwMCwgdG0tPnRtX21vbiArIDEsIHRtLT50bV9tZGF5LAorCQkgICAgICAgdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCisJaWYgKHQtPnBvcmNlbGFpbikgeworCQlsZW4gKz0gc25wcmludGYoJmJ1ZltsZW5dLCBidWZfbGVuIC0gbGVuLAorCQkJIlxuIHRlc3Q6XHRcdFx0JXNcbiBwYXRoOlx0XHRcdCVzXG4gc2l6ZTpcdFx0XHQldVxuIGl0ZXJhdGlvbnM6XHRcdCV1XG4gZXJyb3JzOlx0XHQldVxuIGFzeW5jOlx0XHRcdCVzXG4iLAorCQkJdC0+dGVzdF9uYW1lLAorCQkJZGV2X25hbWUsCisJCQl0LT5zaXplLAorCQkJdC0+aXRlcmF0aW9uX21heCwKKwkJCXItPmVycm9yLAorCQkJdC0+dXNlX2FzeW5jID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CisKKwkJbGVuICs9IHNucHJpbnRmKCZidWZbbGVuXSwgYnVmX2xlbiAtIGxlbiwKKwkJCSIgcmVxdWVzdHMgcGVyLXNlYzpcdG1pbj0ldSwgbWF4PSV1LCBhdmVyYWdlPSVmLCBqaXR0ZXI9JXVcbiIsCisJCQlyLT5yZXF1ZXN0X21pbiwKKwkJCXItPnJlcXVlc3RfbWF4LAorCQkJci0+cmVxdWVzdF9hdmcsCisJCQlyLT5yZXF1ZXN0X2ppdHRlcik7CisKKwkJbGVuICs9IHNucHJpbnRmKCZidWZbbGVuXSwgYnVmX2xlbiAtIGxlbiwKKwkJCSIgYXAtdGhyb3VnaHB1dCBCL3M6XHRtaW49JXUgbWF4PSV1IGF2ZXJhZ2U9JWYgaml0dGVyPSV1XG4iLAorCQkJci0+dGhyb3VnaHB1dF9taW4sCisJCQlyLT50aHJvdWdocHV0X21heCwKKwkJCXItPnRocm91Z2hwdXRfYXZnLAorCQkJci0+dGhyb3VnaHB1dF9qaXR0ZXIpOworCQlsZW4gKz0gc25wcmludGYoJmJ1ZltsZW5dLCBidWZfbGVuIC0gbGVuLAorCQkJIiBhcC1sYXRlbmN5IHVzZWM6XHRtaW49JXUgbWF4PSV1IGF2ZXJhZ2U9JWYgaml0dGVyPSV1XG4iLAorCQkJci0+bGF0ZW5jeV9taW4sCisJCQlyLT5sYXRlbmN5X21heCwKKwkJCXItPmxhdGVuY3lfYXZnLAorCQkJci0+bGF0ZW5jeV9qaXR0ZXIpOworCQlsZW4gKz0gc25wcmludGYoJmJ1ZltsZW5dLCBidWZfbGVuIC0gbGVuLAorCQkJIiBhcGJyaWRnZS1sYXRlbmN5IHVzZWM6XHRtaW49JXUgbWF4PSV1IGF2ZXJhZ2U9JWYgaml0dGVyPSV1XG4iLAorCQkJci0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWluLAorCQkJci0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWF4LAorCQkJci0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfYXZnLAorCQkJci0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfaml0dGVyKTsKKworCQlsZW4gKz0gc25wcmludGYoJmJ1ZltsZW5dLCBidWZfbGVuIC0gbGVuLAorCQkJIiBnYnBoeS1sYXRlbmN5IHVzZWM6XHRtaW49JXUgbWF4PSV1IGF2ZXJhZ2U9JWYgaml0dGVyPSV1XG4iLAorCQkJci0+Z2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9taW4sCisJCQlyLT5nYnBoeV9maXJtd2FyZV9sYXRlbmN5X21heCwKKwkJCXItPmdicGh5X2Zpcm13YXJlX2xhdGVuY3lfYXZnLAorCQkJci0+Z2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9qaXR0ZXIpOworCisJfSBlbHNlIHsKKwkJbGVuICs9IHNucHJpbnRmKCZidWZbbGVuXSwgYnVmX2xlbi0gbGVuLCAiLCVzLCVzLCV1LCV1LCV1IiwKKwkJCXQtPnRlc3RfbmFtZSwgZGV2X25hbWUsIHQtPnNpemUsIHQtPml0ZXJhdGlvbl9tYXgsCisJCQlyLT5lcnJvcik7CisKKwkJbGVuICs9IHNucHJpbnRmKCZidWZbbGVuXSwgYnVmX2xlbiAtIGxlbiwgIiwldSwldSwlZiwldSIsCisJCQlyLT5yZXF1ZXN0X21pbiwKKwkJCXItPnJlcXVlc3RfbWF4LAorCQkJci0+cmVxdWVzdF9hdmcsCisJCQlyLT5yZXF1ZXN0X2ppdHRlcik7CisKKwkJbGVuICs9IHNucHJpbnRmKCZidWZbbGVuXSwgYnVmX2xlbiAtIGxlbiwgIiwldSwldSwlZiwldSIsCisJCQlyLT5sYXRlbmN5X21pbiwKKwkJCXItPmxhdGVuY3lfbWF4LAorCQkJci0+bGF0ZW5jeV9hdmcsCisJCQlyLT5sYXRlbmN5X2ppdHRlcik7CisKKwkJbGVuICs9IHNucHJpbnRmKCZidWZbbGVuXSwgYnVmX2xlbiAtIGxlbiwgIiwldSwldSwlZiwldSIsCisJCQlyLT50aHJvdWdocHV0X21pbiwKKwkJCXItPnRocm91Z2hwdXRfbWF4LAorCQkJci0+dGhyb3VnaHB1dF9hdmcsCisJCQlyLT50aHJvdWdocHV0X2ppdHRlcik7CisKKwkJbGVuICs9IHNucHJpbnRmKCZidWZbbGVuXSwgYnVmX2xlbiAtIGxlbiwgIiwldSwldSwlZiwldSIsCisJCQlyLT5hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9taW4sCisJCQlyLT5hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9tYXgsCisJCQlyLT5hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9hdmcsCisJCQlyLT5hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9qaXR0ZXIpOworCisJCWxlbiArPSBzbnByaW50ZigmYnVmW2xlbl0sIGJ1Zl9sZW4gLSBsZW4sICIsJXUsJXUsJWYsJXUiLAorCQkJci0+Z2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9taW4sCisJCQlyLT5nYnBoeV9maXJtd2FyZV9sYXRlbmN5X21heCwKKwkJCXItPmdicGh5X2Zpcm13YXJlX2xhdGVuY3lfYXZnLAorCQkJci0+Z2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9qaXR0ZXIpOworCX0KKworCXByaW50ZigiXG4lc1xuIiwgYnVmKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgbG9nX3Jlc3VsdHMoc3RydWN0IGxvb3BiYWNrX3Rlc3QgKnQpCit7CisJaW50IGZkLCBpLCBsZW4sIHJldDsKKwlzdHJ1Y3QgdG0gdG07CisJdGltZV90IGxvY2FsX3RpbWU7CisJbW9kZV90IG1vZGUgPSBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIOworCWNoYXIgZmlsZV9uYW1lW01BWF9TWVNGU19QQVRIXTsKKwljaGFyIGRhdGFbQ1NWX01BWF9MSU5FXTsKKworCWxvY2FsX3RpbWUgPSB0aW1lKE5VTEwpOworCXRtID0gKmxvY2FsdGltZSgmbG9jYWxfdGltZSk7CisKKwkvKgorCSogZmlsZSBuYW1lIHdpbGwgdGVzdF9uYW1lX3NpemVfaXRlcmF0aW9uX21heC5jc3YKKwkqIGV2ZXJ5IHRpbWUgdGhlIHNhbWUgdGVzdCB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgaXMgcnVuIHdlIHdpbGwgdGhlbgorCSogYXBwZW5kIHRvIHRoZSBzYW1lIENTViB3aXRoIGRhdGVzdGFtcCAtIHJlcHJlc2VudGluZyBlYWNoIHRlc3QKKwkqIGRhdGFzZXQuCisJKi8KKwlpZiAodC0+ZmlsZV9vdXRwdXQgJiYgIXQtPnBvcmNlbGFpbikgeworCQlzbnByaW50ZihmaWxlX25hbWUsIHNpemVvZihmaWxlX25hbWUpLCAiJXNfJWRfJWQuY3N2IiwKKwkJCXQtPnRlc3RfbmFtZSwgdC0+c2l6ZSwgdC0+aXRlcmF0aW9uX21heCk7CisKKwkJZmQgPSBvcGVuKGZpbGVfbmFtZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19BUFBFTkQsIG1vZGUpOworCQlpZiAoZmQgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBvcGVuICVzIGZvciBhcHBlbmRhdGlvblxuIiwgZmlsZV9uYW1lKTsKKwkJCWFib3J0KCk7CisJCX0KKworCX0KKwlmb3IgKGkgPSAwOyBpIDwgdC0+ZGV2aWNlX2NvdW50OyBpKyspIHsKKwkJaWYgKCFkZXZpY2VfZW5hYmxlZCh0LCBpKSkKKwkJCWNvbnRpbnVlOworCisJCWxlbiA9IGZvcm1hdF9vdXRwdXQodCwgJnQtPmRldmljZXNbaV0ucmVzdWx0cywKKwkJCQkJdC0+ZGV2aWNlc1tpXS5uYW1lLAorCQkJCQlkYXRhLCBzaXplb2YoZGF0YSksICZ0bSk7CisJCWlmICh0LT5maWxlX291dHB1dCAmJiAhdC0+cG9yY2VsYWluKSB7CisJCQlyZXQgPSB3cml0ZShmZCwgZGF0YSwgbGVuKTsKKwkJCWlmIChyZXQgPT0gLTEpCisJCQkJZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gd3JpdGUgJWQgYnl0ZXMgdG8gY3N2LlxuIiwgbGVuKTsKKwkJfQorCisJfQorCisKKwlpZiAodC0+YWdncmVnYXRlX291dHB1dCkgeworCQlsZW4gPSBmb3JtYXRfb3V0cHV0KHQsICZ0LT5hZ2dyZWdhdGVfcmVzdWx0cywgImFnZ3JlZ2F0ZSIsCisJCQkJCWRhdGEsIHNpemVvZihkYXRhKSwgJnRtKTsKKwkJaWYgKHQtPmZpbGVfb3V0cHV0ICYmICF0LT5wb3JjZWxhaW4pIHsKKwkJCXJldCA9IHdyaXRlKGZkLCBkYXRhLCBsZW4pOworCQkJaWYgKHJldCA9PSAtMSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byB3cml0ZSAlZCBieXRlcyB0byBjc3YuXG4iLCBsZW4pOworCQl9CisJfQorCisJaWYgKHQtPmZpbGVfb3V0cHV0ICYmICF0LT5wb3JjZWxhaW4pCisJCWNsb3NlKGZkKTsKKworCXJldHVybiAwOworfQorCitpbnQgaXNfbG9vcGJhY2tfZGV2aWNlKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm5vZGUpCit7CisJY2hhciBmaWxlW01BWF9TWVNGU19QQVRIXTsKKworCXNucHJpbnRmKGZpbGUsIE1BWF9TWVNGU19QQVRILCAiJXMlcy9pdGVyYXRpb25fY291bnQiLCBwYXRoLCBub2RlKTsKKwlpZiAoYWNjZXNzKGZpbGUsIEZfT0spID09IDApCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitpbnQgZmluZF9sb29wYmFja19kZXZpY2VzKHN0cnVjdCBsb29wYmFja190ZXN0ICp0KQoreworCXN0cnVjdCBkaXJlbnQgKipuYW1lbGlzdDsKKwlpbnQgaSwgbiwgcmV0OworCXVuc2lnbmVkIGludCBkZXZfaWQ7CisJc3RydWN0IGxvb3BiYWNrX2RldmljZSAqZDsKKworCW4gPSBzY2FuZGlyKHQtPnN5c2ZzX3ByZWZpeCwgJm5hbWVsaXN0LCBOVUxMLCBhbHBoYXNvcnQpOworCWlmIChuIDwgMCkgeworCQlwZXJyb3IoInNjYW5kaXIiKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBiYWRkaXI7CisJfQorCisJLyogRG9uJ3QgaW5jbHVkZSAnLicgYW5kICcuLicgKi8KKwlpZiAobiA8PSAyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCXJldCA9IHNzY2FuZihuYW1lbGlzdFtpXS0+ZF9uYW1lLCAiZ2JfbG9vcGJhY2sldSIsICZkZXZfaWQpOworCQlpZiAocmV0ICE9IDEpCisJCQljb250aW51ZTsKKworCQlpZiAoIWlzX2xvb3BiYWNrX2RldmljZSh0LT5zeXNmc19wcmVmaXgsIG5hbWVsaXN0W2ldLT5kX25hbWUpKQorCQkJY29udGludWU7CisKKwkJaWYgKHQtPmRldmljZV9jb3VudCA9PSBNQVhfTlVNX0RFVklDRVMpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAibWF4IG51bWJlciBvZiBkZXZpY2VzIHJlYWNoZWQhXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZCA9ICZ0LT5kZXZpY2VzW3QtPmRldmljZV9jb3VudCsrXTsKKwkJc25wcmludGYoZC0+bmFtZSwgTUFYX1NUUl9MRU4sICJnYl9sb29wYmFjayV1IiwgZGV2X2lkKTsKKworCQlzbnByaW50ZihkLT5zeXNmc19lbnRyeSwgTUFYX1NZU0ZTX1BBVEgsICIlcyVzLyIsCisJCQl0LT5zeXNmc19wcmVmaXgsIGQtPm5hbWUpOworCisJCXNucHJpbnRmKGQtPmRlYnVnZnNfZW50cnksIE1BWF9TWVNGU19QQVRILCAiJXNyYXdfbGF0ZW5jeV8lcyIsCisJCQl0LT5kZWJ1Z2ZzX3ByZWZpeCwgZC0+bmFtZSk7CisKKwkJaWYgKHQtPmRlYnVnKQorCQkJcHJpbnRmKCJhZGQgJXMgJXNcbiIsIGQtPnN5c2ZzX2VudHJ5LAorCQkJCWQtPmRlYnVnZnNfZW50cnkpOworCX0KKworCXJldCA9IDA7Citkb25lOgorCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCWZyZWUobmFtZWxpc3Rbbl0pOworCWZyZWUobmFtZWxpc3QpOworYmFkZGlyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl9wb2xsX2ZpbGVzKHN0cnVjdCBsb29wYmFja190ZXN0ICp0KQoreworCXN0cnVjdCBsb29wYmFja19kZXZpY2UgKmRldjsKKwljaGFyIGJ1ZltNQVhfU1RSX0xFTl07CisJY2hhciBkdW1teTsKKwlpbnQgZmRzX2lkeCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdC0+ZGV2aWNlX2NvdW50OyBpKyspIHsKKwkJZGV2ID0gJnQtPmRldmljZXNbaV07CisKKwkJaWYgKCFkZXZpY2VfZW5hYmxlZCh0LCBpKSkKKwkJCWNvbnRpbnVlOworCisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyVzIiwgZGV2LT5zeXNmc19lbnRyeSwgIml0ZXJhdGlvbl9jb3VudCIpOworCQl0LT5mZHNbZmRzX2lkeF0uZmQgPSBvcGVuKGJ1ZiwgT19SRE9OTFkpOworCQlpZiAodC0+ZmRzW2Zkc19pZHhdLmZkIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJFcnJvciBvcGVuaW5nIHBvbGwgZmlsZSFcbiIpOworCQkJZ290byBlcnI7CisJCX0KKwkJcmVhZCh0LT5mZHNbZmRzX2lkeF0uZmQsICZkdW1teSwgMSk7CisJCXQtPmZkc1tmZHNfaWR4XS5ldmVudHMgPSBQT0xMRVJSfFBPTExQUkk7CisJCXQtPmZkc1tmZHNfaWR4XS5yZXZlbnRzID0gMDsKKwkJZmRzX2lkeCsrOworCX0KKworCXQtPnBvbGxfY291bnQgPSBmZHNfaWR4OworCisJcmV0dXJuIDA7CisKK2VycjoKKwlmb3IgKGkgPSAwOyBpIDwgZmRzX2lkeDsgaSsrKQorCQljbG9zZSh0LT5mZHNbZmRzX2lkeF0uZmQpOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGNsb3NlX3BvbGxfZmlsZXMoc3RydWN0IGxvb3BiYWNrX3Rlc3QgKnQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHQtPnBvbGxfY291bnQ7IGkrKykKKwkJY2xvc2UodC0+ZmRzW2ldLmZkKTsKKworCXJldHVybiAwOworfQorc3RhdGljIGludCBpc19jb21wbGV0ZShzdHJ1Y3QgbG9vcGJhY2tfdGVzdCAqdCkKK3sKKwlpbnQgaXRlcmF0aW9uX2NvdW50OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHQtPmRldmljZV9jb3VudDsgaSsrKSB7CisJCWlmICghZGV2aWNlX2VuYWJsZWQodCwgaSkpCisJCQljb250aW51ZTsKKworCQlpdGVyYXRpb25fY291bnQgPSByZWFkX3N5c2ZzX2ludCh0LT5kZXZpY2VzW2ldLnN5c2ZzX2VudHJ5LAorCQkJCQkJICJpdGVyYXRpb25fY291bnQiKTsKKworCQkvKiBhdCBsZWFzdCBvbmUgZGV2aWNlIGRpZCBub3QgZmluaXNoIHlldCAqLworCQlpZiAoaXRlcmF0aW9uX2NvdW50ICE9IHQtPml0ZXJhdGlvbl9tYXgpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgc3RvcF90ZXN0cyhzdHJ1Y3QgbG9vcGJhY2tfdGVzdCAqdCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB0LT5kZXZpY2VfY291bnQ7IGkrKykgeworCQlpZiAoIWRldmljZV9lbmFibGVkKHQsIGkpKQorCQkJY29udGludWU7CisJCXdyaXRlX3N5c2ZzX3ZhbCh0LT5kZXZpY2VzW2ldLnN5c2ZzX2VudHJ5LCAidHlwZSIsIDApOworCX0KK30KKworc3RhdGljIHZvaWQgaGFuZGxlcihpbnQgc2lnKSB7IC8qIGRvIG5vdGhpbmcgKi8gIH0KKworc3RhdGljIGludCB3YWl0X2Zvcl9jb21wbGV0ZShzdHJ1Y3QgbG9vcGJhY2tfdGVzdCAqdCkKK3sKKwlpbnQgbnVtYmVyX29mX2V2ZW50cyA9IDA7CisJY2hhciBkdW1teTsKKwlpbnQgcmV0OworCWludCBpOworCXN0cnVjdCB0aW1lc3BlYyAqdHMgPSBOVUxMOworCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisJc2lnc2V0X3QgbWFza19vbGQsIG1hc2s7CisKKwlzaWdlbXB0eXNldCgmbWFzayk7CisJc2lnZW1wdHlzZXQoJm1hc2tfb2xkKTsKKwlzaWdhZGRzZXQoJm1hc2ssIFNJR0lOVCk7CisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmbWFzaywgJm1hc2tfb2xkKTsKKworCXNhLnNhX2hhbmRsZXIgPSBoYW5kbGVyOworCXNhLnNhX2ZsYWdzID0gMDsKKwlzaWdlbXB0eXNldCgmc2Euc2FfbWFzayk7CisJaWYgKHNpZ2FjdGlvbihTSUdJTlQsICZzYSwgTlVMTCkgPT0gLTEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJzaWdhY3Rpb24gZXJyb3JcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHQtPnBvbGxfdGltZW91dC50dl9zZWMgIT0gMCkKKwkJdHMgPSAmdC0+cG9sbF90aW1lb3V0OworCisJd2hpbGUgKDEpIHsKKworCQlyZXQgPSBwcG9sbCh0LT5mZHMsIHQtPnBvbGxfY291bnQsIHRzLCAmbWFza19vbGQpOworCQlpZiAocmV0IDw9IDApIHsKKwkJCXN0b3BfdGVzdHModCk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlBvbGwgZXhpdCB3aXRoIGVycm5vICVkXG4iLCBlcnJubyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgdC0+cG9sbF9jb3VudDsgaSsrKSB7CisJCQlpZiAodC0+ZmRzW2ldLnJldmVudHMgJiBQT0xMUFJJKSB7CisJCQkJLyogRHVtbXkgcmVhZCB0byBjbGVhciB0aGUgZXZlbnQgKi8KKwkJCQlyZWFkKHQtPmZkc1tpXS5mZCwgJmR1bW15LCAxKTsKKwkJCQludW1iZXJfb2ZfZXZlbnRzKys7CisJCQl9CisJCX0KKworCQlpZiAobnVtYmVyX29mX2V2ZW50cyA9PSB0LT5wb2xsX2NvdW50KQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFpc19jb21wbGV0ZSh0KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkl0ZXJhdGlvbiBjb3VudCBkaWQgbm90IGZpbmlzaCFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfZGV2aWNlcyhzdHJ1Y3QgbG9vcGJhY2tfdGVzdCAqdCkKK3sKKwlpbnQgaTsKKworCS8qIENhbmNlbCBhbnkgcnVubmluZyB0ZXN0cyBvbiBlbmFibGVkIGRldmljZXMuIElmCisJICogc3RvcF9hbGwgb3B0aW9uIGlzIGdpdmVuLCBzdG9wIHRlc3Qgb24gYWxsIGRldmljZXMuCisJICovCisJZm9yIChpID0gMDsgaSA8IHQtPmRldmljZV9jb3VudDsgaSsrKQorCQlpZiAodC0+c3RvcF9hbGwgfHwgZGV2aWNlX2VuYWJsZWQodCwgaSkpCisJCQl3cml0ZV9zeXNmc192YWwodC0+ZGV2aWNlc1tpXS5zeXNmc19lbnRyeSwgInR5cGUiLCAwKTsKKworCisJZm9yIChpID0gMDsgaSA8IHQtPmRldmljZV9jb3VudDsgaSsrKSB7CisJCWlmICghZGV2aWNlX2VuYWJsZWQodCwgaSkpCisJCQljb250aW51ZTsKKworCQl3cml0ZV9zeXNmc192YWwodC0+ZGV2aWNlc1tpXS5zeXNmc19lbnRyeSwgInVzX3dhaXQiLAorCQkJCXQtPnVzX3dhaXQpOworCisJCS8qIFNldCBvcGVyYXRpb24gc2l6ZSAqLworCQl3cml0ZV9zeXNmc192YWwodC0+ZGV2aWNlc1tpXS5zeXNmc19lbnRyeSwgInNpemUiLCB0LT5zaXplKTsKKworCQkvKiBTZXQgaXRlcmF0aW9ucyAqLworCQl3cml0ZV9zeXNmc192YWwodC0+ZGV2aWNlc1tpXS5zeXNmc19lbnRyeSwgIml0ZXJhdGlvbl9tYXgiLAorCQkJCXQtPml0ZXJhdGlvbl9tYXgpOworCisJCWlmICh0LT51c2VfYXN5bmMpIHsKKwkJCXdyaXRlX3N5c2ZzX3ZhbCh0LT5kZXZpY2VzW2ldLnN5c2ZzX2VudHJ5LAorCQkJCSJhc3luYyIsIDEpOworCQkJd3JpdGVfc3lzZnNfdmFsKHQtPmRldmljZXNbaV0uc3lzZnNfZW50cnksCisJCQkJInRpbWVvdXQiLCB0LT5hc3luY190aW1lb3V0KTsKKwkJCXdyaXRlX3N5c2ZzX3ZhbCh0LT5kZXZpY2VzW2ldLnN5c2ZzX2VudHJ5LAorCQkJCSJvdXRzdGFuZGluZ19vcGVyYXRpb25zX21heCIsCisJCQkJdC0+YXN5bmNfb3V0c3RhbmRpbmdfb3BlcmF0aW9ucyk7CisJCX0gZWxzZQorCQkJd3JpdGVfc3lzZnNfdmFsKHQtPmRldmljZXNbaV0uc3lzZnNfZW50cnksCisJCQkJImFzeW5jIiwgMCk7CisJfQorfQorCitzdGF0aWMgaW50IHN0YXJ0KHN0cnVjdCBsb29wYmFja190ZXN0ICp0KQoreworCWludCBpOworCisJLyogdGhlIHRlc3Qgc3RhcnRzIGJ5IHdyaXRpbmcgdGVzdF9pZCB0byB0aGUgdHlwZSBmaWxlLiAqLworCWZvciAoaSA9IDA7IGkgPCB0LT5kZXZpY2VfY291bnQ7IGkrKykgeworCQlpZiAoIWRldmljZV9lbmFibGVkKHQsIGkpKQorCQkJY29udGludWU7CisKKwkJd3JpdGVfc3lzZnNfdmFsKHQtPmRldmljZXNbaV0uc3lzZnNfZW50cnksICJ0eXBlIiwgdC0+dGVzdF9pZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBsb29wYmFja19ydW4oc3RydWN0IGxvb3BiYWNrX3Rlc3QgKnQpCit7CisJaW50IGk7CisJaW50IHJldDsKKworCWZvciAoaSA9IDA7IGRpY3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKKwkJaWYgKHN0cnN0cihkaWN0W2ldLm5hbWUsIHQtPnRlc3RfbmFtZSkpCisJCQl0LT50ZXN0X2lkID0gZGljdFtpXS50eXBlOworCX0KKwlpZiAoIXQtPnRlc3RfaWQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIHRlc3QgJXNcbiIsIHQtPnRlc3RfbmFtZSk7CisJCXVzYWdlKCk7CisJCXJldHVybjsKKwl9CisKKwlwcmVwYXJlX2RldmljZXModCk7CisKKwlyZXQgPSBvcGVuX3BvbGxfZmlsZXModCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlzdGFydCh0KTsKKworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRlKHQpOworCWNsb3NlX3BvbGxfZmlsZXModCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKworCWdldF9yZXN1bHRzKHQpOworCisJbG9nX3Jlc3VsdHModCk7CisKKwlyZXR1cm47CisKK2VycjoKKwlwcmludGYoIkVycm9yIHJ1bm5pbmcgdGVzdFxuIik7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHNhbml0eV9jaGVjayhzdHJ1Y3QgbG9vcGJhY2tfdGVzdCAqdCkKK3sKKwlpbnQgaTsKKworCWlmICh0LT5kZXZpY2VfY291bnQgPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIGxvb3BiYWNrIGRldmljZXMgZm91bmRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fREVWSUNFUzsgaSsrKSB7CisJCWlmICghZGV2aWNlX2VuYWJsZWQodCwgaSkpCisJCQljb250aW51ZTsKKworCQlpZiAodC0+bWFzayAmJiAhc3RyY21wKHQtPmRldmljZXNbaV0ubmFtZSwgIiIpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkJhZCBkZXZpY2UgbWFzayAleFxuIiwgKDEgPDwgaSkpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwl9CisKKworCXJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBvLCByZXQ7CisJY2hhciAqc3lzZnNfcHJlZml4ID0gIi9zeXMvY2xhc3MvZ2JfbG9vcGJhY2svIjsKKwljaGFyICpkZWJ1Z2ZzX3ByZWZpeCA9ICIvc3lzL2tlcm5lbC9kZWJ1Zy9nYl9sb29wYmFjay8iOworCisJbWVtc2V0KCZ0LCAwLCBzaXplb2YodCkpOworCisJd2hpbGUgKChvID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsCisJCQkgICAidDpzOmk6UzpEOm06djo6ZDo6cjo6cDo6YTo6bDo6eDo6bzpPOmM6dzp6OjpmOjoiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChvKSB7CisJCWNhc2UgJ3QnOgorCQkJc25wcmludGYodC50ZXN0X25hbWUsIE1BWF9TVFJfTEVOLCAiJXMiLCBvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJdC5zaXplID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQkJdC5pdGVyYXRpb25fbWF4ID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ1MnOgorCQkJc25wcmludGYodC5zeXNmc19wcmVmaXgsIE1BWF9TWVNGU19QQVRILCAiJXMiLCBvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ0QnOgorCQkJc25wcmludGYodC5kZWJ1Z2ZzX3ByZWZpeCwgTUFYX1NZU0ZTX1BBVEgsICIlcyIsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQl0Lm1hc2sgPSBhdG9sKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQl0LnZlcmJvc2UgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJdC5kZWJ1ZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQl0LnJhd19kYXRhX2R1bXAgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJdC5wb3JjZWxhaW4gPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2EnOgorCQkJdC5hZ2dyZWdhdGVfb3V0cHV0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCXQubGlzdF9kZXZpY2VzID0gMTsKKwkJCWJyZWFrOworCQljYXNlICd4JzoKKwkJCXQudXNlX2FzeW5jID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdvJzoKKwkJCXQuYXN5bmNfdGltZW91dCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdPJzoKKwkJCXQucG9sbF90aW1lb3V0LnR2X3NlYyA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCXQuYXN5bmNfb3V0c3RhbmRpbmdfb3BlcmF0aW9ucyA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICd3JzoKKwkJCXQudXNfd2FpdCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICd6JzoKKwkJCXQuZmlsZV9vdXRwdXQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJdC5zdG9wX2FsbCA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmICghc3RyY21wKHQuc3lzZnNfcHJlZml4LCAiIikpCisJCXNucHJpbnRmKHQuc3lzZnNfcHJlZml4LCBNQVhfU1lTRlNfUEFUSCwgIiVzIiwgc3lzZnNfcHJlZml4KTsKKworCWlmICghc3RyY21wKHQuZGVidWdmc19wcmVmaXgsICIiKSkKKwkJc25wcmludGYodC5kZWJ1Z2ZzX3ByZWZpeCwgTUFYX1NZU0ZTX1BBVEgsICIlcyIsIGRlYnVnZnNfcHJlZml4KTsKKworCXJldCA9IGZpbmRfbG9vcGJhY2tfZGV2aWNlcygmdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBzYW5pdHlfY2hlY2soJnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodC5saXN0X2RldmljZXMpIHsKKwkJc2hvd19sb29wYmFja19kZXZpY2VzKCZ0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHQudGVzdF9uYW1lWzBdID09ICdcMCcgfHwgdC5pdGVyYXRpb25fbWF4ID09IDApCisJCXVzYWdlKCk7CisKKwlpZiAodC5hc3luY190aW1lb3V0ID09IDApCisJCXQuYXN5bmNfdGltZW91dCA9IERFRkFVTFRfQVNZTkNfVElNRU9VVDsKKworCWxvb3BiYWNrX3J1bigmdCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3VhcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3VhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWU3OTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdWFydC5jCkBAIC0wLDAgKzEsMTA3NSBAQAorLyoKKyAqIFVBUlQgZHJpdmVyIGZvciB0aGUgR3JleWJ1cyAiZ2VuZXJpYyIgVUFSVCBtb2R1bGUuCisgKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKgorICogSGVhdmlseSBiYXNlZCBvbiBkcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMgYW5kCisgKiBkcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jLgorICovCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImdicGh5LmgiCisKKyNkZWZpbmUgR0JfTlVNX01JTk9SUwkxNgkvKiAxNiBpcyBpcyBtb3JlIHRoYW4gZW5vdWdoICovCisjZGVmaW5lIEdCX05BTUUJCSJ0dHlHQiIKKworI2RlZmluZSBHQl9VQVJUX1dSSVRFX0ZJRk9fU0laRQkJUEFHRV9TSVpFCisjZGVmaW5lIEdCX1VBUlRfV1JJVEVfUk9PTV9NQVJHSU4JMQkvKiBsZWF2ZSBzb21lIHNwYWNlIGluIGZpZm8gKi8KKyNkZWZpbmUgR0JfVUFSVF9GSVJNV0FSRV9DUkVESVRTCTQwOTYKKyNkZWZpbmUgR0JfVUFSVF9DUkVESVRfV0FJVF9USU1FT1VUX01TRUMJMTAwMDAKKworc3RydWN0IGdiX3R0eV9saW5lX2NvZGluZyB7CisJX19sZTMyCXJhdGU7CisJX191OAlmb3JtYXQ7CisJX191OAlwYXJpdHk7CisJX191OAlkYXRhX2JpdHM7CisJX191OAlmbG93X2NvbnRyb2w7Cit9OworCitzdHJ1Y3QgZ2JfdHR5IHsKKwlzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXY7CisJc3RydWN0IHR0eV9wb3J0IHBvcnQ7CisJdm9pZCAqYnVmZmVyOworCXNpemVfdCBidWZmZXJfcGF5bG9hZF9tYXg7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJdTE2IGNwb3J0X2lkOworCXVuc2lnbmVkIGludCBtaW5vcjsKKwl1bnNpZ25lZCBjaGFyIGNsb2NhbDsKKwlib29sIGRpc2Nvbm5lY3RlZDsKKwlzcGlubG9ja190IHJlYWRfbG9jazsKKwlzcGlubG9ja190IHdyaXRlX2xvY2s7CisJc3RydWN0IGFzeW5jX2ljb3VudCBpb2NvdW50OworCXN0cnVjdCBhc3luY19pY291bnQgb2xkY291bnQ7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2lvY3RsOworCXN0cnVjdCBtdXRleCBtdXRleDsKKwl1OCBjdHJsaW47CS8qIGlucHV0IGNvbnRyb2wgbGluZXMgKi8KKwl1OCBjdHJsb3V0OwkvKiBvdXRwdXQgY29udHJvbCBsaW5lcyAqLworCXN0cnVjdCBnYl90dHlfbGluZV9jb2RpbmcgbGluZV9jb2Rpbmc7CisJc3RydWN0IHdvcmtfc3RydWN0IHR4X3dvcms7CisJc3RydWN0IGtmaWZvIHdyaXRlX2ZpZm87CisJYm9vbCBjbG9zZV9wZW5kaW5nOworCXVuc2lnbmVkIGludCBjcmVkaXRzOworCXN0cnVjdCBjb21wbGV0aW9uIGNyZWRpdHNfY29tcGxldGU7Cit9OworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmdiX3R0eV9kcml2ZXI7CitzdGF0aWMgREVGSU5FX0lEUih0dHlfbWlub3JzKTsKK3N0YXRpYyBERUZJTkVfTVVURVgodGFibGVfbG9jayk7CisKK3N0YXRpYyBpbnQgZ2JfdWFydF9yZWNlaXZlX2RhdGFfaGFuZGxlcihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl90dHkgKmdiX3R0eSA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoY29ubmVjdGlvbik7CisJc3RydWN0IHR0eV9wb3J0ICpwb3J0ID0gJmdiX3R0eS0+cG9ydDsKKwlzdHJ1Y3QgZ2JfbWVzc2FnZSAqcmVxdWVzdCA9IG9wLT5yZXF1ZXN0OworCXN0cnVjdCBnYl91YXJ0X3JlY3ZfZGF0YV9yZXF1ZXN0ICpyZWNlaXZlX2RhdGE7CisJdTE2IHJlY3ZfZGF0YV9zaXplOworCWludCBjb3VudDsKKwl1bnNpZ25lZCBsb25nIHR0eV9mbGFncyA9IFRUWV9OT1JNQUw7CisKKwlpZiAocmVxdWVzdC0+cGF5bG9hZF9zaXplIDwgc2l6ZW9mKCpyZWNlaXZlX2RhdGEpKSB7CisJCWRldl9lcnIoJmdiX3R0eS0+Z2JwaHlfZGV2LT5kZXYsCisJCQkic2hvcnQgcmVjZWl2ZS1kYXRhIHJlcXVlc3QgcmVjZWl2ZWQgKCV6dSA8ICV6dSlcbiIsCisJCQlyZXF1ZXN0LT5wYXlsb2FkX3NpemUsIHNpemVvZigqcmVjZWl2ZV9kYXRhKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlY2VpdmVfZGF0YSA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCXJlY3ZfZGF0YV9zaXplID0gbGUxNl90b19jcHUocmVjZWl2ZV9kYXRhLT5zaXplKTsKKworCWlmIChyZWN2X2RhdGFfc2l6ZSAhPSByZXF1ZXN0LT5wYXlsb2FkX3NpemUgLSBzaXplb2YoKnJlY2VpdmVfZGF0YSkpIHsKKwkJZGV2X2VycigmZ2JfdHR5LT5nYnBoeV9kZXYtPmRldiwKKwkJCSJtYWxmb3JtZWQgcmVjZWl2ZS1kYXRhIHJlcXVlc3QgcmVjZWl2ZWQgKCV1ICE9ICV6dSlcbiIsCisJCQlyZWN2X2RhdGFfc2l6ZSwKKwkJCXJlcXVlc3QtPnBheWxvYWRfc2l6ZSAtIHNpemVvZigqcmVjZWl2ZV9kYXRhKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghcmVjdl9kYXRhX3NpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJlY2VpdmVfZGF0YS0+ZmxhZ3MpIHsKKwkJaWYgKHJlY2VpdmVfZGF0YS0+ZmxhZ3MgJiBHQl9VQVJUX1JFQ1ZfRkxBR19CUkVBSykKKwkJCXR0eV9mbGFncyA9IFRUWV9CUkVBSzsKKwkJZWxzZSBpZiAocmVjZWl2ZV9kYXRhLT5mbGFncyAmIEdCX1VBUlRfUkVDVl9GTEFHX1BBUklUWSkKKwkJCXR0eV9mbGFncyA9IFRUWV9QQVJJVFk7CisJCWVsc2UgaWYgKHJlY2VpdmVfZGF0YS0+ZmxhZ3MgJiBHQl9VQVJUX1JFQ1ZfRkxBR19GUkFNSU5HKQorCQkJdHR5X2ZsYWdzID0gVFRZX0ZSQU1FOworCisJCS8qIG92ZXJydW4gaXMgc3BlY2lhbCwgbm90IGFzc29jaWF0ZWQgd2l0aCBhIGNoYXIgKi8KKwkJaWYgKHJlY2VpdmVfZGF0YS0+ZmxhZ3MgJiBHQl9VQVJUX1JFQ1ZfRkxBR19PVkVSUlVOKQorCQkJdHR5X2luc2VydF9mbGlwX2NoYXIocG9ydCwgMCwgVFRZX09WRVJSVU4pOworCX0KKwljb3VudCA9IHR0eV9pbnNlcnRfZmxpcF9zdHJpbmdfZml4ZWRfZmxhZyhwb3J0LCByZWNlaXZlX2RhdGEtPmRhdGEsCisJCQkJCQkgIHR0eV9mbGFncywgcmVjdl9kYXRhX3NpemUpOworCWlmIChjb3VudCAhPSByZWN2X2RhdGFfc2l6ZSkgeworCQlkZXZfZXJyKCZnYl90dHktPmdicGh5X2Rldi0+ZGV2LAorCQkJIlVBUlQ6IFJYIDB4JTA4eCBieXRlcyBvbmx5IHdyb3RlIDB4JTA4eFxuIiwKKwkJCXJlY3ZfZGF0YV9zaXplLCBjb3VudCk7CisJfQorCWlmIChjb3VudCkKKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2gocG9ydCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfdWFydF9zZXJpYWxfc3RhdGVfaGFuZGxlcihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl90dHkgKmdiX3R0eSA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoY29ubmVjdGlvbik7CisJc3RydWN0IGdiX21lc3NhZ2UgKnJlcXVlc3QgPSBvcC0+cmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfdWFydF9zZXJpYWxfc3RhdGVfcmVxdWVzdCAqc2VyaWFsX3N0YXRlOworCisJaWYgKHJlcXVlc3QtPnBheWxvYWRfc2l6ZSA8IHNpemVvZigqc2VyaWFsX3N0YXRlKSkgeworCQlkZXZfZXJyKCZnYl90dHktPmdicGh5X2Rldi0+ZGV2LAorCQkJInNob3J0IHNlcmlhbC1zdGF0ZSBldmVudCByZWNlaXZlZCAoJXp1IDwgJXp1KVxuIiwKKwkJCXJlcXVlc3QtPnBheWxvYWRfc2l6ZSwgc2l6ZW9mKCpzZXJpYWxfc3RhdGUpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2VyaWFsX3N0YXRlID0gcmVxdWVzdC0+cGF5bG9hZDsKKwlnYl90dHktPmN0cmxpbiA9IHNlcmlhbF9zdGF0ZS0+Y29udHJvbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX3VhcnRfcmVjZWl2ZV9jcmVkaXRzX2hhbmRsZXIoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKGNvbm5lY3Rpb24pOworCXN0cnVjdCBnYl9tZXNzYWdlICpyZXF1ZXN0ID0gb3AtPnJlcXVlc3Q7CisJc3RydWN0IGdiX3VhcnRfcmVjZWl2ZV9jcmVkaXRzX3JlcXVlc3QgKmNyZWRpdF9yZXF1ZXN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGluY29taW5nX2NyZWRpdHM7CisJaW50IHJldCA9IDA7CisKKwlpZiAocmVxdWVzdC0+cGF5bG9hZF9zaXplIDwgc2l6ZW9mKCpjcmVkaXRfcmVxdWVzdCkpIHsKKwkJZGV2X2VycigmZ2JfdHR5LT5nYnBoeV9kZXYtPmRldiwKKwkJCSJzaG9ydCByZWNlaXZlX2NyZWRpdHMgZXZlbnQgcmVjZWl2ZWQgKCV6dSA8ICV6dSlcbiIsCisJCQlyZXF1ZXN0LT5wYXlsb2FkX3NpemUsCisJCQlzaXplb2YoKmNyZWRpdF9yZXF1ZXN0KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNyZWRpdF9yZXF1ZXN0ID0gcmVxdWVzdC0+cGF5bG9hZDsKKwlpbmNvbWluZ19jcmVkaXRzID0gbGUxNl90b19jcHUoY3JlZGl0X3JlcXVlc3QtPmNvdW50KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZnYl90dHktPndyaXRlX2xvY2ssIGZsYWdzKTsKKwlnYl90dHktPmNyZWRpdHMgKz0gaW5jb21pbmdfY3JlZGl0czsKKwlpZiAoZ2JfdHR5LT5jcmVkaXRzID4gR0JfVUFSVF9GSVJNV0FSRV9DUkVESVRTKSB7CisJCWdiX3R0eS0+Y3JlZGl0cyAtPSBpbmNvbWluZ19jcmVkaXRzOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYl90dHktPndyaXRlX2xvY2ssIGZsYWdzKTsKKworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmZ2JfdHR5LT5nYnBoeV9kZXYtPmRldiwKKwkJCSJpbnZhbGlkIG51bWJlciBvZiBpbmNvbWluZyBjcmVkaXRzOiAlZFxuIiwKKwkJCWluY29taW5nX2NyZWRpdHMpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghZ2JfdHR5LT5jbG9zZV9wZW5kaW5nKQorCQlzY2hlZHVsZV93b3JrKCZnYl90dHktPnR4X3dvcmspOworCisJLyoKKwkgKiB0aGUgcG9ydCB0aGUgdHR5IGxheWVyIG1heSBiZSB3YWl0aW5nIGZvciBjcmVkaXRzCisJICovCisJdHR5X3BvcnRfdHR5X3dha2V1cCgmZ2JfdHR5LT5wb3J0KTsKKworCWlmIChnYl90dHktPmNyZWRpdHMgPT0gR0JfVUFSVF9GSVJNV0FSRV9DUkVESVRTKQorCQljb21wbGV0ZSgmZ2JfdHR5LT5jcmVkaXRzX2NvbXBsZXRlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfdWFydF9yZXF1ZXN0X2hhbmRsZXIoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKGNvbm5lY3Rpb24pOworCWludCB0eXBlID0gb3AtPnR5cGU7CisJaW50IHJldDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgR0JfVUFSVF9UWVBFX1JFQ0VJVkVfREFUQToKKwkJcmV0ID0gZ2JfdWFydF9yZWNlaXZlX2RhdGFfaGFuZGxlcihvcCk7CisJCWJyZWFrOworCWNhc2UgR0JfVUFSVF9UWVBFX1NFUklBTF9TVEFURToKKwkJcmV0ID0gZ2JfdWFydF9zZXJpYWxfc3RhdGVfaGFuZGxlcihvcCk7CisJCWJyZWFrOworCWNhc2UgR0JfVUFSVF9UWVBFX1JFQ0VJVkVfQ1JFRElUUzoKKwkJcmV0ID0gZ2JfdWFydF9yZWNlaXZlX2NyZWRpdHNfaGFuZGxlcihvcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmdiX3R0eS0+Z2JwaHlfZGV2LT5kZXYsCisJCQkidW5zdXBwb3J0ZWQgdW5zb2xpY2l0ZWQgcmVxdWVzdDogMHglMDJ4XG4iLCB0eXBlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCAgZ2JfdWFydF90eF93cml0ZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZ2JfdWFydF9zZW5kX2RhdGFfcmVxdWVzdCAqcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgc2VuZF9zaXplOworCWludCByZXQ7CisKKwlnYl90dHkgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGdiX3R0eSwgdHhfd29yayk7CisJcmVxdWVzdCA9IGdiX3R0eS0+YnVmZmVyOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKGdiX3R0eS0+Y2xvc2VfcGVuZGluZykKKwkJCWJyZWFrOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZnYl90dHktPndyaXRlX2xvY2ssIGZsYWdzKTsKKwkJc2VuZF9zaXplID0gZ2JfdHR5LT5idWZmZXJfcGF5bG9hZF9tYXg7CisJCWlmIChzZW5kX3NpemUgPiBnYl90dHktPmNyZWRpdHMpCisJCQlzZW5kX3NpemUgPSBnYl90dHktPmNyZWRpdHM7CisKKwkJc2VuZF9zaXplID0ga2ZpZm9fb3V0X3BlZWsoJmdiX3R0eS0+d3JpdGVfZmlmbywKKwkJCQkJICAgJnJlcXVlc3QtPmRhdGFbMF0sCisJCQkJCSAgIHNlbmRfc2l6ZSk7CisJCWlmICghc2VuZF9zaXplKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYl90dHktPndyaXRlX2xvY2ssIGZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZ2JfdHR5LT5jcmVkaXRzIC09IHNlbmRfc2l6ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2JfdHR5LT53cml0ZV9sb2NrLCBmbGFncyk7CisKKwkJcmVxdWVzdC0+c2l6ZSA9IGNwdV90b19sZTE2KHNlbmRfc2l6ZSk7CisJCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGdiX3R0eS0+Y29ubmVjdGlvbiwKKwkJCQkJR0JfVUFSVF9UWVBFX1NFTkRfREFUQSwKKwkJCQkJcmVxdWVzdCwgc2l6ZW9mKCpyZXF1ZXN0KSArIHNlbmRfc2l6ZSwKKwkJCQkJTlVMTCwgMCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJmdiX3R0eS0+Z2JwaHlfZGV2LT5kZXYsCisJCQkJInNlbmQgZGF0YSBlcnJvcjogJWRcbiIsIHJldCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2JfdHR5LT53cml0ZV9sb2NrLCBmbGFncyk7CisJCQlnYl90dHktPmNyZWRpdHMgKz0gc2VuZF9zaXplOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2JfdHR5LT53cml0ZV9sb2NrLCBmbGFncyk7CisJCQlpZiAoIWdiX3R0eS0+Y2xvc2VfcGVuZGluZykKKwkJCQlzY2hlZHVsZV93b3JrKHdvcmspOworCQkJcmV0dXJuOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmdiX3R0eS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCQlyZXQgPSBrZmlmb19vdXQoJmdiX3R0eS0+d3JpdGVfZmlmbywgJnJlcXVlc3QtPmRhdGFbMF0sCisJCQkJc2VuZF9zaXplKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2JfdHR5LT53cml0ZV9sb2NrLCBmbGFncyk7CisKKwkJdHR5X3BvcnRfdHR5X3dha2V1cCgmZ2JfdHR5LT5wb3J0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9saW5lX2NvZGluZyhzdHJ1Y3QgZ2JfdHR5ICp0dHkpCit7CisJc3RydWN0IGdiX3VhcnRfc2V0X2xpbmVfY29kaW5nX3JlcXVlc3QgcmVxdWVzdDsKKworCW1lbWNweSgmcmVxdWVzdCwgJnR0eS0+bGluZV9jb2RpbmcsCisJICAgICAgIHNpemVvZih0dHktPmxpbmVfY29kaW5nKSk7CisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jKHR0eS0+Y29ubmVjdGlvbiwgR0JfVUFSVF9UWVBFX1NFVF9MSU5FX0NPRElORywKKwkJCQkgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9jb250cm9sKHN0cnVjdCBnYl90dHkgKmdiX3R0eSwgdTggY29udHJvbCkKK3sKKwlzdHJ1Y3QgZ2JfdWFydF9zZXRfY29udHJvbF9saW5lX3N0YXRlX3JlcXVlc3QgcmVxdWVzdDsKKworCXJlcXVlc3QuY29udHJvbCA9IGNvbnRyb2w7CisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jKGdiX3R0eS0+Y29ubmVjdGlvbiwKKwkJCQkgR0JfVUFSVF9UWVBFX1NFVF9DT05UUk9MX0xJTkVfU1RBVEUsCisJCQkJICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworfQorCitzdGF0aWMgaW50IHNlbmRfYnJlYWsoc3RydWN0IGdiX3R0eSAqZ2JfdHR5LCB1OCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgZ2JfdWFydF9zZXRfYnJlYWtfcmVxdWVzdCByZXF1ZXN0OworCisJaWYgKChzdGF0ZSAhPSAwKSAmJiAoc3RhdGUgIT0gMSkpIHsKKwkJZGV2X2VycigmZ2JfdHR5LT5nYnBoeV9kZXYtPmRldiwKKwkJCSJpbnZhbGlkIGJyZWFrIHN0YXRlIG9mICVkXG4iLCBzdGF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcXVlc3Quc3RhdGUgPSBzdGF0ZTsKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmMoZ2JfdHR5LT5jb25uZWN0aW9uLCBHQl9VQVJUX1RZUEVfU0VORF9CUkVBSywKKwkJCQkgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfdWFydF93YWl0X2Zvcl9hbGxfY3JlZGl0cyhzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkpCit7CisJaW50IHJldDsKKworCWlmIChnYl90dHktPmNyZWRpdHMgPT0gR0JfVUFSVF9GSVJNV0FSRV9DUkVESVRTKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZ2JfdHR5LT5jcmVkaXRzX2NvbXBsZXRlLAorCQkJbXNlY3NfdG9famlmZmllcyhHQl9VQVJUX0NSRURJVF9XQUlUX1RJTUVPVVRfTVNFQykpOworCWlmICghcmV0KSB7CisJCWRldl9lcnIoJmdiX3R0eS0+Z2JwaHlfZGV2LT5kZXYsCisJCQkidGltZSBvdXQgd2FpdGluZyBmb3IgY3JlZGl0c1xuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX3VhcnRfZmx1c2goc3RydWN0IGdiX3R0eSAqZ2JfdHR5LCB1OCBmbGFncykKK3sKKwlzdHJ1Y3QgZ2JfdWFydF9zZXJpYWxfZmx1c2hfcmVxdWVzdCByZXF1ZXN0OworCisJcmVxdWVzdC5mbGFncyA9IGZsYWdzOworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhnYl90dHktPmNvbm5lY3Rpb24sIEdCX1VBUlRfVFlQRV9GTFVTSF9GSUZPUywKKwkJCQkgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2JfdHR5ICpnZXRfZ2JfYnlfbWlub3IodW5zaWduZWQgaW50IG1pbm9yKQoreworCXN0cnVjdCBnYl90dHkgKmdiX3R0eTsKKworCW11dGV4X2xvY2soJnRhYmxlX2xvY2spOworCWdiX3R0eSA9IGlkcl9maW5kKCZ0dHlfbWlub3JzLCBtaW5vcik7CisJaWYgKGdiX3R0eSkgeworCQltdXRleF9sb2NrKCZnYl90dHktPm11dGV4KTsKKwkJaWYgKGdiX3R0eS0+ZGlzY29ubmVjdGVkKSB7CisJCQltdXRleF91bmxvY2soJmdiX3R0eS0+bXV0ZXgpOworCQkJZ2JfdHR5ID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCXR0eV9wb3J0X2dldCgmZ2JfdHR5LT5wb3J0KTsKKwkJCW11dGV4X3VubG9jaygmZ2JfdHR5LT5tdXRleCk7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZ0YWJsZV9sb2NrKTsKKwlyZXR1cm4gZ2JfdHR5OworfQorCitzdGF0aWMgaW50IGFsbG9jX21pbm9yKHN0cnVjdCBnYl90dHkgKmdiX3R0eSkKK3sKKwlpbnQgbWlub3I7CisKKwltdXRleF9sb2NrKCZ0YWJsZV9sb2NrKTsKKwltaW5vciA9IGlkcl9hbGxvYygmdHR5X21pbm9ycywgZ2JfdHR5LCAwLCBHQl9OVU1fTUlOT1JTLCBHRlBfS0VSTkVMKTsKKwltdXRleF91bmxvY2soJnRhYmxlX2xvY2spOworCWlmIChtaW5vciA+PSAwKQorCQlnYl90dHktPm1pbm9yID0gbWlub3I7CisJcmV0dXJuIG1pbm9yOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX21pbm9yKHN0cnVjdCBnYl90dHkgKmdiX3R0eSkKK3sKKwlpbnQgbWlub3IgPSBnYl90dHktPm1pbm9yOworCisJZ2JfdHR5LT5taW5vciA9IDA7CS8qIE1heWJlIHNob3VsZCB1c2UgYW4gaW52YWxpZCB2YWx1ZSBpbnN0ZWFkICovCisJbXV0ZXhfbG9jaygmdGFibGVfbG9jayk7CisJaWRyX3JlbW92ZSgmdHR5X21pbm9ycywgbWlub3IpOworCW11dGV4X3VubG9jaygmdGFibGVfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfdHR5X2luc3RhbGwoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHk7CisJaW50IHJldHZhbDsKKworCWdiX3R0eSA9IGdldF9nYl9ieV9taW5vcih0dHktPmluZGV4KTsKKwlpZiAoIWdiX3R0eSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR2YWwgPSB0dHlfc3RhbmRhcmRfaW5zdGFsbChkcml2ZXIsIHR0eSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcjsKKworCXR0eS0+ZHJpdmVyX2RhdGEgPSBnYl90dHk7CisJcmV0dXJuIDA7CitlcnJvcjoKKwl0dHlfcG9ydF9wdXQoJmdiX3R0eS0+cG9ydCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBnYl90dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkgPSB0dHktPmRyaXZlcl9kYXRhOworCisJcmV0dXJuIHR0eV9wb3J0X29wZW4oJmdiX3R0eS0+cG9ydCwgdHR5LCBmaWxlKTsKK30KKworc3RhdGljIHZvaWQgZ2JfdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBnYl90dHkgKmdiX3R0eSA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwl0dHlfcG9ydF9jbG9zZSgmZ2JfdHR5LT5wb3J0LCB0dHksIGZpbGUpOworfQorCitzdGF0aWMgdm9pZCBnYl90dHlfY2xlYW51cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBnYl90dHkgKmdiX3R0eSA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwl0dHlfcG9ydF9wdXQoJmdiX3R0eS0+cG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3R0eV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkgPSB0dHktPmRyaXZlcl9kYXRhOworCisJdHR5X3BvcnRfaGFuZ3VwKCZnYl90dHktPnBvcnQpOworfQorCitzdGF0aWMgaW50IGdiX3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQlpbnQgY291bnQpCit7CisJc3RydWN0IGdiX3R0eSAqZ2JfdHR5ID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCWNvdW50ID0gIGtmaWZvX2luX3NwaW5sb2NrZWQoJmdiX3R0eS0+d3JpdGVfZmlmbywgYnVmLCBjb3VudCwKKwkJCQkgICAgICZnYl90dHktPndyaXRlX2xvY2spOworCWlmIChjb3VudCAmJiAhZ2JfdHR5LT5jbG9zZV9wZW5kaW5nKQorCQlzY2hlZHVsZV93b3JrKCZnYl90dHktPnR4X3dvcmspOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGdiX3R0eV93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGdiX3R0eSAqZ2JfdHR5ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByb29tOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdiX3R0eS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCXJvb20gPSBrZmlmb19hdmFpbCgmZ2JfdHR5LT53cml0ZV9maWZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYl90dHktPndyaXRlX2xvY2ssIGZsYWdzKTsKKworCXJvb20gLT0gR0JfVUFSVF9XUklURV9ST09NX01BUkdJTjsKKwlpZiAocm9vbSA8IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIHJvb207Cit9CisKK3N0YXRpYyBpbnQgZ2JfdHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBnYl90dHkgKmdiX3R0eSA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY2hhcnM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ2JfdHR5LT53cml0ZV9sb2NrLCBmbGFncyk7CisJY2hhcnMgPSBrZmlmb19sZW4oJmdiX3R0eS0+d3JpdGVfZmlmbyk7CisJaWYgKGdiX3R0eS0+Y3JlZGl0cyA8IEdCX1VBUlRfRklSTVdBUkVfQ1JFRElUUykKKwkJY2hhcnMgKz0gR0JfVUFSVF9GSVJNV0FSRV9DUkVESVRTIC0gZ2JfdHR5LT5jcmVkaXRzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdiX3R0eS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGNoYXJzOworfQorCitzdGF0aWMgaW50IGdiX3R0eV9icmVha19jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHN0YXRlKQoreworCXN0cnVjdCBnYl90dHkgKmdiX3R0eSA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlyZXR1cm4gc2VuZF9icmVhayhnYl90dHksIHN0YXRlID8gMSA6IDApOworfQorCitzdGF0aWMgdm9pZCBnYl90dHlfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCSAgICAgICBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3Nfb2xkKQoreworCXN0cnVjdCBnYl90dHkgKmdiX3R0eSA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zID0gJnR0eS0+dGVybWlvczsKKwlzdHJ1Y3QgZ2JfdHR5X2xpbmVfY29kaW5nIG5ld2xpbmU7CisJdTggbmV3Y3RybCA9IGdiX3R0eS0+Y3RybG91dDsKKworCW5ld2xpbmUucmF0ZSA9IGNwdV90b19sZTMyKHR0eV9nZXRfYmF1ZF9yYXRlKHR0eSkpOworCW5ld2xpbmUuZm9ybWF0ID0gdGVybWlvcy0+Y19jZmxhZyAmIENTVE9QQiA/CisJCQkJR0JfU0VSSUFMXzJfU1RPUF9CSVRTIDogR0JfU0VSSUFMXzFfU1RPUF9CSVRTOworCW5ld2xpbmUucGFyaXR5ID0gdGVybWlvcy0+Y19jZmxhZyAmIFBBUkVOQiA/CisJCQkJKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJPREQgPyAxIDogMikgKworCQkJCSh0ZXJtaW9zLT5jX2NmbGFnICYgQ01TUEFSID8gMiA6IDApIDogMDsKKworCXN3aXRjaCAodGVybWlvcy0+Y19jZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzU6CisJCW5ld2xpbmUuZGF0YV9iaXRzID0gNTsKKwkJYnJlYWs7CisJY2FzZSBDUzY6CisJCW5ld2xpbmUuZGF0YV9iaXRzID0gNjsKKwkJYnJlYWs7CisJY2FzZSBDUzc6CisJCW5ld2xpbmUuZGF0YV9iaXRzID0gNzsKKwkJYnJlYWs7CisJY2FzZSBDUzg6CisJZGVmYXVsdDoKKwkJbmV3bGluZS5kYXRhX2JpdHMgPSA4OworCQlicmVhazsKKwl9CisKKwkvKiBGSVhNRTogbmVlZHMgdG8gY2xlYXIgdW5zdXBwb3J0ZWQgYml0cyBpbiB0aGUgdGVybWlvcyAqLworCWdiX3R0eS0+Y2xvY2FsID0gKCh0ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSAhPSAwKTsKKworCWlmIChDX0JBVUQodHR5KSA9PSBCMCkgeworCQluZXdsaW5lLnJhdGUgPSBnYl90dHktPmxpbmVfY29kaW5nLnJhdGU7CisJCW5ld2N0cmwgJj0gfihHQl9VQVJUX0NUUkxfRFRSIHwgR0JfVUFSVF9DVFJMX1JUUyk7CisJfSBlbHNlIGlmICh0ZXJtaW9zX29sZCAmJiAodGVybWlvc19vbGQtPmNfY2ZsYWcgJiBDQkFVRCkgPT0gQjApIHsKKwkJbmV3Y3RybCB8PSAoR0JfVUFSVF9DVFJMX0RUUiB8IEdCX1VBUlRfQ1RSTF9SVFMpOworCX0KKworCWlmIChuZXdjdHJsICE9IGdiX3R0eS0+Y3RybG91dCkgeworCQlnYl90dHktPmN0cmxvdXQgPSBuZXdjdHJsOworCQlzZW5kX2NvbnRyb2woZ2JfdHR5LCBuZXdjdHJsKTsKKwl9CisKKwlpZiAoQ19DUlRTQ1RTKHR0eSkgJiYgQ19CQVVEKHR0eSkgIT0gQjApCisJCW5ld2xpbmUuZmxvd19jb250cm9sIHw9IEdCX1NFUklBTF9BVVRPX1JUU0NUU19FTjsKKwllbHNlCisJCW5ld2xpbmUuZmxvd19jb250cm9sICY9IH5HQl9TRVJJQUxfQVVUT19SVFNDVFNfRU47CisKKwlpZiAobWVtY21wKCZnYl90dHktPmxpbmVfY29kaW5nLCAmbmV3bGluZSwgc2l6ZW9mKG5ld2xpbmUpKSkgeworCQltZW1jcHkoJmdiX3R0eS0+bGluZV9jb2RpbmcsICZuZXdsaW5lLCBzaXplb2YobmV3bGluZSkpOworCQlzZW5kX2xpbmVfY29kaW5nKGdiX3R0eSk7CisJfQorfQorCitzdGF0aWMgaW50IGdiX3R0eV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBnYl90dHkgKmdiX3R0eSA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlyZXR1cm4gKGdiX3R0eS0+Y3RybG91dCAmIEdCX1VBUlRfQ1RSTF9EVFIgPyBUSU9DTV9EVFIgOiAwKSB8CisJICAgICAgIChnYl90dHktPmN0cmxvdXQgJiBHQl9VQVJUX0NUUkxfUlRTID8gVElPQ01fUlRTIDogMCkgfAorCSAgICAgICAoZ2JfdHR5LT5jdHJsaW4gICYgR0JfVUFSVF9DVFJMX0RTUiA/IFRJT0NNX0RTUiA6IDApIHwKKwkgICAgICAgKGdiX3R0eS0+Y3RybGluICAmIEdCX1VBUlRfQ1RSTF9SSSAgPyBUSU9DTV9SSSAgOiAwKSB8CisJICAgICAgIChnYl90dHktPmN0cmxpbiAgJiBHQl9VQVJUX0NUUkxfRENEID8gVElPQ01fQ0QgIDogMCkgfAorCSAgICAgICBUSU9DTV9DVFM7Cit9CisKK3N0YXRpYyBpbnQgZ2JfdHR5X3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBzZXQsCisJCQkgICB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJc3RydWN0IGdiX3R0eSAqZ2JfdHR5ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1OCBuZXdjdHJsID0gZ2JfdHR5LT5jdHJsb3V0OworCisJc2V0ID0gKHNldCAmIFRJT0NNX0RUUiA/IEdCX1VBUlRfQ1RSTF9EVFIgOiAwKSB8CisJICAgICAgKHNldCAmIFRJT0NNX1JUUyA/IEdCX1VBUlRfQ1RSTF9SVFMgOiAwKTsKKwljbGVhciA9IChjbGVhciAmIFRJT0NNX0RUUiA/IEdCX1VBUlRfQ1RSTF9EVFIgOiAwKSB8CisJCShjbGVhciAmIFRJT0NNX1JUUyA/IEdCX1VBUlRfQ1RSTF9SVFMgOiAwKTsKKworCW5ld2N0cmwgPSAobmV3Y3RybCAmIH5jbGVhcikgfCBzZXQ7CisJaWYgKGdiX3R0eS0+Y3RybG91dCA9PSBuZXdjdHJsKQorCQlyZXR1cm4gMDsKKworCWdiX3R0eS0+Y3RybG91dCA9IG5ld2N0cmw7CisJcmV0dXJuIHNlbmRfY29udHJvbChnYl90dHksIG5ld2N0cmwpOworfQorCitzdGF0aWMgdm9pZCBnYl90dHlfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkgPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGNoYXIgc3RvcF9jaGFyOworCWludCByZXR2YWw7CisKKwlpZiAoSV9JWE9GRih0dHkpKSB7CisJCXN0b3BfY2hhciA9IFNUT1BfQ0hBUih0dHkpOworCQlyZXR2YWwgPSBnYl90dHlfd3JpdGUodHR5LCAmc3RvcF9jaGFyLCAxKTsKKwkJaWYgKHJldHZhbCA8PSAwKQorCQkJcmV0dXJuOworCX0KKworCWlmICh0dHktPnRlcm1pb3MuY19jZmxhZyAmIENSVFNDVFMpIHsKKwkJZ2JfdHR5LT5jdHJsb3V0ICY9IH5HQl9VQVJUX0NUUkxfUlRTOworCQlyZXR2YWwgPSBzZW5kX2NvbnRyb2woZ2JfdHR5LCBnYl90dHktPmN0cmxvdXQpOworCX0KK30KKworc3RhdGljIHZvaWQgZ2JfdHR5X3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkgPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGNoYXIgc3RhcnRfY2hhcjsKKwlpbnQgcmV0dmFsOworCisJaWYgKElfSVhPRkYodHR5KSkgeworCQlzdGFydF9jaGFyID0gU1RBUlRfQ0hBUih0dHkpOworCQlyZXR2YWwgPSBnYl90dHlfd3JpdGUodHR5LCAmc3RhcnRfY2hhciwgMSk7CisJCWlmIChyZXR2YWwgPD0gMCkKKwkJCXJldHVybjsKKwl9CisKKwlpZiAodHR5LT50ZXJtaW9zLmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCWdiX3R0eS0+Y3RybG91dCB8PSBHQl9VQVJUX0NUUkxfUlRTOworCQlyZXR2YWwgPSBzZW5kX2NvbnRyb2woZ2JfdHR5LCBnYl90dHktPmN0cmxvdXQpOworCX0KK30KKworc3RhdGljIGludCBnZXRfc2VyaWFsX2luZm8oc3RydWN0IGdiX3R0eSAqZ2JfdHR5LAorCQkJICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICppbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKKworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCXRtcC5mbGFncyA9IEFTWU5DX0xPV19MQVRFTkNZIHwgQVNZTkNfU0tJUF9URVNUOworCXRtcC50eXBlID0gUE9SVF8xNjU1MEE7CisJdG1wLmxpbmUgPSBnYl90dHktPm1pbm9yOworCXRtcC54bWl0X2ZpZm9fc2l6ZSA9IDE2OworCXRtcC5iYXVkX2Jhc2UgPSA5NjAwOworCXRtcC5jbG9zZV9kZWxheSA9IGdiX3R0eS0+cG9ydC5jbG9zZV9kZWxheSAvIDEwOworCXRtcC5jbG9zaW5nX3dhaXQgPSBnYl90dHktPnBvcnQuY2xvc2luZ193YWl0ID09IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FID8KKwkJCQlBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSA6IGdiX3R0eS0+cG9ydC5jbG9zaW5nX3dhaXQgLyAxMDsKKworCWlmIChjb3B5X3RvX3VzZXIoaW5mbywgJnRtcCwgc2l6ZW9mKHRtcCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfc2VyaWFsX2luZm8oc3RydWN0IGdiX3R0eSAqZ2JfdHR5LAorCQkJICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpuZXdpbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7CisJdW5zaWduZWQgaW50IGNsb3Npbmdfd2FpdDsKKwl1bnNpZ25lZCBpbnQgY2xvc2VfZGVsYXk7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsIG5ld2luZm8sIHNpemVvZihuZXdfc2VyaWFsKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJY2xvc2VfZGVsYXkgPSBuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICogMTA7CisJY2xvc2luZ193YWl0ID0gbmV3X3NlcmlhbC5jbG9zaW5nX3dhaXQgPT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUgPworCQkJQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUgOiBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdCAqIDEwOworCisJbXV0ZXhfbG9jaygmZ2JfdHR5LT5wb3J0Lm11dGV4KTsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJaWYgKChjbG9zZV9kZWxheSAhPSBnYl90dHktPnBvcnQuY2xvc2VfZGVsYXkpIHx8CisJCSAgICAoY2xvc2luZ193YWl0ICE9IGdiX3R0eS0+cG9ydC5jbG9zaW5nX3dhaXQpKQorCQkJcmV0dmFsID0gLUVQRVJNOworCQllbHNlCisJCQlyZXR2YWwgPSAtRU9QTk9UU1VQUDsKKwl9IGVsc2UgeworCQlnYl90dHktPnBvcnQuY2xvc2VfZGVsYXkgPSBjbG9zZV9kZWxheTsKKwkJZ2JfdHR5LT5wb3J0LmNsb3Npbmdfd2FpdCA9IGNsb3Npbmdfd2FpdDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZnYl90dHktPnBvcnQubXV0ZXgpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9zZXJpYWxfY2hhbmdlKHN0cnVjdCBnYl90dHkgKmdiX3R0eSwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldHZhbCA9IDA7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3RydWN0IGFzeW5jX2ljb3VudCBvbGQ7CisJc3RydWN0IGFzeW5jX2ljb3VudCBuZXc7CisKKwlpZiAoIShhcmcgJiAoVElPQ01fRFNSIHwgVElPQ01fUkkgfCBUSU9DTV9DRCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvIHsKKwkJc3Bpbl9sb2NrX2lycSgmZ2JfdHR5LT5yZWFkX2xvY2spOworCQlvbGQgPSBnYl90dHktPm9sZGNvdW50OworCQluZXcgPSBnYl90dHktPmlvY291bnQ7CisJCWdiX3R0eS0+b2xkY291bnQgPSBuZXc7CisJCXNwaW5fdW5sb2NrX2lycSgmZ2JfdHR5LT5yZWFkX2xvY2spOworCisJCWlmICgoYXJnICYgVElPQ01fRFNSKSAmJiAob2xkLmRzciAhPSBuZXcuZHNyKSkKKwkJCWJyZWFrOworCQlpZiAoKGFyZyAmIFRJT0NNX0NEKSAmJiAob2xkLmRjZCAhPSBuZXcuZGNkKSkKKwkJCWJyZWFrOworCQlpZiAoKGFyZyAmIFRJT0NNX1JJKSAmJiAob2xkLnJuZyAhPSBuZXcucm5nKSkKKwkJCWJyZWFrOworCisJCWFkZF93YWl0X3F1ZXVlKCZnYl90dHktPndpb2N0bCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZSgpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmZ2JfdHR5LT53aW9jdGwsICZ3YWl0KTsKKwkJaWYgKGdiX3R0eS0+ZGlzY29ubmVjdGVkKSB7CisJCQlpZiAoYXJnICYgVElPQ01fQ0QpCisJCQkJYnJlYWs7CisJCQlyZXR2YWwgPSAtRU5PREVWOworCQl9IGVsc2UgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCX0KKwl9IHdoaWxlICghcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NlcmlhbF91c2FnZShzdHJ1Y3QgZ2JfdHR5ICpnYl90dHksCisJCQkgICAgc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgX191c2VyICpjb3VudCkKK3sKKwlzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBpY291bnQ7CisJaW50IHJldHZhbCA9IDA7CisKKwltZW1zZXQoJmljb3VudCwgMCwgc2l6ZW9mKGljb3VudCkpOworCWljb3VudC5kc3IgPSBnYl90dHktPmlvY291bnQuZHNyOworCWljb3VudC5ybmcgPSBnYl90dHktPmlvY291bnQucm5nOworCWljb3VudC5kY2QgPSBnYl90dHktPmlvY291bnQuZGNkOworCWljb3VudC5mcmFtZSA9IGdiX3R0eS0+aW9jb3VudC5mcmFtZTsKKwlpY291bnQub3ZlcnJ1biA9IGdiX3R0eS0+aW9jb3VudC5vdmVycnVuOworCWljb3VudC5wYXJpdHkgPSBnYl90dHktPmlvY291bnQucGFyaXR5OworCWljb3VudC5icmsgPSBnYl90dHktPmlvY291bnQuYnJrOworCisJaWYgKGNvcHlfdG9fdXNlcihjb3VudCwgJmljb3VudCwgc2l6ZW9mKGljb3VudCkpID4gMCkKKwkJcmV0dmFsID0gLUVGQVVMVDsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZ2JfdHR5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkgPSB0dHktPmRyaXZlcl9kYXRhOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJT0NHU0VSSUFMOgorCQlyZXR1cm4gZ2V0X3NlcmlhbF9pbmZvKGdiX3R0eSwKKwkJCQkgICAgICAgKHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKWFyZyk7CisJY2FzZSBUSU9DU1NFUklBTDoKKwkJcmV0dXJuIHNldF9zZXJpYWxfaW5mbyhnYl90dHksCisJCQkJICAgICAgIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKilhcmcpOworCWNhc2UgVElPQ01JV0FJVDoKKwkJcmV0dXJuIHdhaXRfc2VyaWFsX2NoYW5nZShnYl90dHksIGFyZyk7CisJY2FzZSBUSU9DR0lDT1VOVDoKKwkJcmV0dXJuIGdldF9zZXJpYWxfdXNhZ2UoZ2JfdHR5LAorCQkJCQkoc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgX191c2VyICopYXJnKTsKKwl9CisKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorCitzdGF0aWMgdm9pZCBnYl90dHlfZHRyX3J0cyhzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIGludCBvbikKK3sKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHk7CisJdTggbmV3Y3RybDsKKworCWdiX3R0eSA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgZ2JfdHR5LCBwb3J0KTsKKwluZXdjdHJsID0gZ2JfdHR5LT5jdHJsb3V0OworCisJaWYgKG9uKQorCQluZXdjdHJsIHw9IChHQl9VQVJUX0NUUkxfRFRSIHwgR0JfVUFSVF9DVFJMX1JUUyk7CisJZWxzZQorCQluZXdjdHJsICY9IH4oR0JfVUFSVF9DVFJMX0RUUiB8IEdCX1VBUlRfQ1RSTF9SVFMpOworCisJZ2JfdHR5LT5jdHJsb3V0ID0gbmV3Y3RybDsKKwlzZW5kX2NvbnRyb2woZ2JfdHR5LCBuZXdjdHJsKTsKK30KKworc3RhdGljIGludCBnYl90dHlfcG9ydF9hY3RpdmF0ZShzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsCisJCQkJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHk7CisKKwlnYl90dHkgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IGdiX3R0eSwgcG9ydCk7CisKKwlyZXR1cm4gZ2JwaHlfcnVudGltZV9nZXRfc3luYyhnYl90dHktPmdicGh5X2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3R0eV9wb3J0X3NodXRkb3duKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJZ2JfdHR5ID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBnYl90dHksIHBvcnQpOworCisJZ2JfdHR5LT5jbG9zZV9wZW5kaW5nID0gdHJ1ZTsKKworCWNhbmNlbF93b3JrX3N5bmMoJmdiX3R0eS0+dHhfd29yayk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ2JfdHR5LT53cml0ZV9sb2NrLCBmbGFncyk7CisJa2ZpZm9fcmVzZXRfb3V0KCZnYl90dHktPndyaXRlX2ZpZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdiX3R0eS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCisJaWYgKGdiX3R0eS0+Y3JlZGl0cyA9PSBHQl9VQVJUX0ZJUk1XQVJFX0NSRURJVFMpCisJCWdvdG8gb3V0OworCisJcmV0ID0gZ2JfdWFydF9mbHVzaChnYl90dHksIEdCX1NFUklBTF9GTEFHX0ZMVVNIX1RSQU5TTUlUVEVSKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmdiX3R0eS0+Z2JwaHlfZGV2LT5kZXYsCisJCQkiZXJyb3IgZmx1c2hpbmcgdHJhbnNtaXR0ZXI6ICVkXG4iLCByZXQpOworCX0KKworCWdiX3VhcnRfd2FpdF9mb3JfYWxsX2NyZWRpdHMoZ2JfdHR5KTsKKworb3V0OgorCWdiX3R0eS0+Y2xvc2VfcGVuZGluZyA9IGZhbHNlOworCisJZ2JwaHlfcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ2JfdHR5LT5nYnBoeV9kZXYpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9vcGVyYXRpb25zIGdiX29wcyA9IHsKKwkuaW5zdGFsbCA9CQlnYl90dHlfaW5zdGFsbCwKKwkub3BlbiA9CQkJZ2JfdHR5X29wZW4sCisJLmNsb3NlID0JCWdiX3R0eV9jbG9zZSwKKwkuY2xlYW51cCA9CQlnYl90dHlfY2xlYW51cCwKKwkuaGFuZ3VwID0JCWdiX3R0eV9oYW5ndXAsCisJLndyaXRlID0JCWdiX3R0eV93cml0ZSwKKwkud3JpdGVfcm9vbSA9CQlnYl90dHlfd3JpdGVfcm9vbSwKKwkuaW9jdGwgPQkJZ2JfdHR5X2lvY3RsLAorCS50aHJvdHRsZSA9CQlnYl90dHlfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPQkJZ2JfdHR5X3VudGhyb3R0bGUsCisJLmNoYXJzX2luX2J1ZmZlciA9CWdiX3R0eV9jaGFyc19pbl9idWZmZXIsCisJLmJyZWFrX2N0bCA9CQlnYl90dHlfYnJlYWtfY3RsLAorCS5zZXRfdGVybWlvcyA9CQlnYl90dHlfc2V0X3Rlcm1pb3MsCisJLnRpb2NtZ2V0ID0JCWdiX3R0eV90aW9jbWdldCwKKwkudGlvY21zZXQgPQkJZ2JfdHR5X3Rpb2Ntc2V0LAorfTsKKworc3RhdGljIHN0cnVjdCB0dHlfcG9ydF9vcGVyYXRpb25zIGdiX3BvcnRfb3BzID0geworCS5kdHJfcnRzID0JCWdiX3R0eV9kdHJfcnRzLAorCS5hY3RpdmF0ZSA9CQlnYl90dHlfcG9ydF9hY3RpdmF0ZSwKKwkuc2h1dGRvd24gPQkJZ2JfdHR5X3BvcnRfc2h1dGRvd24sCit9OworCitzdGF0aWMgaW50IGdiX3VhcnRfcHJvYmUoc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2LAorCQkJIGNvbnN0IHN0cnVjdCBnYnBoeV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCXNpemVfdCBtYXhfcGF5bG9hZDsKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHk7CisJc3RydWN0IGRldmljZSAqdHR5X2RldjsKKwlpbnQgcmV0dmFsOworCWludCBtaW5vcjsKKworCWdiX3R0eSA9IGt6YWxsb2Moc2l6ZW9mKCpnYl90dHkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdiX3R0eSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGUoZ2JwaHlfZGV2LT5idW5kbGUsCisJCQkJCSAgbGUxNl90b19jcHUoZ2JwaHlfZGV2LT5jcG9ydF9kZXNjLT5pZCksCisJCQkJCSAgZ2JfdWFydF9yZXF1ZXN0X2hhbmRsZXIpOworCWlmIChJU19FUlIoY29ubmVjdGlvbikpIHsKKwkJcmV0dmFsID0gUFRSX0VSUihjb25uZWN0aW9uKTsKKwkJZ290byBleGl0X3R0eV9mcmVlOworCX0KKworCW1heF9wYXlsb2FkID0gZ2Jfb3BlcmF0aW9uX2dldF9wYXlsb2FkX3NpemVfbWF4KGNvbm5lY3Rpb24pOworCWlmIChtYXhfcGF5bG9hZCA8IHNpemVvZihzdHJ1Y3QgZ2JfdWFydF9zZW5kX2RhdGFfcmVxdWVzdCkpIHsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBleGl0X2Nvbm5lY3Rpb25fZGVzdHJveTsKKwl9CisKKwlnYl90dHktPmJ1ZmZlcl9wYXlsb2FkX21heCA9IG1heF9wYXlsb2FkIC0KKwkJCXNpemVvZihzdHJ1Y3QgZ2JfdWFydF9zZW5kX2RhdGFfcmVxdWVzdCk7CisKKwlnYl90dHktPmJ1ZmZlciA9IGt6YWxsb2MoZ2JfdHR5LT5idWZmZXJfcGF5bG9hZF9tYXgsIEdGUF9LRVJORUwpOworCWlmICghZ2JfdHR5LT5idWZmZXIpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBleGl0X2Nvbm5lY3Rpb25fZGVzdHJveTsKKwl9CisKKwlJTklUX1dPUksoJmdiX3R0eS0+dHhfd29yaywgZ2JfdWFydF90eF93cml0ZV93b3JrKTsKKworCXJldHZhbCA9IGtmaWZvX2FsbG9jKCZnYl90dHktPndyaXRlX2ZpZm8sIEdCX1VBUlRfV1JJVEVfRklGT19TSVpFLAorCQkJICAgICBHRlBfS0VSTkVMKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGV4aXRfYnVmX2ZyZWU7CisKKwlnYl90dHktPmNyZWRpdHMgPSBHQl9VQVJUX0ZJUk1XQVJFX0NSRURJVFM7CisJaW5pdF9jb21wbGV0aW9uKCZnYl90dHktPmNyZWRpdHNfY29tcGxldGUpOworCisJbWlub3IgPSBhbGxvY19taW5vcihnYl90dHkpOworCWlmIChtaW5vciA8IDApIHsKKwkJaWYgKG1pbm9yID09IC1FTk9TUEMpIHsKKwkJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJCSJubyBtb3JlIGZyZWUgbWlub3IgbnVtYmVyc1xuIik7CisJCQlyZXR2YWwgPSAtRU5PREVWOworCQl9IGVsc2UgeworCQkJcmV0dmFsID0gbWlub3I7CisJCX0KKwkJZ290byBleGl0X2tmaWZvX2ZyZWU7CisJfQorCisJZ2JfdHR5LT5taW5vciA9IG1pbm9yOworCXNwaW5fbG9ja19pbml0KCZnYl90dHktPndyaXRlX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZnYl90dHktPnJlYWRfbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZ2JfdHR5LT53aW9jdGwpOworCW11dGV4X2luaXQoJmdiX3R0eS0+bXV0ZXgpOworCisJdHR5X3BvcnRfaW5pdCgmZ2JfdHR5LT5wb3J0KTsKKwlnYl90dHktPnBvcnQub3BzID0gJmdiX3BvcnRfb3BzOworCisJZ2JfdHR5LT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKwlnYl90dHktPmdicGh5X2RldiA9IGdicGh5X2RldjsKKwlnYl9jb25uZWN0aW9uX3NldF9kYXRhKGNvbm5lY3Rpb24sIGdiX3R0eSk7CisJZ2JfZ2JwaHlfc2V0X2RhdGEoZ2JwaHlfZGV2LCBnYl90dHkpOworCisJcmV0dmFsID0gZ2JfY29ubmVjdGlvbl9lbmFibGVfdHgoY29ubmVjdGlvbik7CisJaWYgKHJldHZhbCkKKwkJZ290byBleGl0X3JlbGVhc2VfbWlub3I7CisKKwlzZW5kX2NvbnRyb2woZ2JfdHR5LCBnYl90dHktPmN0cmxvdXQpOworCisJLyogaW5pdGlhbGl6ZSB0aGUgdWFydCB0byBiZSA5NjAwbjgxICovCisJZ2JfdHR5LT5saW5lX2NvZGluZy5yYXRlID0gY3B1X3RvX2xlMzIoOTYwMCk7CisJZ2JfdHR5LT5saW5lX2NvZGluZy5mb3JtYXQgPSBHQl9TRVJJQUxfMV9TVE9QX0JJVFM7CisJZ2JfdHR5LT5saW5lX2NvZGluZy5wYXJpdHkgPSBHQl9TRVJJQUxfTk9fUEFSSVRZOworCWdiX3R0eS0+bGluZV9jb2RpbmcuZGF0YV9iaXRzID0gODsKKwlzZW5kX2xpbmVfY29kaW5nKGdiX3R0eSk7CisKKwlyZXR2YWwgPSBnYl9jb25uZWN0aW9uX2VuYWJsZShjb25uZWN0aW9uKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGV4aXRfY29ubmVjdGlvbl9kaXNhYmxlOworCisJdHR5X2RldiA9IHR0eV9wb3J0X3JlZ2lzdGVyX2RldmljZSgmZ2JfdHR5LT5wb3J0LCBnYl90dHlfZHJpdmVyLCBtaW5vciwKKwkJCQkJICAgJmdicGh5X2Rldi0+ZGV2KTsKKwlpZiAoSVNfRVJSKHR0eV9kZXYpKSB7CisJCXJldHZhbCA9IFBUUl9FUlIodHR5X2Rldik7CisJCWdvdG8gZXhpdF9jb25uZWN0aW9uX2Rpc2FibGU7CisJfQorCisJZ2JwaHlfcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ2JwaHlfZGV2KTsKKwlyZXR1cm4gMDsKKworZXhpdF9jb25uZWN0aW9uX2Rpc2FibGU6CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworZXhpdF9yZWxlYXNlX21pbm9yOgorCXJlbGVhc2VfbWlub3IoZ2JfdHR5KTsKK2V4aXRfa2ZpZm9fZnJlZToKKwlrZmlmb19mcmVlKCZnYl90dHktPndyaXRlX2ZpZm8pOworZXhpdF9idWZfZnJlZToKKwlrZnJlZShnYl90dHktPmJ1ZmZlcik7CitleGl0X2Nvbm5lY3Rpb25fZGVzdHJveToKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7CitleGl0X3R0eV9mcmVlOgorCWtmcmVlKGdiX3R0eSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBnYl91YXJ0X3JlbW92ZShzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYpCit7CisJc3RydWN0IGdiX3R0eSAqZ2JfdHR5ID0gZ2JfZ2JwaHlfZ2V0X2RhdGEoZ2JwaHlfZGV2KTsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdiX3R0eS0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWludCByZXQ7CisKKwlyZXQgPSBnYnBoeV9ydW50aW1lX2dldF9zeW5jKGdicGh5X2Rldik7CisJaWYgKHJldCkKKwkJZ2JwaHlfcnVudGltZV9nZXRfbm9yZXN1bWUoZ2JwaHlfZGV2KTsKKworCW11dGV4X2xvY2soJmdiX3R0eS0+bXV0ZXgpOworCWdiX3R0eS0+ZGlzY29ubmVjdGVkID0gdHJ1ZTsKKworCXdha2VfdXBfYWxsKCZnYl90dHktPndpb2N0bCk7CisJbXV0ZXhfdW5sb2NrKCZnYl90dHktPm11dGV4KTsKKworCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJmdiX3R0eS0+cG9ydCk7CisJaWYgKHR0eSkgeworCQl0dHlfdmhhbmd1cCh0dHkpOworCQl0dHlfa3JlZl9wdXQodHR5KTsKKwl9CisKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGVfcngoY29ubmVjdGlvbik7CisJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKGdiX3R0eV9kcml2ZXIsIGdiX3R0eS0+bWlub3IpOworCisJLyogRklYTUUgLSBmcmVlIHRyYW5zbWl0IC8gcmVjZWl2ZSBidWZmZXJzICovCisKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7CisJdHR5X3BvcnRfZGVzdHJveSgmZ2JfdHR5LT5wb3J0KTsKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7CisJcmVsZWFzZV9taW5vcihnYl90dHkpOworCWtmaWZvX2ZyZWUoJmdiX3R0eS0+d3JpdGVfZmlmbyk7CisJa2ZyZWUoZ2JfdHR5LT5idWZmZXIpOworCWtmcmVlKGdiX3R0eSk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfdHR5X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWdiX3R0eV9kcml2ZXIgPSB0dHlfYWxsb2NfZHJpdmVyKEdCX05VTV9NSU5PUlMsIDApOworCWlmIChJU19FUlIoZ2JfdHR5X2RyaXZlcikpIHsKKwkJcHJfZXJyKCJDYW4gbm90IGFsbG9jYXRlIHR0eSBkcml2ZXJcbiIpOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfdW5yZWdpc3Rlcl9kZXY7CisJfQorCisJZ2JfdHR5X2RyaXZlci0+ZHJpdmVyX25hbWUgPSAiZ2IiOworCWdiX3R0eV9kcml2ZXItPm5hbWUgPSBHQl9OQU1FOworCWdiX3R0eV9kcml2ZXItPm1ham9yID0gMDsKKwlnYl90dHlfZHJpdmVyLT5taW5vcl9zdGFydCA9IDA7CisJZ2JfdHR5X2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJZ2JfdHR5X2RyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlnYl90dHlfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVcgfCBUVFlfRFJJVkVSX0RZTkFNSUNfREVWOworCWdiX3R0eV9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlnYl90dHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwl0dHlfc2V0X29wZXJhdGlvbnMoZ2JfdHR5X2RyaXZlciwgJmdiX29wcyk7CisKKwlyZXR2YWwgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKGdiX3R0eV9kcml2ZXIpOworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCJDYW4gbm90IHJlZ2lzdGVyIHR0eSBkcml2ZXI6ICVkXG4iLCByZXR2YWwpOworCQlnb3RvIGZhaWxfcHV0X2diX3R0eTsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbF9wdXRfZ2JfdHR5OgorCXB1dF90dHlfZHJpdmVyKGdiX3R0eV9kcml2ZXIpOworZmFpbF91bnJlZ2lzdGVyX2RldjoKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBnYl90dHlfZXhpdCh2b2lkKQoreworCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihnYl90dHlfZHJpdmVyKTsKKwlwdXRfdHR5X2RyaXZlcihnYl90dHlfZHJpdmVyKTsKKwlpZHJfZGVzdHJveSgmdHR5X21pbm9ycyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2JwaHlfZGV2aWNlX2lkIGdiX3VhcnRfaWRfdGFibGVbXSA9IHsKKwl7IEdCUEhZX1BST1RPQ09MKEdSRVlCVVNfUFJPVE9DT0xfVUFSVCkgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShnYnBoeSwgZ2JfdWFydF9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZ2JwaHlfZHJpdmVyIHVhcnRfZHJpdmVyID0geworCS5uYW1lCQk9ICJ1YXJ0IiwKKwkucHJvYmUJCT0gZ2JfdWFydF9wcm9iZSwKKwkucmVtb3ZlCQk9IGdiX3VhcnRfcmVtb3ZlLAorCS5pZF90YWJsZQk9IGdiX3VhcnRfaWRfdGFibGUsCit9OworCitzdGF0aWMgaW50IGdiX3VhcnRfZHJpdmVyX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JfdHR5X2luaXQoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2JfZ2JwaHlfcmVnaXN0ZXIoJnVhcnRfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCWdiX3R0eV9leGl0KCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChnYl91YXJ0X2RyaXZlcl9pbml0KTsKKworc3RhdGljIHZvaWQgZ2JfdWFydF9kcml2ZXJfZXhpdCh2b2lkKQoreworCWdiX2dicGh5X2RlcmVnaXN0ZXIoJnVhcnRfZHJpdmVyKTsKKwlnYl90dHlfZXhpdCgpOworfQorCittb2R1bGVfZXhpdChnYl91YXJ0X2RyaXZlcl9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhZGRhMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3VzYi5jCkBAIC0wLDAgKzEsMjQ3IEBACisvKgorICogVVNCIGhvc3QgZHJpdmVyIGZvciB0aGUgR3JleWJ1cyAiZ2VuZXJpYyIgVVNCIG1vZHVsZS4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2hjZC5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImdicGh5LmgiCisKKy8qIEdyZXlidXMgVVNCIHJlcXVlc3QgdHlwZXMgKi8KKyNkZWZpbmUgR0JfVVNCX1RZUEVfSENEX1NUQVJUCQkweDAyCisjZGVmaW5lIEdCX1VTQl9UWVBFX0hDRF9TVE9QCQkweDAzCisjZGVmaW5lIEdCX1VTQl9UWVBFX0hVQl9DT05UUk9MCQkweDA0CisKK3N0cnVjdCBnYl91c2JfaHViX2NvbnRyb2xfcmVxdWVzdCB7CisJX19sZTE2IHR5cGVSZXE7CisJX19sZTE2IHdWYWx1ZTsKKwlfX2xlMTYgd0luZGV4OworCV9fbGUxNiB3TGVuZ3RoOworfTsKKworc3RydWN0IGdiX3VzYl9odWJfY29udHJvbF9yZXNwb25zZSB7CisJdTggYnVmWzBdOworfTsKKworc3RydWN0IGdiX3VzYl9kZXZpY2UgeworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCXN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldjsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGdiX3VzYl9kZXZpY2UgKnRvX2diX3VzYl9kZXZpY2Uoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBnYl91c2JfZGV2aWNlICopaGNkLT5oY2RfcHJpdjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX2hjZCAqZ2JfdXNiX2RldmljZV90b19oY2Qoc3RydWN0IGdiX3VzYl9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKCh2b2lkICopZGV2LCBzdHJ1Y3QgdXNiX2hjZCwgaGNkX3ByaXYpOworfQorCitzdGF0aWMgdm9pZCBoY2Rfc3RvcChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCBnYl91c2JfZGV2aWNlICpkZXYgPSB0b19nYl91c2JfZGV2aWNlKGhjZCk7CisJaW50IHJldDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGRldi0+Y29ubmVjdGlvbiwgR0JfVVNCX1RZUEVfSENEX1NUT1AsCisJCQkJTlVMTCwgMCwgTlVMTCwgMCk7CisJaWYgKHJldCkKKwkJZGV2X2VycigmZGV2LT5nYnBoeV9kZXYtPmRldiwgIkhDRCBzdG9wIGZhaWxlZCAnJWQnXG4iLCByZXQpOworfQorCitzdGF0aWMgaW50IGhjZF9zdGFydChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCB1c2JfYnVzICpidXMgPSBoY2RfdG9fYnVzKGhjZCk7CisJc3RydWN0IGdiX3VzYl9kZXZpY2UgKmRldiA9IHRvX2diX3VzYl9kZXZpY2UoaGNkKTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoZGV2LT5jb25uZWN0aW9uLCBHQl9VU0JfVFlQRV9IQ0RfU1RBUlQsCisJCQkJTlVMTCwgMCwgTlVMTCwgMCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZkZXYtPmdicGh5X2Rldi0+ZGV2LCAiSENEIHN0YXJ0IGZhaWxlZCAnJWQnXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9SVU5OSU5HOworCWlmIChidXMtPnJvb3RfaHViKQorCQl1c2JfaGNkX3Jlc3VtZV9yb290X2h1YihoY2QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVyYl9lbnF1ZXVlKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYiwgZ2ZwX3QgbWVtX2ZsYWdzKQoreworCXJldHVybiAtRU5YSU87Cit9CisKK3N0YXRpYyBpbnQgdXJiX2RlcXVldWUoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKQoreworCXJldHVybiAtRU5YSU87Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZyYW1lX251bWJlcihzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh1Yl9zdGF0dXNfZGF0YShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBjaGFyICpidWYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHViX2NvbnRyb2woc3RydWN0IHVzYl9oY2QgKmhjZCwgdTE2IHR5cGVSZXEsIHUxNiB3VmFsdWUsIHUxNiB3SW5kZXgsCisJCSAgICAgICBjaGFyICpidWYsIHUxNiB3TGVuZ3RoKQoreworCXN0cnVjdCBnYl91c2JfZGV2aWNlICpkZXYgPSB0b19nYl91c2JfZGV2aWNlKGhjZCk7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCXN0cnVjdCBnYl91c2JfaHViX2NvbnRyb2xfcmVxdWVzdCAqcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfdXNiX2h1Yl9jb250cm9sX3Jlc3BvbnNlICpyZXNwb25zZTsKKwlzaXplX3QgcmVzcG9uc2Vfc2l6ZTsKKwlpbnQgcmV0OworCisJLyogRklYTUU6IGhhbmRsZSB1bnNwZWNpZmllZCBsZW5ndGhzICovCisJcmVzcG9uc2Vfc2l6ZSA9IHNpemVvZigqcmVzcG9uc2UpICsgd0xlbmd0aDsKKworCW9wZXJhdGlvbiA9IGdiX29wZXJhdGlvbl9jcmVhdGUoZGV2LT5jb25uZWN0aW9uLAorCQkJCQlHQl9VU0JfVFlQRV9IVUJfQ09OVFJPTCwKKwkJCQkJc2l6ZW9mKCpyZXF1ZXN0KSwKKwkJCQkJcmVzcG9uc2Vfc2l6ZSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFvcGVyYXRpb24pCisJCXJldHVybiAtRU5PTUVNOworCisJcmVxdWVzdCA9IG9wZXJhdGlvbi0+cmVxdWVzdC0+cGF5bG9hZDsKKwlyZXF1ZXN0LT50eXBlUmVxID0gY3B1X3RvX2xlMTYodHlwZVJlcSk7CisJcmVxdWVzdC0+d1ZhbHVlID0gY3B1X3RvX2xlMTYod1ZhbHVlKTsKKwlyZXF1ZXN0LT53SW5kZXggPSBjcHVfdG9fbGUxNih3SW5kZXgpOworCXJlcXVlc3QtPndMZW5ndGggPSBjcHVfdG9fbGUxNih3TGVuZ3RoKTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmRfc3luYyhvcGVyYXRpb24pOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKHdMZW5ndGgpIHsKKwkJLyogR3JleWJ1cyBjb3JlIGhhcyB2ZXJpZmllZCByZXNwb25zZSBzaXplICovCisJCXJlc3BvbnNlID0gb3BlcmF0aW9uLT5yZXNwb25zZS0+cGF5bG9hZDsKKwkJbWVtY3B5KGJ1ZiwgcmVzcG9uc2UtPmJ1Ziwgd0xlbmd0aCk7CisJfQorb3V0OgorCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaGNfZHJpdmVyIHVzYl9nYl9oY19kcml2ZXIgPSB7CisJLmRlc2NyaXB0aW9uID0gImdyZXlidXMtaGNkIiwKKwkucHJvZHVjdF9kZXNjID0gIkdyZXlidXMgVVNCIEhvc3QgQ29udHJvbGxlciIsCisJLmhjZF9wcml2X3NpemUgPSBzaXplb2Yoc3RydWN0IGdiX3VzYl9kZXZpY2UpLAorCisJLmZsYWdzID0gSENEX1VTQjIsCisKKwkuc3RhcnQgPSBoY2Rfc3RhcnQsCisJLnN0b3AgPSBoY2Rfc3RvcCwKKworCS51cmJfZW5xdWV1ZSA9IHVyYl9lbnF1ZXVlLAorCS51cmJfZGVxdWV1ZSA9IHVyYl9kZXF1ZXVlLAorCisJLmdldF9mcmFtZV9udW1iZXIgPSBnZXRfZnJhbWVfbnVtYmVyLAorCS5odWJfc3RhdHVzX2RhdGEgPSBodWJfc3RhdHVzX2RhdGEsCisJLmh1Yl9jb250cm9sID0gaHViX2NvbnRyb2wsCit9OworCitzdGF0aWMgaW50IGdiX3VzYl9wcm9iZShzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYsCisJCQljb25zdCBzdHJ1Y3QgZ2JwaHlfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZ2JwaHlfZGV2LT5kZXY7CisJc3RydWN0IGdiX3VzYl9kZXZpY2UgKmdiX3VzYl9kZXY7CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKKwlpbnQgcmV0dmFsOworCisJaGNkID0gdXNiX2NyZWF0ZV9oY2QoJnVzYl9nYl9oY19kcml2ZXIsIGRldiwgZGV2X25hbWUoZGV2KSk7CisJaWYgKCFoY2QpCisJCXJldHVybiAtRU5PTUVNOworCisJY29ubmVjdGlvbiA9IGdiX2Nvbm5lY3Rpb25fY3JlYXRlKGdicGh5X2Rldi0+YnVuZGxlLAorCQkJCQkgIGxlMTZfdG9fY3B1KGdicGh5X2Rldi0+Y3BvcnRfZGVzYy0+aWQpLAorCQkJCQkgIE5VTEwpOworCWlmIChJU19FUlIoY29ubmVjdGlvbikpIHsKKwkJcmV0dmFsID0gUFRSX0VSUihjb25uZWN0aW9uKTsKKwkJZ290byBleGl0X3VzYl9wdXQ7CisJfQorCisJZ2JfdXNiX2RldiA9IHRvX2diX3VzYl9kZXZpY2UoaGNkKTsKKwlnYl91c2JfZGV2LT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKwlnYl9jb25uZWN0aW9uX3NldF9kYXRhKGNvbm5lY3Rpb24sIGdiX3VzYl9kZXYpOworCWdiX3VzYl9kZXYtPmdicGh5X2RldiA9IGdicGh5X2RldjsKKwlnYl9nYnBoeV9zZXRfZGF0YShnYnBoeV9kZXYsIGdiX3VzYl9kZXYpOworCisJaGNkLT5oYXNfdHQgPSAxOworCisJcmV0dmFsID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbik7CisJaWYgKHJldHZhbCkKKwkJZ290byBleGl0X2Nvbm5lY3Rpb25fZGVzdHJveTsKKworCS8qCisJICogRklYTUU6IFRoZSBVU0IgYnJpZGdlZC1QSFkgcHJvdG9jb2wgZHJpdmVyIGRlcGVuZHMgb24gY2hhbmdlcyB0bworCSAqICAgICAgICBVU0IgY29yZSB3aGljaCBhcmUgbm90IHlldCB1cHN0cmVhbS4KKwkgKgorCSAqICAgICAgICBEaXNhYmxlIGZvciBub3cuCisJICovCisJaWYgKDEpIHsKKwkJZGV2X3dhcm4oZGV2LCAiVVNCIHByb3RvY29sIGRpc2FibGVkXG4iKTsKKwkJcmV0dmFsID0gLUVQUk9UT05PU1VQUE9SVDsKKwkJZ290byBleGl0X2Nvbm5lY3Rpb25fZGlzYWJsZTsKKwl9CisKKwlyZXR2YWwgPSB1c2JfYWRkX2hjZChoY2QsIDAsIDApOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXhpdF9jb25uZWN0aW9uX2Rpc2FibGU7CisKKwlyZXR1cm4gMDsKKworZXhpdF9jb25uZWN0aW9uX2Rpc2FibGU6CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworZXhpdF9jb25uZWN0aW9uX2Rlc3Ryb3k6CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGNvbm5lY3Rpb24pOworZXhpdF91c2JfcHV0OgorCXVzYl9wdXRfaGNkKGhjZCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBnYl91c2JfcmVtb3ZlKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldikKK3sKKwlzdHJ1Y3QgZ2JfdXNiX2RldmljZSAqZ2JfdXNiX2RldiA9IGdiX2dicGh5X2dldF9kYXRhKGdicGh5X2Rldik7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnYl91c2JfZGV2LT5jb25uZWN0aW9uOworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBnYl91c2JfZGV2aWNlX3RvX2hjZChnYl91c2JfZGV2KTsKKworCXVzYl9yZW1vdmVfaGNkKGhjZCk7CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKKwl1c2JfcHV0X2hjZChoY2QpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGdicGh5X2RldmljZV9pZCBnYl91c2JfaWRfdGFibGVbXSA9IHsKKwl7IEdCUEhZX1BST1RPQ09MKEdSRVlCVVNfUFJPVE9DT0xfVVNCKSB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGdicGh5LCBnYl91c2JfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGdicGh5X2RyaXZlciB1c2JfZHJpdmVyID0geworCS5uYW1lCQk9ICJ1c2IiLAorCS5wcm9iZQkJPSBnYl91c2JfcHJvYmUsCisJLnJlbW92ZQkJPSBnYl91c2JfcmVtb3ZlLAorCS5pZF90YWJsZQk9IGdiX3VzYl9pZF90YWJsZSwKK307CisKK21vZHVsZV9nYnBoeV9kcml2ZXIodXNiX2RyaXZlcik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy92aWJyYXRvci5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdmlicmF0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmEwZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdmlicmF0b3IuYwpAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIEdyZXlidXMgVmlicmF0b3IgcHJvdG9jb2wgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorCitzdHJ1Y3QgZ2JfdmlicmF0b3JfZGV2aWNlIHsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbgkqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCWludAkJCW1pbm9yOwkJLyogdmlicmF0b3IgbWlub3IgbnVtYmVyICovCisJc3RydWN0IGRlbGF5ZWRfd29yayAgICAgZGVsYXllZF93b3JrOworfTsKKworLyogR3JleWJ1cyBWaWJyYXRvciBvcGVyYXRpb24gdHlwZXMgKi8KKyNkZWZpbmUJR0JfVklCUkFUT1JfVFlQRV9PTgkJCTB4MDIKKyNkZWZpbmUJR0JfVklCUkFUT1JfVFlQRV9PRkYJCQkweDAzCisKK3N0YXRpYyBpbnQgdHVybl9vZmYoc3RydWN0IGdiX3ZpYnJhdG9yX2RldmljZSAqdmliKQoreworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IHZpYi0+Y29ubmVjdGlvbi0+YnVuZGxlOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyh2aWItPmNvbm5lY3Rpb24sIEdCX1ZJQlJBVE9SX1RZUEVfT0ZGLAorCQkJTlVMTCwgMCwgTlVMTCwgMCk7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0dXJuX29uKHN0cnVjdCBnYl92aWJyYXRvcl9kZXZpY2UgKnZpYiwgdTE2IHRpbWVvdXRfbXMpCit7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlID0gdmliLT5jb25uZWN0aW9uLT5idW5kbGU7CisJaW50IHJldDsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogVmlicmF0b3Igd2FzIHN3aXRjaGVkIE9OIGVhcmxpZXIgKi8KKwlpZiAoY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ2aWItPmRlbGF5ZWRfd29yaykpCisJCXR1cm5fb2ZmKHZpYik7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyh2aWItPmNvbm5lY3Rpb24sIEdCX1ZJQlJBVE9SX1RZUEVfT04sCisJCQlOVUxMLCAwLCBOVUxMLCAwKTsKKwlpZiAocmV0KSB7CisJCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ2aWItPmRlbGF5ZWRfd29yaywgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0X21zKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2JfdmlicmF0b3Jfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkZWxheWVkX3dvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7CisJc3RydWN0IGdiX3ZpYnJhdG9yX2RldmljZSAqdmliID0KKwkJY29udGFpbmVyX29mKGRlbGF5ZWRfd29yaywgc3RydWN0IGdiX3ZpYnJhdG9yX2RldmljZSwgZGVsYXllZF93b3JrKTsKKworCXR1cm5fb2ZmKHZpYik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRpbWVvdXRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGdiX3ZpYnJhdG9yX2RldmljZSAqdmliID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IHBhcnNlIHRpbWVvdXQgdmFsdWUgJWRcbiIsIHJldHZhbCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJaWYgKHZhbCkKKwkJcmV0dmFsID0gdHVybl9vbih2aWIsICh1MTYpdmFsKTsKKwllbHNlCisJCXJldHZhbCA9IHR1cm5fb2ZmKHZpYik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9XTyh0aW1lb3V0KTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnZpYnJhdG9yX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3RpbWVvdXQuYXR0ciwKKwlOVUxMLAorfTsKK0FUVFJJQlVURV9HUk9VUFModmlicmF0b3IpOworCitzdGF0aWMgc3RydWN0IGNsYXNzIHZpYnJhdG9yX2NsYXNzID0geworCS5uYW1lCQk9ICJ2aWJyYXRvciIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kZXZfZ3JvdXBzCT0gdmlicmF0b3JfZ3JvdXBzLAorfTsKKworc3RhdGljIERFRklORV9JREEobWlub3JzKTsKKworc3RhdGljIGludCBnYl92aWJyYXRvcl9wcm9iZShzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsCisJCQkJCWNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCAqaWQpCit7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9jcG9ydCAqY3BvcnRfZGVzYzsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfdmlicmF0b3JfZGV2aWNlICp2aWI7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCByZXR2YWw7CisKKwlpZiAoYnVuZGxlLT5udW1fY3BvcnRzICE9IDEpCisJCXJldHVybiAtRU5PREVWOworCisJY3BvcnRfZGVzYyA9ICZidW5kbGUtPmNwb3J0X2Rlc2NbMF07CisJaWYgKGNwb3J0X2Rlc2MtPnByb3RvY29sX2lkICE9IEdSRVlCVVNfUFJPVE9DT0xfVklCUkFUT1IpCisJCXJldHVybiAtRU5PREVWOworCisJdmliID0ga3phbGxvYyhzaXplb2YoKnZpYiksIEdGUF9LRVJORUwpOworCWlmICghdmliKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbm5lY3Rpb24gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZShidW5kbGUsIGxlMTZfdG9fY3B1KGNwb3J0X2Rlc2MtPmlkKSwKKwkJCQkJCU5VTEwpOworCWlmIChJU19FUlIoY29ubmVjdGlvbikpIHsKKwkJcmV0dmFsID0gUFRSX0VSUihjb25uZWN0aW9uKTsKKwkJZ290byBlcnJfZnJlZV92aWI7CisJfQorCWdiX2Nvbm5lY3Rpb25fc2V0X2RhdGEoY29ubmVjdGlvbiwgdmliKTsKKworCXZpYi0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisKKwlncmV5YnVzX3NldF9kcnZkYXRhKGJ1bmRsZSwgdmliKTsKKworCXJldHZhbCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm5lY3Rpb24pOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyX2Nvbm5lY3Rpb25fZGVzdHJveTsKKworCS8qCisJICogRm9yIG5vdyB3ZSBjcmVhdGUgYSBkZXZpY2UgaW4gc3lzZnMgZm9yIHRoZSB2aWJyYXRvciwgYnV0IG9kZHMgYXJlCisJICogdGhlcmUgaXMgYSAicmVhbCIgZGV2aWNlIHNvbWV3aGVyZSBpbiB0aGUga2VybmVsIGZvciB0aGlzLCBidXQgSQorCSAqIGNhbid0IGZpbmQgaXQgYXQgdGhlIG1vbWVudC4uLgorCSAqLworCXZpYi0+bWlub3IgPSBpZGFfc2ltcGxlX2dldCgmbWlub3JzLCAwLCAwLCBHRlBfS0VSTkVMKTsKKwlpZiAodmliLT5taW5vciA8IDApIHsKKwkJcmV0dmFsID0gdmliLT5taW5vcjsKKwkJZ290byBlcnJfY29ubmVjdGlvbl9kaXNhYmxlOworCX0KKwlkZXYgPSBkZXZpY2VfY3JlYXRlKCZ2aWJyYXRvcl9jbGFzcywgJmJ1bmRsZS0+ZGV2LAorCQkJICAgIE1LREVWKDAsIDApLCB2aWIsICJ2aWJyYXRvciVkIiwgdmliLT5taW5vcik7CisJaWYgKElTX0VSUihkZXYpKSB7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2lkYV9yZW1vdmU7CisJfQorCXZpYi0+ZGV2ID0gZGV2OworCisJSU5JVF9ERUxBWUVEX1dPUksoJnZpYi0+ZGVsYXllZF93b3JrLCBnYl92aWJyYXRvcl93b3JrZXIpOworCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKworCXJldHVybiAwOworCitlcnJfaWRhX3JlbW92ZToKKwlpZGFfc2ltcGxlX3JlbW92ZSgmbWlub3JzLCB2aWItPm1pbm9yKTsKK2Vycl9jb25uZWN0aW9uX2Rpc2FibGU6CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworZXJyX2Nvbm5lY3Rpb25fZGVzdHJveToKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7CitlcnJfZnJlZV92aWI6CisJa2ZyZWUodmliKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3ZpYnJhdG9yX2Rpc2Nvbm5lY3Qoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKQoreworCXN0cnVjdCBnYl92aWJyYXRvcl9kZXZpY2UgKnZpYiA9IGdyZXlidXNfZ2V0X2RydmRhdGEoYnVuZGxlKTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQpCisJCWdiX3BtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGJ1bmRsZSk7CisKKwlpZiAoY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ2aWItPmRlbGF5ZWRfd29yaykpCisJCXR1cm5fb2ZmKHZpYik7CisKKwlkZXZpY2VfdW5yZWdpc3Rlcih2aWItPmRldik7CisJaWRhX3NpbXBsZV9yZW1vdmUoJm1pbm9ycywgdmliLT5taW5vcik7CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKHZpYi0+Y29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KHZpYi0+Y29ubmVjdGlvbik7CisJa2ZyZWUodmliKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCBnYl92aWJyYXRvcl9pZF90YWJsZVtdID0geworCXsgR1JFWUJVU19ERVZJQ0VfQ0xBU1MoR1JFWUJVU19DTEFTU19WSUJSQVRPUikgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGdyZXlidXMsIGdiX3ZpYnJhdG9yX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBncmV5YnVzX2RyaXZlciBnYl92aWJyYXRvcl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInZpYnJhdG9yIiwKKwkucHJvYmUJCT0gZ2JfdmlicmF0b3JfcHJvYmUsCisJLmRpc2Nvbm5lY3QJPSBnYl92aWJyYXRvcl9kaXNjb25uZWN0LAorCS5pZF90YWJsZQk9IGdiX3ZpYnJhdG9yX2lkX3RhYmxlLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgZ2JfdmlicmF0b3JfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjbGFzc19yZWdpc3RlcigmdmlicmF0b3JfY2xhc3MpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR2YWwgPSBncmV5YnVzX3JlZ2lzdGVyKCZnYl92aWJyYXRvcl9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyX2NsYXNzX3VucmVnaXN0ZXI7CisKKwlyZXR1cm4gMDsKKworZXJyX2NsYXNzX3VucmVnaXN0ZXI6CisJY2xhc3NfdW5yZWdpc3RlcigmdmlicmF0b3JfY2xhc3MpOworCisJcmV0dXJuIHJldHZhbDsKK30KK21vZHVsZV9pbml0KGdiX3ZpYnJhdG9yX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgZ2JfdmlicmF0b3JfZXhpdCh2b2lkKQoreworCWdyZXlidXNfZGVyZWdpc3RlcigmZ2JfdmlicmF0b3JfZHJpdmVyKTsKKwljbGFzc191bnJlZ2lzdGVyKCZ2aWJyYXRvcl9jbGFzcyk7CisJaWRhX2Rlc3Ryb3koJm1pbm9ycyk7Cit9Cittb2R1bGVfZXhpdChnYl92aWJyYXRvcl9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2dzX2ZwZ2Fib290LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvZ3NfZnBnYWJvb3QuYwppbmRleCBhMjIxZjI2Li44ZWQ0ZDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvZ3NfZnBnYWJvb3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvZ3NfZnBnYWJvb3QuYwpAQCAtOCwxMCArOCw2IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9nc19mcGdhYm9vdC5oIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2dzX2ZwZ2Fib290LmgKaW5kZXggOGNjMzI1NS4uN2I4Y2MzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2dzX2ZwZ2Fib290LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2dzX2ZwZ2Fib290LmgKQEAgLTcsMTIgKzcsNyBAQAogICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICoKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9pby5oIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2lvLmgKaW5kZXggN2I0NmFjMi4uNWU4MzliMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2lvLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2lvLmgKQEAgLTY2LDEwICs2Niw4IEBACiAJYnVzXzJieXRlCT0gMiwKIH07CiAKLQogI2RlZmluZSBNQVhfV0FJVF9ET05FCTEwMDAwCiAKLQogc3RydWN0IGdwaW9idXMgewogCWludAluZ3BpbzsKIAl2b2lkIF9faW9tZW0gKnJbNF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaTRsL2FjdDIwMDAvYWN0MjAwMF9pc2EuYyBiL2RyaXZlcnMvc3RhZ2luZy9pNGwvYWN0MjAwMC9hY3QyMDAwX2lzYS5jCmluZGV4IGYwZWI4NDQuLmFkN2EwMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pNGwvYWN0MjAwMC9hY3QyMDAwX2lzYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pNGwvYWN0MjAwMC9hY3QyMDAwX2lzYS5jCkBAIC0xMzQsOSArMTM0LDkgQEAKIHsKIAlpbnQgb2xkX2lycTsKIAotCWlmIChjYXJkLT5mbGFncyAmIEFDVDIwMDBfRkxBR1NfSVZBTElEKSB7CisJaWYgKGNhcmQtPmZsYWdzICYgQUNUMjAwMF9GTEFHU19JVkFMSUQpCiAJCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7Ci0JfQorCiAJY2FyZC0+ZmxhZ3MgJj0gfkFDVDIwMDBfRkxBR1NfSVZBTElEOwogCW91dGIoSVNBX0NPUl9JUlFPRkYsIElTQV9QT1JUX0NPUik7CiAJaWYgKCFpcnEpCkBAIC0xNjYsNyArMTY2LDcgQEAKIAkJcmVsZWFzZV9yZWdpb24oY2FyZC0+cG9ydCwgSVNBX1JFR0lPTik7CiAJCWNhcmQtPmZsYWdzICY9IH5BQ1QyMDAwX0ZMQUdTX1BWQUxJRDsKIAl9Ci0JaWYgKHJlcXVlc3RfcmVnaW9uKHBvcnRiYXNlLCBBQ1QyMDAwX1BPUlRMRU4sIGNhcmQtPnJlZ25hbWUpID09IE5VTEwpCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwb3J0YmFzZSwgQUNUMjAwMF9QT1JUTEVOLCBjYXJkLT5yZWduYW1lKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAllbHNlIHsKIAkJY2FyZC0+cG9ydCA9IHBvcnRiYXNlOwpAQCAtMTc2LDcgKzE3Niw3IEBACiB9CiAKIC8qCi0gKiBSZWxlYXNlIHJlc3NvdXJjZXMsIHVzZWQgYnkgYW4gYWRhcHRvci4KKyAqIFJlbGVhc2UgcmVzb3VyY2VzLCB1c2VkIGJ5IGFuIGFkYXB0b3IuCiAgKi8KIHZvaWQKIGFjdDIwMDBfaXNhX3JlbGVhc2UoYWN0MjAwMF9jYXJkICpjYXJkKQpAQCAtMjQ0LDcgKzI0NCw3IEBACiAJCQkJaWYgKHZhbGlkKSB7CiAJCQkJCWNhcmQtPmlkYXQuaXNhLnJjdmxlbiA9ICgoYWN0Y2FwaV9tc2doZHIgKikmY2FyZC0+aWRhdC5pc2EucmN2aGRyKS0+bGVuOwogCQkJCQljYXJkLT5pZGF0LmlzYS5yY3Zza2IgPSBkZXZfYWxsb2Nfc2tiKGNhcmQtPmlkYXQuaXNhLnJjdmxlbik7Ci0JCQkJCWlmIChjYXJkLT5pZGF0LmlzYS5yY3Zza2IgPT0gTlVMTCkgeworCQkJCQlpZiAoIWNhcmQtPmlkYXQuaXNhLnJjdnNrYikgewogCQkJCQkJY2FyZC0+aWRhdC5pc2EucmN2aWdub3JlID0gMTsKIAkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCQkJCSAgICAgICAiYWN0MjAwMF9pc2FfcmVjZWl2ZTogbm8gbWVtb3J5XG4iKTsKQEAgLTM5OSw3ICszOTksNiBAQAogCXVuc2lnbmVkIGludCBsZW5ndGg7CiAJaW50IGw7CiAJaW50IGM7Ci0JbG9uZyB0aW1lb3V0OwogCXVfY2hhciAqYjsKIAl1X2NoYXIgX191c2VyICpwOwogCXVfY2hhciAqYnVmOwpAQCAtNDE3LDcgKzQxNiw2IEBACiAJYnVmID0ga21hbGxvYygxMDI0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JdGltZW91dCA9IDA7CiAJd2hpbGUgKGxlbmd0aCkgewogCQlsID0gKGxlbmd0aCA+IDEwMjQpID8gMTAyNCA6IGxlbmd0aDsKIAkJYyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaTRsL2FjdDIwMDAvY2FwaS5jIGIvZHJpdmVycy9zdGFnaW5nL2k0bC9hY3QyMDAwL2NhcGkuYwppbmRleCAzZjY2Y2EyLi42MmY1NjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaTRsL2FjdDIwMDAvY2FwaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pNGwvYWN0MjAwMC9jYXBpLmMKQEAgLTExMyw3ICsxMTMsOSBAQAogCQkJbS0+aGRyLmNtZC5jbWQgPSBjOwkJCVwKIAkJCW0tPmhkci5jbWQuc3ViY21kID0gczsJCQlcCiAJCQltLT5oZHIubXNnbnVtID0gYWN0Y2FwaV9uZXh0c21zZyhjYXJkKTsgXAotCQl9IGVsc2UgbSA9IE5VTEw7CQkJCVwKKwkJfSBlbHNlIHsJCQkJCVwKKwkJCW0gPSBOVUxMOwkJCQlcCisJCX0JCQkJCQlcCiAJfQogCiAjZGVmaW5lIEFDVENBUElfQ0hLU0tCIGlmICghc2tiKSB7CQkJCQlcCkBAIC01NDcsMTIgKzU0OSwxMSBAQAogYWN0Y2FwaV9kYXRhX2IzX2luZChhY3QyMDAwX2NhcmQgKmNhcmQsIHN0cnVjdCBza19idWZmICpza2IpIHsKIAlfX3UxNiBwbGNpOwogCV9fdTE2IG5jY2k7Ci0JX191MTYgY29udHJvbGxlcjsKIAlfX3U4ICBibG9ja25yOwogCWludCBjaGFuOwogCWFjdGNhcGlfbXNnICptc2cgPSAoYWN0Y2FwaV9tc2cgKilza2ItPmRhdGE7CiAKLQlFVkFMX05DQ0kobXNnLT5tc2cuZGF0YV9iM19pbmQuZmFrZW5jY2ksIHBsY2ksIGNvbnRyb2xsZXIsIG5jY2kpOworCUVWQUxfTkNDSShtc2ctPm1zZy5kYXRhX2IzX2luZC5mYWtlbmNjaSwgcGxjaSwgbmNjaSk7CiAJY2hhbiA9IGZpbmRfbmNjaShjYXJkLCBuY2NpKTsKIAlpZiAoY2hhbiA8IDApCiAJCXJldHVybiAwOwpAQCAtNjE3LDcgKzYxOCw3IEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAJCXRtcCA9IHNrYl9wZWVrKChzdHJ1Y3Qgc2tfYnVmZl9oZWFkICopdG1wKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQlpZiAoKHRtcCA9PSBza2IpIHx8ICh0bXAgPT0gTlVMTCkpIHsKKwkJaWYgKCh0bXAgPT0gc2tiKSB8fCAhdG1wKSB7CiAJCQkvKiByZWFjaGVkIGVuZCBvZiBxdWV1ZSAqLwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWN0MjAwMDogaGFuZGxlX2FjayBub3RoaW5nIGZvdW5kIVxuIik7CiAJCQlyZXR1cm4gMDsKQEAgLTk5MCw3ICs5OTEsOCBAQAogfQogCiAjaWZkZWYgREVCVUdfRFVNUF9TS0IKLXN0YXRpYyB2b2lkIGR1bXBfc2tiKHN0cnVjdCBza19idWZmICpza2IpIHsKK3N0YXRpYyB2b2lkIGR1bXBfc2tiKHN0cnVjdCBza19idWZmICpza2IpCit7CiAJY2hhciB0bXBbODBdOwogCWNoYXIgKnAgPSBza2ItPmRhdGE7CiAJY2hhciAqdCA9IHRtcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pNGwvYWN0MjAwMC9jYXBpLmggYi9kcml2ZXJzL3N0YWdpbmcvaTRsL2FjdDIwMDAvY2FwaS5oCmluZGV4IDAxY2NkZWMuLjM0ODg0YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pNGwvYWN0MjAwMC9jYXBpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2k0bC9hY3QyMDAwL2NhcGkuaApAQCAtMTE0LDkgKzExNCw4IEBACiAjZGVmaW5lIE1BS0VfTkNDSShwbGNpLCBjb250ciwgbmNjaSkJCQkJCVwKIAkoKHBsY2kgJiAweDFmKSB8ICgoY29udHIgJiAweDcpIDw8IDUpIHwgKChuY2NpICYgMHhmZikgPDwgOCkpCiAKLSNkZWZpbmUgRVZBTF9OQ0NJKGZha2VuY2NpLCBwbGNpLCBjb250ciwgbmNjaSkgewlcCisjZGVmaW5lIEVWQUxfTkNDSShmYWtlbmNjaSwgcGxjaSwgbmNjaSkgewlcCiAJCXBsY2kgID0gZmFrZW5jY2kgJiAweDFmOwkJXAotCQljb250ciA9IChmYWtlbmNjaSA+PiA1KSAmIDB4NzsJCVwKIAkJbmNjaSAgPSAoZmFrZW5jY2kgPj4gOCkgJiAweGZmOwkJXAogCX0KIApAQCAtMTI4LDEzICsxMjcsNiBAQAogICogQml0IDUtNyAgPSBDb250cm9sbGVyCiAgKiBCaXQgOC0xNSA9IHJlc2VydmVkIChtdXN0IGJlIDApCiAgKi8KLSNkZWZpbmUgTUFLRV9QTENJKHBsY2ksIGNvbnRyKQkJCVwKLQkoKHBsY2kgJiAweDFmKSB8ICgoY29udHIgJiAweDcpIDw8IDUpKQotCi0jZGVmaW5lIEVWQUxfUExDSShmYWtlcGxjaSwgcGxjaSwgY29udHIpIHsJXAotCQlwbGNpICA9IGZha2VwbGNpICYgMHgxZjsJXAotCQljb250ciA9IChmYWtlcGxjaSA+PiA1KSAmIDB4NzsJXAotCX0KIAogdHlwZWRlZiBzdHJ1Y3QgYWN0Y2FwaV9tc2cgewogCWFjdGNhcGlfbXNnaGRyIGhkcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pNGwvYWN0MjAwMC9tb2R1bGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9pNGwvYWN0MjAwMC9tb2R1bGUuYwppbmRleCA2ODA3M2QwLi45OWM5YzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaTRsL2FjdDIwMDAvbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2k0bC9hY3QyMDAwL21vZHVsZS5jCkBAIC0yOCw3ICsyOCw3IEBACiBzdGF0aWMgYWN0MjAwMF9jYXJkICpjYXJkcyA9IChhY3QyMDAwX2NhcmQgKikgTlVMTDsKIAogLyogUGFyYW1ldGVycyB0byBiZSBzZXQgYnkgaW5zbW9kICovCi1zdGF0aWMgaW50ICAgYWN0X2J1cyAgPSAgMDsKK3N0YXRpYyBpbnQgICBhY3RfYnVzOwogc3RhdGljIGludCAgIGFjdF9wb3J0ID0gLTE7ICAvKiAtMSA9IEF1dG9wcm9iZSAgKi8KIHN0YXRpYyBpbnQgICBhY3RfaXJxICA9IC0xOwogc3RhdGljIGNoYXIgKmFjdF9pZCAgID0gIlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIjsKQEAgLTI4OSw3ICsyODksOCBAQAogCQkJaWYgKGNvcHlfZnJvbV91c2VyKHRtcCwgYXJnLAogCQkJCQkgICBzaXplb2YodG1wKSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlpZiAoKHJldCA9IGFjdDIwMDBfc2V0X21zbihjYXJkLCB0bXApKSkKKwkJCXJldCA9IGFjdDIwMDBfc2V0X21zbihjYXJkLCB0bXApOworCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwogCQkJaWYgKGNhcmQtPmZsYWdzICYgQUNUMjAwMF9GTEFHU19SVU5OSU5HKQogCQkJCXJldHVybiAoYWN0Y2FwaV9tYW51ZmFjdHVyZXJfcmVxX21zbihjYXJkKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaTRsL2ljbi9pY24uYyBiL2RyaXZlcnMvc3RhZ2luZy9pNGwvaWNuL2ljbi5jCmluZGV4IDQ2ZDk1N2MuLjUxNGJmYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pNGwvaWNuL2ljbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pNGwvaWNuL2ljbi5jCkBAIC02Miw3ICs2Miw4IEBACiAJc2tiX3F1ZXVlX3B1cmdlKHF1ZXVlKTsKIAljYXJkLT54bGVuW2NoYW5uZWxdID0gMDsKIAljYXJkLT5zbmRjb3VudFtjaGFubmVsXSA9IDA7Ci0JaWYgKChza2IgPSBjYXJkLT54c2tiW2NoYW5uZWxdKSkgeworCXNrYiA9IGNhcmQtPnhza2JbY2hhbm5lbF07CisJaWYgKHNrYikgewogCQljYXJkLT54c2tiW2NoYW5uZWxdID0gTlVMTDsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCX0KQEAgLTgxLDEyICs4MiwxMSBAQAogCSAgICAgaW50IGZpcnN0Yml0LAogCSAgICAgaW50IGJpdGNvdW50KQogewotCiAJcmVnaXN0ZXIgdV9jaGFyIHM7CiAJcmVnaXN0ZXIgdV9jaGFyIGM7CiAKIAlmb3IgKHMgPSBmaXJzdGJpdCwgYyA9IGJpdGNvdW50OyBjID4gMDsgcy0tLCBjLS0pCi0JCU9VVEJfUCgodV9jaGFyKSAoKHZhbCA+PiBzKSAmIDEpID8gMHhmZiA6IDAsIHBvcnQpOworCQlPVVRCX1AoKHVfY2hhcikoKHZhbCA+PiBzKSAmIDEpID8gMHhmZiA6IDAsIHBvcnQpOwogfQogCiAvKgpAQCAtMjcyLDggKzI3MiwxMCBAQAogCQkJcmJuZXh0OwogCQkJaWNuX21hcHJlbGVhc2VfY2hhbm5lbChjYXJkLCBtY2ggJiAyKTsKIAkJCWlmICghZWZsYWcpIHsKLQkJCQlpZiAoKGNudCA9IGNhcmQtPnJjdmlkeFtjaGFubmVsXSkpIHsKLQkJCQkJaWYgKCEoc2tiID0gZGV2X2FsbG9jX3NrYihjbnQpKSkgeworCQkJCWNudCA9IGNhcmQtPnJjdmlkeFtjaGFubmVsXTsKKwkJCQlpZiAoY250KSB7CisJCQkJCXNrYiA9IGRldl9hbGxvY19za2IoY250KTsKKwkJCQkJaWYgKCFza2IpIHsKIAkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImljbjogcmVjZWl2ZSBvdXQgb2YgbWVtb3J5XG4iKTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CkBAIC0zODIsNyArMzg0LDcgQEAKIHN0YXRpYyB2b2lkCiBpY25fcG9sbGJjaGFuKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlpY25fY2FyZCAqY2FyZCA9IChpY25fY2FyZCAqKSBkYXRhOworCWljbl9jYXJkICpjYXJkID0gKGljbl9jYXJkICopZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGNhcmQtPmZsYWdzICYgSUNOX0ZMQUdTX0IxQUNUSVZFKSB7CkBAIC00NzIsNyArNDc0LDYgQEAKIAogCQlpZiAoY2FyZC0+ZmxhZ3MgJgogCQkgICAgKChjaGFubmVsKSA/IElDTl9GTEFHU19CMkFDVElWRSA6IElDTl9GTEFHU19CMUFDVElWRSkpIHsKLQogCQkJaXNkbl9jdHJsIG5jbWQ7CiAKIAkJCWNhcmQtPmZsYWdzICY9IH4oKGNoYW5uZWwpID8KQEAgLTU0NCw3ICs1NDUsNyBAQAogCQlicmVhazsKIAljYXNlIDY6CiAJCXNucHJpbnRmKGNtZC5wYXJtLm51bSwgc2l6ZW9mKGNtZC5wYXJtLm51bSksICIlZCIsCi0JCQkgKGludCkgc2ltcGxlX3N0cnRvdWwoc3RhdHVzICsgNywgTlVMTCwgMTYpKTsKKwkJCSAoaW50KXNpbXBsZV9zdHJ0b3VsKHN0YXR1cyArIDcsIE5VTEwsIDE2KSk7CiAJCWJyZWFrOwogCWNhc2UgNzoKIAkJc3RhdHVzICs9IDM7CkBAIC02MDQsNyArNjA1LDcgQEAKIHN0YXRpYyB2b2lkCiBpY25fcG9sbGRjaGFuKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlpY25fY2FyZCAqY2FyZCA9IChpY25fY2FyZCAqKSBkYXRhOworCWljbl9jYXJkICpjYXJkID0gKGljbl9jYXJkICopZGF0YTsKIAlpbnQgbWNoID0gY2FyZC0+c2Vjb25kaGFsZiA/IDIgOiAwOwogCWludCBhdmFpbCA9IDA7CiAJaW50IGxlZnQ7CkBAIC02NTYsOSArNjU3LDggQEAKIAkJCQkJCSpxID0gJ1wwJzsKIAkJCQkJCXN0cmNhdCh2c3RyLCAiMDAwIik7CiAJCQkJCQl2c3RyWzNdID0gJ1wwJzsKLQkJCQkJCWNhcmQtPmZ3X3JldiA9IChpbnQpIHNpbXBsZV9zdHJ0b3VsKHZzdHIsIE5VTEwsIDEwKTsKKwkJCQkJCWNhcmQtPmZ3X3JldiA9IChpbnQpc2ltcGxlX3N0cnRvdWwodnN0ciwgTlVMTCwgMTApOwogCQkJCQkJY29udGludWU7Ci0KIAkJCQkJfQogCQkJCX0KIAkJCX0gZWxzZSB7CkBAIC02ODMsNyArNjgzLDcgQEAKIAkJCWNhcmQtPmZsYWdzIHw9IElDTl9GTEFHU19SQlRJTUVSOwogCQkJZGVsX3RpbWVyKCZjYXJkLT5yYl90aW1lcik7CiAJCQljYXJkLT5yYl90aW1lci5mdW5jdGlvbiA9IGljbl9wb2xsYmNoYW47Ci0JCQljYXJkLT5yYl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGNhcmQ7CisJCQljYXJkLT5yYl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpY2FyZDsKIAkJCWNhcmQtPnJiX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSUNOX1RJTUVSX0JDUkVBRDsKIAkJCWFkZF90aW1lcigmY2FyZC0+cmJfdGltZXIpOwogCQl9CkBAIC04MDUsMTcgKzgwNSwxMiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKICNpZmRlZiBCT09UX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgImljbl9sb2FkYm9vdCBjYWxsZWQsIGJ1ZmZhZGRyPSUwOGx4XG4iLCAodWxvbmcpIGJ1ZmZlcik7CisJcHJpbnRrKEtFUk5fREVCVUcgImljbl9sb2FkYm9vdCBjYWxsZWQsIGJ1ZmZhZGRyPSUwOGx4XG4iLCAodWxvbmcpYnVmZmVyKTsKICNlbmRpZgotCWlmICghKGNvZGVidWYgPSBrbWFsbG9jKElDTl9DT0RFX1NUQUdFMSwgR0ZQX0tFUk5FTCkpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImljbjogQ291bGQgbm90IGFsbG9jYXRlIGNvZGUgYnVmZmVyXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChjb3B5X2Zyb21fdXNlcihjb2RlYnVmLCBidWZmZXIsIElDTl9DT0RFX1NUQUdFMSkpIHsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBvdXRfa2ZyZWU7Ci0JfQorCWNvZGVidWYgPSBtZW1kdXBfdXNlcihidWZmZXIsIElDTl9DT0RFX1NUQUdFMSk7CisJaWYgKElTX0VSUihjb2RlYnVmKSkKKwkJcmV0dXJuIFBUUl9FUlIoY29kZWJ1Zik7CisKIAlpZiAoIWNhcmQtPnJ2YWxpZCkgewogCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGNhcmQtPnBvcnQsIElDTl9QT1JUTEVOLCBjYXJkLT5yZWduYW1lKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORwpAQCAtODc4LDkgKzg3Myw5IEBACiAJfQogCVNMRUVQKDEpOwogCU9VVEJfUCgweGZmLCBJQ05fUlVOKTsgIC8qIFN0YXJ0IEJvb3QtQ29kZSAqLwotCWlmICgocmV0ID0gaWNuX2NoZWNrX2xvYWRlcihjYXJkLT5kb3VibGVTMCA/IDIgOiAxKSkpIHsKKwlyZXQgPSBpY25fY2hlY2tfbG9hZGVyKGNhcmQtPmRvdWJsZVMwID8gMiA6IDEpOworCWlmIChyZXQpCiAJCWdvdG8gb3V0X2tmcmVlOwotCX0KIAlpZiAoIWNhcmQtPmRvdWJsZVMwKSB7CiAJCXJldCA9IDA7CiAJCWdvdG8gb3V0X2tmcmVlOwpAQCAtODk4LDcgKzg5Myw2IEBACiAKIG91dF9rZnJlZToKIAlrZnJlZShjb2RlYnVmKTsKLW91dDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC05ODAsMTggKzk3NCwxNyBAQAogCQkJCSAgICAgICBjYXJkLT5zZWNvbmRoYWxmKTsKICNlbmRpZgogCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQkJaW5pdF90aW1lcigmY2FyZC0+c3RfdGltZXIpOwotCQkJCWNhcmQtPnN0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSUNOX1RJTUVSX0RDUkVBRDsKLQkJCQljYXJkLT5zdF90aW1lci5mdW5jdGlvbiA9IGljbl9wb2xsZGNoYW47Ci0JCQkJY2FyZC0+c3RfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjYXJkOwotCQkJCWFkZF90aW1lcigmY2FyZC0+c3RfdGltZXIpOworCQkJCXNldHVwX3RpbWVyKCZjYXJkLT5zdF90aW1lciwgaWNuX3BvbGxkY2hhbiwKKwkJCQkJICAgICh1bnNpZ25lZCBsb25nKWNhcmQpOworCQkJCW1vZF90aW1lcigmY2FyZC0+c3RfdGltZXIsCisJCQkJCSAgamlmZmllcyArIElDTl9USU1FUl9EQ1JFQUQpOwogCQkJCWNhcmQtPmZsYWdzIHw9IElDTl9GTEFHU19SVU5OSU5HOwogCQkJCWlmIChjYXJkLT5kb3VibGVTMCkgewotCQkJCQlpbml0X3RpbWVyKCZjYXJkLT5vdGhlci0+c3RfdGltZXIpOwotCQkJCQljYXJkLT5vdGhlci0+c3RfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBJQ05fVElNRVJfRENSRUFEOwotCQkJCQljYXJkLT5vdGhlci0+c3RfdGltZXIuZnVuY3Rpb24gPSBpY25fcG9sbGRjaGFuOwotCQkJCQljYXJkLT5vdGhlci0+c3RfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjYXJkLT5vdGhlcjsKLQkJCQkJYWRkX3RpbWVyKCZjYXJkLT5vdGhlci0+c3RfdGltZXIpOworCQkJCQlzZXR1cF90aW1lcigmY2FyZC0+b3RoZXItPnN0X3RpbWVyLAorCQkJCQkJICAgIGljbl9wb2xsZGNoYW4sCisJCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpY2FyZC0+b3RoZXIpOworCQkJCQltb2RfdGltZXIoJmNhcmQtPm90aGVyLT5zdF90aW1lciwKKwkJCQkJCSAgamlmZmllcyArIElDTl9USU1FUl9EQ1JFQUQpOwogCQkJCQljYXJkLT5vdGhlci0+ZmxhZ3MgfD0gSUNOX0ZMQUdTX1JVTk5JTkc7CiAJCQkJfQogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKQEAgLTEwMjIsNyArMTAxNSw4IEBACiAKIC8qIFB1dCBjb21tYW5kLXN0cmluZ3MgaW50byB0aGUgY29tbWFuZC1xdWV1ZSBvZiB0aGUgSW50ZXJmYWNlICovCiBzdGF0aWMgaW50Ci1pY25fd3JpdGVjbWQoY29uc3QgdV9jaGFyICpidWYsIGludCBsZW4sIGludCB1c2VyLCBpY25fY2FyZCAqY2FyZCkKK2ljbl93cml0ZWNtZChjb25zdCB1X2NoYXIgX191c2VyICp1YnVmLCBjb25zdCB1X2NoYXIgKmtidWYsIGludCBsZW4sCisJICAgICBpbnQgdXNlciwgaWNuX2NhcmQgKmNhcmQpCiB7CiAJaW50IG1jaCA9IGNhcmQtPnNlY29uZGhhbGYgPyAyIDogMDsKIAlpbnQgcHA7CkBAIC0xMDQ1LDEwICsxMDM5LDEwIEBACiAJCWlmIChjb3VudCA+IGxlbikKIAkJCWNvdW50ID0gbGVuOwogCQlpZiAodXNlcikgewotCQkJaWYgKGNvcHlfZnJvbV91c2VyKG1zZywgYnVmLCBjb3VudCkpCisJCQlpZiAoY29weV9mcm9tX3VzZXIobXNnLCB1YnVmLCBjb3VudCkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0gZWxzZQotCQkJbWVtY3B5KG1zZywgYnVmLCBjb3VudCk7CisJCQltZW1jcHkobXNnLCBrYnVmLCBjb3VudCk7CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi5kZXZsb2NrLCBmbGFncyk7CiAJCWxhc3RtYXBfY2FyZCA9IGRldi5tY2FyZDsKQEAgLTExOTAsMjggKzExODQsMjggQEAKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIElDTl9JT0NUTF9HRVRNTUlPOgotCQkJcmV0dXJuIChsb25nKSBkZXYubWVtYWRkcjsKKwkJCXJldHVybiAobG9uZylkZXYubWVtYWRkcjsKIAkJY2FzZSBJQ05fSU9DVExfU0VUUE9SVDoKIAkJCWlmIChhID09IDB4MzAwIHx8IGEgPT0gMHgzMTAgfHwgYSA9PSAweDMyMCB8fCBhID09IDB4MzMwCiAJCQkgICAgfHwgYSA9PSAweDM0MCB8fCBhID09IDB4MzUwIHx8IGEgPT0gMHgzNjAgfHwKIAkJCSAgICBhID09IDB4MzA4IHx8IGEgPT0gMHgzMTggfHwgYSA9PSAweDMyOCB8fCBhID09IDB4MzM4CiAJCQkgICAgfHwgYSA9PSAweDM0OCB8fCBhID09IDB4MzU4IHx8IGEgPT0gMHgzNjgpIHsKLQkJCQlpZiAoY2FyZC0+cG9ydCAhPSAodW5zaWduZWQgc2hvcnQpIGEpIHsKLQkJCQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbigodW5zaWduZWQgc2hvcnQpIGEsIElDTl9QT1JUTEVOLCAiaWNuLWlzZG4iKSkgeworCQkJCWlmIChjYXJkLT5wb3J0ICE9ICh1bnNpZ25lZCBzaG9ydClhKSB7CisJCQkJCWlmICghcmVxdWVzdF9yZWdpb24oKHVuc2lnbmVkIHNob3J0KWEsIElDTl9QT1JUTEVOLCAiaWNuLWlzZG4iKSkgewogCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJCQkJICAgICAgICJpY246ICglcykgcG9ydHMgMHglMDN4LTB4JTAzeCBpbiB1c2UuXG4iLAotCQkJCQkJICAgICAgIENJRCwgKGludCkgYSwgKGludCkgYSArIElDTl9QT1JUTEVOKTsKKwkJCQkJCSAgICAgICBDSUQsIChpbnQpYSwgKGludClhICsgSUNOX1BPUlRMRU4pOwogCQkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJCX0KLQkJCQkJcmVsZWFzZV9yZWdpb24oKHVuc2lnbmVkIHNob3J0KSBhLCBJQ05fUE9SVExFTik7CisJCQkJCXJlbGVhc2VfcmVnaW9uKCh1bnNpZ25lZCBzaG9ydClhLCBJQ05fUE9SVExFTik7CiAJCQkJCWljbl9zdG9wY2FyZChjYXJkKTsKIAkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAkJCQkJaWYgKGNhcmQtPnJ2YWxpZCkKIAkJCQkJCXJlbGVhc2VfcmVnaW9uKGNhcmQtPnBvcnQsIElDTl9QT1JUTEVOKTsKLQkJCQkJY2FyZC0+cG9ydCA9ICh1bnNpZ25lZCBzaG9ydCkgYTsKKwkJCQkJY2FyZC0+cG9ydCA9ICh1bnNpZ25lZCBzaG9ydClhOwogCQkJCQljYXJkLT5ydmFsaWQgPSAwOwogCQkJCQlpZiAoY2FyZC0+ZG91YmxlUzApIHsKLQkJCQkJCWNhcmQtPm90aGVyLT5wb3J0ID0gKHVuc2lnbmVkIHNob3J0KSBhOworCQkJCQkJY2FyZC0+b3RoZXItPnBvcnQgPSAodW5zaWduZWQgc2hvcnQpYTsKIAkJCQkJCWNhcmQtPm90aGVyLT5ydmFsaWQgPSAwOwogCQkJCQl9CiAJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKQEAgLTEyMjMsOSArMTIxNyw5IEBACiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlicmVhazsKIAkJY2FzZSBJQ05fSU9DVExfR0VUUE9SVDoKLQkJCXJldHVybiAoaW50KSBjYXJkLT5wb3J0OworCQkJcmV0dXJuIChpbnQpY2FyZC0+cG9ydDsKIAkJY2FzZSBJQ05fSU9DVExfR0VURE9VQkxFOgotCQkJcmV0dXJuIChpbnQpIGNhcmQtPmRvdWJsZVMwOworCQkJcmV0dXJuIChpbnQpY2FyZC0+ZG91YmxlUzA7CiAJCWNhc2UgSUNOX0lPQ1RMX0RFQlVHVkFSOgogCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsCiAJCQkJCSAmY2FyZCwKQEAgLTEyNDYsMTAgKzEyNDAsMTEgQEAKIAkJCQlkZXYuZmlyc3Rsb2FkID0gMDsKIAkJCX0KIAkJCWljbl9zdG9wY2FyZChjYXJkKTsKLQkJCXJldHVybiAoaWNuX2xvYWRib290KGFyZywgY2FyZCkpOworCQkJcmV0dXJuIGljbl9sb2FkYm9vdChhcmcsIGNhcmQpOwogCQljYXNlIElDTl9JT0NUTF9MT0FEUFJPVE86CiAJCQlpY25fc3RvcGNhcmQoY2FyZCk7Ci0JCQlpZiAoKGkgPSAoaWNuX2xvYWRwcm90byhhcmcsIGNhcmQpKSkpCisJCQlpID0gKGljbl9sb2FkcHJvdG8oYXJnLCBjYXJkKSk7CisJCQlpZiAoaSkKIAkJCQlyZXR1cm4gaTsKIAkJCWlmIChjYXJkLT5kb3VibGVTMCkKIAkJCQlpID0gaWNuX2xvYWRwcm90byhhcmcgKyBJQ05fQ09ERV9TVEFHRTIsIGNhcmQtPm90aGVyKTsKQEAgLTEyNjIsMTkgKzEyNTcsMjAgQEAKIAkJCQkJICAgYXJnLAogCQkJCQkgICBzaXplb2YoY2RlZikpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIChpY25fYWRkY2FyZChjZGVmLnBvcnQsIGNkZWYuaWQxLCBjZGVmLmlkMikpOworCQkJcmV0dXJuIGljbl9hZGRjYXJkKGNkZWYucG9ydCwgY2RlZi5pZDEsIGNkZWYuaWQyKTsKIAkJCWJyZWFrOwogCQljYXNlIElDTl9JT0NUTF9MRUFTRURDRkc6CiAJCQlpZiAoYSkgewogCQkJCWlmICghY2FyZC0+bGVhc2VkKSB7CiAJCQkJCWNhcmQtPmxlYXNlZCA9IDE7Ci0JCQkJCXdoaWxlIChjYXJkLT5wdHlwZSA9PSBJU0ROX1BUWVBFX1VOS05PV04pIHsKKwkJCQkJd2hpbGUgKGNhcmQtPnB0eXBlID09IElTRE5fUFRZUEVfVU5LTk9XTikKIAkJCQkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKElDTl9CT09UX1RJTUVPVVQxKTsKLQkJCQkJfQogCQkJCQltc2xlZXBfaW50ZXJydXB0aWJsZShJQ05fQk9PVF9USU1FT1VUMSk7CiAJCQkJCXNwcmludGYoY2J1ZiwgIjAwO0ZWMk9OXG4wMTtFQVolY1xuMDI7RUFaJWNcbiIsCiAJCQkJCQkoYSAmIDEpID8gJzEnIDogJ0MnLCAoYSAmIDIpID8gJzInIDogJ0MnKTsKLQkJCQkJaSA9IGljbl93cml0ZWNtZChjYnVmLCBzdHJsZW4oY2J1ZiksIDAsIGNhcmQpOworCQkJCQlpID0gaWNuX3dyaXRlY21kKE5VTEwsIGNidWYsCisJCQkJCQkJIHN0cmxlbihjYnVmKSwKKwkJCQkJCQkgMCwgY2FyZCk7CiAJCQkJCXByaW50ayhLRVJOX0lORk8KIAkJCQkJICAgICAgICJpY246ICglcykgTGVhc2VkLWxpbmUgbW9kZSBlbmFibGVkXG4iLAogCQkJCQkgICAgICAgQ0lEKTsKQEAgLTEyODcsNyArMTI4Myw5IEBACiAJCQkJaWYgKGNhcmQtPmxlYXNlZCkgewogCQkJCQljYXJkLT5sZWFzZWQgPSAwOwogCQkJCQlzcHJpbnRmKGNidWYsICIwMDtGVjJPRkZcbiIpOwotCQkJCQlpID0gaWNuX3dyaXRlY21kKGNidWYsIHN0cmxlbihjYnVmKSwgMCwgY2FyZCk7CisJCQkJCWkgPSBpY25fd3JpdGVjbWQoTlVMTCwgY2J1ZiwKKwkJCQkJCQkgc3RybGVuKGNidWYpLAorCQkJCQkJCSAwLCBjYXJkKTsKIAkJCQkJcHJpbnRrKEtFUk5fSU5GTwogCQkJCQkgICAgICAgImljbjogKCVzKSBMZWFzZWQtbGluZSBtb2RlIGRpc2FibGVkXG4iLAogCQkJCQkgICAgICAgQ0lEKTsKQEAgLTEzMjEsMTAgKzEzMTksMTAgQEAKIAkJCQkvKiBOb3JtYWwgRGlhbCAqLwogCQkJCXN0cmNweShkY29kZSwgIkNBTCIpOwogCQkJc25wcmludGYoY2J1Ziwgc2l6ZW9mKGNidWYpLAotCQkJCSAiJTAyZDtEJXNfUiVzLCUwMmQsJTAyZCwlc1xuIiwgKGludCkgKGEgKyAxKSwKKwkJCQkgIiUwMmQ7RCVzX1IlcywlMDJkLCUwMmQsJXNcbiIsIChpbnQpKGEgKyAxKSwKIAkJCQkgZGNvZGUsIHAsIGMtPnBhcm0uc2V0dXAuc2kxLAogCQkJCSBjLT5wYXJtLnNldHVwLnNpMiwgYy0+cGFybS5zZXR1cC5lYXptc24pOwotCQkJaSA9IGljbl93cml0ZWNtZChjYnVmLCBzdHJsZW4oY2J1ZiksIDAsIGNhcmQpOworCQkJaSA9IGljbl93cml0ZWNtZChOVUxMLCBjYnVmLCBzdHJsZW4oY2J1ZiksIDAsIGNhcmQpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgSVNETl9DTURfQUNDRVBURDoKQEAgLTEzMzUsMTYgKzEzMzMsMTggQEAKIAkJCWlmIChjYXJkLT5md19yZXYgPj0gMzAwKSB7CiAJCQkJc3dpdGNoIChjYXJkLT5sMl9wcm90b1thIC0gMV0pIHsKIAkJCQljYXNlIElTRE5fUFJPVE9fTDJfWDc1SToKLQkJCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtCWDc1XG4iLCAoaW50KSBhKTsKKwkJCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtCWDc1XG4iLCAoaW50KWEpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIElTRE5fUFJPVE9fTDJfSERMQzoKLQkJCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtCVFJBXG4iLCAoaW50KSBhKTsKKwkJCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtCVFJBXG4iLCAoaW50KWEpOwogCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJaSA9IGljbl93cml0ZWNtZChjYnVmLCBzdHJsZW4oY2J1ZiksIDAsIGNhcmQpOworCQkJCWkgPSBpY25fd3JpdGVjbWQoTlVMTCwgY2J1ZiwKKwkJCQkJCSBzdHJsZW4oY2J1ZiksIDAsCisJCQkJCQkgY2FyZCk7CiAJCQl9Ci0JCQlzcHJpbnRmKGNidWYsICIlMDJkO0RDT05fUlxuIiwgKGludCkgYSk7Ci0JCQlpID0gaWNuX3dyaXRlY21kKGNidWYsIHN0cmxlbihjYnVmKSwgMCwgY2FyZCk7CisJCQlzcHJpbnRmKGNidWYsICIlMDJkO0RDT05fUlxuIiwgKGludClhKTsKKwkJCWkgPSBpY25fd3JpdGVjbWQoTlVMTCwgY2J1Ziwgc3RybGVuKGNidWYpLCAwLCBjYXJkKTsKIAkJfQogCQlicmVhazsKIAljYXNlIElTRE5fQ01EX0FDQ0VQVEI6CkBAIC0xMzU1LDE0ICsxMzU1LDE0IEBACiAJCQlpZiAoY2FyZC0+ZndfcmV2ID49IDMwMCkKIAkJCQlzd2l0Y2ggKGNhcmQtPmwyX3Byb3RvW2EgLSAxXSkgewogCQkJCWNhc2UgSVNETl9QUk9UT19MMl9YNzVJOgotCQkJCQlzcHJpbnRmKGNidWYsICIlMDJkO0JDT05fUixCWDc1XG4iLCAoaW50KSBhKTsKKwkJCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtCQ09OX1IsQlg3NVxuIiwgKGludClhKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBJU0ROX1BST1RPX0wyX0hETEM6Ci0JCQkJCXNwcmludGYoY2J1ZiwgIiUwMmQ7QkNPTl9SLEJUUkFcbiIsIChpbnQpIGEpOworCQkJCQlzcHJpbnRmKGNidWYsICIlMDJkO0JDT05fUixCVFJBXG4iLCAoaW50KWEpOwogCQkJCQlicmVhazsKIAkJCQl9IGVsc2UKLQkJCQlzcHJpbnRmKGNidWYsICIlMDJkO0JDT05fUlxuIiwgKGludCkgYSk7Ci0JCQlpID0gaWNuX3dyaXRlY21kKGNidWYsIHN0cmxlbihjYnVmKSwgMCwgY2FyZCk7CisJCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtCQ09OX1JcbiIsIChpbnQpYSk7CisJCQlpID0gaWNuX3dyaXRlY21kKE5VTEwsIGNidWYsIHN0cmxlbihjYnVmKSwgMCwgY2FyZCk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBJU0ROX0NNRF9IQU5HVVA6CkBAIC0xMzcwLDggKzEzNzAsOCBAQAogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCWlmIChjLT5hcmcgPCBJQ05fQkNIKSB7CiAJCQlhID0gYy0+YXJnICsgMTsKLQkJCXNwcmludGYoY2J1ZiwgIiUwMmQ7QkRJU19SXG4lMDJkO0RESVNfUlxuIiwgKGludCkgYSwgKGludCkgYSk7Ci0JCQlpID0gaWNuX3dyaXRlY21kKGNidWYsIHN0cmxlbihjYnVmKSwgMCwgY2FyZCk7CisJCQlzcHJpbnRmKGNidWYsICIlMDJkO0JESVNfUlxuJTAyZDtERElTX1JcbiIsIChpbnQpYSwgKGludClhKTsKKwkJCWkgPSBpY25fd3JpdGVjbWQoTlVMTCwgY2J1Ziwgc3RybGVuKGNidWYpLCAwLCBjYXJkKTsKIAkJfQogCQlicmVhazsKIAljYXNlIElTRE5fQ01EX1NFVEVBWjoKQEAgLTEzODIsMTIgKzEzODIsMTIgQEAKIAkJaWYgKGMtPmFyZyA8IElDTl9CQ0gpIHsKIAkJCWEgPSBjLT5hcmcgKyAxOwogCQkJaWYgKGNhcmQtPnB0eXBlID09IElTRE5fUFRZUEVfRVVSTykgewotCQkJCXNwcmludGYoY2J1ZiwgIiUwMmQ7TVMlcyVzXG4iLCAoaW50KSBhLAorCQkJCXNwcmludGYoY2J1ZiwgIiUwMmQ7TVMlcyVzXG4iLCAoaW50KWEsCiAJCQkJCWMtPnBhcm0ubnVtWzBdID8gIk4iIDogIkFMTCIsIGMtPnBhcm0ubnVtKTsKIAkJCX0gZWxzZQotCQkJCXNwcmludGYoY2J1ZiwgIiUwMmQ7RUFaJXNcbiIsIChpbnQpIGEsCisJCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtFQVolc1xuIiwgKGludClhLAogCQkJCQljLT5wYXJtLm51bVswXSA/IChjaGFyICopKGMtPnBhcm0ubnVtKSA6ICIwMTIzNDU2Nzg5Iik7Ci0JCQlpID0gaWNuX3dyaXRlY21kKGNidWYsIHN0cmxlbihjYnVmKSwgMCwgY2FyZCk7CisJCQlpID0gaWNuX3dyaXRlY21kKE5VTEwsIGNidWYsIHN0cmxlbihjYnVmKSwgMCwgY2FyZCk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBJU0ROX0NNRF9DTFJFQVo6CkBAIC0xMzk4LDEwICsxMzk4LDEwIEBACiAJCWlmIChjLT5hcmcgPCBJQ05fQkNIKSB7CiAJCQlhID0gYy0+YXJnICsgMTsKIAkJCWlmIChjYXJkLT5wdHlwZSA9PSBJU0ROX1BUWVBFX0VVUk8pCi0JCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtNU05DXG4iLCAoaW50KSBhKTsKKwkJCQlzcHJpbnRmKGNidWYsICIlMDJkO01TTkNcbiIsIChpbnQpYSk7CiAJCQllbHNlCi0JCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtFQVpDXG4iLCAoaW50KSBhKTsKLQkJCWkgPSBpY25fd3JpdGVjbWQoY2J1Ziwgc3RybGVuKGNidWYpLCAwLCBjYXJkKTsKKwkJCQlzcHJpbnRmKGNidWYsICIlMDJkO0VBWkNcbiIsIChpbnQpYSk7CisJCQlpID0gaWNuX3dyaXRlY21kKE5VTEwsIGNidWYsIHN0cmxlbihjYnVmKSwgMCwgY2FyZCk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBJU0ROX0NNRF9TRVRMMjoKQEAgLTE0MTEsMTUgKzE0MTEsMTUgQEAKIAkJCWEgPSBjLT5hcmc7CiAJCQlzd2l0Y2ggKGEgPj4gOCkgewogCQkJY2FzZSBJU0ROX1BST1RPX0wyX1g3NUk6Ci0JCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtCWDc1XG4iLCAoaW50KSAoYSAmIDI1NSkgKyAxKTsKKwkJCQlzcHJpbnRmKGNidWYsICIlMDJkO0JYNzVcbiIsIChpbnQpKGEgJiAyNTUpICsgMSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElTRE5fUFJPVE9fTDJfSERMQzoKLQkJCQlzcHJpbnRmKGNidWYsICIlMDJkO0JUUkFcbiIsIChpbnQpIChhICYgMjU1KSArIDEpOworCQkJCXNwcmludGYoY2J1ZiwgIiUwMmQ7QlRSQVxuIiwgKGludCkoYSAmIDI1NSkgKyAxKTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9Ci0JCQlpID0gaWNuX3dyaXRlY21kKGNidWYsIHN0cmxlbihjYnVmKSwgMCwgY2FyZCk7CisJCQlpID0gaWNuX3dyaXRlY21kKE5VTEwsIGNidWYsIHN0cmxlbihjYnVmKSwgMCwgY2FyZCk7CiAJCQljYXJkLT5sMl9wcm90b1thICYgMjU1XSA9IChhID4+IDgpOwogCQl9CiAJCWJyZWFrOwpAQCAtMTQ0Niw3ICsxNDQ2LDcgQEAKIAkJCXJldHVybiBwOwogCQlwID0gcC0+bmV4dDsKIAl9Ci0JcmV0dXJuIChpY25fY2FyZCAqKSAwOworCXJldHVybiAoaWNuX2NhcmQgKikwOwogfQogCiAvKgpAQCAtMTQ1OCw3ICsxNDU4LDcgQEAKIAlpY25fY2FyZCAqY2FyZCA9IGljbl9maW5kY2FyZChjLT5kcml2ZXIpOwogCiAJaWYgKGNhcmQpCi0JCXJldHVybiAoaWNuX2NvbW1hbmQoYywgY2FyZCkpOworCQlyZXR1cm4gaWNuX2NvbW1hbmQoYywgY2FyZCk7CiAJcHJpbnRrKEtFUk5fRVJSCiAJICAgICAgICJpY246IGlmX2NvbW1hbmQgJWQgY2FsbGVkIHdpdGggaW52YWxpZCBkcml2ZXJJZCAlZCFcbiIsCiAJICAgICAgIGMtPmNvbW1hbmQsIGMtPmRyaXZlcik7CkBAIC0xNDczLDcgKzE0NzMsNyBAQAogCWlmIChjYXJkKSB7CiAJCWlmICghKGNhcmQtPmZsYWdzICYgSUNOX0ZMQUdTX1JVTk5JTkcpKQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCXJldHVybiAoaWNuX3dyaXRlY21kKGJ1ZiwgbGVuLCAxLCBjYXJkKSk7CisJCXJldHVybiBpY25fd3JpdGVjbWQoYnVmLCBOVUxMLCBsZW4sIDEsIGNhcmQpOwogCX0KIAlwcmludGsoS0VSTl9FUlIKIAkgICAgICAgImljbjogaWZfd3JpdGVjbWQgY2FsbGVkIHdpdGggaW52YWxpZCBkcml2ZXJJZCFcbiIpOwpAQCAtMTQ4OCw3ICsxNDg4LDcgQEAKIAlpZiAoY2FyZCkgewogCQlpZiAoIShjYXJkLT5mbGFncyAmIElDTl9GTEFHU19SVU5OSU5HKSkKIAkJCXJldHVybiAtRU5PREVWOwotCQlyZXR1cm4gKGljbl9yZWFkc3RhdHVzKGJ1ZiwgbGVuLCBjYXJkKSk7CisJCXJldHVybiBpY25fcmVhZHN0YXR1cyhidWYsIGxlbiwgY2FyZCk7CiAJfQogCXByaW50ayhLRVJOX0VSUgogCSAgICAgICAiaWNuOiBpZl9yZWFkc3RhdHVzIGNhbGxlZCB3aXRoIGludmFsaWQgZHJpdmVySWQhXG4iKTsKQEAgLTE1MDMsNyArMTUwMyw3IEBACiAJaWYgKGNhcmQpIHsKIAkJaWYgKCEoY2FyZC0+ZmxhZ3MgJiBJQ05fRkxBR1NfUlVOTklORykpCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJcmV0dXJuIChpY25fc2VuZGJ1ZihjaGFubmVsLCBhY2ssIHNrYiwgY2FyZCkpOworCQlyZXR1cm4gaWNuX3NlbmRidWYoY2hhbm5lbCwgYWNrLCBza2IsIGNhcmQpOwogCX0KIAlwcmludGsoS0VSTl9FUlIKIAkgICAgICAgImljbjogaWZfc2VuZGJ1ZiBjYWxsZWQgd2l0aCBpbnZhbGlkIGRyaXZlcklkIVxuIik7CkBAIC0xNTIwLDEwICsxNTIwLDExIEBACiAJaWNuX2NhcmQgKmNhcmQ7CiAJaW50IGk7CiAKLQlpZiAoIShjYXJkID0ga3phbGxvYyhzaXplb2YoaWNuX2NhcmQpLCBHRlBfS0VSTkVMKSkpIHsKKwljYXJkID0ga3phbGxvYyhzaXplb2YoaWNuX2NhcmQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhcmQpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgImljbjogKCVzKSBDb3VsZCBub3QgYWxsb2NhdGUgY2FyZC1zdHJ1Y3QuXG4iLCBpZCk7Ci0JCXJldHVybiAoaWNuX2NhcmQgKikgMDsKKwkJcmV0dXJuIChpY25fY2FyZCAqKTA7CiAJfQogCXNwaW5fbG9ja19pbml0KCZjYXJkLT5sb2NrKTsKIAljYXJkLT5wb3J0ID0gcG9ydDsKQEAgLTE1NTUsNyArMTU1Niw3IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJpY246IFVuYWJsZSB0byByZWdpc3RlciAlc1xuIiwgaWQpOwogCQlrZnJlZShjYXJkKTsKLQkJcmV0dXJuIChpY25fY2FyZCAqKSAwOworCQlyZXR1cm4gKGljbl9jYXJkICopMDsKIAl9CiAJY2FyZC0+bXlpZCA9IGNhcmQtPmludGVyZmFjZS5jaGFubmVsczsKIAlzcHJpbnRmKGNhcmQtPnJlZ25hbWUsICJpY24taXNkbiAoJXMpIiwgY2FyZC0+aW50ZXJmYWNlLmlkKTsKQEAgLTE1NjgsMTYgKzE1NjksMTcgQEAKIAlpY25fY2FyZCAqY2FyZDsKIAlpY25fY2FyZCAqY2FyZDI7CiAKLQlpZiAoIShjYXJkID0gaWNuX2luaXRjYXJkKHBvcnQsIGlkMSkpKSB7CisJY2FyZCA9IGljbl9pbml0Y2FyZChwb3J0LCBpZDEpOworCWlmICghY2FyZCkKIAkJcmV0dXJuIC1FSU87Ci0JfQogCWlmICghc3RybGVuKGlkMikpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTwogCQkgICAgICAgImljbjogKCVzKSBJQ04tMkIsIHBvcnQgMHgleCBhZGRlZFxuIiwKIAkJICAgICAgIGNhcmQtPmludGVyZmFjZS5pZCwgcG9ydCk7CiAJCXJldHVybiAwOwogCX0KLQlpZiAoIShjYXJkMiA9IGljbl9pbml0Y2FyZChwb3J0LCBpZDIpKSkgeworCWNhcmQyID0gaWNuX2luaXRjYXJkKHBvcnQsIGlkMik7CisJaWYgKCFjYXJkMikgewogCQlwcmludGsoS0VSTl9JTkZPCiAJCSAgICAgICAiaWNuOiAoJXMpIGhhbGYgSUNOLTRCLCBwb3J0IDB4JXggYWRkZWRcbiIsIGlkMiwgcG9ydCk7CiAJCXJldHVybiAwOwpAQCAtMTYxMSwxMyArMTYxMywxNCBAQAogCWlmIChzdHIgJiYgKnN0cikgewogCQlzdHJsY3B5KHNpZCwgc3RyLCBzaXplb2Yoc2lkKSk7CiAJCWljbl9pZCA9IHNpZDsKLQkJaWYgKChwID0gc3RyY2hyKHNpZCwgJywnKSkpIHsKKwkJcCA9IHN0cmNocihzaWQsICcsJyk7CisJCWlmIChwKSB7CiAJCQkqcCsrID0gMDsKIAkJCXN0cmNweShzaWQyLCBwKTsKIAkJCWljbl9pZDIgPSBzaWQyOwogCQl9CiAJfQotCXJldHVybiAoMSk7CisJcmV0dXJuIDE7CiB9CiBfX3NldHVwKCJpY249IiwgaWNuX3NldHVwKTsKICNlbmRpZiAvKiBNT0RVTEUgKi8KQEAgLTE2MzQsNyArMTYzNyw4IEBACiAJZGV2LmZpcnN0bG9hZCA9IDE7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi5kZXZsb2NrKTsKIAotCWlmICgocCA9IHN0cmNocihyZXZpc2lvbiwgJzonKSkpIHsKKwlwID0gc3RyY2hyKHJldmlzaW9uLCAnOicpOworCWlmIChwKSB7CiAJCXN0cm5jcHkocmV2LCBwICsgMSwgMjApOwogCQlyZXZbMjBdID0gJ1wwJzsKIAkJcCA9IHN0cmNocihyZXYsICckJyk7CkBAIC0xNjQ0LDcgKzE2NDgsNyBAQAogCQlzdHJjcHkocmV2LCAiID8/PyAiKTsKIAlwcmludGsoS0VSTl9OT1RJQ0UgIklDTi1JU0ROLWRyaXZlciBSZXYlc21lbT0weCUwOGx4XG4iLCByZXYsCiAJICAgICAgIGRldi5tZW1hZGRyKTsKLQlyZXR1cm4gKGljbl9hZGRjYXJkKHBvcnRiYXNlLCBpY25faWQsIGljbl9pZDIpKTsKKwlyZXR1cm4gaWNuX2FkZGNhcmQocG9ydGJhc2UsIGljbl9pZCwgaWNuX2lkMik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpY25fZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2k0bC9wY2JpdC9jYXBpLmMgYi9kcml2ZXJzL3N0YWdpbmcvaTRsL3BjYml0L2NhcGkuYwppbmRleCA0ZTNjYmY4Li4zNzNmOTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaTRsL3BjYml0L2NhcGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaTRsL3BjYml0L2NhcGkuYwpAQCAtOTIsOSArOTIsNyBAQAogCQkqKHNrYl9wdXQoKnNrYiwgMSkpID0gMHg4MDsgICAgIC8qIFNwZWVjaAkJKi8KIAkJKihza2JfcHV0KCpza2IsIDEpKSA9IDB4MTA7ICAgICAvKiBDaXJjdWl0IE1vZGUJCSovCiAJCSooc2tiX3B1dCgqc2tiLCAxKSkgPSAweDIzOyAgICAgLyogQS1sYXcJCSovCi0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJLyogQmVhcmVyIENhcGFiaWxpdHkgLSBNYW5kYXRvcnkqLwogCQkqKHNrYl9wdXQoKnNrYiwgMSkpID0gMjsgICAgICAgIC8qIEJDMC5MZW5ndGgJCSovCiAJCSooc2tiX3B1dCgqc2tiLCAxKSkgPSAweDg4OyAgICAgLyogRGlnaXRhbCBJbmZvcm1hdGlvbgkqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2k0bC9wY2JpdC9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9pNGwvcGNiaXQvZHJ2LmMKaW5kZXggYzUyNzBlMi4uZDQxN2RmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2k0bC9wY2JpdC9kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaTRsL3BjYml0L2Rydi5jCkBAIC0zNTksMTEgKzM1OSw5IEBACiAJCSAqLwogI2lmZGVmIEJMT0NLX1RJTUVSCiAJCWlmIChjaGFuLT5ibG9ja190aW1lci5mdW5jdGlvbiA9PSBOVUxMKSB7Ci0JCQlpbml0X3RpbWVyKCZjaGFuLT5ibG9ja190aW1lcik7Ci0JCQljaGFuLT5ibG9ja190aW1lci5mdW5jdGlvbiA9ICAmcGNiaXRfYmxvY2tfdGltZXI7Ci0JCQljaGFuLT5ibG9ja190aW1lci5kYXRhID0gKGxvbmcpIGNoYW47Ci0JCQljaGFuLT5ibG9ja190aW1lci5leHBpcmVzID0gamlmZmllcyArIDEgKiBIWjsKLQkJCWFkZF90aW1lcigmY2hhbi0+YmxvY2tfdGltZXIpOworCQkJc2V0dXBfdGltZXIoJmNoYW4tPmJsb2NrX3RpbWVyLCAmcGNiaXRfYmxvY2tfdGltZXIsCisJCQkJICAgIChsb25nKWNoYW4pOworCQkJbW9kX3RpbWVyKCZjaGFuLT5ibG9ja190aW1lciwgamlmZmllcyArIDEgKiBIWik7CiAJCX0KICNlbmRpZgogCQlyZXR1cm4gMDsKQEAgLTgwNCwxMSArODAyLDcgQEAKIHsKIAlpc2RuX2N0cmwgY3RsOwogCi0JaW5pdF90aW1lcigmZGV2LT5zZXRfcnVubmluZ190aW1lcik7Ci0KLQlkZXYtPnNldF9ydW5uaW5nX3RpbWVyLmZ1bmN0aW9uID0gJnNldF9ydW5uaW5nX3RpbWVvdXQ7Ci0JZGV2LT5zZXRfcnVubmluZ190aW1lci5kYXRhID0gKHVsb25nKSBkZXY7Ci0JZGV2LT5zZXRfcnVubmluZ190aW1lci5leHBpcmVzID0gamlmZmllcyArIFNFVF9SVU5fVElNRU9VVDsKKwlzZXR1cF90aW1lcigmZGV2LT5zZXRfcnVubmluZ190aW1lciwgJnNldF9ydW5uaW5nX3RpbWVvdXQsICh1bG9uZylkZXYpOwogCiAJLyoga2ljayBpdCAqLwogCkBAIC04MTcsNyArODExLDcgQEAKIAl3cml0ZWIoKDB4ODBVIHwgKChkZXYtPnJjdl9zZXEgJiAweDA3KSA8PCAzKSB8IChkZXYtPnNlbmRfc2VxICYgMHgwNykpLAogCSAgICAgICBkZXYtPnNoX21lbSArIEJBTks0KTsKIAotCWFkZF90aW1lcigmZGV2LT5zZXRfcnVubmluZ190aW1lcik7CisJbW9kX3RpbWVyKCZkZXYtPnNldF9ydW5uaW5nX3RpbWVyLCBqaWZmaWVzICsgU0VUX1JVTl9USU1FT1VUKTsKIAogCXdhaXRfZXZlbnQoZGV2LT5zZXRfcnVubmluZ193cSwgZGV2LT5sMl9zdGF0ZSA9PSBMMl9SVU5OSU5HIHx8CiAJCQkJCWRldi0+bDJfc3RhdGUgPT0gTDJfRE9XTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaTRsL3BjYml0L2Vkc3MxLmMgYi9kcml2ZXJzL3N0YWdpbmcvaTRsL3BjYml0L2Vkc3MxLmMKaW5kZXggZTcyYzE2NC4uNmQyOTFkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2k0bC9wY2JpdC9lZHNzMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pNGwvcGNiaXQvZWRzczEuYwpAQCAtMjk4LDExICsyOTgsOCBAQAogCQkJYnJlYWs7CiAKIAlpZiAodGVudHJ5LT5pbml0ICE9IDB4ZmYpIHsKLQkJaW5pdF90aW1lcigmY2hhbi0+ZnNtX3RpbWVyKTsKLQkJY2hhbi0+ZnNtX3RpbWVyLmZ1bmN0aW9uID0gJnBjYml0X2ZzbV90aW1lcjsKLQkJY2hhbi0+ZnNtX3RpbWVyLmRhdGEgPSAodWxvbmcpIGNoYW47Ci0JCWNoYW4tPmZzbV90aW1lci5leHBpcmVzID0gamlmZmllcyArIHRlbnRyeS0+dGltZW91dCAqIEhaOwotCQlhZGRfdGltZXIoJmNoYW4tPmZzbV90aW1lcik7CisJCXNldHVwX3RpbWVyKCZjaGFuLT5mc21fdGltZXIsICZwY2JpdF9mc21fdGltZXIsICh1bG9uZyljaGFuKTsKKwkJbW9kX3RpbWVyKCZjaGFuLT5mc21fdGltZXIsIGppZmZpZXMgKyB0ZW50cnktPnRpbWVvdXQgKiBIWik7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaTRsL3BjYml0L2xheWVyMi5jIGIvZHJpdmVycy9zdGFnaW5nL2k0bC9wY2JpdC9sYXllcjIuYwppbmRleCA0NmUxMjQwLi5hMTM2YzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaTRsL3BjYml0L2xheWVyMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pNGwvcGNiaXQvbGF5ZXIyLmMKQEAgLTY0NSwxMSArNjQ1LDkgQEAKIAogCQlkZXYtPmwyX3N0YXRlID0gTDJfRE9XTjsKIAotCQlpbml0X3RpbWVyKCZkZXYtPmVycm9yX3JlY292ZXJfdGltZXIpOwotCQlkZXYtPmVycm9yX3JlY292ZXJfdGltZXIuZnVuY3Rpb24gPSAmcGNiaXRfbDJfZXJyX3JlY292ZXI7Ci0JCWRldi0+ZXJyb3JfcmVjb3Zlcl90aW1lci5kYXRhID0gKHVsb25nKSBkZXY7Ci0JCWRldi0+ZXJyb3JfcmVjb3Zlcl90aW1lci5leHBpcmVzID0gamlmZmllcyArIEVSUlRJTUU7Ci0JCWFkZF90aW1lcigmZGV2LT5lcnJvcl9yZWNvdmVyX3RpbWVyKTsKKwkJc2V0dXBfdGltZXIoJmRldi0+ZXJyb3JfcmVjb3Zlcl90aW1lciwgJnBjYml0X2wyX2Vycl9yZWNvdmVyLAorCQkJICAgICh1bG9uZylkZXYpOworCQltb2RfdGltZXIoJmRldi0+ZXJyb3JfcmVjb3Zlcl90aW1lciwgamlmZmllcyArIEVSUlRJTUUpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDAuaAppbmRleCA5YzhhOTU4Li40ZGNjODU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDAuaApAQCAtMTEzLDYgKzExMyw3IEBACiAjZGVmaW5lIFNDQTMwMDBfT1VUX0NUUkxfQlVGX1hfRU4JCTB4MTAKICNkZWZpbmUgU0NBMzAwMF9PVVRfQ1RSTF9CVUZfWV9FTgkJMHgwOAogI2RlZmluZSBTQ0EzMDAwX09VVF9DVFJMX0JVRl9aX0VOCQkweDA0CisjZGVmaW5lIFNDQTMwMDBfT1VUX0NUUkxfQlVGX0RJVl9NQVNLCQkweDAzCiAjZGVmaW5lIFNDQTMwMDBfT1VUX0NUUkxfQlVGX0RJVl80CQkweDAyCiAjZGVmaW5lIFNDQTMwMDBfT1VUX0NUUkxfQlVGX0RJVl8yCQkweDAxCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jCmluZGV4IGI1NjI1ZjUuLmQ2MjYxMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX2NvcmUuYwpAQCAtNDAyLDYgKzQwMiw3IEBACiAJCS5jaGFubmVsMiA9IG1vZCwJCQkJXAogCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJXAogCQkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fU0NBTEUpLFwKKwkJLmluZm9fbWFza19zaGFyZWRfYnlfYWxsID0gQklUKElJT19DSEFOX0lORk9fU0FNUF9GUkVRKSxcCiAJCS5hZGRyZXNzID0gaW5kZXgsCQkJCVwKIAkJLnNjYW5faW5kZXggPSBpbmRleCwJCQkJXAogCQkuc2Nhbl90eXBlID0gewkJCQkJXApAQCAtNDEyLDcgKzQxMyw3IEBACiAJCX0sCQkJCQkJXAogCQkuZXZlbnRfc3BlYyA9ICZzY2EzMDAwX2V2ZW50LAkJCVwKIAkJLm51bV9ldmVudF9zcGVjcyA9IDEsCQkJCVwKLQkgfQorCX0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHNjYTMwMDBfY2hhbm5lbHNbXSA9IHsKIAlTQ0EzMDAwX0NIQU4oMCwgSUlPX01PRF9YKSwKQEAgLTQ0Myw2ICs0NDQsOTcgQEAKIAkgICAgICAgU0NBMzAwMF9NRF9DVFJMX09SX1p9LAogfTsKIAorLyoqCisgKiBfX3NjYTMwMDBfZ2V0X2Jhc2VfZnJlcSgpIG9idGFpbiBtb2RlIHNwZWNpZmljIGJhc2UgZnJlcXVlbmN5CisgKgorICogbG9jayBtdXN0IGJlIGhlbGQKKyAqKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fc2NhMzAwMF9nZXRfYmFzZV9mcmVxKHN0cnVjdCBzY2EzMDAwX3N0YXRlICpzdCwKKwkJCQkJICBjb25zdCBzdHJ1Y3Qgc2NhMzAwMF9jaGlwX2luZm8gKmluZm8sCisJCQkJCSAgaW50ICpiYXNlX2ZyZXEpCit7CisJaW50IHJldDsKKworCXJldCA9IHNjYTMwMDBfcmVhZF9kYXRhX3Nob3J0KHN0LCBTQ0EzMDAwX1JFR19BRERSX01PREUsIDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXN3aXRjaCAoMHgwMyAmIHN0LT5yeFswXSkgeworCWNhc2UgU0NBMzAwMF9NRUFTX01PREVfTk9STUFMOgorCQkqYmFzZV9mcmVxID0gaW5mby0+bWVhc3VyZW1lbnRfbW9kZV9mcmVxOworCQlicmVhazsKKwljYXNlIFNDQTMwMDBfTUVBU19NT0RFX09QXzE6CisJCSpiYXNlX2ZyZXEgPSBpbmZvLT5vcHRpb25fbW9kZV8xX2ZyZXE7CisJCWJyZWFrOworCWNhc2UgU0NBMzAwMF9NRUFTX01PREVfT1BfMjoKKwkJKmJhc2VfZnJlcSA9IGluZm8tPm9wdGlvbl9tb2RlXzJfZnJlcTsKKwkJYnJlYWs7CisJfQorZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogcmVhZF9yYXcgaGFuZGxlciBmb3IgSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEKKyAqCisgKiBsb2NrIG11c3QgYmUgaGVsZAorICoqLworc3RhdGljIGludCByZWFkX3Jhd19zYW1wX2ZyZXEoc3RydWN0IHNjYTMwMDBfc3RhdGUgKnN0LCBpbnQgKnZhbCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gX19zY2EzMDAwX2dldF9iYXNlX2ZyZXEoc3QsIHN0LT5pbmZvLCB2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzY2EzMDAwX3JlYWRfY3RybF9yZWcoc3QsIFNDQTMwMDBfUkVHX0NUUkxfU0VMX09VVF9DVFJMKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmICgqdmFsID4gMCkgeworCQlyZXQgJj0gU0NBMzAwMF9PVVRfQ1RSTF9CVUZfRElWX01BU0s7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgU0NBMzAwMF9PVVRfQ1RSTF9CVUZfRElWXzI6CisJCQkqdmFsIC89IDI7CisJCQlicmVhazsKKwkJY2FzZSBTQ0EzMDAwX09VVF9DVFJMX0JVRl9ESVZfNDoKKwkJCSp2YWwgLz0gNDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd3JpdGVfcmF3IGhhbmRsZXIgZm9yIElJT19DSEFOX0lORk9fU0FNUF9GUkVRCisgKgorICogbG9jayBtdXN0IGJlIGhlbGQKKyAqKi8KK3N0YXRpYyBpbnQgd3JpdGVfcmF3X3NhbXBfZnJlcShzdHJ1Y3Qgc2NhMzAwMF9zdGF0ZSAqc3QsIGludCB2YWwpCit7CisJaW50IHJldCwgYmFzZV9mcmVxLCBjdHJsdmFsOworCisJcmV0ID0gX19zY2EzMDAwX2dldF9iYXNlX2ZyZXEoc3QsIHN0LT5pbmZvLCAmYmFzZV9mcmVxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc2NhMzAwMF9yZWFkX2N0cmxfcmVnKHN0LCBTQ0EzMDAwX1JFR19DVFJMX1NFTF9PVVRfQ1RSTCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwljdHJsdmFsID0gcmV0ICYgflNDQTMwMDBfT1VUX0NUUkxfQlVGX0RJVl9NQVNLOworCisJaWYgKHZhbCA9PSBiYXNlX2ZyZXEgLyAyKQorCQljdHJsdmFsIHw9IFNDQTMwMDBfT1VUX0NUUkxfQlVGX0RJVl8yOworCWlmICh2YWwgPT0gYmFzZV9mcmVxIC8gNCkKKwkJY3RybHZhbCB8PSBTQ0EzMDAwX09VVF9DVFJMX0JVRl9ESVZfNDsKKwllbHNlIGlmICh2YWwgIT0gYmFzZV9mcmVxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzY2EzMDAwX3dyaXRlX2N0cmxfcmVnKHN0LCBTQ0EzMDAwX1JFR19DVFJMX1NFTF9PVVRfQ1RSTCwKKwkJCQkgICAgIGN0cmx2YWwpOworfQorCiBzdGF0aWMgaW50IHNjYTMwMDBfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKIAkJCSAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKIAkJCSAgICBpbnQgKnZhbCwKQEAgLTQ5NSwxMSArNTg3LDM4IEBACiAJCSp2YWwgPSAtMjE0OwogCQkqdmFsMiA9IDYwMDAwMDsKIAkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUToKKwkJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCQlyZXQgPSByZWFkX3Jhd19zYW1wX2ZyZXEoc3QsIHZhbCk7CisJCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCQlyZXR1cm4gcmV0ID8gcmV0IDogSUlPX1ZBTF9JTlQ7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogfQogCitzdGF0aWMgaW50IHNjYTMwMDBfd3JpdGVfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgICBpbnQgdmFsLCBpbnQgdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBzY2EzMDAwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVE6CisJCWlmICh2YWwyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwkJcmV0ID0gd3JpdGVfcmF3X3NhbXBfZnJlcShzdCwgdmFsKTsKKwkJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisJCXJldHVybiByZXQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogLyoqCiAgKiBzY2EzMDAwX3JlYWRfYXZfZnJlcSgpIHN5c2ZzIGZ1bmN0aW9uIHRvIGdldCBhdmFpbGFibGUgZnJlcXVlbmNpZXMKICAqCkBAIC01NDgsMTMzICs2NjcsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKioKLSAqIF9fc2NhMzAwMF9nZXRfYmFzZV9mcmVxKCkgb2J0YWluIG1vZGUgc3BlY2lmaWMgYmFzZSBmcmVxdWVuY3kKLSAqCi0gKiBsb2NrIG11c3QgYmUgaGVsZAotICoqLwotc3RhdGljIGlubGluZSBpbnQgX19zY2EzMDAwX2dldF9iYXNlX2ZyZXEoc3RydWN0IHNjYTMwMDBfc3RhdGUgKnN0LAotCQkJCQkgIGNvbnN0IHN0cnVjdCBzY2EzMDAwX2NoaXBfaW5mbyAqaW5mbywKLQkJCQkJICBpbnQgKmJhc2VfZnJlcSkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc2NhMzAwMF9yZWFkX2RhdGFfc2hvcnQoc3QsIFNDQTMwMDBfUkVHX0FERFJfTU9ERSwgMSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl9yZXQ7Ci0Jc3dpdGNoICgweDAzICYgc3QtPnJ4WzBdKSB7Ci0JY2FzZSBTQ0EzMDAwX01FQVNfTU9ERV9OT1JNQUw6Ci0JCSpiYXNlX2ZyZXEgPSBpbmZvLT5tZWFzdXJlbWVudF9tb2RlX2ZyZXE7Ci0JCWJyZWFrOwotCWNhc2UgU0NBMzAwMF9NRUFTX01PREVfT1BfMToKLQkJKmJhc2VfZnJlcSA9IGluZm8tPm9wdGlvbl9tb2RlXzFfZnJlcTsKLQkJYnJlYWs7Ci0JY2FzZSBTQ0EzMDAwX01FQVNfTU9ERV9PUF8yOgotCQkqYmFzZV9mcmVxID0gaW5mby0+b3B0aW9uX21vZGVfMl9mcmVxOwotCQlicmVhazsKLQl9Ci1lcnJvcl9yZXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBzY2EzMDAwX3JlYWRfZnJlcXVlbmN5KCkgc3lzZnMgaW50ZXJmYWNlIHRvIGdldCB0aGUgY3VycmVudCBmcmVxdWVuY3kKLSAqKi8KLXN0YXRpYyBzc2l6ZV90IHNjYTMwMDBfcmVhZF9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKLQlzdHJ1Y3Qgc2NhMzAwMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCWludCByZXQsIGxlbiA9IDAsIGJhc2VfZnJlcSA9IDAsIHZhbDsKLQotCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKLQlyZXQgPSBfX3NjYTMwMDBfZ2V0X2Jhc2VfZnJlcShzdCwgc3QtPmluZm8sICZiYXNlX2ZyZXEpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfcmV0X211dDsKLQlyZXQgPSBzY2EzMDAwX3JlYWRfY3RybF9yZWcoc3QsIFNDQTMwMDBfUkVHX0NUUkxfU0VMX09VVF9DVFJMKTsKLQltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9yZXQ7Ci0JdmFsID0gcmV0OwotCWlmIChiYXNlX2ZyZXEgPiAwKQotCQlzd2l0Y2ggKHZhbCAmIDB4MDMpIHsKLQkJY2FzZSAweDAwOgotCQljYXNlIDB4MDM6Ci0JCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBiYXNlX2ZyZXEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgwMToKLQkJCWxlbiA9IHNwcmludGYoYnVmLCAiJWRcbiIsIGJhc2VfZnJlcSAvIDIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgwMjoKLQkJCWxlbiA9IHNwcmludGYoYnVmLCAiJWRcbiIsIGJhc2VfZnJlcSAvIDQpOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGxlbjsKLWVycm9yX3JldF9tdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7Ci1lcnJvcl9yZXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBzY2EzMDAwX3NldF9mcmVxdWVuY3koKSBzeXNmcyBpbnRlcmZhY2UgdG8gc2V0IHRoZSBjdXJyZW50IGZyZXF1ZW5jeQotICoqLwotc3RhdGljIHNzaXplX3Qgc2NhMzAwMF9zZXRfZnJlcXVlbmN5KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLAotCQkJCSAgICAgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKLQlzdHJ1Y3Qgc2NhMzAwMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCWludCByZXQsIGJhc2VfZnJlcSA9IDA7Ci0JaW50IGN0cmx2YWw7Ci0JaW50IHZhbDsKLQotCXJldCA9IGtzdHJ0b2ludChidWYsIDEwLCAmdmFsKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JbXV0ZXhfbG9jaygmc3QtPmxvY2spOwotCS8qIFdoYXQgbW9kZSBhcmUgd2UgaW4/ICovCi0JcmV0ID0gX19zY2EzMDAwX2dldF9iYXNlX2ZyZXEoc3QsIHN0LT5pbmZvLCAmYmFzZV9mcmVxKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX2ZyZWVfbG9jazsKLQotCXJldCA9IHNjYTMwMDBfcmVhZF9jdHJsX3JlZyhzdCwgU0NBMzAwMF9SRUdfQ1RSTF9TRUxfT1VUX0NUUkwpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yX2ZyZWVfbG9jazsKLQljdHJsdmFsID0gcmV0OwotCS8qIGNsZWFyIHRoZSBiaXRzICovCi0JY3RybHZhbCAmPSB+MHgwMzsKLQotCWlmICh2YWwgPT0gYmFzZV9mcmVxIC8gMikgewotCQljdHJsdmFsIHw9IFNDQTMwMDBfT1VUX0NUUkxfQlVGX0RJVl8yOwotCX0gZWxzZSBpZiAodmFsID09IGJhc2VfZnJlcSAvIDQpIHsKLQkJY3RybHZhbCB8PSBTQ0EzMDAwX09VVF9DVFJMX0JVRl9ESVZfNDsKLQl9IGVsc2UgaWYgKHZhbCAhPSBiYXNlX2ZyZXEpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJvcl9mcmVlX2xvY2s7Ci0JfQotCXJldCA9IHNjYTMwMDBfd3JpdGVfY3RybF9yZWcoc3QsIFNDQTMwMDBfUkVHX0NUUkxfU0VMX09VVF9DVFJMLAotCQkJCSAgICAgY3RybHZhbCk7Ci1lcnJvcl9mcmVlX2xvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7Ci0KLQlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwotfQotCiAvKgogICogU2hvdWxkIG9ubHkgcmVhbGx5IGJlIHJlZ2lzdGVyZWQgaWYgcmluZyBidWZmZXIgc3VwcG9ydCBpcyBjb21waWxlZCBpbi4KICAqIERvZXMgbm8gaGFybSBob3dldmVyIGFuZCBkb2luZyBpdCByaWdodCB3b3VsZCBhZGQgYSBmYWlyIGJpdCBvZiBjb21wbGV4aXR5CiAgKi8KIHN0YXRpYyBJSU9fREVWX0FUVFJfU0FNUF9GUkVRX0FWQUlMKHNjYTMwMDBfcmVhZF9hdl9mcmVxKTsKIAotc3RhdGljIElJT19ERVZfQVRUUl9TQU1QX0ZSRVEoU19JV1VTUiB8IFNfSVJVR08sCi0JCQkgICAgICBzY2EzMDAwX3JlYWRfZnJlcXVlbmN5LAotCQkJICAgICAgc2NhMzAwMF9zZXRfZnJlcXVlbmN5KTsKLQogLyoqCiAgKiBzY2EzMDAwX3JlYWRfdGhyZXNoKCkgLSBxdWVyeSBvZiBhIHRocmVzaG9sZAogICoqLwpAQCAtNzUxLDcgKzc0OSw2IEBACiAJJmlpb19kZXZfYXR0cl9tZWFzdXJlbWVudF9tb2RlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAogCSZpaW9fZGV2X2F0dHJfbWVhc3VyZW1lbnRfbW9kZS5kZXZfYXR0ci5hdHRyLAogCSZpaW9fZGV2X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5LmRldl9hdHRyLmF0dHIsCiAJTlVMTCwKIH07CiAKQEAgLTEwODYsNiArMTA4Myw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIHNjYTMwMDBfaW5mbyA9IHsKIAkuYXR0cnMgPSAmc2NhMzAwMF9hdHRyaWJ1dGVfZ3JvdXAsCiAJLnJlYWRfcmF3ID0gJnNjYTMwMDBfcmVhZF9yYXcsCisJLndyaXRlX3JhdyA9ICZzY2EzMDAwX3dyaXRlX3JhdywKIAkuZXZlbnRfYXR0cnMgPSAmc2NhMzAwMF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAsCiAJLnJlYWRfZXZlbnRfdmFsdWUgPSAmc2NhMzAwMF9yZWFkX3RocmVzaCwKIAkud3JpdGVfZXZlbnRfdmFsdWUgPSAmc2NhMzAwMF93cml0ZV90aHJlc2gsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyODBhLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyODBhLmMKaW5kZXggMjE3N2YxZC4uYjQ2MGRkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjgwYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI4MGEuYwpAQCAtNDc4LDcgKzQ3OCw3IEBACiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3MjgwX2F0dHJpYnV0ZXNbQUQ3MjgwQV9NQVhfQ0hBSU4gKgogCQkJCQkgICBBRDcyODBBX0NFTExTX1BFUl9ERVYgKiAyICsgMV07CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzI4MF9hdHRyc19ncm91cCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzI4MF9hdHRyc19ncm91cCA9IHsKIAkuYXR0cnMgPSBhZDcyODBfYXR0cmlidXRlcywKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW1wZWRhbmNlLWFuYWx5emVyL2FkNTkzMy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXBlZGFuY2UtYW5hbHl6ZXIvYWQ1OTMzLmMKaW5kZXggMTcwYWM5OC4uNWVlY2YxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXBlZGFuY2UtYW5hbHl6ZXIvYWQ1OTMzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXBlZGFuY2UtYW5hbHl6ZXIvYWQ1OTMzLmMKQEAgLTE1Niw4ICsxNTYsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW50IGFkNTkzM19pMmNfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCSAgICAgIHU4IHJlZywgdTggbGVuLCB1OCAqZGF0YSkKK3N0YXRpYyBpbnQgYWQ1OTMzX2kyY193cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IGxlbiwgdTggKmRhdGEpCiB7CiAJaW50IHJldDsKIApAQCAtMTcxLDggKzE3MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWQ1OTMzX2kyY19yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgICAgICB1OCByZWcsIHU4IGxlbiwgdTggKmRhdGEpCitzdGF0aWMgaW50IGFkNTkzM19pMmNfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IGxlbiwgdTggKmRhdGEpCiB7CiAJaW50IHJldDsKIApAQCAtMjY5LDcgKzI2Nyw4IEBACiAJZGF0ID0gY3B1X3RvX2JlMTYoc3QtPnNldHRsaW5nX2N5Y2xlcyk7CiAKIAlyZXQgPSBhZDU5MzNfaTJjX3dyaXRlKHN0LT5jbGllbnQsCi0JCQlBRDU5MzNfUkVHX1NFVFRMSU5HX0NZQ0xFUywgMiwgKHU4ICopJmRhdCk7CisJCQkgICAgICAgQUQ1OTMzX1JFR19TRVRUTElOR19DWUNMRVMsCisJCQkgICAgICAgMiwgKHU4ICopJmRhdCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTI5NCw4ICsyOTMsOCBAQAogICovCiAKIHN0YXRpYyBzc2l6ZV90IGFkNTkzM19zaG93X2ZyZXF1ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQljaGFyICpidWYpCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKIAlzdHJ1Y3QgYWQ1OTMzX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CkBAIC0zMjIsOSArMzIxLDkgQEAKIH0KIAogc3RhdGljIHNzaXplX3QgYWQ1OTMzX3N0b3JlX2ZyZXF1ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCQkJIHNpemVfdCBsZW4pCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY29uc3QgY2hhciAqYnVmLAorCQkJCSAgICAgIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CiAJc3RydWN0IGFkNTkzM19zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtMzU3LDggKzM1Niw4IEBACiAJCQlBRDU5MzNfUkVHX0ZSRVFfSU5DKTsKIAogc3RhdGljIHNzaXplX3QgYWQ1OTMzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJY2hhciAqYnVmKQorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CiAJc3RydWN0IGFkNTkzM19zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtMzk5LDkgKzM5OCw5IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkNTkzM19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCQkJIHNpemVfdCBsZW4pCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLAorCQkJICAgIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CiAJc3RydWN0IGFkNTkzM19zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtNDE5LDYgKzQxOCw3IEBACiAJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAJc3dpdGNoICgodTMyKXRoaXNfYXR0ci0+YWRkcmVzcykgewogCWNhc2UgQUQ1OTMzX09VVF9SQU5HRToKKwkJcmV0ID0gLUVJTlZBTDsKIAkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKIAkJCWlmICh2YWwgPT0gc3QtPnJhbmdlX2F2YWlsW2ldKSB7CiAJCQkJc3QtPmN0cmxfaGIgJj0gfkFENTkzM19DVFJMX1JBTkdFKDB4Myk7CkBAIC00MjYsNyArNDI2LDYgQEAKIAkJCQlyZXQgPSBhZDU5MzNfY21kKHN0LCAwKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJcmV0ID0gLUVJTlZBTDsKIAkJYnJlYWs7CiAJY2FzZSBBRDU5MzNfSU5fUEdBX0dBSU46CiAJCWlmIChzeXNmc19zdHJlcShidWYsICIxIikpIHsKQEAgLTQ1MSw3ICs0NTAsOCBAQAogCiAJCWRhdCA9IGNwdV90b19iZTE2KHZhbCk7CiAJCXJldCA9IGFkNTkzM19pMmNfd3JpdGUoc3QtPmNsaWVudCwKLQkJCQlBRDU5MzNfUkVHX1NFVFRMSU5HX0NZQ0xFUywgMiwgKHU4ICopJmRhdCk7CisJCQkJICAgICAgIEFENTkzM19SRUdfU0VUVExJTkdfQ1lDTEVTLAorCQkJCSAgICAgICAyLCAodTggKikmZGF0KTsKIAkJYnJlYWs7CiAJY2FzZSBBRDU5MzNfRlJFUV9QT0lOVFM6CiAJCXZhbCA9IGNsYW1wKHZhbCwgKHUxNikwLCAodTE2KTUxMSk7CkBAIC01NDUsOCArNTQ1LDggQEAKIAkJCWdvdG8gb3V0OwogCiAJCXJldCA9IGFkNTkzM19pMmNfcmVhZChzdC0+Y2xpZW50LAotCQkJCUFENTkzM19SRUdfVEVNUF9EQVRBLCAyLAotCQkJCSh1OCAqKSZkYXQpOworCQkJCSAgICAgIEFENTkzM19SRUdfVEVNUF9EQVRBLAorCQkJCSAgICAgIDIsICh1OCAqKSZkYXQpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0OwogCQltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOwpAQCAtNzA1LDcgKzcwNSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgYWQ1OTMzX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkJICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCWludCByZXQsIHZvbHRhZ2VfdXYgPSAwOwogCXN0cnVjdCBhZDU5MzNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZjbGllbnQtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L2lzbDI5MDE4LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L2lzbDI5MDE4LmMKaW5kZXggNzZkOWY3NC4uYTc2N2E0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9pc2wyOTAxOC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvaXNsMjkwMTguYwpAQCAtMTUsMTAgKzE1LDYgQEAKICAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQkwMjExMC0xMzAxLCBVU0EuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzIsMjUgKzI4LDI1IEBACiAjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogCi0jZGVmaW5lIENPTlZFUlNJT05fVElNRV9NUwkJMTAwCisjZGVmaW5lIElTTDI5MDE4X0NPTlZfVElNRV9NUwkJMTAwCiAKICNkZWZpbmUgSVNMMjkwMThfUkVHX0FERF9DT01NQU5EMQkweDAwCi0jZGVmaW5lIENPTU1NQU5EMV9PUE1PREVfU0hJRlQJCTUKLSNkZWZpbmUgQ09NTU1BTkQxX09QTU9ERV9NQVNLCQkoNyA8PCBDT01NTUFORDFfT1BNT0RFX1NISUZUKQotI2RlZmluZSBDT01NTUFORDFfT1BNT0RFX1BPV0VSX0RPV04JMAotI2RlZmluZSBDT01NTUFORDFfT1BNT0RFX0FMU19PTkNFCTEKLSNkZWZpbmUgQ09NTU1BTkQxX09QTU9ERV9JUl9PTkNFCTIKLSNkZWZpbmUgQ09NTU1BTkQxX09QTU9ERV9QUk9YX09OQ0UJMworI2RlZmluZSBJU0wyOTAxOF9DTUQxX09QTU9ERV9TSElGVAk1CisjZGVmaW5lIElTTDI5MDE4X0NNRDFfT1BNT0RFX01BU0sJKDcgPDwgSVNMMjkwMThfQ01EMV9PUE1PREVfU0hJRlQpCisjZGVmaW5lIElTTDI5MDE4X0NNRDFfT1BNT0RFX1BPV0VSX0RPV04JMAorI2RlZmluZSBJU0wyOTAxOF9DTUQxX09QTU9ERV9BTFNfT05DRQkxCisjZGVmaW5lIElTTDI5MDE4X0NNRDFfT1BNT0RFX0lSX09OQ0UJMgorI2RlZmluZSBJU0wyOTAxOF9DTUQxX09QTU9ERV9QUk9YX09OQ0UJMwogCi0jZGVmaW5lIElTTDI5MDE4X1JFR19BRERfQ09NTUFORElJCTB4MDEKLSNkZWZpbmUgQ09NTUFORElJX1JFU09MVVRJT05fU0hJRlQJMgotI2RlZmluZSBDT01NQU5ESUlfUkVTT0xVVElPTl9NQVNLCSgweDMgPDwgQ09NTUFORElJX1JFU09MVVRJT05fU0hJRlQpCisjZGVmaW5lIElTTDI5MDE4X1JFR19BRERfQ09NTUFORDIJMHgwMQorI2RlZmluZSBJU0wyOTAxOF9DTUQyX1JFU09MVVRJT05fU0hJRlQJMgorI2RlZmluZSBJU0wyOTAxOF9DTUQyX1JFU09MVVRJT05fTUFTSwkoMHgzIDw8IElTTDI5MDE4X0NNRDJfUkVTT0xVVElPTl9TSElGVCkKIAotI2RlZmluZSBDT01NQU5ESUlfUkFOR0VfU0hJRlQJCTAKLSNkZWZpbmUgQ09NTUFORElJX1JBTkdFX01BU0sJCSgweDMgPDwgQ09NTUFORElJX1JBTkdFX1NISUZUKQorI2RlZmluZSBJU0wyOTAxOF9DTUQyX1JBTkdFX1NISUZUCTAKKyNkZWZpbmUgSVNMMjkwMThfQ01EMl9SQU5HRV9NQVNLCSgweDMgPDwgSVNMMjkwMThfQ01EMl9SQU5HRV9TSElGVCkKIAotI2RlZmluZSBDT01NQU5ESUlfU0NIRU1FX1NISUZUCQk3Ci0jZGVmaW5lIENPTU1BTkRJSV9TQ0hFTUVfTUFTSwkJKDB4MSA8PCBDT01NQU5ESUlfU0NIRU1FX1NISUZUKQorI2RlZmluZSBJU0wyOTAxOF9DTUQyX1NDSEVNRV9TSElGVAk3CisjZGVmaW5lIElTTDI5MDE4X0NNRDJfU0NIRU1FX01BU0sJKDB4MSA8PCBJU0wyOTAxOF9DTUQyX1NDSEVNRV9TSElGVCkKIAogI2RlZmluZSBJU0wyOTAxOF9SRUdfQUREX0RBVEFfTFNCCTB4MDIKICNkZWZpbmUgSVNMMjkwMThfUkVHX0FERF9EQVRBX01TQgkweDAzCkBAIC0xMjcsMTMgKzEyMywxMyBAQAogCWlmIChpID49IEFSUkFZX1NJWkUoaXNsMjkwMThfaW50X3V0aW1lc1tjaGlwLT50eXBlXSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoaXAtPnJlZ21hcCwgSVNMMjkwMThfUkVHX0FERF9DT01NQU5ESUksCi0JCQkJIENPTU1BTkRJSV9SRVNPTFVUSU9OX01BU0ssCi0JCQkJIGkgPDwgQ09NTUFORElJX1JFU09MVVRJT05fU0hJRlQpOworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhjaGlwLT5yZWdtYXAsIElTTDI5MDE4X1JFR19BRERfQ09NTUFORDIsCisJCQkJIElTTDI5MDE4X0NNRDJfUkVTT0xVVElPTl9NQVNLLAorCQkJCSBpIDw8IElTTDI5MDE4X0NNRDJfUkVTT0xVVElPTl9TSElGVCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQkvKiBrZWVwIHRoZSBzYW1lIHJhbmdlIHdoZW4gaW50ZWdyYXRpb24gdGltZSBjaGFuZ2VzICovCisJLyogS2VlcCB0aGUgc2FtZSByYW5nZSB3aGVuIGludGVncmF0aW9uIHRpbWUgY2hhbmdlcyAqLwogCWludF90aW1lID0gY2hpcC0+aW50X3RpbWU7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXNsMjkwMThfc2NhbGVzW2ludF90aW1lXSk7ICsraSkgewogCQlpZiAoY2hpcC0+c2NhbGUuc2NhbGUgPT0gaXNsMjkwMThfc2NhbGVzW2ludF90aW1lXVtpXS5zY2FsZSAmJgpAQCAtMTYzLDkgKzE1OSw5IEBACiAJaWYgKGkgPj0gQVJSQVlfU0laRShpc2wyOTAxOF9zY2FsZXNbY2hpcC0+aW50X3RpbWVdKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoY2hpcC0+cmVnbWFwLCBJU0wyOTAxOF9SRUdfQUREX0NPTU1BTkRJSSwKLQkJCQkgQ09NTUFORElJX1JBTkdFX01BU0ssCi0JCQkJIGkgPDwgQ09NTUFORElJX1JBTkdFX1NISUZUKTsKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoY2hpcC0+cmVnbWFwLCBJU0wyOTAxOF9SRUdfQUREX0NPTU1BTkQyLAorCQkJCSBJU0wyOTAxOF9DTUQyX1JBTkdFX01BU0ssCisJCQkJIGkgPDwgSVNMMjkwMThfQ01EMl9SQU5HRV9TSElGVCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTE4MywxMyArMTc5LDEzIEBACiAKIAkvKiBTZXQgbW9kZSAqLwogCXN0YXR1cyA9IHJlZ21hcF93cml0ZShjaGlwLT5yZWdtYXAsIElTTDI5MDE4X1JFR19BRERfQ09NTUFORDEsCi0JCQkgICAgICBtb2RlIDw8IENPTU1NQU5EMV9PUE1PREVfU0hJRlQpOworCQkJICAgICAgbW9kZSA8PCBJU0wyOTAxOF9DTUQxX09QTU9ERV9TSElGVCk7CiAJaWYgKHN0YXR1cykgewogCQlkZXZfZXJyKGRldiwKIAkJCSJFcnJvciBpbiBzZXR0aW5nIG9wZXJhdGluZyBtb2RlIGVyciAlZFxuIiwgc3RhdHVzKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9Ci0JbXNsZWVwKENPTlZFUlNJT05fVElNRV9NUyk7CisJbXNsZWVwKElTTDI5MDE4X0NPTlZfVElNRV9NUyk7CiAJc3RhdHVzID0gcmVnbWFwX3JlYWQoY2hpcC0+cmVnbWFwLCBJU0wyOTAxOF9SRUdfQUREX0RBVEFfTFNCLCAmbHNiKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlkZXZfZXJyKGRldiwKQEAgLTIxMyw4ICsyMDksOCBAQAogCWludCBsdXhfZGF0YTsKIAl1bnNpZ25lZCBpbnQgZGF0YV94X3JhbmdlOwogCi0JbHV4X2RhdGEgPSBpc2wyOTAxOF9yZWFkX3NlbnNvcl9pbnB1dChjaGlwLCBDT01NTUFORDFfT1BNT0RFX0FMU19PTkNFKTsKLQorCWx1eF9kYXRhID0gaXNsMjkwMThfcmVhZF9zZW5zb3JfaW5wdXQoY2hpcCwKKwkJCQkJICAgICAgSVNMMjkwMThfQ01EMV9PUE1PREVfQUxTX09OQ0UpOwogCWlmIChsdXhfZGF0YSA8IDApCiAJCXJldHVybiBsdXhfZGF0YTsKIApAQCAtMjMwLDggKzIyNiw4IEBACiB7CiAJaW50IGlyX2RhdGE7CiAKLQlpcl9kYXRhID0gaXNsMjkwMThfcmVhZF9zZW5zb3JfaW5wdXQoY2hpcCwgQ09NTU1BTkQxX09QTU9ERV9JUl9PTkNFKTsKLQorCWlyX2RhdGEgPSBpc2wyOTAxOF9yZWFkX3NlbnNvcl9pbnB1dChjaGlwLAorCQkJCQkgICAgIElTTDI5MDE4X0NNRDFfT1BNT0RFX0lSX09OQ0UpOwogCWlmIChpcl9kYXRhIDwgMCkKIAkJcmV0dXJuIGlyX2RhdGE7CiAKQEAgLTI0OSwxNiArMjQ1LDE2IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gcmVnbWFwX2dldF9kZXZpY2UoY2hpcC0+cmVnbWFwKTsKIAogCS8qIERvIHByb3hpbWl0eSBzZW5zaW5nIHdpdGggcmVxdWlyZWQgc2NoZW1lICovCi0Jc3RhdHVzID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoaXAtPnJlZ21hcCwgSVNMMjkwMThfUkVHX0FERF9DT01NQU5ESUksCi0JCQkJICAgIENPTU1BTkRJSV9TQ0hFTUVfTUFTSywKLQkJCQkgICAgc2NoZW1lIDw8IENPTU1BTkRJSV9TQ0hFTUVfU0hJRlQpOworCXN0YXR1cyA9IHJlZ21hcF91cGRhdGVfYml0cyhjaGlwLT5yZWdtYXAsIElTTDI5MDE4X1JFR19BRERfQ09NTUFORDIsCisJCQkJICAgIElTTDI5MDE4X0NNRDJfU0NIRU1FX01BU0ssCisJCQkJICAgIHNjaGVtZSA8PCBJU0wyOTAxOF9DTUQyX1NDSEVNRV9TSElGVCk7CiAJaWYgKHN0YXR1cykgewogCQlkZXZfZXJyKGRldiwgIkVycm9yIGluIHNldHRpbmcgb3BlcmF0aW5nIG1vZGVcbiIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAogCXByb3hfZGF0YSA9IGlzbDI5MDE4X3JlYWRfc2Vuc29yX2lucHV0KGNoaXAsCi0JCQkJCSAgICAgICBDT01NTUFORDFfT1BNT0RFX1BST1hfT05DRSk7CisJCQkJCSAgICAgICBJU0wyOTAxOF9DTUQxX09QTU9ERV9QUk9YX09OQ0UpOwogCWlmIChwcm94X2RhdGEgPCAwKQogCQlyZXR1cm4gcHJveF9kYXRhOwogCkBAIC0yNjcsOCArMjYzLDggQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaXJfZGF0YSA9IGlzbDI5MDE4X3JlYWRfc2Vuc29yX2lucHV0KGNoaXAsIENPTU1NQU5EMV9PUE1PREVfSVJfT05DRSk7Ci0KKwlpcl9kYXRhID0gaXNsMjkwMThfcmVhZF9zZW5zb3JfaW5wdXQoY2hpcCwKKwkJCQkJICAgICBJU0wyOTAxOF9DTUQxX09QTU9ERV9JUl9PTkNFKTsKIAlpZiAoaXJfZGF0YSA8IDApCiAJCXJldHVybiBpcl9kYXRhOwogCkBAIC0yODAsNyArMjc2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19zY2FsZV9hdmFpbGFibGUoc3RydWN0IGRldmljZSAqZGV2LAorc3RhdGljIHNzaXplX3QgaXNsMjkwMThfc2hvd19zY2FsZV9hdmFpbGFibGUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwpAQCAtMjk3LDcgKzI5Myw3IEBACiAJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19pbnRfdGltZV9hdmFpbGFibGUoc3RydWN0IGRldmljZSAqZGV2LAorc3RhdGljIHNzaXplX3QgaXNsMjkwMThfc2hvd19pbnRfdGltZV9hdmFpbGFibGUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwpAQCAtMzEzLDggKzMwOSw3IEBACiAJcmV0dXJuIGxlbjsKIH0KIAotLyogcHJveGltaXR5IHNjaGVtZSAqLwotc3RhdGljIHNzaXplX3Qgc2hvd19wcm94X2luZnJhcmVkX3N1cHByZXNzaW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKK3N0YXRpYyBzc2l6ZV90IGlzbDI5MDE4X3Nob3dfcHJveF9pbmZyYXJlZF9zdXBwcmVzc2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgICAgICBjaGFyICpidWYpCiB7CkBAIC0zMjIsMTMgKzMxNywxMyBAQAogCXN0cnVjdCBpc2wyOTAxOF9jaGlwICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAogCS8qCi0JICogcmV0dXJuIHRoZSAicHJveGltaXR5IHNjaGVtZSIgaS5lLiBpZiB0aGUgY2hpcCBkb2VzIG9uIGNoaXAKKwkgKiBSZXR1cm4gdGhlICJwcm94aW1pdHkgc2NoZW1lIiBpLmUuIGlmIHRoZSBjaGlwIGRvZXMgb24gY2hpcAogCSAqIGluZnJhcmVkIHN1cHByZXNzaW9uICgxIG1lYW5zIHBlcmZvcm0gb24gY2hpcCBzdXBwcmVzc2lvbikKIAkgKi8KIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+cHJveF9zY2hlbWUpOwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9wcm94X2luZnJhcmVkX3N1cHByZXNzaW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKK3N0YXRpYyBzc2l6ZV90IGlzbDI5MDE4X3N0b3JlX3Byb3hfaW5mcmFyZWRfc3VwcHJlc3Npb24oc3RydWN0IGRldmljZSAqZGV2LAogCQkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKQEAgLTMzOCwxMyArMzMzLDExIEBACiAKIAlpZiAoa3N0cnRvaW50KGJ1ZiwgMTAsICZ2YWwpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoISh2YWwgPT0gMCB8fCB2YWwgPT0gMSkpIHsKLQkJZGV2X2VycihkZXYsICJUaGUgbW9kZSBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKwlpZiAoISh2YWwgPT0gMCB8fCB2YWwgPT0gMSkpCiAJCXJldHVybiAtRUlOVkFMOwotCX0KIAogCS8qCi0JICogZ2V0IHRoZSAgInByb3hpbWl0eSBzY2hlbWUiIGkuZS4gaWYgdGhlIGNoaXAgZG9lcyBvbiBjaGlwCisJICogR2V0IHRoZSAicHJveGltaXR5IHNjaGVtZSIgaS5lLiBpZiB0aGUgY2hpcCBkb2VzIG9uIGNoaXAKIAkgKiBpbmZyYXJlZCBzdXBwcmVzc2lvbiAoMSBtZWFucyBwZXJmb3JtIG9uIGNoaXAgc3VwcHJlc3Npb24pCiAJICovCiAJbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7CkBAIC0zNTQsNyArMzQ3LDYgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLS8qIENoYW5uZWwgSU8gKi8KIHN0YXRpYyBpbnQgaXNsMjkwMThfd3JpdGVfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCiAJCQkgICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKIAkJCSAgICAgIGludCB2YWwsCkBAIC00OTEsMTMgKzQ4MywxMyBAQAogfTsKIAogc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbl9pbGx1bWluYW5jZV9pbnRlZ3JhdGlvbl90aW1lX2F2YWlsYWJsZSwgU19JUlVHTywKLQkJICAgICAgIHNob3dfaW50X3RpbWVfYXZhaWxhYmxlLCBOVUxMLCAwKTsKKwkJICAgICAgIGlzbDI5MDE4X3Nob3dfaW50X3RpbWVfYXZhaWxhYmxlLCBOVUxMLCAwKTsKIHN0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5faWxsdW1pbmFuY2Vfc2NhbGVfYXZhaWxhYmxlLCBTX0lSVUdPLAotCQkgICAgICBzaG93X3NjYWxlX2F2YWlsYWJsZSwgTlVMTCwgMCk7CisJCSAgICAgIGlzbDI5MDE4X3Nob3dfc2NhbGVfYXZhaWxhYmxlLCBOVUxMLCAwKTsKIHN0YXRpYyBJSU9fREVWSUNFX0FUVFIocHJveGltaXR5X29uX2NoaXBfYW1iaWVudF9pbmZyYXJlZF9zdXBwcmVzc2lvbiwKIAkJCQkJU19JUlVHTyB8IFNfSVdVU1IsCi0JCQkJCXNob3dfcHJveF9pbmZyYXJlZF9zdXBwcmVzc2lvbiwKLQkJCQkJc3RvcmVfcHJveF9pbmZyYXJlZF9zdXBwcmVzc2lvbiwgMCk7CisJCQkJCWlzbDI5MDE4X3Nob3dfcHJveF9pbmZyYXJlZF9zdXBwcmVzc2lvbiwKKwkJCQkJaXNsMjkwMThfc3RvcmVfcHJveF9pbmZyYXJlZF9zdXBwcmVzc2lvbiwgMCk7CiAKICNkZWZpbmUgSVNMMjkwMThfREVWX0FUVFIobmFtZSkgKCZpaW9fZGV2X2F0dHJfIyNuYW1lLmRldl9hdHRyLmF0dHIpCiAKQEAgLTU0MSw3ICs1MzMsNyBAQAogCWlmIChpZCAhPSBJU0wyOTAzNV9ERVZJQ0VfSUQpCiAJCXJldHVybiAtRU5PREVWOwogCi0JLyogY2xlYXIgb3V0IGJyb3dub3V0IGJpdCAqLworCS8qIENsZWFyIGJyb3dub3V0IGJpdCAqLwogCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoY2hpcC0+cmVnbWFwLCBJU0wyOTAzNV9SRUdfREVWSUNFX0lELAogCQkJCSAgSVNMMjkwMzVfQk9VVF9NQVNLLCAwKTsKIH0KQEAgLTU3NCw3ICs1NjYsNyBAQAogCSAqIGNvbnZlcnNpb25zLCBjbGVhciB0aGUgdGVzdCByZWdpc3RlcnMsIGFuZCB0aGVuIHJld3JpdGUgYWxsCiAJICogcmVnaXN0ZXJzIHRvIHRoZSBkZXNpcmVkIHZhbHVlcy4KIAkgKiAuLi4KLQkgKiBGT1IgSVNMMjkwMTEsIElTTDI5MDE4LCBJU0wyOTAyMSwgSVNMMjkwMjMKKwkgKiBGb3IgSVNMMjkwMTEsIElTTDI5MDE4LCBJU0wyOTAyMSwgSVNMMjkwMjMKIAkgKiAxLiBXcml0ZSAweDAwIHRvIHJlZ2lzdGVyIDB4MDggKFRFU1QpCiAJICogMi4gV3JpdGUgMHgwMCB0byByZWdpc3RlciAweDAwIChDTUQxKQogCSAqIDMuIFJld3JpdGUgYWxsIHJlZ2lzdGVycyB0byB0aGUgZGVzaXJlZCB2YWx1ZXMKQEAgLTYwMyw3ICs1OTUsNyBAQAogCiAJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwkvKiBwZXIgZGF0YSBzaGVldCwgcGFnZSAxMCAqLwogCi0JLyogc2V0IGRlZmF1bHRzICovCisJLyogU2V0IGRlZmF1bHRzICovCiAJc3RhdHVzID0gaXNsMjkwMThfc2V0X3NjYWxlKGNoaXAsIGNoaXAtPnNjYWxlLnNjYWxlLAogCQkJCSAgICBjaGlwLT5zY2FsZS51c2NhbGUpOwogCWlmIChzdGF0dXMgPCAwKSB7CkBAIC02MzUsNyArNjI3LDcgQEAKIAkud3JpdGVfcmF3ID0gaXNsMjkwMThfd3JpdGVfcmF3LAogfTsKIAotc3RhdGljIGJvb2wgaXNfdm9sYXRpbGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3N0YXRpYyBib29sIGlzbDI5MDE4X2lzX3ZvbGF0aWxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCiB7CiAJc3dpdGNoIChyZWcpIHsKIAljYXNlIElTTDI5MDE4X1JFR19BRERfREFUQV9MU0I6CkBAIC02NDksMzcgKzY0MSwzMiBAQAogCX0KIH0KIAotLyoKLSAqIGlzbDI5MDE4X3JlZ21hcF9jb25maWc6IHJlZ21hcCBjb25maWd1cmF0aW9uLgotICogVXNlIFJCVFJFRSBtZWNoYW5pc20gZm9yIGNhY2hpbmcuCi0gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBpc2wyOTAxOF9yZWdtYXBfY29uZmlnID0gewogCS5yZWdfYml0cyA9IDgsCiAJLnZhbF9iaXRzID0gOCwKLQkudm9sYXRpbGVfcmVnID0gaXNfdm9sYXRpbGVfcmVnLAorCS52b2xhdGlsZV9yZWcgPSBpc2wyOTAxOF9pc192b2xhdGlsZV9yZWcsCiAJLm1heF9yZWdpc3RlciA9IElTTDI5MDE4X1JFR19URVNULAogCS5udW1fcmVnX2RlZmF1bHRzX3JhdyA9IElTTDI5MDE4X1JFR19URVNUICsgMSwKIAkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKIH07CiAKLS8qIGlzbDI5MDM1X3JlZ21hcF9jb25maWc6IHJlZ21hcCBjb25maWd1cmF0aW9uIGZvciBJU0wyOTAzNSAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGlzbDI5MDM1X3JlZ21hcF9jb25maWcgPSB7CiAJLnJlZ19iaXRzID0gOCwKIAkudmFsX2JpdHMgPSA4LAotCS52b2xhdGlsZV9yZWcgPSBpc192b2xhdGlsZV9yZWcsCisJLnZvbGF0aWxlX3JlZyA9IGlzbDI5MDE4X2lzX3ZvbGF0aWxlX3JlZywKIAkubWF4X3JlZ2lzdGVyID0gSVNMMjkwMzVfUkVHX0RFVklDRV9JRCwKIAkubnVtX3JlZ19kZWZhdWx0c19yYXcgPSBJU0wyOTAzNV9SRUdfREVWSUNFX0lEICsgMSwKIAkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKIH07CiAKLXN0cnVjdCBjaGlwX2luZm8geworc3RydWN0IGlzbDI5MDE4X2NoaXBfaW5mbyB7CiAJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzOwogCWludCBudW1fY2hhbm5lbHM7CiAJY29uc3Qgc3RydWN0IGlpb19pbmZvICppbmRpb19pbmZvOwogCWNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpyZWdtYXBfY2ZnOwogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBjaGlwX2luZm8gY2hpcF9pbmZvX3RibFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpc2wyOTAxOF9jaGlwX2luZm8gaXNsMjkwMThfY2hpcF9pbmZvX3RibFtdID0gewogCVtpc2wyOTAxOF0gPSB7CiAJCS5jaGFubmVscyA9IGlzbDI5MDE4X2NoYW5uZWxzLAogCQkubnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShpc2wyOTAxOF9jaGFubmVscyksCkBAIC03MjQsMTAgKzcxMSw4IEBACiAJaW50IGRldl9pZCA9IDA7CiAKIAlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmNoaXApKTsKLQlpZiAoIWluZGlvX2RldikgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImlpbyBhbGxvY2F0aW9uIGZhaWxzXG4iKTsKKwlpZiAoIWluZGlvX2RldikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCWNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaW5kaW9fZGV2KTsKQEAgLTc1MCw3ICs3MzUsNyBAQAogCWNoaXAtPnN1c3BlbmRlZCA9IGZhbHNlOwogCiAJY2hpcC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LAotCQkJCWNoaXBfaW5mb190YmxbZGV2X2lkXS5yZWdtYXBfY2ZnKTsKKwkJCQlpc2wyOTAxOF9jaGlwX2luZm9fdGJsW2Rldl9pZF0ucmVnbWFwX2NmZyk7CiAJaWYgKElTX0VSUihjaGlwLT5yZWdtYXApKSB7CiAJCWVyciA9IFBUUl9FUlIoY2hpcC0+cmVnbWFwKTsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJyZWdtYXAgaW5pdGlhbGl6YXRpb24gZmFpbHM6ICVkXG4iLCBlcnIpOwpAQCAtNzYxLDE5ICs3NDYsMTMgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaW5kaW9fZGV2LT5pbmZvID0gY2hpcF9pbmZvX3RibFtkZXZfaWRdLmluZGlvX2luZm87Ci0JaW5kaW9fZGV2LT5jaGFubmVscyA9IGNoaXBfaW5mb190YmxbZGV2X2lkXS5jaGFubmVsczsKLQlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IGNoaXBfaW5mb190YmxbZGV2X2lkXS5udW1fY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5pbmZvID0gaXNsMjkwMThfY2hpcF9pbmZvX3RibFtkZXZfaWRdLmluZGlvX2luZm87CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGlzbDI5MDE4X2NoaXBfaW5mb190YmxbZGV2X2lkXS5jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IGlzbDI5MDE4X2NoaXBfaW5mb190YmxbZGV2X2lkXS5udW1fY2hhbm5lbHM7CiAJaW5kaW9fZGV2LT5uYW1lID0gbmFtZTsKIAlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CiAJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOwotCWVyciA9IGRldm1faWlvX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYsIGluZGlvX2Rldik7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImlpbyByZWdpc3RyYXRpb24gZmFpbHNcbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiAwOworCXJldHVybiBkZXZtX2lpb19kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCBpbmRpb19kZXYpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCkBAIC04NDAsNyArODE5LDYgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGlzbDI5MDE4X29mX21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGlzbDI5MDE4X2RyaXZlciA9IHsKLQkuY2xhc3MJPSBJMkNfQ0xBU1NfSFdNT04sCiAJLmRyaXZlcgkgPSB7CiAJCQkubmFtZSA9ICJpc2wyOTAxOCIsCiAJCQkuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKGlzbDI5MDE4X2FjcGlfbWF0Y2gpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9pc2wyOTAyOC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9pc2wyOTAyOC5jCmluZGV4IDJlM2IxZDYuLmFhNDEzZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvaXNsMjkwMjguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L2lzbDI5MDI4LmMKQEAgLTI3LDI5ICsyNywyNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KICNpbmNsdWRlIDxsaW51eC9paW8vc3lzZnMuaD4KIAotI2RlZmluZSBDT05WRVJTSU9OX1RJTUVfTVMJCTEwMAorI2RlZmluZSBJU0wyOTAyOF9DT05WX1RJTUVfTVMJCTEwMAogCiAjZGVmaW5lIElTTDI5MDI4X1JFR19DT05GSUdVUkUJCTB4MDEKIAotI2RlZmluZSBDT05GSUdVUkVfQUxTX0lSX01PREVfQUxTCTAKLSNkZWZpbmUgQ09ORklHVVJFX0FMU19JUl9NT0RFX0lSCUJJVCgwKQotI2RlZmluZSBDT05GSUdVUkVfQUxTX0lSX01PREVfTUFTSwlCSVQoMCkKKyNkZWZpbmUgSVNMMjkwMjhfQ09ORl9BTFNfSVJfTU9ERV9BTFMJMAorI2RlZmluZSBJU0wyOTAyOF9DT05GX0FMU19JUl9NT0RFX0lSCUJJVCgwKQorI2RlZmluZSBJU0wyOTAyOF9DT05GX0FMU19JUl9NT0RFX01BU0sJQklUKDApCiAKLSNkZWZpbmUgQ09ORklHVVJFX0FMU19SQU5HRV9MT1dfTFVYCTAKLSNkZWZpbmUgQ09ORklHVVJFX0FMU19SQU5HRV9ISUdIX0xVWAlCSVQoMSkKLSNkZWZpbmUgQ09ORklHVVJFX0FMU19SQU5HRV9NQVNLCUJJVCgxKQorI2RlZmluZSBJU0wyOTAyOF9DT05GX0FMU19SQU5HRV9MT1dfTFVYCTAKKyNkZWZpbmUgSVNMMjkwMjhfQ09ORl9BTFNfUkFOR0VfSElHSF9MVVgJQklUKDEpCisjZGVmaW5lIElTTDI5MDI4X0NPTkZfQUxTX1JBTkdFX01BU0sJQklUKDEpCiAKLSNkZWZpbmUgQ09ORklHVVJFX0FMU19ESVMJCTAKLSNkZWZpbmUgQ09ORklHVVJFX0FMU19FTgkJQklUKDIpCi0jZGVmaW5lIENPTkZJR1VSRV9BTFNfRU5fTUFTSwkJQklUKDIpCisjZGVmaW5lIElTTDI5MDI4X0NPTkZfQUxTX0RJUwkJMAorI2RlZmluZSBJU0wyOTAyOF9DT05GX0FMU19FTgkJQklUKDIpCisjZGVmaW5lIElTTDI5MDI4X0NPTkZfQUxTX0VOX01BU0sJQklUKDIpCiAKLSNkZWZpbmUgQ09ORklHVVJFX1BST1hfRFJJVkUJCUJJVCgzKQorI2RlZmluZSBJU0wyOTAyOF9DT05GX1BST1hfU0xQX1NICTQKKyNkZWZpbmUgSVNMMjkwMjhfQ09ORl9QUk9YX1NMUF9NQVNLCSg3IDw8IElTTDI5MDI4X0NPTkZfUFJPWF9TTFBfU0gpCiAKLSNkZWZpbmUgQ09ORklHVVJFX1BST1hfU0xQX1NICQk0Ci0jZGVmaW5lIENPTkZJR1VSRV9QUk9YX1NMUF9NQVNLCQkoNyA8PCBDT05GSUdVUkVfUFJPWF9TTFBfU0gpCi0KLSNkZWZpbmUgQ09ORklHVVJFX1BST1hfRU4JCUJJVCg3KQotI2RlZmluZSBDT05GSUdVUkVfUFJPWF9FTl9NQVNLCQlCSVQoNykKKyNkZWZpbmUgSVNMMjkwMjhfQ09ORl9QUk9YX0VOCQlCSVQoNykKKyNkZWZpbmUgSVNMMjkwMjhfQ09ORl9QUk9YX0VOX01BU0sJQklUKDcpCiAKICNkZWZpbmUgSVNMMjkwMjhfUkVHX0lOVEVSUlVQVAkJMHgwMgogCkBAIC02MiwxMCArNjAsMTAgQEAKIAogI2RlZmluZSBJU0wyOTAyOF9OVU1fUkVHUwkJKElTTDI5MDI4X1JFR19URVNUMl9NT0RFICsgMSkKIAotZW51bSBhbHNfaXJfbW9kZSB7Ci0JTU9ERV9OT05FID0gMCwKLQlNT0RFX0FMUywKLQlNT0RFX0lSCitlbnVtIGlzbDI5MDI4X2Fsc19pcl9tb2RlIHsKKwlJU0wyOTAyOF9NT0RFX05PTkUgPSAwLAorCUlTTDI5MDI4X01PREVfQUxTLAorCUlTTDI5MDI4X01PREVfSVIsCiB9OwogCiBzdHJ1Y3QgaXNsMjkwMjhfY2hpcCB7CkBAIC03Niw3ICs3NCw3IEBACiAJYm9vbAkJCWVuYWJsZV9wcm94OwogCiAJaW50CQkJbHV4X3NjYWxlOwotCWludAkJCWFsc19pcl9tb2RlOworCWVudW0gaXNsMjkwMjhfYWxzX2lyX21vZGUJYWxzX2lyX21vZGU7CiB9OwogCiBzdGF0aWMgaW50IGlzbDI5MDI4X3NldF9wcm94aW1fc2FtcGxpbmcoc3RydWN0IGlzbDI5MDI4X2NoaXAgKmNoaXAsCkBAIC05MSw3ICs4OSw4IEBACiAJCQlicmVhazsKIAl9CiAJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhjaGlwLT5yZWdtYXAsIElTTDI5MDI4X1JFR19DT05GSUdVUkUsCi0JCQlDT05GSUdVUkVfUFJPWF9TTFBfTUFTSywgc2VsIDw8IENPTkZJR1VSRV9QUk9YX1NMUF9TSCk7CisJCQkJICBJU0wyOTAyOF9DT05GX1BST1hfU0xQX01BU0ssCisJCQkJICBzZWwgPDwgSVNMMjkwMjhfQ09ORl9QUk9YX1NMUF9TSCk7CiB9CiAKIHN0YXRpYyBpbnQgaXNsMjkwMjhfZW5hYmxlX3Byb3hpbWl0eShzdHJ1Y3QgaXNsMjkwMjhfY2hpcCAqY2hpcCwgYm9vbCBlbmFibGUpCkBAIC0xMDAsOSArOTksOSBAQAogCWludCB2YWwgPSAwOwogCiAJaWYgKGVuYWJsZSkKLQkJdmFsID0gQ09ORklHVVJFX1BST1hfRU47CisJCXZhbCA9IElTTDI5MDI4X0NPTkZfUFJPWF9FTjsKIAlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoY2hpcC0+cmVnbWFwLCBJU0wyOTAyOF9SRUdfQ09ORklHVVJFLAotCQkJCSBDT05GSUdVUkVfUFJPWF9FTl9NQVNLLCB2YWwpOworCQkJCSBJU0wyOTAyOF9DT05GX1BST1hfRU5fTUFTSywgdmFsKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTEzLDQwICsxMTIsNDAgQEAKIAogc3RhdGljIGludCBpc2wyOTAyOF9zZXRfYWxzX3NjYWxlKHN0cnVjdCBpc2wyOTAyOF9jaGlwICpjaGlwLCBpbnQgbHV4X3NjYWxlKQogewotCWludCB2YWwgPSAobHV4X3NjYWxlID09IDIwMDApID8gQ09ORklHVVJFX0FMU19SQU5HRV9ISUdIX0xVWCA6Ci0JCQkJCUNPTkZJR1VSRV9BTFNfUkFOR0VfTE9XX0xVWDsKKwlpbnQgdmFsID0gKGx1eF9zY2FsZSA9PSAyMDAwKSA/IElTTDI5MDI4X0NPTkZfQUxTX1JBTkdFX0hJR0hfTFVYIDoKKwkJCQkJSVNMMjkwMjhfQ09ORl9BTFNfUkFOR0VfTE9XX0xVWDsKIAogCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoY2hpcC0+cmVnbWFwLCBJU0wyOTAyOF9SRUdfQ09ORklHVVJFLAotCQlDT05GSUdVUkVfQUxTX1JBTkdFX01BU0ssIHZhbCk7CisJCUlTTDI5MDI4X0NPTkZfQUxTX1JBTkdFX01BU0ssIHZhbCk7CiB9CiAKIHN0YXRpYyBpbnQgaXNsMjkwMjhfc2V0X2Fsc19pcl9tb2RlKHN0cnVjdCBpc2wyOTAyOF9jaGlwICpjaGlwLAotCQkJCSAgICBlbnVtIGFsc19pcl9tb2RlIG1vZGUpCisJCQkJICAgIGVudW0gaXNsMjkwMjhfYWxzX2lyX21vZGUgbW9kZSkKIHsKIAlpbnQgcmV0ID0gMDsKIAogCXN3aXRjaCAobW9kZSkgewotCWNhc2UgTU9ERV9BTFM6CisJY2FzZSBJU0wyOTAyOF9NT0RFX0FMUzoKIAkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoaXAtPnJlZ21hcCwgSVNMMjkwMjhfUkVHX0NPTkZJR1VSRSwKLQkJCQkJIENPTkZJR1VSRV9BTFNfSVJfTU9ERV9NQVNLLAotCQkJCQkgQ09ORklHVVJFX0FMU19JUl9NT0RFX0FMUyk7CisJCQkJCSBJU0wyOTAyOF9DT05GX0FMU19JUl9NT0RFX01BU0ssCisJCQkJCSBJU0wyOTAyOF9DT05GX0FMU19JUl9NT0RFX0FMUyk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAogCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoY2hpcC0+cmVnbWFwLCBJU0wyOTAyOF9SRUdfQ09ORklHVVJFLAotCQkJCQkgQ09ORklHVVJFX0FMU19SQU5HRV9NQVNLLAotCQkJCQkgQ09ORklHVVJFX0FMU19SQU5HRV9ISUdIX0xVWCk7CisJCQkJCSBJU0wyOTAyOF9DT05GX0FMU19SQU5HRV9NQVNLLAorCQkJCQkgSVNMMjkwMjhfQ09ORl9BTFNfUkFOR0VfSElHSF9MVVgpOwogCQlicmVhazsKIAotCWNhc2UgTU9ERV9JUjoKKwljYXNlIElTTDI5MDI4X01PREVfSVI6CiAJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhjaGlwLT5yZWdtYXAsIElTTDI5MDI4X1JFR19DT05GSUdVUkUsCi0JCQkJCSBDT05GSUdVUkVfQUxTX0lSX01PREVfTUFTSywKLQkJCQkJIENPTkZJR1VSRV9BTFNfSVJfTU9ERV9JUik7CisJCQkJCSBJU0wyOTAyOF9DT05GX0FMU19JUl9NT0RFX01BU0ssCisJCQkJCSBJU0wyOTAyOF9DT05GX0FMU19JUl9NT0RFX0lSKTsKIAkJYnJlYWs7CiAKLQljYXNlIE1PREVfTk9ORToKKwljYXNlIElTTDI5MDI4X01PREVfTk9ORToKIAkJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhjaGlwLT5yZWdtYXAsIElTTDI5MDI4X1JFR19DT05GSUdVUkUsCi0JCQlDT05GSUdVUkVfQUxTX0VOX01BU0ssIENPTkZJR1VSRV9BTFNfRElTKTsKKwkJCUlTTDI5MDI4X0NPTkZfQUxTX0VOX01BU0ssIElTTDI5MDI4X0NPTkZfQUxTX0RJUyk7CiAJfQogCiAJaWYgKHJldCA8IDApCkBAIC0xNTQsMTIgKzE1MywxMyBAQAogCiAJLyogRW5hYmxlIHRoZSBBTFMvSVIgKi8KIAlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoY2hpcC0+cmVnbWFwLCBJU0wyOTAyOF9SRUdfQ09ORklHVVJFLAotCQkJCSBDT05GSUdVUkVfQUxTX0VOX01BU0ssIENPTkZJR1VSRV9BTFNfRU4pOworCQkJCSBJU0wyOTAyOF9DT05GX0FMU19FTl9NQVNLLAorCQkJCSBJU0wyOTAyOF9DT05GX0FMU19FTik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKIAkvKiBOZWVkIHRvIHdhaXQgZm9yIGNvbnZlcnNpb24gdGltZSBpZiBBTFMvSVIgbW9kZSBlbmFibGVkICovCi0JbWRlbGF5KENPTlZFUlNJT05fVElNRV9NUyk7CisJbWRlbGF5KElTTDI5MDI4X0NPTlZfVElNRV9NUyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyMywxNCArMjIzLDE0IEBACiAJaW50IHJldDsKIAlpbnQgYWxzX2lyX2RhdGE7CiAKLQlpZiAoY2hpcC0+YWxzX2lyX21vZGUgIT0gTU9ERV9BTFMpIHsKLQkJcmV0ID0gaXNsMjkwMjhfc2V0X2Fsc19pcl9tb2RlKGNoaXAsIE1PREVfQUxTKTsKKwlpZiAoY2hpcC0+YWxzX2lyX21vZGUgIT0gSVNMMjkwMjhfTU9ERV9BTFMpIHsKKwkJcmV0ID0gaXNsMjkwMjhfc2V0X2Fsc19pcl9tb2RlKGNoaXAsIElTTDI5MDI4X01PREVfQUxTKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoZGV2LAogCQkJCSJFcnJvciBpbiBlbmFibGluZyBBTFMgbW9kZSBlcnIgJWRcbiIsIHJldCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9Ci0JCWNoaXAtPmFsc19pcl9tb2RlID0gTU9ERV9BTFM7CisJCWNoaXAtPmFsc19pcl9tb2RlID0gSVNMMjkwMjhfTU9ERV9BTFM7CiAJfQogCiAJcmV0ID0gaXNsMjkwMjhfcmVhZF9hbHNfaXIoY2hpcCwgJmFsc19pcl9kYXRhKTsKQEAgLTI1NiwxNCArMjU2LDE0IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gcmVnbWFwX2dldF9kZXZpY2UoY2hpcC0+cmVnbWFwKTsKIAlpbnQgcmV0OwogCi0JaWYgKGNoaXAtPmFsc19pcl9tb2RlICE9IE1PREVfSVIpIHsKLQkJcmV0ID0gaXNsMjkwMjhfc2V0X2Fsc19pcl9tb2RlKGNoaXAsIE1PREVfSVIpOworCWlmIChjaGlwLT5hbHNfaXJfbW9kZSAhPSBJU0wyOTAyOF9NT0RFX0lSKSB7CisJCXJldCA9IGlzbDI5MDI4X3NldF9hbHNfaXJfbW9kZShjaGlwLCBJU0wyOTAyOF9NT0RFX0lSKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoZGV2LAogCQkJCSJFcnJvciBpbiBlbmFibGluZyBJUiBtb2RlIGVyciAlZFxuIiwgcmV0KTsKIAkJCXJldHVybiByZXQ7CiAJCX0KLQkJY2hpcC0+YWxzX2lyX21vZGUgPSBNT0RFX0lSOworCQljaGlwLT5hbHNfaXJfbW9kZSA9IElTTDI5MDI4X01PREVfSVI7CiAJfQogCXJldHVybiBpc2wyOTAyOF9yZWFkX2Fsc19pcihjaGlwLCBpcl9kYXRhKTsKIH0KQEAgLTM4Myw4ICszODMsOCBAQAogfQogCiBzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW5fcHJveGltaXR5X3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUsCi0JCQkJIjEsIDMsIDUsIDEwLCAxMywgMjAsIDgzLCAxMDAiKTsKLXN0YXRpYyBJSU9fQ09OU1RfQVRUUihpbl9pbGx1bWluYW5jZV9zY2FsZV9hdmFpbGFibGUsICIxMjUsIDIwMDAiKTsKKwkJCQkiMSAzIDUgMTAgMTMgMjAgODMgMTAwIik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW5faWxsdW1pbmFuY2Vfc2NhbGVfYXZhaWxhYmxlLCAiMTI1IDIwMDAiKTsKIAogI2RlZmluZSBJU0wyOTAyOF9ERVZfQVRUUihuYW1lKSAoJmlpb19kZXZfYXR0cl8jI25hbWUuZGV2X2F0dHIuYXR0cikKICNkZWZpbmUgSVNMMjkwMjhfQ09OU1RfQVRUUihuYW1lKSAoJmlpb19jb25zdF9hdHRyXyMjbmFtZS5kZXZfYXR0ci5hdHRyKQpAQCAtNDI4LDcgKzQyOCw3IEBACiAJY2hpcC0+ZW5hYmxlX3Byb3ggID0gZmFsc2U7CiAJY2hpcC0+cHJveF9zYW1wbGluZyA9IDIwOwogCWNoaXAtPmx1eF9zY2FsZSA9IDIwMDA7Ci0JY2hpcC0+YWxzX2lyX21vZGUgPSBNT0RFX05PTkU7CisJY2hpcC0+YWxzX2lyX21vZGUgPSBJU0wyOTAyOF9NT0RFX05PTkU7CiAKIAlyZXQgPSByZWdtYXBfd3JpdGUoY2hpcC0+cmVnbWFwLCBJU0wyOTAyOF9SRUdfVEVTVDFfTU9ERSwgMHgwKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtNDYyLDcgKzQ2Miw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGJvb2wgaXNfdm9sYXRpbGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3N0YXRpYyBib29sIGlzbDI5MDI4X2lzX3ZvbGF0aWxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCiB7CiAJc3dpdGNoIChyZWcpIHsKIAljYXNlIElTTDI5MDI4X1JFR19JTlRFUlJVUFQ6CkBAIC00NzgsNyArNDc4LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBpc2wyOTAyOF9yZWdtYXBfY29uZmlnID0gewogCS5yZWdfYml0cyA9IDgsCiAJLnZhbF9iaXRzID0gOCwKLQkudm9sYXRpbGVfcmVnID0gaXNfdm9sYXRpbGVfcmVnLAorCS52b2xhdGlsZV9yZWcgPSBpc2wyOTAyOF9pc192b2xhdGlsZV9yZWcsCiAJLm1heF9yZWdpc3RlciA9IElTTDI5MDI4X05VTV9SRUdTIC0gMSwKIAkubnVtX3JlZ19kZWZhdWx0c19yYXcgPSBJU0wyOTAyOF9OVU1fUkVHUywKIAkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKQEAgLTU0Niw3ICs1NDYsNiBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgaXNsMjkwMjhfb2ZfbWF0Y2gpOwogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaXNsMjkwMjhfZHJpdmVyID0gewotCS5jbGFzcwk9IEkyQ19DTEFTU19IV01PTiwKIAkuZHJpdmVyICA9IHsKIAkJLm5hbWUgPSAiaXNsMjkwMjgiLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBpc2wyOTAyOF9vZl9tYXRjaCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMjU4My5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTgzLmMKaW5kZXggMDViNGFkNC4uMDhmMTU4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTgzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTgzLmMKQEAgLTgwMyw3ICs4MDMsNyBAQAogCU5VTEwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHRzbDI1ODNfYXR0cmlidXRlX2dyb3VwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdHNsMjU4M19hdHRyaWJ1dGVfZ3JvdXAgPSB7CiAJLmF0dHJzID0gc3lzZnNfYXR0cnNfY3RybCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1NC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU0LmMKaW5kZXggYzQ2YmVmNjQuLjE3MzA5NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1NC5jCkBAIC0yMyw5ICsyMyw3IEBACiAjaW5jbHVkZSAibWV0ZXIuaCIKICNpbmNsdWRlICJhZGU3NzU0LmgiCiAKLXN0YXRpYyBpbnQgYWRlNzc1NF9zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAotCQl1OCByZWdfYWRkcmVzcywKLQkJdTggdmFsKQorc3RhdGljIGludCBhZGU3NzU0X3NwaV93cml0ZV9yZWdfOChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IHJlZ19hZGRyZXNzLCB1OCB2YWwpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKQEAgLTQyLDggKzQwLDcgQEAKIH0KIAogc3RhdGljIGludCBhZGU3NzU0X3NwaV93cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAotCQl1OCByZWdfYWRkcmVzcywKLQkJdTE2IHZhbHVlKQorCQkJCSAgICB1OCByZWdfYWRkcmVzcywgdTE2IHZhbHVlKQogewogCWludCByZXQ7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CkBAIC01OSw5ICs1Niw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhZGU3NzU0X3NwaV9yZWFkX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJdTggcmVnX2FkZHJlc3MsCi0JCXU4ICp2YWwpCitzdGF0aWMgaW50IGFkZTc3NTRfc3BpX3JlYWRfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LCB1OCByZWdfYWRkcmVzcywgdTggKnZhbCkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKIAlzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtNzAsNyArNjUsNyBAQAogCXJldCA9IHNwaV93OHI4KHN0LT51cywgQURFNzc1NF9SRUFEX1JFRyhyZWdfYWRkcmVzcykpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAicHJvYmxlbSB3aGVuIHJlYWRpbmcgOCBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKLQkJCQlyZWdfYWRkcmVzcyk7CisJCQlyZWdfYWRkcmVzcyk7CiAJCXJldHVybiByZXQ7CiAJfQogCSp2YWwgPSByZXQ7CkBAIC03OSw4ICs3NCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgYWRlNzc1NF9zcGlfcmVhZF9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAotCQl1OCByZWdfYWRkcmVzcywKLQkJdTE2ICp2YWwpCisJCQkJICAgdTggcmVnX2FkZHJlc3MsIHUxNiAqdmFsKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwogCXN0cnVjdCBhZGU3NzU0X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CkBAIC05OSw4ICs5Myw3IEBACiB9CiAKIHN0YXRpYyBpbnQgYWRlNzc1NF9zcGlfcmVhZF9yZWdfMjQoc3RydWN0IGRldmljZSAqZGV2LAotCQl1OCByZWdfYWRkcmVzcywKLQkJdTMyICp2YWwpCisJCQkJICAgdTggcmVnX2FkZHJlc3MsIHUzMiAqdmFsKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwogCXN0cnVjdCBhZGU3NzU0X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CkBAIC0xMjMsNyArMTE2LDcgQEAKIAlyZXQgPSBzcGlfc3luY190cmFuc2ZlcihzdC0+dXMsIHhmZXJzLCBBUlJBWV9TSVpFKHhmZXJzKSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDI0IGJpdCByZWdpc3RlciAweCUwMlgiLAotCQkJCXJlZ19hZGRyZXNzKTsKKwkJCXJlZ19hZGRyZXNzKTsKIAkJZ290byBlcnJvcl9yZXQ7CiAJfQogCSp2YWwgPSAoc3QtPnJ4WzFdIDw8IDE2KSB8IChzdC0+cnhbMl0gPDwgOCkgfCBzdC0+cnhbM107CkBAIC0xMzQsOCArMTI3LDggQEAKIH0KIAogc3RhdGljIHNzaXplX3QgYWRlNzc1NF9yZWFkXzhiaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY2hhciAqYnVmKQogewogCWludCByZXQ7CiAJdTggdmFsID0gMDsKQEAgLTE0OSw4ICsxNDIsOCBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBhZGU3NzU0X3JlYWRfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjaGFyICpidWYpCiB7CiAJaW50IHJldDsKIAl1MTYgdmFsID0gMDsKQEAgLTE2NCw4ICsxNTcsOCBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBhZGU3NzU0X3JlYWRfMjRiaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjaGFyICpidWYpCiB7CiAJaW50IHJldDsKIAl1MzIgdmFsID0gMDsKQEAgLTE3OSw5ICsxNzIsOSBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBhZGU3NzU0X3dyaXRlXzhiaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjb25zdCBjaGFyICpidWYsCisJCQkJICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKIAlpbnQgcmV0OwpAQCAtMTk3LDkgKzE5MCw5IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkZTc3NTRfd3JpdGVfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKIAlpbnQgcmV0OwpAQCAtNDAzLDE2ICszOTYsMTQgQEAKIH0KIAogc3RhdGljIHNzaXplX3QgYWRlNzc1NF9yZWFkX2ZyZXF1ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY2hhciAqYnVmKQogewogCWludCByZXQ7CiAJdTggdDsKIAlpbnQgc3BzOwogCi0JcmV0ID0gYWRlNzc1NF9zcGlfcmVhZF9yZWdfOChkZXYsCi0JCQlBREU3NzU0X1dBVk1PREUsCi0JCQkmdCk7CisJcmV0ID0gYWRlNzc1NF9zcGlfcmVhZF9yZWdfOChkZXYsIEFERTc3NTRfV0FWTU9ERSwgJnQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTQyMyw5ICs0MTQsOSBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBhZGU3NzU0X3dyaXRlX2ZyZXF1ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsCisJCQkJICAgICAgIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CiAJc3RydWN0IGFkZTc3NTRfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfcmluZy5jCmluZGV4IGE2Yjc2ZDQuLjU3YzIxM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3JpbmcuYwpAQCAtMzgsMTggKzM4LDE0IEBACiAJaW50IHJldDsKIAl1OCByZWc7CiAKLQlyZXQgPSBhZGU3NzU4X3NwaV9yZWFkX3JlZ184KGRldiwKLQkJCUFERTc3NThfV0FWTU9ERSwKLQkJCSZyZWcpOworCXJldCA9IGFkZTc3NThfc3BpX3JlYWRfcmVnXzgoZGV2LCBBREU3NzU4X1dBVk1PREUsICZyZWcpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCiAJcmVnICY9IH4weDFGOwogCXJlZyB8PSB0eXBlICYgMHgxRjsKIAotCXJldCA9IGFkZTc3NThfc3BpX3dyaXRlX3JlZ184KGRldiwKLQkJCUFERTc3NThfV0FWTU9ERSwKLQkJCXJlZyk7CisJcmV0ID0gYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzgoZGV2LCBBREU3NzU4X1dBVk1PREUsIHJlZyk7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTk0LDcgKzkwLDcgQEAKIAkJCQkgaW5kaW9fZGV2LT5tYXNrbGVuZ3RoKTsKIAogCWFkZTc3NThfd3JpdGVfd2F2ZWZvcm1fdHlwZSgmaW5kaW9fZGV2LT5kZXYsCi0JCWluZGlvX2Rldi0+Y2hhbm5lbHNbY2hhbm5lbF0uYWRkcmVzcyk7CisJCQkJICAgIGluZGlvX2Rldi0+Y2hhbm5lbHNbY2hhbm5lbF0uYWRkcmVzcyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LmMKaW5kZXggNzVlODY4NS4uMjRlZGJjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LmMKQEAgLTIzLDggKzIzLDggQEAKICNpbmNsdWRlICJhZGU3ODU0LmgiCiAKIHN0YXRpYyBzc2l6ZV90IGFkZTc4NTRfcmVhZF84Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJIGNoYXIgKmJ1ZikKIHsKIAlpbnQgcmV0OwogCXU4IHZhbCA9IDA7CkBAIC00MCw4ICs0MCw4IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkZTc4NTRfcmVhZF8xNmJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgIGNoYXIgKmJ1ZikKIHsKIAlpbnQgcmV0OwogCXUxNiB2YWwgPSAwOwpAQCAtNTcsOCArNTcsOCBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBhZGU3ODU0X3JlYWRfMjRiaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjaGFyICpidWYpCiB7CiAJaW50IHJldDsKIAl1MzIgdmFsOwpAQCAtNzQsOCArNzQsOCBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBhZGU3ODU0X3JlYWRfMzJiaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjaGFyICpidWYpCiB7CiAJaW50IHJldDsKIAl1MzIgdmFsID0gMDsKQEAgLTkxLDkgKzkxLDkgQEAKIH0KIAogc3RhdGljIHNzaXplX3QgYWRlNzg1NF93cml0ZV84Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY29uc3QgY2hhciAqYnVmLAorCQkJCSAgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CkBAIC0xMTIsOSArMTEyLDkgQEAKIH0KIAogc3RhdGljIHNzaXplX3QgYWRlNzg1NF93cml0ZV8xNmJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLAorCQkJCSAgIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwpAQCAtMTMzLDkgKzEzMyw5IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkZTc4NTRfd3JpdGVfMjRiaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKQEAgLTE1NCw5ICsxNTQsOSBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBhZGU3ODU0X3dyaXRlXzMyYml0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjb25zdCBjaGFyICpidWYsCisJCQkJICAgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2VhcF9wYWNrZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAvZWFwX3BhY2tldC5oCmluZGV4IDE2YTM5MmEuLmRmN2Y3NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAvZWFwX3BhY2tldC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAvZWFwX3BhY2tldC5oCkBAIC0xLDYgKzEsOCBAQAogI2lmbmRlZiBFQVBfUEFDS0VUX0gKICNkZWZpbmUgRUFQX1BBQ0tFVF9ICiAKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCiAjZGVmaW5lIFdCSVQobikgKDEgPDwgKG4pKQogCiAjaWZuZGVmIEVUSF9BTEVOCkBAIC0xOSwxNCArMjEsMTQgQEAKICNkZWZpbmUgRVRIRVJfUFJPVE9DT0xfVFlQRV9JUAkJMHgwODAwCiAjZGVmaW5lIEVUSEVSX1BST1RPQ09MX1RZUEVfQVJQCQkweDA4MDYKIAkvKiBmb2xsb3dlZCBieSBsZW5ndGggb2N0ZXRzIG9mIGRhdGEgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGllZWU4MDJfMXhfaGRyIHsKIAl1bnNpZ25lZCBjaGFyIHZlcnNpb247CiAJdW5zaWduZWQgY2hhciB0eXBlOwogCXVuc2lnbmVkIHNob3J0IGxlbmd0aDsKIAkvKiBmb2xsb3dlZCBieSBsZW5ndGggb2N0ZXRzIG9mIGRhdGEgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBFQVBPTF9WRVJTSU9OIDIKIApAQCAtNTEsMjUgKzUzLDMzIEBACiBzdHJ1Y3QgaWVlZTgwMl8xeF9lYXBvbF9rZXkgewogCXVuc2lnbmVkIGNoYXIgdHlwZTsKIAl1bnNpZ25lZCBzaG9ydCBrZXlfbGVuZ3RoOwotCS8qIGRvZXMgbm90IHJlcGVhdCB3aXRoaW4gdGhlIGxpZmUgb2YgdGhlIGtleWluZyBtYXRlcmlhbCB1c2VkIHRvCi0JICogZW5jcnlwdCB0aGUgS2V5IGZpZWxkOyA2NC1iaXQgTlRQIHRpbWVzdGFtcCBNQVkgYmUgdXNlZCBoZXJlICovCisJLyoKKwkgKiBkb2VzIG5vdCByZXBlYXQgd2l0aGluIHRoZSBsaWZlIG9mIHRoZSBrZXlpbmcgbWF0ZXJpYWwgdXNlZCB0bworCSAqIGVuY3J5cHQgdGhlIEtleSBmaWVsZDsgNjQtYml0IE5UUCB0aW1lc3RhbXAgTUFZIGJlIHVzZWQgaGVyZQorCSAqLwogCXVuc2lnbmVkIGNoYXIgcmVwbGF5X2NvdW50ZXJbSUVFRTgwMjFYX1JFUExBWV9DT1VOVEVSX0xFTl07CiAJdW5zaWduZWQgY2hhciBrZXlfaXZbSUVFRTgwMjFYX0tFWV9JVl9MRU5dOwkvKiBjcnlwdG9ncmFwaGljYWxseSByYW5kb20gbnVtYmVyICovCi0JdW5zaWduZWQgY2hhciBrZXlfaW5kZXg7CS8qIGtleSBmbGFnIGluIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdDoKKwl1bnNpZ25lZCBjaGFyIGtleV9pbmRleDsJLyoKKwkJCQkJICoga2V5IGZsYWcgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0OgogCQkJCQkgKiAwID0gYnJvYWRjYXN0IChkZWZhdWx0IGtleSksCiAJCQkJCSAqIDEgPSB1bmljYXN0IChrZXkgbWFwcGluZyBrZXkpOyBrZXkgaW5kZXggaXMgaW4gdGhlCi0JCQkJCSAqIDcgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyAqLwotCS8qIEhNQUMtTUQ1IG1lc3NhZ2UgaW50ZWdyaXR5IGNoZWNrIGNvbXB1dGVkIHdpdGggTVMtTVBQRS1TZW5kLUtleSBhcwotCSAqIHRoZSBrZXkgKi8KKwkJCQkJICogNyBsZWFzdCBzaWduaWZpY2FudCBiaXRzCisJCQkJCSAqLworCS8qCisJICogSE1BQy1NRDUgbWVzc2FnZSBpbnRlZ3JpdHkgY2hlY2sgY29tcHV0ZWQgd2l0aCBNUy1NUFBFLVNlbmQtS2V5IGFzCisJICogdGhlIGtleQorCSAqLwogCXVuc2lnbmVkIGNoYXIga2V5X3NpZ25hdHVyZVtJRUVFODAyMVhfS0VZX1NJR05fTEVOXTsKIAotCS8qIGZvbGxvd2VkIGJ5IGtleTogaWYgcGFja2V0IGJvZHkgbGVuZ3RoID0gNDQgKyBrZXkgbGVuZ3RoLCB0aGVuIHRoZQorCS8qCisJICogZm9sbG93ZWQgYnkga2V5OiBpZiBwYWNrZXQgYm9keSBsZW5ndGggPSA0NCArIGtleSBsZW5ndGgsIHRoZW4gdGhlCiAJICoga2V5IGZpZWxkIChvZiBrZXlfbGVuZ3RoIGJ5dGVzKSBjb250YWlucyB0aGUga2V5IGluIGVuY3J5cHRlZCBmb3JtOwogCSAqIGlmIHBhY2tldCBib2R5IGxlbmd0aCA9IDQ0LCBrZXkgZmllbGQgaXMgYWJzZW50IGFuZCBrZXlfbGVuZ3RoCiAJICogcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGxlYXN0IHNpZ25pZmljYW50IG9jdGV0cyBmcm9tCiAJICogTVMtTVBQRS1TZW5kLUtleSBhdHRyaWJ1dGUgdG8gYmUgdXNlZCBhcyB0aGUga2V5aW5nIG1hdGVyaWFsOwotCSAqIFJDNCBrZXkgdXNlZCBpbiBlbmNyeXB0aW9uID0gS2V5LUlWICsgTVMtTVBQRS1SZWN2LUtleSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJICogUkM0IGtleSB1c2VkIGluIGVuY3J5cHRpb24gPSBLZXktSVYgKyBNUy1NUFBFLVJlY3YtS2V5CisJICovCit9IF9fcGFja2VkOwogCiAjZGVmaW5lIFdQQV9OT05DRV9MRU4gMzIKICNkZWZpbmUgV1BBX1JFUExBWV9DT1VOVEVSX0xFTiA4CkBAIC04Niw3ICs5Niw3IEBACiAJdW5zaWduZWQgY2hhciBrZXlfbWljWzE2XTsKIAl1bnNpZ25lZCBzaG9ydCBrZXlfZGF0YV9sZW5ndGg7CiAJLyogZm9sbG93ZWQgYnkga2V5X2RhdGFfbGVuZ3RoIGJ5dGVzIG9mIGtleV9kYXRhICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgV1BBX0tFWV9JTkZPX1RZUEVfTUFTSyAoV0JJVCgwKSB8IFdCSVQoMSkgfCBXQklUKDIpKQogI2RlZmluZSBXUEFfS0VZX0lORk9fVFlQRV9ITUFDX01ENV9SQzQgV0JJVCgwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rczcwMTBfc2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rczcwMTBfc2Rpby5jCmluZGV4IGI3MzM3ZmQuLjgxYzQ2ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAva3M3MDEwX3NkaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2tzNzAxMF9zZGlvLmMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAKICNpbmNsdWRlICJrc193bGFuLmgiCiAjaW5jbHVkZSAia3Nfd2xhbl9pb2N0bC5oIgpAQCAtMzUsMTggKzM1LDE4IEBACiAvKiBtYWNybyAqLwogCiAjZGVmaW5lIGluY190eHFoZWFkKHByaXYpIFwKLSAgICAgICAgKCBwcml2LT50eF9kZXYucWhlYWQgPSAocHJpdi0+dHhfZGV2LnFoZWFkICsgMSkgJSBUWF9ERVZJQ0VfQlVGRl9TSVpFICkKKyAgICAgICAgKHByaXYtPnR4X2Rldi5xaGVhZCA9IChwcml2LT50eF9kZXYucWhlYWQgKyAxKSAlIFRYX0RFVklDRV9CVUZGX1NJWkUpCiAjZGVmaW5lIGluY190eHF0YWlsKHByaXYpIFwKLSAgICAgICAgKCBwcml2LT50eF9kZXYucXRhaWwgPSAocHJpdi0+dHhfZGV2LnF0YWlsICsgMSkgJSBUWF9ERVZJQ0VfQlVGRl9TSVpFICkKKyAgICAgICAgKHByaXYtPnR4X2Rldi5xdGFpbCA9IChwcml2LT50eF9kZXYucXRhaWwgKyAxKSAlIFRYX0RFVklDRV9CVUZGX1NJWkUpCiAjZGVmaW5lIGNudF90eHFib2R5KHByaXYpIFwKLSAgICAgICAgKCgocHJpdi0+dHhfZGV2LnF0YWlsICsgVFhfREVWSUNFX0JVRkZfU0laRSkgLSAocHJpdi0+dHhfZGV2LnFoZWFkKSkgJSBUWF9ERVZJQ0VfQlVGRl9TSVpFICkKKyAgICAgICAgKCgocHJpdi0+dHhfZGV2LnF0YWlsICsgVFhfREVWSUNFX0JVRkZfU0laRSkgLSAocHJpdi0+dHhfZGV2LnFoZWFkKSkgJSBUWF9ERVZJQ0VfQlVGRl9TSVpFKQogCiAjZGVmaW5lIGluY19yeHFoZWFkKHByaXYpIFwKLSAgICAgICAgKCBwcml2LT5yeF9kZXYucWhlYWQgPSAocHJpdi0+cnhfZGV2LnFoZWFkICsgMSkgJSBSWF9ERVZJQ0VfQlVGRl9TSVpFICkKKyAgICAgICAgKHByaXYtPnJ4X2Rldi5xaGVhZCA9IChwcml2LT5yeF9kZXYucWhlYWQgKyAxKSAlIFJYX0RFVklDRV9CVUZGX1NJWkUpCiAjZGVmaW5lIGluY19yeHF0YWlsKHByaXYpIFwKLSAgICAgICAgKCBwcml2LT5yeF9kZXYucXRhaWwgPSAocHJpdi0+cnhfZGV2LnF0YWlsICsgMSkgJSBSWF9ERVZJQ0VfQlVGRl9TSVpFICkKKyAgICAgICAgKHByaXYtPnJ4X2Rldi5xdGFpbCA9IChwcml2LT5yeF9kZXYucXRhaWwgKyAxKSAlIFJYX0RFVklDRV9CVUZGX1NJWkUpCiAjZGVmaW5lIGNudF9yeHFib2R5KHByaXYpIFwKLSAgICAgICAgKCgocHJpdi0+cnhfZGV2LnF0YWlsICsgUlhfREVWSUNFX0JVRkZfU0laRSkgLSAocHJpdi0+cnhfZGV2LnFoZWFkKSkgJSBSWF9ERVZJQ0VfQlVGRl9TSVpFICkKKyAgICAgICAgKCgocHJpdi0+cnhfZGV2LnF0YWlsICsgUlhfREVWSUNFX0JVRkZfU0laRSkgLSAocHJpdi0+cnhfZGV2LnFoZWFkKSkgJSBSWF9ERVZJQ0VfQlVGRl9TSVpFKQogCiBzdGF0aWMgaW50IGtzNzAxMF9zZGlvX3JlYWQoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgaW50IGFkZHJlc3MsCiAJCQkgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQpAQCAtODcsNyArODcsNyBAQAogCXJldHVybiByYzsKIH0KIAotdm9pZCBrc193bGFuX2h3X3NsZWVwX2RvemVfcmVxdWVzdChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KQorc3RhdGljIHZvaWQga3Nfd2xhbl9od19zbGVlcF9kb3plX3JlcXVlc3Qoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdikKIHsKIAl1bnNpZ25lZCBjaGFyIHJ3X2RhdGE7CiAJaW50IHJldHZhbDsKQEAgLTExNSwxMCArMTE1LDkgQEAKIAogIG91dDoKIAlwcml2LT5zbGVlcF9tb2RlID0gYXRvbWljX3JlYWQoJnByaXYtPnNsZWVwc3RhdHVzLnN0YXR1cyk7Ci0JcmV0dXJuOwogfQogCi12b2lkIGtzX3dsYW5faHdfc2xlZXBfd2FrZXVwX3JlcXVlc3Qoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdikKK3N0YXRpYyB2b2lkIGtzX3dsYW5faHdfc2xlZXBfd2FrZXVwX3JlcXVlc3Qoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdikKIHsKIAl1bnNpZ25lZCBjaGFyIHJ3X2RhdGE7CiAJaW50IHJldHZhbDsKQEAgLTE0Niw3ICsxNDUsNiBAQAogCiAgb3V0OgogCXByaXYtPnNsZWVwX21vZGUgPSBhdG9taWNfcmVhZCgmcHJpdi0+c2xlZXBzdGF0dXMuc3RhdHVzKTsKLQlyZXR1cm47CiB9CiAKIHZvaWQga3Nfd2xhbl9od193YWtldXBfcmVxdWVzdChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KQpAQCAtMTU5LDkgKzE1Nyw5IEBACiAJCXJ3X2RhdGEgPSBXQUtFVVBfUkVROwogCQlyZXR2YWwgPQogCQkgICAga3M3MDEwX3NkaW9fd3JpdGUocHJpdiwgV0FLRVVQLCAmcndfZGF0YSwgc2l6ZW9mKHJ3X2RhdGEpKTsKLQkJaWYgKHJldHZhbCkgeworCQlpZiAocmV0dmFsKQogCQkJRFBSSU5USygxLCAiIGVycm9yIDogV0FLRVVQPSUwMlhcbiIsIHJ3X2RhdGEpOwotCQl9CisKIAkJRFBSSU5USyg0LCAid2FrZSB1cCA6IFdBS0VVUD0lMDJYXG4iLCByd19kYXRhKTsKIAkJcHJpdi0+bGFzdF93YWtldXAgPSBqaWZmaWVzOwogCQkrK3ByaXYtPndha2V1cF9jb3VudDsKQEAgLTE3MSwxOSArMTY5LDE2IEBACiAJfQogfQogCi1pbnQgX2tzX3dsYW5faHdfcG93ZXJfc2F2ZShzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KQorc3RhdGljIGludCBfa3Nfd2xhbl9od19wb3dlcl9zYXZlKHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpCiB7Ci0JaW50IHJjID0gMDsKIAl1bnNpZ25lZCBjaGFyIHJ3X2RhdGE7CiAJaW50IHJldHZhbDsKIAogCWlmIChwcml2LT5yZWcucG93ZXJtZ3QgPT0gUE9XTUdUX0FDVElWRV9NT0RFKQotCQlyZXR1cm4gcmM7CisJCXJldHVybiAwOwogCiAJaWYgKHByaXYtPnJlZy5vcGVyYXRpb25fbW9kZSA9PSBNT0RFX0lORlJBU1RSVUNUVVJFICYmCiAJICAgIChwcml2LT5jb25uZWN0X3N0YXR1cyAmIENPTk5FQ1RfU1RBVFVTX01BU0spID09IENPTk5FQ1RfU1RBVFVTKSB7Ci0KLQkJLy9EUFJJTlRLKDEsInBzc3RhdHVzLnN0YXR1cz0lZFxuIixhdG9taWNfcmVhZCgmcHJpdi0+cHNzdGF0dXMuc3RhdHVzKSk7CiAJCWlmIChwcml2LT5kZXZfc3RhdGUgPT0gREVWSUNFX1NUQVRFX1NMRUVQKSB7CiAJCQlzd2l0Y2ggKGF0b21pY19yZWFkKCZwcml2LT5wc3N0YXR1cy5zdGF0dXMpKSB7CiAJCQljYXNlIFBTX1NOT09aRToJLyogNCAqLwpAQCAtMjQ2LDEwICsyNDEsOSBAQAogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0KIAl9CiAKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiB9CiAKIGludCBrc193bGFuX2h3X3Bvd2VyX3NhdmUoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdikKQEAgLTI2OCw3ICsyNjIsNyBAQAogCiAJaWYgKHByaXYtPmRldl9zdGF0ZSA8IERFVklDRV9TVEFURV9CT09UKSB7CiAJCWtmcmVlKHApOwotCQlpZiAoY29tcGxldGVfaGFuZGxlciAhPSBOVUxMKQorCQlpZiAoY29tcGxldGVfaGFuZGxlcikKIAkJCSgqY29tcGxldGVfaGFuZGxlcikgKGFyZzEsIGFyZzIpOwogCQlyZXR1cm4gMTsKIAl9CkBAIC0yNzcsNyArMjcxLDcgQEAKIAkJLyogaW4gY2FzZSBvZiBidWZmZXIgb3ZlcmZsb3cgKi8KIAkJRFBSSU5USygxLCAidHggYnVmZmVyIG92ZXJmbG93XG4iKTsKIAkJa2ZyZWUocCk7Ci0JCWlmIChjb21wbGV0ZV9oYW5kbGVyICE9IE5VTEwpCisJCWlmIChjb21wbGV0ZV9oYW5kbGVyKQogCQkJKCpjb21wbGV0ZV9oYW5kbGVyKSAoYXJnMSwgYXJnMik7CiAJCXJldHVybiAxOwogCX0KQEAgLTI5NywxMSArMjkxLDEwIEBACiBzdGF0aWMgaW50IHdyaXRlX3RvX2RldmljZShzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2LCB1bnNpZ25lZCBjaGFyICpidWZmZXIsCiAJCQkgICB1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0JaW50IHJjLCByZXR2YWw7CisJaW50IHJldHZhbDsKIAl1bnNpZ25lZCBjaGFyIHJ3X2RhdGE7CiAJc3RydWN0IGhvc3RpZl9oZHIgKmhkcjsKIAloZHIgPSAoc3RydWN0IGhvc3RpZl9oZHIgKilidWZmZXI7Ci0JcmMgPSAwOwogCiAJRFBSSU5USyg0LCAic2l6ZT0lZFxuIiwgaGRyLT5zaXplKTsKIAlpZiAoaGRyLT5ldmVudCA8IEhJRl9EQVRBX1JFUSB8fCBISUZfUkVRX01BWCA8IGhkci0+ZXZlbnQpIHsKQEAgLTM0NiwxMCArMzM5LDkgQEAKIAkJCQkJCSAgICZwcml2LT5rc193bGFuX2h3LnJ3X3dxLCAxKTsKIAkJCQlyZXR1cm47CiAJCQl9Ci0KIAkJfQogCQlrZnJlZShzcC0+c2VuZHApOwkvKiBhbGxvY2F0ZWQgbWVtb3J5IGZyZWUgKi8KLQkJaWYgKHNwLT5jb21wbGV0ZV9oYW5kbGVyICE9IE5VTEwpCS8qIFRYIENvbXBsZXRlICovCisJCWlmIChzcC0+Y29tcGxldGVfaGFuZGxlcikJLyogVFggQ29tcGxldGUgKi8KIAkJCSgqc3AtPmNvbXBsZXRlX2hhbmRsZXIpIChzcC0+YXJnMSwgc3AtPmFyZzIpOwogCQlpbmNfdHhxaGVhZChwcml2KTsKIApAQCAtMzU4LDcgKzM1MCw2IEBACiAJCQkJCSAgICZwcml2LT5rc193bGFuX2h3LnJ3X3dxLCAwKTsKIAkJfQogCX0KLQlyZXR1cm47CiB9CiAKIGludCBrc193bGFuX2h3X3R4KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYsIHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKQEAgLTQwMiwxMiArMzkzLDkgQEAKIAkJaG9zdGlmX3JlY2VpdmUocHJpdiwgcnAtPmRhdGEsIHJwLT5zaXplKTsKIAkJaW5jX3J4cWhlYWQocHJpdik7CiAKLQkJaWYgKGNudF9yeHFib2R5KHByaXYpID4gMCkgeworCQlpZiAoY250X3J4cWJvZHkocHJpdikgPiAwKQogCQkJdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+a3Nfd2xhbl9ody5yeF9iaF90YXNrKTsKLQkJfQogCX0KLQotCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQga3Nfd2xhbl9od19yeCh2b2lkICpkZXYsIHVpbnQxNl90IHNpemUpCkBAIC00MzIsOSArNDIwLDggQEAKIAlyZXR2YWwgPQogCSAgICBrczcwMTBfc2Rpb19yZWFkKHByaXYsIERBVEFfV0lORE9XLCAmcnhfYnVmZmVyLT5kYXRhWzBdLAogCQkJICAgICBoaWZfYWxpZ25fc2l6ZShzaXplKSk7Ci0JaWYgKHJldHZhbCkgeworCWlmIChyZXR2YWwpCiAJCWdvdG8gZXJyb3Jfb3V0OwotCX0KIAogCS8qIGxlbmd0aCBjaGVjayAqLwogCWlmIChzaXplID4gMjA0NiB8fCBzaXplID09IDApIHsKQEAgLTQ0OSw5ICs0MzYsOSBAQAogCQlyZXR2YWwgPQogCQkgICAga3M3MDEwX3NkaW9fd3JpdGUocHJpdiwgUkVBRF9TVEFUVVMsICZyZWFkX3N0YXR1cywKIAkJCQkgICAgICBzaXplb2YocmVhZF9zdGF0dXMpKTsKLQkJaWYgKHJldHZhbCkgeworCQlpZiAocmV0dmFsKQogCQkJRFBSSU5USygxLCAiIGVycm9yIDogUkVBRF9TVEFUVVM9JTAyWFxuIiwgcmVhZF9zdGF0dXMpOwotCQl9CisKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQogCkBAIC00NjUsOSArNDUyLDkgQEAKIAlyZXR2YWwgPQogCSAgICBrczcwMTBfc2Rpb193cml0ZShwcml2LCBSRUFEX1NUQVRVUywgJnJlYWRfc3RhdHVzLAogCQkJICAgICAgc2l6ZW9mKHJlYWRfc3RhdHVzKSk7Ci0JaWYgKHJldHZhbCkgeworCWlmIChyZXR2YWwpCiAJCURQUklOVEsoMSwgIiBlcnJvciA6IFJFQURfU1RBVFVTPSUwMlhcbiIsIHJlYWRfc3RhdHVzKTsKLQl9CisKIAlEUFJJTlRLKDQsICJSRUFEX1NUQVRVUz0lMDJYXG4iLCByZWFkX3N0YXR1cyk7CiAKIAlpZiAoYXRvbWljX3JlYWQoJnByaXYtPnBzc3RhdHVzLmNvbmZpcm1fd2FpdCkpIHsKQEAgLTQ5OCw3ICs0ODUsNyBAQAogCiAJLyogd2lhdCBhZnRlciBET1pFICovCiAJaWYgKHRpbWVfYWZ0ZXIocHJpdi0+bGFzdF9kb3plICsgKCgzMCAqIEhaKSAvIDEwMDApLCBqaWZmaWVzKSkgewotCQlEUFJJTlRLKDQsICJ3YWl0IGFmdGVyIERPWkUgXG4iKTsKKwkJRFBSSU5USyg0LCAid2FpdCBhZnRlciBET1pFXG4iKTsKIAkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPmtzX3dsYW5faHcua3M3MDEwc2Rpb193cSwKIAkJCQkgICAmcHJpdi0+a3Nfd2xhbl9ody5yd193cSwgMSk7CiAJCXJldHVybjsKQEAgLTUwNiwxMSArNDkzLDEzIEBACiAKIAkvKiB3aWF0IGFmdGVyIFdBS0VVUCAqLwogCXdoaWxlICh0aW1lX2FmdGVyKHByaXYtPmxhc3Rfd2FrZXVwICsgKCgzMCAqIEhaKSAvIDEwMDApLCBqaWZmaWVzKSkgewotCQlEUFJJTlRLKDQsICJ3YWl0IGFmdGVyIFdBS0VVUCBcbiIpOworCQlEUFJJTlRLKDQsICJ3YWl0IGFmdGVyIFdBS0VVUFxuIik7CiAvKgkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPmtzX3dsYW5faHcua3M3MDEwc2Rpb193cSwmcHJpdi0+a3Nfd2xhbl9ody5yd193cSwKIAkJKHByaXYtPmxhc3Rfd2FrZXVwICsgKCgzMCpIWikvMTAwMCkgLSBqaWZmaWVzKSk7Ki8KLQkJcHJpbnRrKCJ3YWtlOiAlbHUgJWx1XG4iLCBwcml2LT5sYXN0X3dha2V1cCArICgzMCAqIEhaKSAvIDEwMDAsCi0JCSAgICAgICBqaWZmaWVzKTsKKwkJZGV2X2luZm8oJnByaXYtPmtzX3dsYW5faHcuc2Rpb19jYXJkLT5mdW5jLT5kZXYsCisJCQkgIndha2U6ICVsdSAlbHVcbiIsCisJCQkgcHJpdi0+bGFzdF93YWtldXAgKyAoMzAgKiBIWikgLyAxMDAwLAorCQkJCWppZmZpZXMpOwogCQltc2xlZXAoMzApOwogCX0KIApAQCAtNTQ5LDE3ICs1MzgsMTUgQEAKIAogCWlmIChyd19kYXRhICYgUlNJWkVfTUFTSykgewkvKiBSZWFkIHNjaGVkdWxlICovCiAJCWtzX3dsYW5faHdfcngoKHZvaWQgKilwcml2LAotCQkJICAgICAgKHVpbnQxNl90KSAoKChyd19kYXRhICYgUlNJWkVfTUFTSykgPDwgNCkpKTsKKwkJCSAgICAgICh1aW50MTZfdCkoKHJ3X2RhdGEgJiBSU0laRV9NQVNLKSA8PCA0KSk7CiAJfQotCWlmICgocndfZGF0YSAmIFdTVEFUVVNfTUFTSykpIHsKKwlpZiAoKHJ3X2RhdGEgJiBXU1RBVFVTX01BU0spKQogCQl0eF9kZXZpY2VfdGFzaygodm9pZCAqKXByaXYpOwotCX0KKwogCV9rc193bGFuX2h3X3Bvd2VyX3NhdmUocHJpdik7CiAKICBlcnJfb3V0OgogCXNkaW9fcmVsZWFzZV9ob3N0KHByaXYtPmtzX3dsYW5faHcuc2Rpb19jYXJkLT5mdW5jKTsKLQotCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQga3Nfc2Rpb19pbnRlcnJ1cHQoc3RydWN0IHNkaW9fZnVuYyAqZnVuYykKQEAgLTYwNyw3ICs1OTQsNiBAQAogCQkJCX0KIAkJCQljb21wbGV0ZSgmcHJpdi0+cHNzdGF0dXMud2FrZXVwX3dhaXQpOwogCQkJfQotCiAJCX0KIAogCQlkbyB7CkBAIC02MjQsNyArNjEwLDcgQEAKIAkJCXJzaXplID0gcndfZGF0YSAmIFJTSVpFX01BU0s7CiAJCQlpZiAocnNpemUpIHsJLyogUmVhZCBzY2hlZHVsZSAqLwogCQkJCWtzX3dsYW5faHdfcngoKHZvaWQgKilwcml2LAotCQkJCQkgICAgICAodWludDE2X3QpICgoKHJzaXplKSA8PCA0KSkpOworCQkJCQkgICAgICAodWludDE2X3QpKHJzaXplIDw8IDQpKTsKIAkJCX0KIAkJCWlmIChyd19kYXRhICYgV1NUQVRVU19NQVNLKSB7CiAjaWYgMApAQCAtNjY3LDcgKzY1Myw2IEBACiAgaW50cl9vdXQ6CiAJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPmtzX3dsYW5faHcua3M3MDEwc2Rpb193cSwKIAkJCSAgICZwcml2LT5rc193bGFuX2h3LnJ3X3dxLCAwKTsKLQlyZXR1cm47CiB9CiAKIHN0YXRpYyBpbnQgdHJ4X2RldmljZV9pbml0KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpCkBAIC02OTYsMTQgKzY4MSwxMiBAQAogCXdoaWxlIChjbnRfdHhxYm9keShwcml2KSA+IDApIHsKIAkJc3AgPSAmcHJpdi0+dHhfZGV2LnR4X2Rldl9idWZmW3ByaXYtPnR4X2Rldi5xaGVhZF07CiAJCWtmcmVlKHNwLT5zZW5kcCk7CS8qIGFsbG9jYXRlZCBtZW1vcnkgZnJlZSAqLwotCQlpZiAoc3AtPmNvbXBsZXRlX2hhbmRsZXIgIT0gTlVMTCkJLyogVFggQ29tcGxldGUgKi8KKwkJaWYgKHNwLT5jb21wbGV0ZV9oYW5kbGVyKQkvKiBUWCBDb21wbGV0ZSAqLwogCQkJKCpzcC0+Y29tcGxldGVfaGFuZGxlcikgKHNwLT5hcmcxLCBzcC0+YXJnMik7CiAJCWluY190eHFoZWFkKHByaXYpOwogCX0KIAogCXRhc2tsZXRfa2lsbCgmcHJpdi0+a3Nfd2xhbl9ody5yeF9iaF90YXNrKTsKLQotCXJldHVybjsKIH0KIAogc3RhdGljIGludCBrczcwMTBfc2Rpb191cGRhdGVfaW5kZXgoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdiwgdTMyIGluZGV4KQpAQCAtNzExLDcgKzY5NCw2IEBACiAJaW50IHJjID0gMDsKIAlpbnQgcmV0dmFsOwogCXVuc2lnbmVkIGNoYXIgKmRhdGFfYnVmOwotCWRhdGFfYnVmID0gTlVMTDsKIAogCWRhdGFfYnVmID0ga21hbGxvYyhzaXplb2YodTMyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhX2J1ZikgewpAQCAtNzMyLDggKzcxNCw3IEBACiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KICBlcnJvcl9vdXQ6Ci0JaWYgKGRhdGFfYnVmKQotCQlrZnJlZShkYXRhX2J1Zik7CisJa2ZyZWUoZGF0YV9idWYpOwogCXJldHVybiByYzsKIH0KIApAQCAtNzQ0LDcgKzcyNSw3IEBACiAJaW50IHJjID0gMDsKIAlpbnQgcmV0dmFsOwogCXVuc2lnbmVkIGNoYXIgKnJlYWRfYnVmOwotCXJlYWRfYnVmID0gTlVMTDsKKwogCXJlYWRfYnVmID0ga21hbGxvYyhST01fQlVGRl9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJlYWRfYnVmKSB7CiAJCXJjID0gMTsKQEAgLTc1OCwxMyArNzM5LDEyIEBACiAJcmV0dmFsID0gbWVtY21wKGRhdGEsIHJlYWRfYnVmLCBzaXplKTsKIAogCWlmIChyZXR2YWwpIHsKLQkJRFBSSU5USygwLCAiZGF0YSBjb21wYXJlIGVycm9yICglZCkgXG4iLCByZXR2YWwpOworCQlEUFJJTlRLKDAsICJkYXRhIGNvbXBhcmUgZXJyb3IgKCVkKVxuIiwgcmV0dmFsKTsKIAkJcmMgPSAzOwogCQlnb3RvIGVycm9yX291dDsKIAl9CiAgZXJyb3Jfb3V0OgotCWlmIChyZWFkX2J1ZikKLQkJa2ZyZWUocmVhZF9idWYpOworCWtmcmVlKHJlYWRfYnVmKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTc3OCwxNCArNzU4LDEwIEBACiAJaW50IGxlbmd0aDsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5ID0gTlVMTDsKIAotCXJvbV9idWYgPSBOVUxMOwotCiAJLyogYnVmZmVyIGFsbG9jYXRlICovCiAJcm9tX2J1ZiA9IGttYWxsb2MoUk9NX0JVRkZfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyb21fYnVmKSB7Ci0JCXJjID0gMzsKLQkJZ290byBlcnJvcl9vdXQwOwotCX0KKwlpZiAoIXJvbV9idWYpCisJCXJldHVybiAzOwogCiAJc2Rpb19jbGFpbV9ob3N0KGNhcmQtPmZ1bmMpOwogCkBAIC03OTksNyArNzc1LDcgQEAKIAogCXJldHZhbCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCBST01fRklMRSwgJnByaXYtPmtzX3dsYW5faHcuc2Rpb19jYXJkLT5mdW5jLT5kZXYpOwogCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7CisJCWdvdG8gZXJyb3Jfb3V0MDsKIAogCWxlbmd0aCA9IGZ3X2VudHJ5LT5zaXplOwogCkBAIC04NzksOCArODU1LDcgQEAKIAlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKICBlcnJvcl9vdXQwOgogCXNkaW9fcmVsZWFzZV9ob3N0KGNhcmQtPmZ1bmMpOwotCWlmIChyb21fYnVmKQotCQlrZnJlZShyb21fYnVmKTsKKwlrZnJlZShyb21fYnVmKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTkwMyw5ICs4NzgsOSBAQAogCQlEUFJJTlRLKDEsICJ3YWl0IHRpbWUgb3V0ISEgU01FX1NUQVJUXG4iKTsKIAl9CiAKLQlpZiAocHJpdi0+bWFjX2FkZHJlc3NfdmFsaWQgJiYgcHJpdi0+dmVyc2lvbl9zaXplKSB7CisJaWYgKHByaXYtPm1hY19hZGRyZXNzX3ZhbGlkICYmIHByaXYtPnZlcnNpb25fc2l6ZSkKIAkJcHJpdi0+ZGV2X3N0YXRlID0gREVWSUNFX1NUQVRFX1BSRUlOSVQ7Ci0JfQorCiAKIAlob3N0aWZfc21lX2VucXVldWUocHJpdiwgU01FX0dFVF9FRVBST01fQ0tTVU0pOwogCkBAIC05ODEsNyArOTU2LDcgQEAKIAluZXRkZXYgPSBOVUxMOwogCiAJLyogaW5pdGlsaXplIGtzX3NkaW9fY2FyZCAqLwotCWNhcmQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3Nfc2Rpb19jYXJkKSwgR0ZQX0tFUk5FTCk7CisJY2FyZCA9IGt6YWxsb2Moc2l6ZW9mKCpjYXJkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYXJkKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTAyOSwxMiArMTAwNCwxMyBAQAogCiAJLyogcHJpdmF0ZSBtZW1vcnkgYWxsb2NhdGUgKi8KIAluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKnByaXYpKTsKLQlpZiAobmV0ZGV2ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJrczcwMTAgOiBVbmFibGUgdG8gYWxsb2MgbmV3IG5ldCBkZXZpY2VcbiIpOworCWlmICghbmV0ZGV2KSB7CisJCWRldl9lcnIoJmNhcmQtPmZ1bmMtPmRldiwgImtzNzAxMCA6IFVuYWJsZSB0byBhbGxvYyBuZXcgbmV0IGRldmljZVxuIik7CiAJCWdvdG8gZXJyb3JfcmVsZWFzZV9pcnE7CiAJfQogCWlmIChkZXZfYWxsb2NfbmFtZShuZXRkZXYsICJ3bGFuJWQiKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJrczcwMTAgOiAgQ291bGRuJ3QgZ2V0IG5hbWUhXG4iKTsKKwkJZGV2X2VycigmY2FyZC0+ZnVuYy0+ZGV2LAorCQkJImtzNzAxMCA6ICBDb3VsZG4ndCBnZXQgbmFtZSFcbiIpOwogCQlnb3RvIGVycm9yX2ZyZWVfbmV0ZGV2OwogCX0KIApAQCAtMTA0OCw5ICsxMDI0LDkgQEAKIAlpbml0X2NvbXBsZXRpb24oJnByaXYtPmtzX3dsYW5faHcua3M3MDEwX3NkaW9fd2FpdCk7CiAJcHJpdi0+a3Nfd2xhbl9ody5yZWFkX2J1ZiA9IE5VTEw7CiAJcHJpdi0+a3Nfd2xhbl9ody5yZWFkX2J1ZiA9IGttYWxsb2MoUlhfREFUQV9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYtPmtzX3dsYW5faHcucmVhZF9idWYpIHsKKwlpZiAoIXByaXYtPmtzX3dsYW5faHcucmVhZF9idWYpCiAJCWdvdG8gZXJyb3JfZnJlZV9uZXRkZXY7Ci0JfQorCiAJcHJpdi0+ZGV2X3N0YXRlID0gREVWSUNFX1NUQVRFX1BSRUJPT1Q7CiAJcHJpdi0+bmV0X2RldiA9IG5ldGRldjsKIAlwcml2LT5maXJtd2FyZV92ZXJzaW9uWzBdID0gJ1wwJzsKQEAgLTEwNzQsOSArMTA1MCw5IEBACiAJLyogVXBsb2FkIGZpcm13YXJlICovCiAJcmV0ID0ga3M3MDEwX3VwbG9hZF9maXJtd2FyZShwcml2LCBjYXJkKTsJLyogZmlybXdhcmUgbG9hZCAqLwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAia3M3MDEwOiBmaXJtd2FyZSBsb2FkIGZhaWxlZCAhISByZXRlcm4gY29kZSA9ICVkXG4iLAotCQkgICAgICAgcmV0KTsKKwkJZGV2X2VycigmY2FyZC0+ZnVuYy0+ZGV2LAorCQkJImtzNzAxMDogZmlybXdhcmUgbG9hZCBmYWlsZWQgISEgcmV0dXJuIGNvZGUgPSAlZFxuIiwKKwkJCSByZXQpOwogCQlnb3RvIGVycm9yX2ZyZWVfcmVhZF9idWY7CiAJfQogCkBAIC0xMDg2LDkgKzEwNjIsOSBAQAogCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKIAlyZXQgPSBrczcwMTBfc2Rpb193cml0ZShwcml2LCBJTlRfUEVORElORywgJnJ3X2RhdGEsIHNpemVvZihyd19kYXRhKSk7CiAJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7Ci0JaWYgKHJldCkgeworCWlmIChyZXQpCiAJCURQUklOVEsoMSwgIiBlcnJvciA6IElOVF9QRU5ESU5HPSUwMlhcbiIsIHJ3X2RhdGEpOwotCX0KKwogCURQUklOVEsoNCwgIiBjbGVhciBJbnRlcnJ1cHQgOiBJTlRfUEVORElORz0lMDJYXG4iLCByd19kYXRhKTsKIAogCS8qIGVuYWJsZSBrczcwMTBzZGlvIGludGVycnVwdCAoSU5UX0dDUl9CfElOVF9SRUFEX1NUQVRVU3xJTlRfV1JJVEVfU1RBVFVTKSAqLwpAQCAtMTA5Niw5ICsxMDcyLDkgQEAKIAlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CiAJcmV0ID0ga3M3MDEwX3NkaW9fd3JpdGUocHJpdiwgSU5UX0VOQUJMRSwgJnJ3X2RhdGEsIHNpemVvZihyd19kYXRhKSk7CiAJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7Ci0JaWYgKHJldCkgeworCWlmIChyZXQpCiAJCURQUklOVEsoMSwgIiBlcnJvciA6IElOVF9FTkFCTEU9JTAyWFxuIiwgcndfZGF0YSk7Ci0JfQorCiAJRFBSSU5USyg0LCAiIGVuYWJsZSBJbnRlcnJ1cHQgOiBJTlRfRU5BQkxFPSUwMlhcbiIsIHJ3X2RhdGEpOwogCXByaXYtPmRldl9zdGF0ZSA9IERFVklDRV9TVEFURV9CT09UOwogCkBAIC0xMTQxLDE4ICsxMTE3LDE4IEBACiAJaW50IHJldDsKIAlzdHJ1Y3Qga3Nfc2Rpb19jYXJkICpjYXJkOwogCXN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAlEUFJJTlRLKDEsICJrczcwMTBfc2Rpb19yZW1vdmUoKVxuIik7CiAKIAljYXJkID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKIAotCWlmIChjYXJkID09IE5VTEwpCisJaWYgKCFjYXJkKQogCQlyZXR1cm47CiAKIAlEUFJJTlRLKDEsICJwcml2ID0gY2FyZC0+cHJpdlxuIik7CiAJcHJpdiA9IGNhcmQtPnByaXY7Ci0JbmV0ZGV2ID0gcHJpdi0+bmV0X2RldjsKIAlpZiAocHJpdikgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHJpdi0+bmV0X2RldjsKKwogCQlrc193bGFuX25ldF9zdG9wKG5ldGRldik7CiAJCURQUklOVEsoMSwgImtzX3dsYW5fbmV0X3N0b3BcbiIpOwogCkBAIC0xMTY2LDkgKzExNDIsOCBAQAogCQkvKiBzZW5kIHN0b3AgcmVxdWVzdCB0byBNQUMgKi8KIAkJewogCQkJc3RydWN0IGhvc3RpZl9zdG9wX3JlcXVlc3RfdCAqcHA7Ci0JCQlwcCA9IChzdHJ1Y3QgaG9zdGlmX3N0b3BfcmVxdWVzdF90ICopCi0JCQkgICAga3phbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIEdGUF9LRVJORUwpOwotCQkJaWYgKHBwID09IE5VTEwpIHsKKwkJCXBwID0ga3phbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIEdGUF9LRVJORUwpOworCQkJaWYgKCFwcCkgewogCQkJCURQUklOVEsoMywgImFsbG9jYXRlIG1lbW9yeSBmYWlsZWQuLlxuIik7CiAJCQkJcmV0dXJuOwkvKiB0byBkbyBnb3RvIG5pIHN1cnUgKi8KIAkJCX0KQEAgLTExNzYsNyArMTE1MSw3IEBACiAJCQkgICAgY3B1X3RvX2xlMTYoKHVpbnQxNl90KQogCQkJCQkoc2l6ZW9mKCpwcCkgLQogCQkJCQkgc2l6ZW9mKHBwLT5oZWFkZXIuc2l6ZSkpKTsKLQkJCXBwLT5oZWFkZXIuZXZlbnQgPSBjcHVfdG9fbGUxNigodWludDE2X3QpIEhJRl9TVE9QX1JFUSk7CisJCQlwcC0+aGVhZGVyLmV2ZW50ID0gY3B1X3RvX2xlMTYoKHVpbnQxNl90KUhJRl9TVE9QX1JFUSk7CiAKIAkJCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKIAkJCXdyaXRlX3RvX2RldmljZShwcml2LCAodW5zaWduZWQgY2hhciAqKXBwLApAQCAtMTE5OSw5ICsxMTc0LDcgQEAKIAkJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKIAogCQl0cnhfZGV2aWNlX2V4aXQocHJpdik7Ci0JCWlmIChwcml2LT5rc193bGFuX2h3LnJlYWRfYnVmKSB7Ci0JCQlrZnJlZShwcml2LT5rc193bGFuX2h3LnJlYWRfYnVmKTsKLQkJfQorCQlrZnJlZShwcml2LT5rc193bGFuX2h3LnJlYWRfYnVmKTsKIAkJZnJlZV9uZXRkZXYocHJpdi0+bmV0X2Rldik7CiAJCWNhcmQtPnByaXYgPSBOVUxMOwogCX0KQEAgLTEyMTksNyArMTE5Miw2IEBACiAJRFBSSU5USygxLCAia2ZyZWUoKVxuIik7CiAKIAlEUFJJTlRLKDUsICIgQnllICEhXG4iKTsKLQlyZXR1cm47CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2Rpb19kcml2ZXIga3M3MDEwX3NkaW9fZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rc19ob3N0aWYuYyBiL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAva3NfaG9zdGlmLmMKaW5kZXggYTg4MjJmZS4uYzU3Y2E1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rc19ob3N0aWYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2tzX2hvc3RpZi5jCkBAIC0xNCwyMSArMTQsMTMgQEAKICNpbmNsdWRlICJlYXBfcGFja2V0LmgiCiAjaW5jbHVkZSAibWljaGFlbF9taWMuaCIKIAorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KIAogLyogSW5jbHVkZSBXaXJlbGVzcyBFeHRlbnNpb24gZGVmaW5pdGlvbiBhbmQgY2hlY2sgdmVyc2lvbiAqLwogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CS8qIE5ldyBkcml2ZXIgQVBJICovCiAKLWV4dGVybiBpbnQga3Nfd2xhbl9od190eChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2LCB2b2lkICpwLAotCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCSB2b2lkICgqY29tcGxldGVfaGFuZGxlcikgKHZvaWQgKmFyZzEsIHZvaWQgKmFyZzIpLAotCQkJIHZvaWQgKmFyZzEsIHZvaWQgKmFyZzIpOwotZXh0ZXJuIHZvaWQgc2VuZF9wYWNrZXRfY29tcGxldGUodm9pZCAqLCB2b2lkICopOwotCi1leHRlcm4gdm9pZCBrc193bGFuX2h3X3dha2V1cF9yZXF1ZXN0KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpOwotZXh0ZXJuIGludCBrc193bGFuX2h3X3Bvd2VyX3NhdmUoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdik7Ci0KIC8qIG1hY3JvICovCiAjZGVmaW5lIGluY19zbWVxaGVhZChwcml2KSBcCiAgICAgICAgICggcHJpdi0+c21lX2kucWhlYWQgPSAocHJpdi0+c21lX2kucWhlYWQgKyAxKSAlIFNNRV9FVkVOVF9CVUZGX1NJWkUgKQpAQCAtNDMsNiArMzUsNyBAQAogaW5saW5lIHU4IGdldF9CWVRFKHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpCiB7CiAJdTggZGF0YTsKKwogCWRhdGEgPSAqKHByaXYtPnJ4cCkrKzsKIAkvKiBsZW5ndGggY2hlY2sgaW4gYWR2YW5jZSAhICovCiAJLS0ocHJpdi0+cnhfc2l6ZSk7CkBAIC01Myw2ICs0Niw3IEBACiBpbmxpbmUgdTE2IGdldF9XT1JEKHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpCiB7CiAJdTE2IGRhdGE7CisKIAlkYXRhID0gKGdldF9CWVRFKHByaXYpICYgMHhmZik7CiAJZGF0YSB8PSAoKGdldF9CWVRFKHByaXYpIDw8IDgpICYgMHhmZjAwKTsKIAlyZXR1cm4gZGF0YTsKQEAgLTYyLDYgKzU2LDcgQEAKIGlubGluZSB1MzIgZ2V0X0RXT1JEKHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpCiB7CiAJdTMyIGRhdGE7CisKIAlkYXRhID0gKGdldF9CWVRFKHByaXYpICYgMHhmZik7CiAJZGF0YSB8PSAoKGdldF9CWVRFKHByaXYpIDw8IDgpICYgMHgwMDAwZmYwMCk7CiAJZGF0YSB8PSAoKGdldF9CWVRFKHByaXYpIDw8IDE2KSAmIDB4MDBmZjAwMDApOwpAQCAtNjksMTYgKzY0LDIwIEBACiAJcmV0dXJuIGRhdGE7CiB9CiAKLXZvaWQga3Nfd2xhbl9od193YWtldXBfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBrc193bGFuX2h3X3dha2V1cF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2ID0KIAkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBrc193bGFuX3ByaXZhdGUsIGtzX3dsYW5fd2FrZXVwX3Rhc2spOwogCWludCBwc19zdGF0dXMgPSBhdG9taWNfcmVhZCgmcHJpdi0+cHNzdGF0dXMuc3RhdHVzKTsKKwlsb25nIHRpbWVfbGVmdDsKIAogCWlmIChwc19zdGF0dXMgPT0gUFNfU05PT1pFKSB7CiAJCWtzX3dsYW5faHdfd2FrZXVwX3JlcXVlc3QocHJpdik7Ci0JCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJnByaXYtPnBzc3RhdHVzLndha2V1cF93YWl0LCBIWiAvIDUwKSkgewkvKiAyMG1zIHRpbWVvdXQgKi8KLQkJCURQUklOVEsoMSwgIndha2UgdXAgdGltZW91dCAhISFcbiIpOworCQl0aW1lX2xlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKwkJCQkmcHJpdi0+cHNzdGF0dXMud2FrZXVwX3dhaXQsCisJCQkJbXNlY3NfdG9famlmZmllcygyMCkpOworCQlpZiAodGltZV9sZWZ0IDw9IDApIHsKKwkJCURQUklOVEsoMSwgIndha2UgdXAgdGltZW91dCBvciBpbnRlcnJ1cHRlZCAhISFcbiIpOwogCQkJc2NoZWR1bGVfd29yaygmcHJpdi0+a3Nfd2xhbl93YWtldXBfdGFzayk7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTk2LDggKzk1LDYgQEAKIHN0YXRpYwogaW50IGtzX3dsYW5fZG9fcG93ZXJfc2F2ZShzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KQogewotCWludCByYyA9IDA7Ci0KIAlEUFJJTlRLKDQsICJwc3N0YXR1cy5zdGF0dXM9JWRcbiIsIGF0b21pY19yZWFkKCZwcml2LT5wc3N0YXR1cy5zdGF0dXMpKTsKIAogCWlmICgocHJpdi0+Y29ubmVjdF9zdGF0dXMgJiBDT05ORUNUX1NUQVRVU19NQVNLKSA9PSBDT05ORUNUX1NUQVRVUykgewpAQCAtMTA1LDcgKzEwMiw3IEBACiAJfSBlbHNlIHsKIAkJcHJpdi0+ZGV2X3N0YXRlID0gREVWSUNFX1NUQVRFX1JFQURZOwogCX0KLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYwpAQCAtMjE3LDcgKzIxNCw2IEBACiB7CiAJdW5zaWduZWQgY2hhciAqYnA7CiAJaW50IGJzaXplLCBvZmZzZXQ7Ci0JaW50IHJjID0gMDsKIAogCURQUklOVEsoMywgIlxuIik7CiAJbWVtc2V0KGFwLCAwLCBzaXplb2Yoc3RydWN0IGxvY2FsX2FwX3QpKTsKQEAgLTI0MCwxMyArMjM2LDEzIEBACiAJb2Zmc2V0ID0gMDsKIAogCXdoaWxlIChic2l6ZSA+IG9mZnNldCkgewotCQkvKiBEUFJJTlRLKDQsICJFbGVtZW50IElEPSVkIFxuIiwqYnApOyAqLworCQkvKiBEUFJJTlRLKDQsICJFbGVtZW50IElEPSVkXG4iLCpicCk7ICovCiAJCXN3aXRjaCAoKmJwKSB7CiAJCWNhc2UgMDoJLyogc3NpZCAqLwogCQkJaWYgKCooYnAgKyAxKSA8PSBTU0lEX01BWF9TSVpFKSB7CiAJCQkJYXAtPnNzaWQuc2l6ZSA9ICooYnAgKyAxKTsKIAkJCX0gZWxzZSB7Ci0JCQkJRFBSSU5USygxLCAic2l6ZSBvdmVyIDo6IHNzaWQgc2l6ZT0lZCBcbiIsCisJCQkJRFBSSU5USygxLCAic2l6ZSBvdmVyIDo6IHNzaWQgc2l6ZT0lZFxuIiwKIAkJCQkJKihicCArIDEpKTsKIAkJCQlhcC0+c3NpZC5zaXplID0gU1NJRF9NQVhfU0laRTsKIAkJCX0KQEAgLTI2MCw3ICsyNTYsNyBAQAogCQkJCSAgICAgICBicCArIDIsICooYnAgKyAxKSk7CiAJCQkJYXAtPnJhdGVfc2V0LnNpemUgKz0gKihicCArIDEpOwogCQkJfSBlbHNlIHsKLQkJCQlEUFJJTlRLKDEsICJzaXplIG92ZXIgOjogcmF0ZSBzaXplPSVkIFxuIiwKKwkJCQlEUFJJTlRLKDEsICJzaXplIG92ZXIgOjogcmF0ZSBzaXplPSVkXG4iLAogCQkJCQkoKihicCArIDEpICsgYXAtPnJhdGVfc2V0LnNpemUpKTsKIAkJCQltZW1jcHkoJihhcC0+cmF0ZV9zZXQuYm9keVthcC0+cmF0ZV9zZXQuc2l6ZV0pLAogCQkJCSAgICAgICBicCArIDIsCkBAIC0yNzYsNyArMjcyLDcgQEAKIAkJCWlmICgqKGJwICsgMSkgPD0gUlNOX0lFX0JPRFlfTUFYKSB7CiAJCQkJYXAtPnJzbl9pZS5zaXplID0gKihicCArIDEpOwogCQkJfSBlbHNlIHsKLQkJCQlEUFJJTlRLKDEsICJzaXplIG92ZXIgOjogcnNuIHNpemU9JWQgXG4iLAorCQkJCURQUklOVEsoMSwgInNpemUgb3ZlciA6OiByc24gc2l6ZT0lZFxuIiwKIAkJCQkJKihicCArIDEpKTsKIAkJCQlhcC0+cnNuX2llLnNpemUgPSBSU05fSUVfQk9EWV9NQVg7CiAJCQl9CkBAIC0yODksNyArMjg1LDcgQEAKIAkJCQkJYXAtPndwYV9pZS5zaXplID0gKihicCArIDEpOwogCQkJCX0gZWxzZSB7CiAJCQkJCURQUklOVEsoMSwKLQkJCQkJCSJzaXplIG92ZXIgOjogd3BhIHNpemU9JWQgXG4iLAorCQkJCQkJInNpemUgb3ZlciA6OiB3cGEgc2l6ZT0lZFxuIiwKIAkJCQkJCSooYnAgKyAxKSk7CiAJCQkJCWFwLT53cGFfaWUuc2l6ZSA9IFJTTl9JRV9CT0RZX01BWDsKIAkJCQl9CkBAIC0zMDcsNyArMzAzLDcgQEAKIAkJY2FzZSA0NzoJLyogUmVzZXJ2ZSBJRCA0NyBCcm9hZGNvbSBBUCAqLwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlEUFJJTlRLKDQsICJ1bmtub3duIEVsZW1lbnQgSUQ9JWQgXG4iLCAqYnApOworCQkJRFBSSU5USyg0LCAidW5rbm93biBFbGVtZW50IElEPSVkXG4iLCAqYnApOwogCQkJYnJlYWs7CiAJCX0KIAkJb2Zmc2V0ICs9IDI7CS8qIGlkICYgc2l6ZSBmaWVsZCAqLwpAQCAtMzE1LDcgKzMxMSw3IEBACiAJCWJwICs9ICgqKGJwICsgMSkgKyAyKTsJLyogcG9pbnRlciB1cGRhdGUgKi8KIAl9CiAKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYwpAQCAtNDA0LDcgKzQwMCw3IEBACiAJCQkJCSAgICBIWiA+PSA2MCkgewogCQkJCQkJbWljX2ZhaWx1cmUtPmZhaWx1cmUgPSAwOwogCQkJCQl9Ci0JCQkJCURQUklOVEsoNCwgIk1JQyBGQUlMVVJFIFxuIik7CisJCQkJCURQUklOVEsoNCwgIk1JQyBGQUlMVVJFXG4iKTsKIAkJCQkJaWYgKG1pY19mYWlsdXJlLT5mYWlsdXJlID09IDApIHsKIAkJCQkJCW1pY19mYWlsdXJlLT5mYWlsdXJlID0gMTsKIAkJCQkJCW1pY19mYWlsdXJlLT5jb3VudGVyID0gMDsKQEAgLTQ4MSw4ICs0NzcsNyBAQAogCQkJbmV0aWZfcngoc2tiKTsKIAkJfSBlbHNlIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLAotCQkJICAgICAgIHNrYi0+ZGV2LT5uYW1lKTsKKwkJCSAgICAgICAia3Nfd2xhbjogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIpOwogCQkJcHJpdi0+bnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJfQogCQlicmVhazsKQEAgLTUxNyw4ICs1MTIsNyBAQAogCQkJbmV0aWZfcngoc2tiKTsKIAkJfSBlbHNlIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLAotCQkJICAgICAgIHNrYi0+ZGV2LT5uYW1lKTsKKwkJCSAgICAgICAia3Nfd2xhbjogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIpOwogCQkJcHJpdi0+bnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJfQogCQlicmVhazsKQEAgLTc3OCw3ICs3NzIsNyBAQAogCXdycXUuZGF0YS5mbGFncyA9IDA7CiAJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKIAlpZiAoKHByaXYtPmNvbm5lY3Rfc3RhdHVzICYgQ09OTkVDVF9TVEFUVVNfTUFTSykgPT0gQ09OTkVDVF9TVEFUVVMpIHsKLQkJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAnXDAnLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIod3JxdS5hcF9hZGRyLnNhX2RhdGEpOwogCQlEUFJJTlRLKDMsICJJV0VWRU5UOiBkaXNjb25uZWN0XG4iKTsKIAkJd2lyZWxlc3Nfc2VuZF9ldmVudChwcml2LT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKIAl9CkBAIC04MzYsNyArODMwLDcgQEAKIAl3cnF1MC5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKIAlpZiAoKHByaXYtPmNvbm5lY3Rfc3RhdHVzICYgQ09OTkVDVF9TVEFUVVNfTUFTSykgPT0gRElTQ09OTkVDVF9TVEFUVVMgJiYKIAkgICAgKG9sZF9zdGF0dXMgJiBDT05ORUNUX1NUQVRVU19NQVNLKSA9PSBDT05ORUNUX1NUQVRVUykgewotCQltZW1zZXQod3JxdTAuYXBfYWRkci5zYV9kYXRhLCAnXDAnLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIod3JxdTAuYXBfYWRkci5zYV9kYXRhKTsKIAkJRFBSSU5USygzLCAiSVdFVkVOVDogZGlzY29ubmVjdFxuIik7CiAJCURQUklOVEsoMywgImRpc2Nvbm5lY3QgOjogc2Nhbl9pbmRfY291bnQ9JWRcbiIsCiAJCQlwcml2LT5zY2FuX2luZF9jb3VudCk7CkBAIC05MDgsNyArOTAyLDcgQEAKIAkJaWYgKChwcml2LT5jb25uZWN0X3N0YXR1cyAmIENPTk5FQ1RfU1RBVFVTX01BU0spID09CiAJCSAgICBESVNDT05ORUNUX1NUQVRVUwogCQkgICAgJiYgKG9sZF9zdGF0dXMgJiBDT05ORUNUX1NUQVRVU19NQVNLKSA9PSBDT05ORUNUX1NUQVRVUykgewotCQkJbWVtc2V0KHdycXUwLmFwX2FkZHIuc2FfZGF0YSwgJ1wwJywgRVRIX0FMRU4pOworCQkJZXRoX3plcm9fYWRkcih3cnF1MC5hcF9hZGRyLnNhX2RhdGEpOwogCQkJRFBSSU5USygzLCAiSVdFVkVOVDogZGlzY29ubmVjdFxuIik7CiAJCQlwcmludGsoIklXRVZFTlQ6IGRpc2Nvbm5lY3RcbiIpOwogCQkJRFBSSU5USygzLCAiZGlzY29ubmVjdCA6OiBzY2FuX2luZF9jb3VudD0lZFxuIiwKQEAgLTExNDgsNyArMTE0Miw3IEBACiAKIAlwYWNrZXRfbGVuID0gcGFja2V0LT5sZW47CiAJaWYgKHBhY2tldF9sZW4gPiBFVEhfRlJBTUVfTEVOKSB7Ci0JCURQUklOVEsoMSwgImJhZCBsZW5ndGggcGFja2V0X2xlbj0lZCBcbiIsIHBhY2tldF9sZW4pOworCQlEUFJJTlRLKDEsICJiYWQgbGVuZ3RoIHBhY2tldF9sZW49JWRcbiIsIHBhY2tldF9sZW4pOwogCQlkZXZfa2ZyZWVfc2tiKHBhY2tldCk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0xMTcyLDExICsxMTY2LDEwIEBACiAJfQogCiAJRFBSSU5USyg0LCAic2tiX2J1ZmYgbGVuZ3RoPSVkXG4iLCBwYWNrZXRfbGVuKTsKLQlwcCA9IChzdHJ1Y3QgaG9zdGlmX2RhdGFfcmVxdWVzdF90ICopCi0JICAgIGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkgKyA2ICsgcGFja2V0X2xlbiArIDgpLAotCQkgICAgS1NfV0xBTl9NRU1fRkxBRyk7CisJcHAgPSBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApICsgNiArIHBhY2tldF9sZW4gKyA4KSwKKwkJICAgICBLU19XTEFOX01FTV9GTEFHKTsKIAotCWlmIChwcCA9PSBOVUxMKSB7CisJaWYgKCFwcCkgewogCQlEUFJJTlRLKDMsICJhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkLi5cbiIpOwogCQlkZXZfa2ZyZWVfc2tiKHBhY2tldCk7CiAJCXJldHVybiAtMjsKQEAgLTExOTQsNiArMTE4Nyw4IEBACiAJCURQUklOVEsoMSwgImV0aGVybmV0LT5oX3NvdXJjZT0lMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKIAkJCWV0aC0+aF9zb3VyY2VbMF0sIGV0aC0+aF9zb3VyY2VbMV0sIGV0aC0+aF9zb3VyY2VbMl0sCiAJCQlldGgtPmhfc291cmNlWzNdLCBldGgtPmhfc291cmNlWzRdLCBldGgtPmhfc291cmNlWzVdKTsKKwkJZGV2X2tmcmVlX3NrYihwYWNrZXQpOworCQlrZnJlZShwcCk7CiAJCXJldHVybiAtMzsKIAl9CiAKQEAgLTEyMzEsNyArMTIyNiw3IEBACiAJZXRoX2hkciA9IChzdHJ1Y3QgZXRoZXJfaGRyICopJnBwLT5kYXRhWzBdOwogCWV0aF9wcm90byA9IG50b2hzKGV0aF9oZHItPmhfcHJvdG8pOwogCi0JLyogZm9yIE1JQyBGQUlMVUVSIFJFUE9SVCBjaGVjayAqLworCS8qIGZvciBNSUMgRkFJTFVSRSBSRVBPUlQgY2hlY2sgKi8KIAlpZiAoZXRoX3Byb3RvID09IEVUSEVSX1BST1RPQ09MX1RZUEVfRUFQCiAJICAgICYmIHByaXYtPndwYS5taWNfZmFpbHVyZS5mYWlsdXJlID4gMCkgewogCQlhYTF4X2hkciA9IChzdHJ1Y3QgaWVlZTgwMl8xeF9oZHIgKikoZXRoX2hkciArIDEpOwpAQCAtMTI4NCw3ICsxMjc5LDcgQEAKIAkJCSAgKHZvaWQgKilzZW5kX3BhY2tldF9jb21wbGV0ZSwgKHZvaWQgKilwcml2LAogCQkJICAodm9pZCAqKXBhY2tldCk7CiAKLQkvKiBNSUMgRkFJTFVFUiBSRVBPUlQgY2hlY2sgKi8KKwkvKiBNSUMgRkFJTFVSRSBSRVBPUlQgY2hlY2sgKi8KIAlpZiAoZXRoX3Byb3RvID09IEVUSEVSX1BST1RPQ09MX1RZUEVfRUFQCiAJICAgICYmIHByaXYtPndwYS5taWNfZmFpbHVyZS5mYWlsdXJlID4gMCkgewogCQlpZiAoa2V5aW5mbyAmIFdQQV9LRVlfSU5GT19FUlJPUgpAQCAtMTMxMyw5ICsxMzA4LDggQEAKIAlEUFJJTlRLKDMsICJcbiIpOwogCiAJLyogbWFrZSBwcmltaXRpdmUgKi8KLQlwcCA9IChzdHJ1Y3QgaG9zdGlmX21pYl9nZXRfcmVxdWVzdF90ICopCi0JICAgIGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKLQlpZiAocHAgPT0gTlVMTCkgeworCXBwID0ga21hbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIEtTX1dMQU5fTUVNX0ZMQUcpOworCWlmICghcHApIHsKIAkJRFBSSU5USygzLCAiYWxsb2NhdGUgbWVtb3J5IGZhaWxlZC4uXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTEzNDQsOSArMTMzOCw4IEBACiAJfQogCiAJLyogbWFrZSBwcmltaXRpdmUgKi8KLQlwcCA9IChzdHJ1Y3QgaG9zdGlmX21pYl9zZXRfcmVxdWVzdF90ICopCi0JICAgIGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkgKyBzaXplKSwgS1NfV0xBTl9NRU1fRkxBRyk7Ci0JaWYgKHBwID09IE5VTEwpIHsKKwlwcCA9IGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkgKyBzaXplKSwgS1NfV0xBTl9NRU1fRkxBRyk7CisJaWYgKCFwcCkgewogCQlEUFJJTlRLKDMsICJhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkLi5cbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtMTM3NCw5ICsxMzY3LDggQEAKIAlEUFJJTlRLKDMsICJcbiIpOwogCiAJLyogbWFrZSBwcmltaXRpdmUgKi8KLQlwcCA9IChzdHJ1Y3QgaG9zdGlmX3N0YXJ0X3JlcXVlc3RfdCAqKQotCSAgICBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7Ci0JaWYgKHBwID09IE5VTEwpIHsKKwlwcCA9IGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKKwlpZiAoIXBwKSB7CiAJCURQUklOVEsoMywgImFsbG9jYXRlIG1lbW9yeSBmYWlsZWQuLlxuIik7CiAJCXJldHVybjsKIAl9CkBAIC0xNDAyLDkgKzEzOTQsOCBAQAogCURQUklOVEsoMywgIlxuIik7CiAKIAkvKiBtYWtlIHByaW1pdGl2ZSAqLwotCXBwID0gKHN0cnVjdCBob3N0aWZfcHNfYWRob2Nfc2V0X3JlcXVlc3RfdCAqKQotCSAgICBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7Ci0JaWYgKHBwID09IE5VTEwpIHsKKwlwcCA9IGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKKwlpZiAoIXBwKSB7CiAJCURQUklOVEsoMywgImFsbG9jYXRlIG1lbW9yeSBmYWlsZWQuLlxuIik7CiAJCXJldHVybjsKIAl9CkBAIC0xNDQzLDEyICsxNDM0LDExIEBACiAJc3RydWN0IGhvc3RpZl9pbmZyYXN0cnVjdHVyZV9zZXRfcmVxdWVzdF90ICpwcDsKIAl1aW50MTZfdCBjYXBhYmlsaXR5OwogCi0JRFBSSU5USygzLCAic3NpZC5zaXplPSVkIFxuIiwgcHJpdi0+cmVnLnNzaWQuc2l6ZSk7CisJRFBSSU5USygzLCAic3NpZC5zaXplPSVkXG4iLCBwcml2LT5yZWcuc3NpZC5zaXplKTsKIAogCS8qIG1ha2UgcHJpbWl0aXZlICovCi0JcHAgPSAoc3RydWN0IGhvc3RpZl9pbmZyYXN0cnVjdHVyZV9zZXRfcmVxdWVzdF90ICopCi0JICAgIGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKLQlpZiAocHAgPT0gTlVMTCkgeworCXBwID0ga21hbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIEtTX1dMQU5fTUVNX0ZMQUcpOworCWlmICghcHApIHsKIAkJRFBSSU5USygzLCAiYWxsb2NhdGUgbWVtb3J5IGZhaWxlZC4uXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE1MDUsMTcgKzE0OTUsMTYgQEAKIAlrc193bGFuX2h3X3R4KHByaXYsIHBwLCBoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIE5VTEwsIE5VTEwsIE5VTEwpOwogfQogCi12b2lkIGhvc3RpZl9pbmZyYXN0cnVjdHVyZV9zZXQyX3JlcXVlc3Qoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdikKK3N0YXRpYyB2b2lkIGhvc3RpZl9pbmZyYXN0cnVjdHVyZV9zZXQyX3JlcXVlc3Qoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdikKIHsKIAlzdHJ1Y3QgaG9zdGlmX2luZnJhc3RydWN0dXJlX3NldDJfcmVxdWVzdF90ICpwcDsKIAl1aW50MTZfdCBjYXBhYmlsaXR5OwogCi0JRFBSSU5USygyLCAic3NpZC5zaXplPSVkIFxuIiwgcHJpdi0+cmVnLnNzaWQuc2l6ZSk7CisJRFBSSU5USygyLCAic3NpZC5zaXplPSVkXG4iLCBwcml2LT5yZWcuc3NpZC5zaXplKTsKIAogCS8qIG1ha2UgcHJpbWl0aXZlICovCi0JcHAgPSAoc3RydWN0IGhvc3RpZl9pbmZyYXN0cnVjdHVyZV9zZXQyX3JlcXVlc3RfdCAqKQotCSAgICBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7Ci0JaWYgKHBwID09IE5VTEwpIHsKKwlwcCA9IGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKKwlpZiAoIXBwKSB7CiAJCURQUklOVEsoMywgImFsbG9jYXRlIG1lbW9yeSBmYWlsZWQuLlxuIik7CiAJCXJldHVybjsKIAl9CkBAIC0xNTgzLDkgKzE1NzIsOCBAQAogCURQUklOVEsoMywgIlxuIik7CiAKIAkvKiBtYWtlIHByaW1pdGl2ZSAqLwotCXBwID0gKHN0cnVjdCBob3N0aWZfYWRob2Nfc2V0X3JlcXVlc3RfdCAqKQotCSAgICBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7Ci0JaWYgKHBwID09IE5VTEwpIHsKKwlwcCA9IGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKKwlpZiAoIXBwKSB7CiAJCURQUklOVEsoMywgImFsbG9jYXRlIG1lbW9yeSBmYWlsZWQuLlxuIik7CiAJCXJldHVybjsKIAl9CkBAIC0xNjI5LDkgKzE2MTcsOCBAQAogCURQUklOVEsoMywgIlxuIik7CiAKIAkvKiBtYWtlIHByaW1pdGl2ZSAqLwotCXBwID0gKHN0cnVjdCBob3N0aWZfYWRob2Nfc2V0Ml9yZXF1ZXN0X3QgKikKLQkgICAga21hbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIEtTX1dMQU5fTUVNX0ZMQUcpOwotCWlmIChwcCA9PSBOVUxMKSB7CisJcHAgPSBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7CisJaWYgKCFwcCkgewogCQlEUFJJTlRLKDMsICJhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkLi5cbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtMTY3Nyw5ICsxNjY0LDggQEAKIAlEUFJJTlRLKDMsICJcbiIpOwogCiAJLyogbWFrZSBwcmltaXRpdmUgKi8KLQlwcCA9IChzdHJ1Y3QgaG9zdGlmX3N0b3BfcmVxdWVzdF90ICopCi0JICAgIGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKLQlpZiAocHAgPT0gTlVMTCkgeworCXBwID0ga21hbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIEtTX1dMQU5fTUVNX0ZMQUcpOworCWlmICghcHApIHsKIAkJRFBSSU5USygzLCAiYWxsb2NhdGUgbWVtb3J5IGZhaWxlZC4uXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE3MDAsOSArMTY4Niw4IEBACiAJRFBSSU5USygzLCAiXG4iKTsKIAogCS8qIG1ha2UgcHJpbWl0aXZlICovCi0JcHAgPSAoc3RydWN0IGhvc3RpZl9waHlfaW5mb3JtYXRpb25fcmVxdWVzdF90ICopCi0JICAgIGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKLQlpZiAocHAgPT0gTlVMTCkgeworCXBwID0ga21hbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIEtTX1dMQU5fTUVNX0ZMQUcpOworCWlmICghcHApIHsKIAkJRFBSSU5USygzLCAiYWxsb2NhdGUgbWVtb3J5IGZhaWxlZC4uXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE3MzIsOSArMTcxNyw4IEBACiAJRFBSSU5USygzLCAibW9kZT0lbHUgd2FrZV91cD0lbHUgcmVjZWl2ZURUSU1zPSVsdVxuIiwgbW9kZSwgd2FrZV91cCwKIAkJcmVjZWl2ZURUSU1zKTsKIAkvKiBtYWtlIHByaW1pdGl2ZSAqLwotCXBwID0gKHN0cnVjdCBob3N0aWZfcG93ZXJfbW5nbXRfcmVxdWVzdF90ICopCi0JICAgIGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKLQlpZiAocHAgPT0gTlVMTCkgeworCXBwID0ga21hbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIEtTX1dMQU5fTUVNX0ZMQUcpOworCWlmICghcHApIHsKIAkJRFBSSU5USygzLCAiYWxsb2NhdGUgbWVtb3J5IGZhaWxlZC4uXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE3NTUsMTMgKzE3MzksMTIgQEAKIHsKIAlzdHJ1Y3QgaG9zdGlmX3NsZWVwX3JlcXVlc3RfdCAqcHA7CiAKLQlEUFJJTlRLKDMsICJtb2RlPSVsdSBcbiIsIG1vZGUpOworCURQUklOVEsoMywgIm1vZGU9JWx1XG4iLCBtb2RlKTsKIAogCWlmIChtb2RlID09IFNMUF9TTEVFUCkgewogCQkvKiBtYWtlIHByaW1pdGl2ZSAqLwotCQlwcCA9IChzdHJ1Y3QgaG9zdGlmX3NsZWVwX3JlcXVlc3RfdCAqKQotCQkgICAga21hbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIEtTX1dMQU5fTUVNX0ZMQUcpOwotCQlpZiAocHAgPT0gTlVMTCkgeworCQlwcCA9IGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKKwkJaWYgKCFwcCkgewogCQkJRFBSSU5USygzLCAiYWxsb2NhdGUgbWVtb3J5IGZhaWxlZC4uXG4iKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMTc3OSwyMyArMTc2MiwyMiBAQAogCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+a3Nfd2xhbl9ody5rczcwMTBzZGlvX3dxLAogCQkJCSAgICZwcml2LT5rc193bGFuX2h3LnJ3X3dxLCAxKTsKIAl9IGVsc2UgewotCQlEUFJJTlRLKDMsICJpbnZhbGlkIG1vZGUgJWxkIFxuIiwgbW9kZSk7CisJCURQUklOVEsoMywgImludmFsaWQgbW9kZSAlbGRcbiIsIG1vZGUpOwogCQlyZXR1cm47CiAJfQogfQogCiBzdGF0aWMKIHZvaWQgaG9zdGlmX2Jzc19zY2FuX3JlcXVlc3Qoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdiwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBzY2FuX3R5cGUsIHVpbnQ4X3QgKiBzY2FuX3NzaWQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgc2Nhbl90eXBlLCB1aW50OF90ICpzY2FuX3NzaWQsCiAJCQkgICAgIHVpbnQ4X3Qgc2Nhbl9zc2lkX2xlbikKIHsKIAlzdHJ1Y3QgaG9zdGlmX2Jzc19zY2FuX3JlcXVlc3RfdCAqcHA7CiAKIAlEUFJJTlRLKDIsICJcbiIpOwogCS8qIG1ha2UgcHJpbWl0aXZlICovCi0JcHAgPSAoc3RydWN0IGhvc3RpZl9ic3Nfc2Nhbl9yZXF1ZXN0X3QgKikKLQkgICAga21hbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIEtTX1dMQU5fTUVNX0ZMQUcpOwotCWlmIChwcCA9PSBOVUxMKSB7CisJcHAgPSBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7CisJaWYgKCFwcCkgewogCQlEUFJJTlRLKDMsICJhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkLi5cbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtMTg1MCw5ICsxODMyLDggQEAKIAogCURQUklOVEsoMywgImNvdW50PSVkIDo6IHRpbWVyPSVkXG4iLCBmYWlsdXJlX2NvdW50LCB0aW1lcik7CiAJLyogbWFrZSBwcmltaXRpdmUgKi8KLQlwcCA9IChzdHJ1Y3QgaG9zdGlmX21pY19mYWlsdXJlX3JlcXVlc3RfdCAqKQotCSAgICBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7Ci0JaWYgKHBwID09IE5VTEwpIHsKKwlwcCA9IGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKKwlpZiAoIXBwKSB7CiAJCURQUklOVEsoMywgImFsbG9jYXRlIG1lbW9yeSBmYWlsZWQuLlxuIik7CiAJCXJldHVybjsKIAl9CkBAIC0xODY3LDcgKzE4NDgsNyBAQAogCWtzX3dsYW5faHdfdHgocHJpdiwgcHAsIGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgTlVMTCwgTlVMTCwgTlVMTCk7CiB9CiAKLS8qIERldmljZSBJL08gUmVjaWV2ZSBpbmRpY2F0ZSAqLworLyogRGV2aWNlIEkvTyBSZWNlaXZlIGluZGljYXRlICovCiBzdGF0aWMgdm9pZCBkZXZpb19yZWNfaW5kKHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGNoYXIgKnAsCiAJCQkgIHVuc2lnbmVkIGludCBzaXplKQogewpAQCAtMjcwMCw3ICsyNjgxLDYgQEAKIAogaW50IGhvc3RpZl9pbml0KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpCiB7Ci0JaW50IHJjID0gMDsKIAlpbnQgaTsKIAogCURQUklOVEsoMywgIlxuIik7CkBAIC0yNzUwLDcgKzI3MzAsNyBAQAogCiAJdGFza2xldF9pbml0KCZwcml2LT5zbWVfdGFzaywgaG9zdGlmX3NtZV90YXNrLCAodW5zaWduZWQgbG9uZylwcml2KTsKIAotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBob3N0aWZfZXhpdChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rc19ob3N0aWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAva3NfaG9zdGlmLmgKaW5kZXggZGM4MDZiNWIuLjc0M2YzMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAva3NfaG9zdGlmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rc19ob3N0aWYuaApAQCAtMTEsNiArMTEsOSBAQAogCiAjaWZuZGVmIF9LU19IT1NUSUZfSF8KICNkZWZpbmUgX0tTX0hPU1RJRl9IXworCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKwogLyoKICAqIEhPU1QtTUFDIEkvRiBldmVudHMKICAqLwpAQCAtNjEsNyArNjQsNyBAQAogc3RydWN0IGhvc3RpZl9oZHIgewogCXVpbnQxNl90IHNpemU7CiAJdWludDE2X3QgZXZlbnQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfZGF0YV9yZXF1ZXN0X3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKQEAgLTcwLDcgKzczLDcgQEAKICNkZWZpbmUgVFlQRV9BVVRIIDB4MDAwMQogCXVpbnQxNl90IHJlc2VydmVkOwogCXVpbnQ4X3QgZGF0YVswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RpZl9kYXRhX2luZGljYXRpb25fdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwpAQCAtODEsMTQgKzg0LDE0IEBACiAjZGVmaW5lIFRZUEVfR01LMiAweDAwMDMKIAl1aW50MTZfdCByZXNlcnZlZDsKIAl1aW50OF90IGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgQ0hBTk5FTF9MSVNUX01BWF9TSVpFIDE0CiBzdHJ1Y3QgY2hhbm5lbF9saXN0X3QgewogCXVpbnQ4X3Qgc2l6ZTsKIAl1aW50OF90IGJvZHlbQ0hBTk5FTF9MSVNUX01BWF9TSVpFXTsKIAl1aW50OF90IHBhZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogTUlCIEF0dHJpYnV0ZSAqLwogI2RlZmluZSBET1QxMV9NQUNfQUREUkVTUyAgICAgICAgICAgICAgICAgMHgyMTAxMDEwMAkvKiBNQUMgQWRkcmVzcyAoUikgKi8KQEAgLTE0MSw3ICsxNDQsNyBAQAogc3RydWN0IGhvc3RpZl9taWJfZ2V0X3JlcXVlc3RfdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwogCXVpbnQzMl90IG1pYl9hdHRyaWJ1dGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfbWliX3ZhbHVlX3QgewogCXVpbnQxNl90IHNpemU7CkBAIC0xNTIsNyArMTU1LDcgQEAKICNkZWZpbmUgTUlCX1ZBTFVFX1RZUEVfQ09VTlQzMiAgMwogI2RlZmluZSBNSUJfVkFMVUVfVFlQRV9PU1RSSU5HICA0CiAJdWludDhfdCBib2R5WzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX21pYl9nZXRfY29uZmlybV90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CkBAIC0xNjMsMTkgKzE2NiwxOSBAQAogI2RlZmluZSBNSUJfV1JJVEVfT05MWSAzCiAJdWludDMyX3QgbWliX2F0dHJpYnV0ZTsKIAlzdHJ1Y3QgaG9zdGlmX21pYl92YWx1ZV90IG1pYl92YWx1ZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RpZl9taWJfc2V0X3JlcXVlc3RfdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwogCXVpbnQzMl90IG1pYl9hdHRyaWJ1dGU7CiAJc3RydWN0IGhvc3RpZl9taWJfdmFsdWVfdCBtaWJfdmFsdWU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfbWliX3NldF9jb25maXJtX3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKIAl1aW50MzJfdCBtaWJfc3RhdHVzOwogCXVpbnQzMl90IG1pYl9hdHRyaWJ1dGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfcG93ZXJfbW5nbXRfcmVxdWVzdF90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CkBAIC0xODgsNyArMTkxLDcgQEAKIAl1aW50MzJfdCByZWNlaXZlRFRJTXM7CiAjZGVmaW5lIERUSU1fRkFMU0UgMAogI2RlZmluZSBEVElNX1RSVUUgIDEKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogcG93ZXIgbWFuYWdlbWVudCBtb2RlICovCiBlbnVtIHsKQEAgLTIwNiw3ICsyMDksNyBAQAogc3RydWN0IGhvc3RpZl9wb3dlcl9tbmdtdF9jb25maXJtX3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKIAl1aW50MTZfdCByZXN1bHRfY29kZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RpZl9zdGFydF9yZXF1ZXN0X3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKQEAgLTIxNSw2NCArMjE4LDY0IEBACiAjZGVmaW5lIE1PREVfSU5GUkFTVFJVQ1RVUkUgMQogI2RlZmluZSBNT0RFX0FQICAgICAgICAgICAgIDIJLyogbm90IHVzZWQgKi8KICNkZWZpbmUgTU9ERV9BREhPQyAgICAgICAgICAzCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfc3RhcnRfY29uZmlybV90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CiAJdWludDE2X3QgcmVzdWx0X2NvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgU1NJRF9NQVhfU0laRSAzMgogc3RydWN0IHNzaWRfdCB7CiAJdWludDhfdCBzaXplOwogCXVpbnQ4X3QgYm9keVtTU0lEX01BWF9TSVpFXTsKIAl1aW50OF90IHNzaWRfcGFkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIFJBVEVfU0VUX01BWF9TSVpFIDE2CiBzdHJ1Y3QgcmF0ZV9zZXQ4X3QgewogCXVpbnQ4X3Qgc2l6ZTsKIAl1aW50OF90IGJvZHlbOF07CiAJdWludDhfdCByYXRlX3BhZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IEZoUGFybXNfdCB7CiAJdWludDE2X3QgZHdlbGxUaW1lOwogCXVpbnQ4X3QgaG9wU2V0OwogCXVpbnQ4X3QgaG9wUGF0dGVybjsKIAl1aW50OF90IGhvcEluZGV4OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgRHNQYXJtc190IHsKIAl1aW50OF90IGNoYW5uZWw7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBDZlBhcm1zX3QgewogCXVpbnQ4X3QgY291bnQ7CiAJdWludDhfdCBwZXJpb2Q7CiAJdWludDE2X3QgbWF4RHVyYXRpb247CiAJdWludDE2X3QgZHVyUmVtYWluaW5nOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgSWJzc1Bhcm1zX3QgewogCXVpbnQxNl90IGF0aW1XaW5kb3c7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCByc25fdCB7CiAJdWludDhfdCBzaXplOwogI2RlZmluZSBSU05fQk9EWV9TSVpFIDY0CiAJdWludDhfdCBib2R5W1JTTl9CT0RZX1NJWkVdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgRXJwUGFyYW1zX3QgewogCXVpbnQ4X3QgZXJwX2luZm87Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCByYXRlX3NldDE2X3QgewogCXVpbnQ4X3Qgc2l6ZTsKIAl1aW50OF90IGJvZHlbMTZdOwogCXVpbnQ4X3QgcmF0ZV9wYWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhcF9pbmZvX3QgewogCXVpbnQ4X3QgYnNzaWRbNl07CS8qICswMCAqLwpAQCAtMjk5LDcgKzMwMiw3IEBACiAJdWludDE2X3QgYm9keV9zaXplOwkvKiArMTYgKi8KIAl1aW50OF90IGJvZHlbMTAyNF07CS8qICsxOCAqLwogCS8qICsxMDMyICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBsaW5rX2FwX2luZm9fdCB7CiAJdWludDhfdCBic3NpZFs2XTsJLyogKzAwICovCkBAIC0zMjUsOCArMzI4LDggQEAKIAlzdHJ1Y3QgewogCQl1aW50OF90IHNpemU7CS8qICs1MiAqLwogCQl1aW50OF90IGJvZHlbMTI4XTsJLyogKzUzICovCi0JfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcnNuOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJfSBfX3BhY2tlZCByc247Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX2Nvbm5lY3RfaW5kaWNhdGlvbl90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CkBAIC0zMzQsMTYgKzMzNywxNiBAQAogI2RlZmluZSBSRVNVTFRfQ09OTkVDVCAgICAwCiAjZGVmaW5lIFJFU1VMVF9ESVNDT05ORUNUIDEKIAlzdHJ1Y3QgbGlua19hcF9pbmZvX3QgbGlua19hcF9pbmZvOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX3N0b3BfcmVxdWVzdF90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfc3RvcF9jb25maXJtX3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKIAl1aW50MTZfdCByZXN1bHRfY29kZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RpZl9wc19hZGhvY19zZXRfcmVxdWVzdF90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CkBAIC0zNjAsMTIgKzM2MywxMiBAQAogCXVpbnQxNl90IGNhcGFiaWxpdHk7CS8qIGJpdDU6cHJlYW1ibGUgYml0NjpwYmNjIHBiY2Mgbm90IHN1cHBvcnRlZCBhbHdheXMgMCAKIAkJCQkgKiBiaXQxMDpTaG9ydFNsb3RUaW1lIGJpdDEzOkRTU1MtT0ZETSBEU1NTLU9GRE0gbm90IHN1cHBvcnRlZCBhbHdheXMgMCAqLwogCXVpbnQxNl90IHNjYW5fdHlwZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RpZl9wc19hZGhvY19zZXRfY29uZmlybV90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CiAJdWludDE2X3QgcmVzdWx0X2NvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfaW5mcmFzdHJ1Y3R1cmVfc2V0X3JlcXVlc3RfdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwpAQCAtMzgxLDcgKzM4NCw3IEBACiAjZGVmaW5lIEFVVEhfVFlQRV9TSEFSRURfS0VZICAxCiAJc3RydWN0IGNoYW5uZWxfbGlzdF90IGNoYW5uZWxfbGlzdDsKIAl1aW50MTZfdCBzY2FuX3R5cGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfaW5mcmFzdHJ1Y3R1cmVfc2V0Ml9yZXF1ZXN0X3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKQEAgLTM5OCwxMiArNDAxLDEyIEBACiAJc3RydWN0IGNoYW5uZWxfbGlzdF90IGNoYW5uZWxfbGlzdDsKIAl1aW50MTZfdCBzY2FuX3R5cGU7CiAJdWludDhfdCBic3NpZFtFVEhfQUxFTl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfaW5mcmFzdHJ1Y3R1cmVfc2V0X2NvbmZpcm1fdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwogCXVpbnQxNl90IHJlc3VsdF9jb2RlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX2FkaG9jX3NldF9yZXF1ZXN0X3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKQEAgLTQxNSw3ICs0MTgsNyBAQAogCXVpbnQxNl90IGNhcGFiaWxpdHk7CS8qIGJpdDU6cHJlYW1ibGUgYml0NjpwYmNjIHBiY2Mgbm90IHN1cHBvcnRlZCBhbHdheXMgMCAKIAkJCQkgKiBiaXQxMDpTaG9ydFNsb3RUaW1lIGJpdDEzOkRTU1MtT0ZETSBEU1NTLU9GRE0gbm90IHN1cHBvcnRlZCBhbHdheXMgMCAqLwogCXVpbnQxNl90IHNjYW5fdHlwZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RpZl9hZGhvY19zZXQyX3JlcXVlc3RfdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwpAQCAtNDI5LDE3ICs0MzIsMTcgQEAKIAl1aW50MTZfdCBzY2FuX3R5cGU7CiAJc3RydWN0IGNoYW5uZWxfbGlzdF90IGNoYW5uZWxfbGlzdDsKIAl1aW50OF90IGJzc2lkW0VUSF9BTEVOXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RpZl9hZGhvY19zZXRfY29uZmlybV90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CiAJdWludDE2X3QgcmVzdWx0X2NvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBsYXN0X2Fzc29jaWF0ZV90IHsKIAl1aW50OF90IHR5cGU7CiAJdWludDhfdCBzdGF0dXM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhc3NvY2lhdGlvbl9yZXF1ZXN0X3QgewogCXVpbnQ4X3QgdHlwZTsKQEAgLTQ1MCw3ICs0NTMsNyBAQAogCXVpbnQxNl90IGxpc3Rlbl9pbnRlcnZhbDsKIAl1aW50OF90IGFwX2FkZHJlc3NbNl07CiAJdWludDE2X3QgcmVxSUVzX3NpemU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhc3NvY2lhdGlvbl9yZXNwb25zZV90IHsKIAl1aW50OF90IHR5cGU7CkBAIC00NjEsNyArNDY0LDcgQEAKIAl1aW50MTZfdCBzdGF0dXM7CiAJdWludDE2X3QgYXNzb2NpYXRpb25faWQ7CiAJdWludDE2X3QgcmVzcElFc19zaXplOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX2Fzc29jaWF0ZV9pbmRpY2F0aW9uX3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKQEAgLTQ2OSw3ICs0NzIsNyBAQAogCXN0cnVjdCBhc3NvY2lhdGlvbl9yZXNwb25zZV90IGFzc29jX3Jlc3A7CiAJLyogZm9sbG93ZWQgYnkgKHJlcUlFc19zaXplICsgcmVzcElFc19zaXplKSBvY3RldHMgb2YgZGF0YSAqLwogCS8qIHJlcUlFcyBkYXRhICovLyogcmVzcElFcyBkYXRhICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfYnNzX3NjYW5fcmVxdWVzdF90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CkBAIC00ODEsMTMgKzQ4NCwxMyBAQAogCXVpbnQzMl90IGNoX3RpbWVfbWF4OwogCXN0cnVjdCBjaGFubmVsX2xpc3RfdCBjaGFubmVsX2xpc3Q7CiAJc3RydWN0IHNzaWRfdCBzc2lkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX2Jzc19zY2FuX2NvbmZpcm1fdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwogCXVpbnQxNl90IHJlc3VsdF9jb2RlOwogCXVpbnQxNl90IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX3BoeV9pbmZvcm1hdGlvbl9yZXF1ZXN0X3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKQEAgLTQ5NSw3ICs0OTgsNyBAQAogI2RlZmluZSBOT1JNQUxfVFlQRQkwCiAjZGVmaW5lIFRJTUVfVFlQRQkxCiAJdWludDE2X3QgdGltZTsJLyogdW5pdCAxMDBtcyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX3BoeV9pbmZvcm1hdGlvbl9jb25maXJtX3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKQEAgLTUwNywzMCArNTEwLDMwIEBACiAJdWludDMyX3QgcnhfZnJhbWU7CiAJdWludDMyX3QgdHhfZXJyb3I7CiAJdWludDMyX3QgcnhfZXJyb3I7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIHNsZWVwIG1vZGUgKi8KICNkZWZpbmUgU0xQX0FDVElWRSAgMAogI2RlZmluZSBTTFBfU0xFRVAgICAxCiBzdHJ1Y3QgaG9zdGlmX3NsZWVwX3JlcXVlc3RfdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX3NsZWVwX2NvbmZpcm1fdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwogCXVpbnQxNl90IHJlc3VsdF9jb2RlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX21pY19mYWlsdXJlX3JlcXVlc3RfdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwogCXVpbnQxNl90IGZhaWx1cmVfY291bnQ7CiAJdWludDE2X3QgdGltZXI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfbWljX2ZhaWx1cmVfY29uZmlybV90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CiAJdWludDE2X3QgcmVzdWx0X2NvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgQkFTSUNfUkFURQkweDgwCiAjZGVmaW5lIFJBVEVfTUFTSwkweDdGCkBAIC02MTYsMTMgKzYxOSwyMSBAQAogI2luY2x1ZGUgImtzX3dsYW4uaCIKIAogLyogZnVuY3Rpb24gcHJvdG90eXBlICovCi1leHRlcm4gaW50IGhvc3RpZl9kYXRhX3JlcXVlc3Qoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcGFja2V0KTsKLWV4dGVybiB2b2lkIGhvc3RpZl9yZWNlaXZlKHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGNoYXIgKnAsCi0JCQkgICB1bnNpZ25lZCBpbnQgc2l6ZSk7Ci1leHRlcm4gdm9pZCBob3N0aWZfc21lX2VucXVldWUoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdiwgdWludDE2X3QgZXZlbnQpOwotZXh0ZXJuIGludCBob3N0aWZfaW5pdChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KTsKLWV4dGVybiB2b2lkIGhvc3RpZl9leGl0KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpOworaW50IGhvc3RpZl9kYXRhX3JlcXVlc3Qoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdiwKKwkJCSBzdHJ1Y3Qgc2tfYnVmZiAqcGFja2V0KTsKK3ZvaWQgaG9zdGlmX3JlY2VpdmUoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgY2hhciAqcCwKKwkgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemUpOwordm9pZCBob3N0aWZfc21lX2VucXVldWUoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdiwgdWludDE2X3QgZXZlbnQpOworaW50IGhvc3RpZl9pbml0KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpOwordm9pZCBob3N0aWZfZXhpdChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KTsKK2ludCBrc193bGFuX2h3X3R4KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYsIHZvaWQgKnAsCisJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJICAgdm9pZCAoKmNvbXBsZXRlX2hhbmRsZXIpICh2b2lkICphcmcxLCB2b2lkICphcmcyKSwKKwkJICAgdm9pZCAqYXJnMSwgdm9pZCAqYXJnMik7Cit2b2lkIHNlbmRfcGFja2V0X2NvbXBsZXRlKHZvaWQgKiwgdm9pZCAqKTsKKwordm9pZCBrc193bGFuX2h3X3dha2V1cF9yZXF1ZXN0KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpOworaW50IGtzX3dsYW5faHdfcG93ZXJfc2F2ZShzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KTsKIAogc3RhdGljCiBpbmxpbmUgaW50IGhpZl9hbGlnbl9zaXplKGludCBzaXplKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rc193bGFuLmggYi9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2tzX3dsYW4uaAppbmRleCBmMDVkYzAxLi5jMmNjMjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2tzX3dsYW4uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2tzX3dsYW4uaApAQCAtMjE5LDcgKzIxOSw3IEBACiAJdWludDhfdCBpZDsJLyogMHhkZCA9IFdQQSBvciAweDMwID0gUlNOICovCiAJdWludDhfdCBzaXplOwkvKiBtYXggPyAyNTUgPyAqLwogCXVpbnQ4X3QgYm9keVtSU05fSUVfQk9EWV9NQVhdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjaWZkZWYgV1BTCiAjZGVmaW5lIFdQU19JRV9CT0RZX01BWCAyNTUKQEAgLTIyNyw3ICsyMjcsNyBAQAogCXVpbnQ4X3QgaWQ7CS8qIDIyMSAnZGQgPGxlbj4gMDAgNTAgRjIgMDQnICovCiAJdWludDhfdCBzaXplOwkvKiBtYXggPyAyNTUgPyAqLwogCXVpbnQ4X3QgYm9keVtXUFNfSUVfQk9EWV9NQVhdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogI2VuZGlmIC8qIFdQUyAqLwogCiBzdHJ1Y3QgbG9jYWxfYXBfdCB7CkBAIC00OTksNyArNDk5LDcgQEAKIAl1aW50IHdha2V1cF9jb3VudDsJLyogZm9yIGRldGVjdCB3YWtldXAgbG9vcCAqLwogfTsKIAotZXh0ZXJuIGludCBrc193bGFuX25ldF9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybiBpbnQga3Nfd2xhbl9uZXRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBrc193bGFuX25ldF9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBrc193bGFuX25ldF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiAjZW5kaWYgLyogX0tTX1dMQU5fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rc193bGFuX2lvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2tzX3dsYW5faW9jdGwuaAppbmRleCA0OTM2OWU0Li44NDU1NGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2tzX3dsYW5faW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2tzX3dsYW5faW9jdGwuaApAQCAtNTgsOSArNTgsOSBAQAogI2luY2x1ZGUgImtzX3dsYW4uaCIKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KIAotZXh0ZXJuIGludCBrc193bGFuX3JlYWRfY29uZmlnX2ZpbGUoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdik7Ci1leHRlcm4gaW50IGtzX3dsYW5fc2V0dXBfcGFyYW1ldGVyKHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYsCi0JCQkJICAgdW5zaWduZWQgaW50IGNvbW1pdF9mbGFnKTsKK2ludCBrc193bGFuX3JlYWRfY29uZmlnX2ZpbGUoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdik7CitpbnQga3Nfd2xhbl9zZXR1cF9wYXJhbWV0ZXIoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdiwKKwkJICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb21taXRfZmxhZyk7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAva3Nfd2xhbl9uZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAva3Nfd2xhbl9uZXQuYwppbmRleCAxZTIxZWIxLi5iMmI0ZmE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2tzX3dsYW5fbmV0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rc193bGFuX25ldC5jCkBAIC05LDcgKzksNiBAQAogICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CkBAIC03MCwxMCArNjksNiBAQAogLyoKICAqCWZ1bmN0aW9uIHByb3RvdHlwZXMKICAqLwotZXh0ZXJuIGludCBrc193bGFuX2h3X3R4KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYsIHZvaWQgKnAsCi0JCQkgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJIHZvaWQgKCpjb21wbGV0ZV9oYW5kbGVyKSAodm9pZCAqYXJnMSwgdm9pZCAqYXJnMiksCi0JCQkgdm9pZCAqYXJnMSwgdm9pZCAqYXJnMik7CiBzdGF0aWMgaW50IGtzX3dsYW5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIGtzX3dsYW5fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQga3Nfd2xhbl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpAQCAtMjM4LDkgKzIzMyw5IEBACiAJCS8qIFdlIHNob3VsZCBkbyBhIGJldHRlciBjaGVjayB0aGFuIHRoYXQsCiAJCSAqIGJhc2VkIG9uIHRoZSBjYXJkIGNhcGFiaWxpdHkgISEhICovCiAJCWlmICgoY2hhbm5lbCA8IDEpIHx8IChjaGFubmVsID4gMTQpKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRwotCQkJICAgICAgICIlczogTmV3IGNoYW5uZWwgdmFsdWUgb2YgJWQgaXMgaW52YWxpZCFcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lLCBmd3JxLT5tKTsKKwkJCW5ldGRldl9kYmcoZGV2LAorCQkJCSAgICIlczogTmV3IGNoYW5uZWwgdmFsdWUgb2YgJWQgaXMgaW52YWxpZCFcbiIsCisJCQkJICAgZGV2LT5uYW1lLCBmd3JxLT5tKTsKIAkJCXJjID0gLUVJTlZBTDsKIAkJfSBlbHNlIHsKIAkJCS8qIFllcyAhIFdlIGNhbiBzZXQgaXQgISEhICovCkBAIC00MDIsNyArMzk3LDcgQEAKIAkJCXByaXYtPm5lZWRfY29tbWl0IHw9IFNNRV9NT0RFX1NFVDsKIAkJfQogCX0gZWxzZSB7Ci0JCW1lbXNldChwcml2LT5yZWcuYnNzaWQsIDB4MCwgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKHByaXYtPnJlZy5ic3NpZCk7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKQEAgLTQzMyw3ICs0MjgsNyBAQAogCWlmICgocHJpdi0+Y29ubmVjdF9zdGF0dXMgJiBDT05ORUNUX1NUQVRVU19NQVNLKSA9PSBDT05ORUNUX1NUQVRVUykgewogCQltZW1jcHkoYXdycS0+c2FfZGF0YSwgJihwcml2LT5jdXJyZW50X2FwLmJzc2lkWzBdKSwgRVRIX0FMRU4pOwogCX0gZWxzZSB7Ci0JCW1lbXNldChhd3JxLT5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIoYXdycS0+c2FfZGF0YSk7CiAJfQogCiAJYXdycS0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwpAQCAtMjA5Miw3ICsyMDg3LDcgQEAKIAkJCWxpc3RfZm9yX2VhY2gocHRyLCAmcHJpdi0+cG1rbGlzdC5oZWFkKSB7CiAJCQkJcG1rID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBwbWtfdCwgbGlzdCk7CiAJCQkJaWYgKCFtZW1jbXAocG1rc2EtPmJzc2lkLnNhX2RhdGEsIHBtay0+YnNzaWQsIEVUSF9BTEVOKSkgewkvKiBtYXRjaCBhZGRyZXNzISBsaXN0IGRlbC4gKi8KLQkJCQkJbWVtc2V0KHBtay0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKKwkJCQkJZXRoX3plcm9fYWRkcihwbWstPmJzc2lkKTsKIAkJCQkJbWVtc2V0KHBtay0+cG1raWQsIDAsIElXX1BNS0lEX0xFTik7CiAJCQkJCWxpc3RfZGVsX2luaXQoJnBtay0+bGlzdCk7CiAJCQkJCWJyZWFrOwpAQCAtMjY3NiwxNyArMjY3MSwxNyBAQAogCiAJaWYgKCp1d3JxID09IFNMUF9TTEVFUCkgewogCQlwcml2LT5zbGVlcF9tb2RlID0gKnV3cnE7Ci0JCXByaW50aygiU0VUX1NMRUVQX01PREUgJWRcbiIsIHByaXYtPnNsZWVwX21vZGUpOworCQluZXRkZXZfaW5mbyhkZXYsICJTRVRfU0xFRVBfTU9ERSAlZFxuIiwgcHJpdi0+c2xlZXBfbW9kZSk7CiAKIAkJaG9zdGlmX3NtZV9lbnF1ZXVlKHByaXYsIFNNRV9TVE9QX1JFUVVFU1QpOwogCQlob3N0aWZfc21lX2VucXVldWUocHJpdiwgU01FX1NMRUVQX1JFUVVFU1QpOwogCiAJfSBlbHNlIGlmICgqdXdycSA9PSBTTFBfQUNUSVZFKSB7CiAJCXByaXYtPnNsZWVwX21vZGUgPSAqdXdycTsKLQkJcHJpbnRrKCJTRVRfU0xFRVBfTU9ERSAlZFxuIiwgcHJpdi0+c2xlZXBfbW9kZSk7CisJCW5ldGRldl9pbmZvKGRldiwgIlNFVF9TTEVFUF9NT0RFICVkXG4iLCBwcml2LT5zbGVlcF9tb2RlKTsKIAkJaG9zdGlmX3NtZV9lbnF1ZXVlKHByaXYsIFNNRV9TTEVFUF9SRVFVRVNUKTsKIAl9IGVsc2UgewotCQlwcmludGsoIlNFVF9TTEVFUF9NT0RFICVkIGVycnJvclxuIiwgKnV3cnEpOworCQluZXRkZXZfZXJyKGRldiwgIlNFVF9TTEVFUF9NT0RFICVkIGVycnJvclxuIiwgKnV3cnEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI3ODgsNyArMjc4Myw3IEBACiAJfQogCS8qIGZvciBTTEVFUCBNT0RFICovCiAJKnV3cnEgPSBwcml2LT53cHMud3BzX2VuYWJsZWQ7Ci0JcHJpbnRrKCJyZXR1cm49JWRcbiIsICp1d3JxKTsKKwluZXRkZXZfaW5mbyhkZXYsICJyZXR1cm49JWRcbiIsICp1d3JxKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjk3OCwxMTcgKzI5NzMsMTE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X2hpZl9ldmVudChpbnQgZXZlbnQpCitzdGF0aWMgdm9pZCBwcmludF9oaWZfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGV2ZW50KQogewogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgSElGX0RBVEFfUkVROgotCQlwcmludGsoIkhJRl9EQVRBX1JFUVxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9EQVRBX1JFUVxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX0RBVEFfSU5EOgotCQlwcmludGsoIkhJRl9EQVRBX0lORFxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9EQVRBX0lORFxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX01JQl9HRVRfUkVROgotCQlwcmludGsoIkhJRl9NSUJfR0VUX1JFUVxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9NSUJfR0VUX1JFUVxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX01JQl9HRVRfQ09ORjoKLQkJcHJpbnRrKCJISUZfTUlCX0dFVF9DT05GXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX01JQl9HRVRfQ09ORlxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX01JQl9TRVRfUkVROgotCQlwcmludGsoIkhJRl9NSUJfU0VUX1JFUVxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9NSUJfU0VUX1JFUVxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX01JQl9TRVRfQ09ORjoKLQkJcHJpbnRrKCJISUZfTUlCX1NFVF9DT05GXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX01JQl9TRVRfQ09ORlxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX1BPV0VSTUdUX1JFUToKLQkJcHJpbnRrKCJISUZfUE9XRVJNR1RfUkVRXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX1BPV0VSTUdUX1JFUVxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX1BPV0VSTUdUX0NPTkY6Ci0JCXByaW50aygiSElGX1BPV0VSTUdUX0NPTkZcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfUE9XRVJNR1RfQ09ORlxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX1NUQVJUX1JFUToKLQkJcHJpbnRrKCJISUZfU1RBUlRfUkVRXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX1NUQVJUX1JFUVxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX1NUQVJUX0NPTkY6Ci0JCXByaW50aygiSElGX1NUQVJUX0NPTkZcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfU1RBUlRfQ09ORlxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX0NPTk5FQ1RfSU5EOgotCQlwcmludGsoIkhJRl9DT05ORUNUX0lORFxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9DT05ORUNUX0lORFxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX1NUT1BfUkVROgotCQlwcmludGsoIkhJRl9TVE9QX1JFUVxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9TVE9QX1JFUVxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX1NUT1BfQ09ORjoKLQkJcHJpbnRrKCJISUZfU1RPUF9DT05GXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX1NUT1BfQ09ORlxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX1BTX0FESF9TRVRfUkVROgotCQlwcmludGsoIkhJRl9QU19BREhfU0VUX1JFUVxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9QU19BREhfU0VUX1JFUVxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX1BTX0FESF9TRVRfQ09ORjoKLQkJcHJpbnRrKCJISUZfUFNfQURIX1NFVF9DT05GXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX1BTX0FESF9TRVRfQ09ORlxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX0lORlJBX1NFVF9SRVE6Ci0JCXByaW50aygiSElGX0lORlJBX1NFVF9SRVFcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfSU5GUkFfU0VUX1JFUVxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX0lORlJBX1NFVF9DT05GOgotCQlwcmludGsoIkhJRl9JTkZSQV9TRVRfQ09ORlxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9JTkZSQV9TRVRfQ09ORlxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX0FESF9TRVRfUkVROgotCQlwcmludGsoIkhJRl9BREhfU0VUX1JFUVxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9BREhfU0VUX1JFUVxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX0FESF9TRVRfQ09ORjoKLQkJcHJpbnRrKCJISUZfQURIX1NFVF9DT05GXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX0FESF9TRVRfQ09ORlxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX0FQX1NFVF9SRVE6Ci0JCXByaW50aygiSElGX0FQX1NFVF9SRVFcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfQVBfU0VUX1JFUVxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX0FQX1NFVF9DT05GOgotCQlwcmludGsoIkhJRl9BUF9TRVRfQ09ORlxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9BUF9TRVRfQ09ORlxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX0FTU09DX0lORk9fSU5EOgotCQlwcmludGsoIkhJRl9BU1NPQ19JTkZPX0lORFxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9BU1NPQ19JTkZPX0lORFxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX01JQ19GQUlMVVJFX1JFUToKLQkJcHJpbnRrKCJISUZfTUlDX0ZBSUxVUkVfUkVRXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX01JQ19GQUlMVVJFX1JFUVxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX01JQ19GQUlMVVJFX0NPTkY6Ci0JCXByaW50aygiSElGX01JQ19GQUlMVVJFX0NPTkZcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfTUlDX0ZBSUxVUkVfQ09ORlxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX1NDQU5fUkVROgotCQlwcmludGsoIkhJRl9TQ0FOX1JFUVxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9TQ0FOX1JFUVxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX1NDQU5fQ09ORjoKLQkJcHJpbnRrKCJISUZfU0NBTl9DT05GXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX1NDQU5fQ09ORlxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX1BIWV9JTkZPX1JFUToKLQkJcHJpbnRrKCJISUZfUEhZX0lORk9fUkVRXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX1BIWV9JTkZPX1JFUVxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX1BIWV9JTkZPX0NPTkY6Ci0JCXByaW50aygiSElGX1BIWV9JTkZPX0NPTkZcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfUEhZX0lORk9fQ09ORlxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX1NMRUVQX1JFUToKLQkJcHJpbnRrKCJISUZfU0xFRVBfUkVRXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX1NMRUVQX1JFUVxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX1NMRUVQX0NPTkY6Ci0JCXByaW50aygiSElGX1NMRUVQX0NPTkZcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfU0xFRVBfQ09ORlxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX1BIWV9JTkZPX0lORDoKLQkJcHJpbnRrKCJISUZfUEhZX0lORk9fSU5EXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX1BIWV9JTkZPX0lORFxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX1NDQU5fSU5EOgotCQlwcmludGsoIkhJRl9TQ0FOX0lORFxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9TQ0FOX0lORFxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX0lORlJBX1NFVDJfUkVROgotCQlwcmludGsoIkhJRl9JTkZSQV9TRVQyX1JFUVxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9JTkZSQV9TRVQyX1JFUVxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX0lORlJBX1NFVDJfQ09ORjoKLQkJcHJpbnRrKCJISUZfSU5GUkFfU0VUMl9DT05GXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX0lORlJBX1NFVDJfQ09ORlxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX0FESF9TRVQyX1JFUToKLQkJcHJpbnRrKCJISUZfQURIX1NFVDJfUkVRXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX0FESF9TRVQyX1JFUVxuIik7CiAJCWJyZWFrOwogCWNhc2UgSElGX0FESF9TRVQyX0NPTkY6Ci0JCXByaW50aygiSElGX0FESF9TRVQyX0NPTkZcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfQURIX1NFVDJfQ09ORlxuIik7CiAJfQogfQogCkBAIC0zMTA1LDcgKzMxMDAsNyBAQAogCQlldmVudCA9CiAJCSAgICBwcml2LT5ob3N0dC5idWZmWyhwcml2LT5ob3N0dC5xdGFpbCAtIDEgLSBpKSAlCiAJCQkJICAgICBTTUVfRVZFTlRfQlVGRl9TSVpFXTsKLQkJcHJpbnRfaGlmX2V2ZW50KGV2ZW50KTsKKwkJcHJpbnRfaGlmX2V2ZW50KGRldiwgZXZlbnQpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTMzMzUsNyArMzMzMCw3IEBACiAKIAlwcml2LT5tYWNfYWRkcmVzc192YWxpZCA9IDA7CiAJaG9zdGlmX3NtZV9lbnF1ZXVlKHByaXYsIFNNRV9NQUNBRERSRVNTX1NFVF9SRVFVRVNUKTsKLQlwcmludGsoS0VSTl9JTkZPCisJbmV0ZGV2X2luZm8oZGV2LAogCSAgICAgICAia3Nfd2xhbjogTUFDIEFERFJFU1MgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKIAkgICAgICAgcHJpdi0+ZXRoX2FkZHJbMF0sIHByaXYtPmV0aF9hZGRyWzFdLCBwcml2LT5ldGhfYWRkclsyXSwKIAkgICAgICAgcHJpdi0+ZXRoX2FkZHJbM10sIHByaXYtPmV0aF9hZGRyWzRdLCBwcml2LT5ldGhfYWRkcls1XSk7CkBAIC0zMzU0LDggKzMzNDksNiBAQAogCX0KIAlwcml2LT5uc3RhdHMudHhfZXJyb3JzKys7CiAJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwotCi0JcmV0dXJuOwogfQogCiBzdGF0aWMKQEAgLTMzNjYsOCArMzM1OSw4IEBACiAKIAlEUFJJTlRLKDMsICJpbl9pbnRlcnJ1cHQoKT0lbGRcbiIsIGluX2ludGVycnVwdCgpKTsKIAotCWlmIChza2IgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImtzX3dsYW46ICBza2IgPT0gTlVMTCEhIVxuIik7CisJaWYgKCFza2IpIHsKKwkJbmV0ZGV2X2VycihkZXYsICJrc193bGFuOiAgc2tiID09IE5VTEwhISFcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHByaXYtPmRldl9zdGF0ZSA8IERFVklDRV9TVEFURV9SRUFEWSkgewpAQCAtMzM5NiwxMyArMzM4OSwxMyBAQAogCiAJRFBSSU5USygzLCAiXG4iKTsKIAotCXByaXYtPm5zdGF0cy50eF9ieXRlcyArPSBwYWNrZXQtPmxlbjsKIAlwcml2LT5uc3RhdHMudHhfcGFja2V0cysrOwogCiAJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQocHJpdi0+bmV0X2RldikpCiAJCW5ldGlmX3dha2VfcXVldWUocHJpdi0+bmV0X2Rldik7CiAKIAlpZiAocGFja2V0KSB7CisJCXByaXYtPm5zdGF0cy50eF9ieXRlcyArPSBwYWNrZXQtPmxlbjsKIAkJZGV2X2tmcmVlX3NrYihwYWNrZXQpOwogCQlwYWNrZXQgPSBOVUxMOwogCX0KQEAgLTM0MjEsOCArMzQxNCw2IEBACiAJCXJldHVybjsJLyogbm90IGZpbmlzaGVkIGluaXRpYWxpemUgKi8KIAl9CiAJaG9zdGlmX3NtZV9lbnF1ZXVlKHByaXYsIFNNRV9NVUxUSUNBU1RfUkVRVUVTVCk7Ci0KLQlyZXR1cm47CiB9CiAKIHN0YXRpYwpAQCAtMzQzMyw3ICszNDI0LDcgQEAKIAlwcml2LT5jdXJfcnggPSAwOwogCiAJaWYgKCFwcml2LT5tYWNfYWRkcmVzc192YWxpZCkgewotCQlwcmludGsoS0VSTl9FUlIgImtzX3dsYW4gOiAlcyBOb3QgUkVBRFkgISFcbiIsIGRldi0+bmFtZSk7CisJCW5ldGRldl9lcnIoZGV2LCAia3Nfd2xhbiA6ICVzIE5vdCBSRUFEWSAhIVxuIiwgZGV2LT5uYW1lKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9IGVsc2UKIAkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKQEAgLTM1MTIsMTcgKzM1MDMsMTEgQEAKIHsKIAlzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWludCByZXQgPSAwOwogCXByaXYtPmRldmljZV9vcGVuX3N0YXR1cyA9IDA7CiAJZGVsX3RpbWVyX3N5bmMoJnVwZGF0ZV9waHlpbmZvX3RpbWVyKTsKIAogCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAotCXJldHVybiByZXQ7Ci19Ci0KLWludCBrc193bGFuX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL21pY2hhZWxfbWljLmMgYi9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL21pY2hhZWxfbWljLmMKaW5kZXggZTE0YzEwOS4uNzhhZTJiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9taWNoYWVsX21pYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAvbWljaGFlbF9taWMuYwpAQCAtMjAsMTggKzIwLDI0IEBACiAjZGVmaW5lIGdldFVJbnQzMiggQSwgQiApIAkodWludDMyX3QpKEFbQiswXSA8PCAwKSArIChBW0IrMV0gPDwgOCkgKyAoQVtCKzJdIDw8IDE2KSArIChBW0IrM10gPDwgMjQpCiAKIC8vIENvbnZlcnQgZnJvbSBVSW50MzIgdG8gQnl0ZVtdIGluIGEgcG9ydGFibGUgd2F5Ci0jZGVmaW5lIHB1dFVJbnQzMiggQSwgQiwgQyApIAlBW0IrMF0gPSAodWludDhfdCkgKEMgJiAweGZmKTsJCVwKLQkJCQlBW0IrMV0gPSAodWludDhfdCkgKChDPj44KSAmIDB4ZmYpOwlcCi0JCQkJQVtCKzJdID0gKHVpbnQ4X3QpICgoQz4+MTYpICYgMHhmZik7CVwKLQkJCQlBW0IrM10gPSAodWludDhfdCkgKChDPj4yNCkgJiAweGZmKQorI2RlZmluZSBwdXRVSW50MzIoQSwgQiwgQykJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlBW0IgKyAwXSA9ICh1aW50OF90KShDICYgMHhmZik7CQkJCVwKKwlBW0IgKyAxXSA9ICh1aW50OF90KSgoQyA+PiA4KSAmIDB4ZmYpOwkJCVwKKwlBW0IgKyAyXSA9ICh1aW50OF90KSgoQyA+PiAxNikgJiAweGZmKTsJCQlcCisJQVtCICsgM10gPSAodWludDhfdCkoKEMgPj4gMjQpICYgMHhmZik7CQkJXAorfSB3aGlsZSAoMCkKIAogLy8gUmVzZXQgdGhlIHN0YXRlIHRvIHRoZSBlbXB0eSBtZXNzYWdlLgotI2RlZmluZSBNaWNoYWVsQ2xlYXIoIEEgKSAJQS0+TCA9IEEtPkswOyBcCi0JCQkJQS0+UiA9IEEtPksxOyBcCi0JCQkJQS0+bkJ5dGVzSW5NID0gMDsKKyNkZWZpbmUgTWljaGFlbENsZWFyKEEpCQkJXAorZG8gewkJCQkJXAorCUEtPkwgPSBBLT5LMDsJCQlcCisJQS0+UiA9IEEtPksxOwkJCVwKKwlBLT5uQnl0ZXNJbk0gPSAwOwkJXAorfSB3aGlsZSAoMCkKIAogc3RhdGljCi12b2lkIE1pY2hhZWxJbml0aWFsaXplRnVuY3Rpb24oc3RydWN0IG1pY2hlbF9taWNfdCAqTWljLCB1aW50OF90ICoga2V5KQordm9pZCBNaWNoYWVsSW5pdGlhbGl6ZUZ1bmN0aW9uKHN0cnVjdCBtaWNoZWxfbWljX3QgKk1pYywgdWludDhfdCAqa2V5KQogewogCS8vIFNldCB0aGUga2V5CiAJTWljLT5LMCA9IGdldFVJbnQzMihrZXksIDApOwpAQCAtNTQsNyArNjAsNyBAQAogfXdoaWxlKDApCiAKIHN0YXRpYwotdm9pZCBNaWNoYWVsQXBwZW5kKHN0cnVjdCBtaWNoZWxfbWljX3QgKk1pYywgdWludDhfdCAqIHNyYywgaW50IG5CeXRlcykKK3ZvaWQgTWljaGFlbEFwcGVuZChzdHJ1Y3QgbWljaGVsX21pY190ICpNaWMsIHVpbnQ4X3QgKnNyYywgaW50IG5CeXRlcykKIHsKIAlpbnQgYWRkbGVuOwogCWlmIChNaWMtPm5CeXRlc0luTSkgewpAQCAtODgsNyArOTQsNyBAQAogfQogCiBzdGF0aWMKLXZvaWQgTWljaGFlbEdldE1JQyhzdHJ1Y3QgbWljaGVsX21pY190ICpNaWMsIHVpbnQ4X3QgKiBkc3QpCit2b2lkIE1pY2hhZWxHZXRNSUMoc3RydWN0IG1pY2hlbF9taWNfdCAqTWljLCB1aW50OF90ICpkc3QpCiB7CiAJdWludDhfdCAqZGF0YSA9IE1pYy0+TTsKIAlzd2l0Y2ggKE1pYy0+bkJ5dGVzSW5NKSB7CkBAIC0xMTYsOSArMTIyLDkgQEAKIAlNaWNoYWVsQ2xlYXIoTWljKTsKIH0KIAotdm9pZCBNaWNoYWVsTUlDRnVuY3Rpb24oc3RydWN0IG1pY2hlbF9taWNfdCAqTWljLCB1aW50OF90ICogS2V5LAotCQkJdWludDhfdCAqIERhdGEsIGludCBMZW4sIHVpbnQ4X3QgcHJpb3JpdHksCi0JCQl1aW50OF90ICogUmVzdWx0KQordm9pZCBNaWNoYWVsTUlDRnVuY3Rpb24oc3RydWN0IG1pY2hlbF9taWNfdCAqTWljLCB1aW50OF90ICpLZXksCisJCQl1aW50OF90ICpEYXRhLCBpbnQgTGVuLCB1aW50OF90IHByaW9yaXR5LAorCQkJdWludDhfdCAqUmVzdWx0KQogewogCXVpbnQ4X3QgcGFkX2RhdGFbNF0gPSB7IHByaW9yaXR5LCAwLCAwLCAwIH07CiAJLy8gQ29tcHV0ZSB0aGUgTUlDIHZhbHVlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL21pY2hhZWxfbWljLmggYi9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL21pY2hhZWxfbWljLmgKaW5kZXggYzdlNGViMi4uZWZhYTIxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9taWNoYWVsX21pYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAvbWljaGFlbF9taWMuaApAQCAtMjAsNyArMjAsNiBAQAogCXVpbnQ4X3QgUmVzdWx0WzhdOwogfTsKIAotZXh0ZXJuCi12b2lkIE1pY2hhZWxNSUNGdW5jdGlvbihzdHJ1Y3QgbWljaGVsX21pY190ICpNaWMsIHVpbnQ4X3QgKiBLZXksCi0JCQl1aW50OF90ICogRGF0YSwgaW50IExlbiwgdWludDhfdCBwcmlvcml0eSwKLQkJCXVpbnQ4X3QgKiBSZXN1bHQpOwordm9pZCBNaWNoYWVsTUlDRnVuY3Rpb24oc3RydWN0IG1pY2hlbF9taWNfdCAqTWljLCB1aW50OF90ICpLZXksCisJCQl1aW50OF90ICpEYXRhLCBpbnQgTGVuLCB1aW50OF90IHByaW9yaXR5LAorCQkJdWludDhfdCAqUmVzdWx0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmcy5oCmluZGV4IDNmNjQ0N2MuLjNiOTJkMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnMuaApAQCAtMTM4LDggKzEzOCw4IEBACiB2b2lkIGx1c3RyZV9pbnNlcnRfZGVidWdmcyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwKIAkJCSAgIGNvbnN0IHN0cnVjdCBsbmV0X2RlYnVnZnNfc3ltbGlua19kZWYgKnN5bWxpbmtzKTsKIGludCBscHJvY2ZzX2NhbGxfaGFuZGxlcih2b2lkICpkYXRhLCBpbnQgd3JpdGUsIGxvZmZfdCAqcHBvcywKLQkJCSAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAotCQkJICBpbnQgKCpoYW5kbGVyKSh2b2lkICpkYXRhLCBpbnQgd3JpdGUsCi0JCQkgIGxvZmZfdCBwb3MsIHZvaWQgX191c2VyICpidWZmZXIsIGludCBsZW4pKTsKKwkJCSB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCisJCQkgaW50ICgqaGFuZGxlcikodm9pZCAqZGF0YSwgaW50IHdyaXRlLCBsb2ZmX3QgcG9zLAorCQkJCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBpbnQgbGVuKSk7CiAKICNlbmRpZiAvKiBfTElCQ0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19kZWJ1Zy5oCmluZGV4IDI1YWRhYjEuLmI3YmQ2ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2RlYnVnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfZGVidWcuaApAQCAtMjQ3LDE5ICsyNDcsMTkgQEAKICNkZWZpbmUgTENPTlNPTEVfRU1FUkcoZm9ybWF0LCAuLi4pIENERUJVRyhEX0NPTlNPTEUgfCBEX0VNRVJHLCBmb3JtYXQsICMjIF9fVkFfQVJHU19fKQogCiBpbnQgbGliY2ZzX2RlYnVnX21zZyhzdHJ1Y3QgbGliY2ZzX2RlYnVnX21zZ19kYXRhICptc2dkYXRhLAotCQkJICAgIGNvbnN0IGNoYXIgKmZvcm1hdDEsIC4uLikKKwkJICAgICBjb25zdCBjaGFyICpmb3JtYXQxLCAuLi4pCiAJX19wcmludGYoMiwgMyk7CiAKIGludCBsaWJjZnNfZGVidWdfdm1zZzIoc3RydWN0IGxpYmNmc19kZWJ1Z19tc2dfZGF0YSAqbXNnZGF0YSwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdDEsCi0JCQkgICAgICB2YV9saXN0IGFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdDIsIC4uLikKKwkJICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdDEsCisJCSAgICAgICB2YV9saXN0IGFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdDIsIC4uLikKIAlfX3ByaW50Zig0LCA1KTsKIAogLyogb3RoZXIgZXh0ZXJuYWwgc3ltYm9scyB0aGF0IHRyYWNlZmlsZSBwcm92aWRlczogKi8KIGludCBjZnNfdHJhY2VfY29weWluX3N0cmluZyhjaGFyICprbmxfYnVmZmVyLCBpbnQga25sX2J1ZmZlcl9ub2IsCi0JCWNvbnN0IGNoYXIgX191c2VyICp1c3JfYnVmZmVyLCBpbnQgdXNyX2J1ZmZlcl9ub2IpOworCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICp1c3JfYnVmZmVyLCBpbnQgdXNyX2J1ZmZlcl9ub2IpOwogaW50IGNmc190cmFjZV9jb3B5b3V0X3N0cmluZyhjaGFyIF9fdXNlciAqdXNyX2J1ZmZlciwgaW50IHVzcl9idWZmZXJfbm9iLAotCQljb25zdCBjaGFyICprbmxfYnVmZmVyLCBjaGFyICphcHBlbmQpOworCQkJICAgICBjb25zdCBjaGFyICprbmxfYnVmZmVyLCBjaGFyICphcHBlbmQpOwogCiAjZGVmaW5lIExJQkNGU19ERUJVR19GSUxFX1BBVEhfREVGQVVMVCAiL3RtcC9sdXN0cmUtbG9nIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19mYWlsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19mYWlsLmgKaW5kZXggZDNmOWE2MC4uYmRiYmU5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfZmFpbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2ZhaWwuaApAQCAtMTQzLDYgKzE0Myw5IEBACiAjZGVmaW5lIENGU19GQUlMX1RJTUVPVVRfT1JTRVQoaWQsIHZhbHVlLCBzZWNzKSBcCiAJY2ZzX2ZhaWxfdGltZW91dF9zZXQoaWQsIHZhbHVlLCBzZWNzICogMTAwMCwgQ0ZTX0ZBSUxfTE9DX09SU0VUKQogCisjZGVmaW5lIENGU19GQUlMX1RJTUVPVVRfUkVTRVQoaWQsIHZhbHVlLCBzZWNzKSBcCisJY2ZzX2ZhaWxfdGltZW91dF9zZXQoaWQsIHZhbHVlLCBzZWNzICogMTAwMCwgQ0ZTX0ZBSUxfTE9DX1JFU0VUKQorCiAjZGVmaW5lIENGU19GQUlMX1RJTUVPVVRfTVNfT1JTRVQoaWQsIHZhbHVlLCBtcykgXAogCWNmc19mYWlsX3RpbWVvdXRfc2V0KGlkLCB2YWx1ZSwgbXMsIENGU19GQUlMX0xPQ19PUlNFVCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfcHJpdmF0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfcHJpdmF0ZS5oCmluZGV4IDRkYWEzODIuLmUwZTFhNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX3ByaXZhdGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19wcml2YXRlLmgKQEAgLTMxMCwxMyArMzEwLDEzIEBACiAKICNkZWZpbmUgTUtTVFIocHRyKSAoKHB0cikpID8gKHB0cikgOiAiIgogCi1zdGF0aWMgaW5saW5lIGludCBjZnNfc2l6ZV9yb3VuZDQoaW50IHZhbCkKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGNmc19zaXplX3JvdW5kNChpbnQgdmFsKQogewogCXJldHVybiAodmFsICsgMykgJiAofjB4Myk7CiB9CiAKICNpZm5kZWYgSEFWRV9DRlNfU0laRV9ST1VORAotc3RhdGljIGlubGluZSBpbnQgY2ZzX3NpemVfcm91bmQoaW50IHZhbCkKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGNmc19zaXplX3JvdW5kKGludCB2YWwpCiB7CiAJcmV0dXJuICh2YWwgKyA3KSAmICh+MHg3KTsKIH0KQEAgLTMyNCwxNyArMzI0LDE3IEBACiAjZGVmaW5lIEhBVkVfQ0ZTX1NJWkVfUk9VTkQKICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIGludCBjZnNfc2l6ZV9yb3VuZDE2KGludCB2YWwpCitzdGF0aWMgaW5saW5lIHNpemVfdCBjZnNfc2l6ZV9yb3VuZDE2KGludCB2YWwpCiB7CiAJcmV0dXJuICh2YWwgKyAweGYpICYgKH4weGYpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBjZnNfc2l6ZV9yb3VuZDMyKGludCB2YWwpCitzdGF0aWMgaW5saW5lIHNpemVfdCBjZnNfc2l6ZV9yb3VuZDMyKGludCB2YWwpCiB7CiAJcmV0dXJuICh2YWwgKyAweDFmKSAmICh+MHgxZik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNmc19zaXplX3JvdW5kMChpbnQgdmFsKQorc3RhdGljIGlubGluZSBzaXplX3QgY2ZzX3NpemVfcm91bmQwKGludCB2YWwpCiB7CiAJaWYgKCF2YWwpCiAJCXJldHVybiAwOwpAQCAtMzQzLDcgKzM0Myw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc2l6ZV90IGNmc19yb3VuZF9zdHJsZW4oY2hhciAqZnNldCkKIHsKLQlyZXR1cm4gKHNpemVfdCljZnNfc2l6ZV9yb3VuZCgoaW50KXN0cmxlbihmc2V0KSArIDEpOworCXJldHVybiBjZnNfc2l6ZV9yb3VuZCgoaW50KXN0cmxlbihmc2V0KSArIDEpOwogfQogCiAjZGVmaW5lIExPR0wodmFyLCBsZW4sIHB0cikJCQkJICAgICAgIFwKQEAgLTM2MCwxMyArMzYwLDQgQEAKIAlwdHIgKz0gY2ZzX3NpemVfcm91bmQobGVuKTsJCQkgICAgIFwKIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgTE9HTDAodmFyLCBsZW4sIHB0cikJCQkgICAgICBcCi1kbyB7CQkJCQkJICAgIFwKLQlpZiAoIWxlbikJCQkJICAgICAgIFwKLQkJYnJlYWs7CQkJCSAgXAotCW1lbWNweSgoY2hhciAqKXB0ciwgKGNvbnN0IGNoYXIgKil2YXIsIGxlbik7ICAgIFwKLQkqKChjaGFyICopKHB0cikgKyBsZW4pID0gMDsJCSAgICAgXAotCXB0ciArPSBjZnNfc2l6ZV9yb3VuZChsZW4gKyAxKTsJCSBcCi19IHdoaWxlICgwKQotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9sbmV0L2xpYi1sbmV0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbG5ldC9saWItbG5ldC5oCmluZGV4IDUxM2E4MjIuLmE1OWM1ZTk5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLWxuZXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbG5ldC9saWItbG5ldC5oCkBAIC02MDUsNzMgKzYwNSwyMCBAQAogCiB1bnNpZ25lZCBpbnQgbG5ldF9pb3Zfbm9iKHVuc2lnbmVkIGludCBuaW92LCBzdHJ1Y3Qga3ZlYyAqaW92KTsKIGludCBsbmV0X2V4dHJhY3RfaW92KGludCBkc3Rfbmlvdiwgc3RydWN0IGt2ZWMgKmRzdCwKLQkJICAgICBpbnQgc3JjX25pb3YsIHN0cnVjdCBrdmVjICpzcmMsCisJCSAgICAgaW50IHNyY19uaW92LCBjb25zdCBzdHJ1Y3Qga3ZlYyAqc3JjLAogCQkgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuKTsKIAogdW5zaWduZWQgaW50IGxuZXRfa2lvdl9ub2IodW5zaWduZWQgaW50IG5pb3YsIGxuZXRfa2lvdl90ICppb3YpOwogaW50IGxuZXRfZXh0cmFjdF9raW92KGludCBkc3RfbmlvdiwgbG5ldF9raW92X3QgKmRzdCwKLQkJICAgICAgaW50IHNyY19uaW92LCBsbmV0X2tpb3ZfdCAqc3JjLAorCQkgICAgICBpbnQgc3JjX25pb3YsIGNvbnN0IGxuZXRfa2lvdl90ICpzcmMsCiAJCSAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW4pOwogCi12b2lkIGxuZXRfY29weV9pb3YyaW92KHVuc2lnbmVkIGludCBuZGlvdiwgc3RydWN0IGt2ZWMgKmRpb3YsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgZG9mZnNldCwKLQkJCXVuc2lnbmVkIGludCBuc2lvdiwgc3RydWN0IGt2ZWMgKnNpb3YsCit2b2lkIGxuZXRfY29weV9pb3YyaXRlcihzdHJ1Y3QgaW92X2l0ZXIgKnRvLAorCQkJdW5zaWduZWQgaW50IG5zaW92LCBjb25zdCBzdHJ1Y3Qga3ZlYyAqc2lvdiwKIAkJCXVuc2lnbmVkIGludCBzb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbm9iKTsKLXZvaWQgbG5ldF9jb3B5X2tpb3YyaW92KHVuc2lnbmVkIGludCBuaW92LCBzdHJ1Y3Qga3ZlYyAqaW92LAotCQkJdW5zaWduZWQgaW50IGlvdm9mZnNldCwKLQkJCSB1bnNpZ25lZCBpbnQgbmtpb3YsIGxuZXRfa2lvdl90ICpraW92LAordm9pZCBsbmV0X2NvcHlfa2lvdjJpdGVyKHN0cnVjdCBpb3ZfaXRlciAqdG8sCisJCQkgdW5zaWduZWQgaW50IG5raW92LCBjb25zdCBsbmV0X2tpb3ZfdCAqa2lvdiwKIAkJCSB1bnNpZ25lZCBpbnQga2lvdm9mZnNldCwgdW5zaWduZWQgaW50IG5vYik7Ci12b2lkIGxuZXRfY29weV9pb3Yya2lvdih1bnNpZ25lZCBpbnQgbmtpb3YsIGxuZXRfa2lvdl90ICpraW92LAotCQkJdW5zaWduZWQgaW50IGtpb3ZvZmZzZXQsCi0JCQkgdW5zaWduZWQgaW50IG5pb3YsIHN0cnVjdCBrdmVjICppb3YsCi0JCQkgdW5zaWduZWQgaW50IGlvdm9mZnNldCwgdW5zaWduZWQgaW50IG5vYik7Ci12b2lkIGxuZXRfY29weV9raW92Mmtpb3YodW5zaWduZWQgaW50IG5ka2lvdiwgbG5ldF9raW92X3QgKmRraW92LAotCQkJIHVuc2lnbmVkIGludCBkb2Zmc2V0LAotCQkJICB1bnNpZ25lZCBpbnQgbnNraW92LCBsbmV0X2tpb3ZfdCAqc2tpb3YsCi0JCQkgIHVuc2lnbmVkIGludCBzb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbm9iKTsKLQotc3RhdGljIGlubGluZSB2b2lkCi1sbmV0X2NvcHlfaW92MmZsYXQoaW50IGRsZW4sIHZvaWQgKmRlc3QsIHVuc2lnbmVkIGludCBkb2Zmc2V0LAotCQkgICB1bnNpZ25lZCBpbnQgbnNpb3YsIHN0cnVjdCBrdmVjICpzaW92LCB1bnNpZ25lZCBpbnQgc29mZnNldCwKLQkJICAgdW5zaWduZWQgaW50IG5vYikKLXsKLQlzdHJ1Y3Qga3ZlYyBkaW92ID0gey8qLmlvdl9iYXNlID0gKi8gZGVzdCwgLyouaW92X2xlbiA9ICovIGRsZW59OwotCi0JbG5ldF9jb3B5X2lvdjJpb3YoMSwgJmRpb3YsIGRvZmZzZXQsCi0JCQkgIG5zaW92LCBzaW92LCBzb2Zmc2V0LCBub2IpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWxuZXRfY29weV9raW92MmZsYXQoaW50IGRsZW4sIHZvaWQgKmRlc3QsIHVuc2lnbmVkIGludCBkb2Zmc2V0LAotCQkgICAgdW5zaWduZWQgaW50IG5zaW92LCBsbmV0X2tpb3ZfdCAqc2tpb3YsCi0JCSAgICB1bnNpZ25lZCBpbnQgc29mZnNldCwgdW5zaWduZWQgaW50IG5vYikKLXsKLQlzdHJ1Y3Qga3ZlYyBkaW92ID0gey8qIC5pb3ZfYmFzZSA9ICovIGRlc3QsIC8qIC5pb3ZfbGVuID0gKi8gZGxlbn07Ci0KLQlsbmV0X2NvcHlfa2lvdjJpb3YoMSwgJmRpb3YsIGRvZmZzZXQsCi0JCQkgICBuc2lvdiwgc2tpb3YsIHNvZmZzZXQsIG5vYik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbG5ldF9jb3B5X2ZsYXQyaW92KHVuc2lnbmVkIGludCBuZGlvdiwgc3RydWN0IGt2ZWMgKmRpb3YsIHVuc2lnbmVkIGludCBkb2Zmc2V0LAotCQkgICBpbnQgc2xlbiwgdm9pZCAqc3JjLCB1bnNpZ25lZCBpbnQgc29mZnNldCwgdW5zaWduZWQgaW50IG5vYikKLXsKLQlzdHJ1Y3Qga3ZlYyBzaW92ID0gey8qLmlvdl9iYXNlID0gKi8gc3JjLCAvKi5pb3ZfbGVuID0gKi9zbGVufTsKLQotCWxuZXRfY29weV9pb3YyaW92KG5kaW92LCBkaW92LCBkb2Zmc2V0LAotCQkJICAxLCAmc2lvdiwgc29mZnNldCwgbm9iKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1sbmV0X2NvcHlfZmxhdDJraW92KHVuc2lnbmVkIGludCBuZGlvdiwgbG5ldF9raW92X3QgKmRraW92LAotCQkgICAgdW5zaWduZWQgaW50IGRvZmZzZXQsIGludCBzbGVuLCB2b2lkICpzcmMsCi0JCSAgICB1bnNpZ25lZCBpbnQgc29mZnNldCwgdW5zaWduZWQgaW50IG5vYikKLXsKLQlzdHJ1Y3Qga3ZlYyBzaW92ID0gey8qIC5pb3ZfYmFzZSA9ICovIHNyYywgLyogLmlvdl9sZW4gPSAqLyBzbGVufTsKLQotCWxuZXRfY29weV9pb3Yya2lvdihuZGlvdiwgZGtpb3YsIGRvZmZzZXQsCi0JCQkgICAxLCAmc2lvdiwgc29mZnNldCwgbm9iKTsKLX0KIAogdm9pZCBsbmV0X21lX3VubGluayhsbmV0X21lX3QgKm1lKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLXR5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbG5ldC9saWItdHlwZXMuaAppbmRleCA3OTY3YjAxLi5iODRhNWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbG5ldC9saWItdHlwZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbG5ldC9saWItdHlwZXMuaApAQCAtMjIwLDEwICsyMjAsNyBAQAogCSAqIGNyZWRpdCBpZiB0aGUgTE5EIGRvZXMgZmxvdyBjb250cm9sLgogCSAqLwogCWludCAoKmxuZF9yZWN2KShzdHJ1Y3QgbG5ldF9uaSAqbmksIHZvaWQgKnByaXZhdGUsIGxuZXRfbXNnX3QgKm1zZywKLQkJCWludCBkZWxheWVkLCB1bnNpZ25lZCBpbnQgbmlvdiwKLQkJCXN0cnVjdCBrdmVjICppb3YsIGxuZXRfa2lvdl90ICpraW92LAotCQkJdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IG1sZW4sCi0JCQl1bnNpZ25lZCBpbnQgcmxlbik7CisJCQlpbnQgZGVsYXllZCwgc3RydWN0IGlvdl9pdGVyICp0bywgdW5zaWduZWQgaW50IHJsZW4pOwogCiAJLyoKIAkgKiBsbmV0X3BhcnNlKCkgaGFzIGhhZCB0byBkZWxheSBwcm9jZXNzaW5nIG9mIHRoaXMgbWVzc2FnZQpAQCAtMjc4LDYgKzI3NSw4IEBACiAJc3RydWN0IGxuZXRfaW9jdGxfY29uZmlnX2xuZF90dW5hYmxlcyAqbmlfbG5kX3R1bmFibGVzOwogCS8qIGVxdWl2YWxlbnQgaW50ZXJmYWNlcyB0byB1c2UgKi8KIAljaGFyCQkJICpuaV9pbnRlcmZhY2VzW0xORVRfTUFYX0lOVEVSRkFDRVNdOworCS8qIG9yaWdpbmFsIG5ldCBuYW1lc3BhY2UgKi8KKwlzdHJ1Y3QgbmV0CQkgKm5pX25ldF9uczsKIH0gbG5ldF9uaV90OwogCiAjZGVmaW5lIExORVRfUFJPVE9fUElOR19NQVRDSEJJVFMJMHg4MDAwMDAwMDAwMDAwMDAwTEwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9sbmV0L3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbG5ldC90eXBlcy5oCmluZGV4IGUwOThiNmMuLmY4YmUwZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9sbmV0L3R5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xuZXQvdHlwZXMuaApAQCAtNTAzLDIxICs1MDMsNyBAQAogLyogTkIgbHVzdHJlIHBvcnRhbHMgdXNlcyBzdHJ1Y3QgaW92ZWMgaW50ZXJuYWxseSEgKi8KIHR5cGVkZWYgc3RydWN0IGlvdmVjIGxuZXRfbWRfaW92ZWNfdDsKIAotLyoqCi0gKiBBIHBhZ2UtYmFzZWQgZnJhZ21lbnQgb2YgYSBNRC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCS8qKiBQb2ludGVyIHRvIHRoZSBwYWdlIHdoZXJlIHRoZSBmcmFnbWVudCByZXNpZGVzICovCi0Jc3RydWN0IHBhZ2UJKmtpb3ZfcGFnZTsKLQkvKiogTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBmcmFnbWVudCAqLwotCXVuc2lnbmVkIGludAkga2lvdl9sZW47Ci0JLyoqCi0JICogU3RhcnRpbmcgb2Zmc2V0IG9mIHRoZSBmcmFnbWVudCB3aXRoaW4gdGhlIHBhZ2UuIE5vdGUgdGhhdCB0aGUKLQkgKiBlbmQgb2YgdGhlIGZyYWdtZW50IG11c3Qgbm90IHBhc3MgdGhlIGVuZCBvZiB0aGUgcGFnZTsgaS5lLiwKLQkgKiBraW92X2xlbiArIGtpb3Zfb2Zmc2V0IDw9IFBBR0VfU0laRS4KLQkgKi8KLQl1bnNpZ25lZCBpbnQJIGtpb3Zfb2Zmc2V0OwotfSBsbmV0X2tpb3ZfdDsKK3R5cGVkZWYgc3RydWN0IGJpb192ZWMgbG5ldF9raW92X3Q7CiAvKiogQH0gbG5ldF9tZCAqLwogCiAvKiogXGFkZHRvZ3JvdXAgbG5ldF9lcQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZC5jCmluZGV4IDRmNTk3OGIuLmM3YTVkNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kLmMKQEAgLTEyOCw2ICsxMjgsNyBAQAogc3RhdGljIGludCBraWJsbmRfdW5wYWNrX3JkKHN0cnVjdCBraWJfbXNnICptc2csIGludCBmbGlwKQogewogCXN0cnVjdCBraWJfcmRtYV9kZXNjICpyZDsKKwlpbnQgbXNnX3NpemU7CiAJaW50IG5vYjsKIAlpbnQgbjsKIAlpbnQgaTsKQEAgLTE0NiwxMiArMTQ3LDYgQEAKIAogCW4gPSByZC0+cmRfbmZyYWdzOwogCi0JaWYgKG4gPD0gMCB8fCBuID4gSUJMTkRfTUFYX1JETUFfRlJBR1MpIHsKLQkJQ0VSUk9SKCJCYWQgbmZyYWdzOiAlZCwgc2hvdWxkIGJlIDAgPCBuIDw9ICVkXG4iLAotCQkgICAgICAgbiwgSUJMTkRfTUFYX1JETUFfRlJBR1MpOwotCQlyZXR1cm4gMTsKLQl9Ci0KIAlub2IgPSBvZmZzZXRvZihzdHJ1Y3Qga2liX21zZywgaWJtX3UpICsKIAkgICAgICBraWJsbmRfcmRfbXNnX3NpemUocmQsIG1zZy0+aWJtX3R5cGUsIG4pOwogCkBAIC0xNjEsNiArMTU2LDEzIEBACiAJCXJldHVybiAxOwogCX0KIAorCW1zZ19zaXplID0ga2libG5kX3JkX3NpemUocmQpOworCWlmIChtc2dfc2l6ZSA8PSAwIHx8IG1zZ19zaXplID4gTE5FVF9NQVhfUEFZTE9BRCkgeworCQlDRVJST1IoIkJhZCBtc2dfc2l6ZTogJWQsIHNob3VsZCBiZSAwIDwgbiA8PSAlZFxuIiwKKwkJICAgICAgIG1zZ19zaXplLCBMTkVUX01BWF9QQVlMT0FEKTsKKwkJcmV0dXJuIDE7CisJfQorCiAJaWYgKCFmbGlwKQogCQlyZXR1cm4gMDsKIApAQCAtNjE4LDcgKzYyMCw3IEBACiB9CiAKIHN0cnVjdCBraWJfY29ubiAqa2libG5kX2NyZWF0ZV9jb25uKHN0cnVjdCBraWJfcGVlciAqcGVlciwgc3RydWN0IHJkbWFfY21faWQgKmNtaWQsCi0JCQkgICAgICAgaW50IHN0YXRlLCBpbnQgdmVyc2lvbikKKwkJCQkgICAgaW50IHN0YXRlLCBpbnQgdmVyc2lvbikKIHsKIAkvKgogCSAqIENBVkVBVCBFTVBUT1I6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kLmgKaW5kZXggMDc4YTBjMy4uMTQ1NzY5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmQuaApAQCAtMTEzLDggKzExMyw5IEBACiAjZGVmaW5lIElCTE5EX09PQl9DQVBBQkxFKHYpICAgICAgICgodikgIT0gSUJMTkRfTVNHX1ZFUlNJT05fMSkKICNkZWZpbmUgSUJMTkRfT09CX01TR1ModikJICAgKElCTE5EX09PQl9DQVBBQkxFKHYpID8gMiA6IDApCiAKLSNkZWZpbmUgSUJMTkRfTVNHX1NJWkUJCSg0IDw8IDEwKQkgLyogbWF4IHNpemUgb2YgcXVldWVkIG1lc3NhZ2VzIChpbmMgaGRyKSAqLwotI2RlZmluZSBJQkxORF9NQVhfUkRNQV9GUkFHUwkgTE5FVF9NQVhfSU9WCSAgIC8qIG1heCAjIG9mIGZyYWdtZW50cyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgSUJMTkRfRlJBR19TSElGVAkoUEFHRV9TSElGVCAtIDEyKQkvKiBmcmFnIHNpemUgb24gd2lyZSBpcyBpbiA0SyB1bml0cyAqLworI2RlZmluZSBJQkxORF9NU0dfU0laRQkJKDQgPDwgMTApCQkvKiBtYXggc2l6ZSBvZiBxdWV1ZWQgbWVzc2FnZXMgKGluYyBoZHIpICovCisjZGVmaW5lIElCTE5EX01BWF9SRE1BX0ZSQUdTCShMTkVUX01BWF9QQVlMT0FEID4+IDEyKS8qIG1heCAjIG9mIGZyYWdtZW50cyBzdXBwb3J0ZWQgaW4gNEsgc2l6ZSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogZGVyaXZlZCBjb25zdGFudHMuLi4gKi8KQEAgLTEzMyw4ICsxMzQsOCBAQAogLyogV1JzIGFuZCBDUUVzIChwZXIgY29ubmVjdGlvbikgKi8KICNkZWZpbmUgSUJMTkRfUkVDVl9XUlMoYykJSUJMTkRfUlhfTVNHUyhjKQogI2RlZmluZSBJQkxORF9TRU5EX1dSUyhjKQlcCi0JKChjLT5pYmNfbWF4X2ZyYWdzICsgMSkgKiBraWJsbmRfY29uY3VycmVudF9zZW5kcyhjLT5pYmNfdmVyc2lvbiwgXAotCQkJCQkJCSAgYy0+aWJjX3BlZXItPmlicF9uaSkpCisJKCgoYy0+aWJjX21heF9mcmFncyArIDEpIDw8IElCTE5EX0ZSQUdfU0hJRlQpICogXAorCSAga2libG5kX2NvbmN1cnJlbnRfc2VuZHMoYy0+aWJjX3ZlcnNpb24sIGMtPmliY19wZWVyLT5pYnBfbmkpKQogI2RlZmluZSBJQkxORF9DUV9FTlRSSUVTKGMpCShJQkxORF9SRUNWX1dSUyhjKSArIElCTE5EX1NFTkRfV1JTKGMpKQogCiBzdHJ1Y3Qga2liX2hjYV9kZXY7CkBAIC01ODIsNiArNTgzLDggQEAKIAl1bnNpZ25lZCBzaG9ydAkJaWJwX2Nvbm5lY3Rpbmc7CiAJLyogcmVjb25uZWN0IHRoaXMgcGVlciBsYXRlciAqLwogCXVuc2lnbmVkIHNob3J0CQlpYnBfcmVjb25uZWN0aW5nOjE7CisJLyogY291bnRlciBvZiBob3cgbWFueSB0aW1lcyB3ZSB0cmlnZ2VyZWQgYSBjb25uIHJhY2UgKi8KKwl1bnNpZ25lZCBjaGFyCQlpYnBfcmFjZXM7CiAJLyogIyBjb25zZWN1dGl2ZSByZWNvbm5lY3Rpb24gYXR0ZW1wdHMgdG8gdGhpcyBwZWVyICovCiAJdW5zaWduZWQgaW50CQlpYnBfcmVjb25uZWN0ZWQ7CiAJLyogZXJybm8gb24gY2xvc2luZyB0aGlzIHBlZXIgKi8KQEAgLTYwNywxNCArNjEwLDE0IEBACiAKIAl0dW5hYmxlcyA9ICZuaS0+bmlfbG5kX3R1bmFibGVzLT5sdF90dW5fdS5sdF9vMmliOwogCW1vZCA9IHR1bmFibGVzLT5sbmRfbWFwX29uX2RlbWFuZDsKLQlyZXR1cm4gbW9kID8gbW9kIDogSUJMTkRfTUFYX1JETUFfRlJBR1M7CisJcmV0dXJuIG1vZCA/IG1vZCA6IElCTE5EX01BWF9SRE1BX0ZSQUdTID4+IElCTE5EX0ZSQUdfU0hJRlQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50CiBraWJsbmRfcmRtYV9mcmFncyhpbnQgdmVyc2lvbiwgc3RydWN0IGxuZXRfbmkgKm5pKQogewogCXJldHVybiB2ZXJzaW9uID09IElCTE5EX01TR19WRVJTSU9OXzEgPwotCQkJICBJQkxORF9NQVhfUkRNQV9GUkFHUyA6CisJCQkgIChJQkxORF9NQVhfUkRNQV9GUkFHUyA+PiBJQkxORF9GUkFHX1NISUZUKSA6CiAJCQkgIGtpYmxuZF9jZmdfcmRtYV9mcmFncyhuaSk7CiB9CiAKQEAgLTEwMzQsNSArMTAzNyw0IEBACiAKIGludCAga2libG5kX3NlbmQobG5ldF9uaV90ICpuaSwgdm9pZCAqcHJpdmF0ZSwgbG5ldF9tc2dfdCAqbG50bXNnKTsKIGludCAga2libG5kX3JlY3YobG5ldF9uaV90ICpuaSwgdm9pZCAqcHJpdmF0ZSwgbG5ldF9tc2dfdCAqbG50bXNnLCBpbnQgZGVsYXllZCwKLQkJIHVuc2lnbmVkIGludCBuaW92LCBzdHJ1Y3Qga3ZlYyAqaW92LCBsbmV0X2tpb3ZfdCAqa2lvdiwKLQkJIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBtbGVuLCB1bnNpZ25lZCBpbnQgcmxlbik7CisJCSBzdHJ1Y3QgaW92X2l0ZXIgKnRvLCB1bnNpZ25lZCBpbnQgcmxlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kX2NiLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kX2NiLmMKaW5kZXggNTk2YTY5Ny4uYjI3ZGU4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZF9jYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmRfY2IuYwpAQCAtMzYsMTYgKzM2LDE5IEBACiAKICNpbmNsdWRlICJvMmlibG5kLmgiCiAKKyNkZWZpbmUgTUFYX0NPTk5fUkFDRVNfQkVGT1JFX0FCT1JUIDIwCisKIHN0YXRpYyB2b2lkIGtpYmxuZF9wZWVyX2FsaXZlKHN0cnVjdCBraWJfcGVlciAqcGVlcik7CiBzdGF0aWMgdm9pZCBraWJsbmRfcGVlcl9jb25uZWN0X2ZhaWxlZChzdHJ1Y3Qga2liX3BlZXIgKnBlZXIsIGludCBhY3RpdmUsIGludCBlcnJvcik7Ci1zdGF0aWMgdm9pZCBraWJsbmRfY2hlY2tfc2VuZHMoc3RydWN0IGtpYl9jb25uICpjb25uKTsKIHN0YXRpYyB2b2lkIGtpYmxuZF9pbml0X3R4X21zZyhsbmV0X25pX3QgKm5pLCBzdHJ1Y3Qga2liX3R4ICp0eCwKLQkJCQlpbnQgdHlwZSwgaW50IGJvZHlfbm9iKTsKKwkJCSAgICAgICBpbnQgdHlwZSwgaW50IGJvZHlfbm9iKTsKIHN0YXRpYyBpbnQga2libG5kX2luaXRfcmRtYShzdHJ1Y3Qga2liX2Nvbm4gKmNvbm4sIHN0cnVjdCBraWJfdHggKnR4LCBpbnQgdHlwZSwKLQkJCSAgICAgaW50IHJlc2lkLCBzdHJ1Y3Qga2liX3JkbWFfZGVzYyAqZHN0cmQsIF9fdTY0IGRzdGNvb2tpZSk7CisJCQkgICAgaW50IHJlc2lkLCBzdHJ1Y3Qga2liX3JkbWFfZGVzYyAqZHN0cmQsCisJCQkgICAgX191NjQgZHN0Y29va2llKTsKIHN0YXRpYyB2b2lkIGtpYmxuZF9xdWV1ZV90eF9sb2NrZWQoc3RydWN0IGtpYl90eCAqdHgsIHN0cnVjdCBraWJfY29ubiAqY29ubik7CiBzdGF0aWMgdm9pZCBraWJsbmRfcXVldWVfdHgoc3RydWN0IGtpYl90eCAqdHgsIHN0cnVjdCBraWJfY29ubiAqY29ubik7CiBzdGF0aWMgdm9pZCBraWJsbmRfdW5tYXBfdHgobG5ldF9uaV90ICpuaSwgc3RydWN0IGtpYl90eCAqdHgpOworc3RhdGljIHZvaWQga2libG5kX2NoZWNrX3NlbmRzX2xvY2tlZChzdHJ1Y3Qga2liX2Nvbm4gKmNvbm4pOwogCiBzdGF0aWMgdm9pZAoga2libG5kX3R4X2RvbmUobG5ldF9uaV90ICpuaSwgc3RydWN0IGtpYl90eCAqdHgpCkBAIC0yMTEsOSArMjE0LDkgQEAKIAkJY29ubi0+aWJjX291dHN0YW5kaW5nX2NyZWRpdHMrKzsKIAllbHNlCiAJCWNvbm4tPmliY19yZXNlcnZlZF9jcmVkaXRzKys7CisJa2libG5kX2NoZWNrX3NlbmRzX2xvY2tlZChjb25uKTsKIAlzcGluX3VubG9jaygmY29ubi0+aWJjX2xvY2spOwogCi0Ja2libG5kX2NoZWNrX3NlbmRzKGNvbm4pOwogb3V0OgogCWtpYmxuZF9jb25uX2RlY3JlZihjb25uKTsKIAlyZXR1cm4gcmM7CkBAIC0zNDQsOCArMzQ3LDggQEAKIAkJICAgICFJQkxORF9PT0JfQ0FQQUJMRShjb25uLT5pYmNfdmVyc2lvbikpIC8qIHYxIG9ubHkgKi8KIAkJCWNvbm4tPmliY19vdXRzdGFuZGluZ19jcmVkaXRzKys7CiAKKwkJa2libG5kX2NoZWNrX3NlbmRzX2xvY2tlZChjb25uKTsKIAkJc3Bpbl91bmxvY2soJmNvbm4tPmliY19sb2NrKTsKLQkJa2libG5kX2NoZWNrX3NlbmRzKGNvbm4pOwogCX0KIAogCXN3aXRjaCAobXNnLT5pYm1fdHlwZSkgewpAQCAtNjQ4LDcgKzY1MSw3IEBACiAKIHN0YXRpYyBpbnQKIGtpYmxuZF9zZXR1cF9yZF9pb3YobG5ldF9uaV90ICpuaSwgc3RydWN0IGtpYl90eCAqdHgsIHN0cnVjdCBraWJfcmRtYV9kZXNjICpyZCwKLQkJICAgIHVuc2lnbmVkIGludCBuaW92LCBzdHJ1Y3Qga3ZlYyAqaW92LCBpbnQgb2Zmc2V0LCBpbnQgbm9iKQorCQkgICAgdW5zaWduZWQgaW50IG5pb3YsIGNvbnN0IHN0cnVjdCBrdmVjICppb3YsIGludCBvZmZzZXQsIGludCBub2IpCiB7CiAJc3RydWN0IGtpYl9uZXQgKm5ldCA9IG5pLT5uaV9kYXRhOwogCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtNzA1LDcgKzcwOCw3IEBACiAKIHN0YXRpYyBpbnQKIGtpYmxuZF9zZXR1cF9yZF9raW92KGxuZXRfbmlfdCAqbmksIHN0cnVjdCBraWJfdHggKnR4LCBzdHJ1Y3Qga2liX3JkbWFfZGVzYyAqcmQsCi0JCSAgICAgaW50IG5raW92LCBsbmV0X2tpb3ZfdCAqa2lvdiwgaW50IG9mZnNldCwgaW50IG5vYikKKwkJICAgICBpbnQgbmtpb3YsIGNvbnN0IGxuZXRfa2lvdl90ICpraW92LCBpbnQgb2Zmc2V0LCBpbnQgbm9iKQogewogCXN0cnVjdCBraWJfbmV0ICpuZXQgPSBuaS0+bmlfZGF0YTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwpAQCAtNzE3LDggKzcyMCw4IEBACiAJTEFTU0VSVChua2lvdiA+IDApOwogCUxBU1NFUlQobmV0KTsKIAotCXdoaWxlIChvZmZzZXQgPj0ga2lvdi0+a2lvdl9sZW4pIHsKLQkJb2Zmc2V0IC09IGtpb3YtPmtpb3ZfbGVuOworCXdoaWxlIChvZmZzZXQgPj0ga2lvdi0+YnZfbGVuKSB7CisJCW9mZnNldCAtPSBraW92LT5idl9sZW47CiAJCW5raW92LS07CiAJCWtpb3YrKzsKIAkJTEFTU0VSVChua2lvdiA+IDApOwpAQCAtNzI4LDEwICs3MzEsMTAgQEAKIAlkbyB7CiAJCUxBU1NFUlQobmtpb3YgPiAwKTsKIAotCQlmcmFnbm9iID0gbWluKChpbnQpKGtpb3YtPmtpb3ZfbGVuIC0gb2Zmc2V0KSwgbm9iKTsKKwkJZnJhZ25vYiA9IG1pbigoaW50KShraW92LT5idl9sZW4gLSBvZmZzZXQpLCBub2IpOwogCi0JCXNnX3NldF9wYWdlKHNnLCBraW92LT5raW92X3BhZ2UsIGZyYWdub2IsCi0JCQkgICAga2lvdi0+a2lvdl9vZmZzZXQgKyBvZmZzZXQpOworCQlzZ19zZXRfcGFnZShzZywga2lvdi0+YnZfcGFnZSwgZnJhZ25vYiwKKwkJCSAgICBraW92LT5idl9vZmZzZXQgKyBvZmZzZXQpOwogCQlzZyA9IHNnX25leHQoc2cpOwogCQlpZiAoIXNnKSB7CiAJCQlDRVJST1IoImxhY2tpbmcgZW5vdWdoIHNnIGVudHJpZXMgdG8gbWFwIHR4XG4iKTsKQEAgLTc2MSw3ICs3NjQsNiBAQAogCUxBU1NFUlQodHgtPnR4X3F1ZXVlZCk7CiAJLyogV2UgcmVseSBvbiB0aGlzIGZvciBRUCBzaXppbmcgKi8KIAlMQVNTRVJUKHR4LT50eF9ud3JxID4gMCk7Ci0JTEFTU0VSVCh0eC0+dHhfbndycSA8PSAxICsgY29ubi0+aWJjX21heF9mcmFncyk7CiAKIAlMQVNTRVJUKCFjcmVkaXQgfHwgY3JlZGl0ID09IDEpOwogCUxBU1NFUlQoY29ubi0+aWJjX291dHN0YW5kaW5nX2NyZWRpdHMgPj0gMCk7CkBAIC04MDAsNyArODAyLDcgQEAKIAkgICAgICBjb25uLT5pYmNfbm9vcHNfcG9zdGVkID09IElCTE5EX09PQl9NU0dTKHZlcikpKSkgewogCQkvKgogCQkgKiBPSyB0byBkcm9wIHdoZW4gcG9zdGVkIGVub3VnaCBOT09Qcywgc2luY2UKLQkJICoga2libG5kX2NoZWNrX3NlbmRzIHdpbGwgcXVldWUgTk9PUCBhZ2FpbiB3aGVuCisJCSAqIGtpYmxuZF9jaGVja19zZW5kc19sb2NrZWQgd2lsbCBxdWV1ZSBOT09QIGFnYWluIHdoZW4KIAkJICogcG9zdGVkIE5PT1BzIGNvbXBsZXRlCiAJCSAqLwogCQlzcGluX3VubG9jaygmY29ubi0+aWJjX2xvY2spOwpAQCAtOTA1LDcgKzkwNyw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1raWJsbmRfY2hlY2tfc2VuZHMoc3RydWN0IGtpYl9jb25uICpjb25uKQora2libG5kX2NoZWNrX3NlbmRzX2xvY2tlZChzdHJ1Y3Qga2liX2Nvbm4gKmNvbm4pCiB7CiAJaW50IHZlciA9IGNvbm4tPmliY192ZXJzaW9uOwogCWxuZXRfbmlfdCAqbmkgPSBjb25uLT5pYmNfcGVlci0+aWJwX25pOwpAQCAtOTE4LDggKzkyMCw2IEBACiAJCXJldHVybjsKIAl9CiAKLQlzcGluX2xvY2soJmNvbm4tPmliY19sb2NrKTsKLQogCUxBU1NFUlQoY29ubi0+aWJjX25zZW5kc19wb3N0ZWQgPD0ga2libG5kX2NvbmN1cnJlbnRfc2VuZHModmVyLCBuaSkpOwogCUxBU1NFUlQoIUlCTE5EX09PQl9DQVBBQkxFKHZlcikgfHwKIAkJY29ubi0+aWJjX25vb3BzX3Bvc3RlZCA8PSBJQkxORF9PT0JfTVNHUyh2ZXIpKTsKQEAgLTk2OSw4ICs5NjksNiBAQAogCQlpZiAoa2libG5kX3Bvc3RfdHhfbG9ja2VkKGNvbm4sIHR4LCBjcmVkaXQpKQogCQkJYnJlYWs7CiAJfQotCi0Jc3Bpbl91bmxvY2soJmNvbm4tPmliY19sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTEwMTYsMTYgKzEwMTQsMTEgQEAKIAlpZiAoaWRsZSkKIAkJbGlzdF9kZWwoJnR4LT50eF9saXN0KTsKIAotCWtpYmxuZF9jb25uX2FkZHJlZihjb25uKTsJICAgICAgIC8qIDEgcmVmIGZvciBtZS4uLi4gKi8KLQorCWtpYmxuZF9jaGVja19zZW5kc19sb2NrZWQoY29ubik7CiAJc3Bpbl91bmxvY2soJmNvbm4tPmliY19sb2NrKTsKIAogCWlmIChpZGxlKQogCQlraWJsbmRfdHhfZG9uZShjb25uLT5pYmNfcGVlci0+aWJwX25pLCB0eCk7Ci0KLQlraWJsbmRfY2hlY2tfc2VuZHMoY29ubik7Ci0KLQlraWJsbmRfY29ubl9kZWNyZWYoY29ubik7CSAgICAgICAvKiAuLi51bnRpbCBoZXJlICovCiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMDc4LDYgKzEwNzEsMTUgQEAKIAlMQVNTRVJUKHR5cGUgPT0gSUJMTkRfTVNHX0dFVF9ET05FIHx8CiAJCXR5cGUgPT0gSUJMTkRfTVNHX1BVVF9ET05FKTsKIAorCWlmIChraWJsbmRfcmRfc2l6ZShzcmNyZCkgPiBjb25uLT5pYmNfbWF4X2ZyYWdzIDw8IFBBR0VfU0hJRlQpIHsKKwkJQ0VSUk9SKCJSRE1BIGlzIHRvbyBsYXJnZSBmb3IgcGVlciAlcyAoJWQpLCBzcmMgc2l6ZTogJWQgZHN0IHNpemU6ICVkXG4iLAorCQkgICAgICAgbGliY2ZzX25pZDJzdHIoY29ubi0+aWJjX3BlZXItPmlicF9uaWQpLAorCQkgICAgICAgY29ubi0+aWJjX21heF9mcmFncyA8PCBQQUdFX1NISUZULAorCQkgICAgICAga2libG5kX3JkX3NpemUoc3JjcmQpLCBraWJsbmRfcmRfc2l6ZShkc3RyZCkpOworCQlyYyA9IC1FTVNHU0laRTsKKwkJZ290byB0b29fYmlnOworCX0KKwogCXdoaWxlIChyZXNpZCA+IDApIHsKIAkJaWYgKHNyY2lkeCA+PSBzcmNyZC0+cmRfbmZyYWdzKSB7CiAJCQlDRVJST1IoIlNyYyBidWZmZXIgZXhoYXVzdGVkOiAlZCBmcmFnc1xuIiwgc3JjaWR4KTsKQEAgLTEwOTEsMTAgKzEwOTMsMTAgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKHR4LT50eF9ud3JxID49IGNvbm4tPmliY19tYXhfZnJhZ3MpIHsKKwkJaWYgKHR4LT50eF9ud3JxID49IElCTE5EX01BWF9SRE1BX0ZSQUdTKSB7CiAJCQlDRVJST1IoIlJETUEgaGFzIHRvbyBtYW55IGZyYWdtZW50cyBmb3IgcGVlciAlcyAoJWQpLCBzcmMgaWR4L2ZyYWdzOiAlZC8lZCBkc3QgaWR4L2ZyYWdzOiAlZC8lZFxuIiwKIAkJCSAgICAgICBsaWJjZnNfbmlkMnN0cihjb25uLT5pYmNfcGVlci0+aWJwX25pZCksCi0JCQkgICAgICAgY29ubi0+aWJjX21heF9mcmFncywKKwkJCSAgICAgICBJQkxORF9NQVhfUkRNQV9GUkFHUywKIAkJCSAgICAgICBzcmNpZHgsIHNyY3JkLT5yZF9uZnJhZ3MsCiAJCQkgICAgICAgZHN0aWR4LCBkc3RyZC0+cmRfbmZyYWdzKTsKIAkJCXJjID0gLUVNU0dTSVpFOwpAQCAtMTEzMiw3ICsxMTM0LDcgQEAKIAkJd3JxKys7CiAJCXNnZSsrOwogCX0KLQordG9vX2JpZzoKIAlpZiAocmMgPCAwKQkJCSAgICAgLyogbm8gUkRNQSBpZiBjb21wbGV0aW5nIHdpdGggZmFpbHVyZSAqLwogCQl0eC0+dHhfbndycSA9IDA7CiAKQEAgLTEyMDQsOSArMTIwNiw4IEBACiB7CiAJc3Bpbl9sb2NrKCZjb25uLT5pYmNfbG9jayk7CiAJa2libG5kX3F1ZXVlX3R4X2xvY2tlZCh0eCwgY29ubik7CisJa2libG5kX2NoZWNrX3NlbmRzX2xvY2tlZChjb25uKTsKIAlzcGluX3VubG9jaygmY29ubi0+aWJjX2xvY2spOwotCi0Ja2libG5kX2NoZWNrX3NlbmRzKGNvbm4pOwogfQogCiBzdGF0aWMgaW50IGtpYmxuZF9yZXNvbHZlX2FkZHIoc3RydWN0IHJkbWFfY21faWQgKmNtaWQsCkBAIC0xNDk5LDYgKzE1MDAsNyBAQAogCWxuZXRfa2lvdl90ICpwYXlsb2FkX2tpb3YgPSBsbnRtc2ctPm1zZ19raW92OwogCXVuc2lnbmVkIGludCBwYXlsb2FkX29mZnNldCA9IGxudG1zZy0+bXNnX29mZnNldDsKIAl1bnNpZ25lZCBpbnQgcGF5bG9hZF9ub2IgPSBsbnRtc2ctPm1zZ19sZW47CisJc3RydWN0IGlvdl9pdGVyIGZyb207CiAJc3RydWN0IGtpYl9tc2cgKmlibXNnOwogCXN0cnVjdCBraWJfcmRtYV9kZXNjICAqcmQ7CiAJc3RydWN0IGtpYl90eCAqdHg7CkBAIC0xNTE4LDYgKzE1MjAsMTcgQEAKIAkvKiBwYXlsb2FkIGlzIGVpdGhlciBhbGwgdmFkZHJzIG9yIGFsbCBwYWdlcyAqLwogCUxBU1NFUlQoIShwYXlsb2FkX2tpb3YgJiYgcGF5bG9hZF9pb3YpKTsKIAorCWlmIChwYXlsb2FkX2tpb3YpCisJCWlvdl9pdGVyX2J2ZWMoJmZyb20sIElURVJfQlZFQyB8IFdSSVRFLAorCQkJICAgICAgcGF5bG9hZF9raW92LCBwYXlsb2FkX25pb3YsCisJCQkgICAgICBwYXlsb2FkX25vYiArIHBheWxvYWRfb2Zmc2V0KTsKKwllbHNlCisJCWlvdl9pdGVyX2t2ZWMoJmZyb20sIElURVJfS1ZFQyB8IFdSSVRFLAorCQkJICAgICAgcGF5bG9hZF9pb3YsIHBheWxvYWRfbmlvdiwKKwkJCSAgICAgIHBheWxvYWRfbm9iICsgcGF5bG9hZF9vZmZzZXQpOworCisJaW92X2l0ZXJfYWR2YW5jZSgmZnJvbSwgcGF5bG9hZF9vZmZzZXQpOworCiAJc3dpdGNoICh0eXBlKSB7CiAJZGVmYXVsdDoKIAkJTEJVRygpOwpAQCAtMTYzNywxNyArMTY1MCw4IEBACiAJaWJtc2cgPSB0eC0+dHhfbXNnOwogCWlibXNnLT5pYm1fdS5pbW1lZGlhdGUuaWJpbV9oZHIgPSAqaGRyOwogCi0JaWYgKHBheWxvYWRfa2lvdikKLQkJbG5ldF9jb3B5X2tpb3YyZmxhdChJQkxORF9NU0dfU0laRSwgaWJtc2csCi0JCQkJICAgIG9mZnNldG9mKHN0cnVjdCBraWJfbXNnLCBpYm1fdS5pbW1lZGlhdGUuaWJpbV9wYXlsb2FkKSwKLQkJCQkgICAgcGF5bG9hZF9uaW92LCBwYXlsb2FkX2tpb3YsCi0JCQkJICAgIHBheWxvYWRfb2Zmc2V0LCBwYXlsb2FkX25vYik7Ci0JZWxzZQotCQlsbmV0X2NvcHlfaW92MmZsYXQoSUJMTkRfTVNHX1NJWkUsIGlibXNnLAotCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBraWJfbXNnLCBpYm1fdS5pbW1lZGlhdGUuaWJpbV9wYXlsb2FkKSwKLQkJCQkgICBwYXlsb2FkX25pb3YsIHBheWxvYWRfaW92LAotCQkJCSAgIHBheWxvYWRfb2Zmc2V0LCBwYXlsb2FkX25vYik7Ci0KKwljb3B5X2Zyb21faXRlcigmaWJtc2ctPmlibV91LmltbWVkaWF0ZS5pYmltX3BheWxvYWQsIElCTE5EX01TR19TSVpFLAorCQkgICAgICAgJmZyb20pOwogCW5vYiA9IG9mZnNldG9mKHN0cnVjdCBraWJfaW1tZWRpYXRlX21zZywgaWJpbV9wYXlsb2FkW3BheWxvYWRfbm9iXSk7CiAJa2libG5kX2luaXRfdHhfbXNnKG5pLCB0eCwgSUJMTkRfTVNHX0lNTUVESUFURSwgbm9iKTsKIApAQCAtMTcxOSw4ICsxNzIzLDcgQEAKIAogaW50CiBraWJsbmRfcmVjdihsbmV0X25pX3QgKm5pLCB2b2lkICpwcml2YXRlLCBsbmV0X21zZ190ICpsbnRtc2csIGludCBkZWxheWVkLAotCSAgICB1bnNpZ25lZCBpbnQgbmlvdiwgc3RydWN0IGt2ZWMgKmlvdiwgbG5ldF9raW92X3QgKmtpb3YsCi0JICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBtbGVuLCB1bnNpZ25lZCBpbnQgcmxlbikKKwkgICAgc3RydWN0IGlvdl9pdGVyICp0bywgdW5zaWduZWQgaW50IHJsZW4pCiB7CiAJc3RydWN0IGtpYl9yeCAqcnggPSBwcml2YXRlOwogCXN0cnVjdCBraWJfbXNnICpyeG1zZyA9IHJ4LT5yeF9tc2c7CkBAIC0xNzMwLDEwICsxNzMzLDkgQEAKIAlpbnQgcG9zdF9jcmVkaXQgPSBJQkxORF9QT1NUUlhfUEVFUl9DUkVESVQ7CiAJaW50IHJjID0gMDsKIAotCUxBU1NFUlQobWxlbiA8PSBybGVuKTsKKwlMQVNTRVJUKGlvdl9pdGVyX2NvdW50KHRvKSA8PSBybGVuKTsKIAlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7CiAJLyogRWl0aGVyIGFsbCBwYWdlcyBvciBhbGwgdmFkZHJzICovCi0JTEFTU0VSVCghKGtpb3YgJiYgaW92KSk7CiAKIAlzd2l0Y2ggKHJ4bXNnLT5pYm1fdHlwZSkgewogCWRlZmF1bHQ6CkBAIC0xNzQ5LDE2ICsxNzUxLDggQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKGtpb3YpCi0JCQlsbmV0X2NvcHlfZmxhdDJraW92KG5pb3YsIGtpb3YsIG9mZnNldCwKLQkJCQkJICAgIElCTE5EX01TR19TSVpFLCByeG1zZywKLQkJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBraWJfbXNnLCBpYm1fdS5pbW1lZGlhdGUuaWJpbV9wYXlsb2FkKSwKLQkJCQkJICAgIG1sZW4pOwotCQllbHNlCi0JCQlsbmV0X2NvcHlfZmxhdDJpb3YobmlvdiwgaW92LCBvZmZzZXQsCi0JCQkJCSAgIElCTE5EX01TR19TSVpFLCByeG1zZywKLQkJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGtpYl9tc2csIGlibV91LmltbWVkaWF0ZS5pYmltX3BheWxvYWQpLAotCQkJCQkgICBtbGVuKTsKKwkJY29weV90b19pdGVyKCZyeG1zZy0+aWJtX3UuaW1tZWRpYXRlLmliaW1fcGF5bG9hZCwKKwkJCSAgICAgSUJMTkRfTVNHX1NJWkUsIHRvKTsKIAkJbG5ldF9maW5hbGl6ZShuaSwgbG50bXNnLCAwKTsKIAkJYnJlYWs7CiAKQEAgLTE3NjYsNyArMTc2MCw3IEBACiAJCXN0cnVjdCBraWJfbXNnCSp0eG1zZzsKIAkJc3RydWN0IGtpYl9yZG1hX2Rlc2MgKnJkOwogCi0JCWlmICghbWxlbikgeworCQlpZiAoIWlvdl9pdGVyX2NvdW50KHRvKSkgewogCQkJbG5ldF9maW5hbGl6ZShuaSwgbG50bXNnLCAwKTsKIAkJCWtpYmxuZF9zZW5kX2NvbXBsZXRpb24ocngtPnJ4X2Nvbm4sIElCTE5EX01TR19QVVRfTkFLLCAwLAogCQkJCQkgICAgICAgcnhtc2ctPmlibV91LnB1dHJlcS5pYnBybV9jb29raWUpOwpAQCAtMTc4NCwxMiArMTc3OCwxNiBAQAogCiAJCXR4bXNnID0gdHgtPnR4X21zZzsKIAkJcmQgPSAmdHhtc2ctPmlibV91LnB1dGFjay5pYnBhbV9yZDsKLQkJaWYgKCFraW92KQorCQlpZiAoISh0by0+dHlwZSAmIElURVJfQlZFQykpCiAJCQlyYyA9IGtpYmxuZF9zZXR1cF9yZF9pb3YobmksIHR4LCByZCwKLQkJCQkJCSBuaW92LCBpb3YsIG9mZnNldCwgbWxlbik7CisJCQkJCQkgdG8tPm5yX3NlZ3MsIHRvLT5rdmVjLAorCQkJCQkJIHRvLT5pb3Zfb2Zmc2V0LAorCQkJCQkJIGlvdl9pdGVyX2NvdW50KHRvKSk7CiAJCWVsc2UKIAkJCXJjID0ga2libG5kX3NldHVwX3JkX2tpb3YobmksIHR4LCByZCwKLQkJCQkJCSAgbmlvdiwga2lvdiwgb2Zmc2V0LCBtbGVuKTsKKwkJCQkJCSAgdG8tPm5yX3NlZ3MsIHRvLT5idmVjLAorCQkJCQkJICB0by0+aW92X29mZnNldCwKKwkJCQkJCSAgaW92X2l0ZXJfY291bnQodG8pKTsKIAkJaWYgKHJjKSB7CiAJCQlDRVJST1IoIkNhbid0IHNldHVwIFBVVCBzaW5rIGZvciAlczogJWRcbiIsCiAJCQkgICAgICAgbGliY2ZzX25pZDJzdHIoY29ubi0+aWJjX3BlZXItPmlicF9uaWQpLCByYyk7CkBAIC0yMTgzLDE0ICsyMTgxLDExIEBACiAJCXJldHVybjsKIAl9CiAKLQkvKioKLQkgKiByZWZjb3VudCB0YWtlbiBieSBjbWlkIGlzIG5vdCByZWxpYWJsZSBhZnRlciBJIHJlbGVhc2VkIHRoZSBnbG9jawotCSAqIGJlY2F1c2UgdGhpcyBjb25uZWN0aW9uIGlzIHZpc2libGUgdG8gb3RoZXIgdGhyZWFkcyBub3csIGFub3RoZXIKLQkgKiB0aHJlYWQgY2FuIGZpbmQgYW5kIGNsb3NlIHRoaXMgY29ubmVjdGlvbiByaWdodCBhZnRlciBJIHJlbGVhc2VkCi0JICogdGhlIGdsb2NrLCBpZiBraWJsbmRfY21fY2FsbGJhY2sgZm9yIFJETUFfQ01fRVZFTlRfRElTQ09OTkVDVEVEIGlzCi0JICogY2FsbGVkLCBpdCBjYW4gcmVsZWFzZSB0aGUgY29ubmVjdGlvbiByZWZjb3VudCB0YWtlbiBieSBjbWlkLgotCSAqIEl0IG1lYW5zIHRoZSBjb25uZWN0aW9uIGNvdWxkIGJlIGRlc3Ryb3llZCBiZWZvcmUgSSBmaW5pc2ggbXkKLQkgKiBvcGVyYXRpb25zIG9uIGl0LgorCS8qCisJICogKzEgcmVmIGZvciBteXNlbGYsIHRoaXMgY29ubmVjdGlvbiBpcyB2aXNpYmxlIHRvIG90aGVyIHRocmVhZHMKKwkgKiBub3csIHJlZmNvdW50IG9mIHBlZXI6aWJwX2Nvbm5zIGNhbiBiZSByZWxlYXNlZCBieSBjb25uZWN0aW9uCisJICogY2xvc2UgZnJvbSBlaXRoZXIgYSBkaWZmZXJlbnQgdGhyZWFkLCBvciB0aGUgY2FsbGluZyBvZgorCSAqIGtpYmxuZF9jaGVja19zZW5kc19sb2NrZWQoKSBiZWxvdy4gU2VlIGJ6MjE5MTEgZm9yIGRldGFpbHMuCiAJICovCiAJa2libG5kX2Nvbm5fYWRkcmVmKGNvbm4pOwogCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZraWJsbmRfZGF0YS5raWJfZ2xvYmFsX2xvY2ssIGZsYWdzKTsKQEAgLTIyMDIsMTAgKzIxOTcsOSBAQAogCiAJCWtpYmxuZF9xdWV1ZV90eF9sb2NrZWQodHgsIGNvbm4pOwogCX0KKwlraWJsbmRfY2hlY2tfc2VuZHNfbG9ja2VkKGNvbm4pOwogCXNwaW5fdW5sb2NrKCZjb25uLT5pYmNfbG9jayk7CiAKLQlraWJsbmRfY2hlY2tfc2VuZHMoY29ubik7Ci0KIAkvKiBzY2hlZHVsZSBibG9ja2VkIHJ4cyAqLwogCWtpYmxuZF9oYW5kbGVfZWFybHlfcnhzKGNvbm4pOwogCkBAIC0yMjQwLDYgKzIyMzQsNyBAQAogCXN0cnVjdCBraWJfcmVqIHJlajsKIAlpbnQgdmVyc2lvbiA9IElCTE5EX01TR19WRVJTSU9OOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG1heF9mcmFnczsKIAlpbnQgcmM7CiAJc3RydWN0IHNvY2thZGRyX2luICpwZWVyX2FkZHI7CiAKQEAgLTIzNDYsMjIgKzIzNDEsMjAgQEAKIAkJZ290byBmYWlsZWQ7CiAJfQogCi0JaWYgKHJlcW1zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX21heF9mcmFncyA+Ci0JICAgIGtpYmxuZF9yZG1hX2ZyYWdzKHZlcnNpb24sIG5pKSkgewotCQlDV0FSTigiQ2FuJ3QgYWNjZXB0IGNvbm4gZnJvbSAlcyAodmVyc2lvbiAleCk6IG1heF9mcmFncyAlZCB0b28gbGFyZ2UgKCVkIHdhbnRlZClcbiIsCi0JCSAgICAgIGxpYmNmc19uaWQyc3RyKG5pZCksIHZlcnNpb24sCi0JCSAgICAgIHJlcW1zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX21heF9mcmFncywKKwltYXhfZnJhZ3MgPSByZXFtc2ctPmlibV91LmNvbm5wYXJhbXMuaWJjcF9tYXhfZnJhZ3MgPj4gSUJMTkRfRlJBR19TSElGVDsKKwlpZiAobWF4X2ZyYWdzID4ga2libG5kX3JkbWFfZnJhZ3ModmVyc2lvbiwgbmkpKSB7CisJCUNXQVJOKCJDYW4ndCBhY2NlcHQgY29ubiBmcm9tICVzICh2ZXJzaW9uICV4KTogbWF4IG1lc3NhZ2Ugc2l6ZSAlZCBpcyB0b28gbGFyZ2UgKCVkIHdhbnRlZClcbiIsCisJCSAgICAgIGxpYmNmc19uaWQyc3RyKG5pZCksIHZlcnNpb24sIG1heF9mcmFncywKIAkJICAgICAga2libG5kX3JkbWFfZnJhZ3ModmVyc2lvbiwgbmkpKTsKIAogCQlpZiAodmVyc2lvbiA+PSBJQkxORF9NU0dfVkVSU0lPTikKIAkJCXJlai5pYnJfd2h5ID0gSUJMTkRfUkVKRUNUX1JETUFfRlJBR1M7CiAKIAkJZ290byBmYWlsZWQ7Ci0JfSBlbHNlIGlmIChyZXFtc2ctPmlibV91LmNvbm5wYXJhbXMuaWJjcF9tYXhfZnJhZ3MgPAotCQkgICBraWJsbmRfcmRtYV9mcmFncyh2ZXJzaW9uLCBuaSkgJiYgIW5ldC0+aWJuX2Ztcl9wcykgewotCQlDV0FSTigiQ2FuJ3QgYWNjZXB0IGNvbm4gZnJvbSAlcyAodmVyc2lvbiAleCk6IG1heF9mcmFncyAlZCBpbmNvbXBhdGlibGUgd2l0aG91dCBGTVIgcG9vbCAoJWQgd2FudGVkKVxuIiwKLQkJICAgICAgbGliY2ZzX25pZDJzdHIobmlkKSwgdmVyc2lvbiwKLQkJICAgICAgcmVxbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfbWF4X2ZyYWdzLAorCX0gZWxzZSBpZiAobWF4X2ZyYWdzIDwga2libG5kX3JkbWFfZnJhZ3ModmVyc2lvbiwgbmkpICYmCisJCSAgICFuZXQtPmlibl9mbXJfcHMpIHsKKwkJQ1dBUk4oIkNhbid0IGFjY2VwdCBjb25uIGZyb20gJXMgKHZlcnNpb24gJXgpOiBtYXggbWVzc2FnZSBzaXplICVkIGluY29tcGF0aWJsZSB3aXRob3V0IEZNUiBwb29sICglZCB3YW50ZWQpXG4iLAorCQkgICAgICBsaWJjZnNfbmlkMnN0cihuaWQpLCB2ZXJzaW9uLCBtYXhfZnJhZ3MsCiAJCSAgICAgIGtpYmxuZF9yZG1hX2ZyYWdzKHZlcnNpb24sIG5pKSk7CiAKIAkJaWYgKHZlcnNpb24gPT0gSUJMTkRfTVNHX1ZFUlNJT04pCkBAIC0yMzg3LDcgKzIzODAsNyBAQAogCX0KIAogCS8qIFdlIGhhdmUgdmFsaWRhdGVkIHRoZSBwZWVyJ3MgcGFyYW1ldGVycyBzbyB1c2UgdGhvc2UgKi8KLQlwZWVyLT5pYnBfbWF4X2ZyYWdzID0gcmVxbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfbWF4X2ZyYWdzOworCXBlZXItPmlicF9tYXhfZnJhZ3MgPSBtYXhfZnJhZ3M7CiAJcGVlci0+aWJwX3F1ZXVlX2RlcHRoID0gcmVxbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfcXVldWVfZGVwdGg7CiAKIAl3cml0ZV9sb2NrX2lycXNhdmUoZ19sb2NrLCBmbGFncyk7CkBAIC0yNDE5LDIzICsyNDEyLDM3IEBACiAJCQlnb3RvIGZhaWxlZDsKIAkJfQogCi0JCS8qIHRpZS1icmVhayBjb25uZWN0aW9uIHJhY2UgaW4gZmF2b3VyIG9mIHRoZSBoaWdoZXIgTklEICovCisJCS8qCisJCSAqIFRpZS1icmVhayBjb25uZWN0aW9uIHJhY2UgaW4gZmF2b3VyIG9mIHRoZSBoaWdoZXIgTklELgorCQkgKiBJZiB3ZSBrZWVwIHJ1bm5pbmcgaW50byBhIHJhY2UgY29uZGl0aW9uIG11bHRpcGxlIHRpbWVzLAorCQkgKiB3ZSBoYXZlIHRvIGFzc3VtZSB0aGF0IHRoZSBjb25uZWN0aW9uIGF0dGVtcHQgd2l0aCB0aGUKKwkJICogaGlnaGVyIE5JRCBpcyBzdHVjayBpbiBhIGNvbm5lY3Rpbmcgc3RhdGUgYW5kIHdpbGwgbmV2ZXIKKwkJICogcmVjb3Zlci4gIEFzIHN1Y2gsIHdlIHBhc3MgdGhyb3VnaCB0aGlzIGlmLWJsb2NrIGFuZCBsZXQKKwkJICogdGhlIGxvd2VyIE5JRCBjb25uZWN0aW9uIHdpbiBzbyB3ZSBjYW4gbW92ZSBmb3J3YXJkLgorCQkgKi8KIAkJaWYgKHBlZXIyLT5pYnBfY29ubmVjdGluZyAmJgotCQkgICAgbmlkIDwgbmktPm5pX25pZCkgeworCQkgICAgbmlkIDwgbmktPm5pX25pZCAmJiBwZWVyMi0+aWJwX3JhY2VzIDwKKwkJICAgIE1BWF9DT05OX1JBQ0VTX0JFRk9SRV9BQk9SVCkgeworCQkJcGVlcjItPmlicF9yYWNlcysrOwogCQkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoZ19sb2NrLCBmbGFncyk7CiAKLQkJCUNXQVJOKCJDb25uIHJhY2UgJXNcbiIsIGxpYmNmc19uaWQyc3RyKHBlZXIyLT5pYnBfbmlkKSk7CisJCQlDREVCVUcoRF9ORVQsICJDb25uIHJhY2UgJXNcbiIsCisJCQkgICAgICAgbGliY2ZzX25pZDJzdHIocGVlcjItPmlicF9uaWQpKTsKIAogCQkJa2libG5kX3BlZXJfZGVjcmVmKHBlZXIpOwogCQkJcmVqLmlicl93aHkgPSBJQkxORF9SRUpFQ1RfQ09OTl9SQUNFOwogCQkJZ290byBmYWlsZWQ7CiAJCX0KLQorCQlpZiAocGVlcjItPmlicF9yYWNlcyA+PSBNQVhfQ09OTl9SQUNFU19CRUZPUkVfQUJPUlQpCisJCQlDTkVURVJSKCJDb25uIHJhY2UgJXM6IHVucmVzb2x2ZWQgYWZ0ZXIgJWQgYXR0ZW1wdHMsIGxldHRpbmcgbG93ZXIgTklEIHdpblxuIiwKKwkJCQlsaWJjZnNfbmlkMnN0cihwZWVyMi0+aWJwX25pZCksCisJCQkJTUFYX0NPTk5fUkFDRVNfQkVGT1JFX0FCT1JUKTsKIAkJLyoqCiAJCSAqIHBhc3NpdmUgY29ubmVjdGlvbiBpcyBhbGxvd2VkIGV2ZW4gdGhpcyBwZWVyIGlzIHdhaXRpbmcgZm9yCiAJCSAqIHJlY29ubmVjdGlvbi4KIAkJICovCiAJCXBlZXIyLT5pYnBfcmVjb25uZWN0aW5nID0gMDsKKwkJcGVlcjItPmlicF9yYWNlcyA9IDA7CiAJCXBlZXIyLT5pYnBfYWNjZXB0aW5nKys7CiAJCWtpYmxuZF9wZWVyX2FkZHJlZihwZWVyMik7CiAKQEAgLTI0OTQsNyArMjUwMSw3IEBACiAJa2libG5kX2luaXRfbXNnKGFja21zZywgSUJMTkRfTVNHX0NPTk5BQ0ssCiAJCQlzaXplb2YoYWNrbXNnLT5pYm1fdS5jb25ucGFyYW1zKSk7CiAJYWNrbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfcXVldWVfZGVwdGggPSBjb25uLT5pYmNfcXVldWVfZGVwdGg7Ci0JYWNrbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfbWF4X2ZyYWdzID0gY29ubi0+aWJjX21heF9mcmFnczsKKwlhY2ttc2ctPmlibV91LmNvbm5wYXJhbXMuaWJjcF9tYXhfZnJhZ3MgPSBjb25uLT5pYmNfbWF4X2ZyYWdzIDw8IElCTE5EX0ZSQUdfU0hJRlQ7CiAJYWNrbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfbWF4X21zZ19zaXplID0gSUJMTkRfTVNHX1NJWkU7CiAKIAlraWJsbmRfcGFja19tc2cobmksIGFja21zZywgdmVyc2lvbiwgMCwgbmlkLCByZXFtc2ctPmlibV9zcmNzdGFtcCk7CkBAIC0yNTI2LDkgKzI1MzMsOSBAQAogCiAgZmFpbGVkOgogCWlmIChuaSkgewotCQlsbmV0X25pX2RlY3JlZihuaSk7CiAJCXJlai5pYnJfY3AuaWJjcF9xdWV1ZV9kZXB0aCA9IGtpYmxuZF9tc2dfcXVldWVfc2l6ZSh2ZXJzaW9uLCBuaSk7CiAJCXJlai5pYnJfY3AuaWJjcF9tYXhfZnJhZ3MgPSBraWJsbmRfcmRtYV9mcmFncyh2ZXJzaW9uLCBuaSk7CisJCWxuZXRfbmlfZGVjcmVmKG5pKTsKIAl9CiAKIAlyZWouaWJyX3ZlcnNpb24gICAgICAgICAgICAgPSB2ZXJzaW9uOwpAQCAtMjU1Niw3ICsyNTYzLDcgQEAKIAogCWlmIChjcCkgewogCQltc2dfc2l6ZSA9IGNwLT5pYmNwX21heF9tc2dfc2l6ZTsKLQkJZnJhZ19udW0gPSBjcC0+aWJjcF9tYXhfZnJhZ3M7CisJCWZyYWdfbnVtCT0gY3AtPmliY3BfbWF4X2ZyYWdzIDw8IElCTE5EX0ZSQUdfU0hJRlQ7CiAJCXF1ZXVlX2RlcCA9IGNwLT5pYmNwX3F1ZXVlX2RlcHRoOwogCX0KIApAQCAtMjgyMSwxMSArMjgyOCwxMSBAQAogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQlpZiAobXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfbWF4X2ZyYWdzID4KKwlpZiAoKG1zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX21heF9mcmFncyA+PiBJQkxORF9GUkFHX1NISUZUKSA+CiAJICAgIGNvbm4tPmliY19tYXhfZnJhZ3MpIHsKIAkJQ0VSUk9SKCIlcyBoYXMgaW5jb21wYXRpYmxlIG1heF9mcmFncyAlZCAoPD0lZCB3YW50ZWQpXG4iLAogCQkgICAgICAgbGliY2ZzX25pZDJzdHIocGVlci0+aWJwX25pZCksCi0JCSAgICAgICBtc2ctPmlibV91LmNvbm5wYXJhbXMuaWJjcF9tYXhfZnJhZ3MsCisJCSAgICAgICBtc2ctPmlibV91LmNvbm5wYXJhbXMuaWJjcF9tYXhfZnJhZ3MgPj4gSUJMTkRfRlJBR19TSElGVCwKIAkJICAgICAgIGNvbm4tPmliY19tYXhfZnJhZ3MpOwogCQlyYyA9IC1FUFJPVE87CiAJCWdvdG8gZmFpbGVkOwpAQCAtMjg1OSw3ICsyODY2LDcgQEAKIAljb25uLT5pYmNfY3JlZGl0cyA9IG1zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX3F1ZXVlX2RlcHRoOwogCWNvbm4tPmliY19yZXNlcnZlZF9jcmVkaXRzID0gbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfcXVldWVfZGVwdGg7CiAJY29ubi0+aWJjX3F1ZXVlX2RlcHRoID0gbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfcXVldWVfZGVwdGg7Ci0JY29ubi0+aWJjX21heF9mcmFncyA9IG1zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX21heF9mcmFnczsKKwljb25uLT5pYmNfbWF4X2ZyYWdzID0gbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfbWF4X2ZyYWdzID4+IElCTE5EX0ZSQUdfU0hJRlQ7CiAJTEFTU0VSVChjb25uLT5pYmNfY3JlZGl0cyArIGNvbm4tPmliY19yZXNlcnZlZF9jcmVkaXRzICsKIAkJSUJMTkRfT09CX01TR1ModmVyKSA8PSBJQkxORF9SWF9NU0dTKGNvbm4pKTsKIApAQCAtMjkxNiw3ICsyOTIzLDcgQEAKIAltZW1zZXQobXNnLCAwLCBzaXplb2YoKm1zZykpOwogCWtpYmxuZF9pbml0X21zZyhtc2csIElCTE5EX01TR19DT05OUkVRLCBzaXplb2YobXNnLT5pYm1fdS5jb25ucGFyYW1zKSk7CiAJbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfcXVldWVfZGVwdGggPSBjb25uLT5pYmNfcXVldWVfZGVwdGg7Ci0JbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfbWF4X2ZyYWdzID0gY29ubi0+aWJjX21heF9mcmFnczsKKwltc2ctPmlibV91LmNvbm5wYXJhbXMuaWJjcF9tYXhfZnJhZ3MgPSBjb25uLT5pYmNfbWF4X2ZyYWdzIDw8IElCTE5EX0ZSQUdfU0hJRlQ7CiAJbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfbWF4X21zZ19zaXplID0gSUJMTkRfTVNHX1NJWkU7CiAKIAlraWJsbmRfcGFja19tc2cocGVlci0+aWJwX25pLCBtc2csIHZlcnNpb24sCkBAIC0zMjMzLDcgKzMyNDAsMTEgQEAKIAkgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY29ubiwgdGVtcCwgJmNoZWNrc2VuZHMsIGliY19jb25uZF9saXN0KSB7CiAJCWxpc3RfZGVsKCZjb25uLT5pYmNfY29ubmRfbGlzdCk7Ci0JCWtpYmxuZF9jaGVja19zZW5kcyhjb25uKTsKKworCQlzcGluX2xvY2soJmNvbm4tPmliY19sb2NrKTsKKwkJa2libG5kX2NoZWNrX3NlbmRzX2xvY2tlZChjb25uKTsKKwkJc3Bpbl91bmxvY2soJmNvbm4tPmliY19sb2NrKTsKKwogCQlraWJsbmRfY29ubl9kZWNyZWYoY29ubik7CiAJfQogfQpAQCAtMzQxOSw2ICszNDMwLDEyIEBACiAJY2FzZSBJQl9FVkVOVF9DT01NX0VTVDoKIAkJQ0RFQlVHKERfTkVULCAiJXMgZXN0YWJsaXNoZWRcbiIsCiAJCSAgICAgICBsaWJjZnNfbmlkMnN0cihjb25uLT5pYmNfcGVlci0+aWJwX25pZCkpOworCQkvKgorCQkgKiBXZSByZWNlaXZlZCBhIHBhY2tldCBidXQgY29ubmVjdGlvbiBpc24ndCBlc3RhYmxpc2hlZAorCQkgKiBwcm9iYWJseSBoYW5kc2hha2UgcGFja2V0IHdhcyBsb3N0LCBzbyBmcmVlIHRvCisJCSAqIGZvcmNlIG1ha2UgY29ubmVjdGlvbiBlc3RhYmxpc2hlZAorCQkgKi8KKwkJcmRtYV9ub3RpZnkoY29ubi0+aWJjX2NtaWQsIElCX0VWRU5UX0NPTU1fRVNUKTsKIAkJcmV0dXJuOwogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmQuYwppbmRleCAwN2VjNTQwLi5jYmM5YTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZC5jCkBAIC0xNDY4LDExICsxNDY4LDYgQEAKIAogCQljb25uLT5rc25jX3JvdXRlID0gTlVMTDsKIAotI2lmIDAJICAgLyogaXJyZWxldmFudCB3aXRoIG9ubHkgZWFnZXIgcm91dGVzICovCi0JCS8qIG1ha2Ugcm91dGUgbGVhc3QgZmF2b3VyaXRlICovCi0JCWxpc3RfZGVsKCZyb3V0ZS0+a3Nucl9saXN0KTsKLQkJbGlzdF9hZGRfdGFpbCgmcm91dGUtPmtzbnJfbGlzdCwgJnBlZXItPmtzbnBfcm91dGVzKTsKLSNlbmRpZgogCQlrc29ja25hbF9yb3V0ZV9kZWNyZWYocm91dGUpOyAgICAgLyogZHJvcCBjb25uJ3MgcmVmIG9uIHJvdXRlICovCiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kLmgKaW5kZXggYTU2NjMyYi4uZTZjYTBjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmQuaApAQCAtODYsOCArODYsNiBAQAogCWludCAgICAgICAgICAgICAgICAgICAgIGtzc19uY29ubnM7ICAgICAvKiAjIGNvbm5lY3Rpb25zIGFzc2lnbmVkIHRvCiAJCQkJCQkgKiB0aGlzIHNjaGVkdWxlciAqLwogCXN0cnVjdCBrc29ja19zY2hlZF9pbmZvICprc3NfaW5mbzsJLyogb3duZXIgb2YgaXQgKi8KLQlzdHJ1Y3QgcGFnZSAgICAgICAgICAgICAqa3NzX3J4X3NjcmF0Y2hfcGdzW0xORVRfTUFYX0lPVl07Ci0Jc3RydWN0IGt2ZWMgICAgICAgICAgICAga3NzX3NjcmF0Y2hfaW92W0xORVRfTUFYX0lPVl07CiB9OwogCiBzdHJ1Y3Qga3NvY2tfc2NoZWRfaW5mbyB7CkBAIC02MTYsOSArNjE0LDcgQEAKIGludCBrc29ja25hbF9jdGwobG5ldF9uaV90ICpuaSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKIGludCBrc29ja25hbF9zZW5kKGxuZXRfbmlfdCAqbmksIHZvaWQgKnByaXZhdGUsIGxuZXRfbXNnX3QgKmxudG1zZyk7CiBpbnQga3NvY2tuYWxfcmVjdihsbmV0X25pX3QgKm5pLCB2b2lkICpwcml2YXRlLCBsbmV0X21zZ190ICpsbnRtc2csCi0JCSAgaW50IGRlbGF5ZWQsIHVuc2lnbmVkIGludCBuaW92LAotCQkgIHN0cnVjdCBrdmVjICppb3YsIGxuZXRfa2lvdl90ICpraW92LAotCQkgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBtbGVuLCB1bnNpZ25lZCBpbnQgcmxlbik7CisJCSAgaW50IGRlbGF5ZWQsIHN0cnVjdCBpb3ZfaXRlciAqdG8sIHVuc2lnbmVkIGludCBybGVuKTsKIGludCBrc29ja25hbF9hY2NlcHQobG5ldF9uaV90ICpuaSwgc3RydWN0IHNvY2tldCAqc29jayk7CiAKIGludCBrc29ja25hbF9hZGRfcGVlcihsbmV0X25pX3QgKm5pLCBsbmV0X3Byb2Nlc3NfaWRfdCBpZCwgX191MzIgaXAsIGludCBwb3J0KTsKQEAgLTYzNSw3ICs2MzEsNyBAQAogaW50IGtzb2NrbmFsX2Nsb3NlX2Nvbm5fYW5kX3NpYmxpbmdzKHN0cnVjdCBrc29ja19jb25uICpjb25uLCBpbnQgd2h5KTsKIGludCBrc29ja25hbF9jbG9zZV9tYXRjaGluZ19jb25ucyhsbmV0X3Byb2Nlc3NfaWRfdCBpZCwgX191MzIgaXBhZGRyKTsKIHN0cnVjdCBrc29ja19jb25uICprc29ja25hbF9maW5kX2Nvbm5fbG9ja2VkKHN0cnVjdCBrc29ja19wZWVyICpwZWVyLAotCQkJCQlzdHJ1Y3Qga3NvY2tfdHggKnR4LCBpbnQgbm9uYmxrKTsKKwkJCQkJICAgICBzdHJ1Y3Qga3NvY2tfdHggKnR4LCBpbnQgbm9uYmxrKTsKIAogaW50ICBrc29ja25hbF9sYXVuY2hfcGFja2V0KGxuZXRfbmlfdCAqbmksIHN0cnVjdCBrc29ja190eCAqdHgsCiAJCQkgICAgbG5ldF9wcm9jZXNzX2lkX3QgaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9jYi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9jYi5jCmluZGV4IDMwMzU3NmQuLmMxYzZmNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfY2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2NiLmMKQEAgLTM1LDggKzM1LDggQEAKIAkJc3Bpbl9sb2NrKCZrc29ja25hbF9kYXRhLmtzbmRfdHhfbG9jayk7CiAKIAkJaWYgKCFsaXN0X2VtcHR5KCZrc29ja25hbF9kYXRhLmtzbmRfaWRsZV9ub29wX3R4cykpIHsKLQkJCXR4ID0gbGlzdF9lbnRyeShrc29ja25hbF9kYXRhLmtzbmRfaWRsZV9ub29wX3R4cy4gXAotCQkJCQkgICAgbmV4dCwgc3RydWN0IGtzb2NrX3R4LCB0eF9saXN0KTsKKwkJCXR4ID0gbGlzdF9lbnRyeShrc29ja25hbF9kYXRhLmtzbmRfaWRsZV9ub29wX3R4cy5uZXh0LAorCQkJCQlzdHJ1Y3Qga3NvY2tfdHgsIHR4X2xpc3QpOwogCQkJTEFTU0VSVCh0eC0+dHhfZGVzY19zaXplID09IHNpemUpOwogCQkJbGlzdF9kZWwoJnR4LT50eF9saXN0KTsKIAkJfQpAQCAtMTY0LDEzICsxNjQsMTMgQEAKIAlkbyB7CiAJCUxBU1NFUlQodHgtPnR4X25raW92ID4gMCk7CiAKLQkJaWYgKG5vYiA8IChpbnQpa2lvdi0+a2lvdl9sZW4pIHsKLQkJCWtpb3YtPmtpb3Zfb2Zmc2V0ICs9IG5vYjsKLQkJCWtpb3YtPmtpb3ZfbGVuIC09IG5vYjsKKwkJaWYgKG5vYiA8IChpbnQpa2lvdi0+YnZfbGVuKSB7CisJCQlraW92LT5idl9vZmZzZXQgKz0gbm9iOworCQkJa2lvdi0+YnZfbGVuIC09IG5vYjsKIAkJCXJldHVybiByYzsKIAkJfQogCi0JCW5vYiAtPSAoaW50KWtpb3YtPmtpb3ZfbGVuOworCQlub2IgLT0gKGludClraW92LT5idl9sZW47CiAJCXR4LT50eF9raW92ID0gKytraW92OwogCQl0eC0+dHhfbmtpb3YtLTsKIAl9IHdoaWxlIChub2IpOwpAQCAtMzI2LDEzICszMjYsMTMgQEAKIAlkbyB7CiAJCUxBU1NFUlQoY29ubi0+a3NuY19yeF9ua2lvdiA+IDApOwogCi0JCWlmIChub2IgPCAoaW50KWtpb3YtPmtpb3ZfbGVuKSB7Ci0JCQlraW92LT5raW92X29mZnNldCArPSBub2I7Ci0JCQlraW92LT5raW92X2xlbiAtPSBub2I7CisJCWlmIChub2IgPCAoaW50KWtpb3YtPmJ2X2xlbikgeworCQkJa2lvdi0+YnZfb2Zmc2V0ICs9IG5vYjsKKwkJCWtpb3YtPmJ2X2xlbiAtPSBub2I7CiAJCQlyZXR1cm4gLUVBR0FJTjsKIAkJfQogCi0JCW5vYiAtPSBraW92LT5raW92X2xlbjsKKwkJbm9iIC09IGtpb3YtPmJ2X2xlbjsKIAkJY29ubi0+a3NuY19yeF9raW92ID0gKytraW92OwogCQljb25uLT5rc25jX3J4X25raW92LS07CiAJfSB3aGlsZSAobm9iKTsKQEAgLTEzMjUsMzkgKzEzMjUsMzYgQEAKIAogaW50CiBrc29ja25hbF9yZWN2KGxuZXRfbmlfdCAqbmksIHZvaWQgKnByaXZhdGUsIGxuZXRfbXNnX3QgKm1zZywgaW50IGRlbGF5ZWQsCi0JICAgICAgdW5zaWduZWQgaW50IG5pb3YsIHN0cnVjdCBrdmVjICppb3YsIGxuZXRfa2lvdl90ICpraW92LAotCSAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBtbGVuLCB1bnNpZ25lZCBpbnQgcmxlbikKKwkgICAgICBzdHJ1Y3QgaW92X2l0ZXIgKnRvLCB1bnNpZ25lZCBpbnQgcmxlbikKIHsKIAlzdHJ1Y3Qga3NvY2tfY29ubiAqY29ubiA9IHByaXZhdGU7CiAJc3RydWN0IGtzb2NrX3NjaGVkICpzY2hlZCA9IGNvbm4tPmtzbmNfc2NoZWR1bGVyOwogCi0JTEFTU0VSVChtbGVuIDw9IHJsZW4pOwotCUxBU1NFUlQobmlvdiA8PSBMTkVUX01BWF9JT1YpOworCUxBU1NFUlQoaW92X2l0ZXJfY291bnQodG8pIDw9IHJsZW4pOworCUxBU1NFUlQodG8tPm5yX3NlZ3MgPD0gTE5FVF9NQVhfSU9WKTsKIAogCWNvbm4tPmtzbmNfY29va2llID0gbXNnOwotCWNvbm4tPmtzbmNfcnhfbm9iX3dhbnRlZCA9IG1sZW47CisJY29ubi0+a3NuY19yeF9ub2Jfd2FudGVkID0gaW92X2l0ZXJfY291bnQodG8pOwogCWNvbm4tPmtzbmNfcnhfbm9iX2xlZnQgPSBybGVuOwogCi0JaWYgKCFtbGVuIHx8IGlvdikgeworCWlmICh0by0+dHlwZSAmIElURVJfS1ZFQykgewogCQljb25uLT5rc25jX3J4X25raW92ID0gMDsKIAkJY29ubi0+a3NuY19yeF9raW92ID0gTlVMTDsKIAkJY29ubi0+a3NuY19yeF9pb3YgPSBjb25uLT5rc25jX3J4X2lvdl9zcGFjZS5pb3Y7CiAJCWNvbm4tPmtzbmNfcnhfbmlvdiA9CiAJCQlsbmV0X2V4dHJhY3RfaW92KExORVRfTUFYX0lPViwgY29ubi0+a3NuY19yeF9pb3YsCi0JCQkJCSBuaW92LCBpb3YsIG9mZnNldCwgbWxlbik7CisJCQkJCSB0by0+bnJfc2VncywgdG8tPmt2ZWMsCisJCQkJCSB0by0+aW92X29mZnNldCwgaW92X2l0ZXJfY291bnQodG8pKTsKIAl9IGVsc2UgewogCQljb25uLT5rc25jX3J4X25pb3YgPSAwOwogCQljb25uLT5rc25jX3J4X2lvdiA9IE5VTEw7CiAJCWNvbm4tPmtzbmNfcnhfa2lvdiA9IGNvbm4tPmtzbmNfcnhfaW92X3NwYWNlLmtpb3Y7CiAJCWNvbm4tPmtzbmNfcnhfbmtpb3YgPQogCQkJbG5ldF9leHRyYWN0X2tpb3YoTE5FVF9NQVhfSU9WLCBjb25uLT5rc25jX3J4X2tpb3YsCi0JCQkJCSAgbmlvdiwga2lvdiwgb2Zmc2V0LCBtbGVuKTsKKwkJCQkJIHRvLT5ucl9zZWdzLCB0by0+YnZlYywKKwkJCQkJIHRvLT5pb3Zfb2Zmc2V0LCBpb3ZfaXRlcl9jb3VudCh0bykpOwogCX0KIAotCUxBU1NFUlQobWxlbiA9PQotCQlsbmV0X2lvdl9ub2IoY29ubi0+a3NuY19yeF9uaW92LCBjb25uLT5rc25jX3J4X2lvdikgKwotCQlsbmV0X2tpb3Zfbm9iKGNvbm4tPmtzbmNfcnhfbmtpb3YsIGNvbm4tPmtzbmNfcnhfa2lvdikpOwotCiAJTEFTU0VSVChjb25uLT5rc25jX3J4X3NjaGVkdWxlZCk7CiAKIAlzcGluX2xvY2tfYmgoJnNjaGVkLT5rc3NfbG9jayk7CkBAIC0yMDA4LDEzICsyMDA1LDYgQEAKIAkJbGlzdF9zcGxpY2VfaW5pdCgmcGVlci0+a3NucF90eF9xdWV1ZSwgJnpvbWJpZXMpOwogCX0KIAotI2lmIDAJICAgLyogaXJyZWxldmFudCB3aXRoIG9ubHkgZWFnZXIgcm91dGVzICovCi0JaWYgKCFyb3V0ZS0+a3Nucl9kZWxldGVkKSB7Ci0JCS8qIG1ha2UgdGhpcyByb3V0ZSBsZWFzdC1mYXZvdXJpdGUgZm9yIHJlLXNlbGVjdGlvbiAqLwotCQlsaXN0X2RlbCgmcm91dGUtPmtzbnJfbGlzdCk7Ci0JCWxpc3RfYWRkX3RhaWwoJnJvdXRlLT5rc25yX2xpc3QsICZwZWVyLT5rc25wX3JvdXRlcyk7Ci0JfQotI2VuZGlmCiAJd3JpdGVfdW5sb2NrX2JoKCZrc29ja25hbF9kYXRhLmtzbmRfZ2xvYmFsX2xvY2spOwogCiAJa3NvY2tuYWxfcGVlcl9mYWlsZWQocGVlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2xpYi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9saWIuYwppbmRleCA2YTE3NzU3Li42Yzk1ZTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2xpYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfbGliLmMKQEAgLTczLDkgKzczLDkgQEAKIGludAoga3NvY2tuYWxfbGliX3NlbmRfaW92KHN0cnVjdCBrc29ja19jb25uICpjb25uLCBzdHJ1Y3Qga3NvY2tfdHggKnR4KQogeworCXN0cnVjdCBtc2doZHIgbXNnID0gey5tc2dfZmxhZ3MgPSBNU0dfRE9OVFdBSVR9OwogCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBjb25uLT5rc25jX3NvY2s7Ci0JaW50IG5vYjsKLQlpbnQgcmM7CisJaW50IG5vYiwgaTsKIAogCWlmICgqa3NvY2tuYWxfdHVuYWJsZXMua3NuZF9lbmFibGVfY3N1bQkmJiAvKiBjaGVja3N1bSBlbmFibGVkICovCiAJICAgIGNvbm4tPmtzbmNfcHJvdG8gPT0gJmtzb2NrbmFsX3Byb3RvY29sX3YyeCAmJiAvKiBWMi54IGNvbm5lY3Rpb24gICovCkBAIC04MywzNCArODMsMTYgQEAKIAkgICAgIXR4LT50eF9tc2cua3NtX2NzdW0pCQkgICAgIC8qIG5vdCBjaGVja3N1bW1lZCAgKi8KIAkJa3NvY2tuYWxfbGliX2NzdW1fdHgodHgpOwogCi0JLyoKLQkgKiBOQiB3ZSBjYW4ndCB0cnVzdCBzb2NrZXQgb3BzIHRvIGVpdGhlciBjb25zdW1lIG91ciBpb3ZzCi0JICogb3IgbGVhdmUgdGhlbSBhbG9uZS4KLQkgKi8KLQl7Ci0jaWYgU09DS05BTF9TSU5HTEVfRlJBR19UWAotCQlzdHJ1Y3Qga3ZlYyBzY3JhdGNoOwotCQlzdHJ1Y3Qga3ZlYyAqc2NyYXRjaGlvdiA9ICZzY3JhdGNoOwotCQl1bnNpZ25lZCBpbnQgbmlvdiA9IDE7Ci0jZWxzZQotCQlzdHJ1Y3Qga3ZlYyAqc2NyYXRjaGlvdiA9IGNvbm4tPmtzbmNfc2NoZWR1bGVyLT5rc3Nfc2NyYXRjaF9pb3Y7Ci0JCXVuc2lnbmVkIGludCBuaW92ID0gdHgtPnR4X25pb3Y7Ci0jZW5kaWYKLQkJc3RydWN0IG1zZ2hkciBtc2cgPSB7Lm1zZ19mbGFncyA9IE1TR19ET05UV0FJVH07Ci0JCWludCBpOworCWZvciAobm9iID0gaSA9IDA7IGkgPCB0eC0+dHhfbmlvdjsgaSsrKQorCQlub2IgKz0gdHgtPnR4X2lvdltpXS5pb3ZfbGVuOwogCi0JCWZvciAobm9iID0gaSA9IDA7IGkgPCBuaW92OyBpKyspIHsKLQkJCXNjcmF0Y2hpb3ZbaV0gPSB0eC0+dHhfaW92W2ldOwotCQkJbm9iICs9IHNjcmF0Y2hpb3ZbaV0uaW92X2xlbjsKLQkJfQorCWlmICghbGlzdF9lbXB0eSgmY29ubi0+a3NuY190eF9xdWV1ZSkgfHwKKwkgICAgbm9iIDwgdHgtPnR4X3Jlc2lkKQorCQltc2cubXNnX2ZsYWdzIHw9IE1TR19NT1JFOwogCi0JCWlmICghbGlzdF9lbXB0eSgmY29ubi0+a3NuY190eF9xdWV1ZSkgfHwKLQkJICAgIG5vYiA8IHR4LT50eF9yZXNpZCkKLQkJCW1zZy5tc2dfZmxhZ3MgfD0gTVNHX01PUkU7Ci0KLQkJcmMgPSBrZXJuZWxfc2VuZG1zZyhzb2NrLCAmbXNnLCBzY3JhdGNoaW92LCBuaW92LCBub2IpOwotCX0KLQlyZXR1cm4gcmM7CisJaW92X2l0ZXJfa3ZlYygmbXNnLm1zZ19pdGVyLCBXUklURSB8IElURVJfS1ZFQywKKwkJICAgICAgdHgtPnR4X2lvdiwgdHgtPnR4X25pb3YsIG5vYik7CisJcmV0dXJuIHNvY2tfc2VuZG1zZyhzb2NrLCAmbXNnKTsKIH0KIAogaW50CkBAIC0xMjQsMjAgKzEwNiwxNiBAQAogCS8qIE5vdCBOT09QIG1lc3NhZ2UgKi8KIAlMQVNTRVJUKHR4LT50eF9sbmV0bXNnKTsKIAotCS8qCi0JICogTkIgd2UgY2FuJ3QgdHJ1c3Qgc29ja2V0IG9wcyB0byBlaXRoZXIgY29uc3VtZSBvdXIgaW92cwotCSAqIG9yIGxlYXZlIHRoZW0gYWxvbmUuCi0JICovCiAJaWYgKHR4LT50eF9tc2cua3NtX3pjX2Nvb2tpZXNbMF0pIHsKIAkJLyogWmVybyBjb3B5IGlzIGVuYWJsZWQgKi8KIAkJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0ga2lvdi0+a2lvdl9wYWdlOwotCQlpbnQgb2Zmc2V0ID0ga2lvdi0+a2lvdl9vZmZzZXQ7Ci0JCWludCBmcmFnc2l6ZSA9IGtpb3YtPmtpb3ZfbGVuOworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGtpb3YtPmJ2X3BhZ2U7CisJCWludCBvZmZzZXQgPSBraW92LT5idl9vZmZzZXQ7CisJCWludCBmcmFnc2l6ZSA9IGtpb3YtPmJ2X2xlbjsKIAkJaW50IG1zZ2ZsZyA9IE1TR19ET05UV0FJVDsKIAogCQlDREVCVUcoRF9ORVQsICJwYWdlICVwICsgb2Zmc2V0ICV4IGZvciAlZFxuIiwKLQkJICAgICAgIHBhZ2UsIG9mZnNldCwga2lvdi0+a2lvdl9sZW4pOworCQkgICAgICAgcGFnZSwgb2Zmc2V0LCBraW92LT5idl9sZW4pOwogCiAJCWlmICghbGlzdF9lbXB0eSgmY29ubi0+a3NuY190eF9xdWV1ZSkgfHwKIAkJICAgIGZyYWdzaXplIDwgdHgtPnR4X3Jlc2lkKQpAQCAtMTUwLDM0ICsxMjgsMTkgQEAKIAkJCXJjID0gdGNwX3NlbmRwYWdlKHNrLCBwYWdlLCBvZmZzZXQsIGZyYWdzaXplLCBtc2dmbGcpOwogCQl9CiAJfSBlbHNlIHsKLSNpZiBTT0NLTkFMX1NJTkdMRV9GUkFHX1RYIHx8ICFTT0NLTkFMX1JJU0tfS01BUF9ERUFETE9DSwotCQlzdHJ1Y3Qga3ZlYyBzY3JhdGNoOwotCQlzdHJ1Y3Qga3ZlYyAqc2NyYXRjaGlvdiA9ICZzY3JhdGNoOwotCQl1bnNpZ25lZCBpbnQgbmlvdiA9IDE7Ci0jZWxzZQotI2lmZGVmIENPTkZJR19ISUdITUVNCi0jd2FybmluZyAiWFhYIHJpc2sgb2Yga21hcCBkZWFkbG9jayBvbiBtdWx0aXBsZSBmcmFncy4uLiIKLSNlbmRpZgotCQlzdHJ1Y3Qga3ZlYyAqc2NyYXRjaGlvdiA9IGNvbm4tPmtzbmNfc2NoZWR1bGVyLT5rc3Nfc2NyYXRjaF9pb3Y7Ci0JCXVuc2lnbmVkIGludCBuaW92ID0gdHgtPnR4X25raW92OwotI2VuZGlmCiAJCXN0cnVjdCBtc2doZHIgbXNnID0gey5tc2dfZmxhZ3MgPSBNU0dfRE9OVFdBSVR9OwogCQlpbnQgaTsKIAotCQlmb3IgKG5vYiA9IGkgPSAwOyBpIDwgbmlvdjsgaSsrKSB7Ci0JCQlzY3JhdGNoaW92W2ldLmlvdl9iYXNlID0ga21hcChraW92W2ldLmtpb3ZfcGFnZSkgKwotCQkJCQkJIGtpb3ZbaV0ua2lvdl9vZmZzZXQ7Ci0JCQlub2IgKz0gc2NyYXRjaGlvdltpXS5pb3ZfbGVuID0ga2lvdltpXS5raW92X2xlbjsKLQkJfQorCQlmb3IgKG5vYiA9IGkgPSAwOyBpIDwgdHgtPnR4X25raW92OyBpKyspCisJCQlub2IgKz0ga2lvdltpXS5idl9sZW47CiAKIAkJaWYgKCFsaXN0X2VtcHR5KCZjb25uLT5rc25jX3R4X3F1ZXVlKSB8fAogCQkgICAgbm9iIDwgdHgtPnR4X3Jlc2lkKQogCQkJbXNnLm1zZ19mbGFncyB8PSBNU0dfTU9SRTsKIAotCQlyYyA9IGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csIChzdHJ1Y3Qga3ZlYyAqKXNjcmF0Y2hpb3YsIG5pb3YsIG5vYik7Ci0KLQkJZm9yIChpID0gMDsgaSA8IG5pb3Y7IGkrKykKLQkJCWt1bm1hcChraW92W2ldLmtpb3ZfcGFnZSk7CisJCWlvdl9pdGVyX2J2ZWMoJm1zZy5tc2dfaXRlciwgV1JJVEUgfCBJVEVSX0JWRUMsCisJCQkgICAgICBraW92LCB0eC0+dHhfbmtpb3YsIG5vYik7CisJCXJjID0gc29ja19zZW5kbXNnKHNvY2ssICZtc2cpOwogCX0KIAlyZXR1cm4gcmM7CiB9CkBAIC0yMDEsMTQgKzE2NCw3IEBACiBpbnQKIGtzb2NrbmFsX2xpYl9yZWN2X2lvdihzdHJ1Y3Qga3NvY2tfY29ubiAqY29ubikKIHsKLSNpZiBTT0NLTkFMX1NJTkdMRV9GUkFHX1JYCi0Jc3RydWN0IGt2ZWMgc2NyYXRjaDsKLQlzdHJ1Y3Qga3ZlYyAqc2NyYXRjaGlvdiA9ICZzY3JhdGNoOwotCXVuc2lnbmVkIGludCBuaW92ID0gMTsKLSNlbHNlCi0Jc3RydWN0IGt2ZWMgKnNjcmF0Y2hpb3YgPSBjb25uLT5rc25jX3NjaGVkdWxlci0+a3NzX3NjcmF0Y2hfaW92OwogCXVuc2lnbmVkIGludCBuaW92ID0gY29ubi0+a3NuY19yeF9uaW92OwotI2VuZGlmCiAJc3RydWN0IGt2ZWMgKmlvdiA9IGNvbm4tPmtzbmNfcnhfaW92OwogCXN0cnVjdCBtc2doZHIgbXNnID0gewogCQkubXNnX2ZsYWdzID0gMApAQCAtMjIwLDIwICsxNzYsMTUgQEAKIAlpbnQgc3VtOwogCV9fdTMyIHNhdmVkX2NzdW07CiAKLQkvKgotCSAqIE5CIHdlIGNhbid0IHRydXN0IHNvY2tldCBvcHMgdG8gZWl0aGVyIGNvbnN1bWUgb3VyIGlvdnMKLQkgKiBvciBsZWF2ZSB0aGVtIGFsb25lLgotCSAqLwogCUxBU1NFUlQobmlvdiA+IDApOwogCi0JZm9yIChub2IgPSBpID0gMDsgaSA8IG5pb3Y7IGkrKykgewotCQlzY3JhdGNoaW92W2ldID0gaW92W2ldOwotCQlub2IgKz0gc2NyYXRjaGlvdltpXS5pb3ZfbGVuOwotCX0KKwlmb3IgKG5vYiA9IGkgPSAwOyBpIDwgbmlvdjsgaSsrKQorCQlub2IgKz0gaW92W2ldLmlvdl9sZW47CisKIAlMQVNTRVJUKG5vYiA8PSBjb25uLT5rc25jX3J4X25vYl93YW50ZWQpOwogCi0JcmMgPSBrZXJuZWxfcmVjdm1zZyhjb25uLT5rc25jX3NvY2ssICZtc2csIHNjcmF0Y2hpb3YsIG5pb3YsIG5vYiwKLQkJCSAgICBNU0dfRE9OVFdBSVQpOworCWlvdl9pdGVyX2t2ZWMoJm1zZy5tc2dfaXRlciwgUkVBRCB8IElURVJfS1ZFQywgaW92LCBuaW92LCBub2IpOworCXJjID0gc29ja19yZWN2bXNnKGNvbm4tPmtzbmNfc29jaywgJm1zZywgTVNHX0RPTlRXQUlUKTsKIAogCXNhdmVkX2NzdW0gPSAwOwogCWlmIChjb25uLT5rc25jX3Byb3RvID09ICZrc29ja25hbF9wcm90b2NvbF92MngpIHsKQEAgLTI1OSw2NyArMjEwLDEwIEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZAota3NvY2tuYWxfbGliX2tpb3ZfdnVubWFwKHZvaWQgKmFkZHIpCi17Ci0JaWYgKCFhZGRyKQotCQlyZXR1cm47Ci0KLQl2dW5tYXAoYWRkcik7Ci19Ci0KLXN0YXRpYyB2b2lkICoKLWtzb2NrbmFsX2xpYl9raW92X3ZtYXAobG5ldF9raW92X3QgKmtpb3YsIGludCBuaW92LAotCQkgICAgICAgc3RydWN0IGt2ZWMgKmlvdiwgc3RydWN0IHBhZ2UgKipwYWdlcykKLXsKLQl2b2lkICphZGRyOwotCWludCBub2I7Ci0JaW50IGk7Ci0KLQlpZiAoISprc29ja25hbF90dW5hYmxlcy5rc25kX3pjX3JlY3YgfHwgIXBhZ2VzKQotCQlyZXR1cm4gTlVMTDsKLQotCUxBU1NFUlQobmlvdiA8PSBMTkVUX01BWF9JT1YpOwotCi0JaWYgKG5pb3YgPCAyIHx8Ci0JICAgIG5pb3YgPCAqa3NvY2tuYWxfdHVuYWJsZXMua3NuZF96Y19yZWN2X21pbl9uZnJhZ3MpCi0JCXJldHVybiBOVUxMOwotCi0JZm9yIChub2IgPSBpID0gMDsgaSA8IG5pb3Y7IGkrKykgewotCQlpZiAoKGtpb3ZbaV0ua2lvdl9vZmZzZXQgJiYgaSA+IDApIHx8Ci0JCSAgICAoa2lvdltpXS5raW92X29mZnNldCArIGtpb3ZbaV0ua2lvdl9sZW4gIT0gUEFHRV9TSVpFICYmIGkgPCBuaW92IC0gMSkpCi0JCQlyZXR1cm4gTlVMTDsKLQotCQlwYWdlc1tpXSA9IGtpb3ZbaV0ua2lvdl9wYWdlOwotCQlub2IgKz0ga2lvdltpXS5raW92X2xlbjsKLQl9Ci0KLQlhZGRyID0gdm1hcChwYWdlcywgbmlvdiwgVk1fTUFQLCBQQUdFX0tFUk5FTCk7Ci0JaWYgKCFhZGRyKQotCQlyZXR1cm4gTlVMTDsKLQotCWlvdi0+aW92X2Jhc2UgPSBhZGRyICsga2lvdlswXS5raW92X29mZnNldDsKLQlpb3YtPmlvdl9sZW4gPSBub2I7Ci0KLQlyZXR1cm4gYWRkcjsKLX0KLQogaW50CiBrc29ja25hbF9saWJfcmVjdl9raW92KHN0cnVjdCBrc29ja19jb25uICpjb25uKQogewotI2lmIFNPQ0tOQUxfU0lOR0xFX0ZSQUdfUlggfHwgIVNPQ0tOQUxfUklTS19LTUFQX0RFQURMT0NLCi0Jc3RydWN0IGt2ZWMgc2NyYXRjaDsKLQlzdHJ1Y3Qga3ZlYyAqc2NyYXRjaGlvdiA9ICZzY3JhdGNoOwotCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBOVUxMOwotCXVuc2lnbmVkIGludCBuaW92ID0gMTsKLSNlbHNlCi0jaWZkZWYgQ09ORklHX0hJR0hNRU0KLSN3YXJuaW5nICJYWFggcmlzayBvZiBrbWFwIGRlYWRsb2NrIG9uIG11bHRpcGxlIGZyYWdzLi4uIgotI2VuZGlmCi0Jc3RydWN0IGt2ZWMgKnNjcmF0Y2hpb3YgPSBjb25uLT5rc25jX3NjaGVkdWxlci0+a3NzX3NjcmF0Y2hfaW92OwotCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBjb25uLT5rc25jX3NjaGVkdWxlci0+a3NzX3J4X3NjcmF0Y2hfcGdzOwogCXVuc2lnbmVkIGludCBuaW92ID0gY29ubi0+a3NuY19yeF9ua2lvdjsKLSNlbmRpZgogCWxuZXRfa2lvdl90ICAgKmtpb3YgPSBjb25uLT5rc25jX3J4X2tpb3Y7CiAJc3RydWN0IG1zZ2hkciBtc2cgPSB7CiAJCS5tc2dfZmxhZ3MgPSAwCkBAIC0zMjgsNjMgKzIyMiwzMiBAQAogCWludCBpOwogCWludCByYzsKIAl2b2lkICpiYXNlOwotCXZvaWQgKmFkZHI7CiAJaW50IHN1bTsKIAlpbnQgZnJhZ25vYjsKLQlpbnQgbjsKIAotCS8qCi0JICogTkIgd2UgY2FuJ3QgdHJ1c3Qgc29ja2V0IG9wcyB0byBlaXRoZXIgY29uc3VtZSBvdXIgaW92cwotCSAqIG9yIGxlYXZlIHRoZW0gYWxvbmUuCi0JICovCi0JYWRkciA9IGtzb2NrbmFsX2xpYl9raW92X3ZtYXAoa2lvdiwgbmlvdiwgc2NyYXRjaGlvdiwgcGFnZXMpOwotCWlmIChhZGRyKSB7Ci0JCW5vYiA9IHNjcmF0Y2hpb3ZbMF0uaW92X2xlbjsKLQkJbiA9IDE7Ci0KLQl9IGVsc2UgewotCQlmb3IgKG5vYiA9IGkgPSAwOyBpIDwgbmlvdjsgaSsrKSB7Ci0JCQlub2IgKz0gc2NyYXRjaGlvdltpXS5pb3ZfbGVuID0ga2lvdltpXS5raW92X2xlbjsKLQkJCXNjcmF0Y2hpb3ZbaV0uaW92X2Jhc2UgPSBrbWFwKGtpb3ZbaV0ua2lvdl9wYWdlKSArCi0JCQkJCQkga2lvdltpXS5raW92X29mZnNldDsKLQkJfQotCQluID0gbmlvdjsKLQl9CisJZm9yIChub2IgPSBpID0gMDsgaSA8IG5pb3Y7IGkrKykKKwkJbm9iICs9IGtpb3ZbaV0uYnZfbGVuOwogCiAJTEFTU0VSVChub2IgPD0gY29ubi0+a3NuY19yeF9ub2Jfd2FudGVkKTsKIAotCXJjID0ga2VybmVsX3JlY3Ztc2coY29ubi0+a3NuY19zb2NrLCAmbXNnLCAoc3RydWN0IGt2ZWMgKilzY3JhdGNoaW92LAotCQkJICAgIG4sIG5vYiwgTVNHX0RPTlRXQUlUKTsKKwlpb3ZfaXRlcl9idmVjKCZtc2cubXNnX2l0ZXIsIFJFQUQgfCBJVEVSX0JWRUMsIGtpb3YsIG5pb3YsIG5vYik7CisJcmMgPSBzb2NrX3JlY3Ztc2coY29ubi0+a3NuY19zb2NrLCAmbXNnLCBNU0dfRE9OVFdBSVQpOwogCiAJaWYgKGNvbm4tPmtzbmNfbXNnLmtzbV9jc3VtKSB7CiAJCWZvciAoaSA9IDAsIHN1bSA9IHJjOyBzdW0gPiAwOyBpKyssIHN1bSAtPSBmcmFnbm9iKSB7CiAJCQlMQVNTRVJUKGkgPCBuaW92KTsKIAotCQkJLyoKLQkJCSAqIERhbmchIGhhdmUgdG8ga21hcCBhZ2FpbiBiZWNhdXNlIEkgaGF2ZSBub3doZXJlIHRvCi0JCQkgKiBzdGFzaCB0aGUgbWFwcGVkIGFkZHJlc3MuICBCdXQgYnkgZG9pbmcgaXQgd2hpbGUgdGhlCi0JCQkgKiBwYWdlIGlzIHN0aWxsIG1hcHBlZCwgdGhlIGtlcm5lbCBqdXN0IGJ1bXBzIHRoZSBtYXAKLQkJCSAqIGNvdW50IGFuZCByZXR1cm5zIG1lIHRoZSBhZGRyZXNzIGl0IHN0YXNoZWQuCi0JCQkgKi8KLQkJCWJhc2UgPSBrbWFwKGtpb3ZbaV0ua2lvdl9wYWdlKSArIGtpb3ZbaV0ua2lvdl9vZmZzZXQ7Ci0JCQlmcmFnbm9iID0ga2lvdltpXS5raW92X2xlbjsKKwkJCWJhc2UgPSBrbWFwKGtpb3ZbaV0uYnZfcGFnZSkgKyBraW92W2ldLmJ2X29mZnNldDsKKwkJCWZyYWdub2IgPSBraW92W2ldLmJ2X2xlbjsKIAkJCWlmIChmcmFnbm9iID4gc3VtKQogCQkJCWZyYWdub2IgPSBzdW07CiAKIAkJCWNvbm4tPmtzbmNfcnhfY3N1bSA9IGtzb2NrbmFsX2NzdW0oY29ubi0+a3NuY19yeF9jc3VtLAogCQkJCQkJCSAgIGJhc2UsIGZyYWdub2IpOwogCi0JCQlrdW5tYXAoa2lvdltpXS5raW92X3BhZ2UpOworCQkJa3VubWFwKGtpb3ZbaV0uYnZfcGFnZSk7CiAJCX0KIAl9Ci0KLQlpZiAoYWRkcikgewotCQlrc29ja25hbF9saWJfa2lvdl92dW5tYXAoYWRkcik7Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IG5pb3Y7IGkrKykKLQkJCWt1bm1hcChraW92W2ldLmtpb3ZfcGFnZSk7Ci0JfQotCiAJcmV0dXJuIHJjOwogfQogCkBAIC00MDYsMTIgKzI2OSwxMiBAQAogCiAJaWYgKHR4LT50eF9raW92KSB7CiAJCWZvciAoaSA9IDA7IGkgPCB0eC0+dHhfbmtpb3Y7IGkrKykgewotCQkJYmFzZSA9IGttYXAodHgtPnR4X2tpb3ZbaV0ua2lvdl9wYWdlKSArCi0JCQkgICAgICAgdHgtPnR4X2tpb3ZbaV0ua2lvdl9vZmZzZXQ7CisJCQliYXNlID0ga21hcCh0eC0+dHhfa2lvdltpXS5idl9wYWdlKSArCisJCQkgICAgICAgdHgtPnR4X2tpb3ZbaV0uYnZfb2Zmc2V0OwogCi0JCQljc3VtID0ga3NvY2tuYWxfY3N1bShjc3VtLCBiYXNlLCB0eC0+dHhfa2lvdltpXS5raW92X2xlbik7CisJCQljc3VtID0ga3NvY2tuYWxfY3N1bShjc3VtLCBiYXNlLCB0eC0+dHhfa2lvdltpXS5idl9sZW4pOwogCi0JCQlrdW5tYXAodHgtPnR4X2tpb3ZbaV0ua2lvdl9wYWdlKTsKKwkJCWt1bm1hcCh0eC0+dHhfa2lvdltpXS5idl9wYWdlKTsKIAkJfQogCX0gZWxzZSB7CiAJCWZvciAoaSA9IDE7IGkgPCB0eC0+dHhfbmlvdjsgaSsrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xpYmNmcy9kZWJ1Zy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xpYmNmcy9kZWJ1Zy5jCmluZGV4IDQyYjE1YTcuLjIzYjM2YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9saWJjZnMvZGVidWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbGliY2ZzL2RlYnVnLmMKQEAgLTMyOCwxNSArMzI4LDIwIEBACiAgKi8KIHZvaWQgbGliY2ZzX2RlYnVnX2R1bXBsb2dfaW50ZXJuYWwodm9pZCAqYXJnKQogeworCXN0YXRpYyB0aW1lNjRfdCBsYXN0X2R1bXBfdGltZTsKKwl0aW1lNjRfdCBjdXJyZW50X3RpbWU7CiAJdm9pZCAqam91cm5hbF9pbmZvOwogCiAJam91cm5hbF9pbmZvID0gY3VycmVudC0+am91cm5hbF9pbmZvOwogCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IE5VTEw7CisJY3VycmVudF90aW1lID0ga3RpbWVfZ2V0X3JlYWxfc2Vjb25kcygpOwogCi0JaWYgKHN0cm5jbXAobGliY2ZzX2RlYnVnX2ZpbGVfcGF0aF9hcnIsICJOT05FIiwgNCkgIT0gMCkgeworCWlmIChzdHJuY21wKGxpYmNmc19kZWJ1Z19maWxlX3BhdGhfYXJyLCAiTk9ORSIsIDQpICYmCisJICAgIGN1cnJlbnRfdGltZSA+IGxhc3RfZHVtcF90aW1lKSB7CisJCWxhc3RfZHVtcF90aW1lID0gY3VycmVudF90aW1lOwogCQlzbnByaW50ZihkZWJ1Z19maWxlX25hbWUsIHNpemVvZihkZWJ1Z19maWxlX25hbWUpIC0gMSwKIAkJCSAiJXMuJWxsZC4lbGQiLCBsaWJjZnNfZGVidWdfZmlsZV9wYXRoX2FyciwKLQkJCSAoczY0KWt0aW1lX2dldF9yZWFsX3NlY29uZHMoKSwgKGxvbmdfcHRyX3QpYXJnKTsKKwkJCSAoczY0KWN1cnJlbnRfdGltZSwgKGxvbmdfcHRyX3QpYXJnKTsKIAkJcHJfYWxlcnQoIkx1c3RyZUVycm9yOiBkdW1waW5nIGxvZyB0byAlc1xuIiwgZGVidWdfZmlsZV9uYW1lKTsKIAkJY2ZzX3RyYWNlZmlsZV9kdW1wX2FsbF9wYWdlcyhkZWJ1Z19maWxlX25hbWUpOwogCQlsaWJjZnNfcnVuX2RlYnVnX2xvZ191cGNhbGwoZGVidWdfZmlsZV9uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9saWJjZnMvZmFpbC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xpYmNmcy9mYWlsLmMKaW5kZXggOTI4OGVlMC4uZTRiMWEwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xpYmNmcy9mYWlsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xpYmNmcy9mYWlsLmMKQEAgLTkwLDggKzkwLDEwIEBACiAJCX0KIAl9CiAKLQlpZiAoKHNldCA9PSBDRlNfRkFJTF9MT0NfT1JTRVQgfHwgc2V0ID09IENGU19GQUlMX0xPQ19SRVNFVCkgJiYKLQkgICAgKHZhbHVlICYgQ0ZTX0ZBSUxfT05DRSkpCisJLyogVGFrZSBpbnRvIGFjY291bnQgdGhlIGN1cnJlbnQgY2FsbCBmb3IgRkFJTF9PTkNFIGZvciBPUlNFVCBvbmx5LAorCSAqIGFzIFJFU0VUIGlzIGEgbmV3IGZhaWxfbG9jLCBpdCBkb2VzIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnQgY2FsbAorCSAqLworCWlmICgoc2V0ID09IENGU19GQUlMX0xPQ19PUlNFVCkgJiYgKHZhbHVlICYgQ0ZTX0ZBSUxfT05DRSkpCiAJCXNldF9iaXQoQ0ZTX0ZBSUxfT05DRV9CSVQsICZjZnNfZmFpbF9sb2MpOwogCS8qIExvc3QgcmFjZSB0byBzZXQgQ0ZTX0ZBSUxFRF9CSVQuICovCiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoQ0ZTX0ZBSUxFRF9CSVQsICZjZnNfZmFpbF9sb2MpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbGliY2ZzL2xpYmNmc19zdHJpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9saWJjZnMvbGliY2ZzX3N0cmluZy5jCmluZGV4IGZjNjk3Y2QuLjU2YTYxNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9saWJjZnMvbGliY2ZzX3N0cmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9saWJjZnMvbGliY2ZzX3N0cmluZy5jCkBAIC0yMjksOCArMjI5LDYgQEAKIAljaGFyICplbmRwLCBjYWNoZTsKIAlpbnQgcmM7CiAKLQlzdHIgPSBjZnNfdHJpbXdoaXRlKHN0cik7Ci0KIAkvKioKIAkgKiBrc3Ryb3VpbnQgY2FuIG9ubHkgaGFuZGxlIHN0cmluZ3MgY29tcG9zZWQKIAkgKiBvZiBvbmx5IG51bWJlcnMuIFdlIG5lZWQgdG8gc2NhbiB0aGUgc3RyaW5nCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbGliY2ZzL2xpbnV4L2xpbnV4LWNwdS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xpYmNmcy9saW51eC9saW51eC1jcHUuYwppbmRleCBiNTI1MThjNS4uZThiMWE2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xpYmNmcy9saW51eC9saW51eC1jcHUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbGliY2ZzL2xpbnV4L2xpbnV4LWNwdS5jCkBAIC03NCw2ICs3NCwxNyBAQAogCiBzdGF0aWMgc3RydWN0IGNmc19jcHRfZGF0YQljcHRfZGF0YTsKIAorc3RhdGljIHZvaWQKK2Nmc19ub2RlX3RvX2NwdW1hc2soaW50IG5vZGUsIGNwdW1hc2tfdCAqbWFzaykKK3sKKwljb25zdCBjcHVtYXNrX3QgKnRtcCA9IGNwdW1hc2tfb2Zfbm9kZShub2RlKTsKKworCWlmICh0bXApCisJCWNwdW1hc2tfY29weShtYXNrLCB0bXApOworCWVsc2UKKwkJY3B1bWFza19jbGVhcihtYXNrKTsKK30KKwogdm9pZAogY2ZzX2NwdF90YWJsZV9mcmVlKHN0cnVjdCBjZnNfY3B0X3RhYmxlICpjcHRhYikKIHsKQEAgLTQwMyw3ICs0MTQsNyBAQAogCW11dGV4X2xvY2soJmNwdF9kYXRhLmNwdF9tdXRleCk7CiAKIAltYXNrID0gY3B0X2RhdGEuY3B0X2NwdW1hc2s7Ci0JY3B1bWFza19jb3B5KG1hc2ssIGNwdW1hc2tfb2Zfbm9kZShub2RlKSk7CisJY2ZzX25vZGVfdG9fY3B1bWFzayhub2RlLCBtYXNrKTsKIAogCXJjID0gY2ZzX2NwdF9zZXRfY3B1bWFzayhjcHRhYiwgY3B0LCBtYXNrKTsKIApAQCAtNDI3LDcgKzQzOCw3IEBACiAJbXV0ZXhfbG9jaygmY3B0X2RhdGEuY3B0X211dGV4KTsKIAogCW1hc2sgPSBjcHRfZGF0YS5jcHRfY3B1bWFzazsKLQljcHVtYXNrX2NvcHkobWFzaywgY3B1bWFza19vZl9ub2RlKG5vZGUpKTsKKwljZnNfbm9kZV90b19jcHVtYXNrKG5vZGUsIG1hc2spOwogCiAJY2ZzX2NwdF91bnNldF9jcHVtYXNrKGNwdGFiLCBjcHQsIG1hc2spOwogCkBAIC03NDksNyArNzYwLDcgQEAKIAl9CiAKIAlmb3JfZWFjaF9vbmxpbmVfbm9kZShpKSB7Ci0JCWNwdW1hc2tfY29weShtYXNrLCBjcHVtYXNrX29mX25vZGUoaSkpOworCQljZnNfbm9kZV90b19jcHVtYXNrKGksIG1hc2spOwogCiAJCXdoaWxlICghY3B1bWFza19lbXB0eShtYXNrKSkgewogCQkJc3RydWN0IGNmc19jcHVfcGFydGl0aW9uICpwYXJ0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xpYmNmcy9saW51eC9saW51eC1jcnlwdG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9saWJjZnMvbGludXgvbGludXgtY3J5cHRvLmMKaW5kZXggNWMwMTE2YS4uN2Y1NmQyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xpYmNmcy9saW51eC9saW51eC1jcnlwdG8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbGliY2ZzL2xpbnV4L2xpbnV4LWNyeXB0by5jCkBAIC05NSw4ICs5NSw4IEBACiAJCWVyciA9IGNyeXB0b19haGFzaF9zZXRrZXkodGZtLCBrZXksIGtleV9sZW4pOwogCWVsc2UgaWYgKCgqdHlwZSktPmNodF9rZXkgIT0gMCkKIAkJZXJyID0gY3J5cHRvX2FoYXNoX3NldGtleSh0Zm0sCi0JCQkJCSAodW5zaWduZWQgY2hhciAqKSYoKCp0eXBlKS0+Y2h0X2tleSksCi0JCQkJCSAoKnR5cGUpLT5jaHRfc2l6ZSk7CisJCQkJCSAgKHVuc2lnbmVkIGNoYXIgKikmKCgqdHlwZSktPmNodF9rZXkpLAorCQkJCQkgICgqdHlwZSktPmNodF9zaXplKTsKIAogCWlmIChlcnIgIT0gMCkgewogCQlhaGFzaF9yZXF1ZXN0X2ZyZWUoKnJlcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9hcGktbmkuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2FwaS1uaS5jCmluZGV4IDM0NmRiODkuLjRkYWY4MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2FwaS1uaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2FwaS1uaS5jCkBAIC0xMjg2LDYgKzEyODYsMjUgQEAKIAkJICAgICAgIHNpemVvZigqbmktPm5pX2xuZF90dW5hYmxlcykpOwogCX0KIAorCS8qCisJICogSWYgZ2l2ZW4gc29tZSBMTkQgdHVuYWJsZSBwYXJhbWV0ZXJzLCBwYXJzZSB0aG9zZSBub3cgdG8KKwkgKiBvdmVycmlkZSB0aGUgdmFsdWVzIGluIHRoZSBOSSBzdHJ1Y3R1cmUuCisJICovCisJaWYgKGNvbmYpIHsKKwkJaWYgKGNvbmYtPmNmZ19jb25maWdfdS5jZmdfbmV0Lm5ldF9wZWVyX3J0cl9jcmVkaXRzID49IDApCisJCQluaS0+bmlfcGVlcnJ0cmNyZWRpdHMgPQorCQkJCWNvbmYtPmNmZ19jb25maWdfdS5jZmdfbmV0Lm5ldF9wZWVyX3J0cl9jcmVkaXRzOworCQlpZiAoY29uZi0+Y2ZnX2NvbmZpZ191LmNmZ19uZXQubmV0X3BlZXJfdGltZW91dCA+PSAwKQorCQkJbmktPm5pX3BlZXJ0aW1lb3V0ID0KKwkJCQljb25mLT5jZmdfY29uZmlnX3UuY2ZnX25ldC5uZXRfcGVlcl90aW1lb3V0OworCQlpZiAoY29uZi0+Y2ZnX2NvbmZpZ191LmNmZ19uZXQubmV0X3BlZXJfdHhfY3JlZGl0cyAhPSAtMSkKKwkJCW5pLT5uaV9wZWVydHhjcmVkaXRzID0KKwkJCQljb25mLT5jZmdfY29uZmlnX3UuY2ZnX25ldC5uZXRfcGVlcl90eF9jcmVkaXRzOworCQlpZiAoY29uZi0+Y2ZnX2NvbmZpZ191LmNmZ19uZXQubmV0X21heF90eF9jcmVkaXRzID49IDApCisJCQluaS0+bmlfbWF4dHhjcmVkaXRzID0KKwkJCQljb25mLT5jZmdfY29uZmlnX3UuY2ZnX25ldC5uZXRfbWF4X3R4X2NyZWRpdHM7CisJfQorCiAJcmMgPSBsbmQtPmxuZF9zdGFydHVwKG5pKTsKIAogCW11dGV4X3VubG9jaygmdGhlX2xuZXQubG5fbG5kX211dGV4KTsKQEAgLTEyOTksMzMgKzEzMTgsNiBAQAogCQlnb3RvIGZhaWxlZDA7CiAJfQogCi0JLyoKLQkgKiBJZiBnaXZlbiBzb21lIExORCB0dW5hYmxlIHBhcmFtZXRlcnMsIHBhcnNlIHRob3NlIG5vdyB0bwotCSAqIG92ZXJyaWRlIHRoZSB2YWx1ZXMgaW4gdGhlIE5JIHN0cnVjdHVyZS4KLQkgKi8KLQlpZiAoY29uZiAmJiBjb25mLT5jZmdfY29uZmlnX3UuY2ZnX25ldC5uZXRfcGVlcl9ydHJfY3JlZGl0cyA+PSAwKSB7Ci0JCW5pLT5uaV9wZWVycnRyY3JlZGl0cyA9Ci0JCQljb25mLT5jZmdfY29uZmlnX3UuY2ZnX25ldC5uZXRfcGVlcl9ydHJfY3JlZGl0czsKLQl9Ci0JaWYgKGNvbmYgJiYgY29uZi0+Y2ZnX2NvbmZpZ191LmNmZ19uZXQubmV0X3BlZXJfdGltZW91dCA+PSAwKSB7Ci0JCW5pLT5uaV9wZWVydGltZW91dCA9Ci0JCQljb25mLT5jZmdfY29uZmlnX3UuY2ZnX25ldC5uZXRfcGVlcl90aW1lb3V0OwotCX0KLQkvKgotCSAqIFRPRE8KLQkgKiBOb3RlOiBGb3Igbm93LCBkb24ndCBhbGxvdyB0aGUgdXNlciB0byBjaGFuZ2UKLQkgKiBwZWVydHhjcmVkaXRzIGFzIHRoaXMgbnVtYmVyIGlzIHVzZWQgaW4gdGhlCi0JICogSUIgTE5EIHRvIGNvbnRyb2wgcXVldWUgZGVwdGguCi0JICoKLQkgKiBpZiAoY29uZiAmJiBjb25mLT5jZmdfY29uZmlnX3UuY2ZnX25ldC5uZXRfcGVlcl90eF9jcmVkaXRzICE9IC0xKQotCSAqCW5pLT5uaV9wZWVydHhjcmVkaXRzID0KLQkgKgkJY29uZi0+Y2ZnX2NvbmZpZ191LmNmZ19uZXQubmV0X3BlZXJfdHhfY3JlZGl0czsKLQkgKi8KLQlpZiAoY29uZiAmJiBjb25mLT5jZmdfY29uZmlnX3UuY2ZnX25ldC5uZXRfbWF4X3R4X2NyZWRpdHMgPj0gMCkgewotCQluaS0+bmlfbWF4dHhjcmVkaXRzID0KLQkJCWNvbmYtPmNmZ19jb25maWdfdS5jZmdfbmV0Lm5ldF9tYXhfdHhfY3JlZGl0czsKLQl9Ci0KIAlMQVNTRVJUKG5pLT5uaV9wZWVydGltZW91dCA8PSAwIHx8IGxuZC0+bG5kX3F1ZXJ5KTsKIAogCWxuZXRfbmV0X2xvY2soTE5FVF9MT0NLX0VYKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2NvbmZpZy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvY29uZmlnLmMKaW5kZXggYTcyYWZkZi4uOWUyMTgzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvY29uZmlnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvY29uZmlnLmMKQEAgLTMxLDYgKzMxLDggQEAKICAqLwogCiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xORVQKKyNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CisjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLWxuZXQuaCIKIAogc3RydWN0IGxuZXRfdGV4dF9idWYgewkgICAgLyogdG1wIHN0cnVjdCBmb3IgcGFyc2luZyByb3V0ZXMgKi8KQEAgLTExMCw2ICsxMTIsMTEgQEAKIAkJTElCQ0ZTX0ZSRUUobmktPm5pX2ludGVyZmFjZXNbaV0sCiAJCQkgICAgc3RybGVuKG5pLT5uaV9pbnRlcmZhY2VzW2ldKSArIDEpOwogCX0KKworCS8qIHJlbGVhc2UgcmVmZXJlbmNlIHRvIG5ldCBuYW1lc3BhY2UgKi8KKwlpZiAobmktPm5pX25ldF9ucykKKwkJcHV0X25ldChuaS0+bmlfbmV0X25zKTsKKwogCUxJQkNGU19GUkVFKG5pLCBzaXplb2YoKm5pKSk7CiB9CiAKQEAgLTE3MSw2ICsxNzgsMTMgQEAKIAogCS8qIExORCB3aWxsIGZpbGwgaW4gdGhlIGFkZHJlc3MgcGFydCBvZiB0aGUgTklEICovCiAJbmktPm5pX25pZCA9IExORVRfTUtOSUQobmV0LCAwKTsKKworCS8qIFN0b3JlIG5ldCBuYW1lc3BhY2UgaW4gd2hpY2ggY3VycmVudCBuaSBpcyBiZWluZyBjcmVhdGVkICovCisJaWYgKGN1cnJlbnQtPm5zcHJveHktPm5ldF9ucykKKwkJbmktPm5pX25ldF9ucyA9IGdldF9uZXQoY3VycmVudC0+bnNwcm94eS0+bmV0X25zKTsKKwllbHNlCisJCW5pLT5uaV9uZXRfbnMgPSBOVUxMOworCiAJbmktPm5pX2xhc3RfYWxpdmUgPSBrdGltZV9nZXRfcmVhbF9zZWNvbmRzKCk7CiAJbGlzdF9hZGRfdGFpbCgmbmktPm5pX2xpc3QsIG5pbGlzdCk7CiAJcmV0dXJuIG5pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLW1kLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItbWQuYwppbmRleCAxODM0YmY3Li5lYWI1M2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItbWQuYwpAQCAtMTM0LDExICsxMzQsMTEgQEAKIAogCQlmb3IgKGkgPSAwOyBpIDwgKGludCluaW92OyBpKyspIHsKIAkJCS8qIFdlIHRha2UgdGhlIHBhZ2UgcG9pbnRlciBvbiB0cnVzdCAqLwotCQkJaWYgKGxtZC0+bWRfaW92Lmtpb3ZbaV0ua2lvdl9vZmZzZXQgKwotCQkJICAgIGxtZC0+bWRfaW92Lmtpb3ZbaV0ua2lvdl9sZW4gPiBQQUdFX1NJWkUpCisJCQlpZiAobG1kLT5tZF9pb3Yua2lvdltpXS5idl9vZmZzZXQgKworCQkJICAgIGxtZC0+bWRfaW92Lmtpb3ZbaV0uYnZfbGVuID4gUEFHRV9TSVpFKQogCQkJCXJldHVybiAtRUlOVkFMOyAvKiBpbnZhbGlkIGxlbmd0aCAqLwogCi0JCQl0b3RhbF9sZW5ndGggKz0gbG1kLT5tZF9pb3Yua2lvdltpXS5raW92X2xlbjsKKwkJCXRvdGFsX2xlbmd0aCArPSBsbWQtPm1kX2lvdi5raW92W2ldLmJ2X2xlbjsKIAkJfQogCiAJCWxtZC0+bWRfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOwpAQCAtMjkyLDExICsyOTIsMTIgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlyYyA9IGxuZXRfbWRfYnVpbGQobWQsICZ1bWQsIHVubGluayk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9mcmVlOworCiAJY3B0ID0gbG5ldF9jcHRfb2ZfY29va2llKG1laC5jb29raWUpOwogCiAJbG5ldF9yZXNfbG9jayhjcHQpOwotCWlmIChyYykKLQkJZ290byBmYWlsZWQ7CiAKIAltZSA9IGxuZXRfaGFuZGxlMm1lKCZtZWgpOwogCWlmICghbWUpCkBAIC0zMDcsNyArMzA4LDcgQEAKIAkJcmMgPSBsbmV0X21kX2xpbmsobWQsIHVtZC5lcV9oYW5kbGUsIGNwdCk7CiAKIAlpZiAocmMpCi0JCWdvdG8gZmFpbGVkOworCQlnb3RvIG91dF91bmxvY2s7CiAKIAkvKgogCSAqIGF0dGFjaCB0aGlzIE1EIHRvIHBvcnRhbCBvZiBNRSBhbmQgY2hlY2sgaWYgaXQgbWF0Y2hlcyBhbnkKQEAgLTMyNCwxMCArMzI1LDEwIEBACiAKIAlyZXR1cm4gMDsKIAotIGZhaWxlZDoKLQlsbmV0X21kX2ZyZWUobWQpOwotCitvdXRfdW5sb2NrOgogCWxuZXRfcmVzX3VubG9jayhjcHQpOworb3V0X2ZyZWU6CisJbG5ldF9tZF9mcmVlKG1kKTsKIAlyZXR1cm4gcmM7CiB9CiBFWFBPUlRfU1lNQk9MKExOZXRNREF0dGFjaCk7CkBAIC0zNzAsMjQgKzM3MSwyNSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXJjID0gbG5ldF9tZF9idWlsZChtZCwgJnVtZCwgdW5saW5rKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2ZyZWU7CiAKIAljcHQgPSBsbmV0X3Jlc19sb2NrX2N1cnJlbnQoKTsKLQlpZiAocmMpCi0JCWdvdG8gZmFpbGVkOwogCiAJcmMgPSBsbmV0X21kX2xpbmsobWQsIHVtZC5lcV9oYW5kbGUsIGNwdCk7CiAJaWYgKHJjKQotCQlnb3RvIGZhaWxlZDsKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJbG5ldF9tZDJoYW5kbGUoaGFuZGxlLCBtZCk7CiAKIAlsbmV0X3Jlc191bmxvY2soY3B0KTsKIAlyZXR1cm4gMDsKIAotIGZhaWxlZDoKK291dF91bmxvY2s6CisJbG5ldF9yZXNfdW5sb2NrKGNwdCk7CitvdXRfZnJlZToKIAlsbmV0X21kX2ZyZWUobWQpOwogCi0JbG5ldF9yZXNfdW5sb2NrKGNwdCk7CiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTChMTmV0TURCaW5kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1tb3ZlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItbW92ZS5jCmluZGV4IGU2ZDNiODAuLjQ4ZTZmOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1tb3ZlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLW1vdmUuYwpAQCAtMzcsNiArMzcsOCBAQAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTkVUCiAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLWxuZXQuaCIKKyNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CisjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KIAogc3RhdGljIGludCBsb2NhbF9uaWRfZGlzdF96ZXJvID0gMTsKIG1vZHVsZV9wYXJhbShsb2NhbF9uaWRfZGlzdF96ZXJvLCBpbnQsIDA0NDQpOwpAQCAtMTY2LDI1ICsxNjgsMTcgQEAKIEVYUE9SVF9TWU1CT0wobG5ldF9pb3Zfbm9iKTsKIAogdm9pZAotbG5ldF9jb3B5X2lvdjJpb3YodW5zaWduZWQgaW50IG5kaW92LCBzdHJ1Y3Qga3ZlYyAqZGlvdiwgdW5zaWduZWQgaW50IGRvZmZzZXQsCi0JCSAgdW5zaWduZWQgaW50IG5zaW92LCBzdHJ1Y3Qga3ZlYyAqc2lvdiwgdW5zaWduZWQgaW50IHNvZmZzZXQsCi0JCSAgdW5zaWduZWQgaW50IG5vYikKK2xuZXRfY29weV9pb3YyaXRlcihzdHJ1Y3QgaW92X2l0ZXIgKnRvLAorCQkgICB1bnNpZ25lZCBpbnQgbnNpb3YsIGNvbnN0IHN0cnVjdCBrdmVjICpzaW92LAorCQkgICB1bnNpZ25lZCBpbnQgc29mZnNldCwgdW5zaWduZWQgaW50IG5vYikKIHsKIAkvKiBOQiBkaW92LCBzaW92IGFyZSBSRUFELU9OTFkgKi8KLQl1bnNpZ25lZCBpbnQgdGhpc19ub2I7CisJY29uc3QgY2hhciAqczsKKwlzaXplX3QgbGVmdDsKIAogCWlmICghbm9iKQogCQlyZXR1cm47CiAKLQkvKiBza2lwIGNvbXBsZXRlIGZyYWdzIGJlZm9yZSAnZG9mZnNldCcgKi8KLQlMQVNTRVJUKG5kaW92ID4gMCk7Ci0Jd2hpbGUgKGRvZmZzZXQgPj0gZGlvdi0+aW92X2xlbikgewotCQlkb2Zmc2V0IC09IGRpb3YtPmlvdl9sZW47Ci0JCWRpb3YrKzsKLQkJbmRpb3YtLTsKLQkJTEFTU0VSVChuZGlvdiA+IDApOwotCX0KLQogCS8qIHNraXAgY29tcGxldGUgZnJhZ3MgYmVmb3JlICdzb2Zmc2V0JyAqLwogCUxBU1NFUlQobnNpb3YgPiAwKTsKIAl3aGlsZSAoc29mZnNldCA+PSBzaW92LT5pb3ZfbGVuKSB7CkBAIC0xOTQsMzkgKzE4OCw2OCBAQAogCQlMQVNTRVJUKG5zaW92ID4gMCk7CiAJfQogCisJcyA9IChjaGFyICopc2lvdi0+aW92X2Jhc2UgKyBzb2Zmc2V0OworCWxlZnQgPSBzaW92LT5pb3ZfbGVuIC0gc29mZnNldDsKIAlkbyB7Ci0JCUxBU1NFUlQobmRpb3YgPiAwKTsKKwkJc2l6ZV90IG4sIGNvcHkgPSBsZWZ0OwogCQlMQVNTRVJUKG5zaW92ID4gMCk7Ci0JCXRoaXNfbm9iID0gbWluKGRpb3YtPmlvdl9sZW4gLSBkb2Zmc2V0LAotCQkJICAgICAgIHNpb3YtPmlvdl9sZW4gLSBzb2Zmc2V0KTsKLQkJdGhpc19ub2IgPSBtaW4odGhpc19ub2IsIG5vYik7CiAKLQkJbWVtY3B5KChjaGFyICopZGlvdi0+aW92X2Jhc2UgKyBkb2Zmc2V0LAotCQkgICAgICAgKGNoYXIgKilzaW92LT5pb3ZfYmFzZSArIHNvZmZzZXQsIHRoaXNfbm9iKTsKLQkJbm9iIC09IHRoaXNfbm9iOworCQlpZiAoY29weSA+IG5vYikKKwkJCWNvcHkgPSBub2I7CisJCW4gPSBjb3B5X3RvX2l0ZXIocywgY29weSwgdG8pOworCQlpZiAobiAhPSBjb3B5KQorCQkJcmV0dXJuOworCQlub2IgLT0gbjsKIAotCQlpZiAoZGlvdi0+aW92X2xlbiA+IGRvZmZzZXQgKyB0aGlzX25vYikgewotCQkJZG9mZnNldCArPSB0aGlzX25vYjsKLQkJfSBlbHNlIHsKLQkJCWRpb3YrKzsKLQkJCW5kaW92LS07Ci0JCQlkb2Zmc2V0ID0gMDsKLQkJfQotCi0JCWlmIChzaW92LT5pb3ZfbGVuID4gc29mZnNldCArIHRoaXNfbm9iKSB7Ci0JCQlzb2Zmc2V0ICs9IHRoaXNfbm9iOwotCQl9IGVsc2UgewotCQkJc2lvdisrOwotCQkJbnNpb3YtLTsKLQkJCXNvZmZzZXQgPSAwOwotCQl9CisJCXNpb3YrKzsKKwkJcyA9IChjaGFyICopc2lvdi0+aW92X2Jhc2U7CisJCWxlZnQgPSBzaW92LT5pb3ZfbGVuOworCQluc2lvdi0tOwogCX0gd2hpbGUgKG5vYiA+IDApOwogfQotRVhQT1JUX1NZTUJPTChsbmV0X2NvcHlfaW92Mmlvdik7CitFWFBPUlRfU1lNQk9MKGxuZXRfY29weV9pb3YyaXRlcik7CisKK3ZvaWQKK2xuZXRfY29weV9raW92Mml0ZXIoc3RydWN0IGlvdl9pdGVyICp0bywKKwkJICAgIHVuc2lnbmVkIGludCBuc2lvdiwgY29uc3QgbG5ldF9raW92X3QgKnNpb3YsCisJCSAgICB1bnNpZ25lZCBpbnQgc29mZnNldCwgdW5zaWduZWQgaW50IG5vYikKK3sKKwlpZiAoIW5vYikKKwkJcmV0dXJuOworCisJTEFTU0VSVCghaW5faW50ZXJydXB0KCkpOworCisJTEFTU0VSVChuc2lvdiA+IDApOworCXdoaWxlIChzb2Zmc2V0ID49IHNpb3YtPmJ2X2xlbikgeworCQlzb2Zmc2V0IC09IHNpb3YtPmJ2X2xlbjsKKwkJc2lvdisrOworCQluc2lvdi0tOworCQlMQVNTRVJUKG5zaW92ID4gMCk7CisJfQorCisJZG8geworCQlzaXplX3QgY29weSA9IHNpb3YtPmJ2X2xlbiAtIHNvZmZzZXQsIG47CisKKwkJTEFTU0VSVChuc2lvdiA+IDApOworCisJCWlmIChjb3B5ID4gbm9iKQorCQkJY29weSA9IG5vYjsKKwkJbiA9IGNvcHlfcGFnZV90b19pdGVyKHNpb3YtPmJ2X3BhZ2UsCisJCQkJICAgICAgc2lvdi0+YnZfb2Zmc2V0ICsgc29mZnNldCwKKwkJCQkgICAgICBjb3B5LCB0byk7CisJCWlmIChuICE9IGNvcHkpCisJCQlyZXR1cm47CisJCW5vYiAtPSBuOworCQlzaW92Kys7CisJCW5zaW92LS07CisJCXNvZmZzZXQgPSAwOworCX0gd2hpbGUgKG5vYiA+IDApOworfQorRVhQT1JUX1NZTUJPTChsbmV0X2NvcHlfa2lvdjJpdGVyKTsKIAogaW50CiBsbmV0X2V4dHJhY3RfaW92KGludCBkc3Rfbmlvdiwgc3RydWN0IGt2ZWMgKmRzdCwKLQkJIGludCBzcmNfbmlvdiwgc3RydWN0IGt2ZWMgKnNyYywKKwkJIGludCBzcmNfbmlvdiwgY29uc3Qgc3RydWN0IGt2ZWMgKnNyYywKIAkJIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJLyoKQEAgLTI4MCwyMzggKzMwMywxNSBAQAogCiAJTEFTU0VSVCghbmlvdiB8fCBraW92KTsKIAl3aGlsZSAobmlvdi0tID4gMCkKLQkJbm9iICs9IChraW92KyspLT5raW92X2xlbjsKKwkJbm9iICs9IChraW92KyspLT5idl9sZW47CiAKIAlyZXR1cm4gbm9iOwogfQogRVhQT1JUX1NZTUJPTChsbmV0X2tpb3Zfbm9iKTsKIAotdm9pZAotbG5ldF9jb3B5X2tpb3Yya2lvdih1bnNpZ25lZCBpbnQgbmRpb3YsIGxuZXRfa2lvdl90ICpkaW92LCB1bnNpZ25lZCBpbnQgZG9mZnNldCwKLQkJICAgIHVuc2lnbmVkIGludCBuc2lvdiwgbG5ldF9raW92X3QgKnNpb3YsIHVuc2lnbmVkIGludCBzb2Zmc2V0LAotCQkgICAgdW5zaWduZWQgaW50IG5vYikKLXsKLQkvKiBOQiBkaW92LCBzaW92IGFyZSBSRUFELU9OTFkgKi8KLQl1bnNpZ25lZCBpbnQgdGhpc19ub2I7Ci0JY2hhciAqZGFkZHIgPSBOVUxMOwotCWNoYXIgKnNhZGRyID0gTlVMTDsKLQotCWlmICghbm9iKQotCQlyZXR1cm47Ci0KLQlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7Ci0KLQlMQVNTRVJUKG5kaW92ID4gMCk7Ci0Jd2hpbGUgKGRvZmZzZXQgPj0gZGlvdi0+a2lvdl9sZW4pIHsKLQkJZG9mZnNldCAtPSBkaW92LT5raW92X2xlbjsKLQkJZGlvdisrOwotCQluZGlvdi0tOwotCQlMQVNTRVJUKG5kaW92ID4gMCk7Ci0JfQotCi0JTEFTU0VSVChuc2lvdiA+IDApOwotCXdoaWxlIChzb2Zmc2V0ID49IHNpb3YtPmtpb3ZfbGVuKSB7Ci0JCXNvZmZzZXQgLT0gc2lvdi0+a2lvdl9sZW47Ci0JCXNpb3YrKzsKLQkJbnNpb3YtLTsKLQkJTEFTU0VSVChuc2lvdiA+IDApOwotCX0KLQotCWRvIHsKLQkJTEFTU0VSVChuZGlvdiA+IDApOwotCQlMQVNTRVJUKG5zaW92ID4gMCk7Ci0JCXRoaXNfbm9iID0gbWluKGRpb3YtPmtpb3ZfbGVuIC0gZG9mZnNldCwKLQkJCSAgICAgICBzaW92LT5raW92X2xlbiAtIHNvZmZzZXQpOwotCQl0aGlzX25vYiA9IG1pbih0aGlzX25vYiwgbm9iKTsKLQotCQlpZiAoIWRhZGRyKQotCQkJZGFkZHIgPSAoKGNoYXIgKilrbWFwKGRpb3YtPmtpb3ZfcGFnZSkpICsKLQkJCQlkaW92LT5raW92X29mZnNldCArIGRvZmZzZXQ7Ci0JCWlmICghc2FkZHIpCi0JCQlzYWRkciA9ICgoY2hhciAqKWttYXAoc2lvdi0+a2lvdl9wYWdlKSkgKwotCQkJCXNpb3YtPmtpb3Zfb2Zmc2V0ICsgc29mZnNldDsKLQotCQkvKgotCQkgKiBWYW5pc2hpbmcgcmlzayBvZiBrbWFwIGRlYWRsb2NrIHdoZW4gbWFwcGluZyAyIHBhZ2VzLgotCQkgKiBIb3dldmVyIGluIHByYWN0aWNlIGF0IGxlYXN0IG9uZSBvZiB0aGUga2lvdnMgd2lsbCBiZSBtYXBwZWQKLQkJICoga2VybmVsIHBhZ2VzIGFuZCB0aGUgbWFwL3VubWFwIHdpbGwgYmUgTk9PUHMKLQkJICovCi0JCW1lbWNweShkYWRkciwgc2FkZHIsIHRoaXNfbm9iKTsKLQkJbm9iIC09IHRoaXNfbm9iOwotCi0JCWlmIChkaW92LT5raW92X2xlbiA+IGRvZmZzZXQgKyB0aGlzX25vYikgewotCQkJZGFkZHIgKz0gdGhpc19ub2I7Ci0JCQlkb2Zmc2V0ICs9IHRoaXNfbm9iOwotCQl9IGVsc2UgewotCQkJa3VubWFwKGRpb3YtPmtpb3ZfcGFnZSk7Ci0JCQlkYWRkciA9IE5VTEw7Ci0JCQlkaW92Kys7Ci0JCQluZGlvdi0tOwotCQkJZG9mZnNldCA9IDA7Ci0JCX0KLQotCQlpZiAoc2lvdi0+a2lvdl9sZW4gPiBzb2Zmc2V0ICsgdGhpc19ub2IpIHsKLQkJCXNhZGRyICs9IHRoaXNfbm9iOwotCQkJc29mZnNldCArPSB0aGlzX25vYjsKLQkJfSBlbHNlIHsKLQkJCWt1bm1hcChzaW92LT5raW92X3BhZ2UpOwotCQkJc2FkZHIgPSBOVUxMOwotCQkJc2lvdisrOwotCQkJbnNpb3YtLTsKLQkJCXNvZmZzZXQgPSAwOwotCQl9Ci0JfSB3aGlsZSAobm9iID4gMCk7Ci0KLQlpZiAoZGFkZHIpCi0JCWt1bm1hcChkaW92LT5raW92X3BhZ2UpOwotCWlmIChzYWRkcikKLQkJa3VubWFwKHNpb3YtPmtpb3ZfcGFnZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGxuZXRfY29weV9raW92Mmtpb3YpOwotCi12b2lkCi1sbmV0X2NvcHlfa2lvdjJpb3YodW5zaWduZWQgaW50IG5pb3YsIHN0cnVjdCBrdmVjICppb3YsIHVuc2lnbmVkIGludCBpb3ZvZmZzZXQsCi0JCSAgIHVuc2lnbmVkIGludCBua2lvdiwgbG5ldF9raW92X3QgKmtpb3YsCi0JCSAgIHVuc2lnbmVkIGludCBraW92b2Zmc2V0LCB1bnNpZ25lZCBpbnQgbm9iKQotewotCS8qIE5CIGlvdiwga2lvdiBhcmUgUkVBRC1PTkxZICovCi0JdW5zaWduZWQgaW50IHRoaXNfbm9iOwotCWNoYXIgKmFkZHIgPSBOVUxMOwotCi0JaWYgKCFub2IpCi0JCXJldHVybjsKLQotCUxBU1NFUlQoIWluX2ludGVycnVwdCgpKTsKLQotCUxBU1NFUlQobmlvdiA+IDApOwotCXdoaWxlIChpb3ZvZmZzZXQgPj0gaW92LT5pb3ZfbGVuKSB7Ci0JCWlvdm9mZnNldCAtPSBpb3YtPmlvdl9sZW47Ci0JCWlvdisrOwotCQluaW92LS07Ci0JCUxBU1NFUlQobmlvdiA+IDApOwotCX0KLQotCUxBU1NFUlQobmtpb3YgPiAwKTsKLQl3aGlsZSAoa2lvdm9mZnNldCA+PSBraW92LT5raW92X2xlbikgewotCQlraW92b2Zmc2V0IC09IGtpb3YtPmtpb3ZfbGVuOwotCQlraW92Kys7Ci0JCW5raW92LS07Ci0JCUxBU1NFUlQobmtpb3YgPiAwKTsKLQl9Ci0KLQlkbyB7Ci0JCUxBU1NFUlQobmlvdiA+IDApOwotCQlMQVNTRVJUKG5raW92ID4gMCk7Ci0JCXRoaXNfbm9iID0gbWluKGlvdi0+aW92X2xlbiAtIGlvdm9mZnNldCwKLQkJCSAgICAgICAoX19rZXJuZWxfc2l6ZV90KWtpb3YtPmtpb3ZfbGVuIC0ga2lvdm9mZnNldCk7Ci0JCXRoaXNfbm9iID0gbWluKHRoaXNfbm9iLCBub2IpOwotCi0JCWlmICghYWRkcikKLQkJCWFkZHIgPSAoKGNoYXIgKilrbWFwKGtpb3YtPmtpb3ZfcGFnZSkpICsKLQkJCQlraW92LT5raW92X29mZnNldCArIGtpb3ZvZmZzZXQ7Ci0KLQkJbWVtY3B5KChjaGFyICopaW92LT5pb3ZfYmFzZSArIGlvdm9mZnNldCwgYWRkciwgdGhpc19ub2IpOwotCQlub2IgLT0gdGhpc19ub2I7Ci0KLQkJaWYgKGlvdi0+aW92X2xlbiA+IGlvdm9mZnNldCArIHRoaXNfbm9iKSB7Ci0JCQlpb3ZvZmZzZXQgKz0gdGhpc19ub2I7Ci0JCX0gZWxzZSB7Ci0JCQlpb3YrKzsKLQkJCW5pb3YtLTsKLQkJCWlvdm9mZnNldCA9IDA7Ci0JCX0KLQotCQlpZiAoa2lvdi0+a2lvdl9sZW4gPiBraW92b2Zmc2V0ICsgdGhpc19ub2IpIHsKLQkJCWFkZHIgKz0gdGhpc19ub2I7Ci0JCQlraW92b2Zmc2V0ICs9IHRoaXNfbm9iOwotCQl9IGVsc2UgewotCQkJa3VubWFwKGtpb3YtPmtpb3ZfcGFnZSk7Ci0JCQlhZGRyID0gTlVMTDsKLQkJCWtpb3YrKzsKLQkJCW5raW92LS07Ci0JCQlraW92b2Zmc2V0ID0gMDsKLQkJfQotCi0JfSB3aGlsZSAobm9iID4gMCk7Ci0KLQlpZiAoYWRkcikKLQkJa3VubWFwKGtpb3YtPmtpb3ZfcGFnZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGxuZXRfY29weV9raW92Mmlvdik7Ci0KLXZvaWQKLWxuZXRfY29weV9pb3Yya2lvdih1bnNpZ25lZCBpbnQgbmtpb3YsIGxuZXRfa2lvdl90ICpraW92LAotCQkgICB1bnNpZ25lZCBpbnQga2lvdm9mZnNldCwgdW5zaWduZWQgaW50IG5pb3YsCi0JCSAgIHN0cnVjdCBrdmVjICppb3YsIHVuc2lnbmVkIGludCBpb3ZvZmZzZXQsCi0JCSAgIHVuc2lnbmVkIGludCBub2IpCi17Ci0JLyogTkIga2lvdiwgaW92IGFyZSBSRUFELU9OTFkgKi8KLQl1bnNpZ25lZCBpbnQgdGhpc19ub2I7Ci0JY2hhciAqYWRkciA9IE5VTEw7Ci0KLQlpZiAoIW5vYikKLQkJcmV0dXJuOwotCi0JTEFTU0VSVCghaW5faW50ZXJydXB0KCkpOwotCi0JTEFTU0VSVChua2lvdiA+IDApOwotCXdoaWxlIChraW92b2Zmc2V0ID49IGtpb3YtPmtpb3ZfbGVuKSB7Ci0JCWtpb3ZvZmZzZXQgLT0ga2lvdi0+a2lvdl9sZW47Ci0JCWtpb3YrKzsKLQkJbmtpb3YtLTsKLQkJTEFTU0VSVChua2lvdiA+IDApOwotCX0KLQotCUxBU1NFUlQobmlvdiA+IDApOwotCXdoaWxlIChpb3ZvZmZzZXQgPj0gaW92LT5pb3ZfbGVuKSB7Ci0JCWlvdm9mZnNldCAtPSBpb3YtPmlvdl9sZW47Ci0JCWlvdisrOwotCQluaW92LS07Ci0JCUxBU1NFUlQobmlvdiA+IDApOwotCX0KLQotCWRvIHsKLQkJTEFTU0VSVChua2lvdiA+IDApOwotCQlMQVNTRVJUKG5pb3YgPiAwKTsKLQkJdGhpc19ub2IgPSBtaW4oKF9fa2VybmVsX3NpemVfdClraW92LT5raW92X2xlbiAtIGtpb3ZvZmZzZXQsCi0JCQkgICAgICAgaW92LT5pb3ZfbGVuIC0gaW92b2Zmc2V0KTsKLQkJdGhpc19ub2IgPSBtaW4odGhpc19ub2IsIG5vYik7Ci0KLQkJaWYgKCFhZGRyKQotCQkJYWRkciA9ICgoY2hhciAqKWttYXAoa2lvdi0+a2lvdl9wYWdlKSkgKwotCQkJCWtpb3YtPmtpb3Zfb2Zmc2V0ICsga2lvdm9mZnNldDsKLQotCQltZW1jcHkoYWRkciwgKGNoYXIgKilpb3YtPmlvdl9iYXNlICsgaW92b2Zmc2V0LCB0aGlzX25vYik7Ci0JCW5vYiAtPSB0aGlzX25vYjsKLQotCQlpZiAoa2lvdi0+a2lvdl9sZW4gPiBraW92b2Zmc2V0ICsgdGhpc19ub2IpIHsKLQkJCWFkZHIgKz0gdGhpc19ub2I7Ci0JCQlraW92b2Zmc2V0ICs9IHRoaXNfbm9iOwotCQl9IGVsc2UgewotCQkJa3VubWFwKGtpb3YtPmtpb3ZfcGFnZSk7Ci0JCQlhZGRyID0gTlVMTDsKLQkJCWtpb3YrKzsKLQkJCW5raW92LS07Ci0JCQlraW92b2Zmc2V0ID0gMDsKLQkJfQotCi0JCWlmIChpb3YtPmlvdl9sZW4gPiBpb3ZvZmZzZXQgKyB0aGlzX25vYikgewotCQkJaW92b2Zmc2V0ICs9IHRoaXNfbm9iOwotCQl9IGVsc2UgewotCQkJaW92Kys7Ci0JCQluaW92LS07Ci0JCQlpb3ZvZmZzZXQgPSAwOwotCQl9Ci0JfSB3aGlsZSAobm9iID4gMCk7Ci0KLQlpZiAoYWRkcikKLQkJa3VubWFwKGtpb3YtPmtpb3ZfcGFnZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGxuZXRfY29weV9pb3Yya2lvdik7Ci0KIGludAogbG5ldF9leHRyYWN0X2tpb3YoaW50IGRzdF9uaW92LCBsbmV0X2tpb3ZfdCAqZHN0LAotCQkgIGludCBzcmNfbmlvdiwgbG5ldF9raW92X3QgKnNyYywKKwkJICBpbnQgc3JjX25pb3YsIGNvbnN0IGxuZXRfa2lvdl90ICpzcmMsCiAJCSAgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbikKIHsKIAkvKgpAQCAtNTI2LDggKzMyNiw4IEBACiAJCXJldHVybiAwOwkJICAgICAvKiBubyBmcmFncyAqLwogCiAJTEFTU0VSVChzcmNfbmlvdiA+IDApOwotCXdoaWxlIChvZmZzZXQgPj0gc3JjLT5raW92X2xlbikgeyAgICAgIC8qIHNraXAgaW5pdGlhbCBmcmFncyAqLwotCQlvZmZzZXQgLT0gc3JjLT5raW92X2xlbjsKKwl3aGlsZSAob2Zmc2V0ID49IHNyYy0+YnZfbGVuKSB7ICAgICAgLyogc2tpcCBpbml0aWFsIGZyYWdzICovCisJCW9mZnNldCAtPSBzcmMtPmJ2X2xlbjsKIAkJc3JjX25pb3YtLTsKIAkJc3JjKys7CiAJCUxBU1NFUlQoc3JjX25pb3YgPiAwKTsKQEAgLTUzOCwxOSArMzM4LDE5IEBACiAJCUxBU1NFUlQoc3JjX25pb3YgPiAwKTsKIAkJTEFTU0VSVCgoaW50KW5pb3YgPD0gZHN0X25pb3YpOwogCi0JCWZyYWdfbGVuID0gc3JjLT5raW92X2xlbiAtIG9mZnNldDsKLQkJZHN0LT5raW92X3BhZ2UgPSBzcmMtPmtpb3ZfcGFnZTsKLQkJZHN0LT5raW92X29mZnNldCA9IHNyYy0+a2lvdl9vZmZzZXQgKyBvZmZzZXQ7CisJCWZyYWdfbGVuID0gc3JjLT5idl9sZW4gLSBvZmZzZXQ7CisJCWRzdC0+YnZfcGFnZSA9IHNyYy0+YnZfcGFnZTsKKwkJZHN0LT5idl9vZmZzZXQgPSBzcmMtPmJ2X29mZnNldCArIG9mZnNldDsKIAogCQlpZiAobGVuIDw9IGZyYWdfbGVuKSB7Ci0JCQlkc3QtPmtpb3ZfbGVuID0gbGVuOwotCQkJTEFTU0VSVChkc3QtPmtpb3Zfb2Zmc2V0ICsgZHN0LT5raW92X2xlbgorCQkJZHN0LT5idl9sZW4gPSBsZW47CisJCQlMQVNTRVJUKGRzdC0+YnZfb2Zmc2V0ICsgZHN0LT5idl9sZW4KIAkJCQkJPD0gUEFHRV9TSVpFKTsKIAkJCXJldHVybiBuaW92OwogCQl9CiAKLQkJZHN0LT5raW92X2xlbiA9IGZyYWdfbGVuOwotCQlMQVNTRVJUKGRzdC0+a2lvdl9vZmZzZXQgKyBkc3QtPmtpb3ZfbGVuIDw9IFBBR0VfU0laRSk7CisJCWRzdC0+YnZfbGVuID0gZnJhZ19sZW47CisJCUxBU1NFUlQoZHN0LT5idl9vZmZzZXQgKyBkc3QtPmJ2X2xlbiA8PSBQQUdFX1NJWkUpOwogCiAJCWxlbiAtPSBmcmFnX2xlbjsKIAkJZHN0Kys7CkBAIC01NjksNiArMzY5LDcgQEAKIAl1bnNpZ25lZCBpbnQgbmlvdiA9IDA7CiAJc3RydWN0IGt2ZWMgKmlvdiA9IE5VTEw7CiAJbG5ldF9raW92X3QgKmtpb3YgPSBOVUxMOworCXN0cnVjdCBpb3ZfaXRlciB0bzsKIAlpbnQgcmM7CiAKIAlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7CkBAIC01OTQsOCArMzk1LDE0IEBACiAJCX0KIAl9CiAKLQlyYyA9IG5pLT5uaV9sbmQtPmxuZF9yZWN2KG5pLCBwcml2YXRlLCBtc2csIGRlbGF5ZWQsCi0JCQkJICBuaW92LCBpb3YsIGtpb3YsIG9mZnNldCwgbWxlbiwgcmxlbik7CisJaWYgKGlvdikgeworCQlpb3ZfaXRlcl9rdmVjKCZ0bywgSVRFUl9LVkVDIHwgUkVBRCwgaW92LCBuaW92LCBtbGVuICsgb2Zmc2V0KTsKKwkJaW92X2l0ZXJfYWR2YW5jZSgmdG8sIG9mZnNldCk7CisJfSBlbHNlIHsKKwkJaW92X2l0ZXJfYnZlYygmdG8sIElURVJfQlZFQyB8IFJFQUQsIGtpb3YsIG5pb3YsIG1sZW4gKyBvZmZzZXQpOworCQlpb3ZfaXRlcl9hZHZhbmNlKCZ0bywgb2Zmc2V0KTsKKwl9CisJcmMgPSBuaS0+bmlfbG5kLT5sbmRfcmVjdihuaSwgcHJpdmF0ZSwgbXNnLCBkZWxheWVkLCAmdG8sIHJsZW4pOwogCWlmIChyYyA8IDApCiAJCWxuZXRfZmluYWxpemUobmksIG1zZywgcmMpOwogfQpAQCAtMjAwMiw2ICsxODA5LDkgQEAKIAkJICAgICAgIGxpYmNmc19uaWQyc3RyKGZyb21fbmlkKSwgbGliY2ZzX25pZDJzdHIoc3JjX25pZCksCiAJCSAgICAgICBsbmV0X21zZ3R5cDJzdHIodHlwZSksIHJjKTsKIAkJbG5ldF9tc2dfZnJlZShtc2cpOworCQlpZiAocmMgPT0gLUVTSFVURE9XTikKKwkJCS8qIFdlIGFyZSBzaHV0dGluZyBkb3duLiBEb24ndCBkbyBhbnl0aGluZyBtb3JlICovCisJCQlyZXR1cm4gMDsKIAkJZ290byBkcm9wOwogCX0KIApAQCAtMjUxMiw2ICsyMzIyLDE1IEBACiAJCX0KIAogCQlpZiAoTE5FVF9OSURORVQobmktPm5pX25pZCkgPT0gZHN0bmV0KSB7CisJCQkvKgorCQkJICogQ2hlY2sgaWYgbmkgd2FzIG9yaWdpbmFsbHkgY3JlYXRlZCBpbgorCQkJICogY3VycmVudCBuZXQgbmFtZXNwYWNlLgorCQkJICogSWYgbm90LCBhc3NpZ24gb3JkZXIgYWJvdmUgMHhmZmZmMDAwMCwKKwkJCSAqIHRvIG1ha2UgdGhpcyBuaSBub3QgYSBwcmlvcml0eS4KKwkJCSAqLworCQkJaWYgKCFuZXRfZXEobmktPm5pX25ldF9ucywgY3VycmVudC0+bnNwcm94eS0+bmV0X25zKSkKKwkJCQlvcmRlciArPSAweGZmZmYwMDAwOworCiAJCQlpZiAoc3JjbmlkcCkKIAkJCQkqc3JjbmlkcCA9IG5pLT5uaV9uaWQ7CiAJCQlpZiAob3JkZXJwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLW1zZy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLW1zZy5jCmluZGV4IDkxMGUxMDYuLjA4OTdlNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1tc2cuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItbXNnLmMKQEAgLTQ0OSwyMyArNDQ5LDcgQEAKIAogCWlmICghbXNnKQogCQlyZXR1cm47Ci0jaWYgMAotCUNERUJVRyhEX1dBUk5JTkcsICIlcyBtc2ctPiVzIEZsYWdzOiVzJXMlcyVzJXMlcyVzJXMlcyVzJXMgdHhwICVzIHJ4cCAlc1xuIiwKLQkgICAgICAgbG5ldF9tc2d0eXAyc3RyKG1zZy0+bXNnX3R5cGUpLCBsaWJjZnNfaWQyc3RyKG1zZy0+bXNnX3RhcmdldCksCi0JICAgICAgIG1zZy0+bXNnX3RhcmdldF9pc19yb3V0ZXIgPyAidCIgOiAiIiwKLQkgICAgICAgbXNnLT5tc2dfcm91dGluZyA/ICJYIiA6ICIiLAotCSAgICAgICBtc2ctPm1zZ19hY2sgPyAiQSIgOiAiIiwKLQkgICAgICAgbXNnLT5tc2dfc2VuZGluZyA/ICJTIiA6ICIiLAotCSAgICAgICBtc2ctPm1zZ19yZWNlaXZpbmcgPyAiUiIgOiAiIiwKLQkgICAgICAgbXNnLT5tc2dfZGVsYXllZCA/ICJkIiA6ICIiLAotCSAgICAgICBtc2ctPm1zZ190eGNyZWRpdCA/ICJDIiA6ICIiLAotCSAgICAgICBtc2ctPm1zZ19wZWVydHhjcmVkaXQgPyAiYyIgOiAiIiwKLQkgICAgICAgbXNnLT5tc2dfcnRyY3JlZGl0ID8gIkYiIDogIiIsCi0JICAgICAgIG1zZy0+bXNnX3BlZXJydHJjcmVkaXQgPyAiZiIgOiAiIiwKLQkgICAgICAgbXNnLT5tc2dfb25hY3RpdmVsaXN0ID8gIiEiIDogIiIsCi0JICAgICAgICFtc2ctPm1zZ190eHBlZXIgPyAiPG5vbmU+IiA6IGxpYmNmc19uaWQyc3RyKG1zZy0+bXNnX3R4cGVlci0+bHBfbmlkKSwKLQkgICAgICAgIW1zZy0+bXNnX3J4cGVlciA/ICI8bm9uZT4iIDogbGliY2ZzX25pZDJzdHIobXNnLT5tc2dfcnhwZWVyLT5scF9uaWQpKTsKLSNlbmRpZgorCiAJbXNnLT5tc2dfZXYuc3RhdHVzID0gc3RhdHVzOwogCiAJaWYgKG1zZy0+bXNnX21kKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItc29ja2V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItc29ja2V0LmMKaW5kZXggODkxZmQ1OS4uNGU2ZGQ1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLXNvY2tldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1zb2NrZXQuYwpAQCAtMjY1LDIxICsyNjUsMTcgQEAKIAlsb25nIGppZmZpZXNfbGVmdCA9IHRpbWVvdXQgKiBtc2Vjc190b19qaWZmaWVzKE1TRUNfUEVSX1NFQyk7CiAJdW5zaWduZWQgbG9uZyB0aGVuOwogCXN0cnVjdCB0aW1ldmFsIHR2OworCXN0cnVjdCBrdmVjICBpb3YgPSB7IC5pb3ZfYmFzZSA9IGJ1ZmZlciwgLmlvdl9sZW4gID0gbm9iIH07CisJc3RydWN0IG1zZ2hkciBtc2cgPSB7TlVMTCx9OwogCiAJTEFTU0VSVChub2IgPiAwKTsKIAkvKgogCSAqIENhbGxlciBtYXkgcGFzcyBhIHplcm8gdGltZW91dCBpZiBzaGUgdGhpbmtzIHRoZSBzb2NrZXQgYnVmZmVyIGlzCiAJICogZW1wdHkgZW5vdWdoIHRvIHRha2UgdGhlIHdob2xlIG1lc3NhZ2UgaW1tZWRpYXRlbHkKIAkgKi8KKwlpb3ZfaXRlcl9rdmVjKCZtc2cubXNnX2l0ZXIsIFdSSVRFIHwgSVRFUl9LVkVDLCAmaW92LCAxLCBub2IpOwogCWZvciAoOzspIHsKLQkJc3RydWN0IGt2ZWMgIGlvdiA9IHsKLQkJCS5pb3ZfYmFzZSA9IGJ1ZmZlciwKLQkJCS5pb3ZfbGVuICA9IG5vYgotCQl9OwotCQlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKLQkJCS5tc2dfZmxhZ3MgICAgICA9ICF0aW1lb3V0ID8gTVNHX0RPTlRXQUlUIDogMAotCQl9OwotCisJCW1zZy5tc2dfZmxhZ3MgPSAhdGltZW91dCA/IE1TR19ET05UV0FJVCA6IDA7CiAJCWlmICh0aW1lb3V0KSB7CiAJCQkvKiBTZXQgc2VuZCB0aW1lb3V0IHRvIHJlbWFpbmluZyB0aW1lICovCiAJCQlqaWZmaWVzX3RvX3RpbWV2YWwoamlmZmllc19sZWZ0LCAmdHYpOwpAQCAtMjk2LDkgKzI5Miw2IEBACiAJCXJjID0ga2VybmVsX3NlbmRtc2coc29jaywgJm1zZywgJmlvdiwgMSwgbm9iKTsKIAkJamlmZmllc19sZWZ0IC09IGppZmZpZXMgLSB0aGVuOwogCi0JCWlmIChyYyA9PSBub2IpCi0JCQlyZXR1cm4gMDsKLQogCQlpZiAocmMgPCAwKQogCQkJcmV0dXJuIHJjOwogCkBAIC0zMDcsMTEgKzMwMCwxMSBAQAogCQkJcmV0dXJuIC1FQ09OTkFCT1JURUQ7CiAJCX0KIAorCQlpZiAoIW1zZ19kYXRhX2xlZnQoJm1zZykpCisJCQlicmVhazsKKwogCQlpZiAoamlmZmllc19sZWZ0IDw9IDApCiAJCQlyZXR1cm4gLUVBR0FJTjsKLQotCQlidWZmZXIgPSAoKGNoYXIgKilidWZmZXIpICsgcmM7Ci0JCW5vYiAtPSByYzsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9sby5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbG8uYwppbmRleCAwODQwMjcxMi4uY2IyMTNiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbG8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9sby5jCkBAIC00MiwzNiArNDIsMjMgQEAKIAogc3RhdGljIGludAogbG9sbmRfcmVjdihsbmV0X25pX3QgKm5pLCB2b2lkICpwcml2YXRlLCBsbmV0X21zZ190ICpsbnRtc2csCi0JICAgaW50IGRlbGF5ZWQsIHVuc2lnbmVkIGludCBuaW92LAotCSAgIHN0cnVjdCBrdmVjICppb3YsIGxuZXRfa2lvdl90ICpraW92LAotCSAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBtbGVuLCB1bnNpZ25lZCBpbnQgcmxlbikKKwkgICBpbnQgZGVsYXllZCwgc3RydWN0IGlvdl9pdGVyICp0bywgdW5zaWduZWQgaW50IHJsZW4pCiB7CiAJbG5ldF9tc2dfdCAqc2VuZG1zZyA9IHByaXZhdGU7CiAKIAlpZiAobG50bXNnKSB7CQkgICAvKiBub3QgZGlzY2FyZGluZyAqLwotCQlpZiAoc2VuZG1zZy0+bXNnX2lvdikgewotCQkJaWYgKGlvdikKLQkJCQlsbmV0X2NvcHlfaW92MmlvdihuaW92LCBpb3YsIG9mZnNldCwKLQkJCQkJCSAgc2VuZG1zZy0+bXNnX25pb3YsCi0JCQkJCQkgIHNlbmRtc2ctPm1zZ19pb3YsCi0JCQkJCQkgIHNlbmRtc2ctPm1zZ19vZmZzZXQsIG1sZW4pOwotCQkJZWxzZQotCQkJCWxuZXRfY29weV9pb3Yya2lvdihuaW92LCBraW92LCBvZmZzZXQsCi0JCQkJCQkgICBzZW5kbXNnLT5tc2dfbmlvdiwKLQkJCQkJCSAgIHNlbmRtc2ctPm1zZ19pb3YsCi0JCQkJCQkgICBzZW5kbXNnLT5tc2dfb2Zmc2V0LCBtbGVuKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChpb3YpCi0JCQkJbG5ldF9jb3B5X2tpb3YyaW92KG5pb3YsIGlvdiwgb2Zmc2V0LAotCQkJCQkJICAgc2VuZG1zZy0+bXNnX25pb3YsCi0JCQkJCQkgICBzZW5kbXNnLT5tc2dfa2lvdiwKLQkJCQkJCSAgIHNlbmRtc2ctPm1zZ19vZmZzZXQsIG1sZW4pOwotCQkJZWxzZQotCQkJCWxuZXRfY29weV9raW92Mmtpb3Yobmlvdiwga2lvdiwgb2Zmc2V0LAotCQkJCQkJICAgIHNlbmRtc2ctPm1zZ19uaW92LAotCQkJCQkJICAgIHNlbmRtc2ctPm1zZ19raW92LAotCQkJCQkJICAgIHNlbmRtc2ctPm1zZ19vZmZzZXQsIG1sZW4pOwotCQl9CisJCWlmIChzZW5kbXNnLT5tc2dfaW92KQorCQkJbG5ldF9jb3B5X2lvdjJpdGVyKHRvLAorCQkJCQkgICBzZW5kbXNnLT5tc2dfbmlvdiwKKwkJCQkJICAgc2VuZG1zZy0+bXNnX2lvdiwKKwkJCQkJICAgc2VuZG1zZy0+bXNnX29mZnNldCwKKwkJCQkJICAgaW92X2l0ZXJfY291bnQodG8pKTsKKwkJZWxzZQorCQkJbG5ldF9jb3B5X2tpb3YyaXRlcih0bywKKwkJCQkJICAgIHNlbmRtc2ctPm1zZ19uaW92LAorCQkJCQkgICAgc2VuZG1zZy0+bXNnX2tpb3YsCisJCQkJCSAgICBzZW5kbXNnLT5tc2dfb2Zmc2V0LAorCQkJCQkgICAgaW92X2l0ZXJfY291bnQodG8pKTsKIAogCQlsbmV0X2ZpbmFsaXplKG5pLCBsbnRtc2csIDApOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3JvdXRlci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcm91dGVyLmMKaW5kZXggMDYzNTQzMi4uMDYzYWQ1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcm91dGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcm91dGVyLmMKQEAgLTEzMDcsNyArMTMwNyw3IEBACiAJaW50IHN6ID0gb2Zmc2V0b2YobG5ldF9ydHJidWZfdCwgcmJfa2lvdltucGFnZXNdKTsKIAogCXdoaWxlICgtLW5wYWdlcyA+PSAwKQotCQlfX2ZyZWVfcGFnZShyYi0+cmJfa2lvdltucGFnZXNdLmtpb3ZfcGFnZSk7CisJCV9fZnJlZV9wYWdlKHJiLT5yYl9raW92W25wYWdlc10uYnZfcGFnZSk7CiAKIAlMSUJDRlNfRlJFRShyYiwgc3opOwogfQpAQCAtMTMzMywxNSArMTMzMywxNSBAQAogCQkJCUdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLCAwKTsKIAkJaWYgKCFwYWdlKSB7CiAJCQl3aGlsZSAoLS1pID49IDApCi0JCQkJX19mcmVlX3BhZ2UocmItPnJiX2tpb3ZbaV0ua2lvdl9wYWdlKTsKKwkJCQlfX2ZyZWVfcGFnZShyYi0+cmJfa2lvdltpXS5idl9wYWdlKTsKIAogCQkJTElCQ0ZTX0ZSRUUocmIsIHN6KTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAKLQkJcmItPnJiX2tpb3ZbaV0ua2lvdl9sZW4gPSBQQUdFX1NJWkU7Ci0JCXJiLT5yYl9raW92W2ldLmtpb3Zfb2Zmc2V0ID0gMDsKLQkJcmItPnJiX2tpb3ZbaV0ua2lvdl9wYWdlID0gcGFnZTsKKwkJcmItPnJiX2tpb3ZbaV0uYnZfbGVuID0gUEFHRV9TSVpFOworCQlyYi0+cmJfa2lvdltpXS5idl9vZmZzZXQgPSAwOworCQlyYi0+cmJfa2lvdltpXS5idl9wYWdlID0gcGFnZTsKIAl9CiAKIAlyZXR1cm4gcmI7CkBAIC0xNjkzLDcgKzE2OTMsNyBAQAogaW50CiBsbmV0X3J0cnBvb2xzX2VuYWJsZSh2b2lkKQogewotCWludCByYzsKKwlpbnQgcmMgPSAwOwogCiAJaWYgKHRoZV9sbmV0LmxuX3JvdXRpbmcpCiAJCXJldHVybiAwOwpAQCAtMTcwNiw5ICsxNzA2LDkgQEAKIAkJICogaWYgd2UgYXJlIGp1c3QgY29uZmlndXJpbmcgdGhpcyBmb3IgdGhlIGZpcnN0CiAJCSAqIHRpbWUuCiAJCSAqLwotCQlyZXR1cm4gbG5ldF9ydHJwb29sc19hbGxvYygxKTsKLQotCXJjID0gbG5ldF9ydHJwb29sc19hZGp1c3RfaGVscGVyKDAsIDAsIDApOworCQlyYyA9IGxuZXRfcnRycG9vbHNfYWxsb2MoMSk7CisJZWxzZQorCQlyYyA9IGxuZXRfcnRycG9vbHNfYWRqdXN0X2hlbHBlcigwLCAwLCAwKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApAQCAtMTcxOCw3ICsxNzE4LDcgQEAKIAl0aGVfbG5ldC5sbl9waW5nX2luZm8tPnBpX2ZlYXR1cmVzICY9IH5MTkVUX1BJTkdfRkVBVF9SVEVfRElTQUJMRUQ7CiAJbG5ldF9uZXRfdW5sb2NrKExORVRfTE9DS19FWCk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmM7CiB9CiAKIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9icndfdGVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2Jyd190ZXN0LmMKaW5kZXggMTNkMDQ1NC4uYjIwYzVkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2Jyd190ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2Jyd190ZXN0LmMKQEAgLTIyNiw3ICsyMjYsNyBAQAogCXN0cnVjdCBwYWdlICpwZzsKIAogCWZvciAoaSA9IDA7IGkgPCBiay0+YmtfbmlvdjsgaSsrKSB7Ci0JCXBnID0gYmstPmJrX2lvdnNbaV0ua2lvdl9wYWdlOworCQlwZyA9IGJrLT5ia19pb3ZzW2ldLmJ2X3BhZ2U7CiAJCWJyd19maWxsX3BhZ2UocGcsIHBhdHRlcm4sIG1hZ2ljKTsKIAl9CiB9CkBAIC0yMzgsNyArMjM4LDcgQEAKIAlzdHJ1Y3QgcGFnZSAqcGc7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYmstPmJrX25pb3Y7IGkrKykgewotCQlwZyA9IGJrLT5ia19pb3ZzW2ldLmtpb3ZfcGFnZTsKKwkJcGcgPSBiay0+YmtfaW92c1tpXS5idl9wYWdlOwogCQlpZiAoYnJ3X2NoZWNrX3BhZ2UocGcsIHBhdHRlcm4sIG1hZ2ljKSkgewogCQkJQ0VSUk9SKCJCdWxrIHBhZ2UgJXAgKCVkLyVkKSBpcyBjb3JydXB0ZWQhXG4iLAogCQkJICAgICAgIHBnLCBpLCBiay0+Ymtfbmlvdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29ucnBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29ucnBjLmMKaW5kZXggMWJlM2NhZC4uNTVhZmI1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnJwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25ycGMuYwpAQCAtMTUyLDEwICsxNTIsMTAgQEAKIAlMQVNTRVJUKGxpc3RfZW1wdHkoJmNycGMtPmNycF9saW5rKSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYnVsay0+YmtfbmlvdjsgaSsrKSB7Ci0JCWlmICghYnVsay0+YmtfaW92c1tpXS5raW92X3BhZ2UpCisJCWlmICghYnVsay0+YmtfaW92c1tpXS5idl9wYWdlKQogCQkJY29udGludWU7CiAKLQkJX19mcmVlX3BhZ2UoYnVsay0+YmtfaW92c1tpXS5raW92X3BhZ2UpOworCQlfX2ZyZWVfcGFnZShidWxrLT5ia19pb3ZzW2ldLmJ2X3BhZ2UpOwogCX0KIAogCXNycGNfY2xpZW50X3JwY19kZWNyZWYoY3JwYy0+Y3JwX3JwYyk7CkBAIC03MDUsNyArNzA1LDcgQEAKIAogCUxBU1NFUlQoaSA8IG5raW92KTsKIAotCXBpZCA9IChsbmV0X3Byb2Nlc3NfaWRfcGFja2VkX3QgKilwYWdlX2FkZHJlc3Moa2lvdltpXS5raW92X3BhZ2UpOworCXBpZCA9IChsbmV0X3Byb2Nlc3NfaWRfcGFja2VkX3QgKilwYWdlX2FkZHJlc3Moa2lvdltpXS5idl9wYWdlKTsKIAogCXJldHVybiAmcGlkW2lkeCAlIFNGV19JRF9QRVJfUEFHRV07CiB9CkBAIC04NDksMTIgKzg0OSwxMSBAQAogCQkJICAgICAgbWluX3QoaW50LCBub2IsIFBBR0VfU0laRSk7CiAJCQlub2IgLT0gbGVuOwogCi0JCQlidWxrLT5ia19pb3ZzW2ldLmtpb3Zfb2Zmc2V0ID0gMDsKLQkJCWJ1bGstPmJrX2lvdnNbaV0ua2lvdl9sZW4gPSBsZW47Ci0JCQlidWxrLT5ia19pb3ZzW2ldLmtpb3ZfcGFnZSA9Ci0JCQkJYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwkJCWJ1bGstPmJrX2lvdnNbaV0uYnZfb2Zmc2V0ID0gMDsKKwkJCWJ1bGstPmJrX2lvdnNbaV0uYnZfbGVuID0gbGVuOworCQkJYnVsay0+YmtfaW92c1tpXS5idl9wYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKIAotCQkJaWYgKCFidWxrLT5ia19pb3ZzW2ldLmtpb3ZfcGFnZSkgeworCQkJaWYgKCFidWxrLT5ia19pb3ZzW2ldLmJ2X3BhZ2UpIHsKIAkJCQlsc3Rjb25fcnBjX3B1dCgqY3JwYyk7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29uc29sZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnNvbGUuYwppbmRleCA0YzMzNjIxLi5hMGZjYmYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29uc29sZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25zb2xlLmMKQEAgLTE5OTMsOCArMTk5Myw2IEBACiAJbHN0Y29uX2FjY2VwdG9yX3NlcnZpY2Uuc3Zfd2lfdG90YWwgPSBTRldfRlJXS19XSV9NQVg7CiB9CiAKLWV4dGVybiBpbnQgbHN0Y29uX2lvY3RsX2VudHJ5KHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBsaWJjZnNfaW9jdGxfaGRyICpoZHIpOwotCiBzdGF0aWMgREVDTEFSRV9JT0NUTF9IQU5ETEVSKGxzdGNvbl9pb2N0bF9oYW5kbGVyLCBsc3Rjb25faW9jdGxfZW50cnkpOwogCiAvKiBpbml0aWFsaXplIGNvbnNvbGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25zb2xlLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29uc29sZS5oCmluZGV4IDc4YjE0NzcuLjc4Mzg4YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25zb2xlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnNvbGUuaApAQCAtMTg0LDYgKzE4NCw3IEBACiAJcmV0dXJuICZoYXNoW2lkeF07CiB9CiAKK2ludCBsc3Rjb25faW9jdGxfZW50cnkodW5zaWduZWQgaW50IGNtZCwgc3RydWN0IGxpYmNmc19pb2N0bF9oZHIgKmhkcik7CiBpbnQgbHN0Y29uX2NvbnNvbGVfaW5pdCh2b2lkKTsKIGludCBsc3Rjb25fY29uc29sZV9maW5pKHZvaWQpOwogaW50IGxzdGNvbl9zZXNzaW9uX21hdGNoKGxzdF9zaWRfdCBzaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2ZyYW1ld29yay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2ZyYW1ld29yay5jCmluZGV4IGMyZjEyMWYuLmFiYmQ2MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9mcmFtZXdvcmsuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvZnJhbWV3b3JrLmMKQEAgLTc4NCw4ICs3ODQsOCBAQAogCQlsbmV0X3Byb2Nlc3NfaWRfcGFja2VkX3QgaWQ7CiAJCWludCBqOwogCi0JCWRlc3RzID0gcGFnZV9hZGRyZXNzKGJrLT5ia19pb3ZzW2kgLyBTRldfSURfUEVSX1BBR0VdLmtpb3ZfcGFnZSk7Ci0JCUxBU1NFUlQoZGVzdHMpOwkJLyogbXkgcGFnZXMgYXJlIHdpdGhpbiBLVk0gYWx3YXlzICovCisJCWRlc3RzID0gcGFnZV9hZGRyZXNzKGJrLT5ia19pb3ZzW2kgLyBTRldfSURfUEVSX1BBR0VdLmJ2X3BhZ2UpOworCQlMQVNTRVJUKGRlc3RzKTsgIC8qIG15IHBhZ2VzIGFyZSB3aXRoaW4gS1ZNIGFsd2F5cyAqLwogCQlpZCA9IGRlc3RzW2kgJSBTRldfSURfUEVSX1BBR0VdOwogCQlpZiAobXNnLT5tc2dfbWFnaWMgIT0gU1JQQ19NU0dfTUFHSUMpCiAJCQlzZndfdW5wYWNrX2lkKGlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9ycGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9ycGMuYwppbmRleCAzYjI2ZDZlLi5mNTYxOWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvcnBjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L3JwYy5jCkBAIC05MSw5ICs5MSw5IEBACiAJTEFTU0VSVChub2IgPiAwKTsKIAlMQVNTRVJUKGkgPj0gMCAmJiBpIDwgYmstPmJrX25pb3YpOwogCi0JYmstPmJrX2lvdnNbaV0ua2lvdl9vZmZzZXQgPSAwOwotCWJrLT5ia19pb3ZzW2ldLmtpb3ZfcGFnZSA9IHBnOwotCWJrLT5ia19pb3ZzW2ldLmtpb3ZfbGVuID0gbm9iOworCWJrLT5ia19pb3ZzW2ldLmJ2X29mZnNldCA9IDA7CisJYmstPmJrX2lvdnNbaV0uYnZfcGFnZSA9IHBnOworCWJrLT5ia19pb3ZzW2ldLmJ2X2xlbiA9IG5vYjsKIAlyZXR1cm4gbm9iOwogfQogCkBAIC0xMDYsNyArMTA2LDcgQEAKIAlMQVNTRVJUKGJrKTsKIAogCWZvciAoaSA9IDA7IGkgPCBiay0+YmtfbmlvdjsgaSsrKSB7Ci0JCXBnID0gYmstPmJrX2lvdnNbaV0ua2lvdl9wYWdlOworCQlwZyA9IGJrLT5ia19pb3ZzW2ldLmJ2X3BhZ2U7CiAJCWlmICghcGcpCiAJCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmlkL2ZpZF9saWIuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZpZC9maWRfbGliLmMKaW5kZXggOTlhZTdlYi4uNGU0OWNiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmlkL2ZpZF9saWIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9maWQvZmlkX2xpYi5jCkBAIC02MywxNCArNjMsMTIgQEAKIAlGSURfU0VRX05PUk1BTCwKIAkoX191NjQpfjBVTEwKIH07Ci1FWFBPUlRfU1lNQk9MKExVU1RSRV9TRVFfU1BBQ0VfUkFOR0UpOwogCiAvKiBaZXJvIHJhbmdlLCB1c2VkIGZvciBpbml0IGFuZCBvdGhlciBwdXJwb3Nlcy4gKi8KIGNvbnN0IHN0cnVjdCBsdV9zZXFfcmFuZ2UgTFVTVFJFX1NFUV9aRVJPX1JBTkdFID0gewogCTAsCiAJMAogfTsKLUVYUE9SVF9TWU1CT0woTFVTVFJFX1NFUV9aRVJPX1JBTkdFKTsKIAogLyogTHVzdHJlIEJpZyBGcyBMb2NrIGZpZC4gKi8KIGNvbnN0IHN0cnVjdCBsdV9maWQgTFVTVFJFX0JGTF9GSUQgPSB7IC5mX3NlcSA9IEZJRF9TRVFfU1BFQ0lBTCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZpZC9maWRfcmVxdWVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmlkL2ZpZF9yZXF1ZXN0LmMKaW5kZXggNDU0NzQ0ZC4uZWRkNzJiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmlkL2ZpZF9yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmlkL2ZpZF9yZXF1ZXN0LmMKQEAgLTEyNSwxOSArMTI1LDE5IEBACiAKIAlpZiAoIXJhbmdlX2lzX3NhbmUob3V0cHV0KSkgewogCQlDRVJST1IoIiVzOiBJbnZhbGlkIHJhbmdlIHJlY2VpdmVkIGZyb20gc2VydmVyOiAiCi0JCSAgICAgICBEUkFOR0UiXG4iLCBzZXEtPmxjc19uYW1lLCBQUkFOR0Uob3V0cHV0KSk7CisJCSAgICAgICBEUkFOR0UgIlxuIiwgc2VxLT5sY3NfbmFtZSwgUFJBTkdFKG91dHB1dCkpOwogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X3JlcTsKIAl9CiAKIAlpZiAocmFuZ2VfaXNfZXhoYXVzdGVkKG91dHB1dCkpIHsKIAkJQ0VSUk9SKCIlczogUmFuZ2UgcmVjZWl2ZWQgZnJvbSBzZXJ2ZXIgaXMgZXhoYXVzdGVkOiAiCi0JCSAgICAgICBEUkFOR0UiXVxuIiwgc2VxLT5sY3NfbmFtZSwgUFJBTkdFKG91dHB1dCkpOworCQkgICAgICAgRFJBTkdFICJdXG4iLCBzZXEtPmxjc19uYW1lLCBQUkFOR0Uob3V0cHV0KSk7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXRfcmVxOwogCX0KIAotCUNERUJVR19MSU1JVChkZWJ1Z19tYXNrLCAiJXM6IEFsbG9jYXRlZCAlcy1zZXF1ZW5jZSAiRFJBTkdFIl1cbiIsCisJQ0RFQlVHX0xJTUlUKGRlYnVnX21hc2ssICIlczogQWxsb2NhdGVkICVzLXNlcXVlbmNlICIgRFJBTkdFICJdXG4iLAogCQkgICAgIHNlcS0+bGNzX25hbWUsIG9wY25hbWUsIFBSQU5HRShvdXRwdXQpKTsKIAogb3V0X3JlcToKQEAgLTE3OSw3ICsxNzksNyBAQAogCQkJICAgICAgIHNlcS0+bGNzX25hbWUsIHJjKTsKIAkJCXJldHVybiByYzsKIAkJfQotCQlDREVCVUcoRF9JTkZPLCAiJXM6IE5ldyByYW5nZSAtICJEUkFOR0UiXG4iLAorCQlDREVCVUcoRF9JTkZPLCAiJXM6IE5ldyByYW5nZSAtICIgRFJBTkdFICJcbiIsCiAJCSAgICAgICBzZXEtPmxjc19uYW1lLCBQUkFOR0UoJnNlcS0+bGNzX3NwYWNlKSk7CiAJfSBlbHNlIHsKIAkJcmMgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmlkL2xwcm9jX2ZpZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmlkL2xwcm9jX2ZpZC5jCmluZGV4IDgxYjdjYTkuLjNlZDMyZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZpZC9scHJvY19maWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9maWQvbHByb2NfZmlkLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCXJjID0gbGRlYnVnZnNfZmlkX3dyaXRlX2NvbW1vbihidWZmZXIsIGNvdW50LCAmc2VxLT5sY3Nfc3BhY2UpOwogCiAJaWYgKHJjID09IDApIHsKLQkJQ0RFQlVHKERfSU5GTywgIiVzOiBTcGFjZTogIkRSQU5HRSJcbiIsCisJCUNERUJVRyhEX0lORk8sICIlczogU3BhY2U6ICIgRFJBTkdFICJcbiIsCiAJCSAgICAgICBzZXEtPmxjc19uYW1lLCBQUkFOR0UoJnNlcS0+bGNzX3NwYWNlKSk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX2ludGVybmFsLmgKaW5kZXggZjBlZmU1Yi4uMDhlYWVjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfaW50ZXJuYWwuaApAQCAtMzEsNiArMzEsMjUgQEAKICAqCiAgKiBsdXN0cmUvZmxkL2ZsZF9pbnRlcm5hbC5oCiAgKgorICogU3Vic3lzdGVtIERlc2NyaXB0aW9uOgorICogRkxEIGlzIEZJRCBMb2NhdGlvbiBEYXRhYmFzZSwgd2hpY2ggc3RvcmVzIHdoZXJlIChJRSwgb24gd2hpY2ggTURUKQorICogRklEcyBhcmUgbG9jYXRlZC4KKyAqIFRoZSBkYXRhYmFzZSBpcyBiYXNpY2FsbHkgYSByZWNvcmQgZmlsZSwgZWFjaCByZWNvcmQgY29uc2lzdHMgb2YgYSBGSUQKKyAqIHNlcXVlbmNlIHJhbmdlLCBNRFQvT1NUIGluZGV4LCBhbmQgZmxhZ3MuIFRoZSBGTEQgZm9yIHRoZSB3aG9sZSBGUworICogaXMgb25seSBzdG9yZWQgb24gdGhlIHNlcXVlbmNlIGNvbnRyb2xsZXIoTURUMCkgcmlnaHQgbm93LCBidXQgZWFjaCB0YXJnZXQKKyAqIGFsc28gaGFzIGl0cyBsb2NhbCBGTEQsIHdoaWNoIG9ubHkgc3RvcmVzIHRoZSBsb2NhbCBzZXF1ZW5jZS4KKyAqCisgKiBUaGUgRkxEIHN1YnN5c3RlbSB1c3VhbGx5IGhhcyB0d28gdGFza3M6CisgKiAxLiBtYWludGFpbiB0aGUgZGF0YWJhc2UsIGkuZS4gd2hlbiB0aGUgc2VxdWVuY2UgY29udHJvbGxlciBhbGxvY2F0ZXMKKyAqIG5ldyBzZXF1ZW5jZSByYW5nZXMgdG8gc29tZSBub2RlcywgaXQgd2lsbCBjYWxsIHRoZSBGTEQgQVBJIHRvIGluc2VydCB0aGUKKyAqIGxvY2F0aW9uIGluZm9ybWF0aW9uIDxzZXF1ZW5jZV9yYW5nZSwgbm9kZV9pbmRleD4gaW4gRkxEQi4KKyAqCisgKiAyLiBIYW5kbGUgcmVxdWVzdHMgZnJvbSBvdGhlciBub2RlcywgaS5lLiBpZiBjbGllbnQgbmVlZHMgdG8ga25vdyB3aGVyZQorICogdGhlIEZJRCBpcyBsb2NhdGVkLCBpZiBpdCBjYW4gbm90IGZpbmQgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBsb2NhbCBjYWNoZSwKKyAqIGl0IHdpbGwgc2VuZCBhIEZMRCBsb29rdXAgUlBDIHRvIHRoZSBGTEQgc2VydmljZSwgYW5kIHRoZSBGTEQgc2VydmljZSB3aWxsCisgKiBsb29rIHVwIHRoZSBGTERCIGVudHJ5IGFuZCByZXR1cm4gdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGNsaWVudC4KKyAqCisgKgogICogQXV0aG9yOiBZdXJ5IFVtYW5ldHMgPHVta2FAY2x1c3RlcmZzLmNvbT4KICAqIEF1dGhvcjogVG9tIFdhbmdEaSA8d2FuZ2RpQGNsdXN0ZXJmcy5jb20+CiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfcmVxdWVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9yZXF1ZXN0LmMKaW5kZXggZTU5ZDYyNi4uMGRlNzJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9yZXF1ZXN0LmMKQEAgLTUzLDU3ICs1Myw2IEBACiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbWRjLmgiCiAjaW5jbHVkZSAiZmxkX2ludGVybmFsLmgiCiAKLS8qIFRPRE86IHRoZXNlIDMgZnVuY3Rpb25zIGFyZSBjb3BpZXMgb2YgZmxvdy1jb250cm9sIGNvZGUgZnJvbSBtZGNfbGliLmMKLSAqIEl0IHNob3VsZCBiZSBjb21tb24gdGhpbmcuIFRoZSBzYW1lIGFib3V0IG1kYyBSUEMgbG9jawotICovCi1zdGF0aWMgaW50IGZsZF9yZXFfYXZhaWwoc3RydWN0IGNsaWVudF9vYmQgKmNsaSwgc3RydWN0IG1kY19jYWNoZV93YWl0ZXIgKm1jdykKLXsKLQlpbnQgcmM7Ci0KLQlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JcmMgPSBsaXN0X2VtcHR5KCZtY3ctPm1jd19lbnRyeSk7Ci0Jc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JcmV0dXJuIHJjOwotfTsKLQotc3RhdGljIHZvaWQgZmxkX2VudGVyX3JlcXVlc3Qoc3RydWN0IGNsaWVudF9vYmQgKmNsaSkKLXsKLQlzdHJ1Y3QgbWRjX2NhY2hlX3dhaXRlciBtY3c7Ci0Jc3RydWN0IGxfd2FpdF9pbmZvIGx3aSA9IHsgMCB9OwotCi0Jc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCWlmIChjbGktPmNsX3JfaW5fZmxpZ2h0ID49IGNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0KSB7Ci0JCWxpc3RfYWRkX3RhaWwoJm1jdy5tY3dfZW50cnksICZjbGktPmNsX2NhY2hlX3dhaXRlcnMpOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtY3cubWN3X3dhaXRxKTsKLQkJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JCWxfd2FpdF9ldmVudChtY3cubWN3X3dhaXRxLCBmbGRfcmVxX2F2YWlsKGNsaSwgJm1jdyksICZsd2kpOwotCX0gZWxzZSB7Ci0JCWNsaS0+Y2xfcl9pbl9mbGlnaHQrKzsKLQkJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBmbGRfZXhpdF9yZXF1ZXN0KHN0cnVjdCBjbGllbnRfb2JkICpjbGkpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbCwgKnRtcDsKLQlzdHJ1Y3QgbWRjX2NhY2hlX3dhaXRlciAqbWN3OwotCi0Jc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCWNsaS0+Y2xfcl9pbl9mbGlnaHQtLTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUobCwgdG1wLCAmY2xpLT5jbF9jYWNoZV93YWl0ZXJzKSB7Ci0JCWlmIChjbGktPmNsX3JfaW5fZmxpZ2h0ID49IGNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0KSB7Ci0JCQkvKiBObyBmcmVlIHJlcXVlc3Qgc2xvdHMgYW55bW9yZSAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQltY3cgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBtZGNfY2FjaGVfd2FpdGVyLCBtY3dfZW50cnkpOwotCQlsaXN0X2RlbF9pbml0KCZtY3ctPm1jd19lbnRyeSk7Ci0JCWNsaS0+Y2xfcl9pbl9mbGlnaHQrKzsKLQkJd2FrZV91cCgmbWN3LT5tY3dfd2FpdHEpOwotCX0KLQlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLX0KLQogc3RhdGljIGludCBmbGRfcnJiX2hhc2goc3RydWN0IGx1X2NsaWVudF9mbGQgKmZsZCwgdTY0IHNlcSkKIHsKIAlMQVNTRVJUKGZsZC0+bGNmX2NvdW50ID4gMCk7CkBAIC0yNzAsNyArMjE5LDYgQEAKIAlzcGluX3VubG9jaygmZmxkLT5sY2ZfbG9jayk7CiAJcmV0dXJuIC1FTk9FTlQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGZsZF9jbGllbnRfZGVsX3RhcmdldCk7CiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpmbGRfZGVidWdmc19kaXI7CiAKQEAgLTQzOSw5ICszODcsOSBAQAogCXJlcS0+cnFfcmVwbHlfcG9ydGFsID0gTURDX1JFUExZX1BPUlRBTDsKIAlwdGxycGNfYXRfc2V0X3JlcV90aW1lb3V0KHJlcSk7CiAKLQlmbGRfZW50ZXJfcmVxdWVzdCgmZXhwLT5leHBfb2JkLT51LmNsaSk7CisJb2JkX2dldF9yZXF1ZXN0X3Nsb3QoJmV4cC0+ZXhwX29iZC0+dS5jbGkpOwogCXJjID0gcHRscnBjX3F1ZXVlX3dhaXQocmVxKTsKLQlmbGRfZXhpdF9yZXF1ZXN0KCZleHAtPmV4cF9vYmQtPnUuY2xpKTsKKwlvYmRfcHV0X3JlcXVlc3Rfc2xvdCgmZXhwLT5leHBfb2JkLT51LmNsaSk7CiAJaWYgKHJjKQogCQlnb3RvIG91dF9yZXE7CiAKQEAgLTUwNSw3ICs0NTMsNiBAQAogewogCWZsZF9jYWNoZV9mbHVzaChmbGQtPmxjZl9jYWNoZSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGZsZF9jbGllbnRfZmx1c2gpOwogCiBzdGF0aWMgaW50IF9faW5pdCBmbGRfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9jbF9vYmplY3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvY2xfb2JqZWN0LmgKaW5kZXggM2NkNGEyNS4uODkyOTJjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9jbF9vYmplY3QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2NsX29iamVjdC5oCkBAIC05Myw4ICs5Myw4IEBACiAgKiBzdXBlci1jbGFzcyBkZWZpbml0aW9ucy4KICAqLwogI2luY2x1ZGUgImx1X29iamVjdC5oIgorI2luY2x1ZGUgImx1c3RyZV9jb21wYXQuaCIKICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlICJsaW51eC9sdXN0cmVfY29tcGF0MjUuaCIKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3JhZGl4LXRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpAQCAtMTkxLDYgKzE5MSw5IEBACiAJICogR3JvdXAgaWRlbnRpZmllciBmb3IgcXVvdGEgcHVycG9zZXMuCiAJICovCiAJZ2lkX3QgIGNhdF9naWQ7CisKKwkvKiBubGluayBvZiB0aGUgZGlyZWN0b3J5ICovCisJX191NjQgIGNhdF9ubGluazsKIH07CiAKIC8qKgpAQCAtMzIwLDcgKzMyMyw3IEBACiAJICoJIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiBuZXdseSBjcmVhdGVkLgogCSAqLwogCWludCAgKCpjb29fcGFnZV9pbml0KShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKLQkJCQlzdHJ1Y3QgY2xfcGFnZSAqcGFnZSwgcGdvZmZfdCBpbmRleCk7CisJCQkgICAgICBzdHJ1Y3QgY2xfcGFnZSAqcGFnZSwgcGdvZmZfdCBpbmRleCk7CiAJLyoqCiAJICogSW5pdGlhbGl6ZSBsb2NrIHNsaWNlIGZvciB0aGlzIGxheWVyLiBDYWxsZWQgdG9wLXRvLWJvdHRvbSB0aHJvdWdoCiAJICogZXZlcnkgb2JqZWN0IGxheWVyIHdoZW4gYSBuZXcgY2xfbG9jayBpcyBpbnN0YW50aWF0ZWQuIExheWVyCkBAIC0zNjYsOCArMzY5LDggQEAKIAkgKiBccmV0dXJuIHRoZSBzYW1lIGNvbnZlbnRpb24gYXMgZm9yCiAJICogY2xfb2JqZWN0X29wZXJhdGlvbnM6OmNvb19hdHRyX2dldCgpIGlzIHVzZWQuCiAJICovCi0JaW50ICgqY29vX2F0dHJfc2V0KShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgY2xfYXR0ciAqYXR0ciwgdW5zaWduZWQgdmFsaWQpOworCWludCAoKmNvb19hdHRyX3VwZGF0ZSkoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGNsX2F0dHIgKmF0dHIsIHVuc2lnbmVkIGludCB2YWxpZCk7CiAJLyoqCiAJICogVXBkYXRlIG9iamVjdCBjb25maWd1cmF0aW9uLiBDYWxsZWQgdG9wLXRvLWJvdHRvbSB0byBtb2RpZnkgb2JqZWN0CiAJICogY29uZmlndXJhdGlvbi4KQEAgLTM5Miw2ICszOTUsMTEgQEAKIAkgKiBtYWlubHkgcGFnZXMgYW5kIGxvY2tzLgogCSAqLwogCWludCAoKmNvb19wcnVuZSkoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmopOworCS8qKgorCSAqIE9iamVjdCBnZXRzdHJpcGUgbWV0aG9kLgorCSAqLworCWludCAoKmNvb19nZXRzdHJpcGUpKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAorCQkJICAgICBzdHJ1Y3QgbG92X3VzZXJfbWQgX191c2VyICpsdW0pOwogfTsKIAogLyoqCkBAIC02ODcsMTcgKzY5NSw2IEBACiB9OwogCiAvKioKLSAqIEZsYWdzIG1haW50YWluZWQgZm9yIGV2ZXJ5IGNsX3BhZ2UuCi0gKi8KLWVudW0gY2xfcGFnZV9mbGFncyB7Ci0JLyoqCi0JICogU2V0IHdoZW4gcGFnZWluIGNvbXBsZXRlcy4gVXNlZCBmb3IgZGVidWdnaW5nIChyZWFkIGNvbXBsZXRlcyBhdAotCSAqIG1vc3Qgb25jZSBmb3IgYSBwYWdlKS4KLQkgKi8KLQlDUEZfUkVBRF9DT01QTEVURUQgPSAxIDw8IDAKLX07Ci0KLS8qKgogICogRmllbGRzIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIGxvY2sgb24gc3RydWN0IHBhZ2UsIGV4Y2VwdCBmb3IgYXRvbWljcyBhbmQKICAqIGltbXV0YWJsZXMuCiAgKgpAQCAtNzExLDI0ICs3MDgsMTkgQEAKIAlhdG9taWNfdAkgICAgIGNwX3JlZjsKIAkvKiogQW4gb2JqZWN0IHRoaXMgcGFnZSBpcyBhIHBhcnQgb2YuIEltbXV0YWJsZSBhZnRlciBjcmVhdGlvbi4gKi8KIAlzdHJ1Y3QgY2xfb2JqZWN0CSpjcF9vYmo7Ci0JLyoqIExpc3Qgb2Ygc2xpY2VzLiBJbW11dGFibGUgYWZ0ZXIgY3JlYXRpb24uICovCi0Jc3RydWN0IGxpc3RfaGVhZAkgICAgICAgY3BfbGF5ZXJzOwogCS8qKiB2bXBhZ2UgKi8KIAlzdHJ1Y3QgcGFnZQkJKmNwX3ZtcGFnZTsKKwkvKiogTGlua2FnZSBvZiBwYWdlcyB3aXRoaW4gZ3JvdXAuIFBhZ2VzIG11c3QgYmUgb3duZWQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCSBjcF9iYXRjaDsKKwkvKiogTGlzdCBvZiBzbGljZXMuIEltbXV0YWJsZSBhZnRlciBjcmVhdGlvbi4gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCSBjcF9sYXllcnM7CisJLyoqIExpbmthZ2Ugb2YgcGFnZXMgd2l0aGluIGNsX3JlcS4gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgY3BfZmxpZ2h0OwogCS8qKgogCSAqIFBhZ2Ugc3RhdGUuIFRoaXMgZmllbGQgaXMgY29uc3QgdG8gYXZvaWQgYWNjaWRlbnRhbCB1cGRhdGUsIGl0IGlzCiAJICogbW9kaWZpZWQgb25seSBpbnRlcm5hbGx5IHdpdGhpbiBjbF9wYWdlLmMuIFByb3RlY3RlZCBieSBhIFZNIGxvY2suCiAJICovCiAJY29uc3QgZW51bSBjbF9wYWdlX3N0YXRlIGNwX3N0YXRlOwotCS8qKiBMaW5rYWdlIG9mIHBhZ2VzIHdpdGhpbiBncm91cC4gUHJvdGVjdGVkIGJ5IGNsX3BhZ2U6OmNwX211dGV4LiAqLwotCXN0cnVjdCBsaXN0X2hlYWQJCWNwX2JhdGNoOwotCS8qKiBNdXRleCBzZXJpYWxpemluZyBtZW1iZXJzaGlwIG9mIGEgcGFnZSBpbiBhIGJhdGNoLiAqLwotCXN0cnVjdCBtdXRleAkJY3BfbXV0ZXg7Ci0JLyoqIExpbmthZ2Ugb2YgcGFnZXMgd2l0aGluIGNsX3JlcS4gKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgICBjcF9mbGlnaHQ7Ci0JLyoqIFRyYW5zZmVyIGVycm9yLiAqLwotCWludAkJICAgICAgY3BfZXJyb3I7Ci0KIAkvKioKIAkgKiBQYWdlIHR5cGUuIE9ubHkgQ1BUX1RSQU5TSUVOVCBpcyB1c2VkIHNvIGZhci4gSW1tdXRhYmxlIGFmdGVyCiAJICogY3JlYXRpb24uCkBAIC03NDEsMTAgKzczMyw2IEBACiAJICovCiAJc3RydWN0IGNsX2lvCSAgICAqY3Bfb3duZXI7CiAJLyoqCi0JICogRGVidWcgaW5mb3JtYXRpb24sIHRoZSB0YXNrIGlzIG93bmluZyB0aGUgcGFnZS4KLQkgKi8KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QJKmNwX3Rhc2s7Ci0JLyoqCiAJICogT3duaW5nIElPIHJlcXVlc3QgaW4gY2xfcGFnZV9zdGF0ZTo6Q1BTX1BBR0VPVVQgYW5kCiAJICogY2xfcGFnZV9zdGF0ZTo6Q1BTX1BBR0VJTiBzdGF0ZXMuIFRoaXMgZmllbGQgaXMgbWFpbnRhaW5lZCBvbmx5IGluCiAJICogdGhlIHRvcC1sZXZlbCBwYWdlcy4gUHJvdGVjdGVkIGJ5IGEgVk0gbG9jay4KQEAgLTc1Niw4ICs3NDQsNiBAQAogCXN0cnVjdCBsdV9yZWZfbGluayAgICAgICBjcF9vYmpfcmVmOwogCS8qKiBMaW5rIHRvIGEgcXVldWUsIGZvciBkZWJ1Z2dpbmcuICovCiAJc3RydWN0IGx1X3JlZl9saW5rICAgICAgIGNwX3F1ZXVlX3JlZjsKLQkvKiogUGVyLXBhZ2UgZmxhZ3MgZnJvbSBlbnVtIGNsX3BhZ2VfZmxhZ3MuIFByb3RlY3RlZCBieSBhIFZNIGxvY2suICovCi0JdW5zaWduZWQgICAgICAgICAgICAgICAgIGNwX2ZsYWdzOwogCS8qKiBBc3NpZ25lZCBpZiBkb2luZyBhIHN5bmNfaW8gKi8KIAlzdHJ1Y3QgY2xfc3luY19pbyAgICAgICAqY3Bfc3luY19pbzsKIH07CkBAIC0xMDU2LDIzICsxMDQyLDMyIEBACiAJfQkJCQkJCQkJICAgICBcCiB9IHdoaWxlICgwKQogCi1zdGF0aWMgaW5saW5lIGludCBfX3BhZ2VfaW5fdXNlKGNvbnN0IHN0cnVjdCBjbF9wYWdlICpwYWdlLCBpbnQgcmVmYykKLXsKLQlpZiAocGFnZS0+Y3BfdHlwZSA9PSBDUFRfQ0FDSEVBQkxFKQotCQkrK3JlZmM7Ci0JTEFTU0VSVChhdG9taWNfcmVhZCgmcGFnZS0+Y3BfcmVmKSA+IDApOwotCXJldHVybiAoYXRvbWljX3JlYWQoJnBhZ2UtPmNwX3JlZikgPiByZWZjKTsKLX0KLQotI2RlZmluZSBjbF9wYWdlX2luX3VzZShwZykgICAgICAgX19wYWdlX2luX3VzZShwZywgMSkKLSNkZWZpbmUgY2xfcGFnZV9pbl91c2Vfbm9yZWYocGcpIF9fcGFnZV9pbl91c2UocGcsIDApCi0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKmNsX3BhZ2Vfdm1wYWdlKHN0cnVjdCBjbF9wYWdlICpwYWdlKQogewogCUxBU1NFUlQocGFnZS0+Y3Bfdm1wYWdlKTsKIAlyZXR1cm4gcGFnZS0+Y3Bfdm1wYWdlOwogfQogCisvKioKKyAqIENoZWNrIGlmIGEgY2xfcGFnZSBpcyBpbiB1c2UuCisgKgorICogQ2xpZW50IGNhY2hlIGhvbGRzIGEgcmVmY291bnQsIHRoaXMgcmVmY291bnQgd2lsbCBiZSBkcm9wcGVkIHdoZW4KKyAqIHRoZSBwYWdlIGlzIHRha2VuIG91dCBvZiBjYWNoZSwgc2VlIHZ2cF9wYWdlX2RlbGV0ZSgpLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgX19wYWdlX2luX3VzZShjb25zdCBzdHJ1Y3QgY2xfcGFnZSAqcGFnZSwgaW50IHJlZmMpCit7CisJcmV0dXJuIChhdG9taWNfcmVhZCgmcGFnZS0+Y3BfcmVmKSA+IHJlZmMgKyAxKTsKK30KKworLyoqCisgKiBDYWxsZXIgaXRzZWxmIGhvbGRzIGEgcmVmY291bnQgb2YgY2xfcGFnZS4KKyAqLworI2RlZmluZSBjbF9wYWdlX2luX3VzZShwZykJIF9fcGFnZV9pbl91c2UocGcsIDEpCisvKioKKyAqIENhbGxlciBkb2Vzbid0IGhvbGQgYSByZWZjb3VudC4KKyAqLworI2RlZmluZSBjbF9wYWdlX2luX3VzZV9ub3JlZihwZykgX19wYWdlX2luX3VzZShwZywgMCkKKwogLyoqIEB9IGNsX3BhZ2UgKi8KIAogLyoqIFxhZGR0b2dyb3VwIGNsX2xvY2sgY2xfbG9jawpAQCAtMTc3MSwxMiArMTc2NiwxNCBAQAogCQlzdHJ1Y3QgY2xfc2V0YXR0cl9pbyB7CiAJCQlzdHJ1Y3Qgb3N0X2x2YiAgIHNhX2F0dHI7CiAJCQl1bnNpZ25lZCBpbnQgICAgIHNhX3ZhbGlkOworCQkJaW50CQlzYV9zdHJpcGVfaW5kZXg7CisJCQlzdHJ1Y3QgbHVfZmlkICAqc2FfcGFyZW50X2ZpZDsKIAkJfSBjaV9zZXRhdHRyOwogCQlzdHJ1Y3QgY2xfZmF1bHRfaW8gewogCQkJLyoqIHBhZ2UgaW5kZXggd2l0aGluIGZpbGUuICovCiAJCQlwZ29mZl90CSBmdF9pbmRleDsKIAkJCS8qKiBieXRlcyB2YWxpZCBieXRlIG9uIGEgZmF1bHRlZCBwYWdlLiAqLwotCQkJaW50CSAgICAgZnRfbm9iOworCQkJc2l6ZV90CSAgICAgZnRfbm9iOwogCQkJLyoqIHdyaXRhYmxlIHBhZ2U/IGZvciBub3BhZ2UoKSBvbmx5ICovCiAJCQlpbnQJICAgICBmdF93cml0YWJsZTsKIAkJCS8qKiBwYWdlIG9mIGFuIGV4ZWN1dGFibGU/ICovCkBAIC0xOTA5LDcgKzE5MDYsNyBAQAogCS8qKiBHZW5lcmljIGF0dHJpYnV0ZXMgZm9yIHRoZSBzZXJ2ZXIgY29uc3VtcHRpb24uICovCiAJc3RydWN0IG9iZG8JKmNyYV9vYTsKIAkvKiogSm9iaWQgKi8KLQljaGFyCQkgY3JhX2pvYmlkW0pPQlNUQVRTX0pPQklEX1NJWkVdOworCWNoYXIJCSBjcmFfam9iaWRbTFVTVFJFX0pPQklEX1NJWkVdOwogfTsKIAogLyoqCkBAIC0yMTc2LDE0ICsyMTczLDE2IEBACiB2b2lkIGNsX29iamVjdF9hdHRyX3VubG9jayhzdHJ1Y3QgY2xfb2JqZWN0ICpvKTsKIGludCAgY2xfb2JqZWN0X2F0dHJfZ2V0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAogCQkJc3RydWN0IGNsX2F0dHIgKmF0dHIpOwotaW50ICBjbF9vYmplY3RfYXR0cl9zZXQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCi0JCQljb25zdCBzdHJ1Y3QgY2xfYXR0ciAqYXR0ciwgdW5zaWduZWQgdmFsaWQpOworaW50ICBjbF9vYmplY3RfYXR0cl91cGRhdGUoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCisJCQkgICBjb25zdCBzdHJ1Y3QgY2xfYXR0ciAqYXR0ciwgdW5zaWduZWQgaW50IHZhbGlkKTsKIGludCAgY2xfb2JqZWN0X2dsaW1wc2UoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCiAJCSAgICAgICBzdHJ1Y3Qgb3N0X2x2YiAqbHZiKTsKIGludCAgY2xfY29uZl9zZXQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCiAJCSBjb25zdCBzdHJ1Y3QgY2xfb2JqZWN0X2NvbmYgKmNvbmYpOwogaW50IGNsX29iamVjdF9wcnVuZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaik7CiB2b2lkIGNsX29iamVjdF9raWxsKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqKTsKK2ludCAgY2xfb2JqZWN0X2dldHN0cmlwZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKKwkJCSBzdHJ1Y3QgbG92X3VzZXJfbWQgX191c2VyICpsdW0pOwogCiAvKioKICAqIFJldHVybnMgdHJ1ZSwgaWZmIFxhIG8wIGFuZCBcYSBvMSBhcmUgc2xpY2VzIG9mIHRoZSBzYW1lIG9iamVjdC4KQEAgLTIxOTcsNiArMjE5Niw3IEBACiB7CiAJY2xvYi0+Y29fc2xpY2Vfb2ZmID0gY2xfb2JqZWN0X2hlYWRlcihjbG9iKS0+Y29oX3BhZ2VfYnVmc2l6ZTsKIAljbF9vYmplY3RfaGVhZGVyKGNsb2IpLT5jb2hfcGFnZV9idWZzaXplICs9IGNmc19zaXplX3JvdW5kKHNpemUpOworCVdBUk5fT04oY2xfb2JqZWN0X2hlYWRlcihjbG9iKS0+Y29oX3BhZ2VfYnVmc2l6ZSA+IDUxMik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqY2xfb2JqZWN0X3BhZ2Vfc2xpY2Uoc3RydWN0IGNsX29iamVjdCAqY2xvYiwKQEAgLTIyNjMsNiArMjI2Myw4IEBACiAJCSAgICAgIHN0cnVjdCBjbF9pbyAqaW8sIHN0cnVjdCBjbF9wYWdlICpwZyk7CiB2b2lkIGNsX3BhZ2VfZGlzb3duKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKIAkJICAgIHN0cnVjdCBjbF9pbyAqaW8sIHN0cnVjdCBjbF9wYWdlICpwYWdlKTsKK3ZvaWQgY2xfcGFnZV9kaXNvd24wKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKKwkJICAgICBzdHJ1Y3QgY2xfaW8gKmlvLCBzdHJ1Y3QgY2xfcGFnZSAqcGcpOwogaW50IGNsX3BhZ2VfaXNfb3duZWQoY29uc3Qgc3RydWN0IGNsX3BhZ2UgKnBnLCBjb25zdCBzdHJ1Y3QgY2xfaW8gKmlvKTsKIAogLyoqIEB9IG93bmVyc2hpcCAqLwpAQCAtMjMwNCw3ICsyMzA2LDcgQEAKIAkJCSAgc3RydWN0IGNsX3BhZ2UgKnBhZ2UsIHBnb2ZmX3QgKm1heF9pbmRleCk7CiBsb2ZmX3QgY2xfb2Zmc2V0KGNvbnN0IHN0cnVjdCBjbF9vYmplY3QgKm9iaiwgcGdvZmZfdCBpZHgpOwogcGdvZmZfdCBjbF9pbmRleChjb25zdCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosIGxvZmZfdCBvZmZzZXQpOwotaW50IGNsX3BhZ2Vfc2l6ZShjb25zdCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmopOworc2l6ZV90IGNsX3BhZ2Vfc2l6ZShjb25zdCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmopOwogaW50IGNsX3BhZ2VzX3BydW5lKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqKTsKIAogdm9pZCBjbF9sb2NrX3ByaW50KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgdm9pZCAqY29va2llLApAQCAtMjMzMyw3ICsyMzM1LDcgQEAKIAkvKioKIAkgKiAjIG9mIExSVSBlbnRyaWVzIGF2YWlsYWJsZQogCSAqLwotCWF0b21pY190CQljY2NfbHJ1X2xlZnQ7CisJYXRvbWljX2xvbmdfdAkJY2NjX2xydV9sZWZ0OwogCS8qKgogCSAqIExpc3Qgb2YgZW50aXRpZXMoT1NDcykgZm9yIHRoaXMgTFJVIGNhY2hlCiAJICovCkBAIC0yMzQ3LDE0ICsyMzQ5LDE4IEBACiAJICovCiAJc3BpbmxvY2tfdAkJY2NjX2xydV9sb2NrOwogCS8qKgorCSAqIFNldCBpZiB1bnN0YWJsZSBjaGVjayBpcyBlbmFibGVkCisJICovCisJdW5zaWduZWQgaW50CQljY2NfdW5zdGFibGVfY2hlY2s6MTsKKwkvKioKIAkgKiAjIG9mIHVuc3RhYmxlIHBhZ2VzIGZvciB0aGlzIG1vdW50IHBvaW50CiAJICovCi0JYXRvbWljX3QJCWNjY191bnN0YWJsZV9ucjsKKwlhdG9taWNfbG9uZ190CQljY2NfdW5zdGFibGVfbnI7CiAJLyoqCiAJICogV2FpdHEgZm9yIGF3YWl0aW5nIHVuc3RhYmxlIHBhZ2VzIHRvIHJlYWNoIHplcm8uCiAJICogVXNlZCBhdCB1bW91bnRpbmcgdGltZSBhbmQgc2lnbmFsZWQgb24gQlJXIGNvbW1pdAogCSAqLwotICAgICAgICB3YWl0X3F1ZXVlX2hlYWRfdAljY2NfdW5zdGFibGVfd2FpdHE7CisJd2FpdF9xdWV1ZV9oZWFkX3QJY2NjX3Vuc3RhYmxlX3dhaXRxOwogCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2ludGVydmFsX3RyZWUuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvaW50ZXJ2YWxfdHJlZS5oCmluZGV4IDRhMTUyMjguLjVkMzg3ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvaW50ZXJ2YWxfdHJlZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvaW50ZXJ2YWxfdHJlZS5oCkBAIC02Myw2ICs2MywxMSBAQAogCXJldHVybiBub2RlLT5pbl9pbnRyZWUgPT0gMTsKIH0KIAorc3RhdGljIGlubGluZSBfX3U2NCBpbnRlcnZhbF9sb3coc3RydWN0IGludGVydmFsX25vZGUgKm5vZGUpCit7CisJcmV0dXJuIG5vZGUtPmluX2V4dGVudC5zdGFydDsKK30KKwogc3RhdGljIGlubGluZSBfX3U2NCBpbnRlcnZhbF9oaWdoKHN0cnVjdCBpbnRlcnZhbF9ub2RlICpub2RlKQogewogCXJldHVybiBub2RlLT5pbl9leHRlbnQuZW5kOwpAQCAtNzcsOCArODIsMjkgQEAKIAlub2RlLT5pbl9tYXhfaGlnaCA9IGVuZDsKIH0KIAorLyoKKyAqIFJ1bGVzIHRvIHdyaXRlIGFuIGludGVydmFsIGNhbGxiYWNrLgorICogIC0gdGhlIGNhbGxiYWNrIHJldHVybnMgSU5URVJWQUxfSVRFUl9TVE9QIHdoZW4gaXQgdGhpbmtzIHRoZSBpdGVyYXRpb24KKyAqICAgIHNob3VsZCBiZSBzdG9wcGVkLiBJdCB3aWxsIHRoZW4gY2F1c2UgdGhlIGl0ZXJhdGlvbiBmdW5jdGlvbiB0byByZXR1cm4KKyAqICAgIGltbWVkaWF0ZWx5IHdpdGggcmV0dXJuIHZhbHVlIElOVEVSVkFMX0lURVJfU1RPUC4KKyAqICAtIGNhbGxiYWNrcyBmb3IgaW50ZXJ2YWxfaXRlcmF0ZSBhbmQgaW50ZXJ2YWxfaXRlcmF0ZV9yZXZlcnNlOiBFdmVyeQorICogICAgbm9kZXMgaW4gdGhlIHRyZWUgd2lsbCBiZSBzZXQgdG8gQG5vZGUgYmVmb3JlIHRoZSBjYWxsYmFjayBiZWluZyBjYWxsZWQKKyAqICAtIGNhbGxiYWNrIGZvciBpbnRlcnZhbF9zZWFyY2g6IE9ubHkgb3ZlcmxhcHBlZCBub2RlIHdpbGwgYmUgc2V0IHRvIEBub2RlCisgKiAgICBiZWZvcmUgdGhlIGNhbGxiYWNrIGJlaW5nIGNhbGxlZC4KKyAqLwordHlwZWRlZiBlbnVtIGludGVydmFsX2l0ZXIgKCppbnRlcnZhbF9jYWxsYmFja190KShzdHJ1Y3QgaW50ZXJ2YWxfbm9kZSAqbm9kZSwKKwkJCQkJCSAgdm9pZCAqYXJncyk7CisKIHN0cnVjdCBpbnRlcnZhbF9ub2RlICppbnRlcnZhbF9pbnNlcnQoc3RydWN0IGludGVydmFsX25vZGUgKm5vZGUsCiAJCQkJICAgICAgc3RydWN0IGludGVydmFsX25vZGUgKipyb290KTsKIHZvaWQgaW50ZXJ2YWxfZXJhc2Uoc3RydWN0IGludGVydmFsX25vZGUgKm5vZGUsIHN0cnVjdCBpbnRlcnZhbF9ub2RlICoqcm9vdCk7CiAKKy8qCisgKiBTZWFyY2ggdGhlIGV4dGVudHMgaW4gdGhlIHRyZWUgYW5kIGNhbGwgQGZ1bmMgZm9yIGVhY2ggb3ZlcmxhcHBlZAorICogZXh0ZW50cy4KKyAqLworZW51bSBpbnRlcnZhbF9pdGVyIGludGVydmFsX3NlYXJjaChzdHJ1Y3QgaW50ZXJ2YWxfbm9kZSAqcm9vdCwKKwkJCQkgICBzdHJ1Y3QgaW50ZXJ2YWxfbm9kZV9leHRlbnQgKmV4LAorCQkJCSAgIGludGVydmFsX2NhbGxiYWNrX3QgZnVuYywgdm9pZCAqZGF0YSk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9sdXN0cmVfY29tcGF0MjUuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvbHVzdHJlX2NvbXBhdDI1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYjY0ZWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9sdXN0cmVfY29tcGF0MjUuaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBHUEwgSEVBREVSIFNUQVJUCi0gKgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LAotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZAotICogaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgSWYgbm90LCBzZWUKLSAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwKLSAqCi0gKiBHUEwgSEVBREVSIEVORAotICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIsIEludGVsIENvcnBvcmF0aW9uLgotICovCi0vKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTHVzdHJlLCBodHRwOi8vd3d3Lmx1c3RyZS5vcmcvCi0gKiBMdXN0cmUgaXMgYSB0cmFkZW1hcmsgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICovCi0KLSNpZm5kZWYgX0xJTlVYX0NPTVBBVDI1X0gKLSNkZWZpbmUgX0xJTlVYX0NPTVBBVDI1X0gKLQotI2luY2x1ZGUgPGxpbnV4L2ZzX3N0cnVjdC5oPgotI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+Ci0KLSNpbmNsdWRlICJsdXN0cmVfcGF0Y2hsZXNzX2NvbXBhdC5oIgotCi0vKgotICogc2V0IEFUVFJfQkxPQ0tTIHRvIGEgaGlnaCB2YWx1ZSB0byBhdm9pZCBhbnkgcmlzayBvZiBjb2xsaXNpb24gd2l0aCBvdGhlcgotICogQVRUUl8qIGF0dHJpYnV0ZXMgKHNlZSBidWcgMTM4MjgpCi0gKi8KLSNkZWZpbmUgQVRUUl9CTE9DS1MgICAgKDEgPDwgMjcpCi0KLSNkZWZpbmUgY3VycmVudF9uZ3JvdXBzIGN1cnJlbnRfY3JlZCgpLT5ncm91cF9pbmZvLT5uZ3JvdXBzCi0jZGVmaW5lIGN1cnJlbnRfZ3JvdXBzIGN1cnJlbnRfY3JlZCgpLT5ncm91cF9pbmZvLT5zbWFsbF9ibG9jawotCi0vKgotICogT0JEIG5lZWQgd29ya2luZyByYW5kb20gZHJpdmVyLCB0aHVzIGFsbCBvdXIKLSAqIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRldmljZQotICogZHJpdmVyIGluaXRpYWxpemF0aW9uCi0gKi8KLSNpZm5kZWYgTU9EVUxFCi0jdW5kZWYgbW9kdWxlX2luaXQKLSNkZWZpbmUgbW9kdWxlX2luaXQoYSkgICAgIGxhdGVfaW5pdGNhbGwoYSkKLSNlbmRpZgotCi0jZGVmaW5lIExUSU1FX1ModGltZSkJCSAgICh0aW1lLnR2X3NlYykKLQotI2lmbmRlZiBRVU9UQV9PSwotIyBkZWZpbmUgUVVPVEFfT0sgMAotI2VuZGlmCi0jaWZuZGVmIE5PX1FVT1RBCi0jIGRlZmluZSBOT19RVU9UQSAoLUVEUVVPVCkKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX0FTTV9HRU5FUklDX0JJVE9QU19FWFQyX05PTl9BVE9NSUNfSF8pICYmICFkZWZpbmVkKGV4dDJfc2V0X2JpdCkKLSMgZGVmaW5lIGV4dDJfc2V0X2JpdAkgICAgIF9fdGVzdF9hbmRfc2V0X2JpdF9sZQotIyBkZWZpbmUgZXh0Ml9jbGVhcl9iaXQJICAgX190ZXN0X2FuZF9jbGVhcl9iaXRfbGUKLSMgZGVmaW5lIGV4dDJfdGVzdF9iaXQJICAgIHRlc3RfYml0X2xlCi0jIGRlZmluZSBleHQyX2ZpbmRfZmlyc3RfemVyb19iaXQgZmluZF9maXJzdF96ZXJvX2JpdF9sZQotIyBkZWZpbmUgZXh0Ml9maW5kX25leHRfemVyb19iaXQgIGZpbmRfbmV4dF96ZXJvX2JpdF9sZQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfQ09NUEFUMjVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9sdXN0cmVfbGl0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9sdXN0cmVfbGl0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMThlOGE3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvbHVzdHJlX2xpdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBHUEwgSEVBREVSIFNUQVJUCi0gKgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LAotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZAotICogaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgSWYgbm90LCBzZWUKLSAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwKLSAqCi0gKiBHUEwgSEVBREVSIEVORAotICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcy4KLSAqLwotLyoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEx1c3RyZSwgaHR0cDovL3d3dy5sdXN0cmUub3JnLwotICogTHVzdHJlIGlzIGEgdHJhZGVtYXJrIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9MTF9ICi0jZGVmaW5lIF9MSU5VWF9MTF9ICi0KLSNpZm5kZWYgX0xMX0gKLSNlcnJvciBEbyBub3QgI2luY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiAjaW5jbHVkZSA8bHVzdHJlX2xpdGUuaD4gaW5zdGVhZAotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaW51eC9zdGF0ZnMuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+Ci0KLSNpbmNsdWRlICIuLi9vYmRfY2xhc3MuaCIKLSNpbmNsdWRlICIuLi9sdXN0cmVfbmV0LmgiCi0jaW5jbHVkZSAiLi4vbHVzdHJlX2hhLmgiCi0KLSNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L2x1c3RyZV9jb21wYXQyNS5oIgotI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KLQotLyogbHByb2Nmcy5jICovCi1lbnVtIHsKLQkgTFBST0NfTExfRElSVFlfSElUUyA9IDAsCi0JIExQUk9DX0xMX0RJUlRZX01JU1NFUywKLQkgTFBST0NfTExfUkVBRF9CWVRFUywKLQkgTFBST0NfTExfV1JJVEVfQllURVMsCi0JIExQUk9DX0xMX0JSV19SRUFELAotCSBMUFJPQ19MTF9CUldfV1JJVEUsCi0JIExQUk9DX0xMX09TQ19SRUFELAotCSBMUFJPQ19MTF9PU0NfV1JJVEUsCi0JIExQUk9DX0xMX0lPQ1RMLAotCSBMUFJPQ19MTF9PUEVOLAotCSBMUFJPQ19MTF9SRUxFQVNFLAotCSBMUFJPQ19MTF9NQVAsCi0JIExQUk9DX0xMX0xMU0VFSywKLQkgTFBST0NfTExfRlNZTkMsCi0JIExQUk9DX0xMX1JFQURESVIsCi0JIExQUk9DX0xMX1NFVEFUVFIsCi0JIExQUk9DX0xMX1RSVU5DLAotCSBMUFJPQ19MTF9GTE9DSywKLQkgTFBST0NfTExfR0VUQVRUUiwKLQkgTFBST0NfTExfQ1JFQVRFLAotCSBMUFJPQ19MTF9MSU5LLAotCSBMUFJPQ19MTF9VTkxJTkssCi0JIExQUk9DX0xMX1NZTUxJTkssCi0JIExQUk9DX0xMX01LRElSLAotCSBMUFJPQ19MTF9STURJUiwKLQkgTFBST0NfTExfTUtOT0QsCi0JIExQUk9DX0xMX1JFTkFNRSwKLQkgTFBST0NfTExfU1RBRlMsCi0JIExQUk9DX0xMX0FMTE9DX0lOT0RFLAotCSBMUFJPQ19MTF9TRVRYQVRUUiwKLQkgTFBST0NfTExfR0VUWEFUVFIsCi0JIExQUk9DX0xMX0dFVFhBVFRSX0hJVFMsCi0JIExQUk9DX0xMX0xJU1RYQVRUUiwKLQkgTFBST0NfTExfUkVNT1ZFWEFUVFIsCi0JIExQUk9DX0xMX0lOT0RFX1BFUk0sCi0JIExQUk9DX0xMX0ZJTEVfT1BDT0RFUwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2x1c3RyZV91c2VyLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2x1c3RyZV91c2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5Njc5NTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9sdXN0cmVfdXNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIEdQTCBIRUFERVIgU1RBUlQKLSAqCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkCi0gKiBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBJZiBub3QsIHNlZQotICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbAotICoKLSAqIEdQTCBIRUFERVIgRU5ECi0gKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMiwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKi8KLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMdXN0cmUsIGh0dHA6Ly93d3cubHVzdHJlLm9yZy8KLSAqIEx1c3RyZSBpcyBhIHRyYWRlbWFyayBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKgotICogbHVzdHJlL2luY2x1ZGUvbGludXgvbHVzdHJlX3VzZXIuaAotICoKLSAqIEx1c3RyZSBwdWJsaWMgdXNlci1zcGFjZSBpbnRlcmZhY2UgZGVmaW5pdGlvbnMuCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfTFVTVFJFX1VTRVJfSAotI2RlZmluZSBfTElOVVhfTFVTVFJFX1VTRVJfSAotCi0jIGluY2x1ZGUgPGxpbnV4L3F1b3RhLmg+Ci0KLS8qCi0gKiBhc20teDg2XzY0L3Byb2Nlc3Nvci5oIG9uIHNvbWUgU0xFUyA5IGRpc3Ryb3Mgc2VlbXMgdG8gdXNlCi0gKiBrZXJuZWwtb25seSB0eXBlZGVmcy4gIGZvcnR1bmF0ZWx5IHNraXBwaW5nIGl0IGFsdG9nZXRoZXIgaXMgb2sKLSAqIChmb3Igbm93KS4KLSAqLwotI2RlZmluZSBfX0FTTV9YODZfNjRfUFJPQ0VTU09SX0gKLQotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotCi0vKgotICogV2UgbmVlZCB0byBhbHdheXMgdXNlIDY0Yml0IHZlcnNpb24gYmVjYXVzZSB0aGUgc3RydWN0dXJlCi0gKiBpcyBzaGFyZWQgYWNyb3NzIGVudGlyZSBjbHVzdGVyIHdoZXJlIDMyYml0IGFuZCA2NGJpdCBtYWNoaW5lcwotICogYXJlIGNvLWV4aXN0aW5nLgotICovCi0jaWYgX19CSVRTX1BFUl9MT05HICE9IDY0IHx8IGRlZmluZWQoX19BUkNIX1dBTlRfU1RBVDY0KQotdHlwZWRlZiBzdHJ1Y3Qgc3RhdDY0ICAgbHN0YXRfdDsKLSNkZWZpbmUgbHN0YXRfZgkgbHN0YXQ2NAotI2Vsc2UKLXR5cGVkZWYgc3RydWN0IHN0YXQgICAgIGxzdGF0X3Q7Ci0jZGVmaW5lIGxzdGF0X2YJIGxzdGF0Ci0jZW5kaWYKLQotI2RlZmluZSBIQVZFX0xPVl9VU0VSX01EU19EQVRBCi0KLSNlbmRpZiAvKiBfTFVTVFJFX1VTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oCmluZGV4IGQ2OGU2MGUuLmNjMDcxM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgKQEAgLTE2NSw4ICsxNjUsMTAgQEAKIAlzdHJ1Y3QgbHByb2Nmc19jb3VudGVyIGxwX2NudHJbMF07CiB9OwogCi0jZGVmaW5lIExQUk9DRlNfR0VUX05VTV9DUFUgMHgwMDAxCi0jZGVmaW5lIExQUk9DRlNfR0VUX1NNUF9JRCAgMHgwMDAyCitlbnVtIGxwcm9jZnNfc3RhdHNfbG9ja19vcHMgeworCUxQUk9DRlNfR0VUX05VTV9DUFUJPSAweDAwMDEsIC8qIG51bWJlciBhbGxvY2F0ZWQgcGVyLUNQVSBzdGF0cyAqLworCUxQUk9DRlNfR0VUX1NNUF9JRAk9IDB4MDAwMiwgLyogY3VycmVudCBzdGF0IHRvIGJlIHVwZGF0ZWQgKi8KK307CiAKIGVudW0gbHByb2Nmc19zdGF0c19mbGFncyB7CiAJTFBST0NGU19TVEFUU19GTEFHX05PTkUgICAgID0gMHgwMDAwLCAvKiBwZXIgY3B1IGNvdW50ZXIgKi8KQEAgLTM2Myw4MiArMzY1LDk5IEBACiAjZGVmaW5lIEpPQlNUQVRTX1BST0NOQU1FX1VJRAkJInByb2NuYW1lX3VpZCIKICNkZWZpbmUgSk9CU1RBVFNfTk9ERUxPQ0FMCQkibm9kZWxvY2FsIgogCisvKiBvYmRfY29uZmlnLmMgKi8KK3ZvaWQgbHVzdHJlX3JlZ2lzdGVyX2NsaWVudF9wcm9jZXNzX2NvbmZpZyhpbnQgKCpjcGMpKHN0cnVjdCBsdXN0cmVfY2ZnICpsY2ZnKSk7CisKIGludCBscHJvY2ZzX3dyaXRlX2ZyYWNfaGVscGVyKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCBpbnQgKnZhbCwgaW50IG11bHQpOwogaW50IGxwcm9jZnNfcmVhZF9mcmFjX2hlbHBlcihjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsCiAJCQkgICAgIGxvbmcgdmFsLCBpbnQgbXVsdCk7CiBpbnQgbHByb2Nmc19zdGF0c19hbGxvY19vbmUoc3RydWN0IGxwcm9jZnNfc3RhdHMgKnN0YXRzLCB1bnNpZ25lZCBpbnQgY3B1aWQpOwotLyoKLSAqIFxyZXR1cm4gdmFsdWUKLSAqICAgICAgPCAwICAgICA6IG9uIGVycm9yIChvbmx5IHBvc3NpYmxlIGZvciBvcGMgYXMgTFBST0NGU19HRVRfU01QX0lEKQorCisvKioKKyAqIExvY2sgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgZm9yIGFjY2VzcywgcG9zc2libHkgb25seSBvbiB0aGlzIENQVS4KKyAqCisgKiBUaGUgc3RhdGlzdGljcyBzdHJ1Y3QgbWF5IGJlIGFsbG9jYXRlZCB3aXRoIHBlci1DUFUgc3RydWN0dXJlcyBmb3IKKyAqIGVmZmljaWVudCBjb25jdXJyZW50IHVwZGF0ZSAodXN1YWxseSBvbmx5IG9uIHNlcnZlci13aWRlIHN0YXRzKSwgb3IKKyAqIGFzIGEgc2luZ2xlIGdsb2JhbCBzdHJ1Y3QgKGUuZy4gZm9yIHBlci1jbGllbnQgb3IgcGVyLWpvYiBzdGF0aXN0aWNzKSwKKyAqIHNvIHRoZSByZXF1aXJlZCBsb2NraW5nIGRlcGVuZHMgb24gdGhlIHR5cGUgb2Ygc3RydWN0dXJlIGFsbG9jYXRlZC4KKyAqCisgKiBGb3IgcGVyLUNQVSBzdGF0aXN0aWNzLCBwaW4gdGhlIHRocmVhZCB0byB0aGUgY3VycmVudCBjcHVpZCBzbyB0aGF0CisgKiB3aWxsIG9ubHkgYWNjZXNzIHRoZSBzdGF0aXN0aWNzIGZvciB0aGF0IENQVS4gIElmIHRoZSBzdGF0cyBzdHJ1Y3R1cmUKKyAqIGZvciB0aGUgY3VycmVudCBDUFUgaGFzIG5vdCBiZWVuIGFsbG9jYXRlZCAob3IgcHJldmlvdXNseSBmcmVlZCksCisgKiBhbGxvY2F0ZSBpdCBub3cuICBUaGUgcGVyLUNQVSBzdGF0aXN0aWNzIGRvIG5vdCBuZWVkIGxvY2tpbmcgc2luY2UKKyAqIHRoZSB0aHJlYWQgaXMgcGlubmVkIHRvIHRoZSBDUFUgZHVyaW5nIHVwZGF0ZS4KKyAqCisgKiBGb3IgZ2xvYmFsIHN0YXRpc3RpY3MsIGxvY2sgdGhlIHN0YXRzIHN0cnVjdHVyZSB0byBwcmV2ZW50IGNvbmN1cnJlbnQgdXBkYXRlLgorICoKKyAqIFxwYXJhbVtpbl0gc3RhdHMJc3RhdGlzdGljcyBzdHJ1Y3R1cmUgdG8gbG9jaworICogXHBhcmFtW2luXSBvcGMJdHlwZSBvZiBvcGVyYXRpb246CisgKgkJCUxQUk9DRlNfR0VUX1NNUF9JRDogImxvY2siIGFuZCByZXR1cm4gY3VycmVudCBDUFUgaW5kZXgKKyAqCQkJCWZvciBpbmNyZW1lbnRpbmcgc3RhdGlzdGljcyBmb3IgdGhhdCBDUFUKKyAqCQkJTFBST0NGU19HRVRfTlVNX0NQVTogImxvY2siIGFuZCByZXR1cm4gbnVtYmVyIG9mIHVzZWQKKyAqCQkJCUNQVSBpbmRpY2VzIHRvIGl0ZXJhdGUgb3ZlciBhbGwgaW5kaWNlcworICogXHBhcmFtW291dF0gZmxhZ3MJQ1BVIGludGVycnVwdCBzYXZlZCBzdGF0ZSBmb3IgSVJRLXNhZmUgbG9ja2luZworICoKKyAqIFxyZXR2YWwgY3B1aWQgb2YgY3VycmVudCB0aHJlYWQgb3IgbnVtYmVyIG9mIGFsbG9jYXRlZCBzdHJ1Y3RzCisgKiBccmV0dmFsIG5lZ2F0aXZlIG9uIGVycm9yIChvbmx5IGZvciBvcGMgTFBST0NGU19HRVRfU01QX0lEICsgcGVyLUNQVSBzdGF0cykKICAqLwotc3RhdGljIGlubGluZSBpbnQgbHByb2Nmc19zdGF0c19sb2NrKHN0cnVjdCBscHJvY2ZzX3N0YXRzICpzdGF0cywgaW50IG9wYywKK3N0YXRpYyBpbmxpbmUgaW50IGxwcm9jZnNfc3RhdHNfbG9jayhzdHJ1Y3QgbHByb2Nmc19zdGF0cyAqc3RhdHMsCisJCQkJICAgICBlbnVtIGxwcm9jZnNfc3RhdHNfbG9ja19vcHMgb3BjLAogCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCiB7Ci0JaW50CQlyYyA9IDA7CisJaWYgKHN0YXRzLT5sc19mbGFncyAmIExQUk9DRlNfU1RBVFNfRkxBR19OT1BFUkNQVSkgeworCQlpZiAoc3RhdHMtPmxzX2ZsYWdzICYgTFBST0NGU19TVEFUU19GTEFHX0lSUV9TQUZFKQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRzLT5sc19sb2NrLCAqZmxhZ3MpOworCQllbHNlCisJCQlzcGluX2xvY2soJnN0YXRzLT5sc19sb2NrKTsKKwkJcmV0dXJuIG9wYyA9PSBMUFJPQ0ZTX0dFVF9OVU1fQ1BVID8gMSA6IDA7CisJfQogCiAJc3dpdGNoIChvcGMpIHsKKwljYXNlIExQUk9DRlNfR0VUX1NNUF9JRDogeworCQl1bnNpZ25lZCBpbnQgY3B1aWQgPSBnZXRfY3B1KCk7CisKKwkJaWYgKHVubGlrZWx5KCFzdGF0cy0+bHNfcGVyY3B1W2NwdWlkXSkpIHsKKwkJCWludCByYyA9IGxwcm9jZnNfc3RhdHNfYWxsb2Nfb25lKHN0YXRzLCBjcHVpZCk7CisKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwdXRfY3B1KCk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9CisJCXJldHVybiBjcHVpZDsKKwl9CisJY2FzZSBMUFJPQ0ZTX0dFVF9OVU1fQ1BVOgorCQlyZXR1cm4gc3RhdHMtPmxzX2JpZ2dlc3RfYWxsb2NfbnVtOwogCWRlZmF1bHQ6CiAJCUxCVUcoKTsKLQotCWNhc2UgTFBST0NGU19HRVRfU01QX0lEOgotCQlpZiAoc3RhdHMtPmxzX2ZsYWdzICYgTFBST0NGU19TVEFUU19GTEFHX05PUEVSQ1BVKSB7Ci0JCQlpZiAoc3RhdHMtPmxzX2ZsYWdzICYgTFBST0NGU19TVEFUU19GTEFHX0lSUV9TQUZFKQotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0cy0+bHNfbG9jaywgKmZsYWdzKTsKLQkJCWVsc2UKLQkJCQlzcGluX2xvY2soJnN0YXRzLT5sc19sb2NrKTsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UgewotCQkJdW5zaWduZWQgaW50IGNwdWlkID0gZ2V0X2NwdSgpOwotCi0JCQlpZiAodW5saWtlbHkoIXN0YXRzLT5sc19wZXJjcHVbY3B1aWRdKSkgewotCQkJCXJjID0gbHByb2Nmc19zdGF0c19hbGxvY19vbmUoc3RhdHMsIGNwdWlkKTsKLQkJCQlpZiAocmMgPCAwKSB7Ci0JCQkJCXB1dF9jcHUoKTsKLQkJCQkJcmV0dXJuIHJjOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjcHVpZDsKLQkJfQotCi0JY2FzZSBMUFJPQ0ZTX0dFVF9OVU1fQ1BVOgotCQlpZiAoc3RhdHMtPmxzX2ZsYWdzICYgTFBST0NGU19TVEFUU19GTEFHX05PUEVSQ1BVKSB7Ci0JCQlpZiAoc3RhdHMtPmxzX2ZsYWdzICYgTFBST0NGU19TVEFUU19GTEFHX0lSUV9TQUZFKQotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0cy0+bHNfbG9jaywgKmZsYWdzKTsKLQkJCWVsc2UKLQkJCQlzcGluX2xvY2soJnN0YXRzLT5sc19sb2NrKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCXJldHVybiBzdGF0cy0+bHNfYmlnZ2VzdF9hbGxvY19udW07CiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbHByb2Nmc19zdGF0c191bmxvY2soc3RydWN0IGxwcm9jZnNfc3RhdHMgKnN0YXRzLCBpbnQgb3BjLAorLyoqCisgKiBVbmxvY2sgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgYWZ0ZXIgYWNjZXNzLgorICoKKyAqIFVubG9jayB0aGUgbG9jayBhY3F1aXJlZCB2aWEgbHByb2Nmc19zdGF0c19sb2NrKCkgZm9yIGdsb2JhbCBzdGF0aXN0aWNzLAorICogb3IgdW5waW4gdGhpcyB0aHJlYWQgZnJvbSB0aGUgY3VycmVudCBjcHVpZCBmb3IgcGVyLUNQVSBzdGF0aXN0aWNzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdXNpbmcgdGhlIHNhbWUgYXJndW1lbnRzIGFzIHVzZWQgd2hlbiBjYWxsaW5nCisgKiBscHJvY2ZzX3N0YXRzX2xvY2soKSBzbyB0aGF0IHRoZSBjb3JyZWN0IG9wZXJhdGlvbiBjYW4gYmUgcGVyZm9ybWVkLgorICoKKyAqIFxwYXJhbVtpbl0gc3RhdHMJc3RhdGlzdGljcyBzdHJ1Y3R1cmUgdG8gdW5sb2NrCisgKiBccGFyYW1baW5dIG9wYwl0eXBlIG9mIG9wZXJhdGlvbiAoY3VycmVudCBjcHVpZCBvciBudW1iZXIgb2Ygc3RydWN0cykKKyAqIFxwYXJhbVtpbl0gZmxhZ3MJQ1BVIGludGVycnVwdCBzYXZlZCBzdGF0ZSBmb3IgSVJRLXNhZmUgbG9ja2luZworICovCitzdGF0aWMgaW5saW5lIHZvaWQgbHByb2Nmc19zdGF0c191bmxvY2soc3RydWN0IGxwcm9jZnNfc3RhdHMgKnN0YXRzLAorCQkJCQllbnVtIGxwcm9jZnNfc3RhdHNfbG9ja19vcHMgb3BjLAogCQkJCQl1bnNpZ25lZCBsb25nICpmbGFncykKIHsKLQlzd2l0Y2ggKG9wYykgewotCWRlZmF1bHQ6Ci0JCUxCVUcoKTsKLQotCWNhc2UgTFBST0NGU19HRVRfU01QX0lEOgotCQlpZiAoc3RhdHMtPmxzX2ZsYWdzICYgTFBST0NGU19TVEFUU19GTEFHX05PUEVSQ1BVKSB7Ci0JCQlpZiAoc3RhdHMtPmxzX2ZsYWdzICYgTFBST0NGU19TVEFUU19GTEFHX0lSUV9TQUZFKQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRzLT5sc19sb2NrLCAqZmxhZ3MpOwotCQkJZWxzZQotCQkJCXNwaW5fdW5sb2NrKCZzdGF0cy0+bHNfbG9jayk7Ci0JCX0gZWxzZSB7Ci0JCQlwdXRfY3B1KCk7Ci0JCX0KLQkJcmV0dXJuOwotCi0JY2FzZSBMUFJPQ0ZTX0dFVF9OVU1fQ1BVOgotCQlpZiAoc3RhdHMtPmxzX2ZsYWdzICYgTFBST0NGU19TVEFUU19GTEFHX05PUEVSQ1BVKSB7Ci0JCQlpZiAoc3RhdHMtPmxzX2ZsYWdzICYgTFBST0NGU19TVEFUU19GTEFHX0lSUV9TQUZFKQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRzLT5sc19sb2NrLCAqZmxhZ3MpOwotCQkJZWxzZQotCQkJCXNwaW5fdW5sb2NrKCZzdGF0cy0+bHNfbG9jayk7Ci0JCX0KLQkJcmV0dXJuOworCWlmIChzdGF0cy0+bHNfZmxhZ3MgJiBMUFJPQ0ZTX1NUQVRTX0ZMQUdfTk9QRVJDUFUpIHsKKwkJaWYgKHN0YXRzLT5sc19mbGFncyAmIExQUk9DRlNfU1RBVFNfRkxBR19JUlFfU0FGRSkKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRzLT5sc19sb2NrLCAqZmxhZ3MpOworCQllbHNlCisJCQlzcGluX3VubG9jaygmc3RhdHMtPmxzX2xvY2spOworCX0gZWxzZSBpZiAob3BjID09IExQUk9DRlNfR0VUX1NNUF9JRCkgeworCQlwdXRfY3B1KCk7CiAJfQogfQogCkBAIC00OTYsNyArNTE1LDcgQEAKIAkJCQkJICAgIGludCBpZHgsCiAJCQkJCSAgICBlbnVtIGxwcm9jZnNfZmllbGRzX2ZsYWdzIGZpZWxkKQogewotCWludAkgICAgICBpOworCXVuc2lnbmVkIGludCBpOwogCXVuc2lnbmVkIGludCAgbnVtX2NwdTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzCT0gMDsKIAlfX3U2NAkgICAgICByZXQJPSAwOwpAQCAtNjgxLDYgKzcwMCwxMiBAQAogCiBleHRlcm4gY29uc3Qgc3RydWN0IHN5c2ZzX29wcyBsdXN0cmVfc3lzZnNfb3BzOwogCitzdHJ1Y3Qgcm9vdF9zcXVhc2hfaW5mbzsKK2ludCBscHJvY2ZzX3dyX3Jvb3Rfc3F1YXNoKGNvbnN0IGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwKKwkJCSAgIHN0cnVjdCByb290X3NxdWFzaF9pbmZvICpzcXVhc2gsIGNoYXIgKm5hbWUpOworaW50IGxwcm9jZnNfd3Jfbm9zcXVhc2hfbmlkcyhjb25zdCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsCisJCQkgICAgIHN0cnVjdCByb290X3NxdWFzaF9pbmZvICpzcXVhc2gsIGNoYXIgKm5hbWUpOworCiAvKiBhbGwgcXVvdGEgcHJvYyBmdW5jdGlvbnMgKi8KIGludCBscHJvY2ZzX3F1b3RhX3JkX2J1bml0KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKIAkJCSAgIGxvZmZfdCBvZmYsIGludCBjb3VudCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVfb2JqZWN0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1X29iamVjdC5oCmluZGV4IDZlMjVjMWIuLjI2MDY0M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVfb2JqZWN0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdV9vYmplY3QuaApAQCAtMzI3LDcgKzMyNyw3IEBACiAJLyoqCiAJICogTnVtYmVyIG9mIGV4aXN0aW5nIGRldmljZSB0eXBlIGluc3RhbmNlcy4KIAkgKi8KLQl1bnNpZ25lZAkJCQlsZHRfZGV2aWNlX25yOworCWF0b21pY190CQkJCWxkdF9kZXZpY2VfbnI7CiAJLyoqCiAJICogTGlua2FnZSBpbnRvIGEgZ2xvYmFsIGxpc3Qgb2YgYWxsIGRldmljZSB0eXBlcy4KIAkgKgpAQCAtNjAyLDcgKzYwMiw3IEBACiAJLyoqCiAJICogaW5kZXggb2YgYnVja2V0IG9uIGhhc2ggdGFibGUgd2hpbGUgcHVyZ2luZwogCSAqLwotCWludAkJICAgICAgIGxzX3B1cmdlX3N0YXJ0OworCXVuc2lnbmVkIGludAkJbHNfcHVyZ2Vfc3RhcnQ7CiAJLyoqCiAJICogVG9wLWxldmVsIGRldmljZSBmb3IgdGhpcyBzdGFjay4KIAkgKi8KQEAgLTYyMyw2ICs2MjMsMTEgQEAKIAlzcGlubG9ja190CQlsc19sZF9sb2NrOwogCiAJLyoqCisJICogTG9jayB0byBzZXJpYWxpemUgc2l0ZSBwdXJnZS4KKwkgKi8KKwlzdHJ1Y3QgbXV0ZXgJCWxzX3B1cmdlX211dGV4OworCisJLyoqCiAJICogbHVfc2l0ZSBzdGF0cwogCSAqLwogCXN0cnVjdCBscHJvY2ZzX3N0YXRzCSpsc19zdGF0czsKQEAgLTY3Myw3ICs2NzgsNiBAQAogCiBpbnQgIGx1X2RldmljZV90eXBlX2luaXQoc3RydWN0IGx1X2RldmljZV90eXBlICpsZHQpOwogdm9pZCBsdV9kZXZpY2VfdHlwZV9maW5pKHN0cnVjdCBsdV9kZXZpY2VfdHlwZSAqbGR0KTsKLXZvaWQgbHVfdHlwZXNfc3RvcCh2b2lkKTsKIAogLyoqIEB9IGN0b3JzICovCiAKQEAgLTEwMjUsNyArMTAyOSw4IEBACiAJLyoqCiAJICogQ29udGV4dHMgdXNhYmxlIGluIGNhY2hlIHNocmlua2VyIHRocmVhZC4KIAkgKi8KLQlMQ1RfU0hSSU5LRVIgID0gTENUX01EX1RIUkVBRHxMQ1RfRFRfVEhSRUFEfExDVF9DTF9USFJFQUR8TENUX05PUkVGCisJTENUX1NIUklOS0VSICA9IExDVF9NRF9USFJFQUQgfCBMQ1RfRFRfVEhSRUFEIHwgTENUX0NMX1RIUkVBRCB8CisJCQlMQ1RfTk9SRUYKIH07CiAKIC8qKgpAQCAtMTI2NCwxMiArMTI2OSwyOCBAQAogfTsKIAogLyoqCisgKiBWYWxpZGF0ZSBuYW1lcyAocGF0aCBjb21wb25lbnRzKQorICoKKyAqIFRvIGJlIHZhbGlkIFxhIG5hbWUgbXVzdCBiZSBub24tZW1wdHksICdcMCcgdGVybWluYXRlZCBvZiBsZW5ndGggXGEKKyAqIG5hbWVfbGVuLCBhbmQgbm90IGNvbnRhaW4gJy8nLiBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBuYW1lIChiZWZvcmUKKyAqIHNheSAtRU5BTUVUT09MT05HIHdpbGwgYmUgcmV0dXJuZWQpIGlzIHJlYWxseSBjb250cm9sbGVkIGJ5IGxsaXRlCisgKiBhbmQgdGhlIHNlcnZlci4gV2Ugb25seSBjaGVjayBmb3Igc29tZXRoaW5nIGluc2FuZSBjb21pbmcgZnJvbSBiYWQKKyAqIGludGVnZXIgaGFuZGxpbmcgaGVyZS4KKyAqLworc3RhdGljIGlubGluZSBib29sIGx1X25hbWVfaXNfdmFsaWRfMihjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9sZW4pCit7CisJcmV0dXJuIG5hbWUgJiYgbmFtZV9sZW4gPiAwICYmIG5hbWVfbGVuIDwgSU5UX01BWCAmJgorCSAgICAgICBuYW1lW25hbWVfbGVuXSA9PSAnXDAnICYmIHN0cmxlbihuYW1lKSA9PSBuYW1lX2xlbiAmJgorCSAgICAgICAhbWVtY2hyKG5hbWUsICcvJywgbmFtZV9sZW4pOworfQorCisvKioKICAqIENvbW1vbiBidWZmZXIgc3RydWN0dXJlIHRvIGJlIHBhc3NlZCBhcm91bmQgZm9yIHZhcmlvdXMgeGF0dHJfe3MsZ31ldCgpCiAgKiBtZXRob2RzLgogICovCiBzdHJ1Y3QgbHVfYnVmIHsKIAl2b2lkICAgKmxiX2J1ZjsKLQlzc2l6ZV90IGxiX2xlbjsKKwlzaXplX3QJbGJfbGVuOwogfTsKIAogI2RlZmluZSBETFVCVUYgIiglcCAlenUpIgpAQCAtMTI5OCw1ICsxMzE5LDEyIEBACiBpbnQgIGx1X2ttZW1faW5pdChzdHJ1Y3QgbHVfa21lbV9kZXNjciAqY2FjaGVzKTsKIHZvaWQgbHVfa21lbV9maW5pKHN0cnVjdCBsdV9rbWVtX2Rlc2NyICpjYWNoZXMpOwogCit2b2lkIGx1X2J1Zl9mcmVlKHN0cnVjdCBsdV9idWYgKmJ1Zik7Cit2b2lkIGx1X2J1Zl9hbGxvYyhzdHJ1Y3QgbHVfYnVmICpidWYsIHNpemVfdCBzaXplKTsKK3ZvaWQgbHVfYnVmX3JlYWxsb2Moc3RydWN0IGx1X2J1ZiAqYnVmLCBzaXplX3Qgc2l6ZSk7CisKK2ludCBsdV9idWZfY2hlY2tfYW5kX2dyb3coc3RydWN0IGx1X2J1ZiAqYnVmLCBzaXplX3QgbGVuKTsKK3N0cnVjdCBsdV9idWYgKmx1X2J1Zl9jaGVja19hbmRfYWxsb2Moc3RydWN0IGx1X2J1ZiAqYnVmLCBzaXplX3QgbGVuKTsKKwogLyoqIEB9IGx1ICovCiAjZW5kaWYgLyogX19MVVNUUkVfTFVfT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pZGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pZGwuaAppbmRleCAwNTE4NjRjLi43MmVhZWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaWRsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lkbC5oCkBAIC05Myw2ICs5Myw3IEBACiAvKiBEZWZuJ3Mgc2hhcmVkIHdpdGggdXNlci1zcGFjZS4gKi8KICNpbmNsdWRlICJsdXN0cmVfdXNlci5oIgogI2luY2x1ZGUgImx1c3RyZV9lcnJuby5oIgorI2luY2x1ZGUgIi4uL2x1c3RyZV92ZXIuaCIKIAogLyoKICAqICBHRU5FUkFMIFNUVUZGCkBAIC0xOTYsMTIgKzE5NywxMiBAQAogCXJldHVybiByYW5nZS0+bHNyX2ZsYWdzICYgTFVfU0VRX1JBTkdFX01BU0s7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZsZF9yYW5nZV9pc19vc3QoY29uc3Qgc3RydWN0IGx1X3NlcV9yYW5nZSAqcmFuZ2UpCitzdGF0aWMgaW5saW5lIGJvb2wgZmxkX3JhbmdlX2lzX29zdChjb25zdCBzdHJ1Y3QgbHVfc2VxX3JhbmdlICpyYW5nZSkKIHsKIAlyZXR1cm4gZmxkX3JhbmdlX3R5cGUocmFuZ2UpID09IExVX1NFUV9SQU5HRV9PU1Q7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZsZF9yYW5nZV9pc19tZHQoY29uc3Qgc3RydWN0IGx1X3NlcV9yYW5nZSAqcmFuZ2UpCitzdGF0aWMgaW5saW5lIGJvb2wgZmxkX3JhbmdlX2lzX21kdChjb25zdCBzdHJ1Y3QgbHVfc2VxX3JhbmdlICpyYW5nZSkKIHsKIAlyZXR1cm4gZmxkX3JhbmdlX3R5cGUocmFuZ2UpID09IExVX1NFUV9SQU5HRV9NRFQ7CiB9CkBAIC0yNjAsMjMgKzI2MSwyMyBAQAogICogY2hlY2sgaWYgZ2l2ZW4gc2VxIGlkIFxhIHMgaXMgd2l0aGluIGdpdmVuIHJhbmdlIFxhIHIKICAqLwogCi1zdGF0aWMgaW5saW5lIGludCByYW5nZV93aXRoaW4oY29uc3Qgc3RydWN0IGx1X3NlcV9yYW5nZSAqcmFuZ2UsCi0JCQkgICAgICAgX191NjQgcykKK3N0YXRpYyBpbmxpbmUgYm9vbCByYW5nZV93aXRoaW4oY29uc3Qgc3RydWN0IGx1X3NlcV9yYW5nZSAqcmFuZ2UsCisJCQkJX191NjQgcykKIHsKIAlyZXR1cm4gcyA+PSByYW5nZS0+bHNyX3N0YXJ0ICYmIHMgPCByYW5nZS0+bHNyX2VuZDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcmFuZ2VfaXNfc2FuZShjb25zdCBzdHJ1Y3QgbHVfc2VxX3JhbmdlICpyYW5nZSkKK3N0YXRpYyBpbmxpbmUgYm9vbCByYW5nZV9pc19zYW5lKGNvbnN0IHN0cnVjdCBsdV9zZXFfcmFuZ2UgKnJhbmdlKQogewogCXJldHVybiAocmFuZ2UtPmxzcl9lbmQgPj0gcmFuZ2UtPmxzcl9zdGFydCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJhbmdlX2lzX3plcm8oY29uc3Qgc3RydWN0IGx1X3NlcV9yYW5nZSAqcmFuZ2UpCitzdGF0aWMgaW5saW5lIGJvb2wgcmFuZ2VfaXNfemVybyhjb25zdCBzdHJ1Y3QgbHVfc2VxX3JhbmdlICpyYW5nZSkKIHsKIAlyZXR1cm4gKHJhbmdlLT5sc3Jfc3RhcnQgPT0gMCAmJiByYW5nZS0+bHNyX2VuZCA9PSAwKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcmFuZ2VfaXNfZXhoYXVzdGVkKGNvbnN0IHN0cnVjdCBsdV9zZXFfcmFuZ2UgKnJhbmdlKQorc3RhdGljIGlubGluZSBib29sIHJhbmdlX2lzX2V4aGF1c3RlZChjb25zdCBzdHJ1Y3QgbHVfc2VxX3JhbmdlICpyYW5nZSkKIAogewogCXJldHVybiByYW5nZV9zcGFjZShyYW5nZSkgPT0gMDsKQEAgLTQzNyw2OSArNDM4LDY5IEBACiAJRklEX09JRF9ET1RfTFVTVFJFX09CRiA9IDJVTCwKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9zZXFfaXNfbWR0MChfX3U2NCBzZXEpCitzdGF0aWMgaW5saW5lIGJvb2wgZmlkX3NlcV9pc19tZHQwKF9fdTY0IHNlcSkKIHsKIAlyZXR1cm4gKHNlcSA9PSBGSURfU0VRX09TVF9NRFQwKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZmlkX3NlcV9pc19tZHQoY29uc3QgX191NjQgc2VxKQorc3RhdGljIGlubGluZSBib29sIGZpZF9zZXFfaXNfbWR0KF9fdTY0IHNlcSkKIHsKIAlyZXR1cm4gc2VxID09IEZJRF9TRVFfT1NUX01EVDAgfHwgc2VxID49IEZJRF9TRVFfTk9STUFMOwogfTsKIAotc3RhdGljIGlubGluZSBpbnQgZmlkX3NlcV9pc19lY2hvKF9fdTY0IHNlcSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfc2VxX2lzX2VjaG8oX191NjQgc2VxKQogewogCXJldHVybiAoc2VxID09IEZJRF9TRVFfRUNITyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9pc19lY2hvKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfaXNfZWNobyhjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCiB7CiAJcmV0dXJuIGZpZF9zZXFfaXNfZWNobyhmaWRfc2VxKGZpZCkpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBmaWRfc2VxX2lzX2xsb2coX191NjQgc2VxKQorc3RhdGljIGlubGluZSBib29sIGZpZF9zZXFfaXNfbGxvZyhfX3U2NCBzZXEpCiB7CiAJcmV0dXJuIChzZXEgPT0gRklEX1NFUV9MTE9HKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZmlkX2lzX2xsb2coY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKQorc3RhdGljIGlubGluZSBib29sIGZpZF9pc19sbG9nKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKIHsKIAkvKiBmaWxlIHdpdGggT0lEID09IDAgaXMgbm90IGxsb2cgYnV0IGNvbnRhaW5zIGxhc3Qgb2lkICovCiAJcmV0dXJuIGZpZF9zZXFfaXNfbGxvZyhmaWRfc2VxKGZpZCkpICYmIGZpZF9vaWQoZmlkKSA+IDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9zZXFfaXNfcnN2ZChjb25zdCBfX3U2NCBzZXEpCitzdGF0aWMgaW5saW5lIGJvb2wgZmlkX3NlcV9pc19yc3ZkKF9fdTY0IHNlcSkKIHsKIAlyZXR1cm4gKHNlcSA+IEZJRF9TRVFfT1NUX01EVDAgJiYgc2VxIDw9IEZJRF9TRVFfUlNWRCk7CiB9OwogCi1zdGF0aWMgaW5saW5lIGludCBmaWRfc2VxX2lzX3NwZWNpYWwoY29uc3QgX191NjQgc2VxKQorc3RhdGljIGlubGluZSBib29sIGZpZF9zZXFfaXNfc3BlY2lhbChfX3U2NCBzZXEpCiB7CiAJcmV0dXJuIHNlcSA9PSBGSURfU0VRX1NQRUNJQUw7CiB9OwogCi1zdGF0aWMgaW5saW5lIGludCBmaWRfc2VxX2lzX2xvY2FsX2ZpbGUoY29uc3QgX191NjQgc2VxKQorc3RhdGljIGlubGluZSBib29sIGZpZF9zZXFfaXNfbG9jYWxfZmlsZShfX3U2NCBzZXEpCiB7CiAJcmV0dXJuIHNlcSA9PSBGSURfU0VRX0xPQ0FMX0ZJTEUgfHwKIAkgICAgICAgc2VxID09IEZJRF9TRVFfTE9DQUxfTkFNRTsKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9zZXFfaXNfcm9vdChjb25zdCBfX3U2NCBzZXEpCitzdGF0aWMgaW5saW5lIGJvb2wgZmlkX3NlcV9pc19yb290KF9fdTY0IHNlcSkKIHsKIAlyZXR1cm4gc2VxID09IEZJRF9TRVFfUk9PVDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZmlkX3NlcV9pc19kb3QoY29uc3QgX191NjQgc2VxKQorc3RhdGljIGlubGluZSBib29sIGZpZF9zZXFfaXNfZG90KF9fdTY0IHNlcSkKIHsKIAlyZXR1cm4gc2VxID09IEZJRF9TRVFfRE9UX0xVU1RSRTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZmlkX3NlcV9pc19kZWZhdWx0KGNvbnN0IF9fdTY0IHNlcSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfc2VxX2lzX2RlZmF1bHQoX191NjQgc2VxKQogewogCXJldHVybiBzZXEgPT0gRklEX1NFUV9MT1ZfREVGQVVMVDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZmlkX2lzX21kdDAoY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKQorc3RhdGljIGlubGluZSBib29sIGZpZF9pc19tZHQwKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKIHsKIAlyZXR1cm4gZmlkX3NlcV9pc19tZHQwKGZpZF9zZXEoZmlkKSk7CiB9CkBAIC01MTYsMTIgKzUxNywxMiBAQAogICogXHBhcmFtIGZpZCB0aGUgZmlkIHRvIGJlIHRlc3RlZC4KICAqIFxyZXR1cm4gdHJ1ZSBpZiB0aGUgZmlkIGlzIGEgaWdpZjsgb3RoZXJ3aXNlIGZhbHNlLgogICovCi1zdGF0aWMgaW5saW5lIGludCBmaWRfc2VxX2lzX2lnaWYoY29uc3QgX191NjQgc2VxKQorc3RhdGljIGlubGluZSBib29sIGZpZF9zZXFfaXNfaWdpZihfX3U2NCBzZXEpCiB7CiAJcmV0dXJuIHNlcSA+PSBGSURfU0VRX0lHSUYgJiYgc2VxIDw9IEZJRF9TRVFfSUdJRl9NQVg7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9pc19pZ2lmKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfaXNfaWdpZihjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCiB7CiAJcmV0dXJuIGZpZF9zZXFfaXNfaWdpZihmaWRfc2VxKGZpZCkpOwogfQpAQCAtNTMxLDI3ICs1MzIsMjcgQEAKICAqIFxwYXJhbSBmaWQgdGhlIGZpZCB0byBiZSB0ZXN0ZWQuCiAgKiBccmV0dXJuIHRydWUgaWYgdGhlIGZpZCBpcyBhIGlkaWY7IG90aGVyd2lzZSBmYWxzZS4KICAqLwotc3RhdGljIGlubGluZSBpbnQgZmlkX3NlcV9pc19pZGlmKGNvbnN0IF9fdTY0IHNlcSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfc2VxX2lzX2lkaWYoX191NjQgc2VxKQogewogCXJldHVybiBzZXEgPj0gRklEX1NFUV9JRElGICYmIHNlcSA8PSBGSURfU0VRX0lESUZfTUFYOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBmaWRfaXNfaWRpZihjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCitzdGF0aWMgaW5saW5lIGJvb2wgZmlkX2lzX2lkaWYoY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKQogewogCXJldHVybiBmaWRfc2VxX2lzX2lkaWYoZmlkX3NlcShmaWQpKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZmlkX2lzX2xvY2FsX2ZpbGUoY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKQorc3RhdGljIGlubGluZSBib29sIGZpZF9pc19sb2NhbF9maWxlKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKIHsKIAlyZXR1cm4gZmlkX3NlcV9pc19sb2NhbF9maWxlKGZpZF9zZXEoZmlkKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9zZXFfaXNfbm9ybShjb25zdCBfX3U2NCBzZXEpCitzdGF0aWMgaW5saW5lIGJvb2wgZmlkX3NlcV9pc19ub3JtKF9fdTY0IHNlcSkKIHsKIAlyZXR1cm4gKHNlcSA+PSBGSURfU0VRX05PUk1BTCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9pc19ub3JtKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfaXNfbm9ybShjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCiB7CiAJcmV0dXJuIGZpZF9zZXFfaXNfbm9ybShmaWRfc2VxKGZpZCkpOwogfQpAQCAtNjU4LDcgKzY1OSw3IEBACiAJCW9pLT5vaV9maWQuZl9vaWQgPSBvaWQ7CiAJCW9pLT5vaV9maWQuZl92ZXIgPSBvaWQgPj4gNDg7CiAJfSBlbHNlIHsKLQkJaWYgKG9pZCA+IE9CSUZfTUFYX09JRCkgeworCQlpZiAob2lkID49IE9CSUZfTUFYX09JRCkgewogCQkJQ0VSUk9SKCJCYWQgJWxsdSB0byBzZXQgIiBET1NUSUQgIlxuIiwgb2lkLCBQT1NUSUQob2kpKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtNjgzLDcgKzY4NCw3IEBACiAJCWZpZC0+Zl9vaWQgPSBvaWQ7CiAJCWZpZC0+Zl92ZXIgPSBvaWQgPj4gNDg7CiAJfSBlbHNlIHsKLQkJaWYgKG9pZCA+IE9CSUZfTUFYX09JRCkgeworCQlpZiAob2lkID49IE9CSUZfTUFYX09JRCkgewogCQkJQ0VSUk9SKCJUb28gbGFyZ2UgT0lEICUjbGx4IHRvIHNldCBSRUcgIkRGSUQiXG4iLAogCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpb2lkLCBQRklEKGZpZCkpOwogCQkJcmV0dXJuIC1FQkFERjsKQEAgLTc2OSw3ICs3NzAsNyBAQAogfQogCiAvKiBDaGVjayB3aGV0aGVyIHRoZSBmaWQgaXMgZm9yIExBU1RfSUQgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9pc19sYXN0X2lkKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfaXNfbGFzdF9pZChjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCiB7CiAJcmV0dXJuIChmaWRfb2lkKGZpZCkgPT0gMCk7CiB9CkBAIC04MzgsNyArODM5LDcgQEAKIAlkc3QtPmZfdmVyID0gYmUzMl90b19jcHUoZmlkX3ZlcihzcmMpKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZmlkX2lzX3NhbmUoY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKQorc3RhdGljIGlubGluZSBib29sIGZpZF9pc19zYW5lKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKIHsKIAlyZXR1cm4gZmlkICYmCiAJICAgICAgICgoZmlkX3NlcShmaWQpID49IEZJRF9TRVFfU1RBUlQgJiYgZmlkX3ZlcihmaWQpID09IDApIHx8CkBAIC04NDYsMTUgKzg0NywxMCBAQAogCQlmaWRfc2VxX2lzX3JzdmQoZmlkX3NlcShmaWQpKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9pc196ZXJvKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKLXsKLQlyZXR1cm4gZmlkX3NlcShmaWQpID09IDAgJiYgZmlkX29pZChmaWQpID09IDA7Ci19Ci0KIHZvaWQgbHVzdHJlX3N3YWJfbHVfZmlkKHN0cnVjdCBsdV9maWQgKmZpZCk7CiB2b2lkIGx1c3RyZV9zd2FiX2x1X3NlcV9yYW5nZShzdHJ1Y3QgbHVfc2VxX3JhbmdlICpyYW5nZSk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IGx1X2ZpZF9lcShjb25zdCBzdHJ1Y3QgbHVfZmlkICpmMCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZjEpCitzdGF0aWMgaW5saW5lIGJvb2wgbHVfZmlkX2VxKGNvbnN0IHN0cnVjdCBsdV9maWQgKmYwLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmMSkKIHsKIAlyZXR1cm4gbWVtY21wKGYwLCBmMSwgc2l6ZW9mKCpmMCkpID09IDA7CiB9CkBAIC0xMDE3LDEyICsxMDEzLDEyIEBACiAJcmV0dXJuIG5leHQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGx1X2RpcmVudF9jYWxjX3NpemUoaW50IG5hbWVsZW4sIF9fdTE2IGF0dHIpCitzdGF0aWMgaW5saW5lIHNpemVfdCBsdV9kaXJlbnRfY2FsY19zaXplKHNpemVfdCBuYW1lbGVuLCBfX3UxNiBhdHRyKQogewotCWludCBzaXplOworCXNpemVfdCBzaXplOwogCiAJaWYgKGF0dHIgJiBMVURBX1RZUEUpIHsKLQkJY29uc3QgdW5zaWduZWQgYWxpZ24gPSBzaXplb2Yoc3RydWN0IGx1ZGFfdHlwZSkgLSAxOworCQljb25zdCBzaXplX3QgYWxpZ24gPSBzaXplb2Yoc3RydWN0IGx1ZGFfdHlwZSkgLSAxOwogCiAJCXNpemUgPSAoc2l6ZW9mKHN0cnVjdCBsdV9kaXJlbnQpICsgbmFtZWxlbiArIGFsaWduKSAmIH5hbGlnbjsKIAkJc2l6ZSArPSBzaXplb2Yoc3RydWN0IGx1ZGFfdHlwZSk7CkBAIC0xMDMzLDE1ICsxMDI5LDYgQEAKIAlyZXR1cm4gKHNpemUgKyA3KSAmIH43OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBsdV9kaXJlbnRfc2l6ZShzdHJ1Y3QgbHVfZGlyZW50ICplbnQpCi17Ci0JaWYgKGxlMTZfdG9fY3B1KGVudC0+bGRlX3JlY2xlbikgPT0gMCkgewotCQlyZXR1cm4gbHVfZGlyZW50X2NhbGNfc2l6ZShsZTE2X3RvX2NwdShlbnQtPmxkZV9uYW1lbGVuKSwKLQkJCQkJICAgbGUzMl90b19jcHUoZW50LT5sZGVfYXR0cnMpKTsKLQl9Ci0JcmV0dXJuIGxlMTZfdG9fY3B1KGVudC0+bGRlX3JlY2xlbik7Ci19Ci0KICNkZWZpbmUgTURTX0RJUl9FTkRfT0ZGIDB4ZmZmZmZmZmZmZmZmZmZmZVVMTAogCiAvKioKQEAgLTEwNjcsMTkgKzEwNTQsMTkgQEAKIAogI2RlZmluZSBERUFEX0hBTkRMRV9NQUdJQyAweGRlYWRiZWVmY2FmZWJhYmVVTEwKIAotc3RhdGljIGlubGluZSBpbnQgbHVzdHJlX2hhbmRsZV9pc191c2VkKHN0cnVjdCBsdXN0cmVfaGFuZGxlICpsaCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBsdXN0cmVfaGFuZGxlX2lzX3VzZWQoY29uc3Qgc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxoKQogewogCXJldHVybiBsaC0+Y29va2llICE9IDB1bGw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGx1c3RyZV9oYW5kbGVfZXF1YWwoY29uc3Qgc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxoMSwKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqbGgyKQorc3RhdGljIGlubGluZSBib29sIGx1c3RyZV9oYW5kbGVfZXF1YWwoY29uc3Qgc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxoMSwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxoMikKIHsKIAlyZXR1cm4gbGgxLT5jb29raWUgPT0gbGgyLT5jb29raWU7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsdXN0cmVfaGFuZGxlX2NvcHkoc3RydWN0IGx1c3RyZV9oYW5kbGUgKnRndCwKLQkJCQkgICAgICBzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqc3JjKQorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBsdXN0cmVfaGFuZGxlICpzcmMpCiB7CiAJdGd0LT5jb29raWUgPSBzcmMtPmNvb2tpZTsKIH0KQEAgLTExMDUsNyArMTA5Miw3IEBACiAKIC8qIHdpdGhvdXQgZ3NzLCBwdGxycGNfYm9keSBpcyBwdXQgYXQgdGhlIGZpcnN0IGJ1ZmZlci4gKi8KICNkZWZpbmUgUFRMUlBDX05VTV9WRVJTSU9OUyAgICAgNAotI2RlZmluZSBKT0JTVEFUU19KT0JJRF9TSVpFICAgICAzMiAgLyogMzIgYnl0ZXMgc3RyaW5nICovCisKIHN0cnVjdCBwdGxycGNfYm9keV92MyB7CiAJc3RydWN0IGx1c3RyZV9oYW5kbGUgcGJfaGFuZGxlOwogCV9fdTMyIHBiX3R5cGU7CkBAIC0xMTI3LDcgKzExMTQsNyBAQAogCV9fdTY0IHBiX3ByZV92ZXJzaW9uc1tQVExSUENfTlVNX1ZFUlNJT05TXTsKIAkvKiBwYWRkaW5nIGZvciBmdXR1cmUgbmVlZHMgKi8KIAlfX3U2NCBwYl9wYWRkaW5nWzRdOwotCWNoYXIgIHBiX2pvYmlkW0pPQlNUQVRTX0pPQklEX1NJWkVdOworCWNoYXIgIHBiX2pvYmlkW0xVU1RSRV9KT0JJRF9TSVpFXTsKIH07CiAKICNkZWZpbmUgcHRscnBjX2JvZHkgICAgIHB0bHJwY19ib2R5X3YzCkBAIC0xMjkzLDYgKzEyODAsOSBAQAogI2RlZmluZSBPQkRfQ09OTkVDVF9PUEVOX0JZX0ZJRAkweDIwMDAwMDAwMDAwMDAwVUxMCS8qIG9wZW4gYnkgZmlkIHdvbid0IHBhY2sKIAkJCQkJCQkgKiBuYW1lIGluIHJlcXVlc3QKIAkJCQkJCQkgKi8KKyNkZWZpbmUgT0JEX0NPTk5FQ1RfTEZTQ0sJMHg0MDAwMDAwMDAwMDAwMFVMTC8qIHN1cHBvcnQgb25saW5lIExGU0NLICovCisjZGVmaW5lIE9CRF9DT05ORUNUX1VOTElOS19DTE9TRSAweDEwMDAwMDAwMDAwMDAwMFVMTC8qIGNsb3NlIGZpbGUgaW4gdW5saW5rICovCisjZGVmaW5lIE9CRF9DT05ORUNUX0RJUl9TVFJJUEUJIDB4NDAwMDAwMDAwMDAwMDAwVUxMLyogc3RyaXBlZCBETkUgZGlyICovCiAKIC8qIFhYWCBSRUFETUUgWFhYOgogICogUGxlYXNlIERPIE5PVCBhZGQgZmxhZyB2YWx1ZXMgaGVyZSBiZWZvcmUgZmlyc3QgZW5zdXJpbmcgdGhhdCB0aGlzIHNhbWUKQEAgLTEzMTgsMTQgKzEzMDgsNiBAQAogI2RlZmluZSBDTElFTlRfQ09OTkVDVF9NRFRfUkVRRCAoT0JEX0NPTk5FQ1RfSUJJVFMgfCBPQkRfQ09OTkVDVF9GSUQgfCBcCiAJCQkJIE9CRF9DT05ORUNUX0ZVTEwyMCkKIAotI2RlZmluZSBPQkRfT0NEX1ZFUlNJT04obWFqb3IsIG1pbm9yLCBwYXRjaCwgZml4KSAoKChtYWpvcik8PDI0KSArIFwKLQkJCQkJCSAgKChtaW5vcik8PDE2KSArIFwKLQkJCQkJCSAgKChwYXRjaCk8PDgpICsgKGZpeCkpCi0jZGVmaW5lIE9CRF9PQ0RfVkVSU0lPTl9NQUpPUih2ZXJzaW9uKSAoKGludCkoKHZlcnNpb24pPj4yNCkmMjU1KQotI2RlZmluZSBPQkRfT0NEX1ZFUlNJT05fTUlOT1IodmVyc2lvbikgKChpbnQpKCh2ZXJzaW9uKT4+MTYpJjI1NSkKLSNkZWZpbmUgT0JEX09DRF9WRVJTSU9OX1BBVENIKHZlcnNpb24pICgoaW50KSgodmVyc2lvbik+PjgpJjI1NSkKLSNkZWZpbmUgT0JEX09DRF9WRVJTSU9OX0ZJWCh2ZXJzaW9uKSAgICgoaW50KSh2ZXJzaW9uKSYyNTUpCi0KIC8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGJvdGggcmVxdWVzdCBhbmQgcmVwbHkuCiAgKgogICogSWYgd2UgZXZlbnR1YWxseSBoYXZlIHNlcGFyYXRlIGNvbm5lY3QgZGF0YSBmb3IgZGlmZmVyZW50IHR5cGVzLCB3aGljaCB3ZQpAQCAtMTQ3OCwxMCArMTQ2MCwyMyBAQAogCU9CRF9GTF9MT0NBTF9NQVNLICAgPSAweEYwMDAwMDAwLAogfTsKIAotI2RlZmluZSBMT1ZfTUFHSUNfVjEgICAgICAweDBCRDEwQkQwCi0jZGVmaW5lIExPVl9NQUdJQwkgTE9WX01BR0lDX1YxCi0jZGVmaW5lIExPVl9NQUdJQ19KT0lOX1YxIDB4MEJEMjBCRDAKLSNkZWZpbmUgTE9WX01BR0lDX1YzICAgICAgMHgwQkQzMEJEMAorLyoKKyAqIEFsbCBMT1YgRUEgbWFnaWNzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHBvc3RmaXgsIGlmIHNvbWUgbmV3IHZlcnNpb24KKyAqIEx1c3RyZSBpbnN0cm9kdWNlcyBuZXcgTE9WIEVBIG1hZ2ljLCB0aGVuIHdoZW4gZG93bi1ncmFkZSB0byBhbiBvbGQKKyAqIEx1c3RyZSwgZXZlbiB0aG91Z2ggdGhlIG9sZCB2ZXJzaW9uIHN5c3RlbSBkb2VzIG5vdCByZWNvZ25pemVzIHN1Y2gKKyAqIG5ldyBtYWdpYywgaXQgc3RpbGwgY2FuIGRpc3Rpbmd1aXNoIHRoZSBjb3JydXB0ZWQgY2FzZXMgYnkgY2hlY2tpbmcKKyAqIHRoZSBtYWdpYydzIHBvc3RmaXguCisgKi8KKyNkZWZpbmUgTE9WX01BR0lDX01BR0lDIDB4MEJEMAorI2RlZmluZSBMT1ZfTUFHSUNfTUFTSyAgMHhGRkZGCisKKyNkZWZpbmUgTE9WX01BR0lDX1YxCQkoMHgwQkQxMDAwMCB8IExPVl9NQUdJQ19NQUdJQykKKyNkZWZpbmUgTE9WX01BR0lDX0pPSU5fVjEJKDB4MEJEMjAwMDAgfCBMT1ZfTUFHSUNfTUFHSUMpCisjZGVmaW5lIExPVl9NQUdJQ19WMwkJKDB4MEJEMzAwMDAgfCBMT1ZfTUFHSUNfTUFHSUMpCisjZGVmaW5lIExPVl9NQUdJQ19NSUdSQVRFCSgweDBCRDQwMDAwIHwgTE9WX01BR0lDX01BR0lDKQorLyogcmVzZXJ2ZWQgZm9yIHNwZWNpZnlpbmcgT1NUcyAqLworI2RlZmluZSBMT1ZfTUFHSUNfU1BFQ0lGSUMJKDB4MEJENTAwMDAgfCBMT1ZfTUFHSUNfTUFHSUMpCisjZGVmaW5lIExPVl9NQUdJQwkJTE9WX01BR0lDX1YxCiAKIC8qCiAgKiBtYWdpYyBmb3IgZnVsbHkgZGVmaW5lZCBzdHJpcGluZwpAQCAtMTQ5OCwxNCArMTQ5Myw2IEBACiAjZGVmaW5lIExPVl9NQUdJQ19WMV9ERUYgIDB4MENEMTBCRDAKICNkZWZpbmUgTE9WX01BR0lDX1YzX0RFRiAgMHgwQ0QzMEJEMAogCi0jZGVmaW5lIExPVl9QQVRURVJOX1JBSUQwCTB4MDAxICAgLyogc3RyaXBlcyBhcmUgdXNlZCByb3VuZC1yb2JpbiAqLwotI2RlZmluZSBMT1ZfUEFUVEVSTl9SQUlEMQkweDAwMiAgIC8qIHN0cmlwZXMgYXJlIG1pcnJvcnMgb2YgZWFjaCBvdGhlciAqLwotI2RlZmluZSBMT1ZfUEFUVEVSTl9GSVJTVAkweDEwMCAgIC8qIGZpcnN0IHN0cmlwZSBpcyBub3QgaW4gcm91bmQtcm9iaW4gKi8KLSNkZWZpbmUgTE9WX1BBVFRFUk5fQ01PQkQJMHgyMDAKLQotI2RlZmluZSBMT1ZfUEFUVEVSTl9GX01BU0sJMHhmZmZmMDAwMAotI2RlZmluZSBMT1ZfUEFUVEVSTl9GX1JFTEVBU0VECTB4ODAwMDAwMDAgLyogSFNNIHJlbGVhc2VkIGZpbGUgKi8KLQogI2RlZmluZSBsb3ZfcGF0dGVybihwYXR0ZXJuKQkJKHBhdHRlcm4gJiB+TE9WX1BBVFRFUk5fRl9NQVNLKQogI2RlZmluZSBsb3ZfcGF0dGVybl9mbGFncyhwYXR0ZXJuKQkocGF0dGVybiAmIExPVl9QQVRURVJOX0ZfTUFTSykKIApAQCAtMTU2OSwyNSArMTU1NiwyNSBAQAogCW9pLT5vaS5vaV9pZCA9IG9pZDsKIH0KIAotc3RhdGljIGlubGluZSBfX3U2NCBsbW1fb2lfaWQoc3RydWN0IG9zdF9pZCAqb2kpCitzdGF0aWMgaW5saW5lIF9fdTY0IGxtbV9vaV9pZChjb25zdCBzdHJ1Y3Qgb3N0X2lkICpvaSkKIHsKIAlyZXR1cm4gb2ktPm9pLm9pX2lkOwogfQogCi1zdGF0aWMgaW5saW5lIF9fdTY0IGxtbV9vaV9zZXEoc3RydWN0IG9zdF9pZCAqb2kpCitzdGF0aWMgaW5saW5lIF9fdTY0IGxtbV9vaV9zZXEoY29uc3Qgc3RydWN0IG9zdF9pZCAqb2kpCiB7CiAJcmV0dXJuIG9pLT5vaS5vaV9zZXE7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsbW1fb2lfbGVfdG9fY3B1KHN0cnVjdCBvc3RfaWQgKmRzdF9vaSwKLQkJCQkgICAgc3RydWN0IG9zdF9pZCAqc3JjX29pKQorCQkJCSAgICBjb25zdCBzdHJ1Y3Qgb3N0X2lkICpzcmNfb2kpCiB7CiAJZHN0X29pLT5vaS5vaV9pZCA9IGxlNjRfdG9fY3B1KHNyY19vaS0+b2kub2lfaWQpOwogCWRzdF9vaS0+b2kub2lfc2VxID0gbGU2NF90b19jcHUoc3JjX29pLT5vaS5vaV9zZXEpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbG1tX29pX2NwdV90b19sZShzdHJ1Y3Qgb3N0X2lkICpkc3Rfb2ksCi0JCQkJICAgIHN0cnVjdCBvc3RfaWQgKnNyY19vaSkKKwkJCQkgICAgY29uc3Qgc3RydWN0IG9zdF9pZCAqc3JjX29pKQogewogCWRzdF9vaS0+b2kub2lfaWQgPSBjcHVfdG9fbGU2NChzcmNfb2ktPm9pLm9pX2lkKTsKIAlkc3Rfb2ktPm9pLm9pX3NlcSA9IGNwdV90b19sZTY0KHNyY19vaS0+b2kub2lfc2VxKTsKQEAgLTE2MTAsNiArMTU5Nyw3IEBACiAjZGVmaW5lIFhBVFRSX05BTUVfTE9WCSAgInRydXN0ZWQubG92IgogI2RlZmluZSBYQVRUUl9OQU1FX0xNQQkgICJ0cnVzdGVkLmxtYSIKICNkZWZpbmUgWEFUVFJfTkFNRV9MTVYJICAidHJ1c3RlZC5sbXYiCisjZGVmaW5lIFhBVFRSX05BTUVfREVGQVVMVF9MTVYJInRydXN0ZWQuZG12IgogI2RlZmluZSBYQVRUUl9OQU1FX0xJTksJICJ0cnVzdGVkLmxpbmsiCiAjZGVmaW5lIFhBVFRSX05BTUVfRklECSAgInRydXN0ZWQuZmlkIgogI2RlZmluZSBYQVRUUl9OQU1FX1ZFUlNJT04gICAgICAidHJ1c3RlZC52ZXJzaW9uIgpAQCAtMTYyNSw3ICsxNjEzLDcgQEAKIAkvKiBsbW1fc3RyaXBlX2NvdW50IHVzZWQgdG8gYmUgX191MzIgKi8KIAlfX3UxNiBsbW1fc3RyaXBlX2NvdW50OyAgIC8qIG51bSBzdHJpcGVzIGluIHVzZSBmb3IgdGhpcyBvYmplY3QgKi8KIAlfX3UxNiBsbW1fbGF5b3V0X2dlbjsgICAgIC8qIGxheW91dCBnZW5lcmF0aW9uIG51bWJlciAqLwotCWNoYXIgIGxtbV9wb29sX25hbWVbTE9WX01BWFBPT0xOQU1FXTsgLyogbXVzdCBiZSAzMmJpdCBhbGlnbmVkICovCisJY2hhciAgbG1tX3Bvb2xfbmFtZVtMT1ZfTUFYUE9PTE5BTUUgKyAxXTsgLyogbXVzdCBiZSAzMmJpdCBhbGlnbmVkICovCiAJc3RydWN0IGxvdl9vc3RfZGF0YV92MSBsbW1fb2JqZWN0c1swXTsgLyogcGVyLXN0cmlwZSBkYXRhICovCiB9OwogCkBAIC0xNzI3LDYgKzE3MTUsOCBAQAogI2RlZmluZSBPQkRfTURfRkxEQVRBVkVSU0lPTiAoMHgwMDEwMDAwMDAwMDAwMDAwVUxMKSAvKiBpdmVyc2lvbiBzdW0gKi8KICNkZWZpbmUgT0JEX01EX0ZMUkVMRUFTRUQgICAgKDB4MDAyMDAwMDAwMDAwMDAwMFVMTCkgLyogZmlsZSByZWxlYXNlZCAqLwogCisjZGVmaW5lIE9CRF9NRF9ERUZBVUxUX01FQSAgICgweDAwNDAwMDAwMDAwMDAwMDBVTEwpIC8qIGRlZmF1bHQgTUVBICovCisKICNkZWZpbmUgT0JEX01EX0ZMR0VUQVRUUiAoT0JEX01EX0ZMSUQgICAgfCBPQkRfTURfRkxBVElNRSB8IE9CRF9NRF9GTE1USU1FIHwgXAogCQkJICBPQkRfTURfRkxDVElNRSB8IE9CRF9NRF9GTFNJWkUgIHwgT0JEX01EX0ZMQkxLU1ogfCBcCiAJCQkgIE9CRF9NRF9GTE1PREUgIHwgT0JEX01EX0ZMVFlQRSAgfCBPQkRfTURfRkxVSUQgICB8IFwKQEAgLTE3ODIsNyArMTc3Miw3IEBACiAJCQkJICAgICAgKiBpdCB0byBzeW5jIHF1aWNrbHkKIAkJCQkgICAgICAqLwogCi0jZGVmaW5lIE9CRF9PQkpFQ1RfRU9GIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTAorI2RlZmluZSBPQkRfT0JKRUNUX0VPRglMVVNUUkVfRU9GCiAKICNkZWZpbmUgT1NUX01JTl9QUkVDUkVBVEUgMzIKICNkZWZpbmUgT1NUX01BWF9QUkVDUkVBVEUgMjAwMDAKQEAgLTE4MDYsOSArMTc5Niw5IEBACiAKIC8qIG11bHRpcGxlIG9mIDggYnl0ZXMgPT4gY2FuIGFycmF5ICovCiBzdHJ1Y3QgbmlvYnVmX3JlbW90ZSB7Ci0JX191NjQgb2Zmc2V0OwotCV9fdTMyIGxlbjsKLQlfX3UzMiBmbGFnczsKKwlfX3U2NAlybmJfb2Zmc2V0OworCV9fdTMyCXJuYl9sZW47CisJX191MzIJcm5iX2ZsYWdzOwogfTsKIAogdm9pZCBsdXN0cmVfc3dhYl9uaW9idWZfcmVtb3RlKHN0cnVjdCBuaW9idWZfcmVtb3RlICpuYnIpOwpAQCAtMTg3OCwxMiArMTg2OCw2IEBACiAKIHZvaWQgbHVzdHJlX3N3YWJfb2JkX3F1b3RhY3RsKHN0cnVjdCBvYmRfcXVvdGFjdGwgKnEpOwogCi0jZGVmaW5lIFFfUVVPVEFDSEVDSwkweDgwMDEwMCAvKiBkZXByZWNhdGVkIGFzIG9mIDIuNCAqLwotI2RlZmluZSBRX0lOSVRRVU9UQQkweDgwMDEwMSAvKiBkZXByZWNhdGVkIGFzIG9mIDIuNCAgKi8KLSNkZWZpbmUgUV9HRVRPSU5GTwkweDgwMDEwMiAvKiBnZXQgb2JkIHF1b3RhIGluZm8gKi8KLSNkZWZpbmUgUV9HRVRPUVVPVEEJMHg4MDAxMDMgLyogZ2V0IG9iZCBxdW90YXMgKi8KLSNkZWZpbmUgUV9GSU5WQUxJREFURQkweDgwMDEwNCAvKiBkZXByZWNhdGVkIGFzIG9mIDIuNCAqLwotCiAjZGVmaW5lIFFfQ09QWShvdXQsIGluLCBtZW1iZXIpIChvdXQpLT5tZW1iZXIgPSAoaW4pLT5tZW1iZXIKIAogI2RlZmluZSBRQ1RMX0NPUFkob3V0LCBpbikJCVwKQEAgLTE5NDYsOCArMTkzMCw4IEBACiAJTURTX0RJU0NPTk5FQ1QJCT0gMzksCiAJTURTX0dFVFNUQVRVUwkJPSA0MCwKIAlNRFNfU1RBVEZTCQk9IDQxLAotCU1EU19QSU4JCQk9IDQyLAotCU1EU19VTlBJTgkJPSA0MywKKwlNRFNfUElOCQkJPSA0MiwgLyogb2Jzb2xldGUsIG5ldmVyIHVzZWQgaW4gYSByZWxlYXNlICovCisJTURTX1VOUElOCQk9IDQzLCAvKiBvYnNvbGV0ZSwgbmV2ZXIgdXNlZCBpbiBhIHJlbGVhc2UgKi8KIAlNRFNfU1lOQwkJPSA0NCwKIAlNRFNfRE9ORV9XUklUSU5HCT0gNDUsCiAJTURTX1NFVF9JTkZPCQk9IDQ2LApAQCAtMTk1Niw3ICsxOTQwLDcgQEAKIAlNRFNfR0VUWEFUVFIJCT0gNDksCiAJTURTX1NFVFhBVFRSCQk9IDUwLCAvKiBvYnNvbGV0ZSwgbm93IGl0J3MgTURTX1JFSU5UIG9wICovCiAJTURTX1dSSVRFUEFHRQkJPSA1MSwKLQlNRFNfSVNfU1VCRElSCQk9IDUyLAorCU1EU19JU19TVUJESVIJCT0gNTIsIC8qIG9ic29sZXRlLCBuZXZlciB1c2VkIGluIGEgcmVsZWFzZSAqLwogCU1EU19HRVRfSU5GTwkJPSA1MywKIAlNRFNfSFNNX1NUQVRFX0dFVAk9IDU0LAogCU1EU19IU01fU1RBVEVfU0VUCT0gNTUsCkBAIC0xOTg0LDcgKzE5NjgsNyBAQAogCVJFSU5UX09QRU4gICAgID0gNiwKIAlSRUlOVF9TRVRYQVRUUiA9IDcsCiAJUkVJTlRfUk1FTlRSWSAgPSA4LAotLyogICAgICBSRUlOVF9XUklURSAgICA9IDksICovCisJUkVJTlRfTUlHUkFURSAgPSA5LAogCVJFSU5UX01BWAogfTsKIApAQCAtMjAwMyw2ICsxOTg3LDcgQEAKICNkZWZpbmUgRElTUF9PUEVOX0xPQ0sgICAgICAgMHgwMjAwMDAwMAogI2RlZmluZSBESVNQX09QRU5fTEVBU0UgICAgICAweDA0MDAwMDAwCiAjZGVmaW5lIERJU1BfT1BFTl9TVFJJUEUgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgRElTUF9PUEVOX0RFTlkJCTB4MTAwMDAwMDAKIAogLyogSU5PREUgTE9DSyBQQVJUUyAqLwogI2RlZmluZSBNRFNfSU5PREVMT0NLX0xPT0tVUCAweDAwMDAwMQkvKiBGb3IgbmFtZXNwYWNlLCBkZW50cnkgZXRjLCBhbmQgYWxzbwpAQCAtMjAyOCw3ICsyMDEzLDcgQEAKIAogI2RlZmluZSBNRFNfSU5PREVMT0NLX01BWFNISUZUIDUKIC8qIFRoaXMgRlVMTCBsb2NrIGlzIHVzZWZ1bCB0byB0YWtlIG9uIHVubGluayBzb3J0IG9mIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTURTX0lOT0RFTE9DS19GVUxMICgoMTw8KE1EU19JTk9ERUxPQ0tfTUFYU0hJRlQrMSkpLTEpCisjZGVmaW5lIE1EU19JTk9ERUxPQ0tfRlVMTCAoKDEgPDwgKE1EU19JTk9ERUxPQ0tfTUFYU0hJRlQgKyAxKSkgLSAxKQogCiAvKiBOT1RFOiB1bnRpbCBMdXN0cmUgMS44LjcvMi4xLjEgdGhlIGZpZF92ZXIoKSB3YXMgcGFja2VkIGludG8gbmFtZVsyXSwKICAqIGJ1dCB3YXMgbW92ZWQgaW50byBuYW1lWzFdIGFsb25nIHdpdGggdGhlIE9JRCB0byBhdm9pZCBjb25zdW1pbmcgdGhlCkBAIC0yMTA4LDQzICsyMDkzLDQzIEBACiB9OwogCiBzdHJ1Y3QgbWR0X2JvZHkgewotCXN0cnVjdCBsdV9maWQgIGZpZDE7Ci0Jc3RydWN0IGx1X2ZpZCAgZmlkMjsKLQlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSBoYW5kbGU7Ci0JX191NjQJICB2YWxpZDsKLQlfX3U2NAkgIHNpemU7ICAgLyogT2Zmc2V0LCBpbiB0aGUgY2FzZSBvZiBNRFNfUkVBRFBBR0UgKi8KLQlfX3M2NAkgIG10aW1lOwotCV9fczY0CSAgYXRpbWU7Ci0JX19zNjQJICBjdGltZTsKLQlfX3U2NAkgIGJsb2NrczsgLyogWElELCBpbiB0aGUgY2FzZSBvZiBNRFNfUkVBRFBBR0UgKi8KLQlfX3U2NAkgIGlvZXBvY2g7Ci0JX191NjQJICB0X3N0YXRlOyAvKiB0cmFuc2llbnQgZmlsZSBzdGF0ZSBkZWZpbmVkIGluCi0JCQkgICAgKiBlbnVtIG1kX3RyYW5zaWVudF9zdGF0ZQotCQkJICAgICogd2FzICJpbm8iIHVudGlsIDIuNC4wCi0JCQkgICAgKi8KLQlfX3UzMgkgIGZzdWlkOwotCV9fdTMyCSAgZnNnaWQ7Ci0JX191MzIJICBjYXBhYmlsaXR5OwotCV9fdTMyCSAgbW9kZTsKLQlfX3UzMgkgIHVpZDsKLQlfX3UzMgkgIGdpZDsKLQlfX3UzMgkgIGZsYWdzOyAvKiBmcm9tIHZmcyBmb3IgcGluL3VucGluLCBMVVNUUkVfQkZMQUcgY2xvc2UgKi8KLQlfX3UzMgkgIHJkZXY7Ci0JX191MzIJICBubGluazsgLyogI2J5dGVzIHRvIHJlYWQgaW4gdGhlIGNhc2Ugb2YgTURTX1JFQURQQUdFICovCi0JX191MzIJICB1bnVzZWQyOyAvKiB3YXMgImdlbmVyYXRpb24iIHVudGlsIDIuNC4wICovCi0JX191MzIJICBzdXBwZ2lkOwotCV9fdTMyCSAgZWFkYXRhc2l6ZTsKLQlfX3UzMgkgIGFjbHNpemU7Ci0JX191MzIJICBtYXhfbWRzaXplOwotCV9fdTMyCSAgbWF4X2Nvb2tpZXNpemU7Ci0JX191MzIJICB1aWRfaDsgLyogaGlnaCAzMi1iaXRzIG9mIHVpZCwgZm9yIEZVSUQgKi8KLQlfX3UzMgkgIGdpZF9oOyAvKiBoaWdoIDMyLWJpdHMgb2YgZ2lkLCBmb3IgRlVJRCAqLwotCV9fdTMyCSAgcGFkZGluZ181OyAvKiBhbHNvIGZpeCBsdXN0cmVfc3dhYl9tZHRfYm9keSAqLwotCV9fdTY0CSAgcGFkZGluZ182OwotCV9fdTY0CSAgcGFkZGluZ183OwotCV9fdTY0CSAgcGFkZGluZ184OwotCV9fdTY0CSAgcGFkZGluZ185OwotCV9fdTY0CSAgcGFkZGluZ18xMDsKKwlzdHJ1Y3QgbHVfZmlkIG1ib19maWQxOworCXN0cnVjdCBsdV9maWQgbWJvX2ZpZDI7CisJc3RydWN0IGx1c3RyZV9oYW5kbGUgbWJvX2hhbmRsZTsKKwlfX3U2NAltYm9fdmFsaWQ7CisJX191NjQJbWJvX3NpemU7CS8qIE9mZnNldCwgaW4gdGhlIGNhc2Ugb2YgTURTX1JFQURQQUdFICovCisJX19zNjQJbWJvX210aW1lOworCV9fczY0CW1ib19hdGltZTsKKwlfX3M2NAltYm9fY3RpbWU7CisJX191NjQJbWJvX2Jsb2NrczsJLyogWElELCBpbiB0aGUgY2FzZSBvZiBNRFNfUkVBRFBBR0UgKi8KKwlfX3U2NAltYm9faW9lcG9jaDsKKwlfX3U2NAltYm9fdF9zdGF0ZTsJLyogdHJhbnNpZW50IGZpbGUgc3RhdGUgZGVmaW5lZCBpbgorCQkJCSAqIGVudW0gbWRfdHJhbnNpZW50X3N0YXRlCisJCQkJICogd2FzICJpbm8iIHVudGlsIDIuNC4wCisJCQkJICovCisJX191MzIJbWJvX2ZzdWlkOworCV9fdTMyCW1ib19mc2dpZDsKKwlfX3UzMgltYm9fY2FwYWJpbGl0eTsKKwlfX3UzMgltYm9fbW9kZTsKKwlfX3UzMgltYm9fdWlkOworCV9fdTMyCW1ib19naWQ7CisJX191MzIJbWJvX2ZsYWdzOworCV9fdTMyCW1ib19yZGV2OworCV9fdTMyCW1ib19ubGluazsJLyogI2J5dGVzIHRvIHJlYWQgaW4gdGhlIGNhc2Ugb2YgTURTX1JFQURQQUdFICovCisJX191MzIJbWJvX3VudXNlZDI7CS8qIHdhcyAiZ2VuZXJhdGlvbiIgdW50aWwgMi40LjAgKi8KKwlfX3UzMgltYm9fc3VwcGdpZDsKKwlfX3UzMgltYm9fZWFkYXRhc2l6ZTsKKwlfX3UzMgltYm9fYWNsc2l6ZTsKKwlfX3UzMgltYm9fbWF4X21kc2l6ZTsKKwlfX3UzMgltYm9fbWF4X2Nvb2tpZXNpemU7CisJX191MzIJbWJvX3VpZF9oOwkvKiBoaWdoIDMyLWJpdHMgb2YgdWlkLCBmb3IgRlVJRCAqLworCV9fdTMyCW1ib19naWRfaDsJLyogaGlnaCAzMi1iaXRzIG9mIGdpZCwgZm9yIEZVSUQgKi8KKwlfX3UzMgltYm9fcGFkZGluZ181OwkvKiBhbHNvIGZpeCBsdXN0cmVfc3dhYl9tZHRfYm9keSAqLworCV9fdTY0CW1ib19wYWRkaW5nXzY7CisJX191NjQJbWJvX3BhZGRpbmdfNzsKKwlfX3U2NAltYm9fcGFkZGluZ184OworCV9fdTY0CW1ib19wYWRkaW5nXzk7CisJX191NjQJbWJvX3BhZGRpbmdfMTA7CiB9OyAvKiAyMTYgKi8KIAogdm9pZCBsdXN0cmVfc3dhYl9tZHRfYm9keShzdHJ1Y3QgbWR0X2JvZHkgKmIpOwpAQCAtMjI2Myw2ICsyMjQ4LDExIEBACiAJCQkJCSAgICAgICovCiAjZGVmaW5lIE1EU19PUEVOX1JFTEVBU0UgICAwMjAwMDAwMDAwMDAwMFVMTCAvKiBPcGVuIHRoZSBmaWxlIGZvciBIU00gcmVsZWFzZSAqLwogCisjZGVmaW5lIE1EU19PUEVOX0ZMX0lOVEVSTkFMIChNRFNfT1BFTl9IQVNfRUEgfCBNRFNfT1BFTl9IQVNfT0JKUyB8CVwKKwkJCSAgICAgIE1EU19PUEVOX09XTkVST1ZFUlJJREUgfCBNRFNfT1BFTl9MT0NLIHwJXAorCQkJICAgICAgTURTX09QRU5fQllfRklEIHwgTURTX09QRU5fTEVBU0UgfAlcCisJCQkgICAgICBNRFNfT1BFTl9SRUxFQVNFKQorCiBlbnVtIG1kc19vcF9iaWFzIHsKIAlNRFNfQ0hFQ0tfU1BMSVQJCT0gMSA8PCAwLAogCU1EU19DUk9TU19SRUYJCT0gMSA8PCAxLApAQCAtMjI3Nyw2ICsyMjY3LDcgQEAKIAlNRFNfQ1JFQVRFX1ZPTEFUSUxFCT0gMSA8PCAxMCwKIAlNRFNfT1dORVJPVkVSUklERQk9IDEgPDwgMTEsCiAJTURTX0hTTV9SRUxFQVNFCQk9IDEgPDwgMTIsCisJTURTX1JFTkFNRV9NSUdSQVRFCT0gQklUKDEzKSwKIH07CiAKIC8qIGluc3RhbmNlIG9mIG1kdF9yZWludF9yZWMgKi8KQEAgLTI0NzIsNyArMjQ2Myw3IEBACiAJX191MzIgbGRfdGd0X2NvdW50OwkJLyogaG93IG1hbnkgTURTJ3MgKi8KIAlfX3UzMiBsZF9hY3RpdmVfdGd0X2NvdW50OwkgLyogaG93IG1hbnkgYWN0aXZlICovCiAJX191MzIgbGRfZGVmYXVsdF9zdHJpcGVfY291bnQ7ICAgICAvKiBob3cgbWFueSBvYmplY3RzIGFyZSB1c2VkICovCi0JX191MzIgbGRfcGF0dGVybjsJCSAgLyogZGVmYXVsdCBNRUFfTUFHSUNfKiAqLworCV9fdTMyIGxkX3BhdHRlcm47CQkgIC8qIGRlZmF1bHQgaGFzaCBwYXR0ZXJuICovCiAJX191NjQgbGRfZGVmYXVsdF9oYXNoX3NpemU7CiAJX191NjQgbGRfcGFkZGluZ18xOwkJLyogYWxzbyBmaXggbHVzdHJlX3N3YWJfbG12X2Rlc2MgKi8KIAlfX3UzMiBsZF9wYWRkaW5nXzI7CQkvKiBhbHNvIGZpeCBsdXN0cmVfc3dhYl9sbXZfZGVzYyAqLwpAQCAtMjQ4MiwyMyArMjQ3MywxMjkgQEAKIAlzdHJ1Y3Qgb2JkX3V1aWQgbGRfdXVpZDsKIH07CiAKLS8qIFRPRE86IGxtdl9zdHJpcGVfbWQgc2hvdWxkIGNvbnRhaW4gbWRzIGNhcGFiaWxpdGllcyBmb3IgYWxsIHNsYXZlIGZpZHMgKi8KLXN0cnVjdCBsbXZfc3RyaXBlX21kIHsKLQlfX3UzMgkgbWVhX21hZ2ljOwotCV9fdTMyCSBtZWFfY291bnQ7Ci0JX191MzIJIG1lYV9tYXN0ZXI7Ci0JX191MzIJIG1lYV9wYWRkaW5nOwotCWNoYXIJICBtZWFfcG9vbF9uYW1lW0xPVl9NQVhQT09MTkFNRV07Ci0Jc3RydWN0IGx1X2ZpZCBtZWFfaWRzWzBdOworLyogTE1WIGxheW91dCBFQSwgYW5kIGl0IHdpbGwgYmUgc3RvcmVkIGJvdGggaW4gbWFzdGVyIGFuZCBzbGF2ZSBvYmplY3QgKi8KK3N0cnVjdCBsbXZfbWRzX21kX3YxIHsKKwlfX3UzMiBsbXZfbWFnaWM7CisJX191MzIgbG12X3N0cmlwZV9jb3VudDsKKwlfX3UzMiBsbXZfbWFzdGVyX21kdF9pbmRleDsJLyogT24gbWFzdGVyIG9iamVjdCwgaXQgaXMgbWFzdGVyCisJCQkJCSAqIE1EVCBpbmRleCwgb24gc2xhdmUgb2JqZWN0LCBpdAorCQkJCQkgKiBpcyBzdHJpcGUgaW5kZXggb2YgdGhlIHNsYXZlIG9iagorCQkJCQkgKi8KKwlfX3UzMiBsbXZfaGFzaF90eXBlOwkJLyogZGlyIHN0cmlwZSBwb2xpY3ksIGkuZS4gaW5kaWNhdGUKKwkJCQkJICogd2hpY2ggaGFzaCBmdW5jdGlvbiB0byBiZSB1c2VkLAorCQkJCQkgKiBOb3RlOiBvbmx5IGxvd2VyIDE2IGJpdHMgaXMgYmVpbmcKKwkJCQkJICogdXNlZCBmb3Igbm93LiBIaWdoZXIgMTYgYml0cyB3aWxsCisJCQkJCSAqIGJlIHVzZWQgdG8gbWFyayB0aGUgb2JqZWN0IHN0YXR1cywKKwkJCQkJICogZm9yIGV4YW1wbGUgbWlncmF0aW5nIG9yIGRlYWQuCisJCQkJCSAqLworCV9fdTMyIGxtdl9sYXlvdXRfdmVyc2lvbjsJLyogVXNlZCBmb3IgZGlyZWN0b3J5IHJlc3RyaXBpbmcgKi8KKwlfX3UzMiBsbXZfcGFkZGluZzE7CisJX191NjQgbG12X3BhZGRpbmcyOworCV9fdTY0IGxtdl9wYWRkaW5nMzsKKwljaGFyIGxtdl9wb29sX25hbWVbTE9WX01BWFBPT0xOQU1FICsgMV07LyogcG9vbCBuYW1lICovCisJc3RydWN0IGx1X2ZpZCBsbXZfc3RyaXBlX2ZpZHNbMF07CS8qIEZJRHMgZm9yIGVhY2ggc3RyaXBlICovCiB9OwogCi0jZGVmaW5lIE1FQV9NQUdJQ19MQVNUX0NIQVIgICAgICAweGIyMjIxY2ExCi0jZGVmaW5lIE1FQV9NQUdJQ19BTExfQ0hBUlMgICAgICAweGIyMjJhMTFjCi0jZGVmaW5lIE1FQV9NQUdJQ19IQVNIX1NFR01FTlQgICAweGIyMjJhMTFiCisjZGVmaW5lIExNVl9NQUdJQ19WMQkgMHgwQ0QyMENEMAkvKiBub3JtYWwgc3RyaXBlIGxtdiBtYWdpYyAqLworI2RlZmluZSBMTVZfTUFHSUMJIExNVl9NQUdJQ19WMQogCi0jZGVmaW5lIE1BWF9IQVNIX1NJWkVfMzIJIDB4N2ZmZmZmZmZVTAotI2RlZmluZSBNQVhfSEFTSF9TSVpFCSAgICAweDdmZmZmZmZmZmZmZmZmZmZVTEwKLSNkZWZpbmUgTUFYX0hBU0hfSElHSEVTVF9CSVQgICAgIDB4MTAwMDAwMDAwMDAwMDAwMFVMTAorLyogI2RlZmluZSBMTVZfVVNFUl9NQUdJQyAweDBDRDMwQ0QwICovCisjZGVmaW5lIExNVl9NQUdJQ19TVFJJUEUgMHgwQ0Q0MENEMAkvKiBtYWdpYyBmb3IgZGlyIHN1Yl9zdHJpcGUgKi8KKworLyoKKyAqUmlnaHQgbm93IG9ubHkgdGhlIGxvd2VyIHBhcnQoMC0xNmJpdHMpIG9mIGxtdl9oYXNoX3R5cGUgaXMgYmVpbmcgdXNlZCwKKyAqIGFuZCB0aGUgaGlnaGVyIHBhcnQgd2lsbCBiZSB0aGUgZmxhZyB0byBpbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIG9iamVjdCwKKyAqIGZvciBleGFtcGxlIHRoZSBvYmplY3QgaXMgYmVpbmcgbWlncmF0ZWQuIEFuZCB0aGUgaGFzaCBmdW5jdGlvbgorICogbWlnaHQgYmUgaW50ZXJwcmV0ZWQgZGlmZmVyZW50bHkgd2l0aCBkaWZmZXJlbnQgZmxhZ3MuCisgKi8KKyNkZWZpbmUgTE1WX0hBU0hfVFlQRV9NQVNLCQkweDAwMDBmZmZmCisKKyNkZWZpbmUgTE1WX0hBU0hfRkxBR19NSUdSQVRJT04JCTB4ODAwMDAwMDAKKyNkZWZpbmUgTE1WX0hBU0hfRkxBR19ERUFECQkweDQwMDAwMDAwCisKKy8qKgorICogVGhlIEZOVi0xYSBoYXNoIGFsZ29yaXRobSBpcyBhcyBmb2xsb3dzOgorICogICAgIGhhc2ggPSBGTlZfb2Zmc2V0X2Jhc2lzCisgKiAgICAgZm9yIGVhY2ggb2N0ZXRfb2ZfZGF0YSB0byBiZSBoYXNoZWQKKyAqICAgICAgICAgICAgIGhhc2ggPSBoYXNoIFhPUiBvY3RldF9vZl9kYXRhCisgKiAgICAgICAgICAgICBoYXNoID0gaGFzaCDDlyBGTlZfcHJpbWUKKyAqICAgICByZXR1cm4gaGFzaAorICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Gb3dsZXLigJNOb2xs4oCTVm9faGFzaF9mdW5jdGlvbiNGTlYtMWFfaGFzaAorICoKKyAqIGh0dHA6Ly93d3cuaXN0aGUuY29tL2Nob25nby90ZWNoL2NvbXAvZm52L2luZGV4Lmh0bWwjRk5WLXJlZmVyZW5jZS1zb3VyY2UKKyAqIEZOVl9wcmltZSBpcyAyXjQwICsgMl44ICsgMHhiMyA9IDB4MTAwMDAwMDAxYjNVTEwKKyAqKi8KKyNkZWZpbmUgTFVTVFJFX0ZOVl8xQV82NF9QUklNRQkJMHgxMDAwMDAwMDFiM1VMTAorI2RlZmluZSBMVVNUUkVfRk5WXzFBXzY0X09GRlNFVF9CSUFTCTB4Y2JmMjljZTQ4NDIyMjMyNVVMTAorc3RhdGljIGlubGluZSBfX3U2NCBsdXN0cmVfaGFzaF9mbnZfMWFfNjQoY29uc3Qgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlfX3U2NCBoYXNoID0gTFVTVFJFX0ZOVl8xQV82NF9PRkZTRVRfQklBUzsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwID0gYnVmOworCXNpemVfdCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQloYXNoIF49IHBbaV07CisJCWhhc2ggKj0gTFVTVFJFX0ZOVl8xQV82NF9QUklNRTsKKwl9CisKKwlyZXR1cm4gaGFzaDsKK30KKwordW5pb24gbG12X21kc19tZCB7CisJX191MzIJCQlsbXZfbWFnaWM7CisJc3RydWN0IGxtdl9tZHNfbWRfdjEJbG12X21kX3YxOworCXN0cnVjdCBsbXZfdXNlcl9tZAlsbXZfdXNlcl9tZDsKK307CisKK3ZvaWQgbHVzdHJlX3N3YWJfbG12X21kc19tZCh1bmlvbiBsbXZfbWRzX21kICpsbW0pOworCitzdGF0aWMgaW5saW5lIHNzaXplX3QgbG12X21kc19tZF9zaXplKGludCBzdHJpcGVfY291bnQsIHVuc2lnbmVkIGludCBsbW1fbWFnaWMpCit7CisJc3NpemVfdCBsZW4gPSAtRUlOVkFMOworCisJc3dpdGNoIChsbW1fbWFnaWMpIHsKKwljYXNlIExNVl9NQUdJQ19WMTogeworCQlzdHJ1Y3QgbG12X21kc19tZF92MSAqbG1tMTsKKworCQlsZW4gPSBzaXplb2YoKmxtbTEpOworCQlsZW4gKz0gc3RyaXBlX2NvdW50ICogc2l6ZW9mKGxtbTEtPmxtdl9zdHJpcGVfZmlkc1swXSk7CisJCWJyZWFrOyB9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxtdl9tZHNfbWRfc3RyaXBlX2NvdW50X2dldChjb25zdCB1bmlvbiBsbXZfbWRzX21kICpsbW0pCit7CisJc3dpdGNoIChsZTMyX3RvX2NwdShsbW0tPmxtdl9tYWdpYykpIHsKKwljYXNlIExNVl9NQUdJQ19WMToKKwkJcmV0dXJuIGxlMzJfdG9fY3B1KGxtbS0+bG12X21kX3YxLmxtdl9zdHJpcGVfY291bnQpOworCWNhc2UgTE1WX1VTRVJfTUFHSUM6CisJCXJldHVybiBsZTMyX3RvX2NwdShsbW0tPmxtdl91c2VyX21kLmx1bV9zdHJpcGVfY291bnQpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgbG12X21kc19tZF9zdHJpcGVfY291bnRfc2V0KHVuaW9uIGxtdl9tZHNfbWQgKmxtbSwKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IHN0cmlwZV9jb3VudCkKK3sKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChsZTMyX3RvX2NwdShsbW0tPmxtdl9tYWdpYykpIHsKKwljYXNlIExNVl9NQUdJQ19WMToKKwkJbG1tLT5sbXZfbWRfdjEubG12X3N0cmlwZV9jb3VudCA9IGNwdV90b19sZTMyKHN0cmlwZV9jb3VudCk7CisJCWJyZWFrOworCWNhc2UgTE1WX1VTRVJfTUFHSUM6CisJCWxtbS0+bG12X3VzZXJfbWQubHVtX3N0cmlwZV9jb3VudCA9IGNwdV90b19sZTMyKHN0cmlwZV9jb3VudCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KIAogZW51bSBmbGRfcnBjX29wYyB7CiAJRkxEX1FVRVJZCT0gOTAwLApAQCAtMjU4Miw4ICsyNjc5LDggQEAKICNkZWZpbmUgUExETE1SRVMocmVzKQkocmVzKS0+bHJfbmFtZS5uYW1lWzBdLCAocmVzKS0+bHJfbmFtZS5uYW1lWzFdLCBcCiAJCQkocmVzKS0+bHJfbmFtZS5uYW1lWzJdLCAocmVzKS0+bHJfbmFtZS5uYW1lWzNdCiAKLXN0YXRpYyBpbmxpbmUgaW50IGxkbG1fcmVzX2VxKGNvbnN0IHN0cnVjdCBsZGxtX3Jlc19pZCAqcmVzMCwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBsZGxtX3Jlc19pZCAqcmVzMSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBsZGxtX3Jlc19lcShjb25zdCBzdHJ1Y3QgbGRsbV9yZXNfaWQgKnJlczAsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGxkbG1fcmVzX2lkICpyZXMxKQogewogCXJldHVybiAhbWVtY21wKHJlczAsIHJlczEsIHNpemVvZigqcmVzMCkpOwogfQpAQCAtMjYyMCwxNyArMjcxNywxNSBAQAogCV9fdTY0IGdpZDsKIH07CiAKLSNkZWZpbmUgTERMTV9HSURfQU5ZICgoX191NjQpLTEpCi0KLXN0YXRpYyBpbmxpbmUgaW50IGxkbG1fZXh0ZW50X292ZXJsYXAoc3RydWN0IGxkbG1fZXh0ZW50ICpleDEsCi0JCQkJICAgICAgc3RydWN0IGxkbG1fZXh0ZW50ICpleDIpCitzdGF0aWMgaW5saW5lIGludCBsZGxtX2V4dGVudF9vdmVybGFwKGNvbnN0IHN0cnVjdCBsZGxtX2V4dGVudCAqZXgxLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBsZGxtX2V4dGVudCAqZXgyKQogewogCXJldHVybiAoZXgxLT5zdGFydCA8PSBleDItPmVuZCkgJiYgKGV4Mi0+c3RhcnQgPD0gZXgxLT5lbmQpOwogfQogCiAvKiBjaGVjayBpZiBAZXgxIGNvbnRhaW5zIEBleDIgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGxkbG1fZXh0ZW50X2NvbnRhaW4oc3RydWN0IGxkbG1fZXh0ZW50ICpleDEsCi0JCQkJICAgICAgc3RydWN0IGxkbG1fZXh0ZW50ICpleDIpCitzdGF0aWMgaW5saW5lIGludCBsZGxtX2V4dGVudF9jb250YWluKGNvbnN0IHN0cnVjdCBsZGxtX2V4dGVudCAqZXgxLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBsZGxtX2V4dGVudCAqZXgyKQogewogCXJldHVybiAoZXgxLT5zdGFydCA8PSBleDItPnN0YXJ0KSAmJiAoZXgxLT5lbmQgPj0gZXgyLT5lbmQpOwogfQpAQCAtMjgzMyw3ICsyOTI4LDI5IEBACiB9OwogI2RlZmluZSBPQkRfRklSU1RfT1BDIE9CRF9QSU5HCiAKLS8qIGNhdGFsb2cgb2YgbG9nIG9iamVjdHMgKi8KKy8qKgorICogbGxvZyBjb250ZXh0cyBpbmRpY2VzLgorICoKKyAqIFRoZXJlIGlzIGNvbXBhdGliaWxpdHkgcHJvYmxlbSB3aXRoIGluZGV4ZXMgYmVsb3csIHRoZXkgYXJlIG5vdAorICogY29udGludW91cyBhbmQgbXVzdCBrZWVwIHRoZWlyIG51bWJlcnMgZm9yIGNvbXBhdGliaWxpdHkgbmVlZHMuCisgKiBTZWUgTFUtNTIxOCBmb3IgZGV0YWlscy4KKyAqLworZW51bSBsbG9nX2N0eHRfaWQgeworCUxMT0dfQ09ORklHX09SSUdfQ1RYVCAgPSAgMCwKKwlMTE9HX0NPTkZJR19SRVBMX0NUWFQgPSAxLAorCUxMT0dfTURTX09TVF9PUklHX0NUWFQgPSAyLAorCUxMT0dfTURTX09TVF9SRVBMX0NUWFQgPSAzLCAvKiBrZXB0IGp1c3QgdG8gYXZvaWQgcmUtYXNzaWdubWVudCAqLworCUxMT0dfU0laRV9PUklHX0NUWFQgPSA0LAorCUxMT0dfU0laRV9SRVBMX0NUWFQgPSA1LAorCUxMT0dfVEVTVF9PUklHX0NUWFQgPSA4LAorCUxMT0dfVEVTVF9SRVBMX0NUWFQgPSA5LCAvKiBrZXB0IGp1c3QgdG8gYXZvaWQgcmUtYXNzaWdubWVudCAqLworCUxMT0dfQ0hBTkdFTE9HX09SSUdfQ1RYVCA9IDEyLCAvKio8IGNoYW5nZWxvZyBnZW5lcmF0aW9uIG9uIG1kZCAqLworCUxMT0dfQ0hBTkdFTE9HX1JFUExfQ1RYVCA9IDEzLCAvKio8IGNoYW5nZWxvZyBhY2Nlc3Mgb24gY2xpZW50cyAqLworCS8qIGZvciBtdWx0aXBsZSBjaGFuZ2Vsb2cgY29uc3VtZXJzICovCisJTExPR19DSEFOR0VMT0dfVVNFUl9PUklHX0NUWFQgPSAxNCwKKwlMTE9HX0FHRU5UX09SSUdfQ1RYVCA9IDE1LCAvKio8IGFnZW50IHJlcXVlc3RzIGdlbmVyYXRpb24gb24gY2R0ICovCisJTExPR19NQVhfQ1RYVFMKK307CiAKIC8qKiBJZGVudGlmaWVyIGZvciBhIHNpbmdsZSBsb2cgb2JqZWN0ICovCiBzdHJ1Y3QgbGxvZ19sb2dpZCB7CkBAIC0yOTM5LDcgKzMwNTYsNyBAQAogCV9fdTMyCQkJbHNyX3VpZF9oOwogCV9fdTMyCQkJbHNyX2dpZDsKIAlfX3UzMgkJCWxzcl9naWRfaDsKLQlfX3U2NAkJCWxzcl9wYWRkaW5nOworCV9fdTY0CQkJbHNyX3ZhbGlkOwogCXN0cnVjdCBsbG9nX3JlY190YWlsICAgIGxzcl90YWlsOwogfSBfX3BhY2tlZDsKIApAQCAtMjk2MywxNSArMzA4MCw5IEBACiAKIC8qKiBjaGFuZ2Vsb2cgcmVjb3JkICovCiBzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfcmVjIHsKLQlzdHJ1Y3QgbGxvZ19yZWNfaGRyICBjcl9oZHI7Ci0Jc3RydWN0IGNoYW5nZWxvZ19yZWMgY3I7Ci0Jc3RydWN0IGxsb2dfcmVjX3RhaWwgY3JfdGFpbDsgLyoqPCBmb3Jfc2l6ZXpvZl9vbmx5ICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfZXh0X3JlYyB7Ci0Jc3RydWN0IGxsb2dfcmVjX2hkciAgICAgIGNyX2hkcjsKLQlzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgY3I7Ci0Jc3RydWN0IGxsb2dfcmVjX3RhaWwgICAgIGNyX3RhaWw7IC8qKjwgZm9yX3NpemV6b2Zfb25seSAqLworCXN0cnVjdCBsbG9nX3JlY19oZHIJY3JfaGRyOworCXN0cnVjdCBjaGFuZ2Vsb2dfcmVjCWNyOwkJLyoqPCBWYXJpYWJsZSBsZW5ndGggZmllbGQgKi8KKwlzdHJ1Y3QgbGxvZ19yZWNfdGFpbAljcl9kb19ub3RfdXNlOwkvKio8IGZvcl9zaXplem9mX29ubHkgKi8KIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBsbG9nX2NoYW5nZWxvZ191c2VyX3JlYyB7CkBAIC0yOTkwLDcgKzMxMDEsNyBAQAogCUFSU19TVUNDRUVELAogfTsKIAotc3RhdGljIGlubGluZSBjaGFyICphZ2VudF9yZXFfc3RhdHVzMm5hbWUoZW51bSBhZ2VudF9yZXFfc3RhdHVzIGFycykKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqYWdlbnRfcmVxX3N0YXR1czJuYW1lKGNvbnN0IGVudW0gYWdlbnRfcmVxX3N0YXR1cyBhcnMpCiB7CiAJc3dpdGNoIChhcnMpIHsKIAljYXNlIEFSU19XQUlUSU5HOgpAQCAtMzA1Niw2ICszMTY3LDkgQEAKIAlMTE9HX0ZfWkFQX1dIRU5fRU1QVFkJPSAweDEsCiAJTExPR19GX0lTX0NBVAkJPSAweDIsCiAJTExPR19GX0lTX1BMQUlOCQk9IDB4NCwKKwlMTE9HX0ZfRVhUX0pPQklEICAgICAgICA9IEJJVCgzKSwKKworCUxMT0dfRl9FWFRfTUFTSyA9IExMT0dfRl9FWFRfSk9CSUQsCiB9OwogCiBzdHJ1Y3QgbGxvZ19sb2dfaGRyIHsKQEAgLTMwNjgsOCArMzE4Miw4IEBACiAJX191MzIJCSAgIGxsaF9jYXRfaWR4OwogCS8qIGZvciBhIGNhdGFsb2cgdGhlIGZpcnN0IHBsYWluIHNsb3QgaXMgbmV4dCB0byBpdCAqLwogCXN0cnVjdCBvYmRfdXVpZAkgbGxoX3RndHV1aWQ7Ci0JX191MzIJCSAgIGxsaF9yZXNlcnZlZFtMTE9HX0hFQURFUl9TSVpFL3NpemVvZihfX3UzMikgLSAyM107Ci0JX191MzIJCSAgIGxsaF9iaXRtYXBbTExPR19CSVRNQVBfQllURVMvc2l6ZW9mKF9fdTMyKV07CisJX191MzIJCSAgIGxsaF9yZXNlcnZlZFtMTE9HX0hFQURFUl9TSVpFIC8gc2l6ZW9mKF9fdTMyKSAtIDIzXTsKKwlfX3UzMgkJICAgbGxoX2JpdG1hcFtMTE9HX0JJVE1BUF9CWVRFUyAvIHNpemVvZihfX3UzMildOwogCXN0cnVjdCBsbG9nX3JlY190YWlsICAgIGxsaF90YWlsOwogfSBfX3BhY2tlZDsKIApAQCAtMzE2Niw3ICszMjgwLDcgQEAKICNkZWZpbmUgb19ja3N1bSAgIG9fbmxpbmsKICNkZWZpbmUgb19ncmFudF91c2VkIG9fZGF0YV92ZXJzaW9uCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBsdXN0cmVfc2V0X3dpcmVfb2JkbyhzdHJ1Y3Qgb2JkX2Nvbm5lY3RfZGF0YSAqb2NkLAorc3RhdGljIGlubGluZSB2b2lkIGx1c3RyZV9zZXRfd2lyZV9vYmRvKGNvbnN0IHN0cnVjdCBvYmRfY29ubmVjdF9kYXRhICpvY2QsCiAJCQkJCXN0cnVjdCBvYmRvICp3b2JkbywKIAkJCQkJY29uc3Qgc3RydWN0IG9iZG8gKmxvYmRvKQogewpAQCAtMzE4NSw3ICszMjk5LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBsdXN0cmVfZ2V0X3dpcmVfb2JkbyhzdHJ1Y3Qgb2JkX2Nvbm5lY3RfZGF0YSAqb2NkLAorc3RhdGljIGlubGluZSB2b2lkIGx1c3RyZV9nZXRfd2lyZV9vYmRvKGNvbnN0IHN0cnVjdCBvYmRfY29ubmVjdF9kYXRhICpvY2QsCiAJCQkJCXN0cnVjdCBvYmRvICpsb2JkbywKIAkJCQkJY29uc3Qgc3RydWN0IG9iZG8gKndvYmRvKQogewpAQCAtMzI4NCwxNyArMzM5OCwxNyBAQAogCiAvKiogbHVzdHJlX2NhcGE6OmxjX29wYyAqLwogZW51bSB7Ci0JQ0FQQV9PUENfQk9EWV9XUklURSAgID0gMTw8MCwgIC8qKjwgd3JpdGUgb2JqZWN0IGRhdGEgKi8KLQlDQVBBX09QQ19CT0RZX1JFQUQgICAgPSAxPDwxLCAgLyoqPCByZWFkIG9iamVjdCBkYXRhICovCi0JQ0FQQV9PUENfSU5ERVhfTE9PS1VQID0gMTw8MiwgIC8qKjwgbG9va3VwIG9iamVjdCBmaWQgKi8KLQlDQVBBX09QQ19JTkRFWF9JTlNFUlQgPSAxPDwzLCAgLyoqPCBpbnNlcnQgb2JqZWN0IGZpZCAqLwotCUNBUEFfT1BDX0lOREVYX0RFTEVURSA9IDE8PDQsICAvKio8IGRlbGV0ZSBvYmplY3QgZmlkICovCi0JQ0FQQV9PUENfT1NTX1dSSVRFICAgID0gMTw8NSwgIC8qKjwgd3JpdGUgb3NzIG9iamVjdCBkYXRhICovCi0JQ0FQQV9PUENfT1NTX1JFQUQgICAgID0gMTw8NiwgIC8qKjwgcmVhZCBvc3Mgb2JqZWN0IGRhdGEgKi8KLQlDQVBBX09QQ19PU1NfVFJVTkMgICAgPSAxPDw3LCAgLyoqPCB0cnVuY2F0ZSBvc3Mgb2JqZWN0ICovCi0JQ0FQQV9PUENfT1NTX0RFU1RST1kgID0gMTw8OCwgIC8qKjwgZGVzdHJveSBvc3Mgb2JqZWN0ICovCi0JQ0FQQV9PUENfTUVUQV9XUklURSAgID0gMTw8OSwgIC8qKjwgd3JpdGUgb2JqZWN0IG1ldGEgZGF0YSAqLwotCUNBUEFfT1BDX01FVEFfUkVBRCAgICA9IDE8PDEwLCAvKio8IHJlYWQgb2JqZWN0IG1ldGEgZGF0YSAqLworCUNBUEFfT1BDX0JPRFlfV1JJVEUgICA9IDEgPDwgMCwgIC8qKjwgd3JpdGUgb2JqZWN0IGRhdGEgKi8KKwlDQVBBX09QQ19CT0RZX1JFQUQgICAgPSAxIDw8IDEsICAvKio8IHJlYWQgb2JqZWN0IGRhdGEgKi8KKwlDQVBBX09QQ19JTkRFWF9MT09LVVAgPSAxIDw8IDIsICAvKio8IGxvb2t1cCBvYmplY3QgZmlkICovCisJQ0FQQV9PUENfSU5ERVhfSU5TRVJUID0gMSA8PCAzLCAgLyoqPCBpbnNlcnQgb2JqZWN0IGZpZCAqLworCUNBUEFfT1BDX0lOREVYX0RFTEVURSA9IDEgPDwgNCwgIC8qKjwgZGVsZXRlIG9iamVjdCBmaWQgKi8KKwlDQVBBX09QQ19PU1NfV1JJVEUgICAgPSAxIDw8IDUsICAvKio8IHdyaXRlIG9zcyBvYmplY3QgZGF0YSAqLworCUNBUEFfT1BDX09TU19SRUFEICAgICA9IDEgPDwgNiwgIC8qKjwgcmVhZCBvc3Mgb2JqZWN0IGRhdGEgKi8KKwlDQVBBX09QQ19PU1NfVFJVTkMgICAgPSAxIDw8IDcsICAvKio8IHRydW5jYXRlIG9zcyBvYmplY3QgKi8KKwlDQVBBX09QQ19PU1NfREVTVFJPWSAgPSAxIDw8IDgsICAvKio8IGRlc3Ryb3kgb3NzIG9iamVjdCAqLworCUNBUEFfT1BDX01FVEFfV1JJVEUgICA9IDEgPDwgOSwgIC8qKjwgd3JpdGUgb2JqZWN0IG1ldGEgZGF0YSAqLworCUNBUEFfT1BDX01FVEFfUkVBRCAgICA9IDEgPDwgMTAsIC8qKjwgcmVhZCBvYmplY3QgbWV0YSBkYXRhICovCiB9OwogCiAjZGVmaW5lIENBUEFfT1BDX09TU19SVyAoQ0FQQV9PUENfT1NTX1JFQUQgfCBDQVBBX09QQ19PU1NfV1JJVEUpCkBAIC0zMzQ2LDYgKzM0NjAsMTQgQEAKIAogdm9pZCBsdXN0cmVfc3dhYl9maWQycGF0aChzdHJ1Y3QgZ2V0aW5mb19maWQycGF0aCAqZ2YpOwogCisvKiogcGF0aDJwYXJlbnQgcmVxdWVzdC9yZXBseSBzdHJ1Y3R1cmVzICovCitzdHJ1Y3QgZ2V0cGFyZW50IHsKKwlzdHJ1Y3QgbHVfZmlkCWdwX2ZpZDsJCS8qKjwgcGFyZW50IEZJRCAqLworCV9fdTMyCQlncF9saW5rbm87CS8qKjwgaGFyZGxpbmsgbnVtYmVyICovCisJX191MzIJCWdwX25hbWVfc2l6ZTsJLyoqPCBzaXplIG9mIHRoZSBuYW1lIGZpZWxkICovCisJY2hhcgkJZ3BfbmFtZVswXTsJLyoqPCB6ZXJvLXRlcm1pbmF0ZWQgbGluayBuYW1lICovCit9IF9fcGFja2VkOworCiBlbnVtIHsKIAlMQVlPVVRfSU5URU5UX0FDQ0VTUyAgICA9IDAsCiAJTEFZT1VUX0lOVEVOVF9SRUFEICAgICAgPSAxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2Q3Yzk0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lvY3RsLmgKQEAgLTAsMCArMSw0MTIgQEAKKy8qCisgKiBHUEwgSEVBREVSIFNUQVJUCisgKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LAorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZAorICogaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgSWYgbm90LCBzZWUKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyAqCisgKiBHUEwgSEVBREVSIEVORAorICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTUsIEludGVsIENvcnBvcmF0aW9uLgorICovCisjaWZuZGVmIExVU1RSRV9JT0NUTF9IXworI2RlZmluZSBMVVNUUkVfSU9DVExfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzLmgiCisjaW5jbHVkZSAibHVzdHJlX2lkbC5oIgorCisjaWZkZWYgX19LRVJORUxfXworIyBpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorIyBpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyMgaW5jbHVkZSAiLi4vb2JkX3N1cHBvcnQuaCIKKyNlbHNlIC8qIF9fS0VSTkVMX18gKi8KKyMgaW5jbHVkZSA8bWFsbG9jLmg+CisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpYmNmcy91dGlsL2lvY3RsLmg+CisjZW5kaWYgLyogIV9fS0VSTkVMX18gKi8KKworI2lmICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKExVU1RSRV9VVElMUykKKyMgZXJyb3IgVGhpcyBmaWxlIGlzIGZvciBMdXN0cmUgaW50ZXJuYWwgdXNlIG9ubHkuCisjZW5kaWYKKworZW51bSBtZF9lY2hvX2NtZCB7CisJRUNIT19NRF9DUkVBVEUJCT0gMSwgLyogT3Blbi9DcmVhdGUgZmlsZSBvbiBNRFQgKi8KKwlFQ0hPX01EX01LRElSCQk9IDIsIC8qIE1rZGlyIG9uIE1EVCAqLworCUVDSE9fTURfREVTVFJPWQkJPSAzLCAvKiBVbmxpbmsgZmlsZSBvbiBNRFQgKi8KKwlFQ0hPX01EX1JNRElSCQk9IDQsIC8qIFJtZGlyIG9uIE1EVCAqLworCUVDSE9fTURfTE9PS1VQCQk9IDUsIC8qIExvb2t1cCBvbiBNRFQgKi8KKwlFQ0hPX01EX0dFVEFUVFIJCT0gNiwgLyogR2V0YXR0ciBvbiBNRFQgKi8KKwlFQ0hPX01EX1NFVEFUVFIJCT0gNywgLyogU2V0YXR0ciBvbiBNRFQgKi8KKwlFQ0hPX01EX0FMTE9DX0ZJRAk9IDgsIC8qIEdldCBGSURzIGZyb20gTURUICovCit9OworCisjZGVmaW5lIE9CRF9ERVZfSUQgMQorI2RlZmluZSBPQkRfREVWX05BTUUgIm9iZCIKKyNkZWZpbmUgT0JEX0RFVl9QQVRIICIvZGV2LyIgT0JEX0RFVl9OQU1FCisjZGVmaW5lIE9CRF9ERVZfTUFKT1IgMTAKKyNkZWZpbmUgT0JEX0RFVl9NSU5PUiAyNDEKKworI2RlZmluZSBPQkRfSU9DVExfVkVSU0lPTgkweDAwMDEwMDA0CisjZGVmaW5lIE9CRF9ERVZfQllfREVWTkFNRQkweGZmZmZkMGRlCisjZGVmaW5lIE9CRF9NQVhfSU9DVExfQlVGRkVSCUNPTkZJR19MVVNUUkVfT0JEX01BWF9JT0NUTF9CVUZGRVIKKworc3RydWN0IG9iZF9pb2N0bF9kYXRhIHsKKwlfX3UzMgkJaW9jX2xlbjsKKwlfX3UzMgkJaW9jX3ZlcnNpb247CisKKwl1bmlvbiB7CisJCV9fdTY0CWlvY19jb29raWU7CisJCV9fdTY0CWlvY191NjRfMTsKKwl9OworCXVuaW9uIHsKKwkJX191MzIJaW9jX2Nvbm4xOworCQlfX3UzMglpb2NfdTMyXzE7CisJfTsKKwl1bmlvbiB7CisJCV9fdTMyCWlvY19jb25uMjsKKwkJX191MzIJaW9jX3UzMl8yOworCX07CisKKwlzdHJ1Y3Qgb2Jkbwlpb2Nfb2JkbzE7CisJc3RydWN0IG9iZG8JaW9jX29iZG8yOworCisJX191NjQJCWlvY19jb3VudDsKKwlfX3U2NAkJaW9jX29mZnNldDsKKwlfX3UzMgkJaW9jX2RldjsKKwlfX3UzMgkJaW9jX2NvbW1hbmQ7CisKKwlfX3U2NAkJaW9jX25pZDsKKwlfX3UzMgkJaW9jX25hbDsKKwlfX3UzMgkJaW9jX3R5cGU7CisKKwkvKiBidWZmZXJzIHRoZSBrZXJuZWwgd2lsbCB0cmVhdCBhcyB1c2VyIHBvaW50ZXJzICovCisJX191MzIJCWlvY19wbGVuMTsKKwljaGFyIF9fdXNlciAgICAqaW9jX3BidWYxOworCV9fdTMyCQlpb2NfcGxlbjI7CisJY2hhciBfX3VzZXIgICAgKmlvY19wYnVmMjsKKworCS8qIGlubGluZSBidWZmZXJzIGZvciB2YXJpb3VzIGFyZ3VtZW50cyAqLworCV9fdTMyCQlpb2NfaW5sbGVuMTsKKwljaGFyCSAgICAgICAqaW9jX2lubGJ1ZjE7CisJX191MzIJCWlvY19pbmxsZW4yOworCWNoYXIJICAgICAgICppb2NfaW5sYnVmMjsKKwlfX3UzMgkJaW9jX2lubGxlbjM7CisJY2hhcgkgICAgICAgKmlvY19pbmxidWYzOworCV9fdTMyCQlpb2NfaW5sbGVuNDsKKwljaGFyCSAgICAgICAqaW9jX2lubGJ1ZjQ7CisKKwljaGFyCQlpb2NfYnVsa1swXTsKK307CisKK3N0cnVjdCBvYmRfaW9jdGxfaGRyIHsKKwlfX3UzMgkJaW9jX2xlbjsKKwlfX3UzMgkJaW9jX3ZlcnNpb247Cit9OworCitzdGF0aWMgaW5saW5lIF9fdTMyIG9iZF9pb2N0bF9wYWNrbGVuKHN0cnVjdCBvYmRfaW9jdGxfZGF0YSAqZGF0YSkKK3sKKwlfX3UzMiBsZW4gPSBjZnNfc2l6ZV9yb3VuZChzaXplb2YoKmRhdGEpKTsKKworCWxlbiArPSBjZnNfc2l6ZV9yb3VuZChkYXRhLT5pb2NfaW5sbGVuMSk7CisJbGVuICs9IGNmc19zaXplX3JvdW5kKGRhdGEtPmlvY19pbmxsZW4yKTsKKwlsZW4gKz0gY2ZzX3NpemVfcm91bmQoZGF0YS0+aW9jX2lubGxlbjMpOworCWxlbiArPSBjZnNfc2l6ZV9yb3VuZChkYXRhLT5pb2NfaW5sbGVuNCk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW5saW5lIGludCBvYmRfaW9jdGxfaXNfaW52YWxpZChzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEgKmRhdGEpCit7CisJaWYgKGRhdGEtPmlvY19sZW4gPiAoMSA8PCAzMCkpIHsKKwkJQ0VSUk9SKCJPQkQgaW9jdGw6IGlvY19sZW4gbGFyZ2VyIHRoYW4gMTw8MzBcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoZGF0YS0+aW9jX2lubGxlbjEgPiAoMSA8PCAzMCkpIHsKKwkJQ0VSUk9SKCJPQkQgaW9jdGw6IGlvY19pbmxsZW4xIGxhcmdlciB0aGFuIDE8PDMwXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGRhdGEtPmlvY19pbmxsZW4yID4gKDEgPDwgMzApKSB7CisJCUNFUlJPUigiT0JEIGlvY3RsOiBpb2NfaW5sbGVuMiBsYXJnZXIgdGhhbiAxPDwzMFxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChkYXRhLT5pb2NfaW5sbGVuMyA+ICgxIDw8IDMwKSkgeworCQlDRVJST1IoIk9CRCBpb2N0bDogaW9jX2lubGxlbjMgbGFyZ2VyIHRoYW4gMTw8MzBcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoZGF0YS0+aW9jX2lubGxlbjQgPiAoMSA8PCAzMCkpIHsKKwkJQ0VSUk9SKCJPQkQgaW9jdGw6IGlvY19pbmxsZW40IGxhcmdlciB0aGFuIDE8PDMwXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGRhdGEtPmlvY19pbmxidWYxICYmICFkYXRhLT5pb2NfaW5sbGVuMSkgeworCQlDRVJST1IoIk9CRCBpb2N0bDogaW5sYnVmMSBwb2ludGVyIGJ1dCAwIGxlbmd0aFxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChkYXRhLT5pb2NfaW5sYnVmMiAmJiAhZGF0YS0+aW9jX2lubGxlbjIpIHsKKwkJQ0VSUk9SKCJPQkQgaW9jdGw6IGlubGJ1ZjIgcG9pbnRlciBidXQgMCBsZW5ndGhcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoZGF0YS0+aW9jX2lubGJ1ZjMgJiYgIWRhdGEtPmlvY19pbmxsZW4zKSB7CisJCUNFUlJPUigiT0JEIGlvY3RsOiBpbmxidWYzIHBvaW50ZXIgYnV0IDAgbGVuZ3RoXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGRhdGEtPmlvY19pbmxidWY0ICYmICFkYXRhLT5pb2NfaW5sbGVuNCkgeworCQlDRVJST1IoIk9CRCBpb2N0bDogaW5sYnVmNCBwb2ludGVyIGJ1dCAwIGxlbmd0aFxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChkYXRhLT5pb2NfcGJ1ZjEgJiYgIWRhdGEtPmlvY19wbGVuMSkgeworCQlDRVJST1IoIk9CRCBpb2N0bDogcGJ1ZjEgcG9pbnRlciBidXQgMCBsZW5ndGhcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoZGF0YS0+aW9jX3BidWYyICYmICFkYXRhLT5pb2NfcGxlbjIpIHsKKwkJQ0VSUk9SKCJPQkQgaW9jdGw6IHBidWYyIHBvaW50ZXIgYnV0IDAgbGVuZ3RoXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFkYXRhLT5pb2NfcGJ1ZjEgJiYgZGF0YS0+aW9jX3BsZW4xKSB7CisJCUNFUlJPUigiT0JEIGlvY3RsOiBwbGVuMSBzZXQgYnV0IE5VTEwgcG9pbnRlclxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmICghZGF0YS0+aW9jX3BidWYyICYmIGRhdGEtPmlvY19wbGVuMikgeworCQlDRVJST1IoIk9CRCBpb2N0bDogcGxlbjIgc2V0IGJ1dCBOVUxMIHBvaW50ZXJcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAob2JkX2lvY3RsX3BhY2tsZW4oZGF0YSkgPiBkYXRhLT5pb2NfbGVuKSB7CisJCUNFUlJPUigiT0JEIGlvY3RsOiBwYWNrbGVuIGV4Y2VlZHMgaW9jX2xlbiAoJWQgPiAlZClcbiIsCisJCSAgICAgICBvYmRfaW9jdGxfcGFja2xlbihkYXRhKSwgZGF0YS0+aW9jX2xlbik7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgX19LRVJORUxfXworCitpbnQgb2JkX2lvY3RsX2dldGRhdGEoY2hhciAqKmJ1ZiwgaW50ICpsZW4sIHZvaWQgX191c2VyICphcmcpOworaW50IG9iZF9pb2N0bF9wb3BkYXRhKHZvaWQgX191c2VyICphcmcsIHZvaWQgKmRhdGEsIGludCBsZW4pOworCitzdGF0aWMgaW5saW5lIHZvaWQgb2JkX2lvY3RsX2ZyZWVkYXRhKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlrdmZyZWUoYnVmKTsKK30KKworI2Vsc2UgLyogX19LRVJORUxfXyAqLworCitzdGF0aWMgaW5saW5lIGludCBvYmRfaW9jdGxfcGFjayhzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEgKmRhdGEsIGNoYXIgKipwYnVmLAorCQkJCSBpbnQgbWF4X2xlbikKK3sKKwljaGFyICpwdHI7CisJc3RydWN0IG9iZF9pb2N0bF9kYXRhICpvdmVybGF5OworCisJZGF0YS0+aW9jX2xlbiA9IG9iZF9pb2N0bF9wYWNrbGVuKGRhdGEpOworCWRhdGEtPmlvY192ZXJzaW9uID0gT0JEX0lPQ1RMX1ZFUlNJT047CisKKwlpZiAoKnBidWYgJiYgZGF0YS0+aW9jX2xlbiA+IG1heF9sZW4pIHsKKwkJZnByaW50ZihzdGRlcnIsICJwYnVmID0gJXAsIGlvY19sZW4gPSAldSwgbWF4X2xlbiA9ICVkXG4iLAorCQkJKnBidWYsIGRhdGEtPmlvY19sZW4sIG1heF9sZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoISpwYnVmKQorCQkqcGJ1ZiA9IG1hbGxvYyhkYXRhLT5pb2NfbGVuKTsKKworCWlmICghKnBidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJb3ZlcmxheSA9IChzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEgKikqcGJ1ZjsKKwltZW1jcHkoKnBidWYsIGRhdGEsIHNpemVvZigqZGF0YSkpOworCisJcHRyID0gb3ZlcmxheS0+aW9jX2J1bGs7CisJaWYgKGRhdGEtPmlvY19pbmxidWYxKQorCQlMT0dMKGRhdGEtPmlvY19pbmxidWYxLCBkYXRhLT5pb2NfaW5sbGVuMSwgcHRyKTsKKworCWlmIChkYXRhLT5pb2NfaW5sYnVmMikKKwkJTE9HTChkYXRhLT5pb2NfaW5sYnVmMiwgZGF0YS0+aW9jX2lubGxlbjIsIHB0cik7CisKKwlpZiAoZGF0YS0+aW9jX2lubGJ1ZjMpCisJCUxPR0woZGF0YS0+aW9jX2lubGJ1ZjMsIGRhdGEtPmlvY19pbmxsZW4zLCBwdHIpOworCisJaWYgKGRhdGEtPmlvY19pbmxidWY0KQorCQlMT0dMKGRhdGEtPmlvY19pbmxidWY0LCBkYXRhLT5pb2NfaW5sbGVuNCwgcHRyKTsKKworCWlmIChvYmRfaW9jdGxfaXNfaW52YWxpZChvdmVybGF5KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgaW9jdGwgZGF0YTogaW9jX2xlbiA9ICV1LCBtYXhfbGVuID0gJWRcbiIsCisJCQlkYXRhLT5pb2NfbGVuLCBtYXhfbGVuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitvYmRfaW9jdGxfdW5wYWNrKHN0cnVjdCBvYmRfaW9jdGxfZGF0YSAqZGF0YSwgY2hhciAqcGJ1ZiwgaW50IG1heF9sZW4pCit7CisJY2hhciAqcHRyOworCXN0cnVjdCBvYmRfaW9jdGxfZGF0YSAqb3ZlcmxheTsKKworCWlmICghcGJ1ZikKKwkJcmV0dXJuIDE7CisKKwlvdmVybGF5ID0gKHN0cnVjdCBvYmRfaW9jdGxfZGF0YSAqKXBidWY7CisKKwkvKiBQcmVzZXJ2ZSB0aGUgY2FsbGVyJ3MgYnVmZmVyIHBvaW50ZXJzICovCisJb3ZlcmxheS0+aW9jX2lubGJ1ZjEgPSBkYXRhLT5pb2NfaW5sYnVmMTsKKwlvdmVybGF5LT5pb2NfaW5sYnVmMiA9IGRhdGEtPmlvY19pbmxidWYyOworCW92ZXJsYXktPmlvY19pbmxidWYzID0gZGF0YS0+aW9jX2lubGJ1ZjM7CisJb3ZlcmxheS0+aW9jX2lubGJ1ZjQgPSBkYXRhLT5pb2NfaW5sYnVmNDsKKworCW1lbWNweShkYXRhLCBwYnVmLCBzaXplb2YoKmRhdGEpKTsKKworCXB0ciA9IG92ZXJsYXktPmlvY19idWxrOworCWlmIChkYXRhLT5pb2NfaW5sYnVmMSkKKwkJTE9HVShkYXRhLT5pb2NfaW5sYnVmMSwgZGF0YS0+aW9jX2lubGxlbjEsIHB0cik7CisKKwlpZiAoZGF0YS0+aW9jX2lubGJ1ZjIpCisJCUxPR1UoZGF0YS0+aW9jX2lubGJ1ZjIsIGRhdGEtPmlvY19pbmxsZW4yLCBwdHIpOworCisJaWYgKGRhdGEtPmlvY19pbmxidWYzKQorCQlMT0dVKGRhdGEtPmlvY19pbmxidWYzLCBkYXRhLT5pb2NfaW5sbGVuMywgcHRyKTsKKworCWlmIChkYXRhLT5pb2NfaW5sYnVmNCkKKwkJTE9HVShkYXRhLT5pb2NfaW5sYnVmNCwgZGF0YS0+aW9jX2lubGxlbjQsIHB0cik7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qICFfX0tFUk5FTF9fICovCisKKy8qCisgKiBPQkRfSU9DX0RBVEFfVFlQRSBpcyBvbmx5IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2l0aCBvbGRlcgorICogTGludXggTHVzdHJlIHVzZXIgdG9vbHMuIE5ldyBpb2N0bHMgc2hvdWxkIE5PVCB1c2UgdGhpcyBtYWNybyBhcworICogdGhlIGlvY3RsICJzaXplIi4gSW5zdGVhZCB0aGUgaW9jdGwgc2hvdWxkIGdldCBhICJzaXplIiBhcmd1bWVudAorICogd2hpY2ggaXMgdGhlIGFjdHVhbCBkYXRhIHR5cGUgdXNlZCBieSB0aGUgaW9jdGwsIHRvIGVuc3VyZSB0aGUKKyAqIGlvY3RsIGludGVyZmFjZSBpcyB2ZXJzaW9uZWQgY29ycmVjdGx5LgorICovCisjZGVmaW5lIE9CRF9JT0NfREFUQV9UWVBFCWxvbmcKKworLyoJSU9DX0xETE1fVEVTVAkJX0lPV1IoJ2YnLCA0MCwgbG9uZykgKi8KKy8qCUlPQ19MRExNX0RVTVAJCV9JT1dSKCdmJywgNDEsIGxvbmcpICovCisvKglJT0NfTERMTV9SRUdSRVNTX1NUQVJUCV9JT1dSKCdmJywgNDIsIGxvbmcpICovCisvKglJT0NfTERMTV9SRUdSRVNTX1NUT1AJX0lPV1IoJ2YnLCA0MywgbG9uZykgKi8KKworI2RlZmluZSBPQkRfSU9DX0NSRUFURQkJX0lPV1IoJ2YnLCAxMDEsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX0RFU1RST1kJCV9JT1coJ2YnLCAxMDQsIE9CRF9JT0NfREFUQV9UWVBFKQorLyoJT0JEX0lPQ19QUkVBTExPQ0FURQlfSU9XUignZicsIDEwNSwgT0JEX0lPQ19EQVRBX1RZUEUpICovCisKKyNkZWZpbmUgT0JEX0lPQ19TRVRBVFRSCQlfSU9XKCdmJywgMTA3LCBPQkRfSU9DX0RBVEFfVFlQRSkKKyNkZWZpbmUgT0JEX0lPQ19HRVRBVFRSCQlfSU9XUignZicsIDEwOCwgT0JEX0lPQ19EQVRBX1RZUEUpCisjZGVmaW5lIE9CRF9JT0NfUkVBRAkJX0lPV1IoJ2YnLCAxMDksIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX1dSSVRFCQlfSU9XUignZicsIDExMCwgT0JEX0lPQ19EQVRBX1RZUEUpCisKKyNkZWZpbmUgT0JEX0lPQ19TVEFURlMJCV9JT1dSKCdmJywgMTEzLCBPQkRfSU9DX0RBVEFfVFlQRSkKKyNkZWZpbmUgT0JEX0lPQ19TWU5DCQlfSU9XKCdmJywgMTE0LCBPQkRfSU9DX0RBVEFfVFlQRSkKKy8qCU9CRF9JT0NfUkVBRDIJCV9JT1dSKCdmJywgMTE1LCBPQkRfSU9DX0RBVEFfVFlQRSkgKi8KKy8qCU9CRF9JT0NfRk9STUFUCQlfSU9XUignZicsIDExNiwgT0JEX0lPQ19EQVRBX1RZUEUpICovCisvKglPQkRfSU9DX1BBUlRJVElPTglfSU9XUignZicsIDExNywgT0JEX0lPQ19EQVRBX1RZUEUpICovCisvKglPQkRfSU9DX0NPUFkJCV9JT1dSKCdmJywgMTIwLCBPQkRfSU9DX0RBVEFfVFlQRSkgKi8KKy8qCU9CRF9JT0NfTUlHUgkJX0lPV1IoJ2YnLCAxMjEsIE9CRF9JT0NfREFUQV9UWVBFKSAqLworLyoJT0JEX0lPQ19QVU5DSAkJX0lPV1IoJ2YnLCAxMjIsIE9CRF9JT0NfREFUQV9UWVBFKSAqLworCisvKglPQkRfSU9DX01PRFVMRV9ERUJVRwlfSU9XUignZicsIDEyNCwgT0JEX0lPQ19EQVRBX1RZUEUpICovCisjZGVmaW5lIE9CRF9JT0NfQlJXX1JFQUQJX0lPV1IoJ2YnLCAxMjUsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX0JSV19XUklURQlfSU9XUignZicsIDEyNiwgT0JEX0lPQ19EQVRBX1RZUEUpCisjZGVmaW5lIE9CRF9JT0NfTkFNRTJERVYJX0lPV1IoJ2YnLCAxMjcsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX1VVSUQyREVWCV9JT1dSKCdmJywgMTMwLCBPQkRfSU9DX0RBVEFfVFlQRSkKKyNkZWZpbmUgT0JEX0lPQ19HRVROQU1FCQlfSU9XUignZicsIDEzMSwgT0JEX0lPQ19EQVRBX1RZUEUpCisjZGVmaW5lIE9CRF9JT0NfR0VUTUROQU1FCV9JT1IoJ2YnLCAxMzEsIGNoYXJbTUFYX09CRF9OQU1FXSkKKyNkZWZpbmUgT0JEX0lPQ19HRVREVE5BTUUJT0JEX0lPQ19HRVROQU1FCisjZGVmaW5lIE9CRF9JT0NfTE9WX0dFVF9DT05GSUcJX0lPV1IoJ2YnLCAxMzIsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX0NMSUVOVF9SRUNPVkVSCV9JT1coJ2YnLCAxMzMsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX1BJTkdfVEFSR0VUCV9JT1coJ2YnLCAxMzYsIE9CRF9JT0NfREFUQV9UWVBFKQorCisvKglPQkRfSU9DX0RFQ19GU19VU0VfQ09VTlQgX0lPKCdmJywgMTM5KSAqLworI2RlZmluZSBPQkRfSU9DX05PX1RSQU5TTk8JX0lPVygnZicsIDE0MCwgT0JEX0lPQ19EQVRBX1RZUEUpCisjZGVmaW5lIE9CRF9JT0NfU0VUX1JFQURPTkxZCV9JT1coJ2YnLCAxNDEsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX0FCT1JUX1JFQ09WRVJZCV9JT1IoJ2YnLCAxNDIsIE9CRF9JT0NfREFUQV9UWVBFKQorLyoJT0JEX0lPQ19ST09UX1NRVUFTSAlfSU9XUignZicsIDE0MywgT0JEX0lPQ19EQVRBX1RZUEUpICovCisjZGVmaW5lIE9CRF9HRVRfVkVSU0lPTgkJX0lPV1IoJ2YnLCAxNDQsIE9CRF9JT0NfREFUQV9UWVBFKQorLyoJT0JEX0lPQ19HU1NfU1VQUE9SVAlfSU9XUignZicsIDE0NSwgT0JEX0lPQ19EQVRBX1RZUEUpICovCisvKglPQkRfSU9DX0NMT1NFX1VVSUQJX0lPV1IoJ2YnLCAxNDcsIE9CRF9JT0NfREFUQV9UWVBFKSAqLworI2RlZmluZSBPQkRfSU9DX0NIQU5HRUxPR19TRU5ECV9JT1coJ2YnLCAxNDgsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX0dFVERFVklDRQlfSU9XUignZicsIDE0OSwgT0JEX0lPQ19EQVRBX1RZUEUpCisjZGVmaW5lIE9CRF9JT0NfRklEMlBBVEgJX0lPV1IoJ2YnLCAxNTAsIE9CRF9JT0NfREFUQV9UWVBFKQorLyoJbHVzdHJlL2x1c3RyZV91c2VyLmgJMTUxLTE1MyAqLworLyoJT0JEX0lPQ19MT1ZfU0VUU1RSSVBFCTE1NCBMTF9JT0NfTE9WX1NFVFNUUklQRSAqLworLyoJT0JEX0lPQ19MT1ZfR0VUU1RSSVBFCTE1NSBMTF9JT0NfTE9WX0dFVFNUUklQRSAqLworLyoJT0JEX0lPQ19MT1ZfU0VURUEJMTU2IExMX0lPQ19MT1ZfU0VURUEgKi8KKy8qCWx1c3RyZS9sdXN0cmVfdXNlci5oCTE1Ny0xNTkgKi8KKyNkZWZpbmUJT0JEX0lPQ19RVU9UQUNIRUNLCV9JT1coJ2YnLCAxNjAsIGludCkKKyNkZWZpbmUJT0JEX0lPQ19QT0xMX1FVT1RBQ0hFQ0sJX0lPUignZicsIDE2MSwgc3RydWN0IGlmX3F1b3RhY2hlY2sgKikKKyNkZWZpbmUgT0JEX0lPQ19RVU9UQUNUTAlfSU9XUignZicsIDE2Miwgc3RydWN0IGlmX3F1b3RhY3RsKQorLyoJbHVzdHJlL2x1c3RyZV91c2VyLmgJMTYzLTE3NiAqLworI2RlZmluZSBPQkRfSU9DX0NIQU5HRUxPR19SRUcJX0lPVygnZicsIDE3Nywgc3RydWN0IG9iZF9pb2N0bF9kYXRhKQorI2RlZmluZSBPQkRfSU9DX0NIQU5HRUxPR19ERVJFRwlfSU9XKCdmJywgMTc4LCBzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEpCisjZGVmaW5lIE9CRF9JT0NfQ0hBTkdFTE9HX0NMRUFSCV9JT1coJ2YnLCAxNzksIHN0cnVjdCBvYmRfaW9jdGxfZGF0YSkKKy8qCU9CRF9JT0NfUkVDT1JECQlfSU9XUignZicsIDE4MCwgT0JEX0lPQ19EQVRBX1RZUEUpICovCisvKglPQkRfSU9DX0VORFJFQ09SRAlfSU9XUignZicsIDE4MSwgT0JEX0lPQ19EQVRBX1RZUEUpICovCisvKglPQkRfSU9DX1BBUlNFCQlfSU9XUignZicsIDE4MiwgT0JEX0lPQ19EQVRBX1RZUEUpICovCisvKglPQkRfSU9DX0RPUkVDT1JECV9JT1dSKCdmJywgMTgzLCBPQkRfSU9DX0RBVEFfVFlQRSkgKi8KKyNkZWZpbmUgT0JEX0lPQ19QUk9DRVNTX0NGRwlfSU9XUignZicsIDE4NCwgT0JEX0lPQ19EQVRBX1RZUEUpCisvKglPQkRfSU9DX0RVTVBfTE9HCV9JT1dSKCdmJywgMTg1LCBPQkRfSU9DX0RBVEFfVFlQRSkgKi8KKy8qCU9CRF9JT0NfQ0xFQVJfTE9HCV9JT1dSKCdmJywgMTg2LCBPQkRfSU9DX0RBVEFfVFlQRSkgKi8KKyNkZWZpbmUgT0JEX0lPQ19QQVJBTQkJX0lPVygnZicsIDE4NywgT0JEX0lPQ19EQVRBX1RZUEUpCisjZGVmaW5lIE9CRF9JT0NfUE9PTAkJX0lPV1IoJ2YnLCAxODgsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX1JFUExBQ0VfTklEUwlfSU9XUignZicsIDE4OSwgT0JEX0lPQ19EQVRBX1RZUEUpCisKKyNkZWZpbmUgT0JEX0lPQ19DQVRMT0dMSVNUCV9JT1dSKCdmJywgMTkwLCBPQkRfSU9DX0RBVEFfVFlQRSkKKyNkZWZpbmUgT0JEX0lPQ19MTE9HX0lORk8JX0lPV1IoJ2YnLCAxOTEsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX0xMT0dfUFJJTlQJX0lPV1IoJ2YnLCAxOTIsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX0xMT0dfQ0FOQ0VMCV9JT1dSKCdmJywgMTkzLCBPQkRfSU9DX0RBVEFfVFlQRSkKKyNkZWZpbmUgT0JEX0lPQ19MTE9HX1JFTU9WRQlfSU9XUignZicsIDE5NCwgT0JEX0lPQ19EQVRBX1RZUEUpCisjZGVmaW5lIE9CRF9JT0NfTExPR19DSEVDSwlfSU9XUignZicsIDE5NSwgT0JEX0lPQ19EQVRBX1RZUEUpCisvKglPQkRfSU9DX0xMT0dfQ0FUSU5GTwlfSU9XUignZicsIDE5NiwgT0JEX0lPQ19EQVRBX1RZUEUpICovCisjZGVmaW5lIE9CRF9JT0NfTk9ERU1BUAkJX0lPV1IoJ2YnLCAxOTcsIE9CRF9JT0NfREFUQV9UWVBFKQorCisvKglFQ0hPX0lPQ19HRVRfU1RSSVBFCV9JT1dSKCdmJywgMjAwLCBPQkRfSU9DX0RBVEFfVFlQRSkgKi8KKy8qCUVDSE9fSU9DX1NFVF9TVFJJUEUJX0lPV1IoJ2YnLCAyMDEsIE9CRF9JT0NfREFUQV9UWVBFKSAqLworLyoJRUNIT19JT0NfRU5RVUVVRQlfSU9XUignZicsIDIwMiwgT0JEX0lPQ19EQVRBX1RZUEUpICovCisvKglFQ0hPX0lPQ19DQU5DRUwJCV9JT1dSKCdmJywgMjAzLCBPQkRfSU9DX0RBVEFfVFlQRSkgKi8KKworI2RlZmluZSBPQkRfSU9DX0dFVF9PQkpfVkVSU0lPTglfSU9SKCdmJywgMjEwLCBPQkRfSU9DX0RBVEFfVFlQRSkKKworLyoJbHVzdHJlL2x1c3RyZV91c2VyLmgJMjEyLTIxNyAqLworI2RlZmluZSBPQkRfSU9DX0dFVF9NTlRPUFQJX0lPVygnZicsIDIyMCwgbW50b3B0X3QpCisjZGVmaW5lIE9CRF9JT0NfRUNIT19NRAkJX0lPUignZicsIDIyMSwgc3RydWN0IG9iZF9pb2N0bF9kYXRhKQorI2RlZmluZSBPQkRfSU9DX0VDSE9fQUxMT0NfU0VRCV9JT1dSKCdmJywgMjIyLCBzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEpCisjZGVmaW5lIE9CRF9JT0NfU1RBUlRfTEZTQ0sJX0lPV1IoJ2YnLCAyMzAsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX1NUT1BfTEZTQ0sJX0lPVygnZicsIDIzMSwgT0JEX0lPQ19EQVRBX1RZUEUpCisjZGVmaW5lIE9CRF9JT0NfUVVFUllfTEZTQ0sJX0lPUignZicsIDIzMiwgc3RydWN0IG9iZF9pb2N0bF9kYXRhKQorLyoJbHVzdHJlL2x1c3RyZV91c2VyLmgJMjQwLTI0OSAqLworLyoJTElCQ0ZTX0lPQ19ERUJVR19NQVNLCTI1MCAqLworCisjZGVmaW5lIElPQ19PU0NfU0VUX0FDVElWRQlfSU9XUignaCcsIDIxLCB2b2lkICopCisKKyNlbmRpZiAvKiBMVVNUUkVfSU9DVExfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV91c2VyLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfdXNlci5oCmluZGV4IGVmNmYzOGYuLjZmYzk4NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV91c2VyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmUvbHVzdHJlX3VzZXIuaApAQCAtNDIsOCArNDIsMzUgQEAKICAqIEB7CiAgKi8KIAorI2lmZGVmIF9fS0VSTkVMX18KKyMgaW5jbHVkZSA8bGludXgvcXVvdGEuaD4KKyMgaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+IC8qIHNucHJpbnRmKCkgKi8KKyMgaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2Vsc2UgLyogIV9fS0VSTkVMX18gKi8KKyMgZGVmaW5lIE5FRURfUVVPVEFfREVGUworIyBpbmNsdWRlIDxzdGRpby5oPiAvKiBzbnByaW50ZigpICovCisjIGluY2x1ZGUgPHN0cmluZy5oPgorIyBpbmNsdWRlIDxzeXMvcXVvdGEuaD4KKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjaW5jbHVkZSAibGxfZmllbWFwLmgiCi0jaW5jbHVkZSAiLi4vbGludXgvbHVzdHJlX3VzZXIuaCIKKworLyoKKyAqIFdlIG5lZWQgdG8gYWx3YXlzIHVzZSA2NGJpdCB2ZXJzaW9uIGJlY2F1c2UgdGhlIHN0cnVjdHVyZQorICogaXMgc2hhcmVkIGFjcm9zcyBlbnRpcmUgY2x1c3RlciB3aGVyZSAzMmJpdCBhbmQgNjRiaXQgbWFjaGluZXMKKyAqIGFyZSBjby1leGlzdGluZy4KKyAqLworI2lmIF9fQklUU19QRVJfTE9ORyAhPSA2NCB8fCBkZWZpbmVkKF9fQVJDSF9XQU5UX1NUQVQ2NCkKK3R5cGVkZWYgc3RydWN0IHN0YXQ2NCAgIGxzdGF0X3Q7CisjZGVmaW5lIGxzdGF0X2YgIGxzdGF0NjQKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCBzdGF0ICAgICBsc3RhdF90OworI2RlZmluZSBsc3RhdF9mICBsc3RhdAorI2VuZGlmCisKKyNkZWZpbmUgSEFWRV9MT1ZfVVNFUl9NRFNfREFUQQorCisjZGVmaW5lIExVU1RSRV9FT0YgMHhmZmZmZmZmZmZmZmZmZmZmVUxMCiAKIC8qIGZvciBzdGF0ZnMoKSAqLwogI2RlZmluZSBMTF9TVVBFUl9NQUdJQyAweDBCRDAwQkQwCkBAIC0xMTcsNiArMTQ0LDExIEBACiAJX191MzIgZl92ZXI7CiB9OwogCitzdGF0aWMgaW5saW5lIGJvb2wgZmlkX2lzX3plcm8oY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKQoreworCXJldHVybiAhZmlkLT5mX3NlcSAmJiAhZmlkLT5mX29pZDsKK30KKwogc3RydWN0IGZpbHRlcl9maWQgewogCXN0cnVjdCBsdV9maWQJZmZfcGFyZW50OyAgLyogZmZfcGFyZW50LmZfdmVyID09IGZpbGUgc3RyaXBlIG51bWJlciAqLwogfTsKQEAgLTE2Nyw3ICsxOTksNyBAQAogICovCiBzdHJ1Y3Qgb3N0X2lkIHsKIAl1bmlvbiB7Ci0JCXN0cnVjdCBvc3RpZCB7CisJCXN0cnVjdCB7CiAJCQlfX3U2NAlvaV9pZDsKIAkJCV9fdTY0CW9pX3NlcTsKIAkJfSBvaTsKQEAgLTE4OCwyNiArMjIwLDIwIEBACiAgKiAqU1RSSVBFKiAtIHNldC9nZXQgbG92X3VzZXJfbWQKICAqICpJTkZPICAgIC0gc2V0L2dldCBsb3ZfdXNlcl9tZHNfZGF0YQogICovCi0vKiBzZWUgPGx1c3RyZV9saWIuaD4gZm9yIGlvY3RsIG51bWJlcnNzIDEwMS0xNTAgKi8KKy8qCWx1c3RyZV9pb2N0bC5oCQkJMTAxLTE1MCAqLwogI2RlZmluZSBMTF9JT0NfR0VURkxBR1MJCSBfSU9SKCdmJywgMTUxLCBsb25nKQogI2RlZmluZSBMTF9JT0NfU0VURkxBR1MJCSBfSU9XKCdmJywgMTUyLCBsb25nKQogI2RlZmluZSBMTF9JT0NfQ0xSRkxBR1MJCSBfSU9XKCdmJywgMTUzLCBsb25nKQotLyogTExfSU9DX0xPVl9TRVRTVFJJUEU6IFNlZSBhbHNvIE9CRF9JT0NfTE9WX1NFVFNUUklQRSAqLwogI2RlZmluZSBMTF9JT0NfTE9WX1NFVFNUUklQRQkgICAgX0lPVygnZicsIDE1NCwgbG9uZykKLS8qIExMX0lPQ19MT1ZfR0VUU1RSSVBFOiBTZWUgYWxzbyBPQkRfSU9DX0xPVl9HRVRTVFJJUEUgKi8KICNkZWZpbmUgTExfSU9DX0xPVl9HRVRTVFJJUEUJICAgIF9JT1coJ2YnLCAxNTUsIGxvbmcpCi0vKiBMTF9JT0NfTE9WX1NFVEVBOiBTZWUgYWxzbyBPQkRfSU9DX0xPVl9TRVRFQSAqLwogI2RlZmluZSBMTF9JT0NfTE9WX1NFVEVBCQlfSU9XKCdmJywgMTU2LCBsb25nKQotI2RlZmluZSBMTF9JT0NfUkVDUkVBVEVfT0JKCSAgICAgX0lPVygnZicsIDE1NywgbG9uZykKLSNkZWZpbmUgTExfSU9DX1JFQ1JFQVRFX0ZJRAkgICAgIF9JT1coJ2YnLCAxNTcsIHN0cnVjdCBsdV9maWQpCisvKglMTF9JT0NfUkVDUkVBVEVfT0JKCQkxNTcgb2Jzb2xldGUgKi8KKy8qCUxMX0lPQ19SRUNSRUFURV9GSUQJCTE1OCBvYnNvbGV0ZSAqLwogI2RlZmluZSBMTF9JT0NfR1JPVVBfTE9DSwkgICAgICAgX0lPVygnZicsIDE1OCwgbG9uZykKICNkZWZpbmUgTExfSU9DX0dST1VQX1VOTE9DSwkgICAgIF9JT1coJ2YnLCAxNTksIGxvbmcpCi0vKiBMTF9JT0NfUVVPVEFDSEVDSzogU2VlIGFsc28gT0JEX0lPQ19RVU9UQUNIRUNLICovCi0jZGVmaW5lIExMX0lPQ19RVU9UQUNIRUNLCSAgICAgICBfSU9XKCdmJywgMTYwLCBpbnQpCi0vKiBMTF9JT0NfUE9MTF9RVU9UQUNIRUNLOiBTZWUgYWxzbyBPQkRfSU9DX1BPTExfUVVPVEFDSEVDSyAqLwotI2RlZmluZSBMTF9JT0NfUE9MTF9RVU9UQUNIRUNLCSAgX0lPUignZicsIDE2MSwgc3RydWN0IGlmX3F1b3RhY2hlY2sgKikKLS8qIExMX0lPQ19RVU9UQUNUTDogU2VlIGFsc28gT0JEX0lPQ19RVU9UQUNUTCAqLwotI2RlZmluZSBMTF9JT0NfUVVPVEFDVEwJCSBfSU9XUignZicsIDE2Miwgc3RydWN0IGlmX3F1b3RhY3RsKQorLyogI2RlZmluZSBMTF9JT0NfUVVPVEFDSEVDSwkJMTYwIE9CRF9JT0NfUVVPVEFDSEVDSyAqLworLyogI2RlZmluZSBMTF9JT0NfUE9MTF9RVU9UQUNIRUNLCTE2MSBPQkRfSU9DX1BPTExfUVVPVEFDSEVDSyAqLworLyogI2RlZmluZSBMTF9JT0NfUVVPVEFDVEwJCTE2MiBPQkRfSU9DX1FVT1RBQ1RMICovCiAjZGVmaW5lIElPQ19PQkRfU1RBVEZTCQkgIF9JT1dSKCdmJywgMTY0LCBzdHJ1Y3Qgb2JkX3N0YXRmcyAqKQogI2RlZmluZSBJT0NfTE9WX0dFVElORk8JCSBfSU9XUignZicsIDE2NSwgc3RydWN0IGxvdl91c2VyX21kc19kYXRhICopCiAjZGVmaW5lIExMX0lPQ19GTFVTSENUWAkJIF9JT1coJ2YnLCAxNjYsIGxvbmcpCkBAIC0yMjEsOCArMjQ3LDcgQEAKICNkZWZpbmUgTExfSU9DX0dFVF9DT05ORUNUX0ZMQUdTCV9JT1dSKCdmJywgMTc0LCBfX3U2NCAqKQogI2RlZmluZSBMTF9JT0NfR0VUX01EVElEWAkgICAgICAgX0lPUignZicsIDE3NSwgaW50KQogCi0vKiBzZWUgPGx1c3RyZV9saWIuaD4gZm9yIGlvY3RsIG51bWJlcnMgMTc3LTIxMCAqLwotCisvKglsdXN0cmVfaW9jdGwuaAkJCTE3Ny0yMTAgKi8KICNkZWZpbmUgTExfSU9DX0hTTV9TVEFURV9HRVQJCV9JT1IoJ2YnLCAyMTEsIHN0cnVjdCBoc21fdXNlcl9zdGF0ZSkKICNkZWZpbmUgTExfSU9DX0hTTV9TVEFURV9TRVQJCV9JT1coJ2YnLCAyMTIsIHN0cnVjdCBoc21fc3RhdGVfc2V0KQogI2RlZmluZSBMTF9JT0NfSFNNX0NUX1NUQVJUCQlfSU9XKCdmJywgMjEzLCBzdHJ1Y3QgbHVzdHJlX2tlcm5lbGNvbW0pCkBAIC0yNDIsNiArMjY3LDE3IEBACiAjZGVmaW5lIExMX0lPQ19TRVRfTEVBU0UJCV9JT1dSKCdmJywgMjQzLCBsb25nKQogI2RlZmluZSBMTF9JT0NfR0VUX0xFQVNFCQlfSU8oJ2YnLCAyNDQpCiAjZGVmaW5lIExMX0lPQ19IU01fSU1QT1JUCQlfSU9XUignZicsIDI0NSwgc3RydWN0IGhzbV91c2VyX2ltcG9ydCkKKyNkZWZpbmUgTExfSU9DX0xNVl9TRVRfREVGQVVMVF9TVFJJUEUJX0lPV1IoJ2YnLCAyNDYsIHN0cnVjdCBsbXZfdXNlcl9tZCkKKyNkZWZpbmUgTExfSU9DX01JR1JBVEUJCQlfSU9SKCdmJywgMjQ3LCBpbnQpCisjZGVmaW5lIExMX0lPQ19GSUQyTURUSURYCQlfSU9XUignZicsIDI0OCwgc3RydWN0IGx1X2ZpZCkKKyNkZWZpbmUgTExfSU9DX0dFVFBBUkVOVAkJX0lPV1IoJ2YnLCAyNDksIHN0cnVjdCBnZXRwYXJlbnQpCisKKy8qIExlYXNlIHR5cGVzIGZvciB1c2UgYXMgYXJnIGFuZCByZXR1cm4gb2YgTExfSU9DX3tHRVQsU0VUfV9MRUFTRSBpb2N0bC4gKi8KK2VudW0gbGxfbGVhc2VfdHlwZSB7CisJTExfTEVBU0VfUkRMQ0sJPSAweDEsCisJTExfTEVBU0VfV1JMQ0sJPSAweDIsCisJTExfTEVBU0VfVU5MQ0sJPSAweDQsCit9OwogCiAjZGVmaW5lIExMX1NUQVRGU19MTVYJICAgMQogI2RlZmluZSBMTF9TVEFURlNfTE9WCSAgIDIKQEAgLTI1MywxMCArMjg5LDYgQEAKICNkZWZpbmUgSU9DX01EQ19HRVRGSUxFSU5GTyAgICAgX0lPV1IoSU9DX01EQ19UWVBFLCAyMiwgc3RydWN0IGxvdl91c2VyX21kc19kYXRhICopCiAjZGVmaW5lIExMX0lPQ19NRENfR0VUSU5GTyAgICAgIF9JT1dSKElPQ19NRENfVFlQRSwgMjMsIHN0cnVjdCBsb3ZfdXNlcl9tZHNfZGF0YSAqKQogCi0vKiBLZWVwIHRoZXNlIGZvciBiYWNrd2FyZCBjb21wYXJ0YWJpbGl0eS4gKi8KLSNkZWZpbmUgTExfSU9DX09CRF9TVEFURlMgICAgICAgSU9DX09CRF9TVEFURlMKLSNkZWZpbmUgSU9DX01EQ19HRVRTVFJJUEUgICAgICAgSU9DX01EQ19HRVRGSUxFU1RSSVBFCi0KICNkZWZpbmUgTUFYX09CRF9OQU1FIDEyOCAvKiBJZiB0aGlzIGNoYW5nZXMsIGEgTkVXIGlvY3RsIG11c3QgYmUgYWRkZWQgKi8KIAogLyogRGVmaW5lIE9fTE9WX0RFTEFZX0NSRUFURSB0byBiZSBhIG1hc2sgdGhhdCBpcyBub3QgdXNlZnVsIGZvciByZWd1bGFyCkBAIC0yNzMsMjAgKzMwNSwyNiBAQAogI2RlZmluZSBMTF9GSUxFX0xPQ0tMRVNTX0lPICAgICAweDAwMDAwMDEwIC8qIHNlcnZlci1zaWRlIGxvY2tzIHdpdGggY2lvICovCiAjZGVmaW5lIExMX0ZJTEVfUk1UQUNMCSAgMHgwMDAwMDAyMAogCi0jZGVmaW5lIExPVl9VU0VSX01BR0lDX1YxIDB4MEJEMTBCRDAKLSNkZWZpbmUgTE9WX1VTRVJfTUFHSUMgICAgTE9WX1VTRVJfTUFHSUNfVjEKLSNkZWZpbmUgTE9WX1VTRVJfTUFHSUNfSk9JTl9WMSAweDBCRDIwQkQwCi0jZGVmaW5lIExPVl9VU0VSX01BR0lDX1YzIDB4MEJEMzBCRDAKKyNkZWZpbmUgTE9WX1VTRVJfTUFHSUNfVjEJMHgwQkQxMEJEMAorI2RlZmluZSBMT1ZfVVNFUl9NQUdJQwkJTE9WX1VTRVJfTUFHSUNfVjEKKyNkZWZpbmUgTE9WX1VTRVJfTUFHSUNfSk9JTl9WMQkweDBCRDIwQkQwCisjZGVmaW5lIExPVl9VU0VSX01BR0lDX1YzCTB4MEJEMzBCRDAKKy8qIDB4MEJENDBCRDAgaXMgb2NjdXBpZWQgYnkgTE9WX01BR0lDX01JR1JBVEUgKi8KKyNkZWZpbmUgTE9WX1VTRVJfTUFHSUNfU1BFQ0lGSUMJMHgwQkQ1MEJEMAkvKiBmb3Igc3BlY2lmaWMgT1NUcyAqLwogCi0jZGVmaW5lIExNVl9NQUdJQ19WMSAgICAgIDB4MENEMTBDRDAgICAgLypub3JtYWwgc3RyaXBlIGxtdiBtYWdpYyAqLwotI2RlZmluZSBMTVZfVVNFUl9NQUdJQyAgICAweDBDRDIwQ0QwICAgIC8qZGVmYXVsdCBsbXYgbWFnaWMqLworI2RlZmluZSBMTVZfVVNFUl9NQUdJQyAgICAweDBDRDMwQ0QwICAgIC8qZGVmYXVsdCBsbXYgbWFnaWMqLwogCi0jZGVmaW5lIExPVl9QQVRURVJOX1JBSUQwIDB4MDAxCi0jZGVmaW5lIExPVl9QQVRURVJOX1JBSUQxIDB4MDAyCi0jZGVmaW5lIExPVl9QQVRURVJOX0ZJUlNUIDB4MTAwCisjZGVmaW5lIExPVl9QQVRURVJOX1JBSUQwCTB4MDAxCisjZGVmaW5lIExPVl9QQVRURVJOX1JBSUQxCTB4MDAyCisjZGVmaW5lIExPVl9QQVRURVJOX0ZJUlNUCTB4MTAwCisjZGVmaW5lIExPVl9QQVRURVJOX0NNT0JECTB4MjAwCiAKLSNkZWZpbmUgTE9WX01BWFBPT0xOQU1FIDE2Ci0jZGVmaW5lIExPVl9QT09MTkFNRUYgIiUuMTZzIgorI2RlZmluZSBMT1ZfUEFUVEVSTl9GX01BU0sJMHhmZmZmMDAwMAorI2RlZmluZSBMT1ZfUEFUVEVSTl9GX0hPTEUJMHg0MDAwMDAwMCAvKiB0aGVyZSBpcyBob2xlIGluIExPViBFQSAqLworI2RlZmluZSBMT1ZfUEFUVEVSTl9GX1JFTEVBU0VECTB4ODAwMDAwMDAgLyogSFNNIHJlbGVhc2VkIGZpbGUgKi8KKworI2RlZmluZSBMT1ZfTUFYUE9PTE5BTUUgMTUKKyNkZWZpbmUgTE9WX1BPT0xOQU1FRiAiJS4xNXMiCiAKICNkZWZpbmUgTE9WX01JTl9TVFJJUEVfQklUUyAxNiAgIC8qIG1heGltdW0gUEFHRV9TSVpFIChpYTY0KSwgcG93ZXIgb2YgMiAqLwogI2RlZmluZSBMT1ZfTUlOX1NUUklQRV9TSVpFICgxIDw8IExPVl9NSU5fU1RSSVBFX0JJVFMpCkBAIC0zNDQsMTggKzM4MiwxNyBAQAogCQkJCQkgICAqIHVzZWQgd2hlbiByZWFkaW5nCiAJCQkJCSAgICovCiAJfTsKLQljaGFyICBsbW1fcG9vbF9uYW1lW0xPVl9NQVhQT09MTkFNRV07IC8qIHBvb2wgbmFtZSAqLworCWNoYXIgIGxtbV9wb29sX25hbWVbTE9WX01BWFBPT0xOQU1FICsgMV07ICAgLyogcG9vbCBuYW1lICovCiAJc3RydWN0IGxvdl91c2VyX29zdF9kYXRhX3YxIGxtbV9vYmplY3RzWzBdOyAvKiBwZXItc3RyaXBlIGRhdGEgKi8KIH0gX19wYWNrZWQ7CiAKIHN0YXRpYyBpbmxpbmUgX191MzIgbG92X3VzZXJfbWRfc2l6ZShfX3UxNiBzdHJpcGVzLCBfX3UzMiBsbW1fbWFnaWMpCiB7Ci0JaWYgKGxtbV9tYWdpYyA9PSBMT1ZfVVNFUl9NQUdJQ19WMykKLQkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgbG92X3VzZXJfbWRfdjMpICsKLQkJCQlzdHJpcGVzICogc2l6ZW9mKHN0cnVjdCBsb3ZfdXNlcl9vc3RfZGF0YV92MSk7Ci0JZWxzZQorCWlmIChsbW1fbWFnaWMgPT0gTE9WX1VTRVJfTUFHSUNfVjEpCiAJCXJldHVybiBzaXplb2Yoc3RydWN0IGxvdl91c2VyX21kX3YxKSArCiAJCQkJc3RyaXBlcyAqIHNpemVvZihzdHJ1Y3QgbG92X3VzZXJfb3N0X2RhdGFfdjEpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGxvdl91c2VyX21kX3YzKSArCisJICAgICAgIHN0cmlwZXMgKiBzaXplb2Yoc3RydWN0IGxvdl91c2VyX29zdF9kYXRhX3YxKTsKIH0KIAogLyogQ29tcGlsZSB3aXRoIC1EX0xBUkdFRklMRTY0X1NPVVJDRSBvciAtRF9HTlVfU09VUkNFIChvciAjZGVmaW5lKSB0bwpAQCAtMzc0LDE5ICs0MTEsMjYgQEAKIH0gX19wYWNrZWQ7CiAjZW5kaWYKIAotLyoga2VlcCB0aGlzIHRvIGJlIHRoZSBzYW1lIHNpemUgYXMgbG92X3VzZXJfb3N0X2RhdGFfdjEgKi8KIHN0cnVjdCBsbXZfdXNlcl9tZHNfZGF0YSB7CiAJc3RydWN0IGx1X2ZpZAlsdW1fZmlkOwogCV9fdTMyCQlsdW1fcGFkZGluZzsKIAlfX3UzMgkJbHVtX21kczsKIH07CiAKLS8qIGx1bV90eXBlICovCi1lbnVtIHsKLQlMTVZfU1RSSVBFX1RZUEUgPSAwLAotCUxNVl9ERUZBVUxUX1RZUEUgPSAxLAorZW51bSBsbXZfaGFzaF90eXBlIHsKKwlMTVZfSEFTSF9UWVBFX1VOS05PV04JPSAwLAkvKiAwIGlzIHJlc2VydmVkIGZvciB0ZXN0aW5nIHB1cnBvc2UgKi8KKwlMTVZfSEFTSF9UWVBFX0FMTF9DSEFSUyA9IDEsCisJTE1WX0hBU0hfVFlQRV9GTlZfMUFfNjQgPSAyLAogfTsKIAorI2RlZmluZSBMTVZfSEFTSF9OQU1FX0FMTF9DSEFSUwkJImFsbF9jaGFyIgorI2RlZmluZSBMTVZfSEFTSF9OQU1FX0ZOVl8xQV82NAkJImZudl8xYV82NCIKKworLyoKKyAqIEdvdCB0aGlzIGFjY29yZGluZyB0byBob3cgZ2V0IExPVl9NQVhfU1RSSVBFX0NPVU5ULCBzZWUgYWJvdmUsCisgKiAobWF4IGJ1ZmZlciBzaXplIC0gbG12K3JwYyBoZWFkZXIpIC8gc2l6ZW9mKHN0cnVjdCBsbXZfdXNlcl9tZHNfZGF0YSkKKyAqLworI2RlZmluZSBMTVZfTUFYX1NUUklQRV9DT1VOVCAyMDAwICAvKiAoKDEyICogNDA5NiAtIDI1NikgLyAyNCkgKi8KICNkZWZpbmUgbG12X3VzZXJfbWQgbG12X3VzZXJfbWRfdjEKIHN0cnVjdCBsbXZfdXNlcl9tZF92MSB7CiAJX191MzIJbHVtX21hZ2ljOwkgLyogbXVzdCBiZSB0aGUgZmlyc3QgZmllbGQgKi8KQEAgLTM5Nyw5ICs0NDEsOSBAQAogCV9fdTMyCWx1bV9wYWRkaW5nMTsKIAlfX3UzMglsdW1fcGFkZGluZzI7CiAJX191MzIJbHVtX3BhZGRpbmczOwotCWNoYXIJbHVtX3Bvb2xfbmFtZVtMT1ZfTUFYUE9PTE5BTUVdOworCWNoYXIJbHVtX3Bvb2xfbmFtZVtMT1ZfTUFYUE9PTE5BTUUgKyAxXTsKIAlzdHJ1Y3QJbG12X3VzZXJfbWRzX2RhdGEgIGx1bV9vYmplY3RzWzBdOwotfTsKK30gX19wYWNrZWQ7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGxtdl91c2VyX21kX3NpemUoaW50IHN0cmlwZXMsIGludCBsbW1fbWFnaWMpCiB7CkBAIC00MDcsNiArNDUxLDggQEAKIAkJICAgICAgc3RyaXBlcyAqIHNpemVvZihzdHJ1Y3QgbG12X3VzZXJfbWRzX2RhdGEpOwogfQogCit2b2lkIGx1c3RyZV9zd2FiX2xtdl91c2VyX21kKHN0cnVjdCBsbXZfdXNlcl9tZCAqbHVtKTsKKwogc3RydWN0IGxsX3JlY3JlYXRlX29iaiB7CiAJX191NjQgbHJjX2lkOwogCV9fdTMyIGxyY19vc3RfaWR4OwpAQCAtNDk4LDYgKzU0NCwxMiBAQAogCiAvKioqKioqKioqIFF1b3RhcyAqKioqKioqKioqLwogCisjZGVmaW5lIFFfUVVPVEFDSEVDSyAgIDB4ODAwMTAwIC8qIGRlcHJlY2F0ZWQgYXMgb2YgMi40ICovCisjZGVmaW5lIFFfSU5JVFFVT1RBICAgIDB4ODAwMTAxIC8qIGRlcHJlY2F0ZWQgYXMgb2YgMi40ICAqLworI2RlZmluZSBRX0dFVE9JTkZPICAgICAweDgwMDEwMiAvKiBnZXQgb2JkIHF1b3RhIGluZm8gKi8KKyNkZWZpbmUgUV9HRVRPUVVPVEEgICAgMHg4MDAxMDMgLyogZ2V0IG9iZCBxdW90YXMgKi8KKyNkZWZpbmUgUV9GSU5WQUxJREFURSAgMHg4MDAxMDQgLyogZGVwcmVjYXRlZCBhcyBvZiAyLjQgKi8KKwogLyogdGhlc2UgbXVzdCBiZSBleHBsaWNpdGx5IHRyYW5zbGF0ZWQgaW50byBsaW51eCBRXyogaW4gbGxfZGlyX2lvY3RsICovCiAjZGVmaW5lIExVU1RSRV9RX1FVT1RBT04gICAgMHg4MDAwMDIgICAgIC8qIHR1cm4gcXVvdGFzIG9uICovCiAjZGVmaW5lIExVU1RSRV9RX1FVT1RBT0ZGICAgMHg4MDAwMDMgICAgIC8qIHR1cm4gcXVvdGFzIG9mZiAqLwpAQCAtNjQ4LDExICs3MDAsMTYgQEAKIH0KIAogLyogcGVyLXJlY29yZCBmbGFncyAqLwotI2RlZmluZSBDTEZfVkVSU0lPTiAgICAgMHgxMDAwCi0jZGVmaW5lIENMRl9FWFRfVkVSU0lPTiAweDIwMDAKICNkZWZpbmUgQ0xGX0ZMQUdTSElGVCAgIDEyCiAjZGVmaW5lIENMRl9GTEFHTUFTSyAgICAoKDFVIDw8IENMRl9GTEFHU0hJRlQpIC0gMSkKICNkZWZpbmUgQ0xGX1ZFUk1BU0sgICAgICh+Q0xGX0ZMQUdNQVNLKQorZW51bSBjaGFuZ2Vsb2dfcmVjX2ZsYWdzIHsKKwlDTEZfVkVSU0lPTgk9IDB4MTAwMCwKKwlDTEZfUkVOQU1FCT0gMHgyMDAwLAorCUNMRl9KT0JJRAk9IDB4NDAwMCwKKwlDTEZfU1VQUE9SVEVECT0gQ0xGX1ZFUlNJT04gfCBDTEZfUkVOQU1FIHwgQ0xGX0pPQklECit9OworCiAvKiBBbnl0aGluZyB1bmRlciB0aGUgZmxhZ21hc2sgbWF5IGJlIHBlci10eXBlIChpZiBkZXNpcmVkKSAqLwogLyogRmxhZ3MgZm9yIHVubGluayAqLwogI2RlZmluZSBDTEZfVU5MSU5LX0xBU1QgICAgICAgMHgwMDAxIC8qIFVubGluayBvZiBsYXN0IGhhcmRsaW5rICovCkBAIC03MzYsMTIgKzc5MywzNSBAQAogCSpmbGFncyB8PSAoZXJyb3IgPDwgQ0xGX0hTTV9FUlJfTCk7CiB9CiAKLSNkZWZpbmUgQ1JfTUFYU0laRSBjZnNfc2l6ZV9yb3VuZCgyKk5BTUVfTUFYICsgMSArIFwKLQkJCQkgIHNpemVvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMpKQorZW51bSBjaGFuZ2Vsb2dfc2VuZF9mbGFnIHsKKwkvKiBOb3QgeWV0IGltcGxlbWVudGVkICovCisJQ0hBTkdFTE9HX0ZMQUdfRk9MTE9XCT0gQklUKDApLAorCS8qCisJICogQmxvY2tpbmcgSU8gbWFrZXMgc2Vuc2UgaW4gY2FzZSBvZiBzbG93IHVzZXIgcGFyc2luZyBvZiB0aGUgcmVjb3JkcywKKwkgKiBidXQgaXQgYWxzbyBwcmV2ZW50cyB1cyBmcm9tIGNsZWFuaW5nIHVwIGlmIHRoZSByZWNvcmRzIGFyZSBub3QKKwkgKiBjb25zdW1lZC4KKwkgKi8KKwlDSEFOR0VMT0dfRkxBR19CTE9DSwk9IEJJVCgxKSwKKwkvKiBQYWNrIGpvYmlkIGludG8gdGhlIGNoYW5nZWxvZyByZWNvcmRzIGlmIGF2YWlsYWJsZS4gKi8KKwlDSEFOR0VMT0dfRkxBR19KT0JJRAk9IEJJVCgyKSwKK307CiAKKyNkZWZpbmUgQ1JfTUFYU0laRSBjZnNfc2l6ZV9yb3VuZCgyICogTkFNRV9NQVggKyAyICsgXAorCQkJCSAgY2hhbmdlbG9nX3JlY19vZmZzZXQoQ0xGX1NVUFBPUlRFRCkpCisKKy8qIDMxIHVzYWJsZSBieXRlcyBzdHJpbmcgKyBudWxsIHRlcm1pbmF0b3IuICovCisjZGVmaW5lIExVU1RSRV9KT0JJRF9TSVpFCTMyCisKKy8qCisgKiBUaGlzIGlzIHRoZSBtaW5pbWFsIGNoYW5nZWxvZyByZWNvcmQuIEl0IGNhbiBjb250YWluIGV4dGVuc2lvbnMKKyAqIHN1Y2ggYXMgcmVuYW1lIGZpZWxkcyBvciBwcm9jZXNzIGpvYmlkLiBJdHMgZXhhY3QgY29udGVudCBpcyBkZXNjcmliZWQKKyAqIGJ5IHRoZSBjcl9mbGFncy4KKyAqCisgKiBFeHRlbnNpb25zIGFyZSBwYWNrZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlaXIgY29ycmVzcG9uZGluZyBmbGFncy4KKyAqLwogc3RydWN0IGNoYW5nZWxvZ19yZWMgewogCV9fdTE2CQkgY3JfbmFtZWxlbjsKLQlfX3UxNgkJIGNyX2ZsYWdzOyAvKio8IChmbGFncyZDTEZfRkxBR01BU0spfENMRl9WRVJTSU9OICovCisJX191MTYJCSBjcl9mbGFnczsgLyoqPCBcYSBjaGFuZ2Vsb2dfcmVjX2ZsYWdzICovCiAJX191MzIJCSBjcl90eXBlOyAgLyoqPCBcYSBjaGFuZ2Vsb2dfcmVjX3R5cGUgKi8KIAlfX3U2NAkJIGNyX2luZGV4OyAvKio8IGNoYW5nZWxvZyByZWNvcmQgbnVtYmVyICovCiAJX191NjQJCSBjcl9wcmV2OyAgLyoqPCBsYXN0IGluZGV4IGZvciB0aGlzIHRhcmdldCBmaWQgKi8KQEAgLTc1MSw1NSArODMxLDEzOCBAQAogCQlfX3UzMgkgY3JfbWFya2VyZmxhZ3M7IC8qKjwgQ0xfTUFSSyBmbGFncyAqLwogCX07CiAJc3RydWN0IGx1X2ZpZAkgICAgY3JfcGZpZDsJLyoqPCBwYXJlbnQgZmlkICovCi0JY2hhcgkJICBjcl9uYW1lWzBdOyAgICAgLyoqPCBsYXN0IGVsZW1lbnQgKi8KIH0gX19wYWNrZWQ7CiAKLS8qIGNoYW5nZWxvZ19leHRfcmVjIGlzIDIqc2l6ZW9mKGx1X2ZpZCkgYmlnZ2VyIHRoYW4gY2hhbmdlbG9nX3JlYywgdG8gc2F2ZQotICogc3BhY2UsIG9ubHkgcmVuYW1lIHVzZXMgY2hhbmdlbG9nX2V4dF9yZWMsIHdoaWxlIG90aGVycyB1c2UgY2hhbmdlbG9nX3JlYyB0bwotICogc3RvcmUgcmVjb3Jkcy4KLSAqLwotc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjIHsKLQlfX3UxNgkJCWNyX25hbWVsZW47Ci0JX191MTYJCQljcl9mbGFnczsgLyoqPCAoZmxhZ3MgJiBDTEZfRkxBR01BU0spIHwKLQkJCQkJICAgKglDTEZfRVhUX1ZFUlNJT04KLQkJCQkJICAgKi8KLQlfX3UzMgkJCWNyX3R5cGU7ICAvKio8IFxhIGNoYW5nZWxvZ19yZWNfdHlwZSAqLwotCV9fdTY0CQkJY3JfaW5kZXg7IC8qKjwgY2hhbmdlbG9nIHJlY29yZCBudW1iZXIgKi8KLQlfX3U2NAkJCWNyX3ByZXY7ICAvKio8IGxhc3QgaW5kZXggZm9yIHRoaXMgdGFyZ2V0IGZpZCAqLwotCV9fdTY0CQkJY3JfdGltZTsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBsdV9maWQJY3JfdGZpZDsJLyoqPCB0YXJnZXQgZmlkICovCi0JCV9fdTMyCQljcl9tYXJrZXJmbGFnczsgLyoqPCBDTF9NQVJLIGZsYWdzICovCi0JfTsKLQlzdHJ1Y3QgbHVfZmlkCQljcl9wZmlkOwkvKio8IHRhcmdldCBwYXJlbnQgZmlkICovCi0Jc3RydWN0IGx1X2ZpZAkJY3Jfc2ZpZDsJLyoqPCBzb3VyY2UgZmlkLCBvciB6ZXJvICovCi0Jc3RydWN0IGx1X2ZpZAkJY3Jfc3BmaWQ7ICAgICAvKio8IHNvdXJjZSBwYXJlbnQgZmlkLCBvciB6ZXJvICovCi0JY2hhcgkJCWNyX25hbWVbMF07ICAgICAvKio8IGxhc3QgZWxlbWVudCAqLwotfSBfX3BhY2tlZDsKKy8qIENoYW5nZWxvZyBleHRlbnNpb24gZm9yIFJFTkFNRS4gKi8KK3N0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlbmFtZSB7CisJc3RydWN0IGx1X2ZpZAljcl9zZmlkOwkvKio8IHNvdXJjZSBmaWQsIG9yIHplcm8gKi8KKwlzdHJ1Y3QgbHVfZmlkCWNyX3NwZmlkOwkvKio8IHNvdXJjZSBwYXJlbnQgZmlkLCBvciB6ZXJvICovCit9OwogCi0jZGVmaW5lIENIQU5HRUxPR19SRUNfRVhURU5ERUQocmVjKSBcCi0JKCgocmVjKS0+Y3JfZmxhZ3MgJiBDTEZfVkVSTUFTSykgPT0gQ0xGX0VYVF9WRVJTSU9OKQorLyogQ2hhbmdlbG9nIGV4dGVuc2lvbiB0byBpbmNsdWRlIEpPQklELiAqLworc3RydWN0IGNoYW5nZWxvZ19leHRfam9iaWQgeworCWNoYXIJY3Jfam9iaWRbTFVTVFJFX0pPQklEX1NJWkVdOwkvKio8IHplcm8tdGVybWluYXRlZCBzdHJpbmcuICovCit9OwogCi1zdGF0aWMgaW5saW5lIGludCBjaGFuZ2Vsb2dfcmVjX3NpemUoc3RydWN0IGNoYW5nZWxvZ19yZWMgKnJlYykKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGNoYW5nZWxvZ19yZWNfb2Zmc2V0KGVudW0gY2hhbmdlbG9nX3JlY19mbGFncyBjcmYpCiB7Ci0JcmV0dXJuIENIQU5HRUxPR19SRUNfRVhURU5ERUQocmVjKSA/IHNpemVvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMpIDoKLQkJCQkJICAgICBzaXplb2YoKnJlYyk7CisJc2l6ZV90IHNpemUgPSBzaXplb2Yoc3RydWN0IGNoYW5nZWxvZ19yZWMpOworCisJaWYgKGNyZiAmIENMRl9SRU5BTUUpCisJCXNpemUgKz0gc2l6ZW9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlbmFtZSk7CisKKwlpZiAoY3JmICYgQ0xGX0pPQklEKQorCQlzaXplICs9IHNpemVvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9qb2JpZCk7CisKKwlyZXR1cm4gc2l6ZTsKIH0KIAorc3RhdGljIGlubGluZSBzaXplX3QgY2hhbmdlbG9nX3JlY19zaXplKHN0cnVjdCBjaGFuZ2Vsb2dfcmVjICpyZWMpCit7CisJcmV0dXJuIGNoYW5nZWxvZ19yZWNfb2Zmc2V0KHJlYy0+Y3JfZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHNpemVfdCBjaGFuZ2Vsb2dfcmVjX3ZhcnNpemUoc3RydWN0IGNoYW5nZWxvZ19yZWMgKnJlYykKK3sKKwlyZXR1cm4gY2hhbmdlbG9nX3JlY19zaXplKHJlYykgLSBzaXplb2YoKnJlYykgKyByZWMtPmNyX25hbWVsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlbmFtZSAqY2hhbmdlbG9nX3JlY19yZW5hbWUoc3RydWN0IGNoYW5nZWxvZ19yZWMgKnJlYykKK3sKKwllbnVtIGNoYW5nZWxvZ19yZWNfZmxhZ3MgY3JmID0gcmVjLT5jcl9mbGFncyAmIENMRl9WRVJTSU9OOworCisJcmV0dXJuIChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZW5hbWUgKikoKGNoYXIgKilyZWMgKworCQkJCQkgICAgICAgY2hhbmdlbG9nX3JlY19vZmZzZXQoY3JmKSk7Cit9CisKKy8qIFRoZSBqb2JpZCBmb2xsb3dzIHRoZSByZW5hbWUgZXh0ZW5zaW9uLCBpZiBwcmVzZW50ICovCitzdGF0aWMgaW5saW5lCitzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9qb2JpZCAqY2hhbmdlbG9nX3JlY19qb2JpZChzdHJ1Y3QgY2hhbmdlbG9nX3JlYyAqcmVjKQoreworCWVudW0gY2hhbmdlbG9nX3JlY19mbGFncyBjcmYgPSByZWMtPmNyX2ZsYWdzICYKKwkJCQkgICAgICAgKENMRl9WRVJTSU9OIHwgQ0xGX1JFTkFNRSk7CisKKwlyZXR1cm4gKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X2pvYmlkICopKChjaGFyICopcmVjICsKKwkJCQkJICAgICAgY2hhbmdlbG9nX3JlY19vZmZzZXQoY3JmKSk7Cit9CisKKy8qIFRoZSBuYW1lIGZvbGxvd3MgdGhlIHJlbmFtZSBhbmQgam9iaWQgZXh0ZW5zaW9ucywgaWYgcHJlc2VudCAqLwogc3RhdGljIGlubGluZSBjaGFyICpjaGFuZ2Vsb2dfcmVjX25hbWUoc3RydWN0IGNoYW5nZWxvZ19yZWMgKnJlYykKIHsKLQlyZXR1cm4gQ0hBTkdFTE9HX1JFQ19FWFRFTkRFRChyZWMpID8KLQkJKChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKilyZWMpLT5jcl9uYW1lIDogcmVjLT5jcl9uYW1lOworCXJldHVybiAoY2hhciAqKXJlYyArIGNoYW5nZWxvZ19yZWNfb2Zmc2V0KHJlYy0+Y3JfZmxhZ3MgJgorCQkJCQkJICBDTEZfU1VQUE9SVEVEKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY2hhbmdlbG9nX3JlY19zbmFtZWxlbihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKnJlYykKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGNoYW5nZWxvZ19yZWNfc25hbWVsZW4oc3RydWN0IGNoYW5nZWxvZ19yZWMgKnJlYykKIHsKLQlyZXR1cm4gcmVjLT5jcl9uYW1lbGVuIC0gc3RybGVuKHJlYy0+Y3JfbmFtZSkgLSAxOworCXJldHVybiByZWMtPmNyX25hbWVsZW4gLSBzdHJsZW4oY2hhbmdlbG9nX3JlY19uYW1lKHJlYykpIC0gMTsKIH0KIAotc3RhdGljIGlubGluZSBjaGFyICpjaGFuZ2Vsb2dfcmVjX3NuYW1lKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqcmVjKQorc3RhdGljIGlubGluZSBjaGFyICpjaGFuZ2Vsb2dfcmVjX3NuYW1lKHN0cnVjdCBjaGFuZ2Vsb2dfcmVjICpyZWMpCiB7Ci0JcmV0dXJuIHJlYy0+Y3JfbmFtZSArIHN0cmxlbihyZWMtPmNyX25hbWUpICsgMTsKKwljaGFyICpjcl9uYW1lID0gY2hhbmdlbG9nX3JlY19uYW1lKHJlYyk7CisKKwlyZXR1cm4gY3JfbmFtZSArIHN0cmxlbihjcl9uYW1lKSArIDE7Cit9CisKKy8qKgorICogUmVtYXAgYSByZWNvcmQgdG8gdGhlIGRlc2lyZWQgZm9ybWF0IGFzIHNwZWNpZmllZCBieSB0aGUgY3JmIGZsYWdzLgorICogVGhlIHJlY29yZCBtdXN0IGJlIGJpZyBlbm91Z2ggdG8gY29udGFpbiB0aGUgZmluYWwgcmVtYXBwZWQgdmVyc2lvbi4KKyAqIFN1cGVyZmx1b3VzIGV4dGVuc2lvbiBmaWVsZHMgYXJlIHJlbW92ZWQgYW5kIG1pc3Npbmcgb25lcyBhcmUgYWRkZWQKKyAqIGFuZCB6ZXJvZWQuIFRoZSBmbGFncyBvZiB0aGUgcmVjb3JkIGFyZSB1cGRhdGVkIGFjY29yZGluZ2x5LgorICoKKyAqIFRoZSBqb2JpZCBhbmQgcmVuYW1lIGV4dGVuc2lvbnMgY2FuIGJlIGFkZGVkIHRvIGEgcmVjb3JkLCB0byBtYXRjaCB0aGUKKyAqIGZvcm1hdCBhbiBhcHBsaWNhdGlvbiBleHBlY3RzLCB0eXBpY2FsbHkuIEluIHRoaXMgY2FzZSwgdGhlIG5ld2x5IGFkZGVkCisgKiBmaWVsZHMgd2lsbCBiZSB6ZXJvZWQuCisgKiBUaGUgSm9iaWQgZmllbGQgY2FuIGJlIHJlbW92ZWQsIHRvIGd1YXJhbnRlZSBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIKKyAqIGNsaWVudHMgdGhhdCBkb24ndCBleHBlY3QgdGhpcyBmaWVsZCBpbiB0aGUgcmVjb3JkcyB0aGV5IHByb2Nlc3MuCisgKgorICogVGhlIGZvbGxvd2luZyBhc3N1bXB0aW9ucyBhcmUgYmVpbmcgbWFkZToKKyAqCS0gQ0xGX1JFTkFNRSB3aWxsIG5vdCBiZSByZW1vdmVkCisgKgktIENMRl9KT0JJRCB3aWxsIG5vdCBiZSBhZGRlZCB3aXRob3V0IENMRl9SRU5BTUUgYmVpbmcgYWRkZWQgdG9vCisgKgorICogQHBhcmFtW2luLG91dF0gIHJlYwkJVGhlIHJlY29yZCB0byByZW1hcC4KKyAqIEBwYXJhbVtpbl0JICAgY3JmX3dhbnRlZAlGbGFncyBkZXNjcmliaW5nIHRoZSBkZXNpcmVkIGV4dGVuc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGFuZ2Vsb2dfcmVtYXBfcmVjKHN0cnVjdCBjaGFuZ2Vsb2dfcmVjICpyZWMsCisJCQkJICAgICAgIGVudW0gY2hhbmdlbG9nX3JlY19mbGFncyBjcmZfd2FudGVkKQoreworCWNoYXIgKmppZF9tb3YsICpybm1fbW92OworCisJY3JmX3dhbnRlZCAmPSBDTEZfU1VQUE9SVEVEOworCisJaWYgKChyZWMtPmNyX2ZsYWdzICYgQ0xGX1NVUFBPUlRFRCkgPT0gY3JmX3dhbnRlZCkKKwkJcmV0dXJuOworCisJLyogRmlyc3QgbW92ZSB0aGUgdmFyaWFibGUtbGVuZ3RoIG5hbWUgZmllbGQgKi8KKwltZW1tb3ZlKChjaGFyICopcmVjICsgY2hhbmdlbG9nX3JlY19vZmZzZXQoY3JmX3dhbnRlZCksCisJCWNoYW5nZWxvZ19yZWNfbmFtZShyZWMpLCByZWMtPmNyX25hbWVsZW4pOworCisJLyogTG9jYXRpb25zIG9mIGpvYmlkIGFuZCByZW5hbWUgZXh0ZW5zaW9ucyBpbiB0aGUgcmVtYXBwZWQgcmVjb3JkICovCisJamlkX21vdiA9IChjaGFyICopcmVjICsKKwkJICBjaGFuZ2Vsb2dfcmVjX29mZnNldChjcmZfd2FudGVkICYgfkNMRl9KT0JJRCk7CisJcm5tX21vdiA9IChjaGFyICopcmVjICsKKwkJICBjaGFuZ2Vsb2dfcmVjX29mZnNldChjcmZfd2FudGVkICYgfihDTEZfSk9CSUQgfCBDTEZfUkVOQU1FKSk7CisKKwkvKiBNb3ZlIHRoZSBleHRlbnNpb24gZmllbGRzIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9ucyAqLworCWlmICgoY3JmX3dhbnRlZCAmIENMRl9KT0JJRCkgJiYgKHJlYy0+Y3JfZmxhZ3MgJiBDTEZfSk9CSUQpKQorCQltZW1tb3ZlKGppZF9tb3YsIGNoYW5nZWxvZ19yZWNfam9iaWQocmVjKSwKKwkJCXNpemVvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9qb2JpZCkpOworCisJaWYgKChjcmZfd2FudGVkICYgQ0xGX1JFTkFNRSkgJiYgKHJlYy0+Y3JfZmxhZ3MgJiBDTEZfUkVOQU1FKSkKKwkJbWVtbW92ZShybm1fbW92LCBjaGFuZ2Vsb2dfcmVjX3JlbmFtZShyZWMpLAorCQkJc2l6ZW9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlbmFtZSkpOworCisJLyogQ2xlYXIgbmV3bHkgYWRkZWQgZmllbGRzICovCisJaWYgKChjcmZfd2FudGVkICYgQ0xGX0pPQklEKSAmJiAhKHJlYy0+Y3JfZmxhZ3MgJiBDTEZfSk9CSUQpKQorCQltZW1zZXQoamlkX21vdiwgMCwgc2l6ZW9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X2pvYmlkKSk7CisKKwlpZiAoKGNyZl93YW50ZWQgJiBDTEZfUkVOQU1FKSAmJiAhKHJlYy0+Y3JfZmxhZ3MgJiBDTEZfUkVOQU1FKSkKKwkJbWVtc2V0KHJubV9tb3YsIDAsIHNpemVvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZW5hbWUpKTsKKworCS8qIFVwZGF0ZSB0aGUgcmVjb3JkJ3MgZmxhZ3MgYWNjb3JkaW5nbHkgKi8KKwlyZWMtPmNyX2ZsYWdzID0gKHJlYy0+Y3JfZmxhZ3MgJiBDTEZfRkxBR01BU0spIHwgY3JmX3dhbnRlZDsKIH0KIAogc3RydWN0IGlvY19jaGFuZ2Vsb2cgewpAQCAtOTc4LDcgKzExNDEsNyBAQAogLyoqIFJldHVybiBwb2ludGVyIHRvIGRhdGEgZmllbGQgaW4gYSBoc20gdXNlciByZXF1ZXN0ICovCiBzdGF0aWMgaW5saW5lIHZvaWQgKmh1cl9kYXRhKHN0cnVjdCBoc21fdXNlcl9yZXF1ZXN0ICpodXIpCiB7Ci0JcmV0dXJuICYoaHVyLT5odXJfdXNlcl9pdGVtW2h1ci0+aHVyX3JlcXVlc3QuaHJfaXRlbWNvdW50XSk7CisJcmV0dXJuICZodXItPmh1cl91c2VyX2l0ZW1baHVyLT5odXJfcmVxdWVzdC5ocl9pdGVtY291bnRdOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2NmZy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfY2ZnLmgKaW5kZXggOTVhMGJlMS4uOGViMzk0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfY2ZnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfY2ZnLmgKQEAgLTE1MSwxMyArMTUxLDExIEBACiAJCWx1c3RyZV9jZmdfYnVmc19zZXRfc3RyaW5nKGJ1ZnMsIDAsIG5hbWUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKmx1c3RyZV9jZmdfYnVmKHN0cnVjdCBsdXN0cmVfY2ZnICpsY2ZnLCBpbnQgaW5kZXgpCitzdGF0aWMgaW5saW5lIHZvaWQgKmx1c3RyZV9jZmdfYnVmKHN0cnVjdCBsdXN0cmVfY2ZnICpsY2ZnLCBfX3UzMiBpbmRleCkKIHsKLQlpbnQgaTsKLQlpbnQgb2Zmc2V0OwotCWludCBidWZjb3VudDsKLQotCUxBU1NFUlQoaW5kZXggPj0gMCk7CisJX191MzIgaTsKKwlzaXplX3Qgb2Zmc2V0OworCV9fdTMyIGJ1ZmNvdW50OwogCiAJYnVmY291bnQgPSBsY2ZnLT5sY2ZnX2J1ZmNvdW50OwogCWlmIChpbmRleCA+PSBidWZjb3VudCkKQEAgLTE3Miw3ICsxNzAsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGx1c3RyZV9jZmdfYnVmc19pbml0KHN0cnVjdCBsdXN0cmVfY2ZnX2J1ZnMgKmJ1ZnMsCiAJCQkJCXN0cnVjdCBsdXN0cmVfY2ZnICpsY2ZnKQogewotCWludCBpOworCV9fdTMyIGk7CiAKIAlidWZzLT5sY2ZnX2J1ZmNvdW50ID0gbGNmZy0+bGNmZ19idWZjb3VudDsKIAlmb3IgKGkgPSAwOyBpIDwgYnVmcy0+bGNmZ19idWZjb3VudDsgaSsrKSB7CkBAIC0xODEsNyArMTc5LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgY2hhciAqbHVzdHJlX2NmZ19zdHJpbmcoc3RydWN0IGx1c3RyZV9jZmcgKmxjZmcsIGludCBpbmRleCkKK3N0YXRpYyBpbmxpbmUgY2hhciAqbHVzdHJlX2NmZ19zdHJpbmcoc3RydWN0IGx1c3RyZV9jZmcgKmxjZmcsIF9fdTMyIGluZGV4KQogewogCWNoYXIgKnM7CiAKQEAgLTE5Nyw4ICsxOTUsOCBAQAogCSAqIG9mIGRhdGEuICBUcnkgdG8gdXNlIHRoZSBwYWRkaW5nIGZpcnN0IHRob3VnaC4KIAkgKi8KIAlpZiAoc1tsY2ZnLT5sY2ZnX2J1ZmxlbnNbaW5kZXhdIC0gMV0gIT0gJ1wwJykgewotCQlpbnQgbGFzdCA9IG1pbigoaW50KWxjZmctPmxjZmdfYnVmbGVuc1tpbmRleF0sCi0JCQkgICAgICAgY2ZzX3NpemVfcm91bmQobGNmZy0+bGNmZ19idWZsZW5zW2luZGV4XSkgLSAxKTsKKwkJc2l6ZV90IGxhc3QgPSBtaW4oKHNpemVfdClsY2ZnLT5sY2ZnX2J1ZmxlbnNbaW5kZXhdLAorCQkJCSAgY2ZzX3NpemVfcm91bmQobGNmZy0+bGNmZ19idWZsZW5zW2luZGV4XSkgLSAxKTsKIAkJY2hhciBsb3N0ID0gc1tsYXN0XTsKIAogCQlzW2xhc3RdID0gJ1wwJzsKQEAgLTIxMCwxMCArMjA4LDEwIEBACiAJcmV0dXJuIHM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGx1c3RyZV9jZmdfbGVuKF9fdTMyIGJ1ZmNvdW50LCBfX3UzMiAqYnVmbGVucykKK3N0YXRpYyBpbmxpbmUgX191MzIgbHVzdHJlX2NmZ19sZW4oX191MzIgYnVmY291bnQsIF9fdTMyICpidWZsZW5zKQogewotCWludCBpOwotCWludCBsZW47CisJX191MzIgaTsKKwlfX3UzMiBsZW47CiAKIAlsZW4gPSBMQ0ZHX0hEUl9TSVpFKGJ1ZmNvdW50KTsKIAlmb3IgKGkgPSAwOyBpIDwgYnVmY291bnQ7IGkrKykKQEAgLTI1NCw3ICsyNTIsNyBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbHVzdHJlX2NmZ19zYW5pdHlfY2hlY2sodm9pZCAqYnVmLCBpbnQgbGVuKQorc3RhdGljIGlubGluZSBpbnQgbHVzdHJlX2NmZ19zYW5pdHlfY2hlY2sodm9pZCAqYnVmLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCBsdXN0cmVfY2ZnICpsY2ZnID0gKHN0cnVjdCBsdXN0cmVfY2ZnICopYnVmOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9jb21wYXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2N2M0MzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9jb21wYXQuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogR1BMIEhFQURFUiBTVEFSVAorICoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQKKyAqIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IElmIG5vdCwgc2VlCisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sCisgKgorICogR1BMIEhFQURFUiBFTkQKKyAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyLCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqLworLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEx1c3RyZSwgaHR0cDovL3d3dy5sdXN0cmUub3JnLworICogTHVzdHJlIGlzIGEgdHJhZGVtYXJrIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqLworCisjaWZuZGVmIF9MVVNUUkVfQ09NUEFUX0gKKyNkZWZpbmUgX0xVU1RSRV9DT01QQVRfSAorCisjaW5jbHVkZSA8bGludXgvZnNfc3RydWN0Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKworI2luY2x1ZGUgImx1c3RyZV9wYXRjaGxlc3NfY29tcGF0LmgiCisKKy8qCisgKiBzZXQgQVRUUl9CTE9DS1MgdG8gYSBoaWdoIHZhbHVlIHRvIGF2b2lkIGFueSByaXNrIG9mIGNvbGxpc2lvbiB3aXRoIG90aGVyCisgKiBBVFRSXyogYXR0cmlidXRlcyAoc2VlIGJ1ZyAxMzgyOCkKKyAqLworI2RlZmluZSBBVFRSX0JMT0NLUyAgICAoMSA8PCAyNykKKworI2RlZmluZSBjdXJyZW50X25ncm91cHMgY3VycmVudF9jcmVkKCktPmdyb3VwX2luZm8tPm5ncm91cHMKKyNkZWZpbmUgY3VycmVudF9ncm91cHMgY3VycmVudF9jcmVkKCktPmdyb3VwX2luZm8tPnNtYWxsX2Jsb2NrCisKKy8qCisgKiBPQkQgbmVlZCB3b3JraW5nIHJhbmRvbSBkcml2ZXIsIHRodXMgYWxsIG91cgorICogaW5pdGlhbGl6YXRpb24gcm91dGluZXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGV2aWNlCisgKiBkcml2ZXIgaW5pdGlhbGl6YXRpb24KKyAqLworI2lmbmRlZiBNT0RVTEUKKyN1bmRlZiBtb2R1bGVfaW5pdAorI2RlZmluZSBtb2R1bGVfaW5pdChhKSAgICAgbGF0ZV9pbml0Y2FsbChhKQorI2VuZGlmCisKKyNkZWZpbmUgTFRJTUVfUyh0aW1lKQkJICAgKHRpbWUudHZfc2VjKQorCisjaWZuZGVmIFFVT1RBX09LCisjIGRlZmluZSBRVU9UQV9PSyAwCisjZW5kaWYKKyNpZm5kZWYgTk9fUVVPVEEKKyMgZGVmaW5lIE5PX1FVT1RBICgtRURRVU9UKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfQVNNX0dFTkVSSUNfQklUT1BTX0VYVDJfTk9OX0FUT01JQ19IXykgJiYgIWRlZmluZWQoZXh0Ml9zZXRfYml0KQorIyBkZWZpbmUgZXh0Ml9zZXRfYml0CSAgICAgX190ZXN0X2FuZF9zZXRfYml0X2xlCisjIGRlZmluZSBleHQyX2NsZWFyX2JpdAkgICBfX3Rlc3RfYW5kX2NsZWFyX2JpdF9sZQorIyBkZWZpbmUgZXh0Ml90ZXN0X2JpdAkgICAgdGVzdF9iaXRfbGUKKyMgZGVmaW5lIGV4dDJfZmluZF9maXJzdF96ZXJvX2JpdCBmaW5kX2ZpcnN0X3plcm9fYml0X2xlCisjIGRlZmluZSBleHQyX2ZpbmRfbmV4dF96ZXJvX2JpdCAgZmluZF9uZXh0X3plcm9fYml0X2xlCisjZW5kaWYKKworI2VuZGlmIC8qIF9MVVNUUkVfQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbS5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGxtLmgKaW5kZXggNjAwNTFhNS4uZDAzNTM0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGxtLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGxtLmgKQEAgLTU3Myw2ICs1NzMsMTEgQEAKIH07CiAKIC8qKgorICogTERMTV9HSURfQU5ZIGlzIHVzZWQgdG8gbWF0Y2ggYW55IGdyb3VwIGlkIGluIGxkbG1fbG9ja19tYXRjaCgpLgorICovCisjZGVmaW5lIExETE1fR0lEX0FOWQkoKF9fdTY0KS0xKQorCisvKioKICAqIExETE0gbG9jayBzdHJ1Y3R1cmUKICAqCiAgKiBSZXByZXNlbnRzIGEgc2luZ2xlIExETE0gbG9jayBhbmQgaXRzIHN0YXRlIGluIG1lbW9yeS4gRWFjaCBsb2NrIGlzCkBAIC05NjgsNiArOTczLDcgQEAKIAl2b2lkICplaV9jYl9jcDsgIC8qKiBsb2NrIGNvbXBsZXRpb24gY2FsbGJhY2sgKi8KIAl2b2lkICplaV9jYl9nbDsgIC8qKiBsb2NrIGdsaW1wc2UgY2FsbGJhY2sgKi8KIAl2b2lkICplaV9jYmRhdGE7IC8qKiBEYXRhIHRvIGJlIHBhc3NlZCBpbnRvIGNhbGxiYWNrcy4gKi8KKwl1bnNpZ25lZCBpbnQgZWlfZW5xX3NsYXZlOjE7IC8qIHdoZXRoZXIgZW5xdWV1ZSBzbGF2ZSBzdHJpcGVzICovCiB9OwogCiBleHRlcm4gc3RydWN0IG9iZF9vcHMgbGRsbV9vYmRfb3BzOwpAQCAtMTI4MSwxNiArMTI4Nyw2IEBACiBpbnQgaW50ZW50X2Rpc3Bvc2l0aW9uKHN0cnVjdCBsZGxtX3JlcGx5ICpyZXAsIGludCBmbGFnKTsKIHZvaWQgaW50ZW50X3NldF9kaXNwb3NpdGlvbihzdHJ1Y3QgbGRsbV9yZXBseSAqcmVwLCBpbnQgZmxhZyk7CiAKLS8qIGlvY3RscyBmb3IgdHJ5aW5nIHJlcXVlc3RzICovCi0jZGVmaW5lIElPQ19MRExNX1RZUEUJCSAgICdmJwotI2RlZmluZSBJT0NfTERMTV9NSU5fTlIJCSA0MAotCi0jZGVmaW5lIElPQ19MRExNX1RFU1QJCSAgIF9JT1dSKCdmJywgNDAsIGxvbmcpCi0jZGVmaW5lIElPQ19MRExNX0RVTVAJCSAgIF9JT1dSKCdmJywgNDEsIGxvbmcpCi0jZGVmaW5lIElPQ19MRExNX1JFR1JFU1NfU1RBUlQJICBfSU9XUignZicsIDQyLCBsb25nKQotI2RlZmluZSBJT0NfTERMTV9SRUdSRVNTX1NUT1AJICAgX0lPV1IoJ2YnLCA0MywgbG9uZykKLSNkZWZpbmUgSU9DX0xETE1fTUFYX05SCQkgNDMKLQogLyoqCiAgKiAiTW9kZXMiIG9mIGFjcXVpcmluZyBsb2NrX3JlcywgbmVjZXNzYXJ5IHRvIHRlbGwgbG9ja2RlcCB0aGF0IHRha2luZyBtb3JlCiAgKiB0aGFuIG9uZSBsb2NrX3JlcyBpcyBkZWFkLWxvY2sgc2FmZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbV9mbGFncy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGxtX2ZsYWdzLmgKaW5kZXggZTdlMGMyMS4uYTBmMDY0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGxtX2ZsYWdzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGxtX2ZsYWdzLmgKQEAgLTI4LDIxICsyOCw2IEBACiAvKiogbF9mbGFncyBiaXRzIG1hcmtlZCBhcyAiYWxsX2ZsYWdzIiBiaXRzICovCiAjZGVmaW5lIExETE1fRkxfQUxMX0ZMQUdTX01BU0sgICAgICAgICAgMHgwMEZGRkZGRkMwOEY5MzJGVUxMCiAKLS8qKiBsX2ZsYWdzIGJpdHMgbWFya2VkIGFzICJhc3QiIGJpdHMgKi8KLSNkZWZpbmUgTERMTV9GTF9BU1RfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMDAwODAwMDgwMDBVTEwKLQotLyoqIGxfZmxhZ3MgYml0cyBtYXJrZWQgYXMgImJsb2NrZWQiIGJpdHMgKi8KLSNkZWZpbmUgTERMTV9GTF9CTE9DS0VEX01BU0sgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMEVVTEwKLQotLyoqIGxfZmxhZ3MgYml0cyBtYXJrZWQgYXMgImdvbmUiIGJpdHMgKi8KLSNkZWZpbmUgTERMTV9GTF9HT05FX01BU0sgICAgICAgICAgICAgICAweDAwMDYwMDQwMDAwMDAwMDBVTEwKLQotLyoqIGxfZmxhZ3MgYml0cyBtYXJrZWQgYXMgImluaGVyaXQiIGJpdHMgKi8KLSNkZWZpbmUgTERMTV9GTF9JTkhFUklUX01BU0sgICAgICAgICAgICAweDAwMDAwMDAwMDA4MDAwMDBVTEwKLQotLyoqIGxfZmxhZ3MgYml0cyBtYXJrZWQgYXMgIm9mZl93aXJlIiBiaXRzICovCi0jZGVmaW5lIExETE1fRkxfT0ZGX1dJUkVfTUFTSyAgICAgICAgICAgMHgwMEZGRkZGRjAwMDAwMDAwVUxMCi0KIC8qKiBleHRlbnQsIG1vZGUsIG9yIHJlc291cmNlIGNoYW5nZWQgKi8KICNkZWZpbmUgTERMTV9GTF9MT0NLX0NIQU5HRUQgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDFVTEwgLyogYml0IDAgKi8KICNkZWZpbmUgbGRsbV9pc19sb2NrX2NoYW5nZWQoX2wpICAgICAgICBMRExNX1RFU1RfRkxBRygoX2wpLCAxVUxMIDw8ICAwKQpAQCAtMzcyLDYgKzM1NywyNyBAQAogI2RlZmluZSBsZGxtX3NldF9leGNsKF9sKSAgICAgICAgICAgICAgIExETE1fU0VUX0ZMQUcoKF9sKSwgMVVMTCA8PCA1NSkKICNkZWZpbmUgbGRsbV9jbGVhcl9leGNsKF9sKSAgICAgICAgICAgICBMRExNX0NMRUFSX0ZMQUcoKF9sKSwgMVVMTCA8PCA1NSkKIAorLyoqIGxfZmxhZ3MgYml0cyBtYXJrZWQgYXMgImFzdCIgYml0cyAqLworI2RlZmluZSBMRExNX0ZMX0FTVF9NQVNLCQkoTERMTV9GTF9GTE9DS19ERUFETE9DSwkJfFwKKwkJCQkJIExETE1fRkxfQVNUX0RJU0NBUkRfREFUQSkKKworLyoqIGxfZmxhZ3MgYml0cyBtYXJrZWQgYXMgImJsb2NrZWQiIGJpdHMgKi8KKyNkZWZpbmUgTERMTV9GTF9CTE9DS0VEX01BU0sJCShMRExNX0ZMX0JMT0NLX0dSQU5URUQJCXxcCisJCQkJCSBMRExNX0ZMX0JMT0NLX0NPTlYJCXxcCisJCQkJCSBMRExNX0ZMX0JMT0NLX1dBSVQpCisKKy8qKiBsX2ZsYWdzIGJpdHMgbWFya2VkIGFzICJnb25lIiBiaXRzICovCisjZGVmaW5lIExETE1fRkxfR09ORV9NQVNLCQkoTERMTV9GTF9ERVNUUk9ZRUQJCXxcCisJCQkJCSBMRExNX0ZMX0ZBSUxFRCkKKworLyoqIGxfZmxhZ3MgYml0cyBtYXJrZWQgYXMgImluaGVyaXQiIGJpdHMgKi8KKy8qIEZsYWdzIGluaGVyaXRlZCBmcm9tIHdpcmUgb24gZW5xdWV1ZS9yZXBseSBiZXR3ZWVuIGNsaWVudC9zZXJ2ZXIuICovCisvKiBOT19USU1FT1VUIGZsYWcgdG8gZm9yY2UgbGRsbV9sb2NrX21hdGNoKCkgdG8gd2FpdCB3aXRoIG5vIHRpbWVvdXQuICovCisvKiBURVNUX0xPQ0sgZmxhZyB0byBub3QgbGV0IFRFU1QgbG9jayB0byBiZSBncmFudGVkLiAqLworI2RlZmluZSBMRExNX0ZMX0lOSEVSSVRfTUFTSwkJKExETE1fRkxfQ0FOQ0VMX09OX0JMT0NLCXxcCisJCQkJCSBMRExNX0ZMX05PX1RJTUVPVVQJCXxcCisJCQkJCSBMRExNX0ZMX1RFU1RfTE9DSykKKwogLyoqIHRlc3QgZm9yIGxkbG1fbG9jayBmbGFnIGJpdCBzZXQgKi8KICNkZWZpbmUgTERMTV9URVNUX0ZMQUcoX2wsIF9iKSAgICAgICAgKCgoX2wpLT5sX2ZsYWdzICYgKF9iKSkgIT0gMCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZWFjbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZWFjbC5oCmluZGV4IGQxMDM5ZTEuLjFlNzFhODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2VhY2wuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9lYWNsLmgKQEAgLTQ2LDYgKzQ2LDcgQEAKIAogI2lmZGVmIENPTkZJR19GU19QT1NJWF9BQ0wKIAorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsX3hhdHRyLmg+CiAKIHR5cGVkZWYgc3RydWN0IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ZpZC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZmlkLmgKaW5kZXggNzQzNjcxYS4uMzE2NzgwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZmlkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZmlkLmgKQEAgLTIyOSw2ICsyMjksNyBAQAogCU1ERF9MT1ZfT0JKX09TRVEJPSA0MTIxVUwsCiAJTEZTQ0tfTkFNRVNQQUNFX09JRCAgICAgPSA0MTIyVUwsCiAJUkVNT1RFX1BBUkVOVF9ESVJfT0lECT0gNDEyM1VMLAorCVNMQVZFX0xMT0dfQ0FUQUxPR1NfT0lECT0gNDEyNFVMLAogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIGx1X2xvY2FsX29ial9maWQoc3RydWN0IGx1X2ZpZCAqZmlkLCBfX3UzMiBvaWQpCkBAIC0zOTIsMjEgKzM5MywxOSBAQAogICogYnV0IHdhcyBtb3ZlZCBpbnRvIG5hbWVbMV0gYWxvbmcgd2l0aCB0aGUgT0lEIHRvIGF2b2lkIGNvbnN1bWluZyB0aGUKICAqIHJlbmFtaW5nIG5hbWVbMiwzXSBmaWVsZHMgdGhhdCBuZWVkIHRvIGJlIHVzZWQgZm9yIHRoZSBxdW90YSBpZGVudGlmaWVyLgogICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBsZGxtX3Jlc19pZCAqCitzdGF0aWMgaW5saW5lIHZvaWQKIGZpZF9idWlsZF9yZWdfcmVzX25hbWUoY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLCBzdHJ1Y3QgbGRsbV9yZXNfaWQgKnJlcykKIHsKIAltZW1zZXQocmVzLCAwLCBzaXplb2YoKnJlcykpOwogCXJlcy0+bmFtZVtMVVNUUkVfUkVTX0lEX1NFUV9PRkZdID0gZmlkX3NlcShmaWQpOwogCXJlcy0+bmFtZVtMVVNUUkVfUkVTX0lEX1ZFUl9PSURfT0ZGXSA9IGZpZF92ZXJfb2lkKGZpZCk7Ci0KLQlyZXR1cm4gcmVzOwogfQogCiAvKgogICogUmV0dXJuIHRydWUgaWYgcmVzb3VyY2UgaXMgZm9yIG9iamVjdCBpZGVudGlmaWVkIGJ5IEZJRC4KICAqLwotc3RhdGljIGlubGluZSBpbnQgZmlkX3Jlc19uYW1lX2VxKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCwKLQkJCQkgIGNvbnN0IHN0cnVjdCBsZGxtX3Jlc19pZCAqcmVzKQorc3RhdGljIGlubGluZSBib29sIGZpZF9yZXNfbmFtZV9lcShjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCisJCQkJICAgY29uc3Qgc3RydWN0IGxkbG1fcmVzX2lkICpyZXMpCiB7CiAJcmV0dXJuIHJlcy0+bmFtZVtMVVNUUkVfUkVTX0lEX1NFUV9PRkZdID09IGZpZF9zZXEoZmlkKSAmJgogCSAgICAgICByZXMtPm5hbWVbTFVTVFJFX1JFU19JRF9WRVJfT0lEX09GRl0gPT0gZmlkX3Zlcl9vaWQoZmlkKTsKQEAgLTQxNSwyOSArNDE0LDI1IEBACiAvKgogICogRXh0cmFjdCBGSUQgZnJvbSBMRExNIHJlc291cmNlLiBSZXZlcnNlIG9mIGZpZF9idWlsZF9yZWdfcmVzX25hbWUoKS4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgbHVfZmlkICoKK3N0YXRpYyBpbmxpbmUgdm9pZAogZmlkX2V4dHJhY3RfZnJvbV9yZXNfbmFtZShzdHJ1Y3QgbHVfZmlkICpmaWQsIGNvbnN0IHN0cnVjdCBsZGxtX3Jlc19pZCAqcmVzKQogewogCWZpZC0+Zl9zZXEgPSByZXMtPm5hbWVbTFVTVFJFX1JFU19JRF9TRVFfT0ZGXTsKIAlmaWQtPmZfb2lkID0gKF9fdTMyKShyZXMtPm5hbWVbTFVTVFJFX1JFU19JRF9WRVJfT0lEX09GRl0pOwogCWZpZC0+Zl92ZXIgPSAoX191MzIpKHJlcy0+bmFtZVtMVVNUUkVfUkVTX0lEX1ZFUl9PSURfT0ZGXSA+PiAzMik7CiAJTEFTU0VSVChmaWRfcmVzX25hbWVfZXEoZmlkLCByZXMpKTsKLQotCXJldHVybiBmaWQ7CiB9CiAKIC8qCiAgKiBCdWlsZCAoRExNKSByZXNvdXJjZSBpZGVudGlmaWVyIGZyb20gZ2xvYmFsIHF1b3RhIEZJRCBhbmQgcXVvdGEgSUQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGxkbG1fcmVzX2lkICoKK3N0YXRpYyBpbmxpbmUgdm9pZAogZmlkX2J1aWxkX3F1b3RhX3Jlc19uYW1lKGNvbnN0IHN0cnVjdCBsdV9maWQgKmdsYl9maWQsIHVuaW9uIGxxdW90YV9pZCAqcWlkLAogCQkJIHN0cnVjdCBsZGxtX3Jlc19pZCAqcmVzKQogewogCWZpZF9idWlsZF9yZWdfcmVzX25hbWUoZ2xiX2ZpZCwgcmVzKTsKIAlyZXMtPm5hbWVbTFVTVFJFX1JFU19JRF9RVU9UQV9TRVFfT0ZGXSA9IGZpZF9zZXEoJnFpZC0+cWlkX2ZpZCk7CiAJcmVzLT5uYW1lW0xVU1RSRV9SRVNfSURfUVVPVEFfVkVSX09JRF9PRkZdID0gZmlkX3Zlcl9vaWQoJnFpZC0+cWlkX2ZpZCk7Ci0KLQlyZXR1cm4gcmVzOwogfQogCiAvKgpAQCAtNDU0LDE0ICs0NDksMTIgQEAKIAkJKF9fdTMyKShyZXMtPm5hbWVbTFVTVFJFX1JFU19JRF9RVU9UQV9WRVJfT0lEX09GRl0gPj4gMzIpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBsZGxtX3Jlc19pZCAqCitzdGF0aWMgaW5saW5lIHZvaWQKIGZpZF9idWlsZF9wZG9fcmVzX25hbWUoY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLCB1bnNpZ25lZCBpbnQgaGFzaCwKIAkJICAgICAgIHN0cnVjdCBsZGxtX3Jlc19pZCAqcmVzKQogewogCWZpZF9idWlsZF9yZWdfcmVzX25hbWUoZmlkLCByZXMpOwogCXJlcy0+bmFtZVtMVVNUUkVfUkVTX0lEX0hTSF9PRkZdID0gaGFzaDsKLQotCXJldHVybiByZXM7CiB9CiAKIC8qKgpAQCAtNDgyLDcgKzQ3NSw3IEBACiAgKiAgICByZXMgd2lsbCBiZSBidWlsdCBmcm9tIG5vcm1hbCBGSUQgZGlyZWN0bHksIGkuZS4gcmVzWzBdID0gZl9zZXEsCiAgKiAgICByZXNbMV0gPSBmX29pZCArIGZfdmVyLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgb3N0aWRfYnVpbGRfcmVzX25hbWUoc3RydWN0IG9zdF9pZCAqb2ksCitzdGF0aWMgaW5saW5lIHZvaWQgb3N0aWRfYnVpbGRfcmVzX25hbWUoY29uc3Qgc3RydWN0IG9zdF9pZCAqb2ksCiAJCQkJCXN0cnVjdCBsZGxtX3Jlc19pZCAqbmFtZSkKIHsKIAltZW1zZXQobmFtZSwgMCwgc2l6ZW9mKCpuYW1lKSk7CkBAIC00OTcsOCArNDkwLDggQEAKIC8qKgogICogUmV0dXJuIHRydWUgaWYgdGhlIHJlc291cmNlIGlzIGZvciB0aGUgb2JqZWN0IGlkZW50aWZpZWQgYnkgdGhpcyBpZCAmIGdyb3VwLgogICovCi1zdGF0aWMgaW5saW5lIGludCBvc3RpZF9yZXNfbmFtZV9lcShzdHJ1Y3Qgb3N0X2lkICpvaSwKLQkJCQkgICAgc3RydWN0IGxkbG1fcmVzX2lkICpuYW1lKQorc3RhdGljIGlubGluZSBpbnQgb3N0aWRfcmVzX25hbWVfZXEoY29uc3Qgc3RydWN0IG9zdF9pZCAqb2ksCisJCQkJICAgIGNvbnN0IHN0cnVjdCBsZGxtX3Jlc19pZCAqbmFtZSkKIHsKIAkvKiBOb3RlOiBpdCBpcyBqdXN0IGEgdHJpY2sgaGVyZSB0byBzYXZlIHNvbWUgZWZmb3J0LCBwcm9iYWJseSB0aGUKIAkgKiBjb3JyZWN0IHdheSB3b3VsZCBiZSB0dXJuIHRoZW0gaW50byB0aGUgRklEIGFuZCBjb21wYXJlCkBAIC02MDMsMTMgKzU5NiwxNCBAQAogCSAqIChmcm9tIE9JRCksIG9yIHVwIHRvIDEyOE0gaW5vZGVzIHdpdGhvdXQgY29sbGlzaW9ucyBmb3IgbmV3IGZpbGVzLgogCSAqLwogCWlubyA9ICgoc2VxICYgMHgwMDBmZmZmZlVMTCkgPDwgMTIpICsgKChzZXEgPj4gOCkgJiAweGZmZmZmMDAwKSArCi0JICAgICAgIChzZXEgPj4gKDY0IC0gKDQwLTgpKSAmIDB4ZmZmZmZmMDApICsKKwkgICAgICAgKHNlcSA+PiAoNjQgLSAoNDAgLSA4KSkgJiAweGZmZmZmZjAwKSArCiAJICAgICAgIChmaWRfb2lkKGZpZCkgJiAweGZmMDAwZmZmKSArICgoZmlkX29pZChmaWQpICYgMHgwMGZmZjAwMCkgPDwgOCk7CiAKIAlyZXR1cm4gaW5vID8gaW5vIDogZmlkX29pZChmaWQpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBsdV9maWRfZGlmZihzdHJ1Y3QgbHVfZmlkICpmaWQxLCBzdHJ1Y3QgbHVfZmlkICpmaWQyKQorc3RhdGljIGlubGluZSBpbnQgbHVfZmlkX2RpZmYoY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkMSwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZDIpCiB7CiAJTEFTU0VSVEYoZmlkX3NlcShmaWQxKSA9PSBmaWRfc2VxKGZpZDIpLCAiZmlkMToiREZJRCIsIGZpZDI6IkRGSUQiXG4iLAogCQkgUEZJRChmaWQxKSwgUEZJRChmaWQyKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9oYW5kbGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9oYW5kbGVzLmgKaW5kZXggMWE2M2E2Yi4uZTA3MWJhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfaGFuZGxlcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2hhbmRsZXMuaApAQCAtNjYsNiArNjYsNyBAQAogc3RydWN0IHBvcnRhbHNfaGFuZGxlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQkJaF9saW5rOwogCV9fdTY0CQkJCWhfY29va2llOworCWNvbnN0IHZvaWQJCQkqaF9vd25lcjsKIAlzdHJ1Y3QgcG9ydGFsc19oYW5kbGVfb3BzCSpoX29wczsKIAogCS8qIG5ld2x5IGFkZGVkIGZpZWxkcyB0byBoYW5kbGUgdGhlIFJDVSBpc3N1ZS4gLWp4aW9uZyAqLwpAQCAtNzUsMTUgKzc2LDEzIEBACiAJdW5zaWduZWQgaW50CQkJaF9pbjoxOwogfTsKIAotI2RlZmluZSBSQ1UySEFORExFKHJjdSkgICAgY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHBvcnRhbHNfaGFuZGxlLCBoX3JjdSkKLQogLyogaGFuZGxlcy5jICovCiAKIC8qIEFkZCBhIGhhbmRsZSB0byB0aGUgaGFzaCB0YWJsZSAqLwogdm9pZCBjbGFzc19oYW5kbGVfaGFzaChzdHJ1Y3QgcG9ydGFsc19oYW5kbGUgKiwKIAkJICAgICAgIHN0cnVjdCBwb3J0YWxzX2hhbmRsZV9vcHMgKm9wcyk7CiB2b2lkIGNsYXNzX2hhbmRsZV91bmhhc2goc3RydWN0IHBvcnRhbHNfaGFuZGxlICopOwotdm9pZCAqY2xhc3NfaGFuZGxlMm9iamVjdChfX3U2NCBjb29raWUpOwordm9pZCAqY2xhc3NfaGFuZGxlMm9iamVjdChfX3U2NCBjb29raWUsIGNvbnN0IHZvaWQgKm93bmVyKTsKIHZvaWQgY2xhc3NfaGFuZGxlX2ZyZWVfY2Ioc3RydWN0IHJjdV9oZWFkICpyY3UpOwogaW50IGNsYXNzX2hhbmRsZV9pbml0KHZvaWQpOwogdm9pZCBjbGFzc19oYW5kbGVfY2xlYW51cCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ltcG9ydC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfaW1wb3J0LmgKaW5kZXggNDQ0NWJlNy4uNTQ2MWJhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfaW1wb3J0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfaW1wb3J0LmgKQEAgLTI4NSw4ICsyODUsMTAgQEAKIAkJCQkgIGltcF9yZXNlbmRfcmVwbGF5OjEsCiAJCQkJICAvKiBkaXNhYmxlIG5vcm1hbCByZWNvdmVyeSwgZm9yIHRlc3Qgb25seS4gKi8KIAkJCQkgIGltcF9ub19waW5nZXJfcmVjb3ZlcjoxLAorI2lmIE9CRF9PQ0RfVkVSU0lPTigzLCAwLCA1MywgMCkgPiBMVVNUUkVfVkVSU0lPTl9DT0RFCiAJCQkJICAvKiBuZWVkIElSIE1ORSBzd2FiICovCiAJCQkJICBpbXBfbmVlZF9tbmVfc3dhYjoxLAorI2VuZGlmCiAJCQkJICAvKiBpbXBvcnQgbXVzdCBiZSByZWNvbm5lY3RlZCBpbnN0ZWFkIG9mCiAJCQkJICAgKiBjaG9zaW5nIG5ldyBjb25uZWN0aW9uCiAJCQkJICAgKi8KQEAgLTMwNSwyOCArMzA3LDYgQEAKIAl0aW1lNjRfdAkgICAgIGltcF9sYXN0X3JlcGx5X3RpbWU7ICAgIC8qIGZvciBoZWFsdGggY2hlY2sgKi8KIH07CiAKLXR5cGVkZWYgdm9pZCAoKm9iZF9pbXBvcnRfY2FsbGJhY2spKHN0cnVjdCBvYmRfaW1wb3J0ICppbXAsIHZvaWQgKmNsb3N1cmUsCi0JCQkJICAgIGludCBldmVudCwgdm9pZCAqZXZlbnRfYXJnLCB2b2lkICpjYl9kYXRhKTsKLQotLyoqCi0gKiBTdHJ1Y3R1cmUgZm9yIGltcG9ydCBvYnNlcnZlci4KLSAqIEl0IGlzIHBvc3NpYmxlIHRvIHJlZ2lzdGVyICJvYnNlcnZlciIgb24gYW4gaW1wb3J0IGFuZCBldmVyeSB0aW1lCi0gKiBzb21ldGhpbmcgaGFwcGVucyB0byBhbiBpbXBvcnQgKGxpa2UgY29ubmVjdC9ldmljdC9kaXNjb25uZWN0KQotICogb2JkZXJ2ZXIgd2lsbCBnZXQgaXRzIGNhbGxiYWNrIGNhbGxlZCB3aXRoIGV2ZW50IHR5cGUKLSAqLwotc3RydWN0IG9iZF9pbXBvcnRfb2JzZXJ2ZXIgewotCXN0cnVjdCBsaXN0X2hlYWQJICAgb2lvX2NoYWluOwotCW9iZF9pbXBvcnRfY2FsbGJhY2sgIG9pb19jYjsKLQl2b2lkCQkqb2lvX2NiX2RhdGE7Ci19OwotCi12b2lkIGNsYXNzX29ic2VydmVfaW1wb3J0KHN0cnVjdCBvYmRfaW1wb3J0ICppbXAsIG9iZF9pbXBvcnRfY2FsbGJhY2sgY2IsCi0JCQkgIHZvaWQgKmNiX2RhdGEpOwotdm9pZCBjbGFzc191bm9ic2VydmVfaW1wb3J0KHN0cnVjdCBvYmRfaW1wb3J0ICppbXAsIG9iZF9pbXBvcnRfY2FsbGJhY2sgY2IsCi0JCQkgICAgdm9pZCAqY2JfZGF0YSk7Ci12b2lkIGNsYXNzX25vdGlmeV9pbXBvcnRfb2JzZXJ2ZXJzKHN0cnVjdCBvYmRfaW1wb3J0ICppbXAsIGludCBldmVudCwKLQkJCQkgICB2b2lkICpldmVudF9hcmcpOwotCiAvKiBpbXBvcnQuYyAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXRfZXN0MnRpbWVvdXQodW5zaWduZWQgaW50IHZhbCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xpYi5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbGliLmgKaW5kZXggMDY5NThmMi4uNmIyMzE5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbGliLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbGliLmgKQEAgLTUxLDcgKzUxLDYgQEAKICNpbmNsdWRlICJsdXN0cmVfY2ZnLmgiCiAKIC8qIHRhcmdldC5jICovCi1zdHJ1Y3Qga3N0YXRmczsKIHN0cnVjdCBwdGxycGNfcmVxdWVzdDsKIHN0cnVjdCBvYmRfZXhwb3J0Owogc3RydWN0IGx1X3RhcmdldDsKQEAgLTc0LDMyNSArNzMsOCBAQAogCQkgICAgICB1MzIgdmFsbGVuLCB2b2lkICp2YWwsCiAJCSAgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdF9zZXQgKnNldCk7CiAKLSNkZWZpbmUgT0JEX1JFQ09WRVJZX01BWF9USU1FIChvYmRfdGltZW91dCAqIDE4KSAvKiBiMTMwNzkgKi8KLSNkZWZpbmUgT0JEX01BWF9JT0NUTF9CVUZGRVIgQ09ORklHX0xVU1RSRV9PQkRfTUFYX0lPQ1RMX0JVRkZFUgotCiB2b2lkIHRhcmdldF9zZW5kX3JlcGx5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBpbnQgcmMsIGludCBmYWlsX2lkKTsKIAotLyogY2xpZW50LmMgKi8KLQotaW50IGNsaWVudF9zYW5vYmRfc2V0dXAoc3RydWN0IG9iZF9kZXZpY2UgKm9iZGRldiwgc3RydWN0IGx1c3RyZV9jZmcgKmxjZmcpOwotc3RydWN0IGNsaWVudF9vYmQgKmNsaWVudF9jb25uMmNsaShzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqY29ubik7Ci0KLXN0cnVjdCBtZF9vcGVuX2RhdGE7Ci1zdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUgewotCXN0cnVjdCBsdXN0cmVfaGFuZGxlCSBvY2hfZmg7Ci0Jc3RydWN0IGx1X2ZpZAkJIG9jaF9maWQ7Ci0Jc3RydWN0IG1kX29wZW5fZGF0YQkqb2NoX21vZDsKLQlzdHJ1Y3QgbHVzdHJlX2hhbmRsZQkgb2NoX2xlYXNlX2hhbmRsZTsgLyogb3BlbiBsb2NrIGZvciBsZWFzZSAqLwotCV9fdTMyCQkJIG9jaF9tYWdpYzsKLQlmbW9kZV90CQkJIG9jaF9mbGFnczsKLX07Ci0KLSNkZWZpbmUgT0JEX0NMSUVOVF9IQU5ETEVfTUFHSUMgMHhkMTVlYTVlZAotCi0vKiBzdGF0ZnNfcGFjay5jICovCi12b2lkIHN0YXRmc191bnBhY2soc3RydWN0IGtzdGF0ZnMgKnNmcywgc3RydWN0IG9iZF9zdGF0ZnMgKm9zZnMpOwotCi0vKgotICogRm9yIG1kIGVjaG8gY2xpZW50Ci0gKi8KLWVudW0gbWRfZWNob19jbWQgewotCUVDSE9fTURfQ1JFQVRFICAgICAgID0gMSwgLyogT3Blbi9DcmVhdGUgZmlsZSBvbiBNRFQgKi8KLQlFQ0hPX01EX01LRElSCT0gMiwgLyogTWtkaXIgb24gTURUICovCi0JRUNIT19NRF9ERVNUUk9ZICAgICAgPSAzLCAvKiBVbmxpbmsgZmlsZSBvbiBNRFQgKi8KLQlFQ0hPX01EX1JNRElSCT0gNCwgLyogUm1kaXIgb24gTURUICovCi0JRUNIT19NRF9MT09LVVAgICAgICAgPSA1LCAvKiBMb29rdXAgb24gTURUICovCi0JRUNIT19NRF9HRVRBVFRSICAgICAgPSA2LCAvKiBHZXRhdHRyIG9uIE1EVCAqLwotCUVDSE9fTURfU0VUQVRUUiAgICAgID0gNywgLyogU2V0YXR0ciBvbiBNRFQgKi8KLQlFQ0hPX01EX0FMTE9DX0ZJRCAgICA9IDgsIC8qIEdldCBGSURzIGZyb20gTURUICovCi19OwotCi0vKgotICogICBPQkQgSU9DVExTCi0gKi8KLSNkZWZpbmUgT0JEX0lPQ1RMX1ZFUlNJT04gMHgwMDAxMDAwNAotCi1zdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEgewotCV9fdTMyIGlvY19sZW47Ci0JX191MzIgaW9jX3ZlcnNpb247Ci0KLQl1bmlvbiB7Ci0JCV9fdTY0IGlvY19jb29raWU7Ci0JCV9fdTY0IGlvY191NjRfMTsKLQl9OwotCXVuaW9uIHsKLQkJX191MzIgaW9jX2Nvbm4xOwotCQlfX3UzMiBpb2NfdTMyXzE7Ci0JfTsKLQl1bmlvbiB7Ci0JCV9fdTMyIGlvY19jb25uMjsKLQkJX191MzIgaW9jX3UzMl8yOwotCX07Ci0KLQlzdHJ1Y3Qgb2JkbyBpb2Nfb2JkbzE7Ci0Jc3RydWN0IG9iZG8gaW9jX29iZG8yOwotCi0JdTY0CSBpb2NfY291bnQ7Ci0JdTY0CSBpb2Nfb2Zmc2V0OwotCV9fdTMyICAgIGlvY19kZXY7Ci0JX191MzIgICAgaW9jX2NvbW1hbmQ7Ci0KLQlfX3U2NCBpb2NfbmlkOwotCV9fdTMyIGlvY19uYWw7Ci0JX191MzIgaW9jX3R5cGU7Ci0KLQkvKiBidWZmZXJzIHRoZSBrZXJuZWwgd2lsbCB0cmVhdCBhcyB1c2VyIHBvaW50ZXJzICovCi0JX191MzIgIGlvY19wbGVuMTsKLQl2b2lkIF9fdXNlciAqaW9jX3BidWYxOwotCV9fdTMyICBpb2NfcGxlbjI7Ci0Jdm9pZCBfX3VzZXIgKmlvY19wYnVmMjsKLQotCS8qIGlubGluZSBidWZmZXJzIGZvciB2YXJpb3VzIGFyZ3VtZW50cyAqLwotCV9fdTMyICBpb2NfaW5sbGVuMTsKLQljaGFyICAqaW9jX2lubGJ1ZjE7Ci0JX191MzIgIGlvY19pbmxsZW4yOwotCWNoYXIgICppb2NfaW5sYnVmMjsKLQlfX3UzMiAgaW9jX2lubGxlbjM7Ci0JY2hhciAgKmlvY19pbmxidWYzOwotCV9fdTMyICBpb2NfaW5sbGVuNDsKLQljaGFyICAqaW9jX2lubGJ1ZjQ7Ci0KLQljaGFyICAgIGlvY19idWxrWzBdOwotfTsKLQotc3RydWN0IG9iZF9pb2N0bF9oZHIgewotCV9fdTMyIGlvY19sZW47Ci0JX191MzIgaW9jX3ZlcnNpb247Ci19OwotCi1zdGF0aWMgaW5saW5lIGludCBvYmRfaW9jdGxfcGFja2xlbihzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEgKmRhdGEpCi17Ci0JaW50IGxlbiA9IGNmc19zaXplX3JvdW5kKHNpemVvZihzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEpKTsKLQotCWxlbiArPSBjZnNfc2l6ZV9yb3VuZChkYXRhLT5pb2NfaW5sbGVuMSk7Ci0JbGVuICs9IGNmc19zaXplX3JvdW5kKGRhdGEtPmlvY19pbmxsZW4yKTsKLQlsZW4gKz0gY2ZzX3NpemVfcm91bmQoZGF0YS0+aW9jX2lubGxlbjMpOwotCWxlbiArPSBjZnNfc2l6ZV9yb3VuZChkYXRhLT5pb2NfaW5sbGVuNCk7Ci0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgb2JkX2lvY3RsX2lzX2ludmFsaWQoc3RydWN0IG9iZF9pb2N0bF9kYXRhICpkYXRhKQotewotCWlmIChkYXRhLT5pb2NfbGVuID4gT0JEX01BWF9JT0NUTF9CVUZGRVIpIHsKLQkJQ0VSUk9SKCJPQkQgaW9jdGw6IGlvY19sZW4gbGFyZ2VyIHRoYW4gJWRcbiIsCi0JCSAgICAgICBPQkRfTUFYX0lPQ1RMX0JVRkZFUik7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoZGF0YS0+aW9jX2lubGxlbjEgPiBPQkRfTUFYX0lPQ1RMX0JVRkZFUikgewotCQlDRVJST1IoIk9CRCBpb2N0bDogaW9jX2lubGxlbjEgbGFyZ2VyIHRoYW4gaW9jX2xlblxuIik7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoZGF0YS0+aW9jX2lubGxlbjIgPiBPQkRfTUFYX0lPQ1RMX0JVRkZFUikgewotCQlDRVJST1IoIk9CRCBpb2N0bDogaW9jX2lubGxlbjIgbGFyZ2VyIHRoYW4gaW9jX2xlblxuIik7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoZGF0YS0+aW9jX2lubGxlbjMgPiBPQkRfTUFYX0lPQ1RMX0JVRkZFUikgewotCQlDRVJST1IoIk9CRCBpb2N0bDogaW9jX2lubGxlbjMgbGFyZ2VyIHRoYW4gaW9jX2xlblxuIik7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoZGF0YS0+aW9jX2lubGxlbjQgPiBPQkRfTUFYX0lPQ1RMX0JVRkZFUikgewotCQlDRVJST1IoIk9CRCBpb2N0bDogaW9jX2lubGxlbjQgbGFyZ2VyIHRoYW4gaW9jX2xlblxuIik7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoZGF0YS0+aW9jX2lubGJ1ZjEgJiYgIWRhdGEtPmlvY19pbmxsZW4xKSB7Ci0JCUNFUlJPUigiT0JEIGlvY3RsOiBpbmxidWYxIHBvaW50ZXIgYnV0IDAgbGVuZ3RoXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChkYXRhLT5pb2NfaW5sYnVmMiAmJiAhZGF0YS0+aW9jX2lubGxlbjIpIHsKLQkJQ0VSUk9SKCJPQkQgaW9jdGw6IGlubGJ1ZjIgcG9pbnRlciBidXQgMCBsZW5ndGhcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKGRhdGEtPmlvY19pbmxidWYzICYmICFkYXRhLT5pb2NfaW5sbGVuMykgewotCQlDRVJST1IoIk9CRCBpb2N0bDogaW5sYnVmMyBwb2ludGVyIGJ1dCAwIGxlbmd0aFxuIik7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoZGF0YS0+aW9jX2lubGJ1ZjQgJiYgIWRhdGEtPmlvY19pbmxsZW40KSB7Ci0JCUNFUlJPUigiT0JEIGlvY3RsOiBpbmxidWY0IHBvaW50ZXIgYnV0IDAgbGVuZ3RoXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChkYXRhLT5pb2NfcGJ1ZjEgJiYgIWRhdGEtPmlvY19wbGVuMSkgewotCQlDRVJST1IoIk9CRCBpb2N0bDogcGJ1ZjEgcG9pbnRlciBidXQgMCBsZW5ndGhcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKGRhdGEtPmlvY19wYnVmMiAmJiAhZGF0YS0+aW9jX3BsZW4yKSB7Ci0JCUNFUlJPUigiT0JEIGlvY3RsOiBwYnVmMiBwb2ludGVyIGJ1dCAwIGxlbmd0aFxuIik7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoZGF0YS0+aW9jX3BsZW4xICYmICFkYXRhLT5pb2NfcGJ1ZjEpIHsKLQkJQ0VSUk9SKCJPQkQgaW9jdGw6IHBsZW4xIHNldCBidXQgTlVMTCBwb2ludGVyXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChkYXRhLT5pb2NfcGxlbjIgJiYgIWRhdGEtPmlvY19wYnVmMikgewotCQlDRVJST1IoIk9CRCBpb2N0bDogcGxlbjIgc2V0IGJ1dCBOVUxMIHBvaW50ZXJcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKG9iZF9pb2N0bF9wYWNrbGVuKGRhdGEpID4gZGF0YS0+aW9jX2xlbikgewotCQlDRVJST1IoIk9CRCBpb2N0bDogcGFja2xlbiBleGNlZWRzIGlvY19sZW4gKCVkID4gJWQpXG4iLAotCQkgICAgICAgb2JkX2lvY3RsX3BhY2tsZW4oZGF0YSksIGRhdGEtPmlvY19sZW4pOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpbmNsdWRlICJvYmRfc3VwcG9ydC5oIgotCi0vKiBmdW5jdGlvbiBkZWZpbmVkIGluIGx1c3RyZS9vYmRjbGFzcy88cGxhdGZvcm0+LzxwbGF0Zm9ybT4tbW9kdWxlLmMgKi8KLWludCBvYmRfaW9jdGxfZ2V0ZGF0YShjaGFyICoqYnVmLCBpbnQgKmxlbiwgdm9pZCBfX3VzZXIgKmFyZyk7Ci1pbnQgb2JkX2lvY3RsX3BvcGRhdGEodm9pZCBfX3VzZXIgKmFyZywgdm9pZCAqZGF0YSwgaW50IGxlbik7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvYmRfaW9jdGxfZnJlZWRhdGEoY2hhciAqYnVmLCBpbnQgbGVuKQotewotCWt2ZnJlZShidWYpOwotCXJldHVybjsKLX0KLQotLyoKLSAqIEJTRCBpb2N0bCBkZXNjcmlwdGlvbjoKLSAqICNkZWZpbmUgSU9DX1YxICAgICAgIF9JT1IoZywgbjEsIGxvbmcpCi0gKiAjZGVmaW5lIElPQ19WMiAgICAgICBfSU9XKGcsIG4yLCBsb25nKQotICoKLSAqIGlvY3RsKGYsIElPQ19WMSwgYXJnKTsKLSAqIGFyZyB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBsb25nIHZhbHVlLAotICoKLSAqIGlvY3RsKGYsIElPQ19WMiwgYXJnKQotICogYXJnIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHBvaW50ZXIsIGJzZCB3aWxsIGNhbGwKLSAqIGNvcHlpbihidWYsIGFyZywgc2l6ZW9mKGxvbmcpKQotICoKLSAqIFRvIG1ha2UgQlNEIGlvY3RsIGhhbmRsZXMgYXJndW1lbnQgY29ycmVjdGx5IGFuZCBzaW1wbGVseSwKLSAqIHdlIGNoYW5nZSBfSU9SIHRvIF9JT1dSIHNvIEJTRCB3aWxsIGNvcHlpbiBvYmRfaW9jdGxfZGF0YQotICogZm9yIHVzLiBEb2VzIHRoaXMgY2hhbmdlIGFmZmVjdCBMaW51eD8gIChYWFggTGlhbmcpCi0gKi8KLSNkZWZpbmUgT0JEX0lPQ19EQVRBX1RZUEUgbG9uZwotCi0jZGVmaW5lIE9CRF9JT0NfQ1JFQVRFCQkgX0lPV1IoJ2YnLCAxMDEsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX0RFU1RST1kJCV9JT1coJ2YnLCAxMDQsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX1BSRUFMTE9DQVRFCSAgICBfSU9XUignZicsIDEwNSwgT0JEX0lPQ19EQVRBX1RZUEUpCi0KLSNkZWZpbmUgT0JEX0lPQ19TRVRBVFRSCQlfSU9XKCdmJywgMTA3LCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19HRVRBVFRSCQlfSU9XUiAoJ2YnLCAxMDgsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX1JFQUQJCSAgIF9JT1dSKCdmJywgMTA5LCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19XUklURQkJICBfSU9XUignZicsIDExMCwgT0JEX0lPQ19EQVRBX1RZUEUpCi0KLSNkZWZpbmUgT0JEX0lPQ19TVEFURlMJCSBfSU9XUignZicsIDExMywgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfU1lOQwkJICAgX0lPVygnZicsIDExNCwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfUkVBRDIJCSAgX0lPV1IoJ2YnLCAxMTUsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX0ZPUk1BVAkJIF9JT1dSKCdmJywgMTE2LCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19QQVJUSVRJT04JICAgICAgX0lPV1IoJ2YnLCAxMTcsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX0NPUFkJCSAgIF9JT1dSKCdmJywgMTIwLCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19NSUdSCQkgICBfSU9XUignZicsIDEyMSwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfUFVOQ0gJCSAgX0lPV1IoJ2YnLCAxMjIsIE9CRF9JT0NfREFUQV9UWVBFKQotCi0jZGVmaW5lIE9CRF9JT0NfTU9EVUxFX0RFQlVHCSAgIF9JT1dSKCdmJywgMTI0LCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19CUldfUkVBRAkgICAgICAgX0lPV1IoJ2YnLCAxMjUsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX0JSV19XUklURQkgICAgICBfSU9XUignZicsIDEyNiwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfTkFNRTJERVYJICAgICAgIF9JT1dSKCdmJywgMTI3LCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19VVUlEMkRFVgkgICAgICAgX0lPV1IoJ2YnLCAxMzAsIE9CRF9JT0NfREFUQV9UWVBFKQotCi0jZGVmaW5lIE9CRF9JT0NfR0VUTkFNRQkJX0lPV1IoJ2YnLCAxMzEsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX0dFVE1ETkFNRQkgICAgICBfSU9SKCdmJywgMTMxLCBjaGFyW01BWF9PQkRfTkFNRV0pCi0jZGVmaW5lIE9CRF9JT0NfR0VURFROQU1FCSAgICAgICBPQkRfSU9DX0dFVE5BTUUKLQotI2RlZmluZSBPQkRfSU9DX0xPVl9HRVRfQ09ORklHCSBfSU9XUignZicsIDEzMiwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfQ0xJRU5UX1JFQ09WRVIJIF9JT1coJ2YnLCAxMzMsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX1BJTkdfVEFSR0VUCSAgICBfSU9XKCdmJywgMTM2LCBPQkRfSU9DX0RBVEFfVFlQRSkKLQotI2RlZmluZSBPQkRfSU9DX0RFQ19GU19VU0VfQ09VTlQgICAgICAgX0lPICAoJ2YnLCAxMzkpCi0jZGVmaW5lIE9CRF9JT0NfTk9fVFJBTlNOTwkgICAgIF9JT1coJ2YnLCAxNDAsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX1NFVF9SRUFET05MWQkgICBfSU9XKCdmJywgMTQxLCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19BQk9SVF9SRUNPVkVSWQkgX0lPUignZicsIDE0MiwgT0JEX0lPQ19EQVRBX1RZUEUpCi0KLSNkZWZpbmUgT0JEX0lPQ19ST09UX1NRVUFTSAkgICAgX0lPV1IoJ2YnLCAxNDMsIE9CRF9JT0NfREFUQV9UWVBFKQotCi0jZGVmaW5lIE9CRF9HRVRfVkVSU0lPTgkJX0lPV1IgKCdmJywgMTQ0LCBPQkRfSU9DX0RBVEFfVFlQRSkKLQotI2RlZmluZSBPQkRfSU9DX0dTU19TVVBQT1JUCSAgICBfSU9XUignZicsIDE0NSwgT0JEX0lPQ19EQVRBX1RZUEUpCi0KLSNkZWZpbmUgT0JEX0lPQ19DTE9TRV9VVUlECSAgICAgX0lPV1IgKCdmJywgMTQ3LCBPQkRfSU9DX0RBVEFfVFlQRSkKLQotI2RlZmluZSBPQkRfSU9DX0NIQU5HRUxPR19TRU5ECSBfSU9XKCdmJywgMTQ4LCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19HRVRERVZJQ0UJICAgICAgX0lPV1IgKCdmJywgMTQ5LCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19GSUQyUEFUSAkgICAgICAgX0lPV1IgKCdmJywgMTUwLCBPQkRfSU9DX0RBVEFfVFlQRSkKLS8qIHNlZSBhbHNvIDxsdXN0cmUvbHVzdHJlX3VzZXIuaD4gZm9yIGlvY3RscyAxNTEtMTUzICovCi0vKiBPQkRfSU9DX0xPVl9TRVRTVFJJUEU6IFNlZSBhbHNvIExMX0lPQ19MT1ZfU0VUU1RSSVBFICovCi0jZGVmaW5lIE9CRF9JT0NfTE9WX1NFVFNUUklQRQkgIF9JT1coJ2YnLCAxNTQsIE9CRF9JT0NfREFUQV9UWVBFKQotLyogT0JEX0lPQ19MT1ZfR0VUU1RSSVBFOiBTZWUgYWxzbyBMTF9JT0NfTE9WX0dFVFNUUklQRSAqLwotI2RlZmluZSBPQkRfSU9DX0xPVl9HRVRTVFJJUEUJICBfSU9XKCdmJywgMTU1LCBPQkRfSU9DX0RBVEFfVFlQRSkKLS8qIE9CRF9JT0NfTE9WX1NFVEVBOiBTZWUgYWxzbyBMTF9JT0NfTE9WX1NFVEVBICovCi0jZGVmaW5lIE9CRF9JT0NfTE9WX1NFVEVBCSAgICAgIF9JT1coJ2YnLCAxNTYsIE9CRF9JT0NfREFUQV9UWVBFKQotLyogc2VlIDxsdXN0cmUvbHVzdHJlX3VzZXIuaD4gZm9yIGlvY3RscyAxNTctMTU5ICovCi0vKiBPQkRfSU9DX1FVT1RBQ0hFQ0s6IFNlZSBhbHNvIExMX0lPQ19RVU9UQUNIRUNLICovCi0jZGVmaW5lIE9CRF9JT0NfUVVPVEFDSEVDSwkgICAgIF9JT1coJ2YnLCAxNjAsIGludCkKLS8qIE9CRF9JT0NfUE9MTF9RVU9UQUNIRUNLOiBTZWUgYWxzbyBMTF9JT0NfUE9MTF9RVU9UQUNIRUNLICovCi0jZGVmaW5lIE9CRF9JT0NfUE9MTF9RVU9UQUNIRUNLCV9JT1IoJ2YnLCAxNjEsIHN0cnVjdCBpZl9xdW90YWNoZWNrICopCi0vKiBPQkRfSU9DX1FVT1RBQ1RMOiBTZWUgYWxzbyBMTF9JT0NfUVVPVEFDVEwgKi8KLSNkZWZpbmUgT0JEX0lPQ19RVU9UQUNUTAkgICAgICAgX0lPV1IoJ2YnLCAxNjIsIHN0cnVjdCBpZl9xdW90YWN0bCkKLS8qIHNlZSAgYWxzbyA8bHVzdHJlL2x1c3RyZV91c2VyLmg+IGZvciBpb2N0bHMgMTYzLTE3NiAqLwotI2RlZmluZSBPQkRfSU9DX0NIQU5HRUxPR19SRUcJICBfSU9XKCdmJywgMTc3LCBzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEpCi0jZGVmaW5lIE9CRF9JT0NfQ0hBTkdFTE9HX0RFUkVHCV9JT1coJ2YnLCAxNzgsIHN0cnVjdCBvYmRfaW9jdGxfZGF0YSkKLSNkZWZpbmUgT0JEX0lPQ19DSEFOR0VMT0dfQ0xFQVIJX0lPVygnZicsIDE3OSwgc3RydWN0IG9iZF9pb2N0bF9kYXRhKQotI2RlZmluZSBPQkRfSU9DX1JFQ09SRAkJIF9JT1dSKCdmJywgMTgwLCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19FTkRSRUNPUkQJICAgICAgX0lPV1IoJ2YnLCAxODEsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX1BBUlNFCQkgIF9JT1dSKCdmJywgMTgyLCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19ET1JFQ09SRAkgICAgICAgX0lPV1IoJ2YnLCAxODMsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX1BST0NFU1NfQ0ZHCSAgICBfSU9XUignZicsIDE4NCwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfRFVNUF9MT0cJICAgICAgIF9JT1dSKCdmJywgMTg1LCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19DTEVBUl9MT0cJICAgICAgX0lPV1IoJ2YnLCAxODYsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX1BBUkFNCQkgIF9JT1coJ2YnLCAxODcsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX1BPT0wJCSAgIF9JT1dSKCdmJywgMTg4LCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19SRVBMQUNFX05JRFMJICAgX0lPV1IoJ2YnLCAxODksIE9CRF9JT0NfREFUQV9UWVBFKQotCi0jZGVmaW5lIE9CRF9JT0NfQ0FUTE9HTElTVAkgICAgIF9JT1dSKCdmJywgMTkwLCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19MTE9HX0lORk8JICAgICAgX0lPV1IoJ2YnLCAxOTEsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX0xMT0dfUFJJTlQJICAgICBfSU9XUignZicsIDE5MiwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfTExPR19DQU5DRUwJICAgIF9JT1dSKCdmJywgMTkzLCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19MTE9HX1JFTU9WRQkgICAgX0lPV1IoJ2YnLCAxOTQsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX0xMT0dfQ0hFQ0sJICAgICBfSU9XUignZicsIDE5NSwgT0JEX0lPQ19EQVRBX1RZUEUpCi0vKiBPQkRfSU9DX0xMT0dfQ0FUSU5GTyBpcyBkZXByZWNhdGVkICovCi0jZGVmaW5lIE9CRF9JT0NfTExPR19DQVRJTkZPCSAgIF9JT1dSKCdmJywgMTk2LCBPQkRfSU9DX0RBVEFfVFlQRSkKLQotLyoJI2RlZmluZSBFQ0hPX0lPQ19HRVRfU1RSSVBFICAgIF9JT1dSKCdmJywgMjAwLCBPQkRfSU9DX0RBVEFfVFlQRSkgKi8KLS8qCSNkZWZpbmUgRUNIT19JT0NfU0VUX1NUUklQRSAgICBfSU9XUignZicsIDIwMSwgT0JEX0lPQ19EQVRBX1RZUEUpICovCi0vKgkjZGVmaW5lIEVDSE9fSU9DX0VOUVVFVUUgICAgICAgX0lPV1IoJ2YnLCAyMDIsIE9CRF9JT0NfREFUQV9UWVBFKSAqLwotLyoJI2RlZmluZSBFQ0hPX0lPQ19DQU5DRUwgICAgICAgIF9JT1dSKCdmJywgMjAzLCBPQkRfSU9DX0RBVEFfVFlQRSkgKi8KLQotI2RlZmluZSBPQkRfSU9DX0dFVF9PQkpfVkVSU0lPTglfSU9SKCdmJywgMjEwLCBPQkRfSU9DX0RBVEFfVFlQRSkKLQotLyogPGx1c3RyZS9sdXN0cmVfdXNlci5oPiBkZWZpbmVzIGlvY3RsIG51bWJlciAyMTgtMjE5ICovCi0jZGVmaW5lIE9CRF9JT0NfR0VUX01OVE9QVAkgICAgIF9JT1coJ2YnLCAyMjAsIG1udG9wdF90KQotCi0jZGVmaW5lIE9CRF9JT0NfRUNIT19NRAkJX0lPUignZicsIDIyMSwgc3RydWN0IG9iZF9pb2N0bF9kYXRhKQotI2RlZmluZSBPQkRfSU9DX0VDSE9fQUxMT0NfU0VRCSBfSU9XUignZicsIDIyMiwgc3RydWN0IG9iZF9pb2N0bF9kYXRhKQotCi0jZGVmaW5lIE9CRF9JT0NfU1RBUlRfTEZTQ0sJICAgICAgIF9JT1dSKCdmJywgMjMwLCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19TVE9QX0xGU0NLCSAgICAgICBfSU9XKCdmJywgMjMxLCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19QQVVTRV9MRlNDSwkgICAgICAgX0lPVygnZicsIDIzMiwgT0JEX0lPQ19EQVRBX1RZUEUpCi0KLS8qIFhYWCBfSU9XUignZicsIDI1MCwgbG9uZykgaGFzIGJlZW4gZGVmaW5lZCBpbgotICogbGliY2ZzL2luY2x1ZGUvbGliY2ZzL2xpYmNmc19wcml2YXRlLmggZm9yIGRlYnVnLCBkb24ndCB1c2UgaXQKLSAqLwotCi0vKiBVbnRpbCBzdWNoIHRpbWUgYXMgd2UgZ2V0X2luZm8gdGhlIHBlci1zdHJpcGUgbWF4aW11bSBmcm9tIHRoZSBPU1QsCi0gKiB3ZSBkZWZpbmUgdGhpcyB0byBiZSAyVCAtIDRrLCB3aGljaCBpcyB0aGUgZXh0MyBtYXhieXRlcy4KLSAqLwotI2RlZmluZSBMVVNUUkVfU1RSSVBFX01BWEJZVEVTIDB4MWZmZmZmZmYwMDBVTEwKLQotLyogU3BlY2lhbCB2YWx1ZXMgZm9yIHJlbW92ZSBMT1YgRUEgZnJvbSBkaXNrICovCi0jZGVmaW5lIExPVkVBX0RFTEVURV9WQUxVRVMoc2l6ZSwgY291bnQsIG9mZnNldCkgKHNpemUgPT0gMCAmJiBjb3VudCA9PSAwICYmIFwKLQkJCQkJCSBvZmZzZXQgPT0gKHR5cGVvZihvZmZzZXQpKSgtMSkpCi0KLS8qICNkZWZpbmUgUE9JU09OX0JVTEsgMCAqLwotCiAvKgogICogbF93YWl0X2V2ZW50IGlzIGEgZmxleGlibGUgc2xlZXBpbmcgZnVuY3Rpb24sIHBlcm1pdHRpbmcgc2ltcGxlIGNhbGxlcgogICogY29uZmlndXJhdGlvbiBvZiBpbnRlcnJ1cHQgYW5kIHRpbWVvdXQgc2Vuc2l0aXZpdHkgYWxvbmcgd2l0aCBhY3Rpb25zIHRvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9saW5rZWEuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xpbmtlYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OWU4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9saW5rZWEuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogR1BMIEhFQURFUiBTVEFSVAorICoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQKKyAqIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IElmIG5vdCwgc2VlCisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sCisgKgorICogR1BMIEhFQURFUiBFTkQKKyAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zLgorICoKKyAqIEF1dGhvcjogZGkgd2FuZyA8ZGkud2FuZ0BpbnRlbC5jb20+CisgKi8KKworI2RlZmluZSBERUZBVUxUX0xJTktFQV9TSVpFCTQwOTYKKworc3RydWN0IGxpbmtlYV9kYXRhIHsKKwkvKioKKwkgKiBCdWZmZXIgdG8ga2VlcCBsaW5rIEVBIGJvZHkuCisJICovCisJc3RydWN0IGx1X2J1ZgkJKmxkX2J1ZjsKKwkvKioKKwkgKiBUaGUgbWF0Y2hlZCBoZWFkZXIsIGVudHJ5IGFuZCBpdHMgbGVuZ3RoIGluIHRoZSBFQQorCSAqLworCXN0cnVjdCBsaW5rX2VhX2hlYWRlcgkqbGRfbGVoOworCXN0cnVjdCBsaW5rX2VhX2VudHJ5CSpsZF9sZWU7CisJaW50CQkJbGRfcmVjbGVuOworfTsKKworaW50IGxpbmtlYV9kYXRhX25ldyhzdHJ1Y3QgbGlua2VhX2RhdGEgKmxkYXRhLCBzdHJ1Y3QgbHVfYnVmICpidWYpOworaW50IGxpbmtlYV9pbml0KHN0cnVjdCBsaW5rZWFfZGF0YSAqbGRhdGEpOwordm9pZCBsaW5rZWFfZW50cnlfdW5wYWNrKGNvbnN0IHN0cnVjdCBsaW5rX2VhX2VudHJ5ICpsZWUsIGludCAqcmVjbGVuLAorCQkJIHN0cnVjdCBsdV9uYW1lICpsbmFtZSwgc3RydWN0IGx1X2ZpZCAqcGZpZCk7CitpbnQgbGlua2VhX2VudHJ5X3BhY2soc3RydWN0IGxpbmtfZWFfZW50cnkgKmxlZSwgY29uc3Qgc3RydWN0IGx1X25hbWUgKmxuYW1lLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpwZmlkKTsKK2ludCBsaW5rZWFfYWRkX2J1ZihzdHJ1Y3QgbGlua2VhX2RhdGEgKmxkYXRhLCBjb25zdCBzdHJ1Y3QgbHVfbmFtZSAqbG5hbWUsCisJCSAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKnBmaWQpOwordm9pZCBsaW5rZWFfZGVsX2J1ZihzdHJ1Y3QgbGlua2VhX2RhdGEgKmxkYXRhLCBjb25zdCBzdHJ1Y3QgbHVfbmFtZSAqbG5hbWUpOworaW50IGxpbmtlYV9saW5rc19maW5kKHN0cnVjdCBsaW5rZWFfZGF0YSAqbGRhdGEsIGNvbnN0IHN0cnVjdCBsdV9uYW1lICpsbmFtZSwKKwkJICAgICAgY29uc3Qgc3RydWN0IGx1X2ZpZCAgKnBmaWQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgbGlua2VhX2ZpcnN0X2VudHJ5KHN0cnVjdCBsaW5rZWFfZGF0YSAqbGRhdGEpCit7CisJTEFTU0VSVChsZGF0YSk7CisJTEFTU0VSVChsZGF0YS0+bGRfbGVoKTsKKworCWlmIChsZGF0YS0+bGRfbGVoLT5sZWhfcmVjY291bnQgPT0gMCkKKwkJbGRhdGEtPmxkX2xlZSA9IE5VTEw7CisJZWxzZQorCQlsZGF0YS0+bGRfbGVlID0gKHN0cnVjdCBsaW5rX2VhX2VudHJ5ICopKGxkYXRhLT5sZF9sZWggKyAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxpbmtlYV9uZXh0X2VudHJ5KHN0cnVjdCBsaW5rZWFfZGF0YSAqbGRhdGEpCit7CisJTEFTU0VSVChsZGF0YSk7CisJTEFTU0VSVChsZGF0YS0+bGRfbGVoKTsKKworCWlmIChsZGF0YS0+bGRfbGVlKSB7CisJCWxkYXRhLT5sZF9sZWUgPSAoc3RydWN0IGxpbmtfZWFfZW50cnkgKikoKGNoYXIgKilsZGF0YS0+bGRfbGVlICsKKwkJCQkJCQkgbGRhdGEtPmxkX3JlY2xlbik7CisJCWlmICgoY2hhciAqKWxkYXRhLT5sZF9sZWUgPj0gKChjaGFyICopbGRhdGEtPmxkX2xlaCArCisJCQkJCSAgICAgIGxkYXRhLT5sZF9sZWgtPmxlaF9sZW4pKQorCQkJbGRhdGEtPmxkX2xlZSA9IE5VTEw7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbGl0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTY4OTc3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xpdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBHUEwgSEVBREVSIFNUQVJUCi0gKgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LAotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZAotICogaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgSWYgbm90LCBzZWUKLSAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwKLSAqCi0gKiBHUEwgSEVBREVSIEVORAotICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIsIEludGVsIENvcnBvcmF0aW9uLgotICovCi0vKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTHVzdHJlLCBodHRwOi8vd3d3Lmx1c3RyZS5vcmcvCi0gKiBMdXN0cmUgaXMgYSB0cmFkZW1hcmsgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICovCi0KLSNpZm5kZWYgX0xMX0gKLSNkZWZpbmUgX0xMX0gKLQotLyoqIFxkZWZncm91cCBsaXRlIGxpdGUKLSAqCi0gKiBAewotICovCi0KLSNpbmNsdWRlICJsaW51eC9sdXN0cmVfbGl0ZS5oIgotCi0jaW5jbHVkZSAib2JkX2NsYXNzLmgiCi0jaW5jbHVkZSAibHVzdHJlX25ldC5oIgotI2luY2x1ZGUgImx1c3RyZV9tZHMuaCIKLSNpbmNsdWRlICJsdXN0cmVfaGEuaCIKLQotLyogNFVMICogMTAyNCAqIDEwMjQgKi8KLSNkZWZpbmUgTExfTUFYX0JMS1NJWkVfQklUUyAgICAgKDIyKQotI2RlZmluZSBMTF9NQVhfQkxLU0laRQkgICgxVUw8PExMX01BWF9CTEtTSVpFX0JJVFMpCi0KLS8qCi0gKiBUaGlzIGlzIGVtYmVkZGVkIGludG8gbGxpdGUgc3VwZXItYmxvY2tzIHRvIGtlZXAgdHJhY2sgb2YKLSAqIGNvbm5lY3QgZmxhZ3MgKGNhcGFiaWxpdGllcykgc3VwcG9ydGVkIGJ5IGFsbCBpbXBvcnRzIGdpdmVuIG1vdW50IGlzCi0gKiBjb25uZWN0ZWQgdG8uCi0gKi8KLXN0cnVjdCBsdXN0cmVfY2xpZW50X29jZCB7Ci0JLyoKLQkgKiBUaGlzIGlzIGNvbmp1bmN0aW9uIG9mIGNvbm5lY3RfZmxhZ3MgYWNyb3NzIGFsbCBpbXBvcnRzIChMT1ZzKSB0aGlzCi0JICogbW91bnQgaXMgY29ubmVjdGVkIHRvLiBUaGlzIGZpZWxkIGlzIHVwZGF0ZWQgYnkgY2xfb2NkX3VwZGF0ZSgpCi0JICogdW5kZXIgLT5sY29fbG9jay4KLQkgKi8KLQlfX3U2NAkgICAgICBsY29fZmxhZ3M7Ci0Jc3RydWN0IG11dGV4CSAgIGxjb19sb2NrOwotCXN0cnVjdCBvYmRfZXhwb3J0ICpsY29fbWRfZXhwOwotCXN0cnVjdCBvYmRfZXhwb3J0ICpsY29fZHRfZXhwOwotfTsKLQotLyoKLSAqIENoYWluIG9mIGhhc2ggb3ZlcmZsb3cgcGFnZXMuCi0gKi8KLXN0cnVjdCBsbF9kaXJfY2hhaW4gewotCS8qIFhYWCBzb21ldGhpbmcuIExhdGVyICovCi19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgbGxfZGlyX2NoYWluX2luaXQoc3RydWN0IGxsX2Rpcl9jaGFpbiAqY2hhaW4pCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBsbF9kaXJfY2hhaW5fZmluaShzdHJ1Y3QgbGxfZGlyX2NoYWluICpjaGFpbikKLXsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhhc2hfeF9pbmRleChfX3U2NCBoYXNoLCBpbnQgaGFzaDY0KQotewotCWlmIChCSVRTX1BFUl9MT05HID09IDMyICYmIGhhc2g2NCkKLQkJaGFzaCA+Pj0gMzI7Ci0JLyogc2F2ZSBoYXNoIDAgYXMgaW5kZXggMCBiZWNhdXNlIG90aGVyd2lzZSB3ZSdsbCBzYXZlIGl0IGF0Ci0JICogcGFnZSBpbmRleCBlbmQgKH4wVUwpIGFuZCBpdCBjYXVzZXMgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UoKQotCSAqIHRvIGxvb3AgZm9yZXZlci4KLQkgKi8KLQlyZXR1cm4gfjBVTCAtIChoYXNoICsgIWhhc2gpOwotfQotCi0vKiogQH0gbGl0ZSAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xtdi5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbG12LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmN2FmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xtdi5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogR1BMIEhFQURFUiBTVEFSVAorICoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzLiAgQSBjb3B5IGlzCisgKiBpbmNsdWRlZCBpbiB0aGUgQ09QWUlORyBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IElmIG5vdCwgc2VlCisgKiBodHRwOi8vd3d3LnN1bi5jb20vc29mdHdhcmUvcHJvZHVjdHMvbHVzdHJlL2RvY3MvR1BMdjIucGRmCisgKgorICogR1BMIEhFQURFUiBFTkQKKyAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uCisgKi8KKy8qCisgKiBsdXN0cmUvaW5jbHVkZS9sdXN0cmVfbG12LmgKKyAqCisgKiBMdXN0cmUgTE1WIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucy4KKyAqCisgKiBBdXRob3I6IERpIFdhbmcgPGRpLndhbmdAaW50ZWwuY29tPgorICovCisKKyNpZm5kZWYgX0xVU1RSRV9MTVZfSAorI2RlZmluZSBfTFVTVFJFX0xNVl9ICisjaW5jbHVkZSAibHVzdHJlL2x1c3RyZV9pZGwuaCIKKworc3RydWN0IGxtdl9vaW5mbyB7CisJc3RydWN0IGx1X2ZpZAlsbW9fZmlkOworCXUzMgkJbG1vX21kczsKKwlzdHJ1Y3QgaW5vZGUJKmxtb19yb290OworfTsKKworc3RydWN0IGxtdl9zdHJpcGVfbWQgeworCV9fdTMyCWxzbV9tZF9tYWdpYzsKKwlfX3UzMglsc21fbWRfc3RyaXBlX2NvdW50OworCV9fdTMyCWxzbV9tZF9tYXN0ZXJfbWR0X2luZGV4OworCV9fdTMyCWxzbV9tZF9oYXNoX3R5cGU7CisJX191MzIJbHNtX21kX2xheW91dF92ZXJzaW9uOworCV9fdTMyCWxzbV9tZF9kZWZhdWx0X2NvdW50OworCV9fdTMyCWxzbV9tZF9kZWZhdWx0X2luZGV4OworCWNoYXIJbHNtX21kX3Bvb2xfbmFtZVtMT1ZfTUFYUE9PTE5BTUUgKyAxXTsKKwlzdHJ1Y3QgbG12X29pbmZvIGxzbV9tZF9vaW5mb1swXTsKK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorbHNtX21kX2VxKGNvbnN0IHN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20xLCBjb25zdCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtMikKK3sKKwlfX3UzMiBpZHg7CisKKwlpZiAobHNtMS0+bHNtX21kX21hZ2ljICE9IGxzbTItPmxzbV9tZF9tYWdpYyB8fAorCSAgICBsc20xLT5sc21fbWRfc3RyaXBlX2NvdW50ICE9IGxzbTItPmxzbV9tZF9zdHJpcGVfY291bnQgfHwKKwkgICAgbHNtMS0+bHNtX21kX21hc3Rlcl9tZHRfaW5kZXggIT0gbHNtMi0+bHNtX21kX21hc3Rlcl9tZHRfaW5kZXggfHwKKwkgICAgbHNtMS0+bHNtX21kX2hhc2hfdHlwZSAhPSBsc20yLT5sc21fbWRfaGFzaF90eXBlIHx8CisJICAgIGxzbTEtPmxzbV9tZF9sYXlvdXRfdmVyc2lvbiAhPSBsc20yLT5sc21fbWRfbGF5b3V0X3ZlcnNpb24gfHwKKwkgICAgIXN0cmNtcChsc20xLT5sc21fbWRfcG9vbF9uYW1lLCBsc20yLT5sc21fbWRfcG9vbF9uYW1lKSkKKwkJcmV0dXJuIGZhbHNlOworCisJZm9yIChpZHggPSAwOyBpZHggPCBsc20xLT5sc21fbWRfc3RyaXBlX2NvdW50OyBpZHgrKykgeworCQlpZiAoIWx1X2ZpZF9lcSgmbHNtMS0+bHNtX21kX29pbmZvW2lkeF0ubG1vX2ZpZCwKKwkJCSAgICAgICAmbHNtMi0+bHNtX21kX29pbmZvW2lkeF0ubG1vX2ZpZCkpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3VuaW9uIGxtdl9tZHNfbWQ7CisKK2ludCBsbXZfdW5wYWNrX21kKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsbXZfc3RyaXBlX21kICoqbHNtcCwKKwkJICBjb25zdCB1bmlvbiBsbXZfbWRzX21kICpsbW0sIGludCBzdHJpcGVfY291bnQpOworCitzdGF0aWMgaW5saW5lIGludCBsbXZfYWxsb2NfbWVtbWQoc3RydWN0IGxtdl9zdHJpcGVfbWQgKipsc21wLCBpbnQgc3RyaXBlX2NvdW50KQoreworCXJldHVybiBsbXZfdW5wYWNrX21kKE5VTEwsIGxzbXAsIE5VTEwsIHN0cmlwZV9jb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsbXZfZnJlZV9tZW1tZChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtKQoreworCWxtdl91bnBhY2tfbWQoTlVMTCwgJmxzbSwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsbXYxX2xlX3RvX2NwdShzdHJ1Y3QgbG12X21kc19tZF92MSAqbG12X2RzdCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBsbXZfbWRzX21kX3YxICpsbXZfc3JjKQoreworCV9fdTMyIGk7CisKKwlsbXZfZHN0LT5sbXZfbWFnaWMgPSBsZTMyX3RvX2NwdShsbXZfc3JjLT5sbXZfbWFnaWMpOworCWxtdl9kc3QtPmxtdl9zdHJpcGVfY291bnQgPSBsZTMyX3RvX2NwdShsbXZfc3JjLT5sbXZfc3RyaXBlX2NvdW50KTsKKwlsbXZfZHN0LT5sbXZfbWFzdGVyX21kdF9pbmRleCA9CisJCWxlMzJfdG9fY3B1KGxtdl9zcmMtPmxtdl9tYXN0ZXJfbWR0X2luZGV4KTsKKwlsbXZfZHN0LT5sbXZfaGFzaF90eXBlID0gbGUzMl90b19jcHUobG12X3NyYy0+bG12X2hhc2hfdHlwZSk7CisJbG12X2RzdC0+bG12X2xheW91dF92ZXJzaW9uID0gbGUzMl90b19jcHUobG12X3NyYy0+bG12X2xheW91dF92ZXJzaW9uKTsKKworCWZvciAoaSA9IDA7IGkgPCBsbXZfc3JjLT5sbXZfc3RyaXBlX2NvdW50OyBpKyspCisJCWZpZF9sZV90b19jcHUoJmxtdl9kc3QtPmxtdl9zdHJpcGVfZmlkc1tpXSwKKwkJCSAgICAgICZsbXZfc3JjLT5sbXZfc3RyaXBlX2ZpZHNbaV0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbG12X2xlX3RvX2NwdSh1bmlvbiBsbXZfbWRzX21kICpsbXZfZHN0LAorCQkJCSBjb25zdCB1bmlvbiBsbXZfbWRzX21kICpsbXZfc3JjKQoreworCXN3aXRjaCAobGUzMl90b19jcHUobG12X3NyYy0+bG12X21hZ2ljKSkgeworCWNhc2UgTE1WX01BR0lDX1YxOgorCQlsbXYxX2xlX3RvX2NwdSgmbG12X2RzdC0+bG12X21kX3YxLCAmbG12X3NyYy0+bG12X21kX3YxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKiBUaGlzIGhhc2ggaXMgb25seSBmb3IgdGVzdGluZyBwdXJwb3NlICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorbG12X2hhc2hfYWxsX2NoYXJzKHVuc2lnbmVkIGludCBjb3VudCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopbmFtZTsKKwl1bnNpZ25lZCBpbnQgYyA9IDA7CisKKwl3aGlsZSAoLS1uYW1lbGVuID49IDApCisJCWMgKz0gcFtuYW1lbGVuXTsKKworCWMgPSBjICUgY291bnQ7CisKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2xtdl9oYXNoX2ZudjFhKHVuc2lnbmVkIGludCBjb3VudCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pCit7CisJX191NjQgaGFzaDsKKworCWhhc2ggPSBsdXN0cmVfaGFzaF9mbnZfMWFfNjQobmFtZSwgbmFtZWxlbik7CisKKwlyZXR1cm4gZG9fZGl2KGhhc2gsIGNvdW50KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG12X25hbWVfdG9fc3RyaXBlX2luZGV4KF9fdTMyIGxtdl9oYXNoX3R5cGUsCisJCQkJCSAgIHVuc2lnbmVkIGludCBzdHJpcGVfY291bnQsCisJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworCV9fdTMyIGhhc2hfdHlwZSA9IGxtdl9oYXNoX3R5cGUgJiBMTVZfSEFTSF9UWVBFX01BU0s7CisJaW50IGlkeDsKKworCUxBU1NFUlQobmFtZWxlbiA+IDApOworCWlmIChzdHJpcGVfY291bnQgPD0gMSkKKwkJcmV0dXJuIDA7CisKKwkvKiBmb3IgbWlncmF0aW5nIG9iamVjdCwgYWx3YXlzIHN0YXJ0IGZyb20gMCBzdHJpcGUgKi8KKwlpZiAobG12X2hhc2hfdHlwZSAmIExNVl9IQVNIX0ZMQUdfTUlHUkFUSU9OKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoaGFzaF90eXBlKSB7CisJY2FzZSBMTVZfSEFTSF9UWVBFX0FMTF9DSEFSUzoKKwkJaWR4ID0gbG12X2hhc2hfYWxsX2NoYXJzKHN0cmlwZV9jb3VudCwgbmFtZSwgbmFtZWxlbik7CisJCWJyZWFrOworCWNhc2UgTE1WX0hBU0hfVFlQRV9GTlZfMUFfNjQ6CisJCWlkeCA9IGxtdl9oYXNoX2ZudjFhKHN0cmlwZV9jb3VudCwgbmFtZSwgbmFtZWxlbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlkeCA9IC1FQkFERkQ7CisJCWJyZWFrOworCX0KKwlDREVCVUcoRF9JTkZPLCAibmFtZSAlLipzIGhhc2hfdHlwZSAlZCBpZHggJWRcbiIsIG5hbWVsZW4sIG5hbWUsCisJICAgICAgIGhhc2hfdHlwZSwgaWR4KTsKKworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBsbXZfaXNfa25vd25faGFzaF90eXBlKF9fdTMyIHR5cGUpCit7CisJcmV0dXJuICh0eXBlICYgTE1WX0hBU0hfVFlQRV9NQVNLKSA9PSBMTVZfSEFTSF9UWVBFX0ZOVl8xQV82NCB8fAorCSAgICAgICAodHlwZSAmIExNVl9IQVNIX1RZUEVfTUFTSykgPT0gTE1WX0hBU0hfVFlQRV9BTExfQ0hBUlM7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbG9nLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9sb2cuaAppbmRleCBiOTZlMDIzLi45OTViMjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9sb2cuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9sb2cuaApAQCAtMjc3LDEyICsyNzcsMTEgQEAKIAlfX2xsb2dfY3R4dF9wdXQoTlVMTCwgY3R4dCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBsbG9nX2dyb3VwX2luaXQoc3RydWN0IG9iZF9sbG9nX2dyb3VwICpvbGcsIGludCBncm91cCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBsbG9nX2dyb3VwX2luaXQoc3RydWN0IG9iZF9sbG9nX2dyb3VwICpvbGcpCiB7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmb2xnLT5vbGdfd2FpdHEpOwogCXNwaW5fbG9ja19pbml0KCZvbGctPm9sZ19sb2NrKTsKIAltdXRleF9pbml0KCZvbGctPm9sZ19jYXRfcHJvY2Vzc2luZyk7Ci0Jb2xnLT5vbGdfc2VxID0gZ3JvdXA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGxsb2dfZ3JvdXBfc2V0X2N0eHQoc3RydWN0IG9iZF9sbG9nX2dyb3VwICpvbGcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9tZGMuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX21kYy5oCmluZGV4IGZhNjJiOTUuLjhmYzJkM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX21kYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX21kYy5oCkBAIC05Niw3ICs5Niw3IEBACiAJCQkJICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCkKIHsKIAlpZiAoaXQgJiYgKGl0LT5pdF9vcCA9PSBJVF9HRVRBVFRSIHx8IGl0LT5pdF9vcCA9PSBJVF9MT09LVVAgfHwKLQkJICAgaXQtPml0X29wID09IElUX0xBWU9VVCkpCisJCSAgIGl0LT5pdF9vcCA9PSBJVF9MQVlPVVQgfHwgaXQtPml0X29wID09IElUX1JFQURESVIpKQogCQlyZXR1cm47CiAKIAkvKiBUaGlzIHdvdWxkIG5vcm1hbGx5IGJsb2NrIHVudGlsIHRoZSBleGlzdGluZyByZXF1ZXN0IGZpbmlzaGVzLgpAQCAtMTM2LDcgKzEzNiw3IEBACiAJCQkJICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCkKIHsKIAlpZiAoaXQgJiYgKGl0LT5pdF9vcCA9PSBJVF9HRVRBVFRSIHx8IGl0LT5pdF9vcCA9PSBJVF9MT09LVVAgfHwKLQkJICAgaXQtPml0X29wID09IElUX0xBWU9VVCkpCisJCSAgIGl0LT5pdF9vcCA9PSBJVF9MQVlPVVQgfHwgaXQtPml0X29wID09IElUX1JFQURESVIpKQogCQlyZXR1cm47CiAKIAlpZiAobGNrLT5ycGNsX2l0ID09IE1EQ19GQUtFX1JQQ0xfSVQpIHsgLyogT0JEX0ZBSUxfTURDX1JQQ1NfU0VNICovCkBAIC0xNTYsMzQgKzE1Niw0NCBAQAogCW11dGV4X3VubG9jaygmbGNrLT5ycGNsX211dGV4KTsKIH0KIAotLyogVXBkYXRlIHRoZSBtYXhpbXVtIG9ic2VydmVkIGVhc2l6ZSBhbmQgY29va2llc2l6ZS4gIFRoZSBkZWZhdWx0IGVhc2l6ZQotICogYW5kIGNvb2tpZXNpemUgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIG1pbmltdW0gdmFsdWUgYnV0IGFsbG93ZWQgdG8gZ3JvdwotICogdXAgdG8gYSBzaW5nbGUgcGFnZSBpbiBzaXplIGlmIHJlcXVpcmVkIHRvIGhhbmRsZSB0aGUgY29tbW9uIGNhc2UuCisvKioKKyAqIFVwZGF0ZSB0aGUgbWF4aW11bSBwb3NzaWJsZSBlYXNpemUgYW5kIGNvb2tpZXNpemUuCisgKgorICogVGhlIHZhbHVlcyBhcmUgbGVhcm5lZCBmcm9tIHB0bHJwYyByZXBsaWVzIHNlbnQgYnkgdGhlIE1EVC4gIFRoZQorICogZGVmYXVsdCBlYXNpemUgYW5kIGNvb2tpZXNpemUgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIG1pbmltdW0gdmFsdWUgYnV0CisgKiBhbGxvd2VkIHRvIGdyb3cgdXAgdG8gYSBzaW5nbGUgcGFnZSBpbiBzaXplIGlmIHJlcXVpcmVkIHRvIGhhbmRsZSB0aGUKKyAqIGNvbW1vbiBjYXNlLgorICoKKyAqIFxzZWUgY2xpZW50X29iZDo6Y2xfZGVmYXVsdF9tZHNfZWFzaXplIGFuZAorICogY2xpZW50X29iZDo6Y2xfZGVmYXVsdF9tZHNfY29va2llc2l6ZQorICoKKyAqIFxwYXJhbVtpbl0gZXhwCWV4cG9ydCBmb3IgTURDIGRldmljZQorICogXHBhcmFtW2luXSBib2R5CWJvZHkgb2YgcHRscnBjIHJlcGx5IGZyb20gTURUCisgKgogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgbWRjX3VwZGF0ZV9tYXhfZWFfZnJvbV9ib2R5KHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCQkJCSAgICAgICBzdHJ1Y3QgbWR0X2JvZHkgKmJvZHkpCiB7Ci0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMTU9ERUFTSVpFKSB7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTE1PREVBU0laRSkgewogCQlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJmV4cC0+ZXhwX29iZC0+dS5jbGk7CisJCXUzMiBkZWZfY29va2llc2l6ZSwgZGVmX2Vhc2l6ZTsKIAotCQlpZiAoY2xpLT5jbF9tYXhfbWRzX2Vhc2l6ZSA8IGJvZHktPm1heF9tZHNpemUpIHsKLQkJCWNsaS0+Y2xfbWF4X21kc19lYXNpemUgPSBib2R5LT5tYXhfbWRzaXplOwotCQkJY2xpLT5jbF9kZWZhdWx0X21kc19lYXNpemUgPQotCQkJICAgIG1pbl90KF9fdTMyLCBib2R5LT5tYXhfbWRzaXplLCBQQUdFX1NJWkUpOwotCQl9Ci0JCWlmIChjbGktPmNsX21heF9tZHNfY29va2llc2l6ZSA8IGJvZHktPm1heF9jb29raWVzaXplKSB7Ci0JCQljbGktPmNsX21heF9tZHNfY29va2llc2l6ZSA9IGJvZHktPm1heF9jb29raWVzaXplOwotCQkJY2xpLT5jbF9kZWZhdWx0X21kc19jb29raWVzaXplID0KLQkJCSAgICBtaW5fdChfX3UzMiwgYm9keS0+bWF4X2Nvb2tpZXNpemUsIFBBR0VfU0laRSk7Ci0JCX0KKwkJaWYgKGNsaS0+Y2xfbWF4X21kc19lYXNpemUgPCBib2R5LT5tYm9fbWF4X21kc2l6ZSkKKwkJCWNsaS0+Y2xfbWF4X21kc19lYXNpemUgPSBib2R5LT5tYm9fbWF4X21kc2l6ZTsKKworCQlkZWZfZWFzaXplID0gbWluX3QoX191MzIsIGJvZHktPm1ib19tYXhfbWRzaXplLAorCQkJCSAgIE9CRF9NQVhfREVGQVVMVF9FQV9TSVpFKTsKKwkJY2xpLT5jbF9kZWZhdWx0X21kc19lYXNpemUgPSBkZWZfZWFzaXplOworCisJCWlmIChjbGktPmNsX21heF9tZHNfY29va2llc2l6ZSA8IGJvZHktPm1ib19tYXhfY29va2llc2l6ZSkKKwkJCWNsaS0+Y2xfbWF4X21kc19jb29raWVzaXplID0gYm9keS0+bWJvX21heF9jb29raWVzaXplOworCisJCWRlZl9jb29raWVzaXplID0gbWluX3QoX191MzIsIGJvZHktPm1ib19tYXhfY29va2llc2l6ZSwKKwkJCQkgICAgICAgT0JEX01BWF9ERUZBVUxUX0NPT0tJRV9TSVpFKTsKKwkJY2xpLT5jbF9kZWZhdWx0X21kc19jb29raWVzaXplID0gZGVmX2Nvb2tpZXNpemU7CiAJfQogfQogCi1zdHJ1Y3QgbWRjX2NhY2hlX3dhaXRlciB7Ci0Jc3RydWN0IGxpc3RfaGVhZAkgICAgICBtY3dfZW50cnk7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJICAgICBtY3dfd2FpdHE7Ci19OwotCiAvKiBtZGMvbWRjX2xvY2tzLmMgKi8KIGludCBpdF9vcGVuX2Vycm9yKGludCBwaGFzZSwgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbWRzLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9tZHMuaAppbmRleCA0MTA0YmQ5Li4yM2E3ZTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9tZHMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9tZHMuaApAQCAtNTgsOSArNTgsNiBAQAogI2RlZmluZSBNRERfT0JEX05BTUUgICAgICJtZGRfb2JkIgogI2RlZmluZSBNRERfT0JEX1VVSUQgICAgICJtZGRfb2JkX3V1aWQiCiAKLS8qIHRoZXNlIGFyZSBsb2NhbCBmbGFncywgdXNlZCBvbmx5IG9uIHRoZSBjbGllbnQsIHByaXZhdGUgKi8KLSNkZWZpbmUgTV9DSEVDS19TVEFMRQkgICAwMjAwMDAwMDAwCi0KIC8qKiBAfSBtZHMgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9uZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX25ldC5oCmluZGV4IGQ1ZGViZDYuLmU5YWJhOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX25ldC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX25ldC5oCkBAIC0yNjEsNyArMjYxLDEwIEBACiAKICNkZWZpbmUgTURTX01BWFJFUVNJWkUJCSg1ICogMTAyNCkJLyogPj0gNDczNiAqLwogCi0jZGVmaW5lIE9TVF9NQVhSRVFTSVpFCQkoNSAqIDEwMjQpCisvKioKKyAqIEZJRU1BUCByZXF1ZXN0IGNhbiBiZSA0SysgZm9yIG5vdworICovCisjZGVmaW5lIE9TVF9NQVhSRVFTSVpFCQkoMTYgKiAxMDI0KQogCiAvKiBNYWNybyB0byBoaWRlIGEgdHlwZWNhc3QuICovCiAjZGVmaW5lIHB0bHJwY19yZXFfYXN5bmNfYXJncyhyZXEpICgodm9pZCAqKSZyZXEtPnJxX2FzeW5jX2FyZ3MpCkBAIC01NzAsMTMgKzU3MywxMyBAQAogCSAqCiAJICogXHBhcmFtW2luLG91dF0gcG9saWN5IFRoZSBwb2xpY3kgYmVpbmcgaW5pdGlhbGl6ZWQKIAkgKi8KLQlpbnQJKCpvcF9wb2xpY3lfaW5pdCkgKHN0cnVjdCBwdGxycGNfbnJzX3BvbGljeSAqcG9saWN5KTsKKwlpbnQJKCpvcF9wb2xpY3lfaW5pdCkoc3RydWN0IHB0bHJwY19ucnNfcG9saWN5ICpwb2xpY3kpOwogCS8qKgogCSAqIENhbGxlZCBkdXJpbmcgcG9saWN5IHVucmVnaXN0cmF0aW9uOyB0aGlzIG9wZXJhdGlvbiBpcyBvcHRpb25hbC4KIAkgKgogCSAqIFxwYXJhbVtpbixvdXRdIHBvbGljeSBUaGUgcG9saWN5IGJlaW5nIHVucmVnaXN0ZXJlZC9maW5hbGl6ZWQKIAkgKi8KLQl2b2lkCSgqb3BfcG9saWN5X2ZpbmkpIChzdHJ1Y3QgcHRscnBjX25yc19wb2xpY3kgKnBvbGljeSk7CisJdm9pZAkoKm9wX3BvbGljeV9maW5pKShzdHJ1Y3QgcHRscnBjX25yc19wb2xpY3kgKnBvbGljeSk7CiAJLyoqCiAJICogQ2FsbGVkIHdoZW4gYWN0aXZhdGluZyBhIHBvbGljeSB2aWEgbHByb2NmczsgcG9saWNpZXMgYWxsb2NhdGUgYW5kCiAJICogaW5pdGlhbGl6ZSB0aGVpciByZXNvdXJjZXMgaGVyZTsgdGhpcyBvcGVyYXRpb24gaXMgb3B0aW9uYWwuCkBAIC01ODUsNyArNTg4LDcgQEAKIAkgKgogCSAqIFxzZWUgbnJzX3BvbGljeV9zdGFydF9sb2NrZWQoKQogCSAqLwotCWludAkoKm9wX3BvbGljeV9zdGFydCkgKHN0cnVjdCBwdGxycGNfbnJzX3BvbGljeSAqcG9saWN5KTsKKwlpbnQJKCpvcF9wb2xpY3lfc3RhcnQpKHN0cnVjdCBwdGxycGNfbnJzX3BvbGljeSAqcG9saWN5KTsKIAkvKioKIAkgKiBDYWxsZWQgd2hlbiBkZWFjdGl2YXRpbmcgYSBwb2xpY3kgdmlhIGxwcm9jZnM7IHBvbGljaWVzIGRlYWxsb2NhdGUKIAkgKiB0aGVpciByZXNvdXJjZXMgaGVyZTsgdGhpcyBvcGVyYXRpb24gaXMgb3B0aW9uYWwKQEAgLTU5NCw3ICs1OTcsNyBAQAogCSAqCiAJICogXHNlZSBucnNfcG9saWN5X3N0b3AwKCkKIAkgKi8KLQl2b2lkCSgqb3BfcG9saWN5X3N0b3ApIChzdHJ1Y3QgcHRscnBjX25yc19wb2xpY3kgKnBvbGljeSk7CisJdm9pZAkoKm9wX3BvbGljeV9zdG9wKShzdHJ1Y3QgcHRscnBjX25yc19wb2xpY3kgKnBvbGljeSk7CiAJLyoqCiAJICogVXNlZCBmb3IgcG9saWN5LXNwZWNpZmljIG9wZXJhdGlvbnM7IGkuZS4gbm90IGdlbmVyaWMgb25lcyBsaWtlCiAJICogXGUgUFRMUlBDX05SU19DVExfU1RBUlQgYW5kIFxlIFBUTFJQQ19OUlNfQ1RMX0dFVF9JTkZPOyBhbmFsb2dvdXMKQEAgLTYxMCw4ICs2MTMsOCBAQAogCSAqCiAJICogXHNlZSBwdGxycGNfbnJzX3BvbGljeV9jb250cm9sKCkKIAkgKi8KLQlpbnQJKCpvcF9wb2xpY3lfY3RsKSAoc3RydWN0IHB0bHJwY19ucnNfcG9saWN5ICpwb2xpY3ksCi0JCQkJICBlbnVtIHB0bHJwY19ucnNfY3RsIG9wYywgdm9pZCAqYXJnKTsKKwlpbnQJKCpvcF9wb2xpY3lfY3RsKShzdHJ1Y3QgcHRscnBjX25yc19wb2xpY3kgKnBvbGljeSwKKwkJCQkgZW51bSBwdGxycGNfbnJzX2N0bCBvcGMsIHZvaWQgKmFyZyk7CiAKIAkvKioKIAkgKiBDYWxsZWQgd2hlbiBvYnRhaW5pbmcgcmVmZXJlbmNlcyB0byB0aGUgcmVzb3VyY2VzIG9mIHRoZSByZXNvdXJjZQpAQCAtNjQ4LDExICs2NTEsMTEgQEAKIAkgKiBcc2VlIHB0bHJwY19ucnNfcmVxX2luaXRpYWxpemUoKQogCSAqIFxzZWUgcHRscnBjX25yc19ocHJlcV9hZGRfbm9sb2NrKCkKIAkgKi8KLQlpbnQJKCpvcF9yZXNfZ2V0KSAoc3RydWN0IHB0bHJwY19ucnNfcG9saWN5ICpwb2xpY3ksCi0JCQkgICAgICAgc3RydWN0IHB0bHJwY19ucnNfcmVxdWVzdCAqbnJxLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwdGxycGNfbnJzX3Jlc291cmNlICpwYXJlbnQsCi0JCQkgICAgICAgc3RydWN0IHB0bHJwY19ucnNfcmVzb3VyY2UgKipyZXNwLAotCQkJICAgICAgIGJvb2wgbW92aW5nX3JlcSk7CisJaW50CSgqb3BfcmVzX2dldCkoc3RydWN0IHB0bHJwY19ucnNfcG9saWN5ICpwb2xpY3ksCisJCQkgICAgICBzdHJ1Y3QgcHRscnBjX25yc19yZXF1ZXN0ICpucnEsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgcHRscnBjX25yc19yZXNvdXJjZSAqcGFyZW50LAorCQkJICAgICAgc3RydWN0IHB0bHJwY19ucnNfcmVzb3VyY2UgKipyZXNwLAorCQkJICAgICAgYm9vbCBtb3ZpbmdfcmVxKTsKIAkvKioKIAkgKiBDYWxsZWQgd2hlbiByZWxlYXNpbmcgcmVmZXJlbmNlcyB0YWtlbiBmb3IgcmVzb3VyY2VzIGluIHRoZSByZXNvdXJjZQogCSAqIGhpZXJhcmNoeSBmb3IgdGhlIHJlcXVlc3Q7IHRoaXMgb3BlcmF0aW9uIGlzIG9wdGlvbmFsLgpAQCAtNjYzLDggKzY2Niw4IEBACiAJICogXHNlZSBwdGxycGNfbnJzX3JlcV9maW5hbGl6ZSgpCiAJICogXHNlZSBwdGxycGNfbnJzX2hwcmVxX2FkZF9ub2xvY2soKQogCSAqLwotCXZvaWQJKCpvcF9yZXNfcHV0KSAoc3RydWN0IHB0bHJwY19ucnNfcG9saWN5ICpwb2xpY3ksCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IHB0bHJwY19ucnNfcmVzb3VyY2UgKnJlcyk7CisJdm9pZAkoKm9wX3Jlc19wdXQpKHN0cnVjdCBwdGxycGNfbnJzX3BvbGljeSAqcG9saWN5LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHB0bHJwY19ucnNfcmVzb3VyY2UgKnJlcyk7CiAKIAkvKioKIAkgKiBPYnRhaW5zIGEgcmVxdWVzdCBmb3IgaGFuZGxpbmcgZnJvbSB0aGUgcG9saWN5LCBhbmQgb3B0aW9uYWxseQpAQCAtNjgzLDggKzY4Niw4IEBACiAJICogXHNlZSBwdGxycGNfbnJzX3JlcV9nZXRfbm9sb2NrKCkKIAkgKi8KIAlzdHJ1Y3QgcHRscnBjX25yc19yZXF1ZXN0ICoKLQkJKCpvcF9yZXFfZ2V0KSAoc3RydWN0IHB0bHJwY19ucnNfcG9saWN5ICpwb2xpY3ksIGJvb2wgcGVlaywKLQkJCSAgICAgICBib29sIGZvcmNlKTsKKwkJKCpvcF9yZXFfZ2V0KShzdHJ1Y3QgcHRscnBjX25yc19wb2xpY3kgKnBvbGljeSwgYm9vbCBwZWVrLAorCQkJICAgICAgYm9vbCBmb3JjZSk7CiAJLyoqCiAJICogQ2FsbGVkIHdoZW4gYXR0ZW1wdGluZyB0byBhZGQgYSByZXF1ZXN0IHRvIGEgcG9saWN5IGZvciBsYXRlcgogCSAqIGhhbmRsaW5nOyB0aGlzIG9wZXJhdGlvbiBpcyBtYW5kYXRvcnkuCkBAIC02OTcsOCArNzAwLDggQEAKIAkgKgogCSAqIFxzZWUgcHRscnBjX25yc19yZXFfYWRkX25vbG9jaygpCiAJICovCi0JaW50CSgqb3BfcmVxX2VucXVldWUpIChzdHJ1Y3QgcHRscnBjX25yc19wb2xpY3kgKnBvbGljeSwKLQkJCQkgICBzdHJ1Y3QgcHRscnBjX25yc19yZXF1ZXN0ICpucnEpOworCWludAkoKm9wX3JlcV9lbnF1ZXVlKShzdHJ1Y3QgcHRscnBjX25yc19wb2xpY3kgKnBvbGljeSwKKwkJCQkgIHN0cnVjdCBwdGxycGNfbnJzX3JlcXVlc3QgKm5ycSk7CiAJLyoqCiAJICogUmVtb3ZlcyBhIHJlcXVlc3QgZnJvbSB0aGUgcG9saWN5J3Mgc2V0IG9mIHBlbmRpbmcgcmVxdWVzdHMuIE5vcm1hbGx5CiAJICogY2FsbGVkIGFmdGVyIGEgcmVxdWVzdCBoYXMgYmVlbiBwb2xsZWQgc3VjY2Vzc2Z1bGx5IGZyb20gdGhlIHBvbGljeQpAQCAtNzA3LDggKzcxMCw4IEBACiAJICogXHBhcmFtW2luLG91dF0gcG9saWN5IFRoZSBwb2xpY3kgdGhlIHJlcXVlc3QgXGEgbnJxIGJlbG9uZ3MgdG8KIAkgKiBccGFyYW1baW4sb3V0XSBucnEgICAgVGhlIHJlcXVlc3QgdG8gZGVxdWV1ZQogCSAqLwotCXZvaWQJKCpvcF9yZXFfZGVxdWV1ZSkgKHN0cnVjdCBwdGxycGNfbnJzX3BvbGljeSAqcG9saWN5LAotCQkJCSAgIHN0cnVjdCBwdGxycGNfbnJzX3JlcXVlc3QgKm5ycSk7CisJdm9pZAkoKm9wX3JlcV9kZXF1ZXVlKShzdHJ1Y3QgcHRscnBjX25yc19wb2xpY3kgKnBvbGljeSwKKwkJCQkgIHN0cnVjdCBwdGxycGNfbnJzX3JlcXVlc3QgKm5ycSk7CiAJLyoqCiAJICogQ2FsbGVkIGFmdGVyIHRoZSByZXF1ZXN0IGJlaW5nIGNhcnJpZWQgb3V0LiBDb3VsZCBiZSB1c2VkIGZvcgogCSAqIGpvYi9yZXNvdXJjZSBjb250cm9sOyB0aGlzIG9wZXJhdGlvbiBpcyBvcHRpb25hbC4KQEAgLTcyMSw4ICs3MjQsOCBAQAogCSAqCiAJICogXHNlZSBwdGxycGNfbnJzX3JlcV9zdG9wX25vbG9jaygpCiAJICovCi0Jdm9pZAkoKm9wX3JlcV9zdG9wKSAoc3RydWN0IHB0bHJwY19ucnNfcG9saWN5ICpwb2xpY3ksCi0JCQkJc3RydWN0IHB0bHJwY19ucnNfcmVxdWVzdCAqbnJxKTsKKwl2b2lkCSgqb3BfcmVxX3N0b3ApKHN0cnVjdCBwdGxycGNfbnJzX3BvbGljeSAqcG9saWN5LAorCQkJICAgICAgIHN0cnVjdCBwdGxycGNfbnJzX3JlcXVlc3QgKm5ycSk7CiAJLyoqCiAJICogUmVnaXN0ZXJzIHRoZSBwb2xpY3kncyBscHJvY2ZzIGludGVyZmFjZSB3aXRoIGEgUFRMUlBDIHNlcnZpY2UuCiAJICoKQEAgLTczMSw3ICs3MzQsNyBAQAogCSAqIFxyZXR2YWwgMAlzdWNjZXNzCiAJICogXHJldHZhbCAhPSAwCWVycm9yCiAJICovCi0JaW50CSgqb3BfbHByb2Nmc19pbml0KSAoc3RydWN0IHB0bHJwY19zZXJ2aWNlICpzdmMpOworCWludAkoKm9wX2xwcm9jZnNfaW5pdCkoc3RydWN0IHB0bHJwY19zZXJ2aWNlICpzdmMpOwogCS8qKgogCSAqIFVuZWdpc3RlcnMgdGhlIHBvbGljeSdzIGxwcm9jZnMgaW50ZXJmYWNlIHdpdGggYSBQVExSUEMgc2VydmljZS4KIAkgKgpAQCAtNzQzLDcgKzc0Niw3IEBACiAJICoKIAkgKiBccGFyYW1baW5dIHN2YyBUaGUgc2VydmljZQogCSAqLwotCXZvaWQJKCpvcF9scHJvY2ZzX2ZpbmkpIChzdHJ1Y3QgcHRscnBjX3NlcnZpY2UgKnN2Yyk7CisJdm9pZAkoKm9wX2xwcm9jZnNfZmluaSkoc3RydWN0IHB0bHJwY19zZXJ2aWNlICpzdmMpOwogfTsKIAogLyoqCkBAIC0xNjI4LDcgKzE2MzEsNyBAQAogLyoqCiAgKiBSZXR1cm5zIDEgaWYgcmVxdWVzdCBidWZmZXIgYXQgb2Zmc2V0IFxhIGluZGV4IHdhcyBhbHJlYWR5IHN3YWJiZWQKICAqLwotc3RhdGljIGlubGluZSBpbnQgbHVzdHJlX3JlcV9zd2FiYmVkKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBpbnQgaW5kZXgpCitzdGF0aWMgaW5saW5lIGludCBsdXN0cmVfcmVxX3N3YWJiZWQoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHNpemVfdCBpbmRleCkKIHsKIAlMQVNTRVJUKGluZGV4IDwgc2l6ZW9mKHJlcS0+cnFfcmVxX3N3YWJfbWFzaykgKiA4KTsKIAlyZXR1cm4gcmVxLT5ycV9yZXFfc3dhYl9tYXNrICYgKDEgPDwgaW5kZXgpOwpAQCAtMTYzNyw3ICsxNjQwLDcgQEAKIC8qKgogICogUmV0dXJucyAxIGlmIHJlcXVlc3QgcmVwbHkgYnVmZmVyIGF0IG9mZnNldCBcYSBpbmRleCB3YXMgYWxyZWFkeSBzd2FiYmVkCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGx1c3RyZV9yZXBfc3dhYmJlZChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgaW50IGluZGV4KQorc3RhdGljIGlubGluZSBpbnQgbHVzdHJlX3JlcF9zd2FiYmVkKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBzaXplX3QgaW5kZXgpCiB7CiAJTEFTU0VSVChpbmRleCA8IHNpemVvZihyZXEtPnJxX3JlcF9zd2FiX21hc2spICogOCk7CiAJcmV0dXJuIHJlcS0+cnFfcmVwX3N3YWJfbWFzayAmICgxIDw8IGluZGV4KTsKQEAgLTE2NjIsNyArMTY2NSw4IEBACiAvKioKICAqIE1hcmsgcmVxdWVzdCBidWZmZXIgYXQgb2Zmc2V0IFxhIGluZGV4IHRoYXQgaXQgd2FzIGFscmVhZHkgc3dhYmJlZAogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbHVzdHJlX3NldF9yZXFfc3dhYmJlZChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgaW50IGluZGV4KQorc3RhdGljIGlubGluZSB2b2lkIGx1c3RyZV9zZXRfcmVxX3N3YWJiZWQoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCisJCQkJCSAgc2l6ZV90IGluZGV4KQogewogCUxBU1NFUlQoaW5kZXggPCBzaXplb2YocmVxLT5ycV9yZXFfc3dhYl9tYXNrKSAqIDgpOwogCUxBU1NFUlQoKHJlcS0+cnFfcmVxX3N3YWJfbWFzayAmICgxIDw8IGluZGV4KSkgPT0gMCk7CkBAIC0xNjcyLDcgKzE2NzYsOCBAQAogLyoqCiAgKiBNYXJrIHJlcXVlc3QgcmVwbHkgYnVmZmVyIGF0IG9mZnNldCBcYSBpbmRleCB0aGF0IGl0IHdhcyBhbHJlYWR5IHN3YWJiZWQKICAqLwotc3RhdGljIGlubGluZSB2b2lkIGx1c3RyZV9zZXRfcmVwX3N3YWJiZWQoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIGludCBpbmRleCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBsdXN0cmVfc2V0X3JlcF9zd2FiYmVkKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLAorCQkJCQkgIHNpemVfdCBpbmRleCkKIHsKIAlMQVNTRVJUKGluZGV4IDwgc2l6ZW9mKHJlcS0+cnFfcmVwX3N3YWJfbWFzaykgKiA4KTsKIAlMQVNTRVJUKChyZXEtPnJxX3JlcF9zd2FiX21hc2sgJiAoMSA8PCBpbmRleCkpID09IDApOwpAQCAtMjQwMyw3ICsyNDA4LDYgQEAKIGludCBwdGxycGNfcmVwbHkoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpOwogaW50IHB0bHJwY19zZW5kX2Vycm9yKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBpbnQgZGlmZmljdWx0KTsKIGludCBwdGxycGNfZXJyb3Ioc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpOwotdm9pZCBwdGxycGNfcmVzZW5kX3JlcShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QpOwogaW50IHB0bHJwY19hdF9nZXRfbmV0X2xhdGVuY3koc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpOwogaW50IHB0bF9zZW5kX3JwYyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QsIGludCBub3JlcGx5KTsKIGludCBwdGxycGNfcmVnaXN0ZXJfcnFiZChzdHJ1Y3QgcHRscnBjX3JlcXVlc3RfYnVmZmVyX2Rlc2MgKnJxYmQpOwpAQCAtMjQyMywyMyArMjQyNywxNyBAQAogCiBpbnQgcHRscnBjX3F1ZXVlX3dhaXQoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpOwogaW50IHB0bHJwY19yZXBsYXlfcmVxKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKTsKLWludCBwdGxycGNfdW5yZWdpc3Rlcl9yZXBseShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgaW50IGFzeW5jKTsKIHZvaWQgcHRscnBjX2Fib3J0X2luZmxpZ2h0KHN0cnVjdCBvYmRfaW1wb3J0ICppbXApOwogdm9pZCBwdGxycGNfYWJvcnRfc2V0KHN0cnVjdCBwdGxycGNfcmVxdWVzdF9zZXQgKnNldCk7CiAKIHN0cnVjdCBwdGxycGNfcmVxdWVzdF9zZXQgKnB0bHJwY19wcmVwX3NldCh2b2lkKTsKIHN0cnVjdCBwdGxycGNfcmVxdWVzdF9zZXQgKnB0bHJwY19wcmVwX2Zjc2V0KGludCBtYXgsIHNldF9wcm9kdWNlcl9mdW5jIGZ1bmMsCiAJCQkJCSAgICAgdm9pZCAqYXJnKTsKLWludCBwdGxycGNfc2V0X25leHRfdGltZW91dChzdHJ1Y3QgcHRscnBjX3JlcXVlc3Rfc2V0ICopOwogaW50IHB0bHJwY19jaGVja19zZXQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3Rfc2V0ICpzZXQpOwogaW50IHB0bHJwY19zZXRfd2FpdChzdHJ1Y3QgcHRscnBjX3JlcXVlc3Rfc2V0ICopOwotaW50IHB0bHJwY19leHBpcmVkX3NldCh2b2lkICpkYXRhKTsKLXZvaWQgcHRscnBjX2ludGVycnVwdGVkX3NldCh2b2lkICpkYXRhKTsKIHZvaWQgcHRscnBjX21hcmtfaW50ZXJydXB0ZWQoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpOwogdm9pZCBwdGxycGNfc2V0X2Rlc3Ryb3koc3RydWN0IHB0bHJwY19yZXF1ZXN0X3NldCAqKTsKIHZvaWQgcHRscnBjX3NldF9hZGRfcmVxKHN0cnVjdCBwdGxycGNfcmVxdWVzdF9zZXQgKiwgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICopOwotdm9pZCBwdGxycGNfc2V0X2FkZF9uZXdfcmVxKHN0cnVjdCBwdGxycGNkX2N0bCAqcGMsCi0JCQkgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpOwogCiB2b2lkIHB0bHJwY19mcmVlX3JxX3Bvb2woc3RydWN0IHB0bHJwY19yZXF1ZXN0X3Bvb2wgKnBvb2wpOwogaW50IHB0bHJwY19hZGRfcnFzX3RvX3Bvb2woc3RydWN0IHB0bHJwY19yZXF1ZXN0X3Bvb2wgKnBvb2wsIGludCBudW1fcnEpOwpAQCAtMjYxMSw5ICsyNjA5LDkgQEAKICAqIEB7CiAgKi8KIGludCBwdGxycGNfYnVmX25lZWRfc3dhYihzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgY29uc3QgaW50IGlub3V0LAotCQkJIGludCBpbmRleCk7CisJCQkgdTMyIGluZGV4KTsKIHZvaWQgcHRscnBjX2J1Zl9zZXRfc3dhYmJlZChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgY29uc3QgaW50IGlub3V0LAotCQkJICAgIGludCBpbmRleCk7CisJCQkgICAgdTMyIGluZGV4KTsKIGludCBwdGxycGNfdW5wYWNrX3JlcF9tc2coc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIGludCBsZW4pOwogaW50IHB0bHJwY191bnBhY2tfcmVxX21zZyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgaW50IGxlbik7CiAKQEAgLTI2MzIsMjcgKzI2MzAsMjcgQEAKIAkJICAgICAgdW5zaWduZWQgaW50IG5ld2xlbiwgaW50IG1vdmVfZGF0YSk7CiB2b2lkIGx1c3RyZV9mcmVlX3JlcGx5X3N0YXRlKHN0cnVjdCBwdGxycGNfcmVwbHlfc3RhdGUgKnJzKTsKIGludCBfX2x1c3RyZV91bnBhY2tfbXNnKHN0cnVjdCBsdXN0cmVfbXNnICptLCBpbnQgbGVuKTsKLWludCBsdXN0cmVfbXNnX2hkcl9zaXplKF9fdTMyIG1hZ2ljLCBpbnQgY291bnQpOwotaW50IGx1c3RyZV9tc2dfc2l6ZShfX3UzMiBtYWdpYywgaW50IGNvdW50LCBfX3UzMiAqbGVuZ3Rocyk7Ci1pbnQgbHVzdHJlX21zZ19zaXplX3YyKGludCBjb3VudCwgX191MzIgKmxlbmd0aHMpOwotaW50IGx1c3RyZV9wYWNrZWRfbXNnX3NpemUoc3RydWN0IGx1c3RyZV9tc2cgKm1zZyk7Ci1pbnQgbHVzdHJlX21zZ19lYXJseV9zaXplKHZvaWQpOwotdm9pZCAqbHVzdHJlX21zZ19idWZfdjIoc3RydWN0IGx1c3RyZV9tc2dfdjIgKm0sIGludCBuLCBpbnQgbWluX3NpemUpOwotdm9pZCAqbHVzdHJlX21zZ19idWYoc3RydWN0IGx1c3RyZV9tc2cgKm0sIGludCBuLCBpbnQgbWlubGVuKTsKLWludCBsdXN0cmVfbXNnX2J1ZmxlbihzdHJ1Y3QgbHVzdHJlX21zZyAqbSwgaW50IG4pOwotaW50IGx1c3RyZV9tc2dfYnVmY291bnQoc3RydWN0IGx1c3RyZV9tc2cgKm0pOwotY2hhciAqbHVzdHJlX21zZ19zdHJpbmcoc3RydWN0IGx1c3RyZV9tc2cgKm0sIGludCBuLCBpbnQgbWF4X2xlbik7Cit1MzIgbHVzdHJlX21zZ19oZHJfc2l6ZShfX3UzMiBtYWdpYywgdTMyIGNvdW50KTsKK3UzMiBsdXN0cmVfbXNnX3NpemUoX191MzIgbWFnaWMsIGludCBjb3VudCwgX191MzIgKmxlbmd0aHMpOwordTMyIGx1c3RyZV9tc2dfc2l6ZV92MihpbnQgY291bnQsIF9fdTMyICpsZW5ndGhzKTsKK3UzMiBsdXN0cmVfcGFja2VkX21zZ19zaXplKHN0cnVjdCBsdXN0cmVfbXNnICptc2cpOwordTMyIGx1c3RyZV9tc2dfZWFybHlfc2l6ZSh2b2lkKTsKK3ZvaWQgKmx1c3RyZV9tc2dfYnVmX3YyKHN0cnVjdCBsdXN0cmVfbXNnX3YyICptLCB1MzIgbiwgdTMyIG1pbl9zaXplKTsKK3ZvaWQgKmx1c3RyZV9tc2dfYnVmKHN0cnVjdCBsdXN0cmVfbXNnICptLCB1MzIgbiwgdTMyIG1pbmxlbik7Cit1MzIgbHVzdHJlX21zZ19idWZsZW4oc3RydWN0IGx1c3RyZV9tc2cgKm0sIHUzMiBuKTsKK3UzMiBsdXN0cmVfbXNnX2J1ZmNvdW50KHN0cnVjdCBsdXN0cmVfbXNnICptKTsKK2NoYXIgKmx1c3RyZV9tc2dfc3RyaW5nKHN0cnVjdCBsdXN0cmVfbXNnICptLCB1MzIgbiwgdTMyIG1heF9sZW4pOwogX191MzIgbHVzdHJlX21zZ2hkcl9nZXRfZmxhZ3Moc3RydWN0IGx1c3RyZV9tc2cgKm1zZyk7CiB2b2lkIGx1c3RyZV9tc2doZHJfc2V0X2ZsYWdzKHN0cnVjdCBsdXN0cmVfbXNnICptc2csIF9fdTMyIGZsYWdzKTsKIF9fdTMyIGx1c3RyZV9tc2dfZ2V0X2ZsYWdzKHN0cnVjdCBsdXN0cmVfbXNnICptc2cpOwotdm9pZCBsdXN0cmVfbXNnX2FkZF9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBpbnQgZmxhZ3MpOwotdm9pZCBsdXN0cmVfbXNnX3NldF9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBpbnQgZmxhZ3MpOwotdm9pZCBsdXN0cmVfbXNnX2NsZWFyX2ZsYWdzKHN0cnVjdCBsdXN0cmVfbXNnICptc2csIGludCBmbGFncyk7Cit2b2lkIGx1c3RyZV9tc2dfYWRkX2ZsYWdzKHN0cnVjdCBsdXN0cmVfbXNnICptc2csIHUzMiBmbGFncyk7Cit2b2lkIGx1c3RyZV9tc2dfc2V0X2ZsYWdzKHN0cnVjdCBsdXN0cmVfbXNnICptc2csIHUzMiBmbGFncyk7Cit2b2lkIGx1c3RyZV9tc2dfY2xlYXJfZmxhZ3Moc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgdTMyIGZsYWdzKTsKIF9fdTMyIGx1c3RyZV9tc2dfZ2V0X29wX2ZsYWdzKHN0cnVjdCBsdXN0cmVfbXNnICptc2cpOwotdm9pZCBsdXN0cmVfbXNnX2FkZF9vcF9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBpbnQgZmxhZ3MpOwordm9pZCBsdXN0cmVfbXNnX2FkZF9vcF9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCB1MzIgZmxhZ3MpOwogc3RydWN0IGx1c3RyZV9oYW5kbGUgKmx1c3RyZV9tc2dfZ2V0X2hhbmRsZShzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKTsKIF9fdTMyIGx1c3RyZV9tc2dfZ2V0X3R5cGUoc3RydWN0IGx1c3RyZV9tc2cgKm1zZyk7Ci12b2lkIGx1c3RyZV9tc2dfYWRkX3ZlcnNpb24oc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgaW50IHZlcnNpb24pOwordm9pZCBsdXN0cmVfbXNnX2FkZF92ZXJzaW9uKHN0cnVjdCBsdXN0cmVfbXNnICptc2csIHUzMiB2ZXJzaW9uKTsKIF9fdTMyIGx1c3RyZV9tc2dfZ2V0X29wYyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKTsKIF9fdTY0IGx1c3RyZV9tc2dfZ2V0X2xhc3RfY29tbWl0dGVkKHN0cnVjdCBsdXN0cmVfbXNnICptc2cpOwogX191NjQgKmx1c3RyZV9tc2dfZ2V0X3ZlcnNpb25zKHN0cnVjdCBsdXN0cmVfbXNnICptc2cpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfcGFyYW0uaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3BhcmFtLmgKaW5kZXggODJhYWRkMy4uODA2MWEwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfcGFyYW0uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9wYXJhbS5oCkBAIC0zOSw2ICszOSw5IEBACiAjaWZuZGVmIF9MVVNUUkVfUEFSQU1fSAogI2RlZmluZSBfTFVTVFJFX1BBUkFNX0gKIAorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmcy5oIgorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvbGludXgvbG5ldC90eXBlcy5oIgorCiAvKiogXGRlZmdyb3VwIHBhcmFtIHBhcmFtCiAgKgogICogQHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvbHVzdHJlX3BhdGNobGVzc19jb21wYXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3BhdGNobGVzc19jb21wYXQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9sdXN0cmVfcGF0Y2hsZXNzX2NvbXBhdC5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9wYXRjaGxlc3NfY29tcGF0LmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3JlcV9sYXlvdXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3JlcV9sYXlvdXQuaAppbmRleCA1NDRhNDNjLi5hMTM1NThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9yZXFfbGF5b3V0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfcmVxX2xheW91dC5oCkBAIC03Niw3ICs3Niw4IEBACiB2b2lkIHJlcV9jYXBzdWxlX2Zpbmkoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsKTsKIAogdm9pZCByZXFfY2Fwc3VsZV9zZXQoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLCBjb25zdCBzdHJ1Y3QgcmVxX2Zvcm1hdCAqZm10KTsKLWludCByZXFfY2Fwc3VsZV9maWxsZWRfc2l6ZXMoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLCBlbnVtIHJlcV9sb2NhdGlvbiBsb2MpOworc2l6ZV90IHJlcV9jYXBzdWxlX2ZpbGxlZF9zaXplcyhzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCisJCQkJZW51bSByZXFfbG9jYXRpb24gbG9jKTsKIGludCAgcmVxX2NhcHN1bGVfc2VydmVyX3BhY2soc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsKTsKIAogdm9pZCAqcmVxX2NhcHN1bGVfY2xpZW50X2dldChzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCkBAIC04NiwyNyArODcsMjcgQEAKIAkJCQkgIHZvaWQgKnN3YWJiZXIpOwogdm9pZCAqcmVxX2NhcHN1bGVfY2xpZW50X3NpemVkX2dldChzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCiAJCQkJICAgY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKmZpZWxkLAotCQkJCSAgIGludCBsZW4pOworCQkJCSAgIHUzMiBsZW4pOwogdm9pZCAqcmVxX2NhcHN1bGVfc2VydmVyX2dldChzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCByZXFfbXNnX2ZpZWxkICpmaWVsZCk7CiB2b2lkICpyZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwKIAkJCQkgICBjb25zdCBzdHJ1Y3QgcmVxX21zZ19maWVsZCAqZmllbGQsCi0JCQkJICAgaW50IGxlbik7CisJCQkJICAgdTMyIGxlbik7CiB2b2lkICpyZXFfY2Fwc3VsZV9zZXJ2ZXJfc3dhYl9nZXQoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAogCQkJCSAgY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKmZpZWxkLAogCQkJCSAgdm9pZCAqc3dhYmJlcik7CiB2b2lkICpyZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfc3dhYl9nZXQoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAogCQkJCQljb25zdCBzdHJ1Y3QgcmVxX21zZ19maWVsZCAqZmllbGQsCi0JCQkJCWludCBsZW4sIHZvaWQgKnN3YWJiZXIpOworCQkJCQl1MzIgbGVuLCB2b2lkICpzd2FiYmVyKTsKIAogdm9pZCByZXFfY2Fwc3VsZV9zZXRfc2l6ZShzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCiAJCQkgIGNvbnN0IHN0cnVjdCByZXFfbXNnX2ZpZWxkICpmaWVsZCwKLQkJCSAgZW51bSByZXFfbG9jYXRpb24gbG9jLCBpbnQgc2l6ZSk7Ci1pbnQgcmVxX2NhcHN1bGVfZ2V0X3NpemUoY29uc3Qgc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAorCQkJICBlbnVtIHJlcV9sb2NhdGlvbiBsb2MsIHUzMiBzaXplKTsKK3UzMiByZXFfY2Fwc3VsZV9nZXRfc2l6ZShjb25zdCBzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCiAJCQkgY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKmZpZWxkLAogCQkJIGVudW0gcmVxX2xvY2F0aW9uIGxvYyk7Ci1pbnQgcmVxX2NhcHN1bGVfbXNnX3NpemUoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLCBlbnVtIHJlcV9sb2NhdGlvbiBsb2MpOwotaW50IHJlcV9jYXBzdWxlX2ZtdF9zaXplKF9fdTMyIG1hZ2ljLCBjb25zdCBzdHJ1Y3QgcmVxX2Zvcm1hdCAqZm10LAordTMyIHJlcV9jYXBzdWxlX21zZ19zaXplKHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwgZW51bSByZXFfbG9jYXRpb24gbG9jKTsKK3UzMiByZXFfY2Fwc3VsZV9mbXRfc2l6ZShfX3UzMiBtYWdpYywgY29uc3Qgc3RydWN0IHJlcV9mb3JtYXQgKmZtdCwKIAkJCSBlbnVtIHJlcV9sb2NhdGlvbiBsb2MpOwogdm9pZCByZXFfY2Fwc3VsZV9leHRlbmQoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLCBjb25zdCBzdHJ1Y3QgcmVxX2Zvcm1hdCAqZm10KTsKIApAQCAtMTE1LDggKzExNiw3IEBACiAJCQkgIGVudW0gcmVxX2xvY2F0aW9uIGxvYyk7CiB2b2lkIHJlcV9jYXBzdWxlX3NocmluayhzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCiAJCQljb25zdCBzdHJ1Y3QgcmVxX21zZ19maWVsZCAqZmllbGQsCi0JCQl1bnNpZ25lZCBpbnQgbmV3bGVuLAotCQkJZW51bSByZXFfbG9jYXRpb24gbG9jKTsKKwkJCXUzMiBuZXdsZW4sIGVudW0gcmVxX2xvY2F0aW9uIGxvYyk7CiBpbnQgIHJlcV9sYXlvdXRfaW5pdCh2b2lkKTsKIHZvaWQgcmVxX2xheW91dF9maW5pKHZvaWQpOwogCkBAIC0xNDksMTQgKzE0OSwxMSBAQAogZXh0ZXJuIHN0cnVjdCByZXFfZm9ybWF0IFJRRl9NRFNfR0VUQVRUUl9OQU1FOwogZXh0ZXJuIHN0cnVjdCByZXFfZm9ybWF0IFJRRl9NRFNfQ0xPU0U7CiBleHRlcm4gc3RydWN0IHJlcV9mb3JtYXQgUlFGX01EU19SRUxFQVNFX0NMT1NFOwotZXh0ZXJuIHN0cnVjdCByZXFfZm9ybWF0IFJRRl9NRFNfUElOOwotZXh0ZXJuIHN0cnVjdCByZXFfZm9ybWF0IFJRRl9NRFNfVU5QSU47CiBleHRlcm4gc3RydWN0IHJlcV9mb3JtYXQgUlFGX01EU19DT05ORUNUOwogZXh0ZXJuIHN0cnVjdCByZXFfZm9ybWF0IFJRRl9NRFNfRElTQ09OTkVDVDsKIGV4dGVybiBzdHJ1Y3QgcmVxX2Zvcm1hdCBSUUZfTURTX0dFVF9JTkZPOwogZXh0ZXJuIHN0cnVjdCByZXFfZm9ybWF0IFJRRl9NRFNfUkVBRFBBR0U7CiBleHRlcm4gc3RydWN0IHJlcV9mb3JtYXQgUlFGX01EU19XUklURVBBR0U7Ci1leHRlcm4gc3RydWN0IHJlcV9mb3JtYXQgUlFGX01EU19JU19TVUJESVI7CiBleHRlcm4gc3RydWN0IHJlcV9mb3JtYXQgUlFGX01EU19ET05FX1dSSVRJTkc7CiBleHRlcm4gc3RydWN0IHJlcV9mb3JtYXQgUlFGX01EU19SRUlOVDsKIGV4dGVybiBzdHJ1Y3QgcmVxX2Zvcm1hdCBSUUZfTURTX1JFSU5UX0NSRUFURTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3Zlci5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfdmVyLmgKaW5kZXggNjQ1NTlhMS4uMTljOTEzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfdmVyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfdmVyLmgKQEAgLTIsMTQgKzIsMjEgQEAKICNkZWZpbmUgX0xVU1RSRV9WRVJfSF8KIAogI2RlZmluZSBMVVNUUkVfTUFKT1IgMgotI2RlZmluZSBMVVNUUkVfTUlOT1IgNAotI2RlZmluZSBMVVNUUkVfUEFUQ0ggNjAKKyNkZWZpbmUgTFVTVFJFX01JTk9SIDYKKyNkZWZpbmUgTFVTVFJFX1BBVENIIDk5CiAjZGVmaW5lIExVU1RSRV9GSVggMAotI2RlZmluZSBMVVNUUkVfVkVSU0lPTl9TVFJJTkcgIjIuNC42MCIKKyNkZWZpbmUgTFVTVFJFX1ZFUlNJT05fU1RSSU5HICIyLjYuOTkiCiAKLSNkZWZpbmUgTFVTVFJFX1ZFUlNJT05fQ09ERSBPQkRfT0NEX1ZFUlNJT04oTFVTVFJFX01BSk9SLCBcCi0JCQkJCSAgICBMVVNUUkVfTUlOT1IsIExVU1RSRV9QQVRDSCwgXAotCQkJCQkgICAgTFVTVFJFX0ZJWCkKKyNkZWZpbmUgT0JEX09DRF9WRVJTSU9OKG1ham9yLCBtaW5vciwgcGF0Y2gsIGZpeCkJCQlcCisJKCgobWFqb3IpIDw8IDI0KSArICgobWlub3IpIDw8IDE2KSArICgocGF0Y2gpIDw8IDgpICsgKGZpeCkpCisKKyNkZWZpbmUgT0JEX09DRF9WRVJTSU9OX01BSk9SKHZlcnNpb24pCSgoaW50KSgodmVyc2lvbikgPj4gMjQpICYgMjU1KQorI2RlZmluZSBPQkRfT0NEX1ZFUlNJT05fTUlOT1IodmVyc2lvbikJKChpbnQpKCh2ZXJzaW9uKSA+PiAxNikgJiAyNTUpCisjZGVmaW5lIE9CRF9PQ0RfVkVSU0lPTl9QQVRDSCh2ZXJzaW9uKQkoKGludCkoKHZlcnNpb24pID4+ICA4KSAmIDI1NSkKKyNkZWZpbmUgT0JEX09DRF9WRVJTSU9OX0ZJWCh2ZXJzaW9uKQkoKGludCkoKHZlcnNpb24pID4+ICAwKSAmIDI1NSkKKworI2RlZmluZSBMVVNUUkVfVkVSU0lPTl9DT0RFCQkJCQkJXAorCU9CRF9PQ0RfVkVSU0lPTihMVVNUUkVfTUFKT1IsIExVU1RSRV9NSU5PUiwgTFVTVFJFX1BBVENILCBMVVNUUkVfRklYKQogCiAvKgogICogSWYgbHVzdHJlIHZlcnNpb24gb2YgY2xpZW50IGFuZCBzZXJ2ZXJzIGl0IGNvbm5lY3RzIHRvIGRpZmZlcnMgYnkgbW9yZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkLmgKaW5kZXggYTFiYzJjNC4uZjZmYzRkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZC5oCkBAIC0zNSwyMSArMzUsMTMgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKLSNkZWZpbmUgSU9DX09TQ19UWVBFCSAnaCcKLSNkZWZpbmUgSU9DX09TQ19NSU5fTlIgICAgICAgMjAKLSNkZWZpbmUgSU9DX09TQ19TRVRfQUNUSVZFICAgX0lPV1IoSU9DX09TQ19UWVBFLCAyMSwgc3RydWN0IG9iZF9kZXZpY2UgKikKLSNkZWZpbmUgSU9DX09TQ19NQVhfTlIgICAgICAgNTAKLQotI2RlZmluZSBJT0NfTURDX1RZUEUJICdpJwotI2RlZmluZSBJT0NfTURDX01JTl9OUiAgICAgICAyMAotI2RlZmluZSBJT0NfTURDX01BWF9OUiAgICAgICA1MAotCiAjaW5jbHVkZSAibHVzdHJlL2x1c3RyZV9pZGwuaCIKICNpbmNsdWRlICJsdXN0cmVfbGliLmgiCiAjaW5jbHVkZSAibHVfcmVmLmgiCiAjaW5jbHVkZSAibHVzdHJlX2V4cG9ydC5oIgogI2luY2x1ZGUgImx1c3RyZV9maWQuaCIKICNpbmNsdWRlICJsdXN0cmVfZmxkLmgiCisjaW5jbHVkZSAibHVzdHJlX2hhbmRsZXMuaCIKICNpbmNsdWRlICJsdXN0cmVfaW50ZW50LmgiCiAKICNkZWZpbmUgTUFYX09CRF9ERVZJQ0VTIDgxOTIKQEAgLTgxLDYgKzczLDEzIEBACiB7CiB9CiAKKy8qCisgKiBJZiB3ZSBhcmUgdW5hYmxlIHRvIGdldCB0aGUgbWF4aW11bSBvYmplY3Qgc2l6ZSBmcm9tIHRoZSBPU1QgaW4KKyAqIG9jZF9tYXhieXRlcyB1c2luZyBPQkRfQ09OTkVDVF9NQVhCWVRFUywgdGhlbiB3ZSBmYWxsIGJhY2sgdG8gdXNpbmcKKyAqIHRoZSBvbGQgbWF4aW11bSBvYmplY3Qgc2l6ZSBmcm9tIGV4dDMuCisgKi8KKyNkZWZpbmUgTFVTVFJFX0VYVDNfU1RSSVBFX01BWEJZVEVTIDB4MWZmZmZmZmYwMDBVTEwKKwogc3RydWN0IGxvdl9zdHJpcGVfbWQgewogCWF0b21pY190ICAgICBsc21fcmVmYzsKIAlzcGlubG9ja190CWxzbV9sb2NrOwpAQCAtODksMzEgKzg4LDE3IEBACiAJLyogbWF4aW11bSBwb3NzaWJsZSBmaWxlIHNpemUsIG1pZ2h0IGNoYW5nZSBhcyBPU1RzIHN0YXR1cyBjaGFuZ2VzLAogCSAqIGUuZy4gZGlzY29ubmVjdGVkLCBkZWFjdGl2YXRlZAogCSAqLwotCV9fdTY0CSAgICBsc21fbWF4Ynl0ZXM7Ci0Jc3RydWN0IHsKLQkJLyogUHVibGljIG1lbWJlcnMuICovCi0JCXN0cnVjdCBvc3RfaWQgbHdfb2JqZWN0X29pOyAvKiBsb3Ygb2JqZWN0IGlkL3NlcSAqLwotCi0JCS8qIExPVi1wcml2YXRlIG1lbWJlcnMgc3RhcnQgaGVyZSAtLSBvbmx5IGZvciB1c2UgaW4gbG92Ly4gKi8KLQkJX191MzIgbHdfbWFnaWM7Ci0JCV9fdTMyIGx3X3N0cmlwZV9zaXplOyAgICAgIC8qIHNpemUgb2YgdGhlIHN0cmlwZSAqLwotCQlfX3UzMiBsd19wYXR0ZXJuOwkgIC8qIHN0cmlwaW5nIHBhdHRlcm4gKFJBSUQwLCBSQUlEMSkgKi8KLQkJX191MTYgbHdfc3RyaXBlX2NvdW50OyAgLyogbnVtYmVyIG9mIG9iamVjdHMgYmVpbmcgc3RyaXBlZCBvdmVyICovCi0JCV9fdTE2IGx3X2xheW91dF9nZW47ICAgICAgIC8qIGdlbmVyYXRpb24gb2YgdGhlIGxheW91dCAqLwotCQljaGFyICBsd19wb29sX25hbWVbTE9WX01BWFBPT0xOQU1FXTsgLyogcG9vbCBuYW1lICovCi0JfSBsc21fd2lyZTsKLQorCV9fdTY0CQlsc21fbWF4Ynl0ZXM7CisJc3RydWN0IG9zdF9pZAlsc21fb2k7CisJX191MzIJCWxzbV9tYWdpYzsKKwlfX3UzMgkJbHNtX3N0cmlwZV9zaXplOworCV9fdTMyCQlsc21fcGF0dGVybjsJLyogc3RyaXBpbmcgcGF0dGVybiAoUkFJRDAsIFJBSUQxKSAqLworCV9fdTE2CQlsc21fc3RyaXBlX2NvdW50OworCV9fdTE2CQlsc21fbGF5b3V0X2dlbjsKKwljaGFyCQlsc21fcG9vbF9uYW1lW0xPVl9NQVhQT09MTkFNRSArIDFdOwogCXN0cnVjdCBsb3Zfb2luZm8gKmxzbV9vaW5mb1swXTsKIH07CiAKLSNkZWZpbmUgbHNtX29pCQkgbHNtX3dpcmUubHdfb2JqZWN0X29pCi0jZGVmaW5lIGxzbV9tYWdpYwlsc21fd2lyZS5sd19tYWdpYwotI2RlZmluZSBsc21fbGF5b3V0X2dlbiAgIGxzbV93aXJlLmx3X2xheW91dF9nZW4KLSNkZWZpbmUgbHNtX3N0cmlwZV9zaXplICBsc21fd2lyZS5sd19zdHJpcGVfc2l6ZQotI2RlZmluZSBsc21fcGF0dGVybiAgICAgIGxzbV93aXJlLmx3X3BhdHRlcm4KLSNkZWZpbmUgbHNtX3N0cmlwZV9jb3VudCBsc21fd2lyZS5sd19zdHJpcGVfY291bnQKLSNkZWZpbmUgbHNtX3Bvb2xfbmFtZSAgICBsc21fd2lyZS5sd19wb29sX25hbWUKLQogc3RhdGljIGlubGluZSBib29sIGxzbV9pc19yZWxlYXNlZChzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQogewogCXJldHVybiAhIShsc20tPmxzbV9wYXR0ZXJuICYgTE9WX1BBVFRFUk5fRl9SRUxFQVNFRCk7CkBAIC0xNzcsMzEgKzE2MiwxMCBAQAogc3RydWN0IGJyd19wYWdlIHsKIAl1NjQgb2ZmOwogCXN0cnVjdCBwYWdlICpwZzsKLQlpbnQgY291bnQ7CisJdW5zaWduZWQgaW50IGNvdW50OwogCXUzMiBmbGFnOwogfTsKIAotLyogbGxvZyBjb250ZXh0cyAqLwotZW51bSBsbG9nX2N0eHRfaWQgewotCUxMT0dfQ09ORklHX09SSUdfQ1RYVCAgPSAgMCwKLQlMTE9HX0NPTkZJR19SRVBMX0NUWFQsCi0JTExPR19NRFNfT1NUX09SSUdfQ1RYVCwKLQlMTE9HX01EU19PU1RfUkVQTF9DVFhULAotCUxMT0dfU0laRV9PUklHX0NUWFQsCi0JTExPR19TSVpFX1JFUExfQ1RYVCwKLQlMTE9HX1JEMV9PUklHX0NUWFQsCi0JTExPR19SRDFfUkVQTF9DVFhULAotCUxMT0dfVEVTVF9PUklHX0NUWFQsCi0JTExPR19URVNUX1JFUExfQ1RYVCwKLQlMTE9HX0xPVkVBX09SSUdfQ1RYVCwKLQlMTE9HX0xPVkVBX1JFUExfQ1RYVCwKLQlMTE9HX0NIQU5HRUxPR19PUklHX0NUWFQsCS8qKjwgY2hhbmdlbG9nIGdlbmVyYXRpb24gb24gbWRkICovCi0JTExPR19DSEFOR0VMT0dfUkVQTF9DVFhULAkvKio8IGNoYW5nZWxvZyBhY2Nlc3Mgb24gY2xpZW50cyAqLwotCUxMT0dfQ0hBTkdFTE9HX1VTRVJfT1JJR19DVFhULAkvKio8IGZvciBtdWx0aXBsZSBjaGFuZ2Vsb2cgY29uc3VtZXJzICovCi0JTExPR19BR0VOVF9PUklHX0NUWFQsCQkvKio8IGFnZW50IHJlcXVlc3RzIGdlbmVyYXRpb24gb24gY2R0ICovCi0JTExPR19NQVhfQ1RYVFMKLX07Ci0KIHN0cnVjdCB0aW1lb3V0X2l0ZW0gewogCWVudW0gdGltZW91dF9ldmVudCB0aV9ldmVudDsKIAl1bnNpZ25lZCBsb25nCSB0aV90aW1lb3V0OwpAQCAtMjExLDExICsxNzUsMTIgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCSB0aV9jaGFpbjsKIH07CiAKLSNkZWZpbmUgT1NDX01BWF9SSUZfREVGQVVMVCAgICAgICA4Ci0jZGVmaW5lIE9TQ19NQVhfUklGX01BWAkgMjU2Ci0jZGVmaW5lIE9TQ19NQVhfRElSVFlfREVGQVVMVCAgKE9TQ19NQVhfUklGX0RFRkFVTFQgKiA0KQotI2RlZmluZSBPU0NfTUFYX0RJUlRZX01CX01BWCAgIDIwNDggICAgIC8qIGFyYml0cmFyeSwgYnV0IDwgTUFYX0xPTkcgYnl0ZXMgKi8KLSNkZWZpbmUgT1NDX0RFRkFVTFRfUkVTRU5EUyAgICAgIDEwCisjZGVmaW5lIE9CRF9NQVhfUklGX0RFRkFVTFQJOAorI2RlZmluZSBPQkRfTUFYX1JJRl9NQVgJCTUxMgorI2RlZmluZSBPU0NfTUFYX1JJRl9NQVgJCTI1NgorI2RlZmluZSBPU0NfTUFYX0RJUlRZX0RFRkFVTFQJKE9CRF9NQVhfUklGX0RFRkFVTFQgKiA0KQorI2RlZmluZSBPU0NfTUFYX0RJUlRZX01CX01BWAkyMDQ4CS8qIGFyYml0cmFyeSwgYnV0IDwgTUFYX0xPTkcgYnl0ZXMgKi8KKyNkZWZpbmUgT1NDX0RFRkFVTFRfUkVTRU5EUwkxMAogCiAvKiBwb3NzaWJsZSB2YWx1ZXMgZm9yIGZvX3N5bmNfbG9ja19jYW5jZWwgKi8KIGVudW0gewpAQCAtMjI1LDQwICsxOTAsNzQgQEAKIAlOVU1fU1lOQ19PTl9DQU5DRUxfU1RBVEVTCiB9OwogCi0jZGVmaW5lIE1EQ19NQVhfUklGX0RFRkFVTFQgICAgICAgOAotI2RlZmluZSBNRENfTUFYX1JJRl9NQVgJIDUxMgotCiBlbnVtIG9iZF9jbF9zZW1fbG9ja19jbGFzcyB7CiAJT0JEX0NMSV9TRU1fTk9STUFMLAogCU9CRF9DTElfU0VNX01HQywKIAlPQkRfQ0xJX1NFTV9NRENPU0MsCiB9OwogCisvKgorICogTGltaXQgcmVwbHkgYnVmZmVyIHNpemUgZm9yIHN0cmlwaW5nIGRhdGEgdG8gb25lIHg4Nl82NCBwYWdlLiBUaGlzCisgKiB2YWx1ZSBpcyBjaG9zZW4gdG8gZml0IHRoZSBzdHJpcGluZyBkYXRhIGZvciBjb21tb24gdXNlIGNhc2VzIHdoaWxlCisgKiBzdGF5aW5nIHdlbGwgYmVsb3cgdGhlIGxpbWl0IGF0IHdoaWNoIHRoZSBidWZmZXIgbXVzdCBiZSBiYWNrZWQgYnkKKyAqIHZtYWxsb2MoKS4gRXhjZXNzaXZlIHVzZSBvZiB2bWFsbG9jKCkgbWF5IGNhdXNlIHNwaW5sb2NrIGNvbnRlbnRpb24KKyAqIG9uIHRoZSBNRFMuCisgKi8KKyNkZWZpbmUgT0JEX01BWF9ERUZBVUxUX0VBX1NJWkUJCTQwOTYKKyNkZWZpbmUgT0JEX01BWF9ERUZBVUxUX0NPT0tJRV9TSVpFCTQwOTYKKwogc3RydWN0IG1kY19ycGNfbG9jazsKIHN0cnVjdCBvYmRfaW1wb3J0Owogc3RydWN0IGNsaWVudF9vYmQgewogCXN0cnVjdCByd19zZW1hcGhvcmUgIGNsX3NlbTsKIAlzdHJ1Y3Qgb2JkX3V1aWQJICBjbF90YXJnZXRfdXVpZDsKIAlzdHJ1Y3Qgb2JkX2ltcG9ydCAgICAgICAqY2xfaW1wb3J0OyAvKiBwdGxycGMgY29ubmVjdGlvbiBzdGF0ZSAqLwotCWludAkJICAgICAgY2xfY29ubl9jb3VudDsKLQkvKiBtYXhfbWRzX2Vhc2l6ZSBpcyBwdXJlbHkgYSBwZXJmb3JtYW5jZSB0aGluZyBzbyB3ZSBkb24ndCBoYXZlIHRvCi0JICogY2FsbCBvYmRfc2l6ZV9kaXNrbWQoKSBhbGwgdGhlIHRpbWUuCisJc2l6ZV90CQkJIGNsX2Nvbm5fY291bnQ7CisJLyoKKwkgKiBDYWNoZSBtYXhpbXVtIGFuZCBkZWZhdWx0IHZhbHVlcyBmb3IgZWFzaXplIGFuZCBjb29raWVzaXplLiBUaGlzIGlzCisJICogc3RyaWN0bHkgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdG8gbWluaW1pemUgY2FsbHMgdG8KKwkgKiBvYmRfc2l6ZV9kaXNrbWQoKS4gVGhlIGRlZmF1bHQgdmFsdWVzIGFyZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUKKwkgKiBpbml0aWFsIHNpemUgb2YgYSByZXF1ZXN0IGJ1ZmZlci4gVGhlIHB0bHJwYyBsYXllciB3aWxsIHJlc2l6ZSB0aGUKKwkgKiBidWZmZXIgYXMgbmVlZGVkIHRvIGFjY29tbW9kYXRlIGEgbGFyZ2VyIHJlcGx5IGZyb20gdGhlCisJICogc2VydmVyLiBUaGUgZGVmYXVsdCB2YWx1ZXMgc2hvdWxkIGJlIHNtYWxsIGVub3VnaCB0byBhdm9pZCB3YXN0ZWQKKwkgKiBtZW1vcnkgYW5kIGV4Y2Vzc2l2ZSB1c2Ugb2Ygdm1hbGxvYygpLCB5ZXQgbGFyZ2UgZW5vdWdoIHRvIGF2b2lkCisJICogcmVhbGxvY2F0aW5nIHRoZSBidWZmZXIgaW4gdGhlIGNvbW1vbiB1c2UgY2FzZS4KIAkgKi8KLQlpbnQJCQkgY2xfZGVmYXVsdF9tZHNfZWFzaXplOwotCWludAkJCSBjbF9tYXhfbWRzX2Vhc2l6ZTsKLQlpbnQJCQkgY2xfZGVmYXVsdF9tZHNfY29va2llc2l6ZTsKLQlpbnQJCQkgY2xfbWF4X21kc19jb29raWVzaXplOworCS8qCisJICogRGVmYXVsdCBFQSBzaXplIGZvciBzdHJpcGluZyBhdHRyaWJ1dGVzLiBJdCBpcyBpbml0aWFsaXplZCBhdAorCSAqIG1vdW50LXRpbWUgYmFzZWQgb24gdGhlIGRlZmF1bHQgc3RyaXBlIHdpZHRoIG9mIHRoZSBmaWxlc3lzdGVtLAorCSAqIHRoZW4gaXQgdHJhY2tzIHRoZSBsYXJnZXN0IG9ic2VydmVkIEVBIHNpemUgYWR2ZXJ0aXNlZCBieQorCSAqIHRoZSBNRFQsIHVwIHRvIGEgbWF4aW11bSB2YWx1ZSBvZiBPQkRfTUFYX0RFRkFVTFRfRUFfU0laRS4KKwkgKi8KKwl1MzIJCQkgY2xfZGVmYXVsdF9tZHNfZWFzaXplOworCS8qIE1heGltdW0gcG9zc2libGUgRUEgc2l6ZSBjb21wdXRlZCBhdCBtb3VudC10aW1lIGJhc2VkIG9uCisJICogdGhlIG51bWJlciBvZiBPU1RzIGluIHRoZSBmaWxlc3lzdGVtLiBNYXkgYmUgaW5jcmVhc2VkIGF0CisJICogcnVuLXRpbWUgaWYgYSBsYXJnZXIgb2JzZXJ2ZWQgc2l6ZSBpcyBhZHZlcnRpc2VkIGJ5IHRoZSBNRFQuCisJICovCisJdTMyCQkJIGNsX21heF9tZHNfZWFzaXplOworCS8qIERlZmF1bHQgY29va2llIHNpemUgZm9yIGxsb2cgY29va2llcyAoc2VlIHN0cnVjdCBsbG9nX2Nvb2tpZSkuIEl0IGlzCisJICogaW5pdGlhbGl6ZWQgdG8gemVybyBhdCBtb3VudC10aW1lLCB0aGVuIGl0IHRyYWNrcyB0aGUgbGFyZ2VzdAorCSAqIG9ic2VydmVkIGNvb2tpZSBzaXplIGFkdmVydGlzZWQgYnkgdGhlIE1EVCwgdXAgdG8gYSBtYXhpbXVtIHZhbHVlIG9mCisJICogT0JEX01BWF9ERUZBVUxUX0NPT0tJRV9TSVpFLiBOb3RlIHRoYXQgbGxvZ19jb29raWVzIGFyZSBub3QKKwkgKiB1c2VkIGJ5IGNsaWVudHMgY29tbXVuaWNhdGluZyB3aXRoIE1EUyB2ZXJzaW9ucyAyLjQuMCBhbmQgbGF0ZXIuCisJICovCisJdTMyCQkJIGNsX2RlZmF1bHRfbWRzX2Nvb2tpZXNpemU7CisJLyogTWF4aW11bSBwb3NzaWJsZSBjb29raWUgc2l6ZSBjb21wdXRlZCBhdCBtb3VudC10aW1lIGJhc2VkIG9uCisJICogdGhlIG51bWJlciBvZiBPU1RzIGluIHRoZSBmaWxlc3lzdGVtLiBNYXkgYmUgaW5jcmVhc2VkIGF0CisJICogcnVuLXRpbWUgaWYgYSBsYXJnZXIgb2JzZXJ2ZWQgc2l6ZSBpcyBhZHZlcnRpc2VkIGJ5IHRoZSBNRFQuCisJICovCisJdTMyCQkJIGNsX21heF9tZHNfY29va2llc2l6ZTsKIAogCWVudW0gbHVzdHJlX3NlY19wYXJ0ICAgICBjbF9zcF9tZTsKIAllbnVtIGx1c3RyZV9zZWNfcGFydCAgICAgY2xfc3BfdG87CiAJc3RydWN0IHNwdGxycGNfZmxhdm9yICAgIGNsX2ZsdnJfbWdjOyAgIC8qIGZpeGVkIGZsYXZvciBvZiBtZ2MtPm1ncyAqLwogCiAJLyogdGhlIGdyYW50IHZhbHVlcyBhcmUgcHJvdGVjdGVkIGJ5IGxvaV9saXN0X2xvY2sgYmVsb3cgKi8KLQlsb25nCQkgICAgIGNsX2RpcnR5OwkgLyogYWxsIF9kaXJ0eV8gaW4gYnl0ZXMgKi8KLQlsb25nCQkgICAgIGNsX2RpcnR5X21heDsgICAgIC8qIGFsbG93ZWQgdy9vIHJwYyAqLwotCWxvbmcJCSAgICAgY2xfZGlydHlfdHJhbnNpdDsgLyogZGlydHkgc3luY2hyb25vdXMgKi8KLQlsb25nCQkgICAgIGNsX2F2YWlsX2dyYW50OyAgIC8qIGJ5dGVzIG9mIGNyZWRpdCBmb3Igb3N0ICovCi0JbG9uZwkJICAgICBjbF9sb3N0X2dyYW50OyAgICAvKiBsb3N0IGNyZWRpdHMgKHRydW5jKSAqLworCXVuc2lnbmVkIGxvbmcJCSBjbF9kaXJ0eV9wYWdlczsJLyogYWxsIF9kaXJ0eV8gaW4gcGFoZ2VzICovCisJdW5zaWduZWQgbG9uZwkJIGNsX2RpcnR5X21heF9wYWdlczsJLyogYWxsb3dlZCB3L28gcnBjICovCisJdW5zaWduZWQgbG9uZwkJIGNsX2RpcnR5X3RyYW5zaXQ7CS8qIGRpcnR5IHN5bmNocm9ub3VzICovCisJdW5zaWduZWQgbG9uZwkJIGNsX2F2YWlsX2dyYW50OwkvKiBieXRlcyBvZiBjcmVkaXQgZm9yIG9zdCAqLworCXVuc2lnbmVkIGxvbmcJCSBjbF9sb3N0X2dyYW50OwkJLyogbG9zdCBjcmVkaXRzICh0cnVuYykgKi8KIAogCS8qIHNpbmNlIHdlIGFsbG9jYXRlIGdyYW50IGJ5IGJsb2Nrcywgd2UgZG9uJ3Qga25vdyBob3cgbWFueSBncmFudCB3aWxsCiAJICogYmUgdXNlZCB0byBhZGQgYSBwYWdlIGludG8gY2FjaGUuIEFzIGEgc29sdXRpb24sIHdlIHJlc2VydmUgbWF4aW11bQpAQCAtMjc1LDggKzI3NCw3IEBACiAJICogdGhlIGV4dGVudCBzaXplLiBBIGNodW5rIGlzIG1heChQQUdFX1NJWkUsIE9TVCBibG9jayBzaXplKQogCSAqLwogCWludAkJICBjbF9jaHVua2JpdHM7Ci0JaW50CQkgIGNsX2NodW5rOwotCWludAkJICBjbF9leHRlbnRfdGF4OyAvKiBleHRlbnQgb3ZlcmhlYWQsIGJ5IGJ5dGVzICovCisJdW5zaWduZWQgaW50CSAgY2xfZXh0ZW50X3RheDsgLyogZXh0ZW50IG92ZXJoZWFkLCBieSBieXRlcyAqLwogCiAJLyoga2VlcCB0cmFjayBvZiBvYmplY3RzIHRoYXQgaGF2ZSBsb2lzIHRoYXQgY29udGFpbiBwYWdlcyB3aGljaAogCSAqIGhhdmUgYmVlbiBxdWV1ZWQgZm9yIGFzeW5jIGJydy4gIHRoaXMgbG9jayBhbHNvIHByb3RlY3RzIHRoZQpAQCAtMzAxLDEzICsyOTksMTMgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgICBjbF9sb2lfaHBfcmVhZHlfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgICBjbF9sb2lfd3JpdGVfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgICBjbF9sb2lfcmVhZF9saXN0OwotCWludAkJICAgICAgY2xfcl9pbl9mbGlnaHQ7Ci0JaW50CQkgICAgICBjbF93X2luX2ZsaWdodDsKKwlfX3UzMgkJCSBjbF9yX2luX2ZsaWdodDsKKwlfX3UzMgkJCSBjbF93X2luX2ZsaWdodDsKIAkvKiBqdXN0IGEgc3VtIG9mIHRoZSBsb2kvbG9wIHBlbmRpbmcgbnVtYmVycyB0byBiZSBleHBvcnRlZCBieSBzeXNmcyAqLwogCWF0b21pY190CSAgICAgY2xfcGVuZGluZ193X3BhZ2VzOwogCWF0b21pY190CSAgICAgY2xfcGVuZGluZ19yX3BhZ2VzOwogCV9fdTMyCQkJIGNsX21heF9wYWdlc19wZXJfcnBjOwotCWludAkJICAgICAgY2xfbWF4X3JwY3NfaW5fZmxpZ2h0OworCV9fdTMyCQkJIGNsX21heF9ycGNzX2luX2ZsaWdodDsKIAlzdHJ1Y3Qgb2JkX2hpc3RvZ3JhbSAgICAgY2xfcmVhZF9ycGNfaGlzdDsKIAlzdHJ1Y3Qgb2JkX2hpc3RvZ3JhbSAgICAgY2xfd3JpdGVfcnBjX2hpc3Q7CiAJc3RydWN0IG9iZF9oaXN0b2dyYW0gICAgIGNsX3JlYWRfcGFnZV9oaXN0OwpAQCAtMzE4LDEzICszMTYsMTMgQEAKIAkvKiBscnUgZm9yIG9zYyBjYWNoaW5nIHBhZ2VzICovCiAJc3RydWN0IGNsX2NsaWVudF9jYWNoZQkqY2xfY2FjaGU7CiAJc3RydWN0IGxpc3RfaGVhZAkgY2xfbHJ1X29zYzsgLyogbWVtYmVyIG9mIGNsX2NhY2hlLT5jY2NfbHJ1ICovCi0JYXRvbWljX3QJCSpjbF9scnVfbGVmdDsKLQlhdG9taWNfdAkJIGNsX2xydV9idXN5OworCWF0b21pY19sb25nX3QJCSpjbF9scnVfbGVmdDsKKwlhdG9taWNfbG9uZ190CQkgY2xfbHJ1X2J1c3k7CisJYXRvbWljX2xvbmdfdAkJIGNsX2xydV9pbl9saXN0OwogCWF0b21pY190CQkgY2xfbHJ1X3Nocmlua2VyczsKLQlhdG9taWNfdAkJIGNsX2xydV9pbl9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQJIGNsX2xydV9saXN0OyAvKiBscnUgcGFnZSBsaXN0ICovCiAJc3BpbmxvY2tfdAkJIGNsX2xydV9saXN0X2xvY2s7IC8qIHBhZ2UgbGlzdCBwcm90ZWN0b3IgKi8KLQlhdG9taWNfdAkJIGNsX3Vuc3RhYmxlX2NvdW50OworCWF0b21pY19sb25nX3QJCSBjbF91bnN0YWJsZV9jb3VudDsKIAogCS8qIG51bWJlciBvZiBpbiBmbGlnaHQgZGVzdHJveSBycGNzIGlzIGxpbWl0ZWQgdG8gbWF4X3JwY3NfaW5fZmxpZ2h0ICovCiAJYXRvbWljX3QJICAgICBjbF9kZXN0cm95X2luX2ZsaWdodDsKQEAgLTM1MCw3ICszNDgsNyBAQAogCS8qIHVzZWQgYnkgcXVvdGFjaGVjayB3aGVuIHRoZSBzZXJ2ZXJzIGFyZSBvbGRlciB0aGFuIDIuNCAqLwogCWludAkJICAgICAgY2xfcWNoa19zdGF0OyAvKiBxdW90YWNoZWNrIHN0YXQgb2YgdGhlIHBlZXIgKi8KICNkZWZpbmUgQ0xfTk9UX1FVT1RBQ0hFQ0tFRCAxICAgLyogY2xpZW50LT5jbF9xY2hrX3N0YXQgaW5pdCB2YWx1ZSAqLwotI2lmIExVU1RSRV9WRVJTSU9OX0NPREUgPj0gT0JEX09DRF9WRVJTSU9OKDIsIDcsIDUwLCAwKQorI2lmIE9CRF9PQ0RfVkVSU0lPTigyLCA3LCA1MywgMCkgPCBMVVNUUkVfVkVSU0lPTl9DT0RFCiAjd2FybmluZyAicGxlYXNlIGNvbnNpZGVyIHJlbW92aW5nIHF1b3RhY2hlY2sgY29tcGF0aWJpbGl0eSBjb2RlIgogI2VuZGlmCiAKQEAgLTQzMSw3ICs0MjksNyBAQAogc3RydWN0IGxtdl90Z3RfZGVzYyB7CiAJc3RydWN0IG9iZF91dWlkCQlsdGRfdXVpZDsKIAlzdHJ1Y3Qgb2JkX2V4cG9ydAkqbHRkX2V4cDsKLQlpbnQJCQlsdGRfaWR4OworCXUzMgkJCWx0ZF9pZHg7CiAJc3RydWN0IG11dGV4CQlsdGRfZmlkX211dGV4OwogCXVuc2lnbmVkIGxvbmcJCWx0ZF9hY3RpdmU6MTsgLyogdGFyZ2V0IHVwIGZvciByZXF1ZXN0cyAqLwogfTsKQEAgLTQ1OCw5ICs0NTYsOCBAQAogCWludAkJCW1heF9kZWZfZWFzaXplOwogCWludAkJCW1heF9jb29raWVzaXplOwogCWludAkJCW1heF9kZWZfY29va2llc2l6ZTsKLQlpbnQJCQlzZXJ2ZXJfdGltZW91dDsKIAotCWludAkJCXRndHNfc2l6ZTsgLyogc2l6ZSBvZiB0Z3RzIGFycmF5ICovCisJdTMyCQkJdGd0c19zaXplOyAvKiBzaXplIG9mIHRndHMgYXJyYXkgKi8KIAlzdHJ1Y3QgbG12X3RndF9kZXNjCSoqdGd0czsKIAogCXN0cnVjdCBvYmRfY29ubmVjdF9kYXRhCWNvbm5fZGF0YTsKQEAgLTQ3MCwxMiArNDY3LDExIEBACiBzdHJ1Y3QgbmlvYnVmX2xvY2FsIHsKIAlfX3U2NAkJbG5iX2ZpbGVfb2Zmc2V0OwogCV9fdTMyCQlsbmJfcGFnZV9vZmZzZXQ7Ci0JX191MzIJCWxlbjsKLQlfX3UzMgkJZmxhZ3M7Ci0Jc3RydWN0IHBhZ2UJKnBhZ2U7Ci0Jc3RydWN0IGRlbnRyeQkqZGVudHJ5OwotCWludAkJbG5iX2dyYW50X3VzZWQ7Ci0JaW50CQlyYzsKKwlfX3UzMgkJbG5iX2xlbjsKKwlfX3UzMgkJbG5iX2ZsYWdzOworCXN0cnVjdCBwYWdlCSpsbmJfcGFnZTsKKwl2b2lkCQkqbG5iX2RhdGE7CisJaW50CQlsbmJfcmM7CiB9OwogCiAjZGVmaW5lIExVU1RSRV9GTERfTkFNRQkgImZsZCIKQEAgLTUxNyw3ICs1MTMsNiBAQAogI2RlZmluZSBOX0xPQ0FMX1RFTVBfUEFHRSAweDEwMDAwMDAwCiAKIHN0cnVjdCBvYmRfdHJhbnNfaW5mbyB7Ci0JX191NjQJCSAgICBvdGlfdHJhbnNubzsKIAlfX3U2NAkJICAgIG90aV94aWQ7CiAJLyogT25seSB1c2VkIG9uIHRoZSBzZXJ2ZXIgc2lkZSBmb3IgdHJhY2tpbmcgYWNrcy4gKi8KIAlzdHJ1Y3Qgb3RpX3JlcV9hY2tfbG9jayB7CkBAIC01MjcsNTAgKzUyMiwxMSBAQAogCXZvaWQJCSAgICAqb3RpX2hhbmRsZTsKIAlzdHJ1Y3QgbGxvZ19jb29raWUgICAgICAgb3RpX29uZWNvb2tpZTsKIAlzdHJ1Y3QgbGxvZ19jb29raWUgICAgICAqb3RpX2xvZ2Nvb2tpZXM7Ci0JaW50CQkgICAgICBvdGlfbnVtY29va2llczsKLQkvKiogc3luY2hyb25vdXMgd3JpdGUgaXMgbmVlZGVkICovCi0JdW5zaWduZWQgbG9uZwkJIG90aV9zeW5jX3dyaXRlOjE7CiAKLQkvKiBpbml0aWFsIHRocmVhZCBoYW5kbGluZyB0cmFuc2FjdGlvbiAqLwotCXN0cnVjdCBwdGxycGNfdGhyZWFkICpvdGlfdGhyZWFkOwotCV9fdTMyCQkgICAgb3RpX2Nvbm5fY250OwogCS8qKiBWQlI6IHZlcnNpb25zICovCiAJX191NjQJCSAgICBvdGlfcHJlX3ZlcnNpb247Ci0JLyoqIEpvYklEICovCi0JY2hhcgkJICAgICpvdGlfam9iaWQ7Ci0KLQlzdHJ1Y3Qgb2JkX3V1aWQJICpvdGlfb3N0X3V1aWQ7CiB9OwogCi1zdGF0aWMgaW5saW5lIHZvaWQgb3RpX2FsbG9jX2Nvb2tpZXMoc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGksCi0JCQkJICAgICBpbnQgbnVtX2Nvb2tpZXMpCi17Ci0JaWYgKCFvdGkpCi0JCXJldHVybjsKLQotCWlmIChudW1fY29va2llcyA9PSAxKQotCQlvdGktPm90aV9sb2djb29raWVzID0gJm90aS0+b3RpX29uZWNvb2tpZTsKLQllbHNlCi0JCW90aS0+b3RpX2xvZ2Nvb2tpZXMgPSBsaWJjZnNfa3Z6YWxsb2MobnVtX2Nvb2tpZXMgKiBzaXplb2Yob3RpLT5vdGlfb25lY29va2llKSwKLQkJCQkJCSAgICAgIEdGUF9OT0ZTKTsKLQotCW90aS0+b3RpX251bWNvb2tpZXMgPSBudW1fY29va2llczsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG90aV9mcmVlX2Nvb2tpZXMoc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGkpCi17Ci0JaWYgKCFvdGkgfHwgIW90aS0+b3RpX2xvZ2Nvb2tpZXMpCi0JCXJldHVybjsKLQotCWlmIChvdGktPm90aV9sb2djb29raWVzID09ICZvdGktPm90aV9vbmVjb29raWUpCi0JCUxBU1NFUlQob3RpLT5vdGlfbnVtY29va2llcyA9PSAxKTsKLQllbHNlCi0JCWt2ZnJlZShvdGktPm90aV9sb2djb29raWVzKTsKLQotCW90aS0+b3RpX2xvZ2Nvb2tpZXMgPSBOVUxMOwotCW90aS0+b3RpX251bWNvb2tpZXMgPSAwOwotfQotCiAvKgogICogRXZlbnRzIHNpZ25hbGxlZCB0aHJvdWdoIG9iZF9ub3RpZnkoKSB1cGNhbGwtY2hhaW4uCiAgKi8KQEAgLTYxNiw3ICs1NzIsNiBAQAogfTsKIAogc3RydWN0IG9iZF9sbG9nX2dyb3VwIHsKLQlpbnQJCW9sZ19zZXE7CiAJc3RydWN0IGxsb2dfY3R4dCAgKm9sZ19jdHh0c1tMTE9HX01BWF9DVFhUU107CiAJd2FpdF9xdWV1ZV9oZWFkX3QJb2xnX3dhaXRxOwogCXNwaW5sb2NrX3QJICAgb2xnX2xvY2s7CkBAIC02MjUsNyArNTgwLDYgQEAKIAogLyogY29ycmVzcG9uZHMgdG8gb25lIG9mIHRoZSBvYmQncyAqLwogI2RlZmluZSBPQkRfREVWSUNFX01BR0lDCTBYQUI1Q0Q2RUYKLSNkZWZpbmUgT0JEX0RFVl9CWV9ERVZOQU1FICAgICAgMHhmZmZmZDBkZQogCiBzdHJ1Y3QgbHZmc19ydW5fY3R4dCB7CiAJc3RydWN0IGR0X2RldmljZSAqZHQ7CkBAIC02NTMsNyArNjA3LDYgQEAKIAkJICAgICAgb2JkX3N0YXJ0aW5nOjEsICAgICAgLyogc3RhcnRlZCBzZXR1cCAqLwogCQkgICAgICBvYmRfZm9yY2U6MSwJIC8qIGNsZWFudXAgd2l0aCA+IDAgb2JkIHJlZmNvdW50ICovCiAJCSAgICAgIG9iZF9mYWlsOjEsCSAvKiBjbGVhbnVwIHdpdGggZmFpbG92ZXIgKi8KLQkJICAgICAgb2JkX2FzeW5jX3JlY292OjEsIC8qIGFsbG93IGFzeW5jaHJvbm91cyBvcnBoYW4gY2xlYW51cCAqLwogCQkgICAgICBvYmRfbm9fY29ubjoxLCAgICAgICAvKiBkZW55IG5ldyBjb25uZWN0aW9ucyAqLwogCQkgICAgICBvYmRfaW5hY3RpdmU6MSwgICAgICAvKiBkZXZpY2UgYWN0aXZlL2luYWN0aXZlCiAJCQkJCSAgICAqIChmb3Igc3lzZnMgc3RhdHVzIG9ubHkhISkKQEAgLTcyOCw5ICs2ODEsNiBAQAogCXN0cnVjdCBjb21wbGV0aW9uCW9iZF9rb2JqX3VucmVnaXN0ZXI7CiB9OwogCi0jZGVmaW5lIE9CRF9MTE9HX0ZMX1NFTkROT1cgICAgIDB4MDAwMQotI2RlZmluZSBPQkRfTExPR19GTF9FWElUCTB4MDAwMgotCiBlbnVtIG9iZF9jbGVhbnVwX3N0YWdlIHsKIC8qIFNwZWNpYWwgY2FzZSBoYWNrIGZvciBNRFMgTE9WcyAqLwogCU9CRF9DTEVBTlVQX0VBUkxZLApAQCAtNzQwLDggKzY5MCw2IEBACiAKIC8qIGdldC9zZXRfaW5mbyBrZXlzICovCiAjZGVmaW5lIEtFWV9BU1lOQwkgICAgICAgImFzeW5jIgotI2RlZmluZSBLRVlfQkxPQ0tTSVpFX0JJVFMgICAgICAiYmxvY2tzaXplX2JpdHMiCi0jZGVmaW5lIEtFWV9CTE9DS1NJWkUJICAgImJsb2Nrc2l6ZSIKICNkZWZpbmUgS0VZX0NIQU5HRUxPR19DTEVBUiAgICAgImNoYW5nZWxvZ19jbGVhciIKICNkZWZpbmUgS0VZX0ZJRDJQQVRICSAgICAiZmlkMnBhdGgiCiAjZGVmaW5lIEtFWV9DSEVDS1NVTQkgICAgImNoZWNrc3VtIgpAQCAtNzUzLDMwICs3MDEsMjIgQEAKICNkZWZpbmUgS0VZX0dSQU5UX1NIUklOSwkiZ3JhbnRfc2hyaW5rIgogI2RlZmluZSBLRVlfSFNNX0NPUFlUT09MX1NFTkQgICAiaHNtX3NlbmQiCiAjZGVmaW5lIEtFWV9JTklUX1JFQ09WX0JBQ0tVUCAgICJpbml0X3JlY292X2JrIgotI2RlZmluZSBLRVlfSU5JVF9SRUNPVgkgICJpbml0aWFsX3JlY292IgogI2RlZmluZSBLRVlfSU5URVJNRFMJICAgICJpbnRlcl9tZHMiCiAjZGVmaW5lIEtFWV9MQVNUX0lECSAgICAgImxhc3RfaWQiCiAjZGVmaW5lIEtFWV9MQVNUX0ZJRAkJImxhc3RfZmlkIgotI2RlZmluZSBLRVlfTE9DS19UT19TVFJJUEUgICAgICAibG9ja190b19zdHJpcGUiCiAjZGVmaW5lIEtFWV9MT1ZERVNDCSAgICAgImxvdmRlc2MiCi0jZGVmaW5lIEtFWV9MT1ZfSURYCSAgICAgImxvdl9pZHgiCiAjZGVmaW5lIEtFWV9NQVhfRUFTSVpFCQkibWF4X2Vhc2l6ZSIKICNkZWZpbmUgS0VZX0RFRkFVTFRfRUFTSVpFCSJkZWZhdWx0X2Vhc2l6ZSIKLSNkZWZpbmUgS0VZX01EU19DT05OCSAgICAibWRzX2Nvbm4iCiAjZGVmaW5lIEtFWV9NR1NTRUMJICAgICAgIm1nc3NlYyIKLSNkZWZpbmUgS0VZX05FWFRfSUQJICAgICAibmV4dF9pZCIKICNkZWZpbmUgS0VZX1JFQURfT05MWQkgICAicmVhZC1vbmx5IgogI2RlZmluZSBLRVlfUkVHSVNURVJfVEFSR0VUICAgICAicmVnaXN0ZXJfdGFyZ2V0IgogI2RlZmluZSBLRVlfU0VUX0ZTCSAgICAgICJzZXRfZnMiCiAjZGVmaW5lIEtFWV9UR1RfQ09VTlQJICAgInRndF9jb3VudCIKIC8qICAgICAgS0VZX1NFVF9JTkZPIGluIGx1c3RyZV9pZGwuaCAqLwogI2RlZmluZSBLRVlfU1BUTFJQQ19DT05GCSJzcHRscnBjX2NvbmYiCi0jZGVmaW5lIEtFWV9DT05ORUNUX0ZMQUcJImNvbm5lY3RfZmxhZ3MiCi0jZGVmaW5lIEtFWV9TWU5DX0xPQ0tfQ0FOQ0VMICAgICJzeW5jX2xvY2tfY2FuY2VsIgogCiAjZGVmaW5lIEtFWV9DQUNIRV9TRVQJCSJjYWNoZV9zZXQiCiAjZGVmaW5lIEtFWV9DQUNIRV9MUlVfU0hSSU5LCSJjYWNoZV9scnVfc2hyaW5rIgotI2RlZmluZSBLRVlfQ0hBTkdFTE9HX0lOREVYCSJjaGFuZ2Vsb2dfaW5kZXgiCiAKIHN0cnVjdCBsdV9jb250ZXh0OwogCkBAIC04MDEsOSArNzQxLDExIEBACiAJLyogQ1JFQVQgbmVlZHMgdG8gYmUgdGVzdGVkIGJlZm9yZSBvcGVuIChib3RoIGNvdWxkIGJlIHNldCkgKi8KIAlpZiAoaXQtPml0X29wICYgSVRfQ1JFQVQpCiAJCXJldHVybiBMQ0tfQ1c7Ci0JZWxzZSBpZiAoaXQtPml0X29wICYgKElUX1JFQURESVIgfCBJVF9HRVRBVFRSIHwgSVRfT1BFTiB8IElUX0xPT0tVUCB8CisJZWxzZSBpZiAoaXQtPml0X29wICYgKElUX0dFVEFUVFIgfCBJVF9PUEVOIHwgSVRfTE9PS1VQIHwKIAkJCSAgICAgIElUX0xBWU9VVCkpCiAJCXJldHVybiBMQ0tfQ1I7CisJZWxzZSBpZiAoaXQtPml0X29wICYgSVRfUkVBRERJUikKKwkJcmV0dXJuIExDS19QUjsKIAllbHNlIGlmIChpdC0+aXRfb3AgJiAgSVRfR0VUWEFUVFIpCiAJCXJldHVybiBMQ0tfUFI7CiAJZWxzZSBpZiAoaXQtPml0X29wICYgIElUX1NFVFhBVFRSKQpAQCAtODEzLDYgKzc1NSwxNCBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCitlbnVtIG1kX2NsaV9mbGFncyB7CisJQ0xJX1NFVF9NRUEJPSBCSVQoMCksCisJQ0xJX1JNX0VOVFJZCT0gQklUKDEpLAorCUNMSV9IQVNINjQJPSBCSVQoMiksCisJQ0xJX0FQSTMyCT0gQklUKDMpLAorCUNMSV9NSUdSQVRFCT0gQklUKDQpLAorfTsKKwogc3RydWN0IG1kX29wX2RhdGEgewogCXN0cnVjdCBsdV9maWQJICAgb3BfZmlkMTsgLyogb3BlcmF0aW9uIGZpZDEgKHVzdWFsbHkgcGFyZW50KSAqLwogCXN0cnVjdCBsdV9maWQJICAgb3BfZmlkMjsgLyogb3BlcmF0aW9uIGZpZDIgKHVzdWFsbHkgY2hpbGQpICovCkBAIC04MjIsNyArNzcyLDcgQEAKIAlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAgICBvcF9oYW5kbGU7CiAJczY0CQkJb3BfbW9kX3RpbWU7CiAJY29uc3QgY2hhcgkgICAgICpvcF9uYW1lOwotCWludAkJICAgICBvcF9uYW1lbGVuOworCXNpemVfdAkJCW9wX25hbWVsZW47CiAJX191MzIJCSAgIG9wX21vZGU7CiAJc3RydWN0IGxtdl9zdHJpcGVfbWQgICAqb3BfbWVhMTsKIAlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAgICpvcF9tZWEyOwpAQCAtODMxLDYgKzc4MSw3IEBACiAJX191MzIJCSAgIG9wX2ZzZ2lkOwogCWNmc19jYXBfdAkgICAgICAgb3BfY2FwOwogCXZvaWQJCSAgICpvcF9kYXRhOworCXNpemVfdAkJCW9wX2RhdGFfc2l6ZTsKIAogCS8qIGlhdHRyIGZpZWxkcyBhbmQgYmxvY2tzLiAqLwogCXN0cnVjdCBpYXR0cgkgICAgb3BfYXR0cjsKQEAgLTg0NSwyOCArNzk2LDI5IEBACiAJLyogVmFyaW91cyBvcGVyYXRpb24gZmxhZ3MuICovCiAJZW51bSBtZHNfb3BfYmlhcyAgICAgICAgb3BfYmlhczsKIAotCS8qIE9wZXJhdGlvbiB0eXBlICovCi0JX191MzIJCSAgIG9wX29wYzsKLQogCS8qIFVzZWQgYnkgcmVhZGRpciAqLwogCV9fdTY0CQkgICBvcF9vZmZzZXQ7CiAKIAkvKiBVc2VkIGJ5IHJlYWRkaXIgKi8KLQlfX3UzMgkJICAgb3BfbnBhZ2VzOworCV9fdTMyCQkJb3BfbWF4X3BhZ2VzOwogCiAJLyogdXNlZCB0byB0cmFuc2ZlciBpbmZvIGJldHdlZW4gdGhlIHN0YWNrcyBvZiBNRCBjbGllbnQKIAkgKiBzZWUgZW51bSBvcF9jbGlfZmxhZ3MKIAkgKi8KLQlfX3UzMgkJCW9wX2NsaV9mbGFnczsKKwllbnVtIG1kX2NsaV9mbGFncwlvcF9jbGlfZmxhZ3M7CiAKIAkvKiBGaWxlIG9iamVjdCBkYXRhIHZlcnNpb24gZm9yIEhTTSByZWxlYXNlLCBvbiBjbGllbnQgKi8KIAlfX3U2NAkJCW9wX2RhdGFfdmVyc2lvbjsKIAlzdHJ1Y3QgbHVzdHJlX2hhbmRsZQlvcF9sZWFzZV9oYW5kbGU7CisKKwkvKiBkZWZhdWx0IHN0cmlwZSBvZmZzZXQgKi8KKwlfX3UzMgkJCW9wX2RlZmF1bHRfc3RyaXBlX29mZnNldDsKIH07CiAKLWVudW0gb3BfY2xpX2ZsYWdzIHsKLQlDTElfU0VUX01FQQk9IDEgPDwgMCwKLQlDTElfUk1fRU5UUlkJPSAxIDw8IDEsCitzdHJ1Y3QgbWRfY2FsbGJhY2sgeworCWludCAoKm1kX2Jsb2NraW5nX2FzdCkoc3RydWN0IGxkbG1fbG9jayAqbG9jaywKKwkJCSAgICAgICBzdHJ1Y3QgbGRsbV9sb2NrX2Rlc2MgKmRlc2MsCisJCQkgICAgICAgdm9pZCAqZGF0YSwgaW50IGZsYWcpOwogfTsKIAogc3RydWN0IG1kX2VucXVldWVfaW5mbzsKQEAgLTg3OSw4ICs4MzEsNyBAQAogCXN0cnVjdCBpbm9kZQkgICAqbWlfZGlyOwogCWludCAoKm1pX2NiKShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwKIAkJICAgICBzdHJ1Y3QgbWRfZW5xdWV1ZV9pbmZvICptaW5mbywgaW50IHJjKTsKLQlfX3U2NAkJICAgbWlfY2JkYXRhOwotCXVuc2lnbmVkIGludAkgICAgbWlfZ2VuZXJhdGlvbjsKKwl2b2lkCQkJKm1pX2NiZGF0YTsKIH07CiAKIHN0cnVjdCBvYmRfb3BzIHsKQEAgLTg5NCw4ICs4NDUsNiBAQAogCQkJICAgICAgX191MzIga2V5bGVuLCB2b2lkICprZXksCiAJCQkgICAgICBfX3UzMiB2YWxsZW4sIHZvaWQgKnZhbCwKIAkJCSAgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdF9zZXQgKnNldCk7Ci0JaW50ICgqYXR0YWNoKShzdHJ1Y3Qgb2JkX2RldmljZSAqZGV2LCB1MzIgbGVuLCB2b2lkICpkYXRhKTsKLQlpbnQgKCpkZXRhY2gpKHN0cnVjdCBvYmRfZGV2aWNlICpkZXYpOwogCWludCAoKnNldHVwKShzdHJ1Y3Qgb2JkX2RldmljZSAqZGV2LCBzdHJ1Y3QgbHVzdHJlX2NmZyAqY2ZnKTsKIAlpbnQgKCpwcmVjbGVhbnVwKShzdHJ1Y3Qgb2JkX2RldmljZSAqZGV2LAogCQkJICBlbnVtIG9iZF9jbGVhbnVwX3N0YWdlIGNsZWFudXBfc3RhZ2UpOwpAQCAtOTI3LDggKzg3Niw4IEBACiAJaW50ICgqZmlkX2ZpbmkpKHN0cnVjdCBvYmRfZGV2aWNlICpvYmQpOwogCiAJLyogQWxsb2NhdGUgbmV3IGZpZCBhY2NvcmRpbmcgdG8gcGFzc2VkIEBoaW50LiAqLwotCWludCAoKmZpZF9hbGxvYykoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGx1X2ZpZCAqZmlkLAotCQkJIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKTsKKwlpbnQgKCpmaWRfYWxsb2MpKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJCSBzdHJ1Y3QgbHVfZmlkICpmaWQsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKTsKIAogCS8qCiAJICogT2JqZWN0IHdpdGggQGZpZCBpcyBnZXR0aW5nIGRlbGV0ZWQsIHdlIG1heSB3YW50IHRvIGRvIHNvbWV0aGluZwpAQCAtOTQzLDEzICs4OTIsMTAgQEAKIAlpbnQgKCp1bnBhY2ttZCkoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKIAkJCXN0cnVjdCBsb3Zfc3RyaXBlX21kICoqbWVtX3RndCwKIAkJCXN0cnVjdCBsb3ZfbWRzX21kICpkaXNrX3NyYywgaW50IGRpc2tfbGVuKTsKLQlpbnQgKCpwcmVhbGxvY2F0ZSkoc3RydWN0IGx1c3RyZV9oYW5kbGUgKiwgdTMyICpyZXEsIHU2NCAqaWRzKTsKIAlpbnQgKCpjcmVhdGUpKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKLQkJICAgICAgc3RydWN0IG9iZG8gKm9hLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqKmVhLAotCQkgICAgICBzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gKm90aSk7CisJCSAgICAgIHN0cnVjdCBvYmRvICpvYSwgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGkpOwogCWludCAoKmRlc3Ryb3kpKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKLQkJICAgICAgIHN0cnVjdCBvYmRvICpvYSwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmVhLAotCQkgICAgICAgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGksIHN0cnVjdCBvYmRfZXhwb3J0ICptZF9leHApOworCQkgICAgICAgc3RydWN0IG9iZG8gKm9hLCBzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gKm90aSk7CiAJaW50ICgqc2V0YXR0cikoY29uc3Qgc3RydWN0IGx1X2VudiAqLCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAogCQkgICAgICAgc3RydWN0IG9iZF9pbmZvICpvaW5mbywgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGkpOwogCWludCAoKnNldGF0dHJfYXN5bmMpKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBvYmRfaW5mbyAqb2luZm8sCkBAIC05NTksOCArOTA1LDYgQEAKIAkJICAgICAgIHN0cnVjdCBvYmRfaW5mbyAqb2luZm8pOwogCWludCAoKmdldGF0dHJfYXN5bmMpKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBvYmRfaW5mbyAqb2luZm8sCiAJCQkgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdF9zZXQgKnNldCk7Ci0JaW50ICgqYWRqdXN0X2ttcykoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKLQkJCSAgdTY0IHNpemUsIGludCBzaHJpbmspOwogCWludCAoKnByZXBydykoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBpbnQgY21kLAogCQkgICAgICBzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3Qgb2JkbyAqb2EsIGludCBvYmpjb3VudCwKIAkJICAgICAgc3RydWN0IG9iZF9pb29iaiAqb2JqLCBzdHJ1Y3QgbmlvYnVmX3JlbW90ZSAqcmVtb3RlLApAQCAtOTcyLDggKzkxNiw2IEBACiAJCQlzdHJ1Y3QgbmlvYnVmX3JlbW90ZSAqcmVtb3RlLCBpbnQgcGFnZXMsCiAJCQlzdHJ1Y3QgbmlvYnVmX2xvY2FsICpsb2NhbCwKIAkJCXN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpLCBpbnQgcmMpOwotCWludCAoKmZpbmRfY2JkYXRhKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqLAotCQkJICAgbGRsbV9pdGVyYXRvcl90IGl0LCB2b2lkICpkYXRhKTsKIAlpbnQgKCppbml0X2V4cG9ydCkoc3RydWN0IG9iZF9leHBvcnQgKmV4cCk7CiAJaW50ICgqZGVzdHJveV9leHBvcnQpKHN0cnVjdCBvYmRfZXhwb3J0ICpleHApOwogCkBAIC0xMDA5LDI3ICs5NTEsMTEgQEAKIAkgKi8KIH07CiAKLWVudW0gewotCUxVU1RSRV9PUENfTUtESVIgICAgPSAoMSA8PCAwKSwKLQlMVVNUUkVfT1BDX1NZTUxJTksgID0gKDEgPDwgMSksCi0JTFVTVFJFX09QQ19NS05PRCAgICA9ICgxIDw8IDIpLAotCUxVU1RSRV9PUENfQ1JFQVRFICAgPSAoMSA8PCAzKSwKLQlMVVNUUkVfT1BDX0FOWSAgICAgID0gKDEgPDwgNCkKLX07Ci0KIC8qIGxtdiBzdHJ1Y3R1cmVzICovCi0jZGVmaW5lIE1FQV9NQUdJQ19MQVNUX0NIQVIgICAgICAweGIyMjIxY2ExCi0jZGVmaW5lIE1FQV9NQUdJQ19BTExfQ0hBUlMgICAgICAweGIyMjJhMTFjCi0jZGVmaW5lIE1FQV9NQUdJQ19IQVNIX1NFR01FTlQgICAweGIyMjJhMTFiCi0KLSNkZWZpbmUgTUFYX0hBU0hfU0laRV8zMgkgMHg3ZmZmZmZmZlVMCi0jZGVmaW5lIE1BWF9IQVNIX1NJWkUJICAgIDB4N2ZmZmZmZmZmZmZmZmZmZlVMTAotI2RlZmluZSBNQVhfSEFTSF9ISUdIRVNUX0JJVCAgICAgMHgxMDAwMDAwMDAwMDAwMDAwVUxMCi0KIHN0cnVjdCBsdXN0cmVfbWQgewogCXN0cnVjdCBtZHRfYm9keQkgKmJvZHk7CiAJc3RydWN0IGxvdl9zdHJpcGVfbWQgICAgKmxzbTsKLQlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAgICAqbWVhOworCXN0cnVjdCBsbXZfc3RyaXBlX21kICAgICpsbXY7CiAjaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAogCXN0cnVjdCBwb3NpeF9hY2wJKnBvc2l4X2FjbDsKICNlbmRpZgpAQCAtMTA0NCw0OCArOTcwLDU1IEBACiAJYm9vbAkJCSAgbW9kX2lzX2NyZWF0ZTsKIH07CiAKK3N0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSB7CisJc3RydWN0IGx1c3RyZV9oYW5kbGUJIG9jaF9maDsKKwlzdHJ1Y3QgbHVfZmlkCQkgb2NoX2ZpZDsKKwlzdHJ1Y3QgbWRfb3Blbl9kYXRhCSpvY2hfbW9kOworCXN0cnVjdCBsdXN0cmVfaGFuZGxlCSBvY2hfbGVhc2VfaGFuZGxlOyAvKiBvcGVuIGxvY2sgZm9yIGxlYXNlICovCisJX191MzIJCQkgb2NoX21hZ2ljOworCWludAkJCSBvY2hfZmxhZ3M7Cit9OworCisjZGVmaW5lIE9CRF9DTElFTlRfSEFORExFX01BR0lDIDB4ZDE1ZWE1ZWQKKwogc3RydWN0IGxvb2t1cF9pbnRlbnQ7CitzdHJ1Y3QgY2xfYXR0cjsKIAogc3RydWN0IG1kX29wcyB7CiAJaW50ICgqZ2V0c3RhdHVzKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBzdHJ1Y3QgbHVfZmlkICopOwogCWludCAoKm51bGxfaW5vZGUpKHN0cnVjdCBvYmRfZXhwb3J0ICosIGNvbnN0IHN0cnVjdCBsdV9maWQgKik7Ci0JaW50ICgqZmluZF9jYmRhdGEpKHN0cnVjdCBvYmRfZXhwb3J0ICosIGNvbnN0IHN0cnVjdCBsdV9maWQgKiwKLQkJCSAgIGxkbG1faXRlcmF0b3JfdCwgdm9pZCAqKTsKIAlpbnQgKCpjbG9zZSkoc3RydWN0IG9iZF9leHBvcnQgKiwgc3RydWN0IG1kX29wX2RhdGEgKiwKIAkJICAgICBzdHJ1Y3QgbWRfb3Blbl9kYXRhICosIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKik7CiAJaW50ICgqY3JlYXRlKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqLAotCQkgICAgICBjb25zdCB2b2lkICosIGludCwgaW50LCBfX3UzMiwgX191MzIsIGNmc19jYXBfdCwKLQkJICAgICAgX191NjQsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKik7CisJCSAgICAgIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCB1bW9kZV90LCB1aWRfdCwgZ2lkX3QsCisJCSAgICAgIGNmc19jYXBfdCwgX191NjQsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKik7CiAJaW50ICgqZG9uZV93cml0aW5nKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBzdHJ1Y3QgbWRfb3BfZGF0YSAgKiwKIAkJCSAgICBzdHJ1Y3QgbWRfb3Blbl9kYXRhICopOwogCWludCAoKmVucXVldWUpKHN0cnVjdCBvYmRfZXhwb3J0ICosIHN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyAqLAorCQkgICAgICAgY29uc3QgbGRsbV9wb2xpY3lfZGF0YV90ICosCiAJCSAgICAgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqLAotCQkgICAgICAgc3RydWN0IGx1c3RyZV9oYW5kbGUgKiwgdm9pZCAqLCBpbnQsCi0JCSAgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKiosIF9fdTY0KTsKKwkJICAgICAgIHN0cnVjdCBsdXN0cmVfaGFuZGxlICosIF9fdTY0KTsKIAlpbnQgKCpnZXRhdHRyKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqLAogCQkgICAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqKTsKIAlpbnQgKCpnZXRhdHRyX25hbWUpKHN0cnVjdCBvYmRfZXhwb3J0ICosIHN0cnVjdCBtZF9vcF9kYXRhICosCiAJCQkgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqKTsKIAlpbnQgKCppbnRlbnRfbG9jaykoc3RydWN0IG9iZF9leHBvcnQgKiwgc3RydWN0IG1kX29wX2RhdGEgKiwKLQkJCSAgIHZvaWQgKiwgaW50LCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqLCBpbnQsCisJCQkgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqLAogCQkJICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqLAogCQkJICAgbGRsbV9ibG9ja2luZ19jYWxsYmFjaywgX191NjQpOwogCWludCAoKmxpbmspKHN0cnVjdCBvYmRfZXhwb3J0ICosIHN0cnVjdCBtZF9vcF9kYXRhICosCiAJCSAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKiopOwogCWludCAoKnJlbmFtZSkoc3RydWN0IG9iZF9leHBvcnQgKiwgc3RydWN0IG1kX29wX2RhdGEgKiwKLQkJICAgICAgY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50LAorCQkgICAgICBjb25zdCBjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCBzaXplX3QsCiAJCSAgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKik7Ci0JaW50ICgqaXNfc3ViZGlyKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICosCi0JCQkgY29uc3Qgc3RydWN0IGx1X2ZpZCAqLAotCQkJICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqKTsKIAlpbnQgKCpzZXRhdHRyKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqLCB2b2lkICosCi0JCSAgICAgICBpbnQsIHZvaWQgKiwgaW50LCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKiosCisJCSAgICAgICBzaXplX3QsIHZvaWQgKiwgc2l6ZV90LCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKiosCiAJCQkgc3RydWN0IG1kX29wZW5fZGF0YSAqKm1vZCk7CiAJaW50ICgqc3luYykoc3RydWN0IG9iZF9leHBvcnQgKiwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqLAogCQkgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqKTsKLQlpbnQgKCpyZWFkcGFnZSkoc3RydWN0IG9iZF9leHBvcnQgKiwgc3RydWN0IG1kX29wX2RhdGEgKiwKLQkJCXN0cnVjdCBwYWdlICoqLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKiopOwotCisJaW50ICgqcmVhZF9wYWdlKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqLAorCQkJIHN0cnVjdCBtZF9jYWxsYmFjayAqY2Jfb3AsIF9fdTY0IGhhc2hfb2Zmc2V0LAorCQkJIHN0cnVjdCBwYWdlICoqcHBhZ2UpOwogCWludCAoKnVubGluaykoc3RydWN0IG9iZF9leHBvcnQgKiwgc3RydWN0IG1kX29wX2RhdGEgKiwKIAkJICAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqKTsKIApAQCAtMTA5Nyw3ICsxMDMwLDcgQEAKIAkJCXU2NCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQsCiAJCQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKiopOwogCi0JaW50ICgqaW5pdF9lYV9zaXplKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBpbnQsIGludCwgaW50LCBpbnQpOworCWludCAoKmluaXRfZWFfc2l6ZSkoc3RydWN0IG9iZF9leHBvcnQgKiwgdTMyLCB1MzIsIHUzMiwgdTMyKTsKIAogCWludCAoKmdldF9sdXN0cmVfbWQpKHN0cnVjdCBvYmRfZXhwb3J0ICosIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqLAogCQkJICAgICBzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqLApAQCAtMTEwNSwxMiArMTAzOCwxNyBAQAogCiAJaW50ICgqZnJlZV9sdXN0cmVfbWQpKHN0cnVjdCBvYmRfZXhwb3J0ICosIHN0cnVjdCBsdXN0cmVfbWQgKik7CiAKKwlpbnQgKCptZXJnZV9hdHRyKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLAorCQkJICBjb25zdCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtLAorCQkJICBzdHJ1Y3QgY2xfYXR0ciAqYXR0ciwgbGRsbV9ibG9ja2luZ19jYWxsYmFjayk7CisKIAlpbnQgKCpzZXRfb3Blbl9yZXBsYXlfZGF0YSkoc3RydWN0IG9iZF9leHBvcnQgKiwKIAkJCQkgICAgc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICosCiAJCQkJICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICopOwogCWludCAoKmNsZWFyX29wZW5fcmVwbGF5X2RhdGEpKHN0cnVjdCBvYmRfZXhwb3J0ICosCiAJCQkJICAgICAgc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICopOwotCWludCAoKnNldF9sb2NrX2RhdGEpKHN0cnVjdCBvYmRfZXhwb3J0ICosIF9fdTY0ICosIHZvaWQgKiwgX191NjQgKik7CisJaW50ICgqc2V0X2xvY2tfZGF0YSkoc3RydWN0IG9iZF9leHBvcnQgKiwgY29uc3Qgc3RydWN0IGx1c3RyZV9oYW5kbGUgKiwKKwkJCSAgICAgdm9pZCAqLCBfX3U2NCAqKTsKIAogCWVudW0gbGRsbV9tb2RlICgqbG9ja19tYXRjaCkoc3RydWN0IG9iZF9leHBvcnQgKiwgX191NjQsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICosIGVudW0gbGRsbV90eXBlLApAQCAtMTEyMSw2ICsxMDU5LDExIEBACiAJCQkgICAgIGxkbG1fcG9saWN5X2RhdGFfdCAqLCBlbnVtIGxkbG1fbW9kZSwKIAkJCSAgICAgZW51bSBsZGxtX2NhbmNlbF9mbGFncyBmbGFncywgdm9pZCAqb3BhcXVlKTsKIAorCWludCAoKmdldF9maWRfZnJvbV9sc20pKHN0cnVjdCBvYmRfZXhwb3J0ICosCisJCQkJY29uc3Qgc3RydWN0IGxtdl9zdHJpcGVfbWQgKiwKKwkJCQljb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJCQlzdHJ1Y3QgbHVfZmlkICpmaWQpOworCiAJaW50ICgqaW50ZW50X2dldGF0dHJfYXN5bmMpKHN0cnVjdCBvYmRfZXhwb3J0ICosCiAJCQkJICAgIHN0cnVjdCBtZF9lbnF1ZXVlX2luZm8gKiwKIAkJCQkgICAgc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvICopOwpAQCAtMTEzNyw4ICsxMDgwLDYgQEAKIAogc3RydWN0IGxzbV9vcGVyYXRpb25zIHsKIAl2b2lkICgqbHNtX2ZyZWUpKHN0cnVjdCBsb3Zfc3RyaXBlX21kICopOwotCWludCAoKmxzbV9kZXN0cm95KShzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqLCBzdHJ1Y3Qgb2JkbyAqb2EsCi0JCQkgICBzdHJ1Y3Qgb2JkX2V4cG9ydCAqbWRfZXhwKTsKIAl2b2lkICgqbHNtX3N0cmlwZV9ieV9pbmRleCkoc3RydWN0IGxvdl9zdHJpcGVfbWQgKiwgaW50ICosIHU2NCAqLAogCQkJCSAgICB1NjQgKik7CiAJdm9pZCAoKmxzbV9zdHJpcGVfYnlfb2Zmc2V0KShzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqLCBpbnQgKiwgdTY0ICosCkBAIC0xMTY0LDEwICsxMTA1LDYgQEAKIAl9CiB9CiAKLS8qIFJlcXVlc3RzIGZvciBvYmRfZXh0ZW50X2NhbGMoKSAqLwotI2RlZmluZSBPQkRfQ0FMQ19TVFJJUEVfU1RBUlQgICAxCi0jZGVmaW5lIE9CRF9DQUxDX1NUUklQRV9FTkQgICAgIDIKLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgbWRfb3Blbl9kYXRhICpvYmRfbW9kX2FsbG9jKHZvaWQpCiB7CiAJc3RydWN0IG1kX29wZW5fZGF0YSAqbW9kOwpAQCAtMTIxMSw3ICsxMTQ4LDggQEAKIAlyZXR1cm4gbHVfZGV2LT5sZF9vYmQtPm9iZF9uYW1lOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgZmlsZW5hbWVfaXNfdm9sYXRpbGUoY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGludCAqaWR4KQorc3RhdGljIGlubGluZSBib29sIGZpbGVuYW1lX2lzX3ZvbGF0aWxlKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLAorCQkJCQlpbnQgKmlkeCkKIHsKIAljb25zdCBjaGFyCSpzdGFydDsKIAljaGFyCQkqZW5kOwpAQCAtMTI1OSw0ICsxMTk3LDI4IEBACiAJcmV0dXJuIG9iZC0+dS5jbGkuY2xfbWF4X3BhZ2VzX3Blcl9ycGMgPDwgUEFHRV9TSElGVDsKIH0KIAorLyoKKyAqIHdoZW4gUlBDIHNpemUgb3IgdGhlIG1heCBSUENzIGluIGZsaWdodCBpcyBpbmNyZWFzZWQsIHRoZSBtYXggZGlydHkgcGFnZXMKKyAqIG9mIHRoZSBjbGllbnQgc2hvdWxkIGJlIGluY3JlYXNlZCBhY2NvcmRpbmdseSB0byBhdm9pZCBzZW5kaW5nIGZyYWdtZW50ZWQKKyAqIFJQQ3Mgb3ZlciB0aGUgbmV0d29yayB3aGVuIHRoZSBjbGllbnQgcnVucyBvdXQgb2YgdGhlIG1heGltdW0gZGlydHkgc3BhY2UKKyAqIHdoZW4gc28gbWFueSBSUENzIGFyZSBiZWluZyBnZW5lcmF0ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGllbnRfYWRqdXN0X21heF9kaXJ0eShzdHJ1Y3QgY2xpZW50X29iZCAqY2xpKQoreworCS8qIGluaXRpYWxpemluZyAqLworCWlmIChjbGktPmNsX2RpcnR5X21heF9wYWdlcyA8PSAwKQorCQljbGktPmNsX2RpcnR5X21heF9wYWdlcyA9CisJCQkoT1NDX01BWF9ESVJUWV9ERUZBVUxUICogMTAyNCAqIDEwMjQpID4+IFBBR0VfU0hJRlQ7CisJZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgZGlydHlfbWF4ID0gY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQgKgorCQkJCQkgIGNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGM7CisKKwkJaWYgKGRpcnR5X21heCA+IGNsaS0+Y2xfZGlydHlfbWF4X3BhZ2VzKQorCQkJY2xpLT5jbF9kaXJ0eV9tYXhfcGFnZXMgPSBkaXJ0eV9tYXg7CisJfQorCisJaWYgKGNsaS0+Y2xfZGlydHlfbWF4X3BhZ2VzID4gdG90YWxyYW1fcGFnZXMgLyA4KQorCQljbGktPmNsX2RpcnR5X21heF9wYWdlcyA9IHRvdGFscmFtX3BhZ2VzIC8gODsKK30KKwogI2VuZGlmIC8qIF9fT0JEX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkX2NsYXNzLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9jbGFzcy5oCmluZGV4IDY0ODJhOTMuLjE2MDk0ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkX2NsYXNzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmRfY2xhc3MuaApAQCAtNTYsNyArNTYsNiBAQAogI2RlZmluZSBPQkRfU1RBVEZTX0ZPUl9NRFQwCTB4MDAwOAkvKiBUaGUgc3RhdGZzIGlzIG9ubHkgZm9yIHJldHJpZXZpbmcKIAkJCQkJICogaW5mb3JtYXRpb24gZnJvbSBNRFQwLgogCQkJCQkgKi8KLSNkZWZpbmUgT0JEX0ZMX1BVTkNICSAgICAweDAwMDAwMDAxICAvKiBUbyBpbmRpY2F0ZSBpdCBpcyBwdW5jaCBvcGVyYXRpb24gKi8KIAogLyogT0JEIERldmljZSBEZWNsYXJhdGlvbnMgKi8KIGV4dGVybiBzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkX2RldnNbTUFYX09CRF9ERVZJQ0VTXTsKQEAgLTk3LDYgKzk2LDExIEBACiB2b2lkIG9iZF96b21iaWVfaW1wZXhwX3N0b3Aodm9pZCk7CiB2b2lkIG9iZF96b21iaWVfYmFycmllcih2b2lkKTsKIAoraW50IG9iZF9nZXRfcmVxdWVzdF9zbG90KHN0cnVjdCBjbGllbnRfb2JkICpjbGkpOwordm9pZCBvYmRfcHV0X3JlcXVlc3Rfc2xvdChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpKTsKK19fdTMyIG9iZF9nZXRfbWF4X3JwY3NfaW5fZmxpZ2h0KHN0cnVjdCBjbGllbnRfb2JkICpjbGkpOworaW50IG9iZF9zZXRfbWF4X3JwY3NfaW5fZmxpZ2h0KHN0cnVjdCBjbGllbnRfb2JkICpjbGksIF9fdTMyIG1heCk7CisKIHN0cnVjdCBsbG9nX2hhbmRsZTsKIHN0cnVjdCBsbG9nX3JlY19oZHI7CiB0eXBlZGVmIGludCAoKmxsb2dfY2JfdCkoY29uc3Qgc3RydWN0IGx1X2VudiAqLCBzdHJ1Y3QgbGxvZ19oYW5kbGUgKiwKQEAgLTI2NSwxMCArMjY5LDEwIEBACiBzdHJ1Y3QgaW5vZGU7CiBzdHJ1Y3QgbHVfYXR0cjsKIHN0cnVjdCBvYmRvOwotdm9pZCBvYmRvX3JlZnJlc2hfaW5vZGUoc3RydWN0IGlub2RlICpkc3QsIHN0cnVjdCBvYmRvICpzcmMsIHUzMiB2YWxpZCk7Cit2b2lkIG9iZG9fcmVmcmVzaF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmRzdCwgY29uc3Qgc3RydWN0IG9iZG8gKnNyYywgdTMyIHZhbGlkKTsKIAotdm9pZCBvYmRvX3RvX2lvb2JqKHN0cnVjdCBvYmRvICpvYSwgc3RydWN0IG9iZF9pb29iaiAqaW9vYmopOwotdm9pZCBtZF9mcm9tX29iZG8oc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsIHN0cnVjdCBvYmRvICpvYSwgdTMyIHZhbGlkKTsKK3ZvaWQgb2Jkb190b19pb29iaihjb25zdCBzdHJ1Y3Qgb2JkbyAqb2EsIHN0cnVjdCBvYmRfaW9vYmogKmlvb2JqKTsKK3ZvaWQgbWRfZnJvbV9vYmRvKHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLCBjb25zdCBzdHJ1Y3Qgb2JkbyAqb2EsIHUzMiB2YWxpZCk7CiAKICNkZWZpbmUgT0JUKGRldikJKGRldiktPm9iZF90eXBlCiAjZGVmaW5lIE9CUChkZXYsIG9wKSAgICAoZGV2KS0+b2JkX3R5cGUtPnR5cF9kdF9vcHMtPm9wCkBAIC02NzMsMTUgKzY3Nyw2IEBACiAJcmV0dXJuIHJjOwogfQogCi0vKiBoZWxwZXIgZnVuY3Rpb25zICovCi1zdGF0aWMgaW5saW5lIGludCBvYmRfYWxsb2NfbWVtbWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKLQkJCQkgIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqbWVtX3RndCkKLXsKLQlMQVNTRVJUKG1lbV90Z3QpOwotCUxBU1NFUlQoISptZW1fdGd0KTsKLQlyZXR1cm4gb2JkX3VucGFja21kKGV4cCwgbWVtX3RndCwgTlVMTCwgMCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IG9iZF9mcmVlX21lbW1kKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCQkJIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqbWVtX3RndCkKIHsKQEAgLTY5NSwyOSArNjkwLDI2IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG9iZF9jcmVhdGUoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAotCQkJICAgICBzdHJ1Y3Qgb2JkbyAqb2Jkbywgc3RydWN0IGxvdl9zdHJpcGVfbWQgKiplYSwKLQkJCSAgICAgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGkpCisJCQkgICAgIHN0cnVjdCBvYmRvICpvYmRvLCBzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gKm90aSkKIHsKIAlpbnQgcmM7CiAKIAlFWFBfQ0hFQ0tfRFRfT1AoZXhwLCBjcmVhdGUpOwogCUVYUF9DT1VOVEVSX0lOQ1JFTUVOVChleHAsIGNyZWF0ZSk7CiAKLQlyYyA9IE9CUChleHAtPmV4cF9vYmQsIGNyZWF0ZSkoZW52LCBleHAsIG9iZG8sIGVhLCBvdGkpOworCXJjID0gT0JQKGV4cC0+ZXhwX29iZCwgY3JlYXRlKShlbnYsIGV4cCwgb2Jkbywgb3RpKTsKIAlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG9iZF9kZXN0cm95KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKLQkJCSAgICAgIHN0cnVjdCBvYmRvICpvYmRvLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqZWEsCi0JCQkgICAgICBzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gKm90aSwKLQkJCSAgICAgIHN0cnVjdCBvYmRfZXhwb3J0ICptZF9leHApCisJCQkgICAgICBzdHJ1Y3Qgb2JkbyAqb2Jkbywgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGkpCiB7CiAJaW50IHJjOwogCiAJRVhQX0NIRUNLX0RUX09QKGV4cCwgZGVzdHJveSk7CiAJRVhQX0NPVU5URVJfSU5DUkVNRU5UKGV4cCwgZGVzdHJveSk7CiAKLQlyYyA9IE9CUChleHAtPmV4cF9vYmQsIGRlc3Ryb3kpKGVudiwgZXhwLCBvYmRvLCBlYSwgb3RpLCBtZF9leHApOworCXJjID0gT0JQKGV4cC0+ZXhwX29iZCwgZGVzdHJveSkoZW52LCBleHAsIG9iZG8sIG90aSk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC05MjUsNyArOTE3LDggQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG9iZF9maWRfYWxsb2Moc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKK3N0YXRpYyBpbmxpbmUgaW50IG9iZF9maWRfYWxsb2MoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAorCQkJCXN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCQkJc3RydWN0IGx1X2ZpZCAqZmlkLAogCQkJCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKQogewpAQCAtOTM0LDcgKzkyNyw3IEBACiAJRVhQX0NIRUNLX0RUX09QKGV4cCwgZmlkX2FsbG9jKTsKIAlFWFBfQ09VTlRFUl9JTkNSRU1FTlQoZXhwLCBmaWRfYWxsb2MpOwogCi0JcmMgPSBPQlAoZXhwLT5leHBfb2JkLCBmaWRfYWxsb2MpKGV4cCwgZmlkLCBvcF9kYXRhKTsKKwlyYyA9IE9CUChleHAtPmV4cF9vYmQsIGZpZF9hbGxvYykoZW52LCBleHAsIGZpZCwgb3BfZGF0YSk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xMTQ3LDE5ICsxMTQwLDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG9iZF9hZGp1c3Rfa21zKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCQkJIHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sIHU2NCBzaXplLAotCQkJCSBpbnQgc2hyaW5rKQotewotCWludCByYzsKLQotCUVYUF9DSEVDS19EVF9PUChleHAsIGFkanVzdF9rbXMpOwotCUVYUF9DT1VOVEVSX0lOQ1JFTUVOVChleHAsIGFkanVzdF9rbXMpOwotCi0JcmMgPSBPQlAoZXhwLT5leHBfb2JkLCBhZGp1c3Rfa21zKShleHAsIGxzbSwgc2l6ZSwgc2hyaW5rKTsKLQlyZXR1cm4gcmM7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IG9iZF9pb2NvbnRyb2wodW5zaWduZWQgaW50IGNtZCwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKIAkJCQlpbnQgbGVuLCB2b2lkICprYXJnLCB2b2lkIF9fdXNlciAqdWFyZykKIHsKQEAgLTExNzIsMTkgKzExNTIsNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgb2JkX2ZpbmRfY2JkYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCQkJICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLAotCQkJCSAgbGRsbV9pdGVyYXRvcl90IGl0LCB2b2lkICpkYXRhKQotewotCWludCByYzsKLQotCUVYUF9DSEVDS19EVF9PUChleHAsIGZpbmRfY2JkYXRhKTsKLQlFWFBfQ09VTlRFUl9JTkNSRU1FTlQoZXhwLCBmaW5kX2NiZGF0YSk7Ci0KLQlyYyA9IE9CUChleHAtPmV4cF9vYmQsIGZpbmRfY2JkYXRhKShleHAsIGxzbSwgaXQsIGRhdGEpOwotCXJldHVybiByYzsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIG9iZF9pbXBvcnRfZXZlbnQoc3RydWN0IG9iZF9kZXZpY2UgKm9iZCwKIAkJCQkgICAgc3RydWN0IG9iZF9pbXBvcnQgKmltcCwKIAkJCQkgICAgZW51bSBvYmRfaW1wb3J0X2V2ZW50IGV2ZW50KQpAQCAtMTIxMCwxMiArMTE3Nyw3IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQkvKiB0aGUgY2hlY2sgZm9yIGFzeW5jX3JlY292IGlzIGEgY29tcGxldGUgaGFjayAtIEknbSBoZXJlYnkKLQkgKiBvdmVybG9hZGluZyB0aGUgbWVhbmluZyB0byBhbHNvIG1lYW4gInRoaXMgd2FzIGNhbGxlZCBmcm9tCi0JICogbWRzX3Bvc3RzZXR1cCIuICBJIGtub3cgdGhhdCBteSBtZHMgaXMgYWJsZSB0byBoYW5kbGUgbm90aWZpZXMKLQkgKiBieSB0aGlzIHBvaW50LCBhbmQgaXQgbmVlZHMgdG8gZ2V0IHRoZW0gdG8gZXhlY3V0ZSBtZHNfcG9zdHJlY292LgotCSAqLwotCWlmICghb2JkLT5vYmRfc2V0X3VwICYmICFvYmQtPm9iZF9hc3luY19yZWNvdikgeworCWlmICghb2JkLT5vYmRfc2V0X3VwKSB7CiAJCUNERUJVRyhEX0hBLCAib2JkICVzIG5vdCBzZXQgdXBcbiIsIG9iZC0+b2JkX25hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMzU4LDE4ICsxMzIwLDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG1kX2ZpbmRfY2JkYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCQkJIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCwKLQkJCQkgbGRsbV9pdGVyYXRvcl90IGl0LCB2b2lkICpkYXRhKQotewotCWludCByYzsKLQotCUVYUF9DSEVDS19NRF9PUChleHAsIGZpbmRfY2JkYXRhKTsKLQlFWFBfTURfQ09VTlRFUl9JTkNSRU1FTlQoZXhwLCBmaW5kX2NiZGF0YSk7Ci0JcmMgPSBNRFAoZXhwLT5leHBfb2JkLCBmaW5kX2NiZGF0YSkoZXhwLCBmaWQsIGl0LCBkYXRhKTsKLQlyZXR1cm4gcmM7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IG1kX2Nsb3NlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAogCQkJICAgc3RydWN0IG1kX29wZW5fZGF0YSAqbW9kLAogCQkJICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKQEAgLTEzODMsOSArMTMzMyw5IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG1kX2NyZWF0ZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJCSAgICBjb25zdCB2b2lkICpkYXRhLCBpbnQgZGF0YWxlbiwgaW50IG1vZGUsIF9fdTMyIHVpZCwKLQkJCSAgICBfX3UzMiBnaWQsIGNmc19jYXBfdCBjYXBfZWZmZWN0aXZlLCBfX3U2NCByZGV2LAotCQkJICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpCisJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4sIHVtb2RlX3QgbW9kZSwKKwkJCSAgICB1aWRfdCB1aWQsIGdpZF90IGdpZCwgY2ZzX2NhcF90IGNhcF9lZmZlY3RpdmUsCisJCQkgICAgX191NjQgcmRldiwgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKIHsKIAlpbnQgcmM7CiAKQEAgLTE0MTAsMTkgKzEzNjAsMTggQEAKIAogc3RhdGljIGlubGluZSBpbnQgbWRfZW5xdWV1ZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAogCQkJICAgICBzdHJ1Y3QgbGRsbV9lbnF1ZXVlX2luZm8gKmVpbmZvLAorCQkJICAgICBjb25zdCBsZGxtX3BvbGljeV9kYXRhX3QgKnBvbGljeSwKIAkJCSAgICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LAogCQkJICAgICBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKIAkJCSAgICAgc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxvY2toLAotCQkJICAgICB2b2lkICpsbW0sIGludCBsbW1zaXplLAotCQkJICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXEsCiAJCQkgICAgIF9fdTY0IGV4dHJhX2xvY2tfZmxhZ3MpCiB7CiAJaW50IHJjOwogCiAJRVhQX0NIRUNLX01EX09QKGV4cCwgZW5xdWV1ZSk7CiAJRVhQX01EX0NPVU5URVJfSU5DUkVNRU5UKGV4cCwgZW5xdWV1ZSk7Ci0JcmMgPSBNRFAoZXhwLT5leHBfb2JkLCBlbnF1ZXVlKShleHAsIGVpbmZvLCBpdCwgb3BfZGF0YSwgbG9ja2gsCi0JCQkJCWxtbSwgbG1tc2l6ZSwgcmVxLCBleHRyYV9sb2NrX2ZsYWdzKTsKKwlyYyA9IE1EUChleHAtPmV4cF9vYmQsIGVucXVldWUpKGV4cCwgZWluZm8sIHBvbGljeSwgaXQsIG9wX2RhdGEsIGxvY2toLAorCQkJCQlleHRyYV9sb2NrX2ZsYWdzKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTE0MzksOSArMTM4OCw5IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG1kX2ludGVudF9sb2NrKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCQkJIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLCB2b2lkICpsbW0sCi0JCQkJIGludCBsbW1zaXplLCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsCi0JCQkJIGludCBsb29rdXBfZmxhZ3MsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXAsCisJCQkJIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAorCQkJCSBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsCisJCQkJIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXAsCiAJCQkJIGxkbG1fYmxvY2tpbmdfY2FsbGJhY2sgY2JfYmxvY2tpbmcsCiAJCQkJIF9fdTY0IGV4dHJhX2xvY2tfZmxhZ3MpCiB7CkBAIC0xNDQ5LDkgKzEzOTgsOCBAQAogCiAJRVhQX0NIRUNLX01EX09QKGV4cCwgaW50ZW50X2xvY2spOwogCUVYUF9NRF9DT1VOVEVSX0lOQ1JFTUVOVChleHAsIGludGVudF9sb2NrKTsKLQlyYyA9IE1EUChleHAtPmV4cF9vYmQsIGludGVudF9sb2NrKShleHAsIG9wX2RhdGEsIGxtbSwgbG1tc2l6ZSwKLQkJCQkJICAgIGl0LCBsb29rdXBfZmxhZ3MsIHJlcXAsIGNiX2Jsb2NraW5nLAotCQkJCQkgICAgZXh0cmFfbG9ja19mbGFncyk7CisJcmMgPSBNRFAoZXhwLT5leHBfb2JkLCBpbnRlbnRfbG9jaykoZXhwLCBvcF9kYXRhLCBpdCwgcmVxcCwKKwkJCQkJICAgIGNiX2Jsb2NraW5nLCBleHRyYV9sb2NrX2ZsYWdzKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTE0NjcsOCArMTQxNSw4IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG1kX3JlbmFtZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJCSAgICBjb25zdCBjaGFyICpvbGQsIGludCBvbGRsZW4sIGNvbnN0IGNoYXIgKm5ldywKLQkJCSAgICBpbnQgbmV3bGVuLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQorCQkJICAgIGNvbnN0IGNoYXIgKm9sZCwgc2l6ZV90IG9sZGxlbiwgY29uc3QgY2hhciAqbmV3LAorCQkJICAgIHNpemVfdCBuZXdsZW4sIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpCiB7CiAJaW50IHJjOwogCkBAIC0xNDc5LDIxICsxNDI3LDggQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG1kX2lzX3N1YmRpcihzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKnBmaWQsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGx1X2ZpZCAqY2ZpZCwKLQkJCSAgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQotewotCWludCByYzsKLQotCUVYUF9DSEVDS19NRF9PUChleHAsIGlzX3N1YmRpcik7Ci0JRVhQX01EX0NPVU5URVJfSU5DUkVNRU5UKGV4cCwgaXNfc3ViZGlyKTsKLQlyYyA9IE1EUChleHAtPmV4cF9vYmQsIGlzX3N1YmRpcikoZXhwLCBwZmlkLCBjZmlkLCByZXF1ZXN0KTsKLQlyZXR1cm4gcmM7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IG1kX3NldGF0dHIoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCQkgICAgIHZvaWQgKmVhLCBpbnQgZWFsZW4sIHZvaWQgKmVhMiwgaW50IGVhMmxlbiwKKwkJCSAgICAgdm9pZCAqZWEsIHNpemVfdCBlYWxlbiwgdm9pZCAqZWEyLCBzaXplX3QgZWEybGVuLAogCQkJICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0LAogCQkJICAgICBzdHJ1Y3QgbWRfb3Blbl9kYXRhICoqbW9kKQogewpAQCAtMTUxNywxNSArMTQ1MiwxOCBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbWRfcmVhZHBhZ2Uoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wZGF0YSwKLQkJCSAgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsCi0JCQkgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQorc3RhdGljIGlubGluZSBpbnQgbWRfcmVhZF9wYWdlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCQkgICAgICAgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCisJCQkgICAgICAgc3RydWN0IG1kX2NhbGxiYWNrICpjYl9vcCwKKwkJCSAgICAgICBfX3U2NCAgaGFzaF9vZmZzZXQsCisJCQkgICAgICAgc3RydWN0IHBhZ2UgKipwcGFnZSkKIHsKIAlpbnQgcmM7CiAKLQlFWFBfQ0hFQ0tfTURfT1AoZXhwLCByZWFkcGFnZSk7Ci0JRVhQX01EX0NPVU5URVJfSU5DUkVNRU5UKGV4cCwgcmVhZHBhZ2UpOwotCXJjID0gTURQKGV4cC0+ZXhwX29iZCwgcmVhZHBhZ2UpKGV4cCwgb3BkYXRhLCBwYWdlcywgcmVxdWVzdCk7CisJRVhQX0NIRUNLX01EX09QKGV4cCwgcmVhZF9wYWdlKTsKKwlFWFBfTURfQ09VTlRFUl9JTkNSRU1FTlQoZXhwLCByZWFkX3BhZ2UpOworCXJjID0gTURQKGV4cC0+ZXhwX29iZCwgcmVhZF9wYWdlKShleHAsIG9wX2RhdGEsIGNiX29wLCBoYXNoX29mZnNldCwKKwkJCQkJICBwcGFnZSk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNTU5LDYgKzE0OTcsMTYgQEAKIAlyZXR1cm4gTURQKGV4cC0+ZXhwX29iZCwgZnJlZV9sdXN0cmVfbWQpKGV4cCwgbWQpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBtZF9tZXJnZV9hdHRyKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCQkJY29uc3Qgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSwKKwkJCQlzdHJ1Y3QgY2xfYXR0ciAqYXR0ciwKKwkJCQlsZGxtX2Jsb2NraW5nX2NhbGxiYWNrIGNiKQoreworCUVYUF9DSEVDS19NRF9PUChleHAsIG1lcmdlX2F0dHIpOworCUVYUF9NRF9DT1VOVEVSX0lOQ1JFTUVOVChleHAsIG1lcmdlX2F0dHIpOworCXJldHVybiBNRFAoZXhwLT5leHBfb2JkLCBtZXJnZV9hdHRyKShleHAsIGxzbSwgYXR0ciwgY2IpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBtZF9zZXR4YXR0cihzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCiAJCQkgICAgICB1NjQgdmFsaWQsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgICBjb25zdCBjaGFyICppbnB1dCwgaW50IGlucHV0X3NpemUsCkBAIC0xNjAzLDcgKzE1NTEsOCBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBtZF9zZXRfbG9ja19kYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCQkJICAgX191NjQgKmxvY2toLCB2b2lkICpkYXRhLCBfX3U2NCAqYml0cykKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqbG9ja2gsCisJCQkJICAgdm9pZCAqZGF0YSwgX191NjQgKmJpdHMpCiB7CiAJRVhQX0NIRUNLX01EX09QKGV4cCwgc2V0X2xvY2tfZGF0YSk7CiAJRVhQX01EX0NPVU5URVJfSU5DUkVNRU5UKGV4cCwgc2V0X2xvY2tfZGF0YSk7CkBAIC0xNjc0LDYgKzE2MjMsMTkgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG1kX2dldF9maWRfZnJvbV9sc20oc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAorCQkJCSAgICAgIHN0cnVjdCBsdV9maWQgKmZpZCkKK3sKKwlpbnQgcmM7CisKKwlFWFBfQ0hFQ0tfTURfT1AoZXhwLCBnZXRfZmlkX2Zyb21fbHNtKTsKKwlFWFBfTURfQ09VTlRFUl9JTkNSRU1FTlQoZXhwLCBnZXRfZmlkX2Zyb21fbHNtKTsKKwlyYyA9IE1EUChleHAtPmV4cF9vYmQsIGdldF9maWRfZnJvbV9sc20pKGV4cCwgbHNtLCBuYW1lLCBuYW1lbGVuLCBmaWQpOworCXJldHVybiByYzsKK30KKwogLyogT0JEIE1ldGFkYXRhIFN1cHBvcnQgKi8KIAogaW50IG9iZF9pbml0X2NhY2hlcyh2b2lkKTsKQEAgLTE2ODIsMTYgKzE2NDQsNiBAQAogLyogc3VwcG9ydCByb3V0aW5lcyAqLwogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpvYmRvX2NhY2hlcDsKIAotc3RhdGljIGlubGluZSB2b2lkIG9iZG8yZmlkKHN0cnVjdCBvYmRvICpvYSwgc3RydWN0IGx1X2ZpZCAqZmlkKQotewotCS8qIHNvbWV0aGluZyBoZXJlICovCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmaWQyb2JkbyhzdHJ1Y3QgbHVfZmlkICpmaWQsIHN0cnVjdCBvYmRvICpvYSkKLXsKLQkvKiBzb21ldGhpbmcgaGVyZSAqLwotfQotCiB0eXBlZGVmIGludCAoKnJlZ2lzdGVyX2x3cF9jYikodm9pZCAqZGF0YSk7CiAKIHN0cnVjdCBsd3BfcmVnaXN0ZXJfaXRlbSB7CkBAIC0xNzEwLDYgKzE2NjIsOSBAQAogZXh0ZXJuIGludCAoKnB0bHJwY19wdXRfY29ubmVjdGlvbl9zdXBlcmhhY2spKHN0cnVjdCBwdGxycGNfY29ubmVjdGlvbiAqYyk7CiAKIC8qIG9iZF9tb3VudC5jICovCitpbnQgbHVzdHJlX3VucmVnaXN0ZXJfZnModm9pZCk7CitpbnQgbHVzdHJlX3JlZ2lzdGVyX2ZzKHZvaWQpOworaW50IGx1c3RyZV9jaGVja19leGNsdXNpb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqc3ZuYW1lKTsKIAogLyogc3lzY3RsLmMgKi8KIGludCBvYmRfc3lzY3RsX2luaXQodm9pZCk7CkBAIC0xNzMwLDggKzE2ODUsMjQgQEAKIGV4dGVybiBjaGFyIG9iZF9qb2JpZF9ub2RlW107CiBleHRlcm4gc3RydWN0IG1pc2NkZXZpY2Ugb2JkX3BzZGV2OwogZXh0ZXJuIHNwaW5sb2NrX3Qgb2JkX3R5cGVzX2xvY2s7CitpbnQgY2xhc3NfcHJvY2ZzX2luaXQodm9pZCk7CitpbnQgY2xhc3NfcHJvY2ZzX2NsZWFuKHZvaWQpOwogCiAvKiBwcm5nLmMgKi8KICNkZWZpbmUgbGxfZ2VuZXJhdGVfcmFuZG9tX3V1aWQodXVpZF9vdXQpIGNmc19nZXRfcmFuZG9tX2J5dGVzKHV1aWRfb3V0LCBzaXplb2YoY2xhc3NfdXVpZF90KSkKIAorLyogc3RhdGZzX3BhY2suYyAqLworc3RydWN0IGtzdGF0ZnM7Cit2b2lkIHN0YXRmc19wYWNrKHN0cnVjdCBvYmRfc3RhdGZzICpvc2ZzLCBzdHJ1Y3Qga3N0YXRmcyAqc2ZzKTsKK3ZvaWQgc3RhdGZzX3VucGFjayhzdHJ1Y3Qga3N0YXRmcyAqc2ZzLCBzdHJ1Y3Qgb2JkX3N0YXRmcyAqb3Nmcyk7CisKKy8qIHJvb3Qgc3F1YXNoIGluZm8gKi8KK3N0cnVjdCByd19zZW1hcGhvcmU7CitzdHJ1Y3Qgcm9vdF9zcXVhc2hfaW5mbyB7CisJdWlkX3QJCQlyc2lfdWlkOworCWdpZF90CQkJcnNpX2dpZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXJzaV9ub3NxdWFzaF9uaWRzOworCXN0cnVjdCByd19zZW1hcGhvcmUJcnNpX3NlbTsKK307CisKICNlbmRpZiAvKiBfX0xJTlVYX09CRF9DTEFTU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9zdXBwb3J0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9zdXBwb3J0LmgKaW5kZXggODQ1ZTY0YTUuLmIzNDZhN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkX3N1cHBvcnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9zdXBwb3J0LmgKQEAgLTM1LDcgKzM1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnMuaCIKLSNpbmNsdWRlICJsaW51eC9sdXN0cmVfY29tcGF0MjUuaCIKKyNpbmNsdWRlICJsdXN0cmVfY29tcGF0LmgiCiAjaW5jbHVkZSAibHByb2Nmc19zdGF0dXMuaCIKIAogLyogZ2xvYmFsIHZhcmlhYmxlcyAqLwpAQCAtNTIsMTEgKzUyLDkgQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQgYXRfaGlzdG9yeTsKIGV4dGVybiBpbnQgYXRfZWFybHlfbWFyZ2luOwogZXh0ZXJuIGludCBhdF9leHRyYTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgb2JkX3N5bmNfZmlsdGVyOwotZXh0ZXJuIHVuc2lnbmVkIGludCBvYmRfbWF4X2RpcnR5X3BhZ2VzOwotZXh0ZXJuIGF0b21pY190IG9iZF91bnN0YWJsZV9wYWdlczsKLWV4dGVybiBhdG9taWNfdCBvYmRfZGlydHlfcGFnZXM7Ci1leHRlcm4gYXRvbWljX3Qgb2JkX2RpcnR5X3RyYW5zaXRfcGFnZXM7CitleHRlcm4gdW5zaWduZWQgbG9uZyBvYmRfbWF4X2RpcnR5X3BhZ2VzOworZXh0ZXJuIGF0b21pY19sb25nX3Qgb2JkX2RpcnR5X3BhZ2VzOworZXh0ZXJuIGF0b21pY19sb25nX3Qgb2JkX2RpcnR5X3RyYW5zaXRfcGFnZXM7CiBleHRlcm4gY2hhciBvYmRfam9iaWRfdmFyW107CiAKIC8qIFNvbWUgaGFzaCBpbml0IGFyZ3VtZW50IGNvbnN0YW50cyAqLwpAQCAtMTE3LDE3ICsxMTUsMTcgQEAKICAqIHJ1bm5pbmcgb24gYSBiYWNrdXAgc2VydmVyLiAoSWYgaXQncyB0b28gbG93LCBpbXBvcnRfc2VsZWN0X2Nvbm5lY3Rpb24KICAqIHdpbGwgaW5jcmVhc2UgdGhlIHRpbWVvdXQgYW55aG93LikKICAqLwotI2RlZmluZSBJTklUSUFMX0NPTk5FQ1RfVElNRU9VVCBtYXgoQ09OTkVDVElPTl9TV0lUQ0hfTUlOLCBvYmRfdGltZW91dC8yMCkKKyNkZWZpbmUgSU5JVElBTF9DT05ORUNUX1RJTUVPVVQgbWF4KENPTk5FQ1RJT05fU1dJVENIX01JTiwgb2JkX3RpbWVvdXQgLyAyMCkKIC8qIFRoZSBtYXggZGVsYXkgYmV0d2VlbiBjb25uZWN0cyBpcyBTV0lUQ0hfTUFYICsgU1dJVENIX0lOQyArIElOSVRJQUwgKi8KICNkZWZpbmUgUkVDT05ORUNUX0RFTEFZX01BWCAoQ09OTkVDVElPTl9TV0lUQ0hfTUFYICsgQ09OTkVDVElPTl9TV0lUQ0hfSU5DICsgXAogCQkJICAgICBJTklUSUFMX0NPTk5FQ1RfVElNRU9VVCkKIC8qIFRoZSBtaW4gdGltZSBhIHRhcmdldCBzaG91bGQgd2FpdCBmb3IgY2xpZW50cyB0byByZWNvbm5lY3QgaW4gcmVjb3ZlcnkgKi8KLSNkZWZpbmUgT0JEX1JFQ09WRVJZX1RJTUVfTUlOICAgICgyKlJFQ09OTkVDVF9ERUxBWV9NQVgpCisjZGVmaW5lIE9CRF9SRUNPVkVSWV9USU1FX01JTiAgICAoMiAqIFJFQ09OTkVDVF9ERUxBWV9NQVgpCiAjZGVmaW5lIE9CRF9JUl9GQUNUT1JfTUlOCSAxCiAjZGVmaW5lIE9CRF9JUl9GQUNUT1JfTUFYCSAxMAotI2RlZmluZSBPQkRfSVJfRkFDVE9SX0RFRkFVTFQgICAgKE9CRF9JUl9GQUNUT1JfTUFYLzIpCisjZGVmaW5lIE9CRF9JUl9GQUNUT1JfREVGQVVMVCAgICAoT0JEX0lSX0ZBQ1RPUl9NQVggLyAyKQogLyogZGVmYXVsdCB0aW1lb3V0IGZvciB0aGUgTUdTIHRvIGJlY29tZSBJUl9GVUxMICovCi0jZGVmaW5lIE9CRF9JUl9NR1NfVElNRU9VVCAgICAgICAoNCpvYmRfdGltZW91dCkKKyNkZWZpbmUgT0JEX0lSX01HU19USU1FT1VUICAgICAgICg0ICogb2JkX3RpbWVvdXQpCiAjZGVmaW5lIExPTkdfVU5MSU5LIDMwMAkgIC8qIFVubGluayBzaG91bGQgaGFwcGVuIGJlZm9yZSBub3cgKi8KIAogLyoqCkBAIC0zMTgsNiArMzE2LDEwIEBACiAjZGVmaW5lIE9CRF9GQUlMX0xETE1fQUdMX05PTE9DSwkgMHgzMWIKICNkZWZpbmUgT0JEX0ZBSUxfTERMTV9PU1RfTFZCCQkgMHgzMWMKICNkZWZpbmUgT0JEX0ZBSUxfTERMTV9FTlFVRVVFX0hBTkcJIDB4MzFkCisjZGVmaW5lIE9CRF9GQUlMX0xETE1fQ1BfQ0JfV0FJVDIJIDB4MzIwCisjZGVmaW5lIE9CRF9GQUlMX0xETE1fQ1BfQ0JfV0FJVDMJIDB4MzIxCisjZGVmaW5lIE9CRF9GQUlMX0xETE1fQ1BfQ0JfV0FJVDQJIDB4MzIyCisjZGVmaW5lIE9CRF9GQUlMX0xETE1fQ1BfQ0JfV0FJVDUJIDB4MzIzCiAKIC8qIExPQ0tMRVNTIElPICovCiAjZGVmaW5lIE9CRF9GQUlMX0xETE1fU0VUX0NPTlRFTlRJT04gICAgIDB4Mzg1CkBAIC00MDAsNiArNDAyLDcgQEAKICNkZWZpbmUgT0JEX0ZBSUxfTURDX0dFVEFUVFJfRU5RVUVVRSAgICAgMHg4MDMKICNkZWZpbmUgT0JEX0ZBSUxfTURDX1JQQ1NfU0VNCQkgMHg4MDQKICNkZWZpbmUgT0JEX0ZBSUxfTURDX0xJR0hUV0VJR0hUCSAweDgwNQorI2RlZmluZSBPQkRfRkFJTF9NRENfQ0xPU0UJCSAweDgwNgogCiAjZGVmaW5lIE9CRF9GQUlMX01HUwkJICAgICAweDkwMAogI2RlZmluZSBPQkRfRkFJTF9NR1NfQUxMX1JFUVVFU1RfTkVUICAgICAweDkwMQpAQCAtNDU1LDYgKzQ1OCw3IEBACiAjZGVmaW5lIE9CRF9GQUlMX0xPVl9JTklUCQkJICAgIDB4MTQwMwogI2RlZmluZSBPQkRfRkFJTF9HTElNUFNFX0RFTEFZCQkJICAgIDB4MTQwNAogI2RlZmluZSBPQkRfRkFJTF9MTElURV9YQVRUUl9FTk9NRU0JCSAgICAweDE0MDUKKyNkZWZpbmUgT0JEX0ZBSUxfR0VUQVRUUl9ERUxBWQkJCSAgICAweDE0MDkKIAogI2RlZmluZSBPQkRfRkFJTF9GSURfSU5ESVIJMHgxNTAxCiAjZGVmaW5lIE9CRF9GQUlMX0ZJRF9JTkxNQQkweDE1MDIKQEAgLTQ3NCwxMSArNDc4LDE2IEBACiAjZGVmaW5lIE9CRF9GQUlMX0xGU0NLX0NSQVNICQkweDE2MGEKICNkZWZpbmUgT0JEX0ZBSUxfTEZTQ0tfTk9fQVVUTwkJMHgxNjBiCiAjZGVmaW5lIE9CRF9GQUlMX0xGU0NLX05PX0RPVUJMRVNDQU4JMHgxNjBjCisjZGVmaW5lIE9CRF9GQUlMX0xGU0NLX0lOVkFMSURfUEZJRAkweDE2MTkKKyNkZWZpbmUgT0JEX0ZBSUxfTEZTQ0tfQkFEX05BTUVfSEFTSAkweDE2MjgKIAogLyogVVBEQVRFICovCiAjZGVmaW5lIE9CRF9GQUlMX1VQREFURV9PQkpfTkVUCQkJMHgxNzAwCiAjZGVmaW5lIE9CRF9GQUlMX1VQREFURV9PQkpfTkVUX1JFUAkJMHgxNzAxCiAKKy8qIExNViAqLworI2RlZmluZSBPQkRfRkFJTF9VTktOT1dOX0xNVl9TVFJJUEUJCTB4MTkwMQorCiAvKiBBc3NpZ24gcmVmZXJlbmNlcyB0byBtb3ZlZCBjb2RlIHRvIHJlZHVjZSBjb2RlIGNoYW5nZXMgKi8KICNkZWZpbmUgT0JEX0ZBSUxfUFJFQ0hFQ0soaWQpCQkgICBDRlNfRkFJTF9QUkVDSEVDSyhpZCkKICNkZWZpbmUgT0JEX0ZBSUxfQ0hFQ0soaWQpCQkgICAgICBDRlNfRkFJTF9DSEVDSyhpZCkKQEAgLTUyMCw3ICs1MjksOCBAQAogCVBPSVNPTl9QVFIocHRyKTsJCQkJCQkgICAgICBcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIEtFWV9JUyhzdHIpIFwKLQkoa2V5bGVuID49IChzaXplb2Yoc3RyKS0xKSAmJiBtZW1jbXAoa2V5LCBzdHIsIChzaXplb2Yoc3RyKS0xKSkgPT0gMCkKKyNkZWZpbmUgS0VZX0lTKHN0cikJCQkJCVwKKwkoa2V5bGVuID49IChzaXplb2Yoc3RyKSAtIDEpICYmCQkJXAorCW1lbWNtcChrZXksIHN0ciwgKHNpemVvZihzdHIpIC0gMSkpID09IDApCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9pbnRlcnZhbF90cmVlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2ludGVydmFsX3RyZWUuYwppbmRleCBmNGE3MGViLi5lMTM0ZWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2ludGVydmFsX3RyZWUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2ludGVydmFsX3RyZWUuYwpAQCAtOTAsNiArOTAsMTcgQEAKIAlyZXR1cm4gKGUxLT5zdGFydCA9PSBlMi0+c3RhcnQpICYmIChlMS0+ZW5kID09IGUyLT5lbmQpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBleHRlbnRfb3ZlcmxhcHBlZChzdHJ1Y3QgaW50ZXJ2YWxfbm9kZV9leHRlbnQgKmUxLAorCQkJCSAgICBzdHJ1Y3QgaW50ZXJ2YWxfbm9kZV9leHRlbnQgKmUyKQoreworCXJldHVybiAoZTEtPnN0YXJ0IDw9IGUyLT5lbmQpICYmIChlMi0+c3RhcnQgPD0gZTEtPmVuZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5vZGVfZXF1YWwoc3RydWN0IGludGVydmFsX25vZGUgKm4xLCBzdHJ1Y3QgaW50ZXJ2YWxfbm9kZSAqbjIpCit7CisJcmV0dXJuIGV4dGVudF9lcXVhbCgmbjEtPmluX2V4dGVudCwgJm4yLT5pbl9leHRlbnQpOworfQorCiBzdGF0aWMgaW5saW5lIF9fdTY0IG1heF91NjQoX191NjQgeCwgX191NjQgeSkKIHsKIAlyZXR1cm4geCA+IHkgPyB4IDogeTsKQEAgLTI2Miw3ICsyNzMsNyBAQAogCXAgPSByb290OwogCXdoaWxlICgqcCkgewogCQlwYXJlbnQgPSAqcDsKLQkJaWYgKGV4dGVudF9lcXVhbCgmcGFyZW50LT5pbl9leHRlbnQsICZub2RlLT5pbl9leHRlbnQpKQorCQlpZiAobm9kZV9lcXVhbChwYXJlbnQsIG5vZGUpKQogCQkJcmV0dXJuIHBhcmVudDsKIAogCQkvKiBtYXhfaGlnaCBmaWVsZCBtdXN0IGJlIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBpdGVyYXRpb24gKi8KQEAgLTQ2MywzICs0NzQsOTAgQEAKIAkJaW50ZXJ2YWxfZXJhc2VfY29sb3IoY2hpbGQsIHBhcmVudCwgcm9vdCk7CiB9CiBFWFBPUlRfU1lNQk9MKGludGVydmFsX2VyYXNlKTsKKworc3RhdGljIGlubGluZSBpbnQgaW50ZXJ2YWxfbWF5X292ZXJsYXAoc3RydWN0IGludGVydmFsX25vZGUgKm5vZGUsCisJCQkJICAgICAgIHN0cnVjdCBpbnRlcnZhbF9ub2RlX2V4dGVudCAqZXh0KQoreworCXJldHVybiAoZXh0LT5zdGFydCA8PSBub2RlLT5pbl9tYXhfaGlnaCAmJgorCQlleHQtPmVuZCA+PSBpbnRlcnZhbF9sb3cobm9kZSkpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBmaW5kcyBhbGwgaW50ZXJ2YWxzIHRoYXQgb3ZlcmxhcCBpbnRlcnZhbCBleHQsCisgKiBhbmQgY2FsbHMgZnVuYyB0byBoYW5kbGUgcmVzdWx0ZWQgaW50ZXJ2YWxzIG9uZSBieSBvbmUuCisgKiBpbiBsdXN0cmUsIHRoaXMgZnVuY3Rpb24gd2lsbCBmaW5kIGFsbCBjb25mbGljdGluZyBsb2NrcyBpbgorICogdGhlIGdyYW50ZWQgcXVldWUgYW5kIGFkZCB0aGVzZSBsb2NrcyB0byB0aGUgYXN0IHdvcmsgbGlzdC4KKyAqCisgKiB7CisgKglpZiAoIW5vZGUpCisgKgkJcmV0dXJuIDA7CisgKglpZiAoZXh0LT5lbmQgPCBpbnRlcnZhbF9sb3cobm9kZSkpIHsKKyAqCQlpbnRlcnZhbF9zZWFyY2gobm9kZS0+aW5fbGVmdCwgZXh0LCBmdW5jLCBkYXRhKTsKKyAqCX0gZWxzZSBpZiAoaW50ZXJ2YWxfbWF5X292ZXJsYXAobm9kZSwgZXh0KSkgeworICoJCWlmIChleHRlbnRfb3ZlcmxhcHBlZChleHQsICZub2RlLT5pbl9leHRlbnQpKQorICoJCQlmdW5jKG5vZGUsIGRhdGEpOworICoJCWludGVydmFsX3NlYXJjaChub2RlLT5pbl9sZWZ0LCBleHQsIGZ1bmMsIGRhdGEpOworICoJCWludGVydmFsX3NlYXJjaChub2RlLT5pbl9yaWdodCwgZXh0LCBmdW5jLCBkYXRhKTsKKyAqCX0KKyAqCXJldHVybiAwOworICogfQorICoKKyAqLworZW51bSBpbnRlcnZhbF9pdGVyIGludGVydmFsX3NlYXJjaChzdHJ1Y3QgaW50ZXJ2YWxfbm9kZSAqbm9kZSwKKwkJCQkgICBzdHJ1Y3QgaW50ZXJ2YWxfbm9kZV9leHRlbnQgKmV4dCwKKwkJCQkgICBpbnRlcnZhbF9jYWxsYmFja190IGZ1bmMsCisJCQkJICAgdm9pZCAqZGF0YSkKK3sKKwllbnVtIGludGVydmFsX2l0ZXIgcmMgPSBJTlRFUlZBTF9JVEVSX0NPTlQ7CisJc3RydWN0IGludGVydmFsX25vZGUgKnBhcmVudDsKKworCUxBU1NFUlQoZXh0KTsKKwlMQVNTRVJUKGZ1bmMpOworCisJd2hpbGUgKG5vZGUpIHsKKwkJaWYgKGV4dC0+ZW5kIDwgaW50ZXJ2YWxfbG93KG5vZGUpKSB7CisJCQlpZiAobm9kZS0+aW5fbGVmdCkgeworCQkJCW5vZGUgPSBub2RlLT5pbl9sZWZ0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UgaWYgKGludGVydmFsX21heV9vdmVybGFwKG5vZGUsIGV4dCkpIHsKKwkJCWlmIChleHRlbnRfb3ZlcmxhcHBlZChleHQsICZub2RlLT5pbl9leHRlbnQpKSB7CisJCQkJcmMgPSBmdW5jKG5vZGUsIGRhdGEpOworCQkJCWlmIChyYyA9PSBJTlRFUlZBTF9JVEVSX1NUT1ApCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAobm9kZS0+aW5fbGVmdCkgeworCQkJCW5vZGUgPSBub2RlLT5pbl9sZWZ0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKG5vZGUtPmluX3JpZ2h0KSB7CisJCQkJbm9kZSA9IG5vZGUtPmluX3JpZ2h0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJcGFyZW50ID0gbm9kZS0+aW5fcGFyZW50OworCQl3aGlsZSAocGFyZW50KSB7CisJCQlpZiAobm9kZV9pc19sZWZ0X2NoaWxkKG5vZGUpICYmCisJCQkgICAgcGFyZW50LT5pbl9yaWdodCkgeworCQkJCS8qCisJCQkJICogSWYgd2UgZXZlciBnb3QgdGhlIGxlZnQsIGl0IG1lYW5zIHRoYXQgdGhlCisJCQkJICogcGFyZW50IG1ldCBleHQtPmVuZDxpbnRlcnZhbF9sb3cocGFyZW50KSwgb3IKKwkJCQkgKiBtYXlfb3ZlcmxhcChwYXJlbnQpLiBJZiB0aGUgZm9ybWVyIGlzIHRydWUsCisJCQkJICogd2UgbmVlZG4ndCBnbyBiYWNrLiBTbyBzdG9wIGVhcmx5IGFuZCBjaGVjaworCQkJCSAqIG1heV9vdmVybGFwKHBhcmVudCkgYWZ0ZXIgdGhpcyBsb29wLgorCQkJCSAqLworCQkJCW5vZGUgPSBwYXJlbnQtPmluX3JpZ2h0OworCQkJCWJyZWFrOworCQkJfQorCQkJbm9kZSA9IHBhcmVudDsKKwkJCXBhcmVudCA9IHBhcmVudC0+aW5fcGFyZW50OworCQl9CisJCWlmICghcGFyZW50IHx8ICFpbnRlcnZhbF9tYXlfb3ZlcmxhcChwYXJlbnQsIGV4dCkpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKGludGVydmFsX3NlYXJjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xfbG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sX2xvY2suYwppbmRleCBlYTg4NDBjLi4zODQ1ZjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xfbG9jay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbF9sb2NrLmMKQEAgLTQ1LDYgKzQ1LDggQEAKICAqIGJlaW5nIGFuIGF0b21pYyBvcGVyYXRpb24uCiAgKi8KIHN0cnVjdCBsZGxtX3Jlc291cmNlICpsb2NrX3Jlc19hbmRfbG9jayhzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrKQorCQkJCV9fYWNxdWlyZXMoJmxvY2stPmxfbG9jaykKKwkJCQlfX2FjcXVpcmVzKCZsb2NrLT5sX3Jlc291cmNlLT5scl9sb2NrKQogewogCXNwaW5fbG9jaygmbG9jay0+bF9sb2NrKTsKIApAQCAtNTksNiArNjEsOCBAQAogICogVW5sb2NrIGEgbG9jayBhbmQgaXRzIHJlc291cmNlIHByZXZpb3VzbHkgbG9ja2VkIHdpdGggbG9ja19yZXNfYW5kX2xvY2sKICAqLwogdm9pZCB1bmxvY2tfcmVzX2FuZF9sb2NrKHN0cnVjdCBsZGxtX2xvY2sgKmxvY2spCisJCV9fcmVsZWFzZXMoJmxvY2stPmxfcmVzb3VyY2UtPmxyX2xvY2spCisJCV9fcmVsZWFzZXMoJmxvY2stPmxfbG9jaykKIHsKIAkvKiBvbiBzZXJ2ZXItc2lkZSByZXNvdXJjZSBvZiBsb2NrIGRvZXNuJ3QgY2hhbmdlICovCiAJbGRsbV9jbGVhcl9yZXNfbG9ja2VkKGxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2V4dGVudC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2V4dGVudC5jCmluZGV4IGY1MDIzZDkuLmVjZjQ3MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9leHRlbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fZXh0ZW50LmMKQEAgLTIyMSw3ICsyMjEsNyBAQAogfQogCiB2b2lkIGxkbG1fZXh0ZW50X3BvbGljeV93aXJlX3RvX2xvY2FsKGNvbnN0IGxkbG1fd2lyZV9wb2xpY3lfZGF0YV90ICp3cG9saWN5LAotCQkJCSAgICAgbGRsbV9wb2xpY3lfZGF0YV90ICpscG9saWN5KQorCQkJCSAgICAgIGxkbG1fcG9saWN5X2RhdGFfdCAqbHBvbGljeSkKIHsKIAltZW1zZXQobHBvbGljeSwgMCwgc2l6ZW9mKCpscG9saWN5KSk7CiAJbHBvbGljeS0+bF9leHRlbnQuc3RhcnQgPSB3cG9saWN5LT5sX2V4dGVudC5zdGFydDsKQEAgLTIzMCw3ICsyMzAsNyBAQAogfQogCiB2b2lkIGxkbG1fZXh0ZW50X3BvbGljeV9sb2NhbF90b193aXJlKGNvbnN0IGxkbG1fcG9saWN5X2RhdGFfdCAqbHBvbGljeSwKLQkJCQkgICAgIGxkbG1fd2lyZV9wb2xpY3lfZGF0YV90ICp3cG9saWN5KQorCQkJCSAgICAgIGxkbG1fd2lyZV9wb2xpY3lfZGF0YV90ICp3cG9saWN5KQogewogCW1lbXNldCh3cG9saWN5LCAwLCBzaXplb2YoKndwb2xpY3kpKTsKIAl3cG9saWN5LT5sX2V4dGVudC5zdGFydCA9IGxwb2xpY3ktPmxfZXh0ZW50LnN0YXJ0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2Zsb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fZmxvY2suYwppbmRleCBkNmI2MWJjLi44NjFmMzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fZmxvY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fZmxvY2suYwpAQCAtOTcsNyArOTcsNyBAQAogCUxBU1NFUlQoaGxpc3RfdW5oYXNoZWQoJmxvY2stPmxfZXhwX2Zsb2NrX2hhc2gpKTsKIAogCWxpc3RfZGVsX2luaXQoJmxvY2stPmxfcmVzX2xpbmspOwotCWlmIChmbGFncyA9PSBMRExNX0ZMX1dBSVRfTk9SRVBST0MgJiYgIWxkbG1faXNfZmFpbGVkKGxvY2spKSB7CisJaWYgKGZsYWdzID09IExETE1fRkxfV0FJVF9OT1JFUFJPQykgewogCQkvKiBjbGllbnQgc2lkZSAtIHNldCBhIGZsYWcgdG8gcHJldmVudCBzZW5kaW5nIGEgQ0FOQ0VMICovCiAJCWxvY2stPmxfZmxhZ3MgfD0gTERMTV9GTF9MT0NBTF9PTkxZIHwgTERMTV9GTF9DQlBFTkRJTkc7CiAKQEAgLTE2Niw3ICsxNjYsNyBAQAogCQkgKi8KIAkJbGlzdF9mb3JfZWFjaCh0bXAsICZyZXMtPmxyX2dyYW50ZWQpIHsKIAkJCWxvY2sgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGxkbG1fbG9jaywKLQkJCQkJICAgICAgbF9yZXNfbGluayk7CisJCQkJCSAgbF9yZXNfbGluayk7CiAJCQlpZiAobGRsbV9zYW1lX2Zsb2NrX293bmVyKGxvY2ssIHJlcSkpIHsKIAkJCQlvd25sb2NrcyA9IHRtcDsKIAkJCQlicmVhazsKQEAgLTE4Miw3ICsxODIsNyBAQAogCQkgKi8KIAkJbGlzdF9mb3JfZWFjaCh0bXAsICZyZXMtPmxyX2dyYW50ZWQpIHsKIAkJCWxvY2sgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGxkbG1fbG9jaywKLQkJCQkJICAgICAgbF9yZXNfbGluayk7CisJCQkJCSAgbF9yZXNfbGluayk7CiAKIAkJCWlmIChsZGxtX3NhbWVfZmxvY2tfb3duZXIobG9jaywgcmVxKSkgewogCQkJCWlmICghb3dubG9ja3MpCkBAIC0zMzksMTAgKzMzOSwxMCBAQAogCQkJCQkJbG9jay0+bF9ncmFudGVkX21vZGUsICZudWxsX2NicywKIAkJCQkJCU5VTEwsIDAsIExWQl9UX05PTkUpOwogCQkJbG9ja19yZXNfYW5kX2xvY2socmVxKTsKLQkJCWlmICghbmV3MikgeworCQkJaWYgKElTX0VSUihuZXcyKSkgewogCQkJCWxkbG1fZmxvY2tfZGVzdHJveShyZXEsIGxvY2stPmxfZ3JhbnRlZF9tb2RlLAogCQkJCQkJICAgKmZsYWdzKTsKLQkJCQkqZXJyID0gLUVOT0xDSzsKKwkJCQkqZXJyID0gUFRSX0VSUihuZXcyKTsKIAkJCQlyZXR1cm4gTERMTV9JVEVSX1NUT1A7CiAJCQl9CiAJCQlnb3RvIHJlcHJvY2VzczsKQEAgLTQ1NSwyOSArNDU1LDIyIEBACiAJZW51bSBsZGxtX2Vycm9yCQkgICAgZXJyOwogCWludAkJCSAgICAgcmMgPSAwOwogCisJT0JEX0ZBSUxfVElNRU9VVChPQkRfRkFJTF9MRExNX0NQX0NCX1dBSVQyLCA0KTsKKwlpZiAoT0JEX0ZBSUxfUFJFQ0hFQ0soT0JEX0ZBSUxfTERMTV9DUF9DQl9XQUlUMykpIHsKKwkJbG9ja19yZXNfYW5kX2xvY2sobG9jayk7CisJCWxvY2stPmxfZmxhZ3MgfD0gTERMTV9GTF9GQUlMX0xPQzsKKwkJdW5sb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKKwkJT0JEX0ZBSUxfVElNRU9VVChPQkRfRkFJTF9MRExNX0NQX0NCX1dBSVQzLCA0KTsKKwl9CiAJQ0RFQlVHKERfRExNVFJBQ0UsICJmbGFnczogMHglbGx4IGRhdGE6ICVwIGdldGxrOiAlcFxuIiwKIAkgICAgICAgZmxhZ3MsIGRhdGEsIGdldGxrKTsKIAotCS8qIEltcG9ydCBpbnZhbGlkYXRpb24uIFdlIG5lZWQgdG8gYWN0dWFsbHkgcmVsZWFzZSB0aGUgbG9jawotCSAqIHJlZmVyZW5jZXMgYmVpbmcgaGVsZCwgc28gdGhhdCBpdCBjYW4gZ28gYXdheS4gTm8gcG9pbnQgaW4KLQkgKiBob2xkaW5nIHRoZSBsb2NrIGV2ZW4gaWYgYXBwIHN0aWxsIGJlbGlldmVzIGl0IGhhcyBpdCwgc2luY2UKLQkgKiBzZXJ2ZXIgYWxyZWFkeSBkcm9wcGVkIGl0IGFueXdheS4gT25seSBmb3IgZ3JhbnRlZCBsb2NrcyB0b28uCi0JICovCi0JaWYgKChsb2NrLT5sX2ZsYWdzICYgKExETE1fRkxfRkFJTEVEfExETE1fRkxfTE9DQUxfT05MWSkpID09Ci0JICAgIChMRExNX0ZMX0ZBSUxFRHxMRExNX0ZMX0xPQ0FMX09OTFkpKSB7Ci0JCWlmIChsb2NrLT5sX3JlcV9tb2RlID09IGxvY2stPmxfZ3JhbnRlZF9tb2RlICYmCi0JCSAgICBsb2NrLT5sX2dyYW50ZWRfbW9kZSAhPSBMQ0tfTkwgJiYgIWRhdGEpCi0JCQlsZGxtX2xvY2tfZGVjcmVmX2ludGVybmFsKGxvY2ssIGxvY2stPmxfcmVxX21vZGUpOwotCi0JCS8qIE5lZWQgdG8gd2FrZSB1cCB0aGUgd2FpdGVyIGlmIHdlIHdlcmUgZXZpY3RlZCAqLwotCQl3YWtlX3VwKCZsb2NrLT5sX3dhaXRxKTsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJTEFTU0VSVChmbGFncyAhPSBMRExNX0ZMX1dBSVRfTk9SRVBST0MpOwogCi0JaWYgKCEoZmxhZ3MgJiAoTERMTV9GTF9CTE9DS19XQUlUIHwgTERMTV9GTF9CTE9DS19HUkFOVEVEIHwKLQkJICAgICAgIExETE1fRkxfQkxPQ0tfQ09OVikpKSB7CisJaWYgKGZsYWdzICYgTERMTV9GTF9GQUlMRUQpCisJCWdvdG8gZ3JhbnRlZDsKKworCWlmICghKGZsYWdzICYgTERMTV9GTF9CTE9DS0VEX01BU0spKSB7CiAJCWlmICghZGF0YSkKIAkJCS8qIG1kcyBncmFudGVkIHRoZSBsb2NrIGluIHRoZSByZXBseSAqLwogCQkJZ290byBncmFudGVkOwpAQCAtNTE0LDEyICs1MDcsMjEgQEAKIGdyYW50ZWQ6CiAJT0JEX0ZBSUxfVElNRU9VVChPQkRfRkFJTF9MRExNX0NQX0NCX1dBSVQsIDEwKTsKIAotCWlmIChsZGxtX2lzX2ZhaWxlZChsb2NrKSkgewotCQlMRExNX0RFQlVHKGxvY2ssICJjbGllbnQtc2lkZSBlbnF1ZXVlIHdha2luZyB1cDogZmFpbGVkIik7Ci0JCXJldHVybiAtRUlPOworCWlmIChPQkRfRkFJTF9QUkVDSEVDSyhPQkRfRkFJTF9MRExNX0NQX0NCX1dBSVQ0KSkgeworCQlsb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKKwkJLyogREVBRExPQ0sgaXMgYWx3YXlzIHNldCB3aXRoIENCUEVORElORyAqLworCQlsb2NrLT5sX2ZsYWdzIHw9IExETE1fRkxfRkxPQ0tfREVBRExPQ0sgfCBMRExNX0ZMX0NCUEVORElORzsKKwkJdW5sb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKKwkJT0JEX0ZBSUxfVElNRU9VVChPQkRfRkFJTF9MRExNX0NQX0NCX1dBSVQ0LCA0KTsKIAl9Ci0KLQlMRExNX0RFQlVHKGxvY2ssICJjbGllbnQtc2lkZSBlbnF1ZXVlIGdyYW50ZWQiKTsKKwlpZiAoT0JEX0ZBSUxfUFJFQ0hFQ0soT0JEX0ZBSUxfTERMTV9DUF9DQl9XQUlUNSkpIHsKKwkJbG9ja19yZXNfYW5kX2xvY2sobG9jayk7CisJCS8qIERFQURMT0NLIGlzIGFsd2F5cyBzZXQgd2l0aCBDQlBFTkRJTkcgKi8KKwkJbG9jay0+bF9mbGFncyB8PSBMRExNX0ZMX0ZBSUxfTE9DIHwKKwkJCQkgTERMTV9GTF9GTE9DS19ERUFETE9DSyB8IExETE1fRkxfQ0JQRU5ESU5HOworCQl1bmxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOworCQlPQkRfRkFJTF9USU1FT1VUKE9CRF9GQUlMX0xETE1fQ1BfQ0JfV0FJVDUsIDQpOworCX0KIAogCWxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOwogCkBAIC01MzAsMjAgKzUzMiw1OSBAQAogCWlmIChsZGxtX2lzX2Rlc3Ryb3llZChsb2NrKSkgewogCQl1bmxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOwogCQlMRExNX0RFQlVHKGxvY2ssICJjbGllbnQtc2lkZSBlbnF1ZXVlIHdha2luZyB1cDogZGVzdHJveWVkIik7Ci0JCXJldHVybiAwOworCQkvKgorCQkgKiBBbiBlcnJvciBpcyBzdGlsbCB0byBiZSByZXR1cm5lZCwgdG8gcHJvcGFnYXRlIGl0IHVwIHRvCisJCSAqIGxkbG1fY2xpX2VucXVldWVfZmluaSgpIGNhbGxlci4KKwkJICovCisJCXJldHVybiAtRUlPOwogCX0KIAogCS8qIGxkbG1fbG9ja19lbnF1ZXVlKCkgaGFzIGFscmVhZHkgcGxhY2VkIGxvY2sgb24gdGhlIGdyYW50ZWQgbGlzdC4gKi8KLQlsaXN0X2RlbF9pbml0KCZsb2NrLT5sX3Jlc19saW5rKTsKKwlsZGxtX3Jlc291cmNlX3VubGlua19sb2NrKGxvY2spOwogCi0JaWYgKGxkbG1faXNfZmxvY2tfZGVhZGxvY2sobG9jaykpIHsKLQkJTERMTV9ERUJVRyhsb2NrLCAiY2xpZW50LXNpZGUgZW5xdWV1ZSBkZWFkbG9jayByZWNlaXZlZCIpOwotCQlyYyA9IC1FREVBRExLOwotCX0gZWxzZSBpZiAoZmxhZ3MgJiBMRExNX0ZMX1RFU1RfTE9DSykgeworCS8qCisJICogSW1wb3J0IGludmFsaWRhdGlvbi4gV2UgbmVlZCB0byBhY3R1YWxseSByZWxlYXNlIHRoZSBsb2NrCisJICogcmVmZXJlbmNlcyBiZWluZyBoZWxkLCBzbyB0aGF0IGl0IGNhbiBnbyBhd2F5LiBObyBwb2ludCBpbgorCSAqIGhvbGRpbmcgdGhlIGxvY2sgZXZlbiBpZiBhcHAgc3RpbGwgYmVsaWV2ZXMgaXQgaGFzIGl0LCBzaW5jZQorCSAqIHNlcnZlciBhbHJlYWR5IGRyb3BwZWQgaXQgYW55d2F5LiBPbmx5IGZvciBncmFudGVkIGxvY2tzIHRvby4KKwkgKi8KKwkvKiBEbyB0aGUgc2FtZSBmb3IgREVBRExPQ0snZWQgbG9ja3MuICovCisJaWYgKGxkbG1faXNfZmFpbGVkKGxvY2spIHx8IGxkbG1faXNfZmxvY2tfZGVhZGxvY2sobG9jaykpIHsKKwkJaW50IG1vZGU7CisKKwkJaWYgKGZsYWdzICYgTERMTV9GTF9URVNUX0xPQ0spCisJCQlMQVNTRVJUKGxkbG1faXNfdGVzdF9sb2NrKGxvY2spKTsKKworCQlpZiAobGRsbV9pc190ZXN0X2xvY2sobG9jaykgfHwgbGRsbV9pc19mbG9ja19kZWFkbG9jayhsb2NrKSkKKwkJCW1vZGUgPSBnZXRsay0+ZmxfdHlwZTsKKwkJZWxzZQorCQkJbW9kZSA9IGxvY2stPmxfZ3JhbnRlZF9tb2RlOworCisJCWlmIChsZGxtX2lzX2Zsb2NrX2RlYWRsb2NrKGxvY2spKSB7CisJCQlMRExNX0RFQlVHKGxvY2ssICJjbGllbnQtc2lkZSBlbnF1ZXVlIGRlYWRsb2NrIHJlY2VpdmVkIik7CisJCQlyYyA9IC1FREVBRExLOworCQl9CisJCWxkbG1fZmxvY2tfZGVzdHJveShsb2NrLCBtb2RlLCBMRExNX0ZMX1dBSVRfTk9SRVBST0MpOworCQl1bmxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOworCisJCS8qIE5lZWQgdG8gd2FrZSB1cCB0aGUgd2FpdGVyIGlmIHdlIHdlcmUgZXZpY3RlZCAqLworCQl3YWtlX3VwKCZsb2NrLT5sX3dhaXRxKTsKKworCQkvKgorCQkgKiBBbiBlcnJvciBpcyBzdGlsbCB0byBiZSByZXR1cm5lZCwgdG8gcHJvcGFnYXRlIGl0IHVwIHRvCisJCSAqIGxkbG1fY2xpX2VucXVldWVfZmluaSgpIGNhbGxlci4KKwkJICovCisJCXJldHVybiByYyA/IDogLUVJTzsKKwl9CisKKwlMRExNX0RFQlVHKGxvY2ssICJjbGllbnQtc2lkZSBlbnF1ZXVlIGdyYW50ZWQiKTsKKworCWlmIChmbGFncyAmIExETE1fRkxfVEVTVF9MT0NLKSB7CiAJCS8qIGZjbnRsKEZfR0VUTEspIHJlcXVlc3QgKi8KIAkJLyogVGhlIG9sZCBtb2RlIHdhcyBzYXZlZCBpbiBnZXRsay0+ZmxfdHlwZSBzbyB0aGF0IGlmIHRoZSBtb2RlCiAJCSAqIGluIHRoZSBsb2NrIGNoYW5nZXMgd2UgY2FuIGRlY3JlZiB0aGUgYXBwcm9wcmlhdGUgcmVmY291bnQuCiAJCSAqLworCQlMQVNTRVJUKGxkbG1faXNfdGVzdF9sb2NrKGxvY2spKTsKIAkJbGRsbV9mbG9ja19kZXN0cm95KGxvY2ssIGdldGxrLT5mbF90eXBlLCBMRExNX0ZMX1dBSVRfTk9SRVBST0MpOwogCQlzd2l0Y2ggKGxvY2stPmxfZ3JhbnRlZF9tb2RlKSB7CiAJCWNhc2UgTENLX1BSOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1faW50ZXJuYWwuaAppbmRleCBlNGNmNjVkLi41ZTgyY2ZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1faW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1faW50ZXJuYWwuaApAQCAtMTAwLDkgKzEwMCwxMCBAQAogaW50IGxkbG1fY2FuY2VsX2xydShzdHJ1Y3QgbGRsbV9uYW1lc3BhY2UgKm5zLCBpbnQgbnIsCiAJCSAgICBlbnVtIGxkbG1fY2FuY2VsX2ZsYWdzIHN5bmMsIGludCBmbGFncyk7CiBpbnQgbGRsbV9jYW5jZWxfbHJ1X2xvY2FsKHN0cnVjdCBsZGxtX25hbWVzcGFjZSAqbnMsCi0JCQkgc3RydWN0IGxpc3RfaGVhZCAqY2FuY2VscywgaW50IGNvdW50LCBpbnQgbWF4LAotCQkJIGVudW0gbGRsbV9jYW5jZWxfZmxhZ3MgY2FuY2VsX2ZsYWdzLCBpbnQgZmxhZ3MpOwotZXh0ZXJuIGludCBsZGxtX2VucXVldWVfbWluOworCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpjYW5jZWxzLCBpbnQgY291bnQsIGludCBtYXgsCisJCQkgIGVudW0gbGRsbV9jYW5jZWxfZmxhZ3MgY2FuY2VsX2ZsYWdzLCBpbnQgZmxhZ3MpOworZXh0ZXJuIHVuc2lnbmVkIGludCBsZGxtX2VucXVldWVfbWluOworZXh0ZXJuIHVuc2lnbmVkIGludCBsZGxtX2NhbmNlbF91bnVzZWRfbG9ja3NfYmVmb3JlX3JlcGxheTsKIAogLyogbGRsbV9yZXNvdXJjZS5jICovCiBpbnQgbGRsbV9yZXNvdXJjZV9wdXRyZWZfbG9ja2VkKHN0cnVjdCBsZGxtX3Jlc291cmNlICpyZXMpOwpAQCAtMjAwLDggKzIwMSw3IEBACiAKIAlMQVNTRVJUKCFsaXN0X2VtcHR5KCZub2RlLT5saV9ncm91cCkpOwogCi0JbG9jayA9IGxpc3RfZW50cnkobm9kZS0+bGlfZ3JvdXAubmV4dCwgc3RydWN0IGxkbG1fbG9jaywKLQkJCSAgICAgIGxfc2xfcG9saWN5KTsKKwlsb2NrID0gbGlzdF9lbnRyeShub2RlLT5saV9ncm91cC5uZXh0LCBzdHJ1Y3QgbGRsbV9sb2NrLCBsX3NsX3BvbGljeSk7CiAJcmV0dXJuICZsb2NrLT5sX3BvbGljeV9kYXRhLmxfZXh0ZW50OwogfQogCkBAIC0zMDIsNyArMzAyLDcgQEAKIAogCWxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOwogCWlmICgobG9jay0+bF9yZXFfbW9kZSA9PSBsb2NrLT5sX2dyYW50ZWRfbW9kZSkgJiYKLQkgICAgICFsZGxtX2lzX2NwX3JlcWQobG9jaykpCisJICAgICFsZGxtX2lzX2NwX3JlcWQobG9jaykpCiAJCXJldCA9IDE7CiAJZWxzZSBpZiAobGRsbV9pc19mYWlsZWQobG9jaykgfHwgbGRsbV9pc19jYW5jZWwobG9jaykpCiAJCXJldCA9IDE7CkBAIC0zMjYsMTMgKzMyNiwxMyBAQAogdm9pZCBsZGxtX2liaXRzX3BvbGljeV9sb2NhbF90b193aXJlKGNvbnN0IGxkbG1fcG9saWN5X2RhdGFfdCAqbHBvbGljeSwKIAkJCQkgICAgIGxkbG1fd2lyZV9wb2xpY3lfZGF0YV90ICp3cG9saWN5KTsKIHZvaWQgbGRsbV9leHRlbnRfcG9saWN5X3dpcmVfdG9fbG9jYWwoY29uc3QgbGRsbV93aXJlX3BvbGljeV9kYXRhX3QgKndwb2xpY3ksCi0JCQkJICAgICBsZGxtX3BvbGljeV9kYXRhX3QgKmxwb2xpY3kpOworCQkJCSAgICAgIGxkbG1fcG9saWN5X2RhdGFfdCAqbHBvbGljeSk7CiB2b2lkIGxkbG1fZXh0ZW50X3BvbGljeV9sb2NhbF90b193aXJlKGNvbnN0IGxkbG1fcG9saWN5X2RhdGFfdCAqbHBvbGljeSwKLQkJCQkgICAgIGxkbG1fd2lyZV9wb2xpY3lfZGF0YV90ICp3cG9saWN5KTsKKwkJCQkgICAgICBsZGxtX3dpcmVfcG9saWN5X2RhdGFfdCAqd3BvbGljeSk7CiB2b2lkIGxkbG1fZmxvY2tfcG9saWN5X3dpcmUxOF90b19sb2NhbChjb25zdCBsZGxtX3dpcmVfcG9saWN5X2RhdGFfdCAqd3BvbGljeSwKLQkJCQkgICAgIGxkbG1fcG9saWN5X2RhdGFfdCAqbHBvbGljeSk7CisJCQkJICAgICAgIGxkbG1fcG9saWN5X2RhdGFfdCAqbHBvbGljeSk7CiB2b2lkIGxkbG1fZmxvY2tfcG9saWN5X3dpcmUyMV90b19sb2NhbChjb25zdCBsZGxtX3dpcmVfcG9saWN5X2RhdGFfdCAqd3BvbGljeSwKLQkJCQkgICAgIGxkbG1fcG9saWN5X2RhdGFfdCAqbHBvbGljeSk7CisJCQkJICAgICAgIGxkbG1fcG9saWN5X2RhdGFfdCAqbHBvbGljeSk7CiAKIHZvaWQgbGRsbV9mbG9ja19wb2xpY3lfbG9jYWxfdG9fd2lyZShjb25zdCBsZGxtX3BvbGljeV9kYXRhX3QgKmxwb2xpY3ksCiAJCQkJICAgICBsZGxtX3dpcmVfcG9saWN5X2RhdGFfdCAqd3BvbGljeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbGliLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbGliLmMKaW5kZXggN2M4MzJhYS4uMTUzZTk5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xpYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9saWIuYwpAQCAtODIsNyArODIsNyBAQAogCQkJaWYgKHByaW9yaXR5KSB7CiAJCQkJbGlzdF9kZWwoJml0ZW0tPm9pY19pdGVtKTsKIAkJCQlsaXN0X2FkZCgmaXRlbS0+b2ljX2l0ZW0sCi0JCQkJCSAgICAgJmltcC0+aW1wX2Nvbm5fbGlzdCk7CisJCQkJCSAmaW1wLT5pbXBfY29ubl9saXN0KTsKIAkJCQlpdGVtLT5vaWNfbGFzdF9hdHRlbXB0ID0gMDsKIAkJCX0KIAkJCUNERUJVRyhEX0hBLCAiaW1wICVwQCVzOiBmb3VuZCBleGlzdGluZyBjb25uICVzJXNcbiIsCkBAIC0xMDIsNyArMTAyLDcgQEAKIAkJCWxpc3RfYWRkKCZpbXBfY29ubi0+b2ljX2l0ZW0sICZpbXAtPmltcF9jb25uX2xpc3QpOwogCQllbHNlCiAJCQlsaXN0X2FkZF90YWlsKCZpbXBfY29ubi0+b2ljX2l0ZW0sCi0JCQkJCSAgJmltcC0+aW1wX2Nvbm5fbGlzdCk7CisJCQkJICAgICAgJmltcC0+aW1wX2Nvbm5fbGlzdCk7CiAJCUNERUJVRyhEX0hBLCAiaW1wICVwQCVzOiBhZGQgY29ubmVjdGlvbiAlcyBhdCAlc1xuIiwKIAkJICAgICAgIGltcCwgaW1wLT5pbXBfb2JkLT5vYmRfbmFtZSwgdXVpZC0+dXVpZCwKIAkJICAgICAgIChwcmlvcml0eSA/ICJoZWFkIiA6ICJ0YWlsIikpOwpAQCAtMjk5LDEyICsyOTksMTQgQEAKIAkgICAgICAgbWluX3QodW5zaWduZWQgaW50LCBMVVNUUkVfQ0ZHX0JVRkxFTihsY2ZnLCAyKSwKIAkJICAgICBzaXplb2Yoc2VydmVyX3V1aWQpKSk7CiAKLQljbGktPmNsX2RpcnR5ID0gMDsKKwljbGktPmNsX2RpcnR5X3BhZ2VzID0gMDsKIAljbGktPmNsX2F2YWlsX2dyYW50ID0gMDsKLQkvKiBGSVhNRTogU2hvdWxkIGxpbWl0IHRoaXMgZm9yIHRoZSBzdW0gb2YgYWxsIGNsX2RpcnR5X21heC4gKi8KLQljbGktPmNsX2RpcnR5X21heCA9IE9TQ19NQVhfRElSVFlfREVGQVVMVCAqIDEwMjQgKiAxMDI0OwotCWlmIChjbGktPmNsX2RpcnR5X21heCA+PiBQQUdFX1NISUZUID4gdG90YWxyYW1fcGFnZXMgLyA4KQotCQljbGktPmNsX2RpcnR5X21heCA9IHRvdGFscmFtX3BhZ2VzIDw8IChQQUdFX1NISUZUIC0gMyk7CisJLyogRklYTUU6IFNob3VsZCBsaW1pdCB0aGlzIGZvciB0aGUgc3VtIG9mIGFsbCBjbF9kaXJ0eV9tYXhfcGFnZXMuICovCisJLyoKKwkgKiBjbF9kaXJ0eV9tYXhfcGFnZXMgbWF5IGJlIGNoYW5nZWQgYXQgY29ubmVjdCB0aW1lIGluCisJICogcHRscnBjX2Nvbm5lY3RfaW50ZXJwcmV0KCkuCisJICovCisJY2xpZW50X2FkanVzdF9tYXhfZGlydHkoY2xpKTsKIAlJTklUX0xJU1RfSEVBRCgmY2xpLT5jbF9jYWNoZV93YWl0ZXJzKTsKIAlJTklUX0xJU1RfSEVBRCgmY2xpLT5jbF9sb2lfcmVhZHlfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmNsaS0+Y2xfbG9pX2hwX3JlYWR5X2xpc3QpOwpAQCAtMzI2LDExICszMjgsMTEgQEAKIAkvKiBscnUgZm9yIG9zYy4gKi8KIAlJTklUX0xJU1RfSEVBRCgmY2xpLT5jbF9scnVfb3NjKTsKIAlhdG9taWNfc2V0KCZjbGktPmNsX2xydV9zaHJpbmtlcnMsIDApOwotCWF0b21pY19zZXQoJmNsaS0+Y2xfbHJ1X2J1c3ksIDApOwotCWF0b21pY19zZXQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QsIDApOworCWF0b21pY19sb25nX3NldCgmY2xpLT5jbF9scnVfYnVzeSwgMCk7CisJYXRvbWljX2xvbmdfc2V0KCZjbGktPmNsX2xydV9pbl9saXN0LCAwKTsKIAlJTklUX0xJU1RfSEVBRCgmY2xpLT5jbF9scnVfbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJmNsaS0+Y2xfbHJ1X2xpc3RfbG9jayk7Ci0JYXRvbWljX3NldCgmY2xpLT5jbF91bnN0YWJsZV9jb3VudCwgMCk7CisJYXRvbWljX2xvbmdfc2V0KCZjbGktPmNsX3Vuc3RhYmxlX2NvdW50LCAwKTsKIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNsaS0+Y2xfZGVzdHJveV93YWl0cSk7CiAJYXRvbWljX3NldCgmY2xpLT5jbF9kZXN0cm95X2luX2ZsaWdodCwgMCk7CkBAIC0zNjAsNyArMzYyLDcgQEAKIAljbGktPmNsX2NodW5rYml0cyA9IFBBR0VfU0hJRlQ7CiAKIAlpZiAoIXN0cmNtcChuYW1lLCBMVVNUUkVfTURDX05BTUUpKSB7Ci0JCWNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0ID0gTURDX01BWF9SSUZfREVGQVVMVDsKKwkJY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQgPSBPQkRfTUFYX1JJRl9ERUZBVUxUOwogCX0gZWxzZSBpZiAodG90YWxyYW1fcGFnZXMgPj4gKDIwIC0gUEFHRV9TSElGVCkgPD0gMTI4IC8qIE1CICovKSB7CiAJCWNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0ID0gMjsKIAl9IGVsc2UgaWYgKHRvdGFscmFtX3BhZ2VzID4+ICgyMCAtIFBBR0VfU0hJRlQpIDw9IDI1NiAvKiBNQiAqLykgewpAQCAtMzY4LDcgKzM3MCw3IEBACiAJfSBlbHNlIGlmICh0b3RhbHJhbV9wYWdlcyA+PiAoMjAgLSBQQUdFX1NISUZUKSA8PSA1MTIgLyogTUIgKi8pIHsKIAkJY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQgPSA0OwogCX0gZWxzZSB7Ci0JCWNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0ID0gT1NDX01BWF9SSUZfREVGQVVMVDsKKwkJY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQgPSBPQkRfTUFYX1JJRl9ERUZBVUxUOwogCX0KIAlyYyA9IGxkbG1fZ2V0X3JlZigpOwogCWlmIChyYykgewpAQCAtNTM0LDcgKzUzNiw3IEBACiAJaW1wID0gY2xpLT5jbF9pbXBvcnQ7CiAKIAlkb3duX3dyaXRlKCZjbGktPmNsX3NlbSk7Ci0JQ0RFQlVHKERfSU5GTywgImRpc2Nvbm5lY3QgJXMgLSAlZFxuIiwgb2JkLT5vYmRfbmFtZSwKKwlDREVCVUcoRF9JTkZPLCAiZGlzY29ubmVjdCAlcyAtICV6dVxuIiwgb2JkLT5vYmRfbmFtZSwKIAkgICAgICAgY2xpLT5jbF9jb25uX2NvdW50KTsKIAogCWlmICghY2xpLT5jbF9jb25uX2NvdW50KSB7CkBAIC02OTAsNyArNjkyLDcgQEAKIAlpZiAocnMtPnJzX3RyYW5zbm8gPiBleHAtPmV4cF9sYXN0X2NvbW1pdHRlZCkgewogCQkvKiBub3QgY29tbWl0dGVkIGFscmVhZHkgKi8KIAkJbGlzdF9hZGRfdGFpbCgmcnMtPnJzX29iZF9saXN0LAotCQkJCSAgJmV4cC0+ZXhwX3VuY29tbWl0dGVkX3JlcGxpZXMpOworCQkJICAgICAgJmV4cC0+ZXhwX3VuY29tbWl0dGVkX3JlcGxpZXMpOwogCX0KIAlzcGluX3VubG9jaygmZXhwLT5leHBfdW5jb21taXR0ZWRfcmVwbGllc19sb2NrKTsKIApAQCAtNzk1LDcgKzc5Nyw3IEBACiAJCUNFUlJPUigiZHVtcGluZyBsb2NrcyBmb3IgZXhwb3J0ICVwLGlnbm9yZSBpZiB0aGUgdW5tb3VudCBkb2Vzbid0IGhhbmdcbiIsCiAJCSAgICAgICBleHApOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2ssICZleHAtPmV4cF9sb2Nrc19saXN0LAotCQkJCQlsX2V4cF9yZWZzX2xpbmspCisJCQkJICAgIGxfZXhwX3JlZnNfbGluaykKIAkJCUxETE1fRVJST1IobG9jaywgImxvY2s6Iik7CiAJfQogCXNwaW5fdW5sb2NrKCZleHAtPmV4cF9sb2Nrc19saXN0X2d1YXJkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9sb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9jay5jCmluZGV4IGE1OTkzZjcuLjNjNDhiNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9sb2NrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2suYwpAQCAtNDgxLDggKzQ4MSw4IEBACiAJdW5sb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKIAogCW5ld3JlcyA9IGxkbG1fcmVzb3VyY2VfZ2V0KG5zLCBOVUxMLCBuZXdfcmVzaWQsIHR5cGUsIDEpOwotCWlmICghbmV3cmVzKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoSVNfRVJSKG5ld3JlcykpCisJCXJldHVybiBQVFJfRVJSKG5ld3Jlcyk7CiAKIAlsdV9yZWZfYWRkKCZuZXdyZXMtPmxyX3JlZmVyZW5jZSwgImxvY2siLCBsb2NrKTsKIAkvKgpAQCAtNTQyLDcgKzU0Miw3IEBACiAKIAlMQVNTRVJUKGhhbmRsZSk7CiAKLQlsb2NrID0gY2xhc3NfaGFuZGxlMm9iamVjdChoYW5kbGUtPmNvb2tpZSk7CisJbG9jayA9IGNsYXNzX2hhbmRsZTJvYmplY3QoaGFuZGxlLT5jb29raWUsIE5VTEwpOwogCWlmICghbG9jaykKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTkzNyw3ICs5MzcsNyBAQAogCQkJCS8qIGdvIHRvIG5leHQgcG9saWN5IGdyb3VwIHdpdGhpbiBtb2RlIGdyb3VwICovCiAJCQkJdG1wID0gcG9saWN5X2VuZC0+bF9yZXNfbGluay5uZXh0OwogCQkJCWxvY2sgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGxkbG1fbG9jaywKLQkJCQkJCSAgICAgIGxfcmVzX2xpbmspOworCQkJCQkJICBsX3Jlc19saW5rKTsKIAkJCX0gIC8qIGxvb3Agb3ZlciBwb2xpY3kgZ3JvdXBzIHdpdGhpbiB0aGUgbW9kZSBncm91cCAqLwogCiAJCQkvKiBpbnNlcnQgcG9pbnQgaXMgbGFzdCBsb2NrIG9mIHRoZSBtb2RlIGdyb3VwLApAQCAtMTAyOCwxNSArMTAyOCwyOCBAQAogCWNoZWNrX3Jlc19sb2NrZWQocmVzKTsKIAogCWxvY2stPmxfZ3JhbnRlZF9tb2RlID0gbG9jay0+bF9yZXFfbW9kZTsKKworCWlmICh3b3JrX2xpc3QgJiYgbG9jay0+bF9jb21wbGV0aW9uX2FzdCkKKwkJbGRsbV9hZGRfYXN0X3dvcmtfaXRlbShsb2NrLCBOVUxMLCB3b3JrX2xpc3QpOworCiAJaWYgKHJlcy0+bHJfdHlwZSA9PSBMRExNX1BMQUlOIHx8IHJlcy0+bHJfdHlwZSA9PSBMRExNX0lCSVRTKQogCQlsZGxtX2dyYW50X2xvY2tfd2l0aF9za2lwbGlzdChsb2NrKTsKIAllbHNlIGlmIChyZXMtPmxyX3R5cGUgPT0gTERMTV9FWFRFTlQpCiAJCWxkbG1fZXh0ZW50X2FkZF9sb2NrKHJlcywgbG9jayk7Ci0JZWxzZQorCWVsc2UgaWYgKHJlcy0+bHJfdHlwZSA9PSBMRExNX0ZMT0NLKSB7CisJCS8qCisJCSAqIFdlIHNob3VsZCBub3QgYWRkIGxvY2tzIHRvIGdyYW50ZWQgbGlzdCBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgorCQkgKiAtIHRoaXMgaXMgYW4gVU5MT0NLIGJ1dCBub3QgYSByZWFsIGxvY2s7CisJCSAqIC0gdGhpcyBpcyBhIFRFU1QgbG9jazsKKwkJICogLSB0aGlzIGlzIGEgRl9DQU5DRUxMSyBsb2NrIChhc3luYyBmbG9jayBoYXMgcmVxX21vZGUgPT0gMCkKKwkJICogLSB0aGlzIGlzIGEgZGVhZGxvY2sgKGZsb2NrIGNhbm5vdCBiZSBncmFudGVkKQorCQkgKi8KKwkJaWYgKCFsb2NrLT5sX3JlcV9tb2RlIHx8IGxvY2stPmxfcmVxX21vZGUgPT0gTENLX05MIHx8CisJCSAgICBsZGxtX2lzX3Rlc3RfbG9jayhsb2NrKSB8fCBsZGxtX2lzX2Zsb2NrX2RlYWRsb2NrKGxvY2spKQorCQkJcmV0dXJuOwogCQlsZGxtX3Jlc291cmNlX2FkZF9sb2NrKHJlcywgJnJlcy0+bHJfZ3JhbnRlZCwgbG9jayk7Ci0KLQlpZiAod29ya19saXN0ICYmIGxvY2stPmxfY29tcGxldGlvbl9hc3QpCi0JCWxkbG1fYWRkX2FzdF93b3JrX2l0ZW0obG9jaywgTlVMTCwgd29ya19saXN0KTsKKwl9IGVsc2UKKwkJTEJVRygpOwogCiAJbGRsbV9wb29sX2FkZCgmbGRsbV9yZXNfdG9fbnMocmVzKS0+bnNfcG9vbCwgbG9jayk7CiB9CkBAIC0xMTAzLDcgKzExMTYsNyBAQAogCQkgKiBvZiBiaXRzLgogCQkgKi8KIAkJaWYgKGxvY2stPmxfcmVzb3VyY2UtPmxyX3R5cGUgPT0gTERMTV9JQklUUyAmJgotCQkgICAgICgobG9jay0+bF9wb2xpY3lfZGF0YS5sX2lub2RlYml0cy5iaXRzICYKKwkJICAgICgobG9jay0+bF9wb2xpY3lfZGF0YS5sX2lub2RlYml0cy5iaXRzICYKIAkJICAgICAgcG9saWN5LT5sX2lub2RlYml0cy5iaXRzKSAhPQogCQkgICAgICBwb2xpY3ktPmxfaW5vZGViaXRzLmJpdHMpKQogCQkJY29udGludWU7CkBAIC0xMjE0LDcgKzEyMjcsNyBAQAogCX0KIAogCXJlcyA9IGxkbG1fcmVzb3VyY2VfZ2V0KG5zLCBOVUxMLCByZXNfaWQsIHR5cGUsIDApOwotCWlmICghcmVzKSB7CisJaWYgKElTX0VSUihyZXMpKSB7CiAJCUxBU1NFUlQoIW9sZF9sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTM2MywxMiArMTM3NiwxMiBAQAogCQlpZiAoc2l6ZSA9PSBzaXplb2Yoc3RydWN0IG9zdF9sdmIpKSB7CiAJCQlpZiAobG9jID09IFJDTF9DTElFTlQpCiAJCQkJbHZiID0gcmVxX2NhcHN1bGVfY2xpZW50X3N3YWJfZ2V0KHBpbGwsCi0JCQkJCQkmUk1GX0RMTV9MVkIsCi0JCQkJCQlsdXN0cmVfc3dhYl9vc3RfbHZiKTsKKwkJCQkJCQkJICAmUk1GX0RMTV9MVkIsCisJCQkJCQkJbHVzdHJlX3N3YWJfb3N0X2x2Yik7CiAJCQllbHNlCiAJCQkJbHZiID0gcmVxX2NhcHN1bGVfc2VydmVyX3N3YWJfZ2V0KHBpbGwsCi0JCQkJCQkmUk1GX0RMTV9MVkIsCi0JCQkJCQlsdXN0cmVfc3dhYl9vc3RfbHZiKTsKKwkJCQkJCQkJICAmUk1GX0RMTV9MVkIsCisJCQkJCQkJbHVzdHJlX3N3YWJfb3N0X2x2Yik7CiAJCQlpZiAodW5saWtlbHkoIWx2YikpIHsKIAkJCQlMRExNX0VSUk9SKGxvY2ssICJubyBMVkIiKTsKIAkJCQlyZXR1cm4gLUVQUk9UTzsKQEAgLTEzODAsOCArMTM5Myw4IEBACiAKIAkJCWlmIChsb2MgPT0gUkNMX0NMSUVOVCkKIAkJCQlsdmIgPSByZXFfY2Fwc3VsZV9jbGllbnRfc3dhYl9nZXQocGlsbCwKLQkJCQkJCSZSTUZfRExNX0xWQiwKLQkJCQkJCWx1c3RyZV9zd2FiX29zdF9sdmJfdjEpOworCQkJCQkJCQkgICZSTUZfRExNX0xWQiwKKwkJCQkJCQlsdXN0cmVfc3dhYl9vc3RfbHZiX3YxKTsKIAkJCWVsc2UKIAkJCQlsdmIgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfc3dhYl9nZXQocGlsbCwKIAkJCQkJCSZSTUZfRExNX0xWQiwgc2l6ZSwKQEAgLTE0MDUsMTIgKzE0MTgsMTIgQEAKIAkJaWYgKHNpemUgPT0gc2l6ZW9mKHN0cnVjdCBscXVvdGFfbHZiKSkgewogCQkJaWYgKGxvYyA9PSBSQ0xfQ0xJRU5UKQogCQkJCWx2YiA9IHJlcV9jYXBzdWxlX2NsaWVudF9zd2FiX2dldChwaWxsLAotCQkJCQkJJlJNRl9ETE1fTFZCLAotCQkJCQkJbHVzdHJlX3N3YWJfbHF1b3RhX2x2Yik7CisJCQkJCQkJCSAgJlJNRl9ETE1fTFZCLAorCQkJCQkJCWx1c3RyZV9zd2FiX2xxdW90YV9sdmIpOwogCQkJZWxzZQogCQkJCWx2YiA9IHJlcV9jYXBzdWxlX3NlcnZlcl9zd2FiX2dldChwaWxsLAotCQkJCQkJJlJNRl9ETE1fTFZCLAotCQkJCQkJbHVzdHJlX3N3YWJfbHF1b3RhX2x2Yik7CisJCQkJCQkJCSAgJlJNRl9ETE1fTFZCLAorCQkJCQkJCWx1c3RyZV9zd2FiX2xxdW90YV9sdmIpOwogCQkJaWYgKHVubGlrZWx5KCFsdmIpKSB7CiAJCQkJTERMTV9FUlJPUihsb2NrLCAibm8gTFZCIik7CiAJCQkJcmV0dXJuIC1FUFJPVE87CkBAIC0xNDYyLDE1ICsxNDc1LDE1IEBACiB7CiAJc3RydWN0IGxkbG1fbG9jayAqbG9jazsKIAlzdHJ1Y3QgbGRsbV9yZXNvdXJjZSAqcmVzOworCWludCByYzsKIAogCXJlcyA9IGxkbG1fcmVzb3VyY2VfZ2V0KG5zLCBOVUxMLCByZXNfaWQsIHR5cGUsIDEpOwotCWlmICghcmVzKQotCQlyZXR1cm4gTlVMTDsKKwlpZiAoSVNfRVJSKHJlcykpCisJCXJldHVybiBFUlJfQ0FTVChyZXMpOwogCiAJbG9jayA9IGxkbG1fbG9ja19uZXcocmVzKTsKLQogCWlmICghbG9jaykKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJbG9jay0+bF9yZXFfbW9kZSA9IG1vZGU7CiAJbG9jay0+bF9hc3RfZGF0YSA9IGRhdGE7CkBAIC0xNDg0LDI3ICsxNDk3LDMzIEBACiAJbG9jay0+bF90cmVlX25vZGUgPSBOVUxMOwogCS8qIGlmIHRoaXMgaXMgdGhlIGV4dGVudCBsb2NrLCBhbGxvY2F0ZSB0aGUgaW50ZXJ2YWwgdHJlZSBub2RlICovCiAJaWYgKHR5cGUgPT0gTERMTV9FWFRFTlQpIHsKLQkJaWYgKCFsZGxtX2ludGVydmFsX2FsbG9jKGxvY2spKQorCQlpZiAoIWxkbG1faW50ZXJ2YWxfYWxsb2MobG9jaykpIHsKKwkJCXJjID0gLUVOT01FTTsKIAkJCWdvdG8gb3V0OworCQl9CiAJfQogCiAJaWYgKGx2Yl9sZW4pIHsKIAkJbG9jay0+bF9sdmJfbGVuID0gbHZiX2xlbjsKIAkJbG9jay0+bF9sdmJfZGF0YSA9IGt6YWxsb2MobHZiX2xlbiwgR0ZQX05PRlMpOwotCQlpZiAoIWxvY2stPmxfbHZiX2RhdGEpCisJCWlmICghbG9jay0+bF9sdmJfZGF0YSkgeworCQkJcmMgPSAtRU5PTUVNOwogCQkJZ290byBvdXQ7CisJCX0KIAl9CiAKIAlsb2NrLT5sX2x2Yl90eXBlID0gbHZiX3R5cGU7Ci0JaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX0xETE1fTkVXX0xPQ0spKQorCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MRExNX05FV19MT0NLKSkgeworCQlyYyA9IC1FTk9FTlQ7CiAJCWdvdG8gb3V0OworCX0KIAogCXJldHVybiBsb2NrOwogCiBvdXQ6CiAJbGRsbV9sb2NrX2Rlc3Ryb3kobG9jayk7CiAJTERMTV9MT0NLX1JFTEVBU0UobG9jayk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIEVSUl9QVFIocmMpOwogfQogCiAvKioKQEAgLTE1MjIsMTYgKzE1NDEsMTMgQEAKIAlzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrID0gKmxvY2twOwogCXN0cnVjdCBsZGxtX3Jlc291cmNlICpyZXMgPSBsb2NrLT5sX3Jlc291cmNlOwogCi0JbG9jay0+bF9sYXN0X2FjdGl2aXR5ID0ga3RpbWVfZ2V0X3JlYWxfc2Vjb25kcygpOwotCiAJbG9ja19yZXNfYW5kX2xvY2sobG9jayk7CiAJaWYgKGxvY2stPmxfcmVxX21vZGUgPT0gbG9jay0+bF9ncmFudGVkX21vZGUpIHsKIAkJLyogVGhlIHNlcnZlciByZXR1cm5lZCBhIGJsb2NrZWQgbG9jaywgYnV0IGl0IHdhcyBncmFudGVkCiAJCSAqIGJlZm9yZSB3ZSBnb3QgYSBjaGFuY2UgdG8gYWN0dWFsbHkgZW5xdWV1ZSBpdC4gIFdlIGRvbid0CiAJCSAqIG5lZWQgdG8gZG8gYW55dGhpbmcgZWxzZS4KIAkJICovCi0JCSpmbGFncyAmPSB+KExETE1fRkxfQkxPQ0tfR1JBTlRFRCB8Ci0JCQkgICAgTERMTV9GTF9CTE9DS19DT05WIHwgTERMTV9GTF9CTE9DS19XQUlUKTsKKwkJKmZsYWdzICY9IH5MRExNX0ZMX0JMT0NLRURfTUFTSzsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xNTQ2LDYgKzE1NjIsOCBAQAogCSAqLwogCWlmICgqZmxhZ3MgJiBMRExNX0ZMX0FTVF9ESVNDQVJEX0RBVEEpCiAJCWxkbG1fc2V0X2FzdF9kaXNjYXJkX2RhdGEobG9jayk7CisJaWYgKCpmbGFncyAmIExETE1fRkxfVEVTVF9MT0NLKQorCQlsZGxtX3NldF90ZXN0X2xvY2sobG9jayk7CiAKIAkvKgogCSAqIFRoaXMgZGlzdGluY3Rpb24gYmV0d2VlbiBsb2NhbCBsb2NrIHRyZWVzIGlzIHZlcnkgaW1wb3J0YW50OyBhIGNsaWVudApAQCAtMTY4OCw3ICsxNzA2LDcgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlnbF93b3JrID0gbGlzdF9lbnRyeShhcmctPmxpc3QtPm5leHQsIHN0cnVjdCBsZGxtX2dsaW1wc2Vfd29yaywKLQkJCQkgZ2xfbGlzdCk7CisJCQkgICAgIGdsX2xpc3QpOwogCWxpc3RfZGVsX2luaXQoJmdsX3dvcmstPmdsX2xpc3QpOwogCiAJbG9jayA9IGdsX3dvcmstPmdsX2xvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9ja2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9sb2NrZC5jCmluZGV4IDgyMTkzOWYuLmZkZTY5N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9sb2NrZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9sb2NrZC5jCkBAIC01NTksOCArNTU5LDExIEBACiAKIAlzd2l0Y2ggKGx1c3RyZV9tc2dfZ2V0X29wYyhyZXEtPnJxX3JlcW1zZykpIHsKIAljYXNlIExETE1fQkxfQ0FMTEJBQ0s6Ci0JCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MRExNX0JMX0NBTExCQUNLX05FVCkpCisJCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MRExNX0JMX0NBTExCQUNLX05FVCkpIHsKKwkJCWlmIChjZnNfZmFpbF9lcnIpCisJCQkJbGRsbV9jYWxsYmFja19yZXBseShyZXEsIC0oaW50KWNmc19mYWlsX2Vycik7CiAJCQlyZXR1cm4gMDsKKwkJfQogCQlicmVhazsKIAljYXNlIExETE1fQ1BfQ0FMTEJBQ0s6CiAJCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MRExNX0NQX0NBTExCQUNLX05FVCkpCkBAIC03MDYsMTIgKzcwOSwxMiBAQAogCWlmICghbGlzdF9lbXB0eSgmYmxwLT5ibHBfbGlzdCkgJiYKIAkgICAgKGxpc3RfZW1wdHkoJmJscC0+YmxwX3ByaW9fbGlzdCkgfHwgbnVtX2JsID09IDApKQogCQlibHdpID0gbGlzdF9lbnRyeShibHAtPmJscF9saXN0Lm5leHQsCi0JCQkJICAgICAgc3RydWN0IGxkbG1fYmxfd29ya19pdGVtLCBibHdpX2VudHJ5KTsKKwkJCQkgIHN0cnVjdCBsZGxtX2JsX3dvcmtfaXRlbSwgYmx3aV9lbnRyeSk7CiAJZWxzZQogCQlpZiAoIWxpc3RfZW1wdHkoJmJscC0+YmxwX3ByaW9fbGlzdCkpCiAJCQlibHdpID0gbGlzdF9lbnRyeShibHAtPmJscF9wcmlvX2xpc3QubmV4dCwKLQkJCQkJICAgICAgc3RydWN0IGxkbG1fYmxfd29ya19pdGVtLAotCQkJCQkgICAgICBibHdpX2VudHJ5KTsKKwkJCQkJICBzdHJ1Y3QgbGRsbV9ibF93b3JrX2l0ZW0sCisJCQkJCSAgYmx3aV9lbnRyeSk7CiAKIAlpZiAoYmx3aSkgewogCQlpZiAoKytudW1fYmwgPj0gYXRvbWljX3JlYWQoJmJscC0+YmxwX251bV90aHJlYWRzKSkKQEAgLTc0MSw3ICs3NDQsNyBAQAogCWluaXRfY29tcGxldGlvbigmYmx0ZC5ibHRkX2NvbXApOwogCWJsdGQuYmx0ZF9udW0gPSBhdG9taWNfcmVhZCgmYmxwLT5ibHBfbnVtX3RocmVhZHMpOwogCXNucHJpbnRmKGJsdGQuYmx0ZF9uYW1lLCBzaXplb2YoYmx0ZC5ibHRkX25hbWUpLAotCQkibGRsbV9ibF8lMDJkIiwgYmx0ZC5ibHRkX251bSk7CisJCSAibGRsbV9ibF8lMDJkIiwgYmx0ZC5ibHRkX251bSk7CiAJdGFzayA9IGt0aHJlYWRfcnVuKGxkbG1fYmxfdGhyZWFkX21haW4sICZibHRkLCAiJXMiLCBibHRkLmJsdGRfbmFtZSk7CiAJaWYgKElTX0VSUih0YXNrKSkgewogCQlDRVJST1IoImNhbm5vdCBzdGFydCBMRExNIHRocmVhZCBsZGxtX2JsXyUwMmQ6IHJjICVsZFxuIiwKQEAgLTc4Niw4ICs3ODksOCBAQAogCQlpZiAoIWJsd2kpIHsKIAkJCWF0b21pY19kZWMoJmJscC0+YmxwX2J1c3lfdGhyZWFkcyk7CiAJCQlsX3dhaXRfZXZlbnRfZXhjbHVzaXZlKGJscC0+YmxwX3dhaXRxLAotCQkJCQkgKGJsd2kgPSBsZGxtX2JsX2dldF93b3JrKGJscCkpLAotCQkJCQkgJmx3aSk7CisJCQkJCSAgICAgICAoYmx3aSA9IGxkbG1fYmxfZ2V0X3dvcmsoYmxwKSksCisJCQkJCSAgICAgICAmbHdpKTsKIAkJCWJ1c3kgPSBhdG9taWNfaW5jX3JldHVybigmYmxwLT5ibHBfYnVzeV90aHJlYWRzKTsKIAkJfSBlbHNlIHsKIAkJCWJ1c3kgPSBhdG9taWNfcmVhZCgmYmxwLT5ibHBfYnVzeV90aHJlYWRzKTsKQEAgLTg3NCw4ICs4NzcsNiBAQAogfQogRVhQT1JUX1NZTUJPTChsZGxtX3B1dF9yZWYpOwogCi1leHRlcm4gdW5zaWduZWQgaW50IGxkbG1fY2FuY2VsX3VudXNlZF9sb2Nrc19iZWZvcmVfcmVwbGF5OwotCiBzdGF0aWMgc3NpemVfdCBjYW5jZWxfdW51c2VkX2xvY2tzX2JlZm9yZV9yZXBsYXlfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKIAkJCQkJCSAgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCiAJCQkJCQkgICAgICBjaGFyICpidWYpCkBAIC0xMDk0LDE2ICsxMDk1LDE3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJbGRsbV9sb2NrX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibGRsbV9sb2NrcyIsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IGxkbG1fbG9jayksIDAsCi0JCQkgICAgICBTTEFCX0hXQ0FDSEVfQUxJR04gfCBTTEFCX0RFU1RST1lfQllfUkNVLCBOVUxMKTsKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBsZGxtX2xvY2spLCAwLAorCQkJCQkgICBTTEFCX0hXQ0FDSEVfQUxJR04gfAorCQkJCQkgICBTTEFCX0RFU1RST1lfQllfUkNVLCBOVUxMKTsKIAlpZiAoIWxkbG1fbG9ja19zbGFiKSB7CiAJCWttZW1fY2FjaGVfZGVzdHJveShsZGxtX3Jlc291cmNlX3NsYWIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlsZGxtX2ludGVydmFsX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaW50ZXJ2YWxfbm9kZSIsCi0JCQkJCXNpemVvZihzdHJ1Y3QgbGRsbV9pbnRlcnZhbCksCi0JCQkJCTAsIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7CisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGxkbG1faW50ZXJ2YWwpLAorCQkJCQkgICAgICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKIAlpZiAoIWxkbG1faW50ZXJ2YWxfc2xhYikgewogCQlrbWVtX2NhY2hlX2Rlc3Ryb3kobGRsbV9yZXNvdXJjZV9zbGFiKTsKIAkJa21lbV9jYWNoZV9kZXN0cm95KGxkbG1fbG9ja19zbGFiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9wb29sLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcG9vbC5jCmluZGV4IDY1N2VkNDAuLjlhMTEzNmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcG9vbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9wb29sLmMKQEAgLTM1NywzOCArMzU3LDQwIEBACiAJaW50IGNvdW50OwogCiAJcmVjYWxjX2ludGVydmFsX3NlYyA9IGt0aW1lX2dldF9zZWNvbmRzKCkgLSBwbC0+cGxfcmVjYWxjX3RpbWU7Ci0JaWYgKHJlY2FsY19pbnRlcnZhbF9zZWMgPD0gMCkKLQkJZ290byByZWNhbGM7Ci0KLQlzcGluX2xvY2soJnBsLT5wbF9sb2NrKTsKIAlpZiAocmVjYWxjX2ludGVydmFsX3NlYyA+IDApIHsKLQkJLyoKLQkJICogVXBkYXRlIHBvb2wgc3RhdGlzdGljcyBldmVyeSAxcy4KLQkJICovCi0JCWxkbG1fcG9vbF9yZWNhbGNfc3RhdHMocGwpOworCQlzcGluX2xvY2soJnBsLT5wbF9sb2NrKTsKKwkJcmVjYWxjX2ludGVydmFsX3NlYyA9IGt0aW1lX2dldF9zZWNvbmRzKCkgLSBwbC0+cGxfcmVjYWxjX3RpbWU7CiAKLQkJLyoKLQkJICogWmVybyBvdXQgYWxsIHJhdGVzIGFuZCBzcGVlZCBmb3IgdGhlIGxhc3QgcGVyaW9kLgotCQkgKi8KLQkJYXRvbWljX3NldCgmcGwtPnBsX2dyYW50X3JhdGUsIDApOwotCQlhdG9taWNfc2V0KCZwbC0+cGxfY2FuY2VsX3JhdGUsIDApOworCQlpZiAocmVjYWxjX2ludGVydmFsX3NlYyA+IDApIHsKKwkJCS8qCisJCQkgKiBVcGRhdGUgcG9vbCBzdGF0aXN0aWNzIGV2ZXJ5IDFzLgorCQkJICovCisJCQlsZGxtX3Bvb2xfcmVjYWxjX3N0YXRzKHBsKTsKKworCQkJLyoKKwkJCSAqIFplcm8gb3V0IGFsbCByYXRlcyBhbmQgc3BlZWQgZm9yIHRoZSBsYXN0IHBlcmlvZC4KKwkJCSAqLworCQkJYXRvbWljX3NldCgmcGwtPnBsX2dyYW50X3JhdGUsIDApOworCQkJYXRvbWljX3NldCgmcGwtPnBsX2NhbmNlbF9yYXRlLCAwKTsKKwkJfQorCQlzcGluX3VubG9jaygmcGwtPnBsX2xvY2spOwogCX0KLQlzcGluX3VubG9jaygmcGwtPnBsX2xvY2spOwogCi0gcmVjYWxjOgogCWlmIChwbC0+cGxfb3BzLT5wb19yZWNhbGMpIHsKIAkJY291bnQgPSBwbC0+cGxfb3BzLT5wb19yZWNhbGMocGwpOwogCQlscHJvY2ZzX2NvdW50ZXJfYWRkKHBsLT5wbF9zdGF0cywgTERMTV9QT09MX1JFQ0FMQ19TVEFULAogCQkJCSAgICBjb3VudCk7CiAJfQorCiAJcmVjYWxjX2ludGVydmFsX3NlYyA9IHBsLT5wbF9yZWNhbGNfdGltZSAtIGt0aW1lX2dldF9zZWNvbmRzKCkgKwogCQkJICAgICAgcGwtPnBsX3JlY2FsY19wZXJpb2Q7CiAJaWYgKHJlY2FsY19pbnRlcnZhbF9zZWMgPD0gMCkgeworCQkvKiBERUJVRzogc2hvdWxkIGJlIHJlLXJlbW92ZWQgYWZ0ZXIgTFUtNDUzNiBpcyBmaXhlZCAqLworCQlDREVCVUcoRF9ETE1UUkFDRSwgIiVzOiBOZWdhdGl2ZSBpbnRlcnZhbCglbGQpLCB0b28gc2hvcnQgcGVyaW9kKCVsZClcbiIsCisJCSAgICAgICBwbC0+cGxfbmFtZSwgKGxvbmcpcmVjYWxjX2ludGVydmFsX3NlYywKKwkJICAgICAgIChsb25nKXBsLT5wbF9yZWNhbGNfcGVyaW9kKTsKKwogCQkvKiBQcmV2ZW50IHRvbyBmcmVxdWVudCByZWNhbGN1bGF0aW9uLiAqLwotCQlDREVCVUcoRF9ETE1UUkFDRSwKLQkJICAgICAgICJOZWdhdGl2ZSBpbnRlcnZhbCglZCksIHRvbyBzaG9ydCBwZXJpb2QoJWxsZCkiLAotCQkgICAgICAgcmVjYWxjX2ludGVydmFsX3NlYywKLQkJICAgICAgIChzNjQpcGwtPnBsX3JlY2FsY19wZXJpb2QpOwogCQlyZWNhbGNfaW50ZXJ2YWxfc2VjID0gMTsKIAl9CiAKQEAgLTc5Miw3ICs3OTQsOCBAQAogICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBsZGxtX3Bvb2xzX2NvdW50KGxkbG1fc2lkZV90IGNsaWVudCwgZ2ZwX3QgZ2ZwX21hc2spCiB7Ci0JaW50IHRvdGFsID0gMCwgbnJfbnM7CisJdW5zaWduZWQgbG9uZyB0b3RhbCA9IDA7CisJaW50IG5yX25zOwogCXN0cnVjdCBsZGxtX25hbWVzcGFjZSAqbnM7CiAJc3RydWN0IGxkbG1fbmFtZXNwYWNlICpuc19vbGQgPSBOVUxMOyAvKiBsb29wIGRldGVjdGlvbiAqLwogCXZvaWQgKmNvb2tpZTsKQEAgLTk5NSw3ICs5OTgsNyBAQAogCXdha2VfdXAoJnRocmVhZC0+dF9jdGxfd2FpdHEpOwogCiAJQ0RFQlVHKERfRExNVFJBQ0UsICIlczogcG9vbCB0aHJlYWQgc3RhcnRpbmcsIHByb2Nlc3MgJWRcbiIsCi0JCSJsZGxtX3Bvb2xkIiwgY3VycmVudF9waWQoKSk7CisJICAgICAgICJsZGxtX3Bvb2xkIiwgY3VycmVudF9waWQoKSk7CiAKIAl3aGlsZSAoMSkgewogCQlzdHJ1Y3QgbF93YWl0X2luZm8gbHdpOwpAQCAtMTAyNSw3ICsxMDI4LDcgQEAKIAl3YWtlX3VwKCZ0aHJlYWQtPnRfY3RsX3dhaXRxKTsKIAogCUNERUJVRyhEX0RMTVRSQUNFLCAiJXM6IHBvb2wgdGhyZWFkIGV4aXRpbmcsIHByb2Nlc3MgJWRcbiIsCi0JCSJsZGxtX3Bvb2xkIiwgY3VycmVudF9waWQoKSk7CisJICAgICAgICJsZGxtX3Bvb2xkIiwgY3VycmVudF9waWQoKSk7CiAKIAljb21wbGV0ZV9hbmRfZXhpdCgmbGRsbV9wb29sc19jb21wLCAwKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9yZXF1ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVxdWVzdC5jCmluZGV4IGFmNDg3ZjkuLjM1YmE2ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3JlcXVlc3QuYwpAQCAtNjMsOCArNjMsOCBAQAogCiAjaW5jbHVkZSAibGRsbV9pbnRlcm5hbC5oIgogCi1pbnQgbGRsbV9lbnF1ZXVlX21pbiA9IE9CRF9USU1FT1VUX0RFRkFVTFQ7Ci1tb2R1bGVfcGFyYW0obGRsbV9lbnF1ZXVlX21pbiwgaW50LCAwNjQ0KTsKK3Vuc2lnbmVkIGludCBsZGxtX2VucXVldWVfbWluID0gT0JEX1RJTUVPVVRfREVGQVVMVDsKK21vZHVsZV9wYXJhbShsZGxtX2VucXVldWVfbWluLCB1aW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MobGRsbV9lbnF1ZXVlX21pbiwgImxvY2sgZW5xdWV1ZSB0aW1lb3V0IG1pbmltdW0iKTsKIAogLyogaW4gY2xpZW50IHNpZGUsIHdoZXRoZXIgdGhlIGNhY2hlZCBsb2NrcyB3aWxsIGJlIGNhbmNlbGVkIGJlZm9yZSByZXBsYXkgKi8KQEAgLTEyMyw0NCArMTIzLDU2IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogQ2FsY3VsYXRlIHRoZSBDb21wbGV0aW9uIHRpbWVvdXQgKGNvdmVyaW5nIGVucXVldWUsIEJMIEFTVCwgZGF0YSBmbHVzaCwKKyAqIGxvY2sgY2FuY2VsLCBhbmQgdGhlaXIgcmVwbGllcykuIFVzZWQgZm9yIGxvY2sgY29tcGxldGlvbiB0aW1lb3V0IG9uIHRoZQorICogY2xpZW50IHNpZGUuCisgKgorICogXHBhcmFtW2luXSBsb2NrCWxvY2sgd2hpY2ggaXMgd2FpdGluZyB0aGUgY29tcGxldGlvbiBjYWxsYmFjaworICoKKyAqIFxyZXR2YWwJCXRpbWVvdXQgaW4gc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgc2VydmVyIHJlcGx5CisgKi8KIC8qIFdlIHVzZSB0aGUgc2FtZSBiYXNpcyBmb3IgYm90aCBzZXJ2ZXIgc2lkZSBhbmQgY2xpZW50IHNpZGUgZnVuY3Rpb25zCiAgKiBmcm9tIGEgc2luZ2xlIG5vZGUuCiAgKi8KLXN0YXRpYyBpbnQgbGRsbV9nZXRfZW5xX3RpbWVvdXQoc3RydWN0IGxkbG1fbG9jayAqbG9jaykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGRsbV9jcF90aW1lb3V0KHN0cnVjdCBsZGxtX2xvY2sgKmxvY2spCiB7Ci0JaW50IHRpbWVvdXQgPSBhdF9nZXQobGRsbV9sb2NrX3RvX25zX2F0KGxvY2spKTsKKwl1bnNpZ25lZCBpbnQgdGltZW91dDsKIAogCWlmIChBVF9PRkYpCi0JCXJldHVybiBvYmRfdGltZW91dCAvIDI7Ci0JLyogU2luY2UgdGhlc2UgYXJlIG5vbi11cGRhdGluZyB0aW1lb3V0cywgd2Ugc2hvdWxkIGJlIGNvbnNlcnZhdGl2ZS4KLQkgKiBJdCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgc29tZSBraW5kIG9mICJlYXJseSByZXBseSIgbWVjaGFuaXNtIGZvcgotCSAqIGxvY2sgY2FsbGJhY2tzIHRvby4uLgorCQlyZXR1cm4gb2JkX3RpbWVvdXQ7CisKKwkvKgorCSAqIFdhaXQgYSBsb25nIHRpbWUgZm9yIGVucXVldWUgLSBzZXJ2ZXIgbWF5IGhhdmUgdG8gY2FsbGJhY2sgYQorCSAqIGxvY2sgZnJvbSBhbm90aGVyIGNsaWVudC4gIFNlcnZlciB3aWxsIGV2aWN0IHRoZSBvdGhlciBjbGllbnQgaWYgaXQKKwkgKiBkb2Vzbid0IHJlc3BvbmQgcmVhc29uYWJseSwgYW5kIHRoZW4gZ2l2ZSB1cyB0aGUgbG9jay4KIAkgKi8KLQl0aW1lb3V0ID0gbWluX3QoaW50LCBhdF9tYXgsIHRpbWVvdXQgKyAodGltZW91dCA+PiAxKSk7IC8qIDE1MCUgKi8KLQlyZXR1cm4gbWF4KHRpbWVvdXQsIGxkbG1fZW5xdWV1ZV9taW4pOworCXRpbWVvdXQgPSBhdF9nZXQobGRsbV9sb2NrX3RvX25zX2F0KGxvY2spKTsKKwlyZXR1cm4gbWF4KDMgKiB0aW1lb3V0LCBsZGxtX2VucXVldWVfbWluKTsKIH0KIAogLyoqCiAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGxkbG1fY29tcGxldGlvbl9hc3QoKSwgdXBkYXRpbmcgdGltaW5ncyB3aGVuIGxvY2sgaXMKICAqIGFjdHVhbGx5IGdyYW50ZWQuCiAgKi8KLXN0YXRpYyBpbnQgbGRsbV9jb21wbGV0aW9uX3RhaWwoc3RydWN0IGxkbG1fbG9jayAqbG9jaykKK3N0YXRpYyBpbnQgbGRsbV9jb21wbGV0aW9uX3RhaWwoc3RydWN0IGxkbG1fbG9jayAqbG9jaywgdm9pZCAqZGF0YSkKIHsKIAlsb25nIGRlbGF5OwotCWludCAgcmVzdWx0OworCWludCByZXN1bHQgPSAwOwogCiAJaWYgKGxkbG1faXNfZGVzdHJveWVkKGxvY2spIHx8IGxkbG1faXNfZmFpbGVkKGxvY2spKSB7CiAJCUxETE1fREVCVUcobG9jaywgImNsaWVudC1zaWRlIGVucXVldWU6IGRlc3Ryb3llZCIpOwogCQlyZXN1bHQgPSAtRUlPOworCX0gZWxzZSBpZiAoIWRhdGEpIHsKKwkJTERMTV9ERUJVRyhsb2NrLCAiY2xpZW50LXNpZGUgZW5xdWV1ZTogZ3JhbnRlZCIpOwogCX0gZWxzZSB7CisJCS8qIFRha2UgaW50byBBVCBvbmx5IENQIFJQQywgbm90IGltbWVkaWF0ZWx5IGdyYW50ZWQgbG9ja3MgKi8KIAkJZGVsYXkgPSBrdGltZV9nZXRfcmVhbF9zZWNvbmRzKCkgLSBsb2NrLT5sX2xhc3RfYWN0aXZpdHk7CiAJCUxETE1fREVCVUcobG9jaywgImNsaWVudC1zaWRlIGVucXVldWU6IGdyYW50ZWQgYWZ0ZXIgJWxkcyIsCiAJCQkgICBkZWxheSk7CiAKIAkJLyogVXBkYXRlIG91ciB0aW1lIGVzdGltYXRlICovCi0JCWF0X21lYXN1cmVkKGxkbG1fbG9ja190b19uc19hdChsb2NrKSwKLQkJCSAgICBkZWxheSk7Ci0JCXJlc3VsdCA9IDA7CisJCWF0X21lYXN1cmVkKGxkbG1fbG9ja190b19uc19hdChsb2NrKSwgZGVsYXkpOwogCX0KIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMTc3LDEwICsxODksOSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIShmbGFncyAmIChMRExNX0ZMX0JMT0NLX1dBSVQgfCBMRExNX0ZMX0JMT0NLX0dSQU5URUQgfAotCQkgICAgICAgTERMTV9GTF9CTE9DS19DT05WKSkpIHsKKwlpZiAoIShmbGFncyAmIExETE1fRkxfQkxPQ0tFRF9NQVNLKSkgewogCQl3YWtlX3VwKCZsb2NrLT5sX3dhaXRxKTsKLQkJcmV0dXJuIGxkbG1fY29tcGxldGlvbl90YWlsKGxvY2spOworCQlyZXR1cm4gbGRsbV9jb21wbGV0aW9uX3RhaWwobG9jaywgZGF0YSk7CiAJfQogCiAJTERMTV9ERUJVRyhsb2NrLCAiY2xpZW50LXNpZGUgZW5xdWV1ZSByZXR1cm5lZCBhIGJsb2NrZWQgbG9jaywgZ29pbmcgZm9yd2FyZCIpOwpAQCAtMjI0LDggKzIzNSw3IEBACiAJCWdvdG8gbm9yZXByb2M7CiAJfQogCi0JaWYgKCEoZmxhZ3MgJiAoTERMTV9GTF9CTE9DS19XQUlUIHwgTERMTV9GTF9CTE9DS19HUkFOVEVEIHwKLQkJICAgICAgIExETE1fRkxfQkxPQ0tfQ09OVikpKSB7CisJaWYgKCEoZmxhZ3MgJiBMRExNX0ZMX0JMT0NLRURfTUFTSykpIHsKIAkJd2FrZV91cCgmbG9jay0+bF93YWl0cSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTI0MCwxMyArMjUwLDEwIEBACiAJaWYgKG9iZCkKIAkJaW1wID0gb2JkLT51LmNsaS5jbF9pbXBvcnQ7CiAKLQkvKiBXYWl0IGEgbG9uZyB0aW1lIGZvciBlbnF1ZXVlIC0gc2VydmVyIG1heSBoYXZlIHRvIGNhbGxiYWNrIGEKLQkgKiBsb2NrIGZyb20gYW5vdGhlciBjbGllbnQuICBTZXJ2ZXIgd2lsbCBldmljdCB0aGUgb3RoZXIgY2xpZW50IGlmIGl0Ci0JICogZG9lc24ndCByZXNwb25kIHJlYXNvbmFibHksIGFuZCB0aGVuIGdpdmUgdXMgdGhlIGxvY2suCi0JICovCi0JdGltZW91dCA9IGxkbG1fZ2V0X2VucV90aW1lb3V0KGxvY2spICogMjsKKwl0aW1lb3V0ID0gbGRsbV9jcF90aW1lb3V0KGxvY2spOwogCiAJbHdkLmx3ZF9sb2NrID0gbG9jazsKKwlsb2NrLT5sX2xhc3RfYWN0aXZpdHkgPSBrdGltZV9nZXRfcmVhbF9zZWNvbmRzKCk7CiAKIAlpZiAobGRsbV9pc19ub190aW1lb3V0KGxvY2spKSB7CiAJCUxETE1fREVCVUcobG9jaywgIndhaXRpbmcgaW5kZWZpbml0ZWx5IGJlY2F1c2Ugb2YgTk9fVElNRU9VVCIpOwpAQCAtMjc5LDcgKzI4Niw3IEBACiAJCXJldHVybiByYzsKIAl9CiAKLQlyZXR1cm4gbGRsbV9jb21wbGV0aW9uX3RhaWwobG9jayk7CisJcmV0dXJuIGxkbG1fY29tcGxldGlvbl90YWlsKGxvY2ssIGRhdGEpOwogfQogRVhQT1JUX1NZTUJPTChsZGxtX2NvbXBsZXRpb25fYXN0KTsKIApAQCAtMzA5LDggKzMxNiw2IEBACiAJZWxzZQogCQlMRExNX0RFQlVHKGxvY2ssICJsb2NrIHdhcyBncmFudGVkIG9yIGZhaWxlZCBpbiByYWNlIik7CiAKLQlsZGxtX2xvY2tfZGVjcmVmX2ludGVybmFsKGxvY2ssIG1vZGUpOwotCiAJLyogWFhYIC0gSEFDSyBiZWNhdXNlIHdlIHNob3VsZG4ndCBjYWxsIGxkbG1fbG9ja19kZXN0cm95KCkKIAkgKiAgICAgICBmcm9tIGxsaXRlL2ZpbGUuYy9sbF9maWxlX2Zsb2NrKCkuCiAJICovCkBAIC0zMjEsOSArMzI2LDE0IEBACiAJICovCiAJaWYgKGxvY2stPmxfcmVzb3VyY2UtPmxyX3R5cGUgPT0gTERMTV9GTE9DSykgewogCQlsb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKLQkJbGRsbV9yZXNvdXJjZV91bmxpbmtfbG9jayhsb2NrKTsKLQkJbGRsbV9sb2NrX2Rlc3Ryb3lfbm9sb2NrKGxvY2spOworCQlpZiAoIWxkbG1faXNfZGVzdHJveWVkKGxvY2spKSB7CisJCQlsZGxtX3Jlc291cmNlX3VubGlua19sb2NrKGxvY2spOworCQkJbGRsbV9sb2NrX2RlY3JlZl9pbnRlcm5hbF9ub2xvY2sobG9jaywgbW9kZSk7CisJCQlsZGxtX2xvY2tfZGVzdHJveV9ub2xvY2sobG9jayk7CisJCX0KIAkJdW5sb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKKwl9IGVsc2UgeworCQlsZGxtX2xvY2tfZGVjcmVmX2ludGVybmFsKGxvY2ssIG1vZGUpOwogCX0KIH0KIApAQCAtNDE4LDExICs0MjgsNiBAQAogCSpmbGFncyA9IGxkbG1fZmxhZ3NfZnJvbV93aXJlKHJlcGx5LT5sb2NrX2ZsYWdzKTsKIAlsb2NrLT5sX2ZsYWdzIHw9IGxkbG1fZmxhZ3NfZnJvbV93aXJlKHJlcGx5LT5sb2NrX2ZsYWdzICYKIAkJCQkJICAgICAgTERMTV9GTF9JTkhFUklUX01BU0spOwotCS8qIG1vdmUgTk9fVElNRU9VVCBmbGFnIHRvIHRoZSBsb2NrIHRvIGZvcmNlIGxkbG1fbG9ja19tYXRjaCgpCi0JICogdG8gd2FpdCB3aXRoIG5vIHRpbWVvdXQgYXMgd2VsbAotCSAqLwotCWxvY2stPmxfZmxhZ3MgfD0gbGRsbV9mbGFnc19mcm9tX3dpcmUocmVwbHktPmxvY2tfZmxhZ3MgJgotCQkJCQkgICAgICBMRExNX0ZMX05PX1RJTUVPVVQpOwogCXVubG9ja19yZXNfYW5kX2xvY2sobG9jayk7CiAKIAlDREVCVUcoRF9JTkZPLCAibG9jYWw6ICVwLCByZW1vdGUgY29va2llOiAlI2xseCwgZmxhZ3M6IDB4JWxseFxuIiwKQEAgLTU1Niw3ICs1NjEsNyBAQAogCQkJCQkgICAgIGVudW0gcmVxX2xvY2F0aW9uIGxvYywKIAkJCQkJICAgICBpbnQgb2ZmKQogewotCWludCBzaXplID0gcmVxX2NhcHN1bGVfbXNnX3NpemUocGlsbCwgbG9jKTsKKwl1MzIgc2l6ZSA9IHJlcV9jYXBzdWxlX21zZ19zaXplKHBpbGwsIGxvYyk7CiAKIAlyZXR1cm4gbGRsbV9yZXFfaGFuZGxlc19hdmFpbChzaXplLCBvZmYpOwogfQpAQCAtNTY1LDcgKzU3MCw3IEBACiAJCQkJCSAgICBjb25zdCBzdHJ1Y3QgcmVxX2Zvcm1hdCAqZm10LAogCQkJCQkgICAgZW51bSByZXFfbG9jYXRpb24gbG9jLCBpbnQgb2ZmKQogewotCWludCBzaXplID0gcmVxX2NhcHN1bGVfZm10X3NpemUoaW1wLT5pbXBfbXNnX21hZ2ljLCBmbXQsIGxvYyk7CisJdTMyIHNpemUgPSByZXFfY2Fwc3VsZV9mbXRfc2l6ZShpbXAtPmltcF9tc2dfbWFnaWMsIGZtdCwgbG9jKTsKIAogCXJldHVybiBsZGxtX3JlcV9oYW5kbGVzX2F2YWlsKHNpemUsIG9mZik7CiB9CkBAIC02OTYsOCArNzAxLDggQEAKIAkJbG9jayA9IGxkbG1fbG9ja19jcmVhdGUobnMsIHJlc19pZCwgZWluZm8tPmVpX3R5cGUsCiAJCQkJCWVpbmZvLT5laV9tb2RlLCAmY2JzLCBlaW5mby0+ZWlfY2JkYXRhLAogCQkJCQlsdmJfbGVuLCBsdmJfdHlwZSk7Ci0JCWlmICghbG9jaykKLQkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoSVNfRVJSKGxvY2spKQorCQkJcmV0dXJuIFBUUl9FUlIobG9jayk7CiAJCS8qIGZvciB0aGUgbG9jYWwgbG9jaywgYWRkIHRoZSByZWZlcmVuY2UgKi8KIAkJbGRsbV9sb2NrX2FkZHJlZl9pbnRlcm5hbChsb2NrLCBlaW5mby0+ZWlfbW9kZSk7CiAJCWxkbG1fbG9jazJoYW5kbGUobG9jaywgbG9ja2gpOwpAQCAtNzE5LDYgKzcyNCw3IEBACiAJbG9jay0+bF9leHBvcnQgPSBOVUxMOwogCWxvY2stPmxfYmxvY2tpbmdfYXN0ID0gZWluZm8tPmVpX2NiX2JsOwogCWxvY2stPmxfZmxhZ3MgfD0gKCpmbGFncyAmIChMRExNX0ZMX05PX0xSVSB8IExETE1fRkxfRVhDTCkpOworCWxvY2stPmxfbGFzdF9hY3Rpdml0eSA9IGt0aW1lX2dldF9yZWFsX3NlY29uZHMoKTsKIAogCS8qIGxvY2sgbm90IHNlbnQgdG8gc2VydmVyIHlldCAqLwogCkBAIC04MTksNyArODI1LDcgQEAKIAkJbG9ja19yZXNfYW5kX2xvY2sobG9jayk7CiAJCWxkbG1fc2V0X2NicGVuZGluZyhsb2NrKTsKIAkJbG9jYWxfb25seSA9ICEhKGxvY2stPmxfZmxhZ3MgJgotCQkJCShMRExNX0ZMX0xPQ0FMX09OTFl8TERMTV9GTF9DQU5DRUxfT05fQkxPQ0spKTsKKwkJCQkoTERMTV9GTF9MT0NBTF9PTkxZIHwgTERMTV9GTF9DQU5DRUxfT05fQkxPQ0spKTsKIAkJbGRsbV9jYW5jZWxfY2FsbGJhY2sobG9jayk7CiAJCXJjID0gbGRsbV9pc19ibF9hc3QobG9jaykgPyBMRExNX0ZMX0JMX0FTVCA6IExETE1fRkxfQ0FOQ0VMSU5HOwogCQl1bmxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOwpAQCAtMTE4MCw4ICsxMTg2LDcgQEAKIAogCXNsdiA9IGxkbG1fcG9vbF9nZXRfc2x2KHBsKTsKIAlsdmYgPSBsZGxtX3Bvb2xfZ2V0X2x2ZihwbCk7Ci0JbGEgPSBjZnNfZHVyYXRpb25fc2VjKGNmc190aW1lX3N1YihjdXIsCi0JCQkgICAgICBsb2NrLT5sX2xhc3RfdXNlZCkpOworCWxhID0gY2ZzX2R1cmF0aW9uX3NlYyhjZnNfdGltZV9zdWIoY3VyLCBsb2NrLT5sX2xhc3RfdXNlZCkpOwogCWx2ID0gbHZmICogbGEgKiB1bnVzZWQ7CiAKIAkvKiBJbmZvcm0gcG9vbCBhYm91dCBjdXJyZW50IENMViB0byBzZWUgaXQgdmlhIGRlYnVnZnMuICovCkBAIC0xMTkzLDkgKzExOTgsNiBAQAogCWlmIChzbHYgPT0gMCB8fCBsdiA8IHNsdikKIAkJcmV0dXJuIExETE1fUE9MSUNZX0tFRVBfTE9DSzsKIAotCWlmIChucy0+bnNfY2FuY2VsICYmIG5zLT5uc19jYW5jZWwobG9jaykgPT0gMCkKLQkJcmV0dXJuIExETE1fUE9MSUNZX0tFRVBfTE9DSzsKLQogCXJldHVybiBMRExNX1BPTElDWV9DQU5DRUxfTE9DSzsKIH0KIApAQCAtMTIzOSw5ICsxMjQxLDYgQEAKIAkJCWNmc190aW1lX2FkZChsb2NrLT5sX2xhc3RfdXNlZCwgbnMtPm5zX21heF9hZ2UpKSkKIAkJcmV0dXJuIExETE1fUE9MSUNZX0tFRVBfTE9DSzsKIAotCWlmIChucy0+bnNfY2FuY2VsICYmIG5zLT5uc19jYW5jZWwobG9jaykgPT0gMCkKLQkJcmV0dXJuIExETE1fUE9MSUNZX0tFRVBfTE9DSzsKLQogCXJldHVybiBMRExNX1BPTElDWV9DQU5DRUxfTE9DSzsKIH0KIApAQCAtMTM3NCw3ICsxMzczLDcgQEAKIAkJCWJyZWFrOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsb2NrLCBuZXh0LCAmbnMtPm5zX3VudXNlZF9saXN0LAotCQkJCQkgICAgIGxfbHJ1KSB7CisJCQkJCSBsX2xydSkgewogCQkJLyogTm8gbG9ja3Mgd2hpY2ggZ290IGJsb2NraW5nIHJlcXVlc3RzLiAqLwogCQkJTEFTU0VSVCghbGRsbV9pc19ibF9hc3QobG9jaykpOwogCkBAIC0xNDEzLDcgKzE0MTIsOCBAQAogCQkgKiBUaGF0IGlzLCBmb3Igc2hyaW5rZXIgcG9saWN5IHdlIGRyb3Agb25seQogCQkgKiBvbGQgbG9ja3MsIGJ1dCBhZGRpdGlvbmFsbHkgY2hvb3NlIHRoZW0gYnkKIAkJICogdGhlaXIgd2VpZ2h0LiBCaWcgZXh0ZW50IGxvY2tzIHdpbGwgc3RheSBpbgotCQkgKiB0aGUgY2FjaGUuICovCisJCSAqIHRoZSBjYWNoZS4KKwkJICovCiAJCXJlc3VsdCA9IHBmKG5zLCBsb2NrLCB1bnVzZWQsIGFkZGVkLCBjb3VudCk7CiAJCWlmIChyZXN1bHQgPT0gTERMTV9QT0xJQ1lfS0VFUF9MT0NLKSB7CiAJCQlsdV9yZWZfZGVsKCZsb2NrLT5sX3JlZmVyZW5jZSwKQEAgLTE2MTAsOCArMTYxMCw3IEBACiAJICovCiAJd2hpbGUgKGNvdW50ID4gMCkgewogCQlMQVNTRVJUKCFsaXN0X2VtcHR5KGNhbmNlbHMpKTsKLQkJbG9jayA9IGxpc3RfZW50cnkoY2FuY2Vscy0+bmV4dCwgc3RydWN0IGxkbG1fbG9jaywKLQkJCQkgICAgICBsX2JsX2FzdCk7CisJCWxvY2sgPSBsaXN0X2VudHJ5KGNhbmNlbHMtPm5leHQsIHN0cnVjdCBsZGxtX2xvY2ssIGxfYmxfYXN0KTsKIAkJTEFTU0VSVChsb2NrLT5sX2Nvbm5fZXhwb3J0KTsKIAogCQlpZiAoZXhwX2Nvbm5lY3RfY2FuY2Vsc2V0KGxvY2stPmxfY29ubl9leHBvcnQpKSB7CkBAIC0xNjYwLDcgKzE2NTksNyBAQAogCWludCByYzsKIAogCXJlcyA9IGxkbG1fcmVzb3VyY2VfZ2V0KG5zLCBOVUxMLCByZXNfaWQsIDAsIDApOwotCWlmICghcmVzKSB7CisJaWYgKElTX0VSUihyZXMpKSB7CiAJCS8qIFRoaXMgaXMgbm90IGEgcHJvYmxlbS4gKi8KIAkJQ0RFQlVHKERfSU5GTywgIk5vIHJlc291cmNlICVsbHVcbiIsIHJlc19pZC0+bmFtZVswXSk7CiAJCXJldHVybiAwOwpAQCAtMTcwNCw3ICsxNzAzLDggQEAKICAqIHRoYXQgaGF2ZSAwIHJlYWRlcnMvd3JpdGVycy4KICAqCiAgKiBJZiBmbGFncyAmIExDRl9MT0NBTCwgdGhyb3cgdGhlIGxvY2tzIGF3YXkgd2l0aG91dCB0cnlpbmcKLSAqIHRvIG5vdGlmeSB0aGUgc2VydmVyLiAqLworICogdG8gbm90aWZ5IHRoZSBzZXJ2ZXIuCisgKi8KIGludCBsZGxtX2NsaV9jYW5jZWxfdW51c2VkKHN0cnVjdCBsZGxtX25hbWVzcGFjZSAqbnMsCiAJCQkgICBjb25zdCBzdHJ1Y3QgbGRsbV9yZXNfaWQgKnJlc19pZCwKIAkJCSAgIGVudW0gbGRsbV9jYW5jZWxfZmxhZ3MgZmxhZ3MsIHZvaWQgKm9wYXF1ZSkKQEAgLTE4MTEsMTMgKzE4MTEsMTAgQEAKIAlzdHJ1Y3QgbGRsbV9yZXNvdXJjZSAqcmVzOwogCWludCByYzsKIAotCWlmICghbnMpIHsKLQkJQ0VSUk9SKCJtdXN0IHBhc3MgaW4gbmFtZXNwYWNlXG4iKTsKLQkJTEJVRygpOwotCX0KKwlMQVNTRVJURihucywgIm11c3QgcGFzcyBpbiBuYW1lc3BhY2VcbiIpOwogCiAJcmVzID0gbGRsbV9yZXNvdXJjZV9nZXQobnMsIE5VTEwsIHJlc19pZCwgMCwgMCk7Ci0JaWYgKCFyZXMpCisJaWYgKElTX0VSUihyZXMpKQogCQlyZXR1cm4gMDsKIAogCUxETE1fUkVTT1VSQ0VfQUREUkVGKHJlcyk7CkBAIC0xODQzLDcgKzE4NDAsNyBAQAogCSAqIGJ1ZyAxNzYxNDogbG9ja3MgYmVpbmcgYWN0aXZlbHkgY2FuY2VsbGVkLiBHZXQgYSByZWZlcmVuY2UKIAkgKiBvbiBhIGxvY2sgc28gdGhhdCBpdCBkb2VzIG5vdCBkaXNhcHBlYXIgdW5kZXIgdXMgKGUuZy4gZHVlIHRvIGNhbmNlbCkKIAkgKi8KLQlpZiAoIShsb2NrLT5sX2ZsYWdzICYgKExETE1fRkxfRkFJTEVEfExETE1fRkxfQ0FOQ0VMSU5HKSkpIHsKKwlpZiAoIShsb2NrLT5sX2ZsYWdzICYgKExETE1fRkxfRkFJTEVEIHwgTERMTV9GTF9DQU5DRUxJTkcpKSkgewogCQlsaXN0X2FkZCgmbG9jay0+bF9wZW5kaW5nX2NoYWluLCBsaXN0KTsKIAkJTERMTV9MT0NLX0dFVChsb2NrKTsKIAl9CkBAIC0yMDEzLDcgKzIwMTAsNyBAQAogCQkJCQkgTENGX0xPQ0FMLCBMRExNX0NBTkNFTF9OT19XQUlUKTsKIAogCUNERUJVRyhEX0RMTVRSQUNFLCAiQ2FuY2VsZWQgJWQgdW51c2VkIGxvY2tzIGZyb20gbmFtZXNwYWNlICVzXG4iLAotCQkJICAgY2FuY2VsZWQsIGxkbG1fbnNfbmFtZShucykpOworCSAgICAgICBjYW5jZWxlZCwgbGRsbV9uc19uYW1lKG5zKSk7CiB9CiAKIGludCBsZGxtX3JlcGxheV9sb2NrcyhzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3Jlc291cmNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVzb3VyY2UuYwppbmRleCA1MWEyOGQ5Li5hMDljMjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVzb3VyY2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVzb3VyY2UuYwpAQCAtNDQ5LDggKzQ0OSw4IEBACiAJCQkJICBjb25zdCB2b2lkICprZXksIHVuc2lnbmVkIG1hc2spCiB7CiAJY29uc3Qgc3RydWN0IGxkbG1fcmVzX2lkICAgICAqaWQgID0ga2V5OwotCXVuc2lnbmVkCQl2YWwgPSAwOwotCXVuc2lnbmVkCQlpOworCXVuc2lnbmVkIGludAkJdmFsID0gMDsKKwl1bnNpZ25lZCBpbnQJCWk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgUkVTX05BTUVfU0laRTsgaSsrKQogCQl2YWwgKz0gaWQtPm5hbWVbaV07CkBAIC01NjEsOSArNTYxLDkgQEAKIHN0cnVjdCBsZGxtX25zX2hhc2hfZGVmIHsKIAllbnVtIGxkbG1fbnNfdHlwZSBuc2RfdHlwZTsKIAkvKiogaGFzaCBidWNrZXQgYml0cyAqLwotCXVuc2lnbmVkCW5zZF9ia3RfYml0czsKKwl1bnNpZ25lZCBpbnQJbnNkX2JrdF9iaXRzOwogCS8qKiBoYXNoIGJpdHMgKi8KLQl1bnNpZ25lZAluc2RfYWxsX2JpdHM7CisJdW5zaWduZWQgaW50CW5zZF9hbGxfYml0czsKIAkvKiogaGFzaCBvcGVyYXRpb25zICovCiAJc3RydWN0IGNmc19oYXNoX29wcyAqbnNkX2hvcHM7CiB9OwpAQCAtNzU4LDggKzc1OCw3IEBACiAJCSAqLwogCQlsb2NrX3JlcyhyZXMpOwogCQlsaXN0X2Zvcl9lYWNoKHRtcCwgcSkgewotCQkJbG9jayA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgbGRsbV9sb2NrLAotCQkJCQkgICAgICBsX3Jlc19saW5rKTsKKwkJCWxvY2sgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGxkbG1fbG9jaywgbF9yZXNfbGluayk7CiAJCQlpZiAobGRsbV9pc19jbGVhbmVkKGxvY2spKSB7CiAJCQkJbG9jayA9IE5VTEw7CiAJCQkJY29udGludWU7CkBAIC03OTMsOCArNzkyLDE0IEBACiAJCQkgKi8KIAkJCXVubG9ja19yZXMocmVzKTsKIAkJCUxETE1fREVCVUcobG9jaywgInNldHRpbmcgRkxfTE9DQUxfT05MWSIpOworCQkJaWYgKGxvY2stPmxfZmxhZ3MgJiBMRExNX0ZMX0ZBSUxfTE9DKSB7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcyg0KSk7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJCX0KIAkJCWlmIChsb2NrLT5sX2NvbXBsZXRpb25fYXN0KQotCQkJCWxvY2stPmxfY29tcGxldGlvbl9hc3QobG9jaywgMCwgTlVMTCk7CisJCQkJbG9jay0+bF9jb21wbGV0aW9uX2FzdChsb2NrLCBMRExNX0ZMX0ZBSUxFRCwKKwkJCQkJCSAgICAgICBOVUxMKTsKIAkJCUxETE1fTE9DS19SRUxFQVNFKGxvY2spOwogCQkJY29udGludWU7CiAJCX0KQEAgLTg3NSw3ICs4ODAsOCBAQAogCQkgICAgICAgbGRsbV9uc19uYW1lKG5zKSwgYXRvbWljX3JlYWQoJm5zLT5uc19icmVmKSk7CiBmb3JjZV93YWl0OgogCQlpZiAoZm9yY2UpCi0JCQlsd2kgPSBMV0lfVElNRU9VVChvYmRfdGltZW91dCAqIEhaIC8gNCwgTlVMTCwgTlVMTCk7CisJCQlsd2kgPSBMV0lfVElNRU9VVChtc2Vjc190b19qaWZmaWVzKG9iZF90aW1lb3V0ICoKKwkJCQkJICBNU0VDX1BFUl9TRUMpIC8gNCwgTlVMTCwgTlVMTCk7CiAKIAkJcmMgPSBsX3dhaXRfZXZlbnQobnMtPm5zX3dhaXRxLAogCQkJCSAgYXRvbWljX3JlYWQoJm5zLT5uc19icmVmKSA9PSAwLCAmbHdpKTsKQEAgLTEwODIsMTAgKzEwODgsMTEgQEAKIAkJICBpbnQgY3JlYXRlKQogewogCXN0cnVjdCBobGlzdF9ub2RlICAgICAqaG5vZGU7Ci0Jc3RydWN0IGxkbG1fcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgbGRsbV9yZXNvdXJjZSAqcmVzID0gTlVMTDsKIAlzdHJ1Y3QgY2ZzX2hhc2hfYmQJIGJkOwogCV9fdTY0CQkgdmVyc2lvbjsKIAlpbnQJCSAgICAgIG5zX3JlZmNvdW50ID0gMDsKKwlpbnQgcmM7CiAKIAlMQVNTRVJUKCFwYXJlbnQpOwogCUxBU1NFUlQobnMtPm5zX3JzX2hhc2gpOwpAQCAtMTA5NSwzMSArMTEwMiwyMCBAQAogCWhub2RlID0gY2ZzX2hhc2hfYmRfbG9va3VwX2xvY2tlZChucy0+bnNfcnNfaGFzaCwgJmJkLCAodm9pZCAqKW5hbWUpOwogCWlmIChobm9kZSkgewogCQljZnNfaGFzaF9iZF91bmxvY2sobnMtPm5zX3JzX2hhc2gsICZiZCwgMCk7Ci0JCXJlcyA9IGhsaXN0X2VudHJ5KGhub2RlLCBzdHJ1Y3QgbGRsbV9yZXNvdXJjZSwgbHJfaGFzaCk7Ci0JCS8qIFN5bmNocm9uaXplIHdpdGggcmVnYXJkIHRvIHJlc291cmNlIGNyZWF0aW9uLiAqLwotCQlpZiAobnMtPm5zX2x2Ym8gJiYgbnMtPm5zX2x2Ym8tPmx2Ym9faW5pdCkgewotCQkJbXV0ZXhfbG9jaygmcmVzLT5scl9sdmJfbXV0ZXgpOwotCQkJbXV0ZXhfdW5sb2NrKCZyZXMtPmxyX2x2Yl9tdXRleCk7Ci0JCX0KLQotCQlpZiAodW5saWtlbHkocmVzLT5scl9sdmJfbGVuIDwgMCkpIHsKLQkJCWxkbG1fcmVzb3VyY2VfcHV0cmVmKHJlcyk7Ci0JCQlyZXMgPSBOVUxMOwotCQl9Ci0JCXJldHVybiByZXM7CisJCWdvdG8gbHZib19pbml0OwogCX0KIAogCXZlcnNpb24gPSBjZnNfaGFzaF9iZF92ZXJzaW9uX2dldCgmYmQpOwogCWNmc19oYXNoX2JkX3VubG9jayhucy0+bnNfcnNfaGFzaCwgJmJkLCAwKTsKIAogCWlmIChjcmVhdGUgPT0gMCkKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwogCiAJTEFTU0VSVEYodHlwZSA+PSBMRExNX01JTl9UWVBFICYmIHR5cGUgPCBMRExNX01BWF9UWVBFLAogCQkgInR5cGU6ICVkXG4iLCB0eXBlKTsKIAlyZXMgPSBsZGxtX3Jlc291cmNlX25ldygpOwogCWlmICghcmVzKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlyZXMtPmxyX25zX2J1Y2tldCAgPSBjZnNfaGFzaF9iZF9leHRyYV9nZXQobnMtPm5zX3JzX2hhc2gsICZiZCk7CiAJcmVzLT5scl9uYW1lICAgICAgID0gKm5hbWU7CkBAIC0xMTM3LDcgKzExMzMsNyBAQAogCQkvKiBXZSBoYXZlIHRha2VuIGxyX2x2Yl9tdXRleC4gRHJvcCBpdC4gKi8KIAkJbXV0ZXhfdW5sb2NrKCZyZXMtPmxyX2x2Yl9tdXRleCk7CiAJCWttZW1fY2FjaGVfZnJlZShsZGxtX3Jlc291cmNlX3NsYWIsIHJlcyk7Ci0KK2x2Ym9faW5pdDoKIAkJcmVzID0gaGxpc3RfZW50cnkoaG5vZGUsIHN0cnVjdCBsZGxtX3Jlc291cmNlLCBscl9oYXNoKTsKIAkJLyogU3luY2hyb25pemUgd2l0aCByZWdhcmQgdG8gcmVzb3VyY2UgY3JlYXRpb24uICovCiAJCWlmIChucy0+bnNfbHZibyAmJiBucy0+bnNfbHZiby0+bHZib19pbml0KSB7CkBAIC0xMTQ2LDggKzExNDIsOSBAQAogCQl9CiAKIAkJaWYgKHVubGlrZWx5KHJlcy0+bHJfbHZiX2xlbiA8IDApKSB7CisJCQlyYyA9IHJlcy0+bHJfbHZiX2xlbjsKIAkJCWxkbG1fcmVzb3VyY2VfcHV0cmVmKHJlcyk7Ci0JCQlyZXMgPSBOVUxMOworCQkJcmVzID0gRVJSX1BUUihyYyk7CiAJCX0KIAkJcmV0dXJuIHJlczsKIAl9CkBAIC0xMTU4LDggKzExNTUsNiBAQAogCiAJY2ZzX2hhc2hfYmRfdW5sb2NrKG5zLT5uc19yc19oYXNoLCAmYmQsIDEpOwogCWlmIChucy0+bnNfbHZibyAmJiBucy0+bnNfbHZiby0+bHZib19pbml0KSB7Ci0JCWludCByYzsKLQogCQlPQkRfRkFJTF9USU1FT1VUKE9CRF9GQUlMX0xETE1fQ1JFQVRFX1JFU09VUkNFLCAyKTsKIAkJcmMgPSBucy0+bnNfbHZiby0+bHZib19pbml0KHJlcyk7CiAJCWlmIChyYyA8IDApIHsKQEAgLTExNjksNyArMTE2NCw3IEBACiAJCQlyZXMtPmxyX2x2Yl9sZW4gPSByYzsKIAkJCW11dGV4X3VubG9jaygmcmVzLT5scl9sdmJfbXV0ZXgpOwogCQkJbGRsbV9yZXNvdXJjZV9wdXRyZWYocmVzKTsKLQkJCXJldHVybiBOVUxMOworCQkJcmV0dXJuIEVSUl9QVFIocmMpOwogCQl9CiAJfQogCkBAIC0xMzg2LDcgKzEzODEsNyBAQAogCWlmICghbGlzdF9lbXB0eSgmcmVzLT5scl9ncmFudGVkKSkgewogCQlDREVCVUcobGV2ZWwsICJHcmFudGVkIGxvY2tzIChpbiByZXZlcnNlIG9yZGVyKTpcbiIpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UobG9jaywgJnJlcy0+bHJfZ3JhbnRlZCwKLQkJCQkJCWxfcmVzX2xpbmspIHsKKwkJCQkJICAgIGxfcmVzX2xpbmspIHsKIAkJCUxETE1fREVCVUdfTElNSVQobGV2ZWwsIGxvY2ssICIjIyMiKTsKIAkJCWlmICghKGxldmVsICYgRF9DQU5UTUFTSykgJiYKIAkJCSAgICArK2dyYW50ZWQgPiBsZGxtX2R1bXBfZ3JhbnRlZF9tYXgpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvTWFrZWZpbGUKaW5kZXggMmNiYjFiOC4uMWFjMDk0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvTWFrZWZpbGUKQEAgLTEsNiArMSw2IEBACiBvYmotJChDT05GSUdfTFVTVFJFX0ZTKSArPSBsdXN0cmUubwogbHVzdHJlLXkgOj0gZGNhY2hlLm8gZGlyLm8gZmlsZS5vIGxsaXRlX2Nsb3NlLm8gbGxpdGVfbGliLm8gbGxpdGVfbmZzLm8gXAotCSAgICBydy5vIG5hbWVpLm8gc3ltbGluay5vIGxsaXRlX21tYXAubyBcCisJICAgIHJ3Lm8gbmFtZWkubyBzeW1saW5rLm8gbGxpdGVfbW1hcC5vIHJhbmdlX2xvY2subyBcCiAJICAgIHhhdHRyLm8geGF0dHJfY2FjaGUubyBydzI2Lm8gc3VwZXIyNS5vIHN0YXRhaGVhZC5vIFwKIAkgICAgZ2xpbXBzZS5vIGxjb21tb25fY2wubyBsY29tbW9uX21pc2MubyBcCiAJICAgIHZ2cF9kZXYubyB2dnBfcGFnZS5vIHZ2cF9sb2NrLm8gdnZwX2lvLm8gdnZwX29iamVjdC5vIHZ2cF9yZXEubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kY2FjaGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2RjYWNoZS5jCmluZGV4IDQ2M2IxYTMuLjBlNDVkOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2RjYWNoZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2RjYWNoZS5jCkBAIC0zNyw3ICszNyw2IEBACiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xMSVRFCiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9zdXBwb3J0LmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pZGwuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9kbG0uaCIKIApAQCAtMTAyLDM5ICsxMDEsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCByZXR1cm5faWZfZXF1YWwoc3RydWN0IGxkbG1fbG9jayAqbG9jaywgdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gKGxkbG1faXNfY2FuY2VsaW5nKGxvY2spICYmIGxkbG1faXNfZGlzY2FyZF9kYXRhKGxvY2spKSA/Ci0JCUxETE1fSVRFUl9DT05USU5VRSA6IExETE1fSVRFUl9TVE9QOwotfQotCi0vKiBmaW5kIGFueSBsZGxtIGxvY2sgb2YgdGhlIGlub2RlIGluIG1kYyBhbmQgbG92Ci0gKiByZXR1cm4gMCAgICBub3QgZmluZAotICoJMSAgICBmaW5kIG9uZQotICogICAgICA8IDAgICAgZXJyb3IKLSAqLwotc3RhdGljIGludCBmaW5kX2NiZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9pMnNiaShpbm9kZSk7Ci0Jc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbTsKLQlpbnQgcmMgPSAwOwotCi0JTEFTU0VSVChpbm9kZSk7Ci0JcmMgPSBtZF9maW5kX2NiZGF0YShzYmktPmxsX21kX2V4cCwgbGxfaW5vZGUyZmlkKGlub2RlKSwKLQkJCSAgICByZXR1cm5faWZfZXF1YWwsIE5VTEwpOwotCWlmIChyYyAhPSAwKQotCQlyZXR1cm4gcmM7Ci0KLQlsc20gPSBjY2NfaW5vZGVfbHNtX2dldChpbm9kZSk7Ci0JaWYgKCFsc20pCi0JCXJldHVybiByYzsKLQotCXJjID0gb2JkX2ZpbmRfY2JkYXRhKHNiaS0+bGxfZHRfZXhwLCBsc20sIHJldHVybl9pZl9lcXVhbCwgTlVMTCk7Ci0JY2NjX2lub2RlX2xzbV9wdXQoaW5vZGUsIGxzbSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KIC8qKgogICogQ2FsbGVkIHdoZW4gbGFzdCByZWZlcmVuY2UgdG8gYSBkZW50cnkgaXMgZHJvcHBlZCBhbmQgZGNhY2hlIHdhbnRzIHRvIGtub3cKICAqIHdoZXRoZXIgb3Igbm90IGl0IHNob3VsZCBjYWNoZSBpdDoKQEAgLTE1NSwxOSArMTIxLDYgQEAKIAkvKiBrZXJuZWwgPj0gMi42LjM4IGxhc3QgcmVmY291bnQgaXMgZGVjcmVhc2VkIGFmdGVyIHRoaXMgZnVuY3Rpb24uICovCiAJTEFTU0VSVChkX2NvdW50KGRlKSA9PSAxKTsKIAotCS8qIERpc2FibGUgdGhpcyBwaWVjZSBvZiBjb2RlIHRlbXBvcmFyaWx5IGJlY2F1c2UgdGhpcyBpcyBjYWxsZWQKLQkgKiBpbnNpZGUgZGNhY2hlX2xvY2sgc28gaXQncyBub3QgYXBwcm9wcmlhdGUgdG8gZG8gbG90cyBvZiB3b3JrCi0JICogaGVyZS4gQVRURU5USU9OOiBCZWZvcmUgdGhpcyBwaWVjZSBvZiBjb2RlIGVuYWJsaW5nLCBMVS0yNDg3IG11c3QgYmUKLQkgKiByZXNvbHZlZC4KLQkgKi8KLSNpZiAwCi0JLyogaWYgbm90IGxkbG0gbG9jayBmb3IgdGhpcyBpbm9kZSwgc2V0IGlfbmxpbmsgdG8gMCBzbyB0aGF0Ci0JICogdGhpcyBpbm9kZSBjYW4gYmUgcmVjeWNsZWQgbGF0ZXIgYj0yMDQzMwotCSAqLwotCWlmIChkX3JlYWxseV9pc19wb3NpdGl2ZShkZSkgJiYgIWZpbmRfY2JkYXRhKGRfaW5vZGUoZGUpKSkKLQkJY2xlYXJfbmxpbmsoZF9pbm9kZShkZSkpOwotI2VuZGlmCi0KIAlpZiAoZF9sdXN0cmVfaW52YWxpZCgoc3RydWN0IGRlbnRyeSAqKWRlKSkKIAkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CkBAIC0zMjUsMTQgKzI3OCwxMyBAQAogCWlmIChsb29rdXBfZmxhZ3MgJiAoTE9PS1VQX1BBUkVOVCB8IExPT0tVUF9PUEVOIHwgTE9PS1VQX0NSRUFURSkpCiAJCXJldHVybiAxOwogCi0JaWYgKGRfbmVlZF9zdGF0YWhlYWQoZGlyLCBkZW50cnkpIDw9IDApCisJaWYgKCFkZW50cnlfbWF5X3N0YXRhaGVhZChkaXIsIGRlbnRyeSkpCiAJCXJldHVybiAxOwogCiAJaWYgKGxvb2t1cF9mbGFncyAmIExPT0tVUF9SQ1UpCiAJCXJldHVybiAtRUNISUxEOwogCi0JZG9fc3RhdGFoZWFkX2VudGVyKGRpciwgJmRlbnRyeSwgIWRfaW5vZGUoZGVudHJ5KSk7Ci0JbGxfc3RhdGFoZWFkX21hcmsoZGlyLCBkZW50cnkpOworCWxsX3N0YXRhaGVhZChkaXIsICZkZW50cnksICFkX2lub2RlKGRlbnRyeSkpOwogCXJldHVybiAxOwogfQogCkBAIC0zNDcsMTggKzI5OSw5IEBACiAJcmV0dXJuIGxsX3JldmFsaWRhdGVfZGVudHJ5KGRlbnRyeSwgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBsbF9kX2lwdXQoc3RydWN0IGRlbnRyeSAqZGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0JTEFTU0VSVChpbm9kZSk7Ci0JaWYgKCFmaW5kX2NiZGF0YShpbm9kZSkpCi0JCWNsZWFyX25saW5rKGlub2RlKTsKLQlpcHV0KGlub2RlKTsKLX0KLQogY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGxsX2Rfb3BzID0gewogCS5kX3JldmFsaWRhdGUgPSBsbF9yZXZhbGlkYXRlX25kLAogCS5kX3JlbGVhc2UgPSBsbF9yZWxlYXNlLAogCS5kX2RlbGV0ZSAgPSBsbF9kZGVsZXRlLAotCS5kX2lwdXQgICAgPSBsbF9kX2lwdXQsCiAJLmRfY29tcGFyZSA9IGxsX2Rjb21wYXJlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2Rpci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGlyLmMKaW5kZXggNWIzODE3Ny4uN2YzMmE1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGlyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGlyLmMKQEAgLTQ2LDkgKzQ2LDggQEAKIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX3N1cHBvcnQuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9jbGFzcy5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pb2N0bC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpYi5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pZGwuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZGxtLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZmlkLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfa2VybmVsY29tbS5oIgpAQCAtMTM0LDExMSArMTMzLDM1IEBACiAgKiBmb3IgdGhpcyBpbnRlZ3JhdGVkIHBhZ2Ugd2lsbCBiZSBhZGp1c3RlZC4gU2VlIGxtdl9hZGp1c3RfZGlycGFnZXMoKS4KICAqCiAgKi8KLQotLyogcmV0dXJucyB0aGUgcGFnZSB1bmxvY2tlZCwgYnV0IHdpdGggYSByZWZlcmVuY2UgKi8KLXN0YXRpYyBpbnQgbGxfZGlyX2ZpbGxlcih2b2lkICpfaGFzaCwgc3RydWN0IHBhZ2UgKnBhZ2UwKQorc3RydWN0IHBhZ2UgKmxsX2dldF9kaXJfcGFnZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCisJCQkgICAgIF9fdTY0IG9mZnNldCkKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZTAtPm1hcHBpbmctPmhvc3Q7Ci0JaW50IGhhc2g2NCA9IGxsX2kyc2JpKGlub2RlKS0+bGxfZmxhZ3MgJiBMTF9TQklfNjRCSVRfSEFTSDsKLQlzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwID0gbGxfaTJzYmkoaW5vZGUpLT5sbF9tZF9leHA7Ci0Jc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0OwotCXN0cnVjdCBtZHRfYm9keSAqYm9keTsKLQlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKLQlfX3U2NCBoYXNoID0gKigoX191NjQgKilfaGFzaCk7Ci0Jc3RydWN0IHBhZ2UgKipwYWdlX3Bvb2w7CisJc3RydWN0IG1kX2NhbGxiYWNrIGNiX29wOwogCXN0cnVjdCBwYWdlICpwYWdlOwotCXN0cnVjdCBsdV9kaXJwYWdlICpkcDsKLQlpbnQgbWF4X3BhZ2VzID0gbGxfaTJzYmkoaW5vZGUpLT5sbF9tZF9icndfc2l6ZSA+PiBQQUdFX1NISUZUOwotCWludCBucmRwZ3MgPSAwOyAvKiBudW1iZXIgb2YgcGFnZXMgcmVhZCBhY3R1YWxseSAqLwotCWludCBucGFnZXM7Ci0JaW50IGk7CiAJaW50IHJjOwogCi0JQ0RFQlVHKERfVkZTVFJBQ0UsICJWRlMgT3A6aW5vZGU9IkRGSUQiKCVwKSBoYXNoICVsbHVcbiIsCi0JICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIGlub2RlLCBoYXNoKTsKKwljYl9vcC5tZF9ibG9ja2luZ19hc3QgPSBsbF9tZF9ibG9ja2luZ19hc3Q7CisJcmMgPSBtZF9yZWFkX3BhZ2UobGxfaTJtZGV4cChkaXIpLCBvcF9kYXRhLCAmY2Jfb3AsIG9mZnNldCwgJnBhZ2UpOworCWlmIChyYykKKwkJcmV0dXJuIEVSUl9QVFIocmMpOwogCi0JTEFTU0VSVChtYXhfcGFnZXMgPiAwICYmIG1heF9wYWdlcyA8PSBNRF9NQVhfQlJXX1BBR0VTKTsKLQotCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgaW5vZGUsIE5VTEwsIE5VTEwsIDAsIDAsCi0JCQkJICAgICBMVVNUUkVfT1BDX0FOWSwgTlVMTCk7Ci0JaWYgKElTX0VSUihvcF9kYXRhKSkKLQkJcmV0dXJuIFBUUl9FUlIob3BfZGF0YSk7Ci0KLQlwYWdlX3Bvb2wgPSBrY2FsbG9jKG1heF9wYWdlcywgc2l6ZW9mKHBhZ2UpLCBHRlBfTk9GUyk7Ci0JaWYgKHBhZ2VfcG9vbCkgewotCQlwYWdlX3Bvb2xbMF0gPSBwYWdlMDsKLQl9IGVsc2UgewotCQlwYWdlX3Bvb2wgPSAmcGFnZTA7Ci0JCW1heF9wYWdlcyA9IDE7Ci0JfQotCWZvciAobnBhZ2VzID0gMTsgbnBhZ2VzIDwgbWF4X3BhZ2VzOyBucGFnZXMrKykgewotCQlwYWdlID0gcGFnZV9jYWNoZV9hbGxvY19jb2xkKGlub2RlLT5pX21hcHBpbmcpOwotCQlpZiAoIXBhZ2UpCi0JCQlicmVhazsKLQkJcGFnZV9wb29sW25wYWdlc10gPSBwYWdlOwotCX0KLQotCW9wX2RhdGEtPm9wX25wYWdlcyA9IG5wYWdlczsKLQlvcF9kYXRhLT5vcF9vZmZzZXQgPSBoYXNoOwotCXJjID0gbWRfcmVhZHBhZ2UoZXhwLCBvcF9kYXRhLCBwYWdlX3Bvb2wsICZyZXF1ZXN0KTsKLQlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKLQlpZiAocmMgPCAwKSB7Ci0JCS8qIHBhZ2UwIGlzIHNwZWNpYWwsIHdoaWNoIHdhcyBhZGRlZCBpbnRvIHBhZ2UgY2FjaGUgZWFybHkgKi8KLQkJZGVsZXRlX2Zyb21fcGFnZV9jYWNoZShwYWdlMCk7Ci0JfSBlbHNlIGlmIChyYyA9PSAwKSB7Ci0JCWJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXF1ZXN0LT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKLQkJLyogQ2hlY2tlZCBieSBtZGNfcmVhZHBhZ2UoKSAqLwotCQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxTSVpFKQotCQkJaV9zaXplX3dyaXRlKGlub2RlLCBib2R5LT5zaXplKTsKLQotCQlucmRwZ3MgPSAocmVxdWVzdC0+cnFfYnVsay0+YmRfbm9iX3RyYW5zZmVycmVkK1BBR0VfU0laRS0xKQotCQkJID4+IFBBR0VfU0hJRlQ7Ci0JCVNldFBhZ2VVcHRvZGF0ZShwYWdlMCk7Ci0JfQotCXVubG9ja19wYWdlKHBhZ2UwKTsKLQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcXVlc3QpOwotCi0JQ0RFQlVHKERfVkZTVFJBQ0UsICJyZWFkICVkLyVkIHBhZ2VzXG4iLCBucmRwZ3MsIG5wYWdlcyk7Ci0KLQlmb3IgKGkgPSAxOyBpIDwgbnBhZ2VzOyBpKyspIHsKLQkJdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0JCWludCByZXQ7Ci0KLQkJcGFnZSA9IHBhZ2VfcG9vbFtpXTsKLQotCQlpZiAocmMgPCAwIHx8IGkgPj0gbnJkcGdzKSB7Ci0JCQlwdXRfcGFnZShwYWdlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwotCi0JCWRwID0ga21hcChwYWdlKTsKLQkJaGFzaCA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9zdGFydCk7Ci0JCWt1bm1hcChwYWdlKTsKLQotCQlvZmZzZXQgPSBoYXNoX3hfaW5kZXgoaGFzaCwgaGFzaDY0KTsKLQotCQlwcmVmZXRjaHcoJnBhZ2UtPmZsYWdzKTsKLQkJcmV0ID0gYWRkX3RvX3BhZ2VfY2FjaGVfbHJ1KHBhZ2UsIGlub2RlLT5pX21hcHBpbmcsIG9mZnNldCwKLQkJCQkJICAgIEdGUF9OT0ZTKTsKLQkJaWYgKHJldCA9PSAwKSB7Ci0JCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJfSBlbHNlIHsKLQkJCUNERUJVRyhEX1ZGU1RSQUNFLCAicGFnZSAlbHUgYWRkIHRvIHBhZ2UgY2FjaGUgZmFpbGVkOiAlZFxuIiwKLQkJCSAgICAgICBvZmZzZXQsIHJldCk7Ci0JCX0KLQkJcHV0X3BhZ2UocGFnZSk7Ci0JfQotCi0JaWYgKHBhZ2VfcG9vbCAhPSAmcGFnZTApCi0JCWtmcmVlKHBhZ2VfcG9vbCk7Ci0JcmV0dXJuIHJjOworCXJldHVybiBwYWdlOwogfQogCi12b2lkIGxsX3JlbGVhc2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHJlbW92ZSkKK3ZvaWQgbGxfcmVsZWFzZV9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLCBib29sIHJlbW92ZSkKIHsKIAlrdW5tYXAocGFnZSk7CisKKwkvKgorCSAqIEFsd2F5cyByZW1vdmUgdGhlIHBhZ2UgZm9yIHN0cmlwZWQgZGlyLCBiZWNhdXNlIHRoZSBwYWdlIGlzCisJICogYnVpbHQgZnJvbSB0ZW1wb3JhcmlseSBpbiBMTVYgbGF5ZXIKKwkgKi8KKwlpZiAoaW5vZGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJgorCSAgICBsbF9pMmluZm8oaW5vZGUpLT5sbGlfbHNtX21kKSB7CisJCV9fZnJlZV9wYWdlKHBhZ2UpOworCQlyZXR1cm47CisJfQorCiAJaWYgKHJlbW92ZSkgewogCQlsb2NrX3BhZ2UocGFnZSk7CiAJCWlmIChsaWtlbHkocGFnZS0+bWFwcGluZykpCkBAIC0yNDgsMjI1ICsxNzEsNiBAQAogCXB1dF9wYWdlKHBhZ2UpOwogfQogCi0vKgotICogRmluZCwga21hcCBhbmQgcmV0dXJuIHBhZ2UgdGhhdCBjb250YWlucyBnaXZlbiBoYXNoLgotICovCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmxsX2Rpcl9wYWdlX2xvY2F0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgX191NjQgKmhhc2gsCi0JCQkJICAgICAgIF9fdTY0ICpzdGFydCwgX191NjQgKmVuZCkKLXsKLQlpbnQgaGFzaDY0ID0gbGxfaTJzYmkoZGlyKS0+bGxfZmxhZ3MgJiBMTF9TQklfNjRCSVRfSEFTSDsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGRpci0+aV9tYXBwaW5nOwotCS8qCi0JICogQ29tcGxlbWVudCBvZiBoYXNoIGlzIHVzZWQgYXMgYW4gaW5kZXggc28gdGhhdAotCSAqIHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAoKSBjYW4gYmUgdXNlZCB0byBmaW5kIGEgcGFnZSB3aXRoIHN0YXJ0aW5nCi0JICogaGFzaCBfc21hbGxlcl8gdGhhbiBvbmUgd2UgYXJlIGxvb2tpbmcgZm9yLgotCSAqLwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gaGFzaF94X2luZGV4KCpoYXNoLCBoYXNoNjQpOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCWludCBmb3VuZDsKLQotCXNwaW5fbG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7Ci0JZm91bmQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwKCZtYXBwaW5nLT5wYWdlX3RyZWUsCi0JCQkJICAgICAgICh2b2lkICoqKSZwYWdlLCBvZmZzZXQsIDEpOwotCWlmIChmb3VuZCA+IDAgJiYgIXJhZGl4X3RyZWVfZXhjZXB0aW9uYWxfZW50cnkocGFnZSkpIHsKLQkJc3RydWN0IGx1X2RpcnBhZ2UgKmRwOwotCi0JCWdldF9wYWdlKHBhZ2UpOwotCQlzcGluX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7Ci0JCS8qCi0JCSAqIEluIGNvbnRyYXN0IHRvIGZpbmRfbG9ja19wYWdlKCkgd2UgYXJlIHN1cmUgdGhhdCBkaXJlY3RvcnkKLQkJICogcGFnZSBjYW5ub3QgYmUgdHJ1bmNhdGVkICh3aGlsZSBETE0gbG9jayBpcyBoZWxkKSBhbmQsCi0JCSAqIGhlbmNlLCBjYW4gYXZvaWQgcmVzdGFydC4KLQkJICoKLQkJICogSW4gZmFjdCwgcGFnZSBjYW5ub3QgYmUgbG9ja2VkIGhlcmUgYXQgYWxsLCBiZWNhdXNlCi0JCSAqIGxsX2Rpcl9maWxsZXIoKSBkb2VzIHN5bmNocm9ub3VzIGlvLgotCQkgKi8KLQkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKLQkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkgewotCQkJZHAgPSBrbWFwKHBhZ2UpOwotCQkJaWYgKEJJVFNfUEVSX0xPTkcgPT0gMzIgJiYgaGFzaDY0KSB7Ci0JCQkJKnN0YXJ0ID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX3N0YXJ0KSA+PiAzMjsKLQkJCQkqZW5kICAgPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfZW5kKSA+PiAzMjsKLQkJCQkqaGFzaCAgPSAqaGFzaCA+PiAzMjsKLQkJCX0gZWxzZSB7Ci0JCQkJKnN0YXJ0ID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX3N0YXJ0KTsKLQkJCQkqZW5kICAgPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfZW5kKTsKLQkJCX0KLQkJCUxBU1NFUlRGKCpzdGFydCA8PSAqaGFzaCwgInN0YXJ0ID0gJSNsbHgsZW5kID0gJSNsbHgsaGFzaCA9ICUjbGx4XG4iLAotCQkJCSAqc3RhcnQsICplbmQsICpoYXNoKTsKLQkJCUNERUJVRyhEX1ZGU1RSQUNFLCAicGFnZSAlbHUgWyVsbHUgJWxsdV0sIGhhc2ggJWxsdVxuIiwKLQkJCSAgICAgICBvZmZzZXQsICpzdGFydCwgKmVuZCwgKmhhc2gpOwotCQkJaWYgKCpoYXNoID4gKmVuZCkgewotCQkJCWxsX3JlbGVhc2VfcGFnZShwYWdlLCAwKTsKLQkJCQlwYWdlID0gTlVMTDsKLQkJCX0gZWxzZSBpZiAoKmVuZCAhPSAqc3RhcnQgJiYgKmhhc2ggPT0gKmVuZCkgewotCQkJCS8qCi0JCQkJICogdXBvbiBoYXNoIGNvbGxpc2lvbiwgcmVtb3ZlIHRoaXMgcGFnZSwKLQkJCQkgKiBvdGhlcndpc2UgcHV0IHBhZ2UgcmVmZXJlbmNlLCBhbmQKLQkJCQkgKiBsbF9nZXRfZGlyX3BhZ2UoKSB3aWxsIGlzc3VlIFJQQyB0byBmZXRjaAotCQkJCSAqIHRoZSBwYWdlIHdlIHdhbnQuCi0JCQkJICovCi0JCQkJbGxfcmVsZWFzZV9wYWdlKHBhZ2UsCi0JCQkJICAgIGxlMzJfdG9fY3B1KGRwLT5sZHBfZmxhZ3MpICYgTERGX0NPTExJREUpOwotCQkJCXBhZ2UgPSBOVUxMOwotCQkJfQotCQl9IGVsc2UgewotCQkJcHV0X3BhZ2UocGFnZSk7Ci0JCQlwYWdlID0gRVJSX1BUUigtRUlPKTsKLQkJfQotCi0JfSBlbHNlIHsKLQkJc3Bpbl91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwotCQlwYWdlID0gTlVMTDsKLQl9Ci0JcmV0dXJuIHBhZ2U7Ci19Ci0KLXN0cnVjdCBwYWdlICpsbF9nZXRfZGlyX3BhZ2Uoc3RydWN0IGlub2RlICpkaXIsIF9fdTY0IGhhc2gsCi0JCQkgICAgIHN0cnVjdCBsbF9kaXJfY2hhaW4gKmNoYWluKQotewotCWxkbG1fcG9saWN5X2RhdGFfdCBwb2xpY3kgPSB7LmxfaW5vZGViaXRzID0ge01EU19JTk9ERUxPQ0tfVVBEQVRFfSB9OwotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZGlyLT5pX21hcHBpbmc7Ci0Jc3RydWN0IGx1c3RyZV9oYW5kbGUgbG9ja2g7Ci0Jc3RydWN0IGx1X2RpcnBhZ2UgKmRwOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCWVudW0gbGRsbV9tb2RlIG1vZGU7Ci0JaW50IHJjOwotCV9fdTY0IHN0YXJ0ID0gMDsKLQlfX3U2NCBlbmQgPSAwOwotCV9fdTY0IGxoYXNoID0gaGFzaDsKLQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGRpcik7Ci0JaW50IGhhc2g2NCA9IGxsX2kyc2JpKGRpciktPmxsX2ZsYWdzICYgTExfU0JJXzY0QklUX0hBU0g7Ci0KLQltb2RlID0gTENLX1BSOwotCXJjID0gbWRfbG9ja19tYXRjaChsbF9pMnNiaShkaXIpLT5sbF9tZF9leHAsIExETE1fRkxfQkxPQ0tfR1JBTlRFRCwKLQkJCSAgIGxsX2lub2RlMmZpZChkaXIpLCBMRExNX0lCSVRTLCAmcG9saWN5LCBtb2RlLCAmbG9ja2gpOwotCWlmICghcmMpIHsKLQkJc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvIGVpbmZvID0gewotCQkJLmVpX3R5cGUgPSBMRExNX0lCSVRTLAotCQkJLmVpX21vZGUgPSBtb2RlLAotCQkJLmVpX2NiX2JsID0gbGxfbWRfYmxvY2tpbmdfYXN0LAotCQkJLmVpX2NiX2NwID0gbGRsbV9jb21wbGV0aW9uX2FzdCwKLQkJfTsKLQkJc3RydWN0IGxvb2t1cF9pbnRlbnQgaXQgPSB7IC5pdF9vcCA9IElUX1JFQURESVIgfTsKLQkJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0OwotCQlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKLQotCQlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGRpciwgZGlyLCBOVUxMLCAwLCAwLAotCQkJCQkgICAgIExVU1RSRV9PUENfQU5ZLCBOVUxMKTsKLQkJaWYgKElTX0VSUihvcF9kYXRhKSkKLQkJCXJldHVybiAodm9pZCAqKW9wX2RhdGE7Ci0KLQkJcmMgPSBtZF9lbnF1ZXVlKGxsX2kyc2JpKGRpciktPmxsX21kX2V4cCwgJmVpbmZvLCAmaXQsCi0JCQkJb3BfZGF0YSwgJmxvY2toLCBOVUxMLCAwLCBOVUxMLCAwKTsKLQotCQlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKLQotCQlyZXF1ZXN0ID0gKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKWl0Lml0X3JlcXVlc3Q7Ci0JCWlmIChyZXF1ZXN0KQotCQkJcHRscnBjX3JlcV9maW5pc2hlZChyZXF1ZXN0KTsKLQkJaWYgKHJjIDwgMCkgewotCQkJQ0VSUk9SKCJsb2NrIGVucXVldWU6ICIgREZJRCAiIGF0ICVsbHU6IHJjICVkXG4iLAotCQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGRpcikpLCBoYXNoLCByYyk7Ci0JCQlyZXR1cm4gRVJSX1BUUihyYyk7Ci0JCX0KLQotCQlDREVCVUcoRF9JTk9ERSwgInNldHRpbmcgbHJfbHZiX2lub2RlIHRvIGlub2RlICJERklEIiglcClcbiIsCi0JCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChkaXIpKSwgZGlyKTsKLQkJbWRfc2V0X2xvY2tfZGF0YShsbF9pMnNiaShkaXIpLT5sbF9tZF9leHAsCi0JCQkJICZpdC5pdF9sb2NrX2hhbmRsZSwgZGlyLCBOVUxMKTsKLQl9IGVsc2UgewotCQkvKiBmb3IgY3Jvc3MtcmVmIG9iamVjdCwgbF9hc3RfZGF0YSBvZiB0aGUgbG9jayBtYXkgbm90IGJlIHNldCwKLQkJICogd2UgcmVzZXQgaXQgaGVyZQotCQkgKi8KLQkJbWRfc2V0X2xvY2tfZGF0YShsbF9pMnNiaShkaXIpLT5sbF9tZF9leHAsICZsb2NraC5jb29raWUsCi0JCQkJIGRpciwgTlVMTCk7Ci0JfQotCWxkbG1fbG9ja19kdW1wX2hhbmRsZShEX09USEVSLCAmbG9ja2gpOwotCi0JbXV0ZXhfbG9jaygmbGxpLT5sbGlfcmVhZGRpcl9tdXRleCk7Ci0JcGFnZSA9IGxsX2Rpcl9wYWdlX2xvY2F0ZShkaXIsICZsaGFzaCwgJnN0YXJ0LCAmZW5kKTsKLQlpZiAoSVNfRVJSKHBhZ2UpKSB7Ci0JCUNFUlJPUigiZGlyIHBhZ2UgbG9jYXRlOiAiREZJRCIgYXQgJWxsdTogcmMgJWxkXG4iLAotCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoZGlyKSksIGxoYXNoLCBQVFJfRVJSKHBhZ2UpKTsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0gZWxzZSBpZiAocGFnZSkgewotCQkvKgotCQkgKiBYWFggbmlraXRhOiBub3QgZW50aXJlbHkgY29ycmVjdCBoYW5kbGluZyBvZiBhIGNvcm5lciBjYXNlOgotCQkgKiBzdXBwb3NlIGhhc2ggY2hhaW4gb2YgZW50cmllcyB3aXRoIGhhc2ggdmFsdWUgSEFTSCBjcm9zc2VzCi0JCSAqIGJvcmRlciBiZXR3ZWVuIHBhZ2VzIFAwIGFuZCBQMS4gRmlyc3QgYm90aCBQMCBhbmQgUDEgYXJlCi0JCSAqIGNhY2hlZCwgc2Vla2RpcigpIGlzIGNhbGxlZCBmb3Igc29tZSBlbnRyeSBmcm9tIHRoZSBQMCBwYXJ0Ci0JCSAqIG9mIHRoZSBjaGFpbi4gTGF0ZXIgUDAgZ29lcyBvdXQgb2YgY2FjaGUuIHRlbGxkaXIoSEFTSCkKLQkJICogaGFwcGVucyBhbmQgZmluZHMgUDEsIGFzIGl0IHN0YXJ0cyB3aXRoIG1hdGNoaW5nIGhhc2gKLQkJICogdmFsdWUuIFJlbWFpbmluZyBlbnRyaWVzIGZyb20gUDAgcGFydCBvZiB0aGUgY2hhaW4gYXJlCi0JCSAqIHNraXBwZWQuIChJcyB0aGF0IHJlYWxseSBhIGJ1Zz8pCi0JCSAqCi0JCSAqIFBvc3NpYmxlIHNvbHV0aW9uczogMC4gZG9uJ3QgY2FjaGUgUDEgaXMgc3VjaCBjYXNlLCBoYW5kbGUKLQkJICogaXQgYXMgYW4gIm92ZXJmbG93IiBwYWdlLiAxLiBpbnZhbGlkYXRlIGFsbCBwYWdlcyBhdAotCQkgKiBvbmNlLiAyLiB1c2UgSEFTSHwxIGFzIGFuIGluZGV4IGZvciBQMS4KLQkJICovCi0JCWdvdG8gaGFzaF9jb2xsaXNpb247Ci0JfQotCi0JcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBoYXNoX3hfaW5kZXgoaGFzaCwgaGFzaDY0KSwKLQkJCSAgICAgICBsbF9kaXJfZmlsbGVyLCAmbGhhc2gpOwotCWlmIChJU19FUlIocGFnZSkpIHsKLQkJQ0VSUk9SKCJyZWFkIGNhY2hlIHBhZ2U6ICJERklEIiBhdCAlbGx1OiByYyAlbGRcbiIsCi0JCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChkaXIpKSwgaGFzaCwgUFRSX0VSUihwYWdlKSk7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KLQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOwotCSh2b2lkKWttYXAocGFnZSk7Ci0JaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKLQkJQ0VSUk9SKCJwYWdlIG5vdCB1cGRhdGVkOiAiREZJRCIgYXQgJWxsdTogcmMgJWRcbiIsCi0JCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChkaXIpKSwgaGFzaCwgLTUpOwotCQlnb3RvIGZhaWw7Ci0JfQotCWlmICghUGFnZUNoZWNrZWQocGFnZSkpCi0JCS8qIFhYWDogY2hlY2sgcGFnZSBmb3JtYXQgbGF0ZXIgKi8KLQkJU2V0UGFnZUNoZWNrZWQocGFnZSk7Ci0JaWYgKFBhZ2VFcnJvcihwYWdlKSkgewotCQlDRVJST1IoInBhZ2UgZXJyb3I6ICJERklEIiBhdCAlbGx1OiByYyAlZFxuIiwKLQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGRpcikpLCBoYXNoLCAtNSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci1oYXNoX2NvbGxpc2lvbjoKLQlkcCA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKLQlpZiAoQklUU19QRVJfTE9ORyA9PSAzMiAmJiBoYXNoNjQpIHsKLQkJc3RhcnQgPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfc3RhcnQpID4+IDMyOwotCQllbmQgICA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9lbmQpID4+IDMyOwotCQlsaGFzaCA9IGhhc2ggPj4gMzI7Ci0JfSBlbHNlIHsKLQkJc3RhcnQgPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfc3RhcnQpOwotCQllbmQgICA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9lbmQpOwotCQlsaGFzaCA9IGhhc2g7Ci0JfQotCWlmIChlbmQgPT0gc3RhcnQpIHsKLQkJTEFTU0VSVChzdGFydCA9PSBsaGFzaCk7Ci0JCUNXQVJOKCJQYWdlLXdpZGUgaGFzaCBjb2xsaXNpb246ICVsbHVcbiIsIGVuZCk7Ci0JCWlmIChCSVRTX1BFUl9MT05HID09IDMyICYmIGhhc2g2NCkKLQkJCUNXQVJOKCJSZWFsIHBhZ2Utd2lkZSBoYXNoIGNvbGxpc2lvbiBhdCBbJWxsdSAlbGx1XSB3aXRoIGhhc2ggJWxsdVxuIiwKLQkJCSAgICAgIGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9zdGFydCksCi0JCQkgICAgICBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfZW5kKSwgaGFzaCk7Ci0JCS8qCi0JCSAqIEZldGNoIHdob2xlIG92ZXJmbG93IGNoYWluLi4uCi0JCSAqCi0JCSAqIFhYWCBub3QgeWV0LgotCQkgKi8KLQkJZ290byBmYWlsOwotCX0KLW91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZsbGktPmxsaV9yZWFkZGlyX211dGV4KTsKLQlsZGxtX2xvY2tfZGVjcmVmKCZsb2NraCwgbW9kZSk7Ci0JcmV0dXJuIHBhZ2U7Ci0KLWZhaWw6Ci0JbGxfcmVsZWFzZV9wYWdlKHBhZ2UsIDEpOwotCXBhZ2UgPSBFUlJfUFRSKC1FSU8pOwotCWdvdG8gb3V0X3VubG9jazsKLX0KLQogLyoqCiAgKiByZXR1cm4gSUZfKiB0eXBlIGZvciBnaXZlbiBsdV9kaXJlbnQgZW50cnkuCiAgKiBJRl8qIGZsYWcgc2hsZCBiZSBjb252ZXJ0ZWQgdG8gcGFydGljdWxhciBPUyBmaWxlIHR5cGUgaW4KQEAgLTQ4OSwxMTkgKzE5MywxMDAgQEAKIAlyZXR1cm4gdHlwZTsKIH0KIAotaW50IGxsX2Rpcl9yZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KQoraW50IGxsX2Rpcl9yZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIF9fdTY0ICpwcG9zLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKKwkJc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpCiB7Ci0Jc3RydWN0IGxsX2lub2RlX2luZm8gKmluZm8gICAgICAgPSBsbF9pMmluZm8oaW5vZGUpOwogCXN0cnVjdCBsbF9zYl9pbmZvICAgICpzYmkJPSBsbF9pMnNiaShpbm9kZSk7Ci0JX191NjQJCSAgIHBvcwkJPSBjdHgtPnBvczsKLQlpbnQJCSAgIGFwaTMyICAgICAgPSBsbF9uZWVkXzMyYml0X2FwaShzYmkpOwotCWludAkJICAgaGFzaDY0ICAgICA9IHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfNjRCSVRfSEFTSDsKKwlfX3U2NAkJICAgcG9zCQk9ICpwcG9zOworCWludAkJICAgaXNfYXBpMzIgPSBsbF9uZWVkXzMyYml0X2FwaShzYmkpOworCWludAkJICAgaXNfaGFzaDY0ID0gc2JpLT5sbF9mbGFncyAmIExMX1NCSV82NEJJVF9IQVNIOwogCXN0cnVjdCBwYWdlCSAgKnBhZ2U7Ci0Jc3RydWN0IGxsX2Rpcl9jaGFpbiAgIGNoYWluOwotCWludAkJICAgZG9uZSA9IDA7CisJYm9vbAkJICAgZG9uZSA9IGZhbHNlOwogCWludAkJICAgcmMgPSAwOwogCi0JbGxfZGlyX2NoYWluX2luaXQoJmNoYWluKTsKLQotCXBhZ2UgPSBsbF9nZXRfZGlyX3BhZ2UoaW5vZGUsIHBvcywgJmNoYWluKTsKKwlwYWdlID0gbGxfZ2V0X2Rpcl9wYWdlKGlub2RlLCBvcF9kYXRhLCBwb3MpOwogCiAJd2hpbGUgKHJjID09IDAgJiYgIWRvbmUpIHsKIAkJc3RydWN0IGx1X2RpcnBhZ2UgKmRwOwogCQlzdHJ1Y3QgbHVfZGlyZW50ICAqZW50OworCQlfX3U2NCBoYXNoOworCQlfX3U2NCBuZXh0OwogCi0JCWlmICghSVNfRVJSKHBhZ2UpKSB7Ci0JCQkvKgotCQkJICogSWYgcGFnZSBpcyBlbXB0eSAoZW5kIG9mIGRpcmVjdG9yeSBpcyByZWFjaGVkKSwKLQkJCSAqIHVzZSB0aGlzIHZhbHVlLgotCQkJICovCi0JCQlfX3U2NCBoYXNoID0gTURTX0RJUl9FTkRfT0ZGOwotCQkJX191NjQgbmV4dDsKLQotCQkJZHAgPSBwYWdlX2FkZHJlc3MocGFnZSk7Ci0JCQlmb3IgKGVudCA9IGx1X2RpcmVudF9zdGFydChkcCk7IGVudCAmJiAhZG9uZTsKLQkJCSAgICAgZW50ID0gbHVfZGlyZW50X25leHQoZW50KSkgewotCQkJCV9fdTE2CSAgdHlwZTsKLQkJCQlpbnQJICAgIG5hbWVsZW47Ci0JCQkJc3RydWN0IGx1X2ZpZCAgZmlkOwotCQkJCV9fdTY0CSAgbGhhc2g7Ci0JCQkJX191NjQJICBpbm87Ci0KLQkJCQkvKgotCQkJCSAqIFhYWDogaW1wbGVtZW50IGNvcnJlY3Qgc3dhYmJpbmcgaGVyZS4KLQkJCQkgKi8KLQotCQkJCWhhc2ggPSBsZTY0X3RvX2NwdShlbnQtPmxkZV9oYXNoKTsKLQkJCQlpZiAoaGFzaCA8IHBvcykKLQkJCQkJLyoKLQkJCQkJICogU2tpcCB1bnRpbCB3ZSBmaW5kIHRhcmdldCBoYXNoCi0JCQkJCSAqIHZhbHVlLgotCQkJCQkgKi8KLQkJCQkJY29udGludWU7Ci0KLQkJCQluYW1lbGVuID0gbGUxNl90b19jcHUoZW50LT5sZGVfbmFtZWxlbik7Ci0JCQkJaWYgKG5hbWVsZW4gPT0gMCkKLQkJCQkJLyoKLQkJCQkJICogU2tpcCBkdW1teSByZWNvcmQuCi0JCQkJCSAqLwotCQkJCQljb250aW51ZTsKLQotCQkJCWlmIChhcGkzMiAmJiBoYXNoNjQpCi0JCQkJCWxoYXNoID0gaGFzaCA+PiAzMjsKLQkJCQllbHNlCi0JCQkJCWxoYXNoID0gaGFzaDsKLQkJCQlmaWRfbGVfdG9fY3B1KCZmaWQsICZlbnQtPmxkZV9maWQpOwotCQkJCWlubyA9IGNsX2ZpZF9idWlsZF9pbm8oJmZpZCwgYXBpMzIpOwotCQkJCXR5cGUgPSBsbF9kaXJlbnRfdHlwZV9nZXQoZW50KTsKLQkJCQljdHgtPnBvcyA9IGxoYXNoOwotCQkJCS8qIEZvciAnbGxfbmZzX2dldF9uYW1lX2ZpbGxkaXIoKScsIGl0IHdpbGwgdHJ5Ci0JCQkJICogdG8gYWNjZXNzIHRoZSAnZW50JyB0aHJvdWdoIGl0cyAnbGRlX25hbWUnLAotCQkJCSAqIHNvIHRoZSBwYXJhbWV0ZXIgJ25hbWUnIGZvciAnY3R4LT5hY3RvcigpJwotCQkJCSAqIG11c3QgYmUgcGFydCBvZiB0aGUgJ2VudCcuCi0JCQkJICovCi0JCQkJZG9uZSA9ICFkaXJfZW1pdChjdHgsIGVudC0+bGRlX25hbWUsCi0JCQkJCQkgbmFtZWxlbiwgaW5vLCB0eXBlKTsKLQkJCX0KLQkJCW5leHQgPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfZW5kKTsKLQkJCWlmICghZG9uZSkgewotCQkJCXBvcyA9IG5leHQ7Ci0JCQkJaWYgKHBvcyA9PSBNRFNfRElSX0VORF9PRkYpIHsKLQkJCQkJLyoKLQkJCQkJICogRW5kIG9mIGRpcmVjdG9yeSByZWFjaGVkLgotCQkJCQkgKi8KLQkJCQkJZG9uZSA9IDE7Ci0JCQkJCWxsX3JlbGVhc2VfcGFnZShwYWdlLCAwKTsKLQkJCQl9IGVsc2UgaWYgKDEgLyogY2hhaW4gaXMgZXhoYXVzdGVkKi8pIHsKLQkJCQkJLyoKLQkJCQkJICogTm9ybWFsIGNhc2U6IGNvbnRpbnVlIHRvIHRoZSBuZXh0Ci0JCQkJCSAqIHBhZ2UuCi0JCQkJCSAqLwotCQkJCQlsbF9yZWxlYXNlX3BhZ2UocGFnZSwKLQkJCQkJICAgIGxlMzJfdG9fY3B1KGRwLT5sZHBfZmxhZ3MpICYKLQkJCQkJCQlMREZfQ09MTElERSk7Ci0JCQkJCW5leHQgPSBwb3M7Ci0JCQkJCXBhZ2UgPSBsbF9nZXRfZGlyX3BhZ2UoaW5vZGUsIHBvcywKLQkJCQkJCQkgICAgICAgJmNoYWluKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvKgotCQkJCQkgKiBnbyBpbnRvIG92ZXJmbG93IHBhZ2UuCi0JCQkJCSAqLwotCQkJCQlMQVNTRVJUKGxlMzJfdG9fY3B1KGRwLT5sZHBfZmxhZ3MpICYKLQkJCQkJCUxERl9DT0xMSURFKTsKLQkJCQkJbGxfcmVsZWFzZV9wYWdlKHBhZ2UsIDEpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcG9zID0gaGFzaDsKLQkJCQlsbF9yZWxlYXNlX3BhZ2UocGFnZSwgMCk7Ci0JCQl9Ci0JCX0gZWxzZSB7CisJCWlmIChJU19FUlIocGFnZSkpIHsKIAkJCXJjID0gUFRSX0VSUihwYWdlKTsKLQkJCUNFUlJPUigiZXJyb3IgcmVhZGluZyBkaXIgIkRGSUQiIGF0ICVsdTogcmMgJWRcbiIsCi0JCQkgICAgICAgUEZJRCgmaW5mby0+bGxpX2ZpZCksICh1bnNpZ25lZCBsb25nKXBvcywgcmMpOworCQkJYnJlYWs7CisJCX0KKworCQloYXNoID0gTURTX0RJUl9FTkRfT0ZGOworCQlkcCA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJZm9yIChlbnQgPSBsdV9kaXJlbnRfc3RhcnQoZHApOyBlbnQgJiYgIWRvbmU7CisJCSAgICAgZW50ID0gbHVfZGlyZW50X25leHQoZW50KSkgeworCQkJX191MTYJICB0eXBlOworCQkJaW50CSAgICBuYW1lbGVuOworCQkJc3RydWN0IGx1X2ZpZCAgZmlkOworCQkJX191NjQJICBsaGFzaDsKKwkJCV9fdTY0CSAgaW5vOworCisJCQloYXNoID0gbGU2NF90b19jcHUoZW50LT5sZGVfaGFzaCk7CisJCQlpZiAoaGFzaCA8IHBvcykKKwkJCQkvKgorCQkJCSAqIFNraXAgdW50aWwgd2UgZmluZCB0YXJnZXQgaGFzaAorCQkJCSAqIHZhbHVlLgorCQkJCSAqLworCQkJCWNvbnRpbnVlOworCisJCQluYW1lbGVuID0gbGUxNl90b19jcHUoZW50LT5sZGVfbmFtZWxlbik7CisJCQlpZiAobmFtZWxlbiA9PSAwKQorCQkJCS8qCisJCQkJICogU2tpcCBkdW1teSByZWNvcmQuCisJCQkJICovCisJCQkJY29udGludWU7CisKKwkJCWlmIChpc19hcGkzMiAmJiBpc19oYXNoNjQpCisJCQkJbGhhc2ggPSBoYXNoID4+IDMyOworCQkJZWxzZQorCQkJCWxoYXNoID0gaGFzaDsKKwkJCWZpZF9sZV90b19jcHUoJmZpZCwgJmVudC0+bGRlX2ZpZCk7CisJCQlpbm8gPSBjbF9maWRfYnVpbGRfaW5vKCZmaWQsIGlzX2FwaTMyKTsKKwkJCXR5cGUgPSBsbF9kaXJlbnRfdHlwZV9nZXQoZW50KTsKKwkJCWN0eC0+cG9zID0gbGhhc2g7CisJCQkvKiBGb3IgJ2xsX25mc19nZXRfbmFtZV9maWxsZGlyKCknLCBpdCB3aWxsIHRyeQorCQkJICogdG8gYWNjZXNzIHRoZSAnZW50JyB0aHJvdWdoIGl0cyAnbGRlX25hbWUnLAorCQkJICogc28gdGhlIHBhcmFtZXRlciAnbmFtZScgZm9yICdjdHgtPmFjdG9yKCknCisJCQkgKiBtdXN0IGJlIHBhcnQgb2YgdGhlICdlbnQnLgorCQkJICovCisJCQlkb25lID0gIWRpcl9lbWl0KGN0eCwgZW50LT5sZGVfbmFtZSwKKwkJCQkJIG5hbWVsZW4sIGlubywgdHlwZSk7CisJCX0KKworCQlpZiAoZG9uZSkgeworCQkJcG9zID0gaGFzaDsKKwkJCWxsX3JlbGVhc2VfcGFnZShpbm9kZSwgcGFnZSwgZmFsc2UpOworCQkJYnJlYWs7CisJCX0KKworCQluZXh0ID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX2VuZCk7CisJCXBvcyA9IG5leHQ7CisJCWlmIChwb3MgPT0gTURTX0RJUl9FTkRfT0ZGKSB7CisJCQkvKgorCQkJICogRW5kIG9mIGRpcmVjdG9yeSByZWFjaGVkLgorCQkJICovCisJCQlkb25lID0gMTsKKwkJCWxsX3JlbGVhc2VfcGFnZShpbm9kZSwgcGFnZSwgZmFsc2UpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIE5vcm1hbCBjYXNlOiBjb250aW51ZSB0byB0aGUgbmV4dAorCQkJICogcGFnZS4KKwkJCSAqLworCQkJbGxfcmVsZWFzZV9wYWdlKGlub2RlLCBwYWdlLAorCQkJCQlsZTMyX3RvX2NwdShkcC0+bGRwX2ZsYWdzKSAmCisJCQkJCUxERl9DT0xMSURFKTsKKwkJCW5leHQgPSBwb3M7CisJCQlwYWdlID0gbGxfZ2V0X2Rpcl9wYWdlKGlub2RlLCBvcF9kYXRhLCBwb3MpOwogCQl9CiAJfQogCiAJY3R4LT5wb3MgPSBwb3M7Ci0JbGxfZGlyX2NoYWluX2ZpbmkoJmNoYWluKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTYxMyw5ICsyOTgsMTAgQEAKIAlfX3U2NCBwb3MgPSBsZmQgPyBsZmQtPmxmZF9wb3MgOiAwOwogCWludAkJCWhhc2g2NAk9IHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfNjRCSVRfSEFTSDsKIAlpbnQJCQlhcGkzMgk9IGxsX25lZWRfMzJiaXRfYXBpKHNiaSk7CisJc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7CiAJaW50CQkJcmM7CiAKLQlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDppbm9kZT0iREZJRCIoJXApIHBvcyAlbHUvJWxsdSAzMmJpdF9hcGkgJWRcbiIsCisJQ0RFQlVHKERfVkZTVFJBQ0UsICJWRlMgT3A6aW5vZGU9IkRGSUQiKCVwKSBwb3Mvc2l6ZSAlbHUvJWxsdSAzMmJpdF9hcGkgJWRcbiIsCiAJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIGlub2RlLCAodW5zaWduZWQgbG9uZylwb3MsCiAJICAgICAgIGlfc2l6ZV9yZWFkKGlub2RlKSwgYXBpMzIpOwogCkBAIC02MjcsMTkgKzMxMyw1OCBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGlub2RlLCBpbm9kZSwgTlVMTCwgMCwgMCwKKwkJCQkgICAgIExVU1RSRV9PUENfQU5ZLCBpbm9kZSk7CisJaWYgKElTX0VSUihvcF9kYXRhKSkgeworCQlyYyA9IFBUUl9FUlIob3BfZGF0YSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh1bmxpa2VseShvcF9kYXRhLT5vcF9tZWExKSkgeworCQkvKgorCQkgKiBUaGlzIGlzIG9ubHkgbmVlZGVkIGZvciBzdHJpcGVkIGRpciB0byBmaWxsIC4uLAorCQkgKiBzZWUgbG12X3JlYWRfcGFnZQorCQkgKi8KKwkJaWYgKGZpbGVfZGVudHJ5KGZpbHApLT5kX3BhcmVudCAmJgorCQkgICAgZmlsZV9kZW50cnkoZmlscCktPmRfcGFyZW50LT5kX2lub2RlKSB7CisJCQlfX3U2NCBpYml0cyA9IE1EU19JTk9ERUxPQ0tfVVBEQVRFOworCQkJc3RydWN0IGlub2RlICpwYXJlbnQ7CisKKwkJCXBhcmVudCA9IGZpbGVfZGVudHJ5KGZpbHApLT5kX3BhcmVudC0+ZF9pbm9kZTsKKwkJCWlmIChsbF9oYXZlX21kX2xvY2socGFyZW50LCAmaWJpdHMsIExDS19NSU5NT0RFKSkKKwkJCQlvcF9kYXRhLT5vcF9maWQzID0gKmxsX2lub2RlMmZpZChwYXJlbnQpOworCQl9CisKKwkJLyoKKwkJICogSWYgaXQgY2FuIG5vdCBmaW5kIGluIGNhY2hlLCBkbyBsb29rdXAgLi4gb24gdGhlIG1hc3RlcgorCQkgKiBvYmplY3QKKwkJICovCisJCWlmIChmaWRfaXNfemVybygmb3BfZGF0YS0+b3BfZmlkMykpIHsKKwkJCXJjID0gbGxfZGlyX2dldF9wYXJlbnRfZmlkKGlub2RlLCAmb3BfZGF0YS0+b3BfZmlkMyk7CisJCQlpZiAocmMpIHsKKwkJCQlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCX0KKwl9CisJb3BfZGF0YS0+b3BfbWF4X3BhZ2VzID0gc2JpLT5sbF9tZF9icndfcGFnZXM7CiAJY3R4LT5wb3MgPSBwb3M7Ci0JcmMgPSBsbF9kaXJfcmVhZChpbm9kZSwgY3R4KTsKKwlyYyA9IGxsX2Rpcl9yZWFkKGlub2RlLCAmcG9zLCBvcF9kYXRhLCBjdHgpOworCXBvcyA9IGN0eC0+cG9zOwogCWlmIChsZmQpCi0JCWxmZC0+bGZkX3BvcyA9IGN0eC0+cG9zOwotCWlmIChjdHgtPnBvcyA9PSBNRFNfRElSX0VORF9PRkYpIHsKKwkJbGZkLT5sZmRfcG9zID0gcG9zOworCisJaWYgKHBvcyA9PSBNRFNfRElSX0VORF9PRkYpIHsKIAkJaWYgKGFwaTMyKQotCQkJY3R4LT5wb3MgPSBMTF9ESVJfRU5EX09GRl8zMkJJVDsKKwkJCXBvcyA9IExMX0RJUl9FTkRfT0ZGXzMyQklUOwogCQllbHNlCi0JCQljdHgtPnBvcyA9IExMX0RJUl9FTkRfT0ZGOworCQkJcG9zID0gTExfRElSX0VORF9PRkY7CiAJfSBlbHNlIHsKIAkJaWYgKGFwaTMyICYmIGhhc2g2NCkKLQkJCWN0eC0+cG9zID4+PSAzMjsKKwkJCXBvcyA+Pj0gMzI7CiAJfQorCWN0eC0+cG9zID0gcG9zOworCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOwogCWZpbHAtPmZfdmVyc2lvbiA9IGlub2RlLT5pX3ZlcnNpb247CiAKIG91dDoKQEAgLTY2OCwxOCArMzkzLDQwIEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGxsX2Rpcl9zZXRkaXJzdHJpcGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBsbXZfdXNlcl9tZCAqbHVtcCwKLQkJCSAgICAgICBjaGFyICpmaWxlbmFtZSkKKy8qKgorICogQ3JlYXRlIHN0cmlwZWQgZGlyZWN0b3J5IHdpdGggc3BlY2lmaWVkIHN0cmlwZShAbHVtcCkKKyAqCisgKiBwYXJhbVtpbl0gcGFyZW50CXRoZSBwYXJlbnQgb2YgdGhlIGRpcmVjdG9yeS4KKyAqIHBhcmFtW2luXSBsdW1wCXRoZSBzcGVjaWZpZWQgc3RyaXBlcy4KKyAqIHBhcmFtW2luXSBkaXJuYW1lCXRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkuCisgKiBwYXJhbVtpbl0gbW9kZQl0aGUgc3BlY2lmaWVkIG1vZGUgb2YgdGhlIGRpcmVjdG9yeS4KKyAqCisgKiByZXR2YWwJCT0wIGlmIHN0cmlwZWQgZGlyZWN0b3J5IGlzIGJlaW5nIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICoJCQk8MCBpZiB0aGUgY3JlYXRpb24gaXMgZmFpbGVkLgorICovCitzdGF0aWMgaW50IGxsX2Rpcl9zZXRkaXJzdHJpcGUoc3RydWN0IGlub2RlICpwYXJlbnQsIHN0cnVjdCBsbXZfdXNlcl9tZCAqbHVtcCwKKwkJCSAgICAgICBjb25zdCBjaGFyICpkaXJuYW1lLCB1bW9kZV90IG1vZGUpCiB7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0ID0gTlVMTDsKIAlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKLQlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfaTJzYmkoZGlyKTsKLQlpbnQgbW9kZTsKKwlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfaTJzYmkocGFyZW50KTsKIAlpbnQgZXJyOwogCi0JbW9kZSA9ICh+Y3VycmVudF91bWFzaygpICYgMDc1NSkgfCBTX0lGRElSOwotCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgZGlyLCBOVUxMLCBmaWxlbmFtZSwKLQkJCQkgICAgIHN0cmxlbihmaWxlbmFtZSksIG1vZGUsIExVU1RSRV9PUENfTUtESVIsCisJaWYgKHVubGlrZWx5KGx1bXAtPmx1bV9tYWdpYyAhPSBMTVZfVVNFUl9NQUdJQykpCisJCXJldHVybiAtRUlOVkFMOworCisJQ0RFQlVHKERfVkZTVFJBQ0UsICJWRlMgT3A6aW5vZGU9IkRGSUQiKCVwKSBuYW1lICVzIHN0cmlwZV9vZmZzZXQgJWQsIHN0cmlwZV9jb3VudDogJXVcbiIsCisJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKHBhcmVudCkpLCBwYXJlbnQsIGRpcm5hbWUsCisJICAgICAgIChpbnQpbHVtcC0+bHVtX3N0cmlwZV9vZmZzZXQsIGx1bXAtPmx1bV9zdHJpcGVfY291bnQpOworCisJaWYgKGx1bXAtPmx1bV9tYWdpYyAhPSBjcHVfdG9fbGUzMihMTVZfVVNFUl9NQUdJQykpCisJCWx1c3RyZV9zd2FiX2xtdl91c2VyX21kKGx1bXApOworCisJaWYgKCFJU19QT1NJWEFDTChwYXJlbnQpIHx8ICFleHBfY29ubmVjdF91bWFzayhsbF9pMm1kZXhwKHBhcmVudCkpKQorCQltb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CisJbW9kZSA9IChtb2RlICYgKFNfSVJXWFVHTyB8IFNfSVNWVFgpKSB8IFNfSUZESVI7CisJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBwYXJlbnQsIE5VTEwsIGRpcm5hbWUsCisJCQkJICAgICBzdHJsZW4oZGlybmFtZSksIG1vZGUsIExVU1RSRV9PUENfTUtESVIsCiAJCQkJICAgICBsdW1wKTsKIAlpZiAoSVNfRVJSKG9wX2RhdGEpKSB7CiAJCWVyciA9IFBUUl9FUlIob3BfZGF0YSk7CkBAIC03MzAsNiArNDc3LDEzIEBACiAJCQlsdW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbG92X3VzZXJfbWRfdjMpOwogCQkJYnJlYWs7CiAJCX0KKwkJY2FzZSBMTVZfVVNFUl9NQUdJQzogeworCQkJaWYgKGx1bXAtPmxtbV9tYWdpYyAhPSBjcHVfdG9fbGUzMihMTVZfVVNFUl9NQUdJQykpCisJCQkJbHVzdHJlX3N3YWJfbG12X3VzZXJfbWQoCisJCQkJCShzdHJ1Y3QgbG12X3VzZXJfbWQgKilsdW1wKTsKKwkJCWx1bV9zaXplID0gc2l6ZW9mKHN0cnVjdCBsbXZfdXNlcl9tZCk7CisJCQlicmVhazsKKwkJfQogCQlkZWZhdWx0OiB7CiAJCQlDREVCVUcoRF9JT0NUTCwgImJhZCB1c2VybGFuZCBMT1YgTUFHSUM6ICUjMDh4ICE9ICUjMDh4IG5vciAlIzA4eFxuIiwKIAkJCSAgICAgICBsdW1wLT5sbW1fbWFnaWMsIExPVl9VU0VSX01BR0lDX1YxLApAQCAtNzQ2LDkgKzUwMCw2IEBACiAJaWYgKElTX0VSUihvcF9kYXRhKSkKIAkJcmV0dXJuIFBUUl9FUlIob3BfZGF0YSk7CiAKLQlpZiAobHVtcCAmJiBsdW1wLT5sbW1fbWFnaWMgPT0gY3B1X3RvX2xlMzIoTE1WX1VTRVJfTUFHSUMpKQotCQlvcF9kYXRhLT5vcF9jbGlfZmxhZ3MgfD0gQ0xJX1NFVF9NRUE7Ci0KIAkvKiBzd2FiYmluZyBpcyBkb25lIGluIGxvdl9zZXRzdHJpcGUoKSBvbiBzZXJ2ZXIgc2lkZSAqLwogCXJjID0gbWRfc2V0YXR0cihzYmktPmxsX21kX2V4cCwgb3BfZGF0YSwgbHVtcCwgbHVtX3NpemUsCiAJCQlOVUxMLCAwLCAmcmVxLCBOVUxMKTsKQEAgLTgwMyw4ICs1NTQsMTYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBsbF9kaXJfZ2V0c3RyaXBlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBsb3ZfbWRzX21kICoqbG1tcCwKLQkJICAgICBpbnQgKmxtbV9zaXplLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQorLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCB0byBnZXQgZGVmYXVsdCBMT1YvTE1WL0RlZmF1bHQgTE1WCisgKiBAdmFsaWQgd2lsbCBiZSB1c2VkIHRvIGluZGljYXRlIHdoaWNoIHN0cmlwZSBpdCB3aWxsIHJldHJpZXZlCisgKglPQkRfTURfTUVBCQlMTVYgc3RyaXBlIEVBCisgKglPQkRfTURfREVGQVVMVF9NRUEJRGVmYXVsdCBMTVYgc3RyaXBlIEVBCisgKglvdGhlcndpc2UJCURlZmF1bHQgTE9WIEVBLgorICogRWFjaCB0aW1lLCBpdCBjYW4gb25seSByZXRyaWV2ZSAxIHN0cmlwZSBFQQorICoqLworaW50IGxsX2Rpcl9nZXRzdHJpcGUoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqKnBsbW0sIGludCAqcGxtbV9zaXplLAorCQkgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QsIHU2NCB2YWxpZCkKIHsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfaTJzYmkoaW5vZGUpOwogCXN0cnVjdCBtZHRfYm9keSAgICpib2R5OwpAQCAtODEzLDcgKzU3Miw3IEBACiAJaW50IHJjLCBsbW1zaXplOwogCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhOwogCi0JcmMgPSBsbF9nZXRfZGVmYXVsdF9tZHNpemUoc2JpLCAmbG1tc2l6ZSk7CisJcmMgPSBsbF9nZXRfbWF4X21kc2l6ZShzYmksICZsbW1zaXplKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApAQCAtODM0LDkgKzU5Myw5IEBACiAKIAlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKIAotCWxtbXNpemUgPSBib2R5LT5lYWRhdGFzaXplOworCWxtbXNpemUgPSBib2R5LT5tYm9fZWFkYXRhc2l6ZTsKIAotCWlmICghKGJvZHktPnZhbGlkICYgKE9CRF9NRF9GTEVBU0laRSB8IE9CRF9NRF9GTERJUkVBKSkgfHwKKwlpZiAoIShib2R5LT5tYm9fdmFsaWQgJiAoT0JEX01EX0ZMRUFTSVpFIHwgT0JEX01EX0ZMRElSRUEpKSB8fAogCSAgICBsbW1zaXplID09IDApIHsKIAkJcmMgPSAtRU5PREFUQTsKIAkJZ290byBvdXQ7CkBAIC04NDQsNiArNjAzLDcgQEAKIAogCWxtbSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9zaXplZF9nZXQoJnJlcS0+cnFfcGlsbCwKIAkJCQkJICAgJlJNRl9NRFRfTUQsIGxtbXNpemUpOworCUxBU1NFUlQobG1tKTsKIAogCS8qCiAJICogVGhpcyBpcyBjb21pbmcgZnJvbSB0aGUgTURTLCBzbyBpcyBwcm9iYWJseSBpbgpAQCAtODYwLDQwICs2MjAsNTEgQEAKIAkJaWYgKGNwdV90b19sZTMyKExPVl9NQUdJQykgIT0gTE9WX01BR0lDKQogCQkJbHVzdHJlX3N3YWJfbG92X3VzZXJfbWRfdjMoKHN0cnVjdCBsb3ZfdXNlcl9tZF92MyAqKWxtbSk7CiAJCWJyZWFrOworCWNhc2UgTE1WX01BR0lDX1YxOgorCQlpZiAoY3B1X3RvX2xlMzIoTE1WX01BR0lDKSAhPSBMTVZfTUFHSUMpCisJCQlsdXN0cmVfc3dhYl9sbXZfbWRzX21kKCh1bmlvbiBsbXZfbWRzX21kICopbG1tKTsKKwkJYnJlYWs7CisJY2FzZSBMTVZfVVNFUl9NQUdJQzoKKwkJaWYgKGNwdV90b19sZTMyKExNVl9VU0VSX01BR0lDKSAhPSBMTVZfVVNFUl9NQUdJQykKKwkJCWx1c3RyZV9zd2FiX2xtdl91c2VyX21kKChzdHJ1Y3QgbG12X3VzZXJfbWQgKilsbW0pOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlDRVJST1IoInVua25vd24gbWFnaWM6ICVsWFxuIiwgKHVuc2lnbmVkIGxvbmcpbG1tLT5sbW1fbWFnaWMpOwogCQlyYyA9IC1FUFJPVE87CiAJfQogb3V0OgotCSpsbW1wID0gbG1tOwotCSpsbW1fc2l6ZSA9IGxtbXNpemU7CisJKnBsbW0gPSBsbW07CisJKnBsbW1fc2l6ZSA9IGxtbXNpemU7CiAJKnJlcXVlc3QgPSByZXE7CiAJcmV0dXJuIHJjOwogfQogCitpbnQgbGxfZ2V0X21kdF9pZHhfYnlfZmlkKHN0cnVjdCBsbF9zYl9pbmZvICpzYmksIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKK3sKKwlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKKwlpbnQgbWR0X2luZGV4LCByYzsKKworCW9wX2RhdGEgPSBremFsbG9jKHNpemVvZigqb3BfZGF0YSksIEdGUF9OT0ZTKTsKKwlpZiAoIW9wX2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJb3BfZGF0YS0+b3BfZmxhZ3MgfD0gTUZfR0VUX01EVF9JRFg7CisJb3BfZGF0YS0+b3BfZmlkMSA9ICpmaWQ7CisJcmMgPSBtZF9nZXRhdHRyKHNiaS0+bGxfbWRfZXhwLCBvcF9kYXRhLCBOVUxMKTsKKwltZHRfaW5kZXggPSBvcF9kYXRhLT5vcF9tZHM7CisJa3ZmcmVlKG9wX2RhdGEpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiBtZHRfaW5kZXg7Cit9CisKIC8qCiAgKiAgR2V0IE1EVCBpbmRleCBmb3IgdGhlIGlub2RlLgogICovCiBpbnQgbGxfZ2V0X21kdF9pZHgoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfaTJzYmkoaW5vZGUpOwotCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhOwotCWludCByYywgbWR0aWR4OwotCi0Jb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBpbm9kZSwgTlVMTCwgTlVMTCwgMCwKLQkJCQkgICAgIDAsIExVU1RSRV9PUENfQU5ZLCBOVUxMKTsKLQlpZiAoSVNfRVJSKG9wX2RhdGEpKQotCQlyZXR1cm4gUFRSX0VSUihvcF9kYXRhKTsKLQotCW9wX2RhdGEtPm9wX2ZsYWdzIHw9IE1GX0dFVF9NRFRfSURYOwotCXJjID0gbWRfZ2V0YXR0cihzYmktPmxsX21kX2V4cCwgb3BfZGF0YSwgTlVMTCk7Ci0JbWR0aWR4ID0gb3BfZGF0YS0+b3BfbWRzOwotCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RFQlVHKERfSU5GTywgIm1kX2dldGF0dHJfbmFtZTogJWRcbiIsIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlyZXR1cm4gbWR0aWR4OworCXJldHVybiBsbF9nZXRfbWR0X2lkeF9ieV9maWQobGxfaTJzYmkoaW5vZGUpLCBsbF9pbm9kZTJmaWQoaW5vZGUpKTsKIH0KIAogLyoqCkBAIC0xMjg4LDExICsxMDU5LDkgQEAKIAkJcmV0dXJuIDA7CiAJfQogCWNhc2UgSU9DX01EQ19MT09LVVA6IHsKLQkJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0ID0gTlVMTDsKIAkJaW50IG5hbWVsZW4sIGxlbiA9IDA7CiAJCWNoYXIgKmJ1ZiA9IE5VTEw7CiAJCWNoYXIgKmZpbGVuYW1lOwotCQlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKIAogCQlyYyA9IG9iZF9pb2N0bF9nZXRkYXRhKCZidWYsICZsZW4sICh2b2lkIF9fdXNlciAqKWFyZyk7CiAJCWlmIChyYykKQEAgLTEzMDgsMjEgKzEwNzcsMTMgQEAKIAkJCWdvdG8gb3V0X2ZyZWU7CiAJCX0KIAotCQlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGlub2RlLCBOVUxMLCBmaWxlbmFtZSwgbmFtZWxlbiwKLQkJCQkJICAgICAwLCBMVVNUUkVfT1BDX0FOWSwgTlVMTCk7Ci0JCWlmIChJU19FUlIob3BfZGF0YSkpIHsKLQkJCXJjID0gUFRSX0VSUihvcF9kYXRhKTsKLQkJCWdvdG8gb3V0X2ZyZWU7Ci0JCX0KLQotCQlvcF9kYXRhLT5vcF92YWxpZCA9IE9CRF9NRF9GTElEOwotCQlyYyA9IG1kX2dldGF0dHJfbmFtZShzYmktPmxsX21kX2V4cCwgb3BfZGF0YSwgJnJlcXVlc3QpOwotCQlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKKwkJcmMgPSBsbF9nZXRfZmlkX2J5X25hbWUoaW5vZGUsIGZpbGVuYW1lLCBuYW1lbGVuLCBOVUxMKTsKIAkJaWYgKHJjIDwgMCkgewotCQkJQ0RFQlVHKERfSU5GTywgIm1kX2dldGF0dHJfbmFtZTogJWRcbiIsIHJjKTsKKwkJCUNFUlJPUigiJXM6IGxvb2t1cCAlLipzIGZhaWxlZDogcmMgPSAlZFxuIiwKKwkJCSAgICAgICBsbF9nZXRfZnNuYW1lKGlub2RlLT5pX3NiLCBOVUxMLCAwKSwgbmFtZWxlbiwKKwkJCSAgICAgICBmaWxlbmFtZSwgcmMpOwogCQkJZ290byBvdXRfZnJlZTsKIAkJfQotCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcXVlc3QpOwogb3V0X2ZyZWU6CiAJCW9iZF9pb2N0bF9mcmVlZGF0YShidWYsIGxlbik7CiAJCXJldHVybiByYzsKQEAgLTEzMzMsNiArMTA5NCw3IEBACiAJCWNoYXIJCSpmaWxlbmFtZTsKIAkJaW50CQkgbmFtZWxlbiA9IDA7CiAJCWludAkJIGx1bWxlbiA9IDA7CisJCXVtb2RlX3QgbW9kZTsKIAkJaW50CQkgbGVuOwogCQlpbnQJCSByYzsKIApAQCAtMTM2NiwxNSArMTEyOCwzMiBAQAogCQkJZ290byBsbXZfb3V0X2ZyZWU7CiAJCX0KIAotCQkvKioKLQkJICogbGxfZGlyX3NldGRpcnN0cmlwZSB3aWxsIGJlIHVzZWQgdG8gc2V0IGRpciBzdHJpcGUKLQkJICogIG1kY19jcmVhdGUtLS0+bWR0X3JlaW50X2NyZWF0ZSAod2l0aCBkaXJzdHJpcGUpCi0JCSAqLwotCQlyYyA9IGxsX2Rpcl9zZXRkaXJzdHJpcGUoaW5vZGUsIGx1bSwgZmlsZW5hbWUpOworI2lmIE9CRF9PQ0RfVkVSU0lPTigyLCA5LCA1MCwgMCkgPiBMVVNUUkVfVkVSU0lPTl9DT0RFCisJCW1vZGUgPSBkYXRhLT5pb2NfdHlwZSAhPSAwID8gZGF0YS0+aW9jX3R5cGUgOiBTX0lSV1hVR087CisjZWxzZQorCQltb2RlID0gZGF0YS0+aW9jX3R5cGU7CisjZW5kaWYKKwkJcmMgPSBsbF9kaXJfc2V0ZGlyc3RyaXBlKGlub2RlLCBsdW0sIGZpbGVuYW1lLCBtb2RlKTsKIGxtdl9vdXRfZnJlZToKIAkJb2JkX2lvY3RsX2ZyZWVkYXRhKGJ1ZiwgbGVuKTsKIAkJcmV0dXJuIHJjOwogCX0KKwljYXNlIExMX0lPQ19MTVZfU0VUX0RFRkFVTFRfU1RSSVBFOiB7CisJCXN0cnVjdCBsbXZfdXNlcl9tZCBfX3VzZXIgKnVsdW1wOworCQlzdHJ1Y3QgbG12X3VzZXJfbWQgbHVtOworCQlpbnQgcmM7CisKKwkJdWx1bXAgPSAoc3RydWN0IGxtdl91c2VyX21kIF9fdXNlciAqKWFyZzsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZsdW0sIHVsdW1wLCBzaXplb2YobHVtKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAobHVtLmx1bV9tYWdpYyAhPSBMTVZfVVNFUl9NQUdJQykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJjID0gbGxfZGlyX3NldHN0cmlwZShpbm9kZSwgKHN0cnVjdCBsb3ZfdXNlcl9tZCAqKSZsdW0sIDApOworCisJCXJldHVybiByYzsKKwl9CiAJY2FzZSBMTF9JT0NfTE9WX1NFVFNUUklQRTogewogCQlzdHJ1Y3QgbG92X3VzZXJfbWRfdjMgbHVtdjM7CiAJCXN0cnVjdCBsb3ZfdXNlcl9tZF92MSAqbHVtdjEgPSAoc3RydWN0IGxvdl91c2VyX21kX3YxICopJmx1bXYzOwpAQCAtMTQwNCw1MCArMTE4MywxMDAgQEAKIAkJcmV0dXJuIHJjOwogCX0KIAljYXNlIExMX0lPQ19MTVZfR0VUU1RSSVBFOiB7Ci0JCXN0cnVjdCBsbXZfdXNlcl9tZCBfX3VzZXIgKmx1bXAgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJCXN0cnVjdCBsbXZfdXNlcl9tZCBfX3VzZXIgKnVsbXY7CiAJCXN0cnVjdCBsbXZfdXNlcl9tZCBsdW07Ci0JCXN0cnVjdCBsbXZfdXNlcl9tZCAqdG1wOworCQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QgPSBOVUxMOworCQlzdHJ1Y3QgbG12X3VzZXJfbWQgKnRtcCA9IE5VTEw7CisJCXVuaW9uIGxtdl9tZHNfbWQgKmxtbSA9IE5VTEw7CisJCXU2NCB2YWxpZCA9IDA7CisJCWludCBzdHJpcGVfY291bnQ7CisJCWludCBtZHRfaW5kZXg7CiAJCWludCBsdW1fc2l6ZTsKLQkJaW50IHJjID0gMDsKLQkJaW50IG1kdGluZGV4OworCQlpbnQgbG1tc2l6ZTsKKwkJaW50IHJjOworCQlpbnQgaTsKIAotCQlpZiAoY29weV9mcm9tX3VzZXIoJmx1bSwgbHVtcCwgc2l6ZW9mKHN0cnVjdCBsbXZfdXNlcl9tZCkpKQorCQl1bG12ID0gKHN0cnVjdCBsbXZfdXNlcl9tZCBfX3VzZXIgKilhcmc7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbHVtLCB1bG12LCBzaXplb2YoKnVsbXYpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCi0JCWlmIChsdW0ubHVtX21hZ2ljICE9IExNVl9NQUdJQ19WMSkKKwkJLyoKKwkJICogbHVtX21hZ2ljIHdpbGwgaW5kaWNhdGUgd2hpY2ggc3RyaXBlIHRoZSBpb2N0bCB3aWxsIGxpa2UKKwkJICogdG8gZ2V0LCBMTVZfTUFHSUNfVjEgaXMgZm9yIG5vcm1hbCBMTVYgc3RyaXBlLCBMTVZfVVNFUl9NQUdJQworCQkgKiBpcyBmb3IgZGVmYXVsdCBMTVYgc3RyaXBlCisJCSAqLworCQlpZiAobHVtLmx1bV9tYWdpYyA9PSBMTVZfTUFHSUNfVjEpCisJCQl2YWxpZCB8PSBPQkRfTURfTUVBOworCQllbHNlIGlmIChsdW0ubHVtX21hZ2ljID09IExNVl9VU0VSX01BR0lDKQorCQkJdmFsaWQgfD0gT0JEX01EX0RFRkFVTFRfTUVBOworCQllbHNlCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlsdW1fc2l6ZSA9IGxtdl91c2VyX21kX3NpemUoMSwgTE1WX01BR0lDX1YxKTsKKwkJcmMgPSBsbF9kaXJfZ2V0c3RyaXBlKGlub2RlLCAodm9pZCAqKikmbG1tLCAmbG1tc2l6ZSwgJnJlcXVlc3QsCisJCQkJICAgICAgdmFsaWQpOworCQlpZiAocmMpCisJCQlnb3RvIGZpbmlzaF9yZXE7CisKKwkJLyogR2V0IGRlZmF1bHQgTE1WIEVBICovCisJCWlmIChsdW0ubHVtX21hZ2ljID09IExNVl9VU0VSX01BR0lDKSB7CisJCQlpZiAocmMpCisJCQkJZ290byBmaW5pc2hfcmVxOworCisJCQlpZiAobG1tc2l6ZSA+IHNpemVvZigqdWxtdikpIHsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJZ290byBmaW5pc2hfcmVxOworCQkJfQorCisJCQlpZiAoY29weV90b191c2VyKHVsbXYsIGxtbSwgbG1tc2l6ZSkpCisJCQkJcmMgPSAtRUZBVUxUOworCisJCQlnb3RvIGZpbmlzaF9yZXE7CisJCX0KKworCQlzdHJpcGVfY291bnQgPSBsbXZfbWRzX21kX3N0cmlwZV9jb3VudF9nZXQobG1tKTsKKwkJbHVtX3NpemUgPSBsbXZfdXNlcl9tZF9zaXplKHN0cmlwZV9jb3VudCwgTE1WX01BR0lDX1YxKTsKIAkJdG1wID0ga3phbGxvYyhsdW1fc2l6ZSwgR0ZQX05PRlMpOwogCQlpZiAoIXRtcCkgewogCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBmcmVlX2xtdjsKKwkJCWdvdG8gZmluaXNoX3JlcTsKIAkJfQogCi0JCSp0bXAgPSBsdW07Ci0JCXRtcC0+bHVtX3R5cGUgPSBMTVZfU1RSSVBFX1RZUEU7Ci0JCXRtcC0+bHVtX3N0cmlwZV9jb3VudCA9IDE7Ci0JCW1kdGluZGV4ID0gbGxfZ2V0X21kdF9pZHgoaW5vZGUpOwotCQlpZiAobWR0aW5kZXggPCAwKSB7CisJCW1kdF9pbmRleCA9IGxsX2dldF9tZHRfaWR4KGlub2RlKTsKKwkJaWYgKG1kdF9pbmRleCA8IDApIHsKIAkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gZnJlZV9sbXY7CisJCQlnb3RvIG91dF90bXA7CisJCX0KKwkJdG1wLT5sdW1fbWFnaWMgPSBMTVZfTUFHSUNfVjE7CisJCXRtcC0+bHVtX3N0cmlwZV9jb3VudCA9IDA7CisJCXRtcC0+bHVtX3N0cmlwZV9vZmZzZXQgPSBtZHRfaW5kZXg7CisJCWZvciAoaSA9IDA7IGkgPCBzdHJpcGVfY291bnQ7IGkrKykgeworCQkJc3RydWN0IGx1X2ZpZCBmaWQ7CisKKwkJCWZpZF9sZV90b19jcHUoJmZpZCwgJmxtbS0+bG12X21kX3YxLmxtdl9zdHJpcGVfZmlkc1tpXSk7CisJCQltZHRfaW5kZXggPSBsbF9nZXRfbWR0X2lkeF9ieV9maWQoc2JpLCAmZmlkKTsKKwkJCWlmIChtZHRfaW5kZXggPCAwKSB7CisJCQkJcmMgPSBtZHRfaW5kZXg7CisJCQkJZ290byBvdXRfdG1wOworCQkJfQorCQkJdG1wLT5sdW1fb2JqZWN0c1tpXS5sdW1fbWRzID0gbWR0X2luZGV4OworCQkJdG1wLT5sdW1fb2JqZWN0c1tpXS5sdW1fZmlkID0gZmlkOworCQkJdG1wLT5sdW1fc3RyaXBlX2NvdW50Kys7CiAJCX0KIAotCQl0bXAtPmx1bV9zdHJpcGVfb2Zmc2V0ID0gbWR0aW5kZXg7Ci0JCXRtcC0+bHVtX29iamVjdHNbMF0ubHVtX21kcyA9IG1kdGluZGV4OwotCQltZW1jcHkoJnRtcC0+bHVtX29iamVjdHNbMF0ubHVtX2ZpZCwgbGxfaW5vZGUyZmlkKGlub2RlKSwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbHVfZmlkKSk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCB0bXAsIGx1bV9zaXplKSkgeworCQlpZiAoY29weV90b191c2VyKHVsbXYsIHRtcCwgbHVtX3NpemUpKSB7CiAJCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGZyZWVfbG12OworCQkJZ290byBvdXRfdG1wOwogCQl9Ci1mcmVlX2xtdjoKK291dF90bXA6CiAJCWtmcmVlKHRtcCk7CitmaW5pc2hfcmVxOgorCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcXVlc3QpOwogCQlyZXR1cm4gcmM7CiAJfQorCiAJY2FzZSBMTF9JT0NfTE9WX1NXQVBfTEFZT1VUUzoKIAkJcmV0dXJuIC1FUEVSTTsKLQljYXNlIExMX0lPQ19PQkRfU1RBVEZTOgorCWNhc2UgSU9DX09CRF9TVEFURlM6CiAJCXJldHVybiBsbF9vYmRfc3RhdGZzKGlub2RlLCAodm9pZCBfX3VzZXIgKilhcmcpOwogCWNhc2UgTExfSU9DX0xPVl9HRVRTVFJJUEU6CiAJY2FzZSBMTF9JT0NfTURDX0dFVElORk86CkBAIC0xNDY5LDcgKzEyOTgsOCBAQAogCQkJcmMgPSBsbF9sb3ZfZ2V0c3RyaXBlX2VhX2luZm8oaW5vZGUsIGZpbGVuYW1lLCAmbG1tLAogCQkJCQkJICAgICAgJmxtbXNpemUsICZyZXF1ZXN0KTsKIAkJfSBlbHNlIHsKLQkJCXJjID0gbGxfZGlyX2dldHN0cmlwZShpbm9kZSwgJmxtbSwgJmxtbXNpemUsICZyZXF1ZXN0KTsKKwkJCXJjID0gbGxfZGlyX2dldHN0cmlwZShpbm9kZSwgKHZvaWQgKiopJmxtbSwgJmxtbXNpemUsCisJCQkJCSAgICAgICZyZXF1ZXN0LCAwKTsKIAkJfQogCiAJCWlmIChyZXF1ZXN0KSB7CkBAIC0xNTEyLDE4ICsxMzQyLDE4IEBACiAJCQlsc3RhdF90IHN0ID0geyAwIH07CiAKIAkJCXN0LnN0X2RldiAgICAgPSBpbm9kZS0+aV9zYi0+c19kZXY7Ci0JCQlzdC5zdF9tb2RlICAgID0gYm9keS0+bW9kZTsKLQkJCXN0LnN0X25saW5rICAgPSBib2R5LT5ubGluazsKLQkJCXN0LnN0X3VpZCAgICAgPSBib2R5LT51aWQ7Ci0JCQlzdC5zdF9naWQgICAgID0gYm9keS0+Z2lkOwotCQkJc3Quc3RfcmRldiAgICA9IGJvZHktPnJkZXY7Ci0JCQlzdC5zdF9zaXplICAgID0gYm9keS0+c2l6ZTsKKwkJCXN0LnN0X21vZGUgICAgPSBib2R5LT5tYm9fbW9kZTsKKwkJCXN0LnN0X25saW5rICAgPSBib2R5LT5tYm9fbmxpbms7CisJCQlzdC5zdF91aWQgICAgID0gYm9keS0+bWJvX3VpZDsKKwkJCXN0LnN0X2dpZCAgICAgPSBib2R5LT5tYm9fZ2lkOworCQkJc3Quc3RfcmRldiAgICA9IGJvZHktPm1ib19yZGV2OworCQkJc3Quc3Rfc2l6ZSAgICA9IGJvZHktPm1ib19zaXplOwogCQkJc3Quc3RfYmxrc2l6ZSA9IFBBR0VfU0laRTsKLQkJCXN0LnN0X2Jsb2NrcyAgPSBib2R5LT5ibG9ja3M7Ci0JCQlzdC5zdF9hdGltZSAgID0gYm9keS0+YXRpbWU7Ci0JCQlzdC5zdF9tdGltZSAgID0gYm9keS0+bXRpbWU7Ci0JCQlzdC5zdF9jdGltZSAgID0gYm9keS0+Y3RpbWU7Ci0JCQlzdC5zdF9pbm8gICAgID0gY2xfZmlkX2J1aWxkX2lubygmYm9keS0+ZmlkMSwKKwkJCXN0LnN0X2Jsb2NrcyAgPSBib2R5LT5tYm9fYmxvY2tzOworCQkJc3Quc3RfYXRpbWUgICA9IGJvZHktPm1ib19hdGltZTsKKwkJCXN0LnN0X210aW1lICAgPSBib2R5LT5tYm9fbXRpbWU7CisJCQlzdC5zdF9jdGltZSAgID0gYm9keS0+bWJvX2N0aW1lOworCQkJc3Quc3RfaW5vICAgICA9IGNsX2ZpZF9idWlsZF9pbm8oJmJvZHktPm1ib19maWQxLAogCQkJCQkJCSBzYmktPmxsX2ZsYWdzICYKIAkJCQkJCQkgTExfU0JJXzMyQklUX0FQSSk7CiAKQEAgLTE2MTEsOSArMTQ0MSw2IEBACiAJCWt2ZnJlZShsbW0pOwogCQlyZXR1cm4gcmM7CiAJfQotCWNhc2UgT0JEX0lPQ19MTE9HX0NBVElORk86IHsKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCX0KIAljYXNlIE9CRF9JT0NfUVVPVEFDSEVDSzogewogCQlzdHJ1Y3Qgb2JkX3F1b3RhY3RsICpvcWN0bDsKIAkJaW50IGVycm9yID0gMDsKQEAgLTE2NzEsNyArMTQ5OCw3IEBACiAJCWtmcmVlKGNoZWNrKTsKIAkJcmV0dXJuIHJjOwogCX0KLQljYXNlIExMX0lPQ19RVU9UQUNUTDogeworCWNhc2UgT0JEX0lPQ19RVU9UQUNUTDogewogCQlzdHJ1Y3QgaWZfcXVvdGFjdGwgKnFjdGw7CiAKIAkJcWN0bCA9IGt6YWxsb2Moc2l6ZW9mKCpxY3RsKSwgR0ZQX05PRlMpOwpAQCAtMTczOSw2ICsxNTY2LDI1IEBACiAJCXJldHVybiByYzsKIAljYXNlIE9CRF9JT0NfRklEMlBBVEg6CiAJCXJldHVybiBsbF9maWQycGF0aChpbm9kZSwgKHZvaWQgX191c2VyICopYXJnKTsKKwljYXNlIExMX0lPQ19HRVRQQVJFTlQ6CisJCXJldHVybiBsbF9nZXRwYXJlbnQoZmlsZSwgKHZvaWQgX191c2VyICopYXJnKTsKKwljYXNlIExMX0lPQ19GSUQyTURUSURYOiB7CisJCXN0cnVjdCBvYmRfZXhwb3J0ICpleHAgPSBsbF9pMm1kZXhwKGlub2RlKTsKKwkJc3RydWN0IGx1X2ZpZCBmaWQ7CisJCV9fdTMyIGluZGV4OworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmZmlkLCAoY29uc3Qgc3RydWN0IGx1X2ZpZCBfX3VzZXIgKilhcmcsCisJCQkJICAgc2l6ZW9mKGZpZCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJLyogQ2FsbCBtZGNfaW9jb250cm9sICovCisJCXJjID0gb2JkX2lvY29udHJvbChMTF9JT0NfRklEMk1EVElEWCwgZXhwLCBzaXplb2YoZmlkKSwgJmZpZCwKKwkJCQkgICAmaW5kZXgpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJcmV0dXJuIGluZGV4OworCX0KIAljYXNlIExMX0lPQ19IU01fUkVRVUVTVDogewogCQlzdHJ1Y3QgaHNtX3VzZXJfcmVxdWVzdAkqaHVyOwogCQlzc2l6ZV90CQkJIHRvdGFsc2l6ZTsKQEAgLTE4NTMsNiArMTY5OSw0NSBAQAogCQlrZnJlZShjb3B5KTsKIAkJcmV0dXJuIHJjOwogCX0KKwljYXNlIExMX0lPQ19NSUdSQVRFOiB7CisJCWNoYXIgKmJ1ZiA9IE5VTEw7CisJCWNvbnN0IGNoYXIgKmZpbGVuYW1lOworCQlpbnQgbmFtZWxlbiA9IDA7CisJCWludCBsZW47CisJCWludCByYzsKKwkJaW50IG1kdGlkeDsKKworCQlyYyA9IG9iZF9pb2N0bF9nZXRkYXRhKCZidWYsICZsZW4sICh2b2lkIF9fdXNlciAqKWFyZyk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisKKwkJZGF0YSA9IChzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEgKilidWY7CisJCWlmICghZGF0YS0+aW9jX2lubGJ1ZjEgfHwgIWRhdGEtPmlvY19pbmxidWYyIHx8CisJCSAgICAhZGF0YS0+aW9jX2lubGxlbjEgfHwgIWRhdGEtPmlvY19pbmxsZW4yKSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIG1pZ3JhdGVfZnJlZTsKKwkJfQorCisJCWZpbGVuYW1lID0gZGF0YS0+aW9jX2lubGJ1ZjE7CisJCW5hbWVsZW4gPSBkYXRhLT5pb2NfaW5sbGVuMTsKKwkJaWYgKG5hbWVsZW4gPCAxIHx8IG5hbWVsZW4gIT0gc3RybGVuKGZpbGVuYW1lKSArIDEpIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gbWlncmF0ZV9mcmVlOworCQl9CisKKwkJaWYgKGRhdGEtPmlvY19pbmxsZW4yICE9IHNpemVvZihtZHRpZHgpKSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIG1pZ3JhdGVfZnJlZTsKKwkJfQorCQltZHRpZHggPSAqKGludCAqKWRhdGEtPmlvY19pbmxidWYyOworCisJCXJjID0gbGxfbWlncmF0ZShpbm9kZSwgZmlsZSwgbWR0aWR4LCBmaWxlbmFtZSwgbmFtZWxlbiAtIDEpOworbWlncmF0ZV9mcmVlOgorCQlvYmRfaW9jdGxfZnJlZWRhdGEoYnVmLCBsZW4pOworCisJCXJldHVybiByYzsKKwl9CisKIAlkZWZhdWx0OgogCQlyZXR1cm4gb2JkX2lvY29udHJvbChjbWQsIHNiaS0+bGxfZHRfZXhwLCAwLCBOVUxMLAogCQkJCSAgICAgKHZvaWQgX191c2VyICopYXJnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2ZpbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2ZpbGUuYwppbmRleCA1NzI4MWI5Li42ZTNhMTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9maWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZmlsZS5jCkBAIC0zOCwxNCArMzgsMTUgQEAKIAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTElURQogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2RsbS5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KLSNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2xsX2ZpZW1hcC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pb2N0bC5oIgogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9jbF9vYmplY3QuaCIKKyNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgogCiBzdGF0aWMgaW50CiBsbF9wdXRfZ3JvdXBsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFyZyk7CkBAIC0xODgsMTcgKzE4OSwxMSBAQAogCQlzcGluX3VubG9jaygmbGxpLT5sbGlfbG9jayk7CiAJfQogCi0JaWYgKHJjID09IDApIHsKLQkJcmMgPSBsbF9vYmplY3RzX2Rlc3Ryb3kocmVxLCBpbm9kZSk7Ci0JCWlmIChyYykKLQkJCUNFUlJPUigiaW5vZGUgJWx1IGxsX29iamVjdHMgZGVzdHJveTogcmMgPSAlZFxuIiwKLQkJCSAgICAgICBpbm9kZS0+aV9pbm8sIHJjKTsKLQl9CiAJaWYgKHJjID09IDAgJiYgb3BfZGF0YS0+b3BfYmlhcyAmIE1EU19IU01fUkVMRUFTRSkgewogCQlzdHJ1Y3QgbWR0X2JvZHkgKmJvZHk7CiAKIAkJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7Ci0JCWlmICghKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMUkVMRUFTRUQpKQorCQlpZiAoIShib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxSRUxFQVNFRCkpCiAJCQlyYyA9IC1FQlVTWTsKIAl9CiAKQEAgLTM0OSwxMyArMzQ0LDExIEBACiAJZmQgPSBMVVNUUkVfRlBSSVZBVEUoZmlsZSk7CiAJTEFTU0VSVChmZCk7CiAKLQkvKiBUaGUgbGFzdCByZWYgb24gQGZpbGUsIG1heWJlIG5vdCBiZSB0aGUgb3duZXIgcGlkIG9mIHN0YXRhaGVhZC4KLQkgKiBEaWZmZXJlbnQgcHJvY2Vzc2VzIGNhbiBvcGVuIHRoZSBzYW1lIGRpciwgImxsX29wZW5kaXJfa2V5IiBtZWFuczoKLQkgKiBpdCBpcyBtZSB0aGF0IHNob3VsZCBzdG9wIHRoZSBzdGF0YWhlYWQgdGhyZWFkLgorCS8qIFRoZSBsYXN0IHJlZiBvbiBAZmlsZSwgbWF5YmUgbm90IGJlIHRoZSBvd25lciBwaWQgb2Ygc3RhdGFoZWFkLAorCSAqIGJlY2F1c2UgcGFyZW50IGFuZCBjaGlsZCBwcm9jZXNzIGNhbiBzaGFyZSB0aGUgc2FtZSBmaWxlIGhhbmRsZS4KIAkgKi8KLQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiBsbGktPmxsaV9vcGVuZGlyX2tleSA9PSBmZCAmJgotCSAgICBsbGktPmxsaV9vcGVuZGlyX3BpZCAhPSAwKQotCQlsbF9zdG9wX3N0YXRhaGVhZChpbm9kZSwgbGxpLT5sbGlfb3BlbmRpcl9rZXkpOworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmIGxsaS0+bGxpX29wZW5kaXJfa2V5ID09IGZkKQorCQlsbF9kZWF1dGhvcml6ZV9zdGF0YWhlYWQoaW5vZGUsIGZkKTsKIAogCWlmIChpc19yb290X2lub2RlKGlub2RlKSkgewogCQlMVVNUUkVfRlBSSVZBVEUoZmlsZSkgPSBOVUxMOwpAQCAtMzY0LDcgKzM1Nyw4IEBACiAJfQogCiAJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7Ci0JCWxvdl9yZWFkX2FuZF9jbGVhcl9hc3luY19yYyhsbGktPmxsaV9jbG9iKTsKKwkJaWYgKGxsaS0+bGxpX2Nsb2IpCisJCQlsb3ZfcmVhZF9hbmRfY2xlYXJfYXN5bmNfcmMobGxpLT5sbGlfY2xvYik7CiAJCWxsaS0+bGxpX2FzeW5jX3JjID0gMDsKIAl9CiAKQEAgLTM3Niw1NSArMzcwLDM5IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGxsX2ludGVudF9maWxlX29wZW4oc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB2b2lkICpsbW0sCi0JCQkgICAgICAgaW50IGxtbXNpemUsIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdHApCitzdGF0aWMgaW50IGxsX2ludGVudF9maWxlX29wZW4oc3RydWN0IGRlbnRyeSAqZGUsIHZvaWQgKmxtbSwgaW50IGxtbXNpemUsCisJCQkgICAgICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0cCkKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZF9pbm9kZShkZW50cnkpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkX2lub2RlKGRlKTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfaTJzYmkoaW5vZGUpOwotCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7Ci0JY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7Ci0JY29uc3QgaW50IGxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBkZS0+ZF9wYXJlbnQ7CisJY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CiAJc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7Ci0Jc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXE7Ci0JX191MzIgb3BjID0gTFVTVFJFX09QQ19BTlk7Ci0JaW50IHJjOworCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxID0gTlVMTDsKKwlpbnQgbGVuID0gMCwgcmM7CiAKLQkvKiBVc3VhbGx5IHdlIGNvbWUgaGVyZSBvbmx5IGZvciBORlNELCBhbmQgd2Ugd2FudCBvcGVuIGxvY2suICovCi0JLyogV2UgY2FuIGFsc28gZ2V0IGhlcmUgaWYgdGhlcmUgd2FzIGNhY2hlZCBvcGVuIGhhbmRsZSBpbiByZXZhbGlkYXRlX2l0Ci0JICogYnV0IGl0IGRpc2FwcGVhcmVkIHdoaWxlIHdlIHdlcmUgZ2V0dGluZyBmcm9tIHRoZXJlIHRvIGxsX2ZpbGVfb3Blbi4KLQkgKiBCdXQgdGhpcyBtZWFucyB0aGlzIGZpbGUgd2FzIGNsb3NlZCBhbmQgaW1tZWRpYXRlbHkgb3BlbmVkIHdoaWNoCi0JICogbWFrZXMgYSBnb29kIGNhbmRpZGF0ZSBmb3IgdXNpbmcgT1BFTiBsb2NrCisJTEFTU0VSVChwYXJlbnQpOworCUxBU1NFUlQoaXRwLT5pdF9mbGFncyAmIE1EU19PUEVOX0JZX0ZJRCk7CisKKwkvKgorCSAqIGlmIHNlcnZlciBzdXBwb3J0cyBvcGVuLWJ5LWZpZCwgb3IgZmlsZSBuYW1lIGlzIGludmFsaWQsIGRvbid0IHBhY2sKKwkgKiBuYW1lIGluIG9wZW4gcmVxdWVzdAogCSAqLwotCS8qIElmIGxtbXNpemUgJiBsbW0gYXJlIG5vdCAwLCB3ZSBhcmUganVzdCBzZXR0aW5nIHN0cmlwZSBpbmZvCi0JICogcGFyYW1ldGVycy4gTm8gbmVlZCBmb3IgdGhlIG9wZW4gbG9jawotCSAqLwotCWlmICghbG1tICYmIGxtbXNpemUgPT0gMCkgewotCQlzdHJ1Y3QgbGxfZGVudHJ5X2RhdGEgKmxkZCA9IGxsX2QyZChkZW50cnkpOwotCQkvKgotCQkgKiBJZiB3ZSBjYW1lIHZpYSBsbF9pZ2V0X2Zvcl9uZnMsIHRoZW4gd2UgbmVlZCB0byByZXF1ZXN0Ci0JCSAqIHN0cnVjdCBsbF9kZW50cnlfZGF0YSAqbGRkID0gbGxfZDJkKGZpbGUtPmZfZGVudHJ5KTsKLQkJICoKLQkJICogTkI6IHdoZW4gbGRkIGlzIE5VTEwsIGl0IG11c3QgaGF2ZSBjb21lIHZpYSBub3JtYWwKLQkJICogbG9va3VwIHBhdGggb25seSwgc2luY2UgbGxfaWdldF9mb3JfbmZzIGFsd2F5cyBjYWxscwotCQkgKiBsbF9kX2luaXQoKS4KLQkJICovCi0JCWlmIChsZGQgJiYgbGRkLT5sbGRfbmZzX2RlbnRyeSkgewotCQkJbGRkLT5sbGRfbmZzX2RlbnRyeSA9IDA7Ci0JCQlpdHAtPml0X2ZsYWdzIHw9IE1EU19PUEVOX0xPQ0s7Ci0JCX0KLQkJaWYgKGl0cC0+aXRfZmxhZ3MgJiBGTU9ERV9XUklURSkKLQkJCW9wYyA9IExVU1RSRV9PUENfQ1JFQVRFOworCWlmICghKGV4cF9jb25uZWN0X2ZsYWdzKHNiaS0+bGxfbWRfZXhwKSAmIE9CRF9DT05ORUNUX09QRU5fQllfRklEKSAmJgorCSAgICBsdV9uYW1lX2lzX3ZhbGlkXzIoZGUtPmRfbmFtZS5uYW1lLCBkZS0+ZF9uYW1lLmxlbikpIHsKKwkJbmFtZSA9IGRlLT5kX25hbWUubmFtZTsKKwkJbGVuID0gZGUtPmRfbmFtZS5sZW47CiAJfQogCi0Jb3BfZGF0YSAgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgZF9pbm9kZShwYXJlbnQpLAotCQkJCSAgICAgIGlub2RlLCBuYW1lLCBsZW4sCi0JCQkJICAgICAgT19SRFdSLCBvcGMsIE5VTEwpOworCW9wX2RhdGEgID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGRfaW5vZGUocGFyZW50KSwgaW5vZGUsIG5hbWUsIGxlbiwKKwkJCQkgICAgICBPX1JEV1IsIExVU1RSRV9PUENfQU5ZLCBOVUxMKTsKIAlpZiAoSVNfRVJSKG9wX2RhdGEpKQogCQlyZXR1cm4gUFRSX0VSUihvcF9kYXRhKTsKKwlvcF9kYXRhLT5vcF9kYXRhID0gbG1tOworCW9wX2RhdGEtPm9wX2RhdGFfc2l6ZSA9IGxtbXNpemU7CiAKLQlpdHAtPml0X2ZsYWdzIHw9IE1EU19PUEVOX0JZX0ZJRDsKLQlyYyA9IG1kX2ludGVudF9sb2NrKHNiaS0+bGxfbWRfZXhwLCBvcF9kYXRhLCBsbW0sIGxtbXNpemUsIGl0cCwKLQkJCSAgICAwIC8qdW51c2VkICovLCAmcmVxLCBsbF9tZF9ibG9ja2luZ19hc3QsIDApOworCXJjID0gbWRfaW50ZW50X2xvY2soc2JpLT5sbF9tZF9leHAsIG9wX2RhdGEsIGl0cCwgJnJlcSwKKwkJCSAgICAmbGxfbWRfYmxvY2tpbmdfYXN0LCAwKTsKIAlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKIAlpZiAocmMgPT0gLUVTVEFMRSkgewogCQkvKiByZWFzb24gZm9yIGtlZXAgb3duIGV4aXQgcGF0aCAtIGRvbmB0IGZsb29kIGxvZwpAQCAtNDc5LDggKzQ1Nyw4IEBACiAJc3RydWN0IG1kdF9ib2R5ICpib2R5OwogCiAJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJml0LT5pdF9yZXF1ZXN0LT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKLQlvY2gtPm9jaF9maCA9IGJvZHktPmhhbmRsZTsKLQlvY2gtPm9jaF9maWQgPSBib2R5LT5maWQxOworCW9jaC0+b2NoX2ZoID0gYm9keS0+bWJvX2hhbmRsZTsKKwlvY2gtPm9jaF9maWQgPSBib2R5LT5tYm9fZmlkMTsKIAlvY2gtPm9jaF9sZWFzZV9oYW5kbGUuY29va2llID0gaXQtPml0X2xvY2tfaGFuZGxlOwogCW9jaC0+b2NoX21hZ2ljID0gT0JEX0NMSUVOVF9IQU5ETEVfTUFHSUM7CiAJb2NoLT5vY2hfZmxhZ3MgPSBpdC0+aXRfZmxhZ3M7CkBAIC01MDgsNyArNDg2LDcgQEAKIAogCQlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmaXQtPml0X3JlcXVlc3QtPnJxX3BpbGwsCiAJCQkJCSAgICAgICZSTUZfTURUX0JPRFkpOwotCQlsbF9pb2Vwb2NoX29wZW4obGxpLCBib2R5LT5pb2Vwb2NoKTsKKwkJbGxfaW9lcG9jaF9vcGVuKGxsaSwgYm9keS0+bWJvX2lvZXBvY2gpOwogCX0KIAogCUxVU1RSRV9GUFJJVkFURShmaWxlKSA9IGZkOwpAQCAtNTQzLDcgKzUyMSw3IEBACiAJc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICoqb2NoX3AgPSBOVUxMOwogCV9fdTY0ICpvY2hfdXNlY291bnQgPSBOVUxMOwogCXN0cnVjdCBsbF9maWxlX2RhdGEgKmZkOwotCWludCByYyA9IDAsIG9wZW5kaXJfc2V0ID0gMDsKKwlpbnQgcmMgPSAwOwogCiAJQ0RFQlVHKERfVkZTVFJBQ0UsICJWRlMgT3A6aW5vZGU9IkRGSUQiKCVwKSwgZmxhZ3MgJW9cbiIsCiAJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIGlub2RlLCBmaWxlLT5mX2ZsYWdzKTsKQEAgLTU1OCwxNiArNTM2LDggQEAKIAl9CiAKIAlmZC0+ZmRfZmlsZSA9IGZpbGU7Ci0JaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKLQkJc3Bpbl9sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQkJaWYgKCFsbGktPmxsaV9vcGVuZGlyX2tleSAmJiAhbGxpLT5sbGlfc2FpICYmCi0JCSAgICBsbGktPmxsaV9vcGVuZGlyX3BpZCA9PSAwKSB7Ci0JCQlsbGktPmxsaV9vcGVuZGlyX2tleSA9IGZkOwotCQkJbGxpLT5sbGlfb3BlbmRpcl9waWQgPSBjdXJyZW50X3BpZCgpOwotCQkJb3BlbmRpcl9zZXQgPSAxOwotCQl9Ci0JCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQl9CisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCWxsX2F1dGhvcml6ZV9zdGF0YWhlYWQoaW5vZGUsIGZkKTsKIAogCWlmIChpc19yb290X2lub2RlKGlub2RlKSkgewogCQlMVVNUUkVfRlBSSVZBVEUoZmlsZSkgPSBmZDsKQEAgLTYxNSw3ICs1ODUsNyBAQAogCX0gZWxzZSBpZiAoaXQtPml0X2ZsYWdzICYgRk1PREVfRVhFQykgewogCQlvY2hfcCA9ICZsbGktPmxsaV9tZHNfZXhlY19vY2g7CiAJCW9jaF91c2Vjb3VudCA9ICZsbGktPmxsaV9vcGVuX2ZkX2V4ZWNfY291bnQ7Ci0JIH0gZWxzZSB7CisJfSBlbHNlIHsKIAkJb2NoX3AgPSAmbGxpLT5sbGlfbWRzX3JlYWRfb2NoOwogCQlvY2hfdXNlY291bnQgPSAmbGxpLT5sbGlfb3Blbl9mZF9yZWFkX2NvdW50OwogCX0KQEAgLTY1Miw5ICs2MjIsMTkgQEAKIAkJCSAqIHJlc3VsdCBpbiBhIGRlYWRsb2NrCiAJCQkgKi8KIAkJCW11dGV4X3VubG9jaygmbGxpLT5sbGlfb2NoX211dGV4KTsKLQkJCWl0LT5pdF9jcmVhdGVfbW9kZSB8PSBNX0NIRUNLX1NUQUxFOworCQkJLyoKKwkJCSAqIE5vcm1hbGx5IGNhbGxlZCB1bmRlciB0d28gc2l0dWF0aW9uczoKKwkJCSAqIDEuIE5GUyBleHBvcnQuCisJCQkgKiAyLiByZXZhbGlkYXRlIHdpdGggSVRfT1BFTiAocmV2YWxpZGF0ZSBkb2Vzbid0CisJCQkgKiAgICBleGVjdXRlIHRoaXMgaW50ZW50IGFueSBtb3JlKS4KKwkJCSAqCisJCQkgKiBBbHdheXMgZmV0Y2ggTURTX09QRU5fTE9DSyBpZiB0aGlzIGlzIG5vdCBzZXRzdHJpcGUuCisJCQkgKgorCQkJICogQWx3YXlzIHNwZWNpZnkgTURTX09QRU5fQllfRklEIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudAorCQkJICogdG8gZ2V0IGZpbGUgd2l0aCBkaWZmZXJlbnQgZmlkLgorCQkJICovCisJCQlpdC0+aXRfZmxhZ3MgfD0gTURTX09QRU5fTE9DSyB8IE1EU19PUEVOX0JZX0ZJRDsKIAkJCXJjID0gbGxfaW50ZW50X2ZpbGVfb3BlbihmaWxlLT5mX3BhdGguZGVudHJ5LCBOVUxMLCAwLCBpdCk7Ci0JCQlpdC0+aXRfY3JlYXRlX21vZGUgJj0gfk1fQ0hFQ0tfU1RBTEU7CiAJCQlpZiAocmMpCiAJCQkJZ290byBvdXRfb3BlbmVycjsKIApAQCAtNzE2LDkgKzY5NiwxMCBAQAogCQltdXRleF91bmxvY2soJmxsaS0+bGxpX29jaF9tdXRleCk7CiAKIG91dF9vcGVuZXJyOgotCQlpZiAob3BlbmRpcl9zZXQgIT0gMCkKLQkJCWxsX3N0b3Bfc3RhdGFoZWFkKGlub2RlLCBsbGktPmxsaV9vcGVuZGlyX2tleSk7Ci0JCWxsX2ZpbGVfZGF0YV9wdXQoZmQpOworCQlpZiAobGxpLT5sbGlfb3BlbmRpcl9rZXkgPT0gZmQpCisJCQlsbF9kZWF1dGhvcml6ZV9zdGF0YWhlYWQoaW5vZGUsIGZkKTsKKwkJaWYgKGZkKQorCQkJbGxfZmlsZV9kYXRhX3B1dChmZCk7CiAJfSBlbHNlIHsKIAkJbGxfc3RhdHNfb3BzX3RhbGx5KGxsX2kyc2JpKGlub2RlKSwgTFBST0NfTExfT1BFTiwgMSk7CiAJfQpAQCAtNzY0LDcgKzc0NSw3IEBACiAJc3RydWN0IGxvb2t1cF9pbnRlbnQgaXQgPSB7IC5pdF9vcCA9IElUX09QRU4gfTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfaTJzYmkoaW5vZGUpOwogCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhOwotCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxOworCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxID0gTlVMTDsKIAlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSBvbGRfaGFuZGxlID0geyAwIH07CiAJc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICpvY2ggPSBOVUxMOwogCWludCByYzsKQEAgLTgzMSw4ICs4MTIsOCBAQAogCiAJaXQuaXRfZmxhZ3MgPSBmbW9kZSB8IG9wZW5fZmxhZ3M7CiAJaXQuaXRfZmxhZ3MgfD0gTURTX09QRU5fTE9DSyB8IE1EU19PUEVOX0JZX0ZJRCB8IE1EU19PUEVOX0xFQVNFOwotCXJjID0gbWRfaW50ZW50X2xvY2soc2JpLT5sbF9tZF9leHAsIG9wX2RhdGEsIE5VTEwsIDAsICZpdCwgMCwgJnJlcSwKLQkJCSAgICBsbF9tZF9ibG9ja2luZ19sZWFzZV9hc3QsCisJcmMgPSBtZF9pbnRlbnRfbG9jayhzYmktPmxsX21kX2V4cCwgb3BfZGF0YSwgJml0LCAmcmVxLAorCQkJICAgICZsbF9tZF9ibG9ja2luZ19sZWFzZV9hc3QsCiAJLyogTERMTV9GTF9OT19MUlU6IFRvIG5vdCBwdXQgdGhlIGxlYXNlIGxvY2sgaW50byBMUlUgbGlzdCwgb3RoZXJ3aXNlCiAJICogaXQgY2FuIGJlIGNhbmNlbGxlZCB3aGljaCBtYXkgbWlzbGVhZCBhcHBsaWNhdGlvbnMgdGhhdCB0aGUgbGVhc2UgaXMKIAkgKiBicm9rZW47CkBAIC04NDAsNyArODIxLDcgQEAKIAkgKiBvcGVuIGluIGxsX21kX2Jsb2NraW5nX2FzdCgpLiBPdGhlcndpc2UgYXMgbGxfbWRfYmxvY2tpbmdfbGVhc2VfYXN0CiAJICogZG9lc24ndCBkZWFsIHdpdGggb3BlbmhhbmRsZSwgc28gbm9ybWFsIG9wZW5oYW5kbGUgd2lsbCBiZSBsZWFrZWQuCiAJICovCi0JCQkJTERMTV9GTF9OT19MUlUgfCBMRExNX0ZMX0VYQ0wpOworCQkJICAgIExETE1fRkxfTk9fTFJVIHwgTERMTV9GTF9FWENMKTsKIAlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKIAlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CiAJaWYgKHJjIDwgMCkKQEAgLTkwOCw3ICs4ODksNiBAQAogewogCXN0cnVjdCBsZGxtX2xvY2sgKmxvY2s7CiAJYm9vbCBjYW5jZWxsZWQgPSB0cnVlOwotCWludCByYzsKIAogCWxvY2sgPSBsZGxtX2hhbmRsZTJsb2NrKCZvY2gtPm9jaF9sZWFzZV9oYW5kbGUpOwogCWlmIChsb2NrKSB7CkBAIC05MjYsOSArOTA2LDggQEAKIAlpZiAobGVhc2VfYnJva2VuKQogCQkqbGVhc2VfYnJva2VuID0gY2FuY2VsbGVkOwogCi0JcmMgPSBsbF9jbG9zZV9pbm9kZV9vcGVuaGFuZGxlKGxsX2kyc2JpKGlub2RlKS0+bGxfbWRfZXhwLCBpbm9kZSwgb2NoLAotCQkJCSAgICAgICBOVUxMKTsKLQlyZXR1cm4gcmM7CisJcmV0dXJuIGxsX2Nsb3NlX2lub2RlX29wZW5oYW5kbGUobGxfaTJzYmkoaW5vZGUpLT5sbF9tZF9leHAsCisJCQkJCSBpbm9kZSwgb2NoLCBOVUxMKTsKIH0KIAogLyogRmlsbHMgdGhlIG9iZG8gd2l0aCB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIGxzbSAqLwpAQCAtMTEzOCwxMCArMTExNywxMSBAQAogewogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oZmlsZV9pbm9kZShmaWxlKSk7CiAJc3RydWN0IGxsX2ZpbGVfZGF0YSAgKmZkICA9IExVU1RSRV9GUFJJVkFURShmaWxlKTsKKwlzdHJ1Y3QgcmFuZ2VfbG9jayByYW5nZTsKIAlzdHJ1Y3QgY2xfaW8JICppbzsKIAlzc2l6ZV90CSAgICAgICByZXN1bHQ7CiAKLQlDREVCVUcoRF9WRlNUUkFDRSwgImZpbGU6ICVzLCB0eXBlOiAlZCBwcG9zOiAlbGx1LCBjb3VudDogJXpkXG4iLAorCUNERUJVRyhEX1ZGU1RSQUNFLCAiZmlsZTogJXMsIHR5cGU6ICVkIHBwb3M6ICVsbHUsIGNvdW50OiAlenVcbiIsCiAJICAgICAgIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLCBpb3QsICpwcG9zLCBjb3VudCk7CiAKIHJlc3RhcnQ6CkBAIC0xMTUwLDcgKzExMzAsMTIgQEAKIAogCWlmIChjbF9pb19yd19pbml0KGVudiwgaW8sIGlvdCwgKnBwb3MsIGNvdW50KSA9PSAwKSB7CiAJCXN0cnVjdCB2dnBfaW8gKnZpbyA9IHZ2cF9lbnZfaW8oZW52KTsKLQkJaW50IHdyaXRlX211dGV4X2xvY2tlZCA9IDA7CisJCWJvb2wgcmFuZ2VfbG9ja2VkID0gZmFsc2U7CisKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0FQUEVORCkKKwkJCXJhbmdlX2xvY2tfaW5pdCgmcmFuZ2UsIDAsIExVU1RSRV9FT0YpOworCQllbHNlCisJCQlyYW5nZV9sb2NrX2luaXQoJnJhbmdlLCAqcHBvcywgKnBwb3MgKyBjb3VudCAtIDEpOwogCiAJCXZpby0+dnVpX2ZkICA9IExVU1RSRV9GUFJJVkFURShmaWxlKTsKIAkJdmlvLT52dWlfaW9fc3VidHlwZSA9IGFyZ3MtPnZpYV9pb19zdWJ0eXBlOwpAQCAtMTE1OSwxNCArMTE0NCwyMyBAQAogCQljYXNlIElPX05PUk1BTDoKIAkJCXZpby0+dnVpX2l0ZXIgPSBhcmdzLT51Lm5vcm1hbC52aWFfaXRlcjsKIAkJCXZpby0+dnVpX2lvY2IgPSBhcmdzLT51Lm5vcm1hbC52aWFfaW9jYjsKLQkJCWlmICgoaW90ID09IENJVF9XUklURSkgJiYKKwkJCS8qCisJCQkgKiBEaXJlY3QgSU8gcmVhZHMgbXVzdCBhbHNvIHRha2UgcmFuZ2UgbG9jaywKKwkJCSAqIG9yIG11bHRpcGxlIHJlYWRzIHdpbGwgdHJ5IHRvIHdvcmsgb24gdGhlIHNhbWUgcGFnZXMKKwkJCSAqIFNlZSBMVS02MjI3IGZvciBkZXRhaWxzLgorCQkJICovCisJCQlpZiAoKChpb3QgPT0gQ0lUX1dSSVRFKSB8fAorCQkJICAgICAoaW90ID09IENJVF9SRUFEICYmIChmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpKSkgJiYKIAkJCSAgICAhKHZpby0+dnVpX2ZkLT5mZF9mbGFncyAmIExMX0ZJTEVfR1JPVVBfTE9DS0VEKSkgewotCQkJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmxsaS0+Ci0JCQkJCQkJICAgICAgIGxsaV93cml0ZV9tdXRleCkpIHsKLQkJCQkJcmVzdWx0ID0gLUVSRVNUQVJUU1lTOworCQkJCUNERUJVRyhEX1ZGU1RSQUNFLCAiUmFuZ2UgbG9jayBbJWxsdSwgJWxsdV1cbiIsCisJCQkJICAgICAgIHJhbmdlLnJsX25vZGUuaW5fZXh0ZW50LnN0YXJ0LAorCQkJCSAgICAgICByYW5nZS5ybF9ub2RlLmluX2V4dGVudC5lbmQpOworCQkJCXJlc3VsdCA9IHJhbmdlX2xvY2soJmxsaS0+bGxpX3dyaXRlX3RyZWUsCisJCQkJCQkgICAgJnJhbmdlKTsKKwkJCQlpZiAocmVzdWx0IDwgMCkKIAkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCQkJCXdyaXRlX211dGV4X2xvY2tlZCA9IDE7CisKKwkJCQlyYW5nZV9sb2NrZWQgPSB0cnVlOwogCQkJfQogCQkJZG93bl9yZWFkKCZsbGktPmxsaV90cnVuY19zZW0pOwogCQkJYnJlYWs7CkBAIC0xMTgzLDggKzExNzcsMTIgQEAKIAkJbGxfY2xfcmVtb3ZlKGZpbGUsIGVudik7CiAJCWlmIChhcmdzLT52aWFfaW9fc3VidHlwZSA9PSBJT19OT1JNQUwpCiAJCQl1cF9yZWFkKCZsbGktPmxsaV90cnVuY19zZW0pOwotCQlpZiAod3JpdGVfbXV0ZXhfbG9ja2VkKQotCQkJbXV0ZXhfdW5sb2NrKCZsbGktPmxsaV93cml0ZV9tdXRleCk7CisJCWlmIChyYW5nZV9sb2NrZWQpIHsKKwkJCUNERUJVRyhEX1ZGU1RSQUNFLCAiUmFuZ2UgdW5sb2NrIFslbGx1LCAlbGx1XVxuIiwKKwkJCSAgICAgICByYW5nZS5ybF9ub2RlLmluX2V4dGVudC5zdGFydCwKKwkJCSAgICAgICByYW5nZS5ybF9ub2RlLmluX2V4dGVudC5lbmQpOworCQkJcmFuZ2VfdW5sb2NrKCZsbGktPmxsaV93cml0ZV90cmVlLCAmcmFuZ2UpOworCQl9CiAJfSBlbHNlIHsKIAkJLyogY2xfaW9fcndfaW5pdCgpIGhhbmRsZWQgSU8gKi8KIAkJcmVzdWx0ID0gaW8tPmNpX3Jlc3VsdDsKQEAgLTEyMDEsNyArMTE5OSw3IEBACiAJICogc2hvcnQgcmVhZC93cml0ZSBpbnN0ZWFkIG9mIHJlc3RhcnQgaW8uCiAJICovCiAJaWYgKChyZXN1bHQgPT0gMCB8fCByZXN1bHQgPT0gLUVOT0RBVEEpICYmIGlvLT5jaV9uZWVkX3Jlc3RhcnQpIHsKLQkJQ0RFQlVHKERfVkZTVFJBQ0UsICJSZXN0YXJ0ICVzIG9uICVwRCBmcm9tICVsbGQsIGNvdW50OiV6ZFxuIiwKKwkJQ0RFQlVHKERfVkZTVFJBQ0UsICJSZXN0YXJ0ICVzIG9uICVwRCBmcm9tICVsbGQsIGNvdW50OiV6dVxuIiwKIAkJICAgICAgIGlvdCA9PSBDSVRfUkVBRCA/ICJyZWFkIiA6ICJ3cml0ZSIsCiAJCSAgICAgICBmaWxlLCAqcHBvcywgY291bnQpOwogCQlMQVNTRVJURihpby0+Y2lfbm9iID09IDAsICIlemRcbiIsIGlvLT5jaV9ub2IpOwpAQCAtMTI5Niw5NCArMTI5NCwxNSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgbGxfbG92X3JlY3JlYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvc3RfaWQgKm9pLCB1MzIgb3N0X2lkeCkKLXsKLQlzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwID0gbGxfaTJkdGV4cChpbm9kZSk7Ci0Jc3RydWN0IG9iZF90cmFuc19pbmZvIG90aSA9IHsgMCB9OwotCXN0cnVjdCBvYmRvICpvYSA9IE5VTEw7Ci0JaW50IGxzbV9zaXplOwotCWludCByYyA9IDA7Ci0Jc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSA9IE5VTEwsICpsc20yOwotCi0Jb2EgPSBrbWVtX2NhY2hlX3phbGxvYyhvYmRvX2NhY2hlcCwgR0ZQX05PRlMpOwotCWlmICghb2EpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbHNtID0gY2NjX2lub2RlX2xzbV9nZXQoaW5vZGUpOwotCWlmICghbHNtX2hhc19vYmplY3RzKGxzbSkpIHsKLQkJcmMgPSAtRU5PRU5UOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlsc21fc2l6ZSA9IHNpemVvZigqbHNtKSArIChzaXplb2Yoc3RydWN0IGxvdl9vaW5mbykgKgotCQkgICAobHNtLT5sc21fc3RyaXBlX2NvdW50KSk7Ci0KLQlsc20yID0gbGliY2ZzX2t2emFsbG9jKGxzbV9zaXplLCBHRlBfTk9GUyk7Ci0JaWYgKCFsc20yKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jb2EtPm9fb2kgPSAqb2k7Ci0Jb2EtPm9fbmxpbmsgPSBvc3RfaWR4OwotCW9hLT5vX2ZsYWdzIHw9IE9CRF9GTF9SRUNSRUFURV9PQkpTOwotCW9hLT5vX3ZhbGlkID0gT0JEX01EX0ZMSUQgfCBPQkRfTURfRkxGTEFHUyB8IE9CRF9NRF9GTEdST1VQOwotCW9iZG9fZnJvbV9pbm9kZShvYSwgaW5vZGUsIE9CRF9NRF9GTFRZUEUgfCBPQkRfTURfRkxBVElNRSB8Ci0JCQkJICAgT0JEX01EX0ZMTVRJTUUgfCBPQkRfTURfRkxDVElNRSk7Ci0Jb2Jkb19zZXRfcGFyZW50X2ZpZChvYSwgJmxsX2kyaW5mbyhpbm9kZSktPmxsaV9maWQpOwotCW1lbWNweShsc20yLCBsc20sIGxzbV9zaXplKTsKLQlsbF9pbm9kZV9zaXplX2xvY2soaW5vZGUpOwotCXJjID0gb2JkX2NyZWF0ZShOVUxMLCBleHAsIG9hLCAmbHNtMiwgJm90aSk7Ci0JbGxfaW5vZGVfc2l6ZV91bmxvY2soaW5vZGUpOwotCi0Ja3ZmcmVlKGxzbTIpOwotCWdvdG8gb3V0Owotb3V0OgotCWNjY19pbm9kZV9sc21fcHV0KGlub2RlLCBsc20pOwotCWttZW1fY2FjaGVfZnJlZShvYmRvX2NhY2hlcCwgb2EpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBsbF9sb3ZfcmVjcmVhdGVfb2JqKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBsbF9yZWNyZWF0ZV9vYmogdWNyZWF0OwotCXN0cnVjdCBvc3RfaWQJCW9pOwotCi0JaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmdWNyZWF0LCAoc3RydWN0IGxsX3JlY3JlYXRlX29iaiBfX3VzZXIgKilhcmcsCi0JCQkgICBzaXplb2YodWNyZWF0KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0Jb3N0aWRfc2V0X3NlcV9tZHQwKCZvaSk7Ci0Jb3N0aWRfc2V0X2lkKCZvaSwgdWNyZWF0LmxyY19pZCk7Ci0JcmV0dXJuIGxsX2xvdl9yZWNyZWF0ZShpbm9kZSwgJm9pLCB1Y3JlYXQubHJjX29zdF9pZHgpOwotfQotCi1zdGF0aWMgaW50IGxsX2xvdl9yZWNyZWF0ZV9maWQoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGx1X2ZpZAlmaWQ7Ci0Jc3RydWN0IG9zdF9pZAlvaTsKLQl1MzIJCW9zdF9pZHg7Ci0KLQlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZmaWQsIChzdHJ1Y3QgbHVfZmlkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGZpZCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWZpZF90b19vc3RpZCgmZmlkLCAmb2kpOwotCW9zdF9pZHggPSAoZmlkX3NlcSgmZmlkKSA+PiAxNikgJiAweGZmZmY7Ci0JcmV0dXJuIGxsX2xvdl9yZWNyZWF0ZShpbm9kZSwgJm9pLCBvc3RfaWR4KTsKLX0KLQogaW50IGxsX2xvdl9zZXRzdHJpcGVfZWFfaW5mbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkgICAgIF9fdTY0IGZsYWdzLCBzdHJ1Y3QgbG92X3VzZXJfbWQgKmx1bSwKIAkJCSAgICAgaW50IGx1bV9zaXplKQogewogCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20gPSBOVUxMOwotCXN0cnVjdCBsb29rdXBfaW50ZW50IG9pdCA9IHsuaXRfb3AgPSBJVF9PUEVOLCAuaXRfZmxhZ3MgPSBmbGFnc307CisJc3RydWN0IGxvb2t1cF9pbnRlbnQgb2l0ID0geworCQkuaXRfb3AgPSBJVF9PUEVOLAorCQkuaXRfZmxhZ3MgPSBmbGFncyB8IE1EU19PUEVOX0JZX0ZJRCwKKwl9OwogCWludCByYyA9IDA7CiAKIAlsc20gPSBjY2NfaW5vZGVfbHNtX2dldChpbm9kZSk7CkBAIC0xMzk3LDExICsxMzE2LDExIEBACiAKIAlsbF9pbm9kZV9zaXplX2xvY2soaW5vZGUpOwogCXJjID0gbGxfaW50ZW50X2ZpbGVfb3BlbihkZW50cnksIGx1bSwgbHVtX3NpemUsICZvaXQpOwotCWlmIChyYykKKwlpZiAocmMgPCAwKQogCQlnb3RvIG91dF91bmxvY2s7CiAJcmMgPSBvaXQuaXRfc3RhdHVzOwogCWlmIChyYyA8IDApCi0JCWdvdG8gb3V0X3JlcV9mcmVlOworCQlnb3RvIG91dF91bmxvY2s7CiAKIAlsbF9yZWxlYXNlX29wZW5oYW5kbGUoaW5vZGUsICZvaXQpOwogCkBAIC0xNDExLDkgKzEzMzAsNiBAQAogCWNjY19pbm9kZV9sc21fcHV0KGlub2RlLCBsc20pOwogb3V0OgogCXJldHVybiByYzsKLW91dF9yZXFfZnJlZToKLQlwdGxycGNfcmVxX2ZpbmlzaGVkKChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKilvaXQuaXRfcmVxdWVzdCk7Ci0JZ290byBvdXQ7CiB9CiAKIGludCBsbF9sb3ZfZ2V0c3RyaXBlX2VhX2luZm8oc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsCkBAIC0xNDQ4LDkgKzEzNjQsOSBAQAogCiAJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CiAKLQlsbW1zaXplID0gYm9keS0+ZWFkYXRhc2l6ZTsKKwlsbW1zaXplID0gYm9keS0+bWJvX2VhZGF0YXNpemU7CiAKLQlpZiAoIShib2R5LT52YWxpZCAmIChPQkRfTURfRkxFQVNJWkUgfCBPQkRfTURfRkxESVJFQSkpIHx8CisJaWYgKCEoYm9keS0+bWJvX3ZhbGlkICYgKE9CRF9NRF9GTEVBU0laRSB8IE9CRF9NRF9GTERJUkVBKSkgfHwKIAkgICAgbG1tc2l6ZSA9PSAwKSB7CiAJCXJjID0gLUVOT0RBVEE7CiAJCWdvdG8gb3V0OwpAQCAtMTQ4MSwxMyArMTM5NywxMyBAQAogCQkgKi8KIAkJaWYgKGxtbS0+bG1tX21hZ2ljID09IGNwdV90b19sZTMyKExPVl9NQUdJQ19WMSkpIHsKIAkJCWx1c3RyZV9zd2FiX2xvdl91c2VyX21kX3YxKChzdHJ1Y3QgbG92X3VzZXJfbWRfdjEgKilsbW0pOwotCQkJaWYgKFNfSVNSRUcoYm9keS0+bW9kZSkpCisJCQlpZiAoU19JU1JFRyhib2R5LT5tYm9fbW9kZSkpCiAJCQkJbHVzdHJlX3N3YWJfbG92X3VzZXJfbWRfb2JqZWN0cygKIAkJCQkgKChzdHJ1Y3QgbG92X3VzZXJfbWRfdjEgKilsbW0pLT5sbW1fb2JqZWN0cywKIAkJCQkgc3RyaXBlX2NvdW50KTsKIAkJfSBlbHNlIGlmIChsbW0tPmxtbV9tYWdpYyA9PSBjcHVfdG9fbGUzMihMT1ZfTUFHSUNfVjMpKSB7CiAJCQlsdXN0cmVfc3dhYl9sb3ZfdXNlcl9tZF92Mygoc3RydWN0IGxvdl91c2VyX21kX3YzICopbG1tKTsKLQkJCWlmIChTX0lTUkVHKGJvZHktPm1vZGUpKQorCQkJaWYgKFNfSVNSRUcoYm9keS0+bWJvX21vZGUpKQogCQkJCWx1c3RyZV9zd2FiX2xvdl91c2VyX21kX29iamVjdHMoCiAJCQkJICgoc3RydWN0IGxvdl91c2VyX21kX3YzICopbG1tKS0+bG1tX29iamVjdHMsCiAJCQkJIHN0cmlwZV9jb3VudCk7CkBAIC0xNTMwLDU1ICsxNDQ2LDQ4IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGxsX2xvdl9zZXRzdHJpcGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IGxsX2ZpbGVfZ2V0c3RyaXBlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgIHN0cnVjdCBsb3ZfdXNlcl9tZCBfX3VzZXIgKmx1bSkKIHsKLQlzdHJ1Y3QgbG92X3VzZXJfbWRfdjMgbHVtdjM7Ci0Jc3RydWN0IGxvdl91c2VyX21kX3YxICpsdW12MSA9IChzdHJ1Y3QgbG92X3VzZXJfbWRfdjEgKikmbHVtdjM7Ci0Jc3RydWN0IGxvdl91c2VyX21kX3YxIF9fdXNlciAqbHVtdjFwID0gKHZvaWQgX191c2VyICopYXJnOwotCXN0cnVjdCBsb3ZfdXNlcl9tZF92MyBfX3VzZXIgKmx1bXYzcCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlpbnQgbHVtX3NpemUsIHJjOwotCV9fdTY0IGZsYWdzID0gRk1PREVfV1JJVEU7CisJc3RydWN0IGx1X2VudiAqZW52OworCWludCByZWZjaGVjazsKKwlpbnQgcmM7CiAKLQkvKiBmaXJzdCB0cnkgd2l0aCB2MSB3aGljaCBpcyBzbWFsbGVyIHRoYW4gdjMgKi8KLQlsdW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbG92X3VzZXJfbWRfdjEpOwotCWlmIChjb3B5X2Zyb21fdXNlcihsdW12MSwgbHVtdjFwLCBsdW1fc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOworCWVudiA9IGNsX2Vudl9nZXQoJnJlZmNoZWNrKTsKKwlpZiAoSVNfRVJSKGVudikpCisJCXJldHVybiBQVFJfRVJSKGVudik7CiAKLQlpZiAobHVtdjEtPmxtbV9tYWdpYyA9PSBMT1ZfVVNFUl9NQUdJQ19WMykgewotCQlsdW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbG92X3VzZXJfbWRfdjMpOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmx1bXYzLCBsdW12M3AsIGx1bV9zaXplKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJjID0gbGxfbG92X3NldHN0cmlwZV9lYV9pbmZvKGlub2RlLCBmaWxlLT5mX3BhdGguZGVudHJ5LCBmbGFncywgbHVtdjEsCi0JCQkJICAgICAgbHVtX3NpemUpOwotCWNsX2xvdl9kZWxheV9jcmVhdGVfY2xlYXIoJmZpbGUtPmZfZmxhZ3MpOwotCWlmIChyYyA9PSAwKSB7Ci0JCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc207Ci0JCV9fdTMyIGdlbjsKLQotCQlwdXRfdXNlcigwLCAmbHVtdjFwLT5sbW1fc3RyaXBlX2NvdW50KTsKLQotCQlsbF9sYXlvdXRfcmVmcmVzaChpbm9kZSwgJmdlbik7Ci0JCWxzbSA9IGNjY19pbm9kZV9sc21fZ2V0KGlub2RlKTsKLQkJcmMgPSBvYmRfaW9jb250cm9sKExMX0lPQ19MT1ZfR0VUU1RSSVBFLCBsbF9pMmR0ZXhwKGlub2RlKSwKLQkJCQkgICAwLCBsc20sICh2b2lkIF9fdXNlciAqKWFyZyk7Ci0JCWNjY19pbm9kZV9sc21fcHV0KGlub2RlLCBsc20pOwotCX0KKwlyYyA9IGNsX29iamVjdF9nZXRzdHJpcGUoZW52LCBsbF9pMmluZm8oaW5vZGUpLT5sbGlfY2xvYiwgbHVtKTsKKwljbF9lbnZfcHV0KGVudiwgJnJlZmNoZWNrKTsKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgbGxfbG92X2dldHN0cmlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgbGxfbG92X3NldHN0cmlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtOwotCWludCByYyA9IC1FTk9EQVRBOworCXN0cnVjdCBsb3ZfdXNlcl9tZCBfX3VzZXIgKmx1bSA9IChzdHJ1Y3QgbG92X3VzZXJfbWQgX191c2VyICopYXJnOworCXN0cnVjdCBsb3ZfdXNlcl9tZCAqa2x1bTsKKwlpbnQgbHVtX3NpemUsIHJjOworCV9fdTY0IGZsYWdzID0gRk1PREVfV1JJVEU7CiAKLQlsc20gPSBjY2NfaW5vZGVfbHNtX2dldChpbm9kZSk7Ci0JaWYgKGxzbSkKLQkJcmMgPSBvYmRfaW9jb250cm9sKExMX0lPQ19MT1ZfR0VUU1RSSVBFLCBsbF9pMmR0ZXhwKGlub2RlKSwgMCwKLQkJCQkgICBsc20sICh2b2lkIF9fdXNlciAqKWFyZyk7Ci0JY2NjX2lub2RlX2xzbV9wdXQoaW5vZGUsIGxzbSk7CisJcmMgPSBsbF9jb3B5X3VzZXJfbWQobHVtLCAma2x1bSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJbHVtX3NpemUgPSByYzsKKwlyYyA9IGxsX2xvdl9zZXRzdHJpcGVfZWFfaW5mbyhpbm9kZSwgZmlsZS0+Zl9wYXRoLmRlbnRyeSwgZmxhZ3MsIGtsdW0sCisJCQkJICAgICAgbHVtX3NpemUpOworCWNsX2xvdl9kZWxheV9jcmVhdGVfY2xlYXIoJmZpbGUtPmZfZmxhZ3MpOworCWlmIChyYyA9PSAwKSB7CisJCV9fdTMyIGdlbjsKKworCQlwdXRfdXNlcigwLCAmbHVtLT5sbW1fc3RyaXBlX2NvdW50KTsKKworCQlsbF9sYXlvdXRfcmVmcmVzaChpbm9kZSwgJmdlbik7CisJCXJjID0gbGxfZmlsZV9nZXRzdHJpcGUoaW5vZGUsIChzdHJ1Y3QgbG92X3VzZXJfbWQgX191c2VyICopYXJnKTsKKwl9CisKKwlrZnJlZShrbHVtKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTIyNDcsNiArMjE1NiwxMiBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGlubGluZSBsb25nIGxsX2xlYXNlX3R5cGVfZnJvbV9mbW9kZShmbW9kZV90IGZtb2RlKQoreworCXJldHVybiAoKGZtb2RlICYgRk1PREVfUkVBRCkgPyBMTF9MRUFTRV9SRExDSyA6IDApIHwKKwkgICAgICAgKChmbW9kZSAmIEZNT0RFX1dSSVRFKSA/IExMX0xFQVNFX1dSTENLIDogMCk7Cit9CisKIHN0YXRpYyBsb25nCiBsbF9maWxlX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKQEAgLTIzMTQsMTEgKzIyMjksOCBAQAogCQlyZXR1cm4gcmM7CiAJfQogCWNhc2UgTExfSU9DX0xPVl9HRVRTVFJJUEU6Ci0JCXJldHVybiBsbF9sb3ZfZ2V0c3RyaXBlKGlub2RlLCBhcmcpOwotCWNhc2UgTExfSU9DX1JFQ1JFQVRFX09CSjoKLQkJcmV0dXJuIGxsX2xvdl9yZWNyZWF0ZV9vYmooaW5vZGUsIGFyZyk7Ci0JY2FzZSBMTF9JT0NfUkVDUkVBVEVfRklEOgotCQlyZXR1cm4gbGxfbG92X3JlY3JlYXRlX2ZpZChpbm9kZSwgYXJnKTsKKwkJcmV0dXJuIGxsX2ZpbGVfZ2V0c3RyaXBlKGlub2RlLAorCQkJCQkgKHN0cnVjdCBsb3ZfdXNlcl9tZCBfX3VzZXIgKilhcmcpOwogCWNhc2UgRlNGSUxUX0lPQ19GSUVNQVA6CiAJCXJldHVybiBsbF9pb2N0bF9maWVtYXAoaW5vZGUsIGFyZyk7CiAJY2FzZSBGU0ZJTFRfSU9DX0dFVEZMQUdTOgpAQCAtMjM0OSw2ICsyMjYxLDggQEAKIAogCQlyZXR1cm4gMDsKIAl9CisJY2FzZSBMTF9JT0NfR0VUUEFSRU5UOgorCQlyZXR1cm4gbGxfZ2V0cGFyZW50KGZpbGUsIChzdHJ1Y3QgZ2V0cGFyZW50IF9fdXNlciAqKWFyZyk7CiAJY2FzZSBPQkRfSU9DX0ZJRDJQQVRIOgogCQlyZXR1cm4gbGxfZmlkMnBhdGgoaW5vZGUsICh2b2lkIF9fdXNlciAqKWFyZyk7CiAJY2FzZSBMTF9JT0NfREFUQV9WRVJTSU9OOiB7CkBAIC0yNDUxLDIwICsyMzY1LDIwIEBACiAJCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOwogCQlzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUgKm9jaCA9IE5VTEw7CiAJCWJvb2wgbGVhc2VfYnJva2VuOwotCQlmbW9kZV90IG1vZGUgPSAwOworCQlmbW9kZV90IGZtb2RlOwogCiAJCXN3aXRjaCAoYXJnKSB7Ci0JCWNhc2UgRl9XUkxDSzoKKwkJY2FzZSBMTF9MRUFTRV9XUkxDSzoKIAkJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKIAkJCQlyZXR1cm4gLUVQRVJNOwotCQkJbW9kZSA9IEZNT0RFX1dSSVRFOworCQkJZm1vZGUgPSBGTU9ERV9XUklURTsKIAkJCWJyZWFrOwotCQljYXNlIEZfUkRMQ0s6CisJCWNhc2UgTExfTEVBU0VfUkRMQ0s6CiAJCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKIAkJCQlyZXR1cm4gLUVQRVJNOwotCQkJbW9kZSA9IEZNT0RFX1JFQUQ7CisJCQlmbW9kZSA9IEZNT0RFX1JFQUQ7CiAJCQlicmVhazsKLQkJY2FzZSBGX1VOTENLOgorCQljYXNlIExMX0xFQVNFX1VOTENLOgogCQkJbXV0ZXhfbG9jaygmbGxpLT5sbGlfb2NoX211dGV4KTsKIAkJCWlmIChmZC0+ZmRfbGVhc2Vfb2NoKSB7CiAJCQkJb2NoID0gZmQtPmZkX2xlYXNlX29jaDsKQEAgLTI0NzIsMjYgKzIzODYsMjYgQEAKIAkJCX0KIAkJCW11dGV4X3VubG9jaygmbGxpLT5sbGlfb2NoX211dGV4KTsKIAotCQkJaWYgKG9jaCkgewotCQkJCW1vZGUgPSBvY2gtPm9jaF9mbGFncyAmCi0JCQkJICAgICAgIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKLQkJCQlyYyA9IGxsX2xlYXNlX2Nsb3NlKG9jaCwgaW5vZGUsICZsZWFzZV9icm9rZW4pOwotCQkJCWlmIChyYyA9PSAwICYmIGxlYXNlX2Jyb2tlbikKLQkJCQkJbW9kZSA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXJjID0gLUVOT0xDSzsKLQkJCX0KKwkJCWlmICghb2NoKQorCQkJCXJldHVybiAtRU5PTENLOwogCi0JCQkvKiByZXR1cm4gdGhlIHR5cGUgb2YgbGVhc2Ugb3IgZXJyb3IgKi8KLQkJCXJldHVybiByYyA8IDAgPyByYyA6IChpbnQpbW9kZTsKKwkJCWZtb2RlID0gb2NoLT5vY2hfZmxhZ3M7CisJCQlyYyA9IGxsX2xlYXNlX2Nsb3NlKG9jaCwgaW5vZGUsICZsZWFzZV9icm9rZW4pOworCQkJaWYgKHJjIDwgMCkKKwkJCQlyZXR1cm4gcmM7CisKKwkJCWlmIChsZWFzZV9icm9rZW4pCisJCQkJZm1vZGUgPSAwOworCisJCQlyZXR1cm4gbGxfbGVhc2VfdHlwZV9mcm9tX2Ztb2RlKGZtb2RlKTsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJQ0RFQlVHKERfSU5PREUsICJTZXQgbGVhc2Ugd2l0aCBtb2RlICVkXG4iLCBtb2RlKTsKKwkJQ0RFQlVHKERfSU5PREUsICJTZXQgbGVhc2Ugd2l0aCBtb2RlICV1XG4iLCBmbW9kZSk7CiAKIAkJLyogYXBwbHkgZm9yIGxlYXNlICovCi0JCW9jaCA9IGxsX2xlYXNlX29wZW4oaW5vZGUsIGZpbGUsIG1vZGUsIDApOworCQlvY2ggPSBsbF9sZWFzZV9vcGVuKGlub2RlLCBmaWxlLCBmbW9kZSwgMCk7CiAJCWlmIChJU19FUlIob2NoKSkKIAkJCXJldHVybiBQVFJfRVJSKG9jaCk7CiAKQEAgLTI1MTIsOCArMjQyNiw4IEBACiAJY2FzZSBMTF9JT0NfR0VUX0xFQVNFOiB7CiAJCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOwogCQlzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrID0gTlVMTDsKKwkJZm1vZGVfdCBmbW9kZSA9IDA7CiAKLQkJcmMgPSAwOwogCQltdXRleF9sb2NrKCZsbGktPmxsaV9vY2hfbXV0ZXgpOwogCQlpZiAoZmQtPmZkX2xlYXNlX29jaCkgewogCQkJc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICpvY2ggPSBmZC0+ZmRfbGVhc2Vfb2NoOwpAQCAtMjUyMiwxNCArMjQzNiwxMyBAQAogCQkJaWYgKGxvY2spIHsKIAkJCQlsb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKIAkJCQlpZiAoIWxkbG1faXNfY2FuY2VsKGxvY2spKQotCQkJCQlyYyA9IG9jaC0+b2NoX2ZsYWdzICYKLQkJCQkJCShGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpOworCQkJCQlmbW9kZSA9IG9jaC0+b2NoX2ZsYWdzOwogCQkJCXVubG9ja19yZXNfYW5kX2xvY2sobG9jayk7CiAJCQkJTERMTV9MT0NLX1BVVChsb2NrKTsKIAkJCX0KIAkJfQogCQltdXRleF91bmxvY2soJmxsaS0+bGxpX29jaF9tdXRleCk7Ci0JCXJldHVybiByYzsKKwkJcmV0dXJuIGxsX2xlYXNlX3R5cGVfZnJvbV9mbW9kZShmbW9kZSk7CiAJfQogCWNhc2UgTExfSU9DX0hTTV9JTVBPUlQ6IHsKIAkJc3RydWN0IGhzbV91c2VyX2ltcG9ydCAqaHVpOwpAQCAtMjU3NCw5ICsyNDg3LDggQEAKIAkJZW9mID0gaV9zaXplX3JlYWQoaW5vZGUpOwogCX0KIAotCXJldHZhbCA9IGdlbmVyaWNfZmlsZV9sbHNlZWtfc2l6ZShmaWxlLCBvZmZzZXQsIG9yaWdpbiwKLQkJCQkJICBsbF9maWxlX21heGJ5dGVzKGlub2RlKSwgZW9mKTsKLQlyZXR1cm4gcmV0dmFsOworCXJldHVybiBnZW5lcmljX2ZpbGVfbGxzZWVrX3NpemUoZmlsZSwgb2Zmc2V0LCBvcmlnaW4sCisJCQkJCWxsX2ZpbGVfbWF4Ynl0ZXMoaW5vZGUpLCBlb2YpOwogfQogCiBzdGF0aWMgaW50IGxsX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxlLCBmbF9vd25lcl90IGlkKQpAQCAtMjU5Myw5ICsyNTA1LDExIEBACiAJICovCiAJcmMgPSBsbGktPmxsaV9hc3luY19yYzsKIAlsbGktPmxsaV9hc3luY19yYyA9IDA7Ci0JZXJyID0gbG92X3JlYWRfYW5kX2NsZWFyX2FzeW5jX3JjKGxsaS0+bGxpX2Nsb2IpOwotCWlmIChyYyA9PSAwKQotCQlyYyA9IGVycjsKKwlpZiAobGxpLT5sbGlfY2xvYikgeworCQllcnIgPSBsb3ZfcmVhZF9hbmRfY2xlYXJfYXN5bmNfcmMobGxpLT5sbGlfY2xvYik7CisJCWlmICghcmMpCisJCQlyYyA9IGVycjsKKwl9CiAKIAkvKiBUaGUgYXBwbGljYXRpb24gaGFzIGJlZW4gdG9sZCBhYm91dCB3cml0ZSBmYWlsdXJlIGFscmVhZHkuCiAJICogRG8gbm90IHJlcG9ydCBmYWlsdXJlIGFnYWluLgpAQCAtMjcxNCw2ICsyNjI4LDcgQEAKIAlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKIAlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSBsb2NraCA9IHswfTsKIAlsZGxtX3BvbGljeV9kYXRhX3QgZmxvY2sgPSB7IHswfSB9OworCWludCBmbF90eXBlID0gZmlsZV9sb2NrLT5mbF90eXBlOwogCV9fdTY0IGZsYWdzID0gMDsKIAlpbnQgcmM7CiAJaW50IHJjMiA9IDA7CkBAIC0yNzQ0LDcgKzI2NTksNyBAQAogCWlmIChmaWxlX2xvY2stPmZsX2xtb3BzICYmIGZpbGVfbG9jay0+ZmxfbG1vcHMtPmxtX2NvbXBhcmVfb3duZXIpCiAJCWZsb2NrLmxfZmxvY2sub3duZXIgPSAodW5zaWduZWQgbG9uZylmaWxlX2xvY2stPmZsX3BpZDsKIAotCXN3aXRjaCAoZmlsZV9sb2NrLT5mbF90eXBlKSB7CisJc3dpdGNoIChmbF90eXBlKSB7CiAJY2FzZSBGX1JETENLOgogCQllaW5mby5laV9tb2RlID0gTENLX1BSOwogCQlicmVhazsKQEAgLTI3NjQsOCArMjY3OSw3IEBACiAJCWVpbmZvLmVpX21vZGUgPSBMQ0tfUFc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCUNERUJVRyhEX0lORk8sICJVbmtub3duIGZjbnRsIGxvY2sgdHlwZTogJWRcbiIsCi0JCSAgICAgICBmaWxlX2xvY2stPmZsX3R5cGUpOworCQlDREVCVUcoRF9JTkZPLCAiVW5rbm93biBmY250bCBsb2NrIHR5cGU6ICVkXG4iLCBmbF90eXBlKTsKIAkJcmV0dXJuIC1FTk9UU1VQUDsKIAl9CiAKQEAgLTI3ODcsMTYgKzI3MDEsMTggQEAKIAljYXNlIEZfR0VUTEs2NDoKICNlbmRpZgogCQlmbGFncyA9IExETE1fRkxfVEVTVF9MT0NLOwotCQkvKiBTYXZlIHRoZSBvbGQgbW9kZSBzbyB0aGF0IGlmIHRoZSBtb2RlIGluIHRoZSBsb2NrIGNoYW5nZXMgd2UKLQkJICogY2FuIGRlY3JlbWVudCB0aGUgYXBwcm9wcmlhdGUgcmVhZGVyIG9yIHdyaXRlciByZWZjb3VudC4KLQkJICovCi0JCWZpbGVfbG9jay0+ZmxfdHlwZSA9IGVpbmZvLmVpX21vZGU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUNFUlJPUigidW5rbm93biBmY250bCBsb2NrIGNvbW1hbmQ6ICVkXG4iLCBjbWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwkvKgorCSAqIFNhdmUgdGhlIG9sZCBtb2RlIHNvIHRoYXQgaWYgdGhlIG1vZGUgaW4gdGhlIGxvY2sgY2hhbmdlcyB3ZQorCSAqIGNhbiBkZWNyZW1lbnQgdGhlIGFwcHJvcHJpYXRlIHJlYWRlciBvciB3cml0ZXIgcmVmY291bnQuCisJICovCisJZmlsZV9sb2NrLT5mbF90eXBlID0gZWluZm8uZWlfbW9kZTsKKwogCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgaW5vZGUsIE5VTEwsIE5VTEwsIDAsIDAsCiAJCQkJICAgICBMVVNUUkVfT1BDX0FOWSwgTlVMTCk7CiAJaWYgKElTX0VSUihvcF9kYXRhKSkKQEAgLTI4MDYsOCArMjcyMiwxMiBAQAogCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBmbG9jay5sX2Zsb2NrLnBpZCwgZmxhZ3MsCiAJICAgICAgIGVpbmZvLmVpX21vZGUsIGZsb2NrLmxfZmxvY2suc3RhcnQsIGZsb2NrLmxfZmxvY2suZW5kKTsKIAotCXJjID0gbWRfZW5xdWV1ZShzYmktPmxsX21kX2V4cCwgJmVpbmZvLCBOVUxMLAotCQkJb3BfZGF0YSwgJmxvY2toLCAmZmxvY2ssIDAsIE5VTEwgLyogcmVxICovLCBmbGFncyk7CisJcmMgPSBtZF9lbnF1ZXVlKHNiaS0+bGxfbWRfZXhwLCAmZWluZm8sICZmbG9jaywgTlVMTCwgb3BfZGF0YSwgJmxvY2toLAorCQkJZmxhZ3MpOworCisJLyogUmVzdG9yZSB0aGUgZmlsZSBsb2NrIHR5cGUgaWYgbm90IFRFU1QgbG9jay4gKi8KKwlpZiAoIShmbGFncyAmIExETE1fRkxfVEVTVF9MT0NLKSkKKwkJZmlsZV9sb2NrLT5mbF90eXBlID0gZmxfdHlwZTsKIAogCWlmICgocmMgPT0gMCB8fCBmaWxlX2xvY2stPmZsX3R5cGUgPT0gRl9VTkxDSykgJiYKIAkgICAgIShmbGFncyAmIExETE1fRkxfVEVTVF9MT0NLKSkKQEAgLTI4MTUsOCArMjczNSw4IEBACiAKIAlpZiAocmMyICYmIGZpbGVfbG9jay0+ZmxfdHlwZSAhPSBGX1VOTENLKSB7CiAJCWVpbmZvLmVpX21vZGUgPSBMQ0tfTkw7Ci0JCW1kX2VucXVldWUoc2JpLT5sbF9tZF9leHAsICZlaW5mbywgTlVMTCwKLQkJCSAgIG9wX2RhdGEsICZsb2NraCwgJmZsb2NrLCAwLCBOVUxMIC8qIHJlcSAqLywgZmxhZ3MpOworCQltZF9lbnF1ZXVlKHNiaS0+bGxfbWRfZXhwLCAmZWluZm8sICZmbG9jaywgTlVMTCwgb3BfZGF0YSwKKwkJCSAgICZsb2NraCwgZmxhZ3MpOwogCQlyYyA9IHJjMjsKIAl9CiAKQEAgLTI4MjUsNiArMjc0NSwxMTcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK2ludCBsbF9nZXRfZmlkX2J5X25hbWUoc3RydWN0IGlub2RlICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICBpbnQgbmFtZWxlbiwgc3RydWN0IGx1X2ZpZCAqZmlkKQoreworCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhID0gTlVMTDsKKwlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgbWR0X2JvZHkgKmJvZHk7CisJaW50IHJjOworCisJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBwYXJlbnQsIE5VTEwsIG5hbWUsIG5hbWVsZW4sIDAsCisJCQkJICAgICBMVVNUUkVfT1BDX0FOWSwgTlVMTCk7CisJaWYgKElTX0VSUihvcF9kYXRhKSkKKwkJcmV0dXJuIFBUUl9FUlIob3BfZGF0YSk7CisKKwlvcF9kYXRhLT5vcF92YWxpZCA9IE9CRF9NRF9GTElEOworCXJjID0gbWRfZ2V0YXR0cl9uYW1lKGxsX2kyc2JpKHBhcmVudCktPmxsX21kX2V4cCwgb3BfZGF0YSwgJnJlcSk7CisJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CisJaWYgKCFib2R5KSB7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBvdXRfcmVxOworCX0KKwlpZiAoZmlkKQorCQkqZmlkID0gYm9keS0+bWJvX2ZpZDE7CitvdXRfcmVxOgorCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBsbF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqcGFyZW50LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1kdGlkeCwKKwkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pCit7CisJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0ID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmNoaWxkX2lub2RlID0gTlVMTDsKKwlzdHJ1Y3QgZGVudHJ5ICpkY2hpbGQgPSBOVUxMOworCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhOworCXN0cnVjdCBxc3RyIHFzdHI7CisJaW50IHJjOworCisJQ0RFQlVHKERfVkZTVFJBQ0UsICJtaWdyYXRlICVzIHVuZGVyICJERklEIiB0byBNRFQlZFxuIiwKKwkgICAgICAgbmFtZSwgUEZJRChsbF9pbm9kZTJmaWQocGFyZW50KSksIG1kdGlkeCk7CisKKwlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIHBhcmVudCwgTlVMTCwgbmFtZSwgbmFtZWxlbiwKKwkJCQkgICAgIDAsIExVU1RSRV9PUENfQU5ZLCBOVUxMKTsKKwlpZiAoSVNfRVJSKG9wX2RhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihvcF9kYXRhKTsKKworCS8qIEdldCBjaGlsZCBGSUQgZmlyc3QgKi8KKwlxc3RyLmhhc2ggPSBmdWxsX25hbWVfaGFzaChwYXJlbnQsIG5hbWUsIG5hbWVsZW4pOworCXFzdHIubmFtZSA9IG5hbWU7CisJcXN0ci5sZW4gPSBuYW1lbGVuOworCWRjaGlsZCA9IGRfbG9va3VwKGZpbGVfZGVudHJ5KGZpbGUpLCAmcXN0cik7CisJaWYgKGRjaGlsZCkgeworCQlvcF9kYXRhLT5vcF9maWQzID0gKmxsX2lub2RlMmZpZChkY2hpbGQtPmRfaW5vZGUpOworCQlpZiAoZGNoaWxkLT5kX2lub2RlKSB7CisJCQljaGlsZF9pbm9kZSA9IGlncmFiKGRjaGlsZC0+ZF9pbm9kZSk7CisJCQlpZiAoY2hpbGRfaW5vZGUpIHsKKwkJCQlpbm9kZV9sb2NrKGNoaWxkX2lub2RlKTsKKwkJCQlvcF9kYXRhLT5vcF9maWQzID0gKmxsX2lub2RlMmZpZChjaGlsZF9pbm9kZSk7CisJCQkJbGxfaW52YWxpZGF0ZV9hbGlhc2VzKGNoaWxkX2lub2RlKTsKKwkJCX0KKwkJfQorCQlkcHV0KGRjaGlsZCk7CisJfSBlbHNlIHsKKwkJcmMgPSBsbF9nZXRfZmlkX2J5X25hbWUocGFyZW50LCBuYW1lLCBuYW1lbGVuLAorCQkJCQkmb3BfZGF0YS0+b3BfZmlkMyk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJaWYgKCFmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMykpIHsKKwkJQ0VSUk9SKCIlczogbWlncmF0ZSAlcywgYnV0IGZpZCAiREZJRCIgaXMgaW5zYW5lXG4iLAorCQkgICAgICAgbGxfZ2V0X2ZzbmFtZShwYXJlbnQtPmlfc2IsIE5VTEwsIDApLCBuYW1lLAorCQkgICAgICAgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMykpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJcmMgPSBsbF9nZXRfbWR0X2lkeF9ieV9maWQobGxfaTJzYmkocGFyZW50KSwgJm9wX2RhdGEtPm9wX2ZpZDMpOworCWlmIChyYyA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpZiAocmMgPT0gbWR0aWR4KSB7CisJCUNERUJVRyhEX0lORk8sICIlczoiREZJRCIgaXMgYWxyZWFkeSBvbiBNRFQlZC5cbiIsIG5hbWUsCisJCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQzKSwgbWR0aWR4KTsKKwkJcmMgPSAwOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCW9wX2RhdGEtPm9wX21kcyA9IG1kdGlkeDsKKwlvcF9kYXRhLT5vcF9jbGlfZmxhZ3MgPSBDTElfTUlHUkFURTsKKwlyYyA9IG1kX3JlbmFtZShsbF9pMnNiaShwYXJlbnQpLT5sbF9tZF9leHAsIG9wX2RhdGEsIG5hbWUsCisJCSAgICAgICBuYW1lbGVuLCBuYW1lLCBuYW1lbGVuLCAmcmVxdWVzdCk7CisJaWYgKCFyYykKKwkJbGxfdXBkYXRlX3RpbWVzKHJlcXVlc3QsIHBhcmVudCk7CisKKwlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcXVlc3QpOworCitvdXRfZnJlZToKKwlpZiAoY2hpbGRfaW5vZGUpIHsKKwkJY2xlYXJfbmxpbmsoY2hpbGRfaW5vZGUpOworCQlpbm9kZV91bmxvY2soY2hpbGRfaW5vZGUpOworCQlpcHV0KGNoaWxkX2lub2RlKTsKKwl9CisKKwlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKKwlyZXR1cm4gcmM7Cit9CisKIHN0YXRpYyBpbnQKIGxsX2ZpbGVfbm9mbG9jayhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmlsZV9sb2NrKQogewpAQCAtMjg0Nyw3ICsyODc4LDcgQEAKIAlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSBsb2NraDsKIAlsZGxtX3BvbGljeV9kYXRhX3QgcG9saWN5OwogCWVudW0gbGRsbV9tb2RlIG1vZGUgPSAobF9yZXFfbW9kZSA9PSBMQ0tfTUlOTU9ERSkgPwotCQkJCShMQ0tfQ1J8TENLX0NXfExDS19QUnxMQ0tfUFcpIDogbF9yZXFfbW9kZTsKKwkJCSAgICAgIChMQ0tfQ1IgfCBMQ0tfQ1cgfCBMQ0tfUFIgfCBMQ0tfUFcpIDogbF9yZXFfbW9kZTsKIAlzdHJ1Y3QgbHVfZmlkICpmaWQ7CiAJX191NjQgZmxhZ3M7CiAJaW50IGk7CkBAIC0yODg4LDE1ICsyOTE5LDEyIEBACiB7CiAJbGRsbV9wb2xpY3lfZGF0YV90IHBvbGljeSA9IHsgLmxfaW5vZGViaXRzID0ge2JpdHN9IH07CiAJc3RydWN0IGx1X2ZpZCAqZmlkOwotCWVudW0gbGRsbV9tb2RlIHJjOwogCiAJZmlkID0gJmxsX2kyaW5mbyhpbm9kZSktPmxsaV9maWQ7CiAJQ0RFQlVHKERfSU5GTywgInRyeWluZyB0byBtYXRjaCByZXMgIkRGSUQiXG4iLCBQRklEKGZpZCkpOwogCi0JcmMgPSBtZF9sb2NrX21hdGNoKGxsX2kybWRleHAoaW5vZGUpLCBmbGFncyB8IExETE1fRkxfQkxPQ0tfR1JBTlRFRCwKLQkJCSAgIGZpZCwgTERMTV9JQklUUywgJnBvbGljeSwgbW9kZSwgbG9ja2gpOwotCi0JcmV0dXJuIHJjOworCXJldHVybiBtZF9sb2NrX21hdGNoKGxsX2kybWRleHAoaW5vZGUpLCBmbGFncyB8IExETE1fRkxfQkxPQ0tfR1JBTlRFRCwKKwkJCSAgICAgZmlkLCBMRExNX0lCSVRTLCAmcG9saWN5LCBtb2RlLCBsb2NraCk7CiB9CiAKIHN0YXRpYyBpbnQgbGxfaW5vZGVfcmV2YWxpZGF0ZV9maW5pKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCByYykKQEAgLTI5NDksMTUgKzI5NzcsOSBAQAogCQlpZiAoSVNfRVJSKG9wX2RhdGEpKQogCQkJcmV0dXJuIFBUUl9FUlIob3BfZGF0YSk7CiAKLQkJb2l0Lml0X2NyZWF0ZV9tb2RlIHw9IE1fQ0hFQ0tfU1RBTEU7Ci0JCXJjID0gbWRfaW50ZW50X2xvY2soZXhwLCBvcF9kYXRhLCBOVUxMLCAwLAotCQkJCSAgICAvKiB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gbmFtZQotCQkJCSAgICAgKiBiYXNlZCBsb29rdXAKLQkJCQkgICAgICovCi0JCQkJICAgICZvaXQsIDAsICZyZXEsCi0JCQkJICAgIGxsX21kX2Jsb2NraW5nX2FzdCwgMCk7CisJCXJjID0gbWRfaW50ZW50X2xvY2soZXhwLCBvcF9kYXRhLCAmb2l0LCAmcmVxLAorCQkJCSAgICAmbGxfbWRfYmxvY2tpbmdfYXN0LCAwKTsKIAkJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7Ci0JCW9pdC5pdF9jcmVhdGVfbW9kZSAmPSB+TV9DSEVDS19TVEFMRTsKIAkJaWYgKHJjIDwgMCkgewogCQkJcmMgPSBsbF9pbm9kZV9yZXZhbGlkYXRlX2ZpbmkoaW5vZGUsIHJjKTsKIAkJCWdvdG8gb3V0OwpAQCAtMzAwMywxMCArMzAyNSw4IEBACiAJCW9wX2RhdGEtPm9wX3ZhbGlkID0gdmFsaWQ7CiAJCXJjID0gbWRfZ2V0YXR0cihzYmktPmxsX21kX2V4cCwgb3BfZGF0YSwgJnJlcSk7CiAJCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOwotCQlpZiAocmMpIHsKLQkJCXJjID0gbGxfaW5vZGVfcmV2YWxpZGF0ZV9maW5pKGlub2RlLCByYyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KKwkJaWYgKHJjKQorCQkJcmV0dXJuIGxsX2lub2RlX3JldmFsaWRhdGVfZmluaShpbm9kZSwgcmMpOwogCiAJCXJjID0gbGxfcHJlcF9pbm9kZSgmaW5vZGUsIHJlcSwgTlVMTCwgTlVMTCk7CiAJfQpAQCAtMzAxNSw2ICszMDM1LDI4IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IGxsX21lcmdlX21kX2F0dHIoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgY2xfYXR0ciBhdHRyID0geyAwIH07CisJaW50IHJjOworCisJTEFTU0VSVChsbF9pMmluZm8oaW5vZGUpLT5sbGlfbHNtX21kKTsKKwlyYyA9IG1kX21lcmdlX2F0dHIobGxfaTJtZGV4cChpbm9kZSksIGxsX2kyaW5mbyhpbm9kZSktPmxsaV9sc21fbWQsCisJCQkgICAmYXR0ciwgbGxfbWRfYmxvY2tpbmdfYXN0KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXNldF9ubGluayhpbm9kZSwgYXR0ci5jYXRfbmxpbmspOworCWlub2RlLT5pX2Jsb2NrcyA9IGF0dHIuY2F0X2Jsb2NrczsKKwlpX3NpemVfd3JpdGUoaW5vZGUsIGF0dHIuY2F0X3NpemUpOworCisJbGxfaTJpbmZvKGlub2RlKS0+bGxpX2F0aW1lID0gYXR0ci5jYXRfYXRpbWU7CisJbGxfaTJpbmZvKGlub2RlKS0+bGxpX210aW1lID0gYXR0ci5jYXRfbXRpbWU7CisJbGxfaTJpbmZvKGlub2RlKS0+bGxpX2N0aW1lID0gYXR0ci5jYXRfY3RpbWU7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBsbF9pbm9kZV9yZXZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgX191NjQgaWJpdHMpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRfaW5vZGUoZGVudHJ5KTsKQEAgLTMwMjYsNiArMzA2OCwxMyBAQAogCiAJLyogaWYgb2JqZWN0IGlzbid0IHJlZ3VsYXIgZmlsZSwgZG9uJ3QgdmFsaWRhdGUgc2l6ZSAqLwogCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJgorCQkgICAgbGxfaTJpbmZvKGlub2RlKS0+bGxpX2xzbV9tZCkgeworCQkJcmMgPSBsbF9tZXJnZV9tZF9hdHRyKGlub2RlKTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisJCX0KKwogCQlMVElNRV9TKGlub2RlLT5pX2F0aW1lKSA9IGxsX2kyaW5mbyhpbm9kZSktPmxsaV9hdGltZTsKIAkJTFRJTUVfUyhpbm9kZS0+aV9tdGltZSkgPSBsbF9pMmluZm8oaW5vZGUpLT5sbGlfbXRpbWU7CiAJCUxUSU1FX1MoaW5vZGUtPmlfY3RpbWUpID0gbGxfaTJpbmZvKGlub2RlKS0+bGxpX2N0aW1lOwpAQCAtMzA1NywxMyArMzEwNiwxNCBAQAogCWlmIChyZXMpCiAJCXJldHVybiByZXM7CiAKKwlPQkRfRkFJTF9USU1FT1VUKE9CRF9GQUlMX0dFVEFUVFJfREVMQVksIDMwKTsKKwogCXN0YXQtPmRldiA9IGlub2RlLT5pX3NiLT5zX2RldjsKIAlpZiAobGxfbmVlZF8zMmJpdF9hcGkoc2JpKSkKIAkJc3RhdC0+aW5vID0gY2xfZmlkX2J1aWxkX2lubygmbGxpLT5sbGlfZmlkLCAxKTsKIAllbHNlCiAJCXN0YXQtPmlubyA9IGlub2RlLT5pX2lubzsKIAlzdGF0LT5tb2RlID0gaW5vZGUtPmlfbW9kZTsKLQlzdGF0LT5ubGluayA9IGlub2RlLT5pX25saW5rOwogCXN0YXQtPnVpZCA9IGlub2RlLT5pX3VpZDsKIAlzdGF0LT5naWQgPSBpbm9kZS0+aV9naWQ7CiAJc3RhdC0+cmRldiA9IGlub2RlLT5pX3JkZXY7CkBAIC0zMDcyLDYgKzMxMjIsNyBAQAogCXN0YXQtPmN0aW1lID0gaW5vZGUtPmlfY3RpbWU7CiAJc3RhdC0+Ymxrc2l6ZSA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKIAorCXN0YXQtPm5saW5rID0gaW5vZGUtPmlfbmxpbms7CiAJc3RhdC0+c2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAlzdGF0LT5ibG9ja3MgPSBpbm9kZS0+aV9ibG9ja3M7CiAKQEAgLTMxMzksNiArMzE5MCwxMiBAQAogCiBpbnQgbGxfaW5vZGVfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKIHsKKwlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpOworCXN0cnVjdCByb290X3NxdWFzaF9pbmZvICpzcXVhc2g7CisJY29uc3Qgc3RydWN0IGNyZWQgKm9sZF9jcmVkID0gTlVMTDsKKwlzdHJ1Y3QgY3JlZCAqY3JlZCA9IE5VTEw7CisJYm9vbCBzcXVhc2hfaWQgPSBmYWxzZTsKKwljZnNfY2FwX3QgY2FwOwogCWludCByYyA9IDA7CiAKIAlpZiAobWFzayAmIE1BWV9OT1RfQkxPQ0spCkBAIC0zMTU4LDkgKzMyMTUsNDYgQEAKIAlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDppbm9kZT0iREZJRCIoJXApLCBpbm9kZSBtb2RlICV4IG1hc2sgJW9cbiIsCiAJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIGlub2RlLCBpbm9kZS0+aV9tb2RlLCBtYXNrKTsKIAorCS8qIHNxdWFzaCBmc3VpZC9mc2dpZCBpZiBuZWVkZWQgKi8KKwlzYmkgPSBsbF9pMnNiaShpbm9kZSk7CisJc3F1YXNoID0gJnNiaS0+bGxfc3F1YXNoOworCWlmICh1bmxpa2VseShzcXVhc2gtPnJzaV91aWQgJiYKKwkJICAgICB1aWRfZXEoY3VycmVudF9mc3VpZCgpLCBHTE9CQUxfUk9PVF9VSUQpICYmCisJCSAgICAgIShzYmktPmxsX2ZsYWdzICYgTExfU0JJX05PUk9PVFNRVUFTSCkpKSB7CisJCXNxdWFzaF9pZCA9IHRydWU7CisJfQorCisJaWYgKHNxdWFzaF9pZCkgeworCQlDREVCVUcoRF9PVEhFUiwgInNxdWFzaCBjcmVkcyAoJWQ6JWQpPT4oJWQ6JWQpXG4iLAorCQkgICAgICAgX19rdWlkX3ZhbChjdXJyZW50X2ZzdWlkKCkpLCBfX2tnaWRfdmFsKGN1cnJlbnRfZnNnaWQoKSksCisJCSAgICAgICBzcXVhc2gtPnJzaV91aWQsIHNxdWFzaC0+cnNpX2dpZCk7CisKKwkJLyoKKwkJICogdXBkYXRlIGN1cnJlbnQgcHJvY2VzcydzIGNyZWRlbnRpYWxzCisJCSAqIGFuZCBGUyBjYXBhYmlsaXR5CisJCSAqLworCQljcmVkID0gcHJlcGFyZV9jcmVkcygpOworCQlpZiAoIWNyZWQpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQljcmVkLT5mc3VpZCA9IG1ha2Vfa3VpZCgmaW5pdF91c2VyX25zLCBzcXVhc2gtPnJzaV91aWQpOworCQljcmVkLT5mc2dpZCA9IG1ha2Vfa2dpZCgmaW5pdF91c2VyX25zLCBzcXVhc2gtPnJzaV9naWQpOworCQlmb3IgKGNhcCA9IDA7IGNhcCA8IHNpemVvZihjZnNfY2FwX3QpICogODsgY2FwKyspIHsKKwkJCWlmICgoMSA8PCBjYXApICYgQ0ZTX0NBUF9GU19NQVNLKQorCQkJCWNhcF9sb3dlcihjcmVkLT5jYXBfZWZmZWN0aXZlLCBjYXApOworCQl9CisJCW9sZF9jcmVkID0gb3ZlcnJpZGVfY3JlZHMoY3JlZCk7CisJfQorCiAJbGxfc3RhdHNfb3BzX3RhbGx5KGxsX2kyc2JpKGlub2RlKSwgTFBST0NfTExfSU5PREVfUEVSTSwgMSk7CiAJcmMgPSBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2spOwogCisJLyogcmVzdG9yZSBjdXJyZW50IHByb2Nlc3MncyBjcmVkZW50aWFscyBhbmQgRlMgY2FwYWJpbGl0eSAqLworCWlmIChzcXVhc2hfaWQpIHsKKwkJcmV2ZXJ0X2NyZWRzKG9sZF9jcmVkKTsKKwkJcHV0X2NyZWQoY3JlZCk7CisJfQorCiAJcmV0dXJuIHJjOwogfQogCkBAIC0zMjEzLDEwICszMzA3LDEwIEBACiAJLnNldGF0dHIJPSBsbF9zZXRhdHRyLAogCS5nZXRhdHRyCT0gbGxfZ2V0YXR0ciwKIAkucGVybWlzc2lvbgk9IGxsX2lub2RlX3Blcm1pc3Npb24sCi0JLnNldHhhdHRyCT0gbGxfc2V0eGF0dHIsCi0JLmdldHhhdHRyCT0gbGxfZ2V0eGF0dHIsCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAogCS5saXN0eGF0dHIJPSBsbF9saXN0eGF0dHIsCi0JLnJlbW92ZXhhdHRyCT0gbGxfcmVtb3ZleGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKIAkuZmllbWFwCQk9IGxsX2ZpZW1hcCwKIAkuZ2V0X2FjbAk9IGxsX2dldF9hY2wsCiB9OwpAQCAtMzI1MSw3ICszMzQ1LDYgQEAKIAlpZiAoIWluX2RhdGEpCiAJCXJldHVybiBOVUxMOwogCi0JbWVtc2V0KGluX2RhdGEsIDAsIHNpemVvZigqaW5fZGF0YSkpOwogCWluX2RhdGEtPmlvY2Rfc2l6ZSA9IHNpemU7CiAJaW5fZGF0YS0+aW9jZF9jYiA9IGNiOwogCWluX2RhdGEtPmlvY2RfY291bnQgPSBjb3VudDsKQEAgLTMzODksNyArMzQ4Miw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWxtbXNpemUgPSBib2R5LT5lYWRhdGFzaXplOworCWxtbXNpemUgPSBib2R5LT5tYm9fZWFkYXRhc2l6ZTsKIAlpZiAobG1tc2l6ZSA9PSAwKSAvKiBlbXB0eSBsYXlvdXQgKi8gewogCQlyYyA9IDA7CiAJCWdvdG8gb3V0OwpAQCAtMzQ0Nyw3ICszNTQwLDcgQEAKIAkJICAgUEZJRCgmbGxpLT5sbGlfZmlkKSwgaW5vZGUsIHJlY29uZik7CiAKIAkvKiBpbiBjYXNlIHRoaXMgaXMgYSBjYWNoaW5nIGxvY2sgYW5kIHJlaW5zdGF0ZSB3aXRoIG5ldyBpbm9kZSAqLwotCW1kX3NldF9sb2NrX2RhdGEoc2JpLT5sbF9tZF9leHAsICZsb2NraC0+Y29va2llLCBpbm9kZSwgTlVMTCk7CisJbWRfc2V0X2xvY2tfZGF0YShzYmktPmxsX21kX2V4cCwgbG9ja2gsIGlub2RlLCBOVUxMKTsKIAogCWxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOwogCWx2Yl9yZWFkeSA9IGxkbG1faXNfbHZiX3JlYWR5KGxvY2spOwpAQCAtMzU1Nyw4ICszNjUwLDggQEAKIAlzdHJ1Y3QgbGRsbV9lbnF1ZXVlX2luZm8gZWluZm8gPSB7CiAJCS5laV90eXBlID0gTERMTV9JQklUUywKIAkJLmVpX21vZGUgPSBMQ0tfQ1IsCi0JCS5laV9jYl9ibCA9IGxsX21kX2Jsb2NraW5nX2FzdCwKLQkJLmVpX2NiX2NwID0gbGRsbV9jb21wbGV0aW9uX2FzdCwKKwkJLmVpX2NiX2JsID0gJmxsX21kX2Jsb2NraW5nX2FzdCwKKwkJLmVpX2NiX2NwID0gJmxkbG1fY29tcGxldGlvbl9hc3QsCiAJfTsKIAlpbnQgcmM7CiAKQEAgLTM2MDQsOCArMzY5Nyw3IEBACiAJCQkgIGxsX2dldF9mc25hbWUoaW5vZGUtPmlfc2IsIE5VTEwsIDApLAogCQkJICBQRklEKCZsbGktPmxsaV9maWQpLCBpbm9kZSk7CiAKLQlyYyA9IG1kX2VucXVldWUoc2JpLT5sbF9tZF9leHAsICZlaW5mbywgJml0LCBvcF9kYXRhLCAmbG9ja2gsCi0JCQlOVUxMLCAwLCBOVUxMLCAwKTsKKwlyYyA9IG1kX2VucXVldWUoc2JpLT5sbF9tZF9leHAsICZlaW5mbywgTlVMTCwgJml0LCBvcF9kYXRhLCAmbG9ja2gsIDApOwogCXB0bHJwY19yZXFfZmluaXNoZWQoaXQuaXRfcmVxdWVzdCk7CiAJaXQuaXRfcmVxdWVzdCA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2dsaW1wc2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2dsaW1wc2UuYwppbmRleCA5MjAwNGEwNS4uMjI1MDdiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZ2xpbXBzZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2dsaW1wc2UuYwpAQCAtNDIsNyArNDIsNiBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkLmgiCiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9kbG0uaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbWRjLmgiCiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xjb21tb25fY2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xjb21tb25fY2wuYwppbmRleCAzOTZlNGU0Zi4uMDg0MzMwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGNvbW1vbl9jbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xjb21tb25fY2wuYwpAQCAtNDksNyArNDksNiBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfc3VwcG9ydC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2ZpZC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9kbG0uaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV92ZXIuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9tZGMuaCIKQEAgLTEwMCw2ICs5OSw3IEBACiAJaW8tPnUuY2lfc2V0YXR0ci5zYV9hdHRyLmx2Yl9jdGltZSA9IExUSU1FX1MoYXR0ci0+aWFfY3RpbWUpOwogCWlvLT51LmNpX3NldGF0dHIuc2FfYXR0ci5sdmJfc2l6ZSA9IGF0dHItPmlhX3NpemU7CiAJaW8tPnUuY2lfc2V0YXR0ci5zYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOworCWlvLT51LmNpX3NldGF0dHIuc2FfcGFyZW50X2ZpZCA9IGxsX2lub2RlMmZpZChpbm9kZSk7CiAKIGFnYWluOgogCWlmIChjbF9pb19pbml0KGVudiwgaW8sIENJVF9TRVRBVFRSLCBpby0+Y2lfb2JqKSA9PSAwKSB7CkBAIC0xNTQsNyArMTU0LDcgQEAKIAlpbnQgcmVzdWx0ID0gMDsKIAlpbnQgcmVmY2hlY2s7CiAKLQlMQVNTRVJUKG1kLT5ib2R5LT52YWxpZCAmIE9CRF9NRF9GTElEKTsKKwlMQVNTRVJUKG1kLT5ib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxJRCk7CiAJTEFTU0VSVChTX0lTUkVHKGlub2RlLT5pX21vZGUpKTsKIAogCWVudiA9IGNsX2Vudl9nZXQoJnJlZmNoZWNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xjb21tb25fbWlzYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGNvbW1vbl9taXNjLmMKaW5kZXggZjZiZTEwNS4uZmIzNDZjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGNvbW1vbl9taXNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGNvbW1vbl9taXNjLmMKQEAgLTM4LDcgKzM4LDYgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvY2xfb2JqZWN0LmgiCiAKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAibGxpdGVfaW50ZXJuYWwuaCIKIAogLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBhbmQgbWF4aW11bSBMT1YgRUEgYW5kIGNvb2tpZSBzaXplcy4gIFRoaXMgYWxsb3dzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9jbG9zZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfY2xvc2UuYwppbmRleCAyMzI2YjQwLi44NjQ0NjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9jbG9zZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2Nsb3NlLmMKQEAgLTM4LDcgKzM4LDYgQEAKIAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTElURQogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgImxsaXRlX2ludGVybmFsLmgiCiAKIC8qKiByZWNvcmRzIHRoYXQgYSB3cml0ZSBpcyBpbiBmbGlnaHQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9pbnRlcm5hbC5oCmluZGV4IDRkNmQ1ODkuLjNlOThiZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfaW50ZXJuYWwuaApAQCAtMzYsMTQgKzM2LDIxIEBACiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfdmVyLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZGlzay5oIgkvKiBmb3IgczJzYmkgKi8KICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9lYWNsLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGlua2VhLmgiCiAKIC8qIGZvciBzdHJ1Y3QgY2xfbG9ja19kZXNjciBhbmQgc3RydWN0IGNsX2lvICovCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfcGF0Y2hsZXNzX2NvbXBhdC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2NvbXBhdC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvY2xfb2JqZWN0LmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbG12LmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbWRjLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfaW50ZW50LmgiCiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbF94YXR0ci5oPgogI2luY2x1ZGUgInZ2cF9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInJhbmdlX2xvY2suaCIKIAogI2lmbmRlZiBGTU9ERV9FWEVDCiAjZGVmaW5lIEZNT0RFX0VYRUMgMApAQCAtNTcsNiArNjQsOSBAQAogI2RlZmluZSBMTF9ESVJfRU5EX09GRgkgIDB4N2ZmZmZmZmZmZmZmZmZmZlVMTAogI2RlZmluZSBMTF9ESVJfRU5EX09GRl8zMkJJVCAgICAweDdmZmZmZmZmVUwKIAorLyogNFVMICogMTAyNCAqIDEwMjQgKi8KKyNkZWZpbmUgTExfTUFYX0JMS1NJWkVfQklUUyAyMgorCiAjZGVmaW5lIExMX0lUMlNUUihpdCkgKChpdCkgPyBsZGxtX2l0MnN0cigoaXQpLT5pdF9vcCkgOiAiMCIpCiAjZGVmaW5lIExVU1RSRV9GUFJJVkFURShmaWxlKSAoKGZpbGUpLT5wcml2YXRlX2RhdGEpCiAKQEAgLTExNiw5ICsxMjYsNyBAQAogCiAJLyogaWRlbnRpZnlpbmcgZmllbGRzIGZvciBib3RoIG1ldGFkYXRhIGFuZCBkYXRhIHN0YWNrcy4gKi8KIAlzdHJ1Y3QgbHVfZmlkCQkgICBsbGlfZmlkOwotCS8qIFBhcmVudCBmaWQgZm9yIGFjY2Vzc2luZyBkZWZhdWx0IHN0cmlwZSBkYXRhIG9uIHBhcmVudCBkaXJlY3RvcnkKLQkgKiBmb3IgYWxsb2NhdGluZyBPU1Qgb2JqZWN0cyBhZnRlciBhIG1rbm9kKCkgYW5kIGxhdGVyIG9wZW4tYnktRklELgotCSAqLworCS8qIG1hc3RlciBpbm9kZSBmaWQgZm9yIHN0cmlwZSBkaXJlY3RvcnkgKi8KIAlzdHJ1Y3QgbHVfZmlkCQkgICBsbGlfcGZpZDsKIAogCXN0cnVjdCBsaXN0X2hlYWQJICAgICAgbGxpX2Nsb3NlX2xpc3Q7CkBAIC0xNTYsNyArMTY0LDcgQEAKIAkJLyogZm9yIGRpcmVjdG9yeSAqLwogCQlzdHJ1Y3QgewogCQkJLyogc2VyaWFsaXplIG5vcm1hbCByZWFkZGlyIGFuZCBzdGF0YWhlYWQtcmVhZGRpci4gKi8KLQkJCXN0cnVjdCBtdXRleAkJCWRfcmVhZGRpcl9tdXRleDsKKwkJCXN0cnVjdCBtdXRleAkJCWxsaV9yZWFkZGlyX211dGV4OwogCiAJCQkvKiBtZXRhZGF0YSBzdGF0YWhlYWQgKi8KIAkJCS8qIHNpbmNlIHBhcmVudC1jaGlsZCB0aHJlYWRzIGNhbiBzaGFyZSB0aGUgc2FtZSBAZmlsZQpAQCAtMTY0LDI3ICsxNzIsMzkgQEAKIAkJCSAqIGNhc2Ugb2YgcGFyZW50IGV4aXQgYmVmb3JlIGNoaWxkIC0tIGl0IGlzIG1lIHNob3VsZAogCQkJICogY2xlYW51cCB0aGUgZGlyIHJlYWRhaGVhZC4KIAkJCSAqLwotCQkJdm9pZAkJCSAgICpkX29wZW5kaXJfa2V5OwotCQkJc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICAgICAgICpkX3NhaTsKKwkJCXZvaWQJCQkgICAgICAgKmxsaV9vcGVuZGlyX2tleTsKKwkJCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAgICAgICAqbGxpX3NhaTsKIAkJCS8qIHByb3RlY3Qgc3RhdGFoZWFkIHN0dWZmLiAqLwotCQkJc3BpbmxvY2tfdAkJCWRfc2FfbG9jazsKKwkJCXNwaW5sb2NrX3QJCQlsbGlfc2FfbG9jazsKIAkJCS8qICJvcGVuZGlyX3BpZCIgaXMgdGhlIHRva2VuIHdoZW4gbG9va3VwL3JldmFsaWRhdGUKIAkJCSAqIC0tIEkgYW0gdGhlIG93bmVyIG9mIGRpciBzdGF0YWhlYWQuCiAJCQkgKi8KLQkJCXBpZF90CQkJICAgZF9vcGVuZGlyX3BpZDsKLQkJfSBkOwotCi0jZGVmaW5lIGxsaV9yZWFkZGlyX211dGV4ICAgICAgIHUuZC5kX3JlYWRkaXJfbXV0ZXgKLSNkZWZpbmUgbGxpX29wZW5kaXJfa2V5CSB1LmQuZF9vcGVuZGlyX2tleQotI2RlZmluZSBsbGlfc2FpCQkgdS5kLmRfc2FpCi0jZGVmaW5lIGxsaV9zYV9sb2NrCSAgICAgdS5kLmRfc2FfbG9jawotI2RlZmluZSBsbGlfb3BlbmRpcl9waWQJIHUuZC5kX29wZW5kaXJfcGlkCisJCQlwaWRfdAkJCQlsbGlfb3BlbmRpcl9waWQ7CisJCQkvKiBzdGF0IHdpbGwgdHJ5IHRvIGFjY2VzcyBzdGF0YWhlYWQgZW50cmllcyBvciBzdGFydAorCQkJICogc3RhdGFoZWFkIGlmIHRoaXMgZmxhZyBpcyBzZXQsIGFuZCB0aGlzIGZsYWcgd2lsbCBiZQorCQkJICogc2V0IHVwb24gZGlyIG9wZW4sIGFuZCBjbGVhcmVkIHdoZW4gZGlyIGlzIGNsb3NlZCwKKwkJCSAqIHN0YXRhaGVhZCBoaXQgcmF0aW8gaXMgdG9vIGxvdywgb3Igc3RhcnQgc3RhdGFoZWFkCisJCQkgKiB0aHJlYWQgZmFpbGVkLgorCQkJICovCisJCQl1bnNpZ25lZCBpbnQJCQlsbGlfc2FfZW5hYmxlZDoxOworCQkJLyogZ2VuZXJhdGlvbiBmb3Igc3RhdGFoZWFkICovCisJCQl1bnNpZ25lZCBpbnQJCQlsbGlfc2FfZ2VuZXJhdGlvbjsKKwkJCS8qIGRpcmVjdG9yeSBzdHJpcGUgaW5mb3JtYXRpb24gKi8KKwkJCXN0cnVjdCBsbXZfc3RyaXBlX21kCSAgICAgICAqbGxpX2xzbV9tZDsKKwkJCS8qIGRlZmF1bHQgZGlyZWN0b3J5IHN0cmlwZSBvZmZzZXQuICBUaGlzIGlzIGV4dHJhY3RlZAorCQkJICogZnJvbSB0aGUgImRtdiIgeGF0dHIgaW4gb3JkZXIgdG8gZGVjaWRlIHdoaWNoIE1EVCB0bworCQkJICogY3JlYXRlIGEgc3ViZGlyZWN0b3J5IG9uLiAgVGhlIE1EUyBpdHNlbGYgZmV0Y2hlcworCQkJICogImRtdiIgYW5kIGdldHMgdGhlIHJlc3Qgb2YgdGhlIGRlZmF1bHQgbGF5b3V0IGl0c2VsZgorCQkJICogKGNvdW50LCBoYXNoLCBldGMpLgorCQkJICovCisJCQlfX3UzMgkJCQlsbGlfZGVmX3N0cmlwZV9vZmZzZXQ7CisJCX07CiAKIAkJLyogZm9yIG5vbi1kaXJlY3RvcnkgKi8KIAkJc3RydWN0IHsKLQkJCXN0cnVjdCBtdXRleAkJCWZfc2l6ZV9tdXRleDsKLQkJCWNoYXIJCQkJKmZfc3ltbGlua19uYW1lOwotCQkJX191NjQJCQkJZl9tYXhieXRlczsKKwkJCXN0cnVjdCBtdXRleAkJCWxsaV9zaXplX211dGV4OworCQkJY2hhcgkJCSAgICAgICAqbGxpX3N5bWxpbmtfbmFtZTsKKwkJCV9fdTY0CQkJCWxsaV9tYXhieXRlczsKIAkJCS8qCiAJCQkgKiBzdHJ1Y3Qgcndfc2VtYXBob3JlIHsKIAkJCSAqICAgIHNpZ25lZCBsb25nCWNvdW50OyAgICAgLy8gYWxpZ24gZC5kX2RlZl9hY2wKQEAgLTE5MiwxNiArMjEyLDE2IEBACiAJCQkgKiAgICBzdHJ1Y3QgbGlzdF9oZWFkIHdhaXRfbGlzdDsKIAkJCSAqIH0KIAkJCSAqLwotCQkJc3RydWN0IHJ3X3NlbWFwaG9yZQkJZl90cnVuY19zZW07Ci0JCQlzdHJ1Y3QgbXV0ZXgJCQlmX3dyaXRlX211dGV4OworCQkJc3RydWN0IHJ3X3NlbWFwaG9yZQkJbGxpX3RydW5jX3NlbTsKKwkJCXN0cnVjdCByYW5nZV9sb2NrX3RyZWUJCWxsaV93cml0ZV90cmVlOwogCi0JCQlzdHJ1Y3Qgcndfc2VtYXBob3JlCQlmX2dsaW1wc2Vfc2VtOwotCQkJdW5zaWduZWQgbG9uZwkJCWZfZ2xpbXBzZV90aW1lOwotCQkJc3RydWN0IGxpc3RfaGVhZAkJCWZfYWdsX2xpc3Q7Ci0JCQlfX3U2NAkJCQlmX2FnbF9pbmRleDsKKwkJCXN0cnVjdCByd19zZW1hcGhvcmUJCWxsaV9nbGltcHNlX3NlbTsKKwkJCXVuc2lnbmVkIGxvbmcJCQlsbGlfZ2xpbXBzZV90aW1lOworCQkJc3RydWN0IGxpc3RfaGVhZAkJbGxpX2FnbF9saXN0OworCQkJX191NjQJCQkJbGxpX2FnbF9pbmRleDsKIAogCQkJLyogZm9yIHdyaXRlcGFnZSgpIG9ubHkgdG8gY29tbXVuaWNhdGUgdG8gZnN5bmMgKi8KLQkJCWludAkJCQlmX2FzeW5jX3JjOworCQkJaW50CQkJCWxsaV9hc3luY19yYzsKIAogCQkJLyoKIAkJCSAqIHdoZW5ldmVyIGEgcHJvY2VzcyB0cnkgdG8gcmVhZC93cml0ZSB0aGUgZmlsZSwgdGhlCkBAIC0yMTEsMjIgKzIzMSw5IEBACiAJCQkgKiBzbyB0aGUgcmVhZC93cml0ZSBzdGF0aXN0aWNzIGZvciBqb2JpZCB3aWxsIG5vdCBiZQogCQkJICogYWNjdXJhdGUgaWYgdGhlIGZpbGUgaXMgc2hhcmVkIGJ5IGRpZmZlcmVudCBqb2JzLgogCQkJICovCi0JCQljaGFyCQkgICAgIGZfam9iaWRbSk9CU1RBVFNfSk9CSURfU0laRV07Ci0JCX0gZjsKLQotI2RlZmluZSBsbGlfc2l6ZV9tdXRleCAgICAgICAgICB1LmYuZl9zaXplX211dGV4Ci0jZGVmaW5lIGxsaV9zeW1saW5rX25hbWUJdS5mLmZfc3ltbGlua19uYW1lCi0jZGVmaW5lIGxsaV9tYXhieXRlcwkgICAgdS5mLmZfbWF4Ynl0ZXMKLSNkZWZpbmUgbGxpX3RydW5jX3NlbQkgICB1LmYuZl90cnVuY19zZW0KLSNkZWZpbmUgbGxpX3dyaXRlX211dGV4CSB1LmYuZl93cml0ZV9tdXRleAotI2RlZmluZSBsbGlfZ2xpbXBzZV9zZW0JCXUuZi5mX2dsaW1wc2Vfc2VtCi0jZGVmaW5lIGxsaV9nbGltcHNlX3RpbWUJdS5mLmZfZ2xpbXBzZV90aW1lCi0jZGVmaW5lIGxsaV9hZ2xfbGlzdAkJdS5mLmZfYWdsX2xpc3QKLSNkZWZpbmUgbGxpX2FnbF9pbmRleAkJdS5mLmZfYWdsX2luZGV4Ci0jZGVmaW5lIGxsaV9hc3luY19yYwkJdS5mLmZfYXN5bmNfcmMKLSNkZWZpbmUgbGxpX2pvYmlkCQl1LmYuZl9qb2JpZAotCi0JfSB1OworCQkJY2hhcgkJCQlsbGlfam9iaWRbTFVTVFJFX0pPQklEX1NJWkVdOworCQl9OworCX07CiAKIAkvKiBYWFg6IEZvciBmb2xsb3dpbmcgZnJlcXVlbnQgdXNlZCBtZW1iZXJzLCBhbHRob3VnaCB0aGV5IG1heWJlIHNwZWNpYWwKIAkgKiAgICAgIHVzZWQgZm9yIG5vbi1kaXJlY3Rvcnkgb2JqZWN0LCBpdCBpcyBzb21lIHRpbWUtd2FzdGluZyB0byBjaGVjawpAQCAtNDAxLDEyICs0MDgsMTMgQEAKICNkZWZpbmUgTExfU0JJX0xBWU9VVF9MT0NLICAgIDB4MjAwMDAgLyogbGF5b3V0IGxvY2sgc3VwcG9ydCAqLwogI2RlZmluZSBMTF9TQklfVVNFUl9GSUQyUEFUSCAgMHg0MDAwMCAvKiBhbGxvdyBmaWQycGF0aCBieSB1bnByaXZpbGVnZWQgdXNlcnMgKi8KICNkZWZpbmUgTExfU0JJX1hBVFRSX0NBQ0hFICAgIDB4ODAwMDAgLyogc3VwcG9ydCBmb3IgeGF0dHIgY2FjaGUgKi8KKyNkZWZpbmUgTExfU0JJX05PUk9PVFNRVUFTSAkweDEwMDAwMCAvKiBkbyBub3QgYXBwbHkgcm9vdCBzcXVhc2ggKi8KIAogI2RlZmluZSBMTF9TQklfRkxBR1MgewlcCiAJIm5vbGNrIiwJXAogCSJjaGVja3N1bSIsCVwKIAkiZmxvY2siLAlcCi0JInhhdHRyIiwJXAorCSJ1c2VyX3hhdHRyIiwJXAogCSJhY2wiLAkJXAogCSI/Pz8iLAkJXAogCSI/Pz8iLAkJXApAQCAtNDIyLDkgKzQzMCwyNyBAQAogCSJ2ZXJib3NlIiwJXAogCSJsYXlvdXQiLAlcCiAJInVzZXJfZmlkMnBhdGgiLFwKLQkieGF0dHIiLAlcCisJInhhdHRyX2NhY2hlIiwJXAorCSJub3Jvb3RzcXVhc2giLAlcCiB9CiAKKy8qCisgKiBUaGlzIGlzIGVtYmVkZGVkIGludG8gbGxpdGUgc3VwZXItYmxvY2tzIHRvIGtlZXAgdHJhY2sgb2YgY29ubmVjdAorICogZmxhZ3MgKGNhcGFiaWxpdGllcykgc3VwcG9ydGVkIGJ5IGFsbCBpbXBvcnRzIGdpdmVuIG1vdW50IGlzCisgKiBjb25uZWN0ZWQgdG8uCisgKi8KK3N0cnVjdCBsdXN0cmVfY2xpZW50X29jZCB7CisJLyoKKwkgKiBUaGlzIGlzIGNvbmp1bmN0aW9uIG9mIGNvbm5lY3RfZmxhZ3MgYWNyb3NzIGFsbCBpbXBvcnRzCisJICogKExPVnMpIHRoaXMgbW91bnQgaXMgY29ubmVjdGVkIHRvLiBUaGlzIGZpZWxkIGlzIHVwZGF0ZWQgYnkKKwkgKiBjbF9vY2RfdXBkYXRlKCkgdW5kZXIgLT5sY29fbG9jay4KKwkgKi8KKwlfX3U2NAkJCSBsY29fZmxhZ3M7CisJc3RydWN0IG11dGV4CQkgbGNvX2xvY2s7CisJc3RydWN0IG9iZF9leHBvcnQJKmxjb19tZF9leHA7CisJc3RydWN0IG9iZF9leHBvcnQJKmxjb19kdF9leHA7Cit9OworCiBzdHJ1Y3QgbGxfc2JfaW5mbyB7CiAJLyogdGhpcyBwcm90ZWN0cyBwZ2xpc3QgYW5kIHJhX2luZm8uICBJdCBpc24ndCBzYWZlIHRvCiAJICogZ3JhYiBmcm9tIGludGVycnVwdCBjb250ZXh0cwpAQCAtNDYxLDcgKzQ4Nyw3IEBACiAJdW5zaWduZWQgaW50CSAgICAgIGxsX25hbWVsZW47CiAJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAgICpsbF9mb3A7CiAKLQl1bnNpZ25lZCBpbnQJICAgICAgbGxfbWRfYnJ3X3NpemU7IC8qIHVzZWQgYnkgcmVhZGRpciAqLworCXVuc2lnbmVkIGludAkJICBsbF9tZF9icndfcGFnZXM7IC8qIHJlYWRkaXIgcGFnZXMgcGVyIFJQQyAqLwogCiAJc3RydWN0IGx1X3NpdGUJICAgKmxsX3NpdGU7CiAJc3RydWN0IGNsX2RldmljZQkgKmxsX2NsOwpAQCAtNDg0LDExICs1MTAsMTcgQEAKIAlhdG9taWNfdAkJICBsbF9zYV93cm9uZzsgICAvKiBzdGF0YWhlYWQgdGhyZWFkIHN0b3BwZWQgZm9yCiAJCQkJCQkgICogbG93IGhpdCByYXRpbwogCQkJCQkJICAqLworCWF0b21pY190CQlsbF9zYV9ydW5uaW5nOwkvKiBydW5uaW5nIHN0YXRhaGVhZCB0aHJlYWQKKwkJCQkJCSAqIGNvdW50CisJCQkJCQkgKi8KIAlhdG9taWNfdAkJICBsbF9hZ2xfdG90YWw7ICAvKiBBR0wgdGhyZWFkIHN0YXJ0ZWQgY291bnQgKi8KIAogCWRldl90CQkJICBsbF9zZGV2X29yaWc7IC8qIHNhdmUgc19kZXYgYmVmb3JlIGFzc2lnbiBmb3IKIAkJCQkJCSAqIGNsdXN0ZXJlZCBuZnMKIAkJCQkJCSAqLworCS8qIHJvb3Qgc3F1YXNoICovCisJc3RydWN0IHJvb3Rfc3F1YXNoX2luZm8JICBsbF9zcXVhc2g7CisKIAlfX2tlcm5lbF9mc2lkX3QJCSAgbGxfZnNpZDsKIAlzdHJ1Y3Qga29iamVjdAkJIGxsX2tvYmo7IC8qIHN5c2ZzIG9iamVjdCAqLwogCXN0cnVjdCBzdXBlcl9ibG9jawkqbGxfc2I7IC8qIHN0cnVjdCBzdXBlcl9ibG9jayAoZm9yIHN5c2ZzIGNvZGUpKi8KQEAgLTY0MywyNSArNjc1LDY2IEBACiAJCSAgICAgICBzdHJ1Y3QgbGxfZmlsZV9kYXRhICpmaWxlLCBsb2ZmX3QgcG9zLAogCQkgICAgICAgc2l6ZV90IGNvdW50LCBpbnQgcncpOwogCitlbnVtIHsKKwlMUFJPQ19MTF9ESVJUWV9ISVRTLAorCUxQUk9DX0xMX0RJUlRZX01JU1NFUywKKwlMUFJPQ19MTF9SRUFEX0JZVEVTLAorCUxQUk9DX0xMX1dSSVRFX0JZVEVTLAorCUxQUk9DX0xMX0JSV19SRUFELAorCUxQUk9DX0xMX0JSV19XUklURSwKKwlMUFJPQ19MTF9PU0NfUkVBRCwKKwlMUFJPQ19MTF9PU0NfV1JJVEUsCisJTFBST0NfTExfSU9DVEwsCisJTFBST0NfTExfT1BFTiwKKwlMUFJPQ19MTF9SRUxFQVNFLAorCUxQUk9DX0xMX01BUCwKKwlMUFJPQ19MTF9MTFNFRUssCisJTFBST0NfTExfRlNZTkMsCisJTFBST0NfTExfUkVBRERJUiwKKwlMUFJPQ19MTF9TRVRBVFRSLAorCUxQUk9DX0xMX1RSVU5DLAorCUxQUk9DX0xMX0ZMT0NLLAorCUxQUk9DX0xMX0dFVEFUVFIsCisJTFBST0NfTExfQ1JFQVRFLAorCUxQUk9DX0xMX0xJTkssCisJTFBST0NfTExfVU5MSU5LLAorCUxQUk9DX0xMX1NZTUxJTkssCisJTFBST0NfTExfTUtESVIsCisJTFBST0NfTExfUk1ESVIsCisJTFBST0NfTExfTUtOT0QsCisJTFBST0NfTExfUkVOQU1FLAorCUxQUk9DX0xMX1NUQUZTLAorCUxQUk9DX0xMX0FMTE9DX0lOT0RFLAorCUxQUk9DX0xMX1NFVFhBVFRSLAorCUxQUk9DX0xMX0dFVFhBVFRSLAorCUxQUk9DX0xMX0dFVFhBVFRSX0hJVFMsCisJTFBST0NfTExfTElTVFhBVFRSLAorCUxQUk9DX0xMX1JFTU9WRVhBVFRSLAorCUxQUk9DX0xMX0lOT0RFX1BFUk0sCisJTFBST0NfTExfRklMRV9PUENPREVTCit9OworCiAvKiBsbGl0ZS9kaXIuYyAqLwotdm9pZCBsbF9yZWxlYXNlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCByZW1vdmUpOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGxfZGlyX29wZXJhdGlvbnM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbGxfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci1zdHJ1Y3QgcGFnZSAqbGxfZ2V0X2Rpcl9wYWdlKHN0cnVjdCBpbm9kZSAqZGlyLCBfX3U2NCBoYXNoLAotCQkJICAgICBzdHJ1Y3QgbGxfZGlyX2NoYWluICpjaGFpbik7Ci1pbnQgbGxfZGlyX3JlYWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpOwotCitpbnQgbGxfZGlyX3JlYWQoc3RydWN0IGlub2RlICppbm9kZSwgX191NjQgKnBwb3MsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAorCQlzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eCk7CiBpbnQgbGxfZ2V0X21kdF9pZHgoc3RydWN0IGlub2RlICppbm9kZSk7CitpbnQgbGxfZ2V0X21kdF9pZHhfYnlfZmlkKHN0cnVjdCBsbF9zYl9pbmZvICpzYmksIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCk7CitzdHJ1Y3QgcGFnZSAqbGxfZ2V0X2Rpcl9wYWdlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKKwkJCSAgICAgX191NjQgb2Zmc2V0KTsKK3ZvaWQgbGxfcmVsZWFzZV9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLCBib29sIHJlbW92ZSk7CisKIC8qIGxsaXRlL25hbWVpLmMgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBsbF9zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7CiAKLWludCBsbF9vYmplY3RzX2Rlc3Ryb3koc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0LAotCQkgICAgICAgc3RydWN0IGlub2RlICpkaXIpOwogc3RydWN0IGlub2RlICpsbF9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGlub190IGhhc2gsCiAJCSAgICAgIHN0cnVjdCBsdXN0cmVfbWQgKmxpYyk7CitpbnQgbGxfdGVzdF9pbm9kZV9ieV9maWQoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKTsKIGludCBsbF9tZF9ibG9ja2luZ19hc3Qoc3RydWN0IGxkbG1fbG9jayAqLCBzdHJ1Y3QgbGRsbV9sb2NrX2Rlc2MgKiwKIAkJICAgICAgIHZvaWQgKmRhdGEsIGludCBmbGFnKTsKIHN0cnVjdCBkZW50cnkgKmxsX3NwbGljZV9hbGlhcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZSk7Cit2b2lkIGxsX3VwZGF0ZV90aW1lcyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCiAvKiBsbGl0ZS9ydy5jICovCiBpbnQgbGxfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CkBAIC03MDQsNyArNzc3LDEwIEBACiAJCQkgIHN0cnVjdCBsdXN0cmVfaGFuZGxlICpmaCk7CiBpbnQgbGxfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGUsIHN0cnVjdCBrc3RhdCAqc3RhdCk7CiBzdHJ1Y3QgcG9zaXhfYWNsICpsbF9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKTsKLQoraW50IGxsX21pZ3JhdGUoc3RydWN0IGlub2RlICpwYXJlbnQsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgbWR0aWR4LAorCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CitpbnQgbGxfZ2V0X2ZpZF9ieV9uYW1lKHN0cnVjdCBpbm9kZSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgaW50IG5hbWVsZW4sIHN0cnVjdCBsdV9maWQgKmZpZCk7CiBpbnQgbGxfaW5vZGVfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7CiAKIGludCBsbF9sb3Zfc2V0c3RyaXBlX2VhX2luZm8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LApAQCAtNzE1LDggKzc5MSw4IEBACiAJCQkgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpOwogaW50IGxsX2Rpcl9zZXRzdHJpcGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGxvdl91c2VyX21kICpsdW1wLAogCQkgICAgIGludCBzZXRfZGVmYXVsdCk7Ci1pbnQgbGxfZGlyX2dldHN0cmlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbG92X21kc19tZCAqKmxtbXAsCi0JCSAgICAgaW50ICpsbW1fc2l6ZSwgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCk7CitpbnQgbGxfZGlyX2dldHN0cmlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICoqbG1tcCwgaW50ICpsbW1fc2l6ZSwKKwkJICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0LCB1NjQgdmFsaWQpOwogaW50IGxsX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsIGludCBkYXRhKTsKIGludCBsbF9tZXJnZV9hdHRyKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGlub2RlICppbm9kZSk7CiBpbnQgbGxfZmlkMnBhdGgoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCBfX3VzZXIgKmFyZyk7CkBAIC03NDgsOCArODI0LDggQEAKIGludCBsbF9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGUsIHN0cnVjdCBrc3RhdGZzICpzZnMpOwogaW50IGxsX3N0YXRmc19pbnRlcm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qgb2JkX3N0YXRmcyAqb3NmcywKIAkJICAgICAgIF9fdTY0IG1heF9hZ2UsIF9fdTMyIGZsYWdzKTsKLXZvaWQgbGxfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBsdXN0cmVfbWQgKm1kKTsKLXZvaWQgbGxfcmVhZF9pbm9kZTIoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKTsKK2ludCBsbF91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGx1c3RyZV9tZCAqbWQpOworaW50IGxsX3JlYWRfaW5vZGUyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSk7CiB2b2lkIGxsX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGludCBsbF9pb2NvbnRyb2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CkBAIC03NjMsMTUgKzgzOSw0NiBAQAogaW50IGxsX29iZF9zdGF0ZnMoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCBfX3VzZXIgKmFyZyk7CiBpbnQgbGxfZ2V0X21heF9tZHNpemUoc3RydWN0IGxsX3NiX2luZm8gKnNiaSwgaW50ICptYXhfbWRzaXplKTsKIGludCBsbF9nZXRfZGVmYXVsdF9tZHNpemUoc3RydWN0IGxsX3NiX2luZm8gKnNiaSwgaW50ICpkZWZhdWx0X21kc2l6ZSk7CitpbnQgbGxfc2V0X2RlZmF1bHRfbWRzaXplKHN0cnVjdCBsbF9zYl9pbmZvICpzYmksIGludCBkZWZhdWx0X21kc2l6ZSk7CiBpbnQgbGxfcHJvY2Vzc19jb25maWcoc3RydWN0IGx1c3RyZV9jZmcgKmxjZmcpOworCitlbnVtIHsKKwlMVVNUUkVfT1BDX01LRElSCT0gMCwKKwlMVVNUUkVfT1BDX1NZTUxJTksJPSAxLAorCUxVU1RSRV9PUENfTUtOT0QJPSAyLAorCUxVU1RSRV9PUENfQ1JFQVRFCT0gMywKKwlMVVNUUkVfT1BDX0FOWQkJPSA1LAorfTsKKwogc3RydWN0IG1kX29wX2RhdGEgKmxsX3ByZXBfbWRfb3BfZGF0YShzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKIAkJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmkxLCBzdHJ1Y3QgaW5vZGUgKmkyLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAotCQkJCSAgICAgIGludCBtb2RlLCBfX3UzMiBvcGMsIHZvaWQgKmRhdGEpOworCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLAorCQkJCSAgICAgIHUzMiBtb2RlLCBfX3UzMiBvcGMsIHZvaWQgKmRhdGEpOwogdm9pZCBsbF9maW5pc2hfbWRfb3BfZGF0YShzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSk7CiBpbnQgbGxfZ2V0X29iZF9uYW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGNoYXIgKmxsX2dldF9mc25hbWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKK3ZvaWQgbGxfY29tcHV0ZV9yb290c3F1YXNoX3N0YXRlKHN0cnVjdCBsbF9zYl9pbmZvICpzYmkpOwogdm9pZCBsbF9vcGVuX2NsZWFudXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpvcGVuX3JlcSk7Citzc2l6ZV90IGxsX2NvcHlfdXNlcl9tZChjb25zdCBzdHJ1Y3QgbG92X3VzZXJfbWQgX191c2VyICptZCwKKwkJCXN0cnVjdCBsb3ZfdXNlcl9tZCAqKmtidWYpOworCisvKiBDb21wdXRlIGV4cGVjdGVkIHVzZXIgbWQgc2l6ZSB3aGVuIHBhc3NpbmcgaW4gYSBtZCBmcm9tIHVzZXIgc3BhY2UgKi8KK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBsbF9sb3ZfdXNlcl9tZF9zaXplKGNvbnN0IHN0cnVjdCBsb3ZfdXNlcl9tZCAqbHVtKQoreworCXN3aXRjaCAobHVtLT5sbW1fbWFnaWMpIHsKKwljYXNlIExPVl9VU0VSX01BR0lDX1YxOgorCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBsb3ZfdXNlcl9tZF92MSk7CisJY2FzZSBMT1ZfVVNFUl9NQUdJQ19WMzoKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgbG92X3VzZXJfbWRfdjMpOworCWNhc2UgTE9WX1VTRVJfTUFHSUNfU1BFQ0lGSUM6CisJCWlmIChsdW0tPmxtbV9zdHJpcGVfY291bnQgPiBMT1ZfTUFYX1NUUklQRV9DT1VOVCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJldHVybiBsb3ZfdXNlcl9tZF9zaXplKGx1bS0+bG1tX3N0cmlwZV9jb3VudCwKKwkJCQkJTE9WX1VTRVJfTUFHSUNfU1BFQ0lGSUMpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KIAogLyogbGxpdGUvbGxpdGVfbmZzLmMgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgbHVzdHJlX2V4cG9ydF9vcGVyYXRpb25zOwpAQCAtNzc5LDYgKzg4Niw3IEBACiB2b2lkIGdldF91dWlkMmZzaWQoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwgX19rZXJuZWxfZnNpZF90ICpmc2lkKTsKIHN0cnVjdCBpbm9kZSAqc2VhcmNoX2lub2RlX2Zvcl9sdXN0cmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpOworaW50IGxsX2Rpcl9nZXRfcGFyZW50X2ZpZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGx1X2ZpZCAqcGFyZW50X2ZpZCk7CiAKIC8qIGxsaXRlL3N5bWxpbmsuYyAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGxsX2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwpAQCAtOTMzLDEyICsxMDQxLDE5IEBACiB9CiAKIC8qIGxsaXRlL3hhdHRyLmMgKi8KLWludCBsbF9zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCWNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKLXNzaXplX3QgbGxfZ2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CitleHRlcm4gY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmxsX3hhdHRyX2hhbmRsZXJzW107CisKKyNkZWZpbmUgWEFUVFJfVVNFUl9UCQkxCisjZGVmaW5lIFhBVFRSX1RSVVNURURfVAkJMgorI2RlZmluZSBYQVRUUl9TRUNVUklUWV9UCTMKKyNkZWZpbmUgWEFUVFJfQUNMX0FDQ0VTU19UCTQKKyNkZWZpbmUgWEFUVFJfQUNMX0RFRkFVTFRfVAk1CisjZGVmaW5lIFhBVFRSX0xVU1RSRV9UCQk2CisjZGVmaW5lIFhBVFRSX09USEVSX1QJCTcKKwogc3NpemVfdCBsbF9saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKTsKLWludCBsbF9yZW1vdmV4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGxsX3hhdHRyX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IHR5cGUsCisJCSAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgX191NjQgdmFsaWQpOwogCiAvKioKICAqIENvbW1vbiBJTyBhcmd1bWVudHMgZm9yIHZhcmlvdXMgVkZTIEkvTyBpbnRlcmZhY2VzLgpAQCAtOTY0LDExICsxMDc5LDEwIEBACiAKIC8qIHBlciBpbm9kZSBzdHJ1Y3QsIGZvciBkaXIgb25seSAqLwogc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvIHsKLQlzdHJ1Y3QgaW5vZGUJICAgKnNhaV9pbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5CSAgICpzYWlfZGVudHJ5OwogCWF0b21pY190CSAgICBzYWlfcmVmY291bnQ7ICAgLyogd2hlbiBhY2Nlc3MgdGhpcyBzdHJ1Y3QsIGhvbGQKIAkJCQkJICAgICAqIHJlZmNvdW50CiAJCQkJCSAgICAgKi8KLQl1bnNpZ25lZCBpbnQJICAgIHNhaV9nZW5lcmF0aW9uOyAvKiBnZW5lcmF0aW9uIGZvciBzdGF0YWhlYWQgKi8KIAl1bnNpZ25lZCBpbnQJICAgIHNhaV9tYXg7CS8qIG1heCBhaGVhZCBvZiBsb29rdXAgKi8KIAlfX3U2NAkJICAgc2FpX3NlbnQ7ICAgICAgIC8qIHN0YXQgcmVxdWVzdHMgc2VudCBjb3VudCAqLwogCV9fdTY0CQkgICBzYWlfcmVwbGllZDsgICAgLyogc3RhdCByZXF1ZXN0cyB3aGljaCByZWNlaXZlZApAQCAtOTk1LDIyICsxMTA5LDI1IEBACiAJdW5zaWduZWQgaW50CSAgICBzYWlfbHNfYWxsOjEsICAgLyogImxzIC1hbCIsIGRvIHN0YXQtYWhlYWQgZm9yCiAJCQkJCSAgICAgKiBoaWRkZW4gZW50cmllcwogCQkJCQkgICAgICovCi0JCQkJc2FpX2FnbF92YWxpZDoxOy8qIEFHTCBpcyB2YWxpZCBmb3IgdGhlIGRpciAqLworCQkJCXNhaV9hZ2xfdmFsaWQ6MSwvKiBBR0wgaXMgdmFsaWQgZm9yIHRoZSBkaXIgKi8KKwkJCQlzYWlfaW5fcmVhZHBhZ2U6MTsvKiBzdGF0YWhlYWQgaXMgaW4gcmVhZGRpcigpICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QJc2FpX3dhaXRxOyAgICAgIC8qIHN0YXQtYWhlYWQgd2FpdCBxdWV1ZSAqLwogCXN0cnVjdCBwdGxycGNfdGhyZWFkICAgIHNhaV90aHJlYWQ7ICAgICAvKiBzdGF0LWFoZWFkIHRocmVhZCAqLwogCXN0cnVjdCBwdGxycGNfdGhyZWFkICAgIHNhaV9hZ2xfdGhyZWFkOyAvKiBBR0wgdGhyZWFkICovCi0Jc3RydWN0IGxpc3RfaGVhZAlzYWlfZW50cmllczsgICAgLyogZW50cnkgbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJc2FpX2VudHJpZXNfcmVjZWl2ZWQ7IC8qIGVudHJpZXMgcmV0dXJuZWQgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXNhaV9lbnRyaWVzX3N0YXRlZDsgICAvKiBlbnRyaWVzIHN0YXRlZCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJc2FpX2VudHJpZXNfYWdsOyAvKiBBR0wgZW50cmllcyB0byBiZSBzZW50ICovCisJc3RydWN0IGxpc3RfaGVhZAlzYWlfaW50ZXJpbV9lbnRyaWVzOyAvKiBlbnRyaWVzIHdoaWNoIGdvdCBhc3luYworCQkJCQkJICAgICAgKiBzdGF0IHJlcGx5LCBidXQgbm90CisJCQkJCQkgICAgICAqIGluc3RhbnRpYXRlZAorCQkJCQkJICAgICAgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXNhaV9lbnRyaWVzOwkvKiBjb21wbGV0ZWQgZW50cmllcyAqLworCXN0cnVjdCBsaXN0X2hlYWQJc2FpX2FnbHM7CS8qIEFHTHMgdG8gYmUgc2VudCAqLwogCXN0cnVjdCBsaXN0X2hlYWQJc2FpX2NhY2hlW0xMX1NBX0NBQ0hFX1NJWkVdOwogCXNwaW5sb2NrX3QJCXNhaV9jYWNoZV9sb2NrW0xMX1NBX0NBQ0hFX1NJWkVdOwogCWF0b21pY190CQlzYWlfY2FjaGVfY291bnQ7IC8qIGVudHJ5IGNvdW50IGluIGNhY2hlICovCiB9OwogCi1pbnQgZG9fc3RhdGFoZWFkX2VudGVyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICoqZGVudHJ5LAotCQkgICAgICAgaW50IG9ubHlfdW5wbHVnKTsKLXZvaWQgbGxfc3RvcF9zdGF0YWhlYWQoc3RydWN0IGlub2RlICpkaXIsIHZvaWQgKmtleSk7CitpbnQgbGxfc3RhdGFoZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICoqZGVudHJ5LCBib29sIHVucGx1Zyk7Cit2b2lkIGxsX2F1dGhvcml6ZV9zdGF0YWhlYWQoc3RydWN0IGlub2RlICpkaXIsIHZvaWQgKmtleSk7Cit2b2lkIGxsX2RlYXV0aG9yaXplX3N0YXRhaGVhZChzdHJ1Y3QgaW5vZGUgKmRpciwgdm9pZCAqa2V5KTsKIAogYmxrY250X3QgZGlydHlfY250KHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCkBAIC0xMDQwLDczICsxMTU3LDUzIEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLWxsX3N0YXRhaGVhZF9tYXJrKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCi17Ci0Jc3RydWN0IGxsX2lub2RlX2luZm8gICAgICpsbGkgPSBsbF9pMmluZm8oZGlyKTsKLQlzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSA9IGxsaS0+bGxpX3NhaTsKLQlzdHJ1Y3QgbGxfZGVudHJ5X2RhdGEgICAgKmxkZCA9IGxsX2QyZChkZW50cnkpOwotCi0JLyogbm90IHRoZSBzYW1lIHByb2Nlc3MsIGRvbid0IG1hcmsgKi8KLQlpZiAobGxpLT5sbGlfb3BlbmRpcl9waWQgIT0gY3VycmVudF9waWQoKSkKLQkJcmV0dXJuOwotCi0JTEFTU0VSVChsZGQpOwotCWlmIChzYWkpCi0JCWxkZC0+bGxkX3NhX2dlbmVyYXRpb24gPSBzYWktPnNhaV9nZW5lcmF0aW9uOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotZF9uZWVkX3N0YXRhaGVhZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5cCkKKy8qCisgKiBkZW50cnkgbWF5IHN0YXRhaGVhZCB3aGVuIHN0YXRhaGVhZCBpcyBlbmFibGVkIGFuZCBjdXJyZW50IHByb2Nlc3MgaGFzIG9wZW5lZAorICogcGFyZW50IGRpcmVjdG9yeSwgYW5kIHRoaXMgZGVudHJ5IGhhc24ndCBhY2Nlc3NlZCBzdGF0YWhlYWQgY2FjaGUgYmVmb3JlCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbAorZGVudHJ5X21heV9zdGF0YWhlYWQoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAgKmxsaTsKIAlzdHJ1Y3QgbGxfZGVudHJ5X2RhdGEgKmxkZDsKIAogCWlmIChsbF9pMnNiaShkaXIpLT5sbF9zYV9tYXggPT0gMCkKLQkJcmV0dXJuIC1FQUdBSU47CisJCXJldHVybiBmYWxzZTsKIAogCWxsaSA9IGxsX2kyaW5mbyhkaXIpOworCisJLyoKKwkgKiBzdGF0YWhlYWQgaXMgbm90IGFsbG93ZWQgZm9yIHRoaXMgZGlyLCB0aGVyZSBtYXkgYmUgdGhyZWUgY2F1c2VzOgorCSAqIDEuIGRpciBpcyBub3Qgb3BlbmVkLgorCSAqIDIuIHN0YXRhaGVhZCBoaXQgcmF0aW8gaXMgdG9vIGxvdy4KKwkgKiAzLiBwcmV2aW91cyBzdGF0IHN0YXJ0ZWQgc3RhdGFoZWFkIHRocmVhZCBmYWlsZWQuCisJICovCisJaWYgKCFsbGktPmxsaV9zYV9lbmFibGVkKQorCQlyZXR1cm4gZmFsc2U7CisKIAkvKiBub3QgdGhlIHNhbWUgcHJvY2VzcywgZG9uJ3Qgc3RhdGFoZWFkICovCiAJaWYgKGxsaS0+bGxpX29wZW5kaXJfcGlkICE9IGN1cnJlbnRfcGlkKCkpCi0JCXJldHVybiAtRUFHQUlOOworCQlyZXR1cm4gZmFsc2U7CiAKLQkvKiBzdGF0YWhlYWQgaGFzIGJlZW4gc3RvcHBlZCAqLwotCWlmICghbGxpLT5sbGlfb3BlbmRpcl9rZXkpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JbGRkID0gbGxfZDJkKGRlbnRyeXApOwogCS8qCi0JICogV2hlbiBzdGF0cyBhIGRlbnRyeSwgdGhlIHN5c3RlbSB0cmlnZ2VyIG1vcmUgdGhhbiBvbmNlICJyZXZhbGlkYXRlIgotCSAqIG9yICJsb29rdXAiLCBmb3IgImdldGF0dHIiLCBmb3IgImdldHhhdHRyIiwgYW5kIG1heWJlIGZvciBvdGhlcnMuCi0JICogVW5kZXIgcGF0Y2hsZXNzIGNsaWVudCBtb2RlLCB0aGUgb3BlcmF0aW9uIGludGVudCBpcyBub3QgYWNjdXJhdGUsCi0JICogd2hpY2ggbWF5YmUgbWlzZ3VpZGUgdGhlIHN0YXRhaGVhZCB0aHJlYWQuIEZvciBleGFtcGxlOgotCSAqIFRoZSAicmV2YWxpZGF0ZSIgY2FsbCBmb3IgImdldGF0dHIiIGFuZCAiZ2V0eGF0dHIiIG9mIGEgZGVudHJ5IG1heWJlCi0JICogaGF2ZSB0aGUgc2FtZSBvcGVyYXRpb24gaW50ZW50IC0tICJJVF9HRVRBVFRSIi4KLQkgKiBJbiBmYWN0LCBvbmUgZGVudHJ5IHNob3VsZCBoYXMgb25seSBvbmUgY2hhbmNlIHRvIGludGVyYWN0IHdpdGggdGhlCi0JICogc3RhdGFoZWFkIHRocmVhZCwgb3RoZXJ3aXNlIHRoZSBzdGF0YWhlYWQgd2luZG93cyB3aWxsIGJlIGNvbmZ1c2VkLgorCSAqIFdoZW4gc3RhdGluZyBhIGRlbnRyeSwga2VybmVsIG1heSB0cmlnZ2VyICdyZXZhbGlkYXRlJyBvciAnbG9va3VwJworCSAqIG11bHRpcGxlIHRpbWVzLCBlZy4gZm9yICdnZXRhdHRyJywgJ2dldHhhdHRyJyBhbmQgZXRjLgorCSAqIEZvciBwYXRjaGxlc3MgY2xpZW50LCBsb29rdXAgaW50ZW50IGlzIG5vdCBhY2N1cmF0ZSwgd2hpY2ggbWF5CisJICogbWlzZ3VpZGUgc3RhdGFoZWFkLiBGb3IgZXhhbXBsZToKKwkgKiBUaGUgJ3JldmFsaWRhdGUnIGNhbGwgZm9yICdnZXRhdHRyJyBhbmQgJ2dldHhhdHRyJyBvZiBhIGRlbnRyeSB3aWxsCisJICogaGF2ZSB0aGUgc2FtZSBpbnRlbnQgLS0gSVRfR0VUQVRUUiwgd2hpbGUgb25lIGRlbnRyeSBzaG91bGQgYWNjZXNzCisJICogc3RhdGFoZWFkIGNhY2hlIG9uY2UsIG90aGVyd2lzZSBzdGF0YWhlYWQgd2luZG93cyBpcyBtZXNzZWQgdXAuCiAJICogVGhlIHNvbHV0aW9uIGlzIGFzIGZvbGxvd2luZzoKLQkgKiBBc3NpZ24gImxsZF9zYV9nZW5lcmF0aW9uIiB3aXRoICJzYWlfZ2VuZXJhdGlvbiIgd2hlbiBhIGRlbnRyeQotCSAqICJJVF9HRVRBVFRSIiBmb3IgdGhlIGZpcnN0IHRpbWUsIGFuZCB0aGUgc3Vic2VxdWVudCAiSVRfR0VUQVRUUiIKLQkgKiB3aWxsIGJ5cGFzcyBpbnRlcmFjdGluZyB3aXRoIHN0YXRhaGVhZCB0aHJlYWQgZm9yIGNoZWNraW5nOgotCSAqICJsbGRfc2FfZ2VuZXJhdGlvbiA9PSBsbGlfc2FpLT5zYWlfZ2VuZXJhdGlvbiIKKwkgKiBBc3NpZ24gJ2xsZF9zYV9nZW5lcmF0aW9uJyB3aXRoICdsbGlfc2FfZ2VuZXJhdGlvbicgd2hlbiBhIGRlbnRyeQorCSAqIElUX0dFVEFUVFIgZm9yIHRoZSBmaXJzdCB0aW1lLCBhbmQgc3Vic2VxdWVudCBJVF9HRVRBVFRSIHdpbGwKKwkgKiBieXBhc3MgaW50ZXJhY3Rpbmcgd2l0aCBzdGF0YWhlYWQgY2FjaGUgYnkgY2hlY2tpbmcKKwkgKiAnbGxkX3NhX2dlbmVyYXRpb24gPT0gbGxpLT5sbGlfc2FfZ2VuZXJhdGlvbicuCiAJICovCi0JaWYgKGxkZCAmJiBsbGktPmxsaV9zYWkgJiYKLQkgICAgbGRkLT5sbGRfc2FfZ2VuZXJhdGlvbiA9PSBsbGktPmxsaV9zYWktPnNhaV9nZW5lcmF0aW9uKQotCQlyZXR1cm4gLUVBR0FJTjsKKwlsZGQgPSBsbF9kMmQoZGVudHJ5KTsKKwlpZiAobGRkICYmIGxkZC0+bGxkX3NhX2dlbmVyYXRpb24gPT0gbGxpLT5sbGlfc2FfZ2VuZXJhdGlvbikKKwkJcmV0dXJuIGZhbHNlOwogCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1sbF9zdGF0YWhlYWRfZW50ZXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKipkZW50cnlwLCBpbnQgb25seV91bnBsdWcpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGRfbmVlZF9zdGF0YWhlYWQoZGlyLCAqZGVudHJ5cCk7Ci0JaWYgKHJldCA8PSAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIGRvX3N0YXRhaGVhZF9lbnRlcihkaXIsIGRlbnRyeXAsIG9ubHlfdW5wbHVnKTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogLyogbGxpdGUgaW9jdGwgcmVnaXN0ZXIgc3VwcG9ydCByb3V0aW5lICovCkBAIC0xMjEzLDcgKzEzMTAsNyBAQAogCQkJQ0RFQlVHKERfRExNVFJBQ0UsICJzZXR0aW5nIGxfZGF0YSB0byBpbm9kZSAiREZJRCIlcCBmb3IgcmVtb3RlIGxvY2sgJSNsbHhcbiIsCiAJCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgaW5vZGUsCiAJCQkgICAgICAgaGFuZGxlLmNvb2tpZSk7Ci0JCQltZF9zZXRfbG9ja19kYXRhKGV4cCwgJmhhbmRsZS5jb29raWUsIGlub2RlLCBOVUxMKTsKKwkJCW1kX3NldF9sb2NrX2RhdGEoZXhwLCAmaGFuZGxlLCBpbm9kZSwgTlVMTCk7CiAJCX0KIAogCQloYW5kbGUuY29va2llID0gaXQtPml0X2xvY2tfaGFuZGxlOwpAQCAtMTIyMSw4ICsxMzE4LDcgQEAKIAkJQ0RFQlVHKERfRExNVFJBQ0UsICJzZXR0aW5nIGxfZGF0YSB0byBpbm9kZSAiREZJRCIlcCBmb3IgbG9jayAlI2xseFxuIiwKIAkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIGlub2RlLCBoYW5kbGUuY29va2llKTsKIAotCQltZF9zZXRfbG9ja19kYXRhKGV4cCwgJmhhbmRsZS5jb29raWUsIGlub2RlLAotCQkJCSAmaXQtPml0X2xvY2tfYml0cyk7CisJCW1kX3NldF9sb2NrX2RhdGEoZXhwLCAmaGFuZGxlLCBpbm9kZSwgJml0LT5pdF9sb2NrX2JpdHMpOwogCQlpdC0+aXRfbG9ja19zZXQgPSAxOwogCX0KIApAQCAtMTI5NSw2ICsxMzkxLDggQEAKIGludCBsbF9wYWdlX3N5bmNfaW8oY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfaW8gKmlvLAogCQkgICAgc3RydWN0IGNsX3BhZ2UgKnBhZ2UsIGVudW0gY2xfcmVxX3R5cGUgY3J0KTsKIAoraW50IGxsX2dldHBhcmVudChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGdldHBhcmVudCBfX3VzZXIgKmFyZyk7CisKIC8qIGxjb21tb25fY2wuYyAqLwogaW50IGNsX3NldGF0dHJfb3N0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IHN0cnVjdCBpYXR0ciAqYXR0cik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2xpYi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbGliLmMKaW5kZXggNTQ2MDYzZS4uNmJiNDFiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbGliLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbGliLmMKQEAgLTQxLDcgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lvY3RsLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfaGEuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9kbG0uaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgiCkBAIC0xMTUsOSArMTE1LDE2IEBACiAJc2JpLT5sbF9zYV9tYXggPSBMTF9TQV9SUENfREVGOwogCWF0b21pY19zZXQoJnNiaS0+bGxfc2FfdG90YWwsIDApOwogCWF0b21pY19zZXQoJnNiaS0+bGxfc2Ffd3JvbmcsIDApOworCWF0b21pY19zZXQoJnNiaS0+bGxfc2FfcnVubmluZywgMCk7CiAJYXRvbWljX3NldCgmc2JpLT5sbF9hZ2xfdG90YWwsIDApOwogCXNiaS0+bGxfZmxhZ3MgfD0gTExfU0JJX0FHTF9FTkFCTEVEOwogCisJLyogcm9vdCBzcXVhc2ggKi8KKwlzYmktPmxsX3NxdWFzaC5yc2lfdWlkID0gMDsKKwlzYmktPmxsX3NxdWFzaC5yc2lfZ2lkID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmc2JpLT5sbF9zcXVhc2gucnNpX25vc3F1YXNoX25pZHMpOworCWluaXRfcndzZW0oJnNiaS0+bGxfc3F1YXNoLnJzaV9zZW0pOworCiAJc2JpLT5sbF9zYiA9IHNiOwogCiAJcmV0dXJuIHNiaTsKQEAgLTEyOCw2ICsxMzUsOCBAQAogCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9zMnNiaShzYik7CiAKIAlpZiAoc2JpLT5sbF9jYWNoZSkgeworCQlpZiAoIWxpc3RfZW1wdHkoJnNiaS0+bGxfc3F1YXNoLnJzaV9ub3NxdWFzaF9uaWRzKSkKKwkJCWNmc19mcmVlX25pZGxpc3QoJnNiaS0+bGxfc3F1YXNoLnJzaV9ub3NxdWFzaF9uaWRzKTsKIAkJY2xfY2FjaGVfZGVjcmVmKHNiaS0+bGxfY2FjaGUpOwogCQlzYmktPmxsX2NhY2hlID0gTlVMTDsKIAl9CkBAIC0xODAsNyArMTg5LDkgQEAKIAkJCQkgIE9CRF9DT05ORUNUX1BJTkdMRVNTIHwKIAkJCQkgIE9CRF9DT05ORUNUX01BWF9FQVNJWkUgfAogCQkJCSAgT0JEX0NPTk5FQ1RfRkxPQ0tfREVBRCB8Ci0JCQkJICBPQkRfQ09OTkVDVF9ESVNQX1NUUklQRTsKKwkJCQkgIE9CRF9DT05ORUNUX0RJU1BfU1RSSVBFIHwgT0JEX0NPTk5FQ1RfTEZTQ0sgfAorCQkJCSAgT0JEX0NPTk5FQ1RfT1BFTl9CWV9GSUQgfAorCQkJCSAgT0JEX0NPTk5FQ1RfRElSX1NUUklQRTsKIAogCWlmIChzYmktPmxsX2ZsYWdzICYgTExfU0JJX1NPTV9QUkVWSUVXKQogCQlkYXRhLT5vY2RfY29ubmVjdF9mbGFncyB8PSBPQkRfQ09OTkVDVF9TT007CkBAIC0zMTAsOSArMzIxLDkgQEAKIAkJc2JpLT5sbF9mbGFncyB8PSBMTF9TQklfNjRCSVRfSEFTSDsKIAogCWlmIChkYXRhLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX0JSV19TSVpFKQotCQlzYmktPmxsX21kX2Jyd19zaXplID0gZGF0YS0+b2NkX2Jyd19zaXplOworCQlzYmktPmxsX21kX2Jyd19wYWdlcyA9IGRhdGEtPm9jZF9icndfc2l6ZSA+PiBQQUdFX1NISUZUOwogCWVsc2UKLQkJc2JpLT5sbF9tZF9icndfc2l6ZSA9IFBBR0VfU0laRTsKKwkJc2JpLT5sbF9tZF9icndfcGFnZXMgPSAxOwogCiAJaWYgKGRhdGEtPm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfTEFZT1VUTE9DSykKIAkJc2JpLT5sbF9mbGFncyB8PSBMTF9TQklfTEFZT1VUX0xPQ0s7CkBAIC00MTgsNiArNDI5LDcgQEAKIAlDREVCVUcoRF9TVVBFUiwgInJvb3RmaWQgIkRGSUQiXG4iLCBQRklEKCZzYmktPmxsX3Jvb3RfZmlkKSk7CiAKIAlzYi0+c19vcCA9ICZsdXN0cmVfc3VwZXJfb3BlcmF0aW9uczsKKwlzYi0+c194YXR0ciA9IGxsX3hhdHRyX2hhbmRsZXJzOwogI2lmIFRIUkVBRF9TSVpFID49IDgxOTIgLypiPTE3NjMwKi8KIAlzYi0+c19leHBvcnRfb3AgPSAmbHVzdHJlX2V4cG9ydF9vcGVyYXRpb25zOwogI2VuZGlmCkBAIC00NjIsNyArNDc0LDcgQEAKIAltZF9mcmVlX2x1c3RyZV9tZChzYmktPmxsX21kX2V4cCwgJmxtZCk7CiAJcHRscnBjX3JlcV9maW5pc2hlZChyZXF1ZXN0KTsKIAotCWlmICghKHJvb3QpKSB7CisJaWYgKElTX0VSUihyb290KSkgewogCQlpZiAobG1kLmxzbSkKIAkJCW9iZF9mcmVlX21lbW1kKHNiaS0+bGxfZHRfZXhwLCAmbG1kLmxzbSk7CiAjaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTApAQCAtNDg2LDExICs0OTgsMjEgQEAKIAllcnIgPSBvYmRfc2V0X2luZm9fYXN5bmMoTlVMTCwgc2JpLT5sbF9kdF9leHAsIHNpemVvZihLRVlfQ0hFQ0tTVU0pLAogCQkJCSBLRVlfQ0hFQ0tTVU0sIHNpemVvZihjaGVja3N1bSksICZjaGVja3N1bSwKIAkJCQkgTlVMTCk7CisJaWYgKGVycikgeworCQlDRVJST1IoIiVzOiBTZXQgY2hlY2tzdW0gZmFpbGVkOiByYyA9ICVkXG4iLAorCQkgICAgICAgc2JpLT5sbF9kdF9leHAtPmV4cF9vYmQtPm9iZF9uYW1lLCBlcnIpOworCQlnb3RvIG91dF9yb290OworCX0KIAljbF9zYl9pbml0KHNiKTsKIAogCWVyciA9IG9iZF9zZXRfaW5mb19hc3luYyhOVUxMLCBzYmktPmxsX2R0X2V4cCwgc2l6ZW9mKEtFWV9DQUNIRV9TRVQpLAogCQkJCSBLRVlfQ0FDSEVfU0VULCBzaXplb2YoKnNiaS0+bGxfY2FjaGUpLAogCQkJCSBzYmktPmxsX2NhY2hlLCBOVUxMKTsKKwlpZiAoZXJyKSB7CisJCUNFUlJPUigiJXM6IFNldCBjYWNoZV9zZXQgZmFpbGVkOiByYyA9ICVkXG4iLAorCQkgICAgICAgc2JpLT5sbF9kdF9leHAtPmV4cF9vYmQtPm9iZF9uYW1lLCBlcnIpOworCQlnb3RvIG91dF9yb290OworCX0KIAogCXNiLT5zX3Jvb3QgPSBkX21ha2Vfcm9vdChyb290KTsKIAlpZiAoIXNiLT5zX3Jvb3QpIHsKQEAgLTU2MCw2ICs1ODIsMTcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKKy8qKgorICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZGVmYXVsdF9lYXNpemUgcGFyYW1ldGVyLgorICoKKyAqIFxzZWUgY2xpZW50X29iZDo6Y2xfZGVmYXVsdF9tZHNfZWFzaXplCisgKgorICogXHBhcmFtW2luXSAgc2JpCXN1cGVyYmxvY2sgaW5mbyBmb3IgdGhpcyBmaWxlc3lzdGVtCisgKiBccGFyYW1bb3V0XSBsbW1zaXplCXBvaW50ZXIgdG8gc3RvcmFnZSBsb2NhdGlvbiBmb3IgdmFsdWUKKyAqCisgKiBccmV0dmFsIDAJCW9uIHN1Y2Nlc3MKKyAqIFxyZXR2YWwgbmVnYXRpdmUJbmVnYXRlZCBlcnJubyBvbiBmYWlsdXJlCisgKi8KIGludCBsbF9nZXRfZGVmYXVsdF9tZHNpemUoc3RydWN0IGxsX3NiX2luZm8gKnNiaSwgaW50ICpsbW1zaXplKQogewogCWludCBzaXplLCByYzsKQEAgLTU3Myw2ICs2MDYsMjkgQEAKIAlyZXR1cm4gcmM7CiB9CiAKKy8qKgorICogU2V0IHRoZSBkZWZhdWx0X2Vhc2l6ZSBwYXJhbWV0ZXIgdG8gdGhlIGdpdmVuIHZhbHVlLgorICoKKyAqIFxzZWUgY2xpZW50X29iZDo6Y2xfZGVmYXVsdF9tZHNfZWFzaXplCisgKgorICogXHBhcmFtW2luXSBzYmkJc3VwZXJibG9jayBpbmZvIGZvciB0aGlzIGZpbGVzeXN0ZW0KKyAqIFxwYXJhbVtpbl0gbG1tc2l6ZQl0aGUgc2l6ZSB0byBzZXQKKyAqCisgKiBccmV0dmFsIDAJCW9uIHN1Y2Nlc3MKKyAqIFxyZXR2YWwgbmVnYXRpdmUJbmVnYXRlZCBlcnJubyBvbiBmYWlsdXJlCisgKi8KK2ludCBsbF9zZXRfZGVmYXVsdF9tZHNpemUoc3RydWN0IGxsX3NiX2luZm8gKnNiaSwgaW50IGxtbXNpemUpCit7CisJaWYgKGxtbXNpemUgPCBzaXplb2Yoc3RydWN0IGxvdl9tZHNfbWQpIHx8CisJICAgIGxtbXNpemUgPiBPQkRfTUFYX0RFRkFVTFRfRUFfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gb2JkX3NldF9pbmZvX2FzeW5jKE5VTEwsIHNiaS0+bGxfbWRfZXhwLAorCQkJCSAgc2l6ZW9mKEtFWV9ERUZBVUxUX0VBU0laRSksCisJCQkJICBLRVlfREVGQVVMVF9FQVNJWkUsCisJCQkJICBzaXplb2YoaW50KSwgJmxtbXNpemUsIE5VTEwpOworfQorCiBzdGF0aWMgdm9pZCBjbGllbnRfY29tbW9uX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9zMnNiaShzYik7CkBAIC02MDgsNiArNjY0LDEyIEBACiAJaWYgKHNiaSkgewogCQlzYi0+c19kZXYgPSBzYmktPmxsX3NkZXZfb3JpZzsKIAkJc2JpLT5sbF91bW91bnRpbmcgPSAxOworCisJCS8qIHdhaXQgcnVubmluZyBzdGF0YWhlYWQgdGhyZWFkcyB0byBxdWl0ICovCisJCXdoaWxlIChhdG9taWNfcmVhZCgmc2JpLT5sbF9zYV9ydW5uaW5nKSA+IDApIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcyhNU0VDX1BFUl9TRUMgPj4gMykpOworCQl9CiAJfQogfQogCkBAIC02NDcsNyArNzA5LDggQEAKIAkJCSpmbGFncyB8PSB0bXA7CiAJCQlnb3RvIG5leHQ7CiAJCX0KLQkJdG1wID0gbGxfc2V0X29wdCgibm9mbG9jayIsIHMxLCBMTF9TQklfRkxPQ0t8TExfU0JJX0xPQ0FMRkxPQ0spOworCQl0bXAgPSBsbF9zZXRfb3B0KCJub2Zsb2NrIiwgczEsCisJCQkJIExMX1NCSV9GTE9DSyB8IExMX1NCSV9MT0NBTEZMT0NLKTsKIAkJaWYgKHRtcCkgewogCQkJKmZsYWdzICY9IH50bXA7CiAJCQlnb3RvIG5leHQ7CkBAIC03NzIsMTEgKzgzNSwxMyBAQAogCQlsbGktPmxsaV9zYWkgPSBOVUxMOwogCQlzcGluX2xvY2tfaW5pdCgmbGxpLT5sbGlfc2FfbG9jayk7CiAJCWxsaS0+bGxpX29wZW5kaXJfcGlkID0gMDsKKwkJbGxpLT5sbGlfc2FfZW5hYmxlZCA9IDA7CisJCWxsaS0+bGxpX2RlZl9zdHJpcGVfb2Zmc2V0ID0gLTE7CiAJfSBlbHNlIHsKIAkJbXV0ZXhfaW5pdCgmbGxpLT5sbGlfc2l6ZV9tdXRleCk7CiAJCWxsaS0+bGxpX3N5bWxpbmtfbmFtZSA9IE5VTEw7CiAJCWluaXRfcndzZW0oJmxsaS0+bGxpX3RydW5jX3NlbSk7Ci0JCW11dGV4X2luaXQoJmxsaS0+bGxpX3dyaXRlX211dGV4KTsKKwkJcmFuZ2VfbG9ja190cmVlX2luaXQoJmxsaS0+bGxpX3dyaXRlX3RyZWUpOwogCQlpbml0X3J3c2VtKCZsbGktPmxsaV9nbGltcHNlX3NlbSk7CiAJCWxsaS0+bGxpX2dsaW1wc2VfdGltZSA9IDA7CiAJCUlOSVRfTElTVF9IRUFEKCZsbGktPmxsaV9hZ2xfbGlzdCk7CkBAIC04OTYsNyArOTYxLDggQEAKIAlzdHJ1Y3QgbHVzdHJlX3NiX2luZm8gKmxzaSA9IHMybHNpKHNiKTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfczJzYmkoc2IpOwogCWNoYXIgKnByb2ZpbGVubSA9IGdldF9wcm9maWxlX25hbWUoc2IpOwotCWludCBjY2NfY291bnQsIG5leHQsIGZvcmNlID0gMSwgcmMgPSAwOworCWludCBuZXh0LCBmb3JjZSA9IDEsIHJjID0gMDsKKwlsb25nIGNjY19jb3VudDsKIAogCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOiBzYiAlcCAtICVzXG4iLCBzYiwgcHJvZmlsZW5tKTsKIApAQCAtOTE3LDEzICs5ODMsMTMgQEAKIAkJc3RydWN0IGxfd2FpdF9pbmZvIGx3aSA9IExXSV9JTlRSKExXSV9PTl9TSUdOQUxfTk9PUCwgTlVMTCk7CiAKIAkJcmMgPSBsX3dhaXRfZXZlbnQoc2JpLT5sbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX3dhaXRxLAotCQkJCSAgIWF0b21pY19yZWFkKCZzYmktPmxsX2NhY2hlLT5jY2NfdW5zdGFibGVfbnIpLAorCQkJCSAgIWF0b21pY19sb25nX3JlYWQoJnNiaS0+bGxfY2FjaGUtPmNjY191bnN0YWJsZV9uciksCiAJCQkJICAmbHdpKTsKIAl9CiAKLQljY2NfY291bnQgPSBhdG9taWNfcmVhZCgmc2JpLT5sbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX25yKTsKKwljY2NfY291bnQgPSBhdG9taWNfbG9uZ19yZWFkKCZzYmktPmxsX2NhY2hlLT5jY2NfdW5zdGFibGVfbnIpOwogCWlmICghZm9yY2UgJiYgcmMgIT0gLUVJTlRSKQotCQlMQVNTRVJURighY2NjX2NvdW50LCAiY291bnQ6ICVpXG4iLCBjY2NfY291bnQpOworCQlMQVNTRVJURighY2NjX2NvdW50LCAiY291bnQ6ICVsaVxuIiwgY2NjX2NvdW50KTsKIAogCS8qIFdlIG5lZWQgdG8gc2V0IGZvcmNlIGJlZm9yZSB0aGUgbG92X2Rpc2Nvbm5lY3QgaW4KIAkgKiBsdXN0cmVfY29tbW9uX3B1dF9zdXBlciwgc2luY2UgbF9kIGNsZWFucyB1cCBvc2MncyBhcyB3ZWxsLgpAQCAtOTkxLDYgKzEwNTcsMjA2IEBACiAJcmV0dXJuIGlub2RlOwogfQogCitzdGF0aWMgdm9pZCBsbF9kaXJfY2xlYXJfbHNtX21kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CisKKwlMQVNTRVJUKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpOworCisJaWYgKGxsaS0+bGxpX2xzbV9tZCkgeworCQlsbXZfZnJlZV9tZW1tZChsbGktPmxsaV9sc21fbWQpOworCQlsbGktPmxsaV9sc21fbWQgPSBOVUxMOworCX0KK30KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqbGxfaWdldF9hbm9uX2RpcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCwKKwkJCQkgICAgICBzdHJ1Y3QgbHVzdHJlX21kICptZCkKK3sKKwlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfczJzYmkoc2IpOworCXN0cnVjdCBtZHRfYm9keSAqYm9keSA9IG1kLT5ib2R5OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW5vX3QgaW5vOworCisJaW5vID0gY2xfZmlkX2J1aWxkX2lubyhmaWQsIHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfMzJCSVRfQVBJKTsKKwlpbm9kZSA9IGlnZXRfbG9ja2VkKHNiLCBpbm8pOworCWlmICghaW5vZGUpIHsKKwkJQ0VSUk9SKCIlczogZmFpbGVkIGdldCBzaW1wbGUgaW5vZGUgIkRGSUQiOiByYyA9IC1FTk9FTlRcbiIsCisJCSAgICAgICBsbF9nZXRfZnNuYW1lKHNiLCBOVUxMLCAwKSwgUEZJRChmaWQpKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisJfQorCisJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CisJCXN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20gPSBtZC0+bG12OworCisJCWlub2RlLT5pX21vZGUgPSAoaW5vZGUtPmlfbW9kZSAmIH5TX0lGTVQpIHwKKwkJCQkoYm9keS0+bWJvX21vZGUgJiBTX0lGTVQpOworCQlMQVNTRVJURihTX0lTRElSKGlub2RlLT5pX21vZGUpLCAiTm90IHNsYXZlIGlub2RlICJERklEIlxuIiwKKwkJCSBQRklEKGZpZCkpOworCisJCUxUSU1FX1MoaW5vZGUtPmlfbXRpbWUpID0gMDsKKwkJTFRJTUVfUyhpbm9kZS0+aV9hdGltZSkgPSAwOworCQlMVElNRV9TKGlub2RlLT5pX2N0aW1lKSA9IDA7CisJCWlub2RlLT5pX3JkZXYgPSAwOworCisJCWlub2RlLT5pX29wID0gJmxsX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmbGxfZGlyX29wZXJhdGlvbnM7CisJCWxsaS0+bGxpX2ZpZCA9ICpmaWQ7CisJCWxsX2xsaV9pbml0KGxsaSk7CisKKwkJTEFTU0VSVChsc20pOworCQkvKiBtYXN0ZXIgb2JqZWN0IEZJRCAqLworCQlsbGktPmxsaV9wZmlkID0gYm9keS0+bWJvX2ZpZDE7CisJCUNERUJVRyhEX0lOT0RFLCAibGxpICVwIHNsYXZlICJERklEIiBtYXN0ZXIgIkRGSUQiXG4iLAorCQkgICAgICAgbGxpLCBQRklEKGZpZCksIFBGSUQoJmxsaS0+bGxpX3BmaWQpKTsKKwkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisJfQorCisJcmV0dXJuIGlub2RlOworfQorCitzdGF0aWMgaW50IGxsX2luaXRfbHNtX21kKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBsdXN0cmVfbWQgKm1kKQoreworCXN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20gPSBtZC0+bG12OworCXN0cnVjdCBsdV9maWQgKmZpZDsKKwlpbnQgaTsKKworCUxBU1NFUlQobHNtKTsKKwkvKgorCSAqIFhYWCBzaWdoLCB0aGlzIGxzbV9yb290IGluaXRpYWxpemF0aW9uIHNob3VsZCBiZSBpbgorCSAqIExNViBsYXllciwgYnV0IGl0IG5lZWRzIGxsX2lnZXQgcmlnaHQgbm93LCBzbyB3ZQorCSAqIHB1dCB0aGlzIGhlcmUgcmlnaHQgbm93LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBsc20tPmxzbV9tZF9zdHJpcGVfY291bnQ7IGkrKykgeworCQlmaWQgPSAmbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX2ZpZDsKKwkJTEFTU0VSVCghbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX3Jvb3QpOworCQkvKiBVbmZvcnR1bmF0ZWx5IGxsX2lnZXQgd2lsbCBjYWxsIGxsX3VwZGF0ZV9pbm9kZSwKKwkJICogd2hlcmUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHNsYXZlIGlub2RlIGlzIHNsaWdodGx5CisJCSAqIGRpZmZlcmVudCwgc28gaXQgcmVzZXQgbHNtX21kIHRvIE5VTEwgdG8gYXZvaWQKKwkJICogaW5pdGlhbGl6aW5nIGxzbSBmb3Igc2xhdmUgaW5vZGUuCisJCSAqLworCQkvKiBGb3IgbWlncmF0aW5nIGlub2RlLCBtYXN0ZXIgc3RyaXBlIGFuZCBtYXN0ZXIgb2JqZWN0IHdpbGwKKwkJICogYmUgc2FtZSwgc28gd2Ugb25seSBuZWVkIGFzc2lnbiB0aGlzIGlub2RlCisJCSAqLworCQlpZiAobHNtLT5sc21fbWRfaGFzaF90eXBlICYgTE1WX0hBU0hfRkxBR19NSUdSQVRJT04gJiYgIWkpCisJCQlsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fcm9vdCA9IGlub2RlOworCQllbHNlCisJCQlsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fcm9vdCA9CisJCQkJbGxfaWdldF9hbm9uX2Rpcihpbm9kZS0+aV9zYiwgZmlkLCBtZCk7CisJCWlmIChJU19FUlIobHNtLT5sc21fbWRfb2luZm9baV0ubG1vX3Jvb3QpKSB7CisJCQlpbnQgcmMgPSBQVFJfRVJSKGxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19yb290KTsKKworCQkJbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX3Jvb3QgPSBOVUxMOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxsaV9sc21fbWRfZXEoY29uc3Qgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbV9tZDEsCisJCQkJY29uc3Qgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbV9tZDIpCit7CisJcmV0dXJuIGxzbV9tZDEtPmxzbV9tZF9tYWdpYyA9PSBsc21fbWQyLT5sc21fbWRfbWFnaWMgJiYKKwkgICAgICAgbHNtX21kMS0+bHNtX21kX3N0cmlwZV9jb3VudCA9PSBsc21fbWQyLT5sc21fbWRfc3RyaXBlX2NvdW50ICYmCisJICAgICAgIGxzbV9tZDEtPmxzbV9tZF9tYXN0ZXJfbWR0X2luZGV4ID09CisJCQlsc21fbWQyLT5sc21fbWRfbWFzdGVyX21kdF9pbmRleCAmJgorCSAgICAgICBsc21fbWQxLT5sc21fbWRfaGFzaF90eXBlID09IGxzbV9tZDItPmxzbV9tZF9oYXNoX3R5cGUgJiYKKwkgICAgICAgbHNtX21kMS0+bHNtX21kX2xheW91dF92ZXJzaW9uID09CisJCQlsc21fbWQyLT5sc21fbWRfbGF5b3V0X3ZlcnNpb24gJiYKKwkgICAgICAgIXN0cmNtcChsc21fbWQxLT5sc21fbWRfcG9vbF9uYW1lLAorCQkgICAgICAgbHNtX21kMi0+bHNtX21kX3Bvb2xfbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgbGxfdXBkYXRlX2xzbV9tZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbHVzdHJlX21kICptZCkKK3sKKwlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKKwlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtID0gbWQtPmxtdjsKKwlpbnQgcmM7CisKKwlMQVNTRVJUKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpOworCUNERUJVRyhEX0lOT0RFLCAidXBkYXRlIGxzbSAlcCBvZiAiREZJRCJcbiIsIGxsaS0+bGxpX2xzbV9tZCwKKwkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSk7CisKKwkvKiBubyBzdHJpcGVkIGluZm9ybWF0aW9uIGZyb20gcmVxdWVzdC4gKi8KKwlpZiAoIWxzbSkgeworCQlpZiAoIWxsaS0+bGxpX2xzbV9tZCkgeworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAobGxpLT5sbGlfbHNtX21kLT5sc21fbWRfaGFzaF90eXBlICYKKwkJCSAgIExNVl9IQVNIX0ZMQUdfTUlHUkFUSU9OKSB7CisJCQkvKgorCQkJICogbWlncmF0aW9uIGlzIGRvbmUsIHRoZSB0ZW1wb3JheSBNSUdSQVRFIGxheW91dCBoYXMKKwkJCSAqIGJlZW4gcmVtb3ZlZAorCQkJICovCisJCQlDREVCVUcoRF9JTk9ERSwgREZJRCIgZmluaXNoIG1pZ3JhdGlvbi5cbiIsCisJCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSk7CisJCQlsbXZfZnJlZV9tZW1tZChsbGktPmxsaV9sc21fbWQpOworCQkJbGxpLT5sbGlfbHNtX21kID0gTlVMTDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoZSBsdXN0cmVfbWQgZnJvbSByZXEgZG9lcyBub3QgaW5jbHVkZSBzdHJpcGVFQSwKKwkJCSAqIHNlZSBsbF9tZF9zZXRhdHRyCisJCQkgKi8KKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogc2V0IHRoZSBkaXJlY3RvcnkgbGF5b3V0ICovCisJaWYgKCFsbGktPmxsaV9sc21fbWQpIHsKKwkJcmMgPSBsbF9pbml0X2xzbV9tZChpbm9kZSwgbWQpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJbGxpLT5sbGlfbHNtX21kID0gbHNtOworCQkvKgorCQkgKiBzZXQgbHNtX21kIHRvIE5VTEwsIHNvIHRoZSBmb2xsb3dpbmcgZnJlZSBsdXN0cmVfbWQKKwkJICogd2lsbCBub3QgZnJlZSB0aGlzIGxzbQorCQkgKi8KKwkJbWQtPmxtdiA9IE5VTEw7CisJCUNERUJVRyhEX0lOT0RFLCAiU2V0IGxzbSAlcCBtYWdpYyAleCB0byAiREZJRCJcbiIsIGxzbSwKKwkJICAgICAgIGxzbS0+bHNtX21kX21hZ2ljLCBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ29tcGFyZSB0aGUgb2xkIGFuZCBuZXcgc3RyaXBlIGluZm9ybWF0aW9uICovCisJaWYgKCFsc21fbWRfZXEobGxpLT5sbGlfbHNtX21kLCBsc20pKSB7CisJCXN0cnVjdCBsbXZfc3RyaXBlX21kICpvbGRfbHNtID0gbGxpLT5sbGlfbHNtX21kOworCQlpbnQgaWR4OworCisJCUNFUlJPUigiJXM6IGlub2RlICJERklEIiglcCkncyBsbXYgbGF5b3V0IG1pc21hdGNoICglcCkvKCVwKSBtYWdpYzoweCV4LzB4JXggc3RyaXBlIGNvdW50OiAlZC8lZCBtYXN0ZXJfbWR0OiAlZC8lZCBoYXNoX3R5cGU6MHgleC8weCV4IGxheW91dDogMHgleC8weCV4IHBvb2w6JXMvJXNcbiIsCisJCSAgICAgICBsbF9nZXRfZnNuYW1lKGlub2RlLT5pX3NiLCBOVUxMLCAwKSwgUEZJRCgmbGxpLT5sbGlfZmlkKSwKKwkJICAgICAgIGlub2RlLCBsc20sIG9sZF9sc20sCisJCSAgICAgICBsc20tPmxzbV9tZF9tYWdpYywgb2xkX2xzbS0+bHNtX21kX21hZ2ljLAorCQkgICAgICAgbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50LAorCQkgICAgICAgb2xkX2xzbS0+bHNtX21kX3N0cmlwZV9jb3VudCwKKwkJICAgICAgIGxzbS0+bHNtX21kX21hc3Rlcl9tZHRfaW5kZXgsCisJCSAgICAgICBvbGRfbHNtLT5sc21fbWRfbWFzdGVyX21kdF9pbmRleCwKKwkJICAgICAgIGxzbS0+bHNtX21kX2hhc2hfdHlwZSwgb2xkX2xzbS0+bHNtX21kX2hhc2hfdHlwZSwKKwkJICAgICAgIGxzbS0+bHNtX21kX2xheW91dF92ZXJzaW9uLAorCQkgICAgICAgb2xkX2xzbS0+bHNtX21kX2xheW91dF92ZXJzaW9uLAorCQkgICAgICAgbHNtLT5sc21fbWRfcG9vbF9uYW1lLAorCQkgICAgICAgb2xkX2xzbS0+bHNtX21kX3Bvb2xfbmFtZSk7CisKKwkJZm9yIChpZHggPSAwOyBpZHggPCBvbGRfbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50OyBpZHgrKykgeworCQkJQ0VSUk9SKCIlczogc3ViIEZJRHMgaW4gb2xkIGxzbSBpZHggJWQsIG9sZDogIkRGSUQiXG4iLAorCQkJICAgICAgIGxsX2dldF9mc25hbWUoaW5vZGUtPmlfc2IsIE5VTEwsIDApLCBpZHgsCisJCQkgICAgICAgUEZJRCgmb2xkX2xzbS0+bHNtX21kX29pbmZvW2lkeF0ubG1vX2ZpZCkpOworCQl9CisKKwkJZm9yIChpZHggPSAwOyBpZHggPCBsc20tPmxzbV9tZF9zdHJpcGVfY291bnQ7IGlkeCsrKSB7CisJCQlDRVJST1IoIiVzOiBzdWIgRklEcyBpbiBuZXcgbHNtIGlkeCAlZCwgbmV3OiAiREZJRCJcbiIsCisJCQkgICAgICAgbGxfZ2V0X2ZzbmFtZShpbm9kZS0+aV9zYiwgTlVMTCwgMCksIGlkeCwKKwkJCSAgICAgICBQRklEKCZsc20tPmxzbV9tZF9vaW5mb1tpZHhdLmxtb19maWQpKTsKKwkJfQorCisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCiB2b2lkIGxsX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CkBAIC0xMDMxLDE0ICsxMjk3LDE1IEBACiAKICNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCiAJaWYgKGxsaS0+bGxpX3Bvc2l4X2FjbCkgewotCQlMQVNTRVJUKGF0b21pY19yZWFkKCZsbGktPmxsaV9wb3NpeF9hY2wtPmFfcmVmY291bnQpID09IDEpOwogCQlwb3NpeF9hY2xfcmVsZWFzZShsbGktPmxsaV9wb3NpeF9hY2wpOwogCQlsbGktPmxsaV9wb3NpeF9hY2wgPSBOVUxMOwogCX0KICNlbmRpZgogCWxsaS0+bGxpX2lub2RlX21hZ2ljID0gTExJX0lOT0RFX0RFQUQ7CiAKLQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCWxsX2Rpcl9jbGVhcl9sc21fbWQoaW5vZGUpOworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmICFpc19iYWRfaW5vZGUoaW5vZGUpKQogCQlMQVNTRVJUKGxpc3RfZW1wdHkoJmxsaS0+bGxpX2FnbF9saXN0KSk7CiAKIAkvKgpAQCAtMTEwMywxMCArMTM3MCwxMCBAQAogCW9wX2RhdGEtPm9wX2F0dHIuaWFfdmFsaWQgPSBpYV92YWxpZDsKIAogCS8qIEV4dHJhY3QgZXBvY2ggZGF0YSBpZiBvYnRhaW5lZC4gKi8KLQlvcF9kYXRhLT5vcF9oYW5kbGUgPSBtZC5ib2R5LT5oYW5kbGU7Ci0Jb3BfZGF0YS0+b3BfaW9lcG9jaCA9IG1kLmJvZHktPmlvZXBvY2g7CisJb3BfZGF0YS0+b3BfaGFuZGxlID0gbWQuYm9keS0+bWJvX2hhbmRsZTsKKwlvcF9kYXRhLT5vcF9pb2Vwb2NoID0gbWQuYm9keS0+bWJvX2lvZXBvY2g7CiAKLQlsbF91cGRhdGVfaW5vZGUoaW5vZGUsICZtZCk7CisJcmMgPSBsbF91cGRhdGVfaW5vZGUoaW5vZGUsICZtZCk7CiAJcHRscnBjX3JlcV9maW5pc2hlZChyZXF1ZXN0KTsKIAogCXJldHVybiByYzsKQEAgLTExMzgsOCArMTQwNSw4IEBACiAJCXJjID0gbGxfc29tX3VwZGF0ZShpbm9kZSwgb3BfZGF0YSk7CiAJZWxzZSBpZiAocmMpIHsKIAkJQ0VSUk9SKCIlczogaW5vZGUgIkRGSUQiIG1kYyB0cnVuY2F0ZSBmYWlsZWQ6IHJjID0gJWRcbiIsCi0JCSAgICAgIGxsX2kyc2JpKGlub2RlKS0+bGxfbWRfZXhwLT5leHBfb2JkLT5vYmRfbmFtZSwKLQkJICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgcmMpOworCQkgICAgICAgbGxfaTJzYmkoaW5vZGUpLT5sbF9tZF9leHAtPmV4cF9vYmQtPm9iZF9uYW1lLAorCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgcmMpOwogCX0KIAlyZXR1cm4gcmM7CiB9CkBAIC0xMzMxLDE0ICsxNTk4LDE0IEBACiB7CiAJaW50IG1vZGUgPSBkX2lub2RlKGRlKS0+aV9tb2RlOwogCi0JaWYgKChhdHRyLT5pYV92YWxpZCAmIChBVFRSX0NUSU1FfEFUVFJfU0laRXxBVFRSX01PREUpKSA9PQotCQkJICAgICAgKEFUVFJfQ1RJTUV8QVRUUl9TSVpFfEFUVFJfTU9ERSkpCisJaWYgKChhdHRyLT5pYV92YWxpZCAmIChBVFRSX0NUSU1FIHwgQVRUUl9TSVpFIHwgQVRUUl9NT0RFKSkgPT0KKwkJCSAgICAgIChBVFRSX0NUSU1FIHwgQVRUUl9TSVpFIHwgQVRUUl9NT0RFKSkKIAkJYXR0ci0+aWFfdmFsaWQgfD0gTURTX09QRU5fT1dORVJPVkVSUklERTsKIAotCWlmICgoKGF0dHItPmlhX3ZhbGlkICYgKEFUVFJfTU9ERXxBVFRSX0ZPUkNFfEFUVFJfU0laRSkpID09Ci0JCQkgICAgICAgKEFUVFJfU0laRXxBVFRSX01PREUpKSAmJgorCWlmICgoKGF0dHItPmlhX3ZhbGlkICYgKEFUVFJfTU9ERSB8IEFUVFJfRk9SQ0UgfCBBVFRSX1NJWkUpKSA9PQorCQkJICAgICAgIChBVFRSX1NJWkUgfCBBVFRSX01PREUpKSAmJgogCSAgICAoKChtb2RlICYgU19JU1VJRCkgJiYgIShhdHRyLT5pYV9tb2RlICYgU19JU1VJRCkpIHx8Ci0JICAgICAoKChtb2RlICYgKFNfSVNHSUR8U19JWEdSUCkpID09IChTX0lTR0lEfFNfSVhHUlApKSAmJgorCSAgICAgKCgobW9kZSAmIChTX0lTR0lEIHwgU19JWEdSUCkpID09IChTX0lTR0lEIHwgU19JWEdSUCkpICYmCiAJICAgICAgIShhdHRyLT5pYV9tb2RlICYgU19JU0dJRCkpKSkKIAkJYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9GT1JDRTsKIApAQCAtMTM0OSw3ICsxNjE2LDcgQEAKIAkJYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9LSUxMX1NVSUQ7CiAKIAlpZiAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSAmJgotCSAgICAoKG1vZGUgJiAoU19JU0dJRHxTX0lYR1JQKSkgPT0gKFNfSVNHSUR8U19JWEdSUCkpICYmCisJICAgICgobW9kZSAmIChTX0lTR0lEIHwgU19JWEdSUCkpID09IChTX0lTR0lEIHwgU19JWEdSUCkpICYmCiAJICAgICEoYXR0ci0+aWFfbW9kZSAmIFNfSVNHSUQpICYmCiAJICAgICEoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0tJTExfU0dJRCkpCiAJCWF0dHItPmlhX3ZhbGlkIHw9IEFUVFJfS0lMTF9TR0lEOwpAQCAtMTQ2NSwxNCArMTczMiwxNCBAQAogCW11dGV4X3VubG9jaygmbGxpLT5sbGlfc2l6ZV9tdXRleCk7CiB9CiAKLXZvaWQgbGxfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBsdXN0cmVfbWQgKm1kKQoraW50IGxsX3VwZGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbHVzdHJlX21kICptZCkKIHsKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKIAlzdHJ1Y3QgbWR0X2JvZHkgKmJvZHkgPSBtZC0+Ym9keTsKIAlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtID0gbWQtPmxzbTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfaTJzYmkoaW5vZGUpOwogCi0JTEFTU0VSVCgobHNtICE9IE5VTEwpID09ICgoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxFQVNJWkUpICE9IDApKTsKKwlMQVNTRVJUKChsc20gIT0gTlVMTCkgPT0gKChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxFQVNJWkUpICE9IDApKTsKIAlpZiAobHNtKSB7CiAJCWlmICghbGxpLT5sbGlfaGFzX3NtZCAmJgogCQkgICAgIShzYmktPmxsX2ZsYWdzICYgTExfU0JJX0xBWU9VVF9MT0NLKSkKQEAgLTE0ODMsOCArMTc1MCwxNiBAQAogCQkJbGxpLT5sbGlfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOwogCX0KIAorCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWludCByYzsKKworCQlyYyA9IGxsX3VwZGF0ZV9sc21fbWQoaW5vZGUsIG1kKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KKwogI2lmZGVmIENPTkZJR19GU19QT1NJWF9BQ0wKLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxBQ0wpIHsKKwlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMQUNMKSB7CiAJCXNwaW5fbG9jaygmbGxpLT5sbGlfbG9jayk7CiAJCWlmIChsbGktPmxsaV9wb3NpeF9hY2wpCiAJCQlwb3NpeF9hY2xfcmVsZWFzZShsbGktPmxsaV9wb3NpeF9hY2wpOwpAQCAtMTQ5Miw2NSArMTc2Nyw2NyBAQAogCQlzcGluX3VubG9jaygmbGxpLT5sbGlfbG9jayk7CiAJfQogI2VuZGlmCi0JaW5vZGUtPmlfaW5vID0gY2xfZmlkX2J1aWxkX2lubygmYm9keS0+ZmlkMSwKKwlpbm9kZS0+aV9pbm8gPSBjbF9maWRfYnVpbGRfaW5vKCZib2R5LT5tYm9fZmlkMSwKIAkJCQkJc2JpLT5sbF9mbGFncyAmIExMX1NCSV8zMkJJVF9BUEkpOwotCWlub2RlLT5pX2dlbmVyYXRpb24gPSBjbF9maWRfYnVpbGRfZ2VuKCZib2R5LT5maWQxKTsKKwlpbm9kZS0+aV9nZW5lcmF0aW9uID0gY2xfZmlkX2J1aWxkX2dlbigmYm9keS0+bWJvX2ZpZDEpOwogCi0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMQVRJTUUpIHsKLQkJaWYgKGJvZHktPmF0aW1lID4gTFRJTUVfUyhpbm9kZS0+aV9hdGltZSkpCi0JCQlMVElNRV9TKGlub2RlLT5pX2F0aW1lKSA9IGJvZHktPmF0aW1lOwotCQlsbGktPmxsaV9hdGltZSA9IGJvZHktPmF0aW1lOworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxBVElNRSkgeworCQlpZiAoYm9keS0+bWJvX2F0aW1lID4gTFRJTUVfUyhpbm9kZS0+aV9hdGltZSkpCisJCQlMVElNRV9TKGlub2RlLT5pX2F0aW1lKSA9IGJvZHktPm1ib19hdGltZTsKKwkJbGxpLT5sbGlfYXRpbWUgPSBib2R5LT5tYm9fYXRpbWU7CiAJfQotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTE1USU1FKSB7Ci0JCWlmIChib2R5LT5tdGltZSA+IExUSU1FX1MoaW5vZGUtPmlfbXRpbWUpKSB7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTE1USU1FKSB7CisJCWlmIChib2R5LT5tYm9fbXRpbWUgPiBMVElNRV9TKGlub2RlLT5pX210aW1lKSkgewogCQkJQ0RFQlVHKERfSU5PREUsICJzZXR0aW5nIGlubyAlbHUgbXRpbWUgZnJvbSAlbHUgdG8gJWxsdVxuIiwKIAkJCSAgICAgICBpbm9kZS0+aV9pbm8sIExUSU1FX1MoaW5vZGUtPmlfbXRpbWUpLAotCQkJICAgICAgIGJvZHktPm10aW1lKTsKLQkJCUxUSU1FX1MoaW5vZGUtPmlfbXRpbWUpID0gYm9keS0+bXRpbWU7CisJCQkgICAgICAgYm9keS0+bWJvX210aW1lKTsKKwkJCUxUSU1FX1MoaW5vZGUtPmlfbXRpbWUpID0gYm9keS0+bWJvX210aW1lOwogCQl9Ci0JCWxsaS0+bGxpX210aW1lID0gYm9keS0+bXRpbWU7CisJCWxsaS0+bGxpX210aW1lID0gYm9keS0+bWJvX210aW1lOwogCX0KLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxDVElNRSkgewotCQlpZiAoYm9keS0+Y3RpbWUgPiBMVElNRV9TKGlub2RlLT5pX2N0aW1lKSkKLQkJCUxUSU1FX1MoaW5vZGUtPmlfY3RpbWUpID0gYm9keS0+Y3RpbWU7Ci0JCWxsaS0+bGxpX2N0aW1lID0gYm9keS0+Y3RpbWU7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTENUSU1FKSB7CisJCWlmIChib2R5LT5tYm9fY3RpbWUgPiBMVElNRV9TKGlub2RlLT5pX2N0aW1lKSkKKwkJCUxUSU1FX1MoaW5vZGUtPmlfY3RpbWUpID0gYm9keS0+bWJvX2N0aW1lOworCQlsbGktPmxsaV9jdGltZSA9IGJvZHktPm1ib19jdGltZTsKIAl9Ci0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMTU9ERSkKLQkJaW5vZGUtPmlfbW9kZSA9IChpbm9kZS0+aV9tb2RlICYgU19JRk1UKXwoYm9keS0+bW9kZSAmIH5TX0lGTVQpOwotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTFRZUEUpCi0JCWlub2RlLT5pX21vZGUgPSAoaW5vZGUtPmlfbW9kZSAmIH5TX0lGTVQpfChib2R5LT5tb2RlICYgU19JRk1UKTsKKwlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMTU9ERSkKKwkJaW5vZGUtPmlfbW9kZSA9IChpbm9kZS0+aV9tb2RlICYgU19JRk1UKSB8CisJCQkJKGJvZHktPm1ib19tb2RlICYgflNfSUZNVCk7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTFRZUEUpCisJCWlub2RlLT5pX21vZGUgPSAoaW5vZGUtPmlfbW9kZSAmIH5TX0lGTVQpIHwKKwkJCQkoYm9keS0+bWJvX21vZGUgJiBTX0lGTVQpOwogCUxBU1NFUlQoaW5vZGUtPmlfbW9kZSAhPSAwKTsKIAlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKIAkJaW5vZGUtPmlfYmxrYml0cyA9IG1pbihQVExSUENfTUFYX0JSV19CSVRTICsgMSwKIAkJCQkgICAgICAgTExfTUFYX0JMS1NJWkVfQklUUyk7CiAJZWxzZQogCQlpbm9kZS0+aV9ibGtiaXRzID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7Ci0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMVUlEKQotCQlpbm9kZS0+aV91aWQgPSBtYWtlX2t1aWQoJmluaXRfdXNlcl9ucywgYm9keS0+dWlkKTsKLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxHSUQpCi0JCWlub2RlLT5pX2dpZCA9IG1ha2Vfa2dpZCgmaW5pdF91c2VyX25zLCBib2R5LT5naWQpOwotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTEZMQUdTKQotCQlpbm9kZS0+aV9mbGFncyA9IGxsX2V4dF90b19pbm9kZV9mbGFncyhib2R5LT5mbGFncyk7Ci0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMTkxJTkspCi0JCXNldF9ubGluayhpbm9kZSwgYm9keS0+bmxpbmspOwotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTFJERVYpCi0JCWlub2RlLT5pX3JkZXYgPSBvbGRfZGVjb2RlX2Rldihib2R5LT5yZGV2KTsKKwlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMVUlEKQorCQlpbm9kZS0+aV91aWQgPSBtYWtlX2t1aWQoJmluaXRfdXNlcl9ucywgYm9keS0+bWJvX3VpZCk7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTEdJRCkKKwkJaW5vZGUtPmlfZ2lkID0gbWFrZV9rZ2lkKCZpbml0X3VzZXJfbnMsIGJvZHktPm1ib19naWQpOworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxGTEFHUykKKwkJaW5vZGUtPmlfZmxhZ3MgPSBsbF9leHRfdG9faW5vZGVfZmxhZ3MoYm9keS0+bWJvX2ZsYWdzKTsKKwlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMTkxJTkspCisJCXNldF9ubGluayhpbm9kZSwgYm9keS0+bWJvX25saW5rKTsKKwlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMUkRFVikKKwkJaW5vZGUtPmlfcmRldiA9IG9sZF9kZWNvZGVfZGV2KGJvZHktPm1ib19yZGV2KTsKIAotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTElEKSB7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTElEKSB7CiAJCS8qIEZJRCBzaG91bGRuJ3QgYmUgY2hhbmdlZCEgKi8KIAkJaWYgKGZpZF9pc19zYW5lKCZsbGktPmxsaV9maWQpKSB7Ci0JCQlMQVNTRVJURihsdV9maWRfZXEoJmxsaS0+bGxpX2ZpZCwgJmJvZHktPmZpZDEpLAorCQkJTEFTU0VSVEYobHVfZmlkX2VxKCZsbGktPmxsaV9maWQsICZib2R5LT5tYm9fZmlkMSksCiAJCQkJICJUcnlpbmcgdG8gY2hhbmdlIEZJRCAiREZJRCIgdG8gdGhlICJERklEIiwgaW5vZGUgIkRGSUQiKCVwKVxuIiwKLQkJCQkgUEZJRCgmbGxpLT5sbGlfZmlkKSwgUEZJRCgmYm9keS0+ZmlkMSksCisJCQkJIFBGSUQoJmxsaS0+bGxpX2ZpZCksIFBGSUQoJmJvZHktPm1ib19maWQxKSwKIAkJCQkgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgaW5vZGUpOwogCQl9IGVsc2UgewotCQkJbGxpLT5sbGlfZmlkID0gYm9keS0+ZmlkMTsKKwkJCWxsaS0+bGxpX2ZpZCA9IGJvZHktPm1ib19maWQxOwogCQl9CiAJfQogCiAJTEFTU0VSVChmaWRfc2VxKCZsbGktPmxsaV9maWQpICE9IDApOwogCi0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMU0laRSkgeworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxTSVpFKSB7CiAJCWlmIChleHBfY29ubmVjdF9zb20obGxfaTJtZGV4cChpbm9kZSkpICYmCiAJCSAgICBTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CiAJCQlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSBsb2NraDsKQEAgLTE1NzcsNyArMTg1NCw3IEBACiAJCQkJCS8qIFVzZSBvbGQgc2l6ZSBhc3NpZ25tZW50IHRvIGF2b2lkCiAJCQkJCSAqIGRlYWRsb2NrIGJ6MTQxMzggJiBiejE0MzI2CiAJCQkJCSAqLwotCQkJCQlpX3NpemVfd3JpdGUoaW5vZGUsIGJvZHktPnNpemUpOworCQkJCQlpX3NpemVfd3JpdGUoaW5vZGUsIGJvZHktPm1ib19zaXplKTsKIAkJCQkJc3Bpbl9sb2NrKCZsbGktPmxsaV9sb2NrKTsKIAkJCQkJbGxpLT5sbGlfZmxhZ3MgfD0gTExJRl9NRFNfU0laRV9MT0NLOwogCQkJCQlzcGluX3VubG9jaygmbGxpLT5sbGlfbG9jayk7CkBAIC0xNTg4LDI2ICsxODY1LDI5IEBACiAJCQkvKiBVc2Ugb2xkIHNpemUgYXNzaWdubWVudCB0byBhdm9pZAogCQkJICogZGVhZGxvY2sgYnoxNDEzOCAmIGJ6MTQzMjYKIAkJCSAqLwotCQkJaV9zaXplX3dyaXRlKGlub2RlLCBib2R5LT5zaXplKTsKKwkJCWlfc2l6ZV93cml0ZShpbm9kZSwgYm9keS0+bWJvX3NpemUpOwogCiAJCQlDREVCVUcoRF9WRlNUUkFDRSwgImlub2RlPSVsdSwgdXBkYXRpbmcgaV9zaXplICVsbHVcbiIsCi0JCQkgICAgICAgaW5vZGUtPmlfaW5vLCAodW5zaWduZWQgbG9uZyBsb25nKWJvZHktPnNpemUpOworCQkJICAgICAgIGlub2RlLT5pX2lubywgKHVuc2lnbmVkIGxvbmcgbG9uZylib2R5LT5tYm9fc2l6ZSk7CiAJCX0KIAotCQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxCTE9DS1MpCi0JCQlpbm9kZS0+aV9ibG9ja3MgPSBib2R5LT5ibG9ja3M7CisJCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxCTE9DS1MpCisJCQlpbm9kZS0+aV9ibG9ja3MgPSBib2R5LT5tYm9fYmxvY2tzOwogCX0KIAotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9UU1RBVEUpIHsKLQkJaWYgKGJvZHktPnRfc3RhdGUgJiBNU19SRVNUT1JFKQorCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfVFNUQVRFKSB7CisJCWlmIChib2R5LT5tYm9fdF9zdGF0ZSAmIE1TX1JFU1RPUkUpCiAJCQlsbGktPmxsaV9mbGFncyB8PSBMTElGX0ZJTEVfUkVTVE9SSU5HOwogCX0KKworCXJldHVybiAwOwogfQogCi12b2lkIGxsX3JlYWRfaW5vZGUyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSkKK2ludCBsbF9yZWFkX2lub2RlMihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpvcGFxdWUpCiB7CiAJc3RydWN0IGx1c3RyZV9tZCAqbWQgPSBvcGFxdWU7CiAJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CisJaW50IHJjOwogCiAJQ0RFQlVHKERfVkZTVFJBQ0UsICJWRlMgT3A6aW5vZGU9IkRGSUQiKCVwKVxuIiwKIAkgICAgICAgUEZJRCgmbGxpLT5sbGlfZmlkKSwgaW5vZGUpOwpAQCAtMTYyMyw3ICsxOTAzLDkgQEAKIAlMVElNRV9TKGlub2RlLT5pX2F0aW1lKSA9IDA7CiAJTFRJTUVfUyhpbm9kZS0+aV9jdGltZSkgPSAwOwogCWlub2RlLT5pX3JkZXYgPSAwOwotCWxsX3VwZGF0ZV9pbm9kZShpbm9kZSwgbWQpOworCXJjID0gbGxfdXBkYXRlX2lub2RlKGlub2RlLCBtZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAkvKiBPSURFQlVHKGlub2RlKTsgKi8KIApAQCAtMTY0NCw2ICsxOTI2LDggQEAKIAkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLAogCQkJCSAgIGlub2RlLT5pX3JkZXYpOwogCX0KKworCXJldHVybiAwOwogfQogCiB2b2lkIGxsX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQpAQCAtMTY1NSwyMCArMTkzOSwxMyBAQAogCQkgKiBvc2NfZXh0ZW50IGltcGxlbWVudGF0aW9uIGF0IExVLTEwMzAuCiAJCSAqLwogCQljbF9zeW5jX2ZpbGVfcmFuZ2UoaW5vZGUsIDAsIE9CRF9PQkpFQ1RfRU9GLAotCQkJCSAgIENMX0ZTWU5DX0RJU0NBUkQsIDEpOworCQkJCSAgIENMX0ZTWU5DX0xPQ0FMLCAxKTsKIAogCXRydW5jYXRlX2lub2RlX3BhZ2VzX2ZpbmFsKCZpbm9kZS0+aV9kYXRhKTsKIAotCS8qIFdvcmthcm91bmQgZm9yIExVLTExOCAqLwotCWlmIChpbm9kZS0+aV9kYXRhLm5ycGFnZXMpIHsKLQkJc3Bpbl9sb2NrX2lycSgmaW5vZGUtPmlfZGF0YS50cmVlX2xvY2spOwotCQlzcGluX3VubG9ja19pcnEoJmlub2RlLT5pX2RhdGEudHJlZV9sb2NrKTsKLQkJTEFTU0VSVEYoaW5vZGUtPmlfZGF0YS5ucnBhZ2VzID09IDAsCi0JCQkgImlub2RlPSJERklEIiglcCkgbnJwYWdlcz0lbHUsIHNlZSBodHRwOi8vamlyYS53aGFtY2xvdWQuY29tL2Jyb3dzZS9MVS0xMThcbiIsCi0JCQkgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgaW5vZGUsCi0JCQkgaW5vZGUtPmlfZGF0YS5ucnBhZ2VzKTsKLQl9Ci0JLyogV29ya2Fyb3VuZCBlbmQgKi8KKwlMQVNTRVJURighaW5vZGUtPmlfZGF0YS5ucnBhZ2VzLAorCQkgImlub2RlPSIgREZJRCAiKCVwKSBucnBhZ2VzPSVsdSwgc2VlIGh0dHA6Ly9qaXJhLndoYW1jbG91ZC5jb20vYnJvd3NlL0xVLTExOFxuIiwKKwkJIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIGlub2RlLCBpbm9kZS0+aV9kYXRhLm5ycGFnZXMpOwogCiAJbGxfY2xlYXJfaW5vZGUoaW5vZGUpOwogCWNsZWFyX2lub2RlKGlub2RlKTsKQEAgLTE3MDQsNyArMTk4MSw3IEBACiAKIAkJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CiAKLQkJZmxhZ3MgPSBib2R5LT5mbGFnczsKKwkJZmxhZ3MgPSBib2R5LT5tYm9fZmxhZ3M7CiAKIAkJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwogCkBAIC0xODg2LDkgKzIxNjMsOSBAQAogCWlmICghb3BfZGF0YSkKIAkJcmV0dXJuOwogCi0Jb3BfZGF0YS0+b3BfZmlkMSA9IGJvZHktPmZpZDE7Ci0Jb3BfZGF0YS0+b3BfaW9lcG9jaCA9IGJvZHktPmlvZXBvY2g7Ci0Jb3BfZGF0YS0+b3BfaGFuZGxlID0gYm9keS0+aGFuZGxlOworCW9wX2RhdGEtPm9wX2ZpZDEgPSBib2R5LT5tYm9fZmlkMTsKKwlvcF9kYXRhLT5vcF9pb2Vwb2NoID0gYm9keS0+bWJvX2lvZXBvY2g7CisJb3BfZGF0YS0+b3BfaGFuZGxlID0gYm9keS0+bWJvX2hhbmRsZTsKIAlvcF9kYXRhLT5vcF9tb2RfdGltZSA9IGdldF9zZWNvbmRzKCk7CiAJbWRfY2xvc2UoZXhwLCBvcF9kYXRhLCBOVUxMLCAmY2xvc2VfcmVxKTsKIAlwdGxycGNfcmVxX2ZpbmlzaGVkKGNsb3NlX3JlcSk7CkBAIC0xOTEwLDcgKzIxODcsOSBAQAogCQlnb3RvIGNsZWFudXA7CiAKIAlpZiAoKmlub2RlKSB7Ci0JCWxsX3VwZGF0ZV9pbm9kZSgqaW5vZGUsICZtZCk7CisJCXJjID0gbGxfdXBkYXRlX2lub2RlKCppbm9kZSwgJm1kKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CiAJfSBlbHNlIHsKIAkJTEFTU0VSVChzYik7CiAKQEAgLTE5MTgsMTggKzIxOTcsMTggQEAKIAkJICogQXQgdGhpcyBwb2ludCBzZXJ2ZXIgcmV0dXJucyB0byBjbGllbnQncyBzYW1lIGZpZCBhcyBjbGllbnQKIAkJICogZ2VuZXJhdGVkIGZvciBjcmVhdGluZy4gU28gdXNpbmcgLT5maWQxIGlzIG9rYXkgaGVyZS4KIAkJICovCi0JCWlmICghZmlkX2lzX3NhbmUoJm1kLmJvZHktPmZpZDEpKSB7CisJCWlmICghZmlkX2lzX3NhbmUoJm1kLmJvZHktPm1ib19maWQxKSkgewogCQkJQ0VSUk9SKCIlczogRmlkIGlzIGluc2FuZSAiIERGSUQgIlxuIiwKIAkJCSAgICAgICBsbF9nZXRfZnNuYW1lKHNiLCBOVUxMLCAwKSwKLQkJCSAgICAgICBQRklEKCZtZC5ib2R5LT5maWQxKSk7CisJCQkgICAgICAgUEZJRCgmbWQuYm9keS0+bWJvX2ZpZDEpKTsKIAkJCXJjID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJKmlub2RlID0gbGxfaWdldChzYiwgY2xfZmlkX2J1aWxkX2lubygmbWQuYm9keS0+ZmlkMSwKKwkJKmlub2RlID0gbGxfaWdldChzYiwgY2xfZmlkX2J1aWxkX2lubygmbWQuYm9keS0+bWJvX2ZpZDEsCiAJCQkJCSAgICAgc2JpLT5sbF9mbGFncyAmIExMX1NCSV8zMkJJVF9BUEkpLAogCQkJCSAmbWQpOwotCQlpZiAoISppbm9kZSkgeworCQlpZiAoSVNfRVJSKCppbm9kZSkpIHsKICNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCiAJCQlpZiAobWQucG9zaXhfYWNsKSB7CiAJCQkJcG9zaXhfYWNsX3JlbGVhc2UobWQucG9zaXhfYWNsKTsKQEAgLTIwNzUsMTEgKzIzNTQsMjAgQEAKIC8qIHRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgbWRfb3BfZGF0YSBoaW50IGZvciBwYXNzaW5nIG90IGRvd24gdG8gTUQgc3RhY2suICovCiBzdHJ1Y3QgbWRfb3BfZGF0YSAqbGxfcHJlcF9tZF9vcF9kYXRhKHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAogCQkJCSAgICAgIHN0cnVjdCBpbm9kZSAqaTEsIHN0cnVjdCBpbm9kZSAqaTIsCi0JCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCi0JCQkJICAgICAgaW50IG1vZGUsIF9fdTMyIG9wYywgdm9pZCAqZGF0YSkKKwkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZWxlbiwKKwkJCQkgICAgICB1MzIgbW9kZSwgX191MzIgb3BjLCB2b2lkICpkYXRhKQogewotCWlmIChuYW1lbGVuID4gbGxfaTJzYmkoaTEpLT5sbF9uYW1lbGVuKQotCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKKwlpZiAoIW5hbWUpIHsKKwkJLyogRG8gbm90IHJldXNlIG5hbWVsZW4gZm9yIHNvbWV0aGluZyBlbHNlLiAqLworCQlpZiAobmFtZWxlbikKKwkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0gZWxzZSB7CisJCWlmIChuYW1lbGVuID4gbGxfaTJzYmkoaTEpLT5sbF9uYW1lbGVuKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CisKKwkJaWYgKCFsdV9uYW1lX2lzX3ZhbGlkXzIobmFtZSwgbmFtZWxlbikpCisJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CiAKIAlpZiAoIW9wX2RhdGEpCiAJCW9wX2RhdGEgPSBremFsbG9jKHNpemVvZigqb3BfZGF0YSksIEdGUF9OT0ZTKTsKQEAgLTIwODksMTEgKzIzNzcsMjYgQEAKIAogCWxsX2kyZ2lkcyhvcF9kYXRhLT5vcF9zdXBwZ2lkcywgaTEsIGkyKTsKIAlvcF9kYXRhLT5vcF9maWQxID0gKmxsX2lub2RlMmZpZChpMSk7CisJb3BfZGF0YS0+b3BfZGVmYXVsdF9zdHJpcGVfb2Zmc2V0ID0gLTE7CisJaWYgKFNfSVNESVIoaTEtPmlfbW9kZSkpIHsKKwkJb3BfZGF0YS0+b3BfbWVhMSA9IGxsX2kyaW5mbyhpMSktPmxsaV9sc21fbWQ7CisJCW9wX2RhdGEtPm9wX2RlZmF1bHRfc3RyaXBlX29mZnNldCA9CisJCQlsbF9pMmluZm8oaTEpLT5sbGlfZGVmX3N0cmlwZV9vZmZzZXQ7CisJfQogCi0JaWYgKGkyKQorCWlmIChpMikgewogCQlvcF9kYXRhLT5vcF9maWQyID0gKmxsX2lub2RlMmZpZChpMik7Ci0JZWxzZQorCQlpZiAoU19JU0RJUihpMi0+aV9tb2RlKSkKKwkJCW9wX2RhdGEtPm9wX21lYTIgPSBsbF9pMmluZm8oaTIpLT5sbGlfbHNtX21kOworCX0gZWxzZSB7CiAJCWZpZF96ZXJvKCZvcF9kYXRhLT5vcF9maWQyKTsKKwl9CisKKwlpZiAobGxfaTJzYmkoaTEpLT5sbF9mbGFncyAmIExMX1NCSV82NEJJVF9IQVNIKQorCQlvcF9kYXRhLT5vcF9jbGlfZmxhZ3MgfD0gQ0xJX0hBU0g2NDsKKworCWlmIChsbF9uZWVkXzMyYml0X2FwaShsbF9pMnNiaShpMSkpKQorCQlvcF9kYXRhLT5vcF9jbGlfZmxhZ3MgfD0gQ0xJX0FQSTMyOwogCiAJb3BfZGF0YS0+b3BfbmFtZSA9IG5hbWU7CiAJb3BfZGF0YS0+b3BfbmFtZWxlbiA9IG5hbWVsZW47CkBAIC0yMTA1LDI2ICsyNDA4LDEyIEBACiAJb3BfZGF0YS0+b3BfYmlhcyA9IDA7CiAJb3BfZGF0YS0+b3BfY2xpX2ZsYWdzID0gMDsKIAlpZiAoKG9wYyA9PSBMVVNUUkVfT1BDX0NSRUFURSkgJiYgbmFtZSAmJgotCSAgICBmaWxlbmFtZV9pc192b2xhdGlsZShuYW1lLCBuYW1lbGVuLCBOVUxMKSkKKwkgICAgZmlsZW5hbWVfaXNfdm9sYXRpbGUobmFtZSwgbmFtZWxlbiwgJm9wX2RhdGEtPm9wX21kcykpCiAJCW9wX2RhdGEtPm9wX2JpYXMgfD0gTURTX0NSRUFURV9WT0xBVElMRTsKLQlvcF9kYXRhLT5vcF9vcGMgPSBvcGM7Ci0Jb3BfZGF0YS0+b3BfbWRzID0gMDsKKwllbHNlCisJCW9wX2RhdGEtPm9wX21kcyA9IDA7CiAJb3BfZGF0YS0+b3BfZGF0YSA9IGRhdGE7CiAKLQkvKiBJZiB0aGUgZmlsZSBpcyBiZWluZyBvcGVuZWQgYWZ0ZXIgbWtub2QoKSAobm9ybWFsbHkgZHVlIHRvIE5GUykKLQkgKiB0cnkgdG8gdXNlIHRoZSBkZWZhdWx0IHN0cmlwZSBkYXRhIGZyb20gcGFyZW50IGRpcmVjdG9yeSBmb3IKLQkgKiBhbGxvY2F0aW5nIE9TVCBvYmplY3RzLiAgVHJ5IHRvIHBhc3MgdGhlIHBhcmVudCBGSUQgdG8gTURTLgotCSAqLwotCWlmIChvcGMgPT0gTFVTVFJFX09QQ19DUkVBVEUgJiYgaTEgPT0gaTIgJiYgU19JU1JFRyhpMi0+aV9tb2RlKSAmJgotCSAgICAhbGxfaTJpbmZvKGkyKS0+bGxpX2hhc19zbWQpIHsKLQkJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpMik7Ci0KLQkJc3Bpbl9sb2NrKCZsbGktPmxsaV9sb2NrKTsKLQkJaWYgKGxpa2VseSghbGxpLT5sbGlfaGFzX3NtZCAmJiAhZmlkX2lzX3plcm8oJmxsaS0+bGxpX3BmaWQpKSkKLQkJCW9wX2RhdGEtPm9wX2ZpZDEgPSBsbGktPmxsaV9wZmlkOwotCQlzcGluX3VubG9jaygmbGxpLT5sbGlfbG9jayk7Ci0JfQotCiAJLyogV2hlbiBjYWxsZWQgYnkgbGxfc2V0YXR0cl9yYXcsIGZpbGUgaXMgaTEuICovCiAJaWYgKGxsX2kyaW5mbyhpMSktPmxsaV9mbGFncyAmIExMSUZfREFUQV9NT0RJRklFRCkKIAkJb3BfZGF0YS0+b3BfYmlhcyB8PSBNRFNfREFUQV9NT0RJRklFRDsKQEAgLTIyNTEsMyArMjU0MCwxOTcgQEAKIAlpZiAoYnVmKQogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmKTsKIH0KKworc3NpemVfdCBsbF9jb3B5X3VzZXJfbWQoY29uc3Qgc3RydWN0IGxvdl91c2VyX21kIF9fdXNlciAqbWQsCisJCQlzdHJ1Y3QgbG92X3VzZXJfbWQgKiprYnVmKQoreworCXN0cnVjdCBsb3ZfdXNlcl9tZCBsdW07CisJc3NpemVfdCBsdW1fc2l6ZTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbHVtLCBtZCwgc2l6ZW9mKGx1bSkpKSB7CisJCWx1bV9zaXplID0gLUVGQVVMVDsKKwkJZ290byBub19rYnVmOworCX0KKworCWx1bV9zaXplID0gbGxfbG92X3VzZXJfbWRfc2l6ZSgmbHVtKTsKKwlpZiAobHVtX3NpemUgPCAwKQorCQlnb3RvIG5vX2tidWY7CisKKwkqa2J1ZiA9IGt6YWxsb2MobHVtX3NpemUsIEdGUF9OT0ZTKTsKKwlpZiAoISprYnVmKSB7CisJCWx1bV9zaXplID0gLUVOT01FTTsKKwkJZ290byBub19rYnVmOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigqa2J1ZiwgbWQsIGx1bV9zaXplKSAhPSAwKSB7CisJCWtmcmVlKCprYnVmKTsKKwkJKmtidWYgPSBOVUxMOworCQlsdW1fc2l6ZSA9IC1FRkFVTFQ7CisJfQorbm9fa2J1ZjoKKwlyZXR1cm4gbHVtX3NpemU7Cit9CisKKy8qCisgKiBDb21wdXRlIGxsaXRlIHJvb3Qgc3F1YXNoIHN0YXRlIGFmdGVyIGEgY2hhbmdlIG9mIHJvb3Qgc3F1YXNoCisgKiBjb25maWd1cmF0aW9uIHNldHRpbmcgb3IgYWRkL3JlbW92ZSBvZiBhIGxuZXQgbmlkCisgKi8KK3ZvaWQgbGxfY29tcHV0ZV9yb290c3F1YXNoX3N0YXRlKHN0cnVjdCBsbF9zYl9pbmZvICpzYmkpCit7CisJc3RydWN0IHJvb3Rfc3F1YXNoX2luZm8gKnNxdWFzaCA9ICZzYmktPmxsX3NxdWFzaDsKKwlsbmV0X3Byb2Nlc3NfaWRfdCBpZDsKKwlib29sIG1hdGNoZWQ7CisJaW50IGk7CisKKwkvKiBVcGRhdGUgbm9yb290c3F1YXNoIGZsYWcgKi8KKwlkb3duX3dyaXRlKCZzcXVhc2gtPnJzaV9zZW0pOworCWlmIChsaXN0X2VtcHR5KCZzcXVhc2gtPnJzaV9ub3NxdWFzaF9uaWRzKSkgeworCQlzYmktPmxsX2ZsYWdzICY9IH5MTF9TQklfTk9ST09UU1FVQVNIOworCX0gZWxzZSB7CisJCS8qCisJCSAqIERvIG5vdCBhcHBseSByb290IHNxdWFzaCBhcyBzb29uIGFzIG9uZSBvZiBvdXIgTklEcyBpcworCQkgKiBpbiB0aGUgbm9zcXVhc2hfbmlkcyBsaXN0CisJCSAqLworCQltYXRjaGVkID0gZmFsc2U7CisJCWkgPSAwOworCisJCXdoaWxlIChMTmV0R2V0SWQoaSsrLCAmaWQpICE9IC1FTk9FTlQpIHsKKwkJCWlmIChMTkVUX05FVFRZUChMTkVUX05JRE5FVChpZC5uaWQpKSA9PSBMT0xORCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChjZnNfbWF0Y2hfbmlkKGlkLm5pZCwgJnNxdWFzaC0+cnNpX25vc3F1YXNoX25pZHMpKSB7CisJCQkJbWF0Y2hlZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKG1hdGNoZWQpCisJCQlzYmktPmxsX2ZsYWdzIHw9IExMX1NCSV9OT1JPT1RTUVVBU0g7CisJCWVsc2UKKwkJCXNiaS0+bGxfZmxhZ3MgJj0gfkxMX1NCSV9OT1JPT1RTUVVBU0g7CisJfQorCXVwX3dyaXRlKCZzcXVhc2gtPnJzaV9zZW0pOworfQorCisvKioKKyAqIFBhcnNlIGxpbmtlYSBjb250ZW50IHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gYWJvdXQgYSBnaXZlbiBoYXJkbGluaworICoKKyAqIFxwYXJhbVtpbl0JbGRhdGEJCS0gSW5pdGlhbGl6ZWQgbGlua2VhIGRhdGEKKyAqIFxwYXJhbVtpbl0JbGlua25vCQktIExpbmsgaWRlbnRpZmllcgorICogXHBhcmFtW291dF0JcGFyZW50X2ZpZAktIFRoZSBlbnRyeSdzIHBhcmVudCBGSUQKKyAqIFxwYXJhbVtpbl0Jc2l6ZQkJLSBFbnRyeSBuYW1lIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFxyZXR2YWwgMCBvbiBzdWNjZXNzCisgKiBccmV0dmFsIEFwcHJvcHJpYXRlIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGxsX2xpbmtlYV9kZWNvZGUoc3RydWN0IGxpbmtlYV9kYXRhICpsZGF0YSwgdW5zaWduZWQgaW50IGxpbmtubywKKwkJCSAgICBzdHJ1Y3QgbHVfZmlkICpwYXJlbnRfZmlkLCBzdHJ1Y3QgbHVfbmFtZSAqbG4pCit7CisJdW5zaWduZWQgaW50IGlkeDsKKwlpbnQgcmM7CisKKwlyYyA9IGxpbmtlYV9pbml0KGxkYXRhKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlpZiAobGlua25vID49IGxkYXRhLT5sZF9sZWgtPmxlaF9yZWNjb3VudCkKKwkJLyogYmV5b25kIGxhc3QgbGluayAqLworCQlyZXR1cm4gLUVOT0RBVEE7CisKKwlsaW5rZWFfZmlyc3RfZW50cnkobGRhdGEpOworCWZvciAoaWR4ID0gMDsgbGRhdGEtPmxkX2xlZTsgaWR4KyspIHsKKwkJbGlua2VhX2VudHJ5X3VucGFjayhsZGF0YS0+bGRfbGVlLCAmbGRhdGEtPmxkX3JlY2xlbiwgbG4sCisJCQkJICAgIHBhcmVudF9maWQpOworCQlpZiAoaWR4ID09IGxpbmtubykKKwkJCWJyZWFrOworCisJCWxpbmtlYV9uZXh0X2VudHJ5KGxkYXRhKTsKKwl9CisKKwlpZiAoaWR4IDwgbGlua25vKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBHZXQgcGFyZW50IEZJRCBhbmQgbmFtZSBvZiBhbiBpZGVudGlmaWVkIGxpbmsuIE9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgZm9yCisgKiBhIGdpdmVuIGxpbmsgbnVtYmVyLCBsZXR0aW5nIHRoZSBjYWxsZXIgaXRlcmF0ZSBvdmVyIGxpbmtubyB0byBsaXN0IG9uZSBvcgorICogYWxsIGxpbmtzIG9mIGFuIGVudHJ5LgorICoKKyAqIFxwYXJhbVtpbl0JICBmaWxlCS0gRmlsZSBkZXNjcmlwdG9yIGFnYWluc3Qgd2hpY2ggdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uCisgKiBccGFyYW1baW4sb3V0XSBhcmcJLSBVc2VyLWZpbGxlZCBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgbGlua25vIHRvIG9wZXJhdGUKKyAqCQkJICBvbiBhbmQgdGhlIGF2YWlsYWJsZSBzaXplLiBJdCBpcyBldmVudHVhbGx5IGZpbGxlZCB3aXRoCisgKgkJCSAgdGhlIHJlcXVlc3RlZCBpbmZvcm1hdGlvbiBvciBsZWZ0IHVudG91Y2hlZCBvbiBlcnJvcgorICoKKyAqIFxyZXR2YWwgLSAwIG9uIHN1Y2Nlc3MKKyAqIFxyZXR2YWwgLSBBcHByb3ByaWF0ZSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGxsX2dldHBhcmVudChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGdldHBhcmVudCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTsKKwlzdHJ1Y3QgbGlua2VhX2RhdGEgKmxkYXRhOworCXN0cnVjdCBsdV9maWQgcGFyZW50X2ZpZDsKKwlzdHJ1Y3QgbHVfYnVmIGJ1ZiA9IHsKKwkJLmxiX2J1ZiA9IE5VTEwsCisJCS5sYl9sZW4gPSAwCisJfTsKKwlzdHJ1Y3QgbHVfbmFtZSBsbjsKKwl1MzIgbmFtZV9zaXplOworCXUzMiBsaW5rbm87CisJaW50IHJjOworCisJaWYgKCFjYXBhYmxlKENGU19DQVBfREFDX1JFQURfU0VBUkNIKSAmJgorCSAgICAhKGxsX2kyc2JpKGlub2RlKS0+bGxfZmxhZ3MgJiBMTF9TQklfVVNFUl9GSUQyUEFUSCkpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoZ2V0X3VzZXIobmFtZV9zaXplLCAmYXJnLT5ncF9uYW1lX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChnZXRfdXNlcihsaW5rbm8sICZhcmctPmdwX2xpbmtubykpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKG5hbWVfc2l6ZSA+IFBBVEhfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxkYXRhID0ga3phbGxvYyhzaXplb2YoKmxkYXRhKSwgR0ZQX05PRlMpOworCWlmICghbGRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJcmMgPSBsaW5rZWFfZGF0YV9uZXcobGRhdGEsICZidWYpOworCWlmIChyYyA8IDApCisJCWdvdG8gbGRhdGFfZnJlZTsKKworCXJjID0gbGxfeGF0dHJfbGlzdChpbm9kZSwgWEFUVFJfTkFNRV9MSU5LLCBYQVRUUl9UUlVTVEVEX1QsIGJ1Zi5sYl9idWYsCisJCQkgICBidWYubGJfbGVuLCBPQkRfTURfRkxYQVRUUik7CisJaWYgKHJjIDwgMCkKKwkJZ290byBsYl9mcmVlOworCisJcmMgPSBsbF9saW5rZWFfZGVjb2RlKGxkYXRhLCBsaW5rbm8sICZwYXJlbnRfZmlkLCAmbG4pOworCWlmIChyYyA8IDApCisJCWdvdG8gbGJfZnJlZTsKKworCWlmIChsbi5sbl9uYW1lbGVuID49IG5hbWVfc2l6ZSkgeworCQlyYyA9IC1FT1ZFUkZMT1c7CisJCWdvdG8gbGJfZnJlZTsKKwl9CisKKwlpZiAoY29weV90b191c2VyKCZhcmctPmdwX2ZpZCwgJnBhcmVudF9maWQsIHNpemVvZihhcmctPmdwX2ZpZCkpKSB7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBsYl9mcmVlOworCX0KKworCWlmIChjb3B5X3RvX3VzZXIoJmFyZy0+Z3BfbmFtZSwgbG4ubG5fbmFtZSwgbG4ubG5fbmFtZWxlbikpIHsKKwkJcmMgPSAtRUZBVUxUOworCQlnb3RvIGxiX2ZyZWU7CisJfQorCisJaWYgKHB1dF91c2VyKCdcMCcsIGFyZy0+Z3BfbmFtZSArIGxuLmxuX25hbWVsZW4pKSB7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBsYl9mcmVlOworCX0KKworbGJfZnJlZToKKwlsdV9idWZfZnJlZSgmYnVmKTsKK2xkYXRhX2ZyZWU6CisJa2ZyZWUobGRhdGEpOworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX21tYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX21tYXAuYwppbmRleCA2NmVlNWRiLi40MzY2OTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9tbWFwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbW1hcC5jCkBAIC00Myw5ICs0Myw3IEBACiAKICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTExJVEUKIAotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbGludXgvbHVzdHJlX2NvbXBhdDI1LmgiCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgbGxfZmlsZV92bV9vcHM7CiAKQEAgLTEyNiw3ICsxMjQsNyBAQAogCiAJZmlvID0gJmlvLT51LmNpX2ZhdWx0OwogCWZpby0+ZnRfaW5kZXggICAgICA9IGluZGV4OwotCWZpby0+ZnRfZXhlY3V0YWJsZSA9IHZtYS0+dm1fZmxhZ3MmVk1fRVhFQzsKKwlmaW8tPmZ0X2V4ZWN1dGFibGUgPSB2bWEtPnZtX2ZsYWdzICYgVk1fRVhFQzsKIAogCS8qCiAJICogZGlzYWJsZSBWTV9TRVFfUkVBRCBhbmQgdXNlIFZNX1JBTkRfUkVBRCB0byBtYWtlIHN1cmUgdGhhdApAQCAtMTM0LDcgKzEzMiw3IEBACiAJICogZmlsZW1hcF9ub3BhZ2UuIHdlIGRvIG91ciByZWFkYWhlYWQgaW4gbGxfcmVhZHBhZ2UuCiAJICovCiAJaWYgKHJhX2ZsYWdzKQotCQkqcmFfZmxhZ3MgPSB2bWEtPnZtX2ZsYWdzICYgKFZNX1JBTkRfUkVBRHxWTV9TRVFfUkVBRCk7CisJCSpyYV9mbGFncyA9IHZtYS0+dm1fZmxhZ3MgJiAoVk1fUkFORF9SRUFEIHwgVk1fU0VRX1JFQUQpOwogCXZtYS0+dm1fZmxhZ3MgJj0gflZNX1NFUV9SRUFEOwogCXZtYS0+dm1fZmxhZ3MgfD0gVk1fUkFORF9SRUFEOwogCkBAIC00MjksNyArNDI3LDYgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlICAgID0gZmlsZV9pbm9kZSh2bWEtPnZtX2ZpbGUpOwogCXN0cnVjdCB2dnBfb2JqZWN0ICp2b2IgPSBjbF9pbm9kZTJ2dnAoaW5vZGUpOwogCi0JTEFTU0VSVCh2bWEtPnZtX2ZpbGUpOwogCUxBU1NFUlQoYXRvbWljX3JlYWQoJnZvYi0+dm9iX21tYXBfY250KSA+PSAwKTsKIAlhdG9taWNfaW5jKCZ2b2ItPnZvYl9tbWFwX2NudCk7CiB9CkBAIC00NDIsNyArNDM5LDYgQEAKIAlzdHJ1Y3QgaW5vZGUgICAgICAqaW5vZGUgPSBmaWxlX2lub2RlKHZtYS0+dm1fZmlsZSk7CiAJc3RydWN0IHZ2cF9vYmplY3QgKnZvYiAgID0gY2xfaW5vZGUydnZwKGlub2RlKTsKIAotCUxBU1NFUlQodm1hLT52bV9maWxlKTsKIAlhdG9taWNfZGVjKCZ2b2ItPnZvYl9tbWFwX2NudCk7CiAJTEFTU0VSVChhdG9taWNfcmVhZCgmdm9iLT52b2JfbW1hcF9jbnQpID49IDApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbmZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9uZnMuYwppbmRleCA2NTk3MmM4Li43MDkyMzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9uZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9uZnMuYwpAQCAtMzgsNyArMzgsNiBAQAogICovCiAKICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTExJVEUKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAibGxpdGVfaW50ZXJuYWwuaCIKICNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogCkBAIC03MywxMSArNzIsNiBAQAogCWZzaWQtPnZhbFsxXSA9IGtleSA+PiAzMjsKIH0KIAotc3RhdGljIGludCBsbF9uZnNfdGVzdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpvcGFxdWUpCi17Ci0JcmV0dXJuIGx1X2ZpZF9lcSgmbGxfaTJpbmZvKGlub2RlKS0+bGxpX2ZpZCwgb3BhcXVlKTsKLX0KLQogc3RydWN0IGlub2RlICpzZWFyY2hfaW5vZGVfZm9yX2x1c3RyZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKIHsKQEAgLTkyLDcgKzg2LDcgQEAKIAogCUNERUJVRyhEX0lORk8sICJzZWFyY2hpbmcgaW5vZGUgZm9yOiglbHUsIkRGSUQiKVxuIiwgaGFzaCwgUEZJRChmaWQpKTsKIAotCWlub2RlID0gaWxvb2t1cDUoc2IsIGhhc2gsIGxsX25mc190ZXN0X2lub2RlLCAodm9pZCAqKWZpZCk7CisJaW5vZGUgPSBpbG9va3VwNShzYiwgaGFzaCwgbGxfdGVzdF9pbm9kZV9ieV9maWQsICh2b2lkICopZmlkKTsKIAlpZiAoaW5vZGUpCiAJCXJldHVybiBpbm9kZTsKIApAQCAtMTUzLDEyICsxNDcsMTggQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CiAJfQogCisJcmVzdWx0ID0gZF9vYnRhaW5fYWxpYXMoaW5vZGUpOworCWlmIChJU19FUlIocmVzdWx0KSkgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKIAkvKioKLQkgKiBJdCBpcyBhbiBhbm9ueW1vdXMgZGVudHJ5IHdpdGhvdXQgT1NUIG9iamVjdHMgY3JlYXRlZCB5ZXQuCi0JICogV2UgaGF2ZSB0byBmaW5kIHRoZSBwYXJlbnQgdG8gdGVsbCBNRFMgaG93IHRvIGluaXQgbG92IG9iamVjdHMuCisJICogSW4gY2FzZSBkX29idGFpbl9hbGlhcygpIGZvdW5kIGEgZGlzY29ubmVjdGVkIGRlbnRyeSwgYWx3YXlzIHVwZGF0ZQorCSAqIGxsaV9wZmlkIHRvIGFsbG93IGxhdGVyIG9wZXJhdGlvbiAobm9ybWFsbHkgb3BlbikgaGF2ZSBwYXJlbnQgZmlkLAorCSAqIHdoaWNoIG1heSBiZSB1c2VkIGJ5IE1EUyB0byBjcmVhdGUgZGF0YS4KIAkgKi8KLQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAhbGxfaTJpbmZvKGlub2RlKS0+bGxpX2hhc19zbWQgJiYKLQkgICAgcGFyZW50ICYmICFmaWRfaXNfemVybyhwYXJlbnQpKSB7CisJaWYgKHBhcmVudCkgewogCQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKIAogCQlzcGluX2xvY2soJmxsaS0+bGxpX2xvY2spOwpAQCAtMjU1LDYgKzI1NSw4IEBACiAJCS5sZ2RfZmlkID0gbGxfaTJpbmZvKGRfaW5vZGUoY2hpbGQpKS0+bGxpX2ZpZCwKIAkJLmN0eC5hY3RvciA9IGxsX25mc19nZXRfbmFtZV9maWxsZGlyLAogCX07CisJc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7CisJX191NjQgcG9zID0gMDsKIAogCWlmICghZGlyIHx8ICFTX0lTRElSKGRpci0+aV9tb2RlKSkgewogCQlyYyA9IC1FTk9URElSOwpAQCAtMjY2LDkgKzI2OCwxOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGRpciwgZGlyLCBOVUxMLCAwLCAwLAorCQkJCSAgICAgTFVTVFJFX09QQ19BTlksIGRpcik7CisJaWYgKElTX0VSUihvcF9kYXRhKSkgeworCQlyYyA9IFBUUl9FUlIob3BfZGF0YSk7CisJCWdvdG8gb3V0OworCX0KKworCW9wX2RhdGEtPm9wX21heF9wYWdlcyA9IGxsX2kyc2JpKGRpciktPmxsX21kX2Jyd19wYWdlczsKIAlpbm9kZV9sb2NrKGRpcik7Ci0JcmMgPSBsbF9kaXJfcmVhZChkaXIsICZsZ2QuY3R4KTsKKwlyYyA9IGxsX2Rpcl9yZWFkKGRpciwgJnBvcywgb3BfZGF0YSwgJmxnZC5jdHgpOwogCWlub2RlX3VubG9jayhkaXIpOworCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOwogCWlmICghcmMgJiYgIWxnZC5sZ2RfZm91bmQpCiAJCXJjID0gLUVOT0VOVDsKIG91dDoKQEAgLTI5NywxNCArMzA4LDEyIEBACiAJcmV0dXJuIGxsX2lnZXRfZm9yX25mcyhzYiwgJm5mc19maWQtPmxuZl9wYXJlbnQsIE5VTEwpOwogfQogCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqbGxfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpkY2hpbGQpCitpbnQgbGxfZGlyX2dldF9wYXJlbnRfZmlkKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgbHVfZmlkICpwYXJlbnRfZmlkKQogewogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxID0gTlVMTDsKLQlzdHJ1Y3QgaW5vZGUJICAqZGlyID0gZF9pbm9kZShkY2hpbGQpOwogCXN0cnVjdCBsbF9zYl9pbmZvICAgICAqc2JpOwotCXN0cnVjdCBkZW50cnkJICpyZXN1bHQgPSBOVUxMOwogCXN0cnVjdCBtZHRfYm9keSAgICAgICAqYm9keTsKLQlzdGF0aWMgY2hhcgkgICBkb3Rkb3RbXSA9ICIuLiI7CisJc3RhdGljIGNvbnN0IGNoYXIgZG90ZG90W10gPSAiLi4iOwogCXN0cnVjdCBtZF9vcF9kYXRhICAgICAqb3BfZGF0YTsKIAlpbnQJCSAgIHJjOwogCWludAkJICAgICAgbG1tc2l6ZTsKQEAgLTMxOSwxMyArMzI4LDEzIEBACiAKIAlyYyA9IGxsX2dldF9kZWZhdWx0X21kc2l6ZShzYmksICZsbW1zaXplKTsKIAlpZiAocmMgIT0gMCkKLQkJcmV0dXJuIEVSUl9QVFIocmMpOworCQlyZXR1cm4gcmM7CiAKIAlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGRpciwgTlVMTCwgZG90ZG90LAogCQkJCSAgICAgc3RybGVuKGRvdGRvdCksIGxtbXNpemUsCiAJCQkJICAgICBMVVNUUkVfT1BDX0FOWSwgTlVMTCk7CiAJaWYgKElTX0VSUihvcF9kYXRhKSkKLQkJcmV0dXJuICh2b2lkICopb3BfZGF0YTsKKwkJcmV0dXJuIFBUUl9FUlIob3BfZGF0YSk7CiAKIAlyYyA9IG1kX2dldGF0dHJfbmFtZShzYmktPmxsX21kX2V4cCwgb3BfZGF0YSwgJnJlcSk7CiAJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7CkBAIC0zMzMsMjEgKzM0MiwzNiBAQAogCQlDRVJST1IoIiVzOiBmYWlsdXJlIGlub2RlICJERklEIiBnZXQgcGFyZW50OiByYyA9ICVkXG4iLAogCQkgICAgICAgbGxfZ2V0X2ZzbmFtZShkaXItPmlfc2IsIE5VTEwsIDApLAogCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoZGlyKSksIHJjKTsKLQkJcmV0dXJuIEVSUl9QVFIocmMpOworCQlyZXR1cm4gcmM7CiAJfQogCWJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOwogCS8qCiAJICogTFUtMzk1MjogTURUIG1heSBsb3N0IHRoZSBGSUQgb2YgaXRzIHBhcmVudCwgd2Ugc2hvdWxkIG5vdCBjcmFzaAogCSAqIHRoZSBORlMgc2VydmVyLCBsbF9pZ2V0X2Zvcl9uZnMoKSB3aWxsIGhhbmRsZSB0aGUgZXJyb3IuCiAJICovCi0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMSUQpIHsKKwlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMSUQpIHsKIAkJQ0RFQlVHKERfSU5GTywgInBhcmVudCBmb3IgIiBERklEICIgaXMgIiBERklEICJcbiIsCi0JCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChkaXIpKSwgUEZJRCgmYm9keS0+ZmlkMSkpOworCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoZGlyKSksIFBGSUQoJmJvZHktPm1ib19maWQxKSk7CisJCSpwYXJlbnRfZmlkID0gYm9keS0+bWJvX2ZpZDE7CiAJfQotCXJlc3VsdCA9IGxsX2lnZXRfZm9yX25mcyhkaXItPmlfc2IsICZib2R5LT5maWQxLCBOVUxMKTsKIAogCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqbGxfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpkY2hpbGQpCit7CisJc3RydWN0IGx1X2ZpZCBwYXJlbnRfZmlkID0geyAwIH07CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCWludCByYzsKKworCXJjID0gbGxfZGlyX2dldF9wYXJlbnRfZmlkKGRjaGlsZC0+ZF9pbm9kZSwgJnBhcmVudF9maWQpOworCWlmIChyYykKKwkJcmV0dXJuIEVSUl9QVFIocmMpOworCisJZGVudHJ5ID0gbGxfaWdldF9mb3JfbmZzKGRjaGlsZC0+ZF9pbm9kZS0+aV9zYiwgJnBhcmVudF9maWQsIE5VTEwpOworCisJcmV0dXJuIGRlbnRyeTsKIH0KIAogY29uc3Qgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGx1c3RyZV9leHBvcnRfb3BlcmF0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xwcm9jX2xsaXRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9scHJvY19sbGl0ZS5jCmluZGV4IGU4NmJmM2MuLjZlYWU2MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xwcm9jX2xsaXRlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbHByb2NfbGxpdGUuYwpAQCAtMzEsNyArMzEsNiBAQAogICovCiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xMSVRFCiAKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oIgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfc3VwcG9ydC5oIgpAQCAtMzU4LDE2ICszNTcsMTYgQEAKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAgICAgICpzYmkgICA9IGxsX3Myc2JpKHNiKTsKIAlzdHJ1Y3QgY2xfY2xpZW50X2NhY2hlICpjYWNoZSA9IHNiaS0+bGxfY2FjaGU7CiAJaW50IHNoaWZ0ID0gMjAgLSBQQUdFX1NISUZUOwotCWludCBtYXhfY2FjaGVkX21iOwotCWludCB1bnVzZWRfbWI7CisJbG9uZyBtYXhfY2FjaGVkX21iOworCWxvbmcgdW51c2VkX21iOwogCiAJbWF4X2NhY2hlZF9tYiA9IGNhY2hlLT5jY2NfbHJ1X21heCA+PiBzaGlmdDsKLQl1bnVzZWRfbWIgPSBhdG9taWNfcmVhZCgmY2FjaGUtPmNjY19scnVfbGVmdCkgPj4gc2hpZnQ7CisJdW51c2VkX21iID0gYXRvbWljX2xvbmdfcmVhZCgmY2FjaGUtPmNjY19scnVfbGVmdCkgPj4gc2hpZnQ7CiAJc2VxX3ByaW50ZihtLAogCQkgICAidXNlcnM6ICVkXG4iCi0JCSAgICJtYXhfY2FjaGVkX21iOiAlZFxuIgotCQkgICAidXNlZF9tYjogJWRcbiIKLQkJICAgInVudXNlZF9tYjogJWRcbiIKKwkJICAgIm1heF9jYWNoZWRfbWI6ICVsZFxuIgorCQkgICAidXNlZF9tYjogJWxkXG4iCisJCSAgICJ1bnVzZWRfbWI6ICVsZFxuIgogCQkgICAicmVjbGFpbV9jb3VudDogJXVcbiIsCiAJCSAgIGF0b21pY19yZWFkKCZjYWNoZS0+Y2NjX3VzZXJzKSwKIAkJICAgbWF4X2NhY2hlZF9tYiwKQEAgLTM4NSwxMCArMzg0LDEzIEBACiAJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX3Myc2JpKHNiKTsKIAlzdHJ1Y3QgY2xfY2xpZW50X2NhY2hlICpjYWNoZSA9IHNiaS0+bGxfY2FjaGU7CiAJc3RydWN0IGx1X2VudiAqZW52OworCWxvbmcgZGlmZiA9IDA7CisJbG9uZyBucnBhZ2VzID0gMDsKIAlpbnQgcmVmY2hlY2s7Ci0JaW50IG11bHQsIHJjLCBwYWdlc19udW1iZXI7Ci0JaW50IGRpZmYgPSAwOwotCWludCBucnBhZ2VzID0gMDsKKwlsb25nIHBhZ2VzX251bWJlcjsKKwlpbnQgbXVsdDsKKwlsb25nIHJjOworCXU2NCB2YWw7CiAJY2hhciBrZXJuYnVmWzEyOF07CiAKIAlpZiAoY291bnQgPj0gc2l6ZW9mKGtlcm5idWYpKQpAQCAtNDAxLDEwICs0MDMsMTQgQEAKIAltdWx0ID0gMSA8PCAoMjAgLSBQQUdFX1NISUZUKTsKIAlidWZmZXIgKz0gbHByb2Nmc19maW5kX25hbWVkX3ZhbHVlKGtlcm5idWYsICJtYXhfY2FjaGVkX21iOiIsICZjb3VudCkgLQogCQkgIGtlcm5idWY7Ci0JcmMgPSBscHJvY2ZzX3dyaXRlX2ZyYWNfaGVscGVyKGJ1ZmZlciwgY291bnQsICZwYWdlc19udW1iZXIsIG11bHQpOworCXJjID0gbHByb2Nmc193cml0ZV9mcmFjX3U2NF9oZWxwZXIoYnVmZmVyLCBjb3VudCwgJnZhbCwgbXVsdCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKKwlpZiAodmFsID4gTE9OR19NQVgpCisJCXJldHVybiAtRVJBTkdFOworCXBhZ2VzX251bWJlciA9IChsb25nKXZhbDsKKwogCWlmIChwYWdlc19udW1iZXIgPCAwIHx8IHBhZ2VzX251bWJlciA+IHRvdGFscmFtX3BhZ2VzKSB7CiAJCUNFUlJPUigiJXM6IGNhbid0IHNldCBtYXggY2FjaGUgbW9yZSB0aGFuICVsdSBNQlxuIiwKIAkJICAgICAgIGxsX2dldF9mc25hbWUoc2IsIE5VTEwsIDApLApAQCAtNDE4LDcgKzQyNCw3IEBACiAKIAkvKiBlYXN5IC0gYWRkIG1vcmUgTFJVIHNsb3RzLiAqLwogCWlmIChkaWZmID49IDApIHsKLQkJYXRvbWljX2FkZChkaWZmLCAmY2FjaGUtPmNjY19scnVfbGVmdCk7CisJCWF0b21pY19sb25nX2FkZChkaWZmLCAmY2FjaGUtPmNjY19scnVfbGVmdCk7CiAJCXJjID0gMDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDI5LDE4ICs0MzUsMTggQEAKIAogCWRpZmYgPSAtZGlmZjsKIAl3aGlsZSAoZGlmZiA+IDApIHsKLQkJaW50IHRtcDsKKwkJbG9uZyB0bXA7CiAKIAkJLyogcmVkdWNlIExSVSBidWRnZXQgZnJvbSBmcmVlIHNsb3RzLiAqLwogCQlkbyB7Ci0JCQlpbnQgb3YsIG52OworCQkJbG9uZyBvdiwgbnY7CiAKLQkJCW92ID0gYXRvbWljX3JlYWQoJmNhY2hlLT5jY2NfbHJ1X2xlZnQpOworCQkJb3YgPSBhdG9taWNfbG9uZ19yZWFkKCZjYWNoZS0+Y2NjX2xydV9sZWZ0KTsKIAkJCWlmIChvdiA9PSAwKQogCQkJCWJyZWFrOwogCiAJCQludiA9IG92ID4gZGlmZiA/IG92IC0gZGlmZiA6IDA7Ci0JCQlyYyA9IGF0b21pY19jbXB4Y2hnKCZjYWNoZS0+Y2NjX2xydV9sZWZ0LCBvdiwgbnYpOworCQkJcmMgPSBhdG9taWNfbG9uZ19jbXB4Y2hnKCZjYWNoZS0+Y2NjX2xydV9sZWZ0LCBvdiwgbnYpOwogCQkJaWYgKGxpa2VseShvdiA9PSByYykpIHsKIAkJCQlkaWZmIC09IG92IC0gbnY7CiAJCQkJbnJwYWdlcyArPSBvdiAtIG52OwpAQCAtNDc0LDcgKzQ4MCw3IEBACiAJCXNwaW5fdW5sb2NrKCZzYmktPmxsX2xvY2spOwogCQlyYyA9IGNvdW50OwogCX0gZWxzZSB7Ci0JCWF0b21pY19hZGQobnJwYWdlcywgJmNhY2hlLT5jY2NfbHJ1X2xlZnQpOworCQlhdG9taWNfbG9uZ19hZGQobnJwYWdlcywgJmNhY2hlLT5jY2NfbHJ1X2xlZnQpOwogCX0KIAlyZXR1cm4gcmM7CiB9CkBAIC03MzgsNiArNzQ0LDE4IEBACiB9CiBMVVNUUkVfUk9fQVRUUihtYXhfZWFzaXplKTsKIAorLyoqCisgKiBHZXQgZGVmYXVsdF9lYXNpemUuCisgKgorICogXHNlZSBjbGllbnRfb2JkOjpjbF9kZWZhdWx0X21kc19lYXNpemUKKyAqCisgKiBccGFyYW1baW5dIGtvYmoJa2VybmVsIG9iamVjdCBmb3Igc3lzZnMgdHJlZQorICogXHBhcmFtW2luXSBhdHRyCWF0dHJpYnV0ZSBvZiB0aGlzIGtlcm5lbCBvYmplY3QKKyAqIFxwYXJhbVtpbl0gYnVmCWJ1ZmZlciB0byB3cml0ZSBkYXRhIGludG8KKyAqCisgKiBccmV0dmFsIHBvc2l0aXZlCVxhIGNvdW50IG9uIHN1Y2Nlc3MKKyAqIFxyZXR2YWwgbmVnYXRpdmUJbmVnYXRlZCBlcnJubyBvbiBmYWlsdXJlCisgKi8KIHN0YXRpYyBzc2l6ZV90IGRlZmF1bHRfZWFzaXplX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCQkJICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKIAkJCQkgICBjaGFyICpidWYpCkBAIC03NTMsNyArNzcxLDQ0IEBACiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZWFsZW4pOwogfQotTFVTVFJFX1JPX0FUVFIoZGVmYXVsdF9lYXNpemUpOworCisvKioKKyAqIFNldCBkZWZhdWx0X2Vhc2l6ZS4KKyAqCisgKiBSYW5nZSBjaGVja2luZyBvbiB0aGUgcGFzc2VkIHZhbHVlIGlzIGhhbmRsZWQgYnkKKyAqIGxsX3NldF9kZWZhdWx0X21kc2l6ZSgpLgorICoKKyAqIFxzZWUgY2xpZW50X29iZDo6Y2xfZGVmYXVsdF9tZHNfZWFzaXplCisgKgorICogXHBhcmFtW2luXSBrb2JqCWtlcm5lbCBvYmplY3QgZm9yIHN5c2ZzIHRyZWUKKyAqIFxwYXJhbVtpbl0gYXR0cglhdHRyaWJ1dGUgb2YgdGhpcyBrZXJuZWwgb2JqZWN0CisgKiBccGFyYW1baW5dIGJ1ZmZlcglzdHJpbmcgcGFzc2VkIGZyb20gdXNlciBzcGFjZQorICogXHBhcmFtW2luXSBjb3VudAlcYSBidWZmZXIgbGVuZ3RoCisgKgorICogXHJldHZhbCBwb3NpdGl2ZQlcYSBjb3VudCBvbiBzdWNjZXNzCisgKiBccmV0dmFsIG5lZ2F0aXZlCW5lZ2F0ZWQgZXJybm8gb24gZmFpbHVyZQorICovCitzdGF0aWMgc3NpemVfdCBkZWZhdWx0X2Vhc2l6ZV9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY29uc3QgY2hhciAqYnVmZmVyLAorCQkJCSAgICBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgbGxfc2JfaW5mbywKKwkJCQkJICAgICAgbGxfa29iaik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJjOworCisJcmMgPSBrc3RydG91bChidWZmZXIsIDEwLCAmdmFsKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gbGxfc2V0X2RlZmF1bHRfbWRzaXplKHNiaSwgdmFsKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJldHVybiBjb3VudDsKK30KK0xVU1RSRV9SV19BVFRSKGRlZmF1bHRfZWFzaXplKTsKIAogc3RhdGljIGludCBsbF9zYmlfZmxhZ3Nfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewpAQCAtNzc0LDcgKzgyOSw3IEBACiAJCWZsYWdzID4+PSAxOwogCQkrK2k7CiAJfQotCXNlcV9wcmludGYobSwgIlxiXG4iKTsKKwlzZXFfcHV0cyhtLCAiXGJcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC04MjMsMTUgKzg3OCwxMTYgQEAKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBsbF9zYl9pbmZvLAogCQkJCQkgICAgICBsbF9rb2JqKTsKIAlzdHJ1Y3QgY2xfY2xpZW50X2NhY2hlICpjYWNoZSA9IHNiaS0+bGxfY2FjaGU7Ci0JaW50IHBhZ2VzLCBtYjsKKwlsb25nIHBhZ2VzOworCWludCBtYjsKIAotCXBhZ2VzID0gYXRvbWljX3JlYWQoJmNhY2hlLT5jY2NfdW5zdGFibGVfbnIpOworCXBhZ2VzID0gYXRvbWljX2xvbmdfcmVhZCgmY2FjaGUtPmNjY191bnN0YWJsZV9ucik7CiAJbWIgPSAocGFnZXMgKiBQQUdFX1NJWkUpID4+IDIwOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAidW5zdGFibGVfcGFnZXM6ICU4ZFxuIgotCQkJICAgICJ1bnN0YWJsZV9tYjogICAgJThkXG4iLCBwYWdlcywgbWIpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgInVuc3RhYmxlX2NoZWNrOiAgICAgJThkXG4iCisJCQkgICAgInVuc3RhYmxlX3BhZ2VzOiAlMTJsZFxuIgorCQkJICAgICJ1bnN0YWJsZV9tYjogICAgICAgICU4ZFxuIiwKKwkJCSAgICBjYWNoZS0+Y2NjX3Vuc3RhYmxlX2NoZWNrLCBwYWdlcywgbWIpOwogfQotTFVTVFJFX1JPX0FUVFIodW5zdGFibGVfc3RhdHMpOworCitzdGF0aWMgc3NpemVfdCB1bnN0YWJsZV9zdGF0c19zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY29uc3QgY2hhciAqYnVmZmVyLAorCQkJCSAgICBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgbGxfc2JfaW5mbywKKwkJCQkJICAgICAgbGxfa29iaik7CisJY2hhciBrZXJuYnVmWzEyOF07CisJaW50IHZhbCwgcmM7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gMDsKKwlpZiAoY291bnQgPj0gc2l6ZW9mKGtlcm5idWYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihrZXJuYnVmLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJa2VybmJ1Zltjb3VudF0gPSAwOworCisJYnVmZmVyICs9IGxwcm9jZnNfZmluZF9uYW1lZF92YWx1ZShrZXJuYnVmLCAidW5zdGFibGVfY2hlY2s6IiwgJmNvdW50KSAtCisJCSAga2VybmJ1ZjsKKwlyYyA9IGxwcm9jZnNfd3JpdGVfaGVscGVyKGJ1ZmZlciwgY291bnQsICZ2YWwpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIGJvcnJvdyBscnUgbG9jayB0byBzZXQgdGhlIHZhbHVlICovCisJc3Bpbl9sb2NrKCZzYmktPmxsX2NhY2hlLT5jY2NfbHJ1X2xvY2spOworCXNiaS0+bGxfY2FjaGUtPmNjY191bnN0YWJsZV9jaGVjayA9ICEhdmFsOworCXNwaW5fdW5sb2NrKCZzYmktPmxsX2NhY2hlLT5jY2NfbHJ1X2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorTFVTVFJFX1JXX0FUVFIodW5zdGFibGVfc3RhdHMpOworCitzdGF0aWMgc3NpemVfdCByb290X3NxdWFzaF9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBsbF9zYl9pbmZvLAorCQkJCQkgICAgICBsbF9rb2JqKTsKKwlzdHJ1Y3Qgcm9vdF9zcXVhc2hfaW5mbyAqc3F1YXNoID0gJnNiaS0+bGxfc3F1YXNoOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXU6JXVcbiIsIHNxdWFzaC0+cnNpX3VpZCwgc3F1YXNoLT5yc2lfZ2lkKTsKK30KKworc3RhdGljIHNzaXplX3Qgcm9vdF9zcXVhc2hfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkJIGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGxsX3NiX2luZm8sCisJCQkJCSAgICAgIGxsX2tvYmopOworCXN0cnVjdCByb290X3NxdWFzaF9pbmZvICpzcXVhc2ggPSAmc2JpLT5sbF9zcXVhc2g7CisKKwlyZXR1cm4gbHByb2Nmc193cl9yb290X3NxdWFzaChidWZmZXIsIGNvdW50LCBzcXVhc2gsCisJCQkJICAgICAgbGxfZ2V0X2ZzbmFtZShzYmktPmxsX3NiLCBOVUxMLCAwKSk7Cit9CitMVVNUUkVfUldfQVRUUihyb290X3NxdWFzaCk7CisKK3N0YXRpYyBpbnQgbGxfbm9zcXVhc2hfbmlkc19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IG0tPnByaXZhdGU7CisJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX3Myc2JpKHNiKTsKKwlzdHJ1Y3Qgcm9vdF9zcXVhc2hfaW5mbyAqc3F1YXNoID0gJnNiaS0+bGxfc3F1YXNoOworCWludCBsZW47CisKKwlkb3duX3JlYWQoJnNxdWFzaC0+cnNpX3NlbSk7CisJaWYgKCFsaXN0X2VtcHR5KCZzcXVhc2gtPnJzaV9ub3NxdWFzaF9uaWRzKSkgeworCQlsZW4gPSBjZnNfcHJpbnRfbmlkbGlzdChtLT5idWYgKyBtLT5jb3VudCwgbS0+c2l6ZSAtIG0tPmNvdW50LAorCQkJCQkmc3F1YXNoLT5yc2lfbm9zcXVhc2hfbmlkcyk7CisJCW0tPmNvdW50ICs9IGxlbjsKKwkJc2VxX3B1dHMobSwgIlxuIik7CisJfSBlbHNlIHsKKwkJc2VxX3B1dHMobSwgIk5PTkVcbiIpOworCX0KKwl1cF9yZWFkKCZzcXVhc2gtPnJzaV9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxsX25vc3F1YXNoX25pZHNfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IG0tPnByaXZhdGU7CisJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX3Myc2JpKHNiKTsKKwlzdHJ1Y3Qgcm9vdF9zcXVhc2hfaW5mbyAqc3F1YXNoID0gJnNiaS0+bGxfc3F1YXNoOworCWludCByYzsKKworCXJjID0gbHByb2Nmc193cl9ub3NxdWFzaF9uaWRzKGJ1ZmZlciwgY291bnQsIHNxdWFzaCwKKwkJCQkgICAgICBsbF9nZXRfZnNuYW1lKHNiLCBOVUxMLCAwKSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJbGxfY29tcHV0ZV9yb290c3F1YXNoX3N0YXRlKHNiaSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK0xQUk9DX1NFUV9GT1BTKGxsX25vc3F1YXNoX25pZHMpOwogCiBzdGF0aWMgc3RydWN0IGxwcm9jZnNfdmFycyBscHJvY2ZzX2xsaXRlX29iZF92YXJzW10gPSB7CiAJLyogeyAibW50cHRfcGF0aCIsICAgbGxfcmRfcGF0aCwJICAgICAwLCAwIH0sICovCkBAIC04NDAsNiArOTk2LDggQEAKIAl7ICJtYXhfY2FjaGVkX21iIiwgICAgJmxsX21heF9jYWNoZWRfbWJfZm9wcywgTlVMTCB9LAogCXsgInN0YXRhaGVhZF9zdGF0cyIsICAmbGxfc3RhdGFoZWFkX3N0YXRzX2ZvcHMsIE5VTEwsIDAgfSwKIAl7ICJzYmlfZmxhZ3MiLAkgICAgICAmbGxfc2JpX2ZsYWdzX2ZvcHMsIE5VTEwsIDAgfSwKKwl7IC5uYW1lID0JCSJub3NxdWFzaF9uaWRzIiwKKwkgIC5mb3BzID0JCSZsbF9ub3NxdWFzaF9uaWRzX2ZvcHMJCX0sCiAJeyBOVUxMIH0KIH07CiAKQEAgLTg2OSw2ICsxMDI3LDcgQEAKIAkmbHVzdHJlX2F0dHJfZGVmYXVsdF9lYXNpemUuYXR0ciwKIAkmbHVzdHJlX2F0dHJfeGF0dHJfY2FjaGUuYXR0ciwKIAkmbHVzdHJlX2F0dHJfdW5zdGFibGVfc3RhdHMuYXR0ciwKKwkmbHVzdHJlX2F0dHJfcm9vdF9zcXVhc2guYXR0ciwKIAlOVUxMLAogfTsKIApAQCAtODkzLDE3ICsxMDUyLDE3IEBACiAJLyogZmlsZSBvcGVyYXRpb24gKi8KIAl7IExQUk9DX0xMX0RJUlRZX0hJVFMsICAgICBMUFJPQ0ZTX1RZUEVfUkVHUywgImRpcnR5X3BhZ2VzX2hpdHMiIH0sCiAJeyBMUFJPQ19MTF9ESVJUWV9NSVNTRVMsICAgTFBST0NGU19UWVBFX1JFR1MsICJkaXJ0eV9wYWdlc19taXNzZXMiIH0sCi0JeyBMUFJPQ19MTF9SRUFEX0JZVEVTLCAgICAgTFBST0NGU19DTlRSX0FWR01JTk1BWHxMUFJPQ0ZTX1RZUEVfQllURVMsCisJeyBMUFJPQ19MTF9SRUFEX0JZVEVTLCAgICAgTFBST0NGU19DTlRSX0FWR01JTk1BWCB8IExQUk9DRlNfVFlQRV9CWVRFUywKIAkJCQkgICAicmVhZF9ieXRlcyIgfSwKLQl7IExQUk9DX0xMX1dSSVRFX0JZVEVTLCAgICBMUFJPQ0ZTX0NOVFJfQVZHTUlOTUFYfExQUk9DRlNfVFlQRV9CWVRFUywKKwl7IExQUk9DX0xMX1dSSVRFX0JZVEVTLCAgICBMUFJPQ0ZTX0NOVFJfQVZHTUlOTUFYIHwgTFBST0NGU19UWVBFX0JZVEVTLAogCQkJCSAgICJ3cml0ZV9ieXRlcyIgfSwKLQl7IExQUk9DX0xMX0JSV19SRUFELCAgICAgICBMUFJPQ0ZTX0NOVFJfQVZHTUlOTUFYfExQUk9DRlNfVFlQRV9QQUdFUywKKwl7IExQUk9DX0xMX0JSV19SRUFELCAgICAgICBMUFJPQ0ZTX0NOVFJfQVZHTUlOTUFYIHwgTFBST0NGU19UWVBFX1BBR0VTLAogCQkJCSAgICJicndfcmVhZCIgfSwKLQl7IExQUk9DX0xMX0JSV19XUklURSwgICAgICBMUFJPQ0ZTX0NOVFJfQVZHTUlOTUFYfExQUk9DRlNfVFlQRV9QQUdFUywKKwl7IExQUk9DX0xMX0JSV19XUklURSwgICAgICBMUFJPQ0ZTX0NOVFJfQVZHTUlOTUFYIHwgTFBST0NGU19UWVBFX1BBR0VTLAogCQkJCSAgICJicndfd3JpdGUiIH0sCi0JeyBMUFJPQ19MTF9PU0NfUkVBRCwgICAgICAgTFBST0NGU19DTlRSX0FWR01JTk1BWHxMUFJPQ0ZTX1RZUEVfQllURVMsCisJeyBMUFJPQ19MTF9PU0NfUkVBRCwgICAgICAgTFBST0NGU19DTlRSX0FWR01JTk1BWCB8IExQUk9DRlNfVFlQRV9CWVRFUywKIAkJCQkgICAib3NjX3JlYWQiIH0sCi0JeyBMUFJPQ19MTF9PU0NfV1JJVEUsICAgICAgTFBST0NGU19DTlRSX0FWR01JTk1BWHxMUFJPQ0ZTX1RZUEVfQllURVMsCisJeyBMUFJPQ19MTF9PU0NfV1JJVEUsICAgICAgTFBST0NGU19DTlRSX0FWR01JTk1BWCB8IExQUk9DRlNfVFlQRV9CWVRFUywKIAkJCQkgICAib3NjX3dyaXRlIiB9LAogCXsgTFBST0NfTExfSU9DVEwsCSAgTFBST0NGU19UWVBFX1JFR1MsICJpb2N0bCIgfSwKIAl7IExQUk9DX0xMX09QRU4sCSAgIExQUk9DRlNfVFlQRV9SRUdTLCAib3BlbiIgfSwKQEAgLTExNTAsNyArMTMwOSw3IEBACiAJCQkgICByLCBwY3QociwgcmVhZF90b3QpLCBwY3QocmVhZF9jdW0sIHJlYWRfdG90KSwKIAkJCSAgIHcsIHBjdCh3LCB3cml0ZV90b3QpLCBwY3Qod3JpdGVfY3VtLCB3cml0ZV90b3QpKTsKIAkJc3RhcnQgPSBlbmQ7Ci0JCWlmIChzdGFydCA9PSAxPDwxMCkgeworCQlpZiAoc3RhcnQgPT0gMSA8PCAxMCkgewogCQkJc3RhcnQgPSAxOwogCQkJdW5pdHMgKz0gMTA7CiAJCQl1bml0cCsrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbmFtZWkuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL25hbWVpLmMKaW5kZXggMzY2NGJmZC4uZGZhMzZkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbmFtZWkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9uYW1laS5jCkBAIC00MiwxMyArNDIsMTIgQEAKIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX3N1cHBvcnQuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9maWQuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZGxtLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfdmVyLmgiCiAjaW5jbHVkZSAibGxpdGVfaW50ZXJuYWwuaCIKIAotc3RhdGljIGludCBsbF9jcmVhdGVfaXQoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwKLQkJCWludCwgc3RydWN0IGxvb2t1cF9pbnRlbnQgKik7CitzdGF0aWMgaW50IGxsX2NyZWF0ZV9pdChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0KTsKIAogLyogY2FsbGVkIGZyb20gaWdldDVfbG9ja2VkLT5maW5kX2lub2RlKCkgdW5kZXIgaW5vZGVfaGFzaF9sb2NrIHNwaW5sb2NrICovCiBzdGF0aWMgaW50IGxsX3Rlc3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKQpAQCAtNTYsMTIgKzU1LDEyIEBACiAJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CiAJc3RydWN0IGx1c3RyZV9tZCAgICAgKm1kID0gb3BhcXVlOwogCi0JaWYgKHVubGlrZWx5KCEobWQtPmJvZHktPnZhbGlkICYgT0JEX01EX0ZMSUQpKSkgeworCWlmICh1bmxpa2VseSghKG1kLT5ib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxJRCkpKSB7CiAJCUNFUlJPUigiTURTIGJvZHkgbWlzc2luZyBGSURcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIWx1X2ZpZF9lcSgmbGxpLT5sbGlfZmlkLCAmbWQtPmJvZHktPmZpZDEpKQorCWlmICghbHVfZmlkX2VxKCZsbGktPmxsaV9maWQsICZtZC0+Ym9keS0+bWJvX2ZpZDEpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAxOwpAQCAtNzIsMjAgKzcxLDIwIEBACiAJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CiAJc3RydWN0IG1kdF9ib2R5ICpib2R5ID0gKChzdHJ1Y3QgbHVzdHJlX21kICopb3BhcXVlKS0+Ym9keTsKIAotCWlmICh1bmxpa2VseSghKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMSUQpKSkgeworCWlmICh1bmxpa2VseSghKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTElEKSkpIHsKIAkJQ0VSUk9SKCJNRFMgYm9keSBtaXNzaW5nIEZJRFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWxsaS0+bGxpX2ZpZCA9IGJvZHktPmZpZDE7Ci0JaWYgKHVubGlrZWx5KCEoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxUWVBFKSkpIHsKKwlsbGktPmxsaV9maWQgPSBib2R5LT5tYm9fZmlkMTsKKwlpZiAodW5saWtlbHkoIShib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxUWVBFKSkpIHsKIAkJQ0VSUk9SKCJDYW4gbm90IGluaXRpYWxpemUgaW5vZGUgIiBERklECiAJCSAgICAgICAiIHdpdGhvdXQgb2JqZWN0IHR5cGU6IHZhbGlkID0gJSNsbHhcbiIsCi0JCSAgICAgICBQRklEKCZsbGktPmxsaV9maWQpLCBib2R5LT52YWxpZCk7CisJCSAgICAgICBQRklEKCZsbGktPmxsaV9maWQpLCBib2R5LT5tYm9fdmFsaWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpbm9kZS0+aV9tb2RlID0gKGlub2RlLT5pX21vZGUgJiB+U19JRk1UKSB8IChib2R5LT5tb2RlICYgU19JRk1UKTsKKwlpbm9kZS0+aV9tb2RlID0gKGlub2RlLT5pX21vZGUgJiB+U19JRk1UKSB8IChib2R5LT5tYm9fbW9kZSAmIFNfSUZNVCk7CiAJaWYgKHVubGlrZWx5KGlub2RlLT5pX21vZGUgPT0gMCkpIHsKIAkJQ0VSUk9SKCJJbnZhbGlkIGlub2RlICJERklEIiB0eXBlXG4iLCBQRklEKCZsbGktPmxsaV9maWQpKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC05Niw0MSArOTUsNDUgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIEdldCBhbiBpbm9kZSBieSBpbm9kZSBudW1iZXIgKGFscmVhZHkgaW5zdGFudGlhdGVkIGJ5IHRoZSBpbnRlbnQgbG9va3VwKS4KLSAqIFJldHVybnMgaW5vZGUgb3IgTlVMTAorLyoqCisgKiBHZXQgYW4gaW5vZGUgYnkgaW5vZGUgbnVtYmVyKEBoYXNoKSwgd2hpY2ggaXMgYWxyZWFkeSBpbnN0YW50aWF0ZWQgYnkKKyAqIHRoZSBpbnRlbnQgbG9va3VwKS4KICAqLwogc3RydWN0IGlub2RlICpsbF9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGlub190IGhhc2gsCiAJCSAgICAgIHN0cnVjdCBsdXN0cmVfbWQgKm1kKQogewogCXN0cnVjdCBpbm9kZQkgKmlub2RlOworCWludCByYyA9IDA7CiAKIAlMQVNTRVJUKGhhc2ggIT0gMCk7CiAJaW5vZGUgPSBpZ2V0NV9sb2NrZWQoc2IsIGhhc2gsIGxsX3Rlc3RfaW5vZGUsIGxsX3NldF9pbm9kZSwgbWQpOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JaWYgKGlub2RlKSB7Ci0JCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7Ci0JCQlpbnQgcmMgPSAwOwotCi0JCQlsbF9yZWFkX2lub2RlMihpbm9kZSwgbWQpOwotCQkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKLQkJCSAgICAhbGxfaTJpbmZvKGlub2RlKS0+bGxpX2Nsb2IpIHsKLQkJCQlDREVCVUcoRF9JTk9ERSwKLQkJCQkgICAgICAgIiVzOiBhcHBseSBsc20gJXAgdG8gaW5vZGUgIiBERklEICIuXG4iLAotCQkJCSAgICAgICBsbF9nZXRfZnNuYW1lKHNiLCBOVUxMLCAwKSwgbWQtPmxzbSwKLQkJCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSk7Ci0JCQkJcmMgPSBjbF9maWxlX2lub2RlX2luaXQoaW5vZGUsIG1kKTsKLQkJCX0KLQkJCWlmIChyYyAhPSAwKSB7Ci0JCQkJaWdldF9mYWlsZWQoaW5vZGUpOwotCQkJCWlub2RlID0gTlVMTDsKLQkJCX0gZWxzZSB7Ci0JCQkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIChJX0ZSRUVJTkcgfCBJX0NMRUFSKSkpIHsKLQkJCWxsX3VwZGF0ZV9pbm9kZShpbm9kZSwgbWQpOwotCQkJQ0RFQlVHKERfVkZTVFJBQ0UsICJnb3QgaW5vZGU6ICJERklEIiglcClcbiIsCi0JCQkgICAgICAgUEZJRCgmbWQtPmJvZHktPmZpZDEpLCBpbm9kZSk7CisJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJcmMgPSBsbF9yZWFkX2lub2RlMihpbm9kZSwgbWQpOworCQlpZiAoIXJjICYmIFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKKwkJICAgICFsbF9pMmluZm8oaW5vZGUpLT5sbGlfY2xvYikgeworCQkJQ0RFQlVHKERfSU5PREUsICIlczogYXBwbHkgbHNtICVwIHRvIGlub2RlICJERklEIlxuIiwKKwkJCSAgICAgICBsbF9nZXRfZnNuYW1lKHNiLCBOVUxMLCAwKSwgbWQtPmxzbSwKKwkJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpKTsKKwkJCXJjID0gY2xfZmlsZV9pbm9kZV9pbml0KGlub2RlLCBtZCk7CisJCX0KKwkJaWYgKHJjKSB7CisJCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwkJCWlwdXQoaW5vZGUpOworCQkJaW5vZGUgPSBFUlJfUFRSKHJjKTsKKwkJfSBlbHNlIHsKKwkJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCQl9CisJfSBlbHNlIGlmICghKGlub2RlLT5pX3N0YXRlICYgKElfRlJFRUlORyB8IElfQ0xFQVIpKSkgeworCQlyYyA9IGxsX3VwZGF0ZV9pbm9kZShpbm9kZSwgbWQpOworCQlDREVCVUcoRF9WRlNUUkFDRSwgImdvdCBpbm9kZTogIkRGSUQiKCVwKTogcmMgPSAlZFxuIiwKKwkJICAgICAgIFBGSUQoJm1kLT5ib2R5LT5tYm9fZmlkMSksIGlub2RlLCByYyk7CisJCWlmIChyYykgeworCQkJaXB1dChpbm9kZSk7CisJCQlpbm9kZSA9IEVSUl9QVFIocmMpOwogCQl9CiAJfQogCXJldHVybiBpbm9kZTsKQEAgLTE1OCw2ICsxNjEsMTEgQEAKIAlzcGluX3VubG9jaygmZGlyLT5pX2xvY2spOwogfQogCitpbnQgbGxfdGVzdF9pbm9kZV9ieV9maWQoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKQoreworCXJldHVybiBsdV9maWRfZXEoJmxsX2kyaW5mbyhpbm9kZSktPmxsaV9maWQsIG9wYXF1ZSk7Cit9CisKIGludCBsbF9tZF9ibG9ja2luZ19hc3Qoc3RydWN0IGxkbG1fbG9jayAqbG9jaywgc3RydWN0IGxkbG1fbG9ja19kZXNjICpkZXNjLAogCQkgICAgICAgdm9pZCAqZGF0YSwgaW50IGZsYWcpCiB7CkBAIC0xOTYsNiArMjA0LDggQEAKIAkJfQogCiAJCWlmIChiaXRzICYgTURTX0lOT0RFTE9DS19YQVRUUikgeworCQkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQkJbGxfaTJpbmZvKGlub2RlKS0+bGxpX2RlZl9zdHJpcGVfb2Zmc2V0ID0gLTE7CiAJCQlsbF94YXR0cl9jYWNoZV9kZXN0cm95KGlub2RlKTsKIAkJCWJpdHMgJj0gfk1EU19JTk9ERUxPQ0tfWEFUVFI7CiAJCX0KQEAgLTI1MywxMCArMjYzLDQxIEBACiAJCX0KIAogCQlpZiAoKGJpdHMgJiBNRFNfSU5PREVMT0NLX1VQREFURSkgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewotCQkJQ0RFQlVHKERfSU5PREUsICJpbnZhbGlkYXRpbmcgaW5vZGUgIkRGSUQiXG4iLAotCQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSkpOworCQkJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CisKKwkJCUNERUJVRyhEX0lOT0RFLCAiaW52YWxpZGF0aW5nIGlub2RlICJERklEIiBsbGkgPSAlcCwgcGZpZCAgPSAiREZJRCJcbiIsCisJCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgbGxpLAorCQkJICAgICAgIFBGSUQoJmxsaS0+bGxpX3BmaWQpKTsKKwogCQkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgMCk7Ci0JCQlsbF9pbnZhbGlkYXRlX25lZ2F0aXZlX2NoaWxkcmVuKGlub2RlKTsKKworCQkJaWYgKHVubGlrZWx5KCFmaWRfaXNfemVybygmbGxpLT5sbGlfcGZpZCkpKSB7CisJCQkJc3RydWN0IGlub2RlICptYXN0ZXJfaW5vZGUgPSBOVUxMOworCQkJCXVuc2lnbmVkIGxvbmcgaGFzaDsKKworCQkJCS8qCisJCQkJICogVGhpcyBpcyBzbGF2ZSBpbm9kZSwgc2luY2UgYWxsIG9mIHRoZSBjaGlsZAorCQkJCSAqIGRlbnRyeSBpcyBjb25uZWN0ZWQgb24gdGhlIG1hc3RlciBpbm9kZSwgc28KKwkJCQkgKiB3ZSBoYXZlIHRvIGludmFsaWRhdGUgdGhlIG5lZ2F0aXZlIGNoaWxkcmVuCisJCQkJICogb24gbWFzdGVyIGlub2RlCisJCQkJICovCisJCQkJQ0RFQlVHKERfSU5PREUsICJJbnZhbGlkYXRlIHMiREZJRCIgbSJERklEIlxuIiwKKwkJCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwKKwkJCQkgICAgICAgUEZJRCgmbGxpLT5sbGlfcGZpZCkpOworCisJCQkJaGFzaCA9IGNsX2ZpZF9idWlsZF9pbm8oJmxsaS0+bGxpX3BmaWQsCisJCQkJCQkJbGxfbmVlZF8zMmJpdF9hcGkobGxfaTJzYmkoaW5vZGUpKSk7CisKKwkJCQltYXN0ZXJfaW5vZGUgPSBpbG9va3VwNShpbm9kZS0+aV9zYiwgaGFzaCwKKwkJCQkJCQlsbF90ZXN0X2lub2RlX2J5X2ZpZCwKKwkJCQkJCQkodm9pZCAqKSZsbGktPmxsaV9wZmlkKTsKKwkJCQlpZiAobWFzdGVyX2lub2RlICYmICFJU19FUlIobWFzdGVyX2lub2RlKSkgeworCQkJCQlsbF9pbnZhbGlkYXRlX25lZ2F0aXZlX2NoaWxkcmVuKG1hc3Rlcl9pbm9kZSk7CisJCQkJCWlwdXQobWFzdGVyX2lub2RlKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWxsX2ludmFsaWRhdGVfbmVnYXRpdmVfY2hpbGRyZW4oaW5vZGUpOworCQkJfQogCQl9CiAKIAkJaWYgKChiaXRzICYgKE1EU19JTk9ERUxPQ0tfTE9PS1VQIHwgTURTX0lOT0RFTE9DS19QRVJNKSkgJiYKQEAgLTMyMiw3ICszNjMsOCBAQAogCQlMQVNTRVJUKGFsaWFzICE9IGRlbnRyeSk7CiAKIAkJc3Bpbl9sb2NrKCZhbGlhcy0+ZF9sb2NrKTsKLQkJaWYgKGFsaWFzLT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkKKwkJaWYgKChhbGlhcy0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQpICYmCisJCSAgICBTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQkJLyogTEFTU0VSVChsYXN0X2Rpc2NvbiA9PSBOVUxMKTsgTFUtNDA1LCBieiAyMDA1NSAqLwogCQkJZGlzY29uX2FsaWFzID0gYWxpYXM7CiAJCWVsc2UgaWYgKGFsaWFzLT5kX3BhcmVudCA9PSBkZW50cnktPmRfcGFyZW50CSAgICAgJiYKQEAgLTM4OCw2ICs0MzAsNyBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwogCV9fdTY0IGJpdHMgPSAwOwogCWludCByYyA9IDA7CisJc3RydWN0IGRlbnRyeSAqYWxpYXM7CiAKIAkvKiBOQiAxIHJlcXVlc3QgcmVmZXJlbmNlIHdpbGwgYmUgdGFrZW4gYXdheSBieSBsbF9pbnRlbnRfbG9jaygpCiAJICogd2hlbiBJIHJldHVybgpAQCAtNDEyLDI2ICs0NTUsMTIgQEAKIAkJICovCiAJfQogCi0JLyogT25seSBoYXNoICpkZSBpZiBpdCBpcyB1bmhhc2hlZCAobmV3IGRlbnRyeSkuCi0JICogQXRvaW1jX29wZW4gbWF5IHBhc3NpbmcgaGFzaGVkIGRlbnRyaWVzIGZvciBvcGVuLgotCSAqLwotCWlmIChkX3VuaGFzaGVkKCpkZSkpIHsKLQkJc3RydWN0IGRlbnRyeSAqYWxpYXM7Ci0KLQkJYWxpYXMgPSBsbF9zcGxpY2VfYWxpYXMoaW5vZGUsICpkZSk7Ci0JCWlmIChJU19FUlIoYWxpYXMpKSB7Ci0JCQlyYyA9IFBUUl9FUlIoYWxpYXMpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJKmRlID0gYWxpYXM7Ci0JfSBlbHNlIGlmICghaXRfZGlzcG9zaXRpb24oaXQsIERJU1BfTE9PS1VQX05FRykgICYmCi0JCSAgICFpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9PUEVOX0NSRUFURSkpIHsKLQkJLyogV2l0aCBESVNQX09QRU5fQ1JFQVRFIGRlbnRyeSB3aWxsIGJlCi0JCSAqIGluc3RhbnRpYXRlZCBpbiBsbF9jcmVhdGVfaXQuCi0JCSAqLwotCQlMQVNTRVJUKCFkX2lub2RlKCpkZSkpOwotCQlkX2luc3RhbnRpYXRlKCpkZSwgaW5vZGUpOworCWFsaWFzID0gbGxfc3BsaWNlX2FsaWFzKGlub2RlLCAqZGUpOworCWlmIChJU19FUlIoYWxpYXMpKSB7CisJCXJjID0gUFRSX0VSUihhbGlhcyk7CisJCWdvdG8gb3V0OwogCX0KKwkqZGUgPSBhbGlhczsKIAogCWlmICghaXRfZGlzcG9zaXRpb24oaXQsIERJU1BfTE9PS1VQX05FRykpIHsKIAkJLyogd2UgaGF2ZSBsb29rdXAgbG9vayAtIHVuaGlkZSBkZW50cnkgKi8KQEAgLTQ0Niw5ICs0NzUsMjAgQEAKIAkJc3RydWN0IGxvb2t1cF9pbnRlbnQgcGFyZW50X2l0ID0gewogCQkJCQkuaXRfb3AgPSBJVF9HRVRBVFRSLAogCQkJCQkuaXRfbG9ja19oYW5kbGUgPSAwIH07CisJCXN0cnVjdCBsdV9maWQgZmlkID0gbGxfaTJpbmZvKHBhcmVudCktPmxsaV9maWQ7CiAKLQkJaWYgKG1kX3JldmFsaWRhdGVfbG9jayhsbF9pMm1kZXhwKHBhcmVudCksICZwYXJlbnRfaXQsCi0JCQkJICAgICAgICZsbF9pMmluZm8ocGFyZW50KS0+bGxpX2ZpZCwgTlVMTCkpIHsKKwkJLyogSWYgaXQgaXMgc3RyaXBlZCBkaXJlY3RvcnksIGdldCB0aGUgcmVhbCBzdHJpcGUgcGFyZW50ICovCisJCWlmICh1bmxpa2VseShsbF9pMmluZm8ocGFyZW50KS0+bGxpX2xzbV9tZCkpIHsKKwkJCXJjID0gbWRfZ2V0X2ZpZF9mcm9tX2xzbShsbF9pMm1kZXhwKHBhcmVudCksCisJCQkJCQkgbGxfaTJpbmZvKHBhcmVudCktPmxsaV9sc21fbWQsCisJCQkJCQkgKCpkZSktPmRfbmFtZS5uYW1lLAorCQkJCQkJICgqZGUpLT5kX25hbWUubGVuLCAmZmlkKTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisJCX0KKworCQlpZiAobWRfcmV2YWxpZGF0ZV9sb2NrKGxsX2kybWRleHAocGFyZW50KSwgJnBhcmVudF9pdCwgJmZpZCwKKwkJCQkgICAgICAgTlVMTCkpIHsKIAkJCWRfbHVzdHJlX3JldmFsaWRhdGUoKmRlKTsKIAkJCWxsX2ludGVudF9yZWxlYXNlKCZwYXJlbnRfaXQpOwogCQl9CkBAIC00NjIsMTMgKzUwMiwxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqbGxfbG9va3VwX2l0KHN0cnVjdCBpbm9kZSAqcGFyZW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCi0JCQkJICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LCBpbnQgbG9va3VwX2ZsYWdzKQorCQkJCSAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCkKIHsKIAlzdHJ1Y3QgbG9va3VwX2ludGVudCBsb29rdXBfaXQgPSB7IC5pdF9vcCA9IElUX0xPT0tVUCB9OwogCXN0cnVjdCBkZW50cnkgKnNhdmUgPSBkZW50cnksICpyZXR2YWw7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEgPSBOVUxMOworCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhID0gTlVMTDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhOwogCV9fdTMyIG9wYzsKIAlpbnQgcmM7CiAKQEAgLTQ4NCw4ICs1MjQsOCBAQAogCWlmICghaXQgfHwgaXQtPml0X29wID09IElUX0dFVFhBVFRSKQogCQlpdCA9ICZsb29rdXBfaXQ7CiAKLQlpZiAoaXQtPml0X29wID09IElUX0dFVEFUVFIpIHsKLQkJcmMgPSBsbF9zdGF0YWhlYWRfZW50ZXIocGFyZW50LCAmZGVudHJ5LCAwKTsKKwlpZiAoaXQtPml0X29wID09IElUX0dFVEFUVFIgJiYgZGVudHJ5X21heV9zdGF0YWhlYWQocGFyZW50LCBkZW50cnkpKSB7CisJCXJjID0gbGxfc3RhdGFoZWFkKHBhcmVudCwgJmRlbnRyeSwgMCk7CiAJCWlmIChyYyA9PSAxKSB7CiAJCQlpZiAoZGVudHJ5ID09IHNhdmUpCiAJCQkJcmV0dmFsID0gTlVMTDsKQEAgLTUwMSw4ICs1NDEsNyBAQAogCQlvcGMgPSBMVVNUUkVfT1BDX0FOWTsKIAogCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgcGFyZW50LCBOVUxMLCBkZW50cnktPmRfbmFtZS5uYW1lLAotCQkJCSAgICAgZGVudHJ5LT5kX25hbWUubGVuLCBsb29rdXBfZmxhZ3MsIG9wYywKLQkJCQkgICAgIE5VTEwpOworCQkJCSAgICAgZGVudHJ5LT5kX25hbWUubGVuLCAwLCBvcGMsIE5VTEwpOwogCWlmIChJU19FUlIob3BfZGF0YSkpCiAJCXJldHVybiAodm9pZCAqKW9wX2RhdGE7CiAKQEAgLTUxMCw5ICs1NDksMzggQEAKIAlpZiAoIUlTX1BPU0lYQUNMKHBhcmVudCkgfHwgIWV4cF9jb25uZWN0X3VtYXNrKGxsX2kybWRleHAocGFyZW50KSkpCiAJCWl0LT5pdF9jcmVhdGVfbW9kZSAmPSB+Y3VycmVudF91bWFzaygpOwogCi0JcmMgPSBtZF9pbnRlbnRfbG9jayhsbF9pMm1kZXhwKHBhcmVudCksIG9wX2RhdGEsIE5VTEwsIDAsIGl0LAotCQkJICAgIGxvb2t1cF9mbGFncywgJnJlcSwgbGxfbWRfYmxvY2tpbmdfYXN0LCAwKTsKLQlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKKwlyYyA9IG1kX2ludGVudF9sb2NrKGxsX2kybWRleHAocGFyZW50KSwgb3BfZGF0YSwgaXQsICZyZXEsCisJCQkgICAgJmxsX21kX2Jsb2NraW5nX2FzdCwgMCk7CisJLyoKKwkgKiBJZiB0aGUgTURTIGFsbG93cyB0aGUgY2xpZW50IHRvIGNoZ3JwIChDRlNfU0VUR1JQX1BFUk0pLCBidXQgdGhlCisJICogY2xpZW50IGRvZXMgbm90IGtub3cgd2hpY2ggc3VwcGdpZCBzaG91bGQgYmUgc2VudCB0byB0aGUgTURTLCBvcgorCSAqIHNvbWUgb3RoZXIocykgY2hhbmdlZCB0aGUgdGFyZ2V0IGZpbGUncyBHSUQgYWZ0ZXIgdGhpcyBSUEMgc2VudAorCSAqIHRvIHRoZSBNRFMgd2l0aCB0aGUgc3VwcGdpZCBhcyB0aGUgb3JpZ2luYWwgR0lELCB0aGVuIHdlIHNob3VsZAorCSAqIHRyeSBhZ2FpbiB3aXRoIHJpZ2h0IHN1cHBnaWQuCisJICovCisJaWYgKHJjID09IC1FQUNDRVMgJiYgaXQtPml0X29wICYgSVRfT1BFTiAmJgorCSAgICBpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9PUEVOX0RFTlkpKSB7CisJCXN0cnVjdCBtZHRfYm9keSAqYm9keTsKKworCQlMQVNTRVJUKHJlcSk7CisKKwkJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CisJCWlmIChvcF9kYXRhLT5vcF9zdXBwZ2lkc1swXSA9PSBib2R5LT5tYm9fZ2lkIHx8CisJCSAgICBvcF9kYXRhLT5vcF9zdXBwZ2lkc1sxXSA9PSBib2R5LT5tYm9fZ2lkIHx8CisJCSAgICAhaW5fZ3JvdXBfcChtYWtlX2tnaWQoJmluaXRfdXNlcl9ucywgYm9keS0+bWJvX2dpZCkpKSB7CisJCQlyZXR2YWwgPSBFUlJfUFRSKC1FQUNDRVMpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlmaWRfemVybygmb3BfZGF0YS0+b3BfZmlkMik7CisJCW9wX2RhdGEtPm9wX3N1cHBnaWRzWzFdID0gYm9keS0+bWJvX2dpZDsKKwkJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOworCQlyZXEgPSBOVUxMOworCQlsbF9pbnRlbnRfcmVsZWFzZShpdCk7CisJCXJjID0gbWRfaW50ZW50X2xvY2sobGxfaTJtZGV4cChwYXJlbnQpLCBvcF9kYXRhLCBpdCwgJnJlcSwKKwkJCQkgICAgbGxfbWRfYmxvY2tpbmdfYXN0LCAwKTsKKwl9CisKIAlpZiAocmMgPCAwKSB7CiAJCXJldHZhbCA9IEVSUl9QVFIocmMpOwogCQlnb3RvIG91dDsKQEAgLTUzNywxMSArNjA1LDExIEBACiAJCXJldHZhbCA9IE5VTEw7CiAJZWxzZQogCQlyZXR2YWwgPSBkZW50cnk7Ci0gb3V0OgotCWlmIChyZXEpCi0JCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKLQlpZiAoaXQtPml0X29wID09IElUX0dFVEFUVFIgJiYgKCFyZXR2YWwgfHwgcmV0dmFsID09IGRlbnRyeSkpCi0JCWxsX3N0YXRhaGVhZF9tYXJrKHBhcmVudCwgZGVudHJ5KTsKK291dDoKKwlpZiAob3BfZGF0YSAmJiAhSVNfRVJSKG9wX2RhdGEpKQorCQlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKKworCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC01NTQsMTUgKzYyMiwxOSBAQAogCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOm5hbWU9JXBkLCBkaXI9IkRGSUQiKCVwKSxmbGFncz0ldVxuIiwKIAkgICAgICAgZGVudHJ5LCBQRklEKGxsX2lub2RlMmZpZChwYXJlbnQpKSwgcGFyZW50LCBmbGFncyk7CiAKLQkvKiBPcHRpbWl6ZSBhd2F5IChDUkVBVEUgJiYgIU9QRU4pLiBMZXQgLmNyZWF0ZSBoYW5kbGUgdGhlIHJhY2UuICovCi0JaWYgKChmbGFncyAmIExPT0tVUF9DUkVBVEUpICYmICEoZmxhZ3MgJiBMT09LVVBfT1BFTikpCisJLyogT3B0aW1pemUgYXdheSAoQ1JFQVRFICYmICFPUEVOKS4gTGV0IC5jcmVhdGUgaGFuZGxlIHRoZSByYWNlLgorCSAqIGJ1dCBvbmx5IGlmIHdlIGhhdmUgd3JpdGUgcGVybWlzc2lvbnMgdGhlcmUsIG90aGVyd2lzZSB3ZSBuZWVkCisJICogdG8gcHJvY2VlZCB3aXRoIGxvb2t1cC4gTFUtNDE4NQorCSAqLworCWlmICgoZmxhZ3MgJiBMT09LVVBfQ1JFQVRFKSAmJiAhKGZsYWdzICYgTE9PS1VQX09QRU4pICYmCisJICAgIChpbm9kZV9wZXJtaXNzaW9uKHBhcmVudCwgTUFZX1dSSVRFIHwgTUFZX0VYRUMpID09IDApKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChmbGFncyAmIChMT09LVVBfUEFSRU5UfExPT0tVUF9PUEVOfExPT0tVUF9DUkVBVEUpKQorCWlmIChmbGFncyAmIChMT09LVVBfUEFSRU5UIHwgTE9PS1VQX09QRU4gfCBMT09LVVBfQ1JFQVRFKSkKIAkJaXRwID0gTlVMTDsKIAllbHNlCiAJCWl0cCA9ICZpdDsKLQlkZSA9IGxsX2xvb2t1cF9pdChwYXJlbnQsIGRlbnRyeSwgaXRwLCAwKTsKKwlkZSA9IGxsX2xvb2t1cF9pdChwYXJlbnQsIGRlbnRyeSwgaXRwKTsKIAogCWlmIChpdHApCiAJCWxsX2ludGVudF9yZWxlYXNlKGl0cCk7CkBAIC01ODAsMjcgKzY1Miw0MyBAQAogewogCXN0cnVjdCBsb29rdXBfaW50ZW50ICppdDsKIAlzdHJ1Y3QgZGVudHJ5ICpkZTsKLQlsb25nIGxvbmcgbG9va3VwX2ZsYWdzID0gTE9PS1VQX09QRU47CiAJaW50IHJjID0gMDsKIAogCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOm5hbWU9JXBkLCBkaXI9IkRGSUQiKCVwKSxmaWxlICVwLG9wZW5fZmxhZ3MgJXgsbW9kZSAleCBvcGVuZWQgJWRcbiIsCiAJICAgICAgIGRlbnRyeSwgUEZJRChsbF9pbm9kZTJmaWQoZGlyKSksIGRpciwgZmlsZSwgb3Blbl9mbGFncywgbW9kZSwKIAkgICAgICAgKm9wZW5lZCk7CiAKKwkvKiBPbmx5IG5lZ2F0aXZlIGRlbnRyaWVzIGVudGVyIGhlcmUgKi8KKwlMQVNTRVJUKCFkX2lub2RlKGRlbnRyeSkpOworCisJaWYgKCFkX2luX2xvb2t1cChkZW50cnkpKSB7CisJCS8qIEEgdmFsaWQgbmVnYXRpdmUgZGVudHJ5IHRoYXQganVzdCBwYXNzZWQgcmV2YWxpZGF0aW9uLAorCQkgKiB0aGVyZSdzIGxpdHRsZSBwb2ludCB0byB0cnkgYW5kIG9wZW4gaXQgc2VydmVyLXNpZGUsCisJCSAqIGV2ZW4gdGhvdWdoIHRoZXJlJ3MgYSBtaW51c2NsZSBjaGFuY2UgaXQgbWlnaHQgc3VjY2VlZC4KKwkJICogRWl0aGVyIHdheSBpdCdzIGEgdmFsaWQgcmFjZSB0byBqdXN0IHJldHVybiAtRU5PRU5UIGhlcmUuCisJCSAqLworCQlpZiAoIShvcGVuX2ZsYWdzICYgT19DUkVBVCkpCisJCQlyZXR1cm4gLUVOT0VOVDsKKworCQkvKiBPdGhlcndpc2Ugd2UganVzdCB1bmhhc2ggaXQgdG8gYmUgcmVoYXNoZWQgYWZyZXNoIHZpYQorCQkgKiBsb29rdXAgaWYgbmVjZXNzYXJ5CisJCSAqLworCQlkX2Ryb3AoZGVudHJ5KTsKKwl9CisKIAlpdCA9IGt6YWxsb2Moc2l6ZW9mKCppdCksIEdGUF9OT0ZTKTsKIAlpZiAoIWl0KQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWl0LT5pdF9vcCA9IElUX09QRU47Ci0JaWYgKG9wZW5fZmxhZ3MgJiBPX0NSRUFUKSB7CisJaWYgKG9wZW5fZmxhZ3MgJiBPX0NSRUFUKQogCQlpdC0+aXRfb3AgfD0gSVRfQ1JFQVQ7Ci0JCWxvb2t1cF9mbGFncyB8PSBMT09LVVBfQ1JFQVRFOwotCX0KIAlpdC0+aXRfY3JlYXRlX21vZGUgPSAobW9kZSAmIFNfSUFMTFVHTykgfCBTX0lGUkVHOwogCWl0LT5pdF9mbGFncyA9IChvcGVuX2ZsYWdzICYgfk9fQUNDTU9ERSkgfCBPUEVOX0ZNT0RFKG9wZW5fZmxhZ3MpOworCWl0LT5pdF9mbGFncyAmPSB+TURTX09QRU5fRkxfSU5URVJOQUw7CiAKIAkvKiBEZW50cnkgYWRkZWQgdG8gZGNhY2hlIHRyZWUgaW4gbGxfbG9va3VwX2l0ICovCi0JZGUgPSBsbF9sb29rdXBfaXQoZGlyLCBkZW50cnksIGl0LCBsb29rdXBfZmxhZ3MpOworCWRlID0gbGxfbG9va3VwX2l0KGRpciwgZGVudHJ5LCBpdCk7CiAJaWYgKElTX0VSUihkZSkpCiAJCXJjID0gUFRSX0VSUihkZSk7CiAJZWxzZSBpZiAoZGUpCkBAIC02MDksNyArNjk3LDcgQEAKIAlpZiAoIXJjKSB7CiAJCWlmIChpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9PUEVOX0NSRUFURSkpIHsKIAkJCS8qIERlbnRyeSBpbnN0YW50aWF0ZWQgaW4gbGxfY3JlYXRlX2l0LiAqLwotCQkJcmMgPSBsbF9jcmVhdGVfaXQoZGlyLCBkZW50cnksIG1vZGUsIGl0KTsKKwkJCXJjID0gbGxfY3JlYXRlX2l0KGRpciwgZGVudHJ5LCBpdCk7CiAJCQlpZiAocmMpIHsKIAkJCQkvKiBXZSBkZ2V0IGluIGxsX3NwbGljZV9hbGlhcy4gKi8KIAkJCQlpZiAoZGUpCkBAIC02OTUsNyArNzgzLDcgQEAKICAqIElmIHRoZSBjcmVhdGUgc3VjY2VlZHMsIHdlIGZpbGwgaW4gdGhlIGlub2RlIGluZm9ybWF0aW9uCiAgKiB3aXRoIGRfaW5zdGFudGlhdGUoKS4KICAqLwotc3RhdGljIGludCBsbF9jcmVhdGVfaXQoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCitzdGF0aWMgaW50IGxsX2NyZWF0ZV9pdChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0KQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CkBAIC03MTYsMjcgKzgwNCwyNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBsbF91cGRhdGVfdGltZXMoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0LAotCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit2b2lkIGxsX3VwZGF0ZV90aW1lcyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IG1kdF9ib2R5ICpib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxdWVzdC0+cnFfcGlsbCwKIAkJCQkJCSAgICAgICAmUk1GX01EVF9CT0RZKTsKIAogCUxBU1NFUlQoYm9keSk7Ci0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMTVRJTUUgJiYKLQkgICAgYm9keS0+bXRpbWUgPiBMVElNRV9TKGlub2RlLT5pX210aW1lKSkgeworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxNVElNRSAmJgorCSAgICBib2R5LT5tYm9fbXRpbWUgPiBMVElNRV9TKGlub2RlLT5pX210aW1lKSkgewogCQlDREVCVUcoRF9JTk9ERSwgInNldHRpbmcgZmlkICJERklEIiBtdGltZSBmcm9tICVsdSB0byAlbGx1XG4iLAogCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgTFRJTUVfUyhpbm9kZS0+aV9tdGltZSksCi0JCSAgICAgICBib2R5LT5tdGltZSk7Ci0JCUxUSU1FX1MoaW5vZGUtPmlfbXRpbWUpID0gYm9keS0+bXRpbWU7CisJCSAgICAgICBib2R5LT5tYm9fbXRpbWUpOworCQlMVElNRV9TKGlub2RlLT5pX210aW1lKSA9IGJvZHktPm1ib19tdGltZTsKIAl9Ci0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMQ1RJTUUgJiYKLQkgICAgYm9keS0+Y3RpbWUgPiBMVElNRV9TKGlub2RlLT5pX2N0aW1lKSkKLQkJTFRJTUVfUyhpbm9kZS0+aV9jdGltZSkgPSBib2R5LT5jdGltZTsKKwlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMQ1RJTUUgJiYKKwkgICAgYm9keS0+bWJvX2N0aW1lID4gTFRJTUVfUyhpbm9kZS0+aV9jdGltZSkpCisJCUxUSU1FX1MoaW5vZGUtPmlfY3RpbWUpID0gYm9keS0+bWJvX2N0aW1lOwogfQogCiBzdGF0aWMgaW50IGxsX25ld19ub2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCi0JCSAgICAgICBjb25zdCBjaGFyICp0Z3QsIGludCBtb2RlLCBpbnQgcmRldiwKKwkJICAgICAgIGNvbnN0IGNoYXIgKnRndCwgdW1vZGVfdCBtb2RlLCBpbnQgcmRldiwKIAkJICAgICAgIF9fdTMyIG9wYykKIHsKIAlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QgPSBOVUxMOwpAQCAtNzQ4LDcgKzgzNSw3IEBACiAKIAlpZiAodW5saWtlbHkodGd0KSkKIAkJdGd0X2xlbiA9IHN0cmxlbih0Z3QpICsgMTsKLQorYWdhaW46CiAJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBkaXIsIE5VTEwsCiAJCQkJICAgICBkZW50cnktPmRfbmFtZS5uYW1lLAogCQkJCSAgICAgZGVudHJ5LT5kX25hbWUubGVuLApAQCAtNzYzLDkgKzg1MCw0NSBAQAogCQkJZnJvbV9rZ2lkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfZnNnaWQoKSksCiAJCQljZnNfY3VycHJvY19jYXBfcGFjaygpLCByZGV2LCAmcmVxdWVzdCk7CiAJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7Ci0JaWYgKGVycikKKwlpZiAoZXJyIDwgMCAmJiBlcnIgIT0gLUVSRU1PVEUpCiAJCWdvdG8gZXJyX2V4aXQ7CiAKKwkvKgorCSAqIElmIHRoZSBjbGllbnQgZG9lc24ndCBrbm93IHdoZXJlIHRvIGNyZWF0ZSBhIHN1YmRpcmVjdG9yeSAob3IKKwkgKiBpbiBjYXNlIG9mIGEgcmFjZSB0aGF0IHNlbmRzIHRoZSBSUEMgdG8gdGhlIHdyb25nIE1EUyksIHRoZQorCSAqIE1EUyB3aWxsIHJldHVybiAtRVJFTU9URSBhbmQgdGhlIGNsaWVudCB3aWxsIGZldGNoIHRoZSBsYXlvdXQKKwkgKiBvZiB0aGUgZGlyZWN0b3J5LCB0aGVuIGNyZWF0ZSB0aGUgZGlyZWN0b3J5IG9uIHRoZSByaWdodCBNRFQuCisJICovCisJaWYgKHVubGlrZWx5KGVyciA9PSAtRVJFTU9URSkpIHsKKwkJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhkaXIpOworCQlzdHJ1Y3QgbG12X3VzZXJfbWQgKmx1bTsKKwkJaW50IGx1bXNpemUsIGVycjI7CisKKwkJcHRscnBjX3JlcV9maW5pc2hlZChyZXF1ZXN0KTsKKwkJcmVxdWVzdCA9IE5VTEw7CisKKwkJZXJyMiA9IGxsX2Rpcl9nZXRzdHJpcGUoZGlyLCAodm9pZCAqKikmbHVtLCAmbHVtc2l6ZSwgJnJlcXVlc3QsCisJCQkJCU9CRF9NRF9ERUZBVUxUX01FQSk7CisJCWlmICghZXJyMikgeworCQkJLyogVXBkYXRlIHN0cmlwZV9vZmZzZXQgYW5kIHJldHJ5ICovCisJCQlsbGktPmxsaV9kZWZfc3RyaXBlX29mZnNldCA9IGx1bS0+bHVtX3N0cmlwZV9vZmZzZXQ7CisJCX0gZWxzZSBpZiAoZXJyMiA9PSAtRU5PREFUQSAmJgorCQkJICAgbGxpLT5sbGlfZGVmX3N0cmlwZV9vZmZzZXQgIT0gLTEpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGVyZSBhcmUgbm8gZGVmYXVsdCBzdHJpcGUgRUEgb24gdGhlIE1EVCwgYnV0IHRoZQorCQkJICogY2xpZW50IGhhcyBkZWZhdWx0IHN0cmlwZSwgdGhlbiBpdCBwcm9iYWJseSBtZWFucworCQkJICogZGVmYXVsdCBzdHJpcGUgRUEgaGFzIGp1c3QgYmVlbiBkZWxldGVkLgorCQkJICovCisJCQlsbGktPmxsaV9kZWZfc3RyaXBlX29mZnNldCA9IC0xOworCQl9IGVsc2UgeworCQkJZ290byBlcnJfZXhpdDsKKwkJfQorCisJCXB0bHJwY19yZXFfZmluaXNoZWQocmVxdWVzdCk7CisJCXJlcXVlc3QgPSBOVUxMOworCQlnb3RvIGFnYWluOworCX0KKwogCWxsX3VwZGF0ZV90aW1lcyhyZXF1ZXN0LCBkaXIpOwogCiAJZXJyID0gbGxfcHJlcF9pbm9kZSgmaW5vZGUsIHJlcXVlc3QsIGRpci0+aV9zYiwgTlVMTCk7CkBAIC03NzQsNyArODk3LDggQEAKIAogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiBlcnJfZXhpdDoKLQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcXVlc3QpOworCWlmIChyZXF1ZXN0KQorCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcXVlc3QpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTgzNyw3NyArOTYxLDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBsbF9vYmplY3RzX2Rlc3Ryb3koc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0LCBzdHJ1Y3QgaW5vZGUgKmRpcikKLXsKLQlzdHJ1Y3QgbWR0X2JvZHkgKmJvZHk7Ci0Jc3RydWN0IGxvdl9tZHNfbWQgKmVhZGF0YTsKLQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtID0gTlVMTDsKLQlzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gb3RpID0geyAwIH07Ci0Jc3RydWN0IG9iZG8gKm9hOwotCWludCByYzsKLQotCS8qIHJlcSBpcyBzd2FiYmVkIHNvIHRoaXMgaXMgc2FmZSAqLwotCWJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXF1ZXN0LT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKLQlpZiAoIShib2R5LT52YWxpZCAmIE9CRF9NRF9GTEVBU0laRSkpCi0JCXJldHVybiAwOwotCi0JaWYgKGJvZHktPmVhZGF0YXNpemUgPT0gMCkgewotCQlDRVJST1IoIk9CRF9NRF9GTEVBU0laRSBzZXQgYnV0IGVhZGF0YXNpemUgemVyb1xuIik7Ci0JCXJjID0gLUVQUk9UTzsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogVGhlIE1EUyBzZW50IGJhY2sgdGhlIEVBIGJlY2F1c2Ugd2UgdW5saW5rZWQgdGhlIGxhc3QgcmVmZXJlbmNlCi0JICogdG8gdGhpcyBmaWxlLiBVc2UgdGhpcyBFQSB0byB1bmxpbmsgdGhlIG9iamVjdHMgb24gdGhlIE9TVC4KLQkgKiBJdCdzIG9wYXF1ZSBzbyB3ZSBkb24ndCBzd2FiIGhlcmU7IHdlIGxlYXZlIGl0IHRvIG9iZF91bnBhY2ttZCgpIHRvCi0JICogY2hlY2sgaXQgaXMgY29tcGxldGUgYW5kIHNlbnNpYmxlLgotCSAqLwotCWVhZGF0YSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9zaXplZF9nZXQoJnJlcXVlc3QtPnJxX3BpbGwsICZSTUZfTURUX01ELAotCQkJCQkgICAgICBib2R5LT5lYWRhdGFzaXplKTsKLQlMQVNTRVJUKGVhZGF0YSk7Ci0KLQlyYyA9IG9iZF91bnBhY2ttZChsbF9pMmR0ZXhwKGRpciksICZsc20sIGVhZGF0YSwgYm9keS0+ZWFkYXRhc2l6ZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDRVJST1IoIm9iZF91bnBhY2ttZDogJWRcbiIsIHJjKTsKLQkJZ290byBvdXQ7Ci0JfQotCUxBU1NFUlQocmMgPj0gc2l6ZW9mKCpsc20pKTsKLQotCW9hID0ga21lbV9jYWNoZV96YWxsb2Mob2Jkb19jYWNoZXAsIEdGUF9OT0ZTKTsKLQlpZiAoIW9hKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRfZnJlZV9tZW1tZDsKLQl9Ci0KLQlvYS0+b19vaSA9IGxzbS0+bHNtX29pOwotCW9hLT5vX21vZGUgPSBib2R5LT5tb2RlICYgU19JRk1UOwotCW9hLT5vX3ZhbGlkID0gT0JEX01EX0ZMSUQgfCBPQkRfTURfRkxUWVBFIHwgT0JEX01EX0ZMR1JPVVA7Ci0KLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxDT09LSUUpIHsKLQkJb2EtPm9fdmFsaWQgfD0gT0JEX01EX0ZMQ09PS0lFOwotCQlvdGkub3RpX2xvZ2Nvb2tpZXMgPQotCQkJcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldCgmcmVxdWVzdC0+cnFfcGlsbCwKLQkJCQkJCSAgICAgJlJNRl9MT0dDT09LSUVTLAotCQkJCQkJICAgc2l6ZW9mKHN0cnVjdCBsbG9nX2Nvb2tpZSkgKgotCQkJCQkJICAgICBsc20tPmxzbV9zdHJpcGVfY291bnQpOwotCQlpZiAoIW90aS5vdGlfbG9nY29va2llcykgewotCQkJb2EtPm9fdmFsaWQgJj0gfk9CRF9NRF9GTENPT0tJRTsKLQkJCWJvZHktPnZhbGlkICY9IH5PQkRfTURfRkxDT09LSUU7Ci0JCX0KLQl9Ci0KLQlyYyA9IG9iZF9kZXN0cm95KE5VTEwsIGxsX2kyZHRleHAoZGlyKSwgb2EsIGxzbSwgJm90aSwKLQkJCSBsbF9pMm1kZXhwKGRpcikpOwotCWlmIChyYykKLQkJQ0VSUk9SKCJvYmQgZGVzdHJveSBvYmppZCAiRE9TVElEIiBlcnJvciAlZFxuIiwKLQkJICAgICAgIFBPU1RJRCgmbHNtLT5sc21fb2kpLCByYyk7Ci1vdXRfZnJlZV9tZW1tZDoKLQlvYmRfZnJlZV9tZW1tZChsbF9pMmR0ZXhwKGRpciksICZsc20pOwotCWttZW1fY2FjaGVfZnJlZShvYmRvX2NhY2hlcCwgb2EpOwotb3V0OgotCXJldHVybiByYzsKLX0KLQogLyogbGxfdW5saW5rKCkgZG9lc24ndCB1cGRhdGUgdGhlIGlub2RlIHdpdGggdGhlIG5ldyBsaW5rIGNvdW50LgogICogSW5zdGVhZCwgbGxfZGRlbGV0ZSgpIGFuZCBsbF9kX2lwdXQoKSB3aWxsIHVwZGF0ZSBpdCBiYXNlZCB1cG9uIGlmIHRoZXJlCiAgKiBpcyBhbnkgbG9jayBleGlzdGluZy4gVGhleSB3aWxsIHJlY3ljbGUgZGVudHJpZXMgYW5kIGlub2RlcyBiYXNlZCB1cG9uIGxvY2tzCkBAIC05MjksNyArOTgyLDcgQEAKIAlpZiAoSVNfRVJSKG9wX2RhdGEpKQogCQlyZXR1cm4gUFRSX0VSUihvcF9kYXRhKTsKIAotCWlmIChkY2hpbGQgJiYgZGNoaWxkLT5kX2lub2RlKQorCWlmIChkY2hpbGQtPmRfaW5vZGUpCiAJCW9wX2RhdGEtPm9wX2ZpZDMgPSAqbGxfaW5vZGUyZmlkKGRjaGlsZC0+ZF9pbm9kZSk7CiAKIAlvcF9kYXRhLT5vcF9maWQyID0gb3BfZGF0YS0+b3BfZmlkMzsKQEAgLTk0MSw3ICs5OTQsNiBAQAogCWxsX3VwZGF0ZV90aW1lcyhyZXF1ZXN0LCBkaXIpOwogCWxsX3N0YXRzX29wc190YWxseShsbF9pMnNiaShkaXIpLCBMUFJPQ19MTF9VTkxJTkssIDEpOwogCi0JcmMgPSBsbF9vYmplY3RzX2Rlc3Ryb3kocmVxdWVzdCwgZGlyKTsKICBvdXQ6CiAJcHRscnBjX3JlcV9maW5pc2hlZChyZXF1ZXN0KTsKIAlyZXR1cm4gcmM7CkBAIC05NTYsOSArMTAwOCw5IEBACiAKIAlpZiAoIUlTX1BPU0lYQUNMKGRpcikgfHwgIWV4cF9jb25uZWN0X3VtYXNrKGxsX2kybWRleHAoZGlyKSkpCiAJCW1vZGUgJj0gfmN1cnJlbnRfdW1hc2soKTsKLQltb2RlID0gKG1vZGUgJiAoU19JUldYVUdPfFNfSVNWVFgpKSB8IFNfSUZESVI7Ci0JZXJyID0gbGxfbmV3X25vZGUoZGlyLCBkZW50cnksIE5VTEwsIG1vZGUsIDAsIExVU1RSRV9PUENfTUtESVIpOworCW1vZGUgPSAobW9kZSAmIChTX0lSV1hVR08gfCBTX0lTVlRYKSkgfCBTX0lGRElSOwogCisJZXJyID0gbGxfbmV3X25vZGUoZGlyLCBkZW50cnksIE5VTEwsIG1vZGUsIDAsIExVU1RSRV9PUENfTUtESVIpOwogCWlmICghZXJyKQogCQlsbF9zdGF0c19vcHNfdGFsbHkobGxfaTJzYmkoZGlyKSwgTFBST0NfTExfTUtESVIsIDEpOwogCkBAIC05ODEsNyArMTAzMyw3IEBACiAJaWYgKElTX0VSUihvcF9kYXRhKSkKIAkJcmV0dXJuIFBUUl9FUlIob3BfZGF0YSk7CiAKLQlpZiAoZGNoaWxkICYmIGRjaGlsZC0+ZF9pbm9kZSkKKwlpZiAoZGNoaWxkLT5kX2lub2RlKQogCQlvcF9kYXRhLT5vcF9maWQzID0gKmxsX2lub2RlMmZpZChkY2hpbGQtPmRfaW5vZGUpOwogCiAJb3BfZGF0YS0+b3BfZmlkMiA9IG9wX2RhdGEtPm9wX2ZpZDM7CkBAIC0xMDYyLDkgKzExMTQsOSBAQAogCWlmIChJU19FUlIob3BfZGF0YSkpCiAJCXJldHVybiBQVFJfRVJSKG9wX2RhdGEpOwogCi0JaWYgKHNyY19kY2hpbGQgJiYgc3JjX2RjaGlsZC0+ZF9pbm9kZSkKKwlpZiAoc3JjX2RjaGlsZC0+ZF9pbm9kZSkKIAkJb3BfZGF0YS0+b3BfZmlkMyA9ICpsbF9pbm9kZTJmaWQoc3JjX2RjaGlsZC0+ZF9pbm9kZSk7Ci0JaWYgKHRndF9kY2hpbGQgJiYgdGd0X2RjaGlsZC0+ZF9pbm9kZSkKKwlpZiAodGd0X2RjaGlsZC0+ZF9pbm9kZSkKIAkJb3BfZGF0YS0+b3BfZmlkNCA9ICpsbF9pbm9kZTJmaWQodGd0X2RjaGlsZC0+ZF9pbm9kZSk7CiAKIAllcnIgPSBtZF9yZW5hbWUoc2JpLT5sbF9tZF9leHAsIG9wX2RhdGEsCkBAIC0xMDc3LDcgKzExMjksNiBAQAogCQlsbF91cGRhdGVfdGltZXMocmVxdWVzdCwgc3JjKTsKIAkJbGxfdXBkYXRlX3RpbWVzKHJlcXVlc3QsIHRndCk7CiAJCWxsX3N0YXRzX29wc190YWxseShzYmksIExQUk9DX0xMX1JFTkFNRSwgMSk7Ci0JCWVyciA9IGxsX29iamVjdHNfZGVzdHJveShyZXF1ZXN0LCBzcmMpOwogCX0KIAogCXB0bHJwY19yZXFfZmluaXNoZWQocmVxdWVzdCk7CkBAIC0xMTAxLDEwICsxMTUyLDEwIEBACiAJLnNldGF0dHIJICAgID0gbGxfc2V0YXR0ciwKIAkuZ2V0YXR0cgkgICAgPSBsbF9nZXRhdHRyLAogCS5wZXJtaXNzaW9uCSA9IGxsX2lub2RlX3Blcm1pc3Npb24sCi0JLnNldHhhdHRyCSAgID0gbGxfc2V0eGF0dHIsCi0JLmdldHhhdHRyCSAgID0gbGxfZ2V0eGF0dHIsCisJLnNldHhhdHRyCSAgID0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJICAgPSBnZW5lcmljX2dldHhhdHRyLAogCS5saXN0eGF0dHIJICA9IGxsX2xpc3R4YXR0ciwKLQkucmVtb3ZleGF0dHIJPSBsbF9yZW1vdmV4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAogCS5nZXRfYWNsCSAgICA9IGxsX2dldF9hY2wsCiB9OwogCkBAIC0xMTEyLDkgKzExNjMsOSBAQAogCS5zZXRhdHRyCT0gbGxfc2V0YXR0ciwKIAkuZ2V0YXR0cgk9IGxsX2dldGF0dHIsCiAJLnBlcm1pc3Npb24gICAgID0gbGxfaW5vZGVfcGVybWlzc2lvbiwKLQkuc2V0eGF0dHIgICAgICAgPSBsbF9zZXR4YXR0ciwKLQkuZ2V0eGF0dHIgICAgICAgPSBsbF9nZXR4YXR0ciwKKwkuc2V0eGF0dHIgICAgICAgPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0ciAgICAgICA9IGdlbmVyaWNfZ2V0eGF0dHIsCiAJLmxpc3R4YXR0ciAgICAgID0gbGxfbGlzdHhhdHRyLAotCS5yZW1vdmV4YXR0ciAgICA9IGxsX3JlbW92ZXhhdHRyLAorCS5yZW1vdmV4YXR0ciAgICA9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiAJLmdldF9hY2wJICAgID0gbGxfZ2V0X2FjbCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9yYW5nZV9sb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9yYW5nZV9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRjODE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3JhbmdlX2xvY2suYwpAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqIEdQTCBIRUFERVIgU1RBUlQKKyAqCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkCisgKiBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBJZiBub3QsIHNlZQorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbAorICoKKyAqIEdQTCBIRUFERVIgRU5ECisgKi8KKy8qCisgKiBSYW5nZSBsb2NrIGlzIHVzZWQgdG8gYWxsb3cgbXVsdGlwbGUgdGhyZWFkcyB3cml0aW5nIGEgc2luZ2xlIHNoYXJlZAorICogZmlsZSBnaXZlbiBlYWNoIHRocmVhZCBpcyB3cml0aW5nIHRvIGEgbm9uLW92ZXJsYXBwaW5nIHBvcnRpb24gb2YgdGhlCisgKiBmaWxlLgorICoKKyAqIFJlZmVyIHRvIHRoZSBwb3NzaWJsZSB1cHN0cmVhbSBrZXJuZWwgdmVyc2lvbiBvZiByYW5nZSBsb2NrIGJ5CisgKiBKYW4gS2FyYSA8amFja0BzdXNlLmN6PjogaHR0cHM6Ly9sa21sLm9yZy9sa21sLzIwMTMvMS8zMS80ODAKKyAqCisgKiBUaGlzIGZpbGUgY291bGQgbGF0ZXIgcmVwbGFjZWQgYnkgdGhlIHVwc3RyZWFtIGtlcm5lbCB2ZXJzaW9uLgorICovCisvKgorICogQXV0aG9yOiBQcmFrYXNoIFN1cnlhIDxzdXJ5YTFAbGxubC5nb3Y+CisgKiBBdXRob3I6IEJvYmkgSmFtIDxib2JpamFtLnh1QGludGVsLmNvbT4KKyAqLworI2luY2x1ZGUgInJhbmdlX2xvY2suaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfdXNlci5oIgorCisvKioKKyAqIEluaXRpYWxpemUgYSByYW5nZSBsb2NrIHRyZWUKKyAqCisgKiBccGFyYW0gdHJlZSBbaW5dCWFuIGVtcHR5IHJhbmdlIGxvY2sgdHJlZQorICoKKyAqIFByZTogIENhbGxlciBzaG91bGQgaGF2ZSBhbGxvY2F0ZWQgdGhlIHJhbmdlIGxvY2sgdHJlZS4KKyAqIFBvc3Q6IFRoZSByYW5nZSBsb2NrIHRyZWUgaXMgcmVhZHkgdG8gZnVuY3Rpb24uCisgKi8KK3ZvaWQgcmFuZ2VfbG9ja190cmVlX2luaXQoc3RydWN0IHJhbmdlX2xvY2tfdHJlZSAqdHJlZSkKK3sKKwl0cmVlLT5ybHRfcm9vdCA9IE5VTEw7CisJdHJlZS0+cmx0X3NlcXVlbmNlID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmdHJlZS0+cmx0X2xvY2spOworfQorCisvKioKKyAqIEluaXRpYWxpemUgYSByYW5nZSBsb2NrIG5vZGUKKyAqCisgKiBccGFyYW0gbG9jayAgW2luXQlhbiBlbXB0eSByYW5nZSBsb2NrIG5vZGUKKyAqIFxwYXJhbSBzdGFydCBbaW5dCXN0YXJ0IG9mIHRoZSBjb3ZlcmluZyByZWdpb24KKyAqIFxwYXJhbSBlbmQgICBbaW5dCWVuZCBvZiB0aGUgY292ZXJpbmcgcmVnaW9uCisgKgorICogUHJlOiAgQ2FsbGVyIHNob3VsZCBoYXZlIGFsbG9jYXRlZCB0aGUgcmFuZ2UgbG9jayBub2RlLgorICogUG9zdDogVGhlIHJhbmdlIGxvY2sgbm9kZSBpcyBtZWFudCB0byBjb3ZlciBbc3RhcnQsIGVuZF0gcmVnaW9uCisgKi8KK3ZvaWQgcmFuZ2VfbG9ja19pbml0KHN0cnVjdCByYW5nZV9sb2NrICpsb2NrLCBfX3U2NCBzdGFydCwgX191NjQgZW5kKQoreworCW1lbXNldCgmbG9jay0+cmxfbm9kZSwgMCwgc2l6ZW9mKGxvY2stPnJsX25vZGUpKTsKKwlpZiAoZW5kICE9IExVU1RSRV9FT0YpCisJCWVuZCA+Pj0gUEFHRV9TSElGVDsKKwlpbnRlcnZhbF9zZXQoJmxvY2stPnJsX25vZGUsIHN0YXJ0ID4+IFBBR0VfU0hJRlQsIGVuZCk7CisJSU5JVF9MSVNUX0hFQUQoJmxvY2stPnJsX25leHRfbG9jayk7CisJbG9jay0+cmxfdGFzayA9IE5VTEw7CisJbG9jay0+cmxfbG9ja19jb3VudCA9IDA7CisJbG9jay0+cmxfYmxvY2tpbmdfcmFuZ2VzID0gMDsKKwlsb2NrLT5ybF9zZXF1ZW5jZSA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJhbmdlX2xvY2sgKm5leHRfbG9jayhzdHJ1Y3QgcmFuZ2VfbG9jayAqbG9jaykKK3sKKwlyZXR1cm4gbGlzdF9lbnRyeShsb2NrLT5ybF9uZXh0X2xvY2submV4dCwgdHlwZW9mKCpsb2NrKSwgcmxfbmV4dF9sb2NrKTsKK30KKworLyoqCisgKiBIZWxwZXIgZnVuY3Rpb24gb2YgcmFuZ2VfdW5sb2NrKCkKKyAqCisgKiBccGFyYW0gbm9kZSBbaW5dCWEgcmFuZ2UgbG9jayBmb3VuZCBvdmVybGFwcGVkIGR1cmluZyBpbnRlcnZhbCBub2RlCisgKgkJCXNlYXJjaAorICogXHBhcmFtIGFyZyBbaW5dCXRoZSByYW5nZSBsb2NrIHRvIGJlIHRlc3RlZAorICoKKyAqIFxyZXR2YWwgSU5URVJWQUxfSVRFUl9DT05UCWluZGljYXRlIHRvIGNvbnRpbnVlIHRoZSBzZWFyY2ggZm9yIG5leHQKKyAqCQkJCW92ZXJsYXBwaW5nIHJhbmdlIG5vZGUKKyAqIFxyZXR2YWwgSU5URVJWQUxfSVRFUl9TVE9QCWluZGljYXRlIHRvIHN0b3AgdGhlIHNlYXJjaAorICovCitzdGF0aWMgZW51bSBpbnRlcnZhbF9pdGVyIHJhbmdlX3VubG9ja19jYihzdHJ1Y3QgaW50ZXJ2YWxfbm9kZSAqbm9kZSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCByYW5nZV9sb2NrICpsb2NrID0gYXJnOworCXN0cnVjdCByYW5nZV9sb2NrICpvdmVybGFwID0gbm9kZTJyYW5nZWxvY2sobm9kZSk7CisJc3RydWN0IHJhbmdlX2xvY2sgKml0ZXI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ZXIsICZvdmVybGFwLT5ybF9uZXh0X2xvY2ssIHJsX25leHRfbG9jaykgeworCQlpZiAoaXRlci0+cmxfc2VxdWVuY2UgPiBsb2NrLT5ybF9zZXF1ZW5jZSkgeworCQkJLS1pdGVyLT5ybF9ibG9ja2luZ19yYW5nZXM7CisJCQlMQVNTRVJUKGl0ZXItPnJsX2Jsb2NraW5nX3JhbmdlcyA+IDApOworCQl9CisJfQorCWlmIChvdmVybGFwLT5ybF9zZXF1ZW5jZSA+IGxvY2stPnJsX3NlcXVlbmNlKSB7CisJCS0tb3ZlcmxhcC0+cmxfYmxvY2tpbmdfcmFuZ2VzOworCQlpZiAob3ZlcmxhcC0+cmxfYmxvY2tpbmdfcmFuZ2VzID09IDApCisJCQl3YWtlX3VwX3Byb2Nlc3Mob3ZlcmxhcC0+cmxfdGFzayk7CisJfQorCXJldHVybiBJTlRFUlZBTF9JVEVSX0NPTlQ7Cit9CisKKy8qKgorICogVW5sb2NrIGEgcmFuZ2UgbG9jaywgd2FrZSB1cCBsb2NrcyBibG9ja2VkIGJ5IHRoaXMgbG9jay4KKyAqCisgKiBccGFyYW0gdHJlZSBbaW5dCXJhbmdlIGxvY2sgdHJlZQorICogXHBhcmFtIGxvY2sgW2luXQlyYW5nZSBsb2NrIHRvIGJlIGRlbGV0ZWQKKyAqCisgKiBJZiB0aGlzIGxvY2sgaGFzIGJlZW4gZ3JhbnRlZCwgcmVsYXNlIGl0OyBpZiBub3QsIGp1c3QgZGVsZXRlIGl0IGZyb20KKyAqIHRoZSB0cmVlIG9yIHRoZSBzYW1lIHJlZ2lvbiBsb2NrIGxpc3QuIFdha2UgdXAgdGhvc2UgbG9ja3Mgb25seSBibG9ja2VkCisgKiBieSB0aGlzIGxvY2sgdGhyb3VnaCByYW5nZV91bmxvY2tfY2IoKS4KKyAqLwordm9pZCByYW5nZV91bmxvY2soc3RydWN0IHJhbmdlX2xvY2tfdHJlZSAqdHJlZSwgc3RydWN0IHJhbmdlX2xvY2sgKmxvY2spCit7CisJc3Bpbl9sb2NrKCZ0cmVlLT5ybHRfbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZsb2NrLT5ybF9uZXh0X2xvY2spKSB7CisJCXN0cnVjdCByYW5nZV9sb2NrICpuZXh0OworCisJCWlmIChpbnRlcnZhbF9pc19pbnRyZWUoJmxvY2stPnJsX25vZGUpKSB7IC8qIGZpcnN0IGxvY2sgKi8KKwkJCS8qIEluc2VydCB0aGUgbmV4dCBzYW1lIHJhbmdlIGxvY2sgaW50byB0aGUgdHJlZSAqLworCQkJbmV4dCA9IG5leHRfbG9jayhsb2NrKTsKKwkJCW5leHQtPnJsX2xvY2tfY291bnQgPSBsb2NrLT5ybF9sb2NrX2NvdW50IC0gMTsKKwkJCWludGVydmFsX2VyYXNlKCZsb2NrLT5ybF9ub2RlLCAmdHJlZS0+cmx0X3Jvb3QpOworCQkJaW50ZXJ2YWxfaW5zZXJ0KCZuZXh0LT5ybF9ub2RlLCAmdHJlZS0+cmx0X3Jvb3QpOworCQl9IGVsc2UgeworCQkJLyogZmluZCB0aGUgZmlyc3QgbG9jayBpbiB0cmVlICovCisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5leHQsICZsb2NrLT5ybF9uZXh0X2xvY2ssCisJCQkJCSAgICBybF9uZXh0X2xvY2spIHsKKwkJCQlpZiAoIWludGVydmFsX2lzX2ludHJlZSgmbmV4dC0+cmxfbm9kZSkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJTEFTU0VSVChuZXh0LT5ybF9sb2NrX2NvdW50ID4gMCk7CisJCQkJbmV4dC0+cmxfbG9ja19jb3VudC0tOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWxpc3RfZGVsX2luaXQoJmxvY2stPnJsX25leHRfbG9jayk7CisJfSBlbHNlIHsKKwkJTEFTU0VSVChpbnRlcnZhbF9pc19pbnRyZWUoJmxvY2stPnJsX25vZGUpKTsKKwkJaW50ZXJ2YWxfZXJhc2UoJmxvY2stPnJsX25vZGUsICZ0cmVlLT5ybHRfcm9vdCk7CisJfQorCisJaW50ZXJ2YWxfc2VhcmNoKHRyZWUtPnJsdF9yb290LCAmbG9jay0+cmxfbm9kZS5pbl9leHRlbnQsCisJCQlyYW5nZV91bmxvY2tfY2IsIGxvY2spOworCXNwaW5fdW5sb2NrKCZ0cmVlLT5ybHRfbG9jayk7Cit9CisKKy8qKgorICogSGVscGVyIGZ1bmN0aW9uIG9mIHJhbmdlX2xvY2soKQorICoKKyAqIFxwYXJhbSBub2RlIFtpbl0JYSByYW5nZSBsb2NrIGZvdW5kIG92ZXJsYXBwZWQgZHVyaW5nIGludGVydmFsIG5vZGUKKyAqCQkJc2VhcmNoCisgKiBccGFyYW0gYXJnIFtpbl0JdGhlIHJhbmdlIGxvY2sgdG8gYmUgdGVzdGVkCisgKgorICogXHJldHZhbCBJTlRFUlZBTF9JVEVSX0NPTlQJaW5kaWNhdGUgdG8gY29udGludWUgdGhlIHNlYXJjaCBmb3IgbmV4dAorICoJCQkJb3ZlcmxhcHBpbmcgcmFuZ2Ugbm9kZQorICogXHJldHZhbCBJTlRFUlZBTF9JVEVSX1NUT1AJaW5kaWNhdGUgdG8gc3RvcCB0aGUgc2VhcmNoCisgKi8KK3N0YXRpYyBlbnVtIGludGVydmFsX2l0ZXIgcmFuZ2VfbG9ja19jYihzdHJ1Y3QgaW50ZXJ2YWxfbm9kZSAqbm9kZSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCByYW5nZV9sb2NrICpsb2NrID0gKHN0cnVjdCByYW5nZV9sb2NrICopYXJnOworCXN0cnVjdCByYW5nZV9sb2NrICpvdmVybGFwID0gbm9kZTJyYW5nZWxvY2sobm9kZSk7CisKKwlsb2NrLT5ybF9ibG9ja2luZ19yYW5nZXMgKz0gb3ZlcmxhcC0+cmxfbG9ja19jb3VudCArIDE7CisJcmV0dXJuIElOVEVSVkFMX0lURVJfQ09OVDsKK30KKworLyoqCisgKiBMb2NrIGEgcmVnaW9uCisgKgorICogXHBhcmFtIHRyZWUgW2luXQlyYW5nZSBsb2NrIHRyZWUKKyAqIFxwYXJhbSBsb2NrIFtpbl0JcmFuZ2UgbG9jayBub2RlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBzcGFuCisgKgorICogXHJldHZhbCAwCWdldCB0aGUgcmFuZ2UgbG9jaworICogXHJldHZhbCA8MAllcnJvciBjb2RlIHdoaWxlIG5vdCBnZXR0aW5nIHRoZSByYW5nZSBsb2NrCisgKgorICogSWYgdGhlcmUgZXhpc3RzIG92ZXJsYXBwaW5nIHJhbmdlIGxvY2ssIHRoZSBuZXcgbG9jayB3aWxsIHdhaXQgYW5kCisgKiByZXRyeSwgaWYgbGF0ZXIgaXQgZmluZCB0aGF0IGl0IGlzIG5vdCB0aGUgY2hvc2VuIG9uZSB0byB3YWtlIHVwLAorICogaXQgd2FpdCBhZ2Fpbi4KKyAqLworaW50IHJhbmdlX2xvY2soc3RydWN0IHJhbmdlX2xvY2tfdHJlZSAqdHJlZSwgc3RydWN0IHJhbmdlX2xvY2sgKmxvY2spCit7CisJc3RydWN0IGludGVydmFsX25vZGUgKm5vZGU7CisJaW50IHJjID0gMDsKKworCXNwaW5fbG9jaygmdHJlZS0+cmx0X2xvY2spOworCS8qCisJICogV2UgbmVlZCB0byBjaGVjayBmb3IgYWxsIGNvbmZsaWN0aW5nIGludGVydmFscworCSAqIGFscmVhZHkgaW4gdGhlIHRyZWUuCisJICovCisJaW50ZXJ2YWxfc2VhcmNoKHRyZWUtPnJsdF9yb290LCAmbG9jay0+cmxfbm9kZS5pbl9leHRlbnQsCisJCQlyYW5nZV9sb2NrX2NiLCBsb2NrKTsKKwkvKgorCSAqIEluc2VydCB0byB0aGUgdHJlZSBpZiBJIGFtIHVuaXF1ZSwgb3RoZXJ3aXNlIEkndmUgYmVlbiBsaW5rZWQgdG8KKwkgKiB0aGUgcmxfbmV4dF9sb2NrIG9mIGFub3RoZXIgbG9jayB3aGljaCBoYXMgdGhlIHNhbWUgcmFuZ2UgYXMgbWluZQorCSAqIGluIHJhbmdlX2xvY2tfY2IoKS4KKwkgKi8KKwlub2RlID0gaW50ZXJ2YWxfaW5zZXJ0KCZsb2NrLT5ybF9ub2RlLCAmdHJlZS0+cmx0X3Jvb3QpOworCWlmIChub2RlKSB7CisJCXN0cnVjdCByYW5nZV9sb2NrICp0bXAgPSBub2RlMnJhbmdlbG9jayhub2RlKTsKKworCQlsaXN0X2FkZF90YWlsKCZsb2NrLT5ybF9uZXh0X2xvY2ssICZ0bXAtPnJsX25leHRfbG9jayk7CisJCXRtcC0+cmxfbG9ja19jb3VudCsrOworCX0KKwlsb2NrLT5ybF9zZXF1ZW5jZSA9ICsrdHJlZS0+cmx0X3NlcXVlbmNlOworCisJd2hpbGUgKGxvY2stPnJsX2Jsb2NraW5nX3JhbmdlcyA+IDApIHsKKwkJbG9jay0+cmxfdGFzayA9IGN1cnJlbnQ7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2soJnRyZWUtPnJsdF9sb2NrKTsKKwkJc2NoZWR1bGUoKTsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJhbmdlX3VubG9jayh0cmVlLCBsb2NrKTsKKwkJCXJjID0gLUVJTlRSOworCQkJZ290byBvdXQ7CisJCX0KKwkJc3Bpbl9sb2NrKCZ0cmVlLT5ybHRfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZ0cmVlLT5ybHRfbG9jayk7CitvdXQ6CisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcmFuZ2VfbG9jay5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcmFuZ2VfbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZDA0YTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9yYW5nZV9sb2NrLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIEdQTCBIRUFERVIgU1RBUlQKKyAqCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkCisgKiBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBJZiBub3QsIHNlZQorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbAorICoKKyAqIEdQTCBIRUFERVIgRU5ECisgKi8KKy8qCisgKiBSYW5nZSBsb2NrIGlzIHVzZWQgdG8gYWxsb3cgbXVsdGlwbGUgdGhyZWFkcyB3cml0aW5nIGEgc2luZ2xlIHNoYXJlZAorICogZmlsZSBnaXZlbiBlYWNoIHRocmVhZCBpcyB3cml0aW5nIHRvIGEgbm9uLW92ZXJsYXBwaW5nIHBvcnRpb24gb2YgdGhlCisgKiBmaWxlLgorICoKKyAqIFJlZmVyIHRvIHRoZSBwb3NzaWJsZSB1cHN0cmVhbSBrZXJuZWwgdmVyc2lvbiBvZiByYW5nZSBsb2NrIGJ5CisgKiBKYW4gS2FyYSA8amFja0BzdXNlLmN6PjogaHR0cHM6Ly9sa21sLm9yZy9sa21sLzIwMTMvMS8zMS80ODAKKyAqCisgKiBUaGlzIGZpbGUgY291bGQgbGF0ZXIgcmVwbGFjZWQgYnkgdGhlIHVwc3RyZWFtIGtlcm5lbCB2ZXJzaW9uLgorICovCisvKgorICogQXV0aG9yOiBQcmFrYXNoIFN1cnlhIDxzdXJ5YTFAbGxubC5nb3Y+CisgKiBBdXRob3I6IEJvYmkgSmFtIDxib2JpamFtLnh1QGludGVsLmNvbT4KKyAqLworI2lmbmRlZiBfUkFOR0VfTE9DS19ICisjZGVmaW5lIF9SQU5HRV9MT0NLX0gKKworI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmcy5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvaW50ZXJ2YWxfdHJlZS5oIgorCitzdHJ1Y3QgcmFuZ2VfbG9jayB7CisJc3RydWN0IGludGVydmFsX25vZGUJcmxfbm9kZTsKKwkvKioKKwkgKiBQcm9jZXNzIHRvIGVucXVldWUgdGhpcyBsb2NrLgorCSAqLworCXN0cnVjdCB0YXNrX3N0cnVjdAkqcmxfdGFzazsKKwkvKioKKwkgKiBMaXN0IG9mIGxvY2tzIHdpdGggdGhlIHNhbWUgcmFuZ2UuCisJICovCisJc3RydWN0IGxpc3RfaGVhZAlybF9uZXh0X2xvY2s7CisJLyoqCisJICogTnVtYmVyIG9mIGxvY2tzIGluIHRoZSBsaXN0IHJsX25leHRfbG9jaworCSAqLworCXVuc2lnbmVkIGludAkJcmxfbG9ja19jb3VudDsKKwkvKioKKwkgKiBOdW1iZXIgb2YgcmFuZ2VzIHdoaWNoIGFyZSBibG9ja2luZyBhY3F1aXNpdGlvbiBvZiB0aGUgbG9jaworCSAqLworCXVuc2lnbmVkIGludAkJcmxfYmxvY2tpbmdfcmFuZ2VzOworCS8qKgorCSAqIFNlcXVlbmNlIG51bWJlciBvZiByYW5nZSBsb2NrLiBUaGlzIG51bWJlciBpcyB1c2VkIHRvIGdldCB0byBrbm93CisJICogdGhlIG9yZGVyIHRoZSBsb2NrcyBhcmUgcXVldWVkOyB0aGlzIGlzIHJlcXVpcmVkIGZvciByYW5nZV9jYW5jZWwoKS4KKwkgKi8KKwlfX3U2NAkJCXJsX3NlcXVlbmNlOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmFuZ2VfbG9jayAqbm9kZTJyYW5nZWxvY2soY29uc3Qgc3RydWN0IGludGVydmFsX25vZGUgKm4pCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgcmFuZ2VfbG9jaywgcmxfbm9kZSk7Cit9CisKK3N0cnVjdCByYW5nZV9sb2NrX3RyZWUgeworCXN0cnVjdCBpbnRlcnZhbF9ub2RlCSpybHRfcm9vdDsKKwlzcGlubG9ja190CQkgcmx0X2xvY2s7CS8qIHByb3RlY3QgcmFuZ2UgbG9jayB0cmVlICovCisJX191NjQJCQkgcmx0X3NlcXVlbmNlOworfTsKKwordm9pZCByYW5nZV9sb2NrX3RyZWVfaW5pdChzdHJ1Y3QgcmFuZ2VfbG9ja190cmVlICp0cmVlKTsKK3ZvaWQgcmFuZ2VfbG9ja19pbml0KHN0cnVjdCByYW5nZV9sb2NrICpsb2NrLCBfX3U2NCBzdGFydCwgX191NjQgZW5kKTsKK2ludCAgcmFuZ2VfbG9jayhzdHJ1Y3QgcmFuZ2VfbG9ja190cmVlICp0cmVlLCBzdHJ1Y3QgcmFuZ2VfbG9jayAqbG9jayk7Cit2b2lkIHJhbmdlX3VubG9jayhzdHJ1Y3QgcmFuZ2VfbG9ja190cmVlICp0cmVlLCBzdHJ1Y3QgcmFuZ2VfbG9jayAqbG9jayk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydy5jCmluZGV4IDg3MzkzYzQuLjUwYzAxNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncuYwpAQCAtNTAsMTAgKzUwLDggQEAKIAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTElURQogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX2Nrc3VtLmgiCiAjaW5jbHVkZSAibGxpdGVfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2xpbnV4L2x1c3RyZV9jb21wYXQyNS5oIgogCiBzdGF0aWMgdm9pZCBsbF9yYV9zdGF0c19pbmNfc2JpKHN0cnVjdCBsbF9zYl9pbmZvICpzYmksIGVudW0gcmFfc3RhdCB3aGljaCk7CiAKQEAgLTQxMyw3ICs0MTEsNyBAQAogCQkJICogZm9yd2FyZCByZWFkLWFoZWFkLCBpdCB3aWxsIGJlIGZpeGVkIHdoZW4gYmFja3dhcmQKIAkJCSAqIHJlYWQtYWhlYWQgaXMgaW1wbGVtZW50ZWQKIAkJCSAqLwotCQkJTEFTU0VSVEYocGFnZV9pZHggPiByaWEtPnJpYV9zdG9mZiwgIkludmFsaWQgcGFnZV9pZHggJWx1IHJzICVsdSByZSAlbHUgcm8gJWx1IHJsICVsdSBycCAlbHVcbiIsCisJCQlMQVNTRVJURihwYWdlX2lkeCA+PSByaWEtPnJpYV9zdG9mZiwgIkludmFsaWQgcGFnZV9pZHggJWx1IHJzICVsdSByZSAlbHUgcm8gJWx1IHJsICVsdSBycCAlbHVcbiIsCiAJCQkJIHBhZ2VfaWR4LAogCQkJCSByaWEtPnJpYV9zdGFydCwgcmlhLT5yaWFfZW5kLCByaWEtPnJpYV9zdG9mZiwKIAkJCQkgcmlhLT5yaWFfbGVuZ3RoLCByaWEtPnJpYV9wYWdlcyk7CkBAIC00NzQsMTAgKzQ3MiwyMiBAQAogCX0KIAogCS8qIFJlc2VydmUgYSBwYXJ0IG9mIHRoZSByZWFkLWFoZWFkIHdpbmRvdyB0aGF0IHdlJ2xsIGJlIGlzc3VpbmcgKi8KLQlpZiAocmFzLT5yYXNfd2luZG93X2xlbikgewotCQlzdGFydCA9IHJhcy0+cmFzX25leHRfcmVhZGFoZWFkOworCWlmIChyYXMtPnJhc193aW5kb3dfbGVuID4gMCkgeworCQkvKgorCQkgKiBOb3RlOiBvdGhlciB0aHJlYWQgbWlnaHQgcm9sbGJhY2sgdGhlIHJhc19uZXh0X3JlYWRhaGVhZCwKKwkJICogaWYgaXQgY2FuIG5vdCBnZXQgdGhlIGZ1bGwgc2l6ZSBvZiBwcmVwYXJlZCBwYWdlcywgc2VlIHRoZQorCQkgKiBlbmQgb2YgdGhpcyBmdW5jdGlvbi4gRm9yIHN0cmlkZSByZWFkIGFoZWFkLCBpdCBuZWVkcyB0bworCQkgKiBtYWtlIHN1cmUgdGhlIG9mZnNldCBpcyBubyBsZXNzIHRoYW4gcmFzX3N0cmlkZV9vZmZzZXQsCisJCSAqIHNvIHRoYXQgc3RyaWRlIHJlYWQgYWhlYWQgY2FuIHdvcmsgY29ycmVjdGx5LgorCQkgKi8KKwkJaWYgKHN0cmlkZV9pb19tb2RlKHJhcykpCisJCQlzdGFydCA9IG1heChyYXMtPnJhc19uZXh0X3JlYWRhaGVhZCwKKwkJCQkgICAgcmFzLT5yYXNfc3RyaWRlX29mZnNldCk7CisJCWVsc2UKKwkJCXN0YXJ0ID0gcmFzLT5yYXNfbmV4dF9yZWFkYWhlYWQ7CiAJCWVuZCA9IHJhcy0+cmFzX3dpbmRvd19zdGFydCArIHJhcy0+cmFzX3dpbmRvd19sZW4gLSAxOwogCX0KKwogCWlmIChlbmQgIT0gMCkgewogCQl1bnNpZ25lZCBsb25nIHJwY19ib3VuZGFyeTsKIAkJLyoKQEAgLTY0OCwxMCArNjU4LDExIEBACiB7CiAJdW5zaWduZWQgbG9uZyBzdHJpZGVfZ2FwID0gaW5kZXggLSByYXMtPnJhc19sYXN0X3JlYWRwYWdlIC0gMTsKIAotCWlmICghc3RyaWRlX2lvX21vZGUocmFzKSAmJiAoc3RyaWRlX2dhcCAhPSAwIHx8Ci0JICAgIHJhcy0+cmFzX2NvbnNlY3V0aXZlX3N0cmlkZV9yZXF1ZXN0cyA9PSAwKSkgeworCWlmICgoc3RyaWRlX2dhcCAhPSAwIHx8IHJhcy0+cmFzX2NvbnNlY3V0aXZlX3N0cmlkZV9yZXF1ZXN0cyA9PSAwKSAmJgorCSAgICAhc3RyaWRlX2lvX21vZGUocmFzKSkgewogCQlyYXMtPnJhc19zdHJpZGVfcGFnZXMgPSByYXMtPnJhc19jb25zZWN1dGl2ZV9wYWdlczsKLQkJcmFzLT5yYXNfc3RyaWRlX2xlbmd0aCA9IHN0cmlkZV9nYXArcmFzLT5yYXNfY29uc2VjdXRpdmVfcGFnZXM7CisJCXJhcy0+cmFzX3N0cmlkZV9sZW5ndGggPSByYXMtPnJhc19jb25zZWN1dGl2ZV9wYWdlcyArCisJCQkJCSBzdHJpZGVfZ2FwOwogCX0KIAlMQVNTRVJUKHJhcy0+cmFzX3JlcXVlc3RfaW5kZXggPT0gMCk7CiAJTEFTU0VSVChyYXMtPnJhc19jb25zZWN1dGl2ZV9zdHJpZGVfcmVxdWVzdHMgPT0gMCk7CkBAIC02NjMsMTAgKzY3NCw5IEBACiAJfQogCiAJcmFzLT5yYXNfc3RyaWRlX3BhZ2VzID0gcmFzLT5yYXNfY29uc2VjdXRpdmVfcGFnZXM7Ci0JcmFzLT5yYXNfc3RyaWRlX2xlbmd0aCA9IHN0cmlkZV9nYXArcmFzLT5yYXNfY29uc2VjdXRpdmVfcGFnZXM7CisJcmFzLT5yYXNfc3RyaWRlX2xlbmd0aCA9IHN0cmlkZV9nYXAgKyByYXMtPnJhc19jb25zZWN1dGl2ZV9wYWdlczsKIAogCVJBU19DREVCVUcocmFzKTsKLQlyZXR1cm47CiB9CiAKIC8qIFN0cmlkZSBSZWFkLWFoZWFkIHdpbmRvdyB3aWxsIGJlIGluY3JlYXNlZCBpbmNfbGVuIGFjY29yZGluZyB0bwpAQCAtODgyLDcgKzg5Miw2IEBACiAJUkFTX0NERUJVRyhyYXMpOwogCXJhcy0+cmFzX3JlcXVlc3RfaW5kZXgrKzsKIAlzcGluX3VubG9jaygmcmFzLT5yYXNfbG9jayk7Ci0JcmV0dXJuOwogfQogCiBpbnQgbGxfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICp2bXBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQpAQCAtMTAxNSwxMSArMTAyNCwxNSBAQAogCQkgKiBpcyBjYWxsZWQgbGF0ZXIgb24uCiAJCSAqLwogCQlpZ25vcmVfbGF5b3V0ID0gMTsKKworCWlmICghbGxfaTJpbmZvKGlub2RlKS0+bGxpX2Nsb2IpCisJCXJldHVybiAwOworCiAJcmVzdWx0ID0gY2xfc3luY19maWxlX3JhbmdlKGlub2RlLCBzdGFydCwgZW5kLCBtb2RlLCBpZ25vcmVfbGF5b3V0KTsKIAlpZiAocmVzdWx0ID4gMCkgewogCQl3YmMtPm5yX3RvX3dyaXRlIC09IHJlc3VsdDsKIAkJcmVzdWx0ID0gMDsKLQkgfQorCX0KIAogCWlmICh3YmMtPnJhbmdlX2N5Y2xpYyB8fCAocmFuZ2Vfd2hvbGUgJiYgd2JjLT5ucl90b193cml0ZSA+IDApKSB7CiAJCWlmIChlbmQgPT0gT0JEX09CSkVDVF9FT0YpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydzI2LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydzI2LmMKaW5kZXggZDk4YzdhYy4uMjZmM2EzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncyNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3MjYuYwpAQCAtNTEsOSArNTEsNyBAQAogCiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xMSVRFCiAKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAibGxpdGVfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2xpbnV4L2x1c3RyZV9jb21wYXQyNS5oIgogCiAvKioKICAqIEltcGxlbWVudHMgTGludXggVk0gYWRkcmVzc19zcGFjZTo6aW52YWxpZGF0ZXBhZ2UoKSBtZXRob2QuIFRoaXMgbWV0aG9kIGlzCkBAIC0xNjEsNyArMTU5LDcgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0jZGVmaW5lIE1BWF9ESVJFQ1RJT19TSVpFICgyKjEwMjQqMTAyNCoxMDI0VUwpCisjZGVmaW5lIE1BWF9ESVJFQ1RJT19TSVpFICgyICogMTAyNCAqIDEwMjQgKiAxMDI0VUwpCiAKIHN0YXRpYyBpbmxpbmUgaW50IGxsX2dldF91c2VyX3BhZ2VzKGludCBydywgdW5zaWduZWQgbG9uZyB1c2VyX2FkZHIsCiAJCQkJICAgIHNpemVfdCBzaXplLCBzdHJ1Y3QgcGFnZSAqKipwYWdlcywKQEAgLTIxNCwxMCArMjEyLDEwIEBACiAJaW50IGk7CiAJc3NpemVfdCByYyA9IDA7CiAJbG9mZl90IGZpbGVfb2Zmc2V0ICA9IHB2LT5sZHBfc3RhcnRfb2Zmc2V0OwotCWxvbmcgc2l6ZQkgICA9IHB2LT5sZHBfc2l6ZTsKKwlzaXplX3Qgc2l6ZSA9IHB2LT5sZHBfc2l6ZTsKIAlpbnQgcGFnZV9jb3VudCAgICAgID0gcHYtPmxkcF9ucjsKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gcHYtPmxkcF9wYWdlczsKLQlsb25nIHBhZ2Vfc2l6ZSAgICAgID0gY2xfcGFnZV9zaXplKG9iaik7CisJc2l6ZV90IHBhZ2Vfc2l6ZSA9IGNsX3BhZ2Vfc2l6ZShvYmopOwogCWJvb2wgZG9faW87CiAJaW50ICBpb19wYWdlcyAgICAgICA9IDA7CiAKQEAgLTM0Niw3ICszNDQsNiBAQAogCXN0cnVjdCBjbF9pbyAqaW87CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7Ci0Jc3RydWN0IHZ2cF9vYmplY3QgKm9iaiA9IGNsX2lub2RlMnZ2cChpbm9kZSk7CiAJbG9mZl90IGZpbGVfb2Zmc2V0ID0gaW9jYi0+a2lfcG9zOwogCXNzaXplX3QgY291bnQgPSBpb3ZfaXRlcl9jb3VudChpdGVyKTsKIAlzc2l6ZV90IHRvdF9ieXRlcyA9IDAsIHJlc3VsdCA9IDA7CkBAIC0zNzUsMTQgKzM3Miw2IEBACiAJaW8gPSB2dnBfZW52X2lvKGVudiktPnZ1aV9jbC5jaXNfaW87CiAJTEFTU0VSVChpbyk7CiAKLQkvKiAwLiBOZWVkIGxvY2tpbmcgYmV0d2VlbiBidWZmZXJlZCBhbmQgZGlyZWN0IGFjY2Vzcy4gYW5kIHJhY2Ugd2l0aAotCSAqICAgIHNpemUgY2hhbmdpbmcgYnkgY29uY3VycmVudCB0cnVuY2F0ZXMgYW5kIHdyaXRlcy4KLQkgKiAxLiBOZWVkIGlub2RlIG11dGV4IHRvIG9wZXJhdGUgdHJhbnNpZW50IHBhZ2VzLgotCSAqLwotCWlmIChpb3ZfaXRlcl9ydyhpdGVyKSA9PSBSRUFEKQotCQlpbm9kZV9sb2NrKGlub2RlKTsKLQotCUxBU1NFUlQob2JqLT52b2JfdHJhbnNpZW50X3BhZ2VzID09IDApOwogCXdoaWxlIChpb3ZfaXRlcl9jb3VudChpdGVyKSkgewogCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOwogCQlzaXplX3Qgb2ZmczsKQEAgLTQzMCwxMCArNDE5LDYgQEAKIAkJZmlsZV9vZmZzZXQgKz0gcmVzdWx0OwogCX0KIG91dDoKLQlMQVNTRVJUKG9iai0+dm9iX3RyYW5zaWVudF9wYWdlcyA9PSAwKTsKLQlpZiAoaW92X2l0ZXJfcncoaXRlcikgPT0gUkVBRCkKLQkJaW5vZGVfdW5sb2NrKGlub2RlKTsKLQogCWlmICh0b3RfYnl0ZXMgPiAwKSB7CiAJCXN0cnVjdCB2dnBfaW8gKnZpbyA9IHZ2cF9lbnZfaW8oZW52KTsKIApAQCAtNjE2LDYgKzYwMSwxMyBAQAogCQkJTEFTU0VSVChmcm9tID09IDApOwogCQl2aW8tPnUud3JpdGUudnVpX3RvID0gZnJvbSArIGNvcGllZDsKIAorCQkvKgorCQkgKiBUbyBhZGRyZXNzIHRoZSBkZWFkbG9jayBpbiBiYWxhbmNlX2RpcnR5X3BhZ2VzKCkgd2hlcmUKKwkJICogdGhpcyBkaXJ0eSBwYWdlIG1heSBiZSB3cml0dGVuIGJhY2sgaW4gdGhlIHNhbWUgdGhyZWFkLgorCQkgKi8KKwkJaWYgKFBhZ2VEaXJ0eSh2bXBhZ2UpKQorCQkJdW5wbHVnID0gdHJ1ZTsKKwogCQkvKiBXZSBtYXkgaGF2ZSBvbmUgZnVsbCBSUEMsIGNvbW1pdCBpdCBzb29uICovCiAJCWlmIChwbGlzdC0+cGxfbnIgPj0gUFRMUlBDX01BWF9CUldfUEFHRVMpCiAJCQl1bnBsdWcgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3RhdGFoZWFkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zdGF0YWhlYWQuYwppbmRleCBjMWNiNmIxLi4wNjc3NTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zdGF0YWhlYWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zdGF0YWhlYWQuYwpAQCAtMzksNyArMzksNiBAQAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTElURQogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfc3VwcG9ydC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9kbG0uaCIKICNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgogCkBAIC01MCwyNCArNDksMjYgQEAKIAlTQV9FTlRSWV9JTklUID0gMCwgICAgICAvKiogaW5pdCBlbnRyeSAqLwogCVNBX0VOVFJZX1NVQ0MgPSAxLCAgICAgIC8qKiBzdGF0IHN1Y2NlZWQgKi8KIAlTQV9FTlRSWV9JTlZBID0gMiwgICAgICAvKiogaW52YWxpZCBlbnRyeSAqLwotCVNBX0VOVFJZX0RFU1QgPSAzLCAgICAgIC8qKiBlbnRyeSB0byBiZSBkZXN0cm95ZWQgKi8KIH07CiAKLXN0cnVjdCBsbF9zYV9lbnRyeSB7Ci0JLyogbGluayBpbnRvIHNhaS0+c2FpX2VudHJpZXMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgIHNlX2xpbms7Ci0JLyogbGluayBpbnRvIHNhaS0+c2FpX2VudHJpZXNfe3JlY2VpdmVkLHN0YXRlZH0gKi8KKy8qCisgKiBzYV9lbnRyeSBpcyBub3QgcmVmY291bnRlZDogc3RhdGFoZWFkIHRocmVhZCBhbGxvY2F0ZXMgaXQgYW5kIGRvIGFzeW5jIHN0YXQsCisgKiBhbmQgaW4gYXN5bmMgc3RhdCBjYWxsYmFjayBsbF9zdGF0YWhlYWRfaW50ZXJwcmV0KCkgd2lsbCBhZGQgaXQgaW50bworICogc2FpX2ludGVyaW1fZW50cmllcywgbGF0ZXIgc3RhdGFoZWFkIHRocmVhZCB3aWxsIGNhbGwgc2FfaGFuZGxlX2NhbGxiYWNrKCkgdG8KKyAqIGluc3RhbnRpYXRlIGVudHJ5IGFuZCBtb3ZlIGl0IGludG8gc2FpX2VudHJpZXMsIGFuZCB0aGVuIG9ubHkgc2Nhbm5lciBwcm9jZXNzCisgKiBjYW4gYWNjZXNzIGFuZCBmcmVlIGl0LgorICovCitzdHJ1Y3Qgc2FfZW50cnkgeworCS8qIGxpbmsgaW50byBzYWlfaW50ZXJpbV9lbnRyaWVzIG9yIHNhaV9lbnRyaWVzICovCiAJc3RydWN0IGxpc3RfaGVhZAkgICAgICBzZV9saXN0OwogCS8qIGxpbmsgaW50byBzYWkgaGFzaCB0YWJsZSBsb2NhbGx5ICovCiAJc3RydWN0IGxpc3RfaGVhZAkgICAgICBzZV9oYXNoOwotCS8qIGVudHJ5IHJlZmVyZW5jZSBjb3VudCAqLwotCWF0b21pY190CSAgICBzZV9yZWZjb3VudDsKIAkvKiBlbnRyeSBpbmRleCBpbiB0aGUgc2FpICovCiAJX191NjQJCSAgIHNlX2luZGV4OwogCS8qIGxvdyBsYXllciBsZGxtIGxvY2sgaGFuZGxlICovCiAJX191NjQJCSAgIHNlX2hhbmRsZTsKIAkvKiBlbnRyeSBzdGF0dXMgKi8KLQllbnVtIHNlX3N0YXQJICAgc2Vfc3RhdDsKKwllbnVtIHNlX3N0YXQJCXNlX3N0YXRlOwogCS8qIGVudHJ5IHNpemUsIGNvbnRhaW5zIG5hbWUgKi8KIAlpbnQJCSAgICAgc2Vfc2l6ZTsKIAkvKiBwb2ludGVyIHRvIGFzeW5jIGdldGF0dHIgZW5xdWV1ZSBpbmZvICovCkBAIC04MywyNyArODQsMjQgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2FpX2dlbmVyYXRpb247CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNhaV9nZW5lcmF0aW9uX2xvY2spOwogCi0vKgotICogVGhlIGVudHJ5IG9ubHkgY2FuIGJlIHJlbGVhc2VkIGJ5IHRoZSBjYWxsZXIsIGl0IGlzIG5lY2Vzc2FyeSB0byBob2xkIGxvY2suCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGxsX3NhX2VudHJ5X3N0YXRlZChzdHJ1Y3QgbGxfc2FfZW50cnkgKmVudHJ5KQorLyogc2FfZW50cnkgaXMgcmVhZHkgdG8gdXNlICovCitzdGF0aWMgaW5saW5lIGludCBzYV9yZWFkeShzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5KQogewogCXNtcF9ybWIoKTsKLQlyZXR1cm4gKGVudHJ5LT5zZV9zdGF0ICE9IFNBX0VOVFJZX0lOSVQpOworCXJldHVybiAoZW50cnktPnNlX3N0YXRlICE9IFNBX0VOVFJZX0lOSVQpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBsbF9zYV9lbnRyeV9oYXNoKGludCB2YWwpCisvKiBoYXNoIHZhbHVlIHRvIHB1dCBpbiBzYWlfY2FjaGUgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNhX2hhc2goaW50IHZhbCkKIHsKIAlyZXR1cm4gdmFsICYgTExfU0FfQ0FDSEVfTUFTSzsKIH0KIAotLyoKLSAqIEluc2VydCBlbnRyeSB0byBoYXNoIFNBIHRhYmxlLgotICovCisvKiBoYXNoIGVudHJ5IGludG8gc2FpX2NhY2hlICovCiBzdGF0aWMgaW5saW5lIHZvaWQKLWxsX3NhX2VudHJ5X2VuaGFzaChzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgc3RydWN0IGxsX3NhX2VudHJ5ICplbnRyeSkKK3NhX3JlaGFzaChzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgc3RydWN0IHNhX2VudHJ5ICplbnRyeSkKIHsKLQlpbnQgaSA9IGxsX3NhX2VudHJ5X2hhc2goZW50cnktPnNlX3FzdHIuaGFzaCk7CisJaW50IGkgPSBzYV9oYXNoKGVudHJ5LT5zZV9xc3RyLmhhc2gpOwogCiAJc3Bpbl9sb2NrKCZzYWktPnNhaV9jYWNoZV9sb2NrW2ldKTsKIAlsaXN0X2FkZF90YWlsKCZlbnRyeS0+c2VfaGFzaCwgJnNhaS0+c2FpX2NhY2hlW2ldKTsKQEAgLTExNCw5ICsxMTIsOSBAQAogICogUmVtb3ZlIGVudHJ5IGZyb20gU0EgdGFibGUuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotbGxfc2FfZW50cnlfdW5oYXNoKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBzdHJ1Y3QgbGxfc2FfZW50cnkgKmVudHJ5KQorc2FfdW5oYXNoKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5KQogewotCWludCBpID0gbGxfc2FfZW50cnlfaGFzaChlbnRyeS0+c2VfcXN0ci5oYXNoKTsKKwlpbnQgaSA9IHNhX2hhc2goZW50cnktPnNlX3FzdHIuaGFzaCk7CiAKIAlzcGluX2xvY2soJnNhaS0+c2FpX2NhY2hlX2xvY2tbaV0pOwogCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5zZV9oYXNoKTsKQEAgLTEyOSwxOSArMTI3LDIxIEBACiAJcmV0dXJuIChpbm9kZSAmJiBTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmIHNhaS0+c2FpX2FnbF92YWxpZCk7CiB9CiAKKy8qIHN0YXRhaGVhZCB3aW5kb3cgaXMgZnVsbCAqLwogc3RhdGljIGlubGluZSBpbnQgc2Ffc2VudF9mdWxsKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpKQogewogCXJldHVybiBhdG9taWNfcmVhZCgmc2FpLT5zYWlfY2FjaGVfY291bnQpID49IHNhaS0+c2FpX21heDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2FfcmVjZWl2ZWRfZW1wdHkoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkpCisvKiBnb3QgYXN5bmMgc3RhdCByZXBsaWVzICovCitzdGF0aWMgaW5saW5lIGludCBzYV9oYXNfY2FsbGJhY2soc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkpCiB7Ci0JcmV0dXJuIGxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfcmVjZWl2ZWQpOworCXJldHVybiAhbGlzdF9lbXB0eSgmc2FpLT5zYWlfaW50ZXJpbV9lbnRyaWVzKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYWdsX2xpc3RfZW1wdHkoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkpCiB7Ci0JcmV0dXJuIGxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfYWdsKTsKKwlyZXR1cm4gbGlzdF9lbXB0eSgmc2FpLT5zYWlfYWdscyk7CiB9CiAKIC8qKgpAQCAtMTU3LDcgKzE1Nyw3IEBACiB9CiAKIC8qCi0gKiBJZiB0aGUgZ2l2ZW4gaW5kZXggaXMgYmVoaW5kIG9mIHN0YXRhaGVhZCB3aW5kb3cgbW9yZSB0aGFuCisgKiBpZiB0aGUgZ2l2ZW4gaW5kZXggaXMgYmVoaW5kIG9mIHN0YXRhaGVhZCB3aW5kb3cgbW9yZSB0aGFuCiAgKiBTQV9PTUlUVEVEX0VOVFJZX01BWCwgdGhlbiBpdCBpcyBvbGQuCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGlzX29taXR0ZWRfZW50cnkoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIF9fdTY0IGluZGV4KQpAQCAtMTY2LDIwICsxNjYsMTcgQEAKIAkJIHNhaS0+c2FpX2luZGV4KTsKIH0KIAotLyoKLSAqIEluc2VydCBpdCBpbnRvIHNhaV9lbnRyaWVzIHRhaWwgd2hlbiBpbml0LgotICovCi1zdGF0aWMgc3RydWN0IGxsX3NhX2VudHJ5ICoKLWxsX3NhX2VudHJ5X2FsbG9jKHN0cnVjdCBkZW50cnkgKnBhcmVudCwKLQkJICBzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgX191NjQgaW5kZXgsCi0JCSAgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKKy8qIGFsbG9jYXRlIHNhX2VudHJ5IGFuZCBoYXNoIGl0IHRvIGFsbG93IHNjYW5uZXIgcHJvY2VzcyB0byBmaW5kIGl0ICovCitzdGF0aWMgc3RydWN0IHNhX2VudHJ5ICoKK3NhX2FsbG9jKHN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIF9fdTY0IGluZGV4LAorCSBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQogewogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGk7Ci0Jc3RydWN0IGxsX3NhX2VudHJ5ICAgKmVudHJ5OworCXN0cnVjdCBzYV9lbnRyeSAgICplbnRyeTsKIAlpbnQJCSAgIGVudHJ5X3NpemU7CiAJY2hhcgkJICpkbmFtZTsKIAotCWVudHJ5X3NpemUgPSBzaXplb2Yoc3RydWN0IGxsX3NhX2VudHJ5KSArIChsZW4gJiB+MykgKyA0OworCWVudHJ5X3NpemUgPSBzaXplb2Yoc3RydWN0IHNhX2VudHJ5KSArIChsZW4gJiB+MykgKyA0OwogCWVudHJ5ID0ga3phbGxvYyhlbnRyeV9zaXplLCBHRlBfTk9GUyk7CiAJaWYgKHVubGlrZWx5KCFlbnRyeSkpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwpAQCAtMTg4LDM0ICsxODUsOSBAQAogCSAgICAgICBsZW4sIG5hbWUsIGVudHJ5LCBpbmRleCk7CiAKIAllbnRyeS0+c2VfaW5kZXggPSBpbmRleDsKLQotCS8qCi0JICogU3RhdGFoZWFkIGVudHJ5IHJlZmVyZW5jZSBydWxlczoKLQkgKgotCSAqIDEpIFdoZW4gc3RhdGFoZWFkIGVudHJ5IGlzIGluaXRpYWxpemVkLCBpdHMgcmVmZXJlbmNlIGlzIHNldCBhcyAyLgotCSAqICAgIE9uZSByZWZlcmVuY2UgaXMgdXNlZCBieSB0aGUgZGlyZWN0b3J5IHNjYW5uZXIuIFdoZW4gdGhlIHNjYW5uZXIKLQkgKiAgICBzZWFyY2hlcyB0aGUgc3RhdGFoZWFkIGNhY2hlIGZvciB0aGUgZ2l2ZW4gbmFtZSwgaXQgY2FuIHBlcmZvcm0KLQkgKiAgICBsb2NrbGVzcyBoYXNoIGxvb2t1cCAob25seSB0aGUgc2Nhbm5lciBjYW4gcmVtb3ZlIGVudHJ5IGZyb20gaGFzaAotCSAqICAgIGxpc3QpLCBhbmQgb25jZSBmb3VuZCwgaXQgbmVlZG4ndCB0byBjYWxsICJhdG9taWNfaW5jKCkiIGZvciB0aGUKLQkgKiAgICBlbnRyeSByZWZlcmVuY2UuIFNvIHRoZSBwZXJmb3JtYW5jZSBpcyBpbXByb3ZlZC4gQWZ0ZXIgdXNpbmcgdGhlCi0JICogICAgc3RhdGFoZWFkIGVudHJ5LCB0aGUgc2Nhbm5lciB3aWxsIGNhbGwgImF0b21pY19kZWMoKSIgdG8gZHJvcCB0aGUKLQkgKiAgICByZWZlcmVuY2UgaGVsZCB3aGVuIGluaXRpYWxpemF0aW9uLiBJZiBpdCBpcyB0aGUgbGFzdCByZWZlcmVuY2UsCi0JICogICAgdGhlIHN0YXRhaGVhZCBlbnRyeSB3aWxsIGJlIGZyZWVkLgotCSAqCi0JICogMikgQWxsIG90aGVyIHRocmVhZHMsIGluY2x1ZGluZyBzdGF0YWhlYWQgdGhyZWFkIGFuZCBwdGxycGNkIHRocmVhZCwKLQkgKiAgICB3aGVuIHRoZXkgcHJvY2VzcyB0aGUgc3RhdGFoZWFkIGVudHJ5LCB0aGUgcmVmZXJlbmNlIGZvciB0YXJnZXQKLQkgKiAgICBzaG91bGQgYmUgaGVsZCB0byBndWFyYW50ZWUgdGhlIGVudHJ5IHdpbGwgbm90IGJlIHJlbGVhc2VkIGJ5IHRoZQotCSAqICAgIGRpcmVjdG9yeSBzY2FubmVyLiBBZnRlciBwcm9jZXNzaW5nIHRoZSBlbnRyeSwgdGhlc2UgdGhyZWFkcyB3aWxsCi0JICogICAgZHJvcCB0aGUgZW50cnkgcmVmZXJlbmNlLiBJZiBpdCBpcyB0aGUgbGFzdCByZWZlcmVuY2UsIHRoZSBlbnRyeQotCSAqICAgIHdpbGwgYmUgZnJlZWQuCi0JICoKLQkgKiAgICBUaGUgc2Vjb25kIHJlZmVyZW5jZSB3aGVuIGluaXRpYWxpemVzIHRoZSBzdGF0YWhlYWQgZW50cnkgaXMgdXNlZAotCSAqICAgIGJ5IHRoZSBzdGF0YWhlYWQgdGhyZWFkLCBmb2xsb3dpbmcgdGhlIHJ1bGUgMikuCi0JICovCi0JYXRvbWljX3NldCgmZW50cnktPnNlX3JlZmNvdW50LCAyKTsKLQllbnRyeS0+c2Vfc3RhdCA9IFNBX0VOVFJZX0lOSVQ7CisJZW50cnktPnNlX3N0YXRlID0gU0FfRU5UUllfSU5JVDsKIAllbnRyeS0+c2Vfc2l6ZSA9IGVudHJ5X3NpemU7Ci0JZG5hbWUgPSAoY2hhciAqKWVudHJ5ICsgc2l6ZW9mKHN0cnVjdCBsbF9zYV9lbnRyeSk7CisJZG5hbWUgPSAoY2hhciAqKWVudHJ5ICsgc2l6ZW9mKHN0cnVjdCBzYV9lbnRyeSk7CiAJbWVtY3B5KGRuYW1lLCBuYW1lLCBsZW4pOwogCWRuYW1lW2xlbl0gPSAwOwogCkBAIC0yMjMsMTEgKzE5NSwxMCBAQAogCWVudHJ5LT5zZV9xc3RyLmxlbiA9IGxlbjsKIAllbnRyeS0+c2VfcXN0ci5uYW1lID0gZG5hbWU7CiAKLQlsbGkgPSBsbF9pMmluZm8oc2FpLT5zYWlfaW5vZGUpOworCWxsaSA9IGxsX2kyaW5mbyhzYWktPnNhaV9kZW50cnktPmRfaW5vZGUpOwogCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmZW50cnktPnNlX2xpbmssICZzYWktPnNhaV9lbnRyaWVzKTsKIAlJTklUX0xJU1RfSEVBRCgmZW50cnktPnNlX2xpc3QpOwotCWxsX3NhX2VudHJ5X2VuaGFzaChzYWksIGVudHJ5KTsKKwlzYV9yZWhhc2goc2FpLCBlbnRyeSk7CiAJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOwogCiAJYXRvbWljX2luYygmc2FpLT5zYWlfY2FjaGVfY291bnQpOwpAQCAtMjM1LDE4ICsyMDYsMjkgQEAKIAlyZXR1cm4gZW50cnk7CiB9CiAKLS8qCi0gKiBVc2VkIGJ5IHRoZSBkaXJlY3Rvcnkgc2Nhbm5lciB0byBzZWFyY2ggZW50cnkgd2l0aCBuYW1lLgotICoKLSAqIE9ubHkgdGhlIGNhbGxlciBjYW4gcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIGhhc2gsIHNvIGl0IGlzIHVubmVjZXNzYXJ5IHRvIGhvbGQKLSAqIGhhc2ggbG9jay4gSXQgaXMgY2FsbGVyJ3MgZHV0eSB0byByZWxlYXNlIHRoZSBpbml0IHJlZmNvdW50IG9uIHRoZSBlbnRyeSwgc28KLSAqIGl0IGlzIGFsc28gdW5uZWNlc3NhcnkgdG8gaW5jcmVhc2UgcmVmY291bnQgb24gdGhlIGVudHJ5LgotICovCi1zdGF0aWMgc3RydWN0IGxsX3NhX2VudHJ5ICoKLWxsX3NhX2VudHJ5X2dldF9ieW5hbWUoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIGNvbnN0IHN0cnVjdCBxc3RyICpxc3RyKQorLyogZnJlZSBzYV9lbnRyeSwgd2hpY2ggc2hvdWxkIGhhdmUgYmVlbiB1bmhhc2hlZCBhbmQgbm90IGluIGFueSBsaXN0ICovCitzdGF0aWMgdm9pZCBzYV9mcmVlKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5KQogewotCXN0cnVjdCBsbF9zYV9lbnRyeSAqZW50cnk7Ci0JaW50IGkgPSBsbF9zYV9lbnRyeV9oYXNoKHFzdHItPmhhc2gpOworCUNERUJVRyhEX1JFQURBLCAiZnJlZSBzYSBlbnRyeSAlLipzKCVwKSBpbmRleCAlbGx1XG4iLAorCSAgICAgICBlbnRyeS0+c2VfcXN0ci5sZW4sIGVudHJ5LT5zZV9xc3RyLm5hbWUsIGVudHJ5LAorCSAgICAgICBlbnRyeS0+c2VfaW5kZXgpOworCisJTEFTU0VSVChsaXN0X2VtcHR5KCZlbnRyeS0+c2VfbGlzdCkpOworCUxBU1NFUlQobGlzdF9lbXB0eSgmZW50cnktPnNlX2hhc2gpKTsKKworCWtmcmVlKGVudHJ5KTsKKwlhdG9taWNfZGVjKCZzYWktPnNhaV9jYWNoZV9jb3VudCk7Cit9CisKKy8qCisgKiBmaW5kIHNhX2VudHJ5IGJ5IG5hbWUsIHVzZWQgYnkgZGlyZWN0b3J5IHNjYW5uZXIsIGxvY2sgaXMgbm90IG5lZWRlZCBiZWNhdXNlCisgKiBvbmx5IHNjYW5uZXIgY2FuIHJlbW92ZSB0aGUgZW50cnkgZnJvbSBjYWNoZS4KKyAqLworc3RhdGljIHN0cnVjdCBzYV9lbnRyeSAqCitzYV9nZXQoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIGNvbnN0IHN0cnVjdCBxc3RyICpxc3RyKQoreworCXN0cnVjdCBzYV9lbnRyeSAqZW50cnk7CisJaW50IGkgPSBzYV9oYXNoKHFzdHItPmhhc2gpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJnNhaS0+c2FpX2NhY2hlW2ldLCBzZV9oYXNoKSB7CiAJCWlmIChlbnRyeS0+c2VfcXN0ci5oYXNoID09IHFzdHItPmhhc2ggJiYKQEAgLTI1NywzNiArMjM5LDEwMCBAQAogCXJldHVybiBOVUxMOwogfQogCi0vKgotICogVXNlZCBieSB0aGUgYXN5bmMgZ2V0YXR0ciByZXF1ZXN0IGNhbGxiYWNrIHRvIGZpbmQgZW50cnkgd2l0aCBpbmRleC4KLSAqCi0gKiBJbnNpZGUgbGxpX3NhX2xvY2sgdG8gcHJldmVudCBvdGhlcnMgdG8gY2hhbmdlIHRoZSBsaXN0IGR1cmluZyB0aGUgc2VhcmNoLgotICogSXQgbmVlZHMgdG8gaW5jcmVhc2UgZW50cnkgcmVmY291bnQgYmVmb3JlIHJldHVybmluZyB0byBndWFyYW50ZWUgdGhhdCB0aGUKLSAqIGVudHJ5IGNhbm5vdCBiZSBmcmVlZCBieSBvdGhlcnMuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbGxfc2FfZW50cnkgKgotbGxfc2FfZW50cnlfZ2V0X2J5aW5kZXgoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIF9fdTY0IGluZGV4KQorLyogdW5oYXNoIGFuZCB1bmxpbmsgc2FfZW50cnksIGFuZCB0aGVuIGZyZWUgaXQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc2Ffa2lsbChzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgc3RydWN0IHNhX2VudHJ5ICplbnRyeSkKIHsKLQlzdHJ1Y3QgbGxfc2FfZW50cnkgKmVudHJ5OworCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oc2FpLT5zYWlfZGVudHJ5LT5kX2lub2RlKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZzYWktPnNhaV9lbnRyaWVzLCBzZV9saW5rKSB7Ci0JCWlmIChlbnRyeS0+c2VfaW5kZXggPT0gaW5kZXgpIHsKLQkJCUxBU1NFUlQoYXRvbWljX3JlYWQoJmVudHJ5LT5zZV9yZWZjb3VudCkgPiAwKTsKLQkJCWF0b21pY19pbmMoJmVudHJ5LT5zZV9yZWZjb3VudCk7Ci0JCQlyZXR1cm4gZW50cnk7Ci0JCX0KLQkJaWYgKGVudHJ5LT5zZV9pbmRleCA+IGluZGV4KQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiBOVUxMOworCUxBU1NFUlQoIWxpc3RfZW1wdHkoJmVudHJ5LT5zZV9oYXNoKSk7CisJTEFTU0VSVCghbGlzdF9lbXB0eSgmZW50cnktPnNlX2xpc3QpKTsKKwlMQVNTRVJUKHNhX3JlYWR5KGVudHJ5KSk7CisKKwlzYV91bmhhc2goc2FpLCBlbnRyeSk7CisKKwlzcGluX2xvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5zZV9saXN0KTsKKwlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisKKwlpZiAoZW50cnktPnNlX2lub2RlKQorCQlpcHV0KGVudHJ5LT5zZV9pbm9kZSk7CisKKwlzYV9mcmVlKHNhaSwgZW50cnkpOwogfQogCi1zdGF0aWMgdm9pZCBsbF9zYV9lbnRyeV9jbGVhbnVwKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLAotCQkJCXN0cnVjdCBsbF9zYV9lbnRyeSAqZW50cnkpCisvKiBjYWxsZWQgYnkgc2Nhbm5lciBhZnRlciB1c2UsIHNhX2VudHJ5IHdpbGwgYmUga2lsbGVkICovCitzdGF0aWMgdm9pZAorc2FfcHV0KHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5KQogewotCXN0cnVjdCBtZF9lbnF1ZXVlX2luZm8gKm1pbmZvID0gZW50cnktPnNlX21pbmZvOwotCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAgKnJlcSAgID0gZW50cnktPnNlX3JlcTsKKwlzdHJ1Y3Qgc2FfZW50cnkgKnRtcCwgKm5leHQ7CiAKKwlpZiAoZW50cnkgJiYgZW50cnktPnNlX3N0YXRlID09IFNBX0VOVFJZX1NVQ0MpIHsKKwkJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX2kyc2JpKHNhaS0+c2FpX2RlbnRyeS0+ZF9pbm9kZSk7CisKKwkJc2FpLT5zYWlfaGl0Kys7CisJCXNhaS0+c2FpX2NvbnNlY3V0aXZlX21pc3MgPSAwOworCQlzYWktPnNhaV9tYXggPSBtaW4oMiAqIHNhaS0+c2FpX21heCwgc2JpLT5sbF9zYV9tYXgpOworCX0gZWxzZSB7CisJCXNhaS0+c2FpX21pc3MrKzsKKwkJc2FpLT5zYWlfY29uc2VjdXRpdmVfbWlzcysrOworCX0KKworCWlmIChlbnRyeSkKKwkJc2Ffa2lsbChzYWksIGVudHJ5KTsKKworCS8qCisJICoga2lsbCBvbGQgY29tcGxldGVkIGVudHJpZXMsIG9ubHkgc2Nhbm5lciBwcm9jZXNzIGRvZXMgdGhpcywgbm8gbmVlZAorCSAqIHRvIGxvY2sKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodG1wLCBuZXh0LCAmc2FpLT5zYWlfZW50cmllcywgc2VfbGlzdCkgeworCQlpZiAoIWlzX29taXR0ZWRfZW50cnkoc2FpLCB0bXAtPnNlX2luZGV4KSkKKwkJCWJyZWFrOworCQlzYV9raWxsKHNhaSwgdG1wKTsKKwl9CisKKwl3YWtlX3VwKCZzYWktPnNhaV90aHJlYWQudF9jdGxfd2FpdHEpOworfQorCisvKgorICogdXBkYXRlIHN0YXRlIGFuZCBzb3J0IGFkZCBlbnRyeSB0byBzYWlfZW50cmllcyBieSBpbmRleCwgcmV0dXJuIHRydWUgaWYKKyAqIHNjYW5uZXIgaXMgd2FpdGluZyBvbiB0aGlzIGVudHJ5LgorICovCitzdGF0aWMgYm9vbAorX19zYV9tYWtlX3JlYWR5KHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5LCBpbnQgcmV0KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcyA9ICZzYWktPnNhaV9lbnRyaWVzOworCV9fdTY0IGluZGV4ID0gZW50cnktPnNlX2luZGV4OworCXN0cnVjdCBzYV9lbnRyeSAqc2U7CisKKwlMQVNTRVJUKCFzYV9yZWFkeShlbnRyeSkpOworCUxBU1NFUlQobGlzdF9lbXB0eSgmZW50cnktPnNlX2xpc3QpKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShzZSwgJnNhaS0+c2FpX2VudHJpZXMsIHNlX2xpc3QpIHsKKwkJaWYgKHNlLT5zZV9pbmRleCA8IGVudHJ5LT5zZV9pbmRleCkgeworCQkJcG9zID0gJnNlLT5zZV9saXN0OworCQkJYnJlYWs7CisJCX0KKwl9CisJbGlzdF9hZGQoJmVudHJ5LT5zZV9saXN0LCBwb3MpOworCWVudHJ5LT5zZV9zdGF0ZSA9IHJldCA8IDAgPyBTQV9FTlRSWV9JTlZBIDogU0FfRU5UUllfU1VDQzsKKworCXJldHVybiAoaW5kZXggPT0gc2FpLT5zYWlfaW5kZXhfd2FpdCk7Cit9CisKKy8qCisgKiByZWxlYXNlIHJlc291cmNlcyB1c2VkIGluIGFzeW5jIHN0YXQgUlBDLCB1cGRhdGUgZW50cnkgc3RhdGUgYW5kIHdha2V1cCBpZgorICogc2Nhbm5lciBwcm9jZXNzIGl0IHdhaXRpbmcgb24gdGhpcyBlbnRyeS4KKyAqLworc3RhdGljIHZvaWQKK3NhX21ha2VfcmVhZHkoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIHN0cnVjdCBzYV9lbnRyeSAqZW50cnksIGludCByZXQpCit7CisJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhzYWktPnNhaV9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBtZF9lbnF1ZXVlX2luZm8gKm1pbmZvID0gZW50cnktPnNlX21pbmZvOworCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxID0gZW50cnktPnNlX3JlcTsKKwlib29sIHdha2V1cDsKKworCS8qIHJlbGVhc2UgcmVzb3VyY2VzIHVzZWQgaW4gUlBDICovCiAJaWYgKG1pbmZvKSB7CiAJCWVudHJ5LT5zZV9taW5mbyA9IE5VTEw7CiAJCWxsX2ludGVudF9yZWxlYXNlKCZtaW5mby0+bWlfaXQpOwpAQCAtMjk4LDEyMyArMzQ0LDIxIEBACiAJCWVudHJ5LT5zZV9yZXEgPSBOVUxMOwogCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CiAJfQotfQotCi1zdGF0aWMgdm9pZCBsbF9zYV9lbnRyeV9wdXQoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksCi0JCQkgICAgc3RydWN0IGxsX3NhX2VudHJ5ICplbnRyeSkKLXsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZW50cnktPnNlX3JlZmNvdW50KSkgewotCQlDREVCVUcoRF9SRUFEQSwgImZyZWUgc2EgZW50cnkgJS4qcyglcCkgaW5kZXggJWxsdVxuIiwKLQkJICAgICAgIGVudHJ5LT5zZV9xc3RyLmxlbiwgZW50cnktPnNlX3FzdHIubmFtZSwgZW50cnksCi0JCSAgICAgICBlbnRyeS0+c2VfaW5kZXgpOwotCi0JCUxBU1NFUlQobGlzdF9lbXB0eSgmZW50cnktPnNlX2xpbmspKTsKLQkJTEFTU0VSVChsaXN0X2VtcHR5KCZlbnRyeS0+c2VfbGlzdCkpOwotCQlMQVNTRVJUKGxpc3RfZW1wdHkoJmVudHJ5LT5zZV9oYXNoKSk7Ci0KLQkJbGxfc2FfZW50cnlfY2xlYW51cChzYWksIGVudHJ5KTsKLQkJaXB1dChlbnRyeS0+c2VfaW5vZGUpOwotCi0JCWtmcmVlKGVudHJ5KTsKLQkJYXRvbWljX2RlYygmc2FpLT5zYWlfY2FjaGVfY291bnQpOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1kb19zYV9lbnRyeV9maW5pKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBzdHJ1Y3QgbGxfc2FfZW50cnkgKmVudHJ5KQotewotCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oc2FpLT5zYWlfaW5vZGUpOwotCi0JTEFTU0VSVCghbGlzdF9lbXB0eSgmZW50cnktPnNlX2hhc2gpKTsKLQlMQVNTRVJUKCFsaXN0X2VtcHR5KCZlbnRyeS0+c2VfbGluaykpOwotCi0JbGxfc2FfZW50cnlfdW5oYXNoKHNhaSwgZW50cnkpOwogCiAJc3Bpbl9sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQllbnRyeS0+c2Vfc3RhdCA9IFNBX0VOVFJZX0RFU1Q7Ci0JbGlzdF9kZWxfaW5pdCgmZW50cnktPnNlX2xpbmspOwotCWlmIChsaWtlbHkoIWxpc3RfZW1wdHkoJmVudHJ5LT5zZV9saXN0KSkpCi0JCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5zZV9saXN0KTsKKwl3YWtldXAgPSBfX3NhX21ha2VfcmVhZHkoc2FpLCBlbnRyeSwgcmV0KTsKIAlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CiAKLQlsbF9zYV9lbnRyeV9wdXQoc2FpLCBlbnRyeSk7CisJaWYgKHdha2V1cCkKKwkJd2FrZV91cCgmc2FpLT5zYWlfd2FpdHEpOwogfQogCi0vKgotICogRGVsZXRlIGl0IGZyb20gc2FpX2VudHJpZXNfc3RhdGVkIGxpc3Qgd2hlbiBmaW5pLgotICovCi1zdGF0aWMgdm9pZAotbGxfc2FfZW50cnlfZmluaShzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgc3RydWN0IGxsX3NhX2VudHJ5ICplbnRyeSkKLXsKLQlzdHJ1Y3QgbGxfc2FfZW50cnkgKnBvcywgKm5leHQ7Ci0KLQlpZiAoZW50cnkpCi0JCWRvX3NhX2VudHJ5X2Zpbmkoc2FpLCBlbnRyeSk7Ci0KLQkvKiBkcm9wIG9sZCBlbnRyeSwgb25seSAnc2Nhbm5lcicgcHJvY2VzcyBkb2VzIHRoaXMsIG5vIG5lZWQgdG8gbG9jayAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG5leHQsICZzYWktPnNhaV9lbnRyaWVzLCBzZV9saW5rKSB7Ci0JCWlmICghaXNfb21pdHRlZF9lbnRyeShzYWksIHBvcy0+c2VfaW5kZXgpKQotCQkJYnJlYWs7Ci0JCWRvX3NhX2VudHJ5X2Zpbmkoc2FpLCBwb3MpOwotCX0KLX0KLQotLyoKLSAqIEluc2lkZSBsbGlfc2FfbG9jay4KLSAqLwotc3RhdGljIHZvaWQKLWRvX3NhX2VudHJ5X3RvX3N0YXRlZChzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwKLQkJICAgICAgc3RydWN0IGxsX3NhX2VudHJ5ICplbnRyeSwgZW51bSBzZV9zdGF0IHN0YXQpCi17Ci0Jc3RydWN0IGxsX3NhX2VudHJ5ICpzZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkCSAqcG9zID0gJnNhaS0+c2FpX2VudHJpZXNfc3RhdGVkOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZlbnRyeS0+c2VfbGlzdCkpCi0JCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5zZV9saXN0KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShzZSwgJnNhaS0+c2FpX2VudHJpZXNfc3RhdGVkLCBzZV9saXN0KSB7Ci0JCWlmIChzZS0+c2VfaW5kZXggPCBlbnRyeS0+c2VfaW5kZXgpIHsKLQkJCXBvcyA9ICZzZS0+c2VfbGlzdDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JbGlzdF9hZGQoJmVudHJ5LT5zZV9saXN0LCBwb3MpOwotCWVudHJ5LT5zZV9zdGF0ID0gc3RhdDsKLX0KLQotLyoKLSAqIE1vdmUgZW50cnkgdG8gc2FpX2VudHJpZXNfc3RhdGVkIGFuZCBzb3J0IHdpdGggdGhlIGluZGV4LgotICogXHJldHZhbCAxICAgIC0tIGVudHJ5IHRvIGJlIGRlc3Ryb3llZC4KLSAqIFxyZXR2YWwgMCAgICAtLSBlbnRyeSBpcyBpbnNlcnRlZCBpbnRvIHN0YXRlZCBsaXN0LgotICovCi1zdGF0aWMgaW50Ci1sbF9zYV9lbnRyeV90b19zdGF0ZWQoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksCi0JCSAgICAgIHN0cnVjdCBsbF9zYV9lbnRyeSAqZW50cnksIGVudW0gc2Vfc3RhdCBzdGF0KQotewotCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oc2FpLT5zYWlfaW5vZGUpOwotCWludAkJICAgcmV0ID0gMTsKLQotCWxsX3NhX2VudHJ5X2NsZWFudXAoc2FpLCBlbnRyeSk7Ci0KLQlzcGluX2xvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCWlmIChsaWtlbHkoZW50cnktPnNlX3N0YXQgIT0gU0FfRU5UUllfREVTVCkpIHsKLQkJZG9fc2FfZW50cnlfdG9fc3RhdGVkKHNhaSwgZW50cnksIHN0YXQpOwotCQlyZXQgPSAwOwotCX0KLQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogSW5zZXJ0IGlub2RlIGludG8gdGhlIGxpc3Qgb2Ygc2FpX2VudHJpZXNfYWdsLgotICovCisvKiBJbnNlcnQgaW5vZGUgaW50byB0aGUgbGlzdCBvZiBzYWlfYWdscy4gKi8KIHN0YXRpYyB2b2lkIGxsX2FnbF9hZGQoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksCiAJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IGxsX2lub2RlX2luZm8gKmNoaWxkICA9IGxsX2kyaW5mbyhpbm9kZSk7Ci0Jc3RydWN0IGxsX2lub2RlX2luZm8gKnBhcmVudCA9IGxsX2kyaW5mbyhzYWktPnNhaV9pbm9kZSk7CisJc3RydWN0IGxsX2lub2RlX2luZm8gKnBhcmVudCA9IGxsX2kyaW5mbyhzYWktPnNhaV9kZW50cnktPmRfaW5vZGUpOwogCWludAkJICAgYWRkZWQgID0gMDsKIAogCXNwaW5fbG9jaygmY2hpbGQtPmxsaV9hZ2xfbG9jayk7CkBAIC00MjYsOSArMzcwLDkgQEAKIAogCQlpZ3JhYihpbm9kZSk7CiAJCXNwaW5fbG9jaygmcGFyZW50LT5sbGlfYWdsX2xvY2spOwotCQlpZiAobGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19hZ2wpKQorCQlpZiAobGlzdF9lbXB0eSgmc2FpLT5zYWlfYWdscykpCiAJCQlhZGRlZCA9IDE7Ci0JCWxpc3RfYWRkX3RhaWwoJmNoaWxkLT5sbGlfYWdsX2xpc3QsICZzYWktPnNhaV9lbnRyaWVzX2FnbCk7CisJCWxpc3RfYWRkX3RhaWwoJmNoaWxkLT5sbGlfYWdsX2xpc3QsICZzYWktPnNhaV9hZ2xzKTsKIAkJc3Bpbl91bmxvY2soJnBhcmVudC0+bGxpX2FnbF9sb2NrKTsKIAl9IGVsc2UgewogCQlzcGluX3VubG9jaygmY2hpbGQtPmxsaV9hZ2xfbG9jayk7CkBAIC00MzgsOCArMzgyLDEwIEBACiAJCXdha2VfdXAoJnNhaS0+c2FpX2FnbF90aHJlYWQudF9jdGxfd2FpdHEpOwogfQogCi1zdGF0aWMgc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpsbF9zYWlfYWxsb2Modm9pZCkKKy8qIGFsbG9jYXRlIHNhaSAqLworc3RhdGljIHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqbGxfc2FpX2FsbG9jKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKKwlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGRlbnRyeS0+ZF9pbm9kZSk7CiAJc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWk7CiAJaW50CQkgICAgICAgaTsKIApAQCAtNDQ3LDI0ICszOTMsMTggQEAKIAlpZiAoIXNhaSkKIAkJcmV0dXJuIE5VTEw7CiAKKwlzYWktPnNhaV9kZW50cnkgPSBkZ2V0KGRlbnRyeSk7CiAJYXRvbWljX3NldCgmc2FpLT5zYWlfcmVmY291bnQsIDEpOwogCi0Jc3Bpbl9sb2NrKCZzYWlfZ2VuZXJhdGlvbl9sb2NrKTsKLQlzYWktPnNhaV9nZW5lcmF0aW9uID0gKytzYWlfZ2VuZXJhdGlvbjsKLQlpZiAodW5saWtlbHkoc2FpX2dlbmVyYXRpb24gPT0gMCkpCi0JCXNhaS0+c2FpX2dlbmVyYXRpb24gPSArK3NhaV9nZW5lcmF0aW9uOwotCXNwaW5fdW5sb2NrKCZzYWlfZ2VuZXJhdGlvbl9sb2NrKTsKLQogCXNhaS0+c2FpX21heCA9IExMX1NBX1JQQ19NSU47CiAJc2FpLT5zYWlfaW5kZXggPSAxOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNhaS0+c2FpX3dhaXRxKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzYWktPnNhaV90aHJlYWQudF9jdGxfd2FpdHEpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNhaS0+c2FpX2FnbF90aHJlYWQudF9jdGxfd2FpdHEpOwogCisJSU5JVF9MSVNUX0hFQUQoJnNhaS0+c2FpX2ludGVyaW1fZW50cmllcyk7CiAJSU5JVF9MSVNUX0hFQUQoJnNhaS0+c2FpX2VudHJpZXMpOwotCUlOSVRfTElTVF9IRUFEKCZzYWktPnNhaV9lbnRyaWVzX3JlY2VpdmVkKTsKLQlJTklUX0xJU1RfSEVBRCgmc2FpLT5zYWlfZW50cmllc19zdGF0ZWQpOwotCUlOSVRfTElTVF9IRUFEKCZzYWktPnNhaV9lbnRyaWVzX2FnbCk7CisJSU5JVF9MSVNUX0hFQUQoJnNhaS0+c2FpX2FnbHMpOwogCiAJZm9yIChpID0gMDsgaSA8IExMX1NBX0NBQ0hFX1NJWkU7IGkrKykgewogCQlJTklUX0xJU1RfSEVBRCgmc2FpLT5zYWlfY2FjaGVbaV0pOwpAQCAtNDcyLDYzICs0MTIsNzQgQEAKIAl9CiAJYXRvbWljX3NldCgmc2FpLT5zYWlfY2FjaGVfY291bnQsIDApOwogCisJc3Bpbl9sb2NrKCZzYWlfZ2VuZXJhdGlvbl9sb2NrKTsKKwlsbGktPmxsaV9zYV9nZW5lcmF0aW9uID0gKytzYWlfZ2VuZXJhdGlvbjsKKwlpZiAodW5saWtlbHkoIXNhaV9nZW5lcmF0aW9uKSkKKwkJbGxpLT5sbGlfc2FfZ2VuZXJhdGlvbiA9ICsrc2FpX2dlbmVyYXRpb247CisJc3Bpbl91bmxvY2soJnNhaV9nZW5lcmF0aW9uX2xvY2spOworCiAJcmV0dXJuIHNhaTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKgotbGxfc2FpX2dldChzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSkKKy8qIGZyZWUgc2FpICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGxfc2FpX2ZyZWUoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkpCiB7Ci0JYXRvbWljX2luYygmc2FpLT5zYWlfcmVmY291bnQpOworCUxBU1NFUlQoc2FpLT5zYWlfZGVudHJ5KTsKKwlkcHV0KHNhaS0+c2FpX2RlbnRyeSk7CisJa2ZyZWUoc2FpKTsKK30KKworLyoKKyAqIHRha2UgcmVmY291bnQgb2Ygc2FpIGlmIHNhaSBmb3IgQGRpciBleGlzdHMsIHdoaWNoIG1lYW5zIHN0YXRhaGVhZCBpcyBvbiBmb3IKKyAqIHRoaXMgZGlyZWN0b3J5LgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqbGxfc2FpX2dldChzdHJ1Y3QgaW5vZGUgKmRpcikKK3sKKwlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGRpcik7CisJc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwlzYWkgPSBsbGktPmxsaV9zYWk7CisJaWYgKHNhaSkKKwkJYXRvbWljX2luYygmc2FpLT5zYWlfcmVmY291bnQpOworCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwogCXJldHVybiBzYWk7CiB9CiAKKy8qCisgKiBwdXQgc2FpIHJlZmNvdW50IGFmdGVyIHVzZSwgaWYgcmVmY291bnQgcmVhY2hlcyB6ZXJvLCBmcmVlIHNhaSBhbmQgc2FfZW50cmllcworICogYXR0YWNoZWQgdG8gaXQuCisgKi8KIHN0YXRpYyB2b2lkIGxsX3NhaV9wdXQoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkpCiB7Ci0Jc3RydWN0IGlub2RlCSAqaW5vZGUgPSBzYWktPnNhaV9pbm9kZTsKLQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpICAgPSBsbF9pMmluZm8oaW5vZGUpOworCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oc2FpLT5zYWlfZGVudHJ5LT5kX2lub2RlKTsKIAogCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZzYWktPnNhaV9yZWZjb3VudCwgJmxsaS0+bGxpX3NhX2xvY2spKSB7Ci0JCXN0cnVjdCBsbF9zYV9lbnRyeSAqZW50cnksICpuZXh0OwotCi0JCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmc2FpLT5zYWlfcmVmY291bnQpID4gMCkpIHsKLQkJCS8qIEl0IGlzIHJhY2UgY2FzZSwgdGhlIGludGVycHJldCBjYWxsYmFjayBqdXN0IGhvbGQKLQkJCSAqIGEgcmVmZXJlbmNlIGNvdW50Ci0JCQkgKi8KLQkJCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxBU1NFUlQoIWxsaS0+bGxpX29wZW5kaXJfa2V5KTsKLQkJTEFTU0VSVCh0aHJlYWRfaXNfc3RvcHBlZCgmc2FpLT5zYWlfdGhyZWFkKSk7Ci0JCUxBU1NFUlQodGhyZWFkX2lzX3N0b3BwZWQoJnNhaS0+c2FpX2FnbF90aHJlYWQpKTsKKwkJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX2kyc2JpKHNhaS0+c2FpX2RlbnRyeS0+ZF9pbm9kZSk7CisJCXN0cnVjdCBzYV9lbnRyeSAqZW50cnksICpuZXh0OwogCiAJCWxsaS0+bGxpX3NhaSA9IE5VTEw7Ci0JCWxsaS0+bGxpX29wZW5kaXJfcGlkID0gMDsKIAkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOwogCi0JCWlmIChzYWktPnNhaV9zZW50ID4gc2FpLT5zYWlfcmVwbGllZCkKLQkJCUNERUJVRyhEX1JFQURBLCAic3RhdGFoZWFkIGZvciBkaXIgIkRGSUQKLQkJCSAgICAgICIgZG9lcyBub3QgZmluaXNoOiBbc2VudDolbGx1XSBbcmVwbGllZDolbGx1XVxuIiwKLQkJCSAgICAgIFBGSUQoJmxsaS0+bGxpX2ZpZCksCi0JCQkgICAgICBzYWktPnNhaV9zZW50LCBzYWktPnNhaV9yZXBsaWVkKTsKKwkJTEFTU0VSVCh0aHJlYWRfaXNfc3RvcHBlZCgmc2FpLT5zYWlfdGhyZWFkKSk7CisJCUxBU1NFUlQodGhyZWFkX2lzX3N0b3BwZWQoJnNhaS0+c2FpX2FnbF90aHJlYWQpKTsKKwkJTEFTU0VSVChzYWktPnNhaV9zZW50ID09IHNhaS0+c2FpX3JlcGxpZWQpOworCQlMQVNTRVJUKCFzYV9oYXNfY2FsbGJhY2soc2FpKSk7CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBuZXh0LCAmc2FpLT5zYWlfZW50cmllcywKLQkJCQkJIHNlX2xpbmspCi0JCQlkb19zYV9lbnRyeV9maW5pKHNhaSwgZW50cnkpOwotCi0JCUxBU1NFUlQobGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllcykpOwotCQlMQVNTRVJUKGxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfcmVjZWl2ZWQpKTsKLQkJTEFTU0VSVChsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX3N0YXRlZCkpOworCQkJCQkgc2VfbGlzdCkKKwkJCXNhX2tpbGwoc2FpLCBlbnRyeSk7CiAKIAkJTEFTU0VSVChhdG9taWNfcmVhZCgmc2FpLT5zYWlfY2FjaGVfY291bnQpID09IDApOwotCQlMQVNTRVJUKGxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfYWdsKSk7CisJCUxBU1NFUlQobGlzdF9lbXB0eSgmc2FpLT5zYWlfYWdscykpOwogCi0JCWlwdXQoaW5vZGUpOwotCQlrZnJlZShzYWkpOworCQlsbF9zYWlfZnJlZShzYWkpOworCQlhdG9taWNfZGVjKCZzYmktPmxsX3NhX3J1bm5pbmcpOwogCX0KIH0KIAotLyogRG8gTk9UIGZvcmdldCB0byBkcm9wIGlub2RlIHJlZmNvdW50IHdoZW4gaW50byBzYWlfZW50cmllc19hZ2wuICovCisvKiBEbyBOT1QgZm9yZ2V0IHRvIGRyb3AgaW5vZGUgcmVmY291bnQgd2hlbiBpbnRvIHNhaV9hZ2xzLiAqLwogc3RhdGljIHZvaWQgbGxfYWdsX3RyaWdnZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkpCiB7CiAJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSAgID0gbGxfaTJpbmZvKGlub2RlKTsKQEAgLTU4OCwyOSArNTM5LDIxIEBACiAJaXB1dChpbm9kZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGxsX3Bvc3Rfc3RhdGFoZWFkKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpKQorLyoKKyAqIHByZXBhcmUgaW5vZGUgZm9yIHNhIGVudHJ5LCBhZGQgaXQgaW50byBhZ2wgbGlzdCwgbm93IHNhX2VudHJ5IGlzIHJlYWR5CisgKiB0byBiZSB1c2VkIGJ5IHNjYW5uZXIgcHJvY2Vzcy4KKyAqLworc3RhdGljIHZvaWQgc2FfaW5zdGFudGlhdGUoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksCisJCQkgICBzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5KQogewotCXN0cnVjdCBpbm9kZQkgICAqZGlyICAgPSBzYWktPnNhaV9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IHNhaS0+c2FpX2RlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgaW5vZGUJICAgKmNoaWxkOwotCXN0cnVjdCBsbF9pbm9kZV9pbmZvICAgKmxsaSAgID0gbGxfaTJpbmZvKGRpcik7Ci0Jc3RydWN0IGxsX3NhX2VudHJ5ICAgICAqZW50cnk7CiAJc3RydWN0IG1kX2VucXVldWVfaW5mbyAqbWluZm87CiAJc3RydWN0IGxvb2t1cF9pbnRlbnQgICAqaXQ7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICAqcmVxOwogCXN0cnVjdCBtZHRfYm9keQkqYm9keTsKIAlpbnQJCSAgICAgcmMgICAgPSAwOwogCi0Jc3Bpbl9sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19yZWNlaXZlZCkpKSB7Ci0JCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQkJcmV0dXJuOwotCX0KLQllbnRyeSA9IGxpc3RfZW50cnkoc2FpLT5zYWlfZW50cmllc19yZWNlaXZlZC5uZXh0LAotCQkJICAgc3RydWN0IGxsX3NhX2VudHJ5LCBzZV9saXN0KTsKLQlhdG9taWNfaW5jKCZlbnRyeS0+c2VfcmVmY291bnQpOwotCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5zZV9saXN0KTsKLQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0KIAlMQVNTRVJUKGVudHJ5LT5zZV9oYW5kbGUgIT0gMCk7CiAKIAltaW5mbyA9IGVudHJ5LT5zZV9taW5mbzsKQEAgLTYzMiw3ICs1NzUsNyBAQAogCQkvKiBYWFg6IE5vIGZpZCBpbiByZXBseSwgdGhpcyBpcyBwcm9iYWJseSBjcm9zcy1yZWYgY2FzZS4KIAkJICogU0EgY2FuJ3QgaGFuZGxlIGl0IHlldC4KIAkJICovCi0JCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9NRFMpIHsKKwkJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9NRFMpIHsKIAkJCXJjID0gLUVBR0FJTjsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC02NDEsNyArNTg0LDcgQEAKIAkJICogcmV2YWxpZGF0ZS4KIAkJICovCiAJCS8qIHVubGlua2VkIGFuZCByZS1jcmVhdGVkIHdpdGggdGhlIHNhbWUgbmFtZSAqLwotCQlpZiAodW5saWtlbHkoIWx1X2ZpZF9lcSgmbWluZm8tPm1pX2RhdGEub3BfZmlkMiwgJmJvZHktPmZpZDEpKSkgeworCQlpZiAodW5saWtlbHkoIWx1X2ZpZF9lcSgmbWluZm8tPm1pX2RhdGEub3BfZmlkMiwgJmJvZHktPm1ib19maWQxKSkpIHsKIAkJCWVudHJ5LT5zZV9pbm9kZSA9IE5VTEw7CiAJCQlpcHV0KGNoaWxkKTsKIAkJCWNoaWxkID0gTlVMTDsKQEAgLTY1OSw4ICs2MDIsOSBAQAogCWlmIChyYykKIAkJZ290byBvdXQ7CiAKLQlDREVCVUcoRF9ETE1UUkFDRSwgIiVzOiBzZXR0aW5nIGxfZGF0YSB0byBpbm9kZSAiREZJRCIlcFxuIiwKKwlDREVCVUcoRF9SRUFEQSwgIiVzOiBzZXR0aW5nICUuKnMiIERGSUQgIiBsX2RhdGEgdG8gaW5vZGUgJXBcbiIsCiAJICAgICAgIGxsX2dldF9mc25hbWUoY2hpbGQtPmlfc2IsIE5VTEwsIDApLAorCSAgICAgICBlbnRyeS0+c2VfcXN0ci5sZW4sIGVudHJ5LT5zZV9xc3RyLm5hbWUsCiAJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGNoaWxkKSksIGNoaWxkKTsKIAlsbF9zZXRfbG9ja19kYXRhKGxsX2kyc2JpKGRpciktPmxsX21kX2V4cCwgY2hpbGQsIGl0LCBOVUxMKTsKIApAQCAtNjcwLDM0ICs2MTQsNzUgQEAKIAkJbGxfYWdsX2FkZChzYWksIGNoaWxkLCBlbnRyeS0+c2VfaW5kZXgpOwogCiBvdXQ6Ci0JLyogVGhlICJsbF9zYV9lbnRyeV90b19zdGF0ZWQoKSIgd2lsbCBkcm9wIHJlbGF0ZWQgbGRsbSBpYml0cyBsb2NrCi0JICogcmVmZXJlbmNlIGNvdW50IGJ5IGNhbGxpbmcgImxsX2ludGVudF9kcm9wX2xvY2soKSIgaW4gc3BpdGUgb2YgdGhlCi0JICogYWJvdmUgb3BlcmF0aW9ucyBmYWlsZWQgb3Igbm90LiBEbyBub3Qgd29ycnkgYWJvdXQgY2FsbGluZwotCSAqICJsbF9pbnRlbnRfZHJvcF9sb2NrKCkiIG1vcmUgdGhhbiBvbmNlLgorCS8qCisJICogc2FfbWFrZV9yZWFkeSgpIHdpbGwgZHJvcCBsZGxtIGliaXRzIGxvY2sgcmVmY291bnQgYnkgY2FsbGluZworCSAqIGxsX2ludGVudF9kcm9wX2xvY2soKSBpbiBzcGl0ZSBvZiBmYWlsdXJlcy4gRG8gbm90IHdvcnJ5IGFib3V0CisJICogY2FsbGluZyBsbF9pbnRlbnRfZHJvcF9sb2NrKCkgbW9yZSB0aGFuIG9uY2UuCiAJICovCi0JcmMgPSBsbF9zYV9lbnRyeV90b19zdGF0ZWQoc2FpLCBlbnRyeSwKLQkJCQkgICByYyA8IDAgPyBTQV9FTlRSWV9JTlZBIDogU0FfRU5UUllfU1VDQyk7Ci0JaWYgKHJjID09IDAgJiYgZW50cnktPnNlX2luZGV4ID09IHNhaS0+c2FpX2luZGV4X3dhaXQpCi0JCXdha2VfdXAoJnNhaS0+c2FpX3dhaXRxKTsKLQlsbF9zYV9lbnRyeV9wdXQoc2FpLCBlbnRyeSk7CisJc2FfbWFrZV9yZWFkeShzYWksIGVudHJ5LCByYyk7CiB9CiAKKy8qIG9uY2UgdGhlcmUgYXJlIGFzeW5jIHN0YXQgcmVwbGllcywgaW5zdGFudGlhdGUgc2FfZW50cnkgZnJvbSByZXBsaWVzICovCitzdGF0aWMgdm9pZCBzYV9oYW5kbGVfY2FsbGJhY2soc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkpCit7CisJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaTsKKworCWxsaSA9IGxsX2kyaW5mbyhzYWktPnNhaV9kZW50cnktPmRfaW5vZGUpOworCisJd2hpbGUgKHNhX2hhc19jYWxsYmFjayhzYWkpKSB7CisJCXN0cnVjdCBzYV9lbnRyeSAqZW50cnk7CisKKwkJc3Bpbl9sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwkJaWYgKHVubGlrZWx5KCFzYV9oYXNfY2FsbGJhY2soc2FpKSkpIHsKKwkJCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwkJCWJyZWFrOworCQl9CisJCWVudHJ5ID0gbGlzdF9lbnRyeShzYWktPnNhaV9pbnRlcmltX2VudHJpZXMubmV4dCwKKwkJCQkgICBzdHJ1Y3Qgc2FfZW50cnksIHNlX2xpc3QpOworCQlsaXN0X2RlbF9pbml0KCZlbnRyeS0+c2VfbGlzdCk7CisJCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKworCQlzYV9pbnN0YW50aWF0ZShzYWksIGVudHJ5KTsKKwl9Cit9CisKKy8qCisgKiBjYWxsYmFjayBmb3IgYXN5bmMgc3RhdCwgYmVjYXVzZSB0aGlzIGlzIGNhbGxlZCBpbiBwdGxycGNkIGNvbnRleHQsIHdlIG9ubHkKKyAqIHB1dCBzYV9lbnRyeSBpbiBzYWlfY2JfZW50cmllcyBsaXN0LCBhbmQgbGV0IHNhX2hhbmRsZV9jYWxsYmFjaygpIHRvIHJlYWxseQorICogcHJlcGFyZSBpbm9kZSBhbmQgaW5zdGFudGlhdGUgc2FfZW50cnkgbGF0ZXIuCisgKi8KIHN0YXRpYyBpbnQgbGxfc3RhdGFoZWFkX2ludGVycHJldChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwKIAkJCQkgIHN0cnVjdCBtZF9lbnF1ZXVlX2luZm8gKm1pbmZvLCBpbnQgcmMpCiB7CiAJc3RydWN0IGxvb2t1cF9pbnRlbnQgICAgICppdCAgPSAmbWluZm8tPm1pX2l0OwogCXN0cnVjdCBpbm9kZQkgICAgICpkaXIgPSBtaW5mby0+bWlfZGlyOwogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICAgICAqbGxpID0gbGxfaTJpbmZvKGRpcik7Ci0Jc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkgPSBOVUxMOwotCXN0cnVjdCBsbF9zYV9lbnRyeSAgICAgICAqZW50cnk7Ci0JX191NjQJCQkgIGhhbmRsZSA9IDA7Ci0JaW50CQkgICAgICAgd2FrZXVwOworCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpID0gbGxpLT5sbGlfc2FpOworCXN0cnVjdCBzYV9lbnRyeSAqZW50cnkgPSAoc3RydWN0IHNhX2VudHJ5ICopbWluZm8tPm1pX2NiZGF0YTsKKwlfX3U2NCBoYW5kbGUgPSAwOworCWJvb2wgd2FrZXVwOwogCiAJaWYgKGl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX0xPT0tVUF9ORUcpKQogCQlyYyA9IC1FTk9FTlQ7CiAKLQlpZiAocmMgPT0gMCkgewotCQkvKiByZWxlYXNlIGliaXRzIGxvY2sgQVNBUCB0byBhdm9pZCBkZWFkbG9jayB3aGVuIHN0YXRhaGVhZAorCS8qCisJICogYmVjYXVzZSBzdGF0YWhlYWQgdGhyZWFkIHdpbGwgd2FpdCBmb3IgYWxsIGluZmxpZ2h0IFJQQyB0byBmaW5pc2gsCisJICogc2FpIHNob3VsZCBiZSBhbHdheXMgdmFsaWQsIG5vIG5lZWQgdG8gcmVmY291bnQKKwkgKi8KKwlMQVNTRVJUKHNhaSk7CisJTEFTU0VSVCghdGhyZWFkX2lzX3N0b3BwZWQoJnNhaS0+c2FpX3RocmVhZCkpOworCUxBU1NFUlQoZW50cnkpOworCisJQ0RFQlVHKERfUkVBREEsICJzYV9lbnRyeSAlLipzIHJjICVkXG4iLAorCSAgICAgICBlbnRyeS0+c2VfcXN0ci5sZW4sIGVudHJ5LT5zZV9xc3RyLm5hbWUsIHJjKTsKKworCWlmIChyYykgeworCQlsbF9pbnRlbnRfcmVsZWFzZShpdCk7CisJCWlwdXQoZGlyKTsKKwkJa2ZyZWUobWluZm8pOworCX0gZWxzZSB7CisJCS8qCisJCSAqIHJlbGVhc2UgaWJpdHMgbG9jayBBU0FQIHRvIGF2b2lkIGRlYWRsb2NrIHdoZW4gc3RhdGFoZWFkCiAJCSAqIHRocmVhZCBlbnF1ZXVlcyBsb2NrIG9uIHBhcmVudCBpbiByZWFkZGlyIGFuZCBhbm90aGVyCiAJCSAqIHByb2Nlc3MgZW5xdWV1ZXMgbG9jayBvbiBjaGlsZCB3aXRoIHBhcmVudCBsb2NrIGhlbGQsIGVnLgogCQkgKiB1bmxpbmsuCkBAIC03MDcsNjUgKzY5MiwzMiBAQAogCX0KIAogCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JLyogc3RhbGUgZW50cnkgKi8KLQlpZiAodW5saWtlbHkoIWxsaS0+bGxpX3NhaSB8fAotCQkgICAgIGxsaS0+bGxpX3NhaS0+c2FpX2dlbmVyYXRpb24gIT0gbWluZm8tPm1pX2dlbmVyYXRpb24pKSB7Ci0JCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQkJcmMgPSAtRVNUQUxFOwotCQlnb3RvIG91dDsKKwlpZiAocmMpIHsKKwkJd2FrZXVwID0gX19zYV9tYWtlX3JlYWR5KHNhaSwgZW50cnksIHJjKTsKIAl9IGVsc2UgewotCQlzYWkgPSBsbF9zYWlfZ2V0KGxsaS0+bGxpX3NhaSk7Ci0JCWlmICh1bmxpa2VseSghdGhyZWFkX2lzX3J1bm5pbmcoJnNhaS0+c2FpX3RocmVhZCkpKSB7Ci0JCQlzYWktPnNhaV9yZXBsaWVkKys7Ci0JCQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JCQlyYyA9IC1FQkFERkQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWVudHJ5ID0gbGxfc2FfZW50cnlfZ2V0X2J5aW5kZXgoc2FpLCBtaW5mby0+bWlfY2JkYXRhKTsKLQkJaWYgKCFlbnRyeSkgewotCQkJc2FpLT5zYWlfcmVwbGllZCsrOwotCQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCQkJcmMgPSAtRUlEUk07Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWlmIChyYyAhPSAwKSB7Ci0JCQlkb19zYV9lbnRyeV90b19zdGF0ZWQoc2FpLCBlbnRyeSwgU0FfRU5UUllfSU5WQSk7Ci0JCQl3YWtldXAgPSAoZW50cnktPnNlX2luZGV4ID09IHNhaS0+c2FpX2luZGV4X3dhaXQpOwotCQl9IGVsc2UgewotCQkJZW50cnktPnNlX21pbmZvID0gbWluZm87Ci0JCQllbnRyeS0+c2VfcmVxID0gcHRscnBjX3JlcXVlc3RfYWRkcmVmKHJlcSk7Ci0JCQkvKiBSZWxlYXNlIHRoZSBhc3luYyBpYml0cyBsb2NrIEFTQVAgdG8gYXZvaWQgZGVhZGxvY2sKLQkJCSAqIHdoZW4gc3RhdGFoZWFkIHRocmVhZCB0cmllcyB0byBlbnF1ZXVlIGxvY2sgb24gcGFyZW50Ci0JCQkgKiBmb3IgcmVhZHBhZ2UgYW5kIG90aGVyIHRyaWVzIHRvIGVucXVldWUgbG9jayBvbiBjaGlsZAotCQkJICogd2l0aCBwYXJlbnQncyBsb2NrIGhlbGQsIGZvciBleGFtcGxlOiB1bmxpbmsuCi0JCQkgKi8KLQkJCWVudHJ5LT5zZV9oYW5kbGUgPSBoYW5kbGU7Ci0JCQl3YWtldXAgPSBsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX3JlY2VpdmVkKTsKLQkJCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5zZV9saXN0LAotCQkJCSAgICAgICZzYWktPnNhaV9lbnRyaWVzX3JlY2VpdmVkKTsKLQkJfQotCQlzYWktPnNhaV9yZXBsaWVkKys7Ci0JCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQotCQlsbF9zYV9lbnRyeV9wdXQoc2FpLCBlbnRyeSk7Ci0JCWlmICh3YWtldXApCi0JCQl3YWtlX3VwKCZzYWktPnNhaV90aHJlYWQudF9jdGxfd2FpdHEpOworCQllbnRyeS0+c2VfbWluZm8gPSBtaW5mbzsKKwkJZW50cnktPnNlX3JlcSA9IHB0bHJwY19yZXF1ZXN0X2FkZHJlZihyZXEpOworCQkvKgorCQkgKiBSZWxlYXNlIHRoZSBhc3luYyBpYml0cyBsb2NrIEFTQVAgdG8gYXZvaWQgZGVhZGxvY2sKKwkJICogd2hlbiBzdGF0YWhlYWQgdGhyZWFkIHRyaWVzIHRvIGVucXVldWUgbG9jayBvbiBwYXJlbnQKKwkJICogZm9yIHJlYWRwYWdlIGFuZCBvdGhlciB0cmllcyB0byBlbnF1ZXVlIGxvY2sgb24gY2hpbGQKKwkJICogd2l0aCBwYXJlbnQncyBsb2NrIGhlbGQsIGZvciBleGFtcGxlOiB1bmxpbmsuCisJCSAqLworCQllbnRyeS0+c2VfaGFuZGxlID0gaGFuZGxlOworCQl3YWtldXAgPSAhc2FfaGFzX2NhbGxiYWNrKHNhaSk7CisJCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5zZV9saXN0LCAmc2FpLT5zYWlfaW50ZXJpbV9lbnRyaWVzKTsKIAl9CisJc2FpLT5zYWlfcmVwbGllZCsrOwogCi1vdXQ6Ci0JaWYgKHJjICE9IDApIHsKLQkJbGxfaW50ZW50X3JlbGVhc2UoaXQpOwotCQlpcHV0KGRpcik7Ci0JCWtmcmVlKG1pbmZvKTsKLQl9Ci0JaWYgKHNhaSkKLQkJbGxfc2FpX3B1dChzYWkpOworCWlmICh3YWtldXApCisJCXdha2VfdXAoJnNhaS0+c2FpX3RocmVhZC50X2N0bF93YWl0cSk7CisJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBzYV9hcmdzX2Zpbmkoc3RydWN0IG1kX2VucXVldWVfaW5mbyAqbWluZm8sCisvKiBmaW5pc2ggYXN5bmMgc3RhdCBSUEMgYXJndW1lbnRzICovCitzdGF0aWMgdm9pZCBzYV9maW5pX2RhdGEoc3RydWN0IG1kX2VucXVldWVfaW5mbyAqbWluZm8sCiAJCQkgc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvICplaW5mbykKIHsKIAlMQVNTRVJUKG1pbmZvICYmIGVpbmZvKTsKQEAgLTc3NywxMiArNzI5LDExIEBACiAvKioKICAqIHByZXBhcmUgYXJndW1lbnRzIGZvciBhc3luYyBzdGF0IFJQQy4KICAqLwotc3RhdGljIGludCBzYV9hcmdzX2luaXQoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqY2hpbGQsCi0JCQlzdHJ1Y3QgbGxfc2FfZW50cnkgKmVudHJ5LCBzdHJ1Y3QgbWRfZW5xdWV1ZV9pbmZvICoqcG1pLAorc3RhdGljIGludCBzYV9wcmVwX2RhdGEoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqY2hpbGQsCisJCQlzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5LCBzdHJ1Y3QgbWRfZW5xdWV1ZV9pbmZvICoqcG1pLAogCQkJc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvICoqcGVpKQogewogCWNvbnN0IHN0cnVjdCBxc3RyICAgICAgKnFzdHIgPSAmZW50cnktPnNlX3FzdHI7Ci0Jc3RydWN0IGxsX2lub2RlX2luZm8gICAgICpsbGkgID0gbGxfaTJpbmZvKGRpcik7CiAJc3RydWN0IG1kX2VucXVldWVfaW5mbyAgICptaW5mbzsKIAlzdHJ1Y3QgbGRsbV9lbnF1ZXVlX2luZm8gKmVpbmZvOwogCXN0cnVjdCBtZF9vcF9kYXRhCSpvcF9kYXRhOwpAQCAtODA4LDggKzc1OSw3IEBACiAJbWluZm8tPm1pX2l0Lml0X29wID0gSVRfR0VUQVRUUjsKIAltaW5mby0+bWlfZGlyID0gaWdyYWIoZGlyKTsKIAltaW5mby0+bWlfY2IgPSBsbF9zdGF0YWhlYWRfaW50ZXJwcmV0OwotCW1pbmZvLT5taV9nZW5lcmF0aW9uID0gbGxpLT5sbGlfc2FpLT5zYWlfZ2VuZXJhdGlvbjsKLQltaW5mby0+bWlfY2JkYXRhID0gZW50cnktPnNlX2luZGV4OworCW1pbmZvLT5taV9jYmRhdGEgPSBlbnRyeTsKIAogCWVpbmZvLT5laV90eXBlICAgPSBMRExNX0lCSVRTOwogCWVpbmZvLT5laV9tb2RlICAgPSBpdF90b19sb2NrX21vZGUoJm1pbmZvLT5taV9pdCk7CkBAIC04MjQsMzEgKzc3NCwzMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRvX3NhX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGxsX3NhX2VudHJ5ICplbnRyeSkKKy8qIGFzeW5jIHN0YXQgZm9yIGZpbGUgbm90IGZvdW5kIGluIGRjYWNoZSAqLworc3RhdGljIGludCBzYV9sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBzYV9lbnRyeSAqZW50cnkpCiB7CiAJc3RydWN0IG1kX2VucXVldWVfaW5mbyAgICptaW5mbzsKIAlzdHJ1Y3QgbGRsbV9lbnF1ZXVlX2luZm8gKmVpbmZvOwogCWludAkJICAgICAgIHJjOwogCi0JcmMgPSBzYV9hcmdzX2luaXQoZGlyLCBOVUxMLCBlbnRyeSwgJm1pbmZvLCAmZWluZm8pOworCXJjID0gc2FfcHJlcF9kYXRhKGRpciwgTlVMTCwgZW50cnksICZtaW5mbywgJmVpbmZvKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAogCXJjID0gbWRfaW50ZW50X2dldGF0dHJfYXN5bmMobGxfaTJtZGV4cChkaXIpLCBtaW5mbywgZWluZm8pOwotCWlmIChyYyA8IDApCi0JCXNhX2FyZ3NfZmluaShtaW5mbywgZWluZm8pOworCWlmIChyYykKKwkJc2FfZmluaV9kYXRhKG1pbmZvLCBlaW5mbyk7CiAKIAlyZXR1cm4gcmM7CiB9CiAKIC8qKgotICogc2ltaWxhciB0byBsbF9yZXZhbGlkYXRlX2l0KCkuCi0gKiBccmV0dmFsICAgICAgMSAtLSBkZW50cnkgdmFsaWQKLSAqIFxyZXR2YWwgICAgICAwIC0tIHdpbGwgc2VuZCBzdGF0LWFoZWFkIHJlcXVlc3QKLSAqIFxyZXR2YWwgb3RoZXJzIC0tIHByZXBhcmUgc3RhdC1haGVhZCByZXF1ZXN0IGZhaWxlZAorICogYXN5bmMgc3RhdCBmb3IgZmlsZSBmb3VuZCBpbiBkY2FjaGUsIHNpbWlsYXIgdG8gLnJldmFsaWRhdGUKKyAqCisgKiBccmV0dmFsCTEgZGVudHJ5IHZhbGlkLCBubyBSUEMgc2VudAorICogXHJldHZhbAkwIGRlbnRyeSBpbnZhbGlkLCB3aWxsIHNlbmQgYXN5bmMgc3RhdCBSUEMKKyAqIFxyZXR2YWwJbmVnYXRpdmUgbnVtYmVyIHVwb24gZXJyb3IKICAqLwotc3RhdGljIGludCBkb19zYV9yZXZhbGlkYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgbGxfc2FfZW50cnkgKmVudHJ5LAotCQkJICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3N0YXRpYyBpbnQgc2FfcmV2YWxpZGF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHNhX2VudHJ5ICplbnRyeSwKKwkJCSBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJc3RydWN0IGlub2RlCSAgICAgKmlub2RlID0gZF9pbm9kZShkZW50cnkpOwogCXN0cnVjdCBsb29rdXBfaW50ZW50ICAgICAgaXQgPSB7IC5pdF9vcCA9IElUX0dFVEFUVFIsCkBAIC04NzIsNyArODI0LDcgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JcmMgPSBzYV9hcmdzX2luaXQoZGlyLCBpbm9kZSwgZW50cnksICZtaW5mbywgJmVpbmZvKTsKKwlyYyA9IHNhX3ByZXBfZGF0YShkaXIsIGlub2RlLCBlbnRyeSwgJm1pbmZvLCAmZWluZm8pOwogCWlmIChyYykgewogCQllbnRyeS0+c2VfaW5vZGUgPSBOVUxMOwogCQlpcHV0KGlub2RlKTsKQEAgLTg4MCw1NiArODMyLDUwIEBACiAJfQogCiAJcmMgPSBtZF9pbnRlbnRfZ2V0YXR0cl9hc3luYyhsbF9pMm1kZXhwKGRpciksIG1pbmZvLCBlaW5mbyk7Ci0JaWYgKHJjIDwgMCkgeworCWlmIChyYykgewogCQllbnRyeS0+c2VfaW5vZGUgPSBOVUxMOwogCQlpcHV0KGlub2RlKTsKLQkJc2FfYXJnc19maW5pKG1pbmZvLCBlaW5mbyk7CisJCXNhX2ZpbmlfZGF0YShtaW5mbywgZWluZm8pOwogCX0KIAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQgbGxfc3RhdGFoZWFkX29uZShzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIGNvbnN0IGNoYXIgKmVudHJ5X25hbWUsCi0JCQkgICAgIGludCBlbnRyeV9uYW1lX2xlbikKKy8qIGFzeW5jIHN0YXQgZm9yIGZpbGUgd2l0aCBAbmFtZSAqLworc3RhdGljIHZvaWQgc2Ffc3RhdGFoZWFkKHN0cnVjdCBkZW50cnkgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKIHsKIAlzdHJ1Y3QgaW5vZGUJICAgICAqZGlyICAgID0gZF9pbm9kZShwYXJlbnQpOwogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICAgICAqbGxpICAgID0gbGxfaTJpbmZvKGRpcik7CiAJc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkgICAgPSBsbGktPmxsaV9zYWk7CiAJc3RydWN0IGRlbnRyeQkgICAgKmRlbnRyeSA9IE5VTEw7Ci0Jc3RydWN0IGxsX3NhX2VudHJ5ICAgICAgICplbnRyeTsKKwlzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5OwogCWludAkJICAgICAgIHJjOwotCWludAkJICAgICAgIHJjMTsKIAotCWVudHJ5ID0gbGxfc2FfZW50cnlfYWxsb2MocGFyZW50LCBzYWksIHNhaS0+c2FpX2luZGV4LCBlbnRyeV9uYW1lLAotCQkJCSAgZW50cnlfbmFtZV9sZW4pOworCWVudHJ5ID0gc2FfYWxsb2MocGFyZW50LCBzYWksIHNhaS0+c2FpX2luZGV4LCBuYW1lLCBsZW4pOwogCWlmIChJU19FUlIoZW50cnkpKQogCQlyZXR1cm47CiAKIAlkZW50cnkgPSBkX2xvb2t1cChwYXJlbnQsICZlbnRyeS0+c2VfcXN0cik7CiAJaWYgKCFkZW50cnkpIHsKLQkJcmMgPSBkb19zYV9sb29rdXAoZGlyLCBlbnRyeSk7CisJCXJjID0gc2FfbG9va3VwKGRpciwgZW50cnkpOwogCX0gZWxzZSB7Ci0JCXJjID0gZG9fc2FfcmV2YWxpZGF0ZShkaXIsIGVudHJ5LCBkZW50cnkpOworCQlyYyA9IHNhX3JldmFsaWRhdGUoZGlyLCBlbnRyeSwgZGVudHJ5KTsKIAkJaWYgKHJjID09IDEgJiYgYWdsX3Nob3VsZF9ydW4oc2FpLCBkX2lub2RlKGRlbnRyeSkpKQogCQkJbGxfYWdsX2FkZChzYWksIGRfaW5vZGUoZGVudHJ5KSwgZW50cnktPnNlX2luZGV4KTsKKwl9CiAKKwlpZiAoZGVudHJ5KQogCQlkcHV0KGRlbnRyeSk7Ci0JfQogCi0JaWYgKHJjKSB7Ci0JCXJjMSA9IGxsX3NhX2VudHJ5X3RvX3N0YXRlZChzYWksIGVudHJ5LAotCQkJCQlyYyA8IDAgPyBTQV9FTlRSWV9JTlZBIDogU0FfRU5UUllfU1VDQyk7Ci0JCWlmIChyYzEgPT0gMCAmJiBlbnRyeS0+c2VfaW5kZXggPT0gc2FpLT5zYWlfaW5kZXhfd2FpdCkKLQkJCXdha2VfdXAoJnNhaS0+c2FpX3dhaXRxKTsKLQl9IGVsc2UgeworCWlmIChyYykKKwkJc2FfbWFrZV9yZWFkeShzYWksIGVudHJ5LCByYyk7CisJZWxzZQogCQlzYWktPnNhaV9zZW50Kys7Ci0JfQogCiAJc2FpLT5zYWlfaW5kZXgrKzsKLQkvKiBkcm9wIG9uZSByZWZjb3VudCBvbiBlbnRyeSBieSBsbF9zYV9lbnRyeV9hbGxvYyAqLwotCWxsX3NhX2VudHJ5X3B1dChzYWksIGVudHJ5KTsKIH0KIAorLyogYXN5bmMgZ2xpbXBzZSAoYWdsKSB0aHJlYWQgbWFpbiBmdW5jdGlvbiAqLwogc3RhdGljIGludCBsbF9hZ2xfdGhyZWFkKHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgZGVudHJ5CSAgICAqcGFyZW50ID0gYXJnOwpAQCAtOTM3LDEwICs4ODMsMTIgQEAKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAgICAgKnBsbGkgICA9IGxsX2kyaW5mbyhkaXIpOwogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICAgICAqY2xsaTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbwkqc2JpICAgID0gbGxfaTJzYmkoZGlyKTsKLQlzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSAgICA9IGxsX3NhaV9nZXQocGxsaS0+bGxpX3NhaSk7Ci0Jc3RydWN0IHB0bHJwY190aHJlYWQgICAgICp0aHJlYWQgPSAmc2FpLT5zYWlfYWdsX3RocmVhZDsKKwlzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaTsKKwlzdHJ1Y3QgcHRscnBjX3RocmVhZCAqdGhyZWFkOwogCXN0cnVjdCBsX3dhaXRfaW5mbwlsd2kgICAgPSB7IDAgfTsKIAorCXNhaSA9IGxsX3NhaV9nZXQoZGlyKTsKKwl0aHJlYWQgPSAmc2FpLT5zYWlfYWdsX3RocmVhZDsKIAl0aHJlYWQtPnRfcGlkID0gY3VycmVudF9waWQoKTsKIAlDREVCVUcoRF9SRUFEQSwgImFnbCB0aHJlYWQgc3RhcnRlZDogc2FpICVwLCBwYXJlbnQgJXBkXG4iLAogCSAgICAgICBzYWksIHBhcmVudCk7CkBAIC05NTksNyArOTA3LDcgQEAKIAogCXdoaWxlICgxKSB7CiAJCWxfd2FpdF9ldmVudCh0aHJlYWQtPnRfY3RsX3dhaXRxLAotCQkJICAgICAhbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19hZ2wpIHx8CisJCQkgICAgICFsaXN0X2VtcHR5KCZzYWktPnNhaV9hZ2xzKSB8fAogCQkJICAgICAhdGhyZWFkX2lzX3J1bm5pbmcodGhyZWFkKSwKIAkJCSAgICAgJmx3aSk7CiAKQEAgLTk3MCw4ICs5MTgsOCBAQAogCQkvKiBUaGUgc3RhdGFoZWFkIHRocmVhZCBtYXliZSBoZWxwIHRvIHByb2Nlc3MgQUdMIGVudHJpZXMsCiAJCSAqIHNvIGNoZWNrIHdoZXRoZXIgbGlzdCBlbXB0eSBhZ2Fpbi4KIAkJICovCi0JCWlmICghbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19hZ2wpKSB7Ci0JCQljbGxpID0gbGlzdF9lbnRyeShzYWktPnNhaV9lbnRyaWVzX2FnbC5uZXh0LAorCQlpZiAoIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2FnbHMpKSB7CisJCQljbGxpID0gbGlzdF9lbnRyeShzYWktPnNhaV9hZ2xzLm5leHQsCiAJCQkJCSAgc3RydWN0IGxsX2lub2RlX2luZm8sIGxsaV9hZ2xfbGlzdCk7CiAJCQlsaXN0X2RlbF9pbml0KCZjbGxpLT5sbGlfYWdsX2xpc3QpOwogCQkJc3Bpbl91bmxvY2soJnBsbGktPmxsaV9hZ2xfbG9jayk7CkBAIC05ODMsOCArOTMxLDggQEAKIAogCXNwaW5fbG9jaygmcGxsaS0+bGxpX2FnbF9sb2NrKTsKIAlzYWktPnNhaV9hZ2xfdmFsaWQgPSAwOwotCXdoaWxlICghbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19hZ2wpKSB7Ci0JCWNsbGkgPSBsaXN0X2VudHJ5KHNhaS0+c2FpX2VudHJpZXNfYWdsLm5leHQsCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZzYWktPnNhaV9hZ2xzKSkgeworCQljbGxpID0gbGlzdF9lbnRyeShzYWktPnNhaV9hZ2xzLm5leHQsCiAJCQkJICBzdHJ1Y3QgbGxfaW5vZGVfaW5mbywgbGxpX2FnbF9saXN0KTsKIAkJbGlzdF9kZWxfaW5pdCgmY2xsaS0+bGxpX2FnbF9saXN0KTsKIAkJc3Bpbl91bmxvY2soJnBsbGktPmxsaV9hZ2xfbG9jayk7CkBAIC0xMDAxLDYgKzk0OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIHN0YXJ0IGFnbCB0aHJlYWQgKi8KIHN0YXRpYyB2b2lkIGxsX3N0YXJ0X2FnbChzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpKQogewogCXN0cnVjdCBwdGxycGNfdGhyZWFkICp0aHJlYWQgPSAmc2FpLT5zYWlfYWdsX3RocmVhZDsKQEAgLTEwMjUsNTggKzk3NCw3MSBAQAogCQkgICAgICZsd2kpOwogfQogCisvKiBzdGF0YWhlYWQgdGhyZWFkIG1haW4gZnVuY3Rpb24gKi8KIHN0YXRpYyBpbnQgbGxfc3RhdGFoZWFkX3RocmVhZCh2b2lkICphcmcpCiB7CiAJc3RydWN0IGRlbnRyeQkgICAgKnBhcmVudCA9IGFyZzsKIAlzdHJ1Y3QgaW5vZGUJICAgICAqZGlyICAgID0gZF9pbm9kZShwYXJlbnQpOwotCXN0cnVjdCBsbF9pbm9kZV9pbmZvICAgICAqcGxsaSAgID0gbGxfaTJpbmZvKGRpcik7Ci0Jc3RydWN0IGxsX2lub2RlX2luZm8gICAgICpjbGxpOworCXN0cnVjdCBsbF9pbm9kZV9pbmZvICAgICAqbGxpICAgPSBsbF9pMmluZm8oZGlyKTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbwkqc2JpICAgID0gbGxfaTJzYmkoZGlyKTsKLQlzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSAgICA9IGxsX3NhaV9nZXQocGxsaS0+bGxpX3NhaSk7Ci0Jc3RydWN0IHB0bHJwY190aHJlYWQgICAgICp0aHJlYWQgPSAmc2FpLT5zYWlfdGhyZWFkOwotCXN0cnVjdCBwdGxycGNfdGhyZWFkICphZ2xfdGhyZWFkID0gJnNhaS0+c2FpX2FnbF90aHJlYWQ7Ci0Jc3RydWN0IHBhZ2UJICAgICAgKnBhZ2U7CisJc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWk7CisJc3RydWN0IHB0bHJwY190aHJlYWQgKnNhX3RocmVhZDsKKwlzdHJ1Y3QgcHRscnBjX3RocmVhZCAqYWdsX3RocmVhZDsKKwlzdHJ1Y3QgcGFnZQkgICAgICAqcGFnZSA9IE5VTEw7CiAJX191NjQJCSAgICAgcG9zICAgID0gMDsKIAlpbnQJCSAgICAgICBmaXJzdCAgPSAwOwogCWludAkJICAgICAgIHJjICAgICA9IDA7Ci0Jc3RydWN0IGxsX2Rpcl9jaGFpbiAgICAgICBjaGFpbjsKKwlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKIAlzdHJ1Y3QgbF93YWl0X2luZm8JbHdpICAgID0geyAwIH07CiAKLQl0aHJlYWQtPnRfcGlkID0gY3VycmVudF9waWQoKTsKKwlzYWkgPSBsbF9zYWlfZ2V0KGRpcik7CisJc2FfdGhyZWFkID0gJnNhaS0+c2FpX3RocmVhZDsKKwlhZ2xfdGhyZWFkID0gJnNhaS0+c2FpX2FnbF90aHJlYWQ7CisJc2FfdGhyZWFkLT50X3BpZCA9IGN1cnJlbnRfcGlkKCk7CiAJQ0RFQlVHKERfUkVBREEsICJzdGF0YWhlYWQgdGhyZWFkIHN0YXJ0aW5nOiBzYWkgJXAsIHBhcmVudCAlcGRcbiIsCiAJICAgICAgIHNhaSwgcGFyZW50KTsKIAorCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgZGlyLCBkaXIsIE5VTEwsIDAsIDAsCisJCQkJICAgICBMVVNUUkVfT1BDX0FOWSwgZGlyKTsKKwlpZiAoSVNfRVJSKG9wX2RhdGEpKSB7CisJCXJjID0gUFRSX0VSUihvcF9kYXRhKTsKKwkJZ290byBvdXQ7CisJfQorCisJb3BfZGF0YS0+b3BfbWF4X3BhZ2VzID0gbGxfaTJzYmkoZGlyKS0+bGxfbWRfYnJ3X3BhZ2VzOworCiAJaWYgKHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfQUdMX0VOQUJMRUQpCiAJCWxsX3N0YXJ0X2FnbChwYXJlbnQsIHNhaSk7CiAKIAlhdG9taWNfaW5jKCZzYmktPmxsX3NhX3RvdGFsKTsKLQlzcGluX2xvY2soJnBsbGktPmxsaV9zYV9sb2NrKTsKLQlpZiAodGhyZWFkX2lzX2luaXQodGhyZWFkKSkKKwlzcGluX2xvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCWlmICh0aHJlYWRfaXNfaW5pdChzYV90aHJlYWQpKQogCQkvKiBJZiBzb21lb25lIGVsc2UgaGFzIGNoYW5nZWQgdGhlIHRocmVhZCBzdGF0ZQogCQkgKiAoZS5nLiBhbHJlYWR5IGNoYW5nZWQgdG8gU1ZDX1NUT1BQSU5HKSwgd2UgY2FuJ3QganVzdAogCQkgKiBibGluZGx5IG92ZXJ3cml0ZSB0aGF0IHNldHRpbmcuCiAJCSAqLwotCQl0aHJlYWRfc2V0X2ZsYWdzKHRocmVhZCwgU1ZDX1JVTk5JTkcpOwotCXNwaW5fdW5sb2NrKCZwbGxpLT5sbGlfc2FfbG9jayk7Ci0Jd2FrZV91cCgmdGhyZWFkLT50X2N0bF93YWl0cSk7CisJCXRocmVhZF9zZXRfZmxhZ3Moc2FfdGhyZWFkLCBTVkNfUlVOTklORyk7CisJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCXdha2VfdXAoJnNhX3RocmVhZC0+dF9jdGxfd2FpdHEpOwogCi0JbGxfZGlyX2NoYWluX2luaXQoJmNoYWluKTsKLQlwYWdlID0gbGxfZ2V0X2Rpcl9wYWdlKGRpciwgcG9zLCAmY2hhaW4pOwotCi0Jd2hpbGUgKDEpIHsKKwl3aGlsZSAocG9zICE9IE1EU19ESVJfRU5EX09GRiAmJiB0aHJlYWRfaXNfcnVubmluZyhzYV90aHJlYWQpKSB7CiAJCXN0cnVjdCBsdV9kaXJwYWdlICpkcDsKIAkJc3RydWN0IGx1X2RpcmVudCAgKmVudDsKIAorCQlzYWktPnNhaV9pbl9yZWFkcGFnZSA9IDE7CisJCXBhZ2UgPSBsbF9nZXRfZGlyX3BhZ2UoZGlyLCBvcF9kYXRhLCBwb3MpOworCQlzYWktPnNhaV9pbl9yZWFkcGFnZSA9IDA7CiAJCWlmIChJU19FUlIocGFnZSkpIHsKIAkJCXJjID0gUFRSX0VSUihwYWdlKTsKLQkJCUNERUJVRyhEX1JFQURBLCAiZXJyb3IgcmVhZGluZyBkaXIgIkRGSUQiIGF0ICVsbHUvJWxsdTogW3JjICVkXSBbcGFyZW50ICV1XVxuIiwKKwkJCUNERUJVRyhEX1JFQURBLCAiZXJyb3IgcmVhZGluZyBkaXIgIkRGSUQiIGF0ICVsbHUvJWxsdTogb3BlbmRpcl9waWQgPSAldTogcmMgPSAlZFxuIiwKIAkJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChkaXIpKSwgcG9zLCBzYWktPnNhaV9pbmRleCwKLQkJCSAgICAgICByYywgcGxsaS0+bGxpX29wZW5kaXJfcGlkKTsKLQkJCWdvdG8gb3V0OworCQkJICAgICAgIGxsaS0+bGxpX29wZW5kaXJfcGlkLCByYyk7CisJCQlicmVhazsKIAkJfQogCiAJCWRwID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwotCQlmb3IgKGVudCA9IGx1X2RpcmVudF9zdGFydChkcCk7IGVudDsKKwkJZm9yIChlbnQgPSBsdV9kaXJlbnRfc3RhcnQoZHApOworCQkgICAgIGVudCAmJiB0aHJlYWRfaXNfcnVubmluZyhzYV90aHJlYWQpICYmICFzYV9sb3dfaGl0KHNhaSk7CiAJCSAgICAgZW50ID0gbHVfZGlyZW50X25leHQoZW50KSkgewogCQkJX191NjQgaGFzaDsKIAkJCWludCBuYW1lbGVuOwpAQCAtMTEyMywxMjMgKzEwODUsNzkgQEAKIAkJCWlmICh1bmxpa2VseSgrK2ZpcnN0ID09IDEpKQogCQkJCWNvbnRpbnVlOwogCi1rZWVwX2l0OgotCQkJbF93YWl0X2V2ZW50KHRocmVhZC0+dF9jdGxfd2FpdHEsCi0JCQkJICAgICAhc2Ffc2VudF9mdWxsKHNhaSkgfHwKLQkJCQkgICAgICFsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX3JlY2VpdmVkKSB8fAotCQkJCSAgICAgIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfYWdsKSB8fAotCQkJCSAgICAgIXRocmVhZF9pc19ydW5uaW5nKHRocmVhZCksCi0JCQkJICAgICAmbHdpKTsKKwkJCS8qIHdhaXQgZm9yIHNwYXJlIHN0YXRhaGVhZCB3aW5kb3cgKi8KKwkJCWRvIHsKKwkJCQlsX3dhaXRfZXZlbnQoc2FfdGhyZWFkLT50X2N0bF93YWl0cSwKKwkJCQkJICAgICAhc2Ffc2VudF9mdWxsKHNhaSkgfHwKKwkJCQkJICAgICBzYV9oYXNfY2FsbGJhY2soc2FpKSB8fAorCQkJCQkgICAgICFsaXN0X2VtcHR5KCZzYWktPnNhaV9hZ2xzKSB8fAorCQkJCQkgICAgICF0aHJlYWRfaXNfcnVubmluZyhzYV90aHJlYWQpLAorCQkJCQkgICAgICZsd2kpOworCQkJCXNhX2hhbmRsZV9jYWxsYmFjayhzYWkpOwogCi1pbnRlcnByZXRfaXQ6Ci0JCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfcmVjZWl2ZWQpKQotCQkJCWxsX3Bvc3Rfc3RhdGFoZWFkKHNhaSk7CisJCQkJc3Bpbl9sb2NrKCZsbGktPmxsaV9hZ2xfbG9jayk7CisJCQkJd2hpbGUgKHNhX3NlbnRfZnVsbChzYWkpICYmCisJCQkJICAgICAgICFhZ2xfbGlzdF9lbXB0eShzYWkpKSB7CisJCQkJCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpjbGxpOwogCi0JCQlpZiAodW5saWtlbHkoIXRocmVhZF9pc19ydW5uaW5nKHRocmVhZCkpKSB7Ci0JCQkJbGxfcmVsZWFzZV9wYWdlKHBhZ2UsIDApOwotCQkJCXJjID0gMDsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQotCQkJLyogSWYgbm8gd2luZG93IGZvciBtZXRhZGF0YSBzdGF0YWhlYWQsIGJ1dCB0aGVyZSBhcmUKLQkJCSAqIHNvbWUgQUdMIGVudHJpZXMgdG8gYmUgdHJpZ2dlcmVkLCB0aGVuIHRyeSB0byBoZWxwCi0JCQkgKiB0byBwcm9jZXNzIHRoZSBBR0wgZW50cmllcy4KLQkJCSAqLwotCQkJaWYgKHNhX3NlbnRfZnVsbChzYWkpKSB7Ci0JCQkJc3Bpbl9sb2NrKCZwbGxpLT5sbGlfYWdsX2xvY2spOwotCQkJCXdoaWxlICghbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19hZ2wpKSB7Ci0JCQkJCWNsbGkgPSBsaXN0X2VudHJ5KHNhaS0+c2FpX2VudHJpZXNfYWdsLm5leHQsCisJCQkJCWNsbGkgPSBsaXN0X2VudHJ5KHNhaS0+c2FpX2FnbHMubmV4dCwKIAkJCQkJCQkgIHN0cnVjdCBsbF9pbm9kZV9pbmZvLCBsbGlfYWdsX2xpc3QpOwogCQkJCQlsaXN0X2RlbF9pbml0KCZjbGxpLT5sbGlfYWdsX2xpc3QpOwotCQkJCQlzcGluX3VubG9jaygmcGxsaS0+bGxpX2FnbF9sb2NrKTsKKwkJCQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX2FnbF9sb2NrKTsKKwogCQkJCQlsbF9hZ2xfdHJpZ2dlcigmY2xsaS0+bGxpX3Zmc19pbm9kZSwKIAkJCQkJCSAgICAgICBzYWkpOwogCi0JCQkJCWlmICghbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19yZWNlaXZlZCkpCi0JCQkJCQlnb3RvIGludGVycHJldF9pdDsKLQotCQkJCQlpZiAodW5saWtlbHkoCi0JCQkJCQkhdGhyZWFkX2lzX3J1bm5pbmcodGhyZWFkKSkpIHsKLQkJCQkJCWxsX3JlbGVhc2VfcGFnZShwYWdlLCAwKTsKLQkJCQkJCXJjID0gMDsKLQkJCQkJCWdvdG8gb3V0OwotCQkJCQl9Ci0KLQkJCQkJaWYgKCFzYV9zZW50X2Z1bGwoc2FpKSkKLQkJCQkJCWdvdG8gZG9faXQ7Ci0KLQkJCQkJc3Bpbl9sb2NrKCZwbGxpLT5sbGlfYWdsX2xvY2spOworCQkJCQlzcGluX2xvY2soJmxsaS0+bGxpX2FnbF9sb2NrKTsKIAkJCQl9Ci0JCQkJc3Bpbl91bmxvY2soJnBsbGktPmxsaV9hZ2xfbG9jayk7CisJCQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX2FnbF9sb2NrKTsKKwkJCX0gd2hpbGUgKHNhX3NlbnRfZnVsbChzYWkpICYmCisJCQkJIHRocmVhZF9pc19ydW5uaW5nKHNhX3RocmVhZCkpOwogCi0JCQkJZ290byBrZWVwX2l0OwotCQkJfQotCi1kb19pdDoKLQkJCWxsX3N0YXRhaGVhZF9vbmUocGFyZW50LCBuYW1lLCBuYW1lbGVuKTsKKwkJCXNhX3N0YXRhaGVhZChwYXJlbnQsIG5hbWUsIG5hbWVsZW4pOwogCQl9CisKIAkJcG9zID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX2VuZCk7Ci0JCWlmIChwb3MgPT0gTURTX0RJUl9FTkRfT0ZGKSB7Ci0JCQkvKgotCQkJICogRW5kIG9mIGRpcmVjdG9yeSByZWFjaGVkLgotCQkJICovCi0JCQlsbF9yZWxlYXNlX3BhZ2UocGFnZSwgMCk7Ci0JCQl3aGlsZSAoMSkgewotCQkJCWxfd2FpdF9ldmVudCh0aHJlYWQtPnRfY3RsX3dhaXRxLAotCQkJCQkgICAgICFsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX3JlY2VpdmVkKSB8fAotCQkJCQkgICAgIHNhaS0+c2FpX3NlbnQgPT0gc2FpLT5zYWlfcmVwbGllZCB8fAotCQkJCQkgICAgICF0aHJlYWRfaXNfcnVubmluZyh0aHJlYWQpLAotCQkJCQkgICAgICZsd2kpOworCQlsbF9yZWxlYXNlX3BhZ2UoZGlyLCBwYWdlLAorCQkJCWxlMzJfdG9fY3B1KGRwLT5sZHBfZmxhZ3MpICYgTERGX0NPTExJREUpOwogCi0JCQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX3JlY2VpdmVkKSkKLQkJCQkJbGxfcG9zdF9zdGF0YWhlYWQoc2FpKTsKLQotCQkJCWlmICh1bmxpa2VseSghdGhyZWFkX2lzX3J1bm5pbmcodGhyZWFkKSkpIHsKLQkJCQkJcmMgPSAwOwotCQkJCQlnb3RvIG91dDsKLQkJCQl9Ci0KLQkJCQlpZiAoc2FpLT5zYWlfc2VudCA9PSBzYWktPnNhaV9yZXBsaWVkICYmCi0JCQkJICAgIGxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfcmVjZWl2ZWQpKQotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJc3Bpbl9sb2NrKCZwbGxpLT5sbGlfYWdsX2xvY2spOwotCQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX2FnbCkgJiYKLQkJCSAgICAgICB0aHJlYWRfaXNfcnVubmluZyh0aHJlYWQpKSB7Ci0JCQkJY2xsaSA9IGxpc3RfZW50cnkoc2FpLT5zYWlfZW50cmllc19hZ2wubmV4dCwKLQkJCQkJCSAgc3RydWN0IGxsX2lub2RlX2luZm8sIGxsaV9hZ2xfbGlzdCk7Ci0JCQkJbGlzdF9kZWxfaW5pdCgmY2xsaS0+bGxpX2FnbF9saXN0KTsKLQkJCQlzcGluX3VubG9jaygmcGxsaS0+bGxpX2FnbF9sb2NrKTsKLQkJCQlsbF9hZ2xfdHJpZ2dlcigmY2xsaS0+bGxpX3Zmc19pbm9kZSwgc2FpKTsKLQkJCQlzcGluX2xvY2soJnBsbGktPmxsaV9hZ2xfbG9jayk7Ci0JCQl9Ci0JCQlzcGluX3VubG9jaygmcGxsaS0+bGxpX2FnbF9sb2NrKTsKLQotCQkJcmMgPSAwOwotCQkJZ290byBvdXQ7Ci0JCX0gZWxzZSBpZiAoMSkgewotCQkJLyoKLQkJCSAqIGNoYWluIGlzIGV4aGF1c3RlZC4KLQkJCSAqIE5vcm1hbCBjYXNlOiBjb250aW51ZSB0byB0aGUgbmV4dCBwYWdlLgotCQkJICovCi0JCQlsbF9yZWxlYXNlX3BhZ2UocGFnZSwgbGUzMl90b19jcHUoZHAtPmxkcF9mbGFncykgJgotCQkJCQkgICAgICBMREZfQ09MTElERSk7Ci0JCQlwYWdlID0gbGxfZ2V0X2Rpcl9wYWdlKGRpciwgcG9zLCAmY2hhaW4pOwotCQl9IGVsc2UgewotCQkJTEFTU0VSVChsZTMyX3RvX2NwdShkcC0+bGRwX2ZsYWdzKSAmIExERl9DT0xMSURFKTsKLQkJCWxsX3JlbGVhc2VfcGFnZShwYWdlLCAxKTsKLQkJCS8qCi0JCQkgKiBnbyBpbnRvIG92ZXJmbG93IHBhZ2UuCi0JCQkgKi8KKwkJaWYgKHNhX2xvd19oaXQoc2FpKSkgeworCQkJcmMgPSAtRUZBVUxUOworCQkJYXRvbWljX2luYygmc2JpLT5sbF9zYV93cm9uZyk7CisJCQlDREVCVUcoRF9SRUFEQSwgIlN0YXRhaGVhZCBmb3IgZGlyICJERklEIiBoaXQgcmF0aW8gdG9vIGxvdzogaGl0L21pc3MgJWxsdS8lbGx1LCBzZW50L3JlcGxpZWQgJWxsdS8lbGx1LCBzdG9wcGluZyBzdGF0YWhlYWQgdGhyZWFkOiBwaWQgJWRcbiIsCisJCQkgICAgICAgUEZJRCgmbGxpLT5sbGlfZmlkKSwgc2FpLT5zYWlfaGl0LAorCQkJICAgICAgIHNhaS0+c2FpX21pc3MsIHNhaS0+c2FpX3NlbnQsCisJCQkgICAgICAgc2FpLT5zYWlfcmVwbGllZCwgY3VycmVudF9waWQoKSk7CisJCQlicmVhazsKIAkJfQogCX0KKwlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKIAorCWlmIChyYyA8IDApIHsKKwkJc3Bpbl9sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwkJdGhyZWFkX3NldF9mbGFncyhzYV90aHJlYWQsIFNWQ19TVE9QUElORyk7CisJCWxsaS0+bGxpX3NhX2VuYWJsZWQgPSAwOworCQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisJfQorCisJLyoKKwkgKiBzdGF0YWhlYWQgaXMgZmluaXNoZWQsIGJ1dCBzdGF0YWhlYWQgZW50cmllcyBuZWVkIHRvIGJlIGNhY2hlZCwgd2FpdAorCSAqIGZvciBmaWxlIHJlbGVhc2UgdG8gc3RvcCBtZS4KKwkgKi8KKwl3aGlsZSAodGhyZWFkX2lzX3J1bm5pbmcoc2FfdGhyZWFkKSkgeworCQlsX3dhaXRfZXZlbnQoc2FfdGhyZWFkLT50X2N0bF93YWl0cSwKKwkJCSAgICAgc2FfaGFzX2NhbGxiYWNrKHNhaSkgfHwKKwkJCSAgICAgIWFnbF9saXN0X2VtcHR5KHNhaSkgfHwKKwkJCSAgICAgIXRocmVhZF9pc19ydW5uaW5nKHNhX3RocmVhZCksCisJCQkgICAgICZsd2kpOworCisJCXNhX2hhbmRsZV9jYWxsYmFjayhzYWkpOworCX0KIG91dDoKIAlpZiAoc2FpLT5zYWlfYWdsX3ZhbGlkKSB7Ci0JCXNwaW5fbG9jaygmcGxsaS0+bGxpX2FnbF9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZsbGktPmxsaV9hZ2xfbG9jayk7CiAJCXRocmVhZF9zZXRfZmxhZ3MoYWdsX3RocmVhZCwgU1ZDX1NUT1BQSU5HKTsKLQkJc3Bpbl91bmxvY2soJnBsbGktPmxsaV9hZ2xfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9hZ2xfbG9jayk7CiAJCXdha2VfdXAoJmFnbF90aHJlYWQtPnRfY3RsX3dhaXRxKTsKIAogCQlDREVCVUcoRF9SRUFEQSwgInN0b3AgYWdsIHRocmVhZDogc2FpICVwIHBpZCAldVxuIiwKQEAgLTEyNDksODQgKzExNjcsOTMgQEAKIAkJCSAgICAgJmx3aSk7CiAJfSBlbHNlIHsKIAkJLyogU2V0IGFnbF90aHJlYWQgZmxhZ3MgYW55d2F5LiAqLwotCQl0aHJlYWRfc2V0X2ZsYWdzKCZzYWktPnNhaV9hZ2xfdGhyZWFkLCBTVkNfU1RPUFBFRCk7CisJCXRocmVhZF9zZXRfZmxhZ3MoYWdsX3RocmVhZCwgU1ZDX1NUT1BQRUQpOwogCX0KLQlsbF9kaXJfY2hhaW5fZmluaSgmY2hhaW4pOwotCXNwaW5fbG9jaygmcGxsaS0+bGxpX3NhX2xvY2spOwotCWlmICghbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19yZWNlaXZlZCkpIHsKLQkJdGhyZWFkX3NldF9mbGFncyh0aHJlYWQsIFNWQ19TVE9QUElORyk7Ci0JCXNwaW5fdW5sb2NrKCZwbGxpLT5sbGlfc2FfbG9jayk7CiAKLQkJLyogVG8gcmVsZWFzZSB0aGUgcmVzb3VyY2VzIGhlbGQgYnkgcmVjZWl2ZWQgZW50cmllcy4gKi8KLQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX3JlY2VpdmVkKSkKLQkJCWxsX3Bvc3Rfc3RhdGFoZWFkKHNhaSk7Ci0KLQkJc3Bpbl9sb2NrKCZwbGxpLT5sbGlfc2FfbG9jayk7CisJLyoKKwkgKiB3YWl0IGZvciBpbmZsaWdodCBzdGF0YWhlYWQgUlBDcyB0byBmaW5pc2gsIGFuZCB0aGVuIHdlIGNhbiBmcmVlIHNhaQorCSAqIHNhZmVseSBiZWNhdXNlIHN0YXRhaGVhZCBSUEMgd2lsbCBhY2Nlc3Mgc2FpIGRhdGEKKwkgKi8KKwl3aGlsZSAoc2FpLT5zYWlfc2VudCAhPSBzYWktPnNhaV9yZXBsaWVkKSB7CisJCS8qIGluIGNhc2Ugd2UncmUgbm90IHdva2VuIHVwLCB0aW1lb3V0IHdhaXQgKi8KKwkJbHdpID0gTFdJX1RJTUVPVVQobXNlY3NfdG9famlmZmllcyhNU0VDX1BFUl9TRUMgPj4gMyksCisJCQkJICBOVUxMLCBOVUxMKTsKKwkJbF93YWl0X2V2ZW50KHNhX3RocmVhZC0+dF9jdGxfd2FpdHEsCisJCQkgICAgIHNhaS0+c2FpX3NlbnQgPT0gc2FpLT5zYWlfcmVwbGllZCwgJmx3aSk7CiAJfQotCXRocmVhZF9zZXRfZmxhZ3ModGhyZWFkLCBTVkNfU1RPUFBFRCk7Ci0Jc3Bpbl91bmxvY2soJnBsbGktPmxsaV9zYV9sb2NrKTsKLQl3YWtlX3VwKCZzYWktPnNhaV93YWl0cSk7Ci0Jd2FrZV91cCgmdGhyZWFkLT50X2N0bF93YWl0cSk7Ci0JbGxfc2FpX3B1dChzYWkpOwotCWRwdXQocGFyZW50KTsKKworCS8qIHJlbGVhc2UgcmVzb3VyY2VzIGhlbGQgYnkgc3RhdGFoZWFkIFJQQ3MgKi8KKwlzYV9oYW5kbGVfY2FsbGJhY2soc2FpKTsKKworCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisJdGhyZWFkX3NldF9mbGFncyhzYV90aHJlYWQsIFNWQ19TVE9QUEVEKTsKKwlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisKIAlDREVCVUcoRF9SRUFEQSwgInN0YXRhaGVhZCB0aHJlYWQgc3RvcHBlZDogc2FpICVwLCBwYXJlbnQgJXBkXG4iLAogCSAgICAgICBzYWksIHBhcmVudCk7CisKKwl3YWtlX3VwKCZzYWktPnNhaV93YWl0cSk7CisJd2FrZV91cCgmc2FfdGhyZWFkLT50X2N0bF93YWl0cSk7CisJbGxfc2FpX3B1dChzYWkpOworCiAJcmV0dXJuIHJjOwogfQogCi0vKioKLSAqIGNhbGxlZCBpbiBsbF9maWxlX3JlbGVhc2UoKS4KLSAqLwotdm9pZCBsbF9zdG9wX3N0YXRhaGVhZChzdHJ1Y3QgaW5vZGUgKmRpciwgdm9pZCAqa2V5KQorLyogYXV0aG9yaXplIG9wZW5lZCBkaXIgaGFuZGxlIEBrZXkgdG8gc3RhdGFoZWFkICovCit2b2lkIGxsX2F1dGhvcml6ZV9zdGF0YWhlYWQoc3RydWN0IGlub2RlICpkaXIsIHZvaWQgKmtleSkKIHsKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGRpcik7CiAKLQlpZiAodW5saWtlbHkoIWtleSkpCi0JCXJldHVybjsKKwlzcGluX2xvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCWlmICghbGxpLT5sbGlfb3BlbmRpcl9rZXkgJiYgIWxsaS0+bGxpX3NhaSkgeworCQkvKgorCQkgKiBpZiBsbGlfc2FpIGlzIG5vdCBOVUxMLCBpdCBtZWFucyBwcmV2aW91cyBzdGF0YWhlYWQgaXMgbm90CisJCSAqIGZpbmlzaGVkIHlldCwgd2UnZCBiZXR0ZXIgbm90IHN0YXJ0IGEgbmV3IHN0YXRhaGVhZCBmb3Igbm93LgorCQkgKi8KKwkJTEFTU0VSVCghbGxpLT5sbGlfb3BlbmRpcl9waWQpOworCQlsbGktPmxsaV9vcGVuZGlyX2tleSA9IGtleTsKKwkJbGxpLT5sbGlfb3BlbmRpcl9waWQgPSBjdXJyZW50X3BpZCgpOworCQlsbGktPmxsaV9zYV9lbmFibGVkID0gMTsKKwl9CisJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOworfQorCisvKgorICogZGVhdXRob3JpemUgb3BlbmVkIGRpciBoYW5kbGUgQGtleSB0byBzdGF0YWhlYWQsIGJ1dCBzdGF0YWhlYWQgdGhyZWFkIG1heQorICogc3RpbGwgYmUgcnVubmluZywgbm90aWZ5IGl0IHRvIHF1aXQuCisgKi8KK3ZvaWQgbGxfZGVhdXRob3JpemVfc3RhdGFoZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCB2b2lkICprZXkpCit7CisJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhkaXIpOworCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpOworCisJTEFTU0VSVChsbGktPmxsaV9vcGVuZGlyX2tleSA9PSBrZXkpOworCUxBU1NFUlQobGxpLT5sbGlfb3BlbmRpcl9waWQpOworCisJQ0RFQlVHKERfUkVBREEsICJkZWF1dGhvcml6ZSBzdGF0YWhlYWQgZm9yICJERklEIlxuIiwKKwkgICAgICAgUEZJRCgmbGxpLT5sbGlfZmlkKSk7CiAKIAlzcGluX2xvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCWlmIChsbGktPmxsaV9vcGVuZGlyX2tleSAhPSBrZXkgfHwgbGxpLT5sbGlfb3BlbmRpcl9waWQgPT0gMCkgewotCQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JCXJldHVybjsKLQl9Ci0KIAlsbGktPmxsaV9vcGVuZGlyX2tleSA9IE5VTEw7Ci0KLQlpZiAobGxpLT5sbGlfc2FpKSB7Ci0JCXN0cnVjdCBsX3dhaXRfaW5mbyBsd2kgPSB7IDAgfTsKLQkJc3RydWN0IHB0bHJwY190aHJlYWQgKnRocmVhZCA9ICZsbGktPmxsaV9zYWktPnNhaV90aHJlYWQ7Ci0KLQkJaWYgKCF0aHJlYWRfaXNfc3RvcHBlZCh0aHJlYWQpKSB7Ci0JCQl0aHJlYWRfc2V0X2ZsYWdzKHRocmVhZCwgU1ZDX1NUT1BQSU5HKTsKLQkJCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQkJCXdha2VfdXAoJnRocmVhZC0+dF9jdGxfd2FpdHEpOwotCi0JCQlDREVCVUcoRF9SRUFEQSwgInN0b3Agc3RhdGFoZWFkIHRocmVhZDogc2FpICVwIHBpZCAldVxuIiwKLQkJCSAgICAgICBsbGktPmxsaV9zYWksICh1bnNpZ25lZCBpbnQpdGhyZWFkLT50X3BpZCk7Ci0JCQlsX3dhaXRfZXZlbnQodGhyZWFkLT50X2N0bF93YWl0cSwKLQkJCQkgICAgIHRocmVhZF9pc19zdG9wcGVkKHRocmVhZCksCi0JCQkJICAgICAmbHdpKTsKLQkJfSBlbHNlIHsKLQkJCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQkJfQotCisJbGxpLT5sbGlfb3BlbmRpcl9waWQgPSAwOworCWxsaS0+bGxpX3NhX2VuYWJsZWQgPSAwOworCXNhaSA9IGxsaS0+bGxpX3NhaTsKKwlpZiAoc2FpICYmIHRocmVhZF9pc19ydW5uaW5nKCZzYWktPnNhaV90aHJlYWQpKSB7CiAJCS8qCi0JCSAqIFB1dCB0aGUgcmVmIHdoaWNoIHdhcyBoZWxkIHdoZW4gZmlyc3Qgc3RhdGFoZWFkX2VudGVyLgotCQkgKiBJdCBtYXliZSBub3QgdGhlIGxhc3QgcmVmIGZvciBzb21lIHN0YXRhaGVhZCByZXF1ZXN0cwotCQkgKiBtYXliZSBpbmZsaWdodC4KKwkJICogc3RhdGFoZWFkIHRocmVhZCBtYXkgbm90IHF1aXQgeWV0IGJlY2F1c2UgaXQgbmVlZHMgdG8gY2FjaGUKKwkJICogZW50cmllcywgbm93IGl0J3MgdGltZSB0byB0ZWxsIGl0IHRvIHF1aXQuCiAJCSAqLwotCQlsbF9zYWlfcHV0KGxsaS0+bGxpX3NhaSk7Ci0JfSBlbHNlIHsKLQkJbGxpLT5sbGlfb3BlbmRpcl9waWQgPSAwOwotCQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisJCXRocmVhZF9zZXRfZmxhZ3MoJnNhaS0+c2FpX3RocmVhZCwgU1ZDX1NUT1BQSU5HKTsKKwkJd2FrZV91cCgmc2FpLT5zYWlfdGhyZWFkLnRfY3RsX3dhaXRxKTsKIAl9CisJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOwogfQogCiBlbnVtIHsKIAkvKioKIAkgKiBub3QgZmlyc3QgZGlyZW50LCBvciBpcyAiLiIKIAkgKi8KLQlMU19OT05FX0ZJUlNUX0RFID0gMCwKKwlMU19OT1RfRklSU1RfREUgPSAwLAogCS8qKgogCSAqIHRoZSBmaXJzdCBub24taGlkZGVuIGRpcmVudAogCSAqLwpAQCAtMTMzNywxNyArMTI2NCwyNiBAQAogCUxTX0ZJUlNUX0RPVF9ERQogfTsKIAorLyogZmlsZSBpcyBmaXJzdCBkaXJlbnQgdW5kZXIgQGRpciAqLwogc3RhdGljIGludCBpc19maXJzdF9kaXJlbnQoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKLQlzdHJ1Y3QgbGxfZGlyX2NoYWluICAgY2hhaW47CiAJY29uc3Qgc3RydWN0IHFzdHIgICp0YXJnZXQgPSAmZGVudHJ5LT5kX25hbWU7CisJc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7CiAJc3RydWN0IHBhZ2UJICAqcGFnZTsKIAlfX3U2NAkJIHBvcyAgICA9IDA7CiAJaW50CQkgICBkb3RfZGU7Ci0JaW50CQkgICByYyAgICAgPSBMU19OT05FX0ZJUlNUX0RFOworCWludCByYyA9IExTX05PVF9GSVJTVF9ERTsKIAotCWxsX2Rpcl9jaGFpbl9pbml0KCZjaGFpbik7Ci0JcGFnZSA9IGxsX2dldF9kaXJfcGFnZShkaXIsIHBvcywgJmNoYWluKTsKKwlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGRpciwgZGlyLCBOVUxMLCAwLCAwLAorCQkJCSAgICAgTFVTVFJFX09QQ19BTlksIGRpcik7CisJaWYgKElTX0VSUihvcF9kYXRhKSkKKwkJcmV0dXJuIFBUUl9FUlIob3BfZGF0YSk7CisJLyoqCisJICogRklYTUUgY2hvb3NlIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHJlYWRkaXIKKwkgKi8KKwlvcF9kYXRhLT5vcF9tYXhfcGFnZXMgPSBsbF9pMnNiaShkaXIpLT5sbF9tZF9icndfcGFnZXM7CisKKwlwYWdlID0gbGxfZ2V0X2Rpcl9wYWdlKGRpciwgb3BfZGF0YSwgcG9zKTsKIAogCXdoaWxlICgxKSB7CiAJCXN0cnVjdCBsdV9kaXJwYWdlICpkcDsKQEAgLTEzNTcsOSArMTI5MywxMCBAQAogCQkJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhkaXIpOwogCiAJCQlyYyA9IFBUUl9FUlIocGFnZSk7Ci0JCQlDRVJST1IoImVycm9yIHJlYWRpbmcgZGlyICJERklEIiBhdCAlbGx1OiBbcmMgJWRdIFtwYXJlbnQgJXVdXG4iLAorCQkJQ0VSUk9SKCIlczogZXJyb3IgcmVhZGluZyBkaXIgIkRGSUQiIGF0ICVsbHU6IG9wZW5kaXJfcGlkID0gJXUgOiByYyA9ICVkXG4iLAorCQkJICAgICAgIGxsX2dldF9mc25hbWUoZGlyLT5pX3NiLCBOVUxMLCAwKSwKIAkJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChkaXIpKSwgcG9zLAotCQkJICAgICAgIHJjLCBsbGktPmxsaV9vcGVuZGlyX3BpZCk7CisJCQkgICAgICAgbGxpLT5sbGlfb3BlbmRpcl9waWQsIHJjKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTE0MTEsMTMgKzEzNDgsMTMgQEAKIAogCQkJaWYgKHRhcmdldC0+bGVuICE9IG5hbWVsZW4gfHwKIAkJCSAgICBtZW1jbXAodGFyZ2V0LT5uYW1lLCBuYW1lLCBuYW1lbGVuKSAhPSAwKQotCQkJCXJjID0gTFNfTk9ORV9GSVJTVF9ERTsKKwkJCQlyYyA9IExTX05PVF9GSVJTVF9ERTsKIAkJCWVsc2UgaWYgKCFkb3RfZGUpCiAJCQkJcmMgPSBMU19GSVJTVF9ERTsKIAkJCWVsc2UKIAkJCQlyYyA9IExTX0ZJUlNUX0RPVF9ERTsKIAotCQkJbGxfcmVsZWFzZV9wYWdlKHBhZ2UsIDApOworCQkJbGxfcmVsZWFzZV9wYWdlKGRpciwgcGFnZSwgZmFsc2UpOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJcG9zID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX2VuZCk7CkBAIC0xNDI1LDI2MSArMTM2MiwyMjggQEAKIAkJCS8qCiAJCQkgKiBFbmQgb2YgZGlyZWN0b3J5IHJlYWNoZWQuCiAJCQkgKi8KLQkJCWxsX3JlbGVhc2VfcGFnZShwYWdlLCAwKTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKDEpIHsKKwkJCWxsX3JlbGVhc2VfcGFnZShkaXIsIHBhZ2UsIGZhbHNlKTsKKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIGNoYWluIGlzIGV4aGF1c3RlZAogCQkJICogTm9ybWFsIGNhc2U6IGNvbnRpbnVlIHRvIHRoZSBuZXh0IHBhZ2UuCiAJCQkgKi8KLQkJCWxsX3JlbGVhc2VfcGFnZShwYWdlLCBsZTMyX3RvX2NwdShkcC0+bGRwX2ZsYWdzKSAmCi0JCQkJCSAgICAgIExERl9DT0xMSURFKTsKLQkJCXBhZ2UgPSBsbF9nZXRfZGlyX3BhZ2UoZGlyLCBwb3MsICZjaGFpbik7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogZ28gaW50byBvdmVyZmxvdyBwYWdlLgotCQkJICovCi0JCQlMQVNTRVJUKGxlMzJfdG9fY3B1KGRwLT5sZHBfZmxhZ3MpICYgTERGX0NPTExJREUpOwotCQkJbGxfcmVsZWFzZV9wYWdlKHBhZ2UsIDEpOworCQkJbGxfcmVsZWFzZV9wYWdlKGRpciwgcGFnZSwKKwkJCQkJbGUzMl90b19jcHUoZHAtPmxkcF9mbGFncykgJgorCQkJCQlMREZfQ09MTElERSk7CisJCQlwYWdlID0gbGxfZ2V0X2Rpcl9wYWdlKGRpciwgb3BfZGF0YSwgcG9zKTsKIAkJfQogCX0KLQogb3V0OgotCWxsX2Rpcl9jaGFpbl9maW5pKCZjaGFpbik7CisJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7CiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZAotbGxfc2FpX3VucGx1ZyhzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgc3RydWN0IGxsX3NhX2VudHJ5ICplbnRyeSkKKy8qKgorICogcmV2YWxpZGF0ZSBAZGVudHJ5cCBmcm9tIHN0YXRhaGVhZCBjYWNoZQorICoKKyAqIFxwYXJhbVtpbl0gIGRpcglwYXJlbnQgZGlyZWN0b3J5CisgKiBccGFyYW1baW5dICBzYWkJc2FpIHN0cnVjdHVyZQorICogXHBhcmFtW291dF0gZGVudHJ5cAlwb2ludGVyIHRvIGRlbnRyeSB3aGljaCB3aWxsIGJlIHJldmFsaWRhdGVkCisgKiBccGFyYW1baW5dICB1bnBsdWcJdW5wbHVnIHN0YXRhaGVhZCB3aW5kb3cgb25seSAobm9ybWFsbHkgZm9yIG5lZ2F0aXZlCisgKgkJCWRlbnRyeSkKKyAqIFxyZXR2YWwJCTEgb24gc3VjY2VzcywgZGVudHJ5IGlzIHNhdmVkIGluIEBkZW50cnlwCisgKiBccmV0dmFsCQkwIGlmIHJldmFsaWRhdGlvbiBmYWlsZWQgKG5vIHByb3BlciBsb2NrIG9uIGNsaWVudCkKKyAqIFxyZXR2YWwJCW5lZ2F0aXZlIG51bWJlciB1cG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgcmV2YWxpZGF0ZV9zdGF0YWhlYWRfZGVudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJCSAgICAgICBzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwKKwkJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqKmRlbnRyeXAsCisJCQkJICAgICAgIGJvb2wgdW5wbHVnKQogewotCXN0cnVjdCBwdGxycGNfdGhyZWFkICp0aHJlYWQgPSAmc2FpLT5zYWlfdGhyZWFkOwotCXN0cnVjdCBsbF9zYl9pbmZvICAgICpzYmkgICAgPSBsbF9pMnNiaShzYWktPnNhaV9pbm9kZSk7Ci0JaW50CQkgICBoaXQ7CisJc3RydWN0IHNhX2VudHJ5ICplbnRyeSA9IE5VTEw7CisJc3RydWN0IGxfd2FpdF9pbmZvIGx3aSA9IHsgMCB9OworCXN0cnVjdCBsbF9kZW50cnlfZGF0YSAqbGRkOworCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGk7CisJaW50IHJjID0gMDsKIAotCWlmIChlbnRyeSAmJiBlbnRyeS0+c2Vfc3RhdCA9PSBTQV9FTlRSWV9TVUNDKQotCQloaXQgPSAxOwotCWVsc2UKLQkJaGl0ID0gMDsKKwlpZiAoKCpkZW50cnlwKS0+ZF9uYW1lLm5hbWVbMF0gPT0gJy4nKSB7CisJCWlmIChzYWktPnNhaV9sc19hbGwgfHwKKwkJICAgIHNhaS0+c2FpX21pc3NfaGlkZGVuID49IHNhaS0+c2FpX3NraXBfaGlkZGVuKSB7CisJCQkvKgorCQkJICogSGlkZGVuIGRlbnRyeSBpcyB0aGUgZmlyc3Qgb25lLCBvciBzdGF0YWhlYWQKKwkJCSAqIHRocmVhZCBkb2VzIG5vdCBza2lwIHNvIG1hbnkgaGlkZGVuIGRlbnRyaWVzCisJCQkgKiBiZWZvcmUgInNhaV9sc19hbGwiIGVuYWJsZWQgYXMgYmVsb3cuCisJCQkgKi8KKwkJfSBlbHNlIHsKKwkJCWlmICghc2FpLT5zYWlfbHNfYWxsKQorCQkJCS8qCisJCQkJICogSXQgbWF5YmUgYmVjYXVzZSBoaWRkZW4gZGVudHJ5IGlzIG5vdAorCQkJCSAqIHRoZSBmaXJzdCBvbmUsICJzYWlfbHNfYWxsIiB3YXMgbm90CisJCQkJICogc2V0LCB0aGVuICJscyAtYWwiIG1pc3NlZC4gRW5hYmxlCisJCQkJICogInNhaV9sc19hbGwiIGZvciBzdWNoIGNhc2UuCisJCQkJICovCisJCQkJc2FpLT5zYWlfbHNfYWxsID0gMTsKIAotCWxsX3NhX2VudHJ5X2Zpbmkoc2FpLCBlbnRyeSk7Ci0JaWYgKGhpdCkgewotCQlzYWktPnNhaV9oaXQrKzsKLQkJc2FpLT5zYWlfY29uc2VjdXRpdmVfbWlzcyA9IDA7Ci0JCXNhaS0+c2FpX21heCA9IG1pbigyICogc2FpLT5zYWlfbWF4LCBzYmktPmxsX3NhX21heCk7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhzYWktPnNhaV9pbm9kZSk7Ci0KLQkJc2FpLT5zYWlfbWlzcysrOwotCQlzYWktPnNhaV9jb25zZWN1dGl2ZV9taXNzKys7Ci0JCWlmIChzYV9sb3dfaGl0KHNhaSkgJiYgdGhyZWFkX2lzX3J1bm5pbmcodGhyZWFkKSkgewotCQkJYXRvbWljX2luYygmc2JpLT5sbF9zYV93cm9uZyk7Ci0JCQlDREVCVUcoRF9SRUFEQSwgIlN0YXRhaGVhZCBmb3IgZGlyICIgREZJRCAiIGhpdCByYXRpbyB0b28gbG93OiBoaXQvbWlzcyAlbGx1LyVsbHUsIHNlbnQvcmVwbGllZCAlbGx1LyVsbHUsIHN0b3BwaW5nIHN0YXRhaGVhZCB0aHJlYWRcbiIsCi0JCQkgICAgICAgUEZJRCgmbGxpLT5sbGlfZmlkKSwgc2FpLT5zYWlfaGl0LAotCQkJICAgICAgIHNhaS0+c2FpX21pc3MsIHNhaS0+c2FpX3NlbnQsCi0JCQkgICAgICAgc2FpLT5zYWlfcmVwbGllZCk7Ci0JCQlzcGluX2xvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCQkJaWYgKCF0aHJlYWRfaXNfc3RvcHBlZCh0aHJlYWQpKQotCQkJCXRocmVhZF9zZXRfZmxhZ3ModGhyZWFkLCBTVkNfU1RPUFBJTkcpOwotCQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCQkJLyoKKwkJCSAqIFN1Y2ggImdldGF0dHIiIGhhcyBiZWVuIHNraXBwZWQgYmVmb3JlCisJCQkgKiAic2FpX2xzX2FsbCIgZW5hYmxlZCBhcyBhYm92ZS4KKwkJCSAqLworCQkJc2FpLT5zYWlfbWlzc19oaWRkZW4rKzsKKwkJCXJldHVybiAtRUFHQUlOOwogCQl9CiAJfQogCi0JaWYgKCF0aHJlYWRfaXNfc3RvcHBlZCh0aHJlYWQpKQotCQl3YWtlX3VwKCZ0aHJlYWQtPnRfY3RsX3dhaXRxKTsKKwlpZiAodW5wbHVnKSB7CisJCXJjID0gMTsKKwkJZ290byBvdXRfdW5wbHVnOworCX0KKworCWVudHJ5ID0gc2FfZ2V0KHNhaSwgJigqZGVudHJ5cCktPmRfbmFtZSk7CisJaWYgKCFlbnRyeSkgeworCQlyYyA9IC1FQUdBSU47CisJCWdvdG8gb3V0X3VucGx1ZzsKKwl9CisKKwkvKiBpZiBzdGF0YWhlYWQgaXMgYnVzeSBpbiByZWFkZGlyLCBoZWxwIGl0IGRvIHBvc3Qtd29yayAqLworCWlmICghc2FfcmVhZHkoZW50cnkpICYmIHNhaS0+c2FpX2luX3JlYWRwYWdlKQorCQlzYV9oYW5kbGVfY2FsbGJhY2soc2FpKTsKKworCWlmICghc2FfcmVhZHkoZW50cnkpKSB7CisJCXNhaS0+c2FpX2luZGV4X3dhaXQgPSBlbnRyeS0+c2VfaW5kZXg7CisJCWx3aSA9IExXSV9USU1FT1VUX0lOVFIoY2ZzX3RpbWVfc2Vjb25kcygzMCksIE5VTEwsCisJCQkJICAgICAgIExXSV9PTl9TSUdOQUxfTk9PUCwgTlVMTCk7CisJCXJjID0gbF93YWl0X2V2ZW50KHNhaS0+c2FpX3dhaXRxLCBzYV9yZWFkeShlbnRyeSksICZsd2kpOworCQlpZiAocmMgPCAwKSB7CisJCQkvKgorCQkJICogZW50cnkgbWF5IG5vdCBiZSByZWFkeSwgc28gaXQgbWF5IGJlIHVzZWQgYnkgaW5mbGlnaHQKKwkJCSAqIHN0YXRhaGVhZCBSUEMsIGRvbid0IGZyZWUgaXQuCisJCQkgKi8KKwkJCWVudHJ5ID0gTlVMTDsKKwkJCXJjID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0X3VucGx1ZzsKKwkJfQorCX0KKworCWlmIChlbnRyeS0+c2Vfc3RhdGUgPT0gU0FfRU5UUllfU1VDQyAmJiBlbnRyeS0+c2VfaW5vZGUpIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGVudHJ5LT5zZV9pbm9kZTsKKwkJc3RydWN0IGxvb2t1cF9pbnRlbnQgaXQgPSB7IC5pdF9vcCA9IElUX0dFVEFUVFIsCisJCQkJCSAgICAuaXRfbG9ja19oYW5kbGUgPSBlbnRyeS0+c2VfaGFuZGxlIH07CisJCV9fdTY0IGJpdHM7CisKKwkJcmMgPSBtZF9yZXZhbGlkYXRlX2xvY2sobGxfaTJtZGV4cChkaXIpLCAmaXQsCisJCQkJCWxsX2lub2RlMmZpZChpbm9kZSksICZiaXRzKTsKKwkJaWYgKHJjID09IDEpIHsKKwkJCWlmICghKCpkZW50cnlwKS0+ZF9pbm9kZSkgeworCQkJCXN0cnVjdCBkZW50cnkgKmFsaWFzOworCisJCQkJYWxpYXMgPSBsbF9zcGxpY2VfYWxpYXMoaW5vZGUsICpkZW50cnlwKTsKKwkJCQlpZiAoSVNfRVJSKGFsaWFzKSkgeworCQkJCQlyYyA9IFBUUl9FUlIoYWxpYXMpOworCQkJCQlnb3RvIG91dF91bnBsdWc7CisJCQkJfQorCQkJCSpkZW50cnlwID0gYWxpYXM7CisJCQkJLyoqCisJCQkJICogc3RhdGFoZWFkIHByZXBhcmVkIHRoaXMgaW5vZGUsIHRyYW5zZmVyIGlub2RlCisJCQkJICogcmVmY291bnQgZnJvbSBzYV9lbnRyeSB0byBkZW50cnkKKwkJCQkgKi8KKwkJCQllbnRyeS0+c2VfaW5vZGUgPSBOVUxMOworCQkJfSBlbHNlIGlmICgoKmRlbnRyeXApLT5kX2lub2RlICE9IGlub2RlKSB7CisJCQkJLyogcmV2YWxpZGF0ZSwgYnV0IGlub2RlIGlzIHJlY3JlYXRlZCAqLworCQkJCUNERUJVRyhEX1JFQURBLAorCQkJCSAgICAgICAiJXM6IHN0YWxlIGRlbnRyeSAlcGQgaW5vZGUgIkRGSUQiLCBzdGF0YWhlYWQgaW5vZGUgIkRGSUQiXG4iLAorCQkJCSAgICAgICBsbF9nZXRfZnNuYW1lKCgqZGVudHJ5cCktPmRfaW5vZGUtPmlfc2IsCisJCQkJCQkgICAgIE5VTEwsIDApLAorCQkJCSAgICAgICAqZGVudHJ5cCwKKwkJCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoKCpkZW50cnlwKS0+ZF9pbm9kZSkpLAorCQkJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpKTsKKwkJCQlyYyA9IC1FU1RBTEU7CisJCQkJZ290byBvdXRfdW5wbHVnOworCQkJfQorCisJCQlpZiAoKGJpdHMgJiBNRFNfSU5PREVMT0NLX0xPT0tVUCkgJiYKKwkJCSAgICBkX2x1c3RyZV9pbnZhbGlkKCpkZW50cnlwKSkKKwkJCQlkX2x1c3RyZV9yZXZhbGlkYXRlKCpkZW50cnlwKTsKKwkJCWxsX2ludGVudF9yZWxlYXNlKCZpdCk7CisJCX0KKwl9CitvdXRfdW5wbHVnOgorCS8qCisJICogc3RhdGFoZWFkIGNhY2hlZCBzYV9lbnRyeSBjYW4gYmUgdXNlZCBvbmx5IG9uY2UsIGFuZCB3aWxsIGJlIGtpbGxlZAorCSAqIHJpZ2h0IGFmdGVyIHVzZSwgc28gaWYgbG9va3VwL3JldmFsaWRhdGUgYWNjZXNzZWQgc3RhdGFoZWFkIGNhY2hlLAorCSAqIHNldCBkZW50cnkgbGRkX3NhX2dlbmVyYXRpb24gdG8gcGFyZW50IGxsaV9zYV9nZW5lcmF0aW9uLCBsYXRlciBpZiB3ZQorCSAqIHN0YXQgdGhpcyBmaWxlIGFnYWluLCB3ZSBrbm93IHdlJ3ZlIGRvbmUgc3RhdGFoZWFkIGJlZm9yZSwgc2VlCisJICogZGVudHJ5X21heV9zdGF0YWhlYWQoKS4KKwkgKi8KKwlsZGQgPSBsbF9kMmQoKmRlbnRyeXApOworCWxsaSA9IGxsX2kyaW5mbyhkaXIpOworCS8qIGxkZCBjYW4gYmUgTlVMTCBpZiBsbGl0ZSBsb29rdXAgZmFpbGVkLiAqLworCWlmIChsZGQpCisJCWxkZC0+bGxkX3NhX2dlbmVyYXRpb24gPSBsbGktPmxsaV9zYV9nZW5lcmF0aW9uOworCXNhX3B1dChzYWksIGVudHJ5KTsKKwlyZXR1cm4gcmM7CiB9CiAKIC8qKgotICogU3RhcnQgc3RhdGFoZWFkIHRocmVhZCBpZiB0aGlzIGlzIHRoZSBmaXJzdCBkaXIgZW50cnkuCi0gKiBPdGhlcndpc2UgaWYgYSB0aHJlYWQgaXMgc3RhcnRlZCBhbHJlYWR5LCB3YWl0IGl0IHVudGlsIGl0IGlzIGFoZWFkIG9mIG1lLgotICogXHJldHZhbCAxICAgICAgIC0tIGZpbmQgZW50cnkgd2l0aCBsb2NrIGluIGNhY2hlLCB0aGUgY2FsbGVyIG5lZWRzIHRvIGRvCi0gKgkJICAgIG5vdGhpbmcuCi0gKiBccmV0dmFsIDAgICAgICAgLS0gZmluZCBlbnRyeSBpbiBjYWNoZSwgYnV0IHdpdGhvdXQgbG9jaywgdGhlIGNhbGxlciBuZWVkcwotICoJCSAgICByZWZyZXNoIGZyb20gTURTLgotICogXHJldHZhbCBvdGhlcnMgIC0tIHRoZSBjYWxsZXIgbmVlZCB0byBwcm9jZXNzIGFzIG5vbi1zdGF0YWhlYWQuCisgKiBzdGFydCBzdGF0YWhlYWQgdGhyZWFkCisgKgorICogXHBhcmFtW2luXSBkaXIJcGFyZW50IGRpcmVjdG9yeQorICogXHBhcmFtW2luXSBkZW50cnkJZGVudHJ5IHRoYXQgdHJpZ2dlcnMgc3RhdGFoZWFkLCBub3JtYWxseSB0aGUgZmlyc3QKKyAqCQkJZGlyZW50IHVuZGVyIEBkaXIKKyAqIFxyZXR2YWwJCS1FQUdBSU4gb24gc3VjY2VzcywgYmVjYXVzZSB3aGVuIHRoaXMgZnVuY3Rpb24gaXMKKyAqCQkJY2FsbGVkLCBpdCdzIGFscmVhZHkgaW4gbG9va3VwIGNhbGwsIHNvIGNsaWVudCBzaG91bGQKKyAqCQkJZG8gaXQgaXRzZWxmIGluc3RlYWQgb2Ygd2FpdGluZyBmb3Igc3RhdGFoZWFkIHRocmVhZAorICoJCQl0byBkbyBpdCBhc3luY2hyb25vdXNseS4KKyAqIFxyZXR2YWwJCW5lZ2F0aXZlIG51bWJlciB1cG9uIGVycm9yCiAgKi8KLWludCBkb19zdGF0YWhlYWRfZW50ZXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKipkZW50cnlwLAotCQkgICAgICAgaW50IG9ubHlfdW5wbHVnKQorc3RhdGljIGludCBzdGFydF9zdGF0YWhlYWRfdGhyZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7Ci0Jc3RydWN0IGxsX2lub2RlX2luZm8gICAgICpsbGkgICA9IGxsX2kyaW5mbyhkaXIpOwotCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpICAgPSBsbGktPmxsaV9zYWk7Ci0Jc3RydWN0IGRlbnRyeQkgICAgKnBhcmVudDsKLQlzdHJ1Y3QgbGxfc2FfZW50cnkgICAgICAgKmVudHJ5OwotCXN0cnVjdCBwdGxycGNfdGhyZWFkICAgICAqdGhyZWFkOwotCXN0cnVjdCBsX3dhaXRfaW5mbwlsd2kgICA9IHsgMCB9OworCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oZGlyKTsKKwlzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSA9IE5VTEw7CisJc3RydWN0IGxfd2FpdF9pbmZvIGx3aSA9IHsgMCB9OworCXN0cnVjdCBwdGxycGNfdGhyZWFkICp0aHJlYWQ7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwotCWludAkJICAgICAgIHJjICAgID0gMDsKLQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAgICAgKnBsbGk7Ci0KLQlMQVNTRVJUKGxsaS0+bGxpX29wZW5kaXJfcGlkID09IGN1cnJlbnRfcGlkKCkpOwotCi0JaWYgKHNhaSkgewotCQl0aHJlYWQgPSAmc2FpLT5zYWlfdGhyZWFkOwotCQlpZiAodW5saWtlbHkodGhyZWFkX2lzX3N0b3BwZWQodGhyZWFkKSAmJgotCQkJICAgICBsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX3N0YXRlZCkpKSB7Ci0JCQkvKiB0byByZWxlYXNlIHJlc291cmNlICovCi0JCQlsbF9zdG9wX3N0YXRhaGVhZChkaXIsIGxsaS0+bGxpX29wZW5kaXJfa2V5KTsKLQkJCXJldHVybiAtRUFHQUlOOwotCQl9Ci0KLQkJaWYgKCgqZGVudHJ5cCktPmRfbmFtZS5uYW1lWzBdID09ICcuJykgewotCQkJaWYgKHNhaS0+c2FpX2xzX2FsbCB8fAotCQkJICAgIHNhaS0+c2FpX21pc3NfaGlkZGVuID49IHNhaS0+c2FpX3NraXBfaGlkZGVuKSB7Ci0JCQkJLyoKLQkJCQkgKiBIaWRkZW4gZGVudHJ5IGlzIHRoZSBmaXJzdCBvbmUsIG9yIHN0YXRhaGVhZAotCQkJCSAqIHRocmVhZCBkb2VzIG5vdCBza2lwIHNvIG1hbnkgaGlkZGVuIGRlbnRyaWVzCi0JCQkJICogYmVmb3JlICJzYWlfbHNfYWxsIiBlbmFibGVkIGFzIGJlbG93LgotCQkJCSAqLwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIXNhaS0+c2FpX2xzX2FsbCkKLQkJCQkJLyoKLQkJCQkJICogSXQgbWF5YmUgYmVjYXVzZSBoaWRkZW4gZGVudHJ5IGlzIG5vdAotCQkJCQkgKiB0aGUgZmlyc3Qgb25lLCAic2FpX2xzX2FsbCIgd2FzIG5vdAotCQkJCQkgKiBzZXQsIHRoZW4gImxzIC1hbCIgbWlzc2VkLiBFbmFibGUKLQkJCQkJICogInNhaV9sc19hbGwiIGZvciBzdWNoIGNhc2UuCi0JCQkJCSAqLwotCQkJCQlzYWktPnNhaV9sc19hbGwgPSAxOwotCi0JCQkJLyoKLQkJCQkgKiBTdWNoICJnZXRhdHRyIiBoYXMgYmVlbiBza2lwcGVkIGJlZm9yZQotCQkJCSAqICJzYWlfbHNfYWxsIiBlbmFibGVkIGFzIGFib3ZlLgotCQkJCSAqLwotCQkJCXNhaS0+c2FpX21pc3NfaGlkZGVuKys7Ci0JCQkJcmV0dXJuIC1FQUdBSU47Ci0JCQl9Ci0JCX0KLQotCQllbnRyeSA9IGxsX3NhX2VudHJ5X2dldF9ieW5hbWUoc2FpLCAmKCpkZW50cnlwKS0+ZF9uYW1lKTsKLQkJaWYgKCFlbnRyeSB8fCBvbmx5X3VucGx1ZykgewotCQkJbGxfc2FpX3VucGx1ZyhzYWksIGVudHJ5KTsKLQkJCXJldHVybiBlbnRyeSA/IDEgOiAtRUFHQUlOOwotCQl9Ci0KLQkJaWYgKCFsbF9zYV9lbnRyeV9zdGF0ZWQoZW50cnkpKSB7Ci0JCQlzYWktPnNhaV9pbmRleF93YWl0ID0gZW50cnktPnNlX2luZGV4OwotCQkJbHdpID0gTFdJX1RJTUVPVVRfSU5UUihjZnNfdGltZV9zZWNvbmRzKDMwKSwgTlVMTCwKLQkJCQkJICAgICAgIExXSV9PTl9TSUdOQUxfTk9PUCwgTlVMTCk7Ci0JCQlyYyA9IGxfd2FpdF9ldmVudChzYWktPnNhaV93YWl0cSwKLQkJCQkJICBsbF9zYV9lbnRyeV9zdGF0ZWQoZW50cnkpIHx8Ci0JCQkJCSAgdGhyZWFkX2lzX3N0b3BwZWQodGhyZWFkKSwKLQkJCQkJICAmbHdpKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlsbF9zYWlfdW5wbHVnKHNhaSwgZW50cnkpOwotCQkJCXJldHVybiAtRUFHQUlOOwotCQkJfQotCQl9Ci0KLQkJaWYgKGVudHJ5LT5zZV9zdGF0ID09IFNBX0VOVFJZX1NVQ0MgJiYgZW50cnktPnNlX2lub2RlKSB7Ci0JCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZW50cnktPnNlX2lub2RlOwotCQkJc3RydWN0IGxvb2t1cF9pbnRlbnQgaXQgPSB7IC5pdF9vcCA9IElUX0dFVEFUVFIsCi0JCQkJCQkgICAgLml0X2xvY2tfaGFuZGxlID0KLQkJCQkJCSAgICAgZW50cnktPnNlX2hhbmRsZSB9OwotCQkJX191NjQgYml0czsKLQotCQkJcmMgPSBtZF9yZXZhbGlkYXRlX2xvY2sobGxfaTJtZGV4cChkaXIpLCAmaXQsCi0JCQkJCQlsbF9pbm9kZTJmaWQoaW5vZGUpLCAmYml0cyk7Ci0JCQlpZiAocmMgPT0gMSkgewotCQkJCWlmICghZF9pbm9kZSgqZGVudHJ5cCkpIHsKLQkJCQkJc3RydWN0IGRlbnRyeSAqYWxpYXM7Ci0KLQkJCQkJYWxpYXMgPSBsbF9zcGxpY2VfYWxpYXMoaW5vZGUsCi0JCQkJCQkJCSpkZW50cnlwKTsKLQkJCQkJaWYgKElTX0VSUihhbGlhcykpIHsKLQkJCQkJCWxsX3NhaV91bnBsdWcoc2FpLCBlbnRyeSk7Ci0JCQkJCQlyZXR1cm4gUFRSX0VSUihhbGlhcyk7Ci0JCQkJCX0KLQkJCQkJKmRlbnRyeXAgPSBhbGlhczsKLQkJCQl9IGVsc2UgaWYgKGRfaW5vZGUoKmRlbnRyeXApICE9IGlub2RlKSB7Ci0JCQkJCS8qIHJldmFsaWRhdGUsIGJ1dCBpbm9kZSBpcyByZWNyZWF0ZWQgKi8KLQkJCQkJQ0RFQlVHKERfUkVBREEsICIlczogc3RhbGUgZGVudHJ5ICVwZCBpbm9kZSAiREZJRCIsIHN0YXRhaGVhZCBpbm9kZSAiREZJRCJcbiIsCi0JCQkJCSAgICAgICBsbF9nZXRfZnNuYW1lKGRfaW5vZGUoKmRlbnRyeXApLT5pX3NiLCBOVUxMLCAwKSwKLQkJCQkJICAgICAgICpkZW50cnlwLAotCQkJCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoZF9pbm9kZSgqZGVudHJ5cCkpKSwKLQkJCQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSkpOwotCQkJCQlsbF9zYWlfdW5wbHVnKHNhaSwgZW50cnkpOwotCQkJCQlyZXR1cm4gLUVTVEFMRTsKLQkJCQl9IGVsc2UgewotCQkJCQlpcHV0KGlub2RlKTsKLQkJCQl9Ci0JCQkJZW50cnktPnNlX2lub2RlID0gTlVMTDsKLQotCQkJCWlmICgoYml0cyAmIE1EU19JTk9ERUxPQ0tfTE9PS1VQKSAmJgotCQkJCSAgICBkX2x1c3RyZV9pbnZhbGlkKCpkZW50cnlwKSkKLQkJCQkJZF9sdXN0cmVfcmV2YWxpZGF0ZSgqZGVudHJ5cCk7Ci0JCQkJbGxfaW50ZW50X3JlbGVhc2UoJml0KTsKLQkJCX0KLQkJfQotCi0JCWxsX3NhaV91bnBsdWcoc2FpLCBlbnRyeSk7Ci0JCXJldHVybiByYzsKLQl9CisJc3RydWN0IGRlbnRyeSAqcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudDsKKwlpbnQgcmM7CiAKIAkvKiBJIGFtIHRoZSAibGxpX29wZW5kaXJfcGlkIiBvd25lciwgb25seSBtZSBjYW4gc2V0ICJsbGlfc2FpIi4gKi8KLQlyYyA9IGlzX2ZpcnN0X2RpcmVudChkaXIsICpkZW50cnlwKTsKLQlpZiAocmMgPT0gTFNfTk9ORV9GSVJTVF9ERSkgeworCXJjID0gaXNfZmlyc3RfZGlyZW50KGRpciwgZGVudHJ5KTsKKwlpZiAocmMgPT0gTFNfTk9UX0ZJUlNUX0RFKSB7CiAJCS8qIEl0IGlzIG5vdCAibHMgLXthfWwiIG9wZXJhdGlvbiwgbm8gbmVlZCBzdGF0YWhlYWQgZm9yIGl0LiAqLwotCQlyYyA9IC1FQUdBSU47CisJCXJjID0gLUVGQVVMVDsKIAkJZ290byBvdXQ7CiAJfQogCi0Jc2FpID0gbGxfc2FpX2FsbG9jKCk7CisJc2FpID0gbGxfc2FpX2FsbG9jKHBhcmVudCk7CiAJaWYgKCFzYWkpIHsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CiAKIAlzYWktPnNhaV9sc19hbGwgPSAocmMgPT0gTFNfRklSU1RfRE9UX0RFKTsKLQlzYWktPnNhaV9pbm9kZSA9IGlncmFiKGRpcik7Ci0JaWYgKHVubGlrZWx5KCFzYWktPnNhaV9pbm9kZSkpIHsKLQkJQ1dBUk4oIkRvIG5vdCBzdGFydCBzdGF0IGFoZWFkIG9uIGR5aW5nIGlub2RlICJERklEIlxuIiwKLQkJICAgICAgUEZJRCgmbGxpLT5sbGlfZmlkKSk7Ci0JCXJjID0gLUVTVEFMRTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogZ2V0IHBhcmVudCByZWZlcmVuY2UgY291bnQgaGVyZSwgYW5kIHB1dCBpdCBpbiBsbF9zdGF0YWhlYWRfdGhyZWFkICovCi0JcGFyZW50ID0gZGdldCgoKmRlbnRyeXApLT5kX3BhcmVudCk7Ci0JaWYgKHVubGlrZWx5KHNhaS0+c2FpX2lub2RlICE9IGRfaW5vZGUocGFyZW50KSkpIHsKLQkJc3RydWN0IGxsX2lub2RlX2luZm8gKm5sbGkgPSBsbF9pMmluZm8oZF9pbm9kZShwYXJlbnQpKTsKLQotCQlDV0FSTigiUmFjZSBjb25kaXRpb24sIHNvbWVvbmUgY2hhbmdlZCAlcGQganVzdCBub3c6IG9sZCBwYXJlbnQgIkRGSUQiLCBuZXcgcGFyZW50ICJERklEIlxuIiwKLQkJICAgICAgKmRlbnRyeXAsCi0JCSAgICAgIFBGSUQoJmxsaS0+bGxpX2ZpZCksIFBGSUQoJm5sbGktPmxsaV9maWQpKTsKLQkJZHB1dChwYXJlbnQpOwotCQlpcHV0KHNhaS0+c2FpX2lub2RlKTsKLQkJcmMgPSAtRUFHQUlOOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlDREVCVUcoRF9SRUFEQSwgInN0YXJ0IHN0YXRhaGVhZCB0aHJlYWQ6IHNhaSAlcCwgcGFyZW50ICVwZFxuIiwKLQkgICAgICAgc2FpLCBwYXJlbnQpOwotCi0JLyogVGhlIHNhaSBidWZmZXIgYWxyZWFkeSBoYXMgb25lIHJlZmVyZW5jZSB0YWtlbiBhdCBhbGxvY2F0aW9uIHRpbWUsCi0JICogYnV0IGFzIHNvb24gYXMgd2UgZXhwb3NlIHRoZSBzYWkgYnkgYXR0YWNoaW5nIGl0IHRvIHRoZSBsbGkgdGhhdAotCSAqIGRlZmF1bHQgcmVmZXJlbmNlIGNhbiBiZSBkcm9wcGVkIGJ5IGFub3RoZXIgdGhyZWFkIGNhbGxpbmcKLQkgKiBsbF9zdG9wX3N0YXRhaGVhZC4gV2UgbmVlZCB0byB0YWtlIGEgbG9jYWwgcmVmZXJlbmNlIHRvIHByb3RlY3QKLQkgKiB0aGUgc2FpIGJ1ZmZlciB3aGlsZSB3ZSBpbnRlbmQgdG8gYWNjZXNzIGl0LgorCS8qCisJICogaWYgY3VycmVudCBsbGlfb3BlbmRpcl9rZXkgd2FzIGRlYXV0aG9yaXplZCwgb3IgZGlyIHJlLW9wZW5lZCBieQorCSAqIGFub3RoZXIgcHJvY2VzcywgZG9uJ3Qgc3RhcnQgc3RhdGFoZWFkLCBvdGhlcndpc2UgdGhlIG5ld2x5IHNwYXduZWQKKwkgKiBzdGF0YWhlYWQgdGhyZWFkIHdvbid0IGJlIG5vdGlmaWVkIHRvIHF1aXQuCiAJICovCi0JbGxfc2FpX2dldChzYWkpOworCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisJaWYgKHVubGlrZWx5KGxsaS0+bGxpX3NhaSB8fCBsbGktPmxsaV9vcGVuZGlyX2tleSB8fAorCQkgICAgIGxsaS0+bGxpX29wZW5kaXJfcGlkICE9IGN1cnJlbnQtPnBpZCkpIHsKKwkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCQlyYyA9IC1FUEVSTTsKKwkJZ290byBvdXQ7CisJfQogCWxsaS0+bGxpX3NhaSA9IHNhaTsKKwlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CiAKLQlwbGxpID0gbGxfaTJpbmZvKGRfaW5vZGUocGFyZW50KSk7CisJYXRvbWljX2luYygmbGxfaTJzYmkocGFyZW50LT5kX2lub2RlKS0+bGxfc2FfcnVubmluZyk7CisKKwlDREVCVUcoRF9SRUFEQSwgInN0YXJ0IHN0YXRhaGVhZCB0aHJlYWQ6IFtwaWQgJWRdIFtwYXJlbnQgJXBkXVxuIiwKKwkgICAgICAgY3VycmVudF9waWQoKSwgcGFyZW50KTsKKwogCXRhc2sgPSBrdGhyZWFkX3J1bihsbF9zdGF0YWhlYWRfdGhyZWFkLCBwYXJlbnQsICJsbF9zYV8ldSIsCi0JCQkgICBwbGxpLT5sbGlfb3BlbmRpcl9waWQpOworCQkJICAgbGxpLT5sbGlfb3BlbmRpcl9waWQpOwogCXRocmVhZCA9ICZzYWktPnNhaV90aHJlYWQ7CiAJaWYgKElTX0VSUih0YXNrKSkgewogCQlyYyA9IFBUUl9FUlIodGFzayk7Ci0JCUNFUlJPUigiY2FuJ3Qgc3RhcnQgbGxfc2EgdGhyZWFkLCByYzogJWRcbiIsIHJjKTsKLQkJZHB1dChwYXJlbnQpOwotCQlsbGktPmxsaV9vcGVuZGlyX2tleSA9IE5VTEw7Ci0JCXRocmVhZF9zZXRfZmxhZ3ModGhyZWFkLCBTVkNfU1RPUFBFRCk7Ci0JCXRocmVhZF9zZXRfZmxhZ3MoJnNhaS0+c2FpX2FnbF90aHJlYWQsIFNWQ19TVE9QUEVEKTsKLQkJLyogRHJvcCBib3RoIG91ciBvd24gbG9jYWwgcmVmZXJlbmNlIGFuZCB0aGUgZGVmYXVsdAotCQkgKiByZWZlcmVuY2UgZnJvbSBhbGxvY2F0aW9uIHRpbWUuCi0JCSAqLwotCQlsbF9zYWlfcHV0KHNhaSk7Ci0JCWxsX3NhaV9wdXQoc2FpKTsKLQkJTEFTU0VSVCghbGxpLT5sbGlfc2FpKTsKLQkJcmV0dXJuIC1FQUdBSU47CisJCUNFUlJPUigiY2FuJ3Qgc3RhcnQgbGxfc2EgdGhyZWFkLCByYyA6ICVkXG4iLCByYyk7CisJCWdvdG8gb3V0OwogCX0KIAogCWxfd2FpdF9ldmVudCh0aHJlYWQtPnRfY3RsX3dhaXRxLApAQCAtMTY5NCwxMCArMTU5OCw0NyBAQAogCXJldHVybiAtRUFHQUlOOwogCiBvdXQ6Ci0Ja2ZyZWUoc2FpKTsKKwkvKgorCSAqIG9uY2Ugd2Ugc3RhcnQgc3RhdGFoZWFkIHRocmVhZCBmYWlsZWQsIGRpc2FibGUgc3RhdGFoZWFkIHNvCisJICogdGhhdCBzdWJzZXF1ZW50IHN0YXQgd29uJ3Qgd2FzdGUgdGltZSB0byB0cnkgaXQuCisJICovCiAJc3Bpbl9sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQlsbGktPmxsaV9vcGVuZGlyX2tleSA9IE5VTEw7Ci0JbGxpLT5sbGlfb3BlbmRpcl9waWQgPSAwOworCWxsaS0+bGxpX3NhX2VuYWJsZWQgPSAwOworCWxsaS0+bGxpX3NhaSA9IE5VTEw7CiAJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCWlmIChzYWkpCisJCWxsX3NhaV9mcmVlKHNhaSk7CiAJcmV0dXJuIHJjOwogfQorCisvKioKKyAqIHN0YXRhaGVhZCBlbnRyeSBmdW5jdGlvbiwgdGhpcyBpcyBjYWxsZWQgd2hlbiBjbGllbnQgZ2V0YXR0ciBvbiBhIGZpbGUsIGl0CisgKiB3aWxsIHN0YXJ0IHN0YXRhaGVhZCB0aHJlYWQgaWYgdGhpcyBpcyB0aGUgZmlyc3QgZGlyIGVudHJ5LCBlbHNlIHJldmFsaWRhdGUKKyAqIGRlbnRyeSBmcm9tIHN0YXRhaGVhZCBjYWNoZS4KKyAqCisgKiBccGFyYW1baW5dICBkaXIJcGFyZW50IGRpcmVjdG9yeQorICogXHBhcmFtW291dF0gZGVudHJ5cAlkZW50cnkgdG8gZ2V0YXR0cgorICogXHBhcmFtW2luXSAgdW5wbHVnCXVucGx1ZyBzdGF0YWhlYWQgd2luZG93IG9ubHkgKG5vcm1hbGx5IGZvciBuZWdhdGl2ZQorICoJCQlkZW50cnkpCisgKiBccmV0dmFsCQkxIG9uIHN1Y2Nlc3MKKyAqIFxyZXR2YWwJCTAgcmV2YWxpZGF0aW9uIGZyb20gc3RhdGFoZWFkIGNhY2hlIGZhaWxlZCwgY2FsbGVyIG5lZWRzCisgKgkJCXRvIGdldGF0dHIgZnJvbSBzZXJ2ZXIgZGlyZWN0bHkKKyAqIFxyZXR2YWwJCW5lZ2F0aXZlIG51bWJlciBvbiBlcnJvciwgY2FsbGVyIG9mdGVuIGlnbm9yZXMgdGhpcyBhbmQKKyAqCQkJdGhlbiBnZXRhdHRyIGZyb20gc2VydmVyCisgKi8KK2ludCBsbF9zdGF0YWhlYWQoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKipkZW50cnlwLCBib29sIHVucGx1ZykKK3sKKwlzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaTsKKworCXNhaSA9IGxsX3NhaV9nZXQoZGlyKTsKKwlpZiAoc2FpKSB7CisJCWludCByYzsKKworCQlyYyA9IHJldmFsaWRhdGVfc3RhdGFoZWFkX2RlbnRyeShkaXIsIHNhaSwgZGVudHJ5cCwgdW5wbHVnKTsKKwkJQ0RFQlVHKERfUkVBREEsICJyZXZhbGlkYXRlIHN0YXRhaGVhZCAlcGQ6ICVkLlxuIiwKKwkJICAgICAgICpkZW50cnlwLCByYyk7CisJCWxsX3NhaV9wdXQoc2FpKTsKKwkJcmV0dXJuIHJjOworCX0KKwlyZXR1cm4gc3RhcnRfc3RhdGFoZWFkX3RocmVhZChkaXIsICpkZW50cnlwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N1cGVyMjUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N1cGVyMjUuYwppbmRleCAzZGQ3ZTBlLi4xMDZjZDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zdXBlcjI1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3VwZXIyNS5jCkBAIC0zNCw3ICszNCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9oYS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2RsbS5oIgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTgzLDggKzgyLDYgQEAKIH07CiBNT0RVTEVfQUxJQVNfRlMoImx1c3RyZSIpOwogCi12b2lkIGx1c3RyZV9yZWdpc3Rlcl9jbGllbnRfcHJvY2Vzc19jb25maWcoaW50ICgqY3BjKShzdHJ1Y3QgbHVzdHJlX2NmZyAqbGNmZykpOwotCiBzdGF0aWMgaW50IF9faW5pdCBsdXN0cmVfaW5pdCh2b2lkKQogewogCWxuZXRfcHJvY2Vzc19pZF90IGxuZXRfaWQ7CkBAIC0xMDIsOCArOTksOCBAQAogCiAJcmMgPSAtRU5PTUVNOwogCWxsX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJsdXN0cmVfaW5vZGVfY2FjaGUiLAotCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBsbF9pbm9kZV9pbmZvKSwKLQkJCQkJICAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX0FDQ09VTlQsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IGxsX2lub2RlX2luZm8pLCAwLAorCQkJCQkgICAgU0xBQl9IV0NBQ0hFX0FMSUdOIHwgU0xBQl9BQ0NPVU5ULAogCQkJCQkgICAgTlVMTCk7CiAJaWYgKCFsbF9pbm9kZV9jYWNoZXApCiAJCWdvdG8gb3V0X2NhY2hlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3ltbGluay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3ltbGluay5jCmluZGV4IDhjOGJkZmUuLmY4YmM3ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N5bWxpbmsuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zeW1saW5rLmMKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xMSVRFCiAKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAibGxpdGVfaW50ZXJuYWwuaCIKIAogc3RhdGljIGludCBsbF9yZWFkbGlua19pbnRlcm5hbChzdHJ1Y3QgaW5vZGUgKmlub2RlLApAQCAtODAsMTcgKzc5LDE3IEBACiAJfQogCiAJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJigqcmVxdWVzdCktPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOwotCWlmICgoYm9keS0+dmFsaWQgJiBPQkRfTURfTElOS05BTUUpID09IDApIHsKKwlpZiAoKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9MSU5LTkFNRSkgPT0gMCkgewogCQlDRVJST1IoIk9CRF9NRF9MSU5LTkFNRSBub3Qgc2V0IG9uIHJlcGx5XG4iKTsKIAkJcmMgPSAtRVBST1RPOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKIAlMQVNTRVJUKHN5bWxlbiAhPSAwKTsKLQlpZiAoYm9keS0+ZWFkYXRhc2l6ZSAhPSBzeW1sZW4pIHsKKwlpZiAoYm9keS0+bWJvX2VhZGF0YXNpemUgIT0gc3ltbGVuKSB7CiAJCUNFUlJPUigiJXM6IGlub2RlICJERklEIjogc3ltbGluayBsZW5ndGggJWQgbm90IGV4cGVjdGVkICVkXG4iLAogCQkgICAgICAgbGxfZ2V0X2ZzbmFtZShpbm9kZS0+aV9zYiwgTlVMTCwgMCksCi0JCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBib2R5LT5lYWRhdGFzaXplIC0gMSwKKwkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIGJvZHktPm1ib19lYWRhdGFzaXplIC0gMSwKIAkJICAgICAgIHN5bWxlbiAtIDEpOwogCQlyYyA9IC1FUFJPVE87CiAJCWdvdG8gZmFpbGVkOwpAQCAtMTU1LDggKzE1NCw4IEBACiAJLmdldF9saW5rCT0gbGxfZ2V0X2xpbmssCiAJLmdldGF0dHIJPSBsbF9nZXRhdHRyLAogCS5wZXJtaXNzaW9uCT0gbGxfaW5vZGVfcGVybWlzc2lvbiwKLQkuc2V0eGF0dHIJPSBsbF9zZXR4YXR0ciwKLQkuZ2V0eGF0dHIJPSBsbF9nZXR4YXR0ciwKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCiAJLmxpc3R4YXR0cgk9IGxsX2xpc3R4YXR0ciwKLQkucmVtb3ZleGF0dHIJPSBsbF9yZW1vdmV4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9kZXYuYwppbmRleCBlNjIzMjE2Li44YWE4ZWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2Rldi5jCkBAIC0zOCw3ICszOCw2IEBACiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xMSVRFCiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInZ2cF9pbnRlcm5hbC5oIgogCkBAIC0zNjgsMTIgKzM2Nyw2IEBACiAJCUNFUlJPUigiQ2Fubm90IGNsZWFudXAgY2wtc3RhY2sgZHVlIHRvIG1lbW9yeSBzaG9ydGFnZS5cbiIpOwogCQlyZXN1bHQgPSBQVFJfRVJSKGVudik7CiAJfQotCS8qCi0JICogSWYgbW91bnQgZmFpbGVkIChzYmktPmxsX2NsID09IE5VTEwpLCBhbmQgdGhpcyB0aGVyZSBhcmUgbm8gb3RoZXIKLQkgKiBtb3VudHMsIHN0b3AgZGV2aWNlIHR5cGVzIG1hbnVhbGx5ICh0aGlzIHVzdWFsbHkgaGFwcGVucwotCSAqIGF1dG9tYXRpY2FsbHkgd2hlbiBsYXN0IGRldmljZSBpcyBkZXN0cm95ZWQpLgotCSAqLwotCWx1X3R5cGVzX3N0b3AoKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9pbnRlcm5hbC5oCmluZGV4IDc5ZmM0MjguLjU4MDJkYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9pbnRlcm5hbC5oCkBAIC0yMTcsMTEgKzIxNywxMiBAQAogCXN0cnVjdCBsaXN0X2hlYWQJdm9iX3BlbmRpbmdfbGlzdDsKIAogCS8qKgotCSAqIEFjY2VzcyB0aGlzIGNvdW50ZXIgaXMgcHJvdGVjdGVkIGJ5IGlub2RlLT5pX3NlbS4gTm93IHRoYXQKLQkgKiB0aGUgbGlmZXRpbWUgb2YgdHJhbnNpZW50IHBhZ2VzIG11c3QgYmUgY292ZXJlZCBieSBpbm9kZSBzZW0sCi0JICogd2UgZG9uJ3QgbmVlZCB0byBob2xkIGFueSBsb2NrLi4KKwkgKiBOdW1iZXIgb2YgdHJhbnNpZW50IHBhZ2VzLiAgVGhpcyBpcyBubyBsb25nZXIgcHJvdGVjdGVkIGJ5IGlfc2VtLAorCSAqIGFuZCBuZWVkcyB0byBiZSBhdG9taWMuICBUaGlzIGlzIG5vdCBhY3R1YWxseSB1c2VkIGZvciBhbnl0aGluZywKKwkgKiBhbmQgY2FuIHByb2JhYmx5IGJlIHJlbW92ZWQuCiAJICovCi0JaW50CQkJdm9iX3RyYW5zaWVudF9wYWdlczsKKwlhdG9taWNfdAkJdm9iX3RyYW5zaWVudF9wYWdlczsKKwogCS8qKgogCSAqIE51bWJlciBvZiBvdXRzdGFuZGluZyBtbWFwcyBvbiB0aGlzIGZpbGUuCiAJICoKQEAgLTI0Nyw5ICsyNDgsOSBAQAogICovCiBzdHJ1Y3QgdnZwX3BhZ2UgewogCXN0cnVjdCBjbF9wYWdlX3NsaWNlIHZwZ19jbDsKLQlpbnQJCSAgdnBnX2RlZmVyX3VwdG9kYXRlOwotCWludAkJICB2cGdfcmFfdXNlZDsKLQlpbnQJCSAgdnBnX3dyaXRlX3F1ZXVlZDsKKwl1bnNpZ25lZCBpbnQJdnBnX2RlZmVyX3VwdG9kYXRlOjEsCisJCQl2cGdfcmFfdXNlZDoxLAorCQkJdnBnX3dyaXRlX3F1ZXVlZDoxOwogCS8qKgogCSAqIE5vbi1lbXB0eSBpZmYgdGhpcyBwYWdlIGlzIGFscmVhZHkgY291bnRlZCBpbgogCSAqIHZ2cF9vYmplY3Q6OnZvYl9wZW5kaW5nX2xpc3QuIFRoaXMgbGlzdCBpcyBvbmx5IHVzZWQgYXMgYSBmbGFnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2lvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfaW8uYwppbmRleCA5NDkxNmRjLi4yYWI0NTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfaW8uYwpAQCAtMzgsNyArMzgsNiBAQAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTElURQogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmQuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAKICNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInZ2cF9pbnRlcm5hbC5oIgpAQCAtNjI4LDcgKzYyNyw3IEBACiAJCWF0dHItPmNhdF9tdGltZSA9IGlvLT51LmNpX3NldGF0dHIuc2FfYXR0ci5sdmJfbXRpbWU7CiAJCXZhbGlkIHw9IENBVF9NVElNRTsKIAl9Ci0JcmVzdWx0ID0gY2xfb2JqZWN0X2F0dHJfc2V0KGVudiwgb2JqLCBhdHRyLCB2YWxpZCk7CisJcmVzdWx0ID0gY2xfb2JqZWN0X2F0dHJfdXBkYXRlKGVudiwgb2JqLCBhdHRyLCB2YWxpZCk7CiAJY2xfb2JqZWN0X2F0dHJfdW5sb2NrKG9iaik7CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtODIxLDcgKzgyMCw3IEBACiAJY2xfcGFnZV9kaXNvd24oZW52LCBpbywgcGFnZSk7CiAKIAkvKiBoZWxkIGluIGxsX2NsX2luaXQoKSAqLwotCWx1X3JlZl9kZWwoJnBhZ2UtPmNwX3JlZmVyZW5jZSwgImNsX2lvIiwgaW8pOworCWx1X3JlZl9kZWwoJnBhZ2UtPmNwX3JlZmVyZW5jZSwgImNsX2lvIiwgY2xfaW9fdG9wKGlvKSk7CiAJY2xfcGFnZV9wdXQoZW52LCBwYWdlKTsKIH0KIApAQCAtOTU5LDEwICs5NTgsMzAgQEAKIAogCUNERUJVRyhEX1ZGU1RSQUNFLCAid3JpdGU6IFslbGxpLCAlbGxpKVxuIiwgcG9zLCBwb3MgKyAobG9uZyBsb25nKWNudCk7CiAKLQlpZiAoIXZpby0+dnVpX2l0ZXIpIC8qIGZyb20gYSB0ZW1wIGlvIGluIGxsX2NsX2luaXQoKS4gKi8KKwlpZiAoIXZpby0+dnVpX2l0ZXIpIHsKKwkJLyogZnJvbSBhIHRlbXAgaW8gaW4gbGxfY2xfaW5pdCgpLiAqLwogCQlyZXN1bHQgPSAwOwotCWVsc2UKLQkJcmVzdWx0ID0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIodmlvLT52dWlfaW9jYiwgdmlvLT52dWlfaXRlcik7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogV2hlbiB1c2luZyB0aGUgbG9ja2VkIEFJTyBmdW5jdGlvbiAoZ2VuZXJpY19maWxlX2Fpb193cml0ZSgpKQorCQkgKiB0ZXN0aW5nIGhhcyBzaG93biB0aGUgaW5vZGUgbXV0ZXggdG8gYmUgYSBsaW1pdGluZyBmYWN0b3IKKwkJICogd2l0aCBtdWx0aS10aHJlYWRlZCBzaW5nbGUgc2hhcmVkIGZpbGUgcGVyZm9ybWFuY2UuIFRvIGdldAorCQkgKiBhcm91bmQgdGhpcywgd2Ugbm93IHVzZSB0aGUgbG9ja2xlc3MgdmVyc2lvbi4gVG8gbWFpbnRhaW4KKwkJICogY29uc2lzdGVuY3ksIHByb3BlciBsb2NraW5nIHRvIHByb3RlY3QgYWdhaW5zdCB3cml0ZXMsCisJCSAqIHRydWNhdGVzLCBldGMuIGlzIGhhbmRsZWQgaW4gdGhlIGhpZ2hlciBsYXllcnMgb2YgbHVzdHJlLgorCQkgKi8KKwkJYm9vbCBsb2NrX25vZGUgPSAhSVNfTk9TRUMoaW5vZGUpOworCisJCWlmIChsb2NrX25vZGUpCisJCQlpbm9kZV9sb2NrKGlub2RlKTsKKwkJcmVzdWx0ID0gX19nZW5lcmljX2ZpbGVfd3JpdGVfaXRlcih2aW8tPnZ1aV9pb2NiLAorCQkJCQkJICAgdmlvLT52dWlfaXRlcik7CisJCWlmIChsb2NrX25vZGUpCisJCQlpbm9kZV91bmxvY2soaW5vZGUpOworCisJCWlmIChyZXN1bHQgPiAwIHx8IHJlc3VsdCA9PSAtRUlPQ0JRVUVVRUQpCisJCQlyZXN1bHQgPSBnZW5lcmljX3dyaXRlX3N5bmModmlvLT52dWlfaW9jYiwgcmVzdWx0KTsKKwl9CiAKIAlpZiAocmVzdWx0ID4gMCkgewogCQlyZXN1bHQgPSB2dnBfaW9fd3JpdGVfY29tbWl0KGVudiwgaW8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2xvY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9sb2NrLmMKaW5kZXggNjRiZTBjOS4uMDdlYjI2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2xvY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfbG9jay5jCkBAIC0zNyw3ICszNyw2IEBACiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xMSVRFCiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9zdXBwb3J0LmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogCiAjaW5jbHVkZSAidnZwX2ludGVybmFsLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9vYmplY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9vYmplY3QuYwppbmRleCAyYzUyMGIwLi5iNTcxOTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfb2JqZWN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX29iamVjdC5jCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzLmgiCiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKIAogI2luY2x1ZGUgImxsaXRlX2ludGVybmFsLmgiCiAjaW5jbHVkZSAidnZwX2ludGVybmFsLmgiCkBAIC02OCw4ICs2Nyw4IEBACiAKIAkoKnApKGVudiwgY29va2llLCAiKCVzICVkICVkKSBpbm9kZTogJXAgIiwKIAkgICAgIGxpc3RfZW1wdHkoJm9iai0+dm9iX3BlbmRpbmdfbGlzdCkgPyAiLSIgOiAiKyIsCi0JICAgICBvYmotPnZvYl90cmFuc2llbnRfcGFnZXMsIGF0b21pY19yZWFkKCZvYmotPnZvYl9tbWFwX2NudCksCi0JICAgICBpbm9kZSk7CisJICAgICBhdG9taWNfcmVhZCgmb2JqLT52b2JfdHJhbnNpZW50X3BhZ2VzKSwKKwkgICAgIGF0b21pY19yZWFkKCZvYmotPnZvYl9tbWFwX2NudCksIGlub2RlKTsKIAlpZiAoaW5vZGUpIHsKIAkJbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKIAkJKCpwKShlbnYsIGNvb2tpZSwgIiVsdS8ldSAlbyAldSAlZCAlcCAiREZJRCwKQEAgLTEwMiw4ICsxMDEsOCBAQAogCXJldHVybiAwOyAvKiBsYXllcnMgYmVsb3cgaGF2ZSB0byBmaWxsIGluIHRoZSByZXN0ICovCiB9CiAKLXN0YXRpYyBpbnQgdnZwX2F0dHJfc2V0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAotCQkJY29uc3Qgc3RydWN0IGNsX2F0dHIgKmF0dHIsIHVuc2lnbmVkIHZhbGlkKQorc3RhdGljIGludCB2dnBfYXR0cl91cGRhdGUoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCisJCQkgICBjb25zdCBzdHJ1Y3QgY2xfYXR0ciAqYXR0ciwgdW5zaWduZWQgaW50IHZhbGlkKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB2dnBfb2JqZWN0X2lub2RlKG9iaik7CiAKQEAgLTEyMCw3ICsxMTksNyBAQAogCWlmICgwICYmIHZhbGlkICYgQ0FUX1NJWkUpCiAJCWlfc2l6ZV93cml0ZShpbm9kZSwgYXR0ci0+Y2F0X3NpemUpOwogCS8qIG5vdCBjdXJyZW50bHkgbmVjZXNzYXJ5ICovCi0JaWYgKDAgJiYgdmFsaWQgJiAoQ0FUX1VJRHxDQVRfR0lEfENBVF9TSVpFKSkKKwlpZiAoMCAmJiB2YWxpZCAmIChDQVRfVUlEIHwgQ0FUX0dJRCB8IENBVF9TSVpFKSkKIAkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMTAsNyArMjA5LDcgQEAKIAkuY29vX2xvY2tfaW5pdCA9IHZ2cF9sb2NrX2luaXQsCiAJLmNvb19pb19pbml0ICAgPSB2dnBfaW9faW5pdCwKIAkuY29vX2F0dHJfZ2V0ICA9IHZ2cF9hdHRyX2dldCwKLQkuY29vX2F0dHJfc2V0ICA9IHZ2cF9hdHRyX3NldCwKKwkuY29vX2F0dHJfdXBkYXRlID0gdnZwX2F0dHJfdXBkYXRlLAogCS5jb29fY29uZl9zZXQgID0gdnZwX2NvbmZfc2V0LAogCS5jb29fcHJ1bmUgICAgID0gdnZwX3BydW5lLAogCS5jb29fZ2xpbXBzZSAgID0gdnZwX29iamVjdF9nbGltcHNlCkBAIC0yMjEsNyArMjIwLDcgQEAKIAkJCSAgICBjb25zdCBzdHJ1Y3QgY2xfb2JqZWN0X2NvbmYgKmNvbmYpCiB7CiAJdm9iLT52b2JfaW5vZGUgPSBjb25mLT5jb2NfaW5vZGU7Ci0Jdm9iLT52b2JfdHJhbnNpZW50X3BhZ2VzID0gMDsKKwlhdG9taWNfc2V0KCZ2b2ItPnZvYl90cmFuc2llbnRfcGFnZXMsIDApOwogCWNsX29iamVjdF9wYWdlX2luaXQoJnZvYi0+dm9iX2NsLCBzaXplb2Yoc3RydWN0IHZ2cF9wYWdlKSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfcGFnZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX3BhZ2UuYwppbmRleCAyZTU2NmQ5Li41ZDc5ZWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfcGFnZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9wYWdlLmMKQEAgLTQ0LDggKzQ0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlLWZsYWdzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgotCiAjaW5jbHVkZSAibGxpdGVfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ2dnBfaW50ZXJuYWwuaCIKIApAQCAtMjQ5LDcgKzI0Nyw3IEBACiAJCQlzZXRfYml0KEFTX0VJTywgJmlub2RlLT5pX21hcHBpbmctPmZsYWdzKTsKIAogCQlpZiAoKGlvcmV0ID09IC1FU0hVVERPV04gfHwgaW9yZXQgPT0gLUVJTlRSKSAmJgotCQkgICAgIG9iai0+dm9iX2Rpc2NhcmRfcGFnZV93YXJuZWQgPT0gMCkgeworCQkgICAgb2JqLT52b2JfZGlzY2FyZF9wYWdlX3dhcm5lZCA9PSAwKSB7CiAJCQlvYmotPnZvYl9kaXNjYXJkX3BhZ2Vfd2FybmVkID0gMTsKIAkJCWxsX2RpcnR5X3BhZ2VfZGlzY2FyZF93YXJuKHZtcGFnZSwgaW9yZXQpOwogCQl9CkBAIC00NDQsMTggKzQ0MiwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB2dnBfdHJhbnNpZW50X3BhZ2VfdmVyaWZ5KGNvbnN0IHN0cnVjdCBjbF9wYWdlICpwYWdlKQotewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB2dnBfb2JqZWN0X2lub2RlKHBhZ2UtPmNwX29iaik7Ci0KLQlMQVNTRVJUKCFpbm9kZV90cnlsb2NrKGlub2RlKSk7Ci19Ci0KIHN0YXRpYyBpbnQgdnZwX3RyYW5zaWVudF9wYWdlX293bihjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCiAJCQkJICBjb25zdCBzdHJ1Y3QgY2xfcGFnZV9zbGljZSAqc2xpY2UsCiAJCQkJICBzdHJ1Y3QgY2xfaW8gKnVudXNlZCwgaW50IG5vbmJsb2NrKQogewotCXZ2cF90cmFuc2llbnRfcGFnZV92ZXJpZnkoc2xpY2UtPmNwbF9wYWdlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDYzLDIxICs0NTMsMTggQEAKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgY2xfcGFnZV9zbGljZSAqc2xpY2UsCiAJCQkJICAgICAgc3RydWN0IGNsX2lvICp1bnVzZWQpCiB7Ci0JdnZwX3RyYW5zaWVudF9wYWdlX3ZlcmlmeShzbGljZS0+Y3BsX3BhZ2UpOwogfQogCiBzdGF0aWMgdm9pZCB2dnBfdHJhbnNpZW50X3BhZ2VfdW5hc3N1bWUoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAogCQkJCQljb25zdCBzdHJ1Y3QgY2xfcGFnZV9zbGljZSAqc2xpY2UsCiAJCQkJCXN0cnVjdCBjbF9pbyAqdW51c2VkKQogewotCXZ2cF90cmFuc2llbnRfcGFnZV92ZXJpZnkoc2xpY2UtPmNwbF9wYWdlKTsKIH0KIAogc3RhdGljIHZvaWQgdnZwX3RyYW5zaWVudF9wYWdlX2Rpc293bihjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCiAJCQkJICAgICAgY29uc3Qgc3RydWN0IGNsX3BhZ2Vfc2xpY2UgKnNsaWNlLAogCQkJCSAgICAgIHN0cnVjdCBjbF9pbyAqdW51c2VkKQogewotCXZ2cF90cmFuc2llbnRfcGFnZV92ZXJpZnkoc2xpY2UtPmNwbF9wYWdlKTsKIH0KIAogc3RhdGljIHZvaWQgdnZwX3RyYW5zaWVudF9wYWdlX2Rpc2NhcmQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LApAQCAtNDg2LDggKzQ3Myw2IEBACiB7CiAJc3RydWN0IGNsX3BhZ2UgKnBhZ2UgPSBzbGljZS0+Y3BsX3BhZ2U7CiAKLQl2dnBfdHJhbnNpZW50X3BhZ2VfdmVyaWZ5KHNsaWNlLT5jcGxfcGFnZSk7Ci0KIAkvKgogCSAqIEZvciB0cmFuc2llbnQgcGFnZXMsIHJlbW92ZSBpdCBmcm9tIHRoZSByYWRpeCB0cmVlLgogCSAqLwpAQCAtNTExLDcgKzQ5Niw2IEBACiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgY2xfcGFnZV9zbGljZSAqc2xpY2UsCiAJCQkgICAgICBpbnQgaW9yZXQpCiB7Ci0JdnZwX3RyYW5zaWVudF9wYWdlX3ZlcmlmeShzbGljZS0+Y3BsX3BhZ2UpOwogfQogCiBzdGF0aWMgdm9pZCB2dnBfdHJhbnNpZW50X3BhZ2VfZmluaShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCkBAIC01MjIsOCArNTA2LDcgQEAKIAlzdHJ1Y3QgdnZwX29iamVjdCAqY2xvYmogPSBjbDJ2dnAoY2xwLT5jcF9vYmopOwogCiAJdnZwX3BhZ2VfZmluaV9jb21tb24odnBnKTsKLQlMQVNTRVJUKCFpbm9kZV90cnlsb2NrKGNsb2JqLT52b2JfaW5vZGUpKTsKLQljbG9iai0+dm9iX3RyYW5zaWVudF9wYWdlcy0tOworCWF0b21pY19kZWMoJmNsb2JqLT52b2JfdHJhbnNpZW50X3BhZ2VzKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjbF9wYWdlX29wZXJhdGlvbnMgdnZwX3RyYW5zaWVudF9wYWdlX29wcyA9IHsKQEAgLTU0OSw3ICs1MzIsNyBAQAogfTsKIAogaW50IHZ2cF9wYWdlX2luaXQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCi0JCXN0cnVjdCBjbF9wYWdlICpwYWdlLCBwZ29mZl90IGluZGV4KQorCQkgIHN0cnVjdCBjbF9wYWdlICpwYWdlLCBwZ29mZl90IGluZGV4KQogewogCXN0cnVjdCB2dnBfcGFnZSAqdnBnID0gY2xfb2JqZWN0X3BhZ2Vfc2xpY2Uob2JqLCBwYWdlKTsKIAlzdHJ1Y3QgcGFnZSAgICAgKnZtcGFnZSA9IHBhZ2UtPmNwX3ZtcGFnZTsKQEAgLTU3MCwxMCArNTUzLDkgQEAKIAl9IGVsc2UgewogCQlzdHJ1Y3QgdnZwX29iamVjdCAqY2xvYmogPSBjbDJ2dnAob2JqKTsKIAotCQlMQVNTRVJUKCFpbm9kZV90cnlsb2NrKGNsb2JqLT52b2JfaW5vZGUpKTsKIAkJY2xfcGFnZV9zbGljZV9hZGQocGFnZSwgJnZwZy0+dnBnX2NsLCBvYmosIGluZGV4LAogCQkJCSAgJnZ2cF90cmFuc2llbnRfcGFnZV9vcHMpOwotCQljbG9iai0+dm9iX3RyYW5zaWVudF9wYWdlcysrOworCQlhdG9taWNfaW5jKCZjbG9iai0+dm9iX3RyYW5zaWVudF9wYWdlcyk7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX3JlcS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX3JlcS5jCmluZGV4IDlmZTlkNmMuLmUzZjRjNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9yZXEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfcmVxLmMKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2NsX29iamVjdC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfc3VwcG9ydC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInZ2cF9pbnRlcm5hbC5oIgogCkBAIC04Myw4ICs4MiwxMCBAQAogCX0KIAlvYmRvX2Zyb21faW5vZGUob2EsIGlub2RlLCB2YWxpZF9mbGFncyAmIGZsYWdzKTsKIAlvYmRvX3NldF9wYXJlbnRfZmlkKG9hLCAmbGxfaTJpbmZvKGlub2RlKS0+bGxpX2ZpZCk7CisJaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX0xGU0NLX0lOVkFMSURfUEZJRCkpCisJCW9hLT5vX3BhcmVudF9vaWQrKzsKIAltZW1jcHkoYXR0ci0+Y3JhX2pvYmlkLCBsbF9pMmluZm8oaW5vZGUpLT5sbGlfam9iaWQsCi0JICAgICAgIEpPQlNUQVRTX0pPQklEX1NJWkUpOworCSAgICAgICBMVVNUUkVfSk9CSURfU0laRSk7CiB9CiAKIHN0YXRpYyB2b2lkIHZ2cF9yZXFfY29tcGxldGlvbihjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0ci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUveGF0dHIuYwppbmRleCA5ODMwM2NmLi5lMDcwYWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0ci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyLmMKQEAgLTM4LDIxICszOCwxMiBAQAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTElURQogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfc3VwcG9ydC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9kbG0uaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV92ZXIuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9lYWNsLmgiCiAKICNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgogCi0jZGVmaW5lIFhBVFRSX1VTRVJfVAkgICAgKDEpCi0jZGVmaW5lIFhBVFRSX1RSVVNURURfVAkgKDIpCi0jZGVmaW5lIFhBVFRSX1NFQ1VSSVRZX1QJKDMpCi0jZGVmaW5lIFhBVFRSX0FDTF9BQ0NFU1NfVCAgICAgICg0KQotI2RlZmluZSBYQVRUUl9BQ0xfREVGQVVMVF9UICAgICAoNSkKLSNkZWZpbmUgWEFUVFJfTFVTVFJFX1QJICAoNikKLSNkZWZpbmUgWEFUVFJfT1RIRVJfVAkgICAoNykKLQogc3RhdGljCiBpbnQgZ2V0X3hhdHRyX3R5cGUoY29uc3QgY2hhciAqbmFtZSkKIHsKQEAgLTk5LDQ2ICs5MCw1NyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMKLWludCBsbF9zZXR4YXR0cl9jb21tb24oc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKLQkJICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwKLQkJICAgICAgIGludCBmbGFncywgX191NjQgdmFsaWQpCitzdGF0aWMgaW50CitsbF94YXR0cl9zZXRfY29tbW9uKGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLAorCQkgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLAorCQkgICAgaW50IGZsYWdzKQogeworCWNoYXIgZnVsbG5hbWVbc3RybGVuKGhhbmRsZXItPnByZWZpeCkgKyBzdHJsZW4obmFtZSkgKyAxXTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfaTJzYmkoaW5vZGUpOwogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxID0gTlVMTDsKLQlpbnQgeGF0dHJfdHlwZSwgcmM7CiAJY29uc3QgY2hhciAqcHYgPSB2YWx1ZTsKKwlfX3U2NCB2YWxpZDsKKwlpbnQgcmM7CiAKLQl4YXR0cl90eXBlID0gZ2V0X3hhdHRyX3R5cGUobmFtZSk7Ci0JcmMgPSB4YXR0cl90eXBlX2ZpbHRlcihzYmksIHhhdHRyX3R5cGUpOworCWlmIChmbGFncyA9PSBYQVRUUl9SRVBMQUNFKSB7CisJCWxsX3N0YXRzX29wc190YWxseShsbF9pMnNiaShpbm9kZSksIExQUk9DX0xMX1JFTU9WRVhBVFRSLCAxKTsKKwkJdmFsaWQgPSBPQkRfTURfRkxYQVRUUlJNOworCX0gZWxzZSB7CisJCWxsX3N0YXRzX29wc190YWxseShsbF9pMnNiaShpbm9kZSksIExQUk9DX0xMX1NFVFhBVFRSLCAxKTsKKwkJdmFsaWQgPSBPQkRfTURfRkxYQVRUUjsKKwl9CisKKwlyYyA9IHhhdHRyX3R5cGVfZmlsdGVyKHNiaSwgaGFuZGxlci0+ZmxhZ3MpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JaWYgKCh4YXR0cl90eXBlID09IFhBVFRSX0FDTF9BQ0NFU1NfVCB8fAotCSAgICAgeGF0dHJfdHlwZSA9PSBYQVRUUl9BQ0xfREVGQVVMVF9UKSAmJgorCWlmICgoaGFuZGxlci0+ZmxhZ3MgPT0gWEFUVFJfQUNMX0FDQ0VTU19UIHx8CisJICAgICBoYW5kbGVyLT5mbGFncyA9PSBYQVRUUl9BQ0xfREVGQVVMVF9UKSAmJgogCSAgICAhaW5vZGVfb3duZXJfb3JfY2FwYWJsZShpbm9kZSkpCiAJCXJldHVybiAtRVBFUk07CiAKIAkvKiBiMTA2Njc6IGlnbm9yZSBsdXN0cmUgc3BlY2lhbCB4YXR0ciBmb3Igbm93ICovCi0JaWYgKCh4YXR0cl90eXBlID09IFhBVFRSX1RSVVNURURfVCAmJiBzdHJjbXAobmFtZSwgInRydXN0ZWQubG92IikgPT0gMCkgfHwKLQkgICAgKHhhdHRyX3R5cGUgPT0gWEFUVFJfTFVTVFJFX1QgJiYgc3RyY21wKG5hbWUsICJsdXN0cmUubG92IikgPT0gMCkpCisJaWYgKChoYW5kbGVyLT5mbGFncyA9PSBYQVRUUl9UUlVTVEVEX1QgJiYgIXN0cmNtcChuYW1lLCAibG92IikpIHx8CisJICAgIChoYW5kbGVyLT5mbGFncyA9PSBYQVRUUl9MVVNUUkVfVCAmJiAhc3RyY21wKG5hbWUsICJsb3YiKSkpCiAJCXJldHVybiAwOwogCiAJLyogYjE1NTg3OiBpZ25vcmUgc2VjdXJpdHkuY2FwYWJpbGl0eSB4YXR0ciBmb3Igbm93ICovCi0JaWYgKCh4YXR0cl90eXBlID09IFhBVFRSX1NFQ1VSSVRZX1QgJiYKLQkgICAgIHN0cmNtcChuYW1lLCAic2VjdXJpdHkuY2FwYWJpbGl0eSIpID09IDApKQorCWlmICgoaGFuZGxlci0+ZmxhZ3MgPT0gWEFUVFJfU0VDVVJJVFlfVCAmJgorCSAgICAgIXN0cmNtcChuYW1lLCAiY2FwYWJpbGl0eSIpKSkKIAkJcmV0dXJuIDA7CiAKIAkvKiBMVS01NDk6ICBEaXNhYmxlIHNlY3VyaXR5LnNlbGludXggd2hlbiBzZWxpbnV4IGlzIGRpc2FibGVkICovCi0JaWYgKHhhdHRyX3R5cGUgPT0gWEFUVFJfU0VDVVJJVFlfVCAmJiAhc2VsaW51eF9pc19lbmFibGVkKCkgJiYKLQkgICAgc3RyY21wKG5hbWUsICJzZWN1cml0eS5zZWxpbnV4IikgPT0gMCkKKwlpZiAoaGFuZGxlci0+ZmxhZ3MgPT0gWEFUVFJfU0VDVVJJVFlfVCAmJiAhc2VsaW51eF9pc19lbmFibGVkKCkgJiYKKwkgICAgc3RyY21wKG5hbWUsICJzZWxpbnV4IikgPT0gMCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCisJc3ByaW50ZihmdWxsbmFtZSwgIiVzJXNcbiIsIGhhbmRsZXItPnByZWZpeCwgbmFtZSk7CiAJcmMgPSBtZF9zZXR4YXR0cihzYmktPmxsX21kX2V4cCwgbGxfaW5vZGUyZmlkKGlub2RlKSwKLQkJCSB2YWxpZCwgbmFtZSwgcHYsIHNpemUsIDAsIGZsYWdzLAorCQkJIHZhbGlkLCBmdWxsbmFtZSwgcHYsIHNpemUsIDAsIGZsYWdzLAogCQkJIGxsX2kyc3VwcGdpZChpbm9kZSksICZyZXEpOwogCWlmIChyYykgewotCQlpZiAocmMgPT0gLUVPUE5PVFNVUFAgJiYgeGF0dHJfdHlwZSA9PSBYQVRUUl9VU0VSX1QpIHsKKwkJaWYgKHJjID09IC1FT1BOT1RTVVBQICYmIGhhbmRsZXItPmZsYWdzID09IFhBVFRSX1VTRVJfVCkgewogCQkJTENPTlNPTEVfSU5GTygiRGlzYWJsaW5nIHVzZXJfeGF0dHIgZmVhdHVyZSBiZWNhdXNlIGl0IGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNlcnZlclxuIik7CiAJCQlzYmktPmxsX2ZsYWdzICY9IH5MTF9TQklfVVNFUl9YQVRUUjsKIAkJfQpAQCAtMTQ5LDggKzE1MSwxMCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgbGxfc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQljb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3N0YXRpYyBpbnQgbGxfeGF0dHJfc2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLAorCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLAorCQkJaW50IGZsYWdzKQogewogCUxBU1NFUlQoaW5vZGUpOwogCUxBU1NFUlQobmFtZSk7CkBAIC0xNTgsMjAgKzE2MiwyNCBAQAogCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOmlub2RlPSJERklEIiglcCksIHhhdHRyICVzXG4iLAogCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBpbm9kZSwgbmFtZSk7CiAKLQlsbF9zdGF0c19vcHNfdGFsbHkobGxfaTJzYmkoaW5vZGUpLCBMUFJPQ19MTF9TRVRYQVRUUiwgMSk7Ci0KLQlpZiAoKHN0cm5jbXAobmFtZSwgWEFUVFJfVFJVU1RFRF9QUkVGSVgsCi0JCSAgICAgc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKSAtIDEpID09IDAgJiYKLQkgICAgIHN0cmNtcChuYW1lICsgc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKSAtIDEsICJsb3YiKSA9PSAwKSB8fAotCSAgICAoc3RybmNtcChuYW1lLCBYQVRUUl9MVVNUUkVfUFJFRklYLAotCQkgICAgIHNpemVvZihYQVRUUl9MVVNUUkVfUFJFRklYKSAtIDEpID09IDAgJiYKLQkgICAgIHN0cmNtcChuYW1lICsgc2l6ZW9mKFhBVFRSX0xVU1RSRV9QUkVGSVgpIC0gMSwgImxvdiIpID09IDApKSB7CisJaWYgKCFzdHJjbXAobmFtZSwgImxvdiIpKSB7CiAJCXN0cnVjdCBsb3ZfdXNlcl9tZCAqbHVtcCA9IChzdHJ1Y3QgbG92X3VzZXJfbWQgKil2YWx1ZTsKKwkJaW50IG9wX3R5cGUgPSBmbGFncyA9PSBYQVRUUl9SRVBMQUNFID8gTFBST0NfTExfUkVNT1ZFWEFUVFIgOgorCQkJCQkJICAgICAgIExQUk9DX0xMX1NFVFhBVFRSOwogCQlpbnQgcmMgPSAwOwogCisJCWxsX3N0YXRzX29wc190YWxseShsbF9pMnNiaShpbm9kZSksIG9wX3R5cGUsIDEpOworCiAJCWlmIChzaXplICE9IDAgJiYgc2l6ZSA8IHNpemVvZihzdHJ1Y3QgbG92X3VzZXJfbWQpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKKwkJLyoKKwkJICogSXQgaXMgcG9zc2libGUgdG8gc2V0IGFuIHhhdHRyIHRvIGEgIiIgdmFsdWUgb2YgemVybyBzaXplLgorCQkgKiBGb3IgdGhpcyBjYXNlIHdlIGFyZSBnb2luZyB0byB0cmVhdCBpdCBhcyBhIHJlbW92YWwuCisJCSAqLworCQlpZiAoIXNpemUgJiYgbHVtcCkKKwkJCWx1bXAgPSBOVUxMOworCiAJCS8qIEF0dHJpYnV0ZXMgdGhhdCBhcmUgc2F2ZWQgdmlhIGdldHhhdHRyIHdpbGwgYWx3YXlzIGhhdmUKIAkJICogdGhlIHN0cmlwZV9vZmZzZXQgYXMgMC4gIEluc3RlYWQsIHRoZSBNRFMgc2hvdWxkIGJlCiAJCSAqIGFsbG93ZWQgdG8gcGljayB0aGUgc3RhcnRpbmcgT1NUIGluZGV4LiAgIGI9MTc4NDYKQEAgLTE4MSwxMiArMTg5LDE1IEBACiAKIAkJaWYgKGx1bXAgJiYgU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewogCQkJX191NjQgaXRfZmxhZ3MgPSBGTU9ERV9XUklURTsKLQkJCWludCBsdW1fc2l6ZSA9IChsdW1wLT5sbW1fbWFnaWMgPT0gTE9WX1VTRVJfTUFHSUNfVjEpID8KLQkJCQlzaXplb2YoKmx1bXApIDogc2l6ZW9mKHN0cnVjdCBsb3ZfdXNlcl9tZF92Myk7CisJCQlpbnQgbHVtX3NpemU7CisKKwkJCWx1bV9zaXplID0gbGxfbG92X3VzZXJfbWRfc2l6ZShsdW1wKTsKKwkJCWlmIChsdW1fc2l6ZSA8IDAgfHwgc2l6ZSA8IGx1bV9zaXplKQorCQkJCXJldHVybiAwOyAvKiBiPTEwNjY3OiBpZ25vcmUgZXJyb3IgKi8KIAogCQkJcmMgPSBsbF9sb3Zfc2V0c3RyaXBlX2VhX2luZm8oaW5vZGUsIGRlbnRyeSwgaXRfZmxhZ3MsCiAJCQkJCQkgICAgICBsdW1wLCBsdW1fc2l6ZSk7Ci0JCQkvKiBiMTA2Njc6IHJjIGFsd2F5cyBiZSAwIGhlcmUgZm9yIG5vdyAqLworCQkJLyogYj0xMDY2NzogcmMgYWx3YXlzIGJlIDAgaGVyZSBmb3Igbm93ICovCiAJCQlyYyA9IDA7CiAJCX0gZWxzZSBpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewogCQkJcmMgPSBsbF9kaXJfc2V0c3RyaXBlKGlub2RlLCBsdW1wLCAwKTsKQEAgLTE5NCw5MiArMjA1LDI3IEBACiAKIAkJcmV0dXJuIHJjOwogCi0JfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9MTUEpID09IDAgfHwKLQkJICAgc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfTElOSykgPT0gMCkKKwl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImxtYSIpIHx8ICFzdHJjbXAobmFtZSwgImxpbmsiKSkgeworCQlsbF9zdGF0c19vcHNfdGFsbHkobGxfaTJzYmkoaW5vZGUpLCBMUFJPQ19MTF9TRVRYQVRUUiwgMSk7CiAJCXJldHVybiAwOworCX0KIAotCXJldHVybiBsbF9zZXR4YXR0cl9jb21tb24oaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncywKLQkJCQkgIE9CRF9NRF9GTFhBVFRSKTsKKwlyZXR1cm4gbGxfeGF0dHJfc2V0X2NvbW1vbihoYW5kbGVyLCBkZW50cnksIGlub2RlLCBuYW1lLCB2YWx1ZSwgc2l6ZSwKKwkJCQkgICBmbGFncyk7CiB9CiAKLWludCBsbF9yZW1vdmV4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpCitpbnQKK2xsX3hhdHRyX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IHR5cGUsIHZvaWQgKmJ1ZmZlciwKKwkgICAgICBzaXplX3Qgc2l6ZSwgX191NjQgdmFsaWQpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGRfaW5vZGUoZGVudHJ5KTsKLQotCUxBU1NFUlQoaW5vZGUpOwotCUxBU1NFUlQobmFtZSk7Ci0KLQlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDppbm9kZT0iREZJRCIoJXApLCB4YXR0ciAlc1xuIiwKLQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgaW5vZGUsIG5hbWUpOwotCi0JbGxfc3RhdHNfb3BzX3RhbGx5KGxsX2kyc2JpKGlub2RlKSwgTFBST0NfTExfUkVNT1ZFWEFUVFIsIDEpOwotCXJldHVybiBsbF9zZXR4YXR0cl9jb21tb24oaW5vZGUsIG5hbWUsIE5VTEwsIDAsIDAsCi0JCQkJICBPQkRfTURfRkxYQVRUUlJNKTsKLX0KLQotc3RhdGljCi1pbnQgbGxfZ2V0eGF0dHJfY29tbW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCSAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCBfX3U2NCB2YWxpZCkKLXsKKwlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfaTJzYmkoaW5vZGUpOwogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxID0gTlVMTDsKIAlzdHJ1Y3QgbWR0X2JvZHkgKmJvZHk7Ci0JaW50IHhhdHRyX3R5cGUsIHJjOwogCXZvaWQgKnhkYXRhOwotCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOworCWludCByYzsKIAotCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOmlub2RlPSJERklEIiglcClcbiIsCi0JICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIGlub2RlKTsKLQotCS8qIGxpc3R4YXR0ciBoYXZlIHNsaWdodGx5IGRpZmZlcmVudCBiZWhhdmlvciBmcm9tIG9mIGV4dDM6Ci0JICogd2l0aG91dCAndXNlcl94YXR0cicgZXh0MyB3aWxsIGxpc3QgYWxsIHhhdHRyIG5hbWVzIGJ1dAotCSAqIGZpbHRlcmVkIG91dCAiXnVzZXIuLioiOyB3ZSBsaXN0IHRoZW0gYWxsIGZvciBzaW1wbGljaXR5LgotCSAqLwotCWlmICghbmFtZSkgewotCQl4YXR0cl90eXBlID0gWEFUVFJfT1RIRVJfVDsKLQkJZ290byBkb19nZXR4YXR0cjsKLQl9Ci0KLQl4YXR0cl90eXBlID0gZ2V0X3hhdHRyX3R5cGUobmFtZSk7Ci0JcmMgPSB4YXR0cl90eXBlX2ZpbHRlcihzYmksIHhhdHRyX3R5cGUpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JLyogYjE1NTg3OiBpZ25vcmUgc2VjdXJpdHkuY2FwYWJpbGl0eSB4YXR0ciBmb3Igbm93ICovCi0JaWYgKCh4YXR0cl90eXBlID09IFhBVFRSX1NFQ1VSSVRZX1QgJiYKLQkgICAgIHN0cmNtcChuYW1lLCAic2VjdXJpdHkuY2FwYWJpbGl0eSIpID09IDApKQotCQlyZXR1cm4gLUVOT0RBVEE7Ci0KLQkvKiBMVS01NDk6ICBEaXNhYmxlIHNlY3VyaXR5LnNlbGludXggd2hlbiBzZWxpbnV4IGlzIGRpc2FibGVkICovCi0JaWYgKHhhdHRyX3R5cGUgPT0gWEFUVFJfU0VDVVJJVFlfVCAmJiAhc2VsaW51eF9pc19lbmFibGVkKCkgJiYKLQkgICAgc3RyY21wKG5hbWUsICJzZWN1cml0eS5zZWxpbnV4IikgPT0gMCkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0jaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAotCS8qIHBvc2l4IGFjbCBpcyB1bmRlciBwcm90ZWN0aW9uIG9mIExPT0tVUCBsb2NrLiB3aGVuIGNhbGxpbmcgdG8gdGhpcywKLQkgKiB3ZSBqdXN0IGhhdmUgcGF0aCByZXNvbHV0aW9uIHRvIHRoZSB0YXJnZXQgaW5vZGUsIHNvIHdlIGhhdmUgZ3JlYXQKLQkgKiBjaGFuY2UgdGhhdCBjYWNoZWQgQUNMIGlzIHVwdG9kYXRlLgotCSAqLwotCWlmICh4YXR0cl90eXBlID09IFhBVFRSX0FDTF9BQ0NFU1NfVCkgewotCQlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7Ci0KLQkJc3Bpbl9sb2NrKCZsbGktPmxsaV9sb2NrKTsKLQkJYWNsID0gcG9zaXhfYWNsX2R1cChsbGktPmxsaV9wb3NpeF9hY2wpOwotCQlzcGluX3VubG9jaygmbGxpLT5sbGlfbG9jayk7Ci0KLQkJaWYgKCFhY2wpCi0JCQlyZXR1cm4gLUVOT0RBVEE7Ci0KLQkJcmMgPSBwb3NpeF9hY2xfdG9feGF0dHIoJmluaXRfdXNlcl9ucywgYWNsLCBidWZmZXIsIHNpemUpOwotCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwotCQlyZXR1cm4gcmM7Ci0JfQotCWlmICh4YXR0cl90eXBlID09IFhBVFRSX0FDTF9ERUZBVUxUX1QgJiYgIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCi0JCXJldHVybiAtRU5PREFUQTsKLSNlbmRpZgotCi1kb19nZXR4YXR0cjoKLQlpZiAoc2JpLT5sbF94YXR0cl9jYWNoZV9lbmFibGVkICYmIHhhdHRyX3R5cGUgIT0gWEFUVFJfQUNMX0FDQ0VTU19UKSB7CisJaWYgKHNiaS0+bGxfeGF0dHJfY2FjaGVfZW5hYmxlZCAmJiB0eXBlICE9IFhBVFRSX0FDTF9BQ0NFU1NfVCkgewogCQlyYyA9IGxsX3hhdHRyX2NhY2hlX2dldChpbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplLCB2YWxpZCk7CiAJCWlmIChyYyA9PSAtRUFHQUlOKQogCQkJZ290byBnZXR4YXR0cl9ub2NhY2hlOwpAQCAtMzExLDM2ICsyNTcsMzYgQEAKIAogCQkvKiBvbmx5IGRldGVjdCB0aGUgeGF0dHIgc2l6ZSAqLwogCQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCQlyYyA9IGJvZHktPmVhZGF0YXNpemU7CisJCQlyYyA9IGJvZHktPm1ib19lYWRhdGFzaXplOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlpZiAoc2l6ZSA8IGJvZHktPmVhZGF0YXNpemUpIHsKKwkJaWYgKHNpemUgPCBib2R5LT5tYm9fZWFkYXRhc2l6ZSkgewogCQkJQ0VSUk9SKCJzZXJ2ZXIgYnVnOiByZXBsaWVkIHNpemUgJXUgPiAldVxuIiwKLQkJCSAgICAgICBib2R5LT5lYWRhdGFzaXplLCAoaW50KXNpemUpOworCQkJICAgICAgIGJvZHktPm1ib19lYWRhdGFzaXplLCAoaW50KXNpemUpOwogCQkJcmMgPSAtRVJBTkdFOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlpZiAoYm9keS0+ZWFkYXRhc2l6ZSA9PSAwKSB7CisJCWlmIChib2R5LT5tYm9fZWFkYXRhc2l6ZSA9PSAwKSB7CiAJCQlyYyA9IC1FTk9EQVRBOwogCQkJZ290byBvdXQ7CiAJCX0KIAogCQkvKiBkbyBub3QgbmVlZCBzd2FiIHhhdHRyIGRhdGEgKi8KIAkJeGRhdGEgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfRUFEQVRBLAotCQkJCQkJICAgICBib2R5LT5lYWRhdGFzaXplKTsKKwkJCQkJCSAgICAgYm9keS0+bWJvX2VhZGF0YXNpemUpOwogCQlpZiAoIXhkYXRhKSB7CiAJCQlyYyA9IC1FRkFVTFQ7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCW1lbWNweShidWZmZXIsIHhkYXRhLCBib2R5LT5lYWRhdGFzaXplKTsKLQkJcmMgPSBib2R5LT5lYWRhdGFzaXplOworCQltZW1jcHkoYnVmZmVyLCB4ZGF0YSwgYm9keS0+bWJvX2VhZGF0YXNpemUpOworCQlyYyA9IGJvZHktPm1ib19lYWRhdGFzaXplOwogCX0KIAogb3V0X3hhdHRyOgotCWlmIChyYyA9PSAtRU9QTk9UU1VQUCAmJiB4YXR0cl90eXBlID09IFhBVFRSX1VTRVJfVCkgeworCWlmIChyYyA9PSAtRU9QTk9UU1VQUCAmJiB0eXBlID09IFhBVFRSX1VTRVJfVCkgewogCQlMQ09OU09MRV9JTkZPKAogCQkJIiVzOiBkaXNhYmxpbmcgdXNlcl94YXR0ciBmZWF0dXJlIGJlY2F1c2UgaXQgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgc2VydmVyOiByYyA9ICVkXG4iLAogCQkJbGxfZ2V0X2ZzbmFtZShpbm9kZS0+aV9zYiwgTlVMTCwgMCksIHJjKTsKQEAgLTM1MSw4ICsyOTcsNjUgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXNzaXplX3QgbGxfZ2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBpbnQgbGxfeGF0dHJfZ2V0X2NvbW1vbihjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciwKKwkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwljaGFyIGZ1bGxuYW1lW3N0cmxlbihoYW5kbGVyLT5wcmVmaXgpICsgc3RybGVuKG5hbWUpICsgMV07CisJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX2kyc2JpKGlub2RlKTsKKyNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCisJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CisjZW5kaWYKKwlpbnQgcmM7CisKKwlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDppbm9kZT0iREZJRCIoJXApXG4iLAorCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBpbm9kZSk7CisKKwlsbF9zdGF0c19vcHNfdGFsbHkobGxfaTJzYmkoaW5vZGUpLCBMUFJPQ19MTF9HRVRYQVRUUiwgMSk7CisKKwlyYyA9IHhhdHRyX3R5cGVfZmlsdGVyKHNiaSwgaGFuZGxlci0+ZmxhZ3MpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogYjE1NTg3OiBpZ25vcmUgc2VjdXJpdHkuY2FwYWJpbGl0eSB4YXR0ciBmb3Igbm93ICovCisJaWYgKChoYW5kbGVyLT5mbGFncyA9PSBYQVRUUl9TRUNVUklUWV9UICYmICFzdHJjbXAobmFtZSwgImNhcGFiaWxpdHkiKSkpCisJCXJldHVybiAtRU5PREFUQTsKKworCS8qIExVLTU0OTogIERpc2FibGUgc2VjdXJpdHkuc2VsaW51eCB3aGVuIHNlbGludXggaXMgZGlzYWJsZWQgKi8KKwlpZiAoaGFuZGxlci0+ZmxhZ3MgPT0gWEFUVFJfU0VDVVJJVFlfVCAmJiAhc2VsaW51eF9pc19lbmFibGVkKCkgJiYKKwkgICAgIXN0cmNtcChuYW1lLCAic2VsaW51eCIpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKyNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCisJLyogcG9zaXggYWNsIGlzIHVuZGVyIHByb3RlY3Rpb24gb2YgTE9PS1VQIGxvY2suIHdoZW4gY2FsbGluZyB0byB0aGlzLAorCSAqIHdlIGp1c3QgaGF2ZSBwYXRoIHJlc29sdXRpb24gdG8gdGhlIHRhcmdldCBpbm9kZSwgc28gd2UgaGF2ZSBncmVhdAorCSAqIGNoYW5jZSB0aGF0IGNhY2hlZCBBQ0wgaXMgdXB0b2RhdGUuCisJICovCisJaWYgKGhhbmRsZXItPmZsYWdzID09IFhBVFRSX0FDTF9BQ0NFU1NfVCkgeworCQlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisKKwkJc3Bpbl9sb2NrKCZsbGktPmxsaV9sb2NrKTsKKwkJYWNsID0gcG9zaXhfYWNsX2R1cChsbGktPmxsaV9wb3NpeF9hY2wpOworCQlzcGluX3VubG9jaygmbGxpLT5sbGlfbG9jayk7CisKKwkJaWYgKCFhY2wpCisJCQlyZXR1cm4gLUVOT0RBVEE7CisKKwkJcmMgPSBwb3NpeF9hY2xfdG9feGF0dHIoJmluaXRfdXNlcl9ucywgYWNsLCBidWZmZXIsIHNpemUpOworCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCQlyZXR1cm4gcmM7CisJfQorCWlmIChoYW5kbGVyLT5mbGFncyA9PSBYQVRUUl9BQ0xfREVGQVVMVF9UICYmICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gLUVOT0RBVEE7CisjZW5kaWYKKwlzcHJpbnRmKGZ1bGxuYW1lLCAiJXMlc1xuIiwgaGFuZGxlci0+cHJlZml4LCBuYW1lKTsKKwlyZXR1cm4gbGxfeGF0dHJfbGlzdChpbm9kZSwgZnVsbG5hbWUsIGhhbmRsZXItPmZsYWdzLCBidWZmZXIsIHNpemUsCisJCQkgICAgIE9CRF9NRF9GTFhBVFRSKTsKK30KKworc3RhdGljIGludCBsbF94YXR0cl9nZXQoY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIsCisJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQljb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQogewogCUxBU1NFUlQoaW5vZGUpOwogCUxBU1NFUlQobmFtZSk7CkBAIC0zNjAsMzYgKzM2MywyMyBAQAogCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOmlub2RlPSJERklEIiglcCksIHhhdHRyICVzXG4iLAogCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBpbm9kZSwgbmFtZSk7CiAKLQlsbF9zdGF0c19vcHNfdGFsbHkobGxfaTJzYmkoaW5vZGUpLCBMUFJPQ19MTF9HRVRYQVRUUiwgMSk7Ci0KLQlpZiAoKHN0cm5jbXAobmFtZSwgWEFUVFJfVFJVU1RFRF9QUkVGSVgsCi0JCSAgICAgc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKSAtIDEpID09IDAgJiYKLQkgICAgIHN0cmNtcChuYW1lICsgc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKSAtIDEsICJsb3YiKSA9PSAwKSB8fAotCSAgICAoc3RybmNtcChuYW1lLCBYQVRUUl9MVVNUUkVfUFJFRklYLAotCQkgICAgIHNpemVvZihYQVRUUl9MVVNUUkVfUFJFRklYKSAtIDEpID09IDAgJiYKLQkgICAgIHN0cmNtcChuYW1lICsgc2l6ZW9mKFhBVFRSX0xVU1RSRV9QUkVGSVgpIC0gMSwgImxvdiIpID09IDApKSB7CisJaWYgKCFzdHJjbXAobmFtZSwgImxvdiIpKSB7CiAJCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc207CiAJCXN0cnVjdCBsb3ZfdXNlcl9tZCAqbHVtcDsKIAkJc3RydWN0IGxvdl9tZHNfbWQgKmxtbSA9IE5VTEw7CiAJCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdCA9IE5VTEw7CiAJCWludCByYyA9IDAsIGxtbXNpemUgPSAwOwogCisJCWxsX3N0YXRzX29wc190YWxseShsbF9pMnNiaShpbm9kZSksIExQUk9DX0xMX0dFVFhBVFRSLCAxKTsKKwogCQlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCiAJCQlyZXR1cm4gLUVOT0RBVEE7CiAKLQkJaWYgKHNpemUgPT0gMCAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7Ci0JCQkvKiBYWFggZGlyZWN0b3J5IEVBIGlzIGZpeCBmb3Igbm93LCBvcHRpbWl6ZSB0byBzYXZlCi0JCQkgKiBSUEMgdHJhbnNmZXIKLQkJCSAqLwotCQkJcmMgPSBzaXplb2Yoc3RydWN0IGxvdl91c2VyX21kKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KIAkJbHNtID0gY2NjX2lub2RlX2xzbV9nZXQoaW5vZGUpOwogCQlpZiAoIWxzbSkgewogCQkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKLQkJCQlyYyA9IGxsX2Rpcl9nZXRzdHJpcGUoaW5vZGUsICZsbW0sCi0JCQkJCQkgICAgICAmbG1tc2l6ZSwgJnJlcXVlc3QpOworCQkJCXJjID0gbGxfZGlyX2dldHN0cmlwZShpbm9kZSwgKHZvaWQgKiopJmxtbSwKKwkJCQkJCSAgICAgICZsbW1zaXplLCAmcmVxdWVzdCwgMCk7CiAJCQl9IGVsc2UgewogCQkJCXJjID0gLUVOT0RBVEE7CiAJCQl9CkBAIC00MzksNyArNDI5LDcgQEAKIAkJcmV0dXJuIHJjOwogCX0KIAotCXJldHVybiBsbF9nZXR4YXR0cl9jb21tb24oaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSwgT0JEX01EX0ZMWEFUVFIpOworCXJldHVybiBsbF94YXR0cl9nZXRfY29tbW9uKGhhbmRsZXIsIGRlbnRyeSwgaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSk7CiB9CiAKIHNzaXplX3QgbGxfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKQEAgLTQ1Nyw3ICs0NDcsOCBAQAogCiAJbGxfc3RhdHNfb3BzX3RhbGx5KGxsX2kyc2JpKGlub2RlKSwgTFBST0NfTExfTElTVFhBVFRSLCAxKTsKIAotCXJjID0gbGxfZ2V0eGF0dHJfY29tbW9uKGlub2RlLCBOVUxMLCBidWZmZXIsIHNpemUsIE9CRF9NRF9GTFhBVFRSTFMpOworCXJjID0gbGxfeGF0dHJfbGlzdChpbm9kZSwgTlVMTCwgWEFUVFJfT1RIRVJfVCwgYnVmZmVyLCBzaXplLAorCQkJICAgT0JEX01EX0ZMWEFUVFJMUyk7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBvdXQ7CiAKQEAgLTQ4OCw3ICs0NzksOCBAQAogCQlpZiAoIWxsX2kyaW5mbyhpbm9kZSktPmxsaV9oYXNfc21kKQogCQkJcmMyID0gLTE7CiAJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7Ci0JCXJjMiA9IGxsX2Rpcl9nZXRzdHJpcGUoaW5vZGUsICZsbW0sICZsbW1zaXplLCAmcmVxdWVzdCk7CisJCXJjMiA9IGxsX2Rpcl9nZXRzdHJpcGUoaW5vZGUsICh2b2lkICoqKSZsbW0sICZsbW1zaXplLAorCQkJCSAgICAgICAmcmVxdWVzdCwgMCk7CiAJfQogCiAJaWYgKHJjMiA8IDApIHsKQEAgLTUxOCwzICs1MTAsNTcgQEAKIAogCXJldHVybiByYzsKIH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIGxsX3VzZXJfeGF0dHJfaGFuZGxlciA9IHsKKwkucHJlZml4ID0gWEFUVFJfVVNFUl9QUkVGSVgsCisJLmZsYWdzID0gWEFUVFJfVVNFUl9ULAorCS5nZXQgPSBsbF94YXR0cl9nZXRfY29tbW9uLAorCS5zZXQgPSBsbF94YXR0cl9zZXRfY29tbW9uLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIGxsX3RydXN0ZWRfeGF0dHJfaGFuZGxlciA9IHsKKwkucHJlZml4ID0gWEFUVFJfVFJVU1RFRF9QUkVGSVgsCisJLmZsYWdzID0gWEFUVFJfVFJVU1RFRF9ULAorCS5nZXQgPSBsbF94YXR0cl9nZXQsCisJLnNldCA9IGxsX3hhdHRyX3NldCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBsbF9zZWN1cml0eV94YXR0cl9oYW5kbGVyID0geworCS5wcmVmaXggPSBYQVRUUl9TRUNVUklUWV9QUkVGSVgsCisJLmZsYWdzID0gWEFUVFJfU0VDVVJJVFlfVCwKKwkuZ2V0ID0gbGxfeGF0dHJfZ2V0X2NvbW1vbiwKKwkuc2V0ID0gbGxfeGF0dHJfc2V0X2NvbW1vbiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBsbF9hY2xfYWNjZXNzX3hhdHRyX2hhbmRsZXIgPSB7CisJLnByZWZpeCA9IFhBVFRSX05BTUVfUE9TSVhfQUNMX0FDQ0VTUywKKwkuZmxhZ3MgPSBYQVRUUl9BQ0xfQUNDRVNTX1QsCisJLmdldCA9IGxsX3hhdHRyX2dldF9jb21tb24sCisJLnNldCA9IGxsX3hhdHRyX3NldF9jb21tb24sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgbGxfYWNsX2RlZmF1bHRfeGF0dHJfaGFuZGxlciA9IHsKKwkucHJlZml4ID0gWEFUVFJfTkFNRV9QT1NJWF9BQ0xfREVGQVVMVCwKKwkuZmxhZ3MgPSBYQVRUUl9BQ0xfREVGQVVMVF9ULAorCS5nZXQgPSBsbF94YXR0cl9nZXRfY29tbW9uLAorCS5zZXQgPSBsbF94YXR0cl9zZXRfY29tbW9uLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIGxsX2x1c3RyZV94YXR0cl9oYW5kbGVyID0geworCS5wcmVmaXggPSBYQVRUUl9MVVNUUkVfUFJFRklYLAorCS5mbGFncyA9IFhBVFRSX0xVU1RSRV9ULAorCS5nZXQgPSBsbF94YXR0cl9nZXQsCisJLnNldCA9IGxsX3hhdHRyX3NldCwKK307CisKK2NvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpsbF94YXR0cl9oYW5kbGVyc1tdID0geworCSZsbF91c2VyX3hhdHRyX2hhbmRsZXIsCisJJmxsX3RydXN0ZWRfeGF0dHJfaGFuZGxlciwKKwkmbGxfc2VjdXJpdHlfeGF0dHJfaGFuZGxlciwKKyNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCisJJmxsX2FjbF9hY2Nlc3NfeGF0dHJfaGFuZGxlciwKKwkmbGxfYWNsX2RlZmF1bHRfeGF0dHJfaGFuZGxlciwKKyNlbmRpZgorCSZsbF9sdXN0cmVfeGF0dHJfaGFuZGxlciwKKwlOVUxMLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyX2NhY2hlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0cl9jYWNoZS5jCmluZGV4IDgwODlkYTguLjUwYTE5YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyX2NhY2hlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUveGF0dHJfY2FjaGUuYwpAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9zdXBwb3J0LmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2RsbS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX3Zlci5oIgogI2luY2x1ZGUgImxsaXRlX2ludGVybmFsLmgiCkBAIC0yNzAsMTAgKzI2OSwxMiBAQAogCXN0cnVjdCBsdXN0cmVfaGFuZGxlIGxvY2toID0geyAwIH07CiAJc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7CiAJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7Ci0Jc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvIGVpbmZvID0geyAuZWlfdHlwZSA9IExETE1fSUJJVFMsCi0JCQkJCSAgIC5laV9tb2RlID0gaXRfdG9fbG9ja19tb2RlKG9pdCksCi0JCQkJCSAgIC5laV9jYl9ibCA9IGxsX21kX2Jsb2NraW5nX2FzdCwKLQkJCQkJICAgLmVpX2NiX2NwID0gbGRsbV9jb21wbGV0aW9uX2FzdCB9OworCXN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyBlaW5mbyA9IHsKKwkJLmVpX3R5cGUgPSBMRExNX0lCSVRTLAorCQkuZWlfbW9kZSA9IGl0X3RvX2xvY2tfbW9kZShvaXQpLAorCQkuZWlfY2JfYmwgPSAmbGxfbWRfYmxvY2tpbmdfYXN0LAorCQkuZWlfY2JfY3AgPSAmbGRsbV9jb21wbGV0aW9uX2FzdCwKKwl9OwogCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9pMnNiaShpbm9kZSk7CiAJc3RydWN0IG9iZF9leHBvcnQgKmV4cCA9IHNiaS0+bGxfbWRfZXhwOwogCWludCByYzsKQEAgLTMwNCw3ICszMDUsNyBAQAogCiAJb3BfZGF0YS0+b3BfdmFsaWQgPSBPQkRfTURfRkxYQVRUUiB8IE9CRF9NRF9GTFhBVFRSTFM7CiAKLQlyYyA9IG1kX2VucXVldWUoZXhwLCAmZWluZm8sIG9pdCwgb3BfZGF0YSwgJmxvY2toLCBOVUxMLCAwLCBOVUxMLCAwKTsKKwlyYyA9IG1kX2VucXVldWUoZXhwLCAmZWluZm8sIE5VTEwsIG9pdCwgb3BfZGF0YSwgJmxvY2toLCAwKTsKIAlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKIAogCWlmIChyYyA8IDApIHsKQEAgLTM4MCwyNSArMzgxLDI1IEBACiAJfQogCS8qIGRvIG5vdCBuZWVkIHN3YWIgeGF0dHIgZGF0YSAqLwogCXhkYXRhID0gcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX0VBREFUQSwKLQkJCQkJICAgICBib2R5LT5lYWRhdGFzaXplKTsKKwkJCQkJICAgICBib2R5LT5tYm9fZWFkYXRhc2l6ZSk7CiAJeHZhbCA9IHJlcV9jYXBzdWxlX3NlcnZlcl9zaXplZF9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9FQVZBTFMsCi0JCQkJCSAgICBib2R5LT5hY2xzaXplKTsKKwkJCQkJICAgIGJvZHktPm1ib19hY2xzaXplKTsKIAl4c2l6ZXMgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfRUFWQUxTX0xFTlMsCi0JCQkJCSAgICAgIGJvZHktPm1heF9tZHNpemUgKiBzaXplb2YoX191MzIpKTsKKwkJCQkJICAgICAgYm9keS0+bWJvX21heF9tZHNpemUgKiBzaXplb2YoX191MzIpKTsKIAlpZiAoIXhkYXRhIHx8ICF4dmFsIHx8ICF4c2l6ZXMpIHsKIAkJQ0VSUk9SKCJ3cm9uZyBzZXR4YXR0ciByZXBseVxuIik7CiAJCXJjID0gLUVQUk9UTzsKIAkJZ290byBvdXRfZGVzdHJveTsKIAl9CiAKLQl4dGFpbCA9IHhkYXRhICsgYm9keS0+ZWFkYXRhc2l6ZTsKLQl4dnRhaWwgPSB4dmFsICsgYm9keS0+YWNsc2l6ZTsKKwl4dGFpbCA9IHhkYXRhICsgYm9keS0+bWJvX2VhZGF0YXNpemU7CisJeHZ0YWlsID0geHZhbCArIGJvZHktPm1ib19hY2xzaXplOwogCiAJQ0RFQlVHKERfQ0FDSEUsICJjYWNoaW5nOiB4ZGF0YT0lcCB4dGFpbD0lcFxuIiwgeGRhdGEsIHh0YWlsKTsKIAogCWxsX3hhdHRyX2NhY2hlX2luaXQobGxpKTsKIAotCWZvciAoaSA9IDA7IGkgPCBib2R5LT5tYXhfbWRzaXplOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgYm9keS0+bWJvX21heF9tZHNpemU7IGkrKykgewogCQlDREVCVUcoRF9DQUNIRSwgImNhY2hpbmcgWyVzXT0lLipzXG4iLCB4ZGF0YSwgKnhzaXplcywgeHZhbCk7CiAJCS8qIFBlcmZvcm0gY29uc2lzdGVuY3kgY2hlY2tzOiBhdHRyIG5hbWVzIGFuZCB2YWxzIGluIHBpbGwgKi8KIAkJaWYgKCFtZW1jaHIoeGRhdGEsIDAsIHh0YWlsIC0geGRhdGEpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ZsZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9mbGQuYwppbmRleCBhM2QxNzBhLi5hNTI2NWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ZsZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfZmxkLmMKQEAgLTQ3LDE4ICs0NywyMCBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCIKICNpbmNsdWRlICJsbXZfaW50ZXJuYWwuaCIKIAotaW50IGxtdl9mbGRfbG9va3VwKHN0cnVjdCBsbXZfb2JkICpsbXYsCi0JCSAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCwKLQkJICAgdTMyICptZHMpCitpbnQgbG12X2ZsZF9sb29rdXAoc3RydWN0IGxtdl9vYmQgKmxtdiwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLCB1MzIgKm1kcykKIHsKKwlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gbG12Mm9iZF9kZXYobG12KTsKIAlpbnQgcmM7CiAKLQkvKiBGSVhNRTogQ3VycmVudGx5IFpGUyBzdGlsbCB1c2UgbG9jYWwgc2VxIGZvciBST09UIHVuZm9ydHVuYXRlbHksIGFuZAorCS8qCisJICogRklYTUU6IEN1cnJlbnRseSBaRlMgc3RpbGwgdXNlIGxvY2FsIHNlcSBmb3IgUk9PVCB1bmZvcnR1bmF0ZWx5LCBhbmQKIAkgKiB0aGlzIGZpZF9pc19sb2NhbCBjaGVjayBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIExVLTIyNDAgaXMgZml4ZWQKIAkgKi8KLQlMQVNTRVJURigoZmlkX3NlcV9pbl9mbGRiKGZpZF9zZXEoZmlkKSkgfHwKLQkJICBmaWRfc2VxX2lzX2xvY2FsX2ZpbGUoZmlkX3NlcShmaWQpKSkgJiYKLQkJIGZpZF9pc19zYW5lKGZpZCksIERGSUQiIGlzIGluc2FuZSFcbiIsIFBGSUQoZmlkKSk7CisJaWYgKCFmaWRfaXNfc2FuZShmaWQpIHx8ICEoZmlkX3NlcV9pbl9mbGRiKGZpZF9zZXEoZmlkKSkgfHwKKwkJCQkgICBmaWRfc2VxX2lzX2xvY2FsX2ZpbGUoZmlkX3NlcShmaWQpKSkpIHsKKwkJQ0VSUk9SKCIlczogaW52YWxpZCBGSUQgIiBERklEICJcbiIsIG9iZC0+b2JkX25hbWUsIFBGSUQoZmlkKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJjID0gZmxkX2NsaWVudF9sb29rdXAoJmxtdi0+bG12X2ZsZCwgZmlkX3NlcShmaWQpLCBtZHMsCiAJCQkgICAgICAgTFVfU0VRX1JBTkdFX01EVCwgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ludGVudC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9pbnRlbnQuYwppbmRleCAyZjU4ZmRhLi45ZjRlODI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ludGVudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfaW50ZW50LmMKQEAgLTQzLDEzICs0MywxMyBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpYi5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX25ldC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2RsbS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX21kYy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX2NsYXNzLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oIgogI2luY2x1ZGUgImxtdl9pbnRlcm5hbC5oIgogCi1zdGF0aWMgaW50IGxtdl9pbnRlbnRfcmVtb3RlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHZvaWQgKmxtbSwKLQkJCSAgICAgaW50IGxtbXNpemUsIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwKLQkJCSAgICAgY29uc3Qgc3RydWN0IGx1X2ZpZCAqcGFyZW50X2ZpZCwgaW50IGZsYWdzLAorc3RhdGljIGludCBsbXZfaW50ZW50X3JlbW90ZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKnBhcmVudF9maWQsCiAJCQkgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXAsCiAJCQkgICAgIGxkbG1fYmxvY2tpbmdfY2FsbGJhY2sgY2JfYmxvY2tpbmcsCiAJCQkgICAgIF9fdTY0IGV4dHJhX2xvY2tfZmxhZ3MpCkBAIC02OCw3ICs2OCw3IEBACiAJaWYgKCFib2R5KQogCQlyZXR1cm4gLUVQUk9UTzsKIAotCUxBU1NFUlQoKGJvZHktPnZhbGlkICYgT0JEX01EX01EUykpOworCUxBU1NFUlQoKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9NRFMpKTsKIAogCS8qCiAJICogVW5mb3J0dW5hdGVseSwgd2UgaGF2ZSB0byBsaWUgdG8gTURDL01EUyB0byByZXRyaWV2ZQpAQCAtODcsOSArODcsOSBAQAogCQlpdC0+aXRfcmVxdWVzdCA9IE5VTEw7CiAJfQogCi0JTEFTU0VSVChmaWRfaXNfc2FuZSgmYm9keS0+ZmlkMSkpOworCUxBU1NFUlQoZmlkX2lzX3NhbmUoJmJvZHktPm1ib19maWQxKSk7CiAKLQl0Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCAmYm9keS0+ZmlkMSk7CisJdGd0ID0gbG12X2ZpbmRfdGFyZ2V0KGxtdiwgJmJvZHktPm1ib19maWQxKTsKIAlpZiAoSVNfRVJSKHRndCkpIHsKIAkJcmMgPSBQVFJfRVJSKHRndCk7CiAJCWdvdG8gb3V0OwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCW9wX2RhdGEtPm9wX2ZpZDEgPSBib2R5LT5maWQxOworCW9wX2RhdGEtPm9wX2ZpZDEgPSBib2R5LT5tYm9fZmlkMTsKIAkvKiBTZW50IHRoZSBwYXJlbnQgRklEIHRvIHRoZSByZW1vdGUgTURUICovCiAJaWYgKHBhcmVudF9maWQpIHsKIAkJLyogVGhlIHBhcmVudCBmaWQgaXMgb25seSBmb3IgcmVtb3RlIG9wZW4gdG8KQEAgLTExMCwxOCArMTEwLDE0IEBACiAJCSAqLwogCQlMQVNTRVJUKGl0LT5pdF9vcCAmIElUX09QRU4pOwogCQlvcF9kYXRhLT5vcF9maWQyID0gKnBhcmVudF9maWQ7Ci0JCS8qIEFkZCBvYmplY3QgRklEIHRvIG9wX2ZpZDMsIGluIGNhc2UgaXQgbmVlZHMgdG8gY2hlY2sgc3RhbGUKLQkJICogKE1fQ0hFQ0tfU1RBTEUpLCBzZWUgbWRjX2ZpbmlzaF9pbnRlbnRfbG9jawotCQkgKi8KLQkJb3BfZGF0YS0+b3BfZmlkMyA9IGJvZHktPmZpZDE7CiAJfQogCiAJb3BfZGF0YS0+b3BfYmlhcyA9IE1EU19DUk9TU19SRUY7Ci0JQ0RFQlVHKERfSU5PREUsICJSRU1PVEVfSU5URU5UIHdpdGggZmlkPSJERklEIiAtPiBtZHMgIyVkXG4iLAotCSAgICAgICBQRklEKCZib2R5LT5maWQxKSwgdGd0LT5sdGRfaWR4KTsKKwlDREVCVUcoRF9JTk9ERSwgIlJFTU9URV9JTlRFTlQgd2l0aCBmaWQ9IiBERklEICIgLT4gbWRzICMldVxuIiwKKwkgICAgICAgUEZJRCgmYm9keS0+bWJvX2ZpZDEpLCB0Z3QtPmx0ZF9pZHgpOwogCi0JcmMgPSBtZF9pbnRlbnRfbG9jayh0Z3QtPmx0ZF9leHAsIG9wX2RhdGEsIGxtbSwgbG1tc2l6ZSwgaXQsCi0JCQkgICAgZmxhZ3MsICZyZXEsIGNiX2Jsb2NraW5nLCBleHRyYV9sb2NrX2ZsYWdzKTsKKwlyYyA9IG1kX2ludGVudF9sb2NrKHRndC0+bHRkX2V4cCwgb3BfZGF0YSwgaXQsICZyZXEsIGNiX2Jsb2NraW5nLAorCQkJICAgIGV4dHJhX2xvY2tfZmxhZ3MpOwogCWlmIChyYykKIAkJZ290byBvdXRfZnJlZV9vcF9kYXRhOwogCkBAIC0xMzYsOCArMTMyLDEwIEBACiAJCWl0LT5pdF9yZW1vdGVfbG9ja19tb2RlID0gaXQtPml0X2xvY2tfbW9kZTsKIAl9CiAKLQlpdC0+aXRfbG9ja19oYW5kbGUgPSBwbG9jay5jb29raWU7Ci0JaXQtPml0X2xvY2tfbW9kZSA9IHBtb2RlOworCWlmIChwbW9kZSkgeworCQlpdC0+aXRfbG9ja19oYW5kbGUgPSBwbG9jay5jb29raWU7CisJCWl0LT5pdF9sb2NrX21vZGUgPSBwbW9kZTsKKwl9CiAKIG91dF9mcmVlX29wX2RhdGE6CiAJa2ZyZWUob3BfZGF0YSk7CkBAIC0xNTAsMTMgKzE0OCwxMjYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK2ludCBsbXZfcmV2YWxpZGF0ZV9zbGF2ZXMoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJCSAgY29uc3Qgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSwKKwkJCSAgbGRsbV9ibG9ja2luZ19jYWxsYmFjayBjYl9ibG9ja2luZywKKwkJCSAgaW50IGV4dHJhX2xvY2tfZmxhZ3MpCit7CisJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IGV4cC0+ZXhwX29iZDsKKwlzdHJ1Y3QgbG12X29iZCAqbG12ID0gJm9iZC0+dS5sbXY7CisJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEgPSBOVUxMOworCXN0cnVjdCBtZHRfYm9keSAqYm9keTsKKwlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKKwlpbnQgcmMgPSAwLCBpOworCisJLyoqCisJICogcmV2YWxpZGF0ZSBzbGF2ZXMgaGFzIHNvbWUgcHJvYmxlbXMsIHRlbXBvcmFyaWx5IHJldHVybiwKKwkgKiB3ZSBtYXkgbm90IG5lZWQgdGhhdAorCSAqLworCW9wX2RhdGEgPSBremFsbG9jKHNpemVvZigqb3BfZGF0YSksIEdGUF9OT0ZTKTsKKwlpZiAoIW9wX2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoqCisJICogTG9vcCBvdmVyIHRoZSBzdHJpcGUgaW5mb3JtYXRpb24sIGNoZWNrIHZhbGlkaXR5IGFuZCB1cGRhdGUgdGhlbQorCSAqIGZyb20gTURTIGlmIG5lZWRlZC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGxvb2t1cF9pbnRlbnQgaXQgPSB7IC5pdF9vcCA9IElUX0dFVEFUVFIgfTsKKwkJc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxvY2toID0gTlVMTDsKKwkJc3RydWN0IGxtdl90Z3RfZGVzYyAqdGd0ID0gTlVMTDsKKwkJc3RydWN0IGlub2RlICppbm9kZTsKKwkJc3RydWN0IGx1X2ZpZCBmaWQ7CisKKwkJZmlkID0gbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX2ZpZDsKKwkJaW5vZGUgPSBsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fcm9vdDsKKworCQkvKgorCQkgKiBQcmVwYXJlIG9wX2RhdGEgZm9yIHJldmFsaWRhdGluZy4gTm90ZSB0aGF0IEBmaWQyIHNobHVsZCBiZQorCQkgKiBkZWZpbmVkIG90aGVyd2lzZSBpdCB3aWxsIGdvIHRvIHNlcnZlciBhbmQgdGFrZSBuZXcgbG9jaworCQkgKiB3aGljaCBpcyBub3QgbmVlZGVkIGhlcmUuCisJCSAqLworCQltZW1zZXQob3BfZGF0YSwgMCwgc2l6ZW9mKCpvcF9kYXRhKSk7CisJCW9wX2RhdGEtPm9wX2ZpZDEgPSBmaWQ7CisJCW9wX2RhdGEtPm9wX2ZpZDIgPSBmaWQ7CisKKwkJdGd0ID0gbG12X2xvY2F0ZV9tZHMobG12LCBvcF9kYXRhLCAmZmlkKTsKKwkJaWYgKElTX0VSUih0Z3QpKSB7CisJCQlyYyA9IFBUUl9FUlIodGd0KTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCUNERUJVRyhEX0lOT0RFLCAiUmV2YWxpZGF0ZSBzbGF2ZSAiIERGSUQgIiAtPiBtZHMgIyV1XG4iLAorCQkgICAgICAgUEZJRCgmZmlkKSwgdGd0LT5sdGRfaWR4KTsKKworCQlpZiAocmVxKSB7CisJCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CisJCQlyZXEgPSBOVUxMOworCQl9CisKKwkJcmMgPSBtZF9pbnRlbnRfbG9jayh0Z3QtPmx0ZF9leHAsIG9wX2RhdGEsICZpdCwgJnJlcSwKKwkJCQkgICAgY2JfYmxvY2tpbmcsIGV4dHJhX2xvY2tfZmxhZ3MpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBjbGVhbnVwOworCisJCWxvY2toID0gKHN0cnVjdCBsdXN0cmVfaGFuZGxlICopJml0Lml0X2xvY2tfaGFuZGxlOworCQlpZiAocmMgPiAwICYmICFyZXEpIHsKKwkJCS8qIHNsYXZlIGlub2RlIGlzIHN0aWxsIHZhbGlkICovCisJCQlDREVCVUcoRF9JTk9ERSwgInNsYXZlICJERklEIiBpcyBzdGlsbCB2YWxpZC5cbiIsCisJCQkgICAgICAgUEZJRCgmZmlkKSk7CisJCQlyYyA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiByZWZyZXNoIHNsYXZlIGZyb20gc2VydmVyICovCisJCQlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLAorCQkJCQkJICAgICAgJlJNRl9NRFRfQk9EWSk7CisJCQlMQVNTRVJUKGJvZHkpOworCisJCQlpZiAodW5saWtlbHkoYm9keS0+bWJvX25saW5rIDwgMikpIHsKKwkJCQlDRVJST1IoIiVzOiBubGluayAlZCA8IDIgY29ycnVwdCBzdHJpcGUgJWQgIkRGSUQiOiIgREZJRCJcbiIsCisJCQkJICAgICAgIG9iZC0+b2JkX25hbWUsIGJvZHktPm1ib19ubGluaywgaSwKKwkJCQkgICAgICAgUEZJRCgmbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX2ZpZCksCisJCQkJICAgICAgIFBGSUQoJmxzbS0+bHNtX21kX29pbmZvWzBdLmxtb19maWQpKTsKKworCQkJCWlmIChpdC5pdF9sb2NrX21vZGUgJiYgbG9ja2gpIHsKKwkJCQkJbGRsbV9sb2NrX2RlY3JlZihsb2NraCwgaXQuaXRfbG9ja19tb2RlKTsKKwkJCQkJaXQuaXRfbG9ja19tb2RlID0gMDsKKwkJCQl9CisKKwkJCQlyYyA9IC1FSU87CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCisJCQlpX3NpemVfd3JpdGUoaW5vZGUsIGJvZHktPm1ib19zaXplKTsKKwkJCWlub2RlLT5pX2Jsb2NrcyA9IGJvZHktPm1ib19ibG9ja3M7CisJCQlzZXRfbmxpbmsoaW5vZGUsIGJvZHktPm1ib19ubGluayk7CisJCQlMVElNRV9TKGlub2RlLT5pX2F0aW1lKSA9IGJvZHktPm1ib19hdGltZTsKKwkJCUxUSU1FX1MoaW5vZGUtPmlfY3RpbWUpID0gYm9keS0+bWJvX2N0aW1lOworCQkJTFRJTUVfUyhpbm9kZS0+aV9tdGltZSkgPSBib2R5LT5tYm9fbXRpbWU7CisJCX0KKworCQltZF9zZXRfbG9ja19kYXRhKHRndC0+bHRkX2V4cCwgbG9ja2gsIGlub2RlLCBOVUxMKTsKKworCQlpZiAoaXQuaXRfbG9ja19tb2RlICYmIGxvY2toKSB7CisJCQlsZGxtX2xvY2tfZGVjcmVmKGxvY2toLCBpdC5pdF9sb2NrX21vZGUpOworCQkJaXQuaXRfbG9ja19tb2RlID0gMDsKKwkJfQorCX0KKworY2xlYW51cDoKKwlpZiAocmVxKQorCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CisKKwlrZnJlZShvcF9kYXRhKTsKKwlyZXR1cm4gcmM7Cit9CisKIC8qCiAgKiBJVF9PUEVOIGlzIGludGVuZGVkIHRvIG9wZW4gKGFuZCBjcmVhdGUsIHBvc3NpYmxlKSBhbiBvYmplY3QuIFBhcmVudCAocGlkKQogICogbWF5IGJlIHNwbGl0IGRpci4KICAqLwogc3RhdGljIGludCBsbXZfaW50ZW50X29wZW4oc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCQkgICB2b2lkICpsbW0sIGludCBsbW1zaXplLCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsCi0JCQkgICBpbnQgZmxhZ3MsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXAsCisJCQkgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsCisJCQkgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXFwLAogCQkJICAgbGRsbV9ibG9ja2luZ19jYWxsYmFjayBjYl9ibG9ja2luZywKIAkJCSAgIF9fdTY0IGV4dHJhX2xvY2tfZmxhZ3MpCiB7CkBAIC0xNjYsMzUgKzI3Nyw1NSBAQAogCXN0cnVjdCBtZHRfYm9keQkJKmJvZHk7CiAJaW50CQkJcmM7CiAKLQl0Z3QgPSBsbXZfbG9jYXRlX21kcyhsbXYsIG9wX2RhdGEsICZvcF9kYXRhLT5vcF9maWQxKTsKLQlpZiAoSVNfRVJSKHRndCkpCi0JCXJldHVybiBQVFJfRVJSKHRndCk7CisJaWYgKGl0LT5pdF9mbGFncyAmIE1EU19PUEVOX0JZX0ZJRCkgeworCQlMQVNTRVJUKGZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQyKSk7CisKKwkJLyoKKwkJICogZm9yIHN0cmlwZWQgZGlyZWN0b3J5LCB3ZSBjYW4ndCBrbm93IHBhcmVudCBzdHJpcGUgZmlkCisJCSAqIHdpdGhvdXQgbmFtZSwgYnV0IHdlIGNhbiBzZXQgaXQgdG8gY2hpbGQgZmlkLCBhbmQgTURUCisJCSAqIHdpbGwgb2J0YWluIGl0IGZyb20gbGlua2VhIGluIG9wZW4gaW4gc3VjaCBjYXNlLgorCQkgKi8KKwkJaWYgKG9wX2RhdGEtPm9wX21lYTEpCisJCQlvcF9kYXRhLT5vcF9maWQxID0gb3BfZGF0YS0+b3BfZmlkMjsKKworCQl0Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCAmb3BfZGF0YS0+b3BfZmlkMik7CisJCWlmIChJU19FUlIodGd0KSkKKwkJCXJldHVybiBQVFJfRVJSKHRndCk7CisKKwkJb3BfZGF0YS0+b3BfbWRzID0gdGd0LT5sdGRfaWR4OworCX0gZWxzZSB7CisJCUxBU1NFUlQoZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDEpKTsKKwkJTEFTU0VSVChmaWRfaXNfemVybygmb3BfZGF0YS0+b3BfZmlkMikpOworCQlMQVNTRVJUKG9wX2RhdGEtPm9wX25hbWUpOworCisJCXRndCA9IGxtdl9sb2NhdGVfbWRzKGxtdiwgb3BfZGF0YSwgJm9wX2RhdGEtPm9wX2ZpZDEpOworCQlpZiAoSVNfRVJSKHRndCkpCisJCQlyZXR1cm4gUFRSX0VSUih0Z3QpOworCX0KIAogCS8qIElmIGl0IGlzIHJlYWR5IHRvIG9wZW4gdGhlIGZpbGUgYnkgRklELCBkbyBub3QgbmVlZAogCSAqIGFsbG9jYXRlIEZJRCBhdCBhbGwsIG90aGVyd2lzZSBpdCB3aWxsIGNvbmZ1c2UgTURUCiAJICovCi0JaWYgKChpdC0+aXRfb3AgJiBJVF9DUkVBVCkgJiYKLQkgICAgIShpdC0+aXRfZmxhZ3MgJiBNRFNfT1BFTl9CWV9GSUQpKSB7CisJaWYgKChpdC0+aXRfb3AgJiBJVF9DUkVBVCkgJiYgIShpdC0+aXRfZmxhZ3MgJiBNRFNfT1BFTl9CWV9GSUQpKSB7CiAJCS8qCi0JCSAqIEZvciBvcGVuIHdpdGggSVRfQ1JFQVRFIGFuZCBmb3IgSVRfQ1JFQVRFIGNhc2VzIGFsbG9jYXRlIG5ldwotCQkgKiBmaWQgYW5kIHNldHVwIEZMRCBmb3IgaXQuCisJCSAqIEZvciBsb29rdXAoSVRfQ1JFQVRFKSBjYXNlcyBhbGxvY2F0ZSBuZXcgZmlkIGFuZCBzZXR1cCBGTEQKKwkJICogZm9yIGl0LgogCQkgKi8KLQkJb3BfZGF0YS0+b3BfZmlkMyA9IG9wX2RhdGEtPm9wX2ZpZDI7Ci0JCXJjID0gbG12X2ZpZF9hbGxvYyhleHAsICZvcF9kYXRhLT5vcF9maWQyLCBvcF9kYXRhKTsKKwkJcmMgPSBsbXZfZmlkX2FsbG9jKE5VTEwsIGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDIsIG9wX2RhdGEpOwogCQlpZiAocmMgIT0gMCkKIAkJCXJldHVybiByYzsKIAl9CiAKLQlDREVCVUcoRF9JTk9ERSwgIk9QRU5fSU5URU5UIHdpdGggZmlkMT0iIERGSUQgIiwgZmlkMj0iIERGSUQgIiwgbmFtZT0nJXMnIC0+IG1kcyAjJWRcbiIsCisJQ0RFQlVHKERfSU5PREUsICJPUEVOX0lOVEVOVCB3aXRoIGZpZDE9IiBERklEICIsIGZpZDI9IiBERklEICIsIG5hbWU9JyVzJyAtPiBtZHMgIyV1XG4iLAogCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwKIAkgICAgICAgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMiksIG9wX2RhdGEtPm9wX25hbWUsIHRndC0+bHRkX2lkeCk7CiAKLQlyYyA9IG1kX2ludGVudF9sb2NrKHRndC0+bHRkX2V4cCwgb3BfZGF0YSwgbG1tLCBsbW1zaXplLCBpdCwgZmxhZ3MsCi0JCQkgICAgcmVxcCwgY2JfYmxvY2tpbmcsIGV4dHJhX2xvY2tfZmxhZ3MpOworCXJjID0gbWRfaW50ZW50X2xvY2sodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBpdCwgcmVxcCwgY2JfYmxvY2tpbmcsCisJCQkgICAgZXh0cmFfbG9ja19mbGFncyk7CiAJaWYgKHJjICE9IDApCiAJCXJldHVybiByYzsKIAkvKgotCSAqIE5vdGhpbmcgaXMgZm91bmQsIGRvIG5vdCBhY2Nlc3MgYm9keS0+ZmlkMSBhcyBpdCBpcyB6ZXJvIGFuZCB0aHVzCisJICogTm90aGluZyBpcyBmb3VuZCwgZG8gbm90IGFjY2VzcyBib2R5LT5tYm9fZmlkMSBhcyBpdCBpcyB6ZXJvIGFuZCB0aHVzCiAJICogcG9pbnRsZXNzLgogCSAqLwogCWlmICgoaXQtPml0X2Rpc3Bvc2l0aW9uICYgRElTUF9MT09LVVBfTkVHKSAmJgpAQCAtMjA1LDMxICszMzYsMTcgQEAKIAlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmKCpyZXFwKS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CiAJaWYgKCFib2R5KQogCQlyZXR1cm4gLUVQUk9UTzsKLQkvKgotCSAqIE5vdCBjcm9zcy1yZWYgY2FzZSwganVzdCBnZXQgb3V0IG9mIGhlcmUuCi0JICovCi0JaWYgKGxpa2VseSghKGJvZHktPnZhbGlkICYgT0JEX01EX01EUykpKQotCQlyZXR1cm4gMDsKIAotCS8qCi0JICogT2theSwgTURTIGhhcyByZXR1cm5lZCBzdWNjZXNzLiBQcm9iYWJseSBuYW1lIGhhcyBiZWVuIHJlc29sdmVkIGluCi0JICogcmVtb3RlIGlub2RlLgotCSAqLwotCXJjID0gbG12X2ludGVudF9yZW1vdGUoZXhwLCBsbW0sIGxtbXNpemUsIGl0LCAmb3BfZGF0YS0+b3BfZmlkMSwgZmxhZ3MsCi0JCQkgICAgICAgcmVxcCwgY2JfYmxvY2tpbmcsIGV4dHJhX2xvY2tfZmxhZ3MpOwotCWlmIChyYyAhPSAwKSB7Ci0JCUxBU1NFUlQocmMgPCAwKTsKLQkJLyoKLQkJICogVGhpcyBpcyBwb3NzaWJsZSwgdGhhdCBzb21lIHVzZXJzcGFjZSBhcHBsaWNhdGlvbiB3aWxsIHRyeSB0bwotCQkgKiBvcGVuIGZpbGUgYXMgZGlyZWN0b3J5IGFuZCB3ZSB3aWxsIGhhdmUgLUVOT1RESVIgaGVyZS4gQXMKLQkJICogdGhpcyBpcyBub3JtYWwgc2l0dWF0aW9uLCB3ZSBzaG91bGQgbm90IHByaW50IGVycm9yIGhlcmUsCi0JCSAqIG9ubHkgZGVidWcgaW5mby4KLQkJICovCi0JCUNERUJVRyhEX0lOT0RFLCAiQ2FuJ3QgaGFuZGxlIHJlbW90ZSAlczogZGlyICIgREZJRCAiKCIgREZJRCAiKTolKnM6ICVkXG4iLAotCQkgICAgICAgTExfSVQyU1RSKGl0KSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMiksCi0JCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwgb3BfZGF0YS0+b3BfbmFtZWxlbiwKLQkJICAgICAgIG9wX2RhdGEtPm9wX25hbWUsIHJjKTsKLQkJcmV0dXJuIHJjOworCS8qIE5vdCBjcm9zcy1yZWYgY2FzZSwganVzdCBnZXQgb3V0IG9mIGhlcmUuICovCisJaWYgKHVubGlrZWx5KChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfTURTKSkpIHsKKwkJcmMgPSBsbXZfaW50ZW50X3JlbW90ZShleHAsIGl0LCAmb3BfZGF0YS0+b3BfZmlkMSwgcmVxcCwKKwkJCQkgICAgICAgY2JfYmxvY2tpbmcsIGV4dHJhX2xvY2tfZmxhZ3MpOworCQlpZiAocmMgIT0gMCkKKwkJCXJldHVybiByYzsKKworCQlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmKCpyZXFwKS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CisJCWlmICghYm9keSkKKwkJCXJldHVybiAtRVBST1RPOwogCX0KIAogCXJldHVybiByYzsKQEAgLTI0MCwzOCArMzU3LDEwMyBAQAogICovCiBzdGF0aWMgaW50IGxtdl9pbnRlbnRfbG9va3VwKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCQkgICAgIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkJICAgICB2b2lkICpsbW0sIGludCBsbW1zaXplLCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsCi0JCQkgICAgIGludCBmbGFncywgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxcCwKKwkJCSAgICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LAorCQkJICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXFwLAogCQkJICAgICBsZGxtX2Jsb2NraW5nX2NhbGxiYWNrIGNiX2Jsb2NraW5nLAogCQkJICAgICBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKQogeworCXN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20gPSBvcF9kYXRhLT5vcF9tZWExOwogCXN0cnVjdCBvYmRfZGV2aWNlICAgICAgKm9iZCA9IGV4cC0+ZXhwX29iZDsKIAlzdHJ1Y3QgbG12X29iZAkgKmxtdiA9ICZvYmQtPnUubG12OwogCXN0cnVjdCBsbXZfdGd0X2Rlc2MgICAgKnRndCA9IE5VTEw7CiAJc3RydWN0IG1kdF9ib2R5CSpib2R5OwogCWludAkJICAgICByYyA9IDA7CiAKKwkvKgorCSAqIElmIGl0IHJldHVybnMgRVJSX1BUUigtRUJBREZEKSB0aGVuIGl0IGlzIGFuIHVua25vd24gaGFzaCB0eXBlCisJICogaXQgd2lsbCB0cnkgYWxsIHN0cmlwZXMgdG8gbG9jYXRlIHRoZSBvYmplY3QKKwkgKi8KIAl0Z3QgPSBsbXZfbG9jYXRlX21kcyhsbXYsIG9wX2RhdGEsICZvcF9kYXRhLT5vcF9maWQxKTsKLQlpZiAoSVNfRVJSKHRndCkpCisJaWYgKElTX0VSUih0Z3QpICYmIChQVFJfRVJSKHRndCkgIT0gLUVCQURGRCkpCiAJCXJldHVybiBQVFJfRVJSKHRndCk7CiAKKwkvKgorCSAqIEJvdGggbWlncmF0aW5nIGRpciBhbmQgdW5rbm93biBoYXNoIGRpciBuZWVkIHRvIHRyeQorCSAqIGFsbCBvZiBzdWItc3RyaXBlcworCSAqLworCWlmIChsc20gJiYgIWxtdl9pc19rbm93bl9oYXNoX3R5cGUobHNtLT5sc21fbWRfaGFzaF90eXBlKSkgeworCQlzdHJ1Y3QgbG12X29pbmZvICpvaW5mbyA9ICZsc20tPmxzbV9tZF9vaW5mb1swXTsKKworCQlvcF9kYXRhLT5vcF9maWQxID0gb2luZm8tPmxtb19maWQ7CisJCW9wX2RhdGEtPm9wX21kcyA9IG9pbmZvLT5sbW9fbWRzOworCQl0Z3QgPSBsbXZfZ2V0X3RhcmdldChsbXYsIG9pbmZvLT5sbW9fbWRzLCBOVUxMKTsKKwkJaWYgKElTX0VSUih0Z3QpKQorCQkJcmV0dXJuIFBUUl9FUlIodGd0KTsKKwl9CisKIAlpZiAoIWZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQyKSkKIAkJZmlkX3plcm8oJm9wX2RhdGEtPm9wX2ZpZDIpOwogCi0JQ0RFQlVHKERfSU5PREUsICJMT09LVVBfSU5URU5UIHdpdGggZmlkMT0iREZJRCIsIGZpZDI9IkRGSUQKLQkgICAgICAgIiwgbmFtZT0nJXMnIC0+IG1kcyAjJWRcbiIsIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpLAotCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQyKSwKKwlDREVCVUcoRF9JTk9ERSwgIkxPT0tVUF9JTlRFTlQgd2l0aCBmaWQxPSIgREZJRCAiLCBmaWQyPSIgREZJRCAiLCBuYW1lPSclcycgLT4gbWRzICMldSBsc209JXAgbHNtX21hZ2ljPSV4XG4iLAorCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMiksCiAJICAgICAgIG9wX2RhdGEtPm9wX25hbWUgPyBvcF9kYXRhLT5vcF9uYW1lIDogIjxOVUxMPiIsCi0JICAgICAgIHRndC0+bHRkX2lkeCk7CisJICAgICAgIHRndC0+bHRkX2lkeCwgbHNtLCAhbHNtID8gLTEgOiBsc20tPmxzbV9tZF9tYWdpYyk7CiAKIAlvcF9kYXRhLT5vcF9iaWFzICY9IH5NRFNfQ1JPU1NfUkVGOwogCi0JcmMgPSBtZF9pbnRlbnRfbG9jayh0Z3QtPmx0ZF9leHAsIG9wX2RhdGEsIGxtbSwgbG1tc2l6ZSwgaXQsCi0JCQkgICAgZmxhZ3MsIHJlcXAsIGNiX2Jsb2NraW5nLCBleHRyYV9sb2NrX2ZsYWdzKTsKLQotCWlmIChyYyA8IDAgfHwgISpyZXFwKQorCXJjID0gbWRfaW50ZW50X2xvY2sodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBpdCwgcmVxcCwgY2JfYmxvY2tpbmcsCisJCQkgICAgZXh0cmFfbG9ja19mbGFncyk7CisJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCisJaWYgKCEqcmVxcCkgeworCQkvKgorCQkgKiBJZiBSUEMgaGFwcGVucywgbHNtIGluZm9ybWF0aW9uIHdpbGwgYmUgcmV2YWxpZGF0ZWQKKwkJICogZHVyaW5nIHVwZGF0ZV9pbm9kZSBwcm9jZXNzIChzZWUgbGxfdXBkYXRlX2xzbV9tZCkKKwkJICovCisJCWlmIChvcF9kYXRhLT5vcF9tZWEyKSB7CisJCQlyYyA9IGxtdl9yZXZhbGlkYXRlX3NsYXZlcyhleHAsIG9wX2RhdGEtPm9wX21lYTIsCisJCQkJCQkgICBjYl9ibG9ja2luZywKKwkJCQkJCSAgIGV4dHJhX2xvY2tfZmxhZ3MpOworCQkJaWYgKHJjICE9IDApCisJCQkJcmV0dXJuIHJjOworCQl9CisJCXJldHVybiByYzsKKwl9IGVsc2UgaWYgKGl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX0xPT0tVUF9ORUcpICYmIGxzbSAmJgorCQkgICBsbXZfbmVlZF90cnlfYWxsX3N0cmlwZXMobHNtKSkgeworCQkvKgorCQkgKiBGb3IgbWlncmF0aW5nIGFuZCB1bmtub3duIGhhc2ggdHlwZSBkaXJlY3RvcnksIGl0IHdpbGwKKwkJICogdHJ5IHRvIHRhcmdldCB0aGUgZW50cnkgb24gb3RoZXIgc3RyaXBlcworCQkgKi8KKwkJaW50IHN0cmlwZV9pbmRleDsKKworCQlmb3IgKHN0cmlwZV9pbmRleCA9IDE7CisJCSAgICAgc3RyaXBlX2luZGV4IDwgbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50ICYmCisJCSAgICAgaXRfZGlzcG9zaXRpb24oaXQsIERJU1BfTE9PS1VQX05FRyk7IHN0cmlwZV9pbmRleCsrKSB7CisJCQlzdHJ1Y3QgbG12X29pbmZvICpvaW5mbzsKKworCQkJLyogcmVsZWFzZSB0aGUgcHJldmlvdXMgcmVxdWVzdCAqLworCQkJcHRscnBjX3JlcV9maW5pc2hlZCgqcmVxcCk7CisJCQlpdC0+aXRfcmVxdWVzdCA9IE5VTEw7CisJCQkqcmVxcCA9IE5VTEw7CisKKwkJCW9pbmZvID0gJmxzbS0+bHNtX21kX29pbmZvW3N0cmlwZV9pbmRleF07CisJCQl0Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCAmb2luZm8tPmxtb19maWQpOworCQkJaWYgKElTX0VSUih0Z3QpKQorCQkJCXJldHVybiBQVFJfRVJSKHRndCk7CisKKwkJCUNERUJVRyhEX0lOT0RFLCAiVHJ5IG90aGVyIHN0cmlwZXMgIiBERklEIlxuIiwKKwkJCSAgICAgICBQRklEKCZvaW5mby0+bG1vX2ZpZCkpOworCisJCQlvcF9kYXRhLT5vcF9maWQxID0gb2luZm8tPmxtb19maWQ7CisJCQlpdC0+aXRfZGlzcG9zaXRpb24gJj0gfkRJU1BfRU5RX0NPTVBMRVRFOworCQkJcmMgPSBtZF9pbnRlbnRfbG9jayh0Z3QtPmx0ZF9leHAsIG9wX2RhdGEsIGl0LCByZXFwLAorCQkJCQkgICAgY2JfYmxvY2tpbmcsIGV4dHJhX2xvY2tfZmxhZ3MpOworCQkJaWYgKHJjKQorCQkJCXJldHVybiByYzsKKwkJfQorCX0KKwogCS8qCiAJICogTURTIGhhcyByZXR1cm5lZCBzdWNjZXNzLiBQcm9iYWJseSBuYW1lIGhhcyBiZWVuIHJlc29sdmVkIGluCiAJICogcmVtb3RlIGlub2RlLiBMZXQncyBjaGVjayB0aGlzLgpAQCAtMjc5LDE5ICs0NjEsMjMgQEAKIAlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmKCpyZXFwKS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CiAJaWYgKCFib2R5KQogCQlyZXR1cm4gLUVQUk9UTzsKLQkvKiBOb3QgY3Jvc3MtcmVmIGNhc2UsIGp1c3QgZ2V0IG91dCBvZiBoZXJlLiAqLwotCWlmIChsaWtlbHkoIShib2R5LT52YWxpZCAmIE9CRF9NRF9NRFMpKSkKLQkJcmV0dXJuIDA7CiAKLQlyYyA9IGxtdl9pbnRlbnRfcmVtb3RlKGV4cCwgbG1tLCBsbW1zaXplLCBpdCwgTlVMTCwgZmxhZ3MsIHJlcXAsCi0JCQkgICAgICAgY2JfYmxvY2tpbmcsIGV4dHJhX2xvY2tfZmxhZ3MpOworCS8qIE5vdCBjcm9zcy1yZWYgY2FzZSwganVzdCBnZXQgb3V0IG9mIGhlcmUuICovCisJaWYgKHVubGlrZWx5KChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfTURTKSkpIHsKKwkJcmMgPSBsbXZfaW50ZW50X3JlbW90ZShleHAsIGl0LCBOVUxMLCByZXFwLCBjYl9ibG9ja2luZywKKwkJCQkgICAgICAgZXh0cmFfbG9ja19mbGFncyk7CisJCWlmIChyYyAhPSAwKQorCQkJcmV0dXJuIHJjOworCQlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmKCpyZXFwKS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CisJCWlmICghYm9keSkKKwkJCXJldHVybiAtRVBST1RPOworCX0KIAogCXJldHVybiByYzsKIH0KIAogaW50IGxtdl9pbnRlbnRfbG9jayhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgIHZvaWQgKmxtbSwgaW50IGxtbXNpemUsIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwKLQkJICAgIGludCBmbGFncywgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxcCwKKwkJICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxcCwKIAkJICAgIGxkbG1fYmxvY2tpbmdfY2FsbGJhY2sgY2JfYmxvY2tpbmcsCiAJCSAgICBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKQogewpAQCAtMzAwLDggKzQ4Niw5IEBACiAKIAlMQVNTRVJUKGZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQxKSk7CiAKLQlDREVCVUcoRF9JTk9ERSwgIklOVEVOVCBMT0NLICclcycgZm9yICclKnMnIG9uICJERklEIlxuIiwKLQkgICAgICAgTExfSVQyU1RSKGl0KSwgb3BfZGF0YS0+b3BfbmFtZWxlbiwgb3BfZGF0YS0+b3BfbmFtZSwKKwlDREVCVUcoRF9JTk9ERSwgIklOVEVOVCBMT0NLICclcycgZm9yICJERklEIiAnJSpzJyBvbiAiREZJRCJcbiIsCisJICAgICAgIExMX0lUMlNUUihpdCksIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDIpLAorCSAgICAgICAoaW50KW9wX2RhdGEtPm9wX25hbWVsZW4sIG9wX2RhdGEtPm9wX25hbWUsCiAJICAgICAgIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpKTsKIAogCXJjID0gbG12X2NoZWNrX2Nvbm5lY3Qob2JkKTsKQEAgLTMwOSwxNCArNDk2LDM0IEBACiAJCXJldHVybiByYzsKIAogCWlmIChpdC0+aXRfb3AgJiAoSVRfTE9PS1VQIHwgSVRfR0VUQVRUUiB8IElUX0xBWU9VVCkpCi0JCXJjID0gbG12X2ludGVudF9sb29rdXAoZXhwLCBvcF9kYXRhLCBsbW0sIGxtbXNpemUsIGl0LAotCQkJCSAgICAgICBmbGFncywgcmVxcCwgY2JfYmxvY2tpbmcsCisJCXJjID0gbG12X2ludGVudF9sb29rdXAoZXhwLCBvcF9kYXRhLCBpdCwgcmVxcCwgY2JfYmxvY2tpbmcsCiAJCQkJICAgICAgIGV4dHJhX2xvY2tfZmxhZ3MpOwogCWVsc2UgaWYgKGl0LT5pdF9vcCAmIElUX09QRU4pCi0JCXJjID0gbG12X2ludGVudF9vcGVuKGV4cCwgb3BfZGF0YSwgbG1tLCBsbW1zaXplLCBpdCwKLQkJCQkgICAgIGZsYWdzLCByZXFwLCBjYl9ibG9ja2luZywKKwkJcmMgPSBsbXZfaW50ZW50X29wZW4oZXhwLCBvcF9kYXRhLCBpdCwgcmVxcCwgY2JfYmxvY2tpbmcsCiAJCQkJICAgICBleHRyYV9sb2NrX2ZsYWdzKTsKIAllbHNlCiAJCUxCVUcoKTsKKworCWlmIChyYyA8IDApIHsKKwkJc3RydWN0IGx1c3RyZV9oYW5kbGUgbG9ja19oYW5kbGU7CisKKwkJaWYgKGl0LT5pdF9sb2NrX21vZGUpIHsKKwkJCWxvY2tfaGFuZGxlLmNvb2tpZSA9IGl0LT5pdF9sb2NrX2hhbmRsZTsKKwkJCWxkbG1fbG9ja19kZWNyZWYoJmxvY2tfaGFuZGxlLCBpdC0+aXRfbG9ja19tb2RlKTsKKwkJfQorCisJCWl0LT5pdF9sb2NrX2hhbmRsZSA9IDA7CisJCWl0LT5pdF9sb2NrX21vZGUgPSAwOworCisJCWlmIChpdC0+aXRfcmVtb3RlX2xvY2tfbW9kZSkgeworCQkJbG9ja19oYW5kbGUuY29va2llID0gaXQtPml0X3JlbW90ZV9sb2NrX2hhbmRsZTsKKwkJCWxkbG1fbG9ja19kZWNyZWYoJmxvY2tfaGFuZGxlLAorCQkJCQkgaXQtPml0X3JlbW90ZV9sb2NrX21vZGUpOworCQl9CisKKwkJaXQtPml0X3JlbW90ZV9sb2NrX2hhbmRsZSA9IDA7CisJCWl0LT5pdF9yZW1vdGVfbG9ja19tb2RlID0gMDsKKwl9CisKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ludGVybmFsLmgKaW5kZXggMGJlYWZjNC4uNTJiMDM3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfaW50ZXJuYWwuaApAQCAtMzUsNiArMzUsNyBAQAogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lkbC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbG12LmgiCiAKICNkZWZpbmUgTE1WX01BWF9UR1RfQ09VTlQgMTI4CiAKQEAgLTQ0LDc3ICs0NSwxMTYgQEAKIGludCBsbXZfY2hlY2tfY29ubmVjdChzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkKTsKIAogaW50IGxtdl9pbnRlbnRfbG9jayhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgIHZvaWQgKmxtbSwgaW50IGxtbXNpemUsIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwKLQkJICAgIGludCBmbGFncywgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxcCwKKwkJICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxcCwKIAkJICAgIGxkbG1fYmxvY2tpbmdfY2FsbGJhY2sgY2JfYmxvY2tpbmcsCiAJCSAgICBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKTsKIAogaW50IGxtdl9mbGRfbG9va3VwKHN0cnVjdCBsbXZfb2JkICpsbXYsIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCwgdTMyICptZHMpOwogaW50IF9fbG12X2ZpZF9hbGxvYyhzdHJ1Y3QgbG12X29iZCAqbG12LCBzdHJ1Y3QgbHVfZmlkICpmaWQsIHUzMiBtZHMpOwotaW50IGxtdl9maWRfYWxsb2Moc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGx1X2ZpZCAqZmlkLAotCQkgIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKTsKK2ludCBsbXZfZmlkX2FsbG9jKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJICBzdHJ1Y3QgbHVfZmlkICpmaWQsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbG12X2dldF9tZWEoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCitpbnQgbG12X3VucGFja19tZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKmxzbXAsCisJCSAgY29uc3QgdW5pb24gbG12X21kc19tZCAqbG1tLCBpbnQgc3RyaXBlX2NvdW50KTsKKworaW50IGxtdl9yZXZhbGlkYXRlX3NsYXZlcyhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAorCQkJICBjb25zdCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtLAorCQkJICBsZGxtX2Jsb2NraW5nX2NhbGxiYWNrIGNiX2Jsb2NraW5nLAorCQkJICBpbnQgZXh0cmFfbG9ja19mbGFncyk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG9iZF9kZXZpY2UgKmxtdjJvYmRfZGV2KHN0cnVjdCBsbXZfb2JkICpsbXYpCiB7Ci0Jc3RydWN0IG1kdF9ib2R5CSAqYm9keTsKLQlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAgICAqbWVhOwotCi0JTEFTU0VSVChyZXEpOwotCi0JYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7Ci0KLQlpZiAoIWJvZHkgfHwgIVNfSVNESVIoYm9keS0+bW9kZSkgfHwgIWJvZHktPmVhZGF0YXNpemUpCi0JCXJldHVybiBOVUxMOwotCi0JbWVhID0gcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9NRCwKLQkJCQkJICAgYm9keS0+ZWFkYXRhc2l6ZSk7Ci0JaWYgKG1lYS0+bWVhX2NvdW50ID09IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChtZWEtPm1lYV9tYWdpYyAhPSBNRUFfTUFHSUNfTEFTVF9DSEFSICYmCi0JICAgIG1lYS0+bWVhX21hZ2ljICE9IE1FQV9NQUdJQ19BTExfQ0hBUlMgJiYKLQkgICAgbWVhLT5tZWFfbWFnaWMgIT0gTUVBX01BR0lDX0hBU0hfU0VHTUVOVCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gbWVhOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBsbXZfZ2V0X2Vhc2l6ZShzdHJ1Y3QgbG12X29iZCAqbG12KQotewotCXJldHVybiBzaXplb2Yoc3RydWN0IGxtdl9zdHJpcGVfbWQpICsKLQkJbG12LT5kZXNjLmxkX3RndF9jb3VudCAqCi0JCXNpemVvZihzdHJ1Y3QgbHVfZmlkKTsKKwlyZXR1cm4gY29udGFpbmVyX29mMChsbXYsIHN0cnVjdCBvYmRfZGV2aWNlLCB1Lmxtdik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGxtdl90Z3RfZGVzYyAqCi1sbXZfZ2V0X3RhcmdldChzdHJ1Y3QgbG12X29iZCAqbG12LCB1MzIgbWRzKQorbG12X2dldF90YXJnZXQoc3RydWN0IGxtdl9vYmQgKmxtdiwgdTMyIG1kdF9pZHgsIGludCAqaW5kZXgpCiB7Ci0JaW50IGNvdW50ID0gbG12LT5kZXNjLmxkX3RndF9jb3VudDsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGxtdi0+ZGVzYy5sZF90Z3RfY291bnQ7IGkrKykgewogCQlpZiAoIWxtdi0+dGd0c1tpXSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChsbXYtPnRndHNbaV0tPmx0ZF9pZHggPT0gbWRzKQorCQlpZiAobG12LT50Z3RzW2ldLT5sdGRfaWR4ID09IG1kdF9pZHgpIHsKKwkJCWlmIChpbmRleCkKKwkJCQkqaW5kZXggPSBpOwogCQkJcmV0dXJuIGxtdi0+dGd0c1tpXTsKKwkJfQogCX0KIAogCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwogfQogCitzdGF0aWMgaW5saW5lIGludAorbG12X2ZpbmRfdGFyZ2V0X2luZGV4KHN0cnVjdCBsbXZfb2JkICpsbXYsIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKK3sKKwlzdHJ1Y3QgbG12X3RndF9kZXNjICpsdGQ7CisJdTMyIG1kdF9pZHggPSAwOworCWludCBpbmRleCA9IDA7CisKKwlpZiAobG12LT5kZXNjLmxkX3RndF9jb3VudCA+IDEpIHsKKwkJaW50IHJjOworCisJCXJjID0gbG12X2ZsZF9sb29rdXAobG12LCBmaWQsICZtZHRfaWR4KTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwl9CisKKwlsdGQgPSBsbXZfZ2V0X3RhcmdldChsbXYsIG1kdF9pZHgsICZpbmRleCk7CisJaWYgKElTX0VSUihsdGQpKQorCQlyZXR1cm4gUFRSX0VSUihsdGQpOworCisJcmV0dXJuIGluZGV4OworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBsbXZfdGd0X2Rlc2MgKgogbG12X2ZpbmRfdGFyZ2V0KHN0cnVjdCBsbXZfb2JkICpsbXYsIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKIHsKLQl1MzIgbWRzID0gMDsKLQlpbnQgcmM7CisJaW50IGluZGV4OwogCi0JaWYgKGxtdi0+ZGVzYy5sZF90Z3RfY291bnQgPiAxKSB7Ci0JCXJjID0gbG12X2ZsZF9sb29rdXAobG12LCBmaWQsICZtZHMpOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gRVJSX1BUUihyYyk7Ci0JfQorCWluZGV4ID0gbG12X2ZpbmRfdGFyZ2V0X2luZGV4KGxtdiwgZmlkKTsKKwlpZiAoaW5kZXggPCAwKQorCQlyZXR1cm4gRVJSX1BUUihpbmRleCk7CiAKLQlyZXR1cm4gbG12X2dldF90YXJnZXQobG12LCBtZHMpOworCXJldHVybiBsbXYtPnRndHNbaW5kZXhdOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbXZfc3RyaXBlX21kX3NpemUoaW50IHN0cmlwZV9jb3VudCkKK3sKKwlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtOworCisJcmV0dXJuIHNpemVvZigqbHNtKSArIHN0cmlwZV9jb3VudCAqIHNpemVvZihsc20tPmxzbV9tZF9vaW5mb1swXSk7Cit9CisKK2ludCBsbXZfbmFtZV90b19zdHJpcGVfaW5kZXgoZW51bSBsbXZfaGFzaF90eXBlIGhhc2h0eXBlLAorCQkJICAgICB1bnNpZ25lZCBpbnQgbWF4X21kdF9pbmRleCwKKwkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOworCitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBsbXZfb2luZm8gKgorbHNtX25hbWVfdG9fc3RyaXBlX2luZm8oY29uc3Qgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCWludCBuYW1lbGVuKQoreworCWludCBzdHJpcGVfaW5kZXg7CisKKwlzdHJpcGVfaW5kZXggPSBsbXZfbmFtZV90b19zdHJpcGVfaW5kZXgobHNtLT5sc21fbWRfaGFzaF90eXBlLAorCQkJCQkJbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50LAorCQkJCQkJbmFtZSwgbmFtZWxlbik7CisJaWYgKHN0cmlwZV9pbmRleCA8IDApCisJCXJldHVybiBFUlJfUFRSKHN0cmlwZV9pbmRleCk7CisKKwlMQVNTRVJURihzdHJpcGVfaW5kZXggPCBsc20tPmxzbV9tZF9zdHJpcGVfY291bnQsCisJCSAic3RyaXBlX2luZGV4ID0gJWQsIHN0cmlwZV9jb3VudCA9ICVkIGhhc2hfdHlwZSA9ICV4IG5hbWUgPSAlLipzXG4iLAorCQkgc3RyaXBlX2luZGV4LCBsc20tPmxzbV9tZF9zdHJpcGVfY291bnQsCisJCSBsc20tPmxzbV9tZF9oYXNoX3R5cGUsIG5hbWVsZW4sIG5hbWUpOworCisJcmV0dXJuICZsc20tPmxzbV9tZF9vaW5mb1tzdHJpcGVfaW5kZXhdOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgbG12X25lZWRfdHJ5X2FsbF9zdHJpcGVzKGNvbnN0IHN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20pCit7CisJcmV0dXJuICFsbXZfaXNfa25vd25faGFzaF90eXBlKGxzbS0+bHNtX21kX2hhc2hfdHlwZSkgfHwKKwkgICAgICAgbHNtLT5sc21fbWRfaGFzaF90eXBlICYgTE1WX0hBU0hfRkxBR19NSUdSQVRJT047CiB9CiAKIHN0cnVjdCBsbXZfdGd0X2Rlc2MKQEAgLTEyMyw2ICsxNjMsNiBAQAogLyogbHByb2NfbG12LmMgKi8KIHZvaWQgbHByb2Nmc19sbXZfaW5pdF92YXJzKHN0cnVjdCBscHJvY2ZzX3N0YXRpY192YXJzICpsdmFycyk7CiAKLWV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxtdl9wcm9jX3RhcmdldF9mb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbG12X3Byb2NfdGFyZ2V0X2ZvcHM7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9vYmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfb2JkLmMKaW5kZXggMGUxNTg4YS4uN2RiYjJiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9vYmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X29iZC5jCkBAIC00MywxMiArNDMsMTMgQEAKIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pZGwuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9zdXBwb3J0LmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGliLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbmV0LmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfY2xhc3MuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9sbXYuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvY2xfb2JqZWN0LmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZmlkLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lvY3RsLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfa2VybmVsY29tbS5oIgogI2luY2x1ZGUgImxtdl9pbnRlcm5hbC5oIgogCkBAIC03MCwxMiArNzEsMTIgQEAKICAqICAtRU5PVENPTk46IFRoZSBVVUlEIGlzIGZvdW5kLCBidXQgdGhlIHRhcmdldCBjb25uZWN0aW9uIGlzIGJhZCAoISkKICAqICAtRUJBREYgICA6IFRoZSBVVUlEIGlzIGZvdW5kLCBidXQgdGhlIE9CRCBvZiB0aGUgd3JvbmcgdHlwZSAoISkKICAqLwotc3RhdGljIGludCBsbXZfc2V0X21kY19hY3RpdmUoc3RydWN0IGxtdl9vYmQgKmxtdiwgc3RydWN0IG9iZF91dWlkICp1dWlkLAorc3RhdGljIGludCBsbXZfc2V0X21kY19hY3RpdmUoc3RydWN0IGxtdl9vYmQgKmxtdiwgY29uc3Qgc3RydWN0IG9iZF91dWlkICp1dWlkLAogCQkJICAgICAgaW50IGFjdGl2YXRlKQogewogCXN0cnVjdCBsbXZfdGd0X2Rlc2MgICAgKnVuaW5pdGlhbGl6ZWRfdmFyKHRndCk7CiAJc3RydWN0IG9iZF9kZXZpY2UgICAgICAqb2JkOwotCWludAkJICAgICBpOworCXUzMgkJICAgICBpOwogCWludAkJICAgICByYyA9IDA7CiAKIAlDREVCVUcoRF9JTkZPLCAiU2VhcmNoaW5nIGluIGxtdiAlcCBmb3IgdXVpZCAlcyAoYWN0aXZhdGU9JWQpXG4iLApAQCAtMjQ0LDM2ICsyNDUsMTIgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIGxtdl9zZXRfdGltZW91dHMoc3RydWN0IG9iZF9kZXZpY2UgKm9iZCkKLXsKLQlzdHJ1Y3QgbG12X29iZAkqbG12OwotCWludAkJICAgIGk7Ci0KLQlsbXYgPSAmb2JkLT51LmxtdjsKLQlpZiAobG12LT5zZXJ2ZXJfdGltZW91dCA9PSAwKQotCQlyZXR1cm47Ci0KLQlpZiAobG12LT5jb25uZWN0ZWQgPT0gMCkKLQkJcmV0dXJuOwotCi0JZm9yIChpID0gMDsgaSA8IGxtdi0+ZGVzYy5sZF90Z3RfY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgbG12X3RndF9kZXNjICp0Z3QgPSBsbXYtPnRndHNbaV07Ci0KLQkJdGd0ID0gbG12LT50Z3RzW2ldOwotCQlpZiAoIXRndCB8fCAhdGd0LT5sdGRfZXhwIHx8ICF0Z3QtPmx0ZF9hY3RpdmUpCi0JCQljb250aW51ZTsKLQotCQlvYmRfc2V0X2luZm9fYXN5bmMoTlVMTCwgdGd0LT5sdGRfZXhwLCBzaXplb2YoS0VZX0lOVEVSTURTKSwKLQkJCQkgICBLRVlfSU5URVJNRFMsIDAsIE5VTEwsIE5VTEwpOwotCX0KLX0KLQotc3RhdGljIGludCBsbXZfaW5pdF9lYV9zaXplKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIGludCBlYXNpemUsCi0JCQkgICAgaW50IGRlZl9lYXNpemUsIGludCBjb29raWVzaXplLCBpbnQgZGVmX2Nvb2tpZXNpemUpCitzdGF0aWMgaW50IGxtdl9pbml0X2VhX3NpemUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgdTMyIGVhc2l6ZSwgdTMyIGRlZl9lYXNpemUsCisJCQkgICAgdTMyIGNvb2tpZXNpemUsIHUzMiBkZWZfY29va2llc2l6ZSkKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICpvYmQgPSBleHAtPmV4cF9vYmQ7CiAJc3RydWN0IGxtdl9vYmQgICAgICAqbG12ID0gJm9iZC0+dS5sbXY7Ci0JaW50CQkgIGk7CisJdTMyIGk7CiAJaW50CQkgIHJjID0gMDsKIAlpbnQJCSAgY2hhbmdlID0gMDsKIApAQCAtNDIwLDYgKzM5Nyw3IEBACiB7CiAJc3RydWN0IGxtdl9vYmQgICAgICAqbG12ID0gJm9iZC0+dS5sbXY7CiAJc3RydWN0IGxtdl90Z3RfZGVzYyAqdGd0OworCWludCBvcmlnX3RndF9jb3VudCA9IDA7CiAJaW50CQkgIHJjID0gMDsKIAogCUNERUJVRyhEX0NPTkZJRywgIlRhcmdldCB1dWlkOiAlcy4gaW5kZXggJWRcbiIsIHV1aWRwLT51dWlkLCBpbmRleCk7CkBAIC00ODksMTQgKzQ2NywxNyBAQAogCXRndC0+bHRkX3V1aWQgPSAqdXVpZHA7CiAJdGd0LT5sdGRfYWN0aXZlID0gMDsKIAlsbXYtPnRndHNbaW5kZXhdID0gdGd0OwotCWlmIChpbmRleCA+PSBsbXYtPmRlc2MubGRfdGd0X2NvdW50KQorCWlmIChpbmRleCA+PSBsbXYtPmRlc2MubGRfdGd0X2NvdW50KSB7CisJCW9yaWdfdGd0X2NvdW50ID0gbG12LT5kZXNjLmxkX3RndF9jb3VudDsKIAkJbG12LT5kZXNjLmxkX3RndF9jb3VudCA9IGluZGV4ICsgMTsKKwl9CiAKIAlpZiAobG12LT5jb25uZWN0ZWQpIHsKIAkJcmMgPSBsbXZfY29ubmVjdF9tZGMob2JkLCB0Z3QpOwogCQlpZiAocmMpIHsKIAkJCXNwaW5fbG9jaygmbG12LT5sbXZfbG9jayk7Ci0JCQlsbXYtPmRlc2MubGRfdGd0X2NvdW50LS07CisJCQlpZiAobG12LT5kZXNjLmxkX3RndF9jb3VudCA9PSBpbmRleCArIDEpCisJCQkJbG12LT5kZXNjLmxkX3RndF9jb3VudCA9IG9yaWdfdGd0X2NvdW50OwogCQkJbWVtc2V0KHRndCwgMCwgc2l6ZW9mKCp0Z3QpKTsKIAkJCXNwaW5fdW5sb2NrKCZsbXYtPmxtdl9sb2NrKTsKIAkJfSBlbHNlIHsKQEAgLTUxNCw3ICs0OTUsNyBAQAogewogCXN0cnVjdCBsbXZfb2JkICAgICAgICpsbXYgPSAmb2JkLT51LmxtdjsKIAlzdHJ1Y3QgbG12X3RndF9kZXNjICAqdGd0OwotCWludAkJICAgaTsKKwl1MzIgaTsKIAlpbnQJCSAgIHJjOwogCWludAkJICAgZWFzaXplOwogCkBAIC01NTQsMTAgKzUzNSw5IEBACiAJCQlnb3RvIG91dF9kaXNjOwogCX0KIAotCWxtdl9zZXRfdGltZW91dHMob2JkKTsKIAljbGFzc19leHBvcnRfcHV0KGxtdi0+ZXhwKTsKIAlsbXYtPmNvbm5lY3RlZCA9IDE7Ci0JZWFzaXplID0gbG12X2dldF9lYXNpemUobG12KTsKKwllYXNpemUgPSBsbXZfbWRzX21kX3NpemUobG12LT5kZXNjLmxkX3RndF9jb3VudCwgTE1WX01BR0lDKTsKIAlsbXZfaW5pdF9lYV9zaXplKG9iZC0+b2JkX3NlbGZfZXhwb3J0LCBlYXNpemUsIDAsIDAsIDApOwogCW11dGV4X3VubG9jaygmbG12LT5sbXZfaW5pdF9tdXRleCk7CiAJcmV0dXJuIDA7CkBAIC02MjksNyArNjA5LDcgQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICAgKm9iZCA9IGNsYXNzX2V4cDJvYmQoZXhwKTsKIAlzdHJ1Y3QgbG12X29iZAkqbG12ID0gJm9iZC0+dS5sbXY7CiAJaW50CQkgICAgcmM7Ci0JaW50CQkgICAgaTsKKwl1MzIgaTsKIAogCWlmICghbG12LT50Z3RzKQogCQlnb3RvIG91dF9sb2NhbDsKQEAgLTc1OCw3ICs3MzgsNyBAQAogCQkJICAgICBjb25zdCBzdHJ1Y3QgaHNtX3VzZXJfcmVxdWVzdCAqaHVyLAogCQkJICAgICBjb25zdCBzdHJ1Y3QgbG12X3RndF9kZXNjICp0Z3RfbWRzKQogewotCWludAkJCWksIG5yID0gMDsKKwl1MzIgaSwgbnIgPSAwOwogCXN0cnVjdCBsbXZfdGd0X2Rlc2MgICAgKmN1cnJfdGd0OwogCiAJLyogY291bnQgaG93IG1hbnkgcmVxdWVzdHMgbXVzdCBiZSBzZW50IHRvIHRoZSBnaXZlbiB0YXJnZXQgKi8KQEAgLTg4NSwxMCArODY1LDggQEAKIAogCXJjID0gbGliY2ZzX2trdWNfZ3JvdXBfYWRkKGZpbHAsIGxrLT5sa191aWQsIGxrLT5sa19ncm91cCwKIAkJCQkgICAma2NkLCBzaXplb2Yoa2NkKSk7Ci0JaWYgKHJjKSB7Ci0JCWlmIChmaWxwKQotCQkJZnB1dChmaWxwKTsKLQl9CisJaWYgKHJjKQorCQlmcHV0KGZpbHApOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtODk5LDEwICs4NzcsMTAgQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICAqb2JkZGV2ID0gY2xhc3NfZXhwMm9iZChleHApOwogCXN0cnVjdCBsbXZfb2JkICAgICAgICpsbXYgPSAmb2JkZGV2LT51LmxtdjsKIAlzdHJ1Y3QgbG12X3RndF9kZXNjICp0Z3QgPSBOVUxMOwotCWludAkJICAgaSA9IDA7CisJdTMyIGkgPSAwOwogCWludAkJICAgcmMgPSAwOwogCWludAkJICAgc2V0ID0gMDsKLQlpbnQJCSAgIGNvdW50ID0gbG12LT5kZXNjLmxkX3RndF9jb3VudDsKKwl1MzIgY291bnQgPSBsbXYtPmRlc2MubGRfdGd0X2NvdW50OwogCiAJaWYgKGNvdW50ID09IDApCiAJCXJldHVybiAtRU5PVFRZOwpAQCAtMTAxMSw2ICs5ODksMjEgQEAKIAkJcmMgPSBvYmRfaW9jb250cm9sKGNtZCwgdGd0LT5sdGRfZXhwLCBsZW4sIGthcmcsIHVhcmcpOwogCQlicmVhazsKIAl9CisJY2FzZSBMTF9JT0NfRklEMk1EVElEWDogeworCQlzdHJ1Y3QgbHVfZmlkICpmaWQgPSBrYXJnOworCQlpbnQgbWR0X2luZGV4OworCisJCXJjID0gbG12X2ZsZF9sb29rdXAobG12LCBmaWQsICZtZHRfaW5kZXgpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJLyoKKwkJICogTm90ZTogdGhpcyBpcyBmcm9tIGxsaXRlKHNlZSBsbF9kaXJfaW9jdGwoKSksIEB1YXJnIGRvZXMgbm90CisJCSAqIHBvaW50IHRvIHVzZXIgc3BhY2UgbWVtb3J5IGZvciBGSUQyTURUSURYLgorCQkgKi8KKwkJKihfX3UzMiAqKXVhcmcgPSBtZHRfaW5kZXg7CisJCWJyZWFrOworCX0KIAljYXNlIE9CRF9JT0NfRklEMlBBVEg6IHsKIAkJcmMgPSBsbXZfZmlkMnBhdGgoZXhwLCBsZW4sIGthcmcsIHVhcmcpOwogCQlicmVhazsKQEAgLTExNjksMzIgKzExNjIsMzcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJaWYgKG9wX2RhdGEtPm9wX2RlZmF1bHRfc3RyaXBlX29mZnNldCAhPSAtMSkgeworCQkqbWRzID0gb3BfZGF0YS0+b3BfZGVmYXVsdF9zdHJpcGVfb2Zmc2V0OworCQlyZXR1cm4gMDsKKwl9CisKIAkvKioKIAkgKiBJZiBzdHJpcGVfb2Zmc2V0IGlzIHByb3ZpZGVkIGR1cmluZyBzZXRkaXJzdHJpcGUKIAkgKiAoc2V0ZGlyc3RyaXBlIC1pIHh4KSwgeHggTURTIHdpbGwgYmUgY2hvc2VuLgogCSAqLwotCWlmIChvcF9kYXRhLT5vcF9jbGlfZmxhZ3MgJiBDTElfU0VUX01FQSkgeworCWlmIChvcF9kYXRhLT5vcF9jbGlfZmxhZ3MgJiBDTElfU0VUX01FQSAmJiBvcF9kYXRhLT5vcF9kYXRhKSB7CiAJCXN0cnVjdCBsbXZfdXNlcl9tZCAqbHVtOwogCi0JCWx1bSA9IChzdHJ1Y3QgbG12X3VzZXJfbWQgKilvcF9kYXRhLT5vcF9kYXRhOwotCQlpZiAobHVtLT5sdW1fdHlwZSA9PSBMTVZfU1RSSVBFX1RZUEUgJiYKLQkJICAgIGx1bS0+bHVtX3N0cmlwZV9vZmZzZXQgIT0gLTEpIHsKLQkJCWlmIChsdW0tPmx1bV9zdHJpcGVfb2Zmc2V0ID49IGxtdi0+ZGVzYy5sZF90Z3RfY291bnQpIHsKLQkJCQlDRVJST1IoIiVzOiBTdHJpcGVfb2Zmc2V0ICVkID4gTURUIGNvdW50ICVkOiByYyA9ICVkXG4iLAotCQkJCSAgICAgICBvYmQtPm9iZF9uYW1lLAotCQkJCSAgICAgICBsdW0tPmx1bV9zdHJpcGVfb2Zmc2V0LAotCQkJCSAgICAgICBsbXYtPmRlc2MubGRfdGd0X2NvdW50LCAtRVJBTkdFKTsKLQkJCQlyZXR1cm4gLUVSQU5HRTsKLQkJCX0KLQkJCSptZHMgPSBsdW0tPmx1bV9zdHJpcGVfb2Zmc2V0OwotCQkJcmV0dXJuIDA7CisJCWx1bSA9IG9wX2RhdGEtPm9wX2RhdGE7CisJCWlmIChsZTMyX3RvX2NwdShsdW0tPmx1bV9zdHJpcGVfb2Zmc2V0KSAhPSAoX191MzIpLTEpIHsKKwkJCSptZHMgPSBsZTMyX3RvX2NwdShsdW0tPmx1bV9zdHJpcGVfb2Zmc2V0KTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiAtMSBtZWFucyBkZWZhdWx0LCB3aGljaCB3aWxsIGJlIGluIHRoZSBzYW1lIE1EVCB3aXRoCisJCQkgKiB0aGUgc3RyaXBlCisJCQkgKi8KKwkJCSptZHMgPSBvcF9kYXRhLT5vcF9tZHM7CisJCQlsdW0tPmx1bV9zdHJpcGVfb2Zmc2V0ID0gY3B1X3RvX2xlMzIob3BfZGF0YS0+b3BfbWRzKTsKIAkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIEFsbG9jYXRlIG5ldyBmaWQgb24gdGFyZ2V0IGFjY29yZGluZyB0byBvcGVyYXRpb24gdHlwZSBhbmQKKwkJICogcGFyZW50IGhvbWUgbWRzLgorCQkgKi8KKwkJKm1kcyA9IG9wX2RhdGEtPm9wX21kczsKIAl9CiAKLQkvKiBBbGxvY2F0ZSBuZXcgZmlkIG9uIHRhcmdldCBhY2NvcmRpbmcgdG8gb3BlcmF0aW9uIHR5cGUgYW5kIHBhcmVudAotCSAqIGhvbWUgbWRzLgotCSAqLwotCSptZHMgPSBvcF9kYXRhLT5vcF9tZHM7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyMDMsNyArMTIwMSw3IEBACiAJc3RydWN0IGxtdl90Z3RfZGVzYwkqdGd0OwogCWludAkJCSByYzsKIAotCXRndCA9IGxtdl9nZXRfdGFyZ2V0KGxtdiwgbWRzKTsKKwl0Z3QgPSBsbXZfZ2V0X3RhcmdldChsbXYsIG1kcywgTlVMTCk7CiAJaWYgKElTX0VSUih0Z3QpKQogCQlyZXR1cm4gUFRSX0VSUih0Z3QpOwogCkBAIC0xMjIxLDcgKzEyMTksNyBAQAogCS8qCiAJICogQXNraW5nIHVuZGVybGF5aW5nIHRndCBsYXllciB0byBhbGxvY2F0ZSBuZXcgZmlkLgogCSAqLwotCXJjID0gb2JkX2ZpZF9hbGxvYyh0Z3QtPmx0ZF9leHAsIGZpZCwgTlVMTCk7CisJcmMgPSBvYmRfZmlkX2FsbG9jKE5VTEwsIHRndC0+bHRkX2V4cCwgZmlkLCBOVUxMKTsKIAlpZiAocmMgPiAwKSB7CiAJCUxBU1NFUlQoZmlkX2lzX3NhbmUoZmlkKSk7CiAJCXJjID0gMDsKQEAgLTEyMzIsOCArMTIzMCw4IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQgbG12X2ZpZF9hbGxvYyhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbHVfZmlkICpmaWQsCi0JCSAgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEpCitpbnQgbG12X2ZpZF9hbGxvYyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCSAgc3RydWN0IGx1X2ZpZCAqZmlkLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSkKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICAgKm9iZCA9IGNsYXNzX2V4cDJvYmQoZXhwKTsKIAlzdHJ1Y3QgbG12X29iZAkqbG12ID0gJm9iZC0+dS5sbXY7CkBAIC0xMjc4LDEwICsxMjc2LDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWxtdi0+dGd0cyA9IGtjYWxsb2MoMzIsIHNpemVvZigqbG12LT50Z3RzKSwgR0ZQX05PRlMpOworCWxtdi0+dGd0c19zaXplID0gMzJVOworCWxtdi0+dGd0cyA9IGtjYWxsb2MobG12LT50Z3RzX3NpemUsIHNpemVvZigqbG12LT50Z3RzKSwgR0ZQX05PRlMpOwogCWlmICghbG12LT50Z3RzKQogCQlyZXR1cm4gLUVOT01FTTsKLQlsbXYtPnRndHNfc2l6ZSA9IDMyOwogCiAJb2JkX3N0cjJ1dWlkKCZsbXYtPmRlc2MubGRfdXVpZCwgZGVzYy0+bGRfdXVpZC51dWlkKTsKIAlsbXYtPmRlc2MubGRfdGd0X2NvdW50ID0gMDsKQEAgLTEzNTQsNyArMTM1Miw3IEBACiAKIAkJb2JkX3N0cjJ1dWlkKCZvYmRfdXVpZCwgIGx1c3RyZV9jZmdfYnVmKGxjZmcsIDEpKTsKIAotCQlpZiAoc3NjYW5mKGx1c3RyZV9jZmdfYnVmKGxjZmcsIDIpLCAiJWQiLCAmaW5kZXgpICE9IDEpIHsKKwkJaWYgKHNzY2FuZihsdXN0cmVfY2ZnX2J1ZihsY2ZnLCAyKSwgIiV1IiwgJmluZGV4KSAhPSAxKSB7CiAJCQlyYyA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMTM4MCw3ICsxMzc4LDcgQEAKIAlzdHJ1Y3QgbG12X29iZAkqbG12ID0gJm9iZC0+dS5sbXY7CiAJc3RydWN0IG9iZF9zdGF0ZnMgICAgICp0ZW1wOwogCWludAkJICAgIHJjID0gMDsKLQlpbnQJCSAgICBpOworCXUzMiBpOwogCiAJcmMgPSBsbXZfY2hlY2tfY29ubmVjdChvYmQpOwogCWlmIChyYykKQEAgLTE1MjIsNyArMTUyMCw3IEBACiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgICAqb2JkID0gZXhwLT5leHBfb2JkOwogCXN0cnVjdCBsbXZfb2JkICAgICAgKmxtdiA9ICZvYmQtPnUubG12OwotCWludAkJICBpOworCXUzMiBpOwogCWludAkJICByYzsKIAogCXJjID0gbG12X2NoZWNrX2Nvbm5lY3Qob2JkKTsKQEAgLTE1NDUsMzYgKzE1NDMsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGxtdl9maW5kX2NiZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCi0JCQkgICBsZGxtX2l0ZXJhdG9yX3QgaXQsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG9iZF9kZXZpY2UgICAqb2JkID0gZXhwLT5leHBfb2JkOwotCXN0cnVjdCBsbXZfb2JkICAgICAgKmxtdiA9ICZvYmQtPnUubG12OwotCWludAkJICBpOwotCWludAkJICByYzsKLQotCXJjID0gbG12X2NoZWNrX2Nvbm5lY3Qob2JkKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCUNERUJVRyhEX0lOT0RFLCAiQ0JEQVRBIGZvciAiREZJRCJcbiIsIFBGSUQoZmlkKSk7Ci0KLQkvKgotCSAqIFdpdGggRE5FIGV2ZXJ5IG9iamVjdCBjYW4gaGF2ZSB0d28gbG9ja3MgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXM6Ci0JICogbG9va3VwIGxvY2sgaW4gc3BhY2Ugb2YgTURUIHN0b3JpbmcgZGlyZW50cnkgYW5kIHVwZGF0ZS9vcGVuIGxvY2sgaW4KLQkgKiBzcGFjZSBvZiBNRFQgc3RvcmluZyBpbm9kZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbG12LT5kZXNjLmxkX3RndF9jb3VudDsgaSsrKSB7Ci0JCWlmICghbG12LT50Z3RzW2ldIHx8ICFsbXYtPnRndHNbaV0tPmx0ZF9leHApCi0JCQljb250aW51ZTsKLQkJcmMgPSBtZF9maW5kX2NiZGF0YShsbXYtPnRndHNbaV0tPmx0ZF9leHAsIGZpZCwgaXQsIGRhdGEpOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW50IGxtdl9jbG9zZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKIAkJICAgICBzdHJ1Y3QgbWRfb3Blbl9kYXRhICptb2QsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpCiB7CkBAIC0xNTk2LDI1ICsxNTY0LDExNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RydWN0IGxtdl90Z3RfZGVzYwotKmxtdl9sb2NhdGVfbWRzKHN0cnVjdCBsbXZfb2JkICpsbXYsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQlzdHJ1Y3QgbHVfZmlkICpmaWQpCisvKioKKyAqIENob29zaW5nIHRoZSBNRFQgYnkgbmFtZSBvciBGSUQgaW4gQG9wX2RhdGEuCisgKiBGb3Igbm9uLXN0cmlwZWQgZGlyZWN0b3J5LCBpdCB3aWxsIGxvY2F0ZSBNRFQgYnkgZmlkLgorICogRm9yIHN0cmlwZWQtZGlyZWN0b3J5LCBpdCB3aWxsIGxvY2F0ZSBNRFQgYnkgbmFtZS4gQW5kIGFsc28KKyAqIGl0IHdpbGwgcmVzZXQgb3BfZmlkMSB3aXRoIHRoZSBGSUQgb2YgdGhlIGNob3NlbiBzdHJpcGUuCisgKiovCitzdGF0aWMgc3RydWN0IGxtdl90Z3RfZGVzYyAqCitsbXZfbG9jYXRlX3RhcmdldF9mb3JfbmFtZShzdHJ1Y3QgbG12X29iZCAqbG12LCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtLAorCQkJICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIHN0cnVjdCBsdV9maWQgKmZpZCwKKwkJCSAgIHUzMiAqbWRzKQogeworCWNvbnN0IHN0cnVjdCBsbXZfb2luZm8gKm9pbmZvOwogCXN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndDsKIAotCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsIGZpZCk7Ci0JaWYgKElTX0VSUih0Z3QpKQotCQlyZXR1cm4gdGd0OworCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MRlNDS19CQURfTkFNRV9IQVNIKSkgeworCQlpZiAoY2ZzX2ZhaWxfdmFsID49IGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudCkKKwkJCXJldHVybiBFUlJfUFRSKC1FQkFERik7CisJCW9pbmZvID0gJmxzbS0+bHNtX21kX29pbmZvW2Nmc19mYWlsX3ZhbF07CisJfSBlbHNlIHsKKwkJb2luZm8gPSBsc21fbmFtZV90b19zdHJpcGVfaW5mbyhsc20sIG5hbWUsIG5hbWVsZW4pOworCQlpZiAoSVNfRVJSKG9pbmZvKSkKKwkJCXJldHVybiBFUlJfQ0FTVChvaW5mbyk7CisJfQogCi0Jb3BfZGF0YS0+b3BfbWRzID0gdGd0LT5sdGRfaWR4OworCWlmIChmaWQpCisJCSpmaWQgPSBvaW5mby0+bG1vX2ZpZDsKKwlpZiAobWRzKQorCQkqbWRzID0gb2luZm8tPmxtb19tZHM7CiAKKwl0Z3QgPSBsbXZfZ2V0X3RhcmdldChsbXYsIG9pbmZvLT5sbW9fbWRzLCBOVUxMKTsKKworCUNERUJVRyhEX0lORk8sICJsb2NhdGUgb24gbWRzICV1ICIgREZJRCAiXG4iLCBvaW5mby0+bG1vX21kcywKKwkgICAgICAgUEZJRCgmb2luZm8tPmxtb19maWQpKTsKIAlyZXR1cm4gdGd0OwogfQogCisvKioKKyAqIExvY2F0ZSBtZHMgYnkgZmlkIG9yIG5hbWUKKyAqCisgKiBGb3Igc3RyaXBlZCBkaXJlY3RvcnkgKGxzbSAhPSBOVUxMKSwgaXQgd2lsbCBsb2NhdGUgdGhlIHN0cmlwZQorICogYnkgbmFtZSBoYXNoIChzZWUgbHNtX25hbWVfdG9fc3RyaXBlX2luZm8oKSkuIE5vdGU6IGlmIHRoZSBoYXNoX3R5cGUKKyAqIGlzIHVua25vd24sIGl0IHdpbGwgcmV0dXJuIC1FQkFERkQsIGFuZCBsbXZfaW50ZW50X2xvb2t1cCBtaWdodCBuZWVkCisgKiB3YWxrIHRocm91Z2ggYWxsIG9mIHN0cmlwZXMgdG8gbG9jYXRlIHRoZSBlbnRyeS4KKyAqCisgKiBGb3Igbm9ybWFsIGRpcmVjb3RyeSwgaXQgd2lsbCBsb2NhdGUgTURTIGJ5IEZJRCBkaXJlY3RseS4KKyAqIFxwYXJhbVtpbl0gbG12CUxNViBkZXZpY2UKKyAqIFxwYXJhbVtpbl0gb3BfZGF0YQljbGllbnQgTUQgc3RhY2sgcGFyYW1ldGVycywgbmFtZSwgbmFtZWxlbgorICoJCQltZHNfbnVtIGV0Yy4KKyAqIFxwYXJhbVtpbl0gZmlkCW9iamVjdCBGSUQgdXNlZCB0byBsb2NhdGUgTURTLgorICoKKyAqIHJldHZhbAkJcG9pbnRlciB0byB0aGUgbG12X3RndF9kZXNjIGlmIHN1Y2NlZWQuCisgKgkJCUVSUl9QVFIoZXJybm8pIGlmIGZhaWxlZC4KKyAqLworc3RydWN0IGxtdl90Z3RfZGVzYyoKK2xtdl9sb2NhdGVfbWRzKHN0cnVjdCBsbXZfb2JkICpsbXYsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAorCSAgICAgICBzdHJ1Y3QgbHVfZmlkICpmaWQpCit7CisJc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSA9IG9wX2RhdGEtPm9wX21lYTE7CisJc3RydWN0IGxtdl90Z3RfZGVzYyAqdGd0OworCisJLyoKKwkgKiBEdXJpbmcgY3JlYXRpbmcgVk9MQVRJTEUgZmlsZSwgaXQgc2hvdWxkIGhvbm9yIHRoZSBtZHQKKwkgKiBpbmRleCBpZiB0aGUgZmlsZSB1bmRlciBzdHJpcGVkIGRpciBpcyBiZWluZyByZXN0b3JlZCwgc2VlCisJICogY3RfcmVzdG9yZSgpLgorCSAqLworCWlmIChvcF9kYXRhLT5vcF9iaWFzICYgTURTX0NSRUFURV9WT0xBVElMRSAmJgorCSAgICAoaW50KW9wX2RhdGEtPm9wX21kcyAhPSAtMSAmJiBsc20pIHsKKwkJaW50IGk7CisKKwkJdGd0ID0gbG12X2dldF90YXJnZXQobG12LCBvcF9kYXRhLT5vcF9tZHMsIE5VTEwpOworCQlpZiAoSVNfRVJSKHRndCkpCisJCQlyZXR1cm4gdGd0OworCisJCS8qIHJlZmlsbCB0aGUgcmlnaHQgcGFyZW50IGZpZCAqLworCQlmb3IgKGkgPSAwOyBpIDwgbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50OyBpKyspIHsKKwkJCXN0cnVjdCBsbXZfb2luZm8gKm9pbmZvOworCisJCQlvaW5mbyA9ICZsc20tPmxzbV9tZF9vaW5mb1tpXTsKKwkJCWlmIChvaW5mby0+bG1vX21kcyA9PSBvcF9kYXRhLT5vcF9tZHMpIHsKKwkJCQkqZmlkID0gb2luZm8tPmxtb19maWQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBIbW0sIGNhbiBub3QgZmluZCB0aGUgc3RyaXBlIGJ5IG1kdF9pbmRleChvcF9tZHMpICovCisJCWlmIChpID09IGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudCkKKwkJCXRndCA9IEVSUl9QVFIoLUVJTlZBTCk7CisKKwkJcmV0dXJuIHRndDsKKwl9CisKKwlpZiAoIWxzbSB8fCAhb3BfZGF0YS0+b3BfbmFtZWxlbikgeworCQl0Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCBmaWQpOworCQlpZiAoSVNfRVJSKHRndCkpCisJCQlyZXR1cm4gdGd0OworCisJCW9wX2RhdGEtPm9wX21kcyA9IHRndC0+bHRkX2lkeDsKKworCQlyZXR1cm4gdGd0OworCX0KKworCXJldHVybiBsbXZfbG9jYXRlX3RhcmdldF9mb3JfbmFtZShsbXYsIGxzbSwgb3BfZGF0YS0+b3BfbmFtZSwKKwkJCQkJICBvcF9kYXRhLT5vcF9uYW1lbGVuLCBmaWQsCisJCQkJCSAgJm9wX2RhdGEtPm9wX21kcyk7Cit9CisKIHN0YXRpYyBpbnQgbG12X2NyZWF0ZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGRhdGFsZW4sIGludCBtb2RlLCBfX3UzMiB1aWQsCi0JCSAgICAgIF9fdTMyIGdpZCwgY2ZzX2NhcF90IGNhcF9lZmZlY3RpdmUsIF9fdTY0IHJkZXYsCi0JCSAgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpCisJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuLCB1bW9kZV90IG1vZGUsCisJCSAgICAgIHVpZF90IHVpZCwgZ2lkX3QgZ2lkLCBjZnNfY2FwX3QgY2FwX2VmZmVjdGl2ZSwKKwkJICAgICAgX191NjQgcmRldiwgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICAgICAqb2JkID0gZXhwLT5leHBfb2JkOwogCXN0cnVjdCBsbXZfb2JkCSAgKmxtdiA9ICZvYmQtPnUubG12OwpAQCAtMTYzMiwxMyArMTY5MSwzMCBAQAogCWlmIChJU19FUlIodGd0KSkKIAkJcmV0dXJuIFBUUl9FUlIodGd0KTsKIAotCXJjID0gbG12X2ZpZF9hbGxvYyhleHAsICZvcF9kYXRhLT5vcF9maWQyLCBvcF9kYXRhKTsKKwlDREVCVUcoRF9JTk9ERSwgIkNSRUFURSBuYW1lICclLipzJyBvbiAiREZJRCIgLT4gbWRzICMleFxuIiwKKwkgICAgICAgKGludClvcF9kYXRhLT5vcF9uYW1lbGVuLCBvcF9kYXRhLT5vcF9uYW1lLAorCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwgb3BfZGF0YS0+b3BfbWRzKTsKKworCXJjID0gbG12X2ZpZF9hbGxvYyhOVUxMLCBleHAsICZvcF9kYXRhLT5vcF9maWQyLCBvcF9kYXRhKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCUNERUJVRyhEX0lOT0RFLCAiQ1JFQVRFICclKnMnIG9uICJERklEIiAtPiBtZHMgIyV4XG4iLAotCSAgICAgICBvcF9kYXRhLT5vcF9uYW1lbGVuLCBvcF9kYXRhLT5vcF9uYW1lLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwKLQkgICAgICAgb3BfZGF0YS0+b3BfbWRzKTsKKwlpZiAoZXhwX2Nvbm5lY3RfZmxhZ3MoZXhwKSAmIE9CRF9DT05ORUNUX0RJUl9TVFJJUEUpIHsKKwkJLyoKKwkJICogU2VuZCB0aGUgY3JlYXRlIHJlcXVlc3QgdG8gdGhlIE1EVCB3aGVyZSB0aGUgb2JqZWN0CisJCSAqIHdpbGwgYmUgbG9jYXRlZAorCQkgKi8KKwkJdGd0ID0gbG12X2ZpbmRfdGFyZ2V0KGxtdiwgJm9wX2RhdGEtPm9wX2ZpZDIpOworCQlpZiAoSVNfRVJSKHRndCkpCisJCQlyZXR1cm4gUFRSX0VSUih0Z3QpOworCisJCW9wX2RhdGEtPm9wX21kcyA9IHRndC0+bHRkX2lkeDsKKwl9IGVsc2UgeworCQlDREVCVUcoRF9DT05GSUcsICJTZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IHN0cmlwZWQgZGlyc1xuIik7CisJfQorCisJQ0RFQlVHKERfSU5PREUsICJDUkVBVEUgb2JqICJERklEIiAtPiBtZHMgIyV4XG4iLAorCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwgb3BfZGF0YS0+b3BfbWRzKTsKIAogCW9wX2RhdGEtPm9wX2ZsYWdzIHw9IE1GX01EQ19DQU5DRUxfRklEMTsKIAlyYyA9IG1kX2NyZWF0ZSh0Z3QtPmx0ZF9leHAsIG9wX2RhdGEsIGRhdGEsIGRhdGFsZW4sIG1vZGUsIHVpZCwgZ2lkLApAQCAtMTY3NCw3MCArMTc1MCwxMCBAQAogfQogCiBzdGF0aWMgaW50Ci1sbXZfZW5xdWV1ZV9yZW1vdGUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvICplaW5mbywKLQkJICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxvY2toLCB2b2lkICpsbW0sIGludCBsbW1zaXplLAotCQkgICBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKQotewotCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAgICAgICpyZXEgPSBpdC0+aXRfcmVxdWVzdDsKLQlzdHJ1Y3Qgb2JkX2RldmljZQkgICpvYmQgPSBleHAtPmV4cF9vYmQ7Ci0Jc3RydWN0IGxtdl9vYmQJICAgICAqbG12ID0gJm9iZC0+dS5sbXY7Ci0Jc3RydWN0IGx1c3RyZV9oYW5kbGUJcGxvY2s7Ci0Jc3RydWN0IGxtdl90Z3RfZGVzYwkqdGd0OwotCXN0cnVjdCBtZF9vcF9kYXRhCSAgKnJkYXRhOwotCXN0cnVjdCBsdV9maWQJICAgICAgIGZpZDE7Ci0Jc3RydWN0IG1kdF9ib2R5CSAgICAqYm9keTsKLQlpbnQJCQkgcmMgPSAwOwotCWludAkJCSBwbW9kZTsKLQotCWJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOwotCi0JaWYgKCEoYm9keS0+dmFsaWQgJiBPQkRfTURfTURTKSkKLQkJcmV0dXJuIDA7Ci0KLQlDREVCVUcoRF9JTk9ERSwgIlJFTU9URV9FTlFVRVVFICclcycgb24gIkRGSUQiIC0+ICJERklEIlxuIiwKLQkgICAgICAgTExfSVQyU1RSKGl0KSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksIFBGSUQoJmJvZHktPmZpZDEpKTsKLQotCS8qCi0JICogV2UgZ290IExPT0tVUCBsb2NrLCBidXQgd2UgcmVhbGx5IG5lZWQgYXR0cnMuCi0JICovCi0JcG1vZGUgPSBpdC0+aXRfbG9ja19tb2RlOwotCUxBU1NFUlQocG1vZGUgIT0gMCk7Ci0JbWVtY3B5KCZwbG9jaywgbG9ja2gsIHNpemVvZihwbG9jaykpOwotCWl0LT5pdF9sb2NrX21vZGUgPSAwOwotCWl0LT5pdF9yZXF1ZXN0ID0gTlVMTDsKLQlmaWQxID0gYm9keS0+ZmlkMTsKLQotCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKLQotCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsICZmaWQxKTsKLQlpZiAoSVNfRVJSKHRndCkpIHsKLQkJcmMgPSBQVFJfRVJSKHRndCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJkYXRhID0ga3phbGxvYyhzaXplb2YoKnJkYXRhKSwgR0ZQX05PRlMpOwotCWlmICghcmRhdGEpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyZGF0YS0+b3BfZmlkMSA9IGZpZDE7Ci0JcmRhdGEtPm9wX2JpYXMgPSBNRFNfQ1JPU1NfUkVGOwotCi0JcmMgPSBtZF9lbnF1ZXVlKHRndC0+bHRkX2V4cCwgZWluZm8sIGl0LCByZGF0YSwgbG9ja2gsCi0JCQlsbW0sIGxtbXNpemUsIE5VTEwsIGV4dHJhX2xvY2tfZmxhZ3MpOwotCWtmcmVlKHJkYXRhKTsKLW91dDoKLQlsZGxtX2xvY2tfZGVjcmVmKCZwbG9jaywgcG1vZGUpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludAogbG12X2VucXVldWUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvICplaW5mbywKKwkgICAgY29uc3QgbGRsbV9wb2xpY3lfZGF0YV90ICpwb2xpY3ksCiAJICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JICAgIHN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCwgdm9pZCAqbG1tLCBpbnQgbG1tc2l6ZSwKLQkgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxLCBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKQorCSAgICBzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqbG9ja2gsIF9fdTY0IGV4dHJhX2xvY2tfZmxhZ3MpCiB7CiAJc3RydWN0IG9iZF9kZXZpY2UJKm9iZCA9IGV4cC0+ZXhwX29iZDsKIAlzdHJ1Y3QgbG12X29iZAkgICAqbG12ID0gJm9iZC0+dS5sbXY7CkBAIC0xNzU1LDIyICsxNzcxLDE4IEBACiAJaWYgKElTX0VSUih0Z3QpKQogCQlyZXR1cm4gUFRSX0VSUih0Z3QpOwogCi0JQ0RFQlVHKERfSU5PREUsICJFTlFVRVVFICclcycgb24gIkRGSUQiIC0+IG1kcyAjJWRcbiIsCisJQ0RFQlVHKERfSU5PREUsICJFTlFVRVVFICclcycgb24gIiBERklEICIgLT4gbWRzICMldVxuIiwKIAkgICAgICAgTExfSVQyU1RSKGl0KSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksIHRndC0+bHRkX2lkeCk7CiAKLQlyYyA9IG1kX2VucXVldWUodGd0LT5sdGRfZXhwLCBlaW5mbywgaXQsIG9wX2RhdGEsIGxvY2toLAotCQkJbG1tLCBsbW1zaXplLCByZXEsIGV4dHJhX2xvY2tfZmxhZ3MpOworCXJjID0gbWRfZW5xdWV1ZSh0Z3QtPmx0ZF9leHAsIGVpbmZvLCBwb2xpY3ksIGl0LCBvcF9kYXRhLCBsb2NraCwKKwkJCWV4dHJhX2xvY2tfZmxhZ3MpOwogCi0JaWYgKHJjID09IDAgJiYgaXQgJiYgaXQtPml0X29wID09IElUX09QRU4pIHsKLQkJcmMgPSBsbXZfZW5xdWV1ZV9yZW1vdGUoZXhwLCBlaW5mbywgaXQsIG9wX2RhdGEsIGxvY2toLAotCQkJCQlsbW0sIGxtbXNpemUsIGV4dHJhX2xvY2tfZmxhZ3MpOwotCX0KIAlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQKIGxtdl9nZXRhdHRyX25hbWUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCSBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQorCQkgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcHJlcSkKIHsKIAlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgICAqcmVxID0gTlVMTDsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICAgICAqb2JkID0gZXhwLT5leHBfb2JkOwpAQCAtMTc4NywyNiArMTc5OSwyNSBAQAogCWlmIChJU19FUlIodGd0KSkKIAkJcmV0dXJuIFBUUl9FUlIodGd0KTsKIAotCUNERUJVRyhEX0lOT0RFLCAiR0VUQVRUUl9OQU1FIGZvciAlKnMgb24gIkRGSUQiIC0+IG1kcyAjJWRcbiIsCi0JICAgICAgIG9wX2RhdGEtPm9wX25hbWVsZW4sIG9wX2RhdGEtPm9wX25hbWUsIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpLAotCSAgICAgICB0Z3QtPmx0ZF9pZHgpOworCUNERUJVRyhEX0lOT0RFLCAiR0VUQVRUUl9OQU1FIGZvciAlKnMgb24gIiBERklEICIgLT4gbWRzICMldVxuIiwKKwkgICAgICAgKGludClvcF9kYXRhLT5vcF9uYW1lbGVuLCBvcF9kYXRhLT5vcF9uYW1lLAorCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwgdGd0LT5sdGRfaWR4KTsKIAotCXJjID0gbWRfZ2V0YXR0cl9uYW1lKHRndC0+bHRkX2V4cCwgb3BfZGF0YSwgcmVxdWVzdCk7CisJcmMgPSBtZF9nZXRhdHRyX25hbWUodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBwcmVxKTsKIAlpZiAocmMgIT0gMCkKIAkJcmV0dXJuIHJjOwogCi0JYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJigqcmVxdWVzdCktPnJxX3BpbGwsCi0JCQkJICAgICAgJlJNRl9NRFRfQk9EWSk7Ci0KLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfTURTKSB7Ci0JCXN0cnVjdCBsdV9maWQgcmlkID0gYm9keS0+ZmlkMTsKKwlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmKCpwcmVxKS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9NRFMpIHsKKwkJc3RydWN0IGx1X2ZpZCByaWQgPSBib2R5LT5tYm9fZmlkMTsKIAogCQlDREVCVUcoRF9JTk9ERSwgIlJlcXVlc3QgYXR0cnMgZm9yICJERklEIlxuIiwKIAkJICAgICAgIFBGSUQoJnJpZCkpOwogCiAJCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsICZyaWQpOwogCQlpZiAoSVNfRVJSKHRndCkpIHsKLQkJCXB0bHJwY19yZXFfZmluaXNoZWQoKnJlcXVlc3QpOworCQkJcHRscnBjX3JlcV9maW5pc2hlZCgqcHJlcSk7CisJCQkqcHJlcSA9IE5VTEw7CiAJCQlyZXR1cm4gUFRSX0VSUih0Z3QpOwogCQl9CiAKQEAgLTE4MTUsOCArMTgyNiw4IEBACiAJCW9wX2RhdGEtPm9wX25hbWVsZW4gPSAwOwogCQlvcF9kYXRhLT5vcF9uYW1lID0gTlVMTDsKIAkJcmMgPSBtZF9nZXRhdHRyX25hbWUodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCAmcmVxKTsKLQkJcHRscnBjX3JlcV9maW5pc2hlZCgqcmVxdWVzdCk7Ci0JCSpyZXF1ZXN0ID0gcmVxOworCQlwdGxycGNfcmVxX2ZpbmlzaGVkKCpwcmVxKTsKKwkJKnByZXEgPSByZXE7CiAJfQogCiAJcmV0dXJuIHJjOwpAQCAtMTgyOSwyMyArMTg0MCwyNCBAQAogCSBmbCA9PSBNRl9NRENfQ0FOQ0VMX0ZJRDQgPyAmb3BfZGF0YS0+b3BfZmlkNCA6IFwKIAkgTlVMTCkKIAotc3RhdGljIGludCBsbXZfZWFybHlfY2FuY2VsKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkJICAgIGludCBvcF90Z3QsIGVudW0gbGRsbV9tb2RlIG1vZGUsIGludCBiaXRzLAotCQkJICAgIGludCBmbGFnKQorc3RhdGljIGludCBsbXZfZWFybHlfY2FuY2VsKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndCwKKwkJCSAgICBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwgaW50IG9wX3RndCwKKwkJCSAgICBlbnVtIGxkbG1fbW9kZSBtb2RlLCBpbnQgYml0cywgaW50IGZsYWcpCiB7CiAJc3RydWN0IGx1X2ZpZAkgICpmaWQgPSBtZF9vcF9kYXRhX2ZpZChvcF9kYXRhLCBmbGFnKTsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICAgICpvYmQgPSBleHAtPmV4cF9vYmQ7CiAJc3RydWN0IGxtdl9vYmQJICpsbXYgPSAmb2JkLT51LmxtdjsKLQlzdHJ1Y3QgbG12X3RndF9kZXNjICAgICp0Z3Q7CiAJbGRsbV9wb2xpY3lfZGF0YV90ICAgICAgcG9saWN5ID0geyB7MH0gfTsKIAlpbnQJCSAgICAgcmMgPSAwOwogCiAJaWYgKCFmaWRfaXNfc2FuZShmaWQpKQogCQlyZXR1cm4gMDsKIAotCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsIGZpZCk7Ci0JaWYgKElTX0VSUih0Z3QpKQotCQlyZXR1cm4gUFRSX0VSUih0Z3QpOworCWlmICghdGd0KSB7CisJCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsIGZpZCk7CisJCWlmIChJU19FUlIodGd0KSkKKwkJCXJldHVybiBQVFJfRVJSKHRndCk7CisJfQogCiAJaWYgKHRndC0+bHRkX2lkeCAhPSBvcF90Z3QpIHsKIAkJQ0RFQlVHKERfSU5PREUsICJFQVJMWV9DQU5DRUwgb24gIkRGSUQiXG4iLCBQRklEKGZpZCkpOwpAQCAtMTg4MiwxMiArMTg5NCwyNCBAQAogCUxBU1NFUlQob3BfZGF0YS0+b3BfbmFtZWxlbiAhPSAwKTsKIAogCUNERUJVRyhEX0lOT0RFLCAiTElOSyAiREZJRCI6JSpzIHRvICJERklEIlxuIiwKLQkgICAgICAgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMiksIG9wX2RhdGEtPm9wX25hbWVsZW4sCisJICAgICAgIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDIpLCAoaW50KW9wX2RhdGEtPm9wX25hbWVsZW4sCiAJICAgICAgIG9wX2RhdGEtPm9wX25hbWUsIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpKTsKIAogCW9wX2RhdGEtPm9wX2ZzdWlkID0gZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfZnN1aWQoKSk7CiAJb3BfZGF0YS0+b3BfZnNnaWQgPSBmcm9tX2tnaWQoJmluaXRfdXNlcl9ucywgY3VycmVudF9mc2dpZCgpKTsKIAlvcF9kYXRhLT5vcF9jYXAgPSBjZnNfY3VycHJvY19jYXBfcGFjaygpOworCWlmIChvcF9kYXRhLT5vcF9tZWEyKSB7CisJCXN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20gPSBvcF9kYXRhLT5vcF9tZWEyOworCQljb25zdCBzdHJ1Y3QgbG12X29pbmZvICpvaW5mbzsKKworCQlvaW5mbyA9IGxzbV9uYW1lX3RvX3N0cmlwZV9pbmZvKGxzbSwgb3BfZGF0YS0+b3BfbmFtZSwKKwkJCQkJCW9wX2RhdGEtPm9wX25hbWVsZW4pOworCQlpZiAoSVNfRVJSKG9pbmZvKSkKKwkJCXJldHVybiBQVFJfRVJSKG9pbmZvKTsKKworCQlvcF9kYXRhLT5vcF9maWQyID0gb2luZm8tPmxtb19maWQ7CisJfQorCiAJdGd0ID0gbG12X2xvY2F0ZV9tZHMobG12LCBvcF9kYXRhLCAmb3BfZGF0YS0+b3BfZmlkMik7CiAJaWYgKElTX0VSUih0Z3QpKQogCQlyZXR1cm4gUFRSX0VSUih0Z3QpOwpAQCAtMTg5Niw3ICsxOTIwLDcgQEAKIAkgKiBDYW5jZWwgVVBEQVRFIGxvY2sgb24gY2hpbGQgKGZpZDEpLgogCSAqLwogCW9wX2RhdGEtPm9wX2ZsYWdzIHw9IE1GX01EQ19DQU5DRUxfRklEMjsKLQlyYyA9IGxtdl9lYXJseV9jYW5jZWwoZXhwLCBvcF9kYXRhLCB0Z3QtPmx0ZF9pZHgsIExDS19FWCwKKwlyYyA9IGxtdl9lYXJseV9jYW5jZWwoZXhwLCBOVUxMLCBvcF9kYXRhLCB0Z3QtPmx0ZF9pZHgsIExDS19FWCwKIAkJCSAgICAgIE1EU19JTk9ERUxPQ0tfVVBEQVRFLCBNRl9NRENfQ0FOQ0VMX0ZJRDEpOwogCWlmIChyYyAhPSAwKQogCQlyZXR1cm4gcmM7CkBAIC0xOTA3LDIwICsxOTMxLDIyIEBACiB9CiAKIHN0YXRpYyBpbnQgbG12X3JlbmFtZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgICAgY29uc3QgY2hhciAqb2xkLCBpbnQgb2xkbGVuLCBjb25zdCBjaGFyICpuZXcsIGludCBuZXdsZW4sCisJCSAgICAgIGNvbnN0IGNoYXIgKm9sZCwgc2l6ZV90IG9sZGxlbiwKKwkJICAgICAgY29uc3QgY2hhciAqbmV3LCBzaXplX3QgbmV3bGVuLAogCQkgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQogewogCXN0cnVjdCBvYmRfZGV2aWNlICAgICAgICpvYmQgPSBleHAtPmV4cF9vYmQ7CiAJc3RydWN0IGxtdl9vYmQJICAqbG12ID0gJm9iZC0+dS5sbXY7CiAJc3RydWN0IGxtdl90Z3RfZGVzYyAgICAgKnNyY190Z3Q7Ci0Jc3RydWN0IGxtdl90Z3RfZGVzYyAgICAgKnRndF90Z3Q7CiAJaW50CQkJcmM7CiAKIAlMQVNTRVJUKG9sZGxlbiAhPSAwKTsKIAotCUNERUJVRyhEX0lOT0RFLCAiUkVOQU1FICUqcyBpbiAiREZJRCIgdG8gJSpzIGluICJERklEIlxuIiwKLQkgICAgICAgb2xkbGVuLCBvbGQsIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpLAotCSAgICAgICBuZXdsZW4sIG5ldywgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMikpOworCUNERUJVRyhEX0lOT0RFLCAiUkVOQU1FICUuKnMgaW4gIkRGSUQiOiVkIHRvICUuKnMgaW4gIkRGSUQiOiVkXG4iLAorCSAgICAgICAoaW50KW9sZGxlbiwgb2xkLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwKKwkgICAgICAgb3BfZGF0YS0+b3BfbWVhMSA/IG9wX2RhdGEtPm9wX21lYTEtPmxzbV9tZF9zdHJpcGVfY291bnQgOiAwLAorCSAgICAgICAoaW50KW5ld2xlbiwgbmV3LCBQRklEKCZvcF9kYXRhLT5vcF9maWQyKSwKKwkgICAgICAgb3BfZGF0YS0+b3BfbWVhMiA/IG9wX2RhdGEtPm9wX21lYTItPmxzbV9tZF9zdHJpcGVfY291bnQgOiAwKTsKIAogCXJjID0gbG12X2NoZWNrX2Nvbm5lY3Qob2JkKTsKIAlpZiAocmMpCkBAIC0xOTI5LDEzICsxOTU1LDYwIEBACiAJb3BfZGF0YS0+b3BfZnN1aWQgPSBmcm9tX2t1aWQoJmluaXRfdXNlcl9ucywgY3VycmVudF9mc3VpZCgpKTsKIAlvcF9kYXRhLT5vcF9mc2dpZCA9IGZyb21fa2dpZCgmaW5pdF91c2VyX25zLCBjdXJyZW50X2ZzZ2lkKCkpOwogCW9wX2RhdGEtPm9wX2NhcCA9IGNmc19jdXJwcm9jX2NhcF9wYWNrKCk7Ci0Jc3JjX3RndCA9IGxtdl9sb2NhdGVfbWRzKGxtdiwgb3BfZGF0YSwgJm9wX2RhdGEtPm9wX2ZpZDEpOworCisJaWYgKG9wX2RhdGEtPm9wX2NsaV9mbGFncyAmIENMSV9NSUdSQVRFKSB7CisJCUxBU1NFUlRGKGZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQzKSwgImludmFsaWQgRklEICJERklEIlxuIiwKKwkJCSBQRklEKCZvcF9kYXRhLT5vcF9maWQzKSk7CisKKwkJaWYgKG9wX2RhdGEtPm9wX21lYTEpIHsKKwkJCXN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20gPSBvcF9kYXRhLT5vcF9tZWExOworCQkJc3RydWN0IGxtdl90Z3RfZGVzYyAqdG1wOworCisJCQkvKiBGaXggdGhlIHBhcmVudCBmaWQgZm9yIHN0cmlwZWQgZGlyICovCisJCQl0bXAgPSBsbXZfbG9jYXRlX3RhcmdldF9mb3JfbmFtZShsbXYsIGxzbSwgb2xkLAorCQkJCQkJCSBvbGRsZW4sCisJCQkJCQkJICZvcF9kYXRhLT5vcF9maWQxLAorCQkJCQkJCSBOVUxMKTsKKwkJCWlmIChJU19FUlIodG1wKSkKKwkJCQlyZXR1cm4gUFRSX0VSUih0bXApOworCQl9CisKKwkJcmMgPSBsbXZfZmlkX2FsbG9jKE5VTEwsIGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDIsIG9wX2RhdGEpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJCXNyY190Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCAmb3BfZGF0YS0+b3BfZmlkMyk7CisJfSBlbHNlIHsKKwkJaWYgKG9wX2RhdGEtPm9wX21lYTEpIHsKKwkJCXN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20gPSBvcF9kYXRhLT5vcF9tZWExOworCisJCQlzcmNfdGd0ID0gbG12X2xvY2F0ZV90YXJnZXRfZm9yX25hbWUobG12LCBsc20sIG9sZCwKKwkJCQkJCQkgICAgIG9sZGxlbiwKKwkJCQkJCQkgICAgICZvcF9kYXRhLT5vcF9maWQxLAorCQkJCQkJCSAgICAgJm9wX2RhdGEtPm9wX21kcyk7CisJCQlpZiAoSVNfRVJSKHNyY190Z3QpKQorCQkJCXJldHVybiBQVFJfRVJSKHNyY190Z3QpOworCQl9IGVsc2UgeworCQkJc3JjX3RndCA9IGxtdl9maW5kX3RhcmdldChsbXYsICZvcF9kYXRhLT5vcF9maWQxKTsKKwkJCWlmIChJU19FUlIoc3JjX3RndCkpCisJCQkJcmV0dXJuIFBUUl9FUlIoc3JjX3RndCk7CisKKwkJCW9wX2RhdGEtPm9wX21kcyA9IHNyY190Z3QtPmx0ZF9pZHg7CisJCX0KKworCQlpZiAob3BfZGF0YS0+b3BfbWVhMikgeworCQkJc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSA9IG9wX2RhdGEtPm9wX21lYTI7CisJCQljb25zdCBzdHJ1Y3QgbG12X29pbmZvICpvaW5mbzsKKworCQkJb2luZm8gPSBsc21fbmFtZV90b19zdHJpcGVfaW5mbyhsc20sIG5ldywgbmV3bGVuKTsKKwkJCWlmIChJU19FUlIob2luZm8pKQorCQkJCXJldHVybiBQVFJfRVJSKG9pbmZvKTsKKworCQkJb3BfZGF0YS0+b3BfZmlkMiA9IG9pbmZvLT5sbW9fZmlkOworCQl9CisJfQogCWlmIChJU19FUlIoc3JjX3RndCkpCiAJCXJldHVybiBQVFJfRVJSKHNyY190Z3QpOwogCi0JdGd0X3RndCA9IGxtdl9sb2NhdGVfbWRzKGxtdiwgb3BfZGF0YSwgJm9wX2RhdGEtPm9wX2ZpZDIpOwotCWlmIChJU19FUlIodGd0X3RndCkpCi0JCXJldHVybiBQVFJfRVJSKHRndF90Z3QpOwogCS8qCiAJICogTE9PS1VQIGxvY2sgb24gc3JjIGNoaWxkIChmaWQzKSBzaG91bGQgYWxzbyBiZSBjYW5jZWxsZWQgZm9yCiAJICogc3JjX3RndCBpbiBtZGNfcmVuYW1lLgpAQCAtMTk0NiwzNSArMjAxOSw1MyBAQAogCSAqIENhbmNlbCBVUERBVEUgbG9ja3Mgb24gdGd0IHBhcmVudCAoZmlkMiksIHRndF90Z3QgaXMgaXRzCiAJICogb3duIHRhcmdldC4KIAkgKi8KLQlyYyA9IGxtdl9lYXJseV9jYW5jZWwoZXhwLCBvcF9kYXRhLCBzcmNfdGd0LT5sdGRfaWR4LAorCXJjID0gbG12X2Vhcmx5X2NhbmNlbChleHAsIE5VTEwsIG9wX2RhdGEsIHNyY190Z3QtPmx0ZF9pZHgsCiAJCQkgICAgICBMQ0tfRVgsIE1EU19JTk9ERUxPQ0tfVVBEQVRFLAogCQkJICAgICAgTUZfTURDX0NBTkNFTF9GSUQyKTsKLQorCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCS8qCi0JICogQ2FuY2VsIExPT0tVUCBsb2NrcyBvbiB0Z3QgY2hpbGQgKGZpZDQpIGZvciBwYXJlbnQgdGd0X3RndC4KKwkgKiBDYW5jZWwgTE9PS1VQIGxvY2tzIG9uIHNvdXJjZSBjaGlsZCAoZmlkMykgZm9yIHBhcmVudCB0Z3RfdGd0LgogCSAqLwotCWlmIChyYyA9PSAwKSB7Ci0JCXJjID0gbG12X2Vhcmx5X2NhbmNlbChleHAsIG9wX2RhdGEsIHNyY190Z3QtPmx0ZF9pZHgsCisJaWYgKGZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQzKSkgeworCQlzdHJ1Y3QgbG12X3RndF9kZXNjICp0Z3Q7CisKKwkJdGd0ID0gbG12X2ZpbmRfdGFyZ2V0KGxtdiwgJm9wX2RhdGEtPm9wX2ZpZDEpOworCQlpZiAoSVNfRVJSKHRndCkpCisJCQlyZXR1cm4gUFRSX0VSUih0Z3QpOworCisJCS8qIENhbmNlbCBMT09LVVAgbG9jayBvbiBpdHMgcGFyZW50ICovCisJCXJjID0gbG12X2Vhcmx5X2NhbmNlbChleHAsIHRndCwgb3BfZGF0YSwgc3JjX3RndC0+bHRkX2lkeCwKIAkJCQkgICAgICBMQ0tfRVgsIE1EU19JTk9ERUxPQ0tfTE9PS1VQLAotCQkJCSAgICAgIE1GX01EQ19DQU5DRUxfRklENCk7CisJCQkJICAgICAgTUZfTURDX0NBTkNFTF9GSUQzKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCXJjID0gbG12X2Vhcmx5X2NhbmNlbChleHAsIE5VTEwsIG9wX2RhdGEsIHNyY190Z3QtPmx0ZF9pZHgsCisJCQkJICAgICAgTENLX0VYLCBNRFNfSU5PREVMT0NLX0ZVTEwsCisJCQkJICAgICAgTUZfTURDX0NBTkNFTF9GSUQzKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOwogCX0KIAogCS8qCiAJICogQ2FuY2VsIGFsbCB0aGUgbG9ja3Mgb24gdGd0IGNoaWxkIChmaWQ0KS4KIAkgKi8KLQlpZiAocmMgPT0gMCkKLQkJcmMgPSBsbXZfZWFybHlfY2FuY2VsKGV4cCwgb3BfZGF0YSwgc3JjX3RndC0+bHRkX2lkeCwKKwlpZiAoZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDQpKQorCQlyYyA9IGxtdl9lYXJseV9jYW5jZWwoZXhwLCBOVUxMLCBvcF9kYXRhLCBzcmNfdGd0LT5sdGRfaWR4LAogCQkJCSAgICAgIExDS19FWCwgTURTX0lOT0RFTE9DS19GVUxMLAogCQkJCSAgICAgIE1GX01EQ19DQU5DRUxfRklENCk7CiAKLQlpZiAocmMgPT0gMCkKLQkJcmMgPSBtZF9yZW5hbWUoc3JjX3RndC0+bHRkX2V4cCwgb3BfZGF0YSwgb2xkLCBvbGRsZW4sCi0JCQkgICAgICAgbmV3LCBuZXdsZW4sIHJlcXVlc3QpOworCUNERUJVRyhEX0lOT0RFLCBERklEIjptJWQgdG8gIkRGSUQiXG4iLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwKKwkgICAgICAgb3BfZGF0YS0+b3BfbWRzLCBQRklEKCZvcF9kYXRhLT5vcF9maWQyKSk7CisKKwlyYyA9IG1kX3JlbmFtZShzcmNfdGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBvbGQsIG9sZGxlbiwKKwkJICAgICAgIG5ldywgbmV3bGVuLCByZXF1ZXN0KTsKIAlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgbG12X3NldGF0dHIoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCSAgICAgICB2b2lkICplYSwgaW50IGVhbGVuLCB2b2lkICplYTIsIGludCBlYTJsZW4sCisJCSAgICAgICB2b2lkICplYSwgc2l6ZV90IGVhbGVuLCB2b2lkICplYTIsIHNpemVfdCBlYTJsZW4sCiAJCSAgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0LAogCQkgICAgICAgc3RydWN0IG1kX29wZW5fZGF0YSAqKm1vZCkKIHsKQEAgLTIwMjEsMTY5ICsyMTEyLDQxOSBAQAogCXJldHVybiByYzsKIH0KIAotLyoKLSAqIEFkanVzdCBhIHNldCBvZiBwYWdlcywgZWFjaCBwYWdlIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgbHVfZGlycGFnZXMsCi0gKiBzbyB0aGF0IGVhY2ggcGFnZSBjYW4gYmUgdXNlZCBhcyBhIHNpbmdsZSBsb2dpY2FsIGx1X2RpcnBhZ2UuCisvKioKKyAqIEdldCBjdXJyZW50IG1pbmltdW0gZW50cnkgZnJvbSBzdHJpcGVkIGRpcmVjdG9yeQogICoKLSAqIEEgbHVfZGlycGFnZSBpcyBsYWlkIG91dCBhcyBmb2xsb3dzLCB3aGVyZSBzID0gbGRwX2hhc2hfc3RhcnQsCi0gKiBlID0gbGRwX2hhc2hfZW5kLCBmID0gbGRwX2ZsYWdzLCBwID0gcGFkZGluZywgYW5kIGVhY2ggImVudCIgaXMgYQotICogc3RydWN0IGx1X2RpcmVudC4gIEl0IGhhcyBzaXplIHVwIHRvIExVX1BBR0VfU0laRS4gVGhlIGxkcF9oYXNoX2VuZAotICogdmFsdWUgaXMgdXNlZCBhcyBhIGNvb2tpZSB0byByZXF1ZXN0IHRoZSBuZXh0IGx1X2RpcnBhZ2UgaW4gYQotICogZGlyZWN0b3J5IGxpc3RpbmcgdGhhdCBzcGFucyBtdWx0aXBsZSBwYWdlcyAodHdvIGluIHRoaXMgZXhhbXBsZSk6Ci0gKiAgIF9fX19fX19fCi0gKiAgfAl8Ci0gKiAufC0tLS0tLS0tdi0tLS0tLS0gICAtLS0tLS4KLSAqIHxzfGV8ZnxwfGVudHxlbnR8IC4uLiB8ZW50fAotICogJy0tfC0tLS0tLS0tLS0tLS0tICAgLS0tLS0nICAgRWFjaCBDRlNfUEFHRSBjb250YWlucyBhIHNpbmdsZQotICogICAgJy0tLS0tLS4JCSAgIGx1X2RpcnBhZ2UuCi0gKiAuLS0tLS0tLS0tdi0tLS0tLS0gICAtLS0tLS4KLSAqIHxzfGV8ZnxwfGVudHwgMCB8IC4uLiB8IDAgfAotICogJy0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0nCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2VhcmNoIHRoZSBkaXIgZW50cnksIHdob3NlIGhhc2ggdmFsdWUgaXMgdGhlCisgKiBjbG9zZXN0KD49KSB0byBAaGFzaF9vZmZzZXQsIGZyb20gYWxsIG9mIHN1Yi1zdHJpcGVzLCBhbmQgaXQgaXMKKyAqIG9ubHkgYmVpbmcgY2FsbGVkIGZvciBzdHJpcGVkIGRpcmVjdG9yeS4KICAqCi0gKiBIb3dldmVyLCBvbiBob3N0cyB3aGVyZSB0aGUgbmF0aXZlIFZNIHBhZ2Ugc2l6ZSAoUEFHRV9TSVpFKSBpcwotICogbGFyZ2VyIHRoYW4gTFVfUEFHRV9TSVpFLCBhIHNpbmdsZSBob3N0IHBhZ2UgbWF5IGNvbnRhaW4gbXVsdGlwbGUKLSAqIGx1X2RpcnBhZ2VzLiBBZnRlciByZWFkaW5nIHRoZSBsdV9kaXJwYWdlcyBmcm9tIHRoZSBNRFMsIHRoZQotICogbGRwX2hhc2hfZW5kIG9mIHRoZSBmaXJzdCBsdV9kaXJwYWdlIHJlZmVycyB0byB0aGUgb25lIGltbWVkaWF0ZWx5Ci0gKiBhZnRlciBpdCBpbiB0aGUgc2FtZSBDRlNfUEFHRSAoYXJyb3dzIHNpbXBsaWZpZWQgZm9yIGJyZXZpdHksIGJ1dAotICogaW4gZ2VuZXJhbCBlMD09czEsIGUxPT1zMiwgZXRjLik6CisgKiBccGFyYW1baW5dIGV4cAkJZXhwb3J0IG9mIExNVgorICogXHBhcmFtW2luXSBvcF9kYXRhCQlwYXJhbWV0ZXJzIHRyYW5zZmVycmVkIGJld2VlbiBjbGllbnQgTUQgc3RhY2sKKyAqCQkJCXN0cmlwZV9pbmZvcm1hdGlvbiB3aWxsIGJlIGluY2x1ZGVkIGluIHRoaXMKKyAqCQkJCXBhcmFtZXRlcgorICogXHBhcmFtW2luXSBjYl9vcAkJbGRsbSBjYWxsYmFjayBiZWluZyB1c2VkIGluIGVucXVldWUgaW4KKyAqCQkJCW1kY19yZWFkX3BhZ2UKKyAqIFxwYXJhbVtpbl0gaGFzaF9vZmZzZXQJdGhlIGhhc2ggdmFsdWUsIHdoaWNoIGlzIHVzZWQgdG8gbG9jYXRlCisgKgkJCQltaW51bShjbG9zZXQpIGRpciBlbnRyeQorICogXHBhcmFtW2lufG91dF0gc3RyaXBlX29mZnNldAl0aGUgY2FsbGVyIHVzZSB0aGlzIHRvIGluZGljYXRlIHRoZSBzdHJpcGUKKyAqCQkJCWluZGV4IG9mIGxhc3QgZW50cnksIHNvIHRvIGF2b2lkIGhhc2ggY29uZmxpY3QKKyAqCQkJCWJldHdlZW4gc3RyaXBlcy4gSXQgd2lsbCBhbHNvIGJlIHVzZWQgdG8KKyAqCQkJCXJldHVybiB0aGUgc3RyaXBlIGluZGV4IG9mIGN1cnJlbnQgZGlyIGVudHJ5LgorICogXHBhcmFtW2lufG91dF0gZW50cAkJdGhlIG1pbnVtIGVudHJ5IGFuZCBpdCBhbHNvIGlzIGJlaW5nIHVzZWQKKyAqCQkJCXRvIGlucHV0IHRoZSBsYXN0IGRpciBlbnRyeSB0byByZXNvbHZlIHRoZQorICoJCQkJaGFzaCBjb25mbGljdAogICoKLSAqIC4tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tLgotICogfHMwfGUwfGYwfHB8ZW50fGVudHwgLi4uIHxlbnR8Ci0gKiB8LS0tdi0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLXwKLSAqIHxzMXxlMXxmMXxwfGVudHxlbnR8IC4uLiB8ZW50fAotICogfC0tLXYtLS0tLS0tLS0tLS0tLS0tICAgLS0tLS18ICBIZXJlLCBlYWNoIENGU19QQUdFIGNvbnRhaW5zCi0gKgkgICAgIC4uLgkJIG11bHRpcGxlIGx1X2RpcnBhZ2VzLgotICogfC0tLXYtLS0tLS0tLS0tLS0tLS0tICAgLS0tLS18Ci0gKiB8cyd8ZSd8Zid8cHxlbnR8ZW50fCAuLi4gfGVudHwKLSAqICctLS18LS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tJwotICogICAgIHYKLSAqIC4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotICogfAluZXh0IENGU19QQUdFICAgICAgIHwKKyAqIFxwYXJhbVtvdXRdIHBwYWdlCQl0aGUgcGFnZSB3aGljaCBob2xkcyB0aGUgbWludW0gZW50cnkKICAqCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyB0cmFuc2Zvcm1lZCBpbnRvIGEgc2luZ2xlIGxvZ2ljYWwgbHVfZGlycGFnZSBhcyBmb2xsb3dzOgotICoKLSAqIC0gUmVwbGFjZSBlMCB3aXRoIGUnIHNvIHRoZSByZXF1ZXN0IGZvciB0aGUgbmV4dCBsdV9kaXJwYWdlIGdldHMgdGhlIHBhZ2UKLSAqICAgbGFiZWxlZCAnbmV4dCBDRlNfUEFHRScuCi0gKgotICogLSBDb3B5IHRoZSBMREZfQ09MTElERSBmbGFnIGZyb20gZicgdG8gZjAgdG8gY29ycmVjdGx5IHJlZmxlY3Qgd2hldGhlcgotICogICBhIGhhc2ggY29sbGlzaW9uIHdpdGggdGhlIG5leHQgcGFnZSBleGlzdHMuCi0gKgotICogLSBBZGp1c3QgdGhlIGxkZV9yZWNsZW4gb2YgdGhlIGVuZGluZyBlbnRyeSBvZiBlYWNoIGx1X2RpcnBhZ2UgdG8gc3BhbgotICogICB0byB0aGUgZmlyc3QgZW50cnkgb2YgdGhlIG5leHQgbHVfZGlycGFnZS4KKyAqIFxyZXR2YWwJCQk9IDAgZ2V0IHRoZSBlbnRyeSBzdWNjZXNzZnVsbHkKKyAqCQkJCW5lZ2F0aXZlIGVycm5vICg8IDApIGRvZXMgbm90IGdldCB0aGUgZW50cnkKICAqLwotI2lmIFBBR0VfU0laRSA+IExVX1BBR0VfU0laRQotc3RhdGljIHZvaWQgbG12X2FkanVzdF9kaXJwYWdlcyhzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgbmNmc3BncywgaW50IG5sdXBncykKK3N0YXRpYyBpbnQgbG12X2dldF9taW5fc3RyaXBlZF9lbnRyeShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAorCQkJCSAgICAgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCisJCQkJICAgICBzdHJ1Y3QgbWRfY2FsbGJhY2sgKmNiX29wLAorCQkJCSAgICAgX191NjQgaGFzaF9vZmZzZXQsIGludCAqc3RyaXBlX29mZnNldCwKKwkJCQkgICAgIHN0cnVjdCBsdV9kaXJlbnQgKiplbnRwLAorCQkJCSAgICAgc3RydWN0IHBhZ2UgKipwcGFnZSkKIHsKKwlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtID0gb3BfZGF0YS0+b3BfbWVhMTsKKwlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gZXhwLT5leHBfb2JkOworCXN0cnVjdCBsbXZfb2JkICpsbXYgPSAmb2JkLT51LmxtdjsKKwlzdHJ1Y3QgbHVfZGlyZW50ICptaW5fZW50ID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqbWluX3BhZ2UgPSBOVUxMOworCXN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndDsKKwlpbnQgc3RyaXBlX2NvdW50OworCWludCBtaW5faWR4ID0gMDsKKwlpbnQgcmMgPSAwOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IG5jZnNwZ3M7IGkrKykgewotCQlzdHJ1Y3QgbHVfZGlycGFnZQkqZHAgPSBrbWFwKHBhZ2VzW2ldKTsKLQkJc3RydWN0IGx1X2RpcnBhZ2UJKmZpcnN0ID0gZHA7Ci0JCXN0cnVjdCBsdV9kaXJlbnQJKmVuZF9kaXJlbnQgPSBOVUxMOwotCQlzdHJ1Y3QgbHVfZGlyZW50CSplbnQ7Ci0JCV9fdTY0CQkJaGFzaF9lbmQgPSBkcC0+bGRwX2hhc2hfZW5kOwotCQlfX3UzMgkJCWZsYWdzID0gZHAtPmxkcF9mbGFnczsKKwlzdHJpcGVfY291bnQgPSBsc20tPmxzbV9tZF9zdHJpcGVfY291bnQ7CisJZm9yIChpID0gMDsgaSA8IHN0cmlwZV9jb3VudDsgaSsrKSB7CisJCV9fdTY0IHN0cmlwZV9oYXNoID0gaGFzaF9vZmZzZXQ7CisJCXN0cnVjdCBsdV9kaXJlbnQgKmVudCA9IE5VTEw7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwkJc3RydWN0IGx1X2RpcnBhZ2UgKmRwOwogCi0JCXdoaWxlICgtLW5sdXBncyA+IDApIHsKLQkJCWVudCA9IGx1X2RpcmVudF9zdGFydChkcCk7Ci0JCQlmb3IgKGVuZF9kaXJlbnQgPSBlbnQ7IGVudDsKLQkJCSAgICAgZW5kX2RpcmVudCA9IGVudCwgZW50ID0gbHVfZGlyZW50X25leHQoZW50KSkKLQkJCQk7Ci0KLQkJCS8qIEFkdmFuY2UgZHAgdG8gbmV4dCBsdV9kaXJwYWdlLiAqLwotCQkJZHAgPSAoc3RydWN0IGx1X2RpcnBhZ2UgKikoKGNoYXIgKilkcCArIExVX1BBR0VfU0laRSk7Ci0KLQkJCS8qIENoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgQ0ZTX1BBR0UuICovCi0JCQlpZiAoISgodW5zaWduZWQgbG9uZylkcCAmIH5QQUdFX01BU0spKQotCQkJCWJyZWFrOwotCi0JCQkvKiBTYXZlIHRoZSBoYXNoIGFuZCBmbGFncyBvZiB0aGlzIGx1X2RpcnBhZ2UuICovCi0JCQloYXNoX2VuZCA9IGRwLT5sZHBfaGFzaF9lbmQ7Ci0JCQlmbGFncyA9IGRwLT5sZHBfZmxhZ3M7Ci0KLQkJCS8qIENoZWNrIGlmIGx1X2RpcnBhZ2UgY29udGFpbnMgbm8gZW50cmllcy4gKi8KLQkJCWlmICghZW5kX2RpcmVudCkKLQkJCQlicmVhazsKLQotCQkJLyogRW5sYXJnZSB0aGUgZW5kIGVudHJ5IGxkZV9yZWNsZW4gZnJvbSAwIHRvCi0JCQkgKiBmaXJzdCBlbnRyeSBvZiBuZXh0IGx1X2RpcnBhZ2UuCi0JCQkgKi8KLQkJCUxBU1NFUlQobGUxNl90b19jcHUoZW5kX2RpcmVudC0+bGRlX3JlY2xlbikgPT0gMCk7Ci0JCQllbmRfZGlyZW50LT5sZGVfcmVjbGVuID0KLQkJCQljcHVfdG9fbGUxNigoY2hhciAqKShkcC0+bGRwX2VudHJpZXMpIC0KLQkJCQkJICAgIChjaGFyICopZW5kX2RpcmVudCk7CisJCXRndCA9IGxtdl9nZXRfdGFyZ2V0KGxtdiwgbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX21kcywgTlVMTCk7CisJCWlmIChJU19FUlIodGd0KSkgeworCQkJcmMgPSBQVFJfRVJSKHRndCk7CisJCQlnb3RvIG91dDsKIAkJfQogCi0JCWZpcnN0LT5sZHBfaGFzaF9lbmQgPSBoYXNoX2VuZDsKLQkJZmlyc3QtPmxkcF9mbGFncyAmPSB+Y3B1X3RvX2xlMzIoTERGX0NPTExJREUpOwotCQlmaXJzdC0+bGRwX2ZsYWdzIHw9IGZsYWdzICYgY3B1X3RvX2xlMzIoTERGX0NPTExJREUpOworCQkvKgorCQkgKiBvcF9kYXRhIHdpbGwgYmUgc2hhcmVkIGJ5IGVhY2ggc3RyaXBlLCBzbyB3ZSBuZWVkCisJCSAqIHJlc2V0IHRoZXNlIHZhbHVlIGZvciBlYWNoIHN0cmlwZQorCQkgKi8KKwkJb3BfZGF0YS0+b3BfZmlkMSA9IGxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19maWQ7CisJCW9wX2RhdGEtPm9wX2ZpZDIgPSBsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fZmlkOworCQlvcF9kYXRhLT5vcF9kYXRhID0gbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX3Jvb3Q7CituZXh0OgorCQlyYyA9IG1kX3JlYWRfcGFnZSh0Z3QtPmx0ZF9leHAsIG9wX2RhdGEsIGNiX29wLCBzdHJpcGVfaGFzaCwKKwkJCQkgICZwYWdlKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CiAKLQkJa3VubWFwKHBhZ2VzW2ldKTsKKwkJZHAgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCWZvciAoZW50ID0gbHVfZGlyZW50X3N0YXJ0KGRwKTsgZW50OworCQkgICAgIGVudCA9IGx1X2RpcmVudF9uZXh0KGVudCkpIHsKKwkJCS8qIFNraXAgZHVtbXkgZW50cnkgKi8KKwkJCWlmICghbGUxNl90b19jcHUoZW50LT5sZGVfbmFtZWxlbikpCisJCQkJY29udGludWU7CisKKwkJCWlmIChsZTY0X3RvX2NwdShlbnQtPmxkZV9oYXNoKSA8IGhhc2hfb2Zmc2V0KQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAobGU2NF90b19jcHUoZW50LT5sZGVfaGFzaCkgPT0gaGFzaF9vZmZzZXQgJiYKKwkJCSAgICAoKmVudHAgPT0gZW50IHx8IGkgPCAqc3RyaXBlX29mZnNldCkpCisJCQkJY29udGludWU7CisKKwkJCS8qIHNraXAgLiBhbmQgLi4gZm9yIG90aGVyIHN0cmlwZXMgKi8KKwkJCWlmIChpICYmICghc3RybmNtcChlbnQtPmxkZV9uYW1lLCAiLiIsCisJCQkJCSAgIGxlMTZfdG9fY3B1KGVudC0+bGRlX25hbWVsZW4pKSB8fAorCQkJCSAgIXN0cm5jbXAoZW50LT5sZGVfbmFtZSwgIi4uIiwKKwkJCQkJICAgbGUxNl90b19jcHUoZW50LT5sZGVfbmFtZWxlbikpKSkKKwkJCQljb250aW51ZTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFlbnQpIHsKKwkJCXN0cmlwZV9oYXNoID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX2VuZCk7CisKKwkJCWt1bm1hcChwYWdlKTsKKwkJCXB1dF9wYWdlKHBhZ2UpOworCQkJcGFnZSA9IE5VTEw7CisKKwkJCS8qCisJCQkgKiByZWFjaCB0aGUgZW5kIG9mIGN1cnJlbnQgc3RyaXBlLCBnbyB0byBuZXh0IHN0cmlwZQorCQkJICovCisJCQlpZiAoc3RyaXBlX2hhc2ggPT0gTURTX0RJUl9FTkRfT0ZGKQorCQkJCWNvbnRpbnVlOworCQkJZWxzZQorCQkJCWdvdG8gbmV4dDsKKwkJfQorCisJCWlmIChtaW5fZW50KSB7CisJCQlpZiAobGU2NF90b19jcHUobWluX2VudC0+bGRlX2hhc2gpID4KKwkJCSAgICBsZTY0X3RvX2NwdShlbnQtPmxkZV9oYXNoKSkgeworCQkJCW1pbl9lbnQgPSBlbnQ7CisJCQkJa3VubWFwKG1pbl9wYWdlKTsKKwkJCQlwdXRfcGFnZShtaW5fcGFnZSk7CisJCQkJbWluX2lkeCA9IGk7CisJCQkJbWluX3BhZ2UgPSBwYWdlOworCQkJfSBlbHNlIHsKKwkJCQlrdW5tYXAocGFnZSk7CisJCQkJcHV0X3BhZ2UocGFnZSk7CisJCQkJcGFnZSA9IE5VTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQltaW5fZW50ID0gZW50OworCQkJbWluX3BhZ2UgPSBwYWdlOworCQkJbWluX2lkeCA9IGk7CisJCX0KIAl9Ci0JTEFTU0VSVEYobmx1cGdzID09IDAsICJsZWZ0ID0gJWQiLCBubHVwZ3MpOwotfQotI2Vsc2UKLSNkZWZpbmUgbG12X2FkanVzdF9kaXJwYWdlcyhwYWdlcywgbmNmc3Bncywgbmx1cGdzKSBkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgkvKiBQQUdFX1NJWkUgPiBMVV9QQUdFX1NJWkUgKi8KIAotc3RhdGljIGludCBsbXZfcmVhZHBhZ2Uoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQorb3V0OgorCWlmICgqcHBhZ2UpIHsKKwkJa3VubWFwKCpwcGFnZSk7CisJCXB1dF9wYWdlKCpwcGFnZSk7CisJfQorCSpzdHJpcGVfb2Zmc2V0ID0gbWluX2lkeDsKKwkqZW50cCA9IG1pbl9lbnQ7CisJKnBwYWdlID0gbWluX3BhZ2U7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIEJ1aWxkIGRpciBlbnRyeSBwYWdlIGZyb20gYSBzdHJpcGVkIGRpcmVjdG9yeQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBvbmUgZW50cnkgYnkgQG9mZnNldCBmcm9tIGEgc3RyaXBlZCBkaXJlY3RvcnkuIEl0IHdpbGwKKyAqIHJlYWQgZW50cmllcyBmcm9tIGFsbCBvZiBzdHJpcGVzLCBhbmQgY2hvb3NlIG9uZSBjbG9zZXN0IHRvIHRoZSByZXF1aXJlZAorICogb2Zmc2V0KCZvZmZzZXQpLiBBIGZldyBub3RlcworICogMS4gc2tpcCAuIGFuZCAuLiBmb3Igbm9uLXplcm8gc3RyaXBlcywgYmVjYXVzZSB0aGVyZSBjYW4gb25seSBoYXZlIG9uZSAuCisgKiBhbmQgLi4gaW4gYSBkaXJlY3RvcnkuCisgKiAyLiBvcF9kYXRhIHdpbGwgYmUgc2hhcmVkIGJ5IGFsbCBvZiBzdHJpcGVzLCBpbnN0ZWFkIG9mIGFsbG9jYXRpbmcgbmV3CisgKiBvbmUsIHNvIG5lZWQgdG8gcmVzdG9yZSBiZWZvcmUgcmV1c2luZy4KKyAqIDMuIHJlbGVhc2UgdGhlIGVudHJ5IHBhZ2UgaWYgdGhhdCBpcyBub3QgYmVpbmcgY2hvc2VuLgorICoKKyAqIFxwYXJhbVtpbl0gZXhwCW9iZCBleHBvcnQgcmVmZXIgdG8gTE1WCisgKiBccGFyYW1baW5dIG9wX2RhdGEJaG9sZCB0aG9zZSBNRCBwYXJhbWV0ZXJzIG9mIHJlYWRfZW50cnkKKyAqIFxwYXJhbVtpbl0gY2Jfb3AJbGRsbSBjYWxsYmFjayBiZWluZyB1c2VkIGluIGVucXVldWUgaW4gbWRjX3JlYWRfZW50cnkKKyAqIFxwYXJhbVtvdXRdIGxkcAl0aGUgZW50cnkgYmVpbmcgcmVhZAorICogXHBhcmFtW291dF0gcHBhZ2UJdGhlIHBhZ2UgaG9sZGluZyB0aGUgZW50cnkuIE5vdGU6IGJlY2F1c2UgdGhlIGVudHJ5CisgKgkJCXdpbGwgYmUgYWNjZXNzZWQgaW4gdXBwZXIgbGF5ZXIsIHNvIHdlIG5lZWQgaG9sZCB0aGUKKyAqCQkJcGFnZSB1bnRpbCB0aGUgdXNhZ2VzIG9mIGVudHJ5IGlzIGZpbmlzaGVkLCBzZWUKKyAqCQkJbGxfZGlyX2VudHJ5X25leHQuCisgKgorICogcmV0dmFsCQk9MCBpZiBnZXQgZW50cnkgc3VjY2Vzc2Z1bGx5CisgKgkJCTwwIGNhbm5vdCBnZXQgZW50cnkKKyAqLworc3RhdGljIGludCBsbXZfcmVhZF9zdHJpcGVkX3BhZ2Uoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJCQkgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCisJCQkJIHN0cnVjdCBtZF9jYWxsYmFjayAqY2Jfb3AsCisJCQkJIF9fdTY0IG9mZnNldCwgc3RydWN0IHBhZ2UgKipwcGFnZSkKIHsKLQlzdHJ1Y3Qgb2JkX2RldmljZQkqb2JkID0gZXhwLT5leHBfb2JkOwotCXN0cnVjdCBsbXZfb2JkCQkqbG12ID0gJm9iZC0+dS5sbXY7Ci0JX191NjQJCQlvZmZzZXQgPSBvcF9kYXRhLT5vcF9vZmZzZXQ7Ci0JaW50CQkJcmM7Ci0JaW50CQkJbmNmc3BnczsgLyogcGFnZXMgcmVhZCBpbiBQQUdFX1NJWkUgKi8KLQlpbnQJCQlubHVwZ3M7IC8qIHBhZ2VzIHJlYWQgaW4gTFVfUEFHRV9TSVpFICovCi0Jc3RydWN0IGxtdl90Z3RfZGVzYwkqdGd0OworCXN0cnVjdCBpbm9kZSAqbWFzdGVyX2lub2RlID0gb3BfZGF0YS0+b3BfZGF0YTsKKwlzdHJ1Y3QgbHVfZmlkIG1hc3Rlcl9maWQgPSBvcF9kYXRhLT5vcF9maWQxOworCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQgPSBleHAtPmV4cF9vYmQ7CisJX191NjQgaGFzaF9vZmZzZXQgPSBvZmZzZXQ7CisJc3RydWN0IHBhZ2UgKm1pbl9lbnRfcGFnZSA9IE5VTEw7CisJc3RydWN0IHBhZ2UgKmVudF9wYWdlID0gTlVMTDsKKwlzdHJ1Y3QgbHVfZGlyZW50ICptaW5fZW50ID0gTlVMTDsKKwlzdHJ1Y3QgbHVfZGlyZW50ICpsYXN0X2VudDsKKwlzdHJ1Y3QgbHVfZGlyZW50ICplbnQ7CisJc3RydWN0IGx1X2RpcnBhZ2UgKmRwOworCXNpemVfdCBsZWZ0X2J5dGVzOworCWludCBlbnRfaWR4ID0gMDsKKwl2b2lkICphcmVhOworCWludCByYzsKIAogCXJjID0gbG12X2NoZWNrX2Nvbm5lY3Qob2JkKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCUNERUJVRyhEX0lOT0RFLCAiUkVBRFBBR0UgYXQgJSNsbHggZnJvbSAiREZJRCJcbiIsCi0JICAgICAgIG9mZnNldCwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSkpOworCS8qCisJICogQWxsb2NhdGUgYSBwYWdlIGFuZCByZWFkIGVudHJpZXMgZnJvbSBhbGwgb2Ygc3RyaXBlcyBhbmQgZmlsbAorCSAqIHRoZSBwYWdlIGJ5IGhhc2ggb3JkZXIKKwkgKi8KKwllbnRfcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFlbnRfcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBJbml0aWFsaXplIHRoZSBlbnRyeSBwYWdlICovCisJZHAgPSBrbWFwKGVudF9wYWdlKTsKKwltZW1zZXQoZHAsIDAsIHNpemVvZigqZHApKTsKKwlkcC0+bGRwX2hhc2hfc3RhcnQgPSBjcHVfdG9fbGU2NChvZmZzZXQpOworCWRwLT5sZHBfZmxhZ3MgfD0gTERGX0NPTExJREU7CisKKwlhcmVhID0gZHAgKyAxOworCWxlZnRfYnl0ZXMgPSBQQUdFX1NJWkUgLSBzaXplb2YoKmRwKTsKKwllbnQgPSBhcmVhOworCWxhc3RfZW50ID0gZW50OworCWRvIHsKKwkJX191MTYgZW50X3NpemU7CisKKwkJLyogRmluZCB0aGUgbWludW0gZW50cnkgZnJvbSBhbGwgc3ViLXN0cmlwZXMgKi8KKwkJcmMgPSBsbXZfZ2V0X21pbl9zdHJpcGVkX2VudHJ5KGV4cCwgb3BfZGF0YSwgY2Jfb3AsIGhhc2hfb2Zmc2V0LAorCQkJCQkgICAgICAgJmVudF9pZHgsICZtaW5fZW50LAorCQkJCQkgICAgICAgJm1pbl9lbnRfcGFnZSk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0OworCisJCS8qCisJCSAqIElmIGl0IGNhbiBub3QgZ2V0IG1pbnVtIGVudHJ5LCBpdCBtZWFucyBpdCBhbHJlYWR5IHJlYWNoZXMKKwkJICogdGhlIGVuZCBvZiB0aGlzIGRpcmVjdG9yeQorCQkgKi8KKwkJaWYgKCFtaW5fZW50KSB7CisJCQlsYXN0X2VudC0+bGRlX3JlY2xlbiA9IDA7CisJCQloYXNoX29mZnNldCA9IE1EU19ESVJfRU5EX09GRjsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZW50X3NpemUgPSBsZTE2X3RvX2NwdShtaW5fZW50LT5sZGVfcmVjbGVuKTsKKworCQkvKgorCQkgKiB0aGUgbGFzdCBlbnRyeSBsZGVfcmVjbGVuIGlzIDAsIGJ1dCBpdCBtaWdodCBub3QKKwkJICogdGhlIGVuZCBvZiB0aGlzIGVudHJ5IG9mIHRoaXMgdGVtcG9yYXkgZW50cnkKKwkJICovCisJCWlmICghZW50X3NpemUpCisJCQllbnRfc2l6ZSA9IGx1X2RpcmVudF9jYWxjX3NpemUoCisJCQkJCWxlMTZfdG9fY3B1KG1pbl9lbnQtPmxkZV9uYW1lbGVuKSwKKwkJCQkJbGUzMl90b19jcHUobWluX2VudC0+bGRlX2F0dHJzKSk7CisJCWlmIChlbnRfc2l6ZSA+IGxlZnRfYnl0ZXMpIHsKKwkJCWxhc3RfZW50LT5sZGVfcmVjbGVuID0gY3B1X3RvX2xlMTYoMCk7CisJCQloYXNoX29mZnNldCA9IGxlNjRfdG9fY3B1KG1pbl9lbnQtPmxkZV9oYXNoKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbWVtY3B5KGVudCwgbWluX2VudCwgZW50X3NpemUpOworCisJCS8qCisJCSAqIFJlcGxhY2UgLiB3aXRoIG1hc3RlciBGSUQgYW5kIFJlcGxhY2UgLi4gd2l0aCB0aGUgcGFyZW50IEZJRAorCQkgKiBvZiBtYXN0ZXIgb2JqZWN0CisJCSAqLworCQlpZiAoIXN0cm5jbXAoZW50LT5sZGVfbmFtZSwgIi4iLAorCQkJICAgICBsZTE2X3RvX2NwdShlbnQtPmxkZV9uYW1lbGVuKSkgJiYKKwkJICAgIGxlMTZfdG9fY3B1KGVudC0+bGRlX25hbWVsZW4pID09IDEpCisJCQlmaWRfY3B1X3RvX2xlKCZlbnQtPmxkZV9maWQsICZtYXN0ZXJfZmlkKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoZW50LT5sZGVfbmFtZSwgIi4uIiwKKwkJCQkgIGxlMTZfdG9fY3B1KGVudC0+bGRlX25hbWVsZW4pKSAmJgorCQkJIGxlMTZfdG9fY3B1KGVudC0+bGRlX25hbWVsZW4pID09IDIpCisJCQlmaWRfY3B1X3RvX2xlKCZlbnQtPmxkZV9maWQsICZvcF9kYXRhLT5vcF9maWQzKTsKKworCQlsZWZ0X2J5dGVzIC09IGVudF9zaXplOworCQllbnQtPmxkZV9yZWNsZW4gPSBjcHVfdG9fbGUxNihlbnRfc2l6ZSk7CisJCWxhc3RfZW50ID0gZW50OworCQllbnQgPSAodm9pZCAqKWVudCArIGVudF9zaXplOworCQloYXNoX29mZnNldCA9IGxlNjRfdG9fY3B1KG1pbl9lbnQtPmxkZV9oYXNoKTsKKwkJaWYgKGhhc2hfb2Zmc2V0ID09IE1EU19ESVJfRU5EX09GRikgeworCQkJbGFzdF9lbnQtPmxkZV9yZWNsZW4gPSAwOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgxKTsKK291dDoKKwlpZiAobWluX2VudF9wYWdlKSB7CisJCWt1bm1hcChtaW5fZW50X3BhZ2UpOworCQlwdXRfcGFnZShtaW5fZW50X3BhZ2UpOworCX0KKworCWlmICh1bmxpa2VseShyYykpIHsKKwkJX19mcmVlX3BhZ2UoZW50X3BhZ2UpOworCQllbnRfcGFnZSA9IE5VTEw7CisJfSBlbHNlIHsKKwkJaWYgKGVudCA9PSBhcmVhKQorCQkJZHAtPmxkcF9mbGFncyB8PSBMREZfRU1QVFk7CisJCWRwLT5sZHBfZmxhZ3MgPSBjcHVfdG9fbGUzMihkcC0+bGRwX2ZsYWdzKTsKKwkJZHAtPmxkcF9oYXNoX2VuZCA9IGNwdV90b19sZTY0KGhhc2hfb2Zmc2V0KTsKKwl9CisKKwkvKgorCSAqIFdlIGRvIG5vdCB3YW50IHRvIGFsbG9jYXRlIG1kX29wX2RhdGEgZHVyaW5nIGVhY2gKKwkgKiBkaXIgZW50cnkgcmVhZGluZywgc28gb3BfZGF0YSB3aWxsIGJlIHNoYXJlZCBieSBldmVyeSBzdHJpcGUsCisJICogdGhlbiB3ZSBuZWVkIHRvIHJlc3RvcmUgaXQgYmFjayB0byBvcmlnaW5hbCB2YWx1ZSBiZWZvcmUKKwkgKiByZXR1cm4gdG8gdGhlIHVwcGVyIGxheWVyCisJICovCisJb3BfZGF0YS0+b3BfZmlkMSA9IG1hc3Rlcl9maWQ7CisJb3BfZGF0YS0+b3BfZmlkMiA9IG1hc3Rlcl9maWQ7CisJb3BfZGF0YS0+b3BfZGF0YSA9IG1hc3Rlcl9pbm9kZTsKKworCSpwcGFnZSA9IGVudF9wYWdlOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGxtdl9yZWFkX3BhZ2Uoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCisJCQkgc3RydWN0IG1kX2NhbGxiYWNrICpjYl9vcCwgX191NjQgb2Zmc2V0LAorCQkJIHN0cnVjdCBwYWdlICoqcHBhZ2UpCit7CisJc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSA9IG9wX2RhdGEtPm9wX21lYTE7CisJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IGV4cC0+ZXhwX29iZDsKKwlzdHJ1Y3QgbG12X29iZCAqbG12ID0gJm9iZC0+dS5sbXY7CisJc3RydWN0IGxtdl90Z3RfZGVzYyAqdGd0OworCWludCByYzsKKworCXJjID0gbG12X2NoZWNrX2Nvbm5lY3Qob2JkKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmICh1bmxpa2VseShsc20pKSB7CisJCXJjID0gbG12X3JlYWRfc3RyaXBlZF9wYWdlKGV4cCwgb3BfZGF0YSwgY2Jfb3AsIG9mZnNldCwgcHBhZ2UpOworCQlyZXR1cm4gcmM7CisJfQogCiAJdGd0ID0gbG12X2ZpbmRfdGFyZ2V0KGxtdiwgJm9wX2RhdGEtPm9wX2ZpZDEpOwogCWlmIChJU19FUlIodGd0KSkKIAkJcmV0dXJuIFBUUl9FUlIodGd0KTsKIAotCXJjID0gbWRfcmVhZHBhZ2UodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBwYWdlcywgcmVxdWVzdCk7Ci0JaWYgKHJjICE9IDApCi0JCXJldHVybiByYzsKLQotCW5jZnNwZ3MgPSAoKCpyZXF1ZXN0KS0+cnFfYnVsay0+YmRfbm9iX3RyYW5zZmVycmVkICsgUEFHRV9TSVpFIC0gMSkKLQkJID4+IFBBR0VfU0hJRlQ7Ci0Jbmx1cGdzID0gKCpyZXF1ZXN0KS0+cnFfYnVsay0+YmRfbm9iX3RyYW5zZmVycmVkID4+IExVX1BBR0VfU0hJRlQ7Ci0JTEFTU0VSVCghKCgqcmVxdWVzdCktPnJxX2J1bGstPmJkX25vYl90cmFuc2ZlcnJlZCAmIH5MVV9QQUdFX01BU0spKTsKLQlMQVNTRVJUKG5jZnNwZ3MgPiAwICYmIG5jZnNwZ3MgPD0gb3BfZGF0YS0+b3BfbnBhZ2VzKTsKLQotCUNERUJVRyhEX0lOT0RFLCAicmVhZCAlZCglZCkvJWQgcGFnZXNcbiIsIG5jZnNwZ3MsIG5sdXBncywKLQkgICAgICAgb3BfZGF0YS0+b3BfbnBhZ2VzKTsKLQotCWxtdl9hZGp1c3RfZGlycGFnZXMocGFnZXMsIG5jZnNwZ3MsIG5sdXBncyk7CisJcmMgPSBtZF9yZWFkX3BhZ2UodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBjYl9vcCwgb2Zmc2V0LCBwcGFnZSk7CiAKIAlyZXR1cm4gcmM7CiB9CiAKKy8qKgorICogVW5saW5rIGEgZmlsZS9kaXJlY3RvcnkKKyAqCisgKiBVbmxpbmsgYSBmaWxlIG9yIGRpcmVjdG9yeSB1bmRlciB0aGUgcGFyZW50IGRpci4gVGhlIHVubGluayByZXF1ZXN0CisgKiB1c3VhbGx5IHdpbGwgYmUgc2VudCB0byB0aGUgTURUIHdoZXJlIHRoZSBjaGlsZCBpcyBsb2NhdGVkLCBidXQgaWYKKyAqIHRoZSBjbGllbnQgZG9lcyBub3QgaGF2ZSB0aGUgY2hpbGQgRklEIHRoZW4gcmVxdWVzdCB3aWxsIGJlIHNlbnQgdG8gdGhlCisgKiBNRFQgd2hlcmUgdGhlIHBhcmVudCBpcyBsb2NhdGVkLgorICoKKyAqIElmIHRoZSBwYXJlbnQgaXMgYSBzdHJpcGVkIGRpcmVjdG9yeSB0aGVuIGl0IGFsc28gbmVlZHMgdG8gbG9jYXRlIHdoaWNoCisgKiBzdHJpcGUgdGhlIG5hbWUgb2YgdGhlIGNoaWxkIGlzIGxvY2F0ZWQsIGFuZCByZXBsYWNlIHRoZSBwYXJlbnQgRklECisgKiAoQG9wLT5vcF9maWQxKSB3aXRoIHRoZSBzdHJpcGUgRklELiBOb3RlOiBpZiB0aGUgc3RyaXBlIGlzIHVua25vd24sCisgKiBpdCB3aWxsIHdhbGsgdGhyb3VnaCBhbGwgb2Ygc3ViLXN0cmlwZXMgdW50aWwgdGhlIGNoaWxkIGlzIGJlaW5nCisgKiB1bmxpbmtlZCBmaW5hbGx5LgorICoKKyAqIFxwYXJhbVtpbl0gZXhwCWV4cG9ydCByZWZlciB0byBMTVYKKyAqIFxwYXJhbVtpbl0gb3BfZGF0YQlkaWZmZXJlbnQgcGFyYW1ldGVycyB0cmFuc2ZlcnJlZCBiZXdlZW4gY2xpZW50CisgKgkJCU1EIHN0YWNrcywgbmFtZSwgbmFtZWxlbiwgRklEcyBldGMuCisgKgkJCW9wX2ZpZDEgaXMgdGhlIHBhcmVudCBGSUQsIG9wX2ZpZDIgaXMgdGhlIGNoaWxkCisgKgkJCUZJRC4KKyAqIFxwYXJhbVtvdXRdIHJlcXVlc3QgcG9pbnQgdG8gdGhlIHJlcXVlc3Qgb2YgdW5saW5rLgorICoKKyAqIHJldHZhbAkJMCBpZiBzdWNjZWVkCisgKgkJCW5lZ2F0aXZlIGVycm5vIGlmIGZhaWxlZC4KKyAqLwogc3RhdGljIGludCBsbXZfdW5saW5rKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAogCQkgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQogewotCXN0cnVjdCBvYmRfZGV2aWNlICAgICAgICpvYmQgPSBleHAtPmV4cF9vYmQ7CisJc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSA9IG9wX2RhdGEtPm9wX21lYTE7CisJc3RydWN0IG9iZF9kZXZpY2UgICAgKm9iZCA9IGV4cC0+ZXhwX29iZDsKIAlzdHJ1Y3QgbG12X29iZAkgICpsbXYgPSAmb2JkLT51LmxtdjsKKwlzdHJ1Y3QgbG12X3RndF9kZXNjICpwYXJlbnRfdGd0ID0gTlVMTDsKIAlzdHJ1Y3QgbG12X3RndF9kZXNjICAgICAqdGd0ID0gTlVMTDsKIAlzdHJ1Y3QgbWR0X2JvZHkJCSpib2R5OworCWludCBzdHJpcGVfaW5kZXggPSAwOwogCWludAkJICAgICByYzsKIAogCXJjID0gbG12X2NoZWNrX2Nvbm5lY3Qob2JkKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKLXJldHJ5OgorcmV0cnlfdW5saW5rOgorCS8qIEZvciBzdHJpcGVkIGRpciwgd2UgbmVlZCB0byBsb2NhdGUgdGhlIHBhcmVudCBhcyB3ZWxsICovCisJaWYgKGxzbSkgeworCQlzdHJ1Y3QgbG12X3RndF9kZXNjICp0bXA7CisKKwkJTEFTU0VSVChvcF9kYXRhLT5vcF9uYW1lICYmIG9wX2RhdGEtPm9wX25hbWVsZW4pOworCisJCXRtcCA9IGxtdl9sb2NhdGVfdGFyZ2V0X2Zvcl9uYW1lKGxtdiwgbHNtLAorCQkJCQkJIG9wX2RhdGEtPm9wX25hbWUsCisJCQkJCQkgb3BfZGF0YS0+b3BfbmFtZWxlbiwKKwkJCQkJCSAmb3BfZGF0YS0+b3BfZmlkMSwKKwkJCQkJCSAmb3BfZGF0YS0+b3BfbWRzKTsKKworCQkvKgorCQkgKiByZXR1cm4gLUVCQURGRCBtZWFucyB1bmtub3duIGhhc2ggdHlwZSwgbWlnaHQKKwkJICogbmVlZCB0cnkgYWxsIHN1Yi1zdHJpcGUgaGVyZQorCQkgKi8KKwkJaWYgKElTX0VSUih0bXApICYmIFBUUl9FUlIodG1wKSAhPSAtRUJBREZEKQorCQkJcmV0dXJuIFBUUl9FUlIodG1wKTsKKworCQkvKgorCQkgKiBOb3RlOiBib3RoIG1pZ3JhdGluZyBkaXIgYW5kIHVua25vd24gaGFzaCBkaXIgbmVlZCB0bworCQkgKiB0cnkgYWxsIG9mIHN1Yi1zdHJpcGVzLCBzbyB3ZSBuZWVkIHN0YXJ0IHNlYXJjaCB0aGUKKwkJICogbmFtZSBmcm9tIHN0cmlwZSAwLCBidXQgbWlncmF0aW5nIGRpciBpcyBhbHJlYWR5IGhhbmRsZWQKKwkJICogaW5zaWRlIGxtdl9sb2NhdGVfdGFyZ2V0X2Zvcl9uYW1lKCksIHNvIHdlIG9ubHkgY2hlY2sKKwkJICogdW5rbm93biBoYXNoIHR5cGUgZGlyZWN0b3J5IGhlcmUKKwkJICovCisJCWlmICghbG12X2lzX2tub3duX2hhc2hfdHlwZShsc20tPmxzbV9tZF9oYXNoX3R5cGUpKSB7CisJCQlzdHJ1Y3QgbG12X29pbmZvICpvaW5mbzsKKworCQkJb2luZm8gPSAmbHNtLT5sc21fbWRfb2luZm9bc3RyaXBlX2luZGV4XTsKKworCQkJb3BfZGF0YS0+b3BfZmlkMSA9IG9pbmZvLT5sbW9fZmlkOworCQkJb3BfZGF0YS0+b3BfbWRzID0gb2luZm8tPmxtb19tZHM7CisJCX0KKwl9CisKK3RyeV9uZXh0X3N0cmlwZToKIAkvKiBTZW5kIHVubGluayByZXF1ZXN0cyB0byB0aGUgTURUIHdoZXJlIHRoZSBjaGlsZCBpcyBsb2NhdGVkICovCiAJaWYgKGxpa2VseSghZmlkX2lzX3plcm8oJm9wX2RhdGEtPm9wX2ZpZDIpKSkKLQkJdGd0ID0gbG12X2xvY2F0ZV9tZHMobG12LCBvcF9kYXRhLCAmb3BfZGF0YS0+b3BfZmlkMik7CisJCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsICZvcF9kYXRhLT5vcF9maWQyKTsKKwllbHNlIGlmIChsc20pCisJCXRndCA9IGxtdl9nZXRfdGFyZ2V0KGxtdiwgb3BfZGF0YS0+b3BfbWRzLCBOVUxMKTsKIAllbHNlCiAJCXRndCA9IGxtdl9sb2NhdGVfbWRzKGxtdiwgb3BfZGF0YSwgJm9wX2RhdGEtPm9wX2ZpZDEpOworCiAJaWYgKElTX0VSUih0Z3QpKQogCQlyZXR1cm4gUFRSX0VSUih0Z3QpOwogCkBAIC0yMjAzLDI5ICsyNTQ0LDU3IEBACiAJLyoKIAkgKiBDYW5jZWwgRlVMTCBsb2NrcyBvbiBjaGlsZCAoZmlkMykuCiAJICovCi0JcmMgPSBsbXZfZWFybHlfY2FuY2VsKGV4cCwgb3BfZGF0YSwgdGd0LT5sdGRfaWR4LCBMQ0tfRVgsCi0JCQkgICAgICBNRFNfSU5PREVMT0NLX0ZVTEwsIE1GX01EQ19DQU5DRUxfRklEMyk7CisJcGFyZW50X3RndCA9IGxtdl9maW5kX3RhcmdldChsbXYsICZvcF9kYXRhLT5vcF9maWQxKTsKKwlpZiAoSVNfRVJSKHBhcmVudF90Z3QpKQorCQlyZXR1cm4gUFRSX0VSUihwYXJlbnRfdGd0KTsKIAorCWlmIChwYXJlbnRfdGd0ICE9IHRndCkgeworCQlyYyA9IGxtdl9lYXJseV9jYW5jZWwoZXhwLCBwYXJlbnRfdGd0LCBvcF9kYXRhLCB0Z3QtPmx0ZF9pZHgsCisJCQkJICAgICAgTENLX0VYLCBNRFNfSU5PREVMT0NLX0xPT0tVUCwKKwkJCQkgICAgICBNRl9NRENfQ0FOQ0VMX0ZJRDMpOworCX0KKworCXJjID0gbG12X2Vhcmx5X2NhbmNlbChleHAsIE5VTEwsIG9wX2RhdGEsIHRndC0+bHRkX2lkeCwgTENLX0VYLAorCQkJICAgICAgTURTX0lOT0RFTE9DS19GVUxMLCBNRl9NRENfQ0FOQ0VMX0ZJRDMpOwogCWlmIChyYyAhPSAwKQogCQlyZXR1cm4gcmM7CiAKLQlDREVCVUcoRF9JTk9ERSwgInVubGluayB3aXRoIGZpZD0iREZJRCIvIkRGSUQiIC0+IG1kcyAjJWRcbiIsCisJQ0RFQlVHKERfSU5PREUsICJ1bmxpbmsgd2l0aCBmaWQ9IiBERklEICIvIiBERklEICIgLT4gbWRzICMldVxuIiwKIAkgICAgICAgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDIpLCB0Z3QtPmx0ZF9pZHgpOwogCiAJcmMgPSBtZF91bmxpbmsodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCByZXF1ZXN0KTsKLQlpZiAocmMgIT0gMCAmJiByYyAhPSAtRVJFTU9URSkKKwlpZiAocmMgIT0gMCAmJiByYyAhPSAtRVJFTU9URSAgJiYgcmMgIT0gLUVOT0VOVCkKIAkJcmV0dXJuIHJjOwogCisJLyogVHJ5IG5leHQgc3RyaXBlIGlmIGl0IGlzIG5lZWRlZC4gKi8KKwlpZiAocmMgPT0gLUVOT0VOVCAmJiBsc20gJiYgbG12X25lZWRfdHJ5X2FsbF9zdHJpcGVzKGxzbSkpIHsKKwkJc3RydWN0IGxtdl9vaW5mbyAqb2luZm87CisKKwkJc3RyaXBlX2luZGV4Kys7CisJCWlmIChzdHJpcGVfaW5kZXggPj0gbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50KQorCQkJcmV0dXJuIHJjOworCisJCW9pbmZvID0gJmxzbS0+bHNtX21kX29pbmZvW3N0cmlwZV9pbmRleF07CisKKwkJb3BfZGF0YS0+b3BfZmlkMSA9IG9pbmZvLT5sbW9fZmlkOworCQlvcF9kYXRhLT5vcF9tZHMgPSBvaW5mby0+bG1vX21kczsKKworCQlwdGxycGNfcmVxX2ZpbmlzaGVkKCpyZXF1ZXN0KTsKKwkJKnJlcXVlc3QgPSBOVUxMOworCisJCWdvdG8gdHJ5X25leHRfc3RyaXBlOworCX0KKwogCWJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCYoKnJlcXVlc3QpLT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKIAlpZiAoIWJvZHkpCiAJCXJldHVybiAtRVBST1RPOwogCiAJLyogTm90IGNyb3NzLXJlZiBjYXNlLCBqdXN0IGdldCBvdXQgb2YgaGVyZS4gKi8KLQlpZiAobGlrZWx5KCEoYm9keS0+dmFsaWQgJiBPQkRfTURfTURTKSkpCi0JCXJldHVybiAwOworCWlmIChsaWtlbHkoIShib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfTURTKSkpCisJCXJldHVybiByYzsKIAogCUNERUJVRyhEX0lOT0RFLCAiJXM6IHRyeSB1bmxpbmsgdG8gYW5vdGhlciBNRFQgZm9yICJERklEIlxuIiwKLQkgICAgICAgZXhwLT5leHBfb2JkLT5vYmRfbmFtZSwgUEZJRCgmYm9keS0+ZmlkMSkpOworCSAgICAgICBleHAtPmV4cF9vYmQtPm9iZF9uYW1lLCBQRklEKCZib2R5LT5tYm9fZmlkMSkpOwogCiAJLyogVGhpcyBpcyBhIHJlbW90ZSBvYmplY3QsIHRyeSByZW1vdGUgTURULCBOb3RlOiBpdCBtYXkKIAkgKiB0cnkgbW9yZSB0aGFuIDEgdGltZSBoZXJlLCBDb25zaWRlcmluZyBmb2xsb3dpbmcgY2FzZQpAQCAtMjI0NywxMSArMjYxNiwxMSBAQAogCSAqIEluIHRoZW9yeSwgaXQgbWlnaHQgdHJ5IHVubGltaXRlZCB0aW1lIGhlcmUsIGJ1dCBpdCBzaG91bGQKIAkgKiBiZSB2ZXJ5IHJhcmUgY2FzZS4KIAkgKi8KLQlvcF9kYXRhLT5vcF9maWQyID0gYm9keS0+ZmlkMTsKKwlvcF9kYXRhLT5vcF9maWQyID0gYm9keS0+bWJvX2ZpZDE7CiAJcHRscnBjX3JlcV9maW5pc2hlZCgqcmVxdWVzdCk7CiAJKnJlcXVlc3QgPSBOVUxMOwogCi0JZ290byByZXRyeTsKKwlnb3RvIHJldHJ5X3VubGluazsKIH0KIAogc3RhdGljIGludCBsbXZfcHJlY2xlYW51cChzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkLCBlbnVtIG9iZF9jbGVhbnVwX3N0YWdlIHN0YWdlKQpAQCAtMjI3NCw2ICsyNjQzLDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogR2V0IGJ5IGtleSBhIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIExNViBkZXZpY2UuCisgKgorICogRGlzcGF0Y2ggcmVxdWVzdCB0byBsb3dlci1sYXllciBkZXZpY2VzIGFzIG5lZWRlZC4KKyAqCisgKiBccGFyYW1baW5dICBlbnYJZXhlY3V0aW9uIGVudmlyb25tZW50IGZvciB0aGlzIHRocmVhZAorICogXHBhcmFtW2luXSAgZXhwCWV4cG9ydCBmb3IgdGhlIExNViBkZXZpY2UKKyAqIFxwYXJhbVtpbl0gIGtleWxlbglsZW5ndGggb2Yga2V5IGlkZW50aWZpZXIKKyAqIFxwYXJhbVtpbl0gIGtleQlpZGVudGlmaWVyIG9mIGtleSB0byBnZXQgdmFsdWUgZm9yCisgKiBccGFyYW1baW5dICB2YWxsZW4Jc2l6ZSBvZiBcYSB2YWwKKyAqIFxwYXJhbVtvdXRdIHZhbAlwb2ludGVyIHRvIHN0b3JhZ2UgbG9jYXRpb24gZm9yIHZhbHVlCisgKiBccGFyYW1baW5dICBsc20Jb3B0aW9uYWwgc3RyaXBpbmcgbWV0YWRhdGEgb2Ygb2JqZWN0CisgKgorICogXHJldHZhbCAwCQlvbiBzdWNjZXNzCisgKiBccmV0dmFsIG5lZ2F0aXZlCW5lZ2F0ZWQgZXJybm8gb24gZmFpbHVyZQorICovCiBzdGF0aWMgaW50IGxtdl9nZXRfaW5mbyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCQlfX3UzMiBrZXlsZW4sIHZvaWQgKmtleSwgX191MzIgKnZhbGxlbiwgdm9pZCAqdmFsLAogCQkJc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSkKQEAgLTIzMzcsNiArMjcyMiwyMiBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCisvKioKKyAqIEFzeW5jaHJvbm91c2x5IHNldCBieSBrZXkgYSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBMTVYgZGV2aWNlLgorICoKKyAqIERpc3BhdGNoIHJlcXVlc3QgdG8gbG93ZXItbGF5ZXIgZGV2aWNlcyBhcyBuZWVkZWQuCisgKgorICogXHBhcmFtW2luXSBlbnYJZXhlY3V0aW9uIGVudmlyb25tZW50IGZvciB0aGlzIHRocmVhZAorICogXHBhcmFtW2luXSBleHAJZXhwb3J0IGZvciB0aGUgTE1WIGRldmljZQorICogXHBhcmFtW2luXSBrZXlsZW4JbGVuZ3RoIG9mIGtleSBpZGVudGlmaWVyCisgKiBccGFyYW1baW5dIGtleQlpZGVudGlmaWVyIG9mIGtleSB0byBzdG9yZSB2YWx1ZSBmb3IKKyAqIFxwYXJhbVtpbl0gdmFsbGVuCXNpemUgb2YgdmFsdWUgdG8gc3RvcmUKKyAqIFxwYXJhbVtpbl0gdmFsCXBvaW50ZXIgdG8gZGF0YSB0byBiZSBzdG9yZWQKKyAqIFxwYXJhbVtpbl0gc2V0CW9wdGlvbmFsIGxpc3Qgb2YgcmVsYXRlZCBwdGxycGMgcmVxdWVzdHMKKyAqCisgKiBccmV0dmFsIDAJCW9uIHN1Y2Nlc3MKKyAqIFxyZXR2YWwgbmVnYXRpdmUJbmVnYXRlZCBlcnJubyBvbiBmYWlsdXJlCisgKi8KIHN0YXRpYyBpbnQgbG12X3NldF9pbmZvX2FzeW5jKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKIAkJCSAgICAgIHUzMiBrZXlsZW4sIHZvaWQgKmtleSwgdTMyIHZhbGxlbiwKIAkJCSAgICAgIHZvaWQgKnZhbCwgc3RydWN0IHB0bHJwY19yZXF1ZXN0X3NldCAqc2V0KQpAQCAtMjM1NCw3ICsyNzU1LDggQEAKIAl9CiAJbG12ID0gJm9iZC0+dS5sbXY7CiAKLQlpZiAoS0VZX0lTKEtFWV9SRUFEX09OTFkpIHx8IEtFWV9JUyhLRVlfRkxVU0hfQ1RYKSkgeworCWlmIChLRVlfSVMoS0VZX1JFQURfT05MWSkgfHwgS0VZX0lTKEtFWV9GTFVTSF9DVFgpIHx8CisJICAgIEtFWV9JUyhLRVlfREVGQVVMVF9FQVNJWkUpKSB7CiAJCWludCBpLCBlcnIgPSAwOwogCiAJCWZvciAoaSA9IDA7IGkgPCBsbXYtPmRlc2MubGRfdGd0X2NvdW50OyBpKyspIHsKQEAgLTIzNzUsMTA1ICsyNzc3LDI0NyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IGxtdl9wYWNrbWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9tZHNfbWQgKipsbW1wLAotCQkgICAgICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQorc3RhdGljIGludCBsbXZfcGFja19tZF92MShjb25zdCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtLAorCQkJICBzdHJ1Y3QgbG12X21kc19tZF92MSAqbG1tMSkKIHsKLQlzdHJ1Y3Qgb2JkX2RldmljZQkgKm9iZCA9IGNsYXNzX2V4cDJvYmQoZXhwKTsKLQlzdHJ1Y3QgbG12X29iZAkgICAgKmxtdiA9ICZvYmQtPnUubG12OwotCXN0cnVjdCBsbXZfc3RyaXBlX21kICAgICAgKm1lYXA7Ci0Jc3RydWN0IGxtdl9zdHJpcGVfbWQgICAgICAqbHNtcDsKLQlpbnQJCQltZWFfc2l6ZTsKLQlpbnQJCQlpOworCWludCBjcGxlbjsKKwlpbnQgaTsKIAotCW1lYV9zaXplID0gbG12X2dldF9lYXNpemUobG12KTsKLQlpZiAoIWxtbXApCi0JCXJldHVybiBtZWFfc2l6ZTsKKwlsbW0xLT5sbXZfbWFnaWMgPSBjcHVfdG9fbGUzMihsc20tPmxzbV9tZF9tYWdpYyk7CisJbG1tMS0+bG12X3N0cmlwZV9jb3VudCA9IGNwdV90b19sZTMyKGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudCk7CisJbG1tMS0+bG12X21hc3Rlcl9tZHRfaW5kZXggPSBjcHVfdG9fbGUzMihsc20tPmxzbV9tZF9tYXN0ZXJfbWR0X2luZGV4KTsKKwlsbW0xLT5sbXZfaGFzaF90eXBlID0gY3B1X3RvX2xlMzIobHNtLT5sc21fbWRfaGFzaF90eXBlKTsKKwljcGxlbiA9IHN0cmxjcHkobG1tMS0+bG12X3Bvb2xfbmFtZSwgbHNtLT5sc21fbWRfcG9vbF9uYW1lLAorCQkJc2l6ZW9mKGxtbTEtPmxtdl9wb29sX25hbWUpKTsKKwlpZiAoY3BsZW4gPj0gc2l6ZW9mKGxtbTEtPmxtdl9wb29sX25hbWUpKQorCQlyZXR1cm4gLUUyQklHOwogCisJZm9yIChpID0gMDsgaSA8IGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudDsgaSsrKQorCQlmaWRfY3B1X3RvX2xlKCZsbW0xLT5sbXZfc3RyaXBlX2ZpZHNbaV0sCisJCQkgICAgICAmbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX2ZpZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2xtdl9wYWNrX21kKHVuaW9uIGxtdl9tZHNfbWQgKipsbW1wLCBjb25zdCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtLAorCSAgICBpbnQgc3RyaXBlX2NvdW50KQoreworCWludCBsbW1fc2l6ZSA9IDAsIHJjID0gMDsKKwlib29sIGFsbG9jYXRlZCA9IGZhbHNlOworCisJTEFTU0VSVChsbW1wKTsKKworCS8qIEZyZWUgbG1tICovCiAJaWYgKCpsbW1wICYmICFsc20pIHsKKwkJaW50IHN0cmlwZV9jbnQ7CisKKwkJc3RyaXBlX2NudCA9IGxtdl9tZHNfbWRfc3RyaXBlX2NvdW50X2dldCgqbG1tcCk7CisJCWxtbV9zaXplID0gbG12X21kc19tZF9zaXplKHN0cmlwZV9jbnQsCisJCQkJCSAgIGxlMzJfdG9fY3B1KCgqbG1tcCktPmxtdl9tYWdpYykpOworCQlpZiAoIWxtbV9zaXplKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWt2ZnJlZSgqbG1tcCk7CiAJCSpsbW1wID0gTlVMTDsKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKCEqbG1tcCkgewotCQkqbG1tcCA9IGxpYmNmc19rdnphbGxvYyhtZWFfc2l6ZSwgR0ZQX05PRlMpOworCS8qIEFsbG9jIGxtbSAqLworCWlmICghKmxtbXAgJiYgIWxzbSkgeworCQlsbW1fc2l6ZSA9IGxtdl9tZHNfbWRfc2l6ZShzdHJpcGVfY291bnQsIExNVl9NQUdJQyk7CisJCUxBU1NFUlQobG1tX3NpemUgPiAwKTsKKwkJKmxtbXAgPSBsaWJjZnNfa3Z6YWxsb2MobG1tX3NpemUsIEdGUF9OT0ZTKTsKIAkJaWYgKCEqbG1tcCkKIAkJCXJldHVybiAtRU5PTUVNOworCQlsbXZfbWRzX21kX3N0cmlwZV9jb3VudF9zZXQoKmxtbXAsIHN0cmlwZV9jb3VudCk7CisJCSgqbG1tcCktPmxtdl9tYWdpYyA9IGNwdV90b19sZTMyKExNVl9NQUdJQyk7CisJCXJldHVybiBsbW1fc2l6ZTsKIAl9CiAKLQlpZiAoIWxzbSkKLQkJcmV0dXJuIG1lYV9zaXplOwotCi0JbHNtcCA9IChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKWxzbTsKLQltZWFwID0gKHN0cnVjdCBsbXZfc3RyaXBlX21kICopKmxtbXA7Ci0KLQlpZiAobHNtcC0+bWVhX21hZ2ljICE9IE1FQV9NQUdJQ19MQVNUX0NIQVIgJiYKLQkgICAgbHNtcC0+bWVhX21hZ2ljICE9IE1FQV9NQUdJQ19BTExfQ0hBUlMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWVhcC0+bWVhX21hZ2ljID0gY3B1X3RvX2xlMzIobHNtcC0+bWVhX21hZ2ljKTsKLQltZWFwLT5tZWFfY291bnQgPSBjcHVfdG9fbGUzMihsc21wLT5tZWFfY291bnQpOwotCW1lYXAtPm1lYV9tYXN0ZXIgPSBjcHVfdG9fbGUzMihsc21wLT5tZWFfbWFzdGVyKTsKLQotCWZvciAoaSA9IDA7IGkgPCBsbXYtPmRlc2MubGRfdGd0X2NvdW50OyBpKyspIHsKLQkJbWVhcC0+bWVhX2lkc1tpXSA9IGxzbXAtPm1lYV9pZHNbaV07Ci0JCWZpZF9jcHVfdG9fbGUoJm1lYXAtPm1lYV9pZHNbaV0sICZsc21wLT5tZWFfaWRzW2ldKTsKKwkvKiBwYWNrIGxtbSAqLworCUxBU1NFUlQobHNtKTsKKwlsbW1fc2l6ZSA9IGxtdl9tZHNfbWRfc2l6ZShsc20tPmxzbV9tZF9zdHJpcGVfY291bnQsCisJCQkJICAgbHNtLT5sc21fbWRfbWFnaWMpOworCWlmICghKmxtbXApIHsKKwkJKmxtbXAgPSBsaWJjZnNfa3Z6YWxsb2MobG1tX3NpemUsIEdGUF9OT0ZTKTsKKwkJaWYgKCEqbG1tcCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlhbGxvY2F0ZWQgPSB0cnVlOwogCX0KIAotCXJldHVybiBtZWFfc2l6ZTsKKwlzd2l0Y2ggKGxzbS0+bHNtX21kX21hZ2ljKSB7CisJY2FzZSBMTVZfTUFHSUNfVjE6CisJCXJjID0gbG12X3BhY2tfbWRfdjEobHNtLCAmKCpsbW1wKS0+bG12X21kX3YxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlpZiAocmMgJiYgYWxsb2NhdGVkKSB7CisJCWt2ZnJlZSgqbG1tcCk7CisJCSpsbW1wID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gbG1tX3NpemU7CiB9CiAKLXN0YXRpYyBpbnQgbG12X3VucGFja21kKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqbHNtcCwKLQkJCXN0cnVjdCBsb3ZfbWRzX21kICpsbW0sIGludCBsbW1fc2l6ZSkKK3N0YXRpYyBpbnQgbG12X3VucGFja19tZF92MShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtLAorCQkJICAgIGNvbnN0IHN0cnVjdCBsbXZfbWRzX21kX3YxICpsbW0xKQogewotCXN0cnVjdCBvYmRfZGV2aWNlCSAgKm9iZCA9IGNsYXNzX2V4cDJvYmQoZXhwKTsKLQlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAgICAgICoqdG1lYSA9IChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKilsc21wOwotCXN0cnVjdCBsbXZfc3RyaXBlX21kICAgICAgICptZWEgPSAoc3RydWN0IGxtdl9zdHJpcGVfbWQgKilsbW07Ci0Jc3RydWN0IGxtdl9vYmQJICAgICAqbG12ID0gJm9iZC0+dS5sbXY7Ci0JaW50CQkJIG1lYV9zaXplOwotCWludAkJCSBpOwotCV9fdTMyCQkgICAgICAgbWFnaWM7CisJc3RydWN0IGxtdl9vYmQgKmxtdiA9ICZleHAtPmV4cF9vYmQtPnUubG12OworCWludCBzdHJpcGVfY291bnQ7CisJaW50IHJjID0gMDsKKwlpbnQgY3BsZW47CisJaW50IGk7CiAKLQltZWFfc2l6ZSA9IGxtdl9nZXRfZWFzaXplKGxtdik7Ci0JaWYgKCFsc21wKQotCQlyZXR1cm4gbWVhX3NpemU7CisJbHNtLT5sc21fbWRfbWFnaWMgPSBsZTMyX3RvX2NwdShsbW0xLT5sbXZfbWFnaWMpOworCWxzbS0+bHNtX21kX3N0cmlwZV9jb3VudCA9IGxlMzJfdG9fY3B1KGxtbTEtPmxtdl9zdHJpcGVfY291bnQpOworCWxzbS0+bHNtX21kX21hc3Rlcl9tZHRfaW5kZXggPSBsZTMyX3RvX2NwdShsbW0xLT5sbXZfbWFzdGVyX21kdF9pbmRleCk7CisJaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX1VOS05PV05fTE1WX1NUUklQRSkpCisJCWxzbS0+bHNtX21kX2hhc2hfdHlwZSA9IExNVl9IQVNIX1RZUEVfVU5LTk9XTjsKKwllbHNlCisJCWxzbS0+bHNtX21kX2hhc2hfdHlwZSA9IGxlMzJfdG9fY3B1KGxtbTEtPmxtdl9oYXNoX3R5cGUpOworCWxzbS0+bHNtX21kX2xheW91dF92ZXJzaW9uID0gbGUzMl90b19jcHUobG1tMS0+bG12X2xheW91dF92ZXJzaW9uKTsKKwljcGxlbiA9IHN0cmxjcHkobHNtLT5sc21fbWRfcG9vbF9uYW1lLCBsbW0xLT5sbXZfcG9vbF9uYW1lLAorCQkJc2l6ZW9mKGxzbS0+bHNtX21kX3Bvb2xfbmFtZSkpOwogCi0JaWYgKCpsc21wICYmICFsbW0pIHsKLQkJa3ZmcmVlKCp0bWVhKTsKKwlpZiAoY3BsZW4gPj0gc2l6ZW9mKGxzbS0+bHNtX21kX3Bvb2xfbmFtZSkpCisJCXJldHVybiAtRTJCSUc7CisKKwlDREVCVUcoRF9JTkZPLCAidW5wYWNrIGxzbSBjb3VudCAlZCwgbWFzdGVyICVkIGhhc2hfdHlwZSAlZCBsYXlvdXRfdmVyc2lvbiAlZFxuIiwKKwkgICAgICAgbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50LCBsc20tPmxzbV9tZF9tYXN0ZXJfbWR0X2luZGV4LAorCSAgICAgICBsc20tPmxzbV9tZF9oYXNoX3R5cGUsIGxzbS0+bHNtX21kX2xheW91dF92ZXJzaW9uKTsKKworCXN0cmlwZV9jb3VudCA9IGxlMzJfdG9fY3B1KGxtbTEtPmxtdl9zdHJpcGVfY291bnQpOworCWZvciAoaSA9IDA7IGkgPCBzdHJpcGVfY291bnQ7IGkrKykgeworCQlmaWRfbGVfdG9fY3B1KCZsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fZmlkLAorCQkJICAgICAgJmxtbTEtPmxtdl9zdHJpcGVfZmlkc1tpXSk7CisJCXJjID0gbG12X2ZsZF9sb29rdXAobG12LCAmbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX2ZpZCwKKwkJCQkgICAgJmxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19tZHMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJCUNERUJVRyhEX0lORk8sICJ1bnBhY2sgZmlkICMlZCAiREZJRCJcbiIsIGksCisJCSAgICAgICBQRklEKCZsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fZmlkKSk7CisJfQorCisJcmV0dXJuIHJjOworfQorCitpbnQgbG12X3VucGFja19tZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKmxzbXAsCisJCSAgY29uc3QgdW5pb24gbG12X21kc19tZCAqbG1tLCBpbnQgc3RyaXBlX2NvdW50KQoreworCXN0cnVjdCBsbXZfc3RyaXBlX21kICpsc207CisJYm9vbCBhbGxvY2F0ZWQgPSBmYWxzZTsKKwlpbnQgbHNtX3NpemUsIHJjOworCisJTEFTU0VSVChsc21wKTsKKworCWxzbSA9ICpsc21wOworCS8qIEZyZWUgbWVtbWQgKi8KKwlpZiAobHNtICYmICFsbW0pIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMTsgaSA8IGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudDsgaSsrKSB7CisJCQkvKgorCQkJICogRm9yIG1pZ3JhdGluZyBpbm9kZSwgdGhlIG1hc3RlciBzdHJpcGUgYW5kIG1hc3RlcgorCQkJICogb2JqZWN0IHdpbGwgYmUgdGhlIHNhbWUsIHNvIGRvIG5vdCBuZWVkIGlwdXQsIHNlZQorCQkJICogbGxfdXBkYXRlX2xzbV9tZAorCQkJICovCisJCQlpZiAoIShsc20tPmxzbV9tZF9oYXNoX3R5cGUgJiBMTVZfSEFTSF9GTEFHX01JR1JBVElPTiAmJgorCQkJICAgICAgIWkpICYmIGxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19yb290KQorCQkJCWlwdXQobHNtLT5sc21fbWRfb2luZm9baV0ubG1vX3Jvb3QpOworCQl9CisKKwkJa3ZmcmVlKGxzbSk7CiAJCSpsc21wID0gTlVMTDsKIAkJcmV0dXJuIDA7CiAJfQogCi0JTEFTU0VSVChtZWFfc2l6ZSA9PSBsbW1fc2l6ZSk7CisJLyogQWxsb2MgbWVtbWQgKi8KKwlpZiAoIWxzbSAmJiAhbG1tKSB7CisJCWxzbV9zaXplID0gbG12X3N0cmlwZV9tZF9zaXplKHN0cmlwZV9jb3VudCk7CisJCWxzbSA9IGxpYmNmc19rdnphbGxvYyhsc21fc2l6ZSwgR0ZQX05PRlMpOworCQlpZiAoIWxzbSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlsc20tPmxzbV9tZF9zdHJpcGVfY291bnQgPSBzdHJpcGVfY291bnQ7CisJCSpsc21wID0gbHNtOworCQlyZXR1cm4gMDsKKwl9CiAKLQkqdG1lYSA9IGxpYmNmc19rdnphbGxvYyhtZWFfc2l6ZSwgR0ZQX05PRlMpOwotCWlmICghKnRtZWEpCi0JCXJldHVybiAtRU5PTUVNOworCWlmIChsZTMyX3RvX2NwdShsbW0tPmxtdl9tYWdpYykgPT0gTE1WX01BR0lDX1NUUklQRSkKKwkJcmV0dXJuIC1FUEVSTTsKIAotCWlmICghbG1tKQotCQlyZXR1cm4gbWVhX3NpemU7CisJLyogVW5wYWNrIG1lbW1kICovCisJaWYgKGxlMzJfdG9fY3B1KGxtbS0+bG12X21hZ2ljKSAhPSBMTVZfTUFHSUNfVjEgJiYKKwkgICAgbGUzMl90b19jcHUobG1tLT5sbXZfbWFnaWMpICE9IExNVl9VU0VSX01BR0lDKSB7CisJCUNFUlJPUigiJXM6IGludmFsaWQgbG12IG1hZ2ljICV4OiByYyA9ICVkXG4iLAorCQkgICAgICAgZXhwLT5leHBfb2JkLT5vYmRfbmFtZSwgbGUzMl90b19jcHUobG1tLT5sbXZfbWFnaWMpLAorCQkgICAgICAgLUVJTyk7CisJCXJldHVybiAtRUlPOworCX0KIAotCWlmIChtZWEtPm1lYV9tYWdpYyA9PSBNRUFfTUFHSUNfTEFTVF9DSEFSIHx8Ci0JICAgIG1lYS0+bWVhX21hZ2ljID09IE1FQV9NQUdJQ19BTExfQ0hBUlMgfHwKLQkgICAgbWVhLT5tZWFfbWFnaWMgPT0gTUVBX01BR0lDX0hBU0hfU0VHTUVOVCkgewotCQltYWdpYyA9IGxlMzJfdG9fY3B1KG1lYS0+bWVhX21hZ2ljKTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBPbGQgbWVhIGlzIG5vdCBoYW5kbGVkIGhlcmUuCisJaWYgKGxlMzJfdG9fY3B1KGxtbS0+bG12X21hZ2ljKSA9PSBMTVZfTUFHSUNfVjEpCisJCWxzbV9zaXplID0gbG12X3N0cmlwZV9tZF9zaXplKGxtdl9tZHNfbWRfc3RyaXBlX2NvdW50X2dldChsbW0pKTsKKwllbHNlCisJCS8qKgorCQkgKiBVbnBhY2sgZGVmYXVsdCBkaXJzdHJpcGUobG12X3VzZXJfbWQpIHRvIGxtdl9zdHJpcGVfbWQsCisJCSAqIHN0cmlwZWNvdW50IHNob3VsZCBiZSAwIHRoZW4uCiAJCSAqLwotCQlDRVJST1IoIk9sZCBub3Qgc3VwcG9ydGFibGUgRUEgaXMgZm91bmRcbiIpOwotCQlMQlVHKCk7CisJCWxzbV9zaXplID0gbG12X3N0cmlwZV9tZF9zaXplKDApOworCisJaWYgKCFsc20pIHsKKwkJbHNtID0gbGliY2ZzX2t2emFsbG9jKGxzbV9zaXplLCBHRlBfTk9GUyk7CisJCWlmICghbHNtKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWFsbG9jYXRlZCA9IHRydWU7CisJCSpsc21wID0gbHNtOwogCX0KIAotCSgqdG1lYSktPm1lYV9tYWdpYyA9IG1hZ2ljOwotCSgqdG1lYSktPm1lYV9jb3VudCA9IGxlMzJfdG9fY3B1KG1lYS0+bWVhX2NvdW50KTsKLQkoKnRtZWEpLT5tZWFfbWFzdGVyID0gbGUzMl90b19jcHUobWVhLT5tZWFfbWFzdGVyKTsKLQotCWZvciAoaSA9IDA7IGkgPCAoKnRtZWEpLT5tZWFfY291bnQ7IGkrKykgewotCQkoKnRtZWEpLT5tZWFfaWRzW2ldID0gbWVhLT5tZWFfaWRzW2ldOwotCQlmaWRfbGVfdG9fY3B1KCYoKnRtZWEpLT5tZWFfaWRzW2ldLCAmKCp0bWVhKS0+bWVhX2lkc1tpXSk7CisJc3dpdGNoIChsZTMyX3RvX2NwdShsbW0tPmxtdl9tYWdpYykpIHsKKwljYXNlIExNVl9NQUdJQ19WMToKKwkJcmMgPSBsbXZfdW5wYWNrX21kX3YxKGV4cCwgbHNtLCAmbG1tLT5sbXZfbWRfdjEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlDRVJST1IoIiVzOiB1bnJlY29nbml6ZWQgbWFnaWMgJXhcbiIsIGV4cC0+ZXhwX29iZC0+b2JkX25hbWUsCisJCSAgICAgICBsZTMyX3RvX2NwdShsbW0tPmxtdl9tYWdpYykpOworCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOwogCX0KLQlyZXR1cm4gbWVhX3NpemU7CisKKwlpZiAocmMgJiYgYWxsb2NhdGVkKSB7CisJCWt2ZnJlZShsc20pOworCQkqbHNtcCA9IE5VTEw7CisJCWxzbV9zaXplID0gcmM7CisJfQorCXJldHVybiBsc21fc2l6ZTsKK30KK0VYUE9SVF9TWU1CT0wobG12X3VucGFja19tZCk7CisKK3N0YXRpYyBpbnQgbG12X3VucGFja21kKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqbHNtcCwKKwkJCXN0cnVjdCBsb3ZfbWRzX21kICpsbW0sIGludCBkaXNrX2xlbikKK3sKKwlyZXR1cm4gbG12X3VucGFja19tZChleHAsIChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKilsc21wLAorCQkJICAgICAodW5pb24gbG12X21kc19tZCAqKWxtbSwgZGlza19sZW4pOworfQorCitzdGF0aWMgaW50IGxtdl9wYWNrbWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9tZHNfbWQgKipsbW1wLAorCQkgICAgICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQoreworCWNvbnN0IHN0cnVjdCBsbXZfc3RyaXBlX21kICpsbXYgPSAoc3RydWN0IGxtdl9zdHJpcGVfbWQgKilsc207CisJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IGV4cC0+ZXhwX29iZDsKKwlzdHJ1Y3QgbG12X29iZCAqbG12X29iZCA9ICZvYmQtPnUubG12OworCWludCBzdHJpcGVfY291bnQ7CisKKwlpZiAoIWxtbXApIHsKKwkJaWYgKGxzbSkKKwkJCXN0cmlwZV9jb3VudCA9IGxtdi0+bHNtX21kX3N0cmlwZV9jb3VudDsKKwkJZWxzZQorCQkJc3RyaXBlX2NvdW50ID0gbG12X29iZC0+ZGVzYy5sZF90Z3RfY291bnQ7CisKKwkJcmV0dXJuIGxtdl9tZHNfbWRfc2l6ZShzdHJpcGVfY291bnQsIExNVl9NQUdJQ19WMSk7CisJfQorCisJcmV0dXJuIGxtdl9wYWNrX21kKCh1bmlvbiBsbXZfbWRzX21kICoqKWxtbXAsIGxtdiwgMCk7CiB9CiAKIHN0YXRpYyBpbnQgbG12X2NhbmNlbF91bnVzZWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLApAQCAtMjQ4NCw3ICszMDI4LDcgQEAKIAlzdHJ1Y3QgbG12X29iZAkgICpsbXYgPSAmb2JkLT51LmxtdjsKIAlpbnQJCSAgICAgIHJjID0gMDsKIAlpbnQJCSAgICAgIGVycjsKLQlpbnQJCSAgICAgIGk7CisJdTMyIGk7CiAKIAlMQVNTRVJUKGZpZCk7CiAKQEAgLTI1MDIsOCArMzA0Niw5IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGxtdl9zZXRfbG9ja19kYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIF9fdTY0ICpsb2NraCwgdm9pZCAqZGF0YSwKLQkJCSAgICAgX191NjQgKmJpdHMpCitzdGF0aWMgaW50IGxtdl9zZXRfbG9ja19kYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCwKKwkJCSAgICAgdm9pZCAqZGF0YSwgX191NjQgKmJpdHMpCiB7CiAJc3RydWN0IGxtdl9vYmQJICAqbG12ID0gJmV4cC0+ZXhwX29iZC0+dS5sbXY7CiAJc3RydWN0IGxtdl90Z3RfZGVzYyAqdGd0ID0gbG12LT50Z3RzWzBdOwpAQCAtMjUyNiwyNCArMzA3MSwzMiBAQAogCXN0cnVjdCBvYmRfZGV2aWNlICAgICAgICpvYmQgPSBleHAtPmV4cF9vYmQ7CiAJc3RydWN0IGxtdl9vYmQJICAqbG12ID0gJm9iZC0+dS5sbXY7CiAJZW51bSBsZGxtX21vZGUJICAgICAgcmM7Ci0JaW50CQkgICAgICBpOworCWludCB0Z3Q7CisJdTMyIGk7CiAKIAlDREVCVUcoRF9JTk9ERSwgIkxvY2sgbWF0Y2ggZm9yICJERklEIlxuIiwgUEZJRChmaWQpKTsKIAogCS8qCi0JICogV2l0aCBDTUQgZXZlcnkgb2JqZWN0IGNhbiBoYXZlIHR3byBsb2NrcyBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlczoKLQkgKiBsb29rdXAgbG9jayBpbiBzcGFjZSBvZiBtZHMgc3RvcmluZyBkaXJlbnRyeSBhbmQgdXBkYXRlL29wZW4gbG9jayBpbgotCSAqIHNwYWNlIG9mIG1kcyBzdG9yaW5nIGlub2RlLiBUaHVzIHdlIGNoZWNrIGFsbCB0YXJnZXRzLCBub3Qgb25seSB0aGF0Ci0JICogb25lIGZpZCB3YXMgY3JlYXRlZCBpbi4KKwkgKiBXaXRoIERORSBldmVyeSBvYmplY3QgY2FuIGhhdmUgdHdvIGxvY2tzIGluIGRpZmZlcmVudCBuYW1lc3BhY2VzOgorCSAqIGxvb2t1cCBsb2NrIGluIHNwYWNlIG9mIE1EVCBzdG9yaW5nIGRpcmVudHJ5IGFuZCB1cGRhdGUvb3BlbiBsb2NrIGluCisJICogc3BhY2Ugb2YgTURUIHN0b3JpbmcgaW5vZGUuICBUcnkgdGhlIE1EVCB0aGF0IHRoZSBGSUQgbWFwcyB0byBmaXJzdCwKKwkgKiBzaW5jZSB0aGlzIGNhbiBiZSBlYXNpbHkgZm91bmQsIGFuZCBvbmx5IHRyeSBvdGhlcnMgaWYgdGhhdCBmYWlscy4KIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbG12LT5kZXNjLmxkX3RndF9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndCA9IGxtdi0+dGd0c1tpXTsKKwlmb3IgKGkgPSAwLCB0Z3QgPSBsbXZfZmluZF90YXJnZXRfaW5kZXgobG12LCBmaWQpOworCSAgICAgaSA8IGxtdi0+ZGVzYy5sZF90Z3RfY291bnQ7CisJICAgICBpKyssIHRndCA9ICh0Z3QgKyAxKSAlIGxtdi0+ZGVzYy5sZF90Z3RfY291bnQpIHsKKwkJaWYgKHRndCA8IDApIHsKKwkJCUNERUJVRyhEX0hBLCAiJXM6ICJERklEIiBpcyBpbmFjY2Vzc2libGU6IHJjID0gJWRcbiIsCisJCQkgICAgICAgb2JkLT5vYmRfbmFtZSwgUEZJRChmaWQpLCB0Z3QpOworCQkJdGd0ID0gMDsKKwkJfQogCi0JCWlmICghdGd0IHx8ICF0Z3QtPmx0ZF9leHAgfHwgIXRndC0+bHRkX2FjdGl2ZSkKKwkJaWYgKCFsbXYtPnRndHNbdGd0XSB8fCAhbG12LT50Z3RzW3RndF0tPmx0ZF9leHAgfHwKKwkJICAgICFsbXYtPnRndHNbdGd0XS0+bHRkX2FjdGl2ZSkKIAkJCWNvbnRpbnVlOwogCi0JCXJjID0gbWRfbG9ja19tYXRjaCh0Z3QtPmx0ZF9leHAsIGZsYWdzLCBmaWQsIHR5cGUsIHBvbGljeSwgbW9kZSwKLQkJCQkgICBsb2NraCk7CisJCXJjID0gbWRfbG9ja19tYXRjaChsbXYtPnRndHNbdGd0XS0+bHRkX2V4cCwgZmxhZ3MsIGZpZCwKKwkJCQkgICB0eXBlLCBwb2xpY3ksIG1vZGUsIGxvY2toKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwogCX0KQEAgLTI1NzEsOCArMzEyNCwxMCBAQAogCXN0cnVjdCBsbXZfb2JkCSAgKmxtdiA9ICZvYmQtPnUubG12OwogCXN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndCA9IGxtdi0+dGd0c1swXTsKIAotCWlmIChtZC0+bWVhKQotCQlvYmRfZnJlZV9tZW1tZChleHAsICh2b2lkICopJm1kLT5tZWEpOworCWlmIChtZC0+bG12KSB7CisJCWxtdl9mcmVlX21lbW1kKG1kLT5sbXYpOworCQltZC0+bG12ID0gTlVMTDsKKwl9CiAJaWYgKCF0Z3QgfHwgIXRndC0+bHRkX2V4cCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIG1kX2ZyZWVfbHVzdHJlX21kKHRndC0+bHRkX2V4cCwgbWQpOwpAQCAtMjYyMSw3ICszMTc2LDcgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsICZvcF9kYXRhLT5vcF9maWQxKTsKKwl0Z3QgPSBsbXZfbG9jYXRlX21kcyhsbXYsIG9wX2RhdGEsICZvcF9kYXRhLT5vcF9maWQxKTsKIAlpZiAoSVNfRVJSKHRndCkpCiAJCXJldHVybiBQVFJfRVJSKHRndCk7CiAKQEAgLTI2NDksNiArMzIwNCwyMyBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludAorbG12X2dldF9maWRfZnJvbV9sc20oc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJICAgICBjb25zdCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtLAorCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBzdHJ1Y3QgbHVfZmlkICpmaWQpCit7CisJY29uc3Qgc3RydWN0IGxtdl9vaW5mbyAqb2luZm87CisKKwlMQVNTRVJUKGxzbSk7CisJb2luZm8gPSBsc21fbmFtZV90b19zdHJpcGVfaW5mbyhsc20sIG5hbWUsIG5hbWVsZW4pOworCWlmIChJU19FUlIob2luZm8pKQorCQlyZXR1cm4gUFRSX0VSUihvaW5mbyk7CisKKwkqZmlkID0gb2luZm8tPmxtb19maWQ7CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBGb3IgbG12LCBvbmx5IG5lZWQgdG8gc2VuZCByZXF1ZXN0IHRvIG1hc3RlciBNRFQsIGFuZCB0aGUgbWFzdGVyIE1EVCB3aWxsCiAgKiBwcm9jZXNzIHdpdGggb3RoZXIgc2xhdmUgTURUcy4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIFFfR0VUT1FVT1RBIGZvciB3aGljaApAQCAtMjY2MCw4ICszMjMyLDkgQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICpvYmQgPSBjbGFzc19leHAyb2JkKGV4cCk7CiAJc3RydWN0IGxtdl9vYmQgICAgICAqbG12ID0gJm9iZC0+dS5sbXY7CiAJc3RydWN0IGxtdl90Z3RfZGVzYyAqdGd0ID0gbG12LT50Z3RzWzBdOwotCWludAkJICByYyA9IDAsIGk7CisJaW50IHJjID0gMDsKIAlfX3U2NCBjdXJzcGFjZSA9IDAsIGN1cmlub2RlcyA9IDA7CisJdTMyIGk7CiAKIAlpZiAoIXRndCB8fCAhdGd0LT5sdGRfZXhwIHx8ICF0Z3QtPmx0ZF9hY3RpdmUgfHwKIAkgICAgIWxtdi0+ZGVzYy5sZF90Z3RfY291bnQpIHsKQEAgLTI3MDQsNyArMzI3Nyw4IEBACiAJc3RydWN0IG9iZF9kZXZpY2UgICAqb2JkID0gY2xhc3NfZXhwMm9iZChleHApOwogCXN0cnVjdCBsbXZfb2JkICAgICAgKmxtdiA9ICZvYmQtPnUubG12OwogCXN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndDsKLQlpbnQJCSAgaSwgcmMgPSAwOworCWludCByYyA9IDA7CisJdTMyIGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbG12LT5kZXNjLmxkX3RndF9jb3VudDsgaSsrKSB7CiAJCWludCBlcnI7CkBAIC0yNzIzLDYgKzMyOTcsNDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbnQgbG12X21lcmdlX2F0dHIoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJCSAgY29uc3Qgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSwKKwkJCSAgc3RydWN0IGNsX2F0dHIgKmF0dHIsCisJCQkgIGxkbG1fYmxvY2tpbmdfY2FsbGJhY2sgY2JfYmxvY2tpbmcpCit7CisJaW50IHJjLCBpOworCisJcmMgPSBsbXZfcmV2YWxpZGF0ZV9zbGF2ZXMoZXhwLCBsc20sIGNiX2Jsb2NraW5nLCAwKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19yb290OworCisJCUNERUJVRyhEX0lORk8sICIiREZJRCIgc2l6ZSAlbGx1LCBibG9ja3MgJWxsdSBubGluayAldSwgYXRpbWUgJWx1IGN0aW1lICVsdSwgbXRpbWUgJWx1LlxuIiwKKwkJICAgICAgIFBGSUQoJmxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19maWQpLAorCQkgICAgICAgaV9zaXplX3JlYWQoaW5vZGUpLCAodW5zaWduZWQgbG9uZyBsb25nKWlub2RlLT5pX2Jsb2NrcywKKwkJICAgICAgIGlub2RlLT5pX25saW5rLCBMVElNRV9TKGlub2RlLT5pX2F0aW1lKSwKKwkJICAgICAgIExUSU1FX1MoaW5vZGUtPmlfY3RpbWUpLCBMVElNRV9TKGlub2RlLT5pX210aW1lKSk7CisKKwkJLyogZm9yIHNsYXZlIHN0cmlwZSwgaXQgbmVlZHMgdG8gc3VidHJhY3QgbmxpbmsgZm9yIC4gYW5kIC4uICovCisJCWlmIChpKQorCQkJYXR0ci0+Y2F0X25saW5rICs9IGlub2RlLT5pX25saW5rIC0gMjsKKwkJZWxzZQorCQkJYXR0ci0+Y2F0X25saW5rID0gaW5vZGUtPmlfbmxpbms7CisKKwkJYXR0ci0+Y2F0X3NpemUgKz0gaV9zaXplX3JlYWQoaW5vZGUpOworCQlhdHRyLT5jYXRfYmxvY2tzICs9IGlub2RlLT5pX2Jsb2NrczsKKworCQlpZiAoYXR0ci0+Y2F0X2F0aW1lIDwgTFRJTUVfUyhpbm9kZS0+aV9hdGltZSkpCisJCQlhdHRyLT5jYXRfYXRpbWUgPSBMVElNRV9TKGlub2RlLT5pX2F0aW1lKTsKKworCQlpZiAoYXR0ci0+Y2F0X2N0aW1lIDwgTFRJTUVfUyhpbm9kZS0+aV9jdGltZSkpCisJCQlhdHRyLT5jYXRfY3RpbWUgPSBMVElNRV9TKGlub2RlLT5pX2N0aW1lKTsKKworCQlpZiAoYXR0ci0+Y2F0X210aW1lIDwgTFRJTUVfUyhpbm9kZS0+aV9tdGltZSkpCisJCQlhdHRyLT5jYXRfbXRpbWUgPSBMVElNRV9TKGlub2RlLT5pX210aW1lKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgb2JkX29wcyBsbXZfb2JkX29wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLnNldHVwCQk9IGxtdl9zZXR1cCwKQEAgLTI3NDYsNyArMzM2MSw2IEBACiBzdGF0aWMgc3RydWN0IG1kX29wcyBsbXZfbWRfb3BzID0gewogCS5nZXRzdGF0dXMJCT0gbG12X2dldHN0YXR1cywKIAkubnVsbF9pbm9kZQkJPSBsbXZfbnVsbF9pbm9kZSwKLQkuZmluZF9jYmRhdGEJCT0gbG12X2ZpbmRfY2JkYXRhLAogCS5jbG9zZQkJCT0gbG12X2Nsb3NlLAogCS5jcmVhdGUJCQk9IGxtdl9jcmVhdGUsCiAJLmRvbmVfd3JpdGluZwkJPSBsbXZfZG9uZV93cml0aW5nLApAQCAtMjc2MCw3ICszMzc0LDcgQEAKIAkuc2V0YXR0cgkJPSBsbXZfc2V0YXR0ciwKIAkuc2V0eGF0dHIJCT0gbG12X3NldHhhdHRyLAogCS5zeW5jCQkJPSBsbXZfc3luYywKLQkucmVhZHBhZ2UJCT0gbG12X3JlYWRwYWdlLAorCS5yZWFkX3BhZ2UJCT0gbG12X3JlYWRfcGFnZSwKIAkudW5saW5rCQkJPSBsbXZfdW5saW5rLAogCS5pbml0X2VhX3NpemUJCT0gbG12X2luaXRfZWFfc2l6ZSwKIAkuY2FuY2VsX3VudXNlZAkJPSBsbXZfY2FuY2VsX3VudXNlZCwKQEAgLTI3NjgsMTAgKzMzODIsMTIgQEAKIAkubG9ja19tYXRjaAkJPSBsbXZfbG9ja19tYXRjaCwKIAkuZ2V0X2x1c3RyZV9tZAkJPSBsbXZfZ2V0X2x1c3RyZV9tZCwKIAkuZnJlZV9sdXN0cmVfbWQJCT0gbG12X2ZyZWVfbHVzdHJlX21kLAorCS5tZXJnZV9hdHRyCQk9IGxtdl9tZXJnZV9hdHRyLAogCS5zZXRfb3Blbl9yZXBsYXlfZGF0YQk9IGxtdl9zZXRfb3Blbl9yZXBsYXlfZGF0YSwKIAkuY2xlYXJfb3Blbl9yZXBsYXlfZGF0YQk9IGxtdl9jbGVhcl9vcGVuX3JlcGxheV9kYXRhLAogCS5pbnRlbnRfZ2V0YXR0cl9hc3luYwk9IGxtdl9pbnRlbnRfZ2V0YXR0cl9hc3luYywKLQkucmV2YWxpZGF0ZV9sb2NrCT0gbG12X3JldmFsaWRhdGVfbG9jaworCS5yZXZhbGlkYXRlX2xvY2sJPSBsbXZfcmV2YWxpZGF0ZV9sb2NrLAorCS5nZXRfZmlkX2Zyb21fbHNtCT0gbG12X2dldF9maWRfZnJvbV9sc20sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBsbXZfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xwcm9jX2xtdi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xwcm9jX2xtdi5jCmluZGV4IGMyOWMzNjEuLjIwYmJkZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9scHJvY19sbXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbHByb2NfbG12LmMKQEAgLTE2OSw3ICsxNjksNyBAQAogCiAJaWYgKCF0Z3QpCiAJCXJldHVybiAwOwotCXNlcV9wcmludGYocCwgIiVkOiAlcyAlc0FDVElWRVxuIiwKKwlzZXFfcHJpbnRmKHAsICIldTogJXMgJXNBQ1RJVkVcbiIsCiAJCSAgIHRndC0+bHRkX2lkeCwgdGd0LT5sdGRfdXVpZC51dWlkLAogCQkgICB0Z3QtPmx0ZF9hY3RpdmUgPyAiIiA6ICJJTiIpOwogCXJldHVybiAwOwpAQCAtMjAyLDcgKzIwMiw3IEBACiAJeyBOVUxMIH0KIH07CiAKLXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbG12X3Byb2NfdGFyZ2V0X2ZvcHMgPSB7Citjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxtdl9wcm9jX3RhcmdldF9mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJID0gbG12X3RhcmdldF9zZXFfb3BlbiwKIAkucmVhZAkJID0gc2VxX3JlYWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2NsX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2NsX2ludGVybmFsLmgKaW5kZXggOTc0MDU2OC4uNGQyYjdkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9jbF9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfY2xfaW50ZXJuYWwuaApAQCAtMjg5LDggKzI4OSw4IEBACiB9OwogCiBzdHJ1Y3QgbG92X3BhZ2UgewotCXN0cnVjdCBjbF9wYWdlX3NsaWNlIGxwc19jbDsKLQlpbnQJCSAgbHBzX2ludmFsaWQ7CisJc3RydWN0IGNsX3BhZ2Vfc2xpY2UJbHBzX2NsOworCXVuc2lnbmVkIGludAkJbHBzX3N0cmlwZTsgLyogc3RyaXBlIGluZGV4ICovCiB9OwogCiAvKgpAQCAtNTU2LDYgKzU1Niw4IEBACiAJCQkJCSBzdHJ1Y3QgbG92c3ViX2xvY2sgKnN1Yik7CiBzdHJ1Y3QgbG92X2lvX3N1YiAqbG92X3BhZ2Vfc3ViaW8oY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgbG92X2lvICpsaW8sCiAJCQkJICBjb25zdCBzdHJ1Y3QgY2xfcGFnZV9zbGljZSAqc2xpY2UpOworCitzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbG92X2xzbV9hZGRyZWYoc3RydWN0IGxvdl9vYmplY3QgKmxvdik7CiBpbnQgbG92X3BhZ2Vfc3RyaXBlKGNvbnN0IHN0cnVjdCBjbF9wYWdlICpwYWdlKTsKIAogI2RlZmluZSBsb3ZfZm9yZWFjaF90YXJnZXQobG92LCB2YXIpCQkgICAgXApAQCAtNzQyLDExICs3NDQsMTUgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGxvdl9sYXlvdXRfcmFpZDAgKmxvdl9yMChzdHJ1Y3QgbG92X29iamVjdCAqbG92KQogewogCUxBU1NFUlQobG92LT5sb190eXBlID09IExMVF9SQUlEMCk7Ci0JTEFTU0VSVChsb3YtPmxvX2xzbS0+bHNtX3dpcmUubHdfbWFnaWMgPT0gTE9WX01BR0lDIHx8Ci0JCWxvdi0+bG9fbHNtLT5sc21fd2lyZS5sd19tYWdpYyA9PSBMT1ZfTUFHSUNfVjMpOworCUxBU1NFUlQobG92LT5sb19sc20tPmxzbV9tYWdpYyA9PSBMT1ZfTUFHSUMgfHwKKwkJbG92LT5sb19sc20tPmxzbV9tYWdpYyA9PSBMT1ZfTUFHSUNfVjMpOwogCXJldHVybiAmbG92LT51LnJhaWQwOwogfQogCisvKiBsb3ZfcGFjay5jICovCitpbnQgbG92X2dldHN0cmlwZShzdHJ1Y3QgbG92X29iamVjdCAqb2JqLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLAorCQkgIHN0cnVjdCBsb3ZfdXNlcl9tZCBfX3VzZXIgKmx1bXApOworCiAvKiogQH0gbG92ICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZGV2LmMKaW5kZXggYjFmMjYwZC4uMDU2YWUyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9kZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2Rldi5jCkBAIC01MTYsNiArNTE2LDUgQEAKIAkubGR0X29wcyAgICAgID0gJmxvdl9kZXZpY2VfdHlwZV9vcHMsCiAJLmxkdF9jdHhfdGFncyA9IExDVF9DTF9USFJFQUQKIH07Ci1FWFBPUlRfU1lNQk9MKGxvdl9kZXZpY2VfdHlwZSk7CiAKIC8qKiBAfSBsb3YgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZWEuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZWEuYwppbmRleCA1MDUzZGVhLi4yMTRjNTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2VhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9lYS5jCkBAIC02Niw3ICs2Niw4IEBACiAJfQogCiAJaWYgKGxtbS0+bG1tX3N0cmlwZV9zaXplID09IDAgfHwKLQkgICAgKGxlMzJfdG9fY3B1KGxtbS0+bG1tX3N0cmlwZV9zaXplKSYoTE9WX01JTl9TVFJJUEVfU0laRS0xKSkgIT0gMCkgeworCSAgICAobGUzMl90b19jcHUobG1tLT5sbW1fc3RyaXBlX3NpemUpICYKKwkgICAgIChMT1ZfTUlOX1NUUklQRV9TSVpFIC0gMSkpICE9IDApIHsKIAkJQ0VSUk9SKCJiYWQgc3RyaXBlIHNpemUgJXVcbiIsCiAJCSAgICAgICBsZTMyX3RvX2NwdShsbW0tPmxtbV9zdHJpcGVfc2l6ZSkpOwogCQlsb3ZfZHVtcF9sbW1fY29tbW9uKERfV0FSTklORywgbG1tKTsKQEAgLTE0NiwyMSArMTQ3LDE1IEBACiAJCSpzd2lkdGggPSAodTY0KWxzbS0+bHNtX3N0cmlwZV9zaXplICogbHNtLT5sc21fc3RyaXBlX2NvdW50OwogfQogCi1zdGF0aWMgaW50IGxzbV9kZXN0cm95X3BsYWluKHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sIHN0cnVjdCBvYmRvICpvYSwKLQkJCSAgICAgc3RydWN0IG9iZF9leHBvcnQgKm1kX2V4cCkKLXsKLQlyZXR1cm4gMDsKLX0KLQogLyogRmluZCBtaW5pbXVtIHN0cmlwZSBtYXhieXRlcyB2YWx1ZS4gIEZvciBpbmFjdGl2ZSBvcgotICogcmVjb25uZWN0aW5nIHRhcmdldHMgdXNlIExVU1RSRV9TVFJJUEVfTUFYQllURVMuCisgKiByZWNvbm5lY3RpbmcgdGFyZ2V0cyB1c2UgTFVTVFJFX0VYVDNfU1RSSVBFX01BWEJZVEVTLgogICovCiBzdGF0aWMgdm9pZCBsb3ZfdGd0X21heGJ5dGVzKHN0cnVjdCBsb3ZfdGd0X2Rlc2MgKnRndCwgX191NjQgKnN0cmlwZV9tYXhieXRlcykKIHsKIAlzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wID0gdGd0LT5sdGRfb2JkLT51LmNsaS5jbF9pbXBvcnQ7CiAKIAlpZiAoIWltcCB8fCAhdGd0LT5sdGRfYWN0aXZlKSB7Ci0JCSpzdHJpcGVfbWF4Ynl0ZXMgPSBMVVNUUkVfU1RSSVBFX01BWEJZVEVTOworCQkqc3RyaXBlX21heGJ5dGVzID0gTFVTVFJFX0VYVDNfU1RSSVBFX01BWEJZVEVTOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNzEsNyArMTY2LDcgQEAKIAkJaWYgKCpzdHJpcGVfbWF4Ynl0ZXMgPiBpbXAtPmltcF9jb25uZWN0X2RhdGEub2NkX21heGJ5dGVzKQogCQkJKnN0cmlwZV9tYXhieXRlcyA9IGltcC0+aW1wX2Nvbm5lY3RfZGF0YS5vY2RfbWF4Ynl0ZXM7CiAJfSBlbHNlIHsKLQkJKnN0cmlwZV9tYXhieXRlcyA9IExVU1RSRV9TVFJJUEVfTUFYQllURVM7CisJCSpzdHJpcGVfbWF4Ynl0ZXMgPSBMVVNUUkVfRVhUM19TVFJJUEVfTUFYQllURVM7CiAJfQogCXNwaW5fdW5sb2NrKCZpbXAtPmltcF9sb2NrKTsKIH0KQEAgLTI0NSw3ICsyNDAsNiBAQAogCiBjb25zdCBzdHJ1Y3QgbHNtX29wZXJhdGlvbnMgbHNtX3YxX29wcyA9IHsKIAkubHNtX2ZyZWUJICAgID0gbHNtX2ZyZWVfcGxhaW4sCi0JLmxzbV9kZXN0cm95CSA9IGxzbV9kZXN0cm95X3BsYWluLAogCS5sc21fc3RyaXBlX2J5X2luZGV4ICAgID0gbHNtX3N0cmlwZV9ieV9pbmRleF9wbGFpbiwKIAkubHNtX3N0cmlwZV9ieV9vZmZzZXQgICA9IGxzbV9zdHJpcGVfYnlfb2Zmc2V0X3BsYWluLAogCS5sc21fbG1tX3ZlcmlmeQkgPSBsc21fbG1tX3ZlcmlmeV92MSwKQEAgLTMzNSw3ICszMjksNiBAQAogCiBjb25zdCBzdHJ1Y3QgbHNtX29wZXJhdGlvbnMgbHNtX3YzX29wcyA9IHsKIAkubHNtX2ZyZWUJICAgID0gbHNtX2ZyZWVfcGxhaW4sCi0JLmxzbV9kZXN0cm95CSA9IGxzbV9kZXN0cm95X3BsYWluLAogCS5sc21fc3RyaXBlX2J5X2luZGV4ICAgID0gbHNtX3N0cmlwZV9ieV9pbmRleF9wbGFpbiwKIAkubHNtX3N0cmlwZV9ieV9vZmZzZXQgICA9IGxzbV9zdHJpcGVfYnlfb2Zmc2V0X3BsYWluLAogCS5sc21fbG1tX3ZlcmlmeQkgPSBsc21fbG1tX3ZlcmlmeV92MywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW50ZXJuYWwuaAppbmRleCAxMmJkNTExLi4wN2U1ZWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9pbnRlcm5hbC5oCkBAIC0xMzQsOCArMTM0LDYgQEAKIC8qIGxvdl9tZXJnZS5jICovCiB2b2lkIGxvdl9tZXJnZV9hdHRycyhzdHJ1Y3Qgb2JkbyAqdGd0LCBzdHJ1Y3Qgb2JkbyAqc3JjLCB1NjQgdmFsaWQsCiAJCSAgICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwgaW50IHN0cmlwZW5vLCBpbnQgKnNldCk7Ci1pbnQgbG92X2FkanVzdF9rbXMoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKLQkJICAgdTY0IHNpemUsIGludCBzaHJpbmspOwogaW50IGxvdl9tZXJnZV9sdmJfa21zKHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sCiAJCSAgICAgIHN0cnVjdCBvc3RfbHZiICpsdmIsIF9fdTY0ICprbXNfcGxhY2UpOwogCkBAIC0xNTcsMTEgKzE1NSw2IEBACiBpbnQgbG92X3ByZXBfZ2V0YXR0cl9zZXQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG9iZF9pbmZvICpvaW5mbywKIAkJCSBzdHJ1Y3QgbG92X3JlcXVlc3Rfc2V0ICoqcmVxc2V0KTsKIGludCBsb3ZfZmluaV9nZXRhdHRyX3NldChzdHJ1Y3QgbG92X3JlcXVlc3Rfc2V0ICpzZXQpOwotaW50IGxvdl9wcmVwX2Rlc3Ryb3lfc2V0KHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBvYmRfaW5mbyAqb2luZm8sCi0JCQkgc3RydWN0IG9iZG8gKnNyY19vYSwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKLQkJCSBzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gKm90aSwKLQkJCSBzdHJ1Y3QgbG92X3JlcXVlc3Rfc2V0ICoqcmVxc2V0KTsKLWludCBsb3ZfZmluaV9kZXN0cm95X3NldChzdHJ1Y3QgbG92X3JlcXVlc3Rfc2V0ICpzZXQpOwogaW50IGxvdl9wcmVwX3NldGF0dHJfc2V0KHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBvYmRfaW5mbyAqb2luZm8sCiAJCQkgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGksCiAJCQkgc3RydWN0IGxvdl9yZXF1ZXN0X3NldCAqKnJlcXNldCk7CkBAIC0xOTcsOCArMTkwLDYgQEAKIAkgICAgICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSk7CiBpbnQgbG92X3VucGFja21kKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqbHNtcCwKIAkJIHN0cnVjdCBsb3ZfbWRzX21kICpsbW0sIGludCBsbW1fYnl0ZXMpOwotaW50IGxvdl9nZXRzdHJpcGUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKLQkJICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLCBzdHJ1Y3QgbG92X3VzZXJfbWQgX191c2VyICpsdW1wKTsKIGludCBsb3ZfYWxsb2NfbWVtbWQoc3RydWN0IGxvdl9zdHJpcGVfbWQgKipsc21wLCBfX3UxNiBzdHJpcGVfY291bnQsCiAJCSAgICBpbnQgcGF0dGVybiwgaW50IG1hZ2ljKTsKIGludCBsb3ZfZnJlZV9tZW1tZChzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqKmxzbXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9pby5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9pby5jCmluZGV4IDg0MDMyYTUuLmQxMDE1NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2lvLmMKQEAgLTg3LDYgKzg3LDkgQEAKIAljYXNlIENJVF9TRVRBVFRSOiB7CiAJCWlvLT51LmNpX3NldGF0dHIuc2FfYXR0ciA9IHBhcmVudC0+dS5jaV9zZXRhdHRyLnNhX2F0dHI7CiAJCWlvLT51LmNpX3NldGF0dHIuc2FfdmFsaWQgPSBwYXJlbnQtPnUuY2lfc2V0YXR0ci5zYV92YWxpZDsKKwkJaW8tPnUuY2lfc2V0YXR0ci5zYV9zdHJpcGVfaW5kZXggPSBzdHJpcGU7CisJCWlvLT51LmNpX3NldGF0dHIuc2FfcGFyZW50X2ZpZCA9CisJCQkJCXBhcmVudC0+dS5jaV9zZXRhdHRyLnNhX3BhcmVudF9maWQ7CiAJCWlmIChjbF9pb19pc190cnVuYyhpbykpIHsKIAkJCWxvZmZfdCBuZXdfc2l6ZSA9IHBhcmVudC0+dS5jaV9zZXRhdHRyLnNhX2F0dHIubHZiX3NpemU7CiAKQEAgLTI0NCwxNCArMjQ3LDEyIEBACiAKIGludCBsb3ZfcGFnZV9zdHJpcGUoY29uc3Qgc3RydWN0IGNsX3BhZ2UgKnBhZ2UpCiB7Ci0Jc3RydWN0IGxvdnN1Yl9vYmplY3QgKnN1Ym9iajsKIAljb25zdCBzdHJ1Y3QgY2xfcGFnZV9zbGljZSAqc2xpY2U7CiAKLQlzbGljZSA9IGNsX3BhZ2VfYXQocGFnZSwgJmxvdnN1Yl9kZXZpY2VfdHlwZSk7CisJc2xpY2UgPSBjbF9wYWdlX2F0KHBhZ2UsICZsb3ZfZGV2aWNlX3R5cGUpOwogCUxBU1NFUlQoc2xpY2UtPmNwbF9vYmopOwogCi0Jc3Vib2JqID0gY2wybG92c3ViKHNsaWNlLT5jcGxfb2JqKTsKLQlyZXR1cm4gc3Vib2JqLT5sc29faW5kZXg7CisJcmV0dXJuIGNsMmxvdl9wYWdlKHNsaWNlKS0+bHBzX3N0cmlwZTsKIH0KIAogc3RydWN0IGxvdl9pb19zdWIgKmxvdl9wYWdlX3N1YmlvKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGxvdl9pbyAqbGlvLApAQCAtMjk4LDggKzI5OSw4IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHZvaWQgbG92X2lvX3NsaWNlX2luaXQoc3RydWN0IGxvdl9pbyAqbGlvLAotCQkJICAgICAgc3RydWN0IGxvdl9vYmplY3QgKm9iaiwgc3RydWN0IGNsX2lvICppbykKK3N0YXRpYyBpbnQgbG92X2lvX3NsaWNlX2luaXQoc3RydWN0IGxvdl9pbyAqbGlvLCBzdHJ1Y3QgbG92X29iamVjdCAqb2JqLAorCQkJICAgICBzdHJ1Y3QgY2xfaW8gKmlvKQogewogCWlvLT5jaV9yZXN1bHQgPSAwOwogCWxpby0+bGlzX29iamVjdCA9IG9iajsKQEAgLTMxNCw2ICszMTUsMTUgQEAKIAkJbGlvLT5saXNfaW9fZW5kcG9zID0gbGlvLT5saXNfZW5kcG9zOwogCQlpZiAoY2xfaW9faXNfYXBwZW5kKGlvKSkgewogCQkJTEFTU0VSVChpby0+Y2lfdHlwZSA9PSBDSVRfV1JJVEUpOworCisJCQkvKgorCQkJICogSWYgdGhlcmUgaXMgTE9WIEVBIGhvbGUsIHRoZW4gd2UgbWF5IGNhbm5vdCBsb2NhdGUKKwkJCSAqIHRoZSBjdXJyZW50IGZpbGUtdGFpbCBleGFjdGx5LgorCQkJICovCisJCQlpZiAodW5saWtlbHkob2JqLT5sb19sc20tPmxzbV9wYXR0ZXJuICYKKwkJCQkgICAgIExPVl9QQVRURVJOX0ZfSE9MRSkpCisJCQkJcmV0dXJuIC1FSU87CisKIAkJCWxpby0+bGlzX3BvcyA9IDA7CiAJCQlsaW8tPmxpc19lbmRwb3MgPSBPQkRfT0JKRUNUX0VPRjsKIAkJfQpAQCAtMzQ5LDYgKzM1OSw3IEBACiAJZGVmYXVsdDoKIAkJTEJVRygpOwogCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgbG92X2lvX2ZpbmkoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBjb25zdCBzdHJ1Y3QgY2xfaW9fc2xpY2UgKmlvcykKQEAgLTg3MCw3ICs4ODEsNyBAQAogCXN0cnVjdCBsb3Zfb2JqZWN0ICAgKmxvdiA9IGNsMmxvdihvYmopOwogCiAJSU5JVF9MSVNUX0hFQUQoJmxpby0+bGlzX2FjdGl2ZSk7Ci0JbG92X2lvX3NsaWNlX2luaXQobGlvLCBsb3YsIGlvKTsKKwlpby0+Y2lfcmVzdWx0ID0gbG92X2lvX3NsaWNlX2luaXQobGlvLCBsb3YsIGlvKTsKIAlpZiAoaW8tPmNpX3Jlc3VsdCA9PSAwKSB7CiAJCWlvLT5jaV9yZXN1bHQgPSBsb3ZfaW9fc3ViaW9faW5pdChlbnYsIGxpbywgaW8pOwogCQlpZiAoaW8tPmNpX3Jlc3VsdCA9PSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X21lcmdlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X21lcmdlLmMKaW5kZXggYjljOTA4Ni4uNjc0YWYxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9tZXJnZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfbWVyZ2UuYwpAQCAtMTA1LDQ1ICsxMDUsNiBAQAogCXJldHVybiByYzsKIH0KIAotLyogTXVzdCBiZSBjYWxsZWQgdW5kZXIgdGhlIGxvdl9zdHJpcGVfbG9jaygpICovCi1pbnQgbG92X2FkanVzdF9rbXMoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKLQkJICAgdTY0IHNpemUsIGludCBzaHJpbmspCi17Ci0Jc3RydWN0IGxvdl9vaW5mbyAqbG9pOwotCWludCBzdHJpcGUgPSAwOwotCV9fdTY0IGttczsKLQotCWFzc2VydF9zcGluX2xvY2tlZCgmbHNtLT5sc21fbG9jayk7Ci0JTEFTU0VSVChsc20tPmxzbV9sb2NrX293bmVyID09IGN1cnJlbnRfcGlkKCkpOwotCi0JaWYgKHNocmluaykgewotCQlmb3IgKDsgc3RyaXBlIDwgbHNtLT5sc21fc3RyaXBlX2NvdW50OyBzdHJpcGUrKykgewotCQkJc3RydWN0IGxvdl9vaW5mbyAqbG9pID0gbHNtLT5sc21fb2luZm9bc3RyaXBlXTsKLQotCQkJa21zID0gbG92X3NpemVfdG9fc3RyaXBlKGxzbSwgc2l6ZSwgc3RyaXBlKTsKLQkJCUNERUJVRyhEX0lOT0RFLAotCQkJICAgICAgICJzdHJpcGUgJWQgS01TICVzaW5nICVsbHUtPiVsbHVcbiIsCi0JCQkgICAgICAgc3RyaXBlLCBrbXMgPiBsb2ktPmxvaV9rbXMgPyAiaW5jcmVhc2UiOiJzaHJpbmsiLAotCQkJICAgICAgIGxvaS0+bG9pX2ttcywga21zKTsKLQkJCWxvaS0+bG9pX2x2Yi5sdmJfc2l6ZSA9IGttczsKLQkJCWxvaV9rbXNfc2V0KGxvaSwgbG9pLT5sb2lfbHZiLmx2Yl9zaXplKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc2l6ZSA+IDApCi0JCXN0cmlwZSA9IGxvdl9zdHJpcGVfbnVtYmVyKGxzbSwgc2l6ZSAtIDEpOwotCWttcyA9IGxvdl9zaXplX3RvX3N0cmlwZShsc20sIHNpemUsIHN0cmlwZSk7Ci0JbG9pID0gbHNtLT5sc21fb2luZm9bc3RyaXBlXTsKLQotCUNERUJVRyhEX0lOT0RFLCAic3RyaXBlICVkIEtNUyAlc2luY3JlYXNpbmcgJWxsdS0+JWxsdVxuIiwKLQkgICAgICAgc3RyaXBlLCBrbXMgPiBsb2ktPmxvaV9rbXMgPyAiIiA6ICJub3QgIiwgbG9pLT5sb2lfa21zLCBrbXMpOwotCWlmIChrbXMgPiBsb2ktPmxvaV9rbXMpCi0JCWxvaV9rbXNfc2V0KGxvaSwga21zKTsKLQotCXJldHVybiAwOwotfQotCiB2b2lkIGxvdl9tZXJnZV9hdHRycyhzdHJ1Y3Qgb2JkbyAqdGd0LCBzdHJ1Y3Qgb2JkbyAqc3JjLCB1NjQgdmFsaWQsCiAJCSAgICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwgaW50IHN0cmlwZW5vLCBpbnQgKnNldCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iZC5jCmluZGV4IDliOTJkNTUuLmIyMzAxNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmQuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmcy5oIgogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfc3VwcG9ydC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pb2N0bC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpYi5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX25ldC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pZGwuaCIKQEAgLTk0MCw3ICs5NDEsNyBAQAogCX0KIAljYXNlIExDRkdfUEFSQU06IHsKIAkJc3RydWN0IGxwcm9jZnNfc3RhdGljX3ZhcnMgbHZhcnMgPSB7IE5VTEwgfTsKLQkJc3RydWN0IGxvdl9kZXNjICpkZXNjID0gJihvYmQtPnUubG92LmRlc2MpOworCQlzdHJ1Y3QgbG92X2Rlc2MgKmRlc2MgPSAmb2JkLT51Lmxvdi5kZXNjOwogCiAJCWlmICghZGVzYykgewogCQkJcmMgPSAtRUlOVkFMOwpAQCAtOTcxLDkyICs5NzIsNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBsb3ZfcmVjcmVhdGUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG9iZG8gKnNyY19vYSwKLQkJCXN0cnVjdCBsb3Zfc3RyaXBlX21kICoqZWEsIHN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpKQotewotCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpvYmpfbWRwLCAqbHNtOwotCXN0cnVjdCBsb3Zfb2JkICpsb3YgPSAmZXhwLT5leHBfb2JkLT51LmxvdjsKLQl1bnNpZ25lZCBvc3RfaWR4OwotCWludCByYywgaTsKLQotCUxBU1NFUlQoc3JjX29hLT5vX3ZhbGlkICYgT0JEX01EX0ZMRkxBR1MgJiYKLQkJc3JjX29hLT5vX2ZsYWdzICYgT0JEX0ZMX1JFQ1JFQVRFX09CSlMpOwotCi0Jb2JqX21kcCA9IGt6YWxsb2Moc2l6ZW9mKCpvYmpfbWRwKSwgR0ZQX05PRlMpOwotCWlmICghb2JqX21kcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlvc3RfaWR4ID0gc3JjX29hLT5vX25saW5rOwotCWxzbSA9ICplYTsKLQlpZiAoIWxzbSkgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAob3N0X2lkeCA+PSBsb3YtPmRlc2MubGRfdGd0X2NvdW50IHx8Ci0JICAgICFsb3YtPmxvdl90Z3RzW29zdF9pZHhdKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGxzbS0+bHNtX3N0cmlwZV9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBsb3Zfb2luZm8gKmxvaSA9IGxzbS0+bHNtX29pbmZvW2ldOwotCi0JCWlmIChsb3Zfb2luZm9faXNfZHVtbXkobG9pKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChsb2ktPmxvaV9vc3RfaWR4ID09IG9zdF9pZHgpIHsKLQkJCWlmIChvc3RpZF9pZCgmbG9pLT5sb2lfb2kpICE9IG9zdGlkX2lkKCZzcmNfb2EtPm9fb2kpKSB7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGkgPT0gbHNtLT5sc21fc3RyaXBlX2NvdW50KSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmMgPSBvYmRfY3JlYXRlKE5VTEwsIGxvdi0+bG92X3RndHNbb3N0X2lkeF0tPmx0ZF9leHAsCi0JCQlzcmNfb2EsICZvYmpfbWRwLCBvdGkpOwotb3V0OgotCWtmcmVlKG9ial9tZHApOwotCXJldHVybiByYzsKLX0KLQotLyogdGhlIExPViBleHBlY3RzIG9hLT5vX2lkIHRvIGJlIHNldCB0byB0aGUgTE9WIG9iamVjdCBpZCAqLwotc3RhdGljIGludCBsb3ZfY3JlYXRlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKLQkJICAgICAgc3RydWN0IG9iZG8gKnNyY19vYSwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKiplYSwKLQkJICAgICAgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGkpCi17Ci0Jc3RydWN0IGxvdl9vYmQgKmxvdjsKLQlpbnQgcmMgPSAwOwotCi0JTEFTU0VSVChlYSk7Ci0JaWYgKCFleHApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKChzcmNfb2EtPm9fdmFsaWQgJiBPQkRfTURfRkxGTEFHUykgJiYKLQkgICAgc3JjX29hLT5vX2ZsYWdzID09IE9CRF9GTF9ERUxPUlBIQU4pIHsKLQkJLyogc2hvdWxkIGJlIHVzZWQgd2l0aCBMT1YgYW55bW9yZSAqLwotCQlMQlVHKCk7Ci0JfQotCi0JbG92ID0gJmV4cC0+ZXhwX29iZC0+dS5sb3Y7Ci0JaWYgKCFsb3YtPmRlc2MubGRfYWN0aXZlX3RndF9jb3VudCkKLQkJcmV0dXJuIC1FSU87Ci0KLQlvYmRfZ2V0cmVmKGV4cC0+ZXhwX29iZCk7Ci0JLyogUmVjcmVhdGUgYSBzcGVjaWZpYyBvYmplY3QgaWQgYXQgdGhlIGdpdmVuIE9TVCBpbmRleCAqLwotCWlmICgoc3JjX29hLT5vX3ZhbGlkICYgT0JEX01EX0ZMRkxBR1MpICYmCi0JICAgIChzcmNfb2EtPm9fZmxhZ3MgJiBPQkRfRkxfUkVDUkVBVEVfT0JKUykpIHsKLQkJcmMgPSBsb3ZfcmVjcmVhdGUoZXhwLCBzcmNfb2EsIGVhLCBvdGkpOwotCX0KLQotCW9iZF9wdXRyZWYoZXhwLT5leHBfb2JkKTsKLQlyZXR1cm4gcmM7Ci19Ci0KICNkZWZpbmUgQVNTRVJUX0xTTV9NQUdJQyhsc21wKQkJCQkJCSAgXAogZG8gewkJCQkJCQkJCSAgICBcCiAJTEFTU0VSVCgobHNtcCkpOwkJCQkJCVwKQEAgLTEwNjUsNTkgKzk4MCw2IEBACiAJCSAiJXAtPmxzbV9tYWdpYz0leFxuIiwgKGxzbXApLCAobHNtcCktPmxzbV9tYWdpYyk7CSAgICAgIFwKIH0gd2hpbGUgKDApCiAKLXN0YXRpYyBpbnQgbG92X2Rlc3Ryb3koY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAotCQkgICAgICAgc3RydWN0IG9iZG8gKm9hLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLAotCQkgICAgICAgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGksIHN0cnVjdCBvYmRfZXhwb3J0ICptZF9leHApCi17Ci0Jc3RydWN0IGxvdl9yZXF1ZXN0X3NldCAqc2V0OwotCXN0cnVjdCBvYmRfaW5mbyBvaW5mbzsKLQlzdHJ1Y3QgbG92X3JlcXVlc3QgKnJlcTsKLQlzdHJ1Y3QgbG92X29iZCAqbG92OwotCWludCByYyA9IDAsIGVyciA9IDA7Ci0KLQlBU1NFUlRfTFNNX01BR0lDKGxzbSk7Ci0KLQlpZiAoIWV4cCB8fCAhZXhwLT5leHBfb2JkKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmIChvYS0+b192YWxpZCAmIE9CRF9NRF9GTENPT0tJRSkgewotCQlMQVNTRVJUKG90aSk7Ci0JCUxBU1NFUlQob3RpLT5vdGlfbG9nY29va2llcyk7Ci0JfQotCi0JbG92ID0gJmV4cC0+ZXhwX29iZC0+dS5sb3Y7Ci0Jb2JkX2dldHJlZihleHAtPmV4cF9vYmQpOwotCXJjID0gbG92X3ByZXBfZGVzdHJveV9zZXQoZXhwLCAmb2luZm8sIG9hLCBsc20sIG90aSwgJnNldCk7Ci0JaWYgKHJjKQotCQlnb3RvIG91dDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmc2V0LT5zZXRfbGlzdCwgcnFfbGluaykgewotCQlpZiAob2EtPm9fdmFsaWQgJiBPQkRfTURfRkxDT09LSUUpCi0JCQlvdGktPm90aV9sb2djb29raWVzID0gc2V0LT5zZXRfY29va2llcyArIHJlcS0+cnFfc3RyaXBlOwotCi0JCWVyciA9IG9iZF9kZXN0cm95KGVudiwgbG92LT5sb3ZfdGd0c1tyZXEtPnJxX2lkeF0tPmx0ZF9leHAsCi0JCQkJICByZXEtPnJxX29pLm9pX29hLCBOVUxMLCBvdGksIE5VTEwpOwotCQllcnIgPSBsb3ZfdXBkYXRlX2NvbW1vbl9zZXQoc2V0LCByZXEsIGVycik7Ci0JCWlmIChlcnIpIHsKLQkJCUNFUlJPUigiJXM6IGRlc3Ryb3lpbmcgb2JqaWQgIkRPU1RJRCIgc3Vib2JqICIKLQkJCSAgICAgICBET1NUSUQiIG9uIE9TVCBpZHggJWQ6IHJjID0gJWRcbiIsCi0JCQkgICAgICAgZXhwLT5leHBfb2JkLT5vYmRfbmFtZSwgUE9TVElEKCZvYS0+b19vaSksCi0JCQkgICAgICAgUE9TVElEKCZyZXEtPnJxX29pLm9pX29hLT5vX29pKSwKLQkJCSAgICAgICByZXEtPnJxX2lkeCwgZXJyKTsKLQkJCWlmICghcmMpCi0JCQkJcmMgPSBlcnI7Ci0JCX0KLQl9Ci0KLQlpZiAocmMgPT0gMCkKLQkJcmMgPSBsc21fb3BfZmluZChsc20tPmxzbV9tYWdpYyktPmxzbV9kZXN0cm95KGxzbSwgb2EsIG1kX2V4cCk7Ci0KLQllcnIgPSBsb3ZfZmluaV9kZXN0cm95X3NldChzZXQpOwotb3V0OgotCW9iZF9wdXRyZWYoZXhwLT5leHBfb2JkKTsKLQlyZXR1cm4gcmMgPyByYyA6IGVycjsKLX0KLQogc3RhdGljIGludCBsb3ZfZ2V0YXR0cl9pbnRlcnByZXQoc3RydWN0IHB0bHJwY19yZXF1ZXN0X3NldCAqcnFzZXQsCiAJCQkJIHZvaWQgKmRhdGEsIGludCByYykKIHsKQEAgLTEyNjcsNDYgKzExMjksNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBmaW5kIGFueSBsZGxtIGxvY2sgb2YgdGhlIGlub2RlIGluIGxvdgotICogcmV0dXJuIDAgICAgbm90IGZpbmQKLSAqCTEgICAgZmluZCBvbmUKLSAqICAgICAgPCAwICAgIGVycm9yCi0gKi8KLXN0YXRpYyBpbnQgbG92X2ZpbmRfY2JkYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCQkgICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLCBsZGxtX2l0ZXJhdG9yX3QgaXQsCi0JCQkgICB2b2lkICpkYXRhKQotewotCXN0cnVjdCBsb3Zfb2JkICpsb3Y7Ci0JaW50IHJjID0gMCwgaTsKLQotCUFTU0VSVF9MU01fTUFHSUMobHNtKTsKLQotCWlmICghZXhwIHx8ICFleHAtPmV4cF9vYmQpCi0JCXJldHVybiAtRU5PREVWOwotCi0JbG92ID0gJmV4cC0+ZXhwX29iZC0+dS5sb3Y7Ci0JZm9yIChpID0gMDsgaSA8IGxzbS0+bHNtX3N0cmlwZV9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBsb3Zfc3RyaXBlX21kIHN1Ym1kOwotCQlzdHJ1Y3QgbG92X29pbmZvICpsb2kgPSBsc20tPmxzbV9vaW5mb1tpXTsKLQotCQlpZiAobG92X29pbmZvX2lzX2R1bW15KGxvaSkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoIWxvdi0+bG92X3RndHNbbG9pLT5sb2lfb3N0X2lkeF0pIHsKLQkJCUNERUJVRyhEX0hBLCAibG92IGlkeCAlZCBOVUxMXG4iLCBsb2ktPmxvaV9vc3RfaWR4KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJc3VibWQubHNtX29pID0gbG9pLT5sb2lfb2k7Ci0JCXN1Ym1kLmxzbV9zdHJpcGVfY291bnQgPSAwOwotCQlyYyA9IG9iZF9maW5kX2NiZGF0YShsb3YtPmxvdl90Z3RzW2xvaS0+bG9pX29zdF9pZHhdLT5sdGRfZXhwLAotCQkJCSAgICAgJnN1Ym1kLCBpdCwgZGF0YSk7Ci0JCWlmIChyYyAhPSAwKQotCQkJcmV0dXJuIHJjOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KIGludCBsb3Zfc3RhdGZzX2ludGVycHJldChzdHJ1Y3QgcHRscnBjX3JlcXVlc3Rfc2V0ICpycXNldCwgdm9pZCAqZGF0YSwgaW50IHJjKQogewogCXN0cnVjdCBsb3ZfcmVxdWVzdF9zZXQgKmxvdnNldCA9IChzdHJ1Y3QgbG92X3JlcXVlc3Rfc2V0ICopZGF0YTsKQEAgLTE0NjAsNyArMTI4Miw3IEBACiAJCX0KIAogCQlkZXNjID0gKHN0cnVjdCBsb3ZfZGVzYyAqKWRhdGEtPmlvY19pbmxidWYxOwotCQltZW1jcHkoZGVzYywgJihsb3YtPmRlc2MpLCBzaXplb2YoKmRlc2MpKTsKKwkJbWVtY3B5KGRlc2MsICZsb3YtPmRlc2MsIHNpemVvZigqZGVzYykpOwogCiAJCXV1aWRwID0gKHN0cnVjdCBvYmRfdXVpZCAqKWRhdGEtPmlvY19pbmxidWYyOwogCQlnZW5wID0gKF9fdTMyICopZGF0YS0+aW9jX2lubGJ1ZjM7CkBAIC0xNDc3LDkgKzEyOTksNiBAQAogCQlvYmRfaW9jdGxfZnJlZWRhdGEoYnVmLCBsZW4pOwogCQlicmVhazsKIAl9Ci0JY2FzZSBMTF9JT0NfTE9WX0dFVFNUUklQRToKLQkJcmMgPSBsb3ZfZ2V0c3RyaXBlKGV4cCwga2FyZywgdWFyZyk7Ci0JCWJyZWFrOwogCWNhc2UgT0JEX0lPQ19RVU9UQUNUTDogewogCQlzdHJ1Y3QgaWZfcXVvdGFjdGwgKnFjdGwgPSBrYXJnOwogCQlzdHJ1Y3QgbG92X3RndF9kZXNjICp0Z3QgPSBOVUxMOwpAQCAtMTcyNiw2ICsxNTQ1LDggQEAKIAl1NjQgZm1fc3RhcnQsIGZtX2VuZCwgZm1fbGVuZ3RoLCBmbV9lbmRfb2Zmc2V0OwogCXU2NCBjdXJyX2xvYzsKIAlpbnQgY3VycmVudF9leHRlbnQgPSAwLCByYyA9IDAsIGk7CisJLyogV2hldGhlciBoYXZlIHdlIGNvbGxlY3RlZCBlbm91Z2ggZXh0ZW50cyAqLworCWJvb2wgZW5vdWdoID0gZmFsc2U7CiAJaW50IG9zdF9lb2YgPSAwOyAvKiBFT0YgZm9yIG9iamVjdCAqLwogCWludCBvc3RfZG9uZSA9IDA7IC8qIGRvbmUgd2l0aCByZXF1aXJlZCBtYXBwaW5nIGZvciB0aGlzIE9TVD8gKi8KIAlpbnQgbGFzdF9zdHJpcGU7CkBAIC0xODYwLDcgKzE2ODEsNyBAQAogCQkJbHVuX3N0YXJ0ICs9IGxlbl9tYXBwZWRfc2luZ2xlX2NhbGw7CiAJCQlmbV9sb2NhbC0+Zm1fbGVuZ3RoID0gcmVxX2ZtX2xlbiAtIGxlbl9tYXBwZWRfc2luZ2xlX2NhbGw7CiAJCQlyZXFfZm1fbGVuID0gZm1fbG9jYWwtPmZtX2xlbmd0aDsKLQkJCWZtX2xvY2FsLT5mbV9leHRlbnRfY291bnQgPSBjb3VudF9sb2NhbDsKKwkJCWZtX2xvY2FsLT5mbV9leHRlbnRfY291bnQgPSBlbm91Z2ggPyAxIDogY291bnRfbG9jYWw7CiAJCQlmbV9sb2NhbC0+Zm1fbWFwcGVkX2V4dGVudHMgPSAwOwogCQkJZm1fbG9jYWwtPmZtX2ZsYWdzID0gZmllbWFwLT5mbV9mbGFnczsKIApAQCAtMTkwOCw2ICsxNzI5LDEyIEBACiAJCQkJCWdvdG8gZmluaXNoOwogCQkJCX0KIAkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoZW5vdWdoKSB7CisJCQkJLyoKKwkJCQkgKiBXZSd2ZSBjb2xsZWN0ZWQgZW5vdWdoIGV4dGVudHMgYW5kIHRoZXJlIGFyZQorCQkJCSAqIG1vcmUgZXh0ZW50cyBhZnRlciBpdC4KKwkJCQkgKi8KKwkJCQlnb3RvIGZpbmlzaDsKIAkJCX0KIAogCQkJLyogSWYgd2UganVzdCBuZWVkIG51bSBvZiBleHRlbnRzIHRoZW4gZ28gdG8gbmV4dCBkZXZpY2UgKi8KQEAgLTE5MTYsOCArMTc0Myw5IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCWxlbl9tYXBwZWRfc2luZ2xlX2NhbGwgPSBsY2xfZm1fZXh0W2V4dF9jb3VudC0xXS5mZV9sb2dpY2FsIC0KLQkJCQkgIGx1bl9zdGFydCArIGxjbF9mbV9leHRbZXh0X2NvdW50IC0gMV0uZmVfbGVuZ3RoOworCQkJbGVuX21hcHBlZF9zaW5nbGVfY2FsbCA9CisJCQkJbGNsX2ZtX2V4dFtleHRfY291bnQgLSAxXS5mZV9sb2dpY2FsIC0KKwkJCQlsdW5fc3RhcnQgKyBsY2xfZm1fZXh0W2V4dF9jb3VudCAtIDFdLmZlX2xlbmd0aDsKIAogCQkJLyogSGF2ZSB3ZSBmaW5pc2hlZCBtYXBwaW5nIG9uIHRoaXMgZGV2aWNlPyAqLwogCQkJaWYgKHJlcV9mbV9sZW4gPD0gbGVuX21hcHBlZF9zaW5nbGVfY2FsbCkKQEAgLTE5MjYsMTQgKzE3NTQsMTUgQEAKIAkJCS8qIENsZWFyIHRoZSBFWFRFTlRfTEFTVCBmbGFnIHdoaWNoIGNhbiBiZSBwcmVzZW50IG9uCiAJCQkgKiBsYXN0IGV4dGVudAogCQkJICovCi0JCQlpZiAobGNsX2ZtX2V4dFtleHRfY291bnQtMV0uZmVfZmxhZ3MgJiBGSUVNQVBfRVhURU5UX0xBU1QpCisJCQlpZiAobGNsX2ZtX2V4dFtleHRfY291bnQgLSAxXS5mZV9mbGFncyAmCisJCQkgICAgRklFTUFQX0VYVEVOVF9MQVNUKQogCQkJCWxjbF9mbV9leHRbZXh0X2NvdW50IC0gMV0uZmVfZmxhZ3MgJj0KIAkJCQkJCQkgICAgfkZJRU1BUF9FWFRFTlRfTEFTVDsKIAogCQkJY3Vycl9sb2MgPSBsb3Zfc3RyaXBlX3NpemUobHNtLAotCQkJCQkgICBsY2xfZm1fZXh0W2V4dF9jb3VudCAtIDFdLmZlX2xvZ2ljYWwrCi0JCQkJCSAgIGxjbF9mbV9leHRbZXh0X2NvdW50IC0gMV0uZmVfbGVuZ3RoLAotCQkJCQkgICBjdXJfc3RyaXBlKTsKKwkJCQkJbGNsX2ZtX2V4dFtleHRfY291bnQgLSAxXS5mZV9sb2dpY2FsICsKKwkJCQkJbGNsX2ZtX2V4dFtleHRfY291bnQgLSAxXS5mZV9sZW5ndGgsCisJCQkJCWN1cl9zdHJpcGUpOwogCQkJaWYgKGN1cnJfbG9jID49IGZtX2tleS0+b2Eub19zaXplKQogCQkJCW9zdF9lb2YgPSAxOwogCkBAIC0xOTQ1LDcgKzE3NzQsNyBAQAogCiAJCQkvKiBSYW4gb3V0IG9mIGF2YWlsYWJsZSBleHRlbnRzPyAqLwogCQkJaWYgKGN1cnJlbnRfZXh0ZW50ID49IGZpZW1hcC0+Zm1fZXh0ZW50X2NvdW50KQotCQkJCWdvdG8gZmluaXNoOworCQkJCWVub3VnaCA9IHRydWU7CiAJCX0gd2hpbGUgKG9zdF9kb25lID09IDAgJiYgb3N0X2VvZiA9PSAwKTsKIAogCQlpZiAoY3VyX3N0cmlwZV93cmFwID09IGxhc3Rfc3RyaXBlKQpAQCAtMTk4NSw3MyArMTgxNCwxNCBAQAogewogCXN0cnVjdCBvYmRfZGV2aWNlICpvYmRkZXYgPSBjbGFzc19leHAyb2JkKGV4cCk7CiAJc3RydWN0IGxvdl9vYmQgKmxvdiA9ICZvYmRkZXYtPnUubG92OwotCWludCBpLCByYzsKKwlpbnQgcmM7CiAKIAlpZiAoIXZhbGxlbiB8fCAhdmFsKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCW9iZF9nZXRyZWYob2JkZGV2KTsKIAotCWlmIChLRVlfSVMoS0VZX0xPQ0tfVE9fU1RSSVBFKSkgewotCQlzdHJ1Y3QgewotCQkJY2hhciBuYW1lWzE2XTsKLQkJCXN0cnVjdCBsZGxtX2xvY2sgKmxvY2s7Ci0JCX0gKmRhdGEgPSBrZXk7Ci0JCXN0cnVjdCBsZGxtX3Jlc19pZCAqcmVzX2lkID0gJmRhdGEtPmxvY2stPmxfcmVzb3VyY2UtPmxyX25hbWU7Ci0JCXN0cnVjdCBsb3Zfb2luZm8gKmxvaTsKLQkJX191MzIgKnN0cmlwZSA9IHZhbDsKLQotCQlpZiAoKnZhbGxlbiA8IHNpemVvZigqc3RyaXBlKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJKnZhbGxlbiA9IHNpemVvZigqc3RyaXBlKTsKLQotCQkvKiBYWFggVGhpcyBpcyBhbm90aGVyIG9uZSBvZiB0aG9zZSBiaXRzIHRoYXQgd2lsbCBuZWVkIHRvCi0JCSAqIGNoYW5nZSBpZiB3ZSBldmVyIGFjdHVhbGx5IHN1cHBvcnQgbmVzdGVkIExPVnMuICBJdCB1c2VzCi0JCSAqIHRoZSBsb2NrJ3MgZXhwb3J0IHRvIGZpbmQgb3V0IHdoaWNoIHN0cmlwZSBpdCBpcy4KLQkJICovCi0JCS8qIFhYWCAtIGl0J3MgYXNzdW1lZCBhbGwgdGhlIGxvY2tzIGZvciBkZWxldGVkIE9TVHMgaGF2ZQotCQkgKiBiZWVuIGNhbmNlbGxlZC4gQWxzbywgdGhlIGV4cG9ydCBmb3IgZGVsZXRlZCBPU1RzIHdpbGwKLQkJICogYmUgTlVMTCBhbmQgd29uJ3QgbWF0Y2ggdGhlIGxvY2sncyBleHBvcnQuCi0JCSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgbHNtLT5sc21fc3RyaXBlX2NvdW50OyBpKyspIHsKLQkJCWxvaSA9IGxzbS0+bHNtX29pbmZvW2ldOwotCQkJaWYgKGxvdl9vaW5mb19pc19kdW1teShsb2kpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoIWxvdi0+bG92X3RndHNbbG9pLT5sb2lfb3N0X2lkeF0pCi0JCQkJY29udGludWU7Ci0JCQlpZiAobG92LT5sb3ZfdGd0c1tsb2ktPmxvaV9vc3RfaWR4XS0+bHRkX2V4cCA9PQotCQkJICAgIGRhdGEtPmxvY2stPmxfY29ubl9leHBvcnQgJiYKLQkJCSAgICBvc3RpZF9yZXNfbmFtZV9lcSgmbG9pLT5sb2lfb2ksIHJlc19pZCkpIHsKLQkJCQkqc3RyaXBlID0gaTsKLQkJCQlyYyA9IDA7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0KLQkJTERMTV9FUlJPUihkYXRhLT5sb2NrLCAibG9jayBvbiBpbm9kZSB3aXRob3V0IHN1Y2ggb2JqZWN0Iik7Ci0JCWR1bXBfbHNtKERfRVJST1IsIGxzbSk7Ci0JCXJjID0gLUVOWElPOwotCQlnb3RvIG91dDsKLQl9IGVsc2UgaWYgKEtFWV9JUyhLRVlfTEFTVF9JRCkpIHsKLQkJc3RydWN0IG9iZF9pZF9pbmZvICppbmZvID0gdmFsOwotCQlfX3UzMiBzaXplID0gc2l6ZW9mKHU2NCk7Ci0JCXN0cnVjdCBsb3ZfdGd0X2Rlc2MgKnRndDsKLQotCQlMQVNTRVJUKCp2YWxsZW4gPT0gc2l6ZW9mKHN0cnVjdCBvYmRfaWRfaW5mbykpOwotCQl0Z3QgPSBsb3YtPmxvdl90Z3RzW2luZm8tPmlkeF07Ci0KLQkJaWYgKCF0Z3QgfHwgIXRndC0+bHRkX2FjdGl2ZSkgewotCQkJcmMgPSAtRVNSQ0g7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCXJjID0gb2JkX2dldF9pbmZvKGVudiwgdGd0LT5sdGRfZXhwLCBrZXlsZW4sIGtleSwKLQkJCQkgICZzaXplLCBpbmZvLT5kYXRhLCBOVUxMKTsKLQkJcmMgPSAwOwotCQlnb3RvIG91dDsKLQl9IGVsc2UgaWYgKEtFWV9JUyhLRVlfTE9WREVTQykpIHsKKwlpZiAoS0VZX0lTKEtFWV9MT1ZERVNDKSkgewogCQlzdHJ1Y3QgbG92X2Rlc2MgKmRlc2NfcmV0ID0gdmFsOwogCQkqZGVzY19yZXQgPSBsb3YtPmRlc2M7CiAKQEAgLTIwNjAsMjIgKzE4MzAsNiBAQAogCX0gZWxzZSBpZiAoS0VZX0lTKEtFWV9GSUVNQVApKSB7CiAJCXJjID0gbG92X2ZpZW1hcChsb3YsIGtleWxlbiwga2V5LCB2YWxsZW4sIHZhbCwgbHNtKTsKIAkJZ290byBvdXQ7Ci0JfSBlbHNlIGlmIChLRVlfSVMoS0VZX0NPTk5FQ1RfRkxBRykpIHsKLQkJc3RydWN0IGxvdl90Z3RfZGVzYyAqdGd0OwotCQlfX3U2NCBvc3RfaWR4ID0gKigoX191NjQgKil2YWwpOwotCi0JCUxBU1NFUlQoKnZhbGxlbiA9PSBzaXplb2YoX191NjQpKTsKLQkJTEFTU0VSVChvc3RfaWR4IDwgbG92LT5kZXNjLmxkX3RndF9jb3VudCk7Ci0JCXRndCA9IGxvdi0+bG92X3RndHNbb3N0X2lkeF07Ci0KLQkJaWYgKCF0Z3QgfHwgIXRndC0+bHRkX2V4cCkgewotCQkJcmMgPSAtRVNSQ0g7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCSooKF9fdTY0ICopdmFsKSA9IGV4cF9jb25uZWN0X2ZsYWdzKHRndC0+bHRkX2V4cCk7Ci0JCXJjID0gMDsKLQkJZ290byBvdXQ7CiAJfSBlbHNlIGlmIChLRVlfSVMoS0VZX1RHVF9DT1VOVCkpIHsKIAkJKigoaW50ICopdmFsKSA9IGxvdi0+ZGVzYy5sZF90Z3RfY291bnQ7CiAJCXJjID0gMDsKQEAgLTIwOTgsOCArMTg1Miw3IEBACiAJdTMyIGNvdW50OwogCWludCBpLCByYyA9IDAsIGVycjsKIAlzdHJ1Y3QgbG92X3RndF9kZXNjICp0Z3Q7Ci0JdW5zaWduZWQgaW50IGluY3IgPSAwLCBjaGVja191dWlkID0gMCwgZG9faW5hY3RpdmUgPSAwLCBub19zZXQgPSAwOwotCXVuc2lnbmVkIGludCBuZXh0X2lkID0gMCwgbWRzX2NvbiA9IDA7CisJaW50IGRvX2luYWN0aXZlID0gMCwgbm9fc2V0ID0gMDsKIAogCWlmICghc2V0KSB7CiAJCW5vX3NldCA9IDE7CkBAIC0yMTExLDE4ICsxODY0LDggQEAKIAlvYmRfZ2V0cmVmKG9iZGRldik7CiAJY291bnQgPSBsb3YtPmRlc2MubGRfdGd0X2NvdW50OwogCi0JaWYgKEtFWV9JUyhLRVlfTkVYVF9JRCkpIHsKLQkJY291bnQgPSB2YWxsZW4gLyBzaXplb2Yoc3RydWN0IG9iZF9pZF9pbmZvKTsKLQkJdmFsbGVuID0gc2l6ZW9mKHU2NCk7Ci0JCWluY3IgPSBzaXplb2Yoc3RydWN0IG9iZF9pZF9pbmZvKTsKKwlpZiAoS0VZX0lTKEtFWV9DSEVDS1NVTSkpIHsKIAkJZG9faW5hY3RpdmUgPSAxOwotCQluZXh0X2lkID0gMTsKLQl9IGVsc2UgaWYgKEtFWV9JUyhLRVlfQ0hFQ0tTVU0pKSB7Ci0JCWRvX2luYWN0aXZlID0gMTsKLQl9IGVsc2UgaWYgKEtFWV9JUyhLRVlfRVZJQ1RfQllfTklEKSkgewotCQkvKiB1c2UgZGVmYXVsdHM6ICBkb19pbmFjdGl2ZSA9IGluY3IgPSAwOyAqLwotCX0gZWxzZSBpZiAoS0VZX0lTKEtFWV9NRFNfQ09OTikpIHsKLQkJbWRzX2NvbiA9IDE7CiAJfSBlbHNlIGlmIChLRVlfSVMoS0VZX0NBQ0hFX1NFVCkpIHsKIAkJTEFTU0VSVCghbG92LT5sb3ZfY2FjaGUpOwogCQlsb3YtPmxvdl9jYWNoZSA9IHZhbDsKQEAgLTIxMzAsMTEgKzE4NzMsOSBAQAogCQljbF9jYWNoZV9pbmNyZWYobG92LT5sb3ZfY2FjaGUpOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCB2YWwgPSAoY2hhciAqKXZhbCArIGluY3IpIHsKLQkJaWYgKG5leHRfaWQpCi0JCQl0Z3QgPSBsb3YtPmxvdl90Z3RzWygoc3RydWN0IG9iZF9pZF9pbmZvICopdmFsKS0+aWR4XTsKLQkJZWxzZQotCQkJdGd0ID0gbG92LT5sb3ZfdGd0c1tpXTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQl0Z3QgPSBsb3YtPmxvdl90Z3RzW2ldOworCiAJCS8qIE9TVCB3YXMgZGlzY29ubmVjdGVkICovCiAJCWlmICghdGd0IHx8ICF0Z3QtPmx0ZF9leHApCiAJCQljb250aW51ZTsKQEAgLTIxNDMsMzQgKzE4ODQsOCBAQAogCQlpZiAoIXRndC0+bHRkX2FjdGl2ZSAmJiAhZG9faW5hY3RpdmUpCiAJCQljb250aW51ZTsKIAotCQlpZiAobWRzX2NvbikgewotCQkJc3RydWN0IG1kc19ncm91cF9pbmZvICptZ2k7Ci0KLQkJCUxBU1NFUlQodmFsbGVuID09IHNpemVvZigqbWdpKSk7Ci0JCQltZ2kgPSAoc3RydWN0IG1kc19ncm91cF9pbmZvICopdmFsOwotCi0JCQkvKiBPbmx5IHdhbnQgYSBzcGVjaWZpYyBPU0MgKi8KLQkJCWlmIChtZ2ktPnV1aWQgJiYgIW9iZF91dWlkX2VxdWFscyhtZ2ktPnV1aWQsCi0JCQkJCQkJICAmdGd0LT5sdGRfdXVpZCkpCi0JCQkJY29udGludWU7Ci0KLQkJCWVyciA9IG9iZF9zZXRfaW5mb19hc3luYyhlbnYsIHRndC0+bHRkX2V4cCwKLQkJCQkJCSBrZXlsZW4sIGtleSwgc2l6ZW9mKGludCksCi0JCQkJCQkgJm1naS0+Z3JvdXAsIHNldCk7Ci0JCX0gZWxzZSBpZiAobmV4dF9pZCkgewotCQkJZXJyID0gb2JkX3NldF9pbmZvX2FzeW5jKGVudiwgdGd0LT5sdGRfZXhwLAotCQkJCQkga2V5bGVuLCBrZXksIHZhbGxlbiwKLQkJCQkJICgoc3RydWN0IG9iZF9pZF9pbmZvICopdmFsKS0+ZGF0YSwgc2V0KTsKLQkJfSBlbHNlIHsKLQkJCS8qIE9ubHkgd2FudCBhIHNwZWNpZmljIE9TQyAqLwotCQkJaWYgKGNoZWNrX3V1aWQgJiYKLQkJCSAgICAhb2JkX3V1aWRfZXF1YWxzKHZhbCwgJnRndC0+bHRkX3V1aWQpKQotCQkJCWNvbnRpbnVlOwotCi0JCQllcnIgPSBvYmRfc2V0X2luZm9fYXN5bmMoZW52LCB0Z3QtPmx0ZF9leHAsCi0JCQkJCQkga2V5bGVuLCBrZXksIHZhbGxlbiwgdmFsLCBzZXQpOwotCQl9Ci0KKwkJZXJyID0gb2JkX3NldF9pbmZvX2FzeW5jKGVudiwgdGd0LT5sdGRfZXhwLCBrZXlsZW4sIGtleSwKKwkJCQkJIHZhbGxlbiwgdmFsLCBzZXQpOwogCQlpZiAoIXJjKQogCQkJcmMgPSBlcnI7CiAJfQpAQCAtMjMxOCwxMiArMjAzMyw4IEBACiAJLnN0YXRmc19hc3luYyAgID0gbG92X3N0YXRmc19hc3luYywKIAkucGFja21kICAgICAgICAgPSBsb3ZfcGFja21kLAogCS51bnBhY2ttZCAgICAgICA9IGxvdl91bnBhY2ttZCwKLQkuY3JlYXRlICAgICAgICAgPSBsb3ZfY3JlYXRlLAotCS5kZXN0cm95ICAgICAgICA9IGxvdl9kZXN0cm95LAogCS5nZXRhdHRyX2FzeW5jICA9IGxvdl9nZXRhdHRyX2FzeW5jLAogCS5zZXRhdHRyX2FzeW5jICA9IGxvdl9zZXRhdHRyX2FzeW5jLAotCS5hZGp1c3Rfa21zICAgICA9IGxvdl9hZGp1c3Rfa21zLAotCS5maW5kX2NiZGF0YSAgICA9IGxvdl9maW5kX2NiZGF0YSwKIAkuaW9jb250cm9sICAgICAgPSBsb3ZfaW9jb250cm9sLAogCS5nZXRfaW5mbyAgICAgICA9IGxvdl9nZXRfaW5mbywKIAkuc2V0X2luZm9fYXN5bmMgPSBsb3Zfc2V0X2luZm9fYXN5bmMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iamVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmplY3QuYwppbmRleCBmOTYyMWIwLi41MmY3MzYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iamVjdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JqZWN0LmMKQEAgLTc1LDYgKzc1LDEzIEBACiAKIHN0YXRpYyBpbnQgbG92X2xheW91dF93YWl0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGxvdl9vYmplY3QgKmxvdik7CiAKK3ZvaWQgbG92X2xzbV9wdXQoc3RydWN0IGNsX29iamVjdCAqdW51c2VkLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQoreworCWlmIChsc20pCisJCWxvdl9mcmVlX21lbW1kKCZsc20pOworfQorRVhQT1JUX1NZTUJPTChsb3ZfbHNtX3B1dCk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIExvdiBvYmplY3QgbGF5b3V0IG9wZXJhdGlvbnMuCkBAIC0xOTUsNiArMjAyLDEwIEBACiAJc3RydWN0IGNsX29iamVjdF9oZWFkZXIgKmhkciA9IGNsX29iamVjdF9oZWFkZXIoJmxvdi0+bG9fY2wpOwogCXN0cnVjdCBjbF9vYmplY3QgKm87CiAKKwlpZiAoIXN0cmlwZSkKKwkJcmV0dXJuIGhkci0+Y29oX3BhZ2VfYnVmc2l6ZSAtIGxvdi0+bG9fY2wuY29fc2xpY2Vfb2ZmIC0KKwkJICAgICAgIGNmc19zaXplX3JvdW5kKHNpemVvZihzdHJ1Y3QgbG92X3BhZ2UpKTsKKwogCWNsX29iamVjdF9mb3JfZWFjaChvLCBzdHJpcGUpCiAJCW8tPmNvX3NsaWNlX29mZiArPSBoZHItPmNvaF9wYWdlX2J1ZnNpemU7CiAKQEAgLTIyNCw2ICsyMzUsNyBAQAogCiAJTEFTU0VSVCghbG92LT5sb19sc20pOwogCWxvdi0+bG9fbHNtID0gbHNtX2FkZHJlZihsc20pOworCWxvdi0+bG9fbGF5b3V0X2ludmFsaWQgPSB0cnVlOwogCXIwLT5sb19uciAgPSBsc20tPmxzbV9zdHJpcGVfY291bnQ7CiAJTEFTU0VSVChyMC0+bG9fbnIgPD0gbG92X3RhcmdldHNfbnIoZGV2KSk7CiAKQEAgLTcxOSw2ICs3MzEsMTAgQEAKIAkJTEFTU0VSVChhdG9taWNfcmVhZCgmbG92LT5sb19hY3RpdmVfaW9zKSA9PSAwKTsKIAogCQlsb3YtPmxvX3R5cGUgPSBMTFRfRU1QVFk7CisJCS8qIHBhZ2UgYnVmc2l6ZSBmaXh1cCAqLworCQljbF9vYmplY3RfaGVhZGVyKCZsb3YtPmxvX2NsKS0+Y29oX3BhZ2VfYnVmc2l6ZSAtPQorCQkJbG92X3BhZ2Vfc2xpY2VfZml4dXAobG92LCBOVUxMKTsKKwogCQlyZXN1bHQgPSBuZXdfb3BzLT5sbG9faW5pdChlbnYsCiAJCQkJCWx1Mmxvdl9kZXYobG92LT5sb19jbC5jb19sdS5sb19kZXYpLAogCQkJCQlsb3YsIGNvbmYsIHN0YXRlKTsKQEAgLTg3OCw4ICs4OTQsOCBAQAogCXJldHVybiBMT1ZfMkRJU1BBVENIX05PTE9DSyhjbDJsb3Yob2JqKSwgbGxvX2dldGF0dHIsIGVudiwgb2JqLCBhdHRyKTsKIH0KIAotc3RhdGljIGludCBsb3ZfYXR0cl9zZXQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCi0JCQljb25zdCBzdHJ1Y3QgY2xfYXR0ciAqYXR0ciwgdW5zaWduZWQgdmFsaWQpCitzdGF0aWMgaW50IGxvdl9hdHRyX3VwZGF0ZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBjbF9hdHRyICphdHRyLCB1bnNpZ25lZCBpbnQgdmFsaWQpCiB7CiAJLyoKIAkgKiBObyBkaXNwYXRjaCBpcyByZXF1aXJlZCBoZXJlLCBhcyBubyBsYXlvdXQgaW1wbGVtZW50cyB0aGlzLgpAQCAtODk1LDEzICs5MTEsMzAgQEAKIAkJCQkgICAgaW8pOwogfQogCitzdGF0aWMgaW50IGxvdl9vYmplY3RfZ2V0c3RyaXBlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAorCQkJCXN0cnVjdCBsb3ZfdXNlcl9tZCBfX3VzZXIgKmx1bSkKK3sKKwlzdHJ1Y3QgbG92X29iamVjdCAqbG92ID0gY2wybG92KG9iaik7CisJc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbTsKKwlpbnQgcmMgPSAwOworCisJbHNtID0gbG92X2xzbV9hZGRyZWYobG92KTsKKwlpZiAoIWxzbSkKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJcmMgPSBsb3ZfZ2V0c3RyaXBlKGNsMmxvdihvYmopLCBsc20sIGx1bSk7CisJbG92X2xzbV9wdXQob2JqLCBsc20pOworCXJldHVybiByYzsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBjbF9vYmplY3Rfb3BlcmF0aW9ucyBsb3Zfb3BzID0gewogCS5jb29fcGFnZV9pbml0ID0gbG92X3BhZ2VfaW5pdCwKIAkuY29vX2xvY2tfaW5pdCA9IGxvdl9sb2NrX2luaXQsCiAJLmNvb19pb19pbml0ICAgPSBsb3ZfaW9faW5pdCwKIAkuY29vX2F0dHJfZ2V0ICA9IGxvdl9hdHRyX2dldCwKLQkuY29vX2F0dHJfc2V0ICA9IGxvdl9hdHRyX3NldCwKLQkuY29vX2NvbmZfc2V0ICA9IGxvdl9jb25mX3NldAorCS5jb29fYXR0cl91cGRhdGUgPSBsb3ZfYXR0cl91cGRhdGUsCisJLmNvb19jb25mX3NldCAgPSBsb3ZfY29uZl9zZXQsCisJLmNvb19nZXRzdHJpcGUgPSBsb3Zfb2JqZWN0X2dldHN0cmlwZQogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBsdV9vYmplY3Rfb3BlcmF0aW9ucyBsb3ZfbHVfb2JqX29wcyA9IHsKQEAgLTkzOCw3ICs5NzEsNyBAQAogCXJldHVybiBvYmo7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbG92X2xzbV9hZGRyZWYoc3RydWN0IGxvdl9vYmplY3QgKmxvdikKK3N0cnVjdCBsb3Zfc3RyaXBlX21kICpsb3ZfbHNtX2FkZHJlZihzdHJ1Y3QgbG92X29iamVjdCAqbG92KQogewogCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20gPSBOVUxMOwogCkBAIC05NjksMTMgKzEwMDIsNiBAQAogfQogRVhQT1JUX1NZTUJPTChsb3ZfbHNtX2dldCk7CiAKLXZvaWQgbG92X2xzbV9wdXQoc3RydWN0IGNsX29iamVjdCAqdW51c2VkLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQotewotCWlmIChsc20pCi0JCWxvdl9mcmVlX21lbW1kKCZsc20pOwotfQotRVhQT1JUX1NZTUJPTChsb3ZfbHNtX3B1dCk7Ci0KIGludCBsb3ZfcmVhZF9hbmRfY2xlYXJfYXN5bmNfcmMoc3RydWN0IGNsX29iamVjdCAqY2xvYikKIHsKIAlzdHJ1Y3QgbHVfb2JqZWN0ICpsdW9iajsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcGFjay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wYWNrLmMKaW5kZXggODY5ZWY0MS4uYmU2ZTk4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wYWNrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wYWNrLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfdXNlci5oIgogCiAjaW5jbHVkZSAibG92X2ludGVybmFsLmgiCisjaW5jbHVkZSAibG92X2NsX2ludGVybmFsLmgiCiAKIHZvaWQgbG92X2R1bXBfbG1tX2NvbW1vbihpbnQgbGV2ZWwsIHZvaWQgKmxtbXApCiB7CkBAIC0xMDQsMTEgKzEwNSw5IEBACiAgKiAgICAgTE9WcyBwcm9wZXJseS4gIEZvciBub3cgbG92X21kc19tZF9zaXplKCkganVzdCBhc3N1bWVzIG9uZSB1NjQKICAqICAgICBwZXIgc3RyaXBlLgogICovCi1pbnQgbG92X3BhY2ttZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbG92X21kc19tZCAqKmxtbXAsCi0JICAgICAgIHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20pCitpbnQgbG92X29iZF9wYWNrbWQoc3RydWN0IGxvdl9vYmQgKmxvdiwgc3RydWN0IGxvdl9tZHNfbWQgKipsbW1wLAorCQkgICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQogewotCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQgPSBjbGFzc19leHAyb2JkKGV4cCk7Ci0Jc3RydWN0IGxvdl9vYmQgKmxvdiA9ICZvYmQtPnUubG92OwogCXN0cnVjdCBsb3ZfbWRzX21kX3YxICpsbW12MTsKIAlzdHJ1Y3QgbG92X21kc19tZF92MyAqbG1tdjM7CiAJX191MTYgc3RyaXBlX2NvdW50OwpAQCAtMTQ4LDE2ICsxNDcsMTEgQEAKIAkJCXN0cmlwZV9jb3VudCA9IDA7CiAJCX0KIAl9IGVsc2UgewotCQkvKiBObyBuZWVkIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiBtYXhpbXVtIHN1cHBvcnRlZCBzdHJpcGVzLgotCQkgKiBBbnl3YXksIHRoaXMgaXMgcHJldHR5IGluYWNjdXJhdGUgc2luY2UgbGRfdGd0X2NvdW50IG5vdwotCQkgKiByZXByZXNlbnRzIG1heCBpbmRleCBhbmQgd2Ugc2hvdWxkIHJlbHkgb24gdGhlIGFjdHVhbCBudW1iZXIKLQkJICogb2YgT1NUcyBpbnN0ZWFkCisJCS8qCisJCSAqIFRvIGNhbGN1bGF0ZSBtYXhpbXVtIGVhc2l6ZSBieSBhY3RpdmUgdGFyZ2V0cyBhdCBwcmVzZW50LAorCQkgKiB3aGljaCBpcyBleGFjdGx5IHRoZSBtYXhpbXVtIGVhc2l6ZSB0byBiZSBzZWVuIGJ5IExPVgogCQkgKi8KLQkJc3RyaXBlX2NvdW50ID0gbG92X21kc19tZF9tYXhfc3RyaXBlX2NvdW50KAotCQkJbG92LT5sb3Zfb2NkLm9jZF9tYXhfZWFzaXplLCBsbW1fbWFnaWMpOwotCi0JCWlmIChzdHJpcGVfY291bnQgPiBsb3YtPmRlc2MubGRfdGd0X2NvdW50KQotCQkJc3RyaXBlX2NvdW50ID0gbG92LT5kZXNjLmxkX3RndF9jb3VudDsKKwkJc3RyaXBlX2NvdW50ID0gbG92LT5kZXNjLmxkX2FjdGl2ZV90Z3RfY291bnQ7CiAJfQogCiAJLyogWFhYIExPViBTVEFDS0lORyBjYWxsIGludG8gb3NjIGZvciBzaXplcyAqLwpAQCAtMjI1LDYgKzIxOSwxNSBAQAogCXJldHVybiBsbW1fc2l6ZTsKIH0KIAoraW50IGxvdl9wYWNrbWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9tZHNfbWQgKipsbW1wLAorCSAgICAgICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQoreworCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQgPSBjbGFzc19leHAyb2JkKGV4cCk7CisJc3RydWN0IGxvdl9vYmQgKmxvdiA9ICZvYmQtPnUubG92OworCisJcmV0dXJuIGxvdl9vYmRfcGFja21kKGxvdiwgbG1tcCwgbHNtKTsKK30KKwogLyogRmluZCB0aGUgbWF4IHN0cmlwZWNvdW50IHdlIHNob3VsZCB1c2UgKi8KIF9fdTE2IGxvdl9nZXRfc3RyaXBlY250KHN0cnVjdCBsb3Zfb2JkICpsb3YsIF9fdTMyIG1hZ2ljLCBfX3UxNiBzdHJpcGVfY291bnQpCiB7CkBAIC0yODQsNyArMjg3LDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmKCpsc21wKS0+bHNtX2xvY2spOwogCSgqbHNtcCktPmxzbV9tYWdpYyA9IG1hZ2ljOwogCSgqbHNtcCktPmxzbV9zdHJpcGVfY291bnQgPSBzdHJpcGVfY291bnQ7Ci0JKCpsc21wKS0+bHNtX21heGJ5dGVzID0gTFVTVFJFX1NUUklQRV9NQVhCWVRFUyAqIHN0cmlwZV9jb3VudDsKKwkoKmxzbXApLT5sc21fbWF4Ynl0ZXMgPSBMVVNUUkVfRVhUM19TVFJJUEVfTUFYQllURVMgKiBzdHJpcGVfY291bnQ7CiAJKCpsc21wKS0+bHNtX3BhdHRlcm4gPSBwYXR0ZXJuOwogCSgqbHNtcCktPmxzbV9wb29sX25hbWVbMF0gPSAnXDAnOwogCSgqbHNtcCktPmxzbV9sYXlvdXRfZ2VuID0gMDsKQEAgLTM3MiwxNiArMzc1LDE3IEBACiAgKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgT1NUIGluZGljZXMgd2hpY2ggd2lsbCBmaXQgaW4gdGhlIHVzZXIgYnVmZmVyLgogICogbG1tX21hZ2ljIG11c3QgYmUgTE9WX1VTRVJfTUFHSUMuCiAgKi8KLWludCBsb3ZfZ2V0c3RyaXBlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sCitpbnQgbG92X2dldHN0cmlwZShzdHJ1Y3QgbG92X29iamVjdCAqb2JqLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLAogCQkgIHN0cnVjdCBsb3ZfdXNlcl9tZCBfX3VzZXIgKmx1bXApCiB7CiAJLyoKIAkgKiBYWFggaHVnZSBzdHJ1Y3QgYWxsb2NhdGVkIG9uIHN0YWNrLgogCSAqLwogCS8qIHdlIHVzZSBsb3ZfdXNlcl9tZF92MyBiZWNhdXNlIGl0IGlzIGxhcmdlciB0aGFuIGxvdl91c2VyX21kX3YxICovCisJc3RydWN0IGxvdl9vYmQgKmxvdjsKIAlzdHJ1Y3QgbG92X3VzZXJfbWRfdjMgbHVtOwogCXN0cnVjdCBsb3ZfbWRzX21kICpsbW1rID0gTlVMTDsKLQlpbnQgcmMsIGxtbV9zaXplOworCWludCByYywgbG1ta19zaXplLCBsbW1fc2l6ZTsKIAlpbnQgbHVtX3NpemU7CiAJbW1fc2VnbWVudF90IHNlZzsKIApAQCAtNDAxLDEyICs0MDUsMTMgQEAKIAlsdW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbG92X3VzZXJfbWRfdjEpOwogCWlmIChjb3B5X2Zyb21fdXNlcigmbHVtLCBsdW1wLCBsdW1fc2l6ZSkpIHsKIAkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIG91dF9zZXQ7CisJCWdvdG8gb3V0OwogCX0KLQlpZiAoKGx1bS5sbW1fbWFnaWMgIT0gTE9WX1VTRVJfTUFHSUMpICYmCi0JICAgIChsdW0ubG1tX21hZ2ljICE9IExPVl9VU0VSX01BR0lDX1YzKSkgeworCWlmIChsdW0ubG1tX21hZ2ljICE9IExPVl9VU0VSX01BR0lDX1YxICYmCisJICAgIGx1bS5sbW1fbWFnaWMgIT0gTE9WX1VTRVJfTUFHSUNfVjMgJiYKKwkgICAgbHVtLmxtbV9tYWdpYyAhPSBMT1ZfVVNFUl9NQUdJQ19TUEVDSUZJQykgewogCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X3NldDsKKwkJZ290byBvdXQ7CiAJfQogCiAJaWYgKGx1bS5sbW1fc3RyaXBlX2NvdW50ICYmCkBAIC00MTUsMTEgKzQyMCwxMyBAQAogCQlsdW0ubG1tX3N0cmlwZV9jb3VudCA9IGxzbS0+bHNtX3N0cmlwZV9jb3VudDsKIAkJcmMgPSBjb3B5X3RvX3VzZXIobHVtcCwgJmx1bSwgbHVtX3NpemUpOwogCQlyYyA9IC1FT1ZFUkZMT1c7Ci0JCWdvdG8gb3V0X3NldDsKKwkJZ290byBvdXQ7CiAJfQotCXJjID0gbG92X3BhY2ttZChleHAsICZsbW1rLCBsc20pOworCWxvdiA9IGx1Mmxvdl9kZXYob2JqLT5sb19jbC5jb19sdS5sb19kZXYpLT5sZF9sb3Y7CisJcmMgPSBsb3Zfb2JkX3BhY2ttZChsb3YsICZsbW1rLCBsc20pOwogCWlmIChyYyA8IDApCi0JCWdvdG8gb3V0X3NldDsKKwkJZ290byBvdXQ7CisJbG1ta19zaXplID0gcmM7CiAJbG1tX3NpemUgPSByYzsKIAlyYyA9IDA7CiAKQEAgLTQ1NSw3ICs0NjIsNyBAQAogCQlsbW1fc2l6ZSA9IGx1bV9zaXplOwogCX0gZWxzZSBpZiAobHVtLmxtbV9zdHJpcGVfY291bnQgPCBsbW1rLT5sbW1fc3RyaXBlX2NvdW50KSB7CiAJCXJjID0gLUVPVkVSRkxPVzsKLQkJZ290byBvdXRfc2V0OworCQlnb3RvIG91dF9mcmVlOwogCX0KIAkvKgogCSAqIEhhdmUgYSBkaWZmZXJlbmNlIGJldHdlZW4gbG92X21kc19tZCAmIGxvdl91c2VyX21kLgpAQCAtNDY4LDggKzQ3NSw5IEBACiAJaWYgKGNvcHlfdG9fdXNlcihsdW1wLCBsbW1rLCBsbW1fc2l6ZSkpCiAJCXJjID0gLUVGQVVMVDsKIAotCW9iZF9mcmVlX2Rpc2ttZChleHAsICZsbW1rKTsKLW91dF9zZXQ6CitvdXRfZnJlZToKKwlrZnJlZShsbW1rKTsKK291dDoKIAlzZXRfZnMoc2VnKTsKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3BhZ2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcGFnZS5jCmluZGV4IGMxNzAyNmYuLjAwYmZhYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcGFnZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcGFnZS5jCkBAIC02NSw3ICs2NSw5IEBACiAJcGdvZmZfdCBpbmRleCA9ICptYXhfaW5kZXg7CiAJdW5zaWduZWQgaW50IHBwczsgLyogcGFnZXMgcGVyIHN0cmlwZSAqLwogCi0JQ0RFQlVHKERfUkVBREEsICIqbWF4X2luZGV4ID0gJWx1LCBuciA9ICVkXG4iLCBpbmRleCwgcjAtPmxvX25yKTsKKwlDREVCVUcoRF9SRUFEQSwgREZJRCAiKm1heF9pbmRleCA9ICVsdSwgbnIgPSAlZFxuIiwKKwkgICAgICAgUEZJRChsdV9vYmplY3RfZmlkKGxvdjJsdShsb28pKSksIGluZGV4LCByMC0+bG9fbnIpOworCiAJaWYgKGluZGV4ID09IDApIC8qIHRoZSBwYWdlIGlzIG5vdCBjb3ZlcmVkIGJ5IGFueSBsb2NrICovCiAJCXJldHVybiAwOwogCkBAIC04MCw3ICs4MiwxMiBAQAogCiAJLyogY2FsY3VsYXRlIHRoZSBlbmQgb2YgY3VycmVudCBzdHJpcGUgKi8KIAlwcHMgPSBsb28tPmxvX2xzbS0+bHNtX3N0cmlwZV9zaXplID4+IFBBR0VfU0hJRlQ7Ci0JaW5kZXggPSAoKHNsaWNlLT5jcGxfaW5kZXggKyBwcHMpICYgfihwcHMgLSAxKSkgLSAxOworCWluZGV4ID0gc2xpY2UtPmNwbF9pbmRleCArIHBwcyAtIHNsaWNlLT5jcGxfaW5kZXggJSBwcHMgLSAxOworCisJQ0RFQlVHKERfUkVBREEsIERGSUQgIiptYXhfaW5kZXggPSAlbHUsIGluZGV4ID0gJWx1LCBwcHMgPSAldSwgc3RyaXBlX3NpemUgPSAldSwgc3RyaXBlIG5vID0gJXUsIHBhZ2UgaW5kZXggPSAlbHVcbiIsCisJICAgICAgIFBGSUQobHVfb2JqZWN0X2ZpZChsb3YybHUobG9vKSkpLCAqbWF4X2luZGV4LCBpbmRleCwgcHBzLAorCSAgICAgICBsb28tPmxvX2xzbS0+bHNtX3N0cmlwZV9zaXplLCBsb3ZfcGFnZV9zdHJpcGUoc2xpY2UtPmNwbF9wYWdlKSwKKwkgICAgICAgc2xpY2UtPmNwbF9pbmRleCk7CiAKIAkvKiBuZXZlciBleGNlZWQgdGhlIGVuZCBvZiB0aGUgc3RyaXBlICovCiAJKm1heF9pbmRleCA9IG1pbl90KHBnb2ZmX3QsICptYXhfaW5kZXgsIGluZGV4KTsKQEAgLTEyMiw2ICsxMjksNyBAQAogCXJjID0gbG92X3N0cmlwZV9vZmZzZXQobG9vLT5sb19sc20sIG9mZnNldCwgc3RyaXBlLCAmc3Vib2ZmKTsKIAlMQVNTRVJUKHJjID09IDApOwogCisJbHBnLT5scHNfc3RyaXBlID0gc3RyaXBlOwogCWNsX3BhZ2Vfc2xpY2VfYWRkKHBhZ2UsICZscGctPmxwc19jbCwgb2JqLCBpbmRleCwgJmxvdl9yYWlkMF9wYWdlX29wcyk7CiAKIAlzdWIgPSBsb3Zfc3ViX2dldChlbnYsIGxpbywgc3RyaXBlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcG9vbC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wb29sLmMKaW5kZXggNGMyZDIxNy4uZjhjOGEzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wb29sLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wb29sLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAkJTEFTU0VSVChobGlzdF91bmhhc2hlZCgmcG9vbC0+cG9vbF9oYXNoKSk7CiAJCUxBU1NFUlQobGlzdF9lbXB0eSgmcG9vbC0+cG9vbF9saXN0KSk7CiAJCUxBU1NFUlQoIXBvb2wtPnBvb2xfZGVidWdmc19lbnRyeSk7Ci0JCWxvdl9vc3RfcG9vbF9mcmVlKCYocG9vbC0+cG9vbF9vYmRzKSk7CisJCWxvdl9vc3RfcG9vbF9mcmVlKCZwb29sLT5wb29sX29iZHMpOwogCQlrZnJlZShwb29sKTsKIAl9CiB9CkBAIC05Miw3ICs5Miw3IEBACiAJZm9yIChpID0gMDsgaSA8IExPVl9NQVhQT09MTkFNRTsgaSsrKSB7CiAJCWlmIChwb29sbmFtZVtpXSA9PSAnXDAnKQogCQkJYnJlYWs7Ci0JCXJlc3VsdCA9IChyZXN1bHQgPDwgNCleKHJlc3VsdCA+PiAyOCkgXiAgcG9vbG5hbWVbaV07CisJCXJlc3VsdCA9IChyZXN1bHQgPDwgNCkgXiAocmVzdWx0ID4+IDI4KSBeICBwb29sbmFtZVtpXTsKIAl9CiAJcmV0dXJuIChyZXN1bHQgJSBtYXNrKTsKIH0KQEAgLTI2MCw3ICsyNjAsNyBAQAogCXRndCA9IHBvb2xfdGd0KGl0ZXItPnBvb2wsIGl0ZXItPmlkeCk7CiAJdXBfcmVhZCgmcG9vbF90Z3Rfcndfc2VtKGl0ZXItPnBvb2wpKTsKIAlpZiAodGd0KQotCQlzZXFfcHJpbnRmKHMsICIlc1xuIiwgb2JkX3V1aWQyc3RyKCYodGd0LT5sdGRfdXVpZCkpKTsKKwkJc2VxX3ByaW50ZihzLCAiJXNcbiIsIG9iZF91dWlkMnN0cigmdGd0LT5sdGRfdXVpZCkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MDAsNyArNDAwLDcgQEAKIAlzdHJ1Y3QgcG9vbF9kZXNjICpuZXdfcG9vbDsKIAlpbnQgcmM7CiAKLQlsb3YgPSAmKG9iZC0+dS5sb3YpOworCWxvdiA9ICZvYmQtPnUubG92OwogCiAJaWYgKHN0cmxlbihwb29sbmFtZSkgPiBMT1ZfTUFYUE9PTE5BTUUpCiAJCXJldHVybiAtRU5BTUVUT09MT05HOwpAQCAtNDcxLDcgKzQ3MSw3IEBACiAJc3RydWN0IGxvdl9vYmQgKmxvdjsKIAlzdHJ1Y3QgcG9vbF9kZXNjICpwb29sOwogCi0JbG92ID0gJihvYmQtPnUubG92KTsKKwlsb3YgPSAmb2JkLT51LmxvdjsKIAogCS8qIGxvb2t1cCBhbmQga2lsbCBoYXNoIHJlZmVyZW5jZSAqLwogCXBvb2wgPSBjZnNfaGFzaF9kZWxfa2V5KGxvdi0+bG92X3Bvb2xzX2hhc2hfYm9keSwgcG9vbG5hbWUpOwpAQCAtNTAzLDcgKzUwMyw3IEBACiAJdW5zaWduZWQgaW50IGxvdl9pZHg7CiAJaW50IHJjOwogCi0JbG92ID0gJihvYmQtPnUubG92KTsKKwlsb3YgPSAmb2JkLT51LmxvdjsKIAogCXBvb2wgPSBjZnNfaGFzaF9sb29rdXAobG92LT5sb3ZfcG9vbHNfaGFzaF9ib2R5LCBwb29sbmFtZSk7CiAJaWYgKCFwb29sKQpAQCAtNTE3LDcgKzUxNyw3IEBACiAJCWlmICghbG92LT5sb3ZfdGd0c1tsb3ZfaWR4XSkKIAkJCWNvbnRpbnVlOwogCQlpZiAob2JkX3V1aWRfZXF1YWxzKCZvc3RfdXVpZCwKLQkJCQkgICAgJihsb3YtPmxvdl90Z3RzW2xvdl9pZHhdLT5sdGRfdXVpZCkpKQorCQkJCSAgICAmbG92LT5sb3ZfdGd0c1tsb3ZfaWR4XS0+bHRkX3V1aWQpKQogCQkJYnJlYWs7CiAJfQogCS8qIHRlc3QgaWYgb3N0IGZvdW5kIGluIGxvdiAqLwpAQCAtNTQ3LDcgKzU0Nyw3IEBACiAJdW5zaWduZWQgaW50IGxvdl9pZHg7CiAJaW50IHJjID0gMDsKIAotCWxvdiA9ICYob2JkLT51Lmxvdik7CisJbG92ID0gJm9iZC0+dS5sb3Y7CiAKIAlwb29sID0gY2ZzX2hhc2hfbG9va3VwKGxvdi0+bG92X3Bvb2xzX2hhc2hfYm9keSwgcG9vbG5hbWUpOwogCWlmICghcG9vbCkKQEAgLTU2Miw3ICs1NjIsNyBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKG9iZF91dWlkX2VxdWFscygmb3N0X3V1aWQsCi0JCQkJICAgICYobG92LT5sb3ZfdGd0c1tsb3ZfaWR4XS0+bHRkX3V1aWQpKSkKKwkJCQkgICAgJmxvdi0+bG92X3RndHNbbG92X2lkeF0tPmx0ZF91dWlkKSkKIAkJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9yZXF1ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3JlcXVlc3QuYwppbmRleCA0MDk5YjUxLi4wOWRjYWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3JlcXVlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3JlcXVlc3QuYwpAQCAtMzI1LDg0ICszMjUsNiBAQAogCXJldHVybiByYzsKIH0KIAotaW50IGxvdl9maW5pX2Rlc3Ryb3lfc2V0KHN0cnVjdCBsb3ZfcmVxdWVzdF9zZXQgKnNldCkKLXsKLQlpZiAoIXNldCkKLQkJcmV0dXJuIDA7Ci0JTEFTU0VSVChzZXQtPnNldF9leHApOwotCWlmIChhdG9taWNfcmVhZCgmc2V0LT5zZXRfY29tcGxldGVzKSkgewotCQkvKiBGSVhNRSB1cGRhdGUgcW9zIGRhdGEgaGVyZSAqLwotCX0KLQotCWxvdl9wdXRfcmVxc2V0KHNldCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGxvdl9wcmVwX2Rlc3Ryb3lfc2V0KHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBvYmRfaW5mbyAqb2luZm8sCi0JCQkgc3RydWN0IG9iZG8gKnNyY19vYSwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKLQkJCSBzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gKm90aSwKLQkJCSBzdHJ1Y3QgbG92X3JlcXVlc3Rfc2V0ICoqcmVxc2V0KQotewotCXN0cnVjdCBsb3ZfcmVxdWVzdF9zZXQgKnNldDsKLQlzdHJ1Y3QgbG92X29iZCAqbG92ID0gJmV4cC0+ZXhwX29iZC0+dS5sb3Y7Ci0JaW50IHJjID0gMCwgaTsKLQotCXNldCA9IGt6YWxsb2Moc2l6ZW9mKCpzZXQpLCBHRlBfTk9GUyk7Ci0JaWYgKCFzZXQpCi0JCXJldHVybiAtRU5PTUVNOwotCWxvdl9pbml0X3NldChzZXQpOwotCi0Jc2V0LT5zZXRfZXhwID0gZXhwOwotCXNldC0+c2V0X29pID0gb2luZm87Ci0Jc2V0LT5zZXRfb2ktPm9pX21kID0gbHNtOwotCXNldC0+c2V0X29pLT5vaV9vYSA9IHNyY19vYTsKLQlpZiAob3RpICYmIHNyY19vYS0+b192YWxpZCAmIE9CRF9NRF9GTENPT0tJRSkKLQkJc2V0LT5zZXRfY29va2llcyA9IG90aS0+b3RpX2xvZ2Nvb2tpZXM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbHNtLT5sc21fc3RyaXBlX2NvdW50OyBpKyspIHsKLQkJc3RydWN0IGxvdl9vaW5mbyAqbG9pOwotCQlzdHJ1Y3QgbG92X3JlcXVlc3QgKnJlcTsKLQotCQlsb2kgPSBsc20tPmxzbV9vaW5mb1tpXTsKLQkJaWYgKGxvdl9vaW5mb19pc19kdW1teShsb2kpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCFsb3ZfY2hlY2tfYW5kX3dhaXRfYWN0aXZlKGxvdiwgbG9pLT5sb2lfb3N0X2lkeCkpIHsKLQkJCUNERUJVRyhEX0hBLCAibG92IGlkeCAlZCBpbmFjdGl2ZVxuIiwgbG9pLT5sb2lfb3N0X2lkeCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXJlcSA9IGt6YWxsb2Moc2l6ZW9mKCpyZXEpLCBHRlBfTk9GUyk7Ci0JCWlmICghcmVxKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dF9zZXQ7Ci0JCX0KLQotCQlyZXEtPnJxX3N0cmlwZSA9IGk7Ci0JCXJlcS0+cnFfaWR4ID0gbG9pLT5sb2lfb3N0X2lkeDsKLQotCQlyZXEtPnJxX29pLm9pX29hID0ga21lbV9jYWNoZV96YWxsb2Mob2Jkb19jYWNoZXAsIEdGUF9OT0ZTKTsKLQkJaWYgKCFyZXEtPnJxX29pLm9pX29hKSB7Ci0JCQlrZnJlZShyZXEpOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBvdXRfc2V0OwotCQl9Ci0JCW1lbWNweShyZXEtPnJxX29pLm9pX29hLCBzcmNfb2EsIHNpemVvZigqcmVxLT5ycV9vaS5vaV9vYSkpOwotCQlyZXEtPnJxX29pLm9pX29hLT5vX29pID0gbG9pLT5sb2lfb2k7Ci0JCWxvdl9zZXRfYWRkX3JlcShyZXEsIHNldCk7Ci0JfQotCWlmICghc2V0LT5zZXRfY291bnQpIHsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIG91dF9zZXQ7Ci0JfQotCSpyZXFzZXQgPSBzZXQ7Ci0JcmV0dXJuIHJjOwotb3V0X3NldDoKLQlsb3ZfZmluaV9kZXN0cm95X3NldChzZXQpOwotCXJldHVybiByYzsKLX0KLQogaW50IGxvdl9maW5pX3NldGF0dHJfc2V0KHN0cnVjdCBsb3ZfcmVxdWVzdF9zZXQgKnNldCkKIHsKIAlpbnQgcmMgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdnN1Yl9vYmplY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZzdWJfb2JqZWN0LmMKaW5kZXggZmIyZjI2Ni4uYTJiYWM3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdnN1Yl9vYmplY3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92c3ViX29iamVjdC5jCkBAIC05OCw4ICs5OCw4IEBACiAJcmV0dXJuICgqcCkoZW52LCBjb29raWUsICJbJWRdIiwgbG9zLT5sc29faW5kZXgpOwogfQogCi1zdGF0aWMgaW50IGxvdnN1Yl9hdHRyX3NldChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKLQkJCSAgIGNvbnN0IHN0cnVjdCBjbF9hdHRyICphdHRyLCB1bnNpZ25lZCB2YWxpZCkKK3N0YXRpYyBpbnQgbG92c3ViX2F0dHJfdXBkYXRlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGNsX2F0dHIgKmF0dHIsIHVuc2lnbmVkIGludCB2YWxpZCkKIHsKIAlzdHJ1Y3QgbG92X29iamVjdCAqbG92ID0gY2wybG92c3ViKG9iaiktPmxzb19zdXBlcjsKIApAQCAtMTE5LDcgKzExOSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGNsX29iamVjdF9vcGVyYXRpb25zIGxvdnN1Yl9vcHMgPSB7CiAJLmNvb19wYWdlX2luaXQgPSBsb3ZzdWJfcGFnZV9pbml0LAogCS5jb29fbG9ja19pbml0ID0gbG92c3ViX2xvY2tfaW5pdCwKLQkuY29vX2F0dHJfc2V0ICA9IGxvdnN1Yl9hdHRyX3NldCwKKwkuY29vX2F0dHJfdXBkYXRlID0gbG92c3ViX2F0dHJfdXBkYXRlLAogCS5jb29fZ2xpbXBzZSAgID0gbG92c3ViX29iamVjdF9nbGltcHNlCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbHByb2NfbWRjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbHByb2NfbWRjLmMKaW5kZXggOThkMTVmYi4uZmNhOTQ1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL2xwcm9jX21kYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9scHJvY19tZGMuYwpAQCAtNDMsMTEgKzQzLDEwIEBACiAJaW50IGxlbjsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBvYmRfZGV2aWNlLAogCQkJCQkgICAgICBvYmRfa29iaik7Ci0Jc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZkZXYtPnUuY2xpOworCV9fdTMyIG1heDsKIAotCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBjbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCk7Ci0Jc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CisJbWF4ID0gb2JkX2dldF9tYXhfcnBjc19pbl9mbGlnaHQoJmRldi0+dS5jbGkpOworCWxlbiA9IHNwcmludGYoYnVmLCAiJXVcbiIsIG1heCk7CiAKIAlyZXR1cm4gbGVuOwogfQpAQCAtNTksNyArNTgsNiBAQAogewogCXN0cnVjdCBvYmRfZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IG9iZF9kZXZpY2UsCiAJCQkJCSAgICAgIG9iZF9rb2JqKTsKLQlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJmRldi0+dS5jbGk7CiAJaW50IHJjOwogCXVuc2lnbmVkIGxvbmcgdmFsOwogCkBAIC02NywxMiArNjUsOSBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JaWYgKHZhbCA8IDEgfHwgdmFsID4gTURDX01BWF9SSUZfTUFYKQotCQlyZXR1cm4gLUVSQU5HRTsKLQotCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQljbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCA9IHZhbDsKLQlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKKwlyYyA9IG9iZF9zZXRfbWF4X3JwY3NfaW5fZmxpZ2h0KCZkZXYtPnUuY2xpLCB2YWwpOworCWlmIChyYykKKwkJY291bnQgPSByYzsKIAogCXJldHVybiBjb3VudDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfaW50ZXJuYWwuaAppbmRleCA1OGYyODQxLi5mNDQ2YzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19pbnRlcm5hbC5oCkBAIC0zNCw2MyArMzQsNTcgQEAKICNkZWZpbmUgX01EQ19JTlRFUk5BTF9ICiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9tZGMuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9tZHMuaCIKIAogdm9pZCBscHJvY2ZzX21kY19pbml0X3ZhcnMoc3RydWN0IGxwcm9jZnNfc3RhdGljX3ZhcnMgKmx2YXJzKTsKIAogdm9pZCBtZGNfcGFja19ib2R5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCi0JCSAgIF9fdTY0IHZhbGlkLCBpbnQgZWFfc2l6ZSwgX191MzIgc3VwcGdpZCwgaW50IGZsYWdzKTsKLXZvaWQgbWRjX2lzX3N1YmRpcl9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpwZmlkLAotCQkJY29uc3Qgc3RydWN0IGx1X2ZpZCAqY2ZpZCwgaW50IGZsYWdzKTsKKwkJICAgX191NjQgdmFsaWQsIHNpemVfdCBlYV9zaXplLCBfX3UzMiBzdXBwZ2lkLCB1MzIgZmxhZ3MpOwogdm9pZCBtZGNfc3dhcF9sYXlvdXRzX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCiAJCQkgICBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSk7Ci12b2lkIG1kY19yZWFkZGlyX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIF9fdTY0IHBnb2ZmLCBfX3UzMiBzaXplLAordm9pZCBtZGNfcmVhZGRpcl9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBfX3U2NCBwZ29mZiwgc2l6ZV90IHNpemUsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCk7Ci12b2lkIG1kY19nZXRhdHRyX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIF9fdTY0IHZhbGlkLCBpbnQgZmxhZ3MsCi0JCSAgICAgIHN0cnVjdCBtZF9vcF9kYXRhICpkYXRhLCBpbnQgZWFfc2l6ZSk7Cit2b2lkIG1kY19nZXRhdHRyX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIF9fdTY0IHZhbGlkLCB1MzIgZmxhZ3MsCisJCSAgICAgIHN0cnVjdCBtZF9vcF9kYXRhICpkYXRhLCBzaXplX3QgZWFfc2l6ZSk7CiB2b2lkIG1kY19zZXRhdHRyX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkgICAgICB2b2lkICplYSwgaW50IGVhbGVuLCB2b2lkICplYTIsIGludCBlYTJsZW4pOworCQkgICAgICB2b2lkICplYSwgc2l6ZV90IGVhbGVuLCB2b2lkICplYTIsIHNpemVfdCBlYTJsZW4pOwogdm9pZCBtZGNfY3JlYXRlX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhbGVuLCBfX3UzMiBtb2RlLCBfX3UzMiB1aWQsCi0JCSAgICAgX191MzIgZ2lkLCBjZnNfY2FwX3QgY2FwYWJpbGl0eSwgX191NjQgcmRldik7CisJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4sIHVtb2RlX3QgbW9kZSwgdWlkX3QgdWlkLAorCQkgICAgIGdpZF90IGdpZCwgY2ZzX2NhcF90IGNhcGFiaWxpdHksIF9fdTY0IHJkZXYpOwogdm9pZCBtZGNfb3Blbl9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgX191MzIgbW9kZSwgX191NjQgcmRldiwgX191NjQgZmxhZ3MsIGNvbnN0IHZvaWQgKmRhdGEsCi0JCSAgIGludCBkYXRhbGVuKTsKKwkJICAgdW1vZGVfdCBtb2RlLCBfX3U2NCByZGV2LCBfX3U2NCBmbGFncywgY29uc3Qgdm9pZCAqZGF0YSwKKwkJICAgc2l6ZV90IGRhdGFsZW4pOwogdm9pZCBtZGNfdW5saW5rX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKTsKIHZvaWQgbWRjX2xpbmtfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEpOwogdm9pZCBtZGNfcmVuYW1lX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkgICAgIGNvbnN0IGNoYXIgKm9sZCwgaW50IG9sZGxlbiwgY29uc3QgY2hhciAqbmV3LCBpbnQgbmV3bGVuKTsKKwkJICAgICBjb25zdCBjaGFyICpvbGQsIHNpemVfdCBvbGRsZW4sCisJCSAgICAgY29uc3QgY2hhciAqbmV3LCBzaXplX3QgbmV3bGVuKTsKIHZvaWQgbWRjX2Nsb3NlX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKTsKLWludCBtZGNfZW50ZXJfcmVxdWVzdChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpKTsKLXZvaWQgbWRjX2V4aXRfcmVxdWVzdChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpKTsKIAogLyogbWRjL21kY19sb2Nrcy5jICovCiBpbnQgbWRjX3NldF9sb2NrX2RhdGEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKLQkJICAgICAgX191NjQgKmxvY2toLCB2b2lkICpkYXRhLCBfX3U2NCAqYml0cyk7CisJCSAgICAgIGNvbnN0IHN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCwKKwkJICAgICAgdm9pZCAqZGF0YSwgX191NjQgKmJpdHMpOwogCiBpbnQgbWRjX251bGxfaW5vZGUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKTsKIAotaW50IG1kY19maW5kX2NiZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCi0JCSAgICBsZGxtX2l0ZXJhdG9yX3QgaXQsIHZvaWQgKmRhdGEpOwotCiBpbnQgbWRjX2ludGVudF9sb2NrKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCSAgICBzdHJ1Y3QgbWRfb3BfZGF0YSAqLAotCQkgICAgdm9pZCAqbG1tLCBpbnQgbG1tc2l6ZSwKLQkJICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICosIGludCwKKwkJICAgIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAorCQkgICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LAogCQkgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxcCwKIAkJICAgIGxkbG1fYmxvY2tpbmdfY2FsbGJhY2sgY2JfYmxvY2tpbmcsCiAJCSAgICBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKTsKKwogaW50IG1kY19lbnF1ZXVlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyAqZWluZm8sCisJCWNvbnN0IGxkbG1fcG9saWN5X2RhdGFfdCAqcG9saWN5LAogCQlzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqbG9ja2gsIHZvaWQgKmxtbSwgaW50IGxtbXNpemUsCi0JCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcSwgX191NjQgZXh0cmFfbG9ja19mbGFncyk7CisJCXN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCwgX191NjQgZXh0cmFfbG9ja19mbGFncyk7CiAKIGludCBtZGNfcmVzb3VyY2VfZ2V0X3VudXNlZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCiAJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqY2FuY2VscywgZW51bSBsZGxtX21vZGUgIG1vZGUsCiAJCQkgICAgX191NjQgYml0cyk7CiAvKiBtZGMvbWRjX3JlcXVlc3QuYyAqLwotaW50IG1kY19maWRfYWxsb2Moc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGx1X2ZpZCAqZmlkLAotCQkgIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKTsKK2ludCBtZGNfZmlkX2FsbG9jKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJICBzdHJ1Y3QgbHVfZmlkICpmaWQsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKTsKIHN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZTsKIAogaW50IG1kY19zZXRfb3Blbl9yZXBsYXlfZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLApAQCAtMTAxLDE2ICs5NSwxNyBAQAogdm9pZCBtZGNfcmVwbGF5X29wZW4oc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpOwogCiBpbnQgbWRjX2NyZWF0ZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGRhdGFsZW4sIGludCBtb2RlLCBfX3UzMiB1aWQsIF9fdTMyIGdpZCwKLQkgICAgICAgY2ZzX2NhcF90IGNhcGFiaWxpdHksIF9fdTY0IHJkZXYsCisJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuLCB1bW9kZV90IG1vZGUsIHVpZF90IHVpZCwKKwkgICAgICAgZ2lkX3QgZ2lkLCBjZnNfY2FwX3QgY2FwYWJpbGl0eSwgX191NjQgcmRldiwKIAkgICAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCk7CiBpbnQgbWRjX2xpbmsoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCiAJICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KTsKIGludCBtZGNfcmVuYW1lKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCSAgICAgICBjb25zdCBjaGFyICpvbGQsIGludCBvbGRsZW4sIGNvbnN0IGNoYXIgKm5ldywgaW50IG5ld2xlbiwKKwkgICAgICAgY29uc3QgY2hhciAqb2xkLCBzaXplX3Qgb2xkbGVuLAorCSAgICAgICBjb25zdCBjaGFyICpuZXcsIHNpemVfdCBuZXdsZW4sCiAJICAgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpOwogaW50IG1kY19zZXRhdHRyKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQl2b2lkICplYSwgaW50IGVhbGVuLCB2b2lkICplYTIsIGludCBlYTJsZW4sCisJCXZvaWQgKmVhLCBzaXplX3QgZWFsZW4sIHZvaWQgKmVhMiwgc2l6ZV90IGVhMmxlbiwKIAkJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCwgc3RydWN0IG1kX29wZW5fZGF0YSAqKm1vZCk7CiBpbnQgbWRjX3VubGluayhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKIAkgICAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCk7CkBAIC0xMzgsNCArMTMzLDEyIEBACiAJCQkJIGNvdW50KTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhhc2hfeF9pbmRleChfX3U2NCBoYXNoLCBpbnQgaGFzaDY0KQoreworCWlmIChCSVRTX1BFUl9MT05HID09IDMyICYmIGhhc2g2NCkKKwkJaGFzaCA+Pj0gMzI7CisJLyogc2F2ZSBoYXNoIDAgd2l0aCBoYXNoIDEgKi8KKwlyZXR1cm4gfjBVTCAtIChoYXNoICsgIWhhc2gpOworfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfbGliLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2xpYi5jCmluZGV4IDE0M2JkNzYuLmFhYzdlMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfbGliLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19saWIuYwpAQCAtMzcsMjcgKzM3LDEyIEBACiAKIHN0YXRpYyB2b2lkIF9fbWRjX3BhY2tfYm9keShzdHJ1Y3QgbWR0X2JvZHkgKmIsIF9fdTMyIHN1cHBnaWQpCiB7Ci0JYi0+c3VwcGdpZCA9IHN1cHBnaWQ7Ci0JYi0+dWlkID0gZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfdWlkKCkpOwotCWItPmdpZCA9IGZyb21fa2dpZCgmaW5pdF91c2VyX25zLCBjdXJyZW50X2dpZCgpKTsKLQliLT5mc3VpZCA9IGZyb21fa3VpZCgmaW5pdF91c2VyX25zLCBjdXJyZW50X2ZzdWlkKCkpOwotCWItPmZzZ2lkID0gZnJvbV9rZ2lkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfZnNnaWQoKSk7Ci0JYi0+Y2FwYWJpbGl0eSA9IGNmc19jdXJwcm9jX2NhcF9wYWNrKCk7Ci19Ci0KLXZvaWQgbWRjX2lzX3N1YmRpcl9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpwZmlkLAotCQkJY29uc3Qgc3RydWN0IGx1X2ZpZCAqY2ZpZCwgaW50IGZsYWdzKQotewotCXN0cnVjdCBtZHRfYm9keSAqYiA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwKLQkJCQkJCSAgICAmUk1GX01EVF9CT0RZKTsKLQotCWlmIChwZmlkKSB7Ci0JCWItPmZpZDEgPSAqcGZpZDsKLQkJYi0+dmFsaWQgPSBPQkRfTURfRkxJRDsKLQl9Ci0JaWYgKGNmaWQpCi0JCWItPmZpZDIgPSAqY2ZpZDsKLQliLT5mbGFncyA9IGZsYWdzOworCWItPm1ib19zdXBwZ2lkID0gc3VwcGdpZDsKKwliLT5tYm9fdWlkID0gZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfdWlkKCkpOworCWItPm1ib19naWQgPSBmcm9tX2tnaWQoJmluaXRfdXNlcl9ucywgY3VycmVudF9naWQoKSk7CisJYi0+bWJvX2ZzdWlkID0gZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfZnN1aWQoKSk7CisJYi0+bWJvX2ZzZ2lkID0gZnJvbV9rZ2lkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfZnNnaWQoKSk7CisJYi0+bWJvX2NhcGFiaWxpdHkgPSBjZnNfY3VycHJvY19jYXBfcGFjaygpOwogfQogCiB2b2lkIG1kY19zd2FwX2xheW91dHNfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwKQEAgLTY3LDQzICs1Miw3NCBAQAogCQkJCQkJICAgICZSTUZfTURUX0JPRFkpOwogCiAJX19tZGNfcGFja19ib2R5KGIsIG9wX2RhdGEtPm9wX3N1cHBnaWRzWzBdKTsKLQliLT5maWQxID0gb3BfZGF0YS0+b3BfZmlkMTsKLQliLT5maWQyID0gb3BfZGF0YS0+b3BfZmlkMjsKLQliLT52YWxpZCB8PSBPQkRfTURfRkxJRDsKKwliLT5tYm9fZmlkMSA9IG9wX2RhdGEtPm9wX2ZpZDE7CisJYi0+bWJvX2ZpZDIgPSBvcF9kYXRhLT5vcF9maWQyOworCWItPm1ib192YWxpZCB8PSBPQkRfTURfRkxJRDsKIH0KIAogdm9pZCBtZGNfcGFja19ib2R5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCi0JCSAgIF9fdTY0IHZhbGlkLCBpbnQgZWFfc2l6ZSwgX191MzIgc3VwcGdpZCwgaW50IGZsYWdzKQorCQkgICBfX3U2NCB2YWxpZCwgc2l6ZV90IGVhX3NpemUsIF9fdTMyIHN1cHBnaWQsIHUzMiBmbGFncykKIHsKIAlzdHJ1Y3QgbWR0X2JvZHkgKmIgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsCiAJCQkJCQkgICAgJlJNRl9NRFRfQk9EWSk7Ci0JYi0+dmFsaWQgPSB2YWxpZDsKLQliLT5lYWRhdGFzaXplID0gZWFfc2l6ZTsKLQliLT5mbGFncyA9IGZsYWdzOworCWItPm1ib192YWxpZCA9IHZhbGlkOworCWItPm1ib19lYWRhdGFzaXplID0gZWFfc2l6ZTsKKwliLT5tYm9fZmxhZ3MgPSBmbGFnczsKIAlfX21kY19wYWNrX2JvZHkoYiwgc3VwcGdpZCk7CiAJaWYgKGZpZCkgewotCQliLT5maWQxID0gKmZpZDsKLQkJYi0+dmFsaWQgfD0gT0JEX01EX0ZMSUQ7CisJCWItPm1ib19maWQxID0gKmZpZDsKKwkJYi0+bWJvX3ZhbGlkIHw9IE9CRF9NRF9GTElEOwogCX0KIH0KIAotdm9pZCBtZGNfcmVhZGRpcl9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBfX3U2NCBwZ29mZiwKLQkJICAgICAgX191MzIgc2l6ZSwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKQorLyoqCisgKiBQYWNrIGEgbmFtZSAocGF0aCBjb21wb25lbnQpIGludG8gYSByZXF1ZXN0CisgKgorICogXHBhcmFtW2luXSByZXEJcmVxdWVzdAorICogXHBhcmFtW2luXSBmaWVsZAlyZXF1ZXN0IGZpZWxkICh1c3VhbGx5IFJNRl9OQU1FKQorICogXHBhcmFtW2luXSBuYW1lCXBhdGggY29tcG9uZW50CisgKiBccGFyYW1baW5dIG5hbWVfbGVuCWxlbmd0aCBvZiBwYXRoIGNvbXBvbmVudAorICoKKyAqIFxhIGZpZWxkIG11c3QgYmUgcHJlc2VudCBpbiBcYSByZXEgYW5kIG9mIHNpemUgXGEgbmFtZV9sZW4gKyAxLgorICoKKyAqIFxhIG5hbWUgbXVzdCBiZSAnXDAnIHRlcm1pbmF0ZWQgb2YgbGVuZ3RoIFxhIG5hbWVfbGVuIGFuZCByZXByZXNlbnQKKyAqIGEgc2luZ2xlIHBhdGggY29tcG9uZW50IChub3QgY29udGFpbiAnLycpLgorICovCitzdGF0aWMgdm9pZCBtZGNfcGFja19uYW1lKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLAorCQkJICBjb25zdCBzdHJ1Y3QgcmVxX21zZ19maWVsZCAqZmllbGQsCisJCQkgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKK3sKKwlzaXplX3QgYnVmX3NpemU7CisJc2l6ZV90IGNweV9sZW47CisJY2hhciAqYnVmOworCisJYnVmID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCBmaWVsZCk7CisJYnVmX3NpemUgPSByZXFfY2Fwc3VsZV9nZXRfc2l6ZSgmcmVxLT5ycV9waWxsLCBmaWVsZCwgUkNMX0NMSUVOVCk7CisKKwlMQVNTRVJUKG5hbWUgJiYgbmFtZV9sZW4gJiYgYnVmICYmIGJ1Zl9zaXplID09IG5hbWVfbGVuICsgMSk7CisKKwljcHlfbGVuID0gc3RybGNweShidWYsIG5hbWUsIGJ1Zl9zaXplKTsKKworCUxBU1NFUlQoY3B5X2xlbiA9PSBuYW1lX2xlbiAmJiBsdV9uYW1lX2lzX3ZhbGlkXzIoYnVmLCBjcHlfbGVuKSk7Cit9CisKK3ZvaWQgbWRjX3JlYWRkaXJfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgX191NjQgcGdvZmYsIHNpemVfdCBzaXplLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCiB7CiAJc3RydWN0IG1kdF9ib2R5ICpiID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLAogCQkJCQkJICAgICZSTUZfTURUX0JPRFkpOwotCWItPmZpZDEgPSAqZmlkOwotCWItPnZhbGlkIHw9IE9CRF9NRF9GTElEOwotCWItPnNpemUgPSBwZ29mZjsJCSAgICAgICAvKiAhISAqLwotCWItPm5saW5rID0gc2l6ZTsJCQkvKiAhISAqLworCWItPm1ib19maWQxID0gKmZpZDsKKwliLT5tYm9fdmFsaWQgfD0gT0JEX01EX0ZMSUQ7CisJYi0+bWJvX3NpemUgPSBwZ29mZjsJCSAgICAgICAvKiAhISAqLworCWItPm1ib19ubGluayA9IHNpemU7CQkJLyogISEgKi8KIAlfX21kY19wYWNrX2JvZHkoYiwgLTEpOwotCWItPm1vZGUgPSBMVURBX0ZJRCB8IExVREFfVFlQRTsKKwliLT5tYm9fbW9kZSA9IExVREFfRklEIHwgTFVEQV9UWVBFOwogfQogCiAvKiBwYWNraW5nIG9mIE1EUyByZWNvcmRzICovCiB2b2lkIG1kY19jcmVhdGVfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGRhdGFsZW4sIF9fdTMyIG1vZGUsCi0JCSAgICAgX191MzIgdWlkLCBfX3UzMiBnaWQsIGNmc19jYXBfdCBjYXBfZWZmZWN0aXZlLCBfX3U2NCByZGV2KQorCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuLCB1bW9kZV90IG1vZGUsCisJCSAgICAgdWlkX3QgdWlkLCBnaWRfdCBnaWQsIGNmc19jYXBfdCBjYXBfZWZmZWN0aXZlLCBfX3U2NCByZGV2KQogewogCXN0cnVjdCBtZHRfcmVjX2NyZWF0ZQkqcmVjOwogCWNoYXIJCQkqdG1wOwpAQCAtMTMwLDIyICsxNDYsMTcgQEAKIAlyZWMtPmNyX2JpYXMgICAgID0gb3BfZGF0YS0+b3BfYmlhczsKIAlyZWMtPmNyX3VtYXNrICAgID0gY3VycmVudF91bWFzaygpOwogCi0JdG1wID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX05BTUUpOwotCUxPR0wwKG9wX2RhdGEtPm9wX25hbWUsIG9wX2RhdGEtPm9wX25hbWVsZW4sIHRtcCk7Ci0KKwltZGNfcGFja19uYW1lKHJlcSwgJlJNRl9OQU1FLCBvcF9kYXRhLT5vcF9uYW1lLCBvcF9kYXRhLT5vcF9uYW1lbGVuKTsKIAlpZiAoZGF0YSkgewogCQl0bXAgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfRUFEQVRBKTsKIAkJbWVtY3B5KHRtcCwgZGF0YSwgZGF0YWxlbik7CiAJfQogfQogCi1zdGF0aWMgX191NjQgbWRzX3BhY2tfb3Blbl9mbGFncyhfX3U2NCBmbGFncywgX191MzIgbW9kZSkKK3N0YXRpYyBpbmxpbmUgX191NjQgbWRzX3BhY2tfb3Blbl9mbGFncyhfX3U2NCBmbGFncykKIHsKIAlfX3U2NCBjcl9mbGFncyA9IChmbGFncyAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUgfAotCQkJCSAgIE1EU19PUEVOX0hBU19FQSB8IE1EU19PUEVOX0hBU19PQkpTIHwKLQkJCQkgICBNRFNfT1BFTl9PV05FUk9WRVJSSURFIHwgTURTX09QRU5fTE9DSyB8Ci0JCQkJICAgTURTX09QRU5fQllfRklEIHwgTURTX09QRU5fTEVBU0UgfAotCQkJCSAgIE1EU19PUEVOX1JFTEVBU0UpKTsKKwkJCQkgICBNRFNfT1BFTl9GTF9JTlRFUk5BTCkpOwogCWlmIChmbGFncyAmIE9fQ1JFQVQpCiAJCWNyX2ZsYWdzIHw9IE1EU19PUEVOX0NSRUFUOwogCWlmIChmbGFncyAmIE9fRVhDTCkKQEAgLTE3MSw4ICsxODIsOCBAQAogCiAvKiBwYWNraW5nIG9mIE1EUyByZWNvcmRzICovCiB2b2lkIG1kY19vcGVuX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkgICBfX3UzMiBtb2RlLCBfX3U2NCByZGV2LCBfX3U2NCBmbGFncywgY29uc3Qgdm9pZCAqbG1tLAotCQkgICBpbnQgbG1tbGVuKQorCQkgICB1bW9kZV90IG1vZGUsIF9fdTY0IHJkZXYsIF9fdTY0IGZsYWdzLCBjb25zdCB2b2lkICpsbW0sCisJCSAgIHNpemVfdCBsbW1sZW4pCiB7CiAJc3RydWN0IG1kdF9yZWNfY3JlYXRlICpyZWM7CiAJY2hhciAqdG1wOwpAQCAtMTkwLDcgKzIwMSw3IEBACiAJcmVjLT5jcl9maWQyID0gb3BfZGF0YS0+b3BfZmlkMjsKIAogCXJlYy0+Y3JfbW9kZSAgICAgPSBtb2RlOwotCWNyX2ZsYWdzID0gbWRzX3BhY2tfb3Blbl9mbGFncyhmbGFncywgbW9kZSk7CisJY3JfZmxhZ3MgPSBtZHNfcGFja19vcGVuX2ZsYWdzKGZsYWdzKTsKIAlyZWMtPmNyX3JkZXYgICAgID0gcmRldjsKIAlyZWMtPmNyX3RpbWUgICAgID0gb3BfZGF0YS0+b3BfbW9kX3RpbWU7CiAJcmVjLT5jcl9zdXBwZ2lkMSA9IG9wX2RhdGEtPm9wX3N1cHBnaWRzWzBdOwpAQCAtMjAwLDggKzIxMSw5IEBACiAJcmVjLT5jcl9vbGRfaGFuZGxlID0gb3BfZGF0YS0+b3BfaGFuZGxlOwogCiAJaWYgKG9wX2RhdGEtPm9wX25hbWUpIHsKLQkJdG1wID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX05BTUUpOwotCQlMT0dMMChvcF9kYXRhLT5vcF9uYW1lLCBvcF9kYXRhLT5vcF9uYW1lbGVuLCB0bXApOworCQltZGNfcGFja19uYW1lKHJlcSwgJlJNRl9OQU1FLCBvcF9kYXRhLT5vcF9uYW1lLAorCQkJICAgICAgb3BfZGF0YS0+b3BfbmFtZWxlbik7CisKIAkJaWYgKG9wX2RhdGEtPm9wX2JpYXMgJiBNRFNfQ1JFQVRFX1ZPTEFUSUxFKQogCQkJY3JfZmxhZ3MgfD0gTURTX09QRU5fVk9MQVRJTEU7CiAJfQpAQCAtMjk1LDcgKzMwNyw3IEBACiB9CiAKIHZvaWQgbWRjX3NldGF0dHJfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCSAgICAgIHZvaWQgKmVhLCBpbnQgZWFsZW4sIHZvaWQgKmVhMiwgaW50IGVhMmxlbikKKwkJICAgICAgdm9pZCAqZWEsIHNpemVfdCBlYWxlbiwgdm9pZCAqZWEyLCBzaXplX3QgZWEybGVuKQogewogCXN0cnVjdCBtZHRfcmVjX3NldGF0dHIgKnJlYzsKIAlzdHJ1Y3QgbWR0X2lvZXBvY2ggKmVwb2NoOwpAQCAtMzE2LDcgKzMyOCw3IEBACiAKIAlsdW0gPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfRUFEQVRBKTsKIAlpZiAoIWVhKSB7IC8qIFJlbW92ZSBMT1YgRUEgKi8KLQkJbHVtLT5sbW1fbWFnaWMgPSBMT1ZfVVNFUl9NQUdJQ19WMTsKKwkJbHVtLT5sbW1fbWFnaWMgPSBjcHVfdG9fbGUzMihMT1ZfVVNFUl9NQUdJQ19WMSk7CiAJCWx1bS0+bG1tX3N0cmlwZV9zaXplID0gMDsKIAkJbHVtLT5sbW1fc3RyaXBlX2NvdW50ID0gMDsKIAkJbHVtLT5sbW1fc3RyaXBlX29mZnNldCA9ICh0eXBlb2YobHVtLT5sbW1fc3RyaXBlX29mZnNldCkpKC0xKTsKQEAgLTMzNCw3ICszNDYsNiBAQAogdm9pZCBtZGNfdW5saW5rX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKQogewogCXN0cnVjdCBtZHRfcmVjX3VubGluayAqcmVjOwotCWNoYXIgKnRtcDsKIAogCUNMQVNTRVJUKHNpemVvZihzdHJ1Y3QgbWR0X3JlY19yZWludCkgPT0gc2l6ZW9mKHN0cnVjdCBtZHRfcmVjX3VubGluaykpOwogCXJlYyA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9SRUNfUkVJTlQpOwpAQCAtMzUyLDE1ICszNjMsMTIgQEAKIAlyZWMtPnVsX3RpbWUgICAgID0gb3BfZGF0YS0+b3BfbW9kX3RpbWU7CiAJcmVjLT51bF9iaWFzICAgICA9IG9wX2RhdGEtPm9wX2JpYXM7CiAKLQl0bXAgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTkFNRSk7Ci0JTEFTU0VSVCh0bXApOwotCUxPR0wwKG9wX2RhdGEtPm9wX25hbWUsIG9wX2RhdGEtPm9wX25hbWVsZW4sIHRtcCk7CisJbWRjX3BhY2tfbmFtZShyZXEsICZSTUZfTkFNRSwgb3BfZGF0YS0+b3BfbmFtZSwgb3BfZGF0YS0+b3BfbmFtZWxlbik7CiB9CiAKIHZvaWQgbWRjX2xpbmtfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEpCiB7CiAJc3RydWN0IG1kdF9yZWNfbGluayAqcmVjOwotCWNoYXIgKnRtcDsKIAogCUNMQVNTRVJUKHNpemVvZihzdHJ1Y3QgbWR0X3JlY19yZWludCkgPT0gc2l6ZW9mKHN0cnVjdCBtZHRfcmVjX2xpbmspKTsKIAlyZWMgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfUkVDX1JFSU5UKTsKQEAgLTM3NiwyMCArMzg0LDIxIEBACiAJcmVjLT5sa190aW1lICAgICA9IG9wX2RhdGEtPm9wX21vZF90aW1lOwogCXJlYy0+bGtfYmlhcyAgICAgPSBvcF9kYXRhLT5vcF9iaWFzOwogCi0JdG1wID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX05BTUUpOwotCUxPR0wwKG9wX2RhdGEtPm9wX25hbWUsIG9wX2RhdGEtPm9wX25hbWVsZW4sIHRtcCk7CisJbWRjX3BhY2tfbmFtZShyZXEsICZSTUZfTkFNRSwgb3BfZGF0YS0+b3BfbmFtZSwgb3BfZGF0YS0+b3BfbmFtZWxlbik7CiB9CiAKIHZvaWQgbWRjX3JlbmFtZV9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgICBjb25zdCBjaGFyICpvbGQsIGludCBvbGRsZW4sIGNvbnN0IGNoYXIgKm5ldywgaW50IG5ld2xlbikKKwkJICAgICBjb25zdCBjaGFyICpvbGQsIHNpemVfdCBvbGRsZW4sCisJCSAgICAgY29uc3QgY2hhciAqbmV3LCBzaXplX3QgbmV3bGVuKQogewogCXN0cnVjdCBtZHRfcmVjX3JlbmFtZSAqcmVjOwotCWNoYXIgKnRtcDsKIAogCUNMQVNTRVJUKHNpemVvZihzdHJ1Y3QgbWR0X3JlY19yZWludCkgPT0gc2l6ZW9mKHN0cnVjdCBtZHRfcmVjX3JlbmFtZSkpOwogCXJlYyA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9SRUNfUkVJTlQpOwogCiAJLyogWFhYIGRvIHNvbWV0aGluZyBhYm91dCB0aW1lLCB1aWQsIGdpZCAqLworCXJlYy0+cm5fb3Bjb2RlCSA9IG9wX2RhdGEtPm9wX2NsaV9mbGFncyAmIENMSV9NSUdSQVRFID8KKwkJCQlSRUlOVF9NSUdSQVRFIDogUkVJTlRfUkVOQU1FOwogCXJlYy0+cm5fb3Bjb2RlICAgPSBSRUlOVF9SRU5BTUU7CiAJcmVjLT5ybl9mc3VpZCAgICA9IG9wX2RhdGEtPm9wX2ZzdWlkOwogCXJlYy0+cm5fZnNnaWQgICAgPSBvcF9kYXRhLT5vcF9mc2dpZDsKQEAgLTQwMiwzOSArNDExLDM0IEBACiAJcmVjLT5ybl9tb2RlICAgICA9IG9wX2RhdGEtPm9wX21vZGU7CiAJcmVjLT5ybl9iaWFzICAgICA9IG9wX2RhdGEtPm9wX2JpYXM7CiAKLQl0bXAgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTkFNRSk7Ci0JTE9HTDAob2xkLCBvbGRsZW4sIHRtcCk7CisJbWRjX3BhY2tfbmFtZShyZXEsICZSTUZfTkFNRSwgb2xkLCBvbGRsZW4pOwogCi0JaWYgKG5ldykgewotCQl0bXAgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfU1lNVEdUKTsKLQkJTE9HTDAobmV3LCBuZXdsZW4sIHRtcCk7Ci0JfQorCWlmIChuZXcpCisJCW1kY19wYWNrX25hbWUocmVxLCAmUk1GX1NZTVRHVCwgbmV3LCBuZXdsZW4pOwogfQogCi12b2lkIG1kY19nZXRhdHRyX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIF9fdTY0IHZhbGlkLCBpbnQgZmxhZ3MsCi0JCSAgICAgIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLCBpbnQgZWFfc2l6ZSkKK3ZvaWQgbWRjX2dldGF0dHJfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgX191NjQgdmFsaWQsIHUzMiBmbGFncywKKwkJICAgICAgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsIHNpemVfdCBlYV9zaXplKQogewogCXN0cnVjdCBtZHRfYm9keSAqYiA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwKIAkJCQkJCSAgICAmUk1GX01EVF9CT0RZKTsKIAotCWItPnZhbGlkID0gdmFsaWQ7CisJYi0+bWJvX3ZhbGlkID0gdmFsaWQ7CiAJaWYgKG9wX2RhdGEtPm9wX2JpYXMgJiBNRFNfQ0hFQ0tfU1BMSVQpCi0JCWItPnZhbGlkIHw9IE9CRF9NRF9GTENLU1BMSVQ7CisJCWItPm1ib192YWxpZCB8PSBPQkRfTURfRkxDS1NQTElUOwogCWlmIChvcF9kYXRhLT5vcF9iaWFzICYgTURTX0NST1NTX1JFRikKLQkJYi0+dmFsaWQgfD0gT0JEX01EX0ZMQ1JPU1NSRUY7Ci0JYi0+ZWFkYXRhc2l6ZSA9IGVhX3NpemU7Ci0JYi0+ZmxhZ3MgPSBmbGFnczsKKwkJYi0+bWJvX3ZhbGlkIHw9IE9CRF9NRF9GTENST1NTUkVGOworCWItPm1ib19lYWRhdGFzaXplID0gZWFfc2l6ZTsKKwliLT5tYm9fZmxhZ3MgPSBmbGFnczsKIAlfX21kY19wYWNrX2JvZHkoYiwgb3BfZGF0YS0+b3Bfc3VwcGdpZHNbMF0pOwogCi0JYi0+ZmlkMSA9IG9wX2RhdGEtPm9wX2ZpZDE7Ci0JYi0+ZmlkMiA9IG9wX2RhdGEtPm9wX2ZpZDI7Ci0JYi0+dmFsaWQgfD0gT0JEX01EX0ZMSUQ7CisJYi0+bWJvX2ZpZDEgPSBvcF9kYXRhLT5vcF9maWQxOworCWItPm1ib19maWQyID0gb3BfZGF0YS0+b3BfZmlkMjsKKwliLT5tYm9fdmFsaWQgfD0gT0JEX01EX0ZMSUQ7CiAKLQlpZiAob3BfZGF0YS0+b3BfbmFtZSkgewotCQljaGFyICp0bXAgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTkFNRSk7Ci0KLQkJTE9HTDAob3BfZGF0YS0+b3BfbmFtZSwgb3BfZGF0YS0+b3BfbmFtZWxlbiwgdG1wKTsKLQl9CisJaWYgKG9wX2RhdGEtPm9wX25hbWUpCisJCW1kY19wYWNrX25hbWUocmVxLCAmUk1GX05BTUUsIG9wX2RhdGEtPm9wX25hbWUsCisJCQkgICAgICBvcF9kYXRhLT5vcF9uYW1lbGVuKTsKIH0KIAogc3RhdGljIHZvaWQgbWRjX2hzbV9yZWxlYXNlX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCkBAIC00ODIsNjcgKzQ4NiwzIEBACiAJbWRjX2lvZXBvY2hfcGFjayhlcG9jaCwgb3BfZGF0YSk7CiAJbWRjX2hzbV9yZWxlYXNlX3BhY2socmVxLCBvcF9kYXRhKTsKIH0KLQotc3RhdGljIGludCBtZGNfcmVxX2F2YWlsKHN0cnVjdCBjbGllbnRfb2JkICpjbGksIHN0cnVjdCBtZGNfY2FjaGVfd2FpdGVyICptY3cpCi17Ci0JaW50IHJjOwotCi0Jc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXJjID0gbGlzdF9lbXB0eSgmbWN3LT5tY3dfZW50cnkpOwotCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXJldHVybiByYzsKLX07Ci0KLS8qIFdlIHJlY29yZCByZXF1ZXN0cyBpbiBmbGlnaHQgaW4gY2xpLT5jbF9yX2luX2ZsaWdodCBoZXJlLgotICogVGhlcmUgaXMgb25seSBvbmUgd3JpdGUgcnBjIHBvc3NpYmxlIGluIG1kYyBhbnl3YXkuIElmIHRoaXMgdG8gY2hhbmdlCi0gKiBpbiB0aGUgZnV0dXJlIC0gdGhlIGNvZGUgbWF5IG5lZWQgdG8gYmUgcmV2aXNpdGVkLgotICovCi1pbnQgbWRjX2VudGVyX3JlcXVlc3Qoc3RydWN0IGNsaWVudF9vYmQgKmNsaSkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtZGNfY2FjaGVfd2FpdGVyIG1jdzsKLQlzdHJ1Y3QgbF93YWl0X2luZm8gbHdpID0gTFdJX0lOVFIoTFdJX09OX1NJR05BTF9OT09QLCBOVUxMKTsKLQotCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlpZiAoY2xpLT5jbF9yX2luX2ZsaWdodCA+PSBjbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCkgewotCQlsaXN0X2FkZF90YWlsKCZtY3cubWN3X2VudHJ5LCAmY2xpLT5jbF9jYWNoZV93YWl0ZXJzKTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmbWN3Lm1jd193YWl0cSk7Ci0JCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCQlyYyA9IGxfd2FpdF9ldmVudChtY3cubWN3X3dhaXRxLCBtZGNfcmVxX2F2YWlsKGNsaSwgJm1jdyksCi0JCQkJICAmbHdpKTsKLQkJaWYgKHJjKSB7Ci0JCQlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JCQlpZiAobGlzdF9lbXB0eSgmbWN3Lm1jd19lbnRyeSkpCi0JCQkJY2xpLT5jbF9yX2luX2ZsaWdodC0tOwotCQkJbGlzdF9kZWxfaW5pdCgmbWN3Lm1jd19lbnRyeSk7Ci0JCQlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWNsaS0+Y2xfcl9pbl9mbGlnaHQrKzsKLQkJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotdm9pZCBtZGNfZXhpdF9yZXF1ZXN0KHN0cnVjdCBjbGllbnRfb2JkICpjbGkpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbCwgKnRtcDsKLQlzdHJ1Y3QgbWRjX2NhY2hlX3dhaXRlciAqbWN3OwotCi0Jc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCWNsaS0+Y2xfcl9pbl9mbGlnaHQtLTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUobCwgdG1wLCAmY2xpLT5jbF9jYWNoZV93YWl0ZXJzKSB7Ci0JCWlmIChjbGktPmNsX3JfaW5fZmxpZ2h0ID49IGNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0KSB7Ci0JCQkvKiBObyBmcmVlIHJlcXVlc3Qgc2xvdHMgYW55bW9yZSAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQltY3cgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBtZGNfY2FjaGVfd2FpdGVyLCBtY3dfZW50cnkpOwotCQlsaXN0X2RlbF9pbml0KCZtY3ctPm1jd19lbnRyeSk7Ci0JCWNsaS0+Y2xfcl9pbl9mbGlnaHQrKzsKLQkJd2FrZV91cCgmbWN3LT5tY3dfd2FpdHEpOwotCX0KLQkvKiBFbXB0eSB3YWl0aW5nIGxpc3Q/IERlY3JlYXNlIHJlcXMgaW4tZmxpZ2h0IG51bWJlciAqLwotCi0Jc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2xvY2tzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2xvY2tzLmMKaW5kZXggZjQ4YjU4NC4uZjFmNmMwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19sb2Nrcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfbG9ja3MuYwpAQCAtOTMsOCArOTMsOCBAQAogRVhQT1JUX1NZTUJPTChpdF9vcGVuX2Vycm9yKTsKIAogLyogdGhpcyBtdXN0IGJlIGNhbGxlZCBvbiBhIGxvY2toIHRoYXQgaXMga25vd24gdG8gaGF2ZSBhIHJlZmVyZW5jZWQgbG9jayAqLwotaW50IG1kY19zZXRfbG9ja19kYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIF9fdTY0ICpsb2NraCwgdm9pZCAqZGF0YSwKLQkJICAgICAgX191NjQgKmJpdHMpCitpbnQgbWRjX3NldF9sb2NrX2RhdGEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgY29uc3Qgc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxvY2toLAorCQkgICAgICB2b2lkICpkYXRhLCBfX3U2NCAqYml0cykKIHsKIAlzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrOwogCXN0cnVjdCBpbm9kZSAqbmV3X2lub2RlID0gZGF0YTsKQEAgLTEwMiwxMCArMTAyLDEwIEBACiAJaWYgKGJpdHMpCiAJCSpiaXRzID0gMDsKIAotCWlmICghKmxvY2toKQorCWlmICghbHVzdHJlX2hhbmRsZV9pc191c2VkKGxvY2toKSkKIAkJcmV0dXJuIDA7CiAKLQlsb2NrID0gbGRsbV9oYW5kbGUybG9jaygoc3RydWN0IGx1c3RyZV9oYW5kbGUgKilsb2NraCk7CisJbG9jayA9IGxkbG1faGFuZGxlMmxvY2sobG9ja2gpOwogCiAJTEFTU0VSVChsb2NrKTsKIAlsb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKQEAgLTE3NCw3ICsxNzQsNyBAQAogCWZpZF9idWlsZF9yZWdfcmVzX25hbWUoZmlkLCAmcmVzX2lkKTsKIAogCXJlcyA9IGxkbG1fcmVzb3VyY2VfZ2V0KG5zLCBOVUxMLCAmcmVzX2lkLCAwLCAwKTsKLQlpZiAoIXJlcykKKwlpZiAoSVNfRVJSKHJlcykpCiAJCXJldHVybiAwOwogCiAJbG9ja19yZXMocmVzKTsKQEAgLTE4NSwyOCArMTg1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogZmluZCBhbnkgbGRsbSBsb2NrIG9mIHRoZSBpbm9kZSBpbiBtZGMKLSAqIHJldHVybiAwICAgIG5vdCBmaW5kCi0gKgkxICAgIGZpbmQgb25lCi0gKiAgICAgIDwgMCAgICBlcnJvcgotICovCi1pbnQgbWRjX2ZpbmRfY2JkYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCSAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCi0JCSAgICBsZGxtX2l0ZXJhdG9yX3QgaXQsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGxkbG1fcmVzX2lkIHJlc19pZDsKLQlpbnQgcmMgPSAwOwotCi0JZmlkX2J1aWxkX3JlZ19yZXNfbmFtZSgoc3RydWN0IGx1X2ZpZCAqKWZpZCwgJnJlc19pZCk7Ci0JcmMgPSBsZGxtX3Jlc291cmNlX2l0ZXJhdGUoY2xhc3NfZXhwMm9iZChleHApLT5vYmRfbmFtZXNwYWNlLCAmcmVzX2lkLAotCQkJCSAgIGl0LCBkYXRhKTsKLQlpZiAocmMgPT0gTERMTV9JVEVSX1NUT1ApCi0JCXJldHVybiAxOwotCWVsc2UgaWYgKHJjID09IExETE1fSVRFUl9DT05USU5VRSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgbWRjX2NsZWFyX3JlcGxheV9mbGFnKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBpbnQgcmMpCiB7CiAJLyogRG9uJ3QgaG9sZCBlcnJvciByZXF1ZXN0cyBmb3IgcmVwbGF5LiAqLwpAQCAtMjQwLDI0ICsyMTgsMjQgQEAKIAogCS8qIEZJWE1FOiByZW1vdmUgdGhpcyBleHBsaWNpdCBvZmZzZXQuICovCiAJcmMgPSBzcHRscnBjX2NsaV9lbmxhcmdlX3JlcWJ1ZihyZXEsIERMTV9JTlRFTlRfUkVDX09GRiArIDQsCi0JCQkJCWJvZHktPmVhZGF0YXNpemUpOworCQkJCQlib2R5LT5tYm9fZWFkYXRhc2l6ZSk7CiAJaWYgKHJjKSB7CiAJCUNFUlJPUigiQ2FuJ3QgZW5sYXJnZSBzZWdtZW50ICVkIHNpemUgdG8gJWRcbiIsCi0JCSAgICAgICBETE1fSU5URU5UX1JFQ19PRkYgKyA0LCBib2R5LT5lYWRhdGFzaXplKTsKLQkJYm9keS0+dmFsaWQgJj0gfk9CRF9NRF9GTEVBU0laRTsKLQkJYm9keS0+ZWFkYXRhc2l6ZSA9IDA7CisJCSAgICAgICBETE1fSU5URU5UX1JFQ19PRkYgKyA0LCBib2R5LT5tYm9fZWFkYXRhc2l6ZSk7CisJCWJvZHktPm1ib192YWxpZCAmPSB+T0JEX01EX0ZMRUFTSVpFOworCQlib2R5LT5tYm9fZWFkYXRhc2l6ZSA9IDA7CiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICptZGNfaW50ZW50X29wZW5fcGFjayhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAotCQkJCQkJICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LAotCQkJCQkJICAgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCQkJCQkgICB2b2lkICpsbW0sIGludCBsbW1zaXplLAotCQkJCQkJICAgdm9pZCAqY2JfZGF0YSkKK3N0YXRpYyBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKgorbWRjX2ludGVudF9vcGVuX3BhY2soc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LAorCQkgICAgIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKQogewogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxOwogCXN0cnVjdCBvYmRfZGV2aWNlICAgICAqb2JkZGV2ID0gY2xhc3NfZXhwMm9iZChleHApOwogCXN0cnVjdCBsZGxtX2ludGVudCAgICAqbGl0OworCWNvbnN0IHZvaWQgKmxtbSA9IG9wX2RhdGEtPm9wX2RhdGE7CisJdTMyIGxtbXNpemUgPSBvcF9kYXRhLT5vcF9kYXRhX3NpemU7CiAJTElTVF9IRUFEKGNhbmNlbHMpOwogCWludAkJICAgIGNvdW50ID0gMDsKIAlpbnQJCSAgICBtb2RlOwpAQCAtMjc0LDcgKzI1Miw3IEBACiAJCQllbHNlCiAJCQkJbW9kZSA9IExDS19QUjsKIAkJfSBlbHNlIHsKLQkJCWlmIChpdC0+aXRfZmxhZ3MgJiAoRk1PREVfV1JJVEV8TURTX09QRU5fVFJVTkMpKQorCQkJaWYgKGl0LT5pdF9mbGFncyAmIChGTU9ERV9XUklURSB8IE1EU19PUEVOX1RSVU5DKSkKIAkJCQltb2RlID0gTENLX0NXOwogCQkJZWxzZSBpZiAoaXQtPml0X2ZsYWdzICYgX19GTU9ERV9FWEVDKQogCQkJCW1vZGUgPSBMQ0tfUFI7CkBAIC0zMjUsNiArMzAzLDkgQEAKIAltZGNfb3Blbl9wYWNrKHJlcSwgb3BfZGF0YSwgaXQtPml0X2NyZWF0ZV9tb2RlLCAwLCBpdC0+aXRfZmxhZ3MsIGxtbSwKIAkJICAgICAgbG1tc2l6ZSk7CiAKKwlyZXFfY2Fwc3VsZV9zZXRfc2l6ZSgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9NRCwgUkNMX1NFUlZFUiwKKwkJCSAgICAgb2JkZGV2LT51LmNsaS5jbF9tYXhfbWRzX2Vhc2l6ZSk7CisKIAlwdGxycGNfcmVxdWVzdF9zZXRfcmVwbGVuKHJlcSk7CiAJcmV0dXJuIHJlcTsKIH0KQEAgLTMzNiw3ICszMTcsOCBAQAogewogCXN0cnVjdCBwdGxycGNfcmVxdWVzdAkqcmVxOwogCXN0cnVjdCBsZGxtX2ludGVudAkqbGl0OwotCWludAkJCXJjLCBjb3VudCA9IDAsIG1heGRhdGE7CisJaW50IHJjLCBjb3VudCA9IDA7CisJdTMyIG1heGRhdGE7CiAJTElTVF9IRUFEKGNhbmNlbHMpOwogCiAJcmVxID0gcHRscnBjX3JlcXVlc3RfYWxsb2MoY2xhc3NfZXhwMmNsaWltcChleHApLApAQCAtNDIxLDcgKzQwMyw3IEBACiAJCQkJICAgICAgIE9CRF9NRF9NRUEgfCBPQkRfTURfRkxBQ0w7CiAJc3RydWN0IGxkbG1faW50ZW50ICAgICpsaXQ7CiAJaW50CQkgICAgcmM7Ci0JaW50CQkgICAgZWFzaXplOworCXUzMiBlYXNpemU7CiAKIAlyZXEgPSBwdGxycGNfcmVxdWVzdF9hbGxvYyhjbGFzc19leHAyY2xpaW1wKGV4cCksCiAJCQkJICAgJlJRRl9MRExNX0lOVEVOVF9HRVRBVFRSKTsKQEAgLTUyNiw3ICs1MDgsNyBAQAogCXN0cnVjdCBsZGxtX3JlcGx5ICAgKmxvY2tyZXA7CiAJc3RydWN0IGxkbG1fbG9jayAgICAqbG9jazsKIAl2b2lkCQkqbHZiX2RhdGEgPSBOVUxMOwotCWludAkJICBsdmJfbGVuID0gMDsKKwl1MzIgbHZiX2xlbiA9IDA7CiAKIAlMQVNTRVJUKHJjID49IDApOwogCS8qIFNpbWlsYXJseSwgaWYgd2UncmUgZ29pbmcgdG8gcmVwbGF5IHRoaXMgcmVxdWVzdCwgd2UgZG9uJ3Qgd2FudCB0bwpAQCAtNjA1LDcgKzU4Nyw3IEBACiAJCQltZGNfc2V0X29wZW5fcmVwbGF5X2RhdGEoTlVMTCwgTlVMTCwgaXQpOwogCQl9CiAKLQkJaWYgKChib2R5LT52YWxpZCAmIChPQkRfTURfRkxESVJFQSB8IE9CRF9NRF9GTEVBU0laRSkpICE9IDApIHsKKwkJaWYgKChib2R5LT5tYm9fdmFsaWQgJiAoT0JEX01EX0ZMRElSRUEgfCBPQkRfTURfRkxFQVNJWkUpKSAhPSAwKSB7CiAJCQl2b2lkICplYWRhdGE7CiAKIAkJCW1kY191cGRhdGVfbWF4X2VhX2Zyb21fYm9keShleHAsIGJvZHkpOwpAQCAtNjE1LDcgKzU5Nyw3IEBACiAJCQkgKiBFdmVudHVhbGx5LCBvYmRfdW5wYWNrbWQoKSB3aWxsIGNoZWNrIHRoZSBjb250ZW50cy4KIAkJCSAqLwogCQkJZWFkYXRhID0gcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldChwaWxsLCAmUk1GX01EVF9NRCwKLQkJCQkJCQkgICAgICBib2R5LT5lYWRhdGFzaXplKTsKKwkJCQkJCQkgICAgICBib2R5LT5tYm9fZWFkYXRhc2l6ZSk7CiAJCQlpZiAoIWVhZGF0YSkKIAkJCQlyZXR1cm4gLUVQUk9UTzsKIApAQCAtNjIzLDcgKzYwNSw3IEBACiAJCQkgKiBsb2NrCiAJCQkgKi8KIAkJCWx2Yl9kYXRhID0gZWFkYXRhOwotCQkJbHZiX2xlbiA9IGJvZHktPmVhZGF0YXNpemU7CisJCQlsdmJfbGVuID0gYm9keS0+bWJvX2VhZGF0YXNpemU7CiAKIAkJCS8qCiAJCQkgKiBXZSBzYXZlIHRoZSByZXBseSBMT1YgRUEgaW4gY2FzZSB3ZSBoYXZlIHRvIHJlcGxheSBhCkBAIC02MzksMjAgKzYyMSwyMCBAQAogCiAJCQkJaWYgKHJlcV9jYXBzdWxlX2dldF9zaXplKHBpbGwsICZSTUZfRUFEQVRBLAogCQkJCQkJCSBSQ0xfQ0xJRU5UKSA8Ci0JCQkJICAgIGJvZHktPmVhZGF0YXNpemUpCisJCQkJICAgIGJvZHktPm1ib19lYWRhdGFzaXplKQogCQkJCQltZGNfcmVhbGxvY19vcGVubXNnKHJlcSwgYm9keSk7CiAJCQkJZWxzZQogCQkJCQlyZXFfY2Fwc3VsZV9zaHJpbmsocGlsbCwgJlJNRl9FQURBVEEsCi0JCQkJCQkJICAgYm9keS0+ZWFkYXRhc2l6ZSwKKwkJCQkJCQkgICBib2R5LT5tYm9fZWFkYXRhc2l6ZSwKIAkJCQkJCQkgICBSQ0xfQ0xJRU5UKTsKIAogCQkJCXJlcV9jYXBzdWxlX3NldF9zaXplKHBpbGwsICZSTUZfRUFEQVRBLAogCQkJCQkJICAgICBSQ0xfQ0xJRU5ULAotCQkJCQkJICAgICBib2R5LT5lYWRhdGFzaXplKTsKKwkJCQkJCSAgICAgYm9keS0+bWJvX2VhZGF0YXNpemUpOwogCiAJCQkJbG1tID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldChwaWxsLCAmUk1GX0VBREFUQSk7CiAJCQkJaWYgKGxtbSkKLQkJCQkJbWVtY3B5KGxtbSwgZWFkYXRhLCBib2R5LT5lYWRhdGFzaXplKTsKKwkJCQkJbWVtY3B5KGxtbSwgZWFkYXRhLCBib2R5LT5tYm9fZWFkYXRhc2l6ZSk7CiAJCQl9CiAJCX0KIAl9IGVsc2UgaWYgKGl0LT5pdF9vcCAmIElUX0xBWU9VVCkgewpAQCAtNjYyLDcgKzY0NCw4IEBACiAJCWx2Yl9sZW4gPSByZXFfY2Fwc3VsZV9nZXRfc2l6ZShwaWxsLCAmUk1GX0RMTV9MVkIsIFJDTF9TRVJWRVIpOwogCQlpZiAobHZiX2xlbiA+IDApIHsKIAkJCWx2Yl9kYXRhID0gcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldChwaWxsLAotCQkJCQkJCSZSTUZfRExNX0xWQiwgbHZiX2xlbik7CisJCQkJCQkJCSZSTUZfRExNX0xWQiwKKwkJCQkJCQkJbHZiX2xlbik7CiAJCQlpZiAoIWx2Yl9kYXRhKQogCQkJCXJldHVybiAtRVBST1RPOwogCQl9CkBAIC03MDUsOSArNjg4LDkgQEAKICAqIHdlIGRvbid0IGtub3cgaW4gYWR2YW5jZSB0aGUgZmlsZSB0eXBlLgogICovCiBpbnQgbWRjX2VucXVldWUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvICplaW5mbywKKwkJY29uc3QgbGRsbV9wb2xpY3lfZGF0YV90ICpwb2xpY3ksCiAJCXN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCXN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCwgdm9pZCAqbG1tLCBpbnQgbG1tc2l6ZSwKLQkJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxcCwgdTY0IGV4dHJhX2xvY2tfZmxhZ3MpCisJCXN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCwgdTY0IGV4dHJhX2xvY2tfZmxhZ3MpCiB7CiAJc3RhdGljIGNvbnN0IGxkbG1fcG9saWN5X2RhdGFfdCBsb29rdXBfcG9saWN5ID0gewogCQkubF9pbm9kZWJpdHMgPSB7IE1EU19JTk9ERUxPQ0tfTE9PS1VQIH0KQEAgLTcyMSw5ICs3MDQsOCBAQAogCXN0YXRpYyBjb25zdCBsZGxtX3BvbGljeV9kYXRhX3QgZ2V0eGF0dHJfcG9saWN5ID0gewogCQkubF9pbm9kZWJpdHMgPSB7IE1EU19JTk9ERUxPQ0tfWEFUVFIgfQogCX07Ci0JbGRsbV9wb2xpY3lfZGF0YV90IGNvbnN0ICpwb2xpY3kgPSAmbG9va3VwX3BvbGljeTsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkZGV2ID0gY2xhc3NfZXhwMm9iZChleHApOwotCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxOworCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxID0gTlVMTDsKIAl1NjQgZmxhZ3MsIHNhdmVkX2ZsYWdzID0gZXh0cmFfbG9ja19mbGFnczsKIAlzdHJ1Y3QgbGRsbV9yZXNfaWQgcmVzX2lkOwogCWludCBnZW5lcmF0aW9uLCByZXNlbmRzID0gMDsKQEAgLTczMyw0MCArNzE1LDMyIEBACiAKIAlMQVNTRVJURighaXQgfHwgZWluZm8tPmVpX3R5cGUgPT0gTERMTV9JQklUUywgImxvY2sgdHlwZSAlZFxuIiwKIAkJIGVpbmZvLT5laV90eXBlKTsKLQogCWZpZF9idWlsZF9yZWdfcmVzX25hbWUoJm9wX2RhdGEtPm9wX2ZpZDEsICZyZXNfaWQpOwogCiAJaWYgKGl0KSB7CisJCUxBU1NFUlQoIXBvbGljeSk7CisKIAkJc2F2ZWRfZmxhZ3MgfD0gTERMTV9GTF9IQVNfSU5URU5UOwotCQlpZiAoaXQtPml0X29wICYgKElUX1VOTElOSyB8IElUX0dFVEFUVFIgfCBJVF9SRUFERElSKSkKKwkJaWYgKGl0LT5pdF9vcCAmIChJVF9PUEVOIHwgSVRfVU5MSU5LIHwgSVRfR0VUQVRUUiB8IElUX1JFQURESVIpKQogCQkJcG9saWN5ID0gJnVwZGF0ZV9wb2xpY3k7CiAJCWVsc2UgaWYgKGl0LT5pdF9vcCAmIElUX0xBWU9VVCkKIAkJCXBvbGljeSA9ICZsYXlvdXRfcG9saWN5OwogCQllbHNlIGlmIChpdC0+aXRfb3AgJiAoSVRfR0VUWEFUVFIgfCBJVF9TRVRYQVRUUikpCiAJCQlwb2xpY3kgPSAmZ2V0eGF0dHJfcG9saWN5OworCQllbHNlCisJCQlwb2xpY3kgPSAmbG9va3VwX3BvbGljeTsKIAl9CiAKLQlMQVNTRVJUKCFyZXFwKTsKLQogCWdlbmVyYXRpb24gPSBvYmRkZXYtPnUuY2xpLmNsX2ltcG9ydC0+aW1wX2dlbmVyYXRpb247CiByZXNlbmQ6CiAJZmxhZ3MgPSBzYXZlZF9mbGFnczsKIAlpZiAoIWl0KSB7Ci0JCS8qIFRoZSBvbmx5IHdheSByaWdodCBub3cgaXMgRkxPQ0ssIGluIHRoaXMgY2FzZSB3ZSBoaWRlIGZsb2NrCi0JCSAqIHBvbGljeSBhcyBsbW0sIGJ1dCBsbW1zaXplIGlzIDAKLQkJICovCi0JCUxBU1NFUlQobG1tICYmIGxtbXNpemUgPT0gMCk7CisJCS8qIFRoZSBvbmx5IHdheSByaWdodCBub3cgaXMgRkxPQ0suICovCiAJCUxBU1NFUlRGKGVpbmZvLT5laV90eXBlID09IExETE1fRkxPQ0ssICJsb2NrIHR5cGUgJWRcbiIsCiAJCQkgZWluZm8tPmVpX3R5cGUpOwotCQlwb2xpY3kgPSBsbW07CiAJCXJlc19pZC5uYW1lWzNdID0gTERMTV9GTE9DSzsKLQkJcmVxID0gTlVMTDsKIAl9IGVsc2UgaWYgKGl0LT5pdF9vcCAmIElUX09QRU4pIHsKLQkJcmVxID0gbWRjX2ludGVudF9vcGVuX3BhY2soZXhwLCBpdCwgb3BfZGF0YSwgbG1tLCBsbW1zaXplLAotCQkJCQkgICBlaW5mby0+ZWlfY2JkYXRhKTsKLQkJcG9saWN5ID0gJnVwZGF0ZV9wb2xpY3k7Ci0JCWVpbmZvLT5laV9jYmRhdGEgPSBOVUxMOwotCQlsbW0gPSBOVUxMOworCQlyZXEgPSBtZGNfaW50ZW50X29wZW5fcGFjayhleHAsIGl0LCBvcF9kYXRhKTsKIAl9IGVsc2UgaWYgKGl0LT5pdF9vcCAmIElUX1VOTElOSykgewogCQlyZXEgPSBtZGNfaW50ZW50X3VubGlua19wYWNrKGV4cCwgaXQsIG9wX2RhdGEpOwogCX0gZWxzZSBpZiAoaXQtPml0X29wICYgKElUX0dFVEFUVFIgfCBJVF9MT09LVVApKSB7CkBAIC04MDYsNyArNzgwLDcgQEAKIAkgKi8KIAlpZiAoaXQpIHsKIAkJbWRjX2dldF9ycGNfbG9jayhvYmRkZXYtPnUuY2xpLmNsX3JwY19sb2NrLCBpdCk7Ci0JCXJjID0gbWRjX2VudGVyX3JlcXVlc3QoJm9iZGRldi0+dS5jbGkpOworCQlyYyA9IG9iZF9nZXRfcmVxdWVzdF9zbG90KCZvYmRkZXYtPnUuY2xpKTsKIAkJaWYgKHJjICE9IDApIHsKIAkJCW1kY19wdXRfcnBjX2xvY2sob2JkZGV2LT51LmNsaS5jbF9ycGNfbG9jaywgaXQpOwogCQkJbWRjX2NsZWFyX3JlcGxheV9mbGFnKHJlcSwgMCk7CkBAIC04MzQsMTMgKzgwOCwxMiBAQAogCQlyZXR1cm4gcmM7CiAJfQogCi0JbWRjX2V4aXRfcmVxdWVzdCgmb2JkZGV2LT51LmNsaSk7CisJb2JkX3B1dF9yZXF1ZXN0X3Nsb3QoJm9iZGRldi0+dS5jbGkpOwogCW1kY19wdXRfcnBjX2xvY2sob2JkZGV2LT51LmNsaS5jbF9ycGNfbG9jaywgaXQpOwogCiAJaWYgKHJjIDwgMCkgewotCQlDREVCVUdfTElNSVQoKHJjID09IC1FQUNDRVMgfHwgcmMgPT0gLUVJRFJNKSA/IERfSU5GTyA6IERfRVJST1IsCi0JCQkgICAgICIlczogbGRsbV9jbGlfZW5xdWV1ZSBmYWlsZWQ6IHJjID0gJWRcbiIsCi0JCQkgICAgIG9iZGRldi0+b2JkX25hbWUsIHJjKTsKKwkJQ0RFQlVHKERfSU5GTywgIiVzOiBsZGxtX2NsaV9lbnF1ZXVlIGZhaWxlZDogcmMgPSAlZFxuIiwKKwkJICAgICAgIG9iZGRldi0+b2JkX25hbWUsIHJjKTsKIAogCQltZGNfY2xlYXJfcmVwbGF5X2ZsYWcocmVxLCByYyk7CiAJCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKQEAgLTkwMyw2ICs4NzYsOSBAQAogCUxBU1NFUlQocmVxdWVzdCAhPSBMUF9QT0lTT04pOwogCUxBU1NFUlQocmVxdWVzdC0+cnFfcmVwbXNnICE9IExQX1BPSVNPTik7CiAKKwlpZiAoaXQtPml0X29wICYgSVRfUkVBRERJUikKKwkJcmV0dXJuIDA7CisKIAlpZiAoIWl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX0lUX0VYRUNEKSkgewogCQkvKiBUaGUgc2VydmVyIGZhaWxlZCBiZWZvcmUgaXQgZXZlbiBzdGFydGVkIGV4ZWN1dGluZyB0aGUKIAkJICogaW50ZW50LCBpLmUuIGJlY2F1c2UgaXQgY291bGRuJ3QgdW5wYWNrIHRoZSByZXF1ZXN0LgpAQCAtOTE3LDI3ICs4OTMsNiBAQAogCW1kdF9ib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxdWVzdC0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CiAJTEFTU0VSVChtZHRfYm9keSk7ICAgICAgLyogbWRjX2VucXVldWUgY2hlY2tlZCAqLwogCi0JLyogSWYgd2Ugd2VyZSByZXZhbGlkYXRpbmcgYSBmaWQvbmFtZSBwYWlyLCBtYXJrIHRoZSBpbnRlbnQgaW4KLQkgKiBjYXNlIHdlIGZhaWwgYW5kIGdldCBjYWxsZWQgYWdhaW4gZnJvbSBsb29rdXAKLQkgKi8KLQlpZiAoZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDIpICYmCi0JICAgIGl0LT5pdF9jcmVhdGVfbW9kZSAmIE1fQ0hFQ0tfU1RBTEUgJiYKLQkgICAgaXQtPml0X29wICE9IElUX0dFVEFUVFIpIHsKLQkJLyogQWxzbzogZGlkIHdlIGZpbmQgdGhlIHNhbWUgaW5vZGU/ICovCi0JCS8qIHNldmVyIGNhbiByZXR1cm4gb25lIG9mIHR3byBmaWRzOgotCQkgKiBvcF9maWQyIC0gbmV3IGFsbG9jYXRlZCBmaWQgLSBpZiBmaWxlIGlzIGNyZWF0ZWQuCi0JCSAqIG9wX2ZpZDMgLSBleGlzdGVudCBmaWQgLSBpZiBmaWxlIG9ubHkgb3Blbi4KLQkJICogb3BfZmlkMyBpcyBzYXZlZCBpbiBsbXZfaW50ZW50X29wZW4KLQkJICovCi0JCWlmICgoIWx1X2ZpZF9lcSgmb3BfZGF0YS0+b3BfZmlkMiwgJm1kdF9ib2R5LT5maWQxKSkgJiYKLQkJICAgICghbHVfZmlkX2VxKCZvcF9kYXRhLT5vcF9maWQzLCAmbWR0X2JvZHktPmZpZDEpKSkgewotCQkJQ0RFQlVHKERfREVOVFJZLCAiRm91bmQgc3RhbGUgZGF0YSAiREZJRCIoIkRGSUQiKS8iREZJRAotCQkJICAgICAgICJcbiIsIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDIpLAotCQkJICAgICAgIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDIpLCBQRklEKCZtZHRfYm9keS0+ZmlkMSkpOwotCQkJcmV0dXJuIC1FU1RBTEU7Ci0JCX0KLQl9Ci0KIAlyYyA9IGl0X29wZW5fZXJyb3IoRElTUF9MT09LVVBfRVhFQ0QsIGl0KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKQEAgLTk4MCwxMCArOTM1LDEwIEBACiAKIAkJTERMTV9ERUJVRyhsb2NrLCAibWF0Y2hpbmcgYWdhaW5zdCB0aGlzIik7CiAKLQkJTEFTU0VSVEYoZmlkX3Jlc19uYW1lX2VxKCZtZHRfYm9keS0+ZmlkMSwKKwkJTEFTU0VSVEYoZmlkX3Jlc19uYW1lX2VxKCZtZHRfYm9keS0+bWJvX2ZpZDEsCiAJCQkJCSAmbG9jay0+bF9yZXNvdXJjZS0+bHJfbmFtZSksCiAJCQkgIkxvY2sgcmVzX2lkOiAiRExETE1SRVMiLCBmaWQ6ICJERklEIlxuIiwKLQkJCSBQTERMTVJFUyhsb2NrLT5sX3Jlc291cmNlKSwgUEZJRCgmbWR0X2JvZHktPmZpZDEpKTsKKwkJCSBQTERMTVJFUyhsb2NrLT5sX3Jlc291cmNlKSwgUEZJRCgmbWR0X2JvZHktPm1ib19maWQxKSk7CiAJCUxETE1fTE9DS19QVVQobG9jayk7CiAKIAkJbWVtY3B5KCZvbGRfbG9jaywgbG9ja2gsIHNpemVvZigqbG9ja2gpKTsKQEAgLTk5OCw4ICs5NTMsOCBAQAogCX0KIAlDREVCVUcoRF9ERU5UUlksCiAJICAgICAgICJEX0lUIGRlbnRyeSAlLipzIGludGVudDogJXMgc3RhdHVzICVkIGRpc3AgJXggcmMgJWRcbiIsCi0JICAgICAgIG9wX2RhdGEtPm9wX25hbWVsZW4sIG9wX2RhdGEtPm9wX25hbWUsIGxkbG1faXQyc3RyKGl0LT5pdF9vcCksCi0JICAgICAgIGl0LT5pdF9zdGF0dXMsIGl0LT5pdF9kaXNwb3NpdGlvbiwgcmMpOworCSAgICAgICAoaW50KW9wX2RhdGEtPm9wX25hbWVsZW4sIG9wX2RhdGEtPm9wX25hbWUsCisJICAgICAgIGxkbG1faXQyc3RyKGl0LT5pdF9vcCksIGl0LT5pdF9zdGF0dXMsIGl0LT5pdF9kaXNwb3NpdGlvbiwgcmMpOwogCXJldHVybiByYzsKIH0KIApAQCAtMTA0Miw2ICs5OTcsOSBAQAogCQkJCQkJICBNRFNfSU5PREVMT0NLX0xPT0tVUCB8CiAJCQkJCQkgIE1EU19JTk9ERUxPQ0tfUEVSTTsKIAkJCWJyZWFrOworCQljYXNlIElUX1JFQURESVI6CisJCQlwb2xpY3kubF9pbm9kZWJpdHMuYml0cyA9IE1EU19JTk9ERUxPQ0tfVVBEQVRFOworCQkJYnJlYWs7CiAJCWNhc2UgSVRfTEFZT1VUOgogCQkJcG9saWN5LmxfaW5vZGViaXRzLmJpdHMgPSBNRFNfSU5PREVMT0NLX0xBWU9VVDsKIAkJCWJyZWFrOwpAQCAtMTA5NSwxMCArMTA1Myw4IEBACiAgKiBjaGlsZCBsb29rdXAuCiAgKi8KIGludCBtZGNfaW50ZW50X2xvY2soc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCSAgICB2b2lkICpsbW0sIGludCBsbW1zaXplLCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsCi0JCSAgICBpbnQgbG9va3VwX2ZsYWdzLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXFwLAotCQkgICAgbGRsbV9ibG9ja2luZ19jYWxsYmFjayBjYl9ibG9ja2luZywKLQkJICAgIF9fdTY0IGV4dHJhX2xvY2tfZmxhZ3MpCisJCSAgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXAsCisJCSAgICBsZGxtX2Jsb2NraW5nX2NhbGxiYWNrIGNiX2Jsb2NraW5nLCBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKQogewogCXN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyBlaW5mbyA9IHsKIAkJLmVpX3R5cGUJPSBMRExNX0lCSVRTLApAQCAtMTExMiwxNCArMTA2OCwxNCBAQAogCUxBU1NFUlQoaXQpOwogCiAJQ0RFQlVHKERfRExNVFJBQ0UsICIobmFtZTogJS4qcywiREZJRCIpIGluIG9iaiAiREZJRAotCQkiLCBpbnRlbnQ6ICVzIGZsYWdzICUjTG9cbiIsIG9wX2RhdGEtPm9wX25hbWVsZW4sCisJCSIsIGludGVudDogJXMgZmxhZ3MgJSNMb1xuIiwgKGludClvcF9kYXRhLT5vcF9uYW1lbGVuLAogCQlvcF9kYXRhLT5vcF9uYW1lLCBQRklEKCZvcF9kYXRhLT5vcF9maWQyKSwKIAkJUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksIGxkbG1faXQyc3RyKGl0LT5pdF9vcCksCiAJCWl0LT5pdF9mbGFncyk7CiAKIAlsb2NraC5jb29raWUgPSAwOwogCWlmIChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMikgJiYKLQkgICAgKGl0LT5pdF9vcCAmIChJVF9MT09LVVAgfCBJVF9HRVRBVFRSKSkpIHsKKwkgICAgKGl0LT5pdF9vcCAmIChJVF9MT09LVVAgfCBJVF9HRVRBVFRSIHwgSVRfUkVBRERJUikpKSB7CiAJCS8qIFdlIGNvdWxkIGp1c3QgcmV0dXJuIDEgaW1tZWRpYXRlbHksIGJ1dCBzaW5jZSB3ZSBzaG91bGQgb25seQogCQkgKiBiZSBjYWxsZWQgaW4gcmV2YWxpZGF0ZV9pdCBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBsb2NrLCBsZXQncwogCQkgKiB2ZXJpZnkgdGhhdC4KQEAgLTExMzUsMTMgKzEwOTEsMTMgQEAKIAogCS8qIEZvciBjYXNlIGlmIHVwcGVyIGxheWVyIGRpZCBub3QgYWxsb2MgZmlkLCBkbyBpdCBub3cuICovCiAJaWYgKCFmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMikgJiYgaXQtPml0X29wICYgSVRfQ1JFQVQpIHsKLQkJcmMgPSBtZGNfZmlkX2FsbG9jKGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDIsIG9wX2RhdGEpOworCQlyYyA9IG1kY19maWRfYWxsb2MoTlVMTCwgZXhwLCAmb3BfZGF0YS0+b3BfZmlkMiwgb3BfZGF0YSk7CiAJCWlmIChyYyA8IDApIHsKIAkJCUNFUlJPUigiQ2FuJ3QgYWxsb2MgbmV3IGZpZCwgcmMgJWRcbiIsIHJjKTsKIAkJCXJldHVybiByYzsKIAkJfQogCX0KLQlyYyA9IG1kY19lbnF1ZXVlKGV4cCwgJmVpbmZvLCBpdCwgb3BfZGF0YSwgJmxvY2toLCBsbW0sIGxtbXNpemUsIE5VTEwsCisJcmMgPSBtZGNfZW5xdWV1ZShleHAsICZlaW5mbywgTlVMTCwgaXQsIG9wX2RhdGEsICZsb2NraCwKIAkJCSBleHRyYV9sb2NrX2ZsYWdzKTsKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CkBAIC0xMTcwLDcgKzExMjYsNyBAQAogCiAJb2JkZGV2ID0gY2xhc3NfZXhwMm9iZChleHApOwogCi0JbWRjX2V4aXRfcmVxdWVzdCgmb2JkZGV2LT51LmNsaSk7CisJb2JkX3B1dF9yZXF1ZXN0X3Nsb3QoJm9iZGRldi0+dS5jbGkpOwogCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9NRENfR0VUQVRUUl9FTlFVRVVFKSkKIAkJcmMgPSAtRVRJTUVET1VUOwogCkBAIC0xMjIyLDE1ICsxMTc4LDE1IEBACiAKIAlDREVCVUcoRF9ETE1UUkFDRSwKIAkgICAgICAgIm5hbWU6ICUuKnMgaW4gaW5vZGUgIiBERklEICIsIGludGVudDogJXMgZmxhZ3MgJSNMb1xuIiwKLQkgICAgICAgb3BfZGF0YS0+b3BfbmFtZWxlbiwgb3BfZGF0YS0+b3BfbmFtZSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksCi0JICAgICAgIGxkbG1faXQyc3RyKGl0LT5pdF9vcCksIGl0LT5pdF9mbGFncyk7CisJICAgICAgIChpbnQpb3BfZGF0YS0+b3BfbmFtZWxlbiwgb3BfZGF0YS0+b3BfbmFtZSwKKwkgICAgICAgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksIGxkbG1faXQyc3RyKGl0LT5pdF9vcCksIGl0LT5pdF9mbGFncyk7CiAKIAlmaWRfYnVpbGRfcmVnX3Jlc19uYW1lKCZvcF9kYXRhLT5vcF9maWQxLCAmcmVzX2lkKTsKIAlyZXEgPSBtZGNfaW50ZW50X2dldGF0dHJfcGFjayhleHAsIGl0LCBvcF9kYXRhKTsKIAlpZiAoSVNfRVJSKHJlcSkpCiAJCXJldHVybiBQVFJfRVJSKHJlcSk7CiAKLQlyYyA9IG1kY19lbnRlcl9yZXF1ZXN0KCZvYmRkZXYtPnUuY2xpKTsKKwlyYyA9IG9iZF9nZXRfcmVxdWVzdF9zbG90KCZvYmRkZXYtPnUuY2xpKTsKIAlpZiAocmMgIT0gMCkgewogCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CiAJCXJldHVybiByYzsKQEAgLTEyMzksNyArMTE5NSw3IEBACiAJcmMgPSBsZGxtX2NsaV9lbnF1ZXVlKGV4cCwgJnJlcSwgZWluZm8sICZyZXNfaWQsICZwb2xpY3ksICZmbGFncywgTlVMTCwKIAkJCSAgICAgIDAsIExWQl9UX05PTkUsICZtaW5mby0+bWlfbG9ja2gsIDEpOwogCWlmIChyYyA8IDApIHsKLQkJbWRjX2V4aXRfcmVxdWVzdCgmb2JkZGV2LT51LmNsaSk7CisJCW9iZF9wdXRfcmVxdWVzdF9zbG90KCZvYmRkZXYtPnUuY2xpKTsKIAkJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwogCQlyZXR1cm4gcmM7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZWludC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZWludC5jCmluZGV4IDVkYmEyYzguLmM5MjFlNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVpbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX3JlaW50LmMKQEAgLTg2LDcgKzg2LDcgQEAKIAlmaWRfYnVpbGRfcmVnX3Jlc19uYW1lKGZpZCwgJnJlc19pZCk7CiAJcmVzID0gbGRsbV9yZXNvdXJjZV9nZXQoZXhwLT5leHBfb2JkLT5vYmRfbmFtZXNwYWNlLAogCQkJCU5VTEwsICZyZXNfaWQsIDAsIDApOwotCWlmICghcmVzKQorCWlmIChJU19FUlIocmVzKSkKIAkJcmV0dXJuIDA7CiAJTERMTV9SRVNPVVJDRV9BRERSRUYocmVzKTsKIAkvKiBJbml0aWFsaXplIGliaXRzIGxvY2sgcG9saWN5LiAqLwpAQCAtOTksNyArOTksNyBAQAogfQogCiBpbnQgbWRjX3NldGF0dHIoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCXZvaWQgKmVhLCBpbnQgZWFsZW4sIHZvaWQgKmVhMiwgaW50IGVhMmxlbiwKKwkJdm9pZCAqZWEsIHNpemVfdCBlYWxlbiwgdm9pZCAqZWEyLCBzaXplX3QgZWEybGVuLAogCQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0LCBzdHJ1Y3QgbWRfb3Blbl9kYXRhICoqbW9kKQogewogCUxJU1RfSEVBRChjYW5jZWxzKTsKQEAgLTExMCwxMSArMTEwLDEwIEBACiAJX191NjQgYml0czsKIAogCWJpdHMgPSBNRFNfSU5PREVMT0NLX1VQREFURTsKLQlpZiAob3BfZGF0YS0+b3BfYXR0ci5pYV92YWxpZCAmIChBVFRSX01PREV8QVRUUl9VSUR8QVRUUl9HSUQpKQorCWlmIChvcF9kYXRhLT5vcF9hdHRyLmlhX3ZhbGlkICYgKEFUVFJfTU9ERSB8IEFUVFJfVUlEIHwgQVRUUl9HSUQpKQogCQliaXRzIHw9IE1EU19JTk9ERUxPQ0tfTE9PS1VQOwogCWlmICgob3BfZGF0YS0+b3BfZmxhZ3MgJiBNRl9NRENfQ0FOQ0VMX0ZJRDEpICYmCi0JICAgIChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMSkpICYmCi0JICAgICFPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MRExNX0JMX0NBTExCQUNLX05FVCkpCisJICAgIChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMSkpKQogCQljb3VudCA9IG1kY19yZXNvdXJjZV9nZXRfdW51c2VkKGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDEsCiAJCQkJCQkmY2FuY2VscywgTENLX0VYLCBiaXRzKTsKIAlyZXEgPSBwdGxycGNfcmVxdWVzdF9hbGxvYyhjbGFzc19leHAyY2xpaW1wKGV4cCksCkBAIC0xNzcsOCArMTc2LDggQEAKIAogCQllcG9jaCA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfRVBPQ0gpOwogCQlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKLQkJZXBvY2gtPmhhbmRsZSA9IGJvZHktPmhhbmRsZTsKLQkJZXBvY2gtPmlvZXBvY2ggPSBib2R5LT5pb2Vwb2NoOworCQllcG9jaC0+aGFuZGxlID0gYm9keS0+bWJvX2hhbmRsZTsKKwkJZXBvY2gtPmlvZXBvY2ggPSBib2R5LT5tYm9faW9lcG9jaDsKIAkJcmVxLT5ycV9yZXBsYXlfY2IgPSBtZGNfcmVwbGF5X29wZW47CiAJLyoqIGJ1ZyAzNjMzLCBvcGVuIG1heSBiZSBjb21taXR0ZWQgYW5kIGVzdGFsZSBhbnN3ZXIgaXMgbm90IGVycm9yICovCiAJfSBlbHNlIGlmIChyYyA9PSAtRVNUQUxFICYmIChvcF9kYXRhLT5vcF9mbGFncyAmIE1GX1NPTV9DSEFOR0UpKSB7CkBAIC0xOTcsOSArMTk2LDkgQEAKIH0KIAogaW50IG1kY19jcmVhdGUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhbGVuLCBpbnQgbW9kZSwgX191MzIgdWlkLCBfX3UzMiBnaWQsCi0JICAgICAgIGNmc19jYXBfdCBjYXBfZWZmZWN0aXZlLCBfX3U2NCByZGV2LAotCSAgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQorCSAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YWxlbiwgdW1vZGVfdCBtb2RlLAorCSAgICAgICB1aWRfdCB1aWQsIGdpZF90IGdpZCwgY2ZzX2NhcF90IGNhcF9lZmZlY3RpdmUsCisJICAgICAgIF9fdTY0IHJkZXYsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpCiB7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXE7CiAJaW50IGxldmVsLCByYzsKQEAgLTIxNCwxMSArMjEzLDkgQEAKIAkJICogbWRjX2ZpZF9hbGxvYygpIG1heSByZXR1cm4gZXJybm8gMSBpbiBjYXNlIG9mIHN3aXRjaCB0byBuZXcKIAkJICogc2VxdWVuY2UsIGhhbmRsZSB0aGlzLgogCQkgKi8KLQkJcmMgPSBtZGNfZmlkX2FsbG9jKGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDIsIG9wX2RhdGEpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlDRVJST1IoIkNhbid0IGFsbG9jIG5ldyBmaWQsIHJjICVkXG4iLCByYyk7CisJCXJjID0gbWRjX2ZpZF9hbGxvYyhOVUxMLCBleHAsICZvcF9kYXRhLT5vcF9maWQyLCBvcF9kYXRhKTsKKwkJaWYgKHJjIDwgMCkKIAkJCXJldHVybiByYzsKLQkJfQogCX0KIAogcmVidWlsZDoKQEAgLTMwNywxNCArMzA0LDEyIEBACiAJTEFTU0VSVCghcmVxKTsKIAogCWlmICgob3BfZGF0YS0+b3BfZmxhZ3MgJiBNRl9NRENfQ0FOQ0VMX0ZJRDEpICYmCi0JICAgIChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMSkpICYmCi0JICAgICFPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MRExNX0JMX0NBTExCQUNLX05FVCkpCisJICAgIChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMSkpKQogCQljb3VudCA9IG1kY19yZXNvdXJjZV9nZXRfdW51c2VkKGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDEsCiAJCQkJCQkmY2FuY2VscywgTENLX0VYLAogCQkJCQkJTURTX0lOT0RFTE9DS19VUERBVEUpOwogCWlmICgob3BfZGF0YS0+b3BfZmxhZ3MgJiBNRl9NRENfQ0FOQ0VMX0ZJRDMpICYmCi0JICAgIChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMykpICYmCi0JICAgICFPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MRExNX0JMX0NBTExCQUNLX05FVCkpCisJICAgIChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMykpKQogCQljb3VudCArPSBtZGNfcmVzb3VyY2VfZ2V0X3VudXNlZChleHAsICZvcF9kYXRhLT5vcF9maWQzLAogCQkJCQkJICZjYW5jZWxzLCBMQ0tfRVgsCiAJCQkJCQkgTURTX0lOT0RFTE9DS19GVUxMKTsKQEAgLTM5NCw3ICszODksNyBAQAogfQogCiBpbnQgbWRjX3JlbmFtZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkgICAgICAgY29uc3QgY2hhciAqb2xkLCBpbnQgb2xkbGVuLCBjb25zdCBjaGFyICpuZXcsIGludCBuZXdsZW4sCisJICAgICAgIGNvbnN0IGNoYXIgKm9sZCwgc2l6ZV90IG9sZGxlbiwgY29uc3QgY2hhciAqbmV3LCBzaXplX3QgbmV3bGVuLAogCSAgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQogewogCUxJU1RfSEVBRChjYW5jZWxzKTsKQEAgLTQzMSw3ICs0MjYsOCBAQAogCX0KIAogCXJlcV9jYXBzdWxlX3NldF9zaXplKCZyZXEtPnJxX3BpbGwsICZSTUZfTkFNRSwgUkNMX0NMSUVOVCwgb2xkbGVuICsgMSk7Ci0JcmVxX2NhcHN1bGVfc2V0X3NpemUoJnJlcS0+cnFfcGlsbCwgJlJNRl9TWU1UR1QsIFJDTF9DTElFTlQsIG5ld2xlbisxKTsKKwlyZXFfY2Fwc3VsZV9zZXRfc2l6ZSgmcmVxLT5ycV9waWxsLCAmUk1GX1NZTVRHVCwgUkNMX0NMSUVOVCwKKwkJCSAgICAgbmV3bGVuICsgMSk7CiAKIAlyYyA9IG1kY19wcmVwX2VsY19yZXEoZXhwLCByZXEsIE1EU19SRUlOVCwgJmNhbmNlbHMsIGNvdW50KTsKIAlpZiAocmMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVxdWVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZXF1ZXN0LmMKaW5kZXggNTQyODAxZi4uZjU2ZWE2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZXF1ZXN0LmMKQEAgLTM5LDcgKzM5LDkgQEAKICMgaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfYWNsLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lvY3RsLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfY2xhc3MuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9sbXYuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9maWQuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfcGFyYW0uaCIKQEAgLTU3LDE2ICs1OSwxNiBAQAogCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSAmcmVxLT5ycV9pbXBvcnQtPmltcF9vYmQtPnUuY2xpOwogCWludCByYzsKIAotCS8qIG1kY19lbnRlcl9yZXF1ZXN0KCkgZW5zdXJlcyB0aGF0IHRoaXMgY2xpZW50IGhhcyBubyBtb3JlCisJLyogb2JkX2dldF9yZXF1ZXN0X3Nsb3QoKSBlbnN1cmVzIHRoYXQgdGhpcyBjbGllbnQgaGFzIG5vIG1vcmUKIAkgKiB0aGFuIGNsX21heF9ycGNzX2luX2ZsaWdodCBSUENzIHNpbXVsdGFuZW91c2x5IGluZiBsaWdodAogCSAqIGFnYWluc3QgYW4gTURULgogCSAqLwotCXJjID0gbWRjX2VudGVyX3JlcXVlc3QoY2xpKTsKKwlyYyA9IG9iZF9nZXRfcmVxdWVzdF9zbG90KGNsaSk7CiAJaWYgKHJjICE9IDApCiAJCXJldHVybiByYzsKIAogCXJjID0gcHRscnBjX3F1ZXVlX3dhaXQocmVxKTsKLQltZGNfZXhpdF9yZXF1ZXN0KGNsaSk7CisJb2JkX3B1dF9yZXF1ZXN0X3Nsb3QoY2xpKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTk4LDcgKzEwMCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCSpyb290ZmlkID0gYm9keS0+ZmlkMTsKKwkqcm9vdGZpZCA9IGJvZHktPm1ib19maWQxOwogCUNERUJVRyhEX05FVCwKIAkgICAgICAgInJvb3QgZmlkPSJERklEIiwgbGFzdF9jb21taXR0ZWQ9JWxsdVxuIiwKIAkgICAgICAgUEZJRChyb290ZmlkKSwKQEAgLTEzNiwxMiArMTM4LDEyIEBACiAJaWYgKCFib2R5KQogCQlyZXR1cm4gLUVQUk9UTzsKIAotCUNERUJVRyhEX05FVCwgIm1vZGU6ICVvXG4iLCBib2R5LT5tb2RlKTsKKwlDREVCVUcoRF9ORVQsICJtb2RlOiAlb1xuIiwgYm9keS0+bWJvX21vZGUpOwogCiAJbWRjX3VwZGF0ZV9tYXhfZWFfZnJvbV9ib2R5KGV4cCwgYm9keSk7Ci0JaWYgKGJvZHktPmVhZGF0YXNpemUgIT0gMCkgeworCWlmIChib2R5LT5tYm9fZWFkYXRhc2l6ZSAhPSAwKSB7CiAJCWVhZGF0YSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9zaXplZF9nZXQocGlsbCwgJlJNRl9NRFRfTUQsCi0JCQkJCQkgICAgICBib2R5LT5lYWRhdGFzaXplKTsKKwkJCQkJCSAgICAgIGJvZHktPm1ib19lYWRhdGFzaXplKTsKIAkJaWYgKCFlYWRhdGEpCiAJCQlyZXR1cm4gLUVQUk9UTzsKIAl9CkBAIC0yMzAsMzIgKzIzMiw2IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IG1kY19pc19zdWJkaXIoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKLQkJCSBjb25zdCBzdHJ1Y3QgbHVfZmlkICpwZmlkLAotCQkJIGNvbnN0IHN0cnVjdCBsdV9maWQgKmNmaWQsCi0JCQkgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKLXsKLQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgICpyZXE7Ci0JaW50CQkgICAgIHJjOwotCi0JKnJlcXVlc3QgPSBOVUxMOwotCXJlcSA9IHB0bHJwY19yZXF1ZXN0X2FsbG9jX3BhY2soY2xhc3NfZXhwMmNsaWltcChleHApLAotCQkJCQkmUlFGX01EU19JU19TVUJESVIsIExVU1RSRV9NRFNfVkVSU0lPTiwKLQkJCQkJTURTX0lTX1NVQkRJUik7Ci0JaWYgKCFyZXEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWRjX2lzX3N1YmRpcl9wYWNrKHJlcSwgcGZpZCwgY2ZpZCwgMCk7Ci0JcHRscnBjX3JlcXVlc3Rfc2V0X3JlcGxlbihyZXEpOwotCi0JcmMgPSBwdGxycGNfcXVldWVfd2FpdChyZXEpOwotCWlmIChyYyAmJiByYyAhPSAtRVJFTU9URSkKLQkJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwotCWVsc2UKLQkJKnJlcXVlc3QgPSByZXE7Ci0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW50IG1kY194YXR0cl9jb21tb24oc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKIAkJCSAgICBjb25zdCBzdHJ1Y3QgcmVxX2Zvcm1hdCAqZm10LAogCQkJICAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCwKQEAgLTM5NywxNSArMzczLDE1IEBACiAJdm9pZAkJICAgKmJ1ZjsKIAlpbnQJCSAgICAgcmM7CiAKLQlpZiAoIWJvZHktPmFjbHNpemUpCisJaWYgKCFib2R5LT5tYm9fYWNsc2l6ZSkKIAkJcmV0dXJuIDA7CiAKLQlidWYgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KHBpbGwsICZSTUZfQUNMLCBib2R5LT5hY2xzaXplKTsKKwlidWYgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KHBpbGwsICZSTUZfQUNMLCBib2R5LT5tYm9fYWNsc2l6ZSk7CiAKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FUFJPVE87CiAKLQlhY2wgPSBwb3NpeF9hY2xfZnJvbV94YXR0cigmaW5pdF91c2VyX25zLCBidWYsIGJvZHktPmFjbHNpemUpOworCWFjbCA9IHBvc2l4X2FjbF9mcm9tX3hhdHRyKCZpbml0X3VzZXJfbnMsIGJ1ZiwgYm9keS0+bWJvX2FjbHNpemUpOwogCWlmICghYWNsKQogCQlyZXR1cm4gMDsKIApAQCAtNDQzLDI0ICs0MTksMjQgQEAKIAogCW1kLT5ib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldChwaWxsLCAmUk1GX01EVF9CT0RZKTsKIAotCWlmIChtZC0+Ym9keS0+dmFsaWQgJiBPQkRfTURfRkxFQVNJWkUpIHsKKwlpZiAobWQtPmJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTEVBU0laRSkgewogCQlpbnQgbG1tc2l6ZTsKIAkJc3RydWN0IGxvdl9tZHNfbWQgKmxtbTsKIAotCQlpZiAoIVNfSVNSRUcobWQtPmJvZHktPm1vZGUpKSB7CisJCWlmICghU19JU1JFRyhtZC0+Ym9keS0+bWJvX21vZGUpKSB7CiAJCQlDREVCVUcoRF9JTkZPLAogCQkJICAgICAgICJPQkRfTURfRkxFQVNJWkUgc2V0LCBzaG91bGQgYmUgYSByZWd1bGFyIGZpbGUsIGJ1dCBpcyBub3RcbiIpOwogCQkJcmMgPSAtRVBST1RPOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlpZiAobWQtPmJvZHktPmVhZGF0YXNpemUgPT0gMCkgeworCQlpZiAobWQtPmJvZHktPm1ib19lYWRhdGFzaXplID09IDApIHsKIAkJCUNERUJVRyhEX0lORk8sCiAJCQkgICAgICAgIk9CRF9NRF9GTEVBU0laRSBzZXQsIGJ1dCBlYWRhdGFzaXplIDBcbiIpOwogCQkJcmMgPSAtRVBST1RPOwogCQkJZ290byBvdXQ7CiAJCX0KLQkJbG1tc2l6ZSA9IG1kLT5ib2R5LT5lYWRhdGFzaXplOworCQlsbW1zaXplID0gbWQtPmJvZHktPm1ib19lYWRhdGFzaXplOwogCQlsbW0gPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KHBpbGwsICZSTUZfTURUX01ELCBsbW1zaXplKTsKIAkJaWYgKCFsbW0pIHsKIAkJCXJjID0gLUVQUk9UTzsKQEAgLTQ3MSw3ICs0NDcsNyBAQAogCQlpZiAocmMgPCAwKQogCQkJZ290byBvdXQ7CiAKLQkJaWYgKHJjIDwgc2l6ZW9mKCptZC0+bHNtKSkgeworCQlpZiAocmMgPCAodHlwZW9mKHJjKSlzaXplb2YoKm1kLT5sc20pKSB7CiAJCQlDREVCVUcoRF9JTkZPLAogCQkJICAgICAgICJsc20gc2l6ZSB0b28gc21hbGw6IHJjIDwgc2l6ZW9mICgqbWQtPmxzbSkgKCVkIDwgJWQpXG4iLAogCQkJICAgICAgIHJjLCAoaW50KXNpemVvZigqbWQtPmxzbSkpOwpAQCAtNDc5LDI0ICs0NTUsMjQgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQl9IGVsc2UgaWYgKG1kLT5ib2R5LT52YWxpZCAmIE9CRF9NRF9GTERJUkVBKSB7CisJfSBlbHNlIGlmIChtZC0+Ym9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMRElSRUEpIHsKIAkJaW50IGxtdnNpemU7CiAJCXN0cnVjdCBsb3ZfbWRzX21kICpsbXY7CiAKLQkJaWYgKCFTX0lTRElSKG1kLT5ib2R5LT5tb2RlKSkgeworCQlpZiAoIVNfSVNESVIobWQtPmJvZHktPm1ib19tb2RlKSkgewogCQkJQ0RFQlVHKERfSU5GTywKIAkJCSAgICAgICAiT0JEX01EX0ZMRElSRUEgc2V0LCBzaG91bGQgYmUgYSBkaXJlY3RvcnksIGJ1dCBpcyBub3RcbiIpOwogCQkJcmMgPSAtRVBST1RPOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlpZiAobWQtPmJvZHktPmVhZGF0YXNpemUgPT0gMCkgeworCQlpZiAobWQtPmJvZHktPm1ib19lYWRhdGFzaXplID09IDApIHsKIAkJCUNERUJVRyhEX0lORk8sCiAJCQkgICAgICAgIk9CRF9NRF9GTERJUkVBIGlzIHNldCwgYnV0IGVhZGF0YXNpemUgMFxuIik7CiAJCQlyZXR1cm4gLUVQUk9UTzsKIAkJfQotCQlpZiAobWQtPmJvZHktPnZhbGlkICYgT0JEX01EX01FQSkgewotCQkJbG12c2l6ZSA9IG1kLT5ib2R5LT5lYWRhdGFzaXplOworCQlpZiAobWQtPmJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9NRUEpIHsKKwkJCWxtdnNpemUgPSBtZC0+Ym9keS0+bWJvX2VhZGF0YXNpemU7CiAJCQlsbXYgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KHBpbGwsICZSTUZfTURUX01ELAogCQkJCQkJCSAgIGxtdnNpemUpOwogCQkJaWYgKCFsbXYpIHsKQEAgLTUwNCwxNSArNDgwLDE1IEBACiAJCQkJZ290byBvdXQ7CiAJCQl9CiAKLQkJCXJjID0gb2JkX3VucGFja21kKG1kX2V4cCwgKHZvaWQgKikmbWQtPm1lYSwgbG12LAorCQkJcmMgPSBvYmRfdW5wYWNrbWQobWRfZXhwLCAodm9pZCAqKSZtZC0+bG12LCBsbXYsCiAJCQkJCSAgbG12c2l6ZSk7CiAJCQlpZiAocmMgPCAwKQogCQkJCWdvdG8gb3V0OwogCi0JCQlpZiAocmMgPCBzaXplb2YoKm1kLT5tZWEpKSB7CisJCQlpZiAocmMgPCAodHlwZW9mKHJjKSlzaXplb2YoKm1kLT5sbXYpKSB7CiAJCQkJQ0RFQlVHKERfSU5GTywKLQkJCQkgICAgICAgInNpemUgdG9vIHNtYWxsOiByYyA8IHNpemVvZigqbWQtPm1lYSkgKCVkIDwgJWQpXG4iLAotCQkJCQlyYywgKGludClzaXplb2YoKm1kLT5tZWEpKTsKKwkJCQkgICAgICAgInNpemUgdG9vIHNtYWxsOiByYyA8IHNpemVvZigqbWQtPmxtdikgKCVkIDwgJWQpXG4iLAorCQkJCQlyYywgKGludClzaXplb2YoKm1kLT5sbXYpKTsKIAkJCQlyYyA9IC1FUFJPVE87CiAJCQkJZ290byBvdXQ7CiAJCQl9CkBAIC01MjAsMTIgKzQ5NiwxMiBAQAogCX0KIAlyYyA9IDA7CiAKLQlpZiAobWQtPmJvZHktPnZhbGlkICYgT0JEX01EX0ZMQUNMKSB7CisJaWYgKG1kLT5ib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxBQ0wpIHsKIAkJLyogZm9yIEFDTCwgaXQncyBwb3NzaWJsZSB0aGF0IEZMQUNMIGlzIHNldCBidXQgYWNsc2l6ZSBpcyB6ZXJvLgogCQkgKiBvbmx5IHdoZW4gYWNsc2l6ZSAhPSAwIHRoZXJlJ3MgYW4gYWN0dWFsIHNlZ21lbnQgZm9yIEFDTAogCQkgKiBpbiByZXBseSBidWZmZXIuCiAJCSAqLwotCQlpZiAobWQtPmJvZHktPmFjbHNpemUpIHsKKwkJaWYgKG1kLT5ib2R5LT5tYm9fYWNsc2l6ZSkgewogCQkJcmMgPSBtZGNfdW5wYWNrX2FjbChyZXEsIG1kKTsKIAkJCWlmIChyYykKIAkJCQlnb3RvIG91dDsKQEAgLTU4MCw5ICs1NTYsOSBAQAogCiAJCWZpbGVfZmggPSAmb2NoLT5vY2hfZmg7CiAJCUNERUJVRyhEX0hBLCAidXBkYXRpbmcgaGFuZGxlIGZyb20gJSNsbHggdG8gJSNsbHhcbiIsCi0JCSAgICAgICBmaWxlX2ZoLT5jb29raWUsIGJvZHktPmhhbmRsZS5jb29raWUpOworCQkgICAgICAgZmlsZV9maC0+Y29va2llLCBib2R5LT5tYm9faGFuZGxlLmNvb2tpZSk7CiAJCW9sZCA9ICpmaWxlX2ZoOwotCQkqZmlsZV9maCA9IGJvZHktPmhhbmRsZTsKKwkJKmZpbGVfZmggPSBib2R5LT5tYm9faGFuZGxlOwogCX0KIAljbG9zZV9yZXEgPSBtb2QtPm1vZF9jbG9zZV9yZXE7CiAJaWYgKGNsb3NlX3JlcSkgewpAQCAtNTk3LDcgKzU3Myw3IEBACiAJCWlmIChvY2gpCiAJCQlMQVNTRVJUKCFtZW1jbXAoJm9sZCwgJmVwb2NoLT5oYW5kbGUsIHNpemVvZihvbGQpKSk7CiAJCURFQlVHX1JFUShEX0hBLCBjbG9zZV9yZXEsICJ1cGRhdGluZyBjbG9zZSBib2R5IHdpdGggbmV3IGZoIik7Ci0JCWVwb2NoLT5oYW5kbGUgPSBib2R5LT5oYW5kbGU7CisJCWVwb2NoLT5oYW5kbGUgPSBib2R5LT5tYm9faGFuZGxlOwogCX0KIH0KIApAQCAtNjc5LDExICs2NTUsMTEgQEAKIAkJc3Bpbl91bmxvY2soJm9wZW5fcmVxLT5ycV9sb2NrKTsKIAl9CiAKLQlyZWMtPmNyX2ZpZDIgPSBib2R5LT5maWQxOwotCXJlYy0+Y3JfaW9lcG9jaCA9IGJvZHktPmlvZXBvY2g7Ci0JcmVjLT5jcl9vbGRfaGFuZGxlLmNvb2tpZSA9IGJvZHktPmhhbmRsZS5jb29raWU7CisJcmVjLT5jcl9maWQyID0gYm9keS0+bWJvX2ZpZDE7CisJcmVjLT5jcl9pb2Vwb2NoID0gYm9keS0+bWJvX2lvZXBvY2g7CisJcmVjLT5jcl9vbGRfaGFuZGxlLmNvb2tpZSA9IGJvZHktPm1ib19oYW5kbGUuY29va2llOwogCW9wZW5fcmVxLT5ycV9yZXBsYXlfY2IgPSBtZGNfcmVwbGF5X29wZW47Ci0JaWYgKCFmaWRfaXNfc2FuZSgmYm9keS0+ZmlkMSkpIHsKKwlpZiAoIWZpZF9pc19zYW5lKCZib2R5LT5tYm9fZmlkMSkpIHsKIAkJREVCVUdfUkVRKERfRVJST1IsIG9wZW5fcmVxLAogCQkJICAiU2F2aW5nIHJlcGxheSByZXF1ZXN0IHdpdGggaW5zYW5lIGZpZCIpOwogCQlMQlVHKCk7CkBAIC03MDEsOSArNjc3LDE1IEBACiAJICAgIGltcF9jb25uZWN0X2Rpc3Bfc3RyaXBlKG1vZC0+bW9kX29wZW5fcmVxLT5ycV9pbXBvcnQpKQogCQljb21taXR0ZWQgPSAxOwogCi0JTEFTU0VSVChtb2QtPm1vZF9vcGVuX3JlcS0+cnFfcmVwbGF5ID09IDApOwotCi0JREVCVUdfUkVRKERfUlBDVFJBQ0UsIG1vZC0+bW9kX29wZW5fcmVxLCAiZnJlZSBvcGVuIHJlcXVlc3RcbiIpOworCS8qCisJICogTm8gcmVhc29uIHRvIGFzc3NlcnQgaGVyZSBpZiB0aGUgb3BlbiByZXF1ZXN0IGhhcworCSAqIHJxX3JlcGxheSA9PSAxLiBJdCBtZWFucyB0aGF0IG1kY19jbG9zZSBmYWlsZWQsIGFuZAorCSAqIGNsb3NlIHJlcXVlc3Qgd2FzbmB0IHNlbnQuIEl0IGlzIG5vdCBmYXRhbCB0byBjbGllbnQuCisJICogVGhlIHdvcnN0IHRoaW5nIGlzIGV2aWN0aW9uIGlmIHRoZSBjbGllbnQgZ2V0cyBvcGVuIGxvY2sKKwkgKi8KKwlERUJVR19SRVEoRF9SUENUUkFDRSwgbW9kLT5tb2Rfb3Blbl9yZXEsCisJCSAgImZyZWUgb3BlbiByZXF1ZXN0IHJxX3JlcGxheSA9ICVkXG4iLAorCQkgICBtb2QtPm1vZF9vcGVuX3JlcS0+cnFfcmVwbGF5KTsKIAogCXB0bHJwY19yZXF1ZXN0X2NvbW1pdHRlZChtb2QtPm1vZF9vcGVuX3JlcSwgY29tbWl0dGVkKTsKIAlpZiAobW9kLT5tb2RfY2xvc2VfcmVxKQpAQCAtNzQ0LDcgKzcyNiw3IEBACiAJCWVwb2NoID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9FUE9DSCk7CiAKIAkJZXBvY2gtPmZsYWdzIHw9IE1GX1NPTV9BVTsKLQkJaWYgKHJlcGJvZHktPnZhbGlkICYgT0JEX01EX0ZMR0VUQVRUUkxPQ0spCisJCWlmIChyZXBib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxHRVRBVFRSTE9DSykKIAkJCW9wX2RhdGEtPm9wX2ZsYWdzIHw9IE1GX0dFVEFUVFJfTE9DSzsKIAl9CiB9CkBAIC03NjMsNyArNzQ1LDcgQEAKIAkJcmVxX2ZtdCA9ICZSUUZfTURTX1JFTEVBU0VfQ0xPU0U7CiAKIAkJLyogYWxsb2NhdGUgYSBGSUQgZm9yIHZvbGF0aWxlIGZpbGUgKi8KLQkJcmMgPSBtZGNfZmlkX2FsbG9jKGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDIsIG9wX2RhdGEpOworCQlyYyA9IG1kY19maWRfYWxsb2MoTlVMTCwgZXhwLCAmb3BfZGF0YS0+b3BfZmlkMiwgb3BfZGF0YSk7CiAJCWlmIChyYyA8IDApIHsKIAkJCUNFUlJPUigiJXM6ICJERklEIiBmYWlsZWQgdG8gYWxsb2NhdGUgRklEOiAlZFxuIiwKIAkJCSAgICAgICBvYmQtPm9iZF9uYW1lLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwgcmMpOwpAQCAtNzczLDIyICs3NTUsMTAgQEAKIAl9CiAKIAkqcmVxdWVzdCA9IE5VTEw7Ci0JcmVxID0gcHRscnBjX3JlcXVlc3RfYWxsb2MoY2xhc3NfZXhwMmNsaWltcChleHApLCByZXFfZm10KTsKLQlpZiAoIXJlcSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyYyA9IHB0bHJwY19yZXF1ZXN0X3BhY2socmVxLCBMVVNUUkVfTURTX1ZFUlNJT04sIE1EU19DTE9TRSk7Ci0JaWYgKHJjKSB7Ci0JCXB0bHJwY19yZXF1ZXN0X2ZyZWUocmVxKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIFRvIGF2b2lkIGEgbGl2ZWxvY2sgKGJ1ZyA3MDM0KSwgd2UgbmVlZCB0byBzZW5kIENMT1NFIFJQQ3MgdG8gYQotCSAqIHBvcnRhbCB3aG9zZSB0aHJlYWRzIGFyZSBub3QgdGFraW5nIGFueSBETE0gbG9ja3MgYW5kIGFyZSB0aGVyZWZvcmUKLQkgKiBhbHdheXMgcHJvZ3Jlc3NpbmcKLQkgKi8KLQlyZXEtPnJxX3JlcXVlc3RfcG9ydGFsID0gTURTX1JFQURQQUdFX1BPUlRBTDsKLQlwdGxycGNfYXRfc2V0X3JlcV90aW1lb3V0KHJlcSk7CisJaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX01EQ19DTE9TRSkpCisJCXJlcSA9IE5VTEw7CisJZWxzZQorCQlyZXEgPSBwdGxycGNfcmVxdWVzdF9hbGxvYyhjbGFzc19leHAyY2xpaW1wKGV4cCksIHJlcV9mbXQpOwogCiAJLyogRW5zdXJlIHRoYXQgdGhpcyBjbG9zZSdzIGhhbmRsZSBpcyBmaXhlZCB1cCBkdXJpbmcgcmVwbGF5LiAqLwogCWlmIChsaWtlbHkobW9kKSkgewpAQCAtODA5LDYgKzc3OSwyOSBAQAogCQkgQ0RFQlVHKERfSEEsCiAJCQkiY291bGRuJ3QgZmluZCBvcGVuIHJlcTsgZXhwZWN0aW5nIGNsb3NlIGVycm9yXG4iKTsKIAl9CisJaWYgKCFyZXEpIHsKKwkJLyoKKwkJICogVE9ETzogcmVwZWF0IGNsb3NlIGFmdGVyIGVycm9ycworCQkgKi8KKwkJQ1dBUk4oIiVzOiBjbG9zZSBvZiBGSUQgIkRGSUQiIGZhaWxlZCwgZmlsZSByZWZlcmVuY2Ugd2lsbCBiZSBkcm9wcGVkIHdoZW4gdGhpcyBjbGllbnQgdW5tb3VudHMgb3IgaXMgZXZpY3RlZFxuIiwKKwkJICAgICAgb2JkLT5vYmRfbmFtZSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSkpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gcHRscnBjX3JlcXVlc3RfcGFjayhyZXEsIExVU1RSRV9NRFNfVkVSU0lPTiwgTURTX0NMT1NFKTsKKwlpZiAocmMpIHsKKwkJcHRscnBjX3JlcXVlc3RfZnJlZShyZXEpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFRvIGF2b2lkIGEgbGl2ZWxvY2sgKGJ1ZyA3MDM0KSwgd2UgbmVlZCB0byBzZW5kIENMT1NFIFJQQ3MgdG8gYQorCSAqIHBvcnRhbCB3aG9zZSB0aHJlYWRzIGFyZSBub3QgdGFraW5nIGFueSBETE0gbG9ja3MgYW5kIGFyZSB0aGVyZWZvcmUKKwkgKiBhbHdheXMgcHJvZ3Jlc3NpbmcKKwkgKi8KKwlyZXEtPnJxX3JlcXVlc3RfcG9ydGFsID0gTURTX1JFQURQQUdFX1BPUlRBTDsKKwlwdGxycGNfYXRfc2V0X3JlcV90aW1lb3V0KHJlcSk7CiAKIAltZGNfY2xvc2VfcGFjayhyZXEsIG9wX2RhdGEpOwogCkBAIC04NTQsNiArODQ3LDcgQEAKIAkJfQogCX0KIAorb3V0OgogCWlmIChtb2QpIHsKIAkJaWYgKHJjICE9IDApCiAJCQltb2QtPm1vZF9jbG9zZV9yZXEgPSBOVUxMOwpAQCAtOTM2LDE2ICs5MzAsMTcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgbWRjX3JlYWRwYWdlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkJc3RydWN0IHBhZ2UgKipwYWdlcywgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKK3N0YXRpYyBpbnQgbWRjX2dldHBhZ2Uoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLAorCQkgICAgICAgdTY0IG9mZnNldCwgc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IG5wYWdlcywKKwkJICAgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpCiB7Ci0Jc3RydWN0IHB0bHJwY19yZXF1ZXN0ICAgKnJlcTsKIAlzdHJ1Y3QgcHRscnBjX2J1bGtfZGVzYyAqZGVzYzsKLQlpbnQJCSAgICAgIGk7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJICAgICAgd2FpdHE7Ci0JaW50CQkgICAgICByZXNlbmRzID0gMDsKLQlzdHJ1Y3QgbF93YWl0X2luZm8gICAgICAgbHdpOwotCWludAkJICAgICAgcmM7CisJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXE7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHE7CisJc3RydWN0IGxfd2FpdF9pbmZvIGx3aTsKKwlpbnQgcmVzZW5kcyA9IDA7CisJaW50IHJjOworCWludCBpOwogCiAJKnJlcXVlc3QgPSBOVUxMOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndhaXRxKTsKQEAgLTk2NCw3ICs5NTksNyBAQAogCXJlcS0+cnFfcmVxdWVzdF9wb3J0YWwgPSBNRFNfUkVBRFBBR0VfUE9SVEFMOwogCXB0bHJwY19hdF9zZXRfcmVxX3RpbWVvdXQocmVxKTsKIAotCWRlc2MgPSBwdGxycGNfcHJlcF9idWxrX2ltcChyZXEsIG9wX2RhdGEtPm9wX25wYWdlcywgMSwgQlVMS19QVVRfU0lOSywKKwlkZXNjID0gcHRscnBjX3ByZXBfYnVsa19pbXAocmVxLCBucGFnZXMsIDEsIEJVTEtfUFVUX1NJTkssCiAJCQkJICAgIE1EU19CVUxLX1BPUlRBTCk7CiAJaWYgKCFkZXNjKSB7CiAJCXB0bHJwY19yZXF1ZXN0X2ZyZWUocmVxKTsKQEAgLTk3MiwxMiArOTY3LDEwIEBACiAJfQogCiAJLyogTkIgcmVxIG5vdyBvd25zIGRlc2MgYW5kIHdpbGwgZnJlZSBpdCB3aGVuIGl0IGdldHMgZnJlZWQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgb3BfZGF0YS0+b3BfbnBhZ2VzOyBpKyspCisJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKQogCQlwdGxycGNfcHJlcF9idWxrX3BhZ2VfcGluKGRlc2MsIHBhZ2VzW2ldLCAwLCBQQUdFX1NJWkUpOwogCi0JbWRjX3JlYWRkaXJfcGFjayhyZXEsIG9wX2RhdGEtPm9wX29mZnNldCwKLQkJCSBQQUdFX1NJWkUgKiBvcF9kYXRhLT5vcF9ucGFnZXMsCi0JCQkgJm9wX2RhdGEtPm9wX2ZpZDEpOworCW1kY19yZWFkZGlyX3BhY2socmVxLCBvZmZzZXQsIFBBR0VfU0laRSAqIG5wYWdlcywgZmlkKTsKIAogCXB0bHJwY19yZXF1ZXN0X3NldF9yZXBsZW4ocmVxKTsKIAlyYyA9IHB0bHJwY19xdWV1ZV93YWl0KHJlcSk7CkBAIC05ODgsMTEgKzk4MSwxMiBAQAogCiAJCXJlc2VuZHMrKzsKIAkJaWYgKCFjbGllbnRfc2hvdWxkX3Jlc2VuZChyZXNlbmRzLCAmZXhwLT5leHBfb2JkLT51LmNsaSkpIHsKLQkJCUNFUlJPUigidG9vIG1hbnkgcmVzZW5kIHJldHJpZXMsIHJldHVybmluZyBlcnJvclxuIik7CisJCQlDRVJST1IoIiVzOiB0b28gbWFueSByZXNlbmQgcmV0cmllczogcmMgPSAlZFxuIiwKKwkJCSAgICAgICBleHAtPmV4cF9vYmQtPm9iZF9uYW1lLCAtRUlPKTsKIAkJCXJldHVybiAtRUlPOwogCQl9Ci0JCWx3aSA9IExXSV9USU1FT1VUX0lOVFIoY2ZzX3RpbWVfc2Vjb25kcyhyZXNlbmRzKSwKLQkJCQkgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisJCWx3aSA9IExXSV9USU1FT1VUX0lOVFIoY2ZzX3RpbWVfc2Vjb25kcyhyZXNlbmRzKSwgTlVMTCwgTlVMTCwKKwkJCQkgICAgICAgTlVMTCk7CiAJCWxfd2FpdF9ldmVudCh3YWl0cSwgMCwgJmx3aSk7CiAKIAkJZ290byByZXN0YXJ0X2J1bGs7CkBAIC0xMDA2LDkgKzEwMDAsOSBAQAogCX0KIAogCWlmIChyZXEtPnJxX2J1bGstPmJkX25vYl90cmFuc2ZlcnJlZCAmIH5MVV9QQUdFX01BU0spIHsKLQkJQ0VSUk9SKCJVbmV4cGVjdGVkICMgYnl0ZXMgdHJhbnNmZXJyZWQ6ICVkICglbGQgZXhwZWN0ZWQpXG4iLAotCQkgICAgICAgcmVxLT5ycV9idWxrLT5iZF9ub2JfdHJhbnNmZXJyZWQsCi0JCSAgICAgICBQQUdFX1NJWkUgKiBvcF9kYXRhLT5vcF9ucGFnZXMpOworCQlDRVJST1IoIiVzOiB1bmV4cGVjdGVkIGJ5dGVzIHRyYW5zZmVycmVkOiAlZCAoJWxkIGV4cGVjdGVkKVxuIiwKKwkJICAgICAgIGV4cC0+ZXhwX29iZC0+b2JkX25hbWUsIHJlcS0+cnFfYnVsay0+YmRfbm9iX3RyYW5zZmVycmVkLAorCQkgICAgICAgUEFHRV9TSVpFICogbnBhZ2VzKTsKIAkJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwogCQlyZXR1cm4gLUVQUk9UTzsKIAl9CkBAIC0xMDE3LDYgKzEwMTEsNDUzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIG1kY19yZWxlYXNlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCByZW1vdmUpCit7CisJaWYgKHJlbW92ZSkgeworCQlsb2NrX3BhZ2UocGFnZSk7CisJCWlmIChsaWtlbHkocGFnZS0+bWFwcGluZykpCisJCQl0cnVuY2F0ZV9jb21wbGV0ZV9wYWdlKHBhZ2UtPm1hcHBpbmcsIHBhZ2UpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwl9CisJcHV0X3BhZ2UocGFnZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqbWRjX3BhZ2VfbG9jYXRlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBfX3U2NCAqaGFzaCwKKwkJCQkgICAgX191NjQgKnN0YXJ0LCBfX3U2NCAqZW5kLCBpbnQgaGFzaDY0KQoreworCS8qCisJICogQ29tcGxlbWVudCBvZiBoYXNoIGlzIHVzZWQgYXMgYW4gaW5kZXggc28gdGhhdAorCSAqIHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAoKSBjYW4gYmUgdXNlZCB0byBmaW5kIGEgcGFnZSB3aXRoIHN0YXJ0aW5nCisJICogaGFzaCBfc21hbGxlcl8gdGhhbiBvbmUgd2UgYXJlIGxvb2tpbmcgZm9yLgorCSAqLworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gaGFzaF94X2luZGV4KCpoYXNoLCBoYXNoNjQpOworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBmb3VuZDsKKworCXNwaW5fbG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJZm91bmQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwKCZtYXBwaW5nLT5wYWdlX3RyZWUsCisJCQkJICAgICAgICh2b2lkICoqKSZwYWdlLCBvZmZzZXQsIDEpOworCWlmIChmb3VuZCA+IDAgJiYgIXJhZGl4X3RyZWVfZXhjZXB0aW9uYWxfZW50cnkocGFnZSkpIHsKKwkJc3RydWN0IGx1X2RpcnBhZ2UgKmRwOworCisJCWdldF9wYWdlKHBhZ2UpOworCQlzcGluX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJCS8qCisJCSAqIEluIGNvbnRyYXN0IHRvIGZpbmRfbG9ja19wYWdlKCkgd2UgYXJlIHN1cmUgdGhhdCBkaXJlY3RvcnkKKwkJICogcGFnZSBjYW5ub3QgYmUgdHJ1bmNhdGVkICh3aGlsZSBETE0gbG9jayBpcyBoZWxkKSBhbmQsCisJCSAqIGhlbmNlLCBjYW4gYXZvaWQgcmVzdGFydC4KKwkJICoKKwkJICogSW4gZmFjdCwgcGFnZSBjYW5ub3QgYmUgbG9ja2VkIGhlcmUgYXQgYWxsLCBiZWNhdXNlCisJCSAqIG1kY19yZWFkX3BhZ2VfcmVtb3RlIGRvZXMgc3luY2hyb25vdXMgaW8uCisJCSAqLworCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQlkcCA9IGttYXAocGFnZSk7CisJCQlpZiAoQklUU19QRVJfTE9ORyA9PSAzMiAmJiBoYXNoNjQpIHsKKwkJCQkqc3RhcnQgPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfc3RhcnQpID4+IDMyOworCQkJCSplbmQgICA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9lbmQpID4+IDMyOworCQkJCSpoYXNoICA9ICpoYXNoID4+IDMyOworCQkJfSBlbHNlIHsKKwkJCQkqc3RhcnQgPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfc3RhcnQpOworCQkJCSplbmQgICA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9lbmQpOworCQkJfQorCQkJaWYgKHVubGlrZWx5KCpzdGFydCA9PSAxICYmICpoYXNoID09IDApKQorCQkJCSpoYXNoID0gKnN0YXJ0OworCQkJZWxzZQorCQkJCUxBU1NFUlRGKCpzdGFydCA8PSAqaGFzaCwgInN0YXJ0ID0gJSNsbHgsZW5kID0gJSNsbHgsaGFzaCA9ICUjbGx4XG4iLAorCQkJCQkgKnN0YXJ0LCAqZW5kLCAqaGFzaCk7CisJCQlDREVCVUcoRF9WRlNUUkFDRSwgIm9mZnNldCAlbHggWyUjbGx4ICUjbGx4XSwgaGFzaCAlI2xseFxuIiwKKwkJCSAgICAgICBvZmZzZXQsICpzdGFydCwgKmVuZCwgKmhhc2gpOworCQkJaWYgKCpoYXNoID4gKmVuZCkgeworCQkJCWt1bm1hcChwYWdlKTsKKwkJCQltZGNfcmVsZWFzZV9wYWdlKHBhZ2UsIDApOworCQkJCXBhZ2UgPSBOVUxMOworCQkJfSBlbHNlIGlmICgqZW5kICE9ICpzdGFydCAmJiAqaGFzaCA9PSAqZW5kKSB7CisJCQkJLyoKKwkJCQkgKiB1cG9uIGhhc2ggY29sbGlzaW9uLCByZW1vdmUgdGhpcyBwYWdlLAorCQkJCSAqIG90aGVyd2lzZSBwdXQgcGFnZSByZWZlcmVuY2UsIGFuZAorCQkJCSAqIG1kY19yZWFkX3BhZ2VfcmVtb3RlKCkgd2lsbCBpc3N1ZSBSUEMgdG8KKwkJCQkgKiBmZXRjaCB0aGUgcGFnZSB3ZSB3YW50LgorCQkJCSAqLworCQkJCWt1bm1hcChwYWdlKTsKKwkJCQltZGNfcmVsZWFzZV9wYWdlKHBhZ2UsCisJCQkJCQkgbGUzMl90b19jcHUoZHAtPmxkcF9mbGFncykgJiBMREZfQ09MTElERSk7CisJCQkJcGFnZSA9IE5VTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwdXRfcGFnZShwYWdlKTsKKwkJCXBhZ2UgPSBFUlJfUFRSKC1FSU8pOworCQl9CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCQlwYWdlID0gTlVMTDsKKwl9CisJcmV0dXJuIHBhZ2U7Cit9CisKKy8qCisgKiBBZGp1c3QgYSBzZXQgb2YgcGFnZXMsIGVhY2ggcGFnZSBjb250YWluaW5nIGFuIGFycmF5IG9mIGx1X2RpcnBhZ2VzLAorICogc28gdGhhdCBlYWNoIHBhZ2UgY2FuIGJlIHVzZWQgYXMgYSBzaW5nbGUgbG9naWNhbCBsdV9kaXJwYWdlLgorICoKKyAqIEEgbHVfZGlycGFnZSBpcyBsYWlkIG91dCBhcyBmb2xsb3dzLCB3aGVyZSBzID0gbGRwX2hhc2hfc3RhcnQsCisgKiBlID0gbGRwX2hhc2hfZW5kLCBmID0gbGRwX2ZsYWdzLCBwID0gcGFkZGluZywgYW5kIGVhY2ggImVudCIgaXMgYQorICogc3RydWN0IGx1X2RpcmVudC4gIEl0IGhhcyBzaXplIHVwIHRvIExVX1BBR0VfU0laRS4gVGhlIGxkcF9oYXNoX2VuZAorICogdmFsdWUgaXMgdXNlZCBhcyBhIGNvb2tpZSB0byByZXF1ZXN0IHRoZSBuZXh0IGx1X2RpcnBhZ2UgaW4gYQorICogZGlyZWN0b3J5IGxpc3RpbmcgdGhhdCBzcGFucyBtdWx0aXBsZSBwYWdlcyAodHdvIGluIHRoaXMgZXhhbXBsZSk6CisgKiAgIF9fX19fX19fCisgKiAgfCAgICAgICAgfAorICogLnwtLS0tLS0tLXYtLS0tLS0tICAgLS0tLS0uCisgKiB8c3xlfGZ8cHxlbnR8ZW50fCAuLi4gfGVudHwKKyAqICctLXwtLS0tLS0tLS0tLS0tLSAgIC0tLS0tJyAgIEVhY2ggUEFHRSBjb250YWlucyBhIHNpbmdsZQorICogICAgJy0tLS0tLS4gICAgICAgICAgICAgICAgICAgbHVfZGlycGFnZS4KKyAqIC4tLS0tLS0tLS12LS0tLS0tLSAgIC0tLS0tLgorICogfHN8ZXxmfHB8ZW50fCAwIHwgLi4uIHwgMCB8CisgKiAnLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLScKKyAqCisgKiBIb3dldmVyLCBvbiBob3N0cyB3aGVyZSB0aGUgbmF0aXZlIFZNIHBhZ2Ugc2l6ZSAoUEFHRV9TSVpFKSBpcworICogbGFyZ2VyIHRoYW4gTFVfUEFHRV9TSVpFLCBhIHNpbmdsZSBob3N0IHBhZ2UgbWF5IGNvbnRhaW4gbXVsdGlwbGUKKyAqIGx1X2RpcnBhZ2VzLiBBZnRlciByZWFkaW5nIHRoZSBsdV9kaXJwYWdlcyBmcm9tIHRoZSBNRFMsIHRoZQorICogbGRwX2hhc2hfZW5kIG9mIHRoZSBmaXJzdCBsdV9kaXJwYWdlIHJlZmVycyB0byB0aGUgb25lIGltbWVkaWF0ZWx5CisgKiBhZnRlciBpdCBpbiB0aGUgc2FtZSBQQUdFIChhcnJvd3Mgc2ltcGxpZmllZCBmb3IgYnJldml0eSwgYnV0CisgKiBpbiBnZW5lcmFsIGUwPT1zMSwgZTE9PXMyLCBldGMuKToKKyAqCisgKiAuLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLS4KKyAqIHxzMHxlMHxmMHxwfGVudHxlbnR8IC4uLiB8ZW50fAorICogfC0tLXYtLS0tLS0tLS0tLS0tLS0tICAgLS0tLS18CisgKiB8czF8ZTF8ZjF8cHxlbnR8ZW50fCAuLi4gfGVudHwKKyAqIHwtLS12LS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tfCAgSGVyZSwgZWFjaCBQQUdFIGNvbnRhaW5zCisgKiAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgIG11bHRpcGxlIGx1X2RpcnBhZ2VzLgorICogfC0tLXYtLS0tLS0tLS0tLS0tLS0tICAgLS0tLS18CisgKiB8cyd8ZSd8Zid8cHxlbnR8ZW50fCAuLi4gfGVudHwKKyAqICctLS18LS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tJworICogICAgIHYKKyAqIC4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorICogfCAgICAgICAgbmV4dCBQQUdFICAgICAgICAgICB8CisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdHJhbnNmb3JtZWQgaW50byBhIHNpbmdsZSBsb2dpY2FsIGx1X2RpcnBhZ2UgYXMgZm9sbG93czoKKyAqCisgKiAtIFJlcGxhY2UgZTAgd2l0aCBlJyBzbyB0aGUgcmVxdWVzdCBmb3IgdGhlIG5leHQgbHVfZGlycGFnZSBnZXRzIHRoZSBwYWdlCisgKiAgIGxhYmVsZWQgJ25leHQgUEFHRScuCisgKgorICogLSBDb3B5IHRoZSBMREZfQ09MTElERSBmbGFnIGZyb20gZicgdG8gZjAgdG8gY29ycmVjdGx5IHJlZmxlY3Qgd2hldGhlcgorICogICBhIGhhc2ggY29sbGlzaW9uIHdpdGggdGhlIG5leHQgcGFnZSBleGlzdHMuCisgKgorICogLSBBZGp1c3QgdGhlIGxkZV9yZWNsZW4gb2YgdGhlIGVuZGluZyBlbnRyeSBvZiBlYWNoIGx1X2RpcnBhZ2UgdG8gc3BhbgorICogICB0byB0aGUgZmlyc3QgZW50cnkgb2YgdGhlIG5leHQgbHVfZGlycGFnZS4KKyAqLworI2lmIFBBR0VfU0laRSA+IExVX1BBR0VfU0laRQorc3RhdGljIHZvaWQgbWRjX2FkanVzdF9kaXJwYWdlcyhzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgY2ZzX3BncywgaW50IGx1X3BncykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjZnNfcGdzOyBpKyspIHsKKwkJc3RydWN0IGx1X2RpcnBhZ2UgKmRwID0ga21hcChwYWdlc1tpXSk7CisJCV9fdTY0IGhhc2hfZW5kID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX2VuZCk7CisJCV9fdTMyIGZsYWdzID0gbGUzMl90b19jcHUoZHAtPmxkcF9mbGFncyk7CisJCXN0cnVjdCBsdV9kaXJwYWdlICpmaXJzdCA9IGRwOworCQlzdHJ1Y3QgbHVfZGlyZW50ICplbmRfZGlyZW50ID0gTlVMTDsKKwkJc3RydWN0IGx1X2RpcmVudCAqZW50OworCisJCXdoaWxlICgtLWx1X3BncyA+IDApIHsKKwkJCWVudCA9IGx1X2RpcmVudF9zdGFydChkcCk7CisJCQlmb3IgKGVuZF9kaXJlbnQgPSBlbnQ7IGVudDsKKwkJCSAgICAgZW5kX2RpcmVudCA9IGVudCwgZW50ID0gbHVfZGlyZW50X25leHQoZW50KSk7CisKKwkJCS8qIEFkdmFuY2UgZHAgdG8gbmV4dCBsdV9kaXJwYWdlLiAqLworCQkJZHAgPSAoc3RydWN0IGx1X2RpcnBhZ2UgKikoKGNoYXIgKilkcCArIExVX1BBR0VfU0laRSk7CisKKwkJCS8qIENoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgQ0ZTX1BBR0UuICovCisJCQlpZiAoISgodW5zaWduZWQgbG9uZylkcCAmIH5QQUdFX01BU0spKQorCQkJCWJyZWFrOworCisJCQkvKiBTYXZlIHRoZSBoYXNoIGFuZCBmbGFncyBvZiB0aGlzIGx1X2RpcnBhZ2UuICovCisJCQloYXNoX2VuZCA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9lbmQpOworCQkJZmxhZ3MgPSBsZTMyX3RvX2NwdShkcC0+bGRwX2ZsYWdzKTsKKworCQkJLyogQ2hlY2sgaWYgbHVfZGlycGFnZSBjb250YWlucyBubyBlbnRyaWVzLiAqLworCQkJaWYgKCFlbmRfZGlyZW50KQorCQkJCWJyZWFrOworCisJCQkvKgorCQkJICogRW5sYXJnZSB0aGUgZW5kIGVudHJ5IGxkZV9yZWNsZW4gZnJvbSAwIHRvCisJCQkgKiBmaXJzdCBlbnRyeSBvZiBuZXh0IGx1X2RpcnBhZ2UuCisJCQkgKi8KKwkJCUxBU1NFUlQoIWxlMTZfdG9fY3B1KGVuZF9kaXJlbnQtPmxkZV9yZWNsZW4pKTsKKwkJCWVuZF9kaXJlbnQtPmxkZV9yZWNsZW4gPQorCQkJCWNwdV90b19sZTE2KChjaGFyICopKGRwLT5sZHBfZW50cmllcykgLQorCQkJCQkgICAgKGNoYXIgKillbmRfZGlyZW50KTsKKwkJfQorCisJCWZpcnN0LT5sZHBfaGFzaF9lbmQgPSBoYXNoX2VuZDsKKwkJZmlyc3QtPmxkcF9mbGFncyAmPSB+Y3B1X3RvX2xlMzIoTERGX0NPTExJREUpOworCQlmaXJzdC0+bGRwX2ZsYWdzIHw9IGZsYWdzICYgY3B1X3RvX2xlMzIoTERGX0NPTExJREUpOworCisJCWt1bm1hcChwYWdlc1tpXSk7CisJfQorCUxBU1NFUlRGKGx1X3BncyA9PSAwLCAibGVmdCA9ICVkIiwgbHVfcGdzKTsKK30KKyNlbHNlCisjZGVmaW5lIG1kY19hZGp1c3RfZGlycGFnZXMocGFnZXMsIGNmc19wZ3MsIGx1X3BncykgZG8ge30gd2hpbGUgKDApCisjZW5kaWYgIC8qIFBBR0VfU0laRSA+IExVX1BBR0VfU0laRSAqLworCisvKiBwYXJhbWV0ZXJzIGZvciByZWFkZGlyIHBhZ2UgKi8KK3N0cnVjdCByZWFkcGFnZV9wYXJhbSB7CisJc3RydWN0IG1kX29wX2RhdGEJKnJwX21vZDsKKwlfX3U2NAkJCXJwX29mZjsKKwlpbnQJCQlycF9oYXNoNjQ7CisJc3RydWN0IG9iZF9leHBvcnQJKnJwX2V4cDsKKwlzdHJ1Y3QgbWRfY2FsbGJhY2sJKnJwX2NiOworfTsKKworLyoqCisgKiBSZWFkIHBhZ2VzIGZyb20gc2VydmVyLgorICoKKyAqIFBhZ2UgaW4gTURTX1JFQURQQUdFIFJQQyBpcyBwYWNrZWQgaW4gTFVfUEFHRV9TSVpFLCBhbmQgZWFjaCBwYWdlIGNvbnRhaW5zCisgKiBhIGhlYWRlciBsdV9kaXJwYWdlIHdoaWNoIGRlc2NyaWJlcyB0aGUgc3RhcnQvZW5kIGhhc2gsIGFuZCB3aGV0aGVyIHRoaXMKKyAqIHBhZ2UgaXMgZW1wdHkgKGNvbnRhaW5zIG5vIGRpciBlbnRyeSkgb3IgaGFzaCBjb2xsaWRlIHdpdGggbmV4dCBwYWdlLgorICogQWZ0ZXIgY2xpZW50IHJlY2VpdmVzIHJlcGx5LCBzZXZlcmFsIHBhZ2VzIHdpbGwgYmUgaW50ZWdyYXRlZCBpbnRvIGRpciBwYWdlCisgKiBpbiBQQUdFX1NJWkUgKGlmIFBBR0VfU0laRSBncmVhdGVyIHRoYW4gTFVfUEFHRV9TSVpFKSwgYW5kIHRoZQorICogbHVfZGlycGFnZSBmb3IgdGhpcyBpbnRlZ3JhdGVkIHBhZ2Ugd2lsbCBiZSBhZGp1c3RlZC4KKyAqKi8KK3N0YXRpYyBpbnQgbWRjX3JlYWRfcGFnZV9yZW1vdGUodm9pZCAqZGF0YSwgc3RydWN0IHBhZ2UgKnBhZ2UwKQoreworCXN0cnVjdCByZWFkcGFnZV9wYXJhbSAqcnAgPSBkYXRhOworCXN0cnVjdCBwYWdlICoqcGFnZV9wb29sOworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBsdV9kaXJwYWdlICpkcDsKKwlpbnQgcmRfcGdzID0gMDsgLyogbnVtYmVyIG9mIHBhZ2VzIHJlYWQgYWN0dWFsbHkgKi8KKwlpbnQgbnBhZ2VzOworCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhID0gcnAtPnJwX21vZDsKKwlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcTsKKwlpbnQgbWF4X3BhZ2VzID0gb3BfZGF0YS0+b3BfbWF4X3BhZ2VzOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGx1X2ZpZCAqZmlkOworCWludCBpOworCWludCByYzsKKworCUxBU1NFUlQobWF4X3BhZ2VzID4gMCAmJiBtYXhfcGFnZXMgPD0gUFRMUlBDX01BWF9CUldfUEFHRVMpOworCWlub2RlID0gb3BfZGF0YS0+b3BfZGF0YTsKKwlmaWQgPSAmb3BfZGF0YS0+b3BfZmlkMTsKKwlMQVNTRVJUKGlub2RlKTsKKworCXBhZ2VfcG9vbCA9IGtjYWxsb2MobWF4X3BhZ2VzLCBzaXplb2YocGFnZSksIEdGUF9OT0ZTKTsKKwlpZiAocGFnZV9wb29sKSB7CisJCXBhZ2VfcG9vbFswXSA9IHBhZ2UwOworCX0gZWxzZSB7CisJCXBhZ2VfcG9vbCA9ICZwYWdlMDsKKwkJbWF4X3BhZ2VzID0gMTsKKwl9CisKKwlmb3IgKG5wYWdlcyA9IDE7IG5wYWdlcyA8IG1heF9wYWdlczsgbnBhZ2VzKyspIHsKKwkJcGFnZSA9IHBhZ2VfY2FjaGVfYWxsb2NfY29sZChpbm9kZS0+aV9tYXBwaW5nKTsKKwkJaWYgKCFwYWdlKQorCQkJYnJlYWs7CisJCXBhZ2VfcG9vbFtucGFnZXNdID0gcGFnZTsKKwl9CisKKwlyYyA9IG1kY19nZXRwYWdlKHJwLT5ycF9leHAsIGZpZCwgcnAtPnJwX29mZiwgcGFnZV9wb29sLCBucGFnZXMsICZyZXEpOworCWlmICghcmMpIHsKKwkJaW50IGx1X3BncyA9IHJlcS0+cnFfYnVsay0+YmRfbm9iX3RyYW5zZmVycmVkOworCisJCXJkX3BncyA9IChyZXEtPnJxX2J1bGstPmJkX25vYl90cmFuc2ZlcnJlZCArCisJCQkgIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJCWx1X3BncyA+Pj0gTFVfUEFHRV9TSElGVDsKKwkJTEFTU0VSVCghKHJlcS0+cnFfYnVsay0+YmRfbm9iX3RyYW5zZmVycmVkICYgfkxVX1BBR0VfTUFTSykpOworCisJCUNERUJVRyhEX0lOT0RFLCAicmVhZCAlZCglZCkgcGFnZXNcbiIsIHJkX3BncywgbHVfcGdzKTsKKworCQltZGNfYWRqdXN0X2RpcnBhZ2VzKHBhZ2VfcG9vbCwgcmRfcGdzLCBsdV9wZ3MpOworCisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlMCk7CisJfQorCisJdW5sb2NrX3BhZ2UocGFnZTApOworCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKKwlDREVCVUcoRF9DQUNIRSwgInJlYWQgJWQvJWQgcGFnZXNcbiIsIHJkX3BncywgbnBhZ2VzKTsKKwlmb3IgKGkgPSAxOyBpIDwgbnBhZ2VzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJCV9fdTY0IGhhc2g7CisJCWludCByZXQ7CisKKwkJcGFnZSA9IHBhZ2VfcG9vbFtpXTsKKworCQlpZiAocmMgPCAwIHx8IGkgPj0gcmRfcGdzKSB7CisJCQlwdXRfcGFnZShwYWdlKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCisJCWRwID0ga21hcChwYWdlKTsKKwkJaGFzaCA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9zdGFydCk7CisJCWt1bm1hcChwYWdlKTsKKworCQlvZmZzZXQgPSBoYXNoX3hfaW5kZXgoaGFzaCwgcnAtPnJwX2hhc2g2NCk7CisKKwkJcHJlZmV0Y2h3KCZwYWdlLT5mbGFncyk7CisJCXJldCA9IGFkZF90b19wYWdlX2NhY2hlX2xydShwYWdlLCBpbm9kZS0+aV9tYXBwaW5nLCBvZmZzZXQsCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFyZXQpCisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJZWxzZQorCQkJQ0RFQlVHKERfVkZTVFJBQ0UsICJwYWdlICVsdSBhZGQgdG8gcGFnZSBjYWNoZSBmYWlsZWQ6IHJjID0gJWRcbiIsCisJCQkgICAgICAgb2Zmc2V0LCByZXQpOworCQlwdXRfcGFnZShwYWdlKTsKKwl9CisKKwlpZiAocGFnZV9wb29sICE9ICZwYWdlMCkKKwkJa2ZyZWUocGFnZV9wb29sKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBSZWFkIGRpciBwYWdlIGZyb20gY2FjaGUgZmlyc3QsIGlmIGl0IGNhbiBub3QgZmluZCBpdCwgcmVhZCBpdCBmcm9tCisgKiBzZXJ2ZXIgYW5kIGFkZCBpbnRvIHRoZSBjYWNoZS4KKyAqCisgKiBccGFyYW1baW5dIGV4cAlNREMgZXhwb3J0CisgKiBccGFyYW1baW5dIG9wX2RhdGEJY2xpZW50IE1EIHN0YWNrIHBhcmFtZXRlcnMsIHRyYW5zZmVycmluZyBwYXJhbWV0ZXJzCisgKgkJCWJldHdlZW4gZGlmZmVyZW50IGxheWVycyBvbiBjbGllbnQgTUQgc3RhY2suCisgKiBccGFyYW1baW5dIGNiX29wCWNhbGxiYWNrIHJlcXVpcmVkIGZvciBsZGxtIGxvY2sgZW5xdWV1ZSBkdXJpbmcKKyAqCQkJcmVhZCBwYWdlCisgKiBccGFyYW1baW5dIGhhc2hfb2Zmc2V0IHRoZSBoYXNoIG9mZnNldCBvZiB0aGUgcGFnZSB0byBiZSByZWFkCisgKiBccGFyYW1baW5dIHBwYWdlCXRoZSBwYWdlIHRvIGJlIHJlYWQKKyAqCisgKiByZXR2YWwJCT0gMCBnZXQgdGhlIHBhZ2Ugc3VjY2Vzc2Z1bGx5CisgKgkJCWVycm5vKDwwKSBnZXQgdGhlIHBhZ2UgZmFpbGVkCisgKi8KK3N0YXRpYyBpbnQgbWRjX3JlYWRfcGFnZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKKwkJCSBzdHJ1Y3QgbWRfY2FsbGJhY2sgKmNiX29wLCBfX3U2NCBoYXNoX29mZnNldCwKKwkJCSBzdHJ1Y3QgcGFnZSAqKnBwYWdlKQoreworCXN0cnVjdCBsb29rdXBfaW50ZW50IGl0ID0geyAuaXRfb3AgPSBJVF9SRUFERElSIH07CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IGlub2RlICpkaXIgPSBvcF9kYXRhLT5vcF9kYXRhOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXN0cnVjdCBsdV9kaXJwYWdlICpkcDsKKwlfX3U2NCBzdGFydCA9IDA7CisJX191NjQgZW5kID0gMDsKKwlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSBsb2NraDsKKwlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKmVucV9yZXEgPSBOVUxMOworCXN0cnVjdCByZWFkcGFnZV9wYXJhbSBycF9wYXJhbTsKKwlpbnQgcmM7CisKKwkqcHBhZ2UgPSBOVUxMOworCisJTEFTU0VSVChkaXIpOworCW1hcHBpbmcgPSBkaXItPmlfbWFwcGluZzsKKworCXJjID0gbWRjX2ludGVudF9sb2NrKGV4cCwgb3BfZGF0YSwgJml0LCAmZW5xX3JlcSwKKwkJCSAgICAgY2Jfb3AtPm1kX2Jsb2NraW5nX2FzdCwgMCk7CisJaWYgKGVucV9yZXEpCisJCXB0bHJwY19yZXFfZmluaXNoZWQoZW5xX3JlcSk7CisKKwlpZiAocmMgPCAwKSB7CisJCUNFUlJPUigiJXM6ICJERklEIiBsb2NrIGVucXVldWUgZmFpbHM6IHJjID0gJWRcbiIsCisJCSAgICAgICBleHAtPmV4cF9vYmQtPm9iZF9uYW1lLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSAwOworCWxvY2toLmNvb2tpZSA9IGl0Lml0X2xvY2tfaGFuZGxlOworCW1kY19zZXRfbG9ja19kYXRhKGV4cCwgJmxvY2toLCBkaXIsIE5VTEwpOworCisJcnBfcGFyYW0ucnBfb2ZmID0gaGFzaF9vZmZzZXQ7CisJcnBfcGFyYW0ucnBfaGFzaDY0ID0gb3BfZGF0YS0+b3BfY2xpX2ZsYWdzICYgQ0xJX0hBU0g2NDsKKwlwYWdlID0gbWRjX3BhZ2VfbG9jYXRlKG1hcHBpbmcsICZycF9wYXJhbS5ycF9vZmYsICZzdGFydCwgJmVuZCwKKwkJCSAgICAgICBycF9wYXJhbS5ycF9oYXNoNjQpOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJQ0RFQlVHKERfSU5GTywgIiVzOiBkaXIgcGFnZSBsb2NhdGU6ICIgREZJRCAiIGF0ICVsbHU6IHJjICVsZFxuIiwKKwkJICAgICAgIGV4cC0+ZXhwX29iZC0+b2JkX25hbWUsIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpLAorCQkgICAgICAgcnBfcGFyYW0ucnBfb2ZmLCBQVFJfRVJSKHBhZ2UpKTsKKwkJcmMgPSBQVFJfRVJSKHBhZ2UpOworCQlnb3RvIG91dF91bmxvY2s7CisJfSBlbHNlIGlmIChwYWdlKSB7CisJCS8qCisJCSAqIFhYWCBuaWtpdGE6IG5vdCBlbnRpcmVseSBjb3JyZWN0IGhhbmRsaW5nIG9mIGEgY29ybmVyIGNhc2U6CisJCSAqIHN1cHBvc2UgaGFzaCBjaGFpbiBvZiBlbnRyaWVzIHdpdGggaGFzaCB2YWx1ZSBIQVNIIGNyb3NzZXMKKwkJICogYm9yZGVyIGJldHdlZW4gcGFnZXMgUDAgYW5kIFAxLiBGaXJzdCBib3RoIFAwIGFuZCBQMSBhcmUKKwkJICogY2FjaGVkLCBzZWVrZGlyKCkgaXMgY2FsbGVkIGZvciBzb21lIGVudHJ5IGZyb20gdGhlIFAwIHBhcnQKKwkJICogb2YgdGhlIGNoYWluLiBMYXRlciBQMCBnb2VzIG91dCBvZiBjYWNoZS4gdGVsbGRpcihIQVNIKQorCQkgKiBoYXBwZW5zIGFuZCBmaW5kcyBQMSwgYXMgaXQgc3RhcnRzIHdpdGggbWF0Y2hpbmcgaGFzaAorCQkgKiB2YWx1ZS4gUmVtYWluaW5nIGVudHJpZXMgZnJvbSBQMCBwYXJ0IG9mIHRoZSBjaGFpbiBhcmUKKwkJICogc2tpcHBlZC4gKElzIHRoYXQgcmVhbGx5IGEgYnVnPykKKwkJICoKKwkJICogUG9zc2libGUgc29sdXRpb25zOiAwLiBkb24ndCBjYWNoZSBQMSBpcyBzdWNoIGNhc2UsIGhhbmRsZQorCQkgKiBpdCBhcyBhbiAib3ZlcmZsb3ciIHBhZ2UuIDEuIGludmFsaWRhdGUgYWxsIHBhZ2VzIGF0CisJCSAqIG9uY2UuIDIuIHVzZSBIQVNIfDEgYXMgYW4gaW5kZXggZm9yIFAxLgorCQkgKi8KKwkJZ290byBoYXNoX2NvbGxpc2lvbjsKKwl9CisKKwlycF9wYXJhbS5ycF9leHAgPSBleHA7CisJcnBfcGFyYW0ucnBfbW9kID0gb3BfZGF0YTsKKwlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsCisJCQkgICAgICAgaGFzaF94X2luZGV4KHJwX3BhcmFtLnJwX29mZiwKKwkJCQkJICAgIHJwX3BhcmFtLnJwX2hhc2g2NCksCisJCQkgICAgICAgbWRjX3JlYWRfcGFnZV9yZW1vdGUsICZycF9wYXJhbSk7CisJaWYgKElTX0VSUihwYWdlKSkgeworCQlDRVJST1IoIiVzOiByZWFkIGNhY2hlIHBhZ2U6ICJERklEIiBhdCAlbGx1OiByYyAlbGRcbiIsCisJCSAgICAgICBleHAtPmV4cF9vYmQtPm9iZF9uYW1lLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwKKwkJICAgICAgIHJwX3BhcmFtLnJwX29mZiwgUFRSX0VSUihwYWdlKSk7CisJCXJjID0gUFRSX0VSUihwYWdlKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7CisJKHZvaWQpa21hcChwYWdlKTsKKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQlDRVJST1IoIiVzOiBwYWdlIG5vdCB1cGRhdGVkOiAiREZJRCIgYXQgJWxsdTogcmMgJWRcbiIsCisJCSAgICAgICBleHAtPmV4cF9vYmQtPm9iZF9uYW1lLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwKKwkJICAgICAgIHJwX3BhcmFtLnJwX29mZiwgLTUpOworCQlnb3RvIGZhaWw7CisJfQorCWlmICghUGFnZUNoZWNrZWQocGFnZSkpCisJCVNldFBhZ2VDaGVja2VkKHBhZ2UpOworCWlmIChQYWdlRXJyb3IocGFnZSkpIHsKKwkJQ0VSUk9SKCIlczogcGFnZSBlcnJvcjogIkRGSUQiIGF0ICVsbHU6IHJjICVkXG4iLAorCQkgICAgICAgZXhwLT5leHBfb2JkLT5vYmRfbmFtZSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksCisJCSAgICAgICBycF9wYXJhbS5ycF9vZmYsIC01KTsKKwkJZ290byBmYWlsOworCX0KKworaGFzaF9jb2xsaXNpb246CisJZHAgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJaWYgKEJJVFNfUEVSX0xPTkcgPT0gMzIgJiYgcnBfcGFyYW0ucnBfaGFzaDY0KSB7CisJCXN0YXJ0ID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX3N0YXJ0KSA+PiAzMjsKKwkJZW5kID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX2VuZCkgPj4gMzI7CisJCXJwX3BhcmFtLnJwX29mZiA9IGhhc2hfb2Zmc2V0ID4+IDMyOworCX0gZWxzZSB7CisJCXN0YXJ0ID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX3N0YXJ0KTsKKwkJZW5kID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX2VuZCk7CisJCXJwX3BhcmFtLnJwX29mZiA9IGhhc2hfb2Zmc2V0OworCX0KKwlpZiAoZW5kID09IHN0YXJ0KSB7CisJCUxBU1NFUlQoc3RhcnQgPT0gcnBfcGFyYW0ucnBfb2ZmKTsKKwkJQ1dBUk4oIlBhZ2Utd2lkZSBoYXNoIGNvbGxpc2lvbjogJSNseFxuIiwgKHVuc2lnbmVkIGxvbmcpZW5kKTsKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJCUNXQVJOKCJSZWFsIHBhZ2Utd2lkZSBoYXNoIGNvbGxpc2lvbiBhdCBbJWxsdSAlbGx1XSB3aXRoIGhhc2ggJWxsdVxuIiwKKwkJICAgICAgbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX3N0YXJ0KSwKKwkJICAgICAgbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX2VuZCksIGhhc2hfb2Zmc2V0KTsKKyNlbmRpZgorCQkvKgorCQkgKiBGZXRjaCB3aG9sZSBvdmVyZmxvdyBjaGFpbi4uLgorCQkgKgorCQkgKiBYWFggbm90IHlldC4KKwkJICovCisJCWdvdG8gZmFpbDsKKwl9CisJKnBwYWdlID0gcGFnZTsKK291dF91bmxvY2s6CisJbGRsbV9sb2NrX2RlY3JlZigmbG9ja2gsIGl0Lml0X2xvY2tfbW9kZSk7CisJcmV0dXJuIHJjOworZmFpbDoKKwlrdW5tYXAocGFnZSk7CisJbWRjX3JlbGVhc2VfcGFnZShwYWdlLCAxKTsKKwlyYyA9IC1FSU87CisJZ290byBvdXRfdW5sb2NrOworfQorCiBzdGF0aWMgaW50IG1kY19zdGF0ZnMoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAogCQkgICAgICBzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3Qgb2JkX3N0YXRmcyAqb3NmcywKIAkJICAgICAgX191NjQgbWF4X2FnZSwgX191MzIgZmxhZ3MpCkBAIC0xNDAxLDcgKzE4NDIsNyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHN0cnVjdCBrdWNfaGRyICpjaGFuZ2Vsb2dfa3VjX2hkcihjaGFyICpidWYsIGludCBsZW4sIGludCBmbGFncykKK3N0YXRpYyBzdHJ1Y3Qga3VjX2hkciAqY2hhbmdlbG9nX2t1Y19oZHIoY2hhciAqYnVmLCBzaXplX3QgbGVuLCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IGt1Y19oZHIgKmxoID0gKHN0cnVjdCBrdWNfaGRyICopYnVmOwogCkBAIC0xNDE1LDQwICsxODU2LDQ0IEBACiAJcmV0dXJuIGxoOwogfQogCi0jZGVmaW5lIERfQ0hBTkdFTE9HIDAKLQogc3RydWN0IGNoYW5nZWxvZ19zaG93IHsKIAlfX3U2NAkJY3Nfc3RhcnRyZWM7Ci0JX191MzIJCWNzX2ZsYWdzOworCWVudW0gY2hhbmdlbG9nX3NlbmRfZmxhZwljc19mbGFnczsKIAlzdHJ1Y3QgZmlsZQkqY3NfZnA7CiAJY2hhcgkJKmNzX2J1ZjsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqY3Nfb2JkOwogfTsKIAorc3RhdGljIGlubGluZSBjaGFyICpjc19vYmRfbmFtZShzdHJ1Y3QgY2hhbmdlbG9nX3Nob3cgKmNzKQoreworCXJldHVybiBjcy0+Y3Nfb2JkLT5vYmRfbmFtZTsKK30KKwogc3RhdGljIGludCBjaGFuZ2Vsb2dfa2t1Y19jYihjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBsbG9nX2hhbmRsZSAqbGxoLAogCQkJICAgICBzdHJ1Y3QgbGxvZ19yZWNfaGRyICpoZHIsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGNoYW5nZWxvZ19zaG93ICpjcyA9IGRhdGE7CiAJc3RydWN0IGxsb2dfY2hhbmdlbG9nX3JlYyAqcmVjID0gKHN0cnVjdCBsbG9nX2NoYW5nZWxvZ19yZWMgKiloZHI7CiAJc3RydWN0IGt1Y19oZHIgKmxoOwotCWludCBsZW4sIHJjOworCXNpemVfdCBsZW47CisJaW50IHJjOwogCiAJaWYgKHJlYy0+Y3JfaGRyLmxyaF90eXBlICE9IENIQU5HRUxPR19SRUMpIHsKIAkJcmMgPSAtRUlOVkFMOwogCQlDRVJST1IoIiVzOiBub3QgYSBjaGFuZ2Vsb2cgcmVjICV4LyVkOiByYyA9ICVkXG4iLAotCQkgICAgICAgY3MtPmNzX29iZC0+b2JkX25hbWUsIHJlYy0+Y3JfaGRyLmxyaF90eXBlLAorCQkgICAgICAgY3Nfb2JkX25hbWUoY3MpLCByZWMtPmNyX2hkci5scmhfdHlwZSwKIAkJICAgICAgIHJlYy0+Y3IuY3JfdHlwZSwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCiAJaWYgKHJlYy0+Y3IuY3JfaW5kZXggPCBjcy0+Y3Nfc3RhcnRyZWMpIHsKIAkJLyogU2tpcCBlbnRyaWVzIGVhcmxpZXIgdGhhbiB3aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluICovCi0JCUNERUJVRyhEX0NIQU5HRUxPRywgInJlYz0lbGx1IHN0YXJ0PSVsbHVcbiIsCisJCUNERUJVRyhEX0hTTSwgInJlYz0lbGx1IHN0YXJ0PSVsbHVcbiIsCiAJCSAgICAgICByZWMtPmNyLmNyX2luZGV4LCBjcy0+Y3Nfc3RhcnRyZWMpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlDREVCVUcoRF9DSEFOR0VMT0csICIlbGx1ICUwMmQlLTVzICVsbHUgMHgleCB0PSJERklEIiBwPSJERklECisJQ0RFQlVHKERfSFNNLCAiJWxsdSAlMDJkJS01cyAlbGx1IDB4JXggdD0iIERGSUQgIiBwPSIgREZJRAogCQkiICUuKnNcbiIsIHJlYy0+Y3IuY3JfaW5kZXgsIHJlYy0+Y3IuY3JfdHlwZSwKIAkJY2hhbmdlbG9nX3R5cGUyc3RyKHJlYy0+Y3IuY3JfdHlwZSksIHJlYy0+Y3IuY3JfdGltZSwKIAkJcmVjLT5jci5jcl9mbGFncyAmIENMRl9GTEFHTUFTSywKQEAgLTE0NjIsMjAgKzE5MDcsMjEgQEAKIAltZW1jcHkobGggKyAxLCAmcmVjLT5jciwgbGVuIC0gc2l6ZW9mKCpsaCkpOwogCiAJcmMgPSBsaWJjZnNfa2t1Y19tc2dfcHV0KGNzLT5jc19mcCwgbGgpOwotCUNERUJVRyhEX0NIQU5HRUxPRywgImt1Y21zZyBmcCAlcCBsZW4gJWQgcmMgJWRcbiIsIGNzLT5jc19mcCwgbGVuLCByYyk7CisJQ0RFQlVHKERfSFNNLCAia3VjbXNnIGZwICVwIGxlbiAlenUgcmMgJWRcbiIsIGNzLT5jc19mcCwgbGVuLCByYyk7CiAKIAlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgbWRjX2NoYW5nZWxvZ19zZW5kX3RocmVhZCh2b2lkICpjc2RhdGEpCiB7CisJZW51bSBsbG9nX2ZsYWcgZmxhZ3MgPSBMTE9HX0ZfSVNfQ0FUOwogCXN0cnVjdCBjaGFuZ2Vsb2dfc2hvdyAqY3MgPSBjc2RhdGE7CiAJc3RydWN0IGxsb2dfY3R4dCAqY3R4dCA9IE5VTEw7CiAJc3RydWN0IGxsb2dfaGFuZGxlICpsbGggPSBOVUxMOwogCXN0cnVjdCBrdWNfaGRyICprdWNoOwogCWludCByYzsKIAotCUNERUJVRyhEX0NIQU5HRUxPRywgImNoYW5nZWxvZyB0byBmcD0lcCBzdGFydCAlbGx1XG4iLAorCUNERUJVRyhEX0hTTSwgImNoYW5nZWxvZyB0byBmcD0lcCBzdGFydCAlbGx1XG4iLAogCSAgICAgICBjcy0+Y3NfZnAsIGNzLT5jc19zdGFydHJlYyk7CiAKIAljcy0+Y3NfYnVmID0ga3phbGxvYyhLVUNfQ0hBTkdFTE9HX01TR19NQVhTSVpFLCBHRlBfTk9GUyk7CkBAIC0xNDk0LDEwICsxOTQwLDE0IEBACiAJCSAgICAgICBMTE9HX09QRU5fRVhJU1RTKTsKIAlpZiAocmMpIHsKIAkJQ0VSUk9SKCIlczogZmFpbCB0byBvcGVuIGNoYW5nZWxvZyBjYXRhbG9nOiByYyA9ICVkXG4iLAotCQkgICAgICAgY3MtPmNzX29iZC0+b2JkX25hbWUsIHJjKTsKKwkJICAgICAgIGNzX29iZF9uYW1lKGNzKSwgcmMpOwogCQlnb3RvIG91dDsKIAl9Ci0JcmMgPSBsbG9nX2luaXRfaGFuZGxlKE5VTEwsIGxsaCwgTExPR19GX0lTX0NBVCwgTlVMTCk7CisKKwlpZiAoY3MtPmNzX2ZsYWdzICYgQ0hBTkdFTE9HX0ZMQUdfSk9CSUQpCisJCWZsYWdzIHw9IExMT0dfRl9FWFRfSk9CSUQ7CisKKwlyYyA9IGxsb2dfaW5pdF9oYW5kbGUoTlVMTCwgbGxoLCBmbGFncywgTlVMTCk7CiAJaWYgKHJjKSB7CiAJCUNFUlJPUigibGxvZ19pbml0X2hhbmRsZSBmYWlsZWQgJWRcbiIsIHJjKTsKIAkJZ290byBvdXQ7CkBAIC0xNTUwLDEyICsyMDAwLDEyIEBACiAJaWYgKElTX0VSUih0YXNrKSkgewogCQlyYyA9IFBUUl9FUlIodGFzayk7CiAJCUNFUlJPUigiJXM6IGNhbid0IHN0YXJ0IGNoYW5nZWxvZyB0aHJlYWQ6IHJjID0gJWRcbiIsCi0JCSAgICAgICBvYmQtPm9iZF9uYW1lLCByYyk7CisJCSAgICAgICBjc19vYmRfbmFtZShjcyksIHJjKTsKIAkJa2ZyZWUoY3MpOwogCX0gZWxzZSB7CiAJCXJjID0gMDsKLQkJQ0RFQlVHKERfQ0hBTkdFTE9HLCAiJXM6IHN0YXJ0ZWQgY2hhbmdlbG9nIHRocmVhZFxuIiwKLQkJICAgICAgIG9iZC0+b2JkX25hbWUpOworCQlDREVCVUcoRF9IU00sICIlczogc3RhcnRlZCBjaGFuZ2Vsb2cgdGhyZWFkXG4iLAorCQkgICAgICAgY3Nfb2JkX25hbWUoY3MpKTsKIAl9CiAKIAlDRVJST1IoIkZhaWxlZCB0byBzdGFydCBjaGFuZ2Vsb2cgdGhyZWFkOiAlZFxuIiwgcmMpOwpAQCAtMTY2OSw5ICsyMTE5LDExIEBACiAJICogd2l0aCB0aGUgcmVxdWVzdCBSUEMgdG8gYXZvaWQgZXh0cmEgUlBDIHJvdW5kIHRyaXBzCiAJICovCiAJY291bnQgPSBtZGNfcmVzb3VyY2VfZ2V0X3VudXNlZChleHAsICZvcF9kYXRhLT5vcF9maWQxLCAmY2FuY2VscywKLQkJCQkJTENLX0NSLCBNRFNfSU5PREVMT0NLX0xBWU9VVCk7CisJCQkJCUxDS19DUiwgTURTX0lOT0RFTE9DS19MQVlPVVQgfAorCQkJCQlNRFNfSU5PREVMT0NLX1hBVFRSKTsKIAljb3VudCArPSBtZGNfcmVzb3VyY2VfZ2V0X3VudXNlZChleHAsICZvcF9kYXRhLT5vcF9maWQyLCAmY2FuY2VscywKLQkJCQkJIExDS19DUiwgTURTX0lOT0RFTE9DS19MQVlPVVQpOworCQkJCQkgTENLX0NSLCBNRFNfSU5PREVMT0NLX0xBWU9VVCB8CisJCQkJCSBNRFNfSU5PREVMT0NLX1hBVFRSKTsKIAogCXJlcSA9IHB0bHJwY19yZXF1ZXN0X2FsbG9jKGNsYXNzX2V4cDJjbGlpbXAoZXhwKSwKIAkJCQkgICAmUlFGX01EU19TV0FQX0xBWU9VVFMpOwpAQCAtMTkxNyw3ICsyMzY5LDcgQEAKIHN0YXRpYyB2b2lkIGx1c3RyZV9zd2FiX2hhbChzdHJ1Y3QgaHNtX2FjdGlvbl9saXN0ICpoKQogewogCXN0cnVjdCBoc21fYWN0aW9uX2l0ZW0JKmhhaTsKLQlpbnQJCQkgaTsKKwl1MzIgaTsKIAogCV9fc3dhYjMycygmaC0+aGFsX3ZlcnNpb24pOwogCV9fc3dhYjMycygmaC0+aGFsX2NvdW50KTsKQEAgLTE5NjYsMTQgKzI0MTgsMTQgQEAKICAqIEBwYXJhbSB2YWwgS1VDIG1lc3NhZ2UgKGt1Y19oZHIgKyBoc21fYWN0aW9uX2xpc3QpCiAgKiBAcGFyYW0gbGVuIHRvdGFsIGxlbmd0aCBvZiBtZXNzYWdlCiAgKi8KLXN0YXRpYyBpbnQgbWRjX2hzbV9jb3B5dG9vbF9zZW5kKGludCBsZW4sIHZvaWQgKnZhbCkKK3N0YXRpYyBpbnQgbWRjX2hzbV9jb3B5dG9vbF9zZW5kKHNpemVfdCBsZW4sIHZvaWQgKnZhbCkKIHsKIAlzdHJ1Y3Qga3VjX2hkcgkJKmxoID0gKHN0cnVjdCBrdWNfaGRyICopdmFsOwogCXN0cnVjdCBoc21fYWN0aW9uX2xpc3QJKmhhbCA9IChzdHJ1Y3QgaHNtX2FjdGlvbl9saXN0ICopKGxoICsgMSk7CiAKIAlpZiAobGVuIDwgc2l6ZW9mKCpsaCkgKyBzaXplb2YoKmhhbCkpIHsKLQkJQ0VSUk9SKCJTaG9ydCBIU00gbWVzc2FnZSAlZCA8ICVkXG4iLCBsZW4sCi0JCSAgICAgICAoaW50KShzaXplb2YoKmxoKSArIHNpemVvZigqaGFsKSkpOworCQlDRVJST1IoIlNob3J0IEhTTSBtZXNzYWdlICV6dSA8ICV6dVxuIiwgbGVuLAorCQkgICAgICAgc2l6ZW9mKCpsaCkgKyBzaXplb2YoKmhhbCkpOwogCQlyZXR1cm4gLUVQUk9UTzsKIAl9CiAJaWYgKGxoLT5rdWNfbWFnaWMgPT0gX19zd2FiMTYoS1VDX01BR0lDKSkgewpAQCAtMjA0NCw5ICsyNDk2LDggQEAKIAkJfQogCQlzcGluX3VubG9jaygmaW1wLT5pbXBfbG9jayk7CiAKLQkJcmMgPSBkb19zZXRfaW5mb19hc3luYyhpbXAsIE1EU19TRVRfSU5GTywgTFVTVFJFX01EU19WRVJTSU9OLAotCQkJCSAgICAgICBrZXlsZW4sIGtleSwgdmFsbGVuLCB2YWwsIHNldCk7Ci0JCXJldHVybiByYzsKKwkJcmV0dXJuIGRvX3NldF9pbmZvX2FzeW5jKGltcCwgTURTX1NFVF9JTkZPLCBMVVNUUkVfTURTX1ZFUlNJT04sCisJCQkJCSBrZXlsZW4sIGtleSwgdmFsbGVuLCB2YWwsIHNldCk7CiAJfQogCWlmIChLRVlfSVMoS0VZX1NQVExSUENfQ09ORikpIHsKIAkJc3B0bHJwY19jb25mX2NsaWVudF9hZGFwdChleHAtPmV4cF9vYmQpOwpAQCAtMjA2NSw2ICsyNTE2LDEyIEBACiAJCXJjID0gbWRjX2hzbV9jb3B5dG9vbF9zZW5kKHZhbGxlbiwgdmFsKTsKIAkJcmV0dXJuIHJjOwogCX0KKwlpZiAoS0VZX0lTKEtFWV9ERUZBVUxUX0VBU0laRSkpIHsKKwkJdTMyICpkZWZhdWx0X2Vhc2l6ZSA9IHZhbDsKKworCQlleHAtPmV4cF9vYmQtPnUuY2xpLmNsX2RlZmF1bHRfbWRzX2Vhc2l6ZSA9ICpkZWZhdWx0X2Vhc2l6ZTsKKwkJcmV0dXJuIDA7CisJfQogCiAJQ0VSUk9SKCJVbmtub3duIGtleSAlc1xuIiwgKGNoYXIgKilrZXkpOwogCXJldHVybiAtRUlOVkFMOwpAQCAtMjA3NywxOCArMjUzNCwxOCBAQAogCWludCByYyA9IC1FSU5WQUw7CiAKIAlpZiAoS0VZX0lTKEtFWV9NQVhfRUFTSVpFKSkgewotCQlpbnQgbWRzaXplLCAqbWF4X2Vhc2l6ZTsKKwkJdTMyIG1kc2l6ZSwgKm1heF9lYXNpemU7CiAKIAkJaWYgKCp2YWxsZW4gIT0gc2l6ZW9mKGludCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJbWRzaXplID0gKihpbnQgKil2YWw7CisJCW1kc2l6ZSA9ICoodTMyICopdmFsOwogCQlpZiAobWRzaXplID4gZXhwLT5leHBfb2JkLT51LmNsaS5jbF9tYXhfbWRzX2Vhc2l6ZSkKIAkJCWV4cC0+ZXhwX29iZC0+dS5jbGkuY2xfbWF4X21kc19lYXNpemUgPSBtZHNpemU7CiAJCW1heF9lYXNpemUgPSB2YWw7CiAJCSptYXhfZWFzaXplID0gZXhwLT5leHBfb2JkLT51LmNsaS5jbF9tYXhfbWRzX2Vhc2l6ZTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIGlmIChLRVlfSVMoS0VZX0RFRkFVTFRfRUFTSVpFKSkgewotCQlpbnQgKmRlZmF1bHRfZWFzaXplOworCQl1MzIgKmRlZmF1bHRfZWFzaXplOwogCiAJCWlmICgqdmFsbGVuICE9IHNpemVvZihpbnQpKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMTA1LDcgKzI1NjIsNyBAQAogCQkqZGF0YSA9IGltcC0+aW1wX2Nvbm5lY3RfZGF0YTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIGlmIChLRVlfSVMoS0VZX1RHVF9DT1VOVCkpIHsKLQkJKigoaW50ICopdmFsKSA9IDE7CisJCSooKHUzMiAqKXZhbCkgPSAxOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTIxOTksMTMgKzI2NTYsMTMgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBtZGNfZmlkX2FsbG9jKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsdV9maWQgKmZpZCwKLQkJICBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSkKK2ludCBtZGNfZmlkX2FsbG9jKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJICBzdHJ1Y3QgbHVfZmlkICpmaWQsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKQogewogCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSAmZXhwLT5leHBfb2JkLT51LmNsaTsKIAlzdHJ1Y3QgbHVfY2xpZW50X3NlcSAqc2VxID0gY2xpLT5jbF9zZXE7CiAKLQlyZXR1cm4gc2VxX2NsaWVudF9hbGxvY19maWQoTlVMTCwgc2VxLCBmaWQpOworCXJldHVybiBzZXFfY2xpZW50X2FsbG9jX2ZpZChlbnYsIHNlcSwgZmlkKTsKIH0KIAogc3RhdGljIHN0cnVjdCBvYmRfdXVpZCAqbWRjX2dldF91dWlkKHN0cnVjdCBvYmRfZXhwb3J0ICpleHApCkBAIC0yMzMzLDggKzI3OTAsOCBAQAogICogYSBsYXJnZSBudW1iZXIgb2Ygc3RyaXBlcyBpcyBwb3NzaWJsZS4gIElmIGEgbGFyZ2VyIHJlcGx5IGJ1ZmZlciBpcwogICogcmVxdWlyZWQgaXQgd2lsbCBiZSByZWFsbG9jYXRlZCBpbiB0aGUgcHRscnBjIGxheWVyIGR1ZSB0byBvdmVyZmxvdy4KICAqLwotc3RhdGljIGludCBtZGNfaW5pdF9lYV9zaXplKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIGludCBlYXNpemUsCi0JCQkgICAgaW50IGRlZl9lYXNpemUsIGludCBjb29raWVzaXplLCBpbnQgZGVmX2Nvb2tpZXNpemUpCitzdGF0aWMgaW50IG1kY19pbml0X2VhX3NpemUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgdTMyIGVhc2l6ZSwgdTMyIGRlZl9lYXNpemUsCisJCQkgICAgdTMyIGNvb2tpZXNpemUsIHUzMiBkZWZfY29va2llc2l6ZSkKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gZXhwLT5leHBfb2JkOwogCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSAmb2JkLT51LmNsaTsKQEAgLTI0MzAsNyArMjg4Nyw2IEBACiBzdGF0aWMgc3RydWN0IG1kX29wcyBtZGNfbWRfb3BzID0gewogCS5nZXRzdGF0dXMJCT0gbWRjX2dldHN0YXR1cywKIAkubnVsbF9pbm9kZQkJPSBtZGNfbnVsbF9pbm9kZSwKLQkuZmluZF9jYmRhdGEJCT0gbWRjX2ZpbmRfY2JkYXRhLAogCS5jbG9zZQkJCT0gbWRjX2Nsb3NlLAogCS5jcmVhdGUJCQk9IG1kY19jcmVhdGUsCiAJLmRvbmVfd3JpdGluZwkJPSBtZGNfZG9uZV93cml0aW5nLApAQCAtMjQzOSwxMyArMjg5NSwxMiBAQAogCS5nZXRhdHRyX25hbWUJCT0gbWRjX2dldGF0dHJfbmFtZSwKIAkuaW50ZW50X2xvY2sJCT0gbWRjX2ludGVudF9sb2NrLAogCS5saW5rCQkJPSBtZGNfbGluaywKLQkuaXNfc3ViZGlyCQk9IG1kY19pc19zdWJkaXIsCiAJLnJlbmFtZQkJCT0gbWRjX3JlbmFtZSwKIAkuc2V0YXR0cgkJPSBtZGNfc2V0YXR0ciwKIAkuc2V0eGF0dHIJCT0gbWRjX3NldHhhdHRyLAogCS5nZXR4YXR0cgkJPSBtZGNfZ2V0eGF0dHIsCiAJLnN5bmMJCQk9IG1kY19zeW5jLAotCS5yZWFkcGFnZQkJPSBtZGNfcmVhZHBhZ2UsCisJLnJlYWRfcGFnZQkJPSBtZGNfcmVhZF9wYWdlLAogCS51bmxpbmsJCQk9IG1kY191bmxpbmssCiAJLmNhbmNlbF91bnVzZWQJCT0gbWRjX2NhbmNlbF91bnVzZWQsCiAJLmluaXRfZWFfc2l6ZQkJPSBtZGNfaW5pdF9lYV9zaXplLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWdjL21nY19yZXF1ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZ2MvbWdjX3JlcXVlc3QuYwppbmRleCA5ZDBiZDQ3Li4yMzM3NGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZ2MvbWdjX3JlcXVlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZ2MvbWdjX3JlcXVlc3QuYwpAQCAtNTQ5LDggKzU0OSw5IEBACiAJCSAqIGNhdXNlZCB0aGUgbG9jayByZXZvY2F0aW9uIHRvIGZpbmlzaCBpdHMgc2V0dXAsIHBsdXMgc29tZQogCQkgKiByYW5kb20gc28gZXZlcnlvbmUgZG9lc24ndCB0cnkgdG8gcmVjb25uZWN0IGF0IG9uY2UuCiAJCSAqLwotCQl0byA9IE1HQ19USU1FT1VUX01JTl9TRUNPTkRTICogSFo7Ci0JCXRvICs9IHJhbmQgKiBIWiAvIDEwMDsgLyogcmFuZCBpcyBjZW50aS1zZWNvbmRzICovCisJCXRvID0gbXNlY3NfdG9famlmZmllcyhNR0NfVElNRU9VVF9NSU5fU0VDT05EUyAqIE1TRUNfUEVSX1NFQyk7CisJCS8qIHJhbmQgaXMgY2VudGktc2Vjb25kcyAqLworCQl0byArPSBtc2Vjc190b19qaWZmaWVzKHJhbmQgKiBNU0VDX1BFUl9TRUMgLyAxMDApOwogCQlsd2kgPSBMV0lfVElNRU9VVCh0bywgTlVMTCwgTlVMTCk7CiAJCWxfd2FpdF9ldmVudChycV93YWl0cSwgcnFfc3RhdGUgJiAoUlFfU1RPUCB8IFJRX1BSRUNMRUFOVVApLAogCQkJICAgICAmbHdpKTsKQEAgLTExNTgsNyArMTE1OSw3IEBACiAKIAl3aGlsZSAoZGF0YWxlbiA+IDApIHsKIAkJaW50ICAgZW50cnlfbGVuID0gc2l6ZW9mKCplbnRyeSk7Ci0JCWludCAgIGlzX29zdDsKKwkJaW50IGlzX29zdCwgaTsKIAkJc3RydWN0IG9iZF9kZXZpY2UgKm9iZDsKIAkJY2hhciAqb2JkbmFtZTsKIAkJY2hhciAqY25hbWU7CkBAIC0xMjY0LDExICsxMjY1LDE3IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCS8qIFRPRE86IGl0ZXJhdGUgYWxsIG5pZHMgdG8gZmluZCBvbmUgKi8KKwkJLyogaXRlcmF0ZSBhbGwgbmlkcyB0byBmaW5kIG9uZSAqLwogCQkvKiBmaW5kIHV1aWQgYnkgbmlkICovCi0JCXJjID0gY2xpZW50X2ltcG9ydF9maW5kX2Nvbm4ob2JkLT51LmNsaS5jbF9pbXBvcnQsCi0JCQkJCSAgICAgZW50cnktPnUubmlkc1swXSwKLQkJCQkJICAgICAoc3RydWN0IG9iZF91dWlkICopdXVpZCk7CisJCXJjID0gLUVOT0VOVDsKKwkJZm9yIChpID0gMDsgaSA8IGVudHJ5LT5tbmVfbmlkX2NvdW50OyBpKyspIHsKKwkJCXJjID0gY2xpZW50X2ltcG9ydF9maW5kX2Nvbm4ob2JkLT51LmNsaS5jbF9pbXBvcnQsCisJCQkJCQkgICAgIGVudHJ5LT51Lm5pZHNbMF0sCisJCQkJCQkgICAgIChzdHJ1Y3Qgb2JkX3V1aWQgKil1dWlkKTsKKwkJCWlmICghcmMpCisJCQkJYnJlYWs7CisJCX0KKwogCQl1cF9yZWFkKCZvYmQtPnUuY2xpLmNsX3NlbSk7CiAJCWlmIChyYyA8IDApIHsKIAkJCUNFUlJPUigibWdjOiBjYW5ub3QgZmluZCB1dWlkIGJ5IG5pZCAlc1xuIiwKQEAgLTE0MjgsMTQgKzE0MzUsMTIgQEAKIAl9CiAKIAltbmVfc3dhYiA9ICEhcHRscnBjX3JlcF9uZWVkX3N3YWIocmVxKTsKLSNpZiBMVVNUUkVfVkVSU0lPTl9DT0RFIDwgT0JEX09DRF9WRVJTSU9OKDMsIDIsIDUwLCAwKQorI2lmIE9CRF9PQ0RfVkVSU0lPTigzLCAwLCA1MywgMCkgPiBMVVNUUkVfVkVSU0lPTl9DT0RFCiAJLyogVGhpcyBpbXBvcnQgZmxhZyBtZWFucyB0aGUgc2VydmVyIGRpZCBhbiBleHRyYSBzd2FiIG9mIElSIE1ORQogCSAqIHJlY29yZHMgKGZpeGVkIGluIExVLTEyNTIpLCByZXZlcnNlIGl0IGhlcmUgaWYgbmVlZGVkLiBMVS0xNjQ0CiAJICovCiAJaWYgKHVubGlrZWx5KHJlcS0+cnFfaW1wb3J0LT5pbXBfbmVlZF9tbmVfc3dhYikpCiAJCW1uZV9zd2FiID0gIW1uZV9zd2FiOwotI2Vsc2UKLSN3YXJuaW5nICJMVS0xNjQ0OiBSZW1vdmUgb2xkIE9CRF9DT05ORUNUX01ORV9TV0FCIGZpeHVwIGFuZCBpbXBfbmVlZF9tbmVfc3dhYiIKICNlbmRpZgogCiAJZm9yIChpID0gMDsgaSA8IG5ycGFnZXMgJiYgZWFsZW4gPiAwOyBpKyspIHsKQEAgLTE3NDAsOCArMTc0NSw2IEBACiAJLmRlbF9jb25uICAgICAgID0gY2xpZW50X2ltcG9ydF9kZWxfY29ubiwKIAkuY29ubmVjdCAgICAgICAgPSBjbGllbnRfY29ubmVjdF9pbXBvcnQsCiAJLmRpc2Nvbm5lY3QgICAgID0gY2xpZW50X2Rpc2Nvbm5lY3RfZXhwb3J0LAotCS8qIC5lbnF1ZXVlICAgICA9IG1nY19lbnF1ZXVlLCAqLwotCS8qIC5pb2NvbnRyb2wgICA9IG1nY19pb2NvbnRyb2wsICovCiAJLnNldF9pbmZvX2FzeW5jID0gbWdjX3NldF9pbmZvX2FzeW5jLAogCS5nZXRfaW5mbyAgICAgICA9IG1nY19nZXRfaW5mbywKIAkuaW1wb3J0X2V2ZW50ICAgPSBtZ2NfaW1wb3J0X2V2ZW50LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9NYWtlZmlsZQppbmRleCBkZjdlNDdmLi5iNDJlMTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9NYWtlZmlsZQpAQCAtMyw2ICszLDYgQEAKIG9iZGNsYXNzLXkgOj0gbGludXgvbGludXgtbW9kdWxlLm8gbGludXgvbGludXgtb2Jkby5vIGxpbnV4L2xpbnV4LXN5c2N0bC5vIFwKIAkgICAgICBsbG9nLm8gbGxvZ19jYXQubyBsbG9nX29iZC5vIGxsb2dfc3dhYi5vIGNsYXNzX29iZC5vIGRlYnVnLm8gXAogCSAgICAgIGdlbm9wcy5vIHV1aWQubyBscHJvY2ZzX3N0YXR1cy5vIGxwcm9jZnNfY291bnRlcnMubyBcCi0JICAgICAgbHVzdHJlX2hhbmRsZXMubyBsdXN0cmVfcGVlci5vIHN0YXRmc19wYWNrLm8gXAorCSAgICAgIGx1c3RyZV9oYW5kbGVzLm8gbHVzdHJlX3BlZXIubyBzdGF0ZnNfcGFjay5vIGxpbmtlYS5vIFwKIAkgICAgICBvYmRvLm8gb2JkX2NvbmZpZy5vIG9iZF9tb3VudC5vIGx1X29iamVjdC5vIGx1X3JlZi5vIFwKIAkgICAgICBjbF9vYmplY3QubyBjbF9wYWdlLm8gY2xfbG9jay5vIGNsX2lvLm8ga2VybmVsY29tbS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9pby5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfaW8uYwppbmRleCBlNzJmMWZjLi5iYzRiN2I2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX2lvLmMKQEAgLTczLDcgKzczLDYgQEAKIHsKIAlyZXR1cm4gY2xfZW52X2luZm8oZW52KS0+Y2x0X2N1cnJlbnRfaW8gIT0gTlVMTDsKIH0KLUVYUE9SVF9TWU1CT0woY2xfaW9faXNfZ29pbmcpOwogCiAvKioKICAqIGNsX2lvIGludmFyaWFudCB0aGF0IGhvbGRzIGF0IGFsbCB0aW1lcyB3aGVuIGV4cG9ydGVkIGNsX2lvXyooKSBmdW5jdGlvbnMKQEAgLTg1OSw5ICs4NTgsNiBAQAogCUxBU1NFUlQocGFnZS0+Y3Bfb3duZXIpOwogCUxJTlZSTlQocGxpc3QtPnBsX293bmVyID09IGN1cnJlbnQpOwogCi0JbG9ja2RlcF9vZmYoKTsKLQltdXRleF9sb2NrKCZwYWdlLT5jcF9tdXRleCk7Ci0JbG9ja2RlcF9vbigpOwogCUxBU1NFUlQobGlzdF9lbXB0eSgmcGFnZS0+Y3BfYmF0Y2gpKTsKIAlsaXN0X2FkZF90YWlsKCZwYWdlLT5jcF9iYXRjaCwgJnBsaXN0LT5wbF9wYWdlcyk7CiAJKytwbGlzdC0+cGxfbnI7CkBAIC04NzcsMTIgKzg3MywxMCBAQAogCQkgICAgICBzdHJ1Y3QgY2xfcGFnZSAqcGFnZSkKIHsKIAlMQVNTRVJUKHBsaXN0LT5wbF9uciA+IDApOworCUxBU1NFUlQoY2xfcGFnZV9pc192bWxvY2tlZChlbnYsIHBhZ2UpKTsKIAlMSU5WUk5UKHBsaXN0LT5wbF9vd25lciA9PSBjdXJyZW50KTsKIAogCWxpc3RfZGVsX2luaXQoJnBhZ2UtPmNwX2JhdGNoKTsKLQlsb2NrZGVwX29mZigpOwotCW11dGV4X3VubG9jaygmcGFnZS0+Y3BfbXV0ZXgpOwotCWxvY2tkZXBfb24oKTsKIAktLXBsaXN0LT5wbF9ucjsKIAlsdV9yZWZfZGVsX2F0KCZwYWdlLT5jcF9yZWZlcmVuY2UsICZwYWdlLT5jcF9xdWV1ZV9yZWYsICJxdWV1ZSIsIHBsaXN0KTsKIAljbF9wYWdlX3B1dChlbnYsIHBhZ2UpOwpAQCAtOTQxLDggKzkzNSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNsX3BhZ2VfbGlzdF9zcGxpY2UpOwogCi12b2lkIGNsX3BhZ2VfZGlzb3duMChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCi0JCSAgICAgc3RydWN0IGNsX2lvICppbywgc3RydWN0IGNsX3BhZ2UgKnBnKTsKIAogLyoqCiAgKiBEaXNvd25zIHBhZ2VzIGluIGEgcXVldWUuCkBAIC05NTksOSArOTUxLDYgQEAKIAkJTEFTU0VSVChwbGlzdC0+cGxfbnIgPiAwKTsKIAogCQlsaXN0X2RlbF9pbml0KCZwYWdlLT5jcF9iYXRjaCk7Ci0JCWxvY2tkZXBfb2ZmKCk7Ci0JCW11dGV4X3VubG9jaygmcGFnZS0+Y3BfbXV0ZXgpOwotCQlsb2NrZGVwX29uKCk7CiAJCS0tcGxpc3QtPnBsX25yOwogCQkvKgogCQkgKiBjbF9wYWdlX2Rpc293bjAgcmF0aGVyIHRoYW4gdXN1YWwgY2xfcGFnZV9kaXNvd24oKSBpcyB1c2VkLApAQCAtMTIyMSw3ICsxMjEwLDcgQEAKIHsKIAlzdHJ1Y3QgY2xfb2JqZWN0ICAqb2JqOwogCXN0cnVjdCBjbF9yZXFfb2JqICpycW87Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IGk7CiAKIAlMQVNTRVJUKGxpc3RfZW1wdHkoJnBhZ2UtPmNwX2ZsaWdodCkpOwogCUxBU1NFUlQoIXBhZ2UtPmNwX3JlcSk7CkBAIC0xMjY4LDcgKzEyNTcsNyBAQAogICovCiBpbnQgY2xfcmVxX3ByZXAoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfcmVxICpyZXEpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IGk7CiAJaW50IHJlc3VsdDsKIAljb25zdCBzdHJ1Y3QgY2xfcmVxX3NsaWNlICpzbGljZTsKIApAQCAtMTMwMSw3ICsxMjkwLDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgY2xfcmVxX3NsaWNlICpzbGljZTsKIAlzdHJ1Y3QgY2xfcGFnZQkgICAgKnBhZ2U7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IGk7CiAKIAlMQVNTRVJUKCFsaXN0X2VtcHR5KCZyZXEtPmNycV9wYWdlcykpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9vYmplY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX29iamVjdC5jCmluZGV4IDkxYTU4MDYuLjMxOTlkZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX29iamVjdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX29iamVjdC5jCkBAIC0xNjMsNyArMTYzLDcgQEAKICAqCiAgKiBQcmV2ZW50cyBkYXRhLWF0dHJpYnV0ZXMgZnJvbSBjaGFuZ2luZywgdW50aWwgbG9jayBpcyByZWxlYXNlZCBieQogICogY2xfb2JqZWN0X2F0dHJfdW5sb2NrKCkuIFRoaXMgaGFzIHRvIGJlIGNhbGxlZCBiZWZvcmUgY2FsbHMgdG8KLSAqIGNsX29iamVjdF9hdHRyX2dldCgpLCBjbF9vYmplY3RfYXR0cl9zZXQoKS4KKyAqIGNsX29iamVjdF9hdHRyX2dldCgpLCBjbF9vYmplY3RfYXR0cl91cGRhdGUoKS4KICAqLwogdm9pZCBjbF9vYmplY3RfYXR0cl9sb2NrKHN0cnVjdCBjbF9vYmplY3QgKm8pCiAJX19hY3F1aXJlcyhjbF9vYmplY3RfYXR0cl9ndWFyZChvKSkKQEAgLTIxNywxMSArMjE3LDExIEBACiAgKiBVcGRhdGVzIGRhdGEtYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgXGEgb2JqLgogICoKICAqIE9ubHkgYXR0cmlidXRlcywgbWVudGlvbmVkIGluIGEgdmFsaWRuZXNzIGJpdC1tYXNrIFxhIHYgYXJlCi0gKiB1cGRhdGVkLiBDYWxscyBjbF9vYmplY3Rfb3BlcmF0aW9uczo6Y29vX2F0dHJfc2V0KCkgb24gZXZlcnkgbGF5ZXIsIGJvdHRvbQotICogdG8gdG9wLgorICogdXBkYXRlZC4gQ2FsbHMgY2xfb2JqZWN0X29wZXJhdGlvbnM6OmNvb19hdHRyX3VwZGF0ZSgpIG9uIGV2ZXJ5IGxheWVyLAorICogYm90dG9tIHRvIHRvcC4KICAqLwotaW50IGNsX29iamVjdF9hdHRyX3NldChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKLQkJICAgICAgIGNvbnN0IHN0cnVjdCBjbF9hdHRyICphdHRyLCB1bnNpZ25lZCB2KQoraW50IGNsX29iamVjdF9hdHRyX3VwZGF0ZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKKwkJCSAgY29uc3Qgc3RydWN0IGNsX2F0dHIgKmF0dHIsIHVuc2lnbmVkIGludCB2KQogewogCXN0cnVjdCBsdV9vYmplY3RfaGVhZGVyICp0b3A7CiAJaW50IHJlc3VsdDsKQEAgLTIzMSw4ICsyMzEsOSBAQAogCXRvcCA9IG9iai0+Y29fbHUubG9faGVhZGVyOwogCXJlc3VsdCA9IDA7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKG9iaiwgJnRvcC0+bG9oX2xheWVycywgY29fbHUubG9fbGlua2FnZSkgewotCQlpZiAob2JqLT5jb19vcHMtPmNvb19hdHRyX3NldCkgewotCQkJcmVzdWx0ID0gb2JqLT5jb19vcHMtPmNvb19hdHRyX3NldChlbnYsIG9iaiwgYXR0ciwgdik7CisJCWlmIChvYmotPmNvX29wcy0+Y29vX2F0dHJfdXBkYXRlKSB7CisJCQlyZXN1bHQgPSBvYmotPmNvX29wcy0+Y29vX2F0dHJfdXBkYXRlKGVudiwgb2JqLCBhdHRyLAorCQkJCQkJCSAgICAgIHYpOwogCQkJaWYgKHJlc3VsdCAhPSAwKSB7CiAJCQkJaWYgKHJlc3VsdCA+IDApCiAJCQkJCXJlc3VsdCA9IDA7CkBAIC0yNDIsNyArMjQzLDcgQEAKIAl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KLUVYUE9SVF9TWU1CT0woY2xfb2JqZWN0X2F0dHJfc2V0KTsKK0VYUE9SVF9TWU1CT0woY2xfb2JqZWN0X2F0dHJfdXBkYXRlKTsKIAogLyoqCiAgKiBOb3RpZmllcyBsYXllcnMgKGJvdHRvbS10by10b3ApIHRoYXQgZ2xpbXBzZSBBU1Qgd2FzIHJlY2VpdmVkLgpAQCAtMzIxLDYgKzMyMiwyNyBAQAogRVhQT1JUX1NZTUJPTChjbF9vYmplY3RfcHJ1bmUpOwogCiAvKioKKyAqIEdldCBzdHJpcGUgaW5mb3JtYXRpb24gb2YgdGhpcyBvYmplY3QuCisgKi8KK2ludCBjbF9vYmplY3RfZ2V0c3RyaXBlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAorCQkJc3RydWN0IGxvdl91c2VyX21kIF9fdXNlciAqdWFyZykKK3sKKwlzdHJ1Y3QgbHVfb2JqZWN0X2hlYWRlciAqdG9wOworCWludCByZXN1bHQgPSAwOworCisJdG9wID0gb2JqLT5jb19sdS5sb19oZWFkZXI7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosICZ0b3AtPmxvaF9sYXllcnMsIGNvX2x1LmxvX2xpbmthZ2UpIHsKKwkJaWYgKG9iai0+Y29fb3BzLT5jb29fZ2V0c3RyaXBlKSB7CisJCQlyZXN1bHQgPSBvYmotPmNvX29wcy0+Y29vX2dldHN0cmlwZShlbnYsIG9iaiwgdWFyZyk7CisJCQlpZiAocmVzdWx0KQorCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0woY2xfb2JqZWN0X2dldHN0cmlwZSk7CisKKy8qKgogICogSGVscGVyIGZ1bmN0aW9uIHJlbW92aW5nIGFsbCBvYmplY3QgbG9ja3MsIGFuZCBtYXJraW5nIG9iamVjdCBmb3IKICAqIGRlbGV0aW9uLiBBbGwgb2JqZWN0IHBhZ2VzIG11c3QgaGF2ZSBiZWVuIGRlbGV0ZWQgYXQgdGhpcyBwb2ludC4KICAqCkBAIC0zNzcsNyArMzk5LDcgQEAKICAqLwogaW50IGNsX3NpdGVfaW5pdChzdHJ1Y3QgY2xfc2l0ZSAqcywgc3RydWN0IGNsX2RldmljZSAqZCkKIHsKLQlpbnQgaTsKKwlzaXplX3QgaTsKIAlpbnQgcmVzdWx0OwogCiAJcmVzdWx0ID0gbHVfc2l0ZV9pbml0KCZzLT5jc19sdSwgJmQtPmNkX2x1X2Rldik7CkBAIC00MTEsNyArNDMzLDcgQEAKICAqLwogaW50IGNsX3NpdGVfc3RhdHNfcHJpbnQoY29uc3Qgc3RydWN0IGNsX3NpdGUgKnNpdGUsIHN0cnVjdCBzZXFfZmlsZSAqbSkKIHsKLQlpbnQgaTsKKwlzaXplX3QgaTsKIAlzdGF0aWMgY29uc3QgY2hhciAqcHN0YXRlW10gPSB7CiAJCVtDUFNfQ0FDSEVEXSAgPSAiYyIsCiAJCVtDUFNfT1dORURdICAgPSAibyIsCkBAIC0xMDAwLDcgKzEwMjIsNyBAQAogCQkgKiB0aHVzIHdlIG11c3QgdW5pbml0aWFsaXplIHVwIHRvIGksIHRoZSByZXN0IGFyZSB1bmRlZmluZWQuCiAJCSAqLwogCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7Ci0JCQljbGUgPSAmY2xfZW52X3BlcmNwdVtpXTsKKwkJCWNsZSA9ICZjbF9lbnZfcGVyY3B1W2pdOwogCQkJbHVfY29udGV4dF9leGl0KCZjbGUtPmNlX3Nlcyk7CiAJCQlsdV9jb250ZXh0X2ZpbmkoJmNsZS0+Y2Vfc2VzKTsKIAkJCWx1X2Vudl9maW5pKCZjbGUtPmNlX2x1KTsKQEAgLTExMjYsNyArMTE0OCw3IEBACiAKIAlpbmZvID0gY2wwX2tleV9pbml0KGN0eCwga2V5KTsKIAlpZiAoIUlTX0VSUihpbmZvKSkgewotCQlpbnQgaTsKKwkJc2l6ZV90IGk7CiAKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5mby0+Y2x0X2NvdW50ZXJzKTsgKytpKQogCQkJbHVfcmVmX2luaXQoJmluZm8tPmNsdF9jb3VudGVyc1tpXS5jdGNfbG9ja3NfbG9ja2VkKTsKQEAgLTExMzgsNyArMTE2MCw3IEBACiAJCQlzdHJ1Y3QgbHVfY29udGV4dF9rZXkgKmtleSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgY2xfdGhyZWFkX2luZm8gKmluZm87Ci0JaW50IGk7CisJc2l6ZV90IGk7CiAKIAlpbmZvID0gZGF0YTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbmZvLT5jbHRfY291bnRlcnMpOyArK2kpCkBAIC0xMTUwLDcgKzExNzIsNyBAQAogCQkJc3RydWN0IGx1X2NvbnRleHRfa2V5ICprZXksIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGNsX3RocmVhZF9pbmZvICppbmZvID0gZGF0YTsKLQlpbnQgaTsKKwlzaXplX3QgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGluZm8tPmNsdF9jb3VudGVycyk7ICsraSkgewogCQlMQVNTRVJUKGluZm8tPmNsdF9jb3VudGVyc1tpXS5jdGNfbnJfaGVsZCA9PSAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX3BhZ2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX3BhZ2UuYwppbmRleCBkYjJkYzZiLi42Mzk3M2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9wYWdlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfcGFnZS5jCkBAIC0xNTEsNyArMTUxLDYgQEAKIAkJSU5JVF9MSVNUX0hFQUQoJnBhZ2UtPmNwX2xheWVycyk7CiAJCUlOSVRfTElTVF9IRUFEKCZwYWdlLT5jcF9iYXRjaCk7CiAJCUlOSVRfTElTVF9IRUFEKCZwYWdlLT5jcF9mbGlnaHQpOwotCQltdXRleF9pbml0KCZwYWdlLT5jcF9tdXRleCk7CiAJCWx1X3JlZl9pbml0KCZwYWdlLT5jcF9yZWZlcmVuY2UpOwogCQloZWFkID0gby0+Y29fbHUubG9faGVhZGVyOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG8sICZoZWFkLT5sb2hfbGF5ZXJzLCBjb19sdS5sb19saW5rYWdlKSB7CkBAIC0xNzEsNyArMTcwLDYgQEAKIAl9CiAJcmV0dXJuIHBhZ2U7CiB9Ci1FWFBPUlRfU1lNQk9MKGNsX3BhZ2VfYWxsb2MpOwogCiAvKioKICAqIFJldHVybnMgYSBjbF9wYWdlIHdpdGggaW5kZXggXGEgaWR4IGF0IHRoZSBvYmplY3QgXGEgbywgYW5kIGFzc29jaWF0ZWQgd2l0aApAQCAtMjI5LDExICsyMjcsNiBAQAogCiBzdGF0aWMgaW5saW5lIGludCBjbF9wYWdlX2ludmFyaWFudChjb25zdCBzdHJ1Y3QgY2xfcGFnZSAqcGcpCiB7Ci0JLyoKLQkgKiBQYWdlIGludmFyaWFudCBpcyBwcm90ZWN0ZWQgYnkgYSBWTSBsb2NrLgotCSAqLwotCUxJTlZSTlQoY2xfcGFnZV9pc192bWxvY2tlZChOVUxMLCBwZykpOwotCiAJcmV0dXJuIGNsX3BhZ2VfaW5fdXNlX25vcmVmKHBnKTsKIH0KIApAQCAtNDc4LDcgKzQ3MSw2IEBACiAJCUxBU1NFUlQocGFnZS0+Y3Bfb3duZXItPmNpX293bmVkX25yID4gMCk7CiAJCXBhZ2UtPmNwX293bmVyLT5jaV9vd25lZF9uci0tOwogCQlwYWdlLT5jcF9vd25lciA9IE5VTEw7Ci0JCXBhZ2UtPmNwX3Rhc2sgPSBOVUxMOwogCX0KIH0KIApAQCAtNTYyLDcgKzU1NCw2IEBACiAJCQlQQVNTRVJUKGVudiwgcGcsICFwZy0+Y3Bfb3duZXIpOwogCQkJUEFTU0VSVChlbnYsIHBnLCAhcGctPmNwX3JlcSk7CiAJCQlwZy0+Y3Bfb3duZXIgPSBjbF9pb190b3AoaW8pOwotCQkJcGctPmNwX3Rhc2sgID0gY3VycmVudDsKIAkJCWNsX3BhZ2Vfb3duZXJfc2V0KHBnKTsKIAkJCWlmIChwZy0+Y3Bfc3RhdGUgIT0gQ1BTX0ZSRUVJTkcpIHsKIAkJCQljbF9wYWdlX3N0YXRlX3NldChlbnYsIHBnLCBDUFNfT1dORUQpOwpAQCAtNjE5LDcgKzYxMCw2IEBACiAJY2xfcGFnZV9pbnZvaWQoZW52LCBpbywgcGcsIENMX1BBR0VfT1AoY3BvX2Fzc3VtZSkpOwogCVBBU1NFUlQoZW52LCBwZywgIXBnLT5jcF9vd25lcik7CiAJcGctPmNwX293bmVyID0gY2xfaW9fdG9wKGlvKTsKLQlwZy0+Y3BfdGFzayA9IGN1cnJlbnQ7CiAJY2xfcGFnZV9vd25lcl9zZXQocGcpOwogCWNsX3BhZ2Vfc3RhdGVfc2V0KGVudiwgcGcsIENQU19PV05FRCk7CiB9CkBAIC04NjAsMTAgKzg1MCw2IEBACiAJUEFTU0VSVChlbnYsIHBnLCBwZy0+Y3Bfc3RhdGUgPT0gY2xfcmVxX3R5cGVfc3RhdGUoY3J0KSk7CiAKIAlDTF9QQUdFX0hFQURFUihEX1RSQUNFLCBlbnYsIHBnLCAiJWQgJWRcbiIsIGNydCwgaW9yZXQpOwotCWlmIChjcnQgPT0gQ1JUX1JFQUQgJiYgaW9yZXQgPT0gMCkgewotCQlQQVNTRVJUKGVudiwgcGcsICEocGctPmNwX2ZsYWdzICYgQ1BGX1JFQURfQ09NUExFVEVEKSk7Ci0JCXBnLT5jcF9mbGFncyB8PSBDUEZfUkVBRF9DT01QTEVURUQ7Ci0JfQogCiAJY2xfcGFnZV9zdGF0ZV9zZXQoZW52LCBwZywgQ1BTX0NBQ0hFRCk7CiAJaWYgKGNydCA+PSBDUlRfTlIpCkBAIC04NzIsNyArODU4LDYgQEAKIAkJCSAgICAgICAoY29uc3Qgc3RydWN0IGx1X2VudiAqLAogCQkJCWNvbnN0IHN0cnVjdCBjbF9wYWdlX3NsaWNlICosIGludCksIGlvcmV0KTsKIAlpZiAoYW5jaG9yKSB7Ci0JCUxBU1NFUlQoY2xfcGFnZV9pc192bWxvY2tlZChlbnYsIHBnKSk7CiAJCUxBU1NFUlQocGctPmNwX3N5bmNfaW8gPT0gYW5jaG9yKTsKIAkJcGctPmNwX3N5bmNfaW8gPSBOVUxMOwogCX0KQEAgLTk4OSwxMCArOTc0LDEwIEBACiAJCQkgIGx1X3ByaW50ZXJfdCBwcmludGVyLCBjb25zdCBzdHJ1Y3QgY2xfcGFnZSAqcGcpCiB7CiAJKCpwcmludGVyKShlbnYsIGNvb2tpZSwKLQkJICAgInBhZ2VAJXBbJWQgJXAgJWQgJWQgJWQgJXAgJXAgJSN4XVxuIiwKKwkJICAgInBhZ2VAJXBbJWQgJXAgJWQgJWQgJXAgJXBdXG4iLAogCQkgICBwZywgYXRvbWljX3JlYWQoJnBnLT5jcF9yZWYpLCBwZy0+Y3Bfb2JqLAotCQkgICBwZy0+Y3Bfc3RhdGUsIHBnLT5jcF9lcnJvciwgcGctPmNwX3R5cGUsCi0JCSAgIHBnLT5jcF9vd25lciwgcGctPmNwX3JlcSwgcGctPmNwX2ZsYWdzKTsKKwkJICAgcGctPmNwX3N0YXRlLCBwZy0+Y3BfdHlwZSwKKwkJICAgcGctPmNwX293bmVyLCBwZy0+Y3BfcmVxKTsKIH0KIEVYUE9SVF9TWU1CT0woY2xfcGFnZV9oZWFkZXJfcHJpbnQpOwogCkBAIC0xMDIwLDcgKzEwMDUsNiBAQAogCQkJICAgICAgKGNvbnN0IHN0cnVjdCBsdV9lbnYgKiwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY2xfcGFnZV9zbGljZSAqKSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGNsX3BhZ2VfY2FuY2VsKTsKIAogLyoqCiAgKiBDb252ZXJ0cyBhIGJ5dGUgb2Zmc2V0IHdpdGhpbiBvYmplY3QgXGEgb2JqIGludG8gYSBwYWdlIGluZGV4LgpAQCAtMTA0Niw5ICsxMDMwLDkgQEAKIH0KIEVYUE9SVF9TWU1CT0woY2xfaW5kZXgpOwogCi1pbnQgY2xfcGFnZV9zaXplKGNvbnN0IHN0cnVjdCBjbF9vYmplY3QgKm9iaikKK3NpemVfdCBjbF9wYWdlX3NpemUoY29uc3Qgc3RydWN0IGNsX29iamVjdCAqb2JqKQogewotCXJldHVybiAxIDw8IFBBR0VfU0hJRlQ7CisJcmV0dXJuIDFVTCA8PCBQQUdFX1NISUZUOwogfQogRVhQT1JUX1NZTUJPTChjbF9wYWdlX3NpemUpOwogCkBAIC0xMDg3LDExICsxMDcxLDExIEBACiAJLyogSW5pdGlhbGl6ZSBjYWNoZSBkYXRhICovCiAJYXRvbWljX3NldCgmY2FjaGUtPmNjY191c2VycywgMSk7CiAJY2FjaGUtPmNjY19scnVfbWF4ID0gbHJ1X3BhZ2VfbWF4OwotCWF0b21pY19zZXQoJmNhY2hlLT5jY2NfbHJ1X2xlZnQsIGxydV9wYWdlX21heCk7CisJYXRvbWljX2xvbmdfc2V0KCZjYWNoZS0+Y2NjX2xydV9sZWZ0LCBscnVfcGFnZV9tYXgpOwogCXNwaW5fbG9ja19pbml0KCZjYWNoZS0+Y2NjX2xydV9sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmY2FjaGUtPmNjY19scnUpOwogCi0JYXRvbWljX3NldCgmY2FjaGUtPmNjY191bnN0YWJsZV9uciwgMCk7CisJYXRvbWljX2xvbmdfc2V0KCZjYWNoZS0+Y2NjX3Vuc3RhYmxlX25yLCAwKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYWNoZS0+Y2NjX3Vuc3RhYmxlX3dhaXRxKTsKIAogCXJldHVybiBjYWNoZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsYXNzX29iZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xhc3Nfb2JkLmMKaW5kZXggZDlkMmExOS4uNzZlMWVlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xhc3Nfb2JkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xhc3Nfb2JkLmMKQEAgLTQwLDEwICs0MCwxMCBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCIKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9jbF9vYmplY3QuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaW9jdGwuaCIKICNpbmNsdWRlICJsbG9nX2ludGVybmFsLmgiCiAKIHN0cnVjdCBvYmRfZGV2aWNlICpvYmRfZGV2c1tNQVhfT0JEX0RFVklDRVNdOwotRVhQT1JUX1NZTUJPTChvYmRfZGV2cyk7CiBzdHJ1Y3QgbGlzdF9oZWFkIG9iZF90eXBlczsKIERFRklORV9SV0xPQ0sob2JkX2Rldl9sb2NrKTsKIApAQCAtNTQsMTEgKzU0LDkgQEAKIEVYUE9SVF9TWU1CT0wob2JkX2R1bXBfb25fdGltZW91dCk7CiB1bnNpZ25lZCBpbnQgb2JkX2R1bXBfb25fZXZpY3Rpb247CiBFWFBPUlRfU1lNQk9MKG9iZF9kdW1wX29uX2V2aWN0aW9uKTsKLXVuc2lnbmVkIGludCBvYmRfbWF4X2RpcnR5X3BhZ2VzID0gMjU2OwordW5zaWduZWQgbG9uZyBvYmRfbWF4X2RpcnR5X3BhZ2VzOwogRVhQT1JUX1NZTUJPTChvYmRfbWF4X2RpcnR5X3BhZ2VzKTsKLWF0b21pY190IG9iZF91bnN0YWJsZV9wYWdlczsKLUVYUE9SVF9TWU1CT0wob2JkX3Vuc3RhYmxlX3BhZ2VzKTsKLWF0b21pY190IG9iZF9kaXJ0eV9wYWdlczsKK2F0b21pY19sb25nX3Qgb2JkX2RpcnR5X3BhZ2VzOwogRVhQT1JUX1NZTUJPTChvYmRfZGlydHlfcGFnZXMpOwogdW5zaWduZWQgaW50IG9iZF90aW1lb3V0ID0gT0JEX1RJTUVPVVRfREVGQVVMVDsgICAvKiBzZWNvbmRzICovCiBFWFBPUlRfU1lNQk9MKG9iZF90aW1lb3V0KTsKQEAgLTc2LDEzICs3NCwxMSBAQAogaW50IGF0X2V4dHJhID0gMzA7CiBFWFBPUlRfU1lNQk9MKGF0X2V4dHJhKTsKIAotYXRvbWljX3Qgb2JkX2RpcnR5X3RyYW5zaXRfcGFnZXM7CithdG9taWNfbG9uZ190IG9iZF9kaXJ0eV90cmFuc2l0X3BhZ2VzOwogRVhQT1JUX1NZTUJPTChvYmRfZGlydHlfdHJhbnNpdF9wYWdlcyk7CiAKIGNoYXIgb2JkX2pvYmlkX3ZhcltKT0JTVEFUU19KT0JJRF9WQVJfTUFYX0xFTiArIDFdID0gSk9CU1RBVFNfRElTQUJMRTsKLUVYUE9SVF9TWU1CT0wob2JkX2pvYmlkX3Zhcik7Ci0KLWNoYXIgb2JkX2pvYmlkX25vZGVbSk9CU1RBVFNfSk9CSURfU0laRSArIDFdOworY2hhciBvYmRfam9iaWRfbm9kZVtMVVNUUkVfSk9CSURfU0laRSArIDFdOwogCiAvKiBHZXQgam9iaWQgb2YgY3VycmVudCBwcm9jZXNzIGZyb20gc3RvcmVkIHZhcmlhYmxlIG9yIGNhbGN1bGF0ZQogICogaXQgZnJvbSBwaWQgYW5kIHVzZXJfaWQuCkBAIC05MywxNCArODksMTQgQEAKICAqLwogaW50IGx1c3RyZV9nZXRfam9iaWQoY2hhciAqam9iaWQpCiB7Ci0JbWVtc2V0KGpvYmlkLCAwLCBKT0JTVEFUU19KT0JJRF9TSVpFKTsKKwltZW1zZXQoam9iaWQsIDAsIExVU1RSRV9KT0JJRF9TSVpFKTsKIAkvKiBKb2JzdGF0cyBpc24ndCBlbmFibGVkICovCiAJaWYgKHN0cmNtcChvYmRfam9iaWRfdmFyLCBKT0JTVEFUU19ESVNBQkxFKSA9PSAwKQogCQlyZXR1cm4gMDsKIAogCS8qIFVzZSBwcm9jZXNzIG5hbWUgKyBmc3VpZCBhcyBqb2JpZCAqLwogCWlmIChzdHJjbXAob2JkX2pvYmlkX3ZhciwgSk9CU1RBVFNfUFJPQ05BTUVfVUlEKSA9PSAwKSB7Ci0JCXNucHJpbnRmKGpvYmlkLCBKT0JTVEFUU19KT0JJRF9TSVpFLCAiJXMuJXUiLAorCQlzbnByaW50Zihqb2JpZCwgTFVTVFJFX0pPQklEX1NJWkUsICIlcy4ldSIsCiAJCQkgY3VycmVudF9jb21tKCksCiAJCQkgZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfZnN1aWQoKSkpOwogCQlyZXR1cm4gMDsKQEAgLTExNiwxOSArMTEyLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wobHVzdHJlX2dldF9qb2JpZCk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBvYmRfZGF0YTJjb25uKHN0cnVjdCBsdXN0cmVfaGFuZGxlICpjb25uLAotCQkJCSBzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEgKmRhdGEpCi17Ci0JbWVtc2V0KGNvbm4sIDAsIHNpemVvZigqY29ubikpOwotCWNvbm4tPmNvb2tpZSA9IGRhdGEtPmlvY19jb29raWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvYmRfY29ubjJkYXRhKHN0cnVjdCBvYmRfaW9jdGxfZGF0YSAqZGF0YSwKLQkJCQkgc3RydWN0IGx1c3RyZV9oYW5kbGUgKmNvbm4pCi17Ci0JZGF0YS0+aW9jX2Nvb2tpZSA9IGNvbm4tPmNvb2tpZTsKLX0KLQogc3RhdGljIGludCBjbGFzc19yZXNvbHZlX2Rldl9uYW1lKF9fdTMyIGxlbiwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlpbnQgcmM7CkBAIC0yODcsMTMgKzI3MCw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWNhc2UgT0JEX0lPQ19DTE9TRV9VVUlEOiB7Ci0JCUNERUJVRyhEX0lPQ1RMLCAiY2xvc2luZyBhbGwgY29ubmVjdGlvbnMgdG8gdXVpZCAlcyAoTk9PUClcbiIsCi0JCSAgICAgICBkYXRhLT5pb2NfaW5sYnVmMSk7Ci0JCWVyciA9IDA7Ci0JCWdvdG8gb3V0OwotCX0KLQogCWNhc2UgT0JEX0lPQ19HRVRERVZJQ0U6IHsKIAkJaW50ICAgICBpbmRleCA9IGRhdGEtPmlvY19jb3VudDsKIAkJY2hhciAgICAqc3RhdHVzLCAqc3RyOwpAQCAtNDY3LDE1ICs0NDMsMTAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1leHRlcm4gaW50IGNsYXNzX3Byb2Nmc19pbml0KHZvaWQpOwotZXh0ZXJuIGludCBjbGFzc19wcm9jZnNfY2xlYW4odm9pZCk7Ci0KIHN0YXRpYyBpbnQgX19pbml0IG9iZGNsYXNzX2luaXQodm9pZCkKIHsKIAlpbnQgaSwgZXJyOwogCi0JaW50IGx1c3RyZV9yZWdpc3Rlcl9mcyh2b2lkKTsKLQogCUxDT05TT0xFX0lORk8oIkx1c3RyZTogQnVpbGQgVmVyc2lvbjogIiBMVVNUUkVfVkVSU0lPTl9TVFJJTkcgIlxuIik7CiAKIAlzcGluX2xvY2tfaW5pdCgmb2JkX3R5cGVzX2xvY2spOwpAQCAtNTQyLDIzICs1MTMsOSBAQAogCiBzdGF0aWMgdm9pZCBvYmRjbGFzc19leGl0KHZvaWQpCiB7Ci0JaW50IGk7Ci0KLQlpbnQgbHVzdHJlX3VucmVnaXN0ZXJfZnModm9pZCk7Ci0KIAlsdXN0cmVfdW5yZWdpc3Rlcl9mcygpOwogCiAJbWlzY19kZXJlZ2lzdGVyKCZvYmRfcHNkZXYpOwotCWZvciAoaSA9IDA7IGkgPCBjbGFzc19kZXZub19tYXgoKTsgaSsrKSB7Ci0JCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQgPSBjbGFzc19udW0yb2JkKGkpOwotCi0JCWlmIChvYmQgJiYgb2JkLT5vYmRfc2V0X3VwICYmCi0JCSAgICBPQlQob2JkKSAmJiBPQlAob2JkLCBkZXRhY2gpKSB7Ci0JCQkvKiBYWFggc2hvdWxkIHRoaXMgY2FsbCBnZW5lcmljIGRldGFjaCBvdGhlcndpc2U/ICovCi0JCQlMQVNTRVJUKG9iZC0+b2JkX21hZ2ljID09IE9CRF9ERVZJQ0VfTUFHSUMpOwotCQkJT0JQKG9iZCwgZGV0YWNoKShvYmQpOwotCQl9Ci0JfQogCWxsb2dfaW5mb19maW5pKCk7CiAJY2xfZ2xvYmFsX2ZpbmkoKTsKIAlsdV9nbG9iYWxfZmluaSgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvZGVidWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2RlYnVnLmMKaW5kZXggOGFjZjY3Mi4uMGJkNGFkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvZGVidWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9kZWJ1Zy5jCkBAIC00OCwxMCArNDgsMTAgQEAKIAlMQVNTRVJUKGFkZHIpOwogCiAJcHV0X3VuYWxpZ25lZF9sZTY0KG9mZiwgYWRkcik7Ci0JcHV0X3VuYWxpZ25lZF9sZTY0KGlkLCBhZGRyK0xQRFMpOworCXB1dF91bmFsaWduZWRfbGU2NChpZCwgYWRkciArIExQRFMpOwogCWFkZHIgKz0gbGVuIC0gTFBEUyAtIExQRFM7CiAJcHV0X3VuYWxpZ25lZF9sZTY0KG9mZiwgYWRkcik7Ci0JcHV0X3VuYWxpZ25lZF9sZTY0KGlkLCBhZGRyK0xQRFMpOworCXB1dF91bmFsaWduZWRfbGU2NChpZCwgYWRkciArIExQRFMpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9nZW5vcHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2dlbm9wcy5jCmluZGV4IDk5YzJkYTYuLmNmOGJiMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2dlbm9wcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2dlbm9wcy5jCkBAIC0xMzMsNyArMTMzLDYgQEAKIAltb2R1bGVfcHV0KHR5cGUtPnR5cF9kdF9vcHMtPm93bmVyKTsKIAlzcGluX3VubG9jaygmdHlwZS0+b2JkX3R5cGVfbG9jayk7CiB9Ci1FWFBPUlRfU1lNQk9MKGNsYXNzX3B1dF90eXBlKTsKIAogI2RlZmluZSBDTEFTU19NQVhfTkFNRSAxMDI0CiAKQEAgLTE2NiwxMCArMTY1LDEwIEBACiAJICAgICF0eXBlLT50eXBfbmFtZSkKIAkJZ290byBmYWlsZWQ7CiAKLQkqKHR5cGUtPnR5cF9kdF9vcHMpID0gKmR0X29wczsKKwkqdHlwZS0+dHlwX2R0X29wcyA9ICpkdF9vcHM7CiAJLyogbWRfb3BzIGlzIG9wdGlvbmFsICovCiAJaWYgKG1kX29wcykKLQkJKih0eXBlLT50eXBfbWRfb3BzKSA9ICptZF9vcHM7CisJCSp0eXBlLT50eXBfbWRfb3BzID0gKm1kX29wczsKIAlzdHJjcHkodHlwZS0+dHlwX25hbWUsIG5hbWUpOwogCXNwaW5fbG9ja19pbml0KCZ0eXBlLT5vYmRfdHlwZV9sb2NrKTsKIApAQCAtMzkxLDcgKzM5MCw2IEBACiAKIAlyZXR1cm4gLTE7CiB9Ci1FWFBPUlRfU1lNQk9MKGNsYXNzX25hbWUyZGV2KTsKIAogc3RydWN0IG9iZF9kZXZpY2UgKmNsYXNzX25hbWUyb2JkKGNvbnN0IGNoYXIgKm5hbWUpCiB7CkBAIC00MjEsNyArNDE5LDYgQEAKIAogCXJldHVybiAtMTsKIH0KLUVYUE9SVF9TWU1CT0woY2xhc3NfdXVpZDJkZXYpOwogCiAvKioKICAqIEdldCBvYmQgZGV2aWNlIGZyb20gOjpvYmRfZGV2c1tdCkBAIC00NTAsNyArNDQ3LDYgQEAKIAogCXJldHVybiBvYmQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGNsYXNzX251bTJvYmQpOwogCiAvKiBTZWFyY2ggZm9yIGEgY2xpZW50IE9CRCBjb25uZWN0ZWQgdG8gdGd0X3V1aWQuICBJZiBncnBfdXVpZCBpcwogICogc3BlY2lmaWVkLCB0aGVuIG9ubHkgdGhlIGNsaWVudCB3aXRoIHRoYXQgdXVpZCBpcyByZXR1cm5lZCwKQEAgLTUwOSw3ICs1MDUsNyBAQAogCQkJY29udGludWU7CiAJCWlmIChvYmRfdXVpZF9lcXVhbHMoZ3JwX3V1aWQsICZvYmQtPm9iZF91dWlkKSkgewogCQkJaWYgKG5leHQpCi0JCQkJKm5leHQgPSBpKzE7CisJCQkJKm5leHQgPSBpICsgMTsKIAkJCXJlYWRfdW5sb2NrKCZvYmRfZGV2X2xvY2spOwogCQkJcmV0dXJuIG9iZDsKIAkJfQpAQCAtNjE4LDcgKzYxNCw3IEBACiAJfQogCiAJQ0RFQlVHKERfSU5GTywgImxvb2tpbmcgZm9yIGV4cG9ydCBjb29raWUgJSNsbHhcbiIsIGNvbm4tPmNvb2tpZSk7Ci0JZXhwb3J0ID0gY2xhc3NfaGFuZGxlMm9iamVjdChjb25uLT5jb29raWUpOworCWV4cG9ydCA9IGNsYXNzX2hhbmRsZTJvYmplY3QoY29ubi0+Y29va2llLCBOVUxMKTsKIAlyZXR1cm4gZXhwb3J0OwogfQogRVhQT1JUX1NZTUJPTChjbGFzc19jb25uMmV4cG9ydCk7CkBAIC04MTcsNyArODEzLDYgQEAKIAlzcGluX3VubG9jaygmZXhwLT5leHBfb2JkLT5vYmRfZGV2X2xvY2spOwogCWNsYXNzX2V4cG9ydF9wdXQoZXhwKTsKIH0KLUVYUE9SVF9TWU1CT0woY2xhc3NfdW5saW5rX2V4cG9ydCk7CiAKIC8qIEltcG9ydCBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLwogc3RhdGljIHZvaWQgY2xhc3NfaW1wb3J0X2Rlc3Ryb3koc3RydWN0IG9iZF9pbXBvcnQgKmltcCkKQEAgLTk3Myw3ICs5NjgsNiBAQAogCSAgICAgICBsb2NrLCBleHAsIGxvY2stPmxfZXhwX3JlZnNfbnIpOwogCXNwaW5fdW5sb2NrKCZleHAtPmV4cF9sb2Nrc19saXN0X2d1YXJkKTsKIH0KLUVYUE9SVF9TWU1CT0woX19jbGFzc19leHBvcnRfYWRkX2xvY2tfcmVmKTsKIAogdm9pZCBfX2NsYXNzX2V4cG9ydF9kZWxfbG9ja19yZWYoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxkbG1fbG9jayAqbG9jaykKIHsKQEAgLTk5MSw3ICs5ODUsNiBAQAogCSAgICAgICBsb2NrLCBleHAsIGxvY2stPmxfZXhwX3JlZnNfbnIpOwogCXNwaW5fdW5sb2NrKCZleHAtPmV4cF9sb2Nrc19saXN0X2d1YXJkKTsKIH0KLUVYUE9SVF9TWU1CT0woX19jbGFzc19leHBvcnRfZGVsX2xvY2tfcmVmKTsKICNlbmRpZgogCiAvKiBBIGNvbm5lY3Rpb24gZGVmaW5lcyBhbiBleHBvcnQgY29udGV4dCBpbiB3aGljaCBwcmVhbGxvY2F0aW9uIGNhbgpAQCAtMTEwMCw3ICsxMDkzLDYgQEAKIAogI2lmIExVU1RSRV9UUkFDS1NfTE9DS19FWFBfUkVGUwogdm9pZCAoKmNsYXNzX2V4cG9ydF9kdW1wX2hvb2spKHN0cnVjdCBvYmRfZXhwb3J0ICopID0gTlVMTDsKLUVYUE9SVF9TWU1CT0woY2xhc3NfZXhwb3J0X2R1bXBfaG9vayk7CiAjZW5kaWYKIAogLyogVG90YWwgYW1vdW50IG9mIHpvbWJpZXMgdG8gYmUgZGVzdHJveWVkICovCkBAIC0xMzEyLDMgKzEzMDQsMTM1IEBACiAJb2JkX3pvbWJpZV9pbXBleHBfbm90aWZ5KCk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmb2JkX3pvbWJpZV9zdG9wKTsKIH0KKworc3RydWN0IG9iZF9yZXF1ZXN0X3Nsb3Rfd2FpdGVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW9yc3dfZW50cnk7CisJd2FpdF9xdWV1ZV9oZWFkX3QJb3Jzd193YWl0cTsKKwlib29sCQkJb3Jzd19zaWduYWxlZDsKK307CisKK3N0YXRpYyBib29sIG9iZF9yZXF1ZXN0X3Nsb3RfYXZhaWwoc3RydWN0IGNsaWVudF9vYmQgKmNsaSwKKwkJCQkgICBzdHJ1Y3Qgb2JkX3JlcXVlc3Rfc2xvdF93YWl0ZXIgKm9yc3cpCit7CisJYm9vbCBhdmFpbDsKKworCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKKwlhdmFpbCA9ICEhbGlzdF9lbXB0eSgmb3Jzdy0+b3Jzd19lbnRyeSk7CisJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gYXZhaWw7Cit9OworCisvKgorICogRm9yIG5ldHdvcmsgZmxvdyBjb250cm9sLCB0aGUgUlBDIHNwb25zb3IgbmVlZHMgdG8gYWNxdWlyZSBhIGNyZWRpdAorICogYmVmb3JlIHNlbmRpbmcgdGhlIFJQQy4gVGhlIGNyZWRpdHMgY291bnQgZm9yIGEgY29ubmVjdGlvbiBpcyBkZWZpbmVkCisgKiBieSB0aGUgImNsX21heF9ycGNzX2luX2ZsaWdodCIuIElmIGFsbCB0aGUgY3JlZGl0cyBhcmUgb2NjcHVpZWQsIHRoZW4KKyAqIHRoZSBzdWJzZXF1ZW50IFJQQyBzcG9uc29ycyBuZWVkIHRvIHdhaXQgdW50aWwgb3RoZXJzIHJlbGVhc2VkIHRoZWlyCisgKiBjcmVkaXRzLCBvciB0aGUgYWRtaW5pc3RyYXRvciBpbmNyZWFzZWQgdGhlICJjbF9tYXhfcnBjc19pbl9mbGlnaHQiLgorICovCitpbnQgb2JkX2dldF9yZXF1ZXN0X3Nsb3Qoc3RydWN0IGNsaWVudF9vYmQgKmNsaSkKK3sKKwlzdHJ1Y3Qgb2JkX3JlcXVlc3Rfc2xvdF93YWl0ZXIgb3JzdzsKKwlzdHJ1Y3QgbF93YWl0X2luZm8gbHdpOworCWludCByYzsKKworCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKKwlpZiAoY2xpLT5jbF9yX2luX2ZsaWdodCA8IGNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0KSB7CisJCWNsaS0+Y2xfcl9pbl9mbGlnaHQrKzsKKwkJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CisJCXJldHVybiAwOworCX0KKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9yc3cub3Jzd193YWl0cSk7CisJbGlzdF9hZGRfdGFpbCgmb3Jzdy5vcnN3X2VudHJ5LCAmY2xpLT5jbF9sb2lfcmVhZF9saXN0KTsKKwlvcnN3Lm9yc3dfc2lnbmFsZWQgPSBmYWxzZTsKKwlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKKworCWx3aSA9IExXSV9JTlRSKExXSV9PTl9TSUdOQUxfTk9PUCwgTlVMTCk7CisJcmMgPSBsX3dhaXRfZXZlbnQob3Jzdy5vcnN3X3dhaXRxLAorCQkJICBvYmRfcmVxdWVzdF9zbG90X2F2YWlsKGNsaSwgJm9yc3cpIHx8CisJCQkgIG9yc3cub3Jzd19zaWduYWxlZCwKKwkJCSAgJmx3aSk7CisKKwkvKgorCSAqIEhlcmUsIHdlIG11c3QgdGFrZSB0aGUgbG9jayB0byBhdm9pZCB0aGUgb24tc3RhY2sgJ29yc3cnIHRvIGJlCisJICogZnJlZWQgYnV0IG90aGVyIChzdWNoIGFzIG9iZF9wdXRfcmVxdWVzdF9zbG90KSBpcyB1c2luZyBpdC4KKwkgKi8KKwlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CisJaWYgKHJjKSB7CisJCWlmICghb3Jzdy5vcnN3X3NpZ25hbGVkKSB7CisJCQlpZiAobGlzdF9lbXB0eSgmb3Jzdy5vcnN3X2VudHJ5KSkKKwkJCQljbGktPmNsX3JfaW5fZmxpZ2h0LS07CisJCQllbHNlCisJCQkJbGlzdF9kZWwoJm9yc3cub3Jzd19lbnRyeSk7CisJCX0KKwl9CisKKwlpZiAob3Jzdy5vcnN3X3NpZ25hbGVkKSB7CisJCUxBU1NFUlQobGlzdF9lbXB0eSgmb3Jzdy5vcnN3X2VudHJ5KSk7CisKKwkJcmMgPSAtRUlOVFI7CisJfQorCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChvYmRfZ2V0X3JlcXVlc3Rfc2xvdCk7CisKK3ZvaWQgb2JkX3B1dF9yZXF1ZXN0X3Nsb3Qoc3RydWN0IGNsaWVudF9vYmQgKmNsaSkKK3sKKwlzdHJ1Y3Qgb2JkX3JlcXVlc3Rfc2xvdF93YWl0ZXIgKm9yc3c7CisKKwlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CisJY2xpLT5jbF9yX2luX2ZsaWdodC0tOworCisJLyogSWYgdGhlcmUgaXMgZnJlZSBzbG90LCB3YWtldXAgdGhlIGZpcnN0IHdhaXRlci4gKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmNsaS0+Y2xfbG9pX3JlYWRfbGlzdCkgJiYKKwkgICAgbGlrZWx5KGNsaS0+Y2xfcl9pbl9mbGlnaHQgPCBjbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCkpIHsKKwkJb3JzdyA9IGxpc3RfZW50cnkoY2xpLT5jbF9sb2lfcmVhZF9saXN0Lm5leHQsCisJCQkJICBzdHJ1Y3Qgb2JkX3JlcXVlc3Rfc2xvdF93YWl0ZXIsIG9yc3dfZW50cnkpOworCQlsaXN0X2RlbF9pbml0KCZvcnN3LT5vcnN3X2VudHJ5KTsKKwkJY2xpLT5jbF9yX2luX2ZsaWdodCsrOworCQl3YWtlX3VwKCZvcnN3LT5vcnN3X3dhaXRxKTsKKwl9CisJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKG9iZF9wdXRfcmVxdWVzdF9zbG90KTsKKworX191MzIgb2JkX2dldF9tYXhfcnBjc19pbl9mbGlnaHQoc3RydWN0IGNsaWVudF9vYmQgKmNsaSkKK3sKKwlyZXR1cm4gY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQ7Cit9CitFWFBPUlRfU1lNQk9MKG9iZF9nZXRfbWF4X3JwY3NfaW5fZmxpZ2h0KTsKKworaW50IG9iZF9zZXRfbWF4X3JwY3NfaW5fZmxpZ2h0KHN0cnVjdCBjbGllbnRfb2JkICpjbGksIF9fdTMyIG1heCkKK3sKKwlzdHJ1Y3Qgb2JkX3JlcXVlc3Rfc2xvdF93YWl0ZXIgKm9yc3c7CisJX191MzIgb2xkOworCWludCBkaWZmOworCWludCBpOworCisJaWYgKG1heCA+IE9CRF9NQVhfUklGX01BWCB8fCBtYXggPCAxKQorCQlyZXR1cm4gLUVSQU5HRTsKKworCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKKwlvbGQgPSBjbGktPmNsX21heF9ycGNzX2luX2ZsaWdodDsKKwljbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCA9IG1heDsKKwlkaWZmID0gbWF4IC0gb2xkOworCisJLyogV2UgaW5jcmVhc2UgdGhlIG1heF9ycGNzX2luX2ZsaWdodCwgdGhlbiB3YWtldXAgc29tZSB3YWl0ZXJzLiAqLworCWZvciAoaSA9IDA7IGkgPCBkaWZmOyBpKyspIHsKKwkJaWYgKGxpc3RfZW1wdHkoJmNsaS0+Y2xfbG9pX3JlYWRfbGlzdCkpCisJCQlicmVhazsKKworCQlvcnN3ID0gbGlzdF9lbnRyeShjbGktPmNsX2xvaV9yZWFkX2xpc3QubmV4dCwKKwkJCQkgIHN0cnVjdCBvYmRfcmVxdWVzdF9zbG90X3dhaXRlciwgb3Jzd19lbnRyeSk7CisJCWxpc3RfZGVsX2luaXQoJm9yc3ctPm9yc3dfZW50cnkpOworCQljbGktPmNsX3JfaW5fZmxpZ2h0Kys7CisJCXdha2VfdXAoJm9yc3ctPm9yc3dfd2FpdHEpOworCX0KKwlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChvYmRfc2V0X21heF9ycGNzX2luX2ZsaWdodCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW5rZWEuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbmtlYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMWQyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW5rZWEuYwpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIEdQTCBIRUFERVIgU1RBUlQKKyAqCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkCisgKiBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBJZiBub3QsIHNlZQorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbAorICoKKyAqIEdQTCBIRUFERVIgRU5ECisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTQsIEludGVsIENvcnBvcmF0aW9uLgorICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcy4KKyAqCisgKiBBdXRob3I6IERpIFdhbmcgPGRpLndhbmdAaW50ZWwuY29tPgorICovCisKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaWRsLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmQuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saW5rZWEuaCIKKworaW50IGxpbmtlYV9kYXRhX25ldyhzdHJ1Y3QgbGlua2VhX2RhdGEgKmxkYXRhLCBzdHJ1Y3QgbHVfYnVmICpidWYpCit7CisJbGRhdGEtPmxkX2J1ZiA9IGx1X2J1Zl9jaGVja19hbmRfYWxsb2MoYnVmLCBQQUdFX1NJWkUpOworCWlmICghbGRhdGEtPmxkX2J1Zi0+bGJfYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlsZGF0YS0+bGRfbGVoID0gbGRhdGEtPmxkX2J1Zi0+bGJfYnVmOworCWxkYXRhLT5sZF9sZWgtPmxlaF9tYWdpYyA9IExJTktfRUFfTUFHSUM7CisJbGRhdGEtPmxkX2xlaC0+bGVoX2xlbiA9IHNpemVvZihzdHJ1Y3QgbGlua19lYV9oZWFkZXIpOworCWxkYXRhLT5sZF9sZWgtPmxlaF9yZWNjb3VudCA9IDA7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGxpbmtlYV9kYXRhX25ldyk7CisKK2ludCBsaW5rZWFfaW5pdChzdHJ1Y3QgbGlua2VhX2RhdGEgKmxkYXRhKQoreworCXN0cnVjdCBsaW5rX2VhX2hlYWRlciAqbGVoOworCisJTEFTU0VSVChsZGF0YS0+bGRfYnVmKTsKKwlsZWggPSBsZGF0YS0+bGRfYnVmLT5sYl9idWY7CisJaWYgKGxlaC0+bGVoX21hZ2ljID09IF9fc3dhYjMyKExJTktfRUFfTUFHSUMpKSB7CisJCWxlaC0+bGVoX21hZ2ljID0gTElOS19FQV9NQUdJQzsKKwkJbGVoLT5sZWhfcmVjY291bnQgPSBfX3N3YWIzMihsZWgtPmxlaF9yZWNjb3VudCk7CisJCWxlaC0+bGVoX2xlbiA9IF9fc3dhYjY0KGxlaC0+bGVoX2xlbik7CisJCS8qIGVudHJpZXMgYXJlIHN3YWJiZWQgYnkgbGlua2VhX2VudHJ5X3VucGFjayAqLworCX0KKwlpZiAobGVoLT5sZWhfbWFnaWMgIT0gTElOS19FQV9NQUdJQykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGxlaC0+bGVoX3JlY2NvdW50ID09IDApCisJCXJldHVybiAtRU5PREFUQTsKKworCWxkYXRhLT5sZF9sZWggPSBsZWg7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGxpbmtlYV9pbml0KTsKKworLyoqCisgKiBQYWNrIGEgbGlua19lYV9lbnRyeS4KKyAqIEFsbCBlbGVtZW50cyBhcmUgc3RvcmVkIGFzIGNoYXJzIHRvIGF2b2lkIGFsaWdubWVudCBpc3N1ZXMuCisgKiBOdW1iZXJzIGFyZSBhbHdheXMgYmlnLWVuZGlhbgorICogXHJldHZhbCByZWNvcmQgbGVuZ3RoCisgKi8KK2ludCBsaW5rZWFfZW50cnlfcGFjayhzdHJ1Y3QgbGlua19lYV9lbnRyeSAqbGVlLCBjb25zdCBzdHJ1Y3QgbHVfbmFtZSAqbG5hbWUsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKnBmaWQpCit7CisJc3RydWN0IGx1X2ZpZCAgIHRtcGZpZDsKKwlpbnQgICAgICAgICAgICAgcmVjbGVuOworCisJdG1wZmlkID0gKnBmaWQ7CisJaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX0xGU0NLX0xJTktFQV9DUkFTSCkpCisJCXRtcGZpZC5mX3ZlciA9IH4wOworCWZpZF9jcHVfdG9fYmUoJnRtcGZpZCwgJnRtcGZpZCk7CisJbWVtY3B5KCZsZWUtPmxlZV9wYXJlbnRfZmlkLCAmdG1wZmlkLCBzaXplb2YodG1wZmlkKSk7CisJbWVtY3B5KGxlZS0+bGVlX25hbWUsIGxuYW1lLT5sbl9uYW1lLCBsbmFtZS0+bG5fbmFtZWxlbik7CisJcmVjbGVuID0gc2l6ZW9mKHN0cnVjdCBsaW5rX2VhX2VudHJ5KSArIGxuYW1lLT5sbl9uYW1lbGVuOworCisJbGVlLT5sZWVfcmVjbGVuWzBdID0gKHJlY2xlbiA+PiA4KSAmIDB4ZmY7CisJbGVlLT5sZWVfcmVjbGVuWzFdID0gcmVjbGVuICYgMHhmZjsKKwlyZXR1cm4gcmVjbGVuOworfQorRVhQT1JUX1NZTUJPTChsaW5rZWFfZW50cnlfcGFjayk7CisKK3ZvaWQgbGlua2VhX2VudHJ5X3VucGFjayhjb25zdCBzdHJ1Y3QgbGlua19lYV9lbnRyeSAqbGVlLCBpbnQgKnJlY2xlbiwKKwkJCSBzdHJ1Y3QgbHVfbmFtZSAqbG5hbWUsIHN0cnVjdCBsdV9maWQgKnBmaWQpCit7CisJKnJlY2xlbiA9IChsZWUtPmxlZV9yZWNsZW5bMF0gPDwgOCkgfCBsZWUtPmxlZV9yZWNsZW5bMV07CisJbWVtY3B5KHBmaWQsICZsZWUtPmxlZV9wYXJlbnRfZmlkLCBzaXplb2YoKnBmaWQpKTsKKwlmaWRfYmVfdG9fY3B1KHBmaWQsIHBmaWQpOworCWlmIChsbmFtZSkgeworCQlsbmFtZS0+bG5fbmFtZSA9IGxlZS0+bGVlX25hbWU7CisJCWxuYW1lLT5sbl9uYW1lbGVuID0gKnJlY2xlbiAtIHNpemVvZihzdHJ1Y3QgbGlua19lYV9lbnRyeSk7CisJfQorfQorRVhQT1JUX1NZTUJPTChsaW5rZWFfZW50cnlfdW5wYWNrKTsKKworLyoqCisgKiBBZGQgYSByZWNvcmQgdG8gdGhlIGVuZCBvZiBsaW5rIGVhIGJ1ZgorICoqLworaW50IGxpbmtlYV9hZGRfYnVmKHN0cnVjdCBsaW5rZWFfZGF0YSAqbGRhdGEsIGNvbnN0IHN0cnVjdCBsdV9uYW1lICpsbmFtZSwKKwkJICAgY29uc3Qgc3RydWN0IGx1X2ZpZCAqcGZpZCkKK3sKKwlMQVNTRVJUKGxkYXRhLT5sZF9sZWgpOworCisJaWYgKCFsbmFtZSB8fCAhcGZpZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsZGF0YS0+bGRfcmVjbGVuID0gbG5hbWUtPmxuX25hbWVsZW4gKyBzaXplb2Yoc3RydWN0IGxpbmtfZWFfZW50cnkpOworCWlmIChsZGF0YS0+bGRfbGVoLT5sZWhfbGVuICsgbGRhdGEtPmxkX3JlY2xlbiA+CisJICAgIGxkYXRhLT5sZF9idWYtPmxiX2xlbikgeworCQlpZiAobHVfYnVmX2NoZWNrX2FuZF9ncm93KGxkYXRhLT5sZF9idWYsCisJCQkJCSAgbGRhdGEtPmxkX2xlaC0+bGVoX2xlbiArCisJCQkJCSAgbGRhdGEtPmxkX3JlY2xlbikgPCAwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbGRhdGEtPmxkX2xlaCA9IGxkYXRhLT5sZF9idWYtPmxiX2J1ZjsKKwlsZGF0YS0+bGRfbGVlID0gbGRhdGEtPmxkX2J1Zi0+bGJfYnVmICsgbGRhdGEtPmxkX2xlaC0+bGVoX2xlbjsKKwlsZGF0YS0+bGRfcmVjbGVuID0gbGlua2VhX2VudHJ5X3BhY2sobGRhdGEtPmxkX2xlZSwgbG5hbWUsIHBmaWQpOworCWxkYXRhLT5sZF9sZWgtPmxlaF9sZW4gKz0gbGRhdGEtPmxkX3JlY2xlbjsKKwlsZGF0YS0+bGRfbGVoLT5sZWhfcmVjY291bnQrKzsKKwlDREVCVUcoRF9JTk9ERSwgIk5ldyBsaW5rX2VhIG5hbWUgJyIgREZJRCAiOiUuKnMnIGlzIGFkZGVkXG4iLAorCSAgICAgICBQRklEKHBmaWQpLCBsbmFtZS0+bG5fbmFtZWxlbiwgbG5hbWUtPmxuX25hbWUpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChsaW5rZWFfYWRkX2J1Zik7CisKKy8qKiBEZWwgdGhlIGN1cnJlbnQgcmVjb3JkIGZyb20gdGhlIGxpbmsgZWEgYnVmICovCit2b2lkIGxpbmtlYV9kZWxfYnVmKHN0cnVjdCBsaW5rZWFfZGF0YSAqbGRhdGEsIGNvbnN0IHN0cnVjdCBsdV9uYW1lICpsbmFtZSkKK3sKKwlMQVNTRVJUKGxkYXRhLT5sZF9sZWggJiYgbGRhdGEtPmxkX2xlZSk7CisKKwlsZGF0YS0+bGRfbGVoLT5sZWhfcmVjY291bnQtLTsKKwlsZGF0YS0+bGRfbGVoLT5sZWhfbGVuIC09IGxkYXRhLT5sZF9yZWNsZW47CisJbWVtbW92ZShsZGF0YS0+bGRfbGVlLCAoY2hhciAqKWxkYXRhLT5sZF9sZWUgKyBsZGF0YS0+bGRfcmVjbGVuLAorCQkoY2hhciAqKWxkYXRhLT5sZF9sZWggKyBsZGF0YS0+bGRfbGVoLT5sZWhfbGVuIC0KKwkJKGNoYXIgKilsZGF0YS0+bGRfbGVlKTsKKwlDREVCVUcoRF9JTk9ERSwgIk9sZCBsaW5rX2VhIG5hbWUgJyUuKnMnIGlzIHJlbW92ZWRcbiIsCisJICAgICAgIGxuYW1lLT5sbl9uYW1lbGVuLCBsbmFtZS0+bG5fbmFtZSk7CisKKwlpZiAoKGNoYXIgKilsZGF0YS0+bGRfbGVlID49ICgoY2hhciAqKWxkYXRhLT5sZF9sZWggKworCQkJCSAgICAgIGxkYXRhLT5sZF9sZWgtPmxlaF9sZW4pKQorCQlsZGF0YS0+bGRfbGVlID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wobGlua2VhX2RlbF9idWYpOworCisvKioKKyAqIENoZWNrIGlmIHN1Y2ggYSBsaW5rIGV4aXN0cyBpbiBsaW5rRUEuCisgKgorICogXHBhcmFtIGxkYXRhIGxpbmsgZGF0YSB0aGUgc2VhcmNoIHRvIGJlIGRvbmUgb24KKyAqIFxwYXJhbSBsbmFtZSBuYW1lIGluIHRoZSBwYXJlbnQncyBkaXJlY3RvcnkgZW50cnkgcG9pbnRpbmcgdG8gdGhpcyBvYmplY3QKKyAqIFxwYXJhbSBwZmlkIHBhcmVudCBmaWQgdGhlIGxpbmsgdG8gYmUgZm91bmQgZm9yCisgKgorICogXHJldHZhbCAgIDAgc3VjY2VzcworICogXHJldHZhbCAtRU5PRU5UIGxpbmsgZG9lcyBub3QgZXhpc3QKKyAqIFxyZXR2YWwgLXZlIG9uIGVycm9yCisgKi8KK2ludCBsaW5rZWFfbGlua3NfZmluZChzdHJ1Y3QgbGlua2VhX2RhdGEgKmxkYXRhLCBjb25zdCBzdHJ1Y3QgbHVfbmFtZSAqbG5hbWUsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBsdV9maWQgICpwZmlkKQoreworCXN0cnVjdCBsdV9uYW1lIHRtcG5hbWU7CisJc3RydWN0IGx1X2ZpZCAgdG1wZmlkOworCWludCBjb3VudDsKKworCUxBU1NFUlQobGRhdGEtPmxkX2xlaCk7CisKKwkvKiBsaW5rICMwICovCisJbGRhdGEtPmxkX2xlZSA9IChzdHJ1Y3QgbGlua19lYV9lbnRyeSAqKShsZGF0YS0+bGRfbGVoICsgMSk7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBsZGF0YS0+bGRfbGVoLT5sZWhfcmVjY291bnQ7IGNvdW50KyspIHsKKwkJbGlua2VhX2VudHJ5X3VucGFjayhsZGF0YS0+bGRfbGVlLCAmbGRhdGEtPmxkX3JlY2xlbiwKKwkJCQkgICAgJnRtcG5hbWUsICZ0bXBmaWQpOworCQlpZiAodG1wbmFtZS5sbl9uYW1lbGVuID09IGxuYW1lLT5sbl9uYW1lbGVuICYmCisJCSAgICBsdV9maWRfZXEoJnRtcGZpZCwgcGZpZCkgJiYKKwkJICAgIChzdHJuY21wKHRtcG5hbWUubG5fbmFtZSwgbG5hbWUtPmxuX25hbWUsCisJCQkgICAgIHRtcG5hbWUubG5fbmFtZWxlbikgPT0gMCkpCisJCQlicmVhazsKKwkJbGRhdGEtPmxkX2xlZSA9IChzdHJ1Y3QgbGlua19lYV9lbnRyeSAqKSgoY2hhciAqKWxkYXRhLT5sZF9sZWUgKworCQkJCQkJCSBsZGF0YS0+bGRfcmVjbGVuKTsKKwl9CisKKwlpZiAoY291bnQgPT0gbGRhdGEtPmxkX2xlaC0+bGVoX3JlY2NvdW50KSB7CisJCUNERUJVRyhEX0lOT0RFLCAiT2xkIGxpbmtfZWEgbmFtZSAnJS4qcycgbm90IGZvdW5kXG4iLAorCQkgICAgICAgbG5hbWUtPmxuX25hbWVsZW4sIGxuYW1lLT5sbl9uYW1lKTsKKwkJbGRhdGEtPmxkX2xlZSA9IE5VTEw7CisJCWxkYXRhLT5sZF9yZWNsZW4gPSAwOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGxpbmtlYV9saW5rc19maW5kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LW1vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtbW9kdWxlLmMKaW5kZXggMzMzNDJiZi4uYmUwOWUwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtbW9kdWxlLmMKQEAgLTY1LDYgKzY1LDcgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL29iZF9zdXBwb3J0LmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9vYmRfY2xhc3MuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgiCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lvY3RsLmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9sdXN0cmVfdmVyLmgiCiAKIC8qIGJ1ZmZlciBNVVNUIGJlIGF0IGxlYXN0IHRoZSBzaXplIG9mIG9iZF9pb2N0bF9oZHIgKi8KQEAgLTE1Nyw3ICsxNTgsNiBAQAogCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsIGRhdGEsIGxlbikgPyAtRUZBVUxUIDogMDsKIAlyZXR1cm4gZXJyOwogfQotRVhQT1JUX1NZTUJPTChvYmRfaW9jdGxfcG9wZGF0YSk7CiAKIC8qICBvcGVuaW5nIC9kZXYvb2JkICovCiBzdGF0aWMgaW50IG9iZF9jbGFzc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQpAQCAtMTkxLDcgKzE5MSw3IEBACiB9CiAKIC8qIGRlY2xhcmUgY2hhcmFjdGVyIGRldmljZSAqLwotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2JkX3BzZGV2X2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvYmRfcHNkZXZfZm9wcyA9IHsKIAkub3duZXIJICA9IFRISVNfTU9EVUxFLAogCS51bmxvY2tlZF9pb2N0bCA9IG9iZF9jbGFzc19pb2N0bCwgLyogdW5sb2NrZWRfaW9jdGwgKi8KIAkub3BlbgkgICA9IG9iZF9jbGFzc19vcGVuLCAgICAgIC8qIG9wZW4gKi8KQEAgLTI5MSw3ICsyOTEsNyBAQAogCQkJCWNvbnN0IGNoYXIgKmJ1ZmZlciwKIAkJCQlzaXplX3QgY291bnQpCiB7Ci0JaWYgKCFjb3VudCB8fCBjb3VudCA+IEpPQlNUQVRTX0pPQklEX1NJWkUpCisJaWYgKCFjb3VudCB8fCBjb3VudCA+IExVU1RSRV9KT0JJRF9TSVpFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1lbWNweShvYmRfam9iaWRfbm9kZSwgYnVmZmVyLCBjb3VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1vYmRvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1vYmRvLmMKaW5kZXggYzZjYzZhNy4uNDFiNzdhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtb2Jkby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LW9iZG8uYwpAQCAtNDQsNyArNDQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KIAotdm9pZCBvYmRvX3JlZnJlc2hfaW5vZGUoc3RydWN0IGlub2RlICpkc3QsIHN0cnVjdCBvYmRvICpzcmMsIHUzMiB2YWxpZCkKK3ZvaWQgb2Jkb19yZWZyZXNoX2lub2RlKHN0cnVjdCBpbm9kZSAqZHN0LCBjb25zdCBzdHJ1Y3Qgb2JkbyAqc3JjLCB1MzIgdmFsaWQpCiB7CiAJdmFsaWQgJj0gc3JjLT5vX3ZhbGlkOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1zeXNjdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LXN5c2N0bC5jCmluZGV4IDhmNzBkZDIuLmU2Yzc4NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LXN5c2N0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LXN5c2N0bC5jCkBAIC00NSw2ICs0NSw3IEBACiAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL29iZF9zdXBwb3J0LmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oIgorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvb2JkX2NsYXNzLmgiCiAKIHN0cnVjdCBzdGF0aWNfbHVzdHJlX3VpbnR2YWx1ZV9hdHRyIHsKIAlzdHJ1Y3QgewpAQCAtOTUsOCArOTYsOCBAQAogc3RhdGljIHNzaXplX3QgbWF4X2RpcnR5X21iX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCiAJCQkJIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldWxcbiIsCi0JCQlvYmRfbWF4X2RpcnR5X3BhZ2VzIC8gKDEgPDwgKDIwIC0gUEFHRV9TSElGVCkpKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsCisJCSAgICAgICBvYmRfbWF4X2RpcnR5X3BhZ2VzIC8gKDEgPDwgKDIwIC0gUEFHRV9TSElGVCkpKTsKIH0KIAogc3RhdGljIHNzaXplX3QgbWF4X2RpcnR5X21iX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZy5jCmluZGV4IDE3ODRjYTAuLjQzNzk3ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2cuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAkJTEFTU0VSVChsaXN0X2VtcHR5KCZsb2doYW5kbGUtPnUucGhkLnBoZF9lbnRyeSkpOwogCWVsc2UgaWYgKGxvZ2hhbmRsZS0+bGdoX2hkci0+bGxoX2ZsYWdzICYgTExPR19GX0lTX0NBVCkKIAkJTEFTU0VSVChsaXN0X2VtcHR5KCZsb2doYW5kbGUtPnUuY2hkLmNoZF9oZWFkKSk7Ci0JTEFTU0VSVChzaXplb2YoKihsb2doYW5kbGUtPmxnaF9oZHIpKSA9PSBMTE9HX0NIVU5LX1NJWkUpOworCUxBU1NFUlQoc2l6ZW9mKCpsb2doYW5kbGUtPmxnaF9oZHIpID09IExMT0dfQ0hVTktfU0laRSk7CiAJa2ZyZWUobG9naGFuZGxlLT5sZ2hfaGRyKTsKIG91dDoKIAlrZnJlZShsb2doYW5kbGUpOwpAQCAtMTM3LDYgKzEzNyw3IEBACiBpbnQgbGxvZ19pbml0X2hhbmRsZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBsbG9nX2hhbmRsZSAqaGFuZGxlLAogCQkgICAgIGludCBmbGFncywgc3RydWN0IG9iZF91dWlkICp1dWlkKQogeworCWVudW0gbGxvZ19mbGFnIGZtdCA9IGZsYWdzICYgTExPR19GX0VYVF9NQVNLOwogCXN0cnVjdCBsbG9nX2xvZ19oZHIJKmxsaDsKIAlpbnQJCQkgcmM7CiAKQEAgLTE5NCw2ICsxOTUsNyBAQAogCQkgICAgICAgZmxhZ3MsIExMT0dfRl9JU19DQVQsIExMT0dfRl9JU19QTEFJTik7CiAJCXJjID0gLUVJTlZBTDsKIAl9CisJbGxoLT5sbGhfZmxhZ3MgfD0gZm10Owogb3V0OgogCWlmIChyYykgewogCQlrZnJlZShsbGgpOwpAQCAtMjMzLDYgKzIzNSwxMCBAQAogCWVsc2UKIAkJbGFzdF9pbmRleCA9IExMT0dfQklUTUFQX0JZVEVTICogOCAtIDE7CiAKKwkvKiBSZWNvcmQgaXMgbm90IGluIHRoaXMgYnVmZmVyLiAqLworCWlmIChpbmRleCA+IGxhc3RfaW5kZXgpCisJCWdvdG8gb3V0OworCiAJd2hpbGUgKHJjID09IDApIHsKIAkJc3RydWN0IGxsb2dfcmVjX2hkciAqcmVjOwogCkBAIC0yNjIsNyArMjY4LDcgQEAKIAkJICovCiAJCWZvciAocmVjID0gKHN0cnVjdCBsbG9nX3JlY19oZHIgKilidWY7CiAJCSAgICAgKGNoYXIgKilyZWMgPCBidWYgKyBMTE9HX0NIVU5LX1NJWkU7Ci0JCSAgICAgcmVjID0gKHN0cnVjdCBsbG9nX3JlY19oZHIgKikoKGNoYXIgKilyZWMgKyByZWMtPmxyaF9sZW4pKSB7CisJCSAgICAgcmVjID0gbGxvZ19yZWNfaGRyX25leHQocmVjKSkgewogCQkJQ0RFQlVHKERfT1RIRVIsICJwcm9jZXNzaW5nIHJlYyAweCVwIHR5cGUgJSN4XG4iLAogCQkJICAgICAgIHJlYywgcmVjLT5scmhfdHlwZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfY2F0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX2NhdC5jCmluZGV4IGE4MmEyOTUuLmNlOGUyZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfY2F0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19jYXQuYwpAQCAtNjMsMTEgKzYzLDEzIEBACiAJCQkgICAgICBzdHJ1Y3QgbGxvZ19sb2dpZCAqbG9naWQpCiB7CiAJc3RydWN0IGxsb2dfaGFuZGxlCSpsb2doYW5kbGU7CisJZW51bSBsbG9nX2ZsYWcgZm10OwogCWludAkJCSByYyA9IDA7CiAKIAlpZiAoIWNhdGhhbmRsZSkKIAkJcmV0dXJuIC1FQkFERjsKIAorCWZtdCA9IGNhdGhhbmRsZS0+bGdoX2hkci0+bGxoX2ZsYWdzICYgTExPR19GX0VYVF9NQVNLOwogCWRvd25fd3JpdGUoJmNhdGhhbmRsZS0+bGdoX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkobG9naGFuZGxlLCAmY2F0aGFuZGxlLT51LmNoZC5jaGRfaGVhZCwKIAkJCSAgICB1LnBoZC5waGRfZW50cnkpIHsKQEAgLTk5LDcgKzEwMSw3IEBACiAJCXJldHVybiByYzsKIAl9CiAKLQlyYyA9IGxsb2dfaW5pdF9oYW5kbGUoZW52LCBsb2doYW5kbGUsIExMT0dfRl9JU19QTEFJTiwgTlVMTCk7CisJcmMgPSBsbG9nX2luaXRfaGFuZGxlKGVudiwgbG9naGFuZGxlLCBmbXQgfCBMTE9HX0ZfSVNfUExBSU4sIE5VTEwpOwogCWlmIChyYyA8IDApIHsKIAkJbGxvZ19jbG9zZShlbnYsIGxvZ2hhbmRsZSk7CiAJCWxvZ2hhbmRsZSA9IE5VTEw7CkBAIC0xMDcsNyArMTA5LDcgQEAKIAl9CiAKIAlkb3duX3dyaXRlKCZjYXRoYW5kbGUtPmxnaF9sb2NrKTsKLQlsaXN0X2FkZCgmbG9naGFuZGxlLT51LnBoZC5waGRfZW50cnksICZjYXRoYW5kbGUtPnUuY2hkLmNoZF9oZWFkKTsKKwlsaXN0X2FkZF90YWlsKCZsb2doYW5kbGUtPnUucGhkLnBoZF9lbnRyeSwgJmNhdGhhbmRsZS0+dS5jaGQuY2hkX2hlYWQpOwogCXVwX3dyaXRlKCZjYXRoYW5kbGUtPmxnaF9sb2NrKTsKIAogCWxvZ2hhbmRsZS0+dS5waGQucGhkX2NhdF9oYW5kbGUgPSBjYXRoYW5kbGU7CkBAIC0xMjMsNyArMTI1LDYgQEAKIGludCBsbG9nX2NhdF9jbG9zZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBsbG9nX2hhbmRsZSAqY2F0aGFuZGxlKQogewogCXN0cnVjdCBsbG9nX2hhbmRsZQkqbG9naGFuZGxlLCAqbjsKLQlpbnQJCQkgcmM7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG9naGFuZGxlLCBuLCAmY2F0aGFuZGxlLT51LmNoZC5jaGRfaGVhZCwKIAkJCQkgdS5waGQucGhkX2VudHJ5KSB7CkBAIC0xMzQsOCArMTM1LDcgQEAKIAkvKiBpZiBoYW5kbGUgd2FzIHN0b3JlZCBpbiBjdHh0LCByZW1vdmUgaXQgdG9vICovCiAJaWYgKGNhdGhhbmRsZS0+bGdoX2N0eHQtPmxvY19oYW5kbGUgPT0gY2F0aGFuZGxlKQogCQljYXRoYW5kbGUtPmxnaF9jdHh0LT5sb2NfaGFuZGxlID0gTlVMTDsKLQlyYyA9IGxsb2dfY2xvc2UoZW52LCBjYXRoYW5kbGUpOwotCXJldHVybiByYzsKKwlyZXR1cm4gbGxvZ19jbG9zZShlbnYsIGNhdGhhbmRsZSk7CiB9CiBFWFBPUlRfU1lNQk9MKGxsb2dfY2F0X2Nsb3NlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19pbnRlcm5hbC5oCmluZGV4IGY3OTQ5NTIuLjIxYTkzYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX2ludGVybmFsLmgKQEAgLTcwLDQgKzcwLDkgQEAKIAkJCSBsbG9nX2NiX3QgY2IsIHZvaWQgKmRhdGEsIHZvaWQgKmNhdGRhdGEsIGJvb2wgZm9yayk7CiBpbnQgbGxvZ19jYXRfY2xlYW51cChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBsbG9nX2hhbmRsZSAqY2F0aGFuZGxlLAogCQkgICAgIHN0cnVjdCBsbG9nX2hhbmRsZSAqbG9naGFuZGxlLCBpbnQgaW5kZXgpOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsbG9nX3JlY19oZHIgKmxsb2dfcmVjX2hkcl9uZXh0KHN0cnVjdCBsbG9nX3JlY19oZHIgKnJlYykKK3sKKwlyZXR1cm4gKHN0cnVjdCBsbG9nX3JlY19oZHIgKikoKGNoYXIgKilyZWMgKyByZWMtPmxyaF9sZW4pOworfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX29iZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19vYmQuYwppbmRleCA2YWNlN2UwLi5hNDI3N2Q2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX29iZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfb2JkLmMKQEAgLTIxMCw3ICsyMTAsNiBAQAogLyogY29udGV4dCBrZXk6IGxsb2dfdGhyZWFkX2tleSAqLwogTFVfQ09OVEVYVF9LRVlfREVGSU5FKGxsb2csIExDVF9NRF9USFJFQUQgfCBMQ1RfTUdfVEhSRUFEIHwgTENUX0xPQ0FMKTsKIExVX0tFWV9JTklUX0dFTkVSSUMobGxvZyk7Ci1FWFBPUlRfU1lNQk9MKGxsb2dfdGhyZWFkX2tleSk7CiAKIGludCBsbG9nX2luZm9faW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19zd2FiLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX3N3YWIuYwppbmRleCBmN2I5YjE5Li44YzRjMWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX3N3YWIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX3N3YWIuYwpAQCAtMTcyLDIwICsxNzIsMjMgQEAKIAkJX19zd2FiNjRzKCZjci0+Y3IuY3JfdGltZSk7CiAJCWx1c3RyZV9zd2FiX2x1X2ZpZCgmY3ItPmNyLmNyX3RmaWQpOwogCQlsdXN0cmVfc3dhYl9sdV9maWQoJmNyLT5jci5jcl9wZmlkKTsKLQkJaWYgKENIQU5HRUxPR19SRUNfRVhURU5ERUQoJmNyLT5jcikpIHsKLQkJCXN0cnVjdCBsbG9nX2NoYW5nZWxvZ19leHRfcmVjICpleHQgPQotCQkJCShzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfZXh0X3JlYyAqKXJlYzsKKwkJaWYgKGNyLT5jci5jcl9mbGFncyAmIENMRl9SRU5BTUUpIHsKKwkJCXN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlbmFtZSAqcm5tID0KKwkJCQljaGFuZ2Vsb2dfcmVjX3JlbmFtZSgmY3ItPmNyKTsKIAotCQkJbHVzdHJlX3N3YWJfbHVfZmlkKCZleHQtPmNyLmNyX3NmaWQpOwotCQkJbHVzdHJlX3N3YWJfbHVfZmlkKCZleHQtPmNyLmNyX3NwZmlkKTsKLQkJCXRhaWwgPSAmZXh0LT5jcl90YWlsOwotCQl9IGVsc2UgewotCQkJdGFpbCA9ICZjci0+Y3JfdGFpbDsKKwkJCWx1c3RyZV9zd2FiX2x1X2ZpZCgmcm5tLT5jcl9zZmlkKTsKKwkJCWx1c3RyZV9zd2FiX2x1X2ZpZCgmcm5tLT5jcl9zcGZpZCk7CiAJCX0KLQkJdGFpbCA9IChzdHJ1Y3QgbGxvZ19yZWNfdGFpbCAqKSgoY2hhciAqKXRhaWwgKworCQkvKgorCQkgKiBCZWNhdXNlIHRoZSB0YWlsIGZvbGxvd3MgYSB2YXJpYWJsZS1sZW5ndGggc3RydWN0dXJlIHdlIG5lZWQKKwkJICogdG8gY29tcHV0ZSBpdHMgbG9jYXRpb24gYXQgcnVudGltZQorCQkgKi8KKwkJdGFpbCA9IChzdHJ1Y3QgbGxvZ19yZWNfdGFpbCAqKSgoY2hhciAqKSZjci0+Y3IgKworCQkJCQkJY2hhbmdlbG9nX3JlY19zaXplKCZjci0+Y3IpICsKIAkJCQkJCWNyLT5jci5jcl9uYW1lbGVuKTsKIAkJYnJlYWs7CiAJfQorCiAJY2FzZSBDSEFOR0VMT0dfVVNFUl9SRUM6CiAJewogCQlzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfdXNlcl9yZWMgKmN1ciA9CkBAIC0yMjQsNiArMjI3LDcgQEAKIAkJX19zd2FiMzJzKCZsc3ItPmxzcl91aWRfaCk7CiAJCV9fc3dhYjMycygmbHNyLT5sc3JfZ2lkKTsKIAkJX19zd2FiMzJzKCZsc3ItPmxzcl9naWRfaCk7CisJCV9fc3dhYjY0cygmbHNyLT5sc3JfdmFsaWQpOwogCQl0YWlsID0gJmxzci0+bHNyX3RhaWw7CiAJCWJyZWFrOwogCX0KQEAgLTM0Myw3ICszNDcsNiBAQAogCiAJcHJpbnRfbHVzdHJlX2NmZyhsY2ZnKTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfbHVzdHJlX2NmZyk7CiAKIC8qIHVzZWQgb25seSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBvbi1kaXNrIGNmZ19tYXJrZXIgZGF0YSAqLwogc3RydWN0IGNmZ19tYXJrZXIzMiB7CkBAIC00MDMsNCArNDA2LDMgQEAKIAkJX19zd2FiNjRzKCZtYXJrZXItPmNtX2NhbmNlbHRpbWUpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfY2ZnX21hcmtlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9scHJvY2ZzX3N0YXR1cy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHByb2Nmc19zdGF0dXMuYwppbmRleCAyNzliNjI1Li44NTJhNWFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9scHJvY2ZzX3N0YXR1cy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xwcm9jZnNfc3RhdHVzLmMKQEAgLTk2LDYgKzk2LDEyIEBACiAJInBpbmdsZXNzIiwKIAkiZmxvY2tfZGVhZGxvY2siLAogCSJkaXNwX3N0cmlwZSIsCisJIm9wZW5fYnlfZmlkIiwKKwkibGZzY2siLAorCSJ1bmtub3duIiwKKwkidW5saW5rX2Nsb3NlIiwKKwkidW5rbm93biIsCisJImRpcl9zdHJpcGUiLAogCSJ1bmtub3duIiwKIAlOVUxMCiB9OwpAQCAtMzA5LDcgKzMxNSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChsZGVidWdmc19hZGRfc2ltcGxlKTsKIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbHByb2Nmc19nZW5lcmljX2ZvcHMgPSB7IH07CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBscHJvY2ZzX2dlbmVyaWNfZm9wcyA9IHsgfTsKIAogaW50IGxkZWJ1Z2ZzX2FkZF92YXJzKHN0cnVjdCBkZW50cnkgKnBhcmVudCwKIAkJICAgICAgc3RydWN0IGxwcm9jZnNfdmFycyAqbGlzdCwKQEAgLTYxNSw3ICs2MjEsNiBAQAogCiAJbHByb2Nmc19zdGF0c191bmxvY2soc3RhdHMsIExQUk9DRlNfR0VUX05VTV9DUFUsICZmbGFncyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGxwcm9jZnNfc3RhdHNfY29sbGVjdCk7CiAKIC8qKgogICogQXBwZW5kIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY3VycmVudCBzZXQgZmxhZ3MgdG8gc3RyLgpAQCAtMTA0Myw3ICsxMDQ4LDYgQEAKIAl9CiAJcmV0dXJuIHJjOwogfQotRVhQT1JUX1NZTUJPTChscHJvY2ZzX3N0YXRzX2FsbG9jX29uZSk7CiAKIHN0cnVjdCBscHJvY2ZzX3N0YXRzICpscHJvY2ZzX2FsbG9jX3N0YXRzKHVuc2lnbmVkIGludCBudW0sCiAJCQkJCSAgZW51bSBscHJvY2ZzX3N0YXRzX2ZsYWdzIGZsYWdzKQpAQCAtMTU0Nyw2ICsxNTUxLDE0NiBAQAogfQogRVhQT1JUX1NZTUJPTChscHJvY2ZzX29oX2NsZWFyKTsKIAoraW50IGxwcm9jZnNfd3Jfcm9vdF9zcXVhc2goY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwKKwkJCSAgIHN0cnVjdCByb290X3NxdWFzaF9pbmZvICpzcXVhc2gsIGNoYXIgKm5hbWUpCit7CisJY2hhciBrZXJuYnVmWzY0XSwgKnRtcCwgKmVycm1zZzsKKwl1bnNpZ25lZCBsb25nIHVpZCwgZ2lkOworCWludCByYzsKKworCWlmIChjb3VudCA+PSBzaXplb2Yoa2VybmJ1ZikpIHsKKwkJZXJybXNnID0gInN0cmluZyB0b28gbG9uZyI7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsZWRfbm9wcmludDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKGtlcm5idWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCWVycm1zZyA9ICJiYWQgYWRkcmVzcyI7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBmYWlsZWRfbm9wcmludDsKKwl9CisJa2VybmJ1Zltjb3VudF0gPSAnXDAnOworCisJLyogbG9vayBmb3IgdWlkIGdpZCBzZXBhcmF0b3IgKi8KKwl0bXAgPSBzdHJjaHIoa2VybmJ1ZiwgJzonKTsKKwlpZiAoIXRtcCkgeworCQllcnJtc2cgPSAibmVlZHMgdWlkOmdpZCBmb3JtYXQiOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbGVkOworCX0KKwkqdG1wID0gJ1wwJzsKKwl0bXArKzsKKworCS8qIHBhcnNlIHVpZCAqLworCWlmIChrc3RydG91bChrZXJuYnVmLCAwLCAmdWlkKSAhPSAwKSB7CisJCWVycm1zZyA9ICJiYWQgdWlkIjsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxlZDsKKwl9CisJLyogcGFyc2UgZ2lkICovCisJaWYgKGtzdHJ0b3VsKHRtcCwgMCwgJmdpZCkgIT0gMCkgeworCQllcnJtc2cgPSAiYmFkIGdpZCI7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJc3F1YXNoLT5yc2lfdWlkID0gdWlkOworCXNxdWFzaC0+cnNpX2dpZCA9IGdpZDsKKworCUxDT05TT0xFX0lORk8oIiVzOiByb290X3NxdWFzaCBpcyBzZXQgdG8gJXU6JXVcbiIsCisJCSAgICAgIG5hbWUsIHNxdWFzaC0+cnNpX3VpZCwgc3F1YXNoLT5yc2lfZ2lkKTsKKwlyZXR1cm4gY291bnQ7CisKK2ZhaWxlZDoKKwlpZiAodG1wKSB7CisJCXRtcC0tOworCQkqdG1wID0gJzonOworCX0KKwlDV0FSTigiJXM6IGZhaWxlZCB0byBzZXQgcm9vdF9zcXVhc2ggdG8gXCIlc1wiLCAlcywgcmMgPSAlZFxuIiwKKwkgICAgICBuYW1lLCBrZXJuYnVmLCBlcnJtc2csIHJjKTsKKwlyZXR1cm4gcmM7CitmYWlsZWRfbm9wcmludDoKKwlDV0FSTigiJXM6IGZhaWxlZCB0byBzZXQgcm9vdF9zcXVhc2ggZHVlIHRvICVzLCByYyA9ICVkXG4iLAorCSAgICAgIG5hbWUsIGVycm1zZywgcmMpOworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wobHByb2Nmc193cl9yb290X3NxdWFzaCk7CisKK2ludCBscHJvY2ZzX3dyX25vc3F1YXNoX25pZHMoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwKKwkJCSAgICAgc3RydWN0IHJvb3Rfc3F1YXNoX2luZm8gKnNxdWFzaCwgY2hhciAqbmFtZSkKK3sKKwljaGFyICprZXJuYnVmID0gTlVMTCwgKmVycm1zZzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRtcDsKKwlpbnQgbGVuID0gY291bnQ7CisJaW50IHJjOworCisJaWYgKGNvdW50ID4gNDA5NikgeworCQllcnJtc2cgPSAic3RyaW5nIHRvbyBsb25nIjsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlrZXJuYnVmID0ga3phbGxvYyhjb3VudCArIDEsIEdGUF9OT0ZTKTsKKwlpZiAoIWtlcm5idWYpIHsKKwkJZXJybXNnID0gIm5vIG1lbW9yeSI7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKGtlcm5idWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCWVycm1zZyA9ICJiYWQgYWRkcmVzcyI7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBmYWlsZWQ7CisJfQorCWtlcm5idWZbY291bnRdID0gJ1wwJzsKKworCWlmIChjb3VudCA+IDAgJiYga2VybmJ1Zltjb3VudCAtIDFdID09ICdcbicpCisJCWxlbiA9IGNvdW50IC0gMTsKKworCWlmICgobGVuID09IDQgJiYgIXN0cm5jbXAoa2VybmJ1ZiwgIk5PTkUiLCBsZW4pKSB8fAorCSAgICAobGVuID09IDUgJiYgIXN0cm5jbXAoa2VybmJ1ZiwgImNsZWFyIiwgbGVuKSkpIHsKKwkJLyogZW1wdHkgc3RyaW5nIGlzIHNwZWNpYWwgY2FzZSAqLworCQlkb3duX3dyaXRlKCZzcXVhc2gtPnJzaV9zZW0pOworCQlpZiAoIWxpc3RfZW1wdHkoJnNxdWFzaC0+cnNpX25vc3F1YXNoX25pZHMpKQorCQkJY2ZzX2ZyZWVfbmlkbGlzdCgmc3F1YXNoLT5yc2lfbm9zcXVhc2hfbmlkcyk7CisJCXVwX3dyaXRlKCZzcXVhc2gtPnJzaV9zZW0pOworCQlMQ09OU09MRV9JTkZPKCIlczogbm9zcXVhc2hfbmlkcyBpcyBjbGVhcmVkXG4iLCBuYW1lKTsKKwkJa2ZyZWUoa2VybmJ1Zik7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmdG1wKTsKKwlpZiAoY2ZzX3BhcnNlX25pZGxpc3Qoa2VybmJ1ZiwgY291bnQsICZ0bXApIDw9IDApIHsKKwkJZXJybXNnID0gImNhbid0IHBhcnNlIjsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxlZDsKKwl9CisJTENPTlNPTEVfSU5GTygiJXM6IG5vc3F1YXNoX25pZHMgc2V0IHRvICVzXG4iLAorCQkgICAgICBuYW1lLCBrZXJuYnVmKTsKKwlrZnJlZShrZXJuYnVmKTsKKwlrZXJuYnVmID0gTlVMTDsKKworCWRvd25fd3JpdGUoJnNxdWFzaC0+cnNpX3NlbSk7CisJaWYgKCFsaXN0X2VtcHR5KCZzcXVhc2gtPnJzaV9ub3NxdWFzaF9uaWRzKSkKKwkJY2ZzX2ZyZWVfbmlkbGlzdCgmc3F1YXNoLT5yc2lfbm9zcXVhc2hfbmlkcyk7CisJbGlzdF9zcGxpY2UoJnRtcCwgJnNxdWFzaC0+cnNpX25vc3F1YXNoX25pZHMpOworCXVwX3dyaXRlKCZzcXVhc2gtPnJzaV9zZW0pOworCisJcmV0dXJuIGNvdW50OworCitmYWlsZWQ6CisJaWYgKGtlcm5idWYpIHsKKwkJQ1dBUk4oIiVzOiBmYWlsZWQgdG8gc2V0IG5vc3F1YXNoX25pZHMgdG8gXCIlc1wiLCAlcyByYyA9ICVkXG4iLAorCQkgICAgICBuYW1lLCBrZXJuYnVmLCBlcnJtc2csIHJjKTsKKwkJa2ZyZWUoa2VybmJ1Zik7CisJCWtlcm5idWYgPSBOVUxMOworCX0gZWxzZSB7CisJCUNXQVJOKCIlczogZmFpbGVkIHRvIHNldCBub3NxdWFzaF9uaWRzIGR1ZSB0byAlcyByYyA9ICVkXG4iLAorCQkgICAgICBuYW1lLCBlcnJtc2csIHJjKTsKKwl9CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChscHJvY2ZzX3dyX25vc3F1YXNoX25pZHMpOworCiBzdGF0aWMgc3NpemVfdCBsdXN0cmVfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1X29iamVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVfb2JqZWN0LmMKaW5kZXggOWIwMzA1OS4uMDU0ZTU2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVfb2JqZWN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVfb2JqZWN0LmMKQEAgLTU1LDYgKzU1LDM0IEBACiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdV9yZWYuaCIKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKK2VudW0geworCUxVX0NBQ0hFX1BFUkNFTlRfTUFYCSA9IDUwLAorCUxVX0NBQ0hFX1BFUkNFTlRfREVGQVVMVCA9IDIwCit9OworCisjZGVmaW5lIExVX0NBQ0hFX05SX01BWF9BREpVU1QJCTEyOAorI2RlZmluZSBMVV9DQUNIRV9OUl9VTkxJTUlURUQJCS0xCisjZGVmaW5lIExVX0NBQ0hFX05SX0RFRkFVTFQJCUxVX0NBQ0hFX05SX1VOTElNSVRFRAorI2RlZmluZSBMVV9DQUNIRV9OUl9MRElTS0ZTX0xJTUlUCUxVX0NBQ0hFX05SX1VOTElNSVRFRAorI2RlZmluZSBMVV9DQUNIRV9OUl9aRlNfTElNSVQJCTI1NgorCisjZGVmaW5lIExVX1NJVEVfQklUU19NSU4JMTIKKyNkZWZpbmUgTFVfU0lURV9CSVRTX01BWAkyNAorLyoqCisgKiB0b3RhbCAyNTYgYnVja2V0cywgd2UgZG9uJ3Qgd2FudCB0b28gbWFueSBidWNrZXRzIGJlY2F1c2U6CisgKiAtIGNvbnN1bWUgdG9vIG11Y2ggbWVtb3J5CisgKiAtIGF2b2lkIHVuYmFsYW5jZWQgTFJVIGxpc3QKKyAqLworI2RlZmluZSBMVV9TSVRFX0JLVF9CSVRTCTgKKworc3RhdGljIHVuc2lnbmVkIGludCBsdV9jYWNoZV9wZXJjZW50ID0gTFVfQ0FDSEVfUEVSQ0VOVF9ERUZBVUxUOworbW9kdWxlX3BhcmFtKGx1X2NhY2hlX3BlcmNlbnQsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGx1X2NhY2hlX3BlcmNlbnQsICJQZXJjZW50YWdlIG9mIG1lbW9yeSB0byBiZSB1c2VkIGFzIGx1X29iamVjdCBjYWNoZSIpOworCitzdGF0aWMgbG9uZyBsdV9jYWNoZV9uciA9IExVX0NBQ0hFX05SX0RFRkFVTFQ7Cittb2R1bGVfcGFyYW0obHVfY2FjaGVfbnIsIGxvbmcsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhsdV9jYWNoZV9uciwgIk1heGltdW0gbnVtYmVyIG9mIG9iamVjdHMgaW4gbHVfb2JqZWN0IGNhY2hlIik7CisKIHN0YXRpYyB2b2lkIGx1X29iamVjdF9mcmVlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGx1X29iamVjdCAqbyk7CiBzdGF0aWMgX191MzIgbHNfc3RhdHNfcmVhZChzdHJ1Y3QgbHByb2Nmc19zdGF0cyAqc3RhdHMsIGludCBpZHgpOwogCkBAIC0zMTAsMTAgKzMzOCwxMCBAQAogCXN0cnVjdCBjZnNfaGFzaF9iZAkgICAgYmQyOwogCXN0cnVjdCBsaXN0X2hlYWQJICAgICAgIGRpc3Bvc2U7CiAJaW50CQkgICAgICBkaWRfc3RoOwotCWludAkJICAgICAgc3RhcnQ7CisJdW5zaWduZWQgaW50IHN0YXJ0OwogCWludAkJICAgICAgY291bnQ7CiAJaW50CQkgICAgICBibnI7Ci0JaW50CQkgICAgICBpOworCXVuc2lnbmVkIGludCBpOwogCiAJaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX09CRF9OT19MUlUpKQogCQlyZXR1cm4gMDsKQEAgLTMyNCw4ICszNTIsMTMgQEAKIAkgKiB0aGUgZGlzcG9zZSBsaXN0LCByZW1vdmluZyB0aGVtIGZyb20gTFJVIGFuZCBoYXNoIHRhYmxlLgogCSAqLwogCXN0YXJ0ID0gcy0+bHNfcHVyZ2Vfc3RhcnQ7Ci0JYm5yID0gKG5yID09IH4wKSA/IC0xIDogbnIgLyBDRlNfSEFTSF9OQktUKHMtPmxzX29ial9oYXNoKSArIDE7CisJYm5yID0gKG5yID09IH4wKSA/IC0xIDogbnIgLyAoaW50KUNGU19IQVNIX05CS1Qocy0+bHNfb2JqX2hhc2gpICsgMTsKICBhZ2FpbjoKKwkvKgorCSAqIEl0IGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UgdG8gbWFrZSBwdXJnZSB0aHJlYWRzIHBhcmFsbGVsLCB0aGF0IGNhbgorCSAqIG9ubHkgYnJpbmcgdHJvdWJsZXMgdG8gdXMuIFNlZSBMVS01MzMxLgorCSAqLworCW11dGV4X2xvY2soJnMtPmxzX3B1cmdlX211dGV4KTsKIAlkaWRfc3RoID0gMDsKIAljZnNfaGFzaF9mb3JfZWFjaF9idWNrZXQocy0+bHNfb2JqX2hhc2gsICZiZCwgaSkgewogCQlpZiAoaSA8IHN0YXJ0KQpAQCAtMzcxLDYgKzQwNCw3IEBACiAJCWlmIChuciA9PSAwKQogCQkJYnJlYWs7CiAJfQorCW11dGV4X3VubG9jaygmcy0+bHNfcHVyZ2VfbXV0ZXgpOwogCiAJaWYgKG5yICE9IDAgJiYgZGlkX3N0aCAmJiBzdGFydCAhPSAwKSB7CiAJCXN0YXJ0ID0gMDsgLyogcmVzdGFydCBmcm9tIHRoZSBmaXJzdCBidWNrZXQgKi8KQEAgLTU3Myw2ICs2MDcsMjcgQEAKIAlyZXR1cm4gbHVfb2JqZWN0X2ZpbmRfYXQoZW52LCBkZXYtPmxkX3NpdGUtPmxzX3RvcF9kZXYsIGYsIGNvbmYpOwogfQogCisvKgorICogTGltaXQgdGhlIGx1X29iamVjdCBjYWNoZSB0byBhIG1heGltdW0gb2YgbHVfY2FjaGVfbnIgb2JqZWN0cy4gIEJlY2F1c2UKKyAqIHRoZSBjYWxjdWxhdGlvbiBmb3IgdGhlIG51bWJlciBvZiBvYmplY3RzIHRvIHJlY2xhaW0gaXMgbm90IGNvdmVyZWQgYnkKKyAqIGEgbG9jayB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb2JqZWN0cyBpcyBjYXBwZWQgYnkgTFVfQ0FDSEVfTUFYX0FESlVTVC4KKyAqIFRoaXMgZW5zdXJlcyB0aGF0IG1hbnkgY29uY3VycmVudCB0aHJlYWRzIHdpbGwgbm90IGFjY2lkZW50YWxseSBwdXJnZQorICogdGhlIGVudGlyZSBjYWNoZS4KKyAqLworc3RhdGljIHZvaWQgbHVfb2JqZWN0X2xpbWl0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGx1X2RldmljZSAqZGV2KQoreworCV9fdTY0IHNpemUsIG5yOworCisJaWYgKGx1X2NhY2hlX25yID09IExVX0NBQ0hFX05SX1VOTElNSVRFRCkKKwkJcmV0dXJuOworCisJc2l6ZSA9IGNmc19oYXNoX3NpemVfZ2V0KGRldi0+bGRfc2l0ZS0+bHNfb2JqX2hhc2gpOworCW5yID0gKF9fdTY0KWx1X2NhY2hlX25yOworCWlmIChzaXplID4gbnIpCisJCWx1X3NpdGVfcHVyZ2UoZW52LCBkZXYtPmxkX3NpdGUsCisJCQkgICAgICBtaW5fdChfX3U2NCwgc2l6ZSAtIG5yLCBMVV9DQUNIRV9OUl9NQVhfQURKVVNUKSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgbHVfb2JqZWN0ICpsdV9vYmplY3RfbmV3KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKIAkJCQkgICAgICAgc3RydWN0IGx1X2RldmljZSAqZGV2LAogCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmLApAQCAtNTkwLDYgKzY0NSw5IEBACiAJY2ZzX2hhc2hfYmRfZ2V0X2FuZF9sb2NrKGhzLCAodm9pZCAqKWYsICZiZCwgMSk7CiAJY2ZzX2hhc2hfYmRfYWRkX2xvY2tlZChocywgJmJkLCAmby0+bG9faGVhZGVyLT5sb2hfaGFzaCk7CiAJY2ZzX2hhc2hfYmRfdW5sb2NrKGhzLCAmYmQsIDEpOworCisJbHVfb2JqZWN0X2xpbWl0KGVudiwgZGV2KTsKKwogCXJldHVybiBvOwogfQogCkBAIC02NTYsNiArNzE0LDkgQEAKIAlpZiAobGlrZWx5KFBUUl9FUlIoc2hhZG93KSA9PSAtRU5PRU5UKSkgewogCQljZnNfaGFzaF9iZF9hZGRfbG9ja2VkKGhzLCAmYmQsICZvLT5sb19oZWFkZXItPmxvaF9oYXNoKTsKIAkJY2ZzX2hhc2hfYmRfdW5sb2NrKGhzLCAmYmQsIDEpOworCisJCWx1X29iamVjdF9saW1pdChlbnYsIGRldik7CisKIAkJcmV0dXJuIG87CiAJfQogCkBAIC03MDYsMTMgKzc2NywxNSBAQAogCXN0cnVjdCBsdV9vYmplY3QgKm9iajsKIAogCXRvcCA9IGx1X29iamVjdF9maW5kKGVudiwgZGV2LCBmLCBjb25mKTsKLQlpZiAoIUlTX0VSUih0b3ApKSB7Ci0JCW9iaiA9IGx1X29iamVjdF9sb2NhdGUodG9wLT5sb19oZWFkZXIsIGRldi0+bGRfdHlwZSk7Ci0JCWlmICghb2JqKQotCQkJbHVfb2JqZWN0X3B1dChlbnYsIHRvcCk7Ci0JfSBlbHNlIHsKLQkJb2JqID0gdG9wOworCWlmIChJU19FUlIodG9wKSkKKwkJcmV0dXJuIHRvcDsKKworCW9iaiA9IGx1X29iamVjdF9sb2NhdGUodG9wLT5sb19oZWFkZXIsIGRldi0+bGRfdHlwZSk7CisJaWYgKHVubGlrZWx5KCFvYmopKSB7CisJCWx1X29iamVjdF9wdXQoZW52LCB0b3ApOworCQlvYmogPSBFUlJfUFRSKC1FTk9FTlQpOwogCX0KKwogCXJldHVybiBvYmo7CiB9CiBFWFBPUlRfU1lNQk9MKGx1X29iamVjdF9maW5kX3NsaWNlKTsKQEAgLTcyNiwzNCArNzg5LDMxIEBACiB7CiAJaW50IHJlc3VsdCA9IDA7CiAKKwlhdG9taWNfc2V0KCZsZHQtPmxkdF9kZXZpY2VfbnIsIDApOwogCUlOSVRfTElTVF9IRUFEKCZsZHQtPmxkdF9saW5rYWdlKTsKIAlpZiAobGR0LT5sZHRfb3BzLT5sZHRvX2luaXQpCiAJCXJlc3VsdCA9IGxkdC0+bGR0X29wcy0+bGR0b19pbml0KGxkdCk7Ci0JaWYgKHJlc3VsdCA9PSAwKQorCisJaWYgKCFyZXN1bHQpIHsKKwkJc3Bpbl9sb2NrKCZvYmRfdHlwZXNfbG9jayk7CiAJCWxpc3RfYWRkKCZsZHQtPmxkdF9saW5rYWdlLCAmbHVfZGV2aWNlX3R5cGVzKTsKKwkJc3Bpbl91bmxvY2soJm9iZF90eXBlc19sb2NrKTsKKwl9CisKIAlyZXR1cm4gcmVzdWx0OwogfQogRVhQT1JUX1NZTUJPTChsdV9kZXZpY2VfdHlwZV9pbml0KTsKIAogdm9pZCBsdV9kZXZpY2VfdHlwZV9maW5pKHN0cnVjdCBsdV9kZXZpY2VfdHlwZSAqbGR0KQogeworCXNwaW5fbG9jaygmb2JkX3R5cGVzX2xvY2spOwogCWxpc3RfZGVsX2luaXQoJmxkdC0+bGR0X2xpbmthZ2UpOworCXNwaW5fdW5sb2NrKCZvYmRfdHlwZXNfbG9jayk7CiAJaWYgKGxkdC0+bGR0X29wcy0+bGR0b19maW5pKQogCQlsZHQtPmxkdF9vcHMtPmxkdG9fZmluaShsZHQpOwogfQogRVhQT1JUX1NZTUJPTChsdV9kZXZpY2VfdHlwZV9maW5pKTsKIAotdm9pZCBsdV90eXBlc19zdG9wKHZvaWQpCi17Ci0Jc3RydWN0IGx1X2RldmljZV90eXBlICpsZHQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxkdCwgJmx1X2RldmljZV90eXBlcywgbGR0X2xpbmthZ2UpIHsKLQkJaWYgKGxkdC0+bGR0X2RldmljZV9uciA9PSAwICYmIGxkdC0+bGR0X29wcy0+bGR0b19zdG9wKQotCQkJbGR0LT5sZHRfb3BzLT5sZHRvX3N0b3AobGR0KTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGx1X3R5cGVzX3N0b3ApOwotCiAvKioKICAqIEdsb2JhbCBsaXN0IG9mIGFsbCBzaXRlcyBvbiB0aGlzIG5vZGUKICAqLwpAQCAtODA4LDIyICs4NjgsMTQgQEAKIH0KIEVYUE9SVF9TWU1CT0wobHVfc2l0ZV9wcmludCk7CiAKLWVudW0gewotCUxVX0NBQ0hFX1BFUkNFTlRfTUFYICAgICA9IDUwLAotCUxVX0NBQ0hFX1BFUkNFTlRfREVGQVVMVCA9IDIwCi19OwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGx1X2NhY2hlX3BlcmNlbnQgPSBMVV9DQUNIRV9QRVJDRU5UX0RFRkFVTFQ7Ci1tb2R1bGVfcGFyYW0obHVfY2FjaGVfcGVyY2VudCwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MobHVfY2FjaGVfcGVyY2VudCwgIlBlcmNlbnRhZ2Ugb2YgbWVtb3J5IHRvIGJlIHVzZWQgYXMgbHVfb2JqZWN0IGNhY2hlIik7Ci0KIC8qKgogICogUmV0dXJuIGRlc2lyZWQgaGFzaCB0YWJsZSBvcmRlci4KICAqLwotc3RhdGljIGludCBsdV9odGFibGVfb3JkZXIodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGx1X2h0YWJsZV9vcmRlcihzdHJ1Y3QgbHVfZGV2aWNlICp0b3ApCiB7CisJdW5zaWduZWQgbG9uZyBiaXRzX21heCA9IExVX1NJVEVfQklUU19NQVg7CiAJdW5zaWduZWQgbG9uZyBjYWNoZV9zaXplOwotCWludCBiaXRzOworCXVuc2lnbmVkIGxvbmcgYml0czsKIAogCS8qCiAJICogQ2FsY3VsYXRlIGhhc2ggdGFibGUgc2l6ZSwgYXNzdW1pbmcgdGhhdCB3ZSB3YW50IHJlYXNvbmFibGUKQEAgLTg1NCw3ICs5MDYsNyBAQAogCWZvciAoYml0cyA9IDE7ICgxIDw8IGJpdHMpIDwgY2FjaGVfc2l6ZTsgKytiaXRzKSB7CiAJCTsKIAl9Ci0JcmV0dXJuIGJpdHM7CisJcmV0dXJuIGNsYW1wX3QodHlwZW9mKGJpdHMpLCBiaXRzLCBMVV9TSVRFX0JJVFNfTUlOLCBiaXRzX21heCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsdV9vYmpfaG9wX2hhc2goc3RydWN0IGNmc19oYXNoICpocywKQEAgLTkzMCwyOCArOTgyLDE4IEBACiAvKioKICAqIEluaXRpYWxpemUgc2l0ZSBcYSBzLCB3aXRoIFxhIGQgYXMgdGhlIHRvcCBsZXZlbCBkZXZpY2UuCiAgKi8KLSNkZWZpbmUgTFVfU0lURV9CSVRTX01JTiAgICAxMgotI2RlZmluZSBMVV9TSVRFX0JJVFNfTUFYICAgIDE5Ci0vKioKLSAqIHRvdGFsIDI1NiBidWNrZXRzLCB3ZSBkb24ndCB3YW50IHRvbyBtYW55IGJ1Y2tldHMgYmVjYXVzZToKLSAqIC0gY29uc3VtZSB0b28gbXVjaCBtZW1vcnkKLSAqIC0gYXZvaWQgdW5iYWxhbmNlZCBMUlUgbGlzdAotICovCi0jZGVmaW5lIExVX1NJVEVfQktUX0JJVFMgICAgOAotCiBpbnQgbHVfc2l0ZV9pbml0KHN0cnVjdCBsdV9zaXRlICpzLCBzdHJ1Y3QgbHVfZGV2aWNlICp0b3ApCiB7CiAJc3RydWN0IGx1X3NpdGVfYmt0X2RhdGEgKmJrdDsKIAlzdHJ1Y3QgY2ZzX2hhc2hfYmQgYmQ7CisJdW5zaWduZWQgbG9uZyBiaXRzOworCXVuc2lnbmVkIGxvbmcgaTsKIAljaGFyIG5hbWVbMTZdOwotCWludCBiaXRzOwotCWludCBpOwogCiAJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOwotCWJpdHMgPSBsdV9odGFibGVfb3JkZXIoKTsKLQlzbnByaW50ZihuYW1lLCAxNiwgImx1X3NpdGVfJXMiLCB0b3AtPmxkX3R5cGUtPmxkdF9uYW1lKTsKLQlmb3IgKGJpdHMgPSBtaW4obWF4KExVX1NJVEVfQklUU19NSU4sIGJpdHMpLCBMVV9TSVRFX0JJVFNfTUFYKTsKLQkgICAgIGJpdHMgPj0gTFVfU0lURV9CSVRTX01JTjsgYml0cy0tKSB7CisJbXV0ZXhfaW5pdCgmcy0+bHNfcHVyZ2VfbXV0ZXgpOworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImx1X3NpdGVfJXMiLCB0b3AtPmxkX3R5cGUtPmxkdF9uYW1lKTsKKwlmb3IgKGJpdHMgPSBsdV9odGFibGVfb3JkZXIodG9wKTsgYml0cyA+PSBMVV9TSVRFX0JJVFNfTUlOOyBiaXRzLS0pIHsKIAkJcy0+bHNfb2JqX2hhc2ggPSBjZnNfaGFzaF9jcmVhdGUobmFtZSwgYml0cywgYml0cywKIAkJCQkJCSBiaXRzIC0gTFVfU0lURV9CS1RfQklUUywKIAkJCQkJCSBzaXplb2YoKmJrdCksIDAsIDAsCkBAIC05NTksMTMgKzEwMDEsMTQgQEAKIAkJCQkJCSBDRlNfSEFTSF9TUElOX0JLVExPQ0sgfAogCQkJCQkJIENGU19IQVNIX05PX0lURU1SRUYgfAogCQkJCQkJIENGU19IQVNIX0RFUFRIIHwKLQkJCQkJCSBDRlNfSEFTSF9BU1NFUlRfRU1QVFkpOworCQkJCQkJIENGU19IQVNIX0FTU0VSVF9FTVBUWSB8CisJCQkJCQkgQ0ZTX0hBU0hfQ09VTlRFUik7CiAJCWlmIChzLT5sc19vYmpfaGFzaCkKIAkJCWJyZWFrOwogCX0KIAogCWlmICghcy0+bHNfb2JqX2hhc2gpIHsKLQkJQ0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIGx1X3NpdGUgaGFzaCB3aXRoIGJpdHM6ICVkXG4iLCBiaXRzKTsKKwkJQ0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIGx1X3NpdGUgaGFzaCB3aXRoIGJpdHM6ICVsdVxuIiwgYml0cyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTA4Miw4ICsxMTI1LDEwIEBACiAgKi8KIGludCBsdV9kZXZpY2VfaW5pdChzdHJ1Y3QgbHVfZGV2aWNlICpkLCBzdHJ1Y3QgbHVfZGV2aWNlX3R5cGUgKnQpCiB7Ci0JaWYgKHQtPmxkdF9kZXZpY2VfbnIrKyA9PSAwICYmIHQtPmxkdF9vcHMtPmxkdG9fc3RhcnQpCisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZ0LT5sZHRfZGV2aWNlX25yKSA9PSAxICYmCisJICAgIHQtPmxkdF9vcHMtPmxkdG9fc3RhcnQpCiAJCXQtPmxkdF9vcHMtPmxkdG9fc3RhcnQodCk7CisKIAltZW1zZXQoZCwgMCwgc2l6ZW9mKCpkKSk7CiAJYXRvbWljX3NldCgmZC0+bGRfcmVmLCAwKTsKIAlkLT5sZF90eXBlID0gdDsKQEAgLTEwOTgsOSArMTE0Myw4IEBACiAgKi8KIHZvaWQgbHVfZGV2aWNlX2Zpbmkoc3RydWN0IGx1X2RldmljZSAqZCkKIHsKLQlzdHJ1Y3QgbHVfZGV2aWNlX3R5cGUgKnQ7CisJc3RydWN0IGx1X2RldmljZV90eXBlICp0ID0gZC0+bGRfdHlwZTsKIAotCXQgPSBkLT5sZF90eXBlOwogCWlmIChkLT5sZF9vYmQpIHsKIAkJZC0+bGRfb2JkLT5vYmRfbHVfZGV2ID0gTlVMTDsKIAkJZC0+bGRfb2JkID0gTlVMTDsKQEAgLTExMDksOCArMTE1MywxMCBAQAogCWx1X3JlZl9maW5pKCZkLT5sZF9yZWZlcmVuY2UpOwogCUxBU1NFUlRGKGF0b21pY19yZWFkKCZkLT5sZF9yZWYpID09IDAsCiAJCSAiUmVmY291bnQgaXMgJXVcbiIsIGF0b21pY19yZWFkKCZkLT5sZF9yZWYpKTsKLQlMQVNTRVJUKHQtPmxkdF9kZXZpY2VfbnIgPiAwKTsKLQlpZiAoLS10LT5sZHRfZGV2aWNlX25yID09IDAgJiYgdC0+bGR0X29wcy0+bGR0b19zdG9wKQorCUxBU1NFUlQoYXRvbWljX3JlYWQoJnQtPmxkdF9kZXZpY2VfbnIpID4gMCk7CisKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdC0+bGR0X2RldmljZV9ucikgJiYKKwkgICAgdC0+bGR0X29wcy0+bGR0b19zdG9wKQogCQl0LT5sZHRfb3BzLT5sZHRvX3N0b3AodCk7CiB9CiBFWFBPUlRfU1lNQk9MKGx1X2RldmljZV9maW5pKTsKQEAgLTEyNTQsNyArMTMwMCw2IEBACiAJCX0KIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1X3N0YWNrX2ZpbmkpOwogCiBlbnVtIHsKIAkvKioKQEAgLTEyODEsNyArMTMyNiw3IEBACiBpbnQgbHVfY29udGV4dF9rZXlfcmVnaXN0ZXIoc3RydWN0IGx1X2NvbnRleHRfa2V5ICprZXkpCiB7CiAJaW50IHJlc3VsdDsKLQlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaTsKIAogCUxBU1NFUlQoa2V5LT5sY3RfaW5pdCk7CiAJTEFTU0VSVChrZXktPmxjdF9maW5pKTsKQEAgLTE0NzYsMTggKzE1MjEsMTYgQEAKIAkJKytrZXlfc2V0X3ZlcnNpb247CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdV9jb250ZXh0X2tleV9xdWllc2NlKTsKIAogdm9pZCBsdV9jb250ZXh0X2tleV9yZXZpdmUoc3RydWN0IGx1X2NvbnRleHRfa2V5ICprZXkpCiB7CiAJa2V5LT5sY3RfdGFncyAmPSB+TENUX1FVSUVTQ0VOVDsKIAkrK2tleV9zZXRfdmVyc2lvbjsKIH0KLUVYUE9SVF9TWU1CT0wobHVfY29udGV4dF9rZXlfcmV2aXZlKTsKIAogc3RhdGljIHZvaWQga2V5c19maW5pKHN0cnVjdCBsdV9jb250ZXh0ICpjdHgpCiB7Ci0JaW50CWk7CisJdW5zaWduZWQgaW50IGk7CiAKIAlpZiAoIWN0eC0+bGNfdmFsdWUpCiAJCXJldHVybjsKQEAgLTE1MDEsNyArMTU0NCw3IEBACiAKIHN0YXRpYyBpbnQga2V5c19maWxsKHN0cnVjdCBsdV9jb250ZXh0ICpjdHgpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IGk7CiAKIAlMSU5WUk5UKGN0eC0+bGNfdmFsdWUpOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGx1X2tleXMpOyArK2kpIHsKQEAgLTE2MTQsNyArMTY1Nyw3IEBACiAgKi8KIHZvaWQgbHVfY29udGV4dF9leGl0KHN0cnVjdCBsdV9jb250ZXh0ICpjdHgpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IGk7CiAKIAlMSU5WUk5UKGN0eC0+bGNfc3RhdGUgPT0gTENTX0VOVEVSRUQpOwogCWN0eC0+bGNfc3RhdGUgPSBMQ1NfTEVGVDsKQEAgLTE2NDIsNyArMTY4NSw2IEBACiB7CiAJcmV0dXJuIGxpa2VseShjdHgtPmxjX3ZlcnNpb24gPT0ga2V5X3NldF92ZXJzaW9uKSA/IDAgOiBrZXlzX2ZpbGwoY3R4KTsKIH0KLUVYUE9SVF9TWU1CT0wobHVfY29udGV4dF9yZWZpbGwpOwogCiAvKioKICAqIGx1X2N0eF90YWdzL2x1X3Nlc190YWdzIHdpbGwgYmUgdXBkYXRlZCBpZiB0aGVyZSBhcmUgbmV3IHR5cGVzIG9mCkBAIC0xNjk2LDcgKzE3MzgsNyBAQAogCQkJICAgICAgc3RydWN0IGx1X3NpdGVfc3RhdHMgKnN0YXRzLCBpbnQgcG9wdWxhdGVkKQogewogCXN0cnVjdCBjZnNfaGFzaF9iZCBiZDsKLQlpbnQJICAgaTsKKwl1bnNpZ25lZCBpbnQgaTsKIAogCWNmc19oYXNoX2Zvcl9lYWNoX2J1Y2tldChocywgJmJkLCBpKSB7CiAJCXN0cnVjdCBsdV9zaXRlX2JrdF9kYXRhICpia3QgPSBjZnNfaGFzaF9iZF9leHRyYV9nZXQoaHMsICZiZCk7CkBAIC0xOTQwLDMgKzE5ODIsNzMgQEAKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKGx1X2ttZW1fZmluaSk7CisKK3ZvaWQgbHVfYnVmX2ZyZWUoc3RydWN0IGx1X2J1ZiAqYnVmKQoreworCUxBU1NFUlQoYnVmKTsKKwlpZiAoYnVmLT5sYl9idWYpIHsKKwkJTEFTU0VSVChidWYtPmxiX2xlbiA+IDApOworCQlrdmZyZWUoYnVmLT5sYl9idWYpOworCQlidWYtPmxiX2J1ZiA9IE5VTEw7CisJCWJ1Zi0+bGJfbGVuID0gMDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGx1X2J1Zl9mcmVlKTsKKwordm9pZCBsdV9idWZfYWxsb2Moc3RydWN0IGx1X2J1ZiAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlMQVNTRVJUKGJ1Zik7CisJTEFTU0VSVCghYnVmLT5sYl9idWYpOworCUxBU1NFUlQoIWJ1Zi0+bGJfbGVuKTsKKwlidWYtPmxiX2J1ZiA9IGxpYmNmc19rdnphbGxvYyhzaXplLCBHRlBfTk9GUyk7CisJaWYgKGxpa2VseShidWYtPmxiX2J1ZikpCisJCWJ1Zi0+bGJfbGVuID0gc2l6ZTsKK30KK0VYUE9SVF9TWU1CT0wobHVfYnVmX2FsbG9jKTsKKwordm9pZCBsdV9idWZfcmVhbGxvYyhzdHJ1Y3QgbHVfYnVmICpidWYsIHNpemVfdCBzaXplKQoreworCWx1X2J1Zl9mcmVlKGJ1Zik7CisJbHVfYnVmX2FsbG9jKGJ1Ziwgc2l6ZSk7Cit9CitFWFBPUlRfU1lNQk9MKGx1X2J1Zl9yZWFsbG9jKTsKKworc3RydWN0IGx1X2J1ZiAqbHVfYnVmX2NoZWNrX2FuZF9hbGxvYyhzdHJ1Y3QgbHVfYnVmICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKCFidWYtPmxiX2J1ZiAmJiAhYnVmLT5sYl9sZW4pCisJCWx1X2J1Zl9hbGxvYyhidWYsIGxlbik7CisKKwlpZiAoKGxlbiA+IGJ1Zi0+bGJfbGVuKSAmJiBidWYtPmxiX2J1ZikKKwkJbHVfYnVmX3JlYWxsb2MoYnVmLCBsZW4pOworCisJcmV0dXJuIGJ1ZjsKK30KK0VYUE9SVF9TWU1CT0wobHVfYnVmX2NoZWNrX2FuZF9hbGxvYyk7CisKKy8qKgorICogSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIFxhIGJ1Zi4KKyAqIHByZXNlcnZlcyBvbGQgZGF0YSBpbiBidWZmZXIKKyAqIG9sZCBidWZmZXIgcmVtYWlucyB1bmNoYW5nZWQgb24gZXJyb3IKKyAqIFxyZXR2YWwgMCBvciAtRU5PTUVNCisgKi8KK2ludCBsdV9idWZfY2hlY2tfYW5kX2dyb3coc3RydWN0IGx1X2J1ZiAqYnVmLCBzaXplX3QgbGVuKQoreworCWNoYXIgKnB0cjsKKworCWlmIChsZW4gPD0gYnVmLT5sYl9sZW4pCisJCXJldHVybiAwOworCisJcHRyID0gbGliY2ZzX2t2emFsbG9jKGxlbiwgR0ZQX05PRlMpOworCWlmICghcHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEZyZWUgdGhlIG9sZCBidWYgKi8KKwlpZiAoYnVmLT5sYl9idWYpIHsKKwkJbWVtY3B5KHB0ciwgYnVmLT5sYl9idWYsIGJ1Zi0+bGJfbGVuKTsKKwkJa3ZmcmVlKGJ1Zi0+bGJfYnVmKTsKKwl9CisKKwlidWYtPmxiX2J1ZiA9IHB0cjsKKwlidWYtPmxiX2xlbiA9IGxlbjsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1c3RyZV9oYW5kbGVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sdXN0cmVfaGFuZGxlcy5jCmluZGV4IDA4MmY1MzAuLmM5NDQ1ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1c3RyZV9oYW5kbGVzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVzdHJlX2hhbmRsZXMuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNsYXNzX2hhbmRsZV91bmhhc2gpOwogCi12b2lkICpjbGFzc19oYW5kbGUyb2JqZWN0KF9fdTY0IGNvb2tpZSkKK3ZvaWQgKmNsYXNzX2hhbmRsZTJvYmplY3QoX191NjQgY29va2llLCBjb25zdCB2b2lkICpvd25lcikKIHsKIAlzdHJ1Y3QgaGFuZGxlX2J1Y2tldCAqYnVja2V0OwogCXN0cnVjdCBwb3J0YWxzX2hhbmRsZSAqaDsKQEAgLTE0NSw3ICsxNDUsNyBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGgsICZidWNrZXQtPmhlYWQsIGhfbGluaykgewotCQlpZiAoaC0+aF9jb29raWUgIT0gY29va2llKQorCQlpZiAoaC0+aF9jb29raWUgIT0gY29va2llIHx8IGgtPmhfb3duZXIgIT0gb3duZXIpCiAJCQljb250aW51ZTsKIAogCQlzcGluX2xvY2soJmgtPmhfbG9jayk7CkBAIC0xNjQsOCArMTY0LDExIEBACiAKIHZvaWQgY2xhc3NfaGFuZGxlX2ZyZWVfY2Ioc3RydWN0IHJjdV9oZWFkICpyY3UpCiB7Ci0Jc3RydWN0IHBvcnRhbHNfaGFuZGxlICpoID0gUkNVMkhBTkRMRShyY3UpOwotCXZvaWQgKnB0ciA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpaC0+aF9jb29raWU7CisJc3RydWN0IHBvcnRhbHNfaGFuZGxlICpoOworCXZvaWQgKnB0cjsKKworCWggPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgcG9ydGFsc19oYW5kbGUsIGhfcmN1KTsKKwlwdHIgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWgtPmhfY29va2llOwogCiAJaWYgKGgtPmhfb3BzLT5ob3BfZnJlZSkKIAkJaC0+aF9vcHMtPmhvcF9mcmVlKHB0ciwgaC0+aF9zaXplKTsKQEAgLTIxNCw3ICsyMTcsNyBAQAogCQlzdHJ1Y3QgcG9ydGFsc19oYW5kbGUgKmg7CiAKIAkJc3Bpbl9sb2NrKCZoYW5kbGVfaGFzaFtpXS5sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaCwgJihoYW5kbGVfaGFzaFtpXS5oZWFkKSwgaF9saW5rKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGgsICZoYW5kbGVfaGFzaFtpXS5oZWFkLCBoX2xpbmspIHsKIAkJCUNFUlJPUigiZm9yY2UgY2xlYW4gaGFuZGxlICUjbGx4IGFkZHIgJXAgb3BzICVwXG4iLAogCQkJICAgICAgIGgtPmhfY29va2llLCBoLCBoLT5oX29wcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1c3RyZV9wZWVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sdXN0cmVfcGVlci5jCmluZGV4IDU5NzRhOWIuLmZmYTc0MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1c3RyZV9wZWVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVzdHJlX3BlZXIuYwpAQCAtMTM5LDcgKzEzOSw2IEBACiAJfQogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChjbGFzc19hZGRfdXVpZCk7CiAKIC8qIERlbGV0ZSB0aGUgbmlkcyBmb3Igb25lIHV1aWQgaWYgc3BlY2lmaWVkLCBvdGhlcndpc2UgZGVsZXRlIGFsbCAqLwogaW50IGNsYXNzX2RlbF91dWlkKGNvbnN0IGNoYXIgKnV1aWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRfY29uZmlnLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRfY29uZmlnLmMKaW5kZXggMGVhYjEyMy4uYmJlZDFiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2JkX2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9jb25maWcuYwpAQCAtMzcsNiArMzcsNyBAQAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19DTEFTUwogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX2NsYXNzLmgiCiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lvY3RsLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbG9nLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX3BhcmFtLmgiCkBAIC0yMzcsNyArMjM4LDcgQEAKIAkvKiByZWNvdmVyeSBkYXRhICovCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmb2JkLT5vYmRfZXZpY3RfaW5wcm9ncmVzc193YWl0cSk7CiAKLQlsbG9nX2dyb3VwX2luaXQoJm9iZC0+b2JkX29sZywgRklEX1NFUV9MTE9HKTsKKwlsbG9nX2dyb3VwX2luaXQoJm9iZC0+b2JkX29sZyk7CiAKIAlvYmQtPm9iZF9jb25uX2lucHJvZ3Jlc3MgPSAwOwogCkBAIC0yNTAsMTUgKzI1MSw2IEBACiAJfQogCW1lbWNweShvYmQtPm9iZF91dWlkLnV1aWQsIHV1aWQsIGxlbik7CiAKLQkvKiBkbyB0aGUgYXR0YWNoICovCi0JaWYgKE9CUChvYmQsIGF0dGFjaCkpIHsKLQkJcmMgPSBPQlAob2JkLCBhdHRhY2gpKG9iZCwgc2l6ZW9mKCpsY2ZnKSwgbGNmZyk7Ci0JCWlmIChyYykgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KIAkvKiBEZXRhY2ggZHJvcHMgdGhpcyAqLwogCXNwaW5fbG9jaygmb2JkLT5vYmRfZGV2X2xvY2spOwogCWF0b21pY19zZXQoJm9iZC0+b2JkX3JlZmNvdW50LCAxKTsKQEAgLTQyMiwxNyArNDE0LDEyIEBACiAJfQogCS8qIExlYXZlIHRoaXMgb24gZm9yZXZlciAqLwogCW9iZC0+b2JkX3N0b3BwaW5nID0gMTsKLQotCS8qIHdhaXQgZm9yIGFscmVhZHktYXJyaXZlZC1jb25uZWN0aW9ucyB0byBmaW5pc2guICovCi0Jd2hpbGUgKG9iZC0+b2JkX2Nvbm5faW5wcm9ncmVzcyA+IDApIHsKLQkJc3Bpbl91bmxvY2soJm9iZC0+b2JkX2Rldl9sb2NrKTsKLQotCQljb25kX3Jlc2NoZWQoKTsKLQotCQlzcGluX2xvY2soJm9iZC0+b2JkX2Rldl9sb2NrKTsKLQl9CiAJc3Bpbl91bmxvY2soJm9iZC0+b2JkX2Rldl9sb2NrKTsKIAorCXdoaWxlIChvYmQtPm9iZF9jb25uX2lucHJvZ3Jlc3MgPiAwKQorCQl5aWVsZCgpOworCXNtcF9ybWIoKTsKKwogCWlmIChsY2ZnLT5sY2ZnX2J1ZmNvdW50ID49IDIgJiYgTFVTVFJFX0NGR19CVUZMRU4obGNmZywgMSkgPiAwKSB7CiAJCWZvciAoZmxhZyA9IGx1c3RyZV9jZmdfc3RyaW5nKGxjZmcsIDEpOyAqZmxhZyAhPSAwOyBmbGFnKyspCiAJCQlzd2l0Y2ggKCpmbGFnKSB7CkBAIC01MjYsMTEgKzUxMyw2IEBACiAJCQkJQ0VSUk9SKCJDbGVhbnVwICVzIHJldHVybmVkICVkXG4iLAogCQkJCSAgICAgICBvYmQtPm9iZF9uYW1lLCBlcnIpOwogCQl9Ci0JCWlmIChPQlAob2JkLCBkZXRhY2gpKSB7Ci0JCQllcnIgPSBPQlAob2JkLCBkZXRhY2gpKG9iZCk7Ci0JCQlpZiAoZXJyKQotCQkJCUNFUlJPUigiRGV0YWNoIHJldHVybmVkICVkXG4iLCBlcnIpOwotCQl9CiAJCWNsYXNzX3JlbGVhc2VfZGV2KG9iZCk7CiAJfQogfQpAQCAtNzU2LDcgKzczOCw3IEBACiAJfQogCiAJc3RhcnQgPSBrdGltZV9nZXQoKTsKLQlyYyA9IGNhbGxfdXNlcm1vZGVoZWxwZXIoYXJndlswXSwgYXJndiwgTlVMTCwgMSk7CisJcmMgPSBjYWxsX3VzZXJtb2RlaGVscGVyKGFyZ3ZbMF0sIGFyZ3YsIE5VTEwsIFVNSF9XQUlUX1BST0MpOwogCWVuZCA9IGt0aW1lX2dldCgpOwogCiAJaWYgKHJjIDwgMCkgewpAQCAtMTAyNiw3ICsxMDA4LDcgQEAKIAogCQkJCQlvbGRmcyA9IGdldF9mcygpOwogCQkJCQlzZXRfZnMoS0VSTkVMX0RTKTsKLQkJCQkJcmMgPSAodmFyLT5mb3BzLT53cml0ZSkoJmZha2VmaWxlLCBzdmFsLAorCQkJCQlyYyA9IHZhci0+Zm9wcy0+d3JpdGUoJmZha2VmaWxlLCBzdmFsLAogCQkJCQkJCQl2YWxsZW4sIE5VTEwpOwogCQkJCQlzZXRfZnMob2xkZnMpOwogCQkJCX0KQEAgLTEwNjAsOCArMTA0Miw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNsYXNzX3Byb2Nlc3NfcHJvY19wYXJhbSk7CiAKLWV4dGVybiBpbnQgbHVzdHJlX2NoZWNrX2V4Y2x1c2lvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpzdm5hbWUpOwotCiAvKiogUGFyc2UgYSBjb25maWd1cmF0aW9uIGxsb2csIGRvaW5nIHZhcmlvdXMgbWFuaXB1bGF0aW9ucyBvbiB0aGVtCiAgKiBmb3IgdmFyaW91cyByZWFzb25zLCAobW9kaWZpY2F0aW9ucyBmb3IgY29tcGF0aWJpbGl0eSwgc2tpcCBvYnNvbGV0ZQogICogcmVjb3JkcywgY2hhbmdlIHV1aWRzLCBldGMpLCB0aGVuIGNsYXNzX3Byb2Nlc3NfY29uZmlnKCkgcmVzdWx0aW5nCkBAIC0xMzE3LDMzICsxMjk3LDMzIEBACiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCi0JcHRyICs9IHNucHJpbnRmKHB0ciwgZW5kLXB0ciwgImNtZD0lMDV4ICIsIGxjZmctPmxjZmdfY29tbWFuZCk7CisJcHRyICs9IHNucHJpbnRmKHB0ciwgZW5kIC0gcHRyLCAiY21kPSUwNXggIiwgbGNmZy0+bGNmZ19jb21tYW5kKTsKIAlpZiAobGNmZy0+bGNmZ19mbGFncykKLQkJcHRyICs9IHNucHJpbnRmKHB0ciwgZW5kLXB0ciwgImZsYWdzPSUjMDh4ICIsCisJCXB0ciArPSBzbnByaW50ZihwdHIsIGVuZCAtIHB0ciwgImZsYWdzPSUjMDh4ICIsCiAJCQkJbGNmZy0+bGNmZ19mbGFncyk7CiAKIAlpZiAobGNmZy0+bGNmZ19udW0pCi0JCXB0ciArPSBzbnByaW50ZihwdHIsIGVuZC1wdHIsICJudW09JSMwOHggIiwgbGNmZy0+bGNmZ19udW0pOworCQlwdHIgKz0gc25wcmludGYocHRyLCBlbmQgLSBwdHIsICJudW09JSMwOHggIiwgbGNmZy0+bGNmZ19udW0pOwogCiAJaWYgKGxjZmctPmxjZmdfbmlkKSB7CiAJCWNoYXIgbmlkc3RyW0xORVRfTklEU1RSX1NJWkVdOwogCiAJCWxpYmNmc19uaWQyc3RyX3IobGNmZy0+bGNmZ19uaWQsIG5pZHN0ciwgc2l6ZW9mKG5pZHN0cikpOwotCQlwdHIgKz0gc25wcmludGYocHRyLCBlbmQtcHRyLCAibmlkPSVzKCUjbGx4KVxuICAgICAiLAorCQlwdHIgKz0gc25wcmludGYocHRyLCBlbmQgLSBwdHIsICJuaWQ9JXMoJSNsbHgpXG4gICAgICIsCiAJCQkJbmlkc3RyLCBsY2ZnLT5sY2ZnX25pZCk7CiAJfQogCiAJaWYgKGxjZmctPmxjZmdfY29tbWFuZCA9PSBMQ0ZHX01BUktFUikgewogCQlzdHJ1Y3QgY2ZnX21hcmtlciAqbWFya2VyID0gbHVzdHJlX2NmZ19idWYobGNmZywgMSk7CiAKLQkJcHRyICs9IHNucHJpbnRmKHB0ciwgZW5kLXB0ciwgIm1hcmtlcj0lZCglI3gpJXMgJyVzJyIsCisJCXB0ciArPSBzbnByaW50ZihwdHIsIGVuZCAtIHB0ciwgIm1hcmtlcj0lZCglI3gpJXMgJyVzJyIsCiAJCQkJbWFya2VyLT5jbV9zdGVwLCBtYXJrZXItPmNtX2ZsYWdzLAogCQkJCW1hcmtlci0+Y21fdGd0bmFtZSwgbWFya2VyLT5jbV9jb21tZW50KTsKIAl9IGVsc2UgewogCQlpbnQgaTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgIGxjZmctPmxjZmdfYnVmY291bnQ7IGkrKykgewotCQkJcHRyICs9IHNucHJpbnRmKHB0ciwgZW5kLXB0ciwgIiVkOiVzICAiLCBpLAorCQkJcHRyICs9IHNucHJpbnRmKHB0ciwgZW5kIC0gcHRyLCAiJWQ6JXMgICIsIGksCiAJCQkJCWx1c3RyZV9jZmdfc3RyaW5nKGxjZmcsIGkpKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9tb3VudC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2JkX21vdW50LmMKaW5kZXggYWE4NGE1MGUuLjBkM2EzYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9tb3VudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9tb3VudC5jCkBAIC0zNywxMSArMzcsMTEgQEAKICAqLwogCiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0NMQVNTCi0jZGVmaW5lIERfTU9VTlQgKERfU1VQRVJ8RF9DT05GSUcvKnxEX1dBUk5JTkcgKi8pCisjZGVmaW5lIERfTU9VTlQgKERfU1VQRVIgfCBEX0NPTkZJRy8qfERfV0FSTklORyAqLykKICNkZWZpbmUgUFJJTlRfQ01EIENERUJVRwogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmQuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2xpbnV4L2x1c3RyZV9jb21wYXQyNS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2NvbXBhdC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX2NsYXNzLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX3VzZXIuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9sb2cuaCIKQEAgLTY4LDcgKzY4LDcgQEAKICAqICAgdGhpcyBsb2csIGFuZCBpcyBhZGRlZCB0byB0aGUgbWdjJ3MgbGlzdCBvZiBsb2dzIHRvIGZvbGxvdy4KICAqLwogaW50IGx1c3RyZV9wcm9jZXNzX2xvZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpsb2duYW1lLAotCQkgICAgICBzdHJ1Y3QgY29uZmlnX2xsb2dfaW5zdGFuY2UgKmNmZykKKwkJICAgICAgIHN0cnVjdCBjb25maWdfbGxvZ19pbnN0YW5jZSAqY2ZnKQogewogCXN0cnVjdCBsdXN0cmVfY2ZnICpsY2ZnOwogCXN0cnVjdCBsdXN0cmVfY2ZnX2J1ZnMgKmJ1ZnM7CkBAIC0zODQsMTcgKzM4NCwxNSBAQAogCQkJCSAgT0JEX0NPTk5FQ1RfRlVMTDIwIHwgT0JEX0NPTk5FQ1RfSU1QX1JFQ09WIHwKIAkJCQkgIE9CRF9DT05ORUNUX0xWQl9UWVBFOwogCi0jaWYgTFVTVFJFX1ZFUlNJT05fQ09ERSA8IE9CRF9PQ0RfVkVSU0lPTigzLCAyLCA1MCwgMCkKKyNpZiBPQkRfT0NEX1ZFUlNJT04oMywgMCwgNTMsIDApID4gTFVTVFJFX1ZFUlNJT05fQ09ERQogCWRhdGEtPm9jZF9jb25uZWN0X2ZsYWdzIHw9IE9CRF9DT05ORUNUX01ORV9TV0FCOwotI2Vsc2UKLSN3YXJuaW5nICJMVS0xNjQ0OiBSZW1vdmUgb2xkIE9CRF9DT05ORUNUX01ORV9TV0FCIGZpeHVwIGFuZCBpbXBfbmVlZF9tbmVfc3dhYiIKICNlbmRpZgogCiAJaWYgKGxtZF9pc19jbGllbnQobHNpLT5sc2lfbG1kKSAmJgogCSAgICBsc2ktPmxzaV9sbWQtPmxtZF9mbGFncyAmIExNRF9GTEdfTk9JUikKIAkJZGF0YS0+b2NkX2Nvbm5lY3RfZmxhZ3MgJj0gfk9CRF9DT05ORUNUX0lNUF9SRUNPVjsKIAlkYXRhLT5vY2RfdmVyc2lvbiA9IExVU1RSRV9WRVJTSU9OX0NPREU7Ci0JcmMgPSBvYmRfY29ubmVjdChOVUxMLCAmZXhwLCBvYmQsICYob2JkLT5vYmRfdXVpZCksIGRhdGEsIE5VTEwpOworCXJjID0gb2JkX2Nvbm5lY3QoTlVMTCwgJmV4cCwgb2JkLCAmb2JkLT5vYmRfdXVpZCwgZGF0YSwgTlVMTCk7CiAJaWYgKHJjKSB7CiAJCUNFUlJPUigiY29ubmVjdCBmYWlsZWQgJWRcbiIsIHJjKTsKIAkJZ290byBvdXQ7CkBAIC02NzAsNyArNjY4LDYgQEAKIAl9CiAJLyogRHJvcCBhIHJlZiB0byB0aGUgbW91bnRlZCBkaXNrICovCiAJbHVzdHJlX3B1dF9sc2koc2IpOwotCWx1X3R5cGVzX3N0b3AoKTsKIAlyZXR1cm4gcmM7CiB9CiBFWFBPUlRfU1lNQk9MKGx1c3RyZV9jb21tb25fcHV0X3N1cGVyKTsKQEAgLTczMSw3ICs3MjgsNyBAQAogc3RhdGljIGludCBsbWRfbWFrZV9leGNsdXNpb24oc3RydWN0IGx1c3RyZV9tb3VudF9kYXRhICpsbWQsIGNvbnN0IGNoYXIgKnB0cikKIHsKIAljb25zdCBjaGFyICpzMSA9IHB0ciwgKnMyOwotCV9fdTMyIGluZGV4LCAqZXhjbHVkZV9saXN0OworCV9fdTMyIGluZGV4ID0gMCwgKmV4Y2x1ZGVfbGlzdDsKIAlpbnQgcmMgPSAwLCBkZXZtYXg7CiAKIAkvKiBUaGUgc2hvcnRlc3QgYW4gb3N0IG5hbWUgY2FuIGJlIGlzIDggY2hhcnM6IC1PU1QwMDAwLgpAQCAtNzU4LDcgKzc1NSw3IEBACiAJCQlleGNsdWRlX2xpc3RbbG1kLT5sbWRfZXhjbHVkZV9jb3VudCsrXSA9IGluZGV4OwogCQllbHNlCiAJCQlDREVCVUcoRF9NT1VOVCwgImlnbm9yaW5nIGV4Y2x1ZGUgJS4qczogdHlwZSA9ICUjeFxuIiwKLQkJCSAgICAgICAodWludCkoczItczEpLCBzMSwgcmMpOworCQkJICAgICAgICh1aW50KShzMiAtIHMxKSwgczEsIHJjKTsKIAkJczEgPSBzMjsKIAkJLyogbm93IHdlIGFyZSBwb2ludGluZyBhdCAnOicgKG5leHQgZXhjbHVkZSkKIAkJICogb3IgJywnIChlbmQgb2YgZXhjbHVkZXMpCkBAIC04ODAsNyArODc3LDcgQEAKICAqLwogc3RhdGljIGludCBsbWRfcGFyc2UoY2hhciAqb3B0aW9ucywgc3RydWN0IGx1c3RyZV9tb3VudF9kYXRhICpsbWQpCiB7Ci0JY2hhciAqczEsICpzMiwgKmRldm5hbWUgPSBOVUxMOworCWNoYXIgKnMxLCAqczIsICpzMywgKmRldm5hbWUgPSBOVUxMOwogCXN0cnVjdCBsdXN0cmVfbW91bnRfZGF0YSAqcmF3ID0gKHN0cnVjdCBsdXN0cmVfbW91bnRfZGF0YSAqKW9wdGlvbnM7CiAJaW50IHJjID0gMDsKIApAQCAtOTEzLDYgKzkxMCw3IEBACiAJCS8qIFNraXAgd2hpdGVzcGFjZSBhbmQgZXh0cmEgY29tbWFzICovCiAJCXdoaWxlICgqczEgPT0gJyAnIHx8ICpzMSA9PSAnLCcpCiAJCQlzMSsrOworCQlzMyA9IHMxOwogCiAJCS8qIENsaWVudCBvcHRpb25zIGFyZSBwYXJzZWQgaW4gbGxfb3B0aW9uczogZWcuIGZsb2NrLAogCQkgKiB1c2VyX3hhdHRyLCBhY2wKQEAgLTk3MCw2ICs5NjgsNyBAQAogCQkJcmMgPSBsbWRfcGFyc2VfbWdzc2VjKGxtZCwgczEgKyA3KTsKIAkJCWlmIChyYykKIAkJCQlnb3RvIGludmFsaWQ7CisJCQlzMyA9IHMyOwogCQkJY2xlYXIrKzsKIAkJLyogb3N0IGV4Y2x1c2lvbiBsaXN0ICovCiAJCX0gZWxzZSBpZiAoc3RybmNtcChzMSwgImV4Y2x1ZGU9IiwgOCkgPT0gMCkgewpAQCAtOTkwLDEwICs5ODksMTkgQEAKIAkJCXNpemVfdCBsZW5ndGgsIHBhcmFtc19sZW5ndGg7CiAJCQljaGFyICp0YWlsID0gc3RyY2hyKHMxICsgNiwgJywnKTsKIAotCQkJaWYgKCF0YWlsKQorCQkJaWYgKCF0YWlsKSB7CiAJCQkJbGVuZ3RoID0gc3RybGVuKHMxKTsKLQkJCWVsc2UKLQkJCQlsZW5ndGggPSB0YWlsIC0gczE7CisJCQl9IGVsc2UgeworCQkJCWxuZXRfbmlkX3QgbmlkOworCQkJCWNoYXIgKnBhcmFtX3N0ciA9IHRhaWwgKyAxOworCQkJCWludCBzdXBwbGVtZW50YXJ5ID0gMTsKKworCQkJCXdoaWxlICghY2xhc3NfcGFyc2VfbmlkX3F1aWV0KHBhcmFtX3N0ciwgJm5pZCwKKwkJCQkJCQkgICAgICAmcGFyYW1fc3RyKSkgeworCQkJCQlzdXBwbGVtZW50YXJ5ID0gMDsKKwkJCQl9CisJCQkJbGVuZ3RoID0gcGFyYW1fc3RyIC0gczEgLSBzdXBwbGVtZW50YXJ5OworCQkJfQogCQkJbGVuZ3RoIC09IDY7CiAJCQlwYXJhbXNfbGVuZ3RoID0gc3RybGVuKGxtZC0+bG1kX3BhcmFtcyk7CiAJCQlpZiAocGFyYW1zX2xlbmd0aCArIGxlbmd0aCArIDEgPj0gTE1EX1BBUkFNU19NQVhMRU4pCkBAIC0xMDAxLDYgKzEwMDksNyBAQAogCQkJc3RybmNhdChsbWQtPmxtZF9wYXJhbXMsIHMxICsgNiwgbGVuZ3RoKTsKIAkJCWxtZC0+bG1kX3BhcmFtc1twYXJhbXNfbGVuZ3RoICsgbGVuZ3RoXSA9ICdcMCc7CiAJCQlzdHJsY2F0KGxtZC0+bG1kX3BhcmFtcywgIiAiLCBMTURfUEFSQU1TX01BWExFTik7CisJCQlzMyA9IHMxICsgNiArIGxlbmd0aDsKIAkJCWNsZWFyKys7CiAJCX0gZWxzZSBpZiAoc3RybmNtcChzMSwgIm9zZD0iLCA0KSA9PSAwKSB7CiAJCQlyYyA9IGxtZF9wYXJzZV9zdHJpbmcoJmxtZC0+bG1kX29zZF90eXBlLCBzMSArIDQpOwpAQCAtMTA5Nyw3ICsxMTA2LDcgQEAKIAlzdHJ1Y3QgbHVzdHJlX3NiX2luZm8gKmxzaTsKIAlpbnQgcmM7CiAKLQlDREVCVUcoRF9NT1VOVHxEX1ZGU1RSQUNFLCAiVkZTIE9wOiBzYiAlcFxuIiwgc2IpOworCUNERUJVRyhEX01PVU5UIHwgRF9WRlNUUkFDRSwgIlZGUyBPcDogc2IgJXBcbiIsIHNiKTsKIAogCWxzaSA9IGx1c3RyZV9pbml0X2xzaShzYik7CiAJaWYgKCFsc2kpCkBAIC0xMTMzLDcgKzExNDIsNyBAQAogCQl9IGVsc2UgewogCQkJcmMgPSBsdXN0cmVfc3RhcnRfbWdjKHNiKTsKIAkJCWlmIChyYykgewotCQkJCWx1c3RyZV9wdXRfbHNpKHNiKTsKKwkJCQlsdXN0cmVfY29tbW9uX3B1dF9zdXBlcihzYik7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCQkvKiBDb25uZWN0IGFuZCBzdGFydCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2Jkby5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2Jkby5jCmluZGV4IDg1ODNhNGEuLjc5MTA0YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZG8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRvLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogfQogRVhQT1JUX1NZTUJPTChvYmRvX2Zyb21faW5vZGUpOwogCi12b2lkIG9iZG9fdG9faW9vYmooc3RydWN0IG9iZG8gKm9hLCBzdHJ1Y3Qgb2JkX2lvb2JqICppb29iaikKK3ZvaWQgb2Jkb190b19pb29iaihjb25zdCBzdHJ1Y3Qgb2JkbyAqb2EsIHN0cnVjdCBvYmRfaW9vYmogKmlvb2JqKQogewogCWlvb2JqLT5pb29fb2lkID0gb2EtPm9fb2k7CiAJaWYgKHVubGlrZWx5KCEob2EtPm9fdmFsaWQgJiBPQkRfTURfRkxHUk9VUCkpKQpAQCAtMTI1LDcgKzEyNSw4IEBACiB9CiBFWFBPUlRfU1lNQk9MKG9iZG9fdG9faW9vYmopOwogCi1zdGF0aWMgdm9pZCBpYXR0cl9mcm9tX29iZG8oc3RydWN0IGlhdHRyICphdHRyLCBzdHJ1Y3Qgb2JkbyAqb2EsIHUzMiB2YWxpZCkKK3N0YXRpYyB2b2lkIGlhdHRyX2Zyb21fb2JkbyhzdHJ1Y3QgaWF0dHIgKmF0dHIsIGNvbnN0IHN0cnVjdCBvYmRvICpvYSwKKwkJCSAgICB1MzIgdmFsaWQpCiB7CiAJdmFsaWQgJj0gb2EtPm9fdmFsaWQ7CiAKQEAgLTE1MiwxMiArMTUzLDE0IEBACiAJfQogI2lmIDAgICAvKiB5b3Ugc2hvdWxkbid0IGJlIGFibGUgdG8gY2hhbmdlIGEgZmlsZSdzIHR5cGUgd2l0aCBzZXRhdHRyICovCiAJaWYgKHZhbGlkICYgT0JEX01EX0ZMVFlQRSkgewotCQlhdHRyLT5pYV9tb2RlID0gKGF0dHItPmlhX21vZGUgJiB+U19JRk1UKXwob2EtPm9fbW9kZSAmIFNfSUZNVCk7CisJCWF0dHItPmlhX21vZGUgPSAoYXR0ci0+aWFfbW9kZSAmIH5TX0lGTVQpIHwKKwkJCQkob2EtPm9fbW9kZSAmIFNfSUZNVCk7CiAJCWF0dHItPmlhX3ZhbGlkIHw9IEFUVFJfTU9ERTsKIAl9CiAjZW5kaWYKIAlpZiAodmFsaWQgJiBPQkRfTURfRkxNT0RFKSB7Ci0JCWF0dHItPmlhX21vZGUgPSAoYXR0ci0+aWFfbW9kZSAmIFNfSUZNVCl8KG9hLT5vX21vZGUgJiB+U19JRk1UKTsKKwkJYXR0ci0+aWFfbW9kZSA9IChhdHRyLT5pYV9tb2RlICYgU19JRk1UKSB8CisJCQkJKG9hLT5vX21vZGUgJiB+U19JRk1UKTsKIAkJYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9NT0RFOwogCQlpZiAoIWluX2dyb3VwX3AobWFrZV9rZ2lkKCZpbml0X3VzZXJfbnMsIG9hLT5vX2dpZCkpICYmCiAJCSAgICAhY2FwYWJsZShDRlNfQ0FQX0ZTRVRJRCkpCkBAIC0xNzMsNyArMTc2LDcgQEAKIAl9CiB9CiAKLXZvaWQgbWRfZnJvbV9vYmRvKHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLCBzdHJ1Y3Qgb2JkbyAqb2EsIHUzMiB2YWxpZCkKK3ZvaWQgbWRfZnJvbV9vYmRvKHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLCBjb25zdCBzdHJ1Y3Qgb2JkbyAqb2EsIHUzMiB2YWxpZCkKIHsKIAlpYXR0cl9mcm9tX29iZG8oJm9wX2RhdGEtPm9wX2F0dHIsIG9hLCB2YWxpZCk7CiAJaWYgKHZhbGlkICYgT0JEX01EX0ZMQkxPQ0tTKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG9fY2xpZW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG9fY2xpZW50LmMKaW5kZXggNWIyOWM0YS4uNTA1NTgyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvX2NsaWVudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vZWNob19jbGllbnQuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvY2xfb2JqZWN0LmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZmlkLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfYWNsLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lvY3RsLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbmV0LmgiCiAKICNpbmNsdWRlICJlY2hvX2ludGVybmFsLmgiCkBAIC02NCwxNCArNjUsMTQgQEAKIAogCXN0cnVjdCBlY2hvX2RldmljZSAgICAgKmVvX2RldjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgIGVvX29ial9jaGFpbjsKLQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAgICplb19sc207CisJc3RydWN0IGxvdl9vaW5mbyAgICAgICAqZW9fb2luZm87CiAJYXRvbWljX3QJICAgIGVvX25wYWdlczsKIAlpbnQJCSAgICAgZW9fZGVsZXRlZDsKIH07CiAKIHN0cnVjdCBlY2hvX29iamVjdF9jb25mIHsKIAlzdHJ1Y3QgY2xfb2JqZWN0X2NvbmYgIGVvY19jbDsKLQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqKmVvY19tZDsKKwlzdHJ1Y3QgbG92X29pbmZvICAgICAgKiplb2Nfb2luZm87CiB9OwogCiBzdHJ1Y3QgZWNob19wYWdlIHsKQEAgLTE1Miw5ICsxNTMsNiBAQAogfQogCiAvKiogQH0gZWNob19oZWxwZXJzICovCi0KLXN0YXRpYyBzdHJ1Y3QgZWNob19vYmplY3QgKmNsX2VjaG9fb2JqZWN0X2ZpbmQoc3RydWN0IGVjaG9fZGV2aWNlICpkLAotCQkJCQkgICAgICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKipsc20pOwogc3RhdGljIGludCBjbF9lY2hvX29iamVjdF9wdXQoc3RydWN0IGVjaG9fb2JqZWN0ICplY28pOwogc3RhdGljIGludCBjbF9lY2hvX29iamVjdF9icncoc3RydWN0IGVjaG9fb2JqZWN0ICplY28sIGludCBydywgdTY0IG9mZnNldCwKIAkJCSAgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIGludCBucGFnZXMsIGludCBhc3luYyk7CkBAIC00MTMsMTAgKzQxMSwxMyBAQAogCWNjb25mID0gbHUyY2xfY29uZihjb25mKTsKIAllY29uZiA9IGNsMmVjaG9fY29uZihjY29uZik7CiAKLQlMQVNTRVJUKGVjb25mLT5lb2NfbWQpOwotCWVjby0+ZW9fbHNtID0gKmVjb25mLT5lb2NfbWQ7Ci0JLyogY2xlYXIgdGhlIGxzbSBwb2ludGVyIHNvIHRoYXQgaXQgd29uJ3QgZ2V0IGZyZWVkLiAqLwotCSplY29uZi0+ZW9jX21kID0gTlVMTDsKKwlMQVNTRVJUKGVjb25mLT5lb2Nfb2luZm8pOworCS8qCisJICogVHJhbnNmZXIgdGhlIG9pbmZvIHBvaW50ZXIgdG8gZWNvIHRoYXQgaXQgd29uJ3QgYmUKKwkgKiBmcmVlZC4KKwkgKi8KKwllY28tPmVvX29pbmZvID0gKmVjb25mLT5lb2Nfb2luZm87CisJKmVjb25mLT5lb2Nfb2luZm8gPSBOVUxMOwogCiAJZWNvLT5lb19kZXYgPSBlZDsKIAlhdG9taWNfc2V0KCZlY28tPmVvX25wYWdlcywgMCk7CkBAIC00MjksNTIgKzQzMCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIHRha2VuIGZyb20gb3NjX3VucGFja21kKCkgKi8KLXN0YXRpYyBpbnQgZWNob19hbGxvY19tZW1tZChzdHJ1Y3QgZWNob19kZXZpY2UgKmVkLAotCQkJICAgIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqbHNtcCkKLXsKLQlpbnQgbHNtX3NpemU7Ci0KLQkvKiBJZiBleHBvcnQgaXMgbG92L29zYyB0aGVuIHVzZSB0aGVpciBvYmQgbWV0aG9kICovCi0JaWYgKGVkLT5lZF9uZXh0KQotCQlyZXR1cm4gb2JkX2FsbG9jX21lbW1kKGVkLT5lZF9lYy0+ZWNfZXhwLCBsc21wKTsKLQkvKiBPRkQgaGFzIG5vIHVucGFja21kIG1ldGhvZCwgZG8gZXZlcnl0aGluZyBoZXJlICovCi0JbHNtX3NpemUgPSBsb3Zfc3RyaXBlX21kX3NpemUoMSk7Ci0KLQlMQVNTRVJUKCEqbHNtcCk7Ci0JKmxzbXAgPSBremFsbG9jKGxzbV9zaXplLCBHRlBfTk9GUyk7Ci0JaWYgKCEqbHNtcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkoKmxzbXApLT5sc21fb2luZm9bMF0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbG92X29pbmZvKSwgR0ZQX05PRlMpOwotCWlmICghKCpsc21wKS0+bHNtX29pbmZvWzBdKSB7Ci0JCWtmcmVlKCpsc21wKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JbG9pX2luaXQoKCpsc21wKS0+bHNtX29pbmZvWzBdKTsKLQkoKmxzbXApLT5sc21fbWF4Ynl0ZXMgPSBMVVNUUkVfU1RSSVBFX01BWEJZVEVTOwotCW9zdGlkX3NldF9zZXFfZWNobygmKCpsc21wKS0+bHNtX29pKTsKLQotCXJldHVybiBsc21fc2l6ZTsKLX0KLQotc3RhdGljIGludCBlY2hvX2ZyZWVfbWVtbWQoc3RydWN0IGVjaG9fZGV2aWNlICplZCwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKipsc21wKQotewotCWludCBsc21fc2l6ZTsKLQotCS8qIElmIGV4cG9ydCBpcyBsb3Yvb3NjIHRoZW4gdXNlIHRoZWlyIG9iZCBtZXRob2QgKi8KLQlpZiAoZWQtPmVkX25leHQpCi0JCXJldHVybiBvYmRfZnJlZV9tZW1tZChlZC0+ZWRfZWMtPmVjX2V4cCwgbHNtcCk7Ci0JLyogT0ZEIGhhcyBubyB1bnBhY2ttZCBtZXRob2QsIGRvIGV2ZXJ5dGhpbmcgaGVyZSAqLwotCWxzbV9zaXplID0gbG92X3N0cmlwZV9tZF9zaXplKDEpOwotCi0Ja2ZyZWUoKCpsc21wKS0+bHNtX29pbmZvWzBdKTsKLQlrZnJlZSgqbHNtcCk7Ci0JKmxzbXAgPSBOVUxMOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBlY2hvX29iamVjdF9mcmVlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGx1X29iamVjdCAqb2JqKQogewogCXN0cnVjdCBlY2hvX29iamVjdCAqZWNvICAgID0gY2wyZWNob19vYmoobHUyY2wob2JqKSk7CkBAIC00ODksOCArNDQ0LDcgQEAKIAlsdV9vYmplY3RfZmluaShvYmopOwogCWx1X29iamVjdF9oZWFkZXJfZmluaShvYmotPmxvX2hlYWRlcik7CiAKLQlpZiAoZWNvLT5lb19sc20pCi0JCWVjaG9fZnJlZV9tZW1tZChlY28tPmVvX2RldiwgJmVjby0+ZW9fbHNtKTsKKwlrZnJlZShlY28tPmVvX29pbmZvKTsKIAlrbWVtX2NhY2hlX2ZyZWUoZWNob19vYmplY3Rfa21lbSwgZWNvKTsKIH0KIApAQCAtODY0LDI1ICs4MTgsMjEgQEAKICAqLwogCiAvKiBJbnRlcmZhY2VzIHRvIGVjaG8gY2xpZW50IG9iZCBkZXZpY2UgKi8KLXN0YXRpYyBzdHJ1Y3QgZWNob19vYmplY3QgKmNsX2VjaG9fb2JqZWN0X2ZpbmQoc3RydWN0IGVjaG9fZGV2aWNlICpkLAotCQkJCQkgICAgICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKipsc21wKQorc3RhdGljIHN0cnVjdCBlY2hvX29iamVjdCAqCitjbF9lY2hvX29iamVjdF9maW5kKHN0cnVjdCBlY2hvX2RldmljZSAqZCwgY29uc3Qgc3RydWN0IG9zdF9pZCAqb2kpCiB7CiAJc3RydWN0IGx1X2VudiAqZW52OwogCXN0cnVjdCBlY2hvX3RocmVhZF9pbmZvICppbmZvOwogCXN0cnVjdCBlY2hvX29iamVjdF9jb25mICpjb25mOwotCXN0cnVjdCBsb3Zfc3RyaXBlX21kICAgICpsc207CisJc3RydWN0IGxvdl9vaW5mbyAqb2luZm8gPSBOVUxMOwogCXN0cnVjdCBlY2hvX29iamVjdCAqZWNvOwogCXN0cnVjdCBjbF9vYmplY3QgICAqb2JqOwogCXN0cnVjdCBsdV9maWQgKmZpZDsKIAlpbnQgcmVmY2hlY2s7CiAJaW50IHJjOwogCi0JTEFTU0VSVChsc21wKTsKLQlsc20gPSAqbHNtcDsKLQlMQVNTRVJUKGxzbSk7Ci0JTEFTU0VSVEYob3N0aWRfaWQoJmxzbS0+bHNtX29pKSAhPSAwLCBET1NUSUQiXG4iLCBQT1NUSUQoJmxzbS0+bHNtX29pKSk7Ci0JTEFTU0VSVEYob3N0aWRfc2VxKCZsc20tPmxzbV9vaSkgPT0gRklEX1NFUV9FQ0hPLCBET1NUSUQiXG4iLAotCQkgUE9TVElEKCZsc20tPmxzbV9vaSkpOworCUxBU1NFUlRGKG9zdGlkX2lkKG9pKSwgRE9TVElEICJcbiIsIFBPU1RJRChvaSkpOworCUxBU1NFUlRGKG9zdGlkX3NlcShvaSkgPT0gRklEX1NFUV9FQ0hPLCBET1NUSUQgIlxuIiwgUE9TVElEKG9pKSk7CiAKIAkvKiBOZXZlciByZXR1cm4gYW4gb2JqZWN0IGlmIHRoZSBvYmQgaXMgdG8gYmUgZnJlZWQuICovCiAJaWYgKGVjaG9fZGV2MmNsKGQpLT5jZF9sdV9kZXYubGRfb2JkLT5vYmRfc3RvcHBpbmcpCkBAIC04OTUsMTYgKzg0NSwyNCBAQAogCWluZm8gPSBlY2hvX2Vudl9pbmZvKGVudik7CiAJY29uZiA9ICZpbmZvLT5ldGlfY29uZjsKIAlpZiAoZC0+ZWRfbmV4dCkgewotCQlzdHJ1Y3QgbG92X29pbmZvICpvaW5mbyA9IGxzbS0+bHNtX29pbmZvWzBdOworCQlvaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCpvaW5mbyksIEdGUF9OT0ZTKTsKKwkJaWYgKCFvaW5mbykgeworCQkJZWNvID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJCWdvdG8gb3V0OworCQl9CiAKLQkJTEFTU0VSVChvaW5mbyk7Ci0JCW9pbmZvLT5sb2lfb2kgPSBsc20tPmxzbV9vaTsKKwkJb2luZm8tPmxvaV9vaSA9ICpvaTsKIAkJY29uZi0+ZW9jX2NsLnUuY29jX29pbmZvID0gb2luZm87CiAJfQotCWNvbmYtPmVvY19tZCA9IGxzbXA7CisKKwkvKgorCSAqIElmIGVjaG9fb2JqZWN0X2luaXQoKSBpcyBzdWNjZXNzZnVsIHRoZW4gb3duZXJzaGlwIG9mIG9pbmZvCisJICogaXMgdHJhbnNmZXJyZWQgdG8gdGhlIG9iamVjdC4KKwkgKi8KKwljb25mLT5lb2Nfb2luZm8gPSAmb2luZm87CiAKIAlmaWQgID0gJmluZm8tPmV0aV9maWQ7Ci0JcmMgPSBvc3RpZF90b19maWQoZmlkLCAmbHNtLT5sc21fb2ksIDApOworCXJjID0gb3N0aWRfdG9fZmlkKGZpZCwgKHN0cnVjdCBvc3RfaWQgKilvaSwgMCk7CiAJaWYgKHJjICE9IDApIHsKIAkJZWNvID0gRVJSX1BUUihyYyk7CiAJCWdvdG8gb3V0OwpAQCAtOTI3LDYgKzg4NSw3IEBACiAJfQogCiBvdXQ6CisJa2ZyZWUob2luZm8pOwogCWNsX2Vudl9wdXQoZW52LCAmcmVmY2hlY2spOwogCXJldHVybiBlY287CiB9CkBAIC0xMDUxLDcgKzEwMTAsNyBAQAogCXN0cnVjdCBjbF9pbwkgICAgKmlvOwogCXN0cnVjdCBjbF9wYWdlCSAgKmNscDsKIAlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAgICBsaCA9IHsgMCB9OwotCWludCBwYWdlX3NpemUgPSBjbF9wYWdlX3NpemUob2JqKTsKKwlzaXplX3QgcGFnZV9zaXplID0gY2xfcGFnZV9zaXplKG9iaik7CiAJaW50IHJlZmNoZWNrOwogCWludCByYzsKIAlpbnQgaTsKQEAgLTExNDUsNyArMTEwNCw2IEBACiB7CiAJc3RydWN0IGVjaG9fb2JqZWN0ICAgICAqZWNvOwogCXN0cnVjdCBlY2hvX2NsaWVudF9vYmQgKmVjID0gZWQtPmVkX2VjOwotCXN0cnVjdCBsb3Zfc3RyaXBlX21kICAgKmxzbSA9IE5VTEw7CiAJaW50CQkgICAgIHJjOwogCWludAkJICAgICBjcmVhdGVkID0gMDsKIApAQCAtMTE1NiwzMCArMTExNCwxOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyYyA9IGVjaG9fYWxsb2NfbWVtbWQoZWQsICZsc20pOwotCWlmIChyYyA8IDApIHsKLQkJQ0VSUk9SKCJDYW5ub3QgYWxsb2NhdGUgbWQ6IHJjID0gJWRcbiIsIHJjKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQorCWlmICghb3N0aWRfaWQoJm9hLT5vX29pKSkKKwkJb3N0aWRfc2V0X2lkKCZvYS0+b19vaSwgKytsYXN0X29iamVjdF9pZCk7CiAKLQkvKiBzZXR1cCBvYmplY3QgSUQgaGVyZSAqLwotCWxzbS0+bHNtX29pID0gb2EtPm9fb2k7Ci0KLQlpZiAob3N0aWRfaWQoJmxzbS0+bHNtX29pKSA9PSAwKQotCQlvc3RpZF9zZXRfaWQoJmxzbS0+bHNtX29pLCArK2xhc3Rfb2JqZWN0X2lkKTsKLQotCXJjID0gb2JkX2NyZWF0ZShlbnYsIGVjLT5lY19leHAsIG9hLCAmbHNtLCBvdGkpOworCXJjID0gb2JkX2NyZWF0ZShlbnYsIGVjLT5lY19leHAsIG9hLCBvdGkpOwogCWlmIChyYyAhPSAwKSB7CiAJCUNFUlJPUigiQ2Fubm90IGNyZWF0ZSBvYmplY3RzOiByYyA9ICVkXG4iLCByYyk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAljcmVhdGVkID0gMTsKIAotCS8qIFNlZSB3aGF0IG9iamVjdCBJRCB3ZSB3ZXJlIGdpdmVuICovCi0Jb2EtPm9fb2kgPSBsc20tPmxzbV9vaTsKIAlvYS0+b192YWxpZCB8PSBPQkRfTURfRkxJRDsKIAotCWVjbyA9IGNsX2VjaG9fb2JqZWN0X2ZpbmQoZWQsICZsc20pOworCWVjbyA9IGNsX2VjaG9fb2JqZWN0X2ZpbmQoZWQsICZvYS0+b19vaSk7CiAJaWYgKElTX0VSUihlY28pKSB7CiAJCXJjID0gUFRSX0VSUihlY28pOwogCQlnb3RvIGZhaWxlZDsKQEAgLTExOTAsOSArMTEzNyw3IEBACiAKICBmYWlsZWQ6CiAJaWYgKGNyZWF0ZWQgJiYgcmMpCi0JCW9iZF9kZXN0cm95KGVudiwgZWMtPmVjX2V4cCwgb2EsIGxzbSwgb3RpLCBOVUxMKTsKLQlpZiAobHNtKQotCQllY2hvX2ZyZWVfbWVtbWQoZWQsICZsc20pOworCQlvYmRfZGVzdHJveShlbnYsIGVjLT5lY19leHAsIG9hLCBvdGkpOwogCWlmIChyYykKIAkJQ0VSUk9SKCJjcmVhdGUgb2JqZWN0IGZhaWxlZCB3aXRoOiByYyA9ICVkXG4iLCByYyk7CiAJcmV0dXJuIHJjOwpAQCAtMTIwMSwzMiArMTE0NiwyMSBAQAogc3RhdGljIGludCBlY2hvX2dldF9vYmplY3Qoc3RydWN0IGVjaG9fb2JqZWN0ICoqZWNvcCwgc3RydWN0IGVjaG9fZGV2aWNlICplZCwKIAkJCSAgIHN0cnVjdCBvYmRvICpvYSkKIHsKLQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAgICpsc20gPSBOVUxMOwogCXN0cnVjdCBlY2hvX29iamVjdCAgICAgKmVjbzsKIAlpbnQJCSAgICAgcmM7CiAKLQlpZiAoKG9hLT5vX3ZhbGlkICYgT0JEX01EX0ZMSUQpID09IDAgfHwgb3N0aWRfaWQoJm9hLT5vX29pKSA9PSAwKSB7Ci0JCS8qIGRpc2FsbG93IHVzZSBvZiBvYmplY3QgaWQgMCAqLwotCQlDRVJST1IoIk5vIHZhbGlkIG9pZFxuIik7CisJaWYgKCEob2EtPm9fdmFsaWQgJiBPQkRfTURfRkxJRCkgfHwgIShvYS0+b192YWxpZCAmIE9CRF9NRF9GTEdST1VQKSB8fAorCSAgICAhb3N0aWRfaWQoJm9hLT5vX29pKSkgeworCQlDRVJST1IoImludmFsaWQgb2lkICIgRE9TVElEICJcbiIsIFBPU1RJRCgmb2EtPm9fb2kpKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmMgPSBlY2hvX2FsbG9jX21lbW1kKGVkLCAmbHNtKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlsc20tPmxzbV9vaSA9IG9hLT5vX29pOwotCWlmICghKG9hLT5vX3ZhbGlkICYgT0JEX01EX0ZMR1JPVVApKQotCQlvc3RpZF9zZXRfc2VxX2VjaG8oJmxzbS0+bHNtX29pKTsKLQogCXJjID0gMDsKLQllY28gPSBjbF9lY2hvX29iamVjdF9maW5kKGVkLCAmbHNtKTsKKwllY28gPSBjbF9lY2hvX29iamVjdF9maW5kKGVkLCAmb2EtPm9fb2kpOwogCWlmICghSVNfRVJSKGVjbykpCiAJCSplY29wID0gZWNvOwogCWVsc2UKIAkJcmMgPSBQVFJfRVJSKGVjbyk7Ci0JaWYgKGxzbSkKLQkJZWNob19mcmVlX21lbW1kKGVkLCAmbHNtKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTE0MzYsMTMgKzEzNzAsMTIgQEAKIAkJCW5wYWdlcyA9IHRvdF9wYWdlczsKIAogCQlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyssIG9mZiArPSBQQUdFX1NJWkUpIHsKLQkJCXJuYltpXS5vZmZzZXQgPSBvZmY7Ci0JCQlybmJbaV0ubGVuID0gUEFHRV9TSVpFOwotCQkJcm5iW2ldLmZsYWdzID0gYnJ3X2ZsYWdzOworCQkJcm5iW2ldLnJuYl9vZmZzZXQgPSBvZmY7CisJCQlybmJbaV0ucm5iX2xlbiA9IFBBR0VfU0laRTsKKwkJCXJuYltpXS5ybmJfZmxhZ3MgPSBicndfZmxhZ3M7CiAJCX0KIAogCQlpb28uaW9vX2J1ZmNudCA9IG5wYWdlczsKLQkJb3RpLT5vdGlfdHJhbnNubyA9IDA7CiAKIAkJbHBhZ2VzID0gbnBhZ2VzOwogCQlyZXQgPSBvYmRfcHJlcHJ3KGVudiwgcncsIGV4cCwgb2EsIDEsICZpb28sIHJuYiwgJmxwYWdlcywKQEAgLTE0NTIsMTQgKzEzODUsMTQgQEAKIAkJTEFTU0VSVChscGFnZXMgPT0gbnBhZ2VzKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgbHBhZ2VzOyBpKyspIHsKLQkJCXN0cnVjdCBwYWdlICpwYWdlID0gbG5iW2ldLnBhZ2U7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGxuYltpXS5sbmJfcGFnZTsKIAogCQkJLyogcmVhZCBwYXN0IGVvZj8gKi8KLQkJCWlmICghcGFnZSAgJiYgbG5iW2ldLnJjID09IDApCisJCQlpZiAoIXBhZ2UgICYmIGxuYltpXS5sbmJfcmMgPT0gMCkKIAkJCQljb250aW51ZTsKIAogCQkJaWYgKGFzeW5jKQotCQkJCWxuYltpXS5mbGFncyB8PSBPQkRfQlJXX0FTWU5DOworCQkJCWxuYltpXS5sbmJfZmxhZ3MgfD0gT0JEX0JSV19BU1lOQzsKIAogCQkJaWYgKG9zdGlkX2lkKCZvYS0+b19vaSkgPT0gRUNIT19QRVJTSVNURU5UX09CSklEIHx8CiAJCQkgICAgKG9hLT5vX3ZhbGlkICYgT0JEX01EX0ZMRkxBR1MpID09IDAgfHwKQEAgLTE0NjksMTMgKzE0MDIsMTMgQEAKIAkJCWlmIChydyA9PSBPQkRfQlJXX1dSSVRFKQogCQkJCWVjaG9fY2xpZW50X3BhZ2VfZGVidWdfc2V0dXAocGFnZSwgcncsCiAJCQkJCQkJICAgIG9zdGlkX2lkKCZvYS0+b19vaSksCi0JCQkJCQkJICAgICBybmJbaV0ub2Zmc2V0LAotCQkJCQkJCSAgICAgcm5iW2ldLmxlbik7CisJCQkJCQkJICAgICBybmJbaV0ucm5iX29mZnNldCwKKwkJCQkJCQkgICAgIHJuYltpXS5ybmJfbGVuKTsKIAkJCWVsc2UKIAkJCQllY2hvX2NsaWVudF9wYWdlX2RlYnVnX2NoZWNrKHBhZ2UsCiAJCQkJCQkJICAgIG9zdGlkX2lkKCZvYS0+b19vaSksCi0JCQkJCQkJICAgICBybmJbaV0ub2Zmc2V0LAotCQkJCQkJCSAgICAgcm5iW2ldLmxlbik7CisJCQkJCQkJICAgICBybmJbaV0ucm5iX29mZnNldCwKKwkJCQkJCQkgICAgIHJuYltpXS5ybmJfbGVuKTsKIAkJfQogCiAJCXJldCA9IG9iZF9jb21taXRydyhlbnYsIHJ3LCBleHAsIG9hLCAxLCAmaW9vLApAQCAtMTYxMyw4ICsxNTQ2LDcgQEAKIAogCQlyYyA9IGVjaG9fZ2V0X29iamVjdCgmZWNvLCBlZCwgb2EpOwogCQlpZiAocmMgPT0gMCkgewotCQkJcmMgPSBvYmRfZGVzdHJveShlbnYsIGVjLT5lY19leHAsIG9hLCBOVUxMLAotCQkJCQkgJmR1bW15X290aSwgTlVMTCk7CisJCQlyYyA9IG9iZF9kZXN0cm95KGVudiwgZWMtPmVjX2V4cCwgb2EsICZkdW1teV9vdGkpOwogCQkJaWYgKHJjID09IDApCiAJCQkJZWNvLT5lb19kZWxldGVkID0gMTsKIAkJCWVjaG9fcHV0X29iamVjdChlY28pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG9faW50ZXJuYWwuaAppbmRleCBmNTAzNGEyLi45NjY0MTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG9faW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG9faW50ZXJuYWwuaApAQCAtMzMsOSArMzMsOSBAQAogCiAvKiBUaGUgcGVyc2lzdGVudCBvYmplY3QgKGkuZS4gYWN0dWFsbHkgc3RvcmVzIHN0dWZmISkgKi8KICNkZWZpbmUgRUNIT19QRVJTSVNURU5UX09CSklEICAgIDFVTEwKLSNkZWZpbmUgRUNIT19QRVJTSVNURU5UX1NJWkUgICAgICgoX191NjQpKDE8PDIwKSkKKyNkZWZpbmUgRUNIT19QRVJTSVNURU5UX1NJWkUgICAgICgoX191NjQpKDEgPDwgMjApKQogCiAvKiBibG9jayBzaXplIHRvIHVzZSBmb3IgZGF0YSB2ZXJpZmljYXRpb24gKi8KLSNkZWZpbmUgT0JEX0VDSE9fQkxPQ0tfU0laRQkoNDw8MTApCisjZGVmaW5lIE9CRF9FQ0hPX0JMT0NLX1NJWkUJKDQgPDwgMTApCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL2xwcm9jX29zYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL2xwcm9jX29zYy5jCmluZGV4IDdlODNkMzkuLmYwMDYyZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9scHJvY19vc2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2MvbHByb2Nfb3NjLmMKQEAgLTExOSw2ICsxMTksNyBAQAogCiAJc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwogCWNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0ID0gdmFsOworCWNsaWVudF9hZGp1c3RfbWF4X2RpcnR5KGNsaSk7CiAJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC0xMzYsMTAgKzEzNywxMCBAQAogCWludCBtdWx0OwogCiAJc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXZhbCA9IGNsaS0+Y2xfZGlydHlfbWF4OworCXZhbCA9IGNsaS0+Y2xfZGlydHlfbWF4X3BhZ2VzOwogCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwogCi0JbXVsdCA9IDEgPDwgMjA7CisJbXVsdCA9IDEgPDwgKDIwIC0gUEFHRV9TSElGVCk7CiAJcmV0dXJuIGxwcm9jZnNfcmVhZF9mcmFjX2hlbHBlcihidWYsIFBBR0VfU0laRSwgdmFsLCBtdWx0KTsKIH0KIApAQCAtMTY2LDcgKzE2Nyw3IEBACiAJCXJldHVybiAtRVJBTkdFOwogCiAJc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCWNsaS0+Y2xfZGlydHlfbWF4ID0gKHUzMikocGFnZXNfbnVtYmVyIDw8IFBBR0VfU0hJRlQpOworCWNsaS0+Y2xfZGlydHlfbWF4X3BhZ2VzID0gcGFnZXNfbnVtYmVyOwogCW9zY193YWtlX2NhY2hlX3dhaXRlcnMoY2xpKTsKIAlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKIApAQCAtMTgxLDExICsxODIsMTEgQEAKIAlpbnQgc2hpZnQgPSAyMCAtIFBBR0VfU0hJRlQ7CiAKIAlzZXFfcHJpbnRmKG0sCi0JCSAgICJ1c2VkX21iOiAlZFxuIgotCQkgICAiYnVzeV9jbnQ6ICVkXG4iLAotCQkgICAoYXRvbWljX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpICsKLQkJICAgIGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9idXN5KSkgPj4gc2hpZnQsCi0JCSAgIGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9idXN5KSk7CisJCSAgICJ1c2VkX21iOiAlbGRcbiIKKwkJICAgImJ1c3lfY250OiAlbGRcbiIsCisJCSAgIChhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSArCisJCSAgICBhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9idXN5KSkgPj4gc2hpZnQsCisJCSAgIGF0b21pY19sb25nX3JlYWQoJmNsaS0+Y2xfbHJ1X2J1c3kpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTk3LDggKzE5OCwxMCBAQAogewogCXN0cnVjdCBvYmRfZGV2aWNlICpkZXYgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YSktPnByaXZhdGU7CiAJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZkZXYtPnUuY2xpOwotCWludCBwYWdlc19udW1iZXIsIG11bHQsIHJjOworCWxvbmcgcGFnZXNfbnVtYmVyLCByYzsKIAljaGFyIGtlcm5idWZbMTI4XTsKKwlpbnQgbXVsdDsKKwl1NjQgdmFsOwogCiAJaWYgKGNvdW50ID49IHNpemVvZihrZXJuYnVmKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMTAsMTQgKzIxMywxOCBAQAogCW11bHQgPSAxIDw8ICgyMCAtIFBBR0VfU0hJRlQpOwogCWJ1ZmZlciArPSBscHJvY2ZzX2ZpbmRfbmFtZWRfdmFsdWUoa2VybmJ1ZiwgInVzZWRfbWI6IiwgJmNvdW50KSAtCiAJCSAga2VybmJ1ZjsKLQlyYyA9IGxwcm9jZnNfd3JpdGVfZnJhY19oZWxwZXIoYnVmZmVyLCBjb3VudCwgJnBhZ2VzX251bWJlciwgbXVsdCk7CisJcmMgPSBscHJvY2ZzX3dyaXRlX2ZyYWNfdTY0X2hlbHBlcihidWZmZXIsIGNvdW50LCAmdmFsLCBtdWx0KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAorCWlmICh2YWwgPiBMT05HX01BWCkKKwkJcmV0dXJuIC1FUkFOR0U7CisJcGFnZXNfbnVtYmVyID0gKGxvbmcpdmFsOworCiAJaWYgKHBhZ2VzX251bWJlciA8IDApCiAJCXJldHVybiAtRVJBTkdFOwogCi0JcmMgPSBhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkgLSBwYWdlc19udW1iZXI7CisJcmMgPSBhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSAtIHBhZ2VzX251bWJlcjsKIAlpZiAocmMgPiAwKSB7CiAJCXN0cnVjdCBsdV9lbnYgKmVudjsKIAkJaW50IHJlZmNoZWNrOwpAQCAtMjQ0LDcgKzI1MSw3IEBACiAJaW50IGxlbjsKIAogCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgY2xpLT5jbF9kaXJ0eSk7CisJbGVuID0gc3ByaW50ZihidWYsICIlbHVcbiIsIGNsaS0+Y2xfZGlydHlfcGFnZXMgPDwgUEFHRV9TSElGVCk7CiAJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CiAKIAlyZXR1cm4gbGVuOwpAQCAtNTgzLDYgKzU5MCw3IEBACiAJfQogCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKIAljbGktPmNsX21heF9wYWdlc19wZXJfcnBjID0gdmFsOworCWNsaWVudF9hZGp1c3RfbWF4X2RpcnR5KGNsaSk7CiAJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC01OTYsMTMgKzYwNCwxNCBAQAogCXN0cnVjdCBvYmRfZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IG9iZF9kZXZpY2UsCiAJCQkJCSAgICAgIG9iZF9rb2JqKTsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJmRldi0+dS5jbGk7Ci0JaW50IHBhZ2VzLCBtYjsKKwlsb25nIHBhZ2VzOworCWludCBtYjsKIAotCXBhZ2VzID0gYXRvbWljX3JlYWQoJmNsaS0+Y2xfdW5zdGFibGVfY291bnQpOworCXBhZ2VzID0gYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF91bnN0YWJsZV9jb3VudCk7CiAJbWIgPSAocGFnZXMgKiBQQUdFX1NJWkUpID4+IDIwOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAidW5zdGFibGVfcGFnZXM6ICU4ZFxuIgotCQkgICAgICAgInVuc3RhYmxlX21iOiAgICAlOGRcbiIsIHBhZ2VzLCBtYik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAidW5zdGFibGVfcGFnZXM6ICUyMGxkXG4iCisJCSAgICAgICAidW5zdGFibGVfbWI6ICAgICAgICAgICAgICAlMTBkXG4iLCBwYWdlcywgbWIpOwogfQogTFVTVFJFX1JPX0FUVFIodW5zdGFibGVfc3RhdHMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2NhY2hlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2NhY2hlLmMKaW5kZXggZDAxMTEzNS4uNGJiZTIxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19jYWNoZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfY2FjaGUuYwpAQCAtNDQsNyArNDQsNyBAQAogCiBzdGF0aWMgdm9pZCBvc2NfdXBkYXRlX3BlbmRpbmcoc3RydWN0IG9zY19vYmplY3QgKm9iaiwgaW50IGNtZCwgaW50IGRlbHRhKTsKIHN0YXRpYyBpbnQgb3NjX2V4dGVudF93YWl0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9zY19leHRlbnQgKmV4dCwKLQkJCSAgIGludCBzdGF0ZSk7CisJCQkgICBlbnVtIG9zY19leHRlbnRfc3RhdGUgc3RhdGUpOwogc3RhdGljIHZvaWQgb3NjX2FwX2NvbXBsZXRpb24oY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xpZW50X29iZCAqY2xpLAogCQkJICAgICAgc3RydWN0IG9zY19hc3luY19wYWdlICpvYXAsIGludCBzZW50LCBpbnQgcmMpOwogc3RhdGljIGludCBvc2NfbWFrZV9yZWFkeShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvc2NfYXN5bmNfcGFnZSAqb2FwLApAQCAtMTc3LDcgKzE3Nyw3IEBACiB7CiAJc3RydWN0IG9zY19vYmplY3QgKm9iaiA9IGV4dC0+b2Vfb2JqOwogCXN0cnVjdCBvc2NfYXN5bmNfcGFnZSAqb2FwOwotCWludCBwYWdlX2NvdW50OworCXNpemVfdCBwYWdlX2NvdW50OwogCWludCByYyA9IDA7CiAKIAlpZiAoIW9zY19vYmplY3RfaXNfbG9ja2VkKG9iaikpIHsKQEAgLTYzMiw3ICs2MzIsNyBAQAogICovCiBzdGF0aWMgc3RydWN0IG9zY19leHRlbnQgKm9zY19leHRlbnRfZmluZChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCiAJCQkJCSAgc3RydWN0IG9zY19vYmplY3QgKm9iaiwgcGdvZmZfdCBpbmRleCwKLQkJCQkJICBpbnQgKmdyYW50cykKKwkJCQkJICB1bnNpZ25lZCBpbnQgKmdyYW50cykKIHsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gb3NjX2NsaShvYmopOwogCXN0cnVjdCBvc2NfbG9jayAgICpvbGNrOwpAQCAtNjQzLDEwICs2NDMsMTAgQEAKIAlzdHJ1Y3Qgb3NjX2V4dGVudCAqZm91bmQgPSBOVUxMOwogCXBnb2ZmX3QgY2h1bms7CiAJcGdvZmZfdCBtYXhfZW5kOwotCWludCBtYXhfcGFnZXM7IC8qIG1heF9wYWdlc19wZXJfcnBjICovCi0JaW50IGNodW5rc2l6ZTsKKwl1bnNpZ25lZCBpbnQgbWF4X3BhZ2VzOyAvKiBtYXhfcGFnZXNfcGVyX3JwYyAqLworCXVuc2lnbmVkIGludCBjaHVua3NpemU7CiAJaW50IHBwY19iaXRzOyAvKiBwYWdlcyBwZXIgY2h1bmsgYml0cyAqLwotCWludCBjaHVua19tYXNrOworCXBnb2ZmX3QgY2h1bmtfbWFzazsKIAlpbnQgcmM7CiAKIAljdXIgPSBvc2NfZXh0ZW50X2FsbG9jKG9iaik7CkBAIC03MDAsOCArNzAwLDggQEAKIAlpZiAoIWV4dCkKIAkJZXh0ID0gZmlyc3RfZXh0ZW50KG9iaik7CiAJd2hpbGUgKGV4dCkgewotCQlsb2ZmX3QgZXh0X2Noa19zdGFydCA9IGV4dC0+b2Vfc3RhcnQgPj4gcHBjX2JpdHM7Ci0JCWxvZmZfdCBleHRfY2hrX2VuZCA9IGV4dC0+b2VfZW5kID4+IHBwY19iaXRzOworCQlwZ29mZl90IGV4dF9jaGtfc3RhcnQgPSBleHQtPm9lX3N0YXJ0ID4+IHBwY19iaXRzOworCQlwZ29mZl90IGV4dF9jaGtfZW5kID0gZXh0LT5vZV9lbmQgPj4gcHBjX2JpdHM7CiAKIAkJTEFTU0VSVChzYW5pdHlfY2hlY2tfbm9sb2NrKGV4dCkgPT0gMCk7CiAJCWlmIChjaHVuayA+IGV4dF9jaGtfZW5kICsgMSkKQEAgLTkxMyw3ICs5MTMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGV4dGVudF93YWl0X2NiKHN0cnVjdCBvc2NfZXh0ZW50ICpleHQsIGludCBzdGF0ZSkKK3N0YXRpYyBpbnQgZXh0ZW50X3dhaXRfY2Ioc3RydWN0IG9zY19leHRlbnQgKmV4dCwgZW51bSBvc2NfZXh0ZW50X3N0YXRlIHN0YXRlKQogewogCWludCByZXQ7CiAKQEAgLTkyOCw3ICs5MjgsNyBAQAogICogV2FpdCBmb3IgdGhlIGV4dGVudCdzIHN0YXRlIHRvIGJlY29tZSBAc3RhdGUuCiAgKi8KIHN0YXRpYyBpbnQgb3NjX2V4dGVudF93YWl0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9zY19leHRlbnQgKmV4dCwKLQkJCSAgIGludCBzdGF0ZSkKKwkJCSAgIGVudW0gb3NjX2V4dGVudF9zdGF0ZSBzdGF0ZSkKIHsKIAlzdHJ1Y3Qgb3NjX29iamVjdCAqb2JqID0gZXh0LT5vZV9vYmo7CiAJc3RydWN0IGxfd2FpdF9pbmZvIGx3aSA9IExXSV9USU1FT1VUX0lOVFIoY2ZzX3RpbWVfc2Vjb25kcyg2MDApLCBOVUxMLApAQCAtOTU4LDggKzk1OCw4IEBACiAJcmMgPSBsX3dhaXRfZXZlbnQoZXh0LT5vZV93YWl0cSwgZXh0ZW50X3dhaXRfY2IoZXh0LCBzdGF0ZSksICZsd2kpOwogCWlmIChyYyA9PSAtRVRJTUVET1VUKSB7CiAJCU9TQ19FWFRFTlRfRFVNUChEX0VSUk9SLCBleHQsCi0JCQkiJXM6IHdhaXQgZXh0IHRvICVkIHRpbWVkb3V0LCByZWNvdmVyeSBpbiBwcm9ncmVzcz9cbiIsCi0JCQlvc2NfZXhwb3J0KG9iaiktPmV4cF9vYmQtPm9iZF9uYW1lLCBzdGF0ZSk7CisJCQkJIiVzOiB3YWl0IGV4dCB0byAldSB0aW1lZG91dCwgcmVjb3ZlcnkgaW4gcHJvZ3Jlc3M/XG4iLAorCQkJCW9zY19leHBvcnQob2JqKS0+ZXhwX29iZC0+b2JkX25hbWUsIHN0YXRlKTsKIAogCQlsd2kgPSBMV0lfSU5UUihOVUxMLCBOVUxMKTsKIAkJcmMgPSBsX3dhaXRfZXZlbnQoZXh0LT5vZV93YWl0cSwgZXh0ZW50X3dhaXRfY2IoZXh0LCBzdGF0ZSksCkBAIC0xMDk5LDcgKzEwOTksNyBAQAogCXN0cnVjdCBvc2NfYXN5bmNfcGFnZSAqb2FwOwogCXN0cnVjdCBvc2NfYXN5bmNfcGFnZSAqbGFzdCA9IE5VTEw7CiAJc3RydWN0IG9zY19vYmplY3QgKm9iaiA9IGV4dC0+b2Vfb2JqOwotCWludCBwYWdlX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgcGFnZV9jb3VudCA9IDA7CiAJaW50IHJjOwogCiAJLyogd2UncmUgZ29pbmcgdG8gZ3JhYiBwYWdlIGxvY2ssIHNvIG9iamVjdCBsb2NrIG11c3Qgbm90IGJlIHRha2VuLiAqLwpAQCAtMTE0MCw5ICsxMTQwLDExIEBACiAJICogdGhlIHNpemUgb2YgZmlsZS4KIAkgKi8KIAlpZiAoIShsYXN0LT5vYXBfYXN5bmNfZmxhZ3MgJiBBU1lOQ19DT1VOVF9TVEFCTEUpKSB7Ci0JCWxhc3QtPm9hcF9jb3VudCA9IG9zY19yZWZyZXNoX2NvdW50KGVudiwgbGFzdCwgT0JEX0JSV19XUklURSk7Ci0JCUxBU1NFUlQobGFzdC0+b2FwX2NvdW50ID4gMCk7Ci0JCUxBU1NFUlQobGFzdC0+b2FwX3BhZ2Vfb2ZmICsgbGFzdC0+b2FwX2NvdW50IDw9IFBBR0VfU0laRSk7CisJCWludCBsYXN0X29hcF9jb3VudCA9IG9zY19yZWZyZXNoX2NvdW50KGVudiwgbGFzdCwgT0JEX0JSV19XUklURSk7CisKKwkJTEFTU0VSVChsYXN0X29hcF9jb3VudCA+IDApOworCQlMQVNTRVJUKGxhc3QtPm9hcF9wYWdlX29mZiArIGxhc3Rfb2FwX2NvdW50IDw9IFBBR0VfU0laRSk7CisJCWxhc3QtPm9hcF9jb3VudCA9IGxhc3Rfb2FwX2NvdW50OwogCQlzcGluX2xvY2soJmxhc3QtPm9hcF9sb2NrKTsKIAkJbGFzdC0+b2FwX2FzeW5jX2ZsYWdzIHw9IEFTWU5DX0NPVU5UX1NUQUJMRTsKIAkJc3Bpbl91bmxvY2soJmxhc3QtPm9hcF9sb2NrKTsKQEAgLTExNzQsNyArMTE3Niw4IEBACiAgKiBjYWxsZWQgdG8gZXhwYW5kIHRoZSBleHRlbnQgZm9yIHRoZSBzYW1lIElPLiBUbyBleHBhbmQgdGhlIGV4dGVudCwgdGhlCiAgKiBwYWdlIGluZGV4IG11c3QgYmUgaW4gdGhlIHNhbWUgb3IgbmV4dCBjaHVuayBvZiBleHQtPm9lX2VuZC4KICAqLwotc3RhdGljIGludCBvc2NfZXh0ZW50X2V4cGFuZChzdHJ1Y3Qgb3NjX2V4dGVudCAqZXh0LCBwZ29mZl90IGluZGV4LCBpbnQgKmdyYW50cykKK3N0YXRpYyBpbnQgb3NjX2V4dGVudF9leHBhbmQoc3RydWN0IG9zY19leHRlbnQgKmV4dCwgcGdvZmZfdCBpbmRleCwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpncmFudHMpCiB7CiAJc3RydWN0IG9zY19vYmplY3QgKm9iaiA9IGV4dC0+b2Vfb2JqOwogCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSBvc2NfY2xpKG9iaik7CkBAIC0xMTgzLDcgKzExODYsNyBAQAogCXBnb2ZmX3QgY2h1bmsgPSBpbmRleCA+PiBwcGNfYml0czsKIAlwZ29mZl90IGVuZF9jaHVuazsKIAlwZ29mZl90IGVuZF9pbmRleDsKLQlpbnQgY2h1bmtzaXplID0gMSA8PCBjbGktPmNsX2NodW5rYml0czsKKwl1bnNpZ25lZCBpbnQgY2h1bmtzaXplID0gMSA8PCBjbGktPmNsX2NodW5rYml0czsKIAlpbnQgcmMgPSAwOwogCiAJTEFTU0VSVChleHQtPm9lX21heF9lbmQgPj0gaW5kZXggJiYgZXh0LT5vZV9zdGFydCA8PSBpbmRleCk7CkBAIC0xMzYxLDcgKzEzNjQsNyBAQAogCWlmIChyYyA9PSAwICYmIHNydmxvY2spIHsKIAkJc3RydWN0IGx1X2RldmljZSAqbGQgPSBvcGctPm9wc19jbC5jcGxfb2JqLT5jb19sdS5sb19kZXY7CiAJCXN0cnVjdCBvc2Nfc3RhdHMgKnN0YXRzID0gJmx1Mm9zY19kZXYobGQpLT5vZF9zdGF0czsKLQkJaW50IGJ5dGVzID0gb2FwLT5vYXBfY291bnQ7CisJCXNpemVfdCBieXRlcyA9IG9hcC0+b2FwX2NvdW50OwogCiAJCWlmIChjcnQgPT0gQ1JUX1JFQUQpCiAJCQlzdGF0cy0+b3NfbG9ja2xlc3NfcmVhZHMgKz0gYnl0ZXM7CkBAIC0xMzgzLDE4ICsxMzg2LDE2IEBACiAKICNkZWZpbmUgT1NDX0RVTVBfR1JBTlQobHZsLCBjbGksIGZtdCwgYXJncy4uLikgZG8gewkJCSAgICAgIFwKIAlzdHJ1Y3QgY2xpZW50X29iZCAqX190bXAgPSAoY2xpKTsJCQkJICAgICAgXAotCUNERUJVRyhsdmwsICIlczogZ3JhbnQgeyBkaXJ0eTogJWxkLyVsZCBkaXJ0eV9wYWdlczogJWQvJWQgIgkgICAgICBcCi0JICAgICAgICJ1bnN0YWJsZV9wYWdlczogJWQvJWQgZHJvcHBlZDogJWxkIGF2YWlsOiAlbGQsICIJICAgICAgXAotCSAgICAgICAicmVzZXJ2ZWQ6ICVsZCwgZmxpZ2h0OiAlZCB9IGxydSB7aW4gbGlzdDogJWQsICIJCSAgICAgIFwKLQkgICAgICAgImxlZnQ6ICVkLCB3YWl0ZXJzOiAlZCB9IiBmbXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCUNERUJVRyhsdmwsICIlczogZ3JhbnQgeyBkaXJ0eTogJWxkLyVsZCBkaXJ0eV9wYWdlczogJWxkLyVsdSAiCSAgICAgIFwKKwkgICAgICAgImRyb3BwZWQ6ICVsZCBhdmFpbDogJWxkLCByZXNlcnZlZDogJWxkLCBmbGlnaHQ6ICVkIH0iCSAgICAgIFwKKwkgICAgICAgImxydSB7aW4gbGlzdDogJWxkLCBsZWZ0OiAlbGQsIHdhaXRlcnM6ICVkIH0iIGZtdCAiXG4iLAkgICAgICBcCiAJICAgICAgIF9fdG1wLT5jbF9pbXBvcnQtPmltcF9vYmQtPm9iZF9uYW1lLAkJCSAgICAgIFwKLQkgICAgICAgX190bXAtPmNsX2RpcnR5LCBfX3RtcC0+Y2xfZGlydHlfbWF4LAkJCSAgICAgIFwKLQkgICAgICAgYXRvbWljX3JlYWQoJm9iZF9kaXJ0eV9wYWdlcyksIG9iZF9tYXhfZGlydHlfcGFnZXMsCSAgICAgIFwKLQkgICAgICAgYXRvbWljX3JlYWQoJm9iZF91bnN0YWJsZV9wYWdlcyksIG9iZF9tYXhfZGlydHlfcGFnZXMsCSAgICAgIFwKKwkgICAgICAgX190bXAtPmNsX2RpcnR5X3BhZ2VzLCBfX3RtcC0+Y2xfZGlydHlfbWF4X3BhZ2VzLAkgICAgICBcCisJICAgICAgIGF0b21pY19sb25nX3JlYWQoJm9iZF9kaXJ0eV9wYWdlcyksIG9iZF9tYXhfZGlydHlfcGFnZXMsCSAgICAgIFwKIAkgICAgICAgX190bXAtPmNsX2xvc3RfZ3JhbnQsIF9fdG1wLT5jbF9hdmFpbF9ncmFudCwJCSAgICAgIFwKIAkgICAgICAgX190bXAtPmNsX3Jlc2VydmVkX2dyYW50LCBfX3RtcC0+Y2xfd19pbl9mbGlnaHQsCQkgICAgICBcCi0JICAgICAgIGF0b21pY19yZWFkKCZfX3RtcC0+Y2xfbHJ1X2luX2xpc3QpLAkJCSAgICAgIFwKLQkgICAgICAgYXRvbWljX3JlYWQoJl9fdG1wLT5jbF9scnVfYnVzeSksCQkJICAgICAgXAorCSAgICAgICBhdG9taWNfbG9uZ19yZWFkKCZfX3RtcC0+Y2xfbHJ1X2luX2xpc3QpLAkJICAgICAgXAorCSAgICAgICBhdG9taWNfbG9uZ19yZWFkKCZfX3RtcC0+Y2xfbHJ1X2J1c3kpLAkJCSAgICAgIFwKIAkgICAgICAgYXRvbWljX3JlYWQoJl9fdG1wLT5jbF9scnVfc2hyaW5rZXJzKSwgIyNhcmdzKTsJCSAgICAgIFwKIH0gd2hpbGUgKDApCiAKQEAgLTE0MDQsOCArMTQwNSw4IEBACiB7CiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwogCUxBU1NFUlQoIShwZ2EtPmZsYWcgJiBPQkRfQlJXX0ZST01fR1JBTlQpKTsKLQlhdG9taWNfaW5jKCZvYmRfZGlydHlfcGFnZXMpOwotCWNsaS0+Y2xfZGlydHkgKz0gUEFHRV9TSVpFOworCWF0b21pY19sb25nX2luYygmb2JkX2RpcnR5X3BhZ2VzKTsKKwljbGktPmNsX2RpcnR5X3BhZ2VzKys7CiAJcGdhLT5mbGFnIHw9IE9CRF9CUldfRlJPTV9HUkFOVDsKIAlDREVCVUcoRF9DQUNIRSwgInVzaW5nICVsdSBncmFudCBjcmVkaXRzIGZvciBicncgJXAgcGFnZSAlcFxuIiwKIAkgICAgICAgUEFHRV9TSVpFLCBwZ2EsIHBnYS0+cGcpOwpAQCAtMTQyNCwxMiArMTQyNSwxMiBAQAogCX0KIAogCXBnYS0+ZmxhZyAmPSB+T0JEX0JSV19GUk9NX0dSQU5UOwotCWF0b21pY19kZWMoJm9iZF9kaXJ0eV9wYWdlcyk7Ci0JY2xpLT5jbF9kaXJ0eSAtPSBQQUdFX1NJWkU7CisJYXRvbWljX2xvbmdfZGVjKCZvYmRfZGlydHlfcGFnZXMpOworCWNsaS0+Y2xfZGlydHlfcGFnZXMtLTsKIAlpZiAocGdhLT5mbGFnICYgT0JEX0JSV19OT0NBQ0hFKSB7CiAJCXBnYS0+ZmxhZyAmPSB+T0JEX0JSV19OT0NBQ0hFOwotCQlhdG9taWNfZGVjKCZvYmRfZGlydHlfdHJhbnNpdF9wYWdlcyk7Ci0JCWNsaS0+Y2xfZGlydHlfdHJhbnNpdCAtPSBQQUdFX1NJWkU7CisJCWF0b21pY19sb25nX2RlYygmb2JkX2RpcnR5X3RyYW5zaXRfcGFnZXMpOworCQljbGktPmNsX2RpcnR5X3RyYW5zaXQtLTsKIAl9CiB9CiAKQEAgLTE0OTQsMTEgKzE0OTUsMTEgQEAKIHN0YXRpYyB2b2lkIG9zY19mcmVlX2dyYW50KHN0cnVjdCBjbGllbnRfb2JkICpjbGksIHVuc2lnbmVkIGludCBucl9wYWdlcywKIAkJCSAgIHVuc2lnbmVkIGludCBsb3N0X2dyYW50KQogewotCWludCBncmFudCA9ICgxIDw8IGNsaS0+Y2xfY2h1bmtiaXRzKSArIGNsaS0+Y2xfZXh0ZW50X3RheDsKKwl1bnNpZ25lZCBsb25nIGdyYW50ID0gKDEgPDwgY2xpLT5jbF9jaHVua2JpdHMpICsgY2xpLT5jbF9leHRlbnRfdGF4OwogCiAJc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCWF0b21pY19zdWIobnJfcGFnZXMsICZvYmRfZGlydHlfcGFnZXMpOwotCWNsaS0+Y2xfZGlydHkgLT0gbnJfcGFnZXMgPDwgUEFHRV9TSElGVDsKKwlhdG9taWNfbG9uZ19zdWIobnJfcGFnZXMsICZvYmRfZGlydHlfcGFnZXMpOworCWNsaS0+Y2xfZGlydHlfcGFnZXMgLT0gbnJfcGFnZXM7CiAJY2xpLT5jbF9sb3N0X2dyYW50ICs9IGxvc3RfZ3JhbnQ7CiAJaWYgKGNsaS0+Y2xfYXZhaWxfZ3JhbnQgPCBncmFudCAmJiBjbGktPmNsX2xvc3RfZ3JhbnQgPj0gZ3JhbnQpIHsKIAkJLyogYm9ycm93IHNvbWUgZ3JhbnQgZnJvbSB0cnVuY2F0ZSB0byBhdm9pZCB0aGUgY2FzZSB0aGF0CkBAIC0xNTExLDcgKzE1MTIsNyBAQAogCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwogCUNERUJVRyhEX0NBQ0hFLCAibG9zdCAldSBncmFudDogJWx1IGF2YWlsOiAlbHUgZGlydHk6ICVsdVxuIiwKIAkgICAgICAgbG9zdF9ncmFudCwgY2xpLT5jbF9sb3N0X2dyYW50LAotCSAgICAgICBjbGktPmNsX2F2YWlsX2dyYW50LCBjbGktPmNsX2RpcnR5KTsKKwkgICAgICAgY2xpLT5jbF9hdmFpbF9ncmFudCwgY2xpLT5jbF9kaXJ0eV9wYWdlcyA8PCBQQUdFX1NISUZUKTsKIH0KIAogLyoqCkBAIC0xNTM1LDE5ICsxNTM2LDE4IEBACiB7CiAJaW50IHJjOwogCi0JT1NDX0RVTVBfR1JBTlQoRF9DQUNIRSwgY2xpLCAibmVlZDolZC5cbiIsIGJ5dGVzKTsKKwlPU0NfRFVNUF9HUkFOVChEX0NBQ0hFLCBjbGksICJuZWVkOiVkXG4iLCBieXRlcyk7CiAKIAlyYyA9IG9zY19yZXNlcnZlX2dyYW50KGNsaSwgYnl0ZXMpOwogCWlmIChyYyA8IDApCiAJCXJldHVybiAwOwogCi0JaWYgKGNsaS0+Y2xfZGlydHkgKyBQQUdFX1NJWkUgPD0gY2xpLT5jbF9kaXJ0eV9tYXggJiYKLQkgICAgYXRvbWljX3JlYWQoJm9iZF91bnN0YWJsZV9wYWdlcykgKyAxICsKLQkgICAgYXRvbWljX3JlYWQoJm9iZF9kaXJ0eV9wYWdlcykgPD0gb2JkX21heF9kaXJ0eV9wYWdlcykgeworCWlmIChjbGktPmNsX2RpcnR5X3BhZ2VzIDw9IGNsaS0+Y2xfZGlydHlfbWF4X3BhZ2VzICYmCisJICAgIGF0b21pY19sb25nX3JlYWQoJm9iZF9kaXJ0eV9wYWdlcykgKyAxIDw9IG9iZF9tYXhfZGlydHlfcGFnZXMpIHsKIAkJb3NjX2NvbnN1bWVfd3JpdGVfZ3JhbnQoY2xpLCAmb2FwLT5vYXBfYnJ3X3BhZ2UpOwogCQlpZiAodHJhbnNpZW50KSB7Ci0JCQljbGktPmNsX2RpcnR5X3RyYW5zaXQgKz0gUEFHRV9TSVpFOwotCQkJYXRvbWljX2luYygmb2JkX2RpcnR5X3RyYW5zaXRfcGFnZXMpOworCQkJY2xpLT5jbF9kaXJ0eV90cmFuc2l0Kys7CisJCQlhdG9taWNfbG9uZ19pbmMoJm9iZF9kaXJ0eV90cmFuc2l0X3BhZ2VzKTsKIAkJCW9hcC0+b2FwX2Jyd19mbGFncyB8PSBPQkRfQlJXX05PQ0FDSEU7CiAJCX0KIAkJcmMgPSAxOwpAQCAtMTU4MSwxMSArMTU4MSwxMyBAQAogCXN0cnVjdCBvc2Nfb2JqZWN0ICpvc2MgPSBvYXAtPm9hcF9vYmo7CiAJc3RydWN0IGxvdl9vaW5mbyAqbG9pID0gb3NjLT5vb19vaW5mbzsKIAlzdHJ1Y3Qgb3NjX2NhY2hlX3dhaXRlciBvY3c7Ci0Jc3RydWN0IGxfd2FpdF9pbmZvIGx3aSA9IExXSV9USU1FT1VUX0lOVFIoY2ZzX3RpbWVfc2Vjb25kcyg2MDApLCBOVUxMLAotCQkJCQkJICBMV0lfT05fU0lHTkFMX05PT1AsIE5VTEwpOworCXN0cnVjdCBsX3dhaXRfaW5mbyBsd2k7CiAJaW50IHJjID0gLUVEUVVPVDsKIAotCU9TQ19EVU1QX0dSQU5UKERfQ0FDSEUsIGNsaSwgIm5lZWQ6JWQuXG4iLCBieXRlcyk7CisJbHdpID0gTFdJX1RJTUVPVVRfSU5UUihjZnNfdGltZV9zZWNvbmRzKEFUX09GRiA/IG9iZF90aW1lb3V0IDogYXRfbWF4KSwKKwkJCSAgICAgICBOVUxMLCBMV0lfT05fU0lHTkFMX05PT1AsIE5VTEwpOworCisJT1NDX0RVTVBfR1JBTlQoRF9DQUNIRSwgY2xpLCAibmVlZDolZFxuIiwgYnl0ZXMpOwogCiAJc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwogCkBAIC0xNTkzLDE0ICsxNTk1LDE2IEBACiAJICogb2YgcXVldWVkIHdyaXRlcyBhbmQgY3JlYXRlIGEgZGlzY29udGlndW91cyBycGMgc3RyZWFtCiAJICovCiAJaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX09TQ19OT19HUkFOVCkgfHwKLQkgICAgY2xpLT5jbF9kaXJ0eV9tYXggPCBQQUdFX1NJWkUgICAgIHx8Ci0JICAgIGNsaS0+Y2xfYXIuYXJfZm9yY2Vfc3luYyB8fCBsb2ktPmxvaV9hci5hcl9mb3JjZV9zeW5jKSB7CisJICAgICFjbGktPmNsX2RpcnR5X21heF9wYWdlcyB8fCBjbGktPmNsX2FyLmFyX2ZvcmNlX3N5bmMgfHwKKwkgICAgbG9pLT5sb2lfYXIuYXJfZm9yY2Vfc3luYykgeworCQlPU0NfRFVNUF9HUkFOVChEX0NBQ0hFLCBjbGksICJmb3JjZWQgc3luYyBpL29cbiIpOwogCQlyYyA9IC1FRFFVT1Q7CiAJCWdvdG8gb3V0OwogCX0KIAogCS8qIEhvcGVmdWxseSBub3JtYWwgY2FzZSAtIGNhY2hlIHNwYWNlIGFuZCB3cml0ZSBjcmVkaXRzIGF2YWlsYWJsZSAqLwogCWlmIChvc2NfZW50ZXJfY2FjaGVfdHJ5KGNsaSwgb2FwLCBieXRlcywgMCkpIHsKKwkJT1NDX0RVTVBfR1JBTlQoRF9DQUNIRSwgY2xpLCAiZ3JhbnRlZCBmcm9tIGNhY2hlXG4iKTsKIAkJcmMgPSAwOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xNjE1LDcgKzE2MTksNyBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9jdy5vY3dfd2FpdHEpOwogCW9jdy5vY3dfb2FwICAgPSBvYXA7CiAJb2N3Lm9jd19ncmFudCA9IGJ5dGVzOwotCXdoaWxlIChjbGktPmNsX2RpcnR5ID4gMCB8fCBjbGktPmNsX3dfaW5fZmxpZ2h0ID4gMCkgeworCXdoaWxlIChjbGktPmNsX2RpcnR5X3BhZ2VzID4gMCB8fCBjbGktPmNsX3dfaW5fZmxpZ2h0ID4gMCkgewogCQlsaXN0X2FkZF90YWlsKCZvY3cub2N3X2VudHJ5LCAmY2xpLT5jbF9jYWNoZV93YWl0ZXJzKTsKIAkJb2N3Lm9jd19yYyA9IDA7CiAJCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwpAQCAtMTYyOSwzMiArMTYzMyw0OSBAQAogCiAJCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKIAotCQkvKiBsX3dhaXRfZXZlbnQgaXMgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLCBvciB0aW1lZCBvdXQgKi8KIAkJaWYgKHJjIDwgMCkgewotCQkJaWYgKHJjID09IC1FVElNRURPVVQpIHsKLQkJCQlPU0NfRFVNUF9HUkFOVChEX0VSUk9SLCBjbGksCi0JCQkJCSAgICAgICAidHJ5IHRvIHJlc2VydmUgJWQuXG4iLCBieXRlcyk7Ci0JCQkJb3NjX2V4dGVudF90cmVlX2R1bXAoRF9FUlJPUiwgb3NjKTsKLQkJCQlyYyA9IC1FRFFVT1Q7Ci0JCQl9Ci0KKwkJCS8qIGxfd2FpdF9ldmVudCBpcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwsIG9yIHRpbWVkIG91dCAqLwogCQkJbGlzdF9kZWxfaW5pdCgmb2N3Lm9jd19lbnRyeSk7Ci0JCQlnb3RvIG91dDsKKwkJCWJyZWFrOwogCQl9Ci0KIAkJTEFTU0VSVChsaXN0X2VtcHR5KCZvY3cub2N3X2VudHJ5KSk7CiAJCXJjID0gb2N3Lm9jd19yYzsKIAogCQlpZiAocmMgIT0gLUVEUVVPVCkKLQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CiAJCWlmIChvc2NfZW50ZXJfY2FjaGVfdHJ5KGNsaSwgb2FwLCBieXRlcywgMCkpIHsKIAkJCXJjID0gMDsKLQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CiAJCX0KIAl9CisKKwlzd2l0Y2ggKHJjKSB7CisJY2FzZSAwOgorCQlPU0NfRFVNUF9HUkFOVChEX0NBQ0hFLCBjbGksICJmaW5hbGx5IGdvdCBncmFudCBzcGFjZVxuIik7CisJCWJyZWFrOworCWNhc2UgLUVUSU1FRE9VVDoKKwkJT1NDX0RVTVBfR1JBTlQoRF9DQUNIRSwgY2xpLAorCQkJICAgICAgICJ0aW1lb3V0LCBmYWxsIGJhY2sgdG8gc3luYyBpL29cbiIpOworCQlvc2NfZXh0ZW50X3RyZWVfZHVtcChEX0NBQ0hFLCBvc2MpOworCQkvKiBmYWxsIGJhY2sgdG8gc3luY2hyb25vdXMgSS9PICovCisJCXJjID0gLUVEUVVPVDsKKwkJYnJlYWs7CisJY2FzZSAtRUlOVFI6CisJCS8qIEVuc3VyZXMgcmVzdGFydGFiaWxpdHkgLSBMVS0zNTgxICovCisJCU9TQ19EVU1QX0dSQU5UKERfQ0FDSEUsIGNsaSwgImludGVycnVwdGVkXG4iKTsKKwkJcmMgPSAtRVJFU1RBUlRTWVM7CisJCWJyZWFrOworCWNhc2UgLUVEUVVPVDoKKwkJT1NDX0RVTVBfR1JBTlQoRF9DQUNIRSwgY2xpLAorCQkJICAgICAgICJubyBncmFudCBzcGFjZSwgZmFsbCBiYWNrIHRvIHN5bmMgaS9vXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQ0RFQlVHKERfQ0FDSEUsICIlczogZXZlbnQgZm9yIGNhY2hlIHNwYWNlIEAgJXAgbmV2ZXIgYXJyaXZlZCBkdWUgdG8gJWQsIGZhbGwgYmFjayB0byBzeW5jIGkvb1xuIiwKKwkJICAgICAgIGNsaS0+Y2xfaW1wb3J0LT5pbXBfb2JkLT5vYmRfbmFtZSwgJm9jdywgcmMpOworCQlicmVhazsKKwl9CiBvdXQ6CiAJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JT1NDX0RVTVBfR1JBTlQoRF9DQUNIRSwgY2xpLCAicmV0dXJuZWQgJWQuXG4iLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNjcwLDE5ICsxNjkxLDE3IEBACiAKIAkJb2N3LT5vY3dfcmMgPSAtRURRVU9UOwogCQkvKiB3ZSBjYW4ndCBkaXJ0eSBtb3JlICovCi0JCWlmICgoY2xpLT5jbF9kaXJ0eSArIFBBR0VfU0laRSA+IGNsaS0+Y2xfZGlydHlfbWF4KSB8fAotCQkgICAgKGF0b21pY19yZWFkKCZvYmRfdW5zdGFibGVfcGFnZXMpICsgMSArCi0JCSAgICAgYXRvbWljX3JlYWQoJm9iZF9kaXJ0eV9wYWdlcykgPiBvYmRfbWF4X2RpcnR5X3BhZ2VzKSkgewotCQkJQ0RFQlVHKERfQ0FDSEUsICJubyBkaXJ0eSByb29tOiBkaXJ0eTogJWxkIG9zYyBtYXggJWxkLCBzeXMgbWF4ICVkXG4iLAotCQkJICAgICAgIGNsaS0+Y2xfZGlydHksCi0JCQkgICAgICAgY2xpLT5jbF9kaXJ0eV9tYXgsIG9iZF9tYXhfZGlydHlfcGFnZXMpOworCQlpZiAoKGNsaS0+Y2xfZGlydHlfcGFnZXMgPiBjbGktPmNsX2RpcnR5X21heF9wYWdlcykgfHwKKwkJICAgIChhdG9taWNfbG9uZ19yZWFkKCZvYmRfZGlydHlfcGFnZXMpICsgMSA+CisJCSAgICAgb2JkX21heF9kaXJ0eV9wYWdlcykpIHsKKwkJCUNERUJVRyhEX0NBQ0hFLCAibm8gZGlydHkgcm9vbTogZGlydHk6ICVsZCBvc2MgbWF4ICVsZCwgc3lzIG1heCAlbGRcbiIsCisJCQkgICAgICAgY2xpLT5jbF9kaXJ0eV9wYWdlcywgY2xpLT5jbF9kaXJ0eV9tYXhfcGFnZXMsCisJCQkgICAgICAgb2JkX21heF9kaXJ0eV9wYWdlcyk7CiAJCQlnb3RvIHdha2V1cDsKIAkJfQogCi0JCW9jdy0+b2N3X3JjID0gMDsKLQkJaWYgKCFvc2NfZW50ZXJfY2FjaGVfdHJ5KGNsaSwgb2N3LT5vY3dfb2FwLCBvY3ctPm9jd19ncmFudCwgMCkpCi0JCQlvY3ctPm9jd19yYyA9IC1FRFFVT1Q7Ci0KKwkJaWYgKG9zY19lbnRlcl9jYWNoZV90cnkoY2xpLCBvY3ctPm9jd19vYXAsIG9jdy0+b2N3X2dyYW50LCAwKSkKKwkJCW9jdy0+b2N3X3JjID0gMDsKIHdha2V1cDoKIAkJQ0RFQlVHKERfQ0FDSEUsICJ3YWtlIHVwICVwIGZvciBvYXAgJXAsIGF2YWlsIGdyYW50ICVsZCwgJWRcbiIsCiAJCSAgICAgICBvY3csIG9jdy0+b2N3X29hcCwgY2xpLT5jbF9hdmFpbF9ncmFudCwgb2N3LT5vY3dfcmMpOwpAQCAtMTg0Myw5NyArMTg2Miw2IEBACiAJCWFyLT5hcl9mb3JjZV9zeW5jID0gMDsKIH0KIAotLyoqCi0gKiBQZXJmb3JtcyAidW5zdGFibGUiIHBhZ2UgYWNjb3VudGluZy4gVGhpcyBmdW5jdGlvbiBiYWxhbmNlcyB0aGUKLSAqIGluY3JlbWVudCBvcGVyYXRpb25zIHBlcmZvcm1lZCBpbiBvc2NfaW5jX3Vuc3RhYmxlX3BhZ2VzLiBJdCBpcwotICogcmVnaXN0ZXJlZCBhcyB0aGUgUlBDIHJlcXVlc3QgY2FsbGJhY2ssIGFuZCBpcyBleGVjdXRlZCB3aGVuIHRoZQotICogYnVsayBSUEMgaXMgY29tbWl0dGVkIG9uIHRoZSBzZXJ2ZXIuIFRodXMgYXQgdGhpcyBwb2ludCwgdGhlIHBhZ2VzCi0gKiBpbnZvbHZlZCBpbiB0aGUgYnVsayB0cmFuc2ZlciBhcmUgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgdW5zdGFibGUuCi0gKi8KLXZvaWQgb3NjX2RlY191bnN0YWJsZV9wYWdlcyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKLXsKLQlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJnJlcS0+cnFfaW1wb3J0LT5pbXBfb2JkLT51LmNsaTsKLQlzdHJ1Y3QgcHRscnBjX2J1bGtfZGVzYyAqZGVzYyA9IHJlcS0+cnFfYnVsazsKLQlpbnQgcGFnZV9jb3VudCA9IGRlc2MtPmJkX2lvdl9jb3VudDsKLQlpbnQgaTsKLQotCS8qIE5vIHVuc3RhYmxlIHBhZ2UgdHJhY2tpbmcgKi8KLQlpZiAoIWNsaS0+Y2xfY2FjaGUpCi0JCXJldHVybjsKLQotCUxBU1NFUlQocGFnZV9jb3VudCA+PSAwKTsKLQotCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspCi0JCWRlY19ub2RlX3BhZ2Vfc3RhdGUoZGVzYy0+YmRfaW92W2ldLmtpb3ZfcGFnZSwKLQkJCQkJCQlOUl9VTlNUQUJMRV9ORlMpOwotCi0JYXRvbWljX3N1YihwYWdlX2NvdW50LCAmY2xpLT5jbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX25yKTsKLQlMQVNTRVJUKGF0b21pY19yZWFkKCZjbGktPmNsX2NhY2hlLT5jY2NfdW5zdGFibGVfbnIpID49IDApOwotCi0JYXRvbWljX3N1YihwYWdlX2NvdW50LCAmY2xpLT5jbF91bnN0YWJsZV9jb3VudCk7Ci0JTEFTU0VSVChhdG9taWNfcmVhZCgmY2xpLT5jbF91bnN0YWJsZV9jb3VudCkgPj0gMCk7Ci0KLQlhdG9taWNfc3ViKHBhZ2VfY291bnQsICZvYmRfdW5zdGFibGVfcGFnZXMpOwotCUxBU1NFUlQoYXRvbWljX3JlYWQoJm9iZF91bnN0YWJsZV9wYWdlcykgPj0gMCk7Ci0KLQlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7Ci0JcmVxLT5ycV9jb21taXR0ZWQgPSAxOwotCXJlcS0+cnFfdW5zdGFibGUgID0gMDsKLQlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKLQotCXdha2VfdXBfYWxsKCZjbGktPmNsX2NhY2hlLT5jY2NfdW5zdGFibGVfd2FpdHEpOwotfQotCi0vKiAidW5zdGFibGUiIHBhZ2UgYWNjb3VudGluZy4gU2VlOiBvc2NfZGVjX3Vuc3RhYmxlX3BhZ2VzLiAqLwotdm9pZCBvc2NfaW5jX3Vuc3RhYmxlX3BhZ2VzKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKQotewotCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSAmcmVxLT5ycV9pbXBvcnQtPmltcF9vYmQtPnUuY2xpOwotCXN0cnVjdCBwdGxycGNfYnVsa19kZXNjICpkZXNjID0gcmVxLT5ycV9idWxrOwotCWxvbmcgcGFnZV9jb3VudCA9IGRlc2MtPmJkX2lvdl9jb3VudDsKLQlpbnQgaTsKLQotCS8qIE5vIHVuc3RhYmxlIHBhZ2UgdHJhY2tpbmcgKi8KLQlpZiAoIWNsaS0+Y2xfY2FjaGUpCi0JCXJldHVybjsKLQotCUxBU1NFUlQocGFnZV9jb3VudCA+PSAwKTsKLQotCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspCi0JCWluY19ub2RlX3BhZ2Vfc3RhdGUoZGVzYy0+YmRfaW92W2ldLmtpb3ZfcGFnZSwKLQkJCQkJCQlOUl9VTlNUQUJMRV9ORlMpOwotCi0JTEFTU0VSVChhdG9taWNfcmVhZCgmY2xpLT5jbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX25yKSA+PSAwKTsKLQlhdG9taWNfYWRkKHBhZ2VfY291bnQsICZjbGktPmNsX2NhY2hlLT5jY2NfdW5zdGFibGVfbnIpOwotCi0JTEFTU0VSVChhdG9taWNfcmVhZCgmY2xpLT5jbF91bnN0YWJsZV9jb3VudCkgPj0gMCk7Ci0JYXRvbWljX2FkZChwYWdlX2NvdW50LCAmY2xpLT5jbF91bnN0YWJsZV9jb3VudCk7Ci0KLQlMQVNTRVJUKGF0b21pY19yZWFkKCZvYmRfdW5zdGFibGVfcGFnZXMpID49IDApOwotCWF0b21pY19hZGQocGFnZV9jb3VudCwgJm9iZF91bnN0YWJsZV9wYWdlcyk7Ci0KLQlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7Ci0KLQkvKgotCSAqIElmIHRoZSByZXF1ZXN0IGhhcyBhbHJlYWR5IGJlZW4gY29tbWl0dGVkIChpLmUuIGJyd19jb21taXQKLQkgKiBjYWxsZWQgdmlhIHJxX2NvbW1pdF9jYiksIHdlIG5lZWQgdG8gdW5kbyB0aGUgdW5zdGFibGUgcGFnZQotCSAqIGluY3JlbWVudHMgd2UganVzdCBwZXJmb3JtZWQgYmVjYXVzZSBycV9jb21taXRfY2Igd29udCBiZQotCSAqIGNhbGxlZCBhZ2Fpbi4gT3RoZXJ3aXNlLCBqdXN0IHNldCB0aGUgY29tbWl0IGNhbGxiYWNrIHNvIHRoZQotCSAqIHVuc3RhYmxlIHBhZ2UgYWNjb3VudGluZyBpcyBwcm9wZXJseSB1cGRhdGVkIHdoZW4gdGhlIHJlcXVlc3QKLQkgKiBpcyBjb21taXR0ZWQKLQkgKi8KLQlpZiAocmVxLT5ycV9jb21taXR0ZWQpIHsKLQkJLyogRHJvcCBsb2NrIGJlZm9yZSBjYWxsaW5nIG9zY19kZWNfdW5zdGFibGVfcGFnZXMgKi8KLQkJc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7Ci0JCW9zY19kZWNfdW5zdGFibGVfcGFnZXMocmVxKTsKLQkJc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOwotCX0gZWxzZSB7Ci0JCXJlcS0+cnFfdW5zdGFibGUgPSAxOwotCQlyZXEtPnJxX2NvbW1pdF9jYiA9IG9zY19kZWNfdW5zdGFibGVfcGFnZXM7Ci0JfQotCi0Jc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7Ci19Ci0KIC8qIHRoaXMgbXVzdCBiZSBjYWxsZWQgaG9sZGluZyB0aGUgbG9pIGxpc3QgbG9jayB0byBnaXZlIGNvdmVyYWdlIHRvIGV4aXRfY2FjaGUsCiAgKiBhc3luY19mbGFnIG1haW50ZW5hbmNlLCBhbmQgb2FwX3JlcXVlc3QKICAqLwpAQCAtMTk0NSw5ICsxODczLDYgQEAKIAlfX3U2NCB4aWQgPSAwOwogCiAJaWYgKG9hcC0+b2FwX3JlcXVlc3QpIHsKLQkJaWYgKCFyYykKLQkJCW9zY19pbmNfdW5zdGFibGVfcGFnZXMob2FwLT5vYXBfcmVxdWVzdCk7Ci0KIAkJeGlkID0gcHRscnBjX3JlcV94aWQob2FwLT5vYXBfcmVxdWVzdCk7CiAJCXB0bHJwY19yZXFfZmluaXNoZWQob2FwLT5vYXBfcmVxdWVzdCk7CiAJCW9hcC0+b2FwX3JlcXVlc3QgPSBOVUxMOwpAQCAtMTk3OSw3ICsxOTA0LDcgQEAKICAqLwogc3RhdGljIGludCB0cnlfdG9fYWRkX2V4dGVudF9mb3JfaW8oc3RydWN0IGNsaWVudF9vYmQgKmNsaSwKIAkJCQkgICAgc3RydWN0IG9zY19leHRlbnQgKmV4dCwgc3RydWN0IGxpc3RfaGVhZCAqcnBjbGlzdCwKLQkJCQkgICAgaW50ICpwYywgdW5zaWduZWQgaW50ICptYXhfcGFnZXMpCisJCQkJICAgIHVuc2lnbmVkIGludCAqcGMsIHVuc2lnbmVkIGludCAqbWF4X3BhZ2VzKQogewogCXN0cnVjdCBvc2NfZXh0ZW50ICp0bXA7CiAJc3RydWN0IG9zY19hc3luY19wYWdlICpvYXAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZleHQtPm9lX3BhZ2VzLApAQCAtMjAzMiwxMiArMTk1NywxMyBAQAogICogNS4gVHJhdmVyc2UgdGhlIGV4dGVudCB0cmVlIGZyb20gdGhlIDFzdCBleHRlbnQ7CiAgKiA2LiBBYm92ZSBzdGVwcyBleGl0IGlmIHRoZXJlIGlzIG5vIHNwYWNlIGluIHRoaXMgUlBDLgogICovCi1zdGF0aWMgaW50IGdldF93cml0ZV9leHRlbnRzKHN0cnVjdCBvc2Nfb2JqZWN0ICpvYmosIHN0cnVjdCBsaXN0X2hlYWQgKnJwY2xpc3QpCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF93cml0ZV9leHRlbnRzKHN0cnVjdCBvc2Nfb2JqZWN0ICpvYmosCisJCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqcnBjbGlzdCkKIHsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gb3NjX2NsaShvYmopOwogCXN0cnVjdCBvc2NfZXh0ZW50ICpleHQ7CiAJc3RydWN0IG9zY19leHRlbnQgKnRlbXA7Ci0JaW50IHBhZ2VfY291bnQgPSAwOworCXVuc2lnbmVkIGludCBwYWdlX2NvdW50ID0gMDsKIAl1bnNpZ25lZCBpbnQgbWF4X3BhZ2VzID0gY2xpLT5jbF9tYXhfcGFnZXNfcGVyX3JwYzsKIAogCUxBU1NFUlQob3NjX29iamVjdF9pc19sb2NrZWQob2JqKSk7CkBAIC0yMTc1LDcgKzIxMDEsNyBAQAogCXN0cnVjdCBvc2NfZXh0ZW50ICpleHQ7CiAJc3RydWN0IG9zY19leHRlbnQgKm5leHQ7CiAJTElTVF9IRUFEKHJwY2xpc3QpOwotCWludCBwYWdlX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgcGFnZV9jb3VudCA9IDA7CiAJdW5zaWduZWQgaW50IG1heF9wYWdlcyA9IGNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGM7CiAJaW50IHJjID0gMDsKIApAQCAtMjM5MCw3ICsyMzE2LDcgQEAKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gb2FwLT5vYXBfY2xpOwogCXN0cnVjdCBvc2Nfb2JqZWN0ICpvc2MgPSBvYXAtPm9hcF9vYmo7CiAJcGdvZmZfdCBpbmRleDsKLQlpbnQgZ3JhbnRzID0gMDsKKwl1bnNpZ25lZCBpbnQgZ3JhbnRzID0gMCwgdG1wOwogCWludCBicndfZmxhZ3MgPSBPQkRfQlJXX0FTWU5DOwogCWludCBjbWQgPSBPQkRfQlJXX1dSSVRFOwogCWludCBuZWVkX3JlbGVhc2UgPSAwOwpAQCAtMjQzNCw5ICsyMzYwLDYgQEAKIAkJCXJldHVybiByYzsKIAl9CiAKLQlpZiAob3NjX292ZXJfdW5zdGFibGVfc29mdF9saW1pdChjbGkpKQotCQlicndfZmxhZ3MgfD0gT0JEX0JSV19TT0ZUX1NZTkM7Ci0KIAlvYXAtPm9hcF9jbWQgPSBjbWQ7CiAJb2FwLT5vYXBfcGFnZV9vZmYgPSBvcHMtPm9wc19mcm9tOwogCW9hcC0+b2FwX2NvdW50ID0gb3BzLT5vcHNfdG8gLSBvcHMtPm9wc19mcm9tOwpAQCAtMjQ3Niw3ICsyMzk5LDcgQEAKIAkJCWdyYW50cyA9IDA7CiAJCQluZWVkX3JlbGVhc2UgPSAxOwogCQl9IGVsc2UgaWYgKGV4dC0+b2VfZW5kIDwgaW5kZXgpIHsKLQkJCWludCB0bXAgPSBncmFudHM7CisJCQl0bXAgPSBncmFudHM7CiAJCQkvKiB0cnkgdG8gZXhwYW5kIHRoaXMgZXh0ZW50ICovCiAJCQlyYyA9IG9zY19leHRlbnRfZXhwYW5kKGV4dCwgaW5kZXgsICZ0bXApOwogCQkJaWYgKHJjIDwgMCkgewpAQCAtMjUwMSw3ICsyNDI0LDcgQEAKIAl9CiAKIAlpZiAoIWV4dCkgewotCQlpbnQgdG1wID0gKDEgPDwgY2xpLT5jbF9jaHVua2JpdHMpICsgY2xpLT5jbF9leHRlbnRfdGF4OworCQl0bXAgPSAoMSA8PCBjbGktPmNsX2NodW5rYml0cykgKyBjbGktPmNsX2V4dGVudF90YXg7CiAKIAkJLyogdHJ5IHRvIGZpbmQgbmV3IGV4dGVudCB0byBjb3ZlciB0aGlzIHBhZ2UgKi8KIAkJTEFTU0VSVCghb2lvLT5vaV9hY3RpdmUpOwpAQCAtMjY0NSw3ICsyNTY4LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlzcGluX2xvY2soJm9hcC0+b2FwX2xvY2spOwotCW9hcC0+b2FwX2FzeW5jX2ZsYWdzIHw9IEFTWU5DX1JFQURZfEFTWU5DX1VSR0VOVDsKKwlvYXAtPm9hcF9hc3luY19mbGFncyB8PSBBU1lOQ19SRUFEWSB8IEFTWU5DX1VSR0VOVDsKIAlzcGluX3VubG9jaygmb2FwLT5vYXBfbG9jayk7CiAKIAlpZiAobWVtb3J5X3ByZXNzdXJlX2dldCgpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19jbF9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19jbF9pbnRlcm5hbC5oCmluZGV4IGM4YzNmMWMuLjljOGRlMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfY2xfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2NsX2ludGVybmFsLmgKQEAgLTY0LDcgKzY0LDcgQEAKIAkvKiogdHJ1ZSBpZiB0aGlzIGlvIGlzIGxvY2tsZXNzLiAqLwogCXVuc2lnbmVkIGludAkJb2lfbG9ja2xlc3M7CiAJLyoqIGhvdyBtYW55IExSVSBwYWdlcyBhcmUgcmVzZXJ2ZWQgZm9yIHRoaXMgSU8gKi8KLQlpbnQgb2lfbHJ1X3Jlc2VydmVkOworCXVuc2lnbmVkIGxvbmcJCW9pX2xydV9yZXNlcnZlZDsKIAogCS8qKiBhY3RpdmUgZXh0ZW50cywgd2Uga25vdyBob3cgbWFueSBieXRlcyBpcyBnb2luZyB0byBiZSB3cml0dGVuLAogCSAqIHNvIGhhdmluZyBhbiBhY3RpdmUgZXh0ZW50IHdpbGwgcHJldmVudCBpdCBmcm9tIGJlaW5nIGZyYWdtZW50ZWQKQEAgLTM4OSw3ICszODksNyBAQAogZXh0ZXJuIHN0cnVjdCBsdV9jb250ZXh0X2tleSBvc2Nfa2V5OwogZXh0ZXJuIHN0cnVjdCBsdV9jb250ZXh0X2tleSBvc2Nfc2Vzc2lvbl9rZXk7CiAKLSNkZWZpbmUgT1NDX0ZMQUdTIChBU1lOQ19VUkdFTlR8QVNZTkNfUkVBRFkpCisjZGVmaW5lIE9TQ19GTEFHUyAoQVNZTkNfVVJHRU5UIHwgQVNZTkNfUkVBRFkpCiAKIGludCBvc2NfbG9ja19pbml0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKIAkJICBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosIHN0cnVjdCBjbF9sb2NrICpsb2NrLApAQCAtNjA4LDcgKzYwOCw3IEBACiAJLyoqIGxpbmsgbGlzdCBvZiBvc2Nfb2JqZWN0J3Mgb29fe2hwfHVyZ2VudHxsb2NraW5nfV9leHRzLiAqLwogCXN0cnVjdCBsaXN0X2hlYWQJIG9lX2xpbms7CiAJLyoqIHN0YXRlIG9mIHRoaXMgZXh0ZW50ICovCi0JdW5zaWduZWQgaW50ICAgICAgIG9lX3N0YXRlOworCWVudW0gb3NjX2V4dGVudF9zdGF0ZQlvZV9zdGF0ZTsKIAkvKiogZmxhZ3MgZm9yIHRoaXMgZXh0ZW50LiAqLwogCXVuc2lnbmVkIGludCAgICAgICBvZV9pbnRyZWU6MSwKIAkvKiogMCBpcyB3cml0ZSwgMSBpcyByZWFkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2ludGVybmFsLmgKaW5kZXggN2EyN2YwOS4uNjdmZTBhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfaW50ZXJuYWwuaApAQCAtNzEsNyArNzEsNiBAQAogCXN0cnVjdCBjbGllbnRfb2JkICAgICAgICpvYXBfY2xpOwogCXN0cnVjdCBvc2Nfb2JqZWN0ICAgICAgICpvYXBfb2JqOwogCi0Jc3RydWN0IGxkbG1fbG9jawkqb2FwX2xkbG1fbG9jazsKIAlzcGlubG9ja190CQkgb2FwX2xvY2s7CiB9OwogCkBAIC0xMzQsOSArMTMzLDkgQEAKIGludCBvc2NfcHJvY2Vzc19jb25maWdfYmFzZShzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkLCBzdHJ1Y3QgbHVzdHJlX2NmZyAqY2ZnKTsKIGludCBvc2NfYnVpbGRfcnBjKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsaWVudF9vYmQgKmNsaSwKIAkJICBzdHJ1Y3QgbGlzdF9oZWFkICpleHRfbGlzdCwgaW50IGNtZCk7Ci1pbnQgb3NjX2xydV9zaHJpbmsoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xpZW50X29iZCAqY2xpLAotCQkgICBpbnQgdGFyZ2V0LCBib29sIGZvcmNlKTsKLWludCBvc2NfbHJ1X3JlY2xhaW0oc3RydWN0IGNsaWVudF9vYmQgKmNsaSk7Citsb25nIG9zY19scnVfc2hyaW5rKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsaWVudF9vYmQgKmNsaSwKKwkJICAgIGxvbmcgdGFyZ2V0LCBib29sIGZvcmNlKTsKK2xvbmcgb3NjX2xydV9yZWNsYWltKHN0cnVjdCBjbGllbnRfb2JkICpjbGkpOwogCiB1bnNpZ25lZCBsb25nIG9zY19sZGxtX3dlaWdoX2FzdChzdHJ1Y3QgbGRsbV9sb2NrICpkbG1sb2NrKTsKIApAQCAtMTk4LDcgKzE5Nyw3IEBACiBpbnQgb3NjX3F1b3RhX3BvbGxfY2hlY2soc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGlmX3F1b3RhY2hlY2sgKnFjaGspOwogdm9pZCBvc2NfaW5jX3Vuc3RhYmxlX3BhZ2VzKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKTsKIHZvaWQgb3NjX2RlY191bnN0YWJsZV9wYWdlcyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSk7Ci1pbnQgIG9zY19vdmVyX3Vuc3RhYmxlX3NvZnRfbGltaXQoc3RydWN0IGNsaWVudF9vYmQgKmNsaSk7Citib29sIG9zY19vdmVyX3Vuc3RhYmxlX3NvZnRfbGltaXQoc3RydWN0IGNsaWVudF9vYmQgKmNsaSk7CiAKIHN0cnVjdCBsZGxtX2xvY2sgKm9zY19kbG1sb2NrX2F0X3Bnb2ZmKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKIAkJCQkgICAgICAgc3RydWN0IG9zY19vYmplY3QgKm9iaiwgcGdvZmZfdCBpbmRleCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfaW8uYwppbmRleCA2ZTNkY2QzLi44YTU1OWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2lvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19pby5jCkBAIC0xMDksMTEgKzEwOSwxMSBAQAogCiAJc3RydWN0IGNsX3BhZ2VfbGlzdCAqcWluID0gJnF1ZXVlLT5jMl9xaW47CiAJc3RydWN0IGNsX3BhZ2VfbGlzdCAqcW91dCA9ICZxdWV1ZS0+YzJfcW91dDsKLQlpbnQgcXVldWVkID0gMDsKKwl1bnNpZ25lZCBpbnQgcXVldWVkID0gMDsKIAlpbnQgcmVzdWx0ID0gMDsKIAlpbnQgY21kOwogCWludCBicndfZmxhZ3M7Ci0JaW50IG1heF9wYWdlczsKKwl1bnNpZ25lZCBpbnQgbWF4X3BhZ2VzOwogCiAJTEFTU0VSVChxaW4tPnBsX25yID4gMCk7CiAKQEAgLTE2MywxNCArMTYzLDE5IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCWNsX3BhZ2VfbGlzdF9tb3ZlKHFvdXQsIHFpbiwgcGFnZSk7CiAJCXNwaW5fbG9jaygmb2FwLT5vYXBfbG9jayk7Ci0JCW9hcC0+b2FwX2FzeW5jX2ZsYWdzID0gQVNZTkNfVVJHRU5UfEFTWU5DX1JFQURZOworCQlvYXAtPm9hcF9hc3luY19mbGFncyA9IEFTWU5DX1VSR0VOVCB8IEFTWU5DX1JFQURZOwogCQlvYXAtPm9hcF9hc3luY19mbGFncyB8PSBBU1lOQ19DT1VOVF9TVEFCTEU7CiAJCXNwaW5fdW5sb2NrKCZvYXAtPm9hcF9sb2NrKTsKIAogCQlvc2NfcGFnZV9zdWJtaXQoZW52LCBvcGcsIGNydCwgYnJ3X2ZsYWdzKTsKIAkJbGlzdF9hZGRfdGFpbCgmb2FwLT5vYXBfcGVuZGluZ19pdGVtLCAmbGlzdCk7CisKKwkJaWYgKHBhZ2UtPmNwX3N5bmNfaW8pCisJCQljbF9wYWdlX2xpc3RfbW92ZShxb3V0LCBxaW4sIHBhZ2UpOworCQllbHNlIC8qIGFzeW5jIElPICovCisJCQljbF9wYWdlX2xpc3RfZGVsKGVudiwgcWluLCBwYWdlKTsKKwogCQlpZiAoKytxdWV1ZWQgPT0gbWF4X3BhZ2VzKSB7CiAJCQlxdWV1ZWQgPSAwOwogCQkJcmVzdWx0ID0gb3NjX3F1ZXVlX3N5bmNfcGFnZXMoZW52LCBvc2MsICZsaXN0LCBjbWQsCkBAIC0xOTUsNyArMjAwLDcgQEAKICAqIEV4cGFuZCBzdHJpcGUgS01TIGlmIG5lY2Vzc2FyeS4KICAqLwogc3RhdGljIHZvaWQgb3NjX3BhZ2VfdG91Y2hfYXQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAotCQkJICAgICAgc3RydWN0IGNsX29iamVjdCAqb2JqLCBwZ29mZl90IGlkeCwgdW5zaWduZWQgdG8pCisJCQkgICAgICBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosIHBnb2ZmX3QgaWR4LCBzaXplX3QgdG8pCiB7CiAJc3RydWN0IGxvdl9vaW5mbyAqbG9pID0gY2wyb3NjKG9iaiktPm9vX29pbmZvOwogCXN0cnVjdCBjbF9hdHRyICphdHRyID0gJm9zY19lbnZfaW5mbyhlbnYpLT5vdGlfYXR0cjsKQEAgLTIyOCw3ICsyMzMsNyBAQAogCQlhdHRyLT5jYXRfc2l6ZSA9IGttczsKIAkJdmFsaWQgfD0gQ0FUX1NJWkU7CiAJfQotCWNsX29iamVjdF9hdHRyX3NldChlbnYsIG9iaiwgYXR0ciwgdmFsaWQpOworCWNsX29iamVjdF9hdHRyX3VwZGF0ZShlbnYsIG9iaiwgYXR0ciwgdmFsaWQpOwogCWNsX29iamVjdF9hdHRyX3VubG9jayhvYmopOwogfQogCkBAIC0zMTQsOCArMzE5LDggQEAKIAlzdHJ1Y3Qgb3NjX29iamVjdCAqb3NjID0gY2wyb3NjKGlvcy0+Y2lzX29iaik7CiAJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9IG9zY19jbGkob3NjKTsKIAl1bnNpZ25lZCBsb25nIGM7Ci0JdW5zaWduZWQgaW50IG5wYWdlczsKLQl1bnNpZ25lZCBpbnQgbWF4X3BhZ2VzOworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzOworCXVuc2lnbmVkIGxvbmcgbWF4X3BhZ2VzOwogCiAJaWYgKGNsX2lvX2lzX2FwcGVuZChpbykpCiAJCXJldHVybiAwOwpAQCAtMzI4LDE1ICszMzMsMTUgQEAKIAlpZiAobnBhZ2VzID4gbWF4X3BhZ2VzKQogCQlucGFnZXMgPSBtYXhfcGFnZXM7CiAKLQljID0gYXRvbWljX3JlYWQoY2xpLT5jbF9scnVfbGVmdCk7CisJYyA9IGF0b21pY19sb25nX3JlYWQoY2xpLT5jbF9scnVfbGVmdCk7CiAJaWYgKGMgPCBucGFnZXMgJiYgb3NjX2xydV9yZWNsYWltKGNsaSkgPiAwKQotCQljID0gYXRvbWljX3JlYWQoY2xpLT5jbF9scnVfbGVmdCk7CisJCWMgPSBhdG9taWNfbG9uZ19yZWFkKGNsaS0+Y2xfbHJ1X2xlZnQpOwogCXdoaWxlIChjID49IG5wYWdlcykgewotCQlpZiAoYyA9PSBhdG9taWNfY21weGNoZyhjbGktPmNsX2xydV9sZWZ0LCBjLCBjIC0gbnBhZ2VzKSkgeworCQlpZiAoYyA9PSBhdG9taWNfbG9uZ19jbXB4Y2hnKGNsaS0+Y2xfbHJ1X2xlZnQsIGMsIGMgLSBucGFnZXMpKSB7CiAJCQlvaW8tPm9pX2xydV9yZXNlcnZlZCA9IG5wYWdlczsKIAkJCWJyZWFrOwogCQl9Ci0JCWMgPSBhdG9taWNfcmVhZChjbGktPmNsX2xydV9sZWZ0KTsKKwkJYyA9IGF0b21pY19sb25nX3JlYWQoY2xpLT5jbF9scnVfbGVmdCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zNTAsNyArMzU1LDcgQEAKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gb3NjX2NsaShvc2MpOwogCiAJaWYgKG9pby0+b2lfbHJ1X3Jlc2VydmVkID4gMCkgewotCQlhdG9taWNfYWRkKG9pby0+b2lfbHJ1X3Jlc2VydmVkLCBjbGktPmNsX2xydV9sZWZ0KTsKKwkJYXRvbWljX2xvbmdfYWRkKG9pby0+b2lfbHJ1X3Jlc2VydmVkLCBjbGktPmNsX2xydV9sZWZ0KTsKIAkJb2lvLT5vaV9scnVfcmVzZXJ2ZWQgPSAwOwogCX0KIAlvaW8tPm9pX3dyaXRlX29zY2xvY2sgPSBOVUxMOwpAQCAtMzY0LDcgKzM2OSw3IEBACiAKIAlpbyA9IGlvcy0+Y2lzX2lvOwogCWZpbyA9ICZpby0+dS5jaV9mYXVsdDsKLQlDREVCVUcoRF9JTkZPLCAiJWx1ICVkICVkXG4iLAorCUNERUJVRyhEX0lORk8sICIlbHUgJWQgJXp1XG4iLAogCSAgICAgICBmaW8tPmZ0X2luZGV4LCBmaW8tPmZ0X3dyaXRhYmxlLCBmaW8tPmZ0X25vYik7CiAJLyoKIAkgKiBJZiBtYXBwaW5nIGlzIHdyaXRlYWJsZSwgYWRqdXN0IGttcyB0byBjb3ZlciB0aGlzIHBhZ2UsCkBAIC00NzEsMTggKzQ3NiwyMSBAQAogCQkJCWF0dHItPmNhdF9jdGltZSA9IGx2Yi0+bHZiX2N0aW1lOwogCQkJCWNsX3ZhbGlkIHw9IENBVF9DVElNRTsKIAkJCX0KLQkJCXJlc3VsdCA9IGNsX29iamVjdF9hdHRyX3NldChlbnYsIG9iaiwgYXR0ciwgY2xfdmFsaWQpOworCQkJcmVzdWx0ID0gY2xfb2JqZWN0X2F0dHJfdXBkYXRlKGVudiwgb2JqLCBhdHRyLAorCQkJCQkJICAgICAgIGNsX3ZhbGlkKTsKIAkJfQogCQljbF9vYmplY3RfYXR0cl91bmxvY2sob2JqKTsKIAl9CiAJbWVtc2V0KG9hLCAwLCBzaXplb2YoKm9hKSk7CiAJaWYgKHJlc3VsdCA9PSAwKSB7CiAJCW9hLT5vX29pID0gbG9pLT5sb2lfb2k7CisJCW9iZG9fc2V0X3BhcmVudF9maWQob2EsIGlvLT51LmNpX3NldGF0dHIuc2FfcGFyZW50X2ZpZCk7CisJCW9hLT5vX3N0cmlwZV9pZHggPSBpby0+dS5jaV9zZXRhdHRyLnNhX3N0cmlwZV9pbmRleDsKIAkJb2EtPm9fbXRpbWUgPSBhdHRyLT5jYXRfbXRpbWU7CiAJCW9hLT5vX2F0aW1lID0gYXR0ci0+Y2F0X2F0aW1lOwogCQlvYS0+b19jdGltZSA9IGF0dHItPmNhdF9jdGltZTsKLQkJb2EtPm9fdmFsaWQgPSBPQkRfTURfRkxJRCB8IE9CRF9NRF9GTEdST1VQIHwgT0JEX01EX0ZMQVRJTUUgfAotCQkJT0JEX01EX0ZMQ1RJTUUgfCBPQkRfTURfRkxNVElNRTsKKwkJb2EtPm9fdmFsaWQgfD0gT0JEX01EX0ZMSUQgfCBPQkRfTURfRkxHUk9VUCB8IE9CRF9NRF9GTEFUSU1FIHwKKwkJCSAgICAgICBPQkRfTURfRkxDVElNRSB8IE9CRF9NRF9GTE1USU1FOwogCQlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKIAkJCW9hLT5vX3NpemUgPSBzaXplOwogCQkJb2EtPm9fYmxvY2tzID0gT0JEX09CSkVDVF9FT0Y7CkBAIC01NTksNyArNTY3LDcgQEAKIAlpZiAoIXNsaWNlLT5jaXNfaW8tPmNpX25vYXRpbWUpIHsKIAkJY2xfb2JqZWN0X2F0dHJfbG9jayhvYmopOwogCQlhdHRyLT5jYXRfYXRpbWUgPSBrdGltZV9nZXRfcmVhbF9zZWNvbmRzKCk7Ci0JCXJjID0gY2xfb2JqZWN0X2F0dHJfc2V0KGVudiwgb2JqLCBhdHRyLCBDQVRfQVRJTUUpOworCQlyYyA9IGNsX29iamVjdF9hdHRyX3VwZGF0ZShlbnYsIG9iaiwgYXR0ciwgQ0FUX0FUSU1FKTsKIAkJY2xfb2JqZWN0X2F0dHJfdW5sb2NrKG9iaik7CiAJfQogCXJldHVybiByYzsKQEAgLTU3Niw3ICs1ODQsNyBAQAogCWNsX29iamVjdF9hdHRyX2xvY2sob2JqKTsKIAlhdHRyLT5jYXRfY3RpbWUgPSBrdGltZV9nZXRfcmVhbF9zZWNvbmRzKCk7CiAJYXR0ci0+Y2F0X210aW1lID0gYXR0ci0+Y2F0X2N0aW1lOwotCXJjID0gY2xfb2JqZWN0X2F0dHJfc2V0KGVudiwgb2JqLCBhdHRyLCBDQVRfTVRJTUUgfCBDQVRfQ1RJTUUpOworCXJjID0gY2xfb2JqZWN0X2F0dHJfdXBkYXRlKGVudiwgb2JqLCBhdHRyLCBDQVRfTVRJTUUgfCBDQVRfQ1RJTUUpOwogCWNsX29iamVjdF9hdHRyX3VubG9jayhvYmopOwogCiAJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19sb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2xvY2suYwppbmRleCA3MTdkM2ZmLi4zOWE4YTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2xvY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2xvY2suYwpAQCAtMjIyLDcgKzIyMiw3IEBACiAJCWxkbG1fbG9ja19hbGxvd19tYXRjaF9sb2NrZWQoZGxtbG9jayk7CiAJfQogCi0JY2xfb2JqZWN0X2F0dHJfc2V0KGVudiwgb2JqLCBhdHRyLCB2YWxpZCk7CisJY2xfb2JqZWN0X2F0dHJfdXBkYXRlKGVudiwgb2JqLCBhdHRyLCB2YWxpZCk7CiAJY2xfb2JqZWN0X2F0dHJfdW5sb2NrKG9iaik7CiB9CiAKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogCQkgKi8KIAkJYXR0ci0+Y2F0X2ttcyA9IGxkbG1fZXh0ZW50X3NoaWZ0X2ttcyhkbG1sb2NrLCBvbGRfa21zKTsKIAotCQljbF9vYmplY3RfYXR0cl9zZXQoZW52LCBvYmosIGF0dHIsIENBVF9LTVMpOworCQljbF9vYmplY3RfYXR0cl91cGRhdGUoZW52LCBvYmosIGF0dHIsIENBVF9LTVMpOwogCQljbF9vYmplY3RfYXR0cl91bmxvY2sob2JqKTsKIAkJdW5sb2NrX3Jlc19hbmRfbG9jayhkbG1sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19vYmplY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2Nfb2JqZWN0LmMKaW5kZXggZDIxMWQxOS4uYWFlM2EyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19vYmplY3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX29iamVjdC5jCkBAIC0xNTksOCArMTU5LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvc2NfYXR0cl9zZXQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCi0JCQljb25zdCBzdHJ1Y3QgY2xfYXR0ciAqYXR0ciwgdW5zaWduZWQgdmFsaWQpCitzdGF0aWMgaW50IG9zY19hdHRyX3VwZGF0ZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBjbF9hdHRyICphdHRyLCB1bnNpZ25lZCBpbnQgdmFsaWQpCiB7CiAJc3RydWN0IGxvdl9vaW5mbyAqb2luZm8gPSBjbDJvc2Mob2JqKS0+b29fb2luZm87CiAJc3RydWN0IG9zdF9sdmIgKmx2YiA9ICZvaW5mby0+bG9pX2x2YjsKQEAgLTE5NSw3ICsxOTUsNiBAQAogCiBzdGF0aWMgaW50IG9zY19vYmplY3RfYXN0X2NsZWFyKHN0cnVjdCBsZGxtX2xvY2sgKmxvY2ssIHZvaWQgKmRhdGEpCiB7Ci0JTEFTU0VSVChsb2NrLT5sX2dyYW50ZWRfbW9kZSA9PSBsb2NrLT5sX3JlcV9tb2RlKTsKIAlpZiAobG9jay0+bF9hc3RfZGF0YSA9PSBkYXRhKQogCQlsb2NrLT5sX2FzdF9kYXRhID0gTlVMTDsKIAlyZXR1cm4gTERMTV9JVEVSX0NPTlRJTlVFOwpAQCAtMjYyLDcgKzI2MSw3IEBACiAJLmNvb19sb2NrX2luaXQgPSBvc2NfbG9ja19pbml0LAogCS5jb29faW9faW5pdCAgID0gb3NjX2lvX2luaXQsCiAJLmNvb19hdHRyX2dldCAgPSBvc2NfYXR0cl9nZXQsCi0JLmNvb19hdHRyX3NldCAgPSBvc2NfYXR0cl9zZXQsCisJLmNvb19hdHRyX3VwZGF0ZSA9IG9zY19hdHRyX3VwZGF0ZSwKIAkuY29vX2dsaW1wc2UgICA9IG9zY19vYmplY3RfZ2xpbXBzZSwKIAkuY29vX3BydW5lICAgICA9IG9zY19vYmplY3RfcHJ1bmUKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3BhZ2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcGFnZS5jCmluZGV4IDM1NWY0OTYuLjJhN2E3MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcGFnZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcGFnZS5jCkBAIC0zMjMsMzIgKzMyMyw2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotaW50IG9zY19vdmVyX3Vuc3RhYmxlX3NvZnRfbGltaXQoc3RydWN0IGNsaWVudF9vYmQgKmNsaSkKLXsKLQlsb25nIG9iZF91cGFnZXMsIG9iZF9kcGFnZXMsIG9zY191cGFnZXM7Ci0KLQkvKiBDYW4ndCBjaGVjayBjbGktPmNsX3Vuc3RhYmxlX2NvdW50LCB0aGVyZWZvcmUsIG5vIHNvZnQgbGltaXQgKi8KLQlpZiAoIWNsaSkKLQkJcmV0dXJuIDA7Ci0KLQlvYmRfdXBhZ2VzID0gYXRvbWljX3JlYWQoJm9iZF91bnN0YWJsZV9wYWdlcyk7Ci0Jb2JkX2RwYWdlcyA9IGF0b21pY19yZWFkKCZvYmRfZGlydHlfcGFnZXMpOwotCi0Jb3NjX3VwYWdlcyA9IGF0b21pY19yZWFkKCZjbGktPmNsX3Vuc3RhYmxlX2NvdW50KTsKLQotCS8qCi0JICogb2JkX21heF9kaXJ0eV9wYWdlcyBpcyB0aGUgbWF4IG51bWJlciBvZiAoZGlydHkgKyB1bnN0YWJsZSkKLQkgKiBwYWdlcyBhbGxvd2VkIGF0IGFueSBnaXZlbiB0aW1lLiBUbyBzaW11bGF0ZSBhbiB1bnN0YWJsZSBwYWdlCi0JICogb25seSBsaW1pdCwgd2Ugc3VidHJhY3QgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGRpcnR5IHBhZ2VzCi0JICogZnJvbSB0aGlzIG1heC4gVGhpcyBkaWZmZXJlbmNlIGlzIHJvdWdobHkgdGhlIGFtb3VudCBvZiBwYWdlcwotCSAqIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVuc3RhYmxlIHBhZ2VzLiBUaHVzLCB0aGUgc29mdCBsaW1pdAotCSAqIGlzIGhhbGYgb2YgdGhhdCBkaWZmZXJlbmNlLiBDaGVjayBvc2NfdXBhZ2VzIHRvIGVuc3VyZSB3ZSBkb24ndAotCSAqIHNldCBTT0ZUX1NZTkMgZm9yIE9TQ3Mgd2l0aG91dCBhbnkgb3V0c3RhbmRpbmcgdW5zdGFibGUgcGFnZXMuCi0JICovCi0JcmV0dXJuIG9zY191cGFnZXMgJiYKLQkgICAgICAgb2JkX3VwYWdlcyA+PSAob2JkX21heF9kaXJ0eV9wYWdlcyAtIG9iZF9kcGFnZXMpIC8gMjsKLX0KLQogLyoqCiAgKiBIZWxwZXIgZnVuY3Rpb24gY2FsbGVkIGJ5IG9zY19pb19zdWJtaXQoKSBmb3IgZXZlcnkgcGFnZSBpbiBhbiBpbW1lZGlhdGUKICAqIHRyYW5zZmVyIChpLmUuLCB0cmFuc2ZlcnJlZCBzeW5jaHJvbm91c2x5KS4KQEAgLTM2OCw5ICszNDIsNiBAQAogCW9hcC0+b2FwX2NvdW50ID0gb3BnLT5vcHNfdG8gLSBvcGctPm9wc19mcm9tOwogCW9hcC0+b2FwX2Jyd19mbGFncyA9IGJyd19mbGFncyB8IE9CRF9CUldfU1lOQzsKIAotCWlmIChvc2Nfb3Zlcl91bnN0YWJsZV9zb2Z0X2xpbWl0KG9hcC0+b2FwX2NsaSkpCi0JCW9hcC0+b2FwX2Jyd19mbGFncyB8PSBPQkRfQlJXX1NPRlRfU1lOQzsKLQogCWlmIChjYXBhYmxlKENGU19DQVBfU1lTX1JFU09VUkNFKSkgewogCQlvYXAtPm9hcF9icndfZmxhZ3MgfD0gT0JEX0JSV19OT1FVT1RBOwogCQlvYXAtPm9hcF9jbWQgfD0gT0JEX0JSV19OT1FVT1RBOwpAQCAtNDA5LDcgKzM4MCw3IEBACiBzdGF0aWMgaW50IG9zY19jYWNoZV90b29fbXVjaChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpKQogewogCXN0cnVjdCBjbF9jbGllbnRfY2FjaGUgKmNhY2hlID0gY2xpLT5jbF9jYWNoZTsKLQlpbnQgcGFnZXMgPSBhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCk7CisJbG9uZyBwYWdlcyA9IGF0b21pY19sb25nX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpOwogCXVuc2lnbmVkIGxvbmcgYnVkZ2V0OwogCiAJYnVkZ2V0ID0gY2FjaGUtPmNjY19scnVfbWF4IC8gKGF0b21pY19yZWFkKCZjYWNoZS0+Y2NjX3VzZXJzKSAtIDIpOwpAQCAtNDE3LDcgKzM4OCw3IEBACiAJLyogaWYgaXQncyBnb2luZyB0byBydW4gb3V0IExSVSBzbG90cywgd2Ugc2hvdWxkIGZyZWUgc29tZSwgYnV0IG5vdAogCSAqIHRvbyBtdWNoIHRvIG1haW50YWluIGZhaXJuZXNzIGFtb25nIE9TQ3MuCiAJICovCi0JaWYgKGF0b21pY19yZWFkKGNsaS0+Y2xfbHJ1X2xlZnQpIDwgY2FjaGUtPmNjY19scnVfbWF4ID4+IDQpIHsKKwlpZiAoYXRvbWljX2xvbmdfcmVhZChjbGktPmNsX2xydV9sZWZ0KSA8IGNhY2hlLT5jY2NfbHJ1X21heCA+PiA0KSB7CiAJCWlmIChwYWdlcyA+PSBidWRnZXQpCiAJCQlyZXR1cm4gbHJ1X3Nocmlua19tYXg7CiAJCWVsc2UgaWYgKHBhZ2VzID49IGJ1ZGdldCAvIDIpCkBAIC00NDQsNyArNDE1LDcgQEAKIHsKIAlMSVNUX0hFQUQobHJ1KTsKIAlzdHJ1Y3Qgb3NjX2FzeW5jX3BhZ2UgKm9hcDsKLQlpbnQgbnBhZ2VzID0gMDsKKwlsb25nIG5wYWdlcyA9IDA7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9hcCwgcGxpc3QsIG9hcF9wZW5kaW5nX2l0ZW0pIHsKIAkJc3RydWN0IG9zY19wYWdlICpvcGcgPSBvYXAyb3NjX3BhZ2Uob2FwKTsKQEAgLTQ2MCw4ICs0MzEsOCBAQAogCWlmIChucGFnZXMgPiAwKSB7CiAJCXNwaW5fbG9jaygmY2xpLT5jbF9scnVfbGlzdF9sb2NrKTsKIAkJbGlzdF9zcGxpY2VfdGFpbCgmbHJ1LCAmY2xpLT5jbF9scnVfbGlzdCk7Ci0JCWF0b21pY19zdWIobnBhZ2VzLCAmY2xpLT5jbF9scnVfYnVzeSk7Ci0JCWF0b21pY19hZGQobnBhZ2VzLCAmY2xpLT5jbF9scnVfaW5fbGlzdCk7CisJCWF0b21pY19sb25nX3N1YihucGFnZXMsICZjbGktPmNsX2xydV9idXN5KTsKKwkJYXRvbWljX2xvbmdfYWRkKG5wYWdlcywgJmNsaS0+Y2xfbHJ1X2luX2xpc3QpOwogCQlzcGluX3VubG9jaygmY2xpLT5jbF9scnVfbGlzdF9sb2NrKTsKIAogCQkvKiBYWFg6IE1heSBzZXQgZm9yY2UgdG8gYmUgdHJ1ZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlICovCkBAIC00NzIsOSArNDQzLDkgQEAKIAogc3RhdGljIHZvaWQgX19vc2NfbHJ1X2RlbChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpLCBzdHJ1Y3Qgb3NjX3BhZ2UgKm9wZykKIHsKLQlMQVNTRVJUKGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSA+IDApOworCUxBU1NFUlQoYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkgPiAwKTsKIAlsaXN0X2RlbF9pbml0KCZvcGctPm9wc19scnUpOwotCWF0b21pY19kZWMoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpOworCWF0b21pY19sb25nX2RlYygmY2xpLT5jbF9scnVfaW5fbGlzdCk7CiB9CiAKIC8qKgpAQCAtNDg4LDEyICs0NTksMTIgQEAKIAkJaWYgKCFsaXN0X2VtcHR5KCZvcGctPm9wc19scnUpKSB7CiAJCQlfX29zY19scnVfZGVsKGNsaSwgb3BnKTsKIAkJfSBlbHNlIHsKLQkJCUxBU1NFUlQoYXRvbWljX3JlYWQoJmNsaS0+Y2xfbHJ1X2J1c3kpID4gMCk7Ci0JCQlhdG9taWNfZGVjKCZjbGktPmNsX2xydV9idXN5KTsKKwkJCUxBU1NFUlQoYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF9scnVfYnVzeSkgPiAwKTsKKwkJCWF0b21pY19sb25nX2RlYygmY2xpLT5jbF9scnVfYnVzeSk7CiAJCX0KIAkJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbHJ1X2xpc3RfbG9jayk7CiAKLQkJYXRvbWljX2luYyhjbGktPmNsX2xydV9sZWZ0KTsKKwkJYXRvbWljX2xvbmdfaW5jKGNsaS0+Y2xfbHJ1X2xlZnQpOwogCQkvKiB0aGlzIGlzIGEgZ3JlYXQgcGxhY2UgdG8gcmVsZWFzZSBtb3JlIExSVSBwYWdlcyBpZgogCQkgKiB0aGlzIG9zYyBvY2N1cGllcyB0b28gbWFueSBMUlUgcGFnZXMgYW5kIGtlcm5lbCBpcwogCQkgKiBzdGVhbGluZyBvbmUgb2YgdGhlbS4KQEAgLTUxOCw3ICs0ODksNyBAQAogCQlzcGluX2xvY2soJmNsaS0+Y2xfbHJ1X2xpc3RfbG9jayk7CiAJCV9fb3NjX2xydV9kZWwoY2xpLCBvcGcpOwogCQlzcGluX3VubG9jaygmY2xpLT5jbF9scnVfbGlzdF9sb2NrKTsKLQkJYXRvbWljX2luYygmY2xpLT5jbF9scnVfYnVzeSk7CisJCWF0b21pY19sb25nX2luYygmY2xpLT5jbF9scnVfYnVzeSk7CiAJfQogfQogCkBAIC01NDAsMTAgKzUxMSwzMiBAQAogfQogCiAvKioKKyAqIENoZWNrIGlmIGEgY2xfcGFnZSBjYW4gYmUgcmVsZWFzZWQsIGkuZSwgaXQncyBub3QgYmVpbmcgdXNlZC4KKyAqCisgKiBJZiB1bnN0YWJsZSBhY2NvdW50IGlzIHR1cm5lZCBvbiwgYnVsayB0cmFuc2ZlciBtYXkgaG9sZCBvbmUgcmVmY291bnQKKyAqIGZvciByZWNvdmVyeSBzbyB3ZSBuZWVkIHRvIGNoZWNrIHZtcGFnZSByZWZjb3VudCBhcyB3ZWxsOyBvdGhlcndpc2UsCisgKiBldmVuIHdlIGNhbiBkZXN0cm95IGNsX3BhZ2UgYnV0IHRoZSBjb3JyZXNwb25kaW5nIHZtcGFnZSBjYW4ndCBiZSByZXVzZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBscnVfcGFnZV9idXN5KHN0cnVjdCBjbGllbnRfb2JkICpjbGksIHN0cnVjdCBjbF9wYWdlICpwYWdlKQoreworCWlmIChjbF9wYWdlX2luX3VzZV9ub3JlZihwYWdlKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoY2xpLT5jbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX2NoZWNrKSB7CisJCXN0cnVjdCBwYWdlICp2bXBhZ2UgPSBjbF9wYWdlX3ZtcGFnZShwYWdlKTsKKworCQkvKiB2bXBhZ2UgaGF2ZSB0d28ga25vd24gdXNlcnM6IGNsX3BhZ2UgYW5kIFZNIHBhZ2UgY2FjaGUgKi8KKwkJaWYgKHBhZ2VfY291bnQodm1wYWdlKSAtIHBhZ2VfbWFwY291bnQodm1wYWdlKSA+IDIpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKICAqIERyb3AgQHRhcmdldCBvZiBwYWdlcyBmcm9tIExSVSBhdCBtb3N0LgogICovCi1pbnQgb3NjX2xydV9zaHJpbmsoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xpZW50X29iZCAqY2xpLAotCQkgICBpbnQgdGFyZ2V0LCBib29sIGZvcmNlKQorbG9uZyBvc2NfbHJ1X3Nocmluayhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbGllbnRfb2JkICpjbGksCisJCSAgICBsb25nIHRhcmdldCwgYm9vbCBmb3JjZSkKIHsKIAlzdHJ1Y3QgY2xfaW8gKmlvOwogCXN0cnVjdCBjbF9vYmplY3QgKmNsb2JqID0gTlVMTDsKQEAgLTU1MSwxMiArNTQ0LDEyIEBACiAJc3RydWN0IG9zY19wYWdlICpvcGc7CiAJc3RydWN0IG9zY19wYWdlICp0ZW1wOwogCWludCBtYXhzY2FuID0gMDsKLQlpbnQgY291bnQgPSAwOworCWxvbmcgY291bnQgPSAwOwogCWludCBpbmRleCA9IDA7CiAJaW50IHJjID0gMDsKIAotCUxBU1NFUlQoYXRvbWljX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpID49IDApOwotCWlmIChhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkgPT0gMCB8fCB0YXJnZXQgPD0gMCkKKwlMQVNTRVJUKGF0b21pY19sb25nX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpID49IDApOworCWlmIChhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSA9PSAwIHx8IHRhcmdldCA8PSAwKQogCQlyZXR1cm4gMDsKIAogCWlmICghZm9yY2UpIHsKQEAgLTU3NSw3ICs1NjgsNyBAQAogCWlvID0gJm9zY19lbnZfaW5mbyhlbnYpLT5vdGlfaW87CiAKIAlzcGluX2xvY2soJmNsaS0+Y2xfbHJ1X2xpc3RfbG9jayk7Ci0JbWF4c2NhbiA9IG1pbih0YXJnZXQgPDwgMSwgYXRvbWljX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpKTsKKwltYXhzY2FuID0gbWluKHRhcmdldCA8PCAxLCBhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9wZywgdGVtcCwgJmNsaS0+Y2xfbHJ1X2xpc3QsIG9wc19scnUpIHsKIAkJc3RydWN0IGNsX3BhZ2UgKnBhZ2U7CiAJCWJvb2wgd2lsbF9mcmVlID0gZmFsc2U7CkBAIC01ODQsNyArNTc3LDcgQEAKIAkJCWJyZWFrOwogCiAJCXBhZ2UgPSBvcGctPm9wc19jbC5jcGxfcGFnZTsKLQkJaWYgKGNsX3BhZ2VfaW5fdXNlX25vcmVmKHBhZ2UpKSB7CisJCWlmIChscnVfcGFnZV9idXN5KGNsaSwgcGFnZSkpIHsKIAkJCWxpc3RfbW92ZV90YWlsKCZvcGctPm9wc19scnUsICZjbGktPmNsX2xydV9saXN0KTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC02MjAsNyArNjEzLDcgQEAKIAkJfQogCiAJCWlmIChjbF9wYWdlX293bl90cnkoZW52LCBpbywgcGFnZSkgPT0gMCkgewotCQkJaWYgKCFjbF9wYWdlX2luX3VzZV9ub3JlZihwYWdlKSkgeworCQkJaWYgKCFscnVfcGFnZV9idXN5KGNsaSwgcGFnZSkpIHsKIAkJCQkvKiByZW1vdmUgaXQgZnJvbSBscnUgbGlzdCBlYXJsaWVyIHRvIGF2b2lkCiAJCQkJICogbG9jayBjb250ZW50aW9uCiAJCQkJICovCkBAIC02NjMsMjQgKzY1NiwxOSBAQAogCiAJYXRvbWljX2RlYygmY2xpLT5jbF9scnVfc2hyaW5rZXJzKTsKIAlpZiAoY291bnQgPiAwKSB7Ci0JCWF0b21pY19hZGQoY291bnQsIGNsaS0+Y2xfbHJ1X2xlZnQpOworCQlhdG9taWNfbG9uZ19hZGQoY291bnQsIGNsaS0+Y2xfbHJ1X2xlZnQpOwogCQl3YWtlX3VwX2FsbCgmb3NjX2xydV93YWl0cSk7CiAJfQogCXJldHVybiBjb3VudCA+IDAgPyBjb3VudCA6IHJjOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBtYXhfdG9fc2hyaW5rKHN0cnVjdCBjbGllbnRfb2JkICpjbGkpCi17Ci0JcmV0dXJuIG1pbihhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkgPj4gMSwgbHJ1X3Nocmlua19tYXgpOwotfQotCi1pbnQgb3NjX2xydV9yZWNsYWltKHN0cnVjdCBjbGllbnRfb2JkICpjbGkpCitsb25nIG9zY19scnVfcmVjbGFpbShzdHJ1Y3QgY2xpZW50X29iZCAqY2xpKQogewogCXN0cnVjdCBjbF9lbnZfbmVzdCBuZXN0OwogCXN0cnVjdCBsdV9lbnYgKmVudjsKIAlzdHJ1Y3QgY2xfY2xpZW50X2NhY2hlICpjYWNoZSA9IGNsaS0+Y2xfY2FjaGU7CiAJaW50IG1heF9zY2FuczsKLQlpbnQgcmMgPSAwOworCWxvbmcgcmMgPSAwOwogCiAJTEFTU0VSVChjYWNoZSk7CiAKQEAgLTY5MywxNSArNjgxLDE1IEBACiAJCWlmIChyYyA9PSAtRUJVU1kpCiAJCQlyYyA9IDA7CiAKLQkJQ0RFQlVHKERfQ0FDSEUsICIlczogRnJlZSAlZCBwYWdlcyBmcm9tIG93biBMUlU6ICVwLlxuIiwKKwkJQ0RFQlVHKERfQ0FDSEUsICIlczogRnJlZSAlbGQgcGFnZXMgZnJvbSBvd24gTFJVOiAlcC5cbiIsCiAJCSAgICAgICBjbGktPmNsX2ltcG9ydC0+aW1wX29iZC0+b2JkX25hbWUsIHJjLCBjbGkpOwogCQlnb3RvIG91dDsKIAl9CiAKLQlDREVCVUcoRF9DQUNIRSwgIiVzOiBjbGkgJXAgbm8gZnJlZSBzbG90cywgcGFnZXM6ICVkLCBidXN5OiAlZC5cbiIsCisJQ0RFQlVHKERfQ0FDSEUsICIlczogY2xpICVwIG5vIGZyZWUgc2xvdHMsIHBhZ2VzOiAlbGQsIGJ1c3k6ICVsZC5cbiIsCiAJICAgICAgIGNsaS0+Y2xfaW1wb3J0LT5pbXBfb2JkLT5vYmRfbmFtZSwgY2xpLAotCSAgICAgICBhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCksCi0JICAgICAgIGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9idXN5KSk7CisJICAgICAgIGF0b21pY19sb25nX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpLAorCSAgICAgICBhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9idXN5KSk7CiAKIAkvKiBSZWNsYWltIExSVSBzbG90cyBmcm9tIG90aGVyIGNsaWVudF9vYmQgYXMgaXQgY2FuJ3QgZnJlZSBlbm91Z2gKIAkgKiBmcm9tIGl0cyBvd24uIFRoaXMgc2hvdWxkIHJhcmVseSBoYXBwZW4uCkBAIC03MTcsMTAgKzcwNSwxMCBAQAogCQljbGkgPSBsaXN0X2VudHJ5KGNhY2hlLT5jY2NfbHJ1Lm5leHQsIHN0cnVjdCBjbGllbnRfb2JkLAogCQkJCSBjbF9scnVfb3NjKTsKIAotCQlDREVCVUcoRF9DQUNIRSwgIiVzOiBjbGkgJXAgTFJVIHBhZ2VzOiAlZCwgYnVzeTogJWQuXG4iLAorCQlDREVCVUcoRF9DQUNIRSwgIiVzOiBjbGkgJXAgTFJVIHBhZ2VzOiAlbGQsIGJ1c3k6ICVsZC5cbiIsCiAJCSAgICAgICBjbGktPmNsX2ltcG9ydC0+aW1wX29iZC0+b2JkX25hbWUsIGNsaSwKLQkJICAgICAgIGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSwKLQkJICAgICAgIGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9idXN5KSk7CisJCSAgICAgICBhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSwKKwkJICAgICAgIGF0b21pY19sb25nX3JlYWQoJmNsaS0+Y2xfbHJ1X2J1c3kpKTsKIAogCQlsaXN0X21vdmVfdGFpbCgmY2xpLT5jbF9scnVfb3NjLCAmY2FjaGUtPmNjY19scnUpOwogCQlpZiAob3NjX2NhY2hlX3Rvb19tdWNoKGNsaSkgPiAwKSB7CkBAIC03MzcsMTEgKzcyNSwxOCBAQAogCiBvdXQ6CiAJY2xfZW52X25lc3RlZF9wdXQoJm5lc3QsIGVudik7Ci0JQ0RFQlVHKERfQ0FDSEUsICIlczogY2xpICVwIGZyZWVkICVkIHBhZ2VzLlxuIiwKKwlDREVCVUcoRF9DQUNIRSwgIiVzOiBjbGkgJXAgZnJlZWQgJWxkIHBhZ2VzLlxuIiwKIAkgICAgICAgY2xpLT5jbF9pbXBvcnQtPmltcF9vYmQtPm9iZF9uYW1lLCBjbGksIHJjKTsKIAlyZXR1cm4gcmM7CiB9CiAKKy8qKgorICogb3NjX2xydV9yZXNlcnZlKCkgaXMgY2FsbGVkIHRvIHJlc2VydmUgYW4gTFJVIHNsb3QgZm9yIGEgY2xfcGFnZS4KKyAqCisgKiBVc3VhbGx5IHRoZSBMUlUgc2xvdHMgYXJlIHJlc2VydmVkIGluIG9zY19pb19pdGVyX3J3X2luaXQoKS4KKyAqIE9ubHkgaW4gdGhlIGNhc2UgdGhhdCB0aGUgTFJVIHNsb3RzIGFyZSBpbiBleHRyZW1lIHNob3J0YWdlLCBpdCBzaG91bGQKKyAqIGhhdmUgcmVzZXJ2ZWQgZW5vdWdoIHNsb3RzIGZvciBhbiBJTy4KKyAqLwogc3RhdGljIGludCBvc2NfbHJ1X3Jlc2VydmUoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3Qgb3NjX29iamVjdCAqb2JqLAogCQkJICAgc3RydWN0IG9zY19wYWdlICpvcGcpCiB7CkBAIC03NTgsOCArNzUzLDggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JTEFTU0VSVChhdG9taWNfcmVhZChjbGktPmNsX2xydV9sZWZ0KSA+PSAwKTsKLQl3aGlsZSAoIWF0b21pY19hZGRfdW5sZXNzKGNsaS0+Y2xfbHJ1X2xlZnQsIC0xLCAwKSkgeworCUxBU1NFUlQoYXRvbWljX2xvbmdfcmVhZChjbGktPmNsX2xydV9sZWZ0KSA+PSAwKTsKKwl3aGlsZSAoIWF0b21pY19sb25nX2FkZF91bmxlc3MoY2xpLT5jbF9scnVfbGVmdCwgLTEsIDApKSB7CiAJCS8qIHJ1biBvdXQgb2YgTFJVIHNwYWNlcywgdHJ5IHRvIGRyb3Agc29tZSBieSBpdHNlbGYgKi8KIAkJcmMgPSBvc2NfbHJ1X3JlY2xhaW0oY2xpKTsKIAkJaWYgKHJjIDwgMCkKQEAgLTc3MCw3ICs3NjUsNyBAQAogCQljb25kX3Jlc2NoZWQoKTsKIAogCQlyYyA9IGxfd2FpdF9ldmVudChvc2NfbHJ1X3dhaXRxLAotCQkJCSAgYXRvbWljX3JlYWQoY2xpLT5jbF9scnVfbGVmdCkgPiAwLAorCQkJCSAgYXRvbWljX2xvbmdfcmVhZChjbGktPmNsX2xydV9sZWZ0KSA+IDAsCiAJCQkJICAmbHdpKTsKIAogCQlpZiAocmMgPCAwKQpAQCAtNzc5LDcgKzc3NCw3IEBACiAKIG91dDoKIAlpZiAocmMgPj0gMCkgewotCQlhdG9taWNfaW5jKCZjbGktPmNsX2xydV9idXN5KTsKKwkJYXRvbWljX2xvbmdfaW5jKCZjbGktPmNsX2xydV9idXN5KTsKIAkJb3BnLT5vcHNfaW5fbHJ1ID0gMTsKIAkJcmMgPSAwOwogCX0KQEAgLTc4Nyw0ICs3ODIsMTUxIEBACiAJcmV0dXJuIHJjOwogfQogCisvKioKKyAqIEF0b21pYyBvcGVyYXRpb25zIGFyZSBleHBlbnNpdmUuIFdlIGFjY3VtdWxhdGUgdGhlIGFjY291bnRpbmcgZm9yIHRoZQorICogc2FtZSBwYWdlIHBnZGF0IHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgKiBJbiBwcmFjdGljZSB0aGlzIGNhbiB3b3JrIHByZXR0eSBnb29kIGJlY2F1c2UgdGhlIHBhZ2VzIGluIHRoZSBzYW1lIFJQQworICogYXJlIGxpa2VseSBmcm9tIHRoZSBzYW1lIHBhZ2Ugem9uZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHVuc3RhYmxlX3BhZ2VfYWNjb3VudGluZyhzdHJ1Y3QgcHRscnBjX2J1bGtfZGVzYyAqZGVzYywKKwkJCQkJICAgIGludCBmYWN0b3IpCit7CisJaW50IHBhZ2VfY291bnQgPSBkZXNjLT5iZF9pb3ZfY291bnQ7CisJcGdfZGF0YV90ICpsYXN0ID0gTlVMTDsKKwlpbnQgY291bnQgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHBhZ2VfY291bnQ7IGkrKykgeworCQlwZ19kYXRhX3QgKnBnZGF0ID0gcGFnZV9wZ2RhdChkZXNjLT5iZF9pb3ZbaV0uYnZfcGFnZSk7CisKKwkJaWYgKGxpa2VseShwZ2RhdCA9PSBsYXN0KSkgeworCQkJKytjb3VudDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNvdW50ID4gMCkgeworCQkJbW9kX25vZGVfcGFnZV9zdGF0ZShwZ2RhdCwgTlJfVU5TVEFCTEVfTkZTLAorCQkJCQkgICAgZmFjdG9yICogY291bnQpOworCQkJY291bnQgPSAwOworCQl9CisJCWxhc3QgPSBwZ2RhdDsKKwkJKytjb3VudDsKKwl9CisJaWYgKGNvdW50ID4gMCkKKwkJbW9kX25vZGVfcGFnZV9zdGF0ZShsYXN0LCBOUl9VTlNUQUJMRV9ORlMsIGZhY3RvciAqIGNvdW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkZF91bnN0YWJsZV9wYWdlX2FjY291bnRpbmcoc3RydWN0IHB0bHJwY19idWxrX2Rlc2MgKmRlc2MpCit7CisJdW5zdGFibGVfcGFnZV9hY2NvdW50aW5nKGRlc2MsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVjX3Vuc3RhYmxlX3BhZ2VfYWNjb3VudGluZyhzdHJ1Y3QgcHRscnBjX2J1bGtfZGVzYyAqZGVzYykKK3sKKwl1bnN0YWJsZV9wYWdlX2FjY291bnRpbmcoZGVzYywgLTEpOworfQorCisvKioKKyAqIFBlcmZvcm1zICJ1bnN0YWJsZSIgcGFnZSBhY2NvdW50aW5nLiBUaGlzIGZ1bmN0aW9uIGJhbGFuY2VzIHRoZQorICogaW5jcmVtZW50IG9wZXJhdGlvbnMgcGVyZm9ybWVkIGluIG9zY19pbmNfdW5zdGFibGVfcGFnZXMuIEl0IGlzCisgKiByZWdpc3RlcmVkIGFzIHRoZSBSUEMgcmVxdWVzdCBjYWxsYmFjaywgYW5kIGlzIGV4ZWN1dGVkIHdoZW4gdGhlCisgKiBidWxrIFJQQyBpcyBjb21taXR0ZWQgb24gdGhlIHNlcnZlci4gVGh1cyBhdCB0aGlzIHBvaW50LCB0aGUgcGFnZXMKKyAqIGludm9sdmVkIGluIHRoZSBidWxrIHRyYW5zZmVyIGFyZSBubyBsb25nZXIgY29uc2lkZXJlZCB1bnN0YWJsZS4KKyAqCisgKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHJlcXVlc3Qgc2hvdWxkIGhhdmUgYmVlbiBjb21taXR0ZWQKKyAqIG9yIHJlcTpycV91bnN0YWJsZSBtdXN0IGhhdmUgYmVlbiBzZXQ7IGl0IGltcGxpZXMgdGhhdCB0aGUgdW5zdGFibGUKKyAqIHN0YXRpc3RpYyBoYXZlIGJlZW4gYWRkZWQuCisgKi8KK3ZvaWQgb3NjX2RlY191bnN0YWJsZV9wYWdlcyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJnJlcS0+cnFfaW1wb3J0LT5pbXBfb2JkLT51LmNsaTsKKwlzdHJ1Y3QgcHRscnBjX2J1bGtfZGVzYyAqZGVzYyA9IHJlcS0+cnFfYnVsazsKKwlpbnQgcGFnZV9jb3VudCA9IGRlc2MtPmJkX2lvdl9jb3VudDsKKwlsb25nIHVuc3RhYmxlX2NvdW50OworCisJTEFTU0VSVChwYWdlX2NvdW50ID49IDApOworCWRlY191bnN0YWJsZV9wYWdlX2FjY291bnRpbmcoZGVzYyk7CisKKwl1bnN0YWJsZV9jb3VudCA9IGF0b21pY19sb25nX3N1Yl9yZXR1cm4ocGFnZV9jb3VudCwKKwkJCQkJCSZjbGktPmNsX3Vuc3RhYmxlX2NvdW50KTsKKwlMQVNTRVJUKHVuc3RhYmxlX2NvdW50ID49IDApOworCisJdW5zdGFibGVfY291bnQgPSBhdG9taWNfbG9uZ19zdWJfcmV0dXJuKHBhZ2VfY291bnQsCisJCQkJCQkmY2xpLT5jbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX25yKTsKKwlMQVNTRVJUKHVuc3RhYmxlX2NvdW50ID49IDApOworCWlmICghdW5zdGFibGVfY291bnQpCisJCXdha2VfdXBfYWxsKCZjbGktPmNsX2NhY2hlLT5jY2NfdW5zdGFibGVfd2FpdHEpOworCisJaWYgKG9zY19jYWNoZV90b29fbXVjaChjbGkpKQorCQkodm9pZClwdGxycGNkX3F1ZXVlX3dvcmsoY2xpLT5jbF9scnVfd29yayk7Cit9CisKKy8qKgorICogInVuc3RhYmxlIiBwYWdlIGFjY291bnRpbmcuIFNlZTogb3NjX2RlY191bnN0YWJsZV9wYWdlcy4KKyAqLwordm9pZCBvc2NfaW5jX3Vuc3RhYmxlX3BhZ2VzKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgID0gJnJlcS0+cnFfaW1wb3J0LT5pbXBfb2JkLT51LmNsaTsKKwlzdHJ1Y3QgcHRscnBjX2J1bGtfZGVzYyAqZGVzYyA9IHJlcS0+cnFfYnVsazsKKwlsb25nIHBhZ2VfY291bnQgPSBkZXNjLT5iZF9pb3ZfY291bnQ7CisKKwkvKiBObyB1bnN0YWJsZSBwYWdlIHRyYWNraW5nICovCisJaWYgKCFjbGktPmNsX2NhY2hlIHx8ICFjbGktPmNsX2NhY2hlLT5jY2NfdW5zdGFibGVfY2hlY2spCisJCXJldHVybjsKKworCWFkZF91bnN0YWJsZV9wYWdlX2FjY291bnRpbmcoZGVzYyk7CisJYXRvbWljX2xvbmdfYWRkKHBhZ2VfY291bnQsICZjbGktPmNsX3Vuc3RhYmxlX2NvdW50KTsKKwlhdG9taWNfbG9uZ19hZGQocGFnZV9jb3VudCwgJmNsaS0+Y2xfY2FjaGUtPmNjY191bnN0YWJsZV9ucik7CisKKwkvKgorCSAqIElmIHRoZSByZXF1ZXN0IGhhcyBhbHJlYWR5IGJlZW4gY29tbWl0dGVkIChpLmUuIGJyd19jb21taXQKKwkgKiBjYWxsZWQgdmlhIHJxX2NvbW1pdF9jYiksIHdlIG5lZWQgdG8gdW5kbyB0aGUgdW5zdGFibGUgcGFnZQorCSAqIGluY3JlbWVudHMgd2UganVzdCBwZXJmb3JtZWQgYmVjYXVzZSBycV9jb21taXRfY2Igd29udCBiZQorCSAqIGNhbGxlZCBhZ2Fpbi4KKwkgKi8KKwlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7CisJaWYgKHVubGlrZWx5KHJlcS0+cnFfY29tbWl0dGVkKSkgeworCQlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKKworCQlvc2NfZGVjX3Vuc3RhYmxlX3BhZ2VzKHJlcSk7CisJfSBlbHNlIHsKKwkJcmVxLT5ycV91bnN0YWJsZSA9IDE7CisJCXNwaW5fdW5sb2NrKCZyZXEtPnJxX2xvY2spOworCX0KK30KKworLyoqCisgKiBDaGVjayBpZiBpdCBwaWdneWJhY2tzIFNPRlRfU1lOQyBmbGFnIHRvIE9TVCBmcm9tIHRoaXMgT1NDLgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBieSBldmVyeSBCUlcgUlBDIHNvIGl0J3MgY3JpdGljYWwKKyAqIHRvIG1ha2UgdGhpcyBmdW5jdGlvbiBmYXN0LgorICovCitib29sIG9zY19vdmVyX3Vuc3RhYmxlX3NvZnRfbGltaXQoc3RydWN0IGNsaWVudF9vYmQgKmNsaSkKK3sKKwlsb25nIHVuc3RhYmxlX25yLCBvc2NfdW5zdGFibGVfY291bnQ7CisKKwkvKiBDYW4ndCBjaGVjayBjbGktPmNsX3Vuc3RhYmxlX2NvdW50LCB0aGVyZWZvcmUsIG5vIHNvZnQgbGltaXQgKi8KKwlpZiAoIWNsaS0+Y2xfY2FjaGUgfHwgIWNsaS0+Y2xfY2FjaGUtPmNjY191bnN0YWJsZV9jaGVjaykKKwkJcmV0dXJuIGZhbHNlOworCisJb3NjX3Vuc3RhYmxlX2NvdW50ID0gYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF91bnN0YWJsZV9jb3VudCk7CisJdW5zdGFibGVfbnIgPSBhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2NhY2hlLT5jY2NfdW5zdGFibGVfbnIpOworCisJQ0RFQlVHKERfQ0FDSEUsCisJICAgICAgICIlczogY2xpOiAlcCB1bnN0YWJsZSBwYWdlczogJWx1LCBvc2MgdW5zdGFibGUgcGFnZXM6ICVsdVxuIiwKKwkgICAgICAgY2xpLT5jbF9pbXBvcnQtPmltcF9vYmQtPm9iZF9uYW1lLCBjbGksCisJICAgICAgIHVuc3RhYmxlX25yLCBvc2NfdW5zdGFibGVfY291bnQpOworCisJLyoKKwkgKiBJZiB0aGUgTFJVIHNsb3RzIGFyZSBpbiBzaG9ydGFnZSAtIDI1JSByZW1haW5pbmcgQU5EIHRoaXMgT1NDCisJICogaGFzIG9uZSBmdWxsIFJQQyB3aW5kb3cgb2YgdW5zdGFibGUgcGFnZXMsIGl0J3MgYSBnb29kIGNoYW5jZQorCSAqIHRvIHBpZ2d5YmFjayBhIFNPRlRfU1lOQyBmbGFnLgorCSAqIFBsZWFzZSBub3RpY2UgdGhhdCB0aGUgT1NUIHdvbid0IHRha2UgaW1tZWRpYXRlIHJlc3BvbnNlIGZvciB0aGUKKwkgKiBTT0ZUX1NZTkMgcmVxdWVzdCBzbyBhY3RpdmUgT1NDcyB3aWxsIGhhdmUgbW9yZSBjaGFuY2UgdG8gY2FycnkKKwkgKiB0aGUgZmxhZywgdGhpcyBpcyByZWFzb25hYmxlLgorCSAqLworCXJldHVybiB1bnN0YWJsZV9uciA+IGNsaS0+Y2xfY2FjaGUtPmNjY19scnVfbWF4ID4+IDIgJiYKKwkgICAgICAgb3NjX3Vuc3RhYmxlX2NvdW50ID4gY2xpLT5jbF9tYXhfcGFnZXNfcGVyX3JwYyAqCisJCQkJICAgIGNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0OworfQorCiAvKiogQH0gb3NjICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3JlcXVlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcmVxdWVzdC5jCmluZGV4IDUzNmI4NjguLjc0OTc4MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcmVxdWVzdC5jCkBAIC00MSw2ICs0MSw3IEBACiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9oYS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaW9jdGwuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9kZWJ1Zy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX3BhcmFtLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZmlkLmgiCkBAIC0xMDIsMzYgKzEwMyw2IEBACiBzdGF0aWMgaW50IGJyd19pbnRlcnByZXQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAogCQkJIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCB2b2lkICpkYXRhLCBpbnQgcmMpOwogCi0vKiBQYWNrIE9TQyBvYmplY3QgbWV0YWRhdGEgZm9yIGRpc2sgc3RvcmFnZSAoTEUgYnl0ZSBvcmRlcikuICovCi1zdGF0aWMgaW50IG9zY19wYWNrbWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9tZHNfbWQgKipsbW1wLAotCQkgICAgICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQotewotCWludCBsbW1fc2l6ZTsKLQotCWxtbV9zaXplID0gc2l6ZW9mKCoqbG1tcCk7Ci0JaWYgKCFsbW1wKQotCQlyZXR1cm4gbG1tX3NpemU7Ci0KLQlpZiAoKmxtbXAgJiYgIWxzbSkgewotCQlrZnJlZSgqbG1tcCk7Ci0JCSpsbW1wID0gTlVMTDsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmICh1bmxpa2VseShsc20gJiYgb3N0aWRfaWQoJmxzbS0+bHNtX29pKSA9PSAwKSkgewotCQlyZXR1cm4gLUVCQURGOwotCX0KLQotCWlmICghKmxtbXApIHsKLQkJKmxtbXAgPSBremFsbG9jKGxtbV9zaXplLCBHRlBfTk9GUyk7Ci0JCWlmICghKmxtbXApCi0JCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlpZiAobHNtKQotCQlvc3RpZF9jcHVfdG9fbGUoJmxzbS0+bHNtX29pLCAmKCpsbW1wKS0+bG1tX29pKTsKLQotCXJldHVybiBsbW1fc2l6ZTsKLX0KLQogLyogVW5wYWNrIE9TQyBvYmplY3QgbWV0YWRhdGEgZnJvbSBkaXNrIHN0b3JhZ2UgKExFIGJ5dGUgb3JkZXIpLiAqLwogc3RhdGljIGludCBvc2NfdW5wYWNrbWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKipsc21wLAogCQkJc3RydWN0IGxvdl9tZHNfbWQgKmxtbSwgaW50IGxtbV9ieXRlcykKQEAgLTE4OSw3ICsxNjAsNyBAQAogCSAgICAoaW1wLT5pbXBfY29ubmVjdF9kYXRhLm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfTUFYQllURVMpKQogCQkoKmxzbXApLT5sc21fbWF4Ynl0ZXMgPSBpbXAtPmltcF9jb25uZWN0X2RhdGEub2NkX21heGJ5dGVzOwogCWVsc2UKLQkJKCpsc21wKS0+bHNtX21heGJ5dGVzID0gTFVTVFJFX1NUUklQRV9NQVhCWVRFUzsKKwkJKCpsc21wKS0+bHNtX21heGJ5dGVzID0gTFVTVFJFX0VYVDNfU1RSSVBFX01BWEJZVEVTOwogCiAJcmV0dXJuIGxzbV9zaXplOwogfQpAQCAtNDI3LDI0ICszOTgsMTYgQEAKIAkJCQkgICAgICBvaW5mby0+b2lfY2JfdXAsIG9pbmZvLCBycXNldCk7CiB9CiAKLXN0YXRpYyBpbnQgb3NjX3JlYWxfY3JlYXRlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBvYmRvICpvYSwKLQkJCSAgIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqZWEsCi0JCQkgICBzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gKm90aSkKK3N0YXRpYyBpbnQgb3NjX2NyZWF0ZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCSAgICAgIHN0cnVjdCBvYmRvICpvYSwgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGkpCiB7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXE7CiAJc3RydWN0IG9zdF9ib2R5ICpib2R5OwotCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc207CiAJaW50IHJjOwogCiAJTEFTU0VSVChvYSk7Ci0JTEFTU0VSVChlYSk7Ci0KLQlsc20gPSAqZWE7Ci0JaWYgKCFsc20pIHsKLQkJcmMgPSBvYmRfYWxsb2NfbWVtbWQoZXhwLCAmbHNtKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQl9CisJTEFTU0VSVChvYS0+b192YWxpZCAmIE9CRF9NRF9GTEdST1VQKTsKKwlMQVNTRVJUKGZpZF9zZXFfaXNfZWNobyhvc3RpZF9zZXEoJm9hLT5vX29pKSkpOwogCiAJcmVxID0gcHRscnBjX3JlcXVlc3RfYWxsb2MoY2xhc3NfZXhwMmNsaWltcChleHApLCAmUlFGX09TVF9DUkVBVEUpOwogCWlmICghcmVxKSB7CkBAIC00OTAsMjEgKzQ1MywxMCBAQAogCW9hLT5vX2Jsa3NpemUgPSBjbGlfYnJ3X3NpemUoZXhwLT5leHBfb2JkKTsKIAlvYS0+b192YWxpZCB8PSBPQkRfTURfRkxCTEtTWjsKIAotCS8qIFhYWCBMT1YgU1RBQ0tJTkc6IHRoZSBsc20gdGhhdCBpcyBwYXNzZWQgdG8gdXMgZnJvbSBMT1YgZG9lcyBub3QKLQkgKiBoYXZlIHZhbGlkIGxzbV9vaW5mbyBkYXRhIHN0cnVjdHMsIHNvIGRvbid0IGdvIHRvdWNoaW5nIHRoYXQuCi0JICogVGhpcyBuZWVkcyB0byBiZSBmaXhlZCBpbiBhIGJpZyB3YXkuCi0JICovCi0JbHNtLT5sc21fb2kgPSBvYS0+b19vaTsKLQkqZWEgPSBsc207Ci0KLQlpZiAob3RpKSB7Ci0JCW90aS0+b3RpX3RyYW5zbm8gPSBsdXN0cmVfbXNnX2dldF90cmFuc25vKHJlcS0+cnFfcmVwbXNnKTsKLQotCQlpZiAob2EtPm9fdmFsaWQgJiBPQkRfTURfRkxDT09LSUUpIHsKLQkJCWlmICghb3RpLT5vdGlfbG9nY29va2llcykKLQkJCQlvdGlfYWxsb2NfY29va2llcyhvdGksIDEpOwotCQkJKm90aS0+b3RpX2xvZ2Nvb2tpZXMgPSBvYS0+b19sY29va2llOwotCQl9CisJaWYgKG90aSAmJiBvYS0+b192YWxpZCAmIE9CRF9NRF9GTENPT0tJRSkgeworCQlpZiAoIW90aS0+b3RpX2xvZ2Nvb2tpZXMpCisJCQlvdGktPm90aV9sb2djb29raWVzID0gJm90aS0+b3RpX29uZWNvb2tpZTsKKwkJKm90aS0+b3RpX2xvZ2Nvb2tpZXMgPSBvYS0+b19sY29va2llOwogCX0KIAogCUNERUJVRyhEX0hBLCAidHJhbnNubzogJWxsZFxuIiwKQEAgLTUxMiw4ICs0NjQsNiBAQAogb3V0X3JlcToKIAlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CiBvdXQ6Ci0JaWYgKHJjICYmICEqZWEpCi0JCW9iZF9mcmVlX21lbW1kKGV4cCwgJmxzbSk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC02NDksNyArNTk5LDcgQEAKIAogCW9zdGlkX2J1aWxkX3Jlc19uYW1lKCZvYS0+b19vaSwgJnJlc19pZCk7CiAJcmVzID0gbGRsbV9yZXNvdXJjZV9nZXQobnMsIE5VTEwsICZyZXNfaWQsIDAsIDApOwotCWlmICghcmVzKQorCWlmIChJU19FUlIocmVzKSkKIAkJcmV0dXJuIDA7CiAKIAlMRExNX1JFU09VUkNFX0FERFJFRihyZXMpOwpAQCAtNjg5LDMwICs2MzksNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG9zY19jcmVhdGUoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAotCQkgICAgICBzdHJ1Y3Qgb2JkbyAqb2EsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqZWEsCi0JCSAgICAgIHN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpKQotewotCWludCByYyA9IDA7Ci0KLQlMQVNTRVJUKG9hKTsKLQlMQVNTRVJUKGVhKTsKLQlMQVNTRVJUKG9hLT5vX3ZhbGlkICYgT0JEX01EX0ZMR1JPVVApOwotCi0JaWYgKChvYS0+b192YWxpZCAmIE9CRF9NRF9GTEZMQUdTKSAmJgotCSAgICBvYS0+b19mbGFncyA9PSBPQkRfRkxfUkVDUkVBVEVfT0JKUykgewotCQlyZXR1cm4gb3NjX3JlYWxfY3JlYXRlKGV4cCwgb2EsIGVhLCBvdGkpOwotCX0KLQotCWlmICghZmlkX3NlcV9pc19tZHQob3N0aWRfc2VxKCZvYS0+b19vaSkpKQotCQlyZXR1cm4gb3NjX3JlYWxfY3JlYXRlKGV4cCwgb2EsIGVhLCBvdGkpOwotCi0JLyogd2Ugc2hvdWxkIG5vdCBnZXQgaGVyZSBhbnltb3JlICovCi0JTEJVRygpOwotCi0JcmV0dXJuIHJjOwotfQotCiAvKiBEZXN0cm95IHJlcXVlc3RzIGNhbiBiZSBhc3luYyBhbHdheXMgb24gdGhlIGNsaWVudCwgYW5kIHdlIGRvbid0IGV2ZW4gcmVhbGx5CiAgKiBjYXJlIGFib3V0IHRoZSByZXR1cm4gY29kZSBzaW5jZSB0aGUgY2xpZW50IGNhbm5vdCBkbyBhbnl0aGluZyBhdCBhbGwgYWJvdXQKICAqIGEgZGVzdHJveSBmYWlsdXJlLgpAQCAtNzI1LDggKzY1MSw3IEBACiAgKiBjb29raWVzIHRvIHRoZSBNRFMgYWZ0ZXIgY29tbWl0dGluZyBkZXN0cm95IHRyYW5zYWN0aW9ucy4KICAqLwogc3RhdGljIGludCBvc2NfZGVzdHJveShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCSAgICAgICBzdHJ1Y3Qgb2JkbyAqb2EsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICplYSwKLQkJICAgICAgIHN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpLCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqbWRfZXhwb3J0KQorCQkgICAgICAgc3RydWN0IG9iZG8gKm9hLCBzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gKm90aSkKIHsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJmV4cC0+ZXhwX29iZC0+dS5jbGk7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXE7CkBAIC03OTQsNDIgKzcxOSw0NCBAQAogc3RhdGljIHZvaWQgb3NjX2Fubm91bmNlX2NhY2hlZChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpLCBzdHJ1Y3Qgb2JkbyAqb2EsCiAJCQkJbG9uZyB3cml0aW5nX2J5dGVzKQogewotCXUzMiBiaXRzID0gT0JEX01EX0ZMQkxPQ0tTfE9CRF9NRF9GTEdSQU5UOworCXUzMiBiaXRzID0gT0JEX01EX0ZMQkxPQ0tTIHwgT0JEX01EX0ZMR1JBTlQ7CiAKIAlMQVNTRVJUKCEob2EtPm9fdmFsaWQgJiBiaXRzKSk7CiAKIAlvYS0+b192YWxpZCB8PSBiaXRzOwogCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlvYS0+b19kaXJ0eSA9IGNsaS0+Y2xfZGlydHk7Ci0JaWYgKHVubGlrZWx5KGNsaS0+Y2xfZGlydHkgLSBjbGktPmNsX2RpcnR5X3RyYW5zaXQgPgotCQkgICAgIGNsaS0+Y2xfZGlydHlfbWF4KSkgeworCW9hLT5vX2RpcnR5ID0gY2xpLT5jbF9kaXJ0eV9wYWdlcyA8PCBQQUdFX1NISUZUOworCWlmICh1bmxpa2VseShjbGktPmNsX2RpcnR5X3BhZ2VzIC0gY2xpLT5jbF9kaXJ0eV90cmFuc2l0ID4KKwkJICAgICBjbGktPmNsX2RpcnR5X21heF9wYWdlcykpIHsKIAkJQ0VSUk9SKCJkaXJ0eSAlbHUgLSAlbHUgPiBkaXJ0eV9tYXggJWx1XG4iLAotCQkgICAgICAgY2xpLT5jbF9kaXJ0eSwgY2xpLT5jbF9kaXJ0eV90cmFuc2l0LCBjbGktPmNsX2RpcnR5X21heCk7CisJCSAgICAgICBjbGktPmNsX2RpcnR5X3BhZ2VzLCBjbGktPmNsX2RpcnR5X3RyYW5zaXQsCisJCSAgICAgICBjbGktPmNsX2RpcnR5X21heF9wYWdlcyk7CiAJCW9hLT5vX3VuZGlydHkgPSAwOwotCX0gZWxzZSBpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJm9iZF91bnN0YWJsZV9wYWdlcykgKwotCQkJICAgIGF0b21pY19yZWFkKCZvYmRfZGlydHlfcGFnZXMpIC0KLQkJCSAgICBhdG9taWNfcmVhZCgmb2JkX2RpcnR5X3RyYW5zaXRfcGFnZXMpID4KLQkJCSAgICAobG9uZykob2JkX21heF9kaXJ0eV9wYWdlcyArIDEpKSkgeworCX0gZWxzZSBpZiAodW5saWtlbHkoYXRvbWljX2xvbmdfcmVhZCgmb2JkX2RpcnR5X3BhZ2VzKSAtCisJCQkgICAgYXRvbWljX2xvbmdfcmVhZCgmb2JkX2RpcnR5X3RyYW5zaXRfcGFnZXMpID4KKwkJCSAgICAob2JkX21heF9kaXJ0eV9wYWdlcyArIDEpKSkgewogCQkvKiBUaGUgYXRvbWljX3JlYWQoKSBhbGxvd2luZyB0aGUgYXRvbWljX2luYygpIGFyZQogCQkgKiBub3QgY292ZXJlZCBieSBhIGxvY2sgdGh1cyB0aGV5IG1heSBzYWZlbHkgcmFjZSBhbmQgdHJpcAogCQkgKiB0aGlzIENFUlJPUigpIHVubGVzcyB3ZSBhZGQgaW4gYSBzbWFsbCBmdWRnZSBmYWN0b3IgKCsxKS4KIAkJICovCi0JCUNFUlJPUigiJXM6IGRpcnR5ICVkICsgJWQgLSAlZCA+IHN5c3RlbSBkaXJ0eV9tYXggJWRcbiIsCisJCUNFUlJPUigiJXM6IGRpcnR5ICVsZCArICVsZCA+IHN5c3RlbSBkaXJ0eV9tYXggJWx1XG4iLAogCQkgICAgICAgY2xpLT5jbF9pbXBvcnQtPmltcF9vYmQtPm9iZF9uYW1lLAotCQkgICAgICAgYXRvbWljX3JlYWQoJm9iZF91bnN0YWJsZV9wYWdlcyksCi0JCSAgICAgICBhdG9taWNfcmVhZCgmb2JkX2RpcnR5X3BhZ2VzKSwKLQkJICAgICAgIGF0b21pY19yZWFkKCZvYmRfZGlydHlfdHJhbnNpdF9wYWdlcyksCisJCSAgICAgICBhdG9taWNfbG9uZ19yZWFkKCZvYmRfZGlydHlfcGFnZXMpLAorCQkgICAgICAgYXRvbWljX2xvbmdfcmVhZCgmb2JkX2RpcnR5X3RyYW5zaXRfcGFnZXMpLAogCQkgICAgICAgb2JkX21heF9kaXJ0eV9wYWdlcyk7CiAJCW9hLT5vX3VuZGlydHkgPSAwOwotCX0gZWxzZSBpZiAodW5saWtlbHkoY2xpLT5jbF9kaXJ0eV9tYXggLSBjbGktPmNsX2RpcnR5ID4gMHg3ZmZmZmZmZikpIHsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KGNsaS0+Y2xfZGlydHlfbWF4X3BhZ2VzIC0gY2xpLT5jbF9kaXJ0eV9wYWdlcyA+CisJCSAgIDB4N2ZmZmZmZmYpKSB7CiAJCUNFUlJPUigiZGlydHkgJWx1IC0gZGlydHlfbWF4ICVsdSB0b28gYmlnPz8/XG4iLAotCQkgICAgICAgY2xpLT5jbF9kaXJ0eSwgY2xpLT5jbF9kaXJ0eV9tYXgpOworCQkgICAgICAgY2xpLT5jbF9kaXJ0eV9wYWdlcywgY2xpLT5jbF9kaXJ0eV9tYXhfcGFnZXMpOwogCQlvYS0+b191bmRpcnR5ID0gMDsKIAl9IGVsc2UgewotCQlsb25nIG1heF9pbl9mbGlnaHQgPSAoY2xpLT5jbF9tYXhfcGFnZXNfcGVyX3JwYyA8PAotCQkJCSAgICAgIFBBR0VfU0hJRlQpKgotCQkJCSAgICAgKGNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0ICsgMSk7Ci0JCW9hLT5vX3VuZGlydHkgPSBtYXgoY2xpLT5jbF9kaXJ0eV9tYXgsIG1heF9pbl9mbGlnaHQpOworCQl1bnNpZ25lZCBsb25nIG1heF9pbl9mbGlnaHQ7CisKKwkJbWF4X2luX2ZsaWdodCA9IChjbGktPmNsX21heF9wYWdlc19wZXJfcnBjIDw8IFBBR0VfU0hJRlQpICoKKwkJCQkoY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQgKyAxKTsKKwkJb2EtPm9fdW5kaXJ0eSA9IG1heChjbGktPmNsX2RpcnR5X21heF9wYWdlcyA8PCBQQUdFX1NISUZULAorCQkJCSAgICBtYXhfaW5fZmxpZ2h0KTsKIAl9CiAJb2EtPm9fZ3JhbnQgPSBjbGktPmNsX2F2YWlsX2dyYW50ICsgY2xpLT5jbF9yZXNlcnZlZF9ncmFudDsKIAlvYS0+b19kcm9wcGVkID0gY2xpLT5jbF9sb3N0X2dyYW50OwpAQCAtMTAyOSwyMiArOTU2LDI0IEBACiB7CiAJLyoKIAkgKiBvY2RfZ3JhbnQgaXMgdGhlIHRvdGFsIGdyYW50IGFtb3VudCB3ZSdyZSBleHBlY3QgdG8gaG9sZDogaWYgd2UndmUKLQkgKiBiZWVuIGV2aWN0ZWQsIGl0J3MgdGhlIG5ldyBhdmFpbF9ncmFudCBhbW91bnQsIGNsX2RpcnR5IHdpbGwgZHJvcAotCSAqIHRvIDAgYXMgaW5mbGlnaHQgUlBDcyBmYWlsIG91dDsgb3RoZXJ3aXNlLCBpdCdzIGF2YWlsX2dyYW50ICsgZGlydHkuCisJICogYmVlbiBldmljdGVkLCBpdCdzIHRoZSBuZXcgYXZhaWxfZ3JhbnQgYW1vdW50LCBjbF9kaXJ0eV9wYWdlcyB3aWxsCisJICogZHJvcCB0byAwIGFzIGluZmxpZ2h0IFJQQ3MgZmFpbCBvdXQ7IG90aGVyd2lzZSwgaXQncyBhdmFpbF9ncmFudCArCisJICogZGlydHkuCiAJICoKIAkgKiByYWNlIGlzIHRvbGVyYWJsZSBoZXJlOiBpZiB3ZSdyZSBldmljdGVkLCBidXQgaW1wX3N0YXRlIGFscmVhZHkKLQkgKiBsZWZ0IEVWSUNURUQgc3RhdGUsIHRoZW4gY2xfZGlydHkgbXVzdCBiZSAwIGFscmVhZHkuCisJICogbGVmdCBFVklDVEVEIHN0YXRlLCB0aGVuIGNsX2RpcnR5X3BhZ2VzIG11c3QgYmUgMCBhbHJlYWR5LgogCSAqLwogCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKIAlpZiAoY2xpLT5jbF9pbXBvcnQtPmltcF9zdGF0ZSA9PSBMVVNUUkVfSU1QX0VWSUNURUQpCiAJCWNsaS0+Y2xfYXZhaWxfZ3JhbnQgPSBvY2QtPm9jZF9ncmFudDsKIAllbHNlCi0JCWNsaS0+Y2xfYXZhaWxfZ3JhbnQgPSBvY2QtPm9jZF9ncmFudCAtIGNsaS0+Y2xfZGlydHk7CisJCWNsaS0+Y2xfYXZhaWxfZ3JhbnQgPSBvY2QtPm9jZF9ncmFudCAtCisJCQkJICAgICAgKGNsaS0+Y2xfZGlydHlfcGFnZXMgPDwgUEFHRV9TSElGVCk7CiAKIAlpZiAoY2xpLT5jbF9hdmFpbF9ncmFudCA8IDApIHsKIAkJQ1dBUk4oIiVzOiBhdmFpbGFibGUgZ3JhbnQgPCAwOiBhdmFpbC9vY2QvZGlydHkgJWxkLyV1LyVsZFxuIiwKIAkJICAgICAgY2xpLT5jbF9pbXBvcnQtPmltcF9vYmQtPm9iZF9uYW1lLCBjbGktPmNsX2F2YWlsX2dyYW50LAotCQkgICAgICBvY2QtPm9jZF9ncmFudCwgY2xpLT5jbF9kaXJ0eSk7CisJCSAgICAgIG9jZC0+b2NkX2dyYW50LCBjbGktPmNsX2RpcnR5X3BhZ2VzIDw8IFBBR0VfU0hJRlQpOwogCQkvKiB3b3JrYXJvdW5kIGZvciBzZXJ2ZXJzIHdoaWNoIGRvIG5vdCBoYXZlIHRoZSBwYXRjaCBmcm9tCiAJCSAqIExVLTI2NzkKIAkJICovCkBAIC0xMTgxLDcgKzExMTAsNyBAQAogCX0KIAogCXdoaWxlIChub2IgPiAwICYmIHBnX2NvdW50ID4gMCkgewotCQlpbnQgY291bnQgPSBwZ2FbaV0tPmNvdW50ID4gbm9iID8gbm9iIDogcGdhW2ldLT5jb3VudDsKKwkJdW5zaWduZWQgaW50IGNvdW50ID0gcGdhW2ldLT5jb3VudCA+IG5vYiA/IG5vYiA6IHBnYVtpXS0+Y291bnQ7CiAKIAkJLyogY29ycnVwdCB0aGUgZGF0YSBiZWZvcmUgd2UgY29tcHV0ZSB0aGUgY2hlY2tzdW0sIHRvCiAJCSAqIHNpbXVsYXRlIGFuIE9TVC0+Y2xpZW50IGRhdGEgZXJyb3IKQEAgLTExOTEsNyArMTEyMCw3IEBACiAJCQl1bnNpZ25lZCBjaGFyICpwdHIgPSBrbWFwKHBnYVtpXS0+cGcpOwogCQkJaW50IG9mZiA9IHBnYVtpXS0+b2ZmICYgflBBR0VfTUFTSzsKIAotCQkJbWVtY3B5KHB0ciArIG9mZiwgImJhZDEiLCBtaW4oNCwgbm9iKSk7CisJCQltZW1jcHkocHRyICsgb2ZmLCAiYmFkMSIsIG1pbl90KHR5cGVvZihub2IpLCA0LCBub2IpKTsKIAkJCWt1bm1hcChwZ2FbaV0tPnBnKTsKIAkJfQogCQljZnNfY3J5cHRvX2hhc2hfdXBkYXRlX3BhZ2UoaGRlc2MsIHBnYVtpXS0+cGcsCkBAIC0xMzM1LDExICsxMjY0LDExIEBACiAKIAkJaWYgKGkgPiAwICYmIGNhbl9tZXJnZV9wYWdlcyhwZ19wcmV2LCBwZykpIHsKIAkJCW5pb2J1Zi0tOwotCQkJbmlvYnVmLT5sZW4gKz0gcGctPmNvdW50OworCQkJbmlvYnVmLT5ybmJfbGVuICs9IHBnLT5jb3VudDsKIAkJfSBlbHNlIHsKLQkJCW5pb2J1Zi0+b2Zmc2V0ID0gcGctPm9mZjsKLQkJCW5pb2J1Zi0+bGVuID0gcGctPmNvdW50OwotCQkJbmlvYnVmLT5mbGFncyA9IHBnLT5mbGFnOworCQkJbmlvYnVmLT5ybmJfb2Zmc2V0ID0gcGctPm9mZjsKKwkJCW5pb2J1Zi0+cm5iX2xlbiA9IHBnLT5jb3VudDsKKwkJCW5pb2J1Zi0+cm5iX2ZsYWdzID0gcGctPmZsYWc7CiAJCX0KIAkJcGdfcHJldiA9IHBnOwogCX0KQEAgLTE0MTgsNiArMTM0NywxMSBAQAogCUlOSVRfTElTVF9IRUFEKCZhYS0+YWFfb2Fwcyk7CiAKIAkqcmVxcCA9IHJlcTsKKwluaW9idWYgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KHBpbGwsICZSTUZfTklPQlVGX1JFTU9URSk7CisJQ0RFQlVHKERfUlBDVFJBQ0UsICJicncgcnBjICVwIC0gb2JqZWN0ICIgRE9TVElEICIgb2Zmc2V0ICVsbGQ8PiVsbGRcbiIsCisJICAgICAgIHJlcSwgUE9TVElEKCZvYS0+b19vaSksIG5pb2J1ZlswXS5ybmJfb2Zmc2V0LAorCSAgICAgICBuaW9idWZbbmlvY291bnQgLSAxXS5ybmJfb2Zmc2V0ICsgbmlvYnVmW25pb2NvdW50IC0gMV0ucm5iX2xlbik7CisKIAlyZXR1cm4gMDsKIAogIG91dDoKQEAgLTE0NjMsNyArMTM5Nyw4IEBACiAJCQkgICBvYS0+b192YWxpZCAmIE9CRF9NRF9GTEZJRCA/IG9hLT5vX3BhcmVudF9vaWQgOiAwLAogCQkJICAgb2EtPm9fdmFsaWQgJiBPQkRfTURfRkxGSUQgPyBvYS0+b19wYXJlbnRfdmVyIDogMCwKIAkJCSAgIFBPU1RJRCgmb2EtPm9fb2kpLCBwZ2FbMF0tPm9mZiwKLQkJCSAgIHBnYVtwYWdlX2NvdW50LTFdLT5vZmYgKyBwZ2FbcGFnZV9jb3VudC0xXS0+Y291bnQgLSAxKTsKKwkJCSAgIHBnYVtwYWdlX2NvdW50IC0gMV0tPm9mZiArCisJCQkgICBwZ2FbcGFnZV9jb3VudCAtIDFdLT5jb3VudCAtIDEpOwogCUNFUlJPUigib3JpZ2luYWwgY2xpZW50IGNzdW0gJXggKHR5cGUgJXgpLCBzZXJ2ZXIgY3N1bSAleCAodHlwZSAleCksIGNsaWVudCBjc3VtIG5vdyAleFxuIiwKIAkgICAgICAgY2xpZW50X2Nrc3VtLCBjbGllbnRfY2tzdW1fdHlwZSwKIAkgICAgICAgc2VydmVyX2Nrc3VtLCBja3N1bV90eXBlLCBuZXdfY2tzdW0pOwpAQCAtMTU2NSw3ICsxNTAwLDggQEAKIAkJY2hhciAqcm91dGVyID0gIiI7CiAJCWVudW0gY2tzdW1fdHlwZSBja3N1bV90eXBlOwogCi0JCWNrc3VtX3R5cGUgPSBja3N1bV90eXBlX3VucGFjayhib2R5LT5vYS5vX3ZhbGlkJk9CRF9NRF9GTEZMQUdTID8KKwkJY2tzdW1fdHlwZSA9IGNrc3VtX3R5cGVfdW5wYWNrKGJvZHktPm9hLm9fdmFsaWQgJgorCQkJCQkgICAgICAgT0JEX01EX0ZMRkxBR1MgPwogCQkJCQkgICAgICAgYm9keS0+b2Eub19mbGFncyA6IDApOwogCQljbGllbnRfY2tzdW0gPSBvc2NfY2hlY2tzdW1fYnVsayhyYywgYWEtPmFhX3BhZ2VfY291bnQsCiAJCQkJCQkgYWEtPmFhX3BwZ2EsIE9TVF9SRUFELApAQCAtMTc5NCw3ICsxNzMwLDggQEAKIAogCQlpZiAobHVzdHJlX21zZ19nZXRfb3BjKHJlcS0+cnFfcmVxbXNnKSA9PSBPU1RfV1JJVEUpIHsKIAkJCXN0cnVjdCBsb3Zfb2luZm8gKmxvaSA9IGNsMm9zYyhvYmopLT5vb19vaW5mbzsKLQkJCWxvZmZfdCBsYXN0X29mZiA9IGxhc3QtPm9hcF9jb3VudCArIGxhc3QtPm9hcF9vYmpfb2ZmOworCQkJbG9mZl90IGxhc3Rfb2ZmID0gbGFzdC0+b2FwX2NvdW50ICsgbGFzdC0+b2FwX29ial9vZmYgKworCQkJCQkgIGxhc3QtPm9hcF9wYWdlX29mZjsKIAogCQkJLyogQ2hhbmdlIGZpbGUgc2l6ZSBpZiB0aGlzIGlzIGFuIG91dCBvZiBxdW90YSBvcgogCQkJICogZGlyZWN0IElPIHdyaXRlIGFuZCBpdCBleHRlbmRzIHRoZSBmaWxlIHNpemUKQEAgLTE4MTIsMTEgKzE3NDksMTQgQEAKIAkJfQogCiAJCWlmICh2YWxpZCAhPSAwKQotCQkJY2xfb2JqZWN0X2F0dHJfc2V0KGVudiwgb2JqLCBhdHRyLCB2YWxpZCk7CisJCQljbF9vYmplY3RfYXR0cl91cGRhdGUoZW52LCBvYmosIGF0dHIsIHZhbGlkKTsKIAkJY2xfb2JqZWN0X2F0dHJfdW5sb2NrKG9iaik7CiAJfQogCWttZW1fY2FjaGVfZnJlZShvYmRvX2NhY2hlcCwgYWEtPmFhX29hKTsKIAorCWlmIChsdXN0cmVfbXNnX2dldF9vcGMocmVxLT5ycV9yZXFtc2cpID09IE9TVF9XUklURSAmJiByYyA9PSAwKQorCQlvc2NfaW5jX3Vuc3RhYmxlX3BhZ2VzKHJlcSk7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXh0LCB0bXAsICZhYS0+YWFfZXh0cywgb2VfbGluaykgewogCQlsaXN0X2RlbF9pbml0KCZleHQtPm9lX2xpbmspOwogCQlvc2NfZXh0ZW50X2ZpbmlzaChlbnYsIGV4dCwgMSwgcmMpOwpAQCAtMTg0NywyMSArMTc4NywyMSBAQAogCiBzdGF0aWMgdm9pZCBicndfY29tbWl0KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKQogewotCXNwaW5fbG9jaygmcmVxLT5ycV9sb2NrKTsKIAkvKgogCSAqIElmIG9zY19pbmNfdW5zdGFibGVfcGFnZXMgKHZpYSBvc2NfZXh0ZW50X2ZpbmlzaCkgcmFjZXMgd2l0aAogCSAqIHRoaXMgY2FsbGVkIHZpYSB0aGUgcnFfY29tbWl0X2NiLCBJIG5lZWQgdG8gZW5zdXJlCiAJICogb3NjX2RlY191bnN0YWJsZV9wYWdlcyBpcyBzdGlsbCBjYWxsZWQuIE90aGVyd2lzZSB1bnN0YWJsZQogCSAqIHBhZ2VzIG1heSBiZSBsZWFrZWQuCiAJICovCi0JaWYgKHJlcS0+cnFfdW5zdGFibGUpIHsKKwlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7CisJaWYgKHVubGlrZWx5KHJlcS0+cnFfdW5zdGFibGUpKSB7CisJCXJlcS0+cnFfdW5zdGFibGUgPSAwOwogCQlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKIAkJb3NjX2RlY191bnN0YWJsZV9wYWdlcyhyZXEpOwotCQlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7CiAJfSBlbHNlIHsKIAkJcmVxLT5ycV9jb21taXR0ZWQgPSAxOworCQlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7CiB9CiAKIC8qKgpAQCAtMTg4MSwxMyArMTgyMSwxMyBAQAogCXN0cnVjdCBvc2NfYXN5bmNfcGFnZSAqdG1wOwogCXN0cnVjdCBjbF9yZXEgKmNsZXJxID0gTlVMTDsKIAllbnVtIGNsX3JlcV90eXBlIGNydCA9IChjbWQgJiBPQkRfQlJXX1dSSVRFKSA/IENSVF9XUklURSA6IENSVF9SRUFEOwotCXN0cnVjdCBsZGxtX2xvY2sgKmxvY2sgPSBOVUxMOwogCXN0cnVjdCBjbF9yZXFfYXR0ciAqY3JhdHRyID0gTlVMTDsKIAl1NjQgc3RhcnRpbmdfb2Zmc2V0ID0gT0JEX09CSkVDVF9FT0Y7CiAJdTY0IGVuZGluZ19vZmZzZXQgPSAwOwogCWludCBtcGZsYWcgPSAwOwogCWludCBtZW1fdGlnaHQgPSAwOwogCWludCBwYWdlX2NvdW50ID0gMDsKKwlib29sIHNvZnRfc3luYyA9IGZhbHNlOwogCWludCBpOwogCWludCByYzsKIAlzdHJ1Y3Qgb3N0X2JvZHkgKmJvZHk7CkBAIC0xOTE1LDYgKzE4NTUsNyBAQAogCQl9CiAJfQogCisJc29mdF9zeW5jID0gb3NjX292ZXJfdW5zdGFibGVfc29mdF9saW1pdChjbGkpOwogCWlmIChtZW1fdGlnaHQpCiAJCW1wZmxhZyA9IGNmc19tZW1vcnlfcHJlc3N1cmVfZ2V0X2FuZF9zZXQoKTsKIApAQCAtMTk0NywxMCArMTg4OCwxMSBAQAogCQkJCXJjID0gUFRSX0VSUihjbGVycSk7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQlsb2NrID0gb2FwLT5vYXBfbGRsbV9sb2NrOwogCQl9CiAJCWlmIChtZW1fdGlnaHQpCiAJCQlvYXAtPm9hcF9icndfZmxhZ3MgfD0gT0JEX0JSV19NRU1BTExPQzsKKwkJaWYgKHNvZnRfc3luYykKKwkJCW9hcC0+b2FwX2Jyd19mbGFncyB8PSBPQkRfQlJXX1NPRlRfU1lOQzsKIAkJcGdhW2ldID0gJm9hcC0+b2FwX2Jyd19wYWdlOwogCQlwZ2FbaV0tPm9mZiA9IG9hcC0+b2FwX29ial9vZmYgKyBvYXAtPm9hcF9wYWdlX29mZjsKIAkJQ0RFQlVHKDAsICJwdXQgcGFnZSAlcCBpbmRleCAlbHUgb2FwICVwIGZsZyAleCB0byBwZ2FcbiIsCkBAIC0xOTY0LDEwICsxOTA2LDYgQEAKIAlMQVNTRVJUKGNsZXJxKTsKIAljcmF0dHItPmNyYV9vYSA9IG9hOwogCWNsX3JlcV9hdHRyX3NldChlbnYsIGNsZXJxLCBjcmF0dHIsIH4wVUxMKTsKLQlpZiAobG9jaykgewotCQlvYS0+b19oYW5kbGUgPSBsb2NrLT5sX3JlbW90ZV9oYW5kbGU7Ci0JCW9hLT5vX3ZhbGlkIHw9IE9CRF9NRF9GTEhBTkRMRTsKLQl9CiAKIAlyYyA9IGNsX3JlcV9wcmVwKGVudiwgY2xlcnEpOwogCWlmIChyYyAhPSAwKSB7CkBAIC0xOTk4LDcgKzE5MzYsNyBAQAogCWJvZHkgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfT1NUX0JPRFkpOwogCWNyYXR0ci0+Y3JhX29hID0gJmJvZHktPm9hOwogCWNsX3JlcV9hdHRyX3NldChlbnYsIGNsZXJxLCBjcmF0dHIsCi0JCQlPQkRfTURfRkxNVElNRXxPQkRfTURfRkxDVElNRXxPQkRfTURfRkxBVElNRSk7CisJCQlPQkRfTURfRkxNVElNRSB8IE9CRF9NRF9GTENUSU1FIHwgT0JEX01EX0ZMQVRJTUUpOwogCiAJbHVzdHJlX21zZ19zZXRfam9iaWQocmVxLT5ycV9yZXFtc2csIGNyYXR0ci0+Y3JhX2pvYmlkKTsKIApAQCAtMjA0NCw3ICsxOTgyLDcgQEAKIAl9CiAJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CiAKLQlERUJVR19SRVEoRF9JTk9ERSwgcmVxLCAiJWQgcGFnZXMsIGFhICVwLiBub3cgJWRyLyVkdyBpbiBmbGlnaHQiLAorCURFQlVHX1JFUShEX0lOT0RFLCByZXEsICIlZCBwYWdlcywgYWEgJXAuIG5vdyAldXIvJWR3IGluIGZsaWdodCIsCiAJCSAgcGFnZV9jb3VudCwgYWEsIGNsaS0+Y2xfcl9pbl9mbGlnaHQsCiAJCSAgY2xpLT5jbF93X2luX2ZsaWdodCk7CiAKQEAgLTIxMTYsMjcgKzIwNTQsNiBAQAogCXJldHVybiBzZXQ7CiB9CiAKLS8qIGZpbmQgYW55IGxkbG0gbG9jayBvZiB0aGUgaW5vZGUgaW4gb3NjCi0gKiByZXR1cm4gMCAgICBub3QgZmluZAotICoJMSAgICBmaW5kIG9uZQotICogICAgICA8IDAgICAgZXJyb3IKLSAqLwotc3RhdGljIGludCBvc2NfZmluZF9jYmRhdGEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKLQkJCSAgIGxkbG1faXRlcmF0b3JfdCByZXBsYWNlLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBsZGxtX3Jlc19pZCByZXNfaWQ7Ci0Jc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IGNsYXNzX2V4cDJvYmQoZXhwKTsKLQlpbnQgcmMgPSAwOwotCi0Jb3N0aWRfYnVpbGRfcmVzX25hbWUoJmxzbS0+bHNtX29pLCAmcmVzX2lkKTsKLQlyYyA9IGxkbG1fcmVzb3VyY2VfaXRlcmF0ZShvYmQtPm9iZF9uYW1lc3BhY2UsICZyZXNfaWQsIHJlcGxhY2UsIGRhdGEpOwotCWlmIChyYyA9PSBMRExNX0lURVJfU1RPUCkKLQkJcmV0dXJuIDE7Ci0JaWYgKHJjID09IExETE1fSVRFUl9DT05USU5VRSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW50IG9zY19lbnF1ZXVlX2Zpbmkoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCiAJCQkgICAgb3NjX2VucXVldWVfdXBjYWxsX2YgdXBjYWxsLCB2b2lkICpjb29raWUsCiAJCQkgICAgc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxvY2toLCBlbnVtIGxkbG1fbW9kZSBtb2RlLApAQCAtMjU4Niw3MSArMjUwMyw2IEBACiAJcmV0dXJuIHJjOwogfQogCi0vKiBSZXRyaWV2ZSBvYmplY3Qgc3RyaXBpbmcgaW5mb3JtYXRpb24uCi0gKgotICogQGxtbXUgaXMgYSBwb2ludGVyIHRvIGFuIGluLWNvcmUgc3RydWN0IHdpdGggbG1tX29zdF9jb3VudCBpbmRpY2F0aW5nCi0gKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgT1NUIGluZGljZXMgd2hpY2ggd2lsbCBmaXQgaW4gdGhlIHVzZXIgYnVmZmVyLgotICogbG1tX21hZ2ljIG11c3QgYmUgTE9WX01BR0lDICh3ZSBvbmx5IHVzZSAxIHNsb3QgaGVyZSkuCi0gKi8KLXN0YXRpYyBpbnQgb3NjX2dldHN0cmlwZShzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLAotCQkJIHN0cnVjdCBsb3ZfdXNlcl9tZCBfX3VzZXIgKmx1bXApCi17Ci0JLyogd2UgdXNlIGxvdl91c2VyX21kX3YzIGJlY2F1c2UgaXQgaXMgbGFyZ2VyIHRoYW4gbG92X3VzZXJfbWRfdjEgKi8KLQlzdHJ1Y3QgbG92X3VzZXJfbWRfdjMgbHVtLCAqbHVtazsKLQlzdHJ1Y3QgbG92X3VzZXJfb3N0X2RhdGFfdjEgKmxtbV9vYmplY3RzOwotCWludCByYyA9IDAsIGx1bV9zaXplOwotCi0JaWYgKCFsc20pCi0JCXJldHVybiAtRU5PREFUQTsKLQotCS8qIHdlIG9ubHkgbmVlZCB0aGUgaGVhZGVyIHBhcnQgZnJvbSB1c2VyIHNwYWNlIHRvIGdldCBsbW1fbWFnaWMgYW5kCi0JICogbG1tX3N0cmlwZV9jb3VudCwgKHRoZSBoZWFkZXIgcGFydCBpcyBjb21tb24gdG8gdjEgYW5kIHYzKQotCSAqLwotCWx1bV9zaXplID0gc2l6ZW9mKHN0cnVjdCBsb3ZfdXNlcl9tZF92MSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZsdW0sIGx1bXAsIGx1bV9zaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoKGx1bS5sbW1fbWFnaWMgIT0gTE9WX1VTRVJfTUFHSUNfVjEpICYmCi0JICAgIChsdW0ubG1tX21hZ2ljICE9IExPVl9VU0VSX01BR0lDX1YzKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBsb3ZfdXNlcl9tZF92WCBhbmQgbG92X21kc19tZF92WCBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSAqLwotCUxBU1NFUlQoc2l6ZW9mKHN0cnVjdCBsb3ZfdXNlcl9tZF92MSkgPT0gc2l6ZW9mKHN0cnVjdCBsb3ZfbWRzX21kX3YxKSk7Ci0JTEFTU0VSVChzaXplb2Yoc3RydWN0IGxvdl91c2VyX21kX3YzKSA9PSBzaXplb2Yoc3RydWN0IGxvdl9tZHNfbWRfdjMpKTsKLQlMQVNTRVJUKHNpemVvZihsdW0ubG1tX29iamVjdHNbMF0pID09IHNpemVvZihsdW1rLT5sbW1fb2JqZWN0c1swXSkpOwotCi0JLyogd2UgY2FuIHVzZSBsb3ZfbWRzX21kX3NpemUoKSB0byBjb21wdXRlIGx1bV9zaXplCi0JICogYmVjYXVzZSBsb3ZfdXNlcl9tZF92WCBhbmQgbG92X21kc19tZF92WCBoYXZlIHRoZSBzYW1lIHNpemUKLQkgKi8KLQlpZiAobHVtLmxtbV9zdHJpcGVfY291bnQgPiAwKSB7Ci0JCWx1bV9zaXplID0gbG92X21kc19tZF9zaXplKGx1bS5sbW1fc3RyaXBlX2NvdW50LCBsdW0ubG1tX21hZ2ljKTsKLQkJbHVtayA9IGt6YWxsb2MobHVtX3NpemUsIEdGUF9OT0ZTKTsKLQkJaWYgKCFsdW1rKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJaWYgKGx1bS5sbW1fbWFnaWMgPT0gTE9WX1VTRVJfTUFHSUNfVjEpCi0JCQlsbW1fb2JqZWN0cyA9Ci0JCQkgICAgJigoKHN0cnVjdCBsb3ZfdXNlcl9tZF92MSAqKWx1bWspLT5sbW1fb2JqZWN0c1swXSk7Ci0JCWVsc2UKLQkJCWxtbV9vYmplY3RzID0gJihsdW1rLT5sbW1fb2JqZWN0c1swXSk7Ci0JCWxtbV9vYmplY3RzLT5sX29zdF9vaSA9IGxzbS0+bHNtX29pOwotCX0gZWxzZSB7Ci0JCWx1bV9zaXplID0gbG92X21kc19tZF9zaXplKDAsIGx1bS5sbW1fbWFnaWMpOwotCQlsdW1rID0gJmx1bTsKLQl9Ci0KLQlsdW1rLT5sbW1fb2kgPSBsc20tPmxzbV9vaTsKLQlsdW1rLT5sbW1fc3RyaXBlX2NvdW50ID0gMTsKLQotCWlmIChjb3B5X3RvX3VzZXIobHVtcCwgbHVtaywgbHVtX3NpemUpKQotCQlyYyA9IC1FRkFVTFQ7Ci0KLQlpZiAobHVtayAhPSAmbHVtKQotCQlrZnJlZShsdW1rKTsKLQotCXJldHVybiByYzsKLX0KLQogc3RhdGljIGludCBvc2NfaW9jb250cm9sKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIGludCBsZW4sCiAJCQkgdm9pZCAqa2FyZywgdm9pZCBfX3VzZXIgKnVhcmcpCiB7CkBAIC0yNjY0LDU3ICsyNTE2LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBPQkRfSU9DX0xPVl9HRVRfQ09ORklHOiB7Ci0JCWNoYXIgKmJ1ZjsKLQkJc3RydWN0IGxvdl9kZXNjICpkZXNjOwotCQlzdHJ1Y3Qgb2JkX3V1aWQgdXVpZDsKLQotCQlidWYgPSBOVUxMOwotCQlsZW4gPSAwOwotCQlpZiAob2JkX2lvY3RsX2dldGRhdGEoJmJ1ZiwgJmxlbiwgdWFyZykpIHsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWRhdGEgPSAoc3RydWN0IG9iZF9pb2N0bF9kYXRhICopYnVmOwotCi0JCWlmIChzaXplb2YoKmRlc2MpID4gZGF0YS0+aW9jX2lubGxlbjEpIHsKLQkJCW9iZF9pb2N0bF9mcmVlZGF0YShidWYsIGxlbik7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAoZGF0YS0+aW9jX2lubGxlbjIgPCBzaXplb2YodXVpZCkpIHsKLQkJCW9iZF9pb2N0bF9mcmVlZGF0YShidWYsIGxlbik7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlkZXNjID0gKHN0cnVjdCBsb3ZfZGVzYyAqKWRhdGEtPmlvY19pbmxidWYxOwotCQlkZXNjLT5sZF90Z3RfY291bnQgPSAxOwotCQlkZXNjLT5sZF9hY3RpdmVfdGd0X2NvdW50ID0gMTsKLQkJZGVzYy0+bGRfZGVmYXVsdF9zdHJpcGVfY291bnQgPSAxOwotCQlkZXNjLT5sZF9kZWZhdWx0X3N0cmlwZV9zaXplID0gMDsKLQkJZGVzYy0+bGRfZGVmYXVsdF9zdHJpcGVfb2Zmc2V0ID0gMDsKLQkJZGVzYy0+bGRfcGF0dGVybiA9IDA7Ci0JCW1lbWNweSgmZGVzYy0+bGRfdXVpZCwgJm9iZC0+b2JkX3V1aWQsIHNpemVvZih1dWlkKSk7Ci0KLQkJbWVtY3B5KGRhdGEtPmlvY19pbmxidWYyLCAmb2JkLT5vYmRfdXVpZCwgc2l6ZW9mKHV1aWQpKTsKLQotCQllcnIgPSBjb3B5X3RvX3VzZXIodWFyZywgYnVmLCBsZW4pOwotCQlpZiAoZXJyKQotCQkJZXJyID0gLUVGQVVMVDsKLQkJb2JkX2lvY3RsX2ZyZWVkYXRhKGJ1ZiwgbGVuKTsKLQkJZ290byBvdXQ7Ci0JfQotCWNhc2UgTExfSU9DX0xPVl9TRVRTVFJJUEU6Ci0JCWVyciA9IG9iZF9hbGxvY19tZW1tZChleHAsIGthcmcpOwotCQlpZiAoZXJyID4gMCkKLQkJCWVyciA9IDA7Ci0JCWdvdG8gb3V0OwotCWNhc2UgTExfSU9DX0xPVl9HRVRTVFJJUEU6Ci0JCWVyciA9IG9zY19nZXRzdHJpcGUoa2FyZywgdWFyZyk7Ci0JCWdvdG8gb3V0OwogCWNhc2UgT0JEX0lPQ19DTElFTlRfUkVDT1ZFUjoKIAkJZXJyID0gcHRscnBjX3JlY292ZXJfaW1wb3J0KG9iZC0+dS5jbGkuY2xfaW1wb3J0LAogCQkJCQkgICAgZGF0YS0+aW9jX2lubGJ1ZjEsIDApOwpAQCAtMjc0OSw1MSArMjU1MCw3IEBACiAJaWYgKCF2YWxsZW4gfHwgIXZhbCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAoS0VZX0lTKEtFWV9MT0NLX1RPX1NUUklQRSkpIHsKLQkJX191MzIgKnN0cmlwZSA9IHZhbDsKLQkJKnZhbGxlbiA9IHNpemVvZigqc3RyaXBlKTsKLQkJKnN0cmlwZSA9IDA7Ci0JCXJldHVybiAwOwotCX0gZWxzZSBpZiAoS0VZX0lTKEtFWV9MQVNUX0lEKSkgewotCQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcTsKLQkJdTY0ICpyZXBseTsKLQkJY2hhciAqdG1wOwotCQlpbnQgcmM7Ci0KLQkJcmVxID0gcHRscnBjX3JlcXVlc3RfYWxsb2MoY2xhc3NfZXhwMmNsaWltcChleHApLAotCQkJCQkgICAmUlFGX09TVF9HRVRfSU5GT19MQVNUX0lEKTsKLQkJaWYgKCFyZXEpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlyZXFfY2Fwc3VsZV9zZXRfc2l6ZSgmcmVxLT5ycV9waWxsLCAmUk1GX1NFVElORk9fS0VZLAotCQkJCSAgICAgUkNMX0NMSUVOVCwga2V5bGVuKTsKLQkJcmMgPSBwdGxycGNfcmVxdWVzdF9wYWNrKHJlcSwgTFVTVFJFX09TVF9WRVJTSU9OLCBPU1RfR0VUX0lORk8pOwotCQlpZiAocmMpIHsKLQkJCXB0bHJwY19yZXF1ZXN0X2ZyZWUocmVxKTsKLQkJCXJldHVybiByYzsKLQkJfQotCi0JCXRtcCA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9TRVRJTkZPX0tFWSk7Ci0JCW1lbWNweSh0bXAsIGtleSwga2V5bGVuKTsKLQotCQlyZXEtPnJxX25vX2RlbGF5ID0gMTsKLQkJcmVxLT5ycV9ub19yZXNlbmQgPSAxOwotCQlwdGxycGNfcmVxdWVzdF9zZXRfcmVwbGVuKHJlcSk7Ci0JCXJjID0gcHRscnBjX3F1ZXVlX3dhaXQocmVxKTsKLQkJaWYgKHJjKQotCQkJZ290byBvdXQ7Ci0KLQkJcmVwbHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfT0JEX0lEKTsKLQkJaWYgKCFyZXBseSkgewotCQkJcmMgPSAtRVBST1RPOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQkqKCh1NjQgKil2YWwpID0gKnJlcGx5Owotb3V0OgotCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7Ci0JCXJldHVybiByYzsKLQl9IGVsc2UgaWYgKEtFWV9JUyhLRVlfRklFTUFQKSkgeworCWlmIChLRVlfSVMoS0VZX0ZJRU1BUCkpIHsKIAkJc3RydWN0IGxsX2ZpZW1hcF9pbmZvX2tleSAqZm1fa2V5ID0ga2V5OwogCQlzdHJ1Y3QgbGRsbV9yZXNfaWQgcmVzX2lkOwogCQlsZGxtX3BvbGljeV9kYXRhX3QgcG9saWN5OwpAQCAtMjkzMSwxMSArMjY4OCwxMSBAQAogCiAJaWYgKEtFWV9JUyhLRVlfQ0FDSEVfTFJVX1NIUklOSykpIHsKIAkJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZvYmQtPnUuY2xpOwotCQlpbnQgbnIgPSBhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkgPj4gMTsKLQkJaW50IHRhcmdldCA9ICooaW50ICopdmFsOworCQlsb25nIG5yID0gYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkgPj4gMTsKKwkJbG9uZyB0YXJnZXQgPSAqKGxvbmcgKil2YWw7CiAKIAkJbnIgPSBvc2NfbHJ1X3NocmluayhlbnYsIGNsaSwgbWluKG5yLCB0YXJnZXQpLCB0cnVlKTsKLQkJKihpbnQgKil2YWwgLT0gbnI7CisJCSoobG9uZyAqKXZhbCAtPSBucjsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zMDE0LDggKzI3NzEsOSBAQAogCQlsb25nIGxvc3RfZ3JhbnQ7CiAKIAkJc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCQlkYXRhLT5vY2RfZ3JhbnQgPSAoY2xpLT5jbF9hdmFpbF9ncmFudCArIGNsaS0+Y2xfZGlydHkpID86Ci0JCQkJMiAqIGNsaV9icndfc2l6ZShvYmQpOworCQlkYXRhLT5vY2RfZ3JhbnQgPSAoY2xpLT5jbF9hdmFpbF9ncmFudCArCisJCQkJICAgKGNsaS0+Y2xfZGlydHlfcGFnZXMgPDwgUEFHRV9TSElGVCkpID86CisJCQkJICAgMiAqIGNsaV9icndfc2l6ZShvYmQpOwogCQlsb3N0X2dyYW50ID0gY2xpLT5jbF9sb3N0X2dyYW50OwogCQljbGktPmNsX2xvc3RfZ3JhbnQgPSAwOwogCQlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKQEAgLTMzNDYsNyArMzEwNCw2IEBACiAJLmRpc2Nvbm5lY3QgICAgID0gb3NjX2Rpc2Nvbm5lY3QsCiAJLnN0YXRmcyAgICAgICAgID0gb3NjX3N0YXRmcywKIAkuc3RhdGZzX2FzeW5jICAgPSBvc2Nfc3RhdGZzX2FzeW5jLAotCS5wYWNrbWQgICAgICAgICA9IG9zY19wYWNrbWQsCiAJLnVucGFja21kICAgICAgID0gb3NjX3VucGFja21kLAogCS5jcmVhdGUgICAgICAgICA9IG9zY19jcmVhdGUsCiAJLmRlc3Ryb3kgICAgICAgID0gb3NjX2Rlc3Ryb3ksCkBAIC0zMzU0LDcgKzMxMTEsNiBAQAogCS5nZXRhdHRyX2FzeW5jICA9IG9zY19nZXRhdHRyX2FzeW5jLAogCS5zZXRhdHRyICAgICAgICA9IG9zY19zZXRhdHRyLAogCS5zZXRhdHRyX2FzeW5jICA9IG9zY19zZXRhdHRyX2FzeW5jLAotCS5maW5kX2NiZGF0YSAgICA9IG9zY19maW5kX2NiZGF0YSwKIAkuaW9jb250cm9sICAgICAgPSBvc2NfaW9jb250cm9sLAogCS5nZXRfaW5mbyAgICAgICA9IG9zY19nZXRfaW5mbywKIAkuc2V0X2luZm9fYXN5bmMgPSBvc2Nfc2V0X2luZm9fYXN5bmMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY2xpZW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY2xpZW50LmMKaW5kZXggZDQ0NjNkNy4uOGM1MWQ1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2NsaWVudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jbGllbnQuYwpAQCAtNDUsNiArNDUsNyBAQAogCiBzdGF0aWMgaW50IHB0bHJwY19zZW5kX25ld19yZXEoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpOwogc3RhdGljIGludCBwdGxycGNkX2NoZWNrX3dvcmsoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpOworc3RhdGljIGludCBwdGxycGNfdW5yZWdpc3Rlcl9yZXBseShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QsIGludCBhc3luYyk7CiAKIC8qKgogICogSW5pdGlhbGl6ZSBwYXNzZWQgaW4gY2xpZW50IHN0cnVjdHVyZSBcYSBjbC4KQEAgLTg5LDcgKzkwLDYgQEAKIAogCXJldHVybiBjOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfdXVpZF90b19jb25uZWN0aW9uKTsKIAogLyoqCiAgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBuZXcgYnVsayBkZXNjcmlwdG9yIG9uIHRoZSBzZW5kZXIuCkBAIC0yMDIsNyArMjAyLDcgQEAKIAogCWlmICh1bnBpbikgewogCQlmb3IgKGkgPSAwOyBpIDwgZGVzYy0+YmRfaW92X2NvdW50OyBpKyspCi0JCQlwdXRfcGFnZShkZXNjLT5iZF9pb3ZbaV0ua2lvdl9wYWdlKTsKKwkJCXB1dF9wYWdlKGRlc2MtPmJkX2lvdltpXS5idl9wYWdlKTsKIAl9CiAKIAlrZnJlZShkZXNjKTsKQEAgLTI4Myw4ICsyODMsOCBAQAogfQogCiAvKiBBZGp1c3QgZXhwZWN0ZWQgbmV0d29yayBsYXRlbmN5ICovCi1zdGF0aWMgdm9pZCBwdGxycGNfYXRfYWRqX25ldF9sYXRlbmN5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBzZXJ2aWNlX3RpbWUpCit2b2lkIHB0bHJwY19hdF9hZGpfbmV0X2xhdGVuY3koc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHNlcnZpY2VfdGltZSkKIHsKIAl1bnNpZ25lZCBpbnQgbmwsIG9sZG5sOwogCXN0cnVjdCBpbXBfYXQgKmF0OwpAQCAtMzY0LDMxICszNjQsMzcgQEAKIAl9CiAKIAlyYyA9IHVucGFja19yZXBseShlYXJseV9yZXEpOwotCWlmIChyYyA9PSAwKSB7Ci0JCS8qIEV4cGVjdGluZyB0byBpbmNyZWFzZSB0aGUgc2VydmljZSB0aW1lIGVzdGltYXRlIGhlcmUgKi8KLQkJcHRscnBjX2F0X2Fkal9zZXJ2aWNlKHJlcSwKLQkJCWx1c3RyZV9tc2dfZ2V0X3RpbWVvdXQoZWFybHlfcmVxLT5ycV9yZXBtc2cpKTsKLQkJcHRscnBjX2F0X2Fkal9uZXRfbGF0ZW5jeShyZXEsCi0JCQlsdXN0cmVfbXNnX2dldF9zZXJ2aWNlX3RpbWUoZWFybHlfcmVxLT5ycV9yZXBtc2cpKTsKLQl9Ci0KLQlzcHRscnBjX2NsaV9maW5pc2hfZWFybHlfcmVwbHkoZWFybHlfcmVxKTsKLQotCWlmIChyYyAhPSAwKSB7CisJaWYgKHJjKSB7CisJCXNwdGxycGNfY2xpX2ZpbmlzaF9lYXJseV9yZXBseShlYXJseV9yZXEpOwogCQlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7CiAJCXJldHVybiByYzsKIAl9CiAKLQkvKiBBZGp1c3QgdGhlIGxvY2FsIHRpbWVvdXQgZm9yIHRoaXMgcmVxICovCi0JcHRscnBjX2F0X3NldF9yZXFfdGltZW91dChyZXEpOworCS8qCisJICogVXNlIG5ldyB0aW1lb3V0IHZhbHVlIGp1c3QgdG8gYWRqdXN0IHRoZSBsb2NhbCB2YWx1ZSBmb3IgdGhpcworCSAqIHJlcXVlc3QsIGRvbid0IGluY2x1ZGUgaXQgaW50byBhdF9oaXN0b3J5LiBJdCBpcyB1bmNsZWFyIHlldCB3aHkKKwkgKiBzZXJ2aWNlIHRpbWUgaW5jcmVhc2VkIGFuZCBzaG91bGQgaXQgYmUgY291bnRlZCBvciBza2lwcGVkLCBlLmcuCisJICogdGhhdCBjYW4gYmUgcmVjb3ZlcnkgY2FzZSBvciBzb21lIGVycm9yIG9yIHNlcnZlciwgdGhlIHJlYWwgcmVwbHkKKwkgKiB3aWxsIGFkZCBhbGwgbmV3IGRhdGEgaWYgaXQgaXMgd29ydGggdG8gYWRkLgorCSAqLworCXJlcS0+cnFfdGltZW91dCA9IGx1c3RyZV9tc2dfZ2V0X3RpbWVvdXQoZWFybHlfcmVxLT5ycV9yZXBtc2cpOworCWx1c3RyZV9tc2dfc2V0X3RpbWVvdXQocmVxLT5ycV9yZXFtc2csIHJlcS0+cnFfdGltZW91dCk7CisKKwkvKiBOZXR3b3JrIGxhdGVuY3kgY2FuIGJlIGFkanVzdGVkLCBpdCBpcyBwdXJlIG5ldHdvcmsgZGVsYXlzICovCisJcHRscnBjX2F0X2Fkal9uZXRfbGF0ZW5jeShyZXEsCisJCQkJICBsdXN0cmVfbXNnX2dldF9zZXJ2aWNlX3RpbWUoZWFybHlfcmVxLT5ycV9yZXBtc2cpKTsKKworCXNwdGxycGNfY2xpX2ZpbmlzaF9lYXJseV9yZXBseShlYXJseV9yZXEpOwogCiAJc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOwogCW9sZGRsID0gcmVxLT5ycV9kZWFkbGluZTsKIAkvKgotCSAqIHNlcnZlciBhc3N1bWVzIGl0IG5vdyBoYXMgcnFfdGltZW91dCBmcm9tIHdoZW4gaXQgc2VudCB0aGUKLQkgKiBlYXJseSByZXBseSwgc28gY2xpZW50IHNob3VsZCBnaXZlIGl0IGF0IGxlYXN0IHRoYXQgbG9uZy4KKwkgKiBzZXJ2ZXIgYXNzdW1lcyBpdCBub3cgaGFzIHJxX3RpbWVvdXQgZnJvbSB3aGVuIHRoZSByZXF1ZXN0CisJICogYXJyaXZlZCwgc28gdGhlIGNsaWVudCBzaG91bGQgZ2l2ZSBpdCBhdCBsZWFzdCB0aGF0IGxvbmcuCisJICogc2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgYXJyaXZhbCB0aW1lIHdlJ2xsIHVzZSB0aGUgb3JpZ2luYWwKKwkgKiBzZW50IHRpbWUKIAkgKi8KLQlyZXEtPnJxX2RlYWRsaW5lID0ga3RpbWVfZ2V0X3JlYWxfc2Vjb25kcygpICsgcmVxLT5ycV90aW1lb3V0ICsKKwlyZXEtPnJxX2RlYWRsaW5lID0gcmVxLT5ycV9zZW50ICsgcmVxLT5ycV90aW1lb3V0ICsKIAkJCSAgIHB0bHJwY19hdF9nZXRfbmV0X2xhdGVuY3kocmVxKTsKIAogCURFQlVHX1JFUShEX0FEQVBUVE8sIHJlcSwKQEAgLTg4NCw3ICs4OTAsNiBAQAogCiAJcmV0dXJuIHNldDsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX3ByZXBfZmNzZXQpOwogCiAvKioKICAqIFdpbmQgZG93biBhbmQgZnJlZSByZXF1ZXN0IHNldCBzdHJ1Y3R1cmUgcHJldmlvdXNseSBhbGxvY2F0ZWQgd2l0aApAQCAtMTAwNCw3ICsxMDA5LDYgQEAKIAkJCXdha2VfdXAoJnBjLT5wY19wYXJ0bmVyc1tpXS0+cGNfc2V0LT5zZXRfd2FpdHEpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX3NldF9hZGRfbmV3X3JlcSk7CiAKIC8qKgogICogQmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGltcG9ydCwgZGV0ZXJtaW5lIGlmIHRoZSByZXF1ZXN0CkBAIC0xMDM1LDggKzEwMzksOCBAQAogCQkqc3RhdHVzID0gLUVJTzsKIAl9IGVsc2UgaWYgKHB0bHJwY19zZW5kX2xpbWl0X2V4cGlyZWQocmVxKSkgewogCQkvKiBwcm9iYWJseSBkb2Vzbid0IG5lZWQgdG8gYmUgYSBEX0VSUk9SIGFmdGVyIGluaXRpYWwgdGVzdGluZyAqLwotCQlERUJVR19SRVEoRF9FUlJPUiwgcmVxLCAic2VuZCBsaW1pdCBleHBpcmVkICIpOwotCQkqc3RhdHVzID0gLUVJTzsKKwkJREVCVUdfUkVRKERfSEEsIHJlcSwgInNlbmQgbGltaXQgZXhwaXJlZCAiKTsKKwkJKnN0YXR1cyA9IC1FVElNRURPVVQ7CiAJfSBlbHNlIGlmIChyZXEtPnJxX3NlbmRfc3RhdGUgPT0gTFVTVFJFX0lNUF9DT05ORUNUSU5HICYmCiAJCSAgIGltcC0+aW1wX3N0YXRlID09IExVU1RSRV9JTVBfQ09OTkVDVElORykgewogCQkvKiBhbGxvdyBDT05ORUNUIGV2ZW4gaWYgaW1wb3J0IGlzIGludmFsaWQgKi8KQEAgLTEwNzMsMzYgKzEwNzcsNDIgQEAKIH0KIAogLyoqCi0gKiBEZWNpZGUgaWYgdGhlIGVycm9yIG1lc3NhZ2UgcmVnYXJkaW5nIHByb3ZpZGVkIHJlcXVlc3QgXGEgcmVxCi0gKiBzaG91bGQgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSBvciBub3QuCi0gKiBNYWtlcyBpdCdzIGRlY2lzaW9uIG9uIHJlcXVlc3Qgc3RhdHVzIGFuZCBvdGhlciBwcm9wZXJ0aWVzLgotICogUmV0dXJucyAxIHRvIHByaW50IGVycm9yIG9uIHRoZSBzeXN0ZW0gY29uc29sZSBvciAwIGlmIG5vdC4KKyAqIERlY2lkZSBpZiB0aGUgZXJyb3IgbWVzc2FnZSBzaG91bGQgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSBvciBub3QuCisgKiBNYWtlcyBpdHMgZGVjaXNpb24gYmFzZWQgb24gcmVxdWVzdCB0eXBlLCBzdGF0dXMsIGFuZCBmYWlsdXJlIGZyZXF1ZW5jeS4KKyAqCisgKiBccGFyYW1baW5dIHJlcSAgcmVxdWVzdCB0aGF0IGZhaWxlZCBhbmQgbWF5IG5lZWQgYSBjb25zb2xlIG1lc3NhZ2UKKyAqCisgKiBccmV0dmFsIGZhbHNlIGlmIG5vIG1lc3NhZ2Ugc2hvdWxkIGJlIHByaW50ZWQKKyAqIFxyZXR2YWwgdHJ1ZSAgaWYgY29uc29sZSBtZXNzYWdlIHNob3VsZCBiZSBwcmludGVkCiAgKi8KLXN0YXRpYyBpbnQgcHRscnBjX2NvbnNvbGVfYWxsb3coc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCitzdGF0aWMgYm9vbCBwdGxycGNfY29uc29sZV9hbGxvdyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKIHsKIAlfX3UzMiBvcGM7Ci0JaW50IGVycjsKIAogCUxBU1NFUlQocmVxLT5ycV9yZXFtc2cpOwogCW9wYyA9IGx1c3RyZV9tc2dfZ2V0X29wYyhyZXEtPnJxX3JlcW1zZyk7CiAKLQkvKgotCSAqIFN1cHByZXNzIHBhcnRpY3VsYXIgcmVjb25uZWN0IGVycm9ycyB3aGljaCBhcmUgdG8gYmUgZXhwZWN0ZWQuICBObwotCSAqIGVycm9ycyBhcmUgc3VwcHJlc3NlZCBmb3IgdGhlIGluaXRpYWwgY29ubmVjdGlvbiBvbiBhbiBpbXBvcnQKLQkgKi8KLQlpZiAoKGx1c3RyZV9oYW5kbGVfaXNfdXNlZCgmcmVxLT5ycV9pbXBvcnQtPmltcF9yZW1vdGVfaGFuZGxlKSkgJiYKLQkgICAgKG9wYyA9PSBPU1RfQ09OTkVDVCB8fCBvcGMgPT0gTURTX0NPTk5FQ1QgfHwgb3BjID09IE1HU19DT05ORUNUKSkgewotCQkvKiBTdXBwcmVzcyB0aW1lZCBvdXQgcmVjb25uZWN0IHJlcXVlc3RzICovCi0JCWlmIChyZXEtPnJxX3RpbWVkb3V0KQotCQkJcmV0dXJuIDA7CisJLyogU3VwcHJlc3MgcGFydGljdWxhciByZWNvbm5lY3QgZXJyb3JzIHdoaWNoIGFyZSB0byBiZSBleHBlY3RlZC4gKi8KKwlpZiAob3BjID09IE9TVF9DT05ORUNUIHx8IG9wYyA9PSBNRFNfQ09OTkVDVCB8fCBvcGMgPT0gTUdTX0NPTk5FQ1QpIHsKKwkJaW50IGVycjsKIAotCQkvKiBTdXBwcmVzcyB1bmF2YWlsYWJsZS9hZ2FpbiByZWNvbm5lY3QgcmVxdWVzdHMgKi8KKwkJLyogU3VwcHJlc3MgdGltZWQgb3V0IHJlY29ubmVjdCByZXF1ZXN0cyAqLworCQlpZiAobHVzdHJlX2hhbmRsZV9pc191c2VkKCZyZXEtPnJxX2ltcG9ydC0+aW1wX3JlbW90ZV9oYW5kbGUpIHx8CisJCSAgICByZXEtPnJxX3RpbWVkb3V0KQorCQkJcmV0dXJuIGZhbHNlOworCisJCS8qCisJCSAqIFN1cHByZXNzIG1vc3QgdW5hdmFpbGFibGUvYWdhaW4gcmVjb25uZWN0IHJlcXVlc3RzLCBidXQKKwkJICogcHJpbnQgb2NjYXNpb25hbGx5IHNvIGl0IGlzIGNsZWFyIGNsaWVudCBpcyB0cnlpbmcgdG8KKwkJICogY29ubmVjdCB0byBhIHNlcnZlciB3aGVyZSBubyB0YXJnZXQgaXMgcnVubmluZy4KKwkJICovCiAJCWVyciA9IGx1c3RyZV9tc2dfZ2V0X3N0YXR1cyhyZXEtPnJxX3JlcG1zZyk7Ci0JCWlmIChlcnIgPT0gLUVOT0RFViB8fCBlcnIgPT0gLUVBR0FJTikKLQkJCXJldHVybiAwOworCQlpZiAoKGVyciA9PSAtRU5PREVWIHx8IGVyciA9PSAtRUFHQUlOKSAmJgorCQkgICAgcmVxLT5ycV9pbXBvcnQtPmltcF9jb25uX2NudCAlIDMwICE9IDIwKQorCQkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXJldHVybiAxOworCXJldHVybiB0cnVlOwogfQogCiAvKioKQEAgLTExMTYsMTQgKzExMjYsMTQgQEAKIAllcnIgPSBsdXN0cmVfbXNnX2dldF9zdGF0dXMocmVxLT5ycV9yZXBtc2cpOwogCWlmIChsdXN0cmVfbXNnX2dldF90eXBlKHJlcS0+cnFfcmVwbXNnKSA9PSBQVExfUlBDX01TR19FUlIpIHsKIAkJc3RydWN0IG9iZF9pbXBvcnQgKmltcCA9IHJlcS0+cnFfaW1wb3J0OworCQlsbmV0X25pZF90IG5pZCA9IGltcC0+aW1wX2Nvbm5lY3Rpb24tPmNfcGVlci5uaWQ7CiAJCV9fdTMyIG9wYyA9IGx1c3RyZV9tc2dfZ2V0X29wYyhyZXEtPnJxX3JlcW1zZyk7CiAKIAkJaWYgKHB0bHJwY19jb25zb2xlX2FsbG93KHJlcSkpCi0JCQlMQ09OU09MRV9FUlJPUl9NU0coMHgwMTEsICIlczogQ29tbXVuaWNhdGluZyB3aXRoICVzLCBvcGVyYXRpb24gJXMgZmFpbGVkIHdpdGggJWQuXG4iLAorCQkJTENPTlNPTEVfRVJST1JfTVNHKDB4MDExLCAiJXM6IG9wZXJhdGlvbiAlcyB0byBub2RlICVzIGZhaWxlZDogcmMgPSAlZFxuIiwKIAkJCQkJICAgaW1wLT5pbXBfb2JkLT5vYmRfbmFtZSwKLQkJCQkJICAgbGliY2ZzX25pZDJzdHIoCi0JCQkJCQkgICBpbXAtPmltcF9jb25uZWN0aW9uLT5jX3BlZXIubmlkKSwKLQkJCQkJICAgbGxfb3Bjb2RlMnN0cihvcGMpLCBlcnIpOworCQkJCQkgICBsbF9vcGNvZGUyc3RyKG9wYyksCisJCQkJCSAgIGxpYmNmc19uaWQyc3RyKG5pZCksIGVycik7CiAJCXJldHVybiBlcnIgPCAwID8gZXJyIDogLUVJTlZBTDsKIAl9CiAKQEAgLTEyODAsNyArMTI5MCw3IEBACiAJCSAqIHNvbWUgcmVhc29uLiBUcnkgdG8gcmVjb25uZWN0LCBhbmQgaWYgdGhhdCBmYWlscywgcHVudCB0bwogCQkgKiB0aGUgdXBjYWxsLgogCQkgKi8KLQkJaWYgKGxsX3JwY19yZWNvdmVyYWJsZV9lcnJvcihyYykpIHsKKwkJaWYgKHB0bHJwY19yZWNvdmVyYWJsZV9lcnJvcihyYykpIHsKIAkJCWlmIChyZXEtPnJxX3NlbmRfc3RhdGUgIT0gTFVTVFJFX0lNUF9GVUxMIHx8CiAJCQkgICAgaW1wLT5pbXBfb2JkLT5vYmRfbm9fcmVjb3YgfHwgaW1wLT5pbXBfZGxtX2Zha2UpIHsKIAkJCQlyZXR1cm4gcmM7CkBAIC0xNjI4LDggKzE2MzgsMTAgQEAKIAkJCSAgICByZXEtPnJxX3dhaXRpbmcgfHwgcmVxLT5ycV93YWl0X2N0eCkgewogCQkJCWludCBzdGF0dXM7CiAKLQkJCQlpZiAoIXB0bHJwY191bnJlZ2lzdGVyX3JlcGx5KHJlcSwgMSkpCisJCQkJaWYgKCFwdGxycGNfdW5yZWdpc3Rlcl9yZXBseShyZXEsIDEpKSB7CisJCQkJCXB0bHJwY191bnJlZ2lzdGVyX2J1bGsocmVxLCAxKTsKIAkJCQkJY29udGludWU7CisJCQkJfQogCiAJCQkJc3Bpbl9sb2NrKCZpbXAtPmltcF9sb2NrKTsKIAkJCQlpZiAocHRscnBjX2ltcG9ydF9kZWxheV9yZXEoaW1wLCByZXEsCkBAIC0xOTk1LDcgKzIwMDcsNiBAQAogCSAqLwogCXJldHVybiAxOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfZXhwaXJlZF9zZXQpOwogCiAvKioKICAqIFNldHMgcnFfaW50ciBmbGFnIGluIFxhIHJlcSB1bmRlciBzcGlubG9jay4KQEAgLTIwMTIsNyArMjAyMyw3IEBACiAgKiBJbnRlcnJ1cHRzIChzZXRzIGludGVycnVwdGVkIGZsYWcpIGFsbCB1bmNvbXBsZXRlZCByZXF1ZXN0cyBpbgogICogYSBzZXQgXGEgZGF0YS4gQ2FsbGJhY2sgZm9yIGxfd2FpdF9ldmVudCBmb3IgaW50ZXJydXB0aWJsZSB3YWl0cy4KICAqLwotdm9pZCBwdGxycGNfaW50ZXJydXB0ZWRfc2V0KHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBwdGxycGNfaW50ZXJydXB0ZWRfc2V0KHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0X3NldCAqc2V0ID0gZGF0YTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CkBAIC0yMDMwLDcgKzIwNDEsNiBAQAogCQlwdGxycGNfbWFya19pbnRlcnJ1cHRlZChyZXEpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX2ludGVycnVwdGVkX3NldCk7CiAKIC8qKgogICogR2V0IHRoZSBzbWFsbGVzdCB0aW1lb3V0IGluIHRoZSBzZXQ7IHRoaXMgZG9lcyBOT1Qgc2V0IGEgdGltZW91dC4KQEAgLTIwNzQsNyArMjA4NCw2IEBACiAJfQogCXJldHVybiB0aW1lb3V0OwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfc2V0X25leHRfdGltZW91dCk7CiAKIC8qKgogICogU2VuZCBhbGwgdW5zZXQgcmVxdWVzdCBmcm9tIHRoZSBzZXQgYW5kIHRoZW4gd2FpdCB1bnRpbCBhbGwKQEAgLTIzMjUsNyArMjMzNCw3IEBACiAgKiBUaGUgcmVxdWVzdCBvd25lciAoaS5lLiB0aGUgdGhyZWFkIGRvaW5nIHRoZSBJL08pIG11c3QgY2FsbC4uLgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgMSBpZiB1bnJlZ2lzdGVyaW5nIGNhbm5vdCBiZSBtYWRlLgogICovCi1pbnQgcHRscnBjX3VucmVnaXN0ZXJfcmVwbHkoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgYXN5bmMpCitzdGF0aWMgaW50IHB0bHJwY191bnJlZ2lzdGVyX3JlcGx5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdCwgaW50IGFzeW5jKQogewogCWludCByYzsKIAl3YWl0X3F1ZXVlX2hlYWRfdCAqd3E7CkBAIC0yMzkwLDcgKzIzOTksNiBAQAogCX0KIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX3VucmVnaXN0ZXJfcmVwbHkpOwogCiBzdGF0aWMgdm9pZCBwdGxycGNfZnJlZV9yZXF1ZXN0KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKQogewpAQCAtMjQ1MSw3ICsyNDU5LDggQEAKIAkgICAgICAgaW1wLT5pbXBfb2JkLT5vYmRfbmFtZSwgaW1wLT5pbXBfcGVlcl9jb21taXR0ZWRfdHJhbnNubywKIAkgICAgICAgaW1wLT5pbXBfZ2VuZXJhdGlvbik7CiAKLQlpZiAoaW1wLT5pbXBfZ2VuZXJhdGlvbiAhPSBpbXAtPmltcF9sYXN0X2dlbmVyYXRpb25fY2hlY2tlZCkKKwlpZiAoaW1wLT5pbXBfZ2VuZXJhdGlvbiAhPSBpbXAtPmltcF9sYXN0X2dlbmVyYXRpb25fY2hlY2tlZCB8fAorCSAgICAhaW1wLT5pbXBfbGFzdF90cmFuc25vX2NoZWNrZWQpCiAJCXNraXBfY29tbWl0dGVkX2xpc3QgPSBmYWxzZTsKIAogCWltcC0+aW1wX2xhc3RfdHJhbnNub19jaGVja2VkID0gaW1wLT5pbXBfcGVlcl9jb21taXR0ZWRfdHJhbnNubzsKQEAgLTI0OTksNiArMjUwOCw5IEBACiAJCWlmIChyZXEtPnJxX2ltcG9ydF9nZW5lcmF0aW9uIDwgaW1wLT5pbXBfZ2VuZXJhdGlvbikgewogCQkJREVCVUdfUkVRKERfUlBDVFJBQ0UsIHJlcSwgImZyZWUgc3RhbGUgb3BlbiByZXF1ZXN0Iik7CiAJCQlwdGxycGNfZnJlZV9yZXF1ZXN0KHJlcSk7CisJCX0gZWxzZSBpZiAoIXJlcS0+cnFfcmVwbGF5KSB7CisJCQlERUJVR19SRVEoRF9SUENUUkFDRSwgcmVxLCAiZnJlZSBjbG9zZWQgb3BlbiByZXF1ZXN0Iik7CisJCQlwdGxycGNfZnJlZV9yZXF1ZXN0KHJlcSk7CiAJCX0KIAl9CiB9CkBAIC0yNTQxLDcgKzI1NTMsNiBAQAogCXB0bHJwY19jbGllbnRfd2FrZV9yZXEocmVxKTsKIAlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX3Jlc2VuZF9yZXEpOwogCiAvKioKICAqIEdyYWIgYWRkaXRpb25hbCByZWZlcmVuY2Ugb24gYSByZXF1ZXN0IFxhIHJlcQpAQCAtMjYxMCw3ICsyNjIxLDYgQEAKIAogCWxpc3RfYWRkKCZyZXEtPnJxX3JlcGxheV9saXN0LCAmaW1wLT5pbXBfcmVwbGF5X2xpc3QpOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfcmV0YWluX3JlcGxheWFibGVfcmVxdWVzdCk7CiAKIC8qKgogICogU2VuZCByZXF1ZXN0IGFuZCB3YWl0IHVudGlsIGl0IGNvbXBsZXRlcy4KQEAgLTI3ODMsNyArMjc5Myw2IEBACiAJcHRscnBjZF9hZGRfcmVxKHJlcSk7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19yZXBsYXlfcmVxKTsKIAogLyoqCiAgKiBBYm9ydHMgYWxsIGluLWZsaWdodCByZXF1ZXN0IG9uIGltcG9ydCBcYSBpbXAgc2VuZGluZyBhbmQgZGVsYXllZCBsaXN0cwpAQCAtMjg0Myw3ICsyODUyLDYgQEAKIAogCXNwaW5fdW5sb2NrKCZpbXAtPmltcF9sb2NrKTsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX2Fib3J0X2luZmxpZ2h0KTsKIAogLyoqCiAgKiBBYm9ydCBhbGwgdW5jb21wbGV0ZWQgcmVxdWVzdHMgaW4gcmVxdWVzdCBzZXQgXGEgc2V0CkBAIC0yOTI5LDcgKzI5MzcsNiBAQAogCiAJcmV0dXJuIG5leHQ7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19uZXh0X3hpZCk7CiAKIC8qKgogICogR2V0IGEgZ2xpbXBzZSBhdCB3aGF0IG5leHQgeGlkIHZhbHVlIG1pZ2h0IGhhdmUgYmVlbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jb25uZWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY29ubmVjdGlvbi5jCmluZGV4IDE3N2EzNzkuLjdiMDIwZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jb25uZWN0aW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2Nvbm5lY3Rpb24uYwpAQCAtODIsNyArODIsNiBAQAogCSAgICAgICBsaWJjZnNfbmlkMnN0cihjb25uLT5jX3BlZXIubmlkKSk7CiAJcmV0dXJuIGNvbm47CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19jb25uZWN0aW9uX2dldCk7CiAKIGludCBwdGxycGNfY29ubmVjdGlvbl9wdXQoc3RydWN0IHB0bHJwY19jb25uZWN0aW9uICpjb25uKQogewpAQCAtMTE4LDcgKzExNyw2IEBACiAKIAlyZXR1cm4gcmM7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19jb25uZWN0aW9uX3B1dCk7CiAKIHN0cnVjdCBwdGxycGNfY29ubmVjdGlvbiAqCiBwdGxycGNfY29ubmVjdGlvbl9hZGRyZWYoc3RydWN0IHB0bHJwY19jb25uZWN0aW9uICpjb25uKQpAQCAtMTMwLDcgKzEyOCw2IEBACiAKIAlyZXR1cm4gY29ubjsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX2Nvbm5lY3Rpb25fYWRkcmVmKTsKIAogaW50IHB0bHJwY19jb25uZWN0aW9uX2luaXQodm9pZCkKIHsKQEAgLTE0NiwxMyArMTQzLDExIEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX2Nvbm5lY3Rpb25faW5pdCk7CiAKIHZvaWQgcHRscnBjX2Nvbm5lY3Rpb25fZmluaSh2b2lkKQogewogCWNmc19oYXNoX3B1dHJlZihjb25uX2hhc2gpOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfY29ubmVjdGlvbl9maW5pKTsKIAogLyoKICAqIEhhc2ggb3BlcmF0aW9ucyBmb3IgbmV0X3BlZXI8LT5jb25uZWN0aW9uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZXZlbnRzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZXZlbnRzLmMKaW5kZXggYjFjZTcyNS4uMjgzZGZiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2V2ZW50cy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9ldmVudHMuYwpAQCAtNTQzLDcgKzU0Myw3IEBACiAJcmMgPSBMTmV0TklJbml0KHBpZCk7CiAJaWYgKHJjIDwgMCkgewogCQlDREVCVUcoRF9ORVQsICJDYW4ndCBpbml0IG5ldHdvcmsgaW50ZXJmYWNlOiAlZFxuIiwgcmMpOwotCQlyZXR1cm4gLUVOT0VOVDsKKwkJcmV0dXJuIHJjOwogCX0KIAogCS8qIENBVkVBVCBFTVBUT1I6IGhvdyB3ZSBwcm9jZXNzIHBvcnRhbHMgZXZlbnRzIGlzIF9yYWRpY2FsbHlfCkBAIC01NjEsNyArNTYxLDcgQEAKIAlDRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBldmVudCBxdWV1ZTogJWRcbiIsIHJjKTsKIAlMTmV0TklGaW5pKCk7CiAKLQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gcmM7CiB9CiAKIGludCBwdGxycGNfaW5pdF9wb3J0YWxzKHZvaWQpCkBAIC01NzAsNyArNTcwLDcgQEAKIAogCWlmIChyYyAhPSAwKSB7CiAJCUNFUlJPUigibmV0d29yayBpbml0aWFsaXNhdGlvbiBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIHJjOwogCX0KIAlyYyA9IHB0bHJwY2RfYWRkcmVmKCk7CiAJaWYgKHJjID09IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvaW1wb3J0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvaW1wb3J0LmMKaW5kZXggMzI5MmU2ZS4uYTIzZDBhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2ltcG9ydC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9pbXBvcnQuYwpAQCAtMzA3LDcgKzMwNyw4IEBACiAJCSAqLwogCQlsd2kgPSBMV0lfVElNRU9VVF9JTlRFUlZBTCgKIAkJCWNmc190aW1lb3V0X2NhcChjZnNfdGltZV9zZWNvbmRzKHRpbWVvdXQpKSwKLQkJCSh0aW1lb3V0ID4gMSk/Y2ZzX3RpbWVfc2Vjb25kcygxKTpjZnNfdGltZV9zZWNvbmRzKDEpLzIsCisJCQkodGltZW91dCA+IDEpID8gY2ZzX3RpbWVfc2Vjb25kcygxKSA6CisJCQljZnNfdGltZV9zZWNvbmRzKDEpIC8gMiwKIAkJCU5VTEwsIE5VTEwpOwogCQlyYyA9IGxfd2FpdF9ldmVudChpbXAtPmltcF9yZWNvdmVyeV93YWl0cSwKIAkJCQkgIChhdG9taWNfcmVhZCgmaW1wLT5pbXBfaW5mbGlnaHQpID09IDApLApAQCAtNDI0LDcgKzQyNSw2IEBACiAJCXB0bHJwY19waW5nZXJfZm9yY2UoaW1wKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19mYWlsX2ltcG9ydCk7CiAKIGludCBwdGxycGNfcmVjb25uZWN0X2ltcG9ydChzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wKQogewpAQCAtNjk4LDcgKzY5OCw4IEBACiAJcmVxdWVzdC0+cnFfc2VuZF9zdGF0ZSA9IExVU1RSRV9JTVBfQ09OTkVDVElORzsKIAkvKiBBbGxvdyBhIHNsaWdodGx5IGxhcmdlciByZXBseSBmb3IgZnV0dXJlIGdyb3d0aCBjb21wYXRpYmlsaXR5ICovCiAJcmVxX2NhcHN1bGVfc2V0X3NpemUoJnJlcXVlc3QtPnJxX3BpbGwsICZSTUZfQ09OTkVDVF9EQVRBLCBSQ0xfU0VSVkVSLAotCQkJICAgICBzaXplb2Yoc3RydWN0IG9iZF9jb25uZWN0X2RhdGEpKzE2KnNpemVvZihfX3U2NCkpOworCQkJICAgICBzaXplb2Yoc3RydWN0IG9iZF9jb25uZWN0X2RhdGEpICsKKwkJCSAgICAgMTYgKiBzaXplb2YoX191NjQpKTsKIAlwdGxycGNfcmVxdWVzdF9zZXRfcmVwbGVuKHJlcXVlc3QpOwogCXJlcXVlc3QtPnJxX2ludGVycHJldF9yZXBseSA9IHB0bHJwY19jb25uZWN0X2ludGVycHJldDsKIApAQCAtNzUwLDYgKzc1MSwxNTMgQEAKIAlyZXR1cm4gKHJjID09IC1FQlVTWSkgfHwgKHJjID09IC1FQUdBSU4pOwogfQogCitzdGF0aWMgaW50IHB0bHJwY19jb25uZWN0X3NldF9mbGFncyhzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wLAorCQkJCSAgICBzdHJ1Y3Qgb2JkX2Nvbm5lY3RfZGF0YSAqb2NkLAorCQkJCSAgICB1NjQgb2xkX2Nvbm5lY3RfZmxhZ3MsCisJCQkJICAgIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIGludCBpbml0X2Nvbm5lY3QpCit7CisJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZpbXAtPmltcF9vYmQtPnUuY2xpOworCXN0YXRpYyBib29sIHdhcm5lZDsKKworCWlmICgoaW1wLT5pbXBfY29ubmVjdF9mbGFnc19vcmlnICYgT0JEX0NPTk5FQ1RfSUJJVFMpICYmCisJICAgICEob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX0lCSVRTKSkgeworCQlMQ09OU09MRV9XQVJOKCIlczogTURTICVzIGRvZXMgbm90IHN1cHBvcnQgaWJpdHMgbG9jaywgZWl0aGVyIHZlcnkgb2xkIG9yIGludmFsaWQ6IHJlcXVlc3RlZCAlI2xseCwgcmVwbGllZCAlI2xseFxuIiwKKwkJCSAgICAgIGltcC0+aW1wX29iZC0+b2JkX25hbWUsCisJCQkgICAgICBpbXAtPmltcF9jb25uZWN0aW9uLT5jX3JlbW90ZV91dWlkLnV1aWQsCisJCQkgICAgICBpbXAtPmltcF9jb25uZWN0X2ZsYWdzX29yaWcsCisJCQkgICAgICBvY2QtPm9jZF9jb25uZWN0X2ZsYWdzKTsKKwkJcmV0dXJuIC1FUFJPVE87CisJfQorCisJc3Bpbl9sb2NrKCZpbXAtPmltcF9sb2NrKTsKKwlsaXN0X2RlbCgmaW1wLT5pbXBfY29ubl9jdXJyZW50LT5vaWNfaXRlbSk7CisJbGlzdF9hZGQoJmltcC0+aW1wX2Nvbm5fY3VycmVudC0+b2ljX2l0ZW0sICZpbXAtPmltcF9jb25uX2xpc3QpOworCWltcC0+aW1wX2xhc3Rfc3VjY2Vzc19jb25uID0gaW1wLT5pbXBfY29ubl9jdXJyZW50LT5vaWNfbGFzdF9hdHRlbXB0OworCisJc3Bpbl91bmxvY2soJmltcC0+aW1wX2xvY2spOworCisJaWYgKCF3YXJuZWQgJiYgKG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9WRVJTSU9OKSAmJgorCSAgICAob2NkLT5vY2RfdmVyc2lvbiA+IExVU1RSRV9WRVJTSU9OX0NPREUgKworCQkJCUxVU1RSRV9WRVJTSU9OX09GRlNFVF9XQVJOIHx8CisJICAgICBvY2QtPm9jZF92ZXJzaW9uIDwgTFVTVFJFX1ZFUlNJT05fQ09ERSAtCisJCQkJTFVTVFJFX1ZFUlNJT05fT0ZGU0VUX1dBUk4pKSB7CisJCS8qCisJCSAqIFNpZ2gsIHNvbWUgY29tcGlsZXJzIGRvIG5vdCBsaWtlICNpZmRlZiBpbiB0aGUgbWlkZGxlCisJCSAqIG9mIG1hY3JvIGFyZ3VtZW50cworCQkgKi8KKwkJY29uc3QgY2hhciAqb2xkZXIgPSAib2xkZXIgdGhhbiBjbGllbnQuIENvbnNpZGVyIHVwZ3JhZGluZyBzZXJ2ZXIiOworCQljb25zdCBjaGFyICpuZXdlciA9ICJuZXdlciB0aGFuIGNsaWVudC4gQ29uc2lkZXIgcmVjb21waWxpbmcgYXBwbGljYXRpb24iOworCisJCUxDT05TT0xFX1dBUk4oIlNlcnZlciAlcyB2ZXJzaW9uICglZC4lZC4lZC4lZCkgaXMgbXVjaCAlcyAoJXMpXG4iLAorCQkJICAgICAgb2JkMmNsaV90Z3QoaW1wLT5pbXBfb2JkKSwKKwkJCSAgICAgIE9CRF9PQ0RfVkVSU0lPTl9NQUpPUihvY2QtPm9jZF92ZXJzaW9uKSwKKwkJCSAgICAgIE9CRF9PQ0RfVkVSU0lPTl9NSU5PUihvY2QtPm9jZF92ZXJzaW9uKSwKKwkJCSAgICAgIE9CRF9PQ0RfVkVSU0lPTl9QQVRDSChvY2QtPm9jZF92ZXJzaW9uKSwKKwkJCSAgICAgIE9CRF9PQ0RfVkVSU0lPTl9GSVgob2NkLT5vY2RfdmVyc2lvbiksCisJCQkgICAgICBvY2QtPm9jZF92ZXJzaW9uID4gTFVTVFJFX1ZFUlNJT05fQ09ERSA/CisJCQkgICAgICBuZXdlciA6IG9sZGVyLCBMVVNUUkVfVkVSU0lPTl9TVFJJTkcpOworCQl3YXJuZWQgPSB0cnVlOworCX0KKworI2lmIExVU1RSRV9WRVJTSU9OX0NPREUgPCBPQkRfT0NEX1ZFUlNJT04oMywgMCwgNTMsIDApCisJLyoKKwkgKiBDaGVjayBpZiBzZXJ2ZXIgaGFzIExVLTEyNTIgZml4IGFwcGxpZWQgdG8gbm90IGFsd2F5cyBzd2FiCisJICogdGhlIElSIE1ORSBlbnRyaWVzLiBEbyB0aGlzIG9ubHkgb25jZSBwZXIgY29ubmVjdGlvbi4gIFRoaXMKKwkgKiBmaXh1cCBpcyB2ZXJzaW9uLWxpbWl0ZWQsIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBjYXJyeSB0aGUKKwkgKiBPQkRfQ09OTkVDVF9NTkVfU1dBQiBmbGFnIGFyb3VuZCBmb3JldmVyLCBqdXN0IHNvIGxvbmcgYXMgd2UKKwkgKiBuZWVkIGludGVyb3Agd2l0aCB1bnBhdGNoZWQgMi4yIHNlcnZlcnMuICBGb3IgbmV3ZXIgc2VydmVycywKKwkgKiB0aGUgY2xpZW50IHdpbGwgZG8gTU5FIHN3YWJiaW5nIG9ubHkgYXMgbmVlZGVkLiAgTFUtMTY0NAorCSAqLworCWlmICh1bmxpa2VseSgob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX1ZFUlNJT04pICYmCisJCSAgICAgIShvY2QtPm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfTU5FX1NXQUIpICYmCisJCSAgICAgT0JEX09DRF9WRVJTSU9OX01BSk9SKG9jZC0+b2NkX3ZlcnNpb24pID09IDIgJiYKKwkJICAgICBPQkRfT0NEX1ZFUlNJT05fTUlOT1Iob2NkLT5vY2RfdmVyc2lvbikgPT0gMiAmJgorCQkgICAgIE9CRF9PQ0RfVkVSU0lPTl9QQVRDSChvY2QtPm9jZF92ZXJzaW9uKSA8IDU1ICYmCisJCSAgICAgIXN0cmNtcChpbXAtPmltcF9vYmQtPm9iZF90eXBlLT50eXBfbmFtZSwKKwkJCSAgICAgTFVTVFJFX01HQ19OQU1FKSkpCisJCWltcC0+aW1wX25lZWRfbW5lX3N3YWIgPSAxOworCWVsc2UgLyogY2xlYXIgaWYgc2VydmVyIHdhcyB1cGdyYWRlZCBzaW5jZSBsYXN0IGNvbm5lY3QgKi8KKwkJaW1wLT5pbXBfbmVlZF9tbmVfc3dhYiA9IDA7CisjZW5kaWYKKworCWlmIChvY2QtPm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfQ0tTVU0pIHsKKwkJLyoKKwkJICogV2Ugc2VudCB0byB0aGUgc2VydmVyIG9jZF9ja3N1bV90eXBlcyB3aXRoIGJpdHMgc2V0CisJCSAqIGZvciBhbGdvcml0aG1zIHdlIHVuZGVyc3RhbmQuIFRoZSBzZXJ2ZXIgbWFza2VkIG9mZgorCQkgKiB0aGUgY2hlY2tzdW0gdHlwZXMgaXQgZG9lc24ndCBzdXBwb3J0CisJCSAqLworCQlpZiAoIShvY2QtPm9jZF9ja3N1bV90eXBlcyAmIGNrc3VtX3R5cGVzX3N1cHBvcnRlZF9jbGllbnQoKSkpIHsKKwkJCUxDT05TT0xFX1dBUk4oIlRoZSBuZWdvdGlhdGlvbiBvZiB0aGUgY2hlY2tzdW0gYWxnb3JpdGhtIHRvIHVzZSB3aXRoIHNlcnZlciAlcyBmYWlsZWQgKCV4LyV4KSwgZGlzYWJsaW5nIGNoZWNrc3Vtc1xuIiwKKwkJCQkgICAgICBvYmQyY2xpX3RndChpbXAtPmltcF9vYmQpLAorCQkJCSAgICAgIG9jZC0+b2NkX2Nrc3VtX3R5cGVzLAorCQkJCSAgICAgIGNrc3VtX3R5cGVzX3N1cHBvcnRlZF9jbGllbnQoKSk7CisJCQljbGktPmNsX2NoZWNrc3VtID0gMDsKKwkJCWNsaS0+Y2xfc3VwcF9ja3N1bV90eXBlcyA9IE9CRF9DS1NVTV9BRExFUjsKKwkJfSBlbHNlIHsKKwkJCWNsaS0+Y2xfc3VwcF9ja3N1bV90eXBlcyA9IG9jZC0+b2NkX2Nrc3VtX3R5cGVzOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IE9CRF9DT05ORUNUX0NLU1VNLgorCQkgKiBFbmZvcmNlIEFETEVSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisJCSAqLworCQljbGktPmNsX3N1cHBfY2tzdW1fdHlwZXMgPSBPQkRfQ0tTVU1fQURMRVI7CisJfQorCWNsaS0+Y2xfY2tzdW1fdHlwZSA9IGNrc3VtX3R5cGVfc2VsZWN0KGNsaS0+Y2xfc3VwcF9ja3N1bV90eXBlcyk7CisKKwlpZiAob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX0JSV19TSVpFKQorCQljbGktPmNsX21heF9wYWdlc19wZXJfcnBjID0KKwkJCW1pbihvY2QtPm9jZF9icndfc2l6ZSA+PiBQQUdFX1NISUZULAorCQkJICAgIGNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGMpOworCWVsc2UgaWYgKGltcC0+aW1wX2Nvbm5lY3Rfb3AgPT0gTURTX0NPTk5FQ1QgfHwKKwkJIGltcC0+aW1wX2Nvbm5lY3Rfb3AgPT0gTUdTX0NPTk5FQ1QpCisJCWNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGMgPSAxOworCisJTEFTU0VSVCgoY2xpLT5jbF9tYXhfcGFnZXNfcGVyX3JwYyA8PSBQVExSUENfTUFYX0JSV19QQUdFUykgJiYKKwkJKGNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGMgPiAwKSk7CisKKwljbGllbnRfYWRqdXN0X21heF9kaXJ0eShjbGkpOworCisJLyoKKwkgKiBSZXNldCBuc19jb25uZWN0X2ZsYWdzIG9ubHkgZm9yIGluaXRpYWwgY29ubmVjdC4gSXQgbWlnaHQgYmUKKwkgKiBjaGFuZ2VkIGluIHdoaWxlIHVzaW5nIEZTIGFuZCBpZiB3ZSByZXNldCBpdCBpbiByZWNvbm5lY3QKKwkgKiB0aGlzIGxlYWRzIHRvIGxvc2luZyB1c2VyIHNldHRpbmdzIGRvbmUgYmVmb3JlIHN1Y2ggYXMKKwkgKiBkaXNhYmxlIGxydV9yZXNpemUsIGV0Yy4KKwkgKi8KKwlpZiAob2xkX2Nvbm5lY3RfZmxhZ3MgIT0gZXhwX2Nvbm5lY3RfZmxhZ3MoZXhwKSB8fCBpbml0X2Nvbm5lY3QpIHsKKwkJQ0RFQlVHKERfSEEsICIlczogUmVzZXR0aW5nIG5zX2Nvbm5lY3RfZmxhZ3MgdG8gc2VydmVyIGZsYWdzOiAlI2xseFxuIiwKKwkJICAgICAgIGltcC0+aW1wX29iZC0+b2JkX25hbWUsIG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MpOworCQlpbXAtPmltcF9vYmQtPm9iZF9uYW1lc3BhY2UtPm5zX2Nvbm5lY3RfZmxhZ3MgPQorCQkJb2NkLT5vY2RfY29ubmVjdF9mbGFnczsKKwkJaW1wLT5pbXBfb2JkLT5vYmRfbmFtZXNwYWNlLT5uc19vcmlnX2Nvbm5lY3RfZmxhZ3MgPQorCQkJb2NkLT5vY2RfY29ubmVjdF9mbGFnczsKKwl9CisKKwlpZiAoKG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9BVCkgJiYKKwkgICAgKGltcC0+aW1wX21zZ19tYWdpYyA9PSBMVVNUUkVfTVNHX01BR0lDX1YyKSkKKwkJLyoKKwkJICogV2UgbmVlZCBhIHBlci1tZXNzYWdlIHN1cHBvcnQgZmxhZywgYmVjYXVzZQorCQkgKiBhLiB3ZSBkb24ndCBrbm93IGlmIHRoZSBpbmNvbWluZyBjb25uZWN0IHJlcGx5CisJCSAqICAgIHN1cHBvcnRzIEFUIG9yIG5vdCAoaW4gcmVwbHlfaW5fY2FsbGJhY2spCisJCSAqICAgIHVudGlsIHdlIHVucGFjayBpdC4KKwkJICogYi4gZmFpbG92ZXJlZCBzZXJ2ZXIgbWVhbnMgZXhwb3J0IGFuZCBmbGFncyBhcmUgZ29uZQorCQkgKiAgICAoaW4gcHRscnBjX3NlbmRfcmVwbHkpLgorCQkgKiAgICBDYW4gb25seSBiZSBzZXQgd2hlbiB3ZSBrbm93IEFUIGlzIHN1cHBvcnRlZCBhdAorCQkgKiAgICBib3RoIGVuZHMKKwkJICovCisJCWltcC0+aW1wX21zZ2hkcl9mbGFncyB8PSBNU0dIRFJfQVRfU1VQUE9SVDsKKwllbHNlCisJCWltcC0+aW1wX21zZ2hkcl9mbGFncyAmPSB+TVNHSERSX0FUX1NVUFBPUlQ7CisKKwlpZiAoKG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9GVUxMMjApICYmCisJICAgIChpbXAtPmltcF9tc2dfbWFnaWMgPT0gTFVTVFJFX01TR19NQUdJQ19WMikpCisJCWltcC0+aW1wX21zZ2hkcl9mbGFncyB8PSBNU0dIRFJfQ0tTVU1fSU5DT01QQVQxODsKKwllbHNlCisJCWltcC0+aW1wX21zZ2hkcl9mbGFncyAmPSB+TVNHSERSX0NLU1VNX0lOQ09NUEFUMTg7CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBpbnRlcnByZXRfcmVwbHkgY2FsbGJhY2sgZm9yIGNvbm5lY3QgUlBDcy4KICAqIExvb2tzIGludG8gcmV0dXJuZWQgc3RhdHVzIG9mIGNvbm5lY3Qgb3BlcmF0aW9uIGFuZCBkZWNpZGVzCkBAIC03NjIsNyArOTEwLDYgQEAKIHsKIAlzdHJ1Y3QgcHRscnBjX2Nvbm5lY3RfYXN5bmNfYXJncyAqYWEgPSBkYXRhOwogCXN0cnVjdCBvYmRfaW1wb3J0ICppbXAgPSByZXF1ZXN0LT5ycV9pbXBvcnQ7Ci0Jc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZpbXAtPmltcF9vYmQtPnUuY2xpOwogCXN0cnVjdCBsdXN0cmVfaGFuZGxlIG9sZF9oZGw7CiAJX191NjQgb2xkX2Nvbm5lY3RfZmxhZ3M7CiAJaW50IG1zZ19mbGFnczsKQEAgLTg0Miw3ICs5ODksMjEgQEAKIAlvbGRfY29ubmVjdF9mbGFncyA9IGV4cF9jb25uZWN0X2ZsYWdzKGV4cCk7CiAJZXhwLT5leHBfY29ubmVjdF9kYXRhID0gKm9jZDsKIAlpbXAtPmltcF9vYmQtPm9iZF9zZWxmX2V4cG9ydC0+ZXhwX2Nvbm5lY3RfZGF0YSA9ICpvY2Q7CisKKwkvKgorCSAqIFRoZSBuZXQgc3RhdGlzdGljcyBhZnRlciAocmUtKWNvbm5lY3QgaXMgbm90IHZhbGlkIGFueW1vcmUsCisJICogYmVjYXVzZSBtYXkgcmVmbGVjdCBvdGhlciByb3V0aW5nLCBldGMuCisJICovCisJYXRfaW5pdCgmaW1wLT5pbXBfYXQuaWF0X25ldF9sYXRlbmN5LCAwLCAwKTsKKwlwdGxycGNfYXRfYWRqX25ldF9sYXRlbmN5KHJlcXVlc3QsCisJCQkJICBsdXN0cmVfbXNnX2dldF9zZXJ2aWNlX3RpbWUocmVxdWVzdC0+cnFfcmVwbXNnKSk7CisKKwkvKiBJbXBvcnQgZmxhZ3Mgc2hvdWxkIGJlIHVwZGF0ZWQgYmVmb3JlIHdha2luZyBpbXBvcnQgYXQgRlVMTCBzdGF0ZSAqLworCXJjID0gcHRscnBjX2Nvbm5lY3Rfc2V0X2ZsYWdzKGltcCwgb2NkLCBvbGRfY29ubmVjdF9mbGFncywgZXhwLAorCQkJCSAgICAgIGFhLT5wY2FhX2luaXRpYWxfY29ubmVjdCk7CiAJY2xhc3NfZXhwb3J0X3B1dChleHApOworCWlmIChyYykKKwkJZ290byBvdXQ7CiAKIAlvYmRfaW1wb3J0X2V2ZW50KGltcC0+aW1wX29iZCwgaW1wLCBJTVBfRVZFTlRfT0NEKTsKIApAQCAtOTg3LDE1MSArMTE0OCwxMyBAQAogCiBmaW5pc2g6CiAJcmMgPSBwdGxycGNfaW1wb3J0X3JlY292ZXJ5X3N0YXRlX21hY2hpbmUoaW1wKTsKLQlpZiAocmMgIT0gMCkgewotCQlpZiAocmMgPT0gLUVOT1RDT05OKSB7Ci0JCQlDREVCVUcoRF9IQSwgImV2aWN0ZWQvYWJvcnRlZCBieSAlc0AlcyBkdXJpbmcgcmVjb3Zlcnk7IGludmFsaWRhdGluZyBhbmQgcmVjb25uZWN0aW5nXG4iLAotCQkJICAgICAgIG9iZDJjbGlfdGd0KGltcC0+aW1wX29iZCksCi0JCQkgICAgICAgaW1wLT5pbXBfY29ubmVjdGlvbi0+Y19yZW1vdGVfdXVpZC51dWlkKTsKLQkJCXB0bHJwY19jb25uZWN0X2ltcG9ydChpbXApOwotCQkJaW1wLT5pbXBfY29ubmVjdF90cmllZCA9IDE7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCXN0YXRpYyBib29sIHdhcm5lZDsKLQotCQlzcGluX2xvY2soJmltcC0+aW1wX2xvY2spOwotCQlsaXN0X2RlbCgmaW1wLT5pbXBfY29ubl9jdXJyZW50LT5vaWNfaXRlbSk7Ci0JCWxpc3RfYWRkKCZpbXAtPmltcF9jb25uX2N1cnJlbnQtPm9pY19pdGVtLCAmaW1wLT5pbXBfY29ubl9saXN0KTsKLQkJaW1wLT5pbXBfbGFzdF9zdWNjZXNzX2Nvbm4gPQotCQkJaW1wLT5pbXBfY29ubl9jdXJyZW50LT5vaWNfbGFzdF9hdHRlbXB0OwotCi0JCXNwaW5fdW5sb2NrKCZpbXAtPmltcF9sb2NrKTsKLQotCQlpZiAoKGltcC0+aW1wX2Nvbm5lY3RfZmxhZ3Nfb3JpZyAmIE9CRF9DT05ORUNUX0lCSVRTKSAmJgotCQkgICAgIShvY2QtPm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfSUJJVFMpKSB7Ci0JCQlMQ09OU09MRV9XQVJOKCIlczogTURTICVzIGRvZXMgbm90IHN1cHBvcnQgaWJpdHMgbG9jaywgZWl0aGVyIHZlcnkgb2xkIG9yIGludmFsaWQ6IHJlcXVlc3RlZCAlbGx4LCByZXBsaWVkICVsbHhcbiIsCi0JCQkJICAgICAgaW1wLT5pbXBfb2JkLT5vYmRfbmFtZSwKLQkJCQkgICAgICBpbXAtPmltcF9jb25uZWN0aW9uLT5jX3JlbW90ZV91dWlkLnV1aWQsCi0JCQkJICAgICAgaW1wLT5pbXBfY29ubmVjdF9mbGFnc19vcmlnLAotCQkJCSAgICAgIG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MpOwotCQkJcmMgPSAtRVBST1RPOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAoIXdhcm5lZCAmJiAob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX1ZFUlNJT04pICYmCi0JCSAgICAob2NkLT5vY2RfdmVyc2lvbiA+IExVU1RSRV9WRVJTSU9OX0NPREUgKwotCQkJCQlMVVNUUkVfVkVSU0lPTl9PRkZTRVRfV0FSTiB8fAotCQkgICAgIG9jZC0+b2NkX3ZlcnNpb24gPCBMVVNUUkVfVkVSU0lPTl9DT0RFIC0KLQkJCQkJTFVTVFJFX1ZFUlNJT05fT0ZGU0VUX1dBUk4pKSB7Ci0JCQkvKiBTaWdoLCBzb21lIGNvbXBpbGVycyBkbyBub3QgbGlrZSAjaWZkZWYgaW4gdGhlIG1pZGRsZQotCQkJICogb2YgbWFjcm8gYXJndW1lbnRzCi0JCQkgKi8KLQkJCWNvbnN0IGNoYXIgKm9sZGVyID0gIm9sZGVyIHRoYW4gY2xpZW50LiBDb25zaWRlciB1cGdyYWRpbmcgc2VydmVyIjsKLQkJCWNvbnN0IGNoYXIgKm5ld2VyID0gIm5ld2VyIHRoYW4gY2xpZW50LiBDb25zaWRlciByZWNvbXBpbGluZyBhcHBsaWNhdGlvbiI7Ci0KLQkJCUxDT05TT0xFX1dBUk4oIlNlcnZlciAlcyB2ZXJzaW9uICglZC4lZC4lZC4lZCkgaXMgbXVjaCAlcyAoJXMpXG4iLAotCQkJCSAgICAgIG9iZDJjbGlfdGd0KGltcC0+aW1wX29iZCksCi0JCQkJICAgICAgT0JEX09DRF9WRVJTSU9OX01BSk9SKG9jZC0+b2NkX3ZlcnNpb24pLAotCQkJCSAgICAgIE9CRF9PQ0RfVkVSU0lPTl9NSU5PUihvY2QtPm9jZF92ZXJzaW9uKSwKLQkJCQkgICAgICBPQkRfT0NEX1ZFUlNJT05fUEFUQ0gob2NkLT5vY2RfdmVyc2lvbiksCi0JCQkJICAgICAgT0JEX09DRF9WRVJTSU9OX0ZJWChvY2QtPm9jZF92ZXJzaW9uKSwKLQkJCQkgICAgICBvY2QtPm9jZF92ZXJzaW9uID4gTFVTVFJFX1ZFUlNJT05fQ09ERSA/Ci0JCQkJICAgICAgbmV3ZXIgOiBvbGRlciwgTFVTVFJFX1ZFUlNJT05fU1RSSU5HKTsKLQkJCXdhcm5lZCA9IHRydWU7Ci0JCX0KLQotI2lmIExVU1RSRV9WRVJTSU9OX0NPREUgPCBPQkRfT0NEX1ZFUlNJT04oMywgMiwgNTAsIDApCi0JCS8qIENoZWNrIGlmIHNlcnZlciBoYXMgTFUtMTI1MiBmaXggYXBwbGllZCB0byBub3QgYWx3YXlzIHN3YWIKLQkJICogdGhlIElSIE1ORSBlbnRyaWVzLiBEbyB0aGlzIG9ubHkgb25jZSBwZXIgY29ubmVjdGlvbi4gIFRoaXMKLQkJICogZml4dXAgaXMgdmVyc2lvbi1saW1pdGVkLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gY2FycnkgdGhlCi0JCSAqIE9CRF9DT05ORUNUX01ORV9TV0FCIGZsYWcgYXJvdW5kIGZvcmV2ZXIsIGp1c3Qgc28gbG9uZyBhcyB3ZQotCQkgKiBuZWVkIGludGVyb3Agd2l0aCB1bnBhdGNoZWQgMi4yIHNlcnZlcnMuICBGb3IgbmV3ZXIgc2VydmVycywKLQkJICogdGhlIGNsaWVudCB3aWxsIGRvIE1ORSBzd2FiYmluZyBvbmx5IGFzIG5lZWRlZC4gIExVLTE2NDQKLQkJICovCi0JCWlmICh1bmxpa2VseSgob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX1ZFUlNJT04pICYmCi0JCQkgICAgICEob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX01ORV9TV0FCKSAmJgotCQkJICAgICBPQkRfT0NEX1ZFUlNJT05fTUFKT1Iob2NkLT5vY2RfdmVyc2lvbikgPT0gMiAmJgotCQkJICAgICBPQkRfT0NEX1ZFUlNJT05fTUlOT1Iob2NkLT5vY2RfdmVyc2lvbikgPT0gMiAmJgotCQkJICAgICBPQkRfT0NEX1ZFUlNJT05fUEFUQ0gob2NkLT5vY2RfdmVyc2lvbikgPCA1NSAmJgotCQkJICAgICBzdHJjbXAoaW1wLT5pbXBfb2JkLT5vYmRfdHlwZS0+dHlwX25hbWUsCi0JCQkJICAgIExVU1RSRV9NR0NfTkFNRSkgPT0gMCkpCi0JCQlpbXAtPmltcF9uZWVkX21uZV9zd2FiID0gMTsKLQkJZWxzZSAvKiBjbGVhciBpZiBzZXJ2ZXIgd2FzIHVwZ3JhZGVkIHNpbmNlIGxhc3QgY29ubmVjdCAqLwotCQkJaW1wLT5pbXBfbmVlZF9tbmVfc3dhYiA9IDA7Ci0jZWxzZQotI3dhcm5pbmcgIkxVLTE2NDQ6IFJlbW92ZSBvbGQgT0JEX0NPTk5FQ1RfTU5FX1NXQUIgZml4dXAgYW5kIGltcF9uZWVkX21uZV9zd2FiIgotI2VuZGlmCi0KLQkJaWYgKG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9DS1NVTSkgewotCQkJLyogV2Ugc2VudCB0byB0aGUgc2VydmVyIG9jZF9ja3N1bV90eXBlcyB3aXRoIGJpdHMgc2V0Ci0JCQkgKiBmb3IgYWxnb3JpdGhtcyB3ZSB1bmRlcnN0YW5kLiBUaGUgc2VydmVyIG1hc2tlZCBvZmYKLQkJCSAqIHRoZSBjaGVja3N1bSB0eXBlcyBpdCBkb2Vzbid0IHN1cHBvcnQKLQkJCSAqLwotCQkJaWYgKChvY2QtPm9jZF9ja3N1bV90eXBlcyAmCi0JCQkgICAgIGNrc3VtX3R5cGVzX3N1cHBvcnRlZF9jbGllbnQoKSkgPT0gMCkgewotCQkJCUxDT05TT0xFX1dBUk4oIlRoZSBuZWdvdGlhdGlvbiBvZiB0aGUgY2hlY2tzdW0gYWxnb3JpdGhtIHRvIHVzZSB3aXRoIHNlcnZlciAlcyBmYWlsZWQgKCV4LyV4KSwgZGlzYWJsaW5nIGNoZWNrc3Vtc1xuIiwKLQkJCQkJICAgICAgb2JkMmNsaV90Z3QoaW1wLT5pbXBfb2JkKSwKLQkJCQkJICAgICAgb2NkLT5vY2RfY2tzdW1fdHlwZXMsCi0JCQkJCSAgICAgIGNrc3VtX3R5cGVzX3N1cHBvcnRlZF9jbGllbnQoKSk7Ci0JCQkJY2xpLT5jbF9jaGVja3N1bSA9IDA7Ci0JCQkJY2xpLT5jbF9zdXBwX2Nrc3VtX3R5cGVzID0gT0JEX0NLU1VNX0FETEVSOwotCQkJfSBlbHNlIHsKLQkJCQljbGktPmNsX3N1cHBfY2tzdW1fdHlwZXMgPSBvY2QtPm9jZF9ja3N1bV90eXBlczsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIFRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBPQkRfQ09OTkVDVF9DS1NVTS4KLQkJCSAqIEVuZm9yY2UgQURMRVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLQkJCSAqLwotCQkJY2xpLT5jbF9zdXBwX2Nrc3VtX3R5cGVzID0gT0JEX0NLU1VNX0FETEVSOwotCQl9Ci0JCWNsaS0+Y2xfY2tzdW1fdHlwZSA9IGNrc3VtX3R5cGVfc2VsZWN0KGNsaS0+Y2xfc3VwcF9ja3N1bV90eXBlcyk7Ci0KLQkJaWYgKG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9CUldfU0laRSkKLQkJCWNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGMgPQotCQkJCW1pbihvY2QtPm9jZF9icndfc2l6ZSA+PiBQQUdFX1NISUZULAotCQkJCSAgICBjbGktPmNsX21heF9wYWdlc19wZXJfcnBjKTsKLQkJZWxzZSBpZiAoaW1wLT5pbXBfY29ubmVjdF9vcCA9PSBNRFNfQ09OTkVDVCB8fAotCQkJIGltcC0+aW1wX2Nvbm5lY3Rfb3AgPT0gTUdTX0NPTk5FQ1QpCi0JCQljbGktPmNsX21heF9wYWdlc19wZXJfcnBjID0gMTsKLQotCQkvKiBSZXNldCBuc19jb25uZWN0X2ZsYWdzIG9ubHkgZm9yIGluaXRpYWwgY29ubmVjdC4gSXQgbWlnaHQgYmUKLQkJICogY2hhbmdlZCBpbiB3aGlsZSB1c2luZyBGUyBhbmQgaWYgd2UgcmVzZXQgaXQgaW4gcmVjb25uZWN0Ci0JCSAqIHRoaXMgbGVhZHMgdG8gbG9zaW5nIHVzZXIgc2V0dGluZ3MgZG9uZSBiZWZvcmUgc3VjaCBhcwotCQkgKiBkaXNhYmxlIGxydV9yZXNpemUsIGV0Yy4KLQkJICovCi0JCWlmIChvbGRfY29ubmVjdF9mbGFncyAhPSBleHBfY29ubmVjdF9mbGFncyhleHApIHx8Ci0JCSAgICBhYS0+cGNhYV9pbml0aWFsX2Nvbm5lY3QpIHsKLQkJCUNERUJVRyhEX0hBLCAiJXM6IFJlc2V0dGluZyBuc19jb25uZWN0X2ZsYWdzIHRvIHNlcnZlciBmbGFnczogJSNsbHhcbiIsCi0JCQkgICAgICAgaW1wLT5pbXBfb2JkLT5vYmRfbmFtZSwgb2NkLT5vY2RfY29ubmVjdF9mbGFncyk7Ci0JCQlpbXAtPmltcF9vYmQtPm9iZF9uYW1lc3BhY2UtPm5zX2Nvbm5lY3RfZmxhZ3MgPQotCQkJCW9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3M7Ci0JCQlpbXAtPmltcF9vYmQtPm9iZF9uYW1lc3BhY2UtPm5zX29yaWdfY29ubmVjdF9mbGFncyA9Ci0JCQkJb2NkLT5vY2RfY29ubmVjdF9mbGFnczsKLQkJfQotCi0JCWlmICgob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX0FUKSAmJgotCQkgICAgKGltcC0+aW1wX21zZ19tYWdpYyA9PSBMVVNUUkVfTVNHX01BR0lDX1YyKSkKLQkJCS8qIFdlIG5lZWQgYSBwZXItbWVzc2FnZSBzdXBwb3J0IGZsYWcsIGJlY2F1c2UKLQkJCSAqIGEuIHdlIGRvbid0IGtub3cgaWYgdGhlIGluY29taW5nIGNvbm5lY3QgcmVwbHkKLQkJCSAqICAgIHN1cHBvcnRzIEFUIG9yIG5vdCAoaW4gcmVwbHlfaW5fY2FsbGJhY2spCi0JCQkgKiAgICB1bnRpbCB3ZSB1bnBhY2sgaXQuCi0JCQkgKiBiLiBmYWlsb3ZlcmVkIHNlcnZlciBtZWFucyBleHBvcnQgYW5kIGZsYWdzIGFyZSBnb25lCi0JCQkgKiAgICAoaW4gcHRscnBjX3NlbmRfcmVwbHkpLgotCQkJICogQ2FuIG9ubHkgYmUgc2V0IHdoZW4gd2Uga25vdyBBVCBpcyBzdXBwb3J0ZWQgYXQKLQkJCSAqIGJvdGggZW5kcwotCQkJICovCi0JCQlpbXAtPmltcF9tc2doZHJfZmxhZ3MgfD0gTVNHSERSX0FUX1NVUFBPUlQ7Ci0JCWVsc2UKLQkJCWltcC0+aW1wX21zZ2hkcl9mbGFncyAmPSB+TVNHSERSX0FUX1NVUFBPUlQ7Ci0KLQkJaWYgKChvY2QtPm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfRlVMTDIwKSAmJgotCQkgICAgKGltcC0+aW1wX21zZ19tYWdpYyA9PSBMVVNUUkVfTVNHX01BR0lDX1YyKSkKLQkJCWltcC0+aW1wX21zZ2hkcl9mbGFncyB8PSBNU0dIRFJfQ0tTVU1fSU5DT01QQVQxODsKLQkJZWxzZQotCQkJaW1wLT5pbXBfbXNnaGRyX2ZsYWdzICY9IH5NU0dIRFJfQ0tTVU1fSU5DT01QQVQxODsKLQotCQlMQVNTRVJUKChjbGktPmNsX21heF9wYWdlc19wZXJfcnBjIDw9IFBUTFJQQ19NQVhfQlJXX1BBR0VTKSAmJgotCQkJKGNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGMgPiAwKSk7CisJaWYgKHJjID09IC1FTk9UQ09OTikgeworCQlDREVCVUcoRF9IQSwgImV2aWN0ZWQvYWJvcnRlZCBieSAlc0AlcyBkdXJpbmcgcmVjb3Zlcnk7IGludmFsaWRhdGluZyBhbmQgcmVjb25uZWN0aW5nXG4iLAorCQkgICAgICAgb2JkMmNsaV90Z3QoaW1wLT5pbXBfb2JkKSwKKwkJICAgICAgIGltcC0+aW1wX2Nvbm5lY3Rpb24tPmNfcmVtb3RlX3V1aWQudXVpZCk7CisJCXB0bHJwY19jb25uZWN0X2ltcG9ydChpbXApOworCQlpbXAtPmltcF9jb25uZWN0X3RyaWVkID0gMTsKKwkJcmV0dXJuIDA7CiAJfQogCiBvdXQ6CkBAIC0xNDk3LDEwICsxNTIwLDEzIEBACiAvKiBBZGFwdGl2ZSBUaW1lb3V0IHV0aWxzICovCiBleHRlcm4gdW5zaWduZWQgaW50IGF0X21pbiwgYXRfbWF4LCBhdF9oaXN0b3J5OwogCi0vKiBCaW4gaW50byB0aW1lc2xpY2VzIHVzaW5nIEFUX0JJTlMgYmlucy4KLSAqIFRoaXMgZ2l2ZXMgdXMgYSBtYXggb2YgdGhlIGxhc3QgYmlubGltaXQqQVRfQklOUyBzZWNzIHdpdGhvdXQgdGhlIHN0b3JhZ2UsCi0gKiBidXQgc3RpbGwgc21vb3RoaW5nIG91dCBhIHJldHVybiB0byBub3JtYWxjeSBmcm9tIGEgc2xvdyByZXNwb25zZS4KLSAqIChFLmcuIHJlbWVtYmVyIHRoZSBtYXhpbXVtIGxhdGVuY3kgaW4gZWFjaCBtaW51dGUgb2YgdGhlIGxhc3QgNCBtaW51dGVzLikKKy8qCisgKlVwZGF0ZSBhdF9jdXJyZW50IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSAoYm91bmRlZCBieSBhdF9taW4gYW5kIGF0X21heCksCisgKiBhcyB3ZWxsIGFzIHRoZSBBVCBoaXN0b3J5ICJiaW5zIi4KKyAqICAtIEJpbiBpbnRvIHRpbWVzbGljZXMgdXNpbmcgQVRfQklOUyBiaW5zLgorICogIC0gVGhpcyBnaXZlcyB1cyBhIG1heCBvZiB0aGUgbGFzdCBhdF9oaXN0b3J5IHNlY29uZHMgd2l0aG91dCB0aGUgc3RvcmFnZSwKKyAqICAgIGJ1dCBzdGlsbCBzbW9vdGhpbmcgb3V0IGEgcmV0dXJuIHRvIG5vcm1hbGN5IGZyb20gYSBzbG93IHJlc3BvbnNlLgorICogIC0gKEUuZy4gcmVtZW1iZXIgdGhlIG1heGltdW0gbGF0ZW5jeSBpbiBlYWNoIG1pbnV0ZSBvZiB0aGUgbGFzdCA0IG1pbnV0ZXMuKQogICovCiBpbnQgYXRfbWVhc3VyZWQoc3RydWN0IGFkYXB0aXZlX3RpbWVvdXQgKmF0LCB1bnNpZ25lZCBpbnQgdmFsKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xheW91dC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xheW91dC5jCmluZGV4IGFiNWQ4NTEuLjgzOWVmM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9sYXlvdXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbGF5b3V0LmMKQEAgLTY2NywxMSArNjY3LDggQEAKIAkmUlFGX01EU19TWU5DLAogCSZSUUZfTURTX0NMT1NFLAogCSZSUUZfTURTX1JFTEVBU0VfQ0xPU0UsCi0JJlJRRl9NRFNfUElOLAotCSZSUUZfTURTX1VOUElOLAogCSZSUUZfTURTX1JFQURQQUdFLAogCSZSUUZfTURTX1dSSVRFUEFHRSwKLQkmUlFGX01EU19JU19TVUJESVIsCiAJJlJRRl9NRFNfRE9ORV9XUklUSU5HLAogCSZSUUZfTURTX1JFSU5ULAogCSZSUUZfTURTX1JFSU5UX0NSRUFURSwKQEAgLTExMTYsOSArMTExMyw5IEBACiAKIHN0cnVjdCByZXFfZm9ybWF0IHsKIAljb25zdCBjaGFyICpyZl9uYW1lOwotCWludCByZl9pZHg7CisJc2l6ZV90IHJmX2lkeDsKIAlzdHJ1Y3QgewotCQlpbnQgbnI7CisJCXNpemVfdCBucjsKIAkJY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKipkOwogCX0gcmZfZmllbGRzW1JDTF9OUl07CiB9OwpAQCAtMTM4OSwxNSArMTM4Niw2IEBACiAJCQltZHRfcmVsZWFzZV9jbG9zZV9jbGllbnQsIG1kc19sYXN0X3VubGlua19zZXJ2ZXIpOwogRVhQT1JUX1NZTUJPTChSUUZfTURTX1JFTEVBU0VfQ0xPU0UpOwogCi1zdHJ1Y3QgcmVxX2Zvcm1hdCBSUUZfTURTX1BJTiA9Ci0JREVGSU5FX1JFUV9GTVQwKCJNRFNfUElOIiwKLQkJCW1kdF9ib2R5X2NhcGEsIG1kdF9ib2R5X29ubHkpOwotRVhQT1JUX1NZTUJPTChSUUZfTURTX1BJTik7Ci0KLXN0cnVjdCByZXFfZm9ybWF0IFJRRl9NRFNfVU5QSU4gPQotCURFRklORV9SRVFfRk1UMCgiTURTX1VOUElOIiwgbWR0X2JvZHlfb25seSwgZW1wdHkpOwotRVhQT1JUX1NZTUJPTChSUUZfTURTX1VOUElOKTsKLQogc3RydWN0IHJlcV9mb3JtYXQgUlFGX01EU19ET05FX1dSSVRJTkcgPQogCURFRklORV9SRVFfRk1UMCgiTURTX0RPTkVfV1JJVElORyIsCiAJCQltZHRfY2xvc2VfY2xpZW50LCBtZHRfYm9keV9vbmx5KTsKQEAgLTE0NDgsMTEgKzE0MzYsNiBAQAogCQkJbWR0X2JvZHlfY2FwYSwgbWR0X2JvZHlfb25seSk7CiBFWFBPUlRfU1lNQk9MKFJRRl9NRFNfV1JJVEVQQUdFKTsKIAotc3RydWN0IHJlcV9mb3JtYXQgUlFGX01EU19JU19TVUJESVIgPQotCURFRklORV9SRVFfRk1UMCgiTURTX0lTX1NVQkRJUiIsCi0JCQltZHRfYm9keV9vbmx5LCBtZHRfYm9keV9vbmx5KTsKLUVYUE9SVF9TWU1CT0woUlFGX01EU19JU19TVUJESVIpOwotCiBzdHJ1Y3QgcmVxX2Zvcm1hdCBSUUZfTExPR19PUklHSU5fSEFORExFX0NSRUFURSA9CiAJREVGSU5FX1JFUV9GTVQwKCJMTE9HX09SSUdJTl9IQU5ETEVfQ1JFQVRFIiwKIAkJCWxsb2dfb3JpZ2luX2hhbmRsZV9jcmVhdGVfY2xpZW50LCBsbG9nZF9ib2R5X29ubHkpOwpAQCAtMTU3Miw5ICsxNTU1LDkgQEAKICAqLwogaW50IHJlcV9sYXlvdXRfaW5pdCh2b2lkKQogewotCWludCBpOwotCWludCBqOwotCWludCBrOworCXNpemVfdCBpOworCXNpemVfdCBqOworCXNpemVfdCBrOwogCXN0cnVjdCByZXFfZm9ybWF0ICpyZiA9IE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZXFfZm9ybWF0cyk7ICsraSkgewpAQCAtMTYxNiw3ICsxNTk5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgcmVxX2NhcHN1bGVfaW5pdF9hcmVhKHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCkKIHsKLQlpbnQgaTsKKwlzaXplX3QgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBpbGwtPnJjX2FyZWFbUkNMX0NMSUVOVF0pOyBpKyspIHsKIAkJcGlsbC0+cmNfYXJlYVtSQ0xfQ0xJRU5UXVtpXSA9IC0xOwpAQCAtMTY2Nyw4ICsxNjUwLDcgQEAKIAogc3RhdGljIGludCBfX3JlcV9mb3JtYXRfaXNfc2FuZShjb25zdCBzdHJ1Y3QgcmVxX2Zvcm1hdCAqZm10KQogewotCXJldHVybgotCQkwIDw9IGZtdC0+cmZfaWR4ICYmIGZtdC0+cmZfaWR4IDwgQVJSQVlfU0laRShyZXFfZm9ybWF0cykgJiYKKwlyZXR1cm4gZm10LT5yZl9pZHggPCBBUlJBWV9TSVpFKHJlcV9mb3JtYXRzKSAmJgogCQlyZXFfZm9ybWF0c1tmbXQtPnJmX2lkeF0gPT0gZm10OwogfQogCkBAIC0xNzAyLDExICsxNjg0LDExIEBACiAgKiB2YXJpYWJsZS1zaXplZCBmaWVsZHMuICBUaGUgZmllbGQgc2l6ZXMgY29tZSBmcm9tIHRoZSBkZWNsYXJlZCBcYSBybWZfc2l6ZQogICogZmllbGQgb2YgYSBcYSBwaWxsJ3MgXGEgcmNfZm10J3MgUk1GJ3MuCiAgKi8KLWludCByZXFfY2Fwc3VsZV9maWxsZWRfc2l6ZXMoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAotCQkJICAgICBlbnVtIHJlcV9sb2NhdGlvbiBsb2MpCitzaXplX3QgcmVxX2NhcHN1bGVfZmlsbGVkX3NpemVzKHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwKKwkJCQllbnVtIHJlcV9sb2NhdGlvbiBsb2MpCiB7CiAJY29uc3Qgc3RydWN0IHJlcV9mb3JtYXQgKmZtdCA9IHBpbGwtPnJjX2ZtdDsKLQlpbnQgaTsKKwlzaXplX3QgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBmbXQtPnJmX2ZpZWxkc1tsb2NdLm5yOyArK2kpIHsKIAkJaWYgKHBpbGwtPnJjX2FyZWFbbG9jXVtpXSA9PSAtMSkgewpAQCAtMTc2MSwxMSArMTc0MywxMSBAQAogICogUmV0dXJucyB0aGUgUFRMUlBDIHJlcXVlc3Qgb3IgcmVwbHkgKFxhIGxvYykgYnVmZmVyIG9mZnNldCBvZiBhIFxhIHBpbGwKICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFJNRiAoXGEgZmllbGQpLgogICovCi1zdGF0aWMgaW50IF9fcmVxX2NhcHN1bGVfb2Zmc2V0KGNvbnN0IHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwKK3N0YXRpYyB1MzIgX19yZXFfY2Fwc3VsZV9vZmZzZXQoY29uc3Qgc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAogCQkJCWNvbnN0IHN0cnVjdCByZXFfbXNnX2ZpZWxkICpmaWVsZCwKIAkJCQllbnVtIHJlcV9sb2NhdGlvbiBsb2MpCiB7Ci0JaW50IG9mZnNldDsKKwl1MzIgb2Zmc2V0OwogCiAJb2Zmc2V0ID0gZmllbGQtPnJtZl9vZmZzZXRbcGlsbC0+cmNfZm10LT5yZl9pZHhdW2xvY107CiAJTEFTU0VSVEYob2Zmc2V0ID4gMCwgIiVzOiVzLCBvZmY9JWQsIGxvYz0lZFxuIiwgcGlsbC0+cmNfZm10LT5yZl9uYW1lLApAQCAtMTg2OSwxMCArMTg1MSwxMCBAQAogCWNvbnN0IHN0cnVjdCByZXFfZm9ybWF0ICpmbXQ7CiAJc3RydWN0IGx1c3RyZV9tc2cgKm1zZzsKIAl2b2lkICp2YWx1ZTsKLQlpbnQgbGVuOwotCWludCBvZmZzZXQ7CisJdTMyIGxlbjsKKwl1MzIgb2Zmc2V0OwogCi0Jdm9pZCAqKCpnZXR0ZXIpKHN0cnVjdCBsdXN0cmVfbXNnICptLCBpbnQgbiwgaW50IG1pbmxlbik7CisJdm9pZCAqKCpnZXR0ZXIpKHN0cnVjdCBsdXN0cmVfbXNnICptLCB1MzIgbiwgdTMyIG1pbmxlbik7CiAKIAlzdGF0aWMgY29uc3QgY2hhciAqcmNsX25hbWVzW1JDTF9OUl0gPSB7CiAJCVtSQ0xfQ0xJRU5UXSA9ICJjbGllbnQiLApAQCAtMTg5OSwyMCArMTg4MSwyMCBAQAogCQkgKi8KIAkJbGVuID0gbHVzdHJlX21zZ19idWZsZW4obXNnLCBvZmZzZXQpOwogCQlpZiAoKGxlbiAlIGZpZWxkLT5ybWZfc2l6ZSkgIT0gMCkgewotCQkJQ0VSUk9SKCIlczogYXJyYXkgZmllbGQgc2l6ZSBtaXNtYXRjaCAlZCBtb2R1bG8gJWQgIT0gMCAoJWQpXG4iLAorCQkJQ0VSUk9SKCIlczogYXJyYXkgZmllbGQgc2l6ZSBtaXNtYXRjaCAlZCBtb2R1bG8gJXUgIT0gMCAoJWQpXG4iLAogCQkJICAgICAgIGZpZWxkLT5ybWZfbmFtZSwgbGVuLCBmaWVsZC0+cm1mX3NpemUsIGxvYyk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCX0gZWxzZSBpZiAocGlsbC0+cmNfYXJlYVtsb2NdW29mZnNldF0gIT0gLTEpIHsKIAkJbGVuID0gcGlsbC0+cmNfYXJlYVtsb2NdW29mZnNldF07CiAJfSBlbHNlIHsKLQkJbGVuID0gbWF4KGZpZWxkLT5ybWZfc2l6ZSwgMCk7CisJCWxlbiA9IG1heF90KHR5cGVvZihmaWVsZC0+cm1mX3NpemUpLCBmaWVsZC0+cm1mX3NpemUsIDApOwogCX0KIAl2YWx1ZSA9IGdldHRlcihtc2csIG9mZnNldCwgbGVuKTsKIAogCWlmICghdmFsdWUpIHsKIAkJREVCVUdfUkVRKERfRVJST1IsIHBpbGwtPnJjX3JlcSwKLQkJCSAgIldyb25nIGJ1ZmZlciBmb3IgZmllbGQgYCVzJyAoJWQgb2YgJWQpIGluIGZvcm1hdCBgJXMnOiAlZCB2cy4gJWQgKCVzKVxuIiwKKwkJCSAgIldyb25nIGJ1ZmZlciBmb3IgZmllbGQgYCVzJyAoJXUgb2YgJXUpIGluIGZvcm1hdCBgJXMnOiAldSB2cy4gJXUgKCVzKVxuIiwKIAkJCSAgZmllbGQtPnJtZl9uYW1lLCBvZmZzZXQsIGx1c3RyZV9tc2dfYnVmY291bnQobXNnKSwKIAkJCSAgZm10LT5yZl9uYW1lLCBsdXN0cmVfbXNnX2J1Zmxlbihtc2csIG9mZnNldCksIGxlbiwKIAkJCSAgcmNsX25hbWVzW2xvY10pOwpAQCAtMTk1OCw3ICsxOTQwLDcgQEAKICAqLwogdm9pZCAqcmVxX2NhcHN1bGVfY2xpZW50X3NpemVkX2dldChzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCiAJCQkJICAgY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKmZpZWxkLAotCQkJCSAgIGludCBsZW4pCisJCQkJICAgdTMyIGxlbikKIHsKIAlyZXFfY2Fwc3VsZV9zZXRfc2l6ZShwaWxsLCBmaWVsZCwgUkNMX0NMSUVOVCwgbGVuKTsKIAlyZXR1cm4gX19yZXFfY2Fwc3VsZV9nZXQocGlsbCwgZmllbGQsIFJDTF9DTElFTlQsIE5VTEwsIDApOwpAQCAtMTk5OSw3ICsxOTgxLDcgQEAKICAqLwogdm9pZCAqcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldChzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCiAJCQkJICAgY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKmZpZWxkLAotCQkJCSAgIGludCBsZW4pCisJCQkJICAgdTMyIGxlbikKIHsKIAlyZXFfY2Fwc3VsZV9zZXRfc2l6ZShwaWxsLCBmaWVsZCwgUkNMX1NFUlZFUiwgbGVuKTsKIAlyZXR1cm4gX19yZXFfY2Fwc3VsZV9nZXQocGlsbCwgZmllbGQsIFJDTF9TRVJWRVIsIE5VTEwsIDApOwpAQCAtMjAwOCw3ICsxOTkwLDcgQEAKIAogdm9pZCAqcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX3N3YWJfZ2V0KHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwKIAkJCQkJY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKmZpZWxkLAotCQkJCQlpbnQgbGVuLCB2b2lkICpzd2FiYmVyKQorCQkJCQl1MzIgbGVuLCB2b2lkICpzd2FiYmVyKQogewogCXJlcV9jYXBzdWxlX3NldF9zaXplKHBpbGwsIGZpZWxkLCBSQ0xfU0VSVkVSLCBsZW4pOwogCXJldHVybiBfX3JlcV9jYXBzdWxlX2dldChwaWxsLCBmaWVsZCwgUkNMX1NFUlZFUiwgc3dhYmJlciwgMCk7CkBAIC0yMDI0LDIzICsyMDA2LDI1IEBACiAgKi8KIHZvaWQgcmVxX2NhcHN1bGVfc2V0X3NpemUoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAogCQkJICBjb25zdCBzdHJ1Y3QgcmVxX21zZ19maWVsZCAqZmllbGQsCi0JCQkgIGVudW0gcmVxX2xvY2F0aW9uIGxvYywgaW50IHNpemUpCisJCQkgIGVudW0gcmVxX2xvY2F0aW9uIGxvYywgdTMyIHNpemUpCiB7CiAJTEFTU0VSVChsb2MgPT0gUkNMX1NFUlZFUiB8fCBsb2MgPT0gUkNMX0NMSUVOVCk7CiAKLQlpZiAoKHNpemUgIT0gZmllbGQtPnJtZl9zaXplKSAmJgorCWlmICgoc2l6ZSAhPSAodTMyKWZpZWxkLT5ybWZfc2l6ZSkgJiYKIAkgICAgKGZpZWxkLT5ybWZfc2l6ZSAhPSAtMSkgJiYKIAkgICAgIShmaWVsZC0+cm1mX2ZsYWdzICYgUk1GX0ZfTk9fU0laRV9DSEVDSykgJiYKIAkgICAgKHNpemUgPiAwKSkgeworCQl1MzIgcm1mX3NpemUgPSAodTMyKWZpZWxkLT5ybWZfc2l6ZTsKKwogCQlpZiAoKGZpZWxkLT5ybWZfZmxhZ3MgJiBSTUZfRl9TVFJVQ1RfQVJSQVkpICYmCi0JCSAgICAoc2l6ZSAlIGZpZWxkLT5ybWZfc2l6ZSAhPSAwKSkgewotCQkJQ0VSUk9SKCIlczogYXJyYXkgZmllbGQgc2l6ZSBtaXNtYXRjaCAlZCAlJSAlZCAhPSAwICglZClcbiIsCi0JCQkgICAgICAgZmllbGQtPnJtZl9uYW1lLCBzaXplLCBmaWVsZC0+cm1mX3NpemUsIGxvYyk7CisJCSAgICAoc2l6ZSAlIHJtZl9zaXplICE9IDApKSB7CisJCQlDRVJST1IoIiVzOiBhcnJheSBmaWVsZCBzaXplIG1pc21hdGNoICV1ICUlICV1ICE9IDAgKCVkKVxuIiwKKwkJCSAgICAgICBmaWVsZC0+cm1mX25hbWUsIHNpemUsIHJtZl9zaXplLCBsb2MpOwogCQkJTEJVRygpOwogCQl9IGVsc2UgaWYgKCEoZmllbGQtPnJtZl9mbGFncyAmIFJNRl9GX1NUUlVDVF9BUlJBWSkgJiYKLQkJICAgIHNpemUgPCBmaWVsZC0+cm1mX3NpemUpIHsKLQkJCUNFUlJPUigiJXM6IGZpZWxkIHNpemUgbWlzbWF0Y2ggJWQgIT0gJWQgKCVkKVxuIiwKLQkJCSAgICAgICBmaWVsZC0+cm1mX25hbWUsIHNpemUsIGZpZWxkLT5ybWZfc2l6ZSwgbG9jKTsKKwkJCSAgIHNpemUgPCBybWZfc2l6ZSkgeworCQkJQ0VSUk9SKCIlczogZmllbGQgc2l6ZSBtaXNtYXRjaCAldSAhPSAldSAoJWQpXG4iLAorCQkJICAgICAgIGZpZWxkLT5ybWZfbmFtZSwgc2l6ZSwgcm1mX3NpemUsIGxvYyk7CiAJCQlMQlVHKCk7CiAJCX0KIAl9CkBAIC0yMDU3LDcgKzIwNDEsNyBAQAogICogYWN0dWFsbHkgc2V0cyB0aGUgc2l6ZSBpbiBwaWxsLnJjX2FyZWFbbG9jXVtvZmZzZXRdLCBidXQgdGhpcyBmdW5jdGlvbgogICogcmV0dXJucyB0aGUgbWVzc2FnZSBidWZsZW5bb2Zmc2V0XSwgbWF5YmUgd2Ugc2hvdWxkIHVzZSBhbm90aGVyIG5hbWUuCiAgKi8KLWludCByZXFfY2Fwc3VsZV9nZXRfc2l6ZShjb25zdCBzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCit1MzIgcmVxX2NhcHN1bGVfZ2V0X3NpemUoY29uc3Qgc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAogCQkJIGNvbnN0IHN0cnVjdCByZXFfbXNnX2ZpZWxkICpmaWVsZCwKIAkJCSBlbnVtIHJlcV9sb2NhdGlvbiBsb2MpCiB7CkBAIC0yMDc1LDcgKzIwNTksNyBAQAogICoKICAqIFNlZSBhbHNvIHJlcV9jYXBzdWxlX3NldF9zaXplKCkuCiAgKi8KLWludCByZXFfY2Fwc3VsZV9tc2dfc2l6ZShzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsIGVudW0gcmVxX2xvY2F0aW9uIGxvYykKK3UzMiByZXFfY2Fwc3VsZV9tc2dfc2l6ZShzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsIGVudW0gcmVxX2xvY2F0aW9uIGxvYykKIHsKIAlyZXR1cm4gbHVzdHJlX21zZ19zaXplKHBpbGwtPnJjX3JlcS0+cnFfaW1wb3J0LT5pbXBfbXNnX21hZ2ljLAogCQkJICAgICAgIHBpbGwtPnJjX2ZtdC0+cmZfZmllbGRzW2xvY10ubnIsCkBAIC0yMDkwLDEwICsyMDc0LDExIEBACiAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgZm9ybWF0cyB3aGljaCBjb250YWluIHZhcmlhYmxlIHNpemUKICAqIGZpZWxkcy4KICAqLwotaW50IHJlcV9jYXBzdWxlX2ZtdF9zaXplKF9fdTMyIG1hZ2ljLCBjb25zdCBzdHJ1Y3QgcmVxX2Zvcm1hdCAqZm10LAordTMyIHJlcV9jYXBzdWxlX2ZtdF9zaXplKF9fdTMyIG1hZ2ljLCBjb25zdCBzdHJ1Y3QgcmVxX2Zvcm1hdCAqZm10LAogCQkJIGVudW0gcmVxX2xvY2F0aW9uIGxvYykKIHsKLQlpbnQgc2l6ZSwgaSA9IDA7CisJc2l6ZV90IGkgPSAwOworCXUzMiBzaXplOwogCiAJLyoKIAkgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBwcm9iYWJseSBMQVNTRVJUKCkgdGhhdCBmbXQgaGFzIG5vIGZpZWxkcyB3aXRoCkBAIC0yMTAzLDcgKzIwODgsNyBAQAogCSAqIHdlIGRvLgogCSAqLwogCXNpemUgPSBsdXN0cmVfbXNnX2hkcl9zaXplKG1hZ2ljLCBmbXQtPnJmX2ZpZWxkc1tsb2NdLm5yKTsKLQlpZiAoc2l6ZSA8IDApCisJaWYgKCFzaXplKQogCQlyZXR1cm4gc2l6ZTsKIAogCWZvciAoOyBpIDwgZm10LT5yZl9maWVsZHNbbG9jXS5ucjsgKytpKQpAQCAtMjEzNSw3ICsyMTIwLDcgQEAKIHZvaWQgcmVxX2NhcHN1bGVfZXh0ZW5kKHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwgY29uc3Qgc3RydWN0IHJlcV9mb3JtYXQgKmZtdCkKIHsKIAlpbnQgaTsKLQlpbnQgajsKKwlzaXplX3QgajsKIAogCWNvbnN0IHN0cnVjdCByZXFfZm9ybWF0ICpvbGQ7CiAKQEAgLTIxOTMsNyArMjE3OCw3IEBACiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgcmVxX21zZ19maWVsZCAqZmllbGQsCiAJCQkJICAgICBlbnVtIHJlcV9sb2NhdGlvbiBsb2MpCiB7Ci0JaW50IG9mZnNldDsKKwl1MzIgb2Zmc2V0OwogCiAJTEFTU0VSVChsb2MgPT0gUkNMX1NFUlZFUiB8fCBsb2MgPT0gUkNMX0NMSUVOVCk7CiAJTEFTU0VSVChyZXFfY2Fwc3VsZV9oYXNfZmllbGQocGlsbCwgZmllbGQsIGxvYykpOwpAQCAtMjIxMCwxMiArMjE5NSwxMSBAQAogICovCiB2b2lkIHJlcV9jYXBzdWxlX3NocmluayhzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCiAJCQljb25zdCBzdHJ1Y3QgcmVxX21zZ19maWVsZCAqZmllbGQsCi0JCQl1bnNpZ25lZCBpbnQgbmV3bGVuLAotCQkJZW51bSByZXFfbG9jYXRpb24gbG9jKQorCQkJdTMyIG5ld2xlbiwgZW51bSByZXFfbG9jYXRpb24gbG9jKQogewogCWNvbnN0IHN0cnVjdCByZXFfZm9ybWF0ICpmbXQ7CiAJc3RydWN0IGx1c3RyZV9tc2cgKm1zZzsKLQlpbnQgbGVuOworCXUzMiBsZW47CiAJaW50IG9mZnNldDsKIAogCWZtdCA9IHBpbGwtPnJjX2ZtdDsKQEAgLTIyMjgsNyArMjIxMiw3IEBACiAKIAltc2cgPSBfX3JlcV9tc2cocGlsbCwgbG9jKTsKIAlsZW4gPSBsdXN0cmVfbXNnX2J1Zmxlbihtc2csIG9mZnNldCk7Ci0JTEFTU0VSVEYobmV3bGVuIDw9IGxlbiwgIiVzOiVzLCBvbGRsZW49JWQsIG5ld2xlbj0lZFxuIiwKKwlMQVNTRVJURihuZXdsZW4gPD0gbGVuLCAiJXM6JXMsIG9sZGxlbj0ldSwgbmV3bGVuPSV1XG4iLAogCQkgZm10LT5yZl9uYW1lLCBmaWVsZC0+cm1mX25hbWUsIGxlbiwgbmV3bGVuKTsKIAogCWlmIChsb2MgPT0gUkNMX0NMSUVOVCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9scHJvY19wdGxycGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9scHJvY19wdGxycGMuYwppbmRleCBiYzkzYjc1Li45YmFkNTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbHByb2NfcHRscnBjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xwcm9jX3B0bHJwYy5jCkBAIC0xOTEsNyArMTkxLDcgQEAKIAlMQVNTRVJUKCEqZGVidWdmc19yb290X3JldCk7CiAJTEFTU0VSVCghKnN0YXRzX3JldCk7CiAKLQlzdmNfc3RhdHMgPSBscHJvY2ZzX2FsbG9jX3N0YXRzKEVYVFJBX01BWF9PUENPREVTK0xVU1RSRV9NQVhfT1BDT0RFUywKKwlzdmNfc3RhdHMgPSBscHJvY2ZzX2FsbG9jX3N0YXRzKEVYVFJBX01BWF9PUENPREVTICsgTFVTVFJFX01BWF9PUENPREVTLAogCQkJCQkwKTsKIAlpZiAoIXN2Y19zdGF0cykKIAkJcmV0dXJuOwpAQCAtOTM3LDcgKzkzNyw3IEBACiBzdGF0aWMgaW50CiBwdGxycGNfbHByb2Nmc19zdmNfcmVxX2hpc3Rvcnlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHNvcHMgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzb3BzID0gewogCQkuc3RhcnQgPSBwdGxycGNfbHByb2Nmc19zdmNfcmVxX2hpc3Rvcnlfc3RhcnQsCiAJCS5zdG9wICA9IHB0bHJwY19scHJvY2ZzX3N2Y19yZXFfaGlzdG9yeV9zdG9wLAogCQkubmV4dCAgPSBwdGxycGNfbHByb2Nmc19zdmNfcmVxX2hpc3RvcnlfbmV4dCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9uaW9idWYuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9uaW9idWYuYwppbmRleCAxMWVjODI1Li45YzkzNzM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbmlvYnVmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL25pb2J1Zi5jCkBAIC0yOTUsNyArMjk1LDYgQEAKIAl9CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY191bnJlZ2lzdGVyX2J1bGspOwogCiBzdGF0aWMgdm9pZCBwdGxycGNfYXRfc2V0X3JlcGx5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBpbnQgZmxhZ3MpCiB7CkBAIC0zOTgsNyArMzk3LDggQEAKIAlsdXN0cmVfbXNnX3NldF9zdGF0dXMocmVxLT5ycV9yZXBtc2csCiAJCQkgICAgICBwdGxycGNfc3RhdHVzX2h0b24ocmVxLT5ycV9zdGF0dXMpKTsKIAlsdXN0cmVfbXNnX3NldF9vcGMocmVxLT5ycV9yZXBtc2csCi0JCXJlcS0+cnFfcmVxbXNnID8gbHVzdHJlX21zZ19nZXRfb3BjKHJlcS0+cnFfcmVxbXNnKSA6IDApOworCQkJICAgcmVxLT5ycV9yZXFtc2cgPworCQkJICAgbHVzdHJlX21zZ19nZXRfb3BjKHJlcS0+cnFfcmVxbXNnKSA6IDApOwogCiAJdGFyZ2V0X3BhY2tfcG9vbF9yZXBseShyZXEpOwogCkBAIC00MzMsNyArNDMzLDYgQEAKIAlwdGxycGNfY29ubmVjdGlvbl9wdXQoY29ubik7CiAJcmV0dXJuIHJjOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfc2VuZF9yZXBseSk7CiAKIGludCBwdGxycGNfcmVwbHkoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCiB7CkBAIC00NDEsNyArNDQwLDYgQEAKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIHB0bHJwY19zZW5kX3JlcGx5KHJlcSwgMCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19yZXBseSk7CiAKIC8qKgogICogRm9yIHJlcXVlc3QgXGEgcmVxIHNlbmQgYW4gZXJyb3IgcmVwbHkgYmFjay4gQ3JlYXRlIGVtcHR5CkBAIC00NjgsMTMgKzQ2NiwxMSBAQAogCXJjID0gcHRscnBjX3NlbmRfcmVwbHkocmVxLCBtYXlfYmVfZGlmZmljdWx0KTsKIAlyZXR1cm4gcmM7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19zZW5kX2Vycm9yKTsKIAogaW50IHB0bHJwY19lcnJvcihzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKIHsKIAlyZXR1cm4gcHRscnBjX3NlbmRfZXJyb3IocmVxLCAwKTsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX2Vycm9yKTsKIAogLyoqCiAgKiBTZW5kIHJlcXVlc3QgXGEgcmVxdWVzdC4KQEAgLTQ5MCw3ICs0ODYsOCBAQAogCXN0cnVjdCBwdGxycGNfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKIAlsbmV0X2hhbmRsZV9tZV90IHJlcGx5X21lX2g7CiAJbG5ldF9tZF90IHJlcGx5X21kOwotCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQgPSByZXF1ZXN0LT5ycV9pbXBvcnQtPmltcF9vYmQ7CisJc3RydWN0IG9iZF9pbXBvcnQgKmltcCA9IHJlcXVlc3QtPnJxX2ltcG9ydDsKKwlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gaW1wLT5pbXBfb2JkOwogCiAJaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX1BUTFJQQ19EUk9QX1JQQykpCiAJCXJldHVybiAwOwpAQCAtNTAzLDcgKzUwMCw3IEBACiAJICovCiAJTEFTU0VSVCghcmVxdWVzdC0+cnFfcmVjZWl2aW5nX3JlcGx5KTsKIAlMQVNTRVJUKCEoKGx1c3RyZV9tc2dfZ2V0X2ZsYWdzKHJlcXVlc3QtPnJxX3JlcW1zZykgJiBNU0dfUkVQTEFZKSAmJgotCQkgIChyZXF1ZXN0LT5ycV9pbXBvcnQtPmltcF9zdGF0ZSA9PSBMVVNUUkVfSU1QX0ZVTEwpKSk7CisJCSAgKGltcC0+aW1wX3N0YXRlID09IExVU1RSRV9JTVBfRlVMTCkpKTsKIAogCWlmICh1bmxpa2VseShvYmQgJiYgb2JkLT5vYmRfZmFpbCkpIHsKIAkJQ0RFQlVHKERfSEEsICJtdXRpbmcgcnBjIGZvciBmYWlsZWQgaW1wIG9iZCAlc1xuIiwKQEAgLTUxNiwxNSArNTEzLDIyIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWNvbm5lY3Rpb24gPSByZXF1ZXN0LT5ycV9pbXBvcnQtPmltcF9jb25uZWN0aW9uOworCWNvbm5lY3Rpb24gPSBpbXAtPmltcF9jb25uZWN0aW9uOwogCiAJbHVzdHJlX21zZ19zZXRfaGFuZGxlKHJlcXVlc3QtPnJxX3JlcW1zZywKLQkJCSAgICAgICZyZXF1ZXN0LT5ycV9pbXBvcnQtPmltcF9yZW1vdGVfaGFuZGxlKTsKKwkJCSAgICAgICZpbXAtPmltcF9yZW1vdGVfaGFuZGxlKTsKIAlsdXN0cmVfbXNnX3NldF90eXBlKHJlcXVlc3QtPnJxX3JlcW1zZywgUFRMX1JQQ19NU0dfUkVRVUVTVCk7Ci0JbHVzdHJlX21zZ19zZXRfY29ubl9jbnQocmVxdWVzdC0+cnFfcmVxbXNnLAotCQkJCXJlcXVlc3QtPnJxX2ltcG9ydC0+aW1wX2Nvbm5fY250KTsKLQlsdXN0cmVfbXNnaGRyX3NldF9mbGFncyhyZXF1ZXN0LT5ycV9yZXFtc2csCi0JCQkJcmVxdWVzdC0+cnFfaW1wb3J0LT5pbXBfbXNnaGRyX2ZsYWdzKTsKKwlsdXN0cmVfbXNnX3NldF9jb25uX2NudChyZXF1ZXN0LT5ycV9yZXFtc2csIGltcC0+aW1wX2Nvbm5fY250KTsKKwlsdXN0cmVfbXNnaGRyX3NldF9mbGFncyhyZXF1ZXN0LT5ycV9yZXFtc2csIGltcC0+aW1wX21zZ2hkcl9mbGFncyk7CisKKwkvKioKKwkgKiBGb3IgZW5hYmxlZCBBVCBhbGwgcmVxdWVzdCBzaG91bGQgaGF2ZSBBVF9TVVBQT1JUIGluIHRoZQorCSAqIEZVTEwgaW1wb3J0IHN0YXRlIHdoZW4gT0JEX0NPTk5FQ1RfQVQgaXMgc2V0CisJICovCisJTEFTU0VSVChBVF9PRkYgfHwgaW1wLT5pbXBfc3RhdGUgIT0gTFVTVFJFX0lNUF9GVUxMIHx8CisJCShpbXAtPmltcF9tc2doZHJfZmxhZ3MgJiBNU0dIRFJfQVRfU1VQUE9SVCkgfHwKKwkJIShpbXAtPmltcF9jb25uZWN0X2RhdGEub2NkX2Nvbm5lY3RfZmxhZ3MgJgorCQlPQkRfQ09OTkVDVF9BVCkpOwogCiAJaWYgKHJlcXVlc3QtPnJxX3Jlc2VuZCkKIAkJbHVzdHJlX21zZ19hZGRfZmxhZ3MocmVxdWVzdC0+cnFfcmVxbXNnLCBNU0dfUkVTRU5UKTsKQEAgLTYyOCw3ICs2MzIsNyBAQAogCXB0bHJwY19yZXF1ZXN0X2FkZHJlZihyZXF1ZXN0KTsKIAlpZiAob2JkICYmIG9iZC0+b2JkX3N2Y19zdGF0cykKIAkJbHByb2Nmc19jb3VudGVyX2FkZChvYmQtPm9iZF9zdmNfc3RhdHMsIFBUTFJQQ19SRVFBQ1RJVkVfQ05UUiwKLQkJCWF0b21pY19yZWFkKCZyZXF1ZXN0LT5ycV9pbXBvcnQtPmltcF9pbmZsaWdodCkpOworCQkJYXRvbWljX3JlYWQoJmltcC0+aW1wX2luZmxpZ2h0KSk7CiAKIAlPQkRfRkFJTF9USU1FT1VUKE9CRF9GQUlMX1BUTFJQQ19ERUxBWV9TRU5ELCByZXF1ZXN0LT5ycV90aW1lb3V0ICsgNSk7CiAKQEAgLTY0MCw3ICs2NDQsNyBAQAogCXJlcXVlc3QtPnJxX2RlYWRsaW5lID0gcmVxdWVzdC0+cnFfc2VudCArIHJlcXVlc3QtPnJxX3RpbWVvdXQgKwogCQlwdGxycGNfYXRfZ2V0X25ldF9sYXRlbmN5KHJlcXVlc3QpOwogCi0JcHRscnBjX3Bpbmdlcl9zZW5kaW5nX29uX2ltcG9ydChyZXF1ZXN0LT5ycV9pbXBvcnQpOworCXB0bHJwY19waW5nZXJfc2VuZGluZ19vbl9pbXBvcnQoaW1wKTsKIAogCURFQlVHX1JFUShEX0lORk8sIHJlcXVlc3QsICJzZW5kIGZsZz0leCIsCiAJCSAgbHVzdHJlX21zZ19nZXRfZmxhZ3MocmVxdWVzdC0+cnFfcmVxbXNnKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGFja19nZW5lcmljLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGFja19nZW5lcmljLmMKaW5kZXggYjUxNGYxOC4uODcxNzY4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3BhY2tfZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wYWNrX2dlbmVyaWMuYwpAQCAtNTAsMzYgKzUwLDM0IEBACiAKICNpbmNsdWRlICJwdGxycGNfaW50ZXJuYWwuaCIKIAotc3RhdGljIGlubGluZSBpbnQgbHVzdHJlX21zZ19oZHJfc2l6ZV92MihpbnQgY291bnQpCitzdGF0aWMgaW5saW5lIHUzMiBsdXN0cmVfbXNnX2hkcl9zaXplX3YyKHUzMiBjb3VudCkKIHsKIAlyZXR1cm4gY2ZzX3NpemVfcm91bmQob2Zmc2V0b2Yoc3RydWN0IGx1c3RyZV9tc2dfdjIsCiAJCQkJICAgICAgIGxtX2J1ZmxlbnNbY291bnRdKSk7CiB9CiAKLWludCBsdXN0cmVfbXNnX2hkcl9zaXplKF9fdTMyIG1hZ2ljLCBpbnQgY291bnQpCit1MzIgbHVzdHJlX21zZ19oZHJfc2l6ZShfX3UzMiBtYWdpYywgdTMyIGNvdW50KQogewogCXN3aXRjaCAobWFnaWMpIHsKIAljYXNlIExVU1RSRV9NU0dfTUFHSUNfVjI6CiAJCXJldHVybiBsdXN0cmVfbXNnX2hkcl9zaXplX3YyKGNvdW50KTsKIAlkZWZhdWx0OgogCQlMQVNTRVJURigwLCAiaW5jb3JyZWN0IG1lc3NhZ2UgbWFnaWM6ICUwOHhcbiIsIG1hZ2ljKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19oZHJfc2l6ZSk7CiAKIHZvaWQgcHRscnBjX2J1Zl9zZXRfc3dhYmJlZChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgY29uc3QgaW50IGlub3V0LAotCQkJICAgIGludCBpbmRleCkKKwkJCSAgICB1MzIgaW5kZXgpCiB7CiAJaWYgKGlub3V0KQogCQlsdXN0cmVfc2V0X3JlcV9zd2FiYmVkKHJlcSwgaW5kZXgpOwogCWVsc2UKIAkJbHVzdHJlX3NldF9yZXBfc3dhYmJlZChyZXEsIGluZGV4KTsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX2J1Zl9zZXRfc3dhYmJlZCk7CiAKIGludCBwdGxycGNfYnVmX25lZWRfc3dhYihzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgY29uc3QgaW50IGlub3V0LAotCQkJIGludCBpbmRleCkKKwkJCSB1MzIgaW5kZXgpCiB7CiAJaWYgKGlub3V0KQogCQlyZXR1cm4gKHB0bHJwY19yZXFfbmVlZF9zd2FiKHJlcSkgJiYKQEAgLTg4LDEyICs4NiwxMSBAQAogCQlyZXR1cm4gKHB0bHJwY19yZXBfbmVlZF9zd2FiKHJlcSkgJiYKIAkJCSFsdXN0cmVfcmVwX3N3YWJiZWQocmVxLCBpbmRleCkpOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfYnVmX25lZWRfc3dhYik7CiAKIC8qIGVhcmx5IHJlcGx5IHNpemUgKi8KLWludCBsdXN0cmVfbXNnX2Vhcmx5X3NpemUodm9pZCkKK3UzMiBsdXN0cmVfbXNnX2Vhcmx5X3NpemUodm9pZCkKIHsKLQlzdGF0aWMgaW50IHNpemU7CisJc3RhdGljIHUzMiBzaXplOwogCiAJaWYgKCFzaXplKSB7CiAJCS8qIEFsd2F5cyByZXBseSBvbGQgcHRscnBjX2JvZHlfdjIgdG8ga2VlcCBpbnRlcm9wZXJhYmlsaXR5CkBAIC0xMTEsOSArMTA4LDkgQEAKIH0KIEVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19lYXJseV9zaXplKTsKIAotaW50IGx1c3RyZV9tc2dfc2l6ZV92MihpbnQgY291bnQsIF9fdTMyICpsZW5ndGhzKQordTMyIGx1c3RyZV9tc2dfc2l6ZV92MihpbnQgY291bnQsIF9fdTMyICpsZW5ndGhzKQogewotCWludCBzaXplOworCXUzMiBzaXplOwogCWludCBpOwogCiAJc2l6ZSA9IGx1c3RyZV9tc2dfaGRyX3NpemVfdjIoY291bnQpOwpAQCAtMTMxLDcgKzEyOCw3IEBACiAgKiAgICAgICB0YXJnZXQgdGhlbiB0aGUgZmlyc3QgYnVmZmVyIHdpbGwgYmUgc3RyaXBwZWQgYmVjYXVzZSB0aGUgcHRscnBjCiAgKiAgICAgICBkYXRhIGlzIHBhcnQgb2YgdGhlIGx1c3RyZV9tc2dfdjEgaGVhZGVyLiBiPTE0MDQzCiAgKi8KLWludCBsdXN0cmVfbXNnX3NpemUoX191MzIgbWFnaWMsIGludCBjb3VudCwgX191MzIgKmxlbnMpCit1MzIgbHVzdHJlX21zZ19zaXplKF9fdTMyIG1hZ2ljLCBpbnQgY291bnQsIF9fdTMyICpsZW5zKQogewogCV9fdTMyIHNpemVbXSA9IHsgc2l6ZW9mKHN0cnVjdCBwdGxycGNfYm9keSkgfTsKIApAQCAtMTQ4LDE1ICsxNDUsMTQgQEAKIAkJcmV0dXJuIGx1c3RyZV9tc2dfc2l6ZV92Mihjb3VudCwgbGVucyk7CiAJZGVmYXVsdDoKIAkJTEFTU0VSVEYoMCwgImluY29ycmVjdCBtZXNzYWdlIG1hZ2ljOiAlMDh4XG4iLCBtYWdpYyk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfc2l6ZSk7CiAKIC8qIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHNpemUgb2YgYSBidWZmZXIgdGhhdCB3YXMgYWxyZWFkeSBwYWNrZWQKICAqIGFuZCB3aWxsIGNvcnJlY3RseSBoYW5kbGUgdGhlIGRpZmZlcmVudCBtZXNzYWdlIGZvcm1hdHMuCiAgKi8KLWludCBsdXN0cmVfcGFja2VkX21zZ19zaXplKHN0cnVjdCBsdXN0cmVfbXNnICptc2cpCit1MzIgbHVzdHJlX3BhY2tlZF9tc2dfc2l6ZShzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKQogewogCXN3aXRjaCAobXNnLT5sbV9tYWdpYykgewogCWNhc2UgTFVTVFJFX01TR19NQUdJQ19WMjoKQEAgLTE2Niw3ICsxNjIsNiBAQAogCQlyZXR1cm4gMDsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9wYWNrZWRfbXNnX3NpemUpOwogCiB2b2lkIGx1c3RyZV9pbml0X21zZ192MihzdHJ1Y3QgbHVzdHJlX21zZ192MiAqbXNnLCBpbnQgY291bnQsIF9fdTMyICpsZW5zLAogCQkJY2hhciAqKmJ1ZnMpCkBAIC0yMjcsNyArMjIyLDYgQEAKIAkvKiBvbmx5IHVzZSBuZXcgZm9ybWF0LCB3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCAxLjQgKi8KIAlyZXR1cm4gbHVzdHJlX3BhY2tfcmVxdWVzdF92MihyZXEsIGNvdW50LCBsZW5zLCBidWZzKTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3BhY2tfcmVxdWVzdCk7CiAKICNpZiBSU19ERUJVRwogTElTVF9IRUFEKHB0bHJwY19yc19kZWJ1Z19scnUpOwpAQCAtMzY5LDcgKzM2Myw2IEBACiAJCSAgICAgICBsdXN0cmVfbXNnX3NpemUocmVxLT5ycV9yZXFtc2ctPmxtX21hZ2ljLCBjb3VudCwgbGVucykpOwogCXJldHVybiByYzsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3BhY2tfcmVwbHlfZmxhZ3MpOwogCiBpbnQgbHVzdHJlX3BhY2tfcmVwbHkoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIGludCBjb3VudCwgX191MzIgKmxlbnMsCiAJCSAgICAgIGNoYXIgKipidWZzKQpAQCAtMzc4LDExICszNzEsOSBAQAogfQogRVhQT1JUX1NZTUJPTChsdXN0cmVfcGFja19yZXBseSk7CiAKLXZvaWQgKmx1c3RyZV9tc2dfYnVmX3YyKHN0cnVjdCBsdXN0cmVfbXNnX3YyICptLCBpbnQgbiwgaW50IG1pbl9zaXplKQordm9pZCAqbHVzdHJlX21zZ19idWZfdjIoc3RydWN0IGx1c3RyZV9tc2dfdjIgKm0sIHUzMiBuLCB1MzIgbWluX3NpemUpCiB7Ci0JaW50IGksIG9mZnNldCwgYnVmbGVuLCBidWZjb3VudDsKLQotCUxBU1NFUlQobiA+PSAwKTsKKwl1MzIgaSwgb2Zmc2V0LCBidWZsZW4sIGJ1ZmNvdW50OwogCiAJYnVmY291bnQgPSBtLT5sbV9idWZjb3VudDsKIAlpZiAodW5saWtlbHkobiA+PSBidWZjb3VudCkpIHsKQEAgLTQwNiw3ICszOTcsNyBAQAogCXJldHVybiAoY2hhciAqKW0gKyBvZmZzZXQ7CiB9CiAKLXZvaWQgKmx1c3RyZV9tc2dfYnVmKHN0cnVjdCBsdXN0cmVfbXNnICptLCBpbnQgbiwgaW50IG1pbl9zaXplKQordm9pZCAqbHVzdHJlX21zZ19idWYoc3RydWN0IGx1c3RyZV9tc2cgKm0sIHUzMiBuLCB1MzIgbWluX3NpemUpCiB7CiAJc3dpdGNoIChtLT5sbV9tYWdpYykgewogCWNhc2UgTFVTVFJFX01TR19NQUdJQ19WMjoKQEAgLTQxOSw3ICs0MTAsNyBAQAogfQogRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX2J1Zik7CiAKLXN0YXRpYyBpbnQgbHVzdHJlX3Nocmlua19tc2dfdjIoc3RydWN0IGx1c3RyZV9tc2dfdjIgKm1zZywgaW50IHNlZ21lbnQsCitzdGF0aWMgaW50IGx1c3RyZV9zaHJpbmtfbXNnX3YyKHN0cnVjdCBsdXN0cmVfbXNnX3YyICptc2csIHUzMiBzZWdtZW50LAogCQkJCXVuc2lnbmVkIGludCBuZXdsZW4sIGludCBtb3ZlX2RhdGEpCiB7CiAJY2hhciAqdGFpbCA9IE5VTEwsICpuZXdwb3M7CkBAIC00OTMsNyArNDg0LDYgQEAKIAogCXNwdGxycGNfc3ZjX2ZyZWVfcnMocnMpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfZnJlZV9yZXBseV9zdGF0ZSk7CiAKIHN0YXRpYyBpbnQgbHVzdHJlX3VucGFja19tc2dfdjIoc3RydWN0IGx1c3RyZV9tc2dfdjIgKm0sIGludCBsZW4pCiB7CkBAIC01ODEsNyArNTcxLDYgQEAKIAl9CiAJcmV0dXJuIHJjOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfdW5wYWNrX3JlcV9tc2cpOwogCiBpbnQgcHRscnBjX3VucGFja19yZXBfbXNnKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBpbnQgbGVuKQogewpAQCAtNTk0LDcgKzU4Myw2IEBACiAJfQogCXJldHVybiByYzsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX3VucGFja19yZXBfbXNnKTsKIAogc3RhdGljIGlubGluZSBpbnQgbHVzdHJlX3VucGFja19wdGxycGNfYm9keV92MihzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwKIAkJCQkJICAgICAgIGNvbnN0IGludCBpbm91dCwgaW50IG9mZnNldCkKQEAgLTY0Nyw3ICs2MzUsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSBpbnQgbHVzdHJlX21zZ19idWZsZW5fdjIoc3RydWN0IGx1c3RyZV9tc2dfdjIgKm0sIGludCBuKQorc3RhdGljIGlubGluZSB1MzIgbHVzdHJlX21zZ19idWZsZW5fdjIoc3RydWN0IGx1c3RyZV9tc2dfdjIgKm0sIHUzMiBuKQogewogCWlmIChuID49IG0tPmxtX2J1ZmNvdW50KQogCQlyZXR1cm4gMDsKQEAgLTY2MiwxNCArNjUwLDE0IEBACiAgKgogICogcmV0dXJucyB6ZXJvIGZvciBub24tZXhpc3RlbnQgbWVzc2FnZSBpbmRpY2VzCiAgKi8KLWludCBsdXN0cmVfbXNnX2J1ZmxlbihzdHJ1Y3QgbHVzdHJlX21zZyAqbSwgaW50IG4pCit1MzIgbHVzdHJlX21zZ19idWZsZW4oc3RydWN0IGx1c3RyZV9tc2cgKm0sIHUzMiBuKQogewogCXN3aXRjaCAobS0+bG1fbWFnaWMpIHsKIAljYXNlIExVU1RSRV9NU0dfTUFHSUNfVjI6CiAJCXJldHVybiBsdXN0cmVfbXNnX2J1Zmxlbl92MihtLCBuKTsKIAlkZWZhdWx0OgogCQlDRVJST1IoImluY29ycmVjdCBtZXNzYWdlIG1hZ2ljOiAlMDh4XG4iLCBtLT5sbV9tYWdpYyk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfYnVmbGVuKTsKQEAgLTY3NywyMyArNjY1LDIyIEBACiAvKiBOQiByZXR1cm4gdGhlIGJ1ZmNvdW50IGZvciBsdXN0cmVfbXNnX3YyIGZvcm1hdCwgc28gaWYgbWVzc2FnZSBpcyBwYWNrZWQKICAqIGluIFYxIGZvcm1hdCwgdGhlIHJlc3VsdCBpcyBvbmUgYmlnZ2VyLiAoYWRkIHN0cnVjdCBwdGxycGNfYm9keSkuCiAgKi8KLWludCBsdXN0cmVfbXNnX2J1ZmNvdW50KHN0cnVjdCBsdXN0cmVfbXNnICptKQordTMyIGx1c3RyZV9tc2dfYnVmY291bnQoc3RydWN0IGx1c3RyZV9tc2cgKm0pCiB7CiAJc3dpdGNoIChtLT5sbV9tYWdpYykgewogCWNhc2UgTFVTVFJFX01TR19NQUdJQ19WMjoKIAkJcmV0dXJuIG0tPmxtX2J1ZmNvdW50OwogCWRlZmF1bHQ6CiAJCUNFUlJPUigiaW5jb3JyZWN0IG1lc3NhZ2UgbWFnaWM6ICUwOHhcbiIsIG0tPmxtX21hZ2ljKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19idWZjb3VudCk7CiAKLWNoYXIgKmx1c3RyZV9tc2dfc3RyaW5nKHN0cnVjdCBsdXN0cmVfbXNnICptLCBpbnQgaW5kZXgsIGludCBtYXhfbGVuKQorY2hhciAqbHVzdHJlX21zZ19zdHJpbmcoc3RydWN0IGx1c3RyZV9tc2cgKm0sIHUzMiBpbmRleCwgdTMyIG1heF9sZW4pCiB7CiAJLyogbWF4X2xlbiA9PSAwIG1lYW5zIHRoZSBzdHJpbmcgc2hvdWxkIGZpbGwgdGhlIGJ1ZmZlciAqLwogCWNoYXIgKnN0cjsKLQlpbnQgc2xlbiwgYmxlbjsKKwl1MzIgc2xlbiwgYmxlbjsKIAogCXN3aXRjaCAobS0+bG1fbWFnaWMpIHsKIAljYXNlIExVU1RSRV9NU0dfTUFHSUNfVjI6CkBAIC03MzEsMTEgKzcxOCwxMCBAQAogCiAJcmV0dXJuIHN0cjsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19zdHJpbmcpOwogCiAvKiBXcmFwIHVwIHRoZSBub3JtYWwgZml4ZWQgbGVuZ3RoIGNhc2VzICovCi1zdGF0aWMgaW5saW5lIHZvaWQgKl9fbHVzdHJlX3N3YWJfYnVmKHN0cnVjdCBsdXN0cmVfbXNnICptc2csIGludCBpbmRleCwKLQkJCQkgICAgICBpbnQgbWluX3NpemUsIHZvaWQgKnN3YWJiZXIpCitzdGF0aWMgaW5saW5lIHZvaWQgKl9fbHVzdHJlX3N3YWJfYnVmKHN0cnVjdCBsdXN0cmVfbXNnICptc2csIHUzMiBpbmRleCwKKwkJCQkgICAgICB1MzIgbWluX3NpemUsIHZvaWQgKnN3YWJiZXIpCiB7CiAJdm9pZCAqcHRyID0gTlVMTDsKIApAQCAtODA0LDcgKzc5MCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfZ2V0X2ZsYWdzKTsKIAotdm9pZCBsdXN0cmVfbXNnX2FkZF9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBpbnQgZmxhZ3MpCit2b2lkIGx1c3RyZV9tc2dfYWRkX2ZsYWdzKHN0cnVjdCBsdXN0cmVfbXNnICptc2csIHUzMiBmbGFncykKIHsKIAlzd2l0Y2ggKG1zZy0+bG1fbWFnaWMpIHsKIAljYXNlIExVU1RSRV9NU0dfTUFHSUNfVjI6IHsKQEAgLTgyMCw3ICs4MDYsNyBAQAogfQogRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX2FkZF9mbGFncyk7CiAKLXZvaWQgbHVzdHJlX21zZ19zZXRfZmxhZ3Moc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgaW50IGZsYWdzKQordm9pZCBsdXN0cmVfbXNnX3NldF9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCB1MzIgZmxhZ3MpCiB7CiAJc3dpdGNoIChtc2ctPmxtX21hZ2ljKSB7CiAJY2FzZSBMVVNUUkVfTVNHX01BR0lDX1YyOiB7CkBAIC04MzQsOSArODIwLDggQEAKIAkJTEFTU0VSVEYoMCwgImluY29ycmVjdCBtZXNzYWdlIG1hZ2ljOiAlMDh4XG4iLCBtc2ctPmxtX21hZ2ljKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfc2V0X2ZsYWdzKTsKIAotdm9pZCBsdXN0cmVfbXNnX2NsZWFyX2ZsYWdzKHN0cnVjdCBsdXN0cmVfbXNnICptc2csIGludCBmbGFncykKK3ZvaWQgbHVzdHJlX21zZ19jbGVhcl9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCB1MzIgZmxhZ3MpCiB7CiAJc3dpdGNoIChtc2ctPmxtX21hZ2ljKSB7CiAJY2FzZSBMVVNUUkVfTVNHX01BR0lDX1YyOiB7CkBAIC04NjgsOSArODUzLDggQEAKIAkJcmV0dXJuIDA7CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX2dldF9vcF9mbGFncyk7CiAKLXZvaWQgbHVzdHJlX21zZ19hZGRfb3BfZmxhZ3Moc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgaW50IGZsYWdzKQordm9pZCBsdXN0cmVfbXNnX2FkZF9vcF9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCB1MzIgZmxhZ3MpCiB7CiAJc3dpdGNoIChtc2ctPmxtX21hZ2ljKSB7CiAJY2FzZSBMVVNUUkVfTVNHX01BR0lDX1YyOiB7CkBAIC05MDMsNyArODg3LDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX2dldF9oYW5kbGUpOwogCiBfX3UzMiBsdXN0cmVfbXNnX2dldF90eXBlKHN0cnVjdCBsdXN0cmVfbXNnICptc2cpCiB7CkBAIC05MjQsNyArOTA3LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19nZXRfdHlwZSk7CiAKLXZvaWQgbHVzdHJlX21zZ19hZGRfdmVyc2lvbihzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBpbnQgdmVyc2lvbikKK3ZvaWQgbHVzdHJlX21zZ19hZGRfdmVyc2lvbihzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCB1MzIgdmVyc2lvbikKIHsKIAlzd2l0Y2ggKG1zZy0+bG1fbWFnaWMpIHsKIAljYXNlIExVU1RSRV9NU0dfTUFHSUNfVjI6IHsKQEAgLTkzOCw3ICs5MjEsNiBAQAogCQlMQVNTRVJURigwLCAiaW5jb3JyZWN0IG1lc3NhZ2UgbWFnaWM6ICUwOHhcbiIsIG1zZy0+bG1fbWFnaWMpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19hZGRfdmVyc2lvbik7CiAKIF9fdTMyIGx1c3RyZV9tc2dfZ2V0X29wYyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKQogewpAQCAtMTA1NSw3ICsxMDM3LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX2dldF9zbHYpOwogCiB2b2lkIGx1c3RyZV9tc2dfc2V0X3NsdihzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBfX3U2NCBzbHYpCiB7CkBAIC0xMDc1LDcgKzEwNTYsNiBAQAogCQlyZXR1cm47CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX3NldF9zbHYpOwogCiBfX3UzMiBsdXN0cmVfbXNnX2dldF9saW1pdChzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKQogewpAQCAtMTA5NCw3ICsxMDc0LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX2dldF9saW1pdCk7CiAKIHZvaWQgbHVzdHJlX21zZ19zZXRfbGltaXQoc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgX191NjQgbGltaXQpCiB7CkBAIC0xMTE0LDcgKzEwOTMsNiBAQAogCQlyZXR1cm47CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX3NldF9saW1pdCk7CiAKIF9fdTMyIGx1c3RyZV9tc2dfZ2V0X2Nvbm5fY250KHN0cnVjdCBsdXN0cmVfbXNnICptc2cpCiB7CkBAIC0xMTQ1LDcgKzExMjMsNiBAQAogCQlyZXR1cm4gMDsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfZ2V0X21hZ2ljKTsKIAogX191MzIgbHVzdHJlX21zZ19nZXRfdGltZW91dChzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKQogewpAQCAtMTIwMyw4ICsxMTgwLDkgQEAKIAkJdW5zaWduZWQgaW50IGhzaXplID0gNDsKIAogCQljZnNfY3J5cHRvX2hhc2hfZGlnZXN0KENGU19IQVNIX0FMR19DUkMzMiwgKHVuc2lnbmVkIGNoYXIgKilwYiwKLQkJCQkgICBsdXN0cmVfbXNnX2J1Zmxlbihtc2csIE1TR19QVExSUENfQk9EWV9PRkYpLAotCQkJCSAgIE5VTEwsIDAsICh1bnNpZ25lZCBjaGFyICopJmNyYywgJmhzaXplKTsKKwkJCQkgICAgICAgbHVzdHJlX21zZ19idWZsZW4obXNnLAorCQkJCQkJCSBNU0dfUFRMUlBDX0JPRFlfT0ZGKSwKKwkJCQkgICAgICAgTlVMTCwgMCwgKHVuc2lnbmVkIGNoYXIgKikmY3JjLCAmaHNpemUpOwogCQlyZXR1cm4gY3JjOwogCX0KIAlkZWZhdWx0OgpAQCAtMTIyNyw3ICsxMjA1LDYgQEAKIAkJTEFTU0VSVEYoMCwgImluY29ycmVjdCBtZXNzYWdlIG1hZ2ljOiAlMDh4XG4iLCBtc2ctPmxtX21hZ2ljKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfc2V0X2hhbmRsZSk7CiAKIHZvaWQgbHVzdHJlX21zZ19zZXRfdHlwZShzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBfX3UzMiB0eXBlKQogewpAQCAtMTI0Myw3ICsxMjIwLDYgQEAKIAkJTEFTU0VSVEYoMCwgImluY29ycmVjdCBtZXNzYWdlIG1hZ2ljOiAlMDh4XG4iLCBtc2ctPmxtX21hZ2ljKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfc2V0X3R5cGUpOwogCiB2b2lkIGx1c3RyZV9tc2dfc2V0X29wYyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBfX3UzMiBvcGMpCiB7CkBAIC0xMjU5LDcgKzEyMzUsNiBAQAogCQlMQVNTRVJURigwLCAiaW5jb3JyZWN0IG1lc3NhZ2UgbWFnaWM6ICUwOHhcbiIsIG1zZy0+bG1fbWFnaWMpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19zZXRfb3BjKTsKIAogdm9pZCBsdXN0cmVfbXNnX3NldF92ZXJzaW9ucyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBfX3U2NCAqdmVyc2lvbnMpCiB7CkBAIC0xMzI2LDcgKzEzMDEsNiBAQAogCQlMQVNTRVJURigwLCAiaW5jb3JyZWN0IG1lc3NhZ2UgbWFnaWM6ICUwOHhcbiIsIG1zZy0+bG1fbWFnaWMpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19zZXRfY29ubl9jbnQpOwogCiB2b2lkIGx1c3RyZV9tc2dfc2V0X3RpbWVvdXQoc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgX191MzIgdGltZW91dCkKIHsKQEAgLTEzNzcsNyArMTM1MSw3IEBACiAJCUxBU1NFUlRGKHBiLCAiaW52YWxpZCBtc2cgJXA6IG5vIHB0bHJwYyBib2R5IVxuIiwgbXNnKTsKIAogCQlpZiAoam9iaWQpCi0JCQltZW1jcHkocGItPnBiX2pvYmlkLCBqb2JpZCwgSk9CU1RBVFNfSk9CSURfU0laRSk7CisJCQltZW1jcHkocGItPnBiX2pvYmlkLCBqb2JpZCwgTFVTVFJFX0pPQklEX1NJWkUpOwogCQllbHNlIGlmIChwYi0+cGJfam9iaWRbMF0gPT0gJ1wwJykKIAkJCWx1c3RyZV9nZXRfam9iaWQocGItPnBiX2pvYmlkKTsKIAkJcmV0dXJuOwpAQCAtMTQ5MSw3ICsxNDY1LDYgQEAKIAkgKi8KIAlDTEFTU0VSVChvZmZzZXRvZih0eXBlb2YoKmIpLCBwYl9qb2JpZCkgIT0gMCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX3B0bHJwY19ib2R5KTsKIAogdm9pZCBsdXN0cmVfc3dhYl9jb25uZWN0KHN0cnVjdCBvYmRfY29ubmVjdF9kYXRhICpvY2QpCiB7CkBAIC0xNTkxLDcgKzE1NjQsNiBAQAogCUNMQVNTRVJUKG9mZnNldG9mKHR5cGVvZigqb3MpLCBvc19zcGFyZTgpICE9IDApOwogCUNMQVNTRVJUKG9mZnNldG9mKHR5cGVvZigqb3MpLCBvc19zcGFyZTkpICE9IDApOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9vYmRfc3RhdGZzKTsKIAogdm9pZCBsdXN0cmVfc3dhYl9vYmRfaW9vYmooc3RydWN0IG9iZF9pb29iaiAqaW9vKQogewpAQCAtMTU5OSwzMyArMTU3MSwyOCBAQAogCV9fc3dhYjMycygmaW9vLT5pb29fbWF4X2Jydyk7CiAJX19zd2FiMzJzKCZpb28tPmlvb19idWZjbnQpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9vYmRfaW9vYmopOwogCiB2b2lkIGx1c3RyZV9zd2FiX25pb2J1Zl9yZW1vdGUoc3RydWN0IG5pb2J1Zl9yZW1vdGUgKm5icikKIHsKLQlfX3N3YWI2NHMoJm5ici0+b2Zmc2V0KTsKLQlfX3N3YWIzMnMoJm5ici0+bGVuKTsKLQlfX3N3YWIzMnMoJm5ici0+ZmxhZ3MpOworCV9fc3dhYjY0cygmbmJyLT5ybmJfb2Zmc2V0KTsKKwlfX3N3YWIzMnMoJm5ici0+cm5iX2xlbik7CisJX19zd2FiMzJzKCZuYnItPnJuYl9mbGFncyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX25pb2J1Zl9yZW1vdGUpOwogCiB2b2lkIGx1c3RyZV9zd2FiX29zdF9ib2R5KHN0cnVjdCBvc3RfYm9keSAqYikKIHsKIAlsdXN0cmVfc3dhYl9vYmRvKCZiLT5vYSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX29zdF9ib2R5KTsKIAogdm9pZCBsdXN0cmVfc3dhYl9vc3RfbGFzdF9pZCh1NjQgKmlkKQogewogCV9fc3dhYjY0cyhpZCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX29zdF9sYXN0X2lkKTsKIAogdm9pZCBsdXN0cmVfc3dhYl9nZW5lcmljXzMycyhfX3UzMiAqdmFsKQogewogCV9fc3dhYjMycyh2YWwpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9nZW5lcmljXzMycyk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfZ2xfZGVzYyh1bmlvbiBsZGxtX2dsX2Rlc2MgKmRlc2MpCiB7CkBAIC0xNjc0LDM3ICsxNjQxLDM2IEBACiAKIHZvaWQgbHVzdHJlX3N3YWJfbWR0X2JvZHkoc3RydWN0IG1kdF9ib2R5ICpiKQogewotCWx1c3RyZV9zd2FiX2x1X2ZpZCgmYi0+ZmlkMSk7Ci0JbHVzdHJlX3N3YWJfbHVfZmlkKCZiLT5maWQyKTsKKwlsdXN0cmVfc3dhYl9sdV9maWQoJmItPm1ib19maWQxKTsKKwlsdXN0cmVfc3dhYl9sdV9maWQoJmItPm1ib19maWQyKTsKIAkvKiBoYW5kbGUgaXMgb3BhcXVlICovCi0JX19zd2FiNjRzKCZiLT52YWxpZCk7Ci0JX19zd2FiNjRzKCZiLT5zaXplKTsKLQlfX3N3YWI2NHMoJmItPm10aW1lKTsKLQlfX3N3YWI2NHMoJmItPmF0aW1lKTsKLQlfX3N3YWI2NHMoJmItPmN0aW1lKTsKLQlfX3N3YWI2NHMoJmItPmJsb2Nrcyk7Ci0JX19zd2FiNjRzKCZiLT5pb2Vwb2NoKTsKLQlfX3N3YWI2NHMoJmItPnRfc3RhdGUpOwotCV9fc3dhYjMycygmYi0+ZnN1aWQpOwotCV9fc3dhYjMycygmYi0+ZnNnaWQpOwotCV9fc3dhYjMycygmYi0+Y2FwYWJpbGl0eSk7Ci0JX19zd2FiMzJzKCZiLT5tb2RlKTsKLQlfX3N3YWIzMnMoJmItPnVpZCk7Ci0JX19zd2FiMzJzKCZiLT5naWQpOwotCV9fc3dhYjMycygmYi0+ZmxhZ3MpOwotCV9fc3dhYjMycygmYi0+cmRldik7Ci0JX19zd2FiMzJzKCZiLT5ubGluayk7Ci0JQ0xBU1NFUlQob2Zmc2V0b2YodHlwZW9mKCpiKSwgdW51c2VkMikgIT0gMCk7Ci0JX19zd2FiMzJzKCZiLT5zdXBwZ2lkKTsKLQlfX3N3YWIzMnMoJmItPmVhZGF0YXNpemUpOwotCV9fc3dhYjMycygmYi0+YWNsc2l6ZSk7Ci0JX19zd2FiMzJzKCZiLT5tYXhfbWRzaXplKTsKLQlfX3N3YWIzMnMoJmItPm1heF9jb29raWVzaXplKTsKLQlfX3N3YWIzMnMoJmItPnVpZF9oKTsKLQlfX3N3YWIzMnMoJmItPmdpZF9oKTsKLQlDTEFTU0VSVChvZmZzZXRvZih0eXBlb2YoKmIpLCBwYWRkaW5nXzUpICE9IDApOworCV9fc3dhYjY0cygmYi0+bWJvX3ZhbGlkKTsKKwlfX3N3YWI2NHMoJmItPm1ib19zaXplKTsKKwlfX3N3YWI2NHMoJmItPm1ib19tdGltZSk7CisJX19zd2FiNjRzKCZiLT5tYm9fYXRpbWUpOworCV9fc3dhYjY0cygmYi0+bWJvX2N0aW1lKTsKKwlfX3N3YWI2NHMoJmItPm1ib19ibG9ja3MpOworCV9fc3dhYjY0cygmYi0+bWJvX2lvZXBvY2gpOworCV9fc3dhYjY0cygmYi0+bWJvX3Rfc3RhdGUpOworCV9fc3dhYjMycygmYi0+bWJvX2ZzdWlkKTsKKwlfX3N3YWIzMnMoJmItPm1ib19mc2dpZCk7CisJX19zd2FiMzJzKCZiLT5tYm9fY2FwYWJpbGl0eSk7CisJX19zd2FiMzJzKCZiLT5tYm9fbW9kZSk7CisJX19zd2FiMzJzKCZiLT5tYm9fdWlkKTsKKwlfX3N3YWIzMnMoJmItPm1ib19naWQpOworCV9fc3dhYjMycygmYi0+bWJvX2ZsYWdzKTsKKwlfX3N3YWIzMnMoJmItPm1ib19yZGV2KTsKKwlfX3N3YWIzMnMoJmItPm1ib19ubGluayk7CisJQ0xBU1NFUlQob2Zmc2V0b2YodHlwZW9mKCpiKSwgbWJvX3VudXNlZDIpICE9IDApOworCV9fc3dhYjMycygmYi0+bWJvX3N1cHBnaWQpOworCV9fc3dhYjMycygmYi0+bWJvX2VhZGF0YXNpemUpOworCV9fc3dhYjMycygmYi0+bWJvX2FjbHNpemUpOworCV9fc3dhYjMycygmYi0+bWJvX21heF9tZHNpemUpOworCV9fc3dhYjMycygmYi0+bWJvX21heF9jb29raWVzaXplKTsKKwlfX3N3YWIzMnMoJmItPm1ib191aWRfaCk7CisJX19zd2FiMzJzKCZiLT5tYm9fZ2lkX2gpOworCUNMQVNTRVJUKG9mZnNldG9mKHR5cGVvZigqYiksIG1ib19wYWRkaW5nXzUpICE9IDApOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9tZHRfYm9keSk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfbWR0X2lvZXBvY2goc3RydWN0IG1kdF9pb2Vwb2NoICpiKQogewpAQCAtMTcxMyw3ICsxNjc5LDYgQEAKIAkgX19zd2FiMzJzKCZiLT5mbGFncyk7CiAJIENMQVNTRVJUKG9mZnNldG9mKHR5cGVvZigqYiksIHBhZGRpbmcpICE9IDApOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9tZHRfaW9lcG9jaCk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfbWdzX3RhcmdldF9pbmZvKHN0cnVjdCBtZ3NfdGFyZ2V0X2luZm8gKm10aSkKIHsKQEAgLTE3MjksMTEgKzE2OTQsMTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTVRJX05JRFNfTUFYOyBpKyspCiAJCV9fc3dhYjY0cygmbXRpLT5tdGlfbmlkc1tpXSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX21nc190YXJnZXRfaW5mbyk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfbWdzX25pZHRibF9lbnRyeShzdHJ1Y3QgbWdzX25pZHRibF9lbnRyeSAqZW50cnkpCiB7Ci0JaW50IGk7CisJX191OCBpOwogCiAJX19zd2FiNjRzKCZlbnRyeS0+bW5lX3ZlcnNpb24pOwogCV9fc3dhYjMycygmZW50cnktPm1uZV9pbnN0YW5jZSk7CkBAIC0xNzYwLDE0ICsxNzI0LDEyIEBACiAJX19zd2FiMzJzKCZib2R5LT5tY2JfdW5pdHMpOwogCV9fc3dhYjE2cygmYm9keS0+bWNiX3R5cGUpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9tZ3NfY29uZmlnX2JvZHkpOwogCiB2b2lkIGx1c3RyZV9zd2FiX21nc19jb25maWdfcmVzKHN0cnVjdCBtZ3NfY29uZmlnX3JlcyAqYm9keSkKIHsKIAlfX3N3YWI2NHMoJmJvZHktPm1jcl9vZmZzZXQpOwogCV9fc3dhYjY0cygmYm9keS0+bWNyX3NpemUpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9tZ3NfY29uZmlnX3Jlcyk7CiAKIHN0YXRpYyB2b2lkIGx1c3RyZV9zd2FiX29iZF9kcWluZm8oc3RydWN0IG9iZF9kcWluZm8gKmkpCiB7CkBAIC0xODAwLDcgKzE3NjIsNiBAQAogCWx1c3RyZV9zd2FiX29iZF9kcWluZm8oJnEtPnFjX2RxaW5mbyk7CiAJbHVzdHJlX3N3YWJfb2JkX2RxYmxrKCZxLT5xY19kcWJsayk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX29iZF9xdW90YWN0bCk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfZmlkMnBhdGgoc3RydWN0IGdldGluZm9fZmlkMnBhdGggKmdmKQogewpAQCAtMTgyMiw3ICsxNzgzLDcgQEAKIAogdm9pZCBsdXN0cmVfc3dhYl9maWVtYXAoc3RydWN0IGxsX3VzZXJfZmllbWFwICpmaWVtYXApCiB7Ci0JaW50IGk7CisJX191MzIgaTsKIAogCV9fc3dhYjY0cygmZmllbWFwLT5mbV9zdGFydCk7CiAJX19zd2FiNjRzKCZmaWVtYXAtPmZtX2xlbmd0aCk7CkBAIC0xODM0LDcgKzE3OTUsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBmaWVtYXAtPmZtX21hcHBlZF9leHRlbnRzOyBpKyspCiAJCWx1c3RyZV9zd2FiX2ZpZW1hcF9leHRlbnQoJmZpZW1hcC0+Zm1fZXh0ZW50c1tpXSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2ZpZW1hcCk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfbWR0X3JlY19yZWludCAoc3RydWN0IG1kdF9yZWNfcmVpbnQgKnJyKQogewpAQCAtMTg2Myw3ICsxODIzLDYgQEAKIAogCUNMQVNTRVJUKG9mZnNldG9mKHR5cGVvZigqcnIpLCBycl9wYWRkaW5nXzQpICE9IDApOwogfTsKLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfbWR0X3JlY19yZWludCk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfbG92X2Rlc2Moc3RydWN0IGxvdl9kZXNjICpsZCkKIHsKQEAgLTE4NzgsMTkgKzE4MzcsNDMgQEAKIH0KIEVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfbG92X2Rlc2MpOwogCi1zdGF0aWMgdm9pZCBwcmludF9sdW0oc3RydWN0IGxvdl91c2VyX21kICpsdW0pCisvKiBUaGlzIHN0cnVjdHVyZSBpcyBhbHdheXMgaW4gbGl0dGxlLWVuZGlhbiAqLworc3RhdGljIHZvaWQgbHVzdHJlX3N3YWJfbG12X21kc19tZF92MShzdHJ1Y3QgbG12X21kc19tZF92MSAqbG1tMSkKIHsKLQlDREVCVUcoRF9PVEhFUiwgImxvdl91c2VyX21kICVwOlxuIiwgbHVtKTsKLQlDREVCVUcoRF9PVEhFUiwgIlx0bG1tX21hZ2ljOiAlI3hcbiIsIGx1bS0+bG1tX21hZ2ljKTsKLQlDREVCVUcoRF9PVEhFUiwgIlx0bG1tX3BhdHRlcm46ICUjeFxuIiwgbHVtLT5sbW1fcGF0dGVybik7Ci0JQ0RFQlVHKERfT1RIRVIsICJcdGxtbV9vYmplY3RfaWQ6ICVsbHVcbiIsIGxtbV9vaV9pZCgmbHVtLT5sbW1fb2kpKTsKLQlDREVCVUcoRF9PVEhFUiwgIlx0bG1tX29iamVjdF9ncjogJWxsdVxuIiwgbG1tX29pX3NlcSgmbHVtLT5sbW1fb2kpKTsKLQlDREVCVUcoRF9PVEhFUiwgIlx0bG1tX3N0cmlwZV9zaXplOiAlI3hcbiIsIGx1bS0+bG1tX3N0cmlwZV9zaXplKTsKLQlDREVCVUcoRF9PVEhFUiwgIlx0bG1tX3N0cmlwZV9jb3VudDogJSN4XG4iLCBsdW0tPmxtbV9zdHJpcGVfY291bnQpOwotCUNERUJVRyhEX09USEVSLCAiXHRsbW1fc3RyaXBlX29mZnNldC9sbW1fbGF5b3V0X2dlbjogJSN4XG4iLAotCSAgICAgICBsdW0tPmxtbV9zdHJpcGVfb2Zmc2V0KTsKKwlpbnQgaTsKKworCV9fc3dhYjMycygmbG1tMS0+bG12X21hZ2ljKTsKKwlfX3N3YWIzMnMoJmxtbTEtPmxtdl9zdHJpcGVfY291bnQpOworCV9fc3dhYjMycygmbG1tMS0+bG12X21hc3Rlcl9tZHRfaW5kZXgpOworCV9fc3dhYjMycygmbG1tMS0+bG12X2hhc2hfdHlwZSk7CisJX19zd2FiMzJzKCZsbW0xLT5sbXZfbGF5b3V0X3ZlcnNpb24pOworCWZvciAoaSA9IDA7IGkgPCBsbW0xLT5sbXZfc3RyaXBlX2NvdW50OyBpKyspCisJCWx1c3RyZV9zd2FiX2x1X2ZpZCgmbG1tMS0+bG12X3N0cmlwZV9maWRzW2ldKTsKIH0KIAordm9pZCBsdXN0cmVfc3dhYl9sbXZfbWRzX21kKHVuaW9uIGxtdl9tZHNfbWQgKmxtbSkKK3sKKwlzd2l0Y2ggKGxtbS0+bG12X21hZ2ljKSB7CisJY2FzZSBMTVZfTUFHSUNfVjE6CisJCWx1c3RyZV9zd2FiX2xtdl9tZHNfbWRfdjEoJmxtbS0+bG12X21kX3YxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9sbXZfbWRzX21kKTsKKwordm9pZCBsdXN0cmVfc3dhYl9sbXZfdXNlcl9tZChzdHJ1Y3QgbG12X3VzZXJfbWQgKmx1bSkKK3sKKwlfX3N3YWIzMnMoJmx1bS0+bHVtX21hZ2ljKTsKKwlfX3N3YWIzMnMoJmx1bS0+bHVtX3N0cmlwZV9jb3VudCk7CisJX19zd2FiMzJzKCZsdW0tPmx1bV9zdHJpcGVfb2Zmc2V0KTsKKwlfX3N3YWIzMnMoJmx1bS0+bHVtX2hhc2hfdHlwZSk7CisJX19zd2FiMzJzKCZsdW0tPmx1bV90eXBlKTsKKwlDTEFTU0VSVChvZmZzZXRvZih0eXBlb2YoKmx1bSksIGx1bV9wYWRkaW5nMSkpOworfQorRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9sbXZfdXNlcl9tZCk7CisKIHN0YXRpYyB2b2lkIGx1c3RyZV9zd2FiX2xtbV9vaShzdHJ1Y3Qgb3N0X2lkICpvaSkKIHsKIAlfX3N3YWI2NHMoJm9pLT5vaS5vaV9pZCk7CkBAIC0xOTA1LDcgKzE4ODgsNiBAQAogCV9fc3dhYjMycygmbHVtLT5sbW1fc3RyaXBlX3NpemUpOwogCV9fc3dhYjE2cygmbHVtLT5sbW1fc3RyaXBlX2NvdW50KTsKIAlfX3N3YWIxNnMoJmx1bS0+bG1tX3N0cmlwZV9vZmZzZXQpOwotCXByaW50X2x1bShsdW0pOwogfQogCiB2b2lkIGx1c3RyZV9zd2FiX2xvdl91c2VyX21kX3YxKHN0cnVjdCBsb3ZfdXNlcl9tZF92MSAqbHVtKQpAQCAtMTk0MSw5ICsxOTIzLDkgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBzdHJpcGVfY291bnQ7IGkrKykgewotCQlsdXN0cmVfc3dhYl9vc3RfaWQoJihsb2RbaV0ubF9vc3Rfb2kpKTsKLQkJX19zd2FiMzJzKCYobG9kW2ldLmxfb3N0X2dlbikpOwotCQlfX3N3YWIzMnMoJihsb2RbaV0ubF9vc3RfaWR4KSk7CisJCWx1c3RyZV9zd2FiX29zdF9pZCgmbG9kW2ldLmxfb3N0X29pKTsKKwkJX19zd2FiMzJzKCZsb2RbaV0ubF9vc3RfZ2VuKTsKKwkJX19zd2FiMzJzKCZsb2RbaV0ubF9vc3RfaWR4KTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2xvdl91c2VyX21kX29iamVjdHMpOwpAQCAtMTk3Myw3ICsxOTU1LDYgQEAKIHsKIAlfX3N3YWI2NHMoJmktPm9wYyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2xkbG1faW50ZW50KTsKIAogc3RhdGljIHZvaWQgbHVzdHJlX3N3YWJfbGRsbV9yZXNvdXJjZV9kZXNjKHN0cnVjdCBsZGxtX3Jlc291cmNlX2Rlc2MgKnIpCiB7CkBAIC0xOTk3LDcgKzE5NzgsNiBAQAogCV9fc3dhYjMycygmcnEtPmxvY2tfY291bnQpOwogCS8qIGxvY2tfaGFuZGxlW10gb3BhcXVlICovCiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2xkbG1fcmVxdWVzdCk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfbGRsbV9yZXBseShzdHJ1Y3QgbGRsbV9yZXBseSAqcikKIHsKQEAgLTIwMDgsNyArMTk4OCw2IEBACiAJX19zd2FiNjRzKCZyLT5sb2NrX3BvbGljeV9yZXMxKTsKIAlfX3N3YWI2NHMoJnItPmxvY2tfcG9saWN5X3JlczIpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9sZGxtX3JlcGx5KTsKIAogLyogRHVtcCBmdW5jdGlvbnMgKi8KIHZvaWQgZHVtcF9pb28oc3RydWN0IG9iZF9pb29iaiAqaW9vKQpAQCAtMjAxOCwxNCArMTk5NywxMiBAQAogCSAgICAgICBQT1NUSUQoJmlvby0+aW9vX29pZCksIGlvby0+aW9vX21heF9icncsCiAJICAgICAgIGlvby0+aW9vX2J1ZmNudCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGR1bXBfaW9vKTsKIAogdm9pZCBkdW1wX3JuaW9idWYoc3RydWN0IG5pb2J1Zl9yZW1vdGUgKm5iKQogewogCUNERUJVRyhEX1JQQ1RSQUNFLCAibmlvYnVmX3JlbW90ZTogb2Zmc2V0PSVsbHUsIGxlbj0lZCwgZmxhZ3M9JXhcbiIsCi0JICAgICAgIG5iLT5vZmZzZXQsIG5iLT5sZW4sIG5iLT5mbGFncyk7CisJICAgICAgIG5iLT5ybmJfb2Zmc2V0LCBuYi0+cm5iX2xlbiwgbmItPnJuYl9mbGFncyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGR1bXBfcm5pb2J1Zik7CiAKIHN0YXRpYyB2b2lkIGR1bXBfb2JkbyhzdHJ1Y3Qgb2JkbyAqb2EpCiB7CkBAIC0yMDkzLDEzICsyMDcwLDExIEBACiB7CiAJZHVtcF9vYmRvKCZvYi0+b2EpOwogfQotRVhQT1JUX1NZTUJPTChkdW1wX29zdF9ib2R5KTsKIAogdm9pZCBkdW1wX3JjcyhfX3UzMiAqcmMpCiB7CiAJQ0RFQlVHKERfUlBDVFJBQ0UsICJybWZfcmNzOiAlZFxuIiwgKnJjKTsKIH0KLUVYUE9SVF9TWU1CT0woZHVtcF9yY3MpOwogCiBzdGF0aWMgaW5saW5lIGludCByZXFfcHRscnBjX2JvZHlfc3dhYmJlZChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKIHsKQEAgLTIxODQsMTQgKzIxNTksMTIgQEAKIAlfX3N3YWIzMnMoJmMtPmxjX3RpbWVvdXQpOwogCV9fc3dhYjMycygmYy0+bGNfZXhwaXJ5KTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfbHVzdHJlX2NhcGEpOwogCiB2b2lkIGx1c3RyZV9zd2FiX2hzbV91c2VyX3N0YXRlKHN0cnVjdCBoc21fdXNlcl9zdGF0ZSAqc3RhdGUpCiB7CiAJX19zd2FiMzJzKCZzdGF0ZS0+aHVzX3N0YXRlcyk7CiAJX19zd2FiMzJzKCZzdGF0ZS0+aHVzX2FyY2hpdmVfaWQpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9oc21fdXNlcl9zdGF0ZSk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfaHNtX3N0YXRlX3NldChzdHJ1Y3QgaHNtX3N0YXRlX3NldCAqaHNzKQogewpAQCAtMjIxNCwxNCArMjE4NywxMiBAQAogCV9fc3dhYjMycygmYWN0aW9uLT5oY2FfYWN0aW9uKTsKIAlsdXN0cmVfc3dhYl9oc21fZXh0ZW50KCZhY3Rpb24tPmhjYV9sb2NhdGlvbik7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2hzbV9jdXJyZW50X2FjdGlvbik7CiAKIHZvaWQgbHVzdHJlX3N3YWJfaHNtX3VzZXJfaXRlbShzdHJ1Y3QgaHNtX3VzZXJfaXRlbSAqaHVpKQogewogCWx1c3RyZV9zd2FiX2x1X2ZpZCgmaHVpLT5odWlfZmlkKTsKIAlsdXN0cmVfc3dhYl9oc21fZXh0ZW50KCZodWktPmh1aV9leHRlbnQpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9oc21fdXNlcl9pdGVtKTsKIAogdm9pZCBsdXN0cmVfc3dhYl9sYXlvdXRfaW50ZW50KHN0cnVjdCBsYXlvdXRfaW50ZW50ICpsaSkKIHsKQEAgLTIyMzAsNyArMjIwMSw2IEBACiAJX19zd2FiNjRzKCZsaS0+bGlfc3RhcnQpOwogCV9fc3dhYjY0cygmbGktPmxpX2VuZCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2xheW91dF9pbnRlbnQpOwogCiB2b2lkIGx1c3RyZV9zd2FiX2hzbV9wcm9ncmVzc19rZXJuZWwoc3RydWN0IGhzbV9wcm9ncmVzc19rZXJuZWwgKmhwaykKIHsKQEAgLTIyNDEsNyArMjIxMSw2IEBACiAJX19zd2FiMTZzKCZocGstPmhwa19mbGFncyk7CiAJX19zd2FiMTZzKCZocGstPmhwa19lcnJ2YWwpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9oc21fcHJvZ3Jlc3Nfa2VybmVsKTsKIAogdm9pZCBsdXN0cmVfc3dhYl9oc21fcmVxdWVzdChzdHJ1Y3QgaHNtX3JlcXVlc3QgKmhyKQogewpAQCAtMjI1MSw3ICsyMjIwLDYgQEAKIAlfX3N3YWIzMnMoJmhyLT5ocl9pdGVtY291bnQpOwogCV9fc3dhYjMycygmaHItPmhyX2RhdGFfbGVuKTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfaHNtX3JlcXVlc3QpOwogCiB2b2lkIGx1c3RyZV9zd2FiX3N3YXBfbGF5b3V0cyhzdHJ1Y3QgbWRjX3N3YXBfbGF5b3V0cyAqbXNsKQogewpAQCAtMjI2NCw0ICsyMjMyLDMgQEAKIAlsdXN0cmVfc3dhYl9sdV9maWQoJmNkLT5jZF9maWQpOwogCV9fc3dhYjY0cygmY2QtPmNkX2RhdGFfdmVyc2lvbik7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2Nsb3NlX2RhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3BlcnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wZXJzLmMKaW5kZXggNmM4MjBlOS4uNWI5ZmIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3BlcnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGVycy5jCkBAIC02NCw5ICs2NCw5IEBACiB7CiAJbG5ldF9raW92X3QgKmtpb3YgPSAmZGVzYy0+YmRfaW92W2Rlc2MtPmJkX2lvdl9jb3VudF07CiAKLQlraW92LT5raW92X3BhZ2UgPSBwYWdlOwotCWtpb3YtPmtpb3Zfb2Zmc2V0ID0gcGFnZW9mZnNldDsKLQlraW92LT5raW92X2xlbiA9IGxlbjsKKwlraW92LT5idl9wYWdlID0gcGFnZTsKKwlraW92LT5idl9vZmZzZXQgPSBwYWdlb2Zmc2V0OworCWtpb3YtPmJ2X2xlbiA9IGxlbjsKIAogCWRlc2MtPmJkX2lvdl9jb3VudCsrOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3Bpbmdlci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3Bpbmdlci5jCmluZGV4IGMwNTI5ZDguLjU1MDRmYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9waW5nZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGluZ2VyLmMKQEAgLTM0MCw3ICszNDAsNiBAQAogewogCXB0bHJwY191cGRhdGVfbmV4dF9waW5nKGltcCwgMCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19waW5nZXJfc2VuZGluZ19vbl9pbXBvcnQpOwogCiB2b2lkIHB0bHJwY19waW5nZXJfY29tbWl0X2V4cGVjdGVkKHN0cnVjdCBvYmRfaW1wb3J0ICppbXApCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjX2ludGVybmFsLmgKaW5kZXggYTk4MzFmYS4uZjE0ZDE5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY19pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wdGxycGNfaW50ZXJuYWwuaApAQCAtNTMsNiArNTMsOCBAQAogaW50IHB0bHJwY2Rfc3RhcnQoc3RydWN0IHB0bHJwY2RfY3RsICpwYyk7CiAKIC8qIGNsaWVudC5jICovCit2b2lkIHB0bHJwY19hdF9hZGpfbmV0X2xhdGVuY3koc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHNlcnZpY2VfdGltZSk7CiBzdHJ1Y3QgcHRscnBjX2J1bGtfZGVzYyAqcHRscnBjX25ld19idWxrKHVuc2lnbmVkIG5wYWdlcywgdW5zaWduZWQgbWF4X2JydywKIAkJCQkJIHVuc2lnbmVkIHR5cGUsIHVuc2lnbmVkIHBvcnRhbCk7CiBpbnQgcHRscnBjX3JlcXVlc3RfY2FjaGVfaW5pdCh2b2lkKTsKQEAgLTYwLDYgKzYyLDExIEBACiBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnB0bHJwY19yZXF1ZXN0X2NhY2hlX2FsbG9jKGdmcF90IGZsYWdzKTsKIHZvaWQgcHRscnBjX3JlcXVlc3RfY2FjaGVfZnJlZShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSk7CiB2b2lkIHB0bHJwY19pbml0X3hpZCh2b2lkKTsKK3ZvaWQgcHRscnBjX3NldF9hZGRfbmV3X3JlcShzdHJ1Y3QgcHRscnBjZF9jdGwgKnBjLAorCQkJICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKTsKK2ludCBwdGxycGNfZXhwaXJlZF9zZXQodm9pZCAqZGF0YSk7CitpbnQgcHRscnBjX3NldF9uZXh0X3RpbWVvdXQoc3RydWN0IHB0bHJwY19yZXF1ZXN0X3NldCAqKTsKK3ZvaWQgcHRscnBjX3Jlc2VuZF9yZXEoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0KTsKIAogLyogZXZlbnRzLmMgKi8KIGludCBwdGxycGNfaW5pdF9wb3J0YWxzKHZvaWQpOwpAQCAtMjY4LDcgKzI3NSw3IEBACiBpbnQgIHNwdGxycGNfaW5pdCh2b2lkKTsKIHZvaWQgc3B0bHJwY19maW5pKHZvaWQpOwogCi1zdGF0aWMgaW5saW5lIGludCBsbF9ycGNfcmVjb3ZlcmFibGVfZXJyb3IoaW50IHJjKQorc3RhdGljIGlubGluZSBib29sIHB0bHJwY19yZWNvdmVyYWJsZV9lcnJvcihpbnQgcmMpCiB7CiAJcmV0dXJuIChyYyA9PSAtRU5PVENPTk4gfHwgcmMgPT0gLUVOT0RFVik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY2QuYwppbmRleCAwYTM3NGI2Li4xZjU1ZDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wdGxycGNkLmMKQEAgLTQxMiw3ICs0MTIsNyBAQAogCSAqIGFuIGFyZ3VtZW50LCBkZXNjcmliaW5nIGl0cyAic2NvcGUiLgogCSAqLwogCXJjID0gbHVfY29udGV4dF9pbml0KCZlbnYubGVfY3R4LAotCQkJICAgICBMQ1RfQ0xfVEhSRUFEfExDVF9SRU1FTUJFUnxMQ1RfTk9SRUYpOworCQkJICAgICBMQ1RfQ0xfVEhSRUFEIHwgTENUX1JFTUVNQkVSIHwgTENUX05PUkVGKTsKIAlpZiAocmMgPT0gMCkgewogCQlyYyA9IGx1X2NvbnRleHRfaW5pdChlbnYubGVfc2VzLAogCQkJCSAgICAgTENUX1NFU1NJT04gfCBMQ1RfUkVNRU1CRVIgfCBMQ1RfTk9SRUYpOwpAQCAtNTY3LDcgKzU2Nyw3IEBACiAJICogcHRscnBjZCB0aHJlYWQgKG9yIGEgdGhyZWFkLXNldCkgaGFzIHRvIGJlIGdpdmVuIGFuIGFyZ3VtZW50LAogCSAqIGRlc2NyaWJpbmcgaXRzICJzY29wZSIuCiAJICovCi0JcmMgPSBsdV9jb250ZXh0X2luaXQoJnBjLT5wY19lbnYubGVfY3R4LCBMQ1RfQ0xfVEhSRUFEfExDVF9SRU1FTUJFUik7CisJcmMgPSBsdV9jb250ZXh0X2luaXQoJnBjLT5wY19lbnYubGVfY3R4LCBMQ1RfQ0xfVEhSRUFEIHwgTENUX1JFTUVNQkVSKTsKIAlpZiAocmMgIT0gMCkKIAkJZ290byBvdXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9yZWNvdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcmVjb3Zlci5jCmluZGV4IDcxOGIzYTguLjQwNWZhZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9yZWNvdmVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3JlY292ZXIuYwpAQCAtMjAxLDcgKzIwMSw2IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX3Jlc2VuZCk7CiAKIC8qKgogICogR28gdGhyb3VnaCBhbGwgcmVxdWVzdHMgaW4gZGVsYXllZCBsaXN0IGFuZCB3YWtlIHRoZWlyIHRocmVhZHMKQEAgLTIyMSw3ICsyMjAsNiBAQAogCX0KIAlzcGluX3VubG9jaygmaW1wLT5pbXBfbG9jayk7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY193YWtlX2RlbGF5ZWQpOwogCiB2b2lkIHB0bHJwY19yZXF1ZXN0X2hhbmRsZV9ub3Rjb25uKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqZmFpbGVkX3JlcSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWMuYwppbmRleCBkYmQ4MTlmLi41ZDM5OTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlYy5jCkBAIC0zMTEsNiArMzExLDE5IEBACiAJcmV0dXJuIHNwdGxycGNfaW1wb3J0X3NlY19hZGFwdChpbXAsIE5VTEwsIE5VTEwpOwogfQogCisvKioKKyAqIEdldCBhbmQgdmFsaWRhdGUgdGhlIGNsaWVudCBzaWRlIHB0bHJwYyBzZWN1cml0eSBmYWNpbGl0aWVzIGZyb20KKyAqIFxhIGltcC4gVGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiBvbiBjbGllbnQgcmVjb25uZWN0IHdoZW4gdGhlIGltcG9ydCBpcworICogYmVpbmcgZGVzdHJveWVkIHdoaWxlIHRoZXJlIGFyZSBvdXRzdGFuZGluZyBjbGllbnQgYm91bmQgcmVxdWVzdHMuIEluCisgKiB0aGlzIGNhc2UgZG8gbm90IG91dHB1dCBhbnkgZXJyb3IgbWVzc2FnZXMgaWYgaW1wb3J0IHNlY3VpdHkgaXMgbm90CisgKiBmb3VuZC4KKyAqCisgKiBccGFyYW1baW5dIGltcCBvYmQgaW1wb3J0IGFzc29jaWF0ZWQgd2l0aCBjbGllbnQKKyAqIFxwYXJhbVtvdXRdIHNlYyBjbGllbnQgc2lkZSBwdGxycGMgc2VjdXJpdHkKKyAqCisgKiBccmV0dmFsIDAgaWYgc2VjdXJpdHkgcmV0cmlldmVkIHN1Y2Nlc3NmdWxseQorICogXHJldHZhbCAtdmUgZXJybm8gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbQorICovCiBzdGF0aWMgaW50IGltcG9ydF9zZWNfdmFsaWRhdGVfZ2V0KHN0cnVjdCBvYmRfaW1wb3J0ICppbXAsCiAJCQkJICAgc3RydWN0IHB0bHJwY19zZWMgKipzZWMpCiB7CkBAIC0zMjMsOSArMzM2LDExIEBACiAJfQogCiAJKnNlYyA9IHNwdGxycGNfaW1wb3J0X3NlY19yZWYoaW1wKTsKKwkvKiBPbmx5IG91dHB1dCBhbiBlcnJvciB3aGVuIHRoZSBpbXBvcnQgaXMgc3RpbGwgYWN0aXZlICovCiAJaWYgKCEqc2VjKSB7Ci0JCUNFUlJPUigiaW1wb3J0ICVwICglcykgd2l0aCBubyBzZWNcbiIsCi0JCSAgICAgICBpbXAsIHB0bHJwY19pbXBvcnRfc3RhdGVfbmFtZShpbXAtPmltcF9zdGF0ZSkpOworCQlpZiAobGlzdF9lbXB0eSgmaW1wLT5pbXBfem9tYmllX2NoYWluKSkKKwkJCUNFUlJPUigiaW1wb3J0ICVwICglcykgd2l0aCBubyBzZWNcbiIsCisJCQkgICAgICAgaW1wLCBwdGxycGNfaW1wb3J0X3N0YXRlX25hbWUoaW1wLT5pbXBfc3RhdGUpKTsKIAkJcmV0dXJuIC1FQUNDRVM7CiAJfQogCkBAIC00OTksNyArNTE0LDcgQEAKIAkJICAgICAgIG5ld2N0eCwgbmV3Y3R4LT5jY19mbGFncyk7CiAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dChIWik7CisJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcyhNU0VDX1BFUl9TRUMpKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBpdCdzIHBvc3NpYmxlIG5ld2N0eCA9PSBvbGRjdHggaWYgd2UncmUgc3dpdGNoaW5nCkBAIC03MTgsOCArNzMzLDkgQEAKIAlyZXEtPnJxX3Jlc3RhcnQgPSAwOwogCXNwaW5fdW5sb2NrKCZyZXEtPnJxX2xvY2spOwogCi0JbHdpID0gTFdJX1RJTUVPVVRfSU5UUih0aW1lb3V0ICogSFosIGN0eF9yZWZyZXNoX3RpbWVvdXQsCi0JCQkgICAgICAgY3R4X3JlZnJlc2hfaW50ZXJydXB0LCByZXEpOworCWx3aSA9IExXSV9USU1FT1VUX0lOVFIobXNlY3NfdG9famlmZmllcyh0aW1lb3V0ICogTVNFQ19QRVJfU0VDKSwKKwkJCSAgICAgICBjdHhfcmVmcmVzaF90aW1lb3V0LCBjdHhfcmVmcmVzaF9pbnRlcnJ1cHQsCisJCQkgICAgICAgcmVxKTsKIAlyYyA9IGxfd2FpdF9ldmVudChyZXEtPnJxX3JlcGx5X3dhaXRxLCBjdHhfY2hlY2tfcmVmcmVzaChjdHgpLCAmbHdpKTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2J1bGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfYnVsay5jCmluZGV4IDVmNGQ3OTcuLmIyY2M1ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfYnVsay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfYnVsay5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAkJICAgImNhY2hlIG1pc3Npbmc6CSAgICVsdVxuIgogCQkgICAibG93IGZyZWUgbWFyazoJICAgJWx1XG4iCiAJCSAgICJtYXggd2FpdHF1ZXVlIGRlcHRoOiAgICAgJXVcbiIKLQkJICAgIm1heCB3YWl0IHRpbWU6CSAgICVsZC8ldVxuIiwKKwkJICAgIm1heCB3YWl0IHRpbWU6CSAgICVsZC8lbHVcbiIsCiAJCSAgIHRvdGFscmFtX3BhZ2VzLAogCQkgICBQQUdFU19QRVJfUE9PTCwKIAkJICAgcGFnZV9wb29scy5lcHBfbWF4X3BhZ2VzLApAQCAtMTU4LDcgKzE1OCw3IEBACiAJCSAgIHBhZ2VfcG9vbHMuZXBwX3N0X2xvd2ZyZWUsCiAJCSAgIHBhZ2VfcG9vbHMuZXBwX3N0X21heF93cWxlbiwKIAkJICAgcGFnZV9wb29scy5lcHBfc3RfbWF4X3dhaXQsCi0JCSAgIEhaKTsKKwkJICAgbXNlY3NfdG9famlmZmllcyhNU0VDX1BFUl9TRUMpKTsKIAogCXNwaW5fdW5sb2NrKCZwYWdlX3Bvb2xzLmVwcF9sb2NrKTsKIApAQCAtMzI2LDEyICszMjYsMTIgQEAKIAlMQVNTRVJUKHBhZ2VfcG9vbHMuZXBwX3Bvb2xzW3BfaWR4XSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGVzYy0+YmRfaW92X2NvdW50OyBpKyspIHsKLQkJTEFTU0VSVChkZXNjLT5iZF9lbmNfaW92W2ldLmtpb3ZfcGFnZSk7CisJCUxBU1NFUlQoZGVzYy0+YmRfZW5jX2lvdltpXS5idl9wYWdlKTsKIAkJTEFTU0VSVChnX2lkeCAhPSAwIHx8IHBhZ2VfcG9vbHMuZXBwX3Bvb2xzW3BfaWR4XSk7CiAJCUxBU1NFUlQoIXBhZ2VfcG9vbHMuZXBwX3Bvb2xzW3BfaWR4XVtnX2lkeF0pOwogCiAJCXBhZ2VfcG9vbHMuZXBwX3Bvb2xzW3BfaWR4XVtnX2lkeF0gPQotCQkJCQlkZXNjLT5iZF9lbmNfaW92W2ldLmtpb3ZfcGFnZTsKKwkJCQkJZGVzYy0+YmRfZW5jX2lvdltpXS5idl9wYWdlOwogCiAJCWlmICgrK2dfaWR4ID09IFBBR0VTX1BFUl9QT09MKSB7CiAJCQlwX2lkeCsrOwpAQCAtMzQ4LDcgKzM0OCw2IEBACiAJa2ZyZWUoZGVzYy0+YmRfZW5jX2lvdik7CiAJZGVzYy0+YmRfZW5jX2lvdiA9IE5VTEw7CiB9Ci1FWFBPUlRfU1lNQk9MKHNwdGxycGNfZW5jX3Bvb2xfcHV0X3BhZ2VzKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGVuY19wb29sc19hbGxvYyh2b2lkKQogewpAQCAtNDMyLDEyICs0MzEsMTMgQEAKIAogCWlmIChwYWdlX3Bvb2xzLmVwcF9zdF9hY2Nlc3MgPiAwKSB7CiAJCUNERUJVRyhEX1NFQywKLQkJICAgICAgICJtYXggcGFnZXMgJWx1LCBncm93cyAldSwgZ3JvdyBmYWlscyAldSwgc2hyaW5rcyAldSwgYWNjZXNzICVsdSwgbWlzc2luZyAlbHUsIG1heCBxbGVuICV1LCBtYXggd2FpdCAlbGQvJWRcbiIsCisJCSAgICAgICAibWF4IHBhZ2VzICVsdSwgZ3Jvd3MgJXUsIGdyb3cgZmFpbHMgJXUsIHNocmlua3MgJXUsIGFjY2VzcyAlbHUsIG1pc3NpbmcgJWx1LCBtYXggcWxlbiAldSwgbWF4IHdhaXQgJWxkLyVsZFxuIiwKIAkJICAgICAgIHBhZ2VfcG9vbHMuZXBwX3N0X21heF9wYWdlcywgcGFnZV9wb29scy5lcHBfc3RfZ3Jvd3MsCiAJCSAgICAgICBwYWdlX3Bvb2xzLmVwcF9zdF9ncm93X2ZhaWxzLAogCQkgICAgICAgcGFnZV9wb29scy5lcHBfc3Rfc2hyaW5rcywgcGFnZV9wb29scy5lcHBfc3RfYWNjZXNzLAogCQkgICAgICAgcGFnZV9wb29scy5lcHBfc3RfbWlzc2luZ3MsIHBhZ2VfcG9vbHMuZXBwX3N0X21heF93cWxlbiwKLQkJICAgICAgIHBhZ2VfcG9vbHMuZXBwX3N0X21heF93YWl0LCBIWik7CisJCSAgICAgICBwYWdlX3Bvb2xzLmVwcF9zdF9tYXhfd2FpdCwKKwkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoTVNFQ19QRVJfU0VDKSk7CiAJfQogfQogCkBAIC00NTYsMTMgKzQ1NiwxMSBAQAogewogCXJldHVybiBjZnNfY3J5cHRvX2hhc2hfbmFtZShjZnNfaGFzaF9hbGdfaWRbaGFzaF9hbGddKTsKIH0KLUVYUE9SVF9TWU1CT0woc3B0bHJwY19nZXRfaGFzaF9uYW1lKTsKIAogX191OCBzcHRscnBjX2dldF9oYXNoX2FsZyhjb25zdCBjaGFyICphbGduYW1lKQogewogCXJldHVybiBjZnNfY3J5cHRvX2hhc2hfYWxnKGFsZ25hbWUpOwogfQotRVhQT1JUX1NZTUJPTChzcHRscnBjX2dldF9oYXNoX2FsZyk7CiAKIGludCBidWxrX3NlY19kZXNjX3VucGFjayhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBpbnQgb2Zmc2V0LCBpbnQgc3dhYmJlZCkKIHsKQEAgLTUyMiw5ICs1MjAsMTAgQEAKIAloYXNoc2l6ZSA9IGNmc19jcnlwdG9faGFzaF9kaWdlc3RzaXplKGNmc19oYXNoX2FsZ19pZFthbGddKTsKIAogCWZvciAoaSA9IDA7IGkgPCBkZXNjLT5iZF9pb3ZfY291bnQ7IGkrKykgewotCQljZnNfY3J5cHRvX2hhc2hfdXBkYXRlX3BhZ2UoaGRlc2MsIGRlc2MtPmJkX2lvdltpXS5raW92X3BhZ2UsCi0JCQkJICBkZXNjLT5iZF9pb3ZbaV0ua2lvdl9vZmZzZXQgJiB+UEFHRV9NQVNLLAotCQkJCSAgZGVzYy0+YmRfaW92W2ldLmtpb3ZfbGVuKTsKKwkJY2ZzX2NyeXB0b19oYXNoX3VwZGF0ZV9wYWdlKGhkZXNjLCBkZXNjLT5iZF9pb3ZbaV0uYnZfcGFnZSwKKwkJCQkJICAgIGRlc2MtPmJkX2lvdltpXS5idl9vZmZzZXQgJgorCQkJCQkgICAgflBBR0VfTUFTSywKKwkJCQkJICAgIGRlc2MtPmJkX2lvdltpXS5idl9sZW4pOwogCX0KIAogCWlmIChoYXNoc2l6ZSA+IGJ1ZmxlbikgewpAQCAtNTQyLDQgKzU0MSwzIEBACiAKIAlyZXR1cm4gZXJyOwogfQotRVhQT1JUX1NZTUJPTChzcHRscnBjX2dldF9idWxrX2NoZWNrc3VtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfY29uZmlnLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2NvbmZpZy5jCmluZGV4IGMxNDAzNTQuLjIxODFhODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfY29uZmlnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19jb25maWcuYwpAQCAtNTgsNyArNTgsNiBAQAogCUNFUlJPUigidW5rbm93biB0YXJnZXQgJXAoJXMpXG4iLCBvYmQsIHR5cGUpOwogCXJldHVybiBMVVNUUkVfU1BfQU5ZOwogfQotRVhQT1JUX1NZTUJPTChzcHRscnBjX3RhcmdldF9zZWNfcGFydCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiB1c2VyIHN1cHBsaWVkIGZsYXZvciBzdHJpbmcgcGFyc2luZyAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19nYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19nYy5jCmluZGV4IDliOTgwMWUuLjhmZmQwMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfZ2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2djLmMKQEAgLTcxLDcgKzcxLDYgQEAKIAogCUNERUJVRyhEX1NFQywgImFkZGVkIHNlYyAlcCglcylcbiIsIHNlYywgc2VjLT5wc19wb2xpY3ktPnNwX25hbWUpOwogfQotRVhQT1JUX1NZTUJPTChzcHRscnBjX2djX2FkZF9zZWMpOwogCiB2b2lkIHNwdGxycGNfZ2NfZGVsX3NlYyhzdHJ1Y3QgcHRscnBjX3NlYyAqc2VjKQogewpAQCAtOTUsNyArOTQsNiBAQAogCiAJQ0RFQlVHKERfU0VDLCAiZGVsIHNlYyAlcCglcylcbiIsIHNlYywgc2VjLT5wc19wb2xpY3ktPnNwX25hbWUpOwogfQotRVhQT1JUX1NZTUJPTChzcHRscnBjX2djX2RlbF9zZWMpOwogCiBzdGF0aWMgdm9pZCBzZWNfcHJvY2Vzc19jdHhfbGlzdCh2b2lkKQogewpAQCAtMTgyLDcgKzE4MCw4IEBACiAJCS8qIGNoZWNrIGN0eCBsaXN0IGFnYWluIGJlZm9yZSBzbGVlcCAqLwogCQlzZWNfcHJvY2Vzc19jdHhfbGlzdCgpOwogCi0JCWx3aSA9IExXSV9USU1FT1VUKFNFQ19HQ19JTlRFUlZBTCAqIEhaLCBOVUxMLCBOVUxMKTsKKwkJbHdpID0gTFdJX1RJTUVPVVQobXNlY3NfdG9famlmZmllcyhTRUNfR0NfSU5URVJWQUwgKiBNU0VDX1BFUl9TRUMpLAorCQkJCSAgTlVMTCwgTlVMTCk7CiAJCWxfd2FpdF9ldmVudCh0aHJlYWQtPnRfY3RsX3dhaXRxLAogCQkJICAgICB0aHJlYWRfaXNfc3RvcHBpbmcodGhyZWFkKSB8fAogCQkJICAgICB0aHJlYWRfaXNfc2lnbmFsKHRocmVhZCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX3BsYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX3BsYWluLmMKaW5kZXggNWM0NTkwYi4uY2QzMDViYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19wbGFpbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfcGxhaW4uYwpAQCAtMTU0LDEzICsxNTQsMTMgQEAKIAl1bnNpZ25lZCBpbnQgb2ZmLCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGRlc2MtPmJkX2lvdl9jb3VudDsgaSsrKSB7Ci0JCWlmIChkZXNjLT5iZF9pb3ZbaV0ua2lvdl9sZW4gPT0gMCkKKwkJaWYgKGRlc2MtPmJkX2lvdltpXS5idl9sZW4gPT0gMCkKIAkJCWNvbnRpbnVlOwogCi0JCXB0ciA9IGttYXAoZGVzYy0+YmRfaW92W2ldLmtpb3ZfcGFnZSk7Ci0JCW9mZiA9IGRlc2MtPmJkX2lvdltpXS5raW92X29mZnNldCAmIH5QQUdFX01BU0s7CisJCXB0ciA9IGttYXAoZGVzYy0+YmRfaW92W2ldLmJ2X3BhZ2UpOworCQlvZmYgPSBkZXNjLT5iZF9pb3ZbaV0uYnZfb2Zmc2V0ICYgflBBR0VfTUFTSzsKIAkJcHRyW29mZl0gXj0gMHgxOwotCQlrdW5tYXAoZGVzYy0+YmRfaW92W2ldLmtpb3ZfcGFnZSk7CisJCWt1bm1hcChkZXNjLT5iZF9pb3ZbaV0uYnZfcGFnZSk7CiAJCXJldHVybjsKIAl9CiB9CkBAIC0yNDksOSArMjQ5LDEyIEBACiAJCXVuc2lnbmVkIGludCBoc2l6ZSA9IDQ7CiAKIAkJY2ZzX2NyeXB0b19oYXNoX2RpZ2VzdChDRlNfSEFTSF9BTEdfQ1JDMzIsCi0JCQkJbHVzdHJlX21zZ19idWYobXNnLCBQTEFJTl9QQUNLX01TR19PRkYsIDApLAotCQkJCWx1c3RyZV9tc2dfYnVmbGVuKG1zZywgUExBSU5fUEFDS19NU0dfT0ZGKSwKLQkJCQlOVUxMLCAwLCAodW5zaWduZWQgY2hhciAqKSZja3N1bSwgJmhzaXplKTsKKwkJCQkgICAgICAgbHVzdHJlX21zZ19idWYobXNnLCBQTEFJTl9QQUNLX01TR19PRkYsCisJCQkJCQkgICAgICAwKSwKKwkJCQkgICAgICAgbHVzdHJlX21zZ19idWZsZW4obXNnLAorCQkJCQkJCSBQTEFJTl9QQUNLX01TR19PRkYpLAorCQkJCSAgICAgICBOVUxMLCAwLCAodW5zaWduZWQgY2hhciAqKSZja3N1bSwKKwkJCQkgICAgICAgJmhzaXplKTsKIAkJaWYgKGNrc3VtICE9IG1zZy0+bG1fY2tzdW0pIHsKIAkJCUNERUJVRyhEX1NFQywKIAkJCSAgICAgICAiZWFybHkgcmVwbHkgY2hlY2tzdW0gbWlzbWF0Y2g6ICUwOHggIT0gJTA4eFxuIiwKQEAgLTM0OSwxMSArMzUyLDExIEBACiAKIAkvKiBmaXggdGhlIGFjdHVhbCBkYXRhIHNpemUgKi8KIAlmb3IgKGkgPSAwLCBub2IgPSAwOyBpIDwgZGVzYy0+YmRfaW92X2NvdW50OyBpKyspIHsKLQkJaWYgKGRlc2MtPmJkX2lvdltpXS5raW92X2xlbiArIG5vYiA+IGRlc2MtPmJkX25vYl90cmFuc2ZlcnJlZCkgewotCQkJZGVzYy0+YmRfaW92W2ldLmtpb3ZfbGVuID0KKwkJaWYgKGRlc2MtPmJkX2lvdltpXS5idl9sZW4gKyBub2IgPiBkZXNjLT5iZF9ub2JfdHJhbnNmZXJyZWQpIHsKKwkJCWRlc2MtPmJkX2lvdltpXS5idl9sZW4gPQogCQkJCWRlc2MtPmJkX25vYl90cmFuc2ZlcnJlZCAtIG5vYjsKIAkJfQotCQlub2IgKz0gZGVzYy0+YmRfaW92W2ldLmtpb3ZfbGVuOworCQlub2IgKz0gZGVzYy0+YmRfaW92W2ldLmJ2X2xlbjsKIAl9CiAKIAlyYyA9IHBsYWluX3ZlcmlmeV9idWxrX2NzdW0oZGVzYywgcmVxLT5ycV9mbHZyLnVfYnVsay5oYXNoLmhhc2hfYWxnLApAQCAtODY5LDkgKzg3MiwxMiBAQAogCQl1bnNpZ25lZCBpbnQgaHNpemUgPSA0OwogCiAJCWNmc19jcnlwdG9faGFzaF9kaWdlc3QoQ0ZTX0hBU0hfQUxHX0NSQzMyLAotCQkJbHVzdHJlX21zZ19idWYobXNnLCBQTEFJTl9QQUNLX01TR19PRkYsIDApLAotCQkJbHVzdHJlX21zZ19idWZsZW4obXNnLCBQTEFJTl9QQUNLX01TR19PRkYpLAotCQkJTlVMTCwgMCwgKHVuc2lnbmVkIGNoYXIgKikmbXNnLT5sbV9ja3N1bSwgJmhzaXplKTsKKwkJCQkgICAgICAgbHVzdHJlX21zZ19idWYobXNnLCBQTEFJTl9QQUNLX01TR19PRkYsCisJCQkJCQkgICAgICAwKSwKKwkJCQkgICAgICAgbHVzdHJlX21zZ19idWZsZW4obXNnLAorCQkJCQkJCSBQTEFJTl9QQUNLX01TR19PRkYpLAorCQkJCSAgICAgICBOVUxMLCAwLCAodW5zaWduZWQgY2hhciAqKSZtc2ctPmxtX2Nrc3VtLAorCQkJCSAgICAgICAmaHNpemUpOwogCQlyZXEtPnJxX3JlcGx5X29mZiA9IDA7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VydmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlcnZpY2UuYwppbmRleCA0Nzg4YzQ5Li43MmYzOTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VydmljZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZXJ2aWNlLmMKQEAgLTEwMDUsNiArMTAwNSwxMCBAQAogCWFycmF5LT5wYWFfY291bnQtLTsKIH0KIAorLyoKKyAqIEF0dGVtcHQgdG8gZXh0ZW5kIHRoZSByZXF1ZXN0IGRlYWRsaW5lIGJ5IHNlbmRpbmcgYW4gZWFybHkgcmVwbHkgdG8gdGhlCisgKiBjbGllbnQuCisgKi8KIHN0YXRpYyBpbnQgcHRscnBjX2F0X3NlbmRfZWFybHlfcmVwbHkoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCiB7CiAJc3RydWN0IHB0bHJwY19zZXJ2aWNlX3BhcnQgKnN2Y3B0ID0gcmVxLT5ycV9ycWJkLT5ycWJkX3N2Y3B0OwpAQCAtMTAzOSwyNCArMTA0MywyNiBAQAogCQlyZXR1cm4gLUVOT1NZUzsKIAl9CiAKLQkvKiBGYWtlIG91ciBwcm9jZXNzaW5nIHRpbWUgaW50byB0aGUgZnV0dXJlIHRvIGFzayB0aGUgY2xpZW50cwotCSAqIGZvciBzb21lIGV4dHJhIGFtb3VudCBvZiB0aW1lCisJLyoKKwkgKiBXZSB3YW50IHRvIGV4dGVuZCB0aGUgcmVxdWVzdCBkZWFkbGluZSBieSBhdF9leHRyYSBzZWNvbmRzLAorCSAqIHNvIHdlIHNldCBvdXIgc2VydmljZSBlc3RpbWF0ZSB0byByZWZsZWN0IGhvdyBtdWNoIHRpbWUgaGFzCisJICogcGFzc2VkIHNpbmNlIHRoaXMgcmVxdWVzdCBhcnJpdmVkIHBsdXMgYW4gYWRkaXRpb25hbAorCSAqIGF0X2V4dHJhIHNlY29uZHMuIFRoZSBjbGllbnQgd2lsbCBjYWxjdWxhdGUgdGhlIG5ldyBkZWFkbGluZQorCSAqIGJhc2VkIG9uIHRoaXMgc2VydmljZSBlc3RpbWF0ZSAocGx1cyBzb21lIGFkZGl0aW9uYWwgdGltZSB0bworCSAqIGFjY291bnQgZm9yIG5ldHdvcmsgbGF0ZW5jeSkuIFNlZSBwdGxycGNfYXRfcmVjdl9lYXJseV9yZXBseQogCSAqLwogCWF0X21lYXN1cmVkKCZzdmNwdC0+c2NwX2F0X2VzdGltYXRlLCBhdF9leHRyYSArCiAJCSAgICBrdGltZV9nZXRfcmVhbF9zZWNvbmRzKCkgLSByZXEtPnJxX2Fycml2YWxfdGltZS50dl9zZWMpOworCW5ld2RsID0gcmVxLT5ycV9hcnJpdmFsX3RpbWUudHZfc2VjICsgYXRfZ2V0KCZzdmNwdC0+c2NwX2F0X2VzdGltYXRlKTsKIAogCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBhY3R1YWxseSBpbmNyZWFzZWQgdGhlIGRlYWRsaW5lIC0KIAkgKiB3ZSBtYXkgYmUgcGFzdCBhZGFwdGl2ZV9tYXgKIAkgKi8KLQlpZiAocmVxLT5ycV9kZWFkbGluZSA+PSByZXEtPnJxX2Fycml2YWxfdGltZS50dl9zZWMgKwotCSAgICBhdF9nZXQoJnN2Y3B0LT5zY3BfYXRfZXN0aW1hdGUpKSB7CisJaWYgKHJlcS0+cnFfZGVhZGxpbmUgPj0gbmV3ZGwpIHsKIAkJREVCVUdfUkVRKERfV0FSTklORywgcmVxLCAiQ291bGRuJ3QgYWRkIGFueSB0aW1lICglbGQvJWxsZCksIG5vdCBzZW5kaW5nIGVhcmx5IHJlcGx5XG4iLAotCQkJICBvbGRkbCwgcmVxLT5ycV9hcnJpdmFsX3RpbWUudHZfc2VjICsKLQkJCSAgYXRfZ2V0KCZzdmNwdC0+c2NwX2F0X2VzdGltYXRlKSAtCi0JCQkgIGt0aW1lX2dldF9yZWFsX3NlY29uZHMoKSk7CisJCQkgIG9sZGRsLCBuZXdkbCAtIGt0aW1lX2dldF9yZWFsX3NlY29uZHMoKSk7CiAJCXJldHVybiAtRVRJTUVET1VUOwogCX0KLQluZXdkbCA9IGt0aW1lX2dldF9yZWFsX3NlY29uZHMoKSArIGF0X2dldCgmc3ZjcHQtPnNjcF9hdF9lc3RpbWF0ZSk7CiAKIAlyZXFjb3B5ID0gcHRscnBjX3JlcXVlc3RfY2FjaGVfYWxsb2MoR0ZQX05PRlMpOwogCWlmICghcmVxY29weSkKQEAgLTE5ODIsMTEgKzE5ODgsMTIgQEAKIAljb25kX3Jlc2NoZWQoKTsKIAogCWxfd2FpdF9ldmVudF9leGNsdXNpdmVfaGVhZChzdmNwdC0+c2NwX3dhaXRxLAotCQkJCXB0bHJwY190aHJlYWRfc3RvcHBpbmcodGhyZWFkKSB8fAotCQkJCXB0bHJwY19zZXJ2ZXJfcmVxdWVzdF9pbmNvbWluZyhzdmNwdCkgfHwKLQkJCQlwdGxycGNfc2VydmVyX3JlcXVlc3RfcGVuZGluZyhzdmNwdCwgZmFsc2UpIHx8Ci0JCQkJcHRscnBjX3JxYmRfcGVuZGluZyhzdmNwdCkgfHwKLQkJCQlwdGxycGNfYXRfY2hlY2soc3ZjcHQpLCAmbHdpKTsKKwkJCQkgICAgcHRscnBjX3RocmVhZF9zdG9wcGluZyh0aHJlYWQpIHx8CisJCQkJICAgIHB0bHJwY19zZXJ2ZXJfcmVxdWVzdF9pbmNvbWluZyhzdmNwdCkgfHwKKwkJCQkgICAgcHRscnBjX3NlcnZlcl9yZXF1ZXN0X3BlbmRpbmcoc3ZjcHQsCisJCQkJCQkJCSAgZmFsc2UpIHx8CisJCQkJICAgIHB0bHJwY19ycWJkX3BlbmRpbmcoc3ZjcHQpIHx8CisJCQkJICAgIHB0bHJwY19hdF9jaGVjayhzdmNwdCksICZsd2kpOwogCiAJaWYgKHB0bHJwY190aHJlYWRfc3RvcHBpbmcodGhyZWFkKSkKIAkJcmV0dXJuIC1FSU5UUjsKQEAgLTIwNDksNyArMjA1Niw3IEBACiAJfQogCiAJcmMgPSBsdV9jb250ZXh0X2luaXQoJmVudi0+bGVfY3R4LAotCQkJICAgICBzdmMtPnNydl9jdHhfdGFnc3xMQ1RfUkVNRU1CRVJ8TENUX05PUkVGKTsKKwkJCSAgICAgc3ZjLT5zcnZfY3R4X3RhZ3MgfCBMQ1RfUkVNRU1CRVIgfCBMQ1RfTk9SRUYpOwogCWlmIChyYykKIAkJZ290byBvdXRfc3J2X2Zpbmk7CiAKQEAgLTIzNDksNyArMjM1Niw3IEBACiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnpvbWJpZSkpIHsKIAkJdGhyZWFkID0gbGlzdF9lbnRyeSh6b21iaWUubmV4dCwKLQkJCQkJc3RydWN0IHB0bHJwY190aHJlYWQsIHRfbGluayk7CisJCQkJICAgIHN0cnVjdCBwdGxycGNfdGhyZWFkLCB0X2xpbmspOwogCQlsaXN0X2RlbCgmdGhyZWFkLT50X2xpbmspOwogCQlrZnJlZSh0aHJlYWQpOwogCX0KQEAgLTIzOTgsNyArMjQwNSw2IEBACiAJcHRscnBjX3N0b3BfYWxsX3RocmVhZHMoc3ZjKTsKIAlyZXR1cm4gcmM7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19zdGFydF90aHJlYWRzKTsKIAogaW50IHB0bHJwY19zdGFydF90aHJlYWQoc3RydWN0IHB0bHJwY19zZXJ2aWNlX3BhcnQgKnN2Y3B0LCBpbnQgd2FpdCkKIHsKQEAgLTI1MzksOCArMjU0NSw4IEBACiAJCUxBU1NFUlQoaHJwLT5ocnBfbnRocnMgPiAwKTsKIAkJaHJwLT5ocnBfdGhycyA9CiAJCQlremFsbG9jX25vZGUoaHJwLT5ocnBfbnRocnMgKiBzaXplb2YoKmhydCksIEdGUF9OT0ZTLAotCQkJCWNmc19jcHRfc3ByZWFkX25vZGUocHRscnBjX2hyLmhyX2NwdF90YWJsZSwKLQkJCQkJCSAgICBpKSk7CisJCQkJICAgICBjZnNfY3B0X3NwcmVhZF9ub2RlKHB0bHJwY19oci5ocl9jcHRfdGFibGUsCisJCQkJCQkJIGkpKTsKIAkJaWYgKCFocnAtPmhycF90aHJzKSB7CiAJCQlyYyA9IC1FTk9NRU07CiAJCQlnb3RvIG91dDsKQEAgLTI1OTMsNyArMjU5OSw4IEBACiAJCQkJCQkgICAgIE5VTEwsIE5VTEwpOwogCiAJCXJjID0gbF93YWl0X2V2ZW50KHN2Y3B0LT5zY3Bfd2FpdHEsCi0JCSAgICAgYXRvbWljX3JlYWQoJnN2Y3B0LT5zY3BfbnJlcHNfZGlmZmljdWx0KSA9PSAwLCAmbHdpKTsKKwkJCQkgIGF0b21pY19yZWFkKCZzdmNwdC0+c2NwX25yZXBzX2RpZmZpY3VsdCkgPT0gMCwKKwkJCQkgICZsd2kpOwogCQlpZiAocmMgPT0gMCkKIAkJCWJyZWFrOwogCQlDV0FSTigiVW5leHBlY3RlZGx5IGxvbmcgdGltZW91dCAlcyAlcFxuIiwKQEAgLTI2MzksNyArMjY0Niw3IEBACiAJCSAqIGV2ZW50IHdpdGggaXRzICd1bmxpbmsnIGZsYWcgc2V0IGZvciBlYWNoIHBvc3RlZCBycWJkCiAJCSAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJxYmQsICZzdmNwdC0+c2NwX3JxYmRfcG9zdGVkLAotCQkJCQlycWJkX2xpc3QpIHsKKwkJCQkgICAgcnFiZF9saXN0KSB7CiAJCQlyYyA9IExOZXRNRFVubGluayhycWJkLT5ycWJkX21kX2gpOwogCQkJTEFTU0VSVChyYyA9PSAwIHx8IHJjID09IC1FTk9FTlQpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvd2lyZXRlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy93aXJldGVzdC5jCmluZGV4IDZjYzJiMmUuLmU1OTQ1ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy93aXJldGVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy93aXJldGVzdC5jCkBAIC0xOTAsMjggKzE5MCwzMCBAQAogCQkgKGxvbmcgbG9uZylSRUlOVF9TRVRYQVRUUik7CiAJTEFTU0VSVEYoUkVJTlRfUk1FTlRSWSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpUkVJTlRfUk1FTlRSWSk7Ci0JTEFTU0VSVEYoUkVJTlRfTUFYID09IDksICJmb3VuZCAlbGxkXG4iLAorCUxBU1NFUlRGKFJFSU5UX01JR1JBVEUgPT0gOSwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKVJFSU5UX01JR1JBVEUpOworCUxBU1NFUlRGKFJFSU5UX01BWCA9PSAxMCwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKVJFSU5UX01BWCk7CiAJTEFTU0VSVEYoRElTUF9JVF9FWEVDRCA9PSAweDAwMDAwMDAxVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKURJU1BfSVRfRVhFQ0QpOworCQkgKHVuc2lnbmVkKURJU1BfSVRfRVhFQ0QpOwogCUxBU1NFUlRGKERJU1BfTE9PS1VQX0VYRUNEID09IDB4MDAwMDAwMDJVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpRElTUF9MT09LVVBfRVhFQ0QpOworCQkgKHVuc2lnbmVkKURJU1BfTE9PS1VQX0VYRUNEKTsKIAlMQVNTRVJURihESVNQX0xPT0tVUF9ORUcgPT0gMHgwMDAwMDAwNFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClESVNQX0xPT0tVUF9ORUcpOworCQkgKHVuc2lnbmVkKURJU1BfTE9PS1VQX05FRyk7CiAJTEFTU0VSVEYoRElTUF9MT09LVVBfUE9TID09IDB4MDAwMDAwMDhVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpRElTUF9MT09LVVBfUE9TKTsKKwkJICh1bnNpZ25lZClESVNQX0xPT0tVUF9QT1MpOwogCUxBU1NFUlRGKERJU1BfT1BFTl9DUkVBVEUgPT0gMHgwMDAwMDAxMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClESVNQX09QRU5fQ1JFQVRFKTsKKwkJICh1bnNpZ25lZClESVNQX09QRU5fQ1JFQVRFKTsKIAlMQVNTRVJURihESVNQX09QRU5fT1BFTiA9PSAweDAwMDAwMDIwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKURJU1BfT1BFTl9PUEVOKTsKKwkJICh1bnNpZ25lZClESVNQX09QRU5fT1BFTik7CiAJTEFTU0VSVEYoRElTUF9FTlFfQ09NUExFVEUgPT0gMHgwMDQwMDAwMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClESVNQX0VOUV9DT01QTEVURSk7CisJCSAodW5zaWduZWQpRElTUF9FTlFfQ09NUExFVEUpOwogCUxBU1NFUlRGKERJU1BfRU5RX09QRU5fUkVGID09IDB4MDA4MDAwMDBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpRElTUF9FTlFfT1BFTl9SRUYpOworCQkgKHVuc2lnbmVkKURJU1BfRU5RX09QRU5fUkVGKTsKIAlMQVNTRVJURihESVNQX0VOUV9DUkVBVEVfUkVGID09IDB4MDEwMDAwMDBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpRElTUF9FTlFfQ1JFQVRFX1JFRik7CisJCSAodW5zaWduZWQpRElTUF9FTlFfQ1JFQVRFX1JFRik7CiAJTEFTU0VSVEYoRElTUF9PUEVOX0xPQ0sgPT0gMHgwMjAwMDAwMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClESVNQX09QRU5fTE9DSyk7CisJCSAodW5zaWduZWQpRElTUF9PUEVOX0xPQ0spOwogCUxBU1NFUlRGKE1EU19TVEFUVVNfQ09OTiA9PSAxLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpTURTX1NUQVRVU19DT05OKTsKIAlMQVNTRVJURihNRFNfU1RBVFVTX0xPViA9PSAyLCAiZm91bmQgJWxsZFxuIiwKQEAgLTIxOSw1NSArMjIxLDU1IEBACiAJTEFTU0VSVEYoTFVTVFJFX0JGTEFHX1VOQ09NTUlUVEVEX1dSSVRFUyA9PSAxLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpTFVTVFJFX0JGTEFHX1VOQ09NTUlUVEVEX1dSSVRFUyk7CiAJTEFTU0VSVEYoTUZfU09NX0NIQU5HRSA9PSAweDAwMDAwMDAxVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1GX1NPTV9DSEFOR0UpOworCQkgKHVuc2lnbmVkKU1GX1NPTV9DSEFOR0UpOwogCUxBU1NFUlRGKE1GX0VQT0NIX09QRU4gPT0gMHgwMDAwMDAwMlVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNRl9FUE9DSF9PUEVOKTsKKwkJICh1bnNpZ25lZClNRl9FUE9DSF9PUEVOKTsKIAlMQVNTRVJURihNRl9FUE9DSF9DTE9TRSA9PSAweDAwMDAwMDA0VUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1GX0VQT0NIX0NMT1NFKTsKKwkJICh1bnNpZ25lZClNRl9FUE9DSF9DTE9TRSk7CiAJTEFTU0VSVEYoTUZfTURDX0NBTkNFTF9GSUQxID09IDB4MDAwMDAwMDhVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTUZfTURDX0NBTkNFTF9GSUQxKTsKKwkJICh1bnNpZ25lZClNRl9NRENfQ0FOQ0VMX0ZJRDEpOwogCUxBU1NFUlRGKE1GX01EQ19DQU5DRUxfRklEMiA9PSAweDAwMDAwMDEwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1GX01EQ19DQU5DRUxfRklEMik7CisJCSAodW5zaWduZWQpTUZfTURDX0NBTkNFTF9GSUQyKTsKIAlMQVNTRVJURihNRl9NRENfQ0FOQ0VMX0ZJRDMgPT0gMHgwMDAwMDAyMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNRl9NRENfQ0FOQ0VMX0ZJRDMpOworCQkgKHVuc2lnbmVkKU1GX01EQ19DQU5DRUxfRklEMyk7CiAJTEFTU0VSVEYoTUZfTURDX0NBTkNFTF9GSUQ0ID09IDB4MDAwMDAwNDBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTUZfTURDX0NBTkNFTF9GSUQ0KTsKKwkJICh1bnNpZ25lZClNRl9NRENfQ0FOQ0VMX0ZJRDQpOwogCUxBU1NFUlRGKE1GX1NPTV9BVSA9PSAweDAwMDAwMDgwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1GX1NPTV9BVSk7CisJCSAodW5zaWduZWQpTUZfU09NX0FVKTsKIAlMQVNTRVJURihNRl9HRVRBVFRSX0xPQ0sgPT0gMHgwMDAwMDEwMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNRl9HRVRBVFRSX0xPQ0spOworCQkgKHVuc2lnbmVkKU1GX0dFVEFUVFJfTE9DSyk7CiAJTEFTU0VSVEYoTURTX0FUVFJfTU9ERSA9PSAweDAwMDAwMDAwMDAwMDAwMDFVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19BVFRSX01PREUpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9NT0RFKTsKIAlMQVNTRVJURihNRFNfQVRUUl9VSUQgPT0gMHgwMDAwMDAwMDAwMDAwMDAyVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9VSUQpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9VSUQpOwogCUxBU1NFUlRGKE1EU19BVFRSX0dJRCA9PSAweDAwMDAwMDAwMDAwMDAwMDRVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19BVFRSX0dJRCk7CisJCSAobG9uZyBsb25nKU1EU19BVFRSX0dJRCk7CiAJTEFTU0VSVEYoTURTX0FUVFJfU0laRSA9PSAweDAwMDAwMDAwMDAwMDAwMDhVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19BVFRSX1NJWkUpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9TSVpFKTsKIAlMQVNTRVJURihNRFNfQVRUUl9BVElNRSA9PSAweDAwMDAwMDAwMDAwMDAwMTBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19BVFRSX0FUSU1FKTsKKwkJIChsb25nIGxvbmcpTURTX0FUVFJfQVRJTUUpOwogCUxBU1NFUlRGKE1EU19BVFRSX01USU1FID09IDB4MDAwMDAwMDAwMDAwMDAyMFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpTURTX0FUVFJfTVRJTUUpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9NVElNRSk7CiAJTEFTU0VSVEYoTURTX0FUVFJfQ1RJTUUgPT0gMHgwMDAwMDAwMDAwMDAwMDQwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9DVElNRSk7CisJCSAobG9uZyBsb25nKU1EU19BVFRSX0NUSU1FKTsKIAlMQVNTRVJURihNRFNfQVRUUl9BVElNRV9TRVQgPT0gMHgwMDAwMDAwMDAwMDAwMDgwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9BVElNRV9TRVQpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9BVElNRV9TRVQpOwogCUxBU1NFUlRGKE1EU19BVFRSX01USU1FX1NFVCA9PSAweDAwMDAwMDAwMDAwMDAxMDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19BVFRSX01USU1FX1NFVCk7CisJCSAobG9uZyBsb25nKU1EU19BVFRSX01USU1FX1NFVCk7CiAJTEFTU0VSVEYoTURTX0FUVFJfRk9SQ0UgPT0gMHgwMDAwMDAwMDAwMDAwMjAwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9GT1JDRSk7CisJCSAobG9uZyBsb25nKU1EU19BVFRSX0ZPUkNFKTsKIAlMQVNTRVJURihNRFNfQVRUUl9BVFRSX0ZMQUcgPT0gMHgwMDAwMDAwMDAwMDAwNDAwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9BVFRSX0ZMQUcpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9BVFRSX0ZMQUcpOwogCUxBU1NFUlRGKE1EU19BVFRSX0tJTExfU1VJRCA9PSAweDAwMDAwMDAwMDAwMDA4MDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19BVFRSX0tJTExfU1VJRCk7CisJCSAobG9uZyBsb25nKU1EU19BVFRSX0tJTExfU1VJRCk7CiAJTEFTU0VSVEYoTURTX0FUVFJfS0lMTF9TR0lEID09IDB4MDAwMDAwMDAwMDAwMTAwMFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpTURTX0FUVFJfS0lMTF9TR0lEKTsKKwkJIChsb25nIGxvbmcpTURTX0FUVFJfS0lMTF9TR0lEKTsKIAlMQVNTRVJURihNRFNfQVRUUl9DVElNRV9TRVQgPT0gMHgwMDAwMDAwMDAwMDAyMDAwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9DVElNRV9TRVQpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9DVElNRV9TRVQpOwogCUxBU1NFUlRGKE1EU19BVFRSX0ZST01fT1BFTiA9PSAweDAwMDAwMDAwMDAwMDQwMDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19BVFRSX0ZST01fT1BFTik7CisJCSAobG9uZyBsb25nKU1EU19BVFRSX0ZST01fT1BFTik7CiAJTEFTU0VSVEYoTURTX0FUVFJfQkxPQ0tTID09IDB4MDAwMDAwMDAwMDAwODAwMFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpTURTX0FUVFJfQkxPQ0tTKTsKKwkJIChsb25nIGxvbmcpTURTX0FUVFJfQkxPQ0tTKTsKIAlMQVNTRVJURihGTERfUVVFUlkgPT0gOTAwLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpRkxEX1FVRVJZKTsKIAlMQVNTRVJURihGTERfRklSU1RfT1BDID09IDkwMCwgImZvdW5kICVsbGRcbiIsCkBAIC00MTgsMTUgKzQyMCwxNSBAQAogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGx1c3RyZV9tZHRfYXR0cnMgKikwKS0+bG1hX3NlbGZfZmlkKSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGx1c3RyZV9tZHRfYXR0cnMgKikwKS0+bG1hX3NlbGZfZmlkKSk7CiAJTEFTU0VSVEYoTE1BSV9SRUxFQVNFRCA9PSAweDAwMDAwMDAxVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUxNQUlfUkVMRUFTRUQpOworCQkgKHVuc2lnbmVkKUxNQUlfUkVMRUFTRUQpOwogCUxBU1NFUlRGKExNQUNfSFNNID09IDB4MDAwMDAwMDFVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTE1BQ19IU00pOworCQkgKHVuc2lnbmVkKUxNQUNfSFNNKTsKIAlMQVNTRVJURihMTUFDX1NPTSA9PSAweDAwMDAwMDAyVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUxNQUNfU09NKTsKKwkJICh1bnNpZ25lZClMTUFDX1NPTSk7CiAJTEFTU0VSVEYoTE1BQ19OT1RfSU5fT0kgPT0gMHgwMDAwMDAwNFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClMTUFDX05PVF9JTl9PSSk7CisJCSAodW5zaWduZWQpTE1BQ19OT1RfSU5fT0kpOwogCUxBU1NFUlRGKExNQUNfRklEX09OX09TVCA9PSAweDAwMDAwMDA4VUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUxNQUNfRklEX09OX09TVCk7CisJCSAodW5zaWduZWQpTE1BQ19GSURfT05fT1NUKTsKIAogCS8qIENoZWNrcyBmb3Igc3RydWN0IG9zdF9pZCAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBvc3RfaWQpID09IDE2LCAiZm91bmQgJWxsZFxuIiwKQEAgLTQ1MiwzNSArNDU0LDM1IEBACiAJTEFTU0VSVEYoRklEX1NFUV9JR0lGID09IDEyLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpRklEX1NFUV9JR0lGKTsKIAlMQVNTRVJURihGSURfU0VRX0lHSUZfTUFYID09IDB4MDAwMDAwMDBmZmZmZmZmZlVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpRklEX1NFUV9JR0lGX01BWCk7CisJCSAobG9uZyBsb25nKUZJRF9TRVFfSUdJRl9NQVgpOwogCUxBU1NFUlRGKEZJRF9TRVFfSURJRiA9PSAweDAwMDAwMDAxMDAwMDAwMDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKUZJRF9TRVFfSURJRik7CisJCSAobG9uZyBsb25nKUZJRF9TRVFfSURJRik7CiAJTEFTU0VSVEYoRklEX1NFUV9JRElGX01BWCA9PSAweDAwMDAwMDAxZmZmZmZmZmZVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKUZJRF9TRVFfSURJRl9NQVgpOworCQkgKGxvbmcgbG9uZylGSURfU0VRX0lESUZfTUFYKTsKIAlMQVNTRVJURihGSURfU0VRX1NUQVJUID09IDB4MDAwMDAwMDIwMDAwMDAwMFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpRklEX1NFUV9TVEFSVCk7CisJCSAobG9uZyBsb25nKUZJRF9TRVFfU1RBUlQpOwogCUxBU1NFUlRGKEZJRF9TRVFfTE9DQUxfRklMRSA9PSAweDAwMDAwMDAyMDAwMDAwMDFVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKUZJRF9TRVFfTE9DQUxfRklMRSk7CisJCSAobG9uZyBsb25nKUZJRF9TRVFfTE9DQUxfRklMRSk7CiAJTEFTU0VSVEYoRklEX1NFUV9ET1RfTFVTVFJFID09IDB4MDAwMDAwMDIwMDAwMDAwMlVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpRklEX1NFUV9ET1RfTFVTVFJFKTsKKwkJIChsb25nIGxvbmcpRklEX1NFUV9ET1RfTFVTVFJFKTsKIAlMQVNTRVJURihGSURfU0VRX1NQRUNJQUwgPT0gMHgwMDAwMDAwMjAwMDAwMDA0VUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylGSURfU0VRX1NQRUNJQUwpOworCQkgKGxvbmcgbG9uZylGSURfU0VRX1NQRUNJQUwpOwogCUxBU1NFUlRGKEZJRF9TRVFfUVVPVEEgPT0gMHgwMDAwMDAwMjAwMDAwMDA1VUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylGSURfU0VRX1FVT1RBKTsKKwkJIChsb25nIGxvbmcpRklEX1NFUV9RVU9UQSk7CiAJTEFTU0VSVEYoRklEX1NFUV9RVU9UQV9HTEIgPT0gMHgwMDAwMDAwMjAwMDAwMDA2VUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylGSURfU0VRX1FVT1RBX0dMQik7CisJCSAobG9uZyBsb25nKUZJRF9TRVFfUVVPVEFfR0xCKTsKIAlMQVNTRVJURihGSURfU0VRX1JPT1QgPT0gMHgwMDAwMDAwMjAwMDAwMDA3VUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylGSURfU0VRX1JPT1QpOworCQkgKGxvbmcgbG9uZylGSURfU0VRX1JPT1QpOwogCUxBU1NFUlRGKEZJRF9TRVFfTk9STUFMID09IDB4MDAwMDAwMDIwMDAwMDQwMFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpRklEX1NFUV9OT1JNQUwpOworCQkgKGxvbmcgbG9uZylGSURfU0VRX05PUk1BTCk7CiAJTEFTU0VSVEYoRklEX1NFUV9MT1ZfREVGQVVMVCA9PSAweGZmZmZmZmZmZmZmZmZmZmZVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKUZJRF9TRVFfTE9WX0RFRkFVTFQpOworCQkgKGxvbmcgbG9uZylGSURfU0VRX0xPVl9ERUZBVUxUKTsKIAlMQVNTRVJURihGSURfT0lEX1NQRUNJQUxfQkZMID09IDB4MDAwMDAwMDFVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpRklEX09JRF9TUEVDSUFMX0JGTCk7CisJCSAodW5zaWduZWQpRklEX09JRF9TUEVDSUFMX0JGTCk7CiAJTEFTU0VSVEYoRklEX09JRF9ET1RfTFVTVFJFID09IDB4MDAwMDAwMDFVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpRklEX09JRF9ET1RfTFVTVFJFKTsKKwkJICh1bnNpZ25lZClGSURfT0lEX0RPVF9MVVNUUkUpOwogCUxBU1NFUlRGKEZJRF9PSURfRE9UX0xVU1RSRV9PQkYgPT0gMHgwMDAwMDAwMlVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClGSURfT0lEX0RPVF9MVVNUUkVfT0JGKTsKKwkJICh1bnNpZ25lZClGSURfT0lEX0RPVF9MVVNUUkVfT0JGKTsKIAogCS8qIENoZWNrcyBmb3Igc3RydWN0IGx1X2RpcmVudCAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBsdV9kaXJlbnQpID09IDMyLCAiZm91bmQgJWxsZFxuIiwKQEAgLTUxMCwxMSArNTEyLDExIEBACiAJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbHVfZGlyZW50ICopMCktPmxkZV9uYW1lWzBdKSA9PSAxLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbHVfZGlyZW50ICopMCktPmxkZV9uYW1lWzBdKSk7CiAJTEFTU0VSVEYoTFVEQV9GSUQgPT0gMHgwMDAwMDAwMVVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClMVURBX0ZJRCk7CisJCSAodW5zaWduZWQpTFVEQV9GSUQpOwogCUxBU1NFUlRGKExVREFfVFlQRSA9PSAweDAwMDAwMDAyVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUxVREFfVFlQRSk7CisJCSAodW5zaWduZWQpTFVEQV9UWVBFKTsKIAlMQVNTRVJURihMVURBXzY0QklUSEFTSCA9PSAweDAwMDAwMDA0VUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUxVREFfNjRCSVRIQVNIKTsKKwkJICh1bnNpZ25lZClMVURBXzY0QklUSEFTSCk7CiAKIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBsdWRhX3R5cGUgKi8KIAlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3QgbHVkYV90eXBlKSA9PSAyLCAiZm91bmQgJWxsZFxuIiwKQEAgLTYwMiw5ICs2MDQsOSBAQAogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGx1c3RyZV9tc2dfdjIgKikwKS0+bG1fYnVmbGVuc1swXSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGx1c3RyZV9tc2dfdjIgKikwKS0+bG1fYnVmbGVuc1swXSkpOwogCUxBU1NFUlRGKExVU1RSRV9NU0dfTUFHSUNfVjIgPT0gMHgwQkQwMEJEMywgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX01TR19NQUdJQ19WMik7CisJCSBMVVNUUkVfTVNHX01BR0lDX1YyKTsKIAlMQVNTRVJURihMVVNUUkVfTVNHX01BR0lDX1YyX1NXQUJCRUQgPT0gMHhEMzBCRDAwQiwgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX01TR19NQUdJQ19WMl9TV0FCQkVEKTsKKwkJIExVU1RSRV9NU0dfTUFHSUNfVjJfU1dBQkJFRCk7CiAKIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBwdGxycGNfYm9keSAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBwdGxycGNfYm9keV92MykgPT0gMTg0LCAiZm91bmQgJWxsZFxuIiwKQEAgLTY4Miw3ICs2ODQsNyBAQAogCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBwdGxycGNfYm9keV92MywgcGJfcGFkZGluZykpOwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IHB0bHJwY19ib2R5X3YzICopMCktPnBiX3BhZGRpbmcpID09IDMyLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgcHRscnBjX2JvZHlfdjMgKikwKS0+cGJfcGFkZGluZykpOwotCUNMQVNTRVJUKEpPQlNUQVRTX0pPQklEX1NJWkUgPT0gMzIpOworCUNMQVNTRVJUKExVU1RSRV9KT0JJRF9TSVpFID09IDMyKTsKIAlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBwdGxycGNfYm9keV92MywgcGJfam9iaWQpID09IDE1MiwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IHB0bHJwY19ib2R5X3YzLCBwYl9qb2JpZCkpOwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IHB0bHJwY19ib2R5X3YzICopMCktPnBiX2pvYmlkKSA9PSAzMiwgImZvdW5kICVsbGRcbiIsCkBAIC03ODAsNjEgKzc4Miw2MSBAQAogCUxBU1NFUlRGKE1TR19QVExSUENfSEVBREVSX09GRiA9PSAzMSwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKU1TR19QVExSUENfSEVBREVSX09GRik7CiAJTEFTU0VSVEYoUFRMUlBDX01TR19WRVJTSU9OID09IDB4MDAwMDAwMDMsICJmb3VuZCAweCUuOHhcbiIsCi0JCVBUTFJQQ19NU0dfVkVSU0lPTik7CisJCSBQVExSUENfTVNHX1ZFUlNJT04pOwogCUxBU1NFUlRGKExVU1RSRV9WRVJTSU9OX01BU0sgPT0gMHhmZmZmMDAwMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX1ZFUlNJT05fTUFTSyk7CisJCSBMVVNUUkVfVkVSU0lPTl9NQVNLKTsKIAlMQVNTRVJURihMVVNUUkVfT0JEX1ZFUlNJT04gPT0gMHgwMDAxMDAwMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX09CRF9WRVJTSU9OKTsKKwkJIExVU1RSRV9PQkRfVkVSU0lPTik7CiAJTEFTU0VSVEYoTFVTVFJFX01EU19WRVJTSU9OID09IDB4MDAwMjAwMDAsICJmb3VuZCAweCUuOHhcbiIsCi0JCUxVU1RSRV9NRFNfVkVSU0lPTik7CisJCSBMVVNUUkVfTURTX1ZFUlNJT04pOwogCUxBU1NFUlRGKExVU1RSRV9PU1RfVkVSU0lPTiA9PSAweDAwMDMwMDAwLCAiZm91bmQgMHglLjh4XG4iLAotCQlMVVNUUkVfT1NUX1ZFUlNJT04pOworCQkgTFVTVFJFX09TVF9WRVJTSU9OKTsKIAlMQVNTRVJURihMVVNUUkVfRExNX1ZFUlNJT04gPT0gMHgwMDA0MDAwMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX0RMTV9WRVJTSU9OKTsKKwkJIExVU1RSRV9ETE1fVkVSU0lPTik7CiAJTEFTU0VSVEYoTFVTVFJFX0xPR19WRVJTSU9OID09IDB4MDAwNTAwMDAsICJmb3VuZCAweCUuOHhcbiIsCi0JCUxVU1RSRV9MT0dfVkVSU0lPTik7CisJCSBMVVNUUkVfTE9HX1ZFUlNJT04pOwogCUxBU1NFUlRGKExVU1RSRV9NR1NfVkVSU0lPTiA9PSAweDAwMDYwMDAwLCAiZm91bmQgMHglLjh4XG4iLAotCQlMVVNUUkVfTUdTX1ZFUlNJT04pOworCQkgTFVTVFJFX01HU19WRVJTSU9OKTsKIAlMQVNTRVJURihNU0dIRFJfQVRfU1VQUE9SVCA9PSAxLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpTVNHSERSX0FUX1NVUFBPUlQpOwogCUxBU1NFUlRGKE1TR0hEUl9DS1NVTV9JTkNPTVBBVDE4ID09IDIsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZylNU0dIRFJfQ0tTVU1fSU5DT01QQVQxOCk7CiAJTEFTU0VSVEYoTVNHX09QX0ZMQUdfTUFTSyA9PSAweGZmZmYwMDAwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1TR19PUF9GTEFHX01BU0spOworCQkgKHVuc2lnbmVkKU1TR19PUF9GTEFHX01BU0spOwogCUxBU1NFUlRGKE1TR19PUF9GTEFHX1NISUZUID09IDE2LCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpTVNHX09QX0ZMQUdfU0hJRlQpOwogCUxBU1NFUlRGKE1TR19HRU5fRkxBR19NQVNLID09IDB4MDAwMGZmZmZVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTVNHX0dFTl9GTEFHX01BU0spOworCQkgKHVuc2lnbmVkKU1TR19HRU5fRkxBR19NQVNLKTsKIAlMQVNTRVJURihNU0dfTEFTVF9SRVBMQVkgPT0gMHgwMDAwMDAwMVVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfTEFTVF9SRVBMQVkpOworCQkgKHVuc2lnbmVkKU1TR19MQVNUX1JFUExBWSk7CiAJTEFTU0VSVEYoTVNHX1JFU0VOVCA9PSAweDAwMDAwMDAyVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1TR19SRVNFTlQpOworCQkgKHVuc2lnbmVkKU1TR19SRVNFTlQpOwogCUxBU1NFUlRGKE1TR19SRVBMQVkgPT0gMHgwMDAwMDAwNFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfUkVQTEFZKTsKKwkJICh1bnNpZ25lZClNU0dfUkVQTEFZKTsKIAlMQVNTRVJURihNU0dfREVMQVlfUkVQTEFZID09IDB4MDAwMDAwMTBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTVNHX0RFTEFZX1JFUExBWSk7CisJCSAodW5zaWduZWQpTVNHX0RFTEFZX1JFUExBWSk7CiAJTEFTU0VSVEYoTVNHX1ZFUlNJT05fUkVQTEFZID09IDB4MDAwMDAwMjBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTVNHX1ZFUlNJT05fUkVQTEFZKTsKKwkJICh1bnNpZ25lZClNU0dfVkVSU0lPTl9SRVBMQVkpOwogCUxBU1NFUlRGKE1TR19SRVFfUkVQTEFZX0RPTkUgPT0gMHgwMDAwMDA0MFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfUkVRX1JFUExBWV9ET05FKTsKKwkJICh1bnNpZ25lZClNU0dfUkVRX1JFUExBWV9ET05FKTsKIAlMQVNTRVJURihNU0dfTE9DS19SRVBMQVlfRE9ORSA9PSAweDAwMDAwMDgwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1TR19MT0NLX1JFUExBWV9ET05FKTsKKwkJICh1bnNpZ25lZClNU0dfTE9DS19SRVBMQVlfRE9ORSk7CiAJTEFTU0VSVEYoTVNHX0NPTk5FQ1RfUkVDT1ZFUklORyA9PSAweDAwMDAwMDAxVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1TR19DT05ORUNUX1JFQ09WRVJJTkcpOworCQkgKHVuc2lnbmVkKU1TR19DT05ORUNUX1JFQ09WRVJJTkcpOwogCUxBU1NFUlRGKE1TR19DT05ORUNUX1JFQ09OTkVDVCA9PSAweDAwMDAwMDAyVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1TR19DT05ORUNUX1JFQ09OTkVDVCk7CisJCSAodW5zaWduZWQpTVNHX0NPTk5FQ1RfUkVDT05ORUNUKTsKIAlMQVNTRVJURihNU0dfQ09OTkVDVF9SRVBMQVlBQkxFID09IDB4MDAwMDAwMDRVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTVNHX0NPTk5FQ1RfUkVQTEFZQUJMRSk7CisJCSAodW5zaWduZWQpTVNHX0NPTk5FQ1RfUkVQTEFZQUJMRSk7CiAJTEFTU0VSVEYoTVNHX0NPTk5FQ1RfTElCQ0xJRU5UID09IDB4MDAwMDAwMTBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTVNHX0NPTk5FQ1RfTElCQ0xJRU5UKTsKKwkJICh1bnNpZ25lZClNU0dfQ09OTkVDVF9MSUJDTElFTlQpOwogCUxBU1NFUlRGKE1TR19DT05ORUNUX0lOSVRJQUwgPT0gMHgwMDAwMDAyMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfQ09OTkVDVF9JTklUSUFMKTsKKwkJICh1bnNpZ25lZClNU0dfQ09OTkVDVF9JTklUSUFMKTsKIAlMQVNTRVJURihNU0dfQ09OTkVDVF9BU1lOQyA9PSAweDAwMDAwMDQwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1TR19DT05ORUNUX0FTWU5DKTsKKwkJICh1bnNpZ25lZClNU0dfQ09OTkVDVF9BU1lOQyk7CiAJTEFTU0VSVEYoTVNHX0NPTk5FQ1RfTkVYVF9WRVIgPT0gMHgwMDAwMDA4MFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfQ09OTkVDVF9ORVhUX1ZFUik7CisJCSAodW5zaWduZWQpTVNHX0NPTk5FQ1RfTkVYVF9WRVIpOwogCUxBU1NFUlRGKE1TR19DT05ORUNUX1RSQU5TTk8gPT0gMHgwMDAwMDEwMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfQ09OTkVDVF9UUkFOU05PKTsKKwkJICh1bnNpZ25lZClNU0dfQ09OTkVDVF9UUkFOU05PKTsKIAogCS8qIENoZWNrcyBmb3Igc3RydWN0IG9iZF9jb25uZWN0X2RhdGEgKi8KIAlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3Qgb2JkX2Nvbm5lY3RfZGF0YSkgPT0gMTkyLCAiZm91bmQgJWxsZFxuIiwKQEAgLTEwNjksMTIgKzEwNzEsMTggQEAKIAkJICJmb3VuZCAweCUuMTZsbHhVTExcbiIsIE9CRF9DT05ORUNUX0ZMT0NLX0RFQUQpOwogCUxBU1NFUlRGKE9CRF9DT05ORUNUX09QRU5fQllfRklEID09IDB4MjAwMDAwMDAwMDAwMDBVTEwsCiAJCSAiZm91bmQgMHglLjE2bGx4VUxMXG4iLCBPQkRfQ09OTkVDVF9PUEVOX0JZX0ZJRCk7CisJTEFTU0VSVEYoT0JEX0NPTk5FQ1RfTEZTQ0sgPT0gMHg0MDAwMDAwMDAwMDAwMFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKKwkJIE9CRF9DT05ORUNUX0xGU0NLKTsKKwlMQVNTRVJURihPQkRfQ09OTkVDVF9VTkxJTktfQ0xPU0UgPT0gMHgxMDAwMDAwMDAwMDAwMDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCisJCSBPQkRfQ09OTkVDVF9VTkxJTktfQ0xPU0UpOworCUxBU1NFUlRGKE9CRF9DT05ORUNUX0RJUl9TVFJJUEUgPT0gMHg0MDAwMDAwMDAwMDAwMDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCisJCSBPQkRfQ09OTkVDVF9ESVJfU1RSSVBFKTsKIAlMQVNTRVJURihPQkRfQ0tTVU1fQ1JDMzIgPT0gMHgwMDAwMDAwMVVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClPQkRfQ0tTVU1fQ1JDMzIpOworCQkgKHVuc2lnbmVkKU9CRF9DS1NVTV9DUkMzMik7CiAJTEFTU0VSVEYoT0JEX0NLU1VNX0FETEVSID09IDB4MDAwMDAwMDJVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpT0JEX0NLU1VNX0FETEVSKTsKKwkJICh1bnNpZ25lZClPQkRfQ0tTVU1fQURMRVIpOwogCUxBU1NFUlRGKE9CRF9DS1NVTV9DUkMzMkMgPT0gMHgwMDAwMDAwNFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClPQkRfQ0tTVU1fQ1JDMzJDKTsKKwkJICh1bnNpZ25lZClPQkRfQ0tTVU1fQ1JDMzJDKTsKIAogCS8qIENoZWNrcyBmb3Igc3RydWN0IG9iZG8gKi8KIAlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3Qgb2JkbykgPT0gMjA4LCAiZm91bmQgJWxsZFxuIiwKQEAgLTEzNDYsNyArMTM1NCw3IEBACiAJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxvdl9tZHNfbWRfdjEsIGxtbV9vYmplY3RzWzBdKSk7CiAJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG92X21kc19tZF92MSAqKTApLT5sbW1fb2JqZWN0c1swXSkgPT0gMjQsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsb3ZfbWRzX21kX3YxICopMCktPmxtbV9vYmplY3RzWzBdKSk7Ci0JQ0xBU1NFUlQoTE9WX01BR0lDX1YxID09IDB4MEJEMTBCRDApOworCUNMQVNTRVJUKExPVl9NQUdJQ19WMSA9PSAoMHgwQkQxMDAwMCB8IDB4MEJEMCkpOwogCiAJLyogQ2hlY2tzIGZvciBzdHJ1Y3QgbG92X21kc19tZF92MyAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBsb3ZfbWRzX21kX3YzKSA9PSA0OCwgImZvdW5kICVsbGRcbiIsCkBAIC0xMzc1LDcgKzEzODMsNyBAQAogCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsb3ZfbWRzX21kX3YzLCBsbW1fbGF5b3V0X2dlbikpOwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxvdl9tZHNfbWRfdjMgKikwKS0+bG1tX2xheW91dF9nZW4pID09IDIsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsb3ZfbWRzX21kX3YzICopMCktPmxtbV9sYXlvdXRfZ2VuKSk7Ci0JQ0xBU1NFUlQoTE9WX01BWFBPT0xOQU1FID09IDE2KTsKKwlDTEFTU0VSVChMT1ZfTUFYUE9PTE5BTUUgPT0gMTUpOwogCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxvdl9tZHNfbWRfdjMsIGxtbV9wb29sX25hbWVbMTZdKSA9PSA0OCwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxvdl9tZHNfbWRfdjMsIGxtbV9wb29sX25hbWVbMTZdKSk7CiAJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG92X21kc19tZF92MyAqKTApLT5sbW1fcG9vbF9uYW1lWzE2XSkgPT0gMSwgImZvdW5kICVsbGRcbiIsCkBAIC0xMzg0LDE1ICsxMzkyLDY0IEBACiAJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxvdl9tZHNfbWRfdjMsIGxtbV9vYmplY3RzWzBdKSk7CiAJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG92X21kc19tZF92MyAqKTApLT5sbW1fb2JqZWN0c1swXSkgPT0gMjQsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsb3ZfbWRzX21kX3YzICopMCktPmxtbV9vYmplY3RzWzBdKSk7Ci0JQ0xBU1NFUlQoTE9WX01BR0lDX1YzID09IDB4MEJEMzBCRDApOworCUNMQVNTRVJUKExPVl9NQUdJQ19WMyA9PSAoMHgwQkQzMDAwMCB8IDB4MEJEMCkpOwogCUxBU1NFUlRGKExPVl9QQVRURVJOX1JBSUQwID09IDB4MDAwMDAwMDFVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTE9WX1BBVFRFUk5fUkFJRDApOworCQkgKHVuc2lnbmVkKUxPVl9QQVRURVJOX1JBSUQwKTsKIAlMQVNTRVJURihMT1ZfUEFUVEVSTl9SQUlEMSA9PSAweDAwMDAwMDAyVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUxPVl9QQVRURVJOX1JBSUQxKTsKKwkJICh1bnNpZ25lZClMT1ZfUEFUVEVSTl9SQUlEMSk7CiAJTEFTU0VSVEYoTE9WX1BBVFRFUk5fRklSU1QgPT0gMHgwMDAwMDEwMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClMT1ZfUEFUVEVSTl9GSVJTVCk7CisJCSAodW5zaWduZWQpTE9WX1BBVFRFUk5fRklSU1QpOwogCUxBU1NFUlRGKExPVl9QQVRURVJOX0NNT0JEID09IDB4MDAwMDAyMDBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTE9WX1BBVFRFUk5fQ01PQkQpOworCQkgKHVuc2lnbmVkKUxPVl9QQVRURVJOX0NNT0JEKTsKKworCS8qIENoZWNrcyBmb3Igc3RydWN0IGxtdl9tZHNfbWRfdjEgKi8KKwlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3QgbG12X21kc19tZF92MSkgPT0gNTYsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZihzdHJ1Y3QgbG12X21kc19tZF92MSkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9tYWdpYykgPT0gMCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9tYWdpYykpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X21hZ2ljKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X21kc19tZF92MSAqKTApLT5sbXZfbWFnaWMpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfc3RyaXBlX2NvdW50KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X3N0cmlwZV9jb3VudCkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X3N0cmlwZV9jb3VudCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X3N0cmlwZV9jb3VudCkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9tYXN0ZXJfbWR0X2luZGV4KSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X21hc3Rlcl9tZHRfaW5kZXgpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9tYXN0ZXJfbWR0X2luZGV4KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X21kc19tZF92MSAqKTApLT5sbXZfbWFzdGVyX21kdF9pbmRleCkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9oYXNoX3R5cGUpID09IDEyLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X2hhc2hfdHlwZSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X2hhc2hfdHlwZSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X2hhc2hfdHlwZSkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9sYXlvdXRfdmVyc2lvbikgPT0gMTYsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfbGF5b3V0X3ZlcnNpb24pKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9sYXlvdXRfdmVyc2lvbikgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X2xheW91dF92ZXJzaW9uKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X3BhZGRpbmcxKSA9PSAyMCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9wYWRkaW5nMSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X3BhZGRpbmcxKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X21kc19tZF92MSAqKTApLT5sbXZfcGFkZGluZzEpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfcGFkZGluZzIpID09IDI0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X3BhZGRpbmcyKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG12X21kc19tZF92MSAqKTApLT5sbXZfcGFkZGluZzIpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9wYWRkaW5nMikpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9wYWRkaW5nMykgPT0gMzIsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfcGFkZGluZzMpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9wYWRkaW5nMykgPT0gOCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X3BhZGRpbmczKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X3Bvb2xfbmFtZVsxNl0pID09IDU2LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X3Bvb2xfbmFtZVsxNl0pKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9wb29sX25hbWVbMTZdKSA9PSAxLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X21kc19tZF92MSAqKTApLT5sbXZfcG9vbF9uYW1lWzE2XSkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9zdHJpcGVfZmlkc1swXSkgPT0gNTYsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfc3RyaXBlX2ZpZHNbMF0pKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9zdHJpcGVfZmlkc1swXSkgPT0gMTYsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9zdHJpcGVfZmlkc1swXSkpOworCUNMQVNTRVJUKExNVl9NQUdJQ19WMSA9PSAweDBDRDIwQ0QwKTsKKwlDTEFTU0VSVChMTVZfTUFHSUNfU1RSSVBFID09IDB4MENENDBDRDApOworCUNMQVNTRVJUKExNVl9IQVNIX1RZUEVfTUFTSyA9PSAweDAwMDBmZmZmKTsKKwlDTEFTU0VSVChMTVZfSEFTSF9GTEFHX01JR1JBVElPTiA9PSAweDgwMDAwMDAwKTsKKwlDTEFTU0VSVChMTVZfSEFTSF9GTEFHX0RFQUQgPT0gMHg0MDAwMDAwMCk7CiAKIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBvYmRfc3RhdGZzICovCiAJTEFTU0VSVEYoKGludClzaXplb2Yoc3RydWN0IG9iZF9zdGF0ZnMpID09IDE0NCwgImZvdW5kICVsbGRcbiIsCkBAIC0xNTgyLDUzICsxNjM5LDUzIEBACiAJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3Qgb2JkX2RxYmxrICopMCktPmRxYl9wYWRkaW5nKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3Qgb2JkX2RxYmxrICopMCktPmRxYl9wYWRkaW5nKSk7CiAJTEFTU0VSVEYoUV9RVU9UQUNIRUNLID09IDB4ODAwMTAwLCAiZm91bmQgMHglLjh4XG4iLAotCQlRX1FVT1RBQ0hFQ0spOworCQkgUV9RVU9UQUNIRUNLKTsKIAlMQVNTRVJURihRX0lOSVRRVU9UQSA9PSAweDgwMDEwMSwgImZvdW5kIDB4JS44eFxuIiwKLQkJUV9JTklUUVVPVEEpOworCQkgUV9JTklUUVVPVEEpOwogCUxBU1NFUlRGKFFfR0VUT0lORk8gPT0gMHg4MDAxMDIsICJmb3VuZCAweCUuOHhcbiIsCi0JCVFfR0VUT0lORk8pOworCQkgUV9HRVRPSU5GTyk7CiAJTEFTU0VSVEYoUV9HRVRPUVVPVEEgPT0gMHg4MDAxMDMsICJmb3VuZCAweCUuOHhcbiIsCi0JCVFfR0VUT1FVT1RBKTsKKwkJIFFfR0VUT1FVT1RBKTsKIAlMQVNTRVJURihRX0ZJTlZBTElEQVRFID09IDB4ODAwMTA0LCAiZm91bmQgMHglLjh4XG4iLAotCQlRX0ZJTlZBTElEQVRFKTsKKwkJIFFfRklOVkFMSURBVEUpOwogCiAJLyogQ2hlY2tzIGZvciBzdHJ1Y3QgbmlvYnVmX3JlbW90ZSAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBuaW9idWZfcmVtb3RlKSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKHN0cnVjdCBuaW9idWZfcmVtb3RlKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbmlvYnVmX3JlbW90ZSwgb2Zmc2V0KSA9PSAwLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbmlvYnVmX3JlbW90ZSwgb2Zmc2V0KSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbmlvYnVmX3JlbW90ZSAqKTApLT5vZmZzZXQpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBuaW9idWZfcmVtb3RlICopMCktPm9mZnNldCkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG5pb2J1Zl9yZW1vdGUsIGxlbikgPT0gOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG5pb2J1Zl9yZW1vdGUsIGxlbikpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG5pb2J1Zl9yZW1vdGUgKikwKS0+bGVuKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbmlvYnVmX3JlbW90ZSAqKTApLT5sZW4pKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBuaW9idWZfcmVtb3RlLCBmbGFncykgPT0gMTIsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBuaW9idWZfcmVtb3RlLCBmbGFncykpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG5pb2J1Zl9yZW1vdGUgKikwKS0+ZmxhZ3MpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBuaW9idWZfcmVtb3RlICopMCktPmZsYWdzKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbmlvYnVmX3JlbW90ZSwgcm5iX29mZnNldCkgPT0gMCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG5pb2J1Zl9yZW1vdGUsIHJuYl9vZmZzZXQpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBuaW9idWZfcmVtb3RlICopMCktPnJuYl9vZmZzZXQpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBuaW9idWZfcmVtb3RlICopMCktPnJuYl9vZmZzZXQpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBuaW9idWZfcmVtb3RlLCBybmJfbGVuKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbmlvYnVmX3JlbW90ZSwgcm5iX2xlbikpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG5pb2J1Zl9yZW1vdGUgKikwKS0+cm5iX2xlbikgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG5pb2J1Zl9yZW1vdGUgKikwKS0+cm5iX2xlbikpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG5pb2J1Zl9yZW1vdGUsIHJuYl9mbGFncykgPT0gMTIsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBuaW9idWZfcmVtb3RlLCBybmJfZmxhZ3MpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBuaW9idWZfcmVtb3RlICopMCktPnJuYl9mbGFncykgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG5pb2J1Zl9yZW1vdGUgKikwKS0+cm5iX2ZsYWdzKSk7CiAJTEFTU0VSVEYoT0JEX0JSV19SRUFEID09IDB4MDEsICJmb3VuZCAweCUuOHhcbiIsCi0JCU9CRF9CUldfUkVBRCk7CisJCSBPQkRfQlJXX1JFQUQpOwogCUxBU1NFUlRGKE9CRF9CUldfV1JJVEUgPT0gMHgwMiwgImZvdW5kIDB4JS44eFxuIiwKLQkJT0JEX0JSV19XUklURSk7CisJCSBPQkRfQlJXX1dSSVRFKTsKIAlMQVNTRVJURihPQkRfQlJXX1NZTkMgPT0gMHgwOCwgImZvdW5kIDB4JS44eFxuIiwKLQkJT0JEX0JSV19TWU5DKTsKKwkJIE9CRF9CUldfU1lOQyk7CiAJTEFTU0VSVEYoT0JEX0JSV19DSEVDSyA9PSAweDEwLCAiZm91bmQgMHglLjh4XG4iLAotCQlPQkRfQlJXX0NIRUNLKTsKKwkJIE9CRF9CUldfQ0hFQ0spOwogCUxBU1NFUlRGKE9CRF9CUldfRlJPTV9HUkFOVCA9PSAweDIwLCAiZm91bmQgMHglLjh4XG4iLAotCQlPQkRfQlJXX0ZST01fR1JBTlQpOworCQkgT0JEX0JSV19GUk9NX0dSQU5UKTsKIAlMQVNTRVJURihPQkRfQlJXX0dSQU5URUQgPT0gMHg0MCwgImZvdW5kIDB4JS44eFxuIiwKLQkJT0JEX0JSV19HUkFOVEVEKTsKKwkJIE9CRF9CUldfR1JBTlRFRCk7CiAJTEFTU0VSVEYoT0JEX0JSV19OT0NBQ0hFID09IDB4ODAsICJmb3VuZCAweCUuOHhcbiIsCi0JCU9CRF9CUldfTk9DQUNIRSk7CisJCSBPQkRfQlJXX05PQ0FDSEUpOwogCUxBU1NFUlRGKE9CRF9CUldfTk9RVU9UQSA9PSAweDEwMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJT0JEX0JSV19OT1FVT1RBKTsKKwkJIE9CRF9CUldfTk9RVU9UQSk7CiAJTEFTU0VSVEYoT0JEX0JSV19TUlZMT0NLID09IDB4MjAwLCAiZm91bmQgMHglLjh4XG4iLAotCQlPQkRfQlJXX1NSVkxPQ0spOworCQkgT0JEX0JSV19TUlZMT0NLKTsKIAlMQVNTRVJURihPQkRfQlJXX0FTWU5DID09IDB4NDAwLCAiZm91bmQgMHglLjh4XG4iLAotCQlPQkRfQlJXX0FTWU5DKTsKKwkJIE9CRF9CUldfQVNZTkMpOwogCUxBU1NFUlRGKE9CRF9CUldfTUVNQUxMT0MgPT0gMHg4MDAsICJmb3VuZCAweCUuOHhcbiIsCi0JCU9CRF9CUldfTUVNQUxMT0MpOworCQkgT0JEX0JSV19NRU1BTExPQyk7CiAJTEFTU0VSVEYoT0JEX0JSV19PVkVSX1VTUlFVT1RBID09IDB4MTAwMCwgImZvdW5kIDB4JS44eFxuIiwKIAkJIE9CRF9CUldfT1ZFUl9VU1JRVU9UQSk7CiAJTEFTU0VSVEYoT0JEX0JSV19PVkVSX0dSUFFVT1RBID09IDB4MjAwMCwgImZvdW5kIDB4JS44eFxuIiwKQEAgLTE2NjMsMjAzICsxNzIwLDIwMyBAQAogCS8qIENoZWNrcyBmb3Igc3RydWN0IG1kdF9ib2R5ICovCiAJTEFTU0VSVEYoKGludClzaXplb2Yoc3RydWN0IG1kdF9ib2R5KSA9PSAyMTYsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZihzdHJ1Y3QgbWR0X2JvZHkpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZmlkMSkgPT0gMCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBmaWQxKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+ZmlkMSkgPT0gMTYsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5maWQxKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGZpZDIpID09IDE2LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGZpZDIpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5maWQyKSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmZpZDIpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgaGFuZGxlKSA9PSAzMiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBoYW5kbGUpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5oYW5kbGUpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5oYW5kbGUpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgdmFsaWQpID09IDQwLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHZhbGlkKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+dmFsaWQpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT52YWxpZCkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBzaXplKSA9PSA0OCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBzaXplKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+c2l6ZSkgPT0gOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnNpemUpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbXRpbWUpID09IDU2LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG10aW1lKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bXRpbWUpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tdGltZSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBhdGltZSkgPT0gNjQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgYXRpbWUpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5hdGltZSkgPT0gOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmF0aW1lKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGN0aW1lKSA9PSA3MiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBjdGltZSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmN0aW1lKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+Y3RpbWUpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgYmxvY2tzKSA9PSA4MCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBibG9ja3MpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5ibG9ja3MpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5ibG9ja3MpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgdF9zdGF0ZSkgPT0gOTYsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgdF9zdGF0ZSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnRfc3RhdGUpID09IDgsCisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19maWQxKSA9PSAwLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19maWQxKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2ZpZDEpID09IDE2LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2ZpZDEpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2ZpZDIpID09IDE2LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19maWQyKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2ZpZDIpID09IDE2LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2ZpZDIpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2hhbmRsZSkgPT0gMzIsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2hhbmRsZSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19oYW5kbGUpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9faGFuZGxlKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib192YWxpZCkgPT0gNDAsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3ZhbGlkKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3ZhbGlkKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3ZhbGlkKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19zaXplKSA9PSA0OCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fc2l6ZSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19zaXplKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3NpemUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX210aW1lKSA9PSA1NiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fbXRpbWUpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fbXRpbWUpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fbXRpbWUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2F0aW1lKSA9PSA2NCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fYXRpbWUpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fYXRpbWUpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fYXRpbWUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2N0aW1lKSA9PSA3MiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fY3RpbWUpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fY3RpbWUpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fY3RpbWUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2Jsb2NrcykgPT0gODAsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2Jsb2NrcykpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19ibG9ja3MpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fYmxvY2tzKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib190X3N0YXRlKSA9PSA5NiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fdF9zdGF0ZSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib190X3N0YXRlKSA9PSA4LAogCQkgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnRfc3RhdGUpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZnN1aWQpID09IDEwNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBmc3VpZCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmZzdWlkKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+ZnN1aWQpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZnNnaWQpID09IDEwOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBmc2dpZCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmZzZ2lkKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+ZnNnaWQpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgY2FwYWJpbGl0eSkgPT0gMTEyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGNhcGFiaWxpdHkpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5jYXBhYmlsaXR5KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+Y2FwYWJpbGl0eSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtb2RlKSA9PSAxMTYsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbW9kZSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1vZGUpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tb2RlKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHVpZCkgPT0gMTIwLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHVpZCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnVpZCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnVpZCkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBnaWQpID09IDEyNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBnaWQpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5naWQpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5naWQpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZmxhZ3MpID09IDEyOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBmbGFncykpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmZsYWdzKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+ZmxhZ3MpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgcmRldikgPT0gMTMyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHJkZXYpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5yZGV2KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+cmRldikpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBubGluaykgPT0gMTM2LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG5saW5rKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bmxpbmspID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5ubGluaykpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCB1bnVzZWQyKSA9PSAxNDAsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgdW51c2VkMikpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnVudXNlZDIpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT51bnVzZWQyKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHN1cHBnaWQpID09IDE0NCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBzdXBwZ2lkKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+c3VwcGdpZCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnN1cHBnaWQpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZWFkYXRhc2l6ZSkgPT0gMTQ4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGVhZGF0YXNpemUpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5lYWRhdGFzaXplKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+ZWFkYXRhc2l6ZSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBhY2xzaXplKSA9PSAxNTIsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgYWNsc2l6ZSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmFjbHNpemUpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5hY2xzaXplKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1heF9tZHNpemUpID09IDE1NiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYXhfbWRzaXplKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWF4X21kc2l6ZSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1heF9tZHNpemUpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWF4X2Nvb2tpZXNpemUpID09IDE2MCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYXhfY29va2llc2l6ZSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1heF9jb29raWVzaXplKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWF4X2Nvb2tpZXNpemUpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgdWlkX2gpID09IDE2NCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCB1aWRfaCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnVpZF9oKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+dWlkX2gpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZ2lkX2gpID09IDE2OCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBnaWRfaCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmdpZF9oKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+Z2lkX2gpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgcGFkZGluZ181KSA9PSAxNzIsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgcGFkZGluZ181KSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+cGFkZGluZ181KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+cGFkZGluZ181KSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHBhZGRpbmdfNikgPT0gMTc2LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHBhZGRpbmdfNikpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnBhZGRpbmdfNikgPT0gOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnBhZGRpbmdfNikpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBwYWRkaW5nXzcpID09IDE4NCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBwYWRkaW5nXzcpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5wYWRkaW5nXzcpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5wYWRkaW5nXzcpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgcGFkZGluZ184KSA9PSAxOTIsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgcGFkZGluZ184KSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+cGFkZGluZ184KSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+cGFkZGluZ184KSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHBhZGRpbmdfOSkgPT0gMjAwLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHBhZGRpbmdfOSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnBhZGRpbmdfOSkgPT0gOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnBhZGRpbmdfOSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBwYWRkaW5nXzEwKSA9PSAyMDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgcGFkZGluZ18xMCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnBhZGRpbmdfMTApID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5wYWRkaW5nXzEwKSk7CisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib190X3N0YXRlKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19mc3VpZCkgPT0gMTA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19mc3VpZCkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19mc3VpZCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19mc3VpZCkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZnNnaWQpID09IDEwOCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZnNnaWQpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fZnNnaWQpID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fZnNnaWQpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2NhcGFiaWxpdHkpID09IDExMiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fY2FwYWJpbGl0eSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19jYXBhYmlsaXR5KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2NhcGFiaWxpdHkpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX21vZGUpID09IDExNiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fbW9kZSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19tb2RlKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX21vZGUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3VpZCkgPT0gMTIwLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib191aWQpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fdWlkKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3VpZCkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZ2lkKSA9PSAxMjQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2dpZCkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19naWQpID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fZ2lkKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19mbGFncykgPT0gMTI4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19mbGFncykpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19mbGFncykgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19mbGFncykpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fcmRldikgPT0gMTMyLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19yZGV2KSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3JkZXYpID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fcmRldikpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fbmxpbmspID09IDEzNiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fbmxpbmspKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fbmxpbmspID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fbmxpbmspKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3VudXNlZDIpID09IDE0MCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fdW51c2VkMikpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib191bnVzZWQyKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3VudXNlZDIpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3N1cHBnaWQpID09IDE0NCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fc3VwcGdpZCkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19zdXBwZ2lkKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3N1cHBnaWQpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2VhZGF0YXNpemUpID09IDE0OCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZWFkYXRhc2l6ZSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19lYWRhdGFzaXplKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2VhZGF0YXNpemUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2FjbHNpemUpID09IDE1MiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fYWNsc2l6ZSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19hY2xzaXplKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2FjbHNpemUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX21heF9tZHNpemUpID09IDE1NiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fbWF4X21kc2l6ZSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19tYXhfbWRzaXplKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX21heF9tZHNpemUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX21heF9jb29raWVzaXplKSA9PSAxNjAsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX21heF9jb29raWVzaXplKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX21heF9jb29raWVzaXplKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX21heF9jb29raWVzaXplKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib191aWRfaCkgPT0gMTY0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib191aWRfaCkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib191aWRfaCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib191aWRfaCkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZ2lkX2gpID09IDE2OCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZ2lkX2gpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fZ2lkX2gpID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fZ2lkX2gpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3BhZGRpbmdfNSkgPT0gMTcyLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19wYWRkaW5nXzUpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fcGFkZGluZ181KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3BhZGRpbmdfNSkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fcGFkZGluZ182KSA9PSAxNzYsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3BhZGRpbmdfNikpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19wYWRkaW5nXzYpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fcGFkZGluZ182KSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19wYWRkaW5nXzcpID09IDE4NCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fcGFkZGluZ183KSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3BhZGRpbmdfNykgPT0gOCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19wYWRkaW5nXzcpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3BhZGRpbmdfOCkgPT0gMTkyLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19wYWRkaW5nXzgpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fcGFkZGluZ184KSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3BhZGRpbmdfOCkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fcGFkZGluZ185KSA9PSAyMDAsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3BhZGRpbmdfOSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19wYWRkaW5nXzkpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fcGFkZGluZ185KSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19wYWRkaW5nXzEwKSA9PSAyMDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3BhZGRpbmdfMTApKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fcGFkZGluZ18xMCkgPT0gOCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19wYWRkaW5nXzEwKSk7CiAJTEFTU0VSVEYoTURTX0ZNT0RFX0NMT1NFRCA9PSAwMDAwMDAwMDAwMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfRk1PREVfQ0xPU0VEKTsKKwkJIE1EU19GTU9ERV9DTE9TRUQpOwogCUxBU1NFUlRGKE1EU19GTU9ERV9FWEVDID09IDAwMDAwMDAwMDAwNFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19GTU9ERV9FWEVDKTsKKwkJIE1EU19GTU9ERV9FWEVDKTsKIAlMQVNTRVJURihNRFNfRk1PREVfRVBPQ0ggPT0gMDAwMDAxMDAwMDAwVUwsICJmb3VuZCAwJS4xMW9VTFxuIiwKLQkJTURTX0ZNT0RFX0VQT0NIKTsKKwkJIE1EU19GTU9ERV9FUE9DSCk7CiAJTEFTU0VSVEYoTURTX0ZNT0RFX1RSVU5DID09IDAwMDAwMjAwMDAwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19GTU9ERV9UUlVOQyk7CisJCSBNRFNfRk1PREVfVFJVTkMpOwogCUxBU1NFUlRGKE1EU19GTU9ERV9TT00gPT0gMDAwMDA0MDAwMDAwVUwsICJmb3VuZCAwJS4xMW9VTFxuIiwKLQkJTURTX0ZNT0RFX1NPTSk7CisJCSBNRFNfRk1PREVfU09NKTsKIAlMQVNTRVJURihNRFNfT1BFTl9DUkVBVEVEID09IDAwMDAwMDAwMDAxMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX0NSRUFURUQpOworCQkgTURTX09QRU5fQ1JFQVRFRCk7CiAJTEFTU0VSVEYoTURTX09QRU5fQ1JPU1MgPT0gMDAwMDAwMDAwMDIwVUwsICJmb3VuZCAwJS4xMW9VTFxuIiwKLQkJTURTX09QRU5fQ1JPU1MpOworCQkgTURTX09QRU5fQ1JPU1MpOwogCUxBU1NFUlRGKE1EU19PUEVOX0NSRUFUID09IDAwMDAwMDAwMDEwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX0NSRUFUKTsKKwkJIE1EU19PUEVOX0NSRUFUKTsKIAlMQVNTRVJURihNRFNfT1BFTl9FWENMID09IDAwMDAwMDAwMDIwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX0VYQ0wpOworCQkgTURTX09QRU5fRVhDTCk7CiAJTEFTU0VSVEYoTURTX09QRU5fVFJVTkMgPT0gMDAwMDAwMDAxMDAwVUwsICJmb3VuZCAwJS4xMW9VTFxuIiwKLQkJTURTX09QRU5fVFJVTkMpOworCQkgTURTX09QRU5fVFJVTkMpOwogCUxBU1NFUlRGKE1EU19PUEVOX0FQUEVORCA9PSAwMDAwMDAwMDIwMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfT1BFTl9BUFBFTkQpOworCQkgTURTX09QRU5fQVBQRU5EKTsKIAlMQVNTRVJURihNRFNfT1BFTl9TWU5DID09IDAwMDAwMDAxMDAwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX1NZTkMpOworCQkgTURTX09QRU5fU1lOQyk7CiAJTEFTU0VSVEYoTURTX09QRU5fRElSRUNUT1JZID09IDAwMDAwMDIwMDAwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX0RJUkVDVE9SWSk7CisJCSBNRFNfT1BFTl9ESVJFQ1RPUlkpOwogCUxBU1NFUlRGKE1EU19PUEVOX0JZX0ZJRCA9PSAwMDAwNDAwMDAwMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfT1BFTl9CWV9GSUQpOworCQkgTURTX09QRU5fQllfRklEKTsKIAlMQVNTRVJURihNRFNfT1BFTl9ERUxBWV9DUkVBVEUgPT0gMDAwMTAwMDAwMDAwVUwsICJmb3VuZCAwJS4xMW9VTFxuIiwKLQkJTURTX09QRU5fREVMQVlfQ1JFQVRFKTsKKwkJIE1EU19PUEVOX0RFTEFZX0NSRUFURSk7CiAJTEFTU0VSVEYoTURTX09QRU5fT1dORVJPVkVSUklERSA9PSAwMDAyMDAwMDAwMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfT1BFTl9PV05FUk9WRVJSSURFKTsKKwkJIE1EU19PUEVOX09XTkVST1ZFUlJJREUpOwogCUxBU1NFUlRGKE1EU19PUEVOX0pPSU5fRklMRSA9PSAwMDA0MDAwMDAwMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfT1BFTl9KT0lOX0ZJTEUpOworCQkgTURTX09QRU5fSk9JTl9GSUxFKTsKIAlMQVNTRVJURihNRFNfT1BFTl9MT0NLID09IDAwNDAwMDAwMDAwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX0xPQ0spOworCQkgTURTX09QRU5fTE9DSyk7CiAJTEFTU0VSVEYoTURTX09QRU5fSEFTX0VBID09IDAxMDAwMDAwMDAwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX0hBU19FQSk7CisJCSBNRFNfT1BFTl9IQVNfRUEpOwogCUxBU1NFUlRGKE1EU19PUEVOX0hBU19PQkpTID09IDAyMDAwMDAwMDAwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX0hBU19PQkpTKTsKKwkJIE1EU19PUEVOX0hBU19PQkpTKTsKIAlMQVNTRVJURihNRFNfT1BFTl9OT1JFU1RPUkUgPT0gMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDBVTEwsICJmb3VuZCAwJS4yMmxsb1VMTFxuIiwKLQkJCShsb25nIGxvbmcpTURTX09QRU5fTk9SRVNUT1JFKTsKKwkJIChsb25nIGxvbmcpTURTX09QRU5fTk9SRVNUT1JFKTsKIAlMQVNTRVJURihNRFNfT1BFTl9ORVdTVFJJUEUgPT0gMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDBVTEwsICJmb3VuZCAwJS4yMmxsb1VMTFxuIiwKLQkJCShsb25nIGxvbmcpTURTX09QRU5fTkVXU1RSSVBFKTsKKwkJIChsb25nIGxvbmcpTURTX09QRU5fTkVXU1RSSVBFKTsKIAlMQVNTRVJURihNRFNfT1BFTl9WT0xBVElMRSA9PSAwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMFVMTCwgImZvdW5kIDAlLjIybGxvVUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfT1BFTl9WT0xBVElMRSk7CisJCSAobG9uZyBsb25nKU1EU19PUEVOX1ZPTEFUSUxFKTsKIAlMQVNTRVJURihMVVNUUkVfU1lOQ19GTCA9PSAweDAwMDAwMDA4LCAiZm91bmQgMHglLjh4XG4iLAotCQlMVVNUUkVfU1lOQ19GTCk7CisJCSBMVVNUUkVfU1lOQ19GTCk7CiAJTEFTU0VSVEYoTFVTVFJFX0lNTVVUQUJMRV9GTCA9PSAweDAwMDAwMDEwLCAiZm91bmQgMHglLjh4XG4iLAotCQlMVVNUUkVfSU1NVVRBQkxFX0ZMKTsKKwkJIExVU1RSRV9JTU1VVEFCTEVfRkwpOwogCUxBU1NFUlRGKExVU1RSRV9BUFBFTkRfRkwgPT0gMHgwMDAwMDAyMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX0FQUEVORF9GTCk7CisJCSBMVVNUUkVfQVBQRU5EX0ZMKTsKIAlMQVNTRVJURihMVVNUUkVfTk9BVElNRV9GTCA9PSAweDAwMDAwMDgwLCAiZm91bmQgMHglLjh4XG4iLAotCQlMVVNUUkVfTk9BVElNRV9GTCk7CisJCSBMVVNUUkVfTk9BVElNRV9GTCk7CiAJTEFTU0VSVEYoTFVTVFJFX0RJUlNZTkNfRkwgPT0gMHgwMDAxMDAwMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX0RJUlNZTkNfRkwpOworCQkgTFVTVFJFX0RJUlNZTkNfRkwpOwogCUxBU1NFUlRGKE1EU19JTk9ERUxPQ0tfTE9PS1VQID09IDB4MDAwMDAxLCAiZm91bmQgMHglLjh4XG4iLAotCQlNRFNfSU5PREVMT0NLX0xPT0tVUCk7CisJCSBNRFNfSU5PREVMT0NLX0xPT0tVUCk7CiAJTEFTU0VSVEYoTURTX0lOT0RFTE9DS19VUERBVEUgPT0gMHgwMDAwMDIsICJmb3VuZCAweCUuOHhcbiIsCi0JCU1EU19JTk9ERUxPQ0tfVVBEQVRFKTsKKwkJIE1EU19JTk9ERUxPQ0tfVVBEQVRFKTsKIAlMQVNTRVJURihNRFNfSU5PREVMT0NLX09QRU4gPT0gMHgwMDAwMDQsICJmb3VuZCAweCUuOHhcbiIsCi0JCU1EU19JTk9ERUxPQ0tfT1BFTik7CisJCSBNRFNfSU5PREVMT0NLX09QRU4pOwogCUxBU1NFUlRGKE1EU19JTk9ERUxPQ0tfTEFZT1VUID09IDB4MDAwMDA4LCAiZm91bmQgMHglLjh4XG4iLAotCQlNRFNfSU5PREVMT0NLX0xBWU9VVCk7CisJCSBNRFNfSU5PREVMT0NLX0xBWU9VVCk7CiAKIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBtZHRfaW9lcG9jaCAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBtZHRfaW9lcG9jaCkgPT0gMjQsICJmb3VuZCAlbGxkXG4iLApAQCAtMjYxNywzNSArMjY3NCw2IEBACiAJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG12X2Rlc2MgKikwKS0+bGRfdXVpZCkgPT0gNDAsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfZGVzYyAqKTApLT5sZF91dWlkKSk7CiAKLQkvKiBDaGVja3MgZm9yIHN0cnVjdCBsbXZfc3RyaXBlX21kICovCi0JTEFTU0VSVEYoKGludClzaXplb2Yoc3RydWN0IGxtdl9zdHJpcGVfbWQpID09IDMyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2Yoc3RydWN0IGxtdl9zdHJpcGVfbWQpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfc3RyaXBlX21kLCBtZWFfbWFnaWMpID09IDAsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfc3RyaXBlX21kLCBtZWFfbWFnaWMpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfc3RyaXBlX21kICopMCktPm1lYV9tYWdpYykgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9zdHJpcGVfbWQgKikwKS0+bWVhX21hZ2ljKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X3N0cmlwZV9tZCwgbWVhX2NvdW50KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X3N0cmlwZV9tZCwgbWVhX2NvdW50KSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKTApLT5tZWFfY291bnQpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfc3RyaXBlX21kICopMCktPm1lYV9jb3VudCkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9zdHJpcGVfbWQsIG1lYV9tYXN0ZXIpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfc3RyaXBlX21kLCBtZWFfbWFzdGVyKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKTApLT5tZWFfbWFzdGVyKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKTApLT5tZWFfbWFzdGVyKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X3N0cmlwZV9tZCwgbWVhX3BhZGRpbmcpID09IDEyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X3N0cmlwZV9tZCwgbWVhX3BhZGRpbmcpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfc3RyaXBlX21kICopMCktPm1lYV9wYWRkaW5nKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKTApLT5tZWFfcGFkZGluZykpOwotCUNMQVNTRVJUKExPVl9NQVhQT09MTkFNRSA9PSAxNik7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X3N0cmlwZV9tZCwgbWVhX3Bvb2xfbmFtZVsxNl0pID09IDMyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X3N0cmlwZV9tZCwgbWVhX3Bvb2xfbmFtZVsxNl0pKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfc3RyaXBlX21kICopMCktPm1lYV9wb29sX25hbWVbMTZdKSA9PSAxLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKTApLT5tZWFfcG9vbF9uYW1lWzE2XSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9zdHJpcGVfbWQsIG1lYV9pZHNbMF0pID09IDMyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X3N0cmlwZV9tZCwgbWVhX2lkc1swXSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9zdHJpcGVfbWQgKikwKS0+bWVhX2lkc1swXSkgPT0gMTYsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfc3RyaXBlX21kICopMCktPm1lYV9pZHNbMF0pKTsKLQogCS8qIENoZWNrcyBmb3Igc3RydWN0IGxvdl9kZXNjICovCiAJTEFTU0VSVEYoKGludClzaXplb2Yoc3RydWN0IGxvdl9kZXNjKSA9PSA4OCwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKHN0cnVjdCBsb3ZfZGVzYykpOwpAQCAtMzE5NSwxMCArMzIyMywxMCBAQAogCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbG9nX3NldGF0dHI2NF9yZWMsIGxzcl9naWRfaCkpOwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxsb2dfc2V0YXR0cjY0X3JlYyAqKTApLT5sc3JfZ2lkX2gpID09IDQsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbG9nX3NldGF0dHI2NF9yZWMgKikwKS0+bHNyX2dpZF9oKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjLCBsc3JfcGFkZGluZykgPT0gNDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbG9nX3NldGF0dHI2NF9yZWMsIGxzcl9wYWRkaW5nKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjICopMCktPmxzcl9wYWRkaW5nKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjICopMCktPmxzcl9wYWRkaW5nKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjLCBsc3JfdmFsaWQpID09IDQ4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjLCBsc3JfdmFsaWQpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbG9nX3NldGF0dHI2NF9yZWMgKikwKS0+bHNyX3ZhbGlkKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjICopMCktPmxzcl92YWxpZCkpOwogCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxsb2dfc2V0YXR0cjY0X3JlYywgbHNyX3RhaWwpID09IDU2LCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjLCBsc3JfdGFpbCkpOwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxsb2dfc2V0YXR0cjY0X3JlYyAqKTApLT5sc3JfdGFpbCkgPT0gOCwgImZvdW5kICVsbGRcbiIsCkBAIC0zMjcyLDUwICszMzAwLDYgQEAKIAlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfcmVjICopMCktPmNyX3BmaWQpID09IDE2LCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX3JlYyAqKTApLT5jcl9wZmlkKSk7CiAKLQkvKiBDaGVja3MgZm9yIHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqLwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYykgPT0gOTYsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfbmFtZWxlbikgPT0gMCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl9uYW1lbGVuKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKikwKS0+Y3JfbmFtZWxlbikgPT0gMiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX25hbWVsZW4pKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfZmxhZ3MpID09IDIsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfZmxhZ3MpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl9mbGFncykgPT0gMiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX2ZsYWdzKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX3R5cGUpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfdHlwZSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX3R5cGUpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl90eXBlKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX2luZGV4KSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX2luZGV4KSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKikwKS0+Y3JfaW5kZXgpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl9pbmRleCkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl9wcmV2KSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl9wcmV2KSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKikwKS0+Y3JfcHJldikgPT0gOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX3ByZXYpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfdGltZSkgPT0gMjQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfdGltZSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX3RpbWUpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl90aW1lKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX3RmaWQpID09IDMyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX3RmaWQpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl90ZmlkKSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX3RmaWQpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfcGZpZCkgPT0gNDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfcGZpZCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX3BmaWQpID09IDE2LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKikwKS0+Y3JfcGZpZCkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl9zZmlkKSA9PSA2NCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl9zZmlkKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKikwKS0+Y3Jfc2ZpZCkgPT0gMTYsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl9zZmlkKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX3NwZmlkKSA9PSA4MCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl9zcGZpZCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX3NwZmlkKSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX3NwZmlkKSk7Ci0KIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBjaGFuZ2Vsb2dfc2V0aW5mbyAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBjaGFuZ2Vsb2dfc2V0aW5mbykgPT0gMTIsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZihzdHJ1Y3QgY2hhbmdlbG9nX3NldGluZm8pKTsKQEAgLTMzMzksMTAgKzMzMjMsMTAgQEAKIAkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfcmVjLCBjcikpOwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxsb2dfY2hhbmdlbG9nX3JlYyAqKTApLT5jcikgPT0gNjQsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbG9nX2NoYW5nZWxvZ19yZWMgKikwKS0+Y3IpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbG9nX2NoYW5nZWxvZ19yZWMsIGNyX3RhaWwpID09IDgwLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfcmVjLCBjcl90YWlsKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfcmVjICopMCktPmNyX3RhaWwpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbG9nX2NoYW5nZWxvZ19yZWMgKikwKS0+Y3JfdGFpbCkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxsb2dfY2hhbmdlbG9nX3JlYywgY3JfZG9fbm90X3VzZSkgPT0gODAsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbG9nX2NoYW5nZWxvZ19yZWMsIGNyX2RvX25vdF91c2UpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbG9nX2NoYW5nZWxvZ19yZWMgKikwKS0+Y3JfZG9fbm90X3VzZSkgPT0gOCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxsb2dfY2hhbmdlbG9nX3JlYyAqKTApLT5jcl9kb19ub3RfdXNlKSk7CiAKIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBsbG9nX2NoYW5nZWxvZ191c2VyX3JlYyAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBsbG9nX2NoYW5nZWxvZ191c2VyX3JlYykgPT0gNDAsICJmb3VuZCAlbGxkXG4iLApAQCAtMzUwNiw2ICszNDkwLDE5IEBACiAJQ0xBU1NFUlQoTExPR19PUklHSU5fSEFORExFX0RFU1RST1kgPT0gNTA5KTsKIAlDTEFTU0VSVChMTE9HX0ZJUlNUX09QQyA9PSA1MDEpOwogCUNMQVNTRVJUKExMT0dfTEFTVF9PUEMgPT0gNTEwKTsKKwlDTEFTU0VSVChMTE9HX0NPTkZJR19PUklHX0NUWFQgPT0gMCk7CisJQ0xBU1NFUlQoTExPR19DT05GSUdfUkVQTF9DVFhUID09IDEpOworCUNMQVNTRVJUKExMT0dfTURTX09TVF9PUklHX0NUWFQgPT0gMik7CisJQ0xBU1NFUlQoTExPR19NRFNfT1NUX1JFUExfQ1RYVCA9PSAzKTsKKwlDTEFTU0VSVChMTE9HX1NJWkVfT1JJR19DVFhUID09IDQpOworCUNMQVNTRVJUKExMT0dfU0laRV9SRVBMX0NUWFQgPT0gNSk7CisJQ0xBU1NFUlQoTExPR19URVNUX09SSUdfQ1RYVCA9PSA4KTsKKwlDTEFTU0VSVChMTE9HX1RFU1RfUkVQTF9DVFhUID09IDkpOworCUNMQVNTRVJUKExMT0dfQ0hBTkdFTE9HX09SSUdfQ1RYVCA9PSAxMik7CisJQ0xBU1NFUlQoTExPR19DSEFOR0VMT0dfUkVQTF9DVFhUID09IDEzKTsKKwlDTEFTU0VSVChMTE9HX0NIQU5HRUxPR19VU0VSX09SSUdfQ1RYVCA9PSAxNCk7CisJQ0xBU1NFUlQoTExPR19BR0VOVF9PUklHX0NUWFQgPT0gMTUpOworCUNMQVNTRVJUKExMT0dfTUFYX0NUWFRTID09IDE2KTsKIAogCS8qIENoZWNrcyBmb3Igc3RydWN0IGxsb2dkX2Nvbm5fYm9keSAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBsbG9nZF9jb25uX2JvZHkpID09IDQwLCAiZm91bmQgJWxsZFxuIiwKQEAgLTM5NDMsOSArMzk0MCw5IEBACiAJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgaHNtX3Byb2dyZXNzICopMCktPnBhZGRpbmcpID09IDQsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBoc21fcHJvZ3Jlc3MgKikwKS0+cGFkZGluZykpOwogCUxBU1NFUlRGKEhQX0ZMQUdfQ09NUExFVEVEID09IDB4MDEsICJmb3VuZCAweCUuOHhcbiIsCi0JCUhQX0ZMQUdfQ09NUExFVEVEKTsKKwkJIEhQX0ZMQUdfQ09NUExFVEVEKTsKIAlMQVNTRVJURihIUF9GTEFHX1JFVFJZID09IDB4MDIsICJmb3VuZCAweCUuOHhcbiIsCi0JCUhQX0ZMQUdfUkVUUlkpOworCQkgSFBfRkxBR19SRVRSWSk7CiAKIAlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBoc21fY29weSwgaGNfZGF0YV92ZXJzaW9uKSA9PSAwLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgaHNtX2NvcHksIGhjX2RhdGFfdmVyc2lvbikpOwpAQCAtNDEwMCw5ICs0MDk3LDkgQEAKIAlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBoc21fcmVxdWVzdCAqKTApLT5ocl9kYXRhX2xlbikgPT0gNCwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGhzbV9yZXF1ZXN0ICopMCktPmhyX2RhdGFfbGVuKSk7CiAJTEFTU0VSVEYoSFNNX0ZPUkNFX0FDVElPTiA9PSAweDAwMDAwMDAxVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUhTTV9GT1JDRV9BQ1RJT04pOworCQkgKHVuc2lnbmVkKUhTTV9GT1JDRV9BQ1RJT04pOwogCUxBU1NFUlRGKEhTTV9HSE9TVF9DT1BZID09IDB4MDAwMDAwMDJVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpSFNNX0dIT1NUX0NPUFkpOworCQkgKHVuc2lnbmVkKUhTTV9HSE9TVF9DT1BZKTsKIAogCS8qIENoZWNrcyBmb3Igc3RydWN0IGhzbV91c2VyX3JlcXVlc3QgKi8KIAlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3QgaHNtX3VzZXJfcmVxdWVzdCkgPT0gMjQsICJmb3VuZCAlbGxkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2JjbTIwNDgvcmFkaW8tYmNtMjA0OC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2JjbTIwNDgvcmFkaW8tYmNtMjA0OC5jCmluZGV4IDhkYWRlMTkuLmVhMTVjYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9iY20yMDQ4L3JhZGlvLWJjbTIwNDguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYmNtMjA0OC9yYWRpby1iY20yMDQ4LmMKQEAgLTQ4MywxMCArNDgzLDggQEAKIAkJbWVtc2V0KCZiZGV2LT5yZHNfaW5mbywgMCwgc2l6ZW9mKGJkZXYtPnJkc19pbmZvKSk7CiAJfQogCi0JZXJyID0gYmNtMjA0OF9zZW5kX2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fUkRTX1NZU1RFTSwKLQkJCQkgICBiZGV2LT5jYWNoZV9mbV9yZHNfc3lzdGVtKTsKLQotCXJldHVybiBlcnI7CisJcmV0dXJuIGJjbTIwNDhfc2VuZF9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX1JEU19TWVNURU0sCisJCQkJICAgIGJkZXYtPmNhY2hlX2ZtX3Jkc19zeXN0ZW0pOwogfQogCiBzdGF0aWMgaW50IGJjbTIwNDhfZ2V0X3Jkc19ub19sb2NrKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldikKQEAgLTE4MzQsOSArMTgzMiw3IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQllcnIgPSBiY20yMDQ4X3NldF9wb3dlcl9zdGF0ZShiZGV2LCBCQ00yMDQ4X1BPV0VSX09GRik7Ci0KLQlyZXR1cm4gZXJyOworCXJldHVybiBiY20yMDQ4X3NldF9wb3dlcl9zdGF0ZShiZGV2LCBCQ00yMDQ4X1BPV0VSX09GRik7CiB9CiAKIC8qCkBAIC0xOTk1LDkgKzE5OTEsNyBAQAogCQkJCQkJCQkJXAogCXZhbHVlID0gYmNtMjA0OF9nZXRfIyNwcm9wKGJkZXYpOwkJCQlcCiAJCQkJCQkJCQlcCi0JdmFsdWUgPSBzcHJpbnRmKGJ1ZiwgbWFzayAiXG4iLCB2YWx1ZSk7CQkJCVwKLQkJCQkJCQkJCVwKLQlyZXR1cm4gdmFsdWU7CQkJCQkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsIG1hc2sgIlxuIiwgdmFsdWUpOwkJCQlcCiB9CiAKICNkZWZpbmUgREVGSU5FX1NZU0ZTX1BST1BFUlRZKHByb3AsIHNpZ25hbCwgc2l6ZSwgbWFzaywgY2hlY2spCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL1RPRE8KaW5kZXggYTEwZDRmOC4uMTMyMjQ2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2NlYy9UT0RPCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvVE9ETwpAQCAtMTIsNiArMTIsNyBAQAogCiBPdGhlciBUT0RPczoKIAorLSBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIHJlcGxpZXMgdG8gQ0VDX01TR19JTklUSUFURV9BUkMuIEhvdyB0byBoYW5kbGUgdGhhdD8KIC0gQWRkIGEgZmxhZyB0byBpbmhpYml0IHBhc3NpbmcgQ0VDIFJDIG1lc3NhZ2VzIHRvIHRoZSByYyBzdWJzeXN0ZW0uCiAgIEFwcGxpY2F0aW9ucyBzaG91bGQgYmUgYWJsZSB0byBjaG9vc2UgdGhpcyB3aGVuIGNhbGxpbmcgU19MT0dfQUREUlMuCiAtIElmIHRoZSByZXBseSBmaWVsZCBvZiBjZWNfbXNnIGlzIHNldCB0aGVuIHdoZW4gdGhlIHJlcGx5IGFycml2ZXMgaXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvY2VjLWFkYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvY2VjLWFkYXAuYwppbmRleCBiMjM5M2JiLi45NDY5ODZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL2NlYy1hZGFwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2NlYy9jZWMtYWRhcC5jCkBAIC0xMjQsMTAgKzEyNCwxMCBAQAogCXU2NCB0cyA9IGt0aW1lX2dldF9ucygpOwogCXN0cnVjdCBjZWNfZmggKmZoOwogCi0JbXV0ZXhfbG9jaygmYWRhcC0+ZGV2bm9kZS5maHNfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcC0+ZGV2bm9kZS5sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZoLCAmYWRhcC0+ZGV2bm9kZS5maHMsIGxpc3QpCiAJCWNlY19xdWV1ZV9ldmVudF9maChmaCwgZXYsIHRzKTsKLQltdXRleF91bmxvY2soJmFkYXAtPmRldm5vZGUuZmhzX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcC0+ZGV2bm9kZS5sb2NrKTsKIH0KIAogLyoKQEAgLTE5MSwxMiArMTkxLDEyIEBACiAJdTMyIG1vbml0b3JfbW9kZSA9IHZhbGlkX2xhID8gQ0VDX01PREVfTU9OSVRPUiA6CiAJCQkJICAgICAgQ0VDX01PREVfTU9OSVRPUl9BTEw7CiAKLQltdXRleF9sb2NrKCZhZGFwLT5kZXZub2RlLmZoc19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwLT5kZXZub2RlLmxvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZmgsICZhZGFwLT5kZXZub2RlLmZocywgbGlzdCkgewogCQlpZiAoZmgtPm1vZGVfZm9sbG93ZXIgPj0gbW9uaXRvcl9tb2RlKQogCQkJY2VjX3F1ZXVlX21zZ19maChmaCwgbXNnKTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZhZGFwLT5kZXZub2RlLmZoc19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXAtPmRldm5vZGUubG9jayk7CiB9CiAKIC8qCkBAIC0yMDcsMTIgKzIwNywxMiBAQAogewogCXN0cnVjdCBjZWNfZmggKmZoOwogCi0JbXV0ZXhfbG9jaygmYWRhcC0+ZGV2bm9kZS5maHNfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcC0+ZGV2bm9kZS5sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZoLCAmYWRhcC0+ZGV2bm9kZS5maHMsIGxpc3QpIHsKIAkJaWYgKGZoLT5tb2RlX2ZvbGxvd2VyID09IENFQ19NT0RFX0ZPTExPV0VSKQogCQkJY2VjX3F1ZXVlX21zZ19maChmaCwgbXNnKTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZhZGFwLT5kZXZub2RlLmZoc19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXAtPmRldm5vZGUubG9jayk7CiB9CiAKIC8qIE5vdGlmeSB1c2Vyc3BhY2Ugb2YgYW4gYWRhcHRlciBzdGF0ZSBjaGFuZ2UuICovCkBAIC04NTEsNiArODUxLDkgQEAKIAlpZiAoIXZhbGlkX2xhIHx8IG1zZy0+bGVuIDw9IDEpCiAJCXJldHVybjsKIAorCWlmIChhZGFwLT5sb2dfYWRkcnMubG9nX2FkZHJfbWFzayA9PSAwKQorCQlyZXR1cm47CisKIAkvKgogCSAqIFByb2Nlc3MgdGhlIG1lc3NhZ2Ugb24gdGhlIHByb3RvY29sIGxldmVsLiBJZiBpc19yZXBseSBpcyB0cnVlLAogCSAqIHRoZW4gY2VjX3JlY2VpdmVfbm90aWZ5KCkgd29uJ3QgcGFzcyBvbiB0aGUgcmVwbHkgdG8gdGhlIGxpc3RlbmVyKHMpCkBAIC0xMDQ3LDExICsxMDUwLDE3IEBACiAJCQlkcHJpbnRrKDEsICJjb3VsZCBub3QgY2xhaW0gTEEgJWRcbiIsIGkpOwogCX0KIAorCWlmIChhZGFwLT5sb2dfYWRkcnMubG9nX2FkZHJfbWFzayA9PSAwICYmCisJICAgICEobGFzLT5mbGFncyAmIENFQ19MT0dfQUREUlNfRkxfQUxMT1dfVU5SRUdfRkFMTEJBQ0spKQorCQlnb3RvIHVuY29uZmlndXJlOworCiBjb25maWd1cmVkOgogCWlmIChhZGFwLT5sb2dfYWRkcnMubG9nX2FkZHJfbWFzayA9PSAwKSB7CiAJCS8qIEZhbGwgYmFjayB0byB1bnJlZ2lzdGVyZWQgKi8KIAkJbGFzLT5sb2dfYWRkclswXSA9IENFQ19MT0dfQUREUl9VTlJFR0lTVEVSRUQ7CiAJCWxhcy0+bG9nX2FkZHJfbWFzayA9IDEgPDwgbGFzLT5sb2dfYWRkclswXTsKKwkJZm9yIChpID0gMTsgaSA8IGxhcy0+bnVtX2xvZ19hZGRyczsgaSsrKQorCQkJbGFzLT5sb2dfYWRkcltpXSA9IENFQ19MT0dfQUREUl9JTlZBTElEOwogCX0KIAlhZGFwLT5pc19jb25maWd1cmVkID0gdHJ1ZTsKIAlhZGFwLT5pc19jb25maWd1cmluZyA9IGZhbHNlOwpAQCAtMTA3MCw2ICsxMDc5LDggQEAKIAkJCWNlY19yZXBvcnRfZmVhdHVyZXMoYWRhcCwgaSk7CiAJCWNlY19yZXBvcnRfcGh5c19hZGRyKGFkYXAsIGkpOwogCX0KKwlmb3IgKGkgPSBsYXMtPm51bV9sb2dfYWRkcnM7IGkgPCBDRUNfTUFYX0xPR19BRERSUzsgaSsrKQorCQlsYXMtPmxvZ19hZGRyW2ldID0gQ0VDX0xPR19BRERSX0lOVkFMSUQ7CiAJbXV0ZXhfbG9jaygmYWRhcC0+bG9jayk7CiAJYWRhcC0+a3RocmVhZF9jb25maWcgPSBOVUxMOwogCW11dGV4X3VubG9jaygmYWRhcC0+bG9jayk7CkBAIC0xMzk4LDcgKzE0MDksNiBAQAogCXU4IGluaXRfbGFkZHIgPSBjZWNfbXNnX2luaXRpYXRvcihtc2cpOwogCXU4IGRldnR5cGUgPSBjZWNfbG9nX2FkZHIyZGV2KGFkYXAsIGRlc3RfbGFkZHIpOwogCWludCBsYV9pZHggPSBjZWNfbG9nX2FkZHIyaWR4KGFkYXAsIGRlc3RfbGFkZHIpOwotCWJvb2wgaXNfZGlyZWN0ZWQgPSBsYV9pZHggPj0gMDsKIAlib29sIGZyb21fdW5yZWdpc3RlcmVkID0gaW5pdF9sYWRkciA9PSAweGY7CiAJc3RydWN0IGNlY19tc2cgdHhfY2VjX21zZyA9IHsgfTsKIApAQCAtMTU2MCw3ICsxNTcwLDcgQEAKIAkJICogVW5wcm9jZXNzZWQgbWVzc2FnZXMgYXJlIGFib3J0ZWQgaWYgdXNlcnNwYWNlIGlzbid0IGRvaW5nCiAJCSAqIGFueSBwcm9jZXNzaW5nIGVpdGhlci4KIAkJICovCi0JCWlmIChpc19kaXJlY3RlZCAmJiAhaXNfcmVwbHkgJiYgIWFkYXAtPmZvbGxvd2VyX2NudCAmJgorCQlpZiAoIWlzX2Jyb2FkY2FzdCAmJiAhaXNfcmVwbHkgJiYgIWFkYXAtPmZvbGxvd2VyX2NudCAmJgogCQkgICAgIWFkYXAtPmNlY19mb2xsb3dlciAmJiBtc2ctPm1zZ1sxXSAhPSBDRUNfTVNHX0ZFQVRVUkVfQUJPUlQpCiAJCQlyZXR1cm4gY2VjX2ZlYXR1cmVfYWJvcnQoYWRhcCwgbXNnKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL2NlYy1hcGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvY2VjLWFwaS5jCmluZGV4IDdiZTc2MTUuLmUyNzRlMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvY2VjLWFwaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvY2VjLWFwaS5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIAkJcmV0dXJuIC1FTk9UVFk7CiAJaWYgKGNvcHlfZnJvbV91c2VyKCZsb2dfYWRkcnMsIHBhcmcsIHNpemVvZihsb2dfYWRkcnMpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JbG9nX2FkZHJzLmZsYWdzID0gMDsKKwlsb2dfYWRkcnMuZmxhZ3MgJj0gQ0VDX0xPR19BRERSU19GTF9BTExPV19VTlJFR19GQUxMQkFDSzsKIAltdXRleF9sb2NrKCZhZGFwLT5sb2NrKTsKIAlpZiAoIWFkYXAtPmlzX2NvbmZpZ3VyaW5nICYmCiAJICAgICghbG9nX2FkZHJzLm51bV9sb2dfYWRkcnMgfHwgIWFkYXAtPmlzX2NvbmZpZ3VyZWQpICYmCkBAIC00MzUsNyArNDM1LDcgQEAKIAl2b2lkIF9fdXNlciAqcGFyZyA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAogCWlmICghZGV2bm9kZS0+cmVnaXN0ZXJlZCkKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiAtRU5PREVWOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIENFQ19BREFQX0dfQ0FQUzoKQEAgLTUwOCwxNCArNTA4LDE0IEBACiAKIAlmaWxwLT5wcml2YXRlX2RhdGEgPSBmaDsKIAotCW11dGV4X2xvY2soJmRldm5vZGUtPmZoc19sb2NrKTsKKwltdXRleF9sb2NrKCZkZXZub2RlLT5sb2NrKTsKIAkvKiBRdWV1ZSB1cCBpbml0aWFsIHN0YXRlIGV2ZW50cyAqLwogCWV2X3N0YXRlLnN0YXRlX2NoYW5nZS5waHlzX2FkZHIgPSBhZGFwLT5waHlzX2FkZHI7CiAJZXZfc3RhdGUuc3RhdGVfY2hhbmdlLmxvZ19hZGRyX21hc2sgPSBhZGFwLT5sb2dfYWRkcnMubG9nX2FkZHJfbWFzazsKIAljZWNfcXVldWVfZXZlbnRfZmgoZmgsICZldl9zdGF0ZSwgMCk7CiAKIAlsaXN0X2FkZCgmZmgtPmxpc3QsICZkZXZub2RlLT5maHMpOwotCW11dGV4X3VubG9jaygmZGV2bm9kZS0+ZmhzX2xvY2spOworCW11dGV4X3VubG9jaygmZGV2bm9kZS0+bG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU0MCw5ICs1NDAsOSBAQAogCQljZWNfbW9uaXRvcl9hbGxfY250X2RlYyhhZGFwKTsKIAltdXRleF91bmxvY2soJmFkYXAtPmxvY2spOwogCi0JbXV0ZXhfbG9jaygmZGV2bm9kZS0+ZmhzX2xvY2spOworCW11dGV4X2xvY2soJmRldm5vZGUtPmxvY2spOwogCWxpc3RfZGVsKCZmaC0+bGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXZub2RlLT5maHNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZkZXZub2RlLT5sb2NrKTsKIAogCS8qIFVuaG9vayBwZW5kaW5nIHRyYW5zbWl0cyBmcm9tIHRoaXMgZmlsZWhhbmRsZS4gKi8KIAltdXRleF9sb2NrKCZhZGFwLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvY2VjLWNvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvY2VjLWNvcmUuYwppbmRleCAxMTJhNWZhLi4zYjFlNGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL2NlYy1jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2NlYy9jZWMtY29yZS5jCkBAIC01MSwzMSArNTEsMjkgQEAKIHsKIAkvKgogCSAqIENoZWNrIGlmIHRoZSBjZWMgZGV2aWNlIGlzIGF2YWlsYWJsZS4gVGhpcyBuZWVkcyB0byBiZSBkb25lIHdpdGgKLQkgKiB0aGUgY2VjX2Rldm5vZGVfbG9jayBoZWxkIHRvIHByZXZlbnQgYW4gb3Blbi91bnJlZ2lzdGVyIHJhY2U6CisJICogdGhlIGRldm5vZGUtPmxvY2sgaGVsZCB0byBwcmV2ZW50IGFuIG9wZW4vdW5yZWdpc3RlciByYWNlOgogCSAqIHdpdGhvdXQgdGhlIGxvY2ssIHRoZSBkZXZpY2UgY291bGQgYmUgdW5yZWdpc3RlcmVkIGFuZCBmcmVlZCBiZXR3ZWVuCiAJICogdGhlIGRldm5vZGUtPnJlZ2lzdGVyZWQgY2hlY2sgYW5kIGdldF9kZXZpY2UoKSBjYWxscywgbGVhZGluZyB0bwogCSAqIGEgY3Jhc2guCiAJICovCi0JbXV0ZXhfbG9jaygmY2VjX2Rldm5vZGVfbG9jayk7CisJbXV0ZXhfbG9jaygmZGV2bm9kZS0+bG9jayk7CiAJLyoKIAkgKiByZXR1cm4gRU5YSU8gaWYgdGhlIGNlYyBkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZAogCSAqIGFscmVhZHkgb3IgaWYgaXQgaXMgbm90IHJlZ2lzdGVyZWQgYW55bW9yZS4KIAkgKi8KIAlpZiAoIWRldm5vZGUtPnJlZ2lzdGVyZWQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZjZWNfZGV2bm9kZV9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZub2RlLT5sb2NrKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAJLyogYW5kIGluY3JlYXNlIHRoZSBkZXZpY2UgcmVmY291bnQgKi8KIAlnZXRfZGV2aWNlKCZkZXZub2RlLT5kZXYpOwotCW11dGV4X3VubG9jaygmY2VjX2Rldm5vZGVfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZkZXZub2RlLT5sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCBjZWNfcHV0X2RldmljZShzdHJ1Y3QgY2VjX2Rldm5vZGUgKmRldm5vZGUpCiB7Ci0JbXV0ZXhfbG9jaygmY2VjX2Rldm5vZGVfbG9jayk7CiAJcHV0X2RldmljZSgmZGV2bm9kZS0+ZGV2KTsKLQltdXRleF91bmxvY2soJmNlY19kZXZub2RlX2xvY2spOwogfQogCiAvKiBDYWxsZWQgd2hlbiB0aGUgbGFzdCB1c2VyIG9mIHRoZSBjZWMgZGV2aWNlIGV4aXRzLiAqLwpAQCAtODQsMTEgKzgyLDEwIEBACiAJc3RydWN0IGNlY19kZXZub2RlICpkZXZub2RlID0gdG9fY2VjX2Rldm5vZGUoY2QpOwogCiAJbXV0ZXhfbG9jaygmY2VjX2Rldm5vZGVfbG9jayk7Ci0KIAkvKiBNYXJrIGRldmljZSBub2RlIG51bWJlciBhcyBmcmVlICovCiAJY2xlYXJfYml0KGRldm5vZGUtPm1pbm9yLCBjZWNfZGV2bm9kZV9udW1zKTsKLQogCW11dGV4X3VubG9jaygmY2VjX2Rldm5vZGVfbG9jayk7CisKIAljZWNfZGVsZXRlX2FkYXB0ZXIodG9fY2VjX2FkYXB0ZXIoZGV2bm9kZSkpOwogfQogCkBAIC0xMTcsNyArMTE0LDcgQEAKIAogCS8qIEluaXRpYWxpemF0aW9uICovCiAJSU5JVF9MSVNUX0hFQUQoJmRldm5vZGUtPmZocyk7Ci0JbXV0ZXhfaW5pdCgmZGV2bm9kZS0+ZmhzX2xvY2spOworCW11dGV4X2luaXQoJmRldm5vZGUtPmxvY2spOwogCiAJLyogUGFydCAxOiBGaW5kIGEgZnJlZSBtaW5vciBudW1iZXIgKi8KIAltdXRleF9sb2NrKCZjZWNfZGV2bm9kZV9sb2NrKTsKQEAgLTE2MCw3ICsxNTcsOSBAQAogY2Rldl9kZWw6CiAJY2Rldl9kZWwoJmRldm5vZGUtPmNkZXYpOwogY2xyX2JpdDoKKwltdXRleF9sb2NrKCZjZWNfZGV2bm9kZV9sb2NrKTsKIAljbGVhcl9iaXQoZGV2bm9kZS0+bWlub3IsIGNlY19kZXZub2RlX251bXMpOworCW11dGV4X3VubG9jaygmY2VjX2Rldm5vZGVfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTc3LDE3ICsxNzYsMjEgQEAKIHsKIAlzdHJ1Y3QgY2VjX2ZoICpmaDsKIAotCS8qIENoZWNrIGlmIGRldm5vZGUgd2FzIG5ldmVyIHJlZ2lzdGVyZWQgb3IgYWxyZWFkeSB1bnJlZ2lzdGVyZWQgKi8KLQlpZiAoIWRldm5vZGUtPnJlZ2lzdGVyZWQgfHwgZGV2bm9kZS0+dW5yZWdpc3RlcmVkKQotCQlyZXR1cm47CisJbXV0ZXhfbG9jaygmZGV2bm9kZS0+bG9jayk7CiAKLQltdXRleF9sb2NrKCZkZXZub2RlLT5maHNfbG9jayk7CisJLyogQ2hlY2sgaWYgZGV2bm9kZSB3YXMgbmV2ZXIgcmVnaXN0ZXJlZCBvciBhbHJlYWR5IHVucmVnaXN0ZXJlZCAqLworCWlmICghZGV2bm9kZS0+cmVnaXN0ZXJlZCB8fCBkZXZub2RlLT51bnJlZ2lzdGVyZWQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZub2RlLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZmgsICZkZXZub2RlLT5maHMsIGxpc3QpCiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZmgtPndhaXQpOwotCW11dGV4X3VubG9jaygmZGV2bm9kZS0+ZmhzX2xvY2spOwogCiAJZGV2bm9kZS0+cmVnaXN0ZXJlZCA9IGZhbHNlOwogCWRldm5vZGUtPnVucmVnaXN0ZXJlZCA9IHRydWU7CisJbXV0ZXhfdW5sb2NrKCZkZXZub2RlLT5sb2NrKTsKKwogCWRldmljZV9kZWwoJmRldm5vZGUtPmRldik7CiAJY2Rldl9kZWwoJmRldm5vZGUtPmNkZXYpOwogCXB1dF9kZXZpY2UoJmRldm5vZGUtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9jeGQyMDk5LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9jeGQyMDk5LmMKaW5kZXggNjkyYmEzZS4uZmVkZWIzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2N4ZDIwOTkvY3hkMjA5OS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L2N4ZDIwOTkuYwpAQCAtNjYwLDcgKzY2MCw3IEBACiAJc3RydWN0IGN4ZCAqY2kgPSBjYS0+ZGF0YTsKIAogCW11dGV4X2xvY2soJmNpLT5sb2NrKTsKLQlwcmludGsoa2Vybl9JTkZPICJ3cml0ZV9kYXRhICVkXG4iLCBlY291bnQpOworCWRldl9pbmZvKCZjaS0+aTJjLT5kZXYsICJ3cml0ZV9kYXRhICVkXG4iLCBlY291bnQpOwogCXdyaXRlX3JlZyhjaSwgMHgwZCwgZWNvdW50Pj44KTsKIAl3cml0ZV9yZWcoY2ksIDB4MGUsIGVjb3VudCYweGZmKTsKIAl3cml0ZV9ibG9jayhjaSwgMHgxMSwgZWJ1ZiwgZWNvdW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZGF2aW5jaV92cGZlX3VzZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZGF2aW5jaV92cGZlX3VzZXIuaAppbmRleCBmNGYzNWM5Li5kM2YzNGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL2RhdmluY2lfdnBmZV91c2VyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kYXZpbmNpX3ZwZmVfdXNlci5oCkBAIC01NDQsNDEgKzU0NCw0MSBAQAogLyogSVBJUEUgbW9kdWxlIGNvbmZpZ3VyYXRpb25zICovCiAKIC8qIElQSVBFIGlucHV0IGNvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9JTlBVVF9DT05GSUcJCSgxIDw8IDApCisjZGVmaW5lIFZQRkVfSVBJUEVfSU5QVVRfQ09ORklHCQlCSVQoMCkKIC8qIExVVCBiYXNlZCBEZWZlY3QgUGl4ZWwgQ29ycmVjdGlvbiAqLwotI2RlZmluZSBWUEZFX0lQSVBFX0xVVERQQwkJKDEgPDwgMSkKKyNkZWZpbmUgVlBGRV9JUElQRV9MVVREUEMJCUJJVCgxKQogLyogT24gdGhlIGZseSAoT1RGKSBEZWZlY3QgUGl4ZWwgQ29ycmVjdGlvbiAqLwotI2RlZmluZSBWUEZFX0lQSVBFX09URkRQQwkJKDEgPDwgMikKKyNkZWZpbmUgVlBGRV9JUElQRV9PVEZEUEMJCUJJVCgyKQogLyogTm9pc2UgRmlsdGVyIC0gMSAqLwotI2RlZmluZSBWUEZFX0lQSVBFX05GMQkJCSgxIDw8IDMpCisjZGVmaW5lIFZQRkVfSVBJUEVfTkYxCQkJQklUKDMpCiAvKiBOb2lzZSBGaWx0ZXIgLSAyICovCi0jZGVmaW5lIFZQRkVfSVBJUEVfTkYyCQkJKDEgPDwgNCkKKyNkZWZpbmUgVlBGRV9JUElQRV9ORjIJCQlCSVQoNCkKIC8qIFdoaXRlIEJhbGFuY2UuICBBbHNvIGEgY29udHJvbCBJRCAqLwotI2RlZmluZSBWUEZFX0lQSVBFX1dCCQkJKDEgPDwgNSkKKyNkZWZpbmUgVlBGRV9JUElQRV9XQgkJCUJJVCg1KQogLyogMXN0IFJHQiB0byBSQkcgQmxlbmQgbW9kdWxlICovCi0jZGVmaW5lIFZQRkVfSVBJUEVfUkdCMlJHQl8xCQkoMSA8PCA2KQorI2RlZmluZSBWUEZFX0lQSVBFX1JHQjJSR0JfMQkJQklUKDYpCiAvKiAybmQgUkdCIHRvIFJCRyBCbGVuZCBtb2R1bGUgKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9SR0IyUkdCXzIJCSgxIDw8IDcpCisjZGVmaW5lIFZQRkVfSVBJUEVfUkdCMlJHQl8yCQlCSVQoNykKIC8qIEdhbW1hIENvcnJlY3Rpb24gKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9HQU1NQQkJKDEgPDwgOCkKKyNkZWZpbmUgVlBGRV9JUElQRV9HQU1NQQkJQklUKDgpCiAvKiAzRCBMVVQgY29sb3IgY29udmVyc2lvbiAqLwotI2RlZmluZSBWUEZFX0lQSVBFXzNEX0xVVAkJKDEgPDwgOSkKKyNkZWZpbmUgVlBGRV9JUElQRV8zRF9MVVQJCUJJVCg5KQogLyogUkdCIHRvIFlDYkNyIG1vZHVsZSAqLwotI2RlZmluZSBWUEZFX0lQSVBFX1JHQjJZVVYJCSgxIDw8IDEwKQorI2RlZmluZSBWUEZFX0lQSVBFX1JHQjJZVVYJCUJJVCgxMCkKIC8qIFlVViA0MjIgY29udmVyc2lvbiBtb2R1bGUgKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9ZVVY0MjJfQ09OVgkJKDEgPDwgMTEpCisjZGVmaW5lIFZQRkVfSVBJUEVfWVVWNDIyX0NPTlYJCUJJVCgxMSkKIC8qIEVkZ2UgRW5oYW5jZW1lbnQgKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9ZRUUJCQkoMSA8PCAxMikKKyNkZWZpbmUgVlBGRV9JUElQRV9ZRUUJCQlCSVQoMTIpCiAvKiBHcmVlbiBJbWJhbGFuY2UgQ29ycmVjdGlvbiAqLwotI2RlZmluZSBWUEZFX0lQSVBFX0dJQwkJCSgxIDw8IDEzKQorI2RlZmluZSBWUEZFX0lQSVBFX0dJQwkJCUJJVCgxMykKIC8qIENGQSBJbnRlcnBvbGF0aW9uICovCi0jZGVmaW5lIFZQRkVfSVBJUEVfQ0ZBCQkJKDEgPDwgMTQpCisjZGVmaW5lIFZQRkVfSVBJUEVfQ0ZBCQkJQklUKDE0KQogLyogQ2hyb21hIEFydGlmYWN0IFJlZHVjdGlvbiAqLwotI2RlZmluZSBWUEZFX0lQSVBFX0NBUgkJCSgxIDw8IDE1KQorI2RlZmluZSBWUEZFX0lQSVBFX0NBUgkJCUJJVCgxNSkKIC8qIENocm9tYSBHYWluIFN1cHByZXNzaW9uICovCi0jZGVmaW5lIFZQRkVfSVBJUEVfQ0dTCQkJKDEgPDwgMTYpCisjZGVmaW5lIFZQRkVfSVBJUEVfQ0dTCQkJQklUKDE2KQogLyogR2xvYmFsIGJyaWdodG5lc3MgYW5kIGNvbnRyYXN0IGNvbnRyb2wgKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9HQkNFCQkJKDEgPDwgMTcpCisjZGVmaW5lIFZQRkVfSVBJUEVfR0JDRQkJCUJJVCgxNykKIAogI2RlZmluZSBWUEZFX0lQSVBFX01BWF9NT0RVTEVTCQkxOAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL2RtMzY1X2lzaWYuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZG0zNjVfaXNpZi5jCmluZGV4IGFlOTIwMmQuLjU2OWJjZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZG0zNjVfaXNpZi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZG0zNjVfaXNpZi5jCkBAIC0xNDYsOSArMTQ2LDggQEAKIAl1MzIgZmllbGRfc3RhdHVzOwogCiAJZmllbGRfc3RhdHVzID0gaXNpZl9yZWFkKGlzaWYtPmlzaWZfY2ZnLmJhc2VfYWRkciwgTU9ERVNFVCk7Ci0JZmllbGRfc3RhdHVzID0gKGZpZWxkX3N0YXR1cyA+PiBETTM2NV9JU0lGX01ERlNfT0ZGU0VUKSAmCi0JCQlETTM2NV9JU0lGX01ERlNfTUFTSzsKLQlyZXR1cm4gZmllbGRfc3RhdHVzOworCXJldHVybiAoZmllbGRfc3RhdHVzID4+IERNMzY1X0lTSUZfTURGU19PRkZTRVQpICYKKwkJRE0zNjVfSVNJRl9NREZTX01BU0s7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTU5NCw4ICs1OTMsNyBAQAogCXJldCA9IGlzaWZfdmFsaWRhdGVfZGZjX3BhcmFtcygmcGFyYW1zLT5kZmMpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JcmV0ID0gaXNpZl92YWxpZGF0ZV9iY2xhbXBfcGFyYW1zKCZwYXJhbXMtPmJjbGFtcCk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gaXNpZl92YWxpZGF0ZV9iY2xhbXBfcGFyYW1zKCZwYXJhbXMtPmJjbGFtcCk7CiB9CiAKIHN0YXRpYyBpbnQgaXNpZl9zZXRfcGFyYW1zKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHZvaWQgKnBhcmFtcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZG0zNjVfcmVzaXplci5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kbTM2NV9yZXNpemVyLmMKaW5kZXggM2NkNTZjYy4uMTI4NjYyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kbTM2NV9yZXNpemVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kbTM2NV9yZXNpemVyLmMKQEAgLTEyOCw3ICsxMjgsNyBAQAogc3RhdGljIHZvaWQKIGNvbmZpZ3VyZV9yZXNpemVyX291dF9wYXJhbXMoc3RydWN0IHZwZmVfcmVzaXplcl9kZXZpY2UgKnJlc2l6ZXIsIGludCBpbmRleCwKIAkJCSAgICAgdm9pZCAqb3V0cHV0X3NwZWMsIHVuc2lnbmVkIGNoYXIgcGFydGlhbCwKLQkJCSAgICAgdW5zaWduZWQgZmxhZykKKwkJCSAgICAgdW5zaWduZWQgaW50IGZsYWcpCiB7CiAJc3RydWN0IHJlc2l6ZXJfcGFyYW1zICpwYXJhbSA9ICZyZXNpemVyLT5jb25maWc7CiAJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqb3V0Zm9ybWF0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS92cGZlX3ZpZGVvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL3ZwZmVfdmlkZW8uYwppbmRleCAzMzE5ZmI4Li44YmU5Zjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL3ZwZmVfdmlkZW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL3ZwZmVfdmlkZW8uYwpAQCAtMzcsNyArMzcsNyBAQAogCXN0cnVjdCBtZWRpYV9wYWQgKnJlbW90ZTsKIAogCXJlbW90ZSA9IG1lZGlhX2VudGl0eV9yZW1vdGVfcGFkKCZ2cGZlX2Rldi0+dnBmZV9pc2lmLnBhZHNbMF0pOwotCWlmIChyZW1vdGUgPT0gTlVMTCkgeworCWlmICghcmVtb3RlKSB7CiAJCXByX2VycigiSW52YWxpZCBtZWRpYSBjb25uZWN0aW9uIHRvIGlzaWYvY2NkY1xuIik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTU0LDcgKzU0LDcgQEAKIAlpbnQgaTsKIAogCXJlbW90ZSA9IG1lZGlhX2VudGl0eV9yZW1vdGVfcGFkKCZ2cGZlX2Rldi0+dnBmZV9pc2lmLnBhZHNbMF0pOwotCWlmIChyZW1vdGUgPT0gTlVMTCkgeworCWlmICghcmVtb3RlKSB7CiAJCXByX2VycigiSW52YWxpZCBtZWRpYSBjb25uZWN0aW9uIHRvIGlzaWYvY2NkY1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEwNyw3ICsxMDcsNyBAQAogCWludCByZXQ7CiAKIAlzdWJkZXYgPSB2cGZlX3ZpZGVvX3JlbW90ZV9zdWJkZXYodmlkZW8sICZwYWQpOwotCWlmIChzdWJkZXYgPT0gTlVMTCkKKwlpZiAoIXN1YmRldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmbXQud2hpY2ggPSBWNEwyX1NVQkRFVl9GT1JNQVRfQUNUSVZFOwpAQCAtMjM2LDcgKzIzNiw3IEBACiAJICogZm9ybWF0IG9mIHRoZSBjb25uZWN0ZWQgcGFkLgogCSAqLwogCXN1YmRldiA9IHZwZmVfdmlkZW9fcmVtb3RlX3N1YmRldihwaXBlLT5vdXRwdXRzWzBdLCBOVUxMKTsKLQlpZiAoc3ViZGV2ID09IE5VTEwpCisJaWYgKCFzdWJkZXYpCiAJCXJldHVybiAtRVBJUEU7CiAKIAl3aGlsZSAoMSkgewpAQCAtNDEzLDcgKzQxMyw3IEBACiAJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZmlsZSBoYW5kbGUgb2JqZWN0ICovCiAJaGFuZGxlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZwZmVfZmgpLCBHRlBfS0VSTkVMKTsKIAotCWlmIChoYW5kbGUgPT0gTlVMTCkKKwlpZiAoIWhhbmRsZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAl2NGwyX2ZoX2luaXQoJmhhbmRsZS0+dmZoLCAmdmlkZW8tPnZpZGVvX2Rldik7CkBAIC02ODMsMTQgKzY4MywxNCBAQAogCX0KIAkvKiBnZXQgdGhlIHJlbW90ZSBwYWQgKi8KIAlyZW1vdGUgPSBtZWRpYV9lbnRpdHlfcmVtb3RlX3BhZCgmdmlkZW8tPnBhZCk7Ci0JaWYgKHJlbW90ZSA9PSBOVUxMKSB7CisJaWYgKCFyZW1vdGUpIHsKIAkJdjRsMl9lcnIoJnZwZmVfZGV2LT52NGwyX2RldiwKIAkJCSAiaW52YWxpZCByZW1vdGUgcGFkIGZvciB2aWRlbyBub2RlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCS8qIGdldCB0aGUgcmVtb3RlIHN1YmRldiAqLwogCXN1YmRldiA9IHZwZmVfdmlkZW9fcmVtb3RlX3N1YmRldih2aWRlbywgTlVMTCk7Ci0JaWYgKHN1YmRldiA9PSBOVUxMKSB7CisJaWYgKCFzdWJkZXYpIHsKIAkJdjRsMl9lcnIoJnZwZmVfZGV2LT52NGwyX2RldiwKIAkJCSAiaW52YWxpZCByZW1vdGUgc3ViZGV2IGZvciB2aWRlbyBub2RlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2J0ODI5LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2J0ODI5LmMKaW5kZXggNDRmNTY1NS4uMDRkODgxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19idDgyOS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfYnQ4MjkuYwpAQCAtMTIwLDcgKzEyMCw3IEBACiAJaW50IHJjOwogCiAJcGRldiA9IGRvX3BjaV9wcm9iZSgpOwotCWlmIChwZGV2ID09IE5VTEwpCisJaWYgKCFwZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CkBAIC0xNjMsNyArMTYzLDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLQogdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhdGlyX2RyaXZlci5kZXYpOwpAQCAtMTc0LDcgKzE3Myw2IEBACiAJcGNpX2Rldl9wdXQocGRldik7CiB9CiAKLQogc3RhdGljIGludCBhdGlyX2luaXRfc3RhcnQodm9pZCkKIHsKIAlwY2lfYWRkcl9saW4gPSBpb3JlbWFwKHBjaV9hZGRyX3BoeXMgKyBEQVRBX1BDSV9PRkYsIDB4NDAwKTsKQEAgLTE4NywxMCArMTg1LDkgQEAKIAogc3RhdGljIHZvaWQgY3ljbGVfZGVsYXkoaW50IGN5Y2xlKQogewotCXVkZWxheShXQUlUX0NZQ0xFKmN5Y2xlKTsKKwl1ZGVsYXkoV0FJVF9DWUNMRSAqIGN5Y2xlKTsKIH0KIAotCiBzdGF0aWMgaW50IHBvbGxfbWFpbih2b2lkKQogewogCXVuc2lnbmVkIGNoYXIgc3RhdHVzX2hpZ2gsIHN0YXR1c19sb3c7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2ltb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaW1vbi5jCmluZGV4IGZmMTkyNmMuLjE5OGE4MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaW1vbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaW1vbi5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bWVkaWEvbGlyYy5oPgogI2luY2x1ZGUgPG1lZGlhL2xpcmNfZGV2Lmg+CiAKLQogI2RlZmluZSBNT0RfQVVUSE9SCSJWZW5reSBSYWp1IDxkZXZAdmVua3kud3M+IgogI2RlZmluZSBNT0RfREVTQwkiRHJpdmVyIGZvciBTb3VuZEdyYXBoIGlNT04gTXVsdGlNZWRpYSBJUi9EaXNwbGF5IgogI2RlZmluZSBNT0RfTkFNRQkibGlyY19pbW9uIgpAQCAtMjEyLDcgKzIxMSw2IEBACiAJZWxzZQogCQlkZXZfaW5mbygmY29udGV4dC0+dXNiZGV2LT5kZXYsCiAJCQkgIkRlcmVnaXN0ZXJlZCBpTU9OIGRyaXZlciAobWlub3I6JWQpXG4iLCBtaW5vcik7Ci0KIH0KIAogLyoqCkBAIC00MjksNyArNDI3LDcgQEAKIAogCWRvIHsKIAkJbWVtY3B5KGNvbnRleHQtPnVzYl90eF9idWYsIGNvbnRleHQtPnR4LmRhdGFfYnVmICsgb2Zmc2V0LCA3KTsKLQkJY29udGV4dC0+dXNiX3R4X2J1Zls3XSA9ICh1bnNpZ25lZCBjaGFyKSBzZXE7CisJCWNvbnRleHQtPnVzYl90eF9idWZbN10gPSAodW5zaWduZWQgY2hhcilzZXE7CiAKIAkJcmV0dmFsID0gc2VuZF9wYWNrZXQoY29udGV4dCk7CiAJCWlmIChyZXR2YWwpIHsKQEAgLTQ0Nyw3ICs0NDUsNyBAQAogCWlmIChjb250ZXh0LT52ZmRfcHJvdG9fNnApIHsKIAkJLyogU2VuZCBwYWNrZXQgIzYgKi8KIAkJbWVtY3B5KGNvbnRleHQtPnVzYl90eF9idWYsICZ2ZmRfcGFja2V0Niwgc2l6ZW9mKHZmZF9wYWNrZXQ2KSk7Ci0JCWNvbnRleHQtPnVzYl90eF9idWZbN10gPSAodW5zaWduZWQgY2hhcikgc2VxOworCQljb250ZXh0LT51c2JfdHhfYnVmWzddID0gKHVuc2lnbmVkIGNoYXIpc2VxOwogCQlyZXR2YWwgPSBzZW5kX3BhY2tldChjb250ZXh0KTsKIAkJaWYgKHJldHZhbCkKIAkJCWRldl9lcnIoJmNvbnRleHQtPnVzYmRldi0+ZGV2LApAQCAtNTYzLDcgKzU2MSw3IEBACiAJCXZhbHVlIHw9IFBVTFNFX0JJVDsKIAogCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpCi0JCWJ1ZltpXSA9IHZhbHVlPj4oaSo4KTsKKwkJYnVmW2ldID0gdmFsdWUgPj4gKGkgKiA4KTsKIAogCWxpcmNfYnVmZmVyX3dyaXRlKGNvbnRleHQtPmRyaXZlci0+cmJ1ZiwgYnVmKTsKIAl3YWtlX3VwKCZjb250ZXh0LT5kcml2ZXItPnJidWYtPndhaXRfcG9sbCk7CkBAIC01ODksNyArNTg3LDcgQEAKIAogCWlmIChsZW4gIT0gOCkgewogCQlkZXZfd2FybihkZXYsICJpbW9uICVzOiBpbnZhbGlkIGluY29taW5nIHBhY2tldCBzaXplIChsZW4gPSAlZCwgaW50ZiVkKVxuIiwKLQkJCV9fZnVuY19fLCBsZW4sIGludGYpOworCQkJIF9fZnVuY19fLCBsZW4sIGludGYpOwogCQlyZXR1cm47CiAJfQogCkBAIC03MDQsNyArNzAyLDcgQEAKIAkvKiBwcmV2ZW50IHJhY2VzIHByb2JpbmcgZGV2aWNlcyB3L211bHRpcGxlIGludGVyZmFjZXMgKi8KIAltdXRleF9sb2NrKCZkcml2ZXJfbG9jayk7CiAKLQljb250ZXh0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGltb25fY29udGV4dCksIEdGUF9LRVJORUwpOworCWNvbnRleHQgPSBremFsbG9jKHNpemVvZigqY29udGV4dCksIEdGUF9LRVJORUwpOwogCWlmICghY29udGV4dCkKIAkJZ290byBkcml2ZXJfdW5sb2NrOwogCkBAIC03ODQsMTEgKzc4MiwxMSBAQAogCQkJX19mdW5jX18sIHZmZF9wcm90b182cCk7CiAJfQogCi0JZHJpdmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxpcmNfZHJpdmVyKSwgR0ZQX0tFUk5FTCk7CisJZHJpdmVyID0ga3phbGxvYyhzaXplb2YoKmRyaXZlciksIEdGUF9LRVJORUwpOwogCWlmICghZHJpdmVyKQogCQlnb3RvIGZyZWVfY29udGV4dDsKIAotCXJidWYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbGlyY19idWZmZXIpLCBHRlBfS0VSTkVMKTsKKwlyYnVmID0ga21hbGxvYyhzaXplb2YoKnJidWYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJidWYpCiAJCWdvdG8gZnJlZV9kcml2ZXI7CiAKQEAgLTc5NywxNiArNzk1LDExIEBACiAJCWdvdG8gZnJlZV9yYnVmOwogCX0KIAlyeF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghcnhfdXJiKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHVzYl9hbGxvY191cmIgZmFpbGVkIGZvciBJUiB1cmJcbiIsIF9fZnVuY19fKTsKKwlpZiAoIXJ4X3VyYikKIAkJZ290byBmcmVlX2xpcmNfYnVmOwotCX0KIAl0eF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghdHhfdXJiKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHVzYl9hbGxvY191cmIgZmFpbGVkIGZvciBkaXNwbGF5IHVyYlxuIiwKLQkJICAgIF9fZnVuY19fKTsKKwlpZiAoIXR4X3VyYikKIAkJZ290byBmcmVlX3J4X3VyYjsKLQl9CiAKIAltdXRleF9pbml0KCZjb250ZXh0LT5jdHhfbG9jayk7CiAJY29udGV4dC0+dmZkX3Byb3RvXzZwID0gdmZkX3Byb3RvXzZwOwpAQCAtODM1LDcgKzgyOCw3IEBACiAJfQogCiAJZGV2X2luZm8oZGV2LCAiUmVnaXN0ZXJlZCBpTU9OIGRyaXZlciAobGlyYyBtaW5vcjogJWQpXG4iLAotCQkJbGlyY19taW5vcik7CisJCSBsaXJjX21pbm9yKTsKIAogCS8qIE5lZWRlZCB3aGlsZSB1bnJlZ2lzdGVyaW5nISAqLwogCWRyaXZlci0+bWlub3IgPSBsaXJjX21pbm9yOwpAQCAtODU2LDggKzg0OSw4IEBACiAJCWNvbnRleHQtPmRpc3BsYXkgPSAxOwogCiAJdXNiX2ZpbGxfaW50X3VyYihjb250ZXh0LT5yeF91cmIsIGNvbnRleHQtPnVzYmRldiwKLQkJdXNiX3JjdmludHBpcGUoY29udGV4dC0+dXNiZGV2LAotCQkJY29udGV4dC0+cnhfZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJIHVzYl9yY3ZpbnRwaXBlKGNvbnRleHQtPnVzYmRldiwKKwkJCSBjb250ZXh0LT5yeF9lbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCiAJCWNvbnRleHQtPnVzYl9yeF9idWYsIHNpemVvZihjb250ZXh0LT51c2JfcnhfYnVmKSwKIAkJdXNiX3J4X2NhbGxiYWNrLCBjb250ZXh0LAogCQljb250ZXh0LT5yeF9lbmRwb2ludC0+YkludGVydmFsKTsKQEAgLTg4Miw3ICs4NzUsNyBAQAogCX0KIAogCWRldl9pbmZvKGRldiwgImlNT04gZGV2aWNlICglMDR4OiUwNHgsIGludGYlZCkgb24gdXNiPCVkOiVkPiBpbml0aWFsaXplZFxuIiwKLQkJdmVuZG9yLCBwcm9kdWN0LCBpZm51bSwgdXNiZGV2LT5idXMtPmJ1c251bSwgdXNiZGV2LT5kZXZudW0pOworCQkgdmVuZG9yLCBwcm9kdWN0LCBpZm51bSwgdXNiZGV2LT5idXMtPmJ1c251bSwgdXNiZGV2LT5kZXZudW0pOwogCiAJLyogRXZlcnl0aGluZyB3ZW50IGZpbmUuIEp1c3QgdW5sb2NrIGFuZCByZXR1cm4gcmV0dmFsICh3aXRoIGlzIDApICovCiAJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CkBAIC05NzMsOCArOTY2LDggQEAKIAlzdHJ1Y3QgaW1vbl9jb250ZXh0ICpjb250ZXh0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAogCXVzYl9maWxsX2ludF91cmIoY29udGV4dC0+cnhfdXJiLCBjb250ZXh0LT51c2JkZXYsCi0JCXVzYl9yY3ZpbnRwaXBlKGNvbnRleHQtPnVzYmRldiwKLQkJCWNvbnRleHQtPnJ4X2VuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJCSB1c2JfcmN2aW50cGlwZShjb250ZXh0LT51c2JkZXYsCisJCQkgY29udGV4dC0+cnhfZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAogCQljb250ZXh0LT51c2JfcnhfYnVmLCBzaXplb2YoY29udGV4dC0+dXNiX3J4X2J1ZiksCiAJCXVzYl9yeF9jYWxsYmFjaywgY29udGV4dCwKIAkJY29udGV4dC0+cnhfZW5kcG9pbnQtPmJJbnRlcnZhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3BhcmFsbGVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3BhcmFsbGVsLmMKaW5kZXggMzkwNmFjNi4uNjRkOTllYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19wYXJhbGxlbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfcGFyYWxsZWwuYwpAQCAtMTYzLDEyICsxNjMsMTIgQEAKIAlpZiAoY291bnQgPj0gMTAwMCAmJiB0aW1lZWxhcHNlZCA+IDApIHsKIAkJaWYgKGRlZmF1bHRfdGltZXIgPT0gMCkgewogCQkJLyogYXV0b2RldGVjdCB0aW1lciAqLwotCQkJbmV3dGltZXIgPSAoMTAwMDAwMCpjb3VudCkvdGltZWVsYXBzZWQ7CisJCQluZXd0aW1lciA9ICgxMDAwMDAwICogY291bnQpIC8gdGltZWVsYXBzZWQ7CiAJCQlwcl9pbmZvKCIldSBIeiB0aW1lciBkZXRlY3RlZFxuIiwgbmV3dGltZXIpOwogCQkJcmV0dXJuIG5ld3RpbWVyOwogCQl9Ci0JCW5ld3RpbWVyID0gKDEwMDAwMDAqY291bnQpL3RpbWVlbGFwc2VkOwotCQlpZiAoYWJzKG5ld3RpbWVyIC0gZGVmYXVsdF90aW1lcikgPiBkZWZhdWx0X3RpbWVyLzEwKSB7CisJCW5ld3RpbWVyID0gKDEwMDAwMDAgKiBjb3VudCkgLyB0aW1lZWxhcHNlZDsKKwkJaWYgKGFicyhuZXd0aW1lciAtIGRlZmF1bHRfdGltZXIpID4gZGVmYXVsdF90aW1lciAvIDEwKSB7CiAJCQkvKiBiYWQgdGltZXIgKi8KIAkJCXByX25vdGljZSgiYmFkIHRpbWVyOiAldSBIelxuIiwgbmV3dGltZXIpOwogCQkJcHJfbm90aWNlKCJ1c2luZyBkZWZhdWx0IHRpbWVyOiAldSBIelxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2FzZW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2FzZW0uYwppbmRleCAyMjE4ZDAwLi40Njc4YWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3Nhc2VtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zYXNlbS5jCkBAIC00Nyw3ICs0Nyw2IEBACiAjaW5jbHVkZSA8bWVkaWEvbGlyYy5oPgogI2luY2x1ZGUgPG1lZGlhL2xpcmNfZGV2Lmg+CiAKLQogI2RlZmluZSBNT0RfQVVUSE9SCSJPbGl2ZXIgU3RhYmVsIDxvbGl2ZXIuc3RhYmVsQGdteC5kZT4sICIgXAogCQkJIlRpbSBEYXZpZXMgPHRpbUBvcGVuc3lzdGVtcy5uZXQuYXU+IgogI2RlZmluZSBNT0RfREVTQwkiVVNCIERyaXZlciBmb3IgU2FzZW0gUmVtb3RlIENvbnRyb2xsZXIgVjEuMSIKQEAgLTczLDcgKzcyLDcgQEAKIAogLyogVkZEIGZpbGVfb3BlcmF0aW9ucyBmdW5jdGlvbiBwcm90b3R5cGVzICovCiBzdGF0aWMgaW50IHZmZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBsb25nIHZmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgbG9uZyB2ZmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyBpbnQgdmZkX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKIHN0YXRpYyBzc2l6ZV90IHZmZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQlzaXplX3Qgbl9ieXRlcywgbG9mZl90ICpwb3MpOwpAQCAtODYsNyArODUsNiBAQAogI2RlZmluZSBTQVNFTV9EQVRBX0JVRl9TWgkzMgogCiBzdHJ1Y3Qgc2FzZW1fY29udGV4dCB7Ci0KIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OwogCWludCB2ZmRfaXNvcGVuOwkJCS8qIFZGRCBwb3J0IGhhcyBiZWVuIG9wZW5lZCAqLwogCXVuc2lnbmVkIGludCB2ZmRfY29udHJhc3Q7CS8qIFZGRCBjb250cmFzdCAqLwpAQCAtMTU2LDcgKzE1NCw2IEBACiAKIAogLyoqKiBNIE8gRCBVIEwgRSAgIEMgTyBEIEUgKioqLwotCiBNT0RVTEVfQVVUSE9SKE1PRF9BVVRIT1IpOwogTU9EVUxFX0RFU0NSSVBUSU9OKE1PRF9ERVNDKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTE4Niw3ICsxODMsNiBAQAogCWVsc2UKIAkJZGV2X2luZm8oJmNvbnRleHQtPmRldi0+ZGV2LAogCQkJICJEZXJlZ2lzdGVyZWQgU2FzZW0gZHJpdmVyIChtaW5vcjolZClcbiIsIG1pbm9yKTsKLQogfQogCiAvKioKQEAgLTI0Myw3ICsyMzksNyBAQAogICogQ2FsbGVkIHdoZW4gdGhlIFZGRCBkZXZpY2UgKGUuZy4gL2Rldi91c2IvbGNkKQogICogaXMgY2xvc2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KICAqLwotc3RhdGljIGxvbmcgdmZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcgdmZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3Qgc2FzZW1fY29udGV4dCAqY29udGV4dDsKIApAQCAtMjk3LDcgKzI5Myw2IEBACiAJCWNvbnRleHQtPnZmZF9pc29wZW4gPSAwOwogCQlkZXZfaW5mbygmY29udGV4dC0+ZGV2LT5kZXYsICJWRkQgcG9ydCBjbG9zZWRcbiIpOwogCQlpZiAoIWNvbnRleHQtPmRldl9wcmVzZW50ICYmICFjb250ZXh0LT5pcl9pc29wZW4pIHsKLQogCQkJLyogRGV2aWNlIGRpc2Nvbm5lY3RlZCBiZWZvcmUgY2xvc2UgYW5kIElSIHBvcnQgaXMKIAkJCSAqIG5vdCBvcGVuLiBJZiBJUiBwb3J0IGlzIG9wZW4sIGNvbnRleHQgd2lsbCBiZQogCQkJICogZGVsZXRlZCBieSBpcl9jbG9zZS4gKi8KQEAgLTU0Niw5ICs1NDEsNyBAQAogCQkgKiBhdCBkaXNjb25uZWN0IHRpbWUsIHNvIGRvIGl0IG5vdy4KIAkJICovCiAJCWRlcmVnaXN0ZXJfZnJvbV9saXJjKGNvbnRleHQpOwotCiAJCWlmICghY29udGV4dC0+dmZkX2lzb3BlbikgewotCiAJCQltdXRleF91bmxvY2soJmNvbnRleHQtPmN0eF9sb2NrKTsKIAkJCWRlbGV0ZV9jb250ZXh0KGNvbnRleHQpOwogCQkJcmV0dXJuOwpAQCAtNjMzLDcgKzYyNiw2IEBACiAJCXJldHVybjsKIAogCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKLQogCWNhc2UgLUVOT0VOVDoJCS8qIHVzYmNvcmUgdW5saW5rIHN1Y2Nlc3NmdWwhICovCiAJCXJldHVybjsKIApAQCAtNjUxLDggKzY0Myw2IEBACiAJdXNiX3N1Ym1pdF91cmIoY29udGV4dC0+cnhfdXJiLCBHRlBfQVRPTUlDKTsKIH0KIAotCi0KIC8qKgogICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIFVTQiBjb3JlIEFQSTogUHJvYmUKICAqLwpAQCAtNzA5LDcgKzY5OSw2IEBACiAKIAkJfSBlbHNlIGlmICghdmZkX2VwX2ZvdW5kICYmCiAJCQl1c2JfZW5kcG9pbnRfaXNfaW50X291dChlcCkpIHsKLQogCQkJdHhfZW5kcG9pbnQgPSBlcDsKIAkJCXZmZF9lcF9mb3VuZCA9IDE7CiAJCQlpZiAoZGVidWcpCkBAIC03MzUsMTcgKzcyNCwxNyBAQAogCS8qIEFsbG9jYXRlIG1lbW9yeSAqLwogCWFsbG9jX3N0YXR1cyA9IDA7CiAKLQljb250ZXh0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNhc2VtX2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKKwljb250ZXh0ID0ga3phbGxvYyhzaXplb2YoKmNvbnRleHQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNvbnRleHQpIHsKIAkJYWxsb2Nfc3RhdHVzID0gMTsKIAkJZ290byBhbGxvY19zdGF0dXNfc3dpdGNoOwogCX0KLQlkcml2ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGlyY19kcml2ZXIpLCBHRlBfS0VSTkVMKTsKKwlkcml2ZXIgPSBremFsbG9jKHNpemVvZigqZHJpdmVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkcml2ZXIpIHsKIAkJYWxsb2Nfc3RhdHVzID0gMjsKIAkJZ290byBhbGxvY19zdGF0dXNfc3dpdGNoOwogCX0KLQlyYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpcmNfYnVmZmVyKSwgR0ZQX0tFUk5FTCk7CisJcmJ1ZiA9IGttYWxsb2Moc2l6ZW9mKCpyYnVmKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyYnVmKSB7CiAJCWFsbG9jX3N0YXR1cyA9IDM7CiAJCWdvdG8gYWxsb2Nfc3RhdHVzX3N3aXRjaDsKQEAgLTc1OCwxNyArNzQ3LDEyIEBACiAJfQogCXJ4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyeF91cmIpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCi0JCQkiJXM6IHVzYl9hbGxvY191cmIgZmFpbGVkIGZvciBJUiB1cmJcbiIsIF9fZnVuY19fKTsKIAkJYWxsb2Nfc3RhdHVzID0gNTsKIAkJZ290byBhbGxvY19zdGF0dXNfc3dpdGNoOwogCX0KIAlpZiAodmZkX2VwX2ZvdW5kKSB7CiAJCXR4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdHhfdXJiKSB7Ci0JCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwKLQkJCQkiJXM6IHVzYl9hbGxvY191cmIgZmFpbGVkIGZvciBWRkQgdXJiIiwKLQkJCQlfX2Z1bmNfXyk7CiAJCQlhbGxvY19zdGF0dXMgPSA2OwogCQkJZ290byBhbGxvY19zdGF0dXNfc3dpdGNoOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvcHVsc2U4LWNlYy9wdWxzZTgtY2VjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvcHVsc2U4LWNlYy9wdWxzZTgtY2VjLmMKaW5kZXggOTRmODU5MC4uZWQ4YmQ5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3B1bHNlOC1jZWMvcHVsc2U4LWNlYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9wdWxzZTgtY2VjL3B1bHNlOC1jZWMuYwpAQCAtMTE0LDE0ICsxMTQsMTEgQEAKIAkJY2VjX3RyYW5zbWl0X2RvbmUocHVsc2U4LT5hZGFwLCBDRUNfVFhfU1RBVFVTX09LLAogCQkJCSAgMCwgMCwgMCwgMCk7CiAJCWJyZWFrOwotCWNhc2UgTVNHQ09ERV9UUkFOU01JVF9GQUlMRURfTElORToKLQkJY2VjX3RyYW5zbWl0X2RvbmUocHVsc2U4LT5hZGFwLCBDRUNfVFhfU1RBVFVTX0FSQl9MT1NULAotCQkJCSAgMSwgMCwgMCwgMCk7Ci0JCWJyZWFrOwogCWNhc2UgTVNHQ09ERV9UUkFOU01JVF9GQUlMRURfQUNLOgogCQljZWNfdHJhbnNtaXRfZG9uZShwdWxzZTgtPmFkYXAsIENFQ19UWF9TVEFUVVNfTkFDSywKIAkJCQkgIDAsIDEsIDAsIDApOwogCQlicmVhazsKKwljYXNlIE1TR0NPREVfVFJBTlNNSVRfRkFJTEVEX0xJTkU6CiAJY2FzZSBNU0dDT0RFX1RSQU5TTUlUX0ZBSUxFRF9USU1FT1VUX0RBVEE6CiAJY2FzZSBNU0dDT0RFX1RSQU5TTUlUX0ZBSUxFRF9USU1FT1VUX0xJTkU6CiAJCWNlY190cmFuc21pdF9kb25lKHB1bHNlOC0+YWRhcCwgQ0VDX1RYX1NUQVRVU19FUlJPUiwKQEAgLTE3MCw2ICsxNjcsOSBAQAogCQljYXNlIE1TR0NPREVfVFJBTlNNSVRfRkFJTEVEX1RJTUVPVVRfTElORToKIAkJCXNjaGVkdWxlX3dvcmsoJnB1bHNlOC0+d29yayk7CiAJCQlicmVhazsKKwkJY2FzZSBNU0dDT0RFX0hJR0hfRVJST1I6CisJCWNhc2UgTVNHQ09ERV9MT1dfRVJST1I6CisJCWNhc2UgTVNHQ09ERV9SRUNFSVZFX0ZBSUxFRDoKIAkJY2FzZSBNU0dDT0RFX1RJTUVPVVRfRVJST1I6CiAJCQlicmVhazsKIAkJY2FzZSBNU0dDT0RFX0NPTU1BTkRfQUNDRVBURUQ6CkBAIC0zODgsNyArMzg4LDcgQEAKIAlpbnQgZXJyOwogCiAJY21kWzBdID0gTVNHQ09ERV9UUkFOU01JVF9JRExFVElNRTsKLQljbWRbMV0gPSAzOworCWNtZFsxXSA9IHNpZ25hbF9mcmVlX3RpbWU7CiAJZXJyID0gcHVsc2U4X3NlbmRfYW5kX3dhaXQocHVsc2U4LCBjbWQsIDIsCiAJCQkJICAgTVNHQ09ERV9DT01NQU5EX0FDQ0VQVEVELCAxKTsKIAljbWRbMF0gPSBNU0dDT0RFX1RSQU5TTUlUX0FDS19QT0xBUklUWTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L0RvY3VtZW50YXRpb24vQUJJL3N5c2ZzLWNsYXNzLW1vc3QudHh0IGIvZHJpdmVycy9zdGFnaW5nL21vc3QvRG9jdW1lbnRhdGlvbi9BQkkvc3lzZnMtY2xhc3MtbW9zdC50eHQKaW5kZXggNDJmZjBkOC4uNDhhYTQ1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21vc3QvRG9jdW1lbnRhdGlvbi9BQkkvc3lzZnMtY2xhc3MtbW9zdC50eHQKKysrIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvRG9jdW1lbnRhdGlvbi9BQkkvc3lzZnMtY2xhc3MtbW9zdC50eHQKQEAgLTUxLDYgKzUxLDE0MCBAQAogCQl1c2VzLgogVXNlcnM6CiAKK1doYXQ6CQkvc3lzL2NsYXNzL21vc3QvbW9zdGNvcmUvZGV2aWNlcy88bWRldj4vZGNpCitEYXRlOgkJSnVuZSAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNocmlzdGlhbiBHcm9tbSA8Y2hyaXN0aWFuLmdyb21tQG1pY3JvY2hpcC5jb20+CitEZXNjcmlwdGlvbjoKKwkJSWYgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGNvbnRyb2xsZXIgaXMgYXR0YWNoZWQgdmlhIFVTQiwgYSBkY2kKKwkJZGlyZWN0b3J5IGlzIGNyZWF0ZWQgdGhhdCBhbGxvd3MgYXBwbGljYXRpb25zIHRvIHVzZSB0aGUKKwkJY29udHJvbGxlcidzIGRpcmVjdCBjb21tdW5pY2F0aW9uIGludGVyZmFjZSAoRENJKSB0byBleGNoYW5nZQorCQlpbmZvcm1hdGlvbi4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9hcmJfYWRkcmVzcworRGF0ZToJCUp1bmUgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDaHJpc3RpYW4gR3JvbW0gPGNocmlzdGlhbi5ncm9tbUBtaWNyb2NoaXAuY29tPgorRGVzY3JpcHRpb246CisJCVRoaXMgaXMgdXNlZCB0byBzZXQgYW4gYXJiaXRyYXJ5IERDSSByZWdpc3RlciBhZGRyZXNzIGFuCisJCWFwcGxpY2F0aW9uIHdhbnRzIHRvIHJlYWQgZnJvbSBvciB3cml0ZSB0by4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9hcmJfdmFsdWUKK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGlzIGlzIHVzZWQgdG8gcmVhZCBmcm9tIG9yIHdyaXRlIHRvIHRoZSBhcmJpdHJhcnkgRENJIHJlZ2lzdGVyCisJCXdob3NlIGFkZHJlc3MgaXMgc3RvcmVkIGluIGFyYl9hZGRyZXNzLgorVXNlcnM6CisKK1doYXQ6CQkvc3lzL2NsYXNzL21vc3QvbW9zdGNvcmUvZGV2aWNlcy88bWRldj4vZGNpL21lcF9ldWk0OF9oaQorRGF0ZToJCUp1bmUgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDaHJpc3RpYW4gR3JvbW0gPGNocmlzdGlhbi5ncm9tbUBtaWNyb2NoaXAuY29tPgorRGVzY3JpcHRpb246CisJCVRoaXMgaXMgdXNlZCB0byBjaGVjayBhbmQgY29uZmlndXJlIHRoZSBNQUMgYWRkcmVzcy4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9tZXBfZXVpNDhfbG8KK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGlzIGlzIHVzZWQgdG8gY2hlY2sgYW5kIGNvbmZpZ3VyZSB0aGUgTUFDIGFkZHJlc3MuCitVc2VyczoKKworV2hhdDoJCS9zeXMvY2xhc3MvbW9zdC9tb3N0Y29yZS9kZXZpY2VzLzxtZGV2Pi9kY2kvbWVwX2V1aTQ4X21pCitEYXRlOgkJSnVuZSAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNocmlzdGlhbiBHcm9tbSA8Y2hyaXN0aWFuLmdyb21tQG1pY3JvY2hpcC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhpcyBpcyB1c2VkIHRvIGNoZWNrIGFuZCBjb25maWd1cmUgdGhlIE1BQyBhZGRyZXNzLgorVXNlcnM6CisKK1doYXQ6CQkvc3lzL2NsYXNzL21vc3QvbW9zdGNvcmUvZGV2aWNlcy88bWRldj4vZGNpL21lcF9maWx0ZXIKK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGlzIGlzIHVzZWQgdG8gY2hlY2sgYW5kIGNvbmZpZ3VyZSB0aGUgTUVQIGZpbHRlciBhZGRyZXNzLgorVXNlcnM6CisKK1doYXQ6CQkvc3lzL2NsYXNzL21vc3QvbW9zdGNvcmUvZGV2aWNlcy88bWRldj4vZGNpL21lcF9oYXNoMAorRGF0ZToJCUp1bmUgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDaHJpc3RpYW4gR3JvbW0gPGNocmlzdGlhbi5ncm9tbUBtaWNyb2NoaXAuY29tPgorRGVzY3JpcHRpb246CisJCVRoaXMgaXMgdXNlZCB0byBjaGVjayBhbmQgY29uZmlndXJlIHRoZSBNRVAgaGFzaCB0YWJsZS4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9tZXBfaGFzaDEKK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGlzIGlzIHVzZWQgdG8gY2hlY2sgYW5kIGNvbmZpZ3VyZSB0aGUgTUVQIGhhc2ggdGFibGUuCitVc2VyczoKKworV2hhdDoJCS9zeXMvY2xhc3MvbW9zdC9tb3N0Y29yZS9kZXZpY2VzLzxtZGV2Pi9kY2kvbWVwX2hhc2gyCitEYXRlOgkJSnVuZSAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNocmlzdGlhbiBHcm9tbSA8Y2hyaXN0aWFuLmdyb21tQG1pY3JvY2hpcC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhpcyBpcyB1c2VkIHRvIGNoZWNrIGFuZCBjb25maWd1cmUgdGhlIE1FUCBoYXNoIHRhYmxlLgorVXNlcnM6CisKK1doYXQ6CQkvc3lzL2NsYXNzL21vc3QvbW9zdGNvcmUvZGV2aWNlcy88bWRldj4vZGNpL21lcF9oYXNoMworRGF0ZToJCUp1bmUgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDaHJpc3RpYW4gR3JvbW0gPGNocmlzdGlhbi5ncm9tbUBtaWNyb2NoaXAuY29tPgorRGVzY3JpcHRpb246CisJCVRoaXMgaXMgdXNlZCB0byBjaGVjayBhbmQgY29uZmlndXJlIHRoZSBNRVAgaGFzaCB0YWJsZS4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9uaV9zdGF0ZQorRGF0ZToJCUp1bmUgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDaHJpc3RpYW4gR3JvbW0gPGNocmlzdGlhbi5ncm9tbUBtaWNyb2NoaXAuY29tPgorRGVzY3JpcHRpb246CisJCUluZGljYXRlcyB0aGUgY3VycmVudCBuZXR3b3JrIGludGVyZmFjZSBzdGF0ZS4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9ub2RlX2FkZHJlc3MKK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlJbmRpY2F0ZXMgdGhlIGN1cnJlbnQgbm9kZSBhZGRyZXNzLgorVXNlcnM6CisKK1doYXQ6CQkvc3lzL2NsYXNzL21vc3QvbW9zdGNvcmUvZGV2aWNlcy88bWRldj4vZGNpL25vZGVfcG9zaXRpb24KK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlJbmRpY2F0ZXMgdGhlIGN1cnJlbnQgbm9kZSBwb3NpdGlvbi4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9wYWNrZXRfYmFuZHdpZHRoCitEYXRlOgkJSnVuZSAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNocmlzdGlhbiBHcm9tbSA8Y2hyaXN0aWFuLmdyb21tQG1pY3JvY2hpcC5jb20+CitEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGVzIHRoZSBjb25maWd1cmVkIHBhY2tldCBiYW5kd2lkdGguCitVc2VyczoKKworV2hhdDoJCS9zeXMvY2xhc3MvbW9zdC9tb3N0Y29yZS9kZXZpY2VzLzxtZGV2Pi9kY2kvc3luY19lcAorRGF0ZToJCUp1bmUgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDaHJpc3RpYW4gR3JvbW0gPGNocmlzdGlhbi5ncm9tbUBtaWNyb2NoaXAuY29tPgorRGVzY3JpcHRpb246CisJCVRyaWdnZXJzIHRoZSBjb250cm9sbGVyJ3Mgc3luY2hyb25pemF0aW9uIHByb2Nlc3MgZm9yIGEgY2VydGFpbgorCQllbmRwb2ludC4KK1VzZXJzOgorCiBXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+LzxjaGFubmVsPi8KIERhdGU6CQlKdW5lIDIwMTUKIEtlcm5lbFZlcnNpb246CTQuMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21vc3QvYWltLWNkZXYvY2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvYWltLWNkZXYvY2Rldi5jCmluZGV4IGRlNGY3NmEuLjdmNTEwMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS1jZGV2L2NkZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9haW0tY2Rldi9jZGV2LmMKQEAgLTU3LDcgKzU3LDExIEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBjaF9nZXRfbWJvKHN0cnVjdCBhaW1fY2hhbm5lbCAqYywgc3RydWN0IG1ibyAqKm1ibykKIHsKLQkqbWJvID0gbW9zdF9nZXRfbWJvKGMtPmlmYWNlLCBjLT5jaGFubmVsX2lkLCAmY2Rldl9haW0pOworCWlmICgha2ZpZm9fcGVlaygmYy0+ZmlmbywgbWJvKSkgeworCQkqbWJvID0gbW9zdF9nZXRfbWJvKGMtPmlmYWNlLCBjLT5jaGFubmVsX2lkLCAmY2Rldl9haW0pOworCQlpZiAoKm1ibykKKwkJCWtmaWZvX2luKCZjLT5maWZvLCBtYm8sIDEpOworCX0KIAlyZXR1cm4gKm1ibzsKIH0KIApAQCAtMTMwLDcgKzEzNCw3IEBACiAJaWYgKCFjLT5kZXYpIHsKIAkJcHJfaW5mbygiV0FSTjogRGV2aWNlIGlzIGRlc3Ryb3llZFxuIik7CiAJCW11dGV4X3VubG9jaygmYy0+aW9fbXV0ZXgpOwotCQlyZXR1cm4gLUVCVVNZOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAoYy0+YWNjZXNzX3JlZikgewpAQCAtMTg0LDggKzE4OCw3IEBACiAJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnNldCkKIHsKIAlpbnQgcmV0OwotCXNpemVfdCBhY3R1YWxfbGVuOwotCXNpemVfdCBtYXhfbGVuOworCXNpemVfdCB0b19jb3B5LCBsZWZ0OwogCXN0cnVjdCBtYm8gKm1ibyA9IE5VTEw7CiAJc3RydWN0IGFpbV9jaGFubmVsICpjID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCkBAIC0yMDEsMjcgKzIwNCwyOCBAQAogCX0KIAogCWlmICh1bmxpa2VseSghYy0+ZGV2KSkgewotCQlyZXQgPSAtRVBJUEU7CisJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gdW5sb2NrOwogCX0KIAotCW1heF9sZW4gPSBjLT5jZmctPmJ1ZmZlcl9zaXplOwotCWFjdHVhbF9sZW4gPSBtaW4oY291bnQsIG1heF9sZW4pOwotCW1iby0+YnVmZmVyX2xlbmd0aCA9IGFjdHVhbF9sZW47Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIobWJvLT52aXJ0X2FkZHJlc3MsIGJ1ZiwgbWJvLT5idWZmZXJfbGVuZ3RoKSkgeworCXRvX2NvcHkgPSBtaW4oY291bnQsIGMtPmNmZy0+YnVmZmVyX3NpemUgLSBjLT5tYm9fb2Zmcyk7CisJbGVmdCA9IGNvcHlfZnJvbV91c2VyKG1iby0+dmlydF9hZGRyZXNzICsgYy0+bWJvX29mZnMsIGJ1ZiwgdG9fY29weSk7CisJaWYgKGxlZnQgPT0gdG9fY29weSkgewogCQlyZXQgPSAtRUZBVUxUOwotCQlnb3RvIHB1dF9tYm87CisJCWdvdG8gdW5sb2NrOwogCX0KIAotCXJldCA9IG1vc3Rfc3VibWl0X21ibyhtYm8pOwotCWlmIChyZXQpCi0JCWdvdG8gcHV0X21ibzsKKwljLT5tYm9fb2ZmcyArPSB0b19jb3B5IC0gbGVmdDsKKwlpZiAoYy0+bWJvX29mZnMgPj0gYy0+Y2ZnLT5idWZmZXJfc2l6ZSB8fAorCSAgICBjLT5jZmctPmRhdGFfdHlwZSA9PSBNT1NUX0NIX0NPTlRST0wgfHwKKwkgICAgYy0+Y2ZnLT5kYXRhX3R5cGUgPT0gTU9TVF9DSF9BU1lOQykgeworCQlrZmlmb19za2lwKCZjLT5maWZvKTsKKwkJbWJvLT5idWZmZXJfbGVuZ3RoID0gYy0+bWJvX29mZnM7CisJCWMtPm1ib19vZmZzID0gMDsKKwkJbW9zdF9zdWJtaXRfbWJvKG1ibyk7CisJfQogCi0JbXV0ZXhfdW5sb2NrKCZjLT5pb19tdXRleCk7Ci0JcmV0dXJuIGFjdHVhbF9sZW47Ci1wdXRfbWJvOgotCW1vc3RfcHV0X21ibyhtYm8pOworCXJldCA9IHRvX2NvcHkgLSBsZWZ0OwogdW5sb2NrOgogCW11dGV4X3VubG9jaygmYy0+aW9fbXV0ZXgpOwogCXJldHVybiByZXQ7CkBAIC0yNTYsNyArMjYwLDcgQEAKIAkvKiBtYWtlIHN1cmUgd2UgZG9uJ3Qgc3VibWl0IHRvIGdvbmUgZGV2aWNlcyAqLwogCWlmICh1bmxpa2VseSghYy0+ZGV2KSkgewogCQltdXRleF91bmxvY2soJmMtPmlvX211dGV4KTsKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXRvX2NvcHkgPSBtaW5fdChzaXplX3QsCkBAIC0yOTAsNyArMjk0LDcgQEAKIAkJaWYgKCFrZmlmb19pc19lbXB0eSgmYy0+ZmlmbykpCiAJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CiAJfSBlbHNlIHsKLQkJaWYgKGNoX2hhc19tYm8oYykpCisJCWlmICgha2ZpZm9faXNfZW1wdHkoJmMtPmZpZm8pIHx8IGNoX2hhc19tYm8oYykpCiAJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwogCX0KIAlyZXR1cm4gbWFzazsKQEAgLTM2Niw3ICszNzAsNyBAQAogCXNwaW5fbG9jaygmYy0+dW5saW5rKTsKIAlpZiAoIWMtPmFjY2Vzc19yZWYgfHwgIWMtPmRldikgewogCQlzcGluX3VubG9jaygmYy0+dW5saW5rKTsKLQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAlrZmlmb19pbigmYy0+ZmlmbywgJm1ibywgMSk7CiAJc3Bpbl91bmxvY2soJmMtPnVubGluayk7CkBAIC00OTksMjMgKzUwMywyNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBtb2RfaW5pdCh2b2lkKQogeworCWludCBlcnI7CisKIAlwcl9pbmZvKCJpbml0KClcbiIpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmNoYW5uZWxfbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJmNoX2xpc3RfbG9jayk7CiAJaWRhX2luaXQoJm1pbm9yX2lkKTsKIAotCWlmIChhbGxvY19jaHJkZXZfcmVnaW9uKCZhaW1fZGV2bm8sIDAsIDUwLCAiY2RldiIpIDwgMCkKLQkJcmV0dXJuIC1FSU87CisJZXJyID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmYWltX2Rldm5vLCAwLCA1MCwgImNkZXYiKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBkZXN0X2lkYTsKIAltYWpvciA9IE1BSk9SKGFpbV9kZXZubyk7CiAKIAlhaW1fY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJtb3N0X2NkZXZfYWltIik7CiAJaWYgKElTX0VSUihhaW1fY2xhc3MpKSB7CiAJCXByX2Vycigibm8gdWRldiBzdXBwb3J0XG4iKTsKKwkJZXJyID0gUFRSX0VSUihhaW1fY2xhc3MpOwogCQlnb3RvIGZyZWVfY2RldjsKIAl9Ci0KLQlpZiAobW9zdF9yZWdpc3Rlcl9haW0oJmNkZXZfYWltKSkKKwllcnIgPSBtb3N0X3JlZ2lzdGVyX2FpbSgmY2Rldl9haW0pOworCWlmIChlcnIpCiAJCWdvdG8gZGVzdF9jbGFzczsKIAlyZXR1cm4gMDsKIApAQCAtNTIzLDcgKzUzMSw5IEBACiAJY2xhc3NfZGVzdHJveShhaW1fY2xhc3MpOwogZnJlZV9jZGV2OgogCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihhaW1fZGV2bm8sIDEpOwotCXJldHVybiAtRUlPOworZGVzdF9pZGE6CisJaWRhX2Rlc3Ryb3koJm1pbm9yX2lkKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbW9kX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS1uZXR3b3JrL25ldHdvcmtpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS1uZXR3b3JrL25ldHdvcmtpbmcuYwppbmRleCAyZjQyZGU0Li40NjU5YTY0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21vc3QvYWltLW5ldHdvcmsvbmV0d29ya2luZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS1uZXR3b3JrL25ldHdvcmtpbmcuYwpAQCAtMjk4LDE1ICsyOTgsMTYgQEAKIAlzdHJ1Y3QgbW9zdF9pbnRlcmZhY2UgKmlmYWNlKQogewogCXN0cnVjdCBuZXRfZGV2X2NvbnRleHQgKm5kLCAqdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2soJmxpc3RfbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShuZCwgdG1wLCAmbmV0X2RldmljZXMsIGxpc3QpIHsKIAkJaWYgKG5kLT5pZmFjZSA9PSBpZmFjZSkgewotCQkJc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKIAkJCXJldHVybiBuZDsKIAkJfQogCX0KLQlzcGluX3VubG9jaygmbGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMzE2LDYgKzMxNyw3IEBACiB7CiAJc3RydWN0IG5ldF9kZXZfY29udGV4dCAqbmQ7CiAJc3RydWN0IG5ldF9kZXZfY2hhbm5lbCAqY2g7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghaWZhY2UpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzMyLDkgKzMzNCw5IEBACiAKIAkJbmQtPmlmYWNlID0gaWZhY2U7CiAKLQkJc3Bpbl9sb2NrKCZsaXN0X2xvY2spOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7CiAJCWxpc3RfYWRkKCZuZC0+bGlzdCwgJm5ldF9kZXZpY2VzKTsKLQkJc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3RfbG9jaywgZmxhZ3MpOwogCX0KIAogCWNoID0gY2NmZy0+ZGlyZWN0aW9uID09IE1PU1RfQ0hfVFggPyAmbmQtPnR4IDogJm5kLT5yeDsKQEAgLTM3Nyw2ICszNzksNyBAQAogewogCXN0cnVjdCBuZXRfZGV2X2NvbnRleHQgKm5kOwogCXN0cnVjdCBuZXRfZGV2X2NoYW5uZWwgKmNoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAluZCA9IGdldF9uZXRfZGV2X2NvbnRleHQoaWZhY2UpOwogCWlmICghbmQpCkBAIC0zOTgsOSArNDAxLDkgQEAKIAltb3N0X25ldF9ybV9uZXRkZXZfc2FmZShuZCk7CiAKIAlpZiAoIW5kLT5yeC5saW5rZWQgJiYgIW5kLT50eC5saW5rZWQpIHsKLQkJc3Bpbl9sb2NrKCZsaXN0X2xvY2spOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7CiAJCWxpc3RfZGVsKCZuZC0+bGlzdCk7Ci0JCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKIAkJa2ZyZWUobmQpOwogCX0KIApAQCAtNTE0LDIwICs1MTcsMjEgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBtb3N0X25ldF9leGl0KHZvaWQpCiB7CiAJc3RydWN0IG5ldF9kZXZfY29udGV4dCAqbmQsICp0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9jaygmbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5kLCB0bXAsICZuZXRfZGV2aWNlcywgbGlzdCkgewogCQlsaXN0X2RlbCgmbmQtPmxpc3QpOwotCQlzcGluX3VubG9jaygmbGlzdF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7CiAJCS8qCiAJCSAqIGRvIG5vdCBjYWxsIG1vc3Rfc3RvcF9jaGFubmVsKCkgaGVyZSwgYmVjYXVzZSBjaGFubmVscyBhcmUKIAkJICogZ29pbmcgdG8gYmUgY2xvc2VkIGluIG5kb19zdG9wKCkgYWZ0ZXIgdW5yZWdpc3Rlcl9uZXRkZXYoKQogCQkgKi8KIAkJbW9zdF9uZXRfcm1fbmV0ZGV2X3NhZmUobmQpOwogCQlrZnJlZShuZCk7Ci0JCXNwaW5fbG9jaygmbGlzdF9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgZmxhZ3MpOwogCX0KLQlzcGluX3VubG9jaygmbGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKIAogCW1vc3RfZGVyZWdpc3Rlcl9haW0oJmFpbSk7CiAJcHJfaW5mbygibW9zdF9uZXRfZXhpdCgpXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS1zb3VuZC9zb3VuZC5jIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvYWltLXNvdW5kL3NvdW5kLmMKaW5kZXggOWM2NDU4MC4uZTQxOThlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21vc3QvYWltLXNvdW5kL3NvdW5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvYWltLXNvdW5kL3NvdW5kLmMKQEAgLTIzNCw3ICsyMzQsNiBAQAogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCXN0cnVjdCBtYm8gKm1ibyA9IE5VTEw7CiAJCWJvb2wgcGVyaW9kX2VsYXBzZWQgPSBmYWxzZTsKLQkJaW50IHJldDsKIAogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCiAJCQljaGFubmVsLT5wbGF5YmFja193YWl0cSwKQEAgLTI1MCwxMCArMjQ5LDcgQEAKIAkJZWxzZQogCQkJbWVtc2V0KG1iby0+dmlydF9hZGRyZXNzLCAwLCBtYm8tPmJ1ZmZlcl9sZW5ndGgpOwogCi0JCXJldCA9IG1vc3Rfc3VibWl0X21ibyhtYm8pOwotCQlpZiAocmV0KQotCQkJY2hhbm5lbC0+aXNfc3RyZWFtX3J1bm5pbmcgPSBmYWxzZTsKLQorCQltb3N0X3N1Ym1pdF9tYm8obWJvKTsKIAkJaWYgKHBlcmlvZF9lbGFwc2VkKQogCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjaGFubmVsLT5zdWJzdHJlYW0pOwogCX0KQEAgLTQ1Nyw3ICs0NTMsNyBAQAogLyoqCiAgKiBJbml0aWFsaXphdGlvbiBvZiBzdHJ1Y3Qgc25kX3BjbV9vcHMKICAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBwY21fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBwY21fb3BzID0gewogCS5vcGVuICAgICAgID0gcGNtX29wZW4sCiAJLmNsb3NlICAgICAgPSBwY21fY2xvc2UsCiAJLmlvY3RsICAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTYxMSw3ICs2MDcsOCBAQAogCWNoYW5uZWwtPmlkID0gY2hhbm5lbF9pZDsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaGFubmVsLT5wbGF5YmFja193YWl0cSk7CiAKLQlpZiAoYXVkaW9fc2V0X2h3X3BhcmFtcygmY2hhbm5lbC0+cGNtX2hhcmR3YXJlLCBwY21fZm9ybWF0LCBjZmcpKQorCXJldCA9IGF1ZGlvX3NldF9od19wYXJhbXMoJmNoYW5uZWwtPnBjbV9oYXJkd2FyZSwgcGNtX2Zvcm1hdCwgY2ZnKTsKKwlpZiAocmV0KQogCQlnb3RvIGVycl9mcmVlX2NhcmQ7CiAKIAlzbnByaW50ZihjYXJkLT5kcml2ZXIsIHNpemVvZihjYXJkLT5kcml2ZXIpLCAiJXMiLCBEUklWRVJfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9haW0tdjRsMi92aWRlby5jIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvYWltLXY0bDIvdmlkZW8uYwppbmRleCAxM2FiZjdjLi5lMDc0ODQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9haW0tdjRsMi92aWRlby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS12NGwyL3ZpZGVvLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAlzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXYgPSB2aWRlb19kcnZkYXRhKGZpbHApOwogCXN0cnVjdCBhaW1fZmggKmZoOwogCi0JcHJfaW5mbygiYWltX3ZkZXZfb3BlbigpXG4iKTsKKwl2NGwyX2luZm8oJm1kZXYtPnY0bDJfZGV2LCAiYWltX3ZkZXZfb3BlbigpXG4iKTsKIAogCXN3aXRjaCAodmRldi0+dmZsX3R5cGUpIHsKIAljYXNlIFZGTF9UWVBFX0dSQUJCRVI6CkBAIC05Myw3ICs5Myw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKCFhdG9taWNfaW5jX2FuZF90ZXN0KCZtZGV2LT5hY2Nlc3NfcmVmKSkgewotCQlwcl9lcnIoInRvbyBtYW55IGNsaWVudHNcbiIpOworCQl2NGwyX2VycigmbWRldi0+djRsMl9kZXYsICJ0b28gbWFueSBjbGllbnRzXG4iKTsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIGVycl9kZWM7CiAJfQpAQCAtMTA2LDcgKzEwNiw3IEBACiAKIAlyZXQgPSBtb3N0X3N0YXJ0X2NoYW5uZWwobWRldi0+aWZhY2UsIG1kZXYtPmNoX2lkeCwgJmFpbV9pbmZvKTsKIAlpZiAocmV0KSB7Ci0JCXByX2VycigibW9zdF9zdGFydF9jaGFubmVsKCkgZmFpbGVkXG4iKTsKKwkJdjRsMl9lcnIoJm1kZXYtPnY0bDJfZGV2LCAibW9zdF9zdGFydF9jaGFubmVsKCkgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfcm07CiAJfQogCkBAIC0xMjgsNyArMTI4LDcgQEAKIAlzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXYgPSBmaC0+bWRldjsKIAlzdHJ1Y3QgbWJvICptYm8sICp0bXA7CiAKLQlwcl9pbmZvKCJhaW1fdmRldl9jbG9zZSgpXG4iKTsKKwl2NGwyX2luZm8oJm1kZXYtPnY0bDJfZGV2LCAiYWltX3ZkZXZfY2xvc2UoKVxuIik7CiAKIAkvKgogCSAqIFdlIG5lZWQgdG8gcHV0IE1CT3MgYmFjayBiZWZvcmUgd2UgY2FsbCBtb3N0X3N0b3BfY2hhbm5lbCgpCkBAIC0xMzksMTUgKzEzOSwxNSBAQAogCSAqIFRoaXMgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBjb3JlLgogCSAqLwogCi0Jc3Bpbl9sb2NrKCZtZGV2LT5saXN0X2xvY2spOworCXNwaW5fbG9ja19pcnEoJm1kZXYtPmxpc3RfbG9jayk7CiAJbWRldi0+bXV0ZSA9IHRydWU7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1ibywgdG1wLCAmbWRldi0+cGVuZGluZ19tYm9zLCBsaXN0KSB7CiAJCWxpc3RfZGVsKCZtYm8tPmxpc3QpOwotCQlzcGluX3VubG9jaygmbWRldi0+bGlzdF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5saXN0X2xvY2spOwogCQltb3N0X3B1dF9tYm8obWJvKTsKLQkJc3Bpbl9sb2NrKCZtZGV2LT5saXN0X2xvY2spOworCQlzcGluX2xvY2tfaXJxKCZtZGV2LT5saXN0X2xvY2spOwogCX0KLQlzcGluX3VubG9jaygmbWRldi0+bGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJm1kZXYtPmxpc3RfbG9jayk7CiAJbW9zdF9zdG9wX2NoYW5uZWwobWRldi0+aWZhY2UsIG1kZXYtPmNoX2lkeCwgJmFpbV9pbmZvKTsKIAltZGV2LT5tdXRlID0gZmFsc2U7CiAKQEAgLTE4Nyw3ICsxODcsNyBAQAogCQlpbnQgY29uc3QgY250ID0gcmVtIDwgY291bnQgPyByZW0gOiBjb3VudDsKIAogCQlpZiAoY29weV90b191c2VyKGJ1ZiwgbWJvLT52aXJ0X2FkZHJlc3MgKyBmaC0+b2ZmcywgY250KSkgewotCQkJcHJfZXJyKCJyZWFkOiBjb3B5X3RvX3VzZXIgZmFpbGVkXG4iKTsKKwkJCXY0bDJfZXJyKCZtZGV2LT52NGwyX2RldiwgInJlYWQ6IGNvcHlfdG9fdXNlciBmYWlsZWRcbiIpOwogCQkJaWYgKCFyZXQpCiAJCQkJcmV0ID0gLUVGQVVMVDsKIAkJCXJldHVybiByZXQ7CkBAIC0yMDAsOSArMjAwLDkgQEAKIAogCQlpZiAoY250ID49IHJlbSkgewogCQkJZmgtPm9mZnMgPSAwOwotCQkJc3Bpbl9sb2NrKCZtZGV2LT5saXN0X2xvY2spOworCQkJc3Bpbl9sb2NrX2lycSgmbWRldi0+bGlzdF9sb2NrKTsKIAkJCWxpc3RfZGVsKCZtYm8tPmxpc3QpOwotCQkJc3Bpbl91bmxvY2soJm1kZXYtPmxpc3RfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmxpc3RfbG9jayk7CiAJCQltb3N0X3B1dF9tYm8obWJvKTsKIAkJfQogCX0KQEAgLTI1MCwxNiArMjUwLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJICAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQogewogCXN0cnVjdCBhaW1fZmggKmZoID0gcHJpdjsKIAlzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXYgPSBmaC0+bWRldjsKIAotCXByX2luZm8oInZpZGlvY19xdWVyeWNhcCgpXG4iKTsKKwl2NGwyX2luZm8oJm1kZXYtPnY0bDJfZGV2LCAidmlkaW9jX3F1ZXJ5Y2FwKClcbiIpOwogCiAJc3RybGNweShjYXAtPmRyaXZlciwgInY0bDJfbW9zdF9haW0iLCBzaXplb2YoY2FwLT5kcml2ZXIpKTsKLQlzdHJsY3B5KGNhcC0+Y2FyZCwgIm15X2NhcmQiLCBzaXplb2YoY2FwLT5jYXJkKSk7CisJc3RybGNweShjYXAtPmNhcmQsICJNT1NUIiwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwogCXNucHJpbnRmKGNhcC0+YnVzX2luZm8sIHNpemVvZihjYXAtPmJ1c19pbmZvKSwKIAkJICIlcyIsIG1kZXYtPmlmYWNlLT5kZXNjcmlwdGlvbik7CiAKQEAgLTI3MCwxMCArMjcwLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorc3RhdGljIGludCB2aWRpb2NfZW51bV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQogewotCXByX2luZm8oInZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKCkgJWRcbiIsIGYtPmluZGV4KTsKKwlzdHJ1Y3QgYWltX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IG1vc3RfdmlkZW9fZGV2ICptZGV2ID0gZmgtPm1kZXY7CisKKwl2NGwyX2luZm8oJm1kZXYtPnY0bDJfZGV2LCAidmlkaW9jX2VudW1fZm10X3ZpZF9jYXAoKSAlZFxuIiwgZi0+aW5kZXgpOwogCiAJaWYgKGYtPmluZGV4KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI4OSw3ICsyOTIsMTAgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX2dfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCXByX2luZm8oInZpZGlvY19nX2ZtdF92aWRfY2FwKClcbiIpOworCXN0cnVjdCBhaW1fZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXYgPSBmaC0+bWRldjsKKworCXY0bDJfaW5mbygmbWRldi0+djRsMl9kZXYsICJ2aWRpb2NfZ19mbXRfdmlkX2NhcCgpXG4iKTsKIAogCWFpbV9zZXRfZm9ybWF0X3N0cnVjdChmKTsKIAlyZXR1cm4gMDsKQEAgLTI5OCw3ICszMDQsNyBAQAogc3RhdGljIGludCB2aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCSAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCXN0cnVjdCBhaW1fZmggKmZoICA9IHByaXY7CisJc3RydWN0IGFpbV9maCAqZmggPSBwcml2OwogCXN0cnVjdCBtb3N0X3ZpZGVvX2RldiAqbWRldiA9IGZoLT5tZGV2OwogCiAJcmV0dXJuIGFpbV9zZXRfZm9ybWF0KG1kZXYsIFZJRElPQ19UUllfRk1ULCBmKTsKQEAgLTMwNyw3ICszMTMsNyBAQAogc3RhdGljIGludCB2aWRpb2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7Ci0Jc3RydWN0IGFpbV9maCAqZmggID0gcHJpdjsKKwlzdHJ1Y3QgYWltX2ZoICpmaCA9IHByaXY7CiAJc3RydWN0IG1vc3RfdmlkZW9fZGV2ICptZGV2ID0gZmgtPm1kZXY7CiAKIAlyZXR1cm4gYWltX3NldF9mb3JtYXQobWRldiwgVklESU9DX1NfRk1ULCBmKTsKQEAgLTMxNSw3ICszMjEsMTAgQEAKIAogc3RhdGljIGludCB2aWRpb2NfZ19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICpub3JtKQogewotCXByX2luZm8oInZpZGlvY19nX3N0ZCgpXG4iKTsKKwlzdHJ1Y3QgYWltX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IG1vc3RfdmlkZW9fZGV2ICptZGV2ID0gZmgtPm1kZXY7CisKKwl2NGwyX2luZm8oJm1kZXYtPnY0bDJfZGV2LCAidmlkaW9jX2dfc3RkKClcbiIpOwogCiAJKm5vcm0gPSBWNEwyX1NURF9VTktOT1dOOwogCXJldHVybiAwOwpAQCAtMzUyLDcgKzM2MSw3IEBACiAJc3RydWN0IGFpbV9maCAqZmggPSBwcml2OwogCXN0cnVjdCBtb3N0X3ZpZGVvX2RldiAqbWRldiA9IGZoLT5tZGV2OwogCi0JcHJfaW5mbygidmlkaW9jX3NfaW5wdXQoJWQpXG4iLCBpbmRleCk7CisJdjRsMl9pbmZvKCZtZGV2LT52NGwyX2RldiwgInZpZGlvY19zX2lucHV0KCVkKVxuIiwgaW5kZXgpOwogCiAJaWYgKGluZGV4ID49IFY0TDJfQUlNX01BWF9JTlBVVCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNjAsNyArMzY5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBhaW1fZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgYWltX2ZvcHMgPSB7CiAJLm93bmVyICAgICAgPSBUSElTX01PRFVMRSwKIAkub3BlbiAgICAgICA9IGFpbV92ZGV2X29wZW4sCiAJLnJlbGVhc2UgICAgPSBhaW1fdmRldl9jbG9zZSwKQEAgLTM5Myw0NSArNDAyLDQ2IEBACiBzdGF0aWMgc3RydWN0IG1vc3RfdmlkZW9fZGV2ICpnZXRfYWltX2RldigKIAlzdHJ1Y3QgbW9zdF9pbnRlcmZhY2UgKmlmYWNlLCBpbnQgY2hhbm5lbF9pZHgpCiB7Ci0Jc3RydWN0IG1vc3RfdmlkZW9fZGV2ICptZGV2LCAqdG1wOworCXN0cnVjdCBtb3N0X3ZpZGVvX2RldiAqbWRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrKCZsaXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtZGV2LCB0bXAsICZ2aWRlb19kZXZpY2VzLCBsaXN0KSB7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobWRldiwgJnZpZGVvX2RldmljZXMsIGxpc3QpIHsKIAkJaWYgKG1kZXYtPmlmYWNlID09IGlmYWNlICYmIG1kZXYtPmNoX2lkeCA9PSBjaGFubmVsX2lkeCkgewotCQkJc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKIAkJCXJldHVybiBtZGV2OwogCQl9CiAJfQotCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3RfbG9jaywgZmxhZ3MpOwogCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50IGFpbV9yeF9kYXRhKHN0cnVjdCBtYm8gKm1ibykKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBtb3N0X3ZpZGVvX2RldiAqbWRldiA9CiAJCWdldF9haW1fZGV2KG1iby0+aWZwLCBtYm8tPmhkbV9jaGFubmVsX2lkKTsKIAogCWlmICghbWRldikKIAkJcmV0dXJuIC1FSU87CiAKLQlzcGluX2xvY2soJm1kZXYtPmxpc3RfbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmxpc3RfbG9jaywgZmxhZ3MpOwogCWlmICh1bmxpa2VseShtZGV2LT5tdXRlKSkgewotCQlzcGluX3VubG9jaygmbWRldi0+bGlzdF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+bGlzdF9sb2NrLCBmbGFncyk7CiAJCXJldHVybiAtRUlPOwogCX0KIAogCWxpc3RfYWRkX3RhaWwoJm1iby0+bGlzdCwgJm1kZXYtPnBlbmRpbmdfbWJvcyk7Ci0Jc3Bpbl91bmxvY2soJm1kZXYtPmxpc3RfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+bGlzdF9sb2NrLCBmbGFncyk7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtZGV2LT53YWl0X2RhdGEpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFpbV9yZWdpc3Rlcl92aWRlb2RldihzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXYpCiB7Ci0JaW50IHJldHZhbCA9IC1FTk9NRU07CiAJaW50IHJldDsKIAotCXByX2luZm8oImFpbV9yZWdpc3Rlcl92aWRlb2RldigpXG4iKTsKKwl2NGwyX2luZm8oJm1kZXYtPnY0bDJfZGV2LCAiYWltX3JlZ2lzdGVyX3ZpZGVvZGV2KClcbiIpOwogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmbWRldi0+d2FpdF9kYXRhKTsKIApAQCAtNDQ0LDI3ICs0NTQsMjQgQEAKIAkqbWRldi0+dmRldiA9IGFpbV92aWRlb2Rldl90ZW1wbGF0ZTsKIAltZGV2LT52ZGV2LT52NGwyX2RldiA9ICZtZGV2LT52NGwyX2RldjsKIAltZGV2LT52ZGV2LT5sb2NrID0gJm1kZXYtPmxvY2s7Ci0Jc3RyY3B5KG1kZXYtPnZkZXYtPm5hbWUsICJtb3N0IHY0bDIgYWltIHZpZGVvIik7CisJc25wcmludGYobWRldi0+dmRldi0+bmFtZSwgc2l6ZW9mKG1kZXYtPnZkZXYtPm5hbWUpLCAiTU9TVDogJXMiLAorCQkgbWRldi0+djRsMl9kZXYubmFtZSk7CiAKIAkvKiBSZWdpc3RlciB0aGUgdjRsMiBkZXZpY2UgKi8KIAl2aWRlb19zZXRfZHJ2ZGF0YShtZGV2LT52ZGV2LCBtZGV2KTsKLQlyZXR2YWwgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UobWRldi0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOwotCWlmIChyZXR2YWwgIT0gMCkgewotCQlwcl9lcnIoInZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBlcnJfdmJpX2RldjsKKwlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UobWRldi0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOworCWlmIChyZXQpIHsKKwkJdjRsMl9lcnIoJm1kZXYtPnY0bDJfZGV2LCAidmlkZW9fcmVnaXN0ZXJfZGV2aWNlIGZhaWxlZCAoJWQpXG4iLAorCQkJIHJldCk7CisJCXZpZGVvX2RldmljZV9yZWxlYXNlKG1kZXYtPnZkZXYpOwogCX0KIAotCXJldHVybiAwOwotCi1lcnJfdmJpX2RldjoKLQl2aWRlb19kZXZpY2VfcmVsZWFzZShtZGV2LT52ZGV2KTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBhaW1fdW5yZWdpc3Rlcl92aWRlb2RldihzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXYpCiB7Ci0JcHJfaW5mbygiYWltX3VucmVnaXN0ZXJfdmlkZW9kZXYoKVxuIik7CisJdjRsMl9pbmZvKCZtZGV2LT52NGwyX2RldiwgImFpbV91bnJlZ2lzdGVyX3ZpZGVvZGV2KClcbiIpOwogCiAJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UobWRldi0+dmRldik7CiB9CkBAIC00ODUsNyArNDkyLDcgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBtb3N0X3ZpZGVvX2RldiAqbWRldiA9IGdldF9haW1fZGV2KGlmYWNlLCBjaGFubmVsX2lkeCk7CiAKLQlwcl9pbmZvKCJhaW1fcHJvYmVfY2hhbm5lbCgpXG4iKTsKKwlwcl9pbmZvKCJhaW1fcHJvYmVfY2hhbm5lbCglcylcbiIsIG5hbWUpOwogCiAJaWYgKG1kZXYpIHsKIAkJcHJfZXJyKCJjaGFubmVsIGFscmVhZHkgbGlua2VkXG4iKTsKQEAgLTQ5OCw4ICs1MDUsOCBAQAogCX0KIAogCWlmIChjY2ZnLT5kYXRhX3R5cGUgIT0gTU9TVF9DSF9TWU5DICYmCi0JICAgIGNjZmctPmRhdGFfdHlwZSAhPSBNT1NUX0NIX0lTT0NfQVZQKSB7Ci0JCXByX2Vycigid3JvbmcgY2hhbm5lbCB0eXBlLCBleHBlY3Qgc3luYyBvciBpc29jX2F2cFxuIik7CisJICAgIGNjZmctPmRhdGFfdHlwZSAhPSBNT1NUX0NIX0lTT0MpIHsKKwkJcHJfZXJyKCJ3cm9uZyBjaGFubmVsIHR5cGUsIGV4cGVjdCBzeW5jIG9yIGlzb2NcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTUxNiw4ICs1MjMsNyBAQAogCW1kZXYtPnY0bDJfZGV2LnJlbGVhc2UgPSBhaW1fdjRsMl9kZXZfcmVsZWFzZTsKIAogCS8qIENyZWF0ZSB0aGUgdjRsMl9kZXZpY2UgKi8KLQlzdHJsY3B5KG1kZXYtPnY0bDJfZGV2Lm5hbWUsICJtb3N0X3ZpZGVvX2RldmljZSIsCi0JCXNpemVvZihtZGV2LT52NGwyX2Rldi5uYW1lKSk7CisJc3RybGNweShtZGV2LT52NGwyX2Rldi5uYW1lLCBuYW1lLCBzaXplb2YobWRldi0+djRsMl9kZXYubmFtZSkpOwogCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKE5VTEwsICZtZGV2LT52NGwyX2Rldik7CiAJaWYgKHJldCkgewogCQlwcl9lcnIoInY0bDJfZGV2aWNlX3JlZ2lzdGVyKCkgZmFpbGVkXG4iKTsKQEAgLTUyOSw5ICs1MzUsMTAgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl91bnJlZzsKIAotCXNwaW5fbG9jaygmbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZsaXN0X2xvY2spOwogCWxpc3RfYWRkKCZtZGV2LT5saXN0LCAmdmlkZW9fZGV2aWNlcyk7Ci0Jc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZsaXN0X2xvY2spOworCXY0bDJfaW5mbygmbWRldi0+djRsMl9kZXYsICJhaW1fcHJvYmVfY2hhbm5lbCgpIGRvbmVcbiIpOwogCXJldHVybiAwOwogCiBlcnJfdW5yZWc6CkBAIC01NDUsMTYgKzU1MiwxNiBAQAogewogCXN0cnVjdCBtb3N0X3ZpZGVvX2RldiAqbWRldiA9IGdldF9haW1fZGV2KGlmYWNlLCBjaGFubmVsX2lkeCk7CiAKLQlwcl9pbmZvKCJhaW1fZGlzY29ubmVjdF9jaGFubmVsKClcbiIpOwotCiAJaWYgKCFtZGV2KSB7CiAJCXByX2Vycigibm8gc3VjaCBjaGFubmVsIGlzIGxpbmtlZFxuIik7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCXNwaW5fbG9jaygmbGlzdF9sb2NrKTsKKwl2NGwyX2luZm8oJm1kZXYtPnY0bDJfZGV2LCAiYWltX2Rpc2Nvbm5lY3RfY2hhbm5lbCgpXG4iKTsKKworCXNwaW5fbG9ja19pcnEoJmxpc3RfbG9jayk7CiAJbGlzdF9kZWwoJm1kZXYtPmxpc3QpOwotCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmbGlzdF9sb2NrKTsKIAogCWFpbV91bnJlZ2lzdGVyX3ZpZGVvZGV2KG1kZXYpOwogCXY0bDJfZGV2aWNlX2Rpc2Nvbm5lY3QoJm1kZXYtPnY0bDJfZGV2KTsKQEAgLTU4NSwxNyArNTkyLDE3IEBACiAJICogd2Ugc2ltdWxhdGUgdGhpcyBjYWxsIGhlcmUuCiAJICogVGhpcyBtdXN0IGJlIGZpeGVkIGluIGNvcmUuCiAJICovCi0Jc3Bpbl9sb2NrKCZsaXN0X2xvY2spOworCXNwaW5fbG9ja19pcnEoJmxpc3RfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1kZXYsIHRtcCwgJnZpZGVvX2RldmljZXMsIGxpc3QpIHsKIAkJbGlzdF9kZWwoJm1kZXYtPmxpc3QpOwotCQlzcGluX3VubG9jaygmbGlzdF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZsaXN0X2xvY2spOwogCiAJCWFpbV91bnJlZ2lzdGVyX3ZpZGVvZGV2KG1kZXYpOwogCQl2NGwyX2RldmljZV9kaXNjb25uZWN0KCZtZGV2LT52NGwyX2Rldik7CiAJCXY0bDJfZGV2aWNlX3B1dCgmbWRldi0+djRsMl9kZXYpOwotCQlzcGluX2xvY2soJmxpc3RfbG9jayk7CisJCXNwaW5fbG9ja19pcnEoJmxpc3RfbG9jayk7CiAJfQotCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmbGlzdF9sb2NrKTsKIAogCW1vc3RfZGVyZWdpc3Rlcl9haW0oJmFpbV9pbmZvKTsKIAlCVUdfT04oIWxpc3RfZW1wdHkoJnZpZGVvX2RldmljZXMpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfaGFsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX2hhbC5jCmluZGV4IDNjNTI0NTAuLjBiOTgxNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfaGFsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvaGRtLWRpbTIvZGltMl9oYWwuYwpAQCAtMiw3ICsyLDcgQEAKICAqIGRpbTJfaGFsLmMgLSBESU0yIEhBTCBpbXBsZW1lbnRhdGlvbgogICogKE1lZGlhTEIsIERldmljZSBJbnRlcmZhY2UgTWFjcm8gSVAsIE9TNjI0MjApCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDE1LCBNaWNyb2NoaXAgVGVjaG5vbG9neSBHZXJtYW55IElJIEdtYkggJiBDby4gS0cKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2LCBNaWNyb2NoaXAgVGVjaG5vbG9neSBHZXJtYW55IElJIEdtYkggJiBDby4gS0cKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCkBAIC0yMCwxOCArMjAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogCiAvKgotICogVGhlIG51bWJlciBvZiBmcmFtZXMgcGVyIHN1Yi1idWZmZXIgZm9yIHN5bmNocm9ub3VzIGNoYW5uZWxzLgotICogQWxsb3dlZCB2YWx1ZXM6IDEsIDIsIDQsIDgsIDE2LCAzMiwgNjQuCi0gKi8KLSNkZWZpbmUgRlJBTUVTX1BFUl9TVUJCVUZGIDE2Ci0KLS8qCi0gKiBTaXplIGZhY3RvciBmb3Igc3luY2hyb25vdXMgREJSIGJ1ZmZlci4KLSAqIE1pbmltYWwgdmFsdWUgaXMgNCpGUkFNRVNfUEVSX1NVQkJVRkYuCi0gKi8KLSNkZWZpbmUgU1lOQ19EQlJfRkFDVE9SICg0dSAqICh1MTYpRlJBTUVTX1BFUl9TVUJCVUZGKQotCi0vKgogICogU2l6ZSBmYWN0b3IgZm9yIGlzb2Nocm9ub3VzIERCUiBidWZmZXIuCiAgKiBNaW5pbWFsIHZhbHVlIGlzIDMuCiAgKi8KQEAgLTYxLDEyICs0OSwxMSBAQAogI2RlZmluZSBEQlJfU0laRSAgKDE2ICogMTAyNCkgLyogc3BlY2lmaWVkIGJ5IElQICovCiAjZGVmaW5lIERCUl9CTE9DS19TSVpFICAoREJSX1NJWkUgLyAzMiAvIERCUl9NQVBfU0laRSkKIAorI2RlZmluZSBST1VORF9VUF9UTyh4LCBkKSAgKCgoeCkgKyAoZCkgLSAxKSAvIChkKSAqIChkKSkKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBhbmQgbWFjcm9zICovCiAKLSNkZWZpbmUgTUxCQzBfRkNOVF9WQUxfTUFDUk8obikgTUxCQzBfRkNOVF9WQUxfICMjIG4gIyMgRlBTQgotI2RlZmluZSBNTEJDMF9GQ05UX1ZBTChmcHNiKSBNTEJDMF9GQ05UX1ZBTF9NQUNSTyhmcHNiKQotCiBzdGF0aWMgaW5saW5lIHUzMiBiaXRfbWFzayh1OCBwb3NpdGlvbikKIHsKIAlyZXR1cm4gKHUzMikxIDw8IHBvc2l0aW9uOwpAQCAtODEsMTAgKzY4LDIwIEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogdHlwZXMgYW5kIGxvY2FsIHZhcmlhYmxlcyAqLwogCitzdHJ1Y3QgYXN5bmNfdHhfZGJyIHsKKwl1OCBjaF9hZGRyOworCXUxNiBycGM7CisJdTE2IHdwYzsKKwl1MTYgcmVzdF9zaXplOworCXUxNiBzel9xdWV1ZVtDRFQwX1JQQ19NQVNLICsgMV07Cit9OworCiBzdHJ1Y3QgbGxkX2dsb2JhbF92YXJzX3QgewogCWJvb2wgZGltX2lzX2luaXRpYWxpemVkOwogCWJvb2wgbWNtX2lzX2luaXRpYWxpemVkOwogCXN0cnVjdCBkaW0yX3JlZ3MgX19pb21lbSAqZGltMjsgLyogRElNMiBjb3JlIGJhc2UgYWRkcmVzcyAqLworCXN0cnVjdCBhc3luY190eF9kYnIgYXR4X2RicjsKKwl1MzIgZmNudDsKIAl1MzIgZGJyX21hcFtEQlJfTUFQX1NJWkVdOwogfTsKIApAQCAtMTQ5LDE1ICsxNDYsMzQgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHUzMiBkaW0yX3JlYWRfY3RyKHUzMiBjdHJfYWRkciwgdTE2IG1kYXRfaWR4KQorc3RhdGljIHZvaWQgZGltMl90cmFuc2Zlcl9tYWRyKHUzMiB2YWwpCiB7Ci0JZGltY2JfaW9fd3JpdGUoJmcuZGltMi0+TUFEUiwgY3RyX2FkZHIpOworCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPk1BRFIsIHZhbCk7CiAKLQkvKiB3YWl0IHRpbGwgdHJhbnNmZXIgaXMgY29tcGxldGVkICovCisJLyogd2FpdCBmb3IgdHJhbnNmZXIgY29tcGxldGlvbiAqLwogCXdoaWxlICgoZGltY2JfaW9fcmVhZCgmZy5kaW0yLT5NQ1RMKSAmIDEpICE9IDEpCiAJCWNvbnRpbnVlOwogCiAJZGltY2JfaW9fd3JpdGUoJmcuZGltMi0+TUNUTCwgMCk7ICAgLyogY2xlYXIgdHJhbnNmZXIgY29tcGxldGUgKi8KK30KKworc3RhdGljIHZvaWQgZGltMl9jbGVhcl9kYnIodTE2IGFkZHIsIHUxNiBzaXplKQoreworCWVudW0geyBNQURSX1RCX0JJVCA9IDMwLCBNQURSX1dOUl9CSVQgPSAzMSB9OworCisJdTE2IGNvbnN0IGVuZF9hZGRyID0gYWRkciArIHNpemU7CisJdTMyIGNvbnN0IGNtZCA9IGJpdF9tYXNrKE1BRFJfV05SX0JJVCkgfCBiaXRfbWFzayhNQURSX1RCX0JJVCk7CisKKwlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5NQ1RMLCAwKTsgICAvKiBjbGVhciB0cmFuc2ZlciBjb21wbGV0ZSAqLworCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPk1EQVQwLCAwKTsKKworCWZvciAoOyBhZGRyIDwgZW5kX2FkZHI7IGFkZHIrKykKKwkJZGltMl90cmFuc2Zlcl9tYWRyKGNtZCB8IGFkZHIpOworfQorCitzdGF0aWMgdTMyIGRpbTJfcmVhZF9jdHIodTMyIGN0cl9hZGRyLCB1MTYgbWRhdF9pZHgpCit7CisJZGltMl90cmFuc2Zlcl9tYWRyKGN0cl9hZGRyKTsKIAogCXJldHVybiBkaW1jYl9pb19yZWFkKCgmZy5kaW0yLT5NREFUMCkgKyBtZGF0X2lkeCk7CiB9CkBAIC0xODIsMTMgKzE5OCw3IEBACiAJZGltY2JfaW9fd3JpdGUoJmcuZGltMi0+TURXRTIsIG1hc2tbMl0pOwogCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPk1EV0UzLCBtYXNrWzNdKTsKIAotCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPk1BRFIsIGJpdF9tYXNrKE1BRFJfV05SX0JJVCkgfCBjdHJfYWRkcik7Ci0KLQkvKiB3YWl0IHRpbGwgdHJhbnNmZXIgaXMgY29tcGxldGVkICovCi0Jd2hpbGUgKChkaW1jYl9pb19yZWFkKCZnLmRpbTItPk1DVEwpICYgMSkgIT0gMSkKLQkJY29udGludWU7Ci0KLQlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5NQ1RMLCAwKTsgICAvKiBjbGVhciB0cmFuc2ZlciBjb21wbGV0ZSAqLworCWRpbTJfdHJhbnNmZXJfbWFkcihiaXRfbWFzayhNQURSX1dOUl9CSVQpIHwgY3RyX2FkZHIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGltMl93cml0ZV9jdHIodTMyIGN0cl9hZGRyLCBjb25zdCB1MzIgKnZhbHVlKQpAQCAtMjUyLDYgKzI2MiwxMyBAQAogCWRpbTJfd3JpdGVfY3RyKENEVCArIGNoX2FkZHIsIGNkdCk7CiB9CiAKK3N0YXRpYyB1MTYgZGltMl9ycGModTggY2hfYWRkcikKK3sKKwl1MzIgY2R0MCA9IGRpbTJfcmVhZF9jdHIoQ0RUICsgY2hfYWRkciwgMCk7CisKKwlyZXR1cm4gKGNkdDAgPj4gQ0RUMF9SUENfU0hJRlQpICYgQ0RUMF9SUENfTUFTSzsKK30KKwogc3RhdGljIHZvaWQgZGltMl9jbGVhcl9jZHQodTggY2hfYWRkcikKIHsKIAl1MzIgY2R0WzRdID0geyAwLCAwLCAwLCAwIH07CkBAIC0zNTYsNiArMzczLDUyIEBACiAKIAlkaW0yX2NsZWFyX2NhdChNTEJfQ0FULCBjaF9hZGRyKTsKIAlkaW0yX2NsZWFyX2NkdChjaF9hZGRyKTsKKworCS8qIGNsZWFyIGNoYW5uZWwgc3RhdHVzIGJpdCAqLworCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPkFDU1IwLCBiaXRfbWFzayhjaF9hZGRyKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB0cmFjZSBhc3luYyB0eCBkYnIgZmlsbCBzdGF0ZSAqLworCitzdGF0aWMgaW5saW5lIHUxNiBub3JtX3BjKHUxNiBwYykKK3sKKwlyZXR1cm4gcGMgJiBDRFQwX1JQQ19NQVNLOworfQorCitzdGF0aWMgdm9pZCBkYnJjbnRfaW5pdCh1OCBjaF9hZGRyLCB1MTYgZGJyX3NpemUpCit7CisJZy5hdHhfZGJyLnJlc3Rfc2l6ZSA9IGRicl9zaXplOworCWcuYXR4X2Rici5ycGMgPSBkaW0yX3JwYyhjaF9hZGRyKTsKKwlnLmF0eF9kYnIud3BjID0gZy5hdHhfZGJyLnJwYzsKK30KKworc3RhdGljIHZvaWQgZGJyY250X2VucShpbnQgYnVmX3N6KQoreworCWcuYXR4X2Rici5yZXN0X3NpemUgLT0gYnVmX3N6OworCWcuYXR4X2Rici5zel9xdWV1ZVtub3JtX3BjKGcuYXR4X2Rici53cGMpXSA9IGJ1Zl9zejsKKwlnLmF0eF9kYnIud3BjKys7Cit9CisKK3UxNiBkaW1fZGJyX3NwYWNlKHN0cnVjdCBkaW1fY2hhbm5lbCAqY2gpCit7CisJdTE2IGN1cl9ycGM7CisJc3RydWN0IGFzeW5jX3R4X2RiciAqZGJyID0gJmcuYXR4X2RicjsKKworCWlmIChjaC0+YWRkciAhPSBkYnItPmNoX2FkZHIpCisJCXJldHVybiAweEZGRkY7CisKKwljdXJfcnBjID0gZGltMl9ycGMoY2gtPmFkZHIpOworCisJd2hpbGUgKG5vcm1fcGMoZGJyLT5ycGMpICE9IGN1cl9ycGMpIHsKKwkJZGJyLT5yZXN0X3NpemUgKz0gZGJyLT5zel9xdWV1ZVtub3JtX3BjKGRici0+cnBjKV07CisJCWRici0+cnBjKys7CisJfQorCisJaWYgKCh1MTYpKGRici0+d3BjIC0gZGJyLT5ycGMpID49IENEVDBfUlBDX01BU0spCisJCXJldHVybiAwOworCisJcmV0dXJuIGRici0+cmVzdF9zaXplOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzk4LDcgKzQ2MSw4IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBjaGVja19ieXRlc19wZXJfZnJhbWUodTMyIGJ5dGVzX3Blcl9mcmFtZSkKIHsKLQl1MTYgY29uc3QgbWF4X3NpemUgPSAoKHUxNilDRFQzX0JEX01BU0sgKyAxdSkgLyBTWU5DX0RCUl9GQUNUT1I7CisJdTE2IGNvbnN0IGJkX2ZhY3RvciA9IGcuZmNudCArIDI7CisJdTE2IGNvbnN0IG1heF9zaXplID0gKCh1MTYpQ0RUM19CRF9NQVNLICsgMXUpID4+IGJkX2ZhY3RvcjsKIAogCWlmIChieXRlc19wZXJfZnJhbWUgPD0gMCkKIAkJcmV0dXJuIGZhbHNlOyAvKiB0b28gc21hbGwgKi8KQEAgLTQzOSw3ICs1MDMsNyBAQAogewogCXUxNiBuOwogCXUxNiBjb25zdCBtYXhfc2l6ZSA9ICh1MTYpQURUMV9JU09DX1NZTkNfQkRfTUFTSyArIDF1OwotCXUzMiBjb25zdCB1bml0ID0gYnl0ZXNfcGVyX2ZyYW1lICogKHUxNilGUkFNRVNfUEVSX1NVQkJVRkY7CisJdTMyIGNvbnN0IHVuaXQgPSBieXRlc19wZXJfZnJhbWUgPDwgZy5mY250OwogCiAJaWYgKGJ1Zl9zaXplID4gbWF4X3NpemUpCiAJCWJ1Zl9zaXplID0gbWF4X3NpemU7CkBAIC00NzksNyArNTQzLDcgQEAKIAlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5NTEJDMCwKIAkJICAgICAgIGVuYWJsZV82cGluIDw8IE1MQkMwX01MQlBFTl9CSVQgfAogCQkgICAgICAgbWxiX2Nsb2NrIDw8IE1MQkMwX01MQkNMS19TSElGVCB8Ci0JCSAgICAgICBNTEJDMF9GQ05UX1ZBTChGUkFNRVNfUEVSX1NVQkJVRkYpIDw8IE1MQkMwX0ZDTlRfU0hJRlQgfAorCQkgICAgICAgZy5mY250IDw8IE1MQkMwX0ZDTlRfU0hJRlQgfAogCQkgICAgICAgdHJ1ZSA8PCBNTEJDMF9NTEJFTl9CSVQpOwogCiAJLyogYWN0aXZhdGUgYWxsIEhCSSBjaGFubmVscyAqLwpAQCAtNTE1LDIwICs1NzksMTcgQEAKIHsKIAl1OCBjb25zdCBzaGlmdCA9IGlkeCAqIDE2OwogCXUzMiBjb25zdCBhZHQxID0gZGltMl9yZWFkX2N0cihBRFQgKyBjaF9hZGRyLCAxKTsKKwl1MzIgbWFza1s0XSA9IHsgMCwgMCwgMCwgMCB9OworCXUzMiBhZHRfd1s0XSA9IHsgMCwgMCwgMCwgMCB9OwogCiAJaWYgKCgoYWR0MSA+PiAoQURUMV9ETkVfQklUICsgc2hpZnQpKSAmIDEpID09IDApCiAJCXJldHVybiBmYWxzZTsKIAotCXsKLQkJdTMyIG1hc2tbNF0gPSB7IDAsIDAsIDAsIDAgfTsKLQkJdTMyIGFkdF93WzRdID0geyAwLCAwLCAwLCAwIH07Ci0KLQkJbWFza1sxXSA9Ci0JCQliaXRfbWFzayhBRFQxX0RORV9CSVQgKyBzaGlmdCkgfAotCQkJYml0X21hc2soQURUMV9FUlJfQklUICsgc2hpZnQpIHwKLQkJCWJpdF9tYXNrKEFEVDFfUkRZX0JJVCArIHNoaWZ0KTsKLQkJZGltMl93cml0ZV9jdHJfbWFzayhBRFQgKyBjaF9hZGRyLCBtYXNrLCBhZHRfdyk7Ci0JfQorCW1hc2tbMV0gPQorCQliaXRfbWFzayhBRFQxX0RORV9CSVQgKyBzaGlmdCkgfAorCQliaXRfbWFzayhBRFQxX0VSUl9CSVQgKyBzaGlmdCkgfAorCQliaXRfbWFzayhBRFQxX1JEWV9CSVQgKyBzaGlmdCk7CisJZGltMl93cml0ZV9jdHJfbWFzayhBRFQgKyBjaF9hZGRyLCBtYXNrLCBhZHRfdyk7CiAKIAkvKiBjbGVhciBjaGFubmVsIHN0YXR1cyBiaXQgKi8KIAlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5BQ1NSMCwgYml0X21hc2soY2hfYWRkcikpOwpAQCAtNjEyLDYgKzY3Myw5IEBACiAKIAkrK3N0YXRlLT5sZXZlbDsKIAorCWlmIChjaC0+YWRkciA9PSBnLmF0eF9kYnIuY2hfYWRkcikKKwkJZGJyY250X2VucShidWZfc2l6ZSk7CisKIAlpZiAoY2gtPnBhY2tldF9sZW5ndGggfHwgY2gtPmJ5dGVzX3Blcl9mcmFtZSkKIAkJZGltMl9zdGFydF9pc29jX3N5bmMoY2gtPmFkZHIsIHN0YXRlLT5pZHgxLCBidWZfYWRkciwgYnVmX3NpemUpOwogCWVsc2UKQEAgLTY1MCw3ICs3MTQsOCBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIEFQSSAqLwogCi11OCBkaW1fc3RhcnR1cChzdHJ1Y3QgZGltMl9yZWdzIF9faW9tZW0gKmRpbV9iYXNlX2FkZHJlc3MsIHUzMiBtbGJfY2xvY2spCit1OCBkaW1fc3RhcnR1cChzdHJ1Y3QgZGltMl9yZWdzIF9faW9tZW0gKmRpbV9iYXNlX2FkZHJlc3MsIHUzMiBtbGJfY2xvY2ssCisJICAgICAgIHUzMiBmY250KQogewogCWcuZGltX2lzX2luaXRpYWxpemVkID0gZmFsc2U7CiAKQEAgLTY2Miw3ICs3MjcsMTEgQEAKIAlpZiAobWxiX2Nsb2NrID49IDgpCiAJCXJldHVybiBESU1fSU5JVF9FUlJfTUxCX0NMT0NLOwogCisJaWYgKGZjbnQgPiBNTEJDMF9GQ05UX01BWF9WQUwpCisJCXJldHVybiBESU1fSU5JVF9FUlJfTUxCX0NMT0NLOworCiAJZy5kaW0yID0gZGltX2Jhc2VfYWRkcmVzczsKKwlnLmZjbnQgPSBmY250OwogCWcuZGJyX21hcFswXSA9IDA7CiAJZy5kYnJfbWFwWzFdID0gMDsKIApAQCAtNjkzLDcgKzc2Miw3IEBACiAJaWYgKCFjaGVja19jaGFubmVsX2FkZHJlc3MoY2hfYWRkcmVzcykpCiAJCXJldHVybiBESU1fSU5JVF9FUlJfQ0hBTk5FTF9BRERSRVNTOwogCi0JY2gtPmRicl9zaXplID0gaHdfYnVmZmVyX3NpemU7CisJY2gtPmRicl9zaXplID0gUk9VTkRfVVBfVE8oaHdfYnVmZmVyX3NpemUsIERCUl9CTE9DS19TSVpFKTsKIAljaC0+ZGJyX2FkZHIgPSBhbGxvY19kYnIoY2gtPmRicl9zaXplKTsKIAlpZiAoY2gtPmRicl9hZGRyID49IERCUl9TSVpFKQogCQlyZXR1cm4gRElNX0lOSVRfRVJSX09VVF9PRl9NRU1PUlk7CkBAIC03MDYsNiArNzc1LDEyIEBACiAJcmV0dXJuIERJTV9OT19FUlJPUjsKIH0KIAordm9pZCBkaW1fc2VydmljZV9tbGJfaW50X2lycSh2b2lkKQoreworCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPk1TMCwgMCk7CisJZGltY2JfaW9fd3JpdGUoJmcuZGltMi0+TVMxLCAwKTsKK30KKwogdTE2IGRpbV9ub3JtX2N0cmxfYXN5bmNfYnVmZmVyX3NpemUodTE2IGJ1Zl9zaXplKQogewogCXJldHVybiBub3JtX2N0cmxfYXN5bmNfYnVmZmVyX3NpemUoYnVmX3NpemUpOwpAQCAtNzQ5LDggKzgyNCwxNiBAQAogdTggZGltX2luaXRfYXN5bmMoc3RydWN0IGRpbV9jaGFubmVsICpjaCwgdTggaXNfdHgsIHUxNiBjaF9hZGRyZXNzLAogCQkgIHUxNiBtYXhfYnVmZmVyX3NpemUpCiB7Ci0JcmV0dXJuIGluaXRfY3RybF9hc3luYyhjaCwgQ0FUX0NUX1ZBTF9BU1lOQywgaXNfdHgsIGNoX2FkZHJlc3MsCi0JCQkgICAgICAgbWF4X2J1ZmZlcl9zaXplKTsKKwl1OCByZXQgPSBpbml0X2N0cmxfYXN5bmMoY2gsIENBVF9DVF9WQUxfQVNZTkMsIGlzX3R4LCBjaF9hZGRyZXNzLAorCQkJCSBtYXhfYnVmZmVyX3NpemUpOworCisJaWYgKGlzX3R4ICYmICFnLmF0eF9kYnIuY2hfYWRkcikgeworCQlnLmF0eF9kYnIuY2hfYWRkciA9IGNoLT5hZGRyOworCQlkYnJjbnRfaW5pdChjaC0+YWRkciwgY2gtPmRicl9zaXplKTsKKwkJZGltY2JfaW9fd3JpdGUoJmcuZGltMi0+TUlFTiwgYml0X21hc2soMjApKTsKKwl9CisKKwlyZXR1cm4gcmV0OwogfQogCiB1OCBkaW1faW5pdF9pc29jKHN0cnVjdCBkaW1fY2hhbm5lbCAqY2gsIHU4IGlzX3R4LCB1MTYgY2hfYWRkcmVzcywKQEAgLTc4MSw2ICs4NjQsOCBAQAogdTggZGltX2luaXRfc3luYyhzdHJ1Y3QgZGltX2NoYW5uZWwgKmNoLCB1OCBpc190eCwgdTE2IGNoX2FkZHJlc3MsCiAJCSB1MTYgYnl0ZXNfcGVyX2ZyYW1lKQogeworCXUxNiBiZF9mYWN0b3IgPSBnLmZjbnQgKyAyOworCiAJaWYgKCFnLmRpbV9pc19pbml0aWFsaXplZCB8fCAhY2gpCiAJCXJldHVybiBESU1fRVJSX0RSSVZFUl9OT1RfSU5JVElBTElaRUQ7CiAKQEAgLTc5MCwxMyArODc1LDE0IEBACiAJaWYgKCFjaGVja19ieXRlc19wZXJfZnJhbWUoYnl0ZXNfcGVyX2ZyYW1lKSkKIAkJcmV0dXJuIERJTV9FUlJfQkFEX0NPTkZJRzsKIAotCWNoLT5kYnJfc2l6ZSA9IGJ5dGVzX3Blcl9mcmFtZSAqIFNZTkNfREJSX0ZBQ1RPUjsKKwljaC0+ZGJyX3NpemUgPSBieXRlc19wZXJfZnJhbWUgPDwgYmRfZmFjdG9yOwogCWNoLT5kYnJfYWRkciA9IGFsbG9jX2RicihjaC0+ZGJyX3NpemUpOwogCWlmIChjaC0+ZGJyX2FkZHIgPj0gREJSX1NJWkUpCiAJCXJldHVybiBESU1fSU5JVF9FUlJfT1VUX09GX01FTU9SWTsKIAogCXN5bmNfaW5pdChjaCwgY2hfYWRkcmVzcyAvIDIsIGJ5dGVzX3Blcl9mcmFtZSk7CiAKKwlkaW0yX2NsZWFyX2RicihjaC0+ZGJyX2FkZHIsIGNoLT5kYnJfc2l6ZSk7CiAJZGltMl9jb25maWd1cmVfY2hhbm5lbChjaC0+YWRkciwgQ0FUX0NUX1ZBTF9TWU5DLCBpc190eCwKIAkJCSAgICAgICBjaC0+ZGJyX2FkZHIsIGNoLT5kYnJfc2l6ZSwgMCwgdHJ1ZSk7CiAKQEAgLTgwOCw2ICs4OTQsMTEgQEAKIAlpZiAoIWcuZGltX2lzX2luaXRpYWxpemVkIHx8ICFjaCkKIAkJcmV0dXJuIERJTV9FUlJfRFJJVkVSX05PVF9JTklUSUFMSVpFRDsKIAorCWlmIChjaC0+YWRkciA9PSBnLmF0eF9kYnIuY2hfYWRkcikgeworCQlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5NSUVOLCAwKTsKKwkJZy5hdHhfZGJyLmNoX2FkZHIgPSAwOworCX0KKwogCWRpbTJfY2xlYXJfY2hhbm5lbChjaC0+YWRkcik7CiAJaWYgKGNoLT5kYnJfYWRkciA8IERCUl9TSVpFKQogCQlmcmVlX2RicihjaC0+ZGJyX2FkZHIsIGNoLT5kYnJfc2l6ZSk7CkBAIC04MTYsNyArOTA3LDcgQEAKIAlyZXR1cm4gRElNX05PX0VSUk9SOwogfQogCi12b2lkIGRpbV9zZXJ2aWNlX2lycShzdHJ1Y3QgZGltX2NoYW5uZWwgKmNvbnN0ICpjaGFubmVscykKK3ZvaWQgZGltX3NlcnZpY2VfYWhiX2ludF9pcnEoc3RydWN0IGRpbV9jaGFubmVsICpjb25zdCAqY2hhbm5lbHMpCiB7CiAJYm9vbCBzdGF0ZV9jaGFuZ2VkOwogCkBAIC04NDgsMTAgKzkzOSw2IEBACiAJCQkrK2NoOwogCQl9CiAJfSB3aGlsZSAoc3RhdGVfY2hhbmdlZCk7Ci0KLQkvKiBjbGVhciBwZW5kaW5nIEludGVycnVwdHMgKi8KLQlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5NUzAsIDApOwotCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPk1TMSwgMCk7CiB9CiAKIHU4IGRpbV9zZXJ2aWNlX2NoYW5uZWwoc3RydWN0IGRpbV9jaGFubmVsICpjaCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfaGFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX2hhbC5oCmluZGV4IDFjOTI0ZTguLjZkZjZlYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfaGFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvaGRtLWRpbTIvZGltMl9oYWwuaApAQCAtNjAsNyArNjAsOCBAQAogCXUxNiBkb25lX3N3X2J1ZmZlcnNfbnVtYmVyOyAvKjwgRG9uZSBzb2Z0d2FyZSBidWZmZXJzIG51bWJlci4gKi8KIH07CiAKLXU4IGRpbV9zdGFydHVwKHN0cnVjdCBkaW0yX3JlZ3MgX19pb21lbSAqZGltX2Jhc2VfYWRkcmVzcywgdTMyIG1sYl9jbG9jayk7Cit1OCBkaW1fc3RhcnR1cChzdHJ1Y3QgZGltMl9yZWdzIF9faW9tZW0gKmRpbV9iYXNlX2FkZHJlc3MsIHUzMiBtbGJfY2xvY2ssCisJICAgICAgIHUzMiBmY250KTsKIAogdm9pZCBkaW1fc2h1dGRvd24odm9pZCk7CiAKQEAgLTg2LDEzICs4NywxNyBAQAogCiB1OCBkaW1fZGVzdHJveV9jaGFubmVsKHN0cnVjdCBkaW1fY2hhbm5lbCAqY2gpOwogCi12b2lkIGRpbV9zZXJ2aWNlX2lycShzdHJ1Y3QgZGltX2NoYW5uZWwgKmNvbnN0ICpjaGFubmVscyk7Cit2b2lkIGRpbV9zZXJ2aWNlX21sYl9pbnRfaXJxKHZvaWQpOworCit2b2lkIGRpbV9zZXJ2aWNlX2FoYl9pbnRfaXJxKHN0cnVjdCBkaW1fY2hhbm5lbCAqY29uc3QgKmNoYW5uZWxzKTsKIAogdTggZGltX3NlcnZpY2VfY2hhbm5lbChzdHJ1Y3QgZGltX2NoYW5uZWwgKmNoKTsKIAogc3RydWN0IGRpbV9jaF9zdGF0ZV90ICpkaW1fZ2V0X2NoYW5uZWxfc3RhdGUoc3RydWN0IGRpbV9jaGFubmVsICpjaCwKIAkJCQkJICAgICBzdHJ1Y3QgZGltX2NoX3N0YXRlX3QgKnN0YXRlX3B0cik7CiAKK3UxNiBkaW1fZGJyX3NwYWNlKHN0cnVjdCBkaW1fY2hhbm5lbCAqY2gpOworCiBib29sIGRpbV9lbnF1ZXVlX2J1ZmZlcihzdHJ1Y3QgZGltX2NoYW5uZWwgKmNoLCB1MzIgYnVmZmVyX2FkZHIsCiAJCQl1MTYgYnVmZmVyX3NpemUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX2hkbS5jIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvaGRtLWRpbTIvZGltMl9oZG0uYwppbmRleCBhMzY0NDk1Li43OGIyYzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX2hkbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfaGRtLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogZGltMl9oZG0uYyAtIE1lZGlhTEIgRElNMiBIYXJkd2FyZSBEZXBlbmRlbnQgTW9kdWxlCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDE1LCBNaWNyb2NoaXAgVGVjaG5vbG9neSBHZXJtYW55IElJIEdtYkggJiBDby4gS0cKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2LCBNaWNyb2NoaXAgVGVjaG5vbG9neSBHZXJtYW55IElJIEdtYkggJiBDby4gS0cKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCkBAIC00NSwxNSArNDUsMTUgQEAKIE1PRFVMRV9QQVJNX0RFU0MoY2xvY2tfc3BlZWQsICJNZWRpYUxCIENsb2NrIFNwZWVkIik7CiAKIC8qCi0gKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICogVGhlIHBhcmFtZXRlciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBmcmFtZXMgcGVyIHN1Yi1idWZmZXIgZm9yCisgKiBzeW5jaHJvbm91cyBjaGFubmVscy4gIFZhbGlkIHZhbHVlczogWzAgLi4gNl0uCiAgKgotICogVGhlIGRlZmluZSBiZWxvdyBhY3RpdmF0ZXMgYW4gdXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IEhBTC1zaW11Ci0gKiBmb3IgY2FsbGluZyBESU0gaW50ZXJydXB0IGhhbmRsZXIuCi0gKiBJdCBpcyB1c2VkIG9ubHkgZm9yIFRFU1QgUFVSUE9TRSBhbmQgc2hhbGwgYmUgY29tbWVudGVkIGJlZm9yZSByZWxlYXNlLgotICoKLSAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKiBUaGUgdmFsdWVzIDAsIDEsIDIsIDMsIDQsIDUsIDYgcmVwcmVzZW50IGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIGZyYW1lcyBwZXIKKyAqIHN1Yi1idWZmZXIgMSwgMiwgNCwgOCwgMTYsIDMyLCA2NC4KICAqLwotLyogI2RlZmluZSBFTkFCTEVfSERNX1RFU1QgKi8KK3N0YXRpYyB1OCBmY250ID0gNDsgIC8qICgxIDw8IGZjbnQpIGZyYW1lcyBwZXIgc3ViYnVmZmVyICovCittb2R1bGVfcGFyYW0oZmNudCwgYnl0ZSwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZjbnQsICJOdW0gb2YgZnJhbWVzIHBlciBzdWItYnVmZmVyIGZvciBzeW5jIGNoYW5uZWxzIGFzIGEgcG93ZXIgb2YgMiIpOwogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRpbV9sb2NrKTsKIApAQCAtODUsNyArODUsNiBAQAogICogQG1vc3RfaWZhY2U6IG1vc3QgaW50ZXJmYWNlIHN0cnVjdHVyZQogICogQGNhcGFiaWxpdGllczogYW4gYXJyYXkgb2YgY2hhbm5lbCBjYXBhYmlsaXR5IGRhdGEKICAqIEBpb19iYXNlOiBJL08gcmVnaXN0ZXIgYmFzZSBhZGRyZXNzCi0gKiBAaXJxX2FoYjA6IGRpbTIgQUhCMCBpcnEgbnVtYmVyCiAgKiBAY2xrX3NwZWVkOiB1c2VyIHNlbGVjdGFibGUgKHRocm91Z2ggY29tbWFuZCBsaW5lIHBhcmFtZXRlcikgY2xvY2sgc3BlZWQKICAqIEBuZXRpbmZvX3Rhc2s6IHRocmVhZCB0byBkZWxpdmVyIG5ldHdvcmsgc3RhdHVzCiAgKiBAbmV0aW5mb193YWl0cTogd2FpdHEgZm9yIHRoZSB0aHJlYWQgdG8gc2xlZXAKQEAgLTEwMCw3ICs5OSw2IEBACiAJc3RydWN0IG1vc3RfaW50ZXJmYWNlIG1vc3RfaWZhY2U7CiAJY2hhciBuYW1lWzE2ICsgc2l6ZW9mICJkaW0yLSJdOwogCXZvaWQgX19pb21lbSAqaW9fYmFzZTsKLQl1bnNpZ25lZCBpbnQgaXJxX2FoYjA7CiAJaW50IGNsa19zcGVlZDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ldGluZm9fdGFzazsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBuZXRpbmZvX3dhaXRxOwpAQCAtMTE4LDEwICsxMTYsNiBAQAogCSgoKHApWzFdID09IDB4MTgpICYmICgocClbMl0gPT0gMHgwNSkgJiYgKChwKVszXSA9PSAweDBDKSAmJiBcCiAJICgocClbMTNdID09IDB4M0MpICYmICgocClbMTRdID09IDB4MDApICYmICgocClbMTVdID09IDB4MEEpKQogCi0jaWYgZGVmaW5lZChFTkFCTEVfSERNX1RFU1QpCi1zdGF0aWMgc3RydWN0IGRpbTJfaGRtICp0ZXN0X2RldjsKLSNlbmRpZgotCiBib29sIGRpbTJfc3lzZnNfZ2V0X3N0YXRlX2NiKHZvaWQpCiB7CiAJYm9vbCBzdGF0ZTsKQEAgLTIxMiw3ICsyMDYsOCBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQloYWxfcmV0ID0gZGltX3N0YXJ0dXAoZGV2LT5pb19iYXNlLCBkZXYtPmNsa19zcGVlZCk7CisJcHJfaW5mbygic3luYzogbnVtIG9mIGZyYW1lcyBwZXIgc3ViLWJ1ZmZlcjogJXVcbiIsIGZjbnQpOworCWhhbF9yZXQgPSBkaW1fc3RhcnR1cChkZXYtPmlvX2Jhc2UsIGRldi0+Y2xrX3NwZWVkLCBmY250KTsKIAlpZiAoaGFsX3JldCAhPSBESU1fTk9fRVJST1IpIHsKIAkJcHJfZXJyKCJkaW1fc3RhcnR1cCBmYWlsZWQ6ICVkXG4iLCBoYWxfcmV0KTsKIAkJaWYgKHBkYXRhICYmIHBkYXRhLT5kZXN0cm95KQpAQCAtMjU0LDYgKzI0OSwxMSBAQAogCW1ibyA9IGxpc3RfZmlyc3RfZW50cnkoaGVhZCwgc3RydWN0IG1ibywgbGlzdCk7CiAJYnVmX3NpemUgPSBtYm8tPmJ1ZmZlcl9sZW5ndGg7CiAKKwlpZiAoZGltX2Ricl9zcGFjZSgmaGRtX2NoLT5jaCkgPCBidWZfc2l6ZSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaW1fbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKIAlCVUdfT04obWJvLT5idXNfYWRkcmVzcyA9PSAwKTsKIAlpZiAoIWRpbV9lbnF1ZXVlX2J1ZmZlcigmaGRtX2NoLT5jaCwgbWJvLT5idXNfYWRkcmVzcywgYnVmX3NpemUpKSB7CiAJCWxpc3RfZGVsKGhlYWQtPm5leHQpOwpAQCAtNDExLDYgKzQxMSwyMiBAQAogCXJldHVybiBidWZmZXI7CiB9CiAKK3N0YXRpYyBpcnFyZXR1cm5fdCBkaW0yX21sYl9pc3IoaW50IGlycSwgdm9pZCAqX2RldikKK3sKKwlzdHJ1Y3QgZGltMl9oZG0gKmRldiA9IF9kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkaW1fbG9jaywgZmxhZ3MpOworCWRpbV9zZXJ2aWNlX21sYl9pbnRfaXJxKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGltX2xvY2ssIGZsYWdzKTsKKworCWlmIChkZXYtPmF0eF9pZHggPj0gMCAmJiBkZXYtPmhjaFtkZXYtPmF0eF9pZHhdLmlzX2luaXRpYWxpemVkKQorCQl3aGlsZSAoIXRyeV9zdGFydF9kaW1fdHJhbnNmZXIoZGV2LT5oY2ggKyBkZXYtPmF0eF9pZHgpKQorCQkJY29udGludWU7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKIC8qKgogICogZGltMl90YXNrbGV0X2ZuIC0gdGFza2xldCBmdW5jdGlvbgogICogQGRhdGE6IHByaXZhdGUgZGF0YQpAQCAtNDUyLDMwICs0NjgsMTQgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRpbV9sb2NrLCBmbGFncyk7Ci0JZGltX3NlcnZpY2VfaXJxKGdldF9hY3RpdmVfY2hhbm5lbHMoZGV2LCBidWZmZXIpKTsKKwlkaW1fc2VydmljZV9haGJfaW50X2lycShnZXRfYWN0aXZlX2NoYW5uZWxzKGRldiwgYnVmZmVyKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGltX2xvY2ssIGZsYWdzKTsKIAotI2lmICFkZWZpbmVkKEVOQUJMRV9IRE1fVEVTVCkKIAlkaW0yX3Rhc2tsZXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKIAl0YXNrbGV0X3NjaGVkdWxlKCZkaW0yX3Rhc2tsZXQpOwotI2Vsc2UKLQlkaW0yX3Rhc2tsZXRfZm4oKHVuc2lnbmVkIGxvbmcpZGV2KTsKLSNlbmRpZgogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotI2lmIGRlZmluZWQoRU5BQkxFX0hETV9URVNUKQotCi0vKgotICogVXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IEhBTC1zaW11IGZvciBjYWxsaW5nIERJTSBpbnRlcnJ1cHQgaGFuZGxlci4KLSAqIEl0IGlzIHVzZWQgb25seSBmb3IgVEVTVCBQVVJQT1NFLgotICovCi12b2lkIHJhaXNlX2RpbV9pbnRlcnJ1cHQodm9pZCkKLXsKLQkodm9pZClkaW0yX2FoYl9pc3IoMCwgdGVzdF9kZXYpOwotfQotI2VuZGlmCi0KIC8qKgogICogY29tcGxldGVfYWxsX21ib3MgLSBjb21wbGV0ZSBNQk8ncyBpbiBhIGxpc3QKICAqIEBoZWFkOiBsaXN0IGhlYWQKQEAgLTU0NSw3ICs1NDUsNyBAQAogCQkJCWhkbV9jaC0+bmFtZSwgYnVmX3NpemUsIG5ld19zaXplKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRpbV9sb2NrLCBmbGFncyk7CiAJCWhhbF9yZXQgPSBkaW1faW5pdF9jb250cm9sKCZoZG1fY2gtPmNoLCBpc190eCwgY2hfYWRkciwKLQkJCQkJICAgYnVmX3NpemUpOworCQkJCQkgICBpc190eCA/IG5ld19zaXplICogMiA6IG5ld19zaXplKTsKIAkJYnJlYWs7CiAJY2FzZSBNT1NUX0NIX0FTWU5DOgogCQluZXdfc2l6ZSA9IGRpbV9ub3JtX2N0cmxfYXN5bmNfYnVmZmVyX3NpemUoYnVmX3NpemUpOwpAQCAtNTU4LDkgKzU1OCwxMCBAQAogCQkJcHJfd2FybigiJXM6IGZpeGVkIGJ1ZmZlciBzaXplICglZCAtPiAlZClcbiIsCiAJCQkJaGRtX2NoLT5uYW1lLCBidWZfc2l6ZSwgbmV3X3NpemUpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGltX2xvY2ssIGZsYWdzKTsKLQkJaGFsX3JldCA9IGRpbV9pbml0X2FzeW5jKCZoZG1fY2gtPmNoLCBpc190eCwgY2hfYWRkciwgYnVmX3NpemUpOworCQloYWxfcmV0ID0gZGltX2luaXRfYXN5bmMoJmhkbV9jaC0+Y2gsIGlzX3R4LCBjaF9hZGRyLAorCQkJCQkgaXNfdHggPyBuZXdfc2l6ZSAqIDIgOiBuZXdfc2l6ZSk7CiAJCWJyZWFrOwotCWNhc2UgTU9TVF9DSF9JU09DX0FWUDoKKwljYXNlIE1PU1RfQ0hfSVNPQzoKIAkJbmV3X3NpemUgPSBkaW1fbm9ybV9pc29jX2J1ZmZlcl9zaXplKGJ1Zl9zaXplLCBzdWJfc2l6ZSk7CiAJCWlmIChuZXdfc2l6ZSA9PSAwKSB7CiAJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHN1Yi1idWZmZXIgc2l6ZSBvciB0b28gc21hbGwgYnVmZmVyIHNpemVcbiIsCkBAIC03MDUsMTIgKzcwNiwxNCBAQAogCWlmICghaGRtX2NoLT5pc19pbml0aWFsaXplZCkKIAkJcmV0dXJuIC1FUEVSTTsKIAorCXRhc2tsZXRfZGlzYWJsZSgmZGltMl90YXNrbGV0KTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGltX2xvY2ssIGZsYWdzKTsKIAloYWxfcmV0ID0gZGltX2Rlc3Ryb3lfY2hhbm5lbCgmaGRtX2NoLT5jaCk7CiAJaGRtX2NoLT5pc19pbml0aWFsaXplZCA9IGZhbHNlOwogCWlmIChjaF9pZHggPT0gZGV2LT5hdHhfaWR4KQogCQlkZXYtPmF0eF9pZHggPSAtMTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaW1fbG9jaywgZmxhZ3MpOworCXRhc2tsZXRfZW5hYmxlKCZkaW0yX3Rhc2tsZXQpOwogCWlmIChoYWxfcmV0ICE9IERJTV9OT19FUlJPUikgewogCQlwcl9lcnIoIkhBTCBGYWlsZWQgdG8gY2xvc2UgY2hhbm5lbCAlc1xuIiwgaGRtX2NoLT5uYW1lKTsKIAkJcmV0ID0gLUVGQVVMVDsKQEAgLTczNSw2ICs3MzgsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCByZXQsIGk7CiAJc3RydWN0IGtvYmplY3QgKmtvYmo7CisJaW50IGlycTsKIAogCWRldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwogCWlmICghZGV2KQpAQCAtNzQzLDI5ICs3NDcsMzcgQEAKIAlkZXYtPmF0eF9pZHggPSAtMTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldik7Ci0jaWYgZGVmaW5lZChFTkFCTEVfSERNX1RFU1QpCi0JdGVzdF9kZXYgPSBkZXY7Ci0jZWxzZQogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJZGV2LT5pb19iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CiAJaWYgKElTX0VSUihkZXYtPmlvX2Jhc2UpKQogCQlyZXR1cm4gUFRSX0VSUihkZXYtPmlvX2Jhc2UpOwogCi0JcmV0ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGlycVxuIik7CisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGFoYjBfaW50IGlycVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlkZXYtPmlycV9haGIwID0gcmV0OwogCi0JcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBkZXYtPmlycV9haGIwLCBkaW0yX2FoYl9pc3IsIDAsCi0JCQkgICAgICAgIm1sYl9haGIwIiwgZGV2KTsKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgZGltMl9haGJfaXNyLCAwLAorCQkJICAgICAgICJkaW0yX2FoYjBfaW50IiwgZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IElSUTogJWQsIGVycjogJWRcbiIsCi0JCQlkZXYtPmlycV9haGIwLCByZXQpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBhaGIwX2ludCBpcnEgJWRcbiIsIGlycSk7CiAJCXJldHVybiByZXQ7CiAJfQotI2VuZGlmCisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgbWxiX2ludCBpcnFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgZGltMl9tbGJfaXNyLCAwLAorCQkJICAgICAgICJkaW0yX21sYl9pbnQiLCBkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgbWxiX2ludCBpcnEgJWRcbiIsIGlycSk7CisJCXJldHVybiByZXQ7CisJfQorCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT5uZXRpbmZvX3dhaXRxKTsKIAlkZXYtPmRlbGl2ZXJfbmV0aW5mbyA9IDA7CiAJZGV2LT5uZXRpbmZvX3Rhc2sgPSBrdGhyZWFkX3J1bigmZGVsaXZlcl9uZXRpbmZvX3RocmVhZCwgKHZvaWQgKilkZXYsCkBAIC03ODUsNyArNzk3LDcgQEAKIAkJY2FwLT5uYW1lX3N1ZmZpeCA9IGhkbV9jaC0+bmFtZTsKIAkJY2FwLT5kaXJlY3Rpb24gPSBNT1NUX0NIX1JYIHwgTU9TVF9DSF9UWDsKIAkJY2FwLT5kYXRhX3R5cGUgPSBNT1NUX0NIX0NPTlRST0wgfCBNT1NUX0NIX0FTWU5DIHwKLQkJCQkgTU9TVF9DSF9JU09DX0FWUCB8IE1PU1RfQ0hfU1lOQzsKKwkJCQkgTU9TVF9DSF9JU09DIHwgTU9TVF9DSF9TWU5DOwogCQljYXAtPm51bV9idWZmZXJzX3BhY2tldCA9IE1BWF9CVUZGRVJTX1BBQ0tFVDsKIAkJY2FwLT5idWZmZXJfc2l6ZV9wYWNrZXQgPSBNQVhfQlVGX1NJWkVfUEFDS0VUOwogCQljYXAtPm51bV9idWZmZXJzX3N0cmVhbWluZyA9IE1BWF9CVUZGRVJTX1NUUkVBTUlORzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX3JlZy5oCmluZGV4IGUwODM3YjYuLjAxZmU0OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfcmVnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvaGRtLWRpbTIvZGltMl9yZWcuaApAQCAtNzcsMTMgKzc3LDcgQEAKIAogCU1MQkMwX0ZDTlRfU0hJRlQgPSAxNSwKIAlNTEJDMF9GQ05UX01BU0sgPSA3LAotCU1MQkMwX0ZDTlRfVkFMXzFGUFNCID0gMCwKLQlNTEJDMF9GQ05UX1ZBTF8yRlBTQiA9IDEsCi0JTUxCQzBfRkNOVF9WQUxfNEZQU0IgPSAyLAotCU1MQkMwX0ZDTlRfVkFMXzhGUFNCID0gMywKLQlNTEJDMF9GQ05UX1ZBTF8xNkZQU0IgPSA0LAotCU1MQkMwX0ZDTlRfVkFMXzMyRlBTQiA9IDUsCi0JTUxCQzBfRkNOVF9WQUxfNjRGUFNCID0gNiwKKwlNTEJDMF9GQ05UX01BWF9WQUwgPSA2LAogCiAJTUxCQzBfTUxCRU5fQklUID0gMCwKIApAQCAtMTIzLDYgKzExNyw5IEBACiB9OwogCiBlbnVtIHsKKwlDRFQwX1JQQ19TSElGVCA9IDE2ICsgMTEsCisJQ0RUMF9SUENfTUFTSyA9IERJTTJfTUFTSyg1KSwKKwogCUNEVDFfQlNfSVNPQ19TSElGVCA9IDAsCiAJQ0RUMV9CU19JU09DX01BU0sgPSBESU0yX01BU0soOSksCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfc3lzZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfc3lzZnMuYwppbmRleCAyYjI4ZTRhLi5kOGIyMmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvaGRtLWRpbTIvZGltMl9zeXNmcy5jCkBAIC0zOSw3ICszOSw3IEBACiAJTlVMTCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGJ1c19hdHRyX2dyb3VwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYnVzX2F0dHJfZ3JvdXAgPSB7CiAJLmF0dHJzID0gYnVzX2RlZmF1bHRfYXR0cnMsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tdXNiL2hkbV91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS11c2IvaGRtX3VzYi5jCmluZGV4IGFlYWUwNzEuLjI2YzlhZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS11c2IvaGRtX3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS11c2IvaGRtX3VzYi5jCkBAIC00Myw4ICs0Myw5IEBACiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9TTVNDCTB4MDQyNCAgLyogVklEOiBTTVNDICovCiAjZGVmaW5lIFVTQl9ERVZfSURfQlJERwkJMHhDMDAxICAvKiBQSUQ6IFVTQiBCcmlkZ2UgKi8KLSNkZWZpbmUgVVNCX0RFVl9JRF9JTklDCQkweENGMTggIC8qIFBJRDogVVNCIElOSUMgKi8KLSNkZWZpbmUgSFdfUkVTWU5DCQkweDAwMDAKKyNkZWZpbmUgVVNCX0RFVl9JRF9PUzgxMTE4CTB4Q0YxOCAgLyogUElEOiBVU0IgT1M4MTExOCAqLworI2RlZmluZSBVU0JfREVWX0lEX09TODExMTkJMHhDRjE5ICAvKiBQSUQ6IFVTQiBPUzgxMTE5ICovCisjZGVmaW5lIFVTQl9ERVZfSURfT1M4MTIxMAkweENGMzAgIC8qIFBJRDogVVNCIE9TODEyMTAgKi8KIC8qIERSQ0kgQWRkcmVzc2VzICovCiAjZGVmaW5lIERSQ0lfUkVHX05JX1NUQVRFCTB4MDEwMAogI2RlZmluZSBEUkNJX1JFR19QQUNLRVRfQlcJMHgwMTAxCkBAIC02NCwzMyArNjUsMzAgQEAKICNkZWZpbmUgRFJDSV9XUklURV9SRVEJCTB4QTEKIAogLyoqCi0gKiBzdHJ1Y3QgYnVmX2FuY2hvciAtIHVzZWQgdG8gY3JlYXRlIGEgbGlzdCBvZiBwZW5kaW5nIFVSQnMKLSAqIEB1cmI6IHBvaW50ZXIgdG8gVVNCIHJlcXVlc3QgYmxvY2sKLSAqIEBjbGVhcl93b3JrX29iajoKLSAqIEBsaXN0OiBsaW5rZWQgbGlzdAotICogQHVyYl9jb21wbGV0aW9uOgotICovCi1zdHJ1Y3QgYnVmX2FuY2hvciB7Ci0Jc3RydWN0IHVyYiAqdXJiOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBjbGVhcl93b3JrX29iajsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IGNvbXBsZXRpb24gdXJiX2NvbXBsOwotfTsKLQotI2RlZmluZSB0b19idWZfYW5jaG9yKHcpIGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYnVmX2FuY2hvciwgY2xlYXJfd29ya19vYmopCi0KLS8qKgogICogc3RydWN0IG1vc3RfZGNpX29iaiAtIERpcmVjdCBDb21tdW5pY2F0aW9uIEludGVyZmFjZQogICogQGtvYmo6cG9zaXRpb24gaW4gc3lzZnMKICAqIEB1c2JfZGV2aWNlOiBwb2ludGVyIHRvIHRoZSB1c2IgZGV2aWNlCisgKiBAcmVnX2FkZHI6IHJlZ2lzdGVyIGFkZHJlc3MgZm9yIGFyYml0cmFyeSBEQ0kgYWNjZXNzCiAgKi8KIHN0cnVjdCBtb3N0X2RjaV9vYmogewogCXN0cnVjdCBrb2JqZWN0IGtvYmo7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXZpY2U7CisJdTE2IHJlZ19hZGRyOwogfTsKIAogI2RlZmluZSB0b19kY2lfb2JqKHApIGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QgbW9zdF9kY2lfb2JqLCBrb2JqKQogCitzdHJ1Y3QgbW9zdF9kZXY7CisKK3N0cnVjdCBjbGVhcl9ob2xkX3dvcmsgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3czsKKwlzdHJ1Y3QgbW9zdF9kZXYgKm1kZXY7CisJdW5zaWduZWQgaW50IGNoYW5uZWw7CisJaW50IHBpcGU7Cit9OworCisjZGVmaW5lIHRvX2NsZWFyX2hvbGRfd29yayh3KSBjb250YWluZXJfb2Yodywgc3RydWN0IGNsZWFyX2hvbGRfd29yaywgd3MpCisKIC8qKgogICogc3RydWN0IG1vc3RfZGV2IC0gaG9sZHMgYWxsIHVzYiBpbnRlcmZhY2Ugc3BlY2lmaWMgc3R1ZmYKICAqIEBwYXJlbnQ6IHBhcmVudCBvYmplY3QgaW4gc3lzZnMKQEAgLTEwNCwxMCArMTAyLDEwIEBACiAgKiBAbGlua19zdGF0OiBsaW5rIHN0YXR1cyBvZiBoYXJkd2FyZQogICogQGRlc2NyaXB0aW9uOiBkZXZpY2UgZGVzY3JpcHRpb24KICAqIEBzdWZmaXg6IHN1ZmZpeCBmb3IgY2hhbm5lbCBuYW1lCi0gKiBAYW5jaG9yX2xpc3RfbG9jazogbG9ja3MgbGlzdCBhY2Nlc3MKKyAqIEBjaGFubmVsX2xvY2s6IHN5bmNocm9uaXplIGNoYW5uZWwgYWNjZXNzCiAgKiBAcGFkZGluZ19hY3RpdmU6IGluZGljYXRlcyBjaGFubmVsIHVzZXMgcGFkZGluZwogICogQGlzX2NoYW5uZWxfaGVhbHRoeTogaGVhbHRoIHN0YXR1cyB0YWJsZSBvZiBlYWNoIGNoYW5uZWwKLSAqIEBhbmNob3JfbGlzdDogbGlzdCBvZiBhbmNob3JlZCBpdGVtcworICogQGJ1c3lfdXJiczogbGlzdCBvZiBhbmNob3JlZCBpdGVtcwogICogQGlvX211dGV4OiBzeW5jaHJvbml6ZSBJL08gd2l0aCBkaXNjb25uZWN0CiAgKiBAbGlua19zdGF0X3RpbWVyOiB0aW1lciBmb3IgbGluayBzdGF0dXMgcmVwb3J0cwogICogQHBvbGxfd29ya19vYmo6IHdvcmsgZm9yIHBvbGxpbmcgbGluayBzdGF0dXMKQEAgLTEyNCwxMCArMTIyLDExIEBACiAJdTE2IGxpbmtfc3RhdDsKIAljaGFyIGRlc2NyaXB0aW9uW01BWF9TVFJJTkdfTEVOXTsKIAljaGFyIHN1ZmZpeFtNQVhfTlVNX0VORFBPSU5UU11bTUFYX1NVRkZJWF9MRU5dOwotCXNwaW5sb2NrX3QgYW5jaG9yX2xpc3RfbG9ja1tNQVhfTlVNX0VORFBPSU5UU107CisJc3BpbmxvY2tfdCBjaGFubmVsX2xvY2tbTUFYX05VTV9FTkRQT0lOVFNdOyAvKiBzeW5jIGNoYW5uZWwgYWNjZXNzICovCiAJYm9vbCBwYWRkaW5nX2FjdGl2ZVtNQVhfTlVNX0VORFBPSU5UU107CiAJYm9vbCBpc19jaGFubmVsX2hlYWx0aHlbTUFYX05VTV9FTkRQT0lOVFNdOwotCXN0cnVjdCBsaXN0X2hlYWQgKmFuY2hvcl9saXN0OworCXN0cnVjdCBjbGVhcl9ob2xkX3dvcmsgY2xlYXJfd29ya1tNQVhfTlVNX0VORFBPSU5UU107CisJc3RydWN0IHVzYl9hbmNob3IgKmJ1c3lfdXJiczsKIAlzdHJ1Y3QgbXV0ZXggaW9fbXV0ZXg7CiAJc3RydWN0IHRpbWVyX2xpc3QgbGlua19zdGF0X3RpbWVyOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBwb2xsX3dvcmtfb2JqOwpAQCAtMTkxLDQwICsxOTAsMjQgQEAKICAqIGZyZWVfYW5jaG9yZWRfYnVmZmVycyAtIGZyZWUgZGV2aWNlJ3MgYW5jaG9yZWQgaXRlbXMKICAqIEBtZGV2OiB0aGUgZGV2aWNlCiAgKiBAY2hhbm5lbDogY2hhbm5lbCBJRAorICogQHN0YXR1czogc3RhdHVzIG9mIE1CTyB0ZXJtaW5hdGlvbgogICovCi1zdGF0aWMgdm9pZCBmcmVlX2FuY2hvcmVkX2J1ZmZlcnMoc3RydWN0IG1vc3RfZGV2ICptZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3N0YXRpYyB2b2lkIGZyZWVfYW5jaG9yZWRfYnVmZmVycyhzdHJ1Y3QgbW9zdF9kZXYgKm1kZXYsIHVuc2lnbmVkIGludCBjaGFubmVsLAorCQkJCSAgZW51bSBtYm9fc3RhdHVzX2ZsYWdzIHN0YXR1cykKIHsKIAlzdHJ1Y3QgbWJvICptYm87Ci0Jc3RydWN0IGJ1Zl9hbmNob3IgKmFuY2hvciwgKnRtcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB1cmIgKnVyYjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT5hbmNob3JfbGlzdF9sb2NrW2NoYW5uZWxdLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFuY2hvciwgdG1wLCAmbWRldi0+YW5jaG9yX2xpc3RbY2hhbm5lbF0sCi0JCQkJIGxpc3QpIHsKLQkJc3RydWN0IHVyYiAqdXJiID0gYW5jaG9yLT51cmI7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+YW5jaG9yX2xpc3RfbG9ja1tjaGFubmVsXSwgZmxhZ3MpOwotCQlpZiAobGlrZWx5KHVyYikpIHsKLQkJCW1ibyA9IHVyYi0+Y29udGV4dDsKLQkJCWlmICghaXJxc19kaXNhYmxlZCgpKSB7Ci0JCQkJdXNiX2tpbGxfdXJiKHVyYik7Ci0JCQl9IGVsc2UgewotCQkJCXVzYl91bmxpbmtfdXJiKHVyYik7Ci0JCQkJd2FpdF9mb3JfY29tcGxldGlvbigmYW5jaG9yLT51cmJfY29tcGwpOwotCQkJfQotCQkJaWYgKChtYm8pICYmIChtYm8tPmNvbXBsZXRlKSkgewotCQkJCW1iby0+c3RhdHVzID0gTUJPX0VfQ0xPU0U7Ci0JCQkJbWJvLT5wcm9jZXNzZWRfbGVuZ3RoID0gMDsKLQkJCQltYm8tPmNvbXBsZXRlKG1ibyk7Ci0JCQl9Ci0JCQl1c2JfZnJlZV91cmIodXJiKTsKKwl3aGlsZSAoKHVyYiA9IHVzYl9nZXRfZnJvbV9hbmNob3IoJm1kZXYtPmJ1c3lfdXJic1tjaGFubmVsXSkpKSB7CisJCW1ibyA9IHVyYi0+Y29udGV4dDsKKwkJdXNiX2tpbGxfdXJiKHVyYik7CisJCWlmIChtYm8gJiYgbWJvLT5jb21wbGV0ZSkgeworCQkJbWJvLT5zdGF0dXMgPSBzdGF0dXM7CisJCQltYm8tPnByb2Nlc3NlZF9sZW5ndGggPSAwOworCQkJbWJvLT5jb21wbGV0ZShtYm8pOwogCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT5hbmNob3JfbGlzdF9sb2NrW2NoYW5uZWxdLCBmbGFncyk7Ci0JCWxpc3RfZGVsKCZhbmNob3ItPmxpc3QpOwotCQljYW5jZWxfd29ya19zeW5jKCZhbmNob3ItPmNsZWFyX3dvcmtfb2JqKTsKLQkJa2ZyZWUoYW5jaG9yKTsKKwkJdXNiX2ZyZWVfdXJiKHVyYik7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmFuY2hvcl9saXN0X2xvY2tbY2hhbm5lbF0sIGZsYWdzKTsKIH0KIAogLyoqCkBAIC0yNDEsNyArMjI0LDcgQEAKIAkJcmV0dXJuIGZyYW1lX3NpemU7CiAJfQogCXN3aXRjaCAoY2ZnLT5kYXRhX3R5cGUpIHsKLQljYXNlIE1PU1RfQ0hfSVNPQ19BVlA6CisJY2FzZSBNT1NUX0NIX0lTT0M6CiAJCWZyYW1lX3NpemUgPSBBVl9QQUNLRVRTX1BFUl9YQUNUICogc3ViX3NpemU7CiAJCWJyZWFrOwogCWNhc2UgTU9TVF9DSF9TWU5DOgpAQCAtMjc0LDIyICsyNTcsMjggQEAKICAqLwogc3RhdGljIGludCBoZG1fcG9pc29uX2NoYW5uZWwoc3RydWN0IG1vc3RfaW50ZXJmYWNlICppZmFjZSwgaW50IGNoYW5uZWwpCiB7Ci0Jc3RydWN0IG1vc3RfZGV2ICptZGV2OworCXN0cnVjdCBtb3N0X2RldiAqbWRldiA9IHRvX21kZXYoaWZhY2UpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3BpbmxvY2tfdCAqbG9jazsgLyogdGVtcC4gbG9jayAqLwogCi0JbWRldiA9IHRvX21kZXYoaWZhY2UpOwogCWlmICh1bmxpa2VseSghaWZhY2UpKSB7CiAJCWRldl93YXJuKCZtZGV2LT51c2JfZGV2aWNlLT5kZXYsICJQb2lzb246IEJhZCBpbnRlcmZhY2UuXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQotCWlmICh1bmxpa2VseSgoY2hhbm5lbCA8IDApIHx8IChjaGFubmVsID49IGlmYWNlLT5udW1fY2hhbm5lbHMpKSkgeworCWlmICh1bmxpa2VseShjaGFubmVsIDwgMCB8fCBjaGFubmVsID49IGlmYWNlLT5udW1fY2hhbm5lbHMpKSB7CiAJCWRldl93YXJuKCZtZGV2LT51c2JfZGV2aWNlLT5kZXYsICJDaGFubmVsIElEIG91dCBvZiByYW5nZS5cbiIpOwogCQlyZXR1cm4gLUVDSFJORzsKIAl9CiAKKwlsb2NrID0gbWRldi0+Y2hhbm5lbF9sb2NrICsgY2hhbm5lbDsKKwlzcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncyk7CiAJbWRldi0+aXNfY2hhbm5lbF9oZWFsdGh5W2NoYW5uZWxdID0gZmFsc2U7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7CisKKwljYW5jZWxfd29ya19zeW5jKCZtZGV2LT5jbGVhcl93b3JrW2NoYW5uZWxdLndzKTsKIAogCW11dGV4X2xvY2soJm1kZXYtPmlvX211dGV4KTsKLQlmcmVlX2FuY2hvcmVkX2J1ZmZlcnMobWRldiwgY2hhbm5lbCk7CisJZnJlZV9hbmNob3JlZF9idWZmZXJzKG1kZXYsIGNoYW5uZWwsIE1CT19FX0NMT1NFKTsKIAlpZiAobWRldi0+cGFkZGluZ19hY3RpdmVbY2hhbm5lbF0pCiAJCW1kZXYtPnBhZGRpbmdfYWN0aXZlW2NoYW5uZWxdID0gZmFsc2U7CiAKQEAgLTMxMywxMCArMzAyLDEwIEBACiBzdGF0aWMgaW50IGhkbV9hZGRfcGFkZGluZyhzdHJ1Y3QgbW9zdF9kZXYgKm1kZXYsIGludCBjaGFubmVsLCBzdHJ1Y3QgbWJvICptYm8pCiB7CiAJc3RydWN0IG1vc3RfY2hhbm5lbF9jb25maWcgKmNvbmYgPSAmbWRldi0+Y29uZltjaGFubmVsXTsKLQl1bnNpZ25lZCBpbnQgaiwgbnVtX2ZyYW1lcywgZnJhbWVfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZSA9IGdldF9zdHJlYW1fZnJhbWVfc2l6ZShjb25mKTsKKwl1bnNpZ25lZCBpbnQgaiwgbnVtX2ZyYW1lczsKIAl1MTYgcmRfYWRkciwgd3JfYWRkcjsKIAotCWZyYW1lX3NpemUgPSBnZXRfc3RyZWFtX2ZyYW1lX3NpemUoY29uZik7CiAJaWYgKCFmcmFtZV9zaXplKQogCQlyZXR1cm4gLUVJTzsKIAludW1fZnJhbWVzID0gbWJvLT5idWZmZXJfbGVuZ3RoIC8gZnJhbWVfc2l6ZTsKQEAgLTM1MCwxMCArMzM5LDEwIEBACiBzdGF0aWMgaW50IGhkbV9yZW1vdmVfcGFkZGluZyhzdHJ1Y3QgbW9zdF9kZXYgKm1kZXYsIGludCBjaGFubmVsLAogCQkJICAgICAgc3RydWN0IG1ibyAqbWJvKQogewotCXVuc2lnbmVkIGludCBqLCBudW1fZnJhbWVzLCBmcmFtZV9zaXplOwogCXN0cnVjdCBtb3N0X2NoYW5uZWxfY29uZmlnICpjb25zdCBjb25mID0gJm1kZXYtPmNvbmZbY2hhbm5lbF07CisJdW5zaWduZWQgaW50IGZyYW1lX3NpemUgPSBnZXRfc3RyZWFtX2ZyYW1lX3NpemUoY29uZik7CisJdW5zaWduZWQgaW50IGosIG51bV9mcmFtZXM7CiAKLQlmcmFtZV9zaXplID0gZ2V0X3N0cmVhbV9mcmFtZV9zaXplKGNvbmYpOwogCWlmICghZnJhbWVfc2l6ZSkKIAkJcmV0dXJuIC1FSU87CiAJbnVtX2ZyYW1lcyA9IG1iby0+cHJvY2Vzc2VkX2xlbmd0aCAvIFVTQl9NVFU7CkBAIC0zODAsMzcgKzM2OSwyOSBAQAogICovCiBzdGF0aWMgdm9pZCBoZG1fd3JpdGVfY29tcGxldGlvbihzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IG1ibyAqbWJvOwotCXN0cnVjdCBidWZfYW5jaG9yICphbmNob3I7Ci0Jc3RydWN0IG1vc3RfZGV2ICptZGV2OwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQl1bnNpZ25lZCBpbnQgY2hhbm5lbDsKKwlzdHJ1Y3QgbWJvICptYm8gPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IG1vc3RfZGV2ICptZGV2ID0gdG9fbWRldihtYm8tPmlmcCk7CisJdW5zaWduZWQgaW50IGNoYW5uZWwgPSBtYm8tPmhkbV9jaGFubmVsX2lkOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZtZGV2LT51c2JfZGV2aWNlLT5kZXY7CisJc3BpbmxvY2tfdCAqbG9jayA9IG1kZXYtPmNoYW5uZWxfbG9jayArIGNoYW5uZWw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCW1ibyA9IHVyYi0+Y29udGV4dDsKLQlhbmNob3IgPSBtYm8tPnByaXY7Ci0JbWRldiA9IHRvX21kZXYobWJvLT5pZnApOwotCWNoYW5uZWwgPSBtYm8tPmhkbV9jaGFubmVsX2lkOwotCWRldiA9ICZtZGV2LT51c2JfZGV2aWNlLT5kZXY7Ci0KLQlpZiAoKHVyYi0+c3RhdHVzID09IC1FTk9FTlQpIHx8ICh1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCkgfHwKLQkgICAgKCFtZGV2LT5pc19jaGFubmVsX2hlYWx0aHlbY2hhbm5lbF0pKSB7Ci0JCWNvbXBsZXRlKCZhbmNob3ItPnVyYl9jb21wbCk7CisJc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpOworCWlmICh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8IHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUIHx8CisJICAgICFtZGV2LT5pc19jaGFubmVsX2hlYWx0aHlbY2hhbm5lbF0pIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAodW5saWtlbHkodXJiLT5zdGF0dXMgJiYgISh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8Ci0JCQkJICAgICAgdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQgfHwKLQkJCQkgICAgICB1cmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKSkpIHsKKwlpZiAodW5saWtlbHkodXJiLT5zdGF0dXMgJiYgdXJiLT5zdGF0dXMgIT0gLUVTSFVURE9XTikpIHsKIAkJbWJvLT5wcm9jZXNzZWRfbGVuZ3RoID0gMDsKIAkJc3dpdGNoICh1cmItPnN0YXR1cykgewogCQljYXNlIC1FUElQRToKIAkJCWRldl93YXJuKGRldiwgIkJyb2tlbiBPVVQgcGlwZSBkZXRlY3RlZFxuIik7Ci0JCQltb3N0X3N0b3BfZW5xdWV1ZSgmbWRldi0+aWZhY2UsIGNoYW5uZWwpOwotCQkJbWJvLT5zdGF0dXMgPSBNQk9fRV9JTlZBTDsKLQkJCXVzYl91bmxpbmtfdXJiKHVyYik7Ci0JCQlJTklUX1dPUksoJmFuY2hvci0+Y2xlYXJfd29ya19vYmosIHdxX2NsZWFyX2hhbHQpOwotCQkJc2NoZWR1bGVfd29yaygmYW5jaG9yLT5jbGVhcl93b3JrX29iaik7CisJCQltZGV2LT5pc19jaGFubmVsX2hlYWx0aHlbY2hhbm5lbF0gPSBmYWxzZTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpOworCQkJbWRldi0+Y2xlYXJfd29ya1tjaGFubmVsXS5waXBlID0gdXJiLT5waXBlOworCQkJc2NoZWR1bGVfd29yaygmbWRldi0+Y2xlYXJfd29ya1tjaGFubmVsXS53cyk7CiAJCQlyZXR1cm47CiAJCWNhc2UgLUVOT0RFVjoKIAkJY2FzZSAtRVBST1RPOgpAQCAtNDI1LDEwICs0MDYsNyBAQAogCQltYm8tPnByb2Nlc3NlZF9sZW5ndGggPSB1cmItPmFjdHVhbF9sZW5ndGg7CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmFuY2hvcl9saXN0X2xvY2tbY2hhbm5lbF0sIGZsYWdzKTsKLQlsaXN0X2RlbCgmYW5jaG9yLT5saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT5hbmNob3JfbGlzdF9sb2NrW2NoYW5uZWxdLCBmbGFncyk7Ci0Ja2ZyZWUoYW5jaG9yKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKTsKIAogCWlmIChsaWtlbHkobWJvLT5jb21wbGV0ZSkpCiAJCW1iby0+Y29tcGxldGUobWJvKTsKQEAgLTU0NSwzNiArNTIzLDI5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGhkbV9yZWFkX2NvbXBsZXRpb24oc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCBtYm8gKm1ibzsKLQlzdHJ1Y3QgYnVmX2FuY2hvciAqYW5jaG9yOwotCXN0cnVjdCBtb3N0X2RldiAqbWRldjsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IG1ibyAqbWJvID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBtb3N0X2RldiAqbWRldiA9IHRvX21kZXYobWJvLT5pZnApOworCXVuc2lnbmVkIGludCBjaGFubmVsID0gbWJvLT5oZG1fY2hhbm5lbF9pZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmbWRldi0+dXNiX2RldmljZS0+ZGV2OworCXNwaW5sb2NrX3QgKmxvY2sgPSBtZGV2LT5jaGFubmVsX2xvY2sgKyBjaGFubmVsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGNoYW5uZWw7CiAKLQltYm8gPSB1cmItPmNvbnRleHQ7Ci0JYW5jaG9yID0gbWJvLT5wcml2OwotCW1kZXYgPSB0b19tZGV2KG1iby0+aWZwKTsKLQljaGFubmVsID0gbWJvLT5oZG1fY2hhbm5lbF9pZDsKLQlkZXYgPSAmbWRldi0+dXNiX2RldmljZS0+ZGV2OwotCi0JaWYgKCh1cmItPnN0YXR1cyA9PSAtRU5PRU5UKSB8fCAodXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQpIHx8Ci0JICAgICghbWRldi0+aXNfY2hhbm5lbF9oZWFsdGh5W2NoYW5uZWxdKSkgewotCQljb21wbGV0ZSgmYW5jaG9yLT51cmJfY29tcGwpOworCXNwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKTsKKwlpZiAodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fCB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fAorCSAgICAhbWRldi0+aXNfY2hhbm5lbF9oZWFsdGh5W2NoYW5uZWxdKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKHVubGlrZWx5KHVyYi0+c3RhdHVzICYmICEodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fAotCQkJCSAgICAgIHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUIHx8Ci0JCQkJICAgICAgdXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikpKSB7CisJaWYgKHVubGlrZWx5KHVyYi0+c3RhdHVzICYmIHVyYi0+c3RhdHVzICE9IC1FU0hVVERPV04pKSB7CiAJCW1iby0+cHJvY2Vzc2VkX2xlbmd0aCA9IDA7CiAJCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKIAkJY2FzZSAtRVBJUEU6CiAJCQlkZXZfd2FybihkZXYsICJCcm9rZW4gSU4gcGlwZSBkZXRlY3RlZFxuIik7Ci0JCQltYm8tPnN0YXR1cyA9IE1CT19FX0lOVkFMOwotCQkJdXNiX3VubGlua191cmIodXJiKTsKLQkJCUlOSVRfV09SSygmYW5jaG9yLT5jbGVhcl93b3JrX29iaiwgd3FfY2xlYXJfaGFsdCk7Ci0JCQlzY2hlZHVsZV93b3JrKCZhbmNob3ItPmNsZWFyX3dvcmtfb2JqKTsKKwkJCW1kZXYtPmlzX2NoYW5uZWxfaGVhbHRoeVtjaGFubmVsXSA9IGZhbHNlOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7CisJCQltZGV2LT5jbGVhcl93b3JrW2NoYW5uZWxdLnBpcGUgPSB1cmItPnBpcGU7CisJCQlzY2hlZHVsZV93b3JrKCZtZGV2LT5jbGVhcl93b3JrW2NoYW5uZWxdLndzKTsKIAkJCXJldHVybjsKIAkJY2FzZSAtRU5PREVWOgogCQljYXNlIC1FUFJPVE86CkBAIC01ODgsMjEgKzU1OSwxNSBAQAogCQl9CiAJfSBlbHNlIHsKIAkJbWJvLT5wcm9jZXNzZWRfbGVuZ3RoID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwotCQlpZiAoIW1kZXYtPnBhZGRpbmdfYWN0aXZlW2NoYW5uZWxdKSB7Ci0JCQltYm8tPnN0YXR1cyA9IE1CT19TVUNDRVNTOwotCQl9IGVsc2UgewotCQkJaWYgKGhkbV9yZW1vdmVfcGFkZGluZyhtZGV2LCBjaGFubmVsLCBtYm8pKSB7Ci0JCQkJbWJvLT5wcm9jZXNzZWRfbGVuZ3RoID0gMDsKLQkJCQltYm8tPnN0YXR1cyA9IE1CT19FX0lOVkFMOwotCQkJfSBlbHNlIHsKLQkJCQltYm8tPnN0YXR1cyA9IE1CT19TVUNDRVNTOwotCQkJfQorCQltYm8tPnN0YXR1cyA9IE1CT19TVUNDRVNTOworCQlpZiAobWRldi0+cGFkZGluZ19hY3RpdmVbY2hhbm5lbF0gJiYKKwkJICAgIGhkbV9yZW1vdmVfcGFkZGluZyhtZGV2LCBjaGFubmVsLCBtYm8pKSB7CisJCQltYm8tPnByb2Nlc3NlZF9sZW5ndGggPSAwOworCQkJbWJvLT5zdGF0dXMgPSBNQk9fRV9JTlZBTDsKIAkJfQogCX0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+YW5jaG9yX2xpc3RfbG9ja1tjaGFubmVsXSwgZmxhZ3MpOwotCWxpc3RfZGVsKCZhbmNob3ItPmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmFuY2hvcl9saXN0X2xvY2tbY2hhbm5lbF0sIGZsYWdzKTsKLQlrZnJlZShhbmNob3IpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7CiAKIAlpZiAobGlrZWx5KG1iby0+Y29tcGxldGUpKQogCQltYm8tPmNvbXBsZXRlKG1ibyk7CkBAIC02MjgsMTggKzU5MywxNiBAQAogCQkgICAgICAgc3RydWN0IG1ibyAqbWJvKQogewogCXN0cnVjdCBtb3N0X2RldiAqbWRldjsKLQlzdHJ1Y3QgYnVmX2FuY2hvciAqYW5jaG9yOwogCXN0cnVjdCBtb3N0X2NoYW5uZWxfY29uZmlnICpjb25mOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlpbnQgcmV0dmFsID0gMDsKIAlzdHJ1Y3QgdXJiICp1cmI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIGxlbmd0aDsKIAl2b2lkICp2aXJ0X2FkZHJlc3M7CiAKIAlpZiAodW5saWtlbHkoIWlmYWNlIHx8ICFtYm8pKQogCQlyZXR1cm4gLUVJTzsKLQlpZiAodW5saWtlbHkoaWZhY2UtPm51bV9jaGFubmVscyA8PSBjaGFubmVsKSB8fCAoY2hhbm5lbCA8IDApKQorCWlmICh1bmxpa2VseShpZmFjZS0+bnVtX2NoYW5uZWxzIDw9IGNoYW5uZWwgfHwgY2hhbm5lbCA8IDApKQogCQlyZXR1cm4gLUVDSFJORzsKIAogCW1kZXYgPSB0b19tZGV2KGlmYWNlKTsKQEAgLTY1MCwzMiArNjEzLDE1IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJdXJiID0gdXNiX2FsbG9jX3VyYihOT19JU09DSFJPTk9VU19VUkIsIEdGUF9BVE9NSUMpOwotCWlmICghdXJiKSB7Ci0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIFVSQlxuIik7CisJaWYgKCF1cmIpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAotCWFuY2hvciA9IGt6YWxsb2Moc2l6ZW9mKCphbmNob3IpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWFuY2hvcikgewotCQlyZXR2YWwgPSAtRU5PTUVNOworCWlmICgoY29uZi0+ZGlyZWN0aW9uICYgTU9TVF9DSF9UWCkgJiYgbWRldi0+cGFkZGluZ19hY3RpdmVbY2hhbm5lbF0gJiYKKwkgICAgaGRtX2FkZF9wYWRkaW5nKG1kZXYsIGNoYW5uZWwsIG1ibykpIHsKKwkJcmV0dmFsID0gLUVJTzsKIAkJZ290byBfZXJyb3I7CiAJfQogCi0JYW5jaG9yLT51cmIgPSB1cmI7Ci0JaW5pdF9jb21wbGV0aW9uKCZhbmNob3ItPnVyYl9jb21wbCk7Ci0JbWJvLT5wcml2ID0gYW5jaG9yOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmFuY2hvcl9saXN0X2xvY2tbY2hhbm5lbF0sIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZhbmNob3ItPmxpc3QsICZtZGV2LT5hbmNob3JfbGlzdFtjaGFubmVsXSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+YW5jaG9yX2xpc3RfbG9ja1tjaGFubmVsXSwgZmxhZ3MpOwotCi0JaWYgKChtZGV2LT5wYWRkaW5nX2FjdGl2ZVtjaGFubmVsXSkgJiYKLQkgICAgKGNvbmYtPmRpcmVjdGlvbiAmIE1PU1RfQ0hfVFgpKQotCQlpZiAoaGRtX2FkZF9wYWRkaW5nKG1kZXYsIGNoYW5uZWwsIG1ibykpIHsKLQkJCXJldHZhbCA9IC1FSU87Ci0JCQlnb3RvIF9lcnJvcl8xOwotCQl9Ci0KIAl1cmItPnRyYW5zZmVyX2RtYSA9IG1iby0+YnVzX2FkZHJlc3M7CiAJdmlydF9hZGRyZXNzID0gbWJvLT52aXJ0X2FkZHJlc3M7CiAJbGVuZ3RoID0gbWJvLT5idWZmZXJfbGVuZ3RoOwpAQCAtNjg4LDcgKzYzNCw3IEBACiAJCQkJICBsZW5ndGgsCiAJCQkJICBoZG1fd3JpdGVfY29tcGxldGlvbiwKIAkJCQkgIG1ibyk7Ci0JCWlmIChjb25mLT5kYXRhX3R5cGUgIT0gTU9TVF9DSF9JU09DX0FWUCkKKwkJaWYgKGNvbmYtPmRhdGFfdHlwZSAhPSBNT1NUX0NIX0lTT0MpCiAJCQl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9aRVJPX1BBQ0tFVDsKIAl9IGVsc2UgewogCQl1c2JfZmlsbF9idWxrX3VyYih1cmIsIG1kZXYtPnVzYl9kZXZpY2UsCkBAIC03MDEsNiArNjQ3LDggQEAKIAl9CiAJdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKIAorCXVzYl9hbmNob3JfdXJiKHVyYiwgJm1kZXYtPmJ1c3lfdXJic1tjaGFubmVsXSk7CisKIAlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpOwogCWlmIChyZXR2YWwpIHsKIAkJZGV2X2VycihkZXYsICJVUkIgc3VibWl0IGZhaWxlZCB3aXRoIGVycm9yICVkLlxuIiwgcmV0dmFsKTsKQEAgLTcwOSwxMCArNjU3LDcgQEAKIAlyZXR1cm4gMDsKIAogX2Vycm9yXzE6Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmFuY2hvcl9saXN0X2xvY2tbY2hhbm5lbF0sIGZsYWdzKTsKLQlsaXN0X2RlbCgmYW5jaG9yLT5saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT5hbmNob3JfbGlzdF9sb2NrW2NoYW5uZWxdLCBmbGFncyk7Ci0Ja2ZyZWUoYW5jaG9yKTsKKwl1c2JfdW5hbmNob3JfdXJiKHVyYik7CiBfZXJyb3I6CiAJdXNiX2ZyZWVfdXJiKHVyYik7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTczMSwyOSArNjc2LDMwIEBACiAJdW5zaWduZWQgaW50IGZyYW1lX3NpemU7CiAJdW5zaWduZWQgaW50IHRlbXBfc2l6ZTsKIAl1bnNpZ25lZCBpbnQgdGFpbF9zcGFjZTsKLQlzdHJ1Y3QgbW9zdF9kZXYgKm1kZXY7Ci0Jc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBtb3N0X2RldiAqbWRldiA9IHRvX21kZXYoaWZhY2UpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZtZGV2LT51c2JfZGV2aWNlLT5kZXY7CiAKLQltZGV2ID0gdG9fbWRldihpZmFjZSk7CiAJbWRldi0+aXNfY2hhbm5lbF9oZWFsdGh5W2NoYW5uZWxdID0gdHJ1ZTsKLQlkZXYgPSAmbWRldi0+dXNiX2RldmljZS0+ZGV2OworCW1kZXYtPmNsZWFyX3dvcmtbY2hhbm5lbF0uY2hhbm5lbCA9IGNoYW5uZWw7CisJbWRldi0+Y2xlYXJfd29ya1tjaGFubmVsXS5tZGV2ID0gbWRldjsKKwlJTklUX1dPUksoJm1kZXYtPmNsZWFyX3dvcmtbY2hhbm5lbF0ud3MsIHdxX2NsZWFyX2hhbHQpOwogCiAJaWYgKHVubGlrZWx5KCFpZmFjZSB8fCAhY29uZikpIHsKIAkJZGV2X2VycihkZXYsICJCYWQgaW50ZXJmYWNlIG9yIGNvbmZpZyBwb2ludGVyLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAodW5saWtlbHkoKGNoYW5uZWwgPCAwKSB8fCAoY2hhbm5lbCA+PSBpZmFjZS0+bnVtX2NoYW5uZWxzKSkpIHsKKwlpZiAodW5saWtlbHkoY2hhbm5lbCA8IDAgfHwgY2hhbm5lbCA+PSBpZmFjZS0+bnVtX2NoYW5uZWxzKSkgewogCQlkZXZfZXJyKGRldiwgIkNoYW5uZWwgSUQgb3V0IG9mIHJhbmdlLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoKCFjb25mLT5udW1fYnVmZmVycykgfHwgKCFjb25mLT5idWZmZXJfc2l6ZSkpIHsKKwlpZiAoIWNvbmYtPm51bV9idWZmZXJzIHx8ICFjb25mLT5idWZmZXJfc2l6ZSkgewogCQlkZXZfZXJyKGRldiwgIk1pc2NvbmZpZzogYnVmZmVyIHNpemUgb3IgI2J1ZmZlcnMgemVyby5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoIShjb25mLT5kYXRhX3R5cGUgPT0gTU9TVF9DSF9TWU5DKSAmJgotCSAgICAhKChjb25mLT5kYXRhX3R5cGUgPT0gTU9TVF9DSF9JU09DX0FWUCkgJiYKLQkgICAgICAoY29uZi0+cGFja2V0c19wZXJfeGFjdCAhPSAweEZGKSkpIHsKKwlpZiAoY29uZi0+ZGF0YV90eXBlICE9IE1PU1RfQ0hfU1lOQyAmJgorCSAgICAhKGNvbmYtPmRhdGFfdHlwZSA9PSBNT1NUX0NIX0lTT0MgJiYKKwkgICAgICBjb25mLT5wYWNrZXRzX3Blcl94YWN0ICE9IDB4RkYpKSB7CiAJCW1kZXYtPnBhZGRpbmdfYWN0aXZlW2NoYW5uZWxdID0gZmFsc2U7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC03NjIsNyArNzA4LDcgQEAKIAl0ZW1wX3NpemUgPSBjb25mLT5idWZmZXJfc2l6ZTsKIAogCWZyYW1lX3NpemUgPSBnZXRfc3RyZWFtX2ZyYW1lX3NpemUoY29uZik7Ci0JaWYgKChmcmFtZV9zaXplID09IDApIHx8IChmcmFtZV9zaXplID4gVVNCX01UVSkpIHsKKwlpZiAoZnJhbWVfc2l6ZSA9PSAwIHx8IGZyYW1lX3NpemUgPiBVU0JfTVRVKSB7CiAJCWRldl93YXJuKGRldiwgIk1pc2NvbmZpZzogZnJhbWUgc2l6ZSB3cm9uZ1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTgwNywxNyArNzUzLDE3IEBACiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKG1kZXYtPmh3X2FkZHIpKSB7CiAJCWlmIChkcmNpX3JkX3JlZyh1c2JfZGV2aWNlLCBEUkNJX1JFR19IV19BRERSX0hJLCAmaGkpIDwgMCkgewogCQkJZGV2X2VycihkZXYsICJWZW5kb3IgcmVxdWVzdCBcImh3X2FkZHJfaGlcIiBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KIAogCQlpZiAoZHJjaV9yZF9yZWcodXNiX2RldmljZSwgRFJDSV9SRUdfSFdfQUREUl9NSSwgJm1pKSA8IDApIHsKIAkJCWRldl9lcnIoZGV2LCAiVmVuZG9yIHJlcXVlc3QgXCJod19hZGRyX21pZFwiIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCiAJCWlmIChkcmNpX3JkX3JlZyh1c2JfZGV2aWNlLCBEUkNJX1JFR19IV19BRERSX0xPLCAmbG8pIDwgMCkgewogCQkJZGV2X2VycihkZXYsICJWZW5kb3IgcmVxdWVzdCBcImh3X2FkZHJfbG93XCIgZmFpbGVkXG4iKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAKIAkJbXV0ZXhfbG9jaygmbWRldi0+aW9fbXV0ZXgpOwpAQCAtODMyLDcgKzc3OCw3IEBACiAKIAlpZiAoZHJjaV9yZF9yZWcodXNiX2RldmljZSwgRFJDSV9SRUdfTklfU1RBVEUsICZsaW5rKSA8IDApIHsKIAkJZGV2X2VycihkZXYsICJWZW5kb3IgcmVxdWVzdCBcImxpbmsgc3RhdHVzXCIgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKIAltdXRleF9sb2NrKCZtZGV2LT5pb19tdXRleCk7CkBAIC04ODYsMjUgKzgzMiwyMiBAQAogICovCiBzdGF0aWMgdm9pZCB3cV9uZXRpbmZvKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3Ffb2JqKQogewotCXN0cnVjdCBtb3N0X2RldiAqbWRldjsKLQlpbnQgaSwgcHJldl9saW5rX3N0YXQ7CisJc3RydWN0IG1vc3RfZGV2ICptZGV2ID0gdG9fbWRldl9mcm9tX3dvcmsod3Ffb2JqKTsKKwlpbnQgaSwgcHJldl9saW5rX3N0YXQgPSBtZGV2LT5saW5rX3N0YXQ7CiAJdTggcHJldl9od19hZGRyWzZdOwogCi0JbWRldiA9IHRvX21kZXZfZnJvbV93b3JrKHdxX29iaik7Ci0JcHJldl9saW5rX3N0YXQgPSBtZGV2LT5saW5rX3N0YXQ7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQogCQlwcmV2X2h3X2FkZHJbaV0gPSBtZGV2LT5od19hZGRyW2ldOwogCiAJaWYgKGhkbV91cGRhdGVfbmV0aW5mbyhtZGV2KSA8IDApCiAJCXJldHVybjsKLQlpZiAoKHByZXZfbGlua19zdGF0ICE9IG1kZXYtPmxpbmtfc3RhdCkgfHwKLQkgICAgKHByZXZfaHdfYWRkclswXSAhPSBtZGV2LT5od19hZGRyWzBdKSB8fAotCSAgICAocHJldl9od19hZGRyWzFdICE9IG1kZXYtPmh3X2FkZHJbMV0pIHx8Ci0JICAgIChwcmV2X2h3X2FkZHJbMl0gIT0gbWRldi0+aHdfYWRkclsyXSkgfHwKLQkgICAgKHByZXZfaHdfYWRkclszXSAhPSBtZGV2LT5od19hZGRyWzNdKSB8fAotCSAgICAocHJldl9od19hZGRyWzRdICE9IG1kZXYtPmh3X2FkZHJbNF0pIHx8Ci0JICAgIChwcmV2X2h3X2FkZHJbNV0gIT0gbWRldi0+aHdfYWRkcls1XSkpCisJaWYgKHByZXZfbGlua19zdGF0ICE9IG1kZXYtPmxpbmtfc3RhdCB8fAorCSAgICBwcmV2X2h3X2FkZHJbMF0gIT0gbWRldi0+aHdfYWRkclswXSB8fAorCSAgICBwcmV2X2h3X2FkZHJbMV0gIT0gbWRldi0+aHdfYWRkclsxXSB8fAorCSAgICBwcmV2X2h3X2FkZHJbMl0gIT0gbWRldi0+aHdfYWRkclsyXSB8fAorCSAgICBwcmV2X2h3X2FkZHJbM10gIT0gbWRldi0+aHdfYWRkclszXSB8fAorCSAgICBwcmV2X2h3X2FkZHJbNF0gIT0gbWRldi0+aHdfYWRkcls0XSB8fAorCSAgICBwcmV2X2h3X2FkZHJbNV0gIT0gbWRldi0+aHdfYWRkcls1XSkKIAkJbW9zdF9kZWxpdmVyX25ldGluZm8oJm1kZXYtPmlmYWNlLCBtZGV2LT5saW5rX3N0YXQsCiAJCQkJICAgICAmbWRldi0+aHdfYWRkclswXSk7CiB9CkBAIC05MTcsMzMgKzg2MCwyMCBAQAogICovCiBzdGF0aWMgdm9pZCB3cV9jbGVhcl9oYWx0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd3Ffb2JqKQogewotCXN0cnVjdCBidWZfYW5jaG9yICphbmNob3I7Ci0Jc3RydWN0IG1vc3RfZGV2ICptZGV2OwotCXN0cnVjdCBtYm8gKm1ibzsKLQlzdHJ1Y3QgdXJiICp1cmI7Ci0JdW5zaWduZWQgaW50IGNoYW5uZWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgY2xlYXJfaG9sZF93b3JrICpjbGVhcl93b3JrID0gdG9fY2xlYXJfaG9sZF93b3JrKHdxX29iaik7CisJc3RydWN0IG1vc3RfZGV2ICptZGV2ID0gY2xlYXJfd29yay0+bWRldjsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbCA9IGNsZWFyX3dvcmstPmNoYW5uZWw7CisJaW50IHBpcGUgPSBjbGVhcl93b3JrLT5waXBlOwogCi0JYW5jaG9yID0gdG9fYnVmX2FuY2hvcih3cV9vYmopOwotCXVyYiA9IGFuY2hvci0+dXJiOwotCW1ibyA9IHVyYi0+Y29udGV4dDsKLQltZGV2ID0gdG9fbWRldihtYm8tPmlmcCk7Ci0JY2hhbm5lbCA9IG1iby0+aGRtX2NoYW5uZWxfaWQ7Ci0KLQlpZiAodXNiX2NsZWFyX2hhbHQodXJiLT5kZXYsIHVyYi0+cGlwZSkpCisJbXV0ZXhfbG9jaygmbWRldi0+aW9fbXV0ZXgpOworCW1vc3Rfc3RvcF9lbnF1ZXVlKCZtZGV2LT5pZmFjZSwgY2hhbm5lbCk7CisJZnJlZV9hbmNob3JlZF9idWZmZXJzKG1kZXYsIGNoYW5uZWwsIE1CT19FX0lOVkFMKTsKKwlpZiAodXNiX2NsZWFyX2hhbHQobWRldi0+dXNiX2RldmljZSwgcGlwZSkpCiAJCWRldl93YXJuKCZtZGV2LT51c2JfZGV2aWNlLT5kZXYsICJGYWlsZWQgdG8gcmVzZXQgZW5kcG9pbnQuXG4iKTsKIAotCXVzYl9mcmVlX3VyYih1cmIpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT5hbmNob3JfbGlzdF9sb2NrW2NoYW5uZWxdLCBmbGFncyk7Ci0JbGlzdF9kZWwoJmFuY2hvci0+bGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+YW5jaG9yX2xpc3RfbG9ja1tjaGFubmVsXSwgZmxhZ3MpOwotCi0JaWYgKGxpa2VseShtYm8tPmNvbXBsZXRlKSkKLQkJbWJvLT5jb21wbGV0ZShtYm8pOwotCWlmIChtZGV2LT5jb25mW2NoYW5uZWxdLmRpcmVjdGlvbiAmIE1PU1RfQ0hfVFgpCi0JCW1vc3RfcmVzdW1lX2VucXVldWUoJm1kZXYtPmlmYWNlLCBjaGFubmVsKTsKLQotCWtmcmVlKGFuY2hvcik7CisJbWRldi0+aXNfY2hhbm5lbF9oZWFsdGh5W2NoYW5uZWxdID0gdHJ1ZTsKKwltb3N0X3Jlc3VtZV9lbnF1ZXVlKCZtZGV2LT5pZmFjZSwgY2hhbm5lbCk7CisJbXV0ZXhfdW5sb2NrKCZtZGV2LT5pb19tdXRleCk7CiB9CiAKIC8qKgpAQCAtOTU4LDcgKzg4OCw5IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2JpZFtdID0gewogCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NNU0MsIFVTQl9ERVZfSURfQlJERyksIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU01TQywgVVNCX0RFVl9JRF9JTklDKSwgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TTVNDLCBVU0JfREVWX0lEX09TODExMTgpLCB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NNU0MsIFVTQl9ERVZfSURfT1M4MTExOSksIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU01TQywgVVNCX0RFVl9JRF9PUzgxMjEwKSwgfSwKIAl7IH0gLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiAKQEAgLTk3MCw2ICs5MDIsMTAgQEAKIAlzdHJ1Y3QgbW9zdF9kY2lfYXR0cmlidXRlIG1vc3RfZGNpX2F0dHJfIyNfbmFtZSA9IFwKIAkJX19BVFRSKF9uYW1lLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd192YWx1ZSwgc3RvcmVfdmFsdWUpCiAKKyNkZWZpbmUgTU9TVF9EQ0lfV09fQVRUUihfbmFtZSkgXAorCXN0cnVjdCBtb3N0X2RjaV9hdHRyaWJ1dGUgbW9zdF9kY2lfYXR0cl8jI19uYW1lID0gXAorCQlfX0FUVFIoX25hbWUsIFNfSVdVU1IsIE5VTEwsIHN0b3JlX3ZhbHVlKQorCiAvKioKICAqIHN0cnVjdCBtb3N0X2RjaV9hdHRyaWJ1dGUgLSB0byBhY2Nlc3MgdGhlIGF0dHJpYnV0ZXMgb2YgYSBkY2kgb2JqZWN0CiAgKiBAYXR0cjogYXR0cmlidXRlcyBvZiBhIGRjaSBvYmplY3QKQEAgLTEwNDYsNDUgKzk4Miw2OCBAQAogCWtmcmVlKGRjaV9vYmopOwogfQogCitzdHJ1Y3QgcmVncyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1MTYgcmVnOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdzIHJvX3JlZ3NbXSA9IHsKKwl7ICJuaV9zdGF0ZSIsIERSQ0lfUkVHX05JX1NUQVRFIH0sCisJeyAicGFja2V0X2JhbmR3aWR0aCIsIERSQ0lfUkVHX1BBQ0tFVF9CVyB9LAorCXsgIm5vZGVfYWRkcmVzcyIsIERSQ0lfUkVHX05PREVfQUREUiB9LAorCXsgIm5vZGVfcG9zaXRpb24iLCBEUkNJX1JFR19OT0RFX1BPUyB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdzIHJ3X3JlZ3NbXSA9IHsKKwl7ICJtZXBfZmlsdGVyIiwgRFJDSV9SRUdfTUVQX0ZJTFRFUiB9LAorCXsgIm1lcF9oYXNoMCIsIERSQ0lfUkVHX0hBU0hfVEJMMCB9LAorCXsgIm1lcF9oYXNoMSIsIERSQ0lfUkVHX0hBU0hfVEJMMSB9LAorCXsgIm1lcF9oYXNoMiIsIERSQ0lfUkVHX0hBU0hfVEJMMiB9LAorCXsgIm1lcF9oYXNoMyIsIERSQ0lfUkVHX0hBU0hfVEJMMyB9LAorCXsgIm1lcF9ldWk0OF9oaSIsIERSQ0lfUkVHX0hXX0FERFJfSEkgfSwKKwl7ICJtZXBfZXVpNDhfbWkiLCBEUkNJX1JFR19IV19BRERSX01JIH0sCisJeyAibWVwX2V1aTQ4X2xvIiwgRFJDSV9SRUdfSFdfQUREUl9MTyB9LAorfTsKKworc3RhdGljIGludCBnZXRfc3RhdF9yZWdfYWRkcihjb25zdCBzdHJ1Y3QgcmVncyAqcmVncywgaW50IHNpemUsCisJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHUxNiAqcmVnX2FkZHIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmICghc3RyY21wKG5hbWUsIHJlZ3NbaV0ubmFtZSkpIHsKKwkJCSpyZWdfYWRkciA9IHJlZ3NbaV0ucmVnOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKKyNkZWZpbmUgZ2V0X3N0YXRpY19yZWdfYWRkcihyZWdzLCBuYW1lLCByZWdfYWRkcikgXAorCWdldF9zdGF0X3JlZ19hZGRyKHJlZ3MsIEFSUkFZX1NJWkUocmVncyksIG5hbWUsIHJlZ19hZGRyKQorCiBzdGF0aWMgc3NpemVfdCBzaG93X3ZhbHVlKHN0cnVjdCBtb3N0X2RjaV9vYmogKmRjaV9vYmosCiAJCQkgIHN0cnVjdCBtb3N0X2RjaV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQl1MTYgdG1wX3ZhbDsKKwljb25zdCBjaGFyICpuYW1lID0gYXR0ci0+YXR0ci5uYW1lOworCXUxNiB2YWw7CiAJdTE2IHJlZ19hZGRyOwogCWludCBlcnI7CiAKLQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJuaV9zdGF0ZSIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX05JX1NUQVRFOwotCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAicGFja2V0X2JhbmR3aWR0aCIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX1BBQ0tFVF9CVzsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm5vZGVfYWRkcmVzcyIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX05PREVfQUREUjsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm5vZGVfcG9zaXRpb24iKSkKLQkJcmVnX2FkZHIgPSBEUkNJX1JFR19OT0RFX1BPUzsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9maWx0ZXIiKSkKLQkJcmVnX2FkZHIgPSBEUkNJX1JFR19NRVBfRklMVEVSOwotCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAibWVwX2hhc2gwIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfSEFTSF9UQkwwOwotCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAibWVwX2hhc2gxIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfSEFTSF9UQkwxOwotCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAibWVwX2hhc2gyIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfSEFTSF9UQkwyOwotCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAibWVwX2hhc2gzIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfSEFTSF9UQkwzOwotCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAibWVwX2V1aTQ4X2hpIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfSFdfQUREUl9ISTsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9ldWk0OF9taSIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hXX0FERFJfTUk7Ci0JZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJtZXBfZXVpNDhfbG8iKSkKLQkJcmVnX2FkZHIgPSBEUkNJX1JFR19IV19BRERSX0xPOwotCWVsc2UKLQkJcmV0dXJuIC1FSU87CisJaWYgKCFzdHJjbXAobmFtZSwgImFyYl9hZGRyZXNzIikpCisJCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiUwNHhcbiIsIGRjaV9vYmotPnJlZ19hZGRyKTsKIAotCWVyciA9IGRyY2lfcmRfcmVnKGRjaV9vYmotPnVzYl9kZXZpY2UsIHJlZ19hZGRyLCAmdG1wX3ZhbCk7CisJaWYgKCFzdHJjbXAobmFtZSwgImFyYl92YWx1ZSIpKQorCQlyZWdfYWRkciA9IGRjaV9vYmotPnJlZ19hZGRyOworCWVsc2UgaWYgKGdldF9zdGF0aWNfcmVnX2FkZHIocm9fcmVncywgbmFtZSwgJnJlZ19hZGRyKSAmJgorCQkgZ2V0X3N0YXRpY19yZWdfYWRkcihyd19yZWdzLCBuYW1lLCAmcmVnX2FkZHIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IGRyY2lfcmRfcmVnKGRjaV9vYmotPnVzYl9kZXZpY2UsIHJlZ19hZGRyLCAmdmFsKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiUwNHhcbiIsIHRtcF92YWwpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiUwNHhcbiIsIHZhbCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX3ZhbHVlKHN0cnVjdCBtb3N0X2RjaV9vYmogKmRjaV9vYmosCkBAIC0xMDkzLDMxICsxMDUyLDI4IEBACiB7CiAJdTE2IHZhbDsKIAl1MTYgcmVnX2FkZHI7Ci0JaW50IGVycjsKKwljb25zdCBjaGFyICpuYW1lID0gYXR0ci0+YXR0ci5uYW1lOworCWludCBlcnIgPSBrc3RydG91MTYoYnVmLCAxNiwgJnZhbCk7CiAKLQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJtZXBfZmlsdGVyIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfTUVQX0ZJTFRFUjsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9oYXNoMCIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hBU0hfVEJMMDsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9oYXNoMSIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hBU0hfVEJMMTsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9oYXNoMiIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hBU0hfVEJMMjsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9oYXNoMyIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hBU0hfVEJMMzsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9ldWk0OF9oaSIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hXX0FERFJfSEk7Ci0JZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJtZXBfZXVpNDhfbWkiKSkKLQkJcmVnX2FkZHIgPSBEUkNJX1JFR19IV19BRERSX01JOwotCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAibWVwX2V1aTQ4X2xvIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfSFdfQUREUl9MTzsKLQllbHNlCi0JCXJldHVybiAtRUlPOwotCi0JZXJyID0ga3N0cnRvdTE2KGJ1ZiwgMTYsICZ2YWwpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKKwlpZiAoIXN0cmNtcChuYW1lLCAiYXJiX2FkZHJlc3MiKSkgeworCQlkY2lfb2JqLT5yZWdfYWRkciA9IHZhbDsKKwkJcmV0dXJuIGNvdW50OworCX0KKworCWlmICghc3RyY21wKG5hbWUsICJhcmJfdmFsdWUiKSkgeworCQlyZWdfYWRkciA9IGRjaV9vYmotPnJlZ19hZGRyOworCX0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAic3luY19lcCIpKSB7CisJCXUxNiBlcCA9IHZhbDsKKworCQlyZWdfYWRkciA9IERSQ0lfUkVHX0JBU0UgKyBEUkNJX0NPTU1BTkQgKyBlcCAqIDE2OworCQl2YWwgPSAxOworCX0gZWxzZSBpZiAoZ2V0X3N0YXRpY19yZWdfYWRkcihyb19yZWdzLCBuYW1lLCAmcmVnX2FkZHIpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwogCWVyciA9IGRyY2lfd3JfcmVnKGRjaV9vYmotPnVzYl9kZXZpY2UsIHJlZ19hZGRyLCB2YWwpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtMTEyOSw2ICsxMDg1LDcgQEAKIHN0YXRpYyBNT1NUX0RDSV9ST19BVFRSKHBhY2tldF9iYW5kd2lkdGgpOwogc3RhdGljIE1PU1RfRENJX1JPX0FUVFIobm9kZV9hZGRyZXNzKTsKIHN0YXRpYyBNT1NUX0RDSV9ST19BVFRSKG5vZGVfcG9zaXRpb24pOworc3RhdGljIE1PU1RfRENJX1dPX0FUVFIoc3luY19lcCk7CiBzdGF0aWMgTU9TVF9EQ0lfQVRUUihtZXBfZmlsdGVyKTsKIHN0YXRpYyBNT1NUX0RDSV9BVFRSKG1lcF9oYXNoMCk7CiBzdGF0aWMgTU9TVF9EQ0lfQVRUUihtZXBfaGFzaDEpOwpAQCAtMTEzNyw2ICsxMDk0LDggQEAKIHN0YXRpYyBNT1NUX0RDSV9BVFRSKG1lcF9ldWk0OF9oaSk7CiBzdGF0aWMgTU9TVF9EQ0lfQVRUUihtZXBfZXVpNDhfbWkpOwogc3RhdGljIE1PU1RfRENJX0FUVFIobWVwX2V1aTQ4X2xvKTsKK3N0YXRpYyBNT1NUX0RDSV9BVFRSKGFyYl9hZGRyZXNzKTsKK3N0YXRpYyBNT1NUX0RDSV9BVFRSKGFyYl92YWx1ZSk7CiAKIC8qKgogICogbW9zdF9kY2lfZGVmX2F0dHJzIC0gYXJyYXkgb2YgZGVmYXVsdCBhdHRyaWJ1dGUgZmlsZXMgb2YgdGhlIGRjaSBvYmplY3QKQEAgLTExNDYsNiArMTEwNSw3IEBACiAJJm1vc3RfZGNpX2F0dHJfcGFja2V0X2JhbmR3aWR0aC5hdHRyLAogCSZtb3N0X2RjaV9hdHRyX25vZGVfYWRkcmVzcy5hdHRyLAogCSZtb3N0X2RjaV9hdHRyX25vZGVfcG9zaXRpb24uYXR0ciwKKwkmbW9zdF9kY2lfYXR0cl9zeW5jX2VwLmF0dHIsCiAJJm1vc3RfZGNpX2F0dHJfbWVwX2ZpbHRlci5hdHRyLAogCSZtb3N0X2RjaV9hdHRyX21lcF9oYXNoMC5hdHRyLAogCSZtb3N0X2RjaV9hdHRyX21lcF9oYXNoMS5hdHRyLApAQCAtMTE1NCw2ICsxMTE0LDggQEAKIAkmbW9zdF9kY2lfYXR0cl9tZXBfZXVpNDhfaGkuYXR0ciwKIAkmbW9zdF9kY2lfYXR0cl9tZXBfZXVpNDhfbWkuYXR0ciwKIAkmbW9zdF9kY2lfYXR0cl9tZXBfZXVpNDhfbG8uYXR0ciwKKwkmbW9zdF9kY2lfYXR0cl9hcmJfYWRkcmVzcy5hdHRyLAorCSZtb3N0X2RjaV9hdHRyX2FyYl92YWx1ZS5hdHRyLAogCU5VTEwsCiB9OwogCkBAIC0xMTc2LDEwICsxMTM4LDkgQEAKIHN0YXRpYyBzdHJ1Y3QKIG1vc3RfZGNpX29iaiAqY3JlYXRlX21vc3RfZGNpX29iaihzdHJ1Y3Qga29iamVjdCAqcGFyZW50KQogewotCXN0cnVjdCBtb3N0X2RjaV9vYmogKm1vc3RfZGNpOworCXN0cnVjdCBtb3N0X2RjaV9vYmogKm1vc3RfZGNpID0ga3phbGxvYyhzaXplb2YoKm1vc3RfZGNpKSwgR0ZQX0tFUk5FTCk7CiAJaW50IHJldHZhbDsKIAotCW1vc3RfZGNpID0ga3phbGxvYyhzaXplb2YoKm1vc3RfZGNpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtb3N0X2RjaSkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTEyMTYsMjEgKzExNzcsMTcgQEAKIHN0YXRpYyBpbnQKIGhkbV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqdXNiX2lmYWNlX2Rlc2MgPSBpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ1c2JfZGV2LT5kZXY7CisJc3RydWN0IG1vc3RfZGV2ICptZGV2ID0ga3phbGxvYyhzaXplb2YoKm1kZXYpLCBHRlBfS0VSTkVMKTsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1bnNpZ25lZCBpbnQgbnVtX2VuZHBvaW50czsKIAlzdHJ1Y3QgbW9zdF9jaGFubmVsX2NhcGFiaWxpdHkgKnRtcF9jYXA7Ci0Jc3RydWN0IG1vc3RfZGV2ICptZGV2OwotCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2OwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICp1c2JfaWZhY2VfZGVzYzsKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX2Rlc2M7CiAJaW50IHJldCA9IDA7CiAJaW50IGVycjsKIAotCXVzYl9pZmFjZV9kZXNjID0gaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZzsKLQl1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOwotCWRldiA9ICZ1c2JfZGV2LT5kZXY7Ci0JbWRldiA9IGt6YWxsb2Moc2l6ZW9mKCptZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtZGV2KQogCQlnb3RvIGV4aXRfRU5PTUVNOwogCkBAIC0xMjc2LDkgKzEyMzMsOSBAQAogCWlmICghbWRldi0+ZXBfYWRkcmVzcykKIAkJZ290byBleGl0X2ZyZWUyOwogCi0JbWRldi0+YW5jaG9yX2xpc3QgPQotCQlrY2FsbG9jKG51bV9lbmRwb2ludHMsIHNpemVvZigqbWRldi0+YW5jaG9yX2xpc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1kZXYtPmFuY2hvcl9saXN0KQorCW1kZXYtPmJ1c3lfdXJicyA9CisJCWtjYWxsb2MobnVtX2VuZHBvaW50cywgc2l6ZW9mKCptZGV2LT5idXN5X3VyYnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1kZXYtPmJ1c3lfdXJicykKIAkJZ290byBleGl0X2ZyZWUzOwogCiAJdG1wX2NhcCA9IG1kZXYtPmNhcDsKQEAgLTEyOTcsMjEgKzEyNTQsMjEgQEAKIAkJdG1wX2NhcC0+bnVtX2J1ZmZlcnNfcGFja2V0ID0gQlVGX0NIQUlOX1NJWkU7CiAJCXRtcF9jYXAtPm51bV9idWZmZXJzX3N0cmVhbWluZyA9IEJVRl9DSEFJTl9TSVpFOwogCQl0bXBfY2FwLT5kYXRhX3R5cGUgPSBNT1NUX0NIX0NPTlRST0wgfCBNT1NUX0NIX0FTWU5DIHwKLQkJCQkgICAgIE1PU1RfQ0hfSVNPQ19BVlAgfCBNT1NUX0NIX1NZTkM7CisJCQkJICAgICBNT1NUX0NIX0lTT0MgfCBNT1NUX0NIX1NZTkM7CiAJCWlmICh1c2JfZW5kcG9pbnRfZGlyX2luKGVwX2Rlc2MpKQogCQkJdG1wX2NhcC0+ZGlyZWN0aW9uID0gTU9TVF9DSF9SWDsKIAkJZWxzZQogCQkJdG1wX2NhcC0+ZGlyZWN0aW9uID0gTU9TVF9DSF9UWDsKIAkJdG1wX2NhcCsrOwotCQlJTklUX0xJU1RfSEVBRCgmbWRldi0+YW5jaG9yX2xpc3RbaV0pOwotCQlzcGluX2xvY2tfaW5pdCgmbWRldi0+YW5jaG9yX2xpc3RfbG9ja1tpXSk7CisJCWluaXRfdXNiX2FuY2hvcigmbWRldi0+YnVzeV91cmJzW2ldKTsKKwkJc3Bpbl9sb2NrX2luaXQoJm1kZXYtPmNoYW5uZWxfbG9ja1tpXSk7CiAJCWVyciA9IGRyY2lfd3JfcmVnKHVzYl9kZXYsCiAJCQkJICBEUkNJX1JFR19CQVNFICsgRFJDSV9DT01NQU5EICsKIAkJCQkgIGVwX2Rlc2MtPmJFbmRwb2ludEFkZHJlc3MgKiAxNiwKIAkJCQkgIDEpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXByX3dhcm4oIkRDSSBTeW5jIGZvciBFUCAlMDJ4IGZhaWxlZCIsCi0JCQkJZXBfZGVzYy0+YkVuZHBvaW50QWRkcmVzcyk7CisJCQlkZXZfd2FybihkZXYsICJEQ0kgU3luYyBmb3IgRVAgJTAyeCBmYWlsZWQiLAorCQkJCSBlcF9kZXNjLT5iRW5kcG9pbnRBZGRyZXNzKTsKIAl9CiAJZGV2X25vdGljZShkZXYsICJjbGFpbWVkIGdhZGdldDogVmVuZG9yPSU0LjR4IFByb2RJRD0lNC40eCBCdXM9JTAyeCBEZXZpY2U9JTAyeFxuIiwKIAkJICAgbGUxNl90b19jcHUodXNiX2Rldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCkBAIC0xMzMyLDcgKzEyODksOSBAQAogCX0KIAogCW11dGV4X2xvY2soJm1kZXYtPmlvX211dGV4KTsKLQlpZiAobGUxNl90b19jcHUodXNiX2Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IFVTQl9ERVZfSURfSU5JQykgeworCWlmIChsZTE2X3RvX2NwdSh1c2JfZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gVVNCX0RFVl9JRF9PUzgxMTE4IHx8CisJICAgIGxlMTZfdG9fY3B1KHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBVU0JfREVWX0lEX09TODExMTkgfHwKKwkgICAgbGUxNl90b19jcHUodXNiX2Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IFVTQl9ERVZfSURfT1M4MTIxMCkgewogCQkvKiB0aGlzIGluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgaW5zdGFuY2UKIAkJICogb2JqZWN0IG9mIHRoZSBjb3JlCiAJCSAqLwpAQCAtMTM1MSw3ICsxMzEwLDcgQEAKIAlyZXR1cm4gMDsKIAogZXhpdF9mcmVlNDoKLQlrZnJlZShtZGV2LT5hbmNob3JfbGlzdCk7CisJa2ZyZWUobWRldi0+YnVzeV91cmJzKTsKIGV4aXRfZnJlZTM6CiAJa2ZyZWUobWRldi0+ZXBfYWRkcmVzcyk7CiBleGl0X2ZyZWUyOgpAQCAtMTM3OSw5ICsxMzM4LDggQEAKICAqLwogc3RhdGljIHZvaWQgaGRtX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKIHsKLQlzdHJ1Y3QgbW9zdF9kZXYgKm1kZXY7CisJc3RydWN0IG1vc3RfZGV2ICptZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwogCi0JbWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKIAltdXRleF9sb2NrKCZtZGV2LT5pb19tdXRleCk7CiAJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOwogCW1kZXYtPnVzYl9kZXZpY2UgPSBOVUxMOwpAQCAtMTM5Myw3ICsxMzUxLDcgQEAKIAlkZXN0cm95X21vc3RfZGNpX29iaihtZGV2LT5kY2kpOwogCW1vc3RfZGVyZWdpc3Rlcl9pbnRlcmZhY2UoJm1kZXYtPmlmYWNlKTsKIAotCWtmcmVlKG1kZXYtPmFuY2hvcl9saXN0KTsKKwlrZnJlZShtZGV2LT5idXN5X3VyYnMpOwogCWtmcmVlKG1kZXYtPmNhcCk7CiAJa2ZyZWUobWRldi0+Y29uZik7CiAJa2ZyZWUobWRldi0+ZXBfYWRkcmVzcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9tb3N0Y29yZS9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9tb3N0Y29yZS9jb3JlLmMKaW5kZXggN2M2MTlmZS4uMzI5MTA5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21vc3QvbW9zdGNvcmUvY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L21vc3Rjb3JlL2NvcmUuYwpAQCAtMzMsNyArMzMsNyBAQAogI2RlZmluZSBTVFJJTkdfU0laRQk4MAogCiBzdGF0aWMgc3RydWN0IGNsYXNzICptb3N0X2NsYXNzOwotc3RhdGljIHN0cnVjdCBkZXZpY2UgKmNsYXNzX2dsdWVfZGlyOworc3RhdGljIHN0cnVjdCBkZXZpY2UgKmNvcmVfZGV2Owogc3RhdGljIHN0cnVjdCBpZGEgbWRldl9pZDsKIHN0YXRpYyBpbnQgZHVtbXlfbnVtX2J1ZmZlcnM7CiAKQEAgLTUxLDYgKzUxLDcgQEAKIAl1MTYgY2hhbm5lbF9pZDsKIAlib29sIGlzX3BvaXNvbmVkOwogCXN0cnVjdCBtdXRleCBzdGFydF9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggbnFfbXV0ZXg7IC8qIG5xIHRocmVhZCBzeW5jaHJvbml6YXRpb24gKi8KIAlpbnQgaXNfc3RhcnZpbmc7CiAJc3RydWN0IG1vc3RfaW50ZXJmYWNlICppZmFjZTsKIAlzdHJ1Y3QgbW9zdF9pbnN0X29iaiAqaW5zdDsKQEAgLTgyLDEwICs4MywxMyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAJaW50IG1vc3RfY2hfZGF0YV90eXBlOwogCWNoYXIgKm5hbWU7Ci19IGNoX2RhdGFfdHlwZVtdID0geyB7IE1PU1RfQ0hfQ09OVFJPTCwgImNvbnRyb2xcbiIgfSwKK30gY2hfZGF0YV90eXBlW10gPSB7CisJeyBNT1NUX0NIX0NPTlRST0wsICJjb250cm9sXG4iIH0sCiAJeyBNT1NUX0NIX0FTWU5DLCAiYXN5bmNcbiIgfSwKIAl7IE1PU1RfQ0hfU1lOQywgInN5bmNcbiIgfSwKLQl7IE1PU1RfQ0hfSVNPQ19BVlAsICJpc29jX2F2cFxuIn0gfTsKKwl7IE1PU1RfQ0hfSVNPQywgImlzb2NcbiJ9LAorCXsgTU9TVF9DSF9JU09DLCAiaXNvY19hdnBcbiJ9LAorfTsKIAogI2RlZmluZSB0b19pbnN0X29iaihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IG1vc3RfaW5zdF9vYmosIGtvYmopCiAKQEAgLTI2MCwxMSArMjY0LDExIEBACiAKIAlzdHJjcHkoYnVmLCAiIik7CiAJaWYgKGMtPmlmYWNlLT5jaGFubmVsX3ZlY3RvcltpXS5kaXJlY3Rpb24gJiBNT1NUX0NIX1JYKQotCQlzdHJjYXQoYnVmLCAiZGlyX3J4ICIpOworCQlzdHJjYXQoYnVmLCAicnggIik7CiAJaWYgKGMtPmlmYWNlLT5jaGFubmVsX3ZlY3RvcltpXS5kaXJlY3Rpb24gJiBNT1NUX0NIX1RYKQotCQlzdHJjYXQoYnVmLCAiZGlyX3R4ICIpOworCQlzdHJjYXQoYnVmLCAidHggIik7CiAJc3RyY2F0KGJ1ZiwgIlxuIik7Ci0JcmV0dXJuIHN0cmxlbihidWYpICsgMTsKKwlyZXR1cm4gc3RybGVuKGJ1Zik7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfYXZhaWxhYmxlX2RhdGF0eXBlcyhzdHJ1Y3QgbW9zdF9jX29iaiAqYywKQEAgLTI4MCwxMCArMjg0LDEwIEBACiAJCXN0cmNhdChidWYsICJhc3luYyAiKTsKIAlpZiAoYy0+aWZhY2UtPmNoYW5uZWxfdmVjdG9yW2ldLmRhdGFfdHlwZSAmIE1PU1RfQ0hfU1lOQykKIAkJc3RyY2F0KGJ1ZiwgInN5bmMgIik7Ci0JaWYgKGMtPmlmYWNlLT5jaGFubmVsX3ZlY3RvcltpXS5kYXRhX3R5cGUgJiBNT1NUX0NIX0lTT0NfQVZQKQotCQlzdHJjYXQoYnVmLCAiaXNvY19hdnAgIik7CisJaWYgKGMtPmlmYWNlLT5jaGFubmVsX3ZlY3RvcltpXS5kYXRhX3R5cGUgJiBNT1NUX0NIX0lTT0MpCisJCXN0cmNhdChidWYsICJpc29jICIpOwogCXN0cmNhdChidWYsICJcbiIpOwotCXJldHVybiBzdHJsZW4oYnVmKSArIDE7CisJcmV0dXJuIHN0cmxlbihidWYpOwogfQogCiBzdGF0aWMKQEAgLTM5MSw5ICszOTUsOSBAQAogCQkJCSAgY2hhciAqYnVmKQogewogCWlmIChjLT5jZmcuZGlyZWN0aW9uICYgTU9TVF9DSF9UWCkKLQkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiZGlyX3R4XG4iKTsKKwkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAidHhcbiIpOwogCWVsc2UgaWYgKGMtPmNmZy5kaXJlY3Rpb24gJiBNT1NUX0NIX1JYKQotCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJkaXJfcnhcbiIpOworCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJyeFxuIik7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAidW5jb25maWd1cmVkXG4iKTsKIH0KIApAQCAtNDA0LDggKzQwOCwxMiBAQAogewogCWlmICghc3RyY21wKGJ1ZiwgImRpcl9yeFxuIikpIHsKIAkJYy0+Y2ZnLmRpcmVjdGlvbiA9IE1PU1RfQ0hfUlg7CisJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgInJ4XG4iKSkgeworCQljLT5jZmcuZGlyZWN0aW9uID0gTU9TVF9DSF9SWDsKIAl9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAiZGlyX3R4XG4iKSkgewogCQljLT5jZmcuZGlyZWN0aW9uID0gTU9TVF9DSF9UWDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAidHhcbiIpKSB7CisJCWMtPmNmZy5kaXJlY3Rpb24gPSBNT1NUX0NIX1RYOwogCX0gZWxzZSB7CiAJCXByX2luZm8oIldBUk46IGludmFsaWQgYXR0cmlidXRlIHNldHRpbmdzXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC04NDcsNyArODU1LDIzIEBACiAJCQkgICAgIHN0cnVjdCBtb3N0X2FpbV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICAgIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgYWltX29iai0+YWRkX2xpbmspOworCXN0cnVjdCBtb3N0X2Nfb2JqICpjOworCXN0cnVjdCBtb3N0X2luc3Rfb2JqICppOworCWludCBvZmZzID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJmluc3RhbmNlX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmaS0+Y2hhbm5lbF9saXN0LCBsaXN0KSB7CisJCQlpZiAoYy0+YWltMC5wdHIgPT0gYWltX29iai0+ZHJpdmVyIHx8CisJCQkgICAgYy0+YWltMS5wdHIgPT0gYWltX29iai0+ZHJpdmVyKSB7CisJCQkJb2ZmcyArPSBzbnByaW50ZihidWYgKyBvZmZzLCBQQUdFX1NJWkUgLSBvZmZzLAorCQkJCQkJICIlczolc1xuIiwKKwkJCQkJCSBrb2JqZWN0X25hbWUoJmktPmtvYmopLAorCQkJCQkJIGtvYmplY3RfbmFtZSgmYy0+a29iaikpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIG9mZnM7CiB9CiAKIC8qKgpAQCAtMTEzMSwxOCArMTE1NSwxOCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPmZpZm9fbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgc3RydWN0IG1ibyAqZ2V0X2hkbV9tYm8oc3RydWN0IG1vc3RfY19vYmogKmMpCitzdGF0aWMgYm9vbCBoZG1fbWJvX3JlYWR5KHN0cnVjdCBtb3N0X2Nfb2JqICpjKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IG1ibyAqbWJvOworCWJvb2wgZW1wdHk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+Zmlmb19sb2NrLCBmbGFncyk7Ci0JaWYgKGMtPmVucXVldWVfaGFsdCB8fCBsaXN0X2VtcHR5KCZjLT5oYWx0X2ZpZm8pKQotCQltYm8gPSBOVUxMOwotCWVsc2UKLQkJbWJvID0gbGlzdF9wb3BfbWJvKCZjLT5oYWx0X2ZpZm8pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPmZpZm9fbG9jaywgZmxhZ3MpOwotCXJldHVybiBtYm87CisJaWYgKGMtPmVucXVldWVfaGFsdCkKKwkJcmV0dXJuIGZhbHNlOworCisJc3Bpbl9sb2NrX2lycSgmYy0+Zmlmb19sb2NrKTsKKwllbXB0eSA9IGxpc3RfZW1wdHkoJmMtPmhhbHRfZmlmbyk7CisJc3Bpbl91bmxvY2tfaXJxKCZjLT5maWZvX2xvY2spOworCisJcmV0dXJuICFlbXB0eTsKIH0KIAogc3RhdGljIHZvaWQgbnFfaGRtX21ibyhzdHJ1Y3QgbWJvICptYm8pCkBAIC0xMTYwLDIwICsxMTg0LDMyIEBACiB7CiAJc3RydWN0IG1vc3RfY19vYmogKmMgPSBkYXRhOwogCXN0cnVjdCBtYm8gKm1ibzsKKwlpbnQgcmV0OwogCXR5cGVvZihjLT5pZmFjZS0+ZW5xdWV1ZSkgZW5xdWV1ZSA9IGMtPmlmYWNlLT5lbnF1ZXVlOwogCiAJd2hpbGUgKGxpa2VseSgha3RocmVhZF9zaG91bGRfc3RvcCgpKSkgewogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYy0+aGRtX2ZpZm9fd3EsCi0JCQkJCSAobWJvID0gZ2V0X2hkbV9tYm8oYykpIHx8CisJCQkJCSBoZG1fbWJvX3JlYWR5KGMpIHx8CiAJCQkJCSBrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOwogCi0JCWlmICh1bmxpa2VseSghbWJvKSkKKwkJbXV0ZXhfbG9jaygmYy0+bnFfbXV0ZXgpOworCQlzcGluX2xvY2tfaXJxKCZjLT5maWZvX2xvY2spOworCQlpZiAodW5saWtlbHkoYy0+ZW5xdWV1ZV9oYWx0IHx8IGxpc3RfZW1wdHkoJmMtPmhhbHRfZmlmbykpKSB7CisJCQlzcGluX3VubG9ja19pcnEoJmMtPmZpZm9fbG9jayk7CisJCQltdXRleF91bmxvY2soJmMtPm5xX211dGV4KTsKIAkJCWNvbnRpbnVlOworCQl9CisKKwkJbWJvID0gbGlzdF9wb3BfbWJvKCZjLT5oYWx0X2ZpZm8pOworCQlzcGluX3VubG9ja19pcnEoJmMtPmZpZm9fbG9jayk7CiAKIAkJaWYgKGMtPmNmZy5kaXJlY3Rpb24gPT0gTU9TVF9DSF9SWCkKIAkJCW1iby0+YnVmZmVyX2xlbmd0aCA9IGMtPmNmZy5idWZmZXJfc2l6ZTsKIAotCQlpZiAodW5saWtlbHkoZW5xdWV1ZShtYm8tPmlmcCwgbWJvLT5oZG1fY2hhbm5lbF9pZCwgbWJvKSkpIHsKKwkJcmV0ID0gZW5xdWV1ZShtYm8tPmlmcCwgbWJvLT5oZG1fY2hhbm5lbF9pZCwgbWJvKTsKKwkJbXV0ZXhfdW5sb2NrKCZjLT5ucV9tdXRleCk7CisKKwkJaWYgKHVubGlrZWx5KHJldCkpIHsKIAkJCXByX2VycigiaGRtIGVucXVldWUgZmFpbGVkXG4iKTsKIAkJCW5xX2hkbV9tYm8obWJvKTsKIAkJCWMtPmhkbV9lbnF1ZXVlX3Rhc2sgPSBOVUxMOwpAQCAtMTI5NCwxNyArMTMzMCwxNCBAQAogLyoqCiAgKiBtb3N0X3N1Ym1pdF9tYm8gLSBzdWJtaXRzIGFuIE1CTyB0byBmaWZvCiAgKiBAbWJvOiBwb2ludGVyIHRvIHRoZSBNQk8KLSAqCiAgKi8KLWludCBtb3N0X3N1Ym1pdF9tYm8oc3RydWN0IG1ibyAqbWJvKQordm9pZCBtb3N0X3N1Ym1pdF9tYm8oc3RydWN0IG1ibyAqbWJvKQogewotCWlmICh1bmxpa2VseSgoIW1ibykgfHwgKCFtYm8tPmNvbnRleHQpKSkgewotCQlwcl9lcnIoIkJhZCBNQk8gb3IgbWlzc2luZyBjaGFubmVsIHJlZmVyZW5jZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwlpZiAoV0FSTl9PTkNFKCFtYm8gfHwgIW1iby0+Y29udGV4dCwKKwkJICAgICAgImJhZCBtYm8gb3IgbWlzc2luZyBjaGFubmVsIHJlZmVyZW5jZVxuIikpCisJCXJldHVybjsKIAogCW5xX2hkbV9tYm8obWJvKTsKLQlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1vc3Rfc3VibWl0X21ibyk7CiAKQEAgLTE0NjgsMTAgKzE1MDEsOCBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGF0b21pY19zdWJfYW5kX3Rlc3QoMSwgJmMtPm1ib19ucV9sZXZlbCkpIHsKLQkJcHJfaW5mbygiV0FSTjogcnggZGV2aWNlIG91dCBvZiBidWZmZXJzXG4iKTsKKwlpZiAoYXRvbWljX3N1Yl9hbmRfdGVzdCgxLCAmYy0+bWJvX25xX2xldmVsKSkKIAkJYy0+aXNfc3RhcnZpbmcgPSAxOwotCX0KIAogCWlmIChjLT5haW0wLnJlZnMgJiYgYy0+YWltMC5wdHItPnJ4X2NvbXBsZXRpb24gJiYKIAkgICAgYy0+YWltMC5wdHItPnJ4X2NvbXBsZXRpb24obWJvKSA9PSAwKQpAQCAtMTc2MSw2ICsxNzkyLDcgQEAKIAkJaW5pdF9jb21wbGV0aW9uKCZjLT5jbGVhbnVwKTsKIAkJYXRvbWljX3NldCgmYy0+bWJvX3JlZiwgMCk7CiAJCW11dGV4X2luaXQoJmMtPnN0YXJ0X211dGV4KTsKKwkJbXV0ZXhfaW5pdCgmYy0+bnFfbXV0ZXgpOwogCQlsaXN0X2FkZF90YWlsKCZjLT5saXN0LCAmaW5zdC0+Y2hhbm5lbF9saXN0KTsKIAl9CiAJcHJfaW5mbygicmVnaXN0ZXJlZCBuZXcgTU9TVCBkZXZpY2UgbWRldiVkICglcylcbiIsCkBAIC0xODI2LDggKzE4NTgsMTIgQEAKIHsKIAlzdHJ1Y3QgbW9zdF9jX29iaiAqYyA9IGdldF9jaGFubmVsX2J5X2lmYWNlKGlmYWNlLCBpZCk7CiAKLQlpZiAobGlrZWx5KGMpKQotCQljLT5lbnF1ZXVlX2hhbHQgPSB0cnVlOworCWlmICghYykKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmYy0+bnFfbXV0ZXgpOworCWMtPmVucXVldWVfaGFsdCA9IHRydWU7CisJbXV0ZXhfdW5sb2NrKCZjLT5ucV9tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtb3N0X3N0b3BfZW5xdWV1ZSk7CiAKQEAgLTE4NDMsOSArMTg3OSwxMiBAQAogewogCXN0cnVjdCBtb3N0X2Nfb2JqICpjID0gZ2V0X2NoYW5uZWxfYnlfaWZhY2UoaWZhY2UsIGlkKTsKIAotCWlmICh1bmxpa2VseSghYykpCisJaWYgKCFjKQogCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZjLT5ucV9tdXRleCk7CiAJYy0+ZW5xdWV1ZV9oYWx0ID0gZmFsc2U7CisJbXV0ZXhfdW5sb2NrKCZjLT5ucV9tdXRleCk7CiAKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmMtPmhkbV9maWZvX3dxKTsKIH0KQEAgLTE4NzksMjIgKzE5MTgsMTkgQEAKIAkJZ290byBleGl0X2NsYXNzOwogCX0KIAotCWNsYXNzX2dsdWVfZGlyID0KLQkJZGV2aWNlX2NyZWF0ZShtb3N0X2NsYXNzLCBOVUxMLCAwLCBOVUxMLCAibW9zdGNvcmUiKTsKLQlpZiAoSVNfRVJSKGNsYXNzX2dsdWVfZGlyKSkgewotCQllcnIgPSBQVFJfRVJSKGNsYXNzX2dsdWVfZGlyKTsKKwljb3JlX2RldiA9IGRldmljZV9jcmVhdGUobW9zdF9jbGFzcywgTlVMTCwgMCwgTlVMTCwgIm1vc3Rjb3JlIik7CisJaWYgKElTX0VSUihjb3JlX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihjb3JlX2Rldik7CiAJCWdvdG8gZXhpdF9kcml2ZXI7CiAJfQogCi0JbW9zdF9haW1fa3NldCA9Ci0JCWtzZXRfY3JlYXRlX2FuZF9hZGQoImFpbXMiLCBOVUxMLCAmY2xhc3NfZ2x1ZV9kaXItPmtvYmopOworCW1vc3RfYWltX2tzZXQgPSBrc2V0X2NyZWF0ZV9hbmRfYWRkKCJhaW1zIiwgTlVMTCwgJmNvcmVfZGV2LT5rb2JqKTsKIAlpZiAoIW1vc3RfYWltX2tzZXQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBleGl0X2NsYXNzX2NvbnRhaW5lcjsKIAl9CiAKLQltb3N0X2luc3Rfa3NldCA9Ci0JCWtzZXRfY3JlYXRlX2FuZF9hZGQoImRldmljZXMiLCBOVUxMLCAmY2xhc3NfZ2x1ZV9kaXItPmtvYmopOworCW1vc3RfaW5zdF9rc2V0ID0ga3NldF9jcmVhdGVfYW5kX2FkZCgiZGV2aWNlcyIsIE5VTEwsICZjb3JlX2Rldi0+a29iaik7CiAJaWYgKCFtb3N0X2luc3Rfa3NldCkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGV4aXRfZHJpdmVyX2tzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9tb3N0Y29yZS9tb3N0Y29yZS5oIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvbW9zdGNvcmUvbW9zdGNvcmUuaAppbmRleCA2MGUwMThlLi41ZjgzMzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9tb3N0Y29yZS9tb3N0Y29yZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L21vc3Rjb3JlL21vc3Rjb3JlLmgKQEAgLTU2LDcgKzU2LDcgQEAKIGVudW0gbW9zdF9jaGFubmVsX2RhdGFfdHlwZSB7CiAJTU9TVF9DSF9DT05UUk9MID0gMSA8PCAwLAogCU1PU1RfQ0hfQVNZTkMgPSAxIDw8IDEsCi0JTU9TVF9DSF9JU09DX0FWUCA9IDEgPDwgMiwKKwlNT1NUX0NIX0lTT0MgPSAxIDw8IDIsCiAJTU9TVF9DSF9TWU5DID0gMSA8PCA1LAogfTsKIApAQCAtMTEyLDcgKzExMiw3IEBACiAJdTE2IGJ1ZmZlcl9zaXplX3BhY2tldDsKIAl1MTYgbnVtX2J1ZmZlcnNfc3RyZWFtaW5nOwogCXUxNiBidWZmZXJfc2l6ZV9zdHJlYW1pbmc7Ci0JY2hhciAqbmFtZV9zdWZmaXg7CisJY29uc3QgY2hhciAqbmFtZV9zdWZmaXg7CiB9OwogCiAvKioKQEAgLTI4Nyw3ICsyODcsNyBAQAogICogQGludGZfaW5zdGFuY2UgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIGluc3RhbmNlIGRlc2NyaXB0aW9uLgogICovCiB2b2lkIG1vc3RfZGVyZWdpc3Rlcl9pbnRlcmZhY2Uoc3RydWN0IG1vc3RfaW50ZXJmYWNlICppZmFjZSk7Ci1pbnQgbW9zdF9zdWJtaXRfbWJvKHN0cnVjdCBtYm8gKm1ibyk7Cit2b2lkIG1vc3Rfc3VibWl0X21ibyhzdHJ1Y3QgbWJvICptYm8pOwogCiAvKioKICAqIG1vc3Rfc3RvcF9lbnF1ZXVlIC0gcHJldmVudHMgY29yZSBmcm9tIGVucXVlaW5nIE1CT3MKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9uZXRsb2dpYy94bHJfbmV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbmV0bG9naWMveGxyX25ldC5jCmluZGV4IDk5NDQ1ZDAuLjU1MmE3ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9uZXRsb2dpYy94bHJfbmV0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL25ldGxvZ2ljL3hscl9uZXQuYwpAQCAtMTkyLDcgKzE5Miw3IEBACiAJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocGh5ZGV2LCBlY21kKTsKIH0KIAotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB4bHJfZXRodG9vbF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHhscl9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X3NldHRpbmdzID0geGxyX2dldF9zZXR0aW5ncywKIAkuc2V0X3NldHRpbmdzID0geGxyX3NldF9zZXR0aW5ncywKIH07CkBAIC0yNjksMTYgKzI2OSw2IEBACiAJbXNnLT5tc2czID0gMDsKIH0KIAotc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgeGxyX3dha2V1cF9xdWV1ZSh1bnNpZ25lZCBsb25nIGRldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldjsKLQlzdHJ1Y3QgeGxyX25ldF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHhscl9nZXRfcGh5ZGV2KHByaXYpOwotCi0JaWYgKHBoeWRldi0+bGluaykKLQkJbmV0aWZfdHhfd2FrZV9xdWV1ZShuZXRkZXZfZ2V0X3R4X3F1ZXVlKG5kZXYsIHByaXYtPndha2V1cF9xKSk7Ci19Ci0KIHN0YXRpYyBuZXRkZXZfdHhfdCB4bHJfbmV0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKQEAgLTQxMyw3ICs0MDMsNyBAQAogCXJldHVybiBzdGF0czsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wcyB4bHJfbmV0ZGV2X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgeGxyX25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuID0geGxyX25ldF9vcGVuLAogCS5uZG9fc3RvcCA9IHhscl9uZXRfc3RvcCwKIAkubmRvX3N0YXJ0X3htaXQgPSB4bHJfbmV0X3N0YXJ0X3htaXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi11c2IvS2NvbmZpZwppbmRleCAxNmVhMTdmLi4wYjhmMWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24tdXNiL0tjb25maWcKQEAgLTYsNSArNiw1IEBACiAJICBOZXR3b3JrcycgcHJvZHVjdHMgaW4gdGhlIE9jdGVvbiBmYW1pbHkuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIG9jdGVvbi11c2IuCisJICB3aWxsIGJlIGNhbGxlZCBvY3Rlb24taGNkLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9vY3Rlb24taGNkLmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9vY3Rlb24taGNkLmMKaW5kZXggMTc0NDJiMy4uOWE3ODU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi11c2Ivb2N0ZW9uLWhjZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24tdXNiL29jdGVvbi1oY2QuYwpAQCAtMzI5Miw3ICszMjkyLDYgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdXNiLT5sb2NrLCBmbGFncyk7CiAJcG9ydF9zdGF0dXMgPSBjdm14X3VzYl9nZXRfc3RhdHVzKHVzYik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiLT5sb2NrLCBmbGFncyk7Ci0JYnVmWzBdID0gMDsKIAlidWZbMF0gPSBwb3J0X3N0YXR1cy5jb25uZWN0X2NoYW5nZSA8PCAxOwogCiAJcmV0dXJuIGJ1ZlswXSAhPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1kaW8uYwppbmRleCBlMTNhNGFiLi42OTFlNGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1kaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1kaW8uYwpAQCAtMzQsNDggKzM0LDIzIEBACiAJc3RybGNweShpbmZvLT5idXNfaW5mbywgIkJ1aWx0aW4iLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAotc3RhdGljIGludCBjdm1fb2N0X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmIChwcml2LT5waHlkZXYpCi0JCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KHByaXYtPnBoeWRldiwgY21kKTsKLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IGN2bV9vY3Rfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQotewotCXN0cnVjdCBvY3Rlb25fZXRoZXJuZXQgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JaWYgKHByaXYtPnBoeWRldikKLQkJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocHJpdi0+cGh5ZGV2LCBjbWQpOwotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KIHN0YXRpYyBpbnQgY3ZtX29jdF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG9jdGVvbl9ldGhlcm5ldCAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0KIAlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKLQlpZiAocHJpdi0+cGh5ZGV2KQotCQlyZXR1cm4gcGh5X3N0YXJ0X2FuZWcocHJpdi0+cGh5ZGV2KTsKKwlpZiAoZGV2LT5waHlkZXYpCisJCXJldHVybiBwaHlfc3RhcnRfYW5lZyhkZXYtPnBoeWRldik7CiAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAogY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGN2bV9vY3RfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvID0gY3ZtX29jdF9nZXRfZHJ2aW5mbywKLQkuZ2V0X3NldHRpbmdzID0gY3ZtX29jdF9nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncyA9IGN2bV9vY3Rfc2V0X3NldHRpbmdzLAogCS5ud2F5X3Jlc2V0ID0gY3ZtX29jdF9ud2F5X3Jlc2V0LAogCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9saW5rX2tzZXR0aW5ncyA9IHBoeV9ldGh0b29sX2dldF9saW5rX2tzZXR0aW5ncywKKwkuc2V0X2xpbmtfa3NldHRpbmdzID0gcGh5X2V0aHRvb2xfc2V0X2xpbmtfa3NldHRpbmdzLAogfTsKIAogLyoqCkBAIC04OCwxNSArNjMsMTMgQEAKICAqLwogaW50IGN2bV9vY3RfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKIHsKLQlzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghcHJpdi0+cGh5ZGV2KQorCWlmICghZGV2LT5waHlkZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIHBoeV9taWlfaW9jdGwocHJpdi0+cGh5ZGV2LCBycSwgY21kKTsKKwlyZXR1cm4gcGh5X21paV9pb2N0bChkZXYtPnBoeWRldiwgcnEsIGNtZCk7CiB9CiAKIHZvaWQgY3ZtX29jdF9ub3RlX2NhcnJpZXIoc3RydWN0IG9jdGVvbl9ldGhlcm5ldCAqcHJpdiwKQEAgLTExOSw5ICs5Miw5IEBACiAJY3ZteF9oZWxwZXJfbGlua19pbmZvX3QgbGlua19pbmZvOwogCiAJbGlua19pbmZvLnU2NAkJPSAwOwotCWxpbmtfaW5mby5zLmxpbmtfdXAJPSBwcml2LT5waHlkZXYtPmxpbmsgPyAxIDogMDsKLQlsaW5rX2luZm8ucy5mdWxsX2R1cGxleCA9IHByaXYtPnBoeWRldi0+ZHVwbGV4ID8gMSA6IDA7Ci0JbGlua19pbmZvLnMuc3BlZWQJPSBwcml2LT5waHlkZXYtPnNwZWVkOworCWxpbmtfaW5mby5zLmxpbmtfdXAJPSBkZXYtPnBoeWRldi0+bGluayA/IDEgOiAwOworCWxpbmtfaW5mby5zLmZ1bGxfZHVwbGV4ID0gZGV2LT5waHlkZXYtPmR1cGxleCA/IDEgOiAwOworCWxpbmtfaW5mby5zLnNwZWVkCT0gZGV2LT5waHlkZXYtPnNwZWVkOwogCXByaXYtPmxpbmtfaW5mbwkJPSBsaW5rX2luZm8udTY0OwogCiAJLyoKQEAgLTEzMCw4ICsxMDMsOCBAQAogCWlmIChwcml2LT5wb2xsKQogCQlwcml2LT5wb2xsKGRldik7CiAKLQlpZiAocHJpdi0+bGFzdF9saW5rICE9IHByaXYtPnBoeWRldi0+bGluaykgewotCQlwcml2LT5sYXN0X2xpbmsgPSBwcml2LT5waHlkZXYtPmxpbms7CisJaWYgKHByaXYtPmxhc3RfbGluayAhPSBkZXYtPnBoeWRldi0+bGluaykgeworCQlwcml2LT5sYXN0X2xpbmsgPSBkZXYtPnBoeWRldi0+bGluazsKIAkJY3ZteF9oZWxwZXJfbGlua19zZXQocHJpdi0+cG9ydCwgbGlua19pbmZvKTsKIAkJY3ZtX29jdF9ub3RlX2NhcnJpZXIocHJpdiwgbGlua19pbmZvKTsKIAl9CkBAIC0xNTEsOSArMTI0LDggQEAKIAogCXByaXYtPnBvbGwgPSBOVUxMOwogCi0JaWYgKHByaXYtPnBoeWRldikKLQkJcGh5X2Rpc2Nvbm5lY3QocHJpdi0+cGh5ZGV2KTsKLQlwcml2LT5waHlkZXYgPSBOVUxMOworCWlmIChkZXYtPnBoeWRldikKKwkJcGh5X2Rpc2Nvbm5lY3QoZGV2LT5waHlkZXYpOwogCiAJaWYgKHByaXYtPmxhc3RfbGluaykgewogCQlsaW5rX2luZm8udTY0ID0gMDsKQEAgLTE3Niw2ICsxNDgsNyBAQAogewogCXN0cnVjdCBvY3Rlb25fZXRoZXJuZXQgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGh5X25vZGU7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IE5VTEw7CiAKIAlpZiAoIXByaXYtPm9mX25vZGUpCiAJCWdvdG8gbm9fcGh5OwpAQCAtMTkzLDE0ICsxNjYsMTUgQEAKIAlpZiAoIXBoeV9ub2RlKQogCQlnb3RvIG5vX3BoeTsKIAotCXByaXYtPnBoeWRldiA9IG9mX3BoeV9jb25uZWN0KGRldiwgcGh5X25vZGUsIGN2bV9vY3RfYWRqdXN0X2xpbmssIDAsCi0JCQkJICAgICAgUEhZX0lOVEVSRkFDRV9NT0RFX0dNSUkpOworCXBoeWRldiA9IG9mX3BoeV9jb25uZWN0KGRldiwgcGh5X25vZGUsIGN2bV9vY3RfYWRqdXN0X2xpbmssIDAsCisJCQkJUEhZX0lOVEVSRkFDRV9NT0RFX0dNSUkpOworCW9mX25vZGVfcHV0KHBoeV9ub2RlKTsKIAotCWlmICghcHJpdi0+cGh5ZGV2KQorCWlmICghcGh5ZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXByaXYtPmxhc3RfbGluayA9IDA7Ci0JcGh5X3N0YXJ0X2FuZWcocHJpdi0+cGh5ZGV2KTsKKwlwaHlfc3RhcnRfYW5lZyhwaHlkZXYpOwogCiAJcmV0dXJuIDA7CiBub19waHk6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJnbWlpLmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJnbWlpLmMKaW5kZXggOTFiMTQ4Yy4uNGU3MzA0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1yZ21paS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtcmdtaWkuYwpAQCAtMTE3LDcgKzExNywxMCBAQAogCWN2bXhfaGVscGVyX2xpbmtfaW5mb190IGxpbmtfaW5mbzsKIAlib29sIHN0YXR1c19jaGFuZ2U7CiAKLQlsaW5rX2luZm8gPSBjdm14X2hlbHBlcl9saW5rX2F1dG9jb25mKHByaXYtPnBvcnQpOworCWxpbmtfaW5mbyA9IGN2bXhfaGVscGVyX2xpbmtfZ2V0KHByaXYtPnBvcnQpOworCWlmIChwcml2LT5saW5rX2luZm8gIT0gbGlua19pbmZvLnU2NCAmJgorCSAgICBjdm14X2hlbHBlcl9saW5rX3NldChwcml2LT5wb3J0LCBsaW5rX2luZm8pKQorCQlsaW5rX2luZm8udTY0ID0gcHJpdi0+bGlua19pbmZvOwogCXN0YXR1c19jaGFuZ2UgPSBwcml2LT5saW5rX2luZm8gIT0gbGlua19pbmZvLnU2NDsKIAlwcml2LT5saW5rX2luZm8gPSBsaW5rX2luZm8udTY0OwogCkBAIC0xNDUsNyArMTQ4LDcgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHByaXYtPnBoeWRldikgeworCWlmIChkZXYtPnBoeWRldikgewogCQkvKgogCQkgKiBJbiBwaHlkZXYgbW9kZSwgd2UgbmVlZCBzdGlsbCBwZXJpb2RpYyBwb2xsaW5nIGZvciB0aGUKIAkJICogcHJlYW1ibGUgZXJyb3IgY2hlY2tpbmcsIGFuZCB3ZSBhbHNvIG5lZWQgdG8gY2FsbCB0aGlzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJ4LmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJ4LmMKaW5kZXggYTEwZmUzYS4uZjA5MDBkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1yeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtcnguYwpAQCAtNDMsMjEgKzQzLDI3IEBACiAKICNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtZ214eC1kZWZzLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgbmFwaV9zdHJ1Y3QgY3ZtX29jdF9uYXBpOworc3RhdGljIGF0b21pY190IG9jdF9yeF9yZWFkeSA9IEFUT01JQ19JTklUKDApOworCitzdGF0aWMgc3RydWN0IG9jdF9yeF9ncm91cCB7CisJaW50IGlycTsKKwlpbnQgZ3JvdXA7CisJc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7Cit9IG9jdF9yeF9ncm91cFsxNl07CiAKIC8qKgogICogY3ZtX29jdF9kb19pbnRlcnJ1cHQgLSBpbnRlcnJ1cHQgaGFuZGxlci4KLSAqIEBjcGw6IEludGVycnVwdCBudW1iZXIuIFVudXNlZAotICogQGRldl9pZDogQ29va2llIHRvIGlkZW50aWZ5IHRoZSBkZXZpY2UuIFVudXNlZAorICogQGlycTogSW50ZXJydXB0IG51bWJlci4KKyAqIEBuYXBpX2lkOiBDb29raWUgdG8gaWRlbnRpZnkgdGhlIE5BUEkgaW5zdGFuY2UuCiAgKgogICogVGhlIGludGVycnVwdCBvY2N1cnMgd2hlbmV2ZXIgdGhlIFBPVyBoYXMgcGFja2V0cyBpbiBvdXIgZ3JvdXAuCiAgKgogICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgY3ZtX29jdF9kb19pbnRlcnJ1cHQoaW50IGNwbCwgdm9pZCAqZGV2X2lkKQorc3RhdGljIGlycXJldHVybl90IGN2bV9vY3RfZG9faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKm5hcGlfaWQpCiB7CiAJLyogRGlzYWJsZSB0aGUgSVJRIGFuZCBzdGFydCBuYXBpX3BvbGwuICovCi0JZGlzYWJsZV9pcnFfbm9zeW5jKE9DVEVPTl9JUlFfV09SS1EwICsgcG93X3JlY2VpdmVfZ3JvdXApOwotCW5hcGlfc2NoZWR1bGUoJmN2bV9vY3RfbmFwaSk7CisJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CisJbmFwaV9zY2hlZHVsZShuYXBpX2lkKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTE0MywxNCArMTQ5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoqCi0gKiBjdm1fb2N0X25hcGlfcG9sbCAtIHRoZSBOQVBJIHBvbGwgZnVuY3Rpb24uCi0gKiBAbmFwaTogVGhlIE5BUEkgaW5zdGFuY2UsIG9yIG51bGwgaWYgY2FsbGVkIGZyb20gY3ZtX29jdF9wb2xsX2NvbnRyb2xsZXIKLSAqIEBidWRnZXQ6IE1heGltdW0gbnVtYmVyIG9mIHBhY2tldHMgdG8gcmVjZWl2ZS4KLSAqCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFja2V0cyBwcm9jZXNzZWQuCi0gKi8KLXN0YXRpYyBpbnQgY3ZtX29jdF9uYXBpX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQorc3RhdGljIGludCBjdm1fb2N0X3BvbGwoc3RydWN0IG9jdF9yeF9ncm91cCAqcnhfZ3JvdXAsIGludCBidWRnZXQpCiB7CiAJY29uc3QgaW50CWNvcmVpZCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCk7CiAJdTY0CW9sZF9ncm91cF9tYXNrOwpAQCAtMTcyLDEzICsxNzEsMTMgQEAKIAlpZiAoT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjY4WFgpKSB7CiAJCW9sZF9ncm91cF9tYXNrID0gY3ZteF9yZWFkX2NzcihDVk1YX1NTT19QUFhfR1JQX01TSyhjb3JlaWQpKTsKIAkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9TU09fUFBYX0dSUF9NU0soY29yZWlkKSwKLQkJCSAgICAgICAxdWxsIDw8IHBvd19yZWNlaXZlX2dyb3VwKTsKKwkJCSAgICAgICBCSVQocnhfZ3JvdXAtPmdyb3VwKSk7CiAJCWN2bXhfcmVhZF9jc3IoQ1ZNWF9TU09fUFBYX0dSUF9NU0soY29yZWlkKSk7IC8qIEZsdXNoICovCiAJfSBlbHNlIHsKIAkJb2xkX2dyb3VwX21hc2sgPSBjdm14X3JlYWRfY3NyKENWTVhfUE9XX1BQX0dSUF9NU0tYKGNvcmVpZCkpOwogCQljdm14X3dyaXRlX2NzcihDVk1YX1BPV19QUF9HUlBfTVNLWChjb3JlaWQpLAogCQkJICAgICAgIChvbGRfZ3JvdXBfbWFzayAmIH4weEZGRkZ1bGwpIHwKLQkJCSAgICAgICAxIDw8IHBvd19yZWNlaXZlX2dyb3VwKTsKKwkJCSAgICAgICBCSVQocnhfZ3JvdXAtPmdyb3VwKSk7CiAJfQogCiAJaWYgKFVTRV9BU1lOQ19JT0JETUEpIHsKQEAgLTIwMywxNSArMjAyLDE1IEBACiAJCWlmICghd29yaykgewogCQkJaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ042OFhYKSkgewogCQkJCWN2bXhfd3JpdGVfY3NyKENWTVhfU1NPX1dRX0lRX0RJUywKLQkJCQkJICAgICAgIDF1bGwgPDwgcG93X3JlY2VpdmVfZ3JvdXApOworCQkJCQkgICAgICAgQklUKHJ4X2dyb3VwLT5ncm91cCkpOwogCQkJCWN2bXhfd3JpdGVfY3NyKENWTVhfU1NPX1dRX0lOVCwKLQkJCQkJICAgICAgIDF1bGwgPDwgcG93X3JlY2VpdmVfZ3JvdXApOworCQkJCQkgICAgICAgQklUKHJ4X2dyb3VwLT5ncm91cCkpOwogCQkJfSBlbHNlIHsKIAkJCQl1bmlvbiBjdm14X3Bvd193cV9pbnQgd3FfaW50OwogCiAJCQkJd3FfaW50LnU2NCA9IDA7Ci0JCQkJd3FfaW50LnMuaXFfZGlzID0gMSA8PCBwb3dfcmVjZWl2ZV9ncm91cDsKLQkJCQl3cV9pbnQucy53cV9pbnQgPSAxIDw8IHBvd19yZWNlaXZlX2dyb3VwOworCQkJCXdxX2ludC5zLmlxX2RpcyA9IEJJVChyeF9ncm91cC0+Z3JvdXApOworCQkJCXdxX2ludC5zLndxX2ludCA9IEJJVChyeF9ncm91cC0+Z3JvdXApOwogCQkJCWN2bXhfd3JpdGVfY3NyKENWTVhfUE9XX1dRX0lOVCwgd3FfaW50LnU2NCk7CiAJCQl9CiAJCQlicmVhazsKQEAgLTQxMCwxMCArNDA5LDI4IEBACiAJfQogCWN2bV9vY3RfcnhfcmVmaWxsX3Bvb2woMCk7CiAKLQlpZiAocnhfY291bnQgPCBidWRnZXQgJiYgbmFwaSkgeworCXJldHVybiByeF9jb3VudDsKK30KKworLyoqCisgKiBjdm1fb2N0X25hcGlfcG9sbCAtIHRoZSBOQVBJIHBvbGwgZnVuY3Rpb24uCisgKiBAbmFwaTogVGhlIE5BUEkgaW5zdGFuY2UuCisgKiBAYnVkZ2V0OiBNYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIHRvIHJlY2VpdmUuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgcHJvY2Vzc2VkLgorICovCitzdGF0aWMgaW50IGN2bV9vY3RfbmFwaV9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3Qgb2N0X3J4X2dyb3VwICpyeF9ncm91cCA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3Qgb2N0X3J4X2dyb3VwLAorCQkJCQkJICAgICBuYXBpKTsKKwlpbnQgcnhfY291bnQ7CisKKwlyeF9jb3VudCA9IGN2bV9vY3RfcG9sbChyeF9ncm91cCwgYnVkZ2V0KTsKKworCWlmIChyeF9jb3VudCA8IGJ1ZGdldCkgewogCQkvKiBObyBtb3JlIHdvcmsgKi8KIAkJbmFwaV9jb21wbGV0ZShuYXBpKTsKLQkJZW5hYmxlX2lycShPQ1RFT05fSVJRX1dPUktRMCArIHBvd19yZWNlaXZlX2dyb3VwKTsKKwkJZW5hYmxlX2lycShyeF9ncm91cC0+aXJxKTsKIAl9CiAJcmV0dXJuIHJ4X2NvdW50OwogfQpAQCAtNDI3LDcgKzQ0NCwxNyBAQAogICovCiB2b2lkIGN2bV9vY3RfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JY3ZtX29jdF9uYXBpX3BvbGwoTlVMTCwgMTYpOworCWludCBpOworCisJaWYgKCFhdG9taWNfcmVhZCgmb2N0X3J4X3JlYWR5KSkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob2N0X3J4X2dyb3VwKTsgaSsrKSB7CisJCWlmICghKHBvd19yZWNlaXZlX2dyb3VwcyAmIEJJVChpKSkpCisJCQljb250aW51ZTsKKworCQljdm1fb2N0X3BvbGwoJm9jdF9yeF9ncm91cFtpXSwgMTYpOworCX0KIH0KICNlbmRpZgogCkBAIC00NDYsNTQgKzQ3Myw4MCBAQAogCWlmICghZGV2X2Zvcl9uYXBpKQogCQlwYW5pYygiTm8gbmV0X2RldmljZXMgd2VyZSBhbGxvY2F0ZWQuIik7CiAKLQluZXRpZl9uYXBpX2FkZChkZXZfZm9yX25hcGksICZjdm1fb2N0X25hcGksIGN2bV9vY3RfbmFwaV9wb2xsLAotCQkgICAgICAgcnhfbmFwaV93ZWlnaHQpOwotCW5hcGlfZW5hYmxlKCZjdm1fb2N0X25hcGkpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9jdF9yeF9ncm91cCk7IGkrKykgeworCQlpbnQgcmV0OwogCi0JLyogUmVnaXN0ZXIgYW4gSVJRIGhhbmRsZXIgdG8gcmVjZWl2ZSBQT1cgaW50ZXJydXB0cyAqLwotCWkgPSByZXF1ZXN0X2lycShPQ1RFT05fSVJRX1dPUktRMCArIHBvd19yZWNlaXZlX2dyb3VwLAotCQkJY3ZtX29jdF9kb19pbnRlcnJ1cHQsIDAsICJFdGhlcm5ldCIsIGN2bV9vY3RfZGV2aWNlKTsKKwkJaWYgKCEocG93X3JlY2VpdmVfZ3JvdXBzICYgQklUKGkpKSkKKwkJCWNvbnRpbnVlOwogCi0JaWYgKGkpCi0JCXBhbmljKCJDb3VsZCBub3QgYWNxdWlyZSBFdGhlcm5ldCBJUlEgJWRcbiIsCi0JCSAgICAgIE9DVEVPTl9JUlFfV09SS1EwICsgcG93X3JlY2VpdmVfZ3JvdXApOworCQluZXRpZl9uYXBpX2FkZChkZXZfZm9yX25hcGksICZvY3RfcnhfZ3JvdXBbaV0ubmFwaSwKKwkJCSAgICAgICBjdm1fb2N0X25hcGlfcG9sbCwgcnhfbmFwaV93ZWlnaHQpOworCQluYXBpX2VuYWJsZSgmb2N0X3J4X2dyb3VwW2ldLm5hcGkpOwogCi0JZGlzYWJsZV9pcnFfbm9zeW5jKE9DVEVPTl9JUlFfV09SS1EwICsgcG93X3JlY2VpdmVfZ3JvdXApOworCQlvY3RfcnhfZ3JvdXBbaV0uaXJxID0gT0NURU9OX0lSUV9XT1JLUTAgKyBpOworCQlvY3RfcnhfZ3JvdXBbaV0uZ3JvdXAgPSBpOwogCi0JLyogRW5hYmxlIFBPVyBpbnRlcnJ1cHQgd2hlbiBvdXIgcG9ydCBoYXMgYXQgbGVhc3Qgb25lIHBhY2tldCAqLwotCWlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONjhYWCkpIHsKLQkJdW5pb24gY3ZteF9zc29fd3FfaW50X3RocnggaW50X3RocjsKLQkJdW5pb24gY3ZteF9wb3dfd3FfaW50X3BjIGludF9wYzsKKwkJLyogUmVnaXN0ZXIgYW4gSVJRIGhhbmRsZXIgdG8gcmVjZWl2ZSBQT1cgaW50ZXJydXB0cyAqLworCQlyZXQgPSByZXF1ZXN0X2lycShvY3RfcnhfZ3JvdXBbaV0uaXJxLCBjdm1fb2N0X2RvX2ludGVycnVwdCwgMCwKKwkJCQkgICJFdGhlcm5ldCIsICZvY3RfcnhfZ3JvdXBbaV0ubmFwaSk7CisJCWlmIChyZXQpCisJCQlwYW5pYygiQ291bGQgbm90IGFjcXVpcmUgRXRoZXJuZXQgSVJRICVkXG4iLAorCQkJICAgICAgb2N0X3J4X2dyb3VwW2ldLmlycSk7CiAKLQkJaW50X3Roci51NjQgPSAwOwotCQlpbnRfdGhyLnMudGNfZW4gPSAxOwotCQlpbnRfdGhyLnMudGNfdGhyID0gMTsKLQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9TU09fV1FfSU5UX1RIUlgocG93X3JlY2VpdmVfZ3JvdXApLAotCQkJICAgICAgIGludF90aHIudTY0KTsKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKG9jdF9yeF9ncm91cFtpXS5pcnEpOwogCi0JCWludF9wYy51NjQgPSAwOwotCQlpbnRfcGMucy5wY190aHIgPSA1OwotCQljdm14X3dyaXRlX2NzcihDVk1YX1NTT19XUV9JTlRfUEMsIGludF9wYy51NjQpOwotCX0gZWxzZSB7Ci0JCXVuaW9uIGN2bXhfcG93X3dxX2ludF90aHJ4IGludF90aHI7Ci0JCXVuaW9uIGN2bXhfcG93X3dxX2ludF9wYyBpbnRfcGM7CisJCS8qIEVuYWJsZSBQT1cgaW50ZXJydXB0IHdoZW4gb3VyIHBvcnQgaGFzIGF0IGxlYXN0IG9uZSBwYWNrZXQgKi8KKwkJaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ042OFhYKSkgeworCQkJdW5pb24gY3ZteF9zc29fd3FfaW50X3RocnggaW50X3RocjsKKwkJCXVuaW9uIGN2bXhfcG93X3dxX2ludF9wYyBpbnRfcGM7CiAKLQkJaW50X3Roci51NjQgPSAwOwotCQlpbnRfdGhyLnMudGNfZW4gPSAxOwotCQlpbnRfdGhyLnMudGNfdGhyID0gMTsKLQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9QT1dfV1FfSU5UX1RIUlgocG93X3JlY2VpdmVfZ3JvdXApLAotCQkJICAgICAgIGludF90aHIudTY0KTsKKwkJCWludF90aHIudTY0ID0gMDsKKwkJCWludF90aHIucy50Y19lbiA9IDE7CisJCQlpbnRfdGhyLnMudGNfdGhyID0gMTsKKwkJCWN2bXhfd3JpdGVfY3NyKENWTVhfU1NPX1dRX0lOVF9USFJYKGkpLCBpbnRfdGhyLnU2NCk7CiAKLQkJaW50X3BjLnU2NCA9IDA7Ci0JCWludF9wYy5zLnBjX3RociA9IDU7Ci0JCWN2bXhfd3JpdGVfY3NyKENWTVhfUE9XX1dRX0lOVF9QQywgaW50X3BjLnU2NCk7CisJCQlpbnRfcGMudTY0ID0gMDsKKwkJCWludF9wYy5zLnBjX3RociA9IDU7CisJCQljdm14X3dyaXRlX2NzcihDVk1YX1NTT19XUV9JTlRfUEMsIGludF9wYy51NjQpOworCQl9IGVsc2UgeworCQkJdW5pb24gY3ZteF9wb3dfd3FfaW50X3RocnggaW50X3RocjsKKwkJCXVuaW9uIGN2bXhfcG93X3dxX2ludF9wYyBpbnRfcGM7CisKKwkJCWludF90aHIudTY0ID0gMDsKKwkJCWludF90aHIucy50Y19lbiA9IDE7CisJCQlpbnRfdGhyLnMudGNfdGhyID0gMTsKKwkJCWN2bXhfd3JpdGVfY3NyKENWTVhfUE9XX1dRX0lOVF9USFJYKGkpLCBpbnRfdGhyLnU2NCk7CisKKwkJCWludF9wYy51NjQgPSAwOworCQkJaW50X3BjLnMucGNfdGhyID0gNTsKKwkJCWN2bXhfd3JpdGVfY3NyKENWTVhfUE9XX1dRX0lOVF9QQywgaW50X3BjLnU2NCk7CisJCX0KKworCQkvKiBTY2hlZHVsZSBOQVBJIG5vdy4gVGhpcyB3aWxsIGluZGlyZWN0bHkgZW5hYmxlIHRoZQorCQkgKiBpbnRlcnJ1cHQuCisJCSAqLworCQluYXBpX3NjaGVkdWxlKCZvY3RfcnhfZ3JvdXBbaV0ubmFwaSk7CiAJfQotCi0JLyogU2NoZWR1bGUgTkFQSSBub3cuIFRoaXMgd2lsbCBpbmRpcmVjdGx5IGVuYWJsZSB0aGUgaW50ZXJydXB0LiAqLwotCW5hcGlfc2NoZWR1bGUoJmN2bV9vY3RfbmFwaSk7CisJYXRvbWljX2luYygmb2N0X3J4X3JlYWR5KTsKIH0KIAogdm9pZCBjdm1fb2N0X3J4X3NodXRkb3duKHZvaWQpCiB7Ci0JbmV0aWZfbmFwaV9kZWwoJmN2bV9vY3RfbmFwaSk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvY3RfcnhfZ3JvdXApOyBpKyspIHsKKwkJaWYgKCEocG93X3JlY2VpdmVfZ3JvdXBzICYgQklUKGkpKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIERpc2FibGUgUE9XIGludGVycnVwdCAqLworCQlpZiAoT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjY4WFgpKQorCQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9TU09fV1FfSU5UX1RIUlgoaSksIDApOworCQllbHNlCisJCQljdm14X3dyaXRlX2NzcihDVk1YX1BPV19XUV9JTlRfVEhSWChpKSwgMCk7CisKKwkJLyogRnJlZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwkJZnJlZV9pcnEob2N0X3J4X2dyb3VwW2ldLmlycSwgY3ZtX29jdF9kZXZpY2UpOworCisJCW5ldGlmX25hcGlfZGVsKCZvY3RfcnhfZ3JvdXBbaV0ubmFwaSk7CisJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC11dGlsLmggYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXV0aWwuaAppbmRleCA0NWYwMjRiLi42MTdkYTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXV0aWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXV0aWwuaApAQCAtMzIsMTIgKzMyLDEzIEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IElOVEVSRkFDRShpbnQgaXBkX3BvcnQpCiB7Ci0JaW50IGludGVyZmFjZSA9IGN2bXhfaGVscGVyX2dldF9pbnRlcmZhY2VfbnVtKGlwZF9wb3J0KTsKKwlpbnQgaW50ZXJmYWNlOwogCisJaWYgKGlwZF9wb3J0ID09IENWTVhfUElQX05VTV9JTlBVVF9QT1JUUykKKwkJcmV0dXJuIDEwOworCWludGVyZmFjZSA9IGN2bXhfaGVscGVyX2dldF9pbnRlcmZhY2VfbnVtKGlwZF9wb3J0KTsKIAlpZiAoaW50ZXJmYWNlID49IDApCiAJCXJldHVybiBpbnRlcmZhY2U7Ci0JZWxzZSBpZiAoaXBkX3BvcnQgPT0gQ1ZNWF9QSVBfTlVNX0lOUFVUX1BPUlRTKQotCQlyZXR1cm4gMTA7CiAJcGFuaWMoIklsbGVnYWwgaXBkX3BvcnQgJWQgcGFzc2VkIHRvIElOVEVSRkFDRVxuIiwgaXBkX3BvcnQpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LmMKaW5kZXggZTljZDVmMi4uZDAyZTNlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQuYwpAQCAtMTcsNiArMTcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KIAogI2luY2x1ZGUgPG5ldC9kc3QuaD4KIApAQCAtMzUsMTcgKzM3LDE5IEBACiAjaW5jbHVkZSA8YXNtL29jdGVvbi9jdm14LWZhdS5oPgogI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC1pcGQuaD4KICNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtaGVscGVyLmg+Ci0KKyNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtYXN4eC1kZWZzLmg+CiAjaW5jbHVkZSA8YXNtL29jdGVvbi9jdm14LWdteHgtZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC1zbWl4LWRlZnMuaD4KIAorI2RlZmluZSBPQ1RFT05fTUFYX01UVSA2NTM5MgorCiBzdGF0aWMgaW50IG51bV9wYWNrZXRfYnVmZmVycyA9IDEwMjQ7CiBtb2R1bGVfcGFyYW0obnVtX3BhY2tldF9idWZmZXJzLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhudW1fcGFja2V0X2J1ZmZlcnMsICJcbiIKIAkiXHROdW1iZXIgb2YgcGFja2V0IGJ1ZmZlcnMgdG8gYWxsb2NhdGUgYW5kIHN0b3JlIGluIHRoZVxuIgogCSJcdEZQQS4gQnkgZGVmYXVsdCwgMTAyNCBwYWNrZXQgYnVmZmVycyBhcmUgdXNlZC5cbiIpOwogCi1pbnQgcG93X3JlY2VpdmVfZ3JvdXAgPSAxNTsKK3N0YXRpYyBpbnQgcG93X3JlY2VpdmVfZ3JvdXAgPSAxNTsKIG1vZHVsZV9wYXJhbShwb3dfcmVjZWl2ZV9ncm91cCwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocG93X3JlY2VpdmVfZ3JvdXAsICJcbiIKIAkiXHRQT1cgZ3JvdXAgdG8gcmVjZWl2ZSBwYWNrZXRzIGZyb20uIEFsbCBldGhlcm5ldCBoYXJkd2FyZVxuIgpAQCAtNTMsNiArNTcsMTUgQEAKIAkiXHRncm91cC4gQWxzbyBhbnkgb3RoZXIgc29mdHdhcmUgY2FuIHN1Ym1pdCBwYWNrZXRzIHRvIHRoaXNcbiIKIAkiXHRncm91cCBmb3IgdGhlIGtlcm5lbCB0byBwcm9jZXNzLiIpOwogCitzdGF0aWMgaW50IHJlY2VpdmVfZ3JvdXBfb3JkZXI7Cittb2R1bGVfcGFyYW0ocmVjZWl2ZV9ncm91cF9vcmRlciwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocmVjZWl2ZV9ncm91cF9vcmRlciwgIlxuIgorCSJcdE9yZGVyICgwLi40KSBvZiByZWNlaXZlIGdyb3VwcyB0byB0YWtlIGludG8gdXNlLiBFdGhlcm5ldCBoYXJkd2FyZVxuIgorCSJcdHdpbGwgYmUgY29uZmlndXJlZCB0byBzZW5kIGluY29taW5nIHBhY2tldHMgdG8gbXVsdGlwbGUgUE9XXG4iCisJIlx0Z3JvdXBzLiBwb3dfcmVjZWl2ZV9ncm91cCBwYXJhbWV0ZXIgaXMgaWdub3JlZCB3aGVuIG11bHRpcGxlXG4iCisJIlx0Z3JvdXBzIGFyZSB0YWtlbiBpbnRvIHVzZSBhbmQgZ3JvdXBzIGFyZSBhbGxvY2F0ZWQgc3RhcnRpbmdcbiIKKwkiXHRmcm9tIDAuIEJ5IGRlZmF1bHQsIGEgc2luZ2xlIGdyb3VwIGlzIHVzZWQuXG4iKTsKKwogaW50IHBvd19zZW5kX2dyb3VwID0gLTE7CiBtb2R1bGVfcGFyYW0ocG93X3NlbmRfZ3JvdXAsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBvd19zZW5kX2dyb3VwLCAiXG4iCkBAIC04Niw2ICs5OSw4IEBACiBtb2R1bGVfcGFyYW0ocnhfbmFwaV93ZWlnaHQsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHJ4X25hcGlfd2VpZ2h0LCAiVGhlIE5BUEkgV0VJR0hUIHBhcmFtZXRlci4iKTsKIAorLyogTWFzayBpbmRpY2F0aW5nIHdoaWNoIHJlY2VpdmUgZ3JvdXBzIGFyZSBpbiB1c2UuICovCitpbnQgcG93X3JlY2VpdmVfZ3JvdXBzOwogCiAvKgogICogY3ZtX29jdF9wb2xsX3F1ZXVlX3N0b3BwaW5nIC0gZmxhZyB0byBpbmRpY2F0ZSBwb2xsaW5nIHNob3VsZCBzdG9wLgpAQCAtMjM3LDIxICsyNTIsMjIgQEAKIHsKIAlzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgaW50ZXJmYWNlID0gSU5URVJGQUNFKHByaXYtPnBvcnQpOwotCWludCBpbmRleCA9IElOREVYKHByaXYtPnBvcnQpOwotI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQotCWludCB2bGFuX2J5dGVzID0gNDsKKyNpZiBJU19FTkFCTEVEKENPTkZJR19WTEFOXzgwMjFRKQorCWludCB2bGFuX2J5dGVzID0gVkxBTl9ITEVOOwogI2Vsc2UKIAlpbnQgdmxhbl9ieXRlcyA9IDA7CiAjZW5kaWYKKwlpbnQgbXR1X292ZXJoZWFkID0gRVRIX0hMRU4gKyBFVEhfRkNTX0xFTiArIHZsYW5fYnl0ZXM7CiAKIAkvKgogCSAqIExpbWl0IHRoZSBNVFUgdG8gbWFrZSBzdXJlIHRoZSBldGhlcm5ldCBwYWNrZXRzIGFyZSBiZXR3ZWVuCiAJICogNjQgYnl0ZXMgYW5kIDY1NTM1IGJ5dGVzLgogCSAqLwotCWlmICgobmV3X210dSArIDE0ICsgNCArIHZsYW5fYnl0ZXMgPCA2NCkgfHwKLQkgICAgKG5ld19tdHUgKyAxNCArIDQgKyB2bGFuX2J5dGVzID4gNjUzOTIpKSB7CisJaWYgKChuZXdfbXR1ICsgbXR1X292ZXJoZWFkIDwgVkxBTl9FVEhfWkxFTikgfHwKKwkgICAgKG5ld19tdHUgKyBtdHVfb3ZlcmhlYWQgPiBPQ1RFT05fTUFYX01UVSkpIHsKIAkJcHJfZXJyKCJNVFUgbXVzdCBiZSBiZXR3ZWVuICVkIGFuZCAlZC5cbiIsCi0JCSAgICAgICA2NCAtIDE0IC0gNCAtIHZsYW5fYnl0ZXMsIDY1MzkyIC0gMTQgLSA0IC0gdmxhbl9ieXRlcyk7CisJCSAgICAgICBWTEFOX0VUSF9aTEVOIC0gbXR1X292ZXJoZWFkLAorCQkgICAgICAgT0NURU9OX01BWF9NVFUgLSBtdHVfb3ZlcmhlYWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJZGV2LT5tdHUgPSBuZXdfbXR1OwpAQCAtMjU5LDggKzI3NSw5IEBACiAJaWYgKChpbnRlcmZhY2UgPCAyKSAmJgogCSAgICAoY3ZteF9oZWxwZXJfaW50ZXJmYWNlX2dldF9tb2RlKGludGVyZmFjZSkgIT0KIAkJQ1ZNWF9IRUxQRVJfSU5URVJGQUNFX01PREVfU1BJKSkgeworCQlpbnQgaW5kZXggPSBJTkRFWChwcml2LT5wb3J0KTsKIAkJLyogQWRkIGV0aGVybmV0IGhlYWRlciBhbmQgRkNTLCBhbmQgVkxBTiBpZiBjb25maWd1cmVkLiAqLwotCQlpbnQgbWF4X3BhY2tldCA9IG5ld19tdHUgKyAxNCArIDQgKyB2bGFuX2J5dGVzOworCQlpbnQgbWF4X3BhY2tldCA9IG5ld19tdHUgKyBtdHVfb3ZlcmhlYWQ7CiAKIAkJaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ04zWFhYKSB8fAogCQkgICAgT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjU4WFgpKSB7CkBAIC0yNzUsNyArMjkyLDcgQEAKIAkJCXVuaW9uIGN2bXhfcGlwX2ZybV9sZW5fY2hreCBmcm1fbGVuX2NoazsKIAogCQkJZnJtX2xlbl9jaGsudTY0ID0gMDsKLQkJCWZybV9sZW5fY2hrLnMubWlubGVuID0gNjQ7CisJCQlmcm1fbGVuX2Noay5zLm1pbmxlbiA9IFZMQU5fRVRIX1pMRU47CiAJCQlmcm1fbGVuX2Noay5zLm1heGxlbiA9IG1heF9wYWNrZXQ7CiAJCQljdm14X3dyaXRlX2NzcihDVk1YX1BJUF9GUk1fTEVOX0NIS1goaW50ZXJmYWNlKSwKIAkJCQkgICAgICAgZnJtX2xlbl9jaGsudTY0KTsKQEAgLTMwMCwxMiArMzE3LDEyIEBACiAJdW5pb24gY3ZteF9nbXh4X3BydHhfY2ZnIGdteF9jZmc7CiAJc3RydWN0IG9jdGVvbl9ldGhlcm5ldCAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGludGVyZmFjZSA9IElOVEVSRkFDRShwcml2LT5wb3J0KTsKLQlpbnQgaW5kZXggPSBJTkRFWChwcml2LT5wb3J0KTsKIAogCWlmICgoaW50ZXJmYWNlIDwgMikgJiYKIAkgICAgKGN2bXhfaGVscGVyX2ludGVyZmFjZV9nZXRfbW9kZShpbnRlcmZhY2UpICE9CiAJCUNWTVhfSEVMUEVSX0lOVEVSRkFDRV9NT0RFX1NQSSkpIHsKIAkJdW5pb24gY3ZteF9nbXh4X3J4eF9hZHJfY3RsIGNvbnRyb2w7CisJCWludCBpbmRleCA9IElOREVYKHByaXYtPnBvcnQpOwogCiAJCWNvbnRyb2wudTY0ID0gMDsKIAkJY29udHJvbC5zLmJjc3QgPSAxOwkvKiBBbGxvdyBicm9hZGNhc3QgTUFDIGFkZHJlc3NlcyAqLwpAQCAtMzUyLDcgKzM2OSw2IEBACiAJc3RydWN0IG9jdGVvbl9ldGhlcm5ldCAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJdW5pb24gY3ZteF9nbXh4X3BydHhfY2ZnIGdteF9jZmc7CiAJaW50IGludGVyZmFjZSA9IElOVEVSRkFDRShwcml2LT5wb3J0KTsKLQlpbnQgaW5kZXggPSBJTkRFWChwcml2LT5wb3J0KTsKIAogCWlmICgoaW50ZXJmYWNlIDwgMikgJiYKIAkgICAgKGN2bXhfaGVscGVyX2ludGVyZmFjZV9nZXRfbW9kZShpbnRlcmZhY2UpICE9CkBAIC0zNjAsNiArMzc2LDcgQEAKIAkJaW50IGk7CiAJCXU4ICpwdHIgPSBkZXYtPmRldl9hZGRyOwogCQl1NjQgbWFjID0gMDsKKwkJaW50IGluZGV4ID0gSU5ERVgocHJpdi0+cG9ydCk7CiAKIAkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKIAkJCW1hYyA9IChtYWMgPDwgOCkgfCAodTY0KXB0cltpXTsKQEAgLTQ1NywxMCArNDc0LDggQEAKIAogdm9pZCBjdm1fb2N0X2NvbW1vbl91bmluaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmIChwcml2LT5waHlkZXYpCi0JCXBoeV9kaXNjb25uZWN0KHByaXYtPnBoeWRldik7CisJaWYgKGRldi0+cGh5ZGV2KQorCQlwaHlfZGlzY29ubmVjdChkZXYtPnBoeWRldik7CiB9CiAKIGludCBjdm1fb2N0X2NvbW1vbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC00NzksMTUgKzQ5NCwxNyBAQAogCiAJZ214X2NmZy51NjQgPSBjdm14X3JlYWRfY3NyKENWTVhfR01YWF9QUlRYX0NGRyhpbmRleCwgaW50ZXJmYWNlKSk7CiAJZ214X2NmZy5zLmVuID0gMTsKKwlpZiAob2N0ZW9uX2hhc19mZWF0dXJlKE9DVEVPTl9GRUFUVVJFX1BLTkQpKQorCQlnbXhfY2ZnLnMucGtuZCA9IHByaXYtPnBvcnQ7CiAJY3ZteF93cml0ZV9jc3IoQ1ZNWF9HTVhYX1BSVFhfQ0ZHKGluZGV4LCBpbnRlcmZhY2UpLCBnbXhfY2ZnLnU2NCk7CiAKIAlpZiAob2N0ZW9uX2lzX3NpbXVsYXRpb24oKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAocHJpdi0+cGh5ZGV2KSB7Ci0JCWludCByID0gcGh5X3JlYWRfc3RhdHVzKHByaXYtPnBoeWRldik7CisJaWYgKGRldi0+cGh5ZGV2KSB7CisJCWludCByID0gcGh5X3JlYWRfc3RhdHVzKGRldi0+cGh5ZGV2KTsKIAotCQlpZiAociA9PSAwICYmIHByaXYtPnBoeWRldi0+bGluayA9PSAwKQorCQlpZiAociA9PSAwICYmIGRldi0+cGh5ZGV2LT5saW5rID09IDApCiAJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCQljdm1fb2N0X2FkanVzdF9saW5rKGRldik7CiAJfSBlbHNlIHsKQEAgLTUxMCw4ICs1MjcsMTAgQEAKIAlpZiAobGlua19pbmZvLnU2NCA9PSBwcml2LT5saW5rX2luZm8pCiAJCXJldHVybjsKIAotCWxpbmtfaW5mbyA9IGN2bXhfaGVscGVyX2xpbmtfYXV0b2NvbmYocHJpdi0+cG9ydCk7Ci0JcHJpdi0+bGlua19pbmZvID0gbGlua19pbmZvLnU2NDsKKwlpZiAoY3ZteF9oZWxwZXJfbGlua19zZXQocHJpdi0+cG9ydCwgbGlua19pbmZvKSkKKwkJbGlua19pbmZvLnU2NCA9IHByaXYtPmxpbmtfaW5mbzsKKwllbHNlCisJCXByaXYtPmxpbmtfaW5mbyA9IGxpbmtfaW5mby51NjQ7CiAKIAlpZiAobGlua19pbmZvLnMubGlua191cCkgewogCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2soZGV2KSkKQEAgLTY0OSw2ICs2NjgsMTYgQEAKIAlyZXR1cm4gbnA7CiB9CiAKK3N0YXRpYyB2b2lkIGN2bV9zZXRfcmdtaWlfZGVsYXkoc3RydWN0IGRldmljZV9ub2RlICpucCwgaW50IGlmYWNlLCBpbnQgcG9ydCkKK3sKKwl1MzIgZGVsYXlfdmFsdWU7CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicngtZGVsYXkiLCAmZGVsYXlfdmFsdWUpKQorCQljdm14X3dyaXRlX2NzcihDVk1YX0FTWFhfUlhfQ0xLX1NFVFgocG9ydCwgaWZhY2UpLCBkZWxheV92YWx1ZSk7CisJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInR4LWRlbGF5IiwgJmRlbGF5X3ZhbHVlKSkKKwkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9BU1hYX1RYX0NMS19TRVRYKHBvcnQsIGlmYWNlKSwgZGVsYXlfdmFsdWUpOworfQorCiBzdGF0aWMgaW50IGN2bV9vY3RfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlpbnQgbnVtX2ludGVyZmFjZXM7CkBAIC02NjUsMTEgKzY5NCwxOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQogCWN2bV9vY3RfY29uZmlndXJlX2NvbW1vbl9odygpOwogCiAJY3ZteF9oZWxwZXJfaW5pdGlhbGl6ZV9wYWNrZXRfaW9fZ2xvYmFsKCk7CiAKKwlpZiAocmVjZWl2ZV9ncm91cF9vcmRlcikgeworCQlpZiAocmVjZWl2ZV9ncm91cF9vcmRlciA+IDQpCisJCQlyZWNlaXZlX2dyb3VwX29yZGVyID0gNDsKKwkJcG93X3JlY2VpdmVfZ3JvdXBzID0gKDEgPDwgKDEgPDwgcmVjZWl2ZV9ncm91cF9vcmRlcikpIC0gMTsKKwl9IGVsc2UgeworCQlwb3dfcmVjZWl2ZV9ncm91cHMgPSBCSVQocG93X3JlY2VpdmVfZ3JvdXApOworCX0KKwogCS8qIENoYW5nZSB0aGUgaW5wdXQgZ3JvdXAgZm9yIGFsbCBwb3J0cyBiZWZvcmUgaW5wdXQgaXMgZW5hYmxlZCAqLwogCW51bV9pbnRlcmZhY2VzID0gY3ZteF9oZWxwZXJfZ2V0X251bWJlcl9vZl9pbnRlcmZhY2VzKCk7CiAJZm9yIChpbnRlcmZhY2UgPSAwOyBpbnRlcmZhY2UgPCBudW1faW50ZXJmYWNlczsgaW50ZXJmYWNlKyspIHsKQEAgLTY4Myw3ICs3MTksMzcgQEAKIAogCQkJcGlwX3BydF90YWd4LnU2NCA9CiAJCQkgICAgY3ZteF9yZWFkX2NzcihDVk1YX1BJUF9QUlRfVEFHWChwb3J0KSk7Ci0JCQlwaXBfcHJ0X3RhZ3gucy5ncnAgPSBwb3dfcmVjZWl2ZV9ncm91cDsKKworCQkJaWYgKHJlY2VpdmVfZ3JvdXBfb3JkZXIpIHsKKwkJCQlpbnQgdGFnX21hc2s7CisKKwkJCQkvKiBXZSBzdXBwb3J0IG9ubHkgMTYgZ3JvdXBzIGF0IHRoZSBtb21lbnQsIHNvCisJCQkJICogYWx3YXlzIGRpc2FibGUgdGhlIHR3byBhZGRpdGlvbmFsICJoaWRkZW4iCisJCQkJICogdGFnX21hc2sgYml0cyBvbiBDTjY4WFguCisJCQkJICovCisJCQkJaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ042OFhYKSkKKwkJCQkJcGlwX3BydF90YWd4LnU2NCB8PSAweDN1bGwgPDwgNDQ7CisKKwkJCQl0YWdfbWFzayA9IH4oKDEgPDwgcmVjZWl2ZV9ncm91cF9vcmRlcikgLSAxKTsKKwkJCQlwaXBfcHJ0X3RhZ3gucy5ncnB0YWdiYXNlCT0gMDsKKwkJCQlwaXBfcHJ0X3RhZ3gucy5ncnB0YWdtYXNrCT0gdGFnX21hc2s7CisJCQkJcGlwX3BydF90YWd4LnMuZ3JwdGFnCQk9IDE7CisJCQkJcGlwX3BydF90YWd4LnMudGFnX21vZGUJCT0gMDsKKwkJCQlwaXBfcHJ0X3RhZ3gucy5pbmNfcHJ0X2ZsYWcJPSAxOworCQkJCXBpcF9wcnRfdGFneC5zLmlwNl9kcHJ0X2ZsYWcJPSAxOworCQkJCXBpcF9wcnRfdGFneC5zLmlwNF9kcHJ0X2ZsYWcJPSAxOworCQkJCXBpcF9wcnRfdGFneC5zLmlwNl9zcHJ0X2ZsYWcJPSAxOworCQkJCXBpcF9wcnRfdGFneC5zLmlwNF9zcHJ0X2ZsYWcJPSAxOworCQkJCXBpcF9wcnRfdGFneC5zLmlwNl9kc3RfZmxhZwk9IDE7CisJCQkJcGlwX3BydF90YWd4LnMuaXA0X2RzdF9mbGFnCT0gMTsKKwkJCQlwaXBfcHJ0X3RhZ3gucy5pcDZfc3JjX2ZsYWcJPSAxOworCQkJCXBpcF9wcnRfdGFneC5zLmlwNF9zcmNfZmxhZwk9IDE7CisJCQkJcGlwX3BydF90YWd4LnMuZ3JwCQk9IDA7CisJCQl9IGVsc2UgeworCQkJCXBpcF9wcnRfdGFneC5zLmdycHRhZwk9IDA7CisJCQkJcGlwX3BydF90YWd4LnMuZ3JwCT0gcG93X3JlY2VpdmVfZ3JvdXA7CisJCQl9CisKIAkJCWN2bXhfd3JpdGVfY3NyKENWTVhfUElQX1BSVF9UQUdYKHBvcnQpLAogCQkJCSAgICAgICBwaXBfcHJ0X3RhZ3gudTY0KTsKIAkJfQpAQCAtNzA1LDcgKzc3MSw2IEBACiAJaWYgKChwb3dfc2VuZF9ncm91cCAhPSAtMSkpIHsKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAotCQlwcl9pbmZvKCJcdENvbmZpZ3VyaW5nIGRldmljZSBmb3IgUE9XIG9ubHkgYWNjZXNzXG4iKTsKIAkJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBvY3Rlb25fZXRoZXJuZXQpKTsKIAkJaWYgKGRldikgewogCQkJLyogSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlLiAqLwpAQCAtODA4LDYgKzg3Myw4IEBACiAJCQljYXNlIENWTVhfSEVMUEVSX0lOVEVSRkFDRV9NT0RFX0dNSUk6CiAJCQkJZGV2LT5uZXRkZXZfb3BzID0gJmN2bV9vY3RfcmdtaWlfbmV0ZGV2X29wczsKIAkJCQlzdHJjcHkoZGV2LT5uYW1lLCAiZXRoJWQiKTsKKwkJCQljdm1fc2V0X3JnbWlpX2RlbGF5KHByaXYtPm9mX25vZGUsIGludGVyZmFjZSwKKwkJCQkJCSAgICBwb3J0X2luZGV4KTsKIAkJCQlicmVhazsKIAkJCX0KIApAQCAtODQ0LDE3ICs5MTEsOCBAQAogewogCWludCBwb3J0OwogCi0JLyogRGlzYWJsZSBQT1cgaW50ZXJydXB0ICovCi0JaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ042OFhYKSkKLQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9TU09fV1FfSU5UX1RIUlgocG93X3JlY2VpdmVfZ3JvdXApLCAwKTsKLQllbHNlCi0JCWN2bXhfd3JpdGVfY3NyKENWTVhfUE9XX1dRX0lOVF9USFJYKHBvd19yZWNlaXZlX2dyb3VwKSwgMCk7Ci0KIAljdm14X2lwZF9kaXNhYmxlKCk7CiAKLQkvKiBGcmVlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLwotCWZyZWVfaXJxKE9DVEVPTl9JUlFfV09SS1EwICsgcG93X3JlY2VpdmVfZ3JvdXAsIGN2bV9vY3RfZGV2aWNlKTsKLQogCWF0b21pY19pbmNfcmV0dXJuKCZjdm1fb2N0X3BvbGxfcXVldWVfc3RvcHBpbmcpOwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY3ZtX29jdF9yeF9yZWZpbGxfd29yayk7CiAKQEAgLTg3OCw3ICs5MzYsNiBAQAogCQl9CiAJfQogCi0KIAljdm14X3Brb19zaHV0ZG93bigpOwogCiAJY3ZteF9pcGRfZnJlZV9wdHIoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vb2N0ZW9uLWV0aGVybmV0LmggYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL29jdGVvbi1ldGhlcm5ldC5oCmluZGV4IDYyNzVjMTUuLjljNjg1MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vb2N0ZW9uLWV0aGVybmV0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9vY3Rlb24tZXRoZXJuZXQuaApAQCAtNDAsNyArNDAsNiBAQAogCXN0cnVjdCBza19idWZmX2hlYWQgdHhfZnJlZV9saXN0WzE2XTsKIAkvKiBEZXZpY2Ugc3RhdGlzdGljcyAqLwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAJdW5zaWduZWQgaW50IGxhc3Rfc3BlZWQ7CiAJdW5zaWduZWQgaW50IGxhc3RfbGluazsKIAkvKiBMYXN0IG5lZ290aWF0ZWQgbGluayBzdGF0ZSAqLwpAQCAtNzMsNyArNzIsNyBAQAogCiBleHRlcm4gaW50IGFsd2F5c191c2VfcG93OwogZXh0ZXJuIGludCBwb3dfc2VuZF9ncm91cDsKLWV4dGVybiBpbnQgcG93X3JlY2VpdmVfZ3JvdXA7CitleHRlcm4gaW50IHBvd19yZWNlaXZlX2dyb3VwczsKIGV4dGVybiBjaGFyIHBvd19zZW5kX2xpc3RbXTsKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqY3ZtX29jdF9kZXZpY2VbXTsKIGV4dGVybiBhdG9taWNfdCBjdm1fb2N0X3BvbGxfcXVldWVfc3RvcHBpbmc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbl94b18xXzUuYyBiL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uX3hvXzFfNS5jCmluZGV4IDZhNGQzNzkuLjFlMjNlZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uX3hvXzFfNS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uX3hvXzFfNS5jCkBAIC00OSw3ICs0OSw3IEBACiAKIHN0YXRpYyBpbnQgZGNvbl93YXNfaXJxKHZvaWQpCiB7Ci0JdV9pbnQ4X3QgdG1wOworCXU4IHRtcDsKIAogCS8qIGlycSBzdGF0dXMgd2lsbCBhcHBlYXIgaW4gUE1JT19SeDUwWzZdIG9uIGdwaW8xMiAqLwogCXRtcCA9IGluYihWWDg1NV9HUElfU1RBVFVTX0NIRyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2FwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2FwLmMKaW5kZXggYTU3NTUzNS4uNTUzZThkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19hcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfYXAuYwpAQCAtNzgsOSArNzgsOSBAQAogCS8qIHVwZGF0ZSBUSU0gSUUgKi8KIAlwID0gcnR3X2dldF9pZShwaWUgKyBfRklYRURfSUVfTEVOR1RIXywgX1RJTV9JRV8sICZ0aW1faWVsZW4sCiAJCQlwbmV0d29ya19tbG1lZXh0LT5JRUxlbmd0aCAtIF9GSVhFRF9JRV9MRU5HVEhfKTsKLQlpZiAocCAhPSBOVUxMICYmIHRpbV9pZWxlbiA+IDApIHsKKwlpZiAocCAmJiB0aW1faWVsZW4gPiAwKSB7CiAJCXRpbV9pZWxlbiArPSAyOwotCQlwcmVtYWluZGVyX2llID0gcCt0aW1faWVsZW47CisJCXByZW1haW5kZXJfaWUgPSBwICsgdGltX2llbGVuOwogCQl0aW1faWVfb2Zmc2V0ID0gKGludCkocCAtIHBpZSk7CiAJCXJlbWFpbmRlcl9pZWxlbiA9IHBuZXR3b3JrX21sbWVleHQtPklFTGVuZ3RoIC0KIAkJCQkJdGltX2llX29mZnNldCAtIHRpbV9pZWxlbjsKQEAgLTk4LDcgKzk4LDcgQEAKIAkJCQlfU1VQUE9SVEVEUkFURVNfSUVfLCAmdG1wX2xlbiwKIAkJCQkocG5ldHdvcmtfbWxtZWV4dC0+SUVMZW5ndGggLQogCQkJCQlfQkVBQ09OX0lFX09GRlNFVF8pKTsKLQkJaWYgKHAgIT0gIE5VTEwpCisJCWlmIChwKQogCQkJb2Zmc2V0ICs9IHRtcF9sZW4rMjsKIAogCQkvKiBEUyBQYXJhbWV0ZXIgU2V0IElFLCBsZW4gPSAzICovCkBAIC0xODMsMTAgKzE4MywxMCBAQAogCQlpICs9IChwSUUtPkxlbmd0aCArIDIpOwogCX0KIAotCWlmIChwICE9IE5VTEwgJiYgaWVsZW4gPiAwKSB7CisJaWYgKHAgJiYgaWVsZW4gPiAwKSB7CiAJCWllbGVuICs9IDI7CiAKLQkJcHJlbWFpbmRlcl9pZSA9IHAraWVsZW47CisJCXByZW1haW5kZXJfaWUgPSBwICsgaWVsZW47CiAKIAkJaWVfb2Zmc2V0ID0gKGludCkocCAtIHBpZSk7CiAKQEAgLTE5NSw3ICsxOTUsNyBAQAogCQlpZiAoYm1hdGNoKQogCQkJZHN0X2llID0gcDsKIAkJZWxzZQotCQkJZHN0X2llID0gcCtpZWxlbjsKKwkJCWRzdF9pZSA9IHAgKyBpZWxlbjsKIAl9CiAKIAlpZiAocmVtYWluZGVyX2llbGVuID4gMCkgewpAQCAtMjMyLDEwICsyMzIsMTAgQEAKIAogCXAgPSBydHdfZ2V0X2llKHBpZSArIF9GSVhFRF9JRV9MRU5HVEhfLCBpbmRleCwgJmllbGVuLAogCQkgICAgICAgcG5ldHdvcmstPklFTGVuZ3RoIC0gX0ZJWEVEX0lFX0xFTkdUSF8pOwotCWlmIChwICE9IE5VTEwgJiYgaWVsZW4gPiAwKSB7CisJaWYgKHAgJiYgaWVsZW4gPiAwKSB7CiAJCWllbGVuICs9IDI7CiAKLQkJcHJlbWFpbmRlcl9pZSA9IHAraWVsZW47CisJCXByZW1haW5kZXJfaWUgPSBwICsgaWVsZW47CiAKIAkJaWVfb2Zmc2V0ID0gKGludCkocCAtIHBpZSk7CiAKQEAgLTM4NSw4ICszODUsOCBAQAogCQkJdXBkYXRlZCA9IGFwX2ZyZWVfc3RhKHBhZGFwdGVyLCBwc3RhLCB0cnVlLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CiAJCX0gZWxzZSB7CiAJCQkvKiBUT0RPOiBBZ2luZyBtZWNoYW5pc20gdG8gZGlnZXN0IGZyYW1lcyBpbiBzbGVlcF9xIHRvIGF2b2lkIHJ1bm5pbmcgb3V0IG9mIHhtaXRmcmFtZSAqLwotCQkJaWYgKHBzdGEtPnNsZWVwcV9sZW4gPiAoTlJfWE1JVEZSQU1FL3BzdGFwcml2LT5hc29jX2xpc3RfY250KSAmJgotCQkJICAgIHBhZGFwdGVyLT54bWl0cHJpdi5mcmVlX3htaXRmcmFtZV9jbnQgPCAoTlJfWE1JVEZSQU1FL3BzdGFwcml2LT5hc29jX2xpc3RfY250LzIpKSB7CisJCQlpZiAocHN0YS0+c2xlZXBxX2xlbiA+IChOUl9YTUlURlJBTUUgLyBwc3RhcHJpdi0+YXNvY19saXN0X2NudCkgJiYKKwkJCSAgICBwYWRhcHRlci0+eG1pdHByaXYuZnJlZV94bWl0ZnJhbWVfY250IDwgKE5SX1hNSVRGUkFNRSAvIHBzdGFwcml2LT5hc29jX2xpc3RfY250IC8gMikpIHsKIAkJCQlEQkdfODhFKCIlcyBzdGE6JXBNLCBzbGVlcHFfbGVuOiV1LCBmcmVlX3htaXRmcmFtZV9jbnQ6JXUsIGFzb2NfbGlzdF9jbnQ6JXUsIGNsZWFyIHNsZWVwX3FcbiIsIF9fZnVuY19fLAogCQkJCQkocHN0YS0+aHdhZGRyKSwgcHN0YS0+c2xlZXBxX2xlbiwKIAkJCQkJcGFkYXB0ZXItPnhtaXRwcml2LmZyZWVfeG1pdGZyYW1lX2NudCwKQEAgLTQ3MCw3ICs0NzAsNyBAQAogCS8qIGIvZyBtb2RlIHJhX2JpdG1hcCAqLwogCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocHN0YS0+YnNzcmF0ZXNldCk7IGkrKykgewogCQlpZiAocHN0YS0+YnNzcmF0ZXNldFtpXSkKLQkJCXR4X3JhX2JpdG1hcCB8PSBydHdfZ2V0X2JpdF92YWx1ZV9mcm9tX2llZWVfdmFsdWUocHN0YS0+YnNzcmF0ZXNldFtpXSYweDdmKTsKKwkJCXR4X3JhX2JpdG1hcCB8PSBydHdfZ2V0X2JpdF92YWx1ZV9mcm9tX2llZWVfdmFsdWUocHN0YS0+YnNzcmF0ZXNldFtpXSAmIDB4N2YpOwogCX0KIAkvKiBuIG1vZGUgcmFfYml0bWFwICovCiAJaWYgKHBzdGFfaHQtPmh0X29wdGlvbikgewpAQCAtNDgxLDggKzQ4MSw4IEBACiAJCQlsaW1pdCA9IDg7LyogICAxUiAqLwogCiAJCWZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSsrKSB7Ci0JCQlpZiAocHN0YV9odC0+aHRfY2FwLnN1cHBfbWNzX3NldFtpLzhdICYgQklUKGklOCkpCi0JCQkJdHhfcmFfYml0bWFwIHw9IEJJVChpKzEyKTsKKwkJCWlmIChwc3RhX2h0LT5odF9jYXAubWNzLnJ4X21hc2tbaSAvIDhdICYgQklUKGkgJSA4KSkKKwkJCQl0eF9yYV9iaXRtYXAgfD0gQklUKGkgKyAxMik7CiAJCX0KIAogCQkvKiBtYXggc2hvcnQgR0kgcmF0ZSAqLwpAQCAtNTA3LDE5ICs1MDcsMTkgQEAKIAlwc3RhLT53aXJlbGVzc19tb2RlID0gc3RhX2JhbmQ7CiAKIAlyYWlkID0gbmV0d29ya3R5cGVfdG9fcmFpZChzdGFfYmFuZCk7Ci0JaW5pdF9yYXRlID0gZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgodHhfcmFfYml0bWFwJjB4MGZmZmZmZmYpJjB4M2Y7CisJaW5pdF9yYXRlID0gZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgodHhfcmFfYml0bWFwICYgMHgwZmZmZmZmZikgJiAweDNmOwogCiAJaWYgKHBzdGEtPmFpZCA8IE5VTV9TVEEpIHsKIAkJdTggYXJnID0gMDsKIAotCQlhcmcgPSBwc3RhLT5tYWNfaWQmMHgxZjsKKwkJYXJnID0gcHN0YS0+bWFjX2lkICYgMHgxZjsKIAogCQlhcmcgfD0gQklUKDcpOy8qIHN1cHBvcnQgZW50cnkgMn4zMSAqLwogCiAJCWlmIChzaG9ydEdJcmF0ZSkKIAkJCWFyZyB8PSBCSVQoNSk7CiAKLQkJdHhfcmFfYml0bWFwIHw9ICgocmFpZDw8MjgpJjB4ZjAwMDAwMDApOworCQl0eF9yYV9iaXRtYXAgfD0gKChyYWlkIDw8IDI4KSAmIDB4ZjAwMDAwMDApOwogCiAJCURCR184OEUoIiVzID0+IG1hY19pZDolZCAsIHJhaWQ6JWQgLCBiaXRtYXAgPSAweCV4LCBhcmcgPSAweCV4XG4iLAogCQkJX19mdW5jX18sIHBzdGEtPm1hY19pZCwgcmFpZCwgdHhfcmFfYml0bWFwLCBhcmcpOwpAQCAtNTczLDcgKzU3Myw3IEBACiAJCS8qIGIvZyBtb2RlIHJhX2JpdG1hcCAqLwogCQlmb3IgKGkgPSAwOyBpIDwgc3VwcG9ydFJhdGVOdW07IGkrKykgewogCQkJaWYgKHBzdGEtPmJzc3JhdGVzZXRbaV0pCi0JCQkJdHhfcmFfYml0bWFwIHw9IHJ0d19nZXRfYml0X3ZhbHVlX2Zyb21faWVlZV92YWx1ZShwc3RhLT5ic3NyYXRlc2V0W2ldJjB4N2YpOworCQkJCXR4X3JhX2JpdG1hcCB8PSBydHdfZ2V0X2JpdF92YWx1ZV9mcm9tX2llZWVfdmFsdWUocHN0YS0+YnNzcmF0ZXNldFtpXSAmIDB4N2YpOwogCQl9CiAKIAkJaWYgKHBjdXJfbmV0d29yay0+Q29uZmlndXJhdGlvbi5EU0NvbmZpZyA+IDE0KSB7CkBAIC01ODcsNyArNTg3LDcgQEAKIAkJfQogCiAJCXJhaWQgPSBuZXR3b3JrdHlwZV90b19yYWlkKG5ldHdvcmtfdHlwZSk7Ci0JCWluaXRfcmF0ZSA9IGdldF9oaWdoZXN0X3JhdGVfaWR4KHR4X3JhX2JpdG1hcCYweDBmZmZmZmZmKSYweDNmOworCQlpbml0X3JhdGUgPSBnZXRfaGlnaGVzdF9yYXRlX2lkeCh0eF9yYV9iaXRtYXAgJiAweDBmZmZmZmZmKSAmIDB4M2Y7CiAKIAkJLyogYXAgbW9kZSAqLwogCQlydHdfaGFsX3NldF9vZG1fdmFyKHBhZGFwdGVyLCBIQUxfT0RNX1NUQV9JTkZPLCBwc3RhLCB0cnVlKTsKQEAgLTU5Nyw3ICs1OTcsNyBAQAogCiAJCQlhcmcgPSBwc3RhLT5tYWNfaWQmMHgxZjsKIAkJCWFyZyB8PSBCSVQoNyk7Ci0JCQl0eF9yYV9iaXRtYXAgfD0gKChyYWlkPDwyOCkmMHhmMDAwMDAwMCk7CisJCQl0eF9yYV9iaXRtYXAgfD0gKChyYWlkIDw8IDI4KSAmIDB4ZjAwMDAwMDApOwogCQkJREJHXzg4RSgidXBkYXRlX2JtY19zdGEsIG1hc2sgPSAweCV4LCBhcmcgPSAweCV4XG4iLCB0eF9yYV9iaXRtYXAsIGFyZyk7CiAKIAkJCS8qIGJpdG1hcFswOjI3XSA9IHR4X3JhdGVfYml0bWFwICovCkBAIC02MzYsNyArNjM2LDcgQEAKIAlzdHJ1Y3QgaHRfcHJpdgkqcGh0cHJpdl9hcCA9ICZwbWxtZXByaXYtPmh0cHJpdjsKIAlzdHJ1Y3QgaHRfcHJpdgkqcGh0cHJpdl9zdGEgPSAmcHN0YS0+aHRwcml2OwogCi0JcHN0YS0+bWFjX2lkID0gcHN0YS0+YWlkKzE7CisJcHN0YS0+bWFjX2lkID0gcHN0YS0+YWlkICsgMTsKIAlEQkdfODhFKCIlc1xuIiwgX19mdW5jX18pOwogCiAJLyogYXAgbW9kZSAqLwpAQCAtNjU4LDExICs2NTgsMTUgQEAKIAkJcGh0cHJpdl9zdGEtPmFtcGR1X2VuYWJsZSA9IHBodHByaXZfYXAtPmFtcGR1X2VuYWJsZTsKIAogCQkvKiBjaGVjayBpZiBzdGEgc3VwcG9ydCBzIFNob3J0IEdJICovCi0JCWlmICgocGh0cHJpdl9zdGEtPmh0X2NhcC5jYXBfaW5mbyAmIHBodHByaXZfYXAtPmh0X2NhcC5jYXBfaW5mbykgJiAoSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAgfCBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkpCisJCWlmIChsZTE2X3RvX2NwdShwaHRwcml2X3N0YS0+aHRfY2FwLmNhcF9pbmZvICYKKwkJCQlwaHRwcml2X2FwLT5odF9jYXAuY2FwX2luZm8pICYKKwkJICAgIChJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCB8IElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwKSkKIAkJCXBodHByaXZfc3RhLT5zZ2kgPSB0cnVlOwogCiAJCS8qICBid21vZGUgKi8KLQkJaWYgKChwaHRwcml2X3N0YS0+aHRfY2FwLmNhcF9pbmZvICYgcGh0cHJpdl9hcC0+aHRfY2FwLmNhcF9pbmZvKSAmIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIKSB7CisJCWlmIChsZTE2X3RvX2NwdShwaHRwcml2X3N0YS0+aHRfY2FwLmNhcF9pbmZvICYKKwkJCQlwaHRwcml2X2FwLT5odF9jYXAuY2FwX2luZm8pICYKKwkJICAgIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIKSB7CiAJCQlwaHRwcml2X3N0YS0+Yndtb2RlID0gcG1sbWVleHQtPmN1cl9id21vZGU7CiAJCQlwaHRwcml2X3N0YS0+Y2hfb2Zmc2V0ID0gcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQ7CiAJCX0KQEAgLTcwMiwxMiArNzA2LDEyIEBACiAKIAkvKiBoYW5kbGUgQS1NUERVIHBhcmFtZXRlciBmaWVsZCAqLwogCS8qCi0JCUFNUERVX3BhcmEgWzE6MF06TWF4IEFNUERVIExlbiA9PiAwOjhrICwgMToxNmssIDI6MzJrLCAzOjY0awotCQlBTVBEVV9wYXJhIFs0OjJdOk1pbiBNUERVIFN0YXJ0IFNwYWNpbmcKKwkJYW1wZHVfcGFyYW1zX2luZm8gWzE6MF06TWF4IEFNUERVIExlbiA9PiAwOjhrICwgMToxNmssIDI6MzJrLCAzOjY0aworCQlhbXBkdV9wYXJhbXNfaW5mbyBbNDoyXTpNaW4gTVBEVSBTdGFydCBTcGFjaW5nCiAJKi8KLQltYXhfQU1QRFVfbGVuID0gcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuQU1QRFVfcGFyYSAmIDB4MDM7CisJbWF4X0FNUERVX2xlbiA9IHBtbG1laW5mby0+SFRfY2Fwcy5hbXBkdV9wYXJhbXNfaW5mbyAmIDB4MDM7CiAKLQltaW5fTVBEVV9zcGFjaW5nID0gKHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkFNUERVX3BhcmEgJiAweDFjKSA+PiAyOworCW1pbl9NUERVX3NwYWNpbmcgPSAocG1sbWVpbmZvLT5IVF9jYXBzLmFtcGR1X3BhcmFtc19pbmZvICYgMHgxYykgPj4gMjsKIAogCXJ0d19oYWxfc2V0X2h3cmVnKHBhZGFwdGVyLCBIV19WQVJfQU1QRFVfTUlOX1NQQUNFLCAodTggKikoJm1pbl9NUERVX3NwYWNpbmcpKTsKIApAQCAtNzE2LDcgKzcyMCw3IEBACiAJLyogICovCiAJLyogIENvbmZpZyBTTSBQb3dlciBTYXZlIHNldHRpbmcgKi8KIAkvKiAgKi8KLQlwbWxtZWluZm8tPlNNX1BTID0gKGxlMTZfdG9fY3B1KHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkhUX2NhcHNfaW5mbykgJiAweDBDKSA+PiAyOworCXBtbG1laW5mby0+U01fUFMgPSAobGUxNl90b19jcHUocG1sbWVpbmZvLT5IVF9jYXBzLmNhcF9pbmZvKSAmIDB4MEMpID4+IDI7CiAJaWYgKHBtbG1laW5mby0+U01fUFMgPT0gV0xBTl9IVF9DQVBfU01fUFNfU1RBVElDKQogCQlEQkdfODhFKCIlcygpOiBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUNcbiIsIF9fZnVuY19fKTsKIH0KQEAgLTc0Niw3ICs3NTAsNyBAQAogCS8qIGNoZWNrIGlmIHRoZXJlIGlzIHdwcyBpZSwgKi8KIAkvKiBpZiB0aGVyZSBpcyB3cHNpZSBpbiBiZWFjb24sIHRoZSBob3N0YXBkIHdpbGwgdXBkYXRlIGJlYWNvbiB0d2ljZSB3aGVuIHN0YXRpbmcgaG9zdGFwZCwgKi8KIAkvKiBhbmQgYXQgZmlyc3QgdGltZSB0aGUgc2VjdXJpdHkgaWUgKFJTTi9XUEEgSUUpIHdpbGwgbm90IGluY2x1ZGUgaW4gYmVhY29uLiAqLwotCWlmICghcnR3X2dldF93cHNfaWUocG5ldHdvcmstPklFcytfRklYRURfSUVfTEVOR1RIXywgcG5ldHdvcmstPklFTGVuZ3RoLV9GSVhFRF9JRV9MRU5HVEhfLCBOVUxMLCBOVUxMKSkKKwlpZiAoIXJ0d19nZXRfd3BzX2llKHBuZXR3b3JrLT5JRXMgKyBfRklYRURfSUVfTEVOR1RIXywgcG5ldHdvcmstPklFTGVuZ3RoIC0gX0ZJWEVEX0lFX0xFTkdUSF8sIE5VTEwsIE5VTEwpKQogCQlwbWxtZWV4dC0+YnN0YXJ0X2JzcyA9IHRydWU7CiAKIAkvKiB0b2RvOiB1cGRhdGUgd21tLCBodCBjYXAgKi8KQEAgLTc5OSw3ICs4MDMsNyBAQAogCS8qIHNldCBjaGFubmVsLCBid21vZGUgKi8KIAlwID0gcnR3X2dldF9pZSgocG5ldHdvcmstPklFcyArIHNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfZml4ZWRfaWUpKSwgX0hUX0FERF9JTkZPX0lFXywgJmllX2xlbiwgKHBuZXR3b3JrLT5JRUxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfZml4ZWRfaWUpKSk7CiAJaWYgKHAgJiYgaWVfbGVuKSB7Ci0JCXBodF9pbmZvID0gKHN0cnVjdCBIVF9pbmZvX2VsZW1lbnQgKikocCsyKTsKKwkJcGh0X2luZm8gPSAoc3RydWN0IEhUX2luZm9fZWxlbWVudCAqKShwICsgMik7CiAKIAkJaWYgKChwcmVncHJpdi0+Y2J3NDBfZW5hYmxlKSAmJgkgKHBodF9pbmZvLT5pbmZvc1swXSAmIEJJVCgyKSkpIHsKIAkJCS8qIHN3aXRjaCB0byB0aGUgNDBNIEh6IG1vZGUgKi8KQEAgLTkzMCwxNSArOTM0LDE1IEBACiAJbWVtc2V0KHN1cHBvcnRSYXRlLCAwLCBORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVgpOwogCS8qICBnZXQgc3VwcG9ydGVkIHJhdGVzICovCiAJcCA9IHJ0d19nZXRfaWUoaWUgKyBfQkVBQ09OX0lFX09GRlNFVF8sIF9TVVBQT1JURURSQVRFU19JRV8sICZpZV9sZW4sIChwYnNzX25ldHdvcmstPklFTGVuZ3RoIC0gX0JFQUNPTl9JRV9PRkZTRVRfKSk7Ci0JaWYgKHAgIT0gIE5VTEwpIHsKLQkJbWVtY3B5KHN1cHBvcnRSYXRlLCBwKzIsIGllX2xlbik7CisJaWYgKHApIHsKKwkJbWVtY3B5KHN1cHBvcnRSYXRlLCBwICsgMiwgaWVfbGVuKTsKIAkJc3VwcG9ydFJhdGVOdW0gPSBpZV9sZW47CiAJfQogCiAJLyogZ2V0IGV4dF9zdXBwb3J0ZWQgcmF0ZXMgKi8KIAlwID0gcnR3X2dldF9pZShpZSArIF9CRUFDT05fSUVfT0ZGU0VUXywgX0VYVF9TVVBQT1JURURSQVRFU19JRV8sICZpZV9sZW4sIHBic3NfbmV0d29yay0+SUVMZW5ndGggLSBfQkVBQ09OX0lFX09GRlNFVF8pOwotCWlmIChwICE9ICBOVUxMKSB7Ci0JCW1lbWNweShzdXBwb3J0UmF0ZStzdXBwb3J0UmF0ZU51bSwgcCsyLCBpZV9sZW4pOworCWlmIChwKSB7CisJCW1lbWNweShzdXBwb3J0UmF0ZSArIHN1cHBvcnRSYXRlTnVtLCBwICsgMiwgaWVfbGVuKTsKIAkJc3VwcG9ydFJhdGVOdW0gKz0gaWVfbGVuOwogCX0KIApAQCAtOTY2LDcgKzk3MCw3IEBACiAJcHNlY3VyaXR5cHJpdi0+d3BhMl9wYWlyd2lzZV9jaXBoZXIgPSBfTk9fUFJJVkFDWV87CiAJcCA9IHJ0d19nZXRfaWUoaWUgKyBfQkVBQ09OX0lFX09GRlNFVF8sIF9SU05fSUVfMl8sICZpZV9sZW4sIChwYnNzX25ldHdvcmstPklFTGVuZ3RoIC0gX0JFQUNPTl9JRV9PRkZTRVRfKSk7CiAJaWYgKHAgJiYgaWVfbGVuID4gMCkgewotCQlpZiAocnR3X3BhcnNlX3dwYTJfaWUocCwgaWVfbGVuKzIsICZncm91cF9jaXBoZXIsICZwYWlyd2lzZV9jaXBoZXIsIE5VTEwpID09IF9TVUNDRVNTKSB7CisJCWlmIChydHdfcGFyc2Vfd3BhMl9pZShwLCBpZV9sZW4gKyAyLCAmZ3JvdXBfY2lwaGVyLCAmcGFpcndpc2VfY2lwaGVyLCBOVUxMKSA9PSBfU1VDQ0VTUykgewogCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fODAyMVg7CiAKIAkJCXBzZWN1cml0eXByaXYtPmRvdDgwMjF4YWxnID0gMTsvKiBwc2ssICB0b2RvOjgwMi4xeCAqLwpAQCAtOTg1LDggKzk4OSw4IEBACiAJZm9yIChwID0gaWUgKyBfQkVBQ09OX0lFX09GRlNFVF87OyBwICs9IChpZV9sZW4gKyAyKSkgewogCQlwID0gcnR3X2dldF9pZShwLCBfU1NOX0lFXzFfLCAmaWVfbGVuLAogCQkJICAgICAgIChwYnNzX25ldHdvcmstPklFTGVuZ3RoIC0gX0JFQUNPTl9JRV9PRkZTRVRfIC0gKGllX2xlbiArIDIpKSk7Ci0JCWlmICgocCkgJiYgKCFtZW1jbXAocCsyLCBPVUkxLCA0KSkpIHsKLQkJCWlmIChydHdfcGFyc2Vfd3BhX2llKHAsIGllX2xlbisyLCAmZ3JvdXBfY2lwaGVyLAorCQlpZiAoKHApICYmICghbWVtY21wKHAgKyAyLCBPVUkxLCA0KSkpIHsKKwkJCWlmIChydHdfcGFyc2Vfd3BhX2llKHAsIGllX2xlbiArIDIsICZncm91cF9jaXBoZXIsCiAJCQkJCSAgICAgJnBhaXJ3aXNlX2NpcGhlciwgTlVMTCkgPT0gX1NVQ0NFU1MpIHsKIAkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID0gZG90MTFBdXRoQWxncnRobV84MDIxWDsKIApAQCAtMTAxMCwxMCArMTAxNCwxMCBAQAogCQlmb3IgKHAgPSBpZSArIF9CRUFDT05fSUVfT0ZGU0VUXzs7IHAgKz0gKGllX2xlbiArIDIpKSB7CiAJCQlwID0gcnR3X2dldF9pZShwLCBfVkVORE9SX1NQRUNJRklDX0lFXywgJmllX2xlbiwKIAkJCQkgICAgICAgKHBic3NfbmV0d29yay0+SUVMZW5ndGggLSBfQkVBQ09OX0lFX09GRlNFVF8gLSAoaWVfbGVuICsgMikpKTsKLQkJCWlmICgocCkgJiYgIW1lbWNtcChwKzIsIFdNTV9QQVJBX0lFLCA2KSkgeworCQkJaWYgKChwKSAmJiAhbWVtY21wKHAgKyAyLCBXTU1fUEFSQV9JRSwgNikpIHsKIAkJCQlwbWxtZXByaXYtPnFvc3ByaXYucW9zX29wdGlvbiA9IDE7CiAKLQkJCQkqKHArOCkgfD0gQklUKDcpOy8qIFFvUyBJbmZvLCBzdXBwb3J0IFUtQVBTRCAqLworCQkJCSoocCArIDgpIHw9IEJJVCg3KTsvKiBRb1MgSW5mbywgc3VwcG9ydCBVLUFQU0QgKi8KIAogCQkJCS8qIGRpc2FibGUgYWxsIEFDTSBiaXRzIHNpbmNlIHRoZSBXTU0gYWRtaXNzaW9uIGNvbnRyb2wgaXMgbm90IHN1cHBvcnRlZCAqLwogCQkJCSoocCArIDEwKSAmPSB+QklUKDQpOyAvKiBCRSAqLwpAQCAtMTAzMiw3ICsxMDM2LDcgQEAKIAkJICAgICAgIChwYnNzX25ldHdvcmstPklFTGVuZ3RoIC0gX0JFQUNPTl9JRV9PRkZTRVRfKSk7CiAJaWYgKHAgJiYgaWVfbGVuID4gMCkgewogCQl1OCByZl90eXBlOwotCQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgKnBodF9jYXAgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwICopKHArMik7CisJCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpwaHRfY2FwID0gKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICopKHAgKyAyKTsKIAogCQlwSFRfY2Fwc19pZSA9IHA7CiAJCWh0X2NhcCA9IHRydWU7CkBAIC0xMDQyLDcgKzEwNDYsNyBAQAogCiAJCWlmICgocHNlY3VyaXR5cHJpdi0+d3BhX3BhaXJ3aXNlX2NpcGhlciAmIFdQQV9DSVBIRVJfQ0NNUCkgfHwKIAkJICAgIChwc2VjdXJpdHlwcml2LT53cGEyX3BhaXJ3aXNlX2NpcGhlciAmIFdQQV9DSVBIRVJfQ0NNUCkpCi0JCQlwaHRfY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyB8PSAoSUVFRTgwMjExX0hUX0NBUF9BTVBEVV9ERU5TSVRZJigweDA3PDwyKSk7CisJCQlwaHRfY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyB8PSAoSUVFRTgwMjExX0hUX0NBUF9BTVBEVV9ERU5TSVRZICYgKDB4MDcgPDwgMikpOwogCQllbHNlCiAJCQlwaHRfY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyB8PSAoSUVFRTgwMjExX0hUX0NBUF9BTVBEVV9ERU5TSVRZJjB4MDApOwogCkBAIC0xMDUwLDggKzEwNTQsOCBAQAogCQlwaHRfY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyB8PSAoSUVFRTgwMjExX0hUX0NBUF9BTVBEVV9GQUNUT1IgJiAweDAzKTsKIAogCQlpZiAocmZfdHlwZSA9PSBSRl8xVDFSKSB7Ci0JCQlwaHRfY2FwLT5zdXBwX21jc19zZXRbMF0gPSAweGZmOwotCQkJcGh0X2NhcC0+c3VwcF9tY3Nfc2V0WzFdID0gMHgwOworCQkJcGh0X2NhcC0+bWNzLnJ4X21hc2tbMF0gPSAweGZmOworCQkJcGh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gPSAweDA7CiAJCX0KIAkJbWVtY3B5KCZwbWxtZXByaXYtPmh0cHJpdi5odF9jYXAsIHArMiwgaWVfbGVuKTsKIAl9CkBAIC0xMTQzLDcgKzExNDcsNyBAQAogCiAJREJHXzg4RSgiJXMoYWNsX251bSA9JWQpID0lcE1cbiIsIF9fZnVuY19fLCBwYWNsX2xpc3QtPm51bSwgKGFkZHIpKTsKIAotCWlmICgoTlVNX0FDTC0xKSA8IHBhY2xfbGlzdC0+bnVtKQorCWlmICgoTlVNX0FDTCAtIDEpIDwgcGFjbF9saXN0LT5udW0pCiAJCXJldHVybiAtMTsKIAogCXNwaW5fbG9ja19iaCgmKHBhY2xfbm9kZV9xLT5sb2NrKSk7CkBAIC0xNDIyLDcgKzE0MjYsOCBAQAogCWlmIChwbWxtZXByaXYtPm51bV9zdGFfbm9faHQgfHwKIAkgICAgKHBtbG1lcHJpdi0+aHRfb3BfbW9kZSAmIEhUX0lORk9fT1BFUkFUSU9OX01PREVfTk9OX0dGX0RFVlNfUFJFU0VOVCkpCiAJCW5ld19vcF9tb2RlID0gT1BfTU9ERV9NSVhFRDsKLQllbHNlIGlmICgocGh0cHJpdl9hcC0+aHRfY2FwLmNhcF9pbmZvICYgSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEgpICYmCisJZWxzZSBpZiAoKGxlMTZfdG9fY3B1KHBodHByaXZfYXAtPmh0X2NhcC5jYXBfaW5mbykgJgorCQkgIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIKSAmJgogCQkgcG1sbWVwcml2LT5udW1fc3RhX2h0XzIwbWh6KQogCQluZXdfb3BfbW9kZSA9IE9QX01PREVfMjBNSFpfSFRfU1RBX0FTU09DRUQ7CiAJZWxzZSBpZiAocG1sbWVwcml2LT5vbGJjX2h0KQpAQCAtMTU1Miw3ICsxNTU3LDcgQEAKIAl9CiAKIAlpZiAocHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9IVCkgewotCQl1MTYgaHRfY2FwYWIgPSBwc3RhLT5odHByaXYuaHRfY2FwLmNhcF9pbmZvOworCQl1MTYgaHRfY2FwYWIgPSBsZTE2X3RvX2NwdShwc3RhLT5odHByaXYuaHRfY2FwLmNhcF9pbmZvKTsKIAogCQlEQkdfODhFKCJIVDogU1RBICVwTSBIVCBDYXBhYmlsaXRpZXMgSW5mbzogMHglMDR4XG4iLAogCQkJKHBzdGEtPmh3YWRkciksIGh0X2NhcGFiKTsKQEAgLTE3MTAsNDAgKzE3MTUsNiBAQAogCXJldHVybiBiZWFjb25fdXBkYXRlZDsKIH0KIAotaW50IHJ0d19hcF9pbmZvcm1fY2hfc3dpdGNoKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggbmV3X2NoLCB1OCBjaF9vZmZzZXQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQsICpwbGlzdDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwotCXU4IGJjX2FkZHJbRVRIX0FMRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpICE9IFdJRklfRldfQVBfU1RBVEUpCi0JCXJldHVybiAwOwotCi0JREJHXzg4RShGVU5DX05ERVZfRk1UIiB3aXRoIGNoOiV1LCBvZmZzZXQ6JXVcbiIsCi0JCUZVTkNfTkRFVl9BUkcocGFkYXB0ZXItPnBuZXRkZXYpLCBuZXdfY2gsIGNoX29mZnNldCk7Ci0KLQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0JcGhlYWQgPSAmcHN0YXByaXYtPmFzb2NfbGlzdDsKLQlwbGlzdCA9IHBoZWFkLT5uZXh0OwotCi0JLyogZm9yIGVhY2ggc3RhIGluIGFzb2NfcXVldWUgKi8KLQl3aGlsZSAocGhlYWQgIT0gcGxpc3QpIHsKLQkJcHN0YSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhc29jX2xpc3QpOwotCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwotCi0JCWlzc3VlX2FjdGlvbl9zcGN0X2NoX3N3aXRjaChwYWRhcHRlciwgcHN0YS0+aHdhZGRyLCBuZXdfY2gsIGNoX29mZnNldCk7Ci0JCXBzdGEtPmV4cGlyZV90byA9IG1pbl90KHVuc2lnbmVkIGludCwgcHN0YXByaXYtPmV4cGlyZV90byAqIDIsIDUpOwotCX0KLQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQotCWlzc3VlX2FjdGlvbl9zcGN0X2NoX3N3aXRjaChwYWRhcHRlciwgYmNfYWRkciwgbmV3X2NoLCBjaF9vZmZzZXQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIGludCBydHdfc3RhX2ZsdXNoKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZCwgKnBsaXN0OwpAQCAtMTg1Niw5ICsxODI3LDYgQEAKIAlwbWxtZXByaXYtPndwc19wcm9iZV9yZXNwX2llID0gTlVMTDsKIAlwbWxtZXByaXYtPndwc19hc3NvY19yZXNwX2llID0gTlVMTDsKIAotCXBtbG1lcHJpdi0+cDJwX2JlYWNvbl9pZSA9IE5VTEw7Ci0JcG1sbWVwcml2LT5wMnBfcHJvYmVfcmVzcF9pZSA9IE5VTEw7Ci0KIAkvKiBmb3IgQUNMICovCiAJSU5JVF9MSVNUX0hFQUQoJihwYWNsX2xpc3QtPmFjbF9ub2RlX3EucXVldWUpKTsKIAlwYWNsX2xpc3QtPm51bSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2NtZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19jbWQuYwppbmRleCA3NzQ4NTIzLi5mMWY0Nzg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2NtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfY21kLmMKQEAgLTI3LDggKzI3LDggQEAKIAogaW50IHJ0d19pbml0X2NtZF9wcml2KHN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYpCiB7Ci0Jc2VtYV9pbml0KCYocGNtZHByaXYtPmNtZF9xdWV1ZV9zZW1hKSwgMCk7Ci0Jc2VtYV9pbml0KCYocGNtZHByaXYtPnRlcm1pbmF0ZV9jbWR0aHJlYWRfc2VtYSksIDApOworCWluaXRfY29tcGxldGlvbigmcGNtZHByaXYtPmNtZF9xdWV1ZV9jb21wKTsKKwlpbml0X2NvbXBsZXRpb24oJnBjbWRwcml2LT50ZXJtaW5hdGVfY21kdGhyZWFkX2NvbXApOwogCiAJX3J0d19pbml0X3F1ZXVlKCYocGNtZHByaXYtPmNtZF9xdWV1ZSkpOwogCXJldHVybiBfU1VDQ0VTUzsKQEAgLTg1LDcgKzg1LDcgQEAKIAkvKiBUbyBkZWNpZGUgYWxsb3cgb3Igbm90ICovCiAJaWYgKChwY21kcHJpdi0+cGFkYXB0ZXItPnB3cmN0cmxwcml2LmJIV1B3clBpbmRldGVjdCkgJiYKIAkgICAgKCFwY21kcHJpdi0+cGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi51c2Jzc19lbmFibGUpKSB7Ci0JCWlmIChjbWRfb2JqLT5jbWRjb2RlID09IEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpIHsKKwkJaWYgKGNtZF9vYmotPmNtZGNvZGUgPT0gX1NldF9EcnZfRXh0cmFfQ01EXykgewogCQkJc3RydWN0IGRydmV4dHJhX2NtZF9wYXJtCSpwZHJ2ZXh0cmFfY21kX3Bhcm0gPSAoc3RydWN0IGRydmV4dHJhX2NtZF9wYXJtCSopY21kX29iai0+cGFybWJ1ZjsKIAogCQkJaWYgKHBkcnZleHRyYV9jbWRfcGFybS0+ZWNfaWQgPT0gUE9XRVJfU0FWSU5HX0NUUkxfV0tfQ0lEKQpAQCAtOTMsNyArOTMsNyBAQAogCQl9CiAJfQogCi0JaWYgKGNtZF9vYmotPmNtZGNvZGUgPT0gR0VOX0NNRF9DT0RFKF9TZXRDaGFubmVsUGxhbikpCisJaWYgKGNtZF9vYmotPmNtZGNvZGUgPT0gX1NldENoYW5uZWxQbGFuX0NNRF8pCiAJCWJBbGxvdyA9IHRydWU7CiAKIAlpZiAoKCFwY21kcHJpdi0+cGFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkICYmICFiQWxsb3cpIHx8CkBAIC0xMjIsNyArMTIyLDcgQEAKIAlyZXMgPSBfcnR3X2VucXVldWVfY21kKCZwY21kcHJpdi0+Y21kX3F1ZXVlLCBjbWRfb2JqKTsKIAogCWlmIChyZXMgPT0gX1NVQ0NFU1MpCi0JCXVwKCZwY21kcHJpdi0+Y21kX3F1ZXVlX3NlbWEpOworCQljb21wbGV0ZSgmcGNtZHByaXYtPmNtZF9xdWV1ZV9jb21wKTsKIAogZXhpdDoKIApAQCAtMTYyLDEyICsxNjIsMTIgQEAKIAlhbGxvd19zaWduYWwoU0lHVEVSTSk7CiAKIAlwY21kcHJpdi0+Y21kdGhkX3J1bm5pbmcgPSB0cnVlOwotCXVwKCZwY21kcHJpdi0+dGVybWluYXRlX2NtZHRocmVhZF9zZW1hKTsKKwljb21wbGV0ZSgmcGNtZHByaXYtPnRlcm1pbmF0ZV9jbWR0aHJlYWRfY29tcCk7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLCAoInN0YXJ0IHI4NzF4IHJ0d19jbWRfdGhyZWFkICEhISFcbiIpKTsKIAogCXdoaWxlICgxKSB7Ci0JCWlmIChfcnR3X2Rvd25fc2VtYSgmcGNtZHByaXYtPmNtZF9xdWV1ZV9zZW1hKSA9PSBfRkFJTCkKKwkJaWYgKHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmcGNtZHByaXYtPmNtZF9xdWV1ZV9jb21wKSkKIAkJCWJyZWFrOwogCiAJCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwKQEAgLTIzNCw3ICsyMzQsNyBAQAogCQlydHdfZnJlZV9jbWRfb2JqKHBjbWQpOwogCX0KIAotCXVwKCZwY21kcHJpdi0+dGVybWluYXRlX2NtZHRocmVhZF9zZW1hKTsKKwljb21wbGV0ZSgmcGNtZHByaXYtPnRlcm1pbmF0ZV9jbWR0aHJlYWRfY29tcCk7CiAKIAogCWNvbXBsZXRlX2FuZF9leGl0KE5VTEwsIDApOwpAQCAtMjcxLDcgKzI3MSw3IEBACiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLCAoIiVzOiBmbHVzaCBuZXR3b3JrIHF1ZXVlXG4iLCBfX2Z1bmNfXykpOwogCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHN1cnZleVBhcmEsIEdFTl9DTURfQ09ERShfU2l0ZVN1cnZleSkpOworCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBzdXJ2ZXlQYXJhLCBfU2l0ZVN1cnZleV9DTURfKTsKIAogCS8qIHBzdXJ2ZXlQYXJhLT5ic3NsaW1pdCA9IDQ4OyAqLwogCXBzdXJ2ZXlQYXJhLT5zY2FuX21vZGUgPSBwbWxtZXByaXYtPnNjYW5fbW9kZTsKQEAgLTMwNSw4ICszMDUsNiBAQAogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiAKIAlpZiAocmVzID09IF9TVUNDRVNTKSB7Ci0JCXBtbG1lcHJpdi0+c2Nhbl9zdGFydF90aW1lID0gamlmZmllczsKLQogCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lciwKIAkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoU0NBTk5JTkdfVElNRU9VVCkpOwogCkBAIC00OTEsNyArNDg5LDcgQEAKIAlwY21kLT5jbWRzeiA9IGdldF93bGFuX2Jzc2lkX2V4X3N6KHBzZWNuZXR3b3JrKTsvKiBnZXQgY21kc3ogYmVmb3JlIGVuZGlhbiBjb252ZXJzaW9uICovCiAKIAlJTklUX0xJU1RfSEVBRCgmcGNtZC0+bGlzdCk7Ci0JcGNtZC0+Y21kY29kZSA9IF9Kb2luQnNzX0NNRF87LyogR0VOX0NNRF9DT0RFKF9Kb2luQnNzKSAqLworCXBjbWQtPmNtZGNvZGUgPSBfSm9pbkJzc19DTURfOwogCXBjbWQtPnBhcm1idWYgPSAodW5zaWduZWQgY2hhciAqKXBzZWNuZXR3b3JrOwogCXBjbWQtPnJzcCA9IE5VTEw7CiAJcGNtZC0+cnNwc3ogPSAwOwpAQCAtNjcwLDEzICs2NjgsMTMgQEAKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAogCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0tFUk5FTCk7CisJcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwaDJjKSB7CiAJCXJlcyA9IF9GQUlMOwogCQlnb3RvIGV4aXQ7CiAJfQogCi0JcGFkZGJhcmVxX3Bhcm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWRkQmFSZXFfcGFybSksIEdGUF9LRVJORUwpOworCXBhZGRiYXJlcV9wYXJtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkZEJhUmVxX3Bhcm0pLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXBhZGRiYXJlcV9wYXJtKSB7CiAJCWtmcmVlKHBoMmMpOwogCQlyZXMgPSBfRkFJTDsKQEAgLTY4Niw3ICs2ODQsNyBAQAogCXBhZGRiYXJlcV9wYXJtLT50aWQgPSB0aWQ7CiAJbWVtY3B5KHBhZGRiYXJlcV9wYXJtLT5hZGRyLCBhZGRyLCBFVEhfQUxFTik7CiAKLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwYWRkYmFyZXFfcGFybSwgR0VOX0NNRF9DT0RFKF9BZGRCQVJlcSkpOworCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBhZGRiYXJlcV9wYXJtLCBfQWRkQkFSZXFfQ01EXyk7CiAKIAkvKiBEQkdfODhFKCJydHdfYWRkYmFyZXFfY21kLCB0aWQgPSVkXG4iLCB0aWQpOyAqLwogCkBAIC03MjQsNyArNzIyLDcgQEAKIAlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnR5cGVfc2l6ZSA9IDA7CiAJcGRydmV4dHJhX2NtZF9wYXJtLT5wYnVmID0gKHU4ICopcGFkYXB0ZXI7CiAKLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sIEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpOworCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBkcnZleHRyYV9jbWRfcGFybSwgX1NldF9EcnZfRXh0cmFfQ01EXyk7CiAKIAogCS8qIHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7ICovCkBAIC03NjcsNyArNzY1LDcgQEAKIAkJCWdvdG8gZXhpdDsKIAkJfQogCi0JCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBjbWRvYmosIHNldENoYW5uZWxQbGFuX3BhcmFtLCBHRU5fQ01EX0NPREUoX1NldENoYW5uZWxQbGFuKSk7CisJCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBjbWRvYmosIHNldENoYW5uZWxQbGFuX3BhcmFtLCBfU2V0Q2hhbm5lbFBsYW5fQ01EXyk7CiAJCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGNtZG9iaik7CiAJfSBlbHNlIHsKIAkJLyogbm8gbmVlZCB0byBlbnF1ZXVlLCBkbyB0aGUgY21kIGhkbCBkaXJlY3RseSBhbmQgZnJlZSBjbWQgcGFyYW1ldGVyICovCkBAIC05MzYsNyArOTM0LDcgQEAKIAkJcGRydmV4dHJhX2NtZF9wYXJtLT50eXBlX3NpemUgPSBscHNfY3RybF90eXBlOwogCQlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnBidWYgPSBOVUxMOwogCi0JCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBkcnZleHRyYV9jbWRfcGFybSwgR0VOX0NNRF9DT0RFKF9TZXRfRHJ2X0V4dHJhKSk7CisJCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBkcnZleHRyYV9jbWRfcGFybSwgX1NldF9EcnZfRXh0cmFfQ01EXyk7CiAKIAkJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIAl9IGVsc2UgewpAQCAtOTc4LDcgKzk3Niw3IEBACiAJcGRydmV4dHJhX2NtZF9wYXJtLT5lY19pZCA9IFJUUF9USU1FUl9DRkdfV0tfQ0lEOwogCXBkcnZleHRyYV9jbWRfcGFybS0+dHlwZV9zaXplID0gbWluX3RpbWU7CiAJcGRydmV4dHJhX2NtZF9wYXJtLT5wYnVmID0gTlVMTDsKLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sIEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpOworCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBkcnZleHRyYV9jbWRfcGFybSwgX1NldF9EcnZfRXh0cmFfQ01EXyk7CiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIGV4aXQ6CiAKQEAgLTEwMjAsNyArMTAxOCw3IEBACiAJCXBkcnZleHRyYV9jbWRfcGFybS0+ZWNfaWQgPSBBTlRfU0VMRUNUX1dLX0NJRDsKIAkJcGRydmV4dHJhX2NtZF9wYXJtLT50eXBlX3NpemUgPSBhbnRlbm5hOwogCQlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnBidWYgPSBOVUxMOwotCQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sIEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpOworCQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sIF9TZXRfRHJ2X0V4dHJhX0NNRF8pOwogCiAJCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiAJfSBlbHNlIHsKQEAgLTEwNDgsNyArMTA0Niw3IEBACiAKIAlwZHJ2ZXh0cmFfY21kX3Bhcm0tPmVjX2lkID0gUE9XRVJfU0FWSU5HX0NUUkxfV0tfQ0lEOwogCXBkcnZleHRyYV9jbWRfcGFybS0+cGJ1ZiA9IE5VTEw7Ci0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocHBzY21kLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sIEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpOworCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBwc2NtZCwgcGRydmV4dHJhX2NtZF9wYXJtLCBfU2V0X0Rydl9FeHRyYV9DTURfKTsKIAogCXJldHVybiBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBwc2NtZCk7CiB9CkBAIC0xMTE5LDcgKzExMTcsNyBAQAogCXBkcnZleHRyYV9jbWRfcGFybS0+dHlwZV9zaXplID0gMDsKIAlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnBidWYgPSBOVUxMOwogCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcGRydmV4dHJhX2NtZF9wYXJtLCBHRU5fQ01EX0NPREUoX1NldF9EcnZfRXh0cmEpKTsKKwlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sIF9TZXRfRHJ2X0V4dHJhX0NNRF8pOwogCiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIGV4aXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2RlYnVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2RlYnVnLmMKaW5kZXggZGI1Yzk1Mi4uNjBkOGM3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZGVidWcuYwpAQCAtMTM4LDE0NCArMTM4LDYgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLWludCBwcm9jX2dldF9md3N0YXRlKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlpbnQgbGVuID0gMDsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImZ3c3RhdGU9MHgleFxuIiwgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19nZXRfc2VjX2luZm8oY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQotCWludCBsZW4gPSAwOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiYXV0aF9hbGc9MHgleCwgZW5jX2FsZz0weCV4LCBhdXRoX3R5cGU9MHgleCwgZW5jX3R5cGU9MHgleFxuIiwKLQkJCQkJCXBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0sIHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0sCi0JCQkJCQlwc2VjdXJpdHlwcml2LT5uZGlzYXV0aHR5cGUsIHBzZWN1cml0eXByaXYtPm5kaXNlbmNyeXB0c3RhdHVzKTsKLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9tbG1leHRfc3RhdGUoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWludCBsZW4gPSAwOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAicG1sbWVpbmZvLT5zdGF0ZT0weCV4XG4iLCBwbWxtZWluZm8tPnN0YXRlKTsKLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9xb3Nfb3B0aW9uKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlpbnQgbGVuID0gMDsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInFvc19vcHRpb249JWRcbiIsIHBtbG1lcHJpdi0+cW9zcHJpdi5xb3Nfb3B0aW9uKTsKLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9odF9vcHRpb24oY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWludCBsZW4gPSAwOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiaHRfb3B0aW9uPSVkXG4iLCBwbWxtZXByaXYtPmh0cHJpdi5odF9vcHRpb24pOwotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9yZl9pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JaW50IGxlbiA9IDA7Ci0KLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJjdXJfY2g9JWQsIGN1cl9idz0lZCwgY3VyX2NoX29mZnNldD0lZFxuIiwKLQkJCQkJcG1sbWVleHQtPmN1cl9jaGFubmVsLCBwbWxtZWV4dC0+Y3VyX2J3bW9kZSwgcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQpOwotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9hcF9pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCWludCBsZW4gPSAwOwotCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbyhwc3RhcHJpdiwgY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JaWYgKHBzdGEpIHsKLQkJaW50IGk7Ci0JCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybDsKLQotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJTU0lEPSVzXG4iLCBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLlNzaWQpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJzdGEncyBtYWNhZGRyOiVwTVxuIiwgcHN0YS0+aHdhZGRyKTsKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiY3VyX2NoYW5uZWw9JWQsIGN1cl9id21vZGU9JWQsIGN1cl9jaF9vZmZzZXQ9JWRcbiIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwgcG1sbWVleHQtPmN1cl9id21vZGUsIHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0KTsKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAicnRzZW49JWQsIGN0czJzbGVmPSVkXG4iLCBwc3RhLT5ydHNlbiwgcHN0YS0+Y3RzMnNlbGYpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJzdGF0ZT0weCV4LCBhaWQ9JWQsIG1hY2lkPSVkLCByYWlkPSVkXG4iLCBwc3RhLT5zdGF0ZSwgcHN0YS0+YWlkLCBwc3RhLT5tYWNfaWQsIHBzdGEtPnJhaWQpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJxb3NfZW49JWQsIGh0X2VuPSVkLCBpbml0X3JhdGU9JWRcbiIsIHBzdGEtPnFvc19vcHRpb24sIHBzdGEtPmh0cHJpdi5odF9vcHRpb24sIHBzdGEtPmluaXRfcmF0ZSk7Ci0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImJ3bW9kZT0lZCwgY2hfb2Zmc2V0PSVkLCBzZ2k9JWRcbiIsIHBzdGEtPmh0cHJpdi5id21vZGUsIHBzdGEtPmh0cHJpdi5jaF9vZmZzZXQsIHBzdGEtPmh0cHJpdi5zZ2kpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJhbXBkdV9lbmFibGUgPSAlZFxuIiwgcHN0YS0+aHRwcml2LmFtcGR1X2VuYWJsZSk7Ci0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImFnZ19lbmFibGVfYml0bWFwPSV4LCBjYW5kaWRhdGVfdGlkX2JpdG1hcD0leFxuIiwgcHN0YS0+aHRwcml2LmFnZ19lbmFibGVfYml0bWFwLCBwc3RhLT5odHByaXYuY2FuZGlkYXRlX3RpZF9iaXRtYXApOwotCi0JCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCQlwcmVvcmRlcl9jdHJsID0gJnBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbaV07Ci0JCQlpZiAocHJlb3JkZXJfY3RybC0+ZW5hYmxlKQotCQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInRpZD0lZCwgaW5kaWNhdGVfc2VxPSVkXG4iLCBpLCBwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEpOwotCQl9Ci0JfSBlbHNlIHsKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiY2FuJ3QgZ2V0IHN0YSdzIG1hY2FkZHIsIGN1cl9uZXR3b3JrJ3MgbWFjYWRkcjogJXBNXG4iLCBjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQl9Ci0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCiBpbnQgcHJvY19nZXRfYWRhcHRlcl9zdGF0ZShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCiAJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAogCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKQEAgLTI5MSw1OTkgKzE1Myw2IEBACiAJcmV0dXJuIGxlbjsKIH0KIAotaW50IHByb2NfZ2V0X3RyeF9pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IHJlY3ZfcHJpdiAgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0JaW50IGxlbiA9IDA7Ci0KLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJmcmVlX3htaXRidWZfY250PSVkLCBmcmVlX3htaXRmcmFtZV9jbnQ9JWQsIGZyZWVfZXh0X3htaXRidWZfY250PSVkLCBmcmVlX3JlY3ZmcmFtZV9jbnQ9JWRcbiIsCi0JCQkJcHhtaXRwcml2LT5mcmVlX3htaXRidWZfY250LCBweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudCwgcHhtaXRwcml2LT5mcmVlX3htaXRfZXh0YnVmX2NudCwgcHJlY3Zwcml2LT5mcmVlX3JlY3ZmcmFtZV9jbnQpOwotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInJ4X3VyYl9wZW5kaW5nX2NuPSVkXG4iLCBwcmVjdnByaXYtPnJ4X3BlbmRpbmdfY250KTsKLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9tYWNfcmVnX2R1bXAxKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCWludCBsZW4gPSAwOwotCWludCBpLCBqID0gMTsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuPT09PT09PSBNQUMgUkVHID09PT09PT1cbiIpOwotCi0JZm9yIChpID0gMHgwOyBpIDwgMHgzMDA7IGkgKz0gNCkgewotCQlpZiAoaiU0ID09IDEpCi0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIweCUwMngiLCBpKTsKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiIDB4JTA4eCAiLCB1c2JfcmVhZDMyKHBhZGFwdGVyLCBpKSk7Ci0JCWlmICgoaisrKSU0ID09IDApCi0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbiIpOwotCX0KLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9tYWNfcmVnX2R1bXAyKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCWludCBsZW4gPSAwOwotCWludCBpLCBqID0gMTsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuPT09PT09PSBNQUMgUkVHID09PT09PT1cbiIpOwotCW1lbXNldChwYWdlLCAwLCBjb3VudCk7Ci0JZm9yIChpID0gMHgzMDA7IGkgPCAweDYwMDsgaSArPSA0KSB7Ci0JCWlmIChqJTQgPT0gMSkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIjB4JTAyeCIsIGkpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIgMHglMDh4ICIsIHVzYl9yZWFkMzIocGFkYXB0ZXIsIGkpKTsKLQkJaWYgKChqKyspJTQgPT0gMCkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7Ci0JfQotCi0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotaW50IHByb2NfZ2V0X21hY19yZWdfZHVtcDMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0JaW50IGxlbiA9IDA7Ci0JaW50IGksIGogPSAxOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG49PT09PT09IE1BQyBSRUcgPT09PT09PVxuIik7Ci0KLQlmb3IgKGkgPSAweDYwMDsgaSA8IDB4ODAwOyBpICs9IDQpIHsKLQkJaWYgKGolNCA9PSAxKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiMHglMDJ4IiwgaSk7Ci0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIiAweCUwOHggIiwgdXNiX3JlYWQzMihwYWRhcHRlciwgaSkpOwotCQlpZiAoKGorKyklNCA9PSAwKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKLQl9Ci0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19nZXRfYmJfcmVnX2R1bXAxKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCWludCBsZW4gPSAwOwotCWludCBpLCBqID0gMTsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuPT09PT09PSBCQiBSRUcgPT09PT09PVxuIik7Ci0JZm9yIChpID0gMHg4MDA7IGkgPCAweEIwMDsgaSArPSA0KSB7Ci0JCWlmIChqJTQgPT0gMSkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIjB4JTAyeCIsIGkpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIgMHglMDh4ICIsIHVzYl9yZWFkMzIocGFkYXB0ZXIsIGkpKTsKLQkJaWYgKChqKyspJTQgPT0gMCkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7Ci0JfQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9iYl9yZWdfZHVtcDIoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0JaW50IGxlbiA9IDA7Ci0JaW50IGksIGogPSAxOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG49PT09PT09IEJCIFJFRyA9PT09PT09XG4iKTsKLQlmb3IgKGkgPSAweEIwMDsgaSA8IDB4RTAwOyBpICs9IDQpIHsKLQkJaWYgKGolNCA9PSAxKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiMHglMDJ4IiwgaSk7Ci0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIiAweCUwOHggIiwgdXNiX3JlYWQzMihwYWRhcHRlciwgaSkpOwotCQlpZiAoKGorKyklNCA9PSAwKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKLQl9Ci0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotaW50IHByb2NfZ2V0X2JiX3JlZ19kdW1wMyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgbGVuID0gMDsKLQlpbnQgaSwgaiA9IDE7Ci0KLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbj09PT09PT0gQkIgUkVHID09PT09PT1cbiIpOwotCWZvciAoaSA9IDB4RTAwOyBpIDwgMHgxMDAwOyBpICs9IDQpIHsKLQkJaWYgKGolNCA9PSAxKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiMHglMDJ4IiwgaSk7Ci0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIiAweCUwOHggIiwgdXNiX3JlYWQzMihwYWRhcHRlciwgaSkpOwotCQlpZiAoKGorKyklNCA9PSAwKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKLQl9Ci0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotaW50IHByb2NfZ2V0X3JmX3JlZ19kdW1wMShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgbGVuID0gMDsKLQlpbnQgaSwgaiA9IDEsIHBhdGg7Ci0JdTMyIHZhbHVlOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG49PT09PT09IFJGIFJFRyA9PT09PT09XG4iKTsKLQlwYXRoID0gMTsKLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcblJGX1BhdGgoJXgpXG4iLCBwYXRoKTsKLQlmb3IgKGkgPSAwOyBpIDwgMHhDMDsgaSsrKSB7Ci0JCXZhbHVlID0gcnR3X2hhbF9yZWFkX3JmcmVnKHBhZGFwdGVyLCBwYXRoLCBpLCAweGZmZmZmZmZmKTsKLQkJaWYgKGolNCA9PSAxKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiMHglMDJ4ICIsIGkpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIgMHglMDh4ICIsIHZhbHVlKTsKLQkJaWYgKChqKyspJTQgPT0gMCkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7Ci0JfQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9yZl9yZWdfZHVtcDIoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0JaW50IGxlbiA9IDA7Ci0JaW50IGksIGogPSAxLCBwYXRoOwotCXUzMiB2YWx1ZTsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuPT09PT09PSBSRiBSRUcgPT09PT09PVxuIik7Ci0JcGF0aCA9IDE7Ci0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG5SRl9QYXRoKCV4KVxuIiwgcGF0aCk7Ci0JZm9yIChpID0gMHhDMDsgaSA8IDB4MTAwOyBpKyspIHsKLQkJdmFsdWUgPSBydHdfaGFsX3JlYWRfcmZyZWcocGFkYXB0ZXIsIHBhdGgsIGksIDB4ZmZmZmZmZmYpOwotCQlpZiAoaiU0ID09IDEpCi0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIweCUwMnggIiwgaSk7Ci0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIiAweCUwOHggIiwgdmFsdWUpOwotCQlpZiAoKGorKyklNCA9PSAwKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKLQl9Ci0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotaW50IHByb2NfZ2V0X3JmX3JlZ19kdW1wMyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgbGVuID0gMDsKLQlpbnQgaSwgaiA9IDEsIHBhdGg7Ci0JdTMyIHZhbHVlOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG49PT09PT09IFJGIFJFRyA9PT09PT09XG4iKTsKLQlwYXRoID0gMjsKLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcblJGX1BhdGgoJXgpXG4iLCBwYXRoKTsKLQlmb3IgKGkgPSAwOyBpIDwgMHhDMDsgaSsrKSB7Ci0JCXZhbHVlID0gcnR3X2hhbF9yZWFkX3JmcmVnKHBhZGFwdGVyLCBwYXRoLCBpLCAweGZmZmZmZmZmKTsKLQkJaWYgKGolNCA9PSAxKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiMHglMDJ4ICIsIGkpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIgMHglMDh4ICIsIHZhbHVlKTsKLQkJaWYgKChqKyspJTQgPT0gMCkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7Ci0JfQotCi0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotCi1pbnQgcHJvY19nZXRfcmZfcmVnX2R1bXA0KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCWludCBsZW4gPSAwOwotCWludCBpLCBqID0gMSwgcGF0aDsKLQl1MzIgdmFsdWU7Ci0KLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbj09PT09PT0gUkYgUkVHID09PT09PT1cbiIpOwotCXBhdGggPSAyOwotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuUkZfUGF0aCgleClcbiIsIHBhdGgpOwotCWZvciAoaSA9IDB4QzA7IGkgPCAweDEwMDsgaSsrKSB7Ci0JCXZhbHVlID0gcnR3X2hhbF9yZWFkX3JmcmVnKHBhZGFwdGVyLCBwYXRoLCBpLCAweGZmZmZmZmZmKTsKLQkJaWYgKGolNCA9PSAxKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiMHglMDJ4ICIsIGkpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIgMHglMDh4ICIsIHZhbHVlKTsKLQkJaWYgKChqKyspJTQgPT0gMCkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7Ci0JfQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLQotCi1pbnQgcHJvY19nZXRfcnhfc2lnbmFsKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCWludCBsZW4gPSAwOwotCi0JbGVuID0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQsCi0JCSJyc3NpOiVkXG4iCi0JCSJyeHB3ZGI6JWRcbiIKLQkJInNpZ25hbF9zdHJlbmd0aDoldVxuIgotCQkic2lnbmFsX3F1YWw6JXVcbiIKLQkJIm5vaXNlOiV1XG4iLAotCQlwYWRhcHRlci0+cmVjdnByaXYucnNzaSwKLQkJcGFkYXB0ZXItPnJlY3Zwcml2LnJ4cHdkYiwKLQkJcGFkYXB0ZXItPnJlY3Zwcml2LnNpZ25hbF9zdHJlbmd0aCwKLQkJcGFkYXB0ZXItPnJlY3Zwcml2LnNpZ25hbF9xdWFsLAotCQlwYWRhcHRlci0+cmVjdnByaXYubm9pc2UKLQkJKTsKLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX3NldF9yeF9zaWduYWwoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JCXVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0JY2hhciB0bXBbMzJdOwotCXUzMiBpc19zaWduYWxfZGJnOwotCXMzMiBzaWduYWxfc3RyZW5ndGg7Ci0KLQlpZiAoY291bnQgPCAxKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChidWZmZXIgJiYgIWNvcHlfZnJvbV91c2VyKHRtcCwgYnVmZmVyLCBzaXplb2YodG1wKSkpIHsKLQkJaW50IG51bSA9IHNzY2FuZih0bXAsICIldSAldSIsICZpc19zaWduYWxfZGJnLCAmc2lnbmFsX3N0cmVuZ3RoKTsKLQotCQlpc19zaWduYWxfZGJnID0gaXNfc2lnbmFsX2RiZyA9PSAwID8gMCA6IDE7Ci0JCWlmIChpc19zaWduYWxfZGJnICYmIG51bSAhPSAyKQotCQkJcmV0dXJuIGNvdW50OwotCi0JCXNpZ25hbF9zdHJlbmd0aCA9IGNsYW1wKHNpZ25hbF9zdHJlbmd0aCwgMCwgMTAwKTsKLQotCQlwYWRhcHRlci0+cmVjdnByaXYuaXNfc2lnbmFsX2RiZyA9IGlzX3NpZ25hbF9kYmc7Ci0JCXBhZGFwdGVyLT5yZWN2cHJpdi5zaWduYWxfc3RyZW5ndGhfZGJnID0gc2lnbmFsX3N0cmVuZ3RoOwotCi0JCWlmIChpc19zaWduYWxfZGJnKQotCQkJREJHXzg4RSgic2V0ICVzICV1XG4iLCAiREJHX1NJR05BTF9TVFJFTkdUSCIsIHNpZ25hbF9zdHJlbmd0aCk7Ci0JCWVsc2UKLQkJCURCR184OEUoInNldCAlc1xuIiwgIkhXX1NJR05BTF9TVFJFTkdUSCIpOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLWludCBwcm9jX2dldF9odF9lbmFibGUoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYJKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0JaW50IGxlbiA9IDA7Ci0KLQlpZiAocHJlZ3ByaXYpCi0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKLQkJCSIlZFxuIiwKLQkJCXByZWdwcml2LT5odF9lbmFibGUKLQkJCSk7Ci0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotaW50IHByb2Nfc2V0X2h0X2VuYWJsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQljaGFyIHRtcFszMl07Ci0JczMyIG1vZGUgPSAwOwotCi0JaWYgKGNvdW50IDwgMSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoYnVmZmVyICYmICFjb3B5X2Zyb21fdXNlcih0bXAsIGJ1ZmZlciwgc2l6ZW9mKHRtcCkpKSB7Ci0JCWlmIChwcmVncHJpdikgewotCQkJcHJlZ3ByaXYtPmh0X2VuYWJsZSA9IG1vZGU7Ci0JCQlwcl9pbmZvKCJodF9lbmFibGU9JWRcbiIsIHByZWdwcml2LT5odF9lbmFibGUpOwotCQl9Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCi1pbnQgcHJvY19nZXRfY2J3NDBfZW5hYmxlKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCi0JaW50IGxlbiA9IDA7Ci0KLQlpZiAocHJlZ3ByaXYpCi0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKLQkJCSIlZFxuIiwKLQkJCXByZWdwcml2LT5jYnc0MF9lbmFibGUKLQkJCSk7Ci0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19zZXRfY2J3NDBfZW5hYmxlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCWNoYXIgdG1wWzMyXTsKLQlzMzIgbW9kZSA9IDA7Ci0KLQlpZiAoY291bnQgPCAxKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChidWZmZXIgJiYgIWNvcHlfZnJvbV91c2VyKHRtcCwgYnVmZmVyLCBzaXplb2YodG1wKSkpIHsKLQkJaWYgKHByZWdwcml2KSB7Ci0JCQlwcmVncHJpdi0+Y2J3NDBfZW5hYmxlID0gbW9kZTsKLQkJCXByX2luZm8oImNidzQwX2VuYWJsZT0lZFxuIiwgbW9kZSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGNvdW50OwotfQotCi1pbnQgcHJvY19nZXRfYW1wZHVfZW5hYmxlKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCi0JaW50IGxlbiA9IDA7Ci0KLQlpZiAocHJlZ3ByaXYpCi0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKLQkJCSIlZFxuIiwKLQkJCXByZWdwcml2LT5hbXBkdV9lbmFibGUKLQkJCSk7Ci0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19zZXRfYW1wZHVfZW5hYmxlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCWNoYXIgdG1wWzMyXTsKLQlzMzIgbW9kZSA9IDA7Ci0KLQlpZiAoY291bnQgPCAxKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChidWZmZXIgJiYgIWNvcHlfZnJvbV91c2VyKHRtcCwgYnVmZmVyLCBzaXplb2YodG1wKSkpIHsKLQkJaWYgKHByZWdwcml2KSB7Ci0JCQlwcmVncHJpdi0+YW1wZHVfZW5hYmxlID0gbW9kZTsKLQkJCXByX2luZm8oImFtcGR1X2VuYWJsZT0lZFxuIiwgbW9kZSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGNvdW50OwotfQotCi1pbnQgcHJvY19nZXRfdHdvX3BhdGhfcnNzaShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWludCBsZW4gPSAwOwotCi0JaWYgKHBhZGFwdGVyKQotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCi0JCQkiJWQgJWRcbiIsCi0JCQlwYWRhcHRlci0+cmVjdnByaXYuUnhSc3NpWzBdLAotCQkJcGFkYXB0ZXItPnJlY3Zwcml2LlJ4UnNzaVsxXQotCQkJKTsKLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9yeF9zdGJjKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCi0JaW50IGxlbiA9IDA7Ci0KLQlpZiAocHJlZ3ByaXYpCi0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKLQkJCSIlZFxuIiwKLQkJCXByZWdwcml2LT5yeF9zdGJjCi0JCQkpOwotCi0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotaW50IHByb2Nfc2V0X3J4X3N0YmMoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JCXVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYJKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0JY2hhciB0bXBbMzJdOwotCXUzMiBtb2RlID0gMDsKLQotCWlmIChjb3VudCA8IDEpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGJ1ZmZlciAmJiAhY29weV9mcm9tX3VzZXIodG1wLCBidWZmZXIsIHNpemVvZih0bXApKSkgewotCQlpZiAocHJlZ3ByaXYpIHsKLQkJCXByZWdwcml2LT5yeF9zdGJjID0gbW9kZTsKLQkJCW5ldGRldl9pbmZvKGRldiwgInJ4X3N0YmM9JWRcbiIsIG1vZGUpOwotCQl9Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLQotaW50IHByb2NfZ2V0X3Jzc2lfZGlzcChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQkqZW9mID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHByb2Nfc2V0X3Jzc2lfZGlzcChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQljaGFyIHRtcFszMl07Ci0JdTMyIGVuYWJsZSA9IDA7Ci0KLQlpZiAoY291bnQgPCAxKSB7Ci0JCURCR184OEUoImFyZ3VtZW50IHNpemUgaXMgbGVzcyB0aGFuIDFcbiIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlpZiAoYnVmZmVyICYmICFjb3B5X2Zyb21fdXNlcih0bXAsIGJ1ZmZlciwgc2l6ZW9mKHRtcCkpKSB7Ci0JCWludCBudW0gPSBzc2NhbmYodG1wLCAiJXgiLCAmZW5hYmxlKTsKLQotCQlpZiAobnVtICE9ICAxKSB7Ci0JCQlEQkdfODhFKCJpbnZhbGlkIHNldF9yc3NpX2Rpc3AgcGFyYW1ldGVyIVxuIik7Ci0JCQlyZXR1cm4gY291bnQ7Ci0JCX0KLQotCQlpZiAoZW5hYmxlKSB7Ci0JCQlEQkdfODhFKCJUdXJuIE9uIFJ4IFJTU0kgRGlzcGxheSBGdW5jdGlvblxuIik7Ci0JCQlwYWRhcHRlci0+YlJ4UlNTSURpc3BsYXkgPSBlbmFibGU7Ci0JCX0gZWxzZSB7Ci0JCQlEQkdfODhFKCJUdXJuIE9mZiBSeCBSU1NJIERpc3BsYXkgRnVuY3Rpb25cbiIpOwotCQkJcGFkYXB0ZXItPmJSeFJTU0lEaXNwbGF5ID0gMDsKLQkJfQotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLSNpZmRlZiBDT05GSUdfODhFVV9BUF9NT0RFCi0KLWludCBwcm9jX2dldF9hbGxfc3RhX2luZm8oY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0JaW50IGksIGo7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGxpc3QsICpwaGVhZDsKLQlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmw7Ci0JaW50IGxlbiA9IDA7Ci0KLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInN0YV9kel9iaXRtYXA9MHgleCwgdGltX2JpdG1hcD0weCV4XG4iLCBwc3RhcHJpdi0+c3RhX2R6X2JpdG1hcCwgcHN0YXByaXYtPnRpbV9iaXRtYXApOwotCi0Jc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1NUQTsgaSsrKSB7Ci0JCXBoZWFkID0gJnBzdGFwcml2LT5zdGFfaGFzaFtpXTsKLQkJcGxpc3QgPSBwaGVhZC0+bmV4dDsKLQotCQl3aGlsZSAocGhlYWQgIT0gcGxpc3QpIHsKLQkJCXBzdGEgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgaGFzaF9saXN0KTsKLQotCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKLQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAic3RhJ3MgbWFjYWRkcjogJXBNXG4iLCBwc3RhLT5od2FkZHIpOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAicnRzZW49JWQsIGN0czJzbGVmPSVkXG4iLCBwc3RhLT5ydHNlbiwgcHN0YS0+Y3RzMnNlbGYpOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAic3RhdGU9MHgleCwgYWlkPSVkLCBtYWNpZD0lZCwgcmFpZD0lZFxuIiwgcHN0YS0+c3RhdGUsIHBzdGEtPmFpZCwgcHN0YS0+bWFjX2lkLCBwc3RhLT5yYWlkKTsKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInFvc19lbj0lZCwgaHRfZW49JWQsIGluaXRfcmF0ZT0lZFxuIiwgcHN0YS0+cW9zX29wdGlvbiwgcHN0YS0+aHRwcml2Lmh0X29wdGlvbiwgcHN0YS0+aW5pdF9yYXRlKTsKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImJ3bW9kZT0lZCwgY2hfb2Zmc2V0PSVkLCBzZ2k9JWRcbiIsIHBzdGEtPmh0cHJpdi5id21vZGUsIHBzdGEtPmh0cHJpdi5jaF9vZmZzZXQsIHBzdGEtPmh0cHJpdi5zZ2kpOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiYW1wZHVfZW5hYmxlID0gJWRcbiIsIHBzdGEtPmh0cHJpdi5hbXBkdV9lbmFibGUpOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiYWdnX2VuYWJsZV9iaXRtYXA9JXgsIGNhbmRpZGF0ZV90aWRfYml0bWFwPSV4XG4iLCBwc3RhLT5odHByaXYuYWdnX2VuYWJsZV9iaXRtYXAsIHBzdGEtPmh0cHJpdi5jYW5kaWRhdGVfdGlkX2JpdG1hcCk7Ci0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJzbGVlcHFfbGVuPSVkXG4iLCBwc3RhLT5zbGVlcHFfbGVuKTsKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImNhcGFiaWxpdHk9MHgleFxuIiwgcHN0YS0+Y2FwYWJpbGl0eSk7Ci0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJmbGFncz0weCV4XG4iLCBwc3RhLT5mbGFncyk7Ci0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJ3cGFfcHNrPTB4JXhcbiIsIHBzdGEtPndwYV9wc2spOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAid3BhMl9ncm91cF9jaXBoZXI9MHgleFxuIiwgcHN0YS0+d3BhMl9ncm91cF9jaXBoZXIpOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAid3BhMl9wYWlyd2lzZV9jaXBoZXI9MHgleFxuIiwgcHN0YS0+d3BhMl9wYWlyd2lzZV9jaXBoZXIpOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAicW9zX2luZm89MHgleFxuIiwgcHN0YS0+cW9zX2luZm8pOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiZG90MTE4MDIxWFByaXZhY3k9MHgleFxuIiwgcHN0YS0+ZG90MTE4MDIxWFByaXZhY3kpOwotCi0JCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgewotCQkJCXByZW9yZGVyX2N0cmwgPSAmcHN0YS0+cmVjdnJlb3JkZXJfY3RybFtqXTsKLQkJCQlpZiAocHJlb3JkZXJfY3RybC0+ZW5hYmxlKQotCQkJCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJ0aWQ9JWQsIGluZGljYXRlX3NlcT0lZFxuIiwgaiwgcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxKTsKLQkJCX0KLQkJfQotCX0KLQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCi0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLSNlbmRpZgotCiBpbnQgcHJvY19nZXRfYmVzdF9jaGFubmVsKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKIAkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCiAJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19lZnVzZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19lZnVzZS5jCmluZGV4IGZiY2UxZjcuLjE2Y2M3NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZWZ1c2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2VmdXNlLmMKQEAgLTMxNyw2OSArMzE3LDYgQEAKIAl9CiB9CiAKLS8qIERvIG5vdCBzdXBwb3J0IEJUICovCi12b2lkIEVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbihzdHJ1Y3QgYWRhcHRlciAqcEFkYXB0ZXIsIHU4IGVmdXNlVHlwZSwgdTggdHlwZSwgdm9pZCAqcE91dCkKLXsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIFRZUEVfRUZVU0VfTUFYX1NFQ1RJT046Ci0JCXsKLQkJCXU4ICpwTWF4X3NlY3Rpb247Ci0JCQlwTWF4X3NlY3Rpb24gPSBwT3V0OwotCQkJKnBNYXhfc2VjdGlvbiA9IEVGVVNFX01BWF9TRUNUSU9OXzg4RTsKLQkJfQotCQlicmVhazsKLQljYXNlIFRZUEVfRUZVU0VfUkVBTF9DT05URU5UX0xFTjoKLQkJewotCQkJdTE2ICpwdTJUbXA7Ci0JCQlwdTJUbXAgPSBwT3V0OwotCQkJKnB1MlRtcCA9IEVGVVNFX1JFQUxfQ09OVEVOVF9MRU5fODhFOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVFlQRV9FRlVTRV9DT05URU5UX0xFTl9CQU5LOgotCQl7Ci0JCQl1MTYgKnB1MlRtcDsKLQkJCXB1MlRtcCA9IHBPdXQ7Ci0JCQkqcHUyVG1wID0gRUZVU0VfUkVBTF9DT05URU5UX0xFTl84OEU7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19CQU5LOgotCQl7Ci0JCQl1MTYgKnB1MlRtcDsKLQkJCXB1MlRtcCA9IHBPdXQ7Ci0JCQkqcHUyVG1wID0gKHUxNikoRUZVU0VfUkVBTF9DT05URU5UX0xFTl84OEUtRUZVU0VfT09CX1BST1RFQ1RfQllURVNfODhFKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFRZUEVfQVZBSUxBQkxFX0VGVVNFX0JZVEVTX1RPVEFMOgotCQl7Ci0JCQl1MTYgKnB1MlRtcDsKLQkJCXB1MlRtcCA9IHBPdXQ7Ci0JCQkqcHUyVG1wID0gKHUxNikoRUZVU0VfUkVBTF9DT05URU5UX0xFTl84OEUtRUZVU0VfT09CX1BST1RFQ1RfQllURVNfODhFKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFRZUEVfRUZVU0VfTUFQX0xFTjoKLQkJewotCQkJdTE2ICpwdTJUbXA7Ci0JCQlwdTJUbXAgPSBwT3V0OwotCQkJKnB1MlRtcCA9ICh1MTYpRUZVU0VfTUFQX0xFTl84OEU7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBUWVBFX0VGVVNFX1BST1RFQ1RfQllURVNfQkFOSzoKLQkJewotCQkJdTggKnB1MVRtcDsKLQkJCXB1MVRtcCA9IHBPdXQ7Ci0JCQkqcHUxVG1wID0gKHU4KShFRlVTRV9PT0JfUFJPVEVDVF9CWVRFU184OEUpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXsKLQkJCXU4ICpwdTFUbXA7Ci0JCQlwdTFUbXAgPSBwT3V0OwotCQkJKnB1MVRtcCA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotfQotCiB1OCBFZnVzZV9Xb3JkRW5hYmxlRGF0YVdyaXRlKHN0cnVjdCBhZGFwdGVyICpwQWRhcHRlciwgdTE2IGVmdXNlX2FkZHIsIHU4IHdvcmRfZW4sIHU4ICpkYXRhKQogewogCXUxNgl0bXBhZGRyID0gMDsKQEAgLTQ4MywxNCArNDIwLDExIEBACiAJdTggaG9mZnNldCA9IDAsIGh3b3JkZW4gPSAwOwogCXU4IHRtcGlkeCA9IDA7CiAJdTggdG1wZGF0YVs4XTsKLQl1OCBtYXhfc2VjdGlvbiA9IDA7CiAJdTggdG1wX2hlYWRlciA9IDA7CiAKLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24ocEFkYXB0ZXIsIEVGVVNFX1dJRkksIFRZUEVfRUZVU0VfTUFYX1NFQ1RJT04sICh2b2lkICopJm1heF9zZWN0aW9uKTsKLQogCWlmICghZGF0YSkKIAkJcmV0dXJuIGZhbHNlOwotCWlmIChvZmZzZXQgPiBtYXhfc2VjdGlvbikKKwlpZiAob2Zmc2V0ID4gRUZVU0VfTUFYX1NFQ1RJT05fODhFKQogCQlyZXR1cm4gZmFsc2U7CiAKIAltZW1zZXQoZGF0YSwgMHhmZiwgc2l6ZW9mKHU4KSAqIFBHUEtUX0RBVEFfU0laRSk7CkBAIC01OTEsMTIgKzUyNSwxMiBAQAogc3RhdGljIGJvb2wgaGFsX0VmdXNlUGdQYWNrZXRXcml0ZTJCeXRlSGVhZGVyKHN0cnVjdCBhZGFwdGVyICpwQWRhcHRlciwgdTggZWZ1c2VUeXBlLCB1MTYgKnBBZGRyLCBzdHJ1Y3QgcGdwa3QgKnBUYXJnZXRQa3QpCiB7CiAJYm9vbCBiUmV0ID0gZmFsc2U7Ci0JdTE2CWVmdXNlX2FkZHIgPSAqcEFkZHIsIGVmdXNlX21heF9hdmFpbGFibGVfbGVuID0gMDsKKwl1MTYgZWZ1c2VfYWRkciA9ICpwQWRkcjsKKwl1MTYgZWZ1c2VfbWF4X2F2YWlsYWJsZV9sZW4gPQorCQlFRlVTRV9SRUFMX0NPTlRFTlRfTEVOXzg4RSAtIEVGVVNFX09PQl9QUk9URUNUX0JZVEVTXzg4RTsKIAl1OCBwZ19oZWFkZXIgPSAwLCB0bXBfaGVhZGVyID0gMCwgcGdfaGVhZGVyX3RlbXAgPSAwOwogCXU4IHJlcGVhdGNudCA9IDA7CiAKLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24ocEFkYXB0ZXIsIGVmdXNlVHlwZSwgVFlQRV9BVkFJTEFCTEVfRUZVU0VfQllURVNfQkFOSywgKHZvaWQgKikmZWZ1c2VfbWF4X2F2YWlsYWJsZV9sZW4pOwotCiAJd2hpbGUgKGVmdXNlX2FkZHIgPCBlZnVzZV9tYXhfYXZhaWxhYmxlX2xlbikgewogCQlwZ19oZWFkZXIgPSAoKHBUYXJnZXRQa3QtPm9mZnNldCAmIDB4MDcpIDw8IDUpIHwgMHgwRjsKIAkJZWZ1c2VfT25lQnl0ZVdyaXRlKHBBZGFwdGVyLCBlZnVzZV9hZGRyLCBwZ19oZWFkZXIpOwpAQCAtNzY5LDEyICs3MDMsMTEgQEAKIAlib29sIGJSZXQgPSBmYWxzZTsKIAl1OCBpLCBlZnVzZV9kYXRhID0gMCwgY3VyX2hlYWRlciA9IDA7CiAJdTggbWF0Y2hlZF93ZGVuID0gMCwgYmFkd29yZGVuID0gMDsKLQl1MTYJc3RhcnRBZGRyID0gMCwgZWZ1c2VfbWF4X2F2YWlsYWJsZV9sZW4gPSAwLCBlZnVzZV9tYXggPSAwOworCXUxNiBzdGFydEFkZHIgPSAwOworCXUxNiBlZnVzZV9tYXhfYXZhaWxhYmxlX2xlbiA9CisJCUVGVVNFX1JFQUxfQ09OVEVOVF9MRU5fODhFIC0gRUZVU0VfT09CX1BST1RFQ1RfQllURVNfODhFOwogCXN0cnVjdCBwZ3BrdCBjdXJQa3Q7CiAKLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24ocEFkYXB0ZXIsIGVmdXNlVHlwZSwgVFlQRV9BVkFJTEFCTEVfRUZVU0VfQllURVNfQkFOSywgKHZvaWQgKikmZWZ1c2VfbWF4X2F2YWlsYWJsZV9sZW4pOwotCUVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbihwQWRhcHRlciwgZWZ1c2VUeXBlLCBUWVBFX0VGVVNFX1JFQUxfQ09OVEVOVF9MRU4sICh2b2lkICopJmVmdXNlX21heCk7Ci0KIAlydHdfaGFsX2dldF9od3JlZyhwQWRhcHRlciwgSFdfVkFSX0VGVVNFX0JZVEVTLCAodTggKikmc3RhcnRBZGRyKTsKIAlzdGFydEFkZHIgJT0gRUZVU0VfUkVBTF9DT05URU5UX0xFTjsKIApAQCAtODQ2LDEyICs3NzksNyBAQAogCQl1OCBlZnVzZVR5cGUKIAkpCiB7Ci0JdTE2CWVmdXNlX21heF9hdmFpbGFibGVfbGVuID0gMDsKLQotCS8qIENoYW5nZSB0byBjaGVjayBUWVBFX0VGVVNFX01BUF9MRU4gLCBiZWNhdXNlIDgxODhFIHJhdyAyNTYsIGxvZ2ljIG1hcCBvdmVyIDI1Ni4gKi8KLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24ocEFkYXB0ZXIsIEVGVVNFX1dJRkksIFRZUEVfRUZVU0VfTUFQX0xFTiwgKHZvaWQgKikmZWZ1c2VfbWF4X2F2YWlsYWJsZV9sZW4pOwotCi0JaWYgKEVmdXNlX0dldEN1cnJlbnRTaXplKHBBZGFwdGVyKSA+PSBlZnVzZV9tYXhfYXZhaWxhYmxlX2xlbikKKwlpZiAoRWZ1c2VfR2V0Q3VycmVudFNpemUocEFkYXB0ZXIpID49IEVGVVNFX01BUF9MRU5fODhFKQogCQlyZXR1cm4gZmFsc2U7CiAJcmV0dXJuIHRydWU7CiB9CkBAIC05NzcsMTMgKzkwNSw5IEBACiAgKi8KIHN0YXRpYyB2b2lkIEVmdXNlX1JlYWRBbGxNYXAoc3RydWN0IGFkYXB0ZXIgKnBBZGFwdGVyLCB1OCBlZnVzZVR5cGUsIHU4ICpFZnVzZSkKIHsKLQl1MTYgbWFwTGVuID0gMDsKLQogCUVmdXNlX1Bvd2VyU3dpdGNoKHBBZGFwdGVyLCBmYWxzZSwgdHJ1ZSk7CiAKLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24ocEFkYXB0ZXIsIGVmdXNlVHlwZSwgVFlQRV9FRlVTRV9NQVBfTEVOLCAodm9pZCAqKSZtYXBMZW4pOwotCi0JZWZ1c2VfUmVhZEVGdXNlKHBBZGFwdGVyLCBlZnVzZVR5cGUsIDAsIG1hcExlbiwgRWZ1c2UpOworCWVmdXNlX1JlYWRFRnVzZShwQWRhcHRlciwgZWZ1c2VUeXBlLCAwLCBFRlVTRV9NQVBfTEVOXzg4RSwgRWZ1c2UpOwogCiAJRWZ1c2VfUG93ZXJTd2l0Y2gocEFkYXB0ZXIsIGZhbHNlLCBmYWxzZSk7CiB9CkBAIC05OTYsMTIgKzkyMCw5IEBACiAJdTggZWZ1c2VUeXBlKQogewogCXN0cnVjdCBlZXByb21fcHJpdiAqcEVFUFJPTSA9IEdFVF9FRVBST01fRUZVU0VfUFJJVihwQWRhcHRlcik7Ci0JdTE2IG1hcExlbiA9IDA7Ci0KLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24ocEFkYXB0ZXIsIGVmdXNlVHlwZSwgVFlQRV9FRlVTRV9NQVBfTEVOLCAodm9pZCAqKSZtYXBMZW4pOwogCiAJaWYgKHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpCi0JCW1lbXNldChwRUVQUk9NLT5lZnVzZV9lZXByb21fZGF0YSwgMHhGRiwgbWFwTGVuKTsKKwkJbWVtc2V0KHBFRVBST00tPmVmdXNlX2VlcHJvbV9kYXRhLCAweEZGLCBFRlVTRV9NQVBfTEVOXzg4RSk7CiAJZWxzZQogCQlFZnVzZV9SZWFkQWxsTWFwKHBBZGFwdGVyLCBlZnVzZVR5cGUsIHBFRVBST00tPmVmdXNlX2VlcHJvbV9kYXRhKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaWVlZTgwMjExLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2llZWU4MDIxMS5jCmluZGV4IDBiMGQ3OGYuLjkxNGM0OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaWVlZTgwMjExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pZWVlODAyMTEuYwpAQCAtMTU1LDU5ICsxNTUsNiBAQAogCXJldHVybiBwYnVmICsgbGVuICsgMjsKIH0KIAotaW5saW5lIHU4ICpydHdfc2V0X2llX2NoX3N3aXRjaCh1OCAqYnVmLCB1MzIgKmJ1Zl9sZW4sIHU4IGNoX3N3aXRjaF9tb2RlLAotCXU4IG5ld19jaCwgdTggY2hfc3dpdGNoX2NudCkKLXsKLQl1OCBpZV9kYXRhWzNdOwotCi0JaWVfZGF0YVswXSA9IGNoX3N3aXRjaF9tb2RlOwotCWllX2RhdGFbMV0gPSBuZXdfY2g7Ci0JaWVfZGF0YVsyXSA9IGNoX3N3aXRjaF9jbnQ7Ci0JcmV0dXJuIHJ0d19zZXRfaWUoYnVmLCBXTEFOX0VJRF9DSEFOTkVMX1NXSVRDSCwgIDMsIGllX2RhdGEsIGJ1Zl9sZW4pOwotfQotCi1pbmxpbmUgdTggc2Vjb25kYXJ5X2NoX29mZnNldF90b19oYWxfY2hfb2Zmc2V0KHU4IGNoX29mZnNldCkKLXsKLQlpZiAoY2hfb2Zmc2V0ID09IFNDTikKLQkJcmV0dXJuIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkU7Ci0JZWxzZSBpZiAoY2hfb2Zmc2V0ID09IFNDQSkKLQkJcmV0dXJuIEhBTF9QUklNRV9DSE5MX09GRlNFVF9VUFBFUjsKLQllbHNlIGlmIChjaF9vZmZzZXQgPT0gU0NCKQotCQlyZXR1cm4gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSOwotCi0JcmV0dXJuIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkU7Ci19Ci0KLWlubGluZSB1OCBoYWxfY2hfb2Zmc2V0X3RvX3NlY29uZGFyeV9jaF9vZmZzZXQodTggY2hfb2Zmc2V0KQotewotCWlmIChjaF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSkKLQkJcmV0dXJuIFNDTjsKLQllbHNlIGlmIChjaF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSKQotCQlyZXR1cm4gU0NCOwotCWVsc2UgaWYgKGNoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIpCi0JCXJldHVybiBTQ0E7Ci0KLQlyZXR1cm4gU0NOOwotfQotCi1pbmxpbmUgdTggKnJ0d19zZXRfaWVfc2Vjb25kYXJ5X2NoX29mZnNldCh1OCAqYnVmLCB1MzIgKmJ1Zl9sZW4sIHU4IHNlY29uZGFyeV9jaF9vZmZzZXQpCi17Ci0JcmV0dXJuIHJ0d19zZXRfaWUoYnVmLCBXTEFOX0VJRF9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVQsICAxLCAmc2Vjb25kYXJ5X2NoX29mZnNldCwgYnVmX2xlbik7Ci19Ci0KLWlubGluZSB1OCAqcnR3X3NldF9pZV9tZXNoX2NoX3N3aXRjaF9wYXJtKHU4ICpidWYsIHUzMiAqYnVmX2xlbiwgdTggdHRsLAotCXU4IGZsYWdzLCB1MTYgcmVhc29uLCB1MTYgcHJlY2VkZW5jZSkKLXsKLQl1OCBpZV9kYXRhWzZdOwotCi0JaWVfZGF0YVswXSA9IHR0bDsKLQlpZV9kYXRhWzFdID0gZmxhZ3M7Ci0JKih1MTYgKikoaWVfZGF0YSArIDIpID0gY3B1X3RvX2xlMTYocmVhc29uKTsKLQkqKHUxNiAqKShpZV9kYXRhICsgNCkgPSBjcHVfdG9fbGUxNihwcmVjZWRlbmNlKTsKLQotCXJldHVybiBydHdfc2V0X2llKGJ1ZiwgMHgxMTgsICA2LCBpZV9kYXRhLCBidWZfbGVuKTsKLX0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBpbmRleDogdGhlIGluZm9ybWF0aW9uIGVsZW1lbnQgaWQgaW5kZXgsIGxpbWl0IGlzIHRoZSBsaW1pdCBmb3Igc2VhcmNoCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yMzYsOTcgKzE4Myw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qKgotICogcnR3X2dldF9pZV9leCAtIFNlYXJjaCBzcGVjaWZpYyBJRSBmcm9tIGEgc2VyaWVzIG9mIElFcwotICogQGluX2llOiBBZGRyZXNzIG9mIElFcyB0byBzZWFyY2gKLSAqIEBpbl9sZW46IExlbmd0aCBsaW1pdCBmcm9tIGluX2llCi0gKiBAZWlkOiBFbGVtZW50IElEIHRvIG1hdGNoCi0gKiBAb3VpOiBPVUkgdG8gbWF0Y2gKLSAqIEBvdWlfbGVuOiBPVUkgbGVuZ3RoCi0gKiBAaWU6IElmIG5vdCBOVUxMIGFuZCB0aGUgc3BlY2lmaWMgSUUgaXMgZm91bmQsIHRoZSBJRSB3aWxsIGJlIGNvcGllZCB0byB0aGUgYnVmIHN0YXJ0aW5nIGZyb20gdGhlIHNwZWNpZmljIElFCi0gKiBAaWVsZW46IElmIG5vdCBOVUxMIGFuZCB0aGUgc3BlY2lmaWMgSUUgaXMgZm91bmQsIHdpbGwgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlIGVudGlyZSBJRQotICoKLSAqIFJldHVybnM6IFRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpYyBJRSBmb3VuZCwgb3IgTlVMTAotICovCi11OCAqcnR3X2dldF9pZV9leCh1OCAqaW5faWUsIHVpbnQgaW5fbGVuLCB1OCBlaWQsIHU4ICpvdWksIHU4IG91aV9sZW4sIHU4ICppZSwgdWludCAqaWVsZW4pCi17Ci0JdWludCBjbnQ7Ci0JdTggKnRhcmdldF9pZSA9IE5VTEw7Ci0KLQotCWlmIChpZWxlbikKLQkJKmllbGVuID0gMDsKLQotCWlmICghaW5faWUgfHwgaW5fbGVuIDw9IDApCi0JCXJldHVybiB0YXJnZXRfaWU7Ci0KLQljbnQgPSAwOwotCi0Jd2hpbGUgKGNudCA8IGluX2xlbikgewotCQlpZiAoZWlkID09IGluX2llW2NudF0gJiYgKCFvdWkgfHwgIW1lbWNtcCgmaW5faWVbY250ICsgMl0sIG91aSwgb3VpX2xlbikpKSB7Ci0JCQl0YXJnZXRfaWUgPSAmaW5faWVbY250XTsKLQotCQkJaWYgKGllKQotCQkJCW1lbWNweShpZSwgJmluX2llW2NudF0sIGluX2llW2NudCArIDFdICsgMik7Ci0KLQkJCWlmIChpZWxlbikKLQkJCQkqaWVsZW4gPSBpbl9pZVtjbnQgKyAxXSArIDI7Ci0KLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJY250ICs9IGluX2llW2NudCArIDFdICsgMjsgLyogZ290byBuZXh0ICovCi0JCX0KLQl9Ci0JcmV0dXJuIHRhcmdldF9pZTsKLX0KLQotLyoqCi0gKiBydHdfaWVzX3JlbW92ZV9pZSAtIEZpbmQgbWF0Y2hpbmcgSUVzIGFuZCByZW1vdmUKLSAqIEBpZXM6IEFkZHJlc3Mgb2YgSUVzIHRvIHNlYXJjaAotICogQGllc19sZW46IFBvaW50ZXIgb2YgbGVuZ3RoIG9mIGllcywgd2lsbCB1cGRhdGUgdG8gbmV3IGxlbmd0aAotICogQG9mZnNldDogVGhlIG9mZnNldCB0byBzdGFydCBzY2FyY2gKLSAqIEBlaWQ6IEVsZW1lbnQgSUQgdG8gbWF0Y2gKLSAqIEBvdWk6IE9VSSB0byBtYXRjaAotICogQG91aV9sZW46IE9VSSBsZW5ndGgKLSAqCi0gKiBSZXR1cm5zOiBfU1VDQ0VTUzogaWVzIGlzIHVwZGF0ZWQsIF9GQUlMOiBub3QgdXBkYXRlZAotICovCi1pbnQgcnR3X2llc19yZW1vdmVfaWUodTggKmllcywgdWludCAqaWVzX2xlbiwgdWludCBvZmZzZXQsIHU4IGVpZCwgdTggKm91aSwgdTggb3VpX2xlbikKLXsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0JdTggKnRhcmdldF9pZTsKLQl1MzIgdGFyZ2V0X2llbGVuOwotCXU4ICpzdGFydDsKLQl1aW50IHNlYXJjaF9sZW47Ci0KLQlpZiAoIWllcyB8fCAhaWVzX2xlbiB8fCAqaWVzX2xlbiA8PSBvZmZzZXQpCi0JCWdvdG8gZXhpdDsKLQotCXN0YXJ0ID0gaWVzICsgb2Zmc2V0OwotCXNlYXJjaF9sZW4gPSAqaWVzX2xlbiAtIG9mZnNldDsKLQotCXdoaWxlICgxKSB7Ci0JCXRhcmdldF9pZSA9IHJ0d19nZXRfaWVfZXgoc3RhcnQsIHNlYXJjaF9sZW4sIGVpZCwgb3VpLCBvdWlfbGVuLCBOVUxMLCAmdGFyZ2V0X2llbGVuKTsKLQkJaWYgKHRhcmdldF9pZSAmJiB0YXJnZXRfaWVsZW4pIHsKLQkJCXU4IGJ1ZltNQVhfSUVfU1pdID0gezB9OwotCQkJdTggKnJlbWFpbl9pZXMgPSB0YXJnZXRfaWUgKyB0YXJnZXRfaWVsZW47Ci0JCQl1aW50IHJlbWFpbl9sZW4gPSBzZWFyY2hfbGVuIC0gKHJlbWFpbl9pZXMgLSBzdGFydCk7Ci0KLQkJCW1lbWNweShidWYsIHJlbWFpbl9pZXMsIHJlbWFpbl9sZW4pOwotCQkJbWVtY3B5KHRhcmdldF9pZSwgYnVmLCByZW1haW5fbGVuKTsKLQkJCSppZXNfbGVuID0gKmllc19sZW4gLSB0YXJnZXRfaWVsZW47Ci0JCQlyZXQgPSBfU1VDQ0VTUzsKLQotCQkJc3RhcnQgPSB0YXJnZXRfaWU7Ci0JCQlzZWFyY2hfbGVuID0gcmVtYWluX2xlbjsKLQkJfSBlbHNlIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCiB2b2lkIHJ0d19zZXRfc3VwcG9ydGVkX3JhdGUodTggKlN1cHBvcnRlZFJhdGVzLCB1aW50IG1vZGUpCiB7CiAKQEAgLTEwOTYsNDMgKzk1Miw2IEBACiAJREJHXzg4RSgicnR3X21hY2FkZHJfY2ZnIE1BQyBBZGRyZXNzICA9ICVwTVxuIiwgKG1hY19hZGRyKSk7CiB9CiAKLXZvaWQgZHVtcF9pZXModTggKmJ1ZiwgdTMyIGJ1Zl9sZW4pCi17Ci0JdTggKnBvcyA9IGJ1ZjsKLQl1OCBpZCwgbGVuOwotCi0Jd2hpbGUgKHBvcyAtIGJ1ZiA8PSBidWZfbGVuKSB7Ci0JCWlkID0gKnBvczsKLQkJbGVuID0gKihwb3MgKyAxKTsKLQotCQlEQkdfODhFKCIlcyBJRDoldSwgTEVOOiV1XG4iLCBfX2Z1bmNfXywgaWQsIGxlbik7Ci0JCWR1bXBfd3BzX2llKHBvcywgbGVuKTsKLQotCQlwb3MgKz0gKDIgKyBsZW4pOwotCX0KLX0KLQotdm9pZCBkdW1wX3dwc19pZSh1OCAqaWUsIHUzMiBpZV9sZW4pCi17Ci0JdTggKnBvcyA9IGllOwotCXUxNiBpZDsKLQl1MTYgbGVuOwotCXU4ICp3cHNfaWU7Ci0JdWludCB3cHNfaWVsZW47Ci0KLQl3cHNfaWUgPSBydHdfZ2V0X3dwc19pZShpZSwgaWVfbGVuLCBOVUxMLCAmd3BzX2llbGVuKTsKLQlpZiAod3BzX2llICE9IGllIHx8IHdwc19pZWxlbiA9PSAwKQotCQlyZXR1cm47Ci0KLQlwb3MgKz0gNjsKLQl3aGlsZSAocG9zIC0gaWUgPCBpZV9sZW4pIHsKLQkJaWQgPSBnZXRfdW5hbGlnbmVkX2JlMTYocG9zKTsKLQkJbGVuID0gZ2V0X3VuYWxpZ25lZF9iZTE2KHBvcyArIDIpOwotCQlEQkdfODhFKCIlcyBJRDoweCUwNHgsIExFTjoldVxuIiwgX19mdW5jX18sIGlkLCBsZW4pOwotCQlwb3MgKz0gKDQgKyBsZW4pOwotCX0KLX0KLQogLyogQmFyb24gYWRkcyB0byBhdm9pZCBGcmVlQlNEIHdhcm5pbmcgKi8KIGludCBpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQoY29uc3QgY2hhciAqZXNzaWQsIGludCBlc3NpZF9sZW4pCiB7CkBAIC0xMjIzLDcgKzEwNDIsNiBAQAogCV9fbGUxNiBsZV90bXA7CiAJdTE2IHdwYV9sZW4gPSAwLCByc25fbGVuID0gMDsKIAlzdHJ1Y3QgSFRfaW5mb19lbGVtZW50ICpwaHRfaW5mbyA9IE5VTEw7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwICpwaHRfY2FwID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQJCWxlbjsKIAl1bnNpZ25lZCBjaGFyCQkqcDsKIApAQCAtMTI1OSwxMCArMTA3NywxMiBAQAogCS8qIHBhcnNpbmcgSFRfQ0FQX0lFICovCiAJcCA9IHJ0d19nZXRfaWUocG5ldHdvcmstPm5ldHdvcmsuSUVzICsgX0ZJWEVEX0lFX0xFTkdUSF8sIF9IVF9DQVBBQklMSVRZX0lFXywgJmxlbiwgcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGggLSBfRklYRURfSUVfTEVOR1RIXyk7CiAJaWYgKHAgJiYgbGVuID4gMCkgewotCQkJcGh0X2NhcCA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgKikocCArIDIpOwotCQkJcG5ldHdvcmstPkJjbkluZm8uaHRfY2FwX2luZm8gPSBwaHRfY2FwLT5jYXBfaW5mbzsKKwkJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcCA9CisJCQkoc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKikocCArIDIpOworCisJCXBuZXR3b3JrLT5CY25JbmZvLmh0X2NhcF9pbmZvID0gbGUxNl90b19jcHUoaHRfY2FwLT5jYXBfaW5mbyk7CiAJfSBlbHNlIHsKLQkJCXBuZXR3b3JrLT5CY25JbmZvLmh0X2NhcF9pbmZvID0gMDsKKwkJcG5ldHdvcmstPkJjbkluZm8uaHRfY2FwX2luZm8gPSAwOwogCX0KIAkvKiBwYXJzaW5nIEhUX0lORk9fSUUgKi8KIAlwID0gcnR3X2dldF9pZShwbmV0d29yay0+bmV0d29yay5JRXMgKyBfRklYRURfSUVfTEVOR1RIXywgX0hUX0FERF9JTkZPX0lFXywgJmxlbiwgcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGggLSBfRklYRURfSUVfTEVOR1RIXyk7CkBAIC0xMzM1LDU4ICsxMTU1LDMgQEAKIAl9CiAJcmV0dXJuIG1heF9yYXRlOwogfQotCi1pbnQgcnR3X2FjdGlvbl9mcmFtZV9wYXJzZShjb25zdCB1OCAqZnJhbWUsIHUzMiBmcmFtZV9sZW4sIHU4ICpjYXRlZ29yeSwgdTggKmFjdGlvbikKLXsKLQljb25zdCB1OCAqZnJhbWVfYm9keSA9IGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JdTE2IGZjOwotCXU4IGMsIGEgPSAwOwotCi0JZmMgPSBsZTE2X3RvX2NwdSgoKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkciAqKWZyYW1lKS0+ZnJhbWVfY3RsKTsKLQotCWlmICgoZmMgJiAoUlRXX0lFRUU4MDIxMV9GQ1RMX0ZUWVBFIHwgUlRXX0lFRUU4MDIxMV9GQ1RMX1NUWVBFKSkgIT0KLQkgICAgKFJUV19JRUVFODAyMTFfRlRZUEVfTUdNVCB8IFJUV19JRUVFODAyMTFfU1RZUEVfQUNUSU9OKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JYyA9IGZyYW1lX2JvZHlbMF07Ci0KLQlzd2l0Y2ggKGMpIHsKLQljYXNlIFJUV19XTEFOX0NBVEVHT1JZX1AyUDogLyogdmVuZG9yLXNwZWNpZmljICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWEgPSBmcmFtZV9ib2R5WzFdOwotCX0KLQotCWlmIChjYXRlZ29yeSkKLQkJKmNhdGVnb3J5ID0gYzsKLQlpZiAoYWN0aW9uKQotCQkqYWN0aW9uID0gYTsKLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqX2FjdGlvbl9wdWJsaWNfc3RyW10gPSB7Ci0JIkFDVF9QVUJfQlNTQ09FWElTVCIsCi0JIkFDVF9QVUJfRFNFX0VOQUJMRSIsCi0JIkFDVF9QVUJfRFNFX0RFRU5BQkxFIiwKLQkiQUNUX1BVQl9EU0VfUkVHX0xPQ0FUSU9OIiwKLQkiQUNUX1BVQl9FWFRfQ0hMX1NXSVRDSCIsCi0JIkFDVF9QVUJfRFNFX01TUl9SRVEiLAotCSJBQ1RfUFVCX0RTRV9NU1JfUlBSVCIsCi0JIkFDVF9QVUJfTVAiLAotCSJBQ1RfUFVCX0RTRV9QV1JfQ09OU1RSQUlOVCIsCi0JIkFDVF9QVUJfVkVORE9SIiwKLQkiQUNUX1BVQl9HQVNfSU5JVElBTF9SRVEiLAotCSJBQ1RfUFVCX0dBU19JTklUSUFMX1JTUCIsCi0JIkFDVF9QVUJfR0FTX0NPTUVCQUNLX1JFUSIsCi0JIkFDVF9QVUJfR0FTX0NPTUVCQUNLX1JTUCIsCi0JIkFDVF9QVUJfVERMU19ESVNDT1ZFUllfUlNQIiwKLQkiQUNUX1BVQl9MT0NBVElPTl9UUkFDSyIsCi0JIkFDVF9QVUJfUlNWRCIsCi19OwotCi1jb25zdCBjaGFyICphY3Rpb25fcHVibGljX3N0cih1OCBhY3Rpb24pCi17Ci0JYWN0aW9uID0gbWluX3QodTgsIGFjdGlvbiwgQUNUX1BVQkxJQ19NQVgpOwotCXJldHVybiBfYWN0aW9uX3B1YmxpY19zdHJbYWN0aW9uXTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaW9jdGxfc2V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2lvY3RsX3NldC5jCmluZGV4IGY4NWE2YWIuLjZlZDIzZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaW9jdGxfc2V0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pb2N0bF9zZXQuYwpAQCAtMTQsNyArMTQsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgX1JUV19JT0NUTF9TRVRfQ18KIAotCiAjaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgogI2luY2x1ZGUgPGRydl90eXBlcy5oPgogI2luY2x1ZGUgPHJ0d19pb2N0bF9zZXQuaD4KQEAgLTU3MCwxMCArNTY5LDggQEAKIAlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZhZGFwdGVyLT5yZWdpc3RyeXByaXY7CiAJc3RydWN0IG1sbWVfcHJpdgkqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICAqcGN1cl9ic3MgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcGllOwogCXU4CXJmX3R5cGUgPSAwOwogCXU4CWJ3XzQwTUh6ID0gMCwgc2hvcnRfR0lfMjAgPSAwLCBzaG9ydF9HSV80MCA9IDA7Ci0JdTE2CW1jc19yYXRlID0gMDsKIAl1MzIJaHRfaWVsZW4gPSAwOwogCiAJaWYgKGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5tcF9tb2RlID09IDEpIHsKQEAgLTU4OCwxNSArNTg1LDExIEBACiAJaWYgKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSAmIChXSVJFTEVTU18xMV8yNE58V0lSRUxFU1NfMTFfNU4pKSB7CiAJCXAgPSBydHdfZ2V0X2llKCZwY3VyX2Jzcy0+SUVzWzEyXSwgX0hUX0NBUEFCSUxJVFlfSUVfLCAmaHRfaWVsZW4sIHBjdXJfYnNzLT5JRUxlbmd0aC0xMik7CiAJCWlmIChwICYmIGh0X2llbGVuID4gMCkgewotCQkJcGh0X2NhcGllID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCAqKShwKzIpOwotCi0JCQltZW1jcHkoJm1jc19yYXRlLCBwaHRfY2FwaWUtPnN1cHBfbWNzX3NldCwgMik7Ci0KIAkJCS8qIGN1cl9id21vZCBpcyB1cGRhdGVkIGJ5IGJlYWNvbiwgcG1sbWVpbmZvIGlzIHVwZGF0ZWQgYnkgYXNzb2NpYXRpb24gcmVzcG9uc2UgKi8KIAkJCWJ3XzQwTUh6ID0gKHBtbG1lZXh0LT5jdXJfYndtb2RlICYmIChIVF9JTkZPX0hUX1BBUkFNX1JFQ19UUkFOU19DSE5MX1dJRFRIICYgcG1sbWVpbmZvLT5IVF9pbmZvLmluZm9zWzBdKSkgPyAxIDogMDsKIAotCQkJc2hvcnRfR0lfMjAgPSAobGUxNl90b19jcHUocG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuSFRfY2Fwc19pbmZvKSAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwKSA/IDEgOiAwOwotCQkJc2hvcnRfR0lfNDAgPSAobGUxNl90b19jcHUocG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuSFRfY2Fwc19pbmZvKSAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwKSA/IDEgOiAwOworCQkJc2hvcnRfR0lfMjAgPSAobGUxNl90b19jcHUocG1sbWVpbmZvLT5IVF9jYXBzLmNhcF9pbmZvKSAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwKSA/IDEgOiAwOworCQkJc2hvcnRfR0lfNDAgPSAobGUxNl90b19jcHUocG1sbWVpbmZvLT5IVF9jYXBzLmNhcF9pbmZvKSAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwKSA/IDEgOiAwOwogCiAJCQlydHdfaGFsX2dldF9od3JlZyhhZGFwdGVyLCBIV19WQVJfUkZfVFlQRSwgKHU4ICopKCZyZl90eXBlKSk7CiAJCQltYXhfcmF0ZSA9IHJ0d19tY3NfcmF0ZSgKQEAgLTYwNCw3ICs1OTcsNyBAQAogCQkJCWJ3XzQwTUh6ICYgKHByZWdpc3RyeXByaXYtPmNidzQwX2VuYWJsZSksCiAJCQkJc2hvcnRfR0lfMjAsCiAJCQkJc2hvcnRfR0lfNDAsCi0JCQkJcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuTUNTX3JhdGUKKwkJCQlwbWxtZWluZm8tPkhUX2NhcHMubWNzLnJ4X21hc2sKIAkJCSk7CiAJCX0KIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWUuYwppbmRleCAxNDU2NDk5Li5lZTJkY2QwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWUuYwpAQCAtNTIsOCArNTIsNiBAQAogCV9ydHdfaW5pdF9xdWV1ZSgmKHBtbG1lcHJpdi0+ZnJlZV9ic3NfcG9vbCkpOwogCV9ydHdfaW5pdF9xdWV1ZSgmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZSkpOwogCi0Jc2V0X3NjYW5uZWRfbmV0d29ya192YWwocG1sbWVwcml2LCAwKTsKLQogCW1lbXNldCgmcG1sbWVwcml2LT5hc3NvY19zc2lkLCAwLCBzaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX3NzaWQpKTsKIAogCXBidWYgPSB2emFsbG9jKE1BWF9CU1NfQ05UICogKHNpemVvZihzdHJ1Y3Qgd2xhbl9uZXR3b3JrKSkpOwpAQCAtMTAwLDEyICs5OCw2IEBACiAJcnR3X2ZyZWVfbWxtZV9pZV9kYXRhKCZwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWUsICZwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWVfbGVuKTsKIAlydHdfZnJlZV9tbG1lX2llX2RhdGEoJnBtbG1lcHJpdi0+d3BzX3Byb2JlX3Jlc3BfaWUsICZwbWxtZXByaXYtPndwc19wcm9iZV9yZXNwX2llX2xlbik7CiAJcnR3X2ZyZWVfbWxtZV9pZV9kYXRhKCZwbWxtZXByaXYtPndwc19hc3NvY19yZXNwX2llLCAmcG1sbWVwcml2LT53cHNfYXNzb2NfcmVzcF9pZV9sZW4pOwotCi0JcnR3X2ZyZWVfbWxtZV9pZV9kYXRhKCZwbWxtZXByaXYtPnAycF9iZWFjb25faWUsICZwbWxtZXByaXYtPnAycF9iZWFjb25faWVfbGVuKTsKLQlydHdfZnJlZV9tbG1lX2llX2RhdGEoJnBtbG1lcHJpdi0+cDJwX3Byb2JlX3JlcV9pZSwgJnBtbG1lcHJpdi0+cDJwX3Byb2JlX3JlcV9pZV9sZW4pOwotCXJ0d19mcmVlX21sbWVfaWVfZGF0YSgmcG1sbWVwcml2LT5wMnBfcHJvYmVfcmVzcF9pZSwgJnBtbG1lcHJpdi0+cDJwX3Byb2JlX3Jlc3BfaWVfbGVuKTsKLQlydHdfZnJlZV9tbG1lX2llX2RhdGEoJnBtbG1lcHJpdi0+cDJwX2dvX3Byb2JlX3Jlc3BfaWUsICZwbWxtZXByaXYtPnAycF9nb19wcm9iZV9yZXNwX2llX2xlbik7Ci0JcnR3X2ZyZWVfbWxtZV9pZV9kYXRhKCZwbWxtZXByaXYtPnAycF9hc3NvY19yZXFfaWUsICZwbWxtZXByaXYtPnAycF9hc3NvY19yZXFfaWVfbGVuKTsKIH0KICNlbHNlCiB2b2lkIHJ0d19mcmVlX21sbWVfcHJpdl9pZV9kYXRhKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKQEAgLTE0Myw4ICsxMzUsNiBAQAogCXBuZXR3b3JrLT5haWQgPSAwOwogCXBuZXR3b3JrLT5qb2luX3JlcyA9IDA7CiAKLQlwbWxtZXByaXYtPm51bV9vZl9zY2FubmVkKys7Ci0KIGV4aXQ6CiAJc3Bpbl91bmxvY2tfYmgoJmZyZWVfcXVldWUtPmxvY2spOwogCkBAIC0xNzUsNyArMTY1LDYgQEAKIAlzcGluX2xvY2tfYmgoJmZyZWVfcXVldWUtPmxvY2spOwogCWxpc3RfZGVsX2luaXQoJihwbmV0d29yay0+bGlzdCkpOwogCWxpc3RfYWRkX3RhaWwoJihwbmV0d29yay0+bGlzdCksICYoZnJlZV9xdWV1ZS0+cXVldWUpKTsKLQlwbWxtZXByaXYtPm51bV9vZl9zY2FubmVkLS07CiAJc3Bpbl91bmxvY2tfYmgoJmZyZWVfcXVldWUtPmxvY2spOwogfQogCkBAIC0xODksNyArMTc4LDYgQEAKIAkJcmV0dXJuOwogCWxpc3RfZGVsX2luaXQoJihwbmV0d29yay0+bGlzdCkpOwogCWxpc3RfYWRkX3RhaWwoJihwbmV0d29yay0+bGlzdCksIGdldF9saXN0X2hlYWQoZnJlZV9xdWV1ZSkpOwotCXBtbG1lcHJpdi0+bnVtX29mX3NjYW5uZWQtLTsKIH0KIAogLyoKQEAgLTI3MSw3ICsyNTksNiBAQAogCXBpYnNzWzNdID0gKHU4KShjdXJ0aW1lICYgMHhmZik7LyogcFswXTsgKi8KIAlwaWJzc1s0XSA9ICh1OCkoKGN1cnRpbWU+PjgpICYgMHhmZik7LyogcFsxXTsgKi8KIAlwaWJzc1s1XSA9ICh1OCkoKGN1cnRpbWU+PjE2KSAmIDB4ZmYpOy8qIHBbMl07ICovCi0JcmV0dXJuOwogfQogCiB1OCAqcnR3X2dldF9jYXBhYmlsaXR5X2Zyb21faWUodTggKmllKQpAQCAtNTY5LDcgKzU1Niw2IEBACiB2b2lkIHJ0d19hdGltZG9uZV9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggKnBidWYpCiB7CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywgKCJyZWNlaXZlIGF0aW1kb25lX2V2ZXRcbiIpKTsKLQlyZXR1cm47CiB9CiAKIApAQCAtNzMyLDcgKzcxOCw2IEBACiAJCWxpc3RfZGVsX2luaXQocGxpc3QpOwogCQlsaXN0X2FkZF90YWlsKHBsaXN0LCAmZnJlZV9xdWV1ZS0+cXVldWUpOwogCQlwbGlzdCA9IHB0ZW1wOwotCQlwbWxtZXByaXYtPm51bV9vZl9zY2FubmVkLS07CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJmZyZWVfcXVldWUtPmxvY2spOwpAQCAtMTkzNSw3ICsxOTIwLDYgQEAKIAl1MzIgaWVsZW4sIG91dF9sZW47CiAJZW51bSBodF9jYXBfYW1wZHVfZmFjdG9yIG1heF9yeF9hbXBkdV9mYWN0b3I7CiAJdW5zaWduZWQgY2hhciAqcDsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgaHRfY2FwaWU7CiAJdW5zaWduZWQgY2hhciBXTU1fSUVbXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxLCAweDAwfTsKIAlzdHJ1Y3QgbWxtZV9wcml2CSpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBxb3NfcHJpdgkJKnBxb3Nwcml2ID0gJnBtbG1lcHJpdi0+cW9zcHJpdjsKQEAgLTE5NDgsNiArMTkzMiw4IEBACiAJcCA9IHJ0d19nZXRfaWUoaW5faWUrMTIsIF9IVF9DQVBBQklMSVRZX0lFXywgJmllbGVuLCBpbl9sZW4tMTIpOwogCiAJaWYgKHAgJiYgaWVsZW4gPiAwKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwIGh0X2NhcDsKKwogCQlpZiAocHFvc3ByaXYtPnFvc19vcHRpb24gPT0gMCkgewogCQkJb3V0X2xlbiA9ICpwb3V0X2xlbjsKIAkJCXJ0d19zZXRfaWUob3V0X2llK291dF9sZW4sIF9WRU5ET1JfU1BFQ0lGSUNfSUVfLApAQCAtMTk1OCwzMyArMTk0NCwzMyBAQAogCiAJCW91dF9sZW4gPSAqcG91dF9sZW47CiAKLQkJbWVtc2V0KCZodF9jYXBpZSwgMCwgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCkpOworCQltZW1zZXQoJmh0X2NhcCwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7CiAKLQkJaHRfY2FwaWUuY2FwX2luZm8gPSBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSCB8Ci0JCQkJICAgIElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwIHwKLQkJCQkgICAgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAgfAotCQkJCSAgICBJRUVFODAyMTFfSFRfQ0FQX1RYX1NUQkMgfAotCQkJCSAgICBJRUVFODAyMTFfSFRfQ0FQX0RTU1NDQ0s0MDsKKwkJaHRfY2FwLmNhcF9pbmZvID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEggfAorCQkJCQkgICAgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCB8CisJCQkJCSAgICAgIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwIHwKKwkJCQkJICAgICAgSUVFRTgwMjExX0hUX0NBUF9UWF9TVEJDIHwKKwkJCQkJICAgICAgSUVFRTgwMjExX0hUX0NBUF9EU1NTQ0NLNDApOwogCiAJCXJ0d19oYWxfZ2V0X2RlZl92YXIocGFkYXB0ZXIsIEhBTF9ERUZfUlhfUEFDS0VUX09GRlNFVCwgJnJ4X3BhY2tldF9vZmZzZXQpOwogCQlydHdfaGFsX2dldF9kZWZfdmFyKHBhZGFwdGVyLCBIQUxfREVGX01BWF9SRUNWQlVGX1NaLCAmbWF4X3JlY3ZidWZfc3opOwogCiAJCS8qCi0JCUFNUERVX3BhcmEgWzE6MF06TWF4IEFNUERVIExlbiA9PiAwOjhrICwgMToxNmssIDI6MzJrLCAzOjY0awotCQlBTVBEVV9wYXJhIFs0OjJdOk1pbiBNUERVIFN0YXJ0IFNwYWNpbmcKKwkJYW1wZHVfcGFyYW1zX2luZm8gWzE6MF06TWF4IEFNUERVIExlbiA9PiAwOjhrICwgMToxNmssIDI6MzJrLCAzOjY0aworCQlhbXBkdV9wYXJhbXNfaW5mbyBbNDoyXTpNaW4gTVBEVSBTdGFydCBTcGFjaW5nCiAJCSovCiAKIAkJcnR3X2hhbF9nZXRfZGVmX3ZhcihwYWRhcHRlciwgSFdfVkFSX01BWF9SWF9BTVBEVV9GQUNUT1IsICZtYXhfcnhfYW1wZHVfZmFjdG9yKTsKLQkJaHRfY2FwaWUuYW1wZHVfcGFyYW1zX2luZm8gPSAobWF4X3J4X2FtcGR1X2ZhY3RvciYweDAzKTsKKwkJaHRfY2FwLmFtcGR1X3BhcmFtc19pbmZvID0gbWF4X3J4X2FtcGR1X2ZhY3RvciAmIDB4MDM7CiAKIAkJaWYgKHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSA9PSBfQUVTXykKLQkJCWh0X2NhcGllLmFtcGR1X3BhcmFtc19pbmZvIHw9IChJRUVFODAyMTFfSFRfQ0FQX0FNUERVX0RFTlNJVFkmKDB4MDc8PDIpKTsKKwkJCWh0X2NhcC5hbXBkdV9wYXJhbXNfaW5mbyB8PSBJRUVFODAyMTFfSFRfQ0FQX0FNUERVX0RFTlNJVFkgJiAoMHgwNyA8PCAyKTsKIAkJZWxzZQotCQkJaHRfY2FwaWUuYW1wZHVfcGFyYW1zX2luZm8gfD0gKElFRUU4MDIxMV9IVF9DQVBfQU1QRFVfREVOU0lUWSYweDAwKTsKLQorCQkJaHRfY2FwLmFtcGR1X3BhcmFtc19pbmZvIHw9IElFRUU4MDIxMV9IVF9DQVBfQU1QRFVfREVOU0lUWSAmIDB4MDA7CiAKIAkJcnR3X3NldF9pZShvdXRfaWUrb3V0X2xlbiwgX0hUX0NBUEFCSUxJVFlfSUVfLAotCQkJICAgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCksICh1bnNpZ25lZCBjaGFyICopJmh0X2NhcGllLCBwb3V0X2xlbik7CisJCQkgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApLAorCQkJICAgKHVuc2lnbmVkIGNoYXIgKikmaHRfY2FwLCBwb3V0X2xlbik7CiAKIAkJcGh0cHJpdi0+aHRfb3B0aW9uID0gdHJ1ZTsKIApAQCAtMjAwMCw5ICsxOTg2LDYgQEAKIC8qIHRoZSBmdW5jdGlvbiBpcyA+IHBhc3NpdmVfbGV2ZWwgKGluIGNyaXRpY2FsX3NlY3Rpb24pICovCiB2b2lkIHJ0d191cGRhdGVfaHRfY2FwKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggKnBpZSwgdWludCBpZV9sZW4pCiB7Ci0JdTggKnAsIG1heF9hbXBkdV9zejsKLQlpbnQgbGVuOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcGllOwogCXN0cnVjdCBtbG1lX3ByaXYJKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IGh0X3ByaXYJCSpwaHRwcml2ID0gJnBtbG1lcHJpdi0+aHRwcml2OwogCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7CkBAIC0yMDI3LDM0ICsyMDEwLDIxIEBACiAJCXBodHByaXYtPmFtcGR1X2VuYWJsZSA9IHRydWU7CiAJfQogCi0KLQkvKiBjaGVjayBNYXggUnggQS1NUERVIFNpemUgKi8KLQlsZW4gPSAwOwotCXAgPSBydHdfZ2V0X2llKHBpZStzaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX2ZpeGVkX2llKSwgX0hUX0NBUEFCSUxJVFlfSUVfLCAmbGVuLCBpZV9sZW4tc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9maXhlZF9pZSkpOwotCWlmIChwICYmIGxlbiA+IDApIHsKLQkJcGh0X2NhcGllID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCAqKShwKzIpOwotCQltYXhfYW1wZHVfc3ogPSBwaHRfY2FwaWUtPmFtcGR1X3BhcmFtc19pbmZvICYgSUVFRTgwMjExX0hUX0NBUF9BTVBEVV9GQUNUT1I7Ci0JCW1heF9hbXBkdV9zeiA9IDEgPDwgKG1heF9hbXBkdV9zeiszKTsgLyogIG1heF9hbXBkdV9zeiAoa2J5dGVzKTsgKi8KLQkJcGh0cHJpdi0+cnhfYW1wZHVfbWF4bGVuID0gbWF4X2FtcGR1X3N6OwotCX0KLQlsZW4gPSAwOwotCXAgPSBydHdfZ2V0X2llKHBpZStzaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX2ZpeGVkX2llKSwgX0hUX0FERF9JTkZPX0lFXywgJmxlbiwgaWVfbGVuLXNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfZml4ZWRfaWUpKTsKLQogCS8qIHVwZGF0ZSBjdXJfYndtb2RlICYgY3VyX2NoX29mZnNldCAqLwogCWlmICgocHJlZ2lzdHJ5cHJpdi0+Y2J3NDBfZW5hYmxlKSAmJgotCSAgICAobGUxNl90b19jcHUocG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuSFRfY2Fwc19pbmZvKSAmIEJJVCgxKSkgJiYKKwkgICAgKGxlMTZfdG9fY3B1KHBtbG1laW5mby0+SFRfY2Fwcy5jYXBfaW5mbykgJiBCSVQoMSkpICYmCiAJICAgIChwbWxtZWluZm8tPkhUX2luZm8uaW5mb3NbMF0gJiBCSVQoMikpKSB7CiAJCWludCBpOwogCQl1OAlyZl90eXBlOwogCi0JCXBhZGFwdGVyLT5IYWxGdW5jLkdldEh3UmVnSGFuZGxlcihwYWRhcHRlciwgSFdfVkFSX1JGX1RZUEUsICh1OCAqKSgmcmZfdHlwZSkpOworCQlydHdfaGFsX2dldF9od3JlZyhwYWRhcHRlciwgSFdfVkFSX1JGX1RZUEUsICh1OCAqKSgmcmZfdHlwZSkpOwogCiAJCS8qIHVwZGF0ZSB0aGUgTUNTIHJhdGVzICovCiAJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAJCQlpZiAoKHJmX3R5cGUgPT0gUkZfMVQxUikgfHwgKHJmX3R5cGUgPT0gUkZfMVQyUikpCi0JCQkJcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuTUNTX3JhdGVbaV0gJj0gTUNTX3JhdGVfMVJbaV07CisJCQkJKCh1OCAqKSZwbWxtZWluZm8tPkhUX2NhcHMubWNzKVtpXSAmPSBNQ1NfcmF0ZV8xUltpXTsKIAkJCWVsc2UKLQkJCQlwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5NQ1NfcmF0ZVtpXSAmPSBNQ1NfcmF0ZV8yUltpXTsKKwkJCQkoKHU4ICopJnBtbG1laW5mby0+SFRfY2Fwcy5tY3MpW2ldICY9IE1DU19yYXRlXzJSW2ldOwogCQl9CiAJCS8qIHN3aXRjaCB0byB0aGUgNDBNIEh6IG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBBUCAqLwogCQlwbWxtZWV4dC0+Y3VyX2J3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfNDA7CkBAIC0yMDcyLDcgKzIwNDIsNyBAQAogCX0KIAogCS8qICBDb25maWcgU00gUG93ZXIgU2F2ZSBzZXR0aW5nICovCi0JcG1sbWVpbmZvLT5TTV9QUyA9IChsZTE2X3RvX2NwdShwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5IVF9jYXBzX2luZm8pICYgMHgwQykgPj4gMjsKKwlwbWxtZWluZm8tPlNNX1BTID0gKGxlMTZfdG9fY3B1KHBtbG1laW5mby0+SFRfY2Fwcy5jYXBfaW5mbykgJiAweDBDKSA+PiAyOwogCWlmIChwbWxtZWluZm8tPlNNX1BTID09IFdMQU5fSFRfQ0FQX1NNX1BTX1NUQVRJQykKIAkJREJHXzg4RSgiJXMoKTogV0xBTl9IVF9DQVBfU01fUFNfU1RBVElDXG4iLCBfX2Z1bmNfXyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbWxtZV9leHQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbWxtZV9leHQuYwppbmRleCA3ZjMyYjM5Li5mYjEzZGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWVfZXh0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lX2V4dC5jCkBAIC0zMjAsNyArMzIwLDcgQEAKIAlzdHJ1Y3QgeG1pdF9mcmFtZQkqcG1nbnRmcmFtZTsKIAlzdHJ1Y3QgcGt0X2F0dHJpYgkqcGF0dHJpYjsKIAl1bnNpZ25lZCBjaGFyCSpwZnJhbWU7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJX19sZTE2ICpmY3RybDsKIAl1bnNpZ25lZCBpbnQJcmF0ZV9sZW47CiAJc3RydWN0IHhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJihwYWRhcHRlci0+eG1pdHByaXYpOwpAQCAtMzQ3LDIyICszNDcsMjIgQEAKIAltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7CiAKIAlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQlwd2xhbmhkciA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKilwZnJhbWU7CisJcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7CiAKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7CiAKLQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBiY19hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBjdXJfbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIGJjX2FkZHIpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBjdXJfbmV0d29yay0+TWFjQWRkcmVzcyk7CiAKIAlTZXRTZXFOdW0ocHdsYW5oZHIsIDAvKnBtbG1lZXh0LT5tZ250X3NlcSovKTsKIAkvKiBwbWxtZWV4dC0+bWdudF9zZXErKzsgKi8KIAlTZXRGcmFtZVN1YlR5cGUocGZyYW1lLCBXSUZJX0JFQUNPTik7CiAKLQlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAogCWlmICgocG1sbWVpbmZvLT5zdGF0ZSYweDAzKSA9PSBXSUZJX0ZXX0FQX1NUQVRFKSB7CiAJCWludCBsZW5fZGlmZjsKQEAgLTM3Nyw4ICszNzcsOCBAQAogCQkJKTsKIAkJcGZyYW1lICs9IChjdXJfbmV0d29yay0+SUVMZW5ndGgrbGVuX2RpZmYpOwogCQlwYXR0cmliLT5wa3RsZW4gKz0gKGN1cl9uZXR3b3JrLT5JRUxlbmd0aCtsZW5fZGlmZik7Ci0JCXdwc19pZSA9IHJ0d19nZXRfd3BzX2llKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyK1RYREVTQ19PRkZTRVQrc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcikrX0JFQUNPTl9JRV9PRkZTRVRfLAotCQkJcGF0dHJpYi0+cGt0bGVuLXNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpLV9CRUFDT05fSUVfT0ZGU0VUXywgTlVMTCwgJndwc19pZWxlbik7CisJCXdwc19pZSA9IHJ0d19nZXRfd3BzX2llKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyK1RYREVTQ19PRkZTRVQrc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKStfQkVBQ09OX0lFX09GRlNFVF8sCisJCQlwYXR0cmliLT5wa3RsZW4tc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKS1fQkVBQ09OX0lFX09GRlNFVF8sIE5VTEwsICZ3cHNfaWVsZW4pOwogCQlpZiAod3BzX2llICYmIHdwc19pZWxlbiA+IDApCiAJCQlydHdfZ2V0X3dwc19hdHRyX2NvbnRlbnQod3BzX2llLCAgd3BzX2llbGVuLCBXUFNfQVRUUl9TRUxFQ1RFRF9SRUdJU1RSQVIsICh1OCAqKSgmc3IpLCBOVUxMKTsKIAkJaWYgKHNyICE9IDApCkBAIC00NjEsNyArNDYxLDcgQEAKIAlzdHJ1Y3QgeG1pdF9mcmFtZQkJCSpwbWdudGZyYW1lOwogCXN0cnVjdCBwa3RfYXR0cmliCQkJKnBhdHRyaWI7CiAJdW5zaWduZWQgY2hhcgkJCQkJKnBmcmFtZTsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIJKnB3bGFuaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKIAlfX2xlMTYgKmZjdHJsOwogCXVuc2lnbmVkIGNoYXIJCQkJCSptYWMsICpic3NpZDsKIAlzdHJ1Y3QgeG1pdF9wcml2CSpweG1pdHByaXYgPSAmKHBhZGFwdGVyLT54bWl0cHJpdik7CkBAIC00ODgsMjIgKzQ4OCwyMiBAQAogCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKIAogCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAogCW1hYyA9IG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwogCWJzc2lkID0gY3VyX25ldHdvcmstPk1hY0FkZHJlc3M7CiAKLQlmY3RybCA9ICYocHdsYW5oZHItPmZyYW1lX2N0bCk7CisJZmN0cmwgPSAmcHdsYW5oZHItPmZyYW1lX2NvbnRyb2w7CiAJKihmY3RybCkgPSAwOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIGRhLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbWFjLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgYnNzaWQsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBkYSk7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgbWFjKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBic3NpZCk7CiAKIAlTZXRTZXFOdW0ocHdsYW5oZHIsIHBtbG1lZXh0LT5tZ250X3NlcSk7CiAJcG1sbWVleHQtPm1nbnRfc2VxKys7CiAJU2V0RnJhbWVTdWJUeXBlKGZjdHJsLCBXSUZJX1BST0JFUlNQKTsKIAotCXBhdHRyaWItPmhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCXBhdHRyaWItPmhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAJcGF0dHJpYi0+cGt0bGVuID0gcGF0dHJpYi0+aGRybGVuOwogCXBmcmFtZSArPSBwYXR0cmliLT5oZHJsZW47CiAKQEAgLTYwOSw3ICs2MDksNyBAQAogCXN0cnVjdCB4bWl0X2ZyYW1lCQkqcG1nbnRmcmFtZTsKIAlzdHJ1Y3QgcGt0X2F0dHJpYgkJKnBhdHRyaWI7CiAJdW5zaWduZWQgY2hhcgkJCSpwZnJhbWU7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyCSpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJX19sZTE2ICpmY3RybDsKIAl1bnNpZ25lZCBjaGFyCQkJKm1hYzsKIAl1bnNpZ25lZCBjaGFyCQkJYnNzcmF0ZVtOdW1SYXRlc107CkBAIC02MzMsMzEgKzYzMywzMSBAQAogCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKIAogCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAogCW1hYyA9IG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwogCi0JZmN0cmwgPSAmKHB3bGFuaGRyLT5mcmFtZV9jdGwpOworCWZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jb250cm9sOwogCSooZmN0cmwpID0gMDsKIAogCWlmIChkYSkgewogCQkvKgl1bmljYXN0IHByb2JlIHJlcXVlc3QgZnJhbWUgKi8KLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgZGEsIEVUSF9BTEVOKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEpOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBkYSk7CiAJfSBlbHNlIHsKIAkJLyoJYnJvYWRjYXN0IHByb2JlIHJlcXVlc3QgZnJhbWUgKi8KLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgYmNfYWRkciwgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBiY19hZGRyLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIGJjX2FkZHIpOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBiY19hZGRyKTsKIAl9CiAKLQltZW1jcHkocHdsYW5oZHItPmFkZHIyLCBtYWMsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBtYWMpOwogCiAJU2V0U2VxTnVtKHB3bGFuaGRyLCBwbWxtZWV4dC0+bWdudF9zZXEpOwogCXBtbG1lZXh0LT5tZ250X3NlcSsrOwogCVNldEZyYW1lU3ViVHlwZShwZnJhbWUsIFdJRklfUFJPQkVSRVEpOwogCi0JcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOwotCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOworCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAKIAlpZiAocHNzaWQpCiAJCXBmcmFtZSA9IHJ0d19zZXRfaWUocGZyYW1lLCBfU1NJRF9JRV8sIHBzc2lkLT5Tc2lkTGVuZ3RoLCBwc3NpZC0+U3NpZCwgJihwYXR0cmliLT5wa3RsZW4pKTsKQEAgLTc0NSw3ICs3NDUsNyBAQAogCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwogCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwogCXVuc2lnbmVkIGNoYXIgKnBmcmFtZTsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKnB3bGFuaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKIAlfX2xlMTYgKmZjdHJsOwogCXVuc2lnbmVkIGludCB2YWwzMjsKIAl1MTYgdmFsMTY7CkBAIC03NjksMjUgKzc2OSwyNyBAQAogCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKIAogCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7CiAKIAlTZXRTZXFOdW0ocHdsYW5oZHIsIHBtbG1lZXh0LT5tZ250X3NlcSk7CiAJcG1sbWVleHQtPm1nbnRfc2VxKys7CiAJU2V0RnJhbWVTdWJUeXBlKHBmcmFtZSwgV0lGSV9BVVRIKTsKIAotCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCiAKIAlpZiAocHN0YSkgey8qICBmb3IgQVAgbW9kZSAqLwogI2lmZGVmIENPTkZJR184OEVVX0FQX01PREUKIAotCQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBwc3RhLT5od2FkZHIsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgcHN0YS0+aHdhZGRyKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwKKwkJCQlteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSk7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsCisJCQkJbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSkpOwogCiAKIAkJLyogIHNldHRpbmcgYXV0aCBhbGdvIG51bWJlciAqLwpAQCAtODI1LDkgKzgyNyw5IEBACiAJfSBlbHNlIHsKIAkJX19sZTMyIGxlX3RtcDMyOwogCQlfX2xlMTYgbGVfdG1wMTY7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBwbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBwbmV0d29yay0+TWFjQWRkcmVzcyk7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSk7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIHBuZXR3b3JrLT5NYWNBZGRyZXNzKTsKIAogCQkvKiAgc2V0dGluZyBhdXRoIGFsZ28gbnVtYmVyICovCiAJCXZhbDE2ID0gKHBtbG1laW5mby0+YXV0aF9hbGdvID09IGRvdDExQXV0aEFsZ3J0aG1fU2hhcmVkKSA/IDEgOiAwOy8qICAwOk9QRU4gU3lzdGVtLCAxOlNoYXJlZCBrZXkgKi8KQEAgLTg2Niw3ICs4NjgsNyBAQAogCiAJCQlTZXRQcml2YWN5KGZjdHJsKTsKIAotCQkJcGF0dHJpYi0+aGRybGVuID0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJCQlwYXR0cmliLT5oZHJsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCiAJCQlwYXR0cmliLT5lbmNyeXB0ID0gX1dFUDQwXzsKIApAQCAtODg5LDcgKzg5MSw3IEBACiAJCQkgIHN0cnVjdCBzdGFfaW5mbyAqcHN0YXQsIGludCBwa3RfdHlwZSkKIHsKIAlzdHJ1Y3QgeG1pdF9mcmFtZQkqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIJKnB3bGFuaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKIAlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKIAl1bnNpZ25lZCBjaGFyCSpwYnVmLCAqcGZyYW1lOwogCXVuc2lnbmVkIHNob3J0IHZhbDsKQEAgLTkxNiwxNCArOTE4LDE1IEBACiAJbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwogCiAJcGZyYW1lID0gKHU4ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyKSArIFRYREVTQ19PRkZTRVQ7Ci0JcHdsYW5oZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICopcGZyYW1lOworCXB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcGZyYW1lOwogCi0JZmN0cmwgPSAmKHB3bGFuaGRyLT5mcmFtZV9jdGwpOworCWZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jb250cm9sOwogCSooZmN0cmwpID0gMDsKIAotCW1lbWNweSgodm9pZCAqKUdldEFkZHIxUHRyKHB3bGFuaGRyKSwgcHN0YXQtPmh3YWRkciwgRVRIX0FMRU4pOwotCW1lbWNweSgodm9pZCAqKUdldEFkZHIyUHRyKHB3bGFuaGRyKSwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsKLQltZW1jcHkoKHZvaWQgKilHZXRBZGRyM1B0cihwd2xhbmhkciksIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KCh2b2lkICopR2V0QWRkcjFQdHIocHdsYW5oZHIpLCBwc3RhdC0+aHdhZGRyKTsKKwlldGhlcl9hZGRyX2NvcHkoKHZvaWQgKilHZXRBZGRyMlB0cihwd2xhbmhkciksCisJCQlteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSk7CisJZXRoZXJfYWRkcl9jb3B5KCh2b2lkICopR2V0QWRkcjNQdHIocHdsYW5oZHIpLCBwbmV0d29yay0+TWFjQWRkcmVzcyk7CiAKIAogCVNldFNlcU51bShwd2xhbmhkciwgcG1sbWVleHQtPm1nbnRfc2VxKTsKQEAgLTkzMyw3ICs5MzYsNyBAQAogCWVsc2UKIAkJcmV0dXJuOwogCi0JcGF0dHJpYi0+aGRybGVuID0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGF0dHJpYi0+aGRybGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAlwYXR0cmliLT5wa3RsZW4gKz0gcGF0dHJpYi0+aGRybGVuOwogCXBmcmFtZSArPSBwYXR0cmliLT5oZHJsZW47CiAKQEAgLTEwMTcsNyArMTAyMCw3IEBACiAJc3RydWN0IHhtaXRfZnJhbWUJKnBtZ250ZnJhbWU7CiAJc3RydWN0IHBrdF9hdHRyaWIJKnBhdHRyaWI7CiAJdW5zaWduZWQgY2hhcgkJKnBmcmFtZSwgKnA7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyCSpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJX19sZTE2ICpmY3RybDsKIAl1bnNpZ25lZCBpbnQJaSwgaiwgaWVfbGVuLCBpbmRleCA9IDA7CiAJdW5zaWduZWQgY2hhcglyZl90eXBlLCBic3NyYXRlW051bVJhdGVzXSwgc3RhX2Jzc3JhdGVbTnVtUmF0ZXNdOwpAQCAtMTA0MCwyMCArMTA0MywyMCBAQAogCiAJbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwogCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgcG5ldHdvcmstPk1hY0FkZHJlc3MsIEVUSF9BTEVOKTsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSwgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgcG5ldHdvcmstPk1hY0FkZHJlc3MpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBwbmV0d29yay0+TWFjQWRkcmVzcyk7CiAKIAlTZXRTZXFOdW0ocHdsYW5oZHIsIHBtbG1lZXh0LT5tZ250X3NlcSk7CiAJcG1sbWVleHQtPm1nbnRfc2VxKys7CiAJU2V0RnJhbWVTdWJUeXBlKHBmcmFtZSwgV0lGSV9BU1NPQ1JFUSk7CiAKLQlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAogCS8qIGNhcHMgKi8KIApAQCAtMTEzMiwyMyArMTEzNSwyMyBAQAogCWlmIChwYWRhcHRlci0+bWxtZXByaXYuaHRwcml2Lmh0X29wdGlvbikgewogCQlwID0gcnR3X2dldF9pZSgocG1sbWVpbmZvLT5uZXR3b3JrLklFcyArIHNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfZml4ZWRfaWUpKSwgX0hUX0NBUEFCSUxJVFlfSUVfLCAmaWVfbGVuLCAocG1sbWVpbmZvLT5uZXR3b3JrLklFTGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9maXhlZF9pZSkpKTsKIAkJaWYgKChwICE9IE5VTEwpICYmICghKGlzX2FwX2luX3RraXAocGFkYXB0ZXIpKSkpIHsKLQkJCW1lbWNweSgmKHBtbG1laW5mby0+SFRfY2FwcyksIChwICsgMiksIHNpemVvZihzdHJ1Y3QgSFRfY2Fwc19lbGVtZW50KSk7CisJCQltZW1jcHkoJnBtbG1laW5mby0+SFRfY2FwcywgcCArIDIsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkpOwogCiAJCQkvKiB0byBkaXNhYmxlIDQwTSBIeiBzdXBwb3J0IHdoaWxlIGdkX2J3XzQwTUh6X2VuID0gMCAqLwogCQkJaWYgKHByZWdwcml2LT5jYnc0MF9lbmFibGUgPT0gMCkKLQkJCQlwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5IVF9jYXBzX2luZm8gJj0gY3B1X3RvX2xlMTYofihCSVQoNikgfCBCSVQoMSkpKTsKKwkJCQlwbWxtZWluZm8tPkhUX2NhcHMuY2FwX2luZm8gJj0gY3B1X3RvX2xlMTYofihCSVQoNikgfCBCSVQoMSkpKTsKIAkJCWVsc2UKLQkJCQlwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5IVF9jYXBzX2luZm8gfD0gY3B1X3RvX2xlMTYoQklUKDEpKTsKKwkJCQlwbWxtZWluZm8tPkhUX2NhcHMuY2FwX2luZm8gfD0gY3B1X3RvX2xlMTYoQklUKDEpKTsKIAogCQkJLyogdG9kbzogZGlzYWJsZSBTTSBwb3dlciBzYXZlIG1vZGUgKi8KLQkJCXBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkhUX2NhcHNfaW5mbyB8PSBjcHVfdG9fbGUxNigweDAwMGMpOworCQkJcG1sbWVpbmZvLT5IVF9jYXBzLmNhcF9pbmZvIHw9IGNwdV90b19sZTE2KDB4MDAwYyk7CiAKIAkJCXJ0d19oYWxfZ2V0X2h3cmVnKHBhZGFwdGVyLCBIV19WQVJfUkZfVFlQRSwgKHU4ICopKCZyZl90eXBlKSk7CiAJCQlzd2l0Y2ggKHJmX3R5cGUpIHsKIAkJCWNhc2UgUkZfMVQxUjoKIAkJCQlpZiAocHJlZ3ByaXYtPnJ4X3N0YmMpCi0JCQkJCXBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkhUX2NhcHNfaW5mbyB8PSBjcHVfdG9fbGUxNigweDAxMDApOy8qIFJYIFNUQkMgT25lIHNwYXRpYWwgc3RyZWFtICovCi0JCQkJbWVtY3B5KHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50Lk1DU19yYXRlLCBNQ1NfcmF0ZV8xUiwgMTYpOworCQkJCQlwbWxtZWluZm8tPkhUX2NhcHMuY2FwX2luZm8gfD0gY3B1X3RvX2xlMTYoMHgwMTAwKTsvKiBSWCBTVEJDIE9uZSBzcGF0aWFsIHN0cmVhbSAqLworCQkJCW1lbWNweSgodTggKikmcG1sbWVpbmZvLT5IVF9jYXBzLm1jcywgTUNTX3JhdGVfMVIsIDE2KTsKIAkJCQlicmVhazsKIAkJCWNhc2UgUkZfMlQyUjoKIAkJCWNhc2UgUkZfMVQyUjoKQEAgLTExNTcsOSArMTE2MCw5IEBACiAJCQkJICAgICgocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFfMjROKSAmJiAocHJlZ3ByaXYtPnJ4X3N0YmMgPT0gMHgxKSkgfHwgLyogZW5hYmxlIGZvciAyLjRHSHogKi8KIAkJCQkgICAgKHByZWdwcml2LT53aWZpX3NwZWMgPT0gMSkpIHsKIAkJCQkJREJHXzg4RSgiZGVjbGFyZSBzdXBwb3J0aW5nIFJYIFNUQkNcbiIpOwotCQkJCQlwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5IVF9jYXBzX2luZm8gfD0gY3B1X3RvX2xlMTYoMHgwMjAwKTsvKiBSWCBTVEJDIHR3byBzcGF0aWFsIHN0cmVhbSAqLworCQkJCQlwbWxtZWluZm8tPkhUX2NhcHMuY2FwX2luZm8gfD0gY3B1X3RvX2xlMTYoMHgwMjAwKTsvKiBSWCBTVEJDIHR3byBzcGF0aWFsIHN0cmVhbSAqLwogCQkJCX0KLQkJCQltZW1jcHkocG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuTUNTX3JhdGUsIE1DU19yYXRlXzJSLCAxNik7CisJCQkJbWVtY3B5KCZwbWxtZWluZm8tPkhUX2NhcHMubWNzLCBNQ1NfcmF0ZV8yUiwgMTYpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJcGZyYW1lID0gcnR3X3NldF9pZShwZnJhbWUsIF9IVF9DQVBBQklMSVRZX0lFXywgaWVfbGVuICwgKHU4ICopKCYocG1sbWVpbmZvLT5IVF9jYXBzKSksICYocGF0dHJpYi0+cGt0bGVuKSk7CkBAIC0xMjEyLDcgKzEyMTUsNyBAQAogCXN0cnVjdCB4bWl0X2ZyYW1lCQkJKnBtZ250ZnJhbWU7CiAJc3RydWN0IHBrdF9hdHRyaWIJCQkqcGF0dHJpYjsKIAl1bnNpZ25lZCBjaGFyCQkJCQkqcGZyYW1lOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcgkqcHdsYW5oZHI7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwogCV9fbGUxNiAqZmN0cmw7CiAJc3RydWN0IHhtaXRfcHJpdgkqcHhtaXRwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dDsKQEAgLTEyMzksOSArMTI0Miw5IEBACiAJbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwogCiAJcGZyYW1lID0gKHU4ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyKSArIFRYREVTQ19PRkZTRVQ7Ci0JcHdsYW5oZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICopcGZyYW1lOworCXB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcGZyYW1lOwogCi0JZmN0cmwgPSAmKHB3bGFuaGRyLT5mcmFtZV9jdGwpOworCWZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jb250cm9sOwogCSooZmN0cmwpID0gMDsKIAogCWlmICgocG1sbWVpbmZvLT5zdGF0ZSYweDAzKSA9PSBXSUZJX0ZXX0FQX1NUQVRFKQpAQCAtMTI1MiwxNiArMTI1NSwxNiBAQAogCWlmIChwb3dlcl9tb2RlKQogCQlTZXRQd3JNZ3QoZmN0cmwpOwogCi0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEsIEVUSF9BTEVOKTsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSwgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBwbmV0d29yay0+TWFjQWRkcmVzcyk7CiAKIAlTZXRTZXFOdW0ocHdsYW5oZHIsIHBtbG1lZXh0LT5tZ250X3NlcSk7CiAJcG1sbWVleHQtPm1nbnRfc2VxKys7CiAJU2V0RnJhbWVTdWJUeXBlKHBmcmFtZSwgV0lGSV9EQVRBX05VTEwpOwogCi0JcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOwotCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOworCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAKIAlwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBwYXR0cmliLT5wa3RsZW47CiAKQEAgLTEzMzIsNyArMTMzNSw3IEBACiAJc3RydWN0IHhtaXRfZnJhbWUJCQkqcG1nbnRmcmFtZTsKIAlzdHJ1Y3QgcGt0X2F0dHJpYgkJCSpwYXR0cmliOwogCXVuc2lnbmVkIGNoYXIJCQkJCSpwZnJhbWU7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyCSpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJX19sZTE2ICpmY3RybDsKIAl1bnNpZ25lZCBzaG9ydCAqcWM7CiAJc3RydWN0IHhtaXRfcHJpdgkJCSpweG1pdHByaXYgPSAmKHBhZGFwdGVyLT54bWl0cHJpdik7CkBAIC0xMzU5LDkgKzEzNjIsOSBAQAogCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKIAogCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7CiAKIAlpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gV0lGSV9GV19BUF9TVEFURSkKQEAgLTEzODAsMTYgKzEzODMsMTYgQEAKIAogCVNldEFja3BvbGljeShxYywgcGF0dHJpYi0+YWNrX3BvbGljeSk7CiAKLQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBkYSwgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgcG5ldHdvcmstPk1hY0FkZHJlc3MsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBkYSk7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSkpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIHBuZXR3b3JrLT5NYWNBZGRyZXNzKTsKIAogCVNldFNlcU51bShwd2xhbmhkciwgcG1sbWVleHQtPm1nbnRfc2VxKTsKIAlwbWxtZWV4dC0+bWdudF9zZXErKzsKIAlTZXRGcmFtZVN1YlR5cGUocGZyYW1lLCBXSUZJX1FPU19EQVRBX05VTEwpOwogCi0JcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHJfcW9zKTsKLQlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyX3Fvcyk7CisJcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIpOworCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIpOwogCiAJcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwogCkBAIC0xNDU3LDcgKzE0NjAsNyBAQAogCXN0cnVjdCB4bWl0X2ZyYW1lCQkJKnBtZ250ZnJhbWU7CiAJc3RydWN0IHBrdF9hdHRyaWIJCQkqcGF0dHJpYjsKIAl1bnNpZ25lZCBjaGFyCQkJCQkqcGZyYW1lOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcgkqcHdsYW5oZHI7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwogCV9fbGUxNiAqZmN0cmw7CiAJc3RydWN0IHhtaXRfcHJpdgkJCSpweG1pdHByaXYgPSAmKHBhZGFwdGVyLT54bWl0cHJpdik7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJihwYWRhcHRlci0+bWxtZWV4dHByaXYpOwpAQCAtMTQ3OCwyMSArMTQ4MSwyMSBAQAogCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKIAogCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7CiAKLQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBkYSwgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgcG5ldHdvcmstPk1hY0FkZHJlc3MsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBkYSk7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSkpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIHBuZXR3b3JrLT5NYWNBZGRyZXNzKTsKIAogCVNldFNlcU51bShwd2xhbmhkciwgcG1sbWVleHQtPm1nbnRfc2VxKTsKIAlwbWxtZWV4dC0+bWdudF9zZXErKzsKIAlTZXRGcmFtZVN1YlR5cGUocGZyYW1lLCBXSUZJX0RFQVVUSCk7CiAKLQlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAogCWxlX3RtcCA9IGNwdV90b19sZTE2KHJlYXNvbik7CiAJcGZyYW1lID0gcnR3X3NldF9maXhlZF9pZShwZnJhbWUsIF9SU09OX0NPREVfLCAmbGVfdG1wLApAQCAtMTU1OSw2NiArMTU2Miw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBpc3N1ZV9hY3Rpb25fc3BjdF9jaF9zd2l0Y2goc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcmEsIHU4IG5ld19jaCwgdTggY2hfb2Zmc2V0KQotewotCXN0cnVjdCB4bWl0X2ZyYW1lCQkJKnBtZ250ZnJhbWU7Ci0Jc3RydWN0IHBrdF9hdHRyaWIJCQkqcGF0dHJpYjsKLQl1bnNpZ25lZCBjaGFyCQkJCSpwZnJhbWU7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyCSpwd2xhbmhkcjsKLQlfX2xlMTYgKmZjdHJsOwotCXN0cnVjdCB4bWl0X3ByaXYJCQkqcHhtaXRwcml2ID0gJihwYWRhcHRlci0+eG1pdHByaXYpOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICYocGFkYXB0ZXItPm1sbWVleHRwcml2KTsKLQotCi0JREJHXzg4RShGVU5DX05ERVZfRk1UIiByYSA9JXBNLCBjaDoldSwgb2Zmc2V0OiV1XG4iLAotCQlGVU5DX05ERVZfQVJHKHBhZGFwdGVyLT5wbmV0ZGV2KSwgcmEsIG5ld19jaCwgY2hfb2Zmc2V0KTsKLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUocHhtaXRwcml2KTsKLQlpZiAocG1nbnRmcmFtZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQkvKiB1cGRhdGUgYXR0cmlidXRlICovCi0JcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIocGFkYXB0ZXIsIHBhdHRyaWIpOwotCi0JbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwotCi0JcGZyYW1lID0gKHU4ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyKSArIFRYREVTQ19PRkZTRVQ7Ci0JcHdsYW5oZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICopcGZyYW1lOwotCi0JZmN0cmwgPSAmKHB3bGFuaGRyLT5mcmFtZV9jdGwpOwotCSooZmN0cmwpID0gMDsKLQotCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIHJhLCBFVEhfQUxFTik7IC8qIFJBICovCi0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsgLyogVEEgKi8KLQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCByYSwgRVRIX0FMRU4pOyAvKiBEQSA9IFJBICovCi0KLQlTZXRTZXFOdW0ocHdsYW5oZHIsIHBtbG1lZXh0LT5tZ250X3NlcSk7Ci0JcG1sbWVleHQtPm1nbnRfc2VxKys7Ci0JU2V0RnJhbWVTdWJUeXBlKHBmcmFtZSwgV0lGSV9BQ1RJT04pOwotCi0JcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOwotCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOwotCi0JLyogY2F0ZWdvcnksIGFjdGlvbiAqLwotCXsKLQkJdTggY2F0ZWdvcnksIGFjdGlvbjsKLQkJY2F0ZWdvcnkgPSBSVFdfV0xBTl9DQVRFR09SWV9TUEVDVFJVTV9NR01UOwotCQlhY3Rpb24gPSBSVFdfV0xBTl9BQ1RJT05fU1BDVF9DSExfU1dJVENIOwotCi0JCXBmcmFtZSA9IHJ0d19zZXRfZml4ZWRfaWUocGZyYW1lLCAxLCAmKGNhdGVnb3J5KSwgJihwYXR0cmliLT5wa3RsZW4pKTsKLQkJcGZyYW1lID0gcnR3X3NldF9maXhlZF9pZShwZnJhbWUsIDEsICYoYWN0aW9uKSwgJihwYXR0cmliLT5wa3RsZW4pKTsKLQl9Ci0KLQlwZnJhbWUgPSBydHdfc2V0X2llX2NoX3N3aXRjaChwZnJhbWUsICYocGF0dHJpYi0+cGt0bGVuKSwgMCwgbmV3X2NoLCAwKTsKLQlwZnJhbWUgPSBydHdfc2V0X2llX3NlY29uZGFyeV9jaF9vZmZzZXQocGZyYW1lLCAmKHBhdHRyaWItPnBrdGxlbiksCi0JCWhhbF9jaF9vZmZzZXRfdG9fc2Vjb25kYXJ5X2NoX29mZnNldChjaF9vZmZzZXQpKTsKLQotCXBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IHBhdHRyaWItPnBrdGxlbjsKLQotCWR1bXBfbWdudGZyYW1lKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLX0KLQogc3RhdGljIHZvaWQgaXNzdWVfYWN0aW9uX0JBKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqcmFkZHIsCiAJCQkgICAgdW5zaWduZWQgY2hhciBhY3Rpb24sIHVuc2lnbmVkIHNob3J0IHN0YXR1cykKIHsKQEAgLTE2MzMsNyArMTU3Niw3IEBACiAJc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWU7CiAJc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWI7CiAJdTggKnBmcmFtZTsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKnB3bGFuaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKIAlfX2xlMTYgKmZjdHJsOwogCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICYocGFkYXB0ZXItPnhtaXRwcml2KTsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmKHBhZGFwdGVyLT5tbG1lZXh0cHJpdik7CkBAIC0xNjU2LDIxICsxNTk5LDIxIEBACiAJbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwogCiAJcGZyYW1lID0gKHU4ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyKSArIFRYREVTQ19PRkZTRVQ7Ci0JcHdsYW5oZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICopcGZyYW1lOworCXB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcGZyYW1lOwogCi0JZmN0cmwgPSAmKHB3bGFuaGRyLT5mcmFtZV9jdGwpOworCWZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jb250cm9sOwogCSooZmN0cmwpID0gMDsKIAotCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIHJhZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBwbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIHJhZGRyKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSk7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgcG5ldHdvcmstPk1hY0FkZHJlc3MpOwogCiAJU2V0U2VxTnVtKHB3bGFuaGRyLCBwbWxtZWV4dC0+bWdudF9zZXEpOwogCXBtbG1lZXh0LT5tZ250X3NlcSsrOwogCVNldEZyYW1lU3ViVHlwZShwZnJhbWUsIFdJRklfQUNUSU9OKTsKIAotCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCiAJcGZyYW1lID0gcnR3X3NldF9maXhlZF9pZShwZnJhbWUsIDEsICYoY2F0ZWdvcnkpLCAmKHBhdHRyaWItPnBrdGxlbikpOwogCXBmcmFtZSA9IHJ0d19zZXRfZml4ZWRfaWUocGZyYW1lLCAxLCAmKGFjdGlvbiksICYocGF0dHJpYi0+cGt0bGVuKSk7CkBAIC0xNzc5LDcgKzE3MjIsNyBAQAogCXN0cnVjdCB4bWl0X2ZyYW1lCQkJKnBtZ250ZnJhbWU7CiAJc3RydWN0IHBrdF9hdHRyaWIJCQkqcGF0dHJpYjsKIAl1bnNpZ25lZCBjaGFyCQkJCSpwZnJhbWU7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyCSpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJX19sZTE2ICpmY3RybDsKIAlzdHJ1Y3QJd2xhbl9uZXR3b3JrCSpwbmV0d29yayA9IE5VTEw7CiAJc3RydWN0IHhtaXRfcHJpdgkJCSpweG1pdHByaXYgPSAmKHBhZGFwdGVyLT54bWl0cHJpdik7CkBAIC0xODE1LDIxICsxNzU4LDIxIEBACiAJbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwogCiAJcGZyYW1lID0gKHU4ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyKSArIFRYREVTQ19PRkZTRVQ7Ci0JcHdsYW5oZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICopcGZyYW1lOworCXB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcGZyYW1lOwogCi0JZmN0cmwgPSAmKHB3bGFuaGRyLT5mcmFtZV9jdGwpOworCWZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jb250cm9sOwogCSooZmN0cmwpID0gMDsKIAotCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIGN1cl9uZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBjdXJfbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIGN1cl9uZXR3b3JrLT5NYWNBZGRyZXNzKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSk7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgY3VyX25ldHdvcmstPk1hY0FkZHJlc3MpOwogCiAJU2V0U2VxTnVtKHB3bGFuaGRyLCBwbWxtZWV4dC0+bWdudF9zZXEpOwogCXBtbG1lZXh0LT5tZ250X3NlcSsrOwogCVNldEZyYW1lU3ViVHlwZShwZnJhbWUsIFdJRklfQUNUSU9OKTsKIAotCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCiAJcGZyYW1lID0gcnR3X3NldF9maXhlZF9pZShwZnJhbWUsIDEsICYoY2F0ZWdvcnkpLCAmKHBhdHRyaWItPnBrdGxlbikpOwogCXBmcmFtZSA9IHJ0d19zZXRfZml4ZWRfaWUocGZyYW1lLCAxLCAmKGFjdGlvbiksICYocGF0dHJpYi0+cGt0bGVuKSk7CkBAIC0yMTEyLDcgKzIwNTUsNyBAQAogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7CiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKIAotCWxlbiA9IHBhY2tldF9sZW4gLSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlsZW4gPSBwYWNrZXRfbGVuIC0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAogCWlmIChsZW4gPiBNQVhfSUVfU1opCiAJCXJldHVybiBfRkFJTDsKQEAgLTIxNDIsNyArMjA4NSw3IEBACiAKIAkvKiBiZWxvdyBpcyB0byBjb3B5IHRoZSBpbmZvcm1hdGlvbiBlbGVtZW50ICovCiAJYnNzaWQtPklFTGVuZ3RoID0gbGVuOwotCW1lbWNweShic3NpZC0+SUVzLCAocGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcikpLCBic3NpZC0+SUVMZW5ndGgpOworCW1lbWNweShic3NpZC0+SUVzLCAocGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSksIGJzc2lkLT5JRUxlbmd0aCk7CiAKIAkvKiBnZXQgdGhlIHNpZ25hbCBzdHJlbmd0aCBpbiBkQk0ucmF3IGRhdGEgKi8KIAlic3NpZC0+UnNzaSA9IHByZWN2X2ZyYW1lLT5hdHRyaWIucGh5X2luZm8ucmVjdnBvd2VyOwpAQCAtMjIxOSw3ICsyMTYyLDcgQEAKIAlpZiAoc3VidHlwZSA9PSBXSUZJX1BST0JFUkVRKSB7CiAJCS8qICBGSVhNRSAqLwogCQlic3NpZC0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOwotCQltZW1jcHkoYnNzaWQtPk1hY0FkZHJlc3MsIEdldEFkZHIyUHRyKHBmcmFtZSksIEVUSF9BTEVOKTsKKwkJZXRoZXJfYWRkcl9jb3B5KGJzc2lkLT5NYWNBZGRyZXNzLCBHZXRBZGRyMlB0cihwZnJhbWUpKTsKIAkJYnNzaWQtPlByaXZhY3kgPSAxOwogCQlyZXR1cm4gX1NVQ0NFU1M7CiAJfQpAQCAtMjIzMSwxMCArMjE3NCwxMCBAQAogCiAJaWYgKHZhbDE2ICYgQklUKDApKSB7CiAJCWJzc2lkLT5JbmZyYXN0cnVjdHVyZU1vZGUgPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmU7Ci0JCW1lbWNweShic3NpZC0+TWFjQWRkcmVzcywgR2V0QWRkcjJQdHIocGZyYW1lKSwgRVRIX0FMRU4pOworCQlldGhlcl9hZGRyX2NvcHkoYnNzaWQtPk1hY0FkZHJlc3MsIEdldEFkZHIyUHRyKHBmcmFtZSkpOwogCX0gZWxzZSB7CiAJCWJzc2lkLT5JbmZyYXN0cnVjdHVyZU1vZGUgPSBOZGlzODAyXzExSUJTUzsKLQkJbWVtY3B5KGJzc2lkLT5NYWNBZGRyZXNzLCBHZXRBZGRyM1B0cihwZnJhbWUpLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weShic3NpZC0+TWFjQWRkcmVzcywgR2V0QWRkcjNQdHIocGZyYW1lKSk7CiAJfQogCiAJaWYgKHZhbDE2ICYgQklUKDQpKQpAQCAtMjI0OSwxMCArMjE5MiwxMCBAQAogCQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCQlwID0gcnR3X2dldF9pZShic3NpZC0+SUVzICsgaWVfb2Zmc2V0LCBfSFRfQ0FQQUJJTElUWV9JRV8sICZsZW4sIGJzc2lkLT5JRUxlbmd0aCAtIGllX29mZnNldCk7CiAJCWlmIChwICYmIGxlbiA+IDApIHsKLQkJCXN0cnVjdCBIVF9jYXBzX2VsZW1lbnQJKnBIVF9jYXBzOwotCQkJcEhUX2NhcHMgPSAoc3RydWN0IEhUX2NhcHNfZWxlbWVudCAqKShwICsgMik7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqcEhUX2NhcHMgPQorCQkJCShzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqKShwICsgMik7CiAKLQkJCWlmIChsZTE2X3RvX2NwdShwSFRfY2Fwcy0+dS5IVF9jYXBfZWxlbWVudC5IVF9jYXBzX2luZm8pJkJJVCgxNCkpCisJCQlpZiAobGUxNl90b19jcHUocEhUX2NhcHMtPmNhcF9pbmZvKSAmIEJJVCgxNCkpCiAJCQkJcG1sbWVwcml2LT5udW1fRm9ydHlNSHpJbnRvbGVyYW50Kys7CiAJCX0gZWxzZSB7CiAJCQlwbWxtZXByaXYtPm51bV9zdGFfbm9faHQrKzsKQEAgLTI2ODQsNyArMjYyNyw3IEBACiAJCQl9CiAKIAkJCS8qIGNoZWNrIHRoZSB2ZW5kb3Igb2YgdGhlIGFzc29jIEFQICovCi0JCQlwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciA9IGNoZWNrX2Fzc29jX0FQKHBmcmFtZStzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKSwgbGVuLXNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpKTsKKwkJCXBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID0gY2hlY2tfYXNzb2NfQVAocGZyYW1lK3NpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciksIGxlbi1zaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKIAogCQkJLyogdXBkYXRlIFRTRiBWYWx1ZSAqLwogCQkJdXBkYXRlX1RTRihwbWxtZWV4dCwgcGZyYW1lLCBsZW4pOwpAQCAtMzI5NiwxMyArMzIzOSwxNSBAQAogCX0KIAogCS8qIHNhdmUgSFQgY2FwYWJpbGl0aWVzIGluIHRoZSBzdGEgb2JqZWN0ICovCi0JbWVtc2V0KCZwc3RhdC0+aHRwcml2Lmh0X2NhcCwgMCwgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCkpOwotCWlmIChlbGVtcy5odF9jYXBhYmlsaXRpZXMgJiYgZWxlbXMuaHRfY2FwYWJpbGl0aWVzX2xlbiA+PSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwKSkgeworCW1lbXNldCgmcHN0YXQtPmh0cHJpdi5odF9jYXAsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkpOworCWlmIChlbGVtcy5odF9jYXBhYmlsaXRpZXMgJiYKKwkgICAgZWxlbXMuaHRfY2FwYWJpbGl0aWVzX2xlbiA+PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKSB7CiAJCXBzdGF0LT5mbGFncyB8PSBXTEFOX1NUQV9IVDsKIAogCQlwc3RhdC0+ZmxhZ3MgfD0gV0xBTl9TVEFfV01FOwogCi0JCW1lbWNweSgmcHN0YXQtPmh0cHJpdi5odF9jYXAsIGVsZW1zLmh0X2NhcGFiaWxpdGllcywgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCkpOworCQltZW1jcHkoJnBzdGF0LT5odHByaXYuaHRfY2FwLAorCQkgICAgICAgZWxlbXMuaHRfY2FwYWJpbGl0aWVzLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKTsKIAl9IGVsc2UgewogCQlwc3RhdC0+ZmxhZ3MgJj0gfldMQU5fU1RBX0hUOwogCX0KQEAgLTM2MzksNyArMzU4NCw3IEBACiAJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKIAlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwogCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKLQl1OCAqZnJhbWVfYm9keSA9IHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCXU4ICpmcmFtZV9ib2R5ID0gcGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAl1OCBjYXRlZ29yeTsKIAl1OCBhY3Rpb247CiAKQEAgLTM3MTMsNyArMzY1OCw3IEBACiAJaWYgKHBzdGEgPT0gTlVMTCkKIAkJcmV0dXJuIF9TVUNDRVNTOwogCi0JZnJhbWVfYm9keSA9ICh1bnNpZ25lZCBjaGFyICopKHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpKTsKKwlmcmFtZV9ib2R5ID0gKHVuc2lnbmVkIGNoYXIgKikocGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CiAKIAljYXRlZ29yeSA9IGZyYW1lX2JvZHlbMF07CiAJaWYgKGNhdGVnb3J5ID09IFJUV19XTEFOX0NBVEVHT1JZX0JBQ0spIHsgLyogIHJlcHJlc2VudGluZyBCbG9jayBBY2sgKi8KQEAgLTM4MDAsNyArMzc0NSw3IEBACiAJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCXU4ICpmcmFtZV9ib2R5OwogCXU4IGRpYWxvZ1Rva2VuID0gMDsKLQlmcmFtZV9ib2R5ID0gKHVuc2lnbmVkIGNoYXIgKikocGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcikpOworCWZyYW1lX2JvZHkgPSAodW5zaWduZWQgY2hhciAqKShwZnJhbWUgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKIAogCWRpYWxvZ1Rva2VuID0gZnJhbWVfYm9keVs3XTsKIApAQCAtMzgxNCw3ICszNzU5LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgcmV0ID0gX0ZBSUw7CiAJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwotCXU4ICpmcmFtZV9ib2R5ID0gcGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJdTggKmZyYW1lX2JvZHkgPSBwZnJhbWUgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCiAJaWYgKCFtZW1jbXAoZnJhbWVfYm9keSArIDIsIFAyUF9PVUksIDQpKQogCQlyZXQgPSBvbl9hY3Rpb25fcHVibGljX3AycChwcmVjdl9mcmFtZSk7CkBAIC0zODI2LDcgKzM3NzEsNyBAQAogewogCXVuc2lnbmVkIGludCByZXQgPSBfRkFJTDsKIAl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7Ci0JdTggKmZyYW1lX2JvZHkgPSBwZnJhbWUgKyBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwl1OCAqZnJhbWVfYm9keSA9IHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAJdTggdG9rZW47CiAKIAl0b2tlbiA9IGZyYW1lX2JvZHlbMl07CkBAIC0zODQ1LDcgKzM3OTAsNyBAQAogewogCXVuc2lnbmVkIGludCByZXQgPSBfRkFJTDsKIAl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7Ci0JdTggKmZyYW1lX2JvZHkgPSBwZnJhbWUgKyBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwl1OCAqZnJhbWVfYm9keSA9IHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAJdTggY2F0ZWdvcnksIGFjdGlvbjsKIAogCS8qIGNoZWNrIFJBIG1hdGNoZXMgb3Igbm90ICovCkBAIC0zOTE3LDcgKzM4NjIsNyBAQAogCXVuc2lnbmVkIGNoYXIJKmZyYW1lX2JvZHk7CiAJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCi0JZnJhbWVfYm9keSA9ICh1bnNpZ25lZCBjaGFyICopKHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpKTsKKwlmcmFtZV9ib2R5ID0gKHVuc2lnbmVkIGNoYXIgKikocGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CiAKIAljYXRlZ29yeSA9IGZyYW1lX2JvZHlbMF07CiAKQEAgLTQyOTUsNyArNDI0MCw3IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmcGNtZF9vYmotPmxpc3QpOwogCi0JcGNtZF9vYmotPmNtZGNvZGUgPSBHRU5fQ01EX0NPREUoX1NldF9NTE1FX0VWVCk7CisJcGNtZF9vYmotPmNtZGNvZGUgPSBfU2V0X01MTUVfRVZUX0NNRF87CiAJcGNtZF9vYmotPmNtZHN6ID0gY21kc3o7CiAJcGNtZF9vYmotPnBhcm1idWYgPSBwZXZ0Y21kOwogCkBAIC00MzA0LDcgKzQyNDksNyBAQAogCiAJcGMyaF9ldnRfaGRyID0gKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKikocGV2dGNtZCk7CiAJcGMyaF9ldnRfaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHN1cnZleV9ldmVudCk7Ci0JcGMyaF9ldnRfaGRyLT5JRCA9IEdFTl9FVlRfQ09ERShfU3VydmV5KTsKKwlwYzJoX2V2dF9oZHItPklEID0gX1N1cnZleV9FVlRfOwogCXBjMmhfZXZ0X2hkci0+c2VxID0gYXRvbWljX2luY19yZXR1cm4oJnBtbG1lZXh0LT5ldmVudF9zZXEpOwogCiAJcHN1cnZleV9ldnQgPSAoc3RydWN0IHN1cnZleV9ldmVudCAqKShwZXZ0Y21kICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpKTsKQEAgLTQzNDUsNyArNDI5MCw3IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmcGNtZF9vYmotPmxpc3QpOwogCi0JcGNtZF9vYmotPmNtZGNvZGUgPSBHRU5fQ01EX0NPREUoX1NldF9NTE1FX0VWVCk7CisJcGNtZF9vYmotPmNtZGNvZGUgPSBfU2V0X01MTUVfRVZUX0NNRF87CiAJcGNtZF9vYmotPmNtZHN6ID0gY21kc3o7CiAJcGNtZF9vYmotPnBhcm1idWYgPSBwZXZ0Y21kOwogCkBAIC00MzU0LDcgKzQyOTksNyBAQAogCiAJcGMyaF9ldnRfaGRyID0gKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKikocGV2dGNtZCk7CiAJcGMyaF9ldnRfaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHN1cnZleWRvbmVfZXZlbnQpOwotCXBjMmhfZXZ0X2hkci0+SUQgPSBHRU5fRVZUX0NPREUoX1N1cnZleURvbmUpOworCXBjMmhfZXZ0X2hkci0+SUQgPSBfU3VydmV5RG9uZV9FVlRfOwogCXBjMmhfZXZ0X2hkci0+c2VxID0gYXRvbWljX2luY19yZXR1cm4oJnBtbG1lZXh0LT5ldmVudF9zZXEpOwogCiAJcHN1cnZleWRvbmVfZXZ0ID0gKHN0cnVjdCBzdXJ2ZXlkb25lX2V2ZW50ICopKHBldnRjbWQgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOwpAQCAtNDM4OSw3ICs0MzM0LDcgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZwY21kX29iai0+bGlzdCk7CiAKLQlwY21kX29iai0+Y21kY29kZSA9IEdFTl9DTURfQ09ERShfU2V0X01MTUVfRVZUKTsKKwlwY21kX29iai0+Y21kY29kZSA9IF9TZXRfTUxNRV9FVlRfQ01EXzsKIAlwY21kX29iai0+Y21kc3ogPSBjbWRzejsKIAlwY21kX29iai0+cGFybWJ1ZiA9IHBldnRjbWQ7CiAKQEAgLTQzOTgsNyArNDM0Myw3IEBACiAKIAlwYzJoX2V2dF9oZHIgPSAoc3RydWN0IEMySEV2ZW50X0hlYWRlciAqKShwZXZ0Y21kKTsKIAlwYzJoX2V2dF9oZHItPmxlbiA9IHNpemVvZihzdHJ1Y3Qgam9pbmJzc19ldmVudCk7Ci0JcGMyaF9ldnRfaGRyLT5JRCA9IEdFTl9FVlRfQ09ERShfSm9pbkJzcyk7CisJcGMyaF9ldnRfaGRyLT5JRCA9IF9Kb2luQnNzX0VWVF87CiAJcGMyaF9ldnRfaGRyLT5zZXEgPSBhdG9taWNfaW5jX3JldHVybigmcG1sbWVleHQtPmV2ZW50X3NlcSk7CiAKIAlwam9pbmJzc19ldnQgPSAoc3RydWN0IGpvaW5ic3NfZXZlbnQgKikocGV2dGNtZCArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7CkBAIC00NDQwLDcgKzQzODUsNyBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJnBjbWRfb2JqLT5saXN0KTsKIAotCXBjbWRfb2JqLT5jbWRjb2RlID0gR0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpOworCXBjbWRfb2JqLT5jbWRjb2RlID0gX1NldF9NTE1FX0VWVF9DTURfOwogCXBjbWRfb2JqLT5jbWRzeiA9IGNtZHN6OwogCXBjbWRfb2JqLT5wYXJtYnVmID0gcGV2dGNtZDsKIApAQCAtNDQ0OSwxMSArNDM5NCwxMSBAQAogCiAJcGMyaF9ldnRfaGRyID0gKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKikocGV2dGNtZCk7CiAJcGMyaF9ldnRfaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHN0YWRlbF9ldmVudCk7Ci0JcGMyaF9ldnRfaGRyLT5JRCA9IEdFTl9FVlRfQ09ERShfRGVsU1RBKTsKKwlwYzJoX2V2dF9oZHItPklEID0gX0RlbFNUQV9FVlRfOwogCXBjMmhfZXZ0X2hkci0+c2VxID0gYXRvbWljX2luY19yZXR1cm4oJnBtbG1lZXh0LT5ldmVudF9zZXEpOwogCiAJcGRlbF9zdGFfZXZ0ID0gKHN0cnVjdCBzdGFkZWxfZXZlbnQgKikocGV2dGNtZCArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7Ci0JbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopKCYocGRlbF9zdGFfZXZ0LT5tYWNhZGRyKSksIE1hY0FkZHIsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkoKHVuc2lnbmVkIGNoYXIgKikoJihwZGVsX3N0YV9ldnQtPm1hY2FkZHIpKSwgTWFjQWRkcik7CiAJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopKHBkZWxfc3RhX2V2dC0+cnN2ZCksICh1bnNpZ25lZCBjaGFyICopKCZyZWFzb24pLCAyKTsKIAogCkBAIC00NDkzLDcgKzQ0MzgsNyBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJnBjbWRfb2JqLT5saXN0KTsKIAotCXBjbWRfb2JqLT5jbWRjb2RlID0gR0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpOworCXBjbWRfb2JqLT5jbWRjb2RlID0gX1NldF9NTE1FX0VWVF9DTURfOwogCXBjbWRfb2JqLT5jbWRzeiA9IGNtZHN6OwogCXBjbWRfb2JqLT5wYXJtYnVmID0gcGV2dGNtZDsKIApAQCAtNDUwMiwxMSArNDQ0NywxMSBAQAogCiAJcGMyaF9ldnRfaGRyID0gKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKikocGV2dGNtZCk7CiAJcGMyaF9ldnRfaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHN0YXNzb2NfZXZlbnQpOwotCXBjMmhfZXZ0X2hkci0+SUQgPSBHRU5fRVZUX0NPREUoX0FkZFNUQSk7CisJcGMyaF9ldnRfaGRyLT5JRCA9IF9BZGRTVEFfRVZUXzsKIAlwYzJoX2V2dF9oZHItPnNlcSA9IGF0b21pY19pbmNfcmV0dXJuKCZwbWxtZWV4dC0+ZXZlbnRfc2VxKTsKIAogCXBhZGRfc3RhX2V2dCA9IChzdHJ1Y3Qgc3Rhc3NvY19ldmVudCAqKShwZXZ0Y21kICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpKTsKLQltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikoJihwYWRkX3N0YV9ldnQtPm1hY2FkZHIpKSwgTWFjQWRkciwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weSgodW5zaWduZWQgY2hhciAqKSgmKHBhZGRfc3RhX2V2dC0+bWFjYWRkcikpLCBNYWNBZGRyKTsKIAlwYWRkX3N0YV9ldnQtPmNhbV9pZCA9IGNhbV9pZHg7CiAKIAlEQkdfODhFKCJyZXBvcnRfYWRkX3N0YV9ldmVudDogYWRkIFNUQVxuIik7CkBAIC00NTM3LDcgKzQ0ODIsNyBAQAogCiAJCXBzdGEtPmh0cHJpdi5hbXBkdV9lbmFibGUgPSBwbWxtZXByaXYtPmh0cHJpdi5hbXBkdV9lbmFibGU7CiAKLQkJaWYgKHN1cHBvcnRfc2hvcnRfR0kocGFkYXB0ZXIsICYocG1sbWVpbmZvLT5IVF9jYXBzKSkpCisJCWlmIChzdXBwb3J0X3Nob3J0X0dJKHBhZGFwdGVyLCAmcG1sbWVpbmZvLT5IVF9jYXBzKSkKIAkJCXBzdGEtPmh0cHJpdi5zZ2kgPSB0cnVlOwogCiAJCXBzdGEtPnFvc19vcHRpb24gPSB0cnVlOwpAQCAtNDkwNCw3ICs0ODQ5LDcgQEAKIAkJCWdvdG8gZXhpdF9zdXJ2ZXlfdGltZXJfaGRsOwogCQl9CiAKLQkJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHN1cnZleVBhcmEsIEdFTl9DTURfQ09ERShfU2l0ZVN1cnZleSkpOworCQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwc3VydmV5UGFyYSwgX1NpdGVTdXJ2ZXlfQ01EXyk7CiAJCXJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiAJfQogCkBAIC01NDgwLDcgKzU0MjUsNyBAQAogCQkJCSAgICAgIHBtbG1laW5mby0+aGlkZGVuX3NzaWRfbW9kZSk7CiAJcHR4QmVhY29uX3Bhcm0tPklFTGVuZ3RoICs9IGxlbl9kaWZmOwogCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHR4QmVhY29uX3Bhcm0sIEdFTl9DTURfQ09ERShfVFhfQmVhY29uKSk7CisJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHR4QmVhY29uX3Bhcm0sIF9UWF9CZWFjb25fQ01EXyk7CiAKIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3B3cmN0cmwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcHdyY3RybC5jCmluZGV4IDU5YzZkOGEuLjBiNzBmZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcHdyY3RybC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcHdyY3RybC5jCkBAIC0zOCw3ICszOCw3IEBACiAJTGVhdmVBbGxQb3dlclNhdmVNb2RlKHBhZGFwdGVyKTsKIAogCURCR184OEUoIj09PiBydHdfaHdfc3VzcGVuZFxuIik7Ci0JX2VudGVyX3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCW11dGV4X2xvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCXB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZyA9IHRydWU7CiAJLyogczEuICovCiAJaWYgKHBuZXRkZXYpIHsKQEAgLTczLDcgKzczLDcgQEAKIAlwd3Jwcml2LT5yZl9wd3JzdGF0ZSA9IHJmX29mZjsKIAlwd3Jwcml2LT5iaXBzX3Byb2Nlc3NpbmcgPSBmYWxzZTsKIAotCV9leGl0X3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCW11dGV4X3VubG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAKIAlyZXR1cm4gMDsKIApAQCAtOTAsMTIgKzkwLDEyIEBACiAKIAkvKiBzeXN0ZW0gcmVzdW1lICovCiAJREJHXzg4RSgiPT0+IHJ0d19od19yZXN1bWVcbiIpOwotCV9lbnRlcl9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwltdXRleF9sb2NrKCZwd3Jwcml2LT5tdXRleF9sb2NrKTsKIAlwd3Jwcml2LT5iaXBzX3Byb2Nlc3NpbmcgPSB0cnVlOwogCXJ0d19yZXNldF9kcnZfc3cocGFkYXB0ZXIpOwogCiAJaWYgKHBtX25ldGRldl9vcGVuKHBuZXRkZXYsIGZhbHNlKSAhPSAwKSB7Ci0JCV9leGl0X3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCQltdXRleF91bmxvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCQlnb3RvIGVycm9yX2V4aXQ7CiAJfQogCkBAIC0xMTMsNyArMTEzLDcgQEAKIAlwd3Jwcml2LT5yZl9wd3JzdGF0ZSA9IHJmX29uOwogCXB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZyA9IGZhbHNlOwogCi0JX2V4aXRfcHdybG9jaygmcHdycHJpdi0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZwd3Jwcml2LT5tdXRleF9sb2NrKTsKIAogCiAJcmV0dXJuIDA7CkBAIC0xMzgsNyArMTM4LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCV9lbnRlcl9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwltdXRleF9sb2NrKCZwd3Jwcml2LT5tdXRleF9sb2NrKTsKIAogCXB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZyA9IHRydWU7CiAKQEAgLTE1OSw3ICsxNTksNyBAQAogCX0KIAlwd3Jwcml2LT5iaXBzX3Byb2Nlc3NpbmcgPSBmYWxzZTsKIAotCV9leGl0X3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCW11dGV4X3VubG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiB9CiAKIGludCBpcHNfbGVhdmUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQpAQCAtMTcxLDcgKzE3MSw3IEBACiAJaW50IGtleWlkOwogCiAKLQlfZW50ZXJfcHdybG9jaygmcHdycHJpdi0+bG9jayk7CisJbXV0ZXhfbG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAKIAlpZiAoKHB3cnByaXYtPnJmX3B3cnN0YXRlID09IHJmX29mZikgJiYgKCFwd3Jwcml2LT5iaXBzX3Byb2Nlc3NpbmcpKSB7CiAJCXB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZyA9IHRydWU7CkBAIC0yMDUsNyArMjA1LDcgQEAKIAkJcHdycHJpdi0+YnBvd2VyX3NhdmluZyA9IGZhbHNlOwogCX0KIAotCV9leGl0X3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCW11dGV4X3VubG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtNTA0LDcgKzUwNCw3IEBACiB7CiAJc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybHByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwogCi0JX2luaXRfcHdybG9jaygmcHdyY3RybHByaXYtPmxvY2spOworCW11dGV4X2luaXQoJnB3cmN0cmxwcml2LT5tdXRleF9sb2NrKTsKIAlwd3JjdHJscHJpdi0+cmZfcHdyc3RhdGUgPSByZl9vbjsKIAlwd3JjdHJscHJpdi0+aXBzX2VudGVyX2NudHMgPSAwOwogCXB3cmN0cmxwcml2LT5pcHNfbGVhdmVfY250cyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JlY3YuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcmVjdi5jCmluZGV4IDk3N2JiMjUuLmI4N2NiYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcmVjdi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcmVjdi5jCkBAIC0zOSw3ICszOSw3IEBACiAgICAgICAgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMAogfTsKIAotdm9pZCBydHdfc2lnbmFsX3N0YXRfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBydHdfc2lnbmFsX3N0YXRfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKIHZvaWQgX3J0d19pbml0X3N0YV9yZWN2X3ByaXYoc3RydWN0IHN0YV9yZWN2X3ByaXYgKnBzdGFfcmVjdnByaXYpCiB7CkBAIC03Myw3ICs3Myw3IEBACiAJaWYgKCFwcmVjdnByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmKQogCQlyZXR1cm4gX0ZBSUw7CiAKLQlwcmVjdnByaXYtPnByZWN2X2ZyYW1lX2J1ZiA9ICh1OCAqKU5fQllURV9BTElHTUVOVCgoc2l6ZV90KShwcmVjdnByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmKSwgUlhGUkFNRV9BTElHTl9TWik7CisJcHJlY3Zwcml2LT5wcmVjdl9mcmFtZV9idWYgPSBQVFJfQUxJR04ocHJlY3Zwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZiwgUlhGUkFNRV9BTElHTl9TWik7CiAKIAlwcmVjdmZyYW1lID0gKHN0cnVjdCByZWN2X2ZyYW1lICopcHJlY3Zwcml2LT5wcmVjdl9mcmFtZV9idWY7CiAKQEAgLTIwODgsNyArMjA4OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBydHdfc2lnbmFsX3N0YXRfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIHJ0d19zaWduYWxfc3RhdF90aW1lcl9oZGwodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopZGF0YTsKIAlzdHJ1Y3QgcmVjdl9wcml2ICpyZWN2cHJpdiA9ICZhZGFwdGVyLT5yZWN2cHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcmYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcmYuYwppbmRleCAzZmMxYThmLi5lNDdiZTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19yZi5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgogI2luY2x1ZGUgPHhtaXRfb3NkZXAuaD4KIAotCiBzdHJ1Y3QgY2hfZnJlcSB7CiAJdTMyIGNoYW5uZWw7CiAJdTMyIGZyZXF1ZW5jeTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc2VjdXJpdHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc2VjdXJpdHkuYwppbmRleCA0NDJhNjE0Li44NWJiNDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NlY3VyaXR5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zZWN1cml0eS5jCkBAIC0yMzMsNyArMjMzLDYgQEAKIAkJCQkgJmNyYywgJnBheWxvYWRbbGVuZ3RoLTRdKSk7CiAJCX0KIAl9Ci0JcmV0dXJuOwogfQogCiAvKiAzCQk9PT09PSBUS0lQIHJlbGF0ZWQgPT09PT0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc3Jlc2V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NyZXNldC5jCmluZGV4IDEzYTViZjQuLmExOThjNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc3Jlc2V0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zcmVzZXQuYwpAQCAtMTYsMTggKzE2LDE2IEBACiAjaW5jbHVkZSA8cnR3X3NyZXNldC5oPgogI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KIAotdm9pZCBzcmVzZXRfaW5pdF92YWx1ZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCit2b2lkIHJ0d19oYWxfc3Jlc2V0X2luaXQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBzcmVzZXRfcHJpdiAqcHNydHByaXYgPSAmcEhhbERhdGEtPnNyZXN0cHJpdjsKKwlzdHJ1Y3Qgc3Jlc2V0X3ByaXYgKnBzcnRwcml2ID0gJnBhZGFwdGVyLT5IYWxEYXRhLT5zcmVzdHByaXY7CiAKIAlwc3J0cHJpdi0+V2lmaV9FcnJvcl9TdGF0dXMgPSBXSUZJX1NUQVRVU19TVUNDRVNTOwogfQogCiB1OCBzcmVzZXRfZ2V0X3dpZmlfc3RhdHVzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3Qgc3Jlc2V0X3ByaXYgKnBzcnRwcml2ID0gJnBIYWxEYXRhLT5zcmVzdHByaXY7CisJc3RydWN0IHNyZXNldF9wcml2ICpwc3J0cHJpdiA9ICZwYWRhcHRlci0+SGFsRGF0YS0+c3Jlc3Rwcml2OwogCiAJdTggc3RhdHVzID0gV0lGSV9TVEFUVVNfU1VDQ0VTUzsKIAl1MzIgdmFsMzIgPSAwOwpAQCAtNTQsNiArNTIsNSBAQAogCiB2b2lkIHNyZXNldF9zZXRfd2lmaV9lcnJvcl9zdGF0dXMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgc3RhdHVzKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBIYWxEYXRhLT5zcmVzdHByaXYuV2lmaV9FcnJvcl9TdGF0dXMgPSBzdGF0dXM7CisJcGFkYXB0ZXItPkhhbERhdGEtPnNyZXN0cHJpdi5XaWZpX0Vycm9yX1N0YXR1cyA9IHN0YXR1czsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfd2xhbl91dGlsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3dsYW5fdXRpbC5jCmluZGV4IDQ0MTBmZTguLjJhNjVhYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfd2xhbl91dGlsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d193bGFuX3V0aWwuYwpAQCAtMzQxLDkgKzM0MSw2IEBACiB7CiAJdTggY2VudGVyX2NoOwogCi0JaWYgKHBhZGFwdGVyLT5iTm90aWZ5Q2hhbm5lbENoYW5nZSkKLQkJREJHXzg4RSgiWyVzXSBjaCA9ICVkLCBvZmZzZXQgPSAlZCwgYndtb2RlID0gJWRcbiIsIF9fZnVuY19fLCBjaGFubmVsLCBjaGFubmVsX29mZnNldCwgYndtb2RlKTsKLQogCWlmICgoYndtb2RlID09IEhUX0NIQU5ORUxfV0lEVEhfMjApIHx8CiAJICAgIChjaGFubmVsX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFKSkgewogCQkvKiBTZWxlY3RDaGFubmVsKHBhZGFwdGVyLCBjaGFubmVsKTsgKi8KQEAgLTcxNiw2ICs3MTMsNyBAQAogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAJc3RydWN0IG1sbWVfcHJpdgkJKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IGh0X3ByaXYJCQkqcGh0cHJpdiA9ICZwbWxtZXByaXYtPmh0cHJpdjsKKwl1OCAqSFRfY2FwID0gKHU4ICopKCZwbWxtZWluZm8tPkhUX2NhcHMpOwogCiAJaWYgKHBJRSA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC03MjgsMjAgKzcyNiwyMCBAQAogCWZvciAoaSA9IDA7IGkgPCAocElFLT5MZW5ndGgpOyBpKyspIHsKIAkJaWYgKGkgIT0gMikgewogCQkJLyoJR290IHRoZSBlbmRpYW4gaXNzdWUgaGVyZS4gKi8KLQkJCXBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcFtpXSAmPSAocElFLT5kYXRhW2ldKTsKKwkJCUhUX2NhcFtpXSAmPSAocElFLT5kYXRhW2ldKTsKIAkJfSBlbHNlIHsKIAkJCS8qIG1vZGlmeSBmcm9tICBmdyBieSBUaG9tYXMgMjAxMC8xMS8xNyAqLwotCQkJaWYgKChwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5BTVBEVV9wYXJhICYgMHgzKSA+IChwSUUtPmRhdGFbaV0gJiAweDMpKQorCQkJaWYgKChwbWxtZWluZm8tPkhUX2NhcHMuYW1wZHVfcGFyYW1zX2luZm8gJiAweDMpID4gKHBJRS0+ZGF0YVtpXSAmIDB4MykpCiAJCQkJbWF4X0FNUERVX2xlbiA9IHBJRS0+ZGF0YVtpXSAmIDB4MzsKIAkJCWVsc2UKLQkJCQltYXhfQU1QRFVfbGVuID0gcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuQU1QRFVfcGFyYSAmIDB4MzsKKwkJCQltYXhfQU1QRFVfbGVuID0gcG1sbWVpbmZvLT5IVF9jYXBzLmFtcGR1X3BhcmFtc19pbmZvICYgMHgzOwogCi0JCQlpZiAoKHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkFNUERVX3BhcmEgJiAweDFjKSA+IChwSUUtPmRhdGFbaV0gJiAweDFjKSkKLQkJCQltaW5fTVBEVV9zcGFjaW5nID0gcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuQU1QRFVfcGFyYSAmIDB4MWM7CisJCQlpZiAoKHBtbG1laW5mby0+SFRfY2Fwcy5hbXBkdV9wYXJhbXNfaW5mbyAmIDB4MWMpID4gKHBJRS0+ZGF0YVtpXSAmIDB4MWMpKQorCQkJCW1pbl9NUERVX3NwYWNpbmcgPSBwbWxtZWluZm8tPkhUX2NhcHMuYW1wZHVfcGFyYW1zX2luZm8gJiAweDFjOwogCQkJZWxzZQogCQkJCW1pbl9NUERVX3NwYWNpbmcgPSBwSUUtPmRhdGFbaV0gJiAweDFjOwogCi0JCQlwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5BTVBEVV9wYXJhID0gbWF4X0FNUERVX2xlbiB8IG1pbl9NUERVX3NwYWNpbmc7CisJCQlwbWxtZWluZm8tPkhUX2NhcHMuYW1wZHVfcGFyYW1zX2luZm8gPSBtYXhfQU1QRFVfbGVuIHwgbWluX01QRFVfc3BhY2luZzsKIAkJfQogCX0KIApAQCAtNzUwLDkgKzc0OCw5IEBACiAJLyogdXBkYXRlIHRoZSBNQ1MgcmF0ZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQlpZiAoKHJmX3R5cGUgPT0gUkZfMVQxUikgfHwgKHJmX3R5cGUgPT0gUkZfMVQyUikpCi0JCQlwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5NQ1NfcmF0ZVtpXSAmPSBNQ1NfcmF0ZV8xUltpXTsKKwkJCSgodTggKikmcG1sbWVpbmZvLT5IVF9jYXBzLm1jcylbaV0gJj0gTUNTX3JhdGVfMVJbaV07CiAJCWVsc2UKLQkJCXBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50Lk1DU19yYXRlW2ldICY9IE1DU19yYXRlXzJSW2ldOworCQkJKCh1OCAqKSZwbWxtZWluZm8tPkhUX2NhcHMubWNzKVtpXSAmPSBNQ1NfcmF0ZV8yUltpXTsKIAl9CiB9CiAKQEAgLTc5OCw5ICs3OTYsOSBAQAogCQlBTVBEVV9wYXJhIFsxOjBdOk1heCBBTVBEVSBMZW4gPT4gMDo4ayAsIDE6MTZrLCAyOjMyaywgMzo2NGsKIAkJQU1QRFVfcGFyYSBbNDoyXTpNaW4gTVBEVSBTdGFydCBTcGFjaW5nCiAJKi8KLQltYXhfQU1QRFVfbGVuID0gcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuQU1QRFVfcGFyYSAmIDB4MDM7CisJbWF4X0FNUERVX2xlbiA9IHBtbG1laW5mby0+SFRfY2Fwcy5hbXBkdV9wYXJhbXNfaW5mbyAmIDB4MDM7CiAKLQltaW5fTVBEVV9zcGFjaW5nID0gKHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkFNUERVX3BhcmEgJiAweDFjKSA+PiAyOworCW1pbl9NUERVX3NwYWNpbmcgPSAocG1sbWVpbmZvLT5IVF9jYXBzLmFtcGR1X3BhcmFtc19pbmZvICYgMHgxYykgPj4gMjsKIAogCXJ0d19oYWxfc2V0X2h3cmVnKHBhZGFwdGVyLCBIV19WQVJfQU1QRFVfTUlOX1NQQUNFLCAodTggKikoJm1pbl9NUERVX3NwYWNpbmcpKTsKIApAQCAtODcyLDcgKzg3MCw2IEBACiAJdTMyIHdwYV9pZWxlbiA9IDA7CiAJdTggKnBic3NpZCA9IEdldEFkZHIzUHRyKHBmcmFtZSk7CiAJc3RydWN0IEhUX2luZm9fZWxlbWVudCAqcGh0X2luZm8gPSBOVUxMOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcCA9IE5VTEw7CiAJdTMyIGJjbl9jaGFubmVsOwogCXVuc2lnbmVkIHNob3J0CWh0X2NhcF9pbmZvOwogCXVuc2lnbmVkIGNoYXIJaHRfaW5mb19pbmZvc18wOwpAQCAtODgxLDcgKzg3OCw3IEBACiAJaWYgKGlzX2NsaWVudF9hc3NvY2lhdGVkX3RvX2FwKEFkYXB0ZXIpID09IGZhbHNlKQogCQlyZXR1cm4gdHJ1ZTsKIAotCWxlbiA9IHBhY2tldF9sZW4gLSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlsZW4gPSBwYWNrZXRfbGVuIC0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAogCWlmIChsZW4gPiBNQVhfSUVfU1opIHsKIAkJREJHXzg4RSgiJXMgSUUgdG9vIGxvbmcgZm9yIHN1cnZleSBldmVudFxuIiwgX19mdW5jX18pOwpAQCAtOTA3LDE0ICs5MDQsMTYgQEAKIAogCS8qIGJlbG93IGlzIHRvIGNvcHkgdGhlIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KIAlic3NpZC0+SUVMZW5ndGggPSBsZW47Ci0JbWVtY3B5KGJzc2lkLT5JRXMsIChwZnJhbWUgKyBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKSksIGJzc2lkLT5JRUxlbmd0aCk7CisJbWVtY3B5KGJzc2lkLT5JRXMsIChwZnJhbWUgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKSwgYnNzaWQtPklFTGVuZ3RoKTsKIAogCS8qIGNoZWNrIGJ3IGFuZCBjaGFubmVsIG9mZnNldCAqLwogCS8qIHBhcnNpbmcgSFRfQ0FQX0lFICovCiAJcCA9IHJ0d19nZXRfaWUoYnNzaWQtPklFcyArIF9GSVhFRF9JRV9MRU5HVEhfLCBfSFRfQ0FQQUJJTElUWV9JRV8sICZsZW4sIGJzc2lkLT5JRUxlbmd0aCAtIF9GSVhFRF9JRV9MRU5HVEhfKTsKIAlpZiAocCAmJiBsZW4gPiAwKSB7Ci0JCXBodF9jYXAgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwICopKHAgKyAyKTsKLQkJaHRfY2FwX2luZm8gPSBwaHRfY2FwLT5jYXBfaW5mbzsKKwkJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcCA9CisJCQkoc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKikocCArIDIpOworCisJCWh0X2NhcF9pbmZvID0gbGUxNl90b19jcHUoaHRfY2FwLT5jYXBfaW5mbyk7CiAJfSBlbHNlIHsKIAkJaHRfY2FwX2luZm8gPSAwOwogCX0KQEAgLTEyNDMsMTYgKzEyNDIsMTcgQEAKIAlyZXR1cm4gbWFzazsKIH0KIAotdW5zaWduZWQgaW50IHVwZGF0ZV9NU0NfcmF0ZShzdHJ1Y3QgSFRfY2Fwc19lbGVtZW50ICpwSFRfY2FwcykKK3Vuc2lnbmVkIGludCB1cGRhdGVfTVNDX3JhdGUoc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKnBIVF9jYXBzKQogewogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKIAotCW1hc2sgPSAocEhUX2NhcHMtPnUuSFRfY2FwX2VsZW1lbnQuTUNTX3JhdGVbMF0gPDwgMTIpIHwgKHBIVF9jYXBzLT51LkhUX2NhcF9lbGVtZW50Lk1DU19yYXRlWzFdIDw8IDIwKTsKKwltYXNrID0gKHBIVF9jYXBzLT5tY3MucnhfbWFza1swXSA8PCAxMikgfAorCSAgICAgICAocEhUX2NhcHMtPm1jcy5yeF9tYXNrWzFdIDw8IDIwKTsKIAogCXJldHVybiBtYXNrOwogfQogCi1pbnQgc3VwcG9ydF9zaG9ydF9HSShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBIVF9jYXBzX2VsZW1lbnQgKnBIVF9jYXBzKQoraW50IHN1cHBvcnRfc2hvcnRfR0koc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqcEhUX2NhcHMpCiB7CiAJdW5zaWduZWQgY2hhcgkJCQkJYml0X29mZnNldDsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwpAQCAtMTI2Niw3ICsxMjY2LDcgQEAKIAogCWJpdF9vZmZzZXQgPSAocG1sbWVleHQtPmN1cl9id21vZGUgJiBIVF9DSEFOTkVMX1dJRFRIXzQwKSA/IDYgOiA1OwogCi0JaWYgKF9fbGUxNl90b19jcHUocEhUX2NhcHMtPnUuSFRfY2FwX2VsZW1lbnQuSFRfY2Fwc19pbmZvKSAmICgweDEgPDwgYml0X29mZnNldCkpCisJaWYgKF9fbGUxNl90b19jcHUocEhUX2NhcHMtPmNhcF9pbmZvKSAmICgweDEgPDwgYml0X29mZnNldCkpCiAJCXJldHVybiBfU1VDQ0VTUzsKIAllbHNlCiAJCXJldHVybiBfRkFJTDsKQEAgLTE1MDgsNyArMTUwOCw3IEBACiAJU0lGU19UaW1lciA9IDB4MGEwYTA4MDg7LyogMHgwODA4IC0+IGZvciBDQ0ssIDB4MGEwYSAtPiBmb3IgT0ZETSAqLwogCQkJCS8qIGNoYW5nZSB0aGlzIHZhbHVlIGlmIGhhdmluZyBJT1QgaXNzdWVzLiAqLwogCi0JcGFkYXB0ZXItPkhhbEZ1bmMuU2V0SHdSZWdIYW5kbGVyKHBhZGFwdGVyLCBIV19WQVJfUkVTUF9TSUZTLCAgKHU4ICopJlNJRlNfVGltZXIpOworCXJ0d19oYWxfc2V0X2h3cmVnKHBhZGFwdGVyLCBIV19WQVJfUkVTUF9TSUZTLCAgKHU4ICopJlNJRlNfVGltZXIpOwogCiAJaWYgKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSAmIFdJUkVMRVNTXzExQikKIAkJdXBkYXRlX21nbnRfdHhfcmF0ZShwYWRhcHRlciwgSUVFRTgwMjExX0NDS19SQVRFXzFNQik7CkBAIC0xNTg0LDcgKzE1ODQsNyBAQAogCXU4ICpwSUU7CiAJX19sZTMyICpwYnVmOwogCi0JcElFID0gcGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcElFID0gcGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAlwYnVmID0gKF9fbGUzMiAqKXBJRTsKIAogCXBtbG1lZXh0LT5UU0ZWYWx1ZSA9IGxlMzJfdG9fY3B1KCoocGJ1ZisxKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3htaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfeG1pdC5jCmluZGV4IGUwYTU1NjcuLjBmOGI4ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfeG1pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfeG1pdC5jCkBAIC01Nyw4ICs1Nyw2IEBACiAJLyogIFdlIGRvbid0IG5lZWQgdG8gbWVtc2V0IHBhZGFwdGVyLT5YWFggdG8gemVybywgYmVjYXVzZSBhZGFwdGVyIGlzIGFsbG9jYXRlZCBieSB2emFsbG9jKCkuICovCiAKIAlzcGluX2xvY2tfaW5pdCgmcHhtaXRwcml2LT5sb2NrKTsKLQlzZW1hX2luaXQoJnB4bWl0cHJpdi0+eG1pdF9zZW1hLCAwKTsKLQlzZW1hX2luaXQoJnB4bWl0cHJpdi0+dGVybWluYXRlX3htaXR0aHJlYWRfc2VtYSwgMCk7CiAKIAkvKgogCVBsZWFzZSBpbnNlcnQgYWxsIHRoZSBxdWV1ZSBpbml0aWFsaXphaXRvbiB1c2luZyBfcnR3X2luaXRfcXVldWUgYmVsb3cKQEAgLTg4LDcgKzg2LDcgQEAKIAkJcmVzID0gX0ZBSUw7CiAJCWdvdG8gZXhpdDsKIAl9Ci0JcHhtaXRwcml2LT5weG1pdF9mcmFtZV9idWYgPSAodTggKilOX0JZVEVfQUxJR01FTlQoKHNpemVfdCkocHhtaXRwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZiksIDQpOworCXB4bWl0cHJpdi0+cHhtaXRfZnJhbWVfYnVmID0gUFRSX0FMSUdOKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYsIDQpOwogCS8qIHB4bWl0cHJpdi0+cHhtaXRfZnJhbWVfYnVmID0gcHhtaXRwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZiArIDQgLSAqLwogCS8qIAkJCQkJCSgoc2l6ZV90KSAocHhtaXRwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZikgJjMpOyAqLwogCkBAIC0xMjYsNyArMTI0LDcgQEAKIAkJZ290byBleGl0OwogCX0KIAotCXB4bWl0cHJpdi0+cHhtaXRidWYgPSAodTggKilOX0JZVEVfQUxJR01FTlQoKHNpemVfdCkocHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRidWYpLCA0KTsKKwlweG1pdHByaXYtPnB4bWl0YnVmID0gUFRSX0FMSUdOKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0YnVmLCA0KTsKIAkvKiBweG1pdHByaXYtPnB4bWl0YnVmID0gcHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRidWYgKyA0IC0gKi8KIAkvKiAJCQkJCQkoKHNpemVfdCkgKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0YnVmKSAmMyk7ICovCiAKQEAgLTE0NCw5ICsxNDIsOCBAQAogCQlpZiAocmVzID09IF9GQUlMKSB7CiAJCQltc2xlZXAoMTApOwogCQkJcmVzID0gcnR3X29zX3htaXRfcmVzb3VyY2VfYWxsb2MocGFkYXB0ZXIsIHB4bWl0YnVmLCAoTUFYX1hNSVRCVUZfU1ogKyBYTUlUQlVGX0FMSUdOX1NaKSk7Ci0JCQlpZiAocmVzID09IF9GQUlMKSB7CisJCQlpZiAocmVzID09IF9GQUlMKQogCQkJCWdvdG8gZXhpdDsKLQkJCX0KIAkJfQogCiAJCXB4bWl0YnVmLT5mbGFncyA9IFhNSVRfVk9fUVVFVUU7CkBAIC0xNjgsNyArMTY1LDcgQEAKIAkJZ290byBleGl0OwogCX0KIAotCXB4bWl0cHJpdi0+cHhtaXRfZXh0YnVmID0gKHU4ICopTl9CWVRFX0FMSUdNRU5UKChzaXplX3QpKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1ZiksIDQpOworCXB4bWl0cHJpdi0+cHhtaXRfZXh0YnVmID0gUFRSX0FMSUdOKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1ZiwgNCk7CiAKIAlweG1pdGJ1ZiA9IChzdHJ1Y3QgeG1pdF9idWYgKilweG1pdHByaXYtPnB4bWl0X2V4dGJ1ZjsKIApAQCAtMTk5LDggKzE5Niw2IEBACiAKIAlweG1pdHByaXYtPnR4aXJwX2NudCA9IDE7CiAKLQlzZW1hX2luaXQoJihweG1pdHByaXYtPnR4X3JldGV2dCksIDApOwotCiAJLyogcGVyIEFDIHBlbmRpbmcgaXJwICovCiAJcHhtaXRwcml2LT5iZXFfY250ID0gMDsKIAlweG1pdHByaXYtPmJrcV9jbnQgPSAwOwpAQCAtMjUyLDkgKzI0Nyw4IEBACiAJCXB4bWl0YnVmKys7CiAJfQogCi0JaWYgKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1ZikgeworCWlmIChweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYpCiAJCXZmcmVlKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1Zik7Ci0JfQogCiAJcnR3X2ZyZWVfaHd4bWl0cyhwYWRhcHRlcik7CiAKQEAgLTQwOCw3ICs0MDIsNyBAQAogCQlfcnR3X3BrdGZpbGVfcmVhZChwcGt0ZmlsZSwgKHU4ICopJmlwX2hkciwgc2l6ZW9mKGlwX2hkcikpOwogLyogCQl1c2VyX3ByaW8gPSAobnRvaHMoaXBfaGRyLnRvcykgPj4gNSkgJiAweDM7ICovCiAJCXVzZXJfcHJpbyA9IGlwX2hkci50b3MgPj4gNTsKLQl9IGVsc2UgaWYgKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gMHg4ODhlKSB7CisJfSBlbHNlIGlmIChwYXR0cmliLT5ldGhlcl90eXBlID09IEVUSF9QX1BBRSkgewogCQkvKiAgIldoZW4gcHJpb3JpdHkgcHJvY2Vzc2luZyBvZiBkYXRhIGZyYW1lcyBpcyBzdXBwb3J0ZWQsICovCiAJCS8qICBhIFNUQSdzIFNNRSBzaG91bGQgc2VuZCBFQVBPTC1LZXkgZnJhbWVzIGF0IHRoZSBoaWdoZXN0IHByaW9yaXR5LiIgKi8KIAkJdXNlcl9wcmlvID0gNzsKQEAgLTQ1NywxNCArNDUxLDE0IEBACiAKIAlwYXR0cmliLT5wa3RsZW4gPSBwa3RmaWxlLnBrdF9sZW47CiAKLQlpZiAoRVRIX1BfSVAgPT0gcGF0dHJpYi0+ZXRoZXJfdHlwZSkgeworCWlmIChwYXR0cmliLT5ldGhlcl90eXBlID09IEVUSF9QX0lQKSB7CiAJCS8qICBUaGUgZm9sbG93aW5nIGlzIGZvciBESENQIGFuZCBBUlAgcGFja2V0LCB3ZSB1c2UgY2NrMU0gdG8gdHggdGhlc2UgcGFja2V0cyBhbmQgbGV0IExQUyBhd2FrZSBzb21lIHRpbWUgKi8KIAkJLyogIHRvIHByZXZlbnQgREhDUCBwcm90b2NvbCBmYWlsICovCiAJCXU4IHRtcFsyNF07CiAJCV9ydHdfcGt0ZmlsZV9yZWFkKCZwa3RmaWxlLCAmdG1wWzBdLCAyNCk7CiAJCXBhdHRyaWItPmRoY3BfcGt0ID0gMDsKIAkJaWYgKHBrdGZpbGUucGt0X2xlbiA+IDI4Mikgey8qIE1JTklNVU1fREhDUF9QQUNLRVRfU0laRSkgeyAqLwotCQkJaWYgKEVUSF9QX0lQID09IHBhdHRyaWItPmV0aGVyX3R5cGUpIHsvKiAgSVAgaGVhZGVyICovCisJCQlpZiAocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9JUCkgey8qICBJUCBoZWFkZXIgKi8KIAkJCQlpZiAoKCh0bXBbMjFdID09IDY4KSAmJiAodG1wWzIzXSA9PSA2NykpIHx8CiAJCQkJICAgICgodG1wWzIxXSA9PSA2NykgJiYgKHRtcFsyM10gPT0gNjgpKSkgewogCQkJCQkvKiAgNjggOiBVRFAgQk9PVFAgY2xpZW50ICovCkBAIC00NzUsMTUgKzQ2OSwxNSBAQAogCQkJCX0KIAkJCX0KIAkJfQotCX0gZWxzZSBpZiAoMHg4ODhlID09IHBhdHRyaWItPmV0aGVyX3R5cGUpIHsKKwl9IGVsc2UgaWYgKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gRVRIX1BfUEFFKSB7CiAJCURCR184OEVfTEVWRUwoX2Rydl9pbmZvXywgInNlbmQgZWFwb2wgcGFja2V0XG4iKTsKIAl9CiAKLQlpZiAoKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gMHg4ODhlKSB8fCAocGF0dHJpYi0+ZGhjcF9wa3QgPT0gMSkpCisJaWYgKChwYXR0cmliLT5ldGhlcl90eXBlID09IEVUSF9QX1BBRSkgfHwgKHBhdHRyaWItPmRoY3BfcGt0ID09IDEpKQogCQlydHdfc2V0X3NjYW5fZGVueShwYWRhcHRlciwgMzAwMCk7CiAKIAkvKiAgSWYgRUFQT0wgLCBBUlAgLCBPUiBESENQIHBhY2tldCwgZHJpdmVyIG11c3QgYmUgaW4gYWN0aXZlIG1vZGUuICovCi0JaWYgKChwYXR0cmliLT5ldGhlcl90eXBlID09IDB4MDgwNikgfHwgKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gMHg4ODhlKSB8fCAocGF0dHJpYi0+ZGhjcF9wa3QgPT0gMSkpCisJaWYgKChwYXR0cmliLT5ldGhlcl90eXBlID09IEVUSF9QX0FSUCkgfHwgKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gRVRIX1BfUEFFKSB8fCAocGF0dHJpYi0+ZGhjcF9wa3QgPT0gMSkpCiAJCXJ0d19scHNfY3RybF93a19jbWQocGFkYXB0ZXIsIExQU19DVFJMX1NQRUNJQUxfUEFDS0VULCAxKTsKIAogCWJtY2FzdCA9IElTX01DQVNUKHBhdHRyaWItPnJhKTsKQEAgLTUxNSw4ICs1MDksNiBAQAogCX0KIAogCXBhdHRyaWItPmFja19wb2xpY3kgPSAwOwotCS8qICBnZXQgZXRoZXJfaGRyX2xlbiAqLwotCXBhdHRyaWItPnBrdF9oZHJsZW4gPSBFVEhfSExFTjsvKiBwYXR0cmliLT5ldGhlcl90eXBlID09IDB4ODEwMCkgPyAoMTQgKyA0KTogMTQ7IHZsYW4gdGFnICovCiAKIAlwYXR0cmliLT5oZHJsZW4gPSBXTEFOX0hEUl9BM19MRU47CiAJcGF0dHJpYi0+c3VidHlwZSA9IFdJRklfREFUQV9UWVBFOwpAQCAtNTM5LDggKzUzMSw4IEBACiAKIAkJcGF0dHJpYi0+ZW5jcnlwdCA9IDA7CiAKLQkJaWYgKChwYXR0cmliLT5ldGhlcl90eXBlICE9IDB4ODg4ZSkgJiYgIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX01QX1NUQVRFKSkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywgKCJcbnBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID09IHRydWUsICBwYXR0cmliLT5ldGhlcl90eXBlKCUuNHgpICE9IDB4ODg4ZVxuIiwgcGF0dHJpYi0+ZXRoZXJfdHlwZSkpOworCQlpZiAoKHBhdHRyaWItPmV0aGVyX3R5cGUgIT0gRVRIX1BfUEFFKSAmJiAhY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfTVBfU1RBVEUpKSB7CisJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLCAoIlxucHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPT0gdHJ1ZSwgIHBhdHRyaWItPmV0aGVyX3R5cGUoJS40eCkgIT0gRVRIX1BfUEFFXG4iLCBwYXR0cmliLT5ldGhlcl90eXBlKSk7CiAJCQlyZXMgPSBfRkFJTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtNzY5LDEzICs3NjEsMTMgQEAKIHsKIAl1MTYgKnFjOwogCi0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICpwd2xhbmhkciA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKiloZHI7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopaGRyOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IHFvc19wcml2ICpwcW9zcHJpdiA9ICZwbWxtZXByaXYtPnFvc3ByaXY7CiAJdTggcW9zX29wdGlvbiA9IGZhbHNlOwogCiAJaW50IHJlcyA9IF9TVUNDRVNTOwotCV9fbGUxNiAqZmN0cmwgPSAmcHdsYW5oZHItPmZyYW1lX2N0bDsKKwlfX2xlMTYgKmZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jb250cm9sOwogCiAJc3RydWN0IHN0YV9pbmZvICpwc3RhOwogCkBAIC03ODUsMTEgKzc3NywxMCBAQAogCWlmIChwYXR0cmliLT5wc3RhKSB7CiAJCXBzdGEgPSBwYXR0cmliLT5wc3RhOwogCX0gZWxzZSB7Ci0JCWlmIChibWNzdCkgeworCQlpZiAoYm1jc3QpCiAJCQlwc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8ocGFkYXB0ZXIpOwotCQl9IGVsc2UgeworCQllbHNlCiAJCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvKCZwYWRhcHRlci0+c3RhcHJpdiwgcGF0dHJpYi0+cmEpOwotCQl9CiAJfQogCiAJbWVtc2V0KGhkciwgMCwgV0xBTkhEUl9PRkZTRVQpOwpAQCAtOTk5LDcgKzk5MCw3IEBACiAJfQogCiAJX3J0d19vcGVuX3BrdGZpbGUocGt0LCAmcGt0ZmlsZSk7Ci0JX3J0d19wa3RmaWxlX3JlYWQoJnBrdGZpbGUsIE5VTEwsIHBhdHRyaWItPnBrdF9oZHJsZW4pOworCV9ydHdfcGt0ZmlsZV9yZWFkKCZwa3RmaWxlLCBOVUxMLCBFVEhfSExFTik7CiAKIAlmcmdfaW54ID0gMDsKIAlmcmdfbGVuID0gcHhtaXRwcml2LT5mcmFnX2xlbiAtIDQ7LyogMjM0Ni00ID0gMjM0MiAqLwpAQCAtMTA1NCw5ICsxMDQ1LDggQEAKIAkJCW1wZHVfbGVuIC09IGxsY19zejsKIAkJfQogCi0JCWlmICgocGF0dHJpYi0+aWN2X2xlbiA+IDApICYmIChwYXR0cmliLT5ic3dlbmMpKSB7CisJCWlmICgocGF0dHJpYi0+aWN2X2xlbiA+IDApICYmIChwYXR0cmliLT5ic3dlbmMpKQogCQkJbXBkdV9sZW4gLT0gcGF0dHJpYi0+aWN2X2xlbjsKLQkJfQogCiAJCWlmIChibWNzdCkgewogCQkJLyogIGRvbid0IGRvIGZyYWdtZW50IHRvIGJyb2FkY2F0L211bHRpY2FzdCBwYWNrZXRzICovCkBAIC0xNTYwLDExICsxNTUwLDEwIEBACiAJaW50IHJlcyA9IF9TVUNDRVNTOwogCiAKLQlpZiAocGF0dHJpYi0+cHN0YSkgeworCWlmIChwYXR0cmliLT5wc3RhKQogCQlwc3RhID0gcGF0dHJpYi0+cHN0YTsKLQl9IGVsc2UgeworCWVsc2UKIAkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbyhwc3RhcHJpdiwgcGF0dHJpYi0+cmEpOwotCX0KIAogCWlmIChwc3RhID09IE5VTEwpIHsKIAkJcmVzID0gX0ZBSUw7CkBAIC0xNjU4LDE2ICsxNjQ3LDYgQEAKIAlyZXR1cm4gYWRkcjsKIH0KIAotc3RhdGljIHZvaWQgZG9fcXVldWVfc2VsZWN0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIpCi17Ci0JdTggcXNlbDsKLQotCXFzZWwgPSBwYXR0cmliLT5wcmlvcml0eTsKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywgKCIjIyMgZG9fcXVldWVfc2VsZWN0IHByaW9yaXR5PSVkICwgcXNlbCA9ICVkXG4iLCBwYXR0cmliLT5wcmlvcml0eSwgcXNlbCkpOwotCi0JcGF0dHJpYi0+cXNlbCA9IHFzZWw7Ci19Ci0KIC8qCiAgKiBUaGUgbWFpbiB0cmFuc21pdCh0eCkgZW50cnkKICAqCkBAIC0xNzAwLDcgKzE2NzksNyBAQAogCiAJcnR3X2xlZF9jb250cm9sKHBhZGFwdGVyLCBMRURfQ1RMX1RYKTsKIAotCWRvX3F1ZXVlX3NlbGVjdChwYWRhcHRlciwgJnB4bWl0ZnJhbWUtPmF0dHJpYik7CisJcHhtaXRmcmFtZS0+YXR0cmliLnFzZWwgPSBweG1pdGZyYW1lLT5hdHRyaWIucHJpb3JpdHk7CiAKICNpZmRlZiBDT05GSUdfODhFVV9BUF9NT0RFCiAJc3Bpbl9sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvYmJfY2ZnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9iYl9jZmcuYwppbmRleCBjY2UxZWEyLi4xMzRmYTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9iYl9jZmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9iYl9jZmcuYwpAQCAtNDk4LDcgKzQ5OCw3IEBACiBzdGF0aWMgdm9pZCBzdG9yZV9wd3JpbmRleF9vZmZzZXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkJICB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2ssIHUzMiBkYXRhKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IGFkYXB0ZXItPkhhbERhdGE7CiAJdTMyICogY29uc3QgcG93ZXJfbGV2ZWxfb2Zmc2V0ID0KIAkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2hhbF9kYXRhLT5wd3JHcm91cENudF07CiAKQEAgLTUxOCw4ICs1MTgsNyBAQAogCQlwb3dlcl9sZXZlbF9vZmZzZXRbNF0gPSBkYXRhOwogCWlmIChyZWdhZGRyID09IHJUeEFHQ19BX01jczE1X01jczEyKSB7CiAJCXBvd2VyX2xldmVsX29mZnNldFs1XSA9IGRhdGE7Ci0JCWlmIChoYWxfZGF0YS0+cmZfdHlwZSA9PSBSRl8xVDFSKQotCQkJaGFsX2RhdGEtPnB3ckdyb3VwQ250Kys7CisJCWhhbF9kYXRhLT5wd3JHcm91cENudCsrOwogCX0KIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQl9SYXRlMThfMDYpCiAJCXBvd2VyX2xldmVsX29mZnNldFs4XSA9IGRhdGE7CkBAIC01MzcsOCArNTM2LDYgQEAKIAkJcG93ZXJfbGV2ZWxfb2Zmc2V0WzEyXSA9IGRhdGE7CiAJaWYgKHJlZ2FkZHIgPT0gclR4QUdDX0JfTWNzMTVfTWNzMTIpIHsKIAkJcG93ZXJfbGV2ZWxfb2Zmc2V0WzEzXSA9IGRhdGE7Ci0JCWlmIChoYWxfZGF0YS0+cmZfdHlwZSAhPSBSRl8xVDFSKQotCQkJaGFsX2RhdGEtPnB3ckdyb3VwQ250Kys7CiAJfQogfQogCkBAIC01ODgsMTEgKzU4NSwxMCBAQAogCiBzdGF0aWMgdm9pZCBydGw4OGVfcGh5X2luaXRfYmJfcmZfcmVnaXN0ZXJfZGVmaW5pdGlvbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJCSpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdGVyKTsKIAlzdHJ1Y3QgYmJfcmVnX2RlZiAgICAgICAgICAgICAgICpyZWdbNF07CiAKLQlyZWdbUkZfUEFUSF9BXSA9ICZoYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV07Ci0JcmVnW1JGX1BBVEhfQl0gPSAmaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdOworCXJlZ1tSRl9QQVRIX0FdID0gJmFkYXB0ZXItPkhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdOworCXJlZ1tSRl9QQVRIX0JdID0gJmFkYXB0ZXItPkhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdOwogCiAJcmVnW1JGX1BBVEhfQV0tPnJmaW50ZnMgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1c7CiAJcmVnW1JGX1BBVEhfQl0tPnJmaW50ZnMgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1c7CkBAIC02NTIsMTMgKzY0OCwxMiBAQAogc3RhdGljIGJvb2wgY29uZmlnX3BhcmFmaWxlKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKIHsKIAlzdHJ1Y3QgZWVwcm9tX3ByaXYgKmVlcHJvbSA9IEdFVF9FRVBST01fRUZVU0VfUFJJVihhZGFwdCk7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CiAKIAlzZXRfYmFzZWJhbmRfcGh5X2NvbmZpZyhhZGFwdCk7CiAKIAkvKiBJZiBFRVBST00gb3IgRUZVU0UgYXV0b2xvYWQgT0ssIFdlIG11c3QgY29uZmlnIGJ5IFBIWV9SRUdfUEcudHh0ICovCiAJaWYgKCFlZXByb20tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpIHsKLQkJaGFsX2RhdGEtPnB3ckdyb3VwQ250ID0gMDsKKwkJYWRhcHQtPkhhbERhdGEtPnB3ckdyb3VwQ250ID0gMDsKIAkJY29uZmlnX2JiX3dpdGhfcGdoZWFkZXIoYWRhcHQpOwogCX0KIAlzZXRfYmFzZWJhbmRfYWdjX2NvbmZpZyhhZGFwdCk7CkBAIC02NjgsNyArNjYzLDYgQEAKIGJvb2wgcnRsODhldV9waHlfYmJfY29uZmlnKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKIHsKIAlpbnQgcnRzdGF0dXMgPSB0cnVlOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwogCXUzMiByZWd2YWw7CiAJdTggY3J5c3RhbF9jYXA7CiAKQEAgLTY4OCw3ICs2ODIsNyBAQAogCXJ0c3RhdHVzID0gY29uZmlnX3BhcmFmaWxlKGFkYXB0KTsKIAogCS8qICB3cml0ZSAweDI0WzE2OjExXSA9IDB4MjRbMjI6MTddID0gY3J5c3RhbF9jYXAgKi8KLQljcnlzdGFsX2NhcCA9IGhhbF9kYXRhLT5DcnlzdGFsQ2FwICYgMHgzRjsKKwljcnlzdGFsX2NhcCA9IGFkYXB0LT5IYWxEYXRhLT5DcnlzdGFsQ2FwICYgMHgzRjsKIAlwaHlfc2V0X2JiX3JlZyhhZGFwdCwgUkVHX0FGRV9YVEFMX0NUUkwsIDB4N2ZmODAwLAogCQkgICAgICAgKGNyeXN0YWxfY2FwIHwgKGNyeXN0YWxfY2FwIDw8IDYpKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2hhbF9pbnRmLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9oYWxfaW50Zi5jCmluZGV4IDA4NWYwZmIuLmExMWM3YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2hhbF9pbnRmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvaGFsX2ludGYuYwpAQCAtMTcsNjIgKzE3LDYgQEAKICNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+CiAjaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+CiAjaW5jbHVkZSA8aGFsX2ludGYuaD4KLSNpbmNsdWRlIDx1c2JfaGFsLmg+Ci0KLXZvaWQgcnR3X2hhbF9jaGlwX2NvbmZpZ3VyZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLmludGZfY2hpcF9jb25maWd1cmUpCi0JCWFkYXB0LT5IYWxGdW5jLmludGZfY2hpcF9jb25maWd1cmUoYWRhcHQpOwotfQotCi12b2lkIHJ0d19oYWxfcmVhZF9jaGlwX2luZm8oc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5yZWFkX2FkYXB0ZXJfaW5mbykKLQkJYWRhcHQtPkhhbEZ1bmMucmVhZF9hZGFwdGVyX2luZm8oYWRhcHQpOwotfQotCi12b2lkIHJ0d19oYWxfcmVhZF9jaGlwX3ZlcnNpb24oc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5yZWFkX2NoaXBfdmVyc2lvbikKLQkJYWRhcHQtPkhhbEZ1bmMucmVhZF9jaGlwX3ZlcnNpb24oYWRhcHQpOwotfQotCi12b2lkIHJ0d19oYWxfZGVmX3ZhbHVlX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5pbml0X2RlZmF1bHRfdmFsdWUpCi0JCWFkYXB0LT5IYWxGdW5jLmluaXRfZGVmYXVsdF92YWx1ZShhZGFwdCk7Ci19Ci0KLXZvaWQgcnR3X2hhbF9mcmVlX2RhdGEoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5mcmVlX2hhbF9kYXRhKQotCQlhZGFwdC0+SGFsRnVuYy5mcmVlX2hhbF9kYXRhKGFkYXB0KTsKLX0KLQotdm9pZCBydHdfaGFsX2RtX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5kbV9pbml0KQotCQlhZGFwdC0+SGFsRnVuYy5kbV9pbml0KGFkYXB0KTsKLX0KLQotdm9pZCBydHdfaGFsX3N3X2xlZF9pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwdCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuSW5pdFN3TGVkcykKLQkJYWRhcHQtPkhhbEZ1bmMuSW5pdFN3TGVkcyhhZGFwdCk7Ci19Ci0KLXZvaWQgcnR3X2hhbF9zd19sZWRfZGVpbml0KHN0cnVjdCBhZGFwdGVyICphZGFwdCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuRGVJbml0U3dMZWRzKQotCQlhZGFwdC0+SGFsRnVuYy5EZUluaXRTd0xlZHMoYWRhcHQpOwotfQotCi11MzIgcnR3X2hhbF9wb3dlcl9vbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLmhhbF9wb3dlcl9vbikKLQkJcmV0dXJuIGFkYXB0LT5IYWxGdW5jLmhhbF9wb3dlcl9vbihhZGFwdCk7Ci0JcmV0dXJuIF9GQUlMOwotfQogCiB1aW50CSBydHdfaGFsX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQogewpAQCAtODAsMTUgKzI0LDEzIEBACiAKIAlhZGFwdC0+aHdfaW5pdF9jb21wbGV0ZWQgPSBmYWxzZTsKIAotCXN0YXR1cyA9IGFkYXB0LT5IYWxGdW5jLmhhbF9pbml0KGFkYXB0KTsKKwlzdGF0dXMgPSBydGw4MTg4ZXVfaGFsX2luaXQoYWRhcHQpOwogCiAJaWYgKHN0YXR1cyA9PSBfU1VDQ0VTUykgewogCQlhZGFwdC0+aHdfaW5pdF9jb21wbGV0ZWQgPSB0cnVlOwogCiAJCWlmIChhZGFwdC0+cmVnaXN0cnlwcml2Lm5vdGNoX2ZpbHRlciA9PSAxKQogCQkJcnR3X2hhbF9ub3RjaF9maWx0ZXIoYWRhcHQsIDEpOwotCi0JCXJ0d19oYWxfcmVzZXRfc2VjdXJpdHlfZW5naW5lKGFkYXB0KTsKIAl9IGVsc2UgewogCQlhZGFwdC0+aHdfaW5pdF9jb21wbGV0ZWQgPSBmYWxzZTsKIAkJREJHXzg4RSgicnR3X2hhbF9pbml0OiBoYWxfX2luaXQgZmFpbFxuIik7CkBAIC0xMDQsNyArNDYsNyBAQAogewogCXVpbnQJc3RhdHVzID0gX1NVQ0NFU1M7CiAKLQlzdGF0dXMgPSBhZGFwdC0+SGFsRnVuYy5oYWxfZGVpbml0KGFkYXB0KTsKKwlzdGF0dXMgPSBydGw4MTg4ZXVfaGFsX2RlaW5pdChhZGFwdCk7CiAKIAlpZiAoc3RhdHVzID09IF9TVUNDRVNTKQogCQlhZGFwdC0+aHdfaW5pdF9jb21wbGV0ZWQgPSBmYWxzZTsKQEAgLTExNCw5MiArNTYsNiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgcnR3X2hhbF9zZXRfaHdyZWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1OCB2YXJpYWJsZSwgdTggKnZhbCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuU2V0SHdSZWdIYW5kbGVyKQotCQlhZGFwdC0+SGFsRnVuYy5TZXRId1JlZ0hhbmRsZXIoYWRhcHQsIHZhcmlhYmxlLCB2YWwpOwotfQotCi12b2lkIHJ0d19oYWxfZ2V0X2h3cmVnKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggdmFyaWFibGUsIHU4ICp2YWwpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLkdldEh3UmVnSGFuZGxlcikKLQkJYWRhcHQtPkhhbEZ1bmMuR2V0SHdSZWdIYW5kbGVyKGFkYXB0LCB2YXJpYWJsZSwgdmFsKTsKLX0KLQotdTggcnR3X2hhbF9nZXRfZGVmX3ZhcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsCi0JCSAgICAgICBlbnVtIGhhbF9kZWZfdmFyaWFibGUgdmFyLCB2b2lkICp2YWwpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLkdldEhhbERlZlZhckhhbmRsZXIpCi0JCXJldHVybiBhZGFwdC0+SGFsRnVuYy5HZXRIYWxEZWZWYXJIYW5kbGVyKGFkYXB0LCB2YXIsIHZhbCk7Ci0JcmV0dXJuIF9GQUlMOwotfQotCi12b2lkIHJ0d19oYWxfc2V0X29kbV92YXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LAotCQkJIGVudW0gaGFsX29kbV92YXJpYWJsZSB2YXIsIHZvaWQgKnZhbDEsCi0JCQkgYm9vbCBzZXQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLlNldEhhbE9ETVZhckhhbmRsZXIpCi0JCWFkYXB0LT5IYWxGdW5jLlNldEhhbE9ETVZhckhhbmRsZXIoYWRhcHQsIHZhciwKLQkJCQkJCSAgICAgIHZhbDEsIHNldCk7Ci19Ci0KLXUzMiBydHdfaGFsX2luaXJwX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCXUzMiByc3QgPSBfRkFJTDsKLQotCWlmIChhZGFwdC0+SGFsRnVuYy5pbmlycF9pbml0KQotCQlyc3QgPSBhZGFwdC0+SGFsRnVuYy5pbmlycF9pbml0KGFkYXB0KTsKLQllbHNlCi0JCURCR184OEUoIiAlcyBIYWxGdW5jLmluaXJwX2luaXQgaXMgTlVMTCEhIVxuIiwgX19mdW5jX18pOwotCXJldHVybiByc3Q7Ci19Ci0KLXUzMiBydHdfaGFsX2luaXJwX2RlaW5pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLmluaXJwX2RlaW5pdCkKLQkJcmV0dXJuIGFkYXB0LT5IYWxGdW5jLmluaXJwX2RlaW5pdChhZGFwdCk7Ci0KLQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLXMzMiBydHdfaGFsX3htaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuaGFsX3htaXQpCi0JCXJldHVybiBhZGFwdC0+SGFsRnVuYy5oYWxfeG1pdChhZGFwdCwgcHhtaXRmcmFtZSk7Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXMzMiBydHdfaGFsX21nbnRfeG1pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lKQotewotCXMzMiByZXQgPSBfRkFJTDsKLQotCWlmIChhZGFwdC0+SGFsRnVuYy5tZ250X3htaXQpCi0JCXJldCA9IGFkYXB0LT5IYWxGdW5jLm1nbnRfeG1pdChhZGFwdCwgcG1nbnRmcmFtZSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotczMyIHJ0d19oYWxfaW5pdF94bWl0X3ByaXYoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5pbml0X3htaXRfcHJpdikKLQkJcmV0dXJuIGFkYXB0LT5IYWxGdW5jLmluaXRfeG1pdF9wcml2KGFkYXB0KTsKLQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLXMzMiBydHdfaGFsX2luaXRfcmVjdl9wcml2KHN0cnVjdCBhZGFwdGVyICphZGFwdCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuaW5pdF9yZWN2X3ByaXYpCi0JCXJldHVybiBhZGFwdC0+SGFsRnVuYy5pbml0X3JlY3ZfcHJpdihhZGFwdCk7Ci0KLQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLXZvaWQgcnR3X2hhbF9mcmVlX3JlY3ZfcHJpdihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLmZyZWVfcmVjdl9wcml2KQotCQlhZGFwdC0+SGFsRnVuYy5mcmVlX3JlY3ZfcHJpdihhZGFwdCk7Ci19Ci0KIHZvaWQgcnR3X2hhbF91cGRhdGVfcmFfbWFzayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHUzMiBtYWNfaWQsIHU4IHJzc2lfbGV2ZWwpCiB7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJihhZGFwdC0+bWxtZXByaXYpOwpAQCAtMjE1LDg2ICs3MSw2IEBACiAJCQlhZGRfUkFUaWQoYWRhcHQsIHBzdGEsIDApOy8qIHRvZG86IGJhc2VkIG9uIHJzc2lfbGV2ZWwqLwogI2VuZGlmCiAJfSBlbHNlIHsKLQkJaWYgKGFkYXB0LT5IYWxGdW5jLlVwZGF0ZVJBTWFza0hhbmRsZXIpCi0JCQlhZGFwdC0+SGFsRnVuYy5VcGRhdGVSQU1hc2tIYW5kbGVyKGFkYXB0LCBtYWNfaWQsCi0JCQkJCQkJICAgICAgcnNzaV9sZXZlbCk7CisJCVVwZGF0ZUhhbFJBTWFzazgxODhFVXNiKGFkYXB0LCBtYWNfaWQsIHJzc2lfbGV2ZWwpOwogCX0KIH0KLQotdm9pZCBydHdfaGFsX2FkZF9yYV90aWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1MzIgYml0bWFwLCB1OCBhcmcsCi0JCQl1OCByc3NpX2xldmVsKQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5BZGRfUmF0ZUFUaWQpCi0JCWFkYXB0LT5IYWxGdW5jLkFkZF9SYXRlQVRpZChhZGFwdCwgYml0bWFwLCBhcmcsCi0JCQkJCSAgICAgICByc3NpX2xldmVsKTsKLX0KLQotdTMyIHJ0d19oYWxfcmVhZF9yZnJlZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIGVudW0gcmZfcmFkaW9fcGF0aCByZnBhdGgsCi0JCSAgICAgICB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2spCi17Ci0JdTMyIGRhdGEgPSAwOwotCi0JaWYgKGFkYXB0LT5IYWxGdW5jLnJlYWRfcmZyZWcpCi0JCWRhdGEgPSBhZGFwdC0+SGFsRnVuYy5yZWFkX3JmcmVnKGFkYXB0LCByZnBhdGgsIHJlZ2FkZHIsCi0JCQkJCQkgICAgYml0bWFzayk7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLXZvaWQgcnR3X2hhbF9zZXRfYndtb2RlKHN0cnVjdCBhZGFwdGVyICphZGFwdCwKLQkJCWVudW0gaHRfY2hhbm5lbF93aWR0aCBiYW5kd2lkdGgsIHU4IG9mZnNldCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuc2V0X2J3bW9kZV9oYW5kbGVyKQotCQlhZGFwdC0+SGFsRnVuYy5zZXRfYndtb2RlX2hhbmRsZXIoYWRhcHQsIGJhbmR3aWR0aCwKLQkJCQkJCSAgICAgb2Zmc2V0KTsKLX0KLQotdm9pZCBydHdfaGFsX3NldF9jaGFuKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggY2hhbm5lbCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuc2V0X2NoYW5uZWxfaGFuZGxlcikKLQkJYWRhcHQtPkhhbEZ1bmMuc2V0X2NoYW5uZWxfaGFuZGxlcihhZGFwdCwgY2hhbm5lbCk7Ci19Ci0KLXZvaWQgcnR3X2hhbF9kbV93YXRjaGRvZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLmhhbF9kbV93YXRjaGRvZykKLQkJYWRhcHQtPkhhbEZ1bmMuaGFsX2RtX3dhdGNoZG9nKGFkYXB0KTsKLX0KLQotdm9pZCBydHdfaGFsX2Jjbl9yZWxhdGVkX3JlZ19zZXR0aW5nKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuU2V0QmVhY29uUmVsYXRlZFJlZ2lzdGVyc0hhbmRsZXIpCi0JCWFkYXB0LT5IYWxGdW5jLlNldEJlYWNvblJlbGF0ZWRSZWdpc3RlcnNIYW5kbGVyKGFkYXB0KTsKLX0KLQotdTggcnR3X2hhbF9hbnRkaXZfYmVmb3JlX2xpbmtlZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLkFudERpdkJlZm9yZUxpbmtIYW5kbGVyKQotCQlyZXR1cm4gYWRhcHQtPkhhbEZ1bmMuQW50RGl2QmVmb3JlTGlua0hhbmRsZXIoYWRhcHQpOwotCXJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBydHdfaGFsX2FudGRpdl9yc3NpX2NvbXBhcmVkKHN0cnVjdCBhZGFwdGVyICphZGFwdCwKLQkJCQkgIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpkc3QsCi0JCQkJICBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqc3JjKQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5BbnREaXZDb21wYXJlSGFuZGxlcikKLQkJYWRhcHQtPkhhbEZ1bmMuQW50RGl2Q29tcGFyZUhhbmRsZXIoYWRhcHQsIGRzdCwgc3JjKTsKLX0KLQotdm9pZCBydHdfaGFsX3NyZXNldF9pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwdCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuc3Jlc2V0X2luaXRfdmFsdWUpCi0JCWFkYXB0LT5IYWxGdW5jLnNyZXNldF9pbml0X3ZhbHVlKGFkYXB0KTsKLX0KLQotdm9pZCBydHdfaGFsX25vdGNoX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgYm9vbCBlbmFibGUpCi17Ci0JaWYgKGFkYXB0ZXItPkhhbEZ1bmMuaGFsX25vdGNoX2ZpbHRlcikKLQkJYWRhcHRlci0+SGFsRnVuYy5oYWxfbm90Y2hfZmlsdGVyKGFkYXB0ZXIsIGVuYWJsZSk7Ci19Ci0KLXZvaWQgcnR3X2hhbF9yZXNldF9zZWN1cml0eV9lbmdpbmUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaWYgKGFkYXB0ZXItPkhhbEZ1bmMuaGFsX3Jlc2V0X3NlY3VyaXR5X2VuZ2luZSkKLQkJYWRhcHRlci0+SGFsRnVuYy5oYWxfcmVzZXRfc2VjdXJpdHlfZW5naW5lKGFkYXB0ZXIpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG0uYwppbmRleCA1N2ExMjc1Li5kOTgzYTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG0uYwpAQCAtMjI2LDE1MCArMjI2LDYgQEAKIAlvZG1fRWRjYVR1cmJvQ2hlY2socERNX09kbSk7CiB9CiAKLS8qICBJbml0IC8uLiBGaXhlZCBIVyB2YWx1ZS4gT25seSBpbml0IHRpbWUuICovCi12b2lkIE9ETV9DbW5JbmZvSW5pdChzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgZW51bSBvZG1fY29tbW9uX2luZm9fZGVmIENtbkluZm8sIHUzMiBWYWx1ZSkKLXsKLQkvKiAgVGhpcyBzZWN0aW9uIGlzIHVzZWQgZm9yIGluaXQgdmFsdWUgKi8KLQlzd2l0Y2gJKENtbkluZm8pIHsKLQkvKiAgRml4ZWQgT0RNIHZhbHVlLiAqLwotCWNhc2UJT0RNX0NNTklORk9fQUJJTElUWToKLQkJcERNX09kbS0+U3VwcG9ydEFiaWxpdHkgPSAodTMyKVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1BMQVRGT1JNOgotCQlwRE1fT2RtLT5TdXBwb3J0UGxhdGZvcm0gPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fSU5URVJGQUNFOgotCQlwRE1fT2RtLT5TdXBwb3J0SW50ZXJmYWNlID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX01QX1RFU1RfQ0hJUDoKLQkJcERNX09kbS0+YklzTVBDaGlwID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0lDX1RZUEU6Ci0JCXBETV9PZG0tPlN1cHBvcnRJQ1R5cGUgPSBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19DVVRfVkVSOgotCQlwRE1fT2RtLT5DdXRWZXJzaW9uID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1JGX1RZUEU6Ci0JCXBETV9PZG0tPlJGVHlwZSA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSAgICBPRE1fQ01OSU5GT19SRl9BTlRFTk5BX1RZUEU6Ci0JCXBETV9PZG0tPkFudERpdlR5cGUgPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fQk9BUkRfVFlQRToKLQkJcERNX09kbS0+Qm9hcmRUeXBlID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0VYVF9MTkE6Ci0JCXBETV9PZG0tPkV4dExOQSA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19FWFRfUEE6Ci0JCXBETV9PZG0tPkV4dFBBID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0VYVF9UUlNXOgotCQlwRE1fT2RtLT5FeHRUUlNXID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1BBVENIX0lEOgotCQlwRE1fT2RtLT5QYXRjaElEID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0JJTkhDVF9URVNUOgotCQlwRE1fT2RtLT5iSW5IY3RUZXN0ID0gKGJvb2wpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fQldJRklfVEVTVDoKLQkJcERNX09kbS0+YldJRklUZXN0ID0gKGJvb2wpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fU01BUlRfQ09OQ1VSUkVOVDoKLQkJcERNX09kbS0+YkR1YWxNYWNTbWFydENvbmN1cnJlbnQgPSAoYm9vbClWYWx1ZTsKLQkJYnJlYWs7Ci0JLyogVG8gcmVtb3ZlIHRoZSBjb21waWxlciB3YXJuaW5nLCBtdXN0IGFkZCBhbiBlbXB0eSBkZWZhdWx0IHN0YXRlbWVudCB0byBoYW5kbGUgdGhlIG90aGVyIHZhbHVlcy4gKi8KLQlkZWZhdWx0OgotCQkvKiBkbyBub3RoaW5nICovCi0JCWJyZWFrOwotCX0KLQotCS8qICBUeCBwb3dlciB0cmFja2luZyBCQiBzd2luZyB0YWJsZS4gKi8KLQkvKiAgVGhlIGJhc2UgaW5kZXggPSAxMi4gKygoMTItbikvMilkQiAxM34/PyA9IGRlY3JlYXNlIHR4IHB3ciBieSAtKChuLTEyKS8yKWRCICovCi0JcERNX09kbS0+QmJTd2luZ0lkeE9mZG0JCQk9IDEyOyAvKiAgU2V0IGRlZmFsdXQgdmFsdWUgYXMgaW5kZXggMTIuICovCi0JcERNX09kbS0+QmJTd2luZ0lkeE9mZG1DdXJyZW50CT0gMTI7Ci0JcERNX09kbS0+QmJTd2luZ0ZsYWdPZmRtCQk9IGZhbHNlOwotfQotCi12b2lkIE9ETV9DbW5JbmZvSG9vayhzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgZW51bSBvZG1fY29tbW9uX2luZm9fZGVmIENtbkluZm8sIHZvaWQgKnBWYWx1ZSkKLXsKLQkvKiAgKi8KLQkvKiAgSG9vayBjYWxsIGJ5IHJlZmVyZW5jZSBwb2ludGVyLiAqLwotCS8qICAqLwotCXN3aXRjaAkoQ21uSW5mbykgewotCS8qICBEeW5hbWljIGNhbGwgYnkgcmVmZXJlbmNlIHBvaW50ZXIuICovCi0JY2FzZQlPRE1fQ01OSU5GT19NQUNfUEhZX01PREU6Ci0JCXBETV9PZG0tPnBNYWNQaHlNb2RlID0gKHU4ICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1RYX1VOSToKLQkJcERNX09kbS0+cE51bVR4Qnl0ZXNVbmljYXN0ID0gKHU2NCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19SWF9VTkk6Ci0JCXBETV9PZG0tPnBOdW1SeEJ5dGVzVW5pY2FzdCA9ICh1NjQgKilwVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fV01fTU9ERToKLQkJcERNX09kbS0+cFdpcmVsZXNzTW9kZSA9ICh1OCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19CQU5EOgotCQlwRE1fT2RtLT5wQmFuZFR5cGUgPSAodTggKilwVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fU0VDX0NITkxfT0ZGU0VUOgotCQlwRE1fT2RtLT5wU2VjQ2hPZmZzZXQgPSAodTggKilwVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fU0VDX01PREU6Ci0JCXBETV9PZG0tPnBTZWN1cml0eSA9ICh1OCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19CVzoKLQkJcERNX09kbS0+cEJhbmRXaWR0aCA9ICh1OCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19DSE5MOgotCQlwRE1fT2RtLT5wQ2hhbm5lbCA9ICh1OCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19ETVNQX0dFVF9WQUxVRToKLQkJcERNX09kbS0+cGJHZXRWYWx1ZUZyb21PdGhlck1hYyA9IChib29sICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0JVRERZX0FEQVBUT1I6Ci0JCXBETV9PZG0tPnBCdWRkeUFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKiopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0RNU1BfSVNfTUFTVEVSOgotCQlwRE1fT2RtLT5wYk1hc3Rlck9mRE1TUCA9IChib29sICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1NDQU46Ci0JCXBETV9PZG0tPnBiU2NhbkluUHJvY2VzcyA9IChib29sICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1BPV0VSX1NBVklORzoKLQkJcERNX09kbS0+cGJQb3dlclNhdmluZyA9IChib29sICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX09ORV9QQVRIX0NDQToKLQkJcERNX09kbS0+cE9uZVBhdGhDQ0EgPSAodTggKilwVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fRFJWX1NUT1A6Ci0JCXBETV9PZG0tPnBiRHJpdmVyU3RvcHBlZCA9ICAoYm9vbCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19QTlBfSU46Ci0JCXBETV9PZG0tPnBiRHJpdmVySXNHb2luZ1RvUG5wU2V0UG93ZXJTbGVlcCA9ICAoYm9vbCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19JTklUX09OOgotCQlwRE1fT2RtLT5waW5pdF9hZHB0X2luX3Byb2dyZXNzID0gIChib29sICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0FOVF9URVNUOgotCQlwRE1fT2RtLT5wQW50ZW5uYVRlc3QgPSAgKHU4ICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX05FVF9DTE9TRUQ6Ci0JCXBETV9PZG0tPnBiTmV0X2Nsb3NlZCA9IChib29sICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlICAgIE9ETV9DTU5JTkZPX01QX01PREU6Ci0JCXBETV9PZG0tPm1wX21vZGUgPSAodTggKilwVmFsdWU7Ci0JCWJyZWFrOwotCS8qIFRvIHJlbW92ZSB0aGUgY29tcGlsZXIgd2FybmluZywgbXVzdCBhZGQgYW4gZW1wdHkgZGVmYXVsdCBzdGF0ZW1lbnQgdG8gaGFuZGxlIHRoZSBvdGhlciB2YWx1ZXMuICovCi0JZGVmYXVsdDoKLQkJLyogZG8gbm90aGluZyAqLwotCQlicmVhazsKLQl9Ci19Ci0KIHZvaWQgT0RNX0NtbkluZm9QdHJBcnJheUhvb2soc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIGVudW0gb2RtX2NvbW1vbl9pbmZvX2RlZiBDbW5JbmZvLCB1MTYgSW5kZXgsIHZvaWQgKnBWYWx1ZSkKIHsKIAkvKiAgSG9vayBjYWxsIGJ5IHJlZmVyZW5jZSBwb2ludGVyLiAqLwpAQCAtMzg1LDQ2ICsyNDEsNiBAQAogCX0KIH0KIAotLyogIFVwZGF0ZSBCYW5kL0NIYW5uZWwvLi4gVGhlIHZhbHVlcyBhcmUgZHluYW1pYyBidXQgbm9uLXBlci1wYWNrZXQuICovCi12b2lkIE9ETV9DbW5JbmZvVXBkYXRlKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB1MzIgQ21uSW5mbywgdTY0IFZhbHVlKQotewotCS8qICAqLwotCS8qICBUaGlzIGluaXQgdmFyaWFibGUgbWF5IGJlIGNoYW5nZWQgaW4gcnVuIHRpbWUuICovCi0JLyogICovCi0Jc3dpdGNoCShDbW5JbmZvKSB7Ci0JY2FzZQlPRE1fQ01OSU5GT19BQklMSVRZOgotCQlwRE1fT2RtLT5TdXBwb3J0QWJpbGl0eSA9ICh1MzIpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fUkZfVFlQRToKLQkJcERNX09kbS0+UkZUeXBlID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1dJRklfRElSRUNUOgotCQlwRE1fT2RtLT5iV0lGSV9EaXJlY3QgPSAoYm9vbClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19XSUZJX0RJU1BMQVk6Ci0JCXBETV9PZG0tPmJXSUZJX0Rpc3BsYXkgPSAoYm9vbClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19MSU5LOgotCQlwRE1fT2RtLT5iTGlua2VkID0gKGJvb2wpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fUlNTSV9NSU46Ci0JCXBETV9PZG0tPlJTU0lfTWluID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0RCR19DT01QOgotCQlwRE1fT2RtLT5EZWJ1Z0NvbXBvbmVudHMgPSBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19EQkdfTEVWRUw6Ci0JCXBETV9PZG0tPkRlYnVnTGV2ZWwgPSAodTMyKVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1JBX1RIUkVTSE9MRF9ISUdIOgotCQlwRE1fT2RtLT5SYXRlQWRhcHRpdmUuSGlnaFJTU0lUaHJlc2ggPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fUkFfVEhSRVNIT0xEX0xPVzoKLQkJcERNX09kbS0+UmF0ZUFkYXB0aXZlLkxvd1JTU0lUaHJlc2ggPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCX0KLX0KLQogdm9pZCBvZG1fQ29tbW9uSW5mb1NlbGZJbml0KHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtKQogewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKQEAgLTQ2OSw3ICsyODUsNiBAQAogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJTdXBwb3J0SW50ZXJmYWNlPSVkXG4iLCBwRE1fT2RtLT5TdXBwb3J0SW50ZXJmYWNlKSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIlN1cHBvcnRJQ1R5cGU9MHgleFxuIiwgcERNX09kbS0+U3VwcG9ydElDVHlwZSkpOwogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJDdXRWZXJzaW9uPSVkXG4iLCBwRE1fT2RtLT5DdXRWZXJzaW9uKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIlJGVHlwZT0lZFxuIiwgcERNX09kbS0+UkZUeXBlKSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIkJvYXJkVHlwZT0lZFxuIiwgcERNX09kbS0+Qm9hcmRUeXBlKSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIkV4dExOQT0lZFxuIiwgcERNX09kbS0+RXh0TE5BKSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIkV4dFBBPSVkXG4iLCBwRE1fT2RtLT5FeHRQQSkpOwpAQCAtOTQ3LDM3ICs3NjIsMjEgQEAKIAkJYnJlYWs7CiAJY2FzZSAoT0RNX1dNX0J8T0RNX1dNX0d8T0RNX1dNX04yNEcpOgogCWNhc2UgKE9ETV9XTV9BfE9ETV9XTV9CfE9ETV9XTV9HfE9ETV9XTV9OMjRHKToKLQkJaWYgKHBETV9PZG0tPlJGVHlwZSA9PSBPRE1fMVQyUiB8fCBwRE1fT2RtLT5SRlR5cGUgPT0gT0RNXzFUMVIpIHsKLQkJCWlmIChyc3NpX2xldmVsID09IERNX1JBVFJfU1RBX0hJR0gpIHsKLQkJCQlyYXRlX2JpdG1hcCA9IDB4MDAwZjAwMDA7Ci0JCQl9IGVsc2UgaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfTUlERExFKSB7Ci0JCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGZmMDAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoKihwRE1fT2RtLT5wQmFuZFdpZHRoKSA9PSBPRE1fQlc0ME0pCi0JCQkJCXJhdGVfYml0bWFwID0gMHgwMDBmZjAxNTsKLQkJCQllbHNlCi0JCQkJCXJhdGVfYml0bWFwID0gMHgwMDBmZjAwNTsKLQkJCX0KKwkJaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfSElHSCkgeworCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGYwMDAwOworCQl9IGVsc2UgaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfTUlERExFKSB7CisJCQlyYXRlX2JpdG1hcCA9IDB4MDAwZmYwMDA7CiAJCX0gZWxzZSB7Ci0JCQlpZiAocnNzaV9sZXZlbCA9PSBETV9SQVRSX1NUQV9ISUdIKSB7Ci0JCQkJcmF0ZV9iaXRtYXAgPSAweDBmOGYwMDAwOwotCQkJfSBlbHNlIGlmIChyc3NpX2xldmVsID09IERNX1JBVFJfU1RBX01JRERMRSkgewotCQkJCXJhdGVfYml0bWFwID0gMHgwZjhmZjAwMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCoocERNX09kbS0+cEJhbmRXaWR0aCkgPT0gT0RNX0JXNDBNKQotCQkJCQlyYXRlX2JpdG1hcCA9IDB4MGY4ZmYwMTU7Ci0JCQkJZWxzZQotCQkJCQlyYXRlX2JpdG1hcCA9IDB4MGY4ZmYwMDU7Ci0JCQl9CisJCQlpZiAoKihwRE1fT2RtLT5wQmFuZFdpZHRoKSA9PSBPRE1fQlc0ME0pCisJCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGZmMDE1OworCQkJZWxzZQorCQkJCXJhdGVfYml0bWFwID0gMHgwMDBmZjAwNTsKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiBjYXNlIFdJUkVMRVNTXzExXzI0TjogKi8KIAkJLyogY2FzZSBXSVJFTEVTU18xMV81TjogKi8KLQkJaWYgKHBETV9PZG0tPlJGVHlwZSA9PSBSRl8xVDJSKQotCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGZmZmZmOwotCQllbHNlCi0JCQlyYXRlX2JpdG1hcCA9IDB4MGZmZmZmZmY7CisJCXJhdGVfYml0bWFwID0gMHgwZmZmZmZmZjsKIAkJYnJlYWs7CiAJfQogCkBAIC0xMDk2LDggKzg5NSw3IEBACiB2b2lkIG9kbV9EeW5hbWljVHhQb3dlckluaXQoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0pCiB7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKKwlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZBZGFwdGVyLT5IYWxEYXRhLT5kbXByaXY7CiAJcGRtcHJpdi0+YkR5bmFtaWNUeFBvd2VyRW5hYmxlID0gZmFsc2U7CiAJcGRtcHJpdi0+TGFzdERUUEx2bCA9IFR4SGlnaFB3ckxldmVsX05vcm1hbDsKIAlwZG1wcml2LT5EeW5hbWljVHhIaWdoUG93ZXJMdmwgPSBUeEhpZ2hQd3JMZXZlbF9Ob3JtYWw7CkBAIC0xMTIyLDggKzkyMCw3IEBACiAKIHN0YXRpYyB2b2lkIEZpbmRNaW5pbXVtUlNTSShzdHJ1Y3QgYWRhcHRlciAqcEFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKKwlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZwQWRhcHRlci0+SGFsRGF0YS0+ZG1wcml2OwogCiAJLyogMSAxLlVuY29uZGl0aW9uYWxseSBzZXQgUlNTSSAqLwogCXBkbXByaXYtPk1pblVuZGVjb3JhdGVkUFdEQkZvckRNID0gcGRtcHJpdi0+RW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKQEAgLTExMzIsOCArOTI5LDcgQEAKIHZvaWQgb2RtX1JTU0lNb25pdG9yQ2hlY2tDRShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSkKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OworCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJkFkYXB0ZXItPkhhbERhdGEtPmRtcHJpdjsKIAlpbnQJaTsKIAlpbnQJdG1wRW50cnlNYXhQV0RCID0gMCwgdG1wRW50cnlNaW5QV0RCID0gMHhmZjsKIAl1OAlzdGFfY250ID0gMDsKQEAgLTExNjIsNyArOTU4LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBzdGFfY250OyBpKyspIHsKIAkJaWYgKFBXREJfcnNzaVtpXSAhPSAwKSB7Ci0JCQlPRE1fUkFfU2V0UlNTSV84MTg4RSgmcEhhbERhdGEtPm9kbXByaXYsCisJCQlPRE1fUkFfU2V0UlNTSV84MTg4RSgmQWRhcHRlci0+SGFsRGF0YS0+b2RtcHJpdiwKIAkJCQkJICAgICBQV0RCX3Jzc2lbaV0gJiAweEZGLAogCQkJCQkgICAgIChQV0RCX3Jzc2lbaV0gPj4gMTYpICYgMHhGRik7CiAJCX0KQEAgLTExNzksOCArOTc1LDcgQEAKIAkJcGRtcHJpdi0+RW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IDA7CiAKIAlGaW5kTWluaW11bVJTU0koQWRhcHRlcik7Ci0JT0RNX0NtbkluZm9VcGRhdGUoJnBIYWxEYXRhLT5vZG1wcml2LCBPRE1fQ01OSU5GT19SU1NJX01JTiwKLQkJCSAgcGRtcHJpdi0+TWluVW5kZWNvcmF0ZWRQV0RCRm9yRE0pOworCUFkYXB0ZXItPkhhbERhdGEtPm9kbXByaXYuUlNTSV9NaW4gPSBwZG1wcml2LT5NaW5VbmRlY29yYXRlZFBXREJGb3JETTsKIH0KIAogLyogMz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpAQCAtMTI5MCw3ICsxMDg1LDYgQEAKIAl1NjQJY3VyX3R4X2J5dGVzID0gMDsKIAl1NjQJY3VyX3J4X2J5dGVzID0gMDsKIAl1OAliYnRjaGFuZ2UgPSBmYWxzZTsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKIAlzdHJ1Y3QgeG1pdF9wcml2CQkqcHhtaXRwcml2ID0gJihBZGFwdGVyLT54bWl0cHJpdik7CiAJc3RydWN0IHJlY3ZfcHJpdgkJKnByZWN2cHJpdiA9ICYoQWRhcHRlci0+cmVjdnByaXYpOwogCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZBZGFwdGVyLT5yZWdpc3RyeXByaXY7CkBAIC0xMzQ0LDcgKzExMzgsOCBAQAogCQkvKiAgVHVybiBPZmYgRURDQSB0dXJibyBoZXJlLiAqLwogCQkvKiAgUmVzdG9yZSBvcmlnaW5hbCBFRENBIGFjY29yZGluZyB0byB0aGUgZGVjbGFyYXRpb24gb2YgQVAuICovCiAJCSBpZiAocERNX09kbS0+RE1fRURDQV9UYWJsZS5iQ3VycmVudFR1cmJvRURDQSkgewotCQkJdXNiX3dyaXRlMzIoQWRhcHRlciwgUkVHX0VEQ0FfQkVfUEFSQU0sIHBIYWxEYXRhLT5BY1BhcmFtX0JFKTsKKwkJCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19FRENBX0JFX1BBUkFNLAorCQkJCSAgICBBZGFwdGVyLT5IYWxEYXRhLT5BY1BhcmFtX0JFKTsKIAkJCXBETV9PZG0tPkRNX0VEQ0FfVGFibGUuYkN1cnJlbnRUdXJib0VEQ0EgPSBmYWxzZTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcGh5LmMKaW5kZXggYTgzYmJlYTkuLjUxOTJlZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3BoeS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3BoeS5jCkBAIC02NSw4ICs2NSw3IEBACiAJCQllbnVtIHJmX3JhZGlvX3BhdGggcmZwYXRoLCB1MzIgb2Zmc2V0KQogewogCXUzMiByZXQgPSAwOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwotCXN0cnVjdCBiYl9yZWdfZGVmICpwaHlyZWcgPSAmaGFsX2RhdGEtPlBIWVJlZ0RlZltyZnBhdGhdOworCXN0cnVjdCBiYl9yZWdfZGVmICpwaHlyZWcgPSAmYWRhcHQtPkhhbERhdGEtPlBIWVJlZ0RlZltyZnBhdGhdOwogCXUzMiB0bXBsb25nLCB0bXBsb25nMjsKIAl1OCByZnBpX2VuYWJsZSA9IDA7CiAKQEAgLTExMCwxNSArMTA5LDE0IEBACiAJCQkgICAgdTMyIGRhdGEpCiB7CiAJdTMyIGRhdGFfYW5kX2FkZHIgPSAwOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwotCXN0cnVjdCBiYl9yZWdfZGVmICpwaHlyZWcgPSAmaGFsX2RhdGEtPlBIWVJlZ0RlZltyZnBhdGhdOworCXN0cnVjdCBiYl9yZWdfZGVmICpwaHlyZWcgPSAmYWRhcHQtPkhhbERhdGEtPlBIWVJlZ0RlZltyZnBhdGhdOwogCiAJb2Zmc2V0ICY9IDB4ZmY7CiAJZGF0YV9hbmRfYWRkciA9ICgob2Zmc2V0PDwyMCkgfCAoZGF0YSYweDAwMGZmZmZmKSkgJiAweDBmZmZmZmZmOwogCXBoeV9zZXRfYmJfcmVnKGFkYXB0LCBwaHlyZWctPnJmM3dpcmVPZmZzZXQsIGJNYXNrRFdvcmQsIGRhdGFfYW5kX2FkZHIpOwogfQogCi11MzIgcGh5X3F1ZXJ5X3JmX3JlZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIGVudW0gcmZfcmFkaW9fcGF0aCByZl9wYXRoLAordTMyIHJ0d19oYWxfcmVhZF9yZnJlZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIGVudW0gcmZfcmFkaW9fcGF0aCByZl9wYXRoLAogCQkgICAgIHUzMiByZWdfYWRkciwgdTMyIGJpdF9tYXNrKQogewogCXUzMiBvcmlnaW5hbF92YWx1ZSwgcmVhZGJhY2tfdmFsdWUsIGJpdF9zaGlmdDsKQEAgLTE0NywxNCArMTQ1LDExIEBACiBzdGF0aWMgdm9pZCBnZXRfdHhfcG93ZXJfaW5kZXgoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1OCBjaGFubmVsLCB1OCAqY2NrX3B3ciwKIAkJCSAgICAgICB1OCAqb2ZkbV9wd3IsIHU4ICpidzIwX3B3ciwgdTggKmJ3NDBfcHdyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAl1OCBpbmRleCA9IChjaGFubmVsIC0gMSk7CiAJdTggVHhDb3VudCA9IDAsIHBhdGhfbnVtczsKIAotCWlmICgoUkZfMVQyUiA9PSBoYWxfZGF0YS0+cmZfdHlwZSkgfHwgKFJGXzFUMVIgPT0gaGFsX2RhdGEtPnJmX3R5cGUpKQotCQlwYXRoX251bXMgPSAxOwotCWVsc2UKLQkJcGF0aF9udW1zID0gMjsKKwlwYXRoX251bXMgPSAxOwogCiAJZm9yIChUeENvdW50ID0gMDsgVHhDb3VudCA8IHBhdGhfbnVtczsgVHhDb3VudCsrKSB7CiAJCWlmIChUeENvdW50ID09IFJGX1BBVEhfQSkgewpAQCAtMTgzLDcgKzE3OCw3IEBACiAJCQkJICB1OCAqY2NrX3B3ciwgdTggKm9mZG1fcHdyLCB1OCAqYncyMF9wd3IsCiAJCQkJICB1OCAqYnc0MF9wd3IpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCiAJaGFsX2RhdGEtPkN1cnJlbnRDY2tUeFB3cklkeCA9IGNja19wd3JbMF07CiAJaGFsX2RhdGEtPkN1cnJlbnRPZmRtMjRHVHhQd3JJZHggPSBvZmRtX3B3clswXTsKQEAgLTIxMSw3ICsyMDYsNyBAQAogCiBzdGF0aWMgdm9pZCBwaHlfc2V0X2J3X21vZGVfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAl1OCByZWdfYndfb3Btb2RlOwogCXU4IHJlZ19wcnNyX3JzYzsKIApAQCAtMjc0LDEwICsyNjksMTAgQEAKIAkJcnRsODhldV9waHlfcmY2MDUyX3NldF9iYW5kd2lkdGgoYWRhcHQsIGhhbF9kYXRhLT5DdXJyZW50Q2hhbm5lbEJXKTsKIH0KIAotdm9pZCBwaHlfc2V0X2J3X21vZGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBlbnVtIGh0X2NoYW5uZWxfd2lkdGggYmFuZHdpZHRoLAordm9pZCBydHdfaGFsX3NldF9id21vZGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBlbnVtIGh0X2NoYW5uZWxfd2lkdGggYmFuZHdpZHRoLAogCQkgICAgIHVuc2lnbmVkIGNoYXIgb2Zmc2V0KQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAllbnVtIGh0X2NoYW5uZWxfd2lkdGggdG1wX2J3ID0gaGFsX2RhdGEtPkN1cnJlbnRDaGFubmVsQlc7CiAKIAloYWxfZGF0YS0+Q3VycmVudENoYW5uZWxCVyA9IGJhbmR3aWR0aDsKQEAgLTI5MywxMCArMjg4LDcgQEAKIHsKIAl1OCByZl9wYXRoOwogCXUzMiBwYXJhbTEsIHBhcmFtMjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQotCWlmIChhZGFwdC0+Yk5vdGlmeUNoYW5uZWxDaGFuZ2UpCi0JCURCR184OEUoIlslc10gY2ggPSAlZFxuIiwgX19mdW5jX18sIGNoYW5uZWwpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAogCXBoeV9zZXRfdHhfcG93ZXJfbGV2ZWwoYWRhcHQsIGNoYW5uZWwpOwogCkBAIC0zMTAsOSArMzAyLDkgQEAKIAl9CiB9CiAKLXZvaWQgcGh5X3N3X2Nobmwoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1OCBjaGFubmVsKQordm9pZCBydHdfaGFsX3NldF9jaGFuKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggY2hhbm5lbCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gYWRhcHQtPkhhbERhdGE7CiAJdTggdG1wY2hhbm5lbCA9IGhhbF9kYXRhLT5DdXJyZW50Q2hhbm5lbDsKIAogCWlmIChoYWxfZGF0YS0+cmZfY2hpcCA9PSBSRl9QU0VVRE9fMTFOKQpAQCAtNDA3LDcgKzM5OSw3IEBACiAKIHZvaWQgcnRsODhldV9kbV90eHBvd2VyX3RyYWNraW5nX2NhbGxiYWNrX3RoZXJtYWxtZXRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCXU4IHRoZXJtYWxfdmFsID0gMCwgZGVsdGEsIGRlbHRhX2xjaywgZGVsdGFfaXFrLCBvZmZzZXQ7CiAJdTggdGhlcm1hbF9hdmdfY291bnQgPSAwOwogCXUzMiB0aGVybWFsX2F2ZyA9IDA7CkBAIC00MzksNyArNDMxLDcgQEAKIAogCWRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLlJlZ0EyNCA9IDB4MDkwZTEzMTc7CiAKLQl0aGVybWFsX3ZhbCA9ICh1OClwaHlfcXVlcnlfcmZfcmVnKGFkYXB0LCBSRl9QQVRIX0EsCisJdGhlcm1hbF92YWwgPSAodTgpcnR3X2hhbF9yZWFkX3JmcmVnKGFkYXB0LCBSRl9QQVRIX0EsCiAJCQkJCSAgIFJGX1RfTUVURVJfODhFLCAweGZjMDApOwogCiAJaWYgKGlzMnQpCkBAIC02MzIsOCArNjI0LDcgQEAKIHsKIAl1MzIgcmVnX2VhYywgcmVnX2U5NCwgcmVnX2U5YywgcmVnX2VhNCwgdTR0bXA7CiAJdTggcmVzdWx0ID0gMHgwMDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJmhhbF9kYXRhLT5vZG1wcml2OworCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmYWRhcHQtPkhhbERhdGEtPm9kbXByaXY7CiAKIAkvKiAxIEdldCBUWElNUiBzZXR0aW5nICovCiAJLyogbW9kaWZ5IFJYSVFLIG1vZGUgdGFibGUgKi8KQEAgLTczNyw4ICs3MjgsNyBAQAogewogCXUzMiByZWdlYWMsIHJlZ2ViNCwgcmVnZWJjLCByZWdlYzQsIHJlZ2VjYzsKIAl1OCByZXN1bHQgPSAweDAwOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwotCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmaGFsX2RhdGEtPm9kbXByaXY7CisJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICZhZGFwdC0+SGFsRGF0YS0+b2RtcHJpdjsKIAogCS8qIE9uZSBzaG90LCBwYXRoIEIgTE9LICYgSVFLICovCiAJcGh5X3NldF9iYl9yZWcoYWRhcHQsIHJJUUtfQUdDX0NvbnQsIGJNYXNrRFdvcmQsIDB4MDAwMDAwMDIpOwpAQCAtOTU0LDE3ICs5NDQsMTEgQEAKIAkJCSAgICAgICB1OCBjMSwgdTggYzIpCiB7CiAJdTMyIGksIGosIGRpZmYsIHNpbV9iaXRtYXAgPSAwLCBib3VuZDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJmhhbF9kYXRhLT5vZG1wcml2OwogCXU4IGZpbmFsX2NhbmRpZGF0ZVsyXSA9IHsweEZGLCAweEZGfTsJLyogZm9yIHBhdGggQSBhbmQgcGF0aCBCICovCiAJYm9vbCByZXN1bHQgPSB0cnVlOwogCXMzMiB0bXAxID0gMCwgdG1wMiA9IDA7CiAKLQlpZiAoKGRtX29kbS0+UkZUeXBlID09IE9ETV8yVDJSKSB8fCAoZG1fb2RtLT5SRlR5cGUgPT0gT0RNXzJUM1IpIHx8Ci0JICAgIChkbV9vZG0tPlJGVHlwZSA9PSBPRE1fMlQ0UikpCi0JCWJvdW5kID0gODsKLQllbHNlCi0JCWJvdW5kID0gNDsKKwlib3VuZCA9IDQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYm91bmQ7IGkrKykgewogCQlpZiAoKGkgPT0gMSkgfHwgKGkgPT0gMykgfHwgKGkgPT0gNSkgfHwgKGkgPT0gNykpIHsKQEAgLTEwMzMsOCArMTAxNyw3IEBACiBzdGF0aWMgdm9pZCBwaHlfaXFfY2FsaWJyYXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgczMyIHJlc3VsdFtdWzhdLAogCQkJICAgICB1OCB0LCBib29sIGlzMnQpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7Ci0Jc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICZoYWxfZGF0YS0+b2RtcHJpdjsKKwlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJmFkYXB0LT5IYWxEYXRhLT5vZG1wcml2OwogCXUzMiBpOwogCXU4IHBhdGhfYV9vaywgcGF0aF9iX29rOwogCXUzMiBhZGRhX3JlZ1tJUUtfQUREQV9SRUdfTlVNXSA9IHsKQEAgLTEyMzIsMTIgKzEyMTUsMTIgQEAKIAlpZiAoKHRtcHJlZyYweDcwKSAhPSAwKSB7CiAJCS8qIDEuIFJlYWQgb3JpZ2luYWwgUkYgbW9kZSAqLwogCQkvKiBQYXRoLUEgKi8KLQkJcmZfYV9tb2RlID0gcGh5X3F1ZXJ5X3JmX3JlZyhhZGFwdCwgUkZfUEFUSF9BLCBSRl9BQywKKwkJcmZfYV9tb2RlID0gcnR3X2hhbF9yZWFkX3JmcmVnKGFkYXB0LCBSRl9QQVRIX0EsIFJGX0FDLAogCQkJCQkgICAgIGJNYXNrMTJCaXRzKTsKIAogCQkvKiBQYXRoLUIgKi8KIAkJaWYgKGlzMnQpCi0JCQlyZl9iX21vZGUgPSBwaHlfcXVlcnlfcmZfcmVnKGFkYXB0LCBSRl9QQVRIX0IsIFJGX0FDLAorCQkJcmZfYl9tb2RlID0gcnR3X2hhbF9yZWFkX3JmcmVnKGFkYXB0LCBSRl9QQVRIX0IsIFJGX0FDLAogCQkJCQkJICAgICBiTWFzazEyQml0cyk7CiAKIAkJLyogMi4gU2V0IFJGIG1vZGUgPSBzdGFuZGJ5IG1vZGUgKi8KQEAgLTEyNTIsNyArMTIzNSw3IEBACiAJfQogCiAJLyogMy4gUmVhZCBSRiByZWcxOCAqLwotCWxjX2NhbCA9IHBoeV9xdWVyeV9yZl9yZWcoYWRhcHQsIFJGX1BBVEhfQSwgUkZfQ0hOTEJXLCBiTWFzazEyQml0cyk7CisJbGNfY2FsID0gcnR3X2hhbF9yZWFkX3JmcmVnKGFkYXB0LCBSRl9QQVRIX0EsIFJGX0NITkxCVywgYk1hc2sxMkJpdHMpOwogCiAJLyogNC4gU2V0IExDIGNhbGlicmF0aW9uIGJlZ2luIGJpdDE1ICovCiAJcGh5X3NldF9yZl9yZWcoYWRhcHQsIFJGX1BBVEhfQSwgUkZfQ0hOTEJXLCBiTWFzazEyQml0cywKQEAgLTEyNzksOCArMTI2Miw3IEBACiAKIHZvaWQgcnRsODhldV9waHlfaXFfY2FsaWJyYXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgYm9vbCByZWNvdmVyeSkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJmhhbF9kYXRhLT5vZG1wcml2OworCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmYWRhcHQtPkhhbERhdGEtPm9kbXByaXY7CiAJczMyIHJlc3VsdFs0XVs4XTsKIAl1OCBpLCBmaW5hbCwgY2huX2luZGV4OwogCWJvb2wgcGF0aGFvaywgcGF0aGJvazsKQEAgLTEyOTUsNyArMTI3Nyw3IEBACiAJCXJPRkRNMF9SeElRRXh0QW50YX07CiAJYm9vbCBpczJ0OwogCi0JaXMydCA9IChkbV9vZG0tPlJGVHlwZSA9PSBPRE1fMlQyUikgPyB0cnVlIDogZmFsc2U7CisJaXMydCA9IGZhbHNlOwogCiAJaWYgKCEoZG1fb2RtLT5TdXBwb3J0QWJpbGl0eSAmIE9ETV9SRl9DQUxJQlJBVElPTikpCiAJCXJldHVybjsKQEAgLTEzOTEsNyArMTM3Myw3IEBACiAJCQkJICAgICAgIChyZWdfZWM0ID09IDApKTsKIAl9CiAKLQljaG5faW5kZXggPSBnZXRfcmlnaHRfY2hubF9mb3JfaXFrKGhhbF9kYXRhLT5DdXJyZW50Q2hhbm5lbCk7CisJY2huX2luZGV4ID0gZ2V0X3JpZ2h0X2NobmxfZm9yX2lxayhhZGFwdC0+SGFsRGF0YS0+Q3VycmVudENoYW5uZWwpOwogCiAJaWYgKGZpbmFsIDwgNCkgewogCQlmb3IgKGkgPSAwOyBpIDwgSVFLX01hdHJpeF9SRUdfTlVNOyBpKyspCkBAIC0xNDA3LDggKzEzODksNyBAQAogewogCWJvb2wgc2luZ2xldG9uZSA9IGZhbHNlLCBjYXJyaWVyX3N1cCA9IGZhbHNlOwogCXUzMiB0aW1lb3V0ID0gMjAwMCwgdGltZWNvdW50ID0gMDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJmhhbF9kYXRhLT5vZG1wcml2OworCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmYWRhcHQtPkhhbERhdGEtPm9kbXByaXY7CiAKIAlpZiAoIShkbV9vZG0tPlN1cHBvcnRBYmlsaXR5ICYgT0RNX1JGX0NBTElCUkFUSU9OKSkKIAkJcmV0dXJuOwpAQCAtMTQyMiwxMiArMTQwMyw3IEBACiAKIAlkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5iTENLSW5Qcm9ncmVzcyA9IHRydWU7CiAKLQlpZiAoZG1fb2RtLT5SRlR5cGUgPT0gT0RNXzJUMlIpIHsKLQkJcGh5X2xjX2NhbGlicmF0ZShhZGFwdCwgdHJ1ZSk7Ci0JfSBlbHNlIHsKLQkJLyogRm9yIDg4QyAxVDFSICovCi0JCXBoeV9sY19jYWxpYnJhdGUoYWRhcHQsIGZhbHNlKTsKLQl9CisJcGh5X2xjX2NhbGlicmF0ZShhZGFwdCwgZmFsc2UpOwogCiAJZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uYkxDS0luUHJvZ3Jlc3MgPSBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3JmLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9yZi5jCmluZGV4IDE1OTYyNzQuLjJmM2VkZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3JmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcmYuYwpAQCAtMjIsNyArMjIsNyBAQAogdm9pZCBydGw4OGV1X3BoeV9yZjYwNTJfc2V0X2JhbmR3aWR0aChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsCiAJCQkJICAgICAgZW51bSBodF9jaGFubmVsX3dpZHRoIGJhbmR3aWR0aCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gYWRhcHQtPkhhbERhdGE7CiAKIAlzd2l0Y2ggKGJhbmR3aWR0aCkgewogCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMDoKQEAgLTQ0LDcgKzQ0LDcgQEAKIAogdm9pZCBydGw4OGV1X3BoeV9yZjYwNTJfc2V0X2Nja190eHBvd2VyKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggKnBvd2VybGV2ZWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCXN0cnVjdCBkbV9wcml2ICpwZG1wcml2ID0gJmhhbF9kYXRhLT5kbXByaXY7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJmFkYXB0LT5tbG1lZXh0cHJpdjsKIAl1MzIgdHhfYWdjWzJdID0gezAsIDB9LCB0bXB2YWwgPSAwLCBwd3J0cmFjX3ZhbHVlOwpAQCAtMTI5LDcgKzEyOSw2IEBACiAJCQkgICAgdTggKnB3cl9sZXZlbF9idzIwLCB1OCAqcHdyX2xldmVsX2J3NDAsCiAJCQkgICAgdTggY2hhbm5lbCwgdTMyICpvZmRtYmFzZSwgdTMyICptY3NfYmFzZSkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKIAl1MzIgcG93ZXJiYXNlMCwgcG93ZXJiYXNlMTsKIAl1OCBpLCBwb3dlcmxldmVsWzJdOwogCkBAIC0xNDAsOSArMTM5LDkgQEAKIAkJCSAgICAgKHBvd2VyYmFzZTA8PDgpIHwgcG93ZXJiYXNlMDsKIAkJKihvZmRtYmFzZStpKSA9IHBvd2VyYmFzZTA7CiAJfQotCWZvciAoaSA9IDA7IGkgPCBoYWxfZGF0YS0+TnVtVG90YWxSRlBhdGg7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBhZGFwdC0+SGFsRGF0YS0+TnVtVG90YWxSRlBhdGg7IGkrKykgewogCQkvKiBDaGVjayBIVDIwIHRvIEhUNDAgZGlmZiAqLwotCQlpZiAoaGFsX2RhdGEtPkN1cnJlbnRDaGFubmVsQlcgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJaWYgKGFkYXB0LT5IYWxEYXRhLT5DdXJyZW50Q2hhbm5lbEJXID09IEhUX0NIQU5ORUxfV0lEVEhfMjApCiAJCQlwb3dlcmxldmVsW2ldID0gcHdyX2xldmVsX2J3MjBbaV07CiAJCWVsc2UKIAkJCXBvd2VybGV2ZWxbaV0gPSBwd3JfbGV2ZWxfYnc0MFtpXTsKQEAgLTE1Niw3ICsxNTUsNyBAQAogCQkJCSAgICB1OCBpbmRleCwgdTMyICpwb3dlcmJhc2UwLCB1MzIgKnBvd2VyYmFzZTEsCiAJCQkJICAgIHUzMiAqb3V0X3ZhbCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gYWRhcHQtPkhhbERhdGE7CiAJc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmaGFsX2RhdGEtPmRtcHJpdjsKIAl1OCBpLCBjaG5sR3JvdXAgPSAwLCBwd3JfZGlmZl9saW1pdFs0XSwgY3VzdG9tZXJfcHdyX2xpbWl0OwogCXM4IHB3cl9kaWZmID0gMDsKQEAgLTI4Niw3ICsyODUsNiBAQAogCQkJCQkgdTggKnB3cl9sZXZlbF9idzIwLAogCQkJCQkgdTggKnB3cl9sZXZlbF9idzQwLCB1OCBjaGFubmVsKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwogCXUzMiB3cml0ZV92YWxbMl0sIHBvd2VyYmFzZTBbMl0sIHBvd2VyYmFzZTFbMl0sIHB3cnRyYWNfdmFsdWU7CiAJdTggZGlyZWN0aW9uOwogCXU4IGluZGV4ID0gMDsKQEAgLTI5NCw4ICsyOTIsOCBAQAogCWdldHBvd2VyYmFzZTg4ZShhZGFwdCwgcHdyX2xldmVsX29mZG0sIHB3cl9sZXZlbF9idzIwLCBwd3JfbGV2ZWxfYnc0MCwKIAkJCWNoYW5uZWwsICZwb3dlcmJhc2UwWzBdLCAmcG93ZXJiYXNlMVswXSk7CiAKLQlydGw4OGV1X2RtX3R4cG93ZXJfdHJhY2tfYWRqdXN0KCZoYWxfZGF0YS0+b2RtcHJpdiwgMCwgJmRpcmVjdGlvbiwKLQkJCQkJJnB3cnRyYWNfdmFsdWUpOworCXJ0bDg4ZXVfZG1fdHhwb3dlcl90cmFja19hZGp1c3QoJmFkYXB0LT5IYWxEYXRhLT5vZG1wcml2LCAwLAorCQkJCQkmZGlyZWN0aW9uLCAmcHdydHJhY192YWx1ZSk7CiAKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA2OyBpbmRleCsrKSB7CiAJCWdldF9yeF9wb3dlcl92YWxfYnlfcmVnKGFkYXB0LCBjaGFubmVsLCBpbmRleCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3JmX2NmZy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcmZfY2ZnLmMKaW5kZXggNDUzZjllNy4uZGRlNjQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcmZfY2ZnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcmZfY2ZnLmMKQEAgLTE5LDcgKzE5LDcgQEAKIAogc3RhdGljIGJvb2wgY2hlY2tfY29uZGl0aW9uKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgY29uc3QgdTMyICBjb25kaXRpb24pCiB7Ci0Jc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKm9kbSA9ICZHRVRfSEFMX0RBVEEoYWRhcHQpLT5vZG1wcml2OworCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpvZG0gPSAmYWRhcHQtPkhhbERhdGEtPm9kbXByaXY7CiAJdTMyIF9ib2FyZCA9IG9kbS0+Qm9hcmRUeXBlOwogCXUzMiBfcGxhdGZvcm0gPSBvZG0tPlN1cHBvcnRQbGF0Zm9ybTsKIAl1MzIgX2ludGVyZmFjZSA9IG9kbS0+U3VwcG9ydEludGVyZmFjZTsKQEAgLTIyOCw3ICsyMjgsNyBAQAogCiBzdGF0aWMgYm9vbCByZjYwNTJfY29uZl9wYXJhKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gYWRhcHQtPkhhbERhdGE7CiAJdTMyIHU0dmFsID0gMDsKIAl1OCByZnBhdGg7CiAJYm9vbCBydHN0YXR1cyA9IHRydWU7CkBAIC0yOTksMTIgKzI5OSw5IEBACiAKIHN0YXRpYyBib29sIHJ0bDg4ZV9waHlfcmY2MDUyX2NvbmZpZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCi0JaWYgKGhhbF9kYXRhLT5yZl90eXBlID09IFJGXzFUMVIpCi0JCWhhbF9kYXRhLT5OdW1Ub3RhbFJGUGF0aCA9IDE7Ci0JZWxzZQotCQloYWxfZGF0YS0+TnVtVG90YWxSRlBhdGggPSAyOworCWhhbF9kYXRhLT5OdW1Ub3RhbFJGUGF0aCA9IDE7CiAKIAlyZXR1cm4gcmY2MDUyX2NvbmZfcGFyYShhZGFwdCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2NtZC5jCmluZGV4IDI0MjJjMDIuLmQwZjU5YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2NtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2NtZC5jCkBAIC02MCw3ICs2MCw2IEBACiAJdTggaDJjX2JveF9udW07CiAJdTMyIG1zZ2JveF9hZGRyOwogCXUzMiBtc2dib3hfZXhfYWRkcjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwogCXU4IGNtZF9pZHgsIGV4dF9jbWRfbGVuOwogCXUzMiBoMmNfY21kID0gMDsKIAl1MzIgaDJjX2NtZF9leCA9IDA7CkBAIC04MSw3ICs4MCw3IEBACiAKIAkvKiBwYXkgYXR0ZW50aW9uIHRvIGlmICByYWNlIGNvbmRpdGlvbiBoYXBwZW5lZCBpbiAgSDJDIGNtZCBzZXR0aW5nLiAqLwogCWRvIHsKLQkJaDJjX2JveF9udW0gPSBoYWxkYXRhLT5MYXN0SE1FQm94TnVtOworCQloMmNfYm94X251bSA9IGFkYXB0LT5IYWxEYXRhLT5MYXN0SE1FQm94TnVtOwogCiAJCWlmICghX2lzX2Z3X3JlYWRfY21kX2Rvd24oYWRhcHQsIGgyY19ib3hfbnVtKSkgewogCQkJREJHXzg4RSgiIGZ3IHJlYWQgY21kIGZhaWxlZC4uLlxuIik7CkBAIC0xMTAsNyArMTA5LDggQEAKIAkJfQogCQliY21kX2Rvd24gPSB0cnVlOwogCi0JCWhhbGRhdGEtPkxhc3RITUVCb3hOdW0gPSAoaDJjX2JveF9udW0rMSkgJSBSVEw4OEVfTUFYX0gyQ19CT1hfTlVNUzsKKwkJYWRhcHQtPkhhbERhdGEtPkxhc3RITUVCb3hOdW0gPQorCQkJKGgyY19ib3hfbnVtKzEpICUgUlRMODhFX01BWF9IMkNfQk9YX05VTVM7CiAKIAl9IHdoaWxlICgoIWJjbWRfZG93bikgJiYgKHJldHJ5X2NudHMtLSkpOwogCkBAIC0xMjYsOSArMTI2LDkgQEAKIC8qIGJpdG1hcFsyODozMV09IFJhdGUgQWRhcHRpdmUgaWQgKi8KIC8qIGFyZ1swOjRdID0gbWFjaWQgKi8KIC8qIGFyZ1s1XSA9IFNob3J0IEdJICovCi12b2lkIHJ0bDgxODhlX0FkZF9SYXRlQVRpZChzdHJ1Y3QgYWRhcHRlciAqcEFkYXB0ZXIsIHUzMiBiaXRtYXAsIHU4IGFyZywgdTggcnNzaV9sZXZlbCkKK3ZvaWQgcnR3X2hhbF9hZGRfcmFfdGlkKHN0cnVjdCBhZGFwdGVyICpwQWRhcHRlciwgdTMyIGJpdG1hcCwgdTggYXJnLCB1OCByc3NpX2xldmVsKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7CisJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKm9kbXByaXYgPSAmcEFkYXB0ZXItPkhhbERhdGEtPm9kbXByaXY7CiAKIAl1OCBtYWNpZCwgaW5pdF9yYXRlLCByYWlkLCBzaG9ydEdJcmF0ZSA9IGZhbHNlOwogCkBAIC0xMzgsNyArMTM4LDcgQEAKIAliaXRtYXAgJj0gMHgwZmZmZmZmZjsKIAogCWlmIChyc3NpX2xldmVsICE9IERNX1JBVFJfU1RBX0lOSVQpCi0JCWJpdG1hcCA9IE9ETV9HZXRfUmF0ZV9CaXRtYXAoJmhhbGRhdGEtPm9kbXByaXYsIG1hY2lkLCBiaXRtYXAsIHJzc2lfbGV2ZWwpOworCQliaXRtYXAgPSBPRE1fR2V0X1JhdGVfQml0bWFwKG9kbXByaXYsIG1hY2lkLCBiaXRtYXAsIHJzc2lfbGV2ZWwpOwogCiAJYml0bWFwIHw9ICgocmFpZDw8MjgpJjB4ZjAwMDAwMDApOwogCkBAIC0xNTYsNyArMTU2LDcgQEAKIAlEQkdfODhFKCIlcz0+IG1hY19pZDolZCwgcmFpZDolZCwgcmFfYml0bWFwPTB4JXgsIHNob3J0R0lyYXRlPTB4JTAyeFxuIiwKIAkJX19mdW5jX18sIG1hY2lkLCByYWlkLCBiaXRtYXAsIHNob3J0R0lyYXRlKTsKIAotCU9ETV9SQV9VcGRhdGVSYXRlSW5mb184MTg4RSgmKGhhbGRhdGEtPm9kbXByaXYpLCBtYWNpZCwgcmFpZCwgYml0bWFwLCBzaG9ydEdJcmF0ZSk7CisJT0RNX1JBX1VwZGF0ZVJhdGVJbmZvXzgxODhFKG9kbXByaXYsIG1hY2lkLCByYWlkLCBiaXRtYXAsIHNob3J0R0lyYXRlKTsKIH0KIAogdm9pZCBydGw4MTg4ZV9zZXRfRndQd3JNb2RlX2NtZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHU4IE1vZGUpCkBAIC0yMTksNyArMjE5LDcgQEAKIAogc3RhdGljIHZvaWQgQ29uc3RydWN0QmVhY29uKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggKnBmcmFtZSwgdTMyICpwTGVuZ3RoKQogewotCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcgkqcHdsYW5oZHI7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwogCV9fbGUxNiAqZmN0cmw7CiAJdTMyIHJhdGVfbGVuLCBwa3RsZW47CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJihhZGFwdC0+bWxtZWV4dHByaXYpOwpAQCAtMjI3LDIwICsyMjcsMjAgQEAKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leAkJKmN1cl9uZXR3b3JrID0gJihwbWxtZWluZm8tPm5ldHdvcmspOwogCXU4IGJjX2FkZHJbXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKIAotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7CiAKLQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBiY19hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKGFkYXB0LT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBjdXJfbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIGJjX2FkZHIpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihhZGFwdC0+ZWVwcm9tcHJpdikpKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBjdXJfbmV0d29yay0+TWFjQWRkcmVzcyk7CiAKIAlTZXRTZXFOdW0ocHdsYW5oZHIsIDAvKnBtbG1lZXh0LT5tZ250X3NlcSovKTsKIAlTZXRGcmFtZVN1YlR5cGUocGZyYW1lLCBXSUZJX0JFQUNPTik7CiAKLQlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JcGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAogCS8qIHRpbWVzdGFtcCB3aWxsIGJlIGluc2VydGVkIGJ5IGhhcmR3YXJlICovCiAJcGZyYW1lICs9IDg7CkBAIC0zMDQsMTYgKzMwNCwxNiBAQAogCiBzdGF0aWMgdm9pZCBDb25zdHJ1Y3RQU1BvbGwoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1OCAqcGZyYW1lLCB1MzIgKnBMZW5ndGgpCiB7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyCSpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJihhZGFwdC0+bWxtZWV4dHByaXYpOwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAJX19sZTE2ICpmY3RybDsKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmsgPSAmKHBtbG1laW5mby0+bmV0d29yayk7CiAKLQlwd2xhbmhkciA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKilwZnJhbWU7CisJcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7CiAKIAkvKiAgRnJhbWUgY29udHJvbC4gKi8KLQlmY3RybCA9ICYocHdsYW5oZHItPmZyYW1lX2N0bCk7CisJZmN0cmwgPSAmcHdsYW5oZHItPmZyYW1lX2NvbnRyb2w7CiAJKihmY3RybCkgPSAwOwogCVNldFB3ck1ndChmY3RybCk7CiAJU2V0RnJhbWVTdWJUeXBlKHBmcmFtZSwgV0lGSV9QU1BPTEwpOwpAQCAtMzIyLDEwICszMjIsMTAgQEAKIAlTZXREdXJhdGlvbihwZnJhbWUsIChwbWxtZWluZm8tPmFpZCB8IDB4YzAwMCkpOwogCiAJLyogIEJTU0lELiAqLwotCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgcG5ldHdvcmstPk1hY0FkZHJlc3MpOwogCiAJLyogIFRBLiAqLwotCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihhZGFwdC0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKGFkYXB0LT5lZXByb21wcml2KSkpOwogCiAJKnBMZW5ndGggPSAxNjsKIH0KQEAgLTMzOCw3ICszMzgsNyBAQAogCXU4IGJFb3NwLAogCXU4IGJGb3JjZVBvd2VyU2F2ZSkKIHsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIJKnB3bGFuaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKIAlfX2xlMTYgKmZjdHJsOwogCXUzMiBwa3RsZW47CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0LT5tbG1lcHJpdjsKQEAgLTM0Nyw5ICszNDcsOSBAQAogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAJc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrID0gJihwbWxtZWluZm8tPm5ldHdvcmspOwogCi0JcHdsYW5oZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICopcGZyYW1lOworCXB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcGZyYW1lOwogCi0JZmN0cmwgPSAmcHdsYW5oZHItPmZyYW1lX2N0bDsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7CiAJaWYgKGJGb3JjZVBvd2VyU2F2ZSkKIAkJU2V0UHdyTWd0KGZjdHJsKTsKQEAgLTM1Nyw0MCArMzU3LDQwIEBACiAJc3dpdGNoIChjdXJfbmV0d29yay0+bmV0d29yay5JbmZyYXN0cnVjdHVyZU1vZGUpIHsKIAljYXNlIE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZToKIAkJU2V0VG9EcyhmY3RybCk7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihhZGFwdC0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIFN0YUFkZHIsIEVUSF9BTEVOKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgcG5ldHdvcmstPk1hY0FkZHJlc3MpOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYoYWRhcHQtPmVlcHJvbXByaXYpKSk7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIFN0YUFkZHIpOwogCQlicmVhazsKIAljYXNlIE5kaXM4MDJfMTFBUE1vZGU6CiAJCVNldEZyRHMoZmN0cmwpOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBTdGFBZGRyLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIG15aWQoJihhZGFwdC0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIFN0YUFkZHIpOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBwbmV0d29yay0+TWFjQWRkcmVzcyk7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIG15aWQoJihhZGFwdC0+ZWVwcm9tcHJpdikpKTsKIAkJYnJlYWs7CiAJY2FzZSBOZGlzODAyXzExSUJTUzoKIAlkZWZhdWx0OgotCQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBTdGFBZGRyLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihhZGFwdC0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIFN0YUFkZHIpOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYoYWRhcHQtPmVlcHJvbXByaXYpKSk7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIHBuZXR3b3JrLT5NYWNBZGRyZXNzKTsKIAkJYnJlYWs7CiAJfQogCiAJU2V0U2VxTnVtKHB3bGFuaGRyLCAwKTsKIAogCWlmIChiUW9TKSB7Ci0JCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcl9xb3MgKnB3bGFucW9zaGRyOworCQlzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIgKnB3bGFucW9zaGRyOwogCiAJCVNldEZyYW1lU3ViVHlwZShwZnJhbWUsIFdJRklfUU9TX0RBVEFfTlVMTCk7CiAKLQkJcHdsYW5xb3NoZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyX3FvcyAqKXBmcmFtZTsKLQkJU2V0UHJpb3JpdHkoJnB3bGFucW9zaGRyLT5xYywgQUMpOwotCQlTZXRFT1NQKCZwd2xhbnFvc2hkci0+cWMsIGJFb3NwKTsKKwkJcHdsYW5xb3NoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyICopcGZyYW1lOworCQlTZXRQcmlvcml0eSgmcHdsYW5xb3NoZHItPnFvc19jdHJsLCBBQyk7CisJCVNldEVPU1AoJnB3bGFucW9zaGRyLT5xb3NfY3RybCwgYkVvc3ApOwogCi0JCXBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHJfcW9zKTsKKwkJcGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX2hkcik7CiAJfSBlbHNlIHsKIAkJU2V0RnJhbWVTdWJUeXBlKHBmcmFtZSwgV0lGSV9EQVRBX05VTEwpOwogCi0JCXBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCQlwa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCX0KIAogCSpwTGVuZ3RoID0gcGt0bGVuOwpAQCAtMzk4LDcgKzM5OCw3IEBACiAKIHN0YXRpYyB2b2lkIENvbnN0cnVjdFByb2JlUnNwKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggKnBmcmFtZSwgdTMyICpwTGVuZ3RoLCB1OCAqU3RhQWRkciwgYm9vbCBiSGlkZVNTSUQpCiB7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyCSpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJX19sZTE2ICpmY3RybDsKIAl1OCAqbWFjLCAqYnNzaWQ7CiAJdTMyIHBrdGxlbjsKQEAgLTQwNiwyMSArNDA2LDIxIEBACiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leAkqY3VyX25ldHdvcmsgPSAmKHBtbG1laW5mby0+bmV0d29yayk7CiAKLQlwd2xhbmhkciA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKilwZnJhbWU7CisJcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7CiAKIAltYWMgPSBteWlkKCYoYWRhcHQtPmVlcHJvbXByaXYpKTsKIAlic3NpZCA9IGN1cl9uZXR3b3JrLT5NYWNBZGRyZXNzOwogCi0JZmN0cmwgPSAmKHB3bGFuaGRyLT5mcmFtZV9jdGwpOworCWZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jb250cm9sOwogCSooZmN0cmwpID0gMDsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBTdGFBZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbWFjLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgYnNzaWQsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBTdGFBZGRyKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBtYWMpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIGJzc2lkKTsKIAogCVNldFNlcU51bShwd2xhbmhkciwgMCk7CiAJU2V0RnJhbWVTdWJUeXBlKGZjdHJsLCBXSUZJX1BST0JFUlNQKTsKIAotCXBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCXBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAJcGZyYW1lICs9IHBrdGxlbjsKIAogCWlmIChjdXJfbmV0d29yay0+SUVMZW5ndGggPiBNQVhfSUVfU1opCkBAIC00NDUsNyArNDQ1LDYgQEAKIC8qICAyMDA5LjEwLjE1IGJ5IHR5bmxpLiAqLwogc3RhdGljIHZvaWQgU2V0RndSc3ZkUGFnZVBrdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIGJvb2wgYkRMRmluaXNoZWQpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhOwogCXN0cnVjdCB4bWl0X2ZyYW1lCSpwbWdudGZyYW1lOwogCXN0cnVjdCBwa3RfYXR0cmliCSpwYXR0cmliOwogCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdjsKQEAgLTQ2Nyw3ICs0NjYsNiBAQAogCQlyZXR1cm47CiAJfQogCi0JaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CiAJcHhtaXRwcml2ID0gJmFkYXB0LT54bWl0cHJpdjsKIAlwbWxtZWV4dCA9ICZhZGFwdC0+bWxtZWV4dHByaXY7CiAJcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKQEAgLTQ4Nyw3ICs0ODUsNyBAQAogCWlmIChQYWdlTmVlZCA9PSAxKQogCQlQYWdlTmVlZCArPSAxOwogCVBhZ2VOdW0gKz0gUGFnZU5lZWQ7Ci0JaGFsZGF0YS0+RndSc3ZkUGFnZVN0YXJ0T2Zmc2V0ID0gUGFnZU51bTsKKwlhZGFwdC0+SGFsRGF0YS0+RndSc3ZkUGFnZVN0YXJ0T2Zmc2V0ID0gUGFnZU51bTsKIAogCUJ1ZkluZGV4ICs9IFBhZ2VOZWVkKjEyODsKIApAQCAtNTU0LDcgKzU1Miw3IEBACiAKIHZvaWQgcnRsODE4OGVfc2V0X0Z3Sm9pbkJzc1JlcG9ydF9jbWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1OCBtc3RhdHVzKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gYWRhcHQtPkhhbERhdGE7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJihhZGFwdC0+bWxtZWV4dHByaXYpOwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAJYm9vbAliU2VuZEJlYWNvbiA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2RtLmMKaW5kZXggODFmMjkzMS4uZDA0YjdmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9kbS5jCkBAIC00Miw0MyArNDIsMzMgQEAKIC8qICAqLwogc3RhdGljIHZvaWQgSW5pdF9PRE1fQ29tSW5mb184OEUoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gQWRhcHRlci0+SGFsRGF0YTsKIAlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZoYWxfZGF0YS0+ZG1wcml2OwogCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmKGhhbF9kYXRhLT5vZG1wcml2KTsKLQl1OCBjdXRfdmVyOwogCiAJLyogIEluaXQgVmFsdWUgKi8KIAltZW1zZXQoZG1fb2RtLCAwLCBzaXplb2YoKmRtX29kbSkpOwogCiAJZG1fb2RtLT5BZGFwdGVyID0gQWRhcHRlcjsKKwlkbV9vZG0tPlN1cHBvcnRQbGF0Zm9ybSA9IE9ETV9DRTsKKwlkbV9vZG0tPlN1cHBvcnRJQ1R5cGUgPSBPRE1fUlRMODE4OEU7CisJZG1fb2RtLT5DdXRWZXJzaW9uID0gT0RNX0NVVF9BOworCWRtX29kbS0+YklzTVBDaGlwID0gaGFsX2RhdGEtPlZlcnNpb25JRC5DaGlwVHlwZSA9PSBOT1JNQUxfQ0hJUDsKKwlkbV9vZG0tPlBhdGNoSUQgPSBoYWxfZGF0YS0+Q3VzdG9tZXJJRDsKKwlkbV9vZG0tPmJXSUZJVGVzdCA9IEFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aWZpX3NwZWM7CiAKLQlPRE1fQ21uSW5mb0luaXQoZG1fb2RtLCBPRE1fQ01OSU5GT19QTEFURk9STSwgT0RNX0NFKTsKKwlkbV9vZG0tPkFudERpdlR5cGUgPSBoYWxfZGF0YS0+VFJ4QW50RGl2VHlwZTsKIAotCU9ETV9DbW5JbmZvSW5pdChkbV9vZG0sIE9ETV9DTU5JTkZPX0lDX1RZUEUsIE9ETV9SVEw4MTg4RSk7Ci0KLQljdXRfdmVyID0gT0RNX0NVVF9BOwotCi0JT0RNX0NtbkluZm9Jbml0KGRtX29kbSwgT0RNX0NNTklORk9fQ1VUX1ZFUiwgY3V0X3Zlcik7Ci0KLQlPRE1fQ21uSW5mb0luaXQoZG1fb2RtLCBPRE1fQ01OSU5GT19NUF9URVNUX0NISVAsIGhhbF9kYXRhLT5WZXJzaW9uSUQuQ2hpcFR5cGUgPT0gTk9STUFMX0NISVAgPyB0cnVlIDogZmFsc2UpOwotCi0JT0RNX0NtbkluZm9Jbml0KGRtX29kbSwgT0RNX0NNTklORk9fUEFUQ0hfSUQsIGhhbF9kYXRhLT5DdXN0b21lcklEKTsKLQlPRE1fQ21uSW5mb0luaXQoZG1fb2RtLCBPRE1fQ01OSU5GT19CV0lGSV9URVNULCBBZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjKTsKLQotCi0JaWYgKGhhbF9kYXRhLT5yZl90eXBlID09IFJGXzFUMVIpCi0JCU9ETV9DbW5JbmZvVXBkYXRlKGRtX29kbSwgT0RNX0NNTklORk9fUkZfVFlQRSwgT0RNXzFUMVIpOwotCWVsc2UgaWYgKGhhbF9kYXRhLT5yZl90eXBlID09IFJGXzJUMlIpCi0JCU9ETV9DbW5JbmZvVXBkYXRlKGRtX29kbSwgT0RNX0NNTklORk9fUkZfVFlQRSwgT0RNXzJUMlIpOwotCWVsc2UgaWYgKGhhbF9kYXRhLT5yZl90eXBlID09IFJGXzFUMlIpCi0JCU9ETV9DbW5JbmZvVXBkYXRlKGRtX29kbSwgT0RNX0NNTklORk9fUkZfVFlQRSwgT0RNXzFUMlIpOwotCi0JT0RNX0NtbkluZm9Jbml0KGRtX29kbSwgT0RNX0NNTklORk9fUkZfQU5URU5OQV9UWVBFLCBoYWxfZGF0YS0+VFJ4QW50RGl2VHlwZSk7CisJLyogIFR4IHBvd2VyIHRyYWNraW5nIEJCIHN3aW5nIHRhYmxlLiAqLworCS8qICBUaGUgYmFzZSBpbmRleCA9IDEyLiArKCgxMi1uKS8yKWRCIDEzfj8/ID0gZGVjcmVhc2UgdHggcHdyIGJ5IC0oKG4tMTIpLzIpZEIgKi8KKwlkbV9vZG0tPkJiU3dpbmdJZHhPZmRtID0gMTI7IC8qICBTZXQgZGVmYWx1dCB2YWx1ZSBhcyBpbmRleCAxMi4gKi8KKwlkbV9vZG0tPkJiU3dpbmdJZHhPZmRtQ3VycmVudCA9IDEyOworCWRtX29kbS0+QmJTd2luZ0ZsYWdPZmRtID0gZmFsc2U7CiAKIAlwZG1wcml2LT5Jbml0T0RNRmxhZyA9CU9ETV9SRl9DQUxJQlJBVElPTiB8CiAJCQkJT0RNX1JGX1RYX1BXUl9UUkFDSzsKIAotCU9ETV9DbW5JbmZvVXBkYXRlKGRtX29kbSwgT0RNX0NNTklORk9fQUJJTElUWSwgcGRtcHJpdi0+SW5pdE9ETUZsYWcpOworCWRtX29kbS0+U3VwcG9ydEFiaWxpdHkgPSBwZG1wcml2LT5Jbml0T0RNRmxhZzsKIH0KIAogc3RhdGljIHZvaWQgVXBkYXRlX09ETV9Db21JbmZvXzg4RShzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKQEAgLTg2LDcgKzc2LDcgQEAKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmQWRhcHRlci0+bWxtZWV4dHByaXY7CiAJc3RydWN0IG1sbWVfcHJpdgkqcG1sbWVwcml2ID0gJkFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cmN0cmxwcml2ID0gJkFkYXB0ZXItPnB3cmN0cmxwcml2OwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEFkYXB0ZXItPkhhbERhdGE7CiAJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICYoaGFsX2RhdGEtPm9kbXByaXYpOwogCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJmhhbF9kYXRhLT5kbXByaXY7CiAJaW50IGk7CkBAIC0xMDksMjAgKzk5LDI2IEBACiAJCQkJCU9ETV9SRl9UWF9QV1JfVFJBQ0s7CiAJfQogCi0JT0RNX0NtbkluZm9VcGRhdGUoZG1fb2RtLCBPRE1fQ01OSU5GT19BQklMSVRZLCBwZG1wcml2LT5Jbml0T0RNRmxhZyk7CisJZG1fb2RtLT5TdXBwb3J0QWJpbGl0eSA9IHBkbXByaXYtPkluaXRPRE1GbGFnOwogCi0JT0RNX0NtbkluZm9Ib29rKGRtX29kbSwgT0RNX0NNTklORk9fVFhfVU5JLCAmKEFkYXB0ZXItPnhtaXRwcml2LnR4X2J5dGVzKSk7Ci0JT0RNX0NtbkluZm9Ib29rKGRtX29kbSwgT0RNX0NNTklORk9fUlhfVU5JLCAmKEFkYXB0ZXItPnJlY3Zwcml2LnJ4X2J5dGVzKSk7Ci0JT0RNX0NtbkluZm9Ib29rKGRtX29kbSwgT0RNX0NNTklORk9fV01fTU9ERSwgJihwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUpKTsKLQlPRE1fQ21uSW5mb0hvb2soZG1fb2RtLCBPRE1fQ01OSU5GT19TRUNfQ0hOTF9PRkZTRVQsICYoaGFsX2RhdGEtPm5DdXI0ME1oelByaW1lU0MpKTsKLQlPRE1fQ21uSW5mb0hvb2soZG1fb2RtLCBPRE1fQ01OSU5GT19TRUNfTU9ERSwgJihBZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSkpOwotCU9ETV9DbW5JbmZvSG9vayhkbV9vZG0sIE9ETV9DTU5JTkZPX0JXLCAmKGhhbF9kYXRhLT5DdXJyZW50Q2hhbm5lbEJXKSk7Ci0JT0RNX0NtbkluZm9Ib29rKGRtX29kbSwgT0RNX0NNTklORk9fQ0hOTCwgJihoYWxfZGF0YS0+Q3VycmVudENoYW5uZWwpKTsKLQlPRE1fQ21uSW5mb0hvb2soZG1fb2RtLCBPRE1fQ01OSU5GT19ORVRfQ0xPU0VELCAmKEFkYXB0ZXItPm5ldF9jbG9zZWQpKTsKLQlPRE1fQ21uSW5mb0hvb2soZG1fb2RtLCBPRE1fQ01OSU5GT19NUF9NT0RFLCAmKEFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5tcF9tb2RlKSk7Ci0JT0RNX0NtbkluZm9Ib29rKGRtX29kbSwgT0RNX0NNTklORk9fU0NBTiwgJihwbWxtZXByaXYtPmJTY2FuSW5Qcm9jZXNzKSk7Ci0JT0RNX0NtbkluZm9Ib29rKGRtX29kbSwgT0RNX0NNTklORk9fUE9XRVJfU0FWSU5HLCAmKHB3cmN0cmxwcml2LT5icG93ZXJfc2F2aW5nKSk7Ci0JT0RNX0NtbkluZm9Jbml0KGRtX29kbSwgT0RNX0NNTklORk9fUkZfQU5URU5OQV9UWVBFLCBoYWxfZGF0YS0+VFJ4QW50RGl2VHlwZSk7CisJZG1fb2RtLT5wTnVtVHhCeXRlc1VuaWNhc3QgPSAmQWRhcHRlci0+eG1pdHByaXYudHhfYnl0ZXM7CisJZG1fb2RtLT5wTnVtUnhCeXRlc1VuaWNhc3QgPSAmQWRhcHRlci0+cmVjdnByaXYucnhfYnl0ZXM7CisJZG1fb2RtLT5wV2lyZWxlc3NNb2RlID0gJnBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZTsKKwlkbV9vZG0tPnBTZWNDaE9mZnNldCA9ICZoYWxfZGF0YS0+bkN1cjQwTWh6UHJpbWVTQzsKKwlkbV9vZG0tPnBTZWN1cml0eSA9ICh1OCAqKSZBZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobTsKKwlkbV9vZG0tPnBCYW5kV2lkdGggPSAodTggKikmaGFsX2RhdGEtPkN1cnJlbnRDaGFubmVsQlc7CisJZG1fb2RtLT5wQ2hhbm5lbCA9ICZoYWxfZGF0YS0+Q3VycmVudENoYW5uZWw7CisJZG1fb2RtLT5wYk5ldF9jbG9zZWQgPSAoYm9vbCAqKSZBZGFwdGVyLT5uZXRfY2xvc2VkOworCWRtX29kbS0+bXBfbW9kZSA9ICZBZGFwdGVyLT5yZWdpc3RyeXByaXYubXBfbW9kZTsKKwlkbV9vZG0tPnBiU2NhbkluUHJvY2VzcyA9IChib29sICopJnBtbG1lcHJpdi0+YlNjYW5JblByb2Nlc3M7CisJZG1fb2RtLT5wYlBvd2VyU2F2aW5nID0gKGJvb2wgKikmcHdyY3RybHByaXYtPmJwb3dlcl9zYXZpbmc7CisJZG1fb2RtLT5BbnREaXZUeXBlID0gaGFsX2RhdGEtPlRSeEFudERpdlR5cGU7CisKKwkvKiAgVHggcG93ZXIgdHJhY2tpbmcgQkIgc3dpbmcgdGFibGUuICovCisJLyogIFRoZSBiYXNlIGluZGV4ID0gMTIuICsoKDEyLW4pLzIpZEIgMTN+Pz8gPSBkZWNyZWFzZSB0eCBwd3IgYnkgLSgobi0xMikvMilkQiAqLworCWRtX29kbS0+QmJTd2luZ0lkeE9mZG0gPSAxMjsgLyogIFNldCBkZWZhbHV0IHZhbHVlIGFzIGluZGV4IDEyLiAqLworCWRtX29kbS0+QmJTd2luZ0lkeE9mZG1DdXJyZW50ID0gMTI7CisJZG1fb2RtLT5CYlN3aW5nRmxhZ09mZG0gPSBmYWxzZTsKIAogCWZvciAoaSA9IDA7IGkgPCBOVU1fU1RBOyBpKyspCiAJCU9ETV9DbW5JbmZvUHRyQXJyYXlIb29rKGRtX29kbSwgT0RNX0NNTklORk9fU1RBX1NUQVRVUywgaSwgTlVMTCk7CkBAIC0xMzAsMjMgKzEyNiwxOSBAQAogCiB2b2lkIHJ0bDgxODhlX0luaXRIYWxEbShzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJmhhbF9kYXRhLT5kbXByaXY7Ci0Jc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICYoaGFsX2RhdGEtPm9kbXByaXYpOworCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJkFkYXB0ZXItPkhhbERhdGEtPmRtcHJpdjsKKwlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJihBZGFwdGVyLT5IYWxEYXRhLT5vZG1wcml2KTsKIAogCWRtX0luaXRHUElPU2V0dGluZyhBZGFwdGVyKTsKIAlwZG1wcml2LT5ETV9UeXBlID0gRE1fVHlwZV9CeURyaXZlcjsKIAlwZG1wcml2LT5ETUZsYWcgPSBEWU5BTUlDX0ZVTkNfRElTQUJMRTsKIAlVcGRhdGVfT0RNX0NvbUluZm9fODhFKEFkYXB0ZXIpOwogCU9ETV9ETUluaXQoZG1fb2RtKTsKLQlBZGFwdGVyLT5maXhfcmF0ZSA9IDB4RkY7CiB9CiAKLXZvaWQgcnRsODE4OGVfSGFsRG1XYXRjaERvZyhzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKK3ZvaWQgcnR3X2hhbF9kbV93YXRjaGRvZyhzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKIHsKLQlib29sIGZ3X3BzX2F3YWtlID0gdHJ1ZTsKIAl1OCBod19pbml0X2NvbXBsZXRlZCA9IGZhbHNlOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gTlVMTDsKIAl1OCBiTGlua2VkID0gZmFsc2U7CiAKQEAgLTE1NSwxMyArMTQ3LDYgQEAKIAlpZiAoIWh3X2luaXRfY29tcGxldGVkKQogCQlnb3RvIHNraXBfZG07CiAKLQlydHdfaGFsX2dldF9od3JlZyhBZGFwdGVyLCBIV19WQVJfRldMUFNfUkZfT04sICh1OCAqKSgmZndfcHNfYXdha2UpKTsKLQotCS8qICBGdyBpcyB1bmRlciBwMnAgcG93ZXJzYXZpbmcgbW9kZSwgZHJpdmVyIHNob3VsZCBzdG9wIGR5bmFtaWMgbWVjaGFuaXNtLiAqLwotCS8qICBtb2RpZmVkIGJ5IHRob21hcy4gMjAxMS4wNi4xMS4gKi8KLQlpZiAoQWRhcHRlci0+d2RpbmZvLnAycF9wc19tb2RlKQotCQlmd19wc19hd2FrZSA9IGZhbHNlOwotCiAJLyogT0RNICovCiAJcG1sbWVwcml2ID0gJkFkYXB0ZXItPm1sbWVwcml2OwogCkBAIC0xNzUsMTkgKzE2MCwxOCBAQAogCQkJYkxpbmtlZCA9IHRydWU7CiAJfQogCi0JT0RNX0NtbkluZm9VcGRhdGUoJmhhbF9kYXRhLT5vZG1wcml2LCBPRE1fQ01OSU5GT19MSU5LLCBiTGlua2VkKTsKLQlPRE1fRE1XYXRjaGRvZygmaGFsX2RhdGEtPm9kbXByaXYpOworCUFkYXB0ZXItPkhhbERhdGEtPm9kbXByaXYuYkxpbmtlZCA9IGJMaW5rZWQ7CisJT0RNX0RNV2F0Y2hkb2coJkFkYXB0ZXItPkhhbERhdGEtPm9kbXByaXYpOwogc2tpcF9kbToKIAkvKiAgQ2hlY2sgR1BJTyB0byBkZXRlcm1pbmUgY3VycmVudCBSRiBvbi9vZmYgYW5kIFBiYyBzdGF0dXMuICovCiAJLyogIENoZWNrIEhhcmR3YXJlIFJhZGlvIE9OL09GRiBvciBub3QgKi8KIAlyZXR1cm47CiB9CiAKLXZvaWQgcnRsODE4OGVfaW5pdF9kbV9wcml2KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQordm9pZCBydHdfaGFsX2RtX2luaXQoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZoYWxfZGF0YS0+ZG1wcml2OwotCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpwb2RtcHJpdiA9ICZoYWxfZGF0YS0+b2RtcHJpdjsKKwlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZBZGFwdGVyLT5IYWxEYXRhLT5kbXByaXY7CisJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBvZG1wcml2ID0gJkFkYXB0ZXItPkhhbERhdGEtPm9kbXByaXY7CiAKIAltZW1zZXQocGRtcHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBkbV9wcml2KSk7CiAJSW5pdF9PRE1fQ29tSW5mb184OEUoQWRhcHRlcik7CkBAIC0xOTYsMTEgKzE4MCw5IEBACiAKIC8qICBBZGQgbmV3IGZ1bmN0aW9uIHRvIHJlc2V0IHRoZSBzdGF0ZSBvZiBhbnRlbm5hIGRpdmVyc2l0eSBiZWZvcmUgbGluay4gKi8KIC8qICBDb21wYXJlIFJTU0kgZm9yIGRlY2lkaW5nIGFudGVubmEgKi8KLXZvaWQgQW50RGl2Q29tcGFyZTgxODhFKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqZHN0LCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqc3JjKQordm9pZCBydHdfaGFsX2FudGRpdl9yc3NpX2NvbXBhcmVkKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqZHN0LCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqc3JjKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQlpZiAoMCAhPSBoYWxfZGF0YS0+QW50RGl2Q2ZnKSB7CisJaWYgKDAgIT0gQWRhcHRlci0+SGFsRGF0YS0+QW50RGl2Q2ZnKSB7CiAJCS8qIHNlbGVjdCBvcHRpbXVtX2FudGVubmEgZm9yIGJlZm9yZSBsaW5rZWQgPT5Gb3IgYW50ZW5uYSBkaXZlcnNpdHkgKi8KIAkJaWYgKGRzdC0+UnNzaSA+PSAgc3JjLT5Sc3NpKSB7Lyoga2VlcCBvcmcgcGFyYW1ldGVyICovCiAJCQlzcmMtPlJzc2kgPSBkc3QtPlJzc2k7CkBAIC0yMTAsMTUgKzE5MiwxNCBAQAogfQogCiAvKiAgQWRkIG5ldyBmdW5jdGlvbiB0byByZXNldCB0aGUgc3RhdGUgb2YgYW50ZW5uYSBkaXZlcnNpdHkgYmVmb3JlIGxpbmsuICovCi11OCBBbnREaXZCZWZvcmVMaW5rODE4OEUoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCit1OCBydHdfaGFsX2FudGRpdl9iZWZvcmVfbGlua2VkKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICZoYWxfZGF0YS0+b2RtcHJpdjsKKwlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJkFkYXB0ZXItPkhhbERhdGEtPm9kbXByaXY7CiAJc3RydWN0IHN3X2FudF9zd2l0Y2ggKmRtX3N3YXRfdGJsID0gJmRtX29kbS0+RE1fU1dBVF9UYWJsZTsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmKEFkYXB0ZXItPm1sbWVwcml2KTsKIAogCS8qICBDb25kaXRpb24gdGhhdCBkb2VzIG5vdCBuZWVkIHRvIHVzZSBhbnRlbm5hIGRpdmVyc2l0eS4gKi8KLQlpZiAoaGFsX2RhdGEtPkFudERpdkNmZyA9PSAwKQorCWlmIChBZGFwdGVyLT5IYWxEYXRhLT5BbnREaXZDZmcgPT0gMCkKIAkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2hhbF9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9oYWxfaW5pdC5jCmluZGV4IDBiNDQ0ZmQuLjM4NWJjMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2hhbF9pbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfaGFsX2luaXQuYwpAQCAtMTA4LDI4ICsxMDgsMjQgQEAKIAogdm9pZCBydGw4MTg4ZV9Jbml0aWFsaXplRmlybXdhcmVWYXJzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQogCS8qICBJbml0IEZ3IExQUyByZWxhdGVkLiAqLwogCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5iRndDdXJyZW50SW5QU01vZGUgPSBmYWxzZTsKIAogCS8qICBJbml0IEgyQyBjb3VudGVyLiBieSB0eW5saS4gMjAwOS4xMi4wOS4gKi8KLQlwSGFsRGF0YS0+TGFzdEhNRUJveE51bSA9IDA7CisJcGFkYXB0ZXItPkhhbERhdGEtPkxhc3RITUVCb3hOdW0gPSAwOwogfQogCi1zdGF0aWMgdm9pZCBydGw4MTg4ZV9mcmVlX2hhbF9kYXRhKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKK3ZvaWQgcnR3X2hhbF9mcmVlX2RhdGEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewogCWtmcmVlKHBhZGFwdGVyLT5IYWxEYXRhKTsKIAlwYWRhcHRlci0+SGFsRGF0YSA9IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIFJlYWRDaGlwVmVyc2lvbjgxODhFKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKK3ZvaWQgcnR3X2hhbF9yZWFkX2NoaXBfdmVyc2lvbihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJdTMyCQkJCXZhbHVlMzI7CiAJc3RydWN0IEhBTF9WRVJTSU9OCQlDaGlwVmVyc2lvbjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKnBIYWxEYXRhOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqcEhhbERhdGEgPSBwYWRhcHRlci0+SGFsRGF0YTsKIAogCXZhbHVlMzIgPSB1c2JfcmVhZDMyKHBhZGFwdGVyLCBSRUdfU1lTX0NGRyk7CiAJQ2hpcFZlcnNpb24uQ2hpcFR5cGUgPSAoKHZhbHVlMzIgJiBSVExfSUQpID8gVEVTVF9DSElQIDogTk9STUFMX0NISVApOwpAQCAtMTM5LDE2ICsxMzUsMTMgQEAKIAlkdW1wX2NoaXBfaW5mbyhDaGlwVmVyc2lvbik7CiAKIAlwSGFsRGF0YS0+VmVyc2lvbklEID0gQ2hpcFZlcnNpb247Ci0JcEhhbERhdGEtPnJmX3R5cGUgPSBSRl8xVDFSOwogCXBIYWxEYXRhLT5OdW1Ub3RhbFJGUGF0aCA9IDE7Ci0KLQlNU0dfODhFKCJSRl9UeXBlIGlzICV4ISFcbiIsIHBIYWxEYXRhLT5yZl90eXBlKTsKIH0KIAotc3RhdGljIHZvaWQgcnRsODE4OGVfU2V0SGFsT0RNVmFyKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCBlbnVtIGhhbF9vZG1fdmFyaWFibGUgZVZhcmlhYmxlLCB2b2lkICpwVmFsdWUxLCBib29sIGJTZXQpCit2b2lkIHJ0d19oYWxfc2V0X29kbV92YXIoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIsIGVudW0gaGFsX29kbV92YXJpYWJsZSBlVmFyaWFibGUsIHZvaWQgKnBWYWx1ZTEsIGJvb2wgYlNldCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpwb2RtcHJpdiA9ICZwSGFsRGF0YS0+b2RtcHJpdjsKKwlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcG9kbXByaXYgPSAmQWRhcHRlci0+SGFsRGF0YS0+b2RtcHJpdjsKKwogCXN3aXRjaCAoZVZhcmlhYmxlKSB7CiAJY2FzZSBIQUxfT0RNX1NUQV9JTkZPOgogCQl7CkBAIC0xNjUsMTcgKzE1OCwxNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgSEFMX09ETV9QMlBfU1RBVEU6Ci0JCQlPRE1fQ21uSW5mb1VwZGF0ZShwb2RtcHJpdiwgT0RNX0NNTklORk9fV0lGSV9ESVJFQ1QsIGJTZXQpOworCQlwb2RtcHJpdi0+YldJRklfRGlyZWN0ID0gYlNldDsKIAkJYnJlYWs7CiAJY2FzZSBIQUxfT0RNX1dJRklfRElTUExBWV9TVEFURToKLQkJCU9ETV9DbW5JbmZvVXBkYXRlKHBvZG1wcml2LCBPRE1fQ01OSU5GT19XSUZJX0RJU1BMQVksIGJTZXQpOworCQlwb2RtcHJpdi0+YldJRklfRGlzcGxheSA9IGJTZXQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KIH0KIAotc3RhdGljIHZvaWQgaGFsX25vdGNoX2ZpbHRlcl84MTg4ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgYm9vbCBlbmFibGUpCit2b2lkIHJ0d19oYWxfbm90Y2hfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBib29sIGVuYWJsZSkKIHsKIAlpZiAoZW5hYmxlKSB7CiAJCURCR184OEUoIkVuYWJsZSBub3RjaCBmaWx0ZXJcbiIpOwpAQCAtMTg1LDMyICsxNzgsNiBAQAogCQl1c2Jfd3JpdGU4KGFkYXB0ZXIsIHJPRkRNMF9SeERTUCsxLCB1c2JfcmVhZDgoYWRhcHRlciwgck9GRE0wX1J4RFNQKzEpICYgfkJJVCgxKSk7CiAJfQogfQotdm9pZCBydGw4MTg4ZV9zZXRfaGFsX29wcyhzdHJ1Y3QgaGFsX29wcyAqcEhhbEZ1bmMpCi17Ci0JcEhhbEZ1bmMtPmZyZWVfaGFsX2RhdGEgPSAmcnRsODE4OGVfZnJlZV9oYWxfZGF0YTsKLQotCXBIYWxGdW5jLT5kbV9pbml0ID0gJnJ0bDgxODhlX2luaXRfZG1fcHJpdjsKLQotCXBIYWxGdW5jLT5yZWFkX2NoaXBfdmVyc2lvbiA9ICZSZWFkQ2hpcFZlcnNpb244MTg4RTsKLQotCXBIYWxGdW5jLT5zZXRfYndtb2RlX2hhbmRsZXIgPSAmcGh5X3NldF9id19tb2RlOwotCXBIYWxGdW5jLT5zZXRfY2hhbm5lbF9oYW5kbGVyID0gJnBoeV9zd19jaG5sOwotCi0JcEhhbEZ1bmMtPmhhbF9kbV93YXRjaGRvZyA9ICZydGw4MTg4ZV9IYWxEbVdhdGNoRG9nOwotCi0JcEhhbEZ1bmMtPkFkZF9SYXRlQVRpZCA9ICZydGw4MTg4ZV9BZGRfUmF0ZUFUaWQ7Ci0KLQlwSGFsRnVuYy0+QW50RGl2QmVmb3JlTGlua0hhbmRsZXIgPSAmQW50RGl2QmVmb3JlTGluazgxODhFOwotCXBIYWxGdW5jLT5BbnREaXZDb21wYXJlSGFuZGxlciA9ICZBbnREaXZDb21wYXJlODE4OEU7Ci0JcEhhbEZ1bmMtPnJlYWRfcmZyZWcgPSAmcGh5X3F1ZXJ5X3JmX3JlZzsKLQotCXBIYWxGdW5jLT5zcmVzZXRfaW5pdF92YWx1ZSA9ICZzcmVzZXRfaW5pdF92YWx1ZTsKLQlwSGFsRnVuYy0+c3Jlc2V0X2dldF93aWZpX3N0YXR1cyAgPSAmc3Jlc2V0X2dldF93aWZpX3N0YXR1czsKLQotCXBIYWxGdW5jLT5TZXRIYWxPRE1WYXJIYW5kbGVyID0gJnJ0bDgxODhlX1NldEhhbE9ETVZhcjsKLQotCXBIYWxGdW5jLT5oYWxfbm90Y2hfZmlsdGVyID0gJmhhbF9ub3RjaF9maWx0ZXJfODE4OGU7Ci19CiAKIC8qICAqLwogLyogICovCkBAIC01MDEsNyArNDY4LDcgQEAKIAogdm9pZCBIYWxfUmVhZFR4UG93ZXJJbmZvODhFKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggKlBST01Db250ZW50LCBib29sIEF1dG9Mb2FkRmFpbCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKnBIYWxEYXRhID0gcGFkYXB0ZXItPkhhbERhdGE7CiAJc3RydWN0IHR4cG93ZXJpbmZvMjRnIHB3ckluZm8yNEc7CiAJdTggcmZQYXRoLCBjaCwgZ3JvdXA7CiAJdTggYkluMjRHLCBUeENvdW50OwpAQCAtNTUzLDcgKzUyMCw3IEBACiAKIHZvaWQgSGFsX0VmdXNlUGFyc2VYdGFsXzgxODhFKHN0cnVjdCBhZGFwdGVyICpwQWRhcHRlciwgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IHBBZGFwdGVyLT5IYWxEYXRhOwogCiAJaWYgKCFBdXRvTG9hZEZhaWwpIHsKIAkJcEhhbERhdGEtPkNyeXN0YWxDYXAgPSBod2luZm9bRUVQUk9NX1hUQUxfODhFXTsKQEAgLTU2Nyw3ICs1MzQsNyBAQAogCiB2b2lkIEhhbF9FZnVzZVBhcnNlQm9hcmRUeXBlODhFKHN0cnVjdCBhZGFwdGVyICpwQWRhcHRlciwgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IHBBZGFwdGVyLT5IYWxEYXRhOwogCiAJaWYgKCFBdXRvTG9hZEZhaWwpCiAJCXBIYWxEYXRhLT5Cb2FyZFR5cGUgPSAoaHdpbmZvW0VFUFJPTV9SRl9CT0FSRF9PUFRJT05fODhFXQpAQCAtNTc5LDcgKzU0Niw3IEBACiAKIHZvaWQgSGFsX0VmdXNlUGFyc2VFRVBST01WZXI4OEUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqaHdpbmZvLCBib29sIEF1dG9Mb2FkRmFpbCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKnBIYWxEYXRhID0gcGFkYXB0ZXItPkhhbERhdGE7CiAKIAlpZiAoIUF1dG9Mb2FkRmFpbCkgewogCQlwSGFsRGF0YS0+RUVQUk9NVmVyc2lvbiA9IGh3aW5mb1tFRVBST01fVkVSU0lPTl84OEVdOwpAQCAtNjA2LDcgKzU3Myw3IEBACiAKIHZvaWQgSGFsX0VmdXNlUGFyc2VDdXN0b21lcklEODhFKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IHBhZGFwdGVyLT5IYWxEYXRhOwogCiAJaWYgKCFBdXRvTG9hZEZhaWwpIHsKIAkJcEhhbERhdGEtPkVFUFJPTUN1c3RvbWVySUQgPSBod2luZm9bRUVQUk9NX0NVU1RPTUVSSURfODhFXTsKQEAgLTYxOSw3ICs1ODYsNyBAQAogCiB2b2lkIEhhbF9SZWFkQW50ZW5uYURpdmVyc2l0eTg4RShzdHJ1Y3QgYWRhcHRlciAqcEFkYXB0ZXIsIHU4ICpQUk9NQ29udGVudCwgYm9vbCBBdXRvTG9hZEZhaWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IHBBZGFwdGVyLT5IYWxEYXRhOwogCXN0cnVjdCByZWdpc3RyeV9wcml2CSpyZWdpc3RyeV9wYXIgPSAmcEFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKIAogCWlmICghQXV0b0xvYWRGYWlsKSB7CkBAIC02NTIsNyArNjE5LDcgQEAKIAogdm9pZCBIYWxfUmVhZFRoZXJtYWxNZXRlcl84OEUoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIsIHU4ICpQUk9NQ29udGVudCwgYm9vbCBBdXRvbG9hZEZhaWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKnBIYWxEYXRhID0gQWRhcHRlci0+SGFsRGF0YTsKIAogCS8qICBUaGVybWFsTWV0ZXIgZnJvbSBFRVBST00gKi8KIAlpZiAoIUF1dG9sb2FkRmFpbCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX3J4ZGVzYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfcnhkZXNjLmMKaW5kZXggZjExMGM5Ni4uZmEyY2ZkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfcnhkZXNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfcnhkZXNjLmMKQEAgLTU3LDEwICs1Nyw5IEBACiAJc2lnbmFsX3N0YXQtPmF2Z192YWwgPSBzaWduYWxfc3RhdC0+dG90YWxfdmFsIC8gc2lnbmFsX3N0YXQtPnRvdGFsX251bTsKIH0KIAotdm9pZCBydGw4MTg4ZV9wcm9jZXNzX3BoeV9pbmZvKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdm9pZCAqcHJmcmFtZSkKK3ZvaWQgcnRsODE4OGVfcHJvY2Vzc19waHlfaW5mbyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCisJCSAgICAgICAgICAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQogewotCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lID0gcHJmcmFtZTsKLQogCS8qICBDaGVjayBSU1NJICovCiAJcHJvY2Vzc19yc3NpKHBhZGFwdGVyLCBwcmVjdmZyYW1lKTsKIAkvKiAgQ2hlY2sgRVZNICovCkBAIC0xNDAsNyArMTM5LDYgQEAKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSBwcmVjdmZyYW1lLT5hZGFwdGVyOwogCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKIAlzdHJ1Y3Qgb2RtX3BoeV9zdGF0dXNfaW5mbyAqcFBIWUluZm8gID0gKHN0cnVjdCBvZG1fcGh5X3N0YXR1c19pbmZvICopKCZwYXR0cmliLT5waHlfaW5mbyk7CiAJdTggKndsYW5oZHI7CiAJc3RydWN0IG9kbV9wZXJfcGt0X2luZm8JcGt0X2luZm87CkBAIC0xODEsNyArMTc5LDggQEAKIAkJcGt0X2luZm8uU3RhdGlvbklEID0gcHN0YS0+bWFjX2lkOwogCXBrdF9pbmZvLlJhdGUgPSBwYXR0cmliLT5tY3NfcmF0ZTsKIAotCU9ETV9QaHlTdGF0dXNRdWVyeSgmcEhhbERhdGEtPm9kbXByaXYsIHBQSFlJbmZvLCAodTggKilwcGh5X3N0YXR1cywgJihwa3RfaW5mbykpOworCU9ETV9QaHlTdGF0dXNRdWVyeSgmcGFkYXB0ZXItPkhhbERhdGEtPm9kbXByaXYsIHBQSFlJbmZvLAorCQkJICAgKHU4ICopcHBoeV9zdGF0dXMsICYocGt0X2luZm8pKTsKIAogCXByZWN2ZnJhbWUtPnBzdGEgPSBOVUxMOwogCWlmIChwa3RfaW5mby5iUGFja2V0TWF0Y2hCU1NJRCAmJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X2xlZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X2xlZC5jCmluZGV4IGQ5ZTY3N2UuLjc4MDY2NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV9sZWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfbGVkLmMKQEAgLTQwLDE0ICs0MCwxMyBAQAogdm9pZCBTd0xlZE9mZihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBMRURfODcxeCAqcExlZCkKIHsKIAl1OAlMZWRDZmc7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7CiAKIAlpZiAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgfHwgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkKQogCQlnb3RvIGV4aXQ7CiAKIAlMZWRDZmcgPSB1c2JfcmVhZDgocGFkYXB0ZXIsIFJFR19MRURDRkcyKTsvKiAweDRFICovCiAKLQlpZiAocEhhbERhdGEtPmJMZWRPcGVuRHJhaW4pIHsKKwlpZiAocGFkYXB0ZXItPkhhbERhdGEtPmJMZWRPcGVuRHJhaW4pIHsKIAkJCS8qICBPcGVuLWRyYWluIGFycmFuZ2VtZW50IGZvciBjb250cm9sbGluZyB0aGUgTEVEKSAqLwogCQlMZWRDZmcgJj0gMHg5MDsgLyogIFNldCB0byBzb2Z0d2FyZSBjb250cm9sLiAqLwogCQl1c2Jfd3JpdGU4KHBhZGFwdGVyLCBSRUdfTEVEQ0ZHMiwgKExlZENmZyB8IEJJVCgzKSkpOwpAQCAtNjYsMjEgKzY1LDIwIEBACiAKIC8qCURlc2NyaXB0aW9uOiAqLwogLyoJCUluaXRpYWxpemUgYWxsIExFRF84NzF4IG9iamVjdHMuICovCi12b2lkIHJ0bDgxODhldV9Jbml0U3dMZWRzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKK3ZvaWQgcnR3X2hhbF9zd19sZWRfaW5pdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJc3RydWN0IGxlZF9wcml2ICpwbGVkcHJpdiA9ICYocGFkYXB0ZXItPmxlZHByaXYpOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAgICpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKIAogCXBsZWRwcml2LT5iUmVnVXNlTGVkID0gdHJ1ZTsKIAlwbGVkcHJpdi0+TGVkQ29udHJvbEhhbmRsZXIgPSBMZWRDb250cm9sODE4OGV1OwotCWhhbGRhdGEtPmJMZWRPcGVuRHJhaW4gPSB0cnVlOworCXBhZGFwdGVyLT5IYWxEYXRhLT5iTGVkT3BlbkRyYWluID0gdHJ1ZTsKIAogCUluaXRMZWQ4NzF4KHBhZGFwdGVyLCAmKHBsZWRwcml2LT5Td0xlZDApKTsKIH0KIAogLyoJRGVzY3JpcHRpb246ICovCiAvKgkJRGVJbml0aWFsaXplIGFsbCBMRURfODE5eFVzYiBvYmplY3RzLiAqLwotdm9pZCBydGw4MTg4ZXVfRGVJbml0U3dMZWRzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKK3ZvaWQgcnR3X2hhbF9zd19sZWRfZGVpbml0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAlzdHJ1Y3QgbGVkX3ByaXYJKmxlZHByaXYgPSAmKHBhZGFwdGVyLT5sZWRwcml2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3JlY3YuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV9yZWN2LmMKaW5kZXggMjU1ZDZmMi4uZDA0OTVhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3JlY3YuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfcmVjdi5jCkBAIC0xMyw2ICsxMyw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgX1JUTDgxODhFVV9SRUNWX0NfCisjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KICNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+CiAjaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+CiAjaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgpAQCAtMjMsNyArMjQsNyBAQAogCiAjaW5jbHVkZSA8cnRsODE4OGVfaGFsLmg+CiAKLWludAlydGw4MTg4ZXVfaW5pdF9yZWN2X3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQoraW50CXJ0d19oYWxfaW5pdF9yZWN2X3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewogCXN0cnVjdCByZWN2X3ByaXYJKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7CiAJaW50CWksIHJlcyA9IF9TVUNDRVNTOwpAQCAtNzIsNiArNzMsNyBAQAogCQkJCQlNQVhfUkVDVkJVRl9TWiArIFJFQ1ZCVUZGX0FMSUdOX1NaLAogCQkJCQlHRlBfS0VSTkVMKTsKIAkJCWlmIChwc2tiKSB7CisJCQkJa21lbWxlYWtfbm90X2xlYWsocHNrYik7CiAJCQkJcHNrYi0+ZGV2ID0gcGFkYXB0ZXItPnBuZXRkZXY7CiAJCQkJdG1wYWRkciA9IChzaXplX3QpcHNrYi0+ZGF0YTsKIAkJCQlhbGlnbm0gPSB0bXBhZGRyICYgKFJFQ1ZCVUZGX0FMSUdOX1NaLTEpOwpAQCAtODcsNyArODksNyBAQAogCXJldHVybiByZXM7CiB9CiAKLXZvaWQgcnRsODE4OGV1X2ZyZWVfcmVjdl9wcml2KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKK3ZvaWQgcnR3X2hhbF9mcmVlX3JlY3ZfcHJpdihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJaW50CWk7CiAJc3RydWN0IHJlY3ZfYnVmCSpwcmVjdmJ1ZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV94bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfeG1pdC5jCmluZGV4IGVjMjFkOGMuLjg1NjUwYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV94bWl0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3htaXQuYwpAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KICNpbmNsdWRlIDxydGw4MTg4ZV9oYWwuaD4KIAotczMyCXJ0bDgxODhldV9pbml0X3htaXRfcHJpdihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCitzMzIgcnR3X2hhbF9pbml0X3htaXRfcHJpdihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCiB7CiAJc3RydWN0IHhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJmFkYXB0LT54bWl0cHJpdjsKIApAQCAtMzMsMTEgKzMzLDcgQEAKIAogc3RhdGljIHU4IHVyYl96ZXJvX3BhY2tldF9jaGsoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBpbnQgc3opCiB7Ci0JdTggc2V0X3R4X2Rlc2Nfb2Zmc2V0OwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7Ci0Jc2V0X3R4X2Rlc2Nfb2Zmc2V0ID0gKCgoc3ogKyBUWERFU0NfU0laRSkgJSAgaGFsZGF0YS0+VXNiQnVsa091dFNpemUpID09IDApID8gMSA6IDA7Ci0KLQlyZXR1cm4gc2V0X3R4X2Rlc2Nfb2Zmc2V0OworCXJldHVybiAhKChzeiArIFRYREVTQ19TSVpFKSAlIGFkYXB0LT5IYWxEYXRhLT5Vc2JCdWxrT3V0U2l6ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJ0bDgxODhldV9jYWxfdHhkZXNjX2Noa3N1bShzdHJ1Y3QgdHhfZGVzYwkqcHR4ZGVzYykKQEAgLTE3NSw3ICsxNzEsNyBAQAogCXU4IGRhdGFfcmF0ZSwgcHdyX3N0YXR1cywgb2Zmc2V0OwogCXN0cnVjdCBhZGFwdGVyCQkqYWRhcHQgPSBweG1pdGZyYW1lLT5wYWRhcHRlcjsKIAlzdHJ1Y3QgcGt0X2F0dHJpYgkqcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqb2RtcHJpdiA9ICZhZGFwdC0+SGFsRGF0YS0+b2RtcHJpdjsKIAlzdHJ1Y3QgdHhfZGVzYwkqcHR4ZGVzYyA9IChzdHJ1Y3QgdHhfZGVzYyAqKXBtZW07CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJmFkYXB0LT5tbG1lZXh0cHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwpAQCAtMjU5LDEyICsyNTUsMTIgQEAKIAkJCXB0eGRlc2MtPnR4ZHc1IHw9IGNwdV90b19sZTMyKDB4MDAwMWZmMDApOy8qIERBVEEvUlRTICBSYXRlIEZCIExNVCAqLwogCiAJCQlpZiAocGF0dHJpYi0+aHRfZW4pIHsKLQkJCQlpZiAoT0RNX1JBX0dldFNob3J0R0lfODE4OEUoJmhhbGRhdGEtPm9kbXByaXYsIHBhdHRyaWItPm1hY19pZCkpCisJCQkJaWYgKE9ETV9SQV9HZXRTaG9ydEdJXzgxODhFKG9kbXByaXYsIHBhdHRyaWItPm1hY19pZCkpCiAJCQkJCXB0eGRlc2MtPnR4ZHc1IHw9IGNwdV90b19sZTMyKFNHSSk7LyogU0dJICovCiAJCQl9Ci0JCQlkYXRhX3JhdGUgPSBPRE1fUkFfR2V0RGVjaXNpb25SYXRlXzgxODhFKCZoYWxkYXRhLT5vZG1wcml2LCBwYXR0cmliLT5tYWNfaWQpOworCQkJZGF0YV9yYXRlID0gT0RNX1JBX0dldERlY2lzaW9uUmF0ZV84MTg4RShvZG1wcml2LCBwYXR0cmliLT5tYWNfaWQpOwogCQkJcHR4ZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoZGF0YV9yYXRlICYgMHgzRik7Ci0JCQlwd3Jfc3RhdHVzID0gT0RNX1JBX0dldEh3UHdyU3RhdHVzXzgxODhFKCZoYWxkYXRhLT5vZG1wcml2LCBwYXR0cmliLT5tYWNfaWQpOworCQkJcHdyX3N0YXR1cyA9IE9ETV9SQV9HZXRId1B3clN0YXR1c184MTg4RShvZG1wcml2LCBwYXR0cmliLT5tYWNfaWQpOwogCQkJcHR4ZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoKHB3cl9zdGF0dXMgJiAweDcpIDw8IFBXUl9TVEFUVVNfU0hUKTsKIAkJfSBlbHNlIHsKIAkJCS8qICBFQVAgZGF0YSBwYWNrZXQgYW5kIEFSUCBwYWNrZXQgYW5kIERIQ1AuICovCkBAIC0zMzIsOCArMzI4LDcgQEAKIAkJcHR4ZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoSFdfU1NOKTsJLyogIEh3IHNldCBzZXF1ZW5jZSBudW1iZXIgKi8KIAl9CiAKLQlydGw4OGV1X2RtX3NldF90eF9hbnRfYnlfdHhfaW5mbygmaGFsZGF0YS0+b2RtcHJpdiwgcG1lbSwKLQkJCQkJIHBhdHRyaWItPm1hY19pZCk7CisJcnRsODhldV9kbV9zZXRfdHhfYW50X2J5X3R4X2luZm8ob2RtcHJpdiwgcG1lbSwgcGF0dHJpYi0+bWFjX2lkKTsKIAogCXJ0bDgxODhldV9jYWxfdHhkZXNjX2Noa3N1bShwdHhkZXNjKTsKIAlfZGJnX2R1bXBfdHhfaW5mbyhhZGFwdCwgcHhtaXRmcmFtZS0+ZnJhbWVfdGFnLCBwdHhkZXNjKTsKQEAgLTM4Nyw3ICszODIsNyBAQAogCQl9CiAJCWZmX2h3YWRkciA9IHJ0d19nZXRfZmZfaHdhZGRyKHB4bWl0ZnJhbWUpOwogCi0JCWlubmVyX3JldCA9IHVzYl93cml0ZV9wb3J0KGFkYXB0LCBmZl9od2FkZHIsIHdfc3osICh1bnNpZ25lZCBjaGFyICopcHhtaXRidWYpOworCQlpbm5lcl9yZXQgPSB1c2Jfd3JpdGVfcG9ydChhZGFwdCwgZmZfaHdhZGRyLCB3X3N6LCBweG1pdGJ1Zik7CiAKIAkJcnR3X2NvdW50X3R4X3N0YXRzKGFkYXB0LCBweG1pdGZyYW1lLCBzeik7CiAKQEAgLTQyNCwxMSArNDE5LDExIEBACiAJcmV0dXJuIGxlbjsKIH0KIAotczMyIHJ0bDgxODhldV94bWl0ZnJhbWVfY29tcGxldGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsIHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYpCitzMzIgcnRsODE4OGV1X3htaXRmcmFtZV9jb21wbGV0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdikKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwogCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lID0gTlVMTDsKIAlzdHJ1Y3QgeG1pdF9mcmFtZSAqcGZpcnN0ZnJhbWUgPSBOVUxMOworCXN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWY7CiAKIAkvKiAgYWdncmVnYXRlIHZhcmlhYmxlICovCiAJc3RydWN0IGh3X3htaXQgKnBod3htaXQ7CkBAIC00NDEsNyArNDM2LDcgQEAKIAl1MzIgcGJ1Zl90YWlsOwkvKiAgbGFzdCBwa3QgdGFpbCAqLwogCXUzMiBsZW47CS8qICBwYWNrZXQgbGVuZ3RoLCBleGNlcHQgVFhERVNDX1NJWkUgYW5kIFBLVF9PRkZTRVQgKi8KIAotCXUzMiBidWxrc2l6ZSA9IGhhbGRhdGEtPlVzYkJ1bGtPdXRTaXplOworCXUzMiBidWxrc2l6ZSA9IGFkYXB0LT5IYWxEYXRhLT5Vc2JCdWxrT3V0U2l6ZTsKIAl1OCBkZXNjX2NudDsKIAl1MzIgYnVsa3B0cjsKIApAQCAtNDUwLDEyICs0NDUsOSBAQAogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4MTkyY194bWl0X2NfLCBfZHJ2X2luZm9fLCAoIit4bWl0ZnJhbWVfY29tcGxldGVcbiIpKTsKIAotCS8qICBjaGVjayB4bWl0YnVmZmVyIGlzIG9rICovCi0JaWYgKHB4bWl0YnVmID09IE5VTEwpIHsKLQkJcHhtaXRidWYgPSBydHdfYWxsb2NfeG1pdGJ1ZihweG1pdHByaXYpOwotCQlpZiAocHhtaXRidWYgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQl9CisJcHhtaXRidWYgPSBydHdfYWxsb2NfeG1pdGJ1ZihweG1pdHByaXYpOworCWlmIChweG1pdGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gZmFsc2U7CiAKIAkvKiAzIDEuIHBpY2sgdXAgZmlyc3QgZnJhbWUgKi8KIAlydHdfZnJlZV94bWl0ZnJhbWUocHhtaXRwcml2LCBweG1pdGZyYW1lKTsKQEAgLTU2NSw3ICs1NTcsNyBAQAogCiAJCWlmIChwYnVmIDwgYnVsa3B0cikgewogCQkJZGVzY19jbnQrKzsKLQkJCWlmIChkZXNjX2NudCA9PSBoYWxkYXRhLT5Vc2JUeEFnZ0Rlc2NOdW0pCisJCQlpZiAoZGVzY19jbnQgPT0gYWRhcHQtPkhhbERhdGEtPlVzYlR4QWdnRGVzY051bSkKIAkJCQlicmVhazsKIAkJfSBlbHNlIHsKIAkJCWRlc2NfY250ID0gMDsKQEAgLTU5NCw3ICs1ODYsNyBAQAogCiAJLyogMyA0LiB3cml0ZSB4bWl0IGJ1ZmZlciB0byBVU0IgRklGTyAqLwogCWZmX2h3YWRkciA9IHJ0d19nZXRfZmZfaHdhZGRyKHBmaXJzdGZyYW1lKTsKLQl1c2Jfd3JpdGVfcG9ydChhZGFwdCwgZmZfaHdhZGRyLCBwYnVmX3RhaWwsICh1OCAqKXB4bWl0YnVmKTsKKwl1c2Jfd3JpdGVfcG9ydChhZGFwdCwgZmZfaHdhZGRyLCBwYnVmX3RhaWwsIHB4bWl0YnVmKTsKIAogCS8qIDMgNS4gdXBkYXRlIHN0YXRpc2l0YyAqLwogCXBidWZfdGFpbCAtPSAocGZpcnN0ZnJhbWUtPmFnZ19udW0gKiBUWERFU0NfU0laRSk7CkBAIC02MDcsMjQgKzU5OSwxMiBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgczMyIHhtaXRmcmFtZV9kaXJlY3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQlzMzIgcmVzOwotCi0JcmVzID0gcnR3X3htaXRmcmFtZV9jb2FsZXNjZShhZGFwdCwgcHhtaXRmcmFtZS0+cGt0LCBweG1pdGZyYW1lKTsKLQlpZiAocmVzID09IF9TVUNDRVNTKQotCQlydHdfZHVtcF94ZnJhbWUoYWRhcHQsIHB4bWl0ZnJhbWUpOwotCWVsc2UKLQkJREJHXzg4RSgiPT0+ICVzIHhtaXRmcmFtZV9jb2Fsc2VjZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmVzOwotfQotCiAvKgogICogUmV0dXJuCiAgKgl0cnVlCWR1bXAgcGFja2V0IGRpcmVjdGx5CiAgKglmYWxzZQllbnF1ZXVlIHBhY2tldAogICovCi1zdGF0aWMgczMyIHByZV94bWl0ZnJhbWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKK3MzMiBydHdfaGFsX3htaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKIHsKIAlzMzIgcmVzOwogCXN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYgPSBOVUxMOwpAQCAtNjUwLDcgKzYzMCwxMiBAQAogCXB4bWl0ZnJhbWUtPmJ1Zl9hZGRyID0gcHhtaXRidWYtPnBidWY7CiAJcHhtaXRidWYtPnByaXZfZGF0YSA9IHB4bWl0ZnJhbWU7CiAKLQlpZiAoeG1pdGZyYW1lX2RpcmVjdChhZGFwdCwgcHhtaXRmcmFtZSkgIT0gX1NVQ0NFU1MpIHsKKwlyZXMgPSBydHdfeG1pdGZyYW1lX2NvYWxlc2NlKGFkYXB0LCBweG1pdGZyYW1lLT5wa3QsIHB4bWl0ZnJhbWUpOworCisJaWYgKHJlcyA9PSBfU1VDQ0VTUykgeworCQlydHdfZHVtcF94ZnJhbWUoYWRhcHQsIHB4bWl0ZnJhbWUpOworCX0gZWxzZSB7CisJCURCR184OEUoIj09PiAlcyB4bWl0ZnJhbWVfY29hbHNlY2UgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCXJ0d19mcmVlX3htaXRidWYocHhtaXRwcml2LCBweG1pdGJ1Zik7CiAJCXJ0d19mcmVlX3htaXRmcmFtZShweG1pdHByaXYsIHB4bWl0ZnJhbWUpOwogCX0KQEAgLTY3NCwyMCArNjU5LDEwIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zMzIgcnRsODE4OGV1X21nbnRfeG1pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lKQorczMyIHJ0d19oYWxfbWdudF94bWl0KHN0cnVjdCBhZGFwdGVyICphZGFwdCwgc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWUpCiB7CiAJc3RydWN0IHhtaXRfcHJpdiAqeG1pdHByaXYgPSAmYWRhcHQtPnhtaXRwcml2OwogCiAJcnRsODhldV9tb25feG1pdF9ob29rKGFkYXB0LT5wbW9uZGV2LCBwbWdudGZyYW1lLCB4bWl0cHJpdi0+ZnJhZ19sZW4pOwogCXJldHVybiBydHdfZHVtcF94ZnJhbWUoYWRhcHQsIHBtZ250ZnJhbWUpOwogfQotCi0vKgotICogUmV0dXJuCi0gKgl0cnVlCWR1bXAgcGFja2V0IGRpcmVjdGx5IG9rCi0gKglmYWxzZQl0ZW1wb3JhcnkgY2FuJ3QgdHJhbnNtaXQgcGFja2V0cyB0byBoYXJkd2FyZQotICovCi1zMzIgcnRsODE4OGV1X2hhbF94bWl0KHN0cnVjdCBhZGFwdGVyICphZGFwdCwgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0JcmV0dXJuIHByZV94bWl0ZnJhbWUoYWRhcHQsIHB4bWl0ZnJhbWUpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvdXNiX2hhbGluaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3VzYl9oYWxpbml0LmMKaW5kZXggMzYzZjNhMy4uNzY5MmNhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvdXNiX2hhbGluaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC91c2JfaGFsaW5pdC5jCkBAIC0yMSwxNCArMjEsMTMgQEAKICNpbmNsdWRlIDxydGw4MTg4ZV9oYWwuaD4KICNpbmNsdWRlIDxydGw4MTg4ZV9sZWQuaD4KICNpbmNsdWRlIDxydHdfaW9sLmg+Ci0jaW5jbHVkZSA8dXNiX2hhbC5oPgogI2luY2x1ZGUgPHBoeS5oPgogCiAjZGVmaW5lCQlIQUxfQkJfRU5BQkxFCQkxCiAKIHN0YXRpYyB2b2lkIF9Db25maWdOb3JtYWxDaGlwT3V0RVBfODE4OEUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1OCBOdW1PdXRQaXBlKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YQk9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gYWRhcHQtPkhhbERhdGE7CiAKIAlzd2l0Y2ggKE51bU91dFBpcGUpIHsKIAljYXNlCTM6CkBAIC01MSwxMyArNTAsMTIgQEAKIAogc3RhdGljIGJvb2wgSGFsVXNiU2V0UXVldWVQaXBlTWFwcGluZzgxODhFVXNiKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggTnVtSW5QaXBlLCB1OCBOdW1PdXRQaXBlKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YQk9IEdFVF9IQUxfREFUQShhZGFwdCk7CiAJYm9vbAkJCXJlc3VsdAkJPSBmYWxzZTsKIAogCV9Db25maWdOb3JtYWxDaGlwT3V0RVBfODE4OEUoYWRhcHQsIE51bU91dFBpcGUpOwogCiAJLyogIE5vcm1hbCBjaGlwIHdpdGggb25lIElOIGFuZCBvbmUgT1VUIGRvZXNuJ3QgaGF2ZSBpbnRlcnJ1cHQgSU4gRVAuICovCi0JaWYgKGhhbGRhdGEtPk91dEVwTnVtYmVyID09IDEpIHsKKwlpZiAoYWRhcHQtPkhhbERhdGEtPk91dEVwTnVtYmVyID09IDEpIHsKIAkJaWYgKE51bUluUGlwZSAhPSAxKQogCQkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC02OSw5ICs2Nyw5IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHZvaWQgcnRsODE4OGV1X2ludGVyZmFjZV9jb25maWd1cmUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQordm9pZCBydHdfaGFsX2NoaXBfY29uZmlndXJlKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEJPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCXN0cnVjdCBkdm9ial9wcml2CSpwZHZvYmpwcml2ID0gYWRhcHRlcl90b19kdm9iaihhZGFwdCk7CiAKIAlpZiAocGR2b2JqcHJpdi0+aXNoaWdoc3BlZWQpCkBAIC05NCwxMiArOTIsMTEgQEAKIAkJCQlwZHZvYmpwcml2LT5SdE51bUluUGlwZXMsIHBkdm9ianByaXYtPlJ0TnVtT3V0UGlwZXMpOwogfQogCi1zdGF0aWMgdTMyIHJ0bDgxODhldV9Jbml0UG93ZXJPbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCit1MzIgcnR3X2hhbF9wb3dlcl9vbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCiB7CiAJdTE2IHZhbHVlMTY7CiAJLyogIEhXIFBvd2VyIG9uIHNlcXVlbmNlICovCi0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhCT0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQlpZiAoaGFsZGF0YS0+Yk1hY1B3ckN0cmxPbikKKwlpZiAoYWRhcHQtPkhhbERhdGEtPmJNYWNQd3JDdHJsT24pCiAJCXJldHVybiBfU1VDQ0VTUzsKIAogCWlmICghcnRsODhldV9wd3JzZXFjbWRwYXJzaW5nKGFkYXB0LCBQV1JfQ1VUX0FMTF9NU0ssCkBAIC0xMTksNyArMTE2LDcgQEAKIAkvKiAgZm9yIFNESU8gLSBTZXQgQ1IgYml0MTAgdG8gZW5hYmxlIDMyayBjYWxpYnJhdGlvbi4gU3VnZ2VzdGVkIGJ5IFNEMSBHaW1teS4gQWRkZWQgYnkgdHlubGkuIDIwMTEuMDguMzEuICovCiAKIAl1c2Jfd3JpdGUxNihhZGFwdCwgUkVHX0NSLCB2YWx1ZTE2KTsKLQloYWxkYXRhLT5iTWFjUHdyQ3RybE9uID0gdHJ1ZTsKKwlhZGFwdC0+SGFsRGF0YS0+Yk1hY1B3ckN0cmxPbiA9IHRydWU7CiAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CkBAIC0xMjksMTggKzEyNiwxNyBAQAogewogCXUzMiBpbXIsIGltcl9leDsKIAl1OCAgdXNiX29wdDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CiAKIAkvKiBISVNSIHdyaXRlIG9uZSB0byBjbGVhciAqLwogCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19ISVNSXzg4RSwgMHhGRkZGRkZGRik7CiAJLyogIEhJTVIgLSAqLwogCWltciA9IElNUl9QU1RJTUVPVVRfODhFIHwgSU1SX1RCREVSXzg4RSB8IElNUl9DUFdNXzg4RSB8IElNUl9DUFdNMl84OEU7CiAJdXNiX3dyaXRlMzIoQWRhcHRlciwgUkVHX0hJTVJfODhFLCBpbXIpOwotCWhhbGRhdGEtPkludHJNYXNrWzBdID0gaW1yOworCUFkYXB0ZXItPkhhbERhdGEtPkludHJNYXNrWzBdID0gaW1yOwogCiAJaW1yX2V4ID0gSU1SX1RYRVJSXzg4RSB8IElNUl9SWEVSUl84OEUgfCBJTVJfVFhGT1ZXXzg4RSB8IElNUl9SWEZPVldfODhFOwogCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19ISU1SRV84OEUsIGltcl9leCk7Ci0JaGFsZGF0YS0+SW50ck1hc2tbMV0gPSBpbXJfZXg7CisJQWRhcHRlci0+SGFsRGF0YS0+SW50ck1hc2tbMV0gPSBpbXJfZXg7CiAKIAkvKiAgUkVHX1VTQl9TUEVDSUFMX09QVElPTiAtIEJJVCg0KSAqLwogCS8qICAwOyBVc2UgaW50ZXJydXB0IGVuZHBvaW50IHRvIHVwbG9hZCBpbnRlcnJ1cHQgcGt0ICovCkBAIC0xNTcsNyArMTUzLDYgQEAKIAogc3RhdGljIHZvaWQgX0luaXRRdWV1ZVJlc2VydmVkUGFnZShzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwogCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVnaXN0cnlwcml2ID0gJkFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKIAl1MzIgbnVtSFEJPSAwOwogCXUzMiBudW1MUQk9IDA7CkBAIC0xNjgsMTQgKzE2MywxNCBAQAogCWJvb2wgYldpRmlDb25maWcgPSBwcmVnaXN0cnlwcml2LT53aWZpX3NwZWM7CiAKIAlpZiAoYldpRmlDb25maWcpIHsKLQkJaWYgKGhhbGRhdGEtPk91dEVwUXVldWVTZWwgJiBUWF9TRUxFX0hRKQorCQlpZiAoQWRhcHRlci0+SGFsRGF0YS0+T3V0RXBRdWV1ZVNlbCAmIFRYX1NFTEVfSFEpCiAJCQludW1IUSA9ICAweDI5OwogCi0JCWlmIChoYWxkYXRhLT5PdXRFcFF1ZXVlU2VsICYgVFhfU0VMRV9MUSkKKwkJaWYgKEFkYXB0ZXItPkhhbERhdGEtPk91dEVwUXVldWVTZWwgJiBUWF9TRUxFX0xRKQogCQkJbnVtTFEgPSAweDFDOwogCiAJCS8qICBOT1RFOiBUaGlzIHN0ZXAgc2hhbGwgYmUgcHJvY2VlZCBiZWZvcmUgd3JpdGluZyBSRUdfUlFQTi4gKi8KLQkJaWYgKGhhbGRhdGEtPk91dEVwUXVldWVTZWwgJiBUWF9TRUxFX05RKQorCQlpZiAoQWRhcHRlci0+SGFsRGF0YS0+T3V0RXBRdWV1ZVNlbCAmIFRYX1NFTEVfTlEpCiAJCQludW1OUSA9IDB4MUM7CiAJCXZhbHVlOCA9ICh1OClfTlBRKG51bU5RKTsKIAkJdXNiX3dyaXRlOChBZGFwdGVyLCBSRUdfUlFQTl9OUFEsIHZhbHVlOCk7CkBAIC0yMjUsMTAgKzIyMCw5IEBACiAKIHN0YXRpYyB2b2lkIF9Jbml0Tm9ybWFsQ2hpcE9uZU91dEVwUHJpb3JpdHkoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhCT0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCiAJdTE2IHZhbHVlID0gMDsKLQlzd2l0Y2ggKGhhbGRhdGEtPk91dEVwUXVldWVTZWwpIHsKKworCXN3aXRjaCAoQWRhcHRlci0+SGFsRGF0YS0+T3V0RXBRdWV1ZVNlbCkgewogCWNhc2UgVFhfU0VMRV9IUToKIAkJdmFsdWUgPSBRVUVVRV9ISUdIOwogCQlicmVhazsKQEAgLTI0NywxMyArMjQxLDEyIEBACiAKIHN0YXRpYyB2b2lkIF9Jbml0Tm9ybWFsQ2hpcFR3b091dEVwUHJpb3JpdHkoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhCT0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwogCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJkFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKIAl1MTYgYmVRLCBia1EsIHZpUSwgdm9RLCBtZ3RRLCBoaVE7CiAJdTE2IHZhbHVlSGkgPSAwOwogCXUxNiB2YWx1ZUxvdyA9IDA7CiAKLQlzd2l0Y2ggKGhhbGRhdGEtPk91dEVwUXVldWVTZWwpIHsKKwlzd2l0Y2ggKEFkYXB0ZXItPkhhbERhdGEtPk91dEVwUXVldWVTZWwpIHsKIAljYXNlIChUWF9TRUxFX0hRIHwgVFhfU0VMRV9MUSk6CiAJCXZhbHVlSGkgPSBRVUVVRV9ISUdIOwogCQl2YWx1ZUxvdyA9IFFVRVVFX0xPVzsKQEAgLTMxMyw5ICszMDYsNyBAQAogCiBzdGF0aWMgdm9pZCBfSW5pdFF1ZXVlUHJpb3JpdHkoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCi0Jc3dpdGNoIChoYWxkYXRhLT5PdXRFcE51bWJlcikgeworCXN3aXRjaCAoQWRhcHRlci0+SGFsRGF0YS0+T3V0RXBOdW1iZXIpIHsKIAljYXNlIDE6CiAJCV9Jbml0Tm9ybWFsQ2hpcE9uZU91dEVwUHJpb3JpdHkoQWRhcHRlcik7CiAJCWJyZWFrOwpAQCAtMzU3LDcgKzM0OCw3IEBACiAKIHN0YXRpYyB2b2lkIF9Jbml0V01BQ1NldHRpbmcoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IEFkYXB0ZXItPkhhbERhdGE7CiAKIAloYWxkYXRhLT5SZWNlaXZlQ29uZmlnID0gUkNSX0FBUCB8IFJDUl9BUE0gfCBSQ1JfQU0gfCBSQ1JfQUIgfAogCQkJCSAgUkNSX0NCU1NJRF9EQVRBIHwgUkNSX0NCU1NJRF9CQ04gfApAQCAtNDU2LDcgKzQ0Nyw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHVzYl9BZ2dTZXR0aW5nVHhVcGRhdGUoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IEFkYXB0ZXItPkhhbERhdGE7CiAJdTMyIHZhbHVlMzI7CiAKIAlpZiAoQWRhcHRlci0+cmVnaXN0cnlwcml2LndpZmlfc3BlYykKQEAgLTQ5Miw3ICs0ODMsNyBAQAogCQlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcgogCSkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gQWRhcHRlci0+SGFsRGF0YTsKIAl1OCB2YWx1ZURNQTsKIAl1OCB2YWx1ZVVTQjsKIApAQCAtNTY2LDggKzU1Nyw2IEBACiAKIHN0YXRpYyB2b2lkIEluaXRVc2JBZ2dyZWdhdGlvblNldHRpbmcoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCiAJLyogIFR4IGFnZ3JlZ2F0aW9uIHNldHRpbmcgKi8KIAl1c2JfQWdnU2V0dGluZ1R4VXBkYXRlKEFkYXB0ZXIpOwogCkBAIC01NzUsMTIgKzU2NCwxMiBAQAogCXVzYl9BZ2dTZXR0aW5nUnhVcGRhdGUoQWRhcHRlcik7CiAKIAkvKiAgMjAxLzEyLzEwIE1IIEFkZCBmb3IgVVNCIGFnZyBtb2RlIGR5bmFtaWMgc3dpdGNoLiAqLwotCWhhbGRhdGEtPlVzYlJ4SGlnaFNwZWVkTW9kZSA9IGZhbHNlOworCUFkYXB0ZXItPkhhbERhdGEtPlVzYlJ4SGlnaFNwZWVkTW9kZSA9IGZhbHNlOwogfQogCiBzdGF0aWMgdm9pZCBfSW5pdEJlYWNvblBhcmFtZXRlcnMoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IEFkYXB0ZXItPkhhbERhdGE7CiAKIAl1c2Jfd3JpdGUxNihBZGFwdGVyLCBSRUdfQkNOX0NUUkwsIDB4MTAxMCk7CiAKQEAgLTYyMiw3ICs2MTEsNyBAQAogCiBzdGF0aWMgdm9pZCBfSW5pdEFudGVubmFfU2VsZWN0aW9uKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YQk9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBBZGFwdGVyLT5IYWxEYXRhOwogCiAJaWYgKGhhbGRhdGEtPkFudERpdkNmZyA9PSAwKQogCQlyZXR1cm47CkBAIC02NzIsMTMgKzY2MSwxMyBAQAogCXJldHVybiByZnBvd2Vyc3RhdGU7CiB9CS8qICBIYWxEZXRlY3RQd3JEb3duTW9kZSAqLwogCi1zdGF0aWMgdTMyIHJ0bDgxODhldV9oYWxfaW5pdChzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKK3UzMiBydGw4MTg4ZXVfaGFsX2luaXQoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7CiAJdTggdmFsdWU4ID0gMDsKIAl1MTYgIHZhbHVlMTY7CiAJdTggdHhwa3RidWZfYm5keTsKIAl1MzIgc3RhdHVzID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBBZGFwdGVyLT5IYWxEYXRhOwogCXN0cnVjdCBwd3JjdHJsX3ByaXYJCSpwd3JjdHJscHJpdiA9ICZBZGFwdGVyLT5wd3JjdHJscHJpdjsKIAlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ2lzdHJ5cHJpdiA9ICZBZGFwdGVyLT5yZWdpc3RyeXByaXY7CiAJdW5zaWduZWQgbG9uZyBpbml0X3N0YXJ0X3RpbWUgPSBqaWZmaWVzOwpAQCAtNzAyLDcgKzY5MSw3IEBACiAJfQogCiAJSEFMX0lOSVRfUFJPRklMRV9UQUcoSEFMX0lOSVRfU1RBR0VTX0lOSVRfUFdfT04pOwotCXN0YXR1cyA9IHJ0bDgxODhldV9Jbml0UG93ZXJPbihBZGFwdGVyKTsKKwlzdGF0dXMgPSBydHdfaGFsX3Bvd2VyX29uKEFkYXB0ZXIpOwogCWlmIChzdGF0dXMgPT0gX0ZBSUwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfZXJyXywgKCJGYWlsZWQgdG8gaW5pdCBwb3dlciBvbiFcbiIpKTsKIAkJZ290byBleGl0OwpAQCAtODEwLDggKzc5OSw4IEBACiAJdXNiX3dyaXRlMTYoQWRhcHRlciwgUkVHX1BLVF9CRV9CS19MSUZFX1RJTUUsIDB4MDQwMCk7CS8qICB1bml0OiAyNTZ1cy4gMjU2bXMgKi8KIAogCS8qIEtlZXAgUmZSZWdDaG5sVmFsIGZvciBsYXRlciB1c2UuICovCi0JaGFsZGF0YS0+UmZSZWdDaG5sVmFsWzBdID0gcGh5X3F1ZXJ5X3JmX3JlZyhBZGFwdGVyLCAoZW51bSByZl9yYWRpb19wYXRoKTAsIFJGX0NITkxCVywgYlJGUmVnT2Zmc2V0TWFzayk7Ci0JaGFsZGF0YS0+UmZSZWdDaG5sVmFsWzFdID0gcGh5X3F1ZXJ5X3JmX3JlZyhBZGFwdGVyLCAoZW51bSByZl9yYWRpb19wYXRoKTEsIFJGX0NITkxCVywgYlJGUmVnT2Zmc2V0TWFzayk7CisJaGFsZGF0YS0+UmZSZWdDaG5sVmFsWzBdID0gcnR3X2hhbF9yZWFkX3JmcmVnKEFkYXB0ZXIsIChlbnVtIHJmX3JhZGlvX3BhdGgpMCwgUkZfQ0hOTEJXLCBiUkZSZWdPZmZzZXRNYXNrKTsKKwloYWxkYXRhLT5SZlJlZ0NobmxWYWxbMV0gPSBydHdfaGFsX3JlYWRfcmZyZWcoQWRhcHRlciwgKGVudW0gcmZfcmFkaW9fcGF0aCkxLCBSRl9DSE5MQlcsIGJSRlJlZ09mZnNldE1hc2spOwogCiBIQUxfSU5JVF9QUk9GSUxFX1RBRyhIQUxfSU5JVF9TVEFHRVNfVFVSTl9PTl9CTE9DSyk7CiAJX0JCVHVybk9uQmxvY2soQWRhcHRlcik7CkBAIC05MDUsNyArODk0LDYgQEAKIHN0YXRpYyB2b2lkIENhcmREaXNhYmxlUlRMODE4OEVVKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewogCXU4IHZhbDg7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhCT0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sICgiQ2FyZERpc2FibGVSVEw4MTg4RVVcbiIpKTsKIApAQCAtOTU4LDcgKzk0Niw3IEBACiAJdmFsOCA9IHVzYl9yZWFkOChBZGFwdGVyLCBSRUdfR1BJT19JT19TRUwrMSk7CiAJdXNiX3dyaXRlOChBZGFwdGVyLCBSRUdfR1BJT19JT19TRUwrMSwgdmFsOHwweDBGKTsvKiBSZWcweDQzICovCiAJdXNiX3dyaXRlMzIoQWRhcHRlciwgUkVHX0JCX1BBRF9DVFJMLCAweDAwMDgwODA4KTsvKiBzZXQgTE5BICxUUlNXLEVYX1BBIFBpbiB0byBvdXRwdXQgbW9kZSAqLwotCWhhbGRhdGEtPmJNYWNQd3JDdHJsT24gPSBmYWxzZTsKKwlBZGFwdGVyLT5IYWxEYXRhLT5iTWFjUHdyQ3RybE9uID0gZmFsc2U7CiAJQWRhcHRlci0+YkZXUmVhZHkgPSBmYWxzZTsKIH0KIApAQCAtOTcyLDcgKzk2MCw3IEBACiAJdXNiX3dyaXRlMTYoYWRhcHQsIFJFR19BUFNfRlNNQ08sIDB4ODgxMik7CiB9CiAKLXN0YXRpYyB1MzIgcnRsODE4OGV1X2hhbF9kZWluaXQoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCit1MzIgcnRsODE4OGV1X2hhbF9kZWluaXQoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7CiAJREJHXzg4RSgiPT0+ICVzXG4iLCBfX2Z1bmNfXyk7CiAKQEAgLTk5NCw3ICs5ODIsNyBAQAogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBydGw4MTg4ZXVfaW5pcnBfaW5pdChzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKK3UzMiBydHdfaGFsX2luaXJwX2luaXQoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7CiAJdTggaTsKIAlzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmOwpAQCAtMTAyOSwxNyArMTAxNyw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBydGw4MTg4ZXVfaW5pcnBfZGVpbml0KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQotewotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAoIlxuID09PT4gdXNiX3J4X2RlaW5pdFxuIikpOwotCi0JdXNiX3JlYWRfcG9ydF9jYW5jZWwoQWRhcHRlcik7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgKCJcbiA8PT09IHVzYl9yeF9kZWluaXRcbiIpKTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQogLyogICovCiAvKiAgKi8KIC8qCUVFUFJPTS9FRlVTRSBDb250ZW50IFBhcnNpbmcgKi8KQEAgLTEwNDcsNyArMTAyNCw3IEBACiAvKiAgKi8KIHN0YXRpYyB2b2lkIEhhbF9FZnVzZVBhcnNlUElEVklEXzgxODhFVShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gYWRhcHQtPkhhbERhdGE7CiAKIAlpZiAoIUF1dG9Mb2FkRmFpbCkgewogCQkvKiAgVklELCBQSUQgKi8KQEAgLTExMzIsMTIgKzExMDksMTAgQEAKIAogc3RhdGljIHZvaWQgX1JlYWRSRlR5cGUoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCi0JaGFsZGF0YS0+cmZfY2hpcCA9IFJGXzYwNTI7CisJQWRhcHRlci0+SGFsRGF0YS0+cmZfY2hpcCA9IFJGXzYwNTI7CiB9CiAKLXN0YXRpYyB2b2lkIF9SZWFkQWRhcHRlckluZm84MTg4RVUoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCit2b2lkIHJ0d19oYWxfcmVhZF9jaGlwX2luZm8oc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7CiAJdW5zaWduZWQgbG9uZyBzdGFydCA9IGppZmZpZXM7CiAKQEAgLTExNTcsNyArMTEzMiw3IEBACiAKIHN0YXRpYyB2b2lkIFJlc3VtZVR4QmVhY29uKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCiAJLyogIDIwMTAuMDMuMDEuIE1hcmtlZCBieSB0eW5saS4gTm8gbmVlZCB0byBjYWxsIHdvcmtpdGVtIGJlYWNhdXNlIHdlIHJlY29yZCB0aGUgdmFsdWUgKi8KIAkvKiAgd2hpY2ggc2hvdWxkIGJlIHJlYWQgZnJvbSByZWdpc3RlciB0byBhIGdsb2JhbCB2YXJpYWJsZS4gKi8KQEAgLTExNzEsNyArMTE0Niw3IEBACiAKIHN0YXRpYyB2b2lkIFN0b3BUeEJlYWNvbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAogCS8qICAyMDEwLjAzLjAxLiBNYXJrZWQgYnkgdHlubGkuIE5vIG5lZWQgdG8gY2FsbCB3b3JraXRlbSBiZWFjYXVzZSB3ZSByZWNvcmQgdGhlIHZhbHVlICovCiAJLyogIHdoaWNoIHNob3VsZCBiZSByZWFkIGZyb20gcmVnaXN0ZXIgdG8gYSBnbG9iYWwgdmFyaWFibGUuICovCkBAIC0xMjc2LDkgKzEyNTEsOSBAQAogCQl1c2Jfd3JpdGU4KEFkYXB0ZXIsIGJjbl9jdHJsX3JlZywgdXNiX3JlYWQ4KEFkYXB0ZXIsIGJjbl9jdHJsX3JlZykmKH4oRU5fQkNOX0ZVTkNUSU9OIHwgRU5fVFhCQ05fUlBUKSkpOwogfQogCi1zdGF0aWMgdm9pZCBTZXRId1JlZzgxODhFVShzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciwgdTggdmFyaWFibGUsIHU4ICp2YWwpCit2b2lkIHJ0d19oYWxfc2V0X2h3cmVnKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCB1OCB2YXJpYWJsZSwgdTggKnZhbCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gQWRhcHRlci0+SGFsRGF0YTsKIAlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZoYWxkYXRhLT5kbXByaXY7CiAJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBvZG1wcml2ID0gJmhhbGRhdGEtPm9kbXByaXY7CiAKQEAgLTE0MjYsMTcgKzE0MDEsOCBAQAogCQkJCS8qIGVuYWJsZSB1cGRhdGUgVFNGICovCiAJCQkJdXNiX3dyaXRlOChBZGFwdGVyLCBSRUdfQkNOX0NUUkwsIHVzYl9yZWFkOChBZGFwdGVyLCBSRUdfQkNOX0NUUkwpJih+QklUKDQpKSk7CiAJCQl9Ci0JCQlpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gV0lGSV9GV19BUF9TVEFURSkgewotCQkJCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19SQ1IsIHVzYl9yZWFkMzIoQWRhcHRlciwgUkVHX1JDUil8UkNSX0NCU1NJRF9CQ04pOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoQWRhcHRlci0+aW5fY3RhX3Rlc3QpIHsKLQkJCQkJdTMyIHYgPSB1c2JfcmVhZDMyKEFkYXB0ZXIsIFJFR19SQ1IpOwotCQkJCQl2ICY9IH4oUkNSX0NCU1NJRF9EQVRBIHwgUkNSX0NCU1NJRF9CQ04pOy8qICBSQ1JfQURGICovCi0JCQkJCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19SQ1IsIHYpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19SQ1IsIHVzYl9yZWFkMzIoQWRhcHRlciwgUkVHX1JDUil8UkNSX0NCU1NJRF9CQ04pOwotCQkJCX0KLQkJCX0KKworCQkJdXNiX3dyaXRlMzIoQWRhcHRlciwgUkVHX1JDUiwgdXNiX3JlYWQzMihBZGFwdGVyLCBSRUdfUkNSKXxSQ1JfQ0JTU0lEX0JDTik7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBIV19WQVJfTUxNRV9KT0lOOgpAQCAtMTQ0OSwxMyArMTQxNSw3IEBACiAJCQkJLyogZW5hYmxlIHRvIHJ4IGRhdGEgZnJhbWUuQWNjZXB0IGFsbCBkYXRhIGZyYW1lICovCiAJCQkJdXNiX3dyaXRlMTYoQWRhcHRlciwgUkVHX1JYRkxUTUFQMiwgMHhGRkZGKTsKIAotCQkJCWlmIChBZGFwdGVyLT5pbl9jdGFfdGVzdCkgewotCQkJCQl1MzIgdiA9IHVzYl9yZWFkMzIoQWRhcHRlciwgUkVHX1JDUik7Ci0JCQkJCXYgJj0gfihSQ1JfQ0JTU0lEX0RBVEEgfCBSQ1JfQ0JTU0lEX0JDTik7LyogIFJDUl9BREYgKi8KLQkJCQkJdXNiX3dyaXRlMzIoQWRhcHRlciwgUkVHX1JDUiwgdik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdXNiX3dyaXRlMzIoQWRhcHRlciwgUkVHX1JDUiwgdXNiX3JlYWQzMihBZGFwdGVyLCBSRUdfUkNSKXxSQ1JfQ0JTU0lEX0RBVEF8UkNSX0NCU1NJRF9CQ04pOwotCQkJCX0KKwkJCQl1c2Jfd3JpdGUzMihBZGFwdGVyLCBSRUdfUkNSLCB1c2JfcmVhZDMyKEFkYXB0ZXIsIFJFR19SQ1IpfFJDUl9DQlNTSURfREFUQXxSQ1JfQ0JTU0lEX0JDTik7CiAKIAkJCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpCiAJCQkJCVJldHJ5TGltaXQgPSAoaGFsZGF0YS0+Q3VzdG9tZXJJRCA9PSBSVF9DSURfQ0NYKSA/IDcgOiA0ODsKQEAgLTE1MjUsOSArMTQ4NSw2IEBACiAJY2FzZSBIV19WQVJfU0VDX0NGRzoKIAkJdXNiX3dyaXRlOChBZGFwdGVyLCBSRUdfU0VDQ0ZHLCAqKCh1OCAqKXZhbCkpOwogCQlicmVhazsKLQljYXNlIEhXX1ZBUl9ETV9GTEFHOgotCQlwb2RtcHJpdi0+U3VwcG9ydEFiaWxpdHkgPSAqKCh1OCAqKXZhbCk7Ci0JCWJyZWFrOwogCWNhc2UgSFdfVkFSX0RNX0ZVTkNfT1A6CiAJCWlmICh2YWxbMF0pCiAJCQlwb2RtcHJpdi0+QktfU3VwcG9ydEFiaWxpdHkgPSBwb2RtcHJpdi0+U3VwcG9ydEFiaWxpdHk7CkBAIC0xNzkzLDE0ICsxNzUwLDExIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBHZXRId1JlZzgxODhFVShzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciwgdTggdmFyaWFibGUsIHU4ICp2YWwpCit2b2lkIHJ0d19oYWxfZ2V0X2h3cmVnKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCB1OCB2YXJpYWJsZSwgdTggKnZhbCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBvZG1wcml2ID0gJmhhbGRhdGEtPm9kbXByaXY7Ci0KIAlzd2l0Y2ggKHZhcmlhYmxlKSB7CiAJY2FzZSBIV19WQVJfQkFTSUNfUkFURToKLQkJKigodTE2ICopKHZhbCkpID0gaGFsZGF0YS0+QmFzaWNSYXRlU2V0OworCQkqKCh1MTYgKikodmFsKSkgPSBBZGFwdGVyLT5IYWxEYXRhLT5CYXNpY1JhdGVTZXQ7CiAJY2FzZSBIV19WQVJfVFhQQVVTRToKIAkJdmFsWzBdID0gdXNiX3JlYWQ4KEFkYXB0ZXIsIFJFR19UWFBBVVNFKTsKIAkJYnJlYWs7CkBAIC0xODA4LDExICsxNzYyLDggQEAKIAkJLyogQkNOX1ZBTElELCBCSVQxNiBvZiBSRUdfVERFQ1RSTCA9IEJJVDAgb2YgUkVHX1RERUNUUkwrMiAqLwogCQl2YWxbMF0gPSAoQklUKDApICYgdXNiX3JlYWQ4KEFkYXB0ZXIsIFJFR19UREVDVFJMKzIpKSA/IHRydWUgOiBmYWxzZTsKIAkJYnJlYWs7Ci0JY2FzZSBIV19WQVJfRE1fRkxBRzoKLQkJdmFsWzBdID0gcG9kbXByaXYtPlN1cHBvcnRBYmlsaXR5OwotCQlicmVhazsKIAljYXNlIEhXX1ZBUl9SRl9UWVBFOgotCQl2YWxbMF0gPSBoYWxkYXRhLT5yZl90eXBlOworCQl2YWxbMF0gPSBSRl8xVDFSOwogCQlicmVhazsKIAljYXNlIEhXX1ZBUl9GV0xQU19SRl9PTjoKIAkJewpAQCAtMTgzMywxMyArMTc4NCwxMyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgSFdfVkFSX0NVUlJFTlRfQU5URU5OQToKLQkJdmFsWzBdID0gaGFsZGF0YS0+Q3VyQW50ZW5uYTsKKwkJdmFsWzBdID0gQWRhcHRlci0+SGFsRGF0YS0+Q3VyQW50ZW5uYTsKIAkJYnJlYWs7CiAJY2FzZSBIV19WQVJfRUZVU0VfQllURVM6IC8qICBUbyBnZXQgRUZVRSB0b3RhbCB1c2VkIGJ5dGVzLCBhZGRlZCBieSBSb2dlciwgMjAwOC4xMi4yMi4gKi8KLQkJKigodTE2ICopKHZhbCkpID0gaGFsZGF0YS0+RWZ1c2VVc2VkQnl0ZXM7CisJCSooKHUxNiAqKSh2YWwpKSA9IEFkYXB0ZXItPkhhbERhdGEtPkVmdXNlVXNlZEJ5dGVzOwogCQlicmVhazsKIAljYXNlIEhXX1ZBUl9BUEZNX09OX01BQzoKLQkJKnZhbCA9IGhhbGRhdGEtPmJNYWNQd3JDdHJsT247CisJCSp2YWwgPSBBZGFwdGVyLT5IYWxEYXRhLT5iTWFjUHdyQ3RybE9uOwogCQlicmVhazsKIAljYXNlIEhXX1ZBUl9DSEtfSElfUVVFVUVfRU1QVFk6CiAJCSp2YWwgPSAoKHVzYl9yZWFkMzIoQWRhcHRlciwgUkVHX0hHUV9JTkZPUk1BVElPTikmMHgwMDAwZmYwMCkgPT0gMCkgPyB0cnVlIDogZmFsc2U7CkBAIC0xODUzLDE0ICsxODA0LDEzIEBACiAvKglEZXNjcmlwdGlvbjogKi8KIC8qCQlRdWVyeSBzZXR0aW5nIG9mIHNwZWNpZmllZCB2YXJpYWJsZS4gKi8KIC8qICAqLwotc3RhdGljIHU4Ci1HZXRIYWxEZWZWYXI4MTg4RVVzYigKK3U4IHJ0d19oYWxfZ2V0X2RlZl92YXIoCiAJCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLAogCQllbnVtIGhhbF9kZWZfdmFyaWFibGUgZVZhcmlhYmxlLAogCQl2b2lkICpwVmFsdWUKIAkpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IEFkYXB0ZXItPkhhbERhdGE7CiAJdTggYlJlc3VsdCA9IF9TVUNDRVNTOwogCiAJc3dpdGNoIChlVmFyaWFibGUpIHsKQEAgLTE5NDgsNyArMTg5OCw3IEBACiAJcmV0dXJuIGJSZXN1bHQ7CiB9CiAKLXN0YXRpYyB2b2lkIFVwZGF0ZUhhbFJBTWFzazgxODhFVXNiKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTMyIG1hY19pZCwgdTggcnNzaV9sZXZlbCkKK3ZvaWQgVXBkYXRlSGFsUkFNYXNrODE4OEVVc2Ioc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1MzIgbWFjX2lkLCB1OCByc3NpX2xldmVsKQogewogCXU4IGluaXRfcmF0ZSA9IDA7CiAJdTggbmV0d29ya1R5cGUsIHJhaWQ7CkBAIC0xOTU2LDcgKzE5MDYsNyBAQAogCXU4IHNob3J0R0lyYXRlID0gZmFsc2U7CiAJaW50CXN1cHBvcnRSYXRlTnVtID0gMDsKIAlzdHJ1Y3Qgc3RhX2luZm8JKnBzdGE7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqb2RtcHJpdiA9ICZhZGFwdC0+SGFsRGF0YS0+b2RtcHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmYWRhcHQtPm1sbWVleHRwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwogCXN0cnVjdCB3bGFuX2Jzc2lkX2V4CSpjdXJfbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7CkBAIC0xOTk1LDcgKzE5NDUsNyBAQAogCQlicmVhazsKIAl9CiAKLQlyYXRlX2JpdG1hcCA9IE9ETV9HZXRfUmF0ZV9CaXRtYXAoJmhhbGRhdGEtPm9kbXByaXYsIG1hY19pZCwgbWFzaywgcnNzaV9sZXZlbCk7CisJcmF0ZV9iaXRtYXAgPSBPRE1fR2V0X1JhdGVfQml0bWFwKG9kbXByaXYsIG1hY19pZCwgbWFzaywgcnNzaV9sZXZlbCk7CiAJREJHXzg4RSgiJXMgPT4gbWFjX2lkOiVkLCBuZXR3b3JrVHlwZToweCUwMngsIG1hc2s6MHglMDh4XG5cdCA9PT4gcnNzaV9sZXZlbDolZCwgcmF0ZV9iaXRtYXA6MHglMDh4XG4iLAogCQlfX2Z1bmNfXywgbWFjX2lkLCBuZXR3b3JrVHlwZSwgbWFzaywgcnNzaV9sZXZlbCwgcmF0ZV9iaXRtYXApOwogCkBAIC0yMDAzLDE1ICsxOTUzLDE0IEBACiAKIAlpbml0X3JhdGUgPSBnZXRfaGlnaGVzdF9yYXRlX2lkeChtYXNrKSYweDNmOwogCi0JT0RNX1JBX1VwZGF0ZVJhdGVJbmZvXzgxODhFKCZoYWxkYXRhLT5vZG1wcml2LCBtYWNfaWQsCi0JCQkJICAgIHJhaWQsIG1hc2ssIHNob3J0R0lyYXRlKTsKKwlPRE1fUkFfVXBkYXRlUmF0ZUluZm9fODE4OEUob2RtcHJpdiwgbWFjX2lkLCByYWlkLCBtYXNrLCBzaG9ydEdJcmF0ZSk7CiAKIAkvKiBzZXQgcmFfaWQgKi8KIAlwc3RhLT5yYWlkID0gcmFpZDsKIAlwc3RhLT5pbml0X3JhdGUgPSBpbml0X3JhdGU7CiB9CiAKLXN0YXRpYyB2b2lkIFNldEJlYWNvblJlbGF0ZWRSZWdpc3RlcnM4MTg4RVVzYihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCit2b2lkIHJ0d19oYWxfYmNuX3JlbGF0ZWRfcmVnX3NldHRpbmcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQogewogCXUzMiB2YWx1ZTMyOwogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZhZGFwdC0+bWxtZWV4dHByaXY7CkBAIC0yMDQ1LDEzICsxOTk0LDEyIEBACiAJdXNiX3dyaXRlOChhZGFwdCwgYmNuX2N0cmxfcmVnLCB1c2JfcmVhZDgoYWRhcHQsIGJjbl9jdHJsX3JlZykgfCBCSVQoMSkpOwogfQogCi1zdGF0aWMgdm9pZCBydGw4MTg4ZXVfaW5pdF9kZWZhdWx0X3ZhbHVlKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKK3ZvaWQgcnR3X2hhbF9kZWZfdmFsdWVfaW5pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cmN0cmxwcml2OwogCXU4IGk7CiAKLQloYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKIAlwd3JjdHJscHJpdiA9ICZhZGFwdC0+cHdyY3RybHByaXY7CiAKIAkvKiBpbml0IGRlZmF1bHQgdmFsdWUgKi8KQEAgLTIwNjcsNDMgKzIwMTUsMyBAQAogCWZvciAoaSA9IDA7IGkgPCBIUF9USEVSTUFMX05VTTsgaSsrKQogCQloYWxkYXRhLT5vZG1wcml2LlJGQ2FsaWJyYXRlSW5mby5UaGVybWFsVmFsdWVfSFBbaV0gPSAwOwogfQotCi12b2lkIHJ0bDgxODhldV9zZXRfaGFsX29wcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0Jc3RydWN0IGhhbF9vcHMJKmhhbGZ1bmMgPSAmYWRhcHQtPkhhbEZ1bmM7Ci0KLQotCWFkYXB0LT5IYWxEYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhhbF9kYXRhXzgxODhlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhZGFwdC0+SGFsRGF0YSkKLQkJREJHXzg4RSgiY2FudCBub3QgYWxsb2MgbWVtb3J5IGZvciBIQUwgREFUQVxuIik7Ci0KLQloYWxmdW5jLT5oYWxfcG93ZXJfb24gPSBydGw4MTg4ZXVfSW5pdFBvd2VyT247Ci0JaGFsZnVuYy0+aGFsX2luaXQgPSAmcnRsODE4OGV1X2hhbF9pbml0OwotCWhhbGZ1bmMtPmhhbF9kZWluaXQgPSAmcnRsODE4OGV1X2hhbF9kZWluaXQ7Ci0KLQloYWxmdW5jLT5pbmlycF9pbml0ID0gJnJ0bDgxODhldV9pbmlycF9pbml0OwotCWhhbGZ1bmMtPmluaXJwX2RlaW5pdCA9ICZydGw4MTg4ZXVfaW5pcnBfZGVpbml0OwotCi0JaGFsZnVuYy0+aW5pdF94bWl0X3ByaXYgPSAmcnRsODE4OGV1X2luaXRfeG1pdF9wcml2OwotCi0JaGFsZnVuYy0+aW5pdF9yZWN2X3ByaXYgPSAmcnRsODE4OGV1X2luaXRfcmVjdl9wcml2OwotCWhhbGZ1bmMtPmZyZWVfcmVjdl9wcml2ID0gJnJ0bDgxODhldV9mcmVlX3JlY3ZfcHJpdjsKLQloYWxmdW5jLT5Jbml0U3dMZWRzID0gJnJ0bDgxODhldV9Jbml0U3dMZWRzOwotCWhhbGZ1bmMtPkRlSW5pdFN3TGVkcyA9ICZydGw4MTg4ZXVfRGVJbml0U3dMZWRzOwotCi0JaGFsZnVuYy0+aW5pdF9kZWZhdWx0X3ZhbHVlID0gJnJ0bDgxODhldV9pbml0X2RlZmF1bHRfdmFsdWU7Ci0JaGFsZnVuYy0+aW50Zl9jaGlwX2NvbmZpZ3VyZSA9ICZydGw4MTg4ZXVfaW50ZXJmYWNlX2NvbmZpZ3VyZTsKLQloYWxmdW5jLT5yZWFkX2FkYXB0ZXJfaW5mbyA9ICZfUmVhZEFkYXB0ZXJJbmZvODE4OEVVOwotCi0JaGFsZnVuYy0+U2V0SHdSZWdIYW5kbGVyID0gJlNldEh3UmVnODE4OEVVOwotCWhhbGZ1bmMtPkdldEh3UmVnSGFuZGxlciA9ICZHZXRId1JlZzgxODhFVTsKLQloYWxmdW5jLT5HZXRIYWxEZWZWYXJIYW5kbGVyID0gJkdldEhhbERlZlZhcjgxODhFVXNiOwotCi0JaGFsZnVuYy0+VXBkYXRlUkFNYXNrSGFuZGxlciA9ICZVcGRhdGVIYWxSQU1hc2s4MTg4RVVzYjsKLQloYWxmdW5jLT5TZXRCZWFjb25SZWxhdGVkUmVnaXN0ZXJzSGFuZGxlciA9ICZTZXRCZWFjb25SZWxhdGVkUmVnaXN0ZXJzODE4OEVVc2I7Ci0KLQloYWxmdW5jLT5oYWxfeG1pdCA9ICZydGw4MTg4ZXVfaGFsX3htaXQ7Ci0JaGFsZnVuYy0+bWdudF94bWl0ID0gJnJ0bDgxODhldV9tZ250X3htaXQ7Ci0KLQlydGw4MTg4ZV9zZXRfaGFsX29wcyhoYWxmdW5jKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9IYWw4MTg4RVBoeUNmZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL0hhbDgxODhFUGh5Q2ZnLmgKaW5kZXggODk5MDc0OC4uMDk3NmE3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL0hhbDgxODhFUGh5Q2ZnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL0hhbDgxODhFUGh5Q2ZnLmgKQEAgLTE1OCwyNCArMTU4LDYgQEAKIAkJCQkgKiBQYXRoIEEgYW5kIEIgKi8KIH07CiAKLXN0cnVjdCBhbnRfc2VsX29mZG0gewotCXUzMiByX3R4X2FudGVubmE6NDsKLQl1MzIgcl9hbnRfbDo0OwotCXUzMiByX2FudF9ub25faHQ6NDsKLQl1MzIgcl9hbnRfaHQxOjQ7Ci0JdTMyIHJfYW50X2h0Mjo0OwotCXUzMiByX2FudF9odF9zMTo0OwotCXUzMiByX2FudF9ub25faHRfczE6NDsKLQl1MzIgT0ZETV9UWFNDOjI7Ci0JdTMyIHJlc2VydmVkOjI7Ci19OwotCi1zdHJ1Y3QgYW50X3NlbF9jY2sgewotCXU4IHJfY2NrcnhfZW5hYmxlXzI6MjsKLQl1OCByX2Nja3J4X2VuYWJsZToyOwotCXU4IHJfY2NrdHhfZW5hYmxlOjQ7Ci19OwotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBzdHJ1Y3R1cmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvSGFsSFdJbWc4MTg4RV9GVy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL0hhbEhXSW1nODE4OEVfRlcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiNTUyNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvSGFsSFdJbWc4MTg4RV9GVy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0qIG1vcmUgZGV0YWlscy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0lOQ19GV184MTg4RV9IV19JTUdfSAotI2RlZmluZSBfX0lOQ19GV184MTg4RV9IV19JTUdfSAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBGV19BUC5UWFQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBGV19Xb1dMQU4uVFhUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEFycmF5TGVuZ3RoXzgxODhFX0ZXX1dvV0xBTiAxNTc2NAotZXh0ZXJuIGNvbnN0IHU4IEFycmF5XzgxODhFX0ZXX1dvV0xBTltBcnJheUxlbmd0aF84MTg4RV9GV19Xb1dMQU5dOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9iYXNpY190eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2Jhc2ljX3R5cGVzLmgKaW5kZXggMmMxNjc2ZC4uNjljNGQ0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2Jhc2ljX3R5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2Jhc2ljX3R5cGVzLmgKQEAgLTEzNyw4ICsxMzcsNCBAQAogCQkoKCgodTgpX192YWwpICYgQklUX0xFTl9NQVNLXzgoX19iaXRsZW4pKSA8PCAoX19iaXRvZmZzZXQpKSBcCiAJCSkKIAotLyogIEdldCB0aGUgTi1ieXRlcyBhbGlnbWVudCBvZmZzZXQgZnJvbSB0aGUgY3VycmVudCBsZW5ndGggKi8KLSNkZWZpbmUJTl9CWVRFX0FMSUdNRU5UKF9fdmFsdWUsIF9fYWxpZ21lbnQpICgoX19hbGlnbWVudCA9PSAxKSA/IFwKLQkoX192YWx1ZSkgOiAoKChfX3ZhbHVlICsgX19hbGlnbWVudCAtIDEpIC8gX19hbGlnbWVudCkgKiBfX2FsaWdtZW50KSkKLQogI2VuZGlmIC8qIF9fQkFTSUNfVFlQRVNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvZHJ2X3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvZHJ2X3R5cGVzLmgKaW5kZXggNTU1MDZhNy4uMzIzMjZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2Rydl90eXBlcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9kcnZfdHlwZXMuaApAQCAtNTMsMzAgKzUzLDE3IEBACiAjZGVmaW5lIFNQRUNfREVWX0lEX0FTU0lHTl9JRk5BTUUJQklUKDUpCiAKIHN0cnVjdCByZWdpc3RyeV9wcml2IHsKLQl1OAljaGlwX3ZlcnNpb247Ci0JdTgJcmZpbnRmczsKLQl1OAlsYmttb2RlOwotCXU4CWhjaTsKIAlzdHJ1Y3QgbmRpc184MDJfMTFfc3NpZAlzc2lkOwotCXU4CW5ldHdvcmtfbW9kZTsJLyogaW5mcmEsIGFkLWhvYywgYXV0byAqLwogCXU4CWNoYW5uZWw7LyogYWQtaG9jIHN1cHBvcnQgcmVxdWlyZW1lbnQgKi8KIAl1OAl3aXJlbGVzc19tb2RlOy8qIEEsIEIsIEcsIGF1dG8gKi8KLQl1OAlzY2FuX21vZGU7LyogYWN0aXZlLCBwYXNzaXZlICovCi0JdTgJcmFkaW9fZW5hYmxlOwogCXU4CXByZWFtYmxlOy8qIGxvbmcsIHNob3J0LCBhdXRvICovCiAJdTgJdnJ0bF9jYXJyaWVyX3NlbnNlOy8qIEVuYWJsZSwgRGlzYWJsZSwgQXV0byAqLwogCXU4CXZjc190eXBlOy8qIFJUUy9DVFMsIENUUy10by1zZWxmICovCiAJdTE2CXJ0c190aHJlc2g7CiAJdTE2CWZyYWdfdGhyZXNoOwotCXU4CWFkaG9jX3R4X3B3cjsKLQl1OAlzb2Z0X2FwOwogCXU4CXBvd2VyX21nbnQ7CiAJdTgJaXBzX21vZGU7CiAJdTgJc21hcnRfcHM7Ci0JdTgJbG9uZ19yZXRyeV9sbXQ7Ci0JdTgJc2hvcnRfcmV0cnlfbG10OwotCXUxNglidXN5X3RocmVzaDsKLQl1OAlhY2tfcG9saWN5OwogCXU4CW1wX21vZGU7CiAJdTgJc29mdHdhcmVfZW5jcnlwdDsKIAl1OAlzb2Z0d2FyZV9kZWNyeXB0OwpAQCAtODQsMTEgKzcxLDYgQEAKIAkgIC8qIFVBUFNEICovCiAJdTgJd21tX2VuYWJsZTsKIAl1OAl1YXBzZF9lbmFibGU7Ci0JdTgJdWFwc2RfbWF4X3NwOwotCXU4CXVhcHNkX2FjYmtfZW47Ci0JdTgJdWFwc2RfYWNiZV9lbjsKLQl1OAl1YXBzZF9hY3ZpX2VuOwotCXU4CXVhcHNkX2Fjdm9fZW47CiAKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAgICBkZXZfbmV0d29yazsKIApAQCAtOTcsMTAgKzc5LDYgQEAKIAl1OAlhbXBkdV9lbmFibGU7LyogZm9yIHR4ICovCiAJdTgJcnhfc3RiYzsKIAl1OAlhbXBkdV9hbXNkdTsvKiBBLU1QRFUgU3VwcG9ydHMgQS1NU0RVIGlzIHBlcm1pdHRlZCAqLwotCXU4CWxvd3JhdGVfdHdvX3htaXQ7Ci0KLQl1OAlyZl9jb25maWc7Ci0JdTgJbG93X3Bvd2VyOwogCiAJdTgJd2lmaV9zcGVjOy8qICAhdHVyYm9fbW9kZSAqLwogCkBAIC0xMTIsOSArOTAsNiBAQAogCiAJdTgJdXNic3NfZW5hYmxlOy8qIDA6ZGlzYWJsZSwxOmVuYWJsZSAqLwogCXU4CWh3cGRuX21vZGU7LyogMDpkaXNhYmxlLDE6ZW5hYmxlLDI6ZGVjaWRlIGJ5IEVGVVNFIGNvbmZpZyAqLwotCXU4CWh3cHdycF9kZXRlY3Q7LyogMDpkaXNhYmxlLDE6ZW5hYmxlICovCi0KLQl1OAlod193cHNfcGJjOy8qIDA6ZGlzYWJsZSwxOmVuYWJsZSAqLwogCiAJdTgJbWF4X3JvYW1pbmdfdGltZXM7IC8qICB0aGUgbWF4IG51bWJlciBkcml2ZXIgd2lsbCB0cnkgKi8KIApAQCAtMTI5LDEyICsxMDQsNiBAQAogCWJvb2wJbW9uaXRvcl9lbmFibGU7CiB9OwogCi0vKiBGb3IgcmVnaXN0cnkgcGFyYW1ldGVycyAqLwotI2RlZmluZSBSR1RSWV9PRlQoZmllbGQpICgodTMyKW9mZnNldG9mKHN0cnVjdCByZWdpc3RyeV9wcml2LCBmaWVsZCkpCi0jZGVmaW5lIFJHVFJZX1NaKGZpZWxkKSAgIHNpemVvZigoKHN0cnVjdCByZWdpc3RyeV9wcml2ICopMCktPmZpZWxkKQotI2RlZmluZSBCU1NJRF9PRlQoZmllbGQpICgodTMyKW9mZnNldG9mVChzdHJ1Y3Qgd2xhbl9ic3NpZF9leCwgZmllbGQpKQotI2RlZmluZSBCU1NJRF9TWihmaWVsZCkgICBzaXplb2YoKChzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqKTApLT5maWVsZCkKLQogI2RlZmluZSBNQVhfQ09OVElOVUFMX1VSQl9FUlIJCTQKIAogc3RydWN0IGR2b2JqX3ByaXYgewpAQCAtMTQ5LDE2ICsxMTgsMTEgQEAKIAl1OAlRdWV1ZTJQaXBlW0hXX1FVRVVFX0VOVFJZXTsvKiBmb3Igb3V0IHBpcGUgbWFwcGluZyAqLwogCiAvKi0tLS0tLS0tIGJlbG93IGlzIGZvciBVU0IgSU5URVJGQUNFIC0tLS0tLS0tKi8KLQotCXU4CW5yX2VuZHBvaW50OwogCXU4CWlzaGlnaHNwZWVkOwogCXU4CVJ0TnVtSW5QaXBlczsKIAl1OAlSdE51bU91dFBpcGVzOwotCWludAllcF9udW1bNV07IC8qIGVuZHBvaW50IG51bWJlciAqLwogCXN0cnVjdCBtdXRleCAgdXNiX3ZlbmRvcl9yZXFfbXV0ZXg7CiAKLQl1OCAqdXNiX3ZlbmRvcl9yZXFfYnVmOwotCiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JpbnRmOwogCXN0cnVjdCB1c2JfZGV2aWNlICpwdXNiZGV2OwogfTsKQEAgLTE4NCwxNCArMTQ4LDcgQEAKIAlzdHJ1Y3QJZWVwcm9tX3ByaXYgZWVwcm9tcHJpdjsKIAlzdHJ1Y3QJbGVkX3ByaXYJbGVkcHJpdjsKIAotI2lmZGVmIENPTkZJR184OEVVX0FQX01PREUKLQlzdHJ1Y3QJaG9zdGFwZF9wcml2CSpwaG9zdGFwZHByaXY7Ci0jZW5kaWYKLQotCXN0cnVjdCB3aWZpZGlyZWN0X2luZm8Jd2RpbmZvOwotCi0Jdm9pZCAqSGFsRGF0YTsKLQlzdHJ1Y3QgaGFsX29wcwlIYWxGdW5jOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqSGFsRGF0YTsKIAogCXMzMgliRHJpdmVyU3RvcHBlZDsKIAlzMzIJYlN1cnByaXNlUmVtb3ZlZDsKQEAgLTE5OSwyMCArMTU2LDExIEBACiAJdTgJaHdfaW5pdF9jb21wbGV0ZWQ7CiAKIAl2b2lkICpjbWRUaHJlYWQ7Ci0Jdm9pZCAqZXZ0VGhyZWFkOwogCXZvaWQgKCppbnRmX3N0YXJ0KShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CiAJdm9pZCAoKmludGZfc3RvcCkoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwogCXN0cnVjdCAgbmV0X2RldmljZSAqcG5ldGRldjsKIAlzdHJ1Y3QgIG5ldF9kZXZpY2UgKnBtb25kZXY7CiAKLQkvKiAgdXNlZCBieSBydHdfcmVyZWdfbmRfbmFtZSByZWxhdGVkIGZ1bmN0aW9uICovCi0Jc3RydWN0IHJlcmVnX25kX25hbWVfZGF0YSB7Ci0JCXN0cnVjdCAgbmV0X2RldmljZSAqb2xkX3BuZXRkZXY7Ci0JCWNoYXIgb2xkX2lmbmFtZVtJRk5BTVNJWl07Ci0JCXU4IG9sZF9pcHNfbW9kZTsKLQkJdTggb2xkX2JSZWdVc2VMZWQ7Ci0JfSByZXJlZ19uZF9uYW1lX3ByaXY7Ci0KIAlpbnQgYnVwOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXN0cnVjdCBpd19zdGF0aXN0aWNzIGl3c3RhdHM7CkBAIC0yMjMsMjMgKzE3MSwxMiBAQAogCXU4IGJSZWFkUG9ydENhbmNlbDsKIAl1OCBiV3JpdGVQb3J0Q2FuY2VsOwogCXU4IGJSeFJTU0lEaXNwbGF5OwotCS8qIFRoZSBkcml2ZXIgd2lsbCBzaG93IHVwIHRoZSBkZXNpcmVkIGNoYW5uZWwgbnVtYmVyCi0JICogd2hlbiB0aGlzIGZsYWcgaXMgMS4gKi8KLQl1OCBiTm90aWZ5Q2hhbm5lbENoYW5nZTsKIAogCXN0cnVjdCBtdXRleCBod19pbml0X211dGV4OwotCi0Jc3BpbmxvY2tfdCBicl9leHRfbG9jazsKLQotCXU4CWZpeF9yYXRlOwotCi0JdW5zaWduZWQgY2hhciAgICAgaW5fY3RhX3Rlc3Q7CiB9OwogCiAjZGVmaW5lIGFkYXB0ZXJfdG9fZHZvYmooYWRhcHRlcikgKGFkYXB0ZXItPmR2b2JqKQogCi1pbnQgcnR3X2hhbmRsZV9kdWFsbWFjKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBib29sIGluaXQpOwotCiBzdGF0aWMgaW5saW5lIHU4ICpteWlkKHN0cnVjdCBlZXByb21fcHJpdiAqcGVlcHJpdikKIHsKIAlyZXR1cm4gcGVlcHJpdi0+bWFjX2FkZHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaGFsX2ludGYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9oYWxfaW50Zi5oCmluZGV4IGVhZjkzOWIuLmZhMDMyYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9oYWxfaW50Zi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9oYWxfaW50Zi5oCkBAIC01OCw3ICs1OCw2IEBACiAJSFdfVkFSX1NFQ19DRkcsCiAJSFdfVkFSX0JDTl9WQUxJRCwKIAlIV19WQVJfUkZfVFlQRSwKLQlIV19WQVJfRE1fRkxBRywKIAlIV19WQVJfRE1fRlVOQ19PUCwKIAlIV19WQVJfRE1fRlVOQ19TRVQsCiAJSFdfVkFSX0RNX0ZVTkNfQ0xSLApAQCAtMTM5LDgxICsxMzgsNiBAQAogCUhBTF9NQVhfSUQsCiB9OwogCi1zdHJ1Y3QgaGFsX29wcyB7Ci0JdTMyCSgqaGFsX3Bvd2VyX29uKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCXUzMgkoKmhhbF9pbml0KShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCXUzMgkoKmhhbF9kZWluaXQpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0KLQl2b2lkCSgqZnJlZV9oYWxfZGF0YSkoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQotCXUzMgkoKmluaXJwX2luaXQpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0JdTMyCSgqaW5pcnBfZGVpbml0KShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0JczMyCSgqaW5pdF94bWl0X3ByaXYpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0KLQlzMzIJKCppbml0X3JlY3ZfcHJpdikoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQl2b2lkCSgqZnJlZV9yZWN2X3ByaXYpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0KLQl2b2lkCSgqSW5pdFN3TGVkcykoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQl2b2lkCSgqRGVJbml0U3dMZWRzKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0Jdm9pZAkoKmRtX2luaXQpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0Jdm9pZAkoKnJlYWRfY2hpcF92ZXJzaW9uKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0Jdm9pZAkoKmluaXRfZGVmYXVsdF92YWx1ZSkoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQotCXZvaWQJKCppbnRmX2NoaXBfY29uZmlndXJlKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0Jdm9pZAkoKnJlYWRfYWRhcHRlcl9pbmZvKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0JczMyCSgqaW50ZXJydXB0X2hhbmRsZXIpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0KLQl2b2lkCSgqc2V0X2J3bW9kZV9oYW5kbGVyKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICAgZW51bSBodF9jaGFubmVsX3dpZHRoIEJhbmR3aWR0aCwKLQkJCQkgICAgICB1OCBPZmZzZXQpOwotCXZvaWQJKCpzZXRfY2hhbm5lbF9oYW5kbGVyKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGNoYW5uZWwpOwotCi0Jdm9pZAkoKmhhbF9kbV93YXRjaGRvZykoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQotCXZvaWQJKCpTZXRId1JlZ0hhbmRsZXIpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTgJdmFyaWFibGUsCi0JCQkJICAgdTggKnZhbCk7Ci0Jdm9pZAkoKkdldEh3UmVnSGFuZGxlcikoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OAl2YXJpYWJsZSwKLQkJCQkgICB1OCAqdmFsKTsKLQotCXU4CSgqR2V0SGFsRGVmVmFySGFuZGxlcikoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICAgICBlbnVtIGhhbF9kZWZfdmFyaWFibGUgZVZhcmlhYmxlLAotCQkJCSAgICAgICB2b2lkICpwVmFsdWUpOwotCi0Jdm9pZAkoKlNldEhhbE9ETVZhckhhbmRsZXIpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgICAgZW51bSBoYWxfb2RtX3ZhcmlhYmxlIGVWYXJpYWJsZSwKLQkJCQkgICAgICAgdm9pZCAqcFZhbHVlMSwgYm9vbCBiU2V0KTsKLQotCXZvaWQJKCpVcGRhdGVSQU1hc2tIYW5kbGVyKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICAgIHUzMiBtYWNfaWQsIHU4IHJzc2lfbGV2ZWwpOwotCXZvaWQJKCpTZXRCZWFjb25SZWxhdGVkUmVnaXN0ZXJzSGFuZGxlcikoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQotCXZvaWQJKCpBZGRfUmF0ZUFUaWQpKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYml0bWFwLCB1OCBhcmcsCi0JCQkJdTggcnNzaV9sZXZlbCk7Ci0KLQl1OAkoKkFudERpdkJlZm9yZUxpbmtIYW5kbGVyKShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Ci0Jdm9pZAkoKkFudERpdkNvbXBhcmVIYW5kbGVyKShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKLQkJCQkJc3RydWN0IHdsYW5fYnNzaWRfZXggKmRzdCwKLQkJCQkJc3RydWN0IHdsYW5fYnNzaWRfZXggKnNyYyk7Ci0JczMyCSgqaGFsX3htaXQpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSk7Ci0JczMyICgqbWdudF94bWl0KShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWUpOwotCXUzMgkoKnJlYWRfcmZyZWcpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIGVudW0gcmZfcmFkaW9fcGF0aCBlUkZQYXRoLCB1MzIgUmVnQWRkciwKLQkJCSAgICAgIHUzMiBCaXRNYXNrKTsKLQotCXZvaWQgKCpzcmVzZXRfaW5pdF92YWx1ZSkoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQl1OCAoKnNyZXNldF9nZXRfd2lmaV9zdGF0dXMpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0KLQl2b2lkICgqaGFsX25vdGNoX2ZpbHRlcikoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgZW5hYmxlKTsKLQl2b2lkICgqaGFsX3Jlc2V0X3NlY3VyaXR5X2VuZ2luZSkoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotfTsKLQogZW51bSBydF9lZXByb21fdHlwZSB7CiAJRUVQUk9NXzkzQzQ2LAogCUVFUFJPTV85M0M1NiwKQEAgLTIzNSw2ICsxNTksOSBAQAogCiAjZGVmaW5lIGlzX2Jvb3RfZnJvbV9lZXByb20oYWRhcHRlcikgKGFkYXB0ZXItPmVlcHJvbXByaXYuRWVwcm9tT3JFZnVzZSkKIAordm9pZCBVcGRhdGVIYWxSQU1hc2s4MTg4RVVzYihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHUzMiBtYWNfaWQsIHU4IHJzc2lfbGV2ZWwpOwordTMyIHJ0bDgxODhldV9oYWxfZGVpbml0KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKTsKK3UzMiBydGw4MTg4ZXVfaGFsX2luaXQoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpOwogdm9pZCBydHdfaGFsX2RlZl92YWx1ZV9pbml0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiAKIHZvaWQJcnR3X2hhbF9mcmVlX2RhdGEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKQEAgLTI2Miw3ICsxODksNyBAQAogCQkJIGJvb2wgYlNldCk7CiAKIHUzMglydHdfaGFsX2luaXJwX2luaXQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLXUzMglydHdfaGFsX2luaXJwX2RlaW5pdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwordm9pZAlydHdfaGFsX2luaXJwX2RlaW5pdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogCiBzMzIJcnR3X2hhbF94bWl0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpOwogczMyCXJ0d19oYWxfbWdudF94bWl0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKQEAgLTI3MCw3ICsxOTcsNyBAQAogCiBzMzIJcnR3X2hhbF9pbml0X3htaXRfcHJpdihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogCi1zMzIJcnR3X2hhbF9pbml0X3JlY3ZfcHJpdihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOworaW50CXJ0d19oYWxfaW5pdF9yZWN2X3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIHZvaWQJcnR3X2hhbF9mcmVlX3JlY3ZfcHJpdihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogCiB2b2lkIHJ0d19oYWxfdXBkYXRlX3JhX21hc2soc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgbWFjX2lkLCB1OCBsZXZlbCk7CkBAIC0yOTYsNyArMjIzLDYgQEAKIHZvaWQgcnR3X2hhbF9zcmVzZXRfaW5pdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogCiB2b2lkIHJ0d19oYWxfbm90Y2hfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBib29sIGVuYWJsZSk7Ci12b2lkIHJ0d19oYWxfcmVzZXRfc2VjdXJpdHlfZW5naW5lKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKIAogdm9pZCBpbmRpY2F0ZV93eF9zY2FuX2NvbXBsZXRlX2V2ZW50KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiB1OCBydHdfZG9fam9pbihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2llZWU4MDIxMS5oCmluZGV4IGQ4Mjg0YzguLmZjNTg2MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9pZWVlODAyMTEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaWVlZTgwMjExLmgKQEAgLTIzOSw3ICsyMzksNyBAQAogCQkJdTE2IGNhcGFiaWxpdHk7CiAJCQlpbnQgZmxhZ3M7CiAJCQl1OCB0eF9zdXBwX3JhdGVzWzE2XTsKLQkJCXN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCBodF9jYXA7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodF9jYXA7CiAJCX0gYWRkX3N0YTsKIAkJc3RydWN0IHsKIAkJCXU4CXJlc2VydmVkWzJdOy8qIGZvciBzZXQgbWF4X251bV9zdGEgKi8KQEAgLTI2NCw3ICsyNjQsNyBAQAogCXUzMiBzdGFfc2V0OwogCXU4IHR4X3N1cHBfcmF0ZXNbMTZdOwogCXUzMiB0eF9zdXBwX3JhdGVzX2xlbjsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgaHRfY2FwOworCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwIGh0X2NhcDsKIAl1NjQJcnhfcGt0czsKIAl1NjQJcnhfYnl0ZXM7CiAJdTY0CXJ4X2Ryb3BzOwpAQCAtMjkxLDYyICsyOTEsNiBAQAogLyogdGhpcyBpcyBzdG9sZW4gZnJvbSBpcHcyMjAwIGRyaXZlciAqLwogI2RlZmluZSBJRUVFX0lCU1NfTUFDX0hBU0hfU0laRSAzMQogCi1zdHJ1Y3QgaWVlZV9pYnNzX3NlcSB7Ci0JdTggbWFjW0VUSF9BTEVOXTsKLQl1MTYgc2VxX251bTsKLQl1MTYgZnJhZ19udW07Ci0JdW5zaWduZWQgbG9uZyBwYWNrZXRfdGltZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi1zdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgewotCV9fbGUxNiBmcmFtZV9jdGw7Ci0JX19sZTE2IGR1cmF0aW9uX2lkOwotCXU4IGFkZHIxW0VUSF9BTEVOXTsKLQl1OCBhZGRyMltFVEhfQUxFTl07Ci0JdTggYWRkcjNbRVRIX0FMRU5dOwotCXUxNiBzZXFfY3RsOwotCXU4IGFkZHI0W0VUSF9BTEVOXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkciB7Ci0JX19sZTE2IGZyYW1lX2N0bDsKLQlfX2xlMTYgZHVyYXRpb25faWQ7Ci0JdTggYWRkcjFbRVRIX0FMRU5dOwotCXU4IGFkZHIyW0VUSF9BTEVOXTsKLQl1OCBhZGRyM1tFVEhfQUxFTl07Ci0JdTE2IHNlcV9jdGw7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfcW9zIHsKLQlfX2xlMTYgZnJhbWVfY3RsOwotCV9fbGUxNiBkdXJhdGlvbl9pZDsKLQl1OCBhZGRyMVtFVEhfQUxFTl07Ci0JdTggYWRkcjJbRVRIX0FMRU5dOwotCXU4IGFkZHIzW0VUSF9BTEVOXTsKLQl1MTYgc2VxX2N0bDsKLQl1OCBhZGRyNFtFVEhfQUxFTl07Ci0JdTE2CXFjOwotfSAgX19wYWNrZWQ7Ci0KLXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcl9xb3MgewotCV9fbGUxNiBmcmFtZV9jdGw7Ci0JX19sZTE2IGR1cmF0aW9uX2lkOwotCXU4IGFkZHIxW0VUSF9BTEVOXTsKLQl1OCBhZGRyMltFVEhfQUxFTl07Ci0JdTggYWRkcjNbRVRIX0FMRU5dOwotCXUxNiBzZXFfY3RsOwotCXUxNiAgICAgcWM7Ci19ICBfX3BhY2tlZDsKLQotc3RydWN0IGVhcG9sIHsKLQl1OCBzbmFwWzZdOwotCXUxNiBldGhlcnR5cGU7Ci0JdTggdmVyc2lvbjsKLQl1OCB0eXBlOwotCXUxNiBsZW5ndGg7Ci19IF9fcGFja2VkOwotCiBlbnVtIGVhcF90eXBlIHsKIAlFQVBfUEFDS0VUID0gMCwKIAlFQVBPTF9TVEFSVCwKQEAgLTU1Miw4MyArNDk2LDEyIEBACiAjZGVmaW5lIElFRUU4MDIxMV9OVU1fQ0NLX1JBVEVTCQk0CiAjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1NISUZUX01BU0tfQQk0CiAKLS8qIE5PVEU6IFRoaXMgZGF0YSBpcyBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXM7IG5vdCBhbGwgaGFyZHdhcmUgcHJvdmlkZXMgdGhpcwotICogICAgICAgaW5mb3JtYXRpb24gZm9yIGZyYW1lcyByZWNlaXZlZC4gIE5vdCBzZXR0aW5nIHRoZXNlIHdpbGwgbm90IGNhdXNlCi0gKiAgICAgICBhbnkgYWR2ZXJzZSBhZmZlY3RzLiAqLwotc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyB7Ci0JLyogdTMyIG1hY190aW1lWzJdOyAqLwotCXM4IHJzc2k7Ci0JdTggc2lnbmFsOwotCXU4IG5vaXNlOwotCXU4IHJlY2VpdmVkX2NoYW5uZWw7Ci0JdTE2IHJhdGU7IC8qIGluIDEwMCBrYnBzICovCi0JLyogdTggY29udHJvbDsgKi8KLQl1OCBtYXNrOwotCXU4IGZyZXE7Ci0JdTE2IGxlbjsKLX07Ci0KIC8qIElFRUUgODAyLjExIHJlcXVpcmVzIHRoYXQgU1RBIHN1cHBvcnRzIGNvbmN1cnJlbnQgcmVjZXB0aW9uIG9mIGF0IGxlYXN0CiAgKiB0aHJlZSBmcmFnbWVudGVkIGZyYW1lcy4gVGhpcyBkZWZpbmUgY2FuIGJlIGluY3JlYXNlZCB0byBzdXBwb3J0IG1vcmUKICAqIGNvbmN1cnJlbnQgZnJhbWVzLCBidXQgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgZWFjaCBlbnRyeSBjYW4gY29uc3VtZSBhYm91dAogICogMiBrQiBvZiBSQU0gYW5kIGluY3JlYXNpbmcgY2FjaGUgc2l6ZSB3aWxsIHNsb3cgZG93biBmcmFtZSByZWFzc2VtYmx5LiAqLwogI2RlZmluZSBJRUVFODAyMTFfRlJBR19DQUNIRV9MRU4gNAogCi1zdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgewotCXUzMiBmaXJzdF9mcmFnX3RpbWU7Ci0JdWludCBzZXE7Ci0JdWludCBsYXN0X2ZyYWc7Ci0JdWludCBxb3M7ICAgLyogamFja3NvbiAqLwotCXVpbnQgdGlkOwkvKiBqYWNrc29uICovCi0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1OCBzcmNfYWRkcltFVEhfQUxFTl07Ci0JdTggZHN0X2FkZHJbRVRIX0FMRU5dOwotfTsKLQotc3RydWN0IGllZWU4MDIxMV9zdGF0cyB7Ci0JdWludCB0eF91bmljYXN0X2ZyYW1lczsKLQl1aW50IHR4X211bHRpY2FzdF9mcmFtZXM7Ci0JdWludCB0eF9mcmFnbWVudHM7Ci0JdWludCB0eF91bmljYXN0X29jdGV0czsKLQl1aW50IHR4X211bHRpY2FzdF9vY3RldHM7Ci0JdWludCB0eF9kZWZlcnJlZF90cmFuc21pc3Npb25zOwotCXVpbnQgdHhfc2luZ2xlX3JldHJ5X2ZyYW1lczsKLQl1aW50IHR4X211bHRpcGxlX3JldHJ5X2ZyYW1lczsKLQl1aW50IHR4X3JldHJ5X2xpbWl0X2V4Y2VlZGVkOwotCXVpbnQgdHhfZGlzY2FyZHM7Ci0JdWludCByeF91bmljYXN0X2ZyYW1lczsKLQl1aW50IHJ4X211bHRpY2FzdF9mcmFtZXM7Ci0JdWludCByeF9mcmFnbWVudHM7Ci0JdWludCByeF91bmljYXN0X29jdGV0czsKLQl1aW50IHJ4X211bHRpY2FzdF9vY3RldHM7Ci0JdWludCByeF9mY3NfZXJyb3JzOwotCXVpbnQgcnhfZGlzY2FyZHNfbm9fYnVmZmVyOwotCXVpbnQgdHhfZGlzY2FyZHNfd3Jvbmdfc2E7Ci0JdWludCByeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlOwotCXVpbnQgcnhfbWVzc2FnZV9pbl9tc2dfZnJhZ21lbnRzOwotCXVpbnQgcnhfbWVzc2FnZV9pbl9iYWRfbXNnX2ZyYWdtZW50czsKLX07Ci0KLXN0cnVjdCBpZWVlODAyMTFfc29mdG1hY19zdGF0cyB7Ci0JdWludCByeF9hc3Nfb2s7Ci0JdWludCByeF9hc3NfZXJyOwotCXVpbnQgcnhfcHJvYmVfcnE7Ci0JdWludCB0eF9wcm9iZV9yczsKLQl1aW50IHR4X2JlYWNvbnM7Ci0JdWludCByeF9hdXRoX3JxOwotCXVpbnQgcnhfYXV0aF9yc19vazsKLQl1aW50IHJ4X2F1dGhfcnNfZXJyOwotCXVpbnQgdHhfYXV0aF9ycTsKLQl1aW50IG5vX2F1dGhfcnM7Ci0JdWludCBub19hc3NfcnM7Ci0JdWludCB0eF9hc3NfcnE7Ci0JdWludCByeF9hc3NfcnE7Ci0JdWludCB0eF9wcm9iZV9ycTsKLQl1aW50IHJlYXNzb2M7Ci0JdWludCBzd3R4c3RvcDsKLQl1aW50IHN3dHhhd2FrZTsKLX07Ci0KICNkZWZpbmUgU0VDX0tFWV8xCSgxPDwwKQogI2RlZmluZSBTRUNfS0VZXzIJKDE8PDEpCiAjZGVmaW5lIFNFQ19LRVlfMwkoMTw8MikKQEAgLTY0OCw0MiArNTIxLDYgQEAKICNkZWZpbmUgV0VQX0tFWVMgNAogI2RlZmluZSBXRVBfS0VZX0xFTiAxMwogCi1zdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHsKLQl1MTYgYWN0aXZlX2tleToyLAotCWVuYWJsZWQ6MSwKLQlhdXRoX21vZGU6MiwKLQlhdXRoX2FsZ286NCwKLQl1bmljYXN0X3VzZXNfZ3JvdXA6MTsKLQl1OCBrZXlfc2l6ZXNbV0VQX0tFWVNdOwotCXU4IGtleXNbV0VQX0tFWVNdW1dFUF9LRVlfTEVOXTsKLQl1OCBsZXZlbDsKLQl1MTYgZmxhZ3M7Ci19IF9fcGFja2VkOwotCi0vKgotCi0gODAyLjExIGRhdGEgZnJhbWUgZnJvbSBBUAotCi0gICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLUJ5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAotICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18Ci1EZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBmcmFtZSAgfCAgZmNzIHwKLSAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwJIHwJIHwgZW5jZSB8ICBkYXRhICAgfCAgICAgIHwKLSAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJwotCi1Ub3RhbDogMjgtMjM0MCBieXRlcwotCi0qLwotCi1zdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIHsKLQl1MTYgZnJhbWVfY3RsOwotCXUxNiBkdXJhdGlvbl9pZDsKLQl1OCBhZGRyMVs2XTsKLQl1OCBhZGRyMls2XTsKLQl1OCBhZGRyM1s2XTsKLQl1MTYgc2VxX2N0cmw7Ci19OwotCiAjZGVmaW5lIEJFQUNPTl9QUk9CRV9TU0lEX0lEX1BPU0lUSU9OIDEyCiAKIC8qIE1hbmFnZW1lbnQgRnJhbWUgSW5mb3JtYXRpb24gRWxlbWVudCBUeXBlcyAqLwpAQCAtNzAwLDgxICs1MzcsOSBAQAogI2RlZmluZSBNRklFX1RZUEVfUkFURVNfRVgJNTAKICNkZWZpbmUgTUZJRV9UWVBFX0dFTkVSSUMJMjIxCiAKLXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkciB7Ci0JdTggaWQ7Ci0JdTggbGVuOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgewotCXU4IGlkOwotCXU4IGxlbjsKLQl1OCBkYXRhWzBdOwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIFRoZXNlIGFyZSB0aGUgZGF0YSB0eXBlcyB0aGF0IGNhbiBtYWtlIHVwIG1hbmFnZW1lbnQgcGFja2V0cwotICoKLQl1MTYgYXV0aF9hbGdvcml0aG07Ci0JdTE2IGF1dGhfc2VxdWVuY2U7Ci0JdTE2IGJlYWNvbl9pbnRlcnZhbDsKLQl1MTYgY2FwYWJpbGl0eTsKLQl1OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKLQl1MTYgbGlzdGVuX2ludGVydmFsOwotCXN0cnVjdCB7Ci0JCXUxNiBhc3NvY2lhdGlvbl9pZDoxNCwgcmVzZXJ2ZWQ6MjsKLQl9IF9fcGFja2VkOwotCXUzMiB0aW1lX3N0YW1wWzJdOwotCXUxNiByZWFzb247Ci0JdTE2IHN0YXR1czsKLSovCi0KICNkZWZpbmUgSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQgIlBlbmd1aW4iCiAjZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX0JBU0lDX1JBVEUgMTAKIAotc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSBoZWFkZXI7Ci0JdTE2IGFsZ29yaXRobTsKLQl1MTYgdHJhbnNhY3Rpb247Ci0JdTE2IHN0YXR1czsKLQkvKiBzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgaW5mb19lbGVtZW50OyAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSB7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSBoZWFkZXI7Ci0JdTMyIHRpbWVfc3RhbXBbMl07Ci0JdTE2IGJlYWNvbl9pbnRlcnZhbDsKLQl1MTYgY2FwYWJpbGl0eTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgewotCXN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEgaGVhZGVyOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lIHsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwotCXUxNiBjYXBhYmlsaXR5OwotCXUxNiBsaXN0ZW5faW50ZXJ2YWw7Ci0Jc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyIGluZm9fZWxlbWVudDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgewotCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7Ci0JdTE2IGNhcGFiaWxpdHk7Ci0JdTE2IHN0YXR1czsKLQl1MTYgYWlkOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGllZWU4MDIxMV90eGIgewotCXU4IG5yX2ZyYWdzOwotCXU4IGVuY3J5cHRlZDsKLQl1MTYgcmVzZXJ2ZWQ7Ci0JdTE2IGZyYWdfc2l6ZTsKLQl1MTYgcGF5bG9hZF9zaXplOwotCXN0cnVjdCBza19idWZmICpmcmFnbWVudHNbMF07Ci19OwotCi0KIC8qIFNXRUVQIFRBQkxFIEVOVFJJRVMgTlVNQkVSKi8KICNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTCQkgIDQyCiAjZGVmaW5lIE1BWF9TV0VFUF9UQUJfRU5UUklFU19QRVJfUEFDS0VUICA3CkBAIC04NzIsMTEgKzYzNyw2IEBACiAjZGVmaW5lIENGR19JRUVFODAyMTFfUkVTRVJWRV9GQ1MgKDE8PDApCiAjZGVmaW5lIENGR19JRUVFODAyMTFfQ09NUFVURV9GQ1MgKDE8PDEpCiAKLXN0cnVjdCB0eF9wZW5kaW5nIHsKLQlpbnQgZnJhZzsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiOwotfTsKLQogI2RlZmluZSBNQVhUSUQJMTYKIAogI2RlZmluZSBJRUVFX0EJICAgICgxPDwwKQpAQCAtMTA5NiwyMCArODU2LDggQEAKIAlTQ0EgPSAxLCAvKiBzZWNvbmRhcnkgY2hhbm5lbCBhYm92ZSAqLwogCVNDQiA9IDMsICAvKiBzZWNvbmRhcnkgY2hhbm5lbCBiZWxvdyAqLwogfTsKLXU4IHNlY29uZGFyeV9jaF9vZmZzZXRfdG9faGFsX2NoX29mZnNldCh1OCBjaF9vZmZzZXQpOwotdTggaGFsX2NoX29mZnNldF90b19zZWNvbmRhcnlfY2hfb2Zmc2V0KHU4IGNoX29mZnNldCk7Ci11OCAqcnR3X3NldF9pZV9jaF9zd2l0Y2godTggKmJ1ZiwgdTMyICpidWZfbGVuLCB1OCBjaF9zd2l0Y2hfbW9kZSwKLQkJCSB1OCBuZXdfY2gsIHU4IGNoX3N3aXRjaF9jbnQpOwotdTggKnJ0d19zZXRfaWVfc2Vjb25kYXJ5X2NoX29mZnNldCh1OCAqYnVmLCB1MzIgKmJ1Zl9sZW4sCi0JCQkJICAgdTggc2Vjb25kYXJ5X2NoX29mZnNldCk7Ci11OCAqcnR3X3NldF9pZV9tZXNoX2NoX3N3aXRjaF9wYXJtKHU4ICpidWYsIHUzMiAqYnVmX2xlbiwgdTggdHRsLAotCQkJCSAgIHU4IGZsYWdzLCB1MTYgcmVhc29uLCB1MTYgcHJlY2VkZW5jZSk7CiAKIHU4ICpydHdfZ2V0X2llKHU4ICpwYnVmLCBpbnQgaW5kZXgsIGludCAqbGVuLCBpbnQgbGltaXQpOwotdTggKnJ0d19nZXRfaWVfZXgodTggKmluX2llLCB1aW50IGluX2xlbiwgdTggZWlkLCB1OCAqb3VpLAotCQkgIHU4IG91aV9sZW4sIHU4ICppZSwgdWludCAqaWVsZW4pOwotaW50IHJ0d19pZXNfcmVtb3ZlX2llKHU4ICppZXMsIHVpbnQgKmllc19sZW4sIHVpbnQgb2Zmc2V0LAotCQkgICAgICB1OCBlaWQsIHU4ICpvdWksIHU4IG91aV9sZW4pOwogCiB2b2lkIHJ0d19zZXRfc3VwcG9ydGVkX3JhdGUodTggKlN1cHBvcnRlZFJhdGVzLCB1aW50IG1vZGUpOwogCkBAIC0xMTMzLDE5ICs4ODEsNiBAQAogdTggKnJ0d19nZXRfd3BzX2F0dHJfY29udGVudCh1OCAqd3BzX2llLCB1aW50IHdwc19pZWxlbiwgdTE2IHRhcmdldF9hdHRyX2lkLAogCQkJICAgICB1OCAqYnVmX2NvbnRlbnQsIHVpbnQgKmxlbl9jb250ZW50KTsKIAotLyoqCi0gKiBmb3JfZWFjaF9pZSAtIGl0ZXJhdGUgb3ZlciBjb250aW51b3VzIElFcwotICogQGllOgotICogQGJ1ZjoKLSAqIEBidWZfbGVuOgotICovCi0jZGVmaW5lIGZvcl9lYWNoX2llKGllLCBidWYsIGJ1Zl9sZW4pIFwKLQlmb3IgKGllID0gKHZvaWQgKilidWY7ICgoKHU4ICopaWUpIC0gKCh1OCAqKWJ1ZikgKyAxKSA8IGJ1Zl9sZW47CVwKLQkJaWUgPSAodm9pZCAqKSgoKHU4ICopaWUpICsgKigoKHU4ICopaWUpKzEpICsgMikpCi0KLXZvaWQgZHVtcF9pZXModTggKmJ1ZiwgdTMyIGJ1Zl9sZW4pOwotdm9pZCBkdW1wX3dwc19pZSh1OCAqaWUsIHUzMiBpZV9sZW4pOwotCiB1aW50CXJ0d19nZXRfcmF0ZXNldF9sZW4odTgJKnJhdGVzZXQpOwogCiBzdHJ1Y3QgcmVnaXN0cnlfcHJpdjsKQEAgLTExNjcsOCArOTAyLDQgQEAKIHUxNiBydHdfbWNzX3JhdGUodTggcmZfdHlwZSwgdTggYndfNDBNSHosIHU4IHNob3J0X0dJXzIwLCB1OCBzaG9ydF9HSV80MCwKIAkJIHVuc2lnbmVkIGNoYXIgKk1DU19yYXRlKTsKIAotaW50IHJ0d19hY3Rpb25fZnJhbWVfcGFyc2UoY29uc3QgdTggKmZyYW1lLCB1MzIgZnJhbWVfbGVuLCB1OCAqY2F0ZWdvcnksCi0JCQkgICB1OCAqYWN0aW9uKTsKLWNvbnN0IGNoYXIgKmFjdGlvbl9wdWJsaWNfc3RyKHU4IGFjdGlvbik7Ci0KICNlbmRpZiAvKiBJRUVFODAyMTFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29kbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29kbS5oCmluZGV4IGRiZWJmMTcuLjgwNWY1MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vZG0uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb2RtLmgKQEAgLTMxNSwyMiArMzE1LDYgQEAKIAlPRE1fUFNEMkFGSAkJPSAweDAwMDAwODAwCiB9OwogCi0vKiAgMjAxMS8yMC8yMCBNSCBGb3IgTVAgZHJpdmVyIFJUX1dMQU5fU1RBID0gIHN0cnVjdCBzdGFfaW5mbyAqLwotLyogIFBsZWFzZSBkZWNsYXJlIGJlbG93IE9ETSByZWxhdGl2ZSBpbmZvIGluIHlvdXIgU1RBIGluZm8gc3RydWN0dXJlLiAqLwotCi1zdHJ1Y3Qgb2RtX3N0YV9pbmZvIHsKLQkvKiAgRHJpdmVyIFdyaXRlICovCi0JYm9vbAliVXNlZDsJCS8qICByZWNvcmQgdGhlIHN0YSBzdGF0dXMgbGluayBvciBub3Q/ICovCi0JdTgJSU9UUGVlcjsJLyogIEVudW0gdmFsdWUuCUhUX0lPVF9QRUVSX0UgKi8KLQotCS8qICBPRE0gV3JpdGUgKi8KLQkvKiAxIFBIWV9TVEFUVVNfSU5GTyAqLwotCXU4CVJTU0lfUGF0aFs0XTsJCS8qICAqLwotCXU4CVJTU0lfQXZlOwotCXU4CVJYRVZNWzRdOwotCXU4CVJYU05SWzRdOwotfTsKLQogLyogIDIwMTEvMTAvMjAgTUggRGVmaW5lIENvbW1vbiBpbmZvIGVudW0gZm9yIGFsbCB0ZWFtLiAqLwogCiBlbnVtIG9kbV9jb21tb25faW5mb19kZWYgewpAQCAtNzQwLDggKzcyNCw2IEBACiAJdTMyCVN1cHBvcnRJQ1R5cGU7CiAJLyogIEN1dCBWZXJzaW9uIFRlc3RDaGlwL0EtY3V0L0ItY3V0Li4uID0gMC8xLzIvMy8uLi4gKi8KIAl1OAlDdXRWZXJzaW9uOwotCS8qICBSRiBUeXBlIDRUNFIvM1QzUi8yVDJSLzFUMlIvMVQxUi8uLi4gKi8KLQl1OAlSRlR5cGU7CiAJLyogIEJvYXJkIFR5cGUgTm9ybWFsL0hpZ2hQb3dlci9NaW5pQ2FyZC9TTElNL0NvbWJvLy4gPSAwLzEvMi8zLzQvLiAqLwogCXU4CUJvYXJkVHlwZTsKIAkvKiAgd2l0aCBleHRlcm5hbCBMTkEgIE5PL1llcyA9IDAvMSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29zZGVwX2ludGYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vc2RlcF9pbnRmLmgKaW5kZXggNTRmY2E3OS4uZGJkN2RjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29zZGVwX2ludGYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb3NkZXBfaW50Zi5oCkBAIC0zNCw3ICszNCw2IEBACiBpbnQgcnR3X2luaXRfbmV0ZGV2X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYsIGNvbnN0IGNoYXIgKmlmbmFtZSk7CiBzdHJ1Y3QgbmV0X2RldmljZSAqcnR3X2luaXRfbmV0ZGV2KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiB1MTYgcnR3X3JlY3Zfc2VsZWN0X3F1ZXVlKHN0cnVjdCBza19idWZmICpza2IpOwotdm9pZCBydHdfcHJvY19yZW1vdmVfb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiBpbnQgcG1fbmV0ZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYsIHU4IGJub3JtYWwpOwogdm9pZCBydHdfaXBzX2Rldl91bmxvYWQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vc2RlcF9zZXJ2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb3NkZXBfc2VydmljZS5oCmluZGV4IDU0NzU5NTYuLjkwNDdiNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vc2RlcF9zZXJ2aWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29zZGVwX3NlcnZpY2UuaApAQCAtMzUsNyArMzUsNyBAQAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VtLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgpAQCAtNDQsNyArNDQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgkvKiAgTmVjZXNzYXJ5IGJlY2F1c2Ugd2UgdXNlIHRoZSBwcm9jIGZzICovCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qICBmb3Igc3RydWN0IHRhc2tsZXRfc3RydWN0ICovCiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CkBAIC03OCwxNiArNzcsMTIgQEAKIAogdm9pZCAqcnR3X21hbGxvYzJkKGludCBoLCBpbnQgdywgaW50IHNpemUpOwogCi11MzIgIF9ydHdfZG93bl9zZW1hKHN0cnVjdCBzZW1hcGhvcmUgKnNlbWEpOwotCiB2b2lkIF9ydHdfaW5pdF9xdWV1ZShzdHJ1Y3QgX19xdWV1ZSAqcHF1ZXVlKTsKIAogc3RydWN0IHJ0d19uZXRkZXZfcHJpdl9pbmRpY2F0b3IgewogCXZvaWQgKnByaXY7Ci0JdTMyIHNpemVvZl9wcml2OwogfTsKLXN0cnVjdCBuZXRfZGV2aWNlICpydHdfYWxsb2NfZXRoZXJkZXZfd2l0aF9vbGRfcHJpdihpbnQgc2l6ZW9mX3ByaXYsCi0JCQkJCQkgICAgdm9pZCAqb2xkX3ByaXYpOworc3RydWN0IG5ldF9kZXZpY2UgKnJ0d19hbGxvY19ldGhlcmRldl93aXRoX29sZF9wcml2KHZvaWQgKm9sZF9wcml2KTsKIAogI2RlZmluZSBydHdfbmV0ZGV2X3ByaXYobmV0ZGV2KQkJCQkJXAogCSgoKHN0cnVjdCBydHdfbmV0ZGV2X3ByaXZfaW5kaWNhdG9yICopbmV0ZGV2X3ByaXYobmV0ZGV2KSktPnByaXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcGh5LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcGh5LmgKaW5kZXggOWE5YWI4Mi4uY2QzODdlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3BoeS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9waHkuaApAQCAtMTEsMTcgKzExLDEzIEBACiAKIHUzMiBwaHlfcXVlcnlfYmJfcmVnKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrKTsKIHZvaWQgcGh5X3NldF9iYl9yZWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2ssIHUzMiBkYXRhKTsKLXUzMiBwaHlfcXVlcnlfcmZfcmVnKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgZW51bSByZl9yYWRpb19wYXRoIHJmX3BhdGgsCit1MzIgcnR3X2hhbF9yZWFkX3JmcmVnKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgZW51bSByZl9yYWRpb19wYXRoIHJmX3BhdGgsCiAJCSAgICAgdTMyIHJlZ19hZGRyLCB1MzIgYml0X21hc2spOwogdm9pZCBwaHlfc2V0X3JmX3JlZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIGVudW0gcmZfcmFkaW9fcGF0aCByZl9wYXRoLAogCQkgICAgdTMyIHJlZ19hZGRyLCB1MzIgYml0X21hc2ssIHUzMiBkYXRhKTsKIAogdm9pZCBwaHlfc2V0X3R4X3Bvd2VyX2xldmVsKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggY2hhbm5lbCk7CiAKLXZvaWQgcGh5X3NldF9id19tb2RlKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgZW51bSBodF9jaGFubmVsX3dpZHRoIGJhbmR3aWR0aCwKLQkJICAgICB1bnNpZ25lZCBjaGFyIG9mZnNldCk7Ci12b2lkIHBoeV9zd19jaG5sKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggY2hhbm5lbCk7Ci0KIHZvaWQgcnRsODhldV9kbV90eHBvd2VyX3RyYWNrX2FkanVzdChzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtLAogCQkJCSAgICAgdTggdHlwZSwgdTggKmRpciwgdTMyICpvdXRfd3JpdGUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcmVjdl9vc2RlcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3JlY3Zfb3NkZXAuaAppbmRleCBjYWQzMTU4Li43NTUwZDU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcmVjdl9vc2RlcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9yZWN2X29zZGVwLmgKQEAgLTI2LDEzICsyNiw5IEBACiBzMzIgIHJ0d19yZWN2X2VudHJ5KHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiBpbnQgcnR3X3JlY3ZfaW5kaWNhdGVwa3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkgc3RydWN0IHJlY3ZfZnJhbWUgKnJlY3ZfZnJhbWUpOwotdm9pZCBydHdfcmVjdl9yZXR1cm5wYWNrZXQoc3RydWN0ICBuZXRfZGV2aWNlICpjbnh0LCBzdHJ1Y3Qgc2tfYnVmZiAqcmV0cGt0KTsKIAogdm9pZCBydHdfaGFuZGxlX3RraXBfbWljX2VycihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJncm91cCk7CiAKLWludCBydHdfaW5pdF9yZWN2X3ByaXYoc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2LCBzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydHdfZnJlZV9yZWN2X3ByaXYoc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2KTsKLQogdm9pZCBydHdfb3NfcmVjdl9yZXNvdXJjZV9hbGxvYyhzdHJ1Y3QgcmVjdl9mcmFtZSAqcmVjdmZyKTsKIAogaW50IHJ0d19vc19yZWN2YnVmX3Jlc291cmNlX2FsbG9jKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgc3RydWN0IHJlY3ZfYnVmICpidWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2NtZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2NtZC5oCmluZGV4IDRkN2Q4MDQuLjA0MmI0ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9jbWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfY21kLmgKQEAgLTQ5LDEyICs0OSw2IEBACiAJIEgyQ19SRVNFVF9UU0YJCQk9IDB4YzAsCiB9OwogCi1zdHJ1Y3QgY21kX21zZ19wYXJtIHsKLQl1OCBlaWQ7IC8qIGVsZW1lbnQgaWQgKi8KLQl1OCBzejsgLyogIHN6ICovCi0JdTggYnVmWzZdOwotfTsKLQogZW51bSB7CiAJUFdSUwogfTsKQEAgLTY3LDE1ICs2MSw2IEBACiAJdTggUHdyU3RhdGU7LyogQWxsT04oMHgwYyksUkZPTigweDA0KSxSRk9GRigweDAwKSAqLwogfTsKIAotc3RydWN0IEgyQ19TU19SRk9GRl9QQVJBTSB7Ci0JdTggUk9GT247IC8qICAxOiBvbiwgMDpvZmYgKi8KLQl1MTYgZ3Bpb19wZXJpb2Q7IC8qICB1bml0OiAxMDI0IHVzICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgam9pbmJzc3JwdF9wYXJtIHsKLQl1OCBPcE1vZGU7CS8qICBSVF9NRURJQV9TVEFUVVMgKi8KLX07Ci0KIHN0cnVjdCByc3ZkcGFnZV9sb2MgewogCXU4IExvY1Byb2JlUnNwOwogCXU4IExvY1BzUG9sbDsKQEAgLTg0LDI2ICs2OSw5IEBACiAJdTggTG9jQlRRb3NOdWxsOwogfTsKIAotc3RydWN0IFAyUF9QU19PZmZsb2FkX3QgewotCXU4IE9mZmxvYWRfRW46MTsKLQl1OCByb2xlOjE7IC8qICAxOiBPd25lciwgMDogQ2xpZW50ICovCi0JdTggQ1RXaW5kb3dfRW46MTsKLQl1OCBOb0EwX0VuOjE7Ci0JdTggTm9BMV9FbjoxOwotCXU4IEFsbFN0YVNsZWVwOjE7IC8qICBPbmx5IHZhbGlkIGluIE93bmVyICovCi0JdTggZGlzY292ZXJ5OjE7Ci0JdTggcnN2ZDoxOwotfTsKLQotc3RydWN0IFAyUF9QU19DVFdQZXJpb2RfdCB7Ci0JdTggQ1RXUGVyaW9kOwkvKiBUVSAqLwotfTsKLQogLyogIGhvc3QgbWVzc2FnZSB0byBmaXJtd2FyZSBjbWQgKi8KIHZvaWQgcnRsODE4OGVfc2V0X0Z3UHdyTW9kZV9jbWQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCBNb2RlKTsKIHZvaWQgcnRsODE4OGVfc2V0X0Z3Sm9pbkJzc1JlcG9ydF9jbWQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCBtc3RhdHVzKTsKLXZvaWQgcnRsODE4OGVfQWRkX1JhdGVBVGlkKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTMyIGJpdG1hcCwgdTggYXJnLAotCQkJICAgdTggcnNzaV9sZXZlbCk7CiAKIHZvaWQgcnRsODE4OGVfc2V0X0Z3TWVkaWFTdGF0dXNfY21kKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgX19sZTE2IG1zdGF0dXNfcnB0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2RtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfZG0uaAppbmRleCA0MTkwMTEyLi5jMGZmZDk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfZG0uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfZG0uaApAQCAtNDUsMTIgKzQ1LDkgQEAKIAl1OAlQb3dlckluZGV4X2JhY2t1cFs2XTsKIH07CiAKLXZvaWQgcnRsODE4OGVfaW5pdF9kbV9wcml2KHN0cnVjdCBhZGFwdGVyICphZGFwdCk7CiB2b2lkIHJ0bDgxODhlX0luaXRIYWxEbShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpOwotdm9pZCBydGw4MTg4ZV9IYWxEbVdhdGNoRG9nKHN0cnVjdCBhZGFwdGVyICphZGFwdCk7CiAKIHZvaWQgQW50RGl2Q29tcGFyZTgxODhFKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgc3RydWN0IHdsYW5fYnNzaWRfZXggKmRzdCwKIAkJCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpzcmMpOwotdTggQW50RGl2QmVmb3JlTGluazgxODhFKHN0cnVjdCBhZGFwdGVyICphZGFwdCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2hhbC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2hhbC5oCmluZGV4IDlkZDVjMjkuLjdjODFlM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9oYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfaGFsLmgKQEAgLTIwMiw3ICsyMDIsNiBAQAogCiAJLyogcmZfY3RybCAqLwogCXU4CXJmX2NoaXA7Ci0JdTgJcmZfdHlwZTsKIAl1OAlOdW1Ub3RhbFJGUGF0aDsKIAogCXU4CUJvYXJkVHlwZTsKQEAgLTM1MSwxMCArMzUwLDYgQEAKIAl1OAlVc2JSeEFnZ1BhZ2VUaW1lb3V0OwogfTsKIAotI2RlZmluZSBHRVRfSEFMX0RBVEEoX19wQWRhcHRlcikJCQkJXAotCSgoc3RydWN0IGhhbF9kYXRhXzgxODhlICopKChfX3BBZGFwdGVyKS0+SGFsRGF0YSkpCi0jZGVmaW5lIEdFVF9SRl9UWVBFKHByaXYpCQkoR0VUX0hBTF9EQVRBKHByaXYpLT5yZl90eXBlKQotCiAvKiAgcnRsODE4OGVfaGFsX2luaXQuYyAqLwogdm9pZCBfODA1MVJlc2V0ODhFKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiB2b2lkIHJ0bDgxODhlX0luaXRpYWxpemVGaXJtd2FyZVZhcnMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKQEAgLTM4NSw4ICszODAsNiBAQAogdm9pZCBIYWxfUmVhZFBvd2VyU2F2aW5nTW9kZTg4RShzdHJ1Y3QgYWRhcHRlciAqcEFkYXB0ZXIsIHU4ICpod2luZm8sCiAJCQkJYm9vbCBBdXRvTG9hZEZhaWwpOwogCi12b2lkIHJ0bDgxODhlX3NldF9oYWxfb3BzKHN0cnVjdCBoYWxfb3BzICpwSGFsRnVuYyk7Ci0KIC8qICByZWdpc3RlciAqLwogCiB2b2lkIHJ0bDgxODhlX3N0YXJ0X3RocmVhZChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2xlZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2xlZC5oCmluZGV4IGZjYTZkOGMuLmQxYWQ2YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9sZWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfbGVkLmgKQEAgLTIyLDggKzIyLDYgQEAKIC8qICAqLwogLyogIEludGVyZmFjZSB0byBtYW5pcHVsYXRlIExFRCBvYmplY3RzLiAqLwogLyogICovCi12b2lkIHJ0bDgxODhldV9Jbml0U3dMZWRzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDgxODhldV9EZUluaXRTd0xlZHMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIHZvaWQgU3dMZWRPbihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBMRURfODcxeCAqcExlZCk7CiB2b2lkIFN3TGVkT2ZmKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IExFRF84NzF4ICpwTGVkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX3JlY3YuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9yZWN2LmgKaW5kZXggNTQwNDhiYy4uODA4MzJhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX3JlY3YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfcmVjdi5oCkBAIC01MSwxMiArNTEsMTEgQEAKIH07CiAKICNkZWZpbmUgSU5URVJSVVBUX01TR19GT1JNQVRfTEVOIDYwCi1zMzIgcnRsODE4OGV1X2luaXRfcmVjdl9wcml2KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDgxODhldV9mcmVlX3JlY3ZfcHJpdihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogdm9pZCBydGw4MTg4ZXVfcmVjdl9oZGwoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmKTsKIHZvaWQgcnRsODE4OGV1X3JlY3ZfdGFza2xldCh2b2lkICpwcml2KTsKIHZvaWQgcnRsODE4OGVfcXVlcnlfcnhfcGh5X3N0YXR1cyhzdHJ1Y3QgcmVjdl9mcmFtZSAqZnIsIHN0cnVjdCBwaHlfc3RhdCAqcGh5KTsKLXZvaWQgcnRsODE4OGVfcHJvY2Vzc19waHlfaW5mbyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHZvaWQgKnByZnJhbWUpOwordm9pZCBydGw4MTg4ZV9wcm9jZXNzX3BoeV9pbmZvKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKKwkJCSAgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSk7CiB2b2lkIHVwZGF0ZV9yZWN2ZnJhbWVfcGh5aW5mb184OGUoc3RydWN0IHJlY3ZfZnJhbWUgKmZyYSwgc3RydWN0IHBoeV9zdGF0ICpwaHkpOwogdm9pZCB1cGRhdGVfcmVjdmZyYW1lX2F0dHJpYl84OGUoc3RydWN0IHJlY3ZfZnJhbWUgKmZyYSwKIAkJCQkgc3RydWN0IHJlY3Zfc3RhdCAqc3RhdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfeG1pdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX3htaXQuaAppbmRleCA2NWE2M2RmLi42NjIwNWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfeG1pdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV94bWl0LmgKQEAgLTE1NCwxNCArMTU0LDExIEBACiB2b2lkIHJ0bDgxODhlX2ZpbGxfZmFrZV90eGRlc2Moc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcERlc2MsCiAJCQkgICAgICAgdTMyIEJ1ZmZlckxlbiwgdTggSXNQc1BvbGwsIHU4IElzQlRRb3NOdWxsKTsKIHMzMiBydGw4MTg4ZXVfaW5pdF94bWl0X3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLXMzMiBydGw4MTg4ZXVfaGFsX3htaXQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9mcmFtZSAqZnJhbWUpOwotczMyIHJ0bDgxODhldV9tZ250X3htaXQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9mcmFtZSAqZnJhbWUpOwogczMyIHJ0bDgxODhldV94bWl0X2J1Zl9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiAjZGVmaW5lIGhhbF94bWl0X2hhbmRsZXIgcnRsODE4OGV1X3htaXRfYnVmX2hhbmRsZXIKIHZvaWQgcnRsODE4OGV1X3htaXRfdGFza2xldCh2b2lkICpwcml2KTsKIHMzMiBydGw4MTg4ZXVfeG1pdGZyYW1lX2NvbXBsZXRlKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LAotCQkJCSBzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmKTsKKwkJCQkgc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KTsKIAogdm9pZCBkdW1wX3R4cnB0X2NjeF84OGUodm9pZCAqYnVmKTsKIHZvaWQgaGFuZGxlX3R4cnB0X2NjeF84OGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpidWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19hcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19hcC5oCmluZGV4IGI4MjA2ODQuLmU4ZGQ2ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfYXAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2FwLmgKQEAgLTUwLDcgKzUwLDYgQEAKIHU4IGFwX2ZyZWVfc3RhKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhLAogCSAgICAgICBib29sIGFjdGl2ZSwgdTE2IHJlYXNvbik7CiBpbnQgcnR3X3N0YV9mbHVzaChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotaW50IHJ0d19hcF9pbmZvcm1fY2hfc3dpdGNoKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggbmV3X2NoLCB1OCBjaF9vZmZzZXQpOwogdm9pZCBzdGFydF9hcF9tb2RlKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiB2b2lkIHN0b3BfYXBfbW9kZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogI2VuZGlmIC8qIGVuZCBvZiBDT05GSUdfODhFVV9BUF9NT0RFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2NtZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19jbWQuaAppbmRleCAwOGNhNTkyLi4xOGE2NTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2NtZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfY21kLmgKQEAgLTM5LDggKzM5LDggQEAKIH07CiAKIHN0cnVjdCBjbWRfcHJpdiB7Ci0Jc3RydWN0IHNlbWFwaG9yZSBjbWRfcXVldWVfc2VtYTsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHRlcm1pbmF0ZV9jbWR0aHJlYWRfc2VtYTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjbWRfcXVldWVfY29tcDsKKwlzdHJ1Y3QgY29tcGxldGlvbiB0ZXJtaW5hdGVfY21kdGhyZWFkX2NvbXA7CiAJc3RydWN0IF9fcXVldWUgY21kX3F1ZXVlOwogCXU4IGNtZHRoZF9ydW5uaW5nOwogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcjsKQEAgLTIxMCwzNCArMjEwLDYgQEAKIH07CiAKIC8qCi0JQ2FsbGVyIEFkLUhvYy9BUAotCi0JQ29tbWFuZCBtb2RlCi0KLQlUaGlzIGlzIHRvIGZvcmNlIGZ3IHRvIGRlbCBhbiBzdGFfZGF0YSBlbnRyeSBwZXIgZHJpdmVyJ3MgcmVxdWVzdAotCi0JRlcgd2lsbCBpbnZhbGlkYXRlIHRoZSBjYW0gZW50cnkgYXNzb2NpYXRlZCB3aXRoIGl0LgotCi0qLwotc3RydWN0IGRlbF9hc3NvY3N0YV9wYXJtIHsKLQl1OAlhZGRyW0VUSF9BTEVOXTsKLX07Ci0KLS8qCi1DYWxsZXIgTW9kZTogQVAvQWQtSG9DKE0pCi0KLU5vdGVzOiBUbyBub3RpZnkgZncgdGhhdCBnaXZlbiBzdGFpZCBoYXMgY2hhbmdlZCBpdHMgcG93ZXIgc3RhdGUKLQotQ29tbWFuZCBNb2RlCi0KLSovCi1zdHJ1Y3Qgc2V0c3RhcHdyc3RhdGVfcGFybSB7Ci0JdTgJc3RhaWQ7Ci0JdTgJc3RhdHVzOwotCXU4CWh3YWRkcls2XTsKLX07Ci0KLS8qCiAJTm90ZXM6IFRoaXMgY29tbWFuZCBpcyB1c2VkIGZvciBIMkMvQzJIIGxvb3BiYWNrIHRlc3RpbmcKIAogCW1hY1swXSA9PSAwCkBAIC0zMTIsOCArMjg0LDYgQEAKIAl1OCBjaGFubmVsX3BsYW47CiB9OwogCi0jZGVmaW5lIEdFTl9DTURfQ09ERShjbWQpCWNtZCAjIyBfQ01EXwotCiAvKgogCiBSZXN1bHQ6CkBAIC0zNzYsNDIgKzM0Niw0MiBAQAogfTsKIAogZW51bSBydHdfaDJjX2NtZCB7Ci0JR0VOX0NNRF9DT0RFKF9Kb2luQnNzKSwKLQlHRU5fQ01EX0NPREUoX0Rpc0Nvbm5lY3QpLAotCUdFTl9DTURfQ09ERShfQ3JlYXRlQnNzKSwKLQlHRU5fQ01EX0NPREUoX1NldE9wTW9kZSksCi0JR0VOX0NNRF9DT0RFKF9TaXRlU3VydmV5KSwKLQlHRU5fQ01EX0NPREUoX1NldEF1dGgpLAotCUdFTl9DTURfQ09ERShfU2V0S2V5KSwKLQlHRU5fQ01EX0NPREUoX1NldFN0YUtleSksCi0JR0VOX0NNRF9DT0RFKF9TZXRBc3NvY1N0YSksCi0JR0VOX0NNRF9DT0RFKF9BZGRCQVJlcSksCi0JR0VOX0NNRF9DT0RFKF9TZXRDaGFubmVsKSwKLQlHRU5fQ01EX0NPREUoX1RYX0JlYWNvbiksCi0JR0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpLAotCUdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSksCi0JR0VOX0NNRF9DT0RFKF9TZXRDaGFubmVsUGxhbiksCisJX0pvaW5Cc3NfQ01EXywKKwlfRGlzQ29ubmVjdF9DTURfLAorCV9DcmVhdGVCc3NfQ01EXywKKwlfU2V0T3BNb2RlX0NNRF8sCisJX1NpdGVTdXJ2ZXlfQ01EXywKKwlfU2V0QXV0aF9DTURfLAorCV9TZXRLZXlfQ01EXywKKwlfU2V0U3RhS2V5X0NNRF8sCisJX1NldEFzc29jU3RhX0NNRF8sCisJX0FkZEJBUmVxX0NNRF8sCisJX1NldENoYW5uZWxfQ01EXywKKwlfVFhfQmVhY29uX0NNRF8sCisJX1NldF9NTE1FX0VWVF9DTURfLAorCV9TZXRfRHJ2X0V4dHJhX0NNRF8sCisJX1NldENoYW5uZWxQbGFuX0NNRF8sCiAKIAlNQVhfSDJDQ01ECiB9OwogCiAjaWZkZWYgX1JUV19DTURfQ18KIHN0YXRpYyBzdHJ1Y3QgX2NtZF9jYWxsYmFjawlydHdfY21kX2NhbGxiYWNrW10gPSB7Ci0Je0dFTl9DTURfQ09ERShfSm9pbkJzcyksICZydHdfam9pbmJzc19jbWRfY2FsbGJhY2t9LAotCXtHRU5fQ01EX0NPREUoX0Rpc0Nvbm5lY3QpLCAmcnR3X2Rpc2Fzc29jX2NtZF9jYWxsYmFja30sCi0Je0dFTl9DTURfQ09ERShfQ3JlYXRlQnNzKSwgJnJ0d19jcmVhdGVic3NfY21kX2NhbGxiYWNrfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRPcE1vZGUpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9TaXRlU3VydmV5KSwgJnJ0d19zdXJ2ZXlfY21kX2NhbGxiYWNrfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRBdXRoKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0S2V5KSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0U3RhS2V5KSwgJnJ0d19zZXRzdGFLZXlfY21kcnNwX2NhbGxiYWNrfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRBc3NvY1N0YSksICZydHdfc2V0YXNzb2NzdGFfY21kcnNwX2NhbGxiYWNrfSwKLQl7R0VOX0NNRF9DT0RFKF9BZGRCQVJlcSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1NldENoYW5uZWwpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9UWF9CZWFjb24pLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRfRHJ2X0V4dHJhKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0Q2hhbm5lbFBsYW4pLCBOVUxMfSwKKwl7X0pvaW5Cc3NfQ01EXywgJnJ0d19qb2luYnNzX2NtZF9jYWxsYmFja30sCisJe19EaXNDb25uZWN0X0NNRF8sICZydHdfZGlzYXNzb2NfY21kX2NhbGxiYWNrfSwKKwl7X0NyZWF0ZUJzc19DTURfLCAmcnR3X2NyZWF0ZWJzc19jbWRfY2FsbGJhY2t9LAorCXtfU2V0T3BNb2RlX0NNRF8sIE5VTEx9LAorCXtfU2l0ZVN1cnZleV9DTURfLCAmcnR3X3N1cnZleV9jbWRfY2FsbGJhY2t9LAorCXtfU2V0QXV0aF9DTURfLCBOVUxMfSwKKwl7X1NldEtleV9DTURfLCBOVUxMfSwKKwl7X1NldFN0YUtleV9DTURfLCAmcnR3X3NldHN0YUtleV9jbWRyc3BfY2FsbGJhY2t9LAorCXtfU2V0QXNzb2NTdGFfQ01EXywgJnJ0d19zZXRhc3NvY3N0YV9jbWRyc3BfY2FsbGJhY2t9LAorCXtfQWRkQkFSZXFfQ01EXywgTlVMTH0sCisJe19TZXRDaGFubmVsX0NNRF8sIE5VTEx9LAorCXtfVFhfQmVhY29uX0NNRF8sIE5VTEx9LAorCXtfU2V0X01MTUVfRVZUX0NNRF8sIE5VTEx9LAorCXtfU2V0X0Rydl9FeHRyYV9DTURfLCBOVUxMfSwKKwl7X1NldENoYW5uZWxQbGFuX0NNRF8sIE5VTEx9LAogfTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2RlYnVnLmgKaW5kZXggN2VkNGNhZC4uOTU1OTBhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfZGVidWcuaApAQCAtMTI5LDEzMyArMTI5LDEyIEBACiBpbnQgcHJvY19zZXRfcmVhZF9yZWcoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiAJCSAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOwogCi1pbnQgcHJvY19nZXRfZndzdGF0ZShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCSAgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCSAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotaW50IHByb2NfZ2V0X3NlY19pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJICAgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCSAgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLWludCBwcm9jX2dldF9tbG1leHRfc3RhdGUoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfcW9zX29wdGlvbihjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQlvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCWludCAqZW9mLCB2b2lkICpkYXRhKTsKLWludCBwcm9jX2dldF9odF9vcHRpb24oY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkgICAgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCSAgICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci1pbnQgcHJvY19nZXRfcmZfaW5mbyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCSAgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCSAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotaW50IHByb2NfZ2V0X2FwX2luZm8oY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkgICAgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQogaW50IHByb2NfZ2V0X2FkYXB0ZXJfc3RhdGUoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAogCQkJICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCiAJCQkgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CiAKLWludCBwcm9jX2dldF90cnhfaW5mbyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCSAgICAgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkgICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX2dldF9tYWNfcmVnX2R1bXAxKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfbWFjX3JlZ19kdW1wMihjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2NfZ2V0X21hY19yZWdfZHVtcDMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX2dldF9iYl9yZWdfZHVtcDEoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfYmJfcmVnX2R1bXAyKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2NfZ2V0X2JiX3JlZ19kdW1wMyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX2dldF9yZl9yZWdfZHVtcDEoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfcmZfcmVnX2R1bXAyKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2NfZ2V0X3JmX3JlZ19kdW1wMyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX2dldF9yZl9yZWdfZHVtcDQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi0jaWZkZWYgQ09ORklHXzg4RVVfQVBfTU9ERQotCi1pbnQgcHJvY19nZXRfYWxsX3N0YV9pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotI2VuZGlmCi0KIGludCBwcm9jX2dldF9iZXN0X2NoYW5uZWwoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAogCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKIAkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwogCi1pbnQgcHJvY19nZXRfcnhfc2lnbmFsKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJICAgICAgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkgICAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19zZXRfcnhfc2lnbmFsKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX2dldF9odF9lbmFibGUoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkgICAgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCSAgICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX3NldF9odF9lbmFibGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKLQotaW50IHByb2NfZ2V0X2NidzQwX2VuYWJsZShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX3NldF9jYnc0MF9lbmFibGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JCQkgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfYW1wZHVfZW5hYmxlKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2Nfc2V0X2FtcGR1X2VuYWJsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJCSAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX2dldF9yeF9zdGJjKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJICAgICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX3NldF9yeF9zdGJjKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfdHdvX3BhdGhfcnNzaShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2NfZ2V0X3Jzc2lfZGlzcChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCSAgICAgICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJICAgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2Nfc2V0X3Jzc2lfZGlzcChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOwotCiAjZW5kaWYJLyogX19SVFdfREVCVUdfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2VmdXNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2VmdXNlLmgKaW5kZXggOWJmYjEwYy4uMTY4YzEyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19lZnVzZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfZWZ1c2UuaApAQCAtMzQsMTYgKzM0LDYgQEAKICNkZWZpbmUJRUZVU0VfV0lGSQkJCQkwCiAjZGVmaW5lCUVGVVNFX0JUCQkJCTEKIAotZW51bSBfRUZVU0VfREVGX1RZUEUgewotCVRZUEVfRUZVU0VfTUFYX1NFQ1RJT04JCQkJPSAwLAotCVRZUEVfRUZVU0VfUkVBTF9DT05URU5UX0xFTgkJCT0gMSwKLQlUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19CQU5LCQk9IDIsCi0JVFlQRV9BVkFJTEFCTEVfRUZVU0VfQllURVNfVE9UQUwJPSAzLAotCVRZUEVfRUZVU0VfTUFQX0xFTgkJCQkJPSA0LAotCVRZUEVfRUZVU0VfUFJPVEVDVF9CWVRFU19CQU5LCQk9IDUsCi0JVFlQRV9FRlVTRV9DT05URU5UX0xFTl9CQU5LCQkJPSA2LAotfTsKLQogLyogRS1GdXNlICovCiAjZGVmaW5lIEVGVVNFX01BUF9TSVpFICAgICAgNTEyCiAjZGVmaW5lIEVGVVNFX01BWF9TSVpFICAgICAgMjU2CkBAIC05NSw4ICs4NSw2IEBACiB9OwogCiB1OCBFZnVzZV9DYWxjdWxhdGVXb3JkQ250cyh1OCB3b3JkX2VuKTsKLXZvaWQgRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggdHlwZSwgdTggdHlwZTEsCi0JCQkgICAgICB2b2lkICpvdXQpOwogdTggZWZ1c2VfT25lQnl0ZVJlYWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBhZGRyLCB1OCAqZGF0YSk7CiB1OCBlZnVzZV9PbmVCeXRlV3JpdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBhZGRyLCB1OCBkYXRhKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19ldmVudC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19ldmVudC5oCmluZGV4IDVjMzRlNTYuLjFjNWViZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfZXZlbnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2V2ZW50LmgKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+CiAKICNpbmNsdWRlIDx3bGFuX2Jzc2RlZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VtLmg+CiAKIC8qCkBAIC03MSwxMiArNzEsNiBAQAogCWludCBtYWNfaWQ7CiB9OwogCi1zdHJ1Y3QgYWRkYmFfZXZlbnQgewotCXVuc2lnbmVkIGludCB0aWQ7Ci19OwotCi0jZGVmaW5lIEdFTl9FVlRfQ09ERShldmVudCkJZXZlbnQgIyMgX0VWVF8KLQogc3RydWN0IGZ3ZXZlbnQgewogCXUzMglwYXJtc2l6ZTsKIAl2b2lkICgqZXZlbnRfY2FsbGJhY2spKHN0cnVjdCBhZGFwdGVyICpkZXYsIHU4ICpwYnVmKTsKQEAgLTg0LDIxICs3OCw2IEBACiAKICNkZWZpbmUgQzJIRVZFTlRfU1oJCQkzMgogCi1zdHJ1Y3QgZXZlbnRfbm9kZSB7Ci0JdW5zaWduZWQgY2hhciAqbm9kZTsKLQl1bnNpZ25lZCBjaGFyIGV2dF9jb2RlOwotCXVuc2lnbmVkIHNob3J0IGV2dF9zejsKLQlpbnQJKmNhbGxlcl9mZl90YWlsOwotCWludAljYWxsZXJfZmZfc3o7Ci19OwotCi1zdHJ1Y3QgYzJoZXZlbnRfcXVldWUgewotCWludAloZWFkOwotCWludAl0YWlsOwotCXN0cnVjdAlldmVudF9ub2RlCW5vZGVzW0MySEVWRU5UX1NaXTsKLQl1bnNpZ25lZCBjaGFyCXNlcTsKLX07Ci0KICNkZWZpbmUgTkVUV09SS19RVUVVRV9TWgk0CiAKIHN0cnVjdCBuZXR3b3JrX3F1ZXVlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfaHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfaHQuaAppbmRleCBiNDU0ODNmLi5kODQyZWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2h0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19odC5oCkBAIC0xNSwxNiArMTUsMTEgQEAKICNpZm5kZWYgX1JUV19IVF9IXwogI2RlZmluZSBfUlRXX0hUX0hfCiAKLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSAid2lmaS5oIgorI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgogCiBzdHJ1Y3QgaHRfcHJpdiB7CiAJdTMyCWh0X29wdGlvbjsKIAl1MzIJYW1wZHVfZW5hYmxlOy8qIGZvciBlbmFibGUgVHggQS1NUERVICovCi0JdTMyCXR4X2Ftc2R1X2VuYWJsZTsvKiBmb3IgZW5hYmxlIFR4IEEtTVNEVSAqLwotCXUzMgl0eF9hbWRzdV9tYXhsZW47IC8qICAxOiA4aywgMDo0ayA7IGRlZmF1bHQ6OGssIGZvciB0eCAqLwotCXUzMglyeF9hbXBkdV9tYXhsZW47IC8qIGZvciByeCByZW9yZGVyaW5nIGN0cmwgd2luX3N6LAotCQkJCSAgKiB1cGRhdGVkIHdoZW4gam9pbl9jYWxsYmFjay4gKi8KIAl1OAlid21vZGU7LyogICovCiAJdTgJY2hfb2Zmc2V0Oy8qIFBSSU1FX0NITkxfT0ZGU0VUICovCiAJdTgJc2dpOy8qIHNob3J0IEdJICovCkBAIC0zMyw3ICsyOCw3IEBACiAJdTgJYWdnX2VuYWJsZV9iaXRtYXA7CiAJdTgJY2FuZGlkYXRlX3RpZF9iaXRtYXA7CiAKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgaHRfY2FwOworCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwIGh0X2NhcDsKIH07CiAKICNlbmRpZgkvKiBfUlRMODcxWF9IVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19pb2N0bC5oCmluZGV4IDNhNjUyZGYuLmE2YjFjODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2lvY3RsLmgKQEAgLTY5LDE1ICs2OSw2IEBACiAJU0VUX09JRAogfTsKIAotc3RydWN0IG9pZF9mdW5zX25vZGUgewotCXVuc2lnbmVkIGludCBvaWRfc3RhcnQ7IC8qIHRoZSBzdGFydGluZyBudW1iZXIgZm9yIE9JRCAqLwotCXVuc2lnbmVkIGludCBvaWRfZW5kOyAvKiB0aGUgZW5kaW5nIG51bWJlciBmb3IgT0lEICovCi0Jc3RydWN0IG9pZF9vYmpfcHJpdiAqbm9kZV9hcnJheTsKLQl1bnNpZ25lZCBpbnQgYXJyYXlfc3o7IC8qIHRoZSBzaXplIG9mIG5vZGVfYXJyYXkgKi8KLQlpbnQgcXVlcnlfY291bnRlcjsgLyogY291bnQgdGhlIG51bWJlciBvZiBxdWVyeSBoaXRzIGZvciB0aGlzIHNlZ21lbnQgKi8KLQlpbnQgc2V0X2NvdW50ZXI7IC8qIGNvdW50IHRoZSBudW1iZXIgb2Ygc2V0IGhpdHMgZm9yIHRoaXMgc2VnbWVudCAqLwotfTsKLQogc3RydWN0IG9pZF9wYXJfcHJpdiB7CiAJdm9pZAkJKmFkYXB0ZXJfY29udGV4dDsKIAlORElTX09JRAlvaWQ7CkBAIC04OSwxMiArODAsNiBAQAogCXUzMgkJZGJnOwogfTsKIAotc3RydWN0IG9pZF9vYmpfcHJpdiB7Ci0JdW5zaWduZWQgY2hhcglkYmc7IC8qICAwOiB3aXRob3V0IE9JRCBkZWJ1ZyBtZXNzYWdlCi0JCQkgICAgICAqICAxOiB3aXRoIE9JRCBkZWJ1ZyBtZXNzYWdlICovCi0JaW50ICgqb2lkZnVucykoc3RydWN0IG9pZF9wYXJfcHJpdiAqcG9pZF9wYXJfcHJpdik7Ci19OwotCiAjaWYgZGVmaW5lZChfUlRXX01QX0lPQ1RMX0NfKQogc3RhdGljIGludCBvaWRfbnVsbF9mdW5jdGlvbihzdHJ1Y3Qgb2lkX3Bhcl9wcml2ICpwb2lkX3Bhcl9wcml2KSB7CiAJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZS5oCmluZGV4IDVkOGJjZTAuLjk0MzRiODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZS5oCkBAIC0zMDEsMTIgKzMwMSwxMCBAQAogCiAJdTggKm5pY19oZGw7CiAKLQl1OCBub3RfaW5kaWNfZGlzY287CiAJc3RydWN0IGxpc3RfaGVhZCAqcHNjYW5uZWQ7CiAJc3RydWN0IF9fcXVldWUgZnJlZV9ic3NfcG9vbDsKIAlzdHJ1Y3QgX19xdWV1ZSBzY2FubmVkX3F1ZXVlOwogCXU4ICpmcmVlX2Jzc19idWY7Ci0JdTMyCW51bV9vZl9zY2FubmVkOwogCiAJc3RydWN0IG5kaXNfODAyXzExX3NzaWQJYXNzb2Nfc3NpZDsKIAl1OAlhc3NvY19ic3NpZFs2XTsKQEAgLTMxOCwxMCArMzE2LDggQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdCBhc3NvY190aW1lcjsKIAogCXVpbnQgYXNzb2NfYnlfYnNzaWQ7Ci0JdWludCBhc3NvY19ieV9yc3NpOwogCiAJc3RydWN0IHRpbWVyX2xpc3Qgc2Nhbl90b190aW1lcjsgLyogIGRyaXZlciBpdHNlbGYgaGFuZGxlcyBzY2FuX3RpbWVvdXQgc3RhdHVzLiAqLwotCXUzMiBzY2FuX3N0YXJ0X3RpbWU7IC8qICB1c2VkIHRvIGV2YWx1YXRlIHRoZSB0aW1lIHNwZW50IGluIHNjYW5uaW5nICovCiAKIAlzdHJ1Y3QgcW9zX3ByaXYgcW9zcHJpdjsKIApAQCAtMzg3LDE3ICszODMsNiBAQAogCXUzMiB3cHNfcHJvYmVfcmVzcF9pZV9sZW47CiAJdTMyIHdwc19hc3NvY19yZXNwX2llX2xlbjsKIAotCXU4ICpwMnBfYmVhY29uX2llOwotCXU4ICpwMnBfcHJvYmVfcmVxX2llOwotCXU4ICpwMnBfcHJvYmVfcmVzcF9pZTsKLQl1OCAqcDJwX2dvX3Byb2JlX3Jlc3BfaWU7IC8qIGZvciBHTyAqLwotCXU4ICpwMnBfYXNzb2NfcmVxX2llOwotCi0JdTMyIHAycF9iZWFjb25faWVfbGVuOwotCXUzMiBwMnBfcHJvYmVfcmVxX2llX2xlbjsKLQl1MzIgcDJwX3Byb2JlX3Jlc3BfaWVfbGVuOwotCXUzMiBwMnBfZ29fcHJvYmVfcmVzcF9pZV9sZW47IC8qIGZvciBHTyAqLwotCXUzMiBwMnBfYXNzb2NfcmVxX2llX2xlbjsKIAlzcGlubG9ja190IGJjbl91cGRhdGVfbG9jazsKIAl1OAkJdXBkYXRlX2JjbjsKICNlbmRpZiAvKiBpZiBkZWZpbmVkIChDT05GSUdfODhFVV9BUF9NT0RFKSAqLwpAQCAtNTAwLDI3ICs0ODUsNiBAQAogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdXBfc2Nhbm5lZF9uZXR3b3JrKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKLXsKLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0JcG1sbWVwcml2LT5udW1fb2Zfc2Nhbm5lZCsrOwotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG93bl9zY2FubmVkX25ldHdvcmsoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2KQotewotCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQlwbWxtZXByaXYtPm51bV9vZl9zY2FubmVkLS07Ci0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc2Nhbm5lZF9uZXR3b3JrX3ZhbChzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsIGludCB2YWwpCi17Ci0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCXBtbG1lcHJpdi0+bnVtX29mX3NjYW5uZWQgPSB2YWw7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci19Ci0KIHUxNiBydHdfZ2V0X2NhcGFiaWxpdHkoc3RydWN0IHdsYW5fYnNzaWRfZXggKmJzcyk7CiB2b2lkIHJ0d191cGRhdGVfc2Nhbm5lZF9uZXR3b3JrKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAogCQkJCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICp0YXJnZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lX2V4dC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lX2V4dC5oCmluZGV4IDI3MzgyZmYuLjFiMWNhYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZV9leHQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWVfZXh0LmgKQEAgLTM0OSw3ICszNDksNyBAQAogCiAJc3RydWN0IEFEREJBX3JlcXVlc3QJQUREQkFfcmVxOwogCXN0cnVjdCBXTU1fcGFyYV9lbGVtZW50CVdNTV9wYXJhbTsKLQlzdHJ1Y3QgSFRfY2Fwc19lbGVtZW50CUhUX2NhcHM7CisJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgSFRfY2FwczsKIAlzdHJ1Y3QgSFRfaW5mb19lbGVtZW50CUhUX2luZm87CiAJc3RydWN0IHdsYW5fYnNzaWRfZXgJbmV0d29yazsvKiBqb2luIG5ldHdvcmsgb3IgYnNzX25ldHdvcmssCiAJCQkJCSAqIGlmIGluIGFwIG1vZGUsIGl0IGlzIHRoZSBzYW1lCkBAIC01MjksMTIgKzUyOSwxMiBAQAogdm9pZCB1cGRhdGVfc3RhX2luZm8oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpOwogdW5zaWduZWQgaW50IHVwZGF0ZV9iYXNpY19yYXRlKHVuc2lnbmVkIGNoYXIgKnB0biwgdW5zaWduZWQgaW50IHB0bl9zeik7CiB1bnNpZ25lZCBpbnQgdXBkYXRlX3N1cHBvcnRlZF9yYXRlKHVuc2lnbmVkIGNoYXIgKnB0biwgdW5zaWduZWQgaW50IHB0bl9zeik7Ci11bnNpZ25lZCBpbnQgdXBkYXRlX01TQ19yYXRlKHN0cnVjdCBIVF9jYXBzX2VsZW1lbnQgKnBIVF9jYXBzKTsKK3Vuc2lnbmVkIGludCB1cGRhdGVfTVNDX3JhdGUoc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKnBIVF9jYXBzKTsKIHZvaWQgVXBkYXRlX1JBX0VudHJ5KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTMyIG1hY19pZCk7CiB2b2lkIHNldF9zdGFfcmF0ZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7CiAKIHVuc2lnbmVkIGNoYXIgZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgodTMyIG1hc2spOwotaW50IHN1cHBvcnRfc2hvcnRfR0koc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgSFRfY2Fwc19lbGVtZW50ICpjYXBzKTsKK2ludCBzdXBwb3J0X3Nob3J0X0dJKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmNhcHMpOwogdW5zaWduZWQgaW50IGlzX2FwX2luX3RraXAoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIHVuc2lnbmVkIGludCBpc19hcF9pbl93ZXAoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIHVuc2lnbmVkIGludCBzaG91bGRfZm9yYmlkX25fcmF0ZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwpAQCAtNTYyLDggKzU2Miw2IEBACiAJCSAgICAgICB1MTYgdGlkLCBpbnQgdHJ5X2NudCwgaW50IHdhaXRfbXMpOwogaW50IGlzc3VlX2RlYXV0aChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhLAogCQkgdW5zaWduZWQgc2hvcnQgcmVhc29uKTsKLXZvaWQgaXNzdWVfYWN0aW9uX3NwY3RfY2hfc3dpdGNoKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggKnJhLCB1OCBuZXdfY2gsCi0JCQkJIHU4IGNoX29mZnNldCk7CiB1bnNpZ25lZCBpbnQgc2VuZF9kZWxiYShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGluaXRpYXRvciwgdTggKmFkZHIpOwogdW5zaWduZWQgaW50IHNlbmRfYmVhY29uKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiAKQEAgLTYyNywyNyArNjI1LDI0IEBACiB1OCBzZXRfY3NhX2hkbChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKnBidWYpOwogdTggdGRsc19oZGwoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpwYnVmKTsKIAotI2RlZmluZSBHRU5fRFJWX0NNRF9IQU5ETEVSKHNpemUsIGNtZCkJe3NpemUsICZjbWQgIyMgX2hkbH0sCi0jZGVmaW5lIEdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemUsIGNtZCkJe3NpemUsIGNtZH0sCi0KICNpZmRlZiBfUlRXX0NNRF9DXwogCiBzdGF0aWMgc3RydWN0IGNtZF9oZGwgd2xhbmNtZHNbXSA9IHsKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpLCBqb2luX2NtZF9oZGwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBkaXNjb25uZWN0X3Bhcm0pLCBkaXNjb25uZWN0X2hkbCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpLCBjcmVhdGVic3NfaGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0b3Btb2RlX3Bhcm0pLCBzZXRvcG1vZGVfaGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2l0ZXN1cnZleV9wYXJtKSwgc2l0ZXN1cnZleV9jbWRfaGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0YXV0aF9wYXJtKSwgc2V0YXV0aF9oZGwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzZXRrZXlfcGFybSksIHNldGtleV9oZGwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzZXRfc3Rha2V5X3Bhcm0pLCBzZXRfc3Rha2V5X2hkbCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHNldF9hc3NvY3N0YV9wYXJtKSwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IGFkZEJhUmVxX3Bhcm0pLCBhZGRfYmFfaGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0X2NoX3Bhcm0pLCBzZXRfY2hfaGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCksIHR4X2JlYWNvbl9oZGwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgbWxtZV9ldnRfaGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIHJ0d19kcnZleHRyYV9jbWRfaGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3QgU2V0Q2hhbm5lbFBsYW5fcGFyYW0pLCBzZXRfY2hwbGFuX2hkbCkKKwl7c2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSwgam9pbl9jbWRfaGRsfSwKKwl7c2l6ZW9mKHN0cnVjdCBkaXNjb25uZWN0X3Bhcm0pLCBkaXNjb25uZWN0X2hkbH0sCisJe3NpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCksIGNyZWF0ZWJzc19oZGx9LAorCXtzaXplb2Yoc3RydWN0IHNldG9wbW9kZV9wYXJtKSwgc2V0b3Btb2RlX2hkbH0sCisJe3NpemVvZihzdHJ1Y3Qgc2l0ZXN1cnZleV9wYXJtKSwgc2l0ZXN1cnZleV9jbWRfaGRsfSwKKwl7c2l6ZW9mKHN0cnVjdCBzZXRhdXRoX3Bhcm0pLCBzZXRhdXRoX2hkbH0sCisJe3NpemVvZihzdHJ1Y3Qgc2V0a2V5X3Bhcm0pLCBzZXRrZXlfaGRsfSwKKwl7c2l6ZW9mKHN0cnVjdCBzZXRfc3Rha2V5X3Bhcm0pLCBzZXRfc3Rha2V5X2hkbH0sCisJe3NpemVvZihzdHJ1Y3Qgc2V0X2Fzc29jc3RhX3Bhcm0pLCBOVUxMfSwKKwl7c2l6ZW9mKHN0cnVjdCBhZGRCYVJlcV9wYXJtKSwgYWRkX2JhX2hkbH0sCisJe3NpemVvZihzdHJ1Y3Qgc2V0X2NoX3Bhcm0pLCBzZXRfY2hfaGRsfSwKKwl7c2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSwgdHhfYmVhY29uX2hkbH0sCisJezAsIG1sbWVfZXZ0X2hkbH0sCisJezAsIHJ0d19kcnZleHRyYV9jbWRfaGRsfSwKKwl7c2l6ZW9mKHN0cnVjdCBTZXRDaGFubmVsUGxhbl9wYXJhbSksIHNldF9jaHBsYW5faGRsfQogfTsKIAogI2VuZGlmCkBAIC02NjksMzIgKzY2NCwzMiBAQAogdm9pZCBydHdfZndkYmdfZXZlbnRfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpwYnVmKTsKIAogZW51bSBydHdfYzJoX2V2ZW50IHsKLQlHRU5fRVZUX0NPREUoX1JlYWRfTUFDUkVHKSA9IDAsIC8qMCovCi0JR0VOX0VWVF9DT0RFKF9SZWFkX0JCUkVHKSwKLQlHRU5fRVZUX0NPREUoX1JlYWRfUkZSRUcpLAotCUdFTl9FVlRfQ09ERShfUmVhZF9FRVBST00pLAotCUdFTl9FVlRfQ09ERShfUmVhZF9FRlVTRSksCi0JR0VOX0VWVF9DT0RFKF9SZWFkX0NBTSksCS8qNSovCi0JR0VOX0VWVF9DT0RFKF9HZXRfQmFzaWNSYXRlKSwKLQlHRU5fRVZUX0NPREUoX0dldF9EYXRhUmF0ZSksCi0JR0VOX0VWVF9DT0RFKF9TdXJ2ZXkpLAkgLyo4Ki8KLQlHRU5fRVZUX0NPREUoX1N1cnZleURvbmUpLAkgLyo5Ki8KKwlfUmVhZF9NQUNSRUdfRVZUXyA9IDAsIC8qMCovCisJX1JlYWRfQkJSRUdfRVZUXywKKwlfUmVhZF9SRlJFR19FVlRfLAorCV9SZWFkX0VFUFJPTV9FVlRfLAorCV9SZWFkX0VGVVNFX0VWVF8sCisJX1JlYWRfQ0FNX0VWVF8sCS8qNSovCisJX0dldF9CYXNpY1JhdGVfRVZUXywKKwlfR2V0X0RhdGFSYXRlX0VWVF8sCisJX1N1cnZleV9FVlRfLAkgLyo4Ki8KKwlfU3VydmV5RG9uZV9FVlRfLAkgLyo5Ki8KIAotCUdFTl9FVlRfQ09ERShfSm9pbkJzcyksIC8qMTAqLwotCUdFTl9FVlRfQ09ERShfQWRkU1RBKSwKLQlHRU5fRVZUX0NPREUoX0RlbFNUQSksCi0JR0VOX0VWVF9DT0RFKF9BdGltRG9uZSksCi0JR0VOX0VWVF9DT0RFKF9UWF9SZXBvcnQpLAotCUdFTl9FVlRfQ09ERShfQ0NYX1JlcG9ydCksCQkvKjE1Ki8KLQlHRU5fRVZUX0NPREUoX0RUTV9SZXBvcnQpLAotCUdFTl9FVlRfQ09ERShfVFhfUmF0ZV9TdGF0aXN0aWNzKSwKLQlHRU5fRVZUX0NPREUoX0MySExCSyksCi0JR0VOX0VWVF9DT0RFKF9GV0RCRyksCi0JR0VOX0VWVF9DT0RFKF9DMkhGRUVEQkFDSyksICAgICAgICAgICAgIC8qMjAqLwotCUdFTl9FVlRfQ09ERShfQUREQkEpLAotCUdFTl9FVlRfQ09ERShfQzJIQkNOKSwKLQlHRU5fRVZUX0NPREUoX1JlcG9ydFB3clN0YXRlKSwJLyogZmlsZW46IG9ubHkgZm9yIFBDSUUsIFVTQiAqLwotCUdFTl9FVlRfQ09ERShfQ2xvc2VSRiksCQkvKiBmaWxlbjogb25seSBmb3IgUENJRSwKKwlfSm9pbkJzc19FVlRfLCAvKjEwKi8KKwlfQWRkU1RBX0VWVF8sCisJX0RlbFNUQV9FVlRfLAorCV9BdGltRG9uZV9FVlRfLAorCV9UWF9SZXBvcnRfRVZUXywKKwlfQ0NYX1JlcG9ydF9FVlRfLAkJLyoxNSovCisJX0RUTV9SZXBvcnRfRVZUXywKKwlfVFhfUmF0ZV9TdGF0aXN0aWNzX0VWVF8sCisJX0MySExCS19FVlRfLAorCV9GV0RCR19FVlRfLAorCV9DMkhGRUVEQkFDS19FVlRfLCAgICAgICAgICAgICAvKjIwKi8KKwlfQUREQkFfRVZUXywKKwlfQzJIQkNOX0VWVF8sCisJX1JlcG9ydFB3clN0YXRlX0VWVF8sCS8qIGZpbGVuOiBvbmx5IGZvciBQQ0lFLCBVU0IgKi8KKwlfQ2xvc2VSRl9FVlRfLAkJLyogZmlsZW46IG9ubHkgZm9yIFBDSUUsCiAJCQkJCSAqIHdvcmsgYXJvdW5kIEFTUE0gKi8KIAlNQVhfQzJIRVZUCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19wd3JjdHJsLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3B3cmN0cmwuaAppbmRleCA5NjgwZTJlLi4xOGE5ZTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3B3cmN0cmwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3B3cmN0cmwuaApAQCAtOTIsMjEgKzkyLDYgQEAKIAl1bnNpZ25lZCBzaG9ydCByc3ZkOwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIF9pbml0X3B3cmxvY2soc3RydWN0IHNlbWFwaG9yZSAgKnBsb2NrKQotewotCXNlbWFfaW5pdChwbG9jaywgMSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfZW50ZXJfcHdybG9jayhzdHJ1Y3Qgc2VtYXBob3JlICAqcGxvY2spCi17Ci0JX3J0d19kb3duX3NlbWEocGxvY2spOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX2V4aXRfcHdybG9jayhzdHJ1Y3Qgc2VtYXBob3JlICAqcGxvY2spCi17Ci0JdXAocGxvY2spOwotfQotCiAjZGVmaW5lIExQU19ERUxBWV9USU1FCTEqSFogLyogIDEgc2VjICovCiAKICNkZWZpbmUgRVhFX1BXUl9OT05FCTB4MDEKQEAgLTE1Nyw3ICsxNDIsNyBAQAogfTsKIAogc3RydWN0IHB3cmN0cmxfcHJpdiB7Ci0Jc3RydWN0IHNlbWFwaG9yZSBsb2NrOworCXN0cnVjdCBtdXRleCBtdXRleF9sb2NrOwogCXZvbGF0aWxlIHU4IHJwd207IC8qICByZXF1ZXN0ZWQgcG93ZXIgc3RhdGUgZm9yIGZ3ICovCiAJdm9sYXRpbGUgdTggY3B3bTsgLyogIGZ3IGN1cnJlbnQgcG93ZXIgc3RhdGUuIHVwZGF0ZWQgd2hlbgogCQkJICAgKiAxLiByZWFkIGZyb20gSENQV00gMi4gZHJpdmVyIGxvd2VycyBwb3dlciBsZXZlbCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19yZWN2LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3JlY3YuaAppbmRleCBiMDM3M2I2Li40OWQ5NzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3JlY3YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3JlY3YuaApAQCAtNjUsMTMgKzY1LDYgQEAKICovCiB9OwogCi1zdHJ1Y3Qgc21vb3RoX3Jzc2lfZGF0YSB7Ci0JdTMyCWVsZW1lbnRzWzEwMF07CS8qIGFycmF5IHRvIHN0b3JlIHZhbHVlcyAqLwotCXUzMglpbmRleDsJCQkvKiBpbmRleCB0byBjdXJyZW50IGFycmF5IHRvIHN0b3JlICovCi0JdTMyCXRvdGFsX251bTsJCS8qIG51bSBvZiB2YWxpZCBlbGVtZW50cyAqLwotCXUzMgl0b3RhbF92YWw7CQkvKiBzdW0gb2YgdmFsaWQgZWxlbWVudHMgKi8KLX07Ci0KIHN0cnVjdCBzaWduYWxfc3RhdCB7CiAJdTgJdXBkYXRlX3JlcTsJCS8qIHVzZWQgdG8gaW5kaWNhdGUgKi8KIAl1OAlhdmdfdmFsOwkJLyogYXZnIG9mIHZhbGlkIGVsZW1lbnRzICovCkBAIC0yNDYsNyArMjM5LDYgQEAKIHN0cnVjdCByZWN2X2ZyYW1lIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IHNrX2J1ZmYJICpwa3Q7Ci0Jc3RydWN0IHNrX2J1ZmYJICpwa3RfbmV3YWxsb2M7CiAJc3RydWN0IGFkYXB0ZXIgICphZGFwdGVyOwogCXN0cnVjdCByeF9wa3RfYXR0cmliIGF0dHJpYjsKIAl1aW50ICBsZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3NlY3VyaXR5LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3NlY3VyaXR5LmgKaW5kZXggY2ExMjQ3Yi4uMjY2M2U2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19zZWN1cml0eS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfc2VjdXJpdHkuaApAQCAtMTY0LDEyICsxNjQsNiBAQAogCXU4IGJXZXBEZWZhdWx0S2V5SWR4U2V0OwogfTsKIAotc3RydWN0IHNoYTI1Nl9zdGF0ZSB7Ci0JdTY0IGxlbmd0aDsKLQl1MzIgc3RhdGVbOF0sIGN1cmxlbjsKLQl1OCBidWZbNjRdOwotfTsKLQogI2RlZmluZSBHRVRfRU5DUllfQUxHTyhwc2VjdXJpdHlwcml2LCBwc3RhLCBlbmNyeV9hbGdvLCBibWNzdCkJCVwKIGRvIHsJCQkJCQkJCQlcCiAJc3dpdGNoIChwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtKSB7CQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19zcmVzZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfc3Jlc2V0LmgKaW5kZXggY2UwMjdkZi4uNGM0Y2NkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19zcmVzZXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3NyZXNldC5oCkBAIC0zMyw3ICszMyw2IEBACiAjZGVmaW5lCVdJRklfUlhfSEFORwkJCUJJVCg1KQogI2RlZmluZQkJV0lGSV9JRl9OT1RfRVhJU1QJQklUKDYpCiAKLXZvaWQgc3Jlc2V0X2luaXRfdmFsdWUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIHU4IHNyZXNldF9nZXRfd2lmaV9zdGF0dXMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIHZvaWQgc3Jlc2V0X3NldF93aWZpX2Vycm9yX3N0YXR1cyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBzdGF0dXMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3htaXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfeG1pdC5oCmluZGV4IGEwODUzYmEuLmRkNmI3YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfeG1pdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfeG1pdC5oCkBAIC0xMTMsNyArMTEzLDYgQEAKIAl1OAlkaGNwX3BrdDsKIAl1MTYJZXRoZXJfdHlwZTsKIAl1MTYJc2VxbnVtOwotCXUxNglwa3RfaGRybGVuOwkvKiB0aGUgb3JpZ2luYWwgODAyLjMgcGt0IGhlYWRlciBsZW4gKi8KIAl1MTYJaGRybGVuOwkJLyogdGhlIFdMQU4gSGVhZGVyIExlbiAqLwogCXUzMglwa3RsZW47CQkvKiB0aGUgb3JpZ2luYWwgODAyLjMgcGt0IHJhd19kYXRhIGxlbiAobm90IGluY2x1ZGUKIAkJCQkgKiBldGhlcl9oZHIgZGF0YSkgKi8KQEAgLTI1NiwxNSArMjU1LDggQEAKIAlpbnQJYWNfdGFnOwogfTsKIAotc3RydWN0IGFnZ19wa3RfaW5mbyB7Ci0JdTE2IG9mZnNldDsKLQl1MTYgcGt0X2xlbjsKLX07Ci0KIHN0cnVjdAl4bWl0X3ByaXYgewogCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHhtaXRfc2VtYTsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHRlcm1pbmF0ZV94bWl0dGhyZWFkX3NlbWE7CiAJc3RydWN0IF9fcXVldWUgYmVfcGVuZGluZzsKIAlzdHJ1Y3QgX19xdWV1ZSBia19wZW5kaW5nOwogCXN0cnVjdCBfX3F1ZXVlIHZpX3BlbmRpbmc7CkBAIC0yODksNyArMjgxLDYgQEAKIAl1OAl3bW1fcGFyYV9zZXFbNF07Lyogc2VxdWVuY2UgZm9yIHdtbSBhYyBwYXJhbWV0ZXIgc3RyZW5ndGgKIAkJCQkgKiBmcm9tIGxhcmdlIHRvIHNtYWxsLiBpdCdzIHZhbHVlIGlzIDAtPnZvLAogCQkJCSAqIDEtPnZpLCAyLT5iZSwgMy0+YmsuICovCi0Jc3RydWN0IHNlbWFwaG9yZSB0eF9yZXRldnQ7LyogYWxsIHR4IHJldHVybiBldmVudDsgKi8KIAl1OAkJdHhpcnBfY250Oy8qICAqLwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB4bWl0X3Rhc2tsZXQ7CiAJLyogcGVyIEFDIHBlbmRpbmcgaXJwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvdXNiX2hhbC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3VzYl9oYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiZjA3YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvdXNiX2hhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fVVNCX0hBTF9IX18KLSNkZWZpbmUgX19VU0JfSEFMX0hfXwotCi12b2lkIHJ0bDgxODhldV9zZXRfaGFsX29wcyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotI2RlZmluZSBoYWxfc2V0X2hhbF9vcHMJcnRsODE4OGV1X3NldF9oYWxfb3BzCi0KLSNlbmRpZiAvKiBfX1VTQl9IQUxfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvdXNiX29wc19saW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3VzYl9vcHNfbGludXguaAppbmRleCAyMjA3MzMzLi43OGQ5YjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvdXNiX29wc19saW51eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS91c2Jfb3BzX2xpbnV4LmgKQEAgLTQ3LDIxICs0Nyw2IEBACiAjZGVmaW5lIHVzYl9yZWFkX2ludGVycnVwdF9jb21wbGV0ZShwdXJiLCByZWdzKQkJXAogCXVzYl9yZWFkX2ludGVycnVwdF9jb21wbGV0ZShwdXJiKQogCi1zdGF0aWMgaW5saW5lIHU4IHJ0d191c2JfYnVsa19zaXplX2JvdW5kYXJ5KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCQkJICAgIGludCBidWZfbGVuKQotewotCXU4IHJzdCA9IHRydWU7Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9ianByaXYgPSBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKTsKLQotCWlmIChwZHZvYmpwcml2LT5pc2hpZ2hzcGVlZCkKLQkJcnN0ID0gKDAgPT0gKGJ1Zl9sZW4pICUgVVNCX0hJR0hfU1BFRURfQlVMS19TSVpFKSA/Ci0JCSAgICAgIHRydWUgOiBmYWxzZTsKLQllbHNlCi0JCXJzdCA9ICgwID09IChidWZfbGVuKSAlIFVTQl9GVUxMX1NQRUVEX0JVTEtfU0laRSkgPwotCQkgICAgICB0cnVlIDogZmFsc2U7Ci0JcmV0dXJuIHJzdDsKLX0KLQogdW5zaWduZWQgaW50IGZmYWRkcjJwaXBlaGRsKHN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmosIHUzMiBhZGRyKTsKIAogdTggdXNiX3JlYWQ4KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkcik7CkBAIC03NSw3ICs2MCw3IEBACiBpbnQgdXNiX3dyaXRlMTYoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MTYgdmFsKTsKIGludCB1c2Jfd3JpdGUzMihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIsIHUzMiB2YWwpOwogCi11MzIgdXNiX3dyaXRlX3BvcnQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgY250LCB1OCAqcG1lbSk7Cit1MzIgdXNiX3dyaXRlX3BvcnQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgY250LCBzdHJ1Y3QgeG1pdF9idWYgKnBtZW0pOwogdm9pZCB1c2Jfd3JpdGVfcG9ydF9jYW5jZWwoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS93aWZpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2lmaS5oCmluZGV4IGU3YzUxMjEuLjllMDhlNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS93aWZpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3dpZmkuaApAQCAtNTA4LDIyICs1MDgsNiBAQAogI2RlZmluZSBJRUVFODAyMTFfQkFSX0NUUkxfQUNLX1BPTElDWV9OT1JNQUwgICAgIDB4MDAwMAogI2RlZmluZSBJRUVFODAyMTFfQkFSX0NUUkxfQ0JNVElEX0NPTVBSRVNTRURfQkEgIDB4MDAwNAogCi0gLyoqCi0gKiBzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgLSBIVCBjYXBhYmlsaXRpZXMKLSAqCi0gKiBUaGlzIHN0cnVjdHVyZSByZWZlcnMgdG8gIkhUIGNhcGFiaWxpdGllcyBlbGVtZW50IiBhcwotICogZGVzY3JpYmVkIGluIDgwMi4xMW4gZHJhZnQgc2VjdGlvbiA3LjMuMi41MgotICovCi0KLXN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCB7Ci0JdW5zaWduZWQgc2hvcnQJY2FwX2luZm87Ci0JdW5zaWduZWQgY2hhcglhbXBkdV9wYXJhbXNfaW5mbzsKLQl1bnNpZ25lZCBjaGFyCXN1cHBfbWNzX3NldFsxNl07Ci0JdW5zaWduZWQgc2hvcnQJZXh0ZW5kZWRfaHRfY2FwX2luZm87Ci0JdW5zaWduZWQgaW50CXR4X0JGX2NhcF9pbmZvOwotCXVuc2lnbmVkIGNoYXIgICBhbnRlbm5hX3NlbGVjdGlvbl9pbmZvOwotfSBfX3BhY2tlZDsKLQogLyoqCiAgKiBzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgLSBIVCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCiAgKgpAQCAtNTM4LDIwICs1MjIsNiBAQAogCXVuc2lnbmVkIGNoYXIJYmFzaWNfc2V0WzE2XTsKIH0gX19wYWNrZWQ7CiAKLXN0cnVjdCBIVF9jYXBzX2VsZW1lbnQgewotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCV9fbGUxNglIVF9jYXBzX2luZm87Ci0JCQl1bnNpZ25lZCBjaGFyCUFNUERVX3BhcmE7Ci0JCQl1bnNpZ25lZCBjaGFyCU1DU19yYXRlWzE2XTsKLQkJCXVuc2lnbmVkIHNob3J0CUhUX2V4dF9jYXBzOwotCQkJdW5zaWduZWQgaW50CUJlYW1mb3JtaW5nX2NhcHM7Ci0JCQl1bnNpZ25lZCBjaGFyCUFTRUxfY2FwczsKLQkJfSBIVF9jYXBfZWxlbWVudDsKLQkJdW5zaWduZWQgY2hhciBIVF9jYXBbMjZdOwotCX0gdTsKLX0gX19wYWNrZWQ7Ci0KIHN0cnVjdCBIVF9pbmZvX2VsZW1lbnQgewogCXVuc2lnbmVkIGNoYXIJcHJpbWFyeV9jaGFubmVsOwogCXVuc2lnbmVkIGNoYXIJaW5mb3NbNV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2xhbl9ic3NkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS93bGFuX2Jzc2RlZi5oCmluZGV4IDU2MDk2NmMuLmUxOTMxZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS93bGFuX2Jzc2RlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS93bGFuX2Jzc2RlZi5oCkBAIC0xMjMsNDAgKzEyMywxMCBAQAogI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVNGSV9TVEFUVVNDT0RFICAgICAgICAyCiAjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFU0ZJX0FTU09DSUFUSU9OSUQgICAgIDQKIAotc3RydWN0IG5kaXNfODAyXzExX2FpX3JlcWZpIHsKLSAgICB1MTYgQ2FwYWJpbGl0aWVzOwotICAgIHUxNiBMaXN0ZW5JbnRlcnZhbDsKLSAgICB1bnNpZ25lZCBjaGFyIEN1cnJlbnRBUEFkZHJlc3NbRVRIX0FMRU5dOwotfTsKLQotc3RydWN0IG5kaXNfODAyXzExX2FpX3Jlc2ZpIHsKLSAgICB1MTYgQ2FwYWJpbGl0aWVzOwotICAgIHUxNiBTdGF0dXNDb2RlOwotICAgIHUxNiBBc3NvY2lhdGlvbklkOwotfTsKLQotc3RydWN0IG5kaXNfODAyXzExX2Fzc29jX2luZm8gewotCXUzMiAgTGVuZ3RoOwotCXUxNiBBdmFpbGFibGVSZXF1ZXN0Rml4ZWRJRXM7Ci0Jc3RydWN0IG5kaXNfODAyXzExX2FpX3JlcWZpICAgIFJlcXVlc3RGaXhlZElFczsKLQl1MzIgIFJlcXVlc3RJRUxlbmd0aDsKLQl1MzIgIE9mZnNldFJlcXVlc3RJRXM7Ci0JdTE2IEF2YWlsYWJsZVJlc3BvbnNlRml4ZWRJRXM7Ci0Jc3RydWN0IG5kaXNfODAyXzExX2FpX3Jlc2ZpICAgIFJlc3BvbnNlRml4ZWRJRXM7Ci0JdTMyICBSZXNwb25zZUlFTGVuZ3RoOwotCXUzMiAgT2Zmc2V0UmVzcG9uc2VJRXM7Ci19OwotCiBlbnVtIG5kaXNfODAyXzExX3JlbG9hZF9kZWYgewogCU5kaXM4MDJfMTFSZWxvYWRXRVBLZXlzCiB9OwogCi1zdHJ1Y3QgbmRpc184MDJfMTFfcmVtb3ZlX2tleSB7Ci0JdTMyICAgICAgICAgICAgICAgICAgIExlbmd0aDsgICAgICAgIC8qICBMZW5ndGggKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgS2V5SW5kZXg7Ci0JdW5zaWduZWQgY2hhciBCU1NJRFtFVEhfQUxFTl07Ci19OwotCiBzdHJ1Y3QgbmRpc184MDJfMTFfd2VwIHsKIAl1MzIgICAgIExlbmd0aDsgICAgICAgIC8qICBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KIAl1MzIgICAgIEtleUluZGV4OyAgICAgIC8qICAwIGlzIHRoZSBwZXItY2xpZW50IGtleSwKQEAgLTE2NSwxMiArMTM1LDYgQEAKIAl1OCAgICAgS2V5TWF0ZXJpYWxbMTZdOy8qICB2YXJpYWJsZSBsZW4gZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkICovCiB9OwogCi1zdHJ1Y3QgbmRpc184MDJfMTFfYXV0aF9yZXEgewotCXUzMiBMZW5ndGg7ICAgICAgICAgICAgLyogIExlbmd0aCBvZiBzdHJ1Y3R1cmUgKi8KLQl1bnNpZ25lZCBjaGFyIEJzc2lkW0VUSF9BTEVOXTsKLQl1MzIgRmxhZ3M7Ci19OwotCiBlbnVtIG5kaXNfODAyXzExX3N0YXR1c190eXBlIHsKIAlOZGlzODAyXzExU3RhdHVzVHlwZV9BdXRoZW50aWNhdGlvbiwKIAlOZGlzODAyXzExU3RhdHVzVHlwZV9NZWRpYVN0cmVhbU1vZGUsCkBAIC0xNzksMTAgKzE0Myw2IEBACiAJCQkJICAgICogYW4gdXBwZXIgYm91bmQgKi8KIH07CiAKLXN0cnVjdCBuZGlzXzgwMl8xMV9zdGF0dXNfaW5kIHsKLQllbnVtIG5kaXNfODAyXzExX3N0YXR1c190eXBlIFN0YXR1c1R5cGU7Ci19OwotCiAvKiAgbWFzayBmb3IgYXV0aGVudGljYXRpb24vaW50ZWdyaXR5IGZpZWxkcyAqLwogI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfQVVUSF9GSUVMRFMgICAgICAgIAkweDBmCiAjZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9SRUFVVEgJCQkweDAxCkBAIC0xOTMsMjEgKzE1Myw2IEBACiAvKiAgTUlDIGNoZWNrIHRpbWUsIDYwIHNlY29uZHMuICovCiAjZGVmaW5lIE1JQ19DSEVDS19USU1FCTYwMDAwMDAwCiAKLXN0cnVjdCBuZGlzXzgwMl8xMV9hdXRoX2V2dCB7Ci0Jc3RydWN0IG5kaXNfODAyXzExX3N0YXR1c19pbmQgICAgICAgU3RhdHVzOwotCXN0cnVjdCBuZGlzXzgwMl8xMV9hdXRoX3JlcSAgUmVxdWVzdFsxXTsKLX07Ci0KLXN0cnVjdCBuZGlzXzgwMl8xMV90ZXN0IHsKLQl1MzIgTGVuZ3RoOwotCXUzMiBUeXBlOwotCXVuaW9uIHsKLQkJc3RydWN0IG5kaXNfODAyXzExX2F1dGhfZXZ0IEF1dGhlbnRpY2F0aW9uRXZlbnQ7Ci0JCU5ESVNfODAyXzExX1JTU0kgUnNzaVRyaWdnZXI7Ci0JfSB0dDsKLX07Ci0KLQogI2lmbmRlZiBOZGlzODAyXzExQVBNb2RlCiAjZGVmaW5lIE5kaXM4MDJfMTFBUE1vZGUgKE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZU1heCsxKQogI2VuZGlmCkBAIC0yOTcsMzIgKzI0Miw0IEBACiAjZGVmaW5lIE5VTV9QUkVfQVVUSF9LRVkgMTYKICNkZWZpbmUgTlVNX1BNS0lEX0NBQ0hFIE5VTV9QUkVfQVVUSF9LRVkKIAotLyoKLSoJV1BBMgotKi8KLQotc3RydWN0IHBta2lkX2NhbmRpZGF0ZSB7Ci0JdW5zaWduZWQgY2hhciBCU1NJRFtFVEhfQUxFTl07Ci0JdTMyIEZsYWdzOwotfTsKLQotc3RydWN0IG5kaXNfODAyXzExX3Bta2lkX2xpc3QgewotCXUzMiBWZXJzaW9uOyAgICAgICAvKiAgVmVyc2lvbiBvZiB0aGUgc3RydWN0dXJlICovCi0JdTMyIE51bUNhbmRpZGF0ZXM7IC8qICBOby4gb2YgcG1raWQgY2FuZGlkYXRlcyAqLwotCXN0cnVjdCBwbWtpZF9jYW5kaWRhdGUgQ2FuZGlkYXRlTGlzdFsxXTsKLX07Ci0KLXN0cnVjdCBuZGlzXzgwMl8xMV9hdXRoX2VuY3J5cHQgewotCWVudW0gbmRpc184MDJfMTFfYXV0aF9tb2RlIEF1dGhNb2RlU3VwcG9ydGVkOwotCWVudW0gbmRpc184MDJfMTFfd2VwX3N0YXR1cyBFbmNyeXB0U3RhdHVzU3VwcG9ydGVkOwotfTsKLQotc3RydWN0IG5kaXNfODAyXzExX2NhcCB7Ci0JdTMyICBMZW5ndGg7Ci0JdTMyICBWZXJzaW9uOwotCXUzMiAgTm9PZlBNS0lEczsKLQl1MzIgIE5vT2ZBdXRoRW5jcnlwdFBhaXJzU3VwcG9ydGVkOwotCXN0cnVjdCBuZGlzXzgwMl8xMV9hdXRoX2VuY3J5cHQgQXV0aGVudGljYXRpb25FbmNyeXB0aW9uU3VwcG9ydGVkWzFdOwotfTsKLQogI2VuZGlmIC8qIGlmbmRlZiBXTEFOX0JTU0RFRl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvaW9jdGxfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL2lvY3RsX2xpbnV4LmMKaW5kZXggNTY3MmYwMS4uNGRlOWRiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvaW9jdGxfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9pb2N0bF9saW51eC5jCkBAIC0xMzIsMTIgKzEzMiwxNSBAQAogCXAgPSBydHdfZ2V0X2llKCZwbmV0d29yay0+bmV0d29yay5JRXNbMTJdLCBfSFRfQ0FQQUJJTElUWV9JRV8sICZodF9pZWxlbiwgcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGgtMTIpOwogCiAJaWYgKHAgJiYgaHRfaWVsZW4gPiAwKSB7Ci0JCXN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcGllOworCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcGllOwogCQlodF9jYXAgPSB0cnVlOwotCQlwaHRfY2FwaWUgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwICopKHArMik7Ci0JCW1lbWNweSgmbWNzX3JhdGUsIHBodF9jYXBpZS0+c3VwcF9tY3Nfc2V0LCAyKTsKLQkJYndfNDBNSHogPSAocGh0X2NhcGllLT5jYXBfaW5mbyZJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSCkgPyAxIDogMDsKLQkJc2hvcnRfR0kgPSAocGh0X2NhcGllLT5jYXBfaW5mbyYoSUVFRTgwMjExX0hUX0NBUF9TR0lfMjB8SUVFRTgwMjExX0hUX0NBUF9TR0lfNDApKSA/IDEgOiAwOworCQlwaHRfY2FwaWUgPSAoc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKikocCArIDIpOworCQltZW1jcHkoJm1jc19yYXRlLCBwaHRfY2FwaWUtPm1jcy5yeF9tYXNrLCAyKTsKKwkJYndfNDBNSHogPSAhIShsZTE2X3RvX2NwdShwaHRfY2FwaWUtPmNhcF9pbmZvKSAmCisJCQkgICAgICBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSCk7CisJCXNob3J0X0dJID0gISEobGUxNl90b19jcHUocGh0X2NhcGllLT5jYXBfaW5mbykgJgorCQkJICAgICAgKElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwIHwKKwkJCSAgICAgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkpOwogCX0KIAogCS8qIEFkZCB0aGUgcHJvdG9jb2wgbmFtZSAqLwpAQCAtNDAwLDcgKzQwMyw3IEBACiAJCQl3ZXBfa2V5X2xlbiA9IHdlcF9rZXlfbGVuIDw9IDUgPyA1IDogMTM7CiAJCQl3ZXBfdG90YWxfbGVuID0gd2VwX2tleV9sZW4gKyBvZmZzZXRvZihzdHJ1Y3QgbmRpc184MDJfMTFfd2VwLCBLZXlNYXRlcmlhbCk7CiAJCQlwd2VwID0gKHN0cnVjdCBuZGlzXzgwMl8xMV93ZXAgKilydHdfbWFsbG9jKHdlcF90b3RhbF9sZW4pOwotCQkJaWYgKHB3ZXAgPT0gTlVMTCkgeworCQkJaWYgKCFwd2VwKSB7CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX29zX2MsIF9kcnZfZXJyXywgKCIgd3BhX3NldF9lbmNyeXB0aW9uOiBwd2VwIGFsbG9jYXRlIGZhaWwgISEhXG4iKSk7CiAJCQkJZ290byBleGl0OwogCQkJfQpAQCAtNDQxLDcgKzQ0NCw3IEBACiAKIAkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUgfCBXSUZJX01QX1NUQVRFKSkgeyAvKiBzdGEgbW9kZSAqLwogCQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbyhwc3RhcHJpdiwgZ2V0X2Jzc2lkKHBtbG1lcHJpdikpOwotCQkJaWYgKHBzdGEgPT0gTlVMTCkgeworCQkJaWYgKCFwc3RhKSB7CiAJCQkJOwogCQkJfSBlbHNlIHsKIAkJCQlpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIm5vbmUiKSAhPSAwKQpAQCAtNDc2LDcgKzQ3OSw3IEBACiAJCQkJfQogCQkJfQogCQkJcGJjbWNfc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8ocGFkYXB0ZXIpOwotCQkJaWYgKHBiY21jX3N0YSA9PSBOVUxMKSB7CisJCQlpZiAoIXBiY21jX3N0YSkgewogCQkJCTsKIAkJCX0gZWxzZSB7CiAJCQkJLyogSmVmZjogZG9uJ3QgZGlzYWJsZSBpZWVlODAyMXhfYmxvY2tlZCB3aGlsZSBjbGVhcmluZyBrZXkgKi8KQEAgLTUwMiw5ICs1MDUsOSBAQAogCWludCBncm91cF9jaXBoZXIgPSAwLCBwYWlyd2lzZV9jaXBoZXIgPSAwOwogCWludCByZXQgPSAwOwogCi0JaWYgKChpZWxlbiA+IE1BWF9XUEFfSUVfTEVOKSB8fCAocGllID09IE5VTEwpKSB7CisJaWYgKChpZWxlbiA+IE1BWF9XUEFfSUVfTEVOKSB8fCAoIXBpZSkpIHsKIAkJX2Nscl9md3N0YXRlXygmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX1VOREVSX1dQUyk7Ci0JCWlmIChwaWUgPT0gTlVMTCkKKwkJaWYgKCFwaWUpCiAJCQlyZXR1cm4gcmV0OwogCQllbHNlCiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTUxMiw3ICs1MTUsNyBAQAogCiAJaWYgKGllbGVuKSB7CiAJCWJ1ZiA9IGttZW1kdXAocGllLCBpZWxlbiwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChidWYgPT0gTlVMTCkgeworCQlpZiAoIWJ1ZikgewogCQkJcmV0ID0gIC1FTk9NRU07CiAJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTEwNDksNyArMTA1Miw3IEBACiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGl3X21sbWUgKm1sbWUgPSAoc3RydWN0IGl3X21sbWUgKilleHRyYTsKIAotCWlmIChtbG1lID09IE5VTEwpCisJaWYgKCFtbG1lKQogCQlyZXR1cm4gLTE7CiAKIAlEQkdfODhFKCIlc1xuIiwgX19mdW5jX18pOwpAQCAtMTg5Niw3ICsxODk5LDcgQEAKIAogCXBhcmFtX2xlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZV9wYXJhbSkgKyBwZXh0LT5rZXlfbGVuOwogCXBhcmFtID0gKHN0cnVjdCBpZWVlX3BhcmFtICopcnR3X21hbGxvYyhwYXJhbV9sZW4pOwotCWlmIChwYXJhbSA9PSBOVUxMKQorCWlmICghcGFyYW0pCiAJCXJldHVybiAtMTsKIAogCW1lbXNldChwYXJhbSwgMCwgcGFyYW1fbGVuKTsKQEAgLTIwNjEsNyArMjA2NCw3IEBACiAJfQogCiAJcGFyYW0gPSAoc3RydWN0IGllZWVfcGFyYW0gKilydHdfbWFsbG9jKHAtPmxlbmd0aCk7Ci0JaWYgKHBhcmFtID09IE5VTEwpIHsKKwlpZiAoIXBhcmFtKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KQEAgLTIyNTQsMTMgKzIyNTcsMTMgQEAKIAkJfQogCX0KIAotCWlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAibm9uZSIpID09IDAgJiYgKHBzdGEgPT0gTlVMTCkpIHsKKwlpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIm5vbmUiKSA9PSAwICYmICghcHN0YSkpIHsKIAkJLyogdG9kbzpjbGVhciBkZWZhdWx0IGVuY3J5cHRpb24ga2V5cyAqLwogCiAJCURCR184OEUoImNsZWFyIGRlZmF1bHQgZW5jcnlwdGlvbiBrZXlzLCBrZXlpZCA9JWRcbiIsIHBhcmFtLT51LmNyeXB0LmlkeCk7CiAJCWdvdG8gZXhpdDsKIAl9Ci0JaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwICYmIChwc3RhID09IE5VTEwpKSB7CisJaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwICYmICghcHN0YSkpIHsKIAkJREJHXzg4RSgicjg3MXhfc2V0X2VuY3J5cHRpb24sIGNyeXB0LmFsZyA9IFdFUFxuIik7CiAJCXdlcF9rZXlfaWR4ID0gcGFyYW0tPnUuY3J5cHQuaWR4OwogCQl3ZXBfa2V5X2xlbiA9IHBhcmFtLT51LmNyeXB0LmtleV9sZW47CkBAIC0yMjc0LDcgKzIyNzcsNyBAQAogCQkJd2VwX2tleV9sZW4gPSB3ZXBfa2V5X2xlbiA8PSA1ID8gNSA6IDEzOwogCQkJd2VwX3RvdGFsX2xlbiA9IHdlcF9rZXlfbGVuICsgb2Zmc2V0b2Yoc3RydWN0IG5kaXNfODAyXzExX3dlcCwgS2V5TWF0ZXJpYWwpOwogCQkJcHdlcCA9IChzdHJ1Y3QgbmRpc184MDJfMTFfd2VwICopcnR3X21hbGxvYyh3ZXBfdG90YWxfbGVuKTsKLQkJCWlmIChwd2VwID09IE5VTEwpIHsKKwkJCWlmICghcHdlcCkgewogCQkJCURCR184OEUoIiByODcxeF9zZXRfZW5jcnlwdGlvbjogcHdlcCBhbGxvY2F0ZSBmYWlsICEhIVxuIik7CiAJCQkJZ290byBleGl0OwogCQkJfQpAQCAtMjUyOCw3ICsyNTMxLDggQEAKIAkJaWYgKFdMQU5fU1RBX0hUJmZsYWdzKSB7CiAJCQlwc3RhLT5odHByaXYuaHRfb3B0aW9uID0gdHJ1ZTsKIAkJCXBzdGEtPnFvc19vcHRpb24gPSAxOwotCQkJbWVtY3B5KCh2b2lkICopJnBzdGEtPmh0cHJpdi5odF9jYXAsICh2b2lkICopJnBhcmFtLT51LmFkZF9zdGEuaHRfY2FwLCBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwKSk7CisJCQltZW1jcHkoJnBzdGEtPmh0cHJpdi5odF9jYXAsICZwYXJhbS0+dS5hZGRfc3RhLmh0X2NhcCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKTsKIAkJfSBlbHNlIHsKIAkJCXBzdGEtPmh0cHJpdi5odF9vcHRpb24gPSBmYWxzZTsKIAkJfQpAQCAtMjYyNCw3ICsyNjI4LDggQEAKIAkJCQkgICAgICAocHN0YS0+aHRfMjBtaHpfc2V0IDw8IDUpKTsKIAkJcHN0YV9kYXRhLT50eF9zdXBwX3JhdGVzX2xlbiA9ICBwc3RhLT5ic3NyYXRlbGVuOwogCQltZW1jcHkocHN0YV9kYXRhLT50eF9zdXBwX3JhdGVzLCBwc3RhLT5ic3NyYXRlc2V0LCBwc3RhLT5ic3NyYXRlbGVuKTsKLQkJbWVtY3B5KCZwc3RhX2RhdGEtPmh0X2NhcCwgJnBzdGEtPmh0cHJpdi5odF9jYXAsIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXApKTsKKwkJbWVtY3B5KCZwc3RhX2RhdGEtPmh0X2NhcCwKKwkJICAgICAgICZwc3RhLT5odHByaXYuaHRfY2FwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKTsKIAkJcHN0YV9kYXRhLT5yeF9wa3RzID0gcHN0YS0+c3RhX3N0YXRzLnJ4X2RhdGFfcGt0czsKIAkJcHN0YV9kYXRhLT5yeF9ieXRlcyA9IHBzdGEtPnN0YV9zdGF0cy5yeF9ieXRlczsKIAkJcHN0YV9kYXRhLT5yeF9kcm9wcyA9IHBzdGEtPnN0YV9zdGF0cy5yeF9kcm9wczsKQEAgLTI2OTksNyArMjcwNCw3IEBACiAJaWYgKGllX2xlbiA+IDApIHsKIAkJcG1sbWVwcml2LT53cHNfYmVhY29uX2llID0gcnR3X21hbGxvYyhpZV9sZW4pOwogCQlwbWxtZXByaXYtPndwc19iZWFjb25faWVfbGVuID0gaWVfbGVuOwotCQlpZiAocG1sbWVwcml2LT53cHNfYmVhY29uX2llID09IE5VTEwpIHsKKwkJaWYgKCFwbWxtZXByaXYtPndwc19iZWFjb25faWUpIHsKIAkJCURCR184OEUoIiVzKCktJWQ6IHJ0d19tYWxsb2MoKSBFUlJPUiFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMjczNCw3ICsyNzM5LDcgQEAKIAlpZiAoaWVfbGVuID4gMCkgewogCQlwbWxtZXByaXYtPndwc19wcm9iZV9yZXNwX2llID0gcnR3X21hbGxvYyhpZV9sZW4pOwogCQlwbWxtZXByaXYtPndwc19wcm9iZV9yZXNwX2llX2xlbiA9IGllX2xlbjsKLQkJaWYgKHBtbG1lcHJpdi0+d3BzX3Byb2JlX3Jlc3BfaWUgPT0gTlVMTCkgeworCQlpZiAoIXBtbG1lcHJpdi0+d3BzX3Byb2JlX3Jlc3BfaWUpIHsKIAkJCURCR184OEUoIiVzKCktJWQ6IHJ0d19tYWxsb2MoKSBFUlJPUiFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMjc2NCw3ICsyNzY5LDcgQEAKIAlpZiAoaWVfbGVuID4gMCkgewogCQlwbWxtZXByaXYtPndwc19hc3NvY19yZXNwX2llID0gcnR3X21hbGxvYyhpZV9sZW4pOwogCQlwbWxtZXByaXYtPndwc19hc3NvY19yZXNwX2llX2xlbiA9IGllX2xlbjsKLQkJaWYgKHBtbG1lcHJpdi0+d3BzX2Fzc29jX3Jlc3BfaWUgPT0gTlVMTCkgeworCQlpZiAoIXBtbG1lcHJpdi0+d3BzX2Fzc29jX3Jlc3BfaWUpIHsKIAkJCURCR184OEUoIiVzKCktJWQ6IHJ0d19tYWxsb2MoKSBFUlJPUiFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMjg2Niw3ICsyODcxLDcgQEAKIAl9CiAKIAlwYXJhbSA9IChzdHJ1Y3QgaWVlZV9wYXJhbSAqKXJ0d19tYWxsb2MocC0+bGVuZ3RoKTsKLQlpZiAocGFyYW0gPT0gTlVMTCkgeworCWlmICghcGFyYW0pIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMjk3Niw3ICsyOTgxLDcgQEAKIAkJCXBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSA9IE5VTEw7CiAKIAkJCXBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSA9IHJ0d19tYWxsb2MoY3Bfc3opOwotCQkJaWYgKHBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSA9PSBOVUxMKSB7CisJCQlpZiAoIXBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSkgewogCQkJCXByX2luZm8oIiVzKCktJWQ6IHJ0d19tYWxsb2MoKSBFUlJPUiFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQkJcmV0ID0gIC1FSU5WQUw7CiAJCQkJZ290byBGUkVFX0VYVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zX2ludGZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc19pbnRmcy5jCmluZGV4IGFlMmNhZmYuLjQwNjkxZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zX2ludGZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvb3NfaW50ZnMuYwpAQCAtMjMsOCArMjMsNiBAQAogI2luY2x1ZGUgPHJ0d19pb2N0bC5oPgogI2luY2x1ZGUgPHJ0bDgxODhlX2hhbC5oPgogCi0jaW5jbHVkZSA8dXNiX2hhbC5oPgotCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlJlYWx0ZWsgV2lyZWxlc3MgTGFuIERyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiUmVhbHRlayBTZW1pY29uZHVjdG9yIENvcnAuIik7CkBAIC0zMywxMSArMzEsNyBAQAogI2RlZmluZSBSVFdfTk9UQ0hfRklMVEVSIDAgLyogMDpEaXNhYmxlLCAxOkVuYWJsZSwgKi8KIAogLyogbW9kdWxlIHBhcmFtIGRlZmF1bHRzICovCi1zdGF0aWMgaW50IHJ0d19jaGlwX3ZlcnNpb247Ci1zdGF0aWMgaW50IHJ0d19yZmludGZzID0gSFdQSTsKLXN0YXRpYyBpbnQgcnR3X2xia21vZGU7LyogUlRMODcxMl9BSVJfVFJYOyAqLwogLyogTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOyBpbmZyYSwgYWQtaG9jLCBhdXRvICovCi1zdGF0aWMgaW50IHJ0d19uZXR3b3JrX21vZGUgPSBOZGlzODAyXzExSUJTUzsKIHN0YXRpYyBpbnQgcnR3X2NoYW5uZWwgPSAxOy8qIGFkLWhvYyBzdXBwb3J0IHJlcXVpcmVtZW50ICovCiBzdGF0aWMgaW50IHJ0d193aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfMTFCR18yNE47CiBzdGF0aWMgaW50IHJ0d192cnRsX2NhcnJpZXJfc2Vuc2UgPSBBVVRPX1ZDUzsKQEAgLTQ1LDkgKzM5LDYgQEAKIHN0YXRpYyBpbnQgcnR3X3J0c190aHJlc2ggPSAyMzQ3Oy8qICAqLwogc3RhdGljIGludCBydHdfZnJhZ190aHJlc2ggPSAyMzQ2Oy8qICAqLwogc3RhdGljIGludCBydHdfcHJlYW1ibGUgPSBQUkVBTUJMRV9MT05HOy8qIGxvbmcsIHNob3J0LCBhdXRvICovCi1zdGF0aWMgaW50IHJ0d19zY2FuX21vZGUgPSAxOy8qIGFjdGl2ZSwgcGFzc2l2ZSAqLwotc3RhdGljIGludCBydHdfYWRob2NfdHhfcHdyID0gMTsKLXN0YXRpYyBpbnQgcnR3X3NvZnRfYXA7CiBzdGF0aWMgaW50IHJ0d19wb3dlcl9tZ250ID0gMTsKIHN0YXRpYyBpbnQgcnR3X2lwc19tb2RlID0gSVBTX05PUk1BTDsKIApAQCAtNTcsMTEgKzQ4LDYgQEAKIE1PRFVMRV9QQVJNX0RFU0MocnR3X2lwc19tb2RlLCAiVGhlIGRlZmF1bHQgSVBTIG1vZGUiKTsKIAogc3RhdGljIGludCBydHdfZGVidWcgPSAxOwotc3RhdGljIGludCBydHdfcmFkaW9fZW5hYmxlID0gMTsKLXN0YXRpYyBpbnQgcnR3X2xvbmdfcmV0cnlfbG10ID0gNzsKLXN0YXRpYyBpbnQgcnR3X3Nob3J0X3JldHJ5X2xtdCA9IDc7Ci1zdGF0aWMgaW50IHJ0d19idXN5X3RocmVzaCA9IDQwOwotc3RhdGljIGludCBydHdfYWNrX3BvbGljeSA9IE5PUk1BTF9BQ0s7CiAKIHN0YXRpYyBpbnQgcnR3X3NvZnR3YXJlX2VuY3J5cHQ7CiBzdGF0aWMgaW50IHJ0d19zb2Z0d2FyZV9kZWNyeXB0OwpAQCAtNzAsMTEgKzU2LDYgQEAKIAogc3RhdGljIGludCBydHdfd21tX2VuYWJsZSA9IDE7LyogIGRlZmF1bHQgaXMgc2V0IHRvIGVuYWJsZSB0aGUgd21tLiAqLwogc3RhdGljIGludCBydHdfdWFwc2RfZW5hYmxlOwotc3RhdGljIGludCBydHdfdWFwc2RfbWF4X3NwID0gTk9fTElNSVQ7Ci1zdGF0aWMgaW50IHJ0d191YXBzZF9hY2JrX2VuOwotc3RhdGljIGludCBydHdfdWFwc2RfYWNiZV9lbjsKLXN0YXRpYyBpbnQgcnR3X3VhcHNkX2FjdmlfZW47Ci1zdGF0aWMgaW50IHJ0d191YXBzZF9hY3ZvX2VuOwogCiBzdGF0aWMgaW50IHJ0d19odF9lbmFibGUgPSAxOwogLyogMCA6ZGlzYWJsZSwgYml0KDApOiBlbmFibGUgMi40ZywgYml0KDEpOiBlbmFibGUgNWcgKi8KQEAgLTg5LDExICs3MCw2IEBACiBzdGF0aWMgaW50IHJ0d19yeF9zdGJjID0gMTsKIHN0YXRpYyBpbnQgcnR3X2FtcGR1X2Ftc2R1Oy8qICAwOiBkaXNhYmxlZCwgMTplbmFibGVkLCAyOmF1dG8gKi8KIAotLyogVXNlIDIgcGF0aCBUeCB0byB0cmFuc21pdCBNQ1MwfjcgYW5kIGxlZ2FjeSBtb2RlICovCi1zdGF0aWMgaW50IHJ0d19sb3dyYXRlX3R3b194bWl0ID0gMTsKLQotc3RhdGljIGludCBydHdfcmZfY29uZmlnID0gUkZfODE5WF9NQVhfVFlQRTsgIC8qIGF1dG8gKi8KLXN0YXRpYyBpbnQgcnR3X2xvd19wb3dlcjsKIHN0YXRpYyBpbnQgcnR3X3dpZmlfc3BlYzsKIHN0YXRpYyBpbnQgcnR3X2NoYW5uZWxfcGxhbiA9IFJUX0NIQU5ORUxfRE9NQUlOX01BWDsKIApAQCAtMTExLDEwICs4Nyw2IEBACiAKIHN0YXRpYyBpbnQgcnR3X2h3cGRuX21vZGUgPSAyOy8qIDA6ZGlzYWJsZSwgMTplbmFibGUsIDI6IGJ5IEVGVVNFIGNvbmZpZyAqLwogCi1zdGF0aWMgaW50IHJ0d19od3B3cnBfZGV0ZWN0OyAvKiBIVyBwb3dlciAgcGluZyBkZXRlY3QgMDpkaXNhYmxlICwgMTplbmFibGUgKi8KLQotc3RhdGljIGludCBydHdfaHdfd3BzX3BiYyA9IDE7Ci0KIGludCBydHdfbWMydV9kaXNhYmxlOwogCiBzdGF0aWMgaW50IHJ0d184MDIxMWQ7CkBAIC0xMzIsMzIgKzEwNCwyMiBAQAogCiBtb2R1bGVfcGFyYW0ocnR3X2luaXRtYWMsIGNoYXJwLCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShydHdfY2hhbm5lbF9wbGFuLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19jaGlwX3ZlcnNpb24sIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X3JmaW50ZnMsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X2xia21vZGUsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X25ldHdvcmtfbW9kZSwgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShydHdfY2hhbm5lbCwgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShydHdfd21tX2VuYWJsZSwgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShydHdfdnJ0bF9jYXJyaWVyX3NlbnNlLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKHJ0d192Y3NfdHlwZSwgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfYnVzeV90aHJlc2gsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X2h0X2VuYWJsZSwgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShydHdfY2J3NDBfZW5hYmxlLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKHJ0d19hbXBkdV9lbmFibGUsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X3J4X3N0YmMsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X2FtcGR1X2Ftc2R1LCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19sb3dyYXRlX3R3b194bWl0LCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19yZl9jb25maWcsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X3Bvd2VyX21nbnQsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X3NtYXJ0X3BzLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19sb3dfcG93ZXIsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X3dpZmlfc3BlYywgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShydHdfYW50ZGl2X2NmZywgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShydHdfYW50ZGl2X3R5cGUsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X2VudXNic3MsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X2h3cGRuX21vZGUsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X2h3cHdycF9kZXRlY3QsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X2h3X3dwc19wYmMsIGludCwgMDY0NCk7CiAKIHN0YXRpYyB1aW50IHJ0d19tYXhfcm9hbWluZ190aW1lcyA9IDI7CiBtb2R1bGVfcGFyYW0ocnR3X21heF9yb2FtaW5nX3RpbWVzLCB1aW50LCAwNjQ0KTsKQEAgLTE4NSwzNjEgKzE0NywxMSBAQAogc3RhdGljIGludCBuZXRkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldik7CiBzdGF0aWMgaW50IG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldik7CiAKLS8qIGR1bW15IHJvdXRpbmVzICovCi12b2lkIHJ0d19wcm9jX3JlbW92ZV9vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLX0KLQotc3RhdGljIHZvaWQgcnR3X3Byb2NfaW5pdF9vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLX0KLQotI2lmIDAJLyogVE9ETzogQ29udmVydCB0aGVzZSB0byAvc3lzICovCi1zdGF0aWMgdm9pZCBydHdfcHJvY19pbml0X29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyX2RldiA9IE5VTEw7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeSA9IE5VTEw7Ci0Jc3RydWN0IGFkYXB0ZXIJKnBhZGFwdGVyID0gcnR3X25ldGRldl9wcml2KGRldik7Ci0JdTggcmZfdHlwZTsKLQotCWlmIChydHdfcHJvYyA9PSBOVUxMKSB7Ci0JCW1lbWNweShydHdfcHJvY19uYW1lLCBEUlZfTkFNRSwgc2l6ZW9mKERSVl9OQU1FKSk7Ci0KLQkJcnR3X3Byb2MgPSBjcmVhdGVfcHJvY19lbnRyeShydHdfcHJvY19uYW1lLCBTX0lGRElSLAotCQkJCQkgICAgIGluaXRfbmV0LnByb2NfbmV0KTsKLQkJaWYgKHJ0d19wcm9jID09IE5VTEwpIHsKLQkJCURCR184OEUoS0VSTl9FUlIgIlVuYWJsZSB0byBjcmVhdGUgcnR3X3Byb2MgZGlyZWN0b3J5XG4iKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgidmVyX2luZm8iLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkJICAgICAgIHJ0d19wcm9jLCBwcm9jX2dldF9kcnZfdmVyc2lvbiwKLQkJCQkJICAgICAgIGRldik7Ci0JCWlmICghZW50cnkpIHsKLQkJCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlpZiAocGFkYXB0ZXItPmRpcl9kZXYgPT0gTlVMTCkgewotCQlwYWRhcHRlci0+ZGlyX2RldiA9IGNyZWF0ZV9wcm9jX2VudHJ5KGRldi0+bmFtZSwKLQkJCQkJICBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR08sCi0JCQkJCSAgcnR3X3Byb2MpOwotCQlkaXJfZGV2ID0gcGFkYXB0ZXItPmRpcl9kZXY7Ci0JCWlmIChkaXJfZGV2ID09IE5VTEwpIHsKLQkJCWlmIChydHdfcHJvY19jbnQgPT0gMCAmJiBydHdfcHJvYykgewotCQkJCXJlbW92ZV9wcm9jX2VudHJ5KHJ0d19wcm9jX25hbWUsIGluaXRfbmV0LnByb2NfbmV0KTsKLQkJCQlydHdfcHJvYyA9IE5VTEw7Ci0JCQl9Ci0KLQkJCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGUgZGlyX2RldiBkaXJlY3RvcnlcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmV0dXJuOwotCX0KLQotCXJ0d19wcm9jX2NudCsrOwotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJ3cml0ZV9yZWciLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF93cml0ZV9yZWcsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCWVudHJ5LT53cml0ZV9wcm9jID0gcHJvY19zZXRfd3JpdGVfcmVnOwotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJyZWFkX3JlZyIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X3JlYWRfcmVnLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQllbnRyeS0+d3JpdGVfcHJvYyA9IHByb2Nfc2V0X3JlYWRfcmVnOwotCi0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImZ3c3RhdGUiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9md3N0YXRlLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic2VjX2luZm8iLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9zZWNfaW5mbywgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIm1sbWV4dF9zdGF0ZSIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X21sbWV4dF9zdGF0ZSwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInFvc19vcHRpb24iLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9xb3Nfb3B0aW9uLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiaHRfb3B0aW9uIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfaHRfb3B0aW9uLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicmZfaW5mbyIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X3JmX2luZm8sIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJhcF9pbmZvIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfYXBfaW5mbywgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImFkYXB0ZXJfc3RhdGUiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldHN0cnVjdCBhZGFwdGVyX3N0YXRlLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgidHJ4X2luZm8iLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF90cnhfaW5mbywgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIm1hY19yZWdfZHVtcDEiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9tYWNfcmVnX2R1bXAxLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgibWFjX3JlZ19kdW1wMiIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X21hY19yZWdfZHVtcDIsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJtYWNfcmVnX2R1bXAzIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfbWFjX3JlZ19kdW1wMywgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImJiX3JlZ19kdW1wMSIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X2JiX3JlZ19kdW1wMSwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImJiX3JlZ19kdW1wMiIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X2JiX3JlZ19kdW1wMiwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImJiX3JlZ19kdW1wMyIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X2JiX3JlZ19kdW1wMywgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJmX3JlZ19kdW1wMSIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X3JmX3JlZ19kdW1wMSwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJmX3JlZ19kdW1wMiIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X3JmX3JlZ19kdW1wMiwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlydHdfaGFsX2dldF9od3JlZyhwYWRhcHRlciwgSFdfVkFSX1JGX1RZUEUsICh1OCAqKSgmcmZfdHlwZSkpOwotCWlmICgoUkZfMVQyUiA9PSByZl90eXBlKSB8fCAoUkZfMVQxUiA9PSByZl90eXBlKSkgewotCQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJmX3JlZ19kdW1wMyIsCi0JCQkJCSAgICAgICBTX0lGUkVHIHwgU19JUlVHTywgZGlyX2RldiwKLQkJCQkJICAgICAgIHByb2NfZ2V0X3JmX3JlZ19kdW1wMywgZGV2KTsKLQkJaWYgKCFlbnRyeSkgewotCQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicmZfcmVnX2R1bXA0IiwKLQkJCQkJICAgICAgIFNfSUZSRUcgfCBTX0lSVUdPLCBkaXJfZGV2LAotCQkJCQkgICAgICAgcHJvY19nZXRfcmZfcmVnX2R1bXA0LCBkZXYpOwotCQlpZiAoIWVudHJ5KSB7Ci0JCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0jaWZkZWYgQ09ORklHXzg4RVVfQVBfTU9ERQotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJhbGxfc3RhX2luZm8iLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9hbGxfc3RhX2luZm8sIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotI2VuZGlmCi0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImJlc3RfY2hhbm5lbCIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X2Jlc3RfY2hhbm5lbCwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJ4X3NpZ25hbCIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X3J4X3NpZ25hbCwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JZW50cnktPndyaXRlX3Byb2MgPSBwcm9jX3NldF9yeF9zaWduYWw7Ci0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJodF9lbmFibGUiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9odF9lbmFibGUsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCWVudHJ5LT53cml0ZV9wcm9jID0gcHJvY19zZXRfaHRfZW5hYmxlOwotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJjYnc0MF9lbmFibGUiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9jYnc0MF9lbmFibGUsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCWVudHJ5LT53cml0ZV9wcm9jID0gcHJvY19zZXRfY2J3NDBfZW5hYmxlOwotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJhbXBkdV9lbmFibGUiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9hbXBkdV9lbmFibGUsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCWVudHJ5LT53cml0ZV9wcm9jID0gcHJvY19zZXRfYW1wZHVfZW5hYmxlOwotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJyeF9zdGJjIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfcnhfc3RiYywgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JZW50cnktPndyaXRlX3Byb2MgPSBwcm9jX3NldF9yeF9zdGJjOwotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJwYXRoX3Jzc2kiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkJZGlyX2RldiwgcHJvY19nZXRfdHdvX3BhdGhfcnNzaSwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJyc3NpX2Rpc3AiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9yc3NpX2Rpc3AsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCWVudHJ5LT53cml0ZV9wcm9jID0gcHJvY19zZXRfcnNzaV9kaXNwOwotfQotCi12b2lkIHJ0d19wcm9jX3JlbW92ZV9vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpcl9kZXYgPSBOVUxMOwotCXN0cnVjdCBhZGFwdGVyCSpwYWRhcHRlciA9IHJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXU4IHJmX3R5cGU7Ci0KLQlkaXJfZGV2ID0gcGFkYXB0ZXItPmRpcl9kZXY7Ci0JcGFkYXB0ZXItPmRpcl9kZXYgPSBOVUxMOwotCi0JaWYgKGRpcl9kZXYpIHsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoIndyaXRlX3JlZyIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgicmVhZF9yZWciLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoImZ3c3RhdGUiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInNlY19pbmZvIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJtbG1leHRfc3RhdGUiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInFvc19vcHRpb24iLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoImh0X29wdGlvbiIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgicmZfaW5mbyIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgiYXBfaW5mbyIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgiYWRhcHRlcl9zdGF0ZSIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgidHJ4X2luZm8iLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoIm1hY19yZWdfZHVtcDEiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoIm1hY19yZWdfZHVtcDIiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoIm1hY19yZWdfZHVtcDMiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoImJiX3JlZ19kdW1wMSIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgiYmJfcmVnX2R1bXAyIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJiYl9yZWdfZHVtcDMiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInJmX3JlZ19kdW1wMSIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgicmZfcmVnX2R1bXAyIiwgZGlyX2Rldik7Ci0JCXJ0d19oYWxfZ2V0X2h3cmVnKHBhZGFwdGVyLCBIV19WQVJfUkZfVFlQRSwgKHU4ICopKCZyZl90eXBlKSk7Ci0JCWlmICgoUkZfMVQyUiA9PSByZl90eXBlKSB8fCAoUkZfMVQxUiA9PSByZl90eXBlKSkgewotCQkJcmVtb3ZlX3Byb2NfZW50cnkoInJmX3JlZ19kdW1wMyIsIGRpcl9kZXYpOwotCQkJcmVtb3ZlX3Byb2NfZW50cnkoInJmX3JlZ19kdW1wNCIsIGRpcl9kZXYpOwotCQl9Ci0jaWZkZWYgQ09ORklHXzg4RVVfQVBfTU9ERQotCQlyZW1vdmVfcHJvY19lbnRyeSgiYWxsX3N0YV9pbmZvIiwgZGlyX2Rldik7Ci0jZW5kaWYKLQotCQlyZW1vdmVfcHJvY19lbnRyeSgiYmVzdF9jaGFubmVsIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJyeF9zaWduYWwiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoImNidzQwX2VuYWJsZSIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgiaHRfZW5hYmxlIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJhbXBkdV9lbmFibGUiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInJ4X3N0YmMiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInBhdGhfcnNzaSIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgicnNzaV9kaXNwIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KGRldi0+bmFtZSwgcnR3X3Byb2MpOwotCQlkaXJfZGV2ID0gTlVMTDsKLQl9IGVsc2UgewotCQlyZXR1cm47Ci0JfQotCXJ0d19wcm9jX2NudC0tOwotCi0JaWYgKHJ0d19wcm9jX2NudCA9PSAwKSB7Ci0JCWlmIChydHdfcHJvYykgewotCQkJcmVtb3ZlX3Byb2NfZW50cnkoInZlcl9pbmZvIiwgcnR3X3Byb2MpOwotCi0JCQlyZW1vdmVfcHJvY19lbnRyeShydHdfcHJvY19uYW1lLCBpbml0X25ldC5wcm9jX25ldCk7Ci0JCQlydHdfcHJvYyA9IE5VTEw7Ci0JCX0KLQl9Ci19Ci0jZW5kaWYKLQogc3RhdGljIHZvaWQgbG9hZHBhcmFtKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYpCiB7CiAJc3RydWN0IHJlZ2lzdHJ5X3ByaXYgICpyZWdpc3RyeV9wYXIgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKIAogCUdsb2JhbERlYnVnTGV2ZWwgPSBydHdfZGVidWc7Ci0JcmVnaXN0cnlfcGFyLT5jaGlwX3ZlcnNpb24gPSAodTgpcnR3X2NoaXBfdmVyc2lvbjsKLQlyZWdpc3RyeV9wYXItPnJmaW50ZnMgPSAodTgpcnR3X3JmaW50ZnM7Ci0JcmVnaXN0cnlfcGFyLT5sYmttb2RlID0gKHU4KXJ0d19sYmttb2RlOwotCXJlZ2lzdHJ5X3Bhci0+bmV0d29ya19tb2RlICA9ICh1OClydHdfbmV0d29ya19tb2RlOwogCiAJbWVtY3B5KHJlZ2lzdHJ5X3Bhci0+c3NpZC5Tc2lkLCAiQU5ZIiwgMyk7CiAJcmVnaXN0cnlfcGFyLT5zc2lkLlNzaWRMZW5ndGggPSAzOwpAQCAtNTUxLDE3ICsxNjMsOSBAQAogCXJlZ2lzdHJ5X3Bhci0+cnRzX3RocmVzaCA9ICh1MTYpcnR3X3J0c190aHJlc2g7CiAJcmVnaXN0cnlfcGFyLT5mcmFnX3RocmVzaCA9ICh1MTYpcnR3X2ZyYWdfdGhyZXNoOwogCXJlZ2lzdHJ5X3Bhci0+cHJlYW1ibGUgPSAodTgpcnR3X3ByZWFtYmxlOwotCXJlZ2lzdHJ5X3Bhci0+c2Nhbl9tb2RlID0gKHU4KXJ0d19zY2FuX21vZGU7Ci0JcmVnaXN0cnlfcGFyLT5hZGhvY190eF9wd3IgPSAodTgpcnR3X2FkaG9jX3R4X3B3cjsKLQlyZWdpc3RyeV9wYXItPnNvZnRfYXAgPSAgKHU4KXJ0d19zb2Z0X2FwOwogCXJlZ2lzdHJ5X3Bhci0+c21hcnRfcHMgPSAgKHU4KXJ0d19zbWFydF9wczsKIAlyZWdpc3RyeV9wYXItPnBvd2VyX21nbnQgPSAodTgpcnR3X3Bvd2VyX21nbnQ7CiAJcmVnaXN0cnlfcGFyLT5pcHNfbW9kZSA9ICh1OClydHdfaXBzX21vZGU7Ci0JcmVnaXN0cnlfcGFyLT5yYWRpb19lbmFibGUgPSAodTgpcnR3X3JhZGlvX2VuYWJsZTsKLQlyZWdpc3RyeV9wYXItPmxvbmdfcmV0cnlfbG10ID0gKHU4KXJ0d19sb25nX3JldHJ5X2xtdDsKLQlyZWdpc3RyeV9wYXItPnNob3J0X3JldHJ5X2xtdCA9ICh1OClydHdfc2hvcnRfcmV0cnlfbG10OwotCXJlZ2lzdHJ5X3Bhci0+YnVzeV90aHJlc2ggPSAodTE2KXJ0d19idXN5X3RocmVzaDsKLQlyZWdpc3RyeV9wYXItPmFja19wb2xpY3kgPSAodTgpcnR3X2Fja19wb2xpY3k7CiAJcmVnaXN0cnlfcGFyLT5tcF9tb2RlID0gMDsKIAlyZWdpc3RyeV9wYXItPnNvZnR3YXJlX2VuY3J5cHQgPSAodTgpcnR3X3NvZnR3YXJlX2VuY3J5cHQ7CiAJcmVnaXN0cnlfcGFyLT5zb2Z0d2FyZV9kZWNyeXB0ID0gKHU4KXJ0d19zb2Z0d2FyZV9kZWNyeXB0OwpAQCAtNTcwLDI4ICsxNzQsMTggQEAKIAkgLyogVUFQU0QgKi8KIAlyZWdpc3RyeV9wYXItPndtbV9lbmFibGUgPSAodTgpcnR3X3dtbV9lbmFibGU7CiAJcmVnaXN0cnlfcGFyLT51YXBzZF9lbmFibGUgPSAodTgpcnR3X3VhcHNkX2VuYWJsZTsKLQlyZWdpc3RyeV9wYXItPnVhcHNkX21heF9zcCA9ICh1OClydHdfdWFwc2RfbWF4X3NwOwotCXJlZ2lzdHJ5X3Bhci0+dWFwc2RfYWNia19lbiA9ICh1OClydHdfdWFwc2RfYWNia19lbjsKLQlyZWdpc3RyeV9wYXItPnVhcHNkX2FjYmVfZW4gPSAodTgpcnR3X3VhcHNkX2FjYmVfZW47Ci0JcmVnaXN0cnlfcGFyLT51YXBzZF9hY3ZpX2VuID0gKHU4KXJ0d191YXBzZF9hY3ZpX2VuOwotCXJlZ2lzdHJ5X3Bhci0+dWFwc2RfYWN2b19lbiA9ICh1OClydHdfdWFwc2RfYWN2b19lbjsKIAogCXJlZ2lzdHJ5X3Bhci0+aHRfZW5hYmxlID0gKHU4KXJ0d19odF9lbmFibGU7CiAJcmVnaXN0cnlfcGFyLT5jYnc0MF9lbmFibGUgPSAodTgpcnR3X2NidzQwX2VuYWJsZTsKIAlyZWdpc3RyeV9wYXItPmFtcGR1X2VuYWJsZSA9ICh1OClydHdfYW1wZHVfZW5hYmxlOwogCXJlZ2lzdHJ5X3Bhci0+cnhfc3RiYyA9ICh1OClydHdfcnhfc3RiYzsKIAlyZWdpc3RyeV9wYXItPmFtcGR1X2Ftc2R1ID0gKHU4KXJ0d19hbXBkdV9hbXNkdTsKLQlyZWdpc3RyeV9wYXItPmxvd3JhdGVfdHdvX3htaXQgPSAodTgpcnR3X2xvd3JhdGVfdHdvX3htaXQ7Ci0JcmVnaXN0cnlfcGFyLT5yZl9jb25maWcgPSAodTgpcnR3X3JmX2NvbmZpZzsKLQlyZWdpc3RyeV9wYXItPmxvd19wb3dlciA9ICh1OClydHdfbG93X3Bvd2VyOwogCXJlZ2lzdHJ5X3Bhci0+d2lmaV9zcGVjID0gKHU4KXJ0d193aWZpX3NwZWM7CiAJcmVnaXN0cnlfcGFyLT5jaGFubmVsX3BsYW4gPSAodTgpcnR3X2NoYW5uZWxfcGxhbjsKIAlyZWdpc3RyeV9wYXItPmFjY2VwdF9hZGRiYV9yZXEgPSB0cnVlOwogCXJlZ2lzdHJ5X3Bhci0+YW50ZGl2X2NmZyA9ICh1OClydHdfYW50ZGl2X2NmZzsKIAlyZWdpc3RyeV9wYXItPmFudGRpdl90eXBlID0gKHU4KXJ0d19hbnRkaXZfdHlwZTsKIAlyZWdpc3RyeV9wYXItPmh3cGRuX21vZGUgPSAodTgpcnR3X2h3cGRuX21vZGU7Ci0JcmVnaXN0cnlfcGFyLT5od3B3cnBfZGV0ZWN0ID0gKHU4KXJ0d19od3B3cnBfZGV0ZWN0OwotCXJlZ2lzdHJ5X3Bhci0+aHdfd3BzX3BiYyA9ICh1OClydHdfaHdfd3BzX3BiYzsKIAogCXJlZ2lzdHJ5X3Bhci0+bWF4X3JvYW1pbmdfdGltZXMgPSAodTgpcnR3X21heF9yb2FtaW5nX3RpbWVzOwogCkBAIC03MzIsNyArMzI2LDcgQEAKIAlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAoIitpbml0X25ldF9kZXZcbiIpKTsKIAogCWlmIChvbGRfcGFkYXB0ZXIgIT0gTlVMTCkKLQkJcG5ldGRldiA9IHJ0d19hbGxvY19ldGhlcmRldl93aXRoX29sZF9wcml2KHNpemVvZihzdHJ1Y3QgYWRhcHRlciksICh2b2lkICopb2xkX3BhZGFwdGVyKTsKKwkJcG5ldGRldiA9IHJ0d19hbGxvY19ldGhlcmRldl93aXRoX29sZF9wcml2KCh2b2lkICopb2xkX3BhZGFwdGVyKTsKIAogCWlmICghcG5ldGRldikKIAkJcmV0dXJuIE5VTEw7CkBAIC03NjIsNyArMzU2LDcgQEAKIAkJZXJyID0gUFRSX0VSUihwYWRhcHRlci0+Y21kVGhyZWFkKTsKIAllbHNlCiAJCS8qIHdhaXQgZm9yIGNtZF90aHJlYWQgdG8gcnVuICovCi0JCV9ydHdfZG93bl9zZW1hKCZwYWRhcHRlci0+Y21kcHJpdi50ZXJtaW5hdGVfY21kdGhyZWFkX3NlbWEpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJnBhZGFwdGVyLT5jbWRwcml2LnRlcm1pbmF0ZV9jbWR0aHJlYWRfY29tcCk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtNzcyLDkgKzM2Niw5IEBACiAJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgKCIrcnR3X3N0b3BfZHJ2X3RocmVhZHNcbiIpKTsKIAogCS8qIEJlbG93IGlzIHRvIHRlcm1pbmF0ZSBydHdfY21kX3RocmVhZCAmIGV2ZW50X3RocmVhZC4uLiAqLwotCXVwKCZwYWRhcHRlci0+Y21kcHJpdi5jbWRfcXVldWVfc2VtYSk7CisJY29tcGxldGUoJnBhZGFwdGVyLT5jbWRwcml2LmNtZF9xdWV1ZV9jb21wKTsKIAlpZiAocGFkYXB0ZXItPmNtZFRocmVhZCkKLQkJX3J0d19kb3duX3NlbWEoJnBhZGFwdGVyLT5jbWRwcml2LnRlcm1pbmF0ZV9jbWR0aHJlYWRfc2VtYSk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmcGFkYXB0ZXItPmNtZHByaXYudGVybWluYXRlX2NtZHRocmVhZF9jb21wKTsKIAogfQogCkBAIC04MjEsNyArNDE1LDYgQEAKIAlwYWRhcHRlci0+YlJlYWRQb3J0Q2FuY2VsID0gZmFsc2U7CiAJcGFkYXB0ZXItPmJXcml0ZVBvcnRDYW5jZWwgPSBmYWxzZTsKIAlwYWRhcHRlci0+YlJ4UlNTSURpc3BsYXkgPSAwOwotCXBhZGFwdGVyLT5iTm90aWZ5Q2hhbm5lbENoYW5nZSA9IDA7CiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCkBAIC05MTIsOCArNTA1LDYgQEAKIAogCXJ0d19oYWxfc3Jlc2V0X2luaXQocGFkYXB0ZXIpOwogCi0Jc3Bpbl9sb2NrX2luaXQoJnBhZGFwdGVyLT5icl9leHRfbG9jayk7Ci0KIGV4aXQ6CiAJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgKCItcnR3X2luaXRfZHJ2X3N3XG4iKSk7CiAKQEAgLTk2MSwxMiArNTUyLDYgQEAKIAogCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICgiPD09IHJ0d19mcmVlX2Rydl9zd1xuIikpOwogCi0JLyogZnJlZSB0aGUgb2xkX3BuZXRkZXYgKi8KLQlpZiAocGFkYXB0ZXItPnJlcmVnX25kX25hbWVfcHJpdi5vbGRfcG5ldGRldikgewotCQlmcmVlX25ldGRldihwYWRhcHRlci0+cmVyZWdfbmRfbmFtZV9wcml2Lm9sZF9wbmV0ZGV2KTsKLQkJcGFkYXB0ZXItPnJlcmVnX25kX25hbWVfcHJpdi5vbGRfcG5ldGRldiA9IE5VTEw7Ci0JfQotCiAJbXV0ZXhfZGVzdHJveSgmcGFkYXB0ZXItPmh3X2luaXRfbXV0ZXgpOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgKCItcnR3X2ZyZWVfZHJ2X3N3XG4iKSk7CkBAIC0xMDEzLDcgKzU5OCw2IEBACiAJCX0KIAkJaWYgKHBhZGFwdGVyLT5pbnRmX3N0YXJ0KQogCQkJcGFkYXB0ZXItPmludGZfc3RhcnQocGFkYXB0ZXIpOwotCQlydHdfcHJvY19pbml0X29uZShwbmV0ZGV2KTsKIAogCQlydHdfbGVkX2NvbnRyb2wocGFkYXB0ZXIsIExFRF9DVExfTk9fTElOSyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zZGVwX3NlcnZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zZGVwX3NlcnZpY2UuYwppbmRleCA3NjQyNTBiLi43Y2QyNjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc2RlcF9zZXJ2aWNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvb3NkZXBfc2VydmljZS5jCkBAIC01NSwyMSArNTUsMTMgQEAKIAlyZXR1cm4gYTsKIH0KIAotdTMyIF9ydHdfZG93bl9zZW1hKHN0cnVjdCBzZW1hcGhvcmUgKnNlbWEpCi17Ci0JaWYgKGRvd25faW50ZXJydXB0aWJsZShzZW1hKSkKLQkJcmV0dXJuIF9GQUlMOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQogdm9pZAlfcnR3X2luaXRfcXVldWUoc3RydWN0IF9fcXVldWUgKnBxdWV1ZSkKIHsKIAlJTklUX0xJU1RfSEVBRCgmKHBxdWV1ZS0+cXVldWUpKTsKIAlzcGluX2xvY2tfaW5pdCgmKHBxdWV1ZS0+bG9jaykpOwogfQogCi1zdHJ1Y3QgbmV0X2RldmljZSAqcnR3X2FsbG9jX2V0aGVyZGV2X3dpdGhfb2xkX3ByaXYoaW50IHNpemVvZl9wcml2LAotCQkJCQkJICAgIHZvaWQgKm9sZF9wcml2KQorc3RydWN0IG5ldF9kZXZpY2UgKnJ0d19hbGxvY19ldGhlcmRldl93aXRoX29sZF9wcml2KHZvaWQgKm9sZF9wcml2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2OwogCXN0cnVjdCBydHdfbmV0ZGV2X3ByaXZfaW5kaWNhdG9yICpwbnBpOwpAQCAtODAsNyArNzIsNiBAQAogCiAJcG5waSA9IG5ldGRldl9wcml2KHBuZXRkZXYpOwogCXBucGktPnByaXYgPSBvbGRfcHJpdjsKLQlwbnBpLT5zaXplb2ZfcHJpdiA9IHNpemVvZl9wcml2OwogCiBSRVRVUk46CiAJcmV0dXJuIHBuZXRkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9yZWN2X2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9yZWN2X2xpbnV4LmMKaW5kZXggMGM0NDkxNC4uMTAzY2RiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvcmVjdl9saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3JlY3ZfbGludXguYwpAQCAtMjQsNyArMjQsNiBAQAogLyogYWxsb2Mgb3MgcmVsYXRlZCByZXNvdXJjZSBpbiBzdHJ1Y3QgcmVjdl9mcmFtZSAqLwogdm9pZCBydHdfb3NfcmVjdl9yZXNvdXJjZV9hbGxvYyhzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKIHsKLQlwcmVjdmZyYW1lLT5wa3RfbmV3YWxsb2MgPSBOVUxMOwogCXByZWN2ZnJhbWUtPnBrdCA9IE5VTEw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9pbnRmLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2JfaW50Zi5jCmluZGV4IDExZDUxYTMuLjY4ZTFlNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9pbnRmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX2ludGYuYwpAQCAtMjUsOSArMjUsMTAgQEAKICNpbmNsdWRlIDxvc2RlcF9pbnRmLmg+CiAKICNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0jaW5jbHVkZSA8dXNiX2hhbC5oPgogI2luY2x1ZGUgPHJ0d19pb2N0bC5oPgogCisjaW5jbHVkZSAicnRsODE4OGVfaGFsLmgiCisKICNkZWZpbmUgVVNCX1ZFTkRFUl9JRF9SRUFMVEVLCQkweDBiZGEKIAogLyogRElEX1VTQl92OTE2XzIwMTMwMTE2ICovCkBAIC03OSw5ICs4MCw4IEBACiAKIAlwZHZvYmpwcml2LT5OdW1JbnRlcmZhY2VzID0gcGNvbmZfZGVzYy0+Yk51bUludGVyZmFjZXM7CiAJcGR2b2JqcHJpdi0+SW50ZXJmYWNlTnVtYmVyID0gcGlmYWNlX2Rlc2MtPmJJbnRlcmZhY2VOdW1iZXI7Ci0JcGR2b2JqcHJpdi0+bnJfZW5kcG9pbnQgPSBwaWZhY2VfZGVzYy0+Yk51bUVuZHBvaW50czsKIAotCWZvciAoaSA9IDA7IGkgPCBwZHZvYmpwcml2LT5ucl9lbmRwb2ludDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHBpZmFjZV9kZXNjLT5iTnVtRW5kcG9pbnRzOyBpKyspIHsKIAkJaW50IGVwX251bTsKIAkJcGVuZHBfZGVzYyA9ICZwaG9zdF9pZmFjZS0+ZW5kcG9pbnRbaV0uZGVzYzsKIApAQCAtOTgsNyArOTgsNiBAQAogCQkJCWVwX251bTsKIAkJCXBkdm9ianByaXYtPlJ0TnVtT3V0UGlwZXMrKzsKIAkJfQotCQlwZHZvYmpwcml2LT5lcF9udW1baV0gPSBlcF9udW07CiAJfQogCiAJaWYgKHB1c2JkLT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKQEAgLTEwNywxMyArMTA2LDYgQEAKIAkJcGR2b2JqcHJpdi0+aXNoaWdoc3BlZWQgPSBmYWxzZTsKIAogCW11dGV4X2luaXQoJnBkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKLQlwZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9idWYgPSBremFsbG9jKE1BWF9VU0JfSU9fQ1RMX1NJWkUsIEdGUF9LRVJORUwpOwotCi0JaWYgKCFwZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9idWYpIHsKLQkJdXNiX3NldF9pbnRmZGF0YSh1c2JfaW50ZiwgTlVMTCk7Ci0JCWtmcmVlKHBkdm9ianByaXYpOwotCQlyZXR1cm4gTlVMTDsKLQl9CiAJdXNiX2dldF9kZXYocHVzYmQpOwogCiAJcmV0dXJuIHBkdm9ianByaXY7CkBAIC0xNDEsNyArMTMzLDYgQEAKIAkJCX0KIAkJfQogCi0JCWtmcmVlKGR2b2JqLT51c2JfdmVuZG9yX3JlcV9idWYpOwogCQltdXRleF9kZXN0cm95KCZkdm9iai0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwogCQlrZnJlZShkdm9iaik7CiAJfQpAQCAtMjM4LDcgKzIyOSw3IEBACiAJcnR3X2NhbmNlbF9hbGxfdGltZXIocGFkYXB0ZXIpOwogCUxlYXZlQWxsUG93ZXJTYXZlTW9kZShwYWRhcHRlcik7CiAKLQlfZW50ZXJfcHdybG9jaygmcHdycHJpdi0+bG9jayk7CisJbXV0ZXhfbG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAJLyogczEuICovCiAJaWYgKHBuZXRkZXYpIHsKIAkJbmV0aWZfY2Fycmllcl9vZmYocG5ldGRldik7CkBAIC0yNjcsNyArMjU4LDcgQEAKIAlydHdfZnJlZV9uZXR3b3JrX3F1ZXVlKHBhZGFwdGVyLCB0cnVlKTsKIAogCXJ0d19kZXZfdW5sb2FkKHBhZGFwdGVyKTsKLQlfZXhpdF9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwltdXRleF91bmxvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSkKIAkJcnR3X2luZGljYXRlX3NjYW5fZG9uZShwYWRhcHRlciwgMSk7CkBAIC0yOTgsMTggKzI4OSwyMCBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JX2VudGVyX3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCW11dGV4X2xvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCXJ0d19yZXNldF9kcnZfc3cocGFkYXB0ZXIpOwogCXB3cnByaXYtPmJrZWVwZndhbGl2ZSA9IGZhbHNlOwogCiAJcHJfZGVidWcoImJrZWVwZndhbGl2ZSgleClcbiIsIHB3cnByaXYtPmJrZWVwZndhbGl2ZSk7Ci0JaWYgKHBtX25ldGRldl9vcGVuKHBuZXRkZXYsIHRydWUpICE9IDApCisJaWYgKHBtX25ldGRldl9vcGVuKHBuZXRkZXYsIHRydWUpICE9IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZwd3Jwcml2LT5tdXRleF9sb2NrKTsKIAkJZ290byBleGl0OworCX0KIAogCW5ldGlmX2RldmljZV9hdHRhY2gocG5ldGRldik7CiAJbmV0aWZfY2Fycmllcl9vbihwbmV0ZGV2KTsKIAotCV9leGl0X3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCW11dGV4X3VubG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAKIAlydHdfcm9hbWluZyhwYWRhcHRlciwgTlVMTCk7CiAKQEAgLTM2OSw4ICszNjIsOSBAQAogCQlwYWRhcHRlci0+cG1vbmRldiA9IHBtb25kZXY7CiAJfQogCi0JLyogc3RlcCAyLiBob29rIEhhbEZ1bmMsIGFsbG9jYXRlIEhhbERhdGEgKi8KLQloYWxfc2V0X2hhbF9vcHMocGFkYXB0ZXIpOworCXBhZGFwdGVyLT5IYWxEYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhhbF9kYXRhXzgxODhlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWRhcHRlci0+SGFsRGF0YSkKKwkJREJHXzg4RSgiY2FudCBub3QgYWxsb2MgbWVtb3J5IGZvciBIQUwgREFUQVxuIik7CiAKIAlwYWRhcHRlci0+aW50Zl9zdGFydCA9ICZ1c2JfaW50Zl9zdGFydDsKIAlwYWRhcHRlci0+aW50Zl9zdG9wID0gJnVzYl9pbnRmX3N0b3A7CkBAIC00NTYsMTEgKzQ1MCw5IEBACiAJZnJlZV9tbG1lX2FwX2luZm8oaWYxKTsKICNlbmRpZgogCi0JaWYgKHBuZXRkZXYpIHsKLQkJLyogd2lsbCBjYWxsIG5ldGRldl9jbG9zZSgpICovCi0JCXVucmVnaXN0ZXJfbmV0ZGV2KHBuZXRkZXYpOwotCQlydHdfcHJvY19yZW1vdmVfb25lKHBuZXRkZXYpOwotCX0KKwlpZiAocG5ldGRldikKKwkJdW5yZWdpc3Rlcl9uZXRkZXYocG5ldGRldik7IC8qIHdpbGwgY2FsbCBuZXRkZXZfY2xvc2UoKSAqLworCiAJcnRsODhldV9tb25fZGVpbml0KGlmMS0+cG1vbmRldik7CiAJcnR3X2NhbmNlbF9hbGxfdGltZXIoaWYxKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX29wc19saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX29wc19saW51eC5jCmluZGV4IGNlMWUxYTEuLmQwZDU5MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9vcHNfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2Jfb3BzX2xpbnV4LmMKQEAgLTIwLDcgKzIwLDcgQEAKIAogc3RhdGljIHZvaWQgaW50ZXJydXB0X2hhbmRsZXJfODE4OGV1KHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTE2IHBrdF9sZW4sIHU4ICpwYnVmKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gYWRhcHQtPkhhbERhdGE7CiAKIAlpZiAocGt0X2xlbiAhPSBJTlRFUlJVUFRfTVNHX0ZPUk1BVF9MRU4pIHsKIAkJREJHXzg4RSgiJXMgSW52YWxpZCBpbnRlcnJ1cHQgY29udGVudCBsZW5ndGggKCVkKSFcbiIsIF9fZnVuY19fLCBwa3RfbGVuKTsKQEAgLTQ4LDcgKzQ4LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqcGt0X2NvcHkgPSBOVUxMOwogCXN0cnVjdCByZWN2X2ZyYW1lCSpwcmVjdmZyYW1lID0gTlVMTDsKIAlzdHJ1Y3QgcnhfcGt0X2F0dHJpYgkqcGF0dHJpYiA9IE5VTEw7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAlzdHJ1Y3QgcmVjdl9wcml2CSpwcmVjdnByaXYgPSAmYWRhcHQtPnJlY3Zwcml2OwogCXN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlID0gJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3F1ZXVlOwogCkBAIC0yNTEsNyArMjUxLDcgQEAKIAl9CiAKIAkvKiAgQWNxdWlyZSBJTyBtZW1vcnkgZm9yIHZlbmRvcnJlcSAqLwotCXBJb19idWYgPSBkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX2J1ZjsKKwlwSW9fYnVmID0ga21hbGxvYyhNQVhfVVNCX0lPX0NUTF9TSVpFLCBHRlBfQVRPTUlDKTsKIAogCWlmIChwSW9fYnVmID09IE5VTEwpIHsKIAkJREJHXzg4RSgiWyVzXSBwSW9fYnVmID09IE5VTExcbiIsIF9fZnVuY19fKTsKQEAgLTI4NSw4ICsyODUsNyBAQAogCQkJCWlmIChzdGF0dXMgPT0gKC1FU0hVVERPV04pIHx8IHN0YXR1cyA9PSAtRU5PREVWKSB7CiAJCQkJCWFkYXB0LT5iU3VycHJpc2VSZW1vdmVkID0gdHJ1ZTsKIAkJCQl9IGVsc2UgewotCQkJCQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwotCQkJCQloYWxkYXRhLT5zcmVzdHByaXYuV2lmaV9FcnJvcl9TdGF0dXMgPSBVU0JfVkVOX1JFUV9DTURfRkFJTDsKKwkJCQkJYWRhcHQtPkhhbERhdGEtPnNyZXN0cHJpdi5XaWZpX0Vycm9yX1N0YXR1cyA9IFVTQl9WRU5fUkVRX0NNRF9GQUlMOwogCQkJCX0KIAkJCX0gZWxzZSB7IC8qICBzdGF0dXMgIT0gbGVuICYmIHN0YXR1cyA+PSAwICovCiAJCQkJaWYgKHN0YXR1cyA+IDApIHsKQEAgLTMwMyw2ICszMDIsOCBAQAogCQlpZiAoKHZhbHVlID49IEZXXzgxODhFX1NUQVJUX0FERFJFU1MgJiYgdmFsdWUgPD0gRldfODE4OEVfRU5EX0FERFJFU1MpIHx8IHN0YXR1cyA9PSBsZW4pCiAJCQlicmVhazsKIAl9CisJa2ZyZWUocElvX2J1Zik7CisKIHJlbGVhc2VfbXV0ZXg6CiAJbXV0ZXhfdW5sb2NrKCZkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKIGV4aXQ6CkBAIC00MzQsMTAgKzQzNSw3IEBACiAJCQlicmVhazsKIAkJY2FzZSAtRVBST1RPOgogCQljYXNlIC1FT1ZFUkZMT1c6Ci0JCQl7Ci0JCQkJc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQkJCQloYWxkYXRhLT5zcmVzdHByaXYuV2lmaV9FcnJvcl9TdGF0dXMgPSBVU0JfUkVBRF9QT1JUX0ZBSUw7Ci0JCQl9CisJCQlhZGFwdC0+SGFsRGF0YS0+c3Jlc3Rwcml2LldpZmlfRXJyb3JfU3RhdHVzID0gVVNCX1JFQURfUE9SVF9GQUlMOwogCQkJcHJlY3ZidWYtPnJldXNlID0gdHJ1ZTsKIAkJCXVzYl9yZWFkX3BvcnQoYWRhcHQsIHByZWN2cHJpdi0+ZmZfaHdhZGRyLCAwLCAodW5zaWduZWQgY2hhciAqKXByZWN2YnVmKTsKIAkJCWJyZWFrOwpAQCAtNTI1LDcgKzUyMyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCB1c2JfcmVhZF9wb3J0X2NhbmNlbChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCit2b2lkIHJ0d19oYWxfaW5pcnBfZGVpbml0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmOwpAQCAtNjkxLDcgKzY4OSw3IEBACiAJdGFza2xldF9oaV9zY2hlZHVsZSgmcHhtaXRwcml2LT54bWl0X3Rhc2tsZXQpOwogfQogCi11MzIgdXNiX3dyaXRlX3BvcnQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgYWRkciwgdTMyIGNudCwgdTggKndtZW0pCit1MzIgdXNiX3dyaXRlX3BvcnQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgYWRkciwgdTMyIGNudCwgc3RydWN0IHhtaXRfYnVmICp4bWl0YnVmKQogewogCXVuc2lnbmVkIGxvbmcgaXJxTDsKIAl1bnNpZ25lZCBpbnQgcGlwZTsKQEAgLTcwMCw4ICs2OTgsNyBAQAogCXN0cnVjdCB1cmIgKnB1cmIgPSBOVUxMOwogCXN0cnVjdCBkdm9ial9wcml2CSpwZHZvYmogPSBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKTsKIAlzdHJ1Y3QgeG1pdF9wcml2CSpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYgPSAoc3RydWN0IHhtaXRfYnVmICopd21lbTsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSA9IChzdHJ1Y3QgeG1pdF9mcmFtZSAqKXB4bWl0YnVmLT5wcml2X2RhdGE7CisJc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUgPSAoc3RydWN0IHhtaXRfZnJhbWUgKil4bWl0YnVmLT5wcml2X2RhdGE7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnB1c2JkID0gcGR2b2JqLT5wdXNiZGV2OwogCiAKQEAgLTcxMSw3ICs3MDgsNyBAQAogCSAgICAocGFkYXB0ZXItPnB3cmN0cmxwcml2LnBucF9ic3RvcF90cngpKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAogCQkJICgidXNiX3dyaXRlX3BvcnQ6KCBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHxwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fGFkYXB0ZXItPnB3cmN0cmxwcml2LnBucF9ic3RvcF90cngpISEhXG4iKSk7Ci0JCXJ0d19zY3R4X2RvbmVfZXJyKCZweG1pdGJ1Zi0+c2N0eCwgUlRXX1NDVFhfRE9ORV9UWF9ERU5ZKTsKKwkJcnR3X3NjdHhfZG9uZV9lcnIoJnhtaXRidWYtPnNjdHgsIFJUV19TQ1RYX0RPTkVfVFhfREVOWSk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTcyMCw0NCArNzE3LDQ0IEBACiAJc3dpdGNoIChhZGRyKSB7CiAJY2FzZSBWT19RVUVVRV9JTlg6CiAJCXB4bWl0cHJpdi0+dm9xX2NudCsrOwotCQlweG1pdGJ1Zi0+ZmxhZ3MgPSBWT19RVUVVRV9JTlg7CisJCXhtaXRidWYtPmZsYWdzID0gVk9fUVVFVUVfSU5YOwogCQlicmVhazsKIAljYXNlIFZJX1FVRVVFX0lOWDoKIAkJcHhtaXRwcml2LT52aXFfY250Kys7Ci0JCXB4bWl0YnVmLT5mbGFncyA9IFZJX1FVRVVFX0lOWDsKKwkJeG1pdGJ1Zi0+ZmxhZ3MgPSBWSV9RVUVVRV9JTlg7CiAJCWJyZWFrOwogCWNhc2UgQkVfUVVFVUVfSU5YOgogCQlweG1pdHByaXYtPmJlcV9jbnQrKzsKLQkJcHhtaXRidWYtPmZsYWdzID0gQkVfUVVFVUVfSU5YOworCQl4bWl0YnVmLT5mbGFncyA9IEJFX1FVRVVFX0lOWDsKIAkJYnJlYWs7CiAJY2FzZSBCS19RVUVVRV9JTlg6CiAJCXB4bWl0cHJpdi0+YmtxX2NudCsrOwotCQlweG1pdGJ1Zi0+ZmxhZ3MgPSBCS19RVUVVRV9JTlg7CisJCXhtaXRidWYtPmZsYWdzID0gQktfUVVFVUVfSU5YOwogCQlicmVhazsKIAljYXNlIEhJR0hfUVVFVUVfSU5YOgotCQlweG1pdGJ1Zi0+ZmxhZ3MgPSBISUdIX1FVRVVFX0lOWDsKKwkJeG1pdGJ1Zi0+ZmxhZ3MgPSBISUdIX1FVRVVFX0lOWDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHhtaXRidWYtPmZsYWdzID0gTUdUX1FVRVVFX0lOWDsKKwkJeG1pdGJ1Zi0+ZmxhZ3MgPSBNR1RfUVVFVUVfSU5YOwogCQlicmVhazsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZweG1pdHByaXYtPmxvY2ssIGlycUwpOwogCi0JcHVyYgk9IHB4bWl0YnVmLT5weG1pdF91cmJbMF07CisJcHVyYgk9IHhtaXRidWYtPnB4bWl0X3VyYlswXTsKIAogCS8qIHRyYW5zbGF0ZSBETUEgRklGTyBhZGRyIHRvIHBpcGVoYW5kbGUgKi8KIAlwaXBlID0gZmZhZGRyMnBpcGVoZGwocGR2b2JqLCBhZGRyKTsKIAogCXVzYl9maWxsX2J1bGtfdXJiKHB1cmIsIHB1c2JkLCBwaXBlLAotCQkJICBweG1pdGZyYW1lLT5idWZfYWRkciwgLyogIHB4bWl0YnVmLT5wYnVmICovCisJCQkgIHB4bWl0ZnJhbWUtPmJ1Zl9hZGRyLCAvKiAgeG1pdGJ1Zi0+cGJ1ZiAqLwogCQkJICBjbnQsCiAJCQkgIHVzYl93cml0ZV9wb3J0X2NvbXBsZXRlLAotCQkJICBweG1pdGJ1Zik7LyogY29udGV4dCBpcyBweG1pdGJ1ZiAqLworCQkJICB4bWl0YnVmKTsvKiBjb250ZXh0IGlzIHhtaXRidWYgKi8KIAogCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHB1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChzdGF0dXMpIHsKLQkJcnR3X3NjdHhfZG9uZV9lcnIoJnB4bWl0YnVmLT5zY3R4LCBSVFdfU0NUWF9ET05FX1dSSVRFX1BPUlRfRVJSKTsKKwkJcnR3X3NjdHhfZG9uZV9lcnIoJnhtaXRidWYtPnNjdHgsIFJUV19TQ1RYX0RPTkVfV1JJVEVfUE9SVF9FUlIpOwogCQlEQkdfODhFKCJ1c2Jfd3JpdGVfcG9ydCwgc3RhdHVzID0lZFxuIiwgc3RhdHVzKTsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sICgidXNiX3dyaXRlX3BvcnQoKTogdXNiX3N1Ym1pdF91cmIsIHN0YXR1cyA9JXhcbiIsIHN0YXR1cykpOwogCkBAIC03NzksNyArNzc2LDcgQEAKIAogZXhpdDoKIAlpZiAocmV0ICE9IF9TVUNDRVNTKQotCQlydHdfZnJlZV94bWl0YnVmKHB4bWl0cHJpdiwgcHhtaXRidWYpOworCQlydHdfZnJlZV94bWl0YnVmKHB4bWl0cHJpdiwgeG1pdGJ1Zik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODQ2LDcgKzg0Myw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCXJldCA9IHJ0bDgxODhldV94bWl0ZnJhbWVfY29tcGxldGUoYWRhcHQsIHB4bWl0cHJpdiwgTlVMTCk7CisJCXJldCA9IHJ0bDgxODhldV94bWl0ZnJhbWVfY29tcGxldGUoYWRhcHQsIHB4bWl0cHJpdik7CiAKIAkJaWYgKCFyZXQpCiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3htaXRfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3htaXRfbGludXguYwppbmRleCAyMjFlMjc1Li40YjFiMDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC94bWl0X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAveG1pdF9saW51eC5jCkBAIC03Miw3ICs3Miw3IEBACiAJaWYgKHB4bWl0YnVmLT5wYWxsb2NhdGVkX2J1ZiA9PSBOVUxMKQogCQlyZXR1cm4gX0ZBSUw7CiAKLQlweG1pdGJ1Zi0+cGJ1ZiA9ICh1OCAqKU5fQllURV9BTElHTUVOVCgoc2l6ZV90KShweG1pdGJ1Zi0+cGFsbG9jYXRlZF9idWYpLCBYTUlUQlVGX0FMSUdOX1NaKTsKKwlweG1pdGJ1Zi0+cGJ1ZiA9IFBUUl9BTElHTihweG1pdGJ1Zi0+cGFsbG9jYXRlZF9idWYsIFhNSVRCVUZfQUxJR05fU1opOwogCXB4bWl0YnVmLT5kbWFfdHJhbnNmZXJfYWRkciA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvZG90MTFkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvZG90MTFkLmMKaW5kZXggNGQ4ZmI0MS4uMjU3MjViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2RvdDExZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuYwpAQCAtNTEsOSArNTEsOCBAQAogCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9OT05FOwogCXBEb3QxMWRJbmZvLT5Db3VudHJ5SWVMZW4gPSAwOwogCW1lbXNldChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXAsIDAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKLQltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOworCW1lbXNldChwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0LCAweEZGLCBNQVhfQ0hBTk5FTF9OVU1CRVIgKyAxKTsKIAlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7Ci0KIH0KIEVYUE9SVF9TWU1CT0woZG90MTFkX2luaXQpOwogCkBAIC05OSwxNCArOTgsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0woRG90MTFkX0NoYW5uZWxtYXApOwogCi0KIHZvaWQgRG90MTFkX1Jlc2V0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQogewogCXN0cnVjdCBydF9kb3QxMWRfaW5mbyAqcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oaWVlZSk7CiAJdTMyIGk7CiAKLQltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7Ci0JbWVtc2V0KHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3QsIDB4RkYsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKwltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIgKyAxKTsKKwltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSICsgMSk7CiAJZm9yIChpID0gMTsgaSA8PSAxMTsgaSsrKQogCQkocERvdDExZEluZm8tPmNoYW5uZWxfbWFwKVtpXSA9IDE7CiAJZm9yIChpID0gMTI7IGkgPD0gMTQ7IGkrKykKQEAgLTEyMyw4ICsxMjEsOCBAQAogCXU4IGksIGosIE51bVRyaXBsZXMsIE1heENobmxOdW07CiAJc3RydWN0IGNobmxfdHhwb3dfdHJpcGxlICpwVHJpcGxlOwogCi0JbWVtc2V0KHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcCwgMCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOwotCW1lbXNldChwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0LCAweEZGLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisJbWVtc2V0KHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcCwgMCwgTUFYX0NIQU5ORUxfTlVNQkVSICsgMSk7CisJbWVtc2V0KHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3QsIDB4RkYsIE1BWF9DSEFOTkVMX05VTUJFUiArIDEpOwogCU1heENobmxOdW0gPSAwOwogCU51bVRyaXBsZXMgPSAoQ291dHJ5SWVMZW4gLSAzKSAvIDM7CiAJcFRyaXBsZSA9IChzdHJ1Y3QgY2hubF90eHBvd190cmlwbGUgKikocENvdXRyeUllICsgMyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvZG90MTFkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvZG90MTFkLmgKaW5kZXggNzM1YTE5OS4uYWFjMzk1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2RvdDExZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuaApAQCAtNDcsOCArNDcsOCBAQAogCXU4ICBDb3VudHJ5SWVTcmNBZGRyWzZdOwogCXU4ICBDb3VudHJ5SWVXYXRjaGRvZzsKIAotCXU4ICBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07Ci0JdTggIE1heFR4UHdyRGJtTGlzdFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisJdTggIGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUiArIDFdOworCXU4ICBNYXhUeFB3ckRibUxpc3RbTUFYX0NIQU5ORUxfTlVNQkVSICsgMV07CiAKIAllbnVtIGRvdDExZF9zdGF0ZSBTdGF0ZTsKIH07CkBAIC03OCw2ICs3OCw3IEBACiB7CiAJR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSA9IDA7CiB9CisKICNkZWZpbmUgVVBEQVRFX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSAoKytHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpKQogCiB2b2lkIGRvdDExZF9pbml0KHN0cnVjdCBydGxsaWJfZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfZGV2LmMKaW5kZXggYmE2NGE0Zi4uOGQ2YmNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9kZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2Rldi5jCkBAIC0xNDg3LDggKzE0ODcsOCBAQAogCXN0cnVjdCBwaHlfb2ZkbV9yeF9zdGF0dXNfcnhzY19zZ2llbl9leGludGZmbGFnICpwcnhzYzsKIAl1OCAqcHJ4cGt0OwogCXU4IGksIG1heF9zcGF0aWFsX3N0cmVhbSwgdG1wX3J4c25yLCB0bXBfcnhldm0sIHJ4c2Nfc2dpZW5fZXhmbGc7Ci0JY2hhciByeF9wd3JbNF0sIHJ4X3B3cl9hbGwgPSAwOwotCWNoYXIgcnhfc25yWCwgcnhfZXZtWDsKKwlzOCByeF9wd3JbNF0sIHJ4X3B3cl9hbGwgPSAwOworCXM4IHJ4X3NuclgsIHJ4X2V2bVg7CiAJdTggZXZtLCBwd2RiX2FsbDsKIAl1MzIgUlNTSSwgdG90YWxfcnNzaSA9IDA7CiAJdTggaXNfY2NrX3JhdGUgPSAwOwpAQCAtMTYxMyw3ICsxNjEzLDcgQEAKIAkJCQkgICAgIDIpIC0gMTEwOwogCiAJCQl0bXBfcnhzbnIgPSBwb2ZkbV9idWYtPnJ4c25yX1hbaV07Ci0JCQlyeF9zbnJYID0gKGNoYXIpKHRtcF9yeHNucik7CisJCQlyeF9zbnJYID0gKHM4KSh0bXBfcnhzbnIpOwogCQkJcnhfc25yWCAvPSAyOwogCQkJcHJpdi0+c3RhdHMucnhTTlJkQltpXSA9IChsb25nKXJ4X3Nuclg7CiAKQEAgLTE2NDMsNyArMTY0Myw3IEBACiAKIAkJZm9yIChpID0gMDsgaSA8IG1heF9zcGF0aWFsX3N0cmVhbTsgaSsrKSB7CiAJCQl0bXBfcnhldm0gPSBwb2ZkbV9idWYtPnJ4ZXZtX1hbaV07Ci0JCQlyeF9ldm1YID0gKGNoYXIpKHRtcF9yeGV2bSk7CisJCQlyeF9ldm1YID0gKHM4KSh0bXBfcnhldm0pOwogCiAJCQlyeF9ldm1YIC89IDI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfaHdpbWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfaHdpbWcuYwppbmRleCAyOWNlZmI1Li5kNDM3YThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2h3aW1nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9od2ltZy5jCkBAIC0xMSw3ICsxMSw3IEBACiAgKgogICogQ29udGFjdCBJbmZvcm1hdGlvbjoKICAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKkNyZWF0ZWQgb24gIDIwMDgvMTEvMTgsICAzOiA3Ki8KIAogI2luY2x1ZGUgInI4MTkyRV9od2ltZy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9waHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfcGh5LmMKaW5kZXggNWUzYmJlNS4uZGRlNDkyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9waHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX3BoeS5jCkBAIC0yNTYsNyArMjU2LDcgQEAKIAkJcmV0dXJuIDA7CiAJaWYgKHByaXYtPnJ0bGxpYi0+ZVJGUG93ZXJTdGF0ZSAhPSBlUmZPbiAmJiAhcHJpdi0+YmVpbmdfaW5pdF9hZGFwdGVyKQogCQlyZXR1cm4JMDsKLQlkb3duKCZwcml2LT5yZl9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnJmX211dGV4KTsKIAlpZiAocHJpdi0+UmZfTW9kZSA9PSBSRl9PUF9CeV9GVykgewogCQlPcmlnaW5hbF9WYWx1ZSA9IF9ydGw5MmVfcGh5X3JmX2Z3X3JlYWQoZGV2LCBlUkZQYXRoLCBSZWdBZGRyKTsKIAkJdWRlbGF5KDIwMCk7CkBAIC0yNjUsNyArMjY1LDcgQEAKIAl9CiAJQml0U2hpZnQgPSAgX3J0bDkyZV9jYWxjdWxhdGVfYml0X3NoaWZ0KEJpdE1hc2spOwogCVJlYWRiYWNrX1ZhbHVlID0gKE9yaWdpbmFsX1ZhbHVlICYgQml0TWFzaykgPj4gQml0U2hpZnQ7Ci0JdXAoJnByaXYtPnJmX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5yZl9tdXRleCk7CiAJcmV0dXJuIFJlYWRiYWNrX1ZhbHVlOwogfQogCkBAIC02MzAsNyArNjMwLDcgQEAKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAJdTgJcG93ZXJsZXZlbCA9IDAsIHBvd2VybGV2ZWxPRkRNMjRHID0gMDsKLQljaGFyIGFudF9wd3JfZGlmZjsKKwlzOAlhbnRfcHdyX2RpZmY7CiAJdTMyCXU0UmVnVmFsdWU7CiAKIAlpZiAocHJpdi0+ZXByb210eXBlID09IEVFUFJPTV85M0M0NikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jYW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfY2FtLmMKaW5kZXggODAzYzhiMC4uMzBmNjVhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jYW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NhbS5jCkBAIC0xMDcsOSArMTA3LDkgQEAKIAkJCQkJICAgIF9fZnVuY19fKTsKIAkJCQlyZXR1cm47CiAJCQl9Ci0JCQlkb3duKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCQkJbXV0ZXhfbG9jaygmcHJpdi0+cnRsbGliLT5pcHNfbXV0ZXgpOwogCQkJcnRsOTJlX2lwc19sZWF2ZShkZXYpOwotCQkJdXAoJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJCQltdXRleF91bmxvY2soJnByaXYtPnJ0bGxpYi0+aXBzX211dGV4KTsKIAkJfQogCX0KIAlwcml2LT5ydGxsaWItPmlzX3NldF9rZXkgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuYwppbmRleCAxM2E1ZGRjLi40YzMwZWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuYwpAQCAtMzgsNyArMzgsNyBAQAogc3RhdGljIGNoYXIgKmlmbmFtZSA9ICJ3bGFuJWQiOwogCiAKLXN0YXRpYyBzdHJ1Y3QgcnRsODE5eF9vcHMgcnRsODE5eHBfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBydGw4MTl4X29wcyBydGw4MTl4cF9vcHMgPSB7CiAJLm5pY190eXBlCQkJPSBOSUNfODE5MkUsCiAJLmdldF9lZXByb21fc2l6ZQkJPSBydGw5MmVfZ2V0X2VlcHJvbV9zaXplLAogCS5pbml0X2FkYXB0ZXJfdmFyaWFibGUJCT0gcnRsOTJlX2luaXRfdmFyaWFibGVzLApAQCAtOTkzLDggKzk5Myw4IEBACiAJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmlycV90aF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cmZfcHNfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnBzX2xvY2spOwotCXNlbWFfaW5pdCgmcHJpdi0+d3hfc2VtLCAxKTsKLQlzZW1hX2luaXQoJnByaXYtPnJmX3NlbSwgMSk7CisJbXV0ZXhfaW5pdCgmcHJpdi0+d3hfbXV0ZXgpOworCW11dGV4X2luaXQoJnByaXYtPnJmX211dGV4KTsKIAltdXRleF9pbml0KCZwcml2LT5tdXRleCk7CiB9CiAKQEAgLTEyNDcsNyArMTI0Nyw3IEBACiAKIFJFU0VUX1NUQVJUOgogCi0JCWRvd24oJnByaXYtPnd4X3NlbSk7CisJCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCQlpZiAocHJpdi0+cnRsbGliLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKQogCQkJcnRsOTJlX2xlaXN1cmVfcHNfbGVhdmUoZGV2KTsKQEAgLTEyNTUsNyArMTI1NSw3IEBACiAJCWlmIChwcml2LT51cCkgewogCQkJbmV0ZGV2X2luZm8oZGV2LCAiJXMoKTp0aGUgZHJpdmVyIGlzIG5vdCB1cC5cbiIsCiAJCQkJICAgIF9fZnVuY19fKTsKLQkJCXVwKCZwcml2LT53eF9zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJCQlyZXR1cm47CiAJCX0KIAkJcHJpdi0+dXAgPSAwOwpAQCAtMTI3NywxNCArMTI3NywxNCBAQAogCQlydGxsaWJfc3RvcF9zY2FuX3N5bmNybyhpZWVlKTsKIAogCQlpZiAoaWVlZS0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCkgewotCQkJU0VNX0RPV05fSUVFRV9XWCgmaWVlZS0+d3hfc2VtKTsKKwkJCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAkJCW5ldGRldl9pbmZvKGRldiwgImllZWUtPnN0YXRlIGlzIFJUTExJQl9MSU5LRURcbiIpOwogCQkJcnRsbGliX3N0b3Bfc2VuZF9iZWFjb25zKHByaXYtPnJ0bGxpYik7CiAJCQlkZWxfdGltZXJfc3luYygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKIAkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSk7CiAJCQlydGxsaWJfc3RvcF9zY2FuKGllZWUpOwogCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKLQkJCVNFTV9VUF9JRUVFX1dYKCZpZWVlLT53eF9zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJCX0gZWxzZSB7CiAJCQluZXRkZXZfaW5mbyhkZXYsICJpZWVlLT5zdGF0ZSBpcyBOT1QgTElOS0VEXG4iKTsKIAkJCXJ0bGxpYl9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wocHJpdi0+cnRsbGliLCAwLCB0cnVlKTsKQEAgLTEyOTIsNyArMTI5Miw3IEBACiAKIAkJcnRsOTJlX2RtX2JhY2t1cF9zdGF0ZShkZXYpOwogCi0JCXVwKCZwcml2LT53eF9zZW0pOworCQltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwKIAkJCSAiJXMoKTo8PT09PT09PT09PWRvd24gcHJvY2VzcyBpcyBmaW5pc2hlZFxuIiwKIAkJCSBfX2Z1bmNfXyk7CkBAIC0xOTgyLDcgKzE5ODIsNyBAQAogCQkJCQl3ZWlnaHRpbmcpIC8gNjsKIH0KIAotdTggcnRsOTJlX3J4X2RiX3RvX3BlcmNlbnQoY2hhciBhbnRwb3dlcikKK3U4IHJ0bDkyZV9yeF9kYl90b19wZXJjZW50KHM4IGFudHBvd2VyKQogewogCWlmICgoYW50cG93ZXIgPD0gLTEwMCkgfHwgKGFudHBvd2VyID49IDIwKSkKIAkJcmV0dXJuCTA7CkBAIC0xOTkzLDkgKzE5OTMsOSBAQAogCiB9CS8qIFF1ZXJ5UnhQd3JQZXJjZW50YWdlICovCiAKLXU4IHJ0bDkyZV9ldm1fZGJfdG9fcGVyY2VudChjaGFyIHZhbHVlKQordTggcnRsOTJlX2V2bV9kYl90b19wZXJjZW50KHM4IHZhbHVlKQogewotCWNoYXIgcmV0X3ZhbDsKKwlzOCByZXRfdmFsOwogCiAJcmV0X3ZhbCA9IHZhbHVlOwogCkBAIC0yMTc5LDkgKzIxNzksOSBAQAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAlpbnQgcmV0OwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJcmV0ID0gX3J0bDkyZV90cnlfdXAoZGV2KTsKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXR1cm4gcmV0OwogCiB9CkBAIC0yMjA2LDExICsyMjA2LDExIEBACiAJCXJ0bGxpYl9zdG9wX3NjYW4ocHJpdi0+cnRsbGliKTsKIAl9CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldCA9IF9ydGw5MmVfZG93bihkZXYsIHRydWUpOwogCi0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogCkBAIC0yMjQyLDExICsyMjQyLDExIEBACiAJCQkJICByZXNldF93cSk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPnJ0bGxpYi0+ZGV2OwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlydGw5MmVfY29tbWl0KGRldik7CiAKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIH0KIAogc3RhdGljIHZvaWQgX3J0bDkyZV9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0yMjY1LDEyICsyMjY1LDEyIEBACiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IG1hYzsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJZXRoZXJfYWRkcl9jb3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEpOwogCiAJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfd3EpOwotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMjg3LDcgKzIyODcsNyBAQAogCXN0cnVjdCBpd19wb2ludCAqcCA9ICZ3cnEtPnUuZGF0YTsKIAlzdHJ1Y3QgaWVlZV9wYXJhbSAqaXB3ID0gTlVMTDsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFJUTF9JT0NUTF9XUEFfU1VQUExJQ0FOVDoKQEAgLTIzOTMsNyArMjM5Myw3IEBACiAJfQogCiBvdXQ6Ci0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jb3JlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuaAppbmRleCBmNjI3ZmRjLi5iYWJjMGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuaApAQCAtMzc1LDggKzM3NSw4IEBACiAJc3RydWN0IHRhc2tsZXRfc3RydWN0CQlpcnFfdHhfdGFza2xldDsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJCWlycV9wcmVwYXJlX2JlYWNvbl90YXNrbGV0OwogCi0Jc3RydWN0IHNlbWFwaG9yZQkJCXd4X3NlbTsKLQlzdHJ1Y3Qgc2VtYXBob3JlCQkJcmZfc2VtOworCXN0cnVjdCBtdXRleAkJCQl3eF9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXgJCQkJcmZfbXV0ZXg7CiAJc3RydWN0IG11dGV4CQkJCW11dGV4OwogCiAJc3RydWN0IHJ0X3N0YXRzIHN0YXRzOwpAQCAtNTAzLDggKzUwMyw4IEBACiAJdTMyIFB3cl9UcmFjazsKIAl1OCBDQ0tQcmVzZW50QXR0ZW50dWF0aW9uXzIwTWRlZmF1bHQ7CiAJdTggQ0NLUHJlc2VudEF0dGVudHVhdGlvbl80ME1kZWZhdWx0OwotCWNoYXIgQ0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlOwotCWNoYXIgQ0NLUHJlc2VudEF0dGVudHVhdGlvbjsKKwlzOCBDQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2U7CisJczggQ0NLUHJlc2VudEF0dGVudHVhdGlvbjsKIAlsb25nIHVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGI7CiAKIAl1MzIgTUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbNl07CkBAIC02MDQsOCArNjA0LDggQEAKIGxvbmcgcnRsOTJlX3RyYW5zbGF0ZV90b19kYm0oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHU4IHNpZ25hbF9zdHJlbmd0aF9pbmRleCk7CiB2b2lkIHJ0bDkyZV91cGRhdGVfcnhfc3RhdGlzdGljcyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwKIAkJCQkgc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcHByZXZpb3VzX3N0YXRzKTsKLXU4IHJ0bDkyZV9ldm1fZGJfdG9fcGVyY2VudChjaGFyIHZhbHVlKTsKLXU4IHJ0bDkyZV9yeF9kYl90b19wZXJjZW50KGNoYXIgYW50cG93ZXIpOwordTggcnRsOTJlX2V2bV9kYl90b19wZXJjZW50KHM4IHZhbHVlKTsKK3U4IHJ0bDkyZV9yeF9kYl90b19wZXJjZW50KHM4IGFudHBvd2VyKTsKIHZvaWQgcnRsOTJlX2NvcHlfbXBkdV9zdGF0cyhzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpwc3JjX3N0YXRzLAogCQkJICAgIHN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnB0YXJnZXRfc3RhdHMpOwogYm9vbCBydGw5MmVfZW5hYmxlX25pYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfcHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfcHMuYwppbmRleCA5OGU0ZDg4Li5hYTRiMDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3BzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9wcy5jCkBAIC0xNzksOSArMTc5LDkgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OwogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopcnRsbGliX3ByaXYoZGV2KTsKIAotCWRvd24oJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+cnRsbGliLT5pcHNfbXV0ZXgpOwogCXJ0bDkyZV9pcHNfbGVhdmUoZGV2KTsKLQl1cCgmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnJ0bGxpYi0+aXBzX211dGV4KTsKIH0KIAogdm9pZCBydGw5MmVfcnRsbGliX2lwc19sZWF2ZV93cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMjA5LDkgKzIwOSw5IEBACiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilydGxsaWJfcHJpdihkZXYpOwogCi0JZG93bigmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT5ydGxsaWItPmlwc19tdXRleCk7CiAJcnRsOTJlX2lwc19sZWF2ZShkZXYpOwotCXVwKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+cnRsbGliLT5pcHNfbXV0ZXgpOwogfQogCiBzdGF0aWMgYm9vbCBfcnRsOTJlX3BzX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHJ0UHNNb2RlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF93eC5jCmluZGV4IDcwZGY2YTEuLjc0MTNhMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3d4LmMKQEAgLTY1LDExICs2NSwxMSBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldCA9IHJ0bGxpYl93eF9zZXRfcmF0ZShwcml2LT5ydGxsaWIsIGluZm8sIHdycXUsIGV4dHJhKTsKIAotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTg0LDExICs4NCwxMSBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldCA9IHJ0bGxpYl93eF9zZXRfcnRzKHByaXYtPnJ0bGxpYiwgaW5mbywgd3JxdSwgZXh0cmEpOwogCi0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTE0LDExICsxMTQsMTEgQEAKIAkJCSAgICBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldCA9IHJ0bGxpYl93eF9zZXRfcG93ZXIocHJpdi0+cnRsbGliLCBpbmZvLCB3cnF1LCBleHRyYSk7CiAKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNDIsMTEgKzE0MiwxMSBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldCA9IHJ0bGxpYl93eF9zZXRfcmF3dHgocHJpdi0+cnRsbGliLCBpbmZvLCB3cnF1LCBleHRyYSk7CiAKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiByZXQ7CiAKQEAgLTE1OCwxMiArMTU4LDEyIEBACiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlSVF9UUkFDRShDT01QX0RCRywgIiVzKCk6IGZvcmNlIHJlc2V0ICEgZXh0cmEgaXMgJWRcbiIsCiAJCSBfX2Z1bmNfXywgKmV4dHJhKTsKIAlwcml2LT5mb3JjZV9yZXNldCA9ICpleHRyYTsKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXR1cm4gMDsKIAogfQpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJCQkJCSgmKHByaXYtPnJ0bGxpYi0+UG93ZXJTYXZlQ29udHJvbCkpOwogCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gcHJpdi0+cnRsbGliOwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlSVF9UUkFDRShDT01QX1BPV0VSLCAiJXMoKTogJXNcbiIsIF9fZnVuY19fLCAoKmV4dHJhID09IDYpID8KIAkJICJEQyBwb3dlciIgOiAiQUMgcG93ZXIiKTsKQEAgLTE5Myw3ICsxOTMsNyBAQAogCQlpZWVlLT5wcyA9ICpleHRyYTsKIAl9CiAKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiAwOwogfQpAQCAtMjA3LDEzICsyMDcsMTMgQEAKIAlzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqcFBTQyA9IChzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqKQogCQkJCQkoJihwcml2LT5ydGxsaWItPlBvd2VyU2F2ZUNvbnRyb2wpKTsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJbmV0ZGV2X2luZm8oZGV2LCAiJXMoKTogc2V0IGxwcyBhd2FrZSBpbnRlcnZhbCAhIGV4dHJhIGlzICVkXG4iLAogCQkgICAgX19mdW5jX18sICpleHRyYSk7CiAKIAlwUFNDLT5SZWdNYXhMUFNBd2FrZUludHZsID0gKmV4dHJhOwotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldHVybiAwOwogfQogCkBAIC0yMjMsMTMgKzIyMywxMyBAQAogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJbmV0ZGV2X2luZm8oZGV2LAogCQkgICAgIiVzKCk6IGZvcmNlIExQUyAhIGV4dHJhIGlzICVkICgxIGlzIG9wZW4gMCBpcyBjbG9zZSlcbiIsCiAJCSAgICBfX2Z1bmNfXywgKmV4dHJhKTsKIAlwcml2LT5mb3JjZV9scHMgPSAqZXh0cmE7Ci0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJcmV0dXJuIDA7CiAKIH0KQEAgLTI2Niw3ICsyNjYsNyBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAJcnRTdGF0ZSA9IHByaXYtPnJ0bGxpYi0+ZVJGUG93ZXJTdGF0ZTsKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAlpZiAod3JxdS0+bW9kZSA9PSBJV19NT0RFX0FESE9DIHx8IHdycXUtPm1vZGUgPT0gSVdfTU9ERV9NT05JVE9SIHx8CiAJICAgIGllZWUtPmJOZXRQcm9taXNjdW91c01vZGUpIHsKIAkJaWYgKHByaXYtPnJ0bGxpYi0+UG93ZXJTYXZlQ29udHJvbC5iSW5hY3RpdmVQcykgewpAQCAtMjc1LDIxICsyNzUsMjEgQEAKIAkJCQkgICAgUkZfQ0hBTkdFX0JZX0lQUykgewogCQkJCQluZXRkZXZfd2FybihkZXYsICIlcygpOiBSRiBpcyBPRkYuXG4iLAogCQkJCQkJICAgIF9fZnVuY19fKTsKLQkJCQkJdXAoJnByaXYtPnd4X3NlbSk7CisJCQkJCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCQkJCQlyZXR1cm4gLTE7CiAJCQkJfQogCQkJCW5ldGRldl9pbmZvKGRldiwKIAkJCQkJICAgICI9PT09PT09PT0+JXMoKTogcnRsOTJlX2lwc19sZWF2ZVxuIiwKIAkJCQkJICAgIF9fZnVuY19fKTsKLQkJCQlkb3duKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCQkJCW11dGV4X2xvY2soJnByaXYtPnJ0bGxpYi0+aXBzX211dGV4KTsKIAkJCQlydGw5MmVfaXBzX2xlYXZlKGRldik7Ci0JCQkJdXAoJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5ydGxsaWItPmlwc19tdXRleCk7CiAJCQl9CiAJCX0KIAl9CiAJcmV0ID0gcnRsbGliX3d4X3NldF9tb2RlKHByaXYtPnJ0bGxpYiwgYSwgd3JxdSwgYik7CiAKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00MjUsNyArNDI1LDcgQEAKIAkJfQogCX0KIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcHJpdi0+cnRsbGliLT5GaXJzdEllX0luU2NhbiA9IHRydWU7CiAKQEAgLTQzNiwxNSArNDM2LDE1IEBACiAJCQkJICAgIFJGX0NIQU5HRV9CWV9JUFMpIHsKIAkJCQkJbmV0ZGV2X3dhcm4oZGV2LCAiJXMoKTogUkYgaXMgT0ZGLlxuIiwKIAkJCQkJCSAgICBfX2Z1bmNfXyk7Ci0JCQkJCXVwKCZwcml2LT53eF9zZW0pOworCQkJCQltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAkJCQkJcmV0dXJuIC0xOwogCQkJCX0KIAkJCQlSVF9UUkFDRShDT01QX1BTLAogCQkJCQkgIj09PT09PT09PT4lcygpOiBydGw5MmVfaXBzX2xlYXZlXG4iLAogCQkJCQkgX19mdW5jX18pOwotCQkJCWRvd24oJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJCQkJbXV0ZXhfbG9jaygmcHJpdi0+cnRsbGliLT5pcHNfbXV0ZXgpOwogCQkJCXJ0bDkyZV9pcHNfbGVhdmUoZGV2KTsKLQkJCQl1cCgmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwkJCQltdXRleF91bmxvY2soJnByaXYtPnJ0bGxpYi0+aXBzX211dGV4KTsKIAkJCX0KIAkJfQogCQlydGxsaWJfc3RvcF9zY2FuKHByaXYtPnJ0bGxpYik7CkBAIC00NzEsNyArNDcxLDcgQEAKIAkJcmV0ID0gcnRsbGliX3d4X3NldF9zY2FuKHByaXYtPnJ0bGxpYiwgYSwgd3JxdSwgYik7CiAJfQogCi0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDkxLDExICs0OTEsMTEgQEAKIAkJcmV0dXJuIDA7CiAKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0ID0gcnRsbGliX3d4X2dldF9zY2FuKHByaXYtPnJ0bGxpYiwgYSwgd3JxdSwgYik7CiAKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC01MTMsMTAgKzUxMywxMCBAQAogCQkJICAgIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldCA9IHJ0bGxpYl93eF9zZXRfZXNzaWQocHJpdi0+cnRsbGliLCBhLCB3cnF1LCBiKTsKIAotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTUyOCwxMSArNTI4LDExIEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldCA9IHJ0bGxpYl93eF9nZXRfZXNzaWQocHJpdi0+cnRsbGliLCBhLCB3cnF1LCBiKTsKIAotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTU0NSwxMiArNTQ1LDEyIEBACiAKIAlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkKIAkJcmV0dXJuIC1FMkJJRzsKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAl3cnF1LT5kYXRhLmxlbmd0aCA9IG1pbl90KHNpemVfdCwgd3JxdS0+ZGF0YS5sZW5ndGgsCiAJCQkJICBzaXplb2YocHJpdi0+bmljaykpOwogCW1lbXNldChwcml2LT5uaWNrLCAwLCBzaXplb2YocHJpdi0+bmljaykpOwogCW1lbWNweShwcml2LT5uaWNrLCBleHRyYSwgd3JxdS0+ZGF0YS5sZW5ndGgpOwotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldHVybiAwOwogCiB9CkBAIC01NjEsMTEgKzU2MSwxMSBAQAogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKHByaXYtPm5pY2spOwogCW1lbWNweShleHRyYSwgcHJpdi0+bmljaywgd3JxdS0+ZGF0YS5sZW5ndGgpOwogCXdycXUtPmRhdGEuZmxhZ3MgPSAxOyAgIC8qIGFjdGl2ZSAqLwotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldHVybiAwOwogfQogCkBAIC01NzksMTEgKzU3OSwxMSBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldCA9IHJ0bGxpYl93eF9zZXRfZnJlcShwcml2LT5ydGxsaWIsIGEsIHdycXUsIGIpOwogCi0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjQ0LDExICs2NDQsMTEgQEAKIAlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXQgPSBydGxsaWJfd3hfc2V0X3dhcChwcml2LT5ydGxsaWIsIGluZm8sIGF3cnEsIGV4dHJhKTsKIAotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIApAQCAtNjk4LDE0ICs2OTgsMTQgQEAKIAkJcmV0dXJuIC1FTkVURE9XTjsKIAogCXByaXYtPnJ0bGxpYi0+d3hfc2V0X2VuYyA9IDE7Ci0JZG93bigmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT5ydGxsaWItPmlwc19tdXRleCk7CiAJcnRsOTJlX2lwc19sZWF2ZShkZXYpOwotCXVwKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOwotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5ydGxsaWItPmlwc19tdXRleCk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJUlRfVFJBQ0UoQ09NUF9TRUMsICJTZXR0aW5nIFNXIHdlcCBrZXkiKTsKIAlyZXQgPSBydGxsaWJfd3hfc2V0X2VuY29kZShwcml2LT5ydGxsaWIsIGluZm8sIHdycXUsIGtleSk7Ci0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAogCWlmICh3cnF1LT5lbmNvZGluZy5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgewpAQCAtNzk5LDcgKzc5OSw3IEBACiAJaWYgKHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm4gMDsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTElGRVRJTUUgfHwKIAkgICAgd3JxdS0+cmV0cnkuZGlzYWJsZWQpIHsKQEAgLTgyMiw3ICs4MjIsNyBAQAogCiAJcnRsOTJlX2NvbW1pdChkZXYpOwogZXhpdDoKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC04NzUsNyArODc1LDcgQEAKIAlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJaWYgKHByaXYtPnJmX3NldF9zZW5zID09IE5VTEwpIHsKIAkJZXJyID0gLTE7IC8qIHdlIGhhdmUgbm90IHRoaXMgc3VwcG9ydCBmb3IgdGhpcyByYWRpbyAqLwogCQlnb3RvIGV4aXQ7CkBAIC04ODYsNyArODg2LDcgQEAKIAkJZXJyID0gLUVJTlZBTDsKIAogZXhpdDoKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC05MDIsMTIgKzkwMiwxMiBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXByaXYtPnJ0bGxpYi0+d3hfc2V0X2VuYyA9IDE7Ci0JZG93bigmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT5ydGxsaWItPmlwc19tdXRleCk7CiAJcnRsOTJlX2lwc19sZWF2ZShkZXYpOwotCXVwKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+cnRsbGliLT5pcHNfbXV0ZXgpOwogCiAJcmV0ID0gcnRsbGliX3d4X3NldF9lbmNvZGVfZXh0KGllZWUsIGluZm8sIHdycXUsIGV4dHJhKTsKIAl7CkBAIC05NjksNyArOTY5LDcgQEAKIAogZW5kX2h3X3NlYzoKIAlwcml2LT5ydGxsaWItPnd4X3NldF9lbmMgPSAwOwotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldHVybiByZXQ7CiAKIH0KQEAgLTk4NSw5ICs5ODUsOSBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXQgPSBydGxsaWJfd3hfc2V0X2F1dGgocHJpdi0+cnRsbGliLCBpbmZvLCAmKGRhdGEtPnBhcmFtKSwgZXh0cmEpOwotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwMDMsOSArMTAwMyw5IEBACiAJaWYgKHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm4gMDsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldCA9IHJ0bGxpYl93eF9zZXRfbWxtZShwcml2LT5ydGxsaWIsIGluZm8sIHdycXUsIGV4dHJhKTsKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMDIwLDkgKzEwMjAsOSBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXQgPSBydGxsaWJfd3hfc2V0X2dlbl9pZShwcml2LT5ydGxsaWIsIGV4dHJhLCBkYXRhLT5kYXRhLmxlbmd0aCk7Ci0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTA5NywxNCArMTA5NywxNCBAQAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IHByaXYtPnJ0bGxpYjsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJc25wcmludGYoZXh0cmEsIDQ1LCAiUHJvbWlzY3VvdXNNb2RlOiVkLCBGaWx0ZXJTcmNTVEFGcmFtZTolZCIsCiAJCSBpZWVlLT5JbnRlbFByb21pc2N1b3VzTW9kZUluZm8uYlByb21pc2N1b3VzT24sCiAJCSBpZWVlLT5JbnRlbFByb21pc2N1b3VzTW9kZUluZm8uYkZpbHRlclNvdXJjZVN0YXRpb25GcmFtZSk7CiAJd3JxdS0+ZGF0YS5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsKIAotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9Rb3MuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X1Fvcy5oCmluZGV4IDQ2MzEyMmQuLjYxZGE4ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X1Fvcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X1Fvcy5oCkBAIC0xNjksOSArMTY5LDYgQEAKIAl9IFRZUEUyXzgwMjFROwogfTsKIAotI2RlZmluZSBJc0FDVmFsaWQoYWMpCQkoKGFjID49IDAgJiYgYWMgPD0gNykgPyB0cnVlIDogZmFsc2UpCi0KLQogdW5pb24gYWNpX2FpZnNuIHsKIAl1OAljaGFyRGF0YTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfVFNQcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9UU1Byb2MuYwppbmRleCAyYzhhNTI2Li5hOTY2YThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9UU1Byb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9UU1Byb2MuYwpAQCAtMzA2LDYgKzMwNiwxMSBAQAogCXBUc0NvbW1vbkluZm8tPlRDbGFzTnVtID0gVENMQVNfTnVtOwogfQogCitzdGF0aWMgYm9vbCBJc0FDVmFsaWQodW5zaWduZWQgaW50IHRpZCkKK3sKKwlyZXR1cm4gdGlkIDwgNzsKK30KKwogYm9vbCBHZXRUcyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHRzX2NvbW1vbl9pbmZvICoqcHBUUywKIAkgICB1OCAqQWRkciwgdTggVElELCBlbnVtIHRyX3NlbGVjdCBUeFJ4U2VsZWN0LCBib29sIGJBZGROZXdUcykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWIuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWIuaAppbmRleCA3NzZlMTc5Li5iODk1YTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYi5oCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgpAQCAtNTIxLDcgKzUyMSw3IEBACiB9OwogCiAjaWZuZGVmIEVUSF9QX1BBRQotI2RlZmluZSBFVEhfUF9QQUUgMHg4ODhFIC8qIFBvcnQgQWNjZXNzIEVudGl0eSAoSUVFRSA4MDIuMVgpICovCisjZGVmaW5lIEVUSF9QX1BBRQkweDg4OEUJCS8qIFBvcnQgQWNjZXNzIEVudGl0eSAoSUVFRSA4MDIuMVgpICovCiAjZGVmaW5lIEVUSF9QX0lQCTB4MDgwMAkJLyogSW50ZXJuZXQgUHJvdG9jb2wgcGFja2V0CSovCiAjZGVmaW5lIEVUSF9QX0FSUAkweDA4MDYJCS8qIEFkZHJlc3MgUmVzb2x1dGlvbiBwYWNrZXQJKi8KICNlbmRpZiAvKiBFVEhfUF9QQUUgKi8KQEAgLTE2NTEsOSArMTY1MSw5IEBACiAJc2hvcnQgcHJvdG9fc3RhcnRlZDsKIAlzaG9ydCBwcm90b19zdG9wcHBpbmc7CiAKLQlzdHJ1Y3Qgc2VtYXBob3JlIHd4X3NlbTsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHNjYW5fc2VtOwotCXN0cnVjdCBzZW1hcGhvcmUgaXBzX3NlbTsKKwlzdHJ1Y3QgbXV0ZXggd3hfbXV0ZXg7CisJc3RydWN0IG11dGV4IHNjYW5fbXV0ZXg7CisJc3RydWN0IG11dGV4IGlwc19tdXRleDsKIAogCXNwaW5sb2NrX3QgbWdtdF90eF9sb2NrOwogCXNwaW5sb2NrX3QgYmVhY29uX2xvY2s7CkBAIC0yMjEyLDcgKzIyMTIsNSBAQAogdm9pZCBIVFVzZURlZmF1bHRTZXR0aW5nKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKICNkZWZpbmUgUlRfQVNPQ19SRVRSWV9MSU1JVAk1CiB1OCBNZ250UXVlcnlfVHhSYXRlRXhjbHVkZUNDS1JhdGVzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKLSNkZWZpbmUgU0VNX0RPV05fSUVFRV9XWChwc2VtKSBkb3duKHBzZW0pCi0jZGVmaW5lIFNFTV9VUF9JRUVFX1dYKHBzZW0pIHVwKHBzZW0pCiAKICNlbmRpZiAvKiBSVExMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9tb2R1bGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfbW9kdWxlLmMKaW5kZXggZjRmMzE4YS4uOWQ1Nzg4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9tb2R1bGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX21vZHVsZS5jCkBAIC0xMzgsNyArMTM4LDcgQEAKIAlydGxsaWJfc29mdG1hY19pbml0KGllZWUpOwogCiAJaWVlZS0+cEhUSW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9oaV90aHJvdWdocHV0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGllZWUtPnBIVEluZm8gPT0gTlVMTCkKKwlpZiAoIWllZWUtPnBIVEluZm8pCiAJCXJldHVybiBOVUxMOwogCiAJSFRVcGRhdGVEZWZhdWx0U2V0dGluZyhpZWVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfc29mdG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9zb2Z0bWFjLmMKaW5kZXggNjIxNTRlMy4uZGE3NGRjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9zb2Z0bWFjLmMKQEAgLTI3Niw4ICsyNzYsOSBAQAogCX0KIH0KIAotaW5saW5lIHZvaWQgc29mdG1hY19wc19tZ210X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCitzdGF0aWMgaW5saW5lIHZvaWQKK3NvZnRtYWNfcHNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCiB7CiAJc2hvcnQgc2luZ2xlID0gaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUU7CiAJc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgICpoZWFkZXIgPQpAQCAtNTEzLDcgKzUxNCw3IEBACiAKIAlpZWVlLT5iZV9zY2FuX2lucHJvZ3Jlc3MgPSB0cnVlOwogCi0JZG93bigmaWVlZS0+c2Nhbl9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnNjYW5fbXV0ZXgpOwogCiAJd2hpbGUgKDEpIHsKIAkJZG8gewpAQCAtNTY2LDcgKzU2Nyw3IEBACiAJCWlmIChJU19ET1QxMURfRU5BQkxFKGllZWUpKQogCQkJRE9UMTFEX1NjYW5Db21wbGV0ZShpZWVlKTsKIAl9Ci0JdXAoJmllZWUtPnNjYW5fc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnNjYW5fbXV0ZXgpOwogCiAJaWVlZS0+YmVfc2Nhbl9pbnByb2dyZXNzID0gZmFsc2U7CiAKQEAgLTU4Nyw3ICs1ODgsNyBAQAogCWlmIChydGxsaWJfYWN0X3NjYW5uaW5nKGllZWUsIHRydWUpKQogCQlyZXR1cm47CiAKLQlkb3duKCZpZWVlLT5zY2FuX3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+c2Nhbl9tdXRleCk7CiAKIAlpZiAoaWVlZS0+ZVJGUG93ZXJTdGF0ZSA9PSBlUmZPZmYpIHsKIAkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LApAQCAtNjE4LDcgKzYxOSw3IEBACiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsCiAJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKFJUTExJQl9TT0ZUTUFDX1NDQU5fVElNRSkpOwogCi0JdXAoJmllZWUtPnNjYW5fc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnNjYW5fbXV0ZXgpOwogCXJldHVybjsKIAogb3V0OgpAQCAtNjMwLDcgKzYzMSw3IEBACiAJaWVlZS0+YWN0c2Nhbm5pbmcgPSBmYWxzZTsKIAlpZWVlLT5zY2FuX3dhdGNoX2RvZyA9IDA7CiAJaWVlZS0+c2Nhbm5pbmdfY29udGludWUgPSAwOwotCXVwKCZpZWVlLT5zY2FuX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT5zY2FuX211dGV4KTsKIH0KIAogCkBAIC02ODMsNyArNjg0LDcgQEAKIAogc3RhdGljIHZvaWQgcnRsbGliX3NvZnRtYWNfc3RvcF9zY2FuKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQogewotCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT5zY2FuX211dGV4KTsKIAlpZWVlLT5zY2FuX3dhdGNoX2RvZyA9IDA7CiAJaWYgKGllZWUtPnNjYW5uaW5nX2NvbnRpbnVlID09IDEpIHsKIAkJaWVlZS0+c2Nhbm5pbmdfY29udGludWUgPSAwOwpAQCAtNjkyLDcgKzY5Myw3IEBACiAJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaWVlZS0+c29mdG1hY19zY2FuX3dxKTsKIAl9CiAKLQl1cCgmaWVlZS0+c2Nhbl9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+c2Nhbl9tdXRleCk7CiB9CiAKIHZvaWQgcnRsbGliX3N0b3Bfc2NhbihzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKQEAgLTc1Myw3ICs3NTQsNyBAQAogCX0KIH0KIAotLyogY2FsbGVkIHdpdGggd3hfc2VtIGhlbGQgKi8KKy8qIGNhbGxlZCB3aXRoIHd4X211dGV4IGhlbGQgKi8KIHZvaWQgcnRsbGliX3N0YXJ0X3NjYW5fc3luY3JvKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCBpc19tZXNoKQogewogCWlmIChJU19ET1QxMURfRU5BQkxFKGllZWUpKSB7CkBAIC03NzAsOCArNzcxLDEwIEBACiB9CiBFWFBPUlRfU1lNQk9MKHJ0bGxpYl9zdGFydF9zY2FuX3N5bmNybyk7CiAKLWlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqcnRsbGliX2F1dGhlbnRpY2F0aW9uX3JlcShzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKmJlYWNvbiwKLQlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgaW50IGNoYWxsZW5nZWxlbiwgdTggKmRhZGRyKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqCitydGxsaWJfYXV0aGVudGljYXRpb25fcmVxKHN0cnVjdCBydGxsaWJfbmV0d29yayAqYmVhY29uLAorCQkJICBzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCSAgaW50IGNoYWxsZW5nZWxlbiwgdTggKmRhZGRyKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHJ0bGxpYl9hdXRoZW50aWNhdGlvbiAqYXV0aDsKQEAgLTExMzAsNyArMTEzMyw3IEBACiB9CiAKIAotaW5saW5lIGludCBTZWNJc0luUE1LSURMaXN0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqYnNzaWQpCitzdGF0aWMgaW5saW5lIGludCBTZWNJc0luUE1LSURMaXN0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqYnNzaWQpCiB7CiAJaW50IGkgPSAwOwogCkBAIC0xMTQ2LDggKzExNDksOSBAQAogCXJldHVybiBpOwogfQogCi1pbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnJ0bGxpYl9hc3NvY2lhdGlvbl9yZXEoc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpiZWFjb24sCi0JCQkJCSAgICAgIHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqCitydGxsaWJfYXNzb2NpYXRpb25fcmVxKHN0cnVjdCBydGxsaWJfbmV0d29yayAqYmVhY29uLAorCQkgICAgICAgc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgcnRsbGliX2Fzc29jX3JlcXVlc3RfZnJhbWUgKmhkcjsKQEAgLTE1OTAsNyArMTU5NCw3IEBACiAJcnRsbGliX3N0b3Bfc2Nhbl9zeW5jcm8oaWVlZSk7CiAJaWYgKGllZWUtPnJ0bGxpYl9pcHNfbGVhdmUgIT0gTlVMTCkKIAkJaWVlZS0+cnRsbGliX2lwc19sZWF2ZShpZWVlLT5kZXYpOwotCWRvd24oJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCiAJaWYgKGllZWUtPmRhdGFfaGFyZF9zdG9wKQogCQlpZWVlLT5kYXRhX2hhcmRfc3RvcChpZWVlLT5kZXYpOwpAQCAtMTYwNSwxNCArMTYwOSwxNCBAQAogCQkJIF9fZnVuY19fKTsKIAkJaWYgKGllZWUtPnJ0bGxpYl9pcHNfbGVhdmVfd3EgIT0gTlVMTCkKIAkJCWllZWUtPnJ0bGxpYl9pcHNfbGVhdmVfd3EoaWVlZS0+ZGV2KTsKLQkJdXAoJmllZWUtPnd4X3NlbSk7CisJCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCQlyZXR1cm47CiAJfQogCWllZWUtPmFzc29jaWF0ZV9zZXEgPSAxOwogCiAJcnRsbGliX2Fzc29jaWF0ZV9zdGVwMShpZWVlLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQpOwogCi0JdXAoJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiB9CiAKIGlubGluZSB2b2lkIHJ0bGxpYl9zb2Z0bWFjX25ld19uZXQoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCkBAIC0yMjA5LDggKzIyMTMsOSBAQAogCX0KIH0KIAotaW5saW5lIGludCBydGxsaWJfcnhfYXNzb2NfcmVzcChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQlzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpyeF9zdGF0cykKK3N0YXRpYyBpbmxpbmUgaW50CitydGxsaWJfcnhfYXNzb2NfcmVzcChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpyeF9zdGF0cykKIHsKIAl1MTYgZXJyY29kZTsKIAlpbnQgYWlkOwpAQCAtMjM0NCw4ICsyMzQ5LDkgQEAKIAl9CiB9CiAKLWlubGluZSBpbnQgcnRsbGliX3J4X2F1dGgoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgIHN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnJ4X3N0YXRzKQorc3RhdGljIGlubGluZSBpbnQKK3J0bGxpYl9yeF9hdXRoKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgICAgICBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpyeF9zdGF0cykKIHsKIAogCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkgewpAQCAtMjM2MSw3ICsyMzY3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW5saW5lIGludCBydGxsaWJfcnhfZGVhdXRoKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGlubGluZSBpbnQKK3J0bGxpYl9yeF9kZWF1dGgoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgKmhlYWRlciA9IChzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciAqKSBza2ItPmRhdGE7CiAJdTE2IGZyYW1lX2N0bDsKQEAgLTI1ODIsMTYgKzI1ODksMTYgQEAKIAkJCQkgICAgIHN0cnVjdCBydGxsaWJfZGV2aWNlLCBzdGFydF9pYnNzX3dxKTsKIAkvKiBpd2NvbmZpZyBtb2RlIGFkLWhvYyB3aWxsIHNjaGVkdWxlIHRoaXMgYW5kIHJldHVybgogCSAqIG9uIHRoZSBvdGhlciBoYW5kIHRoaXMgd2lsbCBibG9jayBmdXJ0aGVyIGl3Y29uZmlnIFNFVAotCSAqIG9wZXJhdGlvbnMgYmVjYXVzZSBvZiB0aGUgd3hfc2VtIGhvbGQuCisJICogb3BlcmF0aW9ucyBiZWNhdXNlIG9mIHRoZSB3eF9tdXRleCBob2xkLgogCSAqIEFueXdheSBzb21lIG1vc3Qgc2V0IG9wZXJhdGlvbnMgc2V0IGEgZmxhZyB0byBzcGVlZC11cAogCSAqIChhYm9ydCkgdGhpcyB3cSAod2hlbiBzeW5jcm8gc2Nhbm5pbmcpIGJlZm9yZSBzbGVlcGluZwotCSAqIG9uIHRoZSBzZW1hcGhvcmUKKwkgKiBvbiB0aGUgbXV0ZXgKIAkgKi8KIAlpZiAoIWllZWUtPnByb3RvX3N0YXJ0ZWQpIHsKIAkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiPT09PT09PT09PW9oIGRyaXZlciBkb3duIHJldHVyblxuIik7CiAJCXJldHVybjsKIAl9Ci0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAKIAlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApIHsKIAkJc3RyY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBSVExMSUJfREVGQVVMVF9UWF9FU1NJRCk7CkBAIC0yNzAzLDcgKzI3MTAsNyBAQAogCiAJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOwogCi0JdXAoJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiB9CiAKIGlubGluZSB2b2lkIHJ0bGxpYl9zdGFydF9pYnNzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQpAQCAtMjcxMSw3ICsyNzE4LDcgQEAKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmllZWUtPnN0YXJ0X2lic3Nfd3EsIG1zZWNzX3RvX2ppZmZpZXMoMTUwKSk7CiB9CiAKLS8qIHRoaXMgaXMgY2FsbGVkIG9ubHkgaW4gdXNlciBjb250ZXh0LCB3aXRoIHd4X3NlbSBoZWxkICovCisvKiB0aGlzIGlzIGNhbGxlZCBvbmx5IGluIHVzZXIgY29udGV4dCwgd2l0aCB3eF9tdXRleCBoZWxkICovCiBzdGF0aWMgdm9pZCBydGxsaWJfc3RhcnRfYnNzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yNzczLDcgKzI3ODAsNyBAQAogCQkJCSAgICAgc3RydWN0IHJ0bGxpYl9kZXZpY2UsIGFzc29jaWF0ZV9yZXRyeV93cSk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRvd24oJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCWlmICghaWVlZS0+cHJvdG9fc3RhcnRlZCkKIAkJZ290byBleGl0OwogCkBAIC0yODA2LDcgKzI4MTMsNyBAQAogCiAJaWVlZS0+YmVpbnJldHJ5ID0gZmFsc2U7CiBleGl0OgotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogfQogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnJ0bGxpYl9nZXRfYmVhY29uXyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKQEAgLTI4NTMsOSArMjg2MCw5IEBACiAJCQkJICB1OCBzaHV0ZG93bikKIHsKIAlydGxsaWJfc3RvcF9zY2FuX3N5bmNybyhpZWVlKTsKLQlkb3duKCZpZWVlLT53eF9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAlydGxsaWJfc3RvcF9wcm90b2NvbChpZWVlLCBzaHV0ZG93bik7Ci0JdXAoJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MKHJ0bGxpYl9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wpOwogCkBAIC0yOTAyLDkgKzI5MDksOSBAQAogCiB2b2lkIHJ0bGxpYl9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCBtZXNoX2ZsYWcpCiB7Ci0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJcnRsbGliX3N0YXJ0X3Byb3RvY29sKGllZWUpOwotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTChydGxsaWJfc29mdG1hY19zdGFydF9wcm90b2NvbCk7CiAKQEAgLTMwMzQsOSArMzA0MSw5IEBACiAJSU5JVF9XT1JLX1JTTCgmaWVlZS0+d3hfc3luY19zY2FuX3dxLCAodm9pZCAqKXJ0bGxpYl93eF9zeW5jX3NjYW5fd3EsCiAJCSAgICAgIGllZWUpOwogCi0Jc2VtYV9pbml0KCZpZWVlLT53eF9zZW0sIDEpOwotCXNlbWFfaW5pdCgmaWVlZS0+c2Nhbl9zZW0sIDEpOwotCXNlbWFfaW5pdCgmaWVlZS0+aXBzX3NlbSwgMSk7CisJbXV0ZXhfaW5pdCgmaWVlZS0+d3hfbXV0ZXgpOworCW11dGV4X2luaXQoJmllZWUtPnNjYW5fbXV0ZXgpOworCW11dGV4X2luaXQoJmllZWUtPmlwc19tdXRleCk7CiAKIAlzcGluX2xvY2tfaW5pdCgmaWVlZS0+bWdtdF90eF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmaWVlZS0+YmVhY29uX2xvY2spOwpAQCAtMzA0OSw3ICszMDU2LDcgQEAKIAogdm9pZCBydGxsaWJfc29mdG1hY19mcmVlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQogewotCWRvd24oJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCWtmcmVlKGllZWUtPnBEb3QxMWRJbmZvKTsKIAlpZWVlLT5wRG90MTFkSW5mbyA9IE5VTEw7CiAJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CkBAIC0zMDY0LDcgKzMwNzEsNyBAQAogCWNhbmNlbF93b3JrX3N5bmMoJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSk7CiAJY2FuY2VsX3dvcmtfc3luYygmaWVlZS0+aXBzX2xlYXZlX3dxKTsKIAljYW5jZWxfd29ya19zeW5jKCZpZWVlLT53eF9zeW5jX3NjYW5fd3EpOwotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCXRhc2tsZXRfa2lsbCgmaWVlZS0+cHNfdGFzayk7CiB9CiAKQEAgLTMzOTcsOCArMzQwNCw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW5saW5lIHN0cnVjdCBza19idWZmICpydGxsaWJfZGlzYXV0aF9za2Ioc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpiZWFjb24sCi0JCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1MTYgYXNSc24pCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICoKK3J0bGxpYl9kaXNhdXRoX3NrYihzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKmJlYWNvbiwKKwkJICAgc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHUxNiBhc1JzbikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBydGxsaWJfZGlzYXV0aCAqZGlzYXV0aDsKQEAgLTM0MjMsOCArMzQzMSw5IEBACiAJcmV0dXJuIHNrYjsKIH0KIAotaW5saW5lIHN0cnVjdCBza19idWZmICpydGxsaWJfZGlzYXNzb2NpYXRlX3NrYihzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKmJlYWNvbiwKLQkJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHUxNiBhc1JzbikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgorcnRsbGliX2Rpc2Fzc29jaWF0ZV9za2Ioc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpiZWFjb24sCisJCQlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTE2IGFzUnNuKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHJ0bGxpYl9kaXNhc3NvYyAqZGlzYXNzOwpAQCAtMzQ5OSw3ICszNTA4LDcgQEAKIAlzdHJ1Y3QgaWVlZV9wYXJhbSAqcGFyYW07CiAJaW50IHJldCA9IDA7CiAKLQlkb3duKCZpZWVlLT53eF9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAogCWlmIChwLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGllZWVfcGFyYW0pIHx8ICFwLT5wb2ludGVyKSB7CiAJCXJldCA9IC1FSU5WQUw7CkBAIC0zNTQzLDcgKzM1NTIsNyBAQAogCiAJa2ZyZWUocGFyYW0pOwogb3V0OgotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfc29mdG1hY193eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9zb2Z0bWFjX3d4LmMKaW5kZXggNjFlZDhiMC4uNWYxNDEyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9zb2Z0bWFjX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9zb2Z0bWFjX3d4LmMKQEAgLTM1LDcgKzM1LDcgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBpd19mcmVxICpmd3JxID0gJndycXUtPmZyZXE7CiAKLQlkb3duKCZpZWVlLT53eF9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAogCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKIAkJcmV0ID0gMDsKQEAgLTgxLDcgKzgxLDcgQEAKIAogCXJldCA9IDA7CiBvdXQ6Ci0JdXAoJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wocnRsbGliX3d4X3NldF9mcmVxKTsKQEAgLTE0Niw3ICsxNDYsNyBAQAogCiAJcnRsbGliX3N0b3Bfc2Nhbl9zeW5jcm8oaWVlZSk7CiAKLQlkb3duKCZpZWVlLT53eF9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAkvKiB1c2UgaWZjb25maWcgaHcgZXRoZXIgKi8KIAlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgewogCQlyZXQgPSAtMTsKQEAgLTE4NSw3ICsxODUsNyBAQAogCWlmIChpZnVwKQogCQlydGxsaWJfc3RhcnRfcHJvdG9jb2woaWVlZSk7CiBvdXQ6Ci0JdXAoJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wocnRsbGliX3d4X3NldF93YXApOwpAQCAtMjg3LDcgKzI4Nyw3IEBACiAJaW50IHNldF9tb2RlX3N0YXR1cyA9IDA7CiAKIAlydGxsaWJfc3RvcF9zY2FuX3N5bmNybyhpZWVlKTsKLQlkb3duKCZpZWVlLT53eF9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAlzd2l0Y2ggKHdycXUtPm1vZGUpIHsKIAljYXNlIElXX01PREVfTU9OSVRPUjoKIAljYXNlIElXX01PREVfQURIT0M6CkBAIC0zMjIsNyArMzIyLDcgQEAKIAl9CiAKIG91dDoKLQl1cCgmaWVlZS0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIAlyZXR1cm4gc2V0X21vZGVfc3RhdHVzOwogfQogRVhQT1JUX1NZTUJPTChydGxsaWJfd3hfc2V0X21vZGUpOwpAQCAtNDEyLDcgKzQxMiw3IEBACiAJcnRsbGliX3dha2VfYWxsX3F1ZXVlcyhpZWVlKTsKIAogb3V0OgotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCiB9CiAKQEAgLTQyMSw3ICs0MjEsNyBAQAogewogCWludCByZXQgPSAwOwogCi0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAKIAlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IgfHwgIShpZWVlLT5wcm90b19zdGFydGVkKSkgewogCQlyZXQgPSAtMTsKQEAgLTQzNSw3ICs0MzUsNyBAQAogCX0KIAogb3V0OgotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKHJ0bGxpYl93eF9zZXRfc2Nhbik7CkBAIC00NTAsNyArNDUwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcnRsbGliX3N0b3Bfc2Nhbl9zeW5jcm8oaWVlZSk7Ci0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAKIAlwcm90b19zdGFydGVkID0gaWVlZS0+cHJvdG9fc3RhcnRlZDsKIApAQCAtNDkyLDcgKzQ5Miw3IEBACiAJaWYgKHByb3RvX3N0YXJ0ZWQpCiAJCXJ0bGxpYl9zdGFydF9wcm90b2NvbChpZWVlKTsKIG91dDoKLQl1cCgmaWVlZS0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChydGxsaWJfd3hfc2V0X2Vzc2lkKTsKQEAgLTUxNCw3ICs1MTQsNyBAQAogCWludCBlbmFibGUgPSAocGFybXNbMF0gPiAwKTsKIAlzaG9ydCBwcmV2ID0gaWVlZS0+cmF3X3R4OwogCi0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAKIAlpZiAoZW5hYmxlKQogCQlpZWVlLT5yYXdfdHggPSAxOwpAQCAtNTM2LDcgKzUzNiw3IEBACiAJCQluZXRpZl9jYXJyaWVyX29mZihpZWVlLT5kZXYpOwogCX0KIAotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NzUsNyArNTc1LDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCWRvd24oJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCiAJaWYgKHdycXUtPnBvd2VyLmRpc2FibGVkKSB7CiAJCVJUX1RSQUNFKENPTVBfREJHLCAiPT09PiVzKCk6IHBvd2VyIGRpc2FibGVcbiIsIF9fZnVuY19fKTsKQEAgLTYxMSw3ICs2MTEsNyBAQAogCiAJfQogZXhpdDoKLQl1cCgmaWVlZS0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIAlyZXR1cm4gcmV0OwogCiB9CkBAIC02MjIsNyArNjIyLDcgQEAKIAkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAKIAlpZiAoaWVlZS0+cHMgPT0gUlRMTElCX1BTX0RJU0FCTEVEKSB7CiAJCXdycXUtPnBvd2VyLmRpc2FibGVkID0gMTsKQEAgLTY0OCw3ICs2NDgsNyBAQAogCQl3cnF1LT5wb3dlci5mbGFncyB8PSBJV19QT1dFUl9VTklDQVNUX1I7CiAKIGV4aXQ6Ci0JdXAoJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJcmV0dXJuIDA7CiAKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfdHguYwppbmRleCA1OGZjNzBlLi43OGEzYWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl90eC5jCkBAIC0xLDMxICsxLDMxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICBtb3JlIGRldGFpbHMuCi0KLSAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0KLSAgQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAgSmFtZXMgUC4gS2V0cmVub3MgPGlwdzIxMDAtYWRtaW5AbGludXguaW50ZWwuY29tPgotICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gIEZldyBtb2RpZmljYXRpb25zIGZvciBSZWFsdGVrJ3MgV2ktRmkgZHJpdmVycyBieQotICBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhLm1lcmVsbG9AZ21haWwuY29tPgotCi0gIEEgc3BlY2lhbCB0aGFua3MgZ29lcyB0byBSZWFsdGVrIGZvciB0aGVpciBzdXBwb3J0ICEKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoKKyAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBKYW1lcyBQLiBLZXRyZW5vcyA8aXB3MjEwMC1hZG1pbkBsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmV3IG1vZGlmaWNhdGlvbnMgZm9yIFJlYWx0ZWsncyBXaS1GaSBkcml2ZXJzIGJ5CisgKiBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhLm1lcmVsbG9AZ21haWwuY29tPgorICoKKyAqIEEgc3BlY2lhbCB0aGFua3MgZ29lcyB0byBSZWFsdGVrIGZvciB0aGVpciBzdXBwb3J0ICEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC03MzEsMTcgKzczMSwxOSBAQAogCQlpZiAocW9zX2FjdGl2ZWQpIHsKIAkJCWhkcl9sZW4gPSBSVExMSUJfM0FERFJfTEVOICsgMjsKIAotCQkvKiBpbiBjYXNlIHdlIGFyZSBhIGNsaWVudCB2ZXJpZnkgYWNtIGlzIG5vdCBzZXQgZm9yIHRoaXMgYWMgKi8KLQkJd2hpbGUgKHVubGlrZWx5KGllZWUtPndtbV9hY20gJiAoMHgwMSA8PCBza2ItPnByaW9yaXR5KSkpIHsKLQkJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgInNrYi0+cHJpb3JpdHkgPSAleFxuIiwKLQkJCQkgICAgc2tiLT5wcmlvcml0eSk7Ci0JCQlpZiAod21lX2Rvd25ncmFkZV9hYyhza2IpKQotCQkJCWJyZWFrOwotCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiY29udmVydGVkIHNrYi0+cHJpb3JpdHkgPSAleFxuIiwKLQkJCSAgICAgICBza2ItPnByaW9yaXR5KTsKLQkJIH0KKwkJCS8qIGluIGNhc2Ugd2UgYXJlIGEgY2xpZW50IHZlcmlmeSBhY20gaXMgbm90IHNldCBmb3IgdGhpcyBhYyAqLworCQkJd2hpbGUgKHVubGlrZWx5KGllZWUtPndtbV9hY20gJiAoMHgwMSA8PCBza2ItPnByaW9yaXR5KSkpIHsKKwkJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJza2ItPnByaW9yaXR5ID0gJXhcbiIsCisJCQkJCQlza2ItPnByaW9yaXR5KTsKKwkJCQlpZiAod21lX2Rvd25ncmFkZV9hYyhza2IpKQorCQkJCQlicmVhazsKKwkJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJjb252ZXJ0ZWQgc2tiLT5wcmlvcml0eSA9ICV4XG4iLAorCQkJCQkgICBza2ItPnByaW9yaXR5KTsKKwkJCX0KKwogCQkJcW9zX2N0bCB8PSBza2ItPnByaW9yaXR5OwogCQkJaGVhZGVyLnFvc19jdGwgPSBjcHVfdG9fbGUxNihxb3NfY3RsICYgUlRMTElCX1FPU19USUQpOworCiAJCX0gZWxzZSB7CiAJCQloZHJfbGVuID0gUlRMTElCXzNBRERSX0xFTjsKIAkJfQpAQCAtOTgxLDYgKzk4Myw3IEBACiAJcmV0dXJuIDE7CiAKIH0KKwogaW50IHJ0bGxpYl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJbWVtc2V0KHNrYi0+Y2IsIDAsIHNpemVvZihza2ItPmNiKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3d4LmMKaW5kZXggODRlNjI3Mi4uYjE1MDBlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfd3guYwpAQCAtMjYzLDcgKzI2Myw3IEBACiAJaW50IGVyciA9IDA7CiAKIAluZXRkZXZfZGJnKGllZWUtPmRldiwgIkdldHRpbmcgc2NhblxuIik7Ci0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobmV0d29yaywgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgewpAQCAtMjg3LDcgKzI4Nyw3IEBACiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCXdycXUtPmRhdGEubGVuZ3RoID0gZXYgLSAgZXh0cmE7CiAJd3JxdS0+ZGF0YS5mbGFncyA9IDA7CiAKQEAgLTY4OSw3ICs2ODksNyBAQAogCWlmIChpZWVlLT5zdGF0ZSAhPSBSVExMSUJfTElOS0VEKQogCQlyZXR1cm4gLUVOT0xJTks7CiAKLQlkb3duKCZpZWVlLT53eF9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAogCXN3aXRjaCAobWxtZS0+Y21kKSB7CiAJY2FzZSBJV19NTE1FX0RFQVVUSDoKQEAgLTcxNiwxMSArNzE2LDExIEBACiAJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IDA7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXVwKCZpZWVlLT53eF9zZW0pOworCQltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9NYWtlZmlsZQppbmRleCBiNWQwYzJlLi45ZTNmNDMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvTWFrZWZpbGUKQEAgLTEsNyArMSw2IEBACiBOSUNfU0VMRUNUID0gUlRMODE5MlUKIAotY2NmbGFncy15IDo9IC1JJChUT1BESVIpL2RyaXZlcnMvbmV0L3dpcmVsZXNzCi1jY2ZsYWdzLXkgKz0gLU8yCitjY2ZsYWdzLXkgOj0gLU8yCiBjY2ZsYWdzLXkgKz0gLURKQUNLU09OX05FV184MTg3IC1ESkFDS1NPTl9ORVdfUlgKIAogaWVlZTgwMjExLXJzbC1vYmpzIDo9IGllZWU4MDIxMV9yeC5vIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oCmluZGV4IDA5ZTk0OTkuLjA3N2VhMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaApAQCAtNzQ2LDcgKzc0Niw3IEBACiAJYm9vbAkJICBiaXNyeGFnZ3JzdWJmcmFtZTsKIAlib29sCQkgIGJQYWNrZXRCZWFjb247CS8vY29zYSBhZGQgZm9yIHJzc2kKIAlib29sCQkgIGJUb1NlbGZCQTsJCS8vY29zYSBhZGQgZm9yIHJzc2kKLQljaGFyCSAgY2NrX2FkY19wd2RiWzRdOwkvL2Nvc2EgYWRkIGZvciByeCBwYXRoIHNlbGVjdGlvbgorCXM4CQkgIGNja19hZGNfcHdkYls0XTsJLy9jb3NhIGFkZCBmb3IgcnggcGF0aCBzZWxlY3Rpb24KIAl1MTYJCSAgU2VxX051bTsKIAogfTsKQEAgLTE4MTQsNyArMTgxNCw3IEBACiAJdTMyIHdwYXhfdHlwZV9ub3RpZnk7IC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjZ9CiAKIAkvKiBRb1MgcmVsYXRlZCBmbGFnICovCi0JY2hhciBpbml0X3dtbXBhcmFtX2ZsYWc7CisJczggIGluaXRfd21tcGFyYW1fZmxhZzsKIAkvKiBzZXQgb24gaW5pdGlhbGl6YXRpb24gKi8KIAl1OCAgcW9zX3N1cHBvcnQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCmluZGV4IDA1MWMyYmUuLjg5Y2JjMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtMTAyNyw3ICsxMDI3LDcgQEAKIAkJCQlpZWVlLAogCQkJCShQVFNfQ09NTU9OX0lORk8gKikgJnBSeFRTLAogCQkJCWhkci0+YWRkcjIsCi0JCQkJKHU4KUZyYW1lX1FvU1RJRCgodTggKikoc2tiLT5kYXRhKSksCisJCQkJRnJhbWVfUW9TVElEKCh1OCAqKShza2ItPmRhdGEpKSwKIAkJCQlSWF9ESVIsCiAJCQkJdHJ1ZSkpCiAJCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwppbmRleCA0OWRiMWI3Li5kN2Q4NWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC0yODQsNyArMjg0LDggQEAKIAl9CiB9CiAKLWlubGluZSB2b2lkIHNvZnRtYWNfcHNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIGlubGluZSB2b2lkCitzb2Z0bWFjX3BzX21nbXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAogCXNob3J0IHNpbmdsZSA9IGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFOwpAQCAtMzIwLDcgKzMyMSw3IEBACiAJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKIH0KIAotaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfcHJvYmVfcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3Byb2JlX3JlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAl1bnNpZ25lZCBpbnQgbGVuLCByYXRlX2xlbjsKIAl1OCAqdGFnOwpAQCAtNjQwLDggKzY0MSw5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyk7CiAKLWlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uX3JlcShzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiwKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IGNoYWxsZW5nZWxlbikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgoraWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uX3JlcShzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCBjaGFsbGVuZ2VsZW4pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICphdXRoOwpAQCAtODA2LDcgKzgwOCw3IEBACiAJCSoodGFnKyspID0gMjsKIAogCQlwdXRfdW5hbGlnbmVkX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmF0aW1fd2luZG93LAotCQkJCSAgICh1OCAqKXRhZyk7CisJCQkJICAgdGFnKTsKIAkJdGFnKz0yOwogCX0KIApAQCAtOTc4LDcgKzk4MCw5IEBACiB9CiAKIAotaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uLHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqCitpZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uLAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTMwOTEsNyArMzA5NSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfZGlzYXNzb2NpYXRlX3NrYigKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9kaXNhc3NvY2lhdGVfc2tiKAogCQkJCQkJCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uLAogCQkJCQkJCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAogCQkJCQkJCXU4CWFzUnNuKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5jCmluZGV4IDI4NzM3ZWMuLjk4ZmJiNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMKQEAgLTM1NCw3ICszNTQsNyBAQAogCiAJcmVxID0gKHN0cnVjdCBydGxfODAyMTFfaGRyXzNhZGRyICopIHNrYi0+ZGF0YTsKIAl0YWcgPSAodTggKilyZXE7Ci0JZHN0ID0gKHU4ICopKCZyZXEtPmFkZHIyWzBdKTsKKwlkc3QgPSAmcmVxLT5hZGRyMlswXTsKIAl0YWcgKz0gc2l6ZW9mKHN0cnVjdCBydGxfODAyMTFfaGRyXzNhZGRyKTsKIAlwRGlhbG9nVG9rZW4gPSB0YWcgKyAyOyAgLy9jYXRlZ29yeSthY3Rpb24KIAlwQmFQYXJhbVNldCA9IChQQkFfUEFSQU1fU0VUKSh0YWcgKyAzKTsgICAvLytEaWFsb2dUb2tlbgpAQCAtNDUyLDcgKzQ1Miw3IEBACiAJfQogCXJzcCA9IChzdHJ1Y3QgcnRsXzgwMjExX2hkcl8zYWRkciAqKXNrYi0+ZGF0YTsKIAl0YWcgPSAodTggKilyc3A7Ci0JZHN0ID0gKHU4ICopKCZyc3AtPmFkZHIyWzBdKTsKKwlkc3QgPSAmcnNwLT5hZGRyMlswXTsKIAl0YWcgKz0gc2l6ZW9mKHN0cnVjdCBydGxfODAyMTFfaGRyXzNhZGRyKTsKIAlwRGlhbG9nVG9rZW4gPSB0YWcgKyAyOwogCXBTdGF0dXNDb2RlID0gKHUxNiAqKSh0YWcgKyAzKTsKQEAgLTU5MCw3ICs1OTAsNyBAQAogCiAJSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEF8SUVFRTgwMjExX0RMX0JBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAlkZWxiYSA9IChzdHJ1Y3QgcnRsXzgwMjExX2hkcl8zYWRkciAqKXNrYi0+ZGF0YTsKLQlkc3QgPSAodTggKikoJmRlbGJhLT5hZGRyMlswXSk7CisJZHN0ID0gJmRlbGJhLT5hZGRyMlswXTsKIAlwRGVsQmFQYXJhbVNldCA9IChQREVMQkFfUEFSQU1fU0VUKSZkZWxiYS0+cGF5bG9hZFsyXTsKIAogCWlmKHBEZWxCYVBhcmFtU2V0LT5maWVsZC5Jbml0aWF0b3IgPT0gMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlUuaAppbmRleCA4MjFhZmMwLi4wYjdiMDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVS5oCkBAIC01MzMsNyArNTMzLDcgQEAKIAl1MzIgICAgICAgICAgICAgaHRfbWNzWzRdWzE2XTsKIH0gcnRfdHhfcmFoaXNfdCwgKnBydF90eF9yYWhpc190OwogdHlwZWRlZiBzdHJ1Y3QgX1JUX1NNT09USF9EQVRBXzRSRiB7Ci0JY2hhciAgICBlbGVtZW50c1s0XVsxMDBdOyAvKiBhcnJheSB0byBzdG9yZSB2YWx1ZXMgKi8KKwlzOCAgICBlbGVtZW50c1s0XVsxMDBdOyAvKiBhcnJheSB0byBzdG9yZSB2YWx1ZXMgKi8KIAl1MzIgICAgIGluZGV4OyAgICAgICAgICAgIC8qIGluZGV4IHRvIGN1cnJlbnQgYXJyYXkgdG8gc3RvcmUgKi8KIAl1MzIgICAgIFRvdGFsTnVtOyAgICAgICAgIC8qIG51bSBvZiB2YWxpZCBlbGVtZW50cyAqLwogCXUzMiAgICAgVG90YWxWYWxbNF07ICAgICAgLyogc3VtIG9mIHZhbGlkIGVsZW1lbnRzICovCkBAIC0xMDMxLDcgKzEwMzEsNyBAQAogCXM4IGNja19wcmVzZW50X2F0dGVudHVhdGlvbjsKIAl1OCBjY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fMjBNZGVmYXVsdDsKIAl1OCBjY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fNDBNZGVmYXVsdDsKLQljaGFyIGNja19wcmVzZW50X2F0dGVudHVhdGlvbl9kaWZmZXJlbmNlOworCXM4IGNja19wcmVzZW50X2F0dGVudHVhdGlvbl9kaWZmZXJlbmNlOwogCWJvb2wgYnR4cG93ZXJfdHJhY2tpbmc7CiAJYm9vbCBiY2NrX2luX2NoMTQ7CiAJYm9vbCBidHhwb3dlcmRhdGFfcmVhZGZyb21FRVBPUk07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCmluZGV4IGRkMDk3MGYuLjQ1N2VlYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCkBAIC0xMTQsOSArMTE0LDkgQEAKIAogCiAKLW1vZHVsZV9wYXJhbShpZm5hbWUsIGNoYXJwLCBTX0lSVUdPIHwgU19JV1VTUik7Ci1tb2R1bGVfcGFyYW0oaHd3ZXAsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOwotbW9kdWxlX3BhcmFtKGNoYW5uZWxzLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShpZm5hbWUsIGNoYXJwLCAwNjQ0KTsKK21vZHVsZV9wYXJhbShod3dlcCwgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShjaGFubmVscywgaW50LCAwNjQ0KTsKIAogTU9EVUxFX1BBUk1fREVTQyhpZm5hbWUsICIgTmV0IGludGVyZmFjZSBuYW1lLCB3bGFuJWQ9ZGVmYXVsdCIpOwogTU9EVUxFX1BBUk1fREVTQyhod3dlcCwgIiBUcnkgdG8gdXNlIGhhcmR3YXJlIHNlY3VyaXR5IHN1cHBvcnQuICIpOwpAQCAtOTIyLDQ3ICs5MjIsNiBAQAogCXNrYl9xdWV1ZV9wdXJnZSgmcHJpdi0+c2tiX3F1ZXVlKTsKIH0KIAotaW5saW5lIHUxNiBpZWVlcmF0ZTJydGxyYXRlKGludCByYXRlKQotewotCXN3aXRjaCAocmF0ZSkgewotCWNhc2UgMTA6Ci0JCXJldHVybiAwOwotCWNhc2UgMjA6Ci0JCXJldHVybiAxOwotCWNhc2UgNTU6Ci0JCXJldHVybiAyOwotCWNhc2UgMTEwOgotCQlyZXR1cm4gMzsKLQljYXNlIDYwOgotCQlyZXR1cm4gNDsKLQljYXNlIDkwOgotCQlyZXR1cm4gNTsKLQljYXNlIDEyMDoKLQkJcmV0dXJuIDY7Ci0JY2FzZSAxODA6Ci0JCXJldHVybiA3OwotCWNhc2UgMjQwOgotCQlyZXR1cm4gODsKLQljYXNlIDM2MDoKLQkJcmV0dXJuIDk7Ci0JY2FzZSA0ODA6Ci0JCXJldHVybiAxMDsKLQljYXNlIDU0MDoKLQkJcmV0dXJuIDExOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAzOwotCX0KLX0KLQotc3RhdGljIHUxNiBydGxfcmF0ZVtdID0gezEwLCAyMCwgNTUsIDExMCwgNjAsIDkwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwfTsKLWlubGluZSB1MTYgcnRsODE5Ml9yYXRlMnJhdGUoc2hvcnQgcmF0ZSkKLXsKLQlpZiAocmF0ZSA+IDExKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gcnRsX3JhdGVbcmF0ZV07Ci19Ci0KLQogLyogVGhlIHByb3RvdHlwZSBvZiByeF9pc3IgaGFzIGNoYW5nZWQgc2luY2Ugb25lIHZlcnNpb24gb2YgTGludXggS2VybmVsICovCiBzdGF0aWMgdm9pZCBydGw4MTkyX3J4X2lzcihzdHJ1Y3QgdXJiICp1cmIpCiB7CkBAIC0xMzE5LDE0ICsxMjc4LDYgQEAKIAogfQogCi1pbmxpbmUgdTggcnRsODE5Ml9Jc1dpcmVsZXNzQk1vZGUodTE2IHJhdGUpCi17Ci0JaWYgKCgocmF0ZSA8PSAxMTApICYmIChyYXRlICE9IDYwKSAmJiAocmF0ZSAhPSA5MCkpIHx8IChyYXRlID09IDIyMCkpCi0JCXJldHVybiAxOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KIHNob3J0IHJ0bDgxOXhVX3R4X2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKQEAgLTE3MDIsMTEgKzE2NTMsOCBAQAogCQl9CiAJCWlmIChiU2VuZDBCeXRlKSB7CiAJCQl0eF91cmJfemVybyA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoIXR4X3VyYl96ZXJvKSB7Ci0JCQkJUlRfVFJBQ0UoQ09NUF9FUlIsCi0JCQkJCSAiY2FuJ3QgYWxsb2MgdXJiIGZvciB6ZXJvIGJ5dGVcbiIpOworCQkJaWYgKCF0eF91cmJfemVybykKIAkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KIAkJCXVzYl9maWxsX2J1bGtfdXJiKHR4X3VyYl96ZXJvLCB1ZGV2LAogCQkJCQkgIHVzYl9zbmRidWxrcGlwZSh1ZGV2LCBpZHhfcGlwZSksCiAJCQkJCSAgJnplcm8sIDAsIHR4X3plcm9faXNyLCBkZXYpOwpAQCAtNDIwOSw3ICs0MTU3LDcgQEAKICAqCiAgKiBSZXR1cm46CQkwLTEwMCBwZXJjZW50YWdlCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdTggcnRsODE5eF9xdWVyeV9yeHB3cnBlcmNlbnRhZ2UoY2hhciBhbnRwb3dlcikKK3N0YXRpYyB1OCBydGw4MTl4X3F1ZXJ5X3J4cHdycGVyY2VudGFnZShzOCBhbnRwb3dlcikKIHsKIAlpZiAoKGFudHBvd2VyIDw9IC0xMDApIHx8IChhbnRwb3dlciA+PSAyMCkpCiAJCXJldHVybgkwOwpAQCAtNDIyMCw5ICs0MTY4LDkgQEAKIAogfQkvKiBRdWVyeVJ4UHdyUGVyY2VudGFnZSAqLwogCi1zdGF0aWMgdTggcnRsODE5eF9ldm1fZGJ0b3BlcmNlbnRhZ2UoY2hhciB2YWx1ZSkKK3N0YXRpYyB1OCBydGw4MTl4X2V2bV9kYnRvcGVyY2VudGFnZShzOCB2YWx1ZSkKIHsKLQljaGFyIHJldF92YWw7CisJczggcmV0X3ZhbDsKIAogCXJldF92YWwgPSB2YWx1ZTsKIApAQCAtNDI5Nyw4ICs0MjQ1LDggQEAKIAlwaHlfb2ZkbV9yeF9zdGF0dXNfcnhzY19zZ2llbl9leGludGZmbGFnICpwcnhzYzsKIAl1OAkqcHJ4cGt0OwogCXU4CWksIG1heF9zcGF0aWFsX3N0cmVhbSwgdG1wX3J4c25yLCB0bXBfcnhldm0sIHJ4c2Nfc2dpZW5fZXhmbGc7Ci0JY2hhcglyeF9wd3JbNF0sIHJ4X3B3cl9hbGwgPSAwOwotCWNoYXIJcnhfc25yWCwgcnhfZXZtWDsKKwlzOAlyeF9wd3JbNF0sIHJ4X3B3cl9hbGwgPSAwOworCXM4CXJ4X3NuclgsIHJ4X2V2bVg7CiAJdTgJZXZtLCBwd2RiX2FsbDsKIAl1MzIJUlNTSSwgdG90YWxfcnNzaSA9IDA7CiAJdTgJaXNfY2NrX3JhdGUgPSAwOwpAQCAtNDQyMyw3ICs0MzcxLDcgQEAKIAogCQkJLyogR2V0IFJ4IHNuciB2YWx1ZSBpbiBEQiAqLwogCQkJdG1wX3J4c25yID0JcG9mZG1fYnVmLT5yeHNucl9YW2ldOwotCQkJcnhfc25yWCA9IChjaGFyKSh0bXBfcnhzbnIpOworCQkJcnhfc25yWCA9IChzOCkodG1wX3J4c25yKTsKIAkJCXJ4X3NuclggLz0gMjsKIAkJCXByaXYtPnN0YXRzLnJ4U05SZEJbaV0gPSAobG9uZylyeF9zbnJYOwogCkBAIC00NDU3LDcgKzQ0MDUsNyBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCBtYXhfc3BhdGlhbF9zdHJlYW07IGkrKykgewogCQkJdG1wX3J4ZXZtID0JcG9mZG1fYnVmLT5yeGV2bV9YW2ldOwotCQkJcnhfZXZtWCA9IChjaGFyKSh0bXBfcnhldm0pOworCQkJcnhfZXZtWCA9IChzOCkodG1wX3J4ZXZtKTsKIAogCQkJLyogRG8gbm90IHVzZSBzaGlmdCBvcGVyYXRpb24gbGlrZSAicnhfZXZtWCA+Pj0gMSIKIAkJCSAqIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG9mIGZyZWUgYnVpbGQgZW52aXJvbm1lbnQgd2lsbApAQCAtNDQ3NSwxMCArNDQyMywxMCBAQAogCQkJCSAqLwogCQkJCXBzdGF0cy0+U2lnbmFsUXVhbGl0eSA9CiAJCQkJCXByZWNvcmRfc3RhdHMtPlNpZ25hbFF1YWxpdHkgPQotCQkJCQkodTgpKGV2bSAmIDB4ZmYpOworCQkJCQlldm0gJiAweGZmOwogCQkJcHN0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5W2ldID0KIAkJCQlwcmVjb3JkX3N0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5W2ldID0KLQkJCQkodTgpKGV2bSAmIDB4ZmYpOworCQkJCWV2bSAmIDB4ZmY7CiAJCX0KIAogCkBAIC01MDEzLDggKzQ5NjEsNyBAQAogCiAJZGV2LT5uZXRkZXZfb3BzID0gJnJ0bDgxOTJfbmV0ZGV2X29wczsKIAotCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPQotCQkoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJnI4MTkyX3d4X2hhbmRsZXJzX2RlZjsKKwlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJnI4MTkyX3d4X2hhbmRsZXJzX2RlZjsKIAogCWRldi0+dHlwZSA9IEFSUEhSRF9FVEhFUjsKIApAQCAtNTIyMiw3ICs1MTY5LDggQEAKIAkJfSBlbHNlIHsKIAkJCS8qIEtleSBNYXRlcmlhbCAqLwogCQkJaWYgKEtleUNvbnRlbnQpIHsKLQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXQ0FNSSwgKHUzMikoKihLZXlDb250ZW50ICsgaSAtIDIpKSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0NBTUksCisJCQkJCQkqKEtleUNvbnRlbnQgKyBpIC0gMikpOwogCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFJXQ0FNLCBUYXJnZXRDb21tYW5kKTsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5jCmluZGV4IDFlMGU1M2MuLjkyMDlhYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCiB2b2lkIGRtX0NoZWNrUnhBZ2dyZWdhdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2KTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gcHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvOwogCXN0YXRpYyB1bnNpZ25lZCBsb25nCWxhc3RUeE9rQ250OwogCXN0YXRpYyB1bnNpZ25lZCBsb25nCWxhc3RSeE9rQ250OwpAQCAtMjM0Niw3ICsyMzQ2LDcgQEAKIAogc3RhdGljIHZvaWQgZG1faW5pdF9jdHN0b3NlbGYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldik7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCiAJcHJpdi0+aWVlZTgwMjExLT5iQ1RTVG9TZWxmRW5hYmxlID0gdHJ1ZTsKIAlwcml2LT5pZWVlODAyMTEtPkNUU1RvU2VsZlRIID0gQ1RTVG9TZWxmVEhWYWw7CkBAIC0yMzU0LDcgKzIzNTQsNyBAQAogCiBzdGF0aWMgdm9pZCBkbV9jdHN0b3NlbGYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldik7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IHByaXYtPmllZWU4MDIxMS0+cEhUSW5mbzsKIAlzdGF0aWMgdW5zaWduZWQgbG9uZwkJCQlsYXN0VHhPa0NudDsKIAlzdGF0aWMgdW5zaWduZWQgbG9uZwkJCQlsYXN0UnhPa0NudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2llZWU4MDIxMS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaWVlZTgwMjExLmMKaW5kZXggODkxODY1NC4uNWRjM2I1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaWVlZTgwMjExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaWVlZTgwMjExLmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogCWNhc2UgV0lSRUxFU1NfMTFCRzoKIAkJbWVtY3B5KHJhdGVzLCBXSUZJX0NDS1JBVEVTLCBJRUVFODAyMTFfQ0NLX1JBVEVfTEVOKTsKIAkJbWVtY3B5KHJhdGVzICsgSUVFRTgwMjExX0NDS19SQVRFX0xFTiwgV0lGSV9PRkRNUkFURVMsCi0JCQlJRUVFODAyMTFfTlVNX09GRE1fUkFURVNMRU4pOworCQkgICAgICAgSUVFRTgwMjExX05VTV9PRkRNX1JBVEVTTEVOKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMTg4LDI0ICsxODgsMjQgQEAKIAlpZSArPSAyOwogCS8qU1NJRCovCiAJaWUgPSByODcxMl9zZXRfaWUoaWUsIF9TU0lEX0lFXywgcGRldl9uZXR3b3JrLT5Tc2lkLlNzaWRMZW5ndGgsCi0JCSAgICBwZGV2X25ldHdvcmstPlNzaWQuU3NpZCwgJnN6KTsKKwkJCSAgcGRldl9uZXR3b3JrLT5Tc2lkLlNzaWQsICZzeik7CiAJLypzdXBwb3J0ZWQgcmF0ZXMqLwogCXNldF9zdXBwb3J0ZWRfcmF0ZShwZGV2X25ldHdvcmstPnJhdGVzLCBwcmVnaXN0cnlwcml2LT53aXJlbGVzc19tb2RlKTsKIAlyYXRlTGVuID0gcjg3MTJfZ2V0X3JhdGVzZXRfbGVuKHBkZXZfbmV0d29yay0+cmF0ZXMpOwogCWlmIChyYXRlTGVuID4gOCkgewogCQlpZSA9IHI4NzEyX3NldF9pZShpZSwgX1NVUFBPUlRFRFJBVEVTX0lFXywgOCwKLQkJCSAgICBwZGV2X25ldHdvcmstPnJhdGVzLCAmc3opOworCQkJCSAgcGRldl9uZXR3b3JrLT5yYXRlcywgJnN6KTsKIAkJaWUgPSByODcxMl9zZXRfaWUoaWUsIF9FWFRfU1VQUE9SVEVEUkFURVNfSUVfLCAocmF0ZUxlbiAtIDgpLAotCQkJICAgIChwZGV2X25ldHdvcmstPnJhdGVzICsgOCksICZzeik7CisJCQkJICAocGRldl9uZXR3b3JrLT5yYXRlcyArIDgpLCAmc3opOwogCX0gZWxzZQogCQlpZSA9IHI4NzEyX3NldF9pZShpZSwgX1NVUFBPUlRFRFJBVEVTX0lFXywKLQkJCSAgICByYXRlTGVuLCBwZGV2X25ldHdvcmstPnJhdGVzLCAmc3opOworCQkJCSAgcmF0ZUxlbiwgcGRldl9uZXR3b3JrLT5yYXRlcywgJnN6KTsKIAkvKkRTIHBhcmFtZXRlciBzZXQqLwogCWllID0gcjg3MTJfc2V0X2llKGllLCBfRFNTRVRfSUVfLCAxLAotCQkgICAgKHU4ICopJihwZGV2X25ldHdvcmstPkNvbmZpZ3VyYXRpb24uRFNDb25maWcpLCAmc3opOworCQkJICAodTggKikmKHBkZXZfbmV0d29yay0+Q29uZmlndXJhdGlvbi5EU0NvbmZpZyksICZzeik7CiAJLypJQlNTIFBhcmFtZXRlciBTZXQqLwogCWllID0gcjg3MTJfc2V0X2llKGllLCBfSUJTU19QQVJBX0lFXywgMiwKLQkJICAgICh1OCAqKSYocGRldl9uZXR3b3JrLT5Db25maWd1cmF0aW9uLkFUSU1XaW5kb3cpLCAmc3opOworCQkJICAodTggKikmKHBkZXZfbmV0d29yay0+Q29uZmlndXJhdGlvbi5BVElNV2luZG93KSwgJnN6KTsKIAlyZXR1cm4gc3o7CiB9CiAKQEAgLTIyMCw4ICsyMjAsNyBAQAogCQlwYnVmID0gcjg3MTJfZ2V0X2llKHBidWYsIF9XUEFfSUVfSURfLCAmbGVuLCBsaW1pdCk7CiAJCWlmIChwYnVmKSB7CiAJCQkvKmNoZWNrIGlmIG91aSBtYXRjaGVzLi4uKi8KLQkJCWlmIChtZW1jbXAoKHBidWYgKyAyKSwgd3BhX291aV90eXBlLAotCQkJICAgIHNpemVvZih3cGFfb3VpX3R5cGUpKSkKKwkJCWlmIChtZW1jbXAoKHBidWYgKyAyKSwgd3BhX291aV90eXBlLCBzaXplb2Yod3BhX291aV90eXBlKSkpCiAJCQkJZ290byBjaGVja19uZXh0X2llOwogCQkJLypjaGVjayB2ZXJzaW9uLi4uKi8KIAkJCW1lbWNweSgodTggKikmdmFsMTYsIChwYnVmICsgNiksIHNpemVvZih2YWwxNikpOwpAQCAtMjc5LDcgKzI3OCw3IEBACiB9CiAKIGludCByODcxMl9wYXJzZV93cGFfaWUodTggKndwYV9pZSwgaW50IHdwYV9pZV9sZW4sIGludCAqZ3JvdXBfY2lwaGVyLAotCQkgaW50ICpwYWlyd2lzZV9jaXBoZXIpCisJCSAgICAgICBpbnQgKnBhaXJ3aXNlX2NpcGhlcikKIHsKIAlpbnQgaTsKIAlpbnQgbGVmdCwgY291bnQ7CkBAIC0zMjIsNyArMzIxLDcgQEAKIH0KIAogaW50IHI4NzEyX3BhcnNlX3dwYTJfaWUodTggKnJzbl9pZSwgaW50IHJzbl9pZV9sZW4sIGludCAqZ3JvdXBfY2lwaGVyLAotCQkgIGludCAqcGFpcndpc2VfY2lwaGVyKQorCQkJaW50ICpwYWlyd2lzZV9jaXBoZXIpCiB7CiAJaW50IGk7CiAJaW50IGxlZnQsIGNvdW50OwpAQCAtMzY1LDcgKzM2NCw3IEBACiB9CiAKIGludCByODcxMl9nZXRfc2VjX2llKHU4ICppbl9pZSwgdWludCBpbl9sZW4sIHU4ICpyc25faWUsIHUxNiAqcnNuX2xlbiwKLQkgICAgICAgdTggKndwYV9pZSwgdTE2ICp3cGFfbGVuKQorCQkgICAgIHU4ICp3cGFfaWUsIHUxNiAqd3BhX2xlbikKIHsKIAl1OCBhdXRobW9kZTsKIAl1OCB3cGFfb3VpWzRdID0gezB4MCwgMHg1MCwgMHhmMiwgMHgwMX07CkBAIC0zODMsNyArMzgyLDcgQEAKIAkJfSBlbHNlIHsKIAkJCWlmIChhdXRobW9kZSA9PSBfV1BBMl9JRV9JRF8pIHsKIAkJCQltZW1jcHkocnNuX2llLCAmaW5faWVbY250XSwKLQkJCQkJaW5faWVbY250ICsgMV0gKyAyKTsKKwkJCQkgICAgICAgaW5faWVbY250ICsgMV0gKyAyKTsKIAkJCQkqcnNuX2xlbiA9IGluX2llW2NudCArIDFdICsgMjsKIAkJCQljbnQgKz0gaW5faWVbY250ICsgMV0gKyAyOyAgLypnZXQgbmV4dCovCiAJCQl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NfaW50ZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zX2ludGZzLmMKaW5kZXggNTcyMTFmNy4uY2JlNGRlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NfaW50ZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc19pbnRmcy5jCkBAIC0yNDMsOSArMjQzLDkgQEAKIHZvaWQgcjg3MTJfc3RvcF9kcnZfdGhyZWFkcyhzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyKQogewogCS8qQmVsb3cgaXMgdG8gdGVybWluYXRlIHI4NzEyX2NtZF90aHJlYWQgJiBldmVudF90aHJlYWQuLi4qLwotCXVwKCZwYWRhcHRlci0+Y21kcHJpdi5jbWRfcXVldWVfc2VtYSk7CisJY29tcGxldGUoJnBhZGFwdGVyLT5jbWRwcml2LmNtZF9xdWV1ZV9jb21wKTsKIAlpZiAocGFkYXB0ZXItPmNtZFRocmVhZCkKLQkJX2Rvd25fc2VtYSgmcGFkYXB0ZXItPmNtZHByaXYudGVybWluYXRlX2NtZHRocmVhZF9zZW1hKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZwYWRhcHRlci0+Y21kcHJpdi50ZXJtaW5hdGVfY21kdGhyZWFkX2NvbXApOwogCXBhZGFwdGVyLT5jbWRwcml2LmNtZF9zZXEgPSAxOwogfQogCkBAIC00MjUsNyArNDI1LDcgQEAKIAllbHNlCiAJCW5ldGlmX3dha2VfcXVldWUocG5ldGRldik7CiAKLQkgaWYgKHZpZGVvX21vZGUpCisJaWYgKHZpZGVvX21vZGUpCiAJCWVuYWJsZV92aWRlb19tb2RlKHBhZGFwdGVyLCBjYnc0MF9lbmFibGUpOwogCS8qIHN0YXJ0IGRyaXZlciBtbG1lIHJlbGF0aW9uIHRpbWVyICovCiAJc3RhcnRfZHJ2X3RpbWVycyhwYWRhcHRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9pbnRmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9pbnRmLmgKaW5kZXggYWEwZWM3NC4uNWQzN2UxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfaW50Zi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX2ludGYuaApAQCAtMzYsNyArMzYsNyBAQAogCS8qIHdoZW4gaW4gVVNCLCBJTyBpcyB0aHJvdWdoIGludGVycnVwdCBpbi9vdXQgZW5kcG9pbnRzICovCiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJc3RydWN0IHVyYiAqcGlvcndfdXJiOwotCXN0cnVjdCBzZW1hcGhvcmUgaW9fcmV0ZXZ0OworCXN0cnVjdCBjb21wbGV0aW9uIGlvX3JldGV2dF9jb21wOwogfTsKIAogaW50IHI4NzF4X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oCmluZGV4IGFkMDQxYzkuLmM5ZWE1MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX3NlcnZpY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9zZXJ2aWNlLmgKQEAgLTU3LDEzICs1Nyw2IEBACiAJCXNwaW5fbG9ja19pbml0KCYoKHBxdWV1ZSktPmxvY2spKTsJXAogCX0gd2hpbGUgKDApCiAKLXN0YXRpYyBpbmxpbmUgdTMyIF9kb3duX3NlbWEoc3RydWN0IHNlbWFwaG9yZSAqc2VtYSkKLXsKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKHNlbWEpKQotCQlyZXR1cm4gX0ZBSUw7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCiBzdGF0aWMgaW5saW5lIHUzMiBlbmRfb2ZfcXVldWVfc2VhcmNoKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCiAJCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcmVjdl9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcmVjdl9saW51eC5jCmluZGV4IDczNWEwZWEuLjU3NmMxNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3JlY3ZfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9yZWN2X2xpbnV4LmMKQEAgLTYwLDcgKzYwLDYgQEAKIAlpZiAoIXByZWN2YnVmLT5wdXJiKQogCQlyZXMgPSBfRkFJTDsKIAlwcmVjdmJ1Zi0+cHNrYiA9IE5VTEw7Ci0JcHJlY3ZidWYtPnJldXNlID0gZmFsc2U7CiAJcHJlY3ZidWYtPnBhbGxvY2F0ZWRfYnVmID0gTlVMTDsKIAlwcmVjdmJ1Zi0+cGJ1ZiA9IE5VTEw7CiAJcHJlY3ZidWYtPnBkYXRhID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfY21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2NtZC5jCmluZGV4IDEzYzAxODMuLjlmNjE1ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfY21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9jbWQuYwpAQCAtMjY0LDkgKzI2NCw5IEBACiAJCSAqLwogCQlpZiAocGFkYXB0ZXItPnB3cmN0cmxwcml2LnB3cl9tb2RlID4gUFNfTU9ERV9BQ1RJVkUpIHsKIAkJCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5wd3JfbW9kZSA9IFBTX01PREVfQUNUSVZFOwotCQkJX2VudGVyX3B3cmxvY2soJihwYWRhcHRlci0+cHdyY3RybHByaXYubG9jaykpOworCQkJbXV0ZXhfbG9jaygmcGFkYXB0ZXItPnB3cmN0cmxwcml2Lm11dGV4X2xvY2spOwogCQkJcjg3MTJfc2V0X3Jwd20ocGFkYXB0ZXIsIFBTX1NUQVRFX1M0KTsKLQkJCXVwKCYocGFkYXB0ZXItPnB3cmN0cmxwcml2LmxvY2spKTsKKwkJCW11dGV4X3VubG9jaygmcGFkYXB0ZXItPnB3cmN0cmxwcml2Lm11dGV4X2xvY2spOwogCQl9CiAJCXBjbWRfciA9IHBjbWQ7CiAJCWJyZWFrOwpAQCAtMzIyLDcgKzMyMiw3IEBACiAKIAlhbGxvd19zaWduYWwoU0lHVEVSTSk7CiAJd2hpbGUgKDEpIHsKLQkJaWYgKChfZG93bl9zZW1hKCYocGNtZHByaXYtPmNtZF9xdWV1ZV9zZW1hKSkpID09IF9GQUlMKQorCQlpZiAod2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZwY21kcHJpdi0+Y21kX3F1ZXVlX2NvbXApKQogCQkJYnJlYWs7CiAJCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpCiAJCQlicmVhazsKQEAgLTM5NSwxMCArMzk1LDEwIEBACiAJCQl9CiAJCQlpZiAocGNtZC0+Y21kY29kZSA9PSBHRU5fQ01EX0NPREUoX1NldFB3ck1vZGUpKSB7CiAJCQkJaWYgKHBhZGFwdGVyLT5wd3JjdHJscHJpdi5iU2xlZXApIHsKLQkJCQkJX2VudGVyX3B3cmxvY2soJihwYWRhcHRlci0+Ci0JCQkJCQkgICAgICAgcHdyY3RybHByaXYubG9jaykpOworCQkJCQltdXRleF9sb2NrKCZwYWRhcHRlci0+CisJCQkJCQkgICAgICAgcHdyY3RybHByaXYubXV0ZXhfbG9jayk7CiAJCQkJCXI4NzEyX3NldF9ycHdtKHBhZGFwdGVyLCBQU19TVEFURV9TMik7Ci0JCQkJCXVwKCZwYWRhcHRlci0+cHdyY3RybHByaXYubG9jayk7CisJCQkJCW11dGV4X3VubG9jaygmcGFkYXB0ZXItPnB3cmN0cmxwcml2Lm11dGV4X2xvY2spOwogCQkJCX0KIAkJCX0KIAkJCXI4NzEyX2ZyZWVfY21kX29iaihwY21kKTsKQEAgLTQyMCw3ICs0MjAsNyBAQAogCQkJYnJlYWs7CiAJCXI4NzEyX2ZyZWVfY21kX29iaihwY21kKTsKIAl9IHdoaWxlICgxKTsKLQl1cCgmcGNtZHByaXYtPnRlcm1pbmF0ZV9jbWR0aHJlYWRfc2VtYSk7CisJY29tcGxldGUoJnBjbWRwcml2LT50ZXJtaW5hdGVfY21kdGhyZWFkX2NvbXApOwogCXRocmVhZF9leGl0KCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZWZ1c2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZWZ1c2UuYwppbmRleCA3NmY2MGJhLi4yMDUyOThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2VmdXNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9lZnVzZS5jCkBAIC0yNDgsNyArMjQ4LDcgQEAKIAl1OCB0bXBkYXRhW1BHUEtUX0RBVEFfU0laRV07CiAJdTggcmV0ID0gdHJ1ZTsKIAotCWlmIChkYXRhID09IE5VTEwpCisJaWYgKCFkYXRhKQogCQlyZXR1cm4gZmFsc2U7CiAJaWYgKG9mZnNldCA+IDB4MGYpCiAJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfbGVkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2xlZC5jCmluZGV4IDkwNTU4MjcuLmE4ZTIzN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfbGVkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9sZWQuYwpAQCAtNDMsNyArNDMsNyBAQAogI2RlZmluZSBMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQQkJNTAwCiAjZGVmaW5lIExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBCQkxODAKICNkZWZpbmUgTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQQkJNTAKLSNkZWZpbmUgTEVEX0JMSU5LX1dQU19TVUNFU1NfSU5URVJWQUxfQUxQSEEJNTAwMAorI2RlZmluZSBMRURfQkxJTktfV1BTX1NVQ0NFU1NfSU5URVJWQUxfQUxQSEEJNTAwMAogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogTEVEIG9iamVjdC4KQEAgLTUxLDE3ICs1MSwxOSBAQAogICovCiBlbnVtIF9MRURfU1RBVEVfODcxeCB7CiAJTEVEX1VOS05PV04gPSAwLAotCUxFRF9PTiA9IDEsCi0JTEVEX09GRiA9IDIsCisJTEVEX1NUQVRFX09OID0gMSwKKwlMRURfU1RBVEVfT0ZGID0gMiwKIAlMRURfQkxJTktfTk9STUFMID0gMywKIAlMRURfQkxJTktfU0xPV0xZID0gNCwKIAlMRURfUE9XRVJfT05fQkxJTksgPSA1LAogCUxFRF9TQ0FOX0JMSU5LID0gNiwgLyogTEVEIGlzIGJsaW5raW5nIGR1cmluZyBzY2FubmluZyBwZXJpb2QsCiAJCQkgICAgICogdGhlICMgb2YgdGltZXMgdG8gYmxpbmsgaXMgZGVwZW5kIG9uIHRpbWUKLQkJCSAgICAgKiBmb3Igc2Nhbm5pbmcuICovCisJCQkgICAgICogZm9yIHNjYW5uaW5nLgorCQkJICAgICAqLwogCUxFRF9OT19MSU5LX0JMSU5LID0gNywgLyogTEVEIGlzIGJsaW5raW5nIGR1cmluZyBubyBsaW5rIHN0YXRlLiAqLwogCUxFRF9CTElOS19TdGFydFRvQmxpbmsgPSA4LC8qIEN1c3RvbWl6ZWQgZm9yIFNlcmNvbW0gUHJpbnRlcgotCQkJCSAgICAqIFNlcnZlciBjYXNlICovCisJCQkJICAgICogU2VydmVyIGNhc2UKKwkJCQkgICAgKi8KIAlMRURfQkxJTktfV1BTID0gOSwJLyogTEVEIGlzIGJsaW5rZyBkdXJpbmcgV1BTIGNvbW11bmljYXRpb24gKi8KIAlMRURfVFhSWF9CTElOSyA9IDEwLAogCUxFRF9CTElOS19XUFNfU1RPUCA9IDExLAkvKmZvciBBTFBIQSAqLwpAQCAtOTIsNyArOTQsNyBAQAogCW5pYyA9IHBhZGFwdGVyLT5wbmV0ZGV2OwogCXBMZWQtPnBhZGFwdGVyID0gcGFkYXB0ZXI7CiAJcExlZC0+TGVkUGluID0gTGVkUGluOwotCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7CisJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAlwTGVkLT5iTGVkT24gPSBmYWxzZTsKIAlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJcExlZC0+QmxpbmtUaW1lcyA9IDA7CkBAIC0xMTAsNyArMTEyLDggQEAKIHsKIAlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJLyogV2Ugc2hvdWxkIHJlc2V0IGJMZWRCbGlua0luUHJvZ3Jlc3MgaWYgd2UgY2FuY2VsCi0JICogdGhlIExlZENvbnRyb2xUaW1lciwgKi8KKwkgKiB0aGUgTGVkQ29udHJvbFRpbWVyLAorCSAqLwogCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIH0KIApAQCAtMjA4LDcgKzIxMSw3IEBACiAJdTggYlN0b3BCbGlua2luZyA9IGZhbHNlOwogCiAJLyogQ2hhbmdlIExFRCBhY2NvcmRpbmcgdG8gQmxpbmtpbmdMZWRTdGF0ZSBzcGVjaWZpZWQuICovCi0JaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX09OKQorCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9TVEFURV9PTikKIAkJU3dMZWRPbihwYWRhcHRlciwgcExlZCk7CiAJZWxzZQogCQlTd0xlZE9mZihwYWRhcHRlciwgcExlZCk7CkBAIC0yNDgsMTAgKzI1MSwxMCBAQAogCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJfSBlbHNlIHsKIAkJLyogQXNzaWduIExFRCBzdGF0ZSB0byB0b2dnbGUuICovCi0JCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9PTikKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfU1RBVEVfT04pCisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJZWxzZQotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAKIAkJLyogU2NoZWR1bGUgYSB0aW1lciB0byB0b2dnbGUgTEVEIHN0YXRlLiAqLwogCQlzd2l0Y2ggKHBMZWQtPkN1cnJMZWRTdGF0ZSkgewpAQCAtMjg4LDcgKzI5MSw3IEBACiAJaWYgKHBlZXByb21wcml2LT5DdXN0b21lcklEID09IFJUX0NJRF84MTl4X0NBTUVPKQogCQlwTGVkID0gJihsZWRwcml2LT5Td0xlZDEpOwogCS8qIENoYW5nZSBMRUQgYWNjb3JkaW5nIHRvIEJsaW5raW5nTGVkU3RhdGUgc3BlY2lmaWVkLiAqLwotCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9PTikKKwlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfU1RBVEVfT04pCiAJCVN3TGVkT24ocGFkYXB0ZXIsIHBMZWQpOwogCWVsc2UKIAkJU3dMZWRPZmYocGFkYXB0ZXIsIHBMZWQpOwpAQCAtMzEyLDE3ICszMTUsMTcgQEAKIAlzd2l0Y2ggKHBMZWQtPkN1cnJMZWRTdGF0ZSkgewogCWNhc2UgTEVEX0JMSU5LX1NMT1dMWToKIAkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWVsc2UKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX05PUk1BTDoKIAkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWVsc2UKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwpAQCAtMzM1LDI3ICszMzgsMjcgQEAKIAkJCQlwTGVkLT5iTGVkTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX05PUk1BTDsKIAkJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQkJZWxzZQotCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkJfSBlbHNlIGlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSB7CiAJCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1NMT1dMWTsKIAkJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQkJZWxzZQotCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkJfQogCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCSBpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTM2OSwxOCArMzcyLDE4IEBACiAJCQkJcExlZC0+YkxlZExpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19OT1JNQUw7CiAJCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJCWVsc2UKLQkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCX0gZWxzZSBpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewogCQkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19TTE9XTFk7CiAJCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJCWVsc2UKLQkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCX0KQEAgLTM4OCwyNiArMzkxLDI2IEBACiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQkgaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfV1BTOgogCQlpZiAocExlZC0+YkxlZE9uKQotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJZWxzZQotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfV1BTX1NUT1A6CS8qIFdQUyBzdWNjZXNzICovCi0JCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9PTikgewotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9TVEFURV9PTikgeworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwotCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfV1BTX1NVQ0VTU19JTlRFUlZBTF9BTFBIQSkpOworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfV1BTX1NVQ0NFU1NfSU5URVJWQUxfQUxQSEEpKTsKIAkJCWJTdG9wQmxpbmtpbmcgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCWJTdG9wQmxpbmtpbmcgPSB0cnVlOwpAQCAtNDE2LDkgKzQxOSw5IEBACiAJCQlwTGVkLT5iTGVkTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfTk9STUFMOwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC00MzYsNyArNDM5LDcgQEAKIAl1OCBiU3RvcEJsaW5raW5nID0gZmFsc2U7CiAKIAkvKiBDaGFuZ2UgTEVEIGFjY29yZGluZyB0byBCbGlua2luZ0xlZFN0YXRlIHNwZWNpZmllZC4gKi8KLQlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfT04pCisJaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX1NUQVRFX09OKQogCQlTd0xlZE9uKHBhZGFwdGVyLCBwTGVkKTsKIAllbHNlCiAJCVN3TGVkT2ZmKHBhZGFwdGVyLCBwTGVkKTsKQEAgLTQ0NywyMCArNDUwLDIwIEBACiAJCQliU3RvcEJsaW5raW5nID0gdHJ1ZTsKIAkJaWYgKGJTdG9wQmxpbmtpbmcpIHsKIAkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047Ci0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCQlTd0xlZE9uKHBhZGFwdGVyLCBwTGVkKTsKIAkJCX0gZWxzZSBpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCQlTd0xlZE9mZihwYWRhcHRlciwgcExlZCk7CiAJCQl9CiAJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9IGVsc2UgewogCQkJIGlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtNDcxLDIwICs0NzQsMjAgQEAKIAkJCWJTdG9wQmxpbmtpbmcgPSB0cnVlOwogCQlpZiAoYlN0b3BCbGlua2luZykgewogCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJCVN3TGVkT24ocGFkYXB0ZXIsIHBMZWQpOwogCQkJfSBlbHNlIGlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSB7Ci0JCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJCVN3TGVkT2ZmKHBhZGFwdGVyLCBwTGVkKTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC01MDEsNyArNTA0LDcgQEAKIAl1OCBiU3RvcEJsaW5raW5nID0gZmFsc2U7CiAKIAkvKiBDaGFuZ2UgTEVEIGFjY29yZGluZyB0byBCbGlua2luZ0xlZFN0YXRlIHNwZWNpZmllZC4gKi8KLQlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfT04pCisJaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX1NUQVRFX09OKQogCQlTd0xlZE9uKHBhZGFwdGVyLCBwTGVkKTsKIAllbHNlCiAJCWlmIChwTGVkLT5DdXJyTGVkU3RhdGUgIT0gTEVEX0JMSU5LX1dQU19TVE9QKQpAQCAtNTEzLDIyICs1MTYsMjIgQEAKIAkJCWJTdG9wQmxpbmtpbmcgPSB0cnVlOwogCQlpZiAoYlN0b3BCbGlua2luZykgewogCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJCWlmICghcExlZC0+YkxlZE9uKQogCQkJCQlTd0xlZE9uKHBhZGFwdGVyLCBwTGVkKTsKIAkJCX0gZWxzZSBpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCQlpZiAocExlZC0+YkxlZE9uKQogCQkJCQlTd0xlZE9mZihwYWRhcHRlciwgcExlZCk7CiAJCQl9CiAJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9IGVsc2UgewogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC01MzksNDYgKzU0Miw0NiBAQAogCQkJYlN0b3BCbGlua2luZyA9IHRydWU7CiAJCWlmIChiU3RvcEJsaW5raW5nKSB7CiAJCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSB7Ci0JCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQkJaWYgKCFwTGVkLT5iTGVkT24pCiAJCQkJCVN3TGVkT24ocGFkYXB0ZXIsIHBMZWQpOwogCQkJfSBlbHNlIGlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSB7Ci0JCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJCWlmIChwTGVkLT5iTGVkT24pCiAJCQkJCVN3TGVkT2ZmKHBhZGFwdGVyLCBwTGVkKTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX1dQUzoKIAkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWVsc2UKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX1dQU19TVE9QOgkvKldQUyBzdWNjZXNzKi8KLQkJaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX09OKSB7Ci0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX1NUQVRFX09OKSB7CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCi0JCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19XUFNfU1VDRVNTX0lOVEVSVkFMX0FMUEhBKSk7CisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19XUFNfU1VDQ0VTU19JTlRFUlZBTF9BTFBIQSkpOwogCQkJYlN0b3BCbGlua2luZyA9IGZhbHNlOwogCQl9IGVsc2UgewogCQkJYlN0b3BCbGlua2luZyA9IHRydWU7CiAJCX0KIAkJaWYgKGJTdG9wQmxpbmtpbmcpIHsKLQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJU3dMZWRPbihwYWRhcHRlciwgcExlZCk7CiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KQEAgLTU5NiwzMiArNTk5LDMyIEBACiAJdTggYlN0b3BCbGlua2luZyA9IGZhbHNlOwogCiAJLyogQ2hhbmdlIExFRCBhY2NvcmRpbmcgdG8gQmxpbmtpbmdMZWRTdGF0ZSBzcGVjaWZpZWQuICovCi0JaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX09OKQorCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9TVEFURV9PTikKIAkJU3dMZWRPbihwYWRhcHRlciwgcExlZCk7CiAJZWxzZQogCQlTd0xlZE9mZihwYWRhcHRlciwgcExlZCk7CiAJaWYgKCFwTGVkMS0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyAmJgogCSAgICBwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfVU5LTk9XTikgewotCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCXBMZWQxLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOworCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CisJCXBMZWQxLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQlTd0xlZE9mZihwYWRhcHRlciwgcExlZDEpOwogCX0KIAlzd2l0Y2ggKHBMZWQtPkN1cnJMZWRTdGF0ZSkgewogCWNhc2UgTEVEX0JMSU5LX1NMT1dMWToKIAkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWVsc2UKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX1N0YXJ0VG9CbGluazoKIAkJaWYgKHBMZWQtPmJMZWRPbikgewotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TTE9XTFlfSU5URVJWQUwpKTsKIAkJfSBlbHNlIHsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCkpOwogCQl9CkBAIC02MzQsMTcgKzYzNywxNyBAQAogCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfU0xPV0xZOwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtNjU3LDM3ICs2NjAsMzcgQEAKIAkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1NMT1dMWTsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCSBpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19XUFM6CiAJCWlmIChwTGVkLT5iTGVkT24pIHsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0xPV0xZX0lOVEVSVkFMKSk7CiAJCX0gZWxzZSB7Ci0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19XUFNfU1RPUDoJLypXUFMgYXV0aGVudGljYXRpb24gZmFpbCovCiAJCWlmIChwTGVkLT5iTGVkT24pCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQllbHNlCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCWJyZWFrOwpAQCAtNzAxLDE0ICs3MDQsMTQgQEAKIAkJfQogCQlpZiAoYlN0b3BCbGlua2luZykgewogCQkJcExlZC0+QmxpbmtUaW1lcyA9IDEwOwotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQl9IGVsc2UgewogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCX0KQEAgLTcyNCw3ICs3MjcsNyBAQAogCXU4IGJTdG9wQmxpbmtpbmcgPSBmYWxzZTsKIAogCS8qIENoYW5nZSBMRUQgYWNjb3JkaW5nIHRvIEJsaW5raW5nTGVkU3RhdGUgc3BlY2lmaWVkLiAqLwotCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9PTikKKwlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfU1RBVEVfT04pCiAJCVN3TGVkT24ocGFkYXB0ZXIsIHBMZWQpOwogCWVsc2UKIAkJU3dMZWRPZmYocGFkYXB0ZXIsIHBMZWQpOwpAQCAtNzM0LDE3ICs3MzcsMTcgQEAKIAkJaWYgKHBMZWQtPkJsaW5rVGltZXMgPT0gMCkKIAkJCWJTdG9wQmxpbmtpbmcgPSB0cnVlOwogCQlpZiAoYlN0b3BCbGlua2luZykgewotCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQlpZiAoIXBMZWQtPmJMZWRPbikKIAkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtNzU0LDE3ICs3NTcsMTcgQEAKIAkJaWYgKHBMZWQtPkJsaW5rVGltZXMgPT0gMCkKIAkJCWJTdG9wQmxpbmtpbmcgPSB0cnVlOwogCQlpZiAoYlN0b3BCbGlua2luZykgewotCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQlpZiAoIXBMZWQtPmJMZWRPbikKIAkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9IGVsc2UgewogCQkJIGlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC03ODAsNyArNzgzLDcgQEAKIAl1OCBiU3RvcEJsaW5raW5nID0gZmFsc2U7CiAKIAkvKiBDaGFuZ2UgTEVEIGFjY29yZGluZyB0byBCbGlua2luZ0xlZFN0YXRlIHNwZWNpZmllZC4gKi8KLQlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfT04pCisJaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX1NUQVRFX09OKQogCQlTd0xlZE9uKHBhZGFwdGVyLCBwTGVkKTsKIAllbHNlCiAJCVN3TGVkT2ZmKHBhZGFwdGVyLCBwTGVkKTsKQEAgLTc5MCwyNSArNzkzLDI1IEBACiAJCWlmIChwTGVkLT5CbGlua1RpbWVzID09IDApCiAJCQliU3RvcEJsaW5raW5nID0gdHJ1ZTsKIAkJaWYgKGJTdG9wQmxpbmtpbmcpIHsKLQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJaWYgKCFwTGVkLT5iTGVkT24pCiAJCQkJU3dMZWRPbihwYWRhcHRlciwgcExlZCk7CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19XUFM6CiAJCWlmIChwTGVkLT5iTGVkT24pCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQllbHNlCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQlicmVhazsKQEAgLTgyNyw3ICs4MzAsOCBAQAogCXN0cnVjdCBMRURfODcxeCAgKnBMZWQgPSAoc3RydWN0IExFRF84NzF4ICopZGF0YTsKIAogCS8qIFRoaXMgZml4ZWQgdGhlIGNyYXNoIHByb2JsZW0gb24gRmVkb3JhIDEyIHdoZW4gdHJ5aW5nIHRvIGRvIHRoZQotCSAqIGluc21vZDtpZmNvbmZpZyB1cDtybW1vZCBjb21tYW5kcy4gKi8KKwkgKiBpbnNtb2Q7aWZjb25maWcgdXA7cm1tb2QgY29tbWFuZHMuCisJICovCiAJaWYgKHBMZWQtPnBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkIHx8IHBMZWQtPnBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkKIAkJcmV0dXJuOwogCXNjaGVkdWxlX3dvcmsoJnBMZWQtPkJsaW5rV29ya0l0ZW0pOwpAQCAtOTA4LDkgKzkxMiw5IEBACiAJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19TTE9XTFk7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTkzMSw5ICs5MzUsOSBAQAogCQkJcExlZC0+YkxlZExpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX05PUk1BTDsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtOTYxLDkgKzk2NSw5IEBACiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU0NBTl9CTElOSzsKIAkJCXBMZWQtPkJsaW5rVGltZXMgPSAyNDsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJIH0KQEAgLTk4Niw5ICs5OTAsOSBAQAogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1RYUlhfQkxJTks7CiAJCQlwTGVkLT5CbGlua1RpbWVzID0gMjsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC0xMDE2LDkgKzEwMjAsOSBAQAogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfV1BTOwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC0xMDQ2LDExICsxMDUwLDExIEBACiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1dQU19TVE9QOwogCQlpZiAocExlZC0+YkxlZE9uKSB7Ci0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKLQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1dQU19TVUNFU1NfSU5URVJWQUxfQUxQSEEpKTsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1dQU19TVUNDRVNTX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0gZWxzZSB7Ci0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKIAkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJfQpAQCAtMTA2MywxNSArMTA2NywxNSBAQAogCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1NMT1dMWTsKIAkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWVsc2UKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9QT1dFUl9PRkY6Ci0JCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJaWYgKHBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MpIHsKIAkJCWRlbF90aW1lcigmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CkBAIC0xMTIzLDkgKzExMjcsOSBAQAogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NDQU5fQkxJTks7CiAJCQlwTGVkLT5CbGlua1RpbWVzID0gMjQ7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCSB9CkBAIC0xMTQyLDE3ICsxMTQ2LDE3IEBACiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfVFhSWF9CTElOSzsKIAkJCXBMZWQtPkJsaW5rVGltZXMgPSAyOwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIExFRF9DVExfTElOSzoKLQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwotCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CisJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzKSB7CiAJCQlkZWxfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwpAQCAtMTE3OCw4ICsxMTgyLDggQEAKIAkJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7Ci0JCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047Ci0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKIAkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJIH0KQEAgLTExODcsMTYgKzExOTEsMTYgQEAKIAogCWNhc2UgTEVEX0NUTF9TVE9QX1dQUzoKIAkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwotCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047Ci0JCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKKwkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAogCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBMRURfQ1RMX1NUT1BfV1BTX0ZBSUw6CiAJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKLQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CisJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCiAJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJYnJlYWs7CkBAIC0xMjA0LDE1ICsxMjA4LDE1IEBACiAJY2FzZSBMRURfQ1RMX1NUQVJUX1RPX0xJTks6CiAJY2FzZSBMRURfQ1RMX05PX0xJTks6CiAJCWlmICghSVNfTEVEX0JMSU5LSU5HKHBMZWQpKSB7Ci0JCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCiAJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1BPV0VSX09GRjoKLQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKLQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CisJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcykgewogCQkJZGVsX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKQEAgLTEyNTUsOSArMTI1OSw5IEBACiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU0NBTl9CTElOSzsKIAkJCXBMZWQtPkJsaW5rVGltZXMgPSAyNDsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtMTI3Myw5ICsxMjc3LDkgQEAKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9UWFJYX0JMSU5LOwogCQkJcExlZC0+QmxpbmtUaW1lcyA9IDI7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtMTI4Myw4ICsxMjg3LDggQEAKIAljYXNlIExFRF9DVExfTElOSzoKIAkJaWYgKElTX0xFRF9XUFNfQkxJTktJTkcocExlZCkpCiAJCQlyZXR1cm47Ci0JCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09OOworCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcykgewogCQkJZGVsX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKQEAgLTEzMTAsOSArMTMxNCw5IEBACiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19XUFM7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTEzMjYsMTEgKzEzMzAsMTEgQEAKIAkJfQogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfV1BTX1NUT1A7CiAJCWlmIChwTGVkLT5iTGVkT24pIHsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwotCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfV1BTX1NVQ0VTU19JTlRFUlZBTF9BTFBIQSkpOworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfV1BTX1NVQ0NFU1NfSU5URVJWQUxfQUxQSEEpKTsKIAkJfSBlbHNlIHsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAogCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQl9CkBAIC0xMzQwLDIzICsxMzQ0LDIzIEBACiAJCQlkZWxfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9Ci0JCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAogCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9TVEFSVF9UT19MSU5LOgogCWNhc2UgTEVEX0NUTF9OT19MSU5LOgogCQlpZiAoIUlTX0xFRF9CTElOS0lORyhwTGVkKSkgewotCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAogCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9QT1dFUl9PRkY6Ci0JCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MpIHsKIAkJCWRlbF90aW1lcigmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CkBAIC0xMzkwLDggKzEzOTQsOCBAQAogCQlpZiAocExlZDEtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MpIHsKIAkJCXBMZWQxLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQlkZWxfdGltZXIoJnBMZWQxLT5CbGlua1RpbWVyKTsKLQkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKLQkJCXBMZWQxLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQkJcExlZDEtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQlpZiAocExlZDEtPmJMZWRPbikKIAkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCiAJCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwpAQCAtMTQxMSwxMSArMTQxNSwxMSBAQAogCQkJcExlZC0+YkxlZFN0YXJ0VG9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19TdGFydFRvQmxpbms7CiAJCQlpZiAocExlZC0+YkxlZE9uKSB7Ci0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TTE9XTFlfSU5URVJWQUwpKTsKIAkJCX0gZWxzZSB7Ci0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCQl9CkBAIC0xNDI4LDggKzE0MzIsOCBAQAogCQkJaWYgKHBMZWQxLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKSB7CiAJCQkJcExlZDEtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCQlkZWxfdGltZXIoJnBMZWQxLT5CbGlua1RpbWVyKTsKLQkJCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQkJcExlZDEtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQkJCXBMZWQxLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJCWlmIChwTGVkMS0+YkxlZE9uKQogCQkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCiAJCQkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKQEAgLTE0NDYsOSArMTQ1MCw5IEBACiAJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19TTE9XTFk7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTE0NzIsOSArMTQ3Niw5IEBACiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU0NBTl9CTElOSzsKIAkJCXBMZWQtPkJsaW5rVGltZXMgPSAyNDsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtMTQ5Myw5ICsxNDk3LDkgQEAKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9UWFJYX0JMSU5LOwogCQkJcExlZC0+QmxpbmtUaW1lcyA9IDI7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtMTUwNSw4ICsxNTA5LDggQEAKIAkJaWYgKHBMZWQxLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKSB7CiAJCQlwTGVkMS0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJZGVsX3RpbWVyKCZwTGVkMS0+QmxpbmtUaW1lcik7Ci0JCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQlwTGVkMS0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJCXBMZWQxLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJaWYgKHBMZWQxLT5iTGVkT24pCiAJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAogCQkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKQEAgLTE1MjcsMTEgKzE1MzEsMTEgQEAKIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1dQUzsKIAkJCWlmIChwTGVkLT5iTGVkT24pIHsKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NMT1dMWV9JTlRFUlZBTCkpOwogCQkJfSBlbHNlIHsKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpKTsKIAkJCX0KQEAgLTE1NDUsOSArMTU0OSw5IEBACiAJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfU0xPV0xZOwogCQlpZiAocExlZC0+YkxlZE9uKQotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJZWxzZQotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJYnJlYWs7CkBAIC0xNTU5LDkgKzE1NjMsOSBAQAogCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1NMT1dMWTsKIAkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWVsc2UKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCS8qTEVEMSBzZXR0aW5ncyovCkBAIC0xNTcxLDkgKzE1NzUsOSBAQAogCQkJcExlZDEtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQlwTGVkMS0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1dQU19TVE9QOwogCQlpZiAocExlZDEtPmJMZWRPbikKLQkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJZWxzZQotCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCWJyZWFrOwpAQCAtMTU4NSw5ICsxNTg5LDkgQEAKIAkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19TTE9XTFk7CiAJCWlmIChwTGVkLT5iTGVkT24pCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQllbHNlCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkvKkxFRDEgc2V0dGluZ3MqLwpAQCAtMTU5OCwxNSArMTYwMiwxNSBAQAogCQlwTGVkMS0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1dQU19TVE9QX09WRVJMQVA7CiAJCXBMZWQxLT5CbGlua1RpbWVzID0gMTA7CiAJCWlmIChwTGVkMS0+YkxlZE9uKQotCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQllbHNlCi0JCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1BPV0VSX09GRjoKLQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKLQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CisJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQlpZiAocExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcykgewogCQkJZGVsX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKQEAgLTE2NjAsOCArMTY2NCw4IEBACiAJY2FzZSBMRURfQ1RMX0xJTks6CS8qIHNvbGlkIGJsdWUgKi8KIAkJaWYgKHBMZWQtPkN1cnJMZWRTdGF0ZSA9PSBMRURfU0NBTl9CTElOSykKIAkJCXJldHVybjsKLQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwotCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CisJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAogCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CkBAIC0xNjc5LDkgKzE2ODMsOSBAQAogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NDQU5fQkxJTks7CiAJCQlwTGVkLT5CbGlua1RpbWVzID0gMjQ7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTE2OTUsMTYgKzE2OTksMTYgQEAKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9UWFJYX0JMSU5LOwogCQkJcExlZC0+QmxpbmtUaW1lcyA9IDI7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfUE9XRVJfT0ZGOgotCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwotCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzKSB7CiAJCQlkZWxfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwpAQCAtMTczMSw4ICsxNzM1LDggQEAKIAljYXNlIExFRF9DVExfU0lURV9TVVJWRVk6CiAJCWlmIChJU19MRURfV1BTX0JMSU5LSU5HKHBMZWQpKQogCQkJCXJldHVybjsKLQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwotCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CisJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJbW9kX3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJYnJlYWs7CkBAIC0xNzQ2LDkgKzE3NTAsOSBAQAogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1RYUlhfQkxJTks7CiAJCQlwTGVkLT5CbGlua1RpbWVzID0gMjsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC0xNzYzLDkgKzE3NjcsOSBAQAogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfV1BTOwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC0xNzc2LDE0ICsxNzgwLDE0IEBACiAJCQlkZWxfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9Ci0JCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09OOworCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCiAJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1BPV0VSX09GRjoKLQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKLQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CisJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcykgewogCQkJZGVsX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmMKaW5kZXggZjI1YjM0Yy4uNjZmMGUwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmMKQEAgLTYwLDcgKzYwLDcgQEAKIAlfaW5pdF9xdWV1ZSgmcHJlY3Zwcml2LT5mcmVlX3JlY3ZfYnVmX3F1ZXVlKTsKIAlwcmVjdnByaXYtPnBhbGxvY2F0ZWRfcmVjdl9idWYgPQogCQlremFsbG9jKE5SX1JFQ1ZCVUZGICogc2l6ZW9mKHN0cnVjdCByZWN2X2J1ZikgKyA0LCBHRlBfQVRPTUlDKTsKLQlpZiAocHJlY3Zwcml2LT5wYWxsb2NhdGVkX3JlY3ZfYnVmID09IE5VTEwpCisJaWYgKCFwcmVjdnByaXYtPnBhbGxvY2F0ZWRfcmVjdl9idWYpCiAJCXJldHVybiBfRkFJTDsKIAlwcmVjdnByaXYtPnByZWN2X2J1ZiA9IHByZWN2cHJpdi0+cGFsbG9jYXRlZF9yZWN2X2J1ZiArIDQgLQogCQkJICAgICAgKChhZGRyX3QpIChwcmVjdnByaXYtPnBhbGxvY2F0ZWRfcmVjdl9idWYpICYgMyk7CkBAIC0xNjMsNyArMTYzLDggQEAKIAlkcnZpbmZvX3N6ID0gKGxlMzJfdG9fY3B1KHByeHN0YXQtPnJ4ZHcwKSAmIDB4MDAwZjAwMDApID4+IDE2OwogCWRydmluZm9fc3ogPDw9IDM7CiAJLypUT0RPOgotCSAqIE9mZnNldCAwICovCisJICogT2Zmc2V0IDAKKwkgKi8KIAlwYXR0cmliLT5iZGVjcnlwdGVkID0gKChsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3MCkgJiBCSVQoMjcpKSA+PiAyNykKIAkJCQkgPyAwIDogMTsKIAlwYXR0cmliLT5jcmNfZXJyID0gKGxlMzJfdG9fY3B1KHByeHN0YXQtPnJ4ZHcwKSAmIEJJVCgxNCkpID4+IDE0OwpAQCAtMjEwLDcgKzIxMSw4IEBACiAJY3VyZnJhZ251bSA9IDA7CiAJaWYgKGN1cmZyYWdudW0gIT0gcGZoZHItPmF0dHJpYi5mcmFnX251bSkgewogCQkvKnRoZSBmaXJzdCBmcmFnbWVudCBudW1iZXIgbXVzdCBiZSAwCi0JCSAqZnJlZSB0aGUgd2hvbGUgcXVldWUqLworCQkgKmZyZWUgdGhlIHdob2xlIHF1ZXVlCisJCSAqLwogCQlyODcxMl9mcmVlX3JlY3ZmcmFtZShwcmZyYW1lLCBwZnJlZV9yZWN2X3F1ZXVlKTsKIAkJcjg3MTJfZnJlZV9yZWN2ZnJhbWVfcXVldWUoZGVmcmFnX3EsIHBmcmVlX3JlY3ZfcXVldWUpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTIyNCwxOCArMjI2LDIxIEBACiAJCS8qY2hlY2sgdGhlIGZyYWdtZW50IHNlcXVlbmNlICAoMm5kIH5uIGZyYWdtZW50IGZyYW1lKSAqLwogCQlpZiAoY3VyZnJhZ251bSAhPSBwbmZoZHItPmF0dHJpYi5mcmFnX251bSkgewogCQkJLyogdGhlIGZyYWdtZW50IG51bWJlciBtdXN0IGluY3JlYXNlICAoYWZ0ZXIgZGVjYWNoZSkKLQkJCSAqIHJlbGVhc2UgdGhlIGRlZnJhZ19xICYgcHJmcmFtZSAqLworCQkJICogcmVsZWFzZSB0aGUgZGVmcmFnX3EgJiBwcmZyYW1lCisJCQkgKi8KIAkJCXI4NzEyX2ZyZWVfcmVjdmZyYW1lKHByZnJhbWUsIHBmcmVlX3JlY3ZfcXVldWUpOwogCQkJcjg3MTJfZnJlZV9yZWN2ZnJhbWVfcXVldWUoZGVmcmFnX3EsIHBmcmVlX3JlY3ZfcXVldWUpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAkJY3VyZnJhZ251bSsrOwogCQkvKiBjb3B5IHRoZSAybmR+biBmcmFnbWVudCBmcmFtZSdzIHBheWxvYWQgdG8gdGhlIGZpcnN0IGZyYWdtZW50Ci0JCSAqIGdldCB0aGUgMm5kfmxhc3QgZnJhZ21lbnQgZnJhbWUncyBwYXlsb2FkICovCisJCSAqIGdldCB0aGUgMm5kfmxhc3QgZnJhZ21lbnQgZnJhbWUncyBwYXlsb2FkCisJCSAqLwogCQl3bGFuaGRyX29mZnNldCA9IHBuZmhkci0+YXR0cmliLmhkcmxlbiArIHBuZmhkci0+YXR0cmliLml2X2xlbjsKIAkJcmVjdmZyYW1lX3B1bGwocG5leHRyZnJhbWUsIHdsYW5oZHJfb2Zmc2V0KTsKIAkJLyogYXBwZW5kICB0byBmaXJzdCBmcmFnbWVudCBmcmFtZSdzIHRhaWwgKGlmIHByaXZhY3kgZnJhbWUsCi0JCSAqIHB1bGwgdGhlIElDVikgKi8KKwkJICogcHVsbCB0aGUgSUNWKQorCQkgKi8KIAkJcmVjdmZyYW1lX3B1bGxfdGFpbChwcmZyYW1lLCBwZmhkci0+YXR0cmliLmljdl9sZW4pOwogCQltZW1jcHkocGZoZHItPnJ4X3RhaWwsIHBuZmhkci0+cnhfZGF0YSwgcG5maGRyLT5sZW4pOwogCQlyZWN2ZnJhbWVfcHV0KHByZnJhbWUsIHBuZmhkci0+bGVuKTsKQEAgLTI2OSw3ICsyNzQsNyBAQAogCWZyYWdudW0gPSBwZmhkci0+YXR0cmliLmZyYWdfbnVtOwogCXBzdGFfYWRkciA9IHBmaGRyLT5hdHRyaWIudGE7CiAJcHN0YSA9IHI4NzEyX2dldF9zdGFpbmZvKHBzdGFwcml2LCBwc3RhX2FkZHIpOwotCWlmIChwc3RhID09IE5VTEwpCisJaWYgKCFwc3RhKQogCQlwZGVmcmFnX3EgPSBOVUxMOwogCWVsc2UKIAkJcGRlZnJhZ19xID0gJnBzdGEtPnN0YV9yZWN2cHJpdi5kZWZyYWdfcTsKQEAgLTI3OCw3ICsyODMsOCBAQAogCQlwcnRuZnJhbWUgPSBwcmVjdl9mcmFtZTsvKmlzbid0IGEgZnJhZ21lbnQgZnJhbWUqLwogCWlmIChpc21mcmFnID09IDEpIHsKIAkJLyogMH4obi0xKSBmcmFnbWVudCBmcmFtZQotCQkgKiBlbnF1ZXVlIHRvIGRlZnJhZl9nICovCisJCSAqIGVucXVldWUgdG8gZGVmcmFmX2cKKwkJICovCiAJCWlmIChwZGVmcmFnX3EgIT0gTlVMTCkgewogCQkJaWYgKGZyYWdudW0gPT0gMCkgewogCQkJCS8qdGhlIGZpcnN0IGZyYWdtZW50Ki8KQEAgLTI5NCw3ICszMDAsOCBAQAogCQkJcHJ0bmZyYW1lID0gTlVMTDsKIAkJfSBlbHNlIHsKIAkJCS8qIGNhbid0IGZpbmQgdGhpcyB0YSdzIGRlZnJhZ19xdWV1ZSwgc28gZnJlZSB0aGlzCi0JCQkgKiByZWN2X2ZyYW1lICovCisJCQkgKiByZWN2X2ZyYW1lCisJCQkgKi8KIAkJCXI4NzEyX2ZyZWVfcmVjdmZyYW1lKHByZWN2X2ZyYW1lLCBwZnJlZV9yZWN2X3F1ZXVlKTsKIAkJCXBydG5mcmFtZSA9IE5VTEw7CiAJCX0KQEAgLTMwMiw3ICszMDksOCBAQAogCX0KIAlpZiAoKGlzbWZyYWcgPT0gMCkgJiYgKGZyYWdudW0gIT0gMCkpIHsKIAkJLyogdGhlIGxhc3QgZnJhZ21lbnQgZnJhbWUKLQkJICogZW5xdWV1ZSB0aGUgbGFzdCBmcmFnbWVudCAqLworCQkgKiBlbnF1ZXVlIHRoZSBsYXN0IGZyYWdtZW50CisJCSAqLwogCQlpZiAocGRlZnJhZ19xICE9IE5VTEwpIHsKIAkJCXBoZWFkID0gJnBkZWZyYWdfcS0+cXVldWU7CiAJCQlsaXN0X2FkZF90YWlsKCZwZmhkci0+bGlzdCwgcGhlYWQpOwpAQCAtMzExLDcgKzMxOSw4IEBACiAJCQlwcnRuZnJhbWUgPSBwcmVjdl9mcmFtZTsKIAkJfSBlbHNlIHsKIAkJCS8qIGNhbid0IGZpbmQgdGhpcyB0YSdzIGRlZnJhZ19xdWV1ZSwgc28gZnJlZSB0aGlzCi0JCQkgKiAgcmVjdl9mcmFtZSAqLworCQkJICogIHJlY3ZfZnJhbWUKKwkJCSAqLwogCQkJcjg3MTJfZnJlZV9yZWN2ZnJhbWUocHJlY3ZfZnJhbWUsIHBmcmVlX3JlY3ZfcXVldWUpOwogCQkJcHJ0bmZyYW1lID0gTlVMTDsKIAkJfQpAQCAtMzkxLDcgKzQwMCw4IEBACiAJCSAgIGV0aF90eXBlICE9IEVUSF9QX0FBUlAgJiYgZXRoX3R5cGUgIT0gRVRIX1BfSVBYKSB8fAogCQkgICAhbWVtY21wKHN1Yl9za2ItPmRhdGEsIGJyaWRnZV90dW5uZWxfaGVhZGVyLCBTTkFQX1NJWkUpKSkgewogCQkJLyogcmVtb3ZlIFJGQzEwNDIgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uIGFuZAotCQkJICogcmVwbGFjZSBFdGhlclR5cGUgKi8KKwkJCSAqIHJlcGxhY2UgRXRoZXJUeXBlCisJCQkgKi8KIAkJCXNrYl9wdWxsKHN1Yl9za2IsIFNOQVBfU0laRSk7CiAJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBwYXR0cmliLT5zcmMsCiAJCQkJRVRIX0FMRU4pOwpAQCAtNTMwLDcgKzU0MCw4IEBACiAJCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9IHBhdHRyaWItPnNlcV9udW07CiAJfQogCS8qIFByZXBhcmUgaW5kaWNhdGlvbiBsaXN0IGFuZCBpbmRpY2F0aW9uLgotCSAqIENoZWNrIGlmIHRoZXJlIGlzIGFueSBwYWNrZXQgbmVlZCBpbmRpY2F0ZS4gKi8KKwkgKiBDaGVjayBpZiB0aGVyZSBpcyBhbnkgcGFja2V0IG5lZWQgaW5kaWNhdGUuCisJICovCiAJd2hpbGUgKCFsaXN0X2VtcHR5KHBoZWFkKSkgewogCQlwcmZyYW1lID0gY29udGFpbmVyX29mKHBsaXN0LCB1bmlvbiByZWN2X2ZyYW1lLCB1Lmxpc3QpOwogCQlwYXR0cmliID0gJnByZnJhbWUtPnUuaGRyLmF0dHJpYjsKQEAgLTc1Nyw3ICs3NjgsOCBAQAogCQkJLyogTW9kaWZ5IHRoZSBSRiBSTkEgZ2FpbiB2YWx1ZSB0byAtNDAsIC0yMCwKIAkJCSAqIC0yLCAxNCBieSBKZW55dSdzIHN1Z2dlc3Rpb24KIAkJCSAqIE5vdGU6IGRpZmZlcmVudCBSRiB3aXRoIHRoZSBkaWZmZXJlbnQKLQkJCSAqIFJOQSBnYWluLiAqLworCQkJICogUk5BIGdhaW4uCisJCQkgKi8KIAkJCWNhc2UgMHgzOgogCQkJCXJ4X3B3cl9hbGwgPSAtNDAgLSAocGNja19idWYtPmNja19hZ2NfcnB0ICYKIAkJCQkJICAgICAweDNlKTsKQEAgLTg0Miw3ICs4NTQsOCBAQAogCQkJdG90YWxfcnNzaSArPSByc3NpOwogCQl9CiAJCS8qICgyKVBXREIsIEF2ZXJhZ2UgUFdEQiBjYWNsdWF0ZWQgYnkgaGFyZHdhcmUgKGZvcgotCQkgKiByYXRlIGFkYXB0aXZlKSAqLworCQkgKiByYXRlIGFkYXB0aXZlKQorCQkgKi8KIAkJcnhfcHdyX2FsbCA9ICgoKHBwaHlfaGVhZFtQSFlfU1RBVF9QV0RCX0FMTF9TSFRdKSA+PiAxKSAmIDB4N2YpCiAJCQkgICAgIC0gMTA2OwogCQlwd2RiX2FsbCA9IHF1ZXJ5X3J4X3B3cl9wZXJjZW50YWdlKHJ4X3B3cl9hbGwpOwpAQCAtODcwLDcgKzg4Myw4IEBACiAJfQogCS8qIFVJIEJTUyBMaXN0IHNpZ25hbCBzdHJlbmd0aChpbiBwZXJjZW50YWdlKSwgbWFrZSBpdCBnb29kIGxvb2tpbmcsCiAJICogZnJvbSAwfjEwMC4gSXQgaXMgYXNzaWduZWQgdG8gdGhlIEJTUyBMaXN0IGluCi0JICogR2V0VmFsdWVGcm9tQmVhY29uT3JQcm9iZVJzcCgpLiAqLworCSAqIEdldFZhbHVlRnJvbUJlYWNvbk9yUHJvYmVSc3AoKS4KKwkgKi8KIAlpZiAoYmNja19yYXRlKQogCQlwcmZyYW1lLT51Lmhkci5hdHRyaWIuc2lnbmFsX3N0cmVuZ3RoID0KIAkJCSAodTgpcjg3MTJfc2lnbmFsX3NjYWxlX21hcHBpbmcocHdkYl9hbGwpOwpAQCAtOTg1LDE1ICs5OTksMTUgQEAKIAl9CiAJcHJvY2Vzc19waHlfaW5mbyhwYWRhcHRlciwgcHJmcmFtZSk7CiAJcHJmcmFtZSA9IHI4NzEyX2RlY3J5cHRvcihwYWRhcHRlciwgcHJmcmFtZSk7Ci0JaWYgKHByZnJhbWUgPT0gTlVMTCkgeworCWlmICghcHJmcmFtZSkgewogCQlyZXR2YWwgPSBfRkFJTDsKIAkJZ290byBfZXhpdF9yZWN2X2Z1bmM7CiAJfQogCXByZnJhbWUgPSByODcxMl9yZWN2ZnJhbWVfY2hrX2RlZnJhZyhwYWRhcHRlciwgcHJmcmFtZSk7Ci0JaWYgKHByZnJhbWUgPT0gTlVMTCkKKwlpZiAoIXByZnJhbWUpCiAJCWdvdG8gX2V4aXRfcmVjdl9mdW5jOwogCXByZnJhbWUgPSByODcxMl9wb3J0Y3RybChwYWRhcHRlciwgcHJmcmFtZSk7Ci0JaWYgKHByZnJhbWUgPT0gTlVMTCkgeworCWlmICghcHJmcmFtZSkgewogCQlyZXR2YWwgPSBfRkFJTDsKIAkJZ290byBfZXhpdF9yZWN2X2Z1bmM7CiAJfQpAQCAtMTAyNywxMCArMTA0MSwxMiBAQAogCXRyYW5zZmVyX2xlbiA9IHBza2ItPmxlbjsKIAkvKiBUZXN0IHRocm91Z2hwdXQgd2l0aCBOZXRnZWFyIDM3MDAgKE5vIHNlY3VyaXR5KSB3aXRoIENoYXJpb3QgM1QzUgogCSAqIHBhaXJzLiBUaGUgcGFja2V0IGNvdW50IHdpbGwgYmUgYSBiaWcgbnVtYmVyIHNvIHRoYXQgdGhlIGNvbnRhaW5pbmcKLQkgKiBwYWNrZXQgd2lsbCBlZmZlY3QgdGhlIFJ4IHJlb3JkZXJpbmcuICovCisJICogcGFja2V0IHdpbGwgZWZmZWN0IHRoZSBSeCByZW9yZGVyaW5nLgorCSAqLwogCWlmICh0cmFuc2Zlcl9sZW4gPCBwa3RfbGVuKSB7CiAJCS8qIEluIHRoaXMgY2FzZSwgaXQgbWVhbnMgdGhlIE1BWF9SRUNWQlVGX1NaIGlzIHRvbyBzbWFsbCB0bwotCQkgKiBnZXQgdGhlIGRhdGEgZnJvbSA4NzEydS4gKi8KKwkJICogZ2V0IHRoZSBkYXRhIGZyb20gODcxMnUuCisJCSAqLwogCQlyZXR1cm4gX0ZBSUw7CiAJfQogCWRvIHsKQEAgLTEwNDksNyArMTA2NSw3IEBACiAJCWlmICgobGUzMl90b19jcHUocHJ4c3RhdC0+cnhkdzApID4+IDIzKSAmIDB4MDEpCiAJCQlzaGlmdF9zeiA9IDI7CiAJCXByZWN2ZnJhbWUgPSByODcxMl9hbGxvY19yZWN2ZnJhbWUocGZyZWVfcmVjdl9xdWV1ZSk7Ci0JCWlmIChwcmVjdmZyYW1lID09IE5VTEwpCisJCWlmICghcHJlY3ZmcmFtZSkKIAkJCWdvdG8gIF9leGl0X3JlY3ZidWYycmVjdmZyYW1lOwogCQlJTklUX0xJU1RfSEVBRCgmcHJlY3ZmcmFtZS0+dS5oZHIubGlzdCk7CiAJCXByZWN2ZnJhbWUtPnUuaGRyLnByZWN2YnVmID0gTlVMTDsgLypjYW4ndCBhY2Nlc3MgdGhlIHByZWN2YnVmKi8KQEAgLTEwNTcsMTQgKzEwNzMsMTYgQEAKIAkJdG1wX2xlbiA9IHBrdF9sZW4gKyBkcnZpbmZvX3N6ICsgUlhERVNDX1NJWkU7CiAJCXBrdF9vZmZzZXQgPSAodTE2KXJvdW5kX3VwKHRtcF9sZW4sIDEyOCk7CiAJCS8qIGZvciBmaXJzdCBmcmFnbWVudCBwYWNrZXQsIGRyaXZlciBuZWVkIGFsbG9jYXRlIDE1MzYgKwotCQkgKiBkcnZpbmZvX3N6ICsgUlhERVNDX1NJWkUgdG8gZGVmcmFnIHBhY2tldC4gKi8KKwkJICogZHJ2aW5mb19zeiArIFJYREVTQ19TSVpFIHRvIGRlZnJhZyBwYWNrZXQuCisJCSAqLwogCQlpZiAoKG1mID09IDEpICYmIChmcmFnID09IDApKQogCQkJLyoxNjU4KzY9MTY2NCwgMTY2NCBpcyAxMjggYWxpZ25tZW50LiovCiAJCQlhbGxvY19zeiA9IG1heF90KHUxNiwgdG1wX2xlbiwgMTY1OCk7CiAJCWVsc2UKIAkJCWFsbG9jX3N6ID0gdG1wX2xlbjsKIAkJLyogMiBpcyBmb3IgSVAgaGVhZGVyIDQgYnl0ZXMgYWxpZ25tZW50IGluIFFvUyBwYWNrZXQgY2FzZS4KLQkJICogNCBpcyBmb3Igc2tiLT5kYXRhIDQgYnl0ZXMgYWxpZ25tZW50LiAqLworCQkgKiA0IGlzIGZvciBza2ItPmRhdGEgNCBieXRlcyBhbGlnbm1lbnQuCisJCSAqLwogCQlhbGxvY19zeiArPSA2OwogCQlwa3RfY29weSA9IG5ldGRldl9hbGxvY19za2IocGFkYXB0ZXItPnBuZXRkZXYsIGFsbG9jX3N6KTsKIAkJaWYgKHBrdF9jb3B5KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlY3YuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVjdi5oCmluZGV4IGZkOWUzZmMuLjBiMGMyNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVjdi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVjdi5oCkBAIC02MSw3ICs2MSw4IEBACiBzdHJ1Y3QgcGh5X2Nja19yeF9zdGF0dXMgewogCS8qIEZvciBDQ0sgcmF0ZSBkZXNjcmlwdG9yLiBUaGlzIGlzIGEgdW5zaWduZWQgODoxIHZhcmlhYmxlLgogCSAqIExTQiBiaXQgcHJlc2VudCAwLjUuIEFuZCBNU0IgNyBidHMgcHJlc2VudCBhIHNpZ25lZCB2YWx1ZS4KLQkgKiBSYW5nZSBmcm9tIC02NH4rNjMuNS4gKi8KKwkgKiBSYW5nZSBmcm9tIC02NH4rNjMuNS4KKwkgKi8KIAl1OAlhZGNfcHdkYl9YWzRdOwogCXU4CXNxX3JwdDsKIAl1OAljY2tfYWdjX3JwdDsKQEAgLTEwMyw3ICsxMDQsNiBAQAogCXN0cnVjdCBfYWRhcHRlciAgKmFkYXB0ZXI7CiAJc3RydWN0IHVyYiAqcHVyYjsKIAlfcGt0ICpwc2tiOwotCXU4IHJldXNlOwogCXU4ICBpcnBfcGVuZGluZzsKIAl1MzIgIHRyYW5zZmVyX2xlbjsKIAl1aW50ICBsZW47CkBAIC0xMTYsMTMgKzExNiwxMyBAQAogfTsKIAogLyoKLQloZWFkICAtLS0tLT4KLQkJZGF0YSAgLS0tLS0+Ci0JCQlwYXlsb2FkCi0JCXRhaWwgIC0tLS0tPgotCWVuZCAgIC0tLS0tPgotCWxlbiA9ICh1bnNpZ25lZCBpbnQgKSh0YWlsIC0gZGF0YSk7Ci0qLworICoJaGVhZCAgLS0tLS0+CisgKgkJZGF0YSAgLS0tLS0+CisgKgkJCXBheWxvYWQKKyAqCQl0YWlsICAtLS0tLT4KKyAqCWVuZCAgIC0tLS0tPgorICoJbGVuID0gKHVuc2lnbmVkIGludCApKHRhaWwgLSBkYXRhKTsKKyAqLwogc3RydWN0IHJlY3ZfZnJhbWVfaGRyIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJX3BrdAkqcGt0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9zcGVjLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3NwZWMuaAppbmRleCBhZjExYjQ0Li41MWUwNDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3NwZWMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3NwZWMuaApAQCAtODMsNyArODMsOCBAQAogCiAjZGVmaW5lIENNRF9BRERSX01BUFBJTkdfU0hJRlQJCTIJLypTRElPIENNRCBBRERSIE1BUFBJTkcsCiAJCQkJCQkgKnNoaWZ0IDIgYml0IGZvciBtYXRjaAotCQkJCQkJICogb2Zmc2V0WzE0OjJdKi8KKwkJCQkJCSAqIG9mZnNldFsxNDoyXQorCQkJCQkJICovCiAKIC8qT2Zmc2V0IGZvciBTRElPIExPQ0FMKi8KICNkZWZpbmUJT0ZGU0VUX1NESU9fTE9DQUwJCQkJMHgwRkZGCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3N5c2NmZ19iaXRkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfc3lzY2ZnX2JpdGRlZi5oCmluZGV4IGVlZDA5YzguLjJlNjZkMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfc3lzY2ZnX2JpdGRlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfc3lzY2ZnX2JpdGRlZi5oCkBAIC02OCwxMSArNjgsMTMgQEAKICNkZWZpbmUgU1lTX0NMS1NFTAkJQklUKFNZU19DTEtTRUxfU0hUKSAvKiBTeXN0ZW0gQ2xvY2sgODBNSHoqLwogI2RlZmluZSBQU19DTEtTRUxfU0hUCQkxCiAjZGVmaW5lIFBTX0NMS1NFTAkJQklUKFBTX0NMS1NFTF9TSFQpIC8qU3lzdGVtIHBvd2VyIHNhdmUKLQkJCQkJCSAgICAqIGNsb2NrIHNlbGVjdC4qLworCQkJCQkJICAgICogY2xvY2sgc2VsZWN0LgorCQkJCQkJICAgICovCiAjZGVmaW5lIENQVV9DTEtTRUxfU0hUCQkyCiAjZGVmaW5lIENQVV9DTEtTRUwJCUJJVChDUFVfQ0xLU0VMX1NIVCkgLyogU3lzdGVtIENsb2NrIHNlbGVjdCwKIAkJCQkJCSAgICAgKiAxOiBBRkUgc291cmNlLAotCQkJCQkJICAgICAqIDA6IFN5c3RlbSBjbG9jayhMLUJ1cykqLworCQkJCQkJICAgICAqIDA6IFN5c3RlbSBjbG9jayhMLUJ1cykKKwkJCQkJCSAgICAgKi8KICNkZWZpbmUgSU5UMzJLX0VOX1NIVAkJMwogI2RlZmluZSBJTlQzMktfRU4JCUJJVChJTlQzMktfRU5fU0hUKQogI2RlZmluZSBNQUNTTFBfU0hUCQk0CkBAIC04NSwxMCArODcsMTIgQEAKICNkZWZpbmUgUklOR19DTEtfRU4JCUJJVChSSU5HX0NMS19FTl9TSFQpCiAjZGVmaW5lIFNXSFdfU0VMX1NIVAkJMTQKICNkZWZpbmUgU1dIV19TRUwJCUJJVChTV0hXX1NFTF9TSFQpIC8qIExvYWQgZG9uZSwKLQkJCQkJCSAgICogY29udHJvbCBwYXRoIHN3aXRjaC4qLworCQkJCQkJICAgKiBjb250cm9sIHBhdGggc3dpdGNoLgorCQkJCQkJICAgKi8KICNkZWZpbmUgRldIV19TRUxfU0hUCQkxNQogI2RlZmluZSBGV0hXX1NFTAkJQklUKEZXSFdfU0VMX1NIVCkgLyogU2xlZXAgZXhpdCwKLQkJCQkJCSAgICogY29udHJvbCBwYXRoIHN3aXRjaC4qLworCQkJCQkJICAgKiBjb250cm9sIHBhdGggc3dpdGNoLgorCQkJCQkJICAgKi8KIAogLyo5MzQ2Q1IqLwogI2RlZmluZQlfVlBESURYX01TSwkJMHhGRjAwCkBAIC0xMTgsMTAgKzEyMiwxMiBAQAogI2RlZmluZQlBRkVfTUlTQ19FMzJfRU4JCUJJVChBRkVfTUlTQ19FMzJfRU5fU0hUKQogI2RlZmluZQlBRkVfTUlTQ19NQkVOX1NIVAkxCiAjZGVmaW5lCUFGRV9NSVNDX01CRU4JCUJJVChBRkVfTUlTQ19NQkVOX1NIVCkvKiBFbmFibGUgQUZFIE1hY3JvCi0JCQkJCQkgICAgICAgKiBCbG9jaydzIE1iaWFzLiovCisJCQkJCQkgICAgICAgKiBCbG9jaydzIE1iaWFzLgorCQkJCQkJICAgICAgICovCiAjZGVmaW5lCUFGRV9NSVNDX0JHRU5fU0hUCTAKICNkZWZpbmUJQUZFX01JU0NfQkdFTgkJQklUKEFGRV9NSVNDX0JHRU5fU0hUKS8qIEVuYWJsZSBBRkUgTWFjcm8KLQkJCQkJCSAgICAgICAqIEJsb2NrJ3MgQmFuZGdhcC4qLworCQkJCQkJICAgICAgICogQmxvY2sncyBCYW5kZ2FwLgorCQkJCQkJICAgICAgICovCiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xNDksMTAgKzE1NSwxMiBAQAogCiAvKiBFRlVTRV9DVFJMKi8KICNkZWZpbmUgRUZfRkxBRwkJCUJJVCgzMSkJCS8qIEFjY2VzcyBGbGFnLCBXcml0ZToxOwotCQkJCQkJICoJICAgICAgICBSZWFkOjAqLworCQkJCQkJICoJICAgICAgICBSZWFkOjAKKwkJCQkJCSAqLwogI2RlZmluZSBFRl9QR1BECQkJMHg3MDAwMDAwMAkvKiBFLWZ1c2UgUHJvZ3JhbSB0aW1lKi8KICNkZWZpbmUgRUZfUkRUCQkJMHgwRjAwMDAwMAkvKiBFLWZ1c2UgcmVhZCB0aW1lOiBpbiB0aGUKLQkJCQkJCSAqIHVuaXQgb2YgY3ljbGUgdGltZSovCisJCQkJCQkgKiB1bml0IG9mIGN5Y2xlIHRpbWUKKwkJCQkJCSAqLwogI2RlZmluZSBFRl9QRE5fRU4JCUJJVCgxOSkJCS8qIEVGdXNlIFBvd2VyIGRvd24gZW5hYmxlKi8KICNkZWZpbmUgQUxEX0VOCQkJQklUKDE4KQkJLyogQXV0b2xvYWQgRW5hYmxlKi8KICNkZWZpbmUgRUZfQUREUgkJCTB4MDAwM0ZGMDAJLyogQWNjZXNzIEFkZHJlc3MqLwpAQCAtMTY0LDcgKzE3Miw4IEBACiAvKiBFRlVTRV9DTEtfQ1RSTCovCiAjZGVmaW5lIEVGVVNFX0NMS19FTgkJQklUKDEpCQkvKiBFLUZ1c2UgQ2xvY2sgRW5hYmxlKi8KICNkZWZpbmUgRUZVU0VfQ0xLX1NFTAkJQklUKDApCQkvKiBFLUZ1c2UgQ2xvY2sgU2VsZWN0LAotCQkJCQkJICogMDo1MDBLLCAxOjQwTSovCisJCQkJCQkgKiAwOjUwMEssIDE6NDBNCisJCQkJCQkgKi8KIAogI2VuZGlmCS8qX19SVEw4NzEyX1NZU0NGR19CSVRERUZfSF9fKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl94bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3htaXQuYwppbmRleCA3ZTBiOTQ1Li5jNGYwM2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3htaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3htaXQuYwpAQCAtNTM1LDcgKzUzNSw4IEBACiAJCSAqIHNlcW51bSBwZXIgdGlkLiBhYm91dCB1c2IgdXNpbmcgNC1lbmRwb2ludCwgcXNlbCBwb2ludHMgb3V0CiAJCSAqIHRoZSBjb3JyZWN0IG1hcHBpbmcgYmV0d2VlbiBBQyZFbmRwb2ludCwKIAkJICogdGhlIHB1cnBvc2UgaXMgdGhhdCBjb3JyZWN0IG1hcHBpbmcgbGV0cyB0aGUgTUFDIHJlbGVhc2UKLQkJICogdGhlIEFDIFF1ZXVlIGxpc3QgY29ycmVjdGx5LiAqLworCQkgKiB0aGUgQUMgUXVldWUgbGlzdCBjb3JyZWN0bHkuCisJCSAqLwogCQlwdHhkZXNjLT50eGR3MyA9IGNwdV90b19sZTMyKChwYXR0cmliLT5wcmlvcml0eSA8PCBTRVFfU0hUKSAmCiAJCQkJIDB4MGZmZjAwMDApOwogCQlpZiAoKHBhdHRyaWItPmV0aGVyX3R5cGUgIT0gMHg4ODhlKSAmJgpAQCAtNTg2LDcgKzU4Nyw4IEBACiAJCSAqIHBlciB0aWQuIGFib3V0IHVzYiB1c2luZyA0LWVuZHBvaW50LCBxc2VsIHBvaW50cyBvdXQgdGhlCiAJCSAqIGNvcnJlY3QgbWFwcGluZyBiZXR3ZWVuIEFDJkVuZHBvaW50LAogCQkgKiB0aGUgcHVycG9zZSBpcyB0aGF0IGNvcnJlY3QgbWFwcGluZyBsZXQgdGhlIE1BQyByZWxlYXNlcwotCQkgKiB0aGUgQUMgUXVldWUgbGlzdCBjb3JyZWN0bHkuICovCisJCSAqIHRoZSBBQyBRdWV1ZSBsaXN0IGNvcnJlY3RseS4KKwkJICovCiAJCXB0eGRlc2MtPnR4ZHczID0gY3B1X3RvX2xlMzIoKHBhdHRyaWItPnByaW9yaXR5IDw8IFNFUV9TSFQpICYKIAkJCQkJICAgICAgMHgwZmZmMDAwMCk7CiAJCS8qIG9mZnNldCAxNiAqLwpAQCAtNjI3LDcgKzYyOSw3IEBACiAKIAlwaHd4bWl0cyA9IHB4bWl0cHJpdi0+aHd4bWl0czsKIAlod2VudHJ5ID0gcHhtaXRwcml2LT5od3htaXRfZW50cnk7Ci0JaWYgKHB4bWl0YnVmID09IE5VTEwpIHsKKwlpZiAoIXB4bWl0YnVmKSB7CiAJCXB4bWl0YnVmID0gcjg3MTJfYWxsb2NfeG1pdGJ1ZihweG1pdHByaXYpOwogCQlpZiAoIXB4bWl0YnVmKQogCQkJcmV0dXJuIGZhbHNlOwpAQCAtNjg2LDcgKzY4OCw4IEBACiAJCQkJcmVzID0gcjg3MTJfeG1pdGZyYW1lX2NvYWxlc2NlKHBhZGFwdGVyLAogCQkJCQlweG1pdGZyYW1lLT5wa3QsIHB4bWl0ZnJhbWUpOwogCQkJLyogYWx3YXlzIHJldHVybiBuZGlzX3BhY2tldCBhZnRlcgotCQkJICogcjg3MTJfeG1pdGZyYW1lX2NvYWxlc2NlICovCisJCQkgKiByODcxMl94bWl0ZnJhbWVfY29hbGVzY2UKKwkJCSAqLwogCQkJcjg3MTJfeG1pdF9jb21wbGV0ZShwYWRhcHRlciwgcHhtaXRmcmFtZSk7CiAJCX0KIAkJaWYgKHJlcyA9PSBfU1VDQ0VTUykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2NtZC5jCmluZGV4IGFlZDAzY2YuLmI3ZWU1ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9jbWQuYwpAQCAtNTEsMTQgKzUxLDE0IEBACiAjaW5jbHVkZSAibWxtZV9vc2RlcC5oIgogCiAvKgotQ2FsbGVyIGFuZCB0aGUgcjg3MTJfY21kX3RocmVhZCBjYW4gcHJvdGVjdCBjbWRfcSBieSBzcGluX2xvY2suCi1ObyBpcnFzYXZlIGlzIG5lY2Vzc2FyeS4KLSovCisgKiBDYWxsZXIgYW5kIHRoZSByODcxMl9jbWRfdGhyZWFkIGNhbiBwcm90ZWN0IGNtZF9xIGJ5IHNwaW5fbG9jay4KKyAqIE5vIGlycXNhdmUgaXMgbmVjZXNzYXJ5LgorICovCiAKIHN0YXRpYyBzaW50IF9pbml0X2NtZF9wcml2KHN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYpCiB7Ci0Jc2VtYV9pbml0KCYocGNtZHByaXYtPmNtZF9xdWV1ZV9zZW1hKSwgMCk7Ci0Jc2VtYV9pbml0KCYocGNtZHByaXYtPnRlcm1pbmF0ZV9jbWR0aHJlYWRfc2VtYSksIDApOworCWluaXRfY29tcGxldGlvbigmcGNtZHByaXYtPmNtZF9xdWV1ZV9jb21wKTsKKwlpbml0X2NvbXBsZXRpb24oJnBjbWRwcml2LT50ZXJtaW5hdGVfY21kdGhyZWFkX2NvbXApOwogCiAJX2luaXRfcXVldWUoJihwY21kcHJpdi0+Y21kX3F1ZXVlKSk7CiAKQEAgLTY2LDEzICs2NiwxMyBAQAogCXBjbWRwcml2LT5jbWRfc2VxID0gMTsKIAlwY21kcHJpdi0+Y21kX2FsbG9jYXRlZF9idWYgPSBrbWFsbG9jKE1BWF9DTURTWiArIENNREJVRkZfQUxJR05fU1osCiAJCQkJCSAgICAgIEdGUF9BVE9NSUMpOwotCWlmIChwY21kcHJpdi0+Y21kX2FsbG9jYXRlZF9idWYgPT0gTlVMTCkKKwlpZiAoIXBjbWRwcml2LT5jbWRfYWxsb2NhdGVkX2J1ZikKIAkJcmV0dXJuIF9GQUlMOwogCXBjbWRwcml2LT5jbWRfYnVmID0gcGNtZHByaXYtPmNtZF9hbGxvY2F0ZWRfYnVmICArICBDTURCVUZGX0FMSUdOX1NaIC0KIAkJCSAgICAoKGFkZHJfdCkocGNtZHByaXYtPmNtZF9hbGxvY2F0ZWRfYnVmKSAmCiAJCQkgICAgKENNREJVRkZfQUxJR05fU1ogLSAxKSk7CiAJcGNtZHByaXYtPnJzcF9hbGxvY2F0ZWRfYnVmID0ga21hbGxvYyhNQVhfUlNQU1ogKyA0LCBHRlBfQVRPTUlDKTsKLQlpZiAocGNtZHByaXYtPnJzcF9hbGxvY2F0ZWRfYnVmID09IE5VTEwpCisJaWYgKCFwY21kcHJpdi0+cnNwX2FsbG9jYXRlZF9idWYpCiAJCXJldHVybiBfRkFJTDsKIAlwY21kcHJpdi0+cnNwX2J1ZiA9IHBjbWRwcml2LT5yc3BfYWxsb2NhdGVkX2J1ZiAgKyAgNCAtCiAJCQkgICAgKChhZGRyX3QpKHBjbWRwcml2LT5yc3BfYWxsb2NhdGVkX2J1ZikgJiAzKTsKQEAgLTg4LDcgKzg4LDcgQEAKIAlwZXZ0cHJpdi0+ZXZlbnRfc2VxID0gMDsKIAlwZXZ0cHJpdi0+ZXZ0X2FsbG9jYXRlZF9idWYgPSBrbWFsbG9jKE1BWF9FVlRTWiArIDQsIEdGUF9BVE9NSUMpOwogCi0JaWYgKHBldnRwcml2LT5ldnRfYWxsb2NhdGVkX2J1ZiA9PSBOVUxMKQorCWlmICghcGV2dHByaXYtPmV2dF9hbGxvY2F0ZWRfYnVmKQogCQlyZXR1cm4gX0ZBSUw7CiAJcGV2dHByaXYtPmV2dF9idWYgPSBwZXZ0cHJpdi0+ZXZ0X2FsbG9jYXRlZF9idWYgICsgIDQgLQogCQkJICAgICgoYWRkcl90KShwZXZ0cHJpdi0+ZXZ0X2FsbG9jYXRlZF9idWYpICYgMyk7CkBAIC0xMTAsMjAgKzExMCwyMCBAQAogfQogCiAvKgotQ2FsbGluZyBDb250ZXh0OgotCi1fZW5xdWV1ZV9jbWQgY2FuIG9ubHkgYmUgY2FsbGVkIGJldHdlZW4ga2VybmVsIHRocmVhZCwKLXNpbmNlIG9ubHkgc3Bpbl9sb2NrIGlzIHVzZWQuCi0KLUlTUi9DYWxsLUJhY2sgZnVuY3Rpb25zIGNhbid0IGNhbGwgdGhpcyBzdWItZnVuY3Rpb24uCi0KLSovCisgKiBDYWxsaW5nIENvbnRleHQ6CisgKgorICogX2VucXVldWVfY21kIGNhbiBvbmx5IGJlIGNhbGxlZCBiZXR3ZWVuIGtlcm5lbCB0aHJlYWQsCisgKiBzaW5jZSBvbmx5IHNwaW5fbG9jayBpcyB1c2VkLgorICoKKyAqIElTUi9DYWxsLUJhY2sgZnVuY3Rpb25zIGNhbid0IGNhbGwgdGhpcyBzdWItZnVuY3Rpb24uCisgKgorICovCiAKIHN0YXRpYyBzaW50IF9lbnF1ZXVlX2NtZChzdHJ1Y3QgIF9fcXVldWUgKnF1ZXVlLCBzdHJ1Y3QgY21kX29iaiAqb2JqKQogewogCXVuc2lnbmVkIGxvbmcgaXJxTDsKIAotCWlmIChvYmogPT0gTlVMTCkKKwlpZiAoIW9iaikKIAkJcmV0dXJuIF9TVUNDRVNTOwogCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+bG9jaywgaXJxTCk7CiAJbGlzdF9hZGRfdGFpbCgmb2JqLT5saXN0LCAmcXVldWUtPnF1ZXVlKTsKQEAgLTE3Miw3ICsxNzIsNyBAQAogCWlmIChwY21kcHJpdi0+cGFkYXB0ZXItPmVlcHJvbXByaXYuYmF1dG9sb2FkX2ZhaWxfZmxhZykKIAkJcmV0dXJuIF9GQUlMOwogCXJlcyA9IF9lbnF1ZXVlX2NtZCgmcGNtZHByaXYtPmNtZF9xdWV1ZSwgb2JqKTsKLQl1cCgmcGNtZHByaXYtPmNtZF9xdWV1ZV9zZW1hKTsKKwljb21wbGV0ZSgmcGNtZHByaXYtPmNtZF9xdWV1ZV9jb21wKTsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC0xODEsNyArMTgxLDcgQEAKIAl1bnNpZ25lZCBsb25nIGlycUw7CiAJc3RydWN0ICBfX3F1ZXVlICpxdWV1ZTsKIAotCWlmIChvYmogPT0gTlVMTCkKKwlpZiAoIW9iaikKIAkJcmV0dXJuIF9TVUNDRVNTOwogCWlmIChwY21kcHJpdi0+cGFkYXB0ZXItPmVlcHJvbXByaXYuYmF1dG9sb2FkX2ZhaWxfZmxhZykKIAkJcmV0dXJuIF9GQUlMOwpAQCAtMTg5LDcgKzE4OSw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT5sb2NrLCBpcnFMKTsKIAlsaXN0X2FkZF90YWlsKCZvYmotPmxpc3QsICZxdWV1ZS0+cXVldWUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlLT5sb2NrLCBpcnFMKTsKLQl1cCgmcGNtZHByaXYtPmNtZF9xdWV1ZV9zZW1hKTsKKwljb21wbGV0ZSgmcGNtZHByaXYtPmNtZF9xdWV1ZV9jb21wKTsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKQEAgLTIxMSwxMSArMjExLDExIEBACiB9CiAKIC8qCi1yODcxMl9zaXRlc3VydmV5X2NtZCh+KQotCSMjIyBOT1RFOiMjIyMgKCEhISEpCi0JTVVTVCBUQUtFIENBUkUgVEhBVCBCRUZPUkUgQ0FMTElORyBUSElTIEZVTkMsCi0JIFlPVSBTSE9VTEQgSEFWRSBMT0NLRUQgcG1sbWVwcml2LT5sb2NrCi0qLworICoJcjg3MTJfc2l0ZXN1cnZleV9jbWQofikKKyAqCQkjIyMgTk9URTojIyMjICghISEhKQorICoJCU1VU1QgVEFLRSBDQVJFIFRIQVQgQkVGT1JFIENBTExJTkcgVEhJUyBGVU5DLAorICoJCVlPVSBTSE9VTEQgSEFWRSBMT0NLRUQgcG1sbWVwcml2LT5sb2NrCisgKi8KIHU4IHI4NzEyX3NpdGVzdXJ2ZXlfY21kKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsCiAJCQlzdHJ1Y3QgbmRpc184MDJfMTFfc3NpZCAqcHNzaWQpCiB7CkBAIC00NzcsNyArNDc3LDcgQEAKIAkJfQogCX0KIAlwc2VjbmV0d29yayA9ICZwc2VjdXJpdHlwcml2LT5zZWNfYnNzOwotCWlmIChwc2VjbmV0d29yayA9PSBOVUxMKSB7CisJaWYgKCFwc2VjbmV0d29yaykgewogCQlrZnJlZShwY21kKTsKIAkJcmV0dXJuIF9GQUlMOwogCX0KQEAgLTQ5MSw4ICs0OTEsOSBAQAogCQltZW1jcHkoJnBzZWN1cml0eXByaXYtPmF1dGhlbnRpY2F0b3JfaWVbMV0sCiAJCQkmcHNlY25ldHdvcmstPklFc1sxMl0sICgyNTYgLSAxKSk7CiAJcHNlY25ldHdvcmstPklFTGVuZ3RoID0gMDsKLQkvKiBJZiB0aGUgZHJpdmVyIHdhbnRzIHRvIHVzZSB0aGUgYnNzaWQgdG8gY3JlYXRlIHRoZSBjb25uZWN0aW9uLgotCSAqIElmIG5vdCwgIHdlIGNvcHkgdGhlIGNvbm5lY3RpbmcgQVAncyBNQUMgYWRkcmVzcyB0byBpdCBzbyB0aGF0CisJLyoKKwkgKiBJZiB0aGUgZHJpdmVyIHdhbnRzIHRvIHVzZSB0aGUgYnNzaWQgdG8gY3JlYXRlIHRoZSBjb25uZWN0aW9uLgorCSAqIElmIG5vdCwgd2UgY29weSB0aGUgY29ubmVjdGluZyBBUCdzIE1BQyBhZGRyZXNzIHRvIGl0IHNvIHRoYXQKIAkgKiB0aGUgZHJpdmVyIGp1c3QgaGFzIHRoZSBic3NpZCBpbmZvcm1hdGlvbiBmb3IgUE1LSURMaXN0IHNlYXJjaGluZy4KIAkgKi8KIAlpZiAoIXBtbG1lcHJpdi0+YXNzb2NfYnlfYnNzaWQpCkBAIC01MTksNyArNTIwLDggQEAKIAkJfQogCX0KIAlpZiAocHJlZ2lzdHJ5cHJpdi0+aHRfZW5hYmxlKSB7Ci0JCS8qIEZvciBXRVAgbW9kZSwgd2Ugd2lsbCB1c2UgdGhlIGJnIG1vZGUgdG8gZG8gdGhlIGNvbm5lY3Rpb24KKwkJLyoKKwkJICogRm9yIFdFUCBtb2RlLCB3ZSB3aWxsIHVzZSB0aGUgYmcgbW9kZSB0byBkbyB0aGUgY29ubmVjdGlvbgogCQkgKiB0byBhdm9pZCBzb21lIElPVCBpc3N1ZXMsIGVzcGVjaWFsbHkgZm9yIFJlYWx0ZWsgODE5MnUKIAkJICogU29mdEFQLgogCQkgKi8KQEAgLTg4MiwxNiArODg0LDE2IEBACiAJCWlmICghcHN0YSkgewogCQkJcHN0YSA9IHI4NzEyX2FsbG9jX3N0YWluZm8oJnBhZGFwdGVyLT5zdGFwcml2LAogCQkJCQkJICAgcG5ldHdvcmstPk1hY0FkZHJlc3MpOwotCQkJaWYgKHBzdGEgPT0gTlVMTCkKKwkJCWlmICghcHN0YSkKIAkJCQlnb3RvIGNyZWF0ZWJzc19jbWRfZmFpbDsKIAkJfQogCQlyODcxMl9pbmRpY2F0ZV9jb25uZWN0KHBhZGFwdGVyKTsKIAl9IGVsc2UgewogCQlwd2xhbiA9IF9yODcxMl9hbGxvY19uZXR3b3JrKHBtbG1lcHJpdik7Ci0JCWlmIChwd2xhbiA9PSBOVUxMKSB7CisJCWlmICghcHdsYW4pIHsKIAkJCXB3bGFuID0gcjg3MTJfZ2V0X29sZGVzdF93bGFuX25ldHdvcmsoCiAJCQkJJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZSk7Ci0JCQlpZiAocHdsYW4gPT0gTlVMTCkKKwkJCWlmICghcHdsYW4pCiAJCQkJZ290byBjcmVhdGVic3NfY21kX2ZhaWw7CiAJCQlwd2xhbi0+bGFzdF9zY2FubmVkID0gamlmZmllczsKIAkJfSBlbHNlCkBAIC05MDQsOCArOTA2LDEwIEBACiAJCQkocjg3MTJfZ2V0X3dsYW5fYnNzaWRfZXhfc3oocG5ldHdvcmspKSk7CiAJCWlmIChwbWxtZXByaXYtPmZ3X3N0YXRlICYgX0ZXX1VOREVSX0xJTktJTkcpCiAJCQlwbWxtZXByaXYtPmZ3X3N0YXRlIF49IF9GV19VTkRFUl9MSU5LSU5HOwotCQkvKiB3ZSB3aWxsIHNldCBfRldfTElOS0VEIHdoZW4gdGhlcmUgaXMgb25lIG1vcmUgc2F0IHRvCi0JCSAqIGpvaW4gdXMgKHN0YXNzb2NfZXZlbnRfY2FsbGJhY2spICovCisJCS8qCisJCSAqIHdlIHdpbGwgc2V0IF9GV19MSU5LRUQgd2hlbiB0aGVyZSBpcyBvbmUgbW9yZSBzYXQgdG8KKwkJICogam9pbiB1cyAoc3Rhc3NvY19ldmVudF9jYWxsYmFjaykKKwkJICovCiAJfQogY3JlYXRlYnNzX2NtZF9mYWlsOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtbG1lcHJpdi0+bG9jaywgaXJxTCk7CkBAIC05MjEsNyArOTI1LDcgQEAKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSByODcxMl9nZXRfc3RhaW5mbyhwc3RhcHJpdiwKIAkJCQkJCSAgcHNldHN0YWtleV9yc3AtPmFkZHIpOwogCi0JaWYgKHBzdGEgPT0gTlVMTCkKKwlpZiAoIXBzdGEpCiAJCWdvdG8gZXhpdDsKIAlwc3RhLT5haWQgPSBwc3RhLT5tYWNfaWQgPSBwc2V0c3Rha2V5X3JzcC0+a2V5aWQ7IC8qQ0FNX0lEKENBTV9FTlRSWSkqLwogZXhpdDoKQEAgLTk0MSw3ICs5NDUsNyBAQAogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IHI4NzEyX2dldF9zdGFpbmZvKHBzdGFwcml2LAogCQkJCQkJICBwYXNzb2NzdGFfcGFybS0+YWRkcik7CiAKLQlpZiAocHN0YSA9PSBOVUxMKQorCWlmICghcHN0YSkKIAkJcmV0dXJuOwogCXBzdGEtPmFpZCA9IHBzdGEtPm1hY19pZCA9IHBhc3NvY3N0YV9yc3AtPmNhbV9pZDsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG1sbWVwcml2LT5sb2NrLCBpcnFMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2NtZC5oCmluZGV4IGU0YTJhNTAuLjMyODRkY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9jbWQuaApAQCAtNTAsOCArNTAsOCBAQAogfTsKIAogc3RydWN0IGNtZF9wcml2IHsKLQlzdHJ1Y3Qgc2VtYXBob3JlIGNtZF9xdWV1ZV9zZW1hOwotCXN0cnVjdCBzZW1hcGhvcmUgdGVybWluYXRlX2NtZHRocmVhZF9zZW1hOworCXN0cnVjdCBjb21wbGV0aW9uIGNtZF9xdWV1ZV9jb21wOworCXN0cnVjdCBjb21wbGV0aW9uIHRlcm1pbmF0ZV9jbWR0aHJlYWRfY29tcDsKIAlzdHJ1Y3QgIF9fcXVldWUJY21kX3F1ZXVlOwogCXU4IGNtZF9zZXE7CiAJdTggKmNtZF9idWY7CS8qc2hhbGwgYmUgbm9uLXBhZ2VkLCBhbmQgNCBieXRlcyBhbGlnbmVkKi8KQEAgLTE4NSwxMCArMTg1LDEyIEBACiAgKi8KIHN0cnVjdCBzZXRrZXlfcGFybSB7CiAJdTgJYWxnb3JpdGhtOwkvKiBlbmNyeXB0aW9uIGFsZ29yaXRobSwgY291bGQgYmUgbm9uZSwgd2VwNDAsCi0JCQkJICogVEtJUCwgQ0NNUCwgd2VwMTA0ICovCisJCQkJICogVEtJUCwgQ0NNUCwgd2VwMTA0CisJCQkJICovCiAJdTgJa2V5aWQ7CiAJdTgJZ3Jwa2V5OwkJLyogMTogdGhpcyBpcyB0aGUgZ3Jwa2V5IGZvciA4MDIuMXguCi0JCQkJICogMDogdGhpcyBpcyB0aGUgdW5pY2FzdCBrZXkgZm9yIDgwMi4xeCAqLworCQkJCSAqIDA6IHRoaXMgaXMgdGhlIHVuaWNhc3Qga2V5IGZvciA4MDIuMXgKKwkJCQkgKi8KIAl1OAlrZXlbMTZdOwkvKiB0aGlzIGNvdWxkIGJlIDQwIG9yIDEwNCAqLwogfTsKIApAQCAtMjE1LDE1ICsyMTcsMTUgQEAKIH07CiAKIC8qCi1DYWxsZXIgQWQtSG9jL0FQCi0KLUNvbW1hbmQgLVJzcChBSUQgPT0gQ0FNSUQpIG1vZGUKLQotVGhpcyBpcyB0byBmb3JjZSBmdyB0byBhZGQgYW4gc3RhX2RhdGEgZW50cnkgcGVyIGRyaXZlcidzIHJlcXVlc3QuCi0KLUZXIHdpbGwgd3JpdGUgYW4gY2FtIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCBpdC4KLQotKi8KKyAqCUNhbGxlciBBZC1Ib2MvQVAKKyAqCisgKglDb21tYW5kIC1Sc3AoQUlEID09IENBTUlEKSBtb2RlCisgKgorICoJVGhpcyBpcyB0byBmb3JjZSBmdyB0byBhZGQgYW4gc3RhX2RhdGEgZW50cnkgcGVyIGRyaXZlcidzIHJlcXVlc3QuCisgKgorICoJRlcgd2lsbCB3cml0ZSBhbiBjYW0gZW50cnkgYXNzb2NpYXRlZCB3aXRoIGl0LgorICoKKyAqLwogc3RydWN0IHNldF9hc3NvY3N0YV9wYXJtIHsKIAl1OAlhZGRyW0VUSF9BTEVOXTsKIH07CkBAIC0yMzQsMjcgKzIzNiwyNyBAQAogfTsKIAogLyoKLQlDYWxsZXIgQWQtSG9jL0FQCi0KLQlDb21tYW5kIG1vZGUKLQotCVRoaXMgaXMgdG8gZm9yY2UgZncgdG8gZGVsIGFuIHN0YV9kYXRhIGVudHJ5IHBlciBkcml2ZXIncyByZXF1ZXN0Ci0KLQlGVyB3aWxsIGludmFsaWRhdGUgdGhlIGNhbSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggaXQuCi0KLSovCisgKglDYWxsZXIgQWQtSG9jL0FQCisgKgorICoJQ29tbWFuZCBtb2RlCisgKgorICoJVGhpcyBpcyB0byBmb3JjZSBmdyB0byBkZWwgYW4gc3RhX2RhdGEgZW50cnkgcGVyIGRyaXZlcidzIHJlcXVlc3QKKyAqCisgKglGVyB3aWxsIGludmFsaWRhdGUgdGhlIGNhbSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggaXQuCisgKgorICovCiBzdHJ1Y3QgZGVsX2Fzc29jc3RhX3Bhcm0gewogCXU4CWFkZHJbRVRIX0FMRU5dOwogfTsKIAogLyoKLUNhbGxlciBNb2RlOiBBUC9BZC1Ib0MoTSkKLQotTm90ZXM6IFRvIG5vdGlmeSBmdyB0aGF0IGdpdmVuIHN0YWlkIGhhcyBjaGFuZ2VkIGl0cyBwb3dlciBzdGF0ZQotCi1Db21tYW5kIE1vZGUKLQotKi8KKyAqCUNhbGxlciBNb2RlOiBBUC9BZC1Ib0MoTSkKKyAqCisgKglOb3RlczogVG8gbm90aWZ5IGZ3IHRoYXQgZ2l2ZW4gc3RhaWQgaGFzIGNoYW5nZWQgaXRzIHBvd2VyIHN0YXRlCisgKgorICoJQ29tbWFuZCBNb2RlCisgKgorICovCiBzdHJ1Y3Qgc2V0c3RhcHdyc3RhdGVfcGFybSB7CiAJdTgJc3RhaWQ7CiAJdTgJc3RhdHVzOwpAQCAtMjYyLDI1ICsyNjQsMjUgQEAKIH07CiAKIC8qCi1DYWxsZXIgTW9kZTogQW55Ci0KLU5vdGVzOiBUbyBzZXR1cCB0aGUgYmFzaWMgcmF0ZSBvZiBSVEw4NzExCi0KLUNvbW1hbmQgTW9kZQotCi0qLworICoJQ2FsbGVyIE1vZGU6IEFueQorICoKKyAqCU5vdGVzOiBUbyBzZXR1cCB0aGUgYmFzaWMgcmF0ZSBvZiBSVEw4NzExCisgKgorICoJQ29tbWFuZCBNb2RlCisgKgorICovCiBzdHJ1Y3QJc2V0YmFzaWNyYXRlX3Bhcm0gewogCXU4CWJhc2ljcmF0ZXNbTnVtUmF0ZXNdOwogfTsKIAogLyoKLUNhbGxlciBNb2RlOiBBbnkKLQotTm90ZXM6IFRvIHJlYWQgdGhlIGN1cnJlbnQgYmFzaWMgcmF0ZQotCi1Db21tYW5kLVJzcCBNb2RlCi0KLSovCisgKglDYWxsZXIgTW9kZTogQW55CisgKgorICoJTm90ZXM6IFRvIHJlYWQgdGhlIGN1cnJlbnQgYmFzaWMgcmF0ZQorICoKKyAqCUNvbW1hbmQtUnNwIE1vZGUKKyAqCisgKi8KIHN0cnVjdCBnZXRiYXNpY3JhdGVfcGFybSB7CiAJdTMyIHJzdmQ7CiB9OwpAQCAtMjkwLDEzICsyOTIsMTMgQEAKIH07CiAKIC8qCi1DYWxsZXIgTW9kZTogQW55Ci0KLU5vdGVzOiBUbyBzZXR1cCB0aGUgZGF0YSByYXRlIG9mIFJUTDg3MTEKLQotQ29tbWFuZCBNb2RlCi0KLSovCisgKglDYWxsZXIgTW9kZTogQW55CisgKgorICoJTm90ZXM6IFRvIHNldHVwIHRoZSBkYXRhIHJhdGUgb2YgUlRMODcxMQorICoKKyAqCUNvbW1hbmQgTW9kZQorICoKKyAqLwogc3RydWN0IHNldGRhdGFyYXRlX3Bhcm0gewogCXU4CW1hY19pZDsKIAl1OAlkYXRhcmF0ZXNbTnVtUmF0ZXNdOwpAQCAtMzMyLDEzICszMzQsMTMgQEAKIH07CiAKIC8qCi1DYWxsZXIgTW9kZTogQW55Ci0KLU5vdGVzOiBUbyByZWFkIHRoZSBjdXJyZW50IGRhdGEgcmF0ZQotCi1Db21tYW5kLVJzcCBNb2RlCi0KLSovCisgKglDYWxsZXIgTW9kZTogQW55CisgKgorICoJTm90ZXM6IFRvIHJlYWQgdGhlIGN1cnJlbnQgZGF0YSByYXRlCisgKgorICoJQ29tbWFuZC1Sc3AgTW9kZQorICoKKyAqLwogc3RydWN0IGdldGRhdGFyYXRlX3Bhcm0gewogCXUzMiByc3ZkOwogCkBAIC0zNDksMzYgKzM1MSwzNiBAQAogCiAKIC8qCi1DYWxsZXIgTW9kZTogQW55Ci1BUDogQVAgY2FuIHVzZSB0aGUgaW5mbyBmb3IgdGhlIGNvbnRlbnRzIG9mIGJlYWNvbiBmcmFtZQotSW5mcmE6IFNUQSBjYW4gdXNlIHRoZSBpbmZvIHdoZW4gc2l0ZXN1cnZleWluZwotQWQtSG9DKE0pOiBMaWtlIEFQCi1BZC1Ib0MoQyk6IExpa2UgU1RBCi0KLQotTm90ZXM6IFRvIHNldCB0aGUgcGh5IGNhcGFiaWxpdHkgb2YgdGhlIE5JQwotCi1Db21tYW5kIE1vZGUKLQotKi8KKyAqCUNhbGxlciBNb2RlOiBBbnkKKyAqCUFQOiBBUCBjYW4gdXNlIHRoZSBpbmZvIGZvciB0aGUgY29udGVudHMgb2YgYmVhY29uIGZyYW1lCisgKglJbmZyYTogU1RBIGNhbiB1c2UgdGhlIGluZm8gd2hlbiBzaXRlc3VydmV5aW5nCisgKglBZC1Ib0MoTSk6IExpa2UgQVAKKyAqCUFkLUhvQyhDKTogTGlrZSBTVEEKKyAqCisgKgorICoJTm90ZXM6IFRvIHNldCB0aGUgcGh5IGNhcGFiaWxpdHkgb2YgdGhlIE5JQworICoKKyAqCUNvbW1hbmQgTW9kZQorICoKKyAqLwogCiAvKgotQ2FsbGVyIE1vZGU6IEFueQotCi1Ob3RlczogVG8gc2V0IHRoZSBjaGFubmVsL21vZGVtL2JhbmQKLVRoaXMgY29tbWFuZCB3aWxsIGJlIHVzZWQgd2hlbiBjaGFubmVsL21vZGVtL2JhbmQgaXMgY2hhbmdlZC4KLQotQ29tbWFuZCBNb2RlCi0KLSovCisgKglDYWxsZXIgTW9kZTogQW55CisgKgorICoJTm90ZXM6IFRvIHNldCB0aGUgY2hhbm5lbC9tb2RlbS9iYW5kCisgKglUaGlzIGNvbW1hbmQgd2lsbCBiZSB1c2VkIHdoZW4gY2hhbm5lbC9tb2RlbS9iYW5kIGlzIGNoYW5nZWQuCisgKgorICoJQ29tbWFuZCBNb2RlCisgKgorICovCiAvKgotQ2FsbGVyIE1vZGU6IEFueQotCi1Ob3RlczogVG8gZ2V0IHRoZSBjdXJyZW50IHNldHRpbmcgb2YgY2hhbm5lbC9tb2RlbS9iYW5kCi0KLUNvbW1hbmQtUnNwIE1vZGUKLQotKi8KKyAqCUNhbGxlciBNb2RlOiBBbnkKKyAqCisgKglOb3RlczogVG8gZ2V0IHRoZSBjdXJyZW50IHNldHRpbmcgb2YgY2hhbm5lbC9tb2RlbS9iYW5kCisgKgorICoJQ29tbWFuZC1Sc3AgTW9kZQorICoKKyAqLwogc3RydWN0CWdldHBoeV9yc3AgewogCXU4CXJmY2hhbm5lbDsKIAl1OAltb2RlbTsKQEAgLTQyOCw1OCArNDMwLDU4IEBACiB9OwogCiAvKgotCU5vdGVzOiBUaGlzIGNvbW1hbmQgaXMgdXNlZCBmb3IgSDJDL0MySCBsb29wYmFjayB0ZXN0aW5nCi0KLQltYWNbMF0gPT0gMAotCT09PiBDTUQgbW9kZSwgcmV0dXJuIEgyQ19TVUNDRVNTLgotCVRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIG11c3QgYmUgdHVyZSB1bmRlciBDTUQgbW9kZQotCQltYWNbMV0gPT0gbWFjWzRdLCBtYWNbMl0gPT0gbWFjWzNdLCBtYWNbMF09bWFjWzVdPSAwOwotCQlzMCA9PSAweDEyMzQsIHMxID09IDB4YWJjZCwgdzAgPT0gMHg3ODU2MzQxMiwgdzEgPT0gMHg1YWE1ZGVmNzsKLQkJczIgPT0gKGIxIDw8IDggfCBiMCk7Ci0KLQltYWNbMF0gPT0gMQotCT09PiBDTURfUlNQIG1vZGUsIHJldHVybiBIMkNfU1VDQ0VTU19SU1AKLQotCVRoZSByc3AgbGF5b3V0IHNoYWxsIGJlOgotCXJzcDoJCQlwYXJtOgotCQltYWNbMF0gID0gICBtYWNbNV07Ci0JCW1hY1sxXSAgPSAgIG1hY1s0XTsKLQkJbWFjWzJdICA9ICAgbWFjWzNdOwotCQltYWNbM10gID0gICBtYWNbMl07Ci0JCW1hY1s0XSAgPSAgIG1hY1sxXTsKLQkJbWFjWzVdICA9ICAgbWFjWzBdOwotCQlzMAkJPSAgIHMxOwotCQlzMQkJPSAgIHN3YXAxNihzMCk7Ci0JCXcwCQk9CXN3YXAzMih3MSk7Ci0JCWIwCQk9CWIxCi0JCXMyCQk9CXMwICsgczEKLQkJYjEJCT0JYjAKLQkJdzEJCT0JdzAKLQotCW1hY1swXSA9PQkyCi0JPT0+IENNRF9FVkVOVCBtb2RlLCByZXR1cm4JSDJDX1NVQ0NFU1MKLQlUaGUgZXZlbnQgbGF5b3V0IHNoYWxsIGJlOgotCWV2ZW50OgkgICAgIHBhcm06Ci0JbWFjWzBdICA9ICAgbWFjWzVdOwotCW1hY1sxXSAgPSAgIG1hY1s0XTsKLQltYWNbMl0gID0gICBldmVudCdzIHNlcXVlbmNlIG51bWJlciwgc3RhcnRpbmcgZnJvbSAxIHRvIHBhcm0ncyBtYXJjWzNdCi0JbWFjWzNdICA9ICAgbWFjWzJdOwotCW1hY1s0XSAgPSAgIG1hY1sxXTsKLQltYWNbNV0gID0gICBtYWNbMF07Ci0JczAJCT0gICBzd2FwMTYoczApIC0gZXZlbnQubWFjWzJdOwotCXMxCQk9ICAgczEgKyBldmVudC5tYWNbMl07Ci0JdzAJCT0Jc3dhcDMyKHcwKTsKLQliMAkJPQliMQotCXMyCQk9CXMwICsgZXZlbnQubWFjWzJdCi0JYjEJCT0JYjAKLQl3MQkJPQlzd2FwMzIodzEpIC0gZXZlbnQubWFjWzJdOwotCi0JcGFybS0+bWFjWzNdIGlzIHRoZSB0b3RhbCBldmVudCBjb3VudHMgdGhhdCBob3N0IHJlcXVlc3RlZC4KLQotCi0JZXZlbnQgd2lsbCBiZSB0aGUgc2FtZSB3aXRoIHRoZSBjbWQncyBwYXJhbS4KLQotKi8KKyAqCU5vdGVzOiBUaGlzIGNvbW1hbmQgaXMgdXNlZCBmb3IgSDJDL0MySCBsb29wYmFjayB0ZXN0aW5nCisgKgorICoJbWFjWzBdID09IDAKKyAqCT09PiBDTUQgbW9kZSwgcmV0dXJuIEgyQ19TVUNDRVNTLgorICoJVGhlIGZvbGxvd2luZyBjb25kaXRpb24gbXVzdCBiZSB0dXJlIHVuZGVyIENNRCBtb2RlCisgKgkJbWFjWzFdID09IG1hY1s0XSwgbWFjWzJdID09IG1hY1szXSwgbWFjWzBdPW1hY1s1XT0gMDsKKyAqCQlzMCA9PSAweDEyMzQsIHMxID09IDB4YWJjZCwgdzAgPT0gMHg3ODU2MzQxMiwgdzEgPT0gMHg1YWE1ZGVmNzsKKyAqCQlzMiA9PSAoYjEgPDwgOCB8IGIwKTsKKyAqCisgKgltYWNbMF0gPT0gMQorICoJPT0+IENNRF9SU1AgbW9kZSwgcmV0dXJuIEgyQ19TVUNDRVNTX1JTUAorICoKKyAqCVRoZSByc3AgbGF5b3V0IHNoYWxsIGJlOgorICoJcnNwOgkJCXBhcm06CisgKgkJbWFjWzBdICA9ICAgbWFjWzVdOworICoJCW1hY1sxXSAgPSAgIG1hY1s0XTsKKyAqCQltYWNbMl0gID0gICBtYWNbM107CisgKgkJbWFjWzNdICA9ICAgbWFjWzJdOworICoJCW1hY1s0XSAgPSAgIG1hY1sxXTsKKyAqCQltYWNbNV0gID0gICBtYWNbMF07CisgKgkJczAJCT0gICBzMTsKKyAqCQlzMQkJPSAgIHN3YXAxNihzMCk7CisgKgkJdzAJCT0Jc3dhcDMyKHcxKTsKKyAqCQliMAkJPQliMQorICoJCXMyCQk9CXMwICsgczEKKyAqCQliMQkJPQliMAorICoJCXcxCQk9CXcwCisgKgorICoJbWFjWzBdID09CTIKKyAqCT09PiBDTURfRVZFTlQgbW9kZSwgcmV0dXJuCUgyQ19TVUNDRVNTCisgKglUaGUgZXZlbnQgbGF5b3V0IHNoYWxsIGJlOgorICoJZXZlbnQ6CSAgICAgcGFybToKKyAqCW1hY1swXSAgPSAgIG1hY1s1XTsKKyAqCW1hY1sxXSAgPSAgIG1hY1s0XTsKKyAqCW1hY1syXSAgPSAgIGV2ZW50J3Mgc2VxdWVuY2UgbnVtYmVyLCBzdGFydGluZyBmcm9tIDEgdG8gcGFybSdzIG1hcmNbM10KKyAqCW1hY1szXSAgPSAgIG1hY1syXTsKKyAqCW1hY1s0XSAgPSAgIG1hY1sxXTsKKyAqCW1hY1s1XSAgPSAgIG1hY1swXTsKKyAqCXMwCQk9ICAgc3dhcDE2KHMwKSAtIGV2ZW50Lm1hY1syXTsKKyAqCXMxCQk9ICAgczEgKyBldmVudC5tYWNbMl07CisgKgl3MAkJPQlzd2FwMzIodzApOworICoJYjAJCT0JYjEKKyAqCXMyCQk9CXMwICsgZXZlbnQubWFjWzJdCisgKgliMQkJPQliMAorICoJdzEJCT0Jc3dhcDMyKHcxKSAtIGV2ZW50Lm1hY1syXTsKKyAqCisgKglwYXJtLT5tYWNbM10gaXMgdGhlIHRvdGFsIGV2ZW50IGNvdW50cyB0aGF0IGhvc3QgcmVxdWVzdGVkLgorICoKKyAqCisgKglldmVudCB3aWxsIGJlIHRoZSBzYW1lIHdpdGggdGhlIGNtZCdzIHBhcmFtLgorICoKKyAqLwogCiAvKiBDTUQgcGFyYW0gRm9ybWFydCBmb3IgRFJWIElOVEVSTkFMIENNRCBIREwqLwogc3RydWN0IGRydmludF9jbWRfcGFybSB7CkBAIC01NzAsNyArNTcyLDggQEAKIAl1OAliY25fcnhfZW47CiAJdTgJYmNuX3Bhc3NfY250OwkgIC8qIGZ3IHJlcG9ydCBvbmUgYmVhY29uIGluZm9ybWF0aW9uIHRvCiAJCQkJICAgKiBkcml2ZXIgIHdoZW4gaXQgcmVjZWl2ZXMgYmNuX3Bhc3NfY250Ci0JCQkJICAgKiAgYmVhY29ucy4gKi8KKwkJCQkgICAqIGJlYWNvbnMuCisJCQkJICAgKi8KIAl1OAliY25fdG87CQkgIC8qIGJlYWNvbiBUTyAobXMpLiDCocKnPTDCocKoIG5vIGxpbWl0LiovCiAJdTE2CWJjbl9pdHY7CiAJdTgJYXBwX2l0djsgLyogb25seSBmb3IgVk9JUCBtb2RlLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9odC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9odC5oCmluZGV4IDQxODcyZDkuLjUxM2Y0NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaHQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2h0LmgKQEAgLTM2LDcgKzM2LDggQEAKIAl1bnNpZ25lZCBpbnQJdHhfYW1zZHVfZW5hYmxlOy8qZm9yIGVuYWJsZSBUeCBBLU1TRFUgKi8KIAl1bnNpZ25lZCBpbnQJdHhfYW1kc3VfbWF4bGVuOyAvKiAxOiA4aywgMDo0ayA7IGRlZmF1bHQ6OGssIGZvciB0eCAqLwogCXVuc2lnbmVkIGludAlyeF9hbXBkdV9tYXhsZW47IC8qIGZvciByeCByZW9yZGVyaW5nIGN0cmwgd2luX3N6LAotCQkJCQkgICogIHVwZGF0ZWQgd2hlbiBqb2luX2NhbGxiYWNrLiAqLworCQkJCQkgICogdXBkYXRlZCB3aGVuIGpvaW5fY2FsbGJhY2suCisJCQkJCSAgKi8KIAlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodF9jYXA7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsLmgKaW5kZXggYzkyMThiZS4uMDhiY2IzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGwuaApAQCAtNjgsNyArNjgsOCBAQAogCiBzdHJ1Y3Qgb2lkX29ial9wcml2IHsKIAl1bnNpZ25lZCBjaGFyCWRiZzsgLyogMDogd2l0aG91dCBPSUQgZGVidWcgbWVzc2FnZQotCQkJICAgICAgKiAxOiB3aXRoIE9JRCBkZWJ1ZyBtZXNzYWdlICovCisJCQkgICAgICAqIDE6IHdpdGggT0lEIGRlYnVnIG1lc3NhZ2UKKwkJCSAgICAgICovCiAJdWludCAoKm9pZGZ1bnMpKHN0cnVjdCBvaWRfcGFyX3ByaXYgKnBvaWRfcGFyX3ByaXYpOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9saW51eC5jCmluZGV4IGUyMDVhZGYuLjQ3NWU3OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX2xpbnV4LmMKQEAgLTE5NzYsOSArMTk3Niw5IEBACiAJaWYgKHBkYXRhLT5sZW5ndGggPj0gMzIpIHsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIHBkYXRhLT5wb2ludGVyLCAzMikpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBkYXRhWzMyXSA9IDA7CisJCWRhdGFbMzJdID0gMDsKIAl9IGVsc2UgewotCQkgcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKSwgaXJxTCk7CiAJcGhlYWQgPSAmcXVldWUtPnF1ZXVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9zZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfc2V0LmMKaW5kZXggNTY3NjBjZC4uMGFhZjJhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9zZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX3NldC5jCkBAIC0xNDAsNyArMTQwLDggQEAKIAkJICAgIEVUSF9BTEVOKSkgewogCQkJaWYgKCFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkKIAkJCQlnb3RvIF9BYm9ydF9TZXRfQlNTSUQ7IC8qIGRyaXZlciBpcyBpbgotCQkJCQkJKiBXSUZJX0FESE9DX01BU1RFUl9TVEFURSAqLworCQkJCQkJKiBXSUZJX0FESE9DX01BU1RFUl9TVEFURQorCQkJCQkJKi8KIAkJfSBlbHNlIHsKIAkJCXI4NzEyX2Rpc2Fzc29jX2NtZChwYWRhcHRlcik7CiAJCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKQpAQCAtMjAzLDcgKzIwNCw4IEBACiAJCQkJCX0KIAkJCQl9IGVsc2UgewogCQkJCQlnb3RvIF9BYm9ydF9TZXRfU1NJRDsgLyogZHJpdmVyIGlzIGluCi0JCQkJCQkgICogV0lGSV9BREhPQ19NQVNURVJfU1RBVEUgKi8KKwkJCQkJCSogV0lGSV9BREhPQ19NQVNURVJfU1RBVEUKKwkJCQkJCSovCiAJCQkJfQogCQkJfQogCQl9IGVsc2UgewpAQCAtMjU0LDEyICsyNTYsMTQgQEAKIAkJICAgICgqcG9sZF9zdGF0ZSA9PSBOZGlzODAyXzExSUJTUykpIHsKIAkJCS8qIHdpbGwgY2xyIExpbmtlZF9zdGF0ZSBiZWZvcmUgdGhpcyBmdW5jdGlvbiwKIAkJCSAqIHdlIG11c3QgaGF2ZSBjaGVja2VkIHdoZXRoZXIgaXNzdWUgZGlzLWFzc29jX2NtZCBvcgotCQkJICogbm90ICovCisJCQkgKiBub3QKKwkJCSAqLwogCQkJcjg3MTJfaW5kX2Rpc2Nvbm5lY3QocGFkYXB0ZXIpOwogCQl9CiAJCSpwb2xkX3N0YXRlID0gbmV0d29ya3R5cGU7CiAJCS8qIGNsZWFyIFdJRklfU1RBVElPTl9TVEFURTsgV0lGSV9BUF9TVEFURTsgV0lGSV9BREhPQ19TVEFURTsKLQkJICogV0lGSV9BREhPQ19NQVNURVJfU1RBVEUgKi8KKwkJICogV0lGSV9BREhPQ19NQVNURVJfU1RBVEUKKwkJICovCiAJCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUgfCBXSUZJX0FQX1NUQVRFIHwKIAkJCSAgICAgIFdJRklfQURIT0NfU1RBVEUgfCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSk7CiAJCXN3aXRjaCAobmV0d29ya3R5cGUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbGVkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2xlZC5oCmluZGV4IGViNjEyMDUuLmFkZmJjNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbGVkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9sZWQuaApAQCAtNzIsMTQgKzcyLDE3IEBACiAJU1dfTEVEX01PREUwLCAvKiBTVyBjb250cm9sIDEgTEVEIHZpYSBHUElPMC4gSXQgaXMgZGVmYXVsdCBvcHRpb24uICovCiAJU1dfTEVEX01PREUxLCAvKiAyIExFRHMsIHRocm91Z2ggTEVEMCBhbmQgTEVEMS4gRm9yIEFMUEhBLiAqLwogCVNXX0xFRF9NT0RFMiwgLyogU1cgY29udHJvbCAxIExFRCB2aWEgR1BJTzAsCi0JCSAgICAgICAqIGN1c3RvbSBmb3IgQXpXYXZlIDgxODcgbWluaWNhcmQuICovCisJCSAgICAgICAqIGN1c3RvbSBmb3IgQXpXYXZlIDgxODcgbWluaWNhcmQuCisJCSAgICAgICAqLwogCVNXX0xFRF9NT0RFMywgLyogU1cgY29udHJvbCAxIExFRCB2aWEgR1BJTzAsCi0JCSAgICAgICAqICBjdXN0b21pemVkIGZvciBTZXJjb21tIFByaW50ZXIgU2VydmVyIGNhc2UuKi8KKwkJICAgICAgICogY3VzdG9taXplZCBmb3IgU2VyY29tbSBQcmludGVyIFNlcnZlciBjYXNlLgorCQkgICAgICAgKi8KIAlTV19MRURfTU9ERTQsIC8qZm9yIEVkaW1heCAvIEJlbGtpbiovCiAJU1dfTEVEX01PREU1LCAvKmZvciBTZXJjb21tIC8gQmVsa2luKi8KIAlTV19MRURfTU9ERTYsIC8qZm9yIFdOQyAvIENvcmVnYSovCiAJSFdfTEVELCAvKiBIVyBjb250cm9sIDIgTEVEcywgTEVEMCBhbmQgTEVEMSAodGhlcmUgYXJlIDQgZGlmZmVyZW50Ci0JCSAqIGNvbnRyb2wgbW9kZXMsIHNlZSBNQUMuQ09ORklHMSBmb3IgZGV0YWlscy4pKi8KKwkJICogY29udHJvbCBtb2Rlcywgc2VlIE1BQy5DT05GSUcxIGZvciBkZXRhaWxzLikKKwkJICovCiB9OwogCiBzdHJ1Y3QgTEVEXzg3MXggewpAQCAtOTYsNyArOTksOCBAQAogCXU4CQkJYkxlZFdQU0JsaW5rSW5Qcm9ncmVzczsKIAl1MzIJCQlCbGlua1RpbWVzOyAvKiBOby4gdGltZXMgdG8gdG9nZ2xlIGZvciBibGluay4qLwogCXUzMgkJCUJsaW5raW5nTGVkU3RhdGU7IC8qIE5leHQgc3RhdGUgZm9yIGJsaW5raW5nLAotCQkJCQkJICAgKiBlaXRoZXIgTEVEX09OIG9yIE9GRi4qLworCQkJCQkJICAgKiBlaXRoZXIgTEVEX09OIG9yIE9GRi4KKwkJCQkJCSAgICovCiAKIAlzdHJ1Y3QgdGltZXJfbGlzdAlCbGlua1RpbWVyOyAvKiBUaW1lciBvYmplY3QgZm9yIGxlZCBibGlua2luZy4qLwogCXN0cnVjdCB3b3JrX3N0cnVjdAlCbGlua1dvcmtJdGVtOyAvKiBXb3JraXRlbSB1c2VkIGJ5IEJsaW5rVGltZXIgKi8KQEAgLTExNSw3ICsxMTksOCBAQAogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogSW50ZXJmYWNlIHRvIG1hbmlwdWxhdGUgTEVEIG9iamVjdHMuCi0gKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCiB2b2lkIHI4NzEyX0luaXRTd0xlZHMoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlcik7CiB2b2lkIHI4NzEyX0RlSW5pdFN3TGVkcyhzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyKTsKIHZvaWQgTGVkQ29udHJvbDg3MXgoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciwgZW51bSBMRURfQ1RMX01PREUgTGVkQWN0aW9uKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbWxtZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmMKaW5kZXggNzcyYmY5Zi4uYzFmZWVmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmMKQEAgLTQwMyw3ICs0MDMsOCBAQAogCiAKIAkvKiBJZiB3ZSBkaWRuJ3QgZmluZCBhIG1hdGNoLCB0aGVuIGdldCBhIG5ldyBuZXR3b3JrIHNsb3QgdG8gaW5pdGlhbGl6ZQotCSAqIHdpdGggdGhpcyBiZWFjb24ncyBpbmZvcm1hdGlvbiAqLworCSAqIHdpdGggdGhpcyBiZWFjb24ncyBpbmZvcm1hdGlvbgorCSAqLwogCWlmIChlbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpIHsKIAkJaWYgKGxpc3RfZW1wdHkoJnBtbG1lcHJpdi0+ZnJlZV9ic3NfcG9vbC5xdWV1ZSkpIHsKIAkJCS8qIElmIHRoZXJlIGFyZSBubyBtb3JlIHNsb3RzLCBleHBpcmUgdGhlIG9sZGVzdCAqLwpAQCAtOTI2LDcgKzkyNyw4IEBACiAJaWYgKHBzdGEgIT0gTlVMTCkgewogCQkvKnRoZSBzdGEgaGF2ZSBiZWVuIGluIHN0YV9pbmZvX3F1ZXVlID0+IGRvIG5vdGhpbmcKIAkJICooYmV0d2VlbiBkcnYgaGFzIHJlY2VpdmVkIHRoaXMgZXZlbnQgYmVmb3JlIGFuZAotCQkgKiAgZncgaGF2ZSBub3QgeWV0IHRvIHNldCBrZXkgdG8gQ0FNX0VOVFJZKSAqLworCQkgKiBmdyBoYXZlIG5vdCB5ZXQgdG8gc2V0IGtleSB0byBDQU1fRU5UUlkpCisJCSAqLwogCQlyZXR1cm47CiAJfQogCkBAIC0xMTcxLDcgKzExNzMsOCBAQAogCQkgICAgIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5Tc2lkTGVuZ3RoKSkpIHsKIAkJCWlmIChwbWxtZXByaXYtPmFzc29jX2J5X3Jzc2kpIHsKIAkJCQkvKiBpZiB0aGUgc3NpZCBpcyB0aGUgc2FtZSwgc2VsZWN0IHRoZSBic3MKLQkJCQkgKiAgd2hpY2ggaGFzIHRoZSBtYXggcnNzaSovCisJCQkJICogd2hpY2ggaGFzIHRoZSBtYXggcnNzaQorCQkJCSAqLwogCQkJCWlmIChwbmV0d29ya19tYXhfcnNzaSkgewogCQkJCQlpZiAocG5ldHdvcmstPm5ldHdvcmsuUnNzaSA+CiAJCQkJCSAgICBwbmV0d29ya19tYXhfcnNzaS0+bmV0d29yay5Sc3NpKQpAQCAtMTM1Miw3ICsxMzU1LDggQEAKIAkJaSA9IC0xOyAvKiBDb3VsZCBub3QgZmluZC4gKi8KIAl9IGVsc2UgewogCQk7IC8qIFRoZXJlIGlzIG9uZSBQcmUtQXV0aGVudGljYXRpb24gS2V5IGZvciB0aGUKLQkJICAgKiBzcGVjaWZpYyBCU1NJRC4gKi8KKwkJICAgKiBzcGVjaWZpYyBCU1NJRC4KKwkJICAgKi8KIAl9CiAJcmV0dXJuIGk7CiB9CkBAIC0xNDMwLDcgKzE0MzQsOCBAQAogCWlmIChtYXRjaCkgewogCQlpZiAoc2VjX2llWzBdID09IF9XUEFfSUVfSURfKSB7CiAJCQkvKiBwYXJzaW5nIFNTTiBJRSB0byBzZWxlY3QgcmVxdWlyZWQgZW5jcnlwdGlvbgotCQkJICogYWxnb3JpdGhtLCBhbmQgc2V0IHRoZSBiYy9tYyBlbmNyeXB0aW9uIGFsZ29yaXRobSAqLworCQkJICogYWxnb3JpdGhtLCBhbmQgc2V0IHRoZSBiYy9tYyBlbmNyeXB0aW9uIGFsZ29yaXRobQorCQkJICovCiAJCQl3aGlsZSAodHJ1ZSkgewogCQkJCS8qY2hlY2sgd3BhX291aSB0YWcqLwogCQkJCWlmIChtZW1jbXAoJnNlY19pZVsyXSwgJndwYV9vdWlbMF0sIDQpKSB7CkBAIC0xNDQ0LDcgKzE0NDksOCBAQAogCQkJCX0KIAkJCQlpZiAoIW1lbWNtcCgmc2VjX2llWzhdLCAmd3BhX291aVswXSwgMykpIHsKIAkJCQkJLyogZ2V0IGJjL21jIGVuY3J5cHRpb24gdHlwZSAoZ3JvdXAKLQkJCQkJICoga2V5IHR5cGUpKi8KKwkJCQkJICoga2V5IHR5cGUpCisJCQkJCSAqLwogCQkJCQlzd2l0Y2ggKHNlY19pZVsxMV0pIHsKIAkJCQkJY2FzZSAweDA6IC8qbm9uZSovCiAJCQkJCQlwc2VjdXJpdHlwcml2LT5YR3JwUHJpdmFjeSA9CkBAIC0xNDgyLDcgKzE0ODgsOCBAQAogCQkJCQl9IC8qZWxzZSB0aGUgdW5jc3Rfb3VpIGlzIG1hdGNoKi8KIAkJCQl9IGVsc2UgeyAvKm1peGVkIG1vZGUsIHVuaWNhc3RfZW5jX3R5cGUgPiAxKi8KIAkJCQkJLypzZWxlY3QgdGhlIHVuY3N0X291aSBhbmQgcmVtb3ZlCi0JCQkJCSAqIHRoZSBvdGhlciB1bmNzdF9vdWkqLworCQkJCQkgKiB0aGUgb3RoZXIgdW5jc3Rfb3VpCisJCQkJCSAqLwogCQkJCQljbnQgPSBzZWNfaWVbMTJdOwogCQkJCQlyZW1vdmVfY250ID0gKGNudCAtIDEpICogNDsKIAkJCQkJc2VjX2llWzEyXSA9IDB4MDE7CkBAIC0xNDk5LDcgKzE1MDYsOCBAQAogCQl9CiAJCWlmIChhdXRobW9kZSA9PSBfV1BBMl9JRV9JRF8pIHsKIAkJCS8qIHBhcnNpbmcgUlNOIElFIHRvIHNlbGVjdCByZXF1aXJlZCBlbmNyeXB0aW9uCi0JCQkgKiBhbGdvcml0aG0sIGFuZCBzZXQgdGhlIGJjL21jIGVuY3J5cHRpb24gYWxnb3JpdGhtICovCisJCQkgKiBhbGdvcml0aG0sIGFuZCBzZXQgdGhlIGJjL21jIGVuY3J5cHRpb24gYWxnb3JpdGhtCisJCQkgKi8KIAkJCXdoaWxlICh0cnVlKSB7CiAJCQkJaWYgKChzZWNfaWVbMl0gIT0gMHgwMSkgfHwgKHNlY19pZVszXSAhPSAweDApKSB7CiAJCQkJCS8qSUUgVmVyIGVycm9yKi8KQEAgLTE1NDMsNyArMTU1MSw4IEBACiAJCQkJCX0gLyplbHNlIHRoZSB1bmNzdF9vdWkgaXMgbWF0Y2gqLwogCQkJCX0gZWxzZSB7IC8qbWl4ZWQgbW9kZSwgdW5pY2FzdF9lbmNfdHlwZSA+IDEqLwogCQkJCQkvKnNlbGVjdCB0aGUgdW5jc3Rfb3VpIGFuZCByZW1vdmUgdGhlCi0JCQkJCSAqIG90aGVyIHVuY3N0X291aSovCisJCQkJCSAqIG90aGVyIHVuY3N0X291aQorCQkJCQkgKi8KIAkJCQkJY250ID0gc2VjX2llWzhdOwogCQkJCQlyZW1vdmVfY250ID0gKGNudCAtIDEpICogNDsKIAkJCQkJc2VjX2llWzhdID0gMHgwMTsKQEAgLTE2NjcsNyArMTY3Niw4IEBACiAJc3RydWN0IGh0X3ByaXYJCSpwaHRwcml2ID0gJnBtbG1lcHJpdi0+aHRwcml2OwogCiAJLyogdG9kbzogaWYgeW91IHdhbnQgdG8gZG8gc29tZXRoaW5nIGlvL3JlZy9odyBzZXR0aW5nIGJlZm9yZSBqb2luX2JzcywKLQkgKiBwbGVhc2UgYWRkIGNvZGUgaGVyZSAqLworCSAqIHBsZWFzZSBhZGQgY29kZSBoZXJlCisJICovCiAJcGh0cHJpdi0+YW1wZHVfZW5hYmxlID0gZmFsc2U7LypyZXNldCB0byBkaXNhYmxlZCovCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCiAJCXBodHByaXYtPmJhZGRiYXJlcV9pc3N1ZWRbaV0gPSBmYWxzZTsvKnJlc2V0IGl0Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbWxtZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmgKaW5kZXggNjFlMGViNy4uZGRhYWFiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmgKQEAgLTQ3LDE2ICs0NywyMCBAQAogI2RlZmluZSAgIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFIDB4MDAwMDAwNDAKICNkZWZpbmUgICBXSUZJX1VOREVSX0xJTktJTkcJMHgwMDAwMDA4MAogI2RlZmluZSBXSUZJX1NJVEVfTU9OSVRPUgkweDAwMDAwODAwCS8qIHRvIGluZGljYXRlIHRoZSBzdGF0aW9uCi0JCQkJCQkgKiBpcyB1bmRlciBzaXRlIHN1cnZleWluZyovCisJCQkJCQkgKiBpcyB1bmRlciBzaXRlIHN1cnZleWluZworCQkJCQkJICovCiAjZGVmaW5lCVdJRklfTVBfU1RBVEUJCTB4MDAwMTAwMDAKICNkZWZpbmUJV0lGSV9NUF9DVFhfQkFDS0dST1VORAkweDAwMDIwMDAwCS8qIGluIGNvbnQuIHR4IGJhY2tncm91bmQqLwogI2RlZmluZQlXSUZJX01QX0NUWF9TVAkJMHgwMDA0MDAwMAkvKiBpbiBjb250LiB0eCB3aXRoCi0JCQkJCQkgKiAgc2luZ2xlLXRvbmUqLworCQkJCQkJICogc2luZ2xlLXRvbmUKKwkJCQkJCSAqLwogI2RlZmluZQlXSUZJX01QX0NUWF9CQUNLR1JPVU5EX1BFTkRJTkcJMHgwMDA4MDAwMCAvKiBwZW5kaW5nIGluIGNvbnQsIHR4Ci0JCQkJCSogYmFja2dyb3VuZCBkdWUgdG8gb3V0IG9mIHNrYiovCisJCQkJCQkgICAgKiBiYWNrZ3JvdW5kIGR1ZSB0byBvdXQgb2Ygc2tiCisJCQkJCQkgICAgKi8KICNkZWZpbmUJV0lGSV9NUF9DVFhfQ0NLX0hXCTB4MDAxMDAwMDAJLyogaW4gY29udGludW91cyB0eCovCiAjZGVmaW5lCVdJRklfTVBfQ1RYX0NDS19DUwkweDAwMjAwMDAwCS8qIGluIGNvbnQsIHR4IHdpdGggY2FycmllcgotCQkJCQkJICogc3VwcHJlc3Npb24qLworCQkJCQkJICogc3VwcHJlc3Npb24KKwkJCQkJCSAqLwogI2RlZmluZSAgIFdJRklfTVBfTFBCS19TVEFURQkweDAwNDAwMDAwCiAKICNkZWZpbmUgX0ZXX1VOREVSX0xJTktJTkcJV0lGSV9VTkRFUl9MSU5LSU5HCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wLmMKaW5kZXggNWU0ZmRhMS4uM2MxMGEyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXAuYwpAQCAtMzc2LDcgKzM3Niw4IEBACiAJCS8qIFVzZSBQSFlfUkVHLnR4dCBkZWZhdWx0IHZhbHVlLiBEbyBub3QgbmVlZCB0byBjaGFuZ2UuCiAJCSAqIENvcnJlY3QgdGhlIHR4IHBvd2VyIGZvciBDQ0sgcmF0ZSBpbiA0ME0uCiAJCSAqIFNldCBDb250cm9sIGNoYW5uZWwgdG8gdXBwZXIgb3IgbG93ZXIuIFRoZXNlIHNldHRpbmdzIGFyZQotCQkgKiByZXF1aXJlZCBvbmx5IGZvciA0ME1IeiAqLworCQkgKiByZXF1aXJlZCBvbmx5IGZvciA0ME1IegorCQkgKi8KIAkJc2V0X2JiX3JlZyhwQWRhcHRlciwgckNDSzBfU3lzdGVtLCBiQ0NLU2lkZUJhbmQsCiAJCQkgICAoSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSA+PiAxKSk7CiAJCXNldF9iYl9yZWcocEFkYXB0ZXIsIHJPRkRNMV9MU1RGLCAweEMwMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXAuaAppbmRleCAzZjNiMmU3Li44ZGY0NTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcC5oCkBAIC0xMDgsNyArMTA4LDggQEAKIAl1bnNpZ25lZCBjaGFyIG5ldHdvcmtfbWFjYWRkcls2XTsKIAkvKlRlc3RpbmcgRmxhZyovCiAJdTMyIG1vZGU7LyowIGZvciBub3JtYWwgdHlwZSBwYWNrZXQsCi0JCSAgKiAxIGZvciBsb29wYmFjayBwYWNrZXQgKDE2Ynl0ZXMgVFhDTUQpKi8KKwkJICAqIDEgZm9yIGxvb3BiYWNrIHBhY2tldCAoMTZieXRlcyBUWENNRCkKKwkJICAqLwogCXNpbnQgcHJldl9md19zdGF0ZTsKIAl1OCAqcGFsbG9jYXRlZF9tcF94bWl0ZnJhbWVfYnVmOwogCXU4ICpwbXBfeG10ZnJhbWVfYnVmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcF9pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcF9pb2N0bC5oCmluZGV4IDhkYzg5ODAuLjExMDI0NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXBfaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wX2lvY3RsLmgKQEAgLTE1OCwyOCArMTU4LDM3IEBACiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgwNQlPSURfUlRfUFJPX1NFVF9TQ1JBTUJMRVIqLwogCXsxLCBvaWRfbnVsbF9mdW5jdGlvbn0sCQkvKjB4MDYJT0lEX1JUX1BST19TRVRfRklMVEVSX0JCKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDA3Ci0JCQkJCSAqIE9JRF9SVF9QUk9fU0VUX01BTlVBTF9ESVZFUlNfQkIqLworCQkJCQkgKiBPSURfUlRfUFJPX1NFVF9NQU5VQUxfRElWRVJTX0JCCisJCQkJCSAqLwogCXsxLCBvaWRfcnRfcHJvX3NldF9jaGFubmVsX2RpcmVjdF9jYWxsX2hkbH0sCS8qMHgwOCovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgwOQotCQkJCSogT0lEX1JUX1BST19TRVRfU0xFRVBfTU9ERV9ESVJFQ1RfQ0FMTCovCisJCQkJKiBPSURfUlRfUFJPX1NFVF9TTEVFUF9NT0RFX0RJUkVDVF9DQUxMCisJCQkJKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDBBCi0JCQkJKiBPSURfUlRfUFJPX1NFVF9XQUtFX01PREVfRElSRUNUX0NBTEwqLworCQkJCSogT0lEX1JUX1BST19TRVRfV0FLRV9NT0RFX0RJUkVDVF9DQUxMCisJCQkJKi8KIAl7MSwgb2lkX3J0X3Byb19zZXRfY29udGludW91c190eF9oZGx9LAkvKjB4MEIKLQkJCQkqIE9JRF9SVF9QUk9fU0VUX1RYX0NPTlRJTlVPVVNfRElSRUNUX0NBTEwqLworCQkJCSogT0lEX1JUX1BST19TRVRfVFhfQ09OVElOVU9VU19ESVJFQ1RfQ0FMTAorCQkJCSovCiAJezEsIG9pZF9ydF9wcm9fc2V0X3NpbmdsZV9jYXJyaWVyX3R4X2hkbH0sIC8qMHgwQwotCQkJCSogT0lEX1JUX1BST19TRVRfU0lOR0xFX0NBUlJJRVJfVFhfQ09OVElOVU9VUyovCisJCQkJKiBPSURfUlRfUFJPX1NFVF9TSU5HTEVfQ0FSUklFUl9UWF9DT05USU5VT1VTCisJCQkJKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDBECi0JCQkJKiBPSURfUlRfUFJPX1NFVF9UWF9BTlRFTk5BX0JCKi8KKwkJCQkqIE9JRF9SVF9QUk9fU0VUX1RYX0FOVEVOTkFfQkIKKwkJCQkqLwogCXsxLCBvaWRfcnRfcHJvX3NldF9hbnRlbm5hX2JiX2hkbH0sCQkvKjB4MEUqLwogCXsxLCBvaWRfbnVsbF9mdW5jdGlvbn0sCQkvKjB4MEYJT0lEX1JUX1BST19TRVRfQ1JfU0NSQU1CTEVSKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDEwCU9JRF9SVF9QUk9fU0VUX0NSX05FV19GSUxURVIqLwogCXsxLCBvaWRfcnRfcHJvX3NldF90eF9wb3dlcl9jb250cm9sX2hkbH0sIC8qMHgxMQotCQkJCSogT0lEX1JUX1BST19TRVRfVFhfUE9XRVJfQ09OVFJPTCovCisJCQkJKiBPSURfUlRfUFJPX1NFVF9UWF9QT1dFUl9DT05UUk9MCisJCQkJKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDEyCU9JRF9SVF9QUk9fU0VUX0NSX1RYX0NPTkZJRyovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgxMwotCQkJCQkgKiBPSURfUlRfUFJPX0dFVF9UWF9QT1dFUl9DT05UUk9MKi8KKwkJCQkJICogT0lEX1JUX1BST19HRVRfVFhfUE9XRVJfQ09OVFJPTAorCQkJCQkgKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDE0Ci0JCQkJCSAqIE9JRF9SVF9QUk9fR0VUX0NSX1NJR05BTF9RVUFMSVRZKi8KKwkJCQkJICogT0lEX1JUX1BST19HRVRfQ1JfU0lHTkFMX1FVQUxJVFkKKwkJCQkJICovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgxNQlPSURfUlRfUFJPX1NFVF9DUl9TRVRQT0lOVCovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgxNglPSURfUlRfUFJPX1NFVF9JTlRFR1JBVE9SKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDE3CU9JRF9SVF9QUk9fU0VUX1NJR05BTF9RVUFMSVRZKi8KQEAgLTIwMywxMyArMjEyLDE3IEBACiAJezEsIG9pZF9ydF9wcm9fcXVlcnlfcnhfcGFja2V0X3JlY2VpdmVkX2hkbH0sCS8qMHgyNiovCiAJezEsIG9pZF9ydF9wcm9fcXVlcnlfcnhfcGFja2V0X2NyYzMyX2Vycm9yX2hkbH0sLyoweDI3Ki8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDI4Ci0JCQkJCSAqT0lEX1JUX1BST19RVUVSWV9DVVJSRU5UX0FERFJFU1MqLworCQkJCQkgKk9JRF9SVF9QUk9fUVVFUllfQ1VSUkVOVF9BRERSRVNTCisJCQkJCSAqLwogCXsxLCBvaWRfbnVsbF9mdW5jdGlvbn0sCQkvKjB4MjkKLQkJCQkJICpPSURfUlRfUFJPX1FVRVJZX1BFUk1BTkVOVF9BRERSRVNTKi8KKwkJCQkJICpPSURfUlRfUFJPX1FVRVJZX1BFUk1BTkVOVF9BRERSRVNTCisJCQkJCSAqLwogCXsxLCBvaWRfbnVsbF9mdW5jdGlvbn0sCQkvKjB4MkEKLQkJCQkgKk9JRF9SVF9QUk9fU0VUX1BISUxJUFNfUkZfUEFSQU1FVEVSUyovCisJCQkJICpPSURfUlRfUFJPX1NFVF9QSElMSVBTX1JGX1BBUkFNRVRFUlMKKwkJCQkgKi8KIAl7MSwgb2lkX3J0X3Byb19zZXRfY2Fycmllcl9zdXBwcmVzc2lvbl90eF9oZGx9LC8qMHgyQgotCQkJCSAqT0lEX1JUX1BST19TRVRfQ0FSUklFUl9TVVBQUkVTU0lPTl9UWCovCisJCQkJICpPSURfUlRfUFJPX1NFVF9DQVJSSUVSX1NVUFBSRVNTSU9OX1RYCisJCQkJICovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgyQwlPSURfUlRfUFJPX1JFQ0VJVkVfUEFDS0VUKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDJECU9JRF9SVF9QUk9fV1JJVEVfRUVQUk9NX0JZVEUqLwogCXsxLCBvaWRfbnVsbF9mdW5jdGlvbn0sCQkvKjB4MkUJT0lEX1JUX1BST19SRUFEX0VFUFJPTV9CWVRFKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXBfcGh5X3JlZ2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcF9waHlfcmVnZGVmLmgKaW5kZXggMmU5MTIwYS4uMTFiY2ZiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcF9waHlfcmVnZGVmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcF9waHlfcmVnZGVmLmgKQEAgLTgyLDcgKzgyLDggQEAKICAqIDMuIFBhZ2U4KDB4ODAwKQogICovCiAjZGVmaW5lCXJGUEdBMF9SRk1PRAkJCTB4ODAwCS8qUkYgbW9kZSAmIENDSyBUeFNDIFJGCi0JCQkJCQkgKiBCVyBTZXR0aW5nPz8gKi8KKwkJCQkJCSAqIEJXIFNldHRpbmc/PworCQkJCQkJICovCiAjZGVmaW5lCXJGUEdBMF9UeEluZm8JCQkweDgwNAkvKiBTdGF0dXMgcmVwb3J0Pz8gKi8KICNkZWZpbmUJckZQR0EwX1BTREZ1bmN0aW9uCQkweDgwOAogI2RlZmluZQlyRlBHQTBfVHhHYWluU3RhZ2UJCTB4ODBjCS8qIFNldCBUWCBQV1IgaW5pdCBnYWluPyAqLwpAQCAtMTE5LDcgKzEyMCw4IEBACiAKICNkZWZpbmUJckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEJCTB4ODgwCS8qIENyeXN0YWwgY2FwIHNldHRpbmcKIAkJCQkJCSAqIFJGLVIvVyBwcm90ZWN0aW9uCi0JCQkJCQkgKiBmb3IgcGFyYW1ldGVyND8/ICovCisJCQkJCQkgKiBmb3IgcGFyYW1ldGVyND8/CisJCQkJCQkgKi8KICNkZWZpbmUJckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjIJCTB4ODg0CiAjZGVmaW5lCXJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIzCQkweDg4OAkvKiBVc2VsZXNzIG5vdyAqLwogI2RlZmluZQlyRlBHQTBfQW5hbG9nUGFyYW1ldGVyNAkJMHg4OGMKQEAgLTE0Niw3ICsxNDgsOCBAQAogICogNS4gUGFnZUEoMHhBMDApCiAgKgogICogU2V0IENvbnRyb2wgY2hhbm5lbCB0byB1cHBlciBvciBsb3dlci4KLSAqIFRoZXNlIHNldHRpbmdzIGFyZSByZXF1aXJlZCBvbmx5IGZvciA0ME1IeiAqLworICogVGhlc2Ugc2V0dGluZ3MgYXJlIHJlcXVpcmVkIG9ubHkgZm9yIDQwTUh6CisgKi8KICNkZWZpbmUJckNDSzBfU3lzdGVtCQkJMHhhMDAKIAogI2RlZmluZQlyQ0NLMF9BRkVTZXR0aW5nCQkweGEwNAkvKiBEaXNhYmxlIGluaXQgZ2FpbiBub3cgKi8KQEAgLTE1NSwyMCArMTU4LDIzIEBACiAjZGVmaW5lCXJDQ0swX1J4QUdDMQkJCTB4YTBjCiAvKiBBR0MgZGVmYXVsdCB2YWx1ZSwgc2F0dXJhdGlvbiBsZXZlbAogICogQW50ZW5uYSBEaXZlcnNpdHksIFJYIEFHQywgTE5BIFRocmVzaG9sZCwgUlggTE5BIFRocmVzaG9sZCB1c2VsZXNzIG5vdy4KLSAqIE5vdCB0aGUgc2FtZSBhcyA5MCBzZXJpZXMgKi8KKyAqIE5vdCB0aGUgc2FtZSBhcyA5MCBzZXJpZXMKKyAqLwogI2RlZmluZQlyQ0NLMF9SeEFHQzIJCQkweGExMAkvKiBBR0MgJiBEQUdDICovCiAKICNkZWZpbmUJckNDSzBfUnhIUAkJCTB4YTE0CiAKICNkZWZpbmUJckNDSzBfRFNQUGFyYW1ldGVyMQkJMHhhMTgJLyogVGltaW5nIHJlY292ZXJ5ICYgQ2hhbm5lbAotCQkJCQkJICogZXN0aW1hdGlvbiB0aHJlc2hvbGQgKi8KKwkJCQkJCSAqIGVzdGltYXRpb24gdGhyZXNob2xkCisJCQkJCQkgKi8KICNkZWZpbmUJckNDSzBfRFNQUGFyYW1ldGVyMgkJMHhhMWMJLyogU1EgdGhyZXNob2xkICovCiAKICNkZWZpbmUJckNDSzBfVHhGaWx0ZXIxCQkJMHhhMjAKICNkZWZpbmUJckNDSzBfVHhGaWx0ZXIyCQkJMHhhMjQKICNkZWZpbmUJckNDSzBfRGVidWdQb3J0CQkJMHhhMjgJLyogZGVidWcgcG9ydCBhbmQgVHggZmlsdGVyMyAqLwogI2RlZmluZQlyQ0NLMF9GYWxzZUFsYXJtUmVwb3J0CQkweGEyYwkvKiAweGEyZCB1c2VsZXNzIG5vdyAweGEzMC1hNGYKLQkJCQkJCSAqIGNoYW5uZWwgcmVwb3J0ICovCisJCQkJCQkgKiBjaGFubmVsIHJlcG9ydAorCQkJCQkJICovCiAjZGVmaW5lCXJDQ0swX1RSU1NJUmVwb3J0CQkweGE1MAogI2RlZmluZQlyQ0NLMF9SeFJlcG9ydAkJCTB4YTU0ICAgLyogMHhhNTcgKi8KICNkZWZpbmUJckNDSzBfRkFDb3VudGVyTG93ZXIJCTB4YTVjICAgLyogMHhhNWIgKi8KQEAgLTE5MywxMSArMTk5LDEzIEBACiAjZGVmaW5lCXJPRkRNMF9YRFJ4SVFJbWJhbGFuY2UJCTB4YzJjCiAKICNkZWZpbmUJck9GRE0wX1J4RGV0ZWN0b3IxCQkweGMzMCAgLyogUEQsQlcgJiBTQkQgRE0gdHVuZQotCQkJCQkJKiBpbml0IGdhaW4gKi8KKwkJCQkJCSogaW5pdCBnYWluCisJCQkJCQkqLwogI2RlZmluZQlyT0ZETTBfUnhEZXRlY3RvcjIJCTB4YzM0ICAvKiBTQkQgJiBGYW1lIFN5bmMuICovCiAjZGVmaW5lCXJPRkRNMF9SeERldGVjdG9yMwkJMHhjMzggIC8qIEZyYW1lIFN5bmMuICovCiAjZGVmaW5lCXJPRkRNMF9SeERldGVjdG9yNAkJMHhjM2MgIC8qIFBELCBTQkQsIEZyYW1lIFN5bmMgJgotCQkJCQkJKiBTaG9ydC1HSSAqLworCQkJCQkJKiBTaG9ydC1HSQorCQkJCQkJKi8KIAogI2RlZmluZQlyT0ZETTBfUnhEU1AJCQkweGM0MCAgLyogUnggU3luYyBQYXRoICovCiAjZGVmaW5lCXJPRkRNMF9DRk9hbmREQUdDCQkweGM0NCAgLyogQ0ZPICYgREFHQyAqLwpAQCAtMjgzLDcgKzI5MSw4IEBACiAjZGVmaW5lCXJUeEFHQ19NY3MxNV9NY3MxMgkJMHhlMWMKIAogLyogQW5hbG9nLSBjb250cm9sIGluIFJYX1dBSVRfQ0NBIDogUkVHOiBFRTAKLSAqIFtBbmFsb2ctIFBvd2VyICYgQ29udHJvbCBSZWdpc3Rlcl0gKi8KKyAqIFtBbmFsb2ctIFBvd2VyICYgQ29udHJvbCBSZWdpc3Rlcl0KKyAqLwogI2RlZmluZQkJclJ4X1dhaXRfQ0NDQQkJMHhlNzAKICNkZWZpbmUJckFuYXBhcl9DdHJsX0JCCQkJMHhlZTAKIApAQCAtMzcxLDcgKzM4MCw4IEBACiAvKgogICogQml0IE1hc2sKICAqCi0gKiAxLiBQYWdlMSgweDEwMCkgKi8KKyAqIDEuIFBhZ2UxKDB4MTAwKQorICovCiAjZGVmaW5lCWJCQlJlc2V0QgkJCTB4MTAwCS8qIFVzZWxlc3Mgbm93PyAqLwogI2RlZmluZQliR2xvYmFsUmVzZXRCCQkJMHgyMDAKICNkZWZpbmUJYk9GRE1UeFN0YXJ0CQkJMHg0CkBAIC05MTgsNyArOTI4LDggQEAKICNkZWZpbmUJYlBlc3Vkb05vaXNlU3RhdGVfRCAgICAgIDB4ZmZmZjAwMDAKIAogLyogNy4gUkYgUmVnaXN0ZXIKLSAqIFplYnJhMSAqLworICogWmVicmExCisgKi8KICNkZWZpbmUJYlplYnJhMV9IU1NJRW5hYmxlICAgICAgICAweDgJCS8qIFVzZWxlc3MgKi8KICNkZWZpbmUJYlplYnJhMV9UUnhDb250cm9sICAgICAgICAweGMwMAogI2RlZmluZQliWmVicmExX1RSeEdhaW5TZXR0aW5nICAgIDB4MDdmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3B3cmN0cmwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5jCmluZGV4IGJmMTBkNmQuLmQ0NjRjMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5jCkBAIC01Miw3ICs1Miw4IEBACiAJCXB3cnByaXYtPmNwd20gPSB2YWw4OwogCQlicmVhazsKIAljYXNlIFBTX1NUQVRFX1MyOi8qIG9ubHkgZm9yIFVTQiBub3JtYWwgcG93ZXJzYXZlIG1vZGUgdXNlLAotCQkJICAqIHRlbXAgbWFyayBzb21lIGNvZGUuICovCisJCQkgICogdGVtcCBtYXJrIHNvbWUgY29kZS4KKwkJCSAgKi8KIAljYXNlIFBTX1NUQVRFX1MzOgogCWNhc2UgUFNfU1RBVEVfUzQ6CiAJCXB3cnByaXYtPmNwd20gPSB2YWw4OwpAQCAtMTAzLDE0ICsxMDQsMTQgQEAKIAlpZiAocHdycHJpdi0+Y3B3bV90b2cgPT0gKChwcmVwb3J0cHdyc3RhdGUtPnN0YXRlKSAmIDB4ODApKQogCQlyZXR1cm47CiAJZGVsX3RpbWVyKCZwYWRhcHRlci0+cHdyY3RybHByaXYucnB3bV9jaGVja190aW1lcik7Ci0JX2VudGVyX3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCW11dGV4X2xvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCXB3cnByaXYtPmNwd20gPSAocHJlcG9ydHB3cnN0YXRlLT5zdGF0ZSkgJiAweGY7CiAJaWYgKHB3cnByaXYtPmNwd20gPj0gUFNfU1RBVEVfUzIpIHsKIAkJaWYgKHB3cnByaXYtPmFsaXZlcyAmIENNRF9BTElWRSkKLQkJCXVwKCYocGNtZHByaXYtPmNtZF9xdWV1ZV9zZW1hKSk7CisJCQljb21wbGV0ZSgmKHBjbWRwcml2LT5jbWRfcXVldWVfY29tcCkpOwogCX0KIAlwd3Jwcml2LT5jcHdtX3RvZyA9IChwcmVwb3J0cHdyc3RhdGUtPnN0YXRlKSAmIDB4ODA7Ci0JdXAoJnB3cnByaXYtPmxvY2spOworCW11dGV4X3VubG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByZWdpc3Rlcl90YXNrX2FsaXZlKHN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cmN0cmwsIHVpbnQgdGFnKQpAQCAtMTQxLDEwICsxNDIsMTAgQEAKIAlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gY29udGFpbmVyX29mKHB3cnByaXYsCiAJCQkJICAgIHN0cnVjdCBfYWRhcHRlciwgcHdyY3RybHByaXYpOwogCWlmICghcHdycHJpdi0+YlNsZWVwKSB7Ci0JCV9lbnRlcl9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwkJbXV0ZXhfbG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAJCWlmIChwd3Jwcml2LT5wd3JfbW9kZSA9PSBQU19NT0RFX0FDVElWRSkKIAkJCXI4NzEyX3NldF9ycHdtKHBhZGFwdGVyLCBQU19TVEFURV9TNCk7Ci0JCXVwKCZwd3Jwcml2LT5sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZwd3Jwcml2LT5tdXRleF9sb2NrKTsKIAl9CiB9CiAKQEAgLTE1NSwxMSArMTU2LDExIEBACiAJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IGNvbnRhaW5lcl9vZihwd3Jwcml2LAogCQkJCSAgICBzdHJ1Y3QgX2FkYXB0ZXIsIHB3cmN0cmxwcml2KTsKIAlpZiAocHdycHJpdi0+Y3B3bSAhPSBwd3Jwcml2LT5ycHdtKSB7Ci0JCV9lbnRlcl9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwkJbXV0ZXhfbG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAJCXI4NzEyX3JlYWQ4KHBhZGFwdGVyLCBTRElPX0hDUFdNKTsKIAkJcHdycHJpdi0+cnB3bV9yZXRyeSA9IDE7CiAJCXI4NzEyX3NldF9ycHdtKHBhZGFwdGVyLCBwd3Jwcml2LT5ycHdtKTsKLQkJdXAoJnB3cnByaXYtPmxvY2spOworCQltdXRleF91bmxvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCX0KIH0KIApAQCAtMTc1LDcgKzE3Niw3IEBACiAJc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybHByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwogCiAJbWVtc2V0KCh1bnNpZ25lZCBjaGFyICopcHdyY3RybHByaXYsIDAsIHNpemVvZihzdHJ1Y3QgcHdyY3RybF9wcml2KSk7Ci0Jc2VtYV9pbml0KCZwd3JjdHJscHJpdi0+bG9jaywgMSk7CisJbXV0ZXhfaW5pdCgmcHdyY3RybHByaXYtPm11dGV4X2xvY2spOwogCXB3cmN0cmxwcml2LT5jcHdtID0gUFNfU1RBVEVfUzQ7CiAJcHdyY3RybHByaXYtPnB3cl9tb2RlID0gUFNfTU9ERV9BQ1RJVkU7CiAJcHdyY3RybHByaXYtPnNtYXJ0X3BzID0gMDsKQEAgLTIwNywxMyArMjA4LDEzIEBACiAJdWludCByZXMgPSBfU1VDQ0VTUzsKIAlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJsID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKIAotCV9lbnRlcl9wd3Jsb2NrKCZwd3JjdHJsLT5sb2NrKTsKKwltdXRleF9sb2NrKCZwd3JjdHJsLT5tdXRleF9sb2NrKTsKIAlyZWdpc3Rlcl90YXNrX2FsaXZlKHB3cmN0cmwsIENNRF9BTElWRSk7CiAJaWYgKHB3cmN0cmwtPmNwd20gPCBQU19TVEFURV9TMikgewogCQlyODcxMl9zZXRfcnB3bShwYWRhcHRlciwgUFNfU1RBVEVfUzMpOwogCQlyZXMgPSBfRkFJTDsKIAl9Ci0JdXAoJnB3cmN0cmwtPmxvY2spOworCW11dGV4X3VubG9jaygmcHdyY3RybC0+bXV0ZXhfbG9jayk7CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMjI5LDcgKzIzMCw3IEBACiB7CiAJc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybCA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7CiAKLQlfZW50ZXJfcHdybG9jaygmcHdyY3RybC0+bG9jayk7CisJbXV0ZXhfbG9jaygmcHdyY3RybC0+bXV0ZXhfbG9jayk7CiAJdW5yZWdpc3Rlcl90YXNrX2FsaXZlKHB3cmN0cmwsIENNRF9BTElWRSk7CiAJaWYgKChwd3JjdHJsLT5jcHdtID4gUFNfU1RBVEVfUzIpICYmCiAJICAgKHB3cmN0cmwtPnB3cl9tb2RlID4gUFNfTU9ERV9BQ1RJVkUpKSB7CkBAIC0yMzksNSArMjQwLDUgQEAKIAkJCXI4NzEyX3NldF9ycHdtKHBhZGFwdGVyLCBQU19TVEFURV9TMCk7CiAJCX0KIAl9Ci0JdXAoJnB3cmN0cmwtPmxvY2spOworCW11dGV4X3VubG9jaygmcHdyY3RybC0+bXV0ZXhfbG9jayk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3B3cmN0cmwuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5oCmluZGV4IGRiZmI1NTUuLmM4MmZkZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5oCkBAIC04NywxNiArODcsMTIgQEAKIAl1bnNpZ25lZCBzaG9ydCByc3ZkOwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIF9lbnRlcl9wd3Jsb2NrKHN0cnVjdCBzZW1hcGhvcmUgKnBsb2NrKQotewotCV9kb3duX3NlbWEocGxvY2spOwotfQotCiBzdHJ1Y3QJcHdyY3RybF9wcml2IHsKLQlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CisJc3RydWN0IG11dGV4IG11dGV4X2xvY2s7CiAJLyp2b2xhdGlsZSovIHU4IHJwd207IC8qIHJlcXVlc3RlZCBwb3dlciBzdGF0ZSBmb3IgZncgKi8KIAkvKiBmdyBjdXJyZW50IHBvd2VyIHN0YXRlLiB1cGRhdGVkIHdoZW4gMS4gcmVhZCBmcm9tIEhDUFdNIG9yCi0JICogMi4gZHJpdmVyIGxvd2VycyBwb3dlciBsZXZlbCAqLworCSAqIDIuIGRyaXZlciBsb3dlcnMgcG93ZXIgbGV2ZWwKKwkgKi8KIAkvKnZvbGF0aWxlKi8gdTggY3B3bTsKIAkvKnZvbGF0aWxlKi8gdTggdG9nOyAvKiB0b2dnbGluZyAqLwogCS8qdm9sYXRpbGUqLyB1OCBjcHdtX3RvZzsgLyogdG9nZ2xpbmcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmMKaW5kZXggMjNjMTQzOC4uY2JkMmU1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmMKQEAgLTI2NSw3ICsyNjUsOCBAQAogCiAJCWlmICgocHN0YSAhPSBOVUxMKSAmJiAocHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQpKSB7CiAJCQkvKiBibG9ja2VkCi0JCQkgKiBvbmx5IGFjY2VwdCBFQVBPTCBmcmFtZSAqLworCQkJICogb25seSBhY2NlcHQgRUFQT0wgZnJhbWUKKwkJCSAqLwogCQkJaWYgKGV0aGVyX3R5cGUgPT0gMHg4ODhlKSB7CiAJCQkJcHJ0bmZyYW1lID0gcHJlY3ZfZnJhbWU7CiAJCQl9IGVsc2UgewpAQCAtMjc3LDcgKzI3OCw4IEBACiAJCX0gZWxzZSB7CiAJCQkvKiBhbGxvd2VkCiAJCQkgKiBjaGVjayBkZWNyeXB0aW9uIHN0YXR1cywgYW5kIGRlY3J5cHQgdGhlCi0JCQkgKiBmcmFtZSBpZiBuZWVkZWQgKi8KKwkJCSAqIGZyYW1lIGlmIG5lZWRlZAorCQkJICovCiAJCQlwcnRuZnJhbWUgPSBwcmVjdl9mcmFtZTsKIAkJCS8qIGNoZWNrIGlzIHRoZSBFQVBPTCBmcmFtZSBvciBub3QgKFJla2V5KSAqLwogCQkJaWYgKGV0aGVyX3R5cGUgPT0gMHg4ODhlKSB7CkBAIC0zMzQsMTkgKzMzNiwyMiBAQAogCQlzdGFfYWRkciA9IHBhdHRyaWItPnNyYzsKIAl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSB7CiAJCS8qIEZvciBTdGF0aW9uIG1vZGUsIHNhIGFuZCBic3NpZCBzaG91bGQgYWx3YXlzIGJlIEJTU0lELAotCQkgKiBhbmQgREEgaXMgbXkgbWFjLWFkZHJlc3MgKi8KKwkJICogYW5kIERBIGlzIG15IG1hYy1hZGRyZXNzCisJCSAqLwogCQlpZiAobWVtY21wKHBhdHRyaWItPmJzc2lkLCBwYXR0cmliLT5zcmMsIEVUSF9BTEVOKSkKIAkJCXJldHVybiBfRkFJTDsKIAkgICAgICAgc3RhX2FkZHIgPSBwYXR0cmliLT5ic3NpZDsKIAl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgewogCQlpZiAoYm1jYXN0KSB7CiAJCQkvKiBGb3IgQVAgbW9kZSwgaWYgREEgPT0gTUNBU1QsIHRoZW4gQlNTSUQgc2hvdWxkCi0JCQkgKiBiZSBhbHNvIE1DQVNUICovCisJCQkgKiBiZSBhbHNvIE1DQVNUCisJCQkgKi8KIAkJCWlmICghSVNfTUNBU1QocGF0dHJpYi0+YnNzaWQpKQogCQkJCXJldHVybiBfRkFJTDsKIAkJfSBlbHNlIHsgLyogbm90IG1jLWZyYW1lICovCiAJCQkvKiBGb3IgQVAgbW9kZSwgaWYgREEgaXMgbm9uLU1DQVNULCB0aGVuIGl0IG11c3QgYmUKLQkJCSAqICBCU1NJRCwgYW5kIGJzc2lkID09IEJTU0lEICovCisJCQkgKiBCU1NJRCwgYW5kIGJzc2lkID09IEJTU0lECisJCQkgKi8KIAkJCWlmIChtZW1jbXAocGF0dHJpYi0+YnNzaWQsIHBhdHRyaWItPmRzdCwgRVRIX0FMRU4pKQogCQkJCXJldHVybiBfRkFJTDsKIAkJCXN0YV9hZGRyID0gcGF0dHJpYi0+c3JjOwpAQCAtMzkxLDcgKzM5Niw4IEBACiAJCWlmICgoR2V0RnJhbWVTdWJUeXBlKHB0cikpID09IFdJRklfREFUQV9OVUxMKQogCQkJcmV0dXJuIF9GQUlMOwogCQkvKiBkcm9wIFFvUy1TdWJUeXBlIERhdGEsIGluY2x1ZGluZyBRb1MgTlVMTCwKLQkJICogZXhjbHVkaW5nIFFvUy1EYXRhICovCisJCSAqIGV4Y2x1ZGluZyBRb1MtRGF0YQorCQkgKi8KIAkJaWYgKChHZXRGcmFtZVN1YlR5cGUocHRyKSAmIFdJRklfUU9TX0RBVEFfVFlQRSkgPT0KIAkJICAgICBXSUZJX1FPU19EQVRBX1RZUEUpIHsKIAkJCWlmIChHZXRGcmFtZVN1YlR5cGUocHRyKSAmIChCSVQoNCkgfCBCSVQoNSkgfCBCSVQoNikpKQpAQCAtNDQ1LDcgKzQ1MSw4IEBACiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgewogCQkvKiBGb3IgQVAgbW9kZSwgaWYgREEgaXMgbm9uLU1DQVNULCB0aGVuIGl0IG11c3QgYmUgQlNTSUQsCiAJCSAqIGFuZCBic3NpZCA9PSBCU1NJRAotCQkgKiBGb3IgQVAgbW9kZSwgUkE9QlNTSUQsIFRYPVNUQShTUkNfQUREUiksIEEzPURTVF9BRERSICovCisJCSAqIEZvciBBUCBtb2RlLCBSQT1CU1NJRCwgVFg9U1RBKFNSQ19BRERSKSwgQTM9RFNUX0FERFIKKwkJICovCiAJCWlmIChtZW1jbXAocGF0dHJpYi0+YnNzaWQsIG15YnNzaWQsIEVUSF9BTEVOKSkKIAkJCXJldHVybiBfRkFJTDsKIAkJKnBzdGEgPSByODcxMl9nZXRfc3RhaW5mbyhwc3RhcHJpdiwgcGF0dHJpYi0+c3JjKTsKQEAgLTYxOSw3ICs2MjYsOCBAQAogCSAgICAobWVtY21wKHBzbmFwX3R5cGUsICh2b2lkICopU05BUF9FVEhfVFlQRV9BUFBMRVRBTEtfQUFSUCwgMikpKSB8fAogCSAgICAgIW1lbWNtcChwc25hcCwgKHZvaWQgKilicmlkZ2VfdHVubmVsX2hlYWRlciwgU05BUF9TSVpFKSkgewogCQkvKiByZW1vdmUgUkZDMTA0MiBvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24gYW5kCi0JCSAqIHJlcGxhY2UgRXRoZXJUeXBlICovCisJCSAqIHJlcGxhY2UgRXRoZXJUeXBlCisJCSAqLwogCQlic25hcGhkciA9IHRydWU7CiAJfSBlbHNlIHsKIAkJLyogTGVhdmUgRXRoZXJuZXQgaGVhZGVyIHBhcnQgb2YgaGRyIGFuZCBmdWxsIHBheWxvYWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcmVjdi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmgKaW5kZXggNzc0ODdiYi4uZjQxOTk0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmgKQEAgLTE1Myw3ICsxNTMsOCBAQAogc3RhdGljIGlubGluZSB1OCAqcmVjdmZyYW1lX3B1bGwodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgc2ludCBzeikKIHsKIAkvKiB1c2VkIGZvciBleHRyYWN0IHN6IGJ5dGVzIGZyb20gcnhfZGF0YSwgdXBkYXRlIHJ4X2RhdGEgYW5kIHJldHVybgotCSAqICB0aGUgdXBkYXRlZCByeF9kYXRhIHRvIHRoZSBjYWxsZXIgKi8KKwkgKiB0aGUgdXBkYXRlZCByeF9kYXRhIHRvIHRoZSBjYWxsZXIKKwkgKi8KIAlpZiAocHJlY3ZmcmFtZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhICs9IHN6OwpAQCAtMTY5LDcgKzE3MCw4IEBACiB7CiAJLyogdXNlZCBmb3IgYXBwZW5kIHN6IGJ5dGVzIGZyb20gcHRyIHRvIHJ4X3RhaWwsIHVwZGF0ZSByeF90YWlsIGFuZAogCSAqIHJldHVybiB0aGUgdXBkYXRlZCByeF90YWlsIHRvIHRoZSBjYWxsZXIKLQkgKiBhZnRlciBwdXR0aW5nLCByeF90YWlsIG11c3QgYmUgc3RpbGwgbGFyZ2VyIHRoYW4gcnhfZW5kLiAqLworCSAqIGFmdGVyIHB1dHRpbmcsIHJ4X3RhaWwgbXVzdCBiZSBzdGlsbCBsYXJnZXIgdGhhbiByeF9lbmQuCisJICovCiAJaWYgKHByZWN2ZnJhbWUgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJcHJlY3ZmcmFtZS0+dS5oZHIucnhfdGFpbCArPSBzejsKQEAgLTE4Niw3ICsxODgsOCBAQAogCS8qIHJtdiBkYXRhIGZyb20gcnhfdGFpbCAoYnkgeWl0c2VuKQogCSAqIHVzZWQgZm9yIGV4dHJhY3Qgc3ogYnl0ZXMgZnJvbSByeF9lbmQsIHVwZGF0ZSByeF9lbmQgYW5kIHJldHVybiB0aGUKIAkgKiB1cGRhdGVkIHJ4X2VuZCB0byB0aGUgY2FsbGVyCi0JICogYWZ0ZXIgcHVsbGluZywgcnhfZW5kIG11c3QgYmUgc3RpbGwgbGFyZ2VyIHRoYW4gcnhfZGF0YS4gKi8KKwkgKiBhZnRlciBwdWxsaW5nLCByeF9lbmQgbXVzdCBiZSBzdGlsbCBsYXJnZXIgdGhhbiByeF9kYXRhLgorCSAqLwogCWlmIChwcmVjdmZyYW1lID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X3RhaWwgLT0gc3o7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3NlY3VyaXR5LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3NlY3VyaXR5LmgKaW5kZXggMjI5NWYwZS4uZmE5NTJlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zZWN1cml0eS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfc2VjdXJpdHkuaApAQCAtOTAsMTggKzkwLDIzIEBACiAKIHN0cnVjdCBzZWN1cml0eV9wcml2IHsKIAl1MzIgQXV0aEFsZ3J0aG07CQkvKiA4MDIuMTEgYXV0aCwgY291bGQgYmUgb3Blbiwgc2hhcmVkLAotCQkJCQkgKiA4MDIxeCBhbmQgYXV0aHN3aXRjaCAqLworCQkJCQkgKiA4MDIxeCBhbmQgYXV0aHN3aXRjaAorCQkJCQkgKi8KIAl1MzIgUHJpdmFjeUFsZ3J0aG07CQkvKiBUaGlzIHNwZWNpZnkgdGhlIHByaXZhY3kgZm9yIHNoYXJlZAotCQkJCQkgKiBhdXRoLiBhbGdvcml0aG0uICovCisJCQkJCSAqIGF1dGguIGFsZ29yaXRobS4KKwkJCQkJICovCiAJdTMyIFByaXZhY3lLZXlJbmRleDsJCS8qIHRoaXMgaXMgb25seSB2YWxpZCBmb3IgbGVnZW5kYXJ5Ci0JCQkJCSAqIHdlcCwgMH4zIGZvciBrZXkgaWQuICovCisJCQkJCSAqIHdlcCwgMH4zIGZvciBrZXkgaWQuCisJCQkJCSAqLwogCXVuaW9uIEtleXR5cGUgRGVmS2V5WzRdOwkvKiB0aGlzIGlzIG9ubHkgdmFsaWQgZm9yIGRlZi4ga2V5ICovCiAJdTMyIERlZktleWxlbls0XTsKIAl1MzIgWEdycFByaXZhY3k7CQkvKiBUaGlzIHNwZWNpZnkgdGhlIHByaXZhY3kgYWxndGhtLgotCQkJCQkgKiB1c2VkIGZvciBHcnAga2V5ICovCisJCQkJCSAqIHVzZWQgZm9yIEdycCBrZXkKKwkJCQkJICovCiAJdTMyIFhHcnBLZXlpZDsJCQkvKiBrZXkgaWQgdXNlZCBmb3IgR3JwIEtleSAqLwogCXVuaW9uIEtleXR5cGUJWEdycEtleVsyXTsJLyogODAyLjF4IEdyb3VwIEtleSwgZm9yCi0JCQkJCSAqIGlueDAgYW5kIGlueDEgKi8KKwkJCQkJICogaW54MCBhbmQgaW54MQorCQkJCQkgKi8KIAl1bmlvbiBLZXl0eXBlCVhHcnB0eG1pY2tleVsyXTsKIAl1bmlvbiBLZXl0eXBlCVhHcnByeG1pY2tleVsyXTsKIAl1bmlvbiBwbjQ4IEdycHR4cG47CQkvKiBQTjQ4IHVzZWQgZm9yIEdycCBLZXkgeG1pdC4gKi8KQEAgLTExOCw5ICsxMjMsMTEgQEAKIAlzMzIJc3dfZW5jcnlwdDsJLyogZnJvbSByZWdpc3RyeV9wcml2ICovCiAJczMyCXN3X2RlY3J5cHQ7CS8qIGZyb20gcmVnaXN0cnlfcHJpdiAqLwogCXMzMglod19kZWNyeXB0ZWQ7CS8qIGlmIHRoZSByeCBwYWNrZXRzIGlzIGh3X2RlY3J5cHRlZD09ZmFsc2UsCi0JCQkJICogaXQgbWVhbnMgdGhlIGh3IGhhcyBub3QgYmVlbiByZWFkeS4gKi8KKwkJCQkgKiBpdCBtZWFucyB0aGUgaHcgaGFzIG5vdCBiZWVuIHJlYWR5LgorCQkJCSAqLwogCXUzMiBuZGlzYXV0aHR5cGU7CS8qIGtlZXBzIHRoZSBhdXRoX3R5cGUgJiBlbmNfc3RhdHVzIGZyb20gdXBwZXIKLQkJCQkgKiBsYXllciBpb2N0bCh3cGFfc3VwcGxpY2FudCBvciB3emMpICovCisJCQkJICogbGF5ZXIgaW9jdGwod3BhX3N1cHBsaWNhbnQgb3Igd3pjKQorCQkJCSAqLwogCXUzMiBuZGlzZW5jcnlwdHN0YXR1czsKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCBzZWNfYnNzOyAgLyogZm9yIGpvaW5ic3MgKGgyYyBidWZmZXIpIHVzYWdlICovCiAJc3RydWN0IE5ESVNfODAyXzExX1dFUCBuZGlzd2VwOwpAQCAtMTM2LDcgKzE0Myw4IEBACiAJdTMyIGJ0a2lwX2NvdW50ZXJtZWFzdXJlX3RpbWU7CiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJICogRm9yIFdQQTIgUHJlLUF1dGhlbnRpY2F0aW9uLgotCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiovCiAJc3RydWN0IFJUX1BNS0lEX0xJU1QJCVBNS0lETGlzdFtOVU1fUE1LSURfQ0FDSEVdOwogCXU4CQkJCVBNS0lESW5kZXg7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zdGFfbWd0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3N0YV9tZ3QuYwppbmRleCBlMTFjZTI4Li5lMmQ3NWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3N0YV9tZ3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3N0YV9tZ3QuYwpAQCAtMTg4LDcgKzE4OCw4IEBACiAJX3I4NzEyX2luaXRfc3RhX3htaXRfcHJpdigmcHN0YS0+c3RhX3htaXRwcml2KTsKIAlfcjg3MTJfaW5pdF9zdGFfcmVjdl9wcml2KCZwc3RhLT5zdGFfcmVjdnByaXYpOwogCS8qIGZvciBBLU1QRFUgUnggcmVvcmRlcmluZyBidWZmZXIgY29udHJvbCwKLQkgKiBjYW5jZWwgcmVvcmRlcmluZ19jdHJsX3RpbWVyICovCisJICogY2FuY2VsIHJlb3JkZXJpbmdfY3RybF90aW1lcgorCSAqLwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAJCXByZW9yZGVyX2N0cmwgPSAmcHN0YS0+cmVjdnJlb3JkZXJfY3RybFtpXTsKIAkJZGVsX3RpbWVyKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF94bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuYwppbmRleCA5OTI1NmJhLi5iZTM4MzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuYwpAQCAtMjA0LDcgKzIwNCw4IEBACiAKIHsKIAkvKklmIGRyaXZlciB4bWl0IEFSUCBwYWNrZXQsIGRyaXZlciBjYW4gc2V0IHBzIG1vZGUgdG8gaW5pdGlhbAotCSAqIHNldHRpbmcuIEl0IHN0YW5kcyBmb3IgZ2V0dGluZyBESENQIG9yIGZpeCBJUC4qLworCSAqIHNldHRpbmcuIEl0IHN0YW5kcyBmb3IgZ2V0dGluZyBESENQIG9yIGZpeCBJUC4KKwkgKi8KIAlpZiAocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSAweDA4MDYpIHsKIAkJaWYgKHBhZGFwdGVyLT5wd3JjdHJscHJpdi5wd3JfbW9kZSAhPQogCQkgICAgcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5wb3dlcl9tZ250KSB7CkBAIC0yMzIsNyArMjMzLDggQEAKIAkJaWYgKHBhdHRyaWItPmV0aGVyX3R5cGUgIT0gMHg4NzEyKQogCQkJcmV0dXJuIF9GQUlMOwogCQkvKiBmb3IgbXAgc3RvcmluZyB0aGUgdHhjbWQgcGVyIHBhY2tldCwKLQkJICogYWNjb3JkaW5nIHRvIHRoZSBpbmZvIG9mIHR4Y21kIHRvIHVwZGF0ZSBwYXR0cmliICovCisJCSAqIGFjY29yZGluZyB0byB0aGUgaW5mbyBvZiB0eGNtZCB0byB1cGRhdGUgcGF0dHJpYgorCQkgKi8KIAkJLypnZXQgTVBfVFhERVNDX1NJWkUgYnl0ZXMgdHhjbWQgcGVyIHBhY2tldCovCiAJCV9yODcxMl9wa3RmaWxlX3JlYWQoJnBrdGZpbGUsICh1OCAqKSZ0eGRlc2MsIFRYREVTQ19TSVpFKTsKIAkJbWVtY3B5KHBhdHRyaWItPnJhLCBwYXR0cmliLT5kc3QsIEVUSF9BTEVOKTsKQEAgLTI0NCw3ICsyNDYsOCBAQAogCWlmIChwYXR0cmliLT5ldGhlcl90eXBlID09IEVUSF9QX0lQKSB7CiAJCS8qIFRoZSBmb2xsb3dpbmcgaXMgZm9yIERIQ1AgYW5kIEFSUCBwYWNrZXQsIHdlIHVzZSBjY2sxTSB0bwogCQkgKiB0eCB0aGVzZSBwYWNrZXRzIGFuZCBsZXQgTFBTIGF3YWtlIHNvbWUgdGltZQotCQkgKiB0byBwcmV2ZW50IERIQ1AgcHJvdG9jb2wgZmFpbCAqLworCQkgKiB0byBwcmV2ZW50IERIQ1AgcHJvdG9jb2wgZmFpbAorCQkgKi8KIAkJdTggdG1wWzI0XTsKIAogCQlfcjg3MTJfcGt0ZmlsZV9yZWFkKCZwa3RmaWxlLCAmdG1wWzBdLCAyNCk7CkBAIC0yNTUsNyArMjU4LDggQEAKIAkJCQkJKCh0bXBbMjFdID09IDY3KSAmJiAodG1wWzIzXSA9PSA2OCkpKSB7CiAJCQkJCS8qIDY4IDogVURQIEJPT1RQIGNsaWVudAogCQkJCQkgKiA2NyA6IFVEUCBCT09UUCBzZXJ2ZXIKLQkJCQkJICogVXNlIGxvdyByYXRlIHRvIHNlbmQgREhDUCBwYWNrZXQuKi8KKwkJCQkJICogVXNlIGxvdyByYXRlIHRvIHNlbmQgREhDUCBwYWNrZXQuCisJCQkJCSAqLwogCQkJCQlwYXR0cmliLT5kaGNwX3BrdCA9IDE7CiAJCQkJfQogCQkJfQpAQCAtMzM3LDcgKzM0MSw4IEBACiAJZWxzZQogCQlwYXR0cmliLT5ic3dlbmMgPSBmYWxzZTsKIAkvKiBpZiBpbiBNUF9TVEFURSwgdXBkYXRlIHBrdF9hdHRyaWIgZnJvbSBtcF90eGNtZCwgYW5kIG92ZXJ3cml0ZQotCSAqIHNvbWUgc2V0dGluZ3MgYWJvdmUuKi8KKwkgKiBzb21lIHNldHRpbmdzIGFib3ZlLgorCSAqLwogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9NUF9TVEFURSkpCiAJCXBhdHRyaWItPnByaW9yaXR5ID0gKHR4ZGVzYy50eGR3MSA+PiBRU0VMX1NIVCkgJiAweDFmOwogCXJldHVybiBfU1VDQ0VTUzsKQEAgLTQzOCw3ICs0NDMsOCBAQAogCQkJfQogCQkJcjg3MTJfc2VjZ2V0bWljKCZtaWNkYXRhLCAmKG1pY1swXSkpOwogCQkJLyogYWRkIG1pYyBjb2RlICBhbmQgYWRkIHRoZSBtaWMgY29kZSBsZW5ndGggaW4KLQkJCSAqIGxhc3RfdHhjbWRzeiAqLworCQkJICogbGFzdF90eGNtZHN6CisJCQkgKi8KIAkJCW1lbWNweShwYXlsb2FkLCAmKG1pY1swXSksIDgpOwogCQkJcGF0dHJpYi0+bGFzdF90eGNtZHN6ICs9IDg7CiAJCQlwYXlsb2FkID0gcGF5bG9hZCAtIHBhdHRyaWItPmxhc3RfdHhjbWRzeiArIDg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfeG1pdC5oCmluZGV4IGE5NjMzYzMuLmQ4OTlkMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfeG1pdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfeG1pdC5oCkBAIC01OCw3ICs1OCw4IEBACiB9IHdoaWxlICgwKQogCiAvKiBGaXhlZCB0aGUgQmlnIEVuZGlhbiBidWcgd2hlbiBkb2luZyB0aGUgVHguCi0gKiBUaGUgTGlua3N5cyBXUkg1NEcgd2lsbCBjaGVjayB0aGlzLiovCisgKiBUaGUgTGlua3N5cyBXUkg1NEcgd2lsbCBjaGVjayB0aGlzLgorICovCiAjZGVmaW5lIFRLSVBfSVYocGF0dHJpYl9pdiwgdHhwbiwga2V5aWR4KVwKIGRvIHsgXAogCXBhdHRyaWJfaXZbMF0gPSB0eHBuLl9ieXRlXy5UU0MxO1wKQEAgLTEwNSw3ICsxMDYsOCBAQAogCXUxNglzZXFudW07CiAJdTE2CWV0aGVyX3R5cGU7CiAJdTE2CXBrdGxlbjsJCS8qIHRoZSBvcmlnaW5hbCA4MDIuMyBwa3QgcmF3X2RhdGEgbGVuCi0JCQkJICogKG5vdCBpbmNsdWRlIGV0aGVyX2hkciBkYXRhKSAqLworCQkJCSAqIChub3QgaW5jbHVkZSBldGhlcl9oZHIgZGF0YSkKKwkJCQkgKi8KIAl1MTYJbGFzdF90eGNtZHN6OwogCiAJdTgJcGt0X2hkcmxlbjsJLyp0aGUgb3JpZ2luYWwgODAyLjMgcGt0IGhlYWRlciBsZW4qLwpAQCAtMTE5LDcgKzEyMSw4IEBACiAKIAl1OAlwcmlvcml0eTsKIAl1OAllbmNyeXB0OwkvKiB3aGVuIDAgaW5kaWNhdGUgbm8gZW5jcnlwdC4gd2hlbiBub24temVybywKLQkJCQkgKiBpbmRpY2F0ZSB0aGUgZW5jcnlwdCBhbGdvcml0aG0qLworCQkJCSAqIGluZGljYXRlIHRoZSBlbmNyeXB0IGFsZ29yaXRobQorCQkJCSAqLwogCXU4CWl2X2xlbjsKIAl1OAlpY3ZfbGVuOwogCXVuc2lnbmVkIGNoYXIgaXZbOF07CkBAIC0xNzYsNyArMTc5LDggQEAKIAlzcGlubG9ja190IGxvY2s7CiAJc2ludAlvcHRpb247CiAJc2ludAlhcHNkX3NldHRpbmc7CS8qIFdoZW4gYml0IG1hc2sgaXMgb24sIHRoZSBhc3NvY2lhdGVkIGVkY2EKLQkJCQkgKiBxdWV1ZSBzdXBwb3J0cyBBUFNELiovCisJCQkJICogcXVldWUgc3VwcG9ydHMgQVBTRC4KKwkJCQkgKi8KIAlzdHJ1Y3QgdHhfc2VydnEJYmVfcTsJLyogcHJpb3JpdHkgPT0gMCwzICovCiAJc3RydWN0IHR4X3NlcnZxCWJrX3E7CS8qIHByaW9yaXR5ID09IDEsMiovCiAJc3RydWN0IHR4X3NlcnZxCXZpX3E7CS8qcHJpb3JpdHkgPT0gNCw1Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9oYWxpbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2JfaGFsaW5pdC5jCmluZGV4IGFkMjFkZjEuLjBiMTU5ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9oYWxpbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX2hhbGluaXQuYwpAQCAtMTk2LDcgKzE5Niw4IEBACiAJCW1zbGVlcCgyMCk7CiAJCS8qIFJldmlzZWQgUE9TLCAqLwogCQkvKiBFbmFibGUgQUZFIE1hY3JvIEJsb2NrJ3MgQmFuZGdhcCBhbmQgRW5hYmxlIEFGRSBNYWNybwotCQkgKiBCbG9jaydzIE1iaWFzICovCisJCSAqIEJsb2NrJ3MgTWJpYXMKKwkJICovCiAJCXI4NzEyX3dyaXRlOChwYWRhcHRlciwgU1BTMF9DVFJMICsgMSwgMHg1Myk7CiAJCXI4NzEyX3dyaXRlOChwYWRhcHRlciwgU1BTMF9DVFJMLCAweDU3KTsKIAkJdmFsOCA9IHI4NzEyX3JlYWQ4KHBhZGFwdGVyLCBBRkVfTUlTQyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2JfaW50Zi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX2ludGYuYwppbmRleCBjMWEwY2E0OS4uODk3ZDQ2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX2ludGYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2JfaW50Zi5jCkBAIC0zMDEsNyArMzAxLDggQEAKIAkvKmRpc2FibGVfaHdfaW50ZXJydXB0Ki8KIAlpZiAoIXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSB7CiAJCS8qZGV2aWNlIHN0aWxsIGV4aXN0cywgc28gZHJpdmVyIGNhbiBkbyBpL28gb3BlcmF0aW9uCi0JCSAqIFRPRE86ICovCisJCSAqIFRPRE86CisJCSAqLwogCX0KIAogCS8qIGNhbmNlbCBpbiBpcnAgKi8KQEAgLTM2OCw3ICszNjksNyBAQAogICoKICAqIG5vdGVzOiBkcnZfaW5pdCgpIGlzIGNhbGxlZCB3aGVuIHRoZSBidXMgZHJpdmVyIGhhcyBsb2NhdGVkIGEgY2FyZCBmb3IgdXMKICAqIHRvIHN1cHBvcnQuIFdlIGFjY2VwdCB0aGUgbmV3IGRldmljZSBieSByZXR1cm5pbmcgMC4KLSovCisgKi8KIHN0YXRpYyBpbnQgcjg3MXh1X2Rydl9pbml0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICpwdXNiX2ludGYsCiAJCQkgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqcGRpZCkKIHsKQEAgLTYxMSw3ICs2MTIsOCBAQAogfQogCiAvKiBybW1vZCBtb2R1bGUgJiB1bnBsdWcoU3VycHJpc2VSZW1vdmVkKSB3aWxsIGNhbGwgcjg3MXh1X2Rldl9yZW1vdmUoKQotICogPT4gaG93IHRvIHJlY29nbml6ZSBib3RoICovCisgKiA9PiBob3cgdG8gcmVjb2duaXplIGJvdGgKKyAqLwogc3RhdGljIHZvaWQgcjg3MXh1X2Rldl9yZW1vdmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JfaW50ZikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiA9IHVzYl9nZXRfaW50ZmRhdGEocHVzYl9pbnRmKTsKQEAgLTYzNSwxMiArNjM3LDE0IEBACiAJCXI4NzEyX2ZyZWVfZHJ2X3N3KHBhZGFwdGVyKTsKIAogCQkvKiBkZWNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSB1c2IgZGV2aWNlIHN0cnVjdHVyZQotCQkgKiB3aGVuIGRpc2Nvbm5lY3QgKi8KKwkJICogd2hlbiBkaXNjb25uZWN0CisJCSAqLwogCQl1c2JfcHV0X2Rldih1ZGV2KTsKIAl9CiAJLyogSWYgd2UgZGlkbid0IHVucGx1ZyB1c2IgZG9uZ2xlIGFuZCByZW1vdmUvaW5zZXJ0IG1vZHVsZSwgZHJpdmVyCiAJICogZmFpbHMgb24gc2l0ZXN1cnZleSBmb3IgdGhlIGZpcnN0IHRpbWUgd2hlbiBkZXZpY2UgaXMgdXAuCi0JICogUmVzZXQgdXNiIHBvcnQgZm9yIHNpdGVzdXJ2ZXkgZmFpbCBpc3N1ZS4gKi8KKwkgKiBSZXNldCB1c2IgcG9ydCBmb3Igc2l0ZXN1cnZleSBmYWlsIGlzc3VlLgorCSAqLwogCWlmICh1ZGV2LT5zdGF0ZSAhPSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpCiAJCXVzYl9yZXNldF9kZXZpY2UodWRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2Jfb3BzX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2Jfb3BzX2xpbnV4LmMKaW5kZXggNmYxMjM0NS4uZmM2YmIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX29wc19saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9vcHNfbGludXguYwpAQCAtNTAsNyArNTAsNyBAQAogCXBpbnRmcHJpdi0+cGlvcndfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXBpbnRmcHJpdi0+cGlvcndfdXJiKQogCQlyZXR1cm4gX0ZBSUw7Ci0Jc2VtYV9pbml0KCYocGludGZwcml2LT5pb19yZXRldnQpLCAwKTsKKwlpbml0X2NvbXBsZXRpb24oJnBpbnRmcHJpdi0+aW9fcmV0ZXZ0X2NvbXApOwogCXJldHVybiBfU1VDQ0VTUzsKIH0KIApAQCAtMTYzLDcgKzE2Myw3IEBACiAJCWVsc2UKIAkJCXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID0gdHJ1ZTsKIAl9Ci0JdXAoJnBpbnRmcHJpdi0+aW9fcmV0ZXZ0KTsKKwljb21wbGV0ZSgmcGludGZwcml2LT5pb19yZXRldnRfY29tcCk7CiB9CiAKIHZvaWQgcjg3MTJfdXNiX3dyaXRlX21lbShzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkciwgdTMyIGNudCwgdTggKndtZW0pCkBAIC0xODcsNyArMTg3LDcgQEAKIAkJCSAgd21lbSwgY250LCB1c2Jfd3JpdGVfbWVtX2NvbXBsZXRlLAogCQkJICBwaW9fcXVldWUpOwogCXVzYl9zdWJtaXRfdXJiKHBpb3J3X3VyYiwgR0ZQX0FUT01JQyk7Ci0JX2Rvd25fc2VtYSgmcGludGZwcml2LT5pb19yZXRldnQpOworCXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmcGludGZwcml2LT5pb19yZXRldnRfY29tcCk7CiB9CiAKIHN0YXRpYyB2b2lkIHI4NzEyX3VzYl9yZWFkX3BvcnRfY29tcGxldGUoc3RydWN0IHVyYiAqcHVyYikKQEAgLTIwMiwyNiArMjAyLDIzIEBACiAJaWYgKHB1cmItPnN0YXR1cyA9PSAwKSB7IC8qIFNVQ0NFU1MgKi8KIAkJaWYgKChwdXJiLT5hY3R1YWxfbGVuZ3RoID4gKE1BWF9SRUNWQlVGX1NaKSkgfHwKIAkJICAgIChwdXJiLT5hY3R1YWxfbGVuZ3RoIDwgUlhERVNDX1NJWkUpKSB7Ci0JCQlwcmVjdmJ1Zi0+cmV1c2UgPSB0cnVlOwogCQkJcjg3MTJfcmVhZF9wb3J0KHBhZGFwdGVyLCBwcmVjdnByaXYtPmZmX2h3YWRkciwgMCwKIAkJCQkgICh1bnNpZ25lZCBjaGFyICopcHJlY3ZidWYpOwogCQl9IGVsc2UgeworCQkJX3BrdCAqcHNrYiA9IHByZWN2YnVmLT5wc2tiOworCiAJCQlwcmVjdmJ1Zi0+dHJhbnNmZXJfbGVuID0gcHVyYi0+YWN0dWFsX2xlbmd0aDsKIAkJCXBidWYgPSAodWludCAqKXByZWN2YnVmLT5wYnVmOwogCQkJaXNldnQgPSBsZTMyX3RvX2NwdSgqKHBidWYgKyAxKSkgJiAweDFmZjsKIAkJCWlmICgoaXNldnQgJiAweDFmZikgPT0gMHgxZmYpIHsKIAkJCQlyODcxMl9yeGNtZF9ldmVudF9oZGwocGFkYXB0ZXIsIHBidWYpOwotCQkJCXByZWN2YnVmLT5yZXVzZSA9IHRydWU7CisJCQkJc2tiX3F1ZXVlX3RhaWwoJnByZWN2cHJpdi0+cnhfc2tiX3F1ZXVlLCBwc2tiKTsKIAkJCQlyODcxMl9yZWFkX3BvcnQocGFkYXB0ZXIsIHByZWN2cHJpdi0+ZmZfaHdhZGRyLAogCQkJCQkJMCwgKHVuc2lnbmVkIGNoYXIgKilwcmVjdmJ1Zik7CiAJCQl9IGVsc2UgewotCQkJCV9wa3QgKnBza2IgPSBwcmVjdmJ1Zi0+cHNrYjsKLQogCQkJCXNrYl9wdXQocHNrYiwgcHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCQkJc2tiX3F1ZXVlX3RhaWwoJnByZWN2cHJpdi0+cnhfc2tiX3F1ZXVlLCBwc2tiKTsKIAkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwcmVjdnByaXYtPnJlY3ZfdGFza2xldCk7Ci0JCQkJcHJlY3ZidWYtPnBza2IgPSBOVUxMOwotCQkJCXByZWN2YnVmLT5yZXVzZSA9IGZhbHNlOwogCQkJCXI4NzEyX3JlYWRfcG9ydChwYWRhcHRlciwgcHJlY3Zwcml2LT5mZl9od2FkZHIsCiAJCQkJCQkwLCAodW5zaWduZWQgY2hhciAqKXByZWN2YnVmKTsKIAkJCX0KQEAgLTI0MSw3ICsyMzgsNiBAQAogCQkJfQogCQkJLyogRmFsbCB0aHJvdWdoLiAqLwogCQljYXNlIC1FUFJPVE86Ci0JCQlwcmVjdmJ1Zi0+cmV1c2UgPSB0cnVlOwogCQkJcjg3MTJfcmVhZF9wb3J0KHBhZGFwdGVyLCBwcmVjdnByaXYtPmZmX2h3YWRkciwgMCwKIAkJCQkgICh1bnNpZ25lZCBjaGFyICopcHJlY3ZidWYpOwogCQkJYnJlYWs7CkBAIC0yNzAsNTEgKzI2Niw0MyBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICpwdXNiZCA9IHBkdm9iai0+cHVzYmRldjsKIAogCWlmIChhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkIHx8Ci0JICAgIGFkYXB0ZXItPnB3cmN0cmxwcml2LnBucF9ic3RvcF90cngpCisJICAgIGFkYXB0ZXItPnB3cmN0cmxwcml2LnBucF9ic3RvcF90cnggfHwgIXByZWN2YnVmKQogCQlyZXR1cm4gX0ZBSUw7Ci0JaWYgKHByZWN2YnVmLT5yZXVzZSB8fCAhcHJlY3ZidWYtPnBza2IpIHsKLQkJcHJlY3ZidWYtPnBza2IgPSBza2JfZGVxdWV1ZSgmcHJlY3Zwcml2LT5mcmVlX3JlY3Zfc2tiX3F1ZXVlKTsKLQkJaWYgKHByZWN2YnVmLT5wc2tiICE9IE5VTEwpCi0JCQlwcmVjdmJ1Zi0+cmV1c2UgPSB0cnVlOworCXI4NzEyX2luaXRfcmVjdmJ1ZihhZGFwdGVyLCBwcmVjdmJ1Zik7CisJLyogVHJ5IHRvIHVzZSBza2IgZnJvbSB0aGUgZnJlZSBxdWV1ZSAqLworCXByZWN2YnVmLT5wc2tiID0gc2tiX2RlcXVldWUoJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3NrYl9xdWV1ZSk7CisKKwlpZiAoIXByZWN2YnVmLT5wc2tiKSB7CisJCXByZWN2YnVmLT5wc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihhZGFwdGVyLT5wbmV0ZGV2LAorCQkJCSBNQVhfUkVDVkJVRl9TWiArIFJFQ1ZCVUZGX0FMSUdOX1NaKTsKKwkJaWYgKCFwcmVjdmJ1Zi0+cHNrYikKKwkJCXJldHVybiBfRkFJTDsKKwkJdG1wYWRkciA9IChhZGRyX3QpcHJlY3ZidWYtPnBza2ItPmRhdGE7CisJCWFsaWdubWVudCA9IHRtcGFkZHIgJiAoUkVDVkJVRkZfQUxJR05fU1ogLSAxKTsKKwkJc2tiX3Jlc2VydmUocHJlY3ZidWYtPnBza2IsCisJCQkgICAgKFJFQ1ZCVUZGX0FMSUdOX1NaIC0gYWxpZ25tZW50KSk7CisJCXByZWN2YnVmLT5waGVhZCA9IHByZWN2YnVmLT5wc2tiLT5oZWFkOworCQlwcmVjdmJ1Zi0+cGRhdGEgPSBwcmVjdmJ1Zi0+cHNrYi0+ZGF0YTsKKwkJcHJlY3ZidWYtPnB0YWlsID0gc2tiX3RhaWxfcG9pbnRlcihwcmVjdmJ1Zi0+cHNrYik7CisJCXByZWN2YnVmLT5wZW5kID0gc2tiX2VuZF9wb2ludGVyKHByZWN2YnVmLT5wc2tiKTsKKwkJcHJlY3ZidWYtPnBidWYgPSBwcmVjdmJ1Zi0+cHNrYi0+ZGF0YTsKKwl9IGVsc2UgeyAvKiBza2IgaXMgcmV1c2VkICovCisJCXByZWN2YnVmLT5waGVhZCA9IHByZWN2YnVmLT5wc2tiLT5oZWFkOworCQlwcmVjdmJ1Zi0+cGRhdGEgPSBwcmVjdmJ1Zi0+cHNrYi0+ZGF0YTsKKwkJcHJlY3ZidWYtPnB0YWlsID0gc2tiX3RhaWxfcG9pbnRlcihwcmVjdmJ1Zi0+cHNrYik7CisJCXByZWN2YnVmLT5wZW5kID0gc2tiX2VuZF9wb2ludGVyKHByZWN2YnVmLT5wc2tiKTsKKwkJcHJlY3ZidWYtPnBidWYgPSBwcmVjdmJ1Zi0+cHNrYi0+ZGF0YTsKIAl9Ci0JaWYgKHByZWN2YnVmICE9IE5VTEwpIHsKLQkJcjg3MTJfaW5pdF9yZWN2YnVmKGFkYXB0ZXIsIHByZWN2YnVmKTsKLQkJLyogcmUtYXNzaWduIGZvciBsaW51eCBiYXNlZCBvbiBza2IgKi8KLQkJaWYgKCFwcmVjdmJ1Zi0+cmV1c2UgfHwgIXByZWN2YnVmLT5wc2tiKSB7Ci0JCQlwcmVjdmJ1Zi0+cHNrYiA9IG5ldGRldl9hbGxvY19za2IoYWRhcHRlci0+cG5ldGRldiwKLQkJCQkJIE1BWF9SRUNWQlVGX1NaICsgUkVDVkJVRkZfQUxJR05fU1opOwotCQkJaWYgKCFwcmVjdmJ1Zi0+cHNrYikKLQkJCQlyZXR1cm4gX0ZBSUw7Ci0JCQl0bXBhZGRyID0gKGFkZHJfdClwcmVjdmJ1Zi0+cHNrYi0+ZGF0YTsKLQkJCWFsaWdubWVudCA9IHRtcGFkZHIgJiAoUkVDVkJVRkZfQUxJR05fU1ogLSAxKTsKLQkJCXNrYl9yZXNlcnZlKHByZWN2YnVmLT5wc2tiLAotCQkJCSAgICAoUkVDVkJVRkZfQUxJR05fU1ogLSBhbGlnbm1lbnQpKTsKLQkJCXByZWN2YnVmLT5waGVhZCA9IHByZWN2YnVmLT5wc2tiLT5oZWFkOwotCQkJcHJlY3ZidWYtPnBkYXRhID0gcHJlY3ZidWYtPnBza2ItPmRhdGE7Ci0JCQlwcmVjdmJ1Zi0+cHRhaWwgPSBza2JfdGFpbF9wb2ludGVyKHByZWN2YnVmLT5wc2tiKTsKLQkJCXByZWN2YnVmLT5wZW5kID0gc2tiX2VuZF9wb2ludGVyKHByZWN2YnVmLT5wc2tiKTsKLQkJCXByZWN2YnVmLT5wYnVmID0gcHJlY3ZidWYtPnBza2ItPmRhdGE7Ci0JCX0gZWxzZSB7IC8qIHJldXNlIHNrYiAqLwotCQkJcHJlY3ZidWYtPnBoZWFkID0gcHJlY3ZidWYtPnBza2ItPmhlYWQ7Ci0JCQlwcmVjdmJ1Zi0+cGRhdGEgPSBwcmVjdmJ1Zi0+cHNrYi0+ZGF0YTsKLQkJCXByZWN2YnVmLT5wdGFpbCA9IHNrYl90YWlsX3BvaW50ZXIocHJlY3ZidWYtPnBza2IpOwotCQkJcHJlY3ZidWYtPnBlbmQgPSBza2JfZW5kX3BvaW50ZXIocHJlY3ZidWYtPnBza2IpOwotCQkJcHJlY3ZidWYtPnBidWYgPSBwcmVjdmJ1Zi0+cHNrYi0+ZGF0YTsKLQkJCXByZWN2YnVmLT5yZXVzZSA9IGZhbHNlOwotCQl9Ci0JCXB1cmIgPSBwcmVjdmJ1Zi0+cHVyYjsKLQkJLyogdHJhbnNsYXRlIERNQSBGSUZPIGFkZHIgdG8gcGlwZWhhbmRsZSAqLwotCQlwaXBlID0gZmZhZGRyMnBpcGVoZGwocGR2b2JqLCBhZGRyKTsKLQkJdXNiX2ZpbGxfYnVsa191cmIocHVyYiwgcHVzYmQsIHBpcGUsCi0JCQkJICBwcmVjdmJ1Zi0+cGJ1ZiwgTUFYX1JFQ1ZCVUZfU1osCi0JCQkJICByODcxMl91c2JfcmVhZF9wb3J0X2NvbXBsZXRlLAotCQkJCSAgcHJlY3ZidWYpOwotCQllcnIgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfQVRPTUlDKTsKLQkJaWYgKChlcnIpICYmIChlcnIgIT0gKC1FUEVSTSkpKQotCQkJcmV0ID0gX0ZBSUw7Ci0JfSBlbHNlIHsKKwlwdXJiID0gcHJlY3ZidWYtPnB1cmI7CisJLyogdHJhbnNsYXRlIERNQSBGSUZPIGFkZHIgdG8gcGlwZWhhbmRsZSAqLworCXBpcGUgPSBmZmFkZHIycGlwZWhkbChwZHZvYmosIGFkZHIpOworCXVzYl9maWxsX2J1bGtfdXJiKHB1cmIsIHB1c2JkLCBwaXBlLAorCQkJICBwcmVjdmJ1Zi0+cGJ1ZiwgTUFYX1JFQ1ZCVUZfU1osCisJCQkgIHI4NzEyX3VzYl9yZWFkX3BvcnRfY29tcGxldGUsCisJCQkgIHByZWN2YnVmKTsKKwllcnIgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAoKGVycikgJiYgKGVyciAhPSAoLUVQRVJNKSkpCiAJCXJldCA9IF9GQUlMOwotCX0KIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi93aWZpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi93aWZpLmgKaW5kZXggN2EzNTJjNC4uYjhhZjk2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvd2lmaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3dpZmkuaApAQCAtMzc2LDcgKzM3Niw4IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCUJlbG93IGlzIGZvciB0aGUgc2VjdXJpdHkgcmVsYXRlZCBkZWZpbml0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAjZGVmaW5lIF9SRVNFUlZFRF9GUkFNRV9UWVBFXwkwCiAjZGVmaW5lIF9TS0JfRlJBTUVfVFlQRV8JMgogI2RlZmluZSBfUFJFX0FMTE9DTUVNXwkJMQpAQCAtNDIwLDcgKzQyMSw4IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJCQlCZWxvdyBpcyB0aGUgZml4ZWQgZWxlbWVudHMuLi4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAjZGVmaW5lIF9BVVRIX0FMR01fTlVNXwkJCTIKICNkZWZpbmUgX0FVVEhfU0VRX05VTV8JCQkyCiAjZGVmaW5lIF9CRUFDT05fSVRFUlZBTF8JCTIKQEAgLTQ0OCwyMCArNDUwLDIzIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCQlCZWxvdyBpcyB0aGUgZGVmaW5pdGlvbiBmb3IgODAyLjExaSAvIDgwMi4xeAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KICNkZWZpbmUgX0lFRUU4MDIxWF9NR1RfCQkJMQkvKldQQSAqLwogI2RlZmluZSBfSUVFRTgwMjFYX1BTS18JCQkyCS8qIFdQQSB3aXRoIHByZS1zaGFyZWQga2V5ICovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCQlCZWxvdyBpcyB0aGUgZGVmaW5pdGlvbiBmb3IgV01NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZSBfV01NX0lFX0xlbmd0aF8JCQkJNyAgLyogZm9yIFdNTSBTVEEgKi8KICNkZWZpbmUgX1dNTV9QYXJhX0VsZW1lbnRfTGVuZ3RoXwkJMjQKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQkJQmVsb3cgaXMgdGhlIGRlZmluaXRpb24gZm9yIDgwMi4xMW4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAKIC8qIGJsb2NrLWFjayBwYXJhbWV0ZXJzICovCiAjZGVmaW5lIElFRUU4MDIxMV9BRERCQV9QQVJBTV9QT0xJQ1lfTUFTSyAweDAwMDIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3dsYW5fYnNzZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi93bGFuX2Jzc2RlZi5oCmluZGV4IGZkYTU3MDcuLjg2YTg4YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3dsYW5fYnNzZGVmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvd2xhbl9ic3NkZWYuaApAQCAtMTcxLDcgKzE3MSw4IEBACiBzdHJ1Y3QgTkRJU184MDJfMTFfV0VQIHsKIAl1MzIgTGVuZ3RoOwkJICAvKiBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KIAl1MzIgS2V5SW5kZXg7CQkgIC8qIDAgaXMgdGhlIHBlci1jbGllbnQga2V5LAotCQkJCSAgICogMS1OIGFyZSB0aGUgZ2xvYmFsIGtleXMgKi8KKwkJCQkgICAqIDEtTiBhcmUgdGhlIGdsb2JhbCBrZXlzCisJCQkJICAgKi8KIAl1MzIgS2V5TGVuZ3RoOwkJICAvKiBsZW5ndGggb2Yga2V5IGluIGJ5dGVzICovCiAJdTggIEtleU1hdGVyaWFsWzE2XTsgICAgICAvKiB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkICovCiB9OwpAQCAtMTk0LDcgKzE5NSw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWludAluZXR3b3JrX3R5cGU7CS8qcmVmZXIgdG8gaWVlZTgwMjExLmggZm9yIFdJUkVMRVNTXzExQS9CL0cgKi8KIAlpbnQJZml4ZWQ7CQkvKiBzZXQgdG8gZml4ZWQgd2hlbiBub3QgdG8gYmUgcmVtb3ZlZCBhc2kKLQkJCQkgKiBzaXRlLXN1cnZleWluZyAqLworCQkJCSAqIHNpdGUtc3VydmV5aW5nCisJCQkJICovCiAJdW5zaWduZWQgaW50CWxhc3Rfc2Nhbm5lZDsgLyp0aW1lc3RhbXAgZm9yIHRoZSBuZXR3b3JrICovCiAJaW50CWFpZDsJCS8qd2lsbCBvbmx5IGJlIHZhbGlkIHdoZW4gYSBCU1MgaXMgam9pbmVkLiAqLwogCWludAlqb2luX3JlczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3htaXRfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3htaXRfbGludXguYwppbmRleCA2OTVmOWI5Li40ZWU0MTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi94bWl0X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIveG1pdF9saW51eC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2ttZW1sZWFrLmg+CiAKICNpbmNsdWRlICJvc2RlcF9zZXJ2aWNlLmgiCiAjaW5jbHVkZSAiZHJ2X3R5cGVzLmgiCkBAIC05MSw3ICs5Miw4IEBACiAJfSBlbHNlIHsKIAkJLyogIldoZW4gcHJpb3JpdHkgcHJvY2Vzc2luZyBvZiBkYXRhIGZyYW1lcyBpcyBzdXBwb3J0ZWQsCiAJCSAqIGEgU1RBJ3MgU01FIHNob3VsZCBzZW5kIEVBUE9MLUtleSBmcmFtZXMgYXQgdGhlIGhpZ2hlc3QKLQkJICogcHJpb3JpdHkuIiAqLworCQkgKiBwcmlvcml0eS4iCisJCSAqLwogCiAJCWlmIChwYXR0cmliLT5ldGhlcl90eXBlID09IDB4ODg4ZSkKIAkJCVVzZXJQcmlvcml0eSA9IDc7CkBAIC0xMzIsNiArMTM0LDcgQEAKIAkJCW5ldGRldl9lcnIocGFkYXB0ZXItPnBuZXRkZXYsICJweG1pdGJ1Zi0+cHhtaXRfdXJiW2ldID09IE5VTExcbiIpOwogCQkJcmV0dXJuIF9GQUlMOwogCQl9CisJCWttZW1sZWFrX25vdF9sZWFrKHB4bWl0YnVmLT5weG1pdF91cmJbaV0pOwogCX0KIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CkBAIC0xNjIsMTYgKzE2NSwxNiBAQAogCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKIAlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmKHBhZGFwdGVyLT54bWl0cHJpdik7CiAKLQlpZiAoIXI4NzEyX2lmX3VwKHBhZGFwdGVyKSkgeworCWlmICghcjg3MTJfaWZfdXAocGFkYXB0ZXIpKQogCQlnb3RvIF94bWl0X2VudHJ5X2Ryb3A7Ci0JfQorCiAJcHhtaXRmcmFtZSA9IHI4NzEyX2FsbG9jX3htaXRmcmFtZShweG1pdHByaXYpOwotCWlmICghcHhtaXRmcmFtZSkgeworCWlmICghcHhtaXRmcmFtZSkKIAkJZ290byBfeG1pdF9lbnRyeV9kcm9wOwotCX0KLQlpZiAoKCFyODcxMl91cGRhdGVfYXR0cmliKHBhZGFwdGVyLCBwa3QsICZweG1pdGZyYW1lLT5hdHRyaWIpKSkgeworCisJaWYgKCghcjg3MTJfdXBkYXRlX2F0dHJpYihwYWRhcHRlciwgcGt0LCAmcHhtaXRmcmFtZS0+YXR0cmliKSkpCiAJCWdvdG8gX3htaXRfZW50cnlfZHJvcDsKLQl9CisKIAlwYWRhcHRlci0+bGVkcHJpdi5MZWRDb250cm9sSGFuZGxlcihwYWRhcHRlciwgTEVEX0NUTF9UWCk7CiAJcHhtaXRmcmFtZS0+cGt0ID0gcGt0OwogCWlmIChyODcxMl9wcmVfeG1pdChwYWRhcHRlciwgcHhtaXRmcmFtZSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3YzFhYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1jb25maWcgUjg3MjNBVQotCXRyaXN0YXRlICJSZWFsdGVrIFJUTDg3MjNBVSBXaXJlbGVzcyBMQU4gTklDIGRyaXZlciAoZGVwcmVjYXRlZCkiCi0JZGVwZW5kcyBvbiBVU0IgJiYgV0xBTiAmJiBSRktJTEwKLQlzZWxlY3QgV0lSRUxFU1NfRVhUCi0Jc2VsZWN0IFdFWFRfUFJJVgotCXNlbGVjdCBDRkc4MDIxMQotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQlUaGlzIG9wdGlvbiBhZGRzIHRoZSBSZWFsdGVrIFJUTDg3MjNBVSBVU0IgZGV2aWNlIHN1Y2ggYXMgZm91bmQgaW4KLQl0aGUgTGVub3ZvIFlvZ2EgMTMgdGFibGV0LiBJZiBidWlsdCBhcyBhIG1vZHVsZSwgaXQgd2lsbCBiZSBjYWxsZWQgcjg3MjNhdS4KLQotCU5vdGU6IFRoaXMgZHJpdmVyIGlzIGRlcHJlY2F0ZWQgYW5kIHNjaGVkdWxlZCB0byBiZSByZW1vdmVkIGluIGEKLQlmdXR1cmUga2VybmVsIHJlbGVhc2UuIFBsZWFzZSB1c2UgcnRsOHh4eHUgaW5zdGVhZC4KLQotaWYgUjg3MjNBVQotCi1jb25maWcgODcyM0FVX0FQX01PREUKLQlib29sICJSZWFsdGVrIFJUTDg3MjNBVSBBUCBtb2RlIgotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQlUaGlzIG9wdGlvbiBlbmFibGVzIEFjY2VzcyBQb2ludCBtb2RlLiBVbmxlc3MgeW91IGtub3cgdGhhdCB5b3VyIHN5c3RlbQotCXdpbGwgbmV2ZXIgYmUgdXNlZCBhcyBhbiBBUCwgb3IgdGhlIHRhcmdldCBzeXN0ZW0gaGFzIGxpbWl0ZWQgbWVtb3J5LAotCSJZIiBzaG91bGQgYmUgc2VsZWN0ZWQuCi0KLWNvbmZpZyA4NzIzQVVfQlRfQ09FWElTVAotCWJvb2wgIlJlYWx0ZWsgUlRMODcyM0FVIEJsdWVUb290aCBDb2V4aXN0ZW5jZSIKLQlkZWZhdWx0IHkKLQktLS1oZWxwLS0tCi0JVGhpcyBvcHRpb24gZW5hYmxlcyBpY29leGlzdGVuY2Ugd2l0aCBCbHVlVG9vdGggY29tbXVuaWNhdGlvbnMgZm9yIHRoZSByODcyM2F1IGRyaXZlci4KLQlVbmxlc3MgeW91IGtub3cgdGhhdCB0aGlzIGRyaXZlciB3aWxsIG5ldmVyIGJ5IHVzZWQgd2l0aCBCVCwgb3IgdGhlIHRhcmdldCBzeXN0ZW0gaGFzCi0JbGltaXRlZCBtZW1vcnksICJZIiBzaG91bGQgYmUgc2VsZWN0ZWQuCi0KLWVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U4OTg5MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotcjg3MjNhdS15IDo9CQkJCVwKLQkJY29yZS9ydHdfY21kLm8JCVwKLQkJY29yZS9ydHdfZWZ1c2UubwlcCi0JCWNvcmUvcnR3X2llZWU4MDIxMS5vCVwKLQkJY29yZS9ydHdfbWxtZS5vCQlcCi0JCWNvcmUvcnR3X21sbWVfZXh0Lm8JXAotCQljb3JlL3J0d19wd3JjdHJsLm8JXAotCQljb3JlL3J0d19yZWN2Lm8JCVwKLQkJY29yZS9ydHdfc2VjdXJpdHkubwlcCi0JCWNvcmUvcnR3X3NyZXNldC5vCVwKLQkJY29yZS9ydHdfc3RhX21ndC5vCVwKLQkJY29yZS9ydHdfeG1pdC5vCQlcCi0JCWNvcmUvcnR3X3dsYW5fdXRpbC5vCVwKLQkJaGFsL2hhbF9jb20ubwkJXAotCQloYWwvaGFsX2ludGYubwkJXAotCQloYWwvSGFsODcyM1B3clNlcS5vCVwKLQkJaGFsL0hhbDg3MjNVSFdJbWdfQ0UubwlcCi0JCWhhbC9IYWxETU91dFNyYzg3MjNBX0NFLm8gXAotCQloYWwvSGFsSFdJbWc4NzIzQV9CQi5vCVwKLQkJaGFsL0hhbEhXSW1nODcyM0FfTUFDLm8JXAotCQloYWwvSGFsSFdJbWc4NzIzQV9SRi5vCVwKLQkJaGFsL0hhbFB3clNlcUNtZC5vCVwKLQkJaGFsL29kbV9SZWdDb25maWc4NzIzQS5vIFwKLQkJaGFsL29kbV9kZWJ1Zy5vCQlcCi0JCWhhbC9vZG1faW50ZXJmYWNlLm8JXAotCQloYWwvb2RtX0hXQ29uZmlnLm8JXAotCQloYWwvb2RtLm8JCVwKLQkJaGFsL3J0bDg3MjNhX2NtZC5vCVwKLQkJaGFsL3J0bDg3MjNhX2RtLm8JXAotCQloYWwvcnRsODcyM2FfaGFsX2luaXQubwlcCi0JCWhhbC9ydGw4NzIzYV9waHljZmcubwlcCi0JCWhhbC9ydGw4NzIzYV9yZjYwNTIubwlcCi0JCWhhbC9ydGw4NzIzYV9yeGRlc2MubwlcCi0JCWhhbC9ydGw4NzIzYV9zcmVzZXQubwlcCi0JCWhhbC9ydGw4NzIzYXVfcmVjdi5vCVwKLQkJaGFsL3J0bDg3MjNhdV94bWl0Lm8JXAotCQloYWwvdXNiX2hhbGluaXQubwlcCi0JCWhhbC91c2Jfb3BzX2xpbnV4Lm8JXAotCQlvc19kZXAvaW9jdGxfY2ZnODAyMTEubwlcCi0JCW9zX2RlcC9tbG1lX2xpbnV4Lm8JXAotCQlvc19kZXAvb3NfaW50ZnMubwlcCi0JCW9zX2RlcC9yZWN2X2xpbnV4Lm8JXAotCQlvc19kZXAvdXNiX2ludGYubwlcCi0JCW9zX2RlcC91c2Jfb3BzX2xpbnV4Lm8JXAotCQlvc19kZXAveG1pdF9saW51eC5vCi0KLXI4NzIzYXUtJChDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QpICs9IGhhbC9ydGw4NzIzYV9idC1jb2V4aXN0Lm8KLXI4NzIzYXUtJChDT05GSUdfODcyM0FVX0FQX01PREUpICs9IGNvcmUvcnR3X2FwLm8KLQotb2JqLSQoQ09ORklHX1I4NzIzQVUpCTo9IHI4NzIzYXUubwotCi1jY2ZsYWdzLXkgKz0gJChjYWxsIGNjLW9wdGlvbiwtV3R5cGUtbGltaXRzLCkKLWNjZmxhZ3MteSArPSAtRF9fQ0hFQ0tfRU5ESUFOX18gLUkkKHNyYykvaW5jbHVkZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmI4NmU0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLVRPRE86Ci0tIGZpbmQgYW5kIHJlbW92ZSBjb2RlIHZhbGlkIG9ubHkgZm9yIDUgSEd6LiBNYW55IG9mIHRoZSBvYnZpb3VzCi0gIG9uZXMgaGF2ZSBiZWVuIHJlbW92ZWQsIGJ1dCB0aGluZ3MgbGlrZSBjaGFubmVsID4gMTQgc3RpbGwgZXhpc3QuCi0tIGZpbmQgYW5kIHJlbW92ZSBhbnkgY29kZSBmb3Igb3RoZXIgY2hpcHMgdGhhdCBpcyBsZWZ0IG92ZXIKLS0gY29udmVydCBhbnkgcmVtYWluaW5nIHVudXN1YWwgdmFyaWFibGUgdHlwZXMKLS0gZmluZCBjb2RlcyB0aGF0IGNhbiB1c2UgJXBNIGFuZCAlTnBoIGZvcm1hdHRpbmcKLS0gY2hlY2twYXRjaC5wbCBmaXhlcyAtIG1vc3Qgb2YgdGhlIHJlbWFpbmluZyBvbmVzIGFyZSBsaW5lcyB0b28gbG9uZy4gTWFueQotICBvZiB0aGVtIHdpbGwgcmVxdWlyZSByZWZhY3RvcmluZwotLSBtZXJnZSBSZWFsdGVrJ3MgYnVnZml4ZXMgYW5kIG5ldyBmZWF0dXJlcyBpbnRvIHRoZSBkcml2ZXIKLS0gc3dpdGNoIHRvIHVzZSBNQUM4MDIxMQotCi1BIG1hYzgwMjExIGRyaXZlciBmb3IgdGhpcyBoYXJkd2FyZSBhbHJlYWR5IHdhcyBpbnRlZ3JhdGVkIGF0Ci1kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1LwotCi1QbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBsaW51eGZvdW5kYXRpb24ub3JnPiwKLUplcyBTb3JlbnNlbiA8SmVzLlNvcmVuc2VuQHJlZGhhdC5jb20+LCBhbmQgTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0Pi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFkNjg2ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2FwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRXX0FQX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+Ci0jaW5jbHVkZSA8d2lmaS5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX2NtZC5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KLSNpbmNsdWRlIDxydHdfbWxtZV9leHQuaD4KLQotdm9pZCBpbml0X21sbWVfYXBfaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9hY2xfcG9vbCAqcGFjbF9saXN0ID0gJnBzdGFwcml2LT5hY2xfbGlzdDsKLQotCXNwaW5fbG9ja19pbml0KCZwbWxtZXByaXYtPmJjbl91cGRhdGVfbG9jayk7Ci0KLQkvKiBmb3IgQUNMICovCi0JX3J0d19pbml0X3F1ZXVlMjNhKCZwYWNsX2xpc3QtPmFjbF9ub2RlX3EpOwotCi0Jc3RhcnRfYXBfbW9kZTIzYShwYWRhcHRlcik7Ci19Ci0KLXZvaWQgZnJlZV9tbG1lX2FwX2luZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JcG1sbWVwcml2LT51cGRhdGVfYmNuID0gZmFsc2U7Ci0JcG1sbWVleHQtPmJzdGFydF9ic3MgPSBmYWxzZTsKLQotCXJ0d19zdGFfZmx1c2gyM2EocGFkYXB0ZXIpOwotCi0JcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9OT0xJTks7Ci0KLQkvKiBmcmVlX2Fzc29jX3N0YV9yZXNvdXJjZXMgKi8KLQlydHdfZnJlZV9hbGxfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0KLQkvKiBmcmVlIGJjL21jIHN0YV9pbmZvICovCi0JcHN0YSA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQlydHdfZnJlZV9zdGFpbmZvMjNhKHBhZGFwdGVyLCBwc3RhKTsKLQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfQkNOVElNKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29ya19tbG1lZXh0ID0gJnBtbG1laW5mby0+bmV0d29yazsKLQl1bnNpZ25lZCBjaGFyICpwaWUgPSBwbmV0d29ya19tbG1lZXh0LT5JRXM7Ci0JdTggKnAsICpkc3RfaWUsICpwcmVtYWluZGVyX2llID0gTlVMTCwgKnBiYWNrdXBfcmVtYWluZGVyX2llID0gTlVMTDsKLQl1aW50IG9mZnNldCwgdG1wX2xlbiwgdGltX2llbGVuLCB0aW1faWVfb2Zmc2V0LCByZW1haW5kZXJfaWVsZW47Ci0KLQlwID0gcnR3X2dldF9pZTIzYShwaWUsIFdMQU5fRUlEX1RJTSwgJnRpbV9pZWxlbiwKLQkJCSAgcG5ldHdvcmtfbWxtZWV4dC0+SUVMZW5ndGgpOwotCWlmIChwICE9IE5VTEwgJiYgdGltX2llbGVuID4gMCkgewotCQl0aW1faWVsZW4gKz0gMjsKLQotCQlwcmVtYWluZGVyX2llID0gcCt0aW1faWVsZW47Ci0KLQkJdGltX2llX29mZnNldCA9IChpbnQpKHAgLSBwaWUpOwotCi0JCXJlbWFpbmRlcl9pZWxlbiA9IHBuZXR3b3JrX21sbWVleHQtPklFTGVuZ3RoIC0gdGltX2llX29mZnNldCAtIHRpbV9pZWxlbjsKLQotCQkvKiBhcHBlbmQgVElNIElFIGZyb20gZHN0X2llIG9mZnNldCAqLwotCQlkc3RfaWUgPSBwOwotCX0gZWxzZSB7Ci0JCXRpbV9pZWxlbiA9IDA7Ci0KLQkJLyogY2FsY3VsYXRlIGhlYWRfbGVuICovCi0JCW9mZnNldCA9IDA7Ci0KLQkJLyogZ2V0IHNzaWRfaWUgbGVuICovCi0JCXAgPSBydHdfZ2V0X2llMjNhKHBpZSwgV0xBTl9FSURfU1NJRCwKLQkJCQkgICZ0bXBfbGVuLCBwbmV0d29ya19tbG1lZXh0LT5JRUxlbmd0aCk7Ci0JCWlmIChwICE9IE5VTEwpCi0JCQlvZmZzZXQgKz0gdG1wX2xlbisyOwotCi0JCS8qICBnZXQgc3VwcG9ydGVkIHJhdGVzIGxlbiAqLwotCQlwID0gcnR3X2dldF9pZTIzYShwaWUsIFdMQU5fRUlEX1NVUFBfUkFURVMsCi0JCQkJICAmdG1wX2xlbiwgcG5ldHdvcmtfbWxtZWV4dC0+SUVMZW5ndGgpOwotCQlpZiAocCAhPSAgTlVMTCkKLQkJCW9mZnNldCArPSB0bXBfbGVuKzI7Ci0KLQkJLyogRFMgUGFyYW1ldGVyIFNldCBJRSwgbGVuID0gMyAqLwotCQlvZmZzZXQgKz0gMzsKLQotCQlwcmVtYWluZGVyX2llID0gcGllICsgb2Zmc2V0OwotCi0JCXJlbWFpbmRlcl9pZWxlbiA9IHBuZXR3b3JrX21sbWVleHQtPklFTGVuZ3RoIC0gb2Zmc2V0IC0gdGltX2llbGVuOwotCi0JCS8qIGFwcGVuZCBUSU0gSUUgZnJvbSBvZmZzZXQgKi8KLQkJZHN0X2llID0gcGllICsgb2Zmc2V0OwotCX0KLQotCWlmIChyZW1haW5kZXJfaWVsZW4gPiAwKSB7Ci0JCXBiYWNrdXBfcmVtYWluZGVyX2llID0ga21hbGxvYyhyZW1haW5kZXJfaWVsZW4sIEdGUF9BVE9NSUMpOwotCQlpZiAocGJhY2t1cF9yZW1haW5kZXJfaWUgJiYgcHJlbWFpbmRlcl9pZSkKLQkJCW1lbWNweShwYmFja3VwX3JlbWFpbmRlcl9pZSwgcHJlbWFpbmRlcl9pZSwgcmVtYWluZGVyX2llbGVuKTsKLQl9Ci0KLQkqZHN0X2llKysgPSBXTEFOX0VJRF9USU07Ci0KLQlpZiAoKHBzdGFwcml2LT50aW1fYml0bWFwJjB4ZmYwMCkgJiYgKHBzdGFwcml2LT50aW1fYml0bWFwJjB4MDBmYykpCi0JCXRpbV9pZWxlbiA9IDU7Ci0JZWxzZQotCQl0aW1faWVsZW4gPSA0OwotCi0JKmRzdF9pZSsrID0gdGltX2llbGVuOwotCi0JKmRzdF9pZSsrID0gMDsgLyogRFRJTSBjb3VudCAqLwotCSpkc3RfaWUrKyA9IDE7IC8qIERUSU0gcGVyaW9kICovCi0KLQlpZiAocHN0YXByaXYtPnRpbV9iaXRtYXAgJiBCSVQoMCkpIC8qIGZvciBiYy9tYyBmcmFtZXMgKi8KLQkJKmRzdF9pZSsrID0gQklUKDApOwkgICAvKiBiaXRtYXAgY3RybCAqLwotCWVsc2UKLQkJKmRzdF9pZSsrID0gMDsKLQotCWlmICh0aW1faWVsZW4gPT0gNCkgewotCQkqZHN0X2llKysgPSBwc3RhcHJpdi0+dGltX2JpdG1hcCAmIDB4ZmY7Ci0JfSBlbHNlIGlmICh0aW1faWVsZW4gPT0gNSkgewotCQlwdXRfdW5hbGlnbmVkX2xlMTYocHN0YXByaXYtPnRpbV9iaXRtYXAsIGRzdF9pZSk7Ci0JCWRzdF9pZSArPSAyOwotCX0KLQotCS8qIGNvcHkgcmVtYWluZGVyIElFICovCi0JaWYgKHBiYWNrdXBfcmVtYWluZGVyX2llKSB7Ci0JCW1lbWNweShkc3RfaWUsIHBiYWNrdXBfcmVtYWluZGVyX2llLCByZW1haW5kZXJfaWVsZW4pOwotCi0JCWtmcmVlKHBiYWNrdXBfcmVtYWluZGVyX2llKTsKLQl9Ci0KLQlvZmZzZXQgPSAgKHVpbnQpKGRzdF9pZSAtIHBpZSk7Ci0JcG5ldHdvcmtfbWxtZWV4dC0+SUVMZW5ndGggPSBvZmZzZXQgKyByZW1haW5kZXJfaWVsZW47Ci0KLQlzZXRfdHhfYmVhY29uX2NtZDIzYShwYWRhcHRlcik7Ci19Ci0KLXN0YXRpYyB1OCBjaGtfc3RhX2lzX2FsaXZlKHN0cnVjdCBzdGFfaW5mbyAqcHN0YSkKLXsKLQl1OCByZXQgPSBmYWxzZTsKLQotCWlmICgocHN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfZGF0YV9wa3RzICsKLQkgICAgcHN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfY3RybF9wa3RzKSAhPQotCSAgICAocHN0YS0+c3RhX3N0YXRzLnJ4X2RhdGFfcGt0cyArIHBzdGEtPnN0YV9zdGF0cy5yeF9jdHJsX3BrdHMpKQotCQlyZXQgPSB0cnVlOwotCi0Jc3RhX3VwZGF0ZV9sYXN0X3J4X3BrdHMocHN0YSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGV4cGlyZV90aW1lb3V0X2NoazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCXU4IHVwZGF0ZWQgPSAwOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgKnB0bXA7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQl1OCBjaGtfYWxpdmVfbnVtID0gMDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKmNoa19hbGl2ZV9saXN0W05VTV9TVEFdOwotCWludCBpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXV0aF9saXN0X2xvY2spOwotCXBoZWFkID0gJnBzdGFwcml2LT5hdXRoX2xpc3Q7Ci0JLyogY2hlY2sgYXV0aF9xdWV1ZSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwc3RhLCBwdG1wLCBwaGVhZCwgYXV0aF9saXN0KSB7Ci0JCWlmIChwc3RhLT5leHBpcmVfdG8gPiAwKSB7Ci0JCQlwc3RhLT5leHBpcmVfdG8tLTsKLQkJCWlmIChwc3RhLT5leHBpcmVfdG8gPT0gMCkgewotCQkJCWxpc3RfZGVsX2luaXQoJnBzdGEtPmF1dGhfbGlzdCk7Ci0JCQkJcHN0YXByaXYtPmF1dGhfbGlzdF9jbnQtLTsKLQotCQkJCURCR184NzIzQSgiYXV0aCBleHBpcmUgJXBNXG4iLCBwc3RhLT5od2FkZHIpOwotCi0JCQkJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hdXRoX2xpc3RfbG9jayk7Ci0KLQkJCQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQkJCQlydHdfZnJlZV9zdGFpbmZvMjNhKHBhZGFwdGVyLCBwc3RhKTsKLQkJCQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCi0JCQkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXV0aF9saXN0X2xvY2spOwotCQkJfQotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+YXV0aF9saXN0X2xvY2spOwotCi0Jc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCXBoZWFkID0gJnBzdGFwcml2LT5hc29jX2xpc3Q7Ci0JLyogY2hlY2sgYXNvY19xdWV1ZSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwc3RhLCBwdG1wLCBwaGVhZCwgYXNvY19saXN0KSB7Ci0JCWlmIChjaGtfc3RhX2lzX2FsaXZlKHBzdGEpIHx8ICFwc3RhLT5leHBpcmVfdG8pIHsKLQkJCXBzdGEtPmV4cGlyZV90byA9IHBzdGFwcml2LT5leHBpcmVfdG87Ci0JCQlwc3RhLT5rZWVwX2FsaXZlX3RyeWNudCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlwc3RhLT5leHBpcmVfdG8tLTsKLQkJfQotCi0JCWlmIChwc3RhLT5leHBpcmVfdG8gPD0gMCkgewotCQkJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCQkJaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjID09IDEpIHsKLQkJCQlwc3RhLT5leHBpcmVfdG8gPSBwc3RhcHJpdi0+ZXhwaXJlX3RvOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAocHN0YS0+c3RhdGUgJiBXSUZJX1NMRUVQX1NUQVRFKSB7Ci0JCQkJaWYgKCEocHN0YS0+c3RhdGUgJiBXSUZJX1NUQV9BTElWRV9DSEtfU1RBVEUpKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIGNoZWNrIGlmIGFsaXZlIGJ5IGFub3RoZXIgbWV0aG9kCi0JCQkJCSAqIGlmIHN0YXRpb24gaXMgYXQgcHMgbW9kZS4KLQkJCQkJICovCi0JCQkJCXBzdGEtPmV4cGlyZV90byA9IHBzdGFwcml2LT5leHBpcmVfdG87Ci0JCQkJCXBzdGEtPnN0YXRlIHw9IFdJRklfU1RBX0FMSVZFX0NIS19TVEFURTsKLQkJCQkJLyoKLQkJCQkJICogdXBkYXRlIGJjbiB3aXRoIHRpbV9iaXRtYXAKLQkJCQkJICogZm9yIHRoaXMgc3RhdGlvbgotCQkJCQkgKi8KLQkJCQkJcHN0YXByaXYtPnRpbV9iaXRtYXAgfD0gQ0hLQklUKHBzdGEtPmFpZCk7Ci0JCQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIFdMQU5fRUlEX1RJTSwgTlVMTCwgZmFsc2UpOwotCi0JCQkJCWlmICghcG1sbWVleHQtPmFjdGl2ZV9rZWVwX2FsaXZlX2NoZWNrKQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocG1sbWVleHQtPmFjdGl2ZV9rZWVwX2FsaXZlX2NoZWNrKSB7Ci0JCQkJY2hrX2FsaXZlX2xpc3RbY2hrX2FsaXZlX251bSsrXSA9IHBzdGE7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWxpc3RfZGVsX2luaXQoJnBzdGEtPmFzb2NfbGlzdCk7Ci0JCQlwc3RhcHJpdi0+YXNvY19saXN0X2NudC0tOwotCi0JCQlEQkdfODcyM0EoImFzb2MgZXhwaXJlICVwTSwgc3RhdGUgPSAweCV4XG4iLAotCQkJCSAgcHN0YS0+aHdhZGRyLCBwc3RhLT5zdGF0ZSk7Ci0JCQl1cGRhdGVkID0gYXBfZnJlZV9zdGEyM2EocGFkYXB0ZXIsIHBzdGEsIGZhbHNlLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogVE9ETzogQWdpbmcgbWVjaGFuaXNtIHRvIGRpZ2VzdCBmcmFtZXMgaW4KLQkJCSAqIHNsZWVwX3EgdG8gYXZvaWQgcnVubmluZyBvdXQgb2YgeG1pdGZyYW1lCi0JCQkgKi8KLQkJCWlmIChwc3RhLT5zbGVlcHFfbGVuID4gKE5SX1hNSVRGUkFNRS9wc3RhcHJpdi0+YXNvY19saXN0X2NudCkKLQkJCQkmJiBwYWRhcHRlci0+eG1pdHByaXYuZnJlZV94bWl0ZnJhbWVfY250IDwgKChOUl9YTUlURlJBTUUvcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQpLzIpCi0JCQkpIHsKLQkJCQlEQkdfODcyM0EoIiVzIHN0YTolcE0sIHNsZWVwcV9sZW46JXUsIGZyZWVfeG1pdGZyYW1lX2NudDoldSwgYXNvY19saXN0X2NudDoldSwgY2xlYXIgc2xlZXBfcVxuIiwKLQkJCQkJICBfX2Z1bmNfXywKLQkJCQkJICBwc3RhLT5od2FkZHIsCi0JCQkJCSAgcHN0YS0+c2xlZXBxX2xlbiwKLQkJCQkJICBwYWRhcHRlci0+eG1pdHByaXYuZnJlZV94bWl0ZnJhbWVfY250LAotCQkJCQkgIHBzdGFwcml2LT5hc29jX2xpc3RfY250KTsKLQkJCQl3YWtldXBfc3RhX3RvX3htaXQyM2EocGFkYXB0ZXIsIHBzdGEpOwotCQkJfQotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCi0JaWYgKGNoa19hbGl2ZV9udW0pIHsKLQotCQl1OCBiYWNrdXBfb3Blcl9jaGFubmVsID0gMDsKLQkJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQkJLyoKLQkJICogc3dpdGNoIHRvIGNvcnJlY3QgY2hhbm5lbCBvZiBjdXJyZW50Ci0JCSAqIG5ldHdvcmsgYmVmb3JlIGlzc3VlIGtlZXAtYWxpdmUgZnJhbWVzCi0JCSAqLwotCQlpZiAocnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSAhPSBwbWxtZWV4dC0+Y3VyX2NoYW5uZWwpIHsKLQkJCWJhY2t1cF9vcGVyX2NoYW5uZWwgPSBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpOwotCQkJU2VsZWN0Q2hhbm5lbDIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsKTsKLQkJfQotCi0JLyogaXNzdWUgbnVsbCBkYXRhIHRvIGNoZWNrIHN0YSBhbGl2ZSAqLwotCWZvciAoaSA9IDA7IGkgPCBjaGtfYWxpdmVfbnVtOyBpKyspIHsKLQotCQlpbnQgcmV0ID0gX0ZBSUw7Ci0KLQkJcHN0YSA9IGNoa19hbGl2ZV9saXN0W2ldOwotCQlpZiAoIShwc3RhLT5zdGF0ZSAmIF9GV19MSU5LRUQpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHBzdGEtPnN0YXRlICYgV0lGSV9TTEVFUF9TVEFURSkKLQkJCXJldCA9IGlzc3VlX251bGxkYXRhMjNhKHBhZGFwdGVyLCBwc3RhLT5od2FkZHIsIDAsIDEsIDUwKTsKLQkJZWxzZQotCQkJcmV0ID0gaXNzdWVfbnVsbGRhdGEyM2EocGFkYXB0ZXIsIHBzdGEtPmh3YWRkciwgMCwgMywgNTApOwotCi0JCXBzdGEtPmtlZXBfYWxpdmVfdHJ5Y250Kys7Ci0JCWlmIChyZXQgPT0gX1NVQ0NFU1MpIHsKLQkJCURCR184NzIzQSgiYXNvYyBjaGVjaywgc3RhKCVwTSkgaXMgYWxpdmVcbiIsCi0JCQkJICBwc3RhLT5od2FkZHIpOwotCQkJcHN0YS0+ZXhwaXJlX3RvID0gcHN0YXByaXYtPmV4cGlyZV90bzsKLQkJCXBzdGEtPmtlZXBfYWxpdmVfdHJ5Y250ID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKHBzdGEtPmtlZXBfYWxpdmVfdHJ5Y250IDw9IDMpIHsKLQkJCURCR184NzIzQSgiYWNrIGNoZWNrIGZvciBhc29jIGV4cGlyZSwga2VlcF9hbGl2ZV90cnljbnQgPSVkXG4iLCBwc3RhLT5rZWVwX2FsaXZlX3RyeWNudCk7Ci0JCQlwc3RhLT5leHBpcmVfdG8gPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlwc3RhLT5rZWVwX2FsaXZlX3RyeWNudCA9IDA7Ci0KLQkJREJHXzg3MjNBKCJhc29jIGV4cGlyZSAlcE0sIHN0YXRlID0gMHgleFxuIiwKLQkJCSAgcHN0YS0+aHdhZGRyLCBwc3RhLT5zdGF0ZSk7Ci0JCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQkJaWYgKCFsaXN0X2VtcHR5KCZwc3RhLT5hc29jX2xpc3QpKSB7Ci0JCQlsaXN0X2RlbF9pbml0KCZwc3RhLT5hc29jX2xpc3QpOwotCQkJcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQtLTsKLQkJCXVwZGF0ZWQgPSBhcF9mcmVlX3N0YTIzYShwYWRhcHRlciwgcHN0YSwgZmFsc2UsIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKLQkJfQotCQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQotCX0KLQotCWlmIChiYWNrdXBfb3Blcl9jaGFubmVsID4gMCkgLyogYmFjayB0byBvcmlnaW5hbCBvcGVyYXRpb24gY2hhbm5lbCAqLwotCQlTZWxlY3RDaGFubmVsMjNhKHBhZGFwdGVyLCBiYWNrdXBfb3Blcl9jaGFubmVsKTsKLX0KLQotCWFzc29jaWF0ZWRfY2xpZW50c191cGRhdGUyM2EocGFkYXB0ZXIsIHVwZGF0ZWQpOwotfQotCi12b2lkIGFkZF9SQVRpZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsIHU4IHJzc2lfbGV2ZWwpCi17Ci0JaW50IGk7Ci0JdTggcmZfdHlwZTsKLQl1MzIgaW5pdF9yYXRlID0gMDsKLQl1bnNpZ25lZCBjaGFyIHN0YV9iYW5kID0gMCwgcmFpZCwgc2hvcnRHSXJhdGUgPSBmYWxzZTsKLQl1bnNpZ25lZCBjaGFyIGxpbWl0OwotCXVuc2lnbmVkIGludCB0eF9yYV9iaXRtYXAgPSAwOwotCXN0cnVjdCBodF9wcml2ICpwc3RhX2h0ID0gTlVMTDsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrOwotCi0JaWYgKHBzdGEpCi0JCXBzdGFfaHQgPSAmcHN0YS0+aHRwcml2OwotCWVsc2UKLQkJcmV0dXJuOwotCi0JaWYgKCEocHN0YS0+c3RhdGUgJiBfRldfTElOS0VEKSkKLQkJcmV0dXJuOwotCi0JLyogYi9nIG1vZGUgcmFfYml0bWFwICovCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZihwc3RhLT5ic3NyYXRlc2V0KTsgaSsrKSB7Ci0JCWlmIChwc3RhLT5ic3NyYXRlc2V0W2ldKQotCQkJdHhfcmFfYml0bWFwIHw9IHJ0d19nZXRfYml0X3ZhbHVlX2Zyb21faWVlZV92YWx1ZTIzYShwc3RhLT5ic3NyYXRlc2V0W2ldJjB4N2YpOwotCX0KLQkvKiBuIG1vZGUgcmFfYml0bWFwICovCi0JaWYgKHBzdGFfaHQtPmh0X29wdGlvbikgewotCQlyZl90eXBlID0gcnRsODcyM2FfZ2V0X3JmX3R5cGUocGFkYXB0ZXIpOwotCi0JCWlmIChyZl90eXBlID09IFJGXzJUMlIpCi0JCQlsaW1pdCA9IDE2OyAvKiAyUiAqLwotCQllbHNlCi0JCQlsaW1pdCA9IDg7ICAvKiAxUiAqLwotCi0JCWZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSsrKSB7Ci0JCQlpZiAocHN0YV9odC0+aHRfY2FwLm1jcy5yeF9tYXNrW2kgLyA4XSAmIEJJVChpICUgOCkpCi0JCQkJdHhfcmFfYml0bWFwIHw9IEJJVChpICsgMTIpOwotCQl9Ci0KLQkJLyogbWF4IHNob3J0IEdJIHJhdGUgKi8KLQkJc2hvcnRHSXJhdGUgPSBwc3RhX2h0LT5zZ2k7Ci0JfQotCi0JaWYgKHBjdXJfbmV0d29yay0+RFNDb25maWcgPiAxNCkgewotCQkvKiAgNUcgYmFuZCAqLwotCQlpZiAodHhfcmFfYml0bWFwICYgMHhmZmZmMDAwKQotCQkJc3RhX2JhbmQgfD0gV0lSRUxFU1NfMTFfNU4gfCBXSVJFTEVTU18xMUE7Ci0JCWVsc2UKLQkJCXN0YV9iYW5kIHw9IFdJUkVMRVNTXzExQTsKLQl9IGVsc2UgewotCQlpZiAodHhfcmFfYml0bWFwICYgMHhmZmZmMDAwKQotCQkJc3RhX2JhbmQgfD0gV0lSRUxFU1NfMTFfMjROIHwgV0lSRUxFU1NfMTFHIHwgV0lSRUxFU1NfMTFCOwotCQllbHNlIGlmICh0eF9yYV9iaXRtYXAgJiAweGZmMCkKLQkJCXN0YV9iYW5kIHw9IFdJUkVMRVNTXzExRyB8IFdJUkVMRVNTXzExQjsKLQkJZWxzZQotCQkJc3RhX2JhbmQgfD0gV0lSRUxFU1NfMTFCOwotCX0KLQotCXBzdGEtPndpcmVsZXNzX21vZGUgPSBzdGFfYmFuZDsKLQotCXJhaWQgPSBuZXR3b3JrdHlwZV90b19yYWlkMjNhKHN0YV9iYW5kKTsKLQlpbml0X3JhdGUgPSBnZXRfaGlnaGVzdF9yYXRlX2lkeDIzYSh0eF9yYV9iaXRtYXAmMHgwZmZmZmZmZikmMHgzZjsKLQotCWlmIChwc3RhLT5haWQgPCBOVU1fU1RBKSB7Ci0JCXU4IGFyZzsKLQotCQlhcmcgPSBwc3RhLT5tYWNfaWQmMHgxZjsKLQotCQlhcmcgfD0gQklUKDcpOyAvKiBzdXBwb3J0IGVudHJ5IDJ+MzEgKi8KLQotCQlpZiAoc2hvcnRHSXJhdGUgPT0gdHJ1ZSkKLQkJCWFyZyB8PSBCSVQoNSk7Ci0KLQkJdHhfcmFfYml0bWFwIHw9ICgocmFpZDw8MjgpJjB4ZjAwMDAwMDApOwotCi0JCURCR184NzIzQSgiJXMgPT4gbWFjX2lkOiVkICwgcmFpZDolZCAsIGJpdG1hcCA9IDB4JXgsIGFyZyA9ICIKLQkJCSAgIjB4JXhcbiIsCi0JCQkgIF9fZnVuY19fLCBwc3RhLT5tYWNfaWQsIHJhaWQsIHR4X3JhX2JpdG1hcCwgYXJnKTsKLQotCQkvKiBiaXRtYXBbMDoyN10gPSB0eF9yYXRlX2JpdG1hcCAqLwotCQkvKiBiaXRtYXBbMjg6MzFdPSBSYXRlIEFkYXB0aXZlIGlkICovCi0JCS8qIGFyZ1swOjRdID0gbWFjaWQgKi8KLQkJLyogYXJnWzVdID0gU2hvcnQgR0kgKi8KLQkJcnRsODcyM2FfYWRkX3JhdGVhdGlkKHBhZGFwdGVyLCB0eF9yYV9iaXRtYXAsIGFyZywgcnNzaV9sZXZlbCk7Ci0KLQkJaWYgKHNob3J0R0lyYXRlID09IHRydWUpCi0JCQlpbml0X3JhdGUgfD0gQklUKDYpOwotCi0JCS8qIHNldCByYV9pZCwgaW5pdF9yYXRlICovCi0JCXBzdGEtPnJhaWQgPSByYWlkOwotCQlwc3RhLT5pbml0X3JhdGUgPSBpbml0X3JhdGU7Ci0KLQl9IGVsc2UKLQkJREJHXzg3MjNBKCJzdGF0aW9uIGFpZCAlZCBleGNlZWQgdGhlIG1heCBudW1iZXJcbiIsIHBzdGEtPmFpZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9ibWNfc3RhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTMyIGluaXRfcmF0ZSA9IDA7Ci0JdW5zaWduZWQgY2hhciBuZXR3b3JrX3R5cGUsIHJhaWQ7Ci0JaW50IGksIHN1cHBvcnRSYXRlTnVtID0gMDsKLQl1bnNpZ25lZCBpbnQgdHhfcmFfYml0bWFwID0gMDsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQotCWlmIChwc3RhKSB7Ci0JCXBzdGEtPmFpZCA9IDA7IC8qIGRlZmF1bHQgc2V0IHRvIDAgKi8KLQkJcHN0YS0+bWFjX2lkID0gcHN0YS0+YWlkICsgMTsKLQotCQlwc3RhLT5xb3Nfb3B0aW9uID0gMDsKLQkJcHN0YS0+aHRwcml2Lmh0X29wdGlvbiA9IGZhbHNlOwotCi0JCXBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID0gMDsKLQotCQltZW1zZXQoKHZvaWQgKikmcHN0YS0+c3RhX3N0YXRzLCAwLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzdGFpbmZvX3N0YXRzKSk7Ci0KLQkJLyogcHJlcGFyZSBmb3IgYWRkX1JBVGlkMjNhICovCi0JCXN1cHBvcnRSYXRlTnVtID0gcnR3X2dldF9yYXRlc2V0X2xlbjIzYSgodTggKikmcGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcyk7Ci0JCW5ldHdvcmtfdHlwZSA9IHJ0d19jaGVja19uZXR3b3JrX3R5cGUyM2EoKHU4ICopJnBjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsIHN1cHBvcnRSYXRlTnVtLCAxKTsKLQotCQltZW1jcHkocHN0YS0+YnNzcmF0ZXNldCwgJnBjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsIHN1cHBvcnRSYXRlTnVtKTsKLQkJcHN0YS0+YnNzcmF0ZWxlbiA9IHN1cHBvcnRSYXRlTnVtOwotCi0JCS8qIGIvZyBtb2RlIHJhX2JpdG1hcCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgc3VwcG9ydFJhdGVOdW07IGkrKykgewotCQkJaWYgKHBzdGEtPmJzc3JhdGVzZXRbaV0pCi0JCQkJdHhfcmFfYml0bWFwIHw9IHJ0d19nZXRfYml0X3ZhbHVlX2Zyb21faWVlZV92YWx1ZTIzYShwc3RhLT5ic3NyYXRlc2V0W2ldJjB4N2YpOwotCQl9Ci0KLQkJaWYgKHBjdXJfbmV0d29yay0+RFNDb25maWcgPiAxNCkgewotCQkJLyogZm9yY2UgdG8gQSBtb2RlLiA1RyBkb2Vzbid0IHN1cHBvcnQgQ0NLIHJhdGVzICovCi0JCQluZXR3b3JrX3R5cGUgPSBXSVJFTEVTU18xMUE7Ci0JCQl0eF9yYV9iaXRtYXAgPSAweDE1MDsgLyogNiwgMTIsIDI0IE1icHMgKi8KLQkJfSBlbHNlIHsKLQkJCS8qIGZvcmNlIHRvIGIgbW9kZSAqLwotCQkJbmV0d29ya190eXBlID0gV0lSRUxFU1NfMTFCOwotCQkJdHhfcmFfYml0bWFwID0gMHhmOwotCQl9Ci0KLQkJcmFpZCA9IG5ldHdvcmt0eXBlX3RvX3JhaWQyM2EobmV0d29ya190eXBlKTsKLQkJaW5pdF9yYXRlID0gZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgyM2EodHhfcmFfYml0bWFwJjB4MGZmZmZmZmYpJjB4M2Y7Ci0KLQkJLyogYXAgbW9kZSAqLwotCQlydGw4NzIzYV9TZXRIYWxPRE1WYXIocGFkYXB0ZXIsIEhBTF9PRE1fU1RBX0lORk8sIHBzdGEsIHRydWUpOwotCi0JCXsKLQkJCXU4IGFyZzsKLQotCQkJYXJnID0gcHN0YS0+bWFjX2lkJjB4MWY7Ci0KLQkJCWFyZyB8PSBCSVQoNyk7Ci0KLQkJCXR4X3JhX2JpdG1hcCB8PSAoKHJhaWQ8PDI4KSYweGYwMDAwMDAwKTsKLQotCQkJREJHXzg3MjNBKCJ1cGRhdGVfYm1jX3N0YSwgbWFzayA9IDB4JXgsIGFyZyA9IDB4JXhcbiIsIHR4X3JhX2JpdG1hcCwgYXJnKTsKLQotCQkJLyogYml0bWFwWzA6MjddID0gdHhfcmF0ZV9iaXRtYXAgKi8KLQkJCS8qIGJpdG1hcFsyODozMV09IFJhdGUgQWRhcHRpdmUgaWQgKi8KLQkJCS8qIGFyZ1swOjRdID0gbWFjaWQgKi8KLQkJCS8qIGFyZ1s1XSA9IFNob3J0IEdJICovCi0JCQlydGw4NzIzYV9hZGRfcmF0ZWF0aWQocGFkYXB0ZXIsIHR4X3JhX2JpdG1hcCwgYXJnLCAwKTsKLQkJfQotCi0JCS8qIHNldCByYV9pZCwgaW5pdF9yYXRlICovCi0JCXBzdGEtPnJhaWQgPSByYWlkOwotCQlwc3RhLT5pbml0X3JhdGUgPSBpbml0X3JhdGU7Ci0KLQkJc3Bpbl9sb2NrX2JoKCZwc3RhLT5sb2NrKTsKLQkJcHN0YS0+c3RhdGUgPSBfRldfTElOS0VEOwotCQlzcGluX3VubG9ja19iaCgmcHN0YS0+bG9jayk7Ci0KLQl9IGVsc2UKLQkJREJHXzg3MjNBKCJhZGRfUkFUaWQyM2FfYm1jX3N0YSBlcnJvciFcbiIpOwotfQotCi0vKgotICogQUlEOiAxfk1BWCBmb3Igc3RhIGFuZCAwIGZvciBiYy9tYyBpbiBhcC9hZGhvYyBtb2RlCi0gKiBNQUNfSUQgPSBBSUQrMSBmb3Igc3RhIGluIGFwL2FkaG9jIG1vZGUKLSAqIE1BQ19JRCA9IDEgZm9yIGJjL21jIGZvciBzdGEvYXAvYWRob2MKLSAqIE1BQ19JRCA9IDAgZm9yIGJzc2lkIGZvciBzdGEvYXAvYWRob2MKLSAqIENBTV9JRCA9IDB+MyBmb3IgZGVmYXVsdCBrZXksIGNtZF9pZCA9IG1hY2lkICsgMywgbWFjaWQgPSBhaWQgKyAxOwotICovCi12b2lkIHVwZGF0ZV9zdGFfaW5mbzIzYV9hcG1vZGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBodF9wcml2ICpwaHRwcml2X2FwID0gJnBtbG1lcHJpdi0+aHRwcml2OwotCXN0cnVjdCBodF9wcml2ICpwaHRwcml2X3N0YSA9ICZwc3RhLT5odHByaXY7Ci0JLyogc2V0IGludGZfdGFnIHRvIGlmMSAqLwotCi0JcHN0YS0+bWFjX2lkID0gcHN0YS0+YWlkKzE7Ci0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JLyogYXAgbW9kZSAqLwotCXJ0bDg3MjNhX1NldEhhbE9ETVZhcihwYWRhcHRlciwgSEFMX09ETV9TVEFfSU5GTywgcHN0YSwgdHJ1ZSk7Ci0KLQlpZiAocHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9PSBkb3QxMUF1dGhBbGdydGhtXzgwMjFYKQotCQlwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9IHRydWU7Ci0JZWxzZQotCQlwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9IGZhbHNlOwotCi0JLyogdXBkYXRlIHN0YSdzIGNhcCAqLwotCi0JLyogRVJQICovCi0JVkNTX3VwZGF0ZTIzYShwYWRhcHRlciwgcHN0YSk7Ci0JLyogSFQgcmVsYXRlZCBjYXAgKi8KLQlpZiAocGh0cHJpdl9zdGEtPmh0X29wdGlvbikgewotCQkvKiBjaGVjayBpZiBzdGEgc3VwcG9ydHMgcnggYW1wZHUgKi8KLQkJcGh0cHJpdl9zdGEtPmFtcGR1X2VuYWJsZSA9IHBodHByaXZfYXAtPmFtcGR1X2VuYWJsZTsKLQotCQkvKiBjaGVjayBpZiBzdGEgc3VwcG9ydCBzIFNob3J0IEdJICovCi0JCWlmICgocGh0cHJpdl9zdGEtPmh0X2NhcC5jYXBfaW5mbyAmIHBodHByaXZfYXAtPmh0X2NhcC5jYXBfaW5mbykgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMHxJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkpCi0JCQlwaHRwcml2X3N0YS0+c2dpID0gdHJ1ZTsKLQotCQkvKiBid21vZGUgKi8KLQkJaWYgKChwaHRwcml2X3N0YS0+aHRfY2FwLmNhcF9pbmZvICYgcGh0cHJpdl9hcC0+aHRfY2FwLmNhcF9pbmZvKSAmIGNwdV90b19sZTE2KElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwKSkgewotCQkJLyogcGh0cHJpdl9zdGEtPmJ3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfNDA7ICovCi0JCQlwaHRwcml2X3N0YS0+Yndtb2RlID0gcG1sbWVleHQtPmN1cl9id21vZGU7Ci0JCQlwaHRwcml2X3N0YS0+Y2hfb2Zmc2V0ID0gcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQ7Ci0KLQkJfQotCi0JCXBzdGEtPnFvc19vcHRpb24gPSB0cnVlOwotCi0JfSBlbHNlIHsKLQkJcGh0cHJpdl9zdGEtPmFtcGR1X2VuYWJsZSA9IGZhbHNlOwotCi0JCXBodHByaXZfc3RhLT5zZ2kgPSBmYWxzZTsKLQkJcGh0cHJpdl9zdGEtPmJ3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfMjA7Ci0JCXBodHByaXZfc3RhLT5jaF9vZmZzZXQgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwotCX0KLQotCS8qIFJ4IEFNUERVICovCi0Jc2VuZF9kZWxiYTIzYShwYWRhcHRlciwgMCwgcHN0YS0+aHdhZGRyKTsgLyogcmVjaXBpZW50ICovCi0KLQkvKiBUWCBBTVBEVSAqLwotCXNlbmRfZGVsYmEyM2EocGFkYXB0ZXIsIDEsIHBzdGEtPmh3YWRkcik7IC8qIG9yaWdpbmF0b3IgKi8KLQlwaHRwcml2X3N0YS0+YWdnX2VuYWJsZV9iaXRtYXAgPSAweDA7LyogcmVzZXQgKi8KLQlwaHRwcml2X3N0YS0+Y2FuZGlkYXRlX3RpZF9iaXRtYXAgPSAweDA7LyogcmVzZXQgKi8KLQotCS8qIHRvZG86IGluaXQgb3RoZXIgdmFyaWFibGVzICovCi0KLQltZW1zZXQoKHZvaWQgKikmcHN0YS0+c3RhX3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHN0YWluZm9fc3RhdHMpKTsKLQotCXNwaW5fbG9ja19iaCgmcHN0YS0+bG9jayk7Ci0JcHN0YS0+c3RhdGUgfD0gX0ZXX0xJTktFRDsKLQlzcGluX3VubG9ja19iaCgmcHN0YS0+bG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9od19odF9wYXJhbShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXVuc2lnbmVkIGNoYXIgbWF4X0FNUERVX2xlbjsKLQl1bnNpZ25lZCBjaGFyIG1pbl9NUERVX3NwYWNpbmc7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQkvKgotCSAqIGhhbmRsZSBBLU1QRFUgcGFyYW1ldGVyIGZpZWxkCi0JICogQU1QRFVfcGFyYSBbMTowXTpNYXggQU1QRFUgTGVuID0+IDA6OGssIDE6MTZrLCAyOjMyaywgMzo2NGsKLQkgKiBBTVBEVV9wYXJhIFs0OjJdOk1pbiBNUERVIFN0YXJ0IFNwYWNpbmcKLQkqLwotCW1heF9BTVBEVV9sZW4gPSBwbWxtZWluZm8tPmh0X2NhcC5hbXBkdV9wYXJhbXNfaW5mbyAmCi0JCUlFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0ZBQ1RPUjsKLQotCW1pbl9NUERVX3NwYWNpbmcgPSAocG1sbWVpbmZvLT5odF9jYXAuYW1wZHVfcGFyYW1zX2luZm8gJgotCQkJICAgIElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFkpID4+IDI7Ci0KLQlydGw4NzIzYV9zZXRfYW1wZHVfbWluX3NwYWNlKHBhZGFwdGVyLCBtaW5fTVBEVV9zcGFjaW5nKTsKLQlydGw4NzIzYV9zZXRfYW1wZHVfZmFjdG9yKHBhZGFwdGVyLCBtYXhfQU1QRFVfbGVuKTsKLQotCS8qIENvbmZpZyBTTSBQb3dlciBTYXZlIHNldHRpbmcgKi8KLQlwbWxtZWluZm8tPlNNX1BTID0gKGxlMTZfdG9fY3B1KHBtbG1laW5mby0+aHRfY2FwLmNhcF9pbmZvKSAmCi0JCQkgICAgSUVFRTgwMjExX0hUX0NBUF9TTV9QUykgPj4gMjsKLQlpZiAocG1sbWVpbmZvLT5TTV9QUyA9PSBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUMpCi0JCURCR184NzIzQSgiJXMoKTogV0xBTl9IVF9DQVBfU01fUFNfU1RBVElDXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0X2Jzc19uZXR3b3JrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwYnVmKQotewotCWNvbnN0IHU4ICpwOwotCXU4IHZhbDgsIGN1cl9jaGFubmVsLCBjdXJfYndtb2RlLCBjdXJfY2hfb2Zmc2V0OwotCXUxNiBiY25faW50ZXJ2YWw7Ci0JdTMyIGFjcGFybTsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29ya19tbG1lZXh0ID0gJnBtbG1laW5mby0+bmV0d29yazsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbiAqcGh0X2luZm8gPSBOVUxMOwotCi0JYmNuX2ludGVydmFsID0gKHUxNilwbmV0d29yay0+YmVhY29uX2ludGVydmFsOwotCWN1cl9jaGFubmVsID0gcG5ldHdvcmstPkRTQ29uZmlnOwotCWN1cl9id21vZGUgPSBIVF9DSEFOTkVMX1dJRFRIXzIwOwotCWN1cl9jaF9vZmZzZXQgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwotCi0JLyoKLQkgKiBjaGVjayBpZiB0aGVyZSBpcyB3cHMgaWUKLQkgKiBpZiB0aGVyZSBpcyB3cHNpZSBpbiBiZWFjb24gdGhlIGhvc3RhcGQgd2lsbAotCSAqIHVwZGF0ZSBiZWFjb24gdHdpY2Ugd2hlbiBzdGF0aW5nIGhvc3RhcGQKLQkgKiBhbmQgYXQgZmlyc3QgdGltZSB0aGUgc2VjdXJpdHkKLQkgKiBpZSAoUlNOL1dQQSBJRSkgd2lsbCBub3QgaW5jbHVkZSBpbiBiZWFjb24KLQkgKi8KLQlpZiAoIWNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkgICAgIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQUywKLQkJCQkgICAgIHBuZXR3b3JrLT5JRXMsCi0JCQkJICAgICBwbmV0d29yay0+SUVMZW5ndGgpKQotCQlwbWxtZWV4dC0+YnN0YXJ0X2JzcyA9IHRydWU7Ci0KLQkvKiB0b2RvOiB1cGRhdGUgd21tLCBodCBjYXAgKi8KLQkvKiBwbWxtZWluZm8tPldNTV9lbmFibGU7ICovCi0JLyogcG1sbWVpbmZvLT5IVF9lbmFibGU7ICovCi0JaWYgKHBtbG1lcHJpdi0+cW9zX29wdGlvbikKLQkJcG1sbWVpbmZvLT5XTU1fZW5hYmxlID0gdHJ1ZTsKLQlpZiAocG1sbWVwcml2LT5odHByaXYuaHRfb3B0aW9uKSB7Ci0JCXBtbG1laW5mby0+V01NX2VuYWJsZSA9IHRydWU7Ci0JCXBtbG1laW5mby0+SFRfZW5hYmxlID0gdHJ1ZTsKLQotCQl1cGRhdGVfaHdfaHRfcGFyYW0ocGFkYXB0ZXIpOwotCX0KLQotCWlmIChwbWxtZXByaXYtPmN1cl9uZXR3b3JrLmpvaW5fcmVzICE9IHRydWUpIHsKLQkJLyoKLQkJICogc2V0dGluZyBvbmx5IGF0IGZpcnN0IHRpbWUKLQkJICogV0VQIEtleSB3aWxsIGJlIHNldCBiZWZvcmUgdGhpcwotCQkgKiBmdW5jdGlvbiwgZG8gbm90IGNsZWFyIENBTS4KLQkJICovCi0JCWlmIChwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtICE9Ci0JCSAgICBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCAmJgotCQkgICAgcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSAhPQotCQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KQotCQkJZmx1c2hfYWxsX2NhbV9lbnRyeTIzYShwYWRhcHRlcik7CS8qIGNsZWFyIENBTSAqLwotCX0KLQotCS8qIHNldCBNU1IgdG8gQVBfTW9kZSAqLwotCXJ0bDg3MjNhX3NldF9tZWRpYV9zdGF0dXMocGFkYXB0ZXIsIE1TUl9BUCk7Ci0KLQkvKiBTZXQgQlNTSUQgUkVHICovCi0JaHdfdmFyX3NldF9ic3NpZChwYWRhcHRlciwgcG5ldHdvcmstPk1hY0FkZHJlc3MpOwotCi0JLyogU2V0IEVEQ0EgcGFyYW0gcmVnICovCi0JYWNwYXJtID0gMHgwMDJGMzIxNzsgLyogVk8gKi8KLQlydGw4NzIzYV9zZXRfYWNfcGFyYW1fdm8ocGFkYXB0ZXIsIGFjcGFybSk7Ci0JYWNwYXJtID0gMHgwMDVFNDMxNzsgLyogVkkgKi8KLQlydGw4NzIzYV9zZXRfYWNfcGFyYW1fdmkocGFkYXB0ZXIsIGFjcGFybSk7Ci0JYWNwYXJtID0gMHgwMDVlYTQyYjsKLQlydGw4NzIzYV9zZXRfYWNfcGFyYW1fYmUocGFkYXB0ZXIsIGFjcGFybSk7Ci0JYWNwYXJtID0gMHgwMDAwQTQ0NDsgLyogQksgKi8KLQlydGw4NzIzYV9zZXRfYWNfcGFyYW1fYmsocGFkYXB0ZXIsIGFjcGFybSk7Ci0KLQkvKiBTZXQgU2VjdXJpdHkgKi8KLQl2YWw4ID0gKHBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPT0gZG90MTFBdXRoQWxncnRobV84MDIxWCkgPwotCQkweGNjIDogMHhjZjsKLQlydGw4NzIzYV9zZXRfc2VjX2NmZyhwYWRhcHRlciwgdmFsOCk7Ci0KLQkvKiBCZWFjb24gQ29udHJvbCByZWxhdGVkIHJlZ2lzdGVyICovCi0JcnRsODcyM2Ffc2V0X2JlYWNvbl9pbnRlcnZhbChwYWRhcHRlciwgYmNuX2ludGVydmFsKTsKLQotCVVwZGF0ZUJyYXRlVGJsMjNhKHBhZGFwdGVyLCBwbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCUhhbFNldEJyYXRlQ2ZnMjNhKHBhZGFwdGVyLCBwbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCi0JaWYgKCFwbWxtZXByaXYtPmN1cl9uZXR3b3JrLmpvaW5fcmVzKSB7Ci0JCS8qIHNldHRpbmcgb25seSBhdCAgZmlyc3QgdGltZSAqLwotCi0JCS8qIGRpc2FibGUgZHluYW1pYyBmdW5jdGlvbnMsIHN1Y2ggYXMgaGlnaCBwb3dlciwgRElHICovCi0KLQkJLyogdHVybiBvbiBhbGwgZHluYW1pYyBmdW5jdGlvbnMgKi8KLQkJcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9zZXQocGFkYXB0ZXIsCi0JCQkJCQkgRFlOQU1JQ19BTExfRlVOQ19FTkFCTEUpOwotCX0KLQkvKiBzZXQgY2hhbm5lbCwgYndtb2RlICovCi0KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9IVF9PUEVSQVRJT04sIHBuZXR3b3JrLT5JRXMsCi0JCQkgICAgIHBuZXR3b3JrLT5JRUxlbmd0aCk7Ci0JaWYgKHAgJiYgcFsxXSkgewotCQlwaHRfaW5mbyA9IChzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbiAqKShwICsgMik7Ci0KLQkJaWYgKHByZWdwcml2LT5jYnc0MF9lbmFibGUgJiYgcGh0X2luZm8tPmh0X3BhcmFtICYKLQkJICAgIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFOX1dJRFRIX0FOWSkgewotCQkJLyogc3dpdGNoIHRvIHRoZSA0ME0gSHogbW9kZSAqLwotCQkJY3VyX2J3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfNDA7Ci0JCQlzd2l0Y2ggKHBodF9pbmZvLT5odF9wYXJhbSAmCi0JCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfT0ZGU0VUKSB7Ci0JCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFOgotCQkJCS8qCi0JCQkJICogcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPQotCQkJCSAqIEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUjsKLQkJCQkgKi8KLQkJCQljdXJfY2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19CRUxPVzoKLQkJCQljdXJfY2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX1VQUEVSOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQljdXJfY2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQkvKgotCSAqIFRPRE86IG5lZWQgdG8ganVkZ2UgdGhlIHBoeSBwYXJhbWV0ZXJzCi0JICogb24gY29uY3VycmVudCBtb2RlIGZvciBzaW5nbGUgcGh5Ci0JICovCi0Jc2V0X2NoYW5uZWxfYndtb2RlMjNhKHBhZGFwdGVyLCBjdXJfY2hhbm5lbCwgY3VyX2NoX29mZnNldCwgY3VyX2J3bW9kZSk7Ci0KLQlEQkdfODcyM0EoIkNIID0lZCwgQlcgPSVkLCBvZmZzZXQgPSVkXG4iLCBjdXJfY2hhbm5lbCwgY3VyX2J3bW9kZSwKLQkJICBjdXJfY2hfb2Zmc2V0KTsKLQotCXBtbG1lZXh0LT5jdXJfY2hhbm5lbCA9IGN1cl9jaGFubmVsOwotCXBtbG1lZXh0LT5jdXJfYndtb2RlID0gY3VyX2J3bW9kZTsKLQlwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9IGN1cl9jaF9vZmZzZXQ7Ci0JcG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlID0gcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrX3R5cGU7Ci0KLQkvKiB1cGRhdGUgY3VyX3dpcmVsZXNzX21vZGUgKi8KLQl1cGRhdGVfd2lyZWxlc3NfbW9kZTIzYShwYWRhcHRlcik7Ci0KLQkvKiB1cGRhdGUgY2FwYWJpbGl0eSBhZnRlciBjdXJfd2lyZWxlc3NfbW9kZSB1cGRhdGVkICovCi0JdXBkYXRlX2NhcGluZm8yM2EocGFkYXB0ZXIsIHBuZXR3b3JrLT5jYXBhYmlsaXR5KTsKLQotCS8qIGxldCBwbmV0d29ya19tbG1lZXh0ID09IHBuZXR3b3JrX21sbWUuICovCi0JbWVtY3B5KHBuZXR3b3JrX21sbWVleHQsIHBuZXR3b3JrLCBwbmV0d29yay0+TGVuZ3RoKTsKLQotCWlmIChwbWxtZWV4dC0+YnN0YXJ0X2JzcykgewotCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCBXTEFOX0VJRF9USU0sIE5VTEwsIGZhbHNlKTsKLQotCQkvKiBpc3N1ZSBiZWFjb24gZnJhbWUgKi8KLQkJaWYgKHNlbmRfYmVhY29uMjNhKHBhZGFwdGVyKSA9PSBfRkFJTCkKLQkJCURCR184NzIzQSgiaXNzdWVfYmVhY29uMjNhLCBmYWlsIVxuIik7Ci0JfQotCi0JLyogdXBkYXRlIGJjL21jIHN0YV9pbmZvICovCi0JdXBkYXRlX2JtY19zdGEocGFkYXB0ZXIpOwotfQotCi1pbnQgcnR3X2NoZWNrX2JlYWNvbl9kYXRhMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwgdW5zaWduZWQgaW50IGxlbikKLXsKLQlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0JdTggKnA7Ci0JdTggKnBIVF9jYXBzX2llID0gTlVMTDsKLQl1OCAqcEhUX2luZm9faWUgPSBOVUxMOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7Ci0JdTE2IGh0X2NhcCA9IGZhbHNlOwotCXVpbnQgaWVfbGVuID0gMDsKLQlpbnQgZ3JvdXBfY2lwaGVyLCBwYWlyd2lzZV9jaXBoZXI7Ci0JdTggY2hhbm5lbCwgbmV0d29ya190eXBlLCBzdXBwb3J0UmF0ZVtORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVhdOwotCWludCBzdXBwb3J0UmF0ZU51bSA9IDA7Ci0JdTggV01NX1BBUkFfSUVbXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAxLCAweDAxfTsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGJzc19uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKLQl1OCAqaWUgPSBwYnNzX25ldHdvcmstPklFczsKLQl1OCAqcGJ1ZiA9IG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlOwotCi0JbGVuIC09IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5iZWFjb24udmFyaWFibGUpOwotCS8qIFNTSUQgKi8KLQkvKiBTdXBwb3J0ZWQgcmF0ZXMgKi8KLQkvKiBEUyBQYXJhbXMgKi8KLQkvKiBXTEFOX0VJRF9DT1VOVFJZICovCi0JLyogRVJQIEluZm9ybWF0aW9uIGVsZW1lbnQgKi8KLQkvKiBFeHRlbmRlZCBzdXBwb3J0ZWQgcmF0ZXMgKi8KLQkvKiBXUEEvV1BBMiAqLwotCS8qIFdpLUZpIFdpcmVsZXNzIE11bHRpbWVkaWEgRXh0ZW5zaW9ucyAqLwotCS8qIGh0X2NhcGFiLCBodF9vcGVyICovCi0JLyogV1BTIElFICovCi0KLQlEQkdfODcyM0EoIiVzLCBsZW4gPSVkXG4iLCBfX2Z1bmNfXywgbGVuKTsKLQotCWlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlpZiAobGVuID4gTUFYX0lFX1NaKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlwYnNzX25ldHdvcmstPklFTGVuZ3RoID0gbGVuOwotCi0JbWVtc2V0KGllLCAwLCBNQVhfSUVfU1opOwotCi0JbWVtY3B5KGllLCBwYnVmLCBwYnNzX25ldHdvcmstPklFTGVuZ3RoKTsKLQotCWlmIChwYnNzX25ldHdvcmstPmlmbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9BUCAmJgotCSAgICBwYnNzX25ldHdvcmstPmlmbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9QMlBfR08pCi0JCXJldHVybiBfRkFJTDsKLQotCXBic3NfbmV0d29yay0+UnNzaSA9IDA7Ci0KLQltZW1jcHkocGJzc19uZXR3b3JrLT5NYWNBZGRyZXNzLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKTsKLQotCS8qIFNTSUQgKi8KLQlwID0gcnR3X2dldF9pZTIzYShpZSwgV0xBTl9FSURfU1NJRCwgJmllX2xlbiwgcGJzc19uZXR3b3JrLT5JRUxlbmd0aCk7Ci0JaWYgKHAgJiYgaWVfbGVuID4gMCkgewotCQltZW1zZXQoJnBic3NfbmV0d29yay0+U3NpZCwgMCwgc2l6ZW9mKHN0cnVjdCBjZmc4MDIxMV9zc2lkKSk7Ci0JCW1lbWNweShwYnNzX25ldHdvcmstPlNzaWQuc3NpZCwgKHAgKyAyKSwgaWVfbGVuKTsKLQkJcGJzc19uZXR3b3JrLT5Tc2lkLnNzaWRfbGVuID0gaWVfbGVuOwotCX0KLQotCS8qIGNoYW5uZWwgKi8KLQljaGFubmVsID0gMDsKLQlwID0gcnR3X2dldF9pZTIzYShpZSwgV0xBTl9FSURfRFNfUEFSQU1TLCAmaWVfbGVuLAotCQkJICBwYnNzX25ldHdvcmstPklFTGVuZ3RoKTsKLQlpZiAocCAmJiBpZV9sZW4gPiAwKQotCQljaGFubmVsID0gKihwICsgMik7Ci0KLQlwYnNzX25ldHdvcmstPkRTQ29uZmlnID0gY2hhbm5lbDsKLQotCW1lbXNldChzdXBwb3J0UmF0ZSwgMCwgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYKTsKLQkvKiAgZ2V0IHN1cHBvcnRlZCByYXRlcyAqLwotCXAgPSBydHdfZ2V0X2llMjNhKGllLCBXTEFOX0VJRF9TVVBQX1JBVEVTLCAmaWVfbGVuLAotCQkJICBwYnNzX25ldHdvcmstPklFTGVuZ3RoKTsKLQlpZiAocCkgewotCQltZW1jcHkoc3VwcG9ydFJhdGUsIHArMiwgaWVfbGVuKTsKLQkJc3VwcG9ydFJhdGVOdW0gPSBpZV9sZW47Ci0JfQotCi0JLyogZ2V0IGV4dF9zdXBwb3J0ZWQgcmF0ZXMgKi8KLQlwID0gcnR3X2dldF9pZTIzYShpZSwgV0xBTl9FSURfRVhUX1NVUFBfUkFURVMsCi0JCQkgICZpZV9sZW4sIHBic3NfbmV0d29yay0+SUVMZW5ndGgpOwotCWlmIChwKSB7Ci0JCW1lbWNweShzdXBwb3J0UmF0ZStzdXBwb3J0UmF0ZU51bSwgcCsyLCBpZV9sZW4pOwotCQlzdXBwb3J0UmF0ZU51bSArPSBpZV9sZW47Ci0JfQotCi0JbmV0d29ya190eXBlID0gcnR3X2NoZWNrX25ldHdvcmtfdHlwZTIzYShzdXBwb3J0UmF0ZSwKLQkJCQkJCSBzdXBwb3J0UmF0ZU51bSwgY2hhbm5lbCk7Ci0KLQlydHdfc2V0X3N1cHBvcnRlZF9yYXRlMjNhKHBic3NfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsIG5ldHdvcmtfdHlwZSk7Ci0KLQkvKiBwYXJzaW5nIEVSUF9JRSAqLwotCXAgPSBydHdfZ2V0X2llMjNhKGllLCBXTEFOX0VJRF9FUlBfSU5GTywgJmllX2xlbiwKLQkJCSAgcGJzc19uZXR3b3JrLT5JRUxlbmd0aCk7Ci0JaWYgKHAgJiYgaWVfbGVuID4gMCkKLQkJRVJQX0lFX2hhbmRsZXIyM2EocGFkYXB0ZXIsIHApOwotCi0JLyogdXBkYXRlIHByaXZhY3kvc2VjdXJpdHkgKi8KLQlpZiAocGJzc19uZXR3b3JrLT5jYXBhYmlsaXR5ICYgQklUKDQpKQotCQlwYnNzX25ldHdvcmstPlByaXZhY3kgPSAxOwotCWVsc2UKLQkJcGJzc19uZXR3b3JrLT5Qcml2YWN5ID0gMDsKLQotCXBzZWN1cml0eXByaXYtPndwYV9wc2sgPSAwOwotCi0JLyogd3BhMiAqLwotCWdyb3VwX2NpcGhlciA9IDA7IHBhaXJ3aXNlX2NpcGhlciA9IDA7Ci0JcHNlY3VyaXR5cHJpdi0+d3BhMl9ncm91cF9jaXBoZXIgPSAwOwotCXBzZWN1cml0eXByaXYtPndwYTJfcGFpcndpc2VfY2lwaGVyID0gMDsKLQlwID0gcnR3X2dldF9pZTIzYShpZSwgV0xBTl9FSURfUlNOLCAmaWVfbGVuLAotCQkJICBwYnNzX25ldHdvcmstPklFTGVuZ3RoKTsKLQlpZiAocCAmJiBpZV9sZW4gPiAwKSB7Ci0JCWlmIChydHdfcGFyc2Vfd3BhMl9pZTIzYShwLCBpZV9sZW4rMiwgJmdyb3VwX2NpcGhlciwKLQkJCQkJICZwYWlyd2lzZV9jaXBoZXIsIE5VTEwpID09IF9TVUNDRVNTKSB7Ci0JCQlwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID0gZG90MTFBdXRoQWxncnRobV84MDIxWDsKLQotCQkJcHNlY3VyaXR5cHJpdi0+ZG90ODAyMXhhbGcgPSAxOyAvKiBwc2ssIHRvZG86ODAyLjF4ICovCi0JCQlwc2VjdXJpdHlwcml2LT53cGFfcHNrIHw9IEJJVCgxKTsKLQotCQkJcHNlY3VyaXR5cHJpdi0+d3BhMl9ncm91cF9jaXBoZXIgPSBncm91cF9jaXBoZXI7Ci0JCQlwc2VjdXJpdHlwcml2LT53cGEyX3BhaXJ3aXNlX2NpcGhlciA9IHBhaXJ3aXNlX2NpcGhlcjsKLQkJfQotCX0KLQotCS8qIHdwYSAqLwotCWllX2xlbiA9IDA7Ci0JZ3JvdXBfY2lwaGVyID0gMDsKLQlwYWlyd2lzZV9jaXBoZXIgPSAwOwotCXBzZWN1cml0eXByaXYtPndwYV9ncm91cF9jaXBoZXIgPSAwOwotCXBzZWN1cml0eXByaXYtPndwYV9wYWlyd2lzZV9jaXBoZXIgPSAwOwotCWZvciAocCA9IGllOyA7IHAgKz0gKGllX2xlbiArIDIpKSB7Ci0JCXAgPSBydHdfZ2V0X2llMjNhKHAsIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQywgJmllX2xlbiwKLQkJCQkgIHBic3NfbmV0d29yay0+SUVMZW5ndGggLSAoaWVfbGVuICsgMikpOwotCQlpZiAoKHApICYmICghbWVtY21wKHArMiwgUlRXX1dQQV9PVUkyM0FfVFlQRSwgNCkpKSB7Ci0JCQlpZiAocnR3X3BhcnNlX3dwYV9pZTIzYShwLCBpZV9sZW4rMiwgJmdyb3VwX2NpcGhlciwKLQkJCQkJCSZwYWlyd2lzZV9jaXBoZXIsIE5VTEwpID09IF9TVUNDRVNTKSB7Ci0JCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fODAyMVg7Ci0KLQkJCQkvKiBwc2ssICB0b2RvOjgwMi4xeCAqLwotCQkJCXBzZWN1cml0eXByaXYtPmRvdDgwMjF4YWxnID0gMTsKLQotCQkJCXBzZWN1cml0eXByaXYtPndwYV9wc2sgfD0gQklUKDApOwotCi0JCQkJcHNlY3VyaXR5cHJpdi0+d3BhX2dyb3VwX2NpcGhlciA9IGdyb3VwX2NpcGhlcjsKLQkJCQlwc2VjdXJpdHlwcml2LT53cGFfcGFpcndpc2VfY2lwaGVyID0gcGFpcndpc2VfY2lwaGVyOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoIXAgfHwgIWllX2xlbikKLQkJCWJyZWFrOwotCX0KLQotCS8qIHdtbSAqLwotCWllX2xlbiA9IDA7Ci0JcG1sbWVwcml2LT5xb3Nfb3B0aW9uID0gMDsKLQlpZiAocHJlZ2lzdHJ5cHJpdi0+d21tX2VuYWJsZSkgewotCQlmb3IgKHAgPSBpZTsgOyBwICs9IChpZV9sZW4gKyAyKSkgewotCQkJcCA9IHJ0d19nZXRfaWUyM2EocCwgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDLCAmaWVfbGVuLAotCQkJCQkgIChwYnNzX25ldHdvcmstPklFTGVuZ3RoIC0KLQkJCQkJICAgKGllX2xlbiArIDIpKSk7Ci0JCQlpZiAoKHApICYmICFtZW1jbXAocCsyLCBXTU1fUEFSQV9JRSwgNikpIHsKLQkJCQlwbWxtZXByaXYtPnFvc19vcHRpb24gPSAxOwotCi0JCQkJKihwICsgOCkgfD0gQklUKDcpOy8qIFFvUyBJbmZvOnN1cHBvcnQgVS1BUFNEICovCi0KLQkJCQkvKiBkaXNhYmxlIGFsbCBBQ00gYml0cyBzaW5jZSB0aGUgV01NIGFkbWlzc2lvbgotCQkJCSAqIGNvbnRyb2wgaXMgbm90IHN1cHBvcnRlZAotCQkJCSAqLwotCQkJCSoocCArIDEwKSAmPSB+QklUKDQpOyAvKiBCRSAqLwotCQkJCSoocCArIDE0KSAmPSB+QklUKDQpOyAvKiBCSyAqLwotCQkJCSoocCArIDE4KSAmPSB+QklUKDQpOyAvKiBWSSAqLwotCQkJCSoocCArIDIyKSAmPSB+QklUKDQpOyAvKiBWTyAqLwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKChwID09IE5VTEwpIHx8IChpZV9sZW4gPT0gMCkpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JLyogcGFyc2luZyBIVF9DQVBfSUUgKi8KLQlwID0gcnR3X2dldF9pZTIzYShpZSwgV0xBTl9FSURfSFRfQ0FQQUJJTElUWSwgJmllX2xlbiwKLQkJCSAgcGJzc19uZXR3b3JrLT5JRUxlbmd0aCk7Ci0JaWYgKHAgJiYgaWVfbGVuID4gMCkgewotCQl1OCByZl90eXBlOwotCi0JCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpwaHRfY2FwID0gKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICopKHArMik7Ci0KLQkJcEhUX2NhcHNfaWUgPSBwOwotCi0JCWh0X2NhcCA9IHRydWU7Ci0JCW5ldHdvcmtfdHlwZSB8PSBXSVJFTEVTU18xMV8yNE47Ci0KLQkJcmZfdHlwZSA9IHJ0bDg3MjNhX2dldF9yZl90eXBlKHBhZGFwdGVyKTsKLQotCQlpZiAoKHBzZWN1cml0eXByaXYtPndwYV9wYWlyd2lzZV9jaXBoZXIgJiBXUEFfQ0lQSEVSX0NDTVApIHx8Ci0JCSAgICAocHNlY3VyaXR5cHJpdi0+d3BhMl9wYWlyd2lzZV9jaXBoZXIgJiBXUEFfQ0lQSEVSX0NDTVApKQotCQkJcGh0X2NhcC0+YW1wZHVfcGFyYW1zX2luZm8gfD0gKElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFkgJiAoMHgwNzw8MikpOwotCQllbHNlCi0JCQlwaHRfY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyB8PSAoSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fREVOU0lUWSYweDAwKTsKLQotCQkvKiBzZXQgIE1heCBSeCBBTVBEVSBzaXplICB0byA2NEsgKi8KLQkJcGh0X2NhcC0+YW1wZHVfcGFyYW1zX2luZm8gfD0gKElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0ZBQ1RPUiAmIDB4MDMpOwotCi0JCWlmIChyZl90eXBlID09IFJGXzFUMVIpIHsKLQkJCXBodF9jYXAtPm1jcy5yeF9tYXNrWzBdID0gMHhmZjsKLQkJCXBodF9jYXAtPm1jcy5yeF9tYXNrWzFdID0gMHgwOwotCQl9Ci0KLQkJbWVtY3B5KCZwbWxtZXByaXYtPmh0cHJpdi5odF9jYXAsIHArMiwgaWVfbGVuKTsKLQl9Ci0KLQkvKiBwYXJzaW5nIEhUX0lORk9fSUUgKi8KLQlwID0gcnR3X2dldF9pZTIzYShpZSwgV0xBTl9FSURfSFRfT1BFUkFUSU9OLCAmaWVfbGVuLAotCQkJICBwYnNzX25ldHdvcmstPklFTGVuZ3RoKTsKLQlpZiAocCAmJiBpZV9sZW4gPiAwKQotCQlwSFRfaW5mb19pZSA9IHA7Ci0KLQlwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmtfdHlwZSA9IG5ldHdvcmtfdHlwZTsKLQotCXBtbG1lcHJpdi0+aHRwcml2Lmh0X29wdGlvbiA9IGZhbHNlOwotCi0JLyogaHRfY2FwICovCi0JaWYgKHByZWdpc3RyeXByaXYtPmh0X2VuYWJsZSAmJiBodF9jYXApIHsKLQkJcG1sbWVwcml2LT5odHByaXYuaHRfb3B0aW9uID0gdHJ1ZTsKLQkJcG1sbWVwcml2LT5xb3Nfb3B0aW9uID0gMTsKLQotCQlpZiAocHJlZ2lzdHJ5cHJpdi0+YW1wZHVfZW5hYmxlID09IDEpCi0JCQlwbWxtZXByaXYtPmh0cHJpdi5hbXBkdV9lbmFibGUgPSB0cnVlOwotCi0JCUhUX2NhcHNfaGFuZGxlcjIzYShwYWRhcHRlciwgcEhUX2NhcHNfaWUpOwotCi0JCUhUX2luZm9faGFuZGxlcjIzYShwYWRhcHRlciwgcEhUX2luZm9faWUpOwotCX0KLQotCXBic3NfbmV0d29yay0+TGVuZ3RoID0gZ2V0X3dsYW5fYnNzaWRfZXhfc3oocGJzc19uZXR3b3JrKTsKLQotCS8qIGlzc3VlIGJlYWNvbiB0byBzdGFydCBic3MgbmV0d29yayAqLwotCXN0YXJ0X2Jzc19uZXR3b3JrKHBhZGFwdGVyLCAodTggKilwYnNzX25ldHdvcmspOwotCi0JLyogYWxsb2Mgc3RhX2luZm8gZm9yIGFwIGl0c2VsZiAqLwotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LCBwYnNzX25ldHdvcmstPk1hY0FkZHJlc3MpOwotCWlmICghcHN0YSkgewotCQlwc3RhID0gcnR3X2FsbG9jX3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LAotCQkJCQkgICAgcGJzc19uZXR3b3JrLT5NYWNBZGRyZXNzLAotCQkJCQkgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcHN0YSkKLQkJCXJldHVybiBfRkFJTDsKLQl9Ci0JLyogZml4IGJ1ZyBvZiBmbHVzaF9jYW1fZW50cnkgYXQgU1RPUCBBUCBtb2RlICovCi0JcHN0YS0+c3RhdGUgfD0gV0lGSV9BUF9TVEFURTsKLQlydHdfaW5kaWNhdGVfY29ubmVjdDIzYShwYWRhcHRlcik7Ci0KLQkvKiBmb3IgY2hlY2sgaWYgYWxyZWFkeSBzZXQgYmVhY29uICovCi0JcG1sbWVwcml2LT5jdXJfbmV0d29yay5qb2luX3JlcyA9IHRydWU7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIHJ0d19zZXRfbWFjYWRkcl9hY2wyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgaW50IG1vZGUpCi17Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9hY2xfcG9vbCAqcGFjbF9saXN0ID0gJnBzdGFwcml2LT5hY2xfbGlzdDsKLQotCURCR184NzIzQSgiJXMsIG1vZGUgPSVkXG4iLCBfX2Z1bmNfXywgbW9kZSk7Ci0KLQlwYWNsX2xpc3QtPm1vZGUgPSBtb2RlOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfYmNuX2VycGluZm9faWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrID0gJnBtbG1laW5mby0+bmV0d29yazsKLQl1bnNpZ25lZCBjaGFyICpwLCAqaWUgPSBwbmV0d29yay0+SUVzOwotCXUzMiBsZW4gPSAwOwotCi0JREJHXzg3MjNBKCIlcywgRVJQX2VuYWJsZSA9JWRcbiIsIF9fZnVuY19fLCBwbWxtZWluZm8tPkVSUF9lbmFibGUpOwotCi0JaWYgKCFwbWxtZWluZm8tPkVSUF9lbmFibGUpCi0JCXJldHVybjsKLQotCS8qIHBhcnNpbmcgRVJQX0lFICovCi0JcCA9IHJ0d19nZXRfaWUyM2EoaWUsIFdMQU5fRUlEX0VSUF9JTkZPLCAmbGVuLCBwbmV0d29yay0+SUVMZW5ndGgpOwotCWlmIChwICYmIGxlbiA+IDApIHsKLQkJaWYgKHBtbG1lcHJpdi0+bnVtX3N0YV9ub25fZXJwID09IDEpCi0JCQlwWzJdIHw9IFdMQU5fRVJQX05PTl9FUlBfUFJFU0VOVCB8Ci0JCQkJV0xBTl9FUlBfVVNFX1BST1RFQ1RJT047Ci0JCWVsc2UKLQkJCXBbMl0gJj0gfihXTEFOX0VSUF9OT05fRVJQX1BSRVNFTlQgfAotCQkJCSAgV0xBTl9FUlBfVVNFX1BST1RFQ1RJT04pOwotCi0JCWlmIChwbWxtZXByaXYtPm51bV9zdGFfbm9fc2hvcnRfcHJlYW1ibGUgPiAwKQotCQkJcFsyXSB8PSBXTEFOX0VSUF9CQVJLRVJfUFJFQU1CTEU7Ci0JCWVsc2UKLQkJCXBbMl0gJj0gfihXTEFOX0VSUF9CQVJLRVJfUFJFQU1CTEUpOwotCi0JCUVSUF9JRV9oYW5kbGVyMjNhKHBhZGFwdGVyLCBwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9iY25fd3BhX2llKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfYmNuX3dtbV9pZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX2Jjbl93cHNfaWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9iY25fcDJwX2llKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9iY25fdmVuZG9yX3NwZWNfaWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKm91aSkKLXsKLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIW1lbWNtcChSVFdfV1BBX09VSTIzQV9UWVBFLCBvdWksIDQpKQotCQl1cGRhdGVfYmNuX3dwYV9pZShwYWRhcHRlcik7Ci0JZWxzZSBpZiAoIW1lbWNtcChXTU1fT1VJMjNBLCBvdWksIDQpKQotCQl1cGRhdGVfYmNuX3dtbV9pZShwYWRhcHRlcik7Ci0JZWxzZSBpZiAoIW1lbWNtcChXUFNfT1VJMjNBLCBvdWksIDQpKQotCQl1cGRhdGVfYmNuX3dwc19pZShwYWRhcHRlcik7Ci0JZWxzZSBpZiAoIW1lbWNtcChQMlBfT1VJMjNBLCBvdWksIDQpKQotCQl1cGRhdGVfYmNuX3AycF9pZShwYWRhcHRlcik7Ci0JZWxzZQotCQlEQkdfODcyM0EoInVua25vd24gT1VJIHR5cGUhXG4iKTsKLX0KLQotdm9pZCB1cGRhdGVfYmVhY29uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGllX2lkLCB1OCAqb3VpLCB1OCB0eCkKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0OwotCS8qIHN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm87ICovCi0KLQkvKiBEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7ICovCi0KLQlpZiAoIXBhZGFwdGVyKQotCQlyZXR1cm47Ci0KLQlwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQkvKiBwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOyAqLwotCi0JaWYgKGZhbHNlID09IHBtbG1lZXh0LT5ic3RhcnRfYnNzKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+YmNuX3VwZGF0ZV9sb2NrKTsKLQotCXN3aXRjaCAoaWVfaWQpIHsKLQljYXNlIFdMQU5fRUlEX1RJTToKLQkJdXBkYXRlX0JDTlRJTShwYWRhcHRlcik7Ci0JCWJyZWFrOwotCi0JY2FzZSBXTEFOX0VJRF9FUlBfSU5GTzoKLQkJdXBkYXRlX2Jjbl9lcnBpbmZvX2llKHBhZGFwdGVyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzoKLQkJdXBkYXRlX2Jjbl92ZW5kb3Jfc3BlY19pZShwYWRhcHRlciwgb3VpKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlwbWxtZXByaXYtPnVwZGF0ZV9iY24gPSB0cnVlOwotCi0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+YmNuX3VwZGF0ZV9sb2NrKTsKLQotCWlmICh0eCkKLQkJc2V0X3R4X2JlYWNvbl9jbWQyM2EocGFkYXB0ZXIpOwotfQotCi0vKgotICogb3BfbW9kZQotICogU2V0IHRvIDAgKEhUIHB1cmUpIHVuZGVyIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICoJLSBhbGwgU1RBcyBpbiB0aGUgQlNTIGFyZSAyMC80MCBNSHogSFQgaW4gMjAvNDAgTUh6IEJTUyBvcgotICoJLSBhbGwgU1RBcyBpbiB0aGUgQlNTIGFyZSAyMCBNSHogSFQgaW4gMjAgTUh6IEJTUwotICogU2V0IHRvIDEgKEhUIG5vbi1tZW1iZXIgcHJvdGVjdGlvbikgaWYgdGhlcmUgbWF5IGJlIG5vbi1IVCBTVEFzCi0gKglpbiBib3RoIHRoZSBwcmltYXJ5IGFuZCB0aGUgc2Vjb25kYXJ5IGNoYW5uZWwKLSAqIFNldCB0byAyIGlmIG9ubHkgSFQgU1RBcyBhcmUgYXNzb2NpYXRlZCBpbiBCU1MsCi0gKglob3dldmVyIGFuZCBhdCBsZWFzdCBvbmUgMjAgTUh6IEhUIFNUQSBpcyBhc3NvY2lhdGVkCi0gKiBTZXQgdG8gMyAoSFQgbWl4ZWQgbW9kZSkgd2hlbiBvbmUgb3IgbW9yZSBub24tSFQgU1RBcyBhcmUgYXNzb2NpYXRlZAotICoJKGN1cnJlbnRseSBub24tR0YgSFQgc3RhdGlvbiBpcyBjb25zaWRlcmVkIGFzIG5vbi1IVCBTVEEgYWxzbykKLSovCi1zdGF0aWMgaW50IHJ0d19odF9vcGVyYXRpb25fdXBkYXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTE2IGN1cl9vcF9tb2RlLCBuZXdfb3BfbW9kZTsKLQlpbnQgb3BfbW9kZV9jaGFuZ2VzID0gMDsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBodF9wcml2ICpwaHRwcml2X2FwID0gJnBtbG1lcHJpdi0+aHRwcml2OwotCi0JaWYgKHBtbG1lcHJpdi0+aHRwcml2Lmh0X29wdGlvbikKLQkJcmV0dXJuIDA7Ci0KLQkvKiBpZiAoIWlmYWNlLT5jb25mLT5pZWVlODAyMTFuIHx8IGlmYWNlLT5jb25mLT5odF9vcF9tb2RlX2ZpeGVkKSAqLwotCS8qCXJldHVybiAwOyAqLwotCi0JREJHXzg3MjNBKCIlcyBjdXJyZW50IG9wZXJhdGlvbiBtb2RlID0gMHglWFxuIiwKLQkJICAgX19mdW5jX18sIHBtbG1lcHJpdi0+aHRfb3BfbW9kZSk7Ci0KLQlpZiAoIShwbWxtZXByaXYtPmh0X29wX21vZGUgJiBJRUVFODAyMTFfSFRfT1BfTU9ERV9OT05fR0ZfU1RBX1BSU05UKQotCSAgICAmJiBwbWxtZXByaXYtPm51bV9zdGFfaHRfbm9fZ2YpIHsKLQkJcG1sbWVwcml2LT5odF9vcF9tb2RlIHw9Ci0JCQlJRUVFODAyMTFfSFRfT1BfTU9ERV9OT05fR0ZfU1RBX1BSU05UOwotCQlvcF9tb2RlX2NoYW5nZXMrKzsKLQl9IGVsc2UgaWYgKChwbWxtZXByaXYtPmh0X29wX21vZGUgJgotCQkgICAgSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0dGX1NUQV9QUlNOVCkgJiYKLQkJICAgcG1sbWVwcml2LT5udW1fc3RhX2h0X25vX2dmID09IDApIHsKLQkJcG1sbWVwcml2LT5odF9vcF9tb2RlICY9Ci0JCQl+SUVFRTgwMjExX0hUX09QX01PREVfTk9OX0dGX1NUQV9QUlNOVDsKLQkJb3BfbW9kZV9jaGFuZ2VzKys7Ci0JfQotCi0JaWYgKCEocG1sbWVwcml2LT5odF9vcF9tb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0hUX1NUQV9QUlNOVCkgJiYKLQkgICAgKHBtbG1lcHJpdi0+bnVtX3N0YV9ub19odCB8fCBwbWxtZXByaXYtPm9sYmNfaHQpKSB7Ci0JCXBtbG1lcHJpdi0+aHRfb3BfbW9kZSB8PSBJRUVFODAyMTFfSFRfT1BfTU9ERV9OT05fSFRfU1RBX1BSU05UOwotCQlvcF9tb2RlX2NoYW5nZXMrKzsKLQl9IGVsc2UgaWYgKChwbWxtZXByaXYtPmh0X29wX21vZGUgJgotCQkgICAgSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0hUX1NUQV9QUlNOVCkgJiYKLQkJICAgKHBtbG1lcHJpdi0+bnVtX3N0YV9ub19odCA9PSAwICYmICFwbWxtZXByaXYtPm9sYmNfaHQpKSB7Ci0JCXBtbG1lcHJpdi0+aHRfb3BfbW9kZSAmPQotCQkJfklFRUU4MDIxMV9IVF9PUF9NT0RFX05PTl9IVF9TVEFfUFJTTlQ7Ci0JCW9wX21vZGVfY2hhbmdlcysrOwotCX0KLQotCS8qCi0JICogTm90ZTogY3VycmVudGx5IHdlIHN3aXRjaCB0byB0aGUgTUlYRUQgb3AgbW9kZSBpZiBIVCBub24tZ3JlZW5maWVsZAotCSAqIHN0YXRpb24gaXMgYXNzb2NpYXRlZC4gUHJvYmFibHkgaXQncyBhIHRoZW9yZXRpY2FsIGNhc2UsIHNpbmNlCi0JICogaXQgbG9va3MgbGlrZSBhbGwga25vd24gSFQgU1RBcyBzdXBwb3J0IGdyZWVuZmllbGQuCi0JICovCi0JaWYgKHBtbG1lcHJpdi0+bnVtX3N0YV9ub19odCB8fAotCSAgICAocG1sbWVwcml2LT5odF9vcF9tb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0dGX1NUQV9QUlNOVCkpCi0JCW5ld19vcF9tb2RlID0gSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTl9OT05IVF9NSVhFRDsKLQllbHNlIGlmICgobGUxNl90b19jcHUocGh0cHJpdl9hcC0+aHRfY2FwLmNhcF9pbmZvKSAmCi0JCSAgSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDApICYmCi0JCSBwbWxtZXByaXYtPm51bV9zdGFfaHRfMjBtaHopCi0JCW5ld19vcF9tb2RlID0gSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTl8yME1IWjsKLQllbHNlIGlmIChwbWxtZXByaXYtPm9sYmNfaHQpCi0JCW5ld19vcF9tb2RlID0gSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTl9OT05NRU1CRVI7Ci0JZWxzZQotCQluZXdfb3BfbW9kZSA9IElFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT05fTk9ORTsKLQotCWN1cl9vcF9tb2RlID0gcG1sbWVwcml2LT5odF9vcF9tb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTjsKLQlpZiAoY3VyX29wX21vZGUgIT0gbmV3X29wX21vZGUpIHsKLQkJcG1sbWVwcml2LT5odF9vcF9tb2RlICY9IH5JRUVFODAyMTFfSFRfT1BfTU9ERV9QUk9URUNUSU9OOwotCQlwbWxtZXByaXYtPmh0X29wX21vZGUgfD0gbmV3X29wX21vZGU7Ci0JCW9wX21vZGVfY2hhbmdlcysrOwotCX0KLQotCURCR184NzIzQSgiJXMgbmV3IG9wZXJhdGlvbiBtb2RlID0gMHglWCBjaGFuZ2VzID0lZFxuIiwKLQkJICAgX19mdW5jX18sIHBtbG1lcHJpdi0+aHRfb3BfbW9kZSwgb3BfbW9kZV9jaGFuZ2VzKTsKLQotCXJldHVybiBvcF9tb2RlX2NoYW5nZXM7Ci19Ci0KLXZvaWQgYXNzb2NpYXRlZF9jbGllbnRzX3VwZGF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB1cGRhdGVkKQotewotCS8qIHVwZGF0ZSBhc3NvY2lhdGVkIHN0YXRpb25zIGNhcC4gKi8KLQlpZiAodXBkYXRlZCA9PSB0cnVlKSB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsICpwdG1wOwotCQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQkJcGhlYWQgPSAmcHN0YXByaXYtPmFzb2NfbGlzdDsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBzdGEsIHB0bXAsIHBoZWFkLCBhc29jX2xpc3QpCi0JCQlWQ1NfdXBkYXRlMjNhKHBhZGFwdGVyLCBwc3RhKTsKLQkJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0JfQotfQotCi0vKiBjYWxsZWQgPiBUU1IgTEVWRUwgZm9yIFVTQiBvciBTRElPIEludGVyZmFjZSAqLwotdm9pZCBic3NfY2FwX3VwZGF0ZV9vbl9zdGFfam9pbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0JdTggYmVhY29uX3VwZGF0ZWQgPSBmYWxzZTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQlpZiAoIShwc3RhLT5mbGFncyAmIFdMQU5fU1RBX1NIT1JUX1BSRUFNQkxFKSkgewotCQlpZiAoIXBzdGEtPm5vX3Nob3J0X3ByZWFtYmxlX3NldCkgewotCQkJcHN0YS0+bm9fc2hvcnRfcHJlYW1ibGVfc2V0ID0gMTsKLQotCQkJcG1sbWVwcml2LT5udW1fc3RhX25vX3Nob3J0X3ByZWFtYmxlKys7Ci0KLQkJCWlmICgocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlID4gV0lSRUxFU1NfMTFCKSAmJgotCQkJCShwbWxtZXByaXYtPm51bV9zdGFfbm9fc2hvcnRfcHJlYW1ibGUgPT0gMSkpIHsKLQkJCQliZWFjb25fdXBkYXRlZCA9IHRydWU7Ci0JCQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgMHhGRiwgTlVMTCwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChwc3RhLT5ub19zaG9ydF9wcmVhbWJsZV9zZXQpIHsKLQkJCXBzdGEtPm5vX3Nob3J0X3ByZWFtYmxlX3NldCA9IDA7Ci0KLQkJCXBtbG1lcHJpdi0+bnVtX3N0YV9ub19zaG9ydF9wcmVhbWJsZS0tOwotCi0JCQlpZiAoKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSA+IFdJUkVMRVNTXzExQikgJiYKLQkJCQkocG1sbWVwcml2LT5udW1fc3RhX25vX3Nob3J0X3ByZWFtYmxlID09IDApKSB7Ci0JCQkJYmVhY29uX3VwZGF0ZWQgPSB0cnVlOwotCQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIDB4RkYsIE5VTEwsIHRydWUpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQlpZiAocHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9OT05FUlApIHsKLQkJaWYgKCFwc3RhLT5ub25lcnBfc2V0KSB7Ci0JCQlwc3RhLT5ub25lcnBfc2V0ID0gMTsKLQotCQkJcG1sbWVwcml2LT5udW1fc3RhX25vbl9lcnArKzsKLQotCQkJaWYgKHBtbG1lcHJpdi0+bnVtX3N0YV9ub25fZXJwID09IDEpIHsKLQkJCQliZWFjb25fdXBkYXRlZCA9IHRydWU7Ci0JCQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgV0xBTl9FSURfRVJQX0lORk8sIE5VTEwsIHRydWUpOwotCQkJfQotCQl9Ci0KLQl9IGVsc2UgewotCQlpZiAocHN0YS0+bm9uZXJwX3NldCkgewotCQkJcHN0YS0+bm9uZXJwX3NldCA9IDA7Ci0KLQkJCXBtbG1lcHJpdi0+bnVtX3N0YV9ub25fZXJwLS07Ci0KLQkJCWlmIChwbWxtZXByaXYtPm51bV9zdGFfbm9uX2VycCA9PSAwKSB7Ci0JCQkJYmVhY29uX3VwZGF0ZWQgPSB0cnVlOwotCQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIFdMQU5fRUlEX0VSUF9JTkZPLCBOVUxMLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JaWYgKCEocHN0YS0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UX1RJTUUpKSB7Ci0JCWlmICghcHN0YS0+bm9fc2hvcnRfc2xvdF90aW1lX3NldCkgewotCQkJcHN0YS0+bm9fc2hvcnRfc2xvdF90aW1lX3NldCA9IDE7Ci0KLQkJCXBtbG1lcHJpdi0+bnVtX3N0YV9ub19zaG9ydF9zbG90X3RpbWUrKzsKLQotCQkJaWYgKChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgPiBXSVJFTEVTU18xMUIpICYmCi0JCQkJIChwbWxtZXByaXYtPm51bV9zdGFfbm9fc2hvcnRfc2xvdF90aW1lID09IDEpKSB7Ci0JCQkJYmVhY29uX3VwZGF0ZWQgPSB0cnVlOwotCQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIDB4RkYsIE5VTEwsIHRydWUpOwotCQkJfQotCi0JCX0KLQl9IGVsc2UgewotCQlpZiAocHN0YS0+bm9fc2hvcnRfc2xvdF90aW1lX3NldCkgewotCQkJcHN0YS0+bm9fc2hvcnRfc2xvdF90aW1lX3NldCA9IDA7Ci0KLQkJCXBtbG1lcHJpdi0+bnVtX3N0YV9ub19zaG9ydF9zbG90X3RpbWUtLTsKLQotCQkJaWYgKChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgPiBXSVJFTEVTU18xMUIpICYmCi0JCQkJIChwbWxtZXByaXYtPm51bV9zdGFfbm9fc2hvcnRfc2xvdF90aW1lID09IDApKSB7Ci0JCQkJYmVhY29uX3VwZGF0ZWQgPSB0cnVlOwotCQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIDB4RkYsIE5VTEwsIHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKHBzdGEtPmZsYWdzICYgV0xBTl9TVEFfSFQpIHsKLQkJdTE2IGh0X2NhcGFiID0gbGUxNl90b19jcHUocHN0YS0+aHRwcml2Lmh0X2NhcC5jYXBfaW5mbyk7Ci0KLQkJREJHXzg3MjNBKCJIVDogU1RBICVwTSBIVCBDYXBhYmlsaXRpZXMgSW5mbzogMHglMDR4XG4iLAotCQkJICBwc3RhLT5od2FkZHIsIGh0X2NhcGFiKTsKLQotCQlpZiAocHN0YS0+bm9faHRfc2V0KSB7Ci0JCQlwc3RhLT5ub19odF9zZXQgPSAwOwotCQkJcG1sbWVwcml2LT5udW1fc3RhX25vX2h0LS07Ci0JCX0KLQotCQlpZiAoKGh0X2NhcGFiICYgSUVFRTgwMjExX0hUX0NBUF9HUk5fRkxEKSA9PSAwKSB7Ci0JCQlpZiAoIXBzdGEtPm5vX2h0X2dmX3NldCkgewotCQkJCXBzdGEtPm5vX2h0X2dmX3NldCA9IDE7Ci0JCQkJcG1sbWVwcml2LT5udW1fc3RhX2h0X25vX2dmKys7Ci0JCQl9Ci0JCQlEQkdfODcyM0EoIiVzIFNUQSAlcE0gLSBubyBncmVlbmZpZWxkLCBudW0gb2Ygbm9uLWdmIHN0YXRpb25zICVkXG4iLAotCQkJCSAgX19mdW5jX18sIHBzdGEtPmh3YWRkciwKLQkJCQkgIHBtbG1lcHJpdi0+bnVtX3N0YV9odF9ub19nZik7Ci0JCX0KLQotCQlpZiAoKGh0X2NhcGFiICYgSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDApID09IDApIHsKLQkJCWlmICghcHN0YS0+aHRfMjBtaHpfc2V0KSB7Ci0JCQkJcHN0YS0+aHRfMjBtaHpfc2V0ID0gMTsKLQkJCQlwbWxtZXByaXYtPm51bV9zdGFfaHRfMjBtaHorKzsKLQkJCX0KLQkJCURCR184NzIzQSgiJXMgU1RBICVwTSAtIDIwIE1IeiBIVCwgbnVtIG9mIDIwTUh6IEhUIFNUQXMgJWRcbiIsCi0JCQkJICBfX2Z1bmNfXywgcHN0YS0+aHdhZGRyLAotCQkJCSAgcG1sbWVwcml2LT5udW1fc3RhX2h0XzIwbWh6KTsKLQkJfQotCi0JfSBlbHNlIHsKLQkJaWYgKCFwc3RhLT5ub19odF9zZXQpIHsKLQkJCXBzdGEtPm5vX2h0X3NldCA9IDE7Ci0JCQlwbWxtZXByaXYtPm51bV9zdGFfbm9faHQrKzsKLQkJfQotCQlpZiAocG1sbWVwcml2LT5odHByaXYuaHRfb3B0aW9uKSB7Ci0JCQlEQkdfODcyM0EoIiVzIFNUQSAlcE0gLSBubyBIVCwgbnVtIG9mIG5vbi1IVCBzdGF0aW9ucyAlZFxuIiwKLQkJCQkgIF9fZnVuY19fLCBwc3RhLT5od2FkZHIsCi0JCQkJICBwbWxtZXByaXYtPm51bV9zdGFfbm9faHQpOwotCQl9Ci0JfQotCi0JaWYgKHJ0d19odF9vcGVyYXRpb25fdXBkYXRlKHBhZGFwdGVyKSA+IDApIHsKLQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgV0xBTl9FSURfSFRfQ0FQQUJJTElUWSwgTlVMTCwgZmFsc2UpOwotCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCBXTEFOX0VJRF9IVF9PUEVSQVRJT04sIE5VTEwsIHRydWUpOwotCX0KLQotCS8qIHVwZGF0ZSBhc3NvY2lhdGVkIHN0YXRpb25zIGNhcC4gKi8KLQlhc3NvY2lhdGVkX2NsaWVudHNfdXBkYXRlMjNhKHBhZGFwdGVyLCAgYmVhY29uX3VwZGF0ZWQpOwotCi0JREJHXzg3MjNBKCIlcywgdXBkYXRlZCA9JWRcbiIsIF9fZnVuY19fLCBiZWFjb25fdXBkYXRlZCk7Ci19Ci0KLXU4IGJzc19jYXBfdXBkYXRlX29uX3N0YV9sZWF2ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0JdTggYmVhY29uX3VwZGF0ZWQgPSBmYWxzZTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQlpZiAoIXBzdGEpCi0JCXJldHVybiBiZWFjb25fdXBkYXRlZDsKLQotCWlmIChwc3RhLT5ub19zaG9ydF9wcmVhbWJsZV9zZXQpIHsKLQkJcHN0YS0+bm9fc2hvcnRfcHJlYW1ibGVfc2V0ID0gMDsKLQkJcG1sbWVwcml2LT5udW1fc3RhX25vX3Nob3J0X3ByZWFtYmxlLS07Ci0JCWlmIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgPiBXSVJFTEVTU18xMUIKLQkJICAgICYmIHBtbG1lcHJpdi0+bnVtX3N0YV9ub19zaG9ydF9wcmVhbWJsZSA9PSAwKSB7Ci0JCQliZWFjb25fdXBkYXRlZCA9IHRydWU7Ci0JCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCAweEZGLCBOVUxMLCB0cnVlKTsKLQkJfQotCX0KLQotCWlmIChwc3RhLT5ub25lcnBfc2V0KSB7Ci0JCXBzdGEtPm5vbmVycF9zZXQgPSAwOwotCQlwbWxtZXByaXYtPm51bV9zdGFfbm9uX2VycC0tOwotCQlpZiAocG1sbWVwcml2LT5udW1fc3RhX25vbl9lcnAgPT0gMCkgewotCQkJYmVhY29uX3VwZGF0ZWQgPSB0cnVlOwotCQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgV0xBTl9FSURfRVJQX0lORk8sCi0JCQkJCSBOVUxMLCB0cnVlKTsKLQkJfQotCX0KLQotCWlmIChwc3RhLT5ub19zaG9ydF9zbG90X3RpbWVfc2V0KSB7Ci0JCXBzdGEtPm5vX3Nob3J0X3Nsb3RfdGltZV9zZXQgPSAwOwotCQlwbWxtZXByaXYtPm51bV9zdGFfbm9fc2hvcnRfc2xvdF90aW1lLS07Ci0JCWlmIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgPiBXSVJFTEVTU18xMUIKLQkJICAgICYmIHBtbG1lcHJpdi0+bnVtX3N0YV9ub19zaG9ydF9zbG90X3RpbWUgPT0gMCkgewotCQkJYmVhY29uX3VwZGF0ZWQgPSB0cnVlOwotCQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgMHhGRiwgTlVMTCwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlpZiAocHN0YS0+bm9faHRfZ2Zfc2V0KSB7Ci0JCXBzdGEtPm5vX2h0X2dmX3NldCA9IDA7Ci0JCXBtbG1lcHJpdi0+bnVtX3N0YV9odF9ub19nZi0tOwotCX0KLQotCWlmIChwc3RhLT5ub19odF9zZXQpIHsKLQkJcHN0YS0+bm9faHRfc2V0ID0gMDsKLQkJcG1sbWVwcml2LT5udW1fc3RhX25vX2h0LS07Ci0JfQotCi0JaWYgKHBzdGEtPmh0XzIwbWh6X3NldCkgewotCQlwc3RhLT5odF8yMG1oel9zZXQgPSAwOwotCQlwbWxtZXByaXYtPm51bV9zdGFfaHRfMjBtaHotLTsKLQl9Ci0KLQlpZiAocnR3X2h0X29wZXJhdGlvbl91cGRhdGUocGFkYXB0ZXIpID4gMCkgewotCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCBXTEFOX0VJRF9IVF9DQVBBQklMSVRZLCBOVUxMLCBmYWxzZSk7Ci0JCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIFdMQU5fRUlEX0hUX09QRVJBVElPTiwgTlVMTCwgdHJ1ZSk7Ci0JfQotCi0JLyogdXBkYXRlIGFzc29jaWF0ZWQgc3RhdGlvbnMgY2FwLiAqLwotCi0JREJHXzg3MjNBKCIlcywgdXBkYXRlZCA9JWRcbiIsIF9fZnVuY19fLCBiZWFjb25fdXBkYXRlZCk7Ci0KLQlyZXR1cm4gYmVhY29uX3VwZGF0ZWQ7Ci19Ci0KLXU4IGFwX2ZyZWVfc3RhMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgYm9vbCBhY3RpdmUsIHUxNiByZWFzb24pCi17Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQl1OCBiZWFjb25fdXBkYXRlZCA9IGZhbHNlOwotCi0JaWYgKCFwc3RhKQotCQlyZXR1cm4gYmVhY29uX3VwZGF0ZWQ7Ci0KLQlpZiAoYWN0aXZlKSB7Ci0JCS8qIHRlYXIgZG93biBSeCBBTVBEVSAqLwotCQlzZW5kX2RlbGJhMjNhKHBhZGFwdGVyLCAwLCBwc3RhLT5od2FkZHIpOyAvKiByZWNpcGllbnQgKi8KLQotCQkvKiB0ZWFyIGRvd24gVFggQU1QRFUgKi8KLQkJc2VuZF9kZWxiYTIzYShwYWRhcHRlciwgMSwgcHN0YS0+aHdhZGRyKTsgLyogb3JpZ2luYXRvciAqLwotCi0JCWlzc3VlX2RlYXV0aDIzYShwYWRhcHRlciwgcHN0YS0+aHdhZGRyLCByZWFzb24pOwotCX0KLQotCXBzdGEtPmh0cHJpdi5hZ2dfZW5hYmxlX2JpdG1hcCA9IDB4MDsJIC8qIHJlc2V0ICovCi0JcHN0YS0+aHRwcml2LmNhbmRpZGF0ZV90aWRfYml0bWFwID0gMHgwOyAvKiByZXNldCAqLwotCi0JLyogcmVwb3J0X2RlbF9zdGFfZXZlbnQyM2EocGFkYXB0ZXIsIHBzdGEtPmh3YWRkciwgcmVhc29uKTsgKi8KLQotCS8qIGNsZWFyIGNhbSBlbnRyeSAvIGtleSAqLwotCS8qIGNsZWFyX2NhbV9lbnRyeTIzYShwYWRhcHRlciwgKHBzdGEtPm1hY19pZCArIDMpKTsgKi8KLQlydHdfY2xlYXJzdGFrZXlfY21kMjNhKHBhZGFwdGVyLCAodTggKilwc3RhLCAodTgpKHBzdGEtPm1hY19pZCArIDMpLAotCQkJICAgICAgIHRydWUpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwc3RhLT5sb2NrKTsKLQlwc3RhLT5zdGF0ZSAmPSB+X0ZXX0xJTktFRDsKLQlzcGluX3VubG9ja19iaCgmcHN0YS0+bG9jayk7Ci0KLQlydHdfY2ZnODAyMTFfaW5kaWNhdGVfc3RhX2Rpc2Fzc29jKHBhZGFwdGVyLCBwc3RhLT5od2FkZHIsIHJlYXNvbik7Ci0KLQlyZXBvcnRfZGVsX3N0YV9ldmVudDIzYShwYWRhcHRlciwgcHN0YS0+aHdhZGRyLCByZWFzb24pOwotCi0JYmVhY29uX3VwZGF0ZWQgPSBic3NfY2FwX3VwZGF0ZV9vbl9zdGFfbGVhdmUyM2EocGFkYXB0ZXIsIHBzdGEpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JcnR3X2ZyZWVfc3RhaW5mbzIzYShwYWRhcHRlciwgcHN0YSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQotCXJldHVybiBiZWFjb25fdXBkYXRlZDsKLX0KLQotaW50IHJ0d19zdGFfZmx1c2gyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsICpwdG1wOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQl1OCBiY19hZGRyW0VUSF9BTEVOXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKLQl1OCBjaGtfYWxpdmVfbnVtID0gMDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKmNoa19hbGl2ZV9saXN0W05VTV9TVEFdOwotCWludCBpOwotCi0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSk7Ci0KLQlpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgIT0gTVNSX0FQKQotCQlyZXR1cm4gMDsKLQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQlwaGVhZCA9ICZwc3RhcHJpdi0+YXNvY19saXN0OwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwc3RhLCBwdG1wLCBwaGVhZCwgYXNvY19saXN0KSB7Ci0JCS8qIFJlbW92ZSBzdGEgZnJvbSBhc29jX2xpc3QgKi8KLQkJbGlzdF9kZWxfaW5pdCgmcHN0YS0+YXNvY19saXN0KTsKLQkJcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQtLTsKLQotCQkvKiBLZWVwIHN0YSBmb3IgYXBfZnJlZV9zdGEyM2EoKSBiZXlvbmQgdGhpcyBhc29jX2xpc3QgbG9vcCAqLwotCQljaGtfYWxpdmVfbGlzdFtjaGtfYWxpdmVfbnVtKytdID0gcHN0YTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0KLQkvKiBGb3IgZWFjaCBzdGEgaW4gY2hrX2FsaXZlX2xpc3QsIGNhbGwgYXBfZnJlZV9zdGEyM2EgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2hrX2FsaXZlX251bTsgaSsrKQotCQlhcF9mcmVlX3N0YTIzYShwYWRhcHRlciwgY2hrX2FsaXZlX2xpc3RbaV0sIHRydWUsCi0JCQkgICAgICAgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOwotCi0JaXNzdWVfZGVhdXRoMjNhKHBhZGFwdGVyLCBiY19hZGRyLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7Ci0KLQlhc3NvY2lhdGVkX2NsaWVudHNfdXBkYXRlMjNhKHBhZGFwdGVyLCB0cnVlKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBjYWxsZWQgPiBUU1IgTEVWRUwgZm9yIFVTQiBvciBTRElPIEludGVyZmFjZSAqLwotdm9pZCBzdGFfaW5mb191cGRhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCWludCBmbGFncyA9IHBzdGEtPmZsYWdzOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQkvKiB1cGRhdGUgd21tIGNhcC4gKi8KLQlpZiAoV0xBTl9TVEFfV01FJmZsYWdzKQotCQlwc3RhLT5xb3Nfb3B0aW9uID0gMTsKLQllbHNlCi0JCXBzdGEtPnFvc19vcHRpb24gPSAwOwotCi0JaWYgKHBtbG1lcHJpdi0+cW9zX29wdGlvbiA9PSAwKQotCQlwc3RhLT5xb3Nfb3B0aW9uID0gMDsKLQotCS8qIHVwZGF0ZSA4MDIuMTFuIGh0IGNhcC4gKi8KLQlpZiAoV0xBTl9TVEFfSFQmZmxhZ3MpIHsKLQkJcHN0YS0+aHRwcml2Lmh0X29wdGlvbiA9IHRydWU7Ci0JCXBzdGEtPnFvc19vcHRpb24gPSAxOwotCX0gZWxzZSB7Ci0JCXBzdGEtPmh0cHJpdi5odF9vcHRpb24gPSBmYWxzZTsKLQl9Ci0KLQlpZiAoIXBtbG1lcHJpdi0+aHRwcml2Lmh0X29wdGlvbikKLQkJcHN0YS0+aHRwcml2Lmh0X29wdGlvbiA9IGZhbHNlOwotCi0JdXBkYXRlX3N0YV9pbmZvMjNhX2FwbW9kZTIzYShwYWRhcHRlciwgcHN0YSk7Ci19Ci0KLS8qIGNhbGxlZCA+PSBUU1IgTEVWRUwgZm9yIFVTQiBvciBTRElPIEludGVyZmFjZSAqLwotdm9pZCBhcF9zdGFfaW5mb19kZWZlcl91cGRhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCWlmIChwc3RhLT5zdGF0ZSAmIF9GV19MSU5LRUQpIHsKLQkJLyogYWRkIHJhdGlkICovCi0JCWFkZF9SQVRpZDIzYShwYWRhcHRlciwgcHN0YSwgMCk7LyogRE1fUkFUUl9TVEFfSU5JVCAqLwotCX0KLX0KLQotLyogcmVzdG9yZSBodyBzZXR0aW5nIGZyb20gc3cgZGF0YSBzdHJ1Y3R1cmVzICovCi12b2lkIHJ0d19hcF9yZXN0b3JlX25ldHdvcmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICptbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgKnB0bXA7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQl1OCBjaGtfYWxpdmVfbnVtID0gMDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKmNoa19hbGl2ZV9saXN0W05VTV9TVEFdOwotCWludCBpOwotCi0JcnR3X3NldG9wbW9kZV9jbWQyM2EocGFkYXB0ZXIsIE5MODAyMTFfSUZUWVBFX0FQKTsKLQotCXNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsLCBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCwgcG1sbWVleHQtPmN1cl9id21vZGUpOwotCi0Jc3RhcnRfYnNzX25ldHdvcmsocGFkYXB0ZXIsICh1OCAqKSZtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yayk7Ci0KLQlpZiAocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID09Ci0JICAgIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVAgfHwKLQkgICAgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID09Ci0JICAgIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVApIHsKLQkJLyogcmVzdG9yZSBncm91cCBrZXksIFdFUCBrZXlzIGlzIHJlc3RvcmVkIGluIGlwc19sZWF2ZTIzYSgpICovCi0JCXJ0d19zZXRfa2V5MjNhKHBhZGFwdGVyLCBwc2VjdXJpdHlwcml2LAotCQkJICAgICAgIHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZCwgMCk7Ci0JfQotCi0JLyogcGVyIHN0YSBwYWlyd2lzZSBrZXkgYW5kIHNldHRpbmdzICovCi0JaWYgKHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSAhPQotCSAgICBXTEFOX0NJUEhFUl9TVUlURV9US0lQICYmCi0JICAgIHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSAhPQotCSAgICBXTEFOX0NJUEhFUl9TVUlURV9DQ01QKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0JcGhlYWQgPSAmcHN0YXByaXYtPmFzb2NfbGlzdDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHN0YSwgcHRtcCwgcGhlYWQsIGFzb2NfbGlzdCkKLQkJY2hrX2FsaXZlX2xpc3RbY2hrX2FsaXZlX251bSsrXSA9IHBzdGE7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY2hrX2FsaXZlX251bTsgaSsrKSB7Ci0JCXBzdGEgPSBjaGtfYWxpdmVfbGlzdFtpXTsKLQotCQlpZiAocHN0YS0+c3RhdGUgJiBfRldfTElOS0VEKSB7Ci0JCQlVcGRhdGVfUkFfRW50cnkyM2EocGFkYXB0ZXIsIHBzdGEpOwotCQkJLyogcGFpcndpc2Uga2V5ICovCi0JCQlydHdfc2V0c3Rha2V5X2NtZDIzYShwYWRhcHRlciwgKHVuc2lnbmVkIGNoYXIgKilwc3RhLCB0cnVlKTsKLQkJfQotCX0KLX0KLQotdm9pZCBzdGFydF9hcF9tb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IHdsYW5fYWNsX3Bvb2wgKnBhY2xfbGlzdCA9ICZwc3RhcHJpdi0+YWNsX2xpc3Q7Ci0KLQlwbWxtZXByaXYtPnVwZGF0ZV9iY24gPSBmYWxzZTsKLQotCS8qIGluaXRfbWxtZV9hcF9pbmZvMjNhKHBhZGFwdGVyKTsgKi8KLQlwbWxtZWV4dC0+YnN0YXJ0X2JzcyA9IGZhbHNlOwotCi0JcG1sbWVwcml2LT5udW1fc3RhX25vbl9lcnAgPSAwOwotCi0JcG1sbWVwcml2LT5udW1fc3RhX25vX3Nob3J0X3Nsb3RfdGltZSA9IDA7Ci0KLQlwbWxtZXByaXYtPm51bV9zdGFfbm9fc2hvcnRfcHJlYW1ibGUgPSAwOwotCi0JcG1sbWVwcml2LT5udW1fc3RhX2h0X25vX2dmID0gMDsKLQlwbWxtZXByaXYtPm51bV9zdGFfbm9faHQgPSAwOwotCXBtbG1lcHJpdi0+bnVtX3N0YV9odF8yMG1oeiA9IDA7Ci0KLQlwbWxtZXByaXYtPm9sYmMgPSBmYWxzZTsKLQotCXBtbG1lcHJpdi0+b2xiY19odCA9IGZhbHNlOwotCi0JcG1sbWVwcml2LT5odF9vcF9tb2RlID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fU1RBOyBpKyspCi0JCXBzdGFwcml2LT5zdGFfYWlkW2ldID0gTlVMTDsKLQotCS8qIGZvciBBQ0wgKi8KLQlJTklUX0xJU1RfSEVBRCgmcGFjbF9saXN0LT5hY2xfbm9kZV9xLnF1ZXVlKTsKLQlwYWNsX2xpc3QtPm51bSA9IDA7Ci0JcGFjbF9saXN0LT5tb2RlID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0FDTDsgaSsrKSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZwYWNsX2xpc3QtPmFjbG5vZGVbaV0ubGlzdCk7Ci0JCXBhY2xfbGlzdC0+YWNsbm9kZVtpXS52YWxpZCA9IGZhbHNlOwotCX0KLX0KLQotdm9pZCBzdG9wX2FwX21vZGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQlzdHJ1Y3QgcnR3X3dsYW5fYWNsX25vZGUgKnBhY2xub2RlLCAqcHRtcDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCB3bGFuX2FjbF9wb29sICpwYWNsX2xpc3QgPSAmcHN0YXByaXYtPmFjbF9saXN0OwotCXN0cnVjdCBydHdfcXVldWUgKnBhY2xfbm9kZV9xID0gJnBhY2xfbGlzdC0+YWNsX25vZGVfcTsKLQotCXBtbG1lcHJpdi0+dXBkYXRlX2JjbiA9IGZhbHNlOwotCXBtbG1lZXh0LT5ic3RhcnRfYnNzID0gZmFsc2U7Ci0KLQkvKgotCSAqIHJlc2V0IGFuZCBpbml0IHNlY3VyaXR5IHByaXYgLCB0aGlzIGNhbgotCSAqIHJlZmluZSB3aXRoIHJ0d19yZXNldF9zZWN1cml0eXByaXYyM2EKLQkgKi8KLQltZW1zZXQoKHVuc2lnbmVkIGNoYXIgKikmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBzZWN1cml0eV9wcml2KSk7Ci0JcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzYXV0aHR5cGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCXBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0KLQkvKiBmb3IgQUNMICovCi0Jc3Bpbl9sb2NrX2JoKCZwYWNsX25vZGVfcS0+bG9jayk7Ci0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBhY2xfbm9kZV9xKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFjbG5vZGUsIHB0bXAsIHBoZWFkLCBsaXN0KSB7Ci0JCWlmIChwYWNsbm9kZS0+dmFsaWQgPT0gdHJ1ZSkgewotCQkJcGFjbG5vZGUtPnZhbGlkID0gZmFsc2U7Ci0JCQlsaXN0X2RlbF9pbml0KCZwYWNsbm9kZS0+bGlzdCk7Ci0JCQlwYWNsX2xpc3QtPm51bS0tOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZwYWNsX25vZGVfcS0+bG9jayk7Ci0KLQlEQkdfODcyM0EoIiVzLCBmcmVlIGFjbF9ub2RlX3F1ZXVlLCBudW0gPSVkXG4iLAotCQkgIF9fZnVuY19fLCBwYWNsX2xpc3QtPm51bSk7Ci0KLQlydHdfc3RhX2ZsdXNoMjNhKHBhZGFwdGVyKTsKLQotCS8qIGZyZWVfYXNzb2Nfc3RhX3Jlc291cmNlcyAqLwotCXJ0d19mcmVlX2FsbF9zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQotCXBzdGEgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0Jc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JcnR3X2ZyZWVfc3RhaW5mbzIzYShwYWRhcHRlciwgcHN0YSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQotCXJ0d19pbml0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0KLQlydHcyM2FfZnJlZV9tbG1lX3ByaXZfaWVfZGF0YShwbWxtZXByaXYpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfY21kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNGUwZjAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19jbWQuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9SVFdfQ01EX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgotI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9jbWQuaD4KLSNpbmNsdWRlIDxydHdfc3Jlc2V0Lmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgY21kX2hkbCB3bGFuY21kc1tdID0gewotCUdFTl9EUlZfQ01EX0hBTkRMRVIoMCwgTlVMTCkgLyowKi8KLQlHRU5fRFJWX0NNRF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX0RSVl9DTURfSEFORExFUigwLCBOVUxMKQotCUdFTl9EUlZfQ01EX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fRFJWX0NNRF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX0RSVl9DTURfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkgLyoxMCovCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSwgam9pbl9jbWRfaGRsMjNhKSAvKjE0Ki8KLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IGRpc2Nvbm5lY3RfcGFybSksIGRpc2Nvbm5lY3RfaGRsMjNhKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCksIGNyZWF0ZWJzc19oZGwyM2EpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzZXRvcG1vZGVfcGFybSksIHNldG9wbW9kZV9oZGwyM2EpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzaXRlc3VydmV5X3Bhcm0pLCBzaXRlc3VydmV5X2NtZF9oZGwyM2EpIC8qMTgqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0YXV0aF9wYXJtKSwgc2V0YXV0aF9oZGwyM2EpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzZXRrZXlfcGFybSksIHNldGtleV9oZGwyM2EpIC8qMjAqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0X3N0YWtleV9wYXJtKSwgc2V0X3N0YWtleV9oZGwyM2EpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzZXRfYXNzb2NzdGFfcGFybSksIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBkZWxfYXNzb2NzdGFfcGFybSksIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzZXRzdGFwd3JzdGF0ZV9wYXJtKSwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHNldGJhc2ljcmF0ZV9wYXJtKSwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IGdldGJhc2ljcmF0ZV9wYXJtKSwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHNldGRhdGFyYXRlX3Bhcm0pLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3QgZ2V0ZGF0YXJhdGVfcGFybSksIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzZXRwaHlpbmZvX3Bhcm0pLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3QgZ2V0cGh5aW5mb19wYXJtKSwgTlVMTCkgIC8qMzAqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0cGh5X3Bhcm0pLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3QgZ2V0cGh5X3Bhcm0pLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkJLyo0MCovCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IGFkZEJhUmVxX3Bhcm0pLCBhZGRfYmFfaGRsMjNhKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0X2NoX3Bhcm0pLCBzZXRfY2hfaGRsMjNhKSAvKiA0NiAqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpIC8qNTAqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBUeF9CZWFjb25fcGFyYW0pLCB0eF9iZWFjb25faGRsMjNhKSAvKjU1Ki8KLQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIG1sbWVfZXZ0X2hkbDIzYSkgLyo1NiovCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgcnR3X2RydmV4dHJhX2NtZF9oZGwyM2EpIC8qNTcqLwotCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgaDJjX21zZ19oZGwyM2EpIC8qNTgqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3QgU2V0Q2hhbm5lbFBsYW5fcGFyYW0pLCBzZXRfY2hwbGFuX2hkbDIzYSkgLyo1OSovCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBMZWRCbGlua19wYXJhbSksIGxlZF9ibGlua19oZGwyM2EpIC8qNjAqLwotCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBTZXRDaGFubmVsU3dpdGNoX3BhcmFtKSwgc2V0X2NzYV9oZGwyM2EpIC8qNjEqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3QgVERMU29wdGlvbl9wYXJhbSksIHRkbHNfaGRsMjNhKSAvKjYyKi8KLX07Ci0KLXN0cnVjdCBfY21kX2NhbGxiYWNrCXJ0d19jbWRfY2FsbGJhY2tbXSA9IHsKLQl7R0VOX0NNRF9DT0RFKF9SZWFkX01BQ1JFRyksIE5VTEx9LCAvKjAqLwotCXtHRU5fQ01EX0NPREUoX1dyaXRlX01BQ1JFRyksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1JlYWRfQkJSRUcpLCAmcnR3X2dldGJicmZyZWdfY21kcnNwX2NhbGxiYWNrMjNhfSwKLQl7R0VOX0NNRF9DT0RFKF9Xcml0ZV9CQlJFRyksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1JlYWRfUkZSRUcpLCAmcnR3X2dldGJicmZyZWdfY21kcnNwX2NhbGxiYWNrMjNhfSwKLQl7R0VOX0NNRF9DT0RFKF9Xcml0ZV9SRlJFRyksIE5VTEx9LCAvKjUqLwotCXtHRU5fQ01EX0NPREUoX1JlYWRfRUVQUk9NKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfV3JpdGVfRUVQUk9NKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfUmVhZF9FRlVTRSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1dyaXRlX0VGVVNFKSwgTlVMTH0sCi0KLQl7R0VOX0NNRF9DT0RFKF9SZWFkX0NBTSksCU5VTEx9LAkvKjEwKi8KLQl7R0VOX0NNRF9DT0RFKF9Xcml0ZV9DQU0pLAkgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfc2V0QkNOSVRWKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfc2V0TUJJRENGRyksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX0pvaW5Cc3MpLCAmcnR3X2pvaW5ic3NfY21kMjNhX2NhbGxiYWNrfSwgIC8qMTQqLwotCXtHRU5fQ01EX0NPREUoX0Rpc0Nvbm5lY3QpLCAmcnR3X2Rpc2Fzc29jX2NtZDIzYV9jYWxsYmFja30sIC8qMTUqLwotCXtHRU5fQ01EX0NPREUoX0NyZWF0ZUJzcyksICZydHdfY3JlYXRlYnNzX2NtZDIzYV9jYWxsYmFja30sCi0Je0dFTl9DTURfQ09ERShfU2V0T3BNb2RlKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2l0ZVN1cnZleSksICZydHdfc3VydmV5X2NtZF9jYWxsYmFjazIzYX0sIC8qMTgqLwotCXtHRU5fQ01EX0NPREUoX1NldEF1dGgpLCBOVUxMfSwKLQotCXtHRU5fQ01EX0NPREUoX1NldEtleSksIE5VTEx9LAkvKjIwKi8KLQl7R0VOX0NNRF9DT0RFKF9TZXRTdGFLZXkpLCAmcnR3X3NldHN0YUtleV9jbWRyc3BfY2FsbGJhY2syM2F9LAotCXtHRU5fQ01EX0NPREUoX1NldEFzc29jU3RhKSwgJnJ0d19zZXRhc3NvY3N0YV9jbWRyc3BfY2FsbGJhY2syM2F9LAotCXtHRU5fQ01EX0NPREUoX0RlbEFzc29jU3RhKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0U3RhUHdyU3RhdGUpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRCYXNpY1JhdGUpLCBOVUxMfSwgLyoyNSovCi0Je0dFTl9DTURfQ09ERShfR2V0QmFzaWNSYXRlKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0RGF0YVJhdGUpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9HZXREYXRhUmF0ZSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1NldFBoeUluZm8pLCBOVUxMfSwKLQotCXtHRU5fQ01EX0NPREUoX0dldFBoeUluZm8pLCBOVUxMfSwgLyozMCovCi0Je0dFTl9DTURfQ09ERShfU2V0UGh5KSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfR2V0UGh5KSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfcmVhZFJzc2kpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9yZWFkR2FpbiksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1NldEF0aW0pLCBOVUxMfSwgLyozNSovCi0Je0dFTl9DTURfQ09ERShfU2V0UHdyTW9kZSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX0pvaW5ic3NScHQpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRSYVRhYmxlKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfR2V0UmFUYWJsZSksIE5VTEx9LAotCi0Je0dFTl9DTURfQ09ERShfR2V0Q0NYUmVwb3J0KSwgTlVMTH0sIC8qNDAqLwotCXtHRU5fQ01EX0NPREUoX0dldERUTVJlcG9ydCksCU5VTEx9LAotCXtHRU5fQ01EX0NPREUoX0dldFRYUmF0ZVN0YXRpc3RpY3MpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRVc2JTdXNwZW5kKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0SDJjTGJrKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfQWRkQkFSZXEpLCBOVUxMfSwgLyo0NSovCi0Je0dFTl9DTURfQ09ERShfU2V0Q2hhbm5lbCksIE5VTEx9LAkJLyo0NiovCi0Je0dFTl9DTURfQ09ERShfU2V0VHhQb3dlciksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1N3aXRjaEFudGVubmEpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRDcnlzdGFsQ2FwKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0U2luZ2xlQ2FycmllclR4KSwgTlVMTH0sCS8qNTAqLwotCi0Je0dFTl9DTURfQ09ERShfU2V0U2luZ2xlVG9uZVR4KSwgTlVMTH0sIC8qNTEqLwotCXtHRU5fQ01EX0NPREUoX1NldENhcnJpZXJTdXBwcmVzc2lvblR4KSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0Q29udGludW91c1R4KSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU3dpdGNoQmFuZHdpZHRoKSwgTlVMTH0sCQkvKjU0Ki8KLQl7R0VOX0NNRF9DT0RFKF9UWF9CZWFjb24pLCBOVUxMfSwvKjU1Ki8KLQotCXtHRU5fQ01EX0NPREUoX1NldF9NTE1FX0VWVCksIE5VTEx9LC8qNTYqLwotCXtHRU5fQ01EX0NPREUoX1NldF9EcnZfRXh0cmEpLCBOVUxMfSwvKjU3Ki8KLQl7R0VOX0NNRF9DT0RFKF9TZXRfSDJDX01TRyksIE5VTEx9LC8qNTgqLwotCXtHRU5fQ01EX0NPREUoX1NldENoYW5uZWxQbGFuKSwgTlVMTH0sLyo1OSovCi0Je0dFTl9DTURfQ09ERShfTGVkQmxpbmspLCBOVUxMfSwvKjYwKi8KLQotCXtHRU5fQ01EX0NPREUoX1NldENoYW5uZWxTd2l0Y2gpLCBOVUxMfSwvKjYxKi8KLQl7R0VOX0NNRF9DT0RFKF9URExTKSwgTlVMTH0sLyo2MiovCi19OwotCi0vKgotQ2FsbGVyIGFuZCB0aGUgcnR3X2NtZF90aHJlYWQyM2EgY2FuIHByb3RlY3QgY21kX3EgYnkgc3Bpbl9sb2NrLgotTm8gaXJxc2F2ZSBpcyBuZWNlc3NhcnkuCi0qLwotCi1pbnQgcnR3X2luaXRfY21kX3ByaXYyM2Eoc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdikKLXsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlwY21kcHJpdi0+Y21kX2lzc3VlZF9jbnQgPSAwOwotCXBjbWRwcml2LT5jbWRfZG9uZV9jbnQgPSAwOwotCXBjbWRwcml2LT5yc3BfY250ID0gMDsKLQotCXBjbWRwcml2LT53cSA9IGFsbG9jX3dvcmtxdWV1ZSgicnRsODcyM2F1X2NtZCIsIDAsIDEpOwotCWlmICghcGNtZHByaXYtPndxKQotCQlyZXMgPSBfRkFJTDsKLQotCXJldHVybiByZXM7Ci19Ci0KLS8qIGZvcndhcmQgZGVmaW5pdGlvbiAqLwotCi1zdGF0aWMgdm9pZCBydHdfaXJxX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLQotdTMyIHJ0d19pbml0X2V2dF9wcml2MjNhKHN0cnVjdCBldnRfcHJpdiAqcGV2dHByaXYpCi17Ci0JcGV2dHByaXYtPndxID0gYWxsb2Nfd29ya3F1ZXVlKCJydGw4NzIzYXVfZXZ0IiwgMCwgMSk7Ci0KLQlJTklUX1dPUksoJnBldnRwcml2LT5pcnFfd2ssIHJ0d19pcnFfd29yayk7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXZvaWQgcnR3X2ZyZWVfZXZ0X3ByaXYyM2Eoc3RydWN0IGV2dF9wcml2ICpwZXZ0cHJpdikKLXsKLQljYW5jZWxfd29ya19zeW5jKCZwZXZ0cHJpdi0+aXJxX3drKTsKLX0KLQotc3RhdGljIGludCBydHdfY21kX2ZpbHRlcihzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2LCBzdHJ1Y3QgY21kX29iaiAqY21kX29iaikKLXsKLQkvKiBzZXQgdG8gdHJ1ZSB0byBhbGxvdyBlbnF1ZXVpbmcgY21kIHdoZW4gaHdfaW5pdF9jb21wbGV0ZWQgaXMgZmFsc2UgKi8KLQl1OCBiQWxsb3cgPSBmYWxzZTsKLQotCWlmIChjbWRfb2JqLT5jbWRjb2RlID09IEdFTl9DTURfQ09ERShfU2V0Q2hhbm5lbFBsYW4pKQotCQliQWxsb3cgPSB0cnVlOwotCi0JaWYgKHBjbWRwcml2LT5wYWRhcHRlci0+aHdfaW5pdF9jb21wbGV0ZWQgPT0gZmFsc2UgJiYgYkFsbG93ID09IGZhbHNlKQotCQlyZXR1cm4gX0ZBSUw7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZCBydHdfY21kX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLQotaW50IHJ0d19lbnF1ZXVlX2NtZDIzYShzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2LCBzdHJ1Y3QgY21kX29iaiAqY21kX29iaikKLXsKLQlpbnQgcmVzID0gX0ZBSUw7Ci0KLQlpZiAoIWNtZF9vYmopCi0JCWdvdG8gZXhpdDsKLQotCWNtZF9vYmotPnBhZGFwdGVyID0gcGNtZHByaXYtPnBhZGFwdGVyOwotCi0JcmVzID0gcnR3X2NtZF9maWx0ZXIocGNtZHByaXYsIGNtZF9vYmopOwotCWlmIChyZXMgPT0gX0ZBSUwpIHsKLQkJcnR3X2ZyZWVfY21kX29iajIzYShjbWRfb2JqKTsKLQkJZ290byBleGl0OwotCX0KLQotCUlOSVRfV09SSygmY21kX29iai0+d29yaywgcnR3X2NtZF93b3JrKTsKLQotCXJlcyA9IHF1ZXVlX3dvcmsocGNtZHByaXYtPndxLCAmY21kX29iai0+d29yayk7Ci0KLQlpZiAoIXJlcykgewotCQluZXRkZXZfZXJyKHBjbWRwcml2LT5wYWRhcHRlci0+cG5ldGRldiwKLQkJCSAgICIlczogQ2FsbCB0byBxdWV1ZV93b3JrKCkgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJlcyA9IF9GQUlMOwotCX0gZWxzZQotCQlyZXMgPSBfU1VDQ0VTUzsKLWV4aXQ6Ci0KLQlyZXR1cm4gcmVzOwotfQotCi12b2lkIHJ0d19mcmVlX2NtZF9vYmoyM2Eoc3RydWN0IGNtZF9vYmogKnBjbWQpCi17Ci0KLQlpZiAocGNtZC0+Y21kY29kZSAhPSBfSm9pbkJzc19DTURfICYmCi0JICAgIHBjbWQtPmNtZGNvZGUgIT0gX0NyZWF0ZUJzc19DTURfKSB7Ci0JCS8qIGZyZWUgcGFybWJ1ZiBpbiBjbWRfb2JqICovCi0JCWtmcmVlKHBjbWQtPnBhcm1idWYpOwotCX0KLQotCWlmIChwY21kLT5yc3ApIHsKLQkJaWYgKHBjbWQtPnJzcHN6ICE9IDApIHsKLQkJCS8qIGZyZWUgcnNwIGluIGNtZF9vYmogKi8KLQkJCWtmcmVlKHBjbWQtPnJzcCk7Ci0JCX0KLQl9Ci0KLQlrZnJlZShwY21kKTsKLX0KLQotc3RhdGljIHZvaWQgcnR3X2NtZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlpbnQgKCpjbWRfaGRsKShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci0Jdm9pZCAoKnBjbWRfY2FsbGJhY2spKHN0cnVjdCBydHdfYWRhcHRlciAqZGV2LCBzdHJ1Y3QgY21kX29iaiAqcGNtZCk7Ci0Jc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdjsKLQlzdHJ1Y3QgY21kX29iaiAqcGNtZCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY21kX29iaiwgd29yayk7Ci0KLQlwY21kcHJpdiA9ICZwY21kLT5wYWRhcHRlci0+Y21kcHJpdjsKLQotCWlmIChydHdfY21kX2ZpbHRlcihwY21kcHJpdiwgcGNtZCkgPT0gX0ZBSUwpIHsKLQkJcGNtZC0+cmVzID0gSDJDX0RST1BQRUQ7Ci0JCWdvdG8gcG9zdF9wcm9jZXNzOwotCX0KLQotCXBjbWRwcml2LT5jbWRfaXNzdWVkX2NudCsrOwotCi0JcGNtZC0+Y21kc3ogPSBBTElHTihwY21kLT5jbWRzeiwgNCk7Ci0KLQlpZiAocGNtZC0+Y21kY29kZSA8IChzaXplb2Yod2xhbmNtZHMpL3NpemVvZihzdHJ1Y3QgY21kX2hkbCkpKSB7Ci0JCWNtZF9oZGwgPSB3bGFuY21kc1twY21kLT5jbWRjb2RlXS5oMmNmdW5zOwotCi0JCWlmIChjbWRfaGRsKQotCQkJcGNtZC0+cmVzID0gY21kX2hkbChwY21kLT5wYWRhcHRlciwgcGNtZC0+cGFybWJ1Zik7Ci0JCWVsc2UKLQkJCXBjbWQtPnJlcyA9IEgyQ19EUk9QUEVEOwotCX0gZWxzZQotCQlwY21kLT5yZXMgPSBIMkNfUEFSQU1FVEVSU19FUlJPUjsKLQotcG9zdF9wcm9jZXNzOgotCS8qIGNhbGwgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHBvc3QtcHJvY2Vzc2VkICovCi0JaWYgKHBjbWQtPmNtZGNvZGUgPCBBUlJBWV9TSVpFKHJ0d19jbWRfY2FsbGJhY2spKSB7Ci0JCXBjbWRfY2FsbGJhY2sgPQlydHdfY21kX2NhbGxiYWNrW3BjbWQtPmNtZGNvZGVdLmNhbGxiYWNrOwotCQlpZiAoIXBjbWRfY2FsbGJhY2spIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfaW5mb18sCi0JCQkJICJtbG1lX2NtZF9oZGwoKTogcGNtZF9jYWxsYmFjayA9IDB4JXAsIGNtZGNvZGUgPSAweCV4XG4iLAotCQkJCSBwY21kX2NhbGxiYWNrLCBwY21kLT5jbWRjb2RlKTsKLQkJCXJ0d19mcmVlX2NtZF9vYmoyM2EocGNtZCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBuZWVkIGNvbnNpZGVyIHRoYXQgZnJlZSBjbWRfb2JqIGluCi0JCQkgICBydHdfY21kX2NhbGxiYWNrICovCi0JCQlwY21kX2NhbGxiYWNrKHBjbWQtPnBhZGFwdGVyLCBwY21kKTsKLQkJfQotCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6IGNtZGNvZGUgPSAweCV4IGNhbGxiYWNrIG5vdCBkZWZpbmVkIVxuIiwKLQkJCSBfX2Z1bmNfXywgcGNtZC0+Y21kY29kZSk7Ci0JCXJ0d19mcmVlX2NtZF9vYmoyM2EocGNtZCk7Ci0JfQotfQotCi0KLWludCBydHdfc2l0ZXN1cnZleV9jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgc3RydWN0IGNmZzgwMjExX3NzaWQgKnNzaWQsIGludCBzc2lkX251bSwKLQkJCSAgc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCAqY2gsIGludCBjaF9udW0pCi17Ci0JaW50IHJlcyA9IF9GQUlMOwotCXN0cnVjdCBjbWRfb2JqICpwaDJjOwotCXN0cnVjdCBzaXRlc3VydmV5X3Bhcm0gKnBzdXJ2ZXlQYXJhOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpCi0JCXJ0d19scHNfY3RybF93a19jbWQyM2EocGFkYXB0ZXIsIExQU19DVFJMX1NDQU4sIDEpOwotCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwaDJjKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlwc3VydmV5UGFyYSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzaXRlc3VydmV5X3Bhcm0pLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBzdXJ2ZXlQYXJhKSB7Ci0JCWtmcmVlKHBoMmMpOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JcnR3X2ZyZWVfbmV0d29ya19xdWV1ZTIzYShwYWRhcHRlcik7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOiBmbHVzaCBuZXR3b3JrIHF1ZXVlXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwc3VydmV5UGFyYSwKLQkJCQkgICBHRU5fQ01EX0NPREUoX1NpdGVTdXJ2ZXkpKTsKLQotCS8qIHBzdXJ2ZXlQYXJhLT5ic3NsaW1pdCA9IDQ4OyAqLwotCXBzdXJ2ZXlQYXJhLT5zY2FuX21vZGUgPSBwbWxtZXByaXYtPnNjYW5fbW9kZTsKLQotCS8qIHByZXBhcmUgc3NpZCBsaXN0ICovCi0JaWYgKHNzaWQpIHsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHNzaWRfbnVtICYmIGkgPCBSVFdfU1NJRF9TQ0FOX0FNT1VOVDsgaSsrKSB7Ci0JCQlpZiAoc3NpZFtpXS5zc2lkX2xlbikgewotCQkJCW1lbWNweSgmcHN1cnZleVBhcmEtPnNzaWRbaV0sICZzc2lkW2ldLAotCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNmZzgwMjExX3NzaWQpKTsKLQkJCQlwc3VydmV5UGFyYS0+c3NpZF9udW0rKzsKLQkJCX0KLQkJfQotCX0KLQotCS8qIHByZXBhcmUgY2hhbm5lbCBsaXN0ICovCi0JaWYgKGNoKSB7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBjaF9udW0gJiYgaSA8IFJUV19DSEFOTkVMX1NDQU5fQU1PVU5UOyBpKyspIHsKLQkJCWlmIChjaFtpXS5od192YWx1ZSAmJgotCQkJICAgICEoY2hbaV0uZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCkpIHsKLQkJCQltZW1jcHkoJnBzdXJ2ZXlQYXJhLT5jaFtpXSwgJmNoW2ldLAotCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCkpOwotCQkJCXBzdXJ2ZXlQYXJhLT5jaF9udW0rKzsKLQkJCX0KLQkJfQotCX0KLQotCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSk7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBoMmMpOwotCi0JaWYgKHJlcyA9PSBfU1VDQ0VTUykgewotCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lciwgamlmZmllcyArCi0JCQkgIG1zZWNzX3RvX2ppZmZpZXMoU0NBTk5JTkdfVElNRU9VVCkpOwotCi0JCXBtbG1lcHJpdi0+c2Nhbl9pbnRlcnZhbCA9IFNDQU5fSU5URVJWQUw7LyogIDMwKjIgc2VjID0gNjBzZWMgKi8KLQl9IGVsc2UKLQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotdm9pZCBydHdfZ2V0YmJyZnJlZ19jbWRyc3BfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgICAgc3RydWN0IGNtZF9vYmogKnBjbWQpCi17Ci0Ja2ZyZWUocGNtZC0+cGFybWJ1Zik7Ci0Ja2ZyZWUocGNtZCk7Ci19Ci0KLWludCBydHdfY3JlYXRlYnNzX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgY21kX29iaiAqcGNtZDsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKnBkZXZfbmV0d29yazsKLQl1OCByZXMgPSBfU1VDQ0VTUzsKLQotCXBkZXZfbmV0d29yayA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2LmRldl9uZXR3b3JrOwotCi0JaWYgKHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkX2xlbiA9PSAwKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfaW5mb18sCi0JCQkgImNyZWF0ZWJzcyBmb3IgQW55IFNTaWQ6JXNcbiIsCi0JCQkgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQpOwotCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfaW5mb18sCi0JCQkgImNyZWF0ZWJzcyBmb3IgU1NpZDolc1xuIiwKLQkJCSBwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZCk7Ci0JfQotCi0JcGNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwY21kKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGNtZC0+Y21kY29kZSA9IF9DcmVhdGVCc3NfQ01EXzsKLQlwY21kLT5wYXJtYnVmID0gKHVuc2lnbmVkIGNoYXIgKilwZGV2X25ldHdvcms7Ci0JcGNtZC0+Y21kc3ogPSBnZXRfd2xhbl9ic3NpZF9leF9zeihwZGV2X25ldHdvcmspOwotCXBjbWQtPnJzcCA9IE5VTEw7Ci0JcGNtZC0+cnNwc3ogPSAwOwotCi0JcGRldl9uZXR3b3JrLT5MZW5ndGggPSBwY21kLT5jbWRzejsKLQotCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGNtZCk7Ci0KLWV4aXQ6Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1pbnQgcnR3X2pvaW5ic3NfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICAgICBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaykKLXsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKnBzZWNuZXR3b3JrOwotCXN0cnVjdCBjbWRfb2JqICpwY21kOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0Jc3RydWN0IGh0X3ByaXYgKnBodHByaXYgPSAmcG1sbWVwcml2LT5odHByaXY7Ci0JZW51bSBubDgwMjExX2lmdHlwZSBpZm1vZGU7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWlmbW9kZSA9IHBuZXR3b3JrLT5uZXR3b3JrLmlmbW9kZTsKLQotCWlmIChwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZF9sZW4gPT0gMCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLAotCQkJICIrSm9pbiBjbWQ6IEFueSBTU2lkXG4iKTsKLQl9IGVsc2UgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X25vdGljZV8sCi0JCQkgIitKb2luIGNtZDogU1NpZCA9WyVzXVxuIiwKLQkJCSBwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZCk7Ci0JfQotCi0JcGNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwY21kKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkgInJ0d19qb2luYnNzX2NtZDIzYTogbWVtb3J5IGFsbG9jYXRlIGZvciBjbWRfb2JqIGZhaWwhISFcbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogZm9yIGhpZGRlbiBhcCB0byBzZXQgZndfc3RhdGUgaGVyZSAqLwotCWlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURXxXSUZJX0FESE9DX1NUQVRFKSkgewotCQlzd2l0Y2ggKGlmbW9kZSkgewotCQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgotCQkJc2V0X2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKTsKLQkJCWJyZWFrOwotCQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6Ci0JCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwc2VjbmV0d29yayA9ICZwc2VjdXJpdHlwcml2LT5zZWNfYnNzOwotCWlmICghcHNlY25ldHdvcmspIHsKLQkJa2ZyZWUocGNtZCk7Ci0JCXJlcyA9IF9GQUlMOwotCi0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAicnR3X2pvaW5ic3NfY21kMjNhIDpwc2VjbmV0d29yayA9PSBOVUxMISEhXG4iKTsKLQotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JbWVtc2V0KHBzZWNuZXR3b3JrLCAwLCBzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpKTsKLQotCW1lbWNweShwc2VjbmV0d29yaywgJnBuZXR3b3JrLT5uZXR3b3JrLAotCSAgICAgICBnZXRfd2xhbl9ic3NpZF9leF9zeigmcG5ldHdvcmstPm5ldHdvcmspKTsKLQotCXBzZWNuZXR3b3JrLT5JRUxlbmd0aCA9IDA7Ci0JLyogIEFkZGVkIGJ5IEFsYmVydCAyMDA5LzAyLzE4ICovCi0JLyogIElmIHRoZSB0aGUgZHJpdmVyIHdhbnRzIHRvIHVzZSB0aGUgYnNzaWQgdG8gY3JlYXRlIHRoZQotCSAqICBjb25uZWN0aW9uLiBJZiBub3QsICB3ZSBoYXZlIHRvIGNvcHkgdGhlIGNvbm5lY3RpbmcgQVAncwotCSAqICBNQUMgYWRkcmVzcyB0byBpdCBzbyB0aGF0IHRoZSBkcml2ZXIganVzdCBoYXMgdGhlIGJzc2lkCi0JICogIGluZm9ybWF0aW9uIGZvciBQTUtJRExpc3Qgc2VhcmNoaW5nLiAqLwotCi0JaWYgKHBtbG1lcHJpdi0+YXNzb2NfYnlfYnNzaWQgPT0gZmFsc2UpCi0JCWV0aGVyX2FkZHJfY29weSgmcG1sbWVwcml2LT5hc3NvY19ic3NpZFswXSwKLQkJCQkmcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzc1swXSk7Ci0KLQlwc2VjbmV0d29yay0+SUVMZW5ndGggPQotCQlydHdfcmVzdHJ1Y3Rfc2VjX2llMjNhKHBhZGFwdGVyLCAmcG5ldHdvcmstPm5ldHdvcmsuSUVzWzBdLAotCQkJCSAgICAgICAmcHNlY25ldHdvcmstPklFc1swXSwKLQkJCQkgICAgICAgcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGgpOwotCi0JcG1sbWVwcml2LT5xb3Nfb3B0aW9uID0gMDsKLQotCWlmIChwcmVnaXN0cnlwcml2LT53bW1fZW5hYmxlKSB7Ci0JCXUzMiB0bXBfbGVuOwotCi0JCXRtcF9sZW4gPSBydHdfcmVzdHJ1Y3Rfd21tX2llMjNhKHBhZGFwdGVyLAotCQkJCQkJICZwbmV0d29yay0+bmV0d29yay5JRXNbMF0sCi0JCQkJCQkgJnBzZWNuZXR3b3JrLT5JRXNbMF0sCi0JCQkJCQkgcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGgsCi0JCQkJCQkgcHNlY25ldHdvcmstPklFTGVuZ3RoKTsKLQotCQlpZiAocHNlY25ldHdvcmstPklFTGVuZ3RoICE9IHRtcF9sZW4pIHsKLQkJCXBzZWNuZXR3b3JrLT5JRUxlbmd0aCA9IHRtcF9sZW47Ci0JCQkvKiBUaGVyZSBpcyBXTU0gSUUgaW4gdGhpcyBjb3JyZXNwLiBiZWFjb24gKi8KLQkJCXBtbG1lcHJpdi0+cW9zX29wdGlvbiA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBUaGVyZSBpcyBubyBXTU0gSUUgaW4gdGhpcyBjb3JyZXNwLiBiZWFjb24gKi8KLQkJCXBtbG1lcHJpdi0+cW9zX29wdGlvbiA9IDA7Ci0JCX0KLQl9Ci0KLQlwaHRwcml2LT5odF9vcHRpb24gPSBmYWxzZTsKLQlpZiAocHJlZ2lzdHJ5cHJpdi0+aHRfZW5hYmxlKSB7Ci0JCXUzMiBhbGdvID0gcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtOwotCQkvKglBZGRlZCBieSBBbGJlcnQgMjAxMC8wNi8yMyAqLwotCQkvKglGb3IgdGhlIFdFUCBtb2RlLCB3ZSB3aWxsIHVzZSB0aGUgYmcgbW9kZSB0byBkbwotCQkJdGhlIGNvbm5lY3Rpb24gdG8gYXZvaWQgc29tZSBJT1QgaXNzdWUuICovCi0JCS8qCUVzcGVjaWFsbHkgZm9yIFJlYWx0ZWsgODE5MnUgU29mdEFQLiAqLwotCQlpZiAoYWxnbyAhPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCAmJgotCQkgICAgYWxnbyAhPSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQgJiYKLQkJICAgIGFsZ28gIT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkgewotCQkJLyogcnR3X3Jlc3RydWN0dXJlX2h0X2llMjNhICovCi0JCQlydHdfcmVzdHJ1Y3R1cmVfaHRfaWUyM2EocGFkYXB0ZXIsCi0JCQkJCQkgJnBuZXR3b3JrLT5uZXR3b3JrLklFc1swXSwKLQkJCQkJCSAmcHNlY25ldHdvcmstPklFc1swXSwKLQkJCQkJCSBwbmV0d29yay0+bmV0d29yay5JRUxlbmd0aCwKLQkJCQkJCSAmcHNlY25ldHdvcmstPklFTGVuZ3RoKTsKLQkJfQotCX0KLQotCXBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID0KLQkJY2hlY2tfYXNzb2NfQVAyM2EocG5ldHdvcmstPm5ldHdvcmsuSUVzLAotCQkJCSAgcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGgpOwotCi0JaWYgKHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID09IEhUX0lPVF9QRUVSX1RFTkRBKQotCQlwYWRhcHRlci0+cHdyY3RybHByaXYuc21hcnRfcHMgPSAwOwotCWVsc2UKLQkJcGFkYXB0ZXItPnB3cmN0cmxwcml2LnNtYXJ0X3BzID0KLQkJCXBhZGFwdGVyLT5yZWdpc3RyeXByaXYuc21hcnRfcHM7Ci0KLQlEQkdfODcyM0EoIiVzOiBzbWFydF9wcyA9JWRcbiIsIF9fZnVuY19fLAotCQkgIHBhZGFwdGVyLT5wd3JjdHJscHJpdi5zbWFydF9wcyk7Ci0KLQkvKiBnZXQgY21kc3ogYmVmb3JlIGVuZGlhbiBjb252ZXJzaW9uICovCi0JcGNtZC0+Y21kc3ogPSBnZXRfd2xhbl9ic3NpZF9leF9zeihwc2VjbmV0d29yayk7Ci0KLQlwY21kLT5jbWRjb2RlID0gX0pvaW5Cc3NfQ01EXzsvKiBHRU5fQ01EX0NPREUoX0pvaW5Cc3MpICovCi0JcGNtZC0+cGFybWJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopcHNlY25ldHdvcms7Ci0JcGNtZC0+cnNwID0gTlVMTDsKLQlwY21kLT5yc3BzeiA9IDA7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBjbWQpOwotZXhpdDoKLQotCXJldHVybiByZXM7Ci19Ci0KLWludCBydHdfZGlzYXNzb2NfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBkZWF1dGhfdGltZW91dF9tcywKLQkJCWJvb2wgZW5xdWV1ZSkKLXsKLQlzdHJ1Y3QgY21kX29iaiAqY21kb2JqID0gTlVMTDsKLQlzdHJ1Y3QgZGlzY29ubmVjdF9wYXJtICpwYXJhbSA9IE5VTEw7Ci0Jc3RydWN0IGNtZF9wcml2ICpjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfbm90aWNlXywKLQkJICIrcnR3X2Rpc2Fzc29jX2NtZDIzYVxuIik7Ci0KLQkvKiBwcmVwYXJlIGNtZCBwYXJhbWV0ZXIgKi8KLQlwYXJhbSA9IGt6YWxsb2Moc2l6ZW9mKCpwYXJhbSksIEdGUF9BVE9NSUMpOwotCWlmIChwYXJhbSA9PSBOVUxMKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCXBhcmFtLT5kZWF1dGhfdGltZW91dF9tcyA9IGRlYXV0aF90aW1lb3V0X21zOwotCi0JaWYgKGVucXVldWUpIHsKLQkJLyogbmVlZCBlbnF1ZXVlLCBwcmVwYXJlIGNtZF9vYmogYW5kIGVucXVldWUgKi8KLQkJY21kb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRvYmopIHsKLQkJCXJlcyA9IF9GQUlMOwotCQkJa2ZyZWUocGFyYW0pOwotCQkJZ290byBleGl0OwotCQl9Ci0JCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKGNtZG9iaiwgcGFyYW0sIF9EaXNDb25uZWN0X0NNRF8pOwotCQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EoY21kcHJpdiwgY21kb2JqKTsKLQl9IGVsc2UgewotCQkvKiBubyBuZWVkIHRvIGVucXVldWUsIGRvIHRoZSBjbWQgaGRsIGRpcmVjdGx5IGFuZAotCQkgICBmcmVlIGNtZCBwYXJhbWV0ZXIgKi8KLQkJaWYgKGRpc2Nvbm5lY3RfaGRsMjNhKHBhZGFwdGVyLCAodTggKilwYXJhbSkgIT0gSDJDX1NVQ0NFU1MpCi0JCQlyZXMgPSBfRkFJTDsKLQkJa2ZyZWUocGFyYW0pOwotCX0KLQotZXhpdDoKLQlyZXR1cm4gcmVzOwotfQotCi1pbnQgcnR3X3NldG9wbW9kZV9jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSBlbnVtIG5sODAyMTFfaWZ0eXBlIGlmbW9kZSkKLXsKLQlzdHJ1Y3QJY21kX29iaiAqcGgyYzsKLQlzdHJ1Y3QJc2V0b3Btb2RlX3Bhcm0gKnBzZXRvcDsKLQlzdHJ1Y3QJY21kX3ByaXYgICAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwaDJjKSB7Ci0JCXJlcyA9IGZhbHNlOwotCQlnb3RvIGV4aXQ7Ci0JfQotCXBzZXRvcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXRvcG1vZGVfcGFybSksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFwc2V0b3ApIHsKLQkJa2ZyZWUocGgyYyk7Ci0JCXJlcyA9IGZhbHNlOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHNldG9wLCBfU2V0T3BNb2RlX0NNRF8pOwotCXBzZXRvcC0+bW9kZSA9IGlmbW9kZTsKLQotCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGgyYyk7Ci1leGl0OgotCXJldHVybiByZXM7Ci19Ci0KLWludCBydHdfc2V0c3Rha2V5X2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcHN0YSwgdTggdW5pY2FzdF9rZXkpCi17Ci0Jc3RydWN0IGNtZF9vYmogKnBoMmM7Ci0Jc3RydWN0IHNldF9zdGFrZXlfcGFybSAqcHNldHN0YWtleV9wYXJhOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0Jc3RydWN0IHNldF9zdGFrZXlfcnNwICpwc2V0c3Rha2V5X3JzcCA9IE5VTEw7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gKHN0cnVjdCBzdGFfaW5mbyAqKXBzdGE7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwaDJjKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcHNldHN0YWtleV9wYXJhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNldF9zdGFrZXlfcGFybSksIEdGUF9LRVJORUwpOwotCWlmICghcHNldHN0YWtleV9wYXJhKSB7Ci0JCWtmcmVlKHBoMmMpOwotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBzZXRzdGFrZXlfcnNwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNldF9zdGFrZXlfcnNwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwc2V0c3Rha2V5X3JzcCkgewotCQlrZnJlZShwaDJjKTsKLQkJa2ZyZWUocHNldHN0YWtleV9wYXJhKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwc2V0c3Rha2V5X3BhcmEsIF9TZXRTdGFLZXlfQ01EXyk7Ci0JcGgyYy0+cnNwID0gKHU4ICopIHBzZXRzdGFrZXlfcnNwOwotCXBoMmMtPnJzcHN6ID0gc2l6ZW9mKHN0cnVjdCBzZXRfc3Rha2V5X3JzcCk7Ci0KLQlldGhlcl9hZGRyX2NvcHkocHNldHN0YWtleV9wYXJhLT5hZGRyLCBzdGEtPmh3YWRkcik7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpIHsKLQkJcHNldHN0YWtleV9wYXJhLT5hbGdvcml0aG0gPQotCQkJKHVuc2lnbmVkIGNoYXIpcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobTsKLQl9IGVsc2UgewotCQlHRVRfRU5DUllfQUxHTyhwc2VjdXJpdHlwcml2LCBzdGEsIHBzZXRzdGFrZXlfcGFyYS0+YWxnb3JpdGhtLAotCQkJICAgICAgIGZhbHNlKTsKLQl9Ci0KLQlpZiAodW5pY2FzdF9rZXkgPT0gdHJ1ZSkgewotCQltZW1jcHkoJnBzZXRzdGFrZXlfcGFyYS0+a2V5LCAmc3RhLT5kb3QxMTgwMjF4X1VuY3N0S2V5LCAxNik7Ci0JfSBlbHNlIHsKLQkJaW50IGlkeCA9IHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZDsKLQotCQltZW1jcHkoJnBzZXRzdGFrZXlfcGFyYS0+a2V5LAotCQkgICAgICAgJnBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlbaWR4XS5za2V5LCAxNik7Ci0JfQotCi0JLyogamVmZjogc2V0IHRoaXMgYmVjYXVzZSBhdCBsZWFzdCBzdyBrZXkgaXMgcmVhZHkgKi8KLQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ1c2V0a2lwa2V5ID0gMTsKLQotCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGgyYyk7Ci0KLWV4aXQ6Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1pbnQgcnR3X2NsZWFyc3Rha2V5X2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcHN0YSwgdTggZW50cnksCi0JCQkgICB1OCBlbnF1ZXVlKQotewotCXN0cnVjdCBjbWRfb2JqICpwaDJjOwotCXN0cnVjdCBzZXRfc3Rha2V5X3Bhcm0gKnBzZXRzdGFrZXlfcGFyYTsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCXN0cnVjdCBzZXRfc3Rha2V5X3JzcCAqcHNldHN0YWtleV9yc3AgPSBOVUxMOwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gKHN0cnVjdCBzdGFfaW5mbyAqKXBzdGE7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JaWYgKCFlbnF1ZXVlKSB7Ci0JCWNsZWFyX2NhbV9lbnRyeTIzYShwYWRhcHRlciwgZW50cnkpOwotCX0gZWxzZSB7Ci0JCXBoMmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9LRVJORUwpOwotCQlpZiAoIXBoMmMpIHsKLQkJCXJlcyA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJcHNldHN0YWtleV9wYXJhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNldF9zdGFrZXlfcGFybSksCi0JCQkJCSAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcHNldHN0YWtleV9wYXJhKSB7Ci0JCQlrZnJlZShwaDJjKTsKLQkJCXJlcyA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJcHNldHN0YWtleV9yc3AgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2V0X3N0YWtleV9yc3ApLAotCQkJCQkgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcHNldHN0YWtleV9yc3ApIHsKLQkJCWtmcmVlKHBoMmMpOwotCQkJa2ZyZWUocHNldHN0YWtleV9wYXJhKTsKLQkJCXJlcyA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHNldHN0YWtleV9wYXJhLAotCQkJCQkgICBfU2V0U3RhS2V5X0NNRF8pOwotCQlwaDJjLT5yc3AgPSAodTggKikgcHNldHN0YWtleV9yc3A7Ci0JCXBoMmMtPnJzcHN6ID0gc2l6ZW9mKHN0cnVjdCBzZXRfc3Rha2V5X3JzcCk7Ci0KLQkJZXRoZXJfYWRkcl9jb3B5KHBzZXRzdGFrZXlfcGFyYS0+YWRkciwgc3RhLT5od2FkZHIpOwotCi0JCXBzZXRzdGFrZXlfcGFyYS0+YWxnb3JpdGhtID0gMDsKLQotCQlwc2V0c3Rha2V5X3BhcmEtPmlkID0gZW50cnk7Ci0KLQkJcmVzID0gcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwaDJjKTsKLQl9Ci1leGl0OgotCXJldHVybiByZXM7Ci19Ci0KLWludCBydHdfYWRkYmFyZXFfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHRpZCwgdTggKmFkZHIpCi17Ci0Jc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKLQlzdHJ1Y3QgY21kX29iaiAqcGgyYzsKLQlzdHJ1Y3QgYWRkQmFSZXFfcGFybSAqcGFkZGJhcmVxX3Bhcm07Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JaWYgKHRpZCA+PSBNQVhUSUQpIHsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwaDJjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBoMmMpIHsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwYWRkYmFyZXFfcGFybSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZGRCYVJlcV9wYXJtKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwYWRkYmFyZXFfcGFybSkgewotCQlrZnJlZShwaDJjKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwYWRkYmFyZXFfcGFybS0+dGlkID0gdGlkOwotCWV0aGVyX2FkZHJfY29weShwYWRkYmFyZXFfcGFybS0+YWRkciwgYWRkcik7Ci0KLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwYWRkYmFyZXFfcGFybSwKLQkJCQkgICBHRU5fQ01EX0NPREUoX0FkZEJBUmVxKSk7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBoMmMpOwotZXhpdDoKLQlyZXR1cm4gcmVzOwotfQotCi1pbnQgcnR3X2R5bmFtaWNfY2hrX3drX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBjbWRfb2JqICpwaDJjOwotCXN0cnVjdCBkcnZleHRyYV9jbWRfcGFybSAqcGRydmV4dHJhX2NtZF9wYXJtOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwaDJjKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGRydmV4dHJhX2NtZF9wYXJtID0ga3phbGxvYyhzaXplb2YoKnBkcnZleHRyYV9jbWRfcGFybSksIEdGUF9BVE9NSUMpOwotCWlmICghcGRydmV4dHJhX2NtZF9wYXJtKSB7Ci0JCWtmcmVlKHBoMmMpOwotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBkcnZleHRyYV9jbWRfcGFybS0+ZWNfaWQgPSBEWU5BTUlDX0NIS19XS19DSUQ7Ci0JcGRydmV4dHJhX2NtZF9wYXJtLT50eXBlX3NpemUgPSAwOwotCXBkcnZleHRyYV9jbWRfcGFybS0+cGJ1ZiA9ICh1OCAqKXBhZGFwdGVyOwotCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcGRydmV4dHJhX2NtZF9wYXJtLAotCQkJCSAgIEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpOwotCi0JcmVzID0gcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwaDJjKTsKLWV4aXQ6Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgdm9pZCB0cmFmZmljX3N0YXR1c193YXRjaGRvZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IGJFbnRlclBTOwotCXU4IGJCdXN5VHJhZmZpYyA9IGZhbHNlLCBiVHhCdXN5VHJhZmZpYyA9IGZhbHNlLCBiUnhCdXN5VHJhZmZpYyA9IGZhbHNlOwotCXU4IGJIaWdoZXJCdXN5VHJhZmZpYyA9IGZhbHNlLCBiSGlnaGVyQnVzeVJ4VHJhZmZpYyA9IGZhbHNlOwotCXU4IGJIaWdoZXJCdXN5VHhUcmFmZmljID0gZmFsc2U7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlpbnQgQnVzeVRocmVzaG9sZCA9IDEwMDsKLQlzdHJ1Y3QgcnRfbGlua19kZXRlY3QgKmxkaSA9ICZwbWxtZXByaXYtPkxpbmtEZXRlY3RJbmZvOwotCi0JLyogICovCi0JLyogIERldGVybWluZSBpZiBvdXIgdHJhZmZpYyBpcyBidXN5IG5vdyAqLwotCS8qICAqLwotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJaWYgKHJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKQotCQkJQnVzeVRocmVzaG9sZCA9IDUwOwotCQllbHNlIGlmIChsZGktPmJCdXN5VHJhZmZpYykKLQkJCUJ1c3lUaHJlc2hvbGQgPSA3NTsKLQkJLyogIGlmIHdlIHJhaXNlIGJCdXN5VHJhZmZpYyBpbiBsYXN0IHdhdGNoZG9nLCB1c2luZwotCQkgICAgbG93ZXIgdGhyZXNob2xkLiAqLwotCQlpZiAobGRpLT5OdW1SeE9rSW5QZXJpb2QgPiBCdXN5VGhyZXNob2xkIHx8Ci0JCSAgICBsZGktPk51bVR4T2tJblBlcmlvZCA+IEJ1c3lUaHJlc2hvbGQpIHsKLQkJCWJCdXN5VHJhZmZpYyA9IHRydWU7Ci0KLQkJCWlmIChsZGktPk51bVJ4T2tJblBlcmlvZCA+IGxkaS0+TnVtVHhPa0luUGVyaW9kKQotCQkJCWJSeEJ1c3lUcmFmZmljID0gdHJ1ZTsKLQkJCWVsc2UKLQkJCQliVHhCdXN5VHJhZmZpYyA9IHRydWU7Ci0JCX0KLQotCQkvKiAgSGlnaGVyIFR4L1J4IGRhdGEuICovCi0JCWlmIChsZGktPk51bVJ4T2tJblBlcmlvZCA+IDQwMDAgfHwKLQkJICAgIGxkaS0+TnVtVHhPa0luUGVyaW9kID4gNDAwMCkgewotCQkJYkhpZ2hlckJ1c3lUcmFmZmljID0gdHJ1ZTsKLQotCQkJaWYgKGxkaS0+TnVtUnhPa0luUGVyaW9kID4gbGRpLT5OdW1UeE9rSW5QZXJpb2QpCi0JCQkJYkhpZ2hlckJ1c3lSeFRyYWZmaWMgPSB0cnVlOwotCQkJZWxzZQotCQkJCWJIaWdoZXJCdXN5VHhUcmFmZmljID0gdHJ1ZTsKLQkJfQotCi0JCWlmICghcnRsODcyM2FfQlRfY29leGlzdChwYWRhcHRlcikgfHwKLQkJICAgICFydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpKSB7Ci0JCS8qICBjaGVjayB0cmFmZmljIGZvciAgcG93ZXJzYXZpbmcuICovCi0JCQlpZiAoKChsZGktPk51bVJ4VW5pY2FzdE9rSW5QZXJpb2QgKwotCQkJICAgICAgbGRpLT5OdW1UeE9rSW5QZXJpb2QpID4gOCkgfHwKLQkJCSAgICBsZGktPk51bVJ4VW5pY2FzdE9rSW5QZXJpb2QgPiAyKQotCQkJCWJFbnRlclBTID0gZmFsc2U7Ci0JCQllbHNlCi0JCQkJYkVudGVyUFMgPSB0cnVlOwotCi0JCQkvKiAgTGVpc3VyZVBTIG9ubHkgd29yayBpbiBpbmZyYSBtb2RlLiAqLwotCQkJaWYgKGJFbnRlclBTKQotCQkJCUxQU19FbnRlcjIzYShwYWRhcHRlcik7Ci0JCQllbHNlCi0JCQkJTFBTX0xlYXZlMjNhKHBhZGFwdGVyKTsKLQkJfQotCX0gZWxzZQotCQlMUFNfTGVhdmUyM2EocGFkYXB0ZXIpOwotCi0JbGRpLT5OdW1SeE9rSW5QZXJpb2QgPSAwOwotCWxkaS0+TnVtVHhPa0luUGVyaW9kID0gMDsKLQlsZGktPk51bVJ4VW5pY2FzdE9rSW5QZXJpb2QgPSAwOwotCWxkaS0+YkJ1c3lUcmFmZmljID0gYkJ1c3lUcmFmZmljOwotCWxkaS0+YlR4QnVzeVRyYWZmaWMgPSBiVHhCdXN5VHJhZmZpYzsKLQlsZGktPmJSeEJ1c3lUcmFmZmljID0gYlJ4QnVzeVRyYWZmaWM7Ci0JbGRpLT5iSGlnaGVyQnVzeVRyYWZmaWMgPSBiSGlnaGVyQnVzeVRyYWZmaWM7Ci0JbGRpLT5iSGlnaGVyQnVzeVJ4VHJhZmZpYyA9IGJIaWdoZXJCdXN5UnhUcmFmZmljOwotCWxkaS0+YkhpZ2hlckJ1c3lUeFRyYWZmaWMgPSBiSGlnaGVyQnVzeVR4VHJhZmZpYzsKLX0KLQotc3RhdGljIHZvaWQgZHluYW1pY19jaGtfd2tfaGRsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwYnVmLCBpbnQgc3opCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2OwotCi0JcGFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopcGJ1ZjsKLQlwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkKLQkJZXhwaXJlX3RpbWVvdXRfY2hrMjNhKHBhZGFwdGVyKTsKLSNlbmRpZgotCi0JcnRsODcyM2Ffc3Jlc2V0X3htaXRfc3RhdHVzX2NoZWNrKHBhZGFwdGVyKTsKLQotCWxpbmtlZF9zdGF0dXNfY2hrMjNhKHBhZGFwdGVyKTsKLQl0cmFmZmljX3N0YXR1c193YXRjaGRvZyhwYWRhcHRlcik7Ci0KLQlydGw4NzIzYV9IYWxEbVdhdGNoRG9nKHBhZGFwdGVyKTsKLQotCS8qICAqLwotCS8qICBCVC1Db2V4aXN0ICovCi0JLyogICovCi0JcnRsODcyM2FfQlRfZG9fY29leGlzdChwYWRhcHRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGxwc19jdHJsX3drX2hkbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBscHNfY3RybF90eXBlKQotewotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cnByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0JdTggbXN0YXR1czsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpIHx8Ci0JICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChscHNfY3RybF90eXBlKSB7Ci0JY2FzZSBMUFNfQ1RSTF9TQ0FOOgotCQlydGw4NzIzYV9CVF93aWZpc2Nhbl9ub3RpZnkocGFkYXB0ZXIsIHRydWUpOwotCQlpZiAoIXJ0bDg3MjNhX0JUX3VzaW5nX2FudGVubmFfMShwYWRhcHRlcikpIHsKLQkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpCi0JCQkJTFBTX0xlYXZlMjNhKHBhZGFwdGVyKTsKLQkJCX0KLQkJYnJlYWs7Ci0JY2FzZSBMUFNfQ1RSTF9KT0lOQlNTOgotCQlMUFNfTGVhdmUyM2EocGFkYXB0ZXIpOwotCQlicmVhazsKLQljYXNlIExQU19DVFJMX0NPTk5FQ1Q6Ci0JCW1zdGF0dXMgPSAxOy8qIGNvbm5lY3QgKi8KLQkJLyogIFJlc2V0IExQUyBTZXR0aW5nICovCi0JCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5McHNJZGxlQ291bnQgPSAwOwotCQlydGw4NzIzYV9zZXRfRndKb2luQnNzUmVwb3J0X2NtZChwYWRhcHRlciwgMSk7Ci0JCXJ0bDg3MjNhX0JUX21lZGlhc3RhdHVzX25vdGlmeShwYWRhcHRlciwgbXN0YXR1cyk7Ci0JCWJyZWFrOwotCWNhc2UgTFBTX0NUUkxfRElTQ09OTkVDVDoKLQkJbXN0YXR1cyA9IDA7LyogZGlzY29ubmVjdCAqLwotCQlydGw4NzIzYV9CVF9tZWRpYXN0YXR1c19ub3RpZnkocGFkYXB0ZXIsIG1zdGF0dXMpOwotCQlpZiAoIXJ0bDg3MjNhX0JUX3VzaW5nX2FudGVubmFfMShwYWRhcHRlcikpCi0JCQlMUFNfTGVhdmUyM2EocGFkYXB0ZXIpOwotCQlydGw4NzIzYV9zZXRfRndKb2luQnNzUmVwb3J0X2NtZChwYWRhcHRlciwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgTFBTX0NUUkxfU1BFQ0lBTF9QQUNLRVQ6Ci0JCXB3cnByaXYtPkRlbGF5TFBTTGFzdFRpbWVTdGFtcCA9IGppZmZpZXM7Ci0JCXJ0bDg3MjNhX0JUX3NwZWNpYWxwYWNrZXRfbm90aWZ5KHBhZGFwdGVyKTsKLQkJaWYgKCFydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpKQotCQkJTFBTX0xlYXZlMjNhKHBhZGFwdGVyKTsKLQkJYnJlYWs7Ci0JY2FzZSBMUFNfQ1RSTF9MRUFWRToKLQkJcnRsODcyM2FfQlRfbHBzX2xlYXZlKHBhZGFwdGVyKTsKLQkJaWYgKCFydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpKQotCQkJTFBTX0xlYXZlMjNhKHBhZGFwdGVyKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci19Ci0KLWludCBydHdfbHBzX2N0cmxfd2tfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICB1OCBscHNfY3RybF90eXBlLCB1OCBlbnF1ZXVlKQotewotCXN0cnVjdCBjbWRfb2JqICpwaDJjOwotCXN0cnVjdCBkcnZleHRyYV9jbWRfcGFybSAqcGRydmV4dHJhX2NtZF9wYXJtOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JaWYgKGVucXVldWUpIHsKLQkJcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghcGgyYykgewotCQkJcmVzID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlwZHJ2ZXh0cmFfY21kX3Bhcm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJ2ZXh0cmFfY21kX3Bhcm0pLAotCQkJCQkgICAgIEdGUF9BVE9NSUMpOwotCQlpZiAoIXBkcnZleHRyYV9jbWRfcGFybSkgewotCQkJa2ZyZWUocGgyYyk7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCXBkcnZleHRyYV9jbWRfcGFybS0+ZWNfaWQgPSBMUFNfQ1RSTF9XS19DSUQ7Ci0JCXBkcnZleHRyYV9jbWRfcGFybS0+dHlwZV9zaXplID0gbHBzX2N0cmxfdHlwZTsKLQkJcGRydmV4dHJhX2NtZF9wYXJtLT5wYnVmID0gTlVMTDsKLQotCQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sCi0JCQkJCSAgIEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpOwotCi0JCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGgyYyk7Ci0JfSBlbHNlCi0JCWxwc19jdHJsX3drX2hkbChwYWRhcHRlciwgbHBzX2N0cmxfdHlwZSk7Ci1leGl0OgotCi0JcmV0dXJuIHJlczsKLX0KLQotaW50IHJ0d19wc19jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgY21kX29iaiAqcHBzY21kOwotCXN0cnVjdCBkcnZleHRyYV9jbWRfcGFybSAqcGRydmV4dHJhX2NtZF9wYXJtOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JcHBzY21kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBwc2NtZCkgewotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBkcnZleHRyYV9jbWRfcGFybSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkcnZleHRyYV9jbWRfcGFybSksCi0JCQkJICAgICBHRlBfQVRPTUlDKTsKLQlpZiAoIXBkcnZleHRyYV9jbWRfcGFybSkgewotCQlrZnJlZShwcHNjbWQpOwotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBkcnZleHRyYV9jbWRfcGFybS0+ZWNfaWQgPSBQT1dFUl9TQVZJTkdfQ1RSTF9XS19DSUQ7Ci0JcGRydmV4dHJhX2NtZF9wYXJtLT5wYnVmID0gTlVMTDsKLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwcHNjbWQsIHBkcnZleHRyYV9jbWRfcGFybSwKLQkJCQkgICBHRU5fQ01EX0NPREUoX1NldF9EcnZfRXh0cmEpKTsKLQotCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcHBzY21kKTsKLWV4aXQ6Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0KLXN0YXRpYyB2b2lkIHJ0d19jaGtfaGlfcXVldWVfaGRsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaW50IGNudCA9IDA7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhX2JtYzsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JcHN0YV9ibWMgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0JaWYgKCFwc3RhX2JtYykKLQkJcmV0dXJuOwotCi0JaWYgKHBzdGFfYm1jLT5zbGVlcHFfbGVuID09IDApIHsKLQkJYm9vbCB2YWw7Ci0KLQkJdmFsID0gcnRsODcyM2FfY2hrX2hpX3F1ZXVlX2VtcHR5KHBhZGFwdGVyKTsKLQotCQl3aGlsZSAoIXZhbCkgewotCQkJbXNsZWVwKDEwMCk7Ci0KLQkJCWNudCsrOwotCi0JCQlpZiAoY250ID4gMTApCi0JCQkJYnJlYWs7Ci0KLQkJCXZhbCA9IHJ0bDg3MjNhX2Noa19oaV9xdWV1ZV9lbXB0eShwYWRhcHRlcik7Ci0JCX0KLQotCQlpZiAoY250IDw9IDEwKSB7Ci0JCQlwc3RhcHJpdi0+dGltX2JpdG1hcCAmPSB+QklUKDApOwotCQkJcHN0YXByaXYtPnN0YV9kel9iaXRtYXAgJj0gfkJJVCgwKTsKLQotCQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgV0xBTl9FSURfVElNLCBOVUxMLCBmYWxzZSk7Ci0JCX0gZWxzZSAvKiByZSBjaGVjayBhZ2FpbiAqLwotCQkJcnR3X2Noa19oaV9xdWV1ZV9jbWQyM2EocGFkYXB0ZXIpOwotCX0KLX0KLQotaW50IHJ0d19jaGtfaGlfcXVldWVfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGNtZF9vYmogKnBoMmM7Ci0Jc3RydWN0IGRydmV4dHJhX2NtZF9wYXJtICpwZHJ2ZXh0cmFfY21kX3Bhcm07Ci0Jc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlwaDJjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBoMmMpIHsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwZHJ2ZXh0cmFfY21kX3Bhcm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJ2ZXh0cmFfY21kX3Bhcm0pLAotCQkJCSAgICAgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwZHJ2ZXh0cmFfY21kX3Bhcm0pIHsKLQkJa2ZyZWUocGgyYyk7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGRydmV4dHJhX2NtZF9wYXJtLT5lY19pZCA9IENIRUNLX0hJUV9XS19DSUQ7Ci0JcGRydmV4dHJhX2NtZF9wYXJtLT50eXBlX3NpemUgPSAwOwotCXBkcnZleHRyYV9jbWRfcGFybS0+cGJ1ZiA9IE5VTEw7Ci0KLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sCi0JCQkJICAgR0VOX0NNRF9DT0RFKF9TZXRfRHJ2X0V4dHJhKSk7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBoMmMpOwotZXhpdDoKLQotCXJldHVybiByZXM7Ci19Ci0jZW5kaWYKLQotaW50IHJ0d19jMmhfd2tfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpjMmhfZXZ0KQotewotCXN0cnVjdCBjbWRfb2JqICpwaDJjOwotCXN0cnVjdCBkcnZleHRyYV9jbWRfcGFybSAqcGRydmV4dHJhX2NtZF9wYXJtOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwaDJjKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGRydmV4dHJhX2NtZF9wYXJtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRydmV4dHJhX2NtZF9wYXJtKSwKLQkJCQkgICAgIEdGUF9BVE9NSUMpOwotCWlmICghcGRydmV4dHJhX2NtZF9wYXJtKSB7Ci0JCWtmcmVlKHBoMmMpOwotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBkcnZleHRyYV9jbWRfcGFybS0+ZWNfaWQgPSBDMkhfV0tfQ0lEOwotCXBkcnZleHRyYV9jbWRfcGFybS0+dHlwZV9zaXplID0gYzJoX2V2dD8xNjowOwotCXBkcnZleHRyYV9jbWRfcGFybS0+cGJ1ZiA9IGMyaF9ldnQ7Ci0KLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sCi0JCQkJICAgR0VOX0NNRF9DT0RFKF9TZXRfRHJ2X0V4dHJhKSk7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBoMmMpOwotCi1leGl0OgotCi0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludCBjMmhfZXZ0X2hkbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBjMmhfZXZ0X2hkciAqYzJoX2V2dCkKLXsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0JdTggYnVmWzE2XTsKLQotCWlmICghYzJoX2V2dCkgewotCQkvKiBObyBjMmggZXZlbnQgaW4gY21kX29iaiwgcmVhZCBjMmggZXZlbnQgYmVmb3JlIGhhbmRsaW5nKi8KLQkJaWYgKGMyaF9ldnRfcmVhZDIzYShhZGFwdGVyLCBidWYpID09IF9TVUNDRVNTKSB7Ci0JCQljMmhfZXZ0ID0gKHN0cnVjdCBjMmhfZXZ0X2hkciAqKWJ1ZjsKLQotCQkJcmV0ID0gYzJoX2hhbmRsZXJfODcyM2EoYWRhcHRlciwgYzJoX2V2dCk7Ci0JCX0KLQl9IGVsc2UKLQkJcmV0ID0gYzJoX2hhbmRsZXJfODcyM2EoYWRhcHRlciwgYzJoX2V2dCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBydHdfaXJxX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBldnRfcHJpdiAqZXZ0cHJpdjsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXI7Ci0KLQlldnRwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBldnRfcHJpdiwgaXJxX3drKTsKLQlhZGFwdGVyID0gY29udGFpbmVyX29mKGV2dHByaXYsIHN0cnVjdCBydHdfYWRhcHRlciwgZXZ0cHJpdik7Ci0KLQljMmhfZXZ0X2NsZWFyMjNhKGFkYXB0ZXIpOwotfQotCi12b2lkIHJ0d19ldnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGV2dF93b3JrICpld29yazsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXI7Ci0KLQlld29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZXZ0X3dvcmssIHdvcmspOwotCWFkYXB0ZXIgPSBld29yay0+YWRhcHRlcjsKLQotCWMyaF9ldnRfY2xlYXIyM2EoYWRhcHRlcik7Ci0KLQlpZiAoIWMyaF9ldnRfZXhpc3QoJmV3b3JrLT51LmMyaF9ldnQpKSB7Ci0JCWtmcmVlKGV3b3JrKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChjMmhfaWRfZmlsdGVyX2NjeF84NzIzYShld29yay0+dS5jMmhfZXZ0LmlkKSA9PSB0cnVlKSB7Ci0JCS8qIEhhbmRsZSBDQ1ggcmVwb3J0IGhlcmUgKi8KLQkJYzJoX2hhbmRsZXJfODcyM2EoYWRhcHRlciwgJmV3b3JrLT51LmMyaF9ldnQpOwotCQlrZnJlZShld29yayk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogRW5xdWV1ZSBpbnRvIGNtZF90aHJlYWQgZm9yIG90aGVycy4KLQkJICogZXdvcmsgd2lsbCBiZSB0dXJuZWQgaW50byBhIGMyaF9ldnQgYW5kIGZyZWVkIG9uY2UgaXQKLQkJICogaGFzIGJlZW4gY29uc3VtZWQuCi0JCSAqLwotCQlydHdfYzJoX3drX2NtZDIzYShhZGFwdGVyLCAodTggKikmZXdvcmstPnUuYzJoX2V2dCk7Ci0JfQotfQotCi1pbnQgcnR3X2RydmV4dHJhX2NtZF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JY29uc3Qgc3RydWN0IGRydmV4dHJhX2NtZF9wYXJtICpwZHJ2ZXh0cmFfY21kOwotCi0JaWYgKCFwYnVmKQotCQlyZXR1cm4gSDJDX1BBUkFNRVRFUlNfRVJST1I7Ci0KLQlwZHJ2ZXh0cmFfY21kID0gKHN0cnVjdCBkcnZleHRyYV9jbWRfcGFybSAqKXBidWY7Ci0KLQlzd2l0Y2ggKHBkcnZleHRyYV9jbWQtPmVjX2lkKSB7Ci0JY2FzZSBEWU5BTUlDX0NIS19XS19DSUQ6Ci0JCWR5bmFtaWNfY2hrX3drX2hkbChwYWRhcHRlciwgcGRydmV4dHJhX2NtZC0+cGJ1ZiwKLQkJCQkgICBwZHJ2ZXh0cmFfY21kLT50eXBlX3NpemUpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NBVklOR19DVFJMX1dLX0NJRDoKLQkJcnR3X3BzX3Byb2Nlc3NvcjIzYShwYWRhcHRlcik7Ci0JCWJyZWFrOwotCWNhc2UgTFBTX0NUUkxfV0tfQ0lEOgotCQlscHNfY3RybF93a19oZGwocGFkYXB0ZXIsICh1OClwZHJ2ZXh0cmFfY21kLT50eXBlX3NpemUpOwotCQlicmVhazsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQljYXNlIENIRUNLX0hJUV9XS19DSUQ6Ci0JCXJ0d19jaGtfaGlfcXVldWVfaGRsKHBhZGFwdGVyKTsKLQkJYnJlYWs7Ci0jZW5kaWYgLyogQ09ORklHXzg3MjNBVV9BUF9NT0RFICovCi0JY2FzZSBDMkhfV0tfQ0lEOgotCQljMmhfZXZ0X2hkbChwYWRhcHRlciwKLQkJCSAgICAoc3RydWN0IGMyaF9ldnRfaGRyICopcGRydmV4dHJhX2NtZC0+cGJ1Zik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHBkcnZleHRyYV9jbWQtPnBidWYgJiYgKHBkcnZleHRyYV9jbWQtPnR5cGVfc2l6ZSA+IDApKSB7Ci0JCWtmcmVlKHBkcnZleHRyYV9jbWQtPnBidWYpOwotCQkvKgotCQkgKiBObyBuZWVkIHRvIHNldCBwZHJ2ZXh0cmFfY21kLT5wYnVmID0gTlVMTCBhcyB3ZSB3ZXJlCi0JCSAqIG9wZXJhdGluZyBvbiBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIHBjbWQtPnBhcm1idWYKLQkJICogY3JlYXRlZCBpbiBydHdfY21kX3dvcmsoKS4KLQkJICovCi0JfQotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi12b2lkIHJ0d19zdXJ2ZXlfY21kX2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJc3RydWN0IGNtZF9vYmogKnBjbWQpCi17Ci0Jc3RydWN0CW1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWlmIChwY21kLT5yZXMgPT0gSDJDX0RST1BQRUQpIHsKLQkJLyogVE9ETzogY2FuY2VsIHRpbWVyIGFuZCBkbyB0aW1lb3V0IGhhbmRsZXIgZGlyZWN0bHkuLi4gKi8KLQkJLyogbmVlZCB0byBtYWtlIHRpbWVvdXQgaGFuZGxlck9TIGluZGVwZW5kZW50ICovCi0JCW1vZF90aW1lcigmcG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKSk7Ci0JfSBlbHNlIGlmIChwY21kLT5yZXMgIT0gSDJDX1NVQ0NFU1MpIHsKLQkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJICIqKioqKioqKkVycm9yOiBNZ250QWN0cnR3X3NldF84MDJfMTFfYnNzaWQyM2FfTElTVF9TQ0FOIEZhaWwgKioqKioqKioqKioqXG4iKTsKLQl9Ci0KLQkvKiAgZnJlZSBjbWQgKi8KLQlydHdfZnJlZV9jbWRfb2JqMjNhKHBjbWQpOwotfQotCi12b2lkIHJ0d19kaXNhc3NvY19jbWQyM2FfY2FsbGJhY2soc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgIHN0cnVjdCBjbWRfb2JqICpwY21kKQotewotCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlpZiAocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKSB7Ci0JCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQkJc2V0X2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKTsKLQkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAiKioqRXJyb3I6IGRpc2Nvbm5lY3RfY21kX2NhbGxiYWNrIEZhaWwgKioqXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qICBmcmVlIGNtZCAqLwotCXJ0d19mcmVlX2NtZF9vYmoyM2EocGNtZCk7Ci19Ci0KLXZvaWQgcnR3X2pvaW5ic3NfY21kMjNhX2NhbGxiYWNrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJIHN0cnVjdCBjbWRfb2JqICpwY21kKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlpZiAocGNtZC0+cmVzID09IEgyQ19EUk9QUEVEKSB7Ci0JCS8qIFRPRE86IGNhbmNlbCB0aW1lciBhbmQgZG8gdGltZW91dCBoYW5kbGVyIGRpcmVjdGx5Li4uICovCi0JCS8qIG5lZWQgdG8gbWFrZSB0aW1lb3V0IGhhbmRsZXJPUyBpbmRlcGVuZGVudCAqLwotCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKLQl9IGVsc2UgaWYgKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIioqKioqKioqRXJyb3I6cnR3X3NlbGVjdF9hbmRfam9pbl9mcm9tX3NjYW5uZWRfcXVldWUgV2FpdCBTZW1hICBGYWlsICoqKioqKioqKioqKlxuIik7Ci0JCW1vZF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwotCX0KLQotCXJ0d19mcmVlX2NtZF9vYmoyM2EocGNtZCk7Ci19Ci0KLXZvaWQgcnR3X2NyZWF0ZWJzc19jbWQyM2FfY2FsbGJhY2soc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICBzdHJ1Y3QgY21kX29iaiAqcGNtZCkKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcHdsYW47Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmsgPSAoc3RydWN0IHdsYW5fYnNzaWRfZXggKilwY21kLT5wYXJtYnVmOwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKnRndF9uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcms7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqc2Nhbm5lZF9xdWV1ZSA9ICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWU7Ci0KLQlpZiAocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAiKioqKioqKipFcnJvcjogcnR3X2NyZWF0ZWJzc19jbWQyM2FfY2FsbGJhY2sgIEZhaWwgKioqKioqKioqKioqXG4iKTsKLQkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKSk7Ci0JfQotCi0JZGVsX3RpbWVyX3N5bmMoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgewotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwKLQkJCQkJICBwbmV0d29yay0+TWFjQWRkcmVzcyk7Ci0JCWlmICghcHN0YSkgewotCQkJcHN0YSA9IHJ0d19hbGxvY19zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwKLQkJCQkJCSAgICBwbmV0d29yay0+TWFjQWRkcmVzcywKLQkJCQkJCSAgICBHRlBfS0VSTkVMKTsKLQkJCWlmICghcHN0YSkgewotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCQkJICJDYW4ndCBhbGxvYyBzdGFfaW5mbyB3aGVuIGNyZWF0ZWJzc19jbWRfY2FsbGJhY2tcbiIpOwotCQkJCWdvdG8gY3JlYXRlYnNzX2NtZF9mYWlsOwotCQkJfQotCQl9Ci0KLQkJc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCQlydHdfaW5kaWNhdGVfY29ubmVjdDIzYShwYWRhcHRlcik7Ci0JCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCX0gZWxzZSB7Ci0JCXB3bGFuID0gcnR3X2FsbG9jX25ldHdvcmsocG1sbWVwcml2LCBHRlBfS0VSTkVMKTsKLQkJc3Bpbl9sb2NrX2JoKCZzY2FubmVkX3F1ZXVlLT5sb2NrKTsKLQkJaWYgKCFwd2xhbikgewotCQkJcHdsYW4gPSBydHdfZ2V0X29sZGVzdF93bGFuX25ldHdvcmsyM2Eoc2Nhbm5lZF9xdWV1ZSk7Ci0JCQlpZiAoIXB3bGFuKSB7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJCQkgIkVycm9yOiAgY2FuJ3QgZ2V0IHB3bGFuIGluIHJ0dzIzYV9qb2luYnNzX2V2ZW50X2NiXG4iKTsKLQkJCQlzcGluX3VubG9ja19iaCgmc2Nhbm5lZF9xdWV1ZS0+bG9jayk7Ci0JCQkJZ290byBjcmVhdGVic3NfY21kX2ZhaWw7Ci0JCQl9Ci0JCQlwd2xhbi0+bGFzdF9zY2FubmVkID0gamlmZmllczsKLQkJfSBlbHNlIHsKLQkJCWxpc3RfYWRkX3RhaWwoJnB3bGFuLT5saXN0LAotCQkJCSAgICAgICZzY2FubmVkX3F1ZXVlLT5xdWV1ZSk7Ci0JCX0KLQotCQlwbmV0d29yay0+TGVuZ3RoID0gZ2V0X3dsYW5fYnNzaWRfZXhfc3oocG5ldHdvcmspOwotCQltZW1jcHkoJnB3bGFuLT5uZXR3b3JrLCBwbmV0d29yaywgcG5ldHdvcmstPkxlbmd0aCk7Ci0JCS8qIHB3bGFuLT5maXhlZCA9IHRydWU7ICovCi0KLQkJLyogbGlzdF9hZGRfdGFpbCgmcHdsYW4tPmxpc3QsCi0JCSAgICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUucXVldWUpOyAqLwotCi0JCS8qICBjb3B5IHBkZXZfbmV0d29yayBpbmZvcm1hdGlvbiB0bwotCQkgICAgcG1sbWVwcml2LT5jdXJfbmV0d29yayAqLwotCQltZW1jcHkoJnRndF9uZXR3b3JrLT5uZXR3b3JrLCBwbmV0d29yaywKLQkJICAgICAgIGdldF93bGFuX2Jzc2lkX2V4X3N6KHBuZXR3b3JrKSk7Ci0KLQkJLyogIHJlc2V0IERTQ29uZmlnICovCi0KLQkJY2xyX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyk7Ci0KLQkJLyogIHdlIHdpbGwgc2V0IF9GV19MSU5LRUQgd2hlbiB0aGVyZSBpcyBvbmUgbW9yZSBzYXQgdG8KLQkJICAgIGpvaW4gdXMgKHJ0d19zdGFzc29jX2V2ZW50X2NhbGxiYWNrMjNhKSAqLwotCQlzcGluX3VubG9ja19iaCgmc2Nhbm5lZF9xdWV1ZS0+bG9jayk7Ci0JfQotCi1jcmVhdGVic3NfY21kX2ZhaWw6Ci0KLQlydHdfZnJlZV9jbWRfb2JqMjNhKHBjbWQpOwotfQotCi12b2lkIHJ0d19zZXRzdGFLZXlfY21kcnNwX2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICAgc3RydWN0IGNtZF9vYmogKnBjbWQpCi17Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdjsKLQlzdHJ1Y3Qgc2V0X3N0YWtleV9yc3AgKnBzZXRzdGFrZXlfcnNwOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQotCXBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXBzZXRzdGFrZXlfcnNwID0gKHN0cnVjdCBzZXRfc3Rha2V5X3JzcCAqKSAocGNtZC0+cnNwKTsKLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwc2V0c3Rha2V5X3JzcC0+YWRkcik7Ci0KLQlpZiAoIXBzdGEpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJICJFUlJPUjogcnR3X3NldHN0YUtleV9jbWRyc3BfY2FsbGJhY2syM2EgPT4gY2FuJ3QgZ2V0IHN0YV9pbmZvXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQotZXhpdDoKLQotCXJ0d19mcmVlX2NtZF9vYmoyM2EocGNtZCk7Ci19Ci0KLXZvaWQgcnR3X3NldGFzc29jc3RhX2NtZHJzcF9jYWxsYmFjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQlzdHJ1Y3QgY21kX29iaiAqcGNtZCkKLXsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHNldF9hc3NvY3N0YV9wYXJtICpwYXNzb2NzdGFfcGFybTsKLQlzdHJ1Y3Qgc2V0X2Fzc29jc3RhX3JzcCAqcGFzc29jc3RhX3JzcDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0KLQlwYXNzb2NzdGFfcGFybSA9IChzdHJ1Y3Qgc2V0X2Fzc29jc3RhX3Bhcm0gKikocGNtZC0+cGFybWJ1Zik7Ci0JcGFzc29jc3RhX3JzcCA9IChzdHJ1Y3Qgc2V0X2Fzc29jc3RhX3JzcCAqKSAocGNtZC0+cnNwKTsKLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwYXNzb2NzdGFfcGFybS0+YWRkcik7Ci0KLQlpZiAocHN0YSA9PSBOVUxMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAiRVJST1I6IHNldGFzc29jc3RhX2NtZHJzcF9jYWxsYmFjID0+IGNhbid0IGdldCBzdGFfaW5mb1xuIik7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwc3RhLT5haWQgPSBwc3RhLT5tYWNfaWQgPSBwYXNzb2NzdGFfcnNwLT5jYW1faWQ7Ci0KLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfTVBfU1RBVEUpICYmCi0JICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORykpCi0JCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyk7Ci0KLQlzZXRfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpOwotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi1leGl0OgotCXJ0d19mcmVlX2NtZF9vYmoyM2EocGNtZCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2VmdXNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2VmdXNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OWVmNDEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19lZnVzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRXX0VGVVNFX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxydHdfZWZ1c2UuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLSNkZWZpbmUgUkVHX0VGVVNFX0NUUkwJCTB4MDAzMAotI2RlZmluZSBFRlVTRV9DVFJMCQlSRUdfRUZVU0VfQ1RSTAkvKiBFLUZ1c2UgQ29udHJvbCAqLwotCi0jZGVmaW5lIFZPTFRBR0VfVjI1CQkweDAzCi0jZGVmaW5lIExET0UyNV9TSElGVAkJMjgKLQotLyoKLSAqIFdoZW4gd2Ugd2FudCB0byBlbmFibGUgd3JpdGUgb3BlcmF0aW9uLCB3ZSBzaG91bGQgY2hhbmdlIHRvCi0gKiBwd3Igb24gc3RhdGUuIFdoZW4gd2Ugc3RvcCB3cml0ZSwgd2Ugc2hvdWxkIHN3aXRjaCB0byA1MDBrIG1vZGUKLSAqIGFuZCBkaXNhYmxlIExETyAyLjVWLgotICovCi1zdGF0aWMgdm9pZCBFZnVzZV9Qb3dlclN3aXRjaChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgdTggYldyaXRlLCB1OCBQd3JTdGF0ZSkKLXsKLQl1OCB0ZW1wdmFsOwotCXUxNiB0bXBWMTY7Ci0KLQlpZiAoUHdyU3RhdGUgPT0gdHJ1ZSkgewotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfRUZVU0VfQUNDRVNTLCBFRlVTRV9BQ0NFU1NfT04pOwotCi0JCS8qCi0JCSAqIDEuMlYgUG93ZXI6IEZyb20gVkRET04gd2l0aCBQb3dlcgotCQkgKiBDdXQoMHgwMDAwaFsxNV0pLCBkZWZhdWx0IHZhbGlkCi0JCSAqLwotCQl0bXBWMTYgPSBydGw4NzIzYXVfcmVhZDE2KHBhZGFwdGVyLCBSRUdfU1lTX0lTT19DVFJMKTsKLQkJaWYgKCEodG1wVjE2ICYgUFdDX0VWMTJWKSkgewotCQkJdG1wVjE2IHw9IFBXQ19FVjEyVjsKLQkJCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfU1lTX0lTT19DVFJMLCB0bXBWMTYpOwotCQl9Ci0JCS8qIFJlc2V0OiAweDAwMDBoWzI4XSwgZGVmYXVsdCB2YWxpZCAqLwotCQl0bXBWMTYgPSBydGw4NzIzYXVfcmVhZDE2KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4pOwotCQlpZiAoISh0bXBWMTYgJiBGRU5fRUxEUikpIHsKLQkJCXRtcFYxNiB8PSBGRU5fRUxEUjsKLQkJCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4sIHRtcFYxNik7Ci0JCX0KLQotCQkvKgotCQkgKiBDbG9jazogR2F0ZWQoMHgwMDA4aFs1XSkgOE0oMHgwMDA4aFsxXSkKLQkJICogY2xvY2sgZnJvbSBBTkEsIGRlZmF1bHQgdmFsaWQKLQkJICovCi0JCXRtcFYxNiA9IHJ0bDg3MjNhdV9yZWFkMTYocGFkYXB0ZXIsIFJFR19TWVNfQ0xLUik7Ci0JCWlmICgoISh0bXBWMTYgJiBMT0FERVJfQ0xLX0VOKSkgfHwgKCEodG1wVjE2ICYgQU5BOE0pKSkgewotCQkJdG1wVjE2IHw9IChMT0FERVJfQ0xLX0VOIHwgQU5BOE0pOwotCQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19TWVNfQ0xLUiwgdG1wVjE2KTsKLQkJfQotCi0JCWlmIChiV3JpdGUgPT0gdHJ1ZSkgewotCQkJLyogIEVuYWJsZSBMRE8gMi41ViBiZWZvcmUgcmVhZC93cml0ZSBhY3Rpb24gKi8KLQkJCXRlbXB2YWwgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIEVGVVNFX1RFU1QgKyAzKTsKLQkJCXRlbXB2YWwgJj0gMHgwRjsKLQkJCXRlbXB2YWwgfD0gKFZPTFRBR0VfVjI1IDw8IDQpOwotCQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgRUZVU0VfVEVTVCArIDMsCi0JCQkJCSB0ZW1wdmFsIHwgMHg4MCk7Ci0JCX0KLQl9IGVsc2UgewotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfRUZVU0VfQUNDRVNTLCBFRlVTRV9BQ0NFU1NfT0ZGKTsKLQotCQlpZiAoYldyaXRlID09IHRydWUpIHsKLQkJCS8qICBEaXNhYmxlIExETyAyLjVWIGFmdGVyIHJlYWQvd3JpdGUgYWN0aW9uICovCi0JCQl0ZW1wdmFsID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBFRlVTRV9URVNUICsgMyk7Ci0JCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBFRlVTRV9URVNUICsgMywKLQkJCQkJIHRlbXB2YWwgJiAweDdGKTsKLQkJfQotCX0KLX0KLQotdTE2IEVmdXNlX0dldEN1cnJlbnRTaXplMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHU4IGVmdXNlVHlwZSkKLXsKLQl1MTYgcmV0ID0gMDsKLQotCWlmIChlZnVzZVR5cGUgPT0gRUZVU0VfV0lGSSkKLQkJcmV0ID0gcnRsODcyM2FfRWZ1c2VHZXRDdXJyZW50U2l6ZV9XaUZpKHBBZGFwdGVyKTsKLQllbHNlCi0JCXJldCA9IHJ0bDg3MjNhX0VmdXNlR2V0Q3VycmVudFNpemVfQlQocEFkYXB0ZXIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogR2V0IGN1cnJlbnQgZWZ1c2UgYXJlYSBlbmFibGVkIHdvcmQgKi8KLXU4IEVmdXNlX0NhbGN1bGF0ZVdvcmRDbnRzMjNhKHU4IHdvcmRfZW4pCi17Ci0JcmV0dXJuIGh3ZWlnaHQ4KCh+d29yZF9lbikgJiAweGYpOwotfQotCi0vKgotICogRGVzY3JpcHRpb246IEV4ZWN1dGUgRS1GdXNlIHJlYWQgYnl0ZSBvcGVyYXRpb24uCi0gKgotICogQXNzdW1wdGlvbnM6IDEuIEJvb3QgZnJvbSBFLUZ1c2UgYW5kIHN1Y2Nlc3NmdWxseSBhdXRvLWxvYWQuCi0gKiAgICAgICAgICAgICAgMi4gUEFTU0lWRV9MRVZFTCAoVVNCIGludGVyZmFjZSkKLSAqLwotdm9pZCBSZWFkRUZ1c2VCeXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTE2IF9vZmZzZXQsIHU4ICpwYnVmKQotewotCXUzMgl2YWx1ZTMyOwotCXU4CXJlYWRieXRlOwotCXUxNglyZXRyeTsKLQotCS8qIFdyaXRlIEFkZHJlc3MgKi8KLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIEVGVVNFX0NUUkwrMSwgKF9vZmZzZXQgJiAweGZmKSk7Ci0JcmVhZGJ5dGUgPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgRUZVU0VfQ1RSTCsyKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIEVGVVNFX0NUUkwrMiwKLQkJCSAoKF9vZmZzZXQgPj4gOCkgJiAweDAzKSB8IChyZWFkYnl0ZSAmIDB4ZmMpKTsKLQotCS8qIFdyaXRlIGJpdCAzMiAwICovCi0JcmVhZGJ5dGUgPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgRUZVU0VfQ1RSTCszKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIEVGVVNFX0NUUkwrMywgcmVhZGJ5dGUgJiAweDdmKTsKLQotCS8qIENoZWNrIGJpdCAzMiByZWFkLXJlYWR5ICovCi0JcmV0cnkgPSAwOwotCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIEVGVVNFX0NUUkwpOwotCXdoaWxlICghKCh2YWx1ZTMyID4+IDI0KSAmIDB4ODApICYmIHJldHJ5IDwgMTAwMDApIHsKLQkJdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgRUZVU0VfQ1RSTCk7Ci0JCXJldHJ5Kys7Ci0JfQotCi0JLyoKLQkgKiBBZGRlZCBzdWdnZXN0ZWQgZGVsYXkuIFRoaXMgZml4ZXMgdGhlIHByb2JsZW0gdGhhdAotCSAqIEVmdXNlIHJlYWQgZXJyb3IgaW4gaGlnaCB0ZW1wZXJhdHVyZSBjb25kaXRpb24uCi0JICogRGVzaWduZXIgc2F5cyB0aGF0IHRoZXJlIHNoYWxsIGJlIHNvbWUgZGVsYXkgYWZ0ZXIKLQkgKiByZWFkeSBiaXQgaXMgc2V0LCBvciB0aGUgcmVzdWx0IHdpbGwgYWx3YXlzIHN0YXkKLQkgKiBvbiBsYXN0IGRhdGEgd2UgcmVhZC4KLQkgKi8KLQl1ZGVsYXkoNTApOwotCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIEVGVVNFX0NUUkwpOwotCi0JKnBidWYgPSAodTgpKHZhbHVlMzIgJiAweGZmKTsKLX0KLQotdm9pZCBFRlVTRV9HZXRFZnVzZURlZmluaXRpb24yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTggZWZ1c2VUeXBlLAotCQkJCSB1OCB0eXBlLCB2b2lkICpwT3V0KQotewotCXU4ICpwdTFUbXA7Ci0JdTE2ICpwdTJUbXA7Ci0JdTggKnBNYXhfc2VjdGlvbjsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgVFlQRV9FRlVTRV9NQVhfU0VDVElPTjoKLQkJcE1heF9zZWN0aW9uID0gcE91dDsKLQotCQlpZiAoZWZ1c2VUeXBlID09IEVGVVNFX1dJRkkpCi0JCQkqcE1heF9zZWN0aW9uID0gRUZVU0VfTUFYX1NFQ1RJT05fODcyM0E7Ci0JCWVsc2UKLQkJCSpwTWF4X3NlY3Rpb24gPSBFRlVTRV9CVF9NQVhfU0VDVElPTjsKLQkJYnJlYWs7Ci0KLQljYXNlIFRZUEVfRUZVU0VfUkVBTF9DT05URU5UX0xFTjoKLQkJcHUyVG1wID0gcE91dDsKLQotCQlpZiAoZWZ1c2VUeXBlID09IEVGVVNFX1dJRkkpCi0JCQkqcHUyVG1wID0gRUZVU0VfUkVBTF9DT05URU5UX0xFTl84NzIzQTsKLQkJZWxzZQotCQkJKnB1MlRtcCA9IEVGVVNFX0JUX1JFQUxfQ09OVEVOVF9MRU47Ci0JCWJyZWFrOwotCi0JY2FzZSBUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19CQU5LOgotCQlwdTJUbXAgPSBwT3V0OwotCi0JCWlmIChlZnVzZVR5cGUgPT0gRUZVU0VfV0lGSSkKLQkJCSpwdTJUbXAgPSAoRUZVU0VfUkVBTF9DT05URU5UX0xFTl84NzIzQSAtCi0JCQkJICAgRUZVU0VfT09CX1BST1RFQ1RfQllURVMpOwotCQllbHNlCi0JCQkqcHUyVG1wID0gKEVGVVNFX0JUX1JFQUxfQkFOS19DT05URU5UX0xFTiAtCi0JCQkJICAgRUZVU0VfUFJPVEVDVF9CWVRFU19CQU5LKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRZUEVfQVZBSUxBQkxFX0VGVVNFX0JZVEVTX1RPVEFMOgotCQlwdTJUbXAgPSBwT3V0OwotCi0JCWlmIChlZnVzZVR5cGUgPT0gRUZVU0VfV0lGSSkKLQkJCSpwdTJUbXAgPSAoRUZVU0VfUkVBTF9DT05URU5UX0xFTl84NzIzQSAtCi0JCQkJICAgRUZVU0VfT09CX1BST1RFQ1RfQllURVMpOwotCQllbHNlCi0JCQkqcHUyVG1wID0gKEVGVVNFX0JUX1JFQUxfQ09OVEVOVF9MRU4gLQotCQkJCSAgIChFRlVTRV9QUk9URUNUX0JZVEVTX0JBTksgKiAzKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBUWVBFX0VGVVNFX01BUF9MRU46Ci0JCXB1MlRtcCA9IHBPdXQ7Ci0KLQkJaWYgKGVmdXNlVHlwZSA9PSBFRlVTRV9XSUZJKQotCQkJKnB1MlRtcCA9IEVGVVNFX01BUF9MRU5fODcyM0E7Ci0JCWVsc2UKLQkJCSpwdTJUbXAgPSBFRlVTRV9CVF9NQVBfTEVOOwotCQlicmVhazsKLQotCWNhc2UgVFlQRV9FRlVTRV9QUk9URUNUX0JZVEVTX0JBTks6Ci0JCXB1MVRtcCA9IHBPdXQ7Ci0KLQkJaWYgKGVmdXNlVHlwZSA9PSBFRlVTRV9XSUZJKQotCQkJKnB1MVRtcCA9IEVGVVNFX09PQl9QUk9URUNUX0JZVEVTOwotCQllbHNlCi0JCQkqcHUxVG1wID0gRUZVU0VfUFJPVEVDVF9CWVRFU19CQU5LOwotCQlicmVhazsKLQotCWNhc2UgVFlQRV9FRlVTRV9DT05URU5UX0xFTl9CQU5LOgotCQlwdTJUbXAgPSBwT3V0OwotCi0JCWlmIChlZnVzZVR5cGUgPT0gRUZVU0VfV0lGSSkKLQkJCSpwdTJUbXAgPSBFRlVTRV9SRUFMX0NPTlRFTlRfTEVOXzg3MjNBOwotCQllbHNlCi0JCQkqcHUyVG1wID0gRUZVU0VfQlRfUkVBTF9CQU5LX0NPTlRFTlRfTEVOOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXB1MVRtcCA9IHBPdXQ7Ci0JCSpwdTFUbXAgPSAwOwotCQlicmVhazsKLQl9Ci19Ci0KLS8qIENvcHkgZnJvbSBXTUFDIGZvciBFRlVTRSByZWFkIDEgYnl0ZS4gKi8KLXU4IEVGVVNFX1JlYWQxQnl0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHUxNiBBZGRyZXNzKQotewotCXU4CWRhdGE7Ci0JdTgJQnl0ZXRlbXAgPSB7MHgwMH07Ci0JdTgJdGVtcCA9IHsweDAwfTsKLQl1MzIJayA9IDA7Ci0JdTE2CWNvbnRlbnRMZW4gPSAwOwotCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uMjNhKEFkYXB0ZXIsIEVGVVNFX1dJRkksCi0JCQkJIFRZUEVfRUZVU0VfUkVBTF9DT05URU5UX0xFTiwKLQkJCQkgKHZvaWQgKikmY29udGVudExlbik7Ci0KLQlpZiAoQWRkcmVzcyA8IGNvbnRlbnRMZW4pIHsgLyogRS1mdXNlIDUxMkJ5dGUgKi8KLQkJLyogV3JpdGUgRS1mdXNlIFJlZ2lzdGVyIGFkZHJlc3MgYml0MH43ICovCi0JCXRlbXAgPSBBZGRyZXNzICYgMHhGRjsKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBFRlVTRV9DVFJMKzEsIHRlbXApOwotCQlCeXRldGVtcCA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBFRlVTRV9DVFJMKzIpOwotCQkvKiBXcml0ZSBFLWZ1c2UgUmVnaXN0ZXIgYWRkcmVzcyBiaXQ4fjkgKi8KLQkJdGVtcCA9ICgoQWRkcmVzcyA+PiA4KSAmIDB4MDMpIHwgKEJ5dGV0ZW1wICYgMHhGQyk7Ci0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgRUZVU0VfQ1RSTCsyLCB0ZW1wKTsKLQotCQkvKiBXcml0ZSAweDMwWzMxXT0gMCAqLwotCQlCeXRldGVtcCA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBFRlVTRV9DVFJMKzMpOwotCQl0ZW1wID0gQnl0ZXRlbXAgJiAweDdGOwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIEVGVVNFX0NUUkwrMywgdGVtcCk7Ci0KLQkJLyogV2FpdCBXcml0ZS1yZWFkeSAoMHgzMFszMV09IDEpICovCi0JCUJ5dGV0ZW1wID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIEVGVVNFX0NUUkwrMyk7Ci0JCXdoaWxlICghKEJ5dGV0ZW1wICYgMHg4MCkpIHsKLQkJCUJ5dGV0ZW1wID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIEVGVVNFX0NUUkwrMyk7Ci0JCQlrKys7Ci0JCQlpZiAoayA9PSAxMDAwKSB7Ci0JCQkJayA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZGF0YSA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBFRlVTRV9DVFJMKTsKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCXJldHVybiAweEZGOwotfQotCi0vKiBSZWFkIG9uZSBieXRlIGZyb20gcmVhbCBFZnVzZS4gKi8KLWludCBlZnVzZV9PbmVCeXRlUmVhZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MTYgYWRkciwgdTggKmRhdGEpCi17Ci0JdTgJdG1waWR4ID0gMDsKLQlpbnQJYlJlc3VsdDsKLQotCS8qICAtLS0tLS0tLS0tLS0tLS0tLWUtZnVzZSByZWcgY3RybCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0JLyogYWRkcmVzcyAqLwotCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIEVGVVNFX0NUUkwgKyAxLCAodTgpKGFkZHIgJiAweGZmKSk7Ci0JcnRsODcyM2F1X3dyaXRlOChwQWRhcHRlciwgRUZVU0VfQ1RSTCArIDIsCi0JCQkgKCh1OCkoKGFkZHIgPj4gOCkgJiAweDAzKSkgfAotCQkJIChydGw4NzIzYXVfcmVhZDgocEFkYXB0ZXIsIEVGVVNFX0NUUkwgKyAyKSAmIDB4RkMpKTsKLQotCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIEVGVVNFX0NUUkwgKyAzLCAweDcyKTsgLyogcmVhZCBjbWQgKi8KLQotCXdoaWxlICghKDB4ODAgJiBydGw4NzIzYXVfcmVhZDgocEFkYXB0ZXIsIEVGVVNFX0NUUkwgKyAzKSkgJiYKLQkgICAgICAgKHRtcGlkeCA8IDEwMCkpCi0JCXRtcGlkeCsrOwotCWlmICh0bXBpZHggPCAxMDApIHsKLQkJKmRhdGEgPSBydGw4NzIzYXVfcmVhZDgocEFkYXB0ZXIsIEVGVVNFX0NUUkwpOwotCQliUmVzdWx0ID0gX1NVQ0NFU1M7Ci0JfSBlbHNlIHsKLQkJKmRhdGEgPSAweGZmOwotCQliUmVzdWx0ID0gX0ZBSUw7Ci0JfQotCXJldHVybiBiUmVzdWx0OwotfQotCi0vKiBXcml0ZSBvbmUgYnl0ZSB0byByZWFsZCBFZnVzZS4gKi8KLWludCBlZnVzZV9PbmVCeXRlV3JpdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTE2IGFkZHIsIHU4IGRhdGEpCi17Ci0JdTgJdG1waWR4ID0gMDsKLQlpbnQJYlJlc3VsdDsKLQotCS8qIHJldHVybgkwOyAqLwotCi0JLyogIC0tLS0tLS0tLS0tLS0tLS0tZS1mdXNlIHJlZyBjdHJsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQkvKiBhZGRyZXNzICovCi0JcnRsODcyM2F1X3dyaXRlOChwQWRhcHRlciwgRUZVU0VfQ1RSTCArIDEsICh1OCkoYWRkciAmIDB4ZmYpKTsKLQlydGw4NzIzYXVfd3JpdGU4KHBBZGFwdGVyLCBFRlVTRV9DVFJMICsgMiwKLQkJCSAocnRsODcyM2F1X3JlYWQ4KHBBZGFwdGVyLCBFRlVTRV9DVFJMICsgMikgJiAweEZDKSB8Ci0JCQkgKHU4KSgoYWRkciA+PiA4KSAmIDB4MDMpKTsKLQlydGw4NzIzYXVfd3JpdGU4KHBBZGFwdGVyLCBFRlVTRV9DVFJMLCBkYXRhKTsgLyogZGF0YSAqLwotCi0JcnRsODcyM2F1X3dyaXRlOChwQWRhcHRlciwgRUZVU0VfQ1RSTCArIDMsIDB4RjIpOyAvKiB3cml0ZSBjbWQgKi8KLQotCXdoaWxlICgoMHg4MCAmIHJ0bDg3MjNhdV9yZWFkOChwQWRhcHRlciwgRUZVU0VfQ1RSTCArIDMpKSAmJgotCSAgICAgICAodG1waWR4IDwgMTAwKSkgewotCQl0bXBpZHgrKzsKLQl9Ci0KLQlpZiAodG1waWR4IDwgMTAwKQotCQliUmVzdWx0ID0gX1NVQ0NFU1M7Ci0JZWxzZQotCQliUmVzdWx0ID0gX0ZBSUw7Ci0KLQlyZXR1cm4gYlJlc3VsdDsKLX0KLQotLyogUmVhZCBhbGxvd2VkIHdvcmQgaW4gY3VycmVudCBlZnVzZSBzZWN0aW9uIGRhdGEuICovCi12b2lkIGVmdXNlX1dvcmRFbmFibGVEYXRhUmVhZDIzYSh1OCB3b3JkX2VuLCB1OCAqc291cmRhdGEsIHU4ICp0YXJnZXRkYXRhKQotewotCWlmICghKHdvcmRfZW4mQklUKDApKSkgewotCQl0YXJnZXRkYXRhWzBdID0gc291cmRhdGFbMF07Ci0JCXRhcmdldGRhdGFbMV0gPSBzb3VyZGF0YVsxXTsKLQl9Ci0JaWYgKCEod29yZF9lbiZCSVQoMSkpKSB7Ci0JCXRhcmdldGRhdGFbMl0gPSBzb3VyZGF0YVsyXTsKLQkJdGFyZ2V0ZGF0YVszXSA9IHNvdXJkYXRhWzNdOwotCX0KLQlpZiAoISh3b3JkX2VuJkJJVCgyKSkpIHsKLQkJdGFyZ2V0ZGF0YVs0XSA9IHNvdXJkYXRhWzRdOwotCQl0YXJnZXRkYXRhWzVdID0gc291cmRhdGFbNV07Ci0JfQotCWlmICghKHdvcmRfZW4mQklUKDMpKSkgewotCQl0YXJnZXRkYXRhWzZdID0gc291cmRhdGFbNl07Ci0JCXRhcmdldGRhdGFbN10gPSBzb3VyZGF0YVs3XTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZWZ1c2VfcmVhZDgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHJlc3MsIHU4ICp2YWx1ZSkKLXsKLQlyZXR1cm4gZWZ1c2VfT25lQnl0ZVJlYWQyM2EocGFkYXB0ZXIsIGFkZHJlc3MsIHZhbHVlKTsKLX0KLQotc3RhdGljIGludCBlZnVzZV93cml0ZTgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHJlc3MsIHU4ICp2YWx1ZSkKLXsKLQlyZXR1cm4gZWZ1c2VfT25lQnl0ZVdyaXRlMjNhKHBhZGFwdGVyLCBhZGRyZXNzLCAqdmFsdWUpOwotfQotCi0vKiByZWFkL3dyaXRlIHJhdyBlZnVzZSBkYXRhICovCi1pbnQgcnR3X2VmdXNlX2FjY2VzczIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiV3JpdGUsIHUxNiBzdGFydF9hZGRyLAotCQkJdTE2IGNudHMsIHU4ICpkYXRhKQotewotCWludCBpID0gMDsKLQl1MTYgcmVhbF9jb250ZW50X2xlbiA9IDAsIG1heF9hdmFpbGFibGVfc2l6ZSA9IDA7Ci0JaW50IHJlcyA9IF9GQUlMOwotCWludCAoKnJ3OCkoc3RydWN0IHJ0d19hZGFwdGVyICosIHUxNiwgdTgqKTsKLQotCUVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbjIzYShwYWRhcHRlciwgRUZVU0VfV0lGSSwKLQkJCQkgVFlQRV9FRlVTRV9SRUFMX0NPTlRFTlRfTEVOLAotCQkJCSAodm9pZCAqKSZyZWFsX2NvbnRlbnRfbGVuKTsKLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24yM2EocGFkYXB0ZXIsIEVGVVNFX1dJRkksCi0JCQkJIFRZUEVfQVZBSUxBQkxFX0VGVVNFX0JZVEVTX1RPVEFMLAotCQkJCSAodm9pZCAqKSZtYXhfYXZhaWxhYmxlX3NpemUpOwotCi0JaWYgKHN0YXJ0X2FkZHIgPiByZWFsX2NvbnRlbnRfbGVuKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlpZiAodHJ1ZSA9PSBiV3JpdGUpIHsKLQkJaWYgKChzdGFydF9hZGRyICsgY250cykgPiBtYXhfYXZhaWxhYmxlX3NpemUpCi0JCQlyZXR1cm4gX0ZBSUw7Ci0JCXJ3OCA9ICZlZnVzZV93cml0ZTg7Ci0JfSBlbHNlCi0JCXJ3OCA9ICZlZnVzZV9yZWFkODsKLQotCUVmdXNlX1Bvd2VyU3dpdGNoKHBhZGFwdGVyLCBiV3JpdGUsIHRydWUpOwotCi0JLyogZS1mdXNlIG9uZSBieXRlIHJlYWQvd3JpdGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY250czsgaSsrKSB7Ci0JCWlmIChzdGFydF9hZGRyID49IHJlYWxfY29udGVudF9sZW4pIHsKLQkJCXJlcyA9IF9GQUlMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXMgPSBydzgocGFkYXB0ZXIsIHN0YXJ0X2FkZHIrKywgZGF0YSsrKTsKLQkJaWYgKHJlcyA9PSBfRkFJTCkKLQkJCWJyZWFrOwotCX0KLQotCUVmdXNlX1Bvd2VyU3dpdGNoKHBhZGFwdGVyLCBiV3JpdGUsIGZhbHNlKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLXUxNiBlZnVzZV9HZXRNYXhTaXplMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTE2IG1heF9zaXplOwotCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uMjNhKHBhZGFwdGVyLCBFRlVTRV9XSUZJLAotCQkJCSBUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19UT1RBTCwKLQkJCQkgKHZvaWQgKikmbWF4X3NpemUpOwotCXJldHVybiBtYXhfc2l6ZTsKLX0KLQotaW50IHJ0d19lZnVzZV9tYXBfcmVhZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICB1MTYgYWRkciwgdTE2IGNudHMsIHU4ICpkYXRhKQotewotCXUxNiBtYXBMZW4gPSAwOwotCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uMjNhKHBhZGFwdGVyLCBFRlVTRV9XSUZJLAotCQkJCSBUWVBFX0VGVVNFX01BUF9MRU4sICh2b2lkICopJm1hcExlbik7Ci0KLQlpZiAoKGFkZHIgKyBjbnRzKSA+IG1hcExlbikKLQkJcmV0dXJuIF9GQUlMOwotCi0JRWZ1c2VfUG93ZXJTd2l0Y2gocGFkYXB0ZXIsIGZhbHNlLCB0cnVlKTsKLQotCXJ0bDg3MjNhX3JlYWRlZnVzZShwYWRhcHRlciwgRUZVU0VfV0lGSSwgYWRkciwgY250cywgZGF0YSk7Ci0KLQlFZnVzZV9Qb3dlclN3aXRjaChwYWRhcHRlciwgZmFsc2UsIGZhbHNlKTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotaW50IHJ0d19CVF9lZnVzZV9tYXBfcmVhZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICB1MTYgYWRkciwgdTE2IGNudHMsIHU4ICpkYXRhKQotewotCXUxNiBtYXBMZW4gPSAwOwotCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uMjNhKHBhZGFwdGVyLCBFRlVTRV9CVCwKLQkJCQkgVFlQRV9FRlVTRV9NQVBfTEVOLCAodm9pZCAqKSZtYXBMZW4pOwotCi0JaWYgKChhZGRyICsgY250cykgPiBtYXBMZW4pCi0JCXJldHVybiBfRkFJTDsKLQotCUVmdXNlX1Bvd2VyU3dpdGNoKHBhZGFwdGVyLCBmYWxzZSwgdHJ1ZSk7Ci0KLQlydGw4NzIzYV9yZWFkZWZ1c2UocGFkYXB0ZXIsIEVGVVNFX0JULCBhZGRyLCBjbnRzLCBkYXRhKTsKLQotCUVmdXNlX1Bvd2VyU3dpdGNoKHBhZGFwdGVyLCBmYWxzZSwgZmFsc2UpOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi0vKiBSZWFkIEFsbCBFZnVzZSBjb250ZW50ICovCi1zdGF0aWMgdm9pZCBFZnVzZV9SZWFkQWxsTWFwKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHU4IGVmdXNlVHlwZSwKLQkJCSAgICAgdTggKkVmdXNlKQotewotCXUxNgltYXBMZW4gPSAwOwotCi0JRWZ1c2VfUG93ZXJTd2l0Y2gocEFkYXB0ZXIsIGZhbHNlLCB0cnVlKTsKLQotCUVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbjIzYShwQWRhcHRlciwgZWZ1c2VUeXBlLCBUWVBFX0VGVVNFX01BUF9MRU4sCi0JCQkJICh2b2lkICopJm1hcExlbik7Ci0KLQlydGw4NzIzYV9yZWFkZWZ1c2UocEFkYXB0ZXIsIGVmdXNlVHlwZSwgMCwgbWFwTGVuLCBFZnVzZSk7Ci0KLQlFZnVzZV9Qb3dlclN3aXRjaChwQWRhcHRlciwgZmFsc2UsIGZhbHNlKTsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uczoJZWZ1c2VfU2hhZG93UmVhZDFCeXRlCi0gKgkJZWZ1c2VfU2hhZG93UmVhZDJCeXRlCi0gKgkJZWZ1c2VfU2hhZG93UmVhZDRCeXRlCi0gKgotICogUmVhZCBmcm9tIGVmdXNlIGluaXQgbWFwIGJ5IG9uZS90d28vZm91ciBieXRlcwotICovCi1zdGF0aWMgdm9pZCBlZnVzZV9TaGFkb3dSZWFkMUJ5dGUoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTE2IE9mZnNldCwKLQkJCQkgIHU4ICpWYWx1ZSkKLXsKLQlzdHJ1Y3QgZWVwcm9tX3ByaXYgKnBFRVBST00gPSBHRVRfRUVQUk9NX0VGVVNFX1BSSVYocEFkYXB0ZXIpOwotCi0JKlZhbHVlID0gcEVFUFJPTS0+ZWZ1c2VfZWVwcm9tX2RhdGFbT2Zmc2V0XTsKLX0KLQotc3RhdGljIHZvaWQgZWZ1c2VfU2hhZG93UmVhZDJCeXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHUxNiBPZmZzZXQsCi0JCQkJICB1MTYgKlZhbHVlKQotewotCXN0cnVjdCBlZXByb21fcHJpdiAqcEVFUFJPTSA9IEdFVF9FRVBST01fRUZVU0VfUFJJVihwQWRhcHRlcik7Ci0KLQkqVmFsdWUgPSBwRUVQUk9NLT5lZnVzZV9lZXByb21fZGF0YVtPZmZzZXRdOwotCSpWYWx1ZSB8PSBwRUVQUk9NLT5lZnVzZV9lZXByb21fZGF0YVtPZmZzZXQrMV08PDg7Ci19Ci0KLXN0YXRpYyB2b2lkIGVmdXNlX1NoYWRvd1JlYWQ0Qnl0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MTYgT2Zmc2V0LAotCQkJCSAgdTMyICpWYWx1ZSkKLXsKLQlzdHJ1Y3QgZWVwcm9tX3ByaXYgKnBFRVBST00gPSBHRVRfRUVQUk9NX0VGVVNFX1BSSVYocEFkYXB0ZXIpOwotCi0JKlZhbHVlID0gcEVFUFJPTS0+ZWZ1c2VfZWVwcm9tX2RhdGFbT2Zmc2V0XTsKLQkqVmFsdWUgfD0gcEVFUFJPTS0+ZWZ1c2VfZWVwcm9tX2RhdGFbT2Zmc2V0KzFdPDw4OwotCSpWYWx1ZSB8PSBwRUVQUk9NLT5lZnVzZV9lZXByb21fZGF0YVtPZmZzZXQrMl08PDE2OwotCSpWYWx1ZSB8PSBwRUVQUk9NLT5lZnVzZV9lZXByb21fZGF0YVtPZmZzZXQrM108PDI0OwotfQotCi0vKiBUcmFuc2ZlciBjdXJyZW50IEVGVVNFIGNvbnRlbnQgdG8gc2hhZG93IGluaXQgYW5kIG1vZGlmeSBtYXAuICovCi12b2lkIEVGVVNFX1NoYWRvd01hcFVwZGF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBlZnVzZVR5cGUpCi17Ci0Jc3RydWN0IGVlcHJvbV9wcml2ICpwRUVQUk9NID0gR0VUX0VFUFJPTV9FRlVTRV9QUklWKHBBZGFwdGVyKTsKLQl1MTYJbWFwTGVuID0gMDsKLQotCUVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbjIzYShwQWRhcHRlciwgZWZ1c2VUeXBlLAotCQkJCSBUWVBFX0VGVVNFX01BUF9MRU4sICh2b2lkICopJm1hcExlbik7Ci0KLQlpZiAocEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyA9PSB0cnVlKQotCQltZW1zZXQocEVFUFJPTS0+ZWZ1c2VfZWVwcm9tX2RhdGEsIDB4RkYsIG1hcExlbik7Ci0JZWxzZQotCQlFZnVzZV9SZWFkQWxsTWFwKHBBZGFwdGVyLCBlZnVzZVR5cGUsCi0JCQkJIHBFRVBST00tPmVmdXNlX2VlcHJvbV9kYXRhKTsKLX0KLQotLyogUmVhZCBmcm9tIGVmdXNlIGluaXQgbWFwICovCi12b2lkIEVGVVNFX1NoYWRvd1JlYWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTggVHlwZSwKLQkJCSB1MTYgT2Zmc2V0LCB1MzIgKlZhbHVlKQotewotCWlmIChUeXBlID09IDEpCi0JCWVmdXNlX1NoYWRvd1JlYWQxQnl0ZShwQWRhcHRlciwgT2Zmc2V0LCAodTggKilWYWx1ZSk7Ci0JZWxzZSBpZiAoVHlwZSA9PSAyKQotCQllZnVzZV9TaGFkb3dSZWFkMkJ5dGUocEFkYXB0ZXIsIE9mZnNldCwgKHUxNiAqKVZhbHVlKTsKLQllbHNlIGlmIChUeXBlID09IDQpCi0JCWVmdXNlX1NoYWRvd1JlYWQ0Qnl0ZShwQWRhcHRlciwgT2Zmc2V0LCAodTMyICopVmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19pZWVlODAyMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfaWVlZTgwMjExLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YTY0OTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19pZWVlODAyMTEuYworKysgL2Rldi9udWxsCkBAIC0xLDg1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0lFRUU4MDIxMV9DCi0KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KLSNpbmNsdWRlIDxpZWVlODAyMTEuaD4KLSNpbmNsdWRlIDx3aWZpLmg+Ci0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPHdsYW5fYnNzZGVmLmg+Ci0KLXU4IFJUV19XUEFfT1VJMjNBX1RZUEVbXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMSB9OwotdTE2IFJUV19XUEFfVkVSU0lPTjIzQSA9IDE7Ci11OCBXUEFfQVVUSF9LRVlfTUdNVF9OT05FMjNBW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDAgfTsKLXU4IFdQQV9BVVRIX0tFWV9NR01UX1VOU1BFQ184MDJfMVgyM0FbXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMSB9OwotdTggV1BBX0FVVEhfS0VZX01HTVRfUFNLX09WRVJfODAyXzFYMjNBW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDIgfTsKLXU4IFdQQV9DSVBIRVJfU1VJVEVfTk9ORTIzQVtdID0geyAweDAwLCAweDUwLCAweGYyLCAwIH07Ci11OCBXUEFfQ0lQSEVSX1NVSVRFX1dFUDQwMjNBW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDEgfTsKLXU4IFdQQV9DSVBIRVJfU1VJVEVfVEtJUDIzQVtdID0geyAweDAwLCAweDUwLCAweGYyLCAyIH07Ci11OCBXUEFfQ0lQSEVSX1NVSVRFX1dSQVAyM0FbXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMyB9OwotdTggV1BBX0NJUEhFUl9TVUlURV9DQ01QMjNBW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDQgfTsKLXU4IFdQQV9DSVBIRVJfU1VJVEVfV0VQMTA0MjNBW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDUgfTsKLQotdTggUlNOX0FVVEhfS0VZX01HTVRfVU5TUEVDXzgwMl8xWDIzQVtdID0geyAweDAwLCAweDBmLCAweGFjLCAxIH07Ci11OCBSU05fQVVUSF9LRVlfTUdNVF9QU0tfT1ZFUl84MDJfMVgyM0FbXSA9IHsgMHgwMCwgMHgwZiwgMHhhYywgMiB9OwotdTggUlNOX0NJUEhFUl9TVUlURV9OT05FMjNBW10gPSB7IDB4MDAsIDB4MGYsIDB4YWMsIDAgfTsKLXU4IFJTTl9DSVBIRVJfU1VJVEVfV0VQNDAyM0FbXSA9IHsgMHgwMCwgMHgwZiwgMHhhYywgMSB9OwotdTggUlNOX0NJUEhFUl9TVUlURV9US0lQMjNBW10gPSB7IDB4MDAsIDB4MGYsIDB4YWMsIDIgfTsKLXU4IFJTTl9DSVBIRVJfU1VJVEVfV1JBUDIzQVtdID0geyAweDAwLCAweDBmLCAweGFjLCAzIH07Ci11OCBSU05fQ0lQSEVSX1NVSVRFX0NDTVAyM0FbXSA9IHsgMHgwMCwgMHgwZiwgMHhhYywgNCB9OwotdTggUlNOX0NJUEhFUl9TVUlURV9XRVAxMDQyM0FbXSA9IHsgMHgwMCwgMHgwZiwgMHhhYywgNSB9OwotLyogICovCi0vKiAgZm9yIGFkaG9jLW1hc3RlciB0byBnZW5lcmF0ZSBpZSBhbmQgcHJvdmlkZSBzdXBwb3J0ZWQtcmF0ZSB0byBmdyAqLwotLyogICovCi0KLXN0YXRpYyB1OCBXSUZJX0NDS1JBVEVTW10gPSB7Ci0JSUVFRTgwMjExX0NDS19SQVRFXzFNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0ssCi0JSUVFRTgwMjExX0NDS19SQVRFXzJNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0ssCi0JSUVFRTgwMjExX0NDS19SQVRFXzVNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0ssCi0JSUVFRTgwMjExX0NDS19SQVRFXzExTUIgfCBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLCi19OwotCi1zdGF0aWMgdTggV0lGSV9PRkRNUkFURVNbXSA9IHsKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzZNQiwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzlNQiwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUIsCi0JSUVFRTgwMjExX09GRE1fUkFURV8xOE1CLAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQiwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUIsCi0JSUVFRTgwMjExX09GRE1fUkFURV80OE1CLAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQgotfTsKLQotaW50IHJ0d19nZXRfYml0X3ZhbHVlX2Zyb21faWVlZV92YWx1ZTIzYSh1OCB2YWwpCi17Ci0JdW5zaWduZWQgY2hhciBkb3QxMV9yYXRlX3RhYmxlW109Ci0JCXsyLCA0LCAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDgsIDB9OwotCi0JaW50IGkgPSAwOwotCi0Jd2hpbGUgKGRvdDExX3JhdGVfdGFibGVbaV0gIT0gMCkgewotCQlpZiAoZG90MTFfcmF0ZV90YWJsZVtpXSA9PSB2YWwpCi0JCQlyZXR1cm4gQklUKGkpOwotCQlpKys7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbCBydHdfaXNfY2NrcmF0ZXNfaW5jbHVkZWQodTggKnJhdGUpCi17Ci0JdTMyIGkgPSAwOwotCi0Jd2hpbGUgKHJhdGVbaV0pIHsKLQkJaWYgKChyYXRlW2ldICYgMHg3ZikgPT0gMiB8fCAocmF0ZVtpXSAmIDB4N2YpID09IDQgfHwKLQkJICAgIChyYXRlW2ldICYgMHg3ZikgPT0gMTEgfHwgKHJhdGVbaV0gJiAweDdmKSA9PSAyMikKLQkJCXJldHVybiB0cnVlOwotCQlpKys7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBydHdfaXNfY2NrcmF0ZXNvbmx5X2luY2x1ZGVkKHU4ICpyYXRlKQotewotCXUzMiBpID0gMDsKLQotCXdoaWxlIChyYXRlW2ldKSB7Ci0JCWlmICgocmF0ZVtpXSAmIDB4N2YpICE9IDIgJiYgKHJhdGVbaV0gJiAweDdmKSAhPSA0ICYmCi0JCSAgICAocmF0ZVtpXSAmIDB4N2YpICE9IDExICYmIChyYXRlW2ldICYgMHg3ZikgIT0gMjIpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaSsrOwotCX0KLQotCXJldHVybiB0cnVlOwotfQotCi1pbnQgcnR3X2NoZWNrX25ldHdvcmtfdHlwZTIzYSh1bnNpZ25lZCBjaGFyICpyYXRlLCBpbnQgcmF0ZWxlbiwgaW50IGNoYW5uZWwpCi17Ci0JaWYgKGNoYW5uZWwgPiAxNCkgewotCQlpZiAocnR3X2lzX2Nja3JhdGVzX2luY2x1ZGVkKHJhdGUpKQotCQkJcmV0dXJuIFdJUkVMRVNTX0lOVkFMSUQ7Ci0JCWVsc2UKLQkJCXJldHVybiBXSVJFTEVTU18xMUE7Ci0JfSBlbHNlIHsgIC8qICBjb3VsZCBiZSBwdXJlIEIsIHB1cmUgRywgb3IgQi9HICovCi0JCWlmIChydHdfaXNfY2NrcmF0ZXNvbmx5X2luY2x1ZGVkKHJhdGUpKQotCQkJcmV0dXJuIFdJUkVMRVNTXzExQjsKLQkJZWxzZSBpZiAocnR3X2lzX2Nja3JhdGVzX2luY2x1ZGVkKHJhdGUpKQotCQkJcmV0dXJuCVdJUkVMRVNTXzExQkc7Ci0JCWVsc2UKLQkJCXJldHVybiBXSVJFTEVTU18xMUc7Ci0JfQotfQotCi0vKiAgcnR3X3NldF9pZTIzYSB3aWxsIHVwZGF0ZSBmcmFtZSBsZW5ndGggKi8KLXU4ICpydHdfc2V0X2llMjNhKHU4ICpwYnVmLCBpbnQgaW5kZXgsIHVpbnQgbGVuLCBjb25zdCB1OCAqc291cmNlLCB1aW50ICpmcmxlbikKLXsKLQotCSpwYnVmID0gKHU4KWluZGV4OwotCi0JKihwYnVmICsgMSkgPSAodTgpbGVuOwotCi0JaWYgKGxlbiA+IDApCi0JCW1lbWNweSgodm9pZCAqKShwYnVmICsgMiksICh2b2lkICopc291cmNlLCBsZW4pOwotCi0JKmZybGVuID0gKmZybGVuICsgKGxlbiArIDIpOwotCi0JcmV0dXJuIHBidWYgKyBsZW4gKyAyOwotfQotCi1pbmxpbmUgdTggKnJ0d19zZXRfaWUyM2FfY2hfc3dpdGNoICh1OCAqYnVmLCB1MzIgKmJ1Zl9sZW4sIHU4IGNoX3N3aXRjaF9tb2RlLAotCQkJCXU4IG5ld19jaCwgdTggY2hfc3dpdGNoX2NudCkKLXsKLQl1OCBpZV9kYXRhWzNdOwotCi0JaWVfZGF0YVswXSA9IGNoX3N3aXRjaF9tb2RlOwotCWllX2RhdGFbMV0gPSBuZXdfY2g7Ci0JaWVfZGF0YVsyXSA9IGNoX3N3aXRjaF9jbnQ7Ci0JcmV0dXJuIHJ0d19zZXRfaWUyM2EoYnVmLCBXTEFOX0VJRF9DSEFOTkVMX1NXSVRDSCwgIDMsIGllX2RhdGEsIGJ1Zl9sZW4pOwotfQotCi1pbmxpbmUgdTggaGFsX2NoX29mZnNldF90b19zZWNvbmRhcnlfY2hfb2Zmc2V0MjNhKHU4IGNoX29mZnNldCkKLXsKLQlpZiAoY2hfb2Zmc2V0ID09IEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUikKLQkJcmV0dXJuIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOwotCWVsc2UgaWYgKGNoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIpCi0JCXJldHVybiBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRTsKLQotCXJldHVybiBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19OT05FOwotfQotCi1pbmxpbmUgdTggKnJ0d19zZXRfaWUyM2Ffc2Vjb25kYXJ5X2NoX29mZnNldCh1OCAqYnVmLCB1MzIgKmJ1Zl9sZW4sCi0JCQkJCSAgdTggc2Vjb25kYXJ5X2NoX29mZnNldCkKLXsKLQlyZXR1cm4gcnR3X3NldF9pZTIzYShidWYsIFdMQU5fRUlEX1NFQ09OREFSWV9DSEFOTkVMX09GRlNFVCwKLQkJCSAgMSwgJnNlY29uZGFyeV9jaF9vZmZzZXQsIGJ1Zl9sZW4pOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWluZGV4OiB0aGUgaW5mb3JtYXRpb24gZWxlbWVudCBpZCBpbmRleCwgbGltaXQgaXMgdGhlIGxpbWl0IGZvciBzZWFyY2gKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXU4ICpydHdfZ2V0X2llMjNhKHU4ICpwYnVmLCBpbnQgaW5kZXgsIGludCAqbGVuLCBpbnQgbGltaXQpCi17Ci0JaW50IHRtcCwgaTsKLQl1OCAqcDsKLQotCWlmIChsaW1pdCA8IDEpIHsKLQotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlwID0gcGJ1ZjsKLQlpID0gMDsKLQkqbGVuID0gMDsKLQl3aGlsZSAoMSkgewotCQlpZiAoKnAgPT0gaW5kZXgpIHsKLQkJCSpsZW4gPSAqKHAgKyAxKTsKLQkJCXJldHVybiBwOwotCQl9IGVsc2UgewotCQkJdG1wID0gKihwICsgMSk7Ci0JCQlwICs9ICh0bXAgKyAyKTsKLQkJCWkgKz0gKHRtcCArIDIpOwotCQl9Ci0JCWlmIChpID49IGxpbWl0KQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKgotICogcnR3X2dldF9pZTIzYV9leCAtIFNlYXJjaCBzcGVjaWZpYyBJRSBmcm9tIGEgc2VyaWVzIG9mIElFcwotICogQGluX2llOiBBZGRyZXNzIG9mIElFcyB0byBzZWFyY2gKLSAqIEBpbl9sZW46IExlbmd0aCBsaW1pdCBmcm9tIGluX2llCi0gKiBAZWlkOiBFbGVtZW50IElEIHRvIG1hdGNoCi0gKiBAb3VpOiBPVUkgdG8gbWF0Y2gKLSAqIEBvdWlfbGVuOiBPVUkgbGVuZ3RoCi0gKiBAaWU6IElmIG5vdCBOVUxMIGFuZCB0aGUgc3BlY2lmaWMgSUUgaXMgZm91bmQsIHRoZSBJRSB3aWxsIGJlIGNvcGllZAotICogICAgICB0byB0aGUgYnVmIHN0YXJ0aW5nIGZyb20gdGhlIHNwZWNpZmljIElFCi0gKiBAaWVsZW46IElmIG5vdCBOVUxMIGFuZCB0aGUgc3BlY2lmaWMgSUUgaXMgZm91bmQsIHdpbGwgc2V0IHRvIHRoZSBsZW5ndGgKLSAqICAgICAgICAgb2YgdGhlIGVudGlyZSBJRQotICoKLSAqIFJldHVybnM6IFRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpYyBJRSBmb3VuZCwgb3IgTlVMTAotICovCi11OCAqcnR3X2dldF9pZTIzYV9leCh1OCAqaW5faWUsIHVpbnQgaW5fbGVuLCB1OCBlaWQsIHU4ICpvdWksIHU4IG91aV9sZW4sCi0JCSAgdTggKmllLCB1aW50ICppZWxlbikKLXsKLQl1aW50IGNudDsKLQl1OCAqdGFyZ2V0X2llID0gTlVMTDsKLQotCWlmIChpZWxlbikKLQkJKmllbGVuID0gMDsKLQotCWlmICghaW5faWUgfHwgaW5fbGVuIDw9IDApCi0JCXJldHVybiB0YXJnZXRfaWU7Ci0KLQljbnQgPSAwOwotCi0Jd2hpbGUgKGNudCA8IGluX2xlbikgewotCQlpZiAoZWlkID09IGluX2llW2NudF0gJiYKLQkJICAgICghb3VpIHx8ICFtZW1jbXAoJmluX2llW2NudCsyXSwgb3VpLCBvdWlfbGVuKSkpIHsKLQkJCXRhcmdldF9pZSA9ICZpbl9pZVtjbnRdOwotCi0JCQlpZiAoaWUpCi0JCQkJbWVtY3B5KGllLCAmaW5faWVbY250XSwgaW5faWVbY250KzFdKzIpOwotCi0JCQlpZiAoaWVsZW4pCi0JCQkJKmllbGVuID0gaW5faWVbY250KzFdKzI7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCWNudCArPSBpbl9pZVtjbnQgKyAxXSArIDI7IC8qIGdvdG8gbmV4dCAqLwotCQl9Ci0JfQotCi0JcmV0dXJuIHRhcmdldF9pZTsKLX0KLQotLyoqCi0gKiBydHdfaWVzX3JlbW92ZV9pZTIzYSAtIEZpbmQgbWF0Y2hpbmcgSUVzIGFuZCByZW1vdmUKLSAqIEBpZXM6IEFkZHJlc3Mgb2YgSUVzIHRvIHNlYXJjaAotICogQGllc19sZW46IFBvaW50ZXIgb2YgbGVuZ3RoIG9mIGllcywgd2lsbCB1cGRhdGUgdG8gbmV3IGxlbmd0aAotICogQG9mZnNldDogVGhlIG9mZnNldCB0byBzdGFydCBzZWFyY2gKLSAqIEBlaWQ6IEVsZW1lbnQgSUQgdG8gbWF0Y2gKLSAqIEBvdWk6IE9VSSB0byBtYXRjaAotICogQG91aV9sZW46IE9VSSBsZW5ndGgKLSAqCi0gKiBSZXR1cm5zOiBfU1VDQ0VTUzogaWVzIGlzIHVwZGF0ZWQsIF9GQUlMOiBub3QgdXBkYXRlZAotICovCi1pbnQgcnR3X2llc19yZW1vdmVfaWUyM2EodTggKmllcywgdWludCAqaWVzX2xlbiwgdWludCBvZmZzZXQsIHU4IGVpZCwKLQkJICAgICAgdTggKm91aSwgdTggb3VpX2xlbikKLXsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0JdTggKnRhcmdldF9pZTsKLQl1MzIgdGFyZ2V0X2llbGVuOwotCXU4ICpzdGFydDsKLQl1aW50IHNlYXJjaF9sZW47Ci0KLQlpZiAoIWllcyB8fCAhaWVzX2xlbiB8fCAqaWVzX2xlbiA8PSBvZmZzZXQpCi0JCWdvdG8gZXhpdDsKLQotCXN0YXJ0ID0gaWVzICsgb2Zmc2V0OwotCXNlYXJjaF9sZW4gPSAqaWVzX2xlbiAtIG9mZnNldDsKLQotCXdoaWxlICgxKSB7Ci0JCXRhcmdldF9pZSA9IHJ0d19nZXRfaWUyM2FfZXgoc3RhcnQsIHNlYXJjaF9sZW4sIGVpZCwgb3VpLCBvdWlfbGVuLAotCQkJCQkgIE5VTEwsICZ0YXJnZXRfaWVsZW4pOwotCQlpZiAodGFyZ2V0X2llICYmIHRhcmdldF9pZWxlbikgewotCQkJdTggYnVmW01BWF9JRV9TWl0gPSB7MH07Ci0JCQl1OCAqcmVtYWluX2llcyA9IHRhcmdldF9pZSArIHRhcmdldF9pZWxlbjsKLQkJCXVpbnQgcmVtYWluX2xlbiA9IHNlYXJjaF9sZW4gLSAocmVtYWluX2llcyAtIHN0YXJ0KTsKLQotCQkJbWVtY3B5KGJ1ZiwgcmVtYWluX2llcywgcmVtYWluX2xlbik7Ci0JCQltZW1jcHkodGFyZ2V0X2llLCBidWYsIHJlbWFpbl9sZW4pOwotCQkJKmllc19sZW4gPSAqaWVzX2xlbiAtIHRhcmdldF9pZWxlbjsKLQkJCXJldCA9IF9TVUNDRVNTOwotCi0JCQlzdGFydCA9IHRhcmdldF9pZTsKLQkJCXNlYXJjaF9sZW4gPSByZW1haW5fbGVuOwotCQl9IGVsc2UgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgcnR3X3NldF9zdXBwb3J0ZWRfcmF0ZTIzYSh1OCAqU3VwcG9ydGVkUmF0ZXMsIHVpbnQgbW9kZSkKLXsKLQotCi0JbWVtc2V0KFN1cHBvcnRlZFJhdGVzLCAwLCBORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVgpOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBXSVJFTEVTU18xMUI6Ci0JCW1lbWNweShTdXBwb3J0ZWRSYXRlcywgV0lGSV9DQ0tSQVRFUywgSUVFRTgwMjExX0NDS19SQVRFX0xFTik7Ci0JCWJyZWFrOwotCi0JY2FzZSBXSVJFTEVTU18xMUc6Ci0JY2FzZSBXSVJFTEVTU18xMUE6Ci0JY2FzZSBXSVJFTEVTU18xMV81TjoKLQljYXNlIFdJUkVMRVNTXzExQV81TjovKiBUb2RvOiBubyBiYXNpYyByYXRlIGZvciBvZmRtID8gKi8KLQkJbWVtY3B5KFN1cHBvcnRlZFJhdGVzLCBXSUZJX09GRE1SQVRFUywKLQkJICAgICAgIElFRUU4MDIxMV9OVU1fT0ZETV9SQVRFU0xFTik7Ci0JCWJyZWFrOwotCi0JY2FzZSBXSVJFTEVTU18xMUJHOgotCWNhc2UgV0lSRUxFU1NfMTFHXzI0TjoKLQljYXNlIFdJUkVMRVNTXzExXzI0TjoKLQljYXNlIFdJUkVMRVNTXzExQkdfMjROOgotCQltZW1jcHkoU3VwcG9ydGVkUmF0ZXMsIFdJRklfQ0NLUkFURVMsIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4pOwotCQltZW1jcHkoU3VwcG9ydGVkUmF0ZXMgKyBJRUVFODAyMTFfQ0NLX1JBVEVfTEVOLCBXSUZJX09GRE1SQVRFUywKLQkJICAgICAgIElFRUU4MDIxMV9OVU1fT0ZETV9SQVRFU0xFTik7Ci0JCWJyZWFrOwotCX0KLQotfQotCi11aW50IHJ0d19nZXRfcmF0ZXNldF9sZW4yM2EodTggKnJhdGVzZXQpCi17Ci0JdWludCBpID0gMDsKLQotCXdoaWxlKDEpIHsKLQkJaWYgKHJhdGVzZXRbaV0gPT0gMCkKLQkJCWJyZWFrOwotCi0JCWlmIChpID4gMTIpCi0JCQlicmVhazsKLQotCQlpKys7Ci0JfQotCi0JcmV0dXJuIGk7Ci19Ci0KLWludCBydHdfZ2VuZXJhdGVfaWUyM2Eoc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYpCi17Ci0JdTgJd2lyZWxlc3NfbW9kZTsKLQlpbnQJc3ogPSAwLCByYXRlTGVuOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwZGV2X25ldHdvcmsgPSAmcHJlZ2lzdHJ5cHJpdi0+ZGV2X25ldHdvcms7Ci0JdTgJKmllID0gcGRldl9uZXR3b3JrLT5JRXM7Ci0JdTE2CWNhcDsKLQotCXBkZXZfbmV0d29yay0+dHNmID0gMDsKLQotCWNhcCA9IFdMQU5fQ0FQQUJJTElUWV9JQlNTOwotCi0JaWYgKHByZWdpc3RyeXByaXYtPnByZWFtYmxlID09IFBSRUFNQkxFX1NIT1JUKQotCQljYXAgfD0gV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFOwotCi0JaWYgKHBkZXZfbmV0d29yay0+UHJpdmFjeSkKLQkJY2FwIHw9IFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZOwotCi0JcGRldl9uZXR3b3JrLT5jYXBhYmlsaXR5ID0gY2FwOwotCi0JLyogU1NJRCAqLwotCWllID0gcnR3X3NldF9pZTIzYShpZSwgV0xBTl9FSURfU1NJRCwgcGRldl9uZXR3b3JrLT5Tc2lkLnNzaWRfbGVuLAotCQkJcGRldl9uZXR3b3JrLT5Tc2lkLnNzaWQsICZzeik7Ci0KLQkvKiBzdXBwb3J0ZWQgcmF0ZXMgKi8KLQlpZiAocHJlZ2lzdHJ5cHJpdi0+d2lyZWxlc3NfbW9kZSA9PSBXSVJFTEVTU18xMUFCR04pIHsKLQkJaWYgKHBkZXZfbmV0d29yay0+RFNDb25maWcgPiAxNCkKLQkJCXdpcmVsZXNzX21vZGUgPSBXSVJFTEVTU18xMUFfNU47Ci0JCWVsc2UKLQkJCXdpcmVsZXNzX21vZGUgPSBXSVJFTEVTU18xMUJHXzI0TjsKLQl9IGVsc2UgewotCQl3aXJlbGVzc19tb2RlID0gcHJlZ2lzdHJ5cHJpdi0+d2lyZWxlc3NfbW9kZTsKLQl9Ci0KLQlydHdfc2V0X3N1cHBvcnRlZF9yYXRlMjNhKHBkZXZfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsIHdpcmVsZXNzX21vZGUpIDsKLQotCXJhdGVMZW4gPSBydHdfZ2V0X3JhdGVzZXRfbGVuMjNhKHBkZXZfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCi0JaWYgKHJhdGVMZW4gPiA4KSB7Ci0JCWllID0gcnR3X3NldF9pZTIzYShpZSwgV0xBTl9FSURfU1VQUF9SQVRFUywgOCwKLQkJCQlwZGV2X25ldHdvcmstPlN1cHBvcnRlZFJhdGVzLCAmc3opOwotCQkvKiBpZSA9IHJ0d19zZXRfaWUyM2EoaWUsIF9FWFRfU1VQUE9SVEVEUkFURVNfSUVfLCAocmF0ZUxlbiAtIDgpLCAocGRldl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcyArIDgpLCAmc3opOyAqLwotCX0gZWxzZSB7Ci0JCWllID0gcnR3X3NldF9pZTIzYShpZSwgV0xBTl9FSURfU1VQUF9SQVRFUywgcmF0ZUxlbiwKLQkJCQlwZGV2X25ldHdvcmstPlN1cHBvcnRlZFJhdGVzLCAmc3opOwotCX0KLQotCS8qIERTIHBhcmFtZXRlciBzZXQgKi8KLQlpZSA9IHJ0d19zZXRfaWUyM2EoaWUsIFdMQU5fRUlEX0RTX1BBUkFNUywgMSwKLQkJCSAgICh1OCAqKSZwZGV2X25ldHdvcmstPkRTQ29uZmlnLCAmc3opOwotCi0JLyogSUJTUyBQYXJhbWV0ZXIgU2V0ICovCi0KLQlpZSA9IHJ0d19zZXRfaWUyM2EoaWUsIFdMQU5fRUlEX0lCU1NfUEFSQU1TLCAyLAotCQkJICAgKHU4ICopJnBkZXZfbmV0d29yay0+QVRJTVdpbmRvdywgJnN6KTsKLQotCWlmIChyYXRlTGVuID4gOCkgewotCQlpZSA9IHJ0d19zZXRfaWUyM2EoaWUsIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTLCAocmF0ZUxlbiAtIDgpLAotCQkJCShwZGV2X25ldHdvcmstPlN1cHBvcnRlZFJhdGVzICsgOCksICZzeik7Ci0JfQotCi0KLQotCS8qIHJldHVybiBfU1VDQ0VTUzsgKi8KLQotCXJldHVybiBzejsKLX0KLQotc3RhdGljIGludCBydHdfZ2V0X3dwYV9jaXBoZXJfc3VpdGUoY29uc3QgdTggKnMpCi17Ci0JaWYgKCFtZW1jbXAocywgV1BBX0NJUEhFUl9TVUlURV9OT05FMjNBLCBXUEFfU0VMRUNUT1JfTEVOKSkKLQkJcmV0dXJuIFdQQV9DSVBIRVJfTk9ORTsKLQlpZiAoIW1lbWNtcChzLCBXUEFfQ0lQSEVSX1NVSVRFX1dFUDQwMjNBLCBXUEFfU0VMRUNUT1JfTEVOKSkKLQkJcmV0dXJuIFdQQV9DSVBIRVJfV0VQNDA7Ci0JaWYgKCFtZW1jbXAocywgV1BBX0NJUEhFUl9TVUlURV9US0lQMjNBLCBXUEFfU0VMRUNUT1JfTEVOKSkKLQkJcmV0dXJuIFdQQV9DSVBIRVJfVEtJUDsKLQlpZiAoIW1lbWNtcChzLCBXUEFfQ0lQSEVSX1NVSVRFX0NDTVAyM0EsIFdQQV9TRUxFQ1RPUl9MRU4pKQotCQlyZXR1cm4gV1BBX0NJUEhFUl9DQ01QOwotCWlmICghbWVtY21wKHMsIFdQQV9DSVBIRVJfU1VJVEVfV0VQMTA0MjNBLCBXUEFfU0VMRUNUT1JfTEVOKSkKLQkJcmV0dXJuIFdQQV9DSVBIRVJfV0VQMTA0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2dldF93cGEyX2NpcGhlcl9zdWl0ZShjb25zdCB1OCAqcykKLXsKLQlpZiAoIW1lbWNtcChzLCBSU05fQ0lQSEVSX1NVSVRFX05PTkUyM0EsIFJTTl9TRUxFQ1RPUl9MRU4pKQotCQlyZXR1cm4gV1BBX0NJUEhFUl9OT05FOwotCWlmICghbWVtY21wKHMsIFJTTl9DSVBIRVJfU1VJVEVfV0VQNDAyM0EsIFJTTl9TRUxFQ1RPUl9MRU4pKQotCQlyZXR1cm4gV1BBX0NJUEhFUl9XRVA0MDsKLQlpZiAoIW1lbWNtcChzLCBSU05fQ0lQSEVSX1NVSVRFX1RLSVAyM0EsIFJTTl9TRUxFQ1RPUl9MRU4pKQotCQlyZXR1cm4gV1BBX0NJUEhFUl9US0lQOwotCWlmICghbWVtY21wKHMsIFJTTl9DSVBIRVJfU1VJVEVfQ0NNUDIzQSwgUlNOX1NFTEVDVE9SX0xFTikpCi0JCXJldHVybiBXUEFfQ0lQSEVSX0NDTVA7Ci0JaWYgKCFtZW1jbXAocywgUlNOX0NJUEhFUl9TVUlURV9XRVAxMDQyM0EsIFJTTl9TRUxFQ1RPUl9MRU4pKQotCQlyZXR1cm4gV1BBX0NJUEhFUl9XRVAxMDQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHJ0d19wYXJzZV93cGFfaWUyM2EoY29uc3QgdTggKndwYV9pZSwgaW50IHdwYV9pZV9sZW4sIGludCAqZ3JvdXBfY2lwaGVyLAotCQkJaW50ICpwYWlyd2lzZV9jaXBoZXIsIGludCAqaXNfODAyMXgpCi17Ci0JaW50IGksIHJldCA9IF9TVUNDRVNTOwotCWludCBsZWZ0LCBjb3VudDsKLQljb25zdCB1OCAqcG9zOwotCi0JaWYgKHdwYV9pZV9sZW4gPD0gMCkgewotCQkvKiBObyBXUEEgSUUgLSBmYWlsIHNpbGVudGx5ICovCi0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlpZiAod3BhX2llWzFdICE9ICh1OCkod3BhX2llX2xlbiAtIDIpKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlwb3MgPSB3cGFfaWU7Ci0KLQlwb3MgKz0gODsKLQlsZWZ0ID0gd3BhX2llX2xlbiAtIDg7Ci0KLQkvKiBncm91cF9jaXBoZXIgKi8KLQlpZiAobGVmdCA+PSBXUEFfU0VMRUNUT1JfTEVOKSB7Ci0KLQkJKmdyb3VwX2NpcGhlciA9IHJ0d19nZXRfd3BhX2NpcGhlcl9zdWl0ZShwb3MpOwotCi0JCXBvcyArPSBXUEFfU0VMRUNUT1JfTEVOOwotCQlsZWZ0IC09IFdQQV9TRUxFQ1RPUl9MRU47Ci0JfSBlbHNlIGlmIChsZWZ0ID4gMCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICIlczogaWUgbGVuZ3RoIG1pc21hdGNoLCAldSB0b28gbXVjaFxuIiwKLQkJCSBfX2Z1bmNfXywgbGVmdCk7Ci0KLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCS8qIHBhaXJ3aXNlX2NpcGhlciAqLwotCWlmIChsZWZ0ID49IDIpIHsKLSAgICAgICAgICAgICAgICAvKiBjb3VudCA9IGxlMTZfdG9fY3B1KCoodTE2Kilwb3MpOyAqLwotCQljb3VudCA9IGdldF91bmFsaWduZWRfbGUxNihwb3MpOwotCQlwb3MgKz0gMjsKLQkJbGVmdCAtPSAyOwotCi0JCWlmIChjb3VudCA9PSAwIHx8IGxlZnQgPCBjb3VudCAqIFdQQV9TRUxFQ1RPUl9MRU4pIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICIlczogaWUgY291bnQgYm90Y2ggKHBhaXJ3aXNlKSwgY291bnQgJXUgbGVmdCAldVxuIiwKLQkJCQkgX19mdW5jX18sIGNvdW50LCBsZWZ0KTsKLQkJCXJldHVybiBfRkFJTDsKLQkJfQotCi0JCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkqcGFpcndpc2VfY2lwaGVyIHw9IHJ0d19nZXRfd3BhX2NpcGhlcl9zdWl0ZShwb3MpOwotCi0JCQlwb3MgKz0gV1BBX1NFTEVDVE9SX0xFTjsKLQkJCWxlZnQgLT0gV1BBX1NFTEVDVE9SX0xFTjsKLQkJfQotCX0gZWxzZSBpZiAobGVmdCA9PSAxKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOiBpZSB0b28gc2hvcnQgKGZvciBrZXkgbWdtdClcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCWlmIChpc184MDIxeCkgewotCQlpZiAobGVmdCA+PSA2KSB7Ci0JCQlwb3MgKz0gMjsKLQkJCWlmICghbWVtY21wKHBvcywgUlRXX1dQQV9PVUkyM0FfVFlQRSwgNCkpIHsKLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCQkJICIlcyA6IHRoZXJlIGhhcyA4MDIuMXggYXV0aFxuIiwKLQkJCQkJIF9fZnVuY19fKTsKLQkJCQkqaXNfODAyMXggPSAxOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJ0d19wYXJzZV93cGEyX2llMjNhKGNvbnN0IHU4ICpyc25faWUsIGludCByc25faWVfbGVuLCBpbnQgKmdyb3VwX2NpcGhlciwKLQkJICAgICAgaW50ICpwYWlyd2lzZV9jaXBoZXIsIGludCAqaXNfODAyMXgpCi17Ci0JaW50IGksIHJldCA9IF9TVUNDRVNTOwotCWludCBsZWZ0LCBjb3VudDsKLQljb25zdCB1OCAqcG9zOwotCXU4IFNVSVRFXzFYWzRdID0gezB4MDAsIDB4MGYsIDB4YWMsIDB4MDF9OwotCi0JaWYgKHJzbl9pZV9sZW4gPD0gMCkgewotCQkvKiBObyBSU04gSUUgLSBmYWlsIHNpbGVudGx5ICovCi0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlpZiAoKnJzbl9pZSAhPSBXTEFOX0VJRF9SU04gfHwgKihyc25faWUrMSkgIT0gKHU4KShyc25faWVfbGVuIC0gMikpIHsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCXBvcyA9IHJzbl9pZTsKLQlwb3MgKz0gNDsKLQlsZWZ0ID0gcnNuX2llX2xlbiAtIDQ7Ci0KLQkvKiBncm91cF9jaXBoZXIgKi8KLQlpZiAobGVmdCA+PSBSU05fU0VMRUNUT1JfTEVOKSB7Ci0JCSpncm91cF9jaXBoZXIgPSBydHdfZ2V0X3dwYTJfY2lwaGVyX3N1aXRlKHBvcyk7Ci0KLQkJcG9zICs9IFJTTl9TRUxFQ1RPUl9MRU47Ci0JCWxlZnQgLT0gUlNOX1NFTEVDVE9SX0xFTjsKLQl9IGVsc2UgaWYgKGxlZnQgPiAwKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOiBpZSBsZW5ndGggbWlzbWF0Y2gsICV1IHRvbyBtdWNoXG4iLAotCQkJIF9fZnVuY19fLCBsZWZ0KTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCS8qIHBhaXJ3aXNlX2NpcGhlciAqLwotCWlmIChsZWZ0ID49IDIpIHsKLQkgICAgICAgIC8qIGNvdW50ID0gbGUxNl90b19jcHUoKih1MTYqKXBvcyk7ICovCi0JCWNvdW50ID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHBvcyk7Ci0JCXBvcyArPSAyOwotCQlsZWZ0IC09IDI7Ci0KLQkJaWYgKGNvdW50ID09IDAgfHwgbGVmdCA8IGNvdW50ICogUlNOX1NFTEVDVE9SX0xFTikgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCQkgIiVzOiBpZSBjb3VudCBib3RjaCAocGFpcndpc2UpLCBjb3VudCAldSBsZWZ0ICV1XG4iLAotCQkJCSBfX2Z1bmNfXywgY291bnQsIGxlZnQpOwotCQkJcmV0dXJuIF9GQUlMOwotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCSpwYWlyd2lzZV9jaXBoZXIgfD0gcnR3X2dldF93cGEyX2NpcGhlcl9zdWl0ZShwb3MpOwotCi0JCQlwb3MgKz0gUlNOX1NFTEVDVE9SX0xFTjsKLQkJCWxlZnQgLT0gUlNOX1NFTEVDVE9SX0xFTjsKLQkJfQotCX0gZWxzZSBpZiAobGVmdCA9PSAxKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOiBpZSB0b28gc2hvcnQgKGZvciBrZXkgbWdtdClcbiIsICBfX2Z1bmNfXyk7Ci0KLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCWlmIChpc184MDIxeCkgewotCQlpZiAobGVmdCA+PSA2KSB7Ci0JCQlwb3MgKz0gMjsKLQkJCWlmICghbWVtY21wKHBvcywgU1VJVEVfMVgsIDQpKSB7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiJXMgKCk6IHRoZXJlIGhhcyA4MDIuMXggYXV0aFxuIiwKLQkJCQkJIF9fZnVuY19fKTsKLQkJCQkqaXNfODAyMXggPSAxOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBydHdfZ2V0X3dwc19hdHRyMjNhIC0gU2VhcmNoIGEgc3BlY2lmaWMgV1BTIGF0dHJpYnV0ZSBmcm9tIGEgZ2l2ZW4gV1BTIElFCi0gKiBAd3BzX2llOiBBZGRyZXNzIG9mIFdQUyBJRSB0byBzZWFyY2gKLSAqIEB3cHNfaWVsZW46IExlbmd0aCBsaW1pdCBmcm9tIHdwc19pZQotICogQHRhcmdldF9hdHRyX2lkOiBUaGUgYXR0cmlidXRlIElEIG9mIFdQUyBhdHRyaWJ1dGUgdG8gc2VhcmNoCi0gKiBAYnVmX2F0dHI6IElmIG5vdCBOVUxMIGFuZCB0aGUgV1BTIGF0dHJpYnV0ZSBpcyBmb3VuZCwgV1BTIGF0dHJpYnV0ZQotICogICAgICAgICAgICB3aWxsIGJlIGNvcGllZCB0byB0aGUgYnVmIHN0YXJ0aW5nIGZyb20gYnVmX2F0dHIKLSAqIEBsZW5fYXR0cjogSWYgbm90IE5VTEwgYW5kIHRoZSBXUFMgYXR0cmlidXRlIGlzIGZvdW5kLCB3aWxsIHNldCB0byB0aGUKLSAqICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBlbnRpcmUgV1BTIGF0dHJpYnV0ZQotICoKLSAqIFJldHVybnM6IHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpYyBXUFMgYXR0cmlidXRlIGZvdW5kLCBvciBOVUxMCi0gKi8KLWNvbnN0IHU4ICpydHdfZ2V0X3dwc19hdHRyMjNhKGNvbnN0IHU4ICp3cHNfaWUsIHVpbnQgd3BzX2llbGVuLAotCQkJICAgICAgdTE2IHRhcmdldF9hdHRyX2lkLCB1OCAqYnVmX2F0dHIsIHUzMiAqbGVuX2F0dHIpCi17Ci0JY29uc3QgdTggKmF0dHJfcHRyID0gTlVMTDsKLQljb25zdCB1OCAqdGFyZ2V0X2F0dHJfcHRyID0gTlVMTDsKLQl1OCB3cHNfb3VpWzRdID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDR9OwotCi0JaWYgKGxlbl9hdHRyKQotCQkqbGVuX2F0dHIgPSAwOwotCi0JaWYgKHdwc19pZVswXSAhPSBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMgfHwKLQkgICAgbWVtY21wKHdwc19pZSArIDIsIHdwc19vdWksIDQpKSB7Ci0JCXJldHVybiBhdHRyX3B0cjsKLQl9Ci0KLQkvKiAgNiA9IDEoRWxlbWVudCBJRCkgKyAxKExlbmd0aCkgKyA0KFdQUyBPVUkpICovCi0JYXR0cl9wdHIgPSB3cHNfaWUgKyA2OyAvKiBnb3RvIGZpcnN0IGF0dHIgKi8KLQotCXdoaWxlIChhdHRyX3B0ciAtIHdwc19pZSA8IHdwc19pZWxlbikgewotCQkvKiAgNCA9IDIoQXR0cmlidXRlIElEKSArIDIoTGVuZ3RoKSAqLwotCQl1MTYgYXR0cl9pZCA9IGdldF91bmFsaWduZWRfYmUxNihhdHRyX3B0cik7Ci0JCXUxNiBhdHRyX2RhdGFfbGVuID0gZ2V0X3VuYWxpZ25lZF9iZTE2KGF0dHJfcHRyICsgMik7Ci0JCXUxNiBhdHRyX2xlbiA9IGF0dHJfZGF0YV9sZW4gKyA0OwotCi0JCS8qIERCR184NzIzQSgiJXMgYXR0cl9wdHI6JXAsIGlkOiV1LCBsZW5ndGg6JXVcbiIsIF9fZnVuY19fLCBhdHRyX3B0ciwgYXR0cl9pZCwgYXR0cl9kYXRhX2xlbik7ICovCi0JCWlmIChhdHRyX2lkID09IHRhcmdldF9hdHRyX2lkKSB7Ci0JCQl0YXJnZXRfYXR0cl9wdHIgPSBhdHRyX3B0cjsKLQotCQkJaWYgKGJ1Zl9hdHRyKQotCQkJCW1lbWNweShidWZfYXR0ciwgYXR0cl9wdHIsIGF0dHJfbGVuKTsKLQotCQkJaWYgKGxlbl9hdHRyKQotCQkJCSpsZW5fYXR0ciA9IGF0dHJfbGVuOwotCi0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCWF0dHJfcHRyICs9IGF0dHJfbGVuOyAvKiBnb3RvIG5leHQgKi8KLQkJfQotCX0KLQotCXJldHVybiB0YXJnZXRfYXR0cl9wdHI7Ci19Ci0KLS8qKgotICogcnR3X2dldF93cHNfYXR0cl9jb250ZW50MjNhIC0gU2VhcmNoIGEgc3BlY2lmaWMgV1BTIGF0dHJpYnV0ZSBjb250ZW50Ci0gKiBmcm9tIGEgZ2l2ZW4gV1BTIElFCi0gKiBAd3BzX2llOiBBZGRyZXNzIG9mIFdQUyBJRSB0byBzZWFyY2gKLSAqIEB3cHNfaWVsZW46IExlbmd0aCBsaW1pdCBmcm9tIHdwc19pZQotICogQHRhcmdldF9hdHRyX2lkOiBUaGUgYXR0cmlidXRlIElEIG9mIFdQUyBhdHRyaWJ1dGUgdG8gc2VhcmNoCi0gKiBAYnVmX2NvbnRlbnQ6IElmIG5vdCBOVUxMIGFuZCB0aGUgV1BTIGF0dHJpYnV0ZSBpcyBmb3VuZCwgV1BTIGF0dHJpYnV0ZQotICogICAgICAgICAgICAgICBjb250ZW50IHdpbGwgYmUgY29waWVkIHRvIHRoZSBidWYgc3RhcnRpbmcgZnJvbSBidWZfY29udGVudAotICogQGxlbl9jb250ZW50OiBJZiBub3QgTlVMTCBhbmQgdGhlIFdQUyBhdHRyaWJ1dGUgaXMgZm91bmQsIHdpbGwgc2V0IHRvIHRoZQotICogICAgICAgICAgICAgICBsZW5ndGggb2YgdGhlIFdQUyBhdHRyaWJ1dGUgY29udGVudAotICoKLSAqIFJldHVybnM6IHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpYyBXUFMgYXR0cmlidXRlIGNvbnRlbnQgZm91bmQsIG9yIE5VTEwKLSAqLwotY29uc3QgdTggKnJ0d19nZXRfd3BzX2F0dHJfY29udGVudDIzYShjb25zdCB1OCAqd3BzX2llLCB1aW50IHdwc19pZWxlbiwKLQkJCQkgICAgICB1MTYgdGFyZ2V0X2F0dHJfaWQsIHU4ICpidWZfY29udGVudCkKLXsKLQljb25zdCB1OCAqYXR0cl9wdHI7Ci0JdTMyIGF0dHJfbGVuOwotCi0JYXR0cl9wdHIgPSBydHdfZ2V0X3dwc19hdHRyMjNhKHdwc19pZSwgd3BzX2llbGVuLCB0YXJnZXRfYXR0cl9pZCwKLQkJCQkgICAgTlVMTCwgJmF0dHJfbGVuKTsKLQotCWlmIChhdHRyX3B0ciAmJiBhdHRyX2xlbikgewotCQlpZiAoYnVmX2NvbnRlbnQpCi0JCQltZW1jcHkoYnVmX2NvbnRlbnQsIGF0dHJfcHRyICsgNCwgYXR0cl9sZW4gLSA0KTsKLQotCQlyZXR1cm4gYXR0cl9wdHIgKyA0OwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IHJ0d19nZXRfY2lwaGVyX2luZm8oc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmspCi17Ci0JY29uc3QgdTggKnBidWY7Ci0JaW50IGdyb3VwX2NpcGhlciA9IDAsIHBhaXJ3aXNlX2NpcGhlciA9IDAsIGlzODAyMXggPSAwOwotCWludCByZXQgPSBfRkFJTDsKLQlpbnQgciwgcGxlbjsKLQljaGFyICpwaWU7Ci0KLQlwaWUgPSBwbmV0d29yay0+bmV0d29yay5JRXM7Ci0JcGxlbiA9IHBuZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoOwotCi0JcGJ1ZiA9IGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkgICAgICAgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV1BBLCBwaWUsIHBsZW4pOwotCi0JaWYgKHBidWYgJiYgcGJ1ZlsxXSA+IDApIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkgInJ0d19nZXRfY2lwaGVyX2luZm86IHdwYV9pZWxlbjogJWRcbiIsIHBidWZbMV0pOwotCQlyID0gcnR3X3BhcnNlX3dwYV9pZTIzYShwYnVmLCBwYnVmWzFdICsgMiwgJmdyb3VwX2NpcGhlciwKLQkJCQkgICAgICZwYWlyd2lzZV9jaXBoZXIsICZpczgwMjF4KTsKLQkJaWYgKHIgPT0gX1NVQ0NFU1MpIHsKLQkJCXBuZXR3b3JrLT5CY25JbmZvLnBhaXJ3aXNlX2NpcGhlciA9IHBhaXJ3aXNlX2NpcGhlcjsKLQkJCXBuZXR3b3JrLT5CY25JbmZvLmdyb3VwX2NpcGhlciA9IGdyb3VwX2NpcGhlcjsKLQkJCXBuZXR3b3JrLT5CY25JbmZvLmlzXzgwMjF4ID0gaXM4MDIxeDsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiJXM6IHBuZXR3b3JrLT5wYWlyd2lzZV9jaXBoZXI6ICVkLCBpc184MDIxeCBpcyAlZFxuIiwKLQkJCQkgX19mdW5jX18sIHBuZXR3b3JrLT5CY25JbmZvLnBhaXJ3aXNlX2NpcGhlciwKLQkJCQkgcG5ldHdvcmstPkJjbkluZm8uaXNfODAyMXgpOwotCQkJcmV0ID0gX1NVQ0NFU1M7Ci0JCX0KLQl9IGVsc2UgewotCQlwYnVmID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9SU04sIHBpZSwgcGxlbik7Ci0KLQkJaWYgKHBidWYgJiYgcGJ1ZlsxXSA+IDApIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiZ2V0IFJTTiBJRVxuIik7Ci0JCQlyID0gcnR3X3BhcnNlX3dwYTJfaWUyM2EocGJ1ZiwgcGJ1ZlsxXSArIDIsCi0JCQkJCSAgICAgICZncm91cF9jaXBoZXIsICZwYWlyd2lzZV9jaXBoZXIsCi0JCQkJCSAgICAgICZpczgwMjF4KTsKLQkJCWlmIChyID09IF9TVUNDRVNTKSB7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiZ2V0IFJTTiBJRSAgT0shISFcbiIpOwotCQkJCXBuZXR3b3JrLT5CY25JbmZvLnBhaXJ3aXNlX2NpcGhlciA9Ci0JCQkJCXBhaXJ3aXNlX2NpcGhlcjsKLQkJCQlwbmV0d29yay0+QmNuSW5mby5ncm91cF9jaXBoZXIgPSBncm91cF9jaXBoZXI7Ci0JCQkJcG5ldHdvcmstPkJjbkluZm8uaXNfODAyMXggPSBpczgwMjF4OwotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgIiVzOiBwbmV0d29yay0+cGFpcndpc2VfY2lwaGVyOiAlZCxwbmV0d29yay0+Z3JvdXBfY2lwaGVyIGlzICVkLCBpc184MDIxeCBpcyAlZFxuIiwKLQkJCQkJIF9fZnVuY19fLAotCQkJCQkgcG5ldHdvcmstPkJjbkluZm8ucGFpcndpc2VfY2lwaGVyLAotCQkJCQkgcG5ldHdvcmstPkJjbkluZm8uZ3JvdXBfY2lwaGVyLAotCQkJCQkgcG5ldHdvcmstPkJjbkluZm8uaXNfODAyMXgpOwotCQkJCXJldCA9IF9TVUNDRVNTOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBydHdfZ2V0X2Jjbl9pbmZvMjNhKHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKQotewotCXU4IGJlbmNyeXB0ID0gMDsKLQlpbnQgcGllX2xlbjsKLQl1OCAqcGllOwotCWNvbnN0IHU4ICpwOwotCi0JaWYgKHBuZXR3b3JrLT5uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkgewotCQliZW5jcnlwdCA9IDE7Ci0JCXBuZXR3b3JrLT5uZXR3b3JrLlByaXZhY3kgPSAxOwotCX0gZWxzZQotCQlwbmV0d29yay0+QmNuSW5mby5lbmNyeXBfcHJvdG9jb2wgPSBFTkNSWVBfUFJPVE9DT0xfT1BFTlNZUzsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOiBzc2lkID0lc1xuIiwgX19mdW5jX18sIHBuZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZCk7Ci0KLQlwaWUgPSBwbmV0d29yay0+bmV0d29yay5JRXM7Ci0JcGllX2xlbiA9IHBuZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoOwotCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfUlNOLCBwaWUsIHBpZV9sZW4pOwotCWlmIChwICYmIHBbMV0pIHsKLQkJcG5ldHdvcmstPkJjbkluZm8uZW5jcnlwX3Byb3RvY29sID0gRU5DUllQX1BST1RPQ09MX1dQQTI7Ci0JfSBlbHNlIGlmIChjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZShXTEFOX09VSV9NSUNST1NPRlQsCi0JCQkJCSAgIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQQSwKLQkJCQkJICAgcGllLCBwaWVfbGVuKSkgewotCQlwbmV0d29yay0+QmNuSW5mby5lbmNyeXBfcHJvdG9jb2wgPSBFTkNSWVBfUFJPVE9DT0xfV1BBOwotCX0gZWxzZSB7Ci0JCWlmIChiZW5jcnlwdCkKLQkJCXBuZXR3b3JrLT5CY25JbmZvLmVuY3J5cF9wcm90b2NvbCA9IEVOQ1JZUF9QUk9UT0NPTF9XRVA7Ci0JfQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOiBwbmV0d29yay0+ZW5jcnlwX3Byb3RvY29sIGlzICV4XG4iLCBfX2Z1bmNfXywKLQkJIHBuZXR3b3JrLT5CY25JbmZvLmVuY3J5cF9wcm90b2NvbCk7Ci0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCSAiJXM6IHBuZXR3b3JrLT5lbmNyeXBfcHJvdG9jb2wgaXMgJXhcbiIsIF9fZnVuY19fLAotCQkgcG5ldHdvcmstPkJjbkluZm8uZW5jcnlwX3Byb3RvY29sKTsKLQlydHdfZ2V0X2NpcGhlcl9pbmZvKHBuZXR3b3JrKTsKLQotCS8qIGdldCBid21vZGUgYW5kIGNoX29mZnNldCAqLwotfQotCi0vKiBzaG93IE1DUyByYXRlLCB1bml0OiAxMDBLYnBzICovCi11MTYgcnR3X21jc19yYXRlMjNhKHU4IHJmX3R5cGUsIHU4IGJ3XzQwTUh6LCB1OCBzaG9ydF9HSV8yMCwgdTggc2hvcnRfR0lfNDAsCi0JCSAgICBzdHJ1Y3QgaWVlZTgwMjExX21jc19pbmZvICptY3MpCi17Ci0JdTE2IG1heF9yYXRlID0gMDsKLQotCWlmIChyZl90eXBlID09IFJGXzFUMVIpIHsKLQkJaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCg3KSkKLQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzE1MDA6MTM1MCk6Ci0JCQkJKChzaG9ydF9HSV8yMCk/NzIyOjY1MCk7Ci0JCWVsc2UgaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCg2KSkKLQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzEzNTA6MTIxNSk6Ci0JCQkJKChzaG9ydF9HSV8yMCk/NjUwOjU4NSk7Ci0JCWVsc2UgaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCg1KSkKLQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzEyMDA6MTA4MCk6Ci0JCQkJKChzaG9ydF9HSV8yMCk/NTc4OjUyMCk7Ci0JCWVsc2UgaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCg0KSkKLQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzkwMDo4MTApOgotCQkJCSgoc2hvcnRfR0lfMjApPzQzMzozOTApOwotCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMF0gJiBCSVQoMykpCi0JCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT82MDA6NTQwKToKLQkJCQkoKHNob3J0X0dJXzIwKT8yODk6MjYwKTsKLQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzBdICYgQklUKDIpKQotCQkJbWF4X3JhdGUgPSAoYndfNDBNSHopID8gKChzaG9ydF9HSV80MCk/NDUwOjQwNSk6Ci0JCQkJKChzaG9ydF9HSV8yMCk/MjE3OjE5NSk7Ci0JCWVsc2UgaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCgxKSkKLQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzMwMDoyNzApOgotCQkJCSgoc2hvcnRfR0lfMjApPzE0NDoxMzApOwotCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMF0gJiBCSVQoMCkpCi0JCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT8xNTA6MTM1KToKLQkJCQkoKHNob3J0X0dJXzIwKT83Mjo2NSk7Ci0JfSBlbHNlIHsKLQkJaWYgKG1jcy0+cnhfbWFza1sxXSkgewotCQkJaWYgKG1jcy0+cnhfbWFza1sxXSAmIEJJVCg3KSkKLQkJCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT8zMDAwOjI3MDApOigoc2hvcnRfR0lfMjApPzE0NDQ6MTMwMCk7Ci0JCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMV0gJiBCSVQoNikpCi0JCQkJbWF4X3JhdGUgPSAoYndfNDBNSHopID8gKChzaG9ydF9HSV80MCk/MjcwMDoyNDMwKTooKHNob3J0X0dJXzIwKT8xMzAwOjExNzApOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzFdICYgQklUKDUpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzI0MDA6MjE2MCk6KChzaG9ydF9HSV8yMCk/MTE1NjoxMDQwKTsKLQkJCWVsc2UgaWYgKG1jcy0+cnhfbWFza1sxXSAmIEJJVCg0KSkKLQkJCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT8xODAwOjE2MjApOigoc2hvcnRfR0lfMjApPzg2Nzo3ODApOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzFdICYgQklUKDMpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzEyMDA6MTA4MCk6KChzaG9ydF9HSV8yMCk/NTc4OjUyMCk7Ci0JCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMV0gJiBCSVQoMikpCi0JCQkJbWF4X3JhdGUgPSAoYndfNDBNSHopID8gKChzaG9ydF9HSV80MCk/OTAwOjgxMCk6KChzaG9ydF9HSV8yMCk/NDMzOjM5MCk7Ci0JCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMV0gJiBCSVQoMSkpCi0JCQkJbWF4X3JhdGUgPSAoYndfNDBNSHopID8gKChzaG9ydF9HSV80MCk/NjAwOjU0MCk6KChzaG9ydF9HSV8yMCk/Mjg5OjI2MCk7Ci0JCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMV0gJiBCSVQoMCkpCi0JCQkJbWF4X3JhdGUgPSAoYndfNDBNSHopID8gKChzaG9ydF9HSV80MCk/MzAwOjI3MCk6KChzaG9ydF9HSV8yMCk/MTQ0OjEzMCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobWNzLT5yeF9tYXNrWzBdICYgQklUKDcpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzE1MDA6MTM1MCk6KChzaG9ydF9HSV8yMCk/NzIyOjY1MCk7Ci0JCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMF0gJiBCSVQoNikpCi0JCQkJbWF4X3JhdGUgPSAoYndfNDBNSHopID8gKChzaG9ydF9HSV80MCk/MTM1MDoxMjE1KTooKHNob3J0X0dJXzIwKT82NTA6NTg1KTsKLQkJCWVsc2UgaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCg1KSkKLQkJCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT8xMjAwOjEwODApOigoc2hvcnRfR0lfMjApPzU3ODo1MjApOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzBdICYgQklUKDQpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzkwMDo4MTApOigoc2hvcnRfR0lfMjApPzQzMzozOTApOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzBdICYgQklUKDMpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzYwMDo1NDApOigoc2hvcnRfR0lfMjApPzI4OToyNjApOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzBdICYgQklUKDIpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzQ1MDo0MDUpOigoc2hvcnRfR0lfMjApPzIxNzoxOTUpOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzBdICYgQklUKDEpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzMwMDoyNzApOigoc2hvcnRfR0lfMjApPzE0NDoxMzApOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzBdICYgQklUKDApKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzE1MDoxMzUpOigoc2hvcnRfR0lfMjApPzcyOjY1KTsKLQkJfQotCX0KLQlyZXR1cm4gbWF4X3JhdGU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X21sbWUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfbWxtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzg2ZmM0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfbWxtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1JUV19NTE1FX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgotI2luY2x1ZGUgPHhtaXRfb3NkZXAuaD4KLSNpbmNsdWRlIDxoYWxfaW50Zi5oPgotI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KLSNpbmNsdWRlIDxzdGFfaW5mby5oPgotI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgotI2luY2x1ZGUgPHdpZmkuaD4KLSNpbmNsdWRlIDx3bGFuX2Jzc2RlZi5oPgotI2luY2x1ZGUgPHJ0d19zcmVzZXQuaD4KLQotc3RhdGljIHN0cnVjdCB3bGFuX25ldHdvcmsgKgotcnR3X3NlbGVjdF9jYW5kaWRhdGVfZnJvbV9xdWV1ZShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpOwotc3RhdGljIGludCBydHdfZG9fam9pbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotc3RhdGljIHZvaWQgcnR3X2luaXRfbWxtZV90aW1lcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlzZXR1cF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwgcnR3MjNhX2pvaW5fdG9faGFuZGxlciwKLQkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKLQotCXNldHVwX3RpbWVyKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIsIHJ0d19zY2FuX3RpbWVvdXRfaGFuZGxlcjIzYSwKLQkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKLQotCXNldHVwX3RpbWVyKCZwbWxtZXByaXYtPmR5bmFtaWNfY2hrX3RpbWVyLAotCQkgICAgcnR3X2R5bmFtaWNfY2hlY2tfdGltZXJfaGFuZGxlciwgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOwotCi0Jc2V0dXBfdGltZXIoJnBtbG1lcHJpdi0+c2V0X3NjYW5fZGVueV90aW1lciwKLQkJICAgIHJ0d19zZXRfc2Nhbl9kZW55X3RpbWVyX2hkbCwgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOwotfQotCi1pbnQgcnR3X2luaXRfbWxtZV9wcml2MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCXBtbG1lcHJpdi0+bmljX2hkbCA9IHBhZGFwdGVyOwotCi0JcG1sbWVwcml2LT5md19zdGF0ZSA9IDA7Ci0JcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLmlmbW9kZSA9IE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOwotCS8qICAxOiBhY3RpdmUsIDA6IHBhc2l2ZS4gTWF5YmUgc29tZWRheSB3ZSBzaG91bGQgcmVuYW1lIHRoaXMKLQkgICAgdmFyYWJsZSB0byAiYWN0aXZlX21vZGUiIChKZWZmKSAqLwotCXBtbG1lcHJpdi0+c2Nhbl9tb2RlID0gU0NBTl9BQ1RJVkU7Ci0KLQlzcGluX2xvY2tfaW5pdCgmcG1sbWVwcml2LT5sb2NrKTsKLQlfcnR3X2luaXRfcXVldWUyM2EoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZSk7Ci0KLQltZW1zZXQoJnBtbG1lcHJpdi0+YXNzb2Nfc3NpZCwgMCwgc2l6ZW9mKHN0cnVjdCBjZmc4MDIxMV9zc2lkKSk7Ci0KLQlydHdfY2xlYXJfc2Nhbl9kZW55KHBhZGFwdGVyKTsKLQotCXJ0d19pbml0X21sbWVfdGltZXIocGFkYXB0ZXIpOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotc3RhdGljIHZvaWQgcnR3X2ZyZWVfbWxtZV9pZV9kYXRhKHU4ICoqcHBpZSwgdTMyICpwbGVuKQotewotCWlmICgqcHBpZSkgewotCQlrZnJlZSgqcHBpZSk7Ci0JCSpwbGVuID0gMDsKLQkJKnBwaWUgPSBOVUxMOwotCX0KLX0KLSNlbmRpZgotCi12b2lkIHJ0dzIzYV9mcmVlX21sbWVfcHJpdl9pZV9kYXRhKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKLXsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlrZnJlZShwbWxtZXByaXYtPmFzc29jX3JlcSk7Ci0Ja2ZyZWUocG1sbWVwcml2LT5hc3NvY19yc3ApOwotCXJ0d19mcmVlX21sbWVfaWVfZGF0YSgmcG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llLAotCQkJICAgICAgJnBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZV9sZW4pOwotI2VuZGlmCi19Ci0KLXZvaWQgcnR3X2ZyZWVfbWxtZV9wcml2MjNhKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKLXsKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkgInJ0d19mcmVlX21sbWVfcHJpdjIzYVxuIik7Ci0KLQlydHcyM2FfZnJlZV9tbG1lX3ByaXZfaWVfZGF0YShwbWxtZXByaXYpOwotfQotCi1zdHJ1Y3Qgd2xhbl9uZXR3b3JrICpydHdfYWxsb2NfbmV0d29yayhzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsIGdmcF90IGdmcCkKLXsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yazsKLQotCXBuZXR3b3JrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdsYW5fbmV0d29yayksIGdmcCk7Ci0JaWYgKHBuZXR3b3JrKSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZwbmV0d29yay0+bGlzdCk7Ci0JCXBuZXR3b3JrLT5uZXR3b3JrX3R5cGUgPSAwOwotCQlwbmV0d29yay0+Zml4ZWQgPSBmYWxzZTsKLQkJcG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCA9IGppZmZpZXM7Ci0JCXBuZXR3b3JrLT5qb2luX3JlcyA9IDA7Ci0JfQotCi0JcmV0dXJuIHBuZXR3b3JrOwotfQotCi1zdGF0aWMgdm9pZCBfcnR3X2ZyZWVfbmV0d29yazIzYShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsCi0JCQkJIHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKQotewotCWlmICghcG5ldHdvcmspCi0JCXJldHVybjsKLQotCWlmIChwbmV0d29yay0+Zml4ZWQgPT0gdHJ1ZSkKLQkJcmV0dXJuOwotCi0JbGlzdF9kZWxfaW5pdCgmcG5ldHdvcmstPmxpc3QpOwotCi0Ja2ZyZWUocG5ldHdvcmspOwotfQotCi0vKgotIHJldHVybiB0aGUgd2xhbl9uZXR3b3JrIHdpdGggdGhlIG1hdGNoaW5nIGFkZHIKLQotIFNoYWxsIGJlIGNhbGxlZCB1bmRlciBhdG9taWMgY29udGV4dC4uLiB0byBhdm9pZCBwb3NzaWJsZSByYWNpbmcgY29uZGl0aW9uLi4uCi0qLwotc3RydWN0IHdsYW5fbmV0d29yayAqCi1ydHdfZmluZF9uZXR3b3JrMjNhKHN0cnVjdCBydHdfcXVldWUgKnNjYW5uZWRfcXVldWUsIHU4ICphZGRyKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkLCAqcGxpc3Q7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmsgPSBOVUxMOwotCi0JaWYgKGlzX3plcm9fZXRoZXJfYWRkcihhZGRyKSkgewotCQlwbmV0d29yayA9IE5VTEw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBzcGluX2xvY2tfYmgoJnNjYW5uZWRfcXVldWUtPmxvY2spOyAqLwotCi0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHNjYW5uZWRfcXVldWUpOwotCXBsaXN0ID0gcGhlYWQtPm5leHQ7Ci0KLQl3aGlsZSAocGxpc3QgIT0gcGhlYWQpIHsKLQkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwotCi0JCWlmIChldGhlcl9hZGRyX2VxdWFsKGFkZHIsIHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpKQotCQkJYnJlYWs7Ci0KLQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKLQl9Ci0KLQlpZiAocGxpc3QgPT0gcGhlYWQpCi0JCXBuZXR3b3JrID0gTlVMTDsKLQotCS8qIHNwaW5fdW5sb2NrX2JoKCZzY2FubmVkX3F1ZXVlLT5sb2NrKTsgKi8KLQotZXhpdDoKLQotCXJldHVybiBwbmV0d29yazsKLX0KLQotdm9pZCBydHdfZnJlZV9uZXR3b3JrX3F1ZXVlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmssICpwdG1wOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqc2Nhbm5lZF9xdWV1ZSA9ICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWU7Ci0KLQlzcGluX2xvY2tfYmgoJnNjYW5uZWRfcXVldWUtPmxvY2spOwotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChzY2FubmVkX3F1ZXVlKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG5ldHdvcmssIHB0bXAsIHBoZWFkLCBsaXN0KQotCQlfcnR3X2ZyZWVfbmV0d29yazIzYShwbWxtZXByaXYsIHBuZXR3b3JrKTsKLQlzcGluX3VubG9ja19iaCgmc2Nhbm5lZF9xdWV1ZS0+bG9jayk7Ci19Ci0KLWludCBydHdfaWZfdXAyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlpbnQgcmVzOwotCi0JaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fAotCSAgICAhY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCSAicnR3X2lmX3VwMjNhOmJEcml2ZXJTdG9wcGVkKCVkKSBPUiBiU3VycHJpc2VSZW1vdmVkKCVkKVxuIiwKLQkJCSBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQsIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKTsKLQkJcmVzID0gZmFsc2U7Ci0JfSBlbHNlCi0JCXJlcyA9ICB0cnVlOwotCi0JcmV0dXJuIHJlczsKLX0KLQotdm9pZCBydHdfZ2VuZXJhdGVfcmFuZG9tX2lic3MyM2EodTggKnBpYnNzKQotewotCXVuc2lnbmVkIGxvbmcgY3VydGltZSA9IGppZmZpZXM7Ci0KLQlwaWJzc1swXSA9IDB4MDI7ICAvKiBpbiBhZC1ob2MgbW9kZSBiaXQxIG11c3Qgc2V0IHRvIDEgKi8KLQlwaWJzc1sxXSA9IDB4MTE7Ci0JcGlic3NbMl0gPSAweDg3OwotCXBpYnNzWzNdID0gY3VydGltZSAmIDB4ZmY7LyogcFswXTsgKi8KLQlwaWJzc1s0XSA9IChjdXJ0aW1lID4+IDgpICYgMHhmZjsvKiBwWzFdOyAqLwotCXBpYnNzWzVdID0gKGN1cnRpbWUgPj4gMTYpICYgMHhmZjsvKiBwWzJdOyAqLwotfQotCi12b2lkIHJ0d19zZXRfcm9hbWluZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IHRvX3JvYW1pbmcpCi17Ci0JaWYgKHRvX3JvYW1pbmcgPT0gMCkKLQkJYWRhcHRlci0+bWxtZXByaXYudG9fam9pbiA9IGZhbHNlOwotCWFkYXB0ZXItPm1sbWVwcml2LnRvX3JvYW1pbmcgPSB0b19yb2FtaW5nOwotfQotCi1zdGF0aWMgdm9pZCBfcnR3X3JvYW1pbmcoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICp0Z3RfbmV0d29yaykKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrOwotCWludCBkb19qb2luX3I7Ci0KLQlpZiAodGd0X25ldHdvcmspCi0JCXBuZXR3b3JrID0gdGd0X25ldHdvcms7Ci0JZWxzZQotCQlwbmV0d29yayA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrOwotCi0JaWYgKHBhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nID4gMCkgewotCQlEQkdfODcyM0EoInJvYW1pbmcgZnJvbSAlcyglcE0pLCBsZW5ndGg6JWRcbiIsCi0JCQkgIHBuZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZCwKLQkJCSAgcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywKLQkJCSAgcG5ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkX2xlbik7Ci0JCW1lbWNweSgmcG1sbWVwcml2LT5hc3NvY19zc2lkLCAmcG5ldHdvcmstPm5ldHdvcmsuU3NpZCwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgY2ZnODAyMTFfc3NpZCkpOwotCi0JCXBtbG1lcHJpdi0+YXNzb2NfYnlfYnNzaWQgPSBmYWxzZTsKLQotCQl3aGlsZSAoMSkgewotCQkJZG9fam9pbl9yID0gcnR3X2RvX2pvaW4ocGFkYXB0ZXIpOwotCQkJaWYgKGRvX2pvaW5fciA9PSBfU1VDQ0VTUykKLQkJCQlicmVhazsKLQkJCWVsc2UgewotCQkJCURCR184NzIzQSgicm9hbWluZyBkb19qb2luIHJldHVybiAlZFxuIiwKLQkJCQkJICBkb19qb2luX3IpOwotCQkJCXBtbG1lcHJpdi0+dG9fcm9hbWluZy0tOwotCi0JCQkJaWYgKHBhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nID4gMCkKLQkJCQkJY29udGludWU7Ci0JCQkJZWxzZSB7Ci0JCQkJCURCR184NzIzQSgiJXMoJWQpIC10byByb2FtaW5nIGZhaWwsICIKLQkJCQkJCSAgImluZGljYXRlX2Rpc2Nvbm5lY3RcbiIsCi0JCQkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQkJCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHBhZGFwdGVyKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQotCi12b2lkIHJ0dzIzYV9yb2FtaW5nKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICp0Z3RfbmV0d29yaykKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCV9ydHdfcm9hbWluZyhwYWRhcHRlciwgdGd0X25ldHdvcmspOwotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotfQotCi1zdGF0aWMgdm9pZCBydHdfZnJlZV9uZXR3b3JrX25vbG9jayhzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsCi0JCQkJICAgIHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKQotewotCV9ydHdfZnJlZV9uZXR3b3JrMjNhKHBtbG1lcHJpdiwgcG5ldHdvcmspOwotfQotCi1ib29sIHJ0d19pc19zYW1lX2lic3MyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJIHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKQotewotCWludCByZXQ7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCi0JaWYgKHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gIT0gMCAmJgotCSAgICBwbmV0d29yay0+bmV0d29yay5Qcml2YWN5ID09IDApCi0JCXJldCA9IGZhbHNlOwotCWVsc2UgaWYgKHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPT0gMCAmJgotCQkgcG5ldHdvcmstPm5ldHdvcmsuUHJpdmFjeSA9PSAxKQotCQlyZXQgPSBmYWxzZTsKLQllbHNlCi0JCXJldCA9IHRydWU7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbmxpbmUgaW50IGlzX3NhbWVfZXNzKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICphLCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYik7Ci1pbmxpbmUgaW50IGlzX3NhbWVfZXNzKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICphLCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYikKLXsKLQlyZXR1cm4gKGEtPlNzaWQuc3NpZF9sZW4gPT0gYi0+U3NpZC5zc2lkX2xlbikgJiYKLQkJIW1lbWNtcChhLT5Tc2lkLnNzaWQsIGItPlNzaWQuc3NpZCwgYS0+U3NpZC5zc2lkX2xlbik7Ci19Ci0KLWludCBpc19zYW1lX25ldHdvcmsyM2Eoc3RydWN0IHdsYW5fYnNzaWRfZXggKnNyYywgc3RydWN0IHdsYW5fYnNzaWRfZXggKmRzdCkKLXsKLQl1MTYgc19jYXAsIGRfY2FwOwotCi0Jc19jYXAgPSBzcmMtPmNhcGFiaWxpdHk7Ci0JZF9jYXAgPSBkc3QtPmNhcGFiaWxpdHk7Ci0KLQlyZXR1cm4gKChzcmMtPlNzaWQuc3NpZF9sZW4gPT0gZHN0LT5Tc2lkLnNzaWRfbGVuKSAmJgotCQkvKgkoc3JjLT5EU0NvbmZpZyA9PSBkc3QtPkRTQ29uZmlnKSAmJiAqLwotCQlldGhlcl9hZGRyX2VxdWFsKHNyYy0+TWFjQWRkcmVzcywgZHN0LT5NYWNBZGRyZXNzKSAmJgotCQkhbWVtY21wKHNyYy0+U3NpZC5zc2lkLCBkc3QtPlNzaWQuc3NpZCwgc3JjLT5Tc2lkLnNzaWRfbGVuKSAmJgotCQkoc19jYXAgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykgPT0KLQkJKGRfY2FwICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpICYmCi0JCShzX2NhcCAmIFdMQU5fQ0FQQUJJTElUWV9FU1MpID09IChkX2NhcCAmIFdMQU5fQ0FQQUJJTElUWV9FU1MpKTsKLX0KLQotc3RydWN0IHdsYW5fbmV0d29yayAqCi1ydHdfZ2V0X29sZGVzdF93bGFuX25ldHdvcmsyM2Eoc3RydWN0IHJ0d19xdWV1ZSAqc2Nhbm5lZF9xdWV1ZSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwd2xhbjsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpvbGRlc3QgPSBOVUxMOwotCi0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHNjYW5uZWRfcXVldWUpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocHdsYW4sIHBoZWFkLCBsaXN0KSB7Ci0JCWlmIChwd2xhbi0+Zml4ZWQgIT0gdHJ1ZSkgewotCQkJaWYgKCFvbGRlc3QgfHwgdGltZV9hZnRlcihvbGRlc3QtPmxhc3Rfc2Nhbm5lZCwKLQkJCQkJCSAgcHdsYW4tPmxhc3Rfc2Nhbm5lZCkpCi0JCQkJb2xkZXN0ID0gcHdsYW47Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gb2xkZXN0OwotfQotCi12b2lkIHVwZGF0ZV9uZXR3b3JrMjNhKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpkc3QsIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpzcmMsCi0JCSAgICAgICBzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBib29sIHVwZGF0ZV9pZSkKLXsKLQl1OCBzc19vcmkgPSBkc3QtPlNpZ25hbFN0cmVuZ3RoOwotCXU4IHNxX29yaSA9IGRzdC0+U2lnbmFsUXVhbGl0eTsKLQlsb25nIHJzc2lfb3JpID0gZHN0LT5Sc3NpOwotCi0JdTggc3Nfc21wID0gc3JjLT5TaWduYWxTdHJlbmd0aDsKLQl1OCBzcV9zbXAgPSBzcmMtPlNpZ25hbFF1YWxpdHk7Ci0JbG9uZyByc3NpX3NtcCA9IHNyYy0+UnNzaTsKLQotCXU4IHNzX2ZpbmFsOwotCXU4IHNxX2ZpbmFsOwotCWxvbmcgcnNzaV9maW5hbDsKLQotCURCR184NzIzQSgiJXMgJXMoJXBNLCBjaCV1KSBzc19vcmk6JTN1LCBzcV9vcmk6JTN1LCByc3NpX29yaTolM2xkLCAiCi0JCSAgInNzX3NtcDolM3UsIHNxX3NtcDolM3UsIHJzc2lfc21wOiUzbGRcbiIsCi0JCSAgX19mdW5jX18sIHNyYy0+U3NpZC5zc2lkLCBzcmMtPk1hY0FkZHJlc3MsCi0JCSAgc3JjLT5EU0NvbmZpZywgc3Nfb3JpLCBzcV9vcmksIHJzc2lfb3JpLAotCQkgIHNzX3NtcCwgc3Ffc21wLCByc3NpX3NtcAotCSk7Ci0KLQkvKiBUaGUgcnVsZSBiZWxvdyBpcyAxLzUgZm9yIHNhbXBsZSB2YWx1ZSwgNC81IGZvciBoaXN0b3J5IHZhbHVlICovCi0JaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgX0ZXX0xJTktFRCkgJiYKLQkgICAgaXNfc2FtZV9uZXR3b3JrMjNhKCZwYWRhcHRlci0+bWxtZXByaXYuY3VyX25ldHdvcmsubmV0d29yaywgc3JjKSkgewotCQkvKiBUYWtlIHRoZSByZWN2cHJpdidzIHZhbHVlIGZvciB0aGUgY29ubmVjdGVkIEFQKi8KLQkJc3NfZmluYWwgPSBwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3N0cmVuZ3RoOwotCQlzcV9maW5hbCA9IHBhZGFwdGVyLT5yZWN2cHJpdi5zaWduYWxfcXVhbDsKLQkJLyogdGhlIHJzc2kgdmFsdWUgaGVyZSBpcyB1bmRlY29yYXRlZCwgYW5kIHdpbGwgYmUKLQkJICAgdXNlZCBmb3IgYW50ZW5uYSBkaXZlcnNpdHkgKi8KLQkJaWYgKHNxX3NtcCAhPSAxMDEpIC8qIGZyb20gdGhlIHJpZ2h0IGNoYW5uZWwgKi8KLQkJCXJzc2lfZmluYWwgPSAoc3JjLT5Sc3NpK2RzdC0+UnNzaSo0KS81OwotCQllbHNlCi0JCQlyc3NpX2ZpbmFsID0gcnNzaV9vcmk7Ci0JfSBlbHNlIHsKLQkJaWYgKHNxX3NtcCAhPSAxMDEpIHsgLyogZnJvbSB0aGUgcmlnaHQgY2hhbm5lbCAqLwotCQkJc3NfZmluYWwgPSAoKHUzMilzcmMtPlNpZ25hbFN0cmVuZ3RoICsKLQkJCQkgICAgKHUzMilkc3QtPlNpZ25hbFN0cmVuZ3RoICogNCkgLyA1OwotCQkJc3FfZmluYWwgPSAoKHUzMilzcmMtPlNpZ25hbFF1YWxpdHkgKwotCQkJCSAgICAodTMyKWRzdC0+U2lnbmFsUXVhbGl0eSAqIDQpIC8gNTsKLQkJCXJzc2lfZmluYWwgPSBzcmMtPlJzc2krZHN0LT5Sc3NpICogNCAvIDU7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBic3MgaW5mbyBub3QgcmVjZWl2aW5nIGZyb20gdGhlIHJpZ2h0IGNoYW5uZWwsIHVzZQotCQkJICAgdGhlIG9yaWdpbmFsIFJYIHNpZ25hbCBpbmZvcyAqLwotCQkJc3NfZmluYWwgPSBkc3QtPlNpZ25hbFN0cmVuZ3RoOwotCQkJc3FfZmluYWwgPSBkc3QtPlNpZ25hbFF1YWxpdHk7Ci0JCQlyc3NpX2ZpbmFsID0gZHN0LT5Sc3NpOwotCQl9Ci0KLQl9Ci0KLQlpZiAodXBkYXRlX2llKQotCQltZW1jcHkoZHN0LCBzcmMsIGdldF93bGFuX2Jzc2lkX2V4X3N6KHNyYykpOwotCi0JZHN0LT5TaWduYWxTdHJlbmd0aCA9IHNzX2ZpbmFsOwotCWRzdC0+U2lnbmFsUXVhbGl0eSA9IHNxX2ZpbmFsOwotCWRzdC0+UnNzaSA9IHJzc2lfZmluYWw7Ci0KLQlEQkdfODcyM0EoIiVzICVzKCVwTSksIFNpZ25hbFN0cmVuZ3RoOiV1LCBTaWduYWxRdWFsaXR5OiV1LCAiCi0JCSAgIlJhd1JTU0k6JWxkXG4iLCAgX19mdW5jX18sIGRzdC0+U3NpZC5zc2lkLCBkc3QtPk1hY0FkZHJlc3MsCi0JCSAgZHN0LT5TaWduYWxTdHJlbmd0aCwgZHN0LT5TaWduYWxRdWFsaXR5LCBkc3QtPlJzc2kpOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfY3VycmVudF9uZXR3b3JrKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgICBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmspCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSAmJgotCSAgICBpc19zYW1lX25ldHdvcmsyM2EoJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yaywgcG5ldHdvcmspKSB7Ci0JCXVwZGF0ZV9uZXR3b3JrMjNhKCZwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmssCi0JCQkJICBwbmV0d29yaywgYWRhcHRlciwgdHJ1ZSk7Ci0KLQkJcnR3X3VwZGF0ZV9wcm90ZWN0aW9uMjNhKGFkYXB0ZXIsCi0JCQkJCSBwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuSUVzLAotCQkJCQkgcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLklFTGVuZ3RoKTsKLQl9Ci19Ci0KLS8qCi0KLUNhbGxlciBtdXN0IGhvbGQgcG1sbWVwcml2LT5sb2NrIGZpcnN0LgotCi0qLwotc3RhdGljIHZvaWQgcnR3X3VwZGF0ZV9zY2FubmVkX25ldHdvcmsoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgICAgICBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqdGFyZ2V0KQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0LCAqcGhlYWQ7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrID0gTlVMTDsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpvbGRlc3QgPSBOVUxMOwotCXN0cnVjdCBydHdfcXVldWUgKnF1ZXVlID0gJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZTsKLQl1MzIgYnNzaWRfZXhfc3o7Ci0JaW50IGZvdW5kID0gMDsKLQotCXNwaW5fbG9ja19iaCgmcXVldWUtPmxvY2spOwotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JbGlzdF9mb3JfZWFjaChwbGlzdCwgcGhlYWQpIHsKLQkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwotCi0JCWlmIChpc19zYW1lX25ldHdvcmsyM2EoJnBuZXR3b3JrLT5uZXR3b3JrLCB0YXJnZXQpKSB7Ci0JCQlmb3VuZCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoIW9sZGVzdCB8fCB0aW1lX2FmdGVyKG9sZGVzdC0+bGFzdF9zY2FubmVkLAotCQkJCQkgIHBuZXR3b3JrLT5sYXN0X3NjYW5uZWQpKQotCQkJb2xkZXN0ID0gcG5ldHdvcms7Ci0JfQotCi0JLyogSWYgd2UgZGlkbid0IGZpbmQgYSBtYXRjaCwgdGhlbiBnZXQgYSBuZXcgbmV0d29yayBzbG90IHRvIGluaXRpYWxpemUKLQkgKiB3aXRoIHRoaXMgYmVhY29uJ3MgaW5mb3JtYXRpb24gKi8KLQlpZiAoIWZvdW5kKSB7Ci0JCXBuZXR3b3JrID0gcnR3X2FsbG9jX25ldHdvcmsocG1sbWVwcml2LCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFwbmV0d29yaykgewotCQkJaWYgKCFvbGRlc3QpIHsKLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJCQkgInNvbWV0aGluZyB3cm9uZyBoZXJlXG4iKTsKLQkJCQlnb3RvIGV4aXQ7Ci0JCQl9Ci0JCQlwbmV0d29yayA9IG9sZGVzdDsKLQkJfSBlbHNlCi0JCQlsaXN0X2FkZF90YWlsKCZwbmV0d29yay0+bGlzdCwgJnF1ZXVlLT5xdWV1ZSk7Ci0KLQkJYnNzaWRfZXhfc3ogPSBnZXRfd2xhbl9ic3NpZF9leF9zeih0YXJnZXQpOwotCQl0YXJnZXQtPkxlbmd0aCA9IGJzc2lkX2V4X3N6OwotCQltZW1jcHkoJnBuZXR3b3JrLT5uZXR3b3JrLCB0YXJnZXQsIGJzc2lkX2V4X3N6KTsKLQotCQkvKiAgdmFyaWFibGUgaW5pdGlhbGl6ZSAqLwotCQlwbmV0d29yay0+Zml4ZWQgPSBmYWxzZTsKLQkJcG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCA9IGppZmZpZXM7Ci0KLQkJcG5ldHdvcmstPm5ldHdvcmtfdHlwZSA9IDA7Ci0JCXBuZXR3b3JrLT5qb2luX3JlcyA9IDA7Ci0KLQkJLyogYnNzIGluZm8gbm90IHJlY2VpdmluZyBmcm9tIHRoZSByaWdodCBjaGFubmVsICovCi0JCWlmIChwbmV0d29yay0+bmV0d29yay5TaWduYWxRdWFsaXR5ID09IDEwMSkKLQkJCXBuZXR3b3JrLT5uZXR3b3JrLlNpZ25hbFF1YWxpdHkgPSAwOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIHdlIGhhdmUgYW4gZW50cnkgYW5kIHdlIGFyZSBnb2luZyB0byB1cGRhdGUgaXQuIEJ1dAotCQkgKiB0aGlzIGVudHJ5IG1heSBiZSBhbHJlYWR5IGV4cGlyZWQuIEluIHRoaXMgY2FzZSB3ZQotCQkgKiBkbyB0aGUgc2FtZSBhcyB3ZSBmb3VuZCBhIG5ldyBuZXQgYW5kIGNhbGwgdGhlCi0JCSAqIG5ld19uZXQgaGFuZGxlcgotCQkgKi8KLQkJYm9vbCB1cGRhdGVfaWUgPSB0cnVlOwotCi0JCXBuZXR3b3JrLT5sYXN0X3NjYW5uZWQgPSBqaWZmaWVzOwotCi0JCS8qIHRhcmdldC5yZXNlcnZlZCA9PSAxLCBtZWFucyB0aGF0IHNjYW5uZWQgbmV0d29yayBpcwotCQkgKiBhIGJjbiBmcmFtZS4gKi8KLQkJaWYgKHBuZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoID4gdGFyZ2V0LT5JRUxlbmd0aCAmJgotCQkgICAgdGFyZ2V0LT5yZXNlcnZlZCA9PSAxKQotCQkJdXBkYXRlX2llID0gZmFsc2U7Ci0KLQkJdXBkYXRlX25ldHdvcmsyM2EoJnBuZXR3b3JrLT5uZXR3b3JrLCB0YXJnZXQsIGFkYXB0ZXIsCi0JCQkJICB1cGRhdGVfaWUpOwotCX0KLQotZXhpdDoKLQlzcGluX3VubG9ja19iaCgmcXVldWUtPmxvY2spOwotfQotCi1zdGF0aWMgdm9pZCBydHdfYWRkX25ldHdvcmsoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJICAgIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yaykKLXsKLQl1cGRhdGVfY3VycmVudF9uZXR3b3JrKGFkYXB0ZXIsIHBuZXR3b3JrKTsKLQlydHdfdXBkYXRlX3NjYW5uZWRfbmV0d29yayhhZGFwdGVyLCBwbmV0d29yayk7Ci19Ci0KLS8qIHNlbGVjdCB0aGUgZGVzaXJlZCBuZXR3b3JrIGJhc2VkIG9uIHRoZSBjYXBhYmlsaXR5IG9mIHRoZSAoaSlic3MuICovCi0vKiAgY2hlY2sgaXRlbXM6ICgxKSBzZWN1cml0eSAqLwotLyoJCQkgICAoMikgbmV0d29ya190eXBlICovCi0vKgkJCSAgICgzKSBXTU0gKi8KLS8qCQkJICAgKDQpIEhUICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAoNSkgb3RoZXJzICovCi1zdGF0aWMgaW50IHJ0d19pc19kZXNpcmVkX25ldHdvcmsoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmspCi17Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQl1MzIgZGVzaXJlZF9lbmNtb2RlOwotCXUzMiBwcml2YWN5OwotCWludCBic2VsZWN0ZWQgPSB0cnVlOwotCi0JZGVzaXJlZF9lbmNtb2RlID0gcHNlY3VyaXR5cHJpdi0+bmRpc2VuY3J5cHRzdGF0dXM7Ci0JcHJpdmFjeSA9IHBuZXR3b3JrLT5uZXR3b3JrLlByaXZhY3k7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfVU5ERVJfV1BTKSkgewotCQlpZiAoY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xBTl9PVUlfTUlDUk9TT0ZULAotCQkJCQkgICAgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV1BBLAotCQkJCQkgICAgcG5ldHdvcmstPm5ldHdvcmsuSUVzLAotCQkJCQkgICAgcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0JaWYgKGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aWZpX3NwZWMgPT0gMSkgewotCQkvKiBmb3IgIGNvcnJlY3QgZmxvdyBvZiA4MDIxWCAgdG8gZG8uLi4uICovCi0JCWlmIChkZXNpcmVkX2VuY21vZGUgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCAmJgotCQkgICAgcHJpdmFjeSAhPSAwKQotCQkJYnNlbGVjdGVkID0gZmFsc2U7Ci0JfQotCi0JaWYgKGRlc2lyZWRfZW5jbW9kZSAhPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkICYmIHByaXZhY3kgPT0gMCkgewotCQlEQkdfODcyM0EoImRlc2lyZWRfZW5jbW9kZTogJWQsIHByaXZhY3k6ICVkXG4iLAotCQkJICBkZXNpcmVkX2VuY21vZGUsIHByaXZhY3kpOwotCQlic2VsZWN0ZWQgPSBmYWxzZTsKLQl9Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpKSB7Ci0JCWlmIChwbmV0d29yay0+bmV0d29yay5pZm1vZGUgIT0KLQkJICAgIHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5pZm1vZGUpCi0JCQlic2VsZWN0ZWQgPSBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gYnNlbGVjdGVkOwotfQotCi12b2lkIHJ0d19zdXJ2ZXlfZXZlbnRfY2IyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQl1MzIgbGVuOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yazsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHN1cnZleV9ldmVudCAqc3VydmV5ID0gKHN0cnVjdCBzdXJ2ZXlfZXZlbnQgKilwYnVmOwotCi0JcG5ldHdvcmsgPSBzdXJ2ZXktPmJzczsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgInJ0d19zdXJ2ZXlfZXZlbnRfY2IyM2EsIHNzaWQ9JXNcbiIsIHBuZXR3b3JrLT5Tc2lkLnNzaWQpOwotCi0JbGVuID0gZ2V0X3dsYW5fYnNzaWRfZXhfc3oocG5ldHdvcmspOwotCWlmIChsZW4gPiAoc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSkpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAiKioqKnJ0d19zdXJ2ZXlfZXZlbnRfY2IyM2E6IHJldHVybiBhIHdyb25nIGJzcyAqKipcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0JLyogIHVwZGF0ZSBJQlNTX25ldHdvcmsgJ3MgdGltZXN0YW1wICovCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpIHsKLQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwocG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLk1hY0FkZHJlc3MsCi0JCQkJICAgICBwbmV0d29yay0+TWFjQWRkcmVzcykpIHsKLQkJCXN0cnVjdCB3bGFuX25ldHdvcmsgKmlic3Nfd2xhbjsKLQotCQkJcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCA9Ci0JCQkJcG5ldHdvcmstPmJlYWNvbl9pbnRlcnZhbDsKLQkJCXBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5jYXBhYmlsaXR5ID0KLQkJCQlwbmV0d29yay0+Y2FwYWJpbGl0eTsKLQkJCXBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay50c2YgPSBwbmV0d29yay0+dHNmOwotCQkJc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0JCQlpYnNzX3dsYW4gPSBydHdfZmluZF9uZXR3b3JrMjNhKAotCQkJCSZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUsCi0JCQkJcG5ldHdvcmstPk1hY0FkZHJlc3MpOwotCQkJaWYgKGlic3Nfd2xhbikgewotCQkJCXBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5iZWFjb25faW50ZXJ2YWwgPQotCQkJCQlpYnNzX3dsYW4tPm5ldHdvcmsuYmVhY29uX2ludGVydmFsOwotCQkJCXBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5jYXBhYmlsaXR5ID0KLQkJCQkJaWJzc193bGFuLT5uZXR3b3JrLmNhcGFiaWxpdHk7Ci0JCQkJcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLnRzZiA9Ci0JCQkJCWlic3Nfd2xhbi0+bmV0d29yay50c2Y7Ci0JCQkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQkJCQlnb3RvIGV4aXQ7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCQl9Ci0JfQotCi0JLyogIGxvY2sgcG1sbWVwcml2LT5sb2NrIHdoZW4geW91IGFjY2Vzc2luZyBuZXR3b3JrX3EgKi8KLQlpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORykpIHsKLQkJaWYgKHBuZXR3b3JrLT5Tc2lkLnNzaWRbMF0gPT0gMCkKLQkJCXBuZXR3b3JrLT5Tc2lkLnNzaWRfbGVuID0gMDsKLQotCQlydHdfYWRkX25ldHdvcmsoYWRhcHRlciwgcG5ldHdvcmspOwotCX0KLQotZXhpdDoKLQotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0Ja2ZyZWUoc3VydmV5LT5ic3MpOwotCXN1cnZleS0+YnNzID0gTlVMTDsKLX0KLQotdm9pZAotcnR3X3N1cnZleWRvbmVfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJmFkYXB0ZXItPm1sbWVleHRwcml2OwotCWludCByZXQ7Ci0KLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLQlpZiAocG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llKSB7Ci0JCXBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZV9sZW4gPSAwOwotCQlrZnJlZShwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWUpOwotCQlwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWUgPSBOVUxMOwotCX0KLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgInJ0d19zdXJ2ZXlkb25lX2V2ZW50X2NhbGxiYWNrMjNhOiBmd19zdGF0ZToleFxuIiwKLQkJIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSkgewotCQlkZWxfdGltZXJfc3luYygmcG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyKTsKLQotCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSk7Ci0JfSBlbHNlIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAibmljIHN0YXR1cyA9JXgsIHN1cnZleSBkb25lIGV2ZW50IGNvbWVzIHRvbyBsYXRlIVxuIiwKLQkJCSBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKLQl9Ci0KLQlydHdfc2V0X3NpZ25hbF9zdGF0X3RpbWVyKCZhZGFwdGVyLT5yZWN2cHJpdik7Ci0KLQlpZiAocG1sbWVwcml2LT50b19qb2luID09IHRydWUpIHsKLQkJc2V0X2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyk7Ci0JCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSkpIHsKLQkJCXJldCA9IHJ0d19zZWxlY3RfYW5kX2pvaW5fZnJvbV9zY2FubmVkX3F1ZXVlMjNhKAotCQkJCXBtbG1lcHJpdik7Ci0JCQlpZiAocmV0ICE9IF9TVUNDRVNTKQotCQkJCXJ0d19kb19qb2luX2FkaG9jKGFkYXB0ZXIpOwotCQl9IGVsc2UgewotCQkJcG1sbWVwcml2LT50b19qb2luID0gZmFsc2U7Ci0JCQlyZXQgPSBydHdfc2VsZWN0X2FuZF9qb2luX2Zyb21fc2Nhbm5lZF9xdWV1ZTIzYSgKLQkJCQlwbWxtZXByaXYpOwotCQkJaWYgKHJldCAhPSBfU1VDQ0VTUykgewotCQkJCURCR184NzIzQSgidHJ5X3RvX2pvaW4sIGJ1dCBzZWxlY3Qgc2Nhbm5pbmcgIgotCQkJCQkgICJxdWV1ZSBmYWlsLCB0b19yb2FtaW5nOiVkXG4iLAotCQkJCQkgIGFkYXB0ZXItPm1sbWVwcml2LnRvX3JvYW1pbmcpOwotCQkJCWlmIChhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nKSB7Ci0JCQkJCWlmICgtLXBtbG1lcHJpdi0+dG9fcm9hbWluZyA9PSAwIHx8Ci0JCQkJCSAgICBydHdfc2l0ZXN1cnZleV9jbWQyM2EoCi0JCQkJCQkgICAgYWRhcHRlciwKLQkJCQkJCSAgICAmcG1sbWVwcml2LT5hc3NvY19zc2lkLCAxLAotCQkJCQkJICAgIE5VTEwsIDApICE9IF9TVUNDRVNTKSB7Ci0JCQkJCQlydHdfc2V0X3JvYW1pbmcoYWRhcHRlciwgMCk7Ci0JCQkJCQlydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2EoCi0JCQkJCQkJYWRhcHRlciwgMSk7Ci0JCQkJCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYSgKLQkJCQkJCQlhZGFwdGVyKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlwbWxtZXByaXYtPnRvX2pvaW4gPSB0cnVlOwotCQkJCX0KLQkJCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpOwotCQkJfQotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLQlydHdfb3NfeG1pdF9zY2hlZHVsZTIzYShhZGFwdGVyKTsKLQotCWlmIChwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuYnNzX2NudCA9PSAwKQotCQlydHdfc3Jlc2V0X3Jlc2V0KGFkYXB0ZXIpOwotCi0JcnR3X2NmZzgwMjExX3N1cnZleWRvbmVfZXZlbnRfY2FsbGJhY2soYWRhcHRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfc2NhbnF1ZXVlKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKLXsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaywgKnB0ZW1wOwotCXN0cnVjdCBydHdfcXVldWUgKnNjYW5fcXVldWUgPSAmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywgIitmcmVlX3NjYW5xdWV1ZVxuIik7Ci0Jc3Bpbl9sb2NrX2JoKCZzY2FuX3F1ZXVlLT5sb2NrKTsKLQlwaGVhZCA9IGdldF9saXN0X2hlYWQoc2Nhbl9xdWV1ZSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBuZXR3b3JrLCBwdGVtcCwgcGhlYWQsIGxpc3QpIHsKLQkJcG5ldHdvcmstPmZpeGVkID0gZmFsc2U7Ci0JCV9ydHdfZnJlZV9uZXR3b3JrMjNhKHBtbG1lcHJpdiwgcG5ldHdvcmspOwotCX0KLQlzcGluX3VubG9ja19iaCgmc2Nhbl9xdWV1ZS0+bG9jayk7Ci19Ci0KLS8qCi0gKnJ0d19mcmVlX2Fzc29jX3Jlc291cmNlczIzYTogdGhlIGNhbGxlciBoYXMgdG8gbG9jayBwbWxtZXByaXYtPmxvY2sKLSAqLwotdm9pZCBydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJCSBpbnQgbG9ja19zY2FubmVkX3F1ZXVlKQotewotCXN0cnVjdCB3bGFuX25ldHdvcmsgKnB3bGFuOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJmFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqdGd0X25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9ub3RpY2VfLAotCQkgIitydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2FcbiIpOwotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgInRndF9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3M9JXBNIHNzaWQ9JXNcbiIsCi0JCSB0Z3RfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLAotCQkgdGd0X25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFfFdJRklfQVBfU1RBVEUpKSB7Ci0JCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EoJmFkYXB0ZXItPnN0YXByaXYsCi0JCQkJCSAgdGd0X25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0KLQkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JCXJ0d19mcmVlX3N0YWluZm8yM2EoYWRhcHRlciwgIHBzdGEpOwotCQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCX0KLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSB8Ci0JCQkgIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFfFdJRklfQVBfU1RBVEUpKSB7Ci0JCXJ0d19mcmVlX2FsbF9zdGFpbmZvMjNhKGFkYXB0ZXIpOwotCi0JCXBzdGEgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShhZGFwdGVyKTsKLQkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JCXJ0d19mcmVlX3N0YWluZm8yM2EoYWRhcHRlciwgcHN0YSk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0KLQkJcnR3X2luaXRfYmNtY19zdGFpbmZvMjNhKGFkYXB0ZXIpOwotCX0KLQotCWlmIChsb2NrX3NjYW5uZWRfcXVldWUpCi0JCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCi0JcHdsYW4gPSBydHdfZmluZF9uZXR3b3JrMjNhKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUsCi0JCQkJICAgIHRndF9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCWlmIChwd2xhbikKLQkJcHdsYW4tPmZpeGVkID0gZmFsc2U7Ci0JZWxzZQotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICJydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2EgOiBwd2xhbj09IE5VTExcbiIpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkgJiYKLQkgICAgYWRhcHRlci0+c3RhcHJpdi5hc29jX3N0YV9jb3VudCA9PSAxKQotCQlydHdfZnJlZV9uZXR3b3JrX25vbG9jayhwbWxtZXByaXYsIHB3bGFuKTsKLQotCWlmIChsb2NrX3NjYW5uZWRfcXVldWUpCi0JCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0KLQlwbWxtZXByaXYtPmtleV9tYXNrID0gMDsKLX0KLQotLyoKLSpydHdfaW5kaWNhdGVfY29ubmVjdDIzYTogdGhlIGNhbGxlciBoYXMgdG8gbG9jayBwbWxtZXByaXYtPmxvY2sKLSovCi12b2lkIHJ0d19pbmRpY2F0ZV9jb25uZWN0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCSAiK3J0d19pbmRpY2F0ZV9jb25uZWN0MjNhXG4iKTsKLQotCXBtbG1lcHJpdi0+dG9fam9pbiA9IGZhbHNlOwotCi0JaWYgKCFjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIF9GV19MSU5LRUQpKSB7Ci0JCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCk7Ci0KLQkJcnR3X2NmZzgwMjExX2luZGljYXRlX2Nvbm5lY3QocGFkYXB0ZXIpOwotCi0JCW5ldGlmX2NhcnJpZXJfb24ocGFkYXB0ZXItPnBuZXRkZXYpOwotCi0JCWlmIChwYWRhcHRlci0+cGlkWzJdICE9IDApCi0JCQlraWxsX3BpZChmaW5kX3ZwaWQocGFkYXB0ZXItPnBpZFsyXSksIFNJR0FMUk0sIDEpOwotCX0KLQotCXJ0d19zZXRfcm9hbWluZyhwYWRhcHRlciwgMCk7Ci0KLQlydHdfc2V0X3NjYW5fZGVueShwYWRhcHRlciwgMzAwMCk7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkgIi1ydHdfaW5kaWNhdGVfY29ubmVjdDIzYTogZndfc3RhdGU9MHglMDh4XG4iLAotCQkgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci19Ci0KLS8qCi0gKnJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhOiB0aGUgY2FsbGVyIGhhcyB0byBsb2NrIHBtbG1lcHJpdi0+bG9jawotICovCi12b2lkIHJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCSAiK3J0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhXG4iKTsKLQotCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lOR3xXSUZJX1VOREVSX1dQUyk7Ci0KLQkvKiBEQkdfODcyM0EoImNsZWFyIHdwcyB3aGVuICVzXG4iLCBfX2Z1bmNfXyk7ICovCi0KLQlpZiAocGFkYXB0ZXItPm1sbWVwcml2LnRvX3JvYW1pbmcgPiAwKQotCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCk7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBfRldfTElOS0VEKSB8fAotCSAgICBwYWRhcHRlci0+bWxtZXByaXYudG9fcm9hbWluZyA8PSAwKSB7Ci0JCXJ0d19vc19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHBhZGFwdGVyKTsKLQotCQkvKiBzZXQgaXBzX2RlbnlfdGltZSB0byBhdm9pZCBlbnRlciBJUFMgYmVmb3JlIExQUyBsZWF2ZSAqLwotCQlwYWRhcHRlci0+cHdyY3RybHByaXYuaXBzX2RlbnlfdGltZSA9Ci0JCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygzMDAwKTsKLQotCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCk7Ci0KLQkJcnR3X2NsZWFyX3NjYW5fZGVueShwYWRhcHRlcik7Ci0JfQotCi0JcnR3X2xwc19jdHJsX3drX2NtZDIzYShwYWRhcHRlciwgTFBTX0NUUkxfRElTQ09OTkVDVCwgMSk7Ci19Ci0KLXZvaWQgcnR3X3NjYW5fYWJvcnQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCXVuc2lnbmVkIGxvbmcgc3RhcnQ7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCXN0YXJ0ID0gamlmZmllczsKLQlwbWxtZWV4dC0+c2Nhbl9hYm9ydCA9IHRydWU7Ci0Jd2hpbGUgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSAmJgotCSAgICAgICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkgPD0gMjAwKSB7Ci0JCWlmIChhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKQotCQkJYnJlYWs7Ci0KLQkJREJHXzg3MjNBKCIlcyglcyk6IGZ3X3N0YXRlID0gX0ZXX1VOREVSX1NVUlZFWSFcbiIsCi0JCQkgIF9fZnVuY19fLCBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQkJbXNsZWVwKDIwKTsKLQl9Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpKSB7Ci0JCWlmICghYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgJiYgIWFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpCi0JCQlEQkdfODcyM0EoIiVzKCVzKTogd2FpdGluZyBmb3Igc2Nhbl9hYm9ydCB0aW1lIG91dCFcbiIsCi0JCQkJICBfX2Z1bmNfXywgYWRhcHRlci0+cG5ldGRldi0+bmFtZSk7Ci0JCXJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zY2FuX2RvbmUod2Rldl90b19wcml2KGFkYXB0ZXItPnJ0d193ZGV2KSwKLQkJCQkJCXRydWUpOwotCX0KLQlwbWxtZWV4dC0+c2Nhbl9hYm9ydCA9IGZhbHNlOwotfQotCi1zdGF0aWMgc3RydWN0IHN0YV9pbmZvICoKLXJ0d19qb2luYnNzX3VwZGF0ZV9zdGFpbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaykKLXsKLQlpbnQgaTsKLQlzdHJ1Y3Qgc3RhX2luZm8gKmJtY19zdGEsICpwc3RhOwotCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybDsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JaWYgKCFwc3RhKQotCQlwc3RhID0gcnR3X2FsbG9jX3N0YWluZm8yM2EocHN0YXByaXYsCi0JCQkJCSAgICBwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLAotCQkJCQkgICAgR0ZQX0FUT01JQyk7Ci0KLQlpZiAocHN0YSkgeyAvKiB1cGRhdGUgcHRhcmdldF9zdGEgKi8KLQkJREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JCXBzdGEtPmFpZCAgPSBwbmV0d29yay0+am9pbl9yZXM7Ci0JCXBzdGEtPm1hY19pZCA9IDA7Ci0KLQkJLyogc3RhIG1vZGUgKi8KLQkJcnRsODcyM2FfU2V0SGFsT0RNVmFyKHBhZGFwdGVyLCBIQUxfT0RNX1NUQV9JTkZPLCBwc3RhLCB0cnVlKTsKLQotCQkvKiBzZWN1cml0eSByZWxhdGVkICovCi0JCWlmIChwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExQXV0aEFsZ3J0aG0gPT0KLQkJICAgIGRvdDExQXV0aEFsZ3J0aG1fODAyMVgpIHsKLQkJCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuYmluc3RhbGxHcnBrZXkgPSAwOwotCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSA9IDA7Ci0KLQkJCXBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID0gdHJ1ZTsKLQkJCXBzdGEtPmRvdDExODAyMVhQcml2YWN5ID0KLQkJCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG07Ci0KLQkJCW1lbXNldCgmcHN0YS0+ZG90MTE4MDIxeF9VbmNzdEtleSwgMCwKLQkJCSAgICAgICBzaXplb2YgKHVuaW9uIEtleXR5cGUpKTsKLQotCQkJbWVtc2V0KCZwc3RhLT5kb3QxMXRraXByeG1pY2tleSwgMCwKLQkJCSAgICAgICBzaXplb2YgKHVuaW9uIEtleXR5cGUpKTsKLQkJCW1lbXNldCgmcHN0YS0+ZG90MTF0a2lwdHhtaWNrZXksIDAsCi0JCQkgICAgICAgc2l6ZW9mICh1bmlvbiBLZXl0eXBlKSk7Ci0KLQkJCW1lbXNldCgmcHN0YS0+ZG90MTF0eHBuLCAwLCBzaXplb2YgKHVuaW9uIHBuNDgpKTsKLQkJCW1lbXNldCgmcHN0YS0+ZG90MTFyeHBuLCAwLCBzaXplb2YgKHVuaW9uIHBuNDgpKTsKLQkJfQotCi0JCS8qCUNvbW1lbnRlZCBieSBBbGJlcnQgMjAxMi8wNy8yMSAqLwotCQkvKglXaGVuIGRvaW5nIHRoZSBXUFMsIHRoZSB3cHNfaWVfbGVuIHdvbid0IGVxdWFsIHRvIDAgKi8KLQkJLyoJQW5kIHRoZSBXaS1GaSBkcml2ZXIgc2hvdWxkbid0IGFsbG93IHRoZSBkYXRhIHBhY2tldAotCQkJdG8gYmUgdHJhbnNtaXR0ZWQuICovCi0JCWlmIChwYWRhcHRlci0+c2VjdXJpdHlwcml2Lndwc19pZV9sZW4gIT0gMCkgewotCQkJcHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPSB0cnVlOwotCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi53cHNfaWVfbGVuID0gMDsKLQkJfQotCi0JCS8qIGZvciBBLU1QRFUgUnggcmVvcmRlcmluZyBidWZmZXIgY29udHJvbCBmb3IgYm1jX3N0YSAmCi0JCSAqIHN0YV9pbmZvICovCi0JCS8qIGlmIEEtTVBEVSBSeCBpcyBlbmFibGVkLCByZXNldHRpbmcKLQkJICAgcnhfb3JkZXJpbmdfY3RybCB3c3RhcnRfYihpbmRpY2F0ZV9zZXEpIHRvIGRlZmF1bHQKLQkJICAgdmFsdWUgPSAweGZmZmYgKi8KLQkJLyogdG9kbzogY2hlY2sgaWYgQVAgY2FuIHNlbmQgQS1NUERVIHBhY2tldHMgKi8KLQkJZm9yIChpID0gMDsgaSA8IDE2IDsgaSsrKSB7Ci0JCQkvKiBwcmVvcmRlcl9jdHJsID0gJnByZWN2cHJpdi0+cmVjdnJlb3JkZXJfY3RybFtpXTsgKi8KLQkJCXByZW9yZGVyX2N0cmwgPSAmcHN0YS0+cmVjdnJlb3JkZXJfY3RybFtpXTsKLQkJCXByZW9yZGVyX2N0cmwtPmVuYWJsZSA9IGZhbHNlOwotCQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0gMHhmZmZmOwotCQkJcHJlb3JkZXJfY3RybC0+d2VuZF9iID0gMHhmZmZmOwotCQkJLyogbWF4X2FtcGR1X3N6OyBleC4gMzIoa2J5dGVzKSAtPiB3c2l6ZV9iID0gMzIgKi8KLQkJCXByZW9yZGVyX2N0cmwtPndzaXplX2IgPSA2NDsKLQkJfQotCi0JCWJtY19zdGEgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0JCWlmIChibWNfc3RhKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgMTYgOyBpKyspIHsKLQkJCQlwcmVvcmRlcl9jdHJsID0gJmJtY19zdGEtPnJlY3ZyZW9yZGVyX2N0cmxbaV07Ci0JCQkJcHJlb3JkZXJfY3RybC0+ZW5hYmxlID0gZmFsc2U7Ci0JCQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0gMHhmZmZmOwotCQkJCXByZW9yZGVyX2N0cmwtPndlbmRfYiA9IDB4ZmZmZjsKLQkJCQkvKiBtYXhfYW1wZHVfc3o7IGV4LiAzMihrYnl0ZXMpIC0+Ci0JCQkJICAgd3NpemVfYiA9IDMyICovCi0JCQkJcHJlb3JkZXJfY3RybC0+d3NpemVfYiA9IDY0OwotCQkJfQotCQl9Ci0KLQkJLyogbWlzYy4gKi8KLQkJdXBkYXRlX3N0YV9pbmZvMjNhKHBhZGFwdGVyLCBwc3RhKTsKLQotCX0KLQotCXJldHVybiBwc3RhOwotfQotCi0vKiBwbmV0d29yayA6IHJldHVybnMgZnJvbSBydHcyM2Ffam9pbmJzc19ldmVudF9jYiAqLwotLyogcHRhcmdldF93bGFuOiBmb3VuZCBmcm9tIHNjYW5uZWRfcXVldWUgKi8KLXN0YXRpYyB2b2lkCi1ydHdfam9pbmJzc191cGRhdGVfbmV0d29yazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgc3RydWN0IHdsYW5fbmV0d29yayAqcHRhcmdldF93bGFuLAotCQkJICAgICAgc3RydWN0IHdsYW5fbmV0d29yayAgKnBuZXR3b3JrKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgImZ3X3N0YXRlOiV4LCBCU1NJRDolcE1cbiIsCi0JCSBnZXRfZndzdGF0ZShwbWxtZXByaXYpLAotCQkgcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0KLQkvKiAgd2h5IG5vdCB1c2UgcHRhcmdldF93bGFuPz8gKi8KLQltZW1jcHkoJmN1cl9uZXR3b3JrLT5uZXR3b3JrLCAmcG5ldHdvcmstPm5ldHdvcmssCi0JICAgICAgIHBuZXR3b3JrLT5uZXR3b3JrLkxlbmd0aCk7Ci0JLyogIHNvbWUgSUVzIGluIHBuZXR3b3JrIGlzIHdyb25nLCBzbyB3ZSBzaG91bGQgdXNlIHB0YXJnZXRfd2xhbiBJRXMgKi8KLQljdXJfbmV0d29yay0+bmV0d29yay5JRUxlbmd0aCA9IHB0YXJnZXRfd2xhbi0+bmV0d29yay5JRUxlbmd0aDsKLQltZW1jcHkoJmN1cl9uZXR3b3JrLT5uZXR3b3JrLklFc1swXSwgJnB0YXJnZXRfd2xhbi0+bmV0d29yay5JRXNbMF0sCi0JICAgICAgIE1BWF9JRV9TWik7Ci0KLQljdXJfbmV0d29yay0+bmV0d29yay5jYXBhYmlsaXR5ID0gcHRhcmdldF93bGFuLT5uZXR3b3JrLmNhcGFiaWxpdHk7Ci0JY3VyX25ldHdvcmstPm5ldHdvcmsuYmVhY29uX2ludGVydmFsID0KLQkJcHRhcmdldF93bGFuLT5uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbDsKLQljdXJfbmV0d29yay0+bmV0d29yay50c2YgPSBwdGFyZ2V0X3dsYW4tPm5ldHdvcmsudHNmOwotCi0JcnR3X3NldF9zaWduYWxfc3RhdF90aW1lcigmcGFkYXB0ZXItPnJlY3Zwcml2KTsKLQlwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3N0cmVuZ3RoID0KLQkJcHRhcmdldF93bGFuLT5uZXR3b3JrLlNpZ25hbFN0cmVuZ3RoOwotCXBhZGFwdGVyLT5yZWN2cHJpdi5zaWduYWxfcXVhbCA9IHB0YXJnZXRfd2xhbi0+bmV0d29yay5TaWduYWxRdWFsaXR5OwotCS8qCi0JICogdGhlIHB0YXJnZXRfd2xhbi0+bmV0d29yay5Sc3NpIGlzIHJhdyBkYXRhLCB3ZSB1c2UKLQkgKiBwdGFyZ2V0X3dsYW4tPm5ldHdvcmsuU2lnbmFsU3RyZW5ndGggaW5zdGVhZCAoaGFzIHNjYWxlZCkKLQkgKi8KLQlEQkdfODcyM0EoIiVzIHNpZ25hbF9zdHJlbmd0aDolM3UsIHNpZ25hbF9xdWFsOiUzdVxuIiwKLQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnJlY3Zwcml2LnNpZ25hbF9zdHJlbmd0aCwKLQkJICBwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3F1YWwpOwotCXJ0d19zZXRfc2lnbmFsX3N0YXRfdGltZXIoJnBhZGFwdGVyLT5yZWN2cHJpdik7Ci0KLQkvKiB1cGRhdGUgZndfc3RhdGUgd2lsbCBjbHIgX0ZXX1VOREVSX0xJTktJTkcgaGVyZSBpbmRpcmVjdGx5ICovCi0Jc3dpdGNoIChwbmV0d29yay0+bmV0d29yay5pZm1vZGUpIHsKLQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQlpZiAocG1sbWVwcml2LT5md19zdGF0ZSAmIFdJRklfVU5ERVJfV1BTKQotCQkJcG1sbWVwcml2LT5md19zdGF0ZSA9IFdJRklfU1RBVElPTl9TVEFURXxXSUZJX1VOREVSX1dQUzsKLQkJZWxzZQotCQkJcG1sbWVwcml2LT5md19zdGF0ZSA9IFdJRklfU1RBVElPTl9TVEFURTsKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKLQkJcG1sbWVwcml2LT5md19zdGF0ZSA9IFdJRklfQURIT0NfU1RBVEU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXBtbG1lcHJpdi0+Zndfc3RhdGUgPSBXSUZJX05VTExfU1RBVEU7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkludmFsaWQgbmV0d29ya19tb2RlXG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0JcnR3X3VwZGF0ZV9wcm90ZWN0aW9uMjNhKHBhZGFwdGVyLCBjdXJfbmV0d29yay0+bmV0d29yay5JRXMsCi0JCQkJIGN1cl9uZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoKTsKLQotCXJ0d191cGRhdGVfaHRfY2FwMjNhKHBhZGFwdGVyLCBjdXJfbmV0d29yay0+bmV0d29yay5JRXMsCi0JCQkgICAgIGN1cl9uZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoKTsKLX0KLQotLyoKLSAqIE5vdGVzOgotICogdGhlIGZ1bmN0aW9uIGNvdWxkIGJlID4gcGFzc2l2ZV9sZXZlbCAodGhlIHNhbWUgY29udGV4dCBhcyBSeCB0YXNrbGV0KQotICogcG5ldHdvcmsgOiByZXR1cm5zIGZyb20gcnR3MjNhX2pvaW5ic3NfZXZlbnRfY2IKLSAqIHB0YXJnZXRfd2xhbjogZm91bmQgZnJvbSBzY2FubmVkX3F1ZXVlCi0gKiBpZiBqb2luX3JlcyA+IDAsIGZvciAoZndfc3RhdGU9PVdJRklfU1RBVElPTl9TVEFURSksCi0gKiB3ZSBjaGVjayBpZiAgInB0YXJnZXRfc3RhIiAmICJwdGFyZ2V0X3dsYW4iIGV4aXN0LgotICogaWYgam9pbl9yZXMgPiAwLCBmb3IgKGZ3X3N0YXRlPT1XSUZJX0FESE9DX1NUQVRFKSwKLSAqIHdlIG9ubHkgY2hlY2sgaWYgInB0YXJnZXRfd2xhbiIgZXhpc3QuCi0gKiBpZiBqb2luX3JlcyA+IDAsIHVwZGF0ZSAiY3VyX25ldHdvcmstPm5ldHdvcmsiIGZyb20gInBuZXR3b3JrLT5uZXR3b3JrIgotICogaWYgKHB0YXJnZXRfd2xhbiAhPU5VTEwpLgotICovCi0KLXZvaWQgcnR3X2pvaW5ic3NfZXZlbnRfcHJlaGFuZGxlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTggKnBidWYpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpwdGFyZ2V0X3N0YSwgKnBjdXJfc3RhOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmsgPSAoc3RydWN0IHdsYW5fbmV0d29yayAqKXBidWY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwY3VyX3dsYW4sICpwdGFyZ2V0X3dsYW4gPSBOVUxMOwotCWJvb2wgdGhlX3NhbWVfbWFjYWRkcjsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgImpvaW5ic3MgZXZlbnQgY2FsbCBiYWNrIHJlY2VpdmVkIHdpdGggcmVzPSVkXG4iLAotCQkgcG5ldHdvcmstPmpvaW5fcmVzKTsKLQotCWlmIChwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZF9sZW4gPT0gMCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICJAQEBAQCAgIGpvaW5ic3MgZXZlbnQgY2FsbCBiYWNrICBmb3IgQW55IFNTaWRcbiIpOwotCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkBAQEBAICAgcnR3MjNhX2pvaW5ic3NfZXZlbnRfY2IgZm9yIFNTaWQ6JXNcbiIsCi0JCQkgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQpOwotCX0KLQotCWlmIChldGhlcl9hZGRyX2VxdWFsKHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsCi0JCQkgICAgIGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpKQotCQl0aGVfc2FtZV9tYWNhZGRyID0gdHJ1ZTsKLQllbHNlCi0JCXRoZV9zYW1lX21hY2FkZHIgPSBmYWxzZTsKLQotCXBuZXR3b3JrLT5uZXR3b3JrLkxlbmd0aCA9IGdldF93bGFuX2Jzc2lkX2V4X3N6KCZwbmV0d29yay0+bmV0d29yayk7Ci0JaWYgKHBuZXR3b3JrLT5uZXR3b3JrLkxlbmd0aCA+IHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCkpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAiKioqam9pbmJzc19ldnRfY2FsbGJhY2sgcmV0dXJuIGEgd3JvbmcgYnNzICoqKlxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJICJydHcyM2Ffam9pbmJzc19ldmVudF9jYiAhISBfZW50ZXJfY3JpdGljYWxcbiIpOwotCi0JaWYgKHBuZXR3b3JrLT5qb2luX3JlcyA+IDApIHsKLQkJc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0JCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpKSB7Ci0JCQkvKiBzMS4gZmluZCBwdGFyZ2V0X3dsYW4gKi8KLQkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJCQlpZiAodGhlX3NhbWVfbWFjYWRkcikgewotCQkJCQlwdGFyZ2V0X3dsYW4gPSBydHdfZmluZF9uZXR3b3JrMjNhKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUsIGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBjdXJfd2xhbiA9IHJ0d19maW5kX25ldHdvcmsyM2EoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZSwgY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JCQkJCWlmIChwY3VyX3dsYW4pCi0JCQkJCQlwY3VyX3dsYW4tPmZpeGVkID0gZmFsc2U7Ci0KLQkJCQkJcGN1cl9zdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCQkJCQlpZiAocGN1cl9zdGEpIHsKLQkJCQkJCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCQkJCQkJcnR3X2ZyZWVfc3RhaW5mbzIzYShhZGFwdGVyLAotCQkJCQkJCQkgICAgcGN1cl9zdGEpOwotCQkJCQkJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQkJCQkJfQotCi0JCQkJCXB0YXJnZXRfd2xhbiA9IHJ0d19maW5kX25ldHdvcmsyM2EoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZSwgcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JCQkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwKLQkJCQkJCQkgIFdJRklfU1RBVElPTl9TVEFURSkpIHsKLQkJCQkJCWlmIChwdGFyZ2V0X3dsYW4pCi0JCQkJCQkJcHRhcmdldF93bGFuLT5maXhlZCA9Ci0JCQkJCQkJCXRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJcHRhcmdldF93bGFuID0gcnR3X2ZpbmRfbmV0d29yazIzYSgKLQkJCQkJJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZSwKLQkJCQkJcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LAotCQkJCQkJICBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCQkJCWlmIChwdGFyZ2V0X3dsYW4pCi0JCQkJCQlwdGFyZ2V0X3dsYW4tPmZpeGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIHMyLiB1cGRhdGUgY3VyX25ldHdvcmsgKi8KLQkJCWlmIChwdGFyZ2V0X3dsYW4pCi0JCQkJcnR3X2pvaW5ic3NfdXBkYXRlX25ldHdvcmsyM2EoYWRhcHRlciwKLQkJCQkJCQkgICAgICBwdGFyZ2V0X3dsYW4sCi0JCQkJCQkJICAgICAgcG5ldHdvcmspOwotCQkJZWxzZSB7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCQkJICJDYW4ndCBmaW5kIHB0YXJnZXRfd2xhbiB3aGVuIGpvaW5ic3NfZXZlbnQgY2FsbGJhY2tcbiIpOwotCQkJCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0JCQkJZ290byBpZ25vcmVfam9pbmJzc19jYWxsYmFjazsKLQkJCX0KLQotCQkJLyogczMuIGZpbmQgcHRhcmdldF9zdGEgJiB1cGRhdGUgcHRhcmdldF9zdGEgYWZ0ZXIKLQkJCSAgIHVwZGF0ZSBjdXJfbmV0d29yayBvbmx5IGZvciBzdGF0aW9uIG1vZGUgKi8KLQkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkgewotCQkJCXB0YXJnZXRfc3RhID0gcnR3X2pvaW5ic3NfdXBkYXRlX3N0YWluZm8oCi0JCQkJCWFkYXB0ZXIsIHBuZXR3b3JrKTsKLQkJCQlpZiAoIXB0YXJnZXRfc3RhKSB7Ci0JCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLAotCQkJCQkJIF9kcnZfZXJyXywKLQkJCQkJCSAiQ2FuJ3QgdXBkYXRlIHN0YWluZm8gd2hlbiBqb2luYnNzX2V2ZW50IGNhbGxiYWNrXG4iKTsKLQkJCQkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQkJCQkJZ290byBpZ25vcmVfam9pbmJzc19jYWxsYmFjazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIHM0LiBpbmRpY2F0ZSBjb25uZWN0ICovCi0JCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpCi0JCQkJcnR3X2luZGljYXRlX2Nvbm5lY3QyM2EoYWRhcHRlcik7Ci0JCQllbHNlIHsKLQkJCQkvKiBhZGhvYyBtb2RlIHdpbGwgcnR3X2luZGljYXRlX2Nvbm5lY3QyM2EKLQkJCQkgICB3aGVuIHJ0d19zdGFzc29jX2V2ZW50X2NhbGxiYWNrMjNhICovCi0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiYWRob2MgbW9kZSwgZndfc3RhdGU6JXhcbiIsCi0JCQkJCSBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKLQkJCX0KLQotCQkJLyogczUuIENhbmNsZSBhc3NvY190aW1lciAqLwotCQkJZGVsX3RpbWVyX3N5bmMoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIpOwotCi0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCQkgIkNhbmNsZSBhc3NvY190aW1lclxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJCSAicnR3MjNhX2pvaW5ic3NfZXZlbnRfY2IgZXJyOiBmd19zdGF0ZToleFxuIiwKLQkJCQkgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci0JCQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCQkJZ290byBpZ25vcmVfam9pbmJzc19jYWxsYmFjazsKLQkJfQotCQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCX0gZWxzZSBpZiAocG5ldHdvcmstPmpvaW5fcmVzID09IC00KSB7Ci0JCXJ0d19yZXNldF9zZWN1cml0eXByaXYyM2EoYWRhcHRlcik7Ci0JCW1vZF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwotCi0JCS8qIHJ0d19mcmVlX2Fzc29jX3Jlc291cmNlczIzYShhZGFwdGVyLCAxKTsgKi8KLQotCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKSkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCQkgImZhaWwhIGNsZWFyIF9GV19VTkRFUl9MSU5LSU5HIF5eXmZ3X3N0YXRlPSV4XG4iLAotCQkJCSBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKLQkJCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBpZiBqb2luX3JlcyA8IDAgKGpvaW4gZmFpbHMpLCB0aGVuIHRyeSBhZ2FpbiAqLwotCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKLQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKTsKLQl9Ci0KLWlnbm9yZV9qb2luYnNzX2NhbGxiYWNrOgotCi0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci19Ci0KLXZvaWQgcnR3MjNhX2pvaW5ic3NfZXZlbnRfY2Ioc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yayA9IChzdHJ1Y3Qgd2xhbl9uZXR3b3JrICopcGJ1ZjsKLQotCW1sbWVleHRfam9pbmJzc19ldmVudF9jYWxsYmFjazIzYShhZGFwdGVyLCBwbmV0d29yay0+am9pbl9yZXMpOwotCi0JcnR3X29zX3htaXRfc2NoZWR1bGUyM2EoYWRhcHRlcik7Ci19Ci0KLXZvaWQgcnR3X3N0YXNzb2NfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzdGFzc29jX2V2ZW50ICpwc3Rhc3NvYyA9IChzdHJ1Y3Qgc3Rhc3NvY19ldmVudCAqKXBidWY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwdGFyZ2V0X3dsYW47Ci0KLQlpZiAocnR3X2FjY2Vzc19jdHJsMjNhKGFkYXB0ZXIsIHBzdGFzc29jLT5tYWNhZGRyKSA9PSBmYWxzZSkKLQkJcmV0dXJuOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgewotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKCZhZGFwdGVyLT5zdGFwcml2LCBwc3Rhc3NvYy0+bWFjYWRkcik7Ci0JCWlmIChwc3RhKSB7Ci0JCQkvKiBic3NfY2FwX3VwZGF0ZV9vbl9zdGFfam9pbjIzYShhZGFwdGVyLCBwc3RhKTsgKi8KLQkJCS8qIHN0YV9pbmZvX3VwZGF0ZTIzYShhZGFwdGVyLCBwc3RhKTsgKi8KLQkJCWFwX3N0YV9pbmZvX2RlZmVyX3VwZGF0ZTIzYShhZGFwdGVyLCBwc3RhKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotI2VuZGlmCi0JLyogZm9yIEFELUhPQyBtb2RlICovCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmYWRhcHRlci0+c3RhcHJpdiwgcHN0YXNzb2MtPm1hY2FkZHIpOwotCWlmIChwc3RhICE9IE5VTEwpIHsKLQkJLyogdGhlIHN0YSBoYXZlIGJlZW4gaW4gc3RhX2luZm9fcXVldWUgPT4gZG8gbm90aGluZyAqLwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICJFcnJvcjogcnR3X3N0YXNzb2NfZXZlbnRfY2FsbGJhY2syM2E6IHN0YSBoYXMgYmVlbiBpbiBzdGFfaGFzaF9xdWV1ZVxuIik7Ci0JCS8qIGJldHdlZW4gZHJ2IGhhcyByZWNlaXZlZCB0aGlzIGV2ZW50IGJlZm9yZSBhbmQKLQkJICAgZncgaGF2ZSBub3QgeWV0IHRvIHNldCBrZXkgdG8gQ0FNX0VOVFJZKSAqLwotCQlyZXR1cm47Ci0JfQotCi0JcHN0YSA9IHJ0d19hbGxvY19zdGFpbmZvMjNhKCZhZGFwdGVyLT5zdGFwcml2LCBwc3Rhc3NvYy0+bWFjYWRkciwKLQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwc3RhKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkNhbid0IGFsbG9jIHN0YV9pbmZvIHdoZW4gcnR3X3N0YXNzb2NfZXZlbnRfY2FsbGJhY2syM2FcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogdG8gZG8gOiBpbml0IHN0YV9pbmZvIHZhcmlhYmxlICovCi0JcHN0YS0+cW9zX29wdGlvbiA9IDA7Ci0JcHN0YS0+bWFjX2lkID0gKHVpbnQpcHN0YXNzb2MtPmNhbV9pZDsKLQkvKiBwc3RhLT5haWQgPSAodWludClwc3Rhc3NvYy0+Y2FtX2lkOyAqLwotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQkvKiBmb3IgYWQtaG9jIG1vZGUgKi8KLQlydGw4NzIzYV9TZXRIYWxPRE1WYXIoYWRhcHRlciwgSEFMX09ETV9TVEFfSU5GTywgcHN0YSwgdHJ1ZSk7Ci0KLQlpZiAoYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExQXV0aEFsZ3J0aG0gPT0gZG90MTFBdXRoQWxncnRobV84MDIxWCkKLQkJcHN0YS0+ZG90MTE4MDIxWFByaXZhY3kgPQotCQkJYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG07Ci0KLQlwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9IGZhbHNlOwotCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkgfHwKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpKSB7Ci0JCWlmIChhZGFwdGVyLT5zdGFwcml2LmFzb2Nfc3RhX2NvdW50ID09IDIpIHsKLQkJCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCQkJcHRhcmdldF93bGFuID0KLQkJCQlydHdfZmluZF9uZXR3b3JrMjNhKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUsCi0JCQkJCQkgICAgY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JCQlpZiAocHRhcmdldF93bGFuKQotCQkJCXB0YXJnZXRfd2xhbi0+Zml4ZWQgPSB0cnVlOwotCQkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQkJCS8qICBhIHN0YSArIGJjL21jX3N0YWluZm8gKG5vdCBJYnNzX3N0YWluZm8pICovCi0JCQlydHdfaW5kaWNhdGVfY29ubmVjdDIzYShhZGFwdGVyKTsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0JbWxtZWV4dF9zdGFfYWRkX2V2ZW50X2NhbGxiYWNrMjNhKGFkYXB0ZXIsIHBzdGEpOwotfQotCi12b2lkIHJ0d19zdGFkZWxfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlpbnQgbWFjX2lkOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwd2xhbjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGRldl9uZXR3b3JrOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc3RhZGVsX2V2ZW50ICpwc3RhZGVsID0gKHN0cnVjdCBzdGFkZWxfZXZlbnQgKilwYnVmOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICp0Z3RfbmV0d29yayA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrOwotCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmYWRhcHRlci0+c3RhcHJpdiwgcHN0YWRlbC0+bWFjYWRkcik7Ci0JaWYgKHBzdGEpCi0JCW1hY19pZCA9IHBzdGEtPm1hY19pZDsKLQllbHNlCi0JCW1hY19pZCA9IHBzdGFkZWwtPm1hY19pZDsKLQotCURCR184NzIzQSgiJXMobWFjX2lkPSVkKT0lcE1cbiIsIF9fZnVuY19fLCBtYWNfaWQsIHBzdGFkZWwtPm1hY2FkZHIpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkKLQkJcmV0dXJuOwotCi0JbWxtZWV4dF9zdGFfZGVsX2V2ZW50X2NhbGxiYWNrMjNhKGFkYXB0ZXIpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCWlmIChhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nID4gMCkgewotCQkJLyogdGhpcyBzdGFkZWxfZXZlbnQgaXMgY2F1c2VkIGJ5IHJvYW1pbmcsCi0JCQkgICBkZWNyZWFzZSB0b19yb2FtaW5nICovCi0JCQlwbWxtZXByaXYtPnRvX3JvYW1pbmctLTsKLQkJfSBlbHNlIGlmIChhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nID09IDApCi0JCQlydHdfc2V0X3JvYW1pbmcoYWRhcHRlciwgYWRhcHRlci0+cmVnaXN0cnlwcml2Lm1heF9yb2FtaW5nX3RpbWVzKTsKLQkJaWYgKCooKHUxNiAqKXBzdGFkZWwtPnJzdmQpICE9IFdMQU5fUkVBU09OX0VYUElSQVRJT05fQ0hLKQotCQkJcnR3X3NldF9yb2FtaW5nKGFkYXB0ZXIsIDApOyAvKiBkb24ndCByb2FtICovCi0KLQkJcnR3X2ZyZWVfdWNfc3dkZWNfcGVuZGluZ19xdWV1ZTIzYShhZGFwdGVyKTsKLQotCQlydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2EoYWRhcHRlciwgMSk7Ci0JCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKGFkYXB0ZXIpOwotCQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQkJLyogIHJlbW92ZSB0aGUgbmV0d29yayBlbnRyeSBpbiBzY2FubmVkX3F1ZXVlICovCi0JCXB3bGFuID0gcnR3X2ZpbmRfbmV0d29yazIzYSgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLAotCQkJCQkgICAgdGd0X25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JCWlmIChwd2xhbikgewotCQkJcHdsYW4tPmZpeGVkID0gZmFsc2U7Ci0JCQlydHdfZnJlZV9uZXR3b3JrX25vbG9jayhwbWxtZXByaXYsIHB3bGFuKTsKLQkJfQotCQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCi0JCV9ydHdfcm9hbWluZyhhZGFwdGVyLCB0Z3RfbmV0d29yayk7Ci0JfQotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkgfHwKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpKSB7Ci0KLQkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JCXJ0d19mcmVlX3N0YWluZm8yM2EoYWRhcHRlciwgIHBzdGEpOwotCQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCi0JCS8qIGEgc3RhICsgYmMvbWNfc3RhaW5mbyAobm90IElic3Nfc3RhaW5mbykgKi8KLQkJaWYgKGFkYXB0ZXItPnN0YXByaXYuYXNvY19zdGFfY291bnQgPT0gMSkgewotCQkJc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0JCQkvKiBmcmVlIG9sZCBpYnNzIG5ldHdvcmsgKi8KLQkJCS8qIHB3bGFuID0gcnR3X2ZpbmRfbmV0d29yazIzYSgKLQkJCSAgICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUsIHBzdGFkZWwtPm1hY2FkZHIpOyAqLwotCQkJcHdsYW4gPSBydHdfZmluZF9uZXR3b3JrMjNhKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUsCi0JCQkJCQkgICAgdGd0X25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JCQlpZiAocHdsYW4pIHsKLQkJCQlwd2xhbi0+Zml4ZWQgPSBmYWxzZTsKLQkJCQlydHdfZnJlZV9uZXR3b3JrX25vbG9jayhwbWxtZXByaXYsIHB3bGFuKTsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0JCQkvKiByZS1jcmVhdGUgaWJzcyAqLwotCQkJcGRldl9uZXR3b3JrID0gJmFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5kZXZfbmV0d29yazsKLQotCQkJbWVtY3B5KHBkZXZfbmV0d29yaywgJnRndF9uZXR3b3JrLT5uZXR3b3JrLAotCQkJICAgICAgIGdldF93bGFuX2Jzc2lkX2V4X3N6KCZ0Z3RfbmV0d29yay0+bmV0d29yaykpOwotCi0JCQlydHdfZG9fam9pbl9hZGhvYyhhZGFwdGVyKTsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotfQotCi0vKgotKiBydHcyM2Ffam9pbl90b19oYW5kbGVyIC0gVGltZW91dC9mYWlsdXJlIGhhbmRsZXIgZm9yIENNRCBKb2luQnNzCi0qIEBhZGFwdGVyOiBwb2ludGVyIHRvIF9hZGFwdGVyIHN0cnVjdHVyZQotKi8KLXZvaWQgcnR3MjNhX2pvaW5fdG9faGFuZGxlciAodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKilkYXRhOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQlpbnQgZG9fam9pbl9yOwotCi0JREJHXzg3MjNBKCIlcywgZndfc3RhdGU9JXhcbiIsIF9fZnVuY19fLCBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKLQotCWlmIChhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLQlpZiAoYWRhcHRlci0+bWxtZXByaXYudG9fcm9hbWluZyA+IDApIHsKLQkJLyogam9pbiB0aW1lb3V0IGNhdXNlZCBieSByb2FtaW5nICovCi0JCXdoaWxlICgxKSB7Ci0JCQlwbWxtZXByaXYtPnRvX3JvYW1pbmctLTsKLQkJCWlmIChhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nICE9IDApIHsKLQkJCQkvKiB0cnkgYW5vdGhlciAqLwotCQkJCURCR184NzIzQSgiJXMgdHJ5IGFub3RoZXIgcm9hbWluZ1xuIiwgX19mdW5jX18pOwotCQkJCWRvX2pvaW5fciA9IHJ0d19kb19qb2luKGFkYXB0ZXIpOwotCQkJCWlmIChkb19qb2luX3IgIT0gX1NVQ0NFU1MpIHsKLQkJCQkJREJHXzg3MjNBKCIlcyByb2FtaW5nIGRvX2pvaW4gcmV0dXJuICIKLQkJCQkJCSAgIiVkXG4iLCBfX2Z1bmNfXyAsIGRvX2pvaW5fcik7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJREJHXzg3MjNBKCIlcyBXZSd2ZSB0cnkgcm9hbWluZyBidXQgZmFpbFxuIiwKLQkJCQkJICBfX2Z1bmNfXyk7Ci0JCQkJcnR3X2luZGljYXRlX2Rpc2Nvbm5lY3QyM2EoYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShhZGFwdGVyKTsKLQkJZnJlZV9zY2FucXVldWUocG1sbWVwcml2KTsvKiAgKi8KLQotCQkvKiBpbmRpY2F0ZSBkaXNjb25uZWN0IGZvciB0aGUgY2FzZSB0aGF0IGpvaW5fdGltZW91dCBhbmQKLQkJICAgY2hlY2tfZndzdGF0ZSAhPSBGV19MSU5LRUQgKi8KLQkJcnR3X2NmZzgwMjExX2luZGljYXRlX2Rpc2Nvbm5lY3QoYWRhcHRlcik7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLX0KLQotLyoKLSogcnR3X3NjYW5fdGltZW91dF9oYW5kbGVyMjNhIC0gVGltZW91dC9GYWlsdXJlIGhhbmRsZXIgZm9yIENNRCBTaXRlU3VydmV5Ci0qIEBkYXRhOiBwb2ludGVyIHRvIF9hZGFwdGVyIHN0cnVjdHVyZQotKi8KLXZvaWQgcnR3X3NjYW5fdGltZW91dF9oYW5kbGVyMjNhKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopZGF0YTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlEQkdfODcyM0EoIiVzKCVzKTogZndfc3RhdGUgPSV4XG4iLCBfX2Z1bmNfXywgYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKLQkJICBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKLQotCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQotCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKTsKLQotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0JcnR3X2NmZzgwMjExX2luZGljYXRlX3NjYW5fZG9uZSh3ZGV2X3RvX3ByaXYoYWRhcHRlci0+cnR3X3dkZXYpLCB0cnVlKTsKLX0KLQotdm9pZCBydHdfZHluYW1pY19jaGVja190aW1lcl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopZGF0YTsKLQotCWlmIChhZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZCA9PSBmYWxzZSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPT0gdHJ1ZSB8fAotCSAgICBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IHRydWUpCi0JCWdvdG8gb3V0OwotCi0JaWYgKGFkYXB0ZXItPm5ldF9jbG9zZWQgPT0gdHJ1ZSkKLQkJZ290byBvdXQ7Ci0KLQlydHdfZHluYW1pY19jaGtfd2tfY21kMjNhKGFkYXB0ZXIpOwotCi1vdXQ6Ci0JbW9kX3RpbWVyKCZhZGFwdGVyLT5tbG1lcHJpdi5keW5hbWljX2Noa190aW1lciwKLQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKSk7Ci19Ci0KLWlubGluZSBib29sIHJ0d19pc19zY2FuX2Rlbnkoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKm1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCi0JcmV0dXJuIChhdG9taWNfcmVhZCgmbWxtZXByaXYtPnNldF9zY2FuX2RlbnkpICE9IDApID8gdHJ1ZSA6IGZhbHNlOwotfQotCi12b2lkIHJ0d19jbGVhcl9zY2FuX2Rlbnkoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKm1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCi0JYXRvbWljX3NldCgmbWxtZXByaXYtPnNldF9zY2FuX2RlbnksIDApOwotfQotCi12b2lkIHJ0d19zZXRfc2Nhbl9kZW55X3RpbWVyX2hkbCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBydHdfYWRhcHRlciAqKWRhdGE7Ci0KLQlydHdfY2xlYXJfc2Nhbl9kZW55KGFkYXB0ZXIpOwotfQotCi12b2lkIHJ0d19zZXRfc2Nhbl9kZW55KHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTMyIG1zKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKm1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCi0JYXRvbWljX3NldCgmbWxtZXByaXYtPnNldF9zY2FuX2RlbnksIDEpOwotCW1vZF90aW1lcigmbWxtZXByaXYtPnNldF9zY2FuX2RlbnlfdGltZXIsCi0JCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMobXMpKTsKLX0KLQotI2lmIGRlZmluZWQoSUVFRTgwMjExX1NDQU5fUkVTVUxUX0VYUElSRSkKLSNkZWZpbmUgUlRXX1NDQU5fUkVTVUxUX0VYUElSRSAgXAotCSgoSUVFRTgwMjExX1NDQU5fUkVTVUxUX0VYUElSRSAvIChIWioxMDAwKSkgLSAxMDAwKSAvKiAzMDAwIC0xMDAwICovCi0jZWxzZQotI2RlZmluZSBSVFdfU0NBTl9SRVNVTFRfRVhQSVJFIDIwMDAKLSNlbmRpZgotCi0vKgotKiBTZWxlY3QgYSBuZXcgam9pbiBjYW5kaWRhdGUgZnJvbSB0aGUgb3JpZ2luYWwgQHBhcmFtIGNhbmRpZGF0ZSBhbmQKLSogICAgIEBwYXJhbSBjb21wZXRpdG9yCi0qIEByZXR1cm4gdHJ1ZTogY2FuZGlkYXRlIGlzIHVwZGF0ZWQKLSogQHJldHVybiBmYWxzZTogY2FuZGlkYXRlIGlzIG5vdCB1cGRhdGVkCi0qLwotc3RhdGljIGludCBydHdfY2hlY2tfam9pbl9jYW5kaWRhdGUoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2LAotCQkJCSAgICBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICoqY2FuZGlkYXRlLAotCQkJCSAgICBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpjb21wZXRpdG9yKQotewotCWludCB1cGRhdGVkID0gZmFsc2U7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyOwotCi0JYWRhcHRlciA9IGNvbnRhaW5lcl9vZihwbWxtZXByaXYsIHN0cnVjdCBydHdfYWRhcHRlciwgbWxtZXByaXYpOwotCi0JLyogY2hlY2sgYnNzaWQsIGlmIG5lZWRlZCAqLwotCWlmIChwbWxtZXByaXYtPmFzc29jX2J5X2Jzc2lkID09IHRydWUpIHsKLQkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKGNvbXBldGl0b3ItPm5ldHdvcmsuTWFjQWRkcmVzcywKLQkJCQkgICAgICBwbWxtZXByaXYtPmFzc29jX2Jzc2lkKSkKLQkJCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBjaGVjayBzc2lkLCBpZiBuZWVkZWQgKi8KLQlpZiAocG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWRfbGVuKSB7Ci0JCWlmIChjb21wZXRpdG9yLT5uZXR3b3JrLlNzaWQuc3NpZF9sZW4gIT0KLQkJICAgIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkX2xlbiB8fAotCQkgICAgbWVtY21wKGNvbXBldGl0b3ItPm5ldHdvcmsuU3NpZC5zc2lkLAotCQkJICAgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQsCi0JCQkgICBwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZF9sZW4pKQotCQkJZ290byBleGl0OwotCX0KLQotCWlmIChydHdfaXNfZGVzaXJlZF9uZXR3b3JrKGFkYXB0ZXIsIGNvbXBldGl0b3IpID09IGZhbHNlKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZiAoYWRhcHRlci0+bWxtZXByaXYudG9fcm9hbWluZyA+IDApIHsKLQkJdW5zaWduZWQgaW50IHBhc3NlZDsKLQotCQlwYXNzZWQgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBjb21wZXRpdG9yLT5sYXN0X3NjYW5uZWQpOwotCQlpZiAocGFzc2VkID49IFJUV19TQ0FOX1JFU1VMVF9FWFBJUkUgfHwKLQkJICAgIGlzX3NhbWVfZXNzKCZjb21wZXRpdG9yLT5uZXR3b3JrLAotCQkJCSZwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmspID09IGZhbHNlKQotCQkJZ290byBleGl0OwotCX0KLQotCWlmICghKmNhbmRpZGF0ZSB8fAotCSAgICAoKmNhbmRpZGF0ZSktPm5ldHdvcmsuUnNzaTxjb21wZXRpdG9yLT5uZXR3b3JrLlJzc2kpIHsKLQkJKmNhbmRpZGF0ZSA9IGNvbXBldGl0b3I7Ci0JCXVwZGF0ZWQgPSB0cnVlOwotCX0KLQotCWlmICh1cGRhdGVkKSB7Ci0JCURCR184NzIzQSgiW2J5X2Jzc2lkOiV1XVthc3NvY19zc2lkOiVzXVt0b19yb2FtaW5nOiV1XSBuZXcgY2FuZGlkYXRlOiAlcyglcE0pIHJzc2k6JWRcbiIsCi0JCQkgIHBtbG1lcHJpdi0+YXNzb2NfYnlfYnNzaWQsCi0JCQkgIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkLAotCQkJICBhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nLAotCQkJICAoKmNhbmRpZGF0ZSktPm5ldHdvcmsuU3NpZC5zc2lkLAotCQkJICAoKmNhbmRpZGF0ZSktPm5ldHdvcmsuTWFjQWRkcmVzcywKLQkJCSAgKGludCkoKmNhbmRpZGF0ZSktPm5ldHdvcmsuUnNzaSk7Ci0JfQotCi1leGl0OgotCXJldHVybiB1cGRhdGVkOwotfQotCi0vKgotQ2FsbGluZyBjb250ZXh0OgotVGhlIGNhbGxlciBvZiB0aGUgc3ViLXJvdXRpbmUgd2lsbCBiZSBpbiBjcml0aWNhbCBzZWN0aW9uLi4uCi0KLVRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBmb2xsb3dpbmcgc3BpbmxvY2sKLQotcG1sbWVwcml2LT5sb2NrCi0KLSovCi0KLXN0YXRpYyBpbnQgcnR3X2RvX2pvaW4oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCWludCByZXQ7Ci0KLQlwbWxtZXByaXYtPmN1cl9uZXR3b3JrLmpvaW5fcmVzID0gLTI7Ci0KLQlzZXRfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKTsKLQotCXBtbG1lcHJpdi0+dG9fam9pbiA9IHRydWU7Ci0KLQlyZXQgPSBydHdfc2VsZWN0X2FuZF9qb2luX2Zyb21fc2Nhbm5lZF9xdWV1ZTIzYShwbWxtZXByaXYpOwotCWlmIChyZXQgPT0gX1NVQ0NFU1MpIHsKLQkJcG1sbWVwcml2LT50b19qb2luID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSkgewotCQkJLyogc3dpdGNoIHRvIEFESE9DX01BU1RFUiAqLwotCQkJcmV0ID0gcnR3X2RvX2pvaW5fYWRob2MocGFkYXB0ZXIpOwotCQkJaWYgKHJldCAhPSBfU1VDQ0VTUykKLQkJCQlnb3RvIGV4aXQ7Ci0JCX0gZWxzZSB7Ci0JCQkvKiAgY2FuJ3QgYXNzb2NpYXRlIDsgcmVzZXQgdW5kZXItbGlua2luZyAqLwotCQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKTsKLQotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlwbWxtZXByaXYtPnRvX2pvaW4gPSBmYWxzZTsKLQkJfQotCX0KLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IHdsYW5fbmV0d29yayAqCi1ydHdfc2VsZWN0X2NhbmRpZGF0ZV9mcm9tX3F1ZXVlKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKLXsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaywgKnB0bXAsICpjYW5kaWRhdGUgPSBOVUxMOwotCXN0cnVjdCBydHdfcXVldWUgKnF1ZXVlID0gJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQotCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBuZXR3b3JrLCBwdG1wLCBwaGVhZCwgbGlzdCkKLQkJcnR3X2NoZWNrX2pvaW5fY2FuZGlkYXRlKHBtbG1lcHJpdiwgJmNhbmRpZGF0ZSwgcG5ldHdvcmspOwotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0KLQlyZXR1cm4gY2FuZGlkYXRlOwotfQotCi0KLWludCBydHdfZG9fam9pbl9hZGhvYyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwZGV2X25ldHdvcms7Ci0JdTggKmlic3M7Ci0JaW50IHJldDsKLQotCXBkZXZfbmV0d29yayA9ICZhZGFwdGVyLT5yZWdpc3RyeXByaXYuZGV2X25ldHdvcms7Ci0JaWJzcyA9IGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5kZXZfbmV0d29yay5NYWNBZGRyZXNzOwotCi0JX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJICJzd2l0Y2hpbmcgdG8gYWRob2MgbWFzdGVyXG4iKTsKLQotCW1lbWNweSgmcGRldl9uZXR3b3JrLT5Tc2lkLCAmcG1sbWVwcml2LT5hc3NvY19zc2lkLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGNmZzgwMjExX3NzaWQpKTsKLQotCXJ0d191cGRhdGVfcmVnaXN0cnlwcml2X2Rldl9uZXR3b3JrMjNhKGFkYXB0ZXIpOwotCXJ0d19nZW5lcmF0ZV9yYW5kb21faWJzczIzYShpYnNzKTsKLQotCXBtbG1lcHJpdi0+Zndfc3RhdGUgPSBXSUZJX0FESE9DX01BU1RFUl9TVEFURTsKLQotCXJldCA9IHJ0d19jcmVhdGVic3NfY21kMjNhKGFkYXB0ZXIpOwotCWlmIChyZXQgIT0gX1NVQ0NFU1MpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAiRXJyb3IgPT5ydHdfY3JlYXRlYnNzX2NtZDIzYSBzdGF0dXMgRkFJTFxuIik7Ci0JfSBlbHNlICB7Ci0JCXBtbG1lcHJpdi0+dG9fam9pbiA9IGZhbHNlOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBydHdfZG9fam9pbl9uZXR3b3JrKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCXN0cnVjdCB3bGFuX25ldHdvcmsgKmNhbmRpZGF0ZSkKLXsKLQlpbnQgcmV0OwotCi0JLyogIGNoZWNrIGZvciBzaXR1YXRpb24gb2YgIF9GV19MSU5LRUQgKi8KLQlpZiAoY2hlY2tfZndzdGF0ZSgmYWRhcHRlci0+bWxtZXByaXYsIF9GV19MSU5LRUQpKSB7Ci0JCURCR184NzIzQSgiJXM6IF9GV19MSU5LRUQgd2hpbGUgYXNrX2Zvcl9qb2luYnNzIVxuIiwgX19mdW5jX18pOwotCi0JCXJ0d19kaXNhc3NvY19jbWQyM2EoYWRhcHRlciwgMCwgdHJ1ZSk7Ci0JCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKGFkYXB0ZXIpOwotCQlydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2EoYWRhcHRlciwgMCk7Ci0JfQotCXNldF9md3N0YXRlKCZhZGFwdGVyLT5tbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpOwotCi0JcmV0ID0gcnR3X2pvaW5ic3NfY21kMjNhKGFkYXB0ZXIsIGNhbmRpZGF0ZSk7Ci0KLQlpZiAocmV0ID09IF9TVUNDRVNTKQotCQltb2RfdGltZXIoJmFkYXB0ZXItPm1sbWVwcml2LmFzc29jX3RpbWVyLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhNQVhfSk9JTl9USU1FT1VUKSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgcnR3X3NlbGVjdF9hbmRfam9pbl9mcm9tX3NjYW5uZWRfcXVldWUyM2Eoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2KQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcjsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpjYW5kaWRhdGUgPSBOVUxMOwotCWludCByZXQ7Ci0KLQlhZGFwdGVyID0gcG1sbWVwcml2LT5uaWNfaGRsOwotCi0JY2FuZGlkYXRlID0gcnR3X3NlbGVjdF9jYW5kaWRhdGVfZnJvbV9xdWV1ZShwbWxtZXByaXYpOwotCWlmICghY2FuZGlkYXRlKSB7Ci0JCURCR184NzIzQSgiJXM6IHJldHVybiBfRkFJTChjYW5kaWRhdGUgPT0gTlVMTClcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzOiBjYW5kaWRhdGU6ICVzKCVwTSwgY2g6JXUpXG4iLAotCQkJICBfX2Z1bmNfXywKLQkJCSAgY2FuZGlkYXRlLT5uZXR3b3JrLlNzaWQuc3NpZCwKLQkJCSAgY2FuZGlkYXRlLT5uZXR3b3JrLk1hY0FkZHJlc3MsCi0JCQkgIGNhbmRpZGF0ZS0+bmV0d29yay5EU0NvbmZpZyk7Ci0JfQotCi0JcmV0ID0gcnR3X2RvX2pvaW5fbmV0d29yayhhZGFwdGVyLCBjYW5kaWRhdGUpOwotCi1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLWludCBydHdfc2V0X2F1dGgyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkgICAgc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYpCi17Ci0Jc3RydWN0IGNtZF9vYmogKnBjbWQ7Ci0Jc3RydWN0IHNldGF1dGhfcGFybSAqcHNldGF1dGhwYXJtOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmYWRhcHRlci0+Y21kcHJpdjsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlwY21kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBjbWQpIHsKLQkJcmVzID0gX0ZBSUw7ICAvKiB0cnkgYWdhaW4gKi8KLQkJZ290byBleGl0OwotCX0KLQotCXBzZXRhdXRocGFybSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXRhdXRoX3Bhcm0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBzZXRhdXRocGFybSkgewotCQlrZnJlZShwY21kKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwc2V0YXV0aHBhcm0tPm1vZGUgPSAodW5zaWduZWQgY2hhcilwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtOwotCi0JcGNtZC0+Y21kY29kZSA9IF9TZXRBdXRoX0NNRF87Ci0JcGNtZC0+cGFybWJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopcHNldGF1dGhwYXJtOwotCXBjbWQtPmNtZHN6ID0gIChzaXplb2Yoc3RydWN0IHNldGF1dGhfcGFybSkpOwotCXBjbWQtPnJzcCA9IE5VTEw7Ci0JcGNtZC0+cnNwc3ogPSAwOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJICJhZnRlciBlbnF1ZXVlIHNldF9hdXRoX2NtZCwgYXV0aF9tb2RlPSV4XG4iLAotCQkgcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSk7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBjbWQpOwotCi1leGl0OgotCi0JcmV0dXJuIHJlczsKLX0KLQotaW50IHJ0d19zZXRfa2V5MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJICAgc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYsIGludCBrZXlpZCwgdTggc2V0X3R4KQotewotCXU4IGtleWxlbjsKLQlzdHJ1Y3QgY21kX29iaiAqcGNtZDsKLQlzdHJ1Y3Qgc2V0a2V5X3Bhcm0gKnBzZXRrZXlwYXJtOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmYWRhcHRlci0+Y21kcHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JaWYgKGtleWlkID49IDQpIHsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwY21kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBjbWQpIHsKLQkJcmVzID0gX0ZBSUw7ICAvKiB0cnkgYWdhaW4gKi8KLQkJZ290byBleGl0OwotCX0KLQlwc2V0a2V5cGFybSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXRrZXlfcGFybSksIEdGUF9LRVJORUwpOwotCWlmICghcHNldGtleXBhcm0pIHsKLQkJa2ZyZWUocGNtZCk7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKHBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPT0gZG90MTFBdXRoQWxncnRobV84MDIxWCkgewotCQlwc2V0a2V5cGFybS0+YWxnb3JpdGhtID0gKHVuc2lnbmVkIGNoYXIpCi0JCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeTsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAicnR3X3NldF9rZXkyM2E6IHBzZXRrZXlwYXJtLT5hbGdvcml0aG0gPSAodW5zaWduZWQgY2hhcilwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9JWRcbiIsCi0JCQkgcHNldGtleXBhcm0tPmFsZ29yaXRobSk7Ci0JfSBlbHNlIHsKLQkJcHNldGtleXBhcm0tPmFsZ29yaXRobSA9ICh1OClwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICJydHdfc2V0X2tleTIzYTogcHNldGtleXBhcm0tPmFsZ29yaXRobSA9ICh1OClwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0lZFxuIiwKLQkJCSBwc2V0a2V5cGFybS0+YWxnb3JpdGhtKTsKLQl9Ci0JcHNldGtleXBhcm0tPmtleWlkID0ga2V5aWQ7LyogMH4zICovCi0JcHNldGtleXBhcm0tPnNldF90eCA9IHNldF90eDsKLQlpZiAoaXNfd2VwX2VuYyhwc2V0a2V5cGFybS0+YWxnb3JpdGhtKSkKLQkJcG1sbWVwcml2LT5rZXlfbWFzayB8PSBCSVQocHNldGtleXBhcm0tPmtleWlkKTsKLQotCURCR184NzIzQSgiPT0+IHJ0d19zZXRfa2V5MjNhIGFsZ29yaXRobSgleCksIGtleWlkKCV4KSwga2V5X21hc2soJXgpXG4iLAotCQkgIHBzZXRrZXlwYXJtLT5hbGdvcml0aG0sIHBzZXRrZXlwYXJtLT5rZXlpZCwKLQkJICBwbWxtZXByaXYtPmtleV9tYXNrKTsKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkgInJ0d19zZXRfa2V5MjNhOiBwc2V0a2V5cGFybS0+YWxnb3JpdGhtID0lZCBwc2V0a2V5cGFybS0+a2V5aWQgPSAodTgpa2V5aWQgPSVkXG4iLAotCQkgcHNldGtleXBhcm0tPmFsZ29yaXRobSwga2V5aWQpOwotCi0Jc3dpdGNoIChwc2V0a2V5cGFybS0+YWxnb3JpdGhtKSB7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKLQkJa2V5bGVuID0gNTsKLQkJbWVtY3B5KCZwc2V0a2V5cGFybS0+a2V5WzBdLAotCQkgICAgICAgJnBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleSwga2V5bGVuKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6Ci0JCWtleWxlbiA9IDEzOwotCQltZW1jcHkoJnBzZXRrZXlwYXJtLT5rZXlbMF0sCi0JCSAgICAgICAmcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5LCBrZXlsZW4pOwotCQlicmVhazsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCWtleWxlbiA9IDE2OwotCQltZW1jcHkoJnBzZXRrZXlwYXJtLT5rZXksCi0JCSAgICAgICAmcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleVtrZXlpZF0sIGtleWxlbik7Ci0JCXBzZXRrZXlwYXJtLT5ncnBrZXkgPSAxOwotCQlicmVhazsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCWtleWxlbiA9IDE2OwotCQltZW1jcHkoJnBzZXRrZXlwYXJtLT5rZXksCi0JCSAgICAgICAmcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleVtrZXlpZF0sIGtleWxlbik7Ci0JCXBzZXRrZXlwYXJtLT5ncnBrZXkgPSAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICJydHdfc2V0X2tleTIzYTpwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0gJXggKG11c3QgYmUgMSBvciAyIG9yIDQgb3IgNSlcbiIsCi0JCQkgcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSk7Ci0JCXJlcyA9IF9GQUlMOwotCQlrZnJlZShwY21kKTsKLQkJa2ZyZWUocHNldGtleXBhcm0pOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGNtZC0+Y21kY29kZSA9IF9TZXRLZXlfQ01EXzsKLQlwY21kLT5wYXJtYnVmID0gKHU4ICopcHNldGtleXBhcm07Ci0JcGNtZC0+Y21kc3ogPSAgKHNpemVvZihzdHJ1Y3Qgc2V0a2V5X3Bhcm0pKTsKLQlwY21kLT5yc3AgPSBOVUxMOwotCXBjbWQtPnJzcHN6ID0gMDsKLQotCS8qIHNlbWFfaW5pdCgmcGNtZC0+Y21kX3NlbSwgMCk7ICovCi0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBjbWQpOwotCi1leGl0OgotCi0JcmV0dXJuIHJlczsKLX0KLQotLyogYWRqdXN0IElFcyBmb3IgcnR3X2pvaW5ic3NfY21kMjNhIGluIFdNTSAqLwotaW50IHJ0d19yZXN0cnVjdF93bW1faWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1OCAqaW5faWUsCi0JCQkgICB1OCAqb3V0X2llLCB1aW50IGluX2xlbiwgdWludCBpbml0aWFsX291dF9sZW4pCi17Ci0JaW50IGllbGVuZ3RoOwotCWNvbnN0IHU4ICpwOwotCi0JaWVsZW5ndGggPSBpbml0aWFsX291dF9sZW47Ci0KLQlwID0gY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xBTl9PVUlfTUlDUk9TT0ZULAotCQkJCSAgICBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XTU0sCi0JCQkJICAgIGluX2llLCBpbl9sZW4pOwotCi0JaWYgKHAgJiYgcFsxXSkgewotCQltZW1jcHkob3V0X2llICsgaW5pdGlhbF9vdXRfbGVuLCBwLCA5KTsKLQotCQlvdXRfaWVbaW5pdGlhbF9vdXRfbGVuICsgMV0gPSA3OwotCQlvdXRfaWVbaW5pdGlhbF9vdXRfbGVuICsgNl0gPSAwOwotCQlvdXRfaWVbaW5pdGlhbF9vdXRfbGVuICsgOF0gPSAwOwotCi0JCWllbGVuZ3RoICs9IDk7Ci0JfQotCi0JcmV0dXJuIGllbGVuZ3RoOwotfQotCi0vKiAgKi8KLS8qICBQb3J0ZWQgZnJvbSA4MTg1OiBJc0luUHJlQXV0aEtleUxpc3QoKS4KLSAgICAoUmVuYW1lZCBmcm9tIFNlY0lzSW5QcmVBdXRoS2V5TGlzdCgpLCAyMDA2LTEwLTEzLikgKi8KLS8qICBBZGRlZCBieSBBbm5pZSwgMjAwNi0wNS0wNy4gKi8KLS8qICAqLwotLyogIFNlYXJjaCBieSBCU1NJRCwgKi8KLS8qICBSZXR1cm4gVmFsdWU6ICovCi0vKgkJLTEJOmlmIHRoZXJlIGlzIG5vIHByZS1hdXRoIGtleSBpbiB0aGUgIHRhYmxlICovCi0vKgkJPj0gMAk6aWYgdGhlcmUgaXMgcHJlLWF1dGgga2V5LCBhbmQgICByZXR1cm4gdGhlIGVudHJ5IGlkICovCi0vKiAgKi8KLS8qICAqLwotCi1zdGF0aWMgaW50IFNlY0lzSW5QTUtJRExpc3Qoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1OCAqYnNzaWQpCi17Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmQWRhcHRlci0+c2VjdXJpdHlwcml2OwotCWludCBpID0gMDsKLQotCWRvIHsKLQkJaWYgKHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpXS5iVXNlZCAmJgotICAgICAgICAgICAgICAgICAgICBldGhlcl9hZGRyX2VxdWFsKHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpXS5Cc3NpZCwgYnNzaWQpKSB7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCWkrKzsKLQkJCS8qIGNvbnRpbnVlOyAqLwotCQl9Ci0JfSB3aGlsZSAoaSA8IE5VTV9QTUtJRF9DQUNIRSk7Ci0KLQlpZiAoaSA9PSBOVU1fUE1LSURfQ0FDSEUpCi0JCWkgPSAtMTsvKiAgQ291bGQgbm90IGZpbmQuICovCi0JZWxzZSB7Ci0JCS8qICBUaGVyZSBpcyBvbmUgUHJlLUF1dGhlbnRpY2F0aW9uIEtleSBmb3IKLQkJICAgIHRoZSBzcGVjaWZpYyBCU1NJRC4gKi8KLQl9Ci0KLQlyZXR1cm4gaTsKLX0KLQotLyogICovCi0vKiAgQ2hlY2sgdGhlIFJTTiBJRSBsZW5ndGggKi8KLS8qICBJZiB0aGUgUlNOIElFIGxlbmd0aCA8PSAyMCwgdGhlIFJTTiBJRSBkaWRuJ3QgaW5jbHVkZQotICAgIHRoZSBQTUtJRCBpbmZvcm1hdGlvbiAqLwotLyogIDAtMTF0aCBlbGVtZW50IGluIHRoZSBhcnJheSBhcmUgdGhlIGZpeGVkIElFICovCi0vKiAgMTJ0aCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyB0aGUgSUUgKi8KLS8qICAxM3RoIGVsZW1lbnQgaW4gdGhlIGFycmF5IGlzIHRoZSBJRSBsZW5ndGggKi8KLS8qICAqLwotCi1zdGF0aWMgaW50IHJ0d19hcHBlbmRfcG1raWQoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCBpbnQgaUVudHJ5LAotCQkJICAgIHU4ICppZSwgdWludCBpZV9sZW4pCi17Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmQWRhcHRlci0+c2VjdXJpdHlwcml2OwotCi0JaWYgKGllWzFdIDw9IDIwKSB7Ci0JCS8qICBUaGUgUlNOIElFIGRpZG4ndCBpbmNsdWRlIHRoZSBQTUsgSUQsCi0JCSAgICBhcHBlbmQgdGhlIFBNSyBpbmZvcm1hdGlvbiAqLwotCQkJaWVbaWVfbGVuXSA9IDE7Ci0JCQlpZV9sZW4rKzsKLQkJCWllW2llX2xlbl0gPSAwOwkvKiBQTUtJRCBjb3VudCA9IDB4MDEwMCAqLwotCQkJaWVfbGVuKys7Ci0JCQltZW1jcHkoJmllW2llX2xlbl0sCi0JCQkgICAgICAgJnBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpRW50cnldLlBNS0lELCAxNik7Ci0KLQkJCWllX2xlbiArPSAxNjsKLQkJCWllWzFdICs9IDE4Oy8qIFBNS0lEIGxlbmd0aCA9IDIrMTYgKi8KLQl9Ci0JcmV0dXJuIGllX2xlbjsKLX0KLQotaW50IHJ0d19yZXN0cnVjdF9zZWNfaWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1OCAqaW5faWUsIHU4ICpvdXRfaWUsCi0JCQkgICB1aW50IGluX2xlbikKLXsKLQl1OCBhdXRobW9kZTsKLQl1aW50IGllbGVuZ3RoOwotCWludCBpRW50cnk7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJmFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQl1aW50IG5kaXNhdXRobW9kZSA9IHBzZWN1cml0eXByaXYtPm5kaXNhdXRodHlwZTsKLQl1aW50IG5kaXNzZWN1cml0eXR5cGUgPSBwc2VjdXJpdHlwcml2LT5uZGlzZW5jcnlwdHN0YXR1czsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sCi0JCSAiK3J0d19yZXN0cnVjdF9zZWNfaWUyM2E6IG5kaXNhdXRobW9kZT0lZCBuZGlzc2VjdXJpdHl0eXBlPSVkXG4iLAotCQkgbmRpc2F1dGhtb2RlLCBuZGlzc2VjdXJpdHl0eXBlKTsKLQotCWllbGVuZ3RoID0gMDsKLQlpZiAobmRpc2F1dGhtb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSB8fAotCSAgICBuZGlzYXV0aG1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQotCQlhdXRobW9kZSA9IFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzsKLQlpZiAobmRpc2F1dGhtb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwKLQkgICAgbmRpc2F1dGhtb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0JCWF1dGhtb2RlID0gV0xBTl9FSURfUlNOOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1VOREVSX1dQUykpIHsKLQkJbWVtY3B5KG91dF9pZSArIGllbGVuZ3RoLCBwc2VjdXJpdHlwcml2LT53cHNfaWUsCi0JCSAgICAgICBwc2VjdXJpdHlwcml2LT53cHNfaWVfbGVuKTsKLQotCQlpZWxlbmd0aCArPSBwc2VjdXJpdHlwcml2LT53cHNfaWVfbGVuOwotCX0gZWxzZSBpZiAoYXV0aG1vZGUgPT0gV0xBTl9FSURfVkVORE9SX1NQRUNJRklDIHx8Ci0JCSAgIGF1dGhtb2RlID09IFdMQU5fRUlEX1JTTikgewotCQkvKiBjb3B5IFJTTiBvciBTU04gKi8KLQkJbWVtY3B5KCZvdXRfaWVbaWVsZW5ndGhdLCAmcHNlY3VyaXR5cHJpdi0+c3VwcGxpY2FudF9pZVswXSwKLQkJICAgICAgIHBzZWN1cml0eXByaXYtPnN1cHBsaWNhbnRfaWVbMV0gKyAyKTsKLQkJaWVsZW5ndGggKz0gcHNlY3VyaXR5cHJpdi0+c3VwcGxpY2FudF9pZVsxXSArIDI7Ci0JfQotCi0JaUVudHJ5ID0gU2VjSXNJblBNS0lETGlzdChhZGFwdGVyLCBwbWxtZXByaXYtPmFzc29jX2Jzc2lkKTsKLQlpZiAoaUVudHJ5IDwgMCkKLQkJcmV0dXJuIGllbGVuZ3RoOwotCWVsc2UgewotCQlpZiAoYXV0aG1vZGUgPT0gV0xBTl9FSURfUlNOKQotCQkJaWVsZW5ndGggPSBydHdfYXBwZW5kX3Bta2lkKGFkYXB0ZXIsIGlFbnRyeSwKLQkJCQkJCSAgICBvdXRfaWUsIGllbGVuZ3RoKTsKLQl9Ci0KLQlyZXR1cm4gaWVsZW5ndGg7Ci19Ci0KLXZvaWQgcnR3X2luaXRfcmVnaXN0cnlwcml2X2Rldl9uZXR3b3JrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0Jc3RydWN0IGVlcHJvbV9wcml2ICpwZWVwcml2ID0gJmFkYXB0ZXItPmVlcHJvbXByaXY7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggICAgKnBkZXZfbmV0d29yayA9ICZwcmVnaXN0cnlwcml2LT5kZXZfbmV0d29yazsKLQl1OCAqbXlod2FkZHIgPSBteWlkKHBlZXByaXYpOwotCi0JZXRoZXJfYWRkcl9jb3B5KHBkZXZfbmV0d29yay0+TWFjQWRkcmVzcywgbXlod2FkZHIpOwotCi0JbWVtY3B5KCZwZGV2X25ldHdvcmstPlNzaWQsICZwcmVnaXN0cnlwcml2LT5zc2lkLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGNmZzgwMjExX3NzaWQpKTsKLQotCXBkZXZfbmV0d29yay0+YmVhY29uX2ludGVydmFsID0gMTAwOwotfQotCi12b2lkIHJ0d191cGRhdGVfcmVnaXN0cnlwcml2X2Rldl9uZXR3b3JrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpbnQgc3ogPSAwOwotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJmFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGRldl9uZXR3b3JrID0gJnByZWdpc3RyeXByaXYtPmRldl9uZXR3b3JrOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJmFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpjdXJfbmV0d29yayA9ICZhZGFwdGVyLT5tbG1lcHJpdi5jdXJfbmV0d29yazsKLQkvKiBzdHJ1Y3QJeG1pdF9wcml2CSpweG1pdHByaXYgPSAmYWRhcHRlci0+eG1pdHByaXY7ICovCi0KLQlwZGV2X25ldHdvcmstPlByaXZhY3kgPQotCQkocHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA+IDAgPyAxIDogMCk7Ci0KLQlwZGV2X25ldHdvcmstPlJzc2kgPSAwOwotCi0JcGRldl9uZXR3b3JrLT5EU0NvbmZpZyA9IHByZWdpc3RyeXByaXYtPmNoYW5uZWw7Ci0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCSAicHJlZ2lzdHJ5cHJpdi0+Y2hhbm5lbCA9JWQsIHBkZXZfbmV0d29yay0+RFNDb25maWcgPSAweCV4XG4iLAotCQkgcHJlZ2lzdHJ5cHJpdi0+Y2hhbm5lbCwgcGRldl9uZXR3b3JrLT5EU0NvbmZpZyk7Ci0KLQlpZiAoY3VyX25ldHdvcmstPm5ldHdvcmsuaWZtb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQotCQlwZGV2X25ldHdvcmstPkFUSU1XaW5kb3cgPSAwOwotCi0JcGRldl9uZXR3b3JrLT5pZm1vZGUgPSBjdXJfbmV0d29yay0+bmV0d29yay5pZm1vZGU7Ci0KLQkvKiAgMS4gU3VwcG9ydGVkIHJhdGVzICovCi0JLyogIDIuIElFICovCi0KLQlzeiA9IHJ0d19nZW5lcmF0ZV9pZTIzYShwcmVnaXN0cnlwcml2KTsKLQotCXBkZXZfbmV0d29yay0+SUVMZW5ndGggPSBzejsKLQotCXBkZXZfbmV0d29yay0+TGVuZ3RoID0KLQkJZ2V0X3dsYW5fYnNzaWRfZXhfc3oocGRldl9uZXR3b3JrKTsKLQotCS8qIG5vdGVzOiB0cmFuc2xhdGUgSUVMZW5ndGggJiBMZW5ndGggYWZ0ZXIgYXNzaWduIHRoZQotCSAgIExlbmd0aCB0byBjbWRzeiBpbiBjcmVhdGVic3NfY21kKCk7ICovCi0JLyogcGRldl9uZXR3b3JrLT5JRUxlbmd0aCA9IGNwdV90b19sZTMyKHN6KTsgKi8KLX0KLQotLyogdGhlIGZ1bmN0aW9uIGlzIGF0IHBhc3NpdmVfbGV2ZWwgKi8KLXZvaWQgcnR3X2pvaW5ic3NfcmVzZXQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCB0aHJlc2hvbGQ7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgaHRfcHJpdiAqcGh0cHJpdiA9ICZwbWxtZXByaXYtPmh0cHJpdjsKLQotCS8qIHRvZG86IGlmIHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyBpby9yZWcvaHcgc2V0dGluZwotCSAgIGJlZm9yZSBqb2luX2JzcywgcGxlYXNlIGFkZCBjb2RlIGhlcmUgKi8KLQotCXBtbG1lcHJpdi0+bnVtX0ZvcnR5TUh6SW50b2xlcmFudCA9IDA7Ci0KLQlwbWxtZXByaXYtPm51bV9zdGFfbm9faHQgPSAwOwotCi0JcGh0cHJpdi0+YW1wZHVfZW5hYmxlID0gZmFsc2U7LyogcmVzZXQgdG8gZGlzYWJsZWQgKi8KLQotCS8qICBUSCA9IDEgPT4gbWVhbnMgdGhhdCBpbnZhbGlkYXRlIHVzYiByeCBhZ2dyZWdhdGlvbiAqLwotCS8qICBUSCA9IDAgPT4gbWVhbnMgdGhhdCB2YWxpZGF0ZSB1c2IgcnggYWdncmVnYXRpb24sIHVzZSBpbml0IHZhbHVlLiAqLwotCWlmIChwaHRwcml2LT5odF9vcHRpb24pIHsKLQkJaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjID09IDEpCi0JCQl0aHJlc2hvbGQgPSAxOwotCQllbHNlCi0JCQl0aHJlc2hvbGQgPSAwOwotCX0gZWxzZQotCQl0aHJlc2hvbGQgPSAxOwotCi0JcnRsODcyM2Ffc2V0X3J4ZG1hX2FnZ19wZ190aChwYWRhcHRlciwgdGhyZXNob2xkKTsKLX0KLQotLyogdGhlIGZ1bmN0aW9uIGlzID49IHBhc3NpdmVfbGV2ZWwgKi8KLWJvb2wgcnR3X3Jlc3RydWN0dXJlX2h0X2llMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICppbl9pZSwKLQkJCSAgICAgIHU4ICpvdXRfaWUsIHVpbnQgaW5fbGVuLCB1aW50ICpwb3V0X2xlbikKLXsKLQl1MzIgb3V0X2xlbjsKLQlpbnQgbWF4X3J4X2FtcGR1X2ZhY3RvcjsKLQl1bnNpZ25lZCBjaGFyICpwZnJhbWU7Ci0JY29uc3QgdTggKnA7Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9jYXAgaHRfY2FwaWU7Ci0JdTggV01NX0lFWzddID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDB9OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IGh0X3ByaXYgKnBodHByaXYgPSAmcG1sbWVwcml2LT5odHByaXY7Ci0KLQlwaHRwcml2LT5odF9vcHRpb24gPSBmYWxzZTsKLQotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX0NBUEFCSUxJVFksIGluX2llLCBpbl9sZW4pOwotCi0JaWYgKHAgJiYgcFsxXSA+IDApIHsKLQkJdTMyIHJ4X3BhY2tldF9vZmZzZXQsIG1heF9yZWN2YnVmX3N6OwotCi0JCWlmIChwbWxtZXByaXYtPnFvc19vcHRpb24gPT0gMCkgewotCQkJb3V0X2xlbiA9ICpwb3V0X2xlbjsKLQkJCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2Eob3V0X2llICsgb3V0X2xlbiwKLQkJCQkJICAgICAgIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQywKLQkJCQkJICAgICAgIHNpemVvZihXTU1fSUUpLCBXTU1fSUUsCi0JCQkJCSAgICAgICBwb3V0X2xlbik7Ci0KLQkJCXBtbG1lcHJpdi0+cW9zX29wdGlvbiA9IDE7Ci0JCX0KLQotCQlvdXRfbGVuID0gKnBvdXRfbGVuOwotCi0JCW1lbXNldCgmaHRfY2FwaWUsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkpOwotCi0JCWh0X2NhcGllLmNhcF9pbmZvID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDAgfAotCQkJSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAgfCBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCB8Ci0JCQlJRUVFODAyMTFfSFRfQ0FQX1RYX1NUQkMgfCBJRUVFODAyMTFfSFRfQ0FQX0RTU1NDQ0s0MCk7Ci0KLQkJR2V0SGFsRGVmVmFyODE5MkNVc2IocGFkYXB0ZXIsIEhBTF9ERUZfUlhfUEFDS0VUX09GRlNFVCwKLQkJCQkgICAgICZyeF9wYWNrZXRfb2Zmc2V0KTsKLQkJR2V0SGFsRGVmVmFyODE5MkNVc2IocGFkYXB0ZXIsIEhBTF9ERUZfTUFYX1JFQ1ZCVUZfU1osCi0JCQkJICAgICAmbWF4X3JlY3ZidWZfc3opOwotCi0JCUdldEhhbERlZlZhcjgxOTJDVXNiKHBhZGFwdGVyLCBIV19WQVJfTUFYX1JYX0FNUERVX0ZBQ1RPUiwKLQkJCQkgICAgICZtYXhfcnhfYW1wZHVfZmFjdG9yKTsKLQkJaHRfY2FwaWUuYW1wZHVfcGFyYW1zX2luZm8gPSBtYXhfcnhfYW1wZHVfZmFjdG9yICYgMHgwMzsKLQotCQlpZiAocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID09Ci0JCSAgICBXTEFOX0NJUEhFUl9TVUlURV9DQ01QKQotCQkJaHRfY2FwaWUuYW1wZHVfcGFyYW1zX2luZm8gfD0KLQkJCQkoSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fREVOU0lUWSYgKDB4MDcgPDwgMikpOwotCQllbHNlCi0JCQlodF9jYXBpZS5hbXBkdV9wYXJhbXNfaW5mbyB8PQotCQkJCShJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9ERU5TSVRZICYgMHgwMCk7Ci0KLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShvdXRfaWUgKyBvdXRfbGVuLCBXTEFOX0VJRF9IVF9DQVBBQklMSVRZLAotCQkJCSAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApLAotCQkJCSAgICAodW5zaWduZWQgY2hhciAqKSZodF9jYXBpZSwgcG91dF9sZW4pOwotCi0JCXBodHByaXYtPmh0X29wdGlvbiA9IHRydWU7Ci0KLQkJcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfSFRfT1BFUkFUSU9OLCBpbl9pZSwgaW5fbGVuKTsKLQkJaWYgKHAgJiYgKHBbMV0gPT0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uKSkpIHsKLQkJCW91dF9sZW4gPSAqcG91dF9sZW47Ci0JCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKG91dF9pZSArIG91dF9sZW4sCi0JCQkJCSAgICAgICBXTEFOX0VJRF9IVF9PUEVSQVRJT04sCi0JCQkJCSAgICAgICBwWzFdLCBwICsgMiAsIHBvdXRfbGVuKTsKLQkJfQotCX0KLQotCXJldHVybiBwaHRwcml2LT5odF9vcHRpb247Ci19Ci0KLS8qIHRoZSBmdW5jdGlvbiBpcyA+IHBhc3NpdmVfbGV2ZWwgKGluIGNyaXRpY2FsX3NlY3Rpb24pICovCi12b2lkIHJ0d191cGRhdGVfaHRfY2FwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwaWUsIHVpbnQgaWVfbGVuKQotewotCXU4IG1heF9hbXBkdV9zejsKLQljb25zdCB1OCAqcDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcGllOwotCXN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uICpwaHRfYWRkdGluZm87Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgaHRfcHJpdiAqcGh0cHJpdiA9ICZwbWxtZXByaXYtPmh0cHJpdjsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlpZiAoIXBodHByaXYtPmh0X29wdGlvbikKLQkJcmV0dXJuOwotCi0JaWYgKCghcG1sbWVpbmZvLT5IVF9pbmZvX2VuYWJsZSkgfHwgKCFwbWxtZWluZm8tPkhUX2NhcHNfZW5hYmxlKSkKLQkJcmV0dXJuOwotCi0JREJHXzg3MjNBKCIrcnR3X3VwZGF0ZV9odF9jYXAyM2EoKVxuIik7Ci0KLQkvKiBtYXliZSBuZWVkcyBjaGVjayBpZiBhcCBzdXBwb3J0cyByeCBhbXBkdS4gKi8KLQlpZiAoIXBodHByaXYtPmFtcGR1X2VuYWJsZSAmJiBwcmVnaXN0cnlwcml2LT5hbXBkdV9lbmFibGUgPT0gMSkgewotCQlpZiAocHJlZ2lzdHJ5cHJpdi0+d2lmaV9zcGVjID09IDEpCi0JCQlwaHRwcml2LT5hbXBkdV9lbmFibGUgPSBmYWxzZTsKLQkJZWxzZQotCQkJcGh0cHJpdi0+YW1wZHVfZW5hYmxlID0gdHJ1ZTsKLQl9IGVsc2UgaWYgKHByZWdpc3RyeXByaXYtPmFtcGR1X2VuYWJsZSA9PSAyKQotCQlwaHRwcml2LT5hbXBkdV9lbmFibGUgPSB0cnVlOwotCi0JLyogY2hlY2sgTWF4IFJ4IEEtTVBEVSBTaXplICovCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfSFRfQ0FQQUJJTElUWSwgcGllLCBpZV9sZW4pOwotCi0JaWYgKHAgJiYgcFsxXSA+IDApIHsKLQkJcGh0X2NhcGllID0gKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICopKHAgKyAyKTsKLQkJbWF4X2FtcGR1X3N6ID0gcGh0X2NhcGllLT5hbXBkdV9wYXJhbXNfaW5mbyAmCi0JCQlJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9GQUNUT1I7Ci0JCS8qICBtYXhfYW1wZHVfc3ogKGtieXRlcyk7ICovCi0JCW1heF9hbXBkdV9zeiA9IDEgPDwgKG1heF9hbXBkdV9zeiArIDMpOwotCi0JCXBodHByaXYtPnJ4X2FtcGR1X21heGxlbiA9IG1heF9hbXBkdV9zejsKLQl9Ci0KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9IVF9PUEVSQVRJT04sIHBpZSwgaWVfbGVuKTsKLQlpZiAocCAmJiBwWzFdID4gMCkgewotCQlwaHRfYWRkdGluZm8gPSAoc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24gKikocCArIDIpOwotCQkvKiB0b2RvOiAqLwotCX0KLQotCS8qIHVwZGF0ZSBjdXJfYndtb2RlICYgY3VyX2NoX29mZnNldCAqLwotCWlmIChwcmVnaXN0cnlwcml2LT5jYnc0MF9lbmFibGUgJiYKLQkgICAgcG1sbWVpbmZvLT5odF9jYXAuY2FwX2luZm8gJgotCSAgICBjcHVfdG9fbGUxNihJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCkgJiYKLQkgICAgcG1sbWVpbmZvLT5IVF9pbmZvLmh0X3BhcmFtICYgSUVFRTgwMjExX0hUX1BBUkFNX0NIQU5fV0lEVEhfQU5ZKSB7Ci0JCWludCBpOwotCQl1OCByZl90eXBlOwotCi0JCXJmX3R5cGUgPSBydGw4NzIzYV9nZXRfcmZfdHlwZShwYWRhcHRlcik7Ci0KLQkJLyogdXBkYXRlIHRoZSBNQ1MgcmF0ZXMgKi8KLQkJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9IVF9NQ1NfTUFTS19MRU47IGkrKykgewotCQkJaWYgKHJmX3R5cGUgPT0gUkZfMVQxUiB8fCByZl90eXBlID09IFJGXzFUMlIpCi0JCQkJcG1sbWVpbmZvLT5odF9jYXAubWNzLnJ4X21hc2tbaV0gJj0KLQkJCQkJTUNTX3JhdGVfMVIyM0FbaV07Ci0JCQllbHNlCi0JCQkJcG1sbWVpbmZvLT5odF9jYXAubWNzLnJ4X21hc2tbaV0gJj0KLQkJCQkJTUNTX3JhdGVfMlIyM0FbaV07Ci0JCX0KLQkJLyogc3dpdGNoIHRvIHRoZSA0ME0gSHogbW9kZSBhY2NvcmRpbmcgdG8gdGhlIEFQICovCi0JCXBtbG1lZXh0LT5jdXJfYndtb2RlID0gSFRfQ0hBTk5FTF9XSURUSF80MDsKLQkJc3dpdGNoIChwbWxtZWluZm8tPkhUX2luZm8uaHRfcGFyYW0gJgotCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfT0ZGU0VUKSB7Ci0JCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU6Ci0JCQlwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c6Ci0JCQlwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9VUFBFUjsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9Ci0JCQkJSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogICovCi0JLyogIENvbmZpZyBTTSBQb3dlciBTYXZlIHNldHRpbmcgKi8KLQkvKiAgKi8KLQlwbWxtZWluZm8tPlNNX1BTID0KLQkJKGxlMTZfdG9fY3B1KHBtbG1laW5mby0+aHRfY2FwLmNhcF9pbmZvKSAmCi0JCSBJRUVFODAyMTFfSFRfQ0FQX1NNX1BTKSA+PiBJRUVFODAyMTFfSFRfQ0FQX1NNX1BTX1NISUZUOwotCWlmIChwbWxtZWluZm8tPlNNX1BTID09IFdMQU5fSFRfQ0FQX1NNX1BTX1NUQVRJQykKLQkJREJHXzg3MjNBKCIlcygpOiBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUNcbiIsIF9fZnVuY19fKTsKLQotCS8qICAqLwotCS8qICBDb25maWcgY3VycmVudCBIVCBQcm90ZWN0aW9uIG1vZGUuICovCi0JLyogICovCi0JcG1sbWVpbmZvLT5IVF9wcm90ZWN0aW9uID0KLQkJbGUxNl90b19jcHUocG1sbWVpbmZvLT5IVF9pbmZvLm9wZXJhdGlvbl9tb2RlKSAmCi0JCUlFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT047Ci19Ci0KLXZvaWQgcnR3X2lzc3VlX2FkZGJhcmVxX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKQotewotCXU4IGlzc3VlZDsKLQlpbnQgcHJpb3JpdHk7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXN0cnVjdCBodF9wcml2CSpwaHRwcml2OwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKLQlzMzIgYm1jc3QgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSk7Ci0KLQlpZiAoYm1jc3QgfHwgcGFkYXB0ZXItPm1sbWVwcml2LkxpbmtEZXRlY3RJbmZvLk51bVR4T2tJblBlcmlvZCA8IDEwMCkKLQkJcmV0dXJuOwotCi0JcHJpb3JpdHkgPSBwYXR0cmliLT5wcmlvcml0eTsKLQotCWlmIChwYXR0cmliLT5wc3RhKQotCQlwc3RhID0gcGF0dHJpYi0+cHN0YTsKLQllbHNlIHsKLQkJREJHXzg3MjNBKCIlcywgY2FsbCBydHdfZ2V0X3N0YWluZm8yM2EoKVxuIiwgX19mdW5jX18pOwotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwgcGF0dHJpYi0+cmEpOwotCX0KLQotCWlmICghcHN0YSkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhID09IE5VTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCEocHN0YS0+c3RhdGUgJl9GV19MSU5LRUQpKSB7Ci0JCURCR184NzIzQSgiJXMsIHBzdGEtPnN0YXRlKDB4JXgpICE9IF9GV19MSU5LRURcbiIsCi0JCQkgIF9fZnVuY19fLCBwc3RhLT5zdGF0ZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwaHRwcml2ID0gJnBzdGEtPmh0cHJpdjsKLQotCWlmIChwaHRwcml2LT5odF9vcHRpb24gJiYgcGh0cHJpdi0+YW1wZHVfZW5hYmxlKSB7Ci0JCWlzc3VlZCA9IChwaHRwcml2LT5hZ2dfZW5hYmxlX2JpdG1hcD4+cHJpb3JpdHkpJjB4MTsKLQkJaXNzdWVkIHw9IChwaHRwcml2LT5jYW5kaWRhdGVfdGlkX2JpdG1hcD4+cHJpb3JpdHkpJjB4MTsKLQotCQlpZiAoaXNzdWVkID09IDApIHsKLQkJCURCR184NzIzQSgicnR3X2lzc3VlX2FkZGJhcmVxX2NtZDIzYSwgcCA9JWRcbiIsCi0JCQkJICBwcmlvcml0eSk7Ci0JCQlwc3RhLT5odHByaXYuY2FuZGlkYXRlX3RpZF9iaXRtYXAgfD0gQklUKHByaW9yaXR5KTsKLQkJCXJ0d19hZGRiYXJlcV9jbWQyM2EocGFkYXB0ZXIsICh1OCkgcHJpb3JpdHksCi0JCQkJCSAgICBwYXR0cmliLT5yYSk7Ci0JCX0KLQl9Ci19Ci0KLWludCBydHdfbGlua2VkX2NoZWNrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkgfHwKLQkgICAgY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LAotCQkJICBXSUZJX0FESE9DX1NUQVRFfFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgewotCQlpZiAocGFkYXB0ZXItPnN0YXByaXYuYXNvY19zdGFfY291bnQgPiAyKQotCQkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlIHsJLyogU3RhdGlvbiBtb2RlICovCi0JCWlmIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIF9GV19MSU5LRUQpKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfbWxtZV9leHQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfbWxtZV9leHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkMTU0MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X21sbWVfZXh0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRXX01MTUVfRVhUX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8d2lmaS5oPgotI2luY2x1ZGUgPHJ0d19tbG1lX2V4dC5oPgotI2luY2x1ZGUgPHdsYW5fYnNzZGVmLmg+Ci0jaW5jbHVkZSA8bWxtZV9vc2RlcC5oPgotI2luY2x1ZGUgPHJlY3Zfb3NkZXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLQotc3RhdGljIGludCBPbkFzc29jUmVxMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uQXNzb2NSc3AyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXN0YXRpYyBpbnQgT25Qcm9iZVJlcTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotc3RhdGljIGludCBPblByb2JlUnNwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IERvUmVzZXJ2ZWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXN0YXRpYyBpbnQgT25CZWFjb24yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXN0YXRpYyBpbnQgT25BdGltMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uRGlzYXNzb2MyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXN0YXRpYyBpbnQgT25BdXRoMjNhQ2xpZW50MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uRGVBdXRoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uQWN0aW9uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci0KLXN0YXRpYyBpbnQgb25fYWN0aW9uX3NwY3QyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXN0YXRpYyBpbnQgT25BY3Rpb24yM2FfcW9zKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uQWN0aW9uMjNhX2RscyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotc3RhdGljIGludCBPbkFjdGlvbjIzYV9iYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IG9uX2FjdGlvbl9wdWJsaWMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXN0YXRpYyBpbnQgT25BY3Rpb24yM2FfaHQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXN0YXRpYyBpbnQgT25BY3Rpb24yM2Ffd21tKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uQWN0aW9uMjNhX3AycChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotCi1zdGF0aWMgdm9pZCBpc3N1ZV9hc3NvY3JlcShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXN0YXRpYyB2b2lkIGlzc3VlX3Byb2JlcmVxKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICBzdHJ1Y3QgY2ZnODAyMTFfc3NpZCAqcHNzaWQsIHU4ICpkYSk7Ci1zdGF0aWMgaW50IGlzc3VlX3Byb2JlcmVxX2V4KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgIHN0cnVjdCBjZmc4MDIxMV9zc2lkICpwc3NpZCwKLQkJCSAgICAgdTggKmRhLCBpbnQgdHJ5X2NudCwgaW50IHdhaXRfbXMpOwotc3RhdGljIHZvaWQgaXNzdWVfcHJvYmVyc3Aoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqZGEpOwotc3RhdGljIHZvaWQgaXNzdWVfYXV0aChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsCi0JCSAgICAgICB1bnNpZ25lZCBzaG9ydCBzdGF0dXMpOwotc3RhdGljIGludCBpc3N1ZV9kZWF1dGhfZXgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmRhLAotCQkJICAgdW5zaWduZWQgc2hvcnQgcmVhc29uLCBpbnQgdHJ5X2NudCwgaW50IHdhaXRfbXMpOwotc3RhdGljIHZvaWQgc3RhcnRfY2xudF9hc3NvYyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHN0YXJ0X2NsbnRfYXV0aChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHN0YXJ0X2NsbnRfam9pbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHN0YXJ0X2NyZWF0ZV9pYnNzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotc3RhdGljIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjb2xsZWN0X2Jzc19pbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJCSAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLXN0YXRpYyBpbnQgT25BdXRoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgdm9pZCBpc3N1ZV9hc3NvY3JzcChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBzaG9ydCBzdGF0dXMsCi0JCQkgICBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGF0LCB1MTYgcGt0X3R5cGUpOwotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgbWxtZV9oYW5kbGVyIG1sbWVfc3RhX3RibFtdPXsKLQl7Ik9uQXNzb2NSZXEyM2EiLAkJJk9uQXNzb2NSZXEyM2F9LAotCXsiT25Bc3NvY1JzcDIzYSIsCQkmT25Bc3NvY1JzcDIzYX0sCi0JeyJPblJlQXNzb2NSZXEiLAkmT25Bc3NvY1JlcTIzYX0sCi0JeyJPblJlQXNzb2NSc3AiLAkmT25Bc3NvY1JzcDIzYX0sCi0JeyJPblByb2JlUmVxMjNhIiwJCSZPblByb2JlUmVxMjNhfSwKLQl7Ik9uUHJvYmVSc3AyM2EiLAkJJk9uUHJvYmVSc3AyM2F9LAotCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkJCWJlbG93IDIgYXJlIHJlc2VydmVkCi0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCXsiRG9SZXNlcnZlZDIzYSIsCQkmRG9SZXNlcnZlZDIzYX0sCi0JeyJEb1Jlc2VydmVkMjNhIiwJCSZEb1Jlc2VydmVkMjNhfSwKLQl7Ik9uQmVhY29uMjNhIiwJCSZPbkJlYWNvbjIzYX0sCi0JeyJPbkFUSU0iLAkJJk9uQXRpbTIzYX0sCi0JeyJPbkRpc2Fzc29jMjNhIiwJCSZPbkRpc2Fzc29jMjNhfSwKLQl7Ik9uQXV0aDIzYSIsCQkmT25BdXRoMjNhQ2xpZW50MjNhfSwKLQl7Ik9uRGVBdXRoMjNhIiwJCSZPbkRlQXV0aDIzYX0sCi0JeyJPbkFjdGlvbjIzYSIsCQkmT25BY3Rpb24yM2F9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhY3Rpb25faGFuZGxlciBPbkFjdGlvbjIzYV90YmxbXT17Ci0Je1dMQU5fQ0FURUdPUllfU1BFQ1RSVU1fTUdNVCwgIkFDVElPTl9TUEVDVFJVTV9NR01UIiwgb25fYWN0aW9uX3NwY3QyM2F9LAotCXtXTEFOX0NBVEVHT1JZX1FPUywgIkFDVElPTl9RT1MiLCAmT25BY3Rpb24yM2FfcW9zfSwKLQl7V0xBTl9DQVRFR09SWV9ETFMsICJBQ1RJT05fRExTIiwgJk9uQWN0aW9uMjNhX2Rsc30sCi0Je1dMQU5fQ0FURUdPUllfQkFDSywgIkFDVElPTl9CQUNLIiwgJk9uQWN0aW9uMjNhX2JhY2syM2F9LAotCXtXTEFOX0NBVEVHT1JZX1BVQkxJQywgIkFDVElPTl9QVUJMSUMiLCBvbl9hY3Rpb25fcHVibGljMjNhfSwKLQl7V0xBTl9DQVRFR09SWV9IVCwgIkFDVElPTl9IVCIsCSZPbkFjdGlvbjIzYV9odH0sCi0Je1dMQU5fQ0FURUdPUllfU0FfUVVFUlksICJBQ1RJT05fU0FfUVVFUlkiLCAmRG9SZXNlcnZlZDIzYX0sCi0Je1dMQU5fQ0FURUdPUllfV01NLCAiQUNUSU9OX1dNTSIsICZPbkFjdGlvbjIzYV93bW19LAotCXtXTEFOX0NBVEVHT1JZX1ZFTkRPUl9TUEVDSUZJQywgIkFDVElPTl9QMlAiLCAmT25BY3Rpb24yM2FfcDJwfSwKLX07Ci0KLXN0YXRpYyB1OAludWxsX2FkZHJbRVRIX0FMRU5dPSB7MCwgMCwgMCwgMCwgMCwgMH07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotT1VJIGRlZmluaXRpb25zIGZvciB0aGUgdmVuZG9yIHNwZWNpZmljIElFCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bnNpZ25lZCBjaGFyIFdNTV9PVUkyM0FbXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyfTsKLXVuc2lnbmVkIGNoYXIgV1BTX09VSTIzQVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9OwotdW5zaWduZWQgY2hhciBQMlBfT1VJMjNBW10gPSB7MHg1MCwgMHg2RiwgMHg5QSwgMHgwOX07Ci11bnNpZ25lZCBjaGFyIFdGRF9PVUkyM0FbXSA9IHsweDUwLCAweDZGLCAweDlBLCAweDBBfTsKLQotdW5zaWduZWQgY2hhciBXTU1fSU5GT19PVUkyM0FbXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxfTsKLXVuc2lnbmVkIGNoYXIgV01NX1BBUkFfT1VJMjNBW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMSwgMHgwMX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFJFQUxURUtfOTZCX0lFW10gPSB7MHgwMCwgMHhlMCwgMHg0YywgMHgwMiwgMHgwMSwgMHgyMH07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotTUNTIHJhdGUgZGVmaW5pdGlvbnMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVuc2lnbmVkIGNoYXIgTUNTX3JhdGVfMlIyM0FbMTZdID0gewotCTB4ZmYsIDB4ZmYsIDB4MCwgMHgwLCAweDAxLCAweDAsIDB4MCwgMHgwLAotCTB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwfTsKLXVuc2lnbmVkIGNoYXIgTUNTX3JhdGVfMVIyM0FbMTZdID0gewotCTB4ZmYsIDB4MDAsIDB4MCwgMHgwLCAweDAxLCAweDAsIDB4MCwgMHgwLAotCTB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1DaGFubmVsUGxhbiBkZWZpbml0aW9ucwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgc3RydWN0IHJ0X2NoYW5uZWxfcGxhbl8yZyBSVFdfQ2hhbm5lbFBsYW4yR1tSVF9DSEFOTkVMX0RPTUFJTl8yR19NQVhdID0gewotCS8qICAweDAwLCBSVF9DSEFOTkVMX0RPTUFJTl8yR19XT1JMRCAsIFBhc3NpdmUgc2NhbiBDSCAxMiwgMTMgKi8KLQl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzfSwgMTN9LAotCS8qICAweDAxLCBSVF9DSEFOTkVMX0RPTUFJTl8yR19FVFNJMSAqLwotCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTN9LCAxM30sCi0JLyogIDB4MDIsIFJUX0NIQU5ORUxfRE9NQUlOXzJHX0ZDQzEgKi8KLQl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMX0sIDExfSwKLQkvKiAgMHgwMywgUlRfQ0hBTk5FTF9ET01BSU5fMkdfTUlLSzEgKi8KLQl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNH0sIDE0fSwKLQkvKiAgMHgwNCwgUlRfQ0hBTk5FTF9ET01BSU5fMkdfRVRTSTIgKi8KLQl7ezEwLCAxMSwgMTIsIDEzfSwgNH0sCi0JLyogIDB4MDUsIFJUX0NIQU5ORUxfRE9NQUlOXzJHX05VTEwgKi8KLQl7e30sIDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBydF9jaGFubmVsX3BsYW5fNWcgUlRXX0NoYW5uZWxQbGFuNUdbUlRfQ0hBTk5FTF9ET01BSU5fNUdfTUFYXSA9IHsKLQkvKiAgMHgwMCwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfTlVMTCAqLwotCXt7fSwgMH0sCi0JLyogIDB4MDEsIFJUX0NIQU5ORUxfRE9NQUlOXzVHX0VUU0kxICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwKLQkgIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH0sIDE5fSwKLQkvKiAgMHgwMiwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfRVRTSTIgKi8KLQl7ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLAotCSAgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX0sIDI0fSwKLQkvKiAgMHgwMywgUlRfQ0hBTk5FTF9ET01BSU5fNUdfRVRTSTMgKi8KLQl7ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLAotCSAgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fSwgMjJ9LAotCS8qICAweDA0LCBSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0MxICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwKLQkgIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9LCAyNH0sCi0JLyogIDB4MDUsIFJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQzIgKi8KLQl7ezM2LCA0MCwgNDQsIDQ4LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX0sIDl9LAotCS8qICAweDA2LCBSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0MzICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fSwgMTN9LAotCS8qICAweDA3LCBSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0M0ICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MX0sIDEyfSwKLQkvKiAgMHgwOCwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDNSAqLwotCXt7MTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9LCA1fSwKLQkvKiAgMHgwOSwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDNiAqLwotCXt7MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fSwgOH0sCi0JLyogIDB4MEEsIFJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQzdfSUMxICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwKLQkgIDExNiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fSwgMjB9LAotCS8qICAweDBCLCBSVF9DSEFOTkVMX0RPTUFJTl81R19LQ0MxICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwKLQkgIDExNiwgMTIwLCAxMjQsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fSwgMjB9LAotCS8qICAweDBDLCBSVF9DSEFOTkVMX0RPTUFJTl81R19NS0sxICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwKLQkgIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH0sIDE5fSwKLQkvKiAgMHgwRCwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfTUtLMiAqLwotCXt7MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fSwgOH0sCi0JLyogIDB4MEUsIFJUX0NIQU5ORUxfRE9NQUlOXzVHX01LSzMgKi8KLQl7ezEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfSwgMTF9LAotCS8qICAweDBGLCBSVF9DSEFOTkVMX0RPTUFJTl81R19OQ0MxICovCi0Je3s1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTM2LCAxNDAsIDE0OSwKLQkgIDE1MywgMTU3LCAxNjEsIDE2NX0sIDE1fSwKLQkvKiAgMHgxMCwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfTkNDMiAqLwotCXt7NTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9LCA4fSwKLQotCS8qICBEcml2ZXIgc2VsZiBkZWZpbmVkIGZvciBvbGQgY2hhbm5lbCBwbGFuIENvbXBhdGlibGUsCi0JICAgIFJlbWVtYmVyIHRvIG1vZGlmeSBpZiBoYXZlIG5ldyBjaGFubmVsIHBsYW4gZGVmaW5pdGlvbiA9PT09PSAqLwotCS8qICAweDExLCBSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0MgKi8KLQl7ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLAotCSAgMTE2LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX0sIDIxfSwKLQkvKiAgMHgxMiwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfSkFQQU5fTk9fREZTICovCi0Je3szNiwgNDAsIDQ0LCA0OH0sIDR9LAotCS8qICAweDEzLCBSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0M0X05PX0RGUyAqLwotCXt7MzYsIDQwLCA0NCwgNDgsIDE0OSwgMTUzLCAxNTcsIDE2MX0sIDh9LAotfTsKLQotc3RhdGljIHN0cnVjdCBydF9jaGFubmVsX3BsYW5fbWFwIFJUV19DaGFubmVsUGxhbk1hcFtSVF9DSEFOTkVMX0RPTUFJTl9NQVhdID0gewotCS8qICAweDAwIH4gMHgxRiAsIE9sZCBEZWZpbmUgPT09PT0gKi8KLQl7MHgwMiwgMHgxMX0sCS8qIDB4MDAsIFJUX0NIQU5ORUxfRE9NQUlOX0ZDQyAqLwotCXsweDAyLCAweDBBfSwJLyogMHgwMSwgUlRfQ0hBTk5FTF9ET01BSU5fSUMgKi8KLQl7MHgwMSwgMHgwMX0sCS8qIDB4MDIsIFJUX0NIQU5ORUxfRE9NQUlOX0VUU0kgKi8KLQl7MHgwMSwgMHgwMH0sCS8qIDB4MDMsIFJUX0NIQU5ORUxfRE9NQUlOX1NQQUlOICovCi0JezB4MDEsIDB4MDB9LAkvKiAweDA0LCBSVF9DSEFOTkVMX0RPTUFJTl9GUkFOQ0UgKi8KLQl7MHgwMywgMHgwMH0sCS8qIDB4MDUsIFJUX0NIQU5ORUxfRE9NQUlOX01LSyAqLwotCXsweDAzLCAweDAwfSwJLyogMHgwNiwgUlRfQ0hBTk5FTF9ET01BSU5fTUtLMSAqLwotCXsweDAxLCAweDA5fSwJLyogMHgwNywgUlRfQ0hBTk5FTF9ET01BSU5fSVNSQUVMICovCi0JezB4MDMsIDB4MDl9LAkvKiAweDA4LCBSVF9DSEFOTkVMX0RPTUFJTl9URUxFQyAqLwotCXsweDAzLCAweDAwfSwJLyogMHgwOSwgUlRfQ0hBTk5FTF9ET01BSU5fR0xPQkFMX0RPQU1JTiAqLwotCXsweDAwLCAweDAwfSwJLyogMHgwQSwgUlRfQ0hBTk5FTF9ET01BSU5fV09STERfV0lERV8xMyAqLwotCXsweDAyLCAweDBGfSwJLyogMHgwQiwgUlRfQ0hBTk5FTF9ET01BSU5fVEFJV0FOICovCi0JezB4MDEsIDB4MDh9LAkvKiAweDBDLCBSVF9DSEFOTkVMX0RPTUFJTl9DSElOQSAqLwotCXsweDAyLCAweDA2fSwJLyogMHgwRCwgUlRfQ0hBTk5FTF9ET01BSU5fU0lOR0FQT1JFX0lORElBX01FWElDTyAqLwotCXsweDAyLCAweDBCfSwJLyogMHgwRSwgUlRfQ0hBTk5FTF9ET01BSU5fS09SRUEgKi8KLQl7MHgwMiwgMHgwOX0sCS8qIDB4MEYsIFJUX0NIQU5ORUxfRE9NQUlOX1RVUktFWSAqLwotCXsweDAxLCAweDAxfSwJLyogMHgxMCwgUlRfQ0hBTk5FTF9ET01BSU5fSkFQQU4gKi8KLQl7MHgwMiwgMHgwNX0sCS8qIDB4MTEsIFJUX0NIQU5ORUxfRE9NQUlOX0ZDQ19OT19ERlMgKi8KLQl7MHgwMSwgMHgxMn0sCS8qIDB4MTIsIFJUX0NIQU5ORUxfRE9NQUlOX0pBUEFOX05PX0RGUyAqLwotCXsweDAwLCAweDA0fSwJLyogMHgxMywgUlRfQ0hBTk5FTF9ET01BSU5fV09STERfV0lERV81RyAqLwotCXsweDAyLCAweDEwfSwJLyogMHgxNCwgUlRfQ0hBTk5FTF9ET01BSU5fVEFJV0FOX05PX0RGUyAqLwotCXsweDAwLCAweDEyfSwJLyogMHgxNSwgUlRfQ0hBTk5FTF9ET01BSU5fRVRTSV9OT19ERlMgKi8KLQl7MHgwMCwgMHgxM30sCS8qIDB4MTYsIFJUX0NIQU5ORUxfRE9NQUlOX0tPUkVBX05PX0RGUyAqLwotCXsweDAzLCAweDEyfSwJLyogMHgxNywgUlRfQ0hBTk5FTF9ET01BSU5fSkFQQU5fTk9fREZTICovCi0JezB4MDUsIDB4MDh9LAkvKiAweDE4LCBSVF9DSEFOTkVMX0RPTUFJTl9QQUtJU1RBTl9OT19ERlMgKi8KLQl7MHgwMiwgMHgwOH0sCS8qIDB4MTksIFJUX0NIQU5ORUxfRE9NQUlOX1RBSVdBTjJfTk9fREZTICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDFBLCAqLwotCXsweDAwLCAweDAwfSwJLyogMHgxQiwgKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4MUMsICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDFELCAqLwotCXsweDAwLCAweDAwfSwJLyogMHgxRSwgKi8KLQl7MHgwNSwgMHgwNH0sCS8qIDB4MUYsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX1dJREVfT05MWV81RyAqLwotCS8qICAweDIwIH4gMHg3RiAsIE5ldyBEZWZpbmUgPT09PT0gKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4MjAsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX05VTEwgKi8KLQl7MHgwMSwgMHgwMH0sCS8qIDB4MjEsIFJUX0NIQU5ORUxfRE9NQUlOX0VUU0kxX05VTEwgKi8KLQl7MHgwMiwgMHgwMH0sCS8qIDB4MjIsIFJUX0NIQU5ORUxfRE9NQUlOX0ZDQzFfTlVMTCAqLwotCXsweDAzLCAweDAwfSwJLyogMHgyMywgUlRfQ0hBTk5FTF9ET01BSU5fTUtLMV9OVUxMICovCi0JezB4MDQsIDB4MDB9LAkvKiAweDI0LCBSVF9DSEFOTkVMX0RPTUFJTl9FVFNJMl9OVUxMICovCi0JezB4MDIsIDB4MDR9LAkvKiAweDI1LCBSVF9DSEFOTkVMX0RPTUFJTl9GQ0MxX0ZDQzEgKi8KLQl7MHgwMCwgMHgwMX0sCS8qIDB4MjYsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0VUU0kxICovCi0JezB4MDMsIDB4MEN9LAkvKiAweDI3LCBSVF9DSEFOTkVMX0RPTUFJTl9NS0sxX01LSzEgKi8KLQl7MHgwMCwgMHgwQn0sCS8qIDB4MjgsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0tDQzEgKi8KLQl7MHgwMCwgMHgwNX0sCS8qIDB4MjksIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0ZDQzIgKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4MkEsICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDJCLCAqLwotCXsweDAwLCAweDAwfSwJLyogMHgyQywgKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4MkQsICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDJFLCAqLwotCXsweDAwLCAweDAwfSwJLyogMHgyRiwgKi8KLQl7MHgwMCwgMHgwNn0sCS8qIDB4MzAsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0ZDQzMgKi8KLQl7MHgwMCwgMHgwN30sCS8qIDB4MzEsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0ZDQzQgKi8KLQl7MHgwMCwgMHgwOH0sCS8qIDB4MzIsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0ZDQzUgKi8KLQl7MHgwMCwgMHgwOX0sCS8qIDB4MzMsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0ZDQzYgKi8KLQl7MHgwMiwgMHgwQX0sCS8qIDB4MzQsIFJUX0NIQU5ORUxfRE9NQUlOX0ZDQzFfRkNDNyAqLwotCXsweDAwLCAweDAyfSwJLyogMHgzNSwgUlRfQ0hBTk5FTF9ET01BSU5fV09STERfRVRTSTIgKi8KLQl7MHgwMCwgMHgwM30sCS8qIDB4MzYsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0VUU0kzICovCi0JezB4MDMsIDB4MER9LAkvKiAweDM3LCBSVF9DSEFOTkVMX0RPTUFJTl9NS0sxX01LSzIgKi8KLQl7MHgwMywgMHgwRX0sCS8qIDB4MzgsIFJUX0NIQU5ORUxfRE9NQUlOX01LSzFfTUtLMyAqLwotCXsweDAyLCAweDBGfSwJLyogMHgzOSwgUlRfQ0hBTk5FTF9ET01BSU5fRkNDMV9OQ0MxICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDNBLCAqLwotCXsweDAwLCAweDAwfSwJLyogMHgzQiwgKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4M0MsICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDNELCAqLwotCXsweDAwLCAweDAwfSwJLyogMHgzRSwgKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4M0YsICovCi0JezB4MDIsIDB4MTB9LAkvKiAweDQwLCBSVF9DSEFOTkVMX0RPTUFJTl9GQ0MxX05DQzIgKi8KLQl7MHgwMywgMHgwMH0sCS8qIDB4NDEsIFJUX0NIQU5ORUxfRE9NQUlOX0dMT0JBTF9ET0FNSU5fMkcgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnRfY2hhbm5lbF9wbGFuX21hcCBSVFdfQ0hBTk5FTF9QTEFOX01BUF9SRUFMVEVLX0RFRklORSA9Ci17MHgwMywgMHgwMn07IC8qIHVzZSB0aGUgY29uYmluYXRpb24gZm9yIG1heCBjaGFubmVsIG51bWJlcnMgKi8KLQotc3RhdGljIHZvaWQgZHVtbXlfZXZlbnRfY2FsbGJhY2soc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLX0KLQotc3RhdGljIHN0cnVjdCBmd2V2ZW50IHdsYW5ldmVudHNbXSA9Ci17Ci0JezAsICZkdW1teV9ldmVudF9jYWxsYmFja30sCS8qMCovCi0JezAsIE5VTEx9LAotCXswLCBOVUxMfSwKLQl7MCwgTlVMTH0sCi0JezAsIE5VTEx9LAotCXswLCBOVUxMfSwKLQl7MCwgTlVMTH0sCi0JezAsIE5VTEx9LAotCXswLCAmcnR3X3N1cnZleV9ldmVudF9jYjIzYX0sCQkvKjgqLwotCXtzaXplb2YgKHN0cnVjdCBzdXJ2ZXlkb25lX2V2ZW50KSwgJnJ0d19zdXJ2ZXlkb25lX2V2ZW50X2NhbGxiYWNrMjNhfSwKLQl7MCwgJnJ0dzIzYV9qb2luYnNzX2V2ZW50X2NifSwJCS8qMTAqLwotCXtzaXplb2Yoc3RydWN0IHN0YXNzb2NfZXZlbnQpLCAmcnR3X3N0YXNzb2NfZXZlbnRfY2FsbGJhY2syM2F9LAotCXtzaXplb2Yoc3RydWN0IHN0YWRlbF9ldmVudCksICZydHdfc3RhZGVsX2V2ZW50X2NhbGxiYWNrMjNhfSwKLQl7MCwgJmR1bW15X2V2ZW50X2NhbGxiYWNrfSwKLQl7MCwgJmR1bW15X2V2ZW50X2NhbGxiYWNrfSwKLQl7MCwgTlVMTH0sCS8qMTUqLwotCXswLCBOVUxMfSwKLQl7MCwgTlVMTH0sCi0JezAsIE5VTEx9LAotCXswLCAmZHVtbXlfZXZlbnRfY2FsbGJhY2t9LAotCXswLCBOVUxMfSwJIC8qMjAqLwotCXswLCBOVUxMfSwKLQl7MCwgTlVMTH0sCi0JezAsICZkdW1teV9ldmVudF9jYWxsYmFja30sCi0JezAsIE5VTEx9LAotfTsKLQotCi1zdGF0aWMgdm9pZCBydHdfY29ycmVjdF9UU0Yoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlod192YXJfc2V0X2NvcnJlY3RfdHNmKHBhZGFwdGVyKTsKLX0KLQotc3RhdGljIHZvaWQKLXJ0d191cGRhdGVfVFNGKHN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCwgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210KQotewotCXBtbG1lZXh0LT5UU0ZWYWx1ZSA9IGdldF91bmFsaWduZWRfbGU2NCgmbWdtdC0+dS5iZWFjb24udGltZXN0YW1wKTsKLX0KLQotLyoKLSAqIFNlYXJjaCB0aGUgQHBhcmFtIGNoYW5uZWxfbnVtIGluIGdpdmVuIEBwYXJhbSBjaGFubmVsX3NldAotICogQGNoX3NldDogdGhlIGdpdmVuIGNoYW5uZWwgc2V0Ci0gKiBAY2g6IHRoZSBnaXZlbiBjaGFubmVsIG51bWJlcgotICoKLSAqIHJldHVybiB0aGUgaW5kZXggb2YgY2hhbm5lbF9udW0gaW4gY2hhbm5lbF9zZXQsIC0xIGlmIG5vdCBmb3VuZAotICovCi1pbnQgcnR3X2NoX3NldF9zZWFyY2hfY2gyM2Eoc3RydWN0IHJ0X2NoYW5uZWxfaW5mbyAqY2hfc2V0LCBjb25zdCB1MzIgY2gpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBjaF9zZXRbaV0uIENoYW5uZWxOdW0gIT0gMDsgaSsrKSB7Ci0JCWlmIChjaCA9PSBjaF9zZXRbaV0uQ2hhbm5lbE51bSkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChpID49IGNoX3NldFtpXS5DaGFubmVsTnVtKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIGk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUZvbGxvd2luZyBhcmUgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyBmb3IgV2lGaSBNTE1FCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbnQgaW5pdF9od19tbG1lX2V4dDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwKLQkJCSAgICAgIHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0LCBwbWxtZWV4dC0+Y3VyX2J3bW9kZSk7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZCBpbml0X21sbWVfZXh0X3ByaXYyM2FfdmFsdWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXVuc2lnbmVkIGNoYXIJbWl4ZWRfZGF0YXJhdGVbTnVtUmF0ZXNdID0gewotCQlfMU1fUkFURV8sIF8yTV9SQVRFXywgXzVNX1JBVEVfLCBfMTFNX1JBVEVfLCBfNk1fUkFURV8sCi0JCV85TV9SQVRFXywgXzEyTV9SQVRFXywgXzE4TV9SQVRFXywgXzI0TV9SQVRFXywgXzM2TV9SQVRFXywKLQkJXzQ4TV9SQVRFXywgXzU0TV9SQVRFXywgMHhmZn07Ci0JdW5zaWduZWQgY2hhcgltaXhlZF9iYXNpY3JhdGVbTnVtUmF0ZXNdID0gewotCQlfMU1fUkFURV8sIF8yTV9SQVRFXywgXzVNX1JBVEVfLCBfMTFNX1JBVEVfLCBfNk1fUkFURV8sCi0JCV8xMk1fUkFURV8sIF8yNE1fUkFURV8sIDB4ZmYsfTsKLQotCWF0b21pY19zZXQoJnBtbG1lZXh0LT5ldmVudF9zZXEsIDApOwotCS8qIHJlc2V0IHRvIHplcm8gd2hlbiBkaXNjb25uZWN0IGF0IGNsaWVudCBtb2RlICovCi0JcG1sbWVleHQtPm1nbnRfc2VxID0gMDsKLQotCXBtbG1lZXh0LT5jdXJfY2hhbm5lbCA9IHBhZGFwdGVyLT5yZWdpc3RyeXByaXYuY2hhbm5lbDsKLQlwbWxtZWV4dC0+Y3VyX2J3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfMjA7Ci0JcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwotCi0JcG1sbWVleHQtPnJldHJ5ID0gMDsKLQotCXBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSA9IHBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lyZWxlc3NfbW9kZTsKLQotCW1lbWNweShwbWxtZWV4dC0+ZGF0YXJhdGUsIG1peGVkX2RhdGFyYXRlLCBOdW1SYXRlcyk7Ci0JbWVtY3B5KHBtbG1lZXh0LT5iYXNpY3JhdGUsIG1peGVkX2Jhc2ljcmF0ZSwgTnVtUmF0ZXMpOwotCi0JaWYgKHBtbG1lZXh0LT5jdXJfY2hhbm5lbCA+IDE0KQotCQlwbWxtZWV4dC0+dHhfcmF0ZSA9IElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COwotCWVsc2UKLQkJcG1sbWVleHQtPnR4X3JhdGUgPSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COwotCi0JcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID0gU0NBTl9ESVNBQkxFOwotCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5jaGFubmVsX2lkeCA9IDA7Ci0JcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmJzc19jbnQgPSAwOwotCXBtbG1lZXh0LT5zY2FuX2Fib3J0ID0gZmFsc2U7Ci0KLQlwbWxtZWluZm8tPnN0YXRlID0gTVNSX05PTElOSzsKLQlwbWxtZWluZm8tPnJlYXV0aF9jb3VudCA9IDA7Ci0JcG1sbWVpbmZvLT5yZWFzc29jX2NvdW50ID0gMDsKLQlwbWxtZWluZm8tPmxpbmtfY291bnQgPSAwOwotCXBtbG1laW5mby0+YXV0aF9zZXEgPSAwOwotCXBtbG1laW5mby0+YXV0aF9hbGdvID0gZG90MTFBdXRoQWxncnRobV9PcGVuOwotCXBtbG1laW5mby0+a2V5X2luZGV4ID0gMDsKLQlwbWxtZWluZm8tPml2ID0gMDsKLQotCXBtbG1laW5mby0+ZW5jX2FsZ28gPSAwOwotCXBtbG1laW5mby0+YXV0aE1vZGVUb2dnbGUgPSAwOwotCi0JbWVtc2V0KHBtbG1laW5mby0+Y2hnX3R4dCwgMCwgMTI4KTsKLQotCXBtbG1laW5mby0+c2xvdFRpbWUgPSBTSE9SVF9TTE9UX1RJTUU7Ci0JcG1sbWVpbmZvLT5wcmVhbWJsZV9tb2RlID0gUFJFQU1CTEVfQVVUTzsKLQotCXBtbG1laW5mby0+ZGlhbG9nVG9rZW4gPSAwOwotCi0JcG1sbWVleHQtPmFjdGlvbl9wdWJsaWNfcnhzZXEgPSAweGZmZmY7Ci0JcG1sbWVleHQtPmFjdGlvbl9wdWJsaWNfZGlhbG9nX3Rva2VuID0gMHhmZjsKLX0KLQotc3RhdGljIGludCBoYXNfY2hhbm5lbChzdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvICpjaGFubmVsX3NldCwKLQkJICAgICAgIHU4IGNoYW5zZXRfc2l6ZSwgdTggY2hhbikgewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGNoYW5zZXRfc2l6ZTsgaSsrKSB7Ci0JCWlmIChjaGFubmVsX3NldFtpXS5DaGFubmVsTnVtID09IGNoYW4pCi0JCQlyZXR1cm4gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaW5pdF9jaGFubmVsX2xpc3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIHN0cnVjdCBydF9jaGFubmVsX2luZm8gKmNoYW5uZWxfc2V0LAotCQkJICAgICAgdTggY2hhbnNldF9zaXplLAotCQkJICAgICAgc3RydWN0IHAycF9jaGFubmVscyAqY2hhbm5lbF9saXN0KQotewotCXN0cnVjdCBwMnBfb3Blcl9jbGFzc19tYXAgb3BfY2xhc3NbXSA9IHsKLQkJeyBJRUVFODAyMTFHLCAgODEsICAgMSwgIDEzLCAgMSwgQlcyMCB9LAotCQl7IElFRUU4MDIxMUcsICA4MiwgIDE0LCAgMTQsICAxLCBCVzIwIH0sCi0JCXsgSUVFRTgwMjExQSwgMTE1LCAgMzYsICA0OCwgIDQsIEJXMjAgfSwKLQkJeyBJRUVFODAyMTFBLCAxMTYsICAzNiwgIDQ0LCAgOCwgQlc0MFBMVVMgfSwKLQkJeyBJRUVFODAyMTFBLCAxMTcsICA0MCwgIDQ4LCAgOCwgQlc0ME1JTlVTIH0sCi0JCXsgSUVFRTgwMjExQSwgMTI0LCAxNDksIDE2MSwgIDQsIEJXMjAgfSwKLQkJeyBJRUVFODAyMTFBLCAxMjUsIDE0OSwgMTY5LCAgNCwgQlcyMCB9LAotCQl7IElFRUU4MDIxMUEsIDEyNiwgMTQ5LCAxNTcsICA4LCBCVzQwUExVUyB9LAotCQl7IElFRUU4MDIxMUEsIDEyNywgMTUzLCAxNjEsICA4LCBCVzQwTUlOVVMgfSwKLQkJeyAtMSwgMCwgMCwgMCwgMCwgQlcyMCB9Ci0JfTsKLQotCWludCBjbGEsIG9wOwotCi0JY2xhID0gMDsKLQotCWZvciAob3AgPSAwOyBvcF9jbGFzc1tvcF0ub3BfY2xhc3M7IG9wKyspIHsKLQkJdTggY2g7Ci0JCXN0cnVjdCBwMnBfb3Blcl9jbGFzc19tYXAgKm8gPSAmb3BfY2xhc3Nbb3BdOwotCQlzdHJ1Y3QgcDJwX3JlZ19jbGFzcyAqcmVnID0gTlVMTDsKLQotCQlmb3IgKGNoID0gby0+bWluX2NoYW47IGNoIDw9IG8tPm1heF9jaGFuOyBjaCArPSBvLT5pbmMpIHsKLQkJCWlmICghaGFzX2NoYW5uZWwoY2hhbm5lbF9zZXQsIGNoYW5zZXRfc2l6ZSwgY2gpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoKDAgPT0gcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5odF9lbmFibGUpICYmCi0JCQkgICAgKG8tPmluYyA9PSA4KSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKCgwID09IChwYWRhcHRlci0+cmVnaXN0cnlwcml2LmNidzQwX2VuYWJsZSAmIEJJVCgxKSkpICYmCi0JCQkJKChCVzQwTUlOVVMgPT0gby0+YncpIHx8IChCVzQwUExVUyA9PSBvLT5idykpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAocmVnID09IE5VTEwpIHsKLQkJCQlyZWcgPSAmY2hhbm5lbF9saXN0LT5yZWdfY2xhc3NbY2xhXTsKLQkJCQljbGErKzsKLQkJCQlyZWctPnJlZ19jbGFzcyA9IG8tPm9wX2NsYXNzOwotCQkJCXJlZy0+Y2hhbm5lbHMgPSAwOwotCQkJfQotCQkJcmVnLT5jaGFubmVsW3JlZy0+Y2hhbm5lbHNdID0gY2g7Ci0JCQlyZWctPmNoYW5uZWxzKys7Ci0JCX0KLQl9Ci0JY2hhbm5lbF9saXN0LT5yZWdfY2xhc3NlcyA9IGNsYTsKLX0KLQotc3RhdGljIHU4IGluaXRfY2hhbm5lbF9zZXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggY3BsYW4sCi0JCQkgICBzdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvICpjX3NldCkKLXsKLQl1OCBpLCBjaF9zaXplID0gMDsKLQl1OCBiNUdCYW5kID0gZmFsc2UsIGIyXzRHQmFuZCA9IGZhbHNlOwotCXU4IEluZGV4MkcgPSAwLCBJbmRleDVHID0gMDsKLQotCW1lbXNldChjX3NldCwgMCwgc2l6ZW9mKHN0cnVjdCBydF9jaGFubmVsX2luZm8pICogTUFYX0NIQU5ORUxfTlVNKTsKLQotCWlmIChjcGxhbiA+PSBSVF9DSEFOTkVMX0RPTUFJTl9NQVggJiYKLQkgICAgY3BsYW4gIT0gUlRfQ0hBTk5FTF9ET01BSU5fUkVBTFRFS19ERUZJTkUpIHsKLQkJREJHXzg3MjNBKCJDaGFubmVsUGxhbiBJRCAleCBlcnJvciAhISEhIVxuIiwgY3BsYW4pOwotCQlyZXR1cm4gY2hfc2l6ZTsKLQl9Ci0KLQlpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFHKSB7Ci0JCWIyXzRHQmFuZCA9IHRydWU7Ci0JCWlmIChSVF9DSEFOTkVMX0RPTUFJTl9SRUFMVEVLX0RFRklORSA9PSBjcGxhbikKLQkJCUluZGV4MkcgPSBSVFdfQ0hBTk5FTF9QTEFOX01BUF9SRUFMVEVLX0RFRklORS5JbmRleDJHOwotCQllbHNlCi0JCQlJbmRleDJHID0gUlRXX0NoYW5uZWxQbGFuTWFwW2NwbGFuXS5JbmRleDJHOwotCX0KLQotCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpcmVsZXNzX21vZGUgJiBXSVJFTEVTU18xMUEpIHsKLQkJYjVHQmFuZCA9IHRydWU7Ci0JCWlmIChSVF9DSEFOTkVMX0RPTUFJTl9SRUFMVEVLX0RFRklORSA9PSBjcGxhbikKLQkJCUluZGV4NUcgPSBSVFdfQ0hBTk5FTF9QTEFOX01BUF9SRUFMVEVLX0RFRklORS5JbmRleDVHOwotCQllbHNlCi0JCQlJbmRleDVHID0gUlRXX0NoYW5uZWxQbGFuTWFwW2NwbGFuXS5JbmRleDVHOwotCX0KLQotCWlmIChiMl80R0JhbmQpIHsKLQkJZm9yIChpID0gMDsgaSA8IFJUV19DaGFubmVsUGxhbjJHW0luZGV4MkddLkxlbjsgaSsrKSB7Ci0JCQljX3NldFtjaF9zaXplXS5DaGFubmVsTnVtID0KLQkJCQlSVFdfQ2hhbm5lbFBsYW4yR1tJbmRleDJHXS5DaGFubmVsW2ldOwotCi0JCQlpZiAoKFJUX0NIQU5ORUxfRE9NQUlOX0dMT0JBTF9ET0FNSU4gPT0gY3BsYW4pIHx8Ci0JCQkgICAgLyogQ2hhbm5lbCAxfjExIGlzIGFjdGl2ZSwgYW5kIDEyfjE0IGlzIHBhc3NpdmUgKi8KLQkJCSAgICBSVF9DSEFOTkVMX0RPTUFJTl9HTE9CQUxfRE9BTUlOXzJHID09IGNwbGFuKSB7Ci0JCQkJaWYgKGNfc2V0W2NoX3NpemVdLkNoYW5uZWxOdW0gPj0gMSAmJgotCQkJCSAgICBjX3NldFtjaF9zaXplXS5DaGFubmVsTnVtIDw9IDExKQotCQkJCQljX3NldFtjaF9zaXplXS5TY2FuVHlwZSA9IFNDQU5fQUNUSVZFOwotCQkJCWVsc2UgaWYgKGNfc2V0W2NoX3NpemVdLkNoYW5uZWxOdW0gPj0gMTIgJiYKLQkJCQkJIGNfc2V0W2NoX3NpemVdLkNoYW5uZWxOdW0gIDw9IDE0KQotCQkJCQljX3NldFtjaF9zaXplXS5TY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKLQkJCX0gZWxzZSBpZiAoUlRfQ0hBTk5FTF9ET01BSU5fV09STERfV0lERV8xMyA9PSBjcGxhbiB8fAotCQkJCSAgIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX1dJREVfNUcgPT0gY3BsYW4gfHwKLQkJCQkgICBSVF9DSEFOTkVMX0RPTUFJTl8yR19XT1JMRCA9PSBJbmRleDJHKSB7Ci0JCQkJLyogIGNoYW5uZWwgMTJ+MTMsIHBhc3NpdmUgc2NhbiAqLwotCQkJCWlmIChjX3NldFtjaF9zaXplXS5DaGFubmVsTnVtIDw9IDExKQotCQkJCQljX3NldFtjaF9zaXplXS5TY2FuVHlwZSA9IFNDQU5fQUNUSVZFOwotCQkJCWVsc2UKLQkJCQkJY19zZXRbY2hfc2l6ZV0uU2NhblR5cGUgPSBTQ0FOX1BBU1NJVkU7Ci0JCQl9IGVsc2UKLQkJCQljX3NldFtjaF9zaXplXS5TY2FuVHlwZSA9IFNDQU5fQUNUSVZFOwotCi0JCQljaF9zaXplKys7Ci0JCX0KLQl9Ci0KLQlpZiAoYjVHQmFuZCkgewotCQlmb3IgKGkgPSAwOyBpIDwgUlRXX0NoYW5uZWxQbGFuNUdbSW5kZXg1R10uTGVuOyBpKyspIHsKLQkJCWlmIChSVFdfQ2hhbm5lbFBsYW41R1tJbmRleDVHXS5DaGFubmVsW2ldIDw9IDQ4IHx8Ci0JCQkgICAgUlRXX0NoYW5uZWxQbGFuNUdbSW5kZXg1R10uQ2hhbm5lbFtpXSA+PSAxNDkpIHsKLQkJCQljX3NldFtjaF9zaXplXS5DaGFubmVsTnVtID0KLQkJCQkJUlRXX0NoYW5uZWxQbGFuNUdbSW5kZXg1R10uQ2hhbm5lbFtpXTsKLQkJCQlpZiAoUlRfQ0hBTk5FTF9ET01BSU5fV09STERfV0lERV81RyA9PSBjcGxhbikgewotCQkJCQkvKiBwYXNzaXZlIHNjYW4gZm9yIGFsbCA1RyBjaGFubmVscyAqLwotCQkJCQljX3NldFtjaF9zaXplXS5TY2FuVHlwZSA9Ci0JCQkJCQlTQ0FOX1BBU1NJVkU7Ci0JCQkJfSBlbHNlCi0JCQkJCWNfc2V0W2NoX3NpemVdLlNjYW5UeXBlID0KLQkJCQkJCVNDQU5fQUNUSVZFOwotCQkJCURCR184NzIzQSgiJXMoKTogY2hhbm5lbF9zZXRbJWRdLkNoYW5uZWxOdW0gPSAiCi0JCQkJCSAgIiVkXG4iLCBfX2Z1bmNfXywgY2hfc2l6ZSwKLQkJCQkJICBjX3NldFtjaF9zaXplXS5DaGFubmVsTnVtKTsKLQkJCQljaF9zaXplKys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gY2hfc2l6ZTsKLX0KLQotaW50IGluaXRfbWxtZV9leHRfcHJpdjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JcG1sbWVleHQtPnBhZGFwdGVyID0gcGFkYXB0ZXI7Ci0KLQlpbml0X21sbWVfZXh0X3ByaXYyM2FfdmFsdWUocGFkYXB0ZXIpOwotCXBtbG1laW5mby0+YkFjY2VwdEFkZGJhUmVxID0gcHJlZ2lzdHJ5cHJpdi0+YkFjY2VwdEFkZGJhUmVxOwotCi0JaW5pdF9tbG1lX2V4dF90aW1lcjIzYShwYWRhcHRlcik7Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlpbml0X21sbWVfYXBfaW5mbzIzYShwYWRhcHRlcik7Ci0jZW5kaWYKLQotCXBtbG1lZXh0LT5tYXhfY2hhbl9udW1zID0gaW5pdF9jaGFubmVsX3NldChwYWRhcHRlciwKLQkJCQkJCSAgIHBtbG1lcHJpdi0+Q2hhbm5lbFBsYW4sCi0JCQkJCQkgICBwbWxtZWV4dC0+Y2hhbm5lbF9zZXQpOwotCWluaXRfY2hhbm5lbF9saXN0KHBhZGFwdGVyLCBwbWxtZWV4dC0+Y2hhbm5lbF9zZXQsCi0JCQkgIHBtbG1lZXh0LT5tYXhfY2hhbl9udW1zLCAmcG1sbWVleHQtPmNoYW5uZWxfbGlzdCk7Ci0KLQlwbWxtZWV4dC0+Y2hhbl9zY2FuX3RpbWUgPSBTVVJWRVlfVE87Ci0JcG1sbWVleHQtPm1sbWVleHRfaW5pdCA9IHRydWU7Ci0KLQlwbWxtZWV4dC0+YWN0aXZlX2tlZXBfYWxpdmVfY2hlY2sgPSB0cnVlOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotdm9pZCBmcmVlX21sbWVfZXh0X3ByaXYyM2EgKHN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gcG1sbWVleHQtPnBhZGFwdGVyOwotCi0JaWYgKCFwYWRhcHRlcikKLQkJcmV0dXJuOwotCi0JaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9PSB0cnVlKSB7Ci0JCWRlbF90aW1lcl9zeW5jKCZwbWxtZWV4dC0+c3VydmV5X3RpbWVyKTsKLQkJZGVsX3RpbWVyX3N5bmMoJnBtbG1lZXh0LT5saW5rX3RpbWVyKTsKLQkJLyogZGVsX3RpbWVyX3N5bmMoJnBtbG1lZXh0LT5BRERCQV90aW1lcik7ICovCi0JfQotfQotCi1zdGF0aWMgdm9pZAotX21ndF9kaXNwYXRjaGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBtbG1lX2hhbmRsZXIgKnB0YWJsZSwKLQkJICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwotCi0JaWYgKHB0YWJsZS0+ZnVuYykgewotCQkvKiByZWNlaXZlIHRoZSBmcmFtZXMgdGhhdCByYShhMSkgaXMgbXkgYWRkcmVzcwotCQkgICBvciByYShhMSkgaXMgYmMgYWRkcmVzcy4gKi8KLQkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKGhkci0+YWRkcjEsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSkmJgotCQkgICAgIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKQotCQkJcmV0dXJuOwotCi0JCXB0YWJsZS0+ZnVuYyhwYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCX0KLX0KLQotdm9pZCBtZ3RfZGlzcGF0Y2hlcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXN0cnVjdCBtbG1lX2hhbmRsZXIgKnB0YWJsZTsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotI2VuZGlmIC8qIENPTkZJR184NzIzQVVfQVBfTU9ERSAqLwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiLT5kYXRhOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQl1MTYgc3R5cGU7Ci0JaW50IGluZGV4OwotCi0JaWYgKCFpZWVlODAyMTFfaXNfbWdtdChtZ210LT5mcmFtZV9jb250cm9sKSkKLQkJcmV0dXJuOwotCi0JLyogcmVjZWl2ZSB0aGUgZnJhbWVzIHRoYXQgcmEoYTEpIGlzIG15IGFkZHJlc3Mgb3IgcmEoYTEpIGlzCi0JICAgYmMgYWRkcmVzcy4gKi8KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobWdtdC0+ZGEsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSkgJiYKLQkgICAgIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1nbXQtPmRhKSkKLQkJcmV0dXJuOwotCi0JcHRhYmxlID0gbWxtZV9zdGFfdGJsOwotCi0Jc3R5cGUgPSBsZTE2X3RvX2NwdShtZ210LT5mcmFtZV9jb250cm9sKSAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFOwotCWluZGV4ID0gc3R5cGUgPj4gNDsKLQotCWlmIChpbmRleCA+IDEzKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkN1cnJlbnRseSB3ZSBkbyBub3Qgc3VwcG9ydCByZXNlcnZlZCBzdWItZnItdHlwZSA9JWRcbiIsCi0JCQkgaW5kZXgpOwotCQlyZXR1cm47Ci0JfQotCXB0YWJsZSArPSBpbmRleDsKLQotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LCBtZ210LT5zYSk7Ci0KLQlpZiAocHN0YSkgewotCQlpZiAoaWVlZTgwMjExX2hhc19yZXRyeShtZ210LT5mcmFtZV9jb250cm9sKSkgewotCQkJaWYgKHByZWN2X2ZyYW1lLT5hdHRyaWIuc2VxX251bSA9PQotCQkJICAgIHBzdGEtPlJ4TWdtdEZyYW1lU2VxTnVtKSB7Ci0JCQkJLyogZHJvcCB0aGUgZHVwbGljYXRlIG1hbmFnZW1lbnQgZnJhbWUgKi8KLQkJCQlEQkdfODcyM0EoIkRyb3AgZHVwbGljYXRlIG1hbmFnZW1lbnQgZnJhbWUgIgotCQkJCQkgICJ3aXRoIHNlcV9udW0gPSAlZC5cbiIsCi0JCQkJCSAgcHJlY3ZfZnJhbWUtPmF0dHJpYi5zZXFfbnVtKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJcHN0YS0+UnhNZ210RnJhbWVTZXFOdW0gPSBwcmVjdl9mcmFtZS0+YXR0cmliLnNlcV9udW07Ci0JfQotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0Jc3dpdGNoIChzdHlwZSkgewotCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FVVEg6Ci0JCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpCi0JCQlwdGFibGUtPmZ1bmMgPSAmT25BdXRoMjNhOwotCQllbHNlCi0JCQlwdGFibGUtPmZ1bmMgPSAmT25BdXRoMjNhQ2xpZW50MjNhOwotCQkvKiBwYXNzIHRocm91Z2ggKi8KLQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVE6Ci0JY2FzZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVE6Ci0JCV9tZ3RfZGlzcGF0Y2hlcjIzYShwYWRhcHRlciwgcHRhYmxlLCBwcmVjdl9mcmFtZSk7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUToKLQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkKLQkJCV9tZ3RfZGlzcGF0Y2hlcjIzYShwYWRhcHRlciwgcHRhYmxlLCBwcmVjdl9mcmFtZSk7Ci0JCWVsc2UKLQkJCV9tZ3RfZGlzcGF0Y2hlcjIzYShwYWRhcHRlciwgcHRhYmxlLCBwcmVjdl9mcmFtZSk7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX1NUWVBFX0JFQUNPTjoKLQkJX21ndF9kaXNwYXRjaGVyMjNhKHBhZGFwdGVyLCBwdGFibGUsIHByZWN2X2ZyYW1lKTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfU1RZUEVfQUNUSU9OOgotCQkvKiBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSAqLwotCQlfbWd0X2Rpc3BhdGNoZXIyM2EocGFkYXB0ZXIsIHB0YWJsZSwgcHJlY3ZfZnJhbWUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlfbWd0X2Rpc3BhdGNoZXIyM2EocGFkYXB0ZXIsIHB0YWJsZSwgcHJlY3ZfZnJhbWUpOwotCQlicmVhazsKLQl9Ci0jZWxzZQotCV9tZ3RfZGlzcGF0Y2hlcjIzYShwYWRhcHRlciwgcHRhYmxlLCBwcmVjdl9mcmFtZSk7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotRm9sbG93aW5nIGFyZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIGZvciBlYWNoIHN1YnR5cGUgb2YgdGhlIG1hbmFnZW1lbnQgZnJhbWVzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50Ci1PblByb2JlUmVxMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQljb25zdCB1OCAqaWU7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXIgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiLT5kYXRhOwotCWludCBsZW4gPSBza2ItPmxlbjsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JaWYgKCFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkgJiYKLQkgICAgIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LAotCQkJICAgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUgfCBXSUZJX0FQX1NUQVRFKSkKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JaWYgKHVubGlrZWx5KCFpZWVlODAyMTFfaXNfcHJvYmVfcmVxKG1nbXQtPmZyYW1lX2NvbnRyb2wpKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZWQgbm9uIHByb2JlIHJlcXVlc3QgZnJhbWVcbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlsZW4gLT0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LnByb2JlX3JlcS52YXJpYWJsZSk7Ci0KLQlpZSA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfU1NJRCwgbWdtdC0+dS5wcm9iZV9yZXEudmFyaWFibGUsIGxlbik7Ci0KLQkvKiBjaGVjayAod2lsZGNhcmQpIFNTSUQgKi8KLQlpZiAoIWllKQotCQlnb3RvIG91dDsKLQotCWlmICgoaWVbMV0gJiYgbWVtY21wKGllICsgMiwgY3VyLT5Tc2lkLnNzaWQsIGN1ci0+U3NpZC5zc2lkX2xlbikpIHx8Ci0JICAgIChpZVsxXSA9PSAwICYmIHBtbG1laW5mby0+aGlkZGVuX3NzaWRfbW9kZSkpIHsKLQkJcmV0dXJuIF9TVUNDRVNTOwotCX0KLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkgJiYKLQkgICAgcG1sbWVwcml2LT5jdXJfbmV0d29yay5qb2luX3JlcykKLQkJaXNzdWVfcHJvYmVyc3AocGFkYXB0ZXIsIG1nbXQtPnNhKTsKLQotb3V0OgotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludAotT25Qcm9iZVJzcDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCWlmIChwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc3RhdGUgPT0gU0NBTl9QUk9DRVNTKSB7Ci0JCXJlcG9ydF9zdXJ2ZXlfZXZlbnQyM2EocGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKLQkJcmV0dXJuIF9TVUNDRVNTOwotCX0KLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludAotT25CZWFjb24yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCWludCBjYW1faWR4OwotCXN0cnVjdCBzdGFfaW5mbwkqcHN0YTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHN0YV9wcml2CSpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKLQlpbnQgcGt0X2xlbiA9IHNrYi0+bGVuOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwYnNzOwotCWludCByZXQgPSBfU1VDQ0VTUzsKLQl1OCAqcCwgKnBpZTsKLQlpbnQgcGllX2xlbjsKLQl1MzIgaWVsZW4gPSAwOwotCi0JcGllID0gbWdtdC0+dS5iZWFjb24udmFyaWFibGU7Ci0JcGllX2xlbiA9IHBrdF9sZW4gLSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKLQlwID0gcnR3X2dldF9pZTIzYShwaWUsIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTLCAmaWVsZW4sIHBpZV9sZW4pOwotCWlmIChwICYmIGllbGVuID4gMCkgewotCQlpZiAocFsxICsgaWVsZW5dID09IDB4MkQgJiYgcFsyICsgaWVsZW5dICE9IDB4MkQpIHsKLQkJCS8qIEludmFsaWQgdmFsdWUgMHgyRCBpcyBkZXRlY3RlZCBpbiBFeHRlbmRlZCBTdXBwb3J0ZWQKLQkJCSAqIFJhdGVzIChFU1IpIElFLiBUcnkgdG8gZml4IHRoZSBJRSBsZW5ndGggdG8gYXZvaWQKLQkJCSAqIGZhaWxlZCBCZWFjb24gcGFyc2luZy4KLQkJCSAqLwotCQkJREJHXzg3MjNBKCJbV0lGSURCR10gRXJyb3IgaW4gRVNSIElFIGlzIGRldGVjdGVkIGluICIKLQkJCQkgICJCZWFjb24gb2YgQlNTSUQ6ICVwTS4gRml4IHRoZSBsZW5ndGggb2YgIgotCQkJCSAgIkVTUiBJRSB0byBhdm9pZCBmYWlsZWQgQmVhY29uIHBhcnNpbmcuXG4iLAotCQkJCSAgbWdtdC0+YnNzaWQpOwotCQkJcFsxXSA9IGllbGVuIC0gMTsKLQkJfQotCX0KLQotCWlmIChwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc3RhdGUgPT0gU0NBTl9QUk9DRVNTKSB7Ci0JCXJlcG9ydF9zdXJ2ZXlfZXZlbnQyM2EocGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKLQkJcmV0dXJuIF9TVUNDRVNTOwotCX0KLQotCWlmICghZXRoZXJfYWRkcl9lcXVhbChtZ210LT5ic3NpZCwKLQkJCSAgICAgIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSkpCi0JCWdvdG8gb3V0OwotCi0JaWYgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FVVEhfTlVMTCkgewotCQkvKiB3ZSBzaG91bGQgdXBkYXRlIGN1cnJlbnQgbmV0d29yayBiZWZvcmUgYXV0aCwKLQkJICAgb3Igc29tZSBJRSBpcyB3cm9uZyAqLwotCQlwYnNzID0gY29sbGVjdF9ic3NfaW5mbyhwYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCQlpZiAocGJzcykgewotCQkJdXBkYXRlX25ldHdvcmsyM2EoJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yaywgcGJzcywKLQkJCQkJICBwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlydHdfZ2V0X2Jjbl9pbmZvMjNhKCZwbWxtZXByaXYtPmN1cl9uZXR3b3JrKTsKLQkJCWtmcmVlKHBic3MpOwotCQl9Ci0KLQkJLyogY2hlY2sgdGhlIHZlbmRvciBvZiB0aGUgYXNzb2MgQVAgKi8KLQkJcG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3IgPQotCQkJY2hlY2tfYXNzb2NfQVAyM2EoKHU4ICopJm1nbXQtPnUuYmVhY29uLCBwa3RfbGVuIC0KLQkJCQkJICBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUpKTsKLQotCQkvKiB1cGRhdGUgVFNGIFZhbHVlICovCi0JCXJ0d191cGRhdGVfVFNGKHBtbG1lZXh0LCBtZ210KTsKLQotCQkvKiBzdGFydCBhdXRoICovCi0JCXN0YXJ0X2NsbnRfYXV0aChwYWRhcHRlcik7Ci0KLQkJcmV0dXJuIF9TVUNDRVNTOwotCX0KLQotCWlmICgoKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfQVApICYmCi0JICAgIChwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BU1NPQ19TVUNDRVNTKSkgewotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBtZ210LT5zYSk7Ci0JCWlmIChwc3RhKSB7Ci0JCQlyZXQgPSBydHdfY2hlY2tfYmNuX2luZm8yM2EocGFkYXB0ZXIsIG1nbXQsIHBrdF9sZW4pOwotCQkJaWYgKHJldCAhPSBfU1VDQ0VTUykgewotCQkJCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJhcCBoYXMgY2hhbmdlZCwgIgotCQkJCQkJImRpc2Nvbm5lY3Qgbm93XG4iKTsKLQkJCQlyZWNlaXZlX2Rpc2Nvbm5lY3QyM2EocGFkYXB0ZXIsIHBtbG1laW5mby0+bmV0d29yay5NYWNBZGRyZXNzLCA2NTUzNSk7Ci0JCQkJcmV0dXJuIF9TVUNDRVNTOwotCQkJfQotCQkJLyogdXBkYXRlIFdNTSwgRVJQIGluIHRoZSBiZWFjb24gKi8KLQkJCS8qIHRvZG86IHRoZSB0aW1lciBpcyB1c2VkIGluc3RlYWQgb2YKLQkJCSAgIHRoZSBudW1iZXIgb2YgdGhlIGJlYWNvbiByZWNlaXZlZCAqLwotCQkJaWYgKChzdGFfcnhfcGt0cyhwc3RhKSAmIDB4ZikgPT0gMCkgewotCQkJCS8qIERCR184NzIzQSgidXBkYXRlX2Jjbl9pbmZvXG4iKTsgKi8KLQkJCQl1cGRhdGVfYmVhY29uMjNhX2luZm8ocGFkYXB0ZXIsIG1nbXQsCi0JCQkJCQkgICAgICBwa3RfbGVuLCBwc3RhKTsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gTVNSX0FESE9DKSB7Ci0JCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIG1nbXQtPnNhKTsKLQkJaWYgKHBzdGEpIHsKLQkJCS8qIHVwZGF0ZSBXTU0sIEVSUCBpbiB0aGUgYmVhY29uICovCi0JCQkvKiB0b2RvOiB0aGUgdGltZXIgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZQotCQkJICAgbnVtYmVyIG9mIHRoZSBiZWFjb24gcmVjZWl2ZWQgKi8KLQkJCWlmICgoc3RhX3J4X3BrdHMocHN0YSkgJiAweGYpID09IDApIHsKLQkJCQkvKiBEQkdfODcyM0EoInVwZGF0ZV9iY25faW5mb1xuIik7ICovCi0JCQkJdXBkYXRlX2JlYWNvbjIzYV9pbmZvKHBhZGFwdGVyLCBtZ210LAotCQkJCQkJICAgICAgcGt0X2xlbiwgcHN0YSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiBhbGxvY2F0ZSBhIG5ldyBDQU0gZW50cnkgZm9yIElCU1Mgc3RhdGlvbiAqLwotCQkJY2FtX2lkeCA9IGFsbG9jYXRlX2Z3X3N0YV9lbnRyeTIzYShwYWRhcHRlcik7Ci0JCQlpZiAoY2FtX2lkeCA9PSBOVU1fU1RBKQotCQkJCWdvdG8gb3V0OwotCi0JCQkvKiBnZXQgc3VwcG9ydGVkIHJhdGUgKi8KLQkJCWlmICh1cGRhdGVfc3RhX3N1cHBvcnRfcmF0ZTIzYShwYWRhcHRlciwgcGllLCBwaWVfbGVuLAotCQkJCQkJICAgICAgIGNhbV9pZHgpID09IF9GQUlMKSB7Ci0JCQkJcG1sbWVpbmZvLT5GV19zdGFfaW5mb1tjYW1faWR4XS5zdGF0dXMgPSAwOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCi0JCQkvKiB1cGRhdGUgVFNGIFZhbHVlICovCi0JCQlydHdfdXBkYXRlX1RTRihwbWxtZWV4dCwgbWdtdCk7Ci0KLQkJCS8qIHJlcG9ydCBzdGEgYWRkIGV2ZW50ICovCi0JCQlyZXBvcnRfYWRkX3N0YV9ldmVudDIzYShwYWRhcHRlciwgbWdtdC0+c2EsCi0JCQkJCQljYW1faWR4KTsKLQkJfQotCX0KLQotb3V0OgotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi1zdGF0aWMgaW50Ci1PbkF1dGgyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXN0YXRpYyBzdHJ1Y3Qgc3RhX2luZm8gc3RhdDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGF0ID0gTlVMTDsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKLQl1OCAqcGZyYW1lOwotCWNvbnN0IHU4ICpwOwotCXVuc2lnbmVkIGNoYXIgKnNhOwotCXUxNiBhdXRoX21vZGUsIHNlcSwgYWxnb3JpdGhtOwotCWludCBzdGF0dXMsIGxlbiA9IHNrYi0+bGVuOwotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgIT0gTVNSX0FQKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlEQkdfODcyM0EoIitPbkF1dGgyM2FcbiIpOwotCi0Jc2EgPSBtZ210LT5zYTsKLQotCWF1dGhfbW9kZSA9IHBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG07Ci0KLQlwZnJhbWUgPSBtZ210LT51LmF1dGgudmFyaWFibGU7Ci0JbGVuID0gc2tiLT5sZW4gLSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYXV0aC52YXJpYWJsZSk7Ci0KLQlzZXEgPSBsZTE2X3RvX2NwdShtZ210LT51LmF1dGguYXV0aF90cmFuc2FjdGlvbik7Ci0JYWxnb3JpdGhtID0gbGUxNl90b19jcHUobWdtdC0+dS5hdXRoLmF1dGhfYWxnKTsKLQotCURCR184NzIzQSgiYXV0aCBhbGcgPSV4LCBzZXEgPSVYXG4iLCBhbGdvcml0aG0sIHNlcSk7Ci0KLQlpZiAoYXV0aF9tb2RlID09IDIgJiYKLQkgICAgcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSAhPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCAmJgotCSAgICBwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtICE9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkKLQkJYXV0aF9tb2RlID0gMDsKLQotCS8qICByeCBhIHNoYXJlZC1rZXkgYXV0aCBidXQgc2hhcmVkIG5vdCBlbmFibGVkLCBvciAqLwotCS8qICByeCBhIG9wZW4tc3lzdGVtIGF1dGggYnV0IHNoYXJlZC1rZXkgaXMgZW5hYmxlZCAqLwotCWlmICgoYWxnb3JpdGhtICE9IFdMQU5fQVVUSF9PUEVOICYmIGF1dGhfbW9kZSA9PSAwKSB8fAotCSAgICAoYWxnb3JpdGhtID09IFdMQU5fQVVUSF9PUEVOICYmIGF1dGhfbW9kZSA9PSAxKSkgewotCQlEQkdfODcyM0EoImF1dGggcmVqZWN0ZWQgZHVlIHRvIGJhZCBhbGcgW2FsZyA9JWQsIGF1dGhfbWliICIKLQkJCSAgIj0lZF0gJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYXG4iLAotCQkJICBhbGdvcml0aG0sIGF1dGhfbW9kZSwKLQkJCSAgc2FbMF0sIHNhWzFdLCBzYVsyXSwgc2FbM10sIHNhWzRdLCBzYVs1XSk7Ci0KLQkJc3RhdHVzID0gV0xBTl9TVEFUVVNfTk9UX1NVUFBPUlRFRF9BVVRIX0FMRzsKLQotCQlnb3RvIGF1dGhfZmFpbDsKLQl9Ci0KLQlpZiAocnR3X2FjY2Vzc19jdHJsMjNhKHBhZGFwdGVyLCBzYSkgPT0gZmFsc2UpIHsKLQkJc3RhdHVzID0gV0xBTl9TVEFUVVNfQVBfVU5BQkxFX1RPX0hBTkRMRV9ORVdfU1RBOwotCQlnb3RvIGF1dGhfZmFpbDsKLQl9Ci0KLQlwc3RhdCA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgc2EpOwotCWlmICghcHN0YXQpIHsKLQkJLyogIGFsbG9jYXRlIGEgbmV3IG9uZSAqLwotCQlEQkdfODcyM0EoImdvaW5nIHRvIGFsbG9jIHN0YWluZm8gZm9yIHNhID0lcE1cbiIsIHNhKTsKLQkJcHN0YXQgPSBydHdfYWxsb2Nfc3RhaW5mbzIzYShwc3RhcHJpdiwgc2EsIEdGUF9BVE9NSUMpOwotCQlpZiAoIXBzdGF0KSB7Ci0JCQlEQkdfODcyM0EoIiBFeGNlZWQgdGhlIHVwcGVyIGxpbWl0IG9mIHN1cHBvcnRlZCAiCi0JCQkJICAiY2xpZW50cy4uLlxuIik7Ci0JCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19BUF9VTkFCTEVfVE9fSEFORExFX05FV19TVEE7Ci0JCQlnb3RvIGF1dGhfZmFpbDsKLQkJfQotCi0JCXBzdGF0LT5zdGF0ZSA9IFdJRklfRldfQVVUSF9OVUxMOwotCQlwc3RhdC0+YXV0aF9zZXEgPSAwOwotCi0JCS8qIHBzdGF0LT5mbGFncyA9IDA7ICovCi0JCS8qIHBzdGF0LT5jYXBhYmlsaXR5ID0gMDsgKi8KLQl9IGVsc2UgewotCQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0JCWlmICghbGlzdF9lbXB0eSgmcHN0YXQtPmFzb2NfbGlzdCkpIHsKLQkJCWxpc3RfZGVsX2luaXQoJnBzdGF0LT5hc29jX2xpc3QpOwotCQkJcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQtLTsKLQkJCWlmIChwc3RhdC0+ZXhwaXJlX3RvID4gMCkgewotCQkJCS8qIFRPRE86IFNUQSByZV9hdXRoIHdpdGhpbiBleHBpcmVfdG8gKi8KLQkJCX0KLQkJfQotCQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQotCQlpZiAoc2VxID09IDEpIHsKLQkJCS8qIFRPRE86IFNUQSByZV9hdXRoIGFuZCBhdXRoIHRpbWVvdXQgKi8KLQkJfQotCX0KLQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmF1dGhfbGlzdF9sb2NrKTsKLQlpZiAobGlzdF9lbXB0eSgmcHN0YXQtPmF1dGhfbGlzdCkpIHsKLQkJbGlzdF9hZGRfdGFpbCgmcHN0YXQtPmF1dGhfbGlzdCwgJnBzdGFwcml2LT5hdXRoX2xpc3QpOwotCQlwc3RhcHJpdi0+YXV0aF9saXN0X2NudCsrOwotCX0KLQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPmF1dGhfbGlzdF9sb2NrKTsKLQotCWlmIChwc3RhdC0+YXV0aF9zZXEgPT0gMCkKLQkJcHN0YXQtPmV4cGlyZV90byA9IHBzdGFwcml2LT5hdXRoX3RvOwotCi0JaWYgKChwc3RhdC0+YXV0aF9zZXEgKyAxKSAhPSBzZXEpIHsKLQkJREJHXzg3MjNBKCIoMSlhdXRoIHJlamVjdGVkIGJlY2F1c2Ugb3V0IG9mIHNlcSBbcnhfc2VxID0lZCwgIgotCQkJICAiZXhwX3NlcSA9JWRdIVxuIiwgc2VxLCBwc3RhdC0+YXV0aF9zZXErMSk7Ci0JCXN0YXR1cyA9IFdMQU5fU1RBVFVTX1VOS05PV05fQVVUSF9UUkFOU0FDVElPTjsKLQkJZ290byBhdXRoX2ZhaWw7Ci0JfQotCi0JaWYgKGFsZ29yaXRobSA9PSBXTEFOX0FVVEhfT1BFTiAmJiAoYXV0aF9tb2RlID09IDAgfHwgYXV0aF9tb2RlID09IDIpKSB7Ci0JCWlmIChzZXEgPT0gMSkgewotCQkJcHN0YXQtPnN0YXRlICY9IH5XSUZJX0ZXX0FVVEhfTlVMTDsKLQkJCXBzdGF0LT5zdGF0ZSB8PSBXSUZJX0ZXX0FVVEhfU1VDQ0VTUzsKLQkJCXBzdGF0LT5leHBpcmVfdG8gPSBwc3RhcHJpdi0+YXNzb2NfdG87Ci0JCQlwc3RhdC0+YXV0aGFsZyA9IGFsZ29yaXRobTsKLQkJfSBlbHNlIHsKLQkJCURCR184NzIzQSgiKDIpYXV0aCByZWplY3RlZCBiZWNhdXNlIG91dCBvZiBzZXEgIgotCQkJCSAgIltyeF9zZXEgPSVkLCBleHBfc2VxID0lZF0hXG4iLAotCQkJCSAgc2VxLCBwc3RhdC0+YXV0aF9zZXErMSk7Ci0JCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19VTktOT1dOX0FVVEhfVFJBTlNBQ1RJT047Ci0JCQlnb3RvIGF1dGhfZmFpbDsKLQkJfQotCX0gZWxzZSB7IC8qICBzaGFyZWQgc3lzdGVtIG9yIGF1dG8gYXV0aGVudGljYXRpb24gKi8KLQkJaWYgKHNlcSA9PSAxKSB7Ci0JCQkvKiBwcmVwYXJlIGZvciB0aGUgY2hhbGxlbmdpbmcgdHh0Li4uICovCi0JCQlwc3RhdC0+c3RhdGUgJj0gfldJRklfRldfQVVUSF9OVUxMOwotCQkJcHN0YXQtPnN0YXRlIHw9IFdJRklfRldfQVVUSF9TVEFURTsKLQkJCXBzdGF0LT5hdXRoYWxnID0gYWxnb3JpdGhtOwotCQkJcHN0YXQtPmF1dGhfc2VxID0gMjsKLQkJfSBlbHNlIGlmIChzZXEgPT0gMykgewotCQkJLyogY2hlY2tpbmcgZm9yIGNoYWxsZW5naW5nIHR4dC4uLiAqLwotCQkJREJHXzg3MjNBKCJjaGVja2luZyBmb3IgY2hhbGxlbmdpbmcgdHh0Li4uXG4iKTsKLQotCQkJcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfQ0hBTExFTkdFLCBwZnJhbWUsIGxlbik7Ci0JCQlpZiAoIXAgfHwgcFsxXSA8PSAwKSB7Ci0JCQkJREJHXzg3MjNBKCJhdXRoIHJlamVjdGVkIGJlY2F1c2UgY2hhbGxlbmdlICIKLQkJCQkJICAiZmFpbHVyZSEoMSlcbiIpOwotCQkJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX0NIQUxMRU5HRV9GQUlMOwotCQkJCWdvdG8gYXV0aF9mYWlsOwotCQkJfQotCi0JCQlpZiAoIW1lbWNtcChwICsgMiwgcHN0YXQtPmNoZ190eHQsIDEyOCkpIHsKLQkJCQlwc3RhdC0+c3RhdGUgJj0gfldJRklfRldfQVVUSF9TVEFURTsKLQkJCQlwc3RhdC0+c3RhdGUgfD0gV0lGSV9GV19BVVRIX1NVQ0NFU1M7Ci0JCQkJLyogIGNoYWxsZW5naW5nIHR4dCBpcyBjb3JyZWN0Li4uICovCi0JCQkJcHN0YXQtPmV4cGlyZV90byA9ICBwc3RhcHJpdi0+YXNzb2NfdG87Ci0JCQl9IGVsc2UgewotCQkJCURCR184NzIzQSgiYXV0aCByZWplY3RlZCBiZWNhdXNlIGNoYWxsZW5nZSAiCi0JCQkJCSAgImZhaWx1cmUhXG4iKTsKLQkJCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19DSEFMTEVOR0VfRkFJTDsKLQkJCQlnb3RvIGF1dGhfZmFpbDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCURCR184NzIzQSgiKDMpYXV0aCByZWplY3RlZCBiZWNhdXNlIG91dCBvZiBzZXEgIgotCQkJCSAgIltyeF9zZXEgPSVkLCBleHBfc2VxID0lZF0hXG4iLAotCQkJCSAgc2VxLCBwc3RhdC0+YXV0aF9zZXErMSk7Ci0JCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19VTktOT1dOX0FVVEhfVFJBTlNBQ1RJT047Ci0JCQlnb3RvIGF1dGhfZmFpbDsKLQkJfQotCX0KLQotCS8qICBOb3csIHdlIGFyZSBnb2luZyB0byBpc3N1ZV9hdXRoLi4uICovCi0JcHN0YXQtPmF1dGhfc2VxID0gc2VxICsgMTsKLQotCWlzc3VlX2F1dGgocGFkYXB0ZXIsIHBzdGF0LCBXTEFOX1NUQVRVU19TVUNDRVNTKTsKLQotCWlmIChwc3RhdC0+c3RhdGUgJiBXSUZJX0ZXX0FVVEhfU1VDQ0VTUykKLQkJcHN0YXQtPmF1dGhfc2VxID0gMDsKLQotCXJldHVybiBfU1VDQ0VTUzsKLQotYXV0aF9mYWlsOgotCi0JaWYgKHBzdGF0KQotCQlydHdfZnJlZV9zdGFpbmZvMjNhKHBhZGFwdGVyLCBwc3RhdCk7Ci0KLQlwc3RhdCA9ICZzdGF0OwotCW1lbXNldCgoY2hhciAqKXBzdGF0LCAnXDAnLCBzaXplb2Yoc3RhdCkpOwotCXBzdGF0LT5hdXRoX3NlcSA9IDI7Ci0JZXRoZXJfYWRkcl9jb3B5KHBzdGF0LT5od2FkZHIsIHNhKTsKLQotCWlzc3VlX2F1dGgocGFkYXB0ZXIsIHBzdGF0LCAodW5zaWduZWQgc2hvcnQpc3RhdHVzKTsKLQotCXJldHVybiBfRkFJTDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1PbkF1dGgyM2FDbGllbnQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXVuc2lnbmVkIGludCBzZXEsIHN0YXR1cywgYWxndGhtOwotCXVuc2lnbmVkIGludCBnbzJhc29jID0gMDsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiLT5kYXRhOwotCWNvbnN0IHU4ICpwOwotCXU4ICpwaWU7Ci0JaW50IHBsZW4gPSBza2ItPmxlbjsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCS8qIGNoZWNrIEExIG1hdGNoZXMgb3Igbm90ICovCi0JaWYgKCFldGhlcl9hZGRyX2VxdWFsKG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgbWdtdC0+ZGEpKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQlpZiAoIShwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BVVRIX1NUQVRFKSkKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JcGllID0gbWdtdC0+dS5hdXRoLnZhcmlhYmxlOwotCXBsZW4gLT0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmF1dGgudmFyaWFibGUpOwotCi0JYWxndGhtID0gbGUxNl90b19jcHUobWdtdC0+dS5hdXRoLmF1dGhfYWxnKTsKLQlzZXEgPSBsZTE2X3RvX2NwdShtZ210LT51LmF1dGguYXV0aF90cmFuc2FjdGlvbik7Ci0Jc3RhdHVzID0gbGUxNl90b19jcHUobWdtdC0+dS5hdXRoLnN0YXR1c19jb2RlKTsKLQotCWlmIChzdGF0dXMpIHsKLQkJREJHXzg3MjNBKCJjbG50IGF1dGggZmFpbCwgc3RhdHVzOiAlZFxuIiwgc3RhdHVzKTsKLQkJLyogIHBtbG1laW5mby0+YXV0aF9hbGdvID09IGRvdDExQXV0aEFsZ3J0aG1fQXV0bykgKi8KLQkJaWYgKHN0YXR1cyA9PSBXTEFOX1NUQVRVU19OT1RfU1VQUE9SVEVEX0FVVEhfQUxHKSB7Ci0JCQlpZiAocG1sbWVpbmZvLT5hdXRoX2FsZ28gPT0gZG90MTFBdXRoQWxncnRobV9TaGFyZWQpCi0JCQkJcG1sbWVpbmZvLT5hdXRoX2FsZ28gPSBkb3QxMUF1dGhBbGdydGhtX09wZW47Ci0JCQllbHNlCi0JCQkJcG1sbWVpbmZvLT5hdXRoX2FsZ28gPSBkb3QxMUF1dGhBbGdydGhtX1NoYXJlZDsKLQkJCS8qIHBtbG1laW5mby0+cmVhdXRoX2NvdW50ID0gMDsgKi8KLQkJfQotCi0JCXNldF9saW5rX3RpbWVyKHBtbG1lZXh0LCAxKTsKLQkJZ290byBhdXRoY2xudF9mYWlsOwotCX0KLQotCWlmIChzZXEgPT0gMikgewotCQlpZiAocG1sbWVpbmZvLT5hdXRoX2FsZ28gPT0gZG90MTFBdXRoQWxncnRobV9TaGFyZWQpIHsKLQkJCS8qICBsZWdlbmRhcnkgc2hhcmVkIHN5c3RlbSAqLwotCQkJcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfQ0hBTExFTkdFLCBwaWUsIHBsZW4pOwotCi0JCQlpZiAoIXApIHsKLQkJCQkvKiBEQkdfODcyM0EoIm1hcmM6IG5vIGNoYWxsZW5nZSB0ZXh0P1xuIik7ICovCi0JCQkJZ290byBhdXRoY2xudF9mYWlsOwotCQkJfQotCi0JCQltZW1jcHkoKHZvaWQgKikocG1sbWVpbmZvLT5jaGdfdHh0KSwgcCArIDIsIHBbMV0pOwotCQkJcG1sbWVpbmZvLT5hdXRoX3NlcSA9IDM7Ci0JCQlpc3N1ZV9hdXRoKHBhZGFwdGVyLCBOVUxMLCAwKTsKLQkJCXNldF9saW5rX3RpbWVyKHBtbG1lZXh0LCBSRUFVVEhfVE8pOwotCi0JCQlyZXR1cm4gX1NVQ0NFU1M7Ci0JCX0gZWxzZSB7Ci0JCQkvKiAgb3BlbiBzeXN0ZW0gKi8KLQkJCWdvMmFzb2MgPSAxOwotCQl9Ci0JfSBlbHNlIGlmIChzZXEgPT0gNCkgewotCQlpZiAocG1sbWVpbmZvLT5hdXRoX2FsZ28gPT0gZG90MTFBdXRoQWxncnRobV9TaGFyZWQpCi0JCQlnbzJhc29jID0gMTsKLQkJZWxzZQotCQkJZ290byBhdXRoY2xudF9mYWlsOwotCX0gZWxzZSB7Ci0JCS8qICB0aGlzIGlzIGFsc28gaWxsZWdhbCAqLwotCQkvKiBEQkdfODcyM0EoIm1hcmM6IGNsbnQgYXV0aCBmYWlsZWQgZHVlIHRvIGlsbGVnYWwgc2VxID0leFxuIiwKLQkJICAgc2VxKTsgKi8KLQkJZ290byBhdXRoY2xudF9mYWlsOwotCX0KLQotCWlmIChnbzJhc29jKSB7Ci0JCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJhdXRoIHN1Y2Nlc3MsIHN0YXJ0IGFzc29jXG4iKTsKLQkJc3RhcnRfY2xudF9hc3NvYyhwYWRhcHRlcik7Ci0JCXJldHVybiBfU1VDQ0VTUzsKLQl9Ci0KLWF1dGhjbG50X2ZhaWw6Ci0KLQkvKiBwbWxtZWluZm8tPnN0YXRlICY9IH4oV0lGSV9GV19BVVRIX1NUQVRFKTsgKi8KLQotCXJldHVybiBfRkFJTDsKLX0KLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotc3RhdGljIGludCBydHdfdmFsaWRhdGVfdmVuZG9yX3NwZWNpZmljX2llcyhjb25zdCB1OCAqcG9zLCBpbnQgZWxlbikKLXsKLQl1bnNpZ25lZCBpbnQgb3VpOwotCi0JLyogZmlyc3QgMyBieXRlcyBpbiB2ZW5kb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gZWxlbWVudCBhcmUgdGhlIElFRUUKLQkgKiBPVUkgb2YgdGhlIHZlbmRvci4gVGhlIGZvbGxvd2luZyBieXRlIGlzIHVzZWQgYSB2ZW5kb3Igc3BlY2lmaWMKLQkgKiBzdWItdHlwZS4gKi8KLQlpZiAoZWxlbiA8IDQpIHsKLQkJREJHXzg3MjNBKCJzaG9ydCB2ZW5kb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gZWxlbWVudCAiCi0JCQkgICJpZ25vcmVkIChsZW4gPSVpKVxuIiwgZWxlbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW91aSA9IFJUV19HRVRfQkUyNChwb3MpOwotCXN3aXRjaCAob3VpKSB7Ci0JY2FzZSBXTEFOX09VSV9NSUNST1NPRlQ6Ci0JCS8qIE1pY3Jvc29mdC9XaS1GaSBpbmZvcm1hdGlvbiBlbGVtZW50cyBhcmUgZnVydGhlciB0eXBlZCBhbmQKLQkJICogc3VidHlwZWQgKi8KLQkJc3dpdGNoIChwb3NbM10pIHsKLQkJY2FzZSBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XUEE6Ci0JCQkvKiBNaWNyb3NvZnQgT1VJICgwMDo1MDpGMikgd2l0aCBPVUkgVHlwZSAxOgotCQkJICogcmVhbCBXUEEgaW5mb3JtYXRpb24gZWxlbWVudCAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV01NOgotCQkJaWYgKGVsZW4gPCA1KSB7Ci0JCQkJREJHXzg3MjNBKCJzaG9ydCBXTUUgaW5mb3JtYXRpb24gZWxlbWVudCAiCi0JCQkJCSAgImlnbm9yZWQgKGxlbiA9JWkpXG4iLCBlbGVuKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCXN3aXRjaCAocG9zWzRdKSB7Ci0JCQljYXNlIFdNRV9PVUlfU1VCVFlQRV9JTkZPUk1BVElPTl9FTEVNRU5UOgotCQkJY2FzZSBXTUVfT1VJX1NVQlRZUEVfUEFSQU1FVEVSX0VMRU1FTlQ6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdNRV9PVUlfU1VCVFlQRV9UU1BFQ19FTEVNRU5UOgotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlEQkdfODcyM0EoInVua25vd24gV01FIGluZm9ybWF0aW9uIGVsZW1lbnQgIgotCQkJCQkgICJpZ25vcmVkIChzdWJ0eXBlID0lZCBsZW4gPSVpKVxuIiwKLQkJCQkJICAgcG9zWzRdLCBlbGVuKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQUzoKLQkJCS8qIFdpLUZpIFByb3RlY3RlZCBTZXR1cCAoV1BTKSBJRSAqLwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlEQkdfODcyM0EoIlVua25vd24gTWljcm9zb2Z0IGluZm9ybWF0aW9uIGVsZW1lbnQgIgotCQkJCSAgImlnbm9yZWQgKHR5cGUgPSVkIGxlbiA9JWkpXG4iLAotCQkJCSAgcG9zWzNdLCBlbGVuKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBPVUlfQlJPQURDT006Ci0JCXN3aXRjaCAocG9zWzNdKSB7Ci0JCWNhc2UgVkVORE9SX0hUX0NBUEFCX09VSV9UWVBFOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlEQkdfODcyM0EoIlVua25vd24gQnJvYWRjb20gaW5mb3JtYXRpb24gZWxlbWVudCAiCi0JCQkJICAiaWdub3JlZCAodHlwZSA9JWQgbGVuID0laSlcbiIsIHBvc1szXSwgZWxlbik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCURCR184NzIzQSgidW5rbm93biB2ZW5kb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gZWxlbWVudCAiCi0JCQkgICJpZ25vcmVkICh2ZW5kb3IgT1VJICUwMng6JTAyeDolMDJ4IGxlbiA9JWkpXG4iLAotCQkJICAgcG9zWzBdLCBwb3NbMV0sIHBvc1syXSwgZWxlbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJ0d192YWxpZGF0ZV9mcmFtZV9pZXMoY29uc3QgdTggKnN0YXJ0LCB1aW50IGxlbikKLXsKLQljb25zdCB1OCAqcG9zID0gc3RhcnQ7Ci0JaW50IGxlZnQgPSBsZW47Ci0JaW50IHVua25vd24gPSAwOwotCi0Jd2hpbGUgKGxlZnQgPj0gMikgewotCQl1OCBpZCwgZWxlbjsKLQotCQlpZCA9ICpwb3MrKzsKLQkJZWxlbiA9ICpwb3MrKzsKLQkJbGVmdCAtPSAyOwotCi0JCWlmIChlbGVuID4gbGVmdCkgewotCQkJREJHXzg3MjNBKCIlczogSUVFRSA4MDIuMTEgZmFpbGVkIChpZCA9JWQgZWxlbiA9JWQgIgotCQkJCSAgImxlZnQgPSVpKVxuIiwgX19mdW5jX18sIGlkLCBlbGVuLCBsZWZ0KTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJc3dpdGNoIChpZCkgewotCQljYXNlIFdMQU5fRUlEX1NTSUQ6Ci0JCWNhc2UgV0xBTl9FSURfU1VQUF9SQVRFUzoKLQkJY2FzZSBXTEFOX0VJRF9GSF9QQVJBTVM6Ci0JCWNhc2UgV0xBTl9FSURfRFNfUEFSQU1TOgotCQljYXNlIFdMQU5fRUlEX0NGX1BBUkFNUzoKLQkJY2FzZSBXTEFOX0VJRF9USU06Ci0JCWNhc2UgV0xBTl9FSURfSUJTU19QQVJBTVM6Ci0JCWNhc2UgV0xBTl9FSURfQ0hBTExFTkdFOgotCQljYXNlIFdMQU5fRUlEX0VSUF9JTkZPOgotCQljYXNlIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTOgotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDOgotCQkJaWYgKHJ0d192YWxpZGF0ZV92ZW5kb3Jfc3BlY2lmaWNfaWVzKHBvcywgZWxlbikpCi0JCQkJdW5rbm93bisrOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfUlNOOgotCQljYXNlIFdMQU5fRUlEX1BXUl9DQVBBQklMSVRZOgotCQljYXNlIFdMQU5fRUlEX1NVUFBPUlRFRF9DSEFOTkVMUzoKLQkJY2FzZSBXTEFOX0VJRF9NT0JJTElUWV9ET01BSU46Ci0JCWNhc2UgV0xBTl9FSURfRkFTVF9CU1NfVFJBTlNJVElPTjoKLQkJY2FzZSBXTEFOX0VJRF9USU1FT1VUX0lOVEVSVkFMOgotCQljYXNlIFdMQU5fRUlEX0hUX0NBUEFCSUxJVFk6Ci0JCWNhc2UgV0xBTl9FSURfSFRfT1BFUkFUSU9OOgotCQlkZWZhdWx0OgotCQkJdW5rbm93bisrOwotCQkJREJHXzg3MjNBKCIlcyBJRUVFIDgwMi4xMSBpZ25vcmVkIHVua25vd24gZWxlbWVudCAiCi0JCQkJICAiKGlkID0lZCBlbGVuID0lZClcbiIsIF9fZnVuY19fLCBpZCwgZWxlbik7Ci0JCQlicmVhazsKLQkJfQotCi0JCWxlZnQgLT0gZWxlbjsKLQkJcG9zICs9IGVsZW47Ci0JfQotCi0JaWYgKGxlZnQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludAotT25Bc3NvY1JlcTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JdTE2IGNhcGFiX2luZm8sIGxpc3Rlbl9pbnRlcnZhbDsKLQlzdHJ1Y3Qgc3RhX2luZm8JKnBzdGF0OwotCXVuc2lnbmVkIGNoYXIgcmVhc3NvYzsKLQlpbnQgaSwgd3BhX2llX2xlbiwgbGVmdDsKLQl1bnNpZ25lZCBjaGFyIHN1cHBvcnRSYXRlWzE2XTsKLQlpbnQgc3VwcG9ydFJhdGVOdW07Ci0JdW5zaWduZWQgc2hvcnQgc3RhdHVzID0gV0xBTl9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyID0gJnBtbG1laW5mby0+bmV0d29yazsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiLT5kYXRhOwotCWNvbnN0IHU4ICpwb3MsICpwLCAqd3BhX2llLCAqd3BzX2llOwotCXU4ICpwZnJhbWUgPSBza2ItPmRhdGE7Ci0JdWludCBwa3RfbGVuID0gc2tiLT5sZW47Ci0JaW50IHI7Ci0KLQlpZiAoKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSAhPSBNU1JfQVApCi0JCXJldHVybiBfRkFJTDsKLQotCWxlZnQgPSBwa3RfbGVuIC0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlpZiAoaWVlZTgwMjExX2lzX2Fzc29jX3JlcShtZ210LT5mcmFtZV9jb250cm9sKSkgewotCQlyZWFzc29jID0gMDsKLQkJcG9zID0gbWdtdC0+dS5hc3NvY19yZXEudmFyaWFibGU7Ci0JCWxlZnQgLT0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmFzc29jX3JlcS52YXJpYWJsZSk7Ci0JfSBlbHNlIHsgLyogIFdJRklfUkVBU1NPQ1JFUSAqLwotCQlyZWFzc29jID0gMTsKLQkJcG9zID0gbWdtdC0+dS5yZWFzc29jX3JlcS52YXJpYWJsZTsKLQkJbGVmdCAtPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUucmVhc3NvY19yZXEudmFyaWFibGUpOwotCX0KLQotCWlmIChsZWZ0IDwgMCkgewotCQlEQkdfODcyM0EoImhhbmRsZV9hc3NvYyhyZWFzc29jID0lZCkgLSB0b28gc2hvcnQgcGF5bG9hZCAiCi0JCQkgICIobGVuID0lbHUpXG4iLCByZWFzc29jLCAodW5zaWduZWQgbG9uZylwa3RfbGVuKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCXBzdGF0ID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBtZ210LT5zYSk7Ci0JaWYgKCFwc3RhdCkgewotCQlzdGF0dXMgPSBXTEFOX1JFQVNPTl9DTEFTUzJfRlJBTUVfRlJPTV9OT05BVVRIX1NUQTsKLQkJZ290byBhc29jX2NsYXNzMl9lcnJvcjsKLQl9Ci0KLQkvKiBUaGVzZSB0d28gYXJlIGxvY2F0ZWQgYXQgdGhlIHNhbWUgb2Zmc2V0cyB3aGV0aGVyIGl0J3MgYW4KLQkgKiBhc3NvY19yZXEgb3IgYSByZWFzc29jX3JlcSAqLwotCWNhcGFiX2luZm8gPSBnZXRfdW5hbGlnbmVkX2xlMTYoJm1nbXQtPnUuYXNzb2NfcmVxLmNhcGFiX2luZm8pOwotCWxpc3Rlbl9pbnRlcnZhbCA9Ci0JCWdldF91bmFsaWduZWRfbGUxNigmbWdtdC0+dS5hc3NvY19yZXEubGlzdGVuX2ludGVydmFsKTsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCS8qICBjaGVjayBpZiB0aGlzIHN0YXQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQvYXNzb2NhdGVkICovCi0JaWYgKCEocHN0YXQtPnN0YXRlICYgV0lGSV9GV19BVVRIX1NVQ0NFU1MpKSB7Ci0JCWlmICghKHBzdGF0LT5zdGF0ZSAmIFdJRklfRldfQVNTT0NfU1VDQ0VTUykpIHsKLQkJCXN0YXR1cyA9IFdMQU5fUkVBU09OX0NMQVNTMl9GUkFNRV9GUk9NX05PTkFVVEhfU1RBOwotCQkJZ290byBhc29jX2NsYXNzMl9lcnJvcjsKLQkJfSBlbHNlIHsKLQkJCXBzdGF0LT5zdGF0ZSAmPSAofldJRklfRldfQVNTT0NfU1VDQ0VTUyk7Ci0JCQlwc3RhdC0+c3RhdGUgfD0gV0lGSV9GV19BU1NPQ19TVEFURTsKLQkJfQotCX0gZWxzZSB7Ci0JCXBzdGF0LT5zdGF0ZSAmPSAofldJRklfRldfQVVUSF9TVUNDRVNTKTsKLQkJcHN0YXQtPnN0YXRlIHw9IFdJRklfRldfQVNTT0NfU1RBVEU7Ci0JfQotCi0JcHN0YXQtPmNhcGFiaWxpdHkgPSBjYXBhYl9pbmZvOwotCi0JLyogbm93IHBhcnNlIGFsbCBpZWVlODAyXzExIGllIHRvIHBvaW50IHRvIGVsZW1zICovCi0KLQlpZiAocnR3X3ZhbGlkYXRlX2ZyYW1lX2llcyhwb3MsIGxlZnQpKSB7Ci0JCURCR184NzIzQSgiU1RBICVwTSBzZW50IGludmFsaWQgYXNzb2NpYXRpb24gcmVxdWVzdFxuIiwKLQkJCSAgcHN0YXQtPmh3YWRkcik7Ci0JCXN0YXR1cyA9IFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7Ci0JCWdvdG8gT25Bc3NvY1JlcTIzYUZhaWw7Ci0JfQotCi0JLyogIG5vdyB3ZSBzaG91bGQgY2hlY2sgYWxsIHRoZSBmaWVsZHMuLi4gKi8KLQkvKiAgY2hlY2tpbmcgU1NJRCAqLwotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX1NTSUQsIHBvcywgbGVmdCk7Ci0JaWYgKCFwIHx8IHBbMV0gPT0gMCkgewotCQkvKiAgYnJvYWRjYXN0IHNzaWQsIGhvd2V2ZXIgaXQgaXMgbm90IGFsbG93ZWQgaW4gYXNzb2NyZXEgKi8KLQkJREJHXzg3MjNBKCJTVEEgJXBNIHNlbnQgaW52YWxpZCBhc3NvY2lhdGlvbiByZXF1ZXN0IGxhY2tpbmcgYW4gU1NJRFxuIiwKLQkJCSAgcHN0YXQtPmh3YWRkcik7Ci0JCXN0YXR1cyA9IFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7Ci0JCWdvdG8gT25Bc3NvY1JlcTIzYUZhaWw7Ci0JfSBlbHNlIHsKLQkJLyogIGNoZWNrIGlmIHNzaWQgbWF0Y2ggKi8KLQkJaWYgKG1lbWNtcChwICsgMiwgY3VyLT5Tc2lkLnNzaWQsIGN1ci0+U3NpZC5zc2lkX2xlbikpCi0JCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOwotCi0JCWlmIChwWzFdICE9IGN1ci0+U3NpZC5zc2lkX2xlbikKLQkJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7Ci0JfQotCi0JaWYgKHN0YXR1cyAhPSBXTEFOX1NUQVRVU19TVUNDRVNTKQotCQlnb3RvIE9uQXNzb2NSZXEyM2FGYWlsOwotCi0JLyogIGNoZWNrIGlmIHRoZSBzdXBwb3J0ZWQgcmF0ZSBpcyBvayAqLwotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX1NVUFBfUkFURVMsIHBvcywgbGVmdCk7Ci0JaWYgKCFwKSB7Ci0JCURCR184NzIzQSgiUnggYSBzdGEgYXNzb2MtcmVxIHdoaWNoIHN1cHBvcnRlZCByYXRlIGlzICIKLQkJCSAgImVtcHR5IVxuIik7Ci0JCS8qICB1c2Ugb3VyIG93biByYXRlIHNldCBhcyBzdGF0b2luIHVzZWQgKi8KLQkJLyogbWVtY3B5KHN1cHBvcnRSYXRlLCBBUF9CU1NSQVRFLCBBUF9CU1NSQVRFX0xFTik7ICovCi0JCS8qIHN1cHBvcnRSYXRlTnVtID0gQVBfQlNTUkFURV9MRU47ICovCi0KLQkJc3RhdHVzID0gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKLQkJZ290byBPbkFzc29jUmVxMjNhRmFpbDsKLQl9IGVsc2UgewotCQltZW1jcHkoc3VwcG9ydFJhdGUsIHAgKyAyLCBwWzFdKTsKLQkJc3VwcG9ydFJhdGVOdW0gPSBwWzFdOwotCi0JCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTLCBwb3MsIGxlZnQpOwotCQlpZiAocCkgewotCQkJaWYgKHN1cHBvcnRSYXRlTnVtIDw9IHNpemVvZihzdXBwb3J0UmF0ZSkpIHsKLQkJCQltZW1jcHkoc3VwcG9ydFJhdGUrc3VwcG9ydFJhdGVOdW0sIHAgKyAyLCBwWzFdKTsKLQkJCQlzdXBwb3J0UmF0ZU51bSArPSBwWzFdOwotCQkJfQotCQl9Ci0JfQotCi0JLyogdG9kbzogbWFzayBzdXBwb3J0UmF0ZSBiZXR3ZWVuIEFQICYgU1RBIC0+IG1vdmUgdG8gdXBkYXRlIHJhaWQgKi8KLQkvKiBnZXRfbWF0Y2hlZF9yYXRlKHBtbG1lZXh0LCBzdXBwb3J0UmF0ZSwgJnN1cHBvcnRSYXRlTnVtLCAwKTsgKi8KLQotCS8qIHVwZGF0ZSBzdGF0aW9uIHN1cHBvcnRSYXRlICovCi0JcHN0YXQtPmJzc3JhdGVsZW4gPSBzdXBwb3J0UmF0ZU51bTsKLQltZW1jcHkocHN0YXQtPmJzc3JhdGVzZXQsIHN1cHBvcnRSYXRlLCBzdXBwb3J0UmF0ZU51bSk7Ci0JVXBkYXRlMjNhVGJsRm9yU29mdEFQKHBzdGF0LT5ic3NyYXRlc2V0LCBwc3RhdC0+YnNzcmF0ZWxlbik7Ci0KLQkvKiBjaGVjayBSU04vV1BBL1dQUyAqLwotCXBzdGF0LT5kb3Q4MDIxeGFsZyA9IDA7Ci0JcHN0YXQtPndwYV9wc2sgPSAwOwotCXBzdGF0LT53cGFfZ3JvdXBfY2lwaGVyID0gMDsKLQlwc3RhdC0+d3BhMl9ncm91cF9jaXBoZXIgPSAwOwotCXBzdGF0LT53cGFfcGFpcndpc2VfY2lwaGVyID0gMDsKLQlwc3RhdC0+d3BhMl9wYWlyd2lzZV9jaXBoZXIgPSAwOwotCW1lbXNldChwc3RhdC0+d3BhX2llLCAwLCBzaXplb2YocHN0YXQtPndwYV9pZSkpOwotCi0Jd3BhX2llID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9SU04sIHBvcywgbGVmdCk7Ci0JaWYgKCF3cGFfaWUpCi0JCXdwYV9pZSA9IGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkJCSBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XUEEsCi0JCQkJCQkgcG9zLCBsZWZ0KTsKLQlpZiAod3BhX2llKSB7Ci0JCWludCBncm91cF9jaXBoZXIgPSAwLCBwYWlyd2lzZV9jaXBoZXIgPSAwOwotCi0JCXdwYV9pZV9sZW4gPSB3cGFfaWVbMV07Ci0JCWlmIChwc2VjdXJpdHlwcml2LT53cGFfcHNrICYgQklUKDEpKSB7Ci0JCQlyID0gcnR3X3BhcnNlX3dwYTJfaWUyM2Eod3BhX2llLCB3cGFfaWVfbGVuICsgMiwKLQkJCQkJCSAmZ3JvdXBfY2lwaGVyLAotCQkJCQkJICZwYWlyd2lzZV9jaXBoZXIsIE5VTEwpOwotCQkJaWYgKHIgPT0gX1NVQ0NFU1MpIHsKLQkJCQlwc3RhdC0+ZG90ODAyMXhhbGcgPSAxOy8qIHBzaywgIHRvZG86ODAyLjF4ICovCi0JCQkJcHN0YXQtPndwYV9wc2sgfD0gQklUKDEpOwotCi0JCQkJcHN0YXQtPndwYTJfZ3JvdXBfY2lwaGVyID0gZ3JvdXBfY2lwaGVyICYKLQkJCQkJcHNlY3VyaXR5cHJpdi0+d3BhMl9ncm91cF9jaXBoZXI7Ci0JCQkJcHN0YXQtPndwYTJfcGFpcndpc2VfY2lwaGVyID0gcGFpcndpc2VfY2lwaGVyICYKLQkJCQkJcHNlY3VyaXR5cHJpdi0+d3BhMl9wYWlyd2lzZV9jaXBoZXI7Ci0JCQl9IGVsc2UKLQkJCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19JTlZBTElEX0lFOwotCQl9IGVsc2UgaWYgKHBzZWN1cml0eXByaXYtPndwYV9wc2sgJiBCSVQoMCkpIHsKLQkJCXIgPSBydHdfcGFyc2Vfd3BhX2llMjNhKHdwYV9pZSwgd3BhX2llX2xlbiArIDIsCi0JCQkJCQkmZ3JvdXBfY2lwaGVyLCAmcGFpcndpc2VfY2lwaGVyLAotCQkJCQkJTlVMTCk7Ci0JCQlpZiAociA9PSBfU1VDQ0VTUykgewotCQkJCXBzdGF0LT5kb3Q4MDIxeGFsZyA9IDE7LyogcHNrLCAgdG9kbzo4MDIuMXggKi8KLQkJCQlwc3RhdC0+d3BhX3BzayB8PSBCSVQoMCk7Ci0KLQkJCQlwc3RhdC0+d3BhX2dyb3VwX2NpcGhlciA9IGdyb3VwX2NpcGhlciAmCi0JCQkJCXBzZWN1cml0eXByaXYtPndwYV9ncm91cF9jaXBoZXI7Ci0JCQkJcHN0YXQtPndwYV9wYWlyd2lzZV9jaXBoZXIgPSBwYWlyd2lzZV9jaXBoZXIgJgotCQkJCQlwc2VjdXJpdHlwcml2LT53cGFfcGFpcndpc2VfY2lwaGVyOwotCQkJfSBlbHNlCi0JCQkJc3RhdHVzID0gV0xBTl9TVEFUVVNfSU5WQUxJRF9JRTsKLQkJfSBlbHNlIHsKLQkJCXdwYV9pZSA9IE5VTEw7Ci0JCQl3cGFfaWVfbGVuID0gMDsKLQkJfQotCQlpZiAod3BhX2llICYmIHN0YXR1cyA9PSBXTEFOX1NUQVRVU19TVUNDRVNTKSB7Ci0JCQlpZiAoIXBzdGF0LT53cGFfZ3JvdXBfY2lwaGVyKQotCQkJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX0lOVkFMSURfR1JPVVBfQ0lQSEVSOwotCi0JCQlpZiAoIXBzdGF0LT53cGFfcGFpcndpc2VfY2lwaGVyKQotCQkJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX0lOVkFMSURfUEFJUldJU0VfQ0lQSEVSOwotCQl9Ci0JfQotCi0JaWYgKHN0YXR1cyAhPSBXTEFOX1NUQVRVU19TVUNDRVNTKQotCQlnb3RvIE9uQXNzb2NSZXEyM2FGYWlsOwotCi0JcHN0YXQtPmZsYWdzICY9IH4oV0xBTl9TVEFfV1BTIHwgV0xBTl9TVEFfTUFZQkVfV1BTKTsKLQotCXdwc19pZSA9IGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkJIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQUywKLQkJCQkJIHBvcywgbGVmdCk7Ci0KLQlpZiAoIXdwYV9pZSkgewotCQlpZiAod3BzX2llKSB7Ci0JCQlEQkdfODcyM0EoIlNUQSBpbmNsdWRlZCBXUFMgSUUgaW4gKFJlKUFzc29jaWF0aW9uICIKLQkJCQkgICJSZXF1ZXN0IC0gYXNzdW1lIFdQUyBpcyB1c2VkXG4iKTsKLQkJCXBzdGF0LT5mbGFncyB8PSBXTEFOX1NUQV9XUFM7Ci0JCX0gZWxzZSB7Ci0JCQlEQkdfODcyM0EoIlNUQSBkaWQgbm90IGluY2x1ZGUgV1BBL1JTTiBJRSBpbiAoUmUpIgotCQkJCSAgICJBc3NvY2lhdGlvbiBSZXF1ZXN0IC0gcG9zc2libGUgV1BTIHVzZVxuIik7Ci0JCQlwc3RhdC0+ZmxhZ3MgfD0gV0xBTl9TVEFfTUFZQkVfV1BTOwotCQl9Ci0JfSBlbHNlIHsKLQkJaW50IGNvcHlfbGVuOwotCi0JCWlmIChwc2VjdXJpdHlwcml2LT53cGFfcHNrID09IDApIHsKLQkJCURCR184NzIzQSgiU1RBICVwTTogV1BBL1JTTiBJRSBpbiBhc3NvY2lhdGlvbiByZXF1ZXN0LCBidXQgQVAgZG9uJ3Qgc3VwcG9ydCBXUEEvUlNOXG4iLAotCQkJCSAgcHN0YXQtPmh3YWRkcik7Ci0KLQkJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX0lOVkFMSURfSUU7Ci0KLQkJCWdvdG8gT25Bc3NvY1JlcTIzYUZhaWw7Ci0JCX0KLQotCQlpZiAod3BzX2llKSB7Ci0JCQlEQkdfODcyM0EoIlNUQSBpbmNsdWRlZCBXUFMgSUUgaW4gKFJlKUFzc29jaWF0aW9uICIKLQkJCQkgICJSZXF1ZXN0IC0gV1BTIGlzIHVzZWRcbiIpOwotCQkJcHN0YXQtPmZsYWdzIHw9IFdMQU5fU1RBX1dQUzsKLQkJCWNvcHlfbGVuID0gMDsKLQkJfSBlbHNlIHsKLQkJCWNvcHlfbGVuID0gKCh3cGFfaWVfbGVuICsgMikgPiBzaXplb2YocHN0YXQtPndwYV9pZSkpID8KLQkJCQlzaXplb2YocHN0YXQtPndwYV9pZSkgOiAod3BhX2llX2xlbiArIDIpOwotCQl9Ci0KLQkJaWYgKGNvcHlfbGVuID4gMCkKLQkJCW1lbWNweShwc3RhdC0+d3BhX2llLCB3cGFfaWUgLSAyLCBjb3B5X2xlbik7Ci0JfQotCi0JLyogIGNoZWNrIGlmIHRoZXJlIGlzIFdNTSBJRSAmIHN1cHBvcnQgV1dNLVBTICovCi0JcHN0YXQtPmZsYWdzICY9IH5XTEFOX1NUQV9XTUU7Ci0JcHN0YXQtPnFvc19vcHRpb24gPSAwOwotCXBzdGF0LT5xb3NfaW5mbyA9IDA7Ci0JcHN0YXQtPmhhc19sZWdhY3lfYWMgPSB0cnVlOwotCXBzdGF0LT51YXBzZF92byA9IDA7Ci0JcHN0YXQtPnVhcHNkX3ZpID0gMDsKLQlwc3RhdC0+dWFwc2RfYmUgPSAwOwotCXBzdGF0LT51YXBzZF9iayA9IDA7Ci0JaWYgKHBtbG1lcHJpdi0+cW9zX29wdGlvbikgewotCQljb25zdCB1OCAqZW5kID0gcG9zICsgbGVmdDsKLQotCQlwID0gcG9zOwotCi0JCWZvciAoOzspIHsKLQkJCWxlZnQgPSBlbmQgLSBwOwotCQkJcCA9IGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkJCSAgICBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XTU0sCi0JCQkJCQkgICAgcCwgbGVmdCk7Ci0JCQlpZiAocCkgewotCQkJCXBzdGF0LT5mbGFncyB8PSBXTEFOX1NUQV9XTUU7Ci0KLQkJCQlwc3RhdC0+cW9zX29wdGlvbiA9IDE7Ci0JCQkJcHN0YXQtPnFvc19pbmZvID0gKihwICsgOCk7Ci0KLQkJCQlwc3RhdC0+bWF4X3NwX2xlbiA9Ci0JCQkJCShwc3RhdC0+cW9zX2luZm8gPj4gNSkgJiAweDM7Ci0KLQkJCQlpZiAoKHBzdGF0LT5xb3NfaW5mbyAmIDB4ZikgIT0gMHhmKQotCQkJCQlwc3RhdC0+aGFzX2xlZ2FjeV9hYyA9IHRydWU7Ci0JCQkJZWxzZQotCQkJCQlwc3RhdC0+aGFzX2xlZ2FjeV9hYyA9IGZhbHNlOwotCi0JCQkJaWYgKHBzdGF0LT5xb3NfaW5mbyAmIDB4ZikgewotCQkJCQlpZiAocHN0YXQtPnFvc19pbmZvICYgQklUKDApKQotCQkJCQkJcHN0YXQtPnVhcHNkX3ZvID0gQklUKDApfEJJVCgxKTsKLQkJCQkJZWxzZQotCQkJCQkJcHN0YXQtPnVhcHNkX3ZvID0gMDsKLQotCQkJCQlpZiAocHN0YXQtPnFvc19pbmZvICYgQklUKDEpKQotCQkJCQkJcHN0YXQtPnVhcHNkX3ZpID0gQklUKDApfEJJVCgxKTsKLQkJCQkJZWxzZQotCQkJCQkJcHN0YXQtPnVhcHNkX3ZpID0gMDsKLQotCQkJCQlpZiAocHN0YXQtPnFvc19pbmZvICYgQklUKDIpKQotCQkJCQkJcHN0YXQtPnVhcHNkX2JrID0gQklUKDApfEJJVCgxKTsKLQkJCQkJZWxzZQotCQkJCQkJcHN0YXQtPnVhcHNkX2JrID0gMDsKLQotCQkJCQlpZiAocHN0YXQtPnFvc19pbmZvICYgQklUKDMpKQotCQkJCQkJcHN0YXQtPnVhcHNkX2JlID0gQklUKDApfEJJVCgxKTsKLQkJCQkJZWxzZQotCQkJCQkJcHN0YXQtPnVhcHNkX2JlID0gMDsKLQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQkJcCA9IHAgKyBwWzFdICsgMjsKLQkJfQotCX0KLQotCS8qIHNhdmUgSFQgY2FwYWJpbGl0aWVzIGluIHRoZSBzdGEgb2JqZWN0ICovCi0JbWVtc2V0KCZwc3RhdC0+aHRwcml2Lmh0X2NhcCwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7Ci0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfSFRfQ0FQQUJJTElUWSwgcG9zLCBsZWZ0KTsKLQotCWlmIChwICYmIHBbMV0gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSkgewotCQlwc3RhdC0+ZmxhZ3MgfD0gV0xBTl9TVEFfSFQ7Ci0KLQkJcHN0YXQtPmZsYWdzIHw9IFdMQU5fU1RBX1dNRTsKLQotCQltZW1jcHkoJnBzdGF0LT5odHByaXYuaHRfY2FwLCBwICsgMiwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkpOwotCX0gZWxzZQotCQlwc3RhdC0+ZmxhZ3MgJj0gfldMQU5fU1RBX0hUOwotCi0JaWYgKCFwbWxtZXByaXYtPmh0cHJpdi5odF9vcHRpb24gJiYgcHN0YXQtPmZsYWdzICYgV0xBTl9TVEFfSFQpewotCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOwotCQlnb3RvIE9uQXNzb2NSZXEyM2FGYWlsOwotCX0KLQotCWlmIChwc3RhdC0+ZmxhZ3MgJiBXTEFOX1NUQV9IVCAmJgotCSAgICAocHN0YXQtPndwYTJfcGFpcndpc2VfY2lwaGVyICYgV1BBX0NJUEhFUl9US0lQIHx8Ci0JICAgICBwc3RhdC0+d3BhX3BhaXJ3aXNlX2NpcGhlciAmIFdQQV9DSVBIRVJfVEtJUCkpIHsKLQkJREJHXzg3MjNBKCJIVDogJXBNIHRyaWVkIHRvIHVzZSBUS0lQIHdpdGggSFQgYXNzb2NpYXRpb25cbiIsCi0JCQkgIHBzdGF0LT5od2FkZHIpOwotCi0JCS8qIHN0YXR1cyA9IFdMQU5fU1RBVFVTX0NJUEhFUl9SRUpFQ1RFRF9QRVJfUE9MSUNZOyAqLwotCQkvKiBnb3RvIE9uQXNzb2NSZXEyM2FGYWlsOyAqLwotCX0KLQotCXBzdGF0LT5mbGFncyB8PSBXTEFOX1NUQV9OT05FUlA7Ci0JZm9yIChpID0gMDsgaSA8IHBzdGF0LT5ic3NyYXRlbGVuOyBpKyspIHsKLQkJaWYgKChwc3RhdC0+YnNzcmF0ZXNldFtpXSAmIDB4N2YpID4gMjIpIHsKLQkJCXBzdGF0LT5mbGFncyAmPSB+V0xBTl9TVEFfTk9ORVJQOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAocHN0YXQtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpCi0JCXBzdGF0LT5mbGFncyB8PSBXTEFOX1NUQV9TSE9SVF9QUkVBTUJMRTsKLQllbHNlCi0JCXBzdGF0LT5mbGFncyAmPSB+V0xBTl9TVEFfU0hPUlRfUFJFQU1CTEU7Ci0KLQlpZiAoc3RhdHVzICE9IFdMQU5fU1RBVFVTX1NVQ0NFU1MpCi0JCWdvdG8gT25Bc3NvY1JlcTIzYUZhaWw7Ci0KLQkvKiBUT0RPOiBpZGVudGlmeV9wcm9wcmlldGFyeV92ZW5kb3JfaWUoKTsgKi8KLQkvKiAgUmVhbHRlayBwcm9wcmlldGFyeSBJRSAqLwotCS8qICBpZGVudGlmeSBpZiB0aGlzIGlzIEJyb2FkY29tIHN0YSAqLwotCS8qICBpZGVudGlmeSBpZiB0aGlzIGlzIHJhbGluayBzdGEgKi8KLQkvKiAgQ3VzdG9tZXIgcHJvcHJpZXRhcnkgSUUgKi8KLQotCS8qIGdldCBhIHVuaXF1ZSBBSUQgKi8KLQlpZiAocHN0YXQtPmFpZCA+IDApIHsKLQkJREJHXzg3MjNBKCIgIG9sZCBBSUQgJWRcbiIsIHBzdGF0LT5haWQpOwotCX0gZWxzZSB7Ci0JCWZvciAocHN0YXQtPmFpZCA9IDE7IHBzdGF0LT5haWQgPD0gTlVNX1NUQTsgcHN0YXQtPmFpZCsrKQotCQkJaWYgKHBzdGFwcml2LT5zdGFfYWlkW3BzdGF0LT5haWQgLSAxXSA9PSBOVUxMKQotCQkJCWJyZWFrOwotCi0JCWlmIChwc3RhdC0+YWlkID4gTlVNX1NUQSkKLQkJCXBzdGF0LT5haWQgPSBOVU1fU1RBOwotCQlpZiAocHN0YXQtPmFpZCA+IHBzdGFwcml2LT5tYXhfbnVtX3N0YSkgewotCi0JCQlwc3RhdC0+YWlkID0gMDsKLQotCQkJREJHXzg3MjNBKCIgIG5vIHJvb20gZm9yIG1vcmUgQUlEc1xuIik7Ci0KLQkJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX0FQX1VOQUJMRV9UT19IQU5ETEVfTkVXX1NUQTsKLQotCQkJZ290byBPbkFzc29jUmVxMjNhRmFpbDsKLQkJfSBlbHNlIHsKLQkJCXBzdGFwcml2LT5zdGFfYWlkW3BzdGF0LT5haWQgLSAxXSA9IHBzdGF0OwotCQkJREJHXzg3MjNBKCJhbGxvY2F0ZSBuZXcgQUlEID0gKCVkKVxuIiwgcHN0YXQtPmFpZCk7Ci0JCX0KLQl9Ci0KLQlwc3RhdC0+c3RhdGUgJj0gfldJRklfRldfQVNTT0NfU1RBVEU7Ci0JcHN0YXQtPnN0YXRlIHw9IFdJRklfRldfQVNTT0NfU1VDQ0VTUzsKLQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmF1dGhfbGlzdF9sb2NrKTsKLQlpZiAoIWxpc3RfZW1wdHkoJnBzdGF0LT5hdXRoX2xpc3QpKSB7Ci0JCWxpc3RfZGVsX2luaXQoJnBzdGF0LT5hdXRoX2xpc3QpOwotCQlwc3RhcHJpdi0+YXV0aF9saXN0X2NudC0tOwotCX0KLQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPmF1dGhfbGlzdF9sb2NrKTsKLQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQlpZiAobGlzdF9lbXB0eSgmcHN0YXQtPmFzb2NfbGlzdCkpIHsKLQkJcHN0YXQtPmV4cGlyZV90byA9IHBzdGFwcml2LT5leHBpcmVfdG87Ci0JCWxpc3RfYWRkX3RhaWwoJnBzdGF0LT5hc29jX2xpc3QsICZwc3RhcHJpdi0+YXNvY19saXN0KTsKLQkJcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQrKzsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0KLQkvKiAgbm93IHRoZSBzdGF0aW9uIGlzIHF1YWxpZmllZCB0byBqb2luIG91ciBCU1MuLi4gKi8KLQlpZiAocHN0YXQtPnN0YXRlICYgV0lGSV9GV19BU1NPQ19TVUNDRVNTICYmCi0JICAgIHN0YXR1cyA9PSBXTEFOX1NUQVRVU19TVUNDRVNTKSB7Ci0JCS8qIDEgYnNzX2NhcF91cGRhdGUgJiBzdGFfaW5mb191cGRhdGUyM2EgKi8KLQkJYnNzX2NhcF91cGRhdGVfb25fc3RhX2pvaW4yM2EocGFkYXB0ZXIsIHBzdGF0KTsKLQkJc3RhX2luZm9fdXBkYXRlMjNhKHBhZGFwdGVyLCBwc3RhdCk7Ci0KLQkJLyogaXNzdWUgYXNzb2MgcnNwIGJlZm9yZSBub3RpZnkgc3RhdGlvbiBqb2luIGV2ZW50LiAqLwotCQlpZiAoaWVlZTgwMjExX2lzX2Fzc29jX3JlcShtZ210LT5mcmFtZV9jb250cm9sKSkKLQkJCWlzc3VlX2Fzc29jcnNwKHBhZGFwdGVyLCBzdGF0dXMsIHBzdGF0LAotCQkJCSAgICAgICBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUCk7Ci0JCWVsc2UKLQkJCWlzc3VlX2Fzc29jcnNwKHBhZGFwdGVyLCBzdGF0dXMsIHBzdGF0LAotCQkJCSAgICAgICBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQKTsKLQotCQkvKiAyIC0gcmVwb3J0IHRvIHVwcGVyIGxheWVyICovCi0JCURCR184NzIzQSgiaW5kaWNhdGVfc3RhX2pvaW5fZXZlbnQgdG8gdXBwZXIgbGF5ZXIgLSBob3N0YXBkXG4iKTsKLQkJcnR3X2NmZzgwMjExX2luZGljYXRlX3N0YV9hc3NvYyhwYWRhcHRlciwgcGZyYW1lLCBwa3RfbGVuKTsKLQotCQkvKiAzLSgxKSByZXBvcnQgc3RhIGFkZCBldmVudCAqLwotCQlyZXBvcnRfYWRkX3N0YV9ldmVudDIzYShwYWRhcHRlciwgcHN0YXQtPmh3YWRkciwgcHN0YXQtPmFpZCk7Ci0JfQotCi0JcmV0dXJuIF9TVUNDRVNTOwotCi1hc29jX2NsYXNzMl9lcnJvcjoKLQotCWlzc3VlX2RlYXV0aDIzYShwYWRhcHRlciwgbWdtdC0+c2EsIHN0YXR1cyk7Ci0JcmV0dXJuIF9GQUlMOwotCi1PbkFzc29jUmVxMjNhRmFpbDoKLQotCXBzdGF0LT5haWQgPSAwOwotCWlmIChpZWVlODAyMTFfaXNfYXNzb2NfcmVxKG1nbXQtPmZyYW1lX2NvbnRyb2wpKQotCQlpc3N1ZV9hc3NvY3JzcChwYWRhcHRlciwgc3RhdHVzLCBwc3RhdCwKLQkJCSAgICAgICBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUCk7Ci0JZWxzZQotCQlpc3N1ZV9hc3NvY3JzcChwYWRhcHRlciwgc3RhdHVzLCBwc3RhdCwKLQkJCSAgICAgICBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQKTsKLQotI2VuZGlmIC8qIENPTkZJR184NzIzQVVfQVBfTU9ERSAqLwotCi0JcmV0dXJuIF9GQUlMOwotfQotCi1zdGF0aWMgaW50Ci1PbkFzc29jUnNwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICpwbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiLT5kYXRhOwotCWludCByZXM7Ci0JdW5zaWduZWQgc2hvcnQgc3RhdHVzOwotCWNvbnN0IHU4ICpwLCAqcGllOwotCXU4ICpwZnJhbWUgPSBza2ItPmRhdGE7Ci0JaW50IHBrdF9sZW4gPSBza2ItPmxlbjsKLQlpbnQgcGllbGVuOwotCi0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JLyogY2hlY2sgQTEgbWF0Y2hlcyBvciBub3QgKi8KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBwbWdtdC0+ZGEpKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQlpZiAoIShwbWxtZWluZm8tPnN0YXRlICYgKFdJRklfRldfQVVUSF9TVUNDRVNTIHwgV0lGSV9GV19BU1NPQ19TVEFURSkpKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQlpZiAocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVNTT0NfU1VDQ0VTUykKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JZGVsX3RpbWVyX3N5bmMoJnBtbG1lZXh0LT5saW5rX3RpbWVyKTsKLQotCS8qIHN0YXR1cyAqLwotCXN0YXR1cyA9IGxlMTZfdG9fY3B1KHBtZ210LT51LmFzc29jX3Jlc3Auc3RhdHVzX2NvZGUpOwotCWlmIChzdGF0dXMgPiAwKQl7Ci0JCURCR184NzIzQSgiYXNzb2MgcmVqZWN0LCBzdGF0dXMgY29kZTogJWRcbiIsIHN0YXR1cyk7Ci0JCXBtbG1laW5mby0+c3RhdGUgPSBNU1JfTk9MSU5LOwotCQlyZXMgPSAtNDsKLQkJZ290byByZXBvcnRfYXNzb2NfcmVzdWx0OwotCX0KLQotCS8qIGdldCBjYXBhYmlsaXRpZXMgKi8KLQlwbWxtZWluZm8tPmNhcGFiaWxpdHkgPSBsZTE2X3RvX2NwdShwbWdtdC0+dS5hc3NvY19yZXNwLmNhcGFiX2luZm8pOwotCi0JLyogc2V0IHNsb3QgdGltZSAqLwotCXBtbG1laW5mby0+c2xvdFRpbWUgPSAocG1sbWVpbmZvLT5jYXBhYmlsaXR5ICYgQklUKDEwKSk/IDk6IDIwOwotCi0JLyogQUlEICovCi0JcmVzID0gcG1sbWVpbmZvLT5haWQgPSBsZTE2X3RvX2NwdShwbWdtdC0+dS5hc3NvY19yZXNwLmFpZCkgJiAweDNmZmY7Ci0KLQlwaWUgPSBwZnJhbWUgKyBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYXNzb2NfcmVzcC52YXJpYWJsZSk7Ci0JcGllbGVuID0gcGt0X2xlbiAtCi0JCW9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5hc3NvY19yZXNwLnZhcmlhYmxlKTsKLQotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX0NBUEFCSUxJVFksCi0JCQkgICAgIHBtZ210LT51LmFzc29jX3Jlc3AudmFyaWFibGUsIHBpZWxlbik7Ci0JaWYgKHAgJiYgcFsxXSkKLQkJSFRfY2Fwc19oYW5kbGVyMjNhKHBhZGFwdGVyLCBwKTsKLQotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX09QRVJBVElPTiwKLQkJCSAgICAgcG1nbXQtPnUuYXNzb2NfcmVzcC52YXJpYWJsZSwgcGllbGVuKTsKLQlpZiAocCAmJiBwWzFdKQotCQlIVF9pbmZvX2hhbmRsZXIyM2EocGFkYXB0ZXIsIHApOwotCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfRVJQX0lORk8sCi0JCQkgICAgIHBtZ210LT51LmFzc29jX3Jlc3AudmFyaWFibGUsIHBpZWxlbik7Ci0JaWYgKHAgJiYgcFsxXSkKLQkJRVJQX0lFX2hhbmRsZXIyM2EocGFkYXB0ZXIsIHApOwotCi0JcGllID0gcGZyYW1lICsgb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmFzc29jX3Jlc3AudmFyaWFibGUpOwotCXdoaWxlICh0cnVlKSB7Ci0JCXAgPSBjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZShXTEFOX09VSV9NSUNST1NPRlQsCi0JCQkJCSAgICBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XTU0sCi0JCQkJCSAgICBwaWUsIHBmcmFtZSArIHBrdF9sZW4gLSBwaWUpOwotCQlpZiAoIXApCi0JCQlicmVhazsKLQotCQlwaWUgPSBwICsgcFsxXSArIDI7Ci0JCS8qIGlmIHRoaXMgSUUgaXMgdG9vIHNob3J0LCB0cnkgdGhlIG5leHQgKi8KLQkJaWYgKHBbMV0gPD0gNCkKLQkJCWNvbnRpbnVlOwotCQkvKiBpZiB0aGlzIElFIGlzIFdNTSBwYXJhbXMsIHdlIGZvdW5kIHdoYXQgd2Ugd2FudGVkICovCi0JCWlmIChwWzZdID09IDEpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAocCAmJiBwWzFdKQotCQlXTU1fcGFyYW1faGFuZGxlcjIzYShwYWRhcHRlciwgcCk7Ci0KLQlwbWxtZWluZm8tPnN0YXRlICY9IH5XSUZJX0ZXX0FTU09DX1NUQVRFOwotCXBtbG1laW5mby0+c3RhdGUgfD0gV0lGSV9GV19BU1NPQ19TVUNDRVNTOwotCi0JLyogVXBkYXRlIEJhc2ljIFJhdGUgVGFibGUgZm9yIHNwZWMsIDIwMTAtMTItMjggLCBieSB0aG9tYXMgKi8KLQlVcGRhdGVCcmF0ZVRibDIzYShwYWRhcHRlciwgcG1sbWVpbmZvLT5uZXR3b3JrLlN1cHBvcnRlZFJhdGVzKTsKLQotcmVwb3J0X2Fzc29jX3Jlc3VsdDoKLQlwbWxtZXByaXYtPmFzc29jX3JzcF9sZW4gPSAwOwotCWlmIChyZXMgPiAwKSB7Ci0JCWtmcmVlKHBtbG1lcHJpdi0+YXNzb2NfcnNwKTsKLQkJcG1sbWVwcml2LT5hc3NvY19yc3AgPSBrbWFsbG9jKHBrdF9sZW4sIEdGUF9BVE9NSUMpOwotCQlpZiAocG1sbWVwcml2LT5hc3NvY19yc3ApIHsKLQkJCW1lbWNweShwbWxtZXByaXYtPmFzc29jX3JzcCwgcGZyYW1lLCBwa3RfbGVuKTsKLQkJCXBtbG1lcHJpdi0+YXNzb2NfcnNwX2xlbiA9IHBrdF9sZW47Ci0JCX0KLQl9IGVsc2UKLQkJa2ZyZWUocG1sbWVwcml2LT5hc3NvY19yc3ApOwotCi0JcmVwb3J0X2pvaW5fcmVzMjNhKHBhZGFwdGVyLCByZXMpOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50Ci1PbkRlQXV0aDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JdW5zaWduZWQgc2hvcnQgcmVhc29uOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKLQotCWlmICghZXRoZXJfYWRkcl9lcXVhbChtZ210LT5ic3NpZCwKLQkJCSAgICAgIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSkpCi0JCXJldHVybiBfU1VDQ0VTUzsKLQotCXJlYXNvbiA9IGxlMTZfdG9fY3B1KG1nbXQtPnUuZGVhdXRoLnJlYXNvbl9jb2RlKTsKLQotCURCR184NzIzQSgiJXMgUmVhc29uIGNvZGUoJWQpXG4iLCBfX2Z1bmNfXywgcmVhc29uKTsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLQkJc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJhcCByZWN2IGRlYXV0aCByZWFzb24gY29kZSglZCkgIgotCQkJCSJzdGE6JXBNXG4iLCByZWFzb24sIG1nbXQtPnNhKTsKLQotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBtZ210LT5zYSk7Ci0JCWlmIChwc3RhKSB7Ci0JCQl1OCB1cGRhdGVkID0gMDsKLQotCQkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCQkJaWYgKCFsaXN0X2VtcHR5KCZwc3RhLT5hc29jX2xpc3QpKSB7Ci0JCQkJbGlzdF9kZWxfaW5pdCgmcHN0YS0+YXNvY19saXN0KTsKLQkJCQlwc3RhcHJpdi0+YXNvY19saXN0X2NudC0tOwotCQkJCXVwZGF0ZWQgPSBhcF9mcmVlX3N0YTIzYShwYWRhcHRlciwgcHN0YSwKLQkJCQkJCSAgICAgIGZhbHNlLCByZWFzb24pOwotCQkJfQotCQkJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0KLQkJCWFzc29jaWF0ZWRfY2xpZW50c191cGRhdGUyM2EocGFkYXB0ZXIsIHVwZGF0ZWQpOwotCQl9Ci0KLQkJcmV0dXJuIF9TVUNDRVNTOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlEQkdfODcyM0FfTEVWRUwoX2Rydl9hbHdheXNfLCAic3RhIHJlY3YgZGVhdXRoIHJlYXNvbiBjb2RlKCVkKSAiCi0JCQkJInN0YTolcE1cbiIsIHJlYXNvbiwgbWdtdC0+YnNzaWQpOwotCi0JCXJlY2VpdmVfZGlzY29ubmVjdDIzYShwYWRhcHRlciwgbWdtdC0+YnNzaWQsIHJlYXNvbik7Ci0JfQotCXBtbG1lcHJpdi0+TGlua0RldGVjdEluZm8uYkJ1c3lUcmFmZmljID0gZmFsc2U7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLU9uRGlzYXNzb2MyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXVuc2lnbmVkIHNob3J0IHJlYXNvbjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2ItPmRhdGE7Ci0KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobWdtdC0+YnNzaWQsCi0JCQkgICAgICBnZXRfbXlfYnNzaWQyM2EoJnBtbG1laW5mby0+bmV0d29yaykpKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQlyZWFzb24gPSBsZTE2X3RvX2NwdShtZ210LT51LmRpc2Fzc29jLnJlYXNvbl9jb2RlKTsKLQotCURCR184NzIzQSgiJXMgUmVhc29uIGNvZGUoJWQpXG4iLCBfX2Z1bmNfXywgcmVhc29uKTsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLQkJc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJhcCByZWN2IGRpc2Fzc29jIHJlYXNvbiBjb2RlKCVkKSIKLQkJCQkiIHN0YTolcE1cbiIsIHJlYXNvbiwgbWdtdC0+c2EpOwotCi0JCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIG1nbXQtPnNhKTsKLQkJaWYgKHBzdGEpIHsKLQkJCXU4IHVwZGF0ZWQgPSAwOwotCi0JCQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0JCQlpZiAoIWxpc3RfZW1wdHkoJnBzdGEtPmFzb2NfbGlzdCkpIHsKLQkJCQlsaXN0X2RlbF9pbml0KCZwc3RhLT5hc29jX2xpc3QpOwotCQkJCXBzdGFwcml2LT5hc29jX2xpc3RfY250LS07Ci0JCQkJdXBkYXRlZCA9IGFwX2ZyZWVfc3RhMjNhKHBhZGFwdGVyLCBwc3RhLAotCQkJCQkJCSBmYWxzZSwgcmVhc29uKTsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCi0JCQlhc3NvY2lhdGVkX2NsaWVudHNfdXBkYXRlMjNhKHBhZGFwdGVyLCB1cGRhdGVkKTsKLQkJfQotCi0JCXJldHVybiBfU1VDQ0VTUzsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJREJHXzg3MjNBX0xFVkVMKF9kcnZfYWx3YXlzXywgImFwIHJlY3YgZGlzYXNzb2MgcmVhc29uICIKLQkJCQkiY29kZSglZCkgc3RhOiVwTVxuIiwgcmVhc29uLCBtZ210LT5ic3NpZCk7Ci0KLQkJcmVjZWl2ZV9kaXNjb25uZWN0MjNhKHBhZGFwdGVyLCBtZ210LT5ic3NpZCwgcmVhc29uKTsKLQl9Ci0JcG1sbWVwcml2LT5MaW5rRGV0ZWN0SW5mby5iQnVzeVRyYWZmaWMgPSBmYWxzZTsKLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLU9uQXRpbTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludAotb25fYWN0aW9uX3NwY3QyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXJldHVybiBfRkFJTDsKLX0KLQotc3RhdGljIGludAotT25BY3Rpb24yM2FfcW9zKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLU9uQWN0aW9uMjNhX2RscyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IE9uQWN0aW9uMjNhX2JhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JdTggKmFkZHI7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKLQlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmw7Ci0JdW5zaWduZWQgY2hhciBjYXRlZ29yeSwgYWN0aW9uOwotCXVuc2lnbmVkIHNob3J0IHRpZCwgc3RhdHVzLCBjYXBhYiwgcGFyYW1zLCByZWFzb25fY29kZSA9IDA7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JLyogY2hlY2sgUkEgbWF0Y2hlcyBvciBub3QgKi8KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBtZ210LT5kYSkpCi0JCXJldHVybiBfU1VDQ0VTUzsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmICgocG1sbWVpbmZvLT5zdGF0ZSYweDAzKSAhPSBNU1JfQVApCi0JCWlmICghKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FTU09DX1NVQ0NFU1MpKQotCQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JYWRkciA9IG1nbXQtPnNhOwotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIGFkZHIpOwotCi0JaWYgKCFwc3RhKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQljYXRlZ29yeSA9IG1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5OwotCWlmIChjYXRlZ29yeSA9PSBXTEFOX0NBVEVHT1JZX0JBQ0spIHsgLyogIHJlcHJlc2VudGluZyBCbG9jayBBY2sgKi8KLQkJaWYgKCFwbWxtZWluZm8tPkhUX2VuYWJsZSkKLQkJCXJldHVybiBfU1VDQ0VTUzsKLQkJLyogYWN0aW9uX2NvZGUgaXMgbG9jYXRlZCBpbiB0aGUgc2FtZSBwbGFjZSBmb3IgYWxsCi0JCSAgIGFjdGlvbiBldmVudHMsIHNvIHBpY2sgYW55ICovCi0JCWFjdGlvbiA9IG1nbXQtPnUuYWN0aW9uLnUud21lX2FjdGlvbi5hY3Rpb25fY29kZTsKLQkJREJHXzg3MjNBKCIlcywgYWN0aW9uID0lZFxuIiwgX19mdW5jX18sIGFjdGlvbik7Ci0JCXN3aXRjaCAoYWN0aW9uKSB7Ci0JCWNhc2UgV0xBTl9BQ1RJT05fQUREQkFfUkVROiAvKiBBRERCQSByZXF1ZXN0ICovCi0JCQltZW1jcHkoJnBtbG1laW5mby0+QUREQkFfcmVxLAotCQkJICAgICAgICZtZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5kaWFsb2dfdG9rZW4sCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBBRERCQV9yZXF1ZXN0KSk7Ci0JCQlwcm9jZXNzX2FkZGJhX3JlcTIzYShwYWRhcHRlciwKLQkJCQkJICAgICAodTggKikmcG1sbWVpbmZvLT5BRERCQV9yZXEsIGFkZHIpOwotCQkJaWYgKHBtbG1laW5mby0+YkFjY2VwdEFkZGJhUmVxID09IHRydWUpCi0JCQkJaXNzdWVfYWN0aW9uX0JBMjNhKHBhZGFwdGVyLCBhZGRyLAotCQkJCQkJICAgV0xBTl9BQ1RJT05fQUREQkFfUkVTUCwgMCk7Ci0JCQllbHNlIHsKLQkJCQkvKiByZWplY3QgQUREQkEgUmVxICovCi0JCQkJaXNzdWVfYWN0aW9uX0JBMjNhKHBhZGFwdGVyLCBhZGRyLAotCQkJCQkJICAgV0xBTl9BQ1RJT05fQUREQkFfUkVTUCwgMzcpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9BQ1RJT05fQUREQkFfUkVTUDogLyogQUREQkEgcmVzcG9uc2UgKi8KLQkJCXN0YXR1cyA9IGdldF91bmFsaWduZWRfbGUxNigKLQkJCQkmbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwLnN0YXR1cyk7Ci0JCQljYXBhYiA9IGdldF91bmFsaWduZWRfbGUxNigKLQkJCQkmbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwLmNhcGFiKTsKLQkJCXRpZCA9IChjYXBhYiAmIElFRUU4MDIxMV9BRERCQV9QQVJBTV9USURfTUFTSykgPj4gMjsKLQkJCWlmIChzdGF0dXMgPT0gMCkgewkvKiBzdWNjZXNzZnVsICovCi0JCQkJREJHXzg3MjNBKCJhZ2dfZW5hYmxlIGZvciBUSUQgPSVkXG4iLCB0aWQpOwotCQkJCXBzdGEtPmh0cHJpdi5hZ2dfZW5hYmxlX2JpdG1hcCB8PSBCSVQodGlkKTsKLQkJCQlwc3RhLT5odHByaXYuY2FuZGlkYXRlX3RpZF9iaXRtYXAgJj0gfkJJVCh0aWQpOwotCQkJfSBlbHNlCi0JCQkJcHN0YS0+aHRwcml2LmFnZ19lbmFibGVfYml0bWFwICY9IH5CSVQodGlkKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgV0xBTl9BQ1RJT05fREVMQkE6IC8qIERFTEJBICovCi0JCQlwYXJhbXMgPSBnZXRfdW5hbGlnbmVkX2xlMTYoCi0JCQkJJm1nbXQtPnUuYWN0aW9uLnUuZGVsYmEucGFyYW1zKTsKLQkJCXRpZCA9IHBhcmFtcyA+PiAxMjsKLQotCQkJaWYgKHBhcmFtcyAmIElFRUU4MDIxMV9ERUxCQV9QQVJBTV9JTklUSUFUT1JfTUFTSykgewotCQkJCXByZW9yZGVyX2N0cmwgPSAmcHN0YS0+cmVjdnJlb3JkZXJfY3RybFt0aWRdOwotCQkJCXByZW9yZGVyX2N0cmwtPmVuYWJsZSA9IGZhbHNlOwotCQkJCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9IDB4ZmZmZjsKLQkJCX0gZWxzZSB7Ci0JCQkJcHN0YS0+aHRwcml2LmFnZ19lbmFibGVfYml0bWFwICY9IH5CSVQodGlkKTsKLQkJCQlwc3RhLT5odHByaXYuY2FuZGlkYXRlX3RpZF9iaXRtYXAgJj0gfkJJVCh0aWQpOwotCQkJfQotCQkJcmVhc29uX2NvZGUgPSBnZXRfdW5hbGlnbmVkX2xlMTYoCi0JCQkJJm1nbXQtPnUuYWN0aW9uLnUuZGVsYmEucmVhc29uX2NvZGUpOwotCQkJLyogdG9kbzogaG93IHRvIG5vdGlmeSB0aGUgaG9zdCB3aGlsZSByZWNlaXZpbmcKLQkJCSAgIERFTEVURSBCQSAqLwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgb25fYWN0aW9uX3B1YmxpYzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQl1OCAqcGZyYW1lID0gc2tiLT5kYXRhOwotCWludCBmcmVxLCBjaGFubmVsOwotCi0JLyogY2hlY2sgUkEgbWF0Y2hlcyBvciBub3QgKi8KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBoZHItPmFkZHIxKSkKLQkJcmV0dXJuIF9GQUlMOwotCi0JY2hhbm5lbCA9IHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlcik7Ci0KLQlpZiAoY2hhbm5lbCA8PSBSVFdfQ0hfTUFYXzJHX0NIQU5ORUwpCi0JCWZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbm5lbCwKLQkJCQkJCSAgICAgIE5MODAyMTFfQkFORF8yR0haKTsKLQllbHNlCi0JCWZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbm5lbCwKLQkJCQkJCSAgICAgIE5MODAyMTFfQkFORF81R0haKTsKLQotCWlmIChjZmc4MDIxMV9yeF9tZ210KHBhZGFwdGVyLT5ydHdfd2RldiwgZnJlcSwgMCwgcGZyYW1lLAotCQkJICAgICBza2ItPmxlbiwgMCkpCi0JCXJldHVybiBfU1VDQ0VTUzsKLQotCXJldHVybiBfRkFJTDsKLX0KLQotc3RhdGljIGludAotT25BY3Rpb24yM2FfaHQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludAotT25BY3Rpb24yM2Ffd21tKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLU9uQWN0aW9uMjNhX3AycChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50Ci1PbkFjdGlvbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JaW50IGk7Ci0JdTggY2F0ZWdvcnk7Ci0Jc3RydWN0IGFjdGlvbl9oYW5kbGVyICpwdGFibGU7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2ItPmRhdGE7Ci0KLQljYXRlZ29yeSA9IG1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5OwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoT25BY3Rpb24yM2FfdGJsKTsgaSsrKSB7Ci0JCXB0YWJsZSA9ICZPbkFjdGlvbjIzYV90YmxbaV07Ci0KLQkJaWYgKGNhdGVnb3J5ID09IHB0YWJsZS0+bnVtKQotCQkJcHRhYmxlLT5mdW5jKHBhZGFwdGVyLCBwcmVjdl9mcmFtZSk7Ci0JfQotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IERvUmVzZXJ2ZWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdHJ1Y3QgeG1pdF9mcmFtZSAqYWxsb2NfbWd0eG1pdGZyYW1lMjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdikKLXsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmOwotCi0JcG1nbnRmcmFtZSA9IHJ0d19hbGxvY194bWl0ZnJhbWUyM2FfZXh0KHB4bWl0cHJpdik7Ci0KLQlpZiAoIXBtZ250ZnJhbWUpIHsKLQkJREJHXzg3MjNBKCIlcyglcyk6IGFsbG9jIHhtaXRmcmFtZSBmYWlsXG4iLCBfX2Z1bmNfXywKLQkJCSAgcHhtaXRwcml2LT5hZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQkJZ290byBleGl0OwotCX0KLQotCXB4bWl0YnVmID0gcnR3X2FsbG9jX3htaXRidWYyM2FfZXh0KHB4bWl0cHJpdik7Ci0JaWYgKCFweG1pdGJ1ZikgewotCQlEQkdfODcyM0EoIiVzKCVzKTogYWxsb2MgeG1pdGJ1ZiBmYWlsXG4iLCBfX2Z1bmNfXywKLQkJCSAgcHhtaXRwcml2LT5hZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQkJcnR3X2ZyZWVfeG1pdGZyYW1lMjNhKHB4bWl0cHJpdiwgcG1nbnRmcmFtZSk7Ci0JCXBtZ250ZnJhbWUgPSBOVUxMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcG1nbnRmcmFtZS0+ZnJhbWVfdGFnID0gTUdOVF9GUkFNRVRBRzsKLQlwbWdudGZyYW1lLT5weG1pdGJ1ZiA9IHB4bWl0YnVmOwotCXBtZ250ZnJhbWUtPmJ1Zl9hZGRyID0gcHhtaXRidWYtPnBidWY7Ci0JcHhtaXRidWYtPnByaXZfZGF0YSA9IHBtZ250ZnJhbWU7Ci0KLWV4aXQ6Ci0JcmV0dXJuIHBtZ250ZnJhbWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUZvbGxvd2luZyBhcmUgc29tZSBUWCBmdW5jdGlvbnMgZm9yIFdpRmkgTUxNRQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCB1cGRhdGVfbWdudF90eF9yYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHJhdGUpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCXBtbG1lZXh0LT50eF9yYXRlID0gcmF0ZTsKLQlEQkdfODcyM0EoIiVzKCk6IHJhdGUgPSAleFxuIiwgX19mdW5jX18sIHJhdGUpOwotfQotCi12b2lkIHVwZGF0ZV9tZ250ZnJhbWVfYXR0cmliMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCW1lbXNldCgodTggKilwYXR0cmliLCAwLCBzaXplb2Yoc3RydWN0IHBrdF9hdHRyaWIpKTsKLQotCXBhdHRyaWItPmhkcmxlbiA9IDI0OwotCXBhdHRyaWItPm5yX2ZyYWdzID0gMTsKLQlwYXR0cmliLT5wcmlvcml0eSA9IDc7Ci0JcGF0dHJpYi0+bWFjX2lkID0gMDsKLQlwYXR0cmliLT5xc2VsID0gMHgxMjsKLQotCXBhdHRyaWItPnBrdGxlbiA9IDA7Ci0KLQlpZiAocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFCKQotCQlwYXR0cmliLT5yYWlkID0gNjsvKiBiIG1vZGUgKi8KLQllbHNlCi0JCXBhdHRyaWItPnJhaWQgPSA1Oy8qIGEvZyBtb2RlICovCi0KLQlwYXR0cmliLT5lbmNyeXB0ID0gMDsKLQlwYXR0cmliLT5ic3dlbmMgPSBmYWxzZTsKLQotCXBhdHRyaWItPnFvc19lbiA9IGZhbHNlOwotCXBhdHRyaWItPmh0X2VuID0gZmFsc2U7Ci0JcGF0dHJpYi0+Yndtb2RlID0gSFRfQ0hBTk5FTF9XSURUSF8yMDsKLQlwYXR0cmliLT5jaF9vZmZzZXQgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwotCXBhdHRyaWItPnNnaSA9IGZhbHNlOwotCi0JcGF0dHJpYi0+c2VxbnVtID0gcG1sbWVleHQtPm1nbnRfc2VxOwotCi0JcGF0dHJpYi0+cmV0cnlfY3RybCA9IHRydWU7Ci19Ci0KLXZvaWQgZHVtcF9tZ250ZnJhbWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lKQotewotCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9PSB0cnVlIHx8Ci0JICAgIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9PSB0cnVlKQotCQlyZXR1cm47Ci0KLQlydGw4NzIzYXVfbWdudF94bWl0KHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLX0KLQotaW50IGR1bXBfbWdudGZyYW1lMjNhX2FuZF93YWl0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWUsIGludCB0aW1lb3V0X21zKQotewotCWludCByZXQgPSBfRkFJTDsKLQl1bnNpZ25lZCBsb25nIGlycUw7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmID0gcG1nbnRmcmFtZS0+cHhtaXRidWY7Ci0Jc3RydWN0IHN1Ym1pdF9jdHggc2N0eDsKLQotCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9PSB0cnVlIHx8Ci0JICAgIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9PSB0cnVlKQotCQlyZXR1cm4gcmV0OwotCi0JcnR3X3NjdHhfaW5pdDIzYSgmc2N0eCwgdGltZW91dF9tcyk7Ci0JcHhtaXRidWYtPnNjdHggPSAmc2N0eDsKLQotCXJldCA9IHJ0bDg3MjNhdV9tZ250X3htaXQocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotCi0JaWYgKHJldCA9PSBfU1VDQ0VTUykKLQkJcmV0ID0gcnR3X3NjdHhfd2FpdDIzYSgmc2N0eCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHhtaXRwcml2LT5sb2NrX3NjdHgsIGlycUwpOwotCXB4bWl0YnVmLT5zY3R4ID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZweG1pdHByaXYtPmxvY2tfc2N0eCwgaXJxTCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgZHVtcF9tZ250ZnJhbWUyM2FfYW5kX3dhaXRfYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWUpCi17Ci0JaW50IHJldCA9IF9GQUlMOwotCXUzMiB0aW1lb3V0X21zID0gNTAwOy8qICAgNTAwbXMgKi8KLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCi0JaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IHRydWUgfHwKLQkgICAgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkID09IHRydWUpCi0JCXJldHVybiBfRkFJTDsKLQotCW11dGV4X2xvY2soJnB4bWl0cHJpdi0+YWNrX3R4X211dGV4KTsKLQlweG1pdHByaXYtPmFja190eCA9IHRydWU7Ci0KLQlwbWdudGZyYW1lLT5hY2tfcmVwb3J0ID0gMTsKLQlpZiAocnRsODcyM2F1X21nbnRfeG1pdChwYWRhcHRlciwgcG1nbnRmcmFtZSkgPT0gX1NVQ0NFU1MpCi0JCXJldCA9IHJ0d19hY2tfdHhfd2FpdDIzYShweG1pdHByaXYsIHRpbWVvdXRfbXMpOwotCi0JcHhtaXRwcml2LT5hY2tfdHggPSBmYWxzZTsKLQltdXRleF91bmxvY2soJnB4bWl0cHJpdi0+YWNrX3R4X211dGV4KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdXBkYXRlX2hpZGRlbl9zc2lkKHU4ICppZXMsIHUzMiBpZXNfbGVuLCB1OCBoaWRkZW5fc3NpZF9tb2RlKQotewotCXU4ICpzc2lkX2llOwotCWludCBzc2lkX2xlbl9vcmk7Ci0JaW50IGxlbl9kaWZmID0gMDsKLQl1OCAqbmV4dF9pZTsKLQl1MzIgcmVtYWluX2xlbjsKLQotCXNzaWRfaWUgPSBydHdfZ2V0X2llMjNhKGllcywgIFdMQU5fRUlEX1NTSUQsICZzc2lkX2xlbl9vcmksIGllc19sZW4pOwotCi0JLyogREJHXzg3MjNBKCIlcyBoaWRkZW5fc3NpZF9tb2RlOiV1LCBzc2lkX2llOiVwLCBzc2lkX2xlbl9vcmk6JWRcbiIsCi0JICAgX19mdW5jX18sIGhpZGRlbl9zc2lkX21vZGUsIHNzaWRfaWUsIHNzaWRfbGVuX29yaSk7ICovCi0KLQlpZiAoc3NpZF9pZSAmJiBzc2lkX2xlbl9vcmkgPiAwKSB7Ci0JCXN3aXRjaCAoaGlkZGVuX3NzaWRfbW9kZSkgewotCQljYXNlIDE6Ci0JCQluZXh0X2llID0gc3NpZF9pZSArIDIgKyBzc2lkX2xlbl9vcmk7Ci0JCQlyZW1haW5fbGVuID0gaWVzX2xlbiAtKG5leHRfaWUtaWVzKTsKLQotCQkJc3NpZF9pZVsxXSA9IDA7Ci0JCQltZW1jcHkoc3NpZF9pZSsyLCBuZXh0X2llLCByZW1haW5fbGVuKTsKLQkJCWxlbl9kaWZmIC09IHNzaWRfbGVuX29yaTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCW1lbXNldCgmc3NpZF9pZVsyXSwgMCwgc3NpZF9sZW5fb3JpKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gbGVuX2RpZmY7Ci19Ci0KLXZvaWQgaXNzdWVfYmVhY29uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGludCB0aW1lb3V0X21zKQotewotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXVuc2lnbmVkIGNoYXIgKnBmcmFtZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0JdW5zaWduZWQgaW50IHJhdGVfbGVuOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JdTggYmNfYWRkcltdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotCWNvbnN0IHU4ICp3cHNfaWU7Ci0JdTggc3IgPSAwOwotCWludCBsZW5fZGlmZjsKLQotCS8qIERCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsgKi8KLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpIHsKLQkJREJHXzg3MjNBKCIlcywgYWxsb2MgbWdudCBmcmFtZSBmYWlsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmJjbl91cGRhdGVfbG9jayk7Ci0jZW5kaWYKLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0JcGF0dHJpYi0+cXNlbCA9IDB4MTA7Ci0KLQltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7Ci0KLQlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXBmcmFtZTsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pOwotCW1nbXQtPnNlcV9jdHJsID0gMDsKLQotCWV0aGVyX2FkZHJfY29weShtZ210LT5kYSwgYmNfYWRkcik7Ci0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPnNhLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwotCWV0aGVyX2FkZHJfY29weShtZ210LT5ic3NpZCwgZ2V0X215X2Jzc2lkMjNhKGN1cl9uZXR3b3JrKSk7Ci0KLQkvKiB0aW1lc3RhbXAgd2lsbCBiZSBpbnNlcnRlZCBieSBoYXJkd2FyZSAqLwotCi0JcHV0X3VuYWxpZ25lZF9sZTE2KGN1cl9uZXR3b3JrLT5iZWFjb25faW50ZXJ2YWwsCi0JCQkgICAmbWdtdC0+dS5iZWFjb24uYmVhY29uX2ludCk7Ci0KLQlwdXRfdW5hbGlnbmVkX2xlMTYoY3VyX25ldHdvcmstPmNhcGFiaWxpdHksCi0JCQkgICAmbWdtdC0+dS5iZWFjb24uY2FwYWJfaW5mbyk7Ci0KLQlwZnJhbWUgPSBtZ210LT51LmJlYWNvbi52YXJpYWJsZTsKLQlwYXR0cmliLT5wa3RsZW4gPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKLQotCWlmICgocG1sbWVpbmZvLT5zdGF0ZSAmIDB4MDMpID09IE1TUl9BUCkgewotCQl1OCAqaWVidWY7Ci0JCWludCBidWZsZW47Ci0JCS8qIERCR184NzIzQSgiaWUgbGVuID0lZFxuIiwgY3VyX25ldHdvcmstPklFTGVuZ3RoKTsgKi8KLQkJbWVtY3B5KHBmcmFtZSwgY3VyX25ldHdvcmstPklFcywgY3VyX25ldHdvcmstPklFTGVuZ3RoKTsKLQkJbGVuX2RpZmYgPSB1cGRhdGVfaGlkZGVuX3NzaWQocGZyYW1lLCBjdXJfbmV0d29yay0+SUVMZW5ndGgsCi0JCQkJCSAgICAgIHBtbG1laW5mby0+aGlkZGVuX3NzaWRfbW9kZSk7Ci0JCXBmcmFtZSArPSAoY3VyX25ldHdvcmstPklFTGVuZ3RoK2xlbl9kaWZmKTsKLQkJcGF0dHJpYi0+cGt0bGVuICs9IChjdXJfbmV0d29yay0+SUVMZW5ndGgrbGVuX2RpZmYpOwotCi0JCWllYnVmID0gbWdtdC0+dS5iZWFjb24udmFyaWFibGU7Ci0JCWJ1ZmxlbiA9IHBhdHRyaWItPnBrdGxlbiAtCi0JCQlvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKLQkJd3BzX2llID0gY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xBTl9PVUlfTUlDUk9TT0ZULAotCQkJCQkJIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQUywKLQkJCQkJCSBpZWJ1ZiwgYnVmbGVuKTsKLQotCQlpZiAod3BzX2llICYmIHdwc19pZVsxXSA+IDApIHsKLQkJCXJ0d19nZXRfd3BzX2F0dHJfY29udGVudDIzYSh3cHNfaWUsIHdwc19pZVsxXSwKLQkJCQkJCSAgICBXUFNfQVRUUl9TRUxFQ1RFRF9SRUdJU1RSQVIsCi0JCQkJCQkgICAgKHU4ICopJnNyKTsKLQkJfQotCQlpZiAoc3IgIT0gMCkKLQkJCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9VTkRFUl9XUFMpOwotCQllbHNlCi0JCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgV0lGSV9VTkRFUl9XUFMpOwotCi0JCWdvdG8gX2lzc3VlX2JjbjsKLQl9Ci0KLQkvKiAgU1NJRCAqLwotCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TU0lELAotCQkJICAgICAgIGN1cl9uZXR3b3JrLT5Tc2lkLnNzaWRfbGVuLAotCQkJICAgICAgIGN1cl9uZXR3b3JrLT5Tc2lkLnNzaWQsICZwYXR0cmliLT5wa3RsZW4pOwotCi0JLyogIHN1cHBvcnRlZCByYXRlcy4uLiAqLwotCXJhdGVfbGVuID0gcnR3X2dldF9yYXRlc2V0X2xlbjIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TVVBQX1JBVEVTLAotCQkJICAgICAgICgocmF0ZV9sZW4gPiA4KT8gODogcmF0ZV9sZW4pLAotCQkJICAgICAgIGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcywgJnBhdHRyaWItPnBrdGxlbik7Ci0KLQkvKiAgRFMgcGFyYW1ldGVyIHNldCAqLwotCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9EU19QQVJBTVMsIDEsICh1bnNpZ25lZCBjaGFyICopCi0JCQkgICAgICAgJmN1cl9uZXR3b3JrLT5EU0NvbmZpZywgJnBhdHRyaWItPnBrdGxlbik7Ci0KLQkvKiBpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gTVNSX0FESE9DKSAqLwotCXsKLQkJdTggZXJwaW5mbyA9IDA7Ci0JCXUzMiBBVElNV2luZG93OwotCQkvKiAgSUJTUyBQYXJhbWV0ZXIgU2V0Li4uICovCi0JCS8qIEFUSU1XaW5kb3cgPSBjdXItPkFUSU1XaW5kb3c7ICovCi0JCUFUSU1XaW5kb3cgPSAwOwotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfSUJTU19QQVJBTVMsIDIsCi0JCQkJICAgICAgICh1bnNpZ25lZCBjaGFyICopJkFUSU1XaW5kb3csCi0JCQkJICAgICAgICZwYXR0cmliLT5wa3RsZW4pOwotCi0JCS8qIEVSUCBJRSAqLwotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfRVJQX0lORk8sIDEsCi0JCQkJICAgICAgICZlcnBpbmZvLCAmcGF0dHJpYi0+cGt0bGVuKTsKLQl9Ci0KLQkvKiAgRVhURVJOREVEIFNVUFBPUlRFRCBSQVRFICovCi0JaWYgKHJhdGVfbGVuID4gOCkKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTLAotCQkJCSAgICAgICByYXRlX2xlbiAtIDgsCi0JCQkJICAgICAgIGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcyArIDgsCi0JCQkJICAgICAgICZwYXR0cmliLT5wa3RsZW4pOwotCi0JLyogdG9kbzpIVCBmb3IgYWRob2MgKi8KLQotX2lzc3VlX2JjbjoKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCXBtbG1lcHJpdi0+dXBkYXRlX2JjbiA9IGZhbHNlOwotCi0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+YmNuX3VwZGF0ZV9sb2NrKTsKLSNlbmRpZgotCi0JaWYgKChwYXR0cmliLT5wa3RsZW4gKyBUWERFU0NfU0laRSkgPiA1MTIpIHsKLQkJREJHXzg3MjNBKCJiZWFjb24gZnJhbWUgdG9vIGxhcmdlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IHBhdHRyaWItPnBrdGxlbjsKLQotCS8qIERCR184NzIzQSgiaXNzdWUgYmNuX3N6ID0lZFxuIiwgcGF0dHJpYi0+bGFzdF90eGNtZHN6KTsgKi8KLQlpZiAodGltZW91dF9tcyA+IDApCi0JCWR1bXBfbWdudGZyYW1lMjNhX2FuZF93YWl0KHBhZGFwdGVyLCBwbWdudGZyYW1lLCB0aW1lb3V0X21zKTsKLQllbHNlCi0JCWR1bXBfbWdudGZyYW1lMjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLX0KLQotc3RhdGljIHZvaWQgaXNzdWVfcHJvYmVyc3Aoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqZGEpCi17Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWU7Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWI7Ci0JdW5zaWduZWQgY2hhciAqcGZyYW1lOwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKLQl1bnNpZ25lZCBjaGFyICptYWMsICpic3NpZDsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCWNvbnN0IHU4ICpwd3BzX2llOwotCXU4ICpzc2lkX2llOwotCWludCBzc2lkX2llbGVuOwotCWludCBzc2lkX2llbGVuX2RpZmY7Ci0JdTggYnVmW01BWF9JRV9TWl07Ci0jZW5kaWYKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JdW5zaWduZWQgaW50IHJhdGVfbGVuOwotCi0JLyogREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOyAqLwotCi0JaWYgKGN1cl9uZXR3b3JrLT5JRUxlbmd0aCA+IE1BWF9JRV9TWikKLQkJcmV0dXJuOwotCi0JcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwotCWlmICghcG1nbnRmcmFtZSkgewotCQlEQkdfODcyM0EoIiVzLCBhbGxvYyBtZ250IGZyYW1lIGZhaWxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0KLQltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7Ci0KLQlwZnJhbWUgPSAodTggKilwbWdudGZyYW1lLT5idWZfYWRkciArIFRYREVTQ19PRkZTRVQ7Ci0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilwZnJhbWU7Ci0KLQltYWMgPSBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdik7Ci0JYnNzaWQgPSBjdXJfbmV0d29yay0+TWFjQWRkcmVzczsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKTsKLQotCWV0aGVyX2FkZHJfY29weShtZ210LT5kYSwgZGEpOwotCWV0aGVyX2FkZHJfY29weShtZ210LT5zYSwgbWFjKTsKLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+YnNzaWQsIGJzc2lkKTsKLQotCW1nbXQtPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NOX1RPX1NFUShwbWxtZWV4dC0+bWdudF9zZXEpKTsKLQlwbWxtZWV4dC0+bWdudF9zZXErKzsKLQotCXBhdHRyaWItPmhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0KLQkvKiB0aW1lc3RhbXAgd2lsbCBiZSBpbnNlcnRlZCBieSBoYXJkd2FyZSAqLwotCXB1dF91bmFsaWduZWRfbGUxNihjdXJfbmV0d29yay0+YmVhY29uX2ludGVydmFsLAotCQkJICAgJm1nbXQtPnUucHJvYmVfcmVzcC5iZWFjb25faW50KTsKLQotCXB1dF91bmFsaWduZWRfbGUxNihjdXJfbmV0d29yay0+Y2FwYWJpbGl0eSwKLQkJCSAgICZtZ210LT51LnByb2JlX3Jlc3AuY2FwYWJfaW5mbyk7Ci0KLQlwZnJhbWUgPSBtZ210LT51LnByb2JlX3Jlc3AudmFyaWFibGU7Ci0JcGF0dHJpYi0+cGt0bGVuID0KLQkJb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LnByb2JlX3Jlc3AudmFyaWFibGUpOwotCi0JLyogYmVsb3cgZm9yIGFkLWhvYyBtb2RlICovCi0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlpZiAoKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfQVApIHsKLQkJcHdwc19pZSA9IGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkJCSAgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV1BTLAotCQkJCQkJICBjdXJfbmV0d29yay0+SUVzLAotCQkJCQkJICBjdXJfbmV0d29yay0+SUVMZW5ndGgpOwotCi0JCW1lbWNweShwZnJhbWUsIGN1cl9uZXR3b3JrLT5JRXMsIGN1cl9uZXR3b3JrLT5JRUxlbmd0aCk7Ci0JCXBmcmFtZSArPSBjdXJfbmV0d29yay0+SUVMZW5ndGg7Ci0JCXBhdHRyaWItPnBrdGxlbiArPSBjdXJfbmV0d29yay0+SUVMZW5ndGg7Ci0KLQkJLyogcmV0cmlldmUgU1NJRCBJRSBmcm9tIGN1cl9uZXR3b3JrLT5Tc2lkICovCi0KLQkJc3NpZF9pZSA9IHJ0d19nZXRfaWUyM2EobWdtdC0+dS5wcm9iZV9yZXNwLnZhcmlhYmxlLAotCQkJCQlXTEFOX0VJRF9TU0lELCAmc3NpZF9pZWxlbiwKLQkJCQkJcGZyYW1lIC0gbWdtdC0+dS5wcm9iZV9yZXNwLnZhcmlhYmxlKTsKLQotCQlzc2lkX2llbGVuX2RpZmYgPSBjdXJfbmV0d29yay0+U3NpZC5zc2lkX2xlbiAtIHNzaWRfaWVsZW47Ci0KLQkJaWYgKHNzaWRfaWUgJiYgY3VyX25ldHdvcmstPlNzaWQuc3NpZF9sZW4pIHsKLQkJCXVpbnQgcmVtYWluZGVyX2llbGVuOwotCQkJdTggKnJlbWFpbmRlcl9pZTsKLQotCQkJcmVtYWluZGVyX2llID0gc3NpZF9pZSArIDI7Ci0KLQkJCXJlbWFpbmRlcl9pZWxlbiA9IHBmcmFtZSAtIHJlbWFpbmRlcl9pZTsKLQotCQkJREJHXzg3MjNBX0xFVkVMKF9kcnZfd2FybmluZ18sICIlcyglcyk6ICIKLQkJCQkJInJlbWFpbmRlcl9pZWxlbiA+IE1BWF9JRV9TWlxuIiwKLQkJCQkJX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQkJCWlmIChyZW1haW5kZXJfaWVsZW4gPiBNQVhfSUVfU1opCi0JCQkJcmVtYWluZGVyX2llbGVuID0gTUFYX0lFX1NaOwotCi0JCQltZW1jcHkoYnVmLCByZW1haW5kZXJfaWUsIHJlbWFpbmRlcl9pZWxlbik7Ci0JCQltZW1jcHkocmVtYWluZGVyX2llICsgc3NpZF9pZWxlbl9kaWZmLCBidWYsCi0JCQkgICAgICAgcmVtYWluZGVyX2llbGVuKTsKLQkJCSooc3NpZF9pZSArIDEpID0gY3VyX25ldHdvcmstPlNzaWQuc3NpZF9sZW47Ci0JCQltZW1jcHkoc3NpZF9pZSArIDIsIGN1cl9uZXR3b3JrLT5Tc2lkLnNzaWQsCi0JCQkgICAgICAgY3VyX25ldHdvcmstPlNzaWQuc3NpZF9sZW4pOwotCi0JCQlwZnJhbWUgKz0gc3NpZF9pZWxlbl9kaWZmOwotCQkJcGF0dHJpYi0+cGt0bGVuICs9IHNzaWRfaWVsZW5fZGlmZjsKLQkJfQotCX0gZWxzZQotI2VuZGlmCi0JewotCQkvKiAgU1NJRCAqLwotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfU1NJRCwKLQkJCQkgICAgICAgY3VyX25ldHdvcmstPlNzaWQuc3NpZF9sZW4sCi0JCQkJICAgICAgIGN1cl9uZXR3b3JrLT5Tc2lkLnNzaWQsCi0JCQkJICAgICAgICZwYXR0cmliLT5wa3RsZW4pOwotCi0JCS8qICBzdXBwb3J0ZWQgcmF0ZXMuLi4gKi8KLQkJcmF0ZV9sZW4gPSBydHdfZ2V0X3JhdGVzZXRfbGVuMjNhKGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcyk7Ci0JCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TVVBQX1JBVEVTLAotCQkJCSAgICAgICAoKHJhdGVfbGVuID4gOCk/IDg6IHJhdGVfbGVuKSwKLQkJCQkgICAgICAgY3VyX25ldHdvcmstPlN1cHBvcnRlZFJhdGVzLAotCQkJCSAgICAgICAmcGF0dHJpYi0+cGt0bGVuKTsKLQotCQkvKiAgRFMgcGFyYW1ldGVyIHNldCAqLwotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfRFNfUEFSQU1TLCAxLAotCQkJCSAgICAgICAodW5zaWduZWQgY2hhciAqKSZjdXJfbmV0d29yay0+RFNDb25maWcsCi0JCQkJICAgICAgICZwYXR0cmliLT5wa3RsZW4pOwotCi0JCWlmICgocG1sbWVpbmZvLT5zdGF0ZSAmIDB4MDMpID09IE1TUl9BREhPQykgewotCQkJdTggZXJwaW5mbyA9IDA7Ci0JCQl1MzIgQVRJTVdpbmRvdzsKLQkJCS8qICBJQlNTIFBhcmFtZXRlciBTZXQuLi4gKi8KLQkJCS8qIEFUSU1XaW5kb3cgPSBjdXItPkFUSU1XaW5kb3c7ICovCi0JCQlBVElNV2luZG93ID0gMDsKLQkJCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9JQlNTX1BBUkFNUywgMiwKLQkJCQkJICAgICAgICh1bnNpZ25lZCBjaGFyICopJkFUSU1XaW5kb3csCi0JCQkJCSAgICAgICAmcGF0dHJpYi0+cGt0bGVuKTsKLQotCQkJLyogRVJQIElFICovCi0JCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfRVJQX0lORk8sIDEsCi0JCQkJCSAgICAgICAmZXJwaW5mbywgJnBhdHRyaWItPnBrdGxlbik7Ci0JCX0KLQotCQkvKiAgRVhURVJOREVEIFNVUFBPUlRFRCBSQVRFICovCi0JCWlmIChyYXRlX2xlbiA+IDgpCi0JCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfRVhUX1NVUFBfUkFURVMsCi0JCQkJCSAgICAgICByYXRlX2xlbiAtIDgsCi0JCQkJCSAgICAgICBjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMgKyA4LAotCQkJCQkgICAgICAgJnBhdHRyaWItPnBrdGxlbik7Ci0KLQkJLyogdG9kbzpIVCBmb3IgYWRob2MgKi8KLQl9Ci0KLQlwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBwYXR0cmliLT5wa3RsZW47Ci0KLQlkdW1wX21nbnRmcmFtZTIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci19Ci0KLXN0YXRpYyBpbnQgX2lzc3VlX3Byb2JlcmVxKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICBzdHJ1Y3QgY2ZnODAyMTFfc3NpZCAqcHNzaWQsIHU4ICpkYSwgaW50IHdhaXRfYWNrKQotewotCWludCByZXQgPSBfRkFJTDsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQl1bnNpZ25lZCBjaGFyICpwZnJhbWU7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwotCXVuc2lnbmVkIGNoYXIgKm1hYzsKLQl1bnNpZ25lZCBjaGFyIGJzc3JhdGVbTnVtUmF0ZXNdOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCWludCBic3NyYXRlX2xlbiA9IDA7Ci0JdTggYmNfYWRkcltdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywKLQkJICIrJXNcbiIsIF9fZnVuY19fKTsKLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpCi0JCWdvdG8gZXhpdDsKLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0KLQltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7Ci0KLQlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKLQotCW1hYyA9IG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KTsKLQotCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAotCQkJCQkgICAgICBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRKTsKLQotCWlmIChkYSkgewotCQkvKgl1bmljYXN0IHByb2JlIHJlcXVlc3QgZnJhbWUgKi8KLQkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEpOwotCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBkYSk7Ci0JfSBlbHNlIHsKLQkJLyoJYnJvYWRjYXN0IHByb2JlIHJlcXVlc3QgZnJhbWUgKi8KLQkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgYmNfYWRkcik7Ci0JCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIGJjX2FkZHIpOwotCX0KLQotCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG1hYyk7Ci0KLQlwd2xhbmhkci0+c2VxX2N0cmwgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfU05fVE9fU0VRKHBtbG1lZXh0LT5tZ250X3NlcSkpOwotCi0JcG1sbWVleHQtPm1nbnRfc2VxKys7Ci0KLQlwZnJhbWUgKz0gc2l6ZW9mIChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mIChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0KLQlpZiAocHNzaWQpCi0JCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TU0lELCBwc3NpZC0+c3NpZF9sZW4sCi0JCQkJICAgICAgIHBzc2lkLT5zc2lkLCAmcGF0dHJpYi0+cGt0bGVuKTsKLQllbHNlCi0JCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TU0lELCAwLCBOVUxMLAotCQkJCSAgICAgICAmcGF0dHJpYi0+cGt0bGVuKTsKLQotCWdldF9yYXRlX3NldDIzYShwYWRhcHRlciwgYnNzcmF0ZSwgJmJzc3JhdGVfbGVuKTsKLQotCWlmIChic3NyYXRlX2xlbiA+IDgpIHsKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX1NVUFBfUkFURVMsIDgsCi0JCQkJICAgICAgIGJzc3JhdGUsICZwYXR0cmliLT5wa3RsZW4pOwotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfRVhUX1NVUFBfUkFURVMsCi0JCQkJICAgICAgIChic3NyYXRlX2xlbiAtIDgpLCAoYnNzcmF0ZSArIDgpLAotCQkJCSAgICAgICAmcGF0dHJpYi0+cGt0bGVuKTsKLQl9IGVsc2UgewotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfU1VQUF9SQVRFUywKLQkJCQkgICAgICAgYnNzcmF0ZV9sZW4sIGJzc3JhdGUsICZwYXR0cmliLT5wa3RsZW4pOwotCX0KLQotCS8qIGFkZCB3cHNfaWUgZm9yIHdwczIuMCAqLwotCWlmIChwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWVfbGVuPjAgJiYgcG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llKSB7Ci0JCW1lbWNweShwZnJhbWUsIHBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSwKLQkJICAgICAgIHBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZV9sZW4pOwotCQlwZnJhbWUgKz0gcG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llX2xlbjsKLQkJcGF0dHJpYi0+cGt0bGVuICs9IHBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZV9sZW47Ci0JfQotCi0JcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywKLQkJICJpc3N1aW5nIHByb2JlX3JlcSwgdHhfbGVuID0lZFxuIiwgcGF0dHJpYi0+bGFzdF90eGNtZHN6KTsKLQotCWlmICh3YWl0X2FjaykgewotCQlyZXQgPSBkdW1wX21nbnRmcmFtZTIzYV9hbmRfd2FpdF9hY2syM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotCX0gZWxzZSB7Ci0JCWR1bXBfbWdudGZyYW1lMjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0JfQotCi1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpc3N1ZV9wcm9iZXJlcShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgc3RydWN0IGNmZzgwMjExX3NzaWQgKnBzc2lkLCB1OCAqZGEpCi17Ci0JX2lzc3VlX3Byb2JlcmVxKHBhZGFwdGVyLCBwc3NpZCwgZGEsIGZhbHNlKTsKLX0KLQotc3RhdGljIGludCBpc3N1ZV9wcm9iZXJlcV9leChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICBzdHJ1Y3QgY2ZnODAyMTFfc3NpZCAqcHNzaWQsIHU4ICpkYSwKLQkJCSAgICAgaW50IHRyeV9jbnQsIGludCB3YWl0X21zKQotewotCWludCByZXQ7Ci0JaW50IGkgPSAwOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOwotCi0JZG8gewotCQlyZXQgPSBfaXNzdWVfcHJvYmVyZXEocGFkYXB0ZXIsIHBzc2lkLCBkYSwKLQkJCQkgICAgICB3YWl0X21zID4gMCA/IHRydWUgOiBmYWxzZSk7Ci0KLQkJaSsrOwotCi0JCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpCi0JCQlicmVhazsKLQotCQlpZiAoaSA8IHRyeV9jbnQgJiYgd2FpdF9tcyA+IDAgJiYgcmV0ID09IF9GQUlMKQotCQkJbXNsZWVwKHdhaXRfbXMpOwotCi0JfSB3aGlsZSgoaSA8IHRyeV9jbnQpICYmICgocmV0ID09IF9GQUlMKSB8fCAod2FpdF9tcyA9PSAwKSkpOwotCi0JaWYgKHJldCAhPSBfRkFJTCkgewotCQlyZXQgPSBfU1VDQ0VTUzsKLQkJZ290byBleGl0OwotCX0KLQotCWlmICh0cnlfY250ICYmIHdhaXRfbXMpIHsKLQkJaWYgKGRhKQotCQkJREJHXzg3MjNBKCIlcyglcyk6IHRvICVwTSwgY2g6JXUlcywgJWQvJWQgaW4gJXUgbXNcbiIsCi0JCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCQkJICBkYSwgcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSwKLQkJCQkgIHJldCA9PSBfU1VDQ0VTUyA/ICIsIGFja2VkIiA6ICIiLCBpLCB0cnlfY250LAotCQkJCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpKTsKLQkJZWxzZQotCQkJREJHXzg3MjNBKCIlcyglcyk6LCBjaDoldSVzLCAlZC8lZCBpbiAldSBtc1xuIiwKLQkJCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKLQkJCQkgIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCi0JCQkJICByZXQgPT0gX1NVQ0NFU1MgPyAiLCBhY2tlZCIgOiAiIiwgaSwgdHJ5X2NudCwKLQkJCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KSk7Ci0JfQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi0vKiAgaWYgcHN0YSA9PSBOVUxMLCBpbmRpYXRlIHdlIGFyZSBzdGF0aW9uKGNsaWVudCkgbm93Li4uICovCi1zdGF0aWMgdm9pZCBpc3N1ZV9hdXRoKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSwKLQkJICAgICAgIHVuc2lnbmVkIHNob3J0IHN0YXR1cykKLXsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQl1bnNpZ25lZCBjaGFyICpwZnJhbWU7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCXVuc2lnbmVkIGludCB2YWwzMjsKLQl1MTYgYXV0aF9hbGdvOwotCWludCB1c2Vfc2hhcmVkX2tleSA9IDA7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwotCWlmICghcG1nbnRmcmFtZSkKLQkJcmV0dXJuOwotCi0JLyogdXBkYXRlIGF0dHJpYnV0ZSAqLwotCXBhdHRyaWIgPSAmcG1nbnRmcmFtZS0+YXR0cmliOwotCXVwZGF0ZV9tZ250ZnJhbWVfYXR0cmliMjNhKHBhZGFwdGVyLCBwYXR0cmliKTsKLQotCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKLQotCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopcGZyYW1lOwotCi0JbWdtdC0+ZnJhbWVfY29udHJvbCA9Ci0JCWNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwgSUVFRTgwMjExX1NUWVBFX0FVVEgpOwotCW1nbXQtPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NOX1RPX1NFUShwbWxtZWV4dC0+bWdudF9zZXEpKTsKLQlwbWxtZWV4dC0+bWdudF9zZXErKzsKLQotCXBhdHRyaWItPnBrdGxlbiA9IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5hdXRoLnZhcmlhYmxlKTsKLQotCWlmIChwc3RhKSB7IC8qICBmb3IgQVAgbW9kZSAqLwotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCQl1bnNpZ25lZCBzaG9ydCB2YWwxNjsKLQotCQlldGhlcl9hZGRyX2NvcHkobWdtdC0+ZGEsIHBzdGEtPmh3YWRkcik7Ci0JCWV0aGVyX2FkZHJfY29weShtZ210LT5zYSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpKTsKLQkJZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmJzc2lkLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwotCi0JCS8qICBzZXR0aW5nIGF1dGggYWxnbyBudW1iZXIgKi8KLQkJdmFsMTYgPSAodTE2KXBzdGEtPmF1dGhhbGc7Ci0KLQkJaWYgKHN0YXR1cyAhPSBXTEFOX1NUQVRVU19TVUNDRVNTKQotCQkJdmFsMTYgPSAwOwotCi0JCWlmICh2YWwxNikKLQkJCXVzZV9zaGFyZWRfa2V5ID0gMTsKLQotCQltZ210LT51LmF1dGguYXV0aF9hbGcgPSBjcHVfdG9fbGUxNih2YWwxNik7Ci0KLQkJLyogIHNldHRpbmcgYXV0aCBzZXEgbnVtYmVyICovCi0JCW1nbXQtPnUuYXV0aC5hdXRoX3RyYW5zYWN0aW9uID0KLQkJCWNwdV90b19sZTE2KCh1MTYpcHN0YS0+YXV0aF9zZXEpOwotCi0JCS8qICBzZXR0aW5nIHN0YXR1cyBjb2RlLi4uICovCi0JCW1nbXQtPnUuYXV0aC5zdGF0dXNfY29kZSA9IGNwdV90b19sZTE2KHN0YXR1cyk7Ci0KLQkJcGZyYW1lID0gbWdtdC0+dS5hdXRoLnZhcmlhYmxlOwotCQkvKiAgYWRkZWQgY2hhbGxlbmdpbmcgdGV4dC4uLiAqLwotCQlpZiAoKHBzdGEtPmF1dGhfc2VxID09IDIpICYmCi0JCSAgICAocHN0YS0+c3RhdGUgJiBXSUZJX0ZXX0FVVEhfU1RBVEUpICYmICh1c2Vfc2hhcmVkX2tleSA9PSAxKSkKLQkJCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9DSEFMTEVOR0UsIDEyOCwKLQkJCQkJICAgICAgIHBzdGEtPmNoZ190eHQsICZwYXR0cmliLT5wa3RsZW4pOwotI2VuZGlmCi0JfSBlbHNlIHsKLQkJc3RydWN0IGllZWU4MDIxMV9tZ210ICppdl9tZ210OwotCi0JCWV0aGVyX2FkZHJfY29weShtZ210LT5kYSwgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKTsKLQkJZXRoZXJfYWRkcl9jb3B5KG1nbXQtPnNhLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwotCQlldGhlcl9hZGRyX2NvcHkobWdtdC0+YnNzaWQsCi0JCQkJZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKTsKLQotCQkvKiAgc2V0dGluZyBhdXRoIGFsZ28gbnVtYmVyICovCi0JCS8qICAwOk9QRU4gU3lzdGVtLCAxOlNoYXJlZCBrZXkgKi8KLQkJaWYgKHBtbG1laW5mby0+YXV0aF9hbGdvID09IGRvdDExQXV0aEFsZ3J0aG1fU2hhcmVkKSB7Ci0JCQl1c2Vfc2hhcmVkX2tleSA9IDE7Ci0JCQlhdXRoX2FsZ28gPSBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKLQkJfSBlbHNlCi0JCQlhdXRoX2FsZ28gPSBXTEFOX0FVVEhfT1BFTjsKLQotCQkvKiBEQkdfODcyM0EoIiVzIGF1dGhfYWxnbyA9ICVzIGF1dGhfc2VxID0lZFxuIiwgX19mdW5jX18sCi0JCSAgIChwbWxtZWluZm8tPmF1dGhfYWxnbyA9PSAwKT8iT1BFTiI6IlNIQVJFRCIsCi0JCSAgIHBtbG1laW5mby0+YXV0aF9zZXEpOyAqLwotCi0JCS8qIHNldHRpbmcgSVYgZm9yIGF1dGggc2VxICMzICovCi0JCWlmICgocG1sbWVpbmZvLT5hdXRoX3NlcSA9PSAzKSAmJgotCQkgICAgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FVVEhfU1RBVEUpICYmCi0JCSAgICAodXNlX3NoYXJlZF9rZXkgPT0gMSkpIHsKLQkJCXUzMiAqcGl2ID0gKHUzMiAqKSZtZ210LT51LmF1dGg7Ci0KLQkJCWl2X21nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopKHBmcmFtZSArIDQpOwotCQkJLyogREJHXzg3MjNBKCI9PT4gaXYoJWQpLCBrZXlfaW5kZXgoJWQpXG4iLAotCQkJICAgcG1sbWVpbmZvLT5pdiwgcG1sbWVpbmZvLT5rZXlfaW5kZXgpOyAqLwotCQkJdmFsMzIgPSAocG1sbWVpbmZvLT5pdiAmIDB4M2ZmZmZmZmYpIHwKLQkJCQkocG1sbWVpbmZvLT5rZXlfaW5kZXggPDwgMzApOwotCQkJcG1sbWVpbmZvLT5pdisrOwotCQkJcHV0X3VuYWxpZ25lZF9sZTMyKHZhbDMyLCBwaXYpOwotCi0JCQlwYXR0cmliLT5wa3RsZW4gKz0gNDsKLQotCQkJcGF0dHJpYi0+aXZfbGVuID0gSUVFRTgwMjExX1dFUF9JVl9MRU47Ci0JCX0gZWxzZQotCQkJaXZfbWdtdCA9IG1nbXQ7Ci0KLQkJaXZfbWdtdC0+dS5hdXRoLmF1dGhfYWxnID0gY3B1X3RvX2xlMTYoYXV0aF9hbGdvKTsKLQotCQkvKiAgc2V0dGluZyBhdXRoIHNlcSBudW1iZXIgKi8KLQkJaXZfbWdtdC0+dS5hdXRoLmF1dGhfdHJhbnNhY3Rpb24gPQotCQkJY3B1X3RvX2xlMTYocG1sbWVpbmZvLT5hdXRoX3NlcSk7Ci0KLQkJLyogIHNldHRpbmcgc3RhdHVzIGNvZGUuLi4gKi8KLQkJaXZfbWdtdC0+dS5hdXRoLnN0YXR1c19jb2RlID0gY3B1X3RvX2xlMTYoc3RhdHVzKTsKLQotCQlwZnJhbWUgPSBpdl9tZ210LT51LmF1dGgudmFyaWFibGU7Ci0KLQkJLyogIHRoZW4gY2hlY2tpbmcgdG8gc2VlIGlmIHNlbmRpbmcgY2hhbGxlbmdpbmcgdGV4dC4uLiAqLwotCQlpZiAoKHBtbG1laW5mby0+YXV0aF9zZXEgPT0gMykgJiYKLQkJICAgIChwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BVVRIX1NUQVRFKSAmJgotCQkgICAgKHVzZV9zaGFyZWRfa2V5ID09IDEpKSB7Ci0JCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfQ0hBTExFTkdFLCAxMjgsCi0JCQkJCSAgICAgICBwbWxtZWluZm8tPmNoZ190eHQsCi0JCQkJCSAgICAgICAmcGF0dHJpYi0+cGt0bGVuKTsKLQotCQkJbWdtdC0+ZnJhbWVfY29udHJvbCB8PQotCQkJCWNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCk7Ci0KLQkJCXBhdHRyaWItPmhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0KLQkJCXBhdHRyaWItPmVuY3J5cHQgPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDsKLQotCQkJcGF0dHJpYi0+aWN2X2xlbiA9IElFRUU4MDIxMV9XRVBfSUNWX0xFTjsKLQotCQkJcGF0dHJpYi0+cGt0bGVuICs9IHBhdHRyaWItPmljdl9sZW47Ci0JCX0KLQl9Ci0KLQlwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBwYXR0cmliLT5wa3RsZW47Ci0KLQlydHdfd2VwX2VuY3J5cHQyM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQlkdW1wX21nbnRmcmFtZTIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLXN0YXRpYyB2b2lkIGlzc3VlX2Fzc29jcnNwKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIHNob3J0IHN0YXR1cywKLQkJCSAgIHN0cnVjdCBzdGFfaW5mbyAqcHN0YXQsIHUxNiBwa3RfdHlwZSkKLXsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWI7Ci0JdW5zaWduZWQgY2hhciAqcGZyYW1lOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JY29uc3QgdTggKnA7Ci0JdTggKmllID0gcG5ldHdvcmstPklFczsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpCi0JCXJldHVybjsKLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0KLQltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7Ci0KLQlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXBmcmFtZTsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IHBrdF90eXBlKTsKLQotCWV0aGVyX2FkZHJfY29weShtZ210LT5kYSwgcHN0YXQtPmh3YWRkcik7Ci0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPnNhLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwotCWV0aGVyX2FkZHJfY29weShtZ210LT5ic3NpZCwgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKTsKLQotCW1nbXQtPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NOX1RPX1NFUShwbWxtZWV4dC0+bWdudF9zZXEpKTsKLQotCXBtbG1lZXh0LT5tZ250X3NlcSsrOwotCi0JcGF0dHJpYi0+aGRybGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlwYXR0cmliLT5wa3RsZW4gPQotCQlvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYXNzb2NfcmVzcC52YXJpYWJsZSk7Ci0KLQltZ210LT51LmFzc29jX3Jlc3AuY2FwYWJfaW5mbyA9IGNwdV90b19sZTE2KHBuZXR3b3JrLT5jYXBhYmlsaXR5KTsKLQltZ210LT51LmFzc29jX3Jlc3Auc3RhdHVzX2NvZGUgPSBjcHVfdG9fbGUxNihzdGF0dXMpOwotCW1nbXQtPnUuYXNzb2NfcmVzcC5haWQgPSBjcHVfdG9fbGUxNihwc3RhdC0+YWlkIHwgQklUKDE0KSB8IEJJVCgxNSkpOwotCi0JcGZyYW1lID0gbWdtdC0+dS5hc3NvY19yZXNwLnZhcmlhYmxlOwotCi0JaWYgKHBzdGF0LT5ic3NyYXRlbGVuIDw9IDgpIHsKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX1NVUFBfUkFURVMsCi0JCQkJICAgICAgIHBzdGF0LT5ic3NyYXRlbGVuLCBwc3RhdC0+YnNzcmF0ZXNldCwKLQkJCQkgICAgICAgJnBhdHRyaWItPnBrdGxlbik7Ci0JfSBlbHNlIHsKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX1NVUFBfUkFURVMsIDgsCi0JCQkJICAgICAgIHBzdGF0LT5ic3NyYXRlc2V0LCAmcGF0dHJpYi0+cGt0bGVuKTsKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTLAotCQkJCSAgICAgICBwc3RhdC0+YnNzcmF0ZWxlbiAtIDgsCi0JCQkJICAgICAgIHBzdGF0LT5ic3NyYXRlc2V0ICsgOCwgJnBhdHRyaWItPnBrdGxlbik7Ci0JfQotCi0JaWYgKHBzdGF0LT5mbGFncyAmIFdMQU5fU1RBX0hUICYmIHBtbG1lcHJpdi0+aHRwcml2Lmh0X29wdGlvbikgewotCQkvKiBGSUxMIEhUIENBUCBJTkZPIElFICovCi0JCS8qIHAgPSBob3N0YXBkX2VpZF9odF9jYXBhYmlsaXRpZXNfaW5mbyhoYXBkLCBwKTsgKi8KLQkJcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfSFRfQ0FQQUJJTElUWSwgaWUsCi0JCQkJICAgICBwbmV0d29yay0+SUVMZW5ndGgpOwotCQlpZiAocCAmJiBwWzFdKSB7Ci0JCQltZW1jcHkocGZyYW1lLCBwLCBwWzFdICsgMik7Ci0JCQlwZnJhbWUgKz0gKHBbMV0gKyAyKTsKLQkJCXBhdHRyaWItPnBrdGxlbiArPSAocFsxXSArIDIpOwotCQl9Ci0KLQkJLyogRklMTCBIVCBBREQgSU5GTyBJRSAqLwotCQkvKiBwID0gaG9zdGFwZF9laWRfaHRfb3BlcmF0aW9uKGhhcGQsIHApOyAqLwotCQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9IVF9PUEVSQVRJT04sIGllLAotCQkJCSAgICAgcG5ldHdvcmstPklFTGVuZ3RoKTsKLQkJaWYgKHAgJiYgcFsxXSA+IDApIHsKLQkJCW1lbWNweShwZnJhbWUsIHAsIHBbMV0gKyAyKTsKLQkJCXBmcmFtZSArPSAocFsxXSArIDIpOwotCQkJcGF0dHJpYi0+cGt0bGVuICs9IChwWzFdICsgMik7Ci0JCX0KLQl9Ci0KLQkvKiBGSUxMIFdNTSBJRSAqLwotCWlmIChwc3RhdC0+ZmxhZ3MgJiBXTEFOX1NUQV9XTUUgJiYgcG1sbWVwcml2LT5xb3Nfb3B0aW9uKSB7Ci0JCXVuc2lnbmVkIGNoYXIgV01NX1BBUkFfSUVbXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLAotCQkJCQkgICAgICAgMHgwMSwgMHgwMX07Ci0JCWludCBpZV9sZW4gPSAwOwotCi0JCWZvciAocCA9IGllOyA7IHAgKz0gKGllX2xlbiArIDIpKSB7Ci0JCQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMsIHAsCi0JCQkJCSAgICAgcG5ldHdvcmstPklFTGVuZ3RoIC0gKGllX2xlbiArIDIpKTsKLQkJCWlmIChwKQotCQkJCWllX2xlbiA9IHBbMV07Ci0JCQllbHNlCi0JCQkJaWVfbGVuID0gMDsKLQkJCWlmIChwICYmICFtZW1jbXAocCArIDIsIFdNTV9QQVJBX0lFLCA2KSkgewotCQkJCW1lbWNweShwZnJhbWUsIHAsIGllX2xlbiArIDIpOwotCQkJCXBmcmFtZSArPSAoaWVfbGVuICsgMik7Ci0JCQkJcGF0dHJpYi0+cGt0bGVuICs9IChpZV9sZW4gKyAyKTsKLQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoIXAgfHwgaWVfbGVuID09IDApCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAocG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3IgPT0gSFRfSU9UX1BFRVJfUkVBTFRFSykgewotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDLCA2LAotCQkJCSAgICAgICBSRUFMVEVLXzk2Ql9JRSwgJnBhdHRyaWItPnBrdGxlbik7Ci0JfQotCi0JcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwotCi0JZHVtcF9tZ250ZnJhbWUyM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGlzc3VlX2Fzc29jcmVxKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaW50IHJldCA9IF9GQUlMOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXVuc2lnbmVkIGNoYXIgKnBmcmFtZTsKLQljb25zdCB1OCAqcDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0JdW5zaWduZWQgaW50IGksIGosIGluZGV4ID0gMDsKLQl1bnNpZ25lZCBjaGFyIHJmX3R5cGUsIGJzc3JhdGVbTnVtUmF0ZXNdLCBzdGFfYnNzcmF0ZVtOdW1SYXRlc107Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JaW50IGJzc3JhdGVfbGVuID0gMCwgc3RhX2Jzc3JhdGVfbGVuID0gMCwgcGllX2xlbjsKLQl1OCAqcGllOwotCi0JcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwotCWlmICghcG1nbnRmcmFtZSkKLQkJZ290byBleGl0OwotCi0JLyogdXBkYXRlIGF0dHJpYnV0ZSAqLwotCXBhdHRyaWIgPSAmcG1nbnRmcmFtZS0+YXR0cmliOwotCXVwZGF0ZV9tZ250ZnJhbWVfYXR0cmliMjNhKHBhZGFwdGVyLCBwYXR0cmliKTsKLQotCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKLQotCXBmcmFtZSA9ICh1OCAqKXBtZ250ZnJhbWUtPmJ1Zl9hZGRyICsgVFhERVNDX09GRlNFVDsKLQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXBmcmFtZTsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEpOwotCi0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmRhLCBnZXRfbXlfYnNzaWQyM2EoJnBtbG1laW5mby0+bmV0d29yaykpOwotCWV0aGVyX2FkZHJfY29weShtZ210LT5zYSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpKTsKLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+YnNzaWQsIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSk7Ci0KLQltZ210LT5zZXFfY3RybCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TTl9UT19TRVEocG1sbWVleHQtPm1nbnRfc2VxKSk7Ci0JcG1sbWVleHQtPm1nbnRfc2VxKys7Ci0KLQkvKiBjYXBzICovCi0JcHV0X3VuYWxpZ25lZF9sZTE2KHBtbG1laW5mby0+bmV0d29yay5jYXBhYmlsaXR5LAotCQkJICAgJm1nbXQtPnUuYXNzb2NfcmVxLmNhcGFiX2luZm8pOwotCS8qIHRvZG86IGxpc3RlbiBpbnRlcnZhbCBmb3IgcG93ZXIgc2F2aW5nICovCi0JcHV0X3VuYWxpZ25lZF9sZTE2KDMsICZtZ210LT51LmFzc29jX3JlcS5saXN0ZW5faW50ZXJ2YWwpOwotCi0JcGZyYW1lID0gbWdtdC0+dS5hc3NvY19yZXEudmFyaWFibGU7Ci0JcGF0dHJpYi0+cGt0bGVuID0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmFzc29jX3JlcS52YXJpYWJsZSk7Ci0KLQkvKiBTU0lEICovCi0JcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX1NTSUQsCi0JCQkgICAgICAgcG1sbWVpbmZvLT5uZXR3b3JrLlNzaWQuc3NpZF9sZW4sCi0JCQkgICAgICAgcG1sbWVpbmZvLT5uZXR3b3JrLlNzaWQuc3NpZCwgJnBhdHRyaWItPnBrdGxlbik7Ci0KLQkvKiBzdXBwb3J0ZWQgcmF0ZSAmIGV4dGVuZGVkIHN1cHBvcnRlZCByYXRlICovCi0KLQlnZXRfcmF0ZV9zZXQyM2EocGFkYXB0ZXIsIHN0YV9ic3NyYXRlLCAmc3RhX2Jzc3JhdGVfbGVuKTsKLQkvKiBEQkdfODcyM0EoInN0YV9ic3NyYXRlX2xlbiA9JWRcbiIsIHN0YV9ic3NyYXRlX2xlbik7ICovCi0KLQkvKiAgZm9yIEpBUEFOLCBjaGFubmVsIDE0IGNhbiBvbmx5IHVzZXMgQiBNb2RlKENDSykgKi8KLQlpZiAocG1sbWVleHQtPmN1cl9jaGFubmVsID09IDE0KQotCQlzdGFfYnNzcmF0ZV9sZW4gPSA0OwotCi0JLyogZm9yIChpID0gMDsgaSA8IHN0YV9ic3NyYXRlX2xlbjsgaSsrKSB7ICovCi0JLyoJREJHXzg3MjNBKCJzdGFfYnNzcmF0ZVslZF09JTAyWFxuIiwgaSwgc3RhX2Jzc3JhdGVbaV0pOyAqLwotCS8qICAqLwotCi0JZm9yIChpID0gMDsgaSA8IE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWDsgaSsrKSB7Ci0JCWlmIChwbWxtZWluZm8tPm5ldHdvcmsuU3VwcG9ydGVkUmF0ZXNbaV0gPT0gMCkKLQkJCWJyZWFrOwotCQlEQkdfODcyM0EoIm5ldHdvcmsuU3VwcG9ydGVkUmF0ZXNbJWRdPSUwMlhcbiIsIGksCi0JCQkgIHBtbG1laW5mby0+bmV0d29yay5TdXBwb3J0ZWRSYXRlc1tpXSk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWDsgaSsrKSB7Ci0JCWlmIChwbWxtZWluZm8tPm5ldHdvcmsuU3VwcG9ydGVkUmF0ZXNbaV0gPT0gMCkKLQkJCWJyZWFrOwotCi0JCS8qICBDaGVjayBpZiB0aGUgQVAncyBzdXBwb3J0ZWQgcmF0ZXMgYXJlIGFsc28KLQkJICAgIHN1cHBvcnRlZCBieSBTVEEuICovCi0JCWZvciAoaiA9IDA7IGogPCBzdGFfYnNzcmF0ZV9sZW47IGorKykgewotCQkJIC8qICBBdm9pZCB0aGUgcHJvcHJpZXRhcnkgZGF0YSByYXRlICgyMk1icHMpIG9mCi0JCQkgICAgIEhhbmRsaW5rIFdTRy00MDAwIEFQICovCi0JCQlpZiAoKHBtbG1laW5mby0+bmV0d29yay5TdXBwb3J0ZWRSYXRlc1tpXSB8Ci0JCQkgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spID09Ci0JCQkgICAgKHN0YV9ic3NyYXRlW2pdIHwgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSykpIHsKLQkJCQkvKiBEQkdfODcyM0EoIm1hdGNoIGkgPSAlZCwgaiA9JWRcbiIsIGksIGopOyAqLwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKGogPT0gc3RhX2Jzc3JhdGVfbGVuKSB7Ci0JCQkvKiAgdGhlIHJhdGUgaXMgbm90IHN1cHBvcnRlZCBieSBTVEEgKi8KLQkJCURCR184NzIzQSgiJXMoKTogdGhlIHJhdGVbJWRdPSUwMlggaXMgbm90IHN1cHBvcnRlZCBieSAiCi0JCQkJICAiU1RBIVxuIiwgX19mdW5jX18sIGksCi0JCQkJICBwbWxtZWluZm8tPm5ldHdvcmsuU3VwcG9ydGVkUmF0ZXNbaV0pOwotCQl9IGVsc2UgewotCQkJLyogIHRoZSByYXRlIGlzIHN1cHBvcnRlZCBieSBTVEEgKi8KLQkJCWJzc3JhdGVbaW5kZXgrK10gPSBwbWxtZWluZm8tPm5ldHdvcmsuU3VwcG9ydGVkUmF0ZXNbaV07Ci0JCX0KLQl9Ci0KLQlic3NyYXRlX2xlbiA9IGluZGV4OwotCURCR184NzIzQSgiYnNzcmF0ZV9sZW4gPSAlZFxuIiwgYnNzcmF0ZV9sZW4pOwotCi0JaWYgKGJzc3JhdGVfbGVuID09IDApIHsKLQkJcnR3X2ZyZWVfeG1pdGJ1ZjIzYShweG1pdHByaXYsIHBtZ250ZnJhbWUtPnB4bWl0YnVmKTsKLQkJcnR3X2ZyZWVfeG1pdGZyYW1lMjNhKHB4bWl0cHJpdiwgcG1nbnRmcmFtZSk7Ci0JCWdvdG8gZXhpdDsgLyogZG9uJ3QgY29ubmVjdCB0byBBUCBpZiBubyBqb2ludCBzdXBwb3J0ZWQgcmF0ZSAqLwotCX0KLQotCWlmIChic3NyYXRlX2xlbiA+IDgpIHsKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX1NVUFBfUkFURVMsIDgsCi0JCQkJICAgICAgIGJzc3JhdGUsICZwYXR0cmliLT5wa3RsZW4pOwotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfRVhUX1NVUFBfUkFURVMsCi0JCQkJICAgICAgIChic3NyYXRlX2xlbiAtIDgpLCAoYnNzcmF0ZSArIDgpLAotCQkJCSAgICAgICAmcGF0dHJpYi0+cGt0bGVuKTsKLQl9IGVsc2UKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX1NVUFBfUkFURVMsCi0JCQkJICAgICAgIGJzc3JhdGVfbGVuLCBic3NyYXRlLCAmcGF0dHJpYi0+cGt0bGVuKTsKLQotCS8qIFJTTiAqLwotCi0JcGllID0gcG1sbWVpbmZvLT5uZXR3b3JrLklFczsKLQlwaWVfbGVuID0gcG1sbWVpbmZvLT5uZXR3b3JrLklFTGVuZ3RoOwotCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfUlNOLCBwaWUsIHBpZV9sZW4pOwotCWlmIChwKQotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfUlNOLCBwWzFdLCBwICsgMiwKLQkJCQkgICAgICAgJnBhdHRyaWItPnBrdGxlbik7Ci0KLQkvKiBIVCBjYXBzICovCi0JaWYgKHBhZGFwdGVyLT5tbG1lcHJpdi5odHByaXYuaHRfb3B0aW9uKSB7Ci0JCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX0NBUEFCSUxJVFksIHBpZSwgcGllX2xlbik7Ci0KLQkJaWYgKHAgJiYgIWlzX2FwX2luX3RraXAyM2EocGFkYXB0ZXIpKSB7Ci0JCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqY2FwID0gJnBtbG1laW5mby0+aHRfY2FwOwotCi0JCQltZW1jcHkoY2FwLCBwICsgMiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7Ci0KLQkJCS8qIHRvIGRpc2FibGUgNDBNIEh6IHN1cHBvcnQgd2hpbGUgZ2RfYndfNDBNSHpfZW4gPSAwICovCi0JCQlpZiAocHJlZ3ByaXYtPmNidzQwX2VuYWJsZSA9PSAwKSB7Ci0JCQkJY2FwLT5jYXBfaW5mbyAmPSB+Y3B1X3RvX2xlMTYoCi0JCQkJCUlFRUU4MDIxMV9IVF9DQVBfU0dJXzQwIHwKLQkJCQkJSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDApOwotCQkJfSBlbHNlIHsKLQkJCQljYXAtPmNhcF9pbmZvIHw9IGNwdV90b19sZTE2KAotCQkJCQlJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCk7Ci0JCQl9Ci0KLQkJCS8qIHRvZG86IGRpc2FibGUgU00gcG93ZXIgc2F2ZSBtb2RlICovCi0JCQljYXAtPmNhcF9pbmZvIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9IVF9DQVBfU01fUFMpOwotCi0JCQlyZl90eXBlID0gcnRsODcyM2FfZ2V0X3JmX3R5cGUocGFkYXB0ZXIpOwotCQkJLyogc3dpdGNoIChwcmVncHJpdi0+cmZfY29uZmlnKSAqLwotCQkJc3dpdGNoIChyZl90eXBlKSB7Ci0JCQljYXNlIFJGXzFUMVI6Ci0JCQkJLyogUlggU1RCQyBPbmUgc3BhdGlhbCBzdHJlYW0gKi8KLQkJCQlpZiAocHJlZ3ByaXYtPnJ4X3N0YmMpCi0JCQkJCWNhcC0+Y2FwX2luZm8gfD0gY3B1X3RvX2xlMTYoMSA8PCBJRUVFODAyMTFfSFRfQ0FQX1JYX1NUQkNfU0hJRlQpOwotCi0JCQkJbWVtY3B5KCZjYXAtPm1jcywgTUNTX3JhdGVfMVIyM0EsIDE2KTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBSRl8yVDJSOgotCQkJY2FzZSBSRl8xVDJSOgotCQkJZGVmYXVsdDoKLQkJCQkvKiBlbmFibGUgZm9yIDIuNC81IEdIeiAqLwotCQkJCWlmIChwcmVncHJpdi0+cnhfc3RiYyA9PSAweDMgfHwKLQkJCQkgICAgKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSAmCi0JCQkJICAgICBXSVJFTEVTU18xMV8yNE4gJiYKLQkJCQkgICAgIC8qIGVuYWJsZSBmb3IgMi40R0h6ICovCi0JCQkJICAgICBwcmVncHJpdi0+cnhfc3RiYyA9PSAweDEpIHx8Ci0JCQkJICAgIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgJgotCQkJCSAgICAgV0lSRUxFU1NfMTFfNU4gJiYKLQkJCQkgICAgIHByZWdwcml2LT5yeF9zdGJjID09IDB4MikgfHwKLQkJCQkgICAgLyogZW5hYmxlIGZvciA1R0h6ICovCi0JCQkJICAgIHByZWdwcml2LT53aWZpX3NwZWMgPT0gMSkgewotCQkJCQlEQkdfODcyM0EoImRlY2xhcmUgc3VwcG9ydGluZyBSWCAiCi0JCQkJCQkgICJTVEJDXG4iKTsKLQkJCQkJLyogUlggU1RCQyB0d28gc3BhdGlhbCBzdHJlYW0gKi8KLQkJCQkJY2FwLT5jYXBfaW5mbyB8PSBjcHVfdG9fbGUxNigyIDw8IElFRUU4MDIxMV9IVF9DQVBfUlhfU1RCQ19TSElGVCk7Ci0JCQkJfQotCQkJCW1lbWNweSgmY2FwLT5tY3MsIE1DU19yYXRlXzJSMjNBLCAxNik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSAmJgotCQkJICAgIHJ0bDg3MjNhX0JUX3VzaW5nX2FudGVubmFfMShwYWRhcHRlcikpIHsKLQkJCQkvKiAgc2V0IHRvIDhLICovCi0JCQkJY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyAmPQotCQkJCQl+SUVFRTgwMjExX0hUX0FNUERVX1BBUk1fRkFDVE9SOwotLyoJCQkJY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyB8PSBNQVhfQU1QRFVfRkFDVE9SXzhLICovCi0JCQl9Ci0KLQkJCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9IVF9DQVBBQklMSVRZLAotCQkJCQkgICAgICAgcFsxXSwgKHU4ICopJnBtbG1laW5mby0+aHRfY2FwLAotCQkJCQkgICAgICAgJnBhdHRyaWItPnBrdGxlbik7Ci0JCX0KLQl9Ci0KLQkvKiB2ZW5kb3Igc3BlY2lmaWMgSUUsIHN1Y2ggYXMgV1BBLCBXTU0sIFdQUyAqLwotCWZvciAoaSA9IDA7ICBpIDwgcG1sbWVpbmZvLT5uZXR3b3JrLklFTGVuZ3RoOykgewotCQlwID0gcG1sbWVpbmZvLT5uZXR3b3JrLklFcyArIGk7Ci0KLQkJc3dpdGNoIChwWzBdKSB7Ci0JCWNhc2UgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDOgotCQkJaWYgKCFtZW1jbXAocCArIDIsIFJUV19XUEFfT1VJMjNBX1RZUEUsIDQpIHx8Ci0JCQkgICAgIW1lbWNtcChwICsgMiwgV01NX09VSTIzQSwgNCkgfHwKLQkJCSAgICAhbWVtY21wKHAgKyAyLCBXUFNfT1VJMjNBLCA0KSkgewotCQkJCXU4IHBsZW4gPSBwWzFdOwotCi0JCQkJaWYgKCFwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpZmlfc3BlYykgewotCQkJCQkvKiBDb21tZW50ZWQgYnkgS3VydCAyMDExMDYyOSAqLwotCQkJCQkvKiBJbiBzb21lIG9sZGVyIEFQcywgV1BTIGhhbmRzaGFrZSAqLwotCQkJCQkvKiB3b3VsZCBiZSBmYWlsIGlmIHdlIGFwcGVuZCB2ZW5kZXIKLQkJCQkJICAgZXh0ZW5zaW9ucyBpbmZvcm1hdGlvbnMgdG8gQVAgKi8KLQkJCQkJaWYgKCFtZW1jbXAocCArIDIsIFdQU19PVUkyM0EsIDQpKQotCQkJCQkJcGxlbiA9IDE0OwotCQkJCX0KLQkJCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwKLQkJCQkJCSAgICAgICBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMsCi0JCQkJCQkgICAgICAgcGxlbiwgcCArIDIsCi0JCQkJCQkgICAgICAgJnBhdHRyaWItPnBrdGxlbik7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCQlpICs9IHBbMV0gKyAyOwotCX0KLQotCWlmIChwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciA9PSBIVF9JT1RfUEVFUl9SRUFMVEVLKQotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDLCA2LAotCQkJCSAgICAgICBSRUFMVEVLXzk2Ql9JRSwgJnBhdHRyaWItPnBrdGxlbik7Ci0KLQlwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBwYXR0cmliLT5wa3RsZW47Ci0JZHVtcF9tZ250ZnJhbWUyM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotCi0JcmV0ID0gX1NVQ0NFU1M7Ci0KLWV4aXQ6Ci0JcG1sbWVwcml2LT5hc3NvY19yZXFfbGVuID0gMDsKLQlpZiAocmV0ID09IF9TVUNDRVNTKSB7Ci0JCWtmcmVlKHBtbG1lcHJpdi0+YXNzb2NfcmVxKTsKLQkJcG1sbWVwcml2LT5hc3NvY19yZXEgPSBrbWFsbG9jKHBhdHRyaWItPnBrdGxlbiwgR0ZQX0FUT01JQyk7Ci0JCWlmIChwbWxtZXByaXYtPmFzc29jX3JlcSkgewotCQkJbWVtY3B5KHBtbG1lcHJpdi0+YXNzb2NfcmVxLCBtZ210LCBwYXR0cmliLT5wa3RsZW4pOwotCQkJcG1sbWVwcml2LT5hc3NvY19yZXFfbGVuID0gcGF0dHJpYi0+cGt0bGVuOwotCQl9Ci0JfSBlbHNlCi0JCWtmcmVlKHBtbG1lcHJpdi0+YXNzb2NfcmVxKTsKLX0KLQotLyogd2hlbiB3YWl0X2FjayBpcyB0cnVlLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYXQgcHJvY2VzcyBjb250ZXh0ICovCi1zdGF0aWMgaW50IF9pc3N1ZV9udWxsZGF0YTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpkYSwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBwb3dlcl9tb2RlLCBpbnQgd2FpdF9hY2spCi17Ci0JaW50IHJldCA9IF9GQUlMOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXVuc2lnbmVkIGNoYXIgKnBmcmFtZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dDsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvOwotCi0JLyogREJHXzg3MjNBKCIlczolZFxuIiwgX19mdW5jX18sIHBvd2VyX21vZGUpOyAqLwotCi0JaWYgKCFwYWRhcHRlcikKLQkJZ290byBleGl0OwotCi0JcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpCi0JCWdvdG8gZXhpdDsKLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0JcGF0dHJpYi0+cmV0cnlfY3RybCA9IGZhbHNlOwotCi0JbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwotCi0JcGZyYW1lID0gKHU4ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyKSArIFRYREVTQ19PRkZTRVQ7Ci0JcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7Ci0KLQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKLQkJCQkJICAgICAgSUVFRTgwMjExX1NUWVBFX05VTExGVU5DKTsKLQotCWlmICgocG1sbWVpbmZvLT5zdGF0ZSYweDAzKSA9PSBNU1JfQVApCi0JCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX0ZST01EUyk7Ci0JZWxzZSBpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gTVNSX0lORlJBKQotCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9UT0RTKTsKLQotCWlmIChwb3dlcl9tb2RlKQotCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9QTSk7Ci0KLQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBkYSk7Ci0JZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpKTsKLQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBnZXRfbXlfYnNzaWQyM2EoJnBtbG1laW5mby0+bmV0d29yaykpOwotCi0JcHdsYW5oZHItPnNlcV9jdHJsID0KLQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NOX1RPX1NFUShwbWxtZWV4dC0+bWdudF9zZXEpKTsKLQlwbWxtZWV4dC0+bWdudF9zZXErKzsKLQotCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwotCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0KLQlwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBwYXR0cmliLT5wa3RsZW47Ci0KLQlpZiAod2FpdF9hY2spCi0JCXJldCA9IGR1bXBfbWdudGZyYW1lMjNhX2FuZF93YWl0X2FjazIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci0JZWxzZSB7Ci0JCWR1bXBfbWdudGZyYW1lMjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0JfQotCi1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qIHdoZW4gd2FpdF9tcyA+MCAsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhdCBwcm9jZXNzIGNvbnRleHQgKi8KLS8qIGRhID09IE5VTEwgZm9yIHN0YXRpb24gbW9kZSAqLwotaW50IGlzc3VlX251bGxkYXRhMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhLAotCQkgICAgICB1bnNpZ25lZCBpbnQgcG93ZXJfbW9kZSwgaW50IHRyeV9jbnQsIGludCB3YWl0X21zKQotewotCWludCByZXQ7Ci0JaW50IGkgPSAwOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQkvKiBkYSA9PSBOVUxMLCBhc3N1bWUgaXQncyBudWxsIGRhdGEgZm9yIHN0YSB0byBhcCovCi0JaWYgKGRhID09IE5VTEwpCi0JCWRhID0gZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspOwotCi0JZG8gewotCQlyZXQgPSBfaXNzdWVfbnVsbGRhdGEyM2EocGFkYXB0ZXIsIGRhLCBwb3dlcl9tb2RlLAotCQkJCQkgd2FpdF9tcyA+IDAgPyB0cnVlIDogZmFsc2UpOwotCi0JCWkrKzsKLQotCQlpZiAocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKQotCQkJYnJlYWs7Ci0KLQkJaWYgKGkgPCB0cnlfY250ICYmIHdhaXRfbXMgPiAwICYmIHJldCA9PSBfRkFJTCkKLQkJCW1zbGVlcCh3YWl0X21zKTsKLQotCX0gd2hpbGUoKGkgPCB0cnlfY250KSAmJiAoKHJldCA9PSBfRkFJTCkgfHwgKHdhaXRfbXMgPT0gMCkpKTsKLQotCWlmIChyZXQgIT0gX0ZBSUwpIHsKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAodHJ5X2NudCAmJiB3YWl0X21zKSB7Ci0JCWlmIChkYSkKLQkJCURCR184NzIzQSgiJXMoJXMpOiB0byAlcE0sIGNoOiV1JXMsICVkLyVkIGluICV1IG1zXG4iLAotCQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJCSAgZGEsIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCi0JCQkJICByZXQgPT0gX1NVQ0NFU1MgPyAiLCBhY2tlZCIgOiAiIiwgaSwgdHJ5X2NudCwKLQkJCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KSk7Ci0JCWVsc2UKLQkJCURCR184NzIzQSgiJXMoJXMpOiwgY2g6JXUlcywgJWQvJWQgaW4gJXUgbXNcbiIsCi0JCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCQkJICBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpLAotCQkJCSAgcmV0ID09IF9TVUNDRVNTID8gIiwgYWNrZWQiIDogIiIsIGksIHRyeV9jbnQsCi0JCQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwotCX0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogd2hlbiB3YWl0X2FjayBpcyB0cnVlLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYXQgcHJvY2VzcyBjb250ZXh0ICovCi1zdGF0aWMgaW50IF9pc3N1ZV9xb3NfbnVsbGRhdGEyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgIHVuc2lnbmVkIGNoYXIgKmRhLCB1MTYgdGlkLCBpbnQgd2FpdF9hY2spCi17Ci0JaW50IHJldCA9IF9GQUlMOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXVuc2lnbmVkIGNoYXIgKnBmcmFtZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIgKnB3bGFuaGRyOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpCi0JCWdvdG8gZXhpdDsKLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0KLQlwYXR0cmliLT5oZHJsZW4gKz0gMjsKLQlwYXR0cmliLT5xb3NfZW4gPSB0cnVlOwotCXBhdHRyaWItPmVvc3AgPSAxOwotCXBhdHRyaWItPmFja19wb2xpY3kgPSAwOwotCXBhdHRyaWItPm1kYXRhID0gMDsKLQotCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKLQotCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfcW9zX2hkciAqKXBmcmFtZTsKLQotCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0RBVEEgfAotCQkJCQkgICAgICBJRUVFODAyMTFfU1RZUEVfUU9TX05VTExGVU5DKTsKLQotCWlmICgocG1sbWVpbmZvLT5zdGF0ZSYweDAzKSA9PSBNU1JfQVApCi0JCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX0ZST01EUyk7Ci0JZWxzZSBpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gTVNSX0lORlJBKQotCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9UT0RTKTsKLQotCWlmIChwYXR0cmliLT5tZGF0YSkKLQkJcHdsYW5oZHItPmZyYW1lX2NvbnRyb2wgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfTU9SRURBVEEpOwotCi0JcHdsYW5oZHItPnFvc19jdHJsID0gY3B1X3RvX2xlMTYodGlkICYgSUVFRTgwMjExX1FPU19DVExfVElEX01BU0spOwotCXB3bGFuaGRyLT5xb3NfY3RybCB8PSBjcHVfdG9fbGUxNigocGF0dHJpYi0+YWNrX3BvbGljeSA8PCA1KSAmCi0JCQkJCSAgSUVFRTgwMjExX1FPU19DVExfQUNLX1BPTElDWV9NQVNLKTsKLQlpZiAocGF0dHJpYi0+ZW9zcCkKLQkJcHdsYW5oZHItPnFvc19jdHJsIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9RT1NfQ1RMX0VPU1ApOwotCi0JZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEpOwotCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSk7Ci0JZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKTsKLQotCXB3bGFuaGRyLT5zZXFfY3RybCA9Ci0JCWNwdV90b19sZTE2KElFRUU4MDIxMV9TTl9UT19TRVEocG1sbWVleHQtPm1nbnRfc2VxKSk7Ci0JcG1sbWVleHQtPm1nbnRfc2VxKys7Ci0KLQlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX2hkcik7Ci0JcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX2hkcik7Ci0KLQlwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBwYXR0cmliLT5wa3RsZW47Ci0KLQlpZiAod2FpdF9hY2spCi0JCXJldCA9IGR1bXBfbWdudGZyYW1lMjNhX2FuZF93YWl0X2FjazIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci0JZWxzZSB7Ci0JCWR1bXBfbWdudGZyYW1lMjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0JfQotCi1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qIHdoZW4gd2FpdF9tcyA+MCAsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhdCBwcm9jZXNzIGNvbnRleHQgKi8KLS8qIGRhID09IE5VTEwgZm9yIHN0YXRpb24gbW9kZSAqLwotaW50IGlzc3VlX3Fvc19udWxsZGF0YTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpkYSwKLQkJCSAgdTE2IHRpZCwgaW50IHRyeV9jbnQsIGludCB3YWl0X21zKQotewotCWludCByZXQ7Ci0JaW50IGkgPSAwOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQkvKiBkYSA9PSBOVUxMLCBhc3N1bWUgaXQncyBudWxsIGRhdGEgZm9yIHN0YSB0byBhcCovCi0JaWYgKGRhID09IE5VTEwpCi0JCWRhID0gZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspOwotCi0JZG8gewotCQlyZXQgPSBfaXNzdWVfcW9zX251bGxkYXRhMjNhKHBhZGFwdGVyLCBkYSwgdGlkLAotCQkJCQkgICAgIHdhaXRfbXMgPiAwID8gdHJ1ZSA6IGZhbHNlKTsKLQotCQlpKys7Ci0KLQkJaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkKLQkJCWJyZWFrOwotCi0JCWlmIChpIDwgdHJ5X2NudCAmJiB3YWl0X21zID4gMCAmJiByZXQgPT0gX0ZBSUwpCi0JCQltc2xlZXAod2FpdF9tcyk7Ci0JfSB3aGlsZSgoaSA8IHRyeV9jbnQpICYmICgocmV0ID09IF9GQUlMKXx8KHdhaXRfbXMgPT0gMCkpKTsKLQotCWlmIChyZXQgIT0gX0ZBSUwpIHsKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAodHJ5X2NudCAmJiB3YWl0X21zKSB7Ci0JCWlmIChkYSkKLQkJCURCR184NzIzQSgiJXMoJXMpOiB0byAlcE0sIGNoOiV1JXMsICVkLyVkIGluICV1IG1zXG4iLAotCQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJCSAgZGEsIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCi0JCQkJICByZXQgPT0gX1NVQ0NFU1MgPyAiLCBhY2tlZCIgOiAiIiwgaSwgdHJ5X2NudCwKLQkJCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KSk7Ci0JCWVsc2UKLQkJCURCR184NzIzQSgiJXMoJXMpOiwgY2g6JXUlcywgJWQvJWQgaW4gJXUgbXNcbiIsCi0JCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCQkJICBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpLAotCQkJCSAgcmV0ID09IF9TVUNDRVNTID8gIiwgYWNrZWQiIDogIiIsIGksIHRyeV9jbnQsCi0JCQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwotCX0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfaXNzdWVfZGVhdXRoKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhLAotCQkJIHVuc2lnbmVkIHNob3J0IHJlYXNvbiwgdTggd2FpdF9hY2spCi17Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWU7Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWI7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0KLQkvKiBEQkdfODcyM0EoIiVzIHRvICVwTVxuIiwgX19mdW5jX18sIGRhKTsgKi8KLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpCi0JCWdvdG8gZXhpdDsKLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0JcGF0dHJpYi0+cmV0cnlfY3RybCA9IGZhbHNlOwotCi0JbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwotCi0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikocG1nbnRmcmFtZS0+YnVmX2FkZHIgKyBUWERFU0NfT0ZGU0VUKTsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9ERUFVVEgpOwotCi0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmRhLCBkYSk7Ci0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPnNhLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwotCWV0aGVyX2FkZHJfY29weShtZ210LT5ic3NpZCwgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKTsKLQotCW1nbXQtPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NOX1RPX1NFUShwbWxtZWV4dC0+bWdudF9zZXEpKTsKLQlwbWxtZWV4dC0+bWdudF9zZXErKzsKLQotCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyAyOwotCi0JbWdtdC0+dS5kZWF1dGgucmVhc29uX2NvZGUgPSBjcHVfdG9fbGUxNihyZWFzb24pOwotCi0JcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwotCi0JaWYgKHdhaXRfYWNrKQotCQlyZXQgPSBkdW1wX21nbnRmcmFtZTIzYV9hbmRfd2FpdF9hY2syM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotCWVsc2UgewotCQlkdW1wX21nbnRmcmFtZTIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci0JCXJldCA9IF9TVUNDRVNTOwotCX0KLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgaXNzdWVfZGVhdXRoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhLAotCQkgICAgdW5zaWduZWQgc2hvcnQgcmVhc29uKQotewotCURCR184NzIzQSgiJXMgdG8gJXBNXG4iLCBfX2Z1bmNfXywgZGEpOwotCXJldHVybiBfaXNzdWVfZGVhdXRoKHBhZGFwdGVyLCBkYSwgcmVhc29uLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyBpbnQgaXNzdWVfZGVhdXRoX2V4KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpkYSwKLQkJCSAgIHVuc2lnbmVkIHNob3J0IHJlYXNvbiwgaW50IHRyeV9jbnQsIGludCB3YWl0X21zKQotewotCWludCByZXQ7Ci0JaW50IGkgPSAwOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOwotCi0JZG8gewotCQlyZXQgPSBfaXNzdWVfZGVhdXRoKHBhZGFwdGVyLCBkYSwgcmVhc29uLAotCQkJCSAgICB3YWl0X21zID4wID8gdHJ1ZSA6IGZhbHNlKTsKLQotCQlpKys7Ci0KLQkJaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkKLQkJCWJyZWFrOwotCi0JCWlmIChpIDwgdHJ5X2NudCAmJiB3YWl0X21zID4gMCAmJiByZXQgPT0gX0ZBSUwpCi0JCQltc2xlZXAod2FpdF9tcyk7Ci0KLQl9IHdoaWxlKChpIDwgdHJ5X2NudCkgJiYgKChyZXQgPT0gX0ZBSUwpfHwod2FpdF9tcyA9PSAwKSkpOwotCi0JaWYgKHJldCAhPSBfRkFJTCkgewotCQlyZXQgPSBfU1VDQ0VTUzsKLQkJZ290byBleGl0OwotCX0KLQotCWlmICh0cnlfY250ICYmIHdhaXRfbXMpIHsKLQkJaWYgKGRhKQotCQkJREJHXzg3MjNBKCIlcyglcyk6IHRvICVwTSwgY2g6JXUlcywgJWQvJWQgaW4gJXUgbXNcbiIsCi0JCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCQkJICBkYSwgcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSwKLQkJCQkgIHJldCA9PSBfU1VDQ0VTUyA/ICIsIGFja2VkIiA6ICIiLCBpLCB0cnlfY250LAotCQkJCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpKTsKLQkJZWxzZQotCQkJREJHXzg3MjNBKCIlcyglcyk6LCBjaDoldSVzLCAlZC8lZCBpbiAldSBtc1xuIiwKLQkJCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKLQkJCQkgIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCi0JCQkJICByZXQgPT0gX1NVQ0NFU1MgPyAiLCBhY2tlZCIgOiAiIiwgaSwgdHJ5X2NudCwKLQkJCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KSk7Ci0JfQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGlzc3VlX2FjdGlvbl9zcGN0X2NoX3N3aXRjaDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICB1OCAqcmEsIHU4IG5ld19jaCwgdTggY2hfb2Zmc2V0KQotewotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXVuc2lnbmVkIGNoYXIgKnBmcmFtZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCi0JREJHXzg3MjNBKCIlcyglcyk6IHJhPSVwTSwgY2g6JXUsIG9mZnNldDoldVxuIiwKLQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsIHJhLCBuZXdfY2gsIGNoX29mZnNldCk7Ci0KLQlwbWdudGZyYW1lID0gYWxsb2NfbWd0eG1pdGZyYW1lMjNhKHB4bWl0cHJpdik7Ci0JaWYgKCFwbWdudGZyYW1lKQotCQlyZXR1cm47Ci0KLQkvKiB1cGRhdGUgYXR0cmlidXRlICovCi0JcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIyM2EocGFkYXB0ZXIsIHBhdHRyaWIpOwotCi0JbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwotCi0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikocG1nbnRmcmFtZS0+YnVmX2FkZHIgKyBUWERFU0NfT0ZGU0VUKTsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9BQ1RJT04pOwotCi0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmRhLCByYSk7IC8qIFJBICovCi0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPnNhLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpOyAvKiBUQSAqLwotCWV0aGVyX2FkZHJfY29weShtZ210LT5ic3NpZCwgcmEpOyAvKiBEQSA9IFJBICovCi0KLQltZ210LT5zZXFfY3RybCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TTl9UT19TRVEocG1sbWVleHQtPm1nbnRfc2VxKSk7Ci0JcG1sbWVleHQtPm1nbnRfc2VxKys7Ci0KLQltZ210LT51LmFjdGlvbi5jYXRlZ29yeSA9IFdMQU5fQ0FURUdPUllfU1BFQ1RSVU1fTUdNVDsKLQltZ210LT51LmFjdGlvbi51LmNoYW5fc3dpdGNoLmFjdGlvbl9jb2RlID0gV0xBTl9BQ1RJT05fU1BDVF9DSExfU1dJVENIOwotCi0JcGZyYW1lID0gbWdtdC0+dS5hY3Rpb24udS5jaGFuX3N3aXRjaC52YXJpYWJsZTsKLQlwYXR0cmliLT5wa3RsZW4gPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsCi0JCQkJICAgdS5hY3Rpb24udS5jaGFuX3N3aXRjaC52YXJpYWJsZSk7Ci0KLQlwZnJhbWUgPSBydHdfc2V0X2llMjNhX2NoX3N3aXRjaCAocGZyYW1lLCAmcGF0dHJpYi0+cGt0bGVuLCAwLAotCQkJCQkgIG5ld19jaCwgMCk7Ci0JcGZyYW1lID0gcnR3X3NldF9pZTIzYV9zZWNvbmRhcnlfY2hfb2Zmc2V0KHBmcmFtZSwgJnBhdHRyaWItPnBrdGxlbiwKLQkJaGFsX2NoX29mZnNldF90b19zZWNvbmRhcnlfY2hfb2Zmc2V0MjNhKGNoX29mZnNldCkpOwotCi0JcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwotCi0JZHVtcF9tZ250ZnJhbWUyM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotfQotCi12b2lkIGlzc3VlX2FjdGlvbl9CQTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJY29uc3QgdW5zaWduZWQgY2hhciAqcmFkZHIsCi0JCQl1bnNpZ25lZCBjaGFyIGFjdGlvbiwgdW5zaWduZWQgc2hvcnQgc3RhdHVzKQotewotCXUxNiBzdGFydF9zZXE7Ci0JdTE2IEJBX3BhcmFfc2V0OwotCXUxNiBCQV9zdGFydGluZ19zZXFjdHJsOwotCXUxNiBCQV9wYXJhOwotCWludCBtYXhfcnhfYW1wZHVfZmFjdG9yOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0JdTggdGVuZGFBUE1hY1tdID0gezB4QzgsIDB4M0EsIDB4MzV9OwotCi0JREJHXzg3MjNBKCIlcywgYWN0aW9uID0lZCwgc3RhdHVzID0lZFxuIiwgX19mdW5jX18sIGFjdGlvbiwgc3RhdHVzKTsKLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpCi0JCXJldHVybjsKLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0KLQltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7Ci0KLQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKShwbWdudGZyYW1lLT5idWZfYWRkciArIFRYREVTQ19PRkZTRVQpOwotCi0JbWdtdC0+ZnJhbWVfY29udHJvbCA9Ci0JCWNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7Ci0KLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+ZGEsIHJhZGRyKTsKLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+c2EsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSk7Ci0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmJzc2lkLCBnZXRfbXlfYnNzaWQyM2EoJnBtbG1laW5mby0+bmV0d29yaykpOwotCi0JbWdtdC0+c2VxX2N0cmwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU05fVE9fU0VRKHBtbG1lZXh0LT5tZ250X3NlcSkpOwotCXBtbG1lZXh0LT5tZ250X3NlcSsrOwotCi0JbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnkgPSBXTEFOX0NBVEVHT1JZX0JBQ0s7Ci0KLQlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgMTsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBXTEFOX0FDVElPTl9BRERCQV9SRVE6Ci0JCXBhdHRyaWItPnBrdGxlbiArPSBzaXplb2YobWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEpOwotCi0JCW1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxLmFjdGlvbl9jb2RlID0gYWN0aW9uOwotCi0JCWRvIHsKLQkJCXBtbG1laW5mby0+ZGlhbG9nVG9rZW4rKzsKLQkJfSB3aGlsZSAocG1sbWVpbmZvLT5kaWFsb2dUb2tlbiA9PSAwKTsKLQotCQltZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5kaWFsb2dfdG9rZW4gPQotCQkJcG1sbWVpbmZvLT5kaWFsb2dUb2tlbjsKLQotCQlpZiAocnRsODcyM2FfQlRfY29leGlzdChwYWRhcHRlcikgJiYKLQkJICAgIHJ0bDg3MjNhX0JUX3VzaW5nX2FudGVubmFfMShwYWRhcHRlcikgJiYKLQkJICAgIChwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciAhPSBicm9hZGNvbUFQIHx8Ci0JCSAgICAgbWVtY21wKHJhZGRyLCB0ZW5kYUFQTWFjLCAzKSkpIHsKLQkJCS8qICBBLU1TRFUgTk9UIFN1cHBvcnRlZCAqLwotCQkJQkFfcGFyYV9zZXQgPSAwOwotCQkJLyogIGltbWVkaWF0ZSBCbG9jayBBY2sgKi8KLQkJCUJBX3BhcmFfc2V0IHw9ICgxIDw8IDEpICYKLQkJCQlJRUVFODAyMTFfQUREQkFfUEFSQU1fUE9MSUNZX01BU0s7Ci0JCQkvKiAgVElEICovCi0JCQlCQV9wYXJhX3NldCB8PSAoc3RhdHVzIDw8IDIpICYKLQkJCQlJRUVFODAyMTFfQUREQkFfUEFSQU1fVElEX01BU0s7Ci0JCQkvKiAgbWF4IGJ1ZmZlciBzaXplIGlzIDggTVNEVSAqLwotCQkJQkFfcGFyYV9zZXQgfD0gKDggPDwgNikgJgotCQkJCUlFRUU4MDIxMV9BRERCQV9QQVJBTV9CVUZfU0laRV9NQVNLOwotCQl9IGVsc2UgewotCQkJLyogaW1tZWRpYXRlIGFjayAmIDY0IGJ1ZmZlciBzaXplICovCi0JCQlCQV9wYXJhX3NldCA9IDB4MTAwMiB8ICgoc3RhdHVzICYgMHhmKSA8PCAyKTsKLQkJfQotCi0JCXB1dF91bmFsaWduZWRfbGUxNihCQV9wYXJhX3NldCwKLQkJCQkgICAmbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEuY2FwYWIpOwotCi0JCS8qICA1bXMgKi8KLQkJcHV0X3VuYWxpZ25lZF9sZTE2KDUwMDAsICZtZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS50aW1lb3V0KTsKLQotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCByYWRkcik7Ci0JCWlmIChwc3RhKSB7Ci0JCQlpbnQgaWR4OwotCi0JCQlpZHggPSBzdGF0dXMgJiAweDA3OwotCQkJc3RhcnRfc2VxID0KLQkJCQkocHN0YS0+c3RhX3htaXRwcml2LnR4c2VxX3RpZFtpZHhdICYgMHhmZmYpICsgMTsKLQotCQkJREJHXzg3MjNBKCJCQV9zdGFydGluZ19zZXFjdHJsID0gJWQgZm9yIFRJRCA9JWRcbiIsCi0JCQkJICBzdGFydF9zZXEsIGlkeCk7Ci0KLQkJCXBzdGEtPkJBX3N0YXJ0aW5nX3NlcWN0cmxbaWR4XSA9IHN0YXJ0X3NlcTsKLQotCQkJQkFfc3RhcnRpbmdfc2VxY3RybCA9IHN0YXJ0X3NlcSA8PCA0OwotCQl9IGVsc2UKLQkJCUJBX3N0YXJ0aW5nX3NlcWN0cmwgPSAwOwotCi0JCXB1dF91bmFsaWduZWRfbGUxNihCQV9zdGFydGluZ19zZXFjdHJsLAotCQkJCSAgICZtZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5zdGFydF9zZXFfbnVtKTsKLQotCQlicmVhazsKLQotCWNhc2UgV0xBTl9BQ1RJT05fQUREQkFfUkVTUDoKLQkJcGF0dHJpYi0+cGt0bGVuICs9IHNpemVvZihtZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3ApOwotCi0JCW1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5hY3Rpb25fY29kZSA9IGFjdGlvbjsKLQkJbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwLmRpYWxvZ190b2tlbiA9Ci0JCQlwbWxtZWluZm8tPkFEREJBX3JlcS5kaWFsb2dfdG9rZW47Ci0JCXB1dF91bmFsaWduZWRfbGUxNihzdGF0dXMsCi0JCQkJICAgJm1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5zdGF0dXMpOwotCi0JCUdldEhhbERlZlZhcjgxOTJDVXNiKHBhZGFwdGVyLCBIV19WQVJfTUFYX1JYX0FNUERVX0ZBQ1RPUiwKLQkJCQkgICAgICZtYXhfcnhfYW1wZHVfZmFjdG9yKTsKLQotCQlCQV9wYXJhID0gbGUxNl90b19jcHUocG1sbWVpbmZvLT5BRERCQV9yZXEuQkFfcGFyYV9zZXQpICYgMHgzZjsKLQkJaWYgKG1heF9yeF9hbXBkdV9mYWN0b3IgPT0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEspCi0JCQlCQV9wYXJhX3NldCA9IEJBX3BhcmEgfCAweDEwMDA7IC8qIDY0IGJ1ZmZlciBzaXplICovCi0JCWVsc2UgaWYgKG1heF9yeF9hbXBkdV9mYWN0b3IgPT0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV8zMkspCi0JCQlCQV9wYXJhX3NldCA9IEJBX3BhcmEgfCAweDA4MDA7IC8qIDMyIGJ1ZmZlciBzaXplICovCi0JCWVsc2UgaWYgKG1heF9yeF9hbXBkdV9mYWN0b3IgPT0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV8xNkspCi0JCQlCQV9wYXJhX3NldCA9IEJBX3BhcmEgfCAweDA0MDA7IC8qIDE2IGJ1ZmZlciBzaXplICovCi0JCWVsc2UgaWYgKG1heF9yeF9hbXBkdV9mYWN0b3IgPT0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV84SykKLQkJCUJBX3BhcmFfc2V0ID0gQkFfcGFyYSB8IDB4MDIwMDsgLyogOCBidWZmZXIgc2l6ZSAqLwotCQllbHNlCi0JCQlCQV9wYXJhX3NldCA9IEJBX3BhcmEgfCAweDEwMDA7IC8qIDY0IGJ1ZmZlciBzaXplICovCi0KLQkJaWYgKHJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpICYmCi0JCSAgICBydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpICYmCi0JCSAgICAocG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3IgIT0gYnJvYWRjb21BUCB8fAotCQkgICAgIG1lbWNtcChyYWRkciwgdGVuZGFBUE1hYywgMykpKSB7Ci0JCQkvKiAgbWF4IGJ1ZmZlciBzaXplIGlzIDggTVNEVSAqLwotCQkJQkFfcGFyYV9zZXQgJj0gfklFRUU4MDIxMV9BRERCQV9QQVJBTV9CVUZfU0laRV9NQVNLOwotCQkJQkFfcGFyYV9zZXQgfD0gKDggPDwgNikgJgotCQkJCUlFRUU4MDIxMV9BRERCQV9QQVJBTV9CVUZfU0laRV9NQVNLOwotCQl9Ci0KLQkJaWYgKHByZWdwcml2LT5hbXBkdV9hbXNkdSA9PSAwKS8qIGRpc2FibGVkICovCi0JCQlCQV9wYXJhX3NldCAmPSB+QklUKDApOwotCQllbHNlIGlmIChwcmVncHJpdi0+YW1wZHVfYW1zZHUgPT0gMSkvKiBlbmFibGVkICovCi0JCQlCQV9wYXJhX3NldCB8PSBCSVQoMCk7Ci0KLQkJcHV0X3VuYWxpZ25lZF9sZTE2KEJBX3BhcmFfc2V0LAotCQkJCSAgICZtZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3AuY2FwYWIpOwotCi0JCW1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC50aW1lb3V0Ci0JCQk9IHBtbG1laW5mby0+QUREQkFfcmVxLkJBX3RpbWVvdXRfdmFsdWU7Ci0KLQkJcGF0dHJpYi0+cGt0bGVuICs9IDg7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9BQ1RJT05fREVMQkE6Ci0JCXBhdHRyaWItPnBrdGxlbiArPSBzaXplb2YobWdtdC0+dS5hY3Rpb24udS5kZWxiYSk7Ci0KLQkJbWdtdC0+dS5hY3Rpb24udS5kZWxiYS5hY3Rpb25fY29kZSA9IGFjdGlvbjsKLQkJQkFfcGFyYV9zZXQgPSAoc3RhdHVzICYgMHgxRikgPDwgMzsKLQkJbWdtdC0+dS5hY3Rpb24udS5kZWxiYS5wYXJhbXMgPSBjcHVfdG9fbGUxNihCQV9wYXJhX3NldCk7Ci0JCW1nbXQtPnUuYWN0aW9uLnUuZGVsYmEucmVhc29uX2NvZGUgPQotCQkJY3B1X3RvX2xlMTYoV0xBTl9SRUFTT05fUVNUQV9OT1RfVVNFKTsKLQotCQlwYXR0cmliLT5wa3RsZW4gKz0gNTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwotCi0JZHVtcF9tZ250ZnJhbWUyM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotfQotCi1pbnQgc2VuZF9kZWxiYTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBpbml0aWF0b3IsIHU4ICphZGRyKQotewotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKLQkvKiBzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmw7ICovCi0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQl1MTYgdGlkOwotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpICE9IE1TUl9BUCkKLQkJaWYgKCEocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVNTT0NfU1VDQ0VTUykpCi0JCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBhZGRyKTsKLQlpZiAocHN0YSA9PSBOVUxMKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQlpZiAoaW5pdGlhdG9yID09IDApIHsgIC8qICByZWNpcGllbnQgKi8KLQkJZm9yICh0aWQgPSAwOyB0aWQgPCBNQVhUSUQ7IHRpZCsrKSB7Ci0JCQlpZiAocHN0YS0+cmVjdnJlb3JkZXJfY3RybFt0aWRdLmVuYWJsZSA9PSB0cnVlKSB7Ci0JCQkJREJHXzg3MjNBKCJyeCBhZ2cgZGlzYWJsZSB0aWQoJWQpXG4iLCB0aWQpOwotCQkJCWlzc3VlX2FjdGlvbl9CQTIzYShwYWRhcHRlciwgYWRkciwgV0xBTl9BQ1RJT05fREVMQkEsICgoKHRpZCA8PDEpIHxpbml0aWF0b3IpJjB4MUYpKTsKLQkJCQlwc3RhLT5yZWN2cmVvcmRlcl9jdHJsW3RpZF0uZW5hYmxlID0gZmFsc2U7Ci0JCQkJcHN0YS0+cmVjdnJlb3JkZXJfY3RybFt0aWRdLmluZGljYXRlX3NlcSA9IDB4ZmZmZjsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAoaW5pdGlhdG9yID09IDEpIHsgLyogIG9yaWdpbmF0b3IgKi8KLQkJZm9yICh0aWQgPSAwOyB0aWQgPCBNQVhUSUQ7IHRpZCsrKSB7Ci0JCQlpZiAocHN0YS0+aHRwcml2LmFnZ19lbmFibGVfYml0bWFwICYgQklUKHRpZCkpIHsKLQkJCQlEQkdfODcyM0EoInR4IGFnZyBkaXNhYmxlIHRpZCglZClcbiIsIHRpZCk7Ci0JCQkJaXNzdWVfYWN0aW9uX0JBMjNhKHBhZGFwdGVyLCBhZGRyLCBXTEFOX0FDVElPTl9ERUxCQSwgKCgodGlkIDw8MSkgfGluaXRpYXRvcikmMHgxRikpOwotCQkJCXBzdGEtPmh0cHJpdi5hZ2dfZW5hYmxlX2JpdG1hcCAmPSB+QklUKHRpZCk7Ci0JCQkJcHN0YS0+aHRwcml2LmNhbmRpZGF0ZV90aWRfYml0bWFwICY9IH5CSVQodGlkKTsKLQotCQkJfQotCQl9Ci0JfQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotaW50IHNlbmRfYmVhY29uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JYm9vbCBieG1pdG9rOwotCWludCBpc3N1ZSA9IDA7Ci0JaW50IHBvbGwgPSAwOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOwotCXVuc2lnbmVkIGludCBwYXNzaW5nX3RpbWU7Ci0KLQlydGw4NzIzYV9iY25fdmFsaWQocGFkYXB0ZXIpOwotCWRvIHsKLQkJaXNzdWVfYmVhY29uMjNhKHBhZGFwdGVyLCAxMDApOwotCQlpc3N1ZSsrOwotCQlkbyB7Ci0JCQl5aWVsZCgpOwotCQkJYnhtaXRvayA9IHJ0bDg3MjNhX2dldF9iY25fdmFsaWQocGFkYXB0ZXIpOwotCQkJcG9sbCsrOwotCQl9IHdoaWxlICgocG9sbCAlIDEwKSAhPSAwICYmICFieG1pdG9rICYmCi0JCQkgIXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkICYmCi0JCQkgIXBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCk7Ci0KLQl9IHdoaWxlICghYnhtaXRvayAmJiBpc3N1ZTwxMDAgJiYgIXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkICYmCi0JCSAhcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkKTsKLQotCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fCBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQpCi0JCXJldHVybiBfRkFJTDsKLQotCXBhc3NpbmdfdGltZSA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KTsKLQotCWlmICghYnhtaXRvaykgewotCQlEQkdfODcyM0EoIiVzIGZhaWwhICV1IG1zXG4iLCBfX2Z1bmNfXywgcGFzc2luZ190aW1lKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0gZWxzZSB7Ci0KLQkJaWYgKHBhc3NpbmdfdGltZSA+IDEwMCB8fCBpc3N1ZSA+IDMpCi0JCQlEQkdfODcyM0EoIiVzIHN1Y2Nlc3MsIGlzc3VlOiVkLCBwb2xsOiVkLCAldSBtc1xuIiwKLQkJCQkgIF9fZnVuY19fLCBpc3N1ZSwgcG9sbCwgcGFzc2luZ190aW1lKTsKLQkJcmV0dXJuIF9TVUNDRVNTOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotRm9sbG93aW5nIGFyZSBzb21lIHV0aXRpdHkgZnVuY3Rpb25zIGZvciBXaUZpIE1MTUUKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWJvb2wgSXNMZWdhbDVHQ2hhbm5lbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4IGNoYW5uZWwpCi17Ci0KLQlpbnQgaSA9IDA7Ci0JdTggQ2hhbm5lbF81R1s0NV0gPSB7MzYsIDM4LCA0MCwgNDIsIDQ0LCA0NiwgNDgsIDUwLCA1MiwgNTQsIDU2LCA1OCwKLQkJCSAgICAgNjAsIDYyLCA2NCwgMTAwLCAxMDIsIDEwNCwgMTA2LCAxMDgsIDExMCwgMTEyLAotCQkJICAgICAxMTQsIDExNiwgMTE4LCAxMjAsIDEyMiwgMTI0LCAxMjYsIDEyOCwgMTMwLCAxMzIsCi0JCQkgICAgIDEzNCwgMTM2LCAxMzgsIDE0MCwgMTQ5LCAxNTEsIDE1MywgMTU1LCAxNTcsIDE1OSwKLQkJCSAgICAgMTYxLCAxNjMsIDE2NX07Ci0JZm9yIChpID0gMDsgaSA8IHNpemVvZihDaGFubmVsXzVHKTsgaSsrKQotCQlpZiAoY2hhbm5lbCA9PSBDaGFubmVsXzVHW2ldKQotCQkJcmV0dXJuIHRydWU7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZCBydHdfc2l0ZV9zdXJ2ZXkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1bnNpZ25lZCBjaGFyIHN1cnZleV9jaGFubmVsID0gMDsKLQllbnVtIHJ0X3NjYW5fdHlwZSBTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwgKmNoOwotCi0JaWYgKHBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5jaGFubmVsX2lkeCA8Ci0JICAgIHBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5jaF9udW0pIHsKLQkJY2ggPSAmcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmNoW3BtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5jaGFubmVsX2lkeF07Ci0JCXN1cnZleV9jaGFubmVsID0gY2gtPmh3X3ZhbHVlOwotCQlTY2FuVHlwZSA9IChjaC0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9OT19JUikgPwotCQkJU0NBTl9QQVNTSVZFIDogU0NBTl9BQ1RJVkU7Ci0JfQotCi0JaWYgKHN1cnZleV9jaGFubmVsICE9IDApIHsKLQkJLyogUEFVU0UgNC1BQyBRdWV1ZSB3aGVuIHNpdGVfc3VydmV5ICovCi0JCWlmIChwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuY2hhbm5lbF9pZHggPT0gMCkKLQkJCXNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgc3VydmV5X2NoYW5uZWwsCi0JCQkJCSAgICAgIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUsCi0JCQkJCSAgICAgIEhUX0NIQU5ORUxfV0lEVEhfMjApOwotCQllbHNlCi0JCQlTZWxlY3RDaGFubmVsMjNhKHBhZGFwdGVyLCBzdXJ2ZXlfY2hhbm5lbCk7Ci0KLQkJaWYgKFNjYW5UeXBlID09IFNDQU5fQUNUSVZFKSAvKiBvYmV5IHRoZSBjaGFubmVsIHBsYW4gc2V0dGluZy4uLiAqLwotCQl7Ci0JCQlpbnQgaTsKLQotCQkJZm9yIChpID0gMDtpPFJUV19TU0lEX1NDQU5fQU1PVU5UO2krKykgewotCQkJCWlmIChwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc3NpZFtpXS5zc2lkX2xlbikgewotCQkJCQkvKiB0b2RvOiB0byBpc3N1ZSB0d28gcHJvYmUgcmVxPz8/ICovCi0JCQkJCWlzc3VlX3Byb2JlcmVxKHBhZGFwdGVyLCAmcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnNzaWRbaV0sIE5VTEwpOwotCQkJCQkvKiBtc2xlZXAoU1VSVkVZX1RPPj4xKTsgKi8KLQkJCQkJaXNzdWVfcHJvYmVyZXEocGFkYXB0ZXIsICZwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc3NpZFtpXSwgTlVMTCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnNjYW5fbW9kZSA9PSBTQ0FOX0FDVElWRSkgewotCQkJCS8qIHRvZG86IHRvIGlzc3VlIHR3byBwcm9iZSByZXE/Pz8gKi8KLQkJCQlpc3N1ZV9wcm9iZXJlcShwYWRhcHRlciwgTlVMTCwgTlVMTCk7Ci0JCQkJLyogbXNsZWVwKFNVUlZFWV9UTz4+MSk7ICovCi0JCQkJaXNzdWVfcHJvYmVyZXEocGFkYXB0ZXIsIE5VTEwsIE5VTEwpOwotCQkJfQotCQl9Ci0KLQkJc2V0X3N1cnZleV90aW1lcihwbWxtZWV4dCwgcG1sbWVleHQtPmNoYW5fc2Nhbl90aW1lKTsKLQl9IGVsc2UgewotCQkvKgljaGFubmVsIG51bWJlciBpcyAwIG9yIHRoaXMgY2hhbm5lbCBpcyBub3QgdmFsaWQuICovCi0JCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9IFNDQU5fQ09NUExFVEU7Ci0KLQkJLyogc3dpdGNoIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNoYW5uZWwgKi8KLQotCQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwKLQkJCQkgICAgICBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCwKLQkJCQkgICAgICBwbWxtZWV4dC0+Y3VyX2J3bW9kZSk7Ci0KLQkJLyogZmx1c2ggNC1BQyBRdWV1ZSBhZnRlciBydHdfc2l0ZV9zdXJ2ZXkgKi8KLQkJLyogdmFsOCA9IDA7ICovCi0KLQkJLyogY29uZmlnIE1TUiAqLwotCQlydGw4NzIzYV9zZXRfbWVkaWFfc3RhdHVzKHBhZGFwdGVyLCBwbWxtZWluZm8tPnN0YXRlICYgMHgzKTsKLQotCQkvKiByZXN0b3JlIFJYIEdBSU4gKi8KLQkJcnRsODcyM2Ffc2V0X2luaXRpYWxfZ2FpbihwYWRhcHRlciwgMHhmZik7Ci0JCS8qIHR1cm4gb24gZHluYW1pYyBmdW5jdGlvbnMgKi8KLQkJcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9yZXN0b3JlKHBhZGFwdGVyKTsKLQotCQlpZiAoaXNfY2xpZW50X2Fzc29jaWF0ZWRfdG9fYXAyM2EocGFkYXB0ZXIpID09IHRydWUpCi0JCQlpc3N1ZV9udWxsZGF0YTIzYShwYWRhcHRlciwgTlVMTCwgMCwgMywgNTAwKTsKLQotCQlydGw4NzIzYV9tbG1lX3NpdGVzdXJ2ZXkocGFkYXB0ZXIsIDApOwotCi0JCXJlcG9ydF9zdXJ2ZXlkb25lX2V2ZW50MjNhKHBhZGFwdGVyKTsKLQotCQlwbWxtZWV4dC0+Y2hhbl9zY2FuX3RpbWUgPSBTVVJWRVlfVE87Ci0JCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9IFNDQU5fRElTQUJMRTsKLQl9Ci19Ci0KLS8qIGNvbGxlY3QgYnNzIGluZm8gZnJvbSBCZWFjb24gYW5kIFByb2JlIHJlcXVlc3QvcmVzcG9uc2UgZnJhbWVzLiAqLwotc3RhdGljIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjb2xsZWN0X2Jzc19pbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJCSAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKmJzc2lkOwotCWNvbnN0IHU4ICpwOwotCXU4ICpwaWU7Ci0JdW5zaWduZWQgaW50IGxlbmd0aDsKLQlpbnQgaTsKLQotCWxlbmd0aCA9IHNrYi0+bGVuOwotCi0JYnNzaWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCksIEdGUF9BVE9NSUMpOwotCWlmICghYnNzaWQpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKGllZWU4MDIxMV9pc19iZWFjb24obWdtdC0+ZnJhbWVfY29udHJvbCkpIHsKLQkJbGVuZ3RoIC09IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5iZWFjb24udmFyaWFibGUpOwotCQlwaWUgPSBtZ210LT51LmJlYWNvbi52YXJpYWJsZTsKLQkJYnNzaWQtPnJlc2VydmVkID0gMTsKLQkJYnNzaWQtPmNhcGFiaWxpdHkgPQotCQkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZtZ210LT51LmJlYWNvbi5jYXBhYl9pbmZvKTsKLQkJYnNzaWQtPmJlYWNvbl9pbnRlcnZhbCA9Ci0JCQlnZXRfdW5hbGlnbmVkX2xlMTYoJm1nbXQtPnUuYmVhY29uLmJlYWNvbl9pbnQpOwotCQlic3NpZC0+dHNmID0gZ2V0X3VuYWxpZ25lZF9sZTY0KCZtZ210LT51LmJlYWNvbi50aW1lc3RhbXApOwotCX0gZWxzZSBpZiAoaWVlZTgwMjExX2lzX3Byb2JlX3JlcShtZ210LT5mcmFtZV9jb250cm9sKSkgewotCQlsZW5ndGggLT0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LnByb2JlX3JlcS52YXJpYWJsZSk7Ci0JCXBpZSA9IG1nbXQtPnUucHJvYmVfcmVxLnZhcmlhYmxlOwotCQlic3NpZC0+cmVzZXJ2ZWQgPSAyOwotCQlic3NpZC0+Y2FwYWJpbGl0eSA9IDA7Ci0JCWJzc2lkLT5iZWFjb25faW50ZXJ2YWwgPQotCQkJcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5kZXZfbmV0d29yay5iZWFjb25faW50ZXJ2YWw7Ci0JCWJzc2lkLT50c2YgPSAwOwotCX0gZWxzZSBpZiAoaWVlZTgwMjExX2lzX3Byb2JlX3Jlc3AobWdtdC0+ZnJhbWVfY29udHJvbCkpIHsKLQkJbGVuZ3RoIC09Ci0JCQlvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUucHJvYmVfcmVzcC52YXJpYWJsZSk7Ci0JCXBpZSA9IG1nbXQtPnUucHJvYmVfcmVzcC52YXJpYWJsZTsKLQkJYnNzaWQtPnJlc2VydmVkID0gMzsKLQkJYnNzaWQtPmNhcGFiaWxpdHkgPQotCQkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZtZ210LT51LnByb2JlX3Jlc3AuY2FwYWJfaW5mbyk7Ci0JCWJzc2lkLT5iZWFjb25faW50ZXJ2YWwgPQotCQkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZtZ210LT51LnByb2JlX3Jlc3AuYmVhY29uX2ludCk7Ci0JCWJzc2lkLT50c2YgPSBnZXRfdW5hbGlnbmVkX2xlNjQoJm1nbXQtPnUucHJvYmVfcmVzcC50aW1lc3RhbXApOwotCX0gZWxzZSB7Ci0JCWxlbmd0aCAtPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKLQkJcGllID0gbWdtdC0+dS5iZWFjb24udmFyaWFibGU7Ci0JCWJzc2lkLT5yZXNlcnZlZCA9IDA7Ci0JCWJzc2lkLT5jYXBhYmlsaXR5ID0KLQkJCWdldF91bmFsaWduZWRfbGUxNigmbWdtdC0+dS5iZWFjb24uY2FwYWJfaW5mbyk7Ci0JCWJzc2lkLT5iZWFjb25faW50ZXJ2YWwgPQotCQkJcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5kZXZfbmV0d29yay5iZWFjb25faW50ZXJ2YWw7Ci0JCWJzc2lkLT50c2YgPSAwOwotCX0KLQotCWlmIChsZW5ndGggPiBNQVhfSUVfU1opIHsKLQkJLyogREJHXzg3MjNBKCJJRSB0b28gbG9uZyBmb3Igc3VydmV5IGV2ZW50XG4iKTsgKi8KLQkJa2ZyZWUoYnNzaWQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlic3NpZC0+TGVuZ3RoID0gb2Zmc2V0b2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgsIElFcykgKyBsZW5ndGg7Ci0KLQkvKiBiZWxvdyBpcyB0byBjb3B5IHRoZSBpbmZvcm1hdGlvbiBlbGVtZW50ICovCi0JYnNzaWQtPklFTGVuZ3RoID0gbGVuZ3RoOwotCW1lbWNweShic3NpZC0+SUVzLCBwaWUsIGJzc2lkLT5JRUxlbmd0aCk7Ci0KLQkvKiBnZXQgdGhlIHNpZ25hbCBzdHJlbmd0aCAqLwotCS8qICBpbiBkQk0ucmF3IGRhdGEgKi8KLQlic3NpZC0+UnNzaSA9IHByZWN2X2ZyYW1lLT5hdHRyaWIucGh5X2luZm8uUmVjdlNpZ25hbFBvd2VyOwotCWJzc2lkLT5TaWduYWxRdWFsaXR5ID0KLQkJcHJlY3ZfZnJhbWUtPmF0dHJpYi5waHlfaW5mby5TaWduYWxRdWFsaXR5Oy8qIGluIHBlcmNlbnRhZ2UgKi8KLQlic3NpZC0+U2lnbmFsU3RyZW5ndGggPQotCQlwcmVjdl9mcmFtZS0+YXR0cmliLnBoeV9pbmZvLlNpZ25hbFN0cmVuZ3RoOy8qIGluIHBlcmNlbnRhZ2UgKi8KLQotCS8qICBjaGVja2luZyBTU0lEICovCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfU1NJRCwgYnNzaWQtPklFcywgYnNzaWQtPklFTGVuZ3RoKTsKLQotCWlmICghcCkgewotCQlEQkdfODcyM0EoIm1hcmM6IGNhbm5vdCBmaW5kIFNTSUQgZm9yIHN1cnZleSBldmVudFxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlpZiAocFsxXSA+IElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pIHsKLQkJREJHXzg3MjNBKCIlcygpLSVkOiBJRSB0b28gbG9uZyAoJWQpIGZvciBzdXJ2ZXkgIgotCQkJICAiZXZlbnRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcFsxXSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JbWVtY3B5KGJzc2lkLT5Tc2lkLnNzaWQsIHAgKyAyLCBwWzFdKTsKLQlic3NpZC0+U3NpZC5zc2lkX2xlbiA9IHBbMV07Ci0KLQkvKiBjaGVja2luZyByYXRlIGluZm8uLi4gKi8KLQlpID0gMDsKLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9TVVBQX1JBVEVTLCBic3NpZC0+SUVzLCBic3NpZC0+SUVMZW5ndGgpOwotCWlmIChwKSB7Ci0JCWlmIChwWzFdID4gTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYKSB7Ci0JCQlEQkdfODcyM0EoIiVzKCktJWQ6IElFIHRvbyBsb25nICglZCkgZm9yIHN1cnZleSAiCi0JCQkJICAiZXZlbnRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcFsxXSk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJbWVtY3B5KGJzc2lkLT5TdXBwb3J0ZWRSYXRlcywgcCArIDIsIHBbMV0pOwotCQlpID0gcFsxXTsKLQl9Ci0KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9FWFRfU1VQUF9SQVRFUywgYnNzaWQtPklFcywKLQkJCSAgICAgYnNzaWQtPklFTGVuZ3RoKTsKLQlpZiAocCkgewotCQlpZiAocFsxXSA+IChORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVgtaSkpIHsKLQkJCURCR184NzIzQSgiJXMoKS0lZDogSUUgdG9vIGxvbmcgKCVkKSBmb3Igc3VydmV5ICIKLQkJCQkgICJldmVudFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBwWzFdKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQltZW1jcHkoYnNzaWQtPlN1cHBvcnRlZFJhdGVzICsgaSwgcCArIDIsIHBbMV0pOwotCX0KLQotCS8qICBDaGVja2luZyBmb3IgRFNDb25maWcgKi8KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9EU19QQVJBTVMsIGJzc2lkLT5JRXMsIGJzc2lkLT5JRUxlbmd0aCk7Ci0KLQlic3NpZC0+RFNDb25maWcgPSAwOwotCi0JaWYgKHApIHsKLQkJYnNzaWQtPkRTQ29uZmlnID0gcFsyXTsKLQl9IGVsc2Ugey8qICBJbiA1Rywgc29tZSBhcCBkbyBub3QgaGF2ZSBEU1NFVCBJRSAqLwotCQkvKiAgY2hlY2tpbmcgSFQgaW5mbyBmb3IgY2hhbm5lbCAqLwotCQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9IVF9PUEVSQVRJT04sIGJzc2lkLT5JRXMsCi0JCQkJICAgICBic3NpZC0+SUVMZW5ndGgpOwotCQlpZiAocCkgewotCQkJc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24gKkhUX2luZm8gPQotCQkJCShzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbiAqKShwICsgMik7Ci0JCQlic3NpZC0+RFNDb25maWcgPSBIVF9pbmZvLT5wcmltYXJ5X2NoYW47Ci0JCX0gZWxzZSAvKiAgdXNlIGN1cnJlbnQgY2hhbm5lbCAqLwotCQkJYnNzaWQtPkRTQ29uZmlnID0gcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKTsKLQl9Ci0KLQlpZiAoaWVlZTgwMjExX2lzX3Byb2JlX3JlcShtZ210LT5mcmFtZV9jb250cm9sKSkgewotCQkvKiAgRklYTUUgKi8KLQkJYnNzaWQtPmlmbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047Ci0JCWV0aGVyX2FkZHJfY29weShic3NpZC0+TWFjQWRkcmVzcywgbWdtdC0+c2EpOwotCQlic3NpZC0+UHJpdmFjeSA9IDE7Ci0JCXJldHVybiBic3NpZDsKLQl9Ci0KLQlpZiAoYnNzaWQtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfRVNTKSB7Ci0JCWJzc2lkLT5pZm1vZGUgPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOwotCQlldGhlcl9hZGRyX2NvcHkoYnNzaWQtPk1hY0FkZHJlc3MsIG1nbXQtPnNhKTsKLQl9IGVsc2UgewotCQlic3NpZC0+aWZtb2RlID0gTkw4MDIxMV9JRlRZUEVfQURIT0M7Ci0JCWV0aGVyX2FkZHJfY29weShic3NpZC0+TWFjQWRkcmVzcywgbWdtdC0+YnNzaWQpOwotCX0KLQotCWlmIChic3NpZC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKQotCQlic3NpZC0+UHJpdmFjeSA9IDE7Ci0JZWxzZQotCQlic3NpZC0+UHJpdmFjeSA9IDA7Ci0KLQlic3NpZC0+QVRJTVdpbmRvdyA9IDA7Ci0KLQkvKiAyMC80MCBCU1MgQ29leGlzdGVuY2UgY2hlY2sgKi8KLQlpZiAocHJlZ2lzdHJ5cHJpdi0+d2lmaV9zcGVjID09IDEgJiYKLQkgICAgcG1sbWVpbmZvLT5id21vZGVfdXBkYXRlZCA9PSBmYWxzZSkgewotCQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0JCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX0NBUEFCSUxJVFksIGJzc2lkLT5JRXMsCi0JCQkJICAgICBic3NpZC0+SUVMZW5ndGgpOwotCQlpZiAocCAmJiBwWzFdID4gMCkgewotCQkJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKnBIVF9jYXBzOwotCi0JCQlwSFRfY2FwcyA9IChzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqKShwICsgMik7Ci0KLQkJCWlmIChwSFRfY2Fwcy0+Y2FwX2luZm8gJgotCQkJICAgIGNwdV90b19sZTE2KElFRUU4MDIxMV9IVF9DQVBfNDBNSFpfSU5UT0xFUkFOVCkpCi0JCQkJcG1sbWVwcml2LT5udW1fRm9ydHlNSHpJbnRvbGVyYW50Kys7Ci0JCX0gZWxzZQotCQkJcG1sbWVwcml2LT5udW1fc3RhX25vX2h0Kys7Ci0JfQotCi0KLQkvKiAgbWFyayBic3MgaW5mbyByZWNlaXZpbmcgZnJvbSBuZWFyYnkgY2hhbm5lbCBhcyBTaWduYWxRdWFsaXR5IDEwMSAqLwotCWlmIChic3NpZC0+RFNDb25maWcgIT0gcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSkKLQkJYnNzaWQtPlNpZ25hbFF1YWxpdHkgPSAxMDE7Ci0KLQlyZXR1cm4gYnNzaWQ7Ci1mYWlsOgotCWtmcmVlIChic3NpZCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0X2NyZWF0ZV9pYnNzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdW5zaWduZWQgc2hvcnQgY2FwczsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0KLQlwbWxtZWV4dC0+Y3VyX2NoYW5uZWwgPSAodTgpcG5ldHdvcmstPkRTQ29uZmlnOwotCXBtbG1laW5mby0+YmNuX2ludGVydmFsID0gcG5ldHdvcmstPmJlYWNvbl9pbnRlcnZhbDsKLQotCS8qIHVwZGF0ZSB3aXJlbGVzcyBtb2RlICovCi0JdXBkYXRlX3dpcmVsZXNzX21vZGUyM2EocGFkYXB0ZXIpOwotCi0JLyogdXBkYXRlIGNhcGFiaWxpdHkgKi8KLQljYXBzID0gcG5ldHdvcmstPmNhcGFiaWxpdHk7Ci0JdXBkYXRlX2NhcGluZm8yM2EocGFkYXB0ZXIsIGNhcHMpOwotCWlmIChjYXBzICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpIHsJLyogYWRob2MgbWFzdGVyICovCi0JCXJ0bDg3MjNhX3NldF9zZWNfY2ZnKHBhZGFwdGVyLCAweGNmKTsKLQotCQkvKiBzd2l0Y2ggY2hhbm5lbCAqLwotCQkvKiBTZWxlY3RDaGFubmVsMjNhKHBhZGFwdGVyLCBwbWxtZWV4dC0+Y3VyX2NoYW5uZWwsIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUpOyAqLwotCQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSwgSFRfQ0hBTk5FTF9XSURUSF8yMCk7Ci0KLQkJcnRsODcyM2FfU2V0QmVhY29uUmVsYXRlZFJlZ2lzdGVycyhwYWRhcHRlcik7Ci0KLQkJLyogc2V0IG1zciB0byBNU1JfQURIT0MgKi8KLQkJcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9BREhPQzsKLQkJcnRsODcyM2Ffc2V0X21lZGlhX3N0YXR1cyhwYWRhcHRlciwgcG1sbWVpbmZvLT5zdGF0ZSAmIDB4Myk7Ci0KLQkJLyogaXNzdWUgYmVhY29uICovCi0JCWlmIChzZW5kX2JlYWNvbjIzYShwYWRhcHRlcikgPT0gX0ZBSUwpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJpc3N1aW5nIGJlYWNvbiBmcmFtZSBmYWlsLi4uLlxuIik7Ci0KLQkJCXJlcG9ydF9qb2luX3JlczIzYShwYWRhcHRlciwgLTEpOwotCQkJcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9OT0xJTks7Ci0JCX0gZWxzZSB7Ci0JCQlod192YXJfc2V0X2Jzc2lkKHBhZGFwdGVyLCBwYWRhcHRlci0+cmVnaXN0cnlwcml2LmRldl9uZXR3b3JrLk1hY0FkZHJlc3MpOwotCQkJaHdfdmFyX3NldF9tbG1lX2pvaW4ocGFkYXB0ZXIsIDApOwotCi0JCQlyZXBvcnRfam9pbl9yZXMyM2EocGFkYXB0ZXIsIDEpOwotCQkJcG1sbWVpbmZvLT5zdGF0ZSB8PSBXSUZJX0ZXX0FTU09DX1NVQ0NFU1M7Ci0JCX0KLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzOiBpbnZhbGlkIGNhcDoleFxuIiwgX19mdW5jX18sIGNhcHMpOwotCQlyZXR1cm47Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzdGFydF9jbG50X2pvaW4oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1bnNpZ25lZCBzaG9ydCBjYXBzOwotCXU4IHZhbDg7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCWludCBiZWFjb25fdGltZW91dDsKLQotCXBtbG1lZXh0LT5jdXJfY2hhbm5lbCA9ICh1OClwbmV0d29yay0+RFNDb25maWc7Ci0JcG1sbWVpbmZvLT5iY25faW50ZXJ2YWwgPSBwbmV0d29yay0+YmVhY29uX2ludGVydmFsOwotCi0JLyogdXBkYXRlIHdpcmVsZXNzIG1vZGUgKi8KLQl1cGRhdGVfd2lyZWxlc3NfbW9kZTIzYShwYWRhcHRlcik7Ci0KLQkvKiB1cGRhdGUgY2FwYWJpbGl0eSAqLwotCWNhcHMgPSBwbmV0d29yay0+Y2FwYWJpbGl0eTsKLQl1cGRhdGVfY2FwaW5mbzIzYShwYWRhcHRlciwgY2Fwcyk7Ci0JaWYgKGNhcHMgJiBXTEFOX0NBUEFCSUxJVFlfRVNTKSB7Ci0JCS8qIHN3aXRjaCBjaGFubmVsICovCi0JCXNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsLCBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCwgcG1sbWVleHQtPmN1cl9id21vZGUpOwotCi0JCXJ0bDg3MjNhX3NldF9tZWRpYV9zdGF0dXMocGFkYXB0ZXIsIE1TUl9JTkZSQSk7Ci0KLQkJdmFsOCA9IChwbWxtZWluZm8tPmF1dGhfYWxnbyA9PSBkb3QxMUF1dGhBbGdydGhtXzgwMjFYKSA/Ci0JCQkweGNjOiAweGNmOwotCi0JCXJ0bDg3MjNhX3NldF9zZWNfY2ZnKHBhZGFwdGVyLCB2YWw4KTsKLQotCQkvKiBzd2l0Y2ggY2hhbm5lbCAqLwotCQkvKiBzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwgcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQsIHBtbG1lZXh0LT5jdXJfYndtb2RlKTsgKi8KLQotCQkvKiBoZXJlIHdhaXQgZm9yIHJlY2VpdmluZyB0aGUgYmVhY29uIHRvIHN0YXJ0IGF1dGggKi8KLQkJLyogYW5kIGVuYWJsZSBhIHRpbWVyICovCi0JCWJlYWNvbl90aW1lb3V0ID0gZGVjaWRlX3dhaXRfZm9yX2JlYWNvbl90aW1lb3V0MjNhKHBtbG1laW5mby0+YmNuX2ludGVydmFsKTsKLQkJc2V0X2xpbmtfdGltZXIocG1sbWVleHQsIGJlYWNvbl90aW1lb3V0KTsKLQkJbW9kX3RpbWVyKCZwYWRhcHRlci0+bWxtZXByaXYuYXNzb2NfdGltZXIsIGppZmZpZXMgKwotCQkJICBtc2Vjc190b19qaWZmaWVzKChSRUFVVEhfVE8gKiBSRUFVVEhfTElNSVQpICsgKFJFQVNTT0NfVE8qUkVBU1NPQ19MSU1JVCkgKyBiZWFjb25fdGltZW91dCkpOwotCQlwbWxtZWluZm8tPnN0YXRlID0gV0lGSV9GV19BVVRIX05VTEwgfCBNU1JfSU5GUkE7Ci0JfSBlbHNlIGlmIChjYXBzICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpIHsJLyogYWRob2MgY2xpZW50ICovCi0JCXJ0bDg3MjNhX3NldF9tZWRpYV9zdGF0dXMocGFkYXB0ZXIsIE1TUl9BREhPQyk7Ci0KLQkJcnRsODcyM2Ffc2V0X3NlY19jZmcocGFkYXB0ZXIsIDB4Y2YpOwotCi0JCS8qIHN3aXRjaCBjaGFubmVsICovCi0JCXNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsLCBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCwgcG1sbWVleHQtPmN1cl9id21vZGUpOwotCi0JCXJ0bDg3MjNhX1NldEJlYWNvblJlbGF0ZWRSZWdpc3RlcnMocGFkYXB0ZXIpOwotCi0JCXBtbG1laW5mby0+c3RhdGUgPSBNU1JfQURIT0M7Ci0KLQkJcmVwb3J0X2pvaW5fcmVzMjNhKHBhZGFwdGVyLCAxKTsKLQl9IGVsc2UgewotCQkvKiBEQkdfODcyM0EoIm1hcmM6IGludmFsaWQgY2FwOiV4XG4iLCBjYXBzKTsgKi8KLQkJcmV0dXJuOwotCX0KLX0KLQotc3RhdGljIHZvaWQgc3RhcnRfY2xudF9hdXRoKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWRlbF90aW1lcl9zeW5jKCZwbWxtZWV4dC0+bGlua190aW1lcik7Ci0KLQlwbWxtZWluZm8tPnN0YXRlICY9ICh+V0lGSV9GV19BVVRIX05VTEwpOwotCXBtbG1laW5mby0+c3RhdGUgfD0gV0lGSV9GV19BVVRIX1NUQVRFOwotCi0JcG1sbWVpbmZvLT5hdXRoX3NlcSA9IDE7Ci0JcG1sbWVpbmZvLT5yZWF1dGhfY291bnQgPSAwOwotCXBtbG1laW5mby0+cmVhc3NvY19jb3VudCA9IDA7Ci0JcG1sbWVpbmZvLT5saW5rX2NvdW50ID0gMDsKLQlwbWxtZWV4dC0+cmV0cnkgPSAwOwotCi0JLyogIEJlY2F1c2Ugb2YgQVAncyBub3QgcmVjZWl2aW5nIGRlYXV0aCBiZWZvcmUgKi8KLQkvKiAgQVAgbWF5OiAxKW5vdCByZXNwb25zZSBhdXRoIG9yIDIpZGVhdXRoIHVzIGFmdGVyIGxpbmsgaXMgY29tcGxldGUgKi8KLQkvKiAgaXNzdWUgZGVhdXRoIGJlZm9yZSBpc3N1aW5nIGF1dGggdG8gZGVhbCB3aXRoIHRoZSBzaXR1YXRpb24gKi8KLQkvKglDb21tZW50ZWQgYnkgQWxiZXJ0IDIwMTIvMDcvMjEgKi8KLQkvKglGb3IgdGhlIFdpbjggUDJQIGNvbm5lY3Rpb24sIGl0IHdpbGwgYmUgaGFyZCB0byBoYXZlIGEKLQkJc3VjY2Vzc2Z1bCBjb25uZWN0aW9uIGlmIHRoaXMgV2ktRmkgZG9lc24ndCBjb25uZWN0IHRvIGl0LiAqLwotCWlzc3VlX2RlYXV0aDIzYShwYWRhcHRlciwgKCZwbWxtZWluZm8tPm5ldHdvcmspLT5NYWNBZGRyZXNzLAotCQkJV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOwotCi0JREJHXzg3MjNBX0xFVkVMKF9kcnZfYWx3YXlzXywgInN0YXJ0IGF1dGhcbiIpOwotCWlzc3VlX2F1dGgocGFkYXB0ZXIsIE5VTEwsIDApOwotCi0Jc2V0X2xpbmtfdGltZXIocG1sbWVleHQsIFJFQVVUSF9UTyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0X2NsbnRfYXNzb2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JZGVsX3RpbWVyX3N5bmMoJnBtbG1lZXh0LT5saW5rX3RpbWVyKTsKLQotCXBtbG1laW5mby0+c3RhdGUgJj0gKH4oV0lGSV9GV19BVVRIX05VTEwgfCBXSUZJX0ZXX0FVVEhfU1RBVEUpKTsKLQlwbWxtZWluZm8tPnN0YXRlIHw9IChXSUZJX0ZXX0FVVEhfU1VDQ0VTUyB8IFdJRklfRldfQVNTT0NfU1RBVEUpOwotCi0JaXNzdWVfYXNzb2NyZXEocGFkYXB0ZXIpOwotCi0Jc2V0X2xpbmtfdGltZXIocG1sbWVleHQsIFJFQVNTT0NfVE8pOwotfQotCi1pbnQgcmVjZWl2ZV9kaXNjb25uZWN0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgIHVuc2lnbmVkIGNoYXIgKk1hY0FkZHIsIHVuc2lnbmVkIHNob3J0IHJlYXNvbikKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JLyogY2hlY2sgQTMgKi8KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwoTWFjQWRkciwgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKSkKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpID09IE1TUl9JTkZSQSkgewotCQlpZiAocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVNTT0NfU1VDQ0VTUykgewotCQkJcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9OT0xJTks7Ci0JCQlyZXBvcnRfZGVsX3N0YV9ldmVudDIzYShwYWRhcHRlciwgTWFjQWRkciwgcmVhc29uKTsKLQotCQl9IGVsc2UgaWYgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0xJTktJTkdfU1RBVEUpIHsKLQkJCXBtbG1laW5mby0+c3RhdGUgPSBNU1JfTk9MSU5LOwotCQkJcmVwb3J0X2pvaW5fcmVzMjNhKHBhZGFwdGVyLCAtMik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyB2b2lkIHByb2Nlc3NfODAyMTFkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYnNzaWQpCi17Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0OwotCXN0cnVjdCBydF9jaGFubmVsX2luZm8gKmNocGxhbl9uZXc7Ci0JdTggY2hhbm5lbDsKLQl1OCBpOwotCi0JcHJlZ2lzdHJ5cHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCS8qICBBZGp1c3QgY2hhbm5lbCBwbGFuIGJ5IEFQIENvdW50cnkgSUUgKi8KLQlpZiAocHJlZ2lzdHJ5cHJpdi0+ZW5hYmxlODAyMTFkICYmCi0JICAgICFwbWxtZWV4dC0+dXBkYXRlX2NoYW5uZWxfcGxhbl9ieV9hcF9kb25lKSB7Ci0JCWNvbnN0IHU4ICppZSwgKnA7Ci0JCXN0cnVjdCBydF9jaGFubmVsX3BsYW4gY2hwbGFuX2FwOwotCQlzdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvIGNocGxhbl9zdGFbTUFYX0NIQU5ORUxfTlVNXTsKLQkJdTggY291bnRyeVs0XTsKLQkJdTggZmNuOyAvKiAgZmlyc3QgY2hhbm5lbCBudW1iZXIgKi8KLQkJdTggbm9jOyAvKiAgbnVtYmVyIG9mIGNoYW5uZWwgKi8KLQkJdTggaiwgazsKLQotCQlpZSA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfQ09VTlRSWSwgYnNzaWQtPklFcywKLQkJCQkgICAgICBic3NpZC0+SUVMZW5ndGgpOwotCQlpZiAoIWllIHx8IGllWzFdIDwgSUVFRTgwMjExX0NPVU5UUllfSUVfTUlOX0xFTikKLQkJCXJldHVybjsKLQotCQlwID0gaWUgKyAyOwotCQlpZSArPSBpZVsxXTsKLQkJaWUgKz0gMjsKLQotCQltZW1jcHkoY291bnRyeSwgcCwgMyk7Ci0JCWNvdW50cnlbM10gPSAnXDAnOwotCi0JCXAgKz0gMzsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywKLQkJCSAiJXM6IDgwMi4xMWQgY291bnRyeSA9JXNcbiIsIF9fZnVuY19fLCBjb3VudHJ5KTsKLQotCQlpID0gMDsKLQkJd2hpbGUgKChpZSAtIHApID49IDMpIHsKLQkJCWZjbiA9ICoocCsrKTsKLQkJCW5vYyA9ICoocCsrKTsKLQkJCXArKzsKLQotCQkJZm9yIChqID0gMDsgaiA8IG5vYzsgaisrKSB7Ci0JCQkJaWYgKGZjbiA8PSAxNCkKLQkJCQkJY2hhbm5lbCA9IGZjbiArIGo7IC8qICAyLjQgR0h6ICovCi0JCQkJZWxzZQotCQkJCQljaGFubmVsID0gZmNuICsgaiAqIDQ7IC8qICA1IEdIeiAqLwotCi0JCQkJY2hwbGFuX2FwLkNoYW5uZWxbaSsrXSA9IGNoYW5uZWw7Ci0JCQl9Ci0JCX0KLQkJY2hwbGFuX2FwLkxlbiA9IGk7Ci0KLQkJbWVtY3B5KGNocGxhbl9zdGEsIHBtbG1lZXh0LT5jaGFubmVsX3NldCwgc2l6ZW9mKGNocGxhbl9zdGEpKTsKLQkJbWVtc2V0KHBtbG1lZXh0LT5jaGFubmVsX3NldCwgMCwgc2l6ZW9mKHBtbG1lZXh0LT5jaGFubmVsX3NldCkpOwotCQljaHBsYW5fbmV3ID0gcG1sbWVleHQtPmNoYW5uZWxfc2V0OwotCi0JCWkgPSBqID0gayA9IDA7Ci0JCWlmIChwcmVnaXN0cnlwcml2LT53aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFHKSB7Ci0JCQlkbyB7Ci0JCQkJaWYgKGkgPT0gTUFYX0NIQU5ORUxfTlVNIHx8Ci0JCQkJICAgIGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSA9PSAwIHx8Ci0JCQkJICAgIGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSA+IDE0KQotCQkJCQlicmVhazsKLQotCQkJCWlmIChqID09IGNocGxhbl9hcC5MZW4gfHwKLQkJCQkgICAgY2hwbGFuX2FwLkNoYW5uZWxbal0gPiAxNCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlpZiAoY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtID09Ci0JCQkJICAgIGNocGxhbl9hcC5DaGFubmVsW2pdKSB7Ci0JCQkJCWNocGxhbl9uZXdba10uQ2hhbm5lbE51bSA9Ci0JCQkJCQljaHBsYW5fYXAuQ2hhbm5lbFtqXTsKLQkJCQkJY2hwbGFuX25ld1trXS5TY2FuVHlwZSA9IFNDQU5fQUNUSVZFOwotCQkJCQlpKys7Ci0JCQkJCWorKzsKLQkJCQkJaysrOwotCQkJCX0gZWxzZSBpZiAoY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtIDwKLQkJCQkJICAgY2hwbGFuX2FwLkNoYW5uZWxbal0pIHsKLQkJCQkJY2hwbGFuX25ld1trXS5DaGFubmVsTnVtID0KLQkJCQkJCWNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bTsKLQkJCQkJY2hwbGFuX25ld1trXS5TY2FuVHlwZSA9Ci0JCQkJCQlTQ0FOX1BBU1NJVkU7Ci0JCQkJCWkrKzsKLQkJCQkJaysrOwotCQkJCX0gZWxzZSBpZiAoY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtID4KLQkJCQkJICAgY2hwbGFuX2FwLkNoYW5uZWxbal0pIHsKLQkJCQkJY2hwbGFuX25ld1trXS5DaGFubmVsTnVtID0KLQkJCQkJCWNocGxhbl9hcC5DaGFubmVsW2pdOwotCQkJCQljaHBsYW5fbmV3W2tdLlNjYW5UeXBlID0KLQkJCQkJCVNDQU5fQUNUSVZFOwotCQkJCQlqKys7Ci0JCQkJCWsrKzsKLQkJCQl9Ci0JCQl9IHdoaWxlICgxKTsKLQotCQkJLyogIGNoYW5nZSBBUCBub3Qgc3VwcG9ydCBjaGFubmVsIHRvIFBhc3NpdmUgc2NhbiAqLwotCQkJd2hpbGUgKGkgPCBNQVhfQ0hBTk5FTF9OVU0gJiYKLQkJCSAgICAgICBjaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW0gIT0gMCAmJgotCQkJICAgICAgIGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSA8PSAxNCkgewotCQkJCWNocGxhbl9uZXdba10uQ2hhbm5lbE51bSA9Ci0JCQkJCWNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bTsKLQkJCQljaHBsYW5fbmV3W2tdLlNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOwotCQkJCWkrKzsKLQkJCQlrKys7Ci0JCQl9Ci0KLQkJCS8qICBhZGQgY2hhbm5lbCBBUCBzdXBwb3J0ZWQgKi8KLQkJCXdoaWxlIChqIDwgY2hwbGFuX2FwLkxlbiAmJiBjaHBsYW5fYXAuQ2hhbm5lbFtqXSA8PSAxNCl7Ci0JCQkJY2hwbGFuX25ld1trXS5DaGFubmVsTnVtID0gY2hwbGFuX2FwLkNoYW5uZWxbal07Ci0JCQkJY2hwbGFuX25ld1trXS5TY2FuVHlwZSA9IFNDQU5fQUNUSVZFOwotCQkJCWorKzsKLQkJCQlrKys7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiAga2VlcCBvcmlnaW5hbCBTVEEgMi40RyBjaGFubmVsIHBsYW4gKi8KLQkJCXdoaWxlIChpIDwgTUFYX0NIQU5ORUxfTlVNICYmCi0JCQkgICAgICAgY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtICE9IDAgJiYKLQkJCSAgICAgICBjaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW0gPD0gMTQpIHsKLQkJCQljaHBsYW5fbmV3W2tdLkNoYW5uZWxOdW0gPQotCQkJCQljaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW07Ci0JCQkJY2hwbGFuX25ld1trXS5TY2FuVHlwZSA9IGNocGxhbl9zdGFbaV0uU2NhblR5cGU7Ci0JCQkJaSsrOwotCQkJCWsrKzsKLQkJCX0KLQotCQkJLyogIHNraXAgQVAgMi40RyBjaGFubmVsIHBsYW4gKi8KLQkJCXdoaWxlIChqIDwgY2hwbGFuX2FwLkxlbiAmJiBjaHBsYW5fYXAuQ2hhbm5lbFtqXSA8PSAxNCkKLQkJCQlqKys7Ci0JCX0KLQotCQlpZiAocHJlZ2lzdHJ5cHJpdi0+d2lyZWxlc3NfbW9kZSAmIFdJUkVMRVNTXzExQSkgewotCQkJZG8gewotCQkJCWlmIChpID09IE1BWF9DSEFOTkVMX05VTSB8fAotCQkJCSAgICBjaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW0gPT0gMCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlpZiAoaiA9PSBjaHBsYW5fYXAuTGVuIHx8Ci0JCQkJICAgIGNocGxhbl9hcC5DaGFubmVsW2pdID09IDApCi0JCQkJCWJyZWFrOwotCi0JCQkJaWYgKGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSA9PQotCQkJCSAgICBjaHBsYW5fYXAuQ2hhbm5lbFtqXSkgewotCQkJCQljaHBsYW5fbmV3W2tdLkNoYW5uZWxOdW0gPQotCQkJCQkJY2hwbGFuX2FwLkNoYW5uZWxbal07Ci0JCQkJCWNocGxhbl9uZXdba10uU2NhblR5cGUgPSBTQ0FOX0FDVElWRTsKLQkJCQkJaSsrOwotCQkJCQlqKys7Ci0JCQkJCWsrKzsKLQkJCQl9IGVsc2UgaWYgKGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSA8Ci0JCQkJCSAgIGNocGxhbl9hcC5DaGFubmVsW2pdKSB7Ci0JCQkJCWNocGxhbl9uZXdba10uQ2hhbm5lbE51bSA9Ci0JCQkJCQljaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW07Ci0JCQkJCWNocGxhbl9uZXdba10uU2NhblR5cGUgPSBTQ0FOX1BBU1NJVkU7Ci0JCQkJCWkrKzsKLQkJCQkJaysrOwotCQkJCX0gZWxzZSBpZiAoY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtID4KLQkJCQkJICAgY2hwbGFuX2FwLkNoYW5uZWxbal0pIHsKLQkJCQkJY2hwbGFuX25ld1trXS5DaGFubmVsTnVtID0KLQkJCQkJCWNocGxhbl9hcC5DaGFubmVsW2pdOwotCQkJCQljaHBsYW5fbmV3W2tdLlNjYW5UeXBlID0gU0NBTl9BQ1RJVkU7Ci0JCQkJCWorKzsKLQkJCQkJaysrOwotCQkJCX0KLQkJCX0gd2hpbGUgKDEpOwotCi0JCQkvKiAgY2hhbmdlIEFQIG5vdCBzdXBwb3J0IGNoYW5uZWwgdG8gUGFzc2l2ZSBzY2FuICovCi0JCQl3aGlsZSAoaSA8IE1BWF9DSEFOTkVMX05VTSAmJgotCQkJICAgICAgIGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSAhPSAwKSB7Ci0JCQkJY2hwbGFuX25ld1trXS5DaGFubmVsTnVtID0KLQkJCQkJY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtOwotCQkJCWNocGxhbl9uZXdba10uU2NhblR5cGUgPSBTQ0FOX1BBU1NJVkU7Ci0JCQkJaSsrOwotCQkJCWsrKzsKLQkJCX0KLQotCQkJLyogIGFkZCBjaGFubmVsIEFQIHN1cHBvcnRlZCAqLwotCQkJd2hpbGUgKGogPCBjaHBsYW5fYXAuTGVuICYmIGNocGxhbl9hcC5DaGFubmVsW2pdICE9IDApIHsKLQkJCQljaHBsYW5fbmV3W2tdLkNoYW5uZWxOdW0gPSBjaHBsYW5fYXAuQ2hhbm5lbFtqXTsKLQkJCQljaHBsYW5fbmV3W2tdLlNjYW5UeXBlID0gU0NBTl9BQ1RJVkU7Ci0JCQkJaisrOwotCQkJCWsrKzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qICBrZWVwIG9yaWdpbmFsIFNUQSA1RyBjaGFubmVsIHBsYW4gKi8KLQkJCXdoaWxlIChpIDwgTUFYX0NIQU5ORUxfTlVNICYmCi0JCQkgICAgICAgY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtICE9IDApIHsKLQkJCQljaHBsYW5fbmV3W2tdLkNoYW5uZWxOdW0gPQotCQkJCQljaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW07Ci0JCQkJY2hwbGFuX25ld1trXS5TY2FuVHlwZSA9IGNocGxhbl9zdGFbaV0uU2NhblR5cGU7Ci0JCQkJaSsrOwotCQkJCWsrKzsKLQkJCX0KLQkJfQotCQlwbWxtZWV4dC0+dXBkYXRlX2NoYW5uZWxfcGxhbl9ieV9hcF9kb25lID0gMTsKLQl9Ci0KLQkvKiAgSWYgY2hhbm5lbCBpcyB1c2VkIGJ5IEFQLCBzZXQgY2hhbm5lbCBzY2FuIHR5cGUgdG8gYWN0aXZlICovCi0JY2hhbm5lbCA9IGJzc2lkLT5EU0NvbmZpZzsKLQljaHBsYW5fbmV3ID0gcG1sbWVleHQtPmNoYW5uZWxfc2V0OwotCWkgPSAwOwotCXdoaWxlIChpIDwgTUFYX0NIQU5ORUxfTlVNICYmIGNocGxhbl9uZXdbaV0uQ2hhbm5lbE51bSAhPSAwKSB7Ci0JCWlmIChjaHBsYW5fbmV3W2ldLkNoYW5uZWxOdW0gPT0gY2hhbm5lbCkgewotCQkJaWYgKGNocGxhbl9uZXdbaV0uU2NhblR5cGUgPT0gU0NBTl9QQVNTSVZFKSB7Ci0JCQkJLyogNUcgQm5hZCAyLCAzIChERlMpIGRvZXNuJ3QgY2hhbmdlCi0JCQkJICAgdG8gYWN0aXZlIHNjYW4gKi8KLQkJCQlpZiAoY2hhbm5lbCA+PSA1MiAmJiBjaGFubmVsIDw9IDE0NCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQljaHBsYW5fbmV3W2ldLlNjYW5UeXBlID0gU0NBTl9BQ1RJVkU7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywKLQkJCQkJICIlczogY2hhbmdlIGNoYW5uZWwgJWQgc2NhbiB0eXBlIGZyb20gcGFzc2l2ZSB0byBhY3RpdmVcbiIsCi0JCQkJCSBfX2Z1bmNfXywgY2hhbm5lbCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlpKys7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1Gb2xsb3dpbmcgYXJlIHRoZSBmdW5jdGlvbnMgdG8gcmVwb3J0IGV2ZW50cwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCByZXBvcnRfc3VydmV5X2V2ZW50MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXN0cnVjdCBjbWRfb2JqICpwY21kX29iajsKLQl1OCAqcGV2dGNtZDsKLQl1MzIgY21kc3o7Ci0Jc3RydWN0IHN1cnZleV9ldmVudCAqcHN1cnZleV9ldnQ7Ci0Jc3RydWN0IEMySEV2ZW50X0hlYWRlciAqcGMyaF9ldnRfaGRyOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dDsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2OwotCi0JaWYgKCFwYWRhcHRlcikKLQkJcmV0dXJuOwotCi0JcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCi0JcGNtZF9vYmogPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9BVE9NSUMpOwotCWlmICghcGNtZF9vYmopCi0JCXJldHVybjsKLQotCWNtZHN6ID0gc2l6ZW9mKHN0cnVjdCBzdXJ2ZXlfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpOwotCXBldnRjbWQgPSBremFsbG9jKGNtZHN6LCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBldnRjbWQpIHsKLQkJa2ZyZWUocGNtZF9vYmopOwotCQlyZXR1cm47Ci0JfQotCi0JcGNtZF9vYmotPmNtZGNvZGUgPSBHRU5fQ01EX0NPREUoX1NldF9NTE1FX0VWVCk7Ci0JcGNtZF9vYmotPmNtZHN6ID0gY21kc3o7Ci0JcGNtZF9vYmotPnBhcm1idWYgPSBwZXZ0Y21kOwotCi0JcGNtZF9vYmotPnJzcCA9IE5VTEw7Ci0JcGNtZF9vYmotPnJzcHN6ICA9IDA7Ci0KLQlwYzJoX2V2dF9oZHIgPSAoc3RydWN0IEMySEV2ZW50X0hlYWRlciAqKShwZXZ0Y21kKTsKLQlwYzJoX2V2dF9oZHItPmxlbiA9IHNpemVvZihzdHJ1Y3Qgc3VydmV5X2V2ZW50KTsKLQlwYzJoX2V2dF9oZHItPklEID0gR0VOX0VWVF9DT0RFKF9TdXJ2ZXkpOwotCXBjMmhfZXZ0X2hkci0+c2VxID0gYXRvbWljX2luY19yZXR1cm4oJnBtbG1lZXh0LT5ldmVudF9zZXEpOwotCi0JcHN1cnZleV9ldnQgPSAoc3RydWN0IHN1cnZleV9ldmVudCopKHBldnRjbWQgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOwotCi0JcHN1cnZleV9ldnQtPmJzcyA9IGNvbGxlY3RfYnNzX2luZm8ocGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKLQlpZiAoIXBzdXJ2ZXlfZXZ0LT5ic3MpIHsKLQkJa2ZyZWUocGNtZF9vYmopOwotCQlrZnJlZShwZXZ0Y21kKTsKLQkJcmV0dXJuOwotCX0KLQotCXByb2Nlc3NfODAyMTFkKHBhZGFwdGVyLCBwc3VydmV5X2V2dC0+YnNzKTsKLQotCXJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGNtZF9vYmopOwotCi0JcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmJzc19jbnQrKzsKLX0KLQotdm9pZCByZXBvcnRfc3VydmV5ZG9uZV9ldmVudDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBjbWRfb2JqICpwY21kX29iajsKLQl1OCAqcGV2dGNtZDsKLQl1MzIgY21kc3o7Ci0Jc3RydWN0IHN1cnZleWRvbmVfZXZlbnQgKnBzdXJ2ZXlkb25lX2V2dDsKLQlzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyICpwYzJoX2V2dF9oZHI7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCi0JcGNtZF9vYmogPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9BVE9NSUMpOwotCWlmICghcGNtZF9vYmopCi0JCXJldHVybjsKLQotCWNtZHN6ID0gc2l6ZW9mKHN0cnVjdCBzdXJ2ZXlkb25lX2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKTsKLQlwZXZ0Y21kID0ga3phbGxvYyhjbWRzeiwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwZXZ0Y21kKSB7Ci0JCWtmcmVlKHBjbWRfb2JqKTsKLQkJcmV0dXJuOwotCX0KLQotCXBjbWRfb2JqLT5jbWRjb2RlID0gR0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpOwotCXBjbWRfb2JqLT5jbWRzeiA9IGNtZHN6OwotCXBjbWRfb2JqLT5wYXJtYnVmID0gcGV2dGNtZDsKLQotCXBjbWRfb2JqLT5yc3AgPSBOVUxMOwotCXBjbWRfb2JqLT5yc3BzeiAgPSAwOwotCi0JcGMyaF9ldnRfaGRyID0gKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKikocGV2dGNtZCk7Ci0JcGMyaF9ldnRfaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHN1cnZleWRvbmVfZXZlbnQpOwotCXBjMmhfZXZ0X2hkci0+SUQgPSBHRU5fRVZUX0NPREUoX1N1cnZleURvbmUpOwotCXBjMmhfZXZ0X2hkci0+c2VxID0gYXRvbWljX2luY19yZXR1cm4oJnBtbG1lZXh0LT5ldmVudF9zZXEpOwotCi0JcHN1cnZleWRvbmVfZXZ0ID0gKHN0cnVjdCBzdXJ2ZXlkb25lX2V2ZW50KikocGV2dGNtZCArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7Ci0JcHN1cnZleWRvbmVfZXZ0LT5ic3NfY250ID0gcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmJzc19jbnQ7Ci0KLQlEQkdfODcyM0EoInN1cnZleSBkb25lIGV2ZW50KCV4KVxuIiwgcHN1cnZleWRvbmVfZXZ0LT5ic3NfY250KTsKLQotCXJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGNtZF9vYmopOwotfQotCi12b2lkIHJlcG9ydF9qb2luX3JlczIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBpbnQgcmVzKQotewotCXN0cnVjdCBjbWRfb2JqICpwY21kX29iajsKLQl1OCAqcGV2dGNtZDsKLQl1MzIgY21kc3o7Ci0Jc3RydWN0IGpvaW5ic3NfZXZlbnQJCSpwam9pbmJzc19ldnQ7Ci0Jc3RydWN0IEMySEV2ZW50X0hlYWRlcgkqcGMyaF9ldnRfaGRyOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2CQkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0KLQlwY21kX29iaiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwY21kX29iaikKLQkJcmV0dXJuOwotCi0JY21kc3ogPSBzaXplb2Yoc3RydWN0IGpvaW5ic3NfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpOwotCXBldnRjbWQgPSBremFsbG9jKGNtZHN6LCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBldnRjbWQpIHsKLQkJa2ZyZWUocGNtZF9vYmopOwotCQlyZXR1cm47Ci0JfQotCi0JcGNtZF9vYmotPmNtZGNvZGUgPSBHRU5fQ01EX0NPREUoX1NldF9NTE1FX0VWVCk7Ci0JcGNtZF9vYmotPmNtZHN6ID0gY21kc3o7Ci0JcGNtZF9vYmotPnBhcm1idWYgPSBwZXZ0Y21kOwotCi0JcGNtZF9vYmotPnJzcCA9IE5VTEw7Ci0JcGNtZF9vYmotPnJzcHN6ICA9IDA7Ci0KLQlwYzJoX2V2dF9oZHIgPSAoc3RydWN0IEMySEV2ZW50X0hlYWRlciAqKShwZXZ0Y21kKTsKLQlwYzJoX2V2dF9oZHItPmxlbiA9IHNpemVvZihzdHJ1Y3Qgam9pbmJzc19ldmVudCk7Ci0JcGMyaF9ldnRfaGRyLT5JRCA9IEdFTl9FVlRfQ09ERShfSm9pbkJzcyk7Ci0JcGMyaF9ldnRfaGRyLT5zZXEgPSBhdG9taWNfaW5jX3JldHVybigmcG1sbWVleHQtPmV2ZW50X3NlcSk7Ci0KLQlwam9pbmJzc19ldnQgPSAoc3RydWN0IGpvaW5ic3NfZXZlbnQqKShwZXZ0Y21kICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpKTsKLQltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikmcGpvaW5ic3NfZXZ0LT5uZXR3b3JrLm5ldHdvcmssCi0JICAgICAgICZwbWxtZWluZm8tPm5ldHdvcmssIHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCkpOwotCXBqb2luYnNzX2V2dC0+bmV0d29yay5qb2luX3JlcyA9IHJlczsKLQotCURCR184NzIzQSgicmVwb3J0X2pvaW5fcmVzMjNhKCVkKVxuIiwgcmVzKTsKLQotCXJ0d19qb2luYnNzX2V2ZW50X3ByZWhhbmRsZTIzYShwYWRhcHRlciwgKHU4ICopJnBqb2luYnNzX2V2dC0+bmV0d29yayk7Ci0KLQlydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBjbWRfb2JqKTsKLX0KLQotdm9pZCByZXBvcnRfZGVsX3N0YV9ldmVudDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICB1bnNpZ25lZCBjaGFyICpNYWNBZGRyLCB1bnNpZ25lZCBzaG9ydCByZWFzb24pCi17Ci0Jc3RydWN0IGNtZF9vYmogKnBjbWRfb2JqOwotCXU4ICpwZXZ0Y21kOwotCXUzMiBjbWRzejsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0JaW50IG1hY19pZDsKLQlzdHJ1Y3Qgc3RhZGVsX2V2ZW50ICpwZGVsX3N0YV9ldnQ7Ci0Jc3RydWN0IEMySEV2ZW50X0hlYWRlciAqcGMyaF9ldnRfaGRyOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKLQotCXBjbWRfb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBjbWRfb2JqKQotCQlyZXR1cm47Ci0KLQljbWRzeiA9IHNpemVvZihzdHJ1Y3Qgc3RhZGVsX2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKTsKLQlwZXZ0Y21kID0ga3phbGxvYyhjbWRzeiwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwZXZ0Y21kKSB7Ci0JCWtmcmVlKHBjbWRfb2JqKTsKLQkJcmV0dXJuOwotCX0KLQotCXBjbWRfb2JqLT5jbWRjb2RlID0gR0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpOwotCXBjbWRfb2JqLT5jbWRzeiA9IGNtZHN6OwotCXBjbWRfb2JqLT5wYXJtYnVmID0gcGV2dGNtZDsKLQotCXBjbWRfb2JqLT5yc3AgPSBOVUxMOwotCXBjbWRfb2JqLT5yc3BzeiAgPSAwOwotCi0JcGMyaF9ldnRfaGRyID0gKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKikocGV2dGNtZCk7Ci0JcGMyaF9ldnRfaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHN0YWRlbF9ldmVudCk7Ci0JcGMyaF9ldnRfaGRyLT5JRCA9IEdFTl9FVlRfQ09ERShfRGVsU1RBKTsKLQlwYzJoX2V2dF9oZHItPnNlcSA9IGF0b21pY19pbmNfcmV0dXJuKCZwbWxtZWV4dC0+ZXZlbnRfc2VxKTsKLQotCXBkZWxfc3RhX2V2dCA9IChzdHJ1Y3Qgc3RhZGVsX2V2ZW50KikocGV2dGNtZCArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7Ci0JZXRoZXJfYWRkcl9jb3B5KCh1bnNpZ25lZCBjaGFyICopJnBkZWxfc3RhX2V2dC0+bWFjYWRkciwgTWFjQWRkcik7Ci0JbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcGRlbF9zdGFfZXZ0LT5yc3ZkLCAodW5zaWduZWQgY2hhciAqKSZyZWFzb24sCi0JICAgICAgIDIpOwotCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsIE1hY0FkZHIpOwotCWlmIChwc3RhKQotCQltYWNfaWQgPSAoaW50KXBzdGEtPm1hY19pZDsKLQllbHNlCi0JCW1hY19pZCA9IC0xOwotCi0JcGRlbF9zdGFfZXZ0LT5tYWNfaWQgPSBtYWNfaWQ7Ci0KLQlEQkdfODcyM0EoInJlcG9ydF9kZWxfc3RhX2V2ZW50MjNhOiBkZWxldGUgU1RBLCBtYWNfaWQgPSVkXG4iLCBtYWNfaWQpOwotCi0JcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwY21kX29iaik7Ci19Ci0KLXZvaWQgcmVwb3J0X2FkZF9zdGFfZXZlbnQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgdW5zaWduZWQgY2hhciAqTWFjQWRkciwgaW50IGNhbV9pZHgpCi17Ci0Jc3RydWN0IGNtZF9vYmogKnBjbWRfb2JqOwotCXU4ICpwZXZ0Y21kOwotCXUzMiBjbWRzejsKLQlzdHJ1Y3Qgc3Rhc3NvY19ldmVudCAqcGFkZF9zdGFfZXZ0OwotCXN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKnBjMmhfZXZ0X2hkcjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0KLQlwY21kX29iaiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwY21kX29iaikKLQkJcmV0dXJuOwotCi0JY21kc3ogPSBzaXplb2Yoc3RydWN0IHN0YXNzb2NfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpOwotCXBldnRjbWQgPSBremFsbG9jKGNtZHN6LCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBldnRjbWQpIHsKLQkJa2ZyZWUocGNtZF9vYmopOwotCQlyZXR1cm47Ci0JfQotCi0JcGNtZF9vYmotPmNtZGNvZGUgPSBHRU5fQ01EX0NPREUoX1NldF9NTE1FX0VWVCk7Ci0JcGNtZF9vYmotPmNtZHN6ID0gY21kc3o7Ci0JcGNtZF9vYmotPnBhcm1idWYgPSBwZXZ0Y21kOwotCi0JcGNtZF9vYmotPnJzcCA9IE5VTEw7Ci0JcGNtZF9vYmotPnJzcHN6ICA9IDA7Ci0KLQlwYzJoX2V2dF9oZHIgPSAoc3RydWN0IEMySEV2ZW50X0hlYWRlciAqKShwZXZ0Y21kKTsKLQlwYzJoX2V2dF9oZHItPmxlbiA9IHNpemVvZihzdHJ1Y3Qgc3Rhc3NvY19ldmVudCk7Ci0JcGMyaF9ldnRfaGRyLT5JRCA9IEdFTl9FVlRfQ09ERShfQWRkU1RBKTsKLQlwYzJoX2V2dF9oZHItPnNlcSA9IGF0b21pY19pbmNfcmV0dXJuKCZwbWxtZWV4dC0+ZXZlbnRfc2VxKTsKLQotCXBhZGRfc3RhX2V2dCA9IChzdHJ1Y3Qgc3Rhc3NvY19ldmVudCopKHBldnRjbWQgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOwotCWV0aGVyX2FkZHJfY29weSgodW5zaWduZWQgY2hhciAqKSZwYWRkX3N0YV9ldnQtPm1hY2FkZHIsIE1hY0FkZHIpOwotCXBhZGRfc3RhX2V2dC0+Y2FtX2lkID0gY2FtX2lkeDsKLQotCURCR184NzIzQSgicmVwb3J0X2FkZF9zdGFfZXZlbnQyM2E6IGFkZCBTVEFcbiIpOwotCi0JcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwY21kX29iaik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUZvbGxvd2luZyBhcmUgdGhlIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZm9yIHN0YS9hZGhvYyBtb2RlICovCi12b2lkIHVwZGF0ZV9zdGFfaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JLyogRVJQICovCi0JVkNTX3VwZGF0ZTIzYShwYWRhcHRlciwgcHN0YSk7Ci0KLQkvKiBIVCAqLwotCWlmIChwbWxtZXByaXYtPmh0cHJpdi5odF9vcHRpb24pIHsKLQkJcHN0YS0+aHRwcml2Lmh0X29wdGlvbiA9IHRydWU7Ci0KLQkJcHN0YS0+aHRwcml2LmFtcGR1X2VuYWJsZSA9IHBtbG1lcHJpdi0+aHRwcml2LmFtcGR1X2VuYWJsZTsKLQotCQlpZiAoc3VwcG9ydF9zaG9ydF9HSTIzYShwYWRhcHRlciwgJnBtbG1laW5mby0+aHRfY2FwKSkKLQkJCXBzdGEtPmh0cHJpdi5zZ2kgPSB0cnVlOwotCi0JCXBzdGEtPnFvc19vcHRpb24gPSB0cnVlOwotCi0JfSBlbHNlIHsKLQkJcHN0YS0+aHRwcml2Lmh0X29wdGlvbiA9IGZhbHNlOwotCi0JCXBzdGEtPmh0cHJpdi5hbXBkdV9lbmFibGUgPSBmYWxzZTsKLQotCQlwc3RhLT5odHByaXYuc2dpID0gZmFsc2U7Ci0JCXBzdGEtPnFvc19vcHRpb24gPSBmYWxzZTsKLQotCX0KLQlwc3RhLT5odHByaXYuYndtb2RlID0gcG1sbWVleHQtPmN1cl9id21vZGU7Ci0JcHN0YS0+aHRwcml2LmNoX29mZnNldCA9IHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0OwotCi0JcHN0YS0+aHRwcml2LmFnZ19lbmFibGVfYml0bWFwID0gMHgwOy8qIHJlc2V0ICovCi0JcHN0YS0+aHRwcml2LmNhbmRpZGF0ZV90aWRfYml0bWFwID0gMHgwOy8qIHJlc2V0ICovCi0KLQkvKiBRb1MgKi8KLQlpZiAocG1sbWVwcml2LT5xb3Nfb3B0aW9uKQotCQlwc3RhLT5xb3Nfb3B0aW9uID0gdHJ1ZTsKLQotCXBzdGEtPnN0YXRlID0gX0ZXX0xJTktFRDsKLX0KLQotdm9pZCBtbG1lZXh0X2pvaW5ic3NfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgICAgaW50IGpvaW5fcmVzKQotewotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgKnBzdGFfYm1jOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKmN1cl9uZXR3b3JrID0gJnBtbG1laW5mby0+bmV0d29yazsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JaWYgKGpvaW5fcmVzIDwgMCkgewotCQlod192YXJfc2V0X21sbWVfam9pbihwYWRhcHRlciwgMSk7Ci0JCWh3X3Zhcl9zZXRfYnNzaWQocGFkYXB0ZXIsIG51bGxfYWRkcik7Ci0KLQkJLyogcmVzdG9yZSB0byBpbml0aWFsIHNldHRpbmcuICovCi0JCXVwZGF0ZV90eF9iYXNpY19yYXRlMjNhKHBhZGFwdGVyLAotCQkJCQlwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpcmVsZXNzX21vZGUpOwotCi0JCWdvdG8gZXhpdF9tbG1lZXh0X2pvaW5ic3NfZXZlbnRfY2FsbGJhY2syM2E7Ci0JfQotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpID09IE1TUl9BREhPQykgewotCQkvKiBmb3IgYmMvbWMgKi8KLQkJcHN0YV9ibWMgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0JCWlmIChwc3RhX2JtYykgewotCQkJcG1sbWVpbmZvLT5GV19zdGFfaW5mb1twc3RhX2JtYy0+bWFjX2lkXS5wc3RhID0gcHN0YV9ibWM7Ci0JCQl1cGRhdGVfYm1jX3N0YV9zdXBwb3J0X3JhdGUyM2EocGFkYXB0ZXIsIHBzdGFfYm1jLT5tYWNfaWQpOwotCQkJVXBkYXRlX1JBX0VudHJ5MjNhKHBhZGFwdGVyLCBwc3RhX2JtYyk7Ci0JCX0KLQl9Ci0KLQkvKiB0dXJuIG9uIGR5bmFtaWMgZnVuY3Rpb25zICovCi0JcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9zZXQocGFkYXB0ZXIsIERZTkFNSUNfQUxMX0ZVTkNfRU5BQkxFKTsKLQotCS8qICB1cGRhdGUgSU9ULXJlbGVhdGVkIGlzc3VlICovCi0JdXBkYXRlX0lPVF9pbmZvMjNhKHBhZGFwdGVyKTsKLQotCUhhbFNldEJyYXRlQ2ZnMjNhKHBhZGFwdGVyLCBjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCi0JLyogQkNOIGludGVydmFsICovCi0JcnRsODcyM2Ffc2V0X2JlYWNvbl9pbnRlcnZhbChwYWRhcHRlciwgcG1sbWVpbmZvLT5iY25faW50ZXJ2YWwpOwotCi0JLyogdXBkYXRlIGNhcGFiaWxpdHkgKi8KLQl1cGRhdGVfY2FwaW5mbzIzYShwYWRhcHRlciwgcG1sbWVpbmZvLT5jYXBhYmlsaXR5KTsKLQotCS8qIFdNTSwgVXBkYXRlIEVEQ0EgcGFyYW0gKi8KLQlXTU1PbkFzc29jUnNwMjNhKHBhZGFwdGVyKTsKLQotCS8qIEhUICovCi0JSFRPbkFzc29jUnNwMjNhKHBhZGFwdGVyKTsKLQotCS8qIFNldCBjdXJfY2hhbm5lbCZjdXJfYndtb2RlJmN1cl9jaF9vZmZzZXQgKi8KLQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwgcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQsIHBtbG1lZXh0LT5jdXJfYndtb2RlKTsKLQotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIGN1cl9uZXR3b3JrLT5NYWNBZGRyZXNzKTsKLQlpZiAocHN0YSkgeyAvKiBvbmx5IGZvciBpbmZyYS4gbW9kZSAqLwotCQlwbWxtZWluZm8tPkZXX3N0YV9pbmZvW3BzdGEtPm1hY19pZF0ucHN0YSA9IHBzdGE7Ci0KLQkJLyogREJHXzg3MjNBKCJzZXRfc3RhX3JhdGUyM2FcbiIpOyAqLwotCi0JCXBzdGEtPndpcmVsZXNzX21vZGUgPSBwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGU7Ci0KLQkJLyogc2V0IHBlciBzdGEgcmF0ZSBhZnRlciB1cGRhdGluZyBIVCBjYXAuICovCi0JCXNldF9zdGFfcmF0ZTIzYShwYWRhcHRlciwgcHN0YSk7Ci0JfQotCi0JaHdfdmFyX3NldF9tbG1lX2pvaW4ocGFkYXB0ZXIsIDIpOwotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpID09IE1TUl9JTkZSQSkgewotCQkvKiAgY29ycmVjdGluZyBUU0YgKi8KLQkJcnR3X2NvcnJlY3RfVFNGKHBhZGFwdGVyKTsKLQotCQkvKiBzZXRfbGlua190aW1lcihwbWxtZWV4dCwgRElTQ09OTkVDVF9UTyk7ICovCi0JfQotCi0JcnR3X2xwc19jdHJsX3drX2NtZDIzYShwYWRhcHRlciwgTFBTX0NUUkxfQ09OTkVDVCwgMCk7Ci0KLWV4aXRfbWxtZWV4dF9qb2luYnNzX2V2ZW50X2NhbGxiYWNrMjNhOgotCURCR184NzIzQSgiPT4lc1xuIiwgX19mdW5jX18pOwotfQotCi12b2lkIG1sbWVleHRfc3RhX2FkZF9ldmVudF9jYWxsYmFjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICAgICBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmICgocG1sbWVpbmZvLT5zdGF0ZSAmIDB4MDMpID09IE1TUl9BREhPQykgewotCS8qIGFkaG9jIG1hc3RlciBvciBzdGFfY291bnQ+MSAqLwotCQlpZiAocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVNTT0NfU1VDQ0VTUykgewotCQkJLyogbm90aGluZyB0byBkbyAqLwotCQl9IGVsc2UgeyAvKiBhZGhvYyBjbGllbnQgKi8KLQkJCS8qICBjb3JyZWN0aW5nIFRTRiAqLwotCQkJcnR3X2NvcnJlY3RfVFNGKHBhZGFwdGVyKTsKLQotCQkJLyogc3RhcnQgYmVhY29uICovCi0JCQlpZiAoc2VuZF9iZWFjb24yM2EocGFkYXB0ZXIpICE9IF9TVUNDRVNTKSB7Ci0JCQkJcG1sbWVpbmZvLT5GV19zdGFfaW5mb1twc3RhLT5tYWNfaWRdLnN0YXR1cyA9IDA7Ci0KLQkJCQlwbWxtZWluZm8tPnN0YXRlIF49IE1TUl9BREhPQzsKLQotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJcG1sbWVpbmZvLT5zdGF0ZSB8PSBXSUZJX0ZXX0FTU09DX1NVQ0NFU1M7Ci0JCX0KLQkJaHdfdmFyX3NldF9tbG1lX2pvaW4ocGFkYXB0ZXIsIDIpOwotCX0KLQotCXBtbG1laW5mby0+Rldfc3RhX2luZm9bcHN0YS0+bWFjX2lkXS5wc3RhID0gcHN0YTsKLQotCS8qIHJhdGUgcmFkYXB0aXZlICovCi0JVXBkYXRlX1JBX0VudHJ5MjNhKHBhZGFwdGVyLCBwc3RhKTsKLQotCS8qIHVwZGF0ZSBhZGhvYyBzdGFfaW5mbyAqLwotCXVwZGF0ZV9zdGFfaW5mbzIzYShwYWRhcHRlciwgcHN0YSk7Ci19Ci0KLXZvaWQgbWxtZWV4dF9zdGFfZGVsX2V2ZW50X2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWlmIChpc19jbGllbnRfYXNzb2NpYXRlZF90b19hcDIzYShwYWRhcHRlcikgfHwKLQkgICAgaXNfSUJTU19lbXB0eTIzYShwYWRhcHRlcikpIHsKLQkJLyogc2V0X29wbW9kZV9jbWQocGFkYXB0ZXIsIGluZnJhX2NsaWVudF93aXRoX21sbWUpOyAqLwotCi0JCWh3X3Zhcl9zZXRfbWxtZV9kaXNjb25uZWN0KHBhZGFwdGVyKTsKLQkJaHdfdmFyX3NldF9ic3NpZChwYWRhcHRlciwgbnVsbF9hZGRyKTsKLQotCQkvKiByZXN0b3JlIHRvIGluaXRpYWwgc2V0dGluZy4gKi8KLQkJdXBkYXRlX3R4X2Jhc2ljX3JhdGUyM2EocGFkYXB0ZXIsCi0JCQkJCXBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lyZWxlc3NfbW9kZSk7Ci0KLQkJLyogc3dpdGNoIHRvIHRoZSAyME0gSHogbW9kZSBhZnRlciBkaXNjb25uZWN0ICovCi0JCXBtbG1lZXh0LT5jdXJfYndtb2RlID0gSFRfQ0hBTk5FTF9XSURUSF8yMDsKLQkJcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwotCi0JCXNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsLAotCQkJCSAgICAgIHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0LAotCQkJCSAgICAgIHBtbG1lZXh0LT5jdXJfYndtb2RlKTsKLQotCQlmbHVzaF9hbGxfY2FtX2VudHJ5MjNhKHBhZGFwdGVyKTsKLQotCQlwbWxtZWluZm8tPnN0YXRlID0gTVNSX05PTElOSzsKLQotCQkvKiBzZXQgTVNSIHRvIG5vIGxpbmsgc3RhdGUgLT4gaW5mcmEuIG1vZGUgKi8KLQkJcnRsODcyM2Ffc2V0X21lZGlhX3N0YXR1cyhwYWRhcHRlciwgTVNSX0lORlJBKTsKLQotCQlkZWxfdGltZXJfc3luYygmcG1sbWVleHQtPmxpbmtfdGltZXIpOwotCX0KLX0KLQotc3RhdGljIHU4IGNoa19hcF9pc19hbGl2ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0JdTggcmV0ID0gZmFsc2U7Ci0KLQlpZiAoc3RhX3J4X2RhdGFfcGt0cyhwc3RhKSA9PSBzdGFfbGFzdF9yeF9kYXRhX3BrdHMocHN0YSkgJiYKLQkgICAgc3RhX3J4X2JlYWNvbl9wa3RzKHBzdGEpID09IHN0YV9sYXN0X3J4X2JlYWNvbl9wa3RzKHBzdGEpICYmCi0JICAgIHN0YV9yeF9wcm9iZXJzcF9wa3RzKHBzdGEpID09IHN0YV9sYXN0X3J4X3Byb2JlcnNwX3BrdHMocHN0YSkpCi0JCXJldCA9IGZhbHNlOwotCWVsc2UKLQkJcmV0ID0gdHJ1ZTsKLQotCXN0YV91cGRhdGVfbGFzdF9yeF9wa3RzKHBzdGEpOwotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgbGlua2VkX3N0YXR1c19jaGsyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1MzIgaTsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0KLQlpZiAoaXNfY2xpZW50X2Fzc29jaWF0ZWRfdG9fYXAyM2EocGFkYXB0ZXIpKSB7Ci0JCS8qIGxpbmtlZCBpbmZyYXN0cnVjdHVyZSBjbGllbnQgbW9kZSAqLwotCi0JCWludCB0eF9jaGsgPSBfU1VDQ0VTUywgcnhfY2hrID0gX1NVQ0NFU1M7Ci0JCWludCByeF9jaGtfbGltaXQ7Ci0KLQkJcnhfY2hrX2xpbWl0ID0gNDsKLQotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LAotCQkJCQkgIHBtbG1laW5mby0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQkJaWYgKHBzdGEpIHsKLQkJCWJvb2wgaXNfcDJwX2VuYWJsZSA9IGZhbHNlOwotCi0JCQlpZiAoY2hrX2FwX2lzX2FsaXZlKHBhZGFwdGVyLCBwc3RhKSA9PSBmYWxzZSkKLQkJCQlyeF9jaGsgPSBfRkFJTDsKLQotCQkJaWYgKHB4bWl0cHJpdi0+bGFzdF90eF9wa3RzID09IHB4bWl0cHJpdi0+dHhfcGt0cykKLQkJCQl0eF9jaGsgPSBfRkFJTDsKLQotCQkJaWYgKHBtbG1lZXh0LT5hY3RpdmVfa2VlcF9hbGl2ZV9jaGVjayAmJgotCQkJICAgIChyeF9jaGsgPT0gX0ZBSUwgfHwgdHhfY2hrID09IF9GQUlMKSkgewotCQkJCXU4IGJhY2t1cF9vcGVyX2NoYW5uZWwgPSAwOwotCi0JCQkJLyogc3dpdGNoIHRvIGNvcnJlY3QgY2hhbm5lbCBvZiBjdXJyZW50Ci0JCQkJICAgbmV0d29yayAgYmVmb3JlIGlzc3VlIGtlZXAtYWxpdmUgZnJhbWVzICovCi0JCQkJaWYgKHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlcikgIT0KLQkJCQkgICAgcG1sbWVleHQtPmN1cl9jaGFubmVsKSB7Ci0JCQkJCWJhY2t1cF9vcGVyX2NoYW5uZWwgPQotCQkJCQkJcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKTsKLQkJCQkJU2VsZWN0Q2hhbm5lbDIzYShwYWRhcHRlciwKLQkJCQkJCQkgcG1sbWVleHQtPmN1cl9jaGFubmVsKTsKLQkJCQl9Ci0KLQkJCQlpZiAocnhfY2hrICE9IF9TVUNDRVNTKQotCQkJCQlpc3N1ZV9wcm9iZXJlcV9leChwYWRhcHRlciwgJnBtbG1laW5mby0+bmV0d29yay5Tc2lkLCBwc3RhLT5od2FkZHIsIDMsIDEpOwotCi0JCQkJaWYgKCh0eF9jaGsgIT0gX1NVQ0NFU1MgJiYKLQkJCQkgICAgIHBtbG1laW5mby0+bGlua19jb3VudCsrID09IDB4ZikgfHwKLQkJCQkgICAgcnhfY2hrICE9IF9TVUNDRVNTKSB7Ci0JCQkJCXR4X2NoayA9IGlzc3VlX251bGxkYXRhMjNhKHBhZGFwdGVyLAotCQkJCQkJCQkgICBwc3RhLT5od2FkZHIsCi0JCQkJCQkJCSAgIDAsIDMsIDEpOwotCQkJCQkvKiBpZiB0eCBhY2tlZCBhbmQgcDJwIGRpc2FibGVkLAotCQkJCQkgICBzZXQgcnhfY2hrIF9TVUNDRVNTIHRvIHJlc2V0IHJldHJ5Ci0JCQkJCSAgIGNvdW50ICovCi0JCQkJCWlmICh0eF9jaGsgPT0gX1NVQ0NFU1MgJiYKLQkJCQkJICAgICFpc19wMnBfZW5hYmxlKQotCQkJCQkJcnhfY2hrID0gX1NVQ0NFU1M7Ci0JCQkJfQotCi0JCQkJLyogYmFjayB0byB0aGUgb3JpZ2luYWwgb3BlcmF0aW9uIGNoYW5uZWwgKi8KLQkJCQlpZiAoYmFja3VwX29wZXJfY2hhbm5lbD4wKQotCQkJCQlTZWxlY3RDaGFubmVsMjNhKHBhZGFwdGVyLAotCQkJCQkJCSBiYWNrdXBfb3Blcl9jaGFubmVsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJ4X2NoayAhPSBfU1VDQ0VTUykgewotCQkJCQlpZiAocG1sbWVleHQtPnJldHJ5ID09IDApIHsKLQkJCQkJCWlzc3VlX3Byb2JlcmVxKHBhZGFwdGVyLCAmcG1sbWVpbmZvLT5uZXR3b3JrLlNzaWQsIHBtbG1laW5mby0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQkJCQkJCWlzc3VlX3Byb2JlcmVxKHBhZGFwdGVyLCAmcG1sbWVpbmZvLT5uZXR3b3JrLlNzaWQsIHBtbG1laW5mby0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQkJCQkJCWlzc3VlX3Byb2JlcmVxKHBhZGFwdGVyLCAmcG1sbWVpbmZvLT5uZXR3b3JrLlNzaWQsIHBtbG1laW5mby0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICh0eF9jaGsgIT0gX1NVQ0NFU1MgJiYKLQkJCQkgICAgcG1sbWVpbmZvLT5saW5rX2NvdW50KysgPT0gMHhmKQotCQkJCQl0eF9jaGsgPSBpc3N1ZV9udWxsZGF0YTIzYShwYWRhcHRlciwKLQkJCQkJCQkJICAgTlVMTCwgMCwgMSwKLQkJCQkJCQkJICAgMCk7Ci0JCQl9Ci0KLQkJCWlmIChyeF9jaGsgPT0gX0ZBSUwpIHsKLQkJCQlwbWxtZWV4dC0+cmV0cnkrKzsKLQkJCQlpZiAocG1sbWVleHQtPnJldHJ5ID4gcnhfY2hrX2xpbWl0KSB7Ci0JCQkJCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sCi0JCQkJCQkJIiVzKCVzKTogZGlzY29ubmVjdCBvciAiCi0JCQkJCQkJInJvYW1pbmdcbiIsIF9fZnVuY19fLAotCQkJCQkJCXBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQkJCQkJcmVjZWl2ZV9kaXNjb25uZWN0MjNhKHBhZGFwdGVyLCBwbWxtZWluZm8tPm5ldHdvcmsuTWFjQWRkcmVzcywKLQkJCQkJCVdMQU5fUkVBU09OX0VYUElSQVRJT05fQ0hLKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXBtbG1lZXh0LT5yZXRyeSA9IDA7Ci0KLQkJCWlmICh0eF9jaGsgPT0gX0ZBSUwpCi0JCQkJcG1sbWVpbmZvLT5saW5rX2NvdW50ICY9IDB4ZjsKLQkJCWVsc2UgewotCQkJCXB4bWl0cHJpdi0+bGFzdF90eF9wa3RzID0gcHhtaXRwcml2LT50eF9wa3RzOwotCQkJCXBtbG1laW5mby0+bGlua19jb3VudCA9IDA7Ci0JCQl9Ci0KLQkJfQotCX0gZWxzZSBpZiAoaXNfY2xpZW50X2Fzc29jaWF0ZWRfdG9faWJzczIzYShwYWRhcHRlcikpIHsKLQkJLyogbGlua2VkIElCU1MgbW9kZSAqLwotCQkvKiBmb3IgZWFjaCBhc3NvYyBsaXN0IGVudHJ5IHRvIGNoZWNrIHRoZSByeCBwa3QgY291bnRlciAqLwotCQlmb3IgKGkgPSBJQlNTX1NUQVJUX01BQ19JRDsgaSA8IE5VTV9TVEE7IGkrKykgewotCQkJaWYgKHBtbG1laW5mby0+Rldfc3RhX2luZm9baV0uc3RhdHVzID09IDEpIHsKLQkJCQlwc3RhID0gcG1sbWVpbmZvLT5GV19zdGFfaW5mb1tpXS5wc3RhOwotCi0JCQkJaWYgKCFwc3RhKQotCQkJCQljb250aW51ZTsKLQotCQkJCWlmIChwbWxtZWluZm8tPkZXX3N0YV9pbmZvW2ldLnJ4X3BrdCA9PQotCQkJCSAgICBzdGFfcnhfcGt0cyhwc3RhKSkgewotCi0JCQkJCWlmIChwbWxtZWluZm8tPkZXX3N0YV9pbmZvW2ldLnJldHJ5PDMpIHsKLQkJCQkJCXBtbG1laW5mby0+Rldfc3RhX2luZm9baV0ucmV0cnkrKzsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBtbG1laW5mby0+Rldfc3RhX2luZm9baV0ucmV0cnkgPSAwOwotCQkJCQkJcG1sbWVpbmZvLT5GV19zdGFfaW5mb1tpXS5zdGF0dXMgPSAwOwotCQkJCQkJcmVwb3J0X2RlbF9zdGFfZXZlbnQyM2EocGFkYXB0ZXIsIHBzdGEtPmh3YWRkciwKLQkJCQkJCQk2NTUzNS8qICBpbmRpY2F0ZSBkaXNjb25uZWN0IGNhdXNlZCBieSBubyByeCAqLwotCQkJCQkJKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXBtbG1laW5mby0+Rldfc3RhX2luZm9baV0ucmV0cnkgPSAwOwotCQkJCQlwbWxtZWluZm8tPkZXX3N0YV9pbmZvW2ldLnJ4X3BrdCA9ICh1MzIpc3RhX3J4X3BrdHMocHN0YSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8qIHNldF9saW5rX3RpbWVyKHBtbG1lZXh0LCBESVNDT05ORUNUX1RPKTsgKi8KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHN1cnZleV90aW1lcl9oZGwodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopZGF0YTsKLQlzdHJ1Y3QgY21kX29iaiAqcGgyYzsKLQlzdHJ1Y3Qgc2l0ZXN1cnZleV9wYXJtICpwc3VydmV5UGFyYTsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQkvKiBpc3N1ZSBydHdfc2l0ZXN1cnZleV9jbWQyM2EgKi8KLQlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID4gU0NBTl9TVEFSVCkgewotCQlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID09ICBTQ0FOX1BST0NFU1MpCi0JCQlwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuY2hhbm5lbF9pZHgrKzsKLQotCQlpZiAocG1sbWVleHQtPnNjYW5fYWJvcnQgPT0gdHJ1ZSkgewotCQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmNoYW5uZWxfaWR4ID0KLQkJCQlwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuY2hfbnVtOwotCQkJREJHXzg3MjNBKCIlcyBpZHg6JWRcbiIsIF9fZnVuY19fLAotCQkJCSAgcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmNoYW5uZWxfaWR4KTsKLQotCQkJcG1sbWVleHQtPnNjYW5fYWJvcnQgPSBmYWxzZTsvKiByZXNldCAqLwotCQl9Ci0KLQkJcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghcGgyYykKLQkJCWdvdG8gZXhpdF9zdXJ2ZXlfdGltZXJfaGRsOwotCi0JCXBzdXJ2ZXlQYXJhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNpdGVzdXJ2ZXlfcGFybSksCi0JCQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIXBzdXJ2ZXlQYXJhKSB7Ci0JCQlrZnJlZShwaDJjKTsKLQkJCWdvdG8gZXhpdF9zdXJ2ZXlfdGltZXJfaGRsOwotCQl9Ci0KLQkJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHN1cnZleVBhcmEsCi0JCQkJCSAgIEdFTl9DTURfQ09ERShfU2l0ZVN1cnZleSkpOwotCQlydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBoMmMpOwotCX0KLQotZXhpdF9zdXJ2ZXlfdGltZXJfaGRsOgotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgbGlua190aW1lcl9oZGwodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopZGF0YTsKLQkvKiBzdGF0aWMgdW5zaWduZWQgaW50CQlyeF9wa3QgPSAwOyAqLwotCS8qIHN0YXRpYyB1NjQJCQkJdHhfY250ID0gMDsgKi8KLQkvKiBzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OyAqLwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JLyogc3RydWN0IHN0YV9wcml2CQkqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7ICovCi0KLQlpZiAocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVVUSF9OVUxMKSB7Ci0JCURCR184NzIzQSgibGlua190aW1lcl9oZGw6bm8gYmVhY29uIHdoaWxlIGNvbm5lY3RpbmdcbiIpOwotCQlwbWxtZWluZm8tPnN0YXRlID0gTVNSX05PTElOSzsKLQkJcmVwb3J0X2pvaW5fcmVzMjNhKHBhZGFwdGVyLCAtMyk7Ci0JfSBlbHNlIGlmIChwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BVVRIX1NUQVRFKSB7Ci0JCS8qIHJlLWF1dGggdGltZXIgKi8KLQkJaWYgKCsrcG1sbWVpbmZvLT5yZWF1dGhfY291bnQgPiBSRUFVVEhfTElNSVQpIHsKLQkJCS8qIGlmIChwbWxtZWluZm8tPmF1dGhfYWxnbyAhPSBkb3QxMUF1dGhBbGdydGhtX0F1dG8pICovCi0JCQkvKiAgKi8KLQkJCQlwbWxtZWluZm8tPnN0YXRlID0gMDsKLQkJCQlyZXBvcnRfam9pbl9yZXMyM2EocGFkYXB0ZXIsIC0xKTsKLQkJCQlyZXR1cm47Ci0JCQkvKiAgKi8KLQkJCS8qIGVsc2UgKi8KLQkJCS8qICAqLwotCQkJLyogcG1sbWVpbmZvLT5hdXRoX2FsZ28gPSBkb3QxMUF1dGhBbGdydGhtX1NoYXJlZDsgKi8KLQkJCS8qIHBtbG1laW5mby0+cmVhdXRoX2NvdW50ID0gMDsgKi8KLQkJCS8qICAqLwotCQl9Ci0KLQkJREJHXzg3MjNBKCJsaW5rX3RpbWVyX2hkbDogYXV0aCB0aW1lb3V0IGFuZCB0cnkgYWdhaW5cbiIpOwotCQlwbWxtZWluZm8tPmF1dGhfc2VxID0gMTsKLQkJaXNzdWVfYXV0aChwYWRhcHRlciwgTlVMTCwgMCk7Ci0JCXNldF9saW5rX3RpbWVyKHBtbG1lZXh0LCBSRUFVVEhfVE8pOwotCX0gZWxzZSBpZiAocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVNTT0NfU1RBVEUpIHsKLQkJLyogcmUtYXNzb2MgdGltZXIgKi8KLQkJaWYgKCsrcG1sbWVpbmZvLT5yZWFzc29jX2NvdW50ID4gUkVBU1NPQ19MSU1JVCkgewotCQkJcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9OT0xJTks7Ci0JCQlyZXBvcnRfam9pbl9yZXMyM2EocGFkYXB0ZXIsIC0yKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCURCR184NzIzQSgibGlua190aW1lcl9oZGw6IGFzc29jIHRpbWVvdXQgYW5kIHRyeSBhZ2FpblxuIik7Ci0JCWlzc3VlX2Fzc29jcmVxKHBhZGFwdGVyKTsKLQkJc2V0X2xpbmtfdGltZXIocG1sbWVleHQsIFJFQVNTT0NfVE8pOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYWRkYmFfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSAoc3RydWN0IHN0YV9pbmZvICopZGF0YTsKLQlzdHJ1Y3QgaHRfcHJpdiAqcGh0cHJpdjsKLQotCWlmICghcHN0YSkKLQkJcmV0dXJuOwotCi0JcGh0cHJpdiA9ICZwc3RhLT5odHByaXY7Ci0KLQlpZiAocGh0cHJpdi0+aHRfb3B0aW9uICYmIHBodHByaXYtPmFtcGR1X2VuYWJsZSkgewotCQlpZiAocGh0cHJpdi0+Y2FuZGlkYXRlX3RpZF9iaXRtYXApCi0JCQlwaHRwcml2LT5jYW5kaWRhdGVfdGlkX2JpdG1hcCA9IDB4MDsKLQl9Ci19Ci0KLXZvaWQgaW5pdF9hZGRiYV9yZXRyeV90aW1lcjIzYShzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0Jc2V0dXBfdGltZXIoJnBzdGEtPmFkZGJhX3JldHJ5X3RpbWVyLCBhZGRiYV90aW1lcl9oZGwsCi0JCSAgICAodW5zaWduZWQgbG9uZylwc3RhKTsKLX0KLQotdm9pZCBpbml0X21sbWVfZXh0X3RpbWVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCXNldHVwX3RpbWVyKCZwbWxtZWV4dC0+c3VydmV5X3RpbWVyLCBzdXJ2ZXlfdGltZXJfaGRsLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOwotCi0Jc2V0dXBfdGltZXIoJnBtbG1lZXh0LT5saW5rX3RpbWVyLCBsaW5rX3RpbWVyX2hkbCwKLQkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKLX0KLQotaW50IE5VTExfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCXJldHVybiBIMkNfU1VDQ0VTUzsKLX0KLQotaW50IHNldG9wbW9kZV9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JZW51bSBubDgwMjExX2lmdHlwZSB0eXBlOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JY29uc3Qgc3RydWN0IHNldG9wbW9kZV9wYXJtICpwc2V0b3AgPSAoc3RydWN0IHNldG9wbW9kZV9wYXJtICopcGJ1ZjsKLQotCXN3aXRjaCAocHNldG9wLT5tb2RlKSB7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKLQkJcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9BUDsKLQkJdHlwZSA9IE1TUl9BUDsKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJLyogIGNsZWFyIHN0YXRlICovCi0JCXBtbG1laW5mby0+c3RhdGUgJj0gfihCSVQoMCl8QklUKDEpKTsKLQkJLyogc2V0IHRvIFNUQVRJT05fU1RBVEUgKi8KLQkJcG1sbWVpbmZvLT5zdGF0ZSB8PSBNU1JfSU5GUkE7Ci0JCXR5cGUgPSBNU1JfSU5GUkE7Ci0JCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JCXR5cGUgPSBNU1JfQURIT0M7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXR5cGUgPSBNU1JfTk9MSU5LOwotCQlicmVhazsKLQl9Ci0KLQlod192YXJfc2V0X29wbW9kZShwYWRhcHRlciwgdHlwZSk7Ci0JLyogU2V0X05FVFlQRTBfTVNSKHBhZGFwdGVyLCB0eXBlKTsgKi8KLQotCXJldHVybiBIMkNfU1VDQ0VTUzsKLX0KLQotaW50IGNyZWF0ZWJzc19oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCWNvbnN0IHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwcGFybSA9IChzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqKXBidWY7Ci0JLyogdTMyCWluaXRpYWxnYWluOyAqLwotCi0JaWYgKHBwYXJtLT5pZm1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKLQkgICAgcHBhcm0tPmlmbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfR08pIHsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQkJaWYgKHBtbG1laW5mby0+c3RhdGUgPT0gTVNSX0FQKSB7Ci0JCQkvKiB0b2RvOiAqLwotCQkJcmV0dXJuIEgyQ19TVUNDRVNTOwotCQl9Ci0jZW5kaWYKLQl9Ci0KLQkvKiBiZWxvdyBpcyBmb3IgYWQtaG9jIG1hc3RlciAqLwotCWlmIChwcGFybS0+aWZtb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7Ci0JCXJ0d19qb2luYnNzX3Jlc2V0MjNhKHBhZGFwdGVyKTsKLQotCQlwbWxtZWV4dC0+Y3VyX2J3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfMjA7Ci0JCXBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRTsKLQkJcG1sbWVpbmZvLT5FUlBfZW5hYmxlID0gMDsKLQkJcG1sbWVpbmZvLT5XTU1fZW5hYmxlID0gMDsKLQkJcG1sbWVpbmZvLT5IVF9lbmFibGUgPSAwOwotCQlwbWxtZWluZm8tPkhUX2NhcHNfZW5hYmxlID0gMDsKLQkJcG1sbWVpbmZvLT5IVF9pbmZvX2VuYWJsZSA9IDA7Ci0KLQkJLyogZGlzYWJsZSBkeW5hbWljIGZ1bmN0aW9ucywgc3VjaCBhcyBoaWdoIHBvd2VyLCBESUcgKi8KLQkJcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9iYWNrdXAocGFkYXB0ZXIpOwotCi0JCXJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfY2xyKHBhZGFwdGVyLAotCQkJCQkJIERZTkFNSUNfRlVOQ19ESVNBQkxFKTsKLQotCQkvKiBjYW5jZWwgbGluayB0aW1lciAqLwotCQlkZWxfdGltZXJfc3luYygmcG1sbWVleHQtPmxpbmtfdGltZXIpOwotCi0JCS8qIGNsZWFyIENBTSAqLwotCQlmbHVzaF9hbGxfY2FtX2VudHJ5MjNhKHBhZGFwdGVyKTsKLQotCQlpZiAocHBhcm0tPklFTGVuZ3RoID4gTUFYX0lFX1NaKS8qIENoZWNrIHBidWYtPklFTGVuZ3RoICovCi0JCQlyZXR1cm4gSDJDX1BBUkFNRVRFUlNfRVJST1I7Ci0KLQkJbWVtY3B5KHBuZXR3b3JrLCBwcGFybSwgc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSk7Ci0KLQkJc3RhcnRfY3JlYXRlX2lic3MocGFkYXB0ZXIpOwotCX0KLQotCXJldHVybiBIMkNfU1VDQ0VTUzsKLX0KLQotaW50IGpvaW5fY21kX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JY29uc3Qgc3RydWN0IHdsYW5fYnNzaWRfZXggKnBwYXJtID0gKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICopcGJ1ZjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbiAqcGh0X2luZm87Ci0JdTMyIGk7Ci0JdTggKnA7Ci0JLyogdTMyCWluaXRpYWxnYWluOyAqLwotCS8qIHUzMglhY3Bhcm07ICovCi0KLQkvKiBjaGVjayBhbHJlYWR5IGNvbm5lY3RpbmcgdG8gQVAgb3Igbm90ICovCi0JaWYgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FTU09DX1NVQ0NFU1MpIHsKLQkJaWYgKHBtbG1laW5mby0+c3RhdGUgJiBNU1JfSU5GUkEpCi0JCQlpc3N1ZV9kZWF1dGhfZXgocGFkYXB0ZXIsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLAotCQkJCQlXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORywgNSwgMTAwKTsKLQotCQlwbWxtZWluZm8tPnN0YXRlID0gTVNSX05PTElOSzsKLQotCQkvKiBjbGVhciBDQU0gKi8KLQkJZmx1c2hfYWxsX2NhbV9lbnRyeTIzYShwYWRhcHRlcik7Ci0KLQkJZGVsX3RpbWVyX3N5bmMoJnBtbG1lZXh0LT5saW5rX3RpbWVyKTsKLQotCQkvKiBzZXQgTVNSIHRvIG5vbGluayAtPiBpbmZyYS4gbW9kZSAqLwotCQlydGw4NzIzYV9zZXRfbWVkaWFfc3RhdHVzKHBhZGFwdGVyLCBNU1JfSU5GUkEpOwotCi0JCWh3X3Zhcl9zZXRfbWxtZV9kaXNjb25uZWN0KHBhZGFwdGVyKTsKLQl9Ci0KLQlydHdfam9pbmJzc19yZXNldDIzYShwYWRhcHRlcik7Ci0KLQlwbWxtZWV4dC0+Y3VyX2J3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfMjA7Ci0JcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwotCXBtbG1laW5mby0+RVJQX2VuYWJsZSA9IDA7Ci0JcG1sbWVpbmZvLT5XTU1fZW5hYmxlID0gMDsKLQlwbWxtZWluZm8tPkhUX2VuYWJsZSA9IDA7Ci0JcG1sbWVpbmZvLT5IVF9jYXBzX2VuYWJsZSA9IDA7Ci0JcG1sbWVpbmZvLT5IVF9pbmZvX2VuYWJsZSA9IDA7Ci0JcG1sbWVpbmZvLT5id21vZGVfdXBkYXRlZCA9IGZhbHNlOwotCS8qIHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID0gSFRfSU9UX1BFRVJfTUFYOyAqLwotCi0JaWYgKHBwYXJtLT5JRUxlbmd0aCA+IE1BWF9JRV9TWikvKiBDaGVjayBwYnVmLT5JRUxlbmd0aCAqLwotCQlyZXR1cm4gSDJDX1BBUkFNRVRFUlNfRVJST1I7Ci0KLQltZW1jcHkocG5ldHdvcmssIHBidWYsIHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCkpOwotCi0JLyogQ2hlY2sgQVAgdmVuZG9yIHRvIG1vdmUgcnR3X2pvaW5ic3NfY21kMjNhKCkgKi8KLQkvKiBwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciA9IGNoZWNrX2Fzc29jX0FQMjNhKHBuZXR3b3JrLT5JRXMsCi0JICAgcG5ldHdvcmstPklFTGVuZ3RoKTsgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBwbmV0d29yay0+SUVMZW5ndGg7KSB7Ci0JCXAgPSBwbmV0d29yay0+SUVzICsgaTsKLQotCQlzd2l0Y2ggKHBbMF0pIHsKLQkJY2FzZSBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUM6LyogR2V0IFdNTSBJRS4gKi8KLQkJCWlmICghbWVtY21wKHAgKyAyLCBXTU1fT1VJMjNBLCA0KSkKLQkJCQlwbWxtZWluZm8tPldNTV9lbmFibGUgPSAxOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBXTEFOX0VJRF9IVF9DQVBBQklMSVRZOgkvKiBHZXQgSFQgQ2FwIElFLiAqLwotCQkJcG1sbWVpbmZvLT5IVF9jYXBzX2VuYWJsZSA9IDE7Ci0JCQlicmVhazsKLQotCQljYXNlIFdMQU5fRUlEX0hUX09QRVJBVElPTjoJLyogR2V0IEhUIEluZm8gSUUuICovCi0JCQlwbWxtZWluZm8tPkhUX2luZm9fZW5hYmxlID0gMTsKLQotCQkJLyogc3BlYyBjYXNlIG9ubHkgZm9yIGNpc2NvJ3MgYXAgYmVjYXVzZSBjaXNjbydzIGFwCi0JCQkgKiBpc3N1ZSBhc3NvYyByc3AgdXNpbmcgbWNzIHJhdGUgQDQwTUh6IG9yIEAyME1IeiAqLwotCQkJcGh0X2luZm8gPSAoc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24gKikocCArIDIpOwotCi0JCQlpZiAocHJlZ3ByaXYtPmNidzQwX2VuYWJsZSAmJgotCQkJICAgIChwaHRfaW5mby0+aHRfcGFyYW0gJgotCQkJICAgICBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBTl9XSURUSF9BTlkpKSB7Ci0JCQkJLyogc3dpdGNoIHRvIHRoZSA0ME0gSHogbW9kZSBhY2NvcmRpbmcgdG8gQVAgKi8KLQkJCQlwbWxtZWV4dC0+Y3VyX2J3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfNDA7Ci0JCQkJc3dpdGNoIChwaHRfaW5mby0+aHRfcGFyYW0gJgotCQkJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19PRkZTRVQpIHsKLQkJCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFOgotCQkJCQlwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9Ci0JCQkJCQlIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVI7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19CRUxPVzoKLQkJCQkJcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPQotCQkJCQkJSEFMX1BSSU1FX0NITkxfT0ZGU0VUX1VQUEVSOwotCQkJCQlicmVhazsKLQotCQkJCWRlZmF1bHQ6Ci0JCQkJCXBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0ID0KLQkJCQkJCUhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCURCR184NzIzQSgic2V0IGNoL2J3IGJlZm9yZSBjb25uZWN0ZWRcbiIpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaSArPSAocFsxXSArIDIpOwotCX0KLQotCWh3X3Zhcl9zZXRfYnNzaWQocGFkYXB0ZXIsIHBtbG1laW5mby0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQlod192YXJfc2V0X21sbWVfam9pbihwYWRhcHRlciwgMCk7Ci0KLQkvKiBjYW5jZWwgbGluayB0aW1lciAqLwotCWRlbF90aW1lcl9zeW5jKCZwbWxtZWV4dC0+bGlua190aW1lcik7Ci0KLQlzdGFydF9jbG50X2pvaW4ocGFkYXB0ZXIpOwotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi1pbnQgZGlzY29ubmVjdF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JY29uc3Qgc3RydWN0IGRpc2Nvbm5lY3RfcGFybSAqcGFyYW0gPSAoc3RydWN0IGRpc2Nvbm5lY3RfcGFybSAqKXBidWY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCi0JaWYgKGlzX2NsaWVudF9hc3NvY2lhdGVkX3RvX2FwMjNhKHBhZGFwdGVyKSkgewotCQlpc3N1ZV9kZWF1dGhfZXgocGFkYXB0ZXIsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLAotCQkJCVdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HLAotCQkJCXBhcmFtLT5kZWF1dGhfdGltZW91dF9tcy8xMDAsIDEwMCk7Ci0JfQotCi0JLyogc2V0X29wbW9kZV9jbWQocGFkYXB0ZXIsIGluZnJhX2NsaWVudF93aXRoX21sbWUpOyAqLwotCi0JLyogcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9OT0xJTks7ICovCi0KLQlod192YXJfc2V0X21sbWVfZGlzY29ubmVjdChwYWRhcHRlcik7Ci0JaHdfdmFyX3NldF9ic3NpZChwYWRhcHRlciwgbnVsbF9hZGRyKTsKLQotCS8qIHJlc3RvcmUgdG8gaW5pdGlhbCBzZXR0aW5nLiAqLwotCXVwZGF0ZV90eF9iYXNpY19yYXRlMjNhKHBhZGFwdGVyLCBwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpcmVsZXNzX21vZGUpOwotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgPT0gTVNSX0FESE9DIHx8Ci0JICAgIChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgPT0gTVNSX0FQKQotCQlydGw4NzIzYV9zZXRfYmNuX2Z1bmMocGFkYXB0ZXIsIDApOwkvKiBTdG9wIEJDTiAqLwotCi0JLyogc2V0IE1TUiB0byBubyBsaW5rIHN0YXRlIC0+IGluZnJhLiBtb2RlICovCi0JcnRsODcyM2Ffc2V0X21lZGlhX3N0YXR1cyhwYWRhcHRlciwgTVNSX0lORlJBKTsKLQotCXBtbG1laW5mby0+c3RhdGUgPSBNU1JfTk9MSU5LOwotCi0JLyogc3dpdGNoIHRvIHRoZSAyME0gSHogbW9kZSBhZnRlciBkaXNjb25uZWN0ICovCi0JcG1sbWVleHQtPmN1cl9id21vZGUgPSBIVF9DSEFOTkVMX1dJRFRIXzIwOwotCXBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRTsKLQotCXNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsLAotCQkJICAgICAgcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQsIHBtbG1lZXh0LT5jdXJfYndtb2RlKTsKLQotCWZsdXNoX2FsbF9jYW1fZW50cnkyM2EocGFkYXB0ZXIpOwotCi0JZGVsX3RpbWVyX3N5bmMoJnBtbG1lZXh0LT5saW5rX3RpbWVyKTsKLQotCXJ0d19mcmVlX3VjX3N3ZGVjX3BlbmRpbmdfcXVldWUyM2EocGFkYXB0ZXIpOwotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50Ci1ydHdfc2Nhbl9jaF9kZWNpc2lvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgIHN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwgKm91dCwgdTMyIG91dF9udW0sCi0JCSAgICAgY29uc3Qgc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCAqaW4sIHUzMiBpbl9udW0pCi17Ci0JaW50IGksIGo7Ci0JaW50IHNjYW5fY2hfbnVtID0gMDsKLQlpbnQgc2V0X2lkeDsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCi0JLyogY2xlYXIgb3V0IGZpcnN0ICovCi0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwpKm91dF9udW0pOwotCi0JLyogYWNxdWlyZSBjaGFubmVscyBmcm9tIGluICovCi0JaiA9IDA7Ci0JZm9yIChpID0gMDtpPGluX251bTtpKyspIHsKLQkJaWYgKGluW2ldLmh3X3ZhbHVlICYmCi0JCSAgICAhKGluW2ldLmZsYWdzICYgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQpICYmCi0JCSAgICAoc2V0X2lkeCA9IHJ0d19jaF9zZXRfc2VhcmNoX2NoMjNhKHBtbG1lZXh0LT5jaGFubmVsX3NldCwKLQkJCQkJCSAgICAgICBpbltpXS5od192YWx1ZSkpID49IDApIHsKLQkJCW1lbWNweSgmb3V0W2pdLCAmaW5baV0sCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwpKTsKLQotCQkJaWYgKHBtbG1lZXh0LT5jaGFubmVsX3NldFtzZXRfaWR4XS5TY2FuVHlwZSA9PQotCQkJICAgIFNDQU5fUEFTU0lWRSkKLQkJCQlvdXRbal0uZmxhZ3MgJj0gSUVFRTgwMjExX0NIQU5fTk9fSVI7Ci0KLQkJCWorKzsKLQkJfQotCQlpZiAoaj49IG91dF9udW0pCi0JCQlicmVhazsKLQl9Ci0KLQkvKiBpZiBvdXQgaXMgZW1wdHksIHVzZSBjaGFubmVsX3NldCBhcyBkZWZhdWx0ICovCi0JaWYgKGogPT0gMCkgewotCQlmb3IgKGkgPSAwO2k8cG1sbWVleHQtPm1heF9jaGFuX251bXM7aSsrKSB7Ci0JCQlvdXRbaV0uaHdfdmFsdWUgPSBwbWxtZWV4dC0+Y2hhbm5lbF9zZXRbaV0uQ2hhbm5lbE51bTsKLQotCQkJaWYgKHBtbG1lZXh0LT5jaGFubmVsX3NldFtpXS5TY2FuVHlwZSA9PSBTQ0FOX1BBU1NJVkUpCi0JCQkJb3V0W2ldLmZsYWdzICY9IElFRUU4MDIxMV9DSEFOX05PX0lSOwotCi0JCQlqKys7Ci0JCX0KLQl9Ci0KLQlpZiAocGFkYXB0ZXItPnNldGJhbmQgPT0gR0haXzI0KSB7CQkJLyogIDIuNEcgKi8KLQkJZm9yIChpID0gMDsgaSA8IGogOyBpKyspIHsKLQkJCWlmIChvdXRbaV0uaHdfdmFsdWUgPiAzNSkKLQkJCQltZW1zZXQoJm91dFtpXSwgMCwKLQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwpKTsKLQkJCWVsc2UKLQkJCQlzY2FuX2NoX251bSsrOwotCQl9Ci0JCWogPSBzY2FuX2NoX251bTsKLQl9IGVsc2UgaWYgIChwYWRhcHRlci0+c2V0YmFuZCA9PSBHSFpfNTApIHsJCS8qICA1RyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgaiA7IGkrKykgewotCQkJaWYgKG91dFtpXS5od192YWx1ZSA+IDM1KSB7Ci0JCQkJbWVtY3B5KCZvdXRbc2Nhbl9jaF9udW0rK10sICZvdXRbaV0sCi0JCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9jaGFubmVsKSk7Ci0JCQl9Ci0JCX0KLQkJaiA9IHNjYW5fY2hfbnVtOwotCX0gZWxzZQotCQl7fQotCi0JcmV0dXJuIGo7Ci19Ci0KLWludCBzaXRlc3VydmV5X2NtZF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQljb25zdCBzdHJ1Y3Qgc2l0ZXN1cnZleV9wYXJtICpwcGFybSA9IChzdHJ1Y3Qgc2l0ZXN1cnZleV9wYXJtICopcGJ1ZjsKLQl1OCBiZGVsYXlzY2FuID0gZmFsc2U7Ci0JdTMyIGluaXRpYWxnYWluOwotCXUzMiBpOwotCi0JaWYgKHBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9PSBTQ0FOX0RJU0FCTEUpIHsKLQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID0gU0NBTl9TVEFSVDsKLQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmJzc19jbnQgPSAwOwotCQlwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuY2hhbm5lbF9pZHggPSAwOwotCi0JCWZvciAoaSA9IDA7IGkgPCBSVFdfU1NJRF9TQ0FOX0FNT1VOVDsgaSsrKSB7Ci0JCQlpZiAocHBhcm0tPnNzaWRbaV0uc3NpZF9sZW4pIHsKLQkJCQltZW1jcHkocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnNzaWRbaV0uc3NpZCwKLQkJCQkgICAgICAgcHBhcm0tPnNzaWRbaV0uc3NpZCwKLQkJCQkgICAgICAgSUVFRTgwMjExX01BWF9TU0lEX0xFTik7Ci0JCQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnNzaWRbaV0uc3NpZF9sZW4gPQotCQkJCQlwcGFybS0+c3NpZFtpXS5zc2lkX2xlbjsKLQkJCX0gZWxzZSB7Ci0JCQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnNzaWRbaV0uc3NpZF9sZW4gPSAwOwotCQkJfQotCQl9Ci0KLQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmNoX251bSA9Ci0JCQlydHdfc2Nhbl9jaF9kZWNpc2lvbihwYWRhcHRlciwKLQkJCQkJICAgICBwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuY2gsCi0JCQkJCSAgICAgUlRXX0NIQU5ORUxfU0NBTl9BTU9VTlQsCi0JCQkJCSAgICAgcHBhcm0tPmNoLCBwcGFybS0+Y2hfbnVtKTsKLQotCQlwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc2Nhbl9tb2RlID0gcHBhcm0tPnNjYW5fbW9kZTsKLQotCQkvKiBpc3N1ZSBudWxsIGRhdGEgaWYgYXNzb2NpYXRpbmcgdG8gdGhlIEFQICovCi0JCWlmIChpc19jbGllbnRfYXNzb2NpYXRlZF90b19hcDIzYShwYWRhcHRlcikpIHsKLQkJCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9IFNDQU5fVFhOVUxMOwotCi0JCQkvKiBzd2l0Y2ggdG8gY29ycmVjdCBjaGFubmVsIG9mIGN1cnJlbnQgbmV0d29yawotCQkJICAgYmVmb3JlIGlzc3VlIGtlZXAtYWxpdmUgZnJhbWVzICovCi0JCQlpZiAocnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSAhPQotCQkJICAgIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCkKLQkJCQlTZWxlY3RDaGFubmVsMjNhKHBhZGFwdGVyLAotCQkJCQkJIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCk7Ci0KLQkJCWlzc3VlX251bGxkYXRhMjNhKHBhZGFwdGVyLCBOVUxMLCAxLCAzLCA1MDApOwotCi0JCQliZGVsYXlzY2FuID0gdHJ1ZTsKLQkJfQotCi0JCWlmIChiZGVsYXlzY2FuKSB7Ci0JCQkvKiBkZWxheSA1MG1zIHRvIHByb3RlY3QgbnVsbGRhdGEoMSkuICovCi0JCQlzZXRfc3VydmV5X3RpbWVyKHBtbG1lZXh0LCA1MCk7Ci0JCQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci0JCX0KLQl9Ci0KLQlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID09IFNDQU5fU1RBUlQgfHwKLQkgICAgcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID09IFNDQU5fVFhOVUxMKSB7Ci0JCS8qIGRpc2FibGUgZHluYW1pYyBmdW5jdGlvbnMsIHN1Y2ggYXMgaGlnaCBwb3dlciwgRElHICovCi0JCXJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfYmFja3VwKHBhZGFwdGVyKTsKLQkJcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9jbHIocGFkYXB0ZXIsCi0JCQkJCQkgRFlOQU1JQ19GVU5DX0RJU0FCTEUpOwotCi0JCS8qIGNvbmZpZyB0aGUgaW5pdGlhbCBnYWluIHVuZGVyIHNjYW5uaW5nLCBuZWVkIHRvCi0JCSAgIHdyaXRlIHRoZSBCQiByZWdpc3RlcnMgKi8KLQkJaWYgKHdkZXZfdG9fcHJpdihwYWRhcHRlci0+cnR3X3dkZXYpLT5wMnBfZW5hYmxlZCA9PSB0cnVlKQotCQkJaW5pdGlhbGdhaW4gPSAweDMwOwotCQllbHNlCi0JCQlpbml0aWFsZ2FpbiA9IDB4MUU7Ci0KLQkJcnRsODcyM2Ffc2V0X2luaXRpYWxfZ2FpbihwYWRhcHRlciwgaW5pdGlhbGdhaW4pOwotCi0JCS8qIHNldCBNU1IgdG8gbm8gbGluayBzdGF0ZSAqLwotCQlydGw4NzIzYV9zZXRfbWVkaWFfc3RhdHVzKHBhZGFwdGVyLCBNU1JfTk9MSU5LKTsKLQotCQlydGw4NzIzYV9tbG1lX3NpdGVzdXJ2ZXkocGFkYXB0ZXIsIDEpOwotCi0JCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9IFNDQU5fUFJPQ0VTUzsKLQl9Ci0KLQlydHdfc2l0ZV9zdXJ2ZXkocGFkYXB0ZXIpOwotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi1pbnQgc2V0YXV0aF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JY29uc3Qgc3RydWN0IHNldGF1dGhfcGFybSAqcHBhcm0gPSAoc3RydWN0IHNldGF1dGhfcGFybSAqKXBidWY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWlmIChwcGFybS0+bW9kZSA8IDQpCi0JCXBtbG1laW5mby0+YXV0aF9hbGdvID0gcHBhcm0tPm1vZGU7Ci0KLQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci19Ci0KLWludCBzZXRrZXlfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCXVuc2lnbmVkIHNob3J0IGN0cmw7Ci0JY29uc3Qgc3RydWN0IHNldGtleV9wYXJtICpwcGFybSA9IChzdHJ1Y3Qgc2V0a2V5X3Bhcm0gKilwYnVmOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JdW5zaWduZWQgY2hhciBudWxsX3N0YVtdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotCi0JLyogbWFpbiB0eCBrZXkgZm9yIHdlcC4gKi8KLQlpZiAocHBhcm0tPnNldF90eCkKLQkJcG1sbWVpbmZvLT5rZXlfaW5kZXggPSBwcGFybS0+a2V5aWQ7Ci0KLQkvKiB3cml0ZSBjYW0gKi8KLQljdHJsID0gQklUKDE1KSB8IChwcGFybS0+YWxnb3JpdGhtKSA8PCAyIHwgcHBhcm0tPmtleWlkOwotCi0JREJHXzg3MjNBX0xFVkVMKF9kcnZfYWx3YXlzXywgInNldCBncm91cCBrZXkgdG8gaHc6IGFsZzolZChXRVA0MC0xICIKLQkJCSJXRVAxMDQtNSBUS0lQLTIgQUVTLTQpIGtleWlkOiVkXG4iLAotCQkJcHBhcm0tPmFsZ29yaXRobSwgcHBhcm0tPmtleWlkKTsKLQlydGw4NzIzYV9jYW1fd3JpdGUocGFkYXB0ZXIsIHBwYXJtLT5rZXlpZCwgY3RybCwgbnVsbF9zdGEsIHBwYXJtLT5rZXkpOwotCi0JLyogYWxsb3cgbXVsdGljYXN0IHBhY2tldHMgdG8gZHJpdmVyICovCi0JcnRsODcyM2Ffb25fcmNyX2FtKHBhZGFwdGVyKTsKLQotCXJldHVybiBIMkNfU1VDQ0VTUzsKLX0KLQotaW50IHNldF9zdGFrZXlfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCXUxNiBjdHJsID0gMDsKLQl1OCBjYW1faWQ7LyogY2FtX2VudHJ5ICovCi0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQljb25zdCBzdHJ1Y3Qgc2V0X3N0YWtleV9wYXJtICpwcGFybSA9IChzdHJ1Y3Qgc2V0X3N0YWtleV9wYXJtICopcGJ1ZjsKLQotCS8qIGNhbV9lbnRyeTogKi8KLQkvKiAwfjMgZm9yIGRlZmF1bHQga2V5ICovCi0KLQkvKiBmb3IgY29uY3VycmVudCBtb2RlIChhcCtzdGEpOiAqLwotCS8qIGRlZmF1bHQga2V5IGlzIGRpc2FibGUsIHVzaW5nIHN3IGVuY3J5cHQvZGVjcnlwdCAqLwotCS8qIGNhbV9lbnRyeSA9IDQgIGZvciBzdGEgbW9kZSAobWFjaWQgPSAwKSAqLwotCS8qIGNhbV9lbnRyeShtYWNpZCszKSA9IDUgfiBOIGZvciBhcCBtb2RlIChhaWQgPSAxfk4sIG1hY2lkID0gMiB+TikgKi8KLQotCS8qIGZvciBjb25jdXJyZW50IG1vZGUgKHN0YStzdGEpOiAqLwotCS8qIGRlZmF1bHQga2V5IGlzIGRpc2FibGUsIHVzaW5nIHN3IGVuY3J5cHQvZGVjcnlwdCAqLwotCS8qIGNhbV9lbnRyeSA9IDQgbWFwcGluZyB0byBtYWNpZCA9IDAgKi8KLQkvKiBjYW1fZW50cnkgPSA1IG1hcHBpbmcgdG8gbWFjaWQgPSAyICovCi0KLQljYW1faWQgPSA0OwotCi0JREJHXzg3MjNBX0xFVkVMKF9kcnZfYWx3YXlzXywgInNldCBwYWlyd2lzZSBrZXkgdG8gaHc6IGFsZzolZChXRVA0MC0xICIKLQkJCSJXRVAxMDQtNSBUS0lQLTIgQUVTLTQpIGNhbWlkOiVkXG4iLAotCQkJcHBhcm0tPmFsZ29yaXRobSwgY2FtX2lkKTsKLQlpZiAoKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfQVApIHsKLQkJc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JCWlmIChwcGFybS0+YWxnb3JpdGhtID09IDApIHsJLyogIGNsZWFyIGNhbSBlbnRyeSAqLwotCQkJY2xlYXJfY2FtX2VudHJ5MjNhKHBhZGFwdGVyLCBwcGFybS0+aWQpOwotCQkJcmV0dXJuIEgyQ19TVUNDRVNTX1JTUDsKLQkJfQotCi0JCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBwYXJtLT5hZGRyKTsKLQkJaWYgKHBzdGEpIHsKLQkJCWN0cmwgPSBCSVQoMTUpIHwgKHBwYXJtLT5hbGdvcml0aG0gPDwgMik7Ci0KLQkJCURCR184NzIzQSgicjg3MXhfc2V0X3N0YWtleV9oZGwyM2EoKTogZW5jX2FsZ29yaXRobSAiCi0JCQkJICAiPSVkXG4iLCBwcGFybS0+YWxnb3JpdGhtKTsKLQotCQkJaWYgKHBzdGEtPm1hY19pZCA8IDEgfHwgcHN0YS0+bWFjX2lkID4gKE5VTV9TVEEgLSA0KSkgewotCQkJCURCR184NzIzQSgicjg3MXhfc2V0X3N0YWtleV9oZGwyM2EoKTpzZXRfc3Rha2V5IgotCQkJCQkgICIgZmFpbGVkLCBtYWNfaWQoYWlkKSA9JWRcbiIsCi0JCQkJCSAgcHN0YS0+bWFjX2lkKTsKLQkJCQlyZXR1cm4gSDJDX1JFSkVDVEVEOwotCQkJfQotCi0JCQkvKiAwfjMgZm9yIGRlZmF1bHQga2V5LCBjbWRfaWQgPSBtYWNpZCArIDMsCi0JCQkgICBtYWNpZCA9IGFpZCsxOyAqLwotCQkJY2FtX2lkID0gcHN0YS0+bWFjX2lkICsgMzsKLQotCQkJREJHXzg3MjNBKCJXcml0ZSBDQU0sIG1hY19hZGRyID0lcE0sICIKLQkJCQkgICJjYW1fZW50cnkgPSVkXG4iLCBwcGFybS0+YWRkciwgY2FtX2lkKTsKLQotCQkJcnRsODcyM2FfY2FtX3dyaXRlKHBhZGFwdGVyLCBjYW1faWQsIGN0cmwsCi0JCQkJCSAgIHBwYXJtLT5hZGRyLCBwcGFybS0+a2V5KTsKLQotCQkJcmV0dXJuIEgyQ19TVUNDRVNTX1JTUDsKLQkJfSBlbHNlIHsKLQkJCURCR184NzIzQSgicjg3MXhfc2V0X3N0YWtleV9oZGwyM2EoKTogc3RhIGhhcyBiZWVuICIKLQkJCQkgICJmcmVlXG4iKTsKLQkJCXJldHVybiBIMkNfUkVKRUNURUQ7Ci0JCX0KLQl9Ci0KLQkvKiBiZWxvdyBmb3Igc3RhIG1vZGUgKi8KLQotCWlmIChwcGFybS0+YWxnb3JpdGhtID09IDApIHsJLyogIGNsZWFyIGNhbSBlbnRyeSAqLwotCQljbGVhcl9jYW1fZW50cnkyM2EocGFkYXB0ZXIsIHBwYXJtLT5pZCk7Ci0JCXJldHVybiBIMkNfU1VDQ0VTUzsKLQl9Ci0KLQljdHJsID0gQklUKDE1KSB8IChwcGFybS0+YWxnb3JpdGhtIDw8IDIpOwotCi0JcnRsODcyM2FfY2FtX3dyaXRlKHBhZGFwdGVyLCBjYW1faWQsIGN0cmwsIHBwYXJtLT5hZGRyLCBwcGFybS0+a2V5KTsKLQotCXBtbG1laW5mby0+ZW5jX2FsZ28gPSBwcGFybS0+YWxnb3JpdGhtOwotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi1pbnQgYWRkX2JhX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQljb25zdCBzdHJ1Y3QgYWRkQmFSZXFfcGFybSAqcHBhcm0gPSAoc3RydWN0IGFkZEJhUmVxX3Bhcm0gKilwYnVmOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsIHBwYXJtLT5hZGRyKTsKLQotCWlmICghcHN0YSkKLQkJcmV0dXJuIEgyQ19TVUNDRVNTOwotCi0JaWYgKCgocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVNTT0NfU1VDQ0VTUykgJiYKLQkgICAgIHBtbG1laW5mby0+SFRfZW5hYmxlKSB8fAotCSAgICAocG1sbWVpbmZvLT5zdGF0ZSAmIDB4MDMpID09IE1TUl9BUCkgewotCQlpc3N1ZV9hY3Rpb25fQkEyM2EocGFkYXB0ZXIsIHBwYXJtLT5hZGRyLAotCQkJCSAgIFdMQU5fQUNUSU9OX0FEREJBX1JFUSwgKHUxNilwcGFybS0+dGlkKTsKLQkJbW9kX3RpbWVyKCZwc3RhLT5hZGRiYV9yZXRyeV90aW1lciwKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQUREQkFfVE8pKTsKLQl9IGVsc2UKLQkJcHN0YS0+aHRwcml2LmNhbmRpZGF0ZV90aWRfYml0bWFwICY9IH5CSVQocHBhcm0tPnRpZCk7Ci0KLQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci19Ci0KLWludCBzZXRfdHhfYmVhY29uX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBjbWRfb2JqICpwaDJjOwotCXN0cnVjdCBUeF9CZWFjb25fcGFyYW0gKnB0eEJlYWNvbl9wYXJtOwotCXN0cnVjdCBjbWRfcHJpdgkqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQl1OCByZXMgPSBfU1VDQ0VTUzsKLQlpbnQgbGVuX2RpZmYgPSAwOwotCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwaDJjKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcHR4QmVhY29uX3Bhcm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgVHhfQmVhY29uX3BhcmFtKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwdHhCZWFjb25fcGFybSkgewotCQlrZnJlZShwaDJjKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQltZW1jcHkoJnB0eEJlYWNvbl9wYXJtLT5uZXR3b3JrLCAmcG1sbWVpbmZvLT5uZXR3b3JrLAotCSAgICAgICBzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpKTsKLQotCWxlbl9kaWZmID0gdXBkYXRlX2hpZGRlbl9zc2lkKHB0eEJlYWNvbl9wYXJtLT5uZXR3b3JrLklFcywKLQkJCQkgICAgICBwdHhCZWFjb25fcGFybS0+bmV0d29yay5JRUxlbmd0aCwKLQkJCQkgICAgICBwbWxtZWluZm8tPmhpZGRlbl9zc2lkX21vZGUpOwotCXB0eEJlYWNvbl9wYXJtLT5uZXR3b3JrLklFTGVuZ3RoICs9IGxlbl9kaWZmOwotCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHR4QmVhY29uX3Bhcm0sCi0JCQkJICAgR0VOX0NNRF9DT0RFKF9UWF9CZWFjb24pKTsKLQotCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGgyYyk7Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJlczsKLX0KLQotaW50IG1sbWVfZXZ0X2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQl1OCBldnRfY29kZSwgZXZ0X3NlcTsKLQl1MTYgZXZ0X3N6OwotCWNvbnN0IHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKmMyaDsKLQl2b2lkICgqZXZlbnRfY2FsbGJhY2spKHN0cnVjdCBydHdfYWRhcHRlciAqZGV2LCBjb25zdCB1OCAqcGJ1Zik7Ci0KLQljMmggPSAoc3RydWN0IEMySEV2ZW50X0hlYWRlciAqKXBidWY7Ci0JZXZ0X3N6ID0gYzJoLT5sZW47Ci0JZXZ0X3NlcSA9IGMyaC0+c2VxOwotCWV2dF9jb2RlID0gYzJoLT5JRDsKLQotCS8qICBjaGVja2luZyBpZiBldmVudCBjb2RlIGlzIHZhbGlkICovCi0JaWYgKGV2dF9jb2RlID49IE1BWF9DMkhFVlQpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJICJFdmVudCBDb2RlKCVkKSBtaXNtYXRjaCFcbiIsIGV2dF9jb2RlKTsKLQkJZ290byBfYWJvcnRfZXZlbnRfOwotCX0KLQotCS8qICBjaGVja2luZyBpZiBldmVudCBzaXplIG1hdGNoIHRoZSBldmVudCBwYXJtIHNpemUgKi8KLQlpZiAod2xhbmV2ZW50c1tldnRfY29kZV0ucGFybXNpemUgIT0gMCAmJgotCSAgICB3bGFuZXZlbnRzW2V2dF9jb2RlXS5wYXJtc2l6ZSAhPSBldnRfc3opIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJICJFdmVudCglZCkgUGFybSBTaXplIG1pc21hdGNoICglZCB2cyAlZCkhXG4iLAotCQkJIGV2dF9jb2RlLCB3bGFuZXZlbnRzW2V2dF9jb2RlXS5wYXJtc2l6ZSwgZXZ0X3N6KTsKLQkJZ290byBfYWJvcnRfZXZlbnRfOwotCX0KLQotCWV2ZW50X2NhbGxiYWNrID0gd2xhbmV2ZW50c1tldnRfY29kZV0uZXZlbnRfY2FsbGJhY2s7Ci0JZXZlbnRfY2FsbGJhY2socGFkYXB0ZXIsIHBidWYgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOwotCi1fYWJvcnRfZXZlbnRfOgotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi1pbnQgaDJjX21zZ19oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JaWYgKCFwYnVmKQotCQlyZXR1cm4gSDJDX1BBUkFNRVRFUlNfRVJST1I7Ci0KLQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci19Ci0KLWludCB0eF9iZWFjb25faGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCWlmIChzZW5kX2JlYWNvbjIzYShwYWRhcHRlcikgPT0gX0ZBSUwpIHsKLQkJREJHXzg3MjNBKCJpc3N1ZV9iZWFjb24yM2EsIGZhaWwhXG4iKTsKLQkJcmV0dXJuIEgyQ19QQVJBTUVURVJTX0VSUk9SOwotCX0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQllbHNlIHsgLyogdHggYmMvbWMgZnJhbWVzIGFmdGVyIHVwZGF0ZSBUSU0gKi8KLQkJc3RydWN0IHN0YV9pbmZvICpwc3RhX2JtYzsKLQkJc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0JCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lLCAqcHRtcDsKLQkJc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQkJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQotCQkvKiBmb3IgQkMvTUMgRnJhbWVzICovCi0JCXBzdGFfYm1jID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCQlpZiAoIXBzdGFfYm1jKQotCQkJcmV0dXJuIEgyQ19TVUNDRVNTOwotCi0JCWlmIChwc3RhcHJpdi0+dGltX2JpdG1hcCAmIEJJVCgwKSAmJiBwc3RhX2JtYy0+c2xlZXBxX2xlbiA+IDApIHsKLQkJCW1zbGVlcCgxMCk7LyogIDEwbXMsIEFUSU0oSElRKSBXaW5kb3dzICovCi0JCQkvKiBzcGluX2xvY2tfYmgoJnBzdGFfYm1jLT5zbGVlcF9xLmxvY2spOyAqLwotCQkJc3Bpbl9sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCi0JCQlwaGVhZCA9IGdldF9saXN0X2hlYWQoJnBzdGFfYm1jLT5zbGVlcF9xKTsKLQotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB4bWl0ZnJhbWUsIHB0bXAsCi0JCQkJCQkgcGhlYWQsIGxpc3QpIHsKLQotCQkJCWxpc3RfZGVsX2luaXQoJnB4bWl0ZnJhbWUtPmxpc3QpOwotCi0JCQkJcHN0YV9ibWMtPnNsZWVwcV9sZW4tLTsKLQkJCQlpZiAocHN0YV9ibWMtPnNsZWVwcV9sZW4+MCkKLQkJCQkJcHhtaXRmcmFtZS0+YXR0cmliLm1kYXRhID0gMTsKLQkJCQllbHNlCi0JCQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5tZGF0YSA9IDA7Ci0KLQkJCQlweG1pdGZyYW1lLT5hdHRyaWIudHJpZ2dlcmVkID0gMTsKLQotCQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5xc2VsID0gMHgxMTsvKiBISVEgKi8KLQotCQkJCXJ0bDg3MjNhdV9oYWxfeG1pdGZyYW1lX2VucXVldWUocGFkYXB0ZXIsCi0JCQkJCQkJCXB4bWl0ZnJhbWUpOwotCQkJfQotCQkJLyogc3Bpbl91bmxvY2tfYmgoJnBzdGFfYm1jLT5zbGVlcF9xLmxvY2spOyAqLwotCQkJc3Bpbl91bmxvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCXJldHVybiBIMkNfU1VDQ0VTUzsKLX0KLQotaW50IHNldF9jaF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JY29uc3Qgc3RydWN0IHNldF9jaF9wYXJtICpzZXRfY2hfcGFybTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCi0JaWYgKCFwYnVmKQotCQlyZXR1cm4gSDJDX1BBUkFNRVRFUlNfRVJST1I7Ci0KLQlzZXRfY2hfcGFybSA9IChzdHJ1Y3Qgc2V0X2NoX3Bhcm0gKilwYnVmOwotCi0JREJHXzg3MjNBKCIlcyglcyk6IGNoOiV1LCBidzoldSwgY2hfb2Zmc2V0OiV1XG4iLCBfX2Z1bmNfXywKLQkJICBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwgc2V0X2NoX3Bhcm0tPmNoLAotCQkgIHNldF9jaF9wYXJtLT5idywgc2V0X2NoX3Bhcm0tPmNoX29mZnNldCk7Ci0KLQlwbWxtZWV4dC0+Y3VyX2NoYW5uZWwgPSBzZXRfY2hfcGFybS0+Y2g7Ci0JcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPSBzZXRfY2hfcGFybS0+Y2hfb2Zmc2V0OwotCXBtbG1lZXh0LT5jdXJfYndtb2RlID0gc2V0X2NoX3Bhcm0tPmJ3OwotCi0Jc2V0X2NoYW5uZWxfYndtb2RlMjNhKHBhZGFwdGVyLCBzZXRfY2hfcGFybS0+Y2gsCi0JCQkgICAgICBzZXRfY2hfcGFybS0+Y2hfb2Zmc2V0LCBzZXRfY2hfcGFybS0+YncpOwotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi1pbnQgc2V0X2NocGxhbl9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JY29uc3Qgc3RydWN0IFNldENoYW5uZWxQbGFuX3BhcmFtICpzZXRDaGFubmVsUGxhbl9wYXJhbTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCi0JaWYgKCFwYnVmKQotCQlyZXR1cm4gSDJDX1BBUkFNRVRFUlNfRVJST1I7Ci0KLQlzZXRDaGFubmVsUGxhbl9wYXJhbSA9IChzdHJ1Y3QgU2V0Q2hhbm5lbFBsYW5fcGFyYW0gKilwYnVmOwotCi0JcG1sbWVleHQtPm1heF9jaGFuX251bXMgPQotCQlpbml0X2NoYW5uZWxfc2V0KHBhZGFwdGVyLCBzZXRDaGFubmVsUGxhbl9wYXJhbS0+Y2hhbm5lbF9wbGFuLAotCQkJCSBwbWxtZWV4dC0+Y2hhbm5lbF9zZXQpOwotCWluaXRfY2hhbm5lbF9saXN0KHBhZGFwdGVyLCBwbWxtZWV4dC0+Y2hhbm5lbF9zZXQsCi0JCQkgIHBtbG1lZXh0LT5tYXhfY2hhbl9udW1zLCAmcG1sbWVleHQtPmNoYW5uZWxfbGlzdCk7Ci0KLQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci19Ci0KLWludCBsZWRfYmxpbmtfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCXN0cnVjdCBMZWRCbGlua19wYXJhbSAqbGVkQmxpbmtfcGFyYW07Ci0KLQlpZiAoIXBidWYpCi0JCXJldHVybiBIMkNfUEFSQU1FVEVSU19FUlJPUjsKLQotCWxlZEJsaW5rX3BhcmFtID0gKHN0cnVjdCBMZWRCbGlua19wYXJhbSAqKXBidWY7Ci0KLQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci19Ci0KLWludCBzZXRfY3NhX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlyZXR1cm4gSDJDX1JFSkVDVEVEOwotfQotCi0vKiAgVERMU19XUkNSCQk6IHdyaXRlIFJDUiBEQVRBIEJJVCAqLwotLyogIFRETFNfU0RfUFRJCQk6IGlzc3VlIHBlZXIgdHJhZmZpYyBpbmRpY2F0aW9uICovCi0vKiAgVERMU19DU19PRkYJCTogZ28gYmFjayB0byB0aGUgY2hhbm5lbCBsaW5rZWQgd2l0aCBBUCwKLQkJCSAgdGVybWluYXRpbmcgY2hhbm5lbCBzd2l0Y2ggcHJvY2VkdXJlICovCi0vKiAgVERMU19JTklUX0NIX1NFTgk6IGluaXQgY2hhbm5lbCBzZW5zaW5nLCByZWNlaXZlIGFsbCBkYXRhIGFuZAotCQkJICBtZ250IGZyYW1lICovCi0vKiAgVERMU19ET05FX0NIX1NFTgk6IGNoYW5uZWwgc2Vuc2luZyBhbmQgcmVwb3J0IGNhbmRpZGF0ZSBjaGFubmVsICovCi0vKiAgVERMU19PRkZfQ0gJCTogZmlyc3QgdGltZSBzZXQgY2hhbm5lbCB0byBvZmYgY2hhbm5lbCAqLwotLyogIFRETFNfQkFTRV9DSAk6IGdvIGJhY2sgdHAgdGhlIGNoYW5uZWwgbGlua2VkIHdpdGggQVAgd2hlbiBzZXQKLQkJCSAgYmFzZSBjaGFubmVsIGFzIHRhcmdldCBjaGFubmVsICovCi0vKiAgVERMU19QX09GRl9DSAk6IHBlcmlvZGljYWxseSBnbyB0byBvZmYgY2hhbm5lbCAqLwotLyogIFRETFNfUF9CQVNFX0NICTogcGVyaW9kaWNhbGx5IGdvIGJhY2sgdG8gYmFzZSBjaGFubmVsICovCi0vKiAgVERMU19SU19SQ1IJCTogcmVzdG9yZSBSQ1IgKi8KLS8qICBURExTX0NLQUxWX1BIMQk6IGNoZWNrIGFsaXZlIHRpbWVyIHBoYXNlMSAqLwotLyogIFRETFNfQ0tBTFZfUEgyCTogY2hlY2sgYWxpdmUgdGltZXIgcGhhc2UyICovCi0vKiAgVERMU19GUkVFX1NUQQk6IGZyZWUgdGRscyBzdGEgKi8KLWludCB0ZGxzX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlyZXR1cm4gSDJDX1JFSkVDVEVEOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19wd3JjdHJsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3B3cmN0cmwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ4OGExMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3B3cmN0cmwuYworKysgL2Rldi9udWxsCkBAIC0xLDYwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1JUV19QV1JDVFJMX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8b3NkZXBfaW50Zi5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX2NtZC5oPgotI2luY2x1ZGUgPHJ0d19zcmVzZXQuaD4KLQotI2luY2x1ZGUgPHJ0bDg3MjNhX2J0X2ludGYuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLXZvaWQgaXBzX2VudGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQlkb3duKCZwd3Jwcml2LT5sb2NrKTsKLQotCXB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZyA9IHRydWU7Ci0KLQkvKiAgc3luIGlwc19tb2RlIHdpdGggcmVxdWVzdCAqLwotCXB3cnByaXYtPmlwc19tb2RlID0gcHdycHJpdi0+aXBzX21vZGVfcmVxOwotCi0JcHdycHJpdi0+aXBzX2VudGVyMjNhX2NudHMrKzsKLQlEQkdfODcyM0EoIj09Pmlwc19lbnRlcjIzYSBjbnRzOiVkXG4iLCBwd3Jwcml2LT5pcHNfZW50ZXIyM2FfY250cyk7Ci0JcnRsODcyM2FfQlRfZGlzYWJsZV9jb2V4aXN0KHBhZGFwdGVyKTsKLQotCWlmIChwd3Jwcml2LT5jaGFuZ2VfcmZwd3JzdGF0ZSA9PSByZl9vZmYpIHsKLQkJcHdycHJpdi0+YnBvd2VyX3NhdmluZyA9IHRydWU7Ci0JCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJub2xpbmtlZCBwb3dlciBzYXZlIGVudGVyXG4iKTsKLQotCQlpZiAocHdycHJpdi0+aXBzX21vZGUgPT0gSVBTX0xFVkVMXzIpCi0JCQlwd3Jwcml2LT5ia2VlcGZ3YWxpdmUgPSB0cnVlOwotCi0JCXJ0d19pcHNfcHdyX2Rvd24yM2EocGFkYXB0ZXIpOwotCQlwd3Jwcml2LT5yZl9wd3JzdGF0ZSA9IHJmX29mZjsKLQl9Ci0JcHdycHJpdi0+Ymlwc19wcm9jZXNzaW5nID0gZmFsc2U7Ci0KLQl1cCgmcHdycHJpdi0+bG9jayk7Ci19Ci0KLWludCBpcHNfbGVhdmUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0JaW50IHJlc3VsdCA9IF9TVUNDRVNTOwotCWludCBrZXlpZDsKLQotCWRvd24oJnB3cnByaXYtPmxvY2spOwotCi0JaWYgKHB3cnByaXYtPnJmX3B3cnN0YXRlID09IHJmX29mZiAmJiAhcHdycHJpdi0+Ymlwc19wcm9jZXNzaW5nKSB7Ci0JCXB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZyA9IHRydWU7Ci0JCXB3cnByaXYtPmNoYW5nZV9yZnB3cnN0YXRlID0gcmZfb247Ci0JCXB3cnByaXYtPmlwc19sZWF2ZTIzYV9jbnRzKys7Ci0JCURCR184NzIzQSgiPT0+aXBzX2xlYXZlMjNhIGNudHM6JWRcbiIsCi0JCQkgIHB3cnByaXYtPmlwc19sZWF2ZTIzYV9jbnRzKTsKLQotCQlyZXN1bHQgPSBydHdfaXBzX3B3cl91cDIzYShwYWRhcHRlcik7Ci0JCWlmIChyZXN1bHQgPT0gX1NVQ0NFU1MpCi0JCQlwd3Jwcml2LT5yZl9wd3JzdGF0ZSA9IHJmX29uOwotCi0JCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJub2xpbmtlZCBwb3dlciBzYXZlIGxlYXZlXG4iKTsKLQotCQlpZiAocHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9PQotCQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKLQkJICAgIHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPT0KLQkJICAgIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgewotCQkJREJHXzg3MjNBKCI9PT4lcywgY2hhbm5lbCglZCksIHByb2Nlc3NpbmcoJXgpXG4iLAotCQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5tbG1lZXh0cHJpdi5jdXJfY2hhbm5lbCwKLQkJCQkgIHB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZyk7Ci0JCQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsCi0JCQkJCSAgICAgIHBhZGFwdGVyLT5tbG1lZXh0cHJpdi5jdXJfY2hhbm5lbCwKLQkJCQkJICAgICAgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSwKLQkJCQkJICAgICAgSFRfQ0hBTk5FTF9XSURUSF8yMCk7Ci0JCQlmb3IgKGtleWlkID0gMDsga2V5aWQgPCA0OyBrZXlpZCsrKSB7Ci0JCQkJaWYgKHBtbG1lcHJpdi0+a2V5X21hc2sgJiBCSVQoa2V5aWQpKSB7Ci0JCQkJCWlmIChrZXlpZCA9PQotCQkJCQkgICAgcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5S2V5SW5kZXgpCi0JCQkJCQlyZXN1bHQgPSBydHdfc2V0X2tleTIzYShwYWRhcHRlciwgcHNlY3VyaXR5cHJpdiwga2V5aWQsIDEpOwotCQkJCQllbHNlCi0JCQkJCQlyZXN1bHQgPSBydHdfc2V0X2tleTIzYShwYWRhcHRlciwgcHNlY3VyaXR5cHJpdiwga2V5aWQsIDApOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCURCR184NzIzQSgiPT0+IGlwc19sZWF2ZTIzYS4uLi4uTEVEKDB4JTA4eCkuLi5cbiIsCi0JCQkgIHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4NGMpKTsKLQkJcHdycHJpdi0+Ymlwc19wcm9jZXNzaW5nID0gZmFsc2U7Ci0KLQkJcHdycHJpdi0+YmtlZXBmd2FsaXZlID0gZmFsc2U7Ci0JCXB3cnByaXYtPmJwb3dlcl9zYXZpbmcgPSBmYWxzZTsKLQl9Ci0KLQl1cCgmcHdycHJpdi0+bG9jayk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXRpYyBib29sIHJ0d19wd3JfdW5hc3NvY2lhdGVkX2lkbGUoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdF9wcml2ID0gJmFkYXB0ZXItPnhtaXRwcml2OwotCi0JYm9vbCByZXQgPSBmYWxzZTsKLQotCWlmICh0aW1lX2FmdGVyX2VxKGFkYXB0ZXItPnB3cmN0cmxwcml2Lmlwc19kZW55X3RpbWUsIGppZmZpZXMpKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVNPQ19TVEFURXxXSUZJX1NJVEVfTU9OSVRPUikgfHwKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfVU5ERVJfTElOS0lOR3xXSUZJX1VOREVSX1dQUykgfHwKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpIHx8Ci0JICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURXxXSUZJX0FESE9DX1NUQVRFKSl7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAocHhtaXRfcHJpdi0+ZnJlZV94bWl0YnVmX2NudCAhPSBOUl9YTUlUQlVGRiB8fAotCQlweG1pdF9wcml2LT5mcmVlX3htaXRfZXh0YnVmX2NudCAhPSBOUl9YTUlUX0VYVEJVRkYpIHsKLQkJREJHXzg3MjNBX0xFVkVMKF9kcnZfYWx3YXlzXywKLQkJCQkiVGhlcmUgYXJlIHNvbWUgcGt0cyB0byB0cmFuc21pdFxuIik7Ci0JCURCR184NzIzQV9MRVZFTChfZHJ2X2luZm9fLCAiZnJlZV94bWl0YnVmX2NudDogJWQsICIKLQkJCQkiZnJlZV94bWl0X2V4dGJ1Zl9jbnQ6ICVkXG4iLAotCQkJCXB4bWl0X3ByaXYtPmZyZWVfeG1pdGJ1Zl9jbnQsCi0JCQkJcHhtaXRfcHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9jbnQpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcmV0ID0gdHJ1ZTsKLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIHJ0d19wc19wcm9jZXNzb3IyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0JcHdycHJpdi0+cHNfcHJvY2Vzc2luZyA9IHRydWU7Ci0KLQlpZiAocHdycHJpdi0+Ymlwc19wcm9jZXNzaW5nID09IHRydWUpCi0JCWdvdG8gZXhpdDsKLQotCWlmIChwd3Jwcml2LT5pcHNfbW9kZV9yZXEgPT0gSVBTX05PTkUpCi0JCWdvdG8gZXhpdDsKLQotCWlmICghcnR3X3B3cl91bmFzc29jaWF0ZWRfaWRsZShwYWRhcHRlcikpCi0JCWdvdG8gZXhpdDsKLQotCWlmIChwd3Jwcml2LT5yZl9wd3JzdGF0ZSA9PSByZl9vbiAmJgotCSAgICAocHdycHJpdi0+cHdyX3N0YXRlX2NoZWNrX2NudHMgJSA0KSA9PSAwKSB7Ci0JCURCR184NzIzQSgiPT0+JXMgLmZ3X3N0YXRlKCV4KVxuIiwgX19mdW5jX18sCi0JCQkgIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwotCQlwd3Jwcml2LT5jaGFuZ2VfcmZwd3JzdGF0ZSA9IHJmX29mZjsKLQkJaXBzX2VudGVyMjNhKHBhZGFwdGVyKTsKLQl9Ci1leGl0OgotCXJ0d19zZXRfcHdyX3N0YXRlX2NoZWNrX3RpbWVyKCZwYWRhcHRlci0+cHdyY3RybHByaXYpOwotCXB3cnByaXYtPnBzX3Byb2Nlc3NpbmcgPSBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgcHdyX3N0YXRlX2NoZWNrX2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopZGF0YTsKLQotCXJ0d19wc19jbWQyM2EocGFkYXB0ZXIpOwotfQotCi0vKgotICoKLSAqIFBhcmFtZXRlcnMKLSAqICAgcGFkYXB0ZXIKLSAqICAgcHNsdglwb3dlciBzdGF0ZSBsZXZlbCwgb25seSBjb3VsZCBiZSBQU19TVEFURV9TMCB+IFBTX1NUQVRFX1M0Ci0gKgotICovCi12b2lkIHJ0d19zZXRfcnB3bTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBwc2x2KQotewotCXU4IHJwd207Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQlwc2x2ID0gUFNfU1RBVEUocHNsdik7Ci0KLQlpZiAocHdycHJpdi0+YnRjb2V4X3Jmb24pIHsKLQkJaWYgKHBzbHYgPCBQU19TVEFURV9TNCkKLQkJCXBzbHYgPSBQU19TVEFURV9TMzsKLQl9Ci0KLQlpZiAocHdycHJpdi0+cnB3bSA9PSBwc2x2KSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9wd3JjdHJsX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOiBBbHJlYWR5IHNldCBycHdtWzB4JTAyWF0sIG5ldyA9IDB4JTAyWCFcbiIsCi0JCQkgX19mdW5jX18sIHB3cnByaXYtPnJwd20sIHBzbHYpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IHRydWUgfHwKLQkgICAgcGFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkID09IGZhbHNlKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9wd3JjdHJsX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOiBTdXJwcmlzZVJlbW92ZWQoJWQpIGh3X2luaXRfY29tcGxldGVkKCVkKVxuIiwKLQkJCSBfX2Z1bmNfXywgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQsCi0JCQkgcGFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkKTsKLQotCQlwd3Jwcml2LT5jcHdtID0gUFNfU1RBVEVfUzQ7Ci0KLQkJcmV0dXJuOwotCX0KLQotCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPT0gdHJ1ZSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXywgX2Rydl9lcnJfLAotCQkJICIlczogY2hhbmdlIHBvd2VyIHN0YXRlKDB4JTAyWCkgd2hlbiBEcml2ZXJTdG9wcGVkXG4iLAotCQkJIF9fZnVuY19fLCBwc2x2KTsKLQotCQlpZiAocHNsdiA8IFBTX1NUQVRFX1MyKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXywgX2Rydl9lcnJfLAotCQkJCSAiJXM6IFJlamVjdCB0byBlbnRlciBQU19TVEFURSgweCUwMlgpIGxvd2VyIHRoYW4gUzIgd2hlbiBEcml2ZXJTdG9wcGVkISFcbiIsCi0JCQkJIF9fZnVuY19fLCBwc2x2KTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXJwd20gPSBwc2x2IHwgcHdycHJpdi0+dG9nOwotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9wd3JjdHJsX2NfLCBfZHJ2X25vdGljZV8sCi0JCSAicnR3X3NldF9ycHdtMjNhOiBycHdtID0gMHglMDJ4IGNwd20gPSAweCUwMnhcbiIsCi0JCSBycHdtLCBwd3Jwcml2LT5jcHdtKTsKLQotCXB3cnByaXYtPnJwd20gPSBwc2x2OwotCi0JcnRsODcyM2Ffc2V0X3Jwd20ocGFkYXB0ZXIsIHJwd20pOwotCi0JcHdycHJpdi0+dG9nICs9IDB4ODA7Ci0JcHdycHJpdi0+Y3B3bSA9IHBzbHY7Ci19Ci0KLXN0YXRpYyBib29sIFBTX1JEWV9DSEVDSyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXVuc2lnbmVkIGxvbmcgZGVsdGFfdGltZTsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0JZGVsdGFfdGltZSA9IGppZmZpZXMgLSBwd3Jwcml2LT5EZWxheUxQU0xhc3RUaW1lU3RhbXA7Ci0KLQlpZiAoZGVsdGFfdGltZSA8IExQU19ERUxBWV9USU1FKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSB8fAotCSAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkgfHwKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpIHx8Ci0JICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkgfHwKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKHB3cnByaXYtPmJJblN1c3BlbmQpCi0JCXJldHVybiBmYWxzZTsKLQlpZiAocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMUF1dGhBbGdydGhtID09IGRvdDExQXV0aEFsZ3J0aG1fODAyMVggJiYKLQkgICAgIXBhZGFwdGVyLT5zZWN1cml0eXByaXYuYmluc3RhbGxHcnBrZXkpIHsKLQkJREJHXzg3MjNBKCJHcm91cCBoYW5kc2hha2Ugc3RpbGwgaW4gcHJvZ3Jlc3MgISEhXG4iKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlpZiAoIXJ0d19jZmc4MDIxMV9wd3JfbWdtdChwYWRhcHRlcikpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVlOwotfQotCi12b2lkIHJ0d19zZXRfcHNfbW9kZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBwc19tb2RlLAotCQkJdTggc21hcnRfcHMsIHU4IGJjbl9hbnRfbW9kZSkKLXsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9wd3JjdHJsX2NfLCBfZHJ2X25vdGljZV8sCi0JCSAiJXM6IFBvd2VyTW9kZSA9JWQgU21hcnRfUFMgPSVkXG4iLAotCQkgX19mdW5jX18sIHBzX21vZGUsIHNtYXJ0X3BzKTsKLQotCWlmIChwc19tb2RlID4gUE1fQ2FyZF9EaXNhYmxlKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9wd3JjdHJsX2NfLCBfZHJ2X2Vycl8sCi0JCQkgInBzX21vZGU6JWQgZXJyb3JcbiIsIHBzX21vZGUpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHB3cnByaXYtPnB3cl9tb2RlID09IHBzX21vZGUpIHsKLQkJaWYgKFBTX01PREVfQUNUSVZFID09IHBzX21vZGUpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHB3cnByaXYtPnNtYXJ0X3BzID09IHNtYXJ0X3BzICYmCi0JCSAgICBwd3Jwcml2LT5iY25fYW50X21vZGUgPT0gYmNuX2FudF9tb2RlKQotCQkJcmV0dXJuOwotCX0KLQotCWlmIChwc19tb2RlID09IFBTX01PREVfQUNUSVZFKSB7Ci0JCURCR184NzIzQSgicnR3X3NldF9wc19tb2RlMjNhOiBMZWF2ZSA4MDIuMTEgcG93ZXIgc2F2ZVxuIik7Ci0KLQkJcHdycHJpdi0+cHdyX21vZGUgPSBwc19tb2RlOwotCQlydHdfc2V0X3Jwd20yM2EocGFkYXB0ZXIsIFBTX1NUQVRFX1M0KTsKLQkJcnRsODcyM2Ffc2V0X0Z3UHdyTW9kZV9jbWQocGFkYXB0ZXIsIHBzX21vZGUpOwotCQlwd3Jwcml2LT5iRndDdXJyZW50SW5QU01vZGUgPSBmYWxzZTsKLQl9IGVsc2UgewotCQlpZiAoUFNfUkRZX0NIRUNLKHBhZGFwdGVyKSB8fAotCQkgICAgcnRsODcyM2FfQlRfdXNpbmdfYW50ZW5uYV8xKHBhZGFwdGVyKSkgewotCQkJREJHXzg3MjNBKCIlczogRW50ZXIgODAyLjExIHBvd2VyIHNhdmVcbiIsIF9fZnVuY19fKTsKLQotCQkJcHdycHJpdi0+YkZ3Q3VycmVudEluUFNNb2RlID0gdHJ1ZTsKLQkJCXB3cnByaXYtPnB3cl9tb2RlID0gcHNfbW9kZTsKLQkJCXB3cnByaXYtPnNtYXJ0X3BzID0gc21hcnRfcHM7Ci0JCQlwd3Jwcml2LT5iY25fYW50X21vZGUgPSBiY25fYW50X21vZGU7Ci0JCQlydGw4NzIzYV9zZXRfRndQd3JNb2RlX2NtZChwYWRhcHRlciwgcHNfbW9kZSk7Ci0KLQkJCXJ0d19zZXRfcnB3bTIzYShwYWRhcHRlciwgUFNfU1RBVEVfUzIpOwotCQl9Ci0JfQotfQotCi0vKgotICogUmV0dXJuOgotICoJMDoJTGVhdmUgT0sKLSAqCS0xOglUaW1lb3V0Ci0gKgktMjoJT3RoZXIgZXJyb3IKLSAqLwotczMyIExQU19SRl9PTl9jaGVjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgZGVsYXlfbXMpCi17Ci0JdW5zaWduZWQgbG9uZyBzdGFydF90aW1lLCBlbmRfdGltZTsKLQl1OCBiQXdha2UgPSBmYWxzZTsKLQlzMzIgZXJyID0gMDsKLQotCXN0YXJ0X3RpbWUgPSBqaWZmaWVzOwotCWVuZF90aW1lID0gc3RhcnRfdGltZSArIG1zZWNzX3RvX2ppZmZpZXMoZGVsYXlfbXMpOwotCi0Jd2hpbGUgKDEpIHsKLQkJYkF3YWtlID0gcnRsODcyM2FfZ2V0X2Z3bHBzX3JmX29uKHBhZGFwdGVyKTsKLQkJaWYgKGJBd2FrZSA9PSB0cnVlKQotCQkJYnJlYWs7Ci0KLQkJaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IHRydWUpIHsKLQkJCWVyciA9IC0yOwotCQkJREJHXzg3MjNBKCIlczogZGV2aWNlIHN1cnByaXNlIHJlbW92ZWQhIVxuIiwgX19mdW5jX18pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBlbmRfdGltZSkpIHsKLQkJCWVyciA9IC0xOwotCQkJREJHXzg3MjNBKCIlczogV2FpdCBmb3IgRlcgTFBTIGxlYXZlIG1vcmUgdGhhbiAldSAiCi0JCQkJICAibXMhXG4iLCBfX2Z1bmNfXywgZGVsYXlfbXMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJdWRlbGF5KDEwMCk7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotLyoJRGVzY3JpcHRpb246ICovCi0vKgkJRW50ZXIgdGhlIGxlaXN1cmUgcG93ZXIgc2F2ZSBtb2RlLiAqLwotdm9pZCBMUFNfRW50ZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQotCWlmICghUFNfUkRZX0NIRUNLKHBhZGFwdGVyKSkKLQkJcmV0dXJuOwotCi0JaWYgKHB3cnByaXYtPmJMZWlzdXJlUHMpIHsKLQkJLyogIElkbGUgZm9yIGEgd2hpbGUgaWYgd2UgY29ubmVjdCB0byBBUCBhIHdoaWxlIGFnby4gKi8KLQkJaWYgKHB3cnByaXYtPkxwc0lkbGVDb3VudCA+PSAyKSB7IC8qICAgNCBTZWMgKi8KLQkJCWlmIChwd3Jwcml2LT5wd3JfbW9kZSA9PSBQU19NT0RFX0FDVElWRSkgewotCQkJCXB3cnByaXYtPmJwb3dlcl9zYXZpbmcgPSB0cnVlOwotCQkJCURCR184NzIzQSgiJXMgc21hcnRfcHM6JWRcbiIsIF9fZnVuY19fLAotCQkJCQkgIHB3cnByaXYtPnNtYXJ0X3BzKTsKLQkJCQkvKiBGb3IgVGVuZGEgVzMxMVIgSU9UIGlzc3VlICovCi0JCQkJcnR3X3NldF9wc19tb2RlMjNhKHBhZGFwdGVyLAotCQkJCQkJICAgcHdycHJpdi0+cG93ZXJfbWdudCwKLQkJCQkJCSAgIHB3cnByaXYtPnNtYXJ0X3BzLCAwKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlwd3Jwcml2LT5McHNJZGxlQ291bnQrKzsKLQl9Ci19Ci0KLS8qCURlc2NyaXB0aW9uOiAqLwotLyoJCUxlYXZlIHRoZSBsZWlzdXJlIHBvd2VyIHNhdmUgbW9kZS4gKi8KLXZvaWQgTFBTX0xlYXZlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0jZGVmaW5lIExQU19MRUFWRV9USU1FT1VUX01TIDEwMAotCi0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQlpZiAocHdycHJpdi0+YkxlaXN1cmVQcykgewotCQlpZiAocHdycHJpdi0+cHdyX21vZGUgIT0gUFNfTU9ERV9BQ1RJVkUpIHsKLQkJCXJ0d19zZXRfcHNfbW9kZTIzYShwYWRhcHRlciwgUFNfTU9ERV9BQ1RJVkUsIDAsIDApOwotCi0JCQlpZiAocHdycHJpdi0+cHdyX21vZGUgPT0gUFNfTU9ERV9BQ1RJVkUpCi0JCQkJTFBTX1JGX09OX2NoZWNrMjNhKHBhZGFwdGVyLAotCQkJCQkJICAgTFBTX0xFQVZFX1RJTUVPVVRfTVMpOwotCQl9Ci0JfQotCi0JcHdycHJpdi0+YnBvd2VyX3NhdmluZyA9IGZhbHNlOwotfQotCi0vKiAgRGVzY3JpcHRpb246IExlYXZlIGFsbCBwb3dlciBzYXZlIG1vZGU6IExQUywgRndMUFMsIElQUyBpZiBuZWVkZWQuICovCi0vKiAgTW92ZSBjb2RlIHRvIGZ1bmN0aW9uIGJ5IHR5bmxpLiAyMDEwLjAzLjI2LiAqLwotdm9pZCBMZWF2ZUFsbFBvd2VyU2F2ZU1vZGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZBZGFwdGVyLT5tbG1lcHJpdjsKLQl1OCBlbnF1ZXVlID0gMDsKLQotCS8qIERCR184NzIzQSgiJXMuLi4uLlxuIiwgX19mdW5jX18pOyAqLwotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpCi0JCXJ0d19scHNfY3RybF93a19jbWQyM2EoQWRhcHRlciwgTFBTX0NUUkxfTEVBVkUsIGVucXVldWUpOwotfQotCi12b2lkIHJ0d19pbml0X3B3cmN0cmxfcHJpdjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cmN0cmxwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQotCXNlbWFfaW5pdCgmcHdyY3RybHByaXYtPmxvY2ssIDEpOwotCXB3cmN0cmxwcml2LT5yZl9wd3JzdGF0ZSA9IHJmX29uOwotCXB3cmN0cmxwcml2LT5pcHNfZW50ZXIyM2FfY250cyA9IDA7Ci0JcHdyY3RybHByaXYtPmlwc19sZWF2ZTIzYV9jbnRzID0gMDsKLQlwd3JjdHJscHJpdi0+Ymlwc19wcm9jZXNzaW5nID0gZmFsc2U7Ci0KLQlwd3JjdHJscHJpdi0+aXBzX21vZGUgPSBwYWRhcHRlci0+cmVnaXN0cnlwcml2Lmlwc19tb2RlOwotCXB3cmN0cmxwcml2LT5pcHNfbW9kZV9yZXEgPSBwYWRhcHRlci0+cmVnaXN0cnlwcml2Lmlwc19tb2RlOwotCi0JcHdyY3RybHByaXYtPnB3cl9zdGF0ZV9jaGVja19pbnRlcnZhbCA9IFJUV19QV1JfU1RBVEVfQ0hLX0lOVEVSVkFMOwotCXB3cmN0cmxwcml2LT5wd3Jfc3RhdGVfY2hlY2tfY250cyA9IDA7Ci0JcHdyY3RybHByaXYtPmJJblN1c3BlbmQgPSBmYWxzZTsKLQlwd3JjdHJscHJpdi0+YmtlZXBmd2FsaXZlID0gZmFsc2U7Ci0KLQlwd3JjdHJscHJpdi0+THBzSWRsZUNvdW50ID0gMDsKLQotCS8qICBQU19NT0RFX01JTjsgKi8KLQlwd3JjdHJscHJpdi0+cG93ZXJfbWdudCA9IHBhZGFwdGVyLT5yZWdpc3RyeXByaXYucG93ZXJfbWdudDsKLQlwd3JjdHJscHJpdi0+YkxlaXN1cmVQcyA9Ci0JCShQU19NT0RFX0FDVElWRSAhPSBwd3JjdHJscHJpdi0+cG93ZXJfbWdudCk/dHJ1ZTpmYWxzZTsKLQotCXB3cmN0cmxwcml2LT5iRndDdXJyZW50SW5QU01vZGUgPSBmYWxzZTsKLQotCXB3cmN0cmxwcml2LT5ycHdtID0gMDsKLQlwd3JjdHJscHJpdi0+Y3B3bSA9IFBTX1NUQVRFX1M0OwotCi0JcHdyY3RybHByaXYtPnB3cl9tb2RlID0gUFNfTU9ERV9BQ1RJVkU7Ci0JcHdyY3RybHByaXYtPnNtYXJ0X3BzID0gcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5zbWFydF9wczsKLQlwd3JjdHJscHJpdi0+YmNuX2FudF9tb2RlID0gMDsKLQotCXB3cmN0cmxwcml2LT50b2cgPSAweDgwOwotCi0JcHdyY3RybHByaXYtPmJ0Y29leF9yZm9uID0gZmFsc2U7Ci0KLQlzZXR1cF90aW1lcigmcHdyY3RybHByaXYtPnB3cl9zdGF0ZV9jaGVja190aW1lciwKLQkJICAgIHB3cl9zdGF0ZV9jaGVja19oYW5kbGVyLCAodW5zaWduZWQgbG9uZylwYWRhcHRlcik7Ci19Ci0KLXZvaWQgcnR3X2ZyZWVfcHdyY3RybF9wcml2KHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLX0KLQotaW5saW5lIHZvaWQgcnR3X3NldF9pcHNfZGVueTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgbXMpCi17Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQlwd3Jwcml2LT5pcHNfZGVueV90aW1lID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMobXMpOwotfQotCi0vKgotKiBydHdfcHdyX3dha2V1cCAtIFdha2UgdGhlIE5JQyB1cCBmcm9tOiAxKUlQUy4gMilVU0IgYXV0b3N1c3BlbmQKLSogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gX2FkYXB0ZXIgc3RydWN0dXJlCi0qIEBpcHNfZGVmZmVyX21zOiB0aGUgbXMgd2lsbCBwcmV2ZW50IGZyb20gZmFsbGluZyBpbnRvIElQUyBhZnRlciB3YWtldXAKLSogUmV0dXJuIF9TVUNDRVNTIG9yIF9GQUlMCi0qLwotCi1pbnQgX3J0d19wd3Jfd2FrZXVwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBpcHNfZGVmZmVyX21zLCBjb25zdCBjaGFyICpjYWxsZXIpCi17Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9IGppZmZpZXM7Ci0JdW5zaWduZWQgbG9uZyBuZXdfZGVueV90aW1lOwotCi0JbmV3X2RlbnlfdGltZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKGlwc19kZWZmZXJfbXMpOwotCi0JaWYgKHRpbWVfYmVmb3JlKHB3cnByaXYtPmlwc19kZW55X3RpbWUsIG5ld19kZW55X3RpbWUpKQotCQlwd3Jwcml2LT5pcHNfZGVueV90aW1lID0gbmV3X2RlbnlfdGltZTsKLQotCWlmIChwd3Jwcml2LT5wc19wcm9jZXNzaW5nKSB7Ci0JCURCR184NzIzQSgiJXMgd2FpdCBwc19wcm9jZXNzaW5nLi4uXG4iLCBfX2Z1bmNfXyk7Ci0JCXdoaWxlIChwd3Jwcml2LT5wc19wcm9jZXNzaW5nICYmCi0JCSAgICAgICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkgPD0gMzAwMCkKLQkJCW1zbGVlcCgxMCk7Ci0JCWlmIChwd3Jwcml2LT5wc19wcm9jZXNzaW5nKQotCQkJREJHXzg3MjNBKCIlcyB3YWl0IHBzX3Byb2Nlc3NpbmcgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQllbHNlCi0JCQlEQkdfODcyM0EoIiVzIHdhaXQgcHNfcHJvY2Vzc2luZyBkb25lXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCi0JaWYgKHJ0d19zcmVzZXRfaW5wcm9ncmVzcyhwYWRhcHRlcikpIHsKLQkJREJHXzg3MjNBKCIlcyB3YWl0IHNyZXNldF9pbnByb2dyZXNzLi4uXG4iLCBfX2Z1bmNfXyk7Ci0JCXdoaWxlIChydHdfc3Jlc2V0X2lucHJvZ3Jlc3MocGFkYXB0ZXIpICYmCi0JCSAgICAgICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkgPD0gNDAwMCkKLQkJCW1zbGVlcCgxMCk7Ci0JCWlmIChydHdfc3Jlc2V0X2lucHJvZ3Jlc3MocGFkYXB0ZXIpKQotCQkJREJHXzg3MjNBKCIlcyB3YWl0IHNyZXNldF9pbnByb2dyZXNzIHRpbWVvdXRcbiIsCi0JCQkJICBfX2Z1bmNfXyk7Ci0JCWVsc2UKLQkJCURCR184NzIzQSgiJXMgd2FpdCBzcmVzZXRfaW5wcm9ncmVzcyBkb25lXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCi0JaWYgKHB3cnByaXYtPmJJblN1c3BlbmQpIHsKLQkJREJHXzg3MjNBKCIlcyB3YWl0IGJJblN1c3BlbmQuLi5cbiIsIF9fZnVuY19fKTsKLQkJd2hpbGUgKHB3cnByaXYtPmJJblN1c3BlbmQgJiYKLQkJICAgICAgIChqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkgPD0gMzAwMCkpIHsKLQkJCW1zbGVlcCgxMCk7Ci0JCX0KLQkJaWYgKHB3cnByaXYtPmJJblN1c3BlbmQpCi0JCQlEQkdfODcyM0EoIiVzIHdhaXQgYkluU3VzcGVuZCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCWVsc2UKLQkJCURCR184NzIzQSgiJXMgd2FpdCBiSW5TdXNwZW5kIGRvbmVcbiIsIF9fZnVuY19fKTsKLQl9Ci0KLQkvKiBTeXN0ZW0gc3VzcGVuZCBpcyBub3QgYWxsb3dlZCB0byB3YWtldXAgKi8KLQlpZiAocHdycHJpdi0+YkluU3VzcGVuZCkgewotCQlyZXQgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIEkgdGhpbmsgdGhpcyBzaG91bGQgYmUgY2hlY2sgaW4gSVBTLCBMUFMsIGF1dG9zdXNwZW5kIGZ1bmN0aW9ucy4uLiAqLwotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAocmZfb2ZmID09IHB3cnByaXYtPnJmX3B3cnN0YXRlKSB7Ci0JCURCR184NzIzQSgiJXMgY2FsbCBpcHNfbGVhdmUyM2EuLi4uXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmIChpcHNfbGVhdmUyM2EocGFkYXB0ZXIpPT0gX0ZBSUwpIHsKLQkJCURCR184NzIzQSgiPT09PT09PiBpcHNfbGVhdmUyM2EgZmFpbC4uLi4uLi4uLi4uLi5cbiIpOwotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQl9Ci0KLQkvKiBUT0RPOiB0aGUgZm9sbG93aW5nIGNoZWNraW5nIG5lZWQgdG8gYmUgbWVyZ2VkLi4uICovCi0JaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCAhcGFkYXB0ZXItPmJ1cCB8fAotCSAgICAhcGFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkKSB7Ci0JCURCR184NzIzQSgiJXM6IGJEcml2ZXJTdG9wcGVkID0lZCwgYnVwID0lZCwgaHdfaW5pdF9jb21wbGV0ZWQgIgotCQkJICAiPSV1XG4iLCBjYWxsZXIsIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCwKLQkJCSAgcGFkYXB0ZXItPmJ1cCwgcGFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkKTsKLQkJcmV0ID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLWV4aXQ6Ci0JbmV3X2RlbnlfdGltZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKGlwc19kZWZmZXJfbXMpOwotCWlmICh0aW1lX2JlZm9yZShwd3Jwcml2LT5pcHNfZGVueV90aW1lLCBuZXdfZGVueV90aW1lKSkKLQkJcHdycHJpdi0+aXBzX2RlbnlfdGltZSA9IG5ld19kZW55X3RpbWU7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJ0d19wbV9zZXRfbHBzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG1vZGUpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybHByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCi0JaWYgKG1vZGUgPCBQU19NT0RFX05VTSkgewotCQlpZiAocHdyY3RybHByaXYtPnBvd2VyX21nbnQgIT0gbW9kZSkgewotCQkJaWYgKFBTX01PREVfQUNUSVZFID09IG1vZGUpCi0JCQkJTGVhdmVBbGxQb3dlclNhdmVNb2RlMjNhKHBhZGFwdGVyKTsKLQkJCWVsc2UKLQkJCQlwd3JjdHJscHJpdi0+THBzSWRsZUNvdW50ID0gMjsKLQkJCXB3cmN0cmxwcml2LT5wb3dlcl9tZ250ID0gbW9kZTsKLQkJCXB3cmN0cmxwcml2LT5iTGVpc3VyZVBzID0KLQkJCQkoUFNfTU9ERV9BQ1RJVkUgIT0gcHdyY3RybHByaXYtPnBvd2VyX21nbnQpID8KLQkJCQl0cnVlOmZhbHNlOwotCQl9Ci0JfSBlbHNlCi0JCXJldCA9IC1FSU5WQUw7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgcnR3X3BtX3NldF9pcHMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbW9kZSkKLXsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJscHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQlpZiAobW9kZSAhPSBJUFNfTk9STUFMICYmIG1vZGUgIT0gSVBTX0xFVkVMXzIgJiYgbW9kZSAhPSBJUFNfTk9ORSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwd3JjdHJscHJpdi0+aXBzX21vZGVfcmVxID0gbW9kZTsKLQlpZiAobW9kZSA9PSBJUFNfTk9ORSkgewotCQlEQkdfODcyM0EoIiVzICVzXG4iLCBfX2Z1bmNfXywgIklQU19OT05FIik7Ci0JCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9PSAwICYmCi0JCSAgICBydHdfcHdyX3dha2V1cChwYWRhcHRlcikgPT0gX0ZBSUwpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19yZWN2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MGRhYmMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19yZWN2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRXX1JFQ1ZfQ18KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgotI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+Ci0jaW5jbHVkZSA8dXNiX29wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgotI2luY2x1ZGUgPHdpZmkuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9yZWN2Lmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfeG1pdC5oPgotCi12b2lkIHJ0d19zaWduYWxfc3RhdF90aW1lcl9oZGwyM2EodW5zaWduZWQgbG9uZyBkYXRhKTsKLQotdm9pZCBfcnR3X2luaXRfc3RhX3JlY3ZfcHJpdjIzYShzdHJ1Y3Qgc3RhX3JlY3ZfcHJpdiAqcHN0YV9yZWN2cHJpdikKLXsKLQotCi0KLQlzcGluX2xvY2tfaW5pdCgmcHN0YV9yZWN2cHJpdi0+bG9jayk7Ci0KLQkvKiBmb3IgKGkgPSAwOyBpPE1BWF9SWF9OVU1CTEtTOyBpKyspICovCi0JLyoJX3J0d19pbml0X3F1ZXVlMjNhKCZwc3RhX3JlY3Zwcml2LT5ibGtfc3RybXNbaV0pOyAqLwotCi0JX3J0d19pbml0X3F1ZXVlMjNhKCZwc3RhX3JlY3Zwcml2LT5kZWZyYWdfcSk7Ci0KLQotfQotCi1pbnQgX3J0d19pbml0X3JlY3ZfcHJpdjIzYShzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYsCi0JCQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lOwotCWludCBpOwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCXNwaW5fbG9ja19pbml0KCZwcmVjdnByaXYtPmxvY2spOwotCi0JX3J0d19pbml0X3F1ZXVlMjNhKCZwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZSk7Ci0JX3J0d19pbml0X3F1ZXVlMjNhKCZwcmVjdnByaXYtPnJlY3ZfcGVuZGluZ19xdWV1ZSk7Ci0JX3J0d19pbml0X3F1ZXVlMjNhKCZwcmVjdnByaXYtPnVjX3N3ZGVjX3BlbmRpbmdfcXVldWUpOwotCi0JcHJlY3Zwcml2LT5hZGFwdGVyID0gcGFkYXB0ZXI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfUkVDVkZSQU1FIDsgaSsrKSB7Ci0JCXByZWN2ZnJhbWUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVjdl9mcmFtZSksIEdGUF9LRVJORUwpOwotCQlpZiAoIXByZWN2ZnJhbWUpCi0JCQlicmVhazsKLQkJSU5JVF9MSVNUX0hFQUQoJnByZWN2ZnJhbWUtPmxpc3QpOwotCi0JCWxpc3RfYWRkX3RhaWwoJnByZWN2ZnJhbWUtPmxpc3QsCi0JCQkgICAgICAmcHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWUucXVldWUpOwotCi0JCXByZWN2ZnJhbWUtPmFkYXB0ZXIgPSBwYWRhcHRlcjsKLQkJcHJlY3ZmcmFtZSsrOwotCX0KLQotCXByZWN2cHJpdi0+ZnJlZV9yZWN2ZnJhbWVfY250ID0gaTsKLQlwcmVjdnByaXYtPnJ4X3BlbmRpbmdfY250ID0gMTsKLQotCXJlcyA9IHJ0bDg3MjNhdV9pbml0X3JlY3ZfcHJpdihwYWRhcHRlcik7Ci0KLQlzZXR1cF90aW1lcigmcHJlY3Zwcml2LT5zaWduYWxfc3RhdF90aW1lciwgcnR3X3NpZ25hbF9zdGF0X3RpbWVyX2hkbDIzYSwKLQkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKLQotCXByZWN2cHJpdi0+c2lnbmFsX3N0YXRfc2FtcGxpbmdfaW50ZXJ2YWwgPSAxMDAwOyAvKiBtcyAqLwotCi0JcnR3X3NldF9zaWduYWxfc3RhdF90aW1lcihwcmVjdnByaXYpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotdm9pZCBfcnR3X2ZyZWVfcmVjdl9wcml2MjNhKHN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdikKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gcHJlY3Zwcml2LT5hZGFwdGVyOwotCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCAqcHRtcDsKLQotCXJ0d19mcmVlX3VjX3N3ZGVjX3BlbmRpbmdfcXVldWUyM2EocGFkYXB0ZXIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHByZWN2ZnJhbWUsIHB0bXAsCi0JCQkJICZwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZS5xdWV1ZSwgbGlzdCkgewotCQlsaXN0X2RlbF9pbml0KCZwcmVjdmZyYW1lLT5saXN0KTsKLQkJa2ZyZWUocHJlY3ZmcmFtZSk7Ci0JfQotCi0JcnRsODcyM2F1X2ZyZWVfcmVjdl9wcml2KHBhZGFwdGVyKTsKLX0KLQotc3RydWN0IHJlY3ZfZnJhbWUgKnJ0d19hbGxvY19yZWN2ZnJhbWUyM2Eoc3RydWN0IHJ0d19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSkKLXsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcGZyYW1lOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXI7Ci0Jc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2OwotCi0Jc3Bpbl9sb2NrX2JoKCZwZnJlZV9yZWN2X3F1ZXVlLT5sb2NrKTsKLQotCXBmcmFtZSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmcGZyZWVfcmVjdl9xdWV1ZS0+cXVldWUsCi0JCQkJCSAgc3RydWN0IHJlY3ZfZnJhbWUsIGxpc3QpOwotCWlmIChwZnJhbWUpIHsKLQkJbGlzdF9kZWxfaW5pdCgmcGZyYW1lLT5saXN0KTsKLQkJcGFkYXB0ZXIgPSBwZnJhbWUtPmFkYXB0ZXI7Ci0JCWlmIChwYWRhcHRlcikgewotCQkJcHJlY3Zwcml2ID0gJnBhZGFwdGVyLT5yZWN2cHJpdjsKLQkJCWlmIChwZnJlZV9yZWN2X3F1ZXVlID09ICZwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZSkKLQkJCQlwcmVjdnByaXYtPmZyZWVfcmVjdmZyYW1lX2NudC0tOwotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfYmgoJnBmcmVlX3JlY3ZfcXVldWUtPmxvY2spOwotCi0JcmV0dXJuIHBmcmFtZTsKLX0KLQotaW50IHJ0d19mcmVlX3JlY3ZmcmFtZTIzYShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gcHJlY3ZmcmFtZS0+YWRhcHRlcjsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCXN0cnVjdCBydHdfcXVldWUgKnBmcmVlX3JlY3ZfcXVldWU7Ci0KLQlpZiAocHJlY3ZmcmFtZS0+cGt0KSB7Ci0JCWRldl9rZnJlZV9za2JfYW55KHByZWN2ZnJhbWUtPnBrdCk7LyogZnJlZSBza2IgYnkgZHJpdmVyICovCi0JCXByZWN2ZnJhbWUtPnBrdCA9IE5VTEw7Ci0JfQotCi0JcGZyZWVfcmVjdl9xdWV1ZSA9ICZwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZTsKLQlzcGluX2xvY2tfYmgoJnBmcmVlX3JlY3ZfcXVldWUtPmxvY2spOwotCi0JbGlzdF9kZWxfaW5pdCgmcHJlY3ZmcmFtZS0+bGlzdCk7Ci0KLQlsaXN0X2FkZF90YWlsKCZwcmVjdmZyYW1lLT5saXN0LCBnZXRfbGlzdF9oZWFkKHBmcmVlX3JlY3ZfcXVldWUpKTsKLQotCWlmIChwYWRhcHRlcikgewotCQlpZiAocGZyZWVfcmVjdl9xdWV1ZSA9PSAmcHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWUpCi0JCQlwcmVjdnByaXYtPmZyZWVfcmVjdmZyYW1lX2NudCsrOwotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZwZnJlZV9yZWN2X3F1ZXVlLT5sb2NrKTsKLQotCi0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLWludCBydHdfZW5xdWV1ZV9yZWN2ZnJhbWUyM2Eoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIHN0cnVjdCBydHdfcXVldWUgKnF1ZXVlKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBwcmVjdmZyYW1lLT5hZGFwdGVyOwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0KLQlzcGluX2xvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKLQotCWxpc3RfZGVsX2luaXQoJnByZWN2ZnJhbWUtPmxpc3QpOwotCi0JbGlzdF9hZGRfdGFpbCgmcHJlY3ZmcmFtZS0+bGlzdCwgZ2V0X2xpc3RfaGVhZChxdWV1ZSkpOwotCi0JaWYgKHBhZGFwdGVyKSB7Ci0JCWlmIChxdWV1ZSA9PSAmcHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWUpCi0JCQlwcmVjdnByaXYtPmZyZWVfcmVjdmZyYW1lX2NudCsrOwotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZS0+bG9jayk7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLS8qCi1jYWxsZXIgOiBkZWZyYWcgOyByZWN2ZnJhbWVfY2hrX2RlZnJhZzIzYSBpbiByZWN2X3RocmVhZCAgKHBhc3NpdmUpCi1wZnJhbWVxdWV1ZTogZGVmcmFnX3F1ZXVlIDogd2lsbCBiZSBhY2Nlc3NlZCBpbiByZWN2X3RocmVhZCAgKHBhc3NpdmUpCi0KLXVzaW5nIHNwaW5sb2NrIHRvIHByb3RlY3QKLQotKi8KLQotc3RhdGljIHZvaWQgcnR3X2ZyZWVfcmVjdmZyYW1lMjNhX3F1ZXVlKHN0cnVjdCBydHdfcXVldWUgKnBmcmFtZXF1ZXVlKQotewotCXN0cnVjdCByZWN2X2ZyYW1lICpoZHIsICpwdG1wOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCi0Jc3Bpbl9sb2NrKCZwZnJhbWVxdWV1ZS0+bG9jayk7Ci0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBmcmFtZXF1ZXVlKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaGRyLCBwdG1wLCBwaGVhZCwgbGlzdCkKLQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKGhkcik7Ci0Jc3Bpbl91bmxvY2soJnBmcmFtZXF1ZXVlLT5sb2NrKTsKLX0KLQotdTMyIHJ0d19mcmVlX3VjX3N3ZGVjX3BlbmRpbmdfcXVldWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCXUzMiBjbnQgPSAwOwotCXN0cnVjdCByZWN2X2ZyYW1lICpwZW5kaW5nX2ZyYW1lOwotCi0Jd2hpbGUgKChwZW5kaW5nX2ZyYW1lID0gcnR3X2FsbG9jX3JlY3ZmcmFtZTIzYSgmYWRhcHRlci0+cmVjdnByaXYudWNfc3dkZWNfcGVuZGluZ19xdWV1ZSkpKSB7Ci0JCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwZW5kaW5nX2ZyYW1lKTsKLQkJREJHXzg3MjNBKCIlczogZGVxdWV1ZSB1Y19zd2RlY19wZW5kaW5nX3F1ZXVlXG4iLCBfX2Z1bmNfXyk7Ci0JCWNudCsrOwotCX0KLQotCXJldHVybiBjbnQ7Ci19Ci0KLXN0cnVjdCByZWN2X2J1ZiAqcnR3X2RlcXVldWVfcmVjdmJ1ZjIzYSAoc3RydWN0IHJ0d19xdWV1ZSAqcXVldWUpCi17Ci0JdW5zaWduZWQgbG9uZyBpcnFMOwotCXN0cnVjdCByZWN2X2J1ZiAqcHJlY3ZidWY7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPmxvY2ssIGlycUwpOwotCi0JcHJlY3ZidWYgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJnF1ZXVlLT5xdWV1ZSwKLQkJCQkJICAgIHN0cnVjdCByZWN2X2J1ZiwgbGlzdCk7Ci0JaWYgKHByZWN2YnVmKQotCQlsaXN0X2RlbF9pbml0KCZwcmVjdmJ1Zi0+bGlzdCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+bG9jaywgaXJxTCk7Ci0KLQlyZXR1cm4gcHJlY3ZidWY7Ci19Ci0KLWludCByZWN2ZnJhbWVfY2hrbWljKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSk7Ci1pbnQgcmVjdmZyYW1lX2Noa21pYyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCSAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpIHsKLQotCWludAlpLCByZXMgPSBfU1VDQ0VTUzsKLQl1MzIJZGF0YWxlbjsKLQl1OAltaWNjb2RlWzhdOwotCXU4CWJtaWNfZXJyID0gZmFsc2UsIGJycHRfbWljZXJyb3IgPSB0cnVlOwotCXU4CSpwZnJhbWUsICpwYXlsb2FkLCAqcGZyYW1lbWljOwotCXU4CSptaWNrZXk7Ci0Jc3RydWN0CXN0YV9pbmZvICpzdGFpbmZvOwotCXN0cnVjdAlyeF9wa3RfYXR0cmliICpwcnhhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+YXR0cmliOwotCXN0cnVjdAlzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJmFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCi0Jc3RhaW5mbyA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmYWRhcHRlci0+c3RhcHJpdiwgJnByeGF0dHJpYi0+dGFbMF0pOwotCi0JaWYgKHByeGF0dHJpYi0+ZW5jcnlwdCA9PSBXTEFOX0NJUEhFUl9TVUlURV9US0lQKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJICJyZWN2ZnJhbWVfY2hrbWljOnByeGF0dHJpYi0+ZW5jcnlwdCA9PSBXTEFOX0NJUEhFUl9TVUlURV9US0lQXG4iKTsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkgInJlY3ZmcmFtZV9jaGttaWM6ZGEgPSAlcE1cbiIsIHByeGF0dHJpYi0+cmEpOwotCi0JCS8qIGNhbGN1bGF0ZSBtaWMgY29kZSAqLwotCQlpZiAoc3RhaW5mbyAhPSBOVUxMKSB7Ci0JCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocHJ4YXR0cmliLT5yYSkpIHsKLQkJCQltaWNrZXkgPSAmcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycHJ4bWlja2V5W3ByeGF0dHJpYi0+a2V5X2luZGV4XS5za2V5WzBdOwotCi0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAicmVjdmZyYW1lX2Noa21pYzogYmNtYyBrZXlcbiIpOwotCi0JCQkJaWYgKCFwc2VjdXJpdHlwcml2LT5iaW5zdGFsbEdycGtleSkgewotCQkJCQlyZXMgPSBfRkFJTDsKLQkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sCi0JCQkJCQkgX2Rydl9lcnJfLAotCQkJCQkJICJyZWN2ZnJhbWVfY2hrbWljOmRpZG4ndCBpbnN0YWxsIGdyb3VwIGtleSFcbiIpOwotCQkJCQlEQkdfODcyM0EoIlxuIHJlY3ZmcmFtZV9jaGttaWM6ZGlkbid0ICIKLQkJCQkJCSAgImluc3RhbGwgZ3JvdXAga2V5ISEhISEhXG4iKTsKLQkJCQkJZ290byBleGl0OwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbWlja2V5ID0gJnN0YWluZm8tPmRvdDExdGtpcHJ4bWlja2V5LnNrZXlbMF07Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkJICJyZWN2ZnJhbWVfY2hrbWljOiB1bmljYXN0IGtleVxuIik7Ci0JCQl9Ci0KLQkJCS8qIGljdl9sZW4gaW5jbHVkZWQgdGhlIG1pYyBjb2RlICovCi0JCQlkYXRhbGVuID0gcHJlY3ZmcmFtZS0+cGt0LT5sZW4tcHJ4YXR0cmliLT4KLQkJCQloZHJsZW4tcHJ4YXR0cmliLT5pdl9sZW4tcHJ4YXR0cmliLT5pY3ZfbGVuIC0gODsKLQkJCXBmcmFtZSA9IHByZWN2ZnJhbWUtPnBrdC0+ZGF0YTsKLQkJCXBheWxvYWQgPSBwZnJhbWUgKyBwcnhhdHRyaWItPmhkcmxlbiArCi0JCQkJcHJ4YXR0cmliLT5pdl9sZW47Ci0KLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAicHJ4YXR0cmliLT5pdl9sZW4gPSVkIHByeGF0dHJpYi0+aWN2X2xlbiA9JWRcbiIsCi0JCQkJIHByeGF0dHJpYi0+aXZfbGVuLCBwcnhhdHRyaWItPmljdl9sZW4pOwotCi0JCQkvKiBjYXJlIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgKi8KLQkJCXJ0d19zZWNjYWxjdGtpcG1pYzIzYShtaWNrZXksIHBmcmFtZSwgcGF5bG9hZCwKLQkJCQkJICAgZGF0YWxlbiwgJm1pY2NvZGVbMF0sCi0JCQkJCSAgICh1bnNpZ25lZCBjaGFyKXByeGF0dHJpYi0+cHJpb3JpdHkpOwotCi0JCQlwZnJhbWVtaWMgPSBwYXlsb2FkICsgZGF0YWxlbjsKLQotCQkJYm1pY19lcnIgPSBmYWxzZTsKLQotCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQkJCWlmIChtaWNjb2RlW2ldICE9ICoocGZyYW1lbWljICsgaSkpIHsKLQkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sCi0JCQkJCQkgX2Rydl9lcnJfLAotCQkJCQkJICJyZWN2ZnJhbWVfY2hrbWljOm1pY2NvZGVbJWRdKCUwMngpICE9ICoocGZyYW1lbWljKyVkKSglMDJ4KVxuIiwKLQkJCQkJCSBpLCBtaWNjb2RlW2ldLAotCQkJCQkJIGksICoocGZyYW1lbWljICsgaSkpOwotCQkJCQlibWljX2VyciA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoYm1pY19lcnIgPT0gdHJ1ZSkgewotCQkJCWludCBpOwotCi0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkJICIqKHBmcmFtZW1pYy04KS0qKHBmcmFtZW1pYy0xKSA9JSpwaENcbiIsCi0JCQkJCSA4LCBwZnJhbWVtaWMgLSA4KTsKLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCQkgIioocGZyYW1lbWljLTE2KS0qKHBmcmFtZW1pYy05KSA9JSpwaENcbiIsCi0JCQkJCSA4LCBwZnJhbWVtaWMgLSAxNik7Ci0KLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCQkgIj09PT09PSBkZW1wIHBhY2tldCAobGVuID0lZCkgPT09PT09XG4iLAotCQkJCQkgcHJlY3ZmcmFtZS0+cGt0LT5sZW4pOwotCQkJCWZvciAoaSA9IDA7IGkgPCBwcmVjdmZyYW1lLT5wa3QtPmxlbjsgaSA9IGkgKyA4KSB7Ci0JCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLAotCQkJCQkJIF9kcnZfZXJyXywgIiUqcGhDXG4iLAotCQkJCQkJIDgsIHByZWN2ZnJhbWUtPnBrdC0+ZGF0YSArIGkpOwotCQkJCX0KLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCQkgIj09PT09PSBkZW1wIHBhY2tldCBlbmQgW2xlbiA9JWRdPT09PT09XG4iLAotCQkJCQkgcHJlY3ZmcmFtZS0+cGt0LT5sZW4pOwotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAiaHJkbGVuID0lZFxuIiwgcHJ4YXR0cmliLT5oZHJsZW4pOwotCi0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkJICJyYSA9ICVwTSBwc2VjdXJpdHlwcml2LT5iaW5zdGFsbEdycGtleSA9JWRcbiIsCi0JCQkJCSBwcnhhdHRyaWItPnJhLAotCQkJCQkgcHNlY3VyaXR5cHJpdi0+Ymluc3RhbGxHcnBrZXkpOwotCi0JCQkJLyogIGRvdWJsZSBjaGVjayBrZXlfaW5kZXggZm9yIHNvbWUgdGltaW5nCi0JCQkJICAgIGlzc3VlLCBjYW5ub3QgY29tcGFyZSB3aXRoCi0JCQkJICAgIHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZCBhbHNvCi0JCQkJICAgIGNhdXNlIHRpbWluZyBpc3N1ZSAqLwotCQkJCWlmICgoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocHJ4YXR0cmliLT5yYSkpICYmCi0JCQkJICAgIChwcnhhdHRyaWItPmtleV9pbmRleCAhPQotCQkJCSAgICAgcG1sbWVpbmZvLT5rZXlfaW5kZXgpKQotCQkJCQlicnB0X21pY2Vycm9yID0gZmFsc2U7Ci0KLQkJCQlpZiAoKHByeGF0dHJpYi0+YmRlY3J5cHRlZCA9PSB0cnVlKSAmJgotCQkJCSAgICAoYnJwdF9taWNlcnJvciA9PSB0cnVlKSkgewotCQkJCQlydHdfaGFuZGxlX3RraXBfbWljX2VycjIzYShhZGFwdGVyLCAodTgpaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocHJ4YXR0cmliLT5yYSkpOwotCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCQkJICJtaWMgZXJyb3IgOnByeGF0dHJpYi0+YmRlY3J5cHRlZCA9JWRcbiIsCi0JCQkJCQkgcHJ4YXR0cmliLT5iZGVjcnlwdGVkKTsKLQkJCQkJREJHXzg3MjNBKCIgbWljIGVycm9yIDpwcnhhdHRyaWItPiIKLQkJCQkJCSAgImJkZWNyeXB0ZWQgPSVkXG4iLAotCQkJCQkJICBwcnhhdHRyaWItPmJkZWNyeXB0ZWQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLAotCQkJCQkJIF9kcnZfZXJyXywKLQkJCQkJCSAibWljIGVycm9yIDpwcnhhdHRyaWItPmJkZWNyeXB0ZWQgPSVkXG4iLAotCQkJCQkJIHByeGF0dHJpYi0+YmRlY3J5cHRlZCk7Ci0JCQkJCURCR184NzIzQSgiIG1pYyBlcnJvciA6cHJ4YXR0cmliLT4iCi0JCQkJCQkgICJiZGVjcnlwdGVkID0lZFxuIiwKLQkJCQkJCSAgcHJ4YXR0cmliLT5iZGVjcnlwdGVkKTsKLQkJCQl9Ci0KLQkJCQlyZXMgPSBfRkFJTDsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogbWljIGNoZWNrZWQgb2sgKi8KLQkJCQlpZiAoIXBzZWN1cml0eXByaXYtPmJjaGVja19ncnBrZXkgJiYKLQkJCQkgICAgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocHJ4YXR0cmliLT5yYSkpIHsKLQkJCQkJcHNlY3VyaXR5cHJpdi0+YmNoZWNrX2dycGtleSA9IDE7Ci0JCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLAotCQkJCQkJIF9kcnZfZXJyXywKLQkJCQkJCSAicHNlY3VyaXR5cHJpdi0+YmNoZWNrX2dycGtleSA9IHRydWVcbiIpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJyZWN2ZnJhbWVfY2hrbWljOiBydHdfZ2V0X3N0YWluZm8yM2EgPT1OVUxMISEhXG4iKTsKLQkJfQotCi0JCXNrYl90cmltKHByZWN2ZnJhbWUtPnBrdCwgcHJlY3ZmcmFtZS0+cGt0LT5sZW4gLSA4KTsKLQl9Ci0KLWV4aXQ6Ci0KLQotCi0JcmV0dXJuIHJlczsKLX0KLQotLyogZGVjcnlwdCBhbmQgc2V0IHRoZSBpdmxlbiwgaWN2bGVuIG9mIHRoZSByZWN2X2ZyYW1lICovCi1zdHJ1Y3QgcmVjdl9mcmFtZSAqZGVjcnlwdG9yKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdHJ1Y3QgcmVjdl9mcmFtZSAqZGVjcnlwdG9yKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcHJ4YXR0cmliID0gJnByZWN2X2ZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcmV0dXJuX3BhY2tldCA9IHByZWN2X2ZyYW1lOwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkgInByeHN0YXQtPmRlY3J5cHRlZCA9JXggcHJ4YXR0cmliLT5lbmNyeXB0ID0gMHglMDN4XG4iLAotCQkgcHJ4YXR0cmliLT5iZGVjcnlwdGVkLCBwcnhhdHRyaWItPmVuY3J5cHQpOwotCi0JaWYgKHByeGF0dHJpYi0+ZW5jcnlwdCA+IDApIHsKLQkJdTggKml2ID0gcHJlY3ZfZnJhbWUtPnBrdC0+ZGF0YSArIHByeGF0dHJpYi0+aGRybGVuOwotCi0JCXByeGF0dHJpYi0+a2V5X2luZGV4ID0gKCgoaXZbM10pID4+IDYpICYgMHgzKTsKLQotCQlpZiAocHJ4YXR0cmliLT5rZXlfaW5kZXggPiBXRVBfS0VZUykgewotCQkJREJHXzg3MjNBKCJwcnhhdHRyaWItPmtleV9pbmRleCglZCkgPiBXRVBfS0VZU1xuIiwKLQkJCQkgIHByeGF0dHJpYi0+a2V5X2luZGV4KTsKLQotCQkJc3dpdGNoIChwcnhhdHRyaWItPmVuY3J5cHQpIHsKLQkJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6Ci0JCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJCQlwcnhhdHRyaWItPmtleV9pbmRleCA9Ci0JCQkJCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUtleUluZGV4OwotCQkJCWJyZWFrOwotCQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQkJZGVmYXVsdDoKLQkJCQlwcnhhdHRyaWItPmtleV9pbmRleCA9Ci0JCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCWlmICgocHJ4YXR0cmliLT5lbmNyeXB0ID4gMCkgJiYgKChwcnhhdHRyaWItPmJkZWNyeXB0ZWQgPT0gMCkpKSB7Ci0JCXBzZWN1cml0eXByaXYtPmh3X2RlY3J5cHRlZCA9IDA7Ci0JCXN3aXRjaCAocHJ4YXR0cmliLT5lbmNyeXB0KSB7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQkJcnR3X3dlcF9kZWNyeXB0MjNhKHBhZGFwdGVyLCBwcmVjdl9mcmFtZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQkJcmVzID0gcnR3X3RraXBfZGVjcnlwdDIzYShwYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJCXJlcyA9IHJ0d19hZXNfZGVjcnlwdDIzYShwYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSBpZiAocHJ4YXR0cmliLT5iZGVjcnlwdGVkID09IDEgJiYgcHJ4YXR0cmliLT5lbmNyeXB0ID4gMCAmJgotCQkgICAocHNlY3VyaXR5cHJpdi0+YnVzZXRraXBrZXkgPT0gMSB8fAotCQkgICAgcHJ4YXR0cmliLT5lbmNyeXB0ICE9IFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVApKSB7Ci0JCQlwc2VjdXJpdHlwcml2LT5od19kZWNyeXB0ZWQgPSAxOwotCX0KLQotCWlmIChyZXMgPT0gX0ZBSUwpIHsKLQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHJldHVybl9wYWNrZXQpOwotCQlyZXR1cm5fcGFja2V0ID0gTlVMTDsKLQl9Ci0KLQotCi0JcmV0dXJuIHJldHVybl9wYWNrZXQ7Ci19Ci0KLS8qIHNldCB0aGUgc2VjdXJpdHkgaW5mb3JtYXRpb24gaW4gdGhlIHJlY3ZfZnJhbWUgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVjdl9mcmFtZSAqcG9ydGN0cmwoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQl1OCAqcHN0YV9hZGRyLCAqcHRyOwotCXVpbnQgYXV0aF9hbGc7Ci0Jc3RydWN0IHJlY3ZfZnJhbWUgKnBmaGRyOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2IDsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJ0bmZyYW1lOwotCXUxNiBldGhlcl90eXBlOwotCXUxNiBlYXBvbF90eXBlID0gRVRIX1BfUEFFOy8qIGZvciBGdW5pYSBCRCdzIFdQQSBpc3N1ZSAqLwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliOwotCi0JcHN0YXByaXYgPSAmYWRhcHRlci0+c3RhcHJpdjsKLQotCWF1dGhfYWxnID0gYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExQXV0aEFsZ3J0aG07Ci0KLQlwZmhkciA9IHByZWN2X2ZyYW1lOwotCXBhdHRyaWIgPSAmcGZoZHItPmF0dHJpYjsKLQlwc3RhX2FkZHIgPSBwYXR0cmliLT50YTsKLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwc3RhX2FkZHIpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCSAiIyMjIyMjIyNwb3J0Y3RybDphZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFBdXRoQWxncnRobSA9JWRcbiIsCi0JCSBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFBdXRoQWxncnRobSk7Ci0KLQlwcnRuZnJhbWUgPSBwcmVjdl9mcmFtZTsKLQotCWlmIChhdXRoX2FsZyA9PSBkb3QxMUF1dGhBbGdydGhtXzgwMjFYKSB7Ci0JCS8qIGdldCBldGhlcl90eXBlICovCi0JCXB0ciA9IHBmaGRyLT5wa3QtPmRhdGEgKyBwZmhkci0+YXR0cmliLmhkcmxlbjsKLQotCQlldGhlcl90eXBlID0gKHB0cls2XSA8PCA4KSB8IHB0cls3XTsKLQotCQlpZiAocHN0YSAmJiBwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCkgewotCQkJLyogYmxvY2tlZCAqLwotCQkJLyogb25seSBhY2NlcHQgRUFQT0wgZnJhbWUgKi8KLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiIyMjIyMjIyNwb3J0Y3RybDpwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9PTFcbiIpOwotCi0JCQlpZiAoZXRoZXJfdHlwZSAhPSBlYXBvbF90eXBlKSB7Ci0JCQkJLyogZnJlZSB0aGlzIGZyYW1lICovCi0JCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZWN2X2ZyYW1lKTsKLQkJCQlwcnRuZnJhbWUgPSBOVUxMOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIHBydG5mcmFtZTsKLX0KLQotaW50IHJlY3ZfZGVjYWNoZShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsIHU4IGJyZXRyeSwKLQkJIHN0cnVjdCBzdGFpbmZvX3J4Y2FjaGUgKnByeGNhY2hlKTsKLWludCByZWN2X2RlY2FjaGUoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLCB1OCBicmV0cnksCi0JCSBzdHJ1Y3Qgc3RhaW5mb19yeGNhY2hlICpwcnhjYWNoZSkKLXsKLQlpbnQgdGlkID0gcHJlY3ZfZnJhbWUtPmF0dHJpYi5wcmlvcml0eTsKLQotCXUxNiBzZXFfY3RybCA9ICgocHJlY3ZfZnJhbWUtPmF0dHJpYi5zZXFfbnVtICYgMHhmZmZmKSA8PCA0KSB8Ci0JCShwcmVjdl9mcmFtZS0+YXR0cmliLmZyYWdfbnVtICYgMHhmKTsKLQotCi0KLQlpZiAodGlkID4gMTUpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfbm90aWNlXywKLQkJCSAicmVjdl9kZWNhY2hlLCAodGlkPjE1KSEgc2VxX2N0cmwgPSAweCV4LCB0aWQgPSAweCV4XG4iLAotCQkJIHNlcV9jdHJsLCB0aWQpOwotCi0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlpZiAoMSkgeyAvKiBpZiAoYnJldHJ5KSAqLwotCQlpZiAoc2VxX2N0cmwgPT0gcHJ4Y2FjaGUtPnRpZF9yeHNlcVt0aWRdKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9ub3RpY2VfLAotCQkJCSAicmVjdl9kZWNhY2hlLCBzZXFfY3RybCA9IDB4JXgsIHRpZCA9IDB4JXgsIHRpZF9yeHNlcSA9IDB4JXhcbiIsCi0JCQkJIHNlcV9jdHJsLCB0aWQsIHByeGNhY2hlLT50aWRfcnhzZXFbdGlkXSk7Ci0KLQkJCXJldHVybiBfRkFJTDsKLQkJfQotCX0KLQotCXByeGNhY2hlLT50aWRfcnhzZXFbdGlkXSA9IHNlcV9jdHJsOwotCi0KLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotdm9pZCBwcm9jZXNzMjNhX3B3cmJpdF9kYXRhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXZvaWQgcHJvY2VzczIzYV9wd3JiaXRfZGF0YShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQl1bnNpZ25lZCBjaGFyIHB3cmJpdDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcGF0dHJpYi0+c3JjKTsKLQotCWlmIChwc3RhKSB7Ci0JCXB3cmJpdCA9IGllZWU4MDIxMV9oYXNfcG0oaGRyLT5mcmFtZV9jb250cm9sKTsKLQotCQlpZiAocHdyYml0KSB7Ci0JCQlpZiAoIShwc3RhLT5zdGF0ZSAmIFdJRklfU0xFRVBfU1RBVEUpKQotCQkJCXN0b3Bfc3RhX3htaXQyM2EocGFkYXB0ZXIsIHBzdGEpOwotCQl9IGVsc2UgewotCQkJaWYgKHBzdGEtPnN0YXRlICYgV0lGSV9TTEVFUF9TVEFURSkKLQkJCQl3YWtldXBfc3RhX3RvX3htaXQyM2EocGFkYXB0ZXIsIHBzdGEpOwotCQl9Ci0JfQotCi0jZW5kaWYKLX0KLQotdm9pZCBwcm9jZXNzX3dtbXBzX2RhdGEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci12b2lkIHByb2Nlc3Nfd21tcHNfZGF0YShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0KLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwYXR0cmliLT5zcmMpOwotCi0JaWYgKCFwc3RhKQotCQlyZXR1cm47Ci0KLQotCWlmICghcHN0YS0+cW9zX29wdGlvbikKLQkJcmV0dXJuOwotCi0JaWYgKCEocHN0YS0+cW9zX2luZm8gJiAweGYpKQotCQlyZXR1cm47Ci0KLQlpZiAocHN0YS0+c3RhdGUgJiBXSUZJX1NMRUVQX1NUQVRFKSB7Ci0JCXU4IHdtbXBzX2FjID0gMDsKLQotCQlzd2l0Y2ggKHBhdHRyaWItPnByaW9yaXR5KSB7Ci0JCWNhc2UgMToKLQkJY2FzZSAyOgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF9iayAmIEJJVCgxKTsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCWNhc2UgNToKLQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2RfdmkgJiBCSVQoMSk7Ci0JCQlicmVhazsKLQkJY2FzZSA2OgotCQljYXNlIDc6Ci0JCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX3ZvICYgQklUKDEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMDoKLQkJY2FzZSAzOgotCQlkZWZhdWx0OgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF9iZSAmIEJJVCgxKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHdtbXBzX2FjKSB7Ci0JCQlpZiAocHN0YS0+c2xlZXBxX2FjX2xlbiA+IDApIHsKLQkJCQkvKiBwcm9jZXNzIHJlY2VpdmVkIHRyaWdnZXJlZCBmcmFtZSAqLwotCQkJCXhtaXRfZGVsaXZlcnlfZW5hYmxlZF9mcmFtZXMyM2EocGFkYXB0ZXIsIHBzdGEpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBpc3N1ZSBvbmUgcW9zIG51bGwgZnJhbWUgd2l0aCBNb3JlIGRhdGEgYml0ID0gMCBhbmQgdGhlIEVPU1AgYml0IHNldCAoPSAxKSAqLwotCQkJCWlzc3VlX3Fvc19udWxsZGF0YTIzYShwYWRhcHRlciwgcHN0YS0+aHdhZGRyLAotCQkJCQkJICAgKHUxNilwYXR0cmliLT5wcmlvcml0eSwKLQkJCQkJCSAgIDAsIDApOwotCQkJfQotCQl9Ci0JfQotCi0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgY291bnRfcnhfc3RhdHMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lLCBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKLXsKLQlpbnQgc3o7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKLQlzdHJ1Y3Qgc3RhaW5mb19zdGF0cyAqcHN0YXRzID0gTlVMTDsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICYgcHJmcmFtZS0+YXR0cmliOwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0KLQlzeiA9IHByZnJhbWUtPnBrdC0+bGVuOwotCXByZWN2cHJpdi0+cnhfYnl0ZXMgKz0gc3o7Ci0KLQlwYWRhcHRlci0+bWxtZXByaXYuTGlua0RldGVjdEluZm8uTnVtUnhPa0luUGVyaW9kKys7Ci0KLQlpZiAoKCFpc19icm9hZGNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5kc3QpKSAmJgotCSAgICAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPmRzdCkpKQotCQlwYWRhcHRlci0+bWxtZXByaXYuTGlua0RldGVjdEluZm8uTnVtUnhVbmljYXN0T2tJblBlcmlvZCsrOwotCi0JaWYgKHN0YSkKLQkJcHN0YSA9IHN0YTsKLQllbHNlCi0JCXBzdGEgPSBwcmZyYW1lLT5wc3RhOwotCi0JaWYgKHBzdGEpIHsKLQkJcHN0YXRzID0gJnBzdGEtPnN0YV9zdGF0czsKLQotCQlwc3RhdHMtPnJ4X2RhdGFfcGt0cysrOwotCQlwc3RhdHMtPnJ4X2J5dGVzICs9IHN6OwotCX0KLX0KLQotc3RhdGljIGludCBzdGEyc3RhX2RhdGFfZnJhbWUoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLAotCQkJICAgICAgc3RydWN0IHN0YV9pbmZvKipwc3RhKQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwotCWludCByZXQgPSBfU1VDQ0VTUzsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICYgcHJlY3ZfZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJmFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXU4ICpteWJzc2lkICA9IGdldF9ic3NpZChwbWxtZXByaXYpOwotCXU4ICpteWh3YWRkciA9IG15aWQoJmFkYXB0ZXItPmVlcHJvbXByaXYpOwotCXU4ICpzdGFfYWRkciA9IE5VTEw7Ci0JaW50IGJtY2FzdCA9IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPmRzdCk7Ci0KLQotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSB8fAotCSAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7Ci0KLQkJLyogIGZpbHRlciBwYWNrZXRzIHRoYXQgU0EgaXMgbXlzZWxmIG9yIG11bHRpY2FzdCBvciBicm9hZGNhc3QgKi8KLQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobXlod2FkZHIsIHBhdHRyaWItPnNyYykpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJTQSA9PSBteXNlbGZcbiIpOwotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobXlod2FkZHIsIHBhdHRyaWItPmRzdCkgJiYgIWJtY2FzdCkgewotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlpZiAoZXRoZXJfYWRkcl9lcXVhbChwYXR0cmliLT5ic3NpZCwgIlx4MFx4MFx4MFx4MFx4MFx4MCIpIHx8Ci0JCSAgICBldGhlcl9hZGRyX2VxdWFsKG15YnNzaWQsICJceDBceDBceDBceDBceDBceDAiKSB8fAotCQkgICAgIWV0aGVyX2FkZHJfZXF1YWwocGF0dHJpYi0+YnNzaWQsIG15YnNzaWQpKSB7Ci0JCQlyZXQgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCXN0YV9hZGRyID0gcGF0dHJpYi0+c3JjOwotCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpIHsKLQkJLyogIEZvciBTdGF0aW9uIG1vZGUsIHNhIGFuZCBic3NpZCBzaG91bGQgYWx3YXlzIGJlIEJTU0lELAotCQkgICAgYW5kIERBIGlzIG15IG1hYy1hZGRyZXNzICovCi0JCWlmICghZXRoZXJfYWRkcl9lcXVhbChwYXR0cmliLT5ic3NpZCwgcGF0dHJpYi0+c3JjKSkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgImJzc2lkICE9IFRBIHVuZGVyIFNUQVRJT05fTU9ERTsgZHJvcCBwa3RcbiIpOwotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlzdGFfYWRkciA9IHBhdHRyaWItPmJzc2lkOwotCi0JfSBlbHNlIGlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLQkJaWYgKGJtY2FzdCkgewotCQkJLyogIEZvciBBUCBtb2RlLCBpZiBEQSA9PSBNQ0FTVCwgdGhlbiBCU1NJRCBzaG91bGQgYmUgYWxzbyBNQ0FTVCAqLwotCQkJaWYgKCFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5ic3NpZCkpIHsKLQkJCQlyZXQgPSBfRkFJTDsKLQkJCQlnb3RvIGV4aXQ7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8qICBub3QgbWMtZnJhbWUgKi8KLQkJCS8qICBGb3IgQVAgbW9kZSwgaWYgREEgaXMgbm9uLU1DQVNULCB0aGVuIGl0IG11c3QKLQkJCSAgICBiZSBCU1NJRCwgYW5kIGJzc2lkID09IEJTU0lEICovCi0JCQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwocGF0dHJpYi0+YnNzaWQsIHBhdHRyaWItPmRzdCkpIHsKLQkJCQlyZXQgPSBfRkFJTDsKLQkJCQlnb3RvIGV4aXQ7Ci0JCQl9Ci0KLQkJCXN0YV9hZGRyID0gcGF0dHJpYi0+c3JjOwotCQl9Ci0JfSBlbHNlIGlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9NUF9TVEFURSkpIHsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPmRzdCwgaGRyLT5hZGRyMSk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5zcmMsIGhkci0+YWRkcjIpOwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+YnNzaWQsIGhkci0+YWRkcjMpOwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+cmEsIHBhdHRyaWItPmRzdCk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT50YSwgcGF0dHJpYi0+c3JjKTsKLQotCQlzdGFfYWRkciA9IG15YnNzaWQ7Ci0JfSBlbHNlIHsKLQkJcmV0ICA9IF9GQUlMOwotCX0KLQotCWlmIChibWNhc3QpCi0JCSpwc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EoYWRhcHRlcik7Ci0JZWxzZQotCQkqcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgc3RhX2FkZHIpOyAvKiAgZ2V0IGFwX2luZm8gKi8KLQotCWlmICgqcHN0YSA9PSBOVUxMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgImNhbid0IGdldCBwc3RhIHVuZGVyIHN0YTJzdGFfZGF0YV9mcmFtZSA7IGRyb3AgcGt0XG4iKTsKLQkJcmV0ID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLWV4aXQ6Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYXAyc3RhX2RhdGFfZnJhbWUoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsCi0JCSAgICAgIHN0cnVjdCBzdGFfaW5mbyAqKnBzdGEpOwotaW50IGFwMnN0YV9kYXRhX2ZyYW1lKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLAotCQkgICAgICBzdHJ1Y3Qgc3RhX2luZm8gKipwc3RhKQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJiBwcmVjdl9mcmFtZS0+YXR0cmliOwotCWludCByZXQgPSBfU1VDQ0VTUzsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJmFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXU4ICpteWJzc2lkICA9IGdldF9ic3NpZChwbWxtZXByaXYpOwotCXU4ICpteWh3YWRkciA9IG15aWQoJmFkYXB0ZXItPmVlcHJvbXByaXYpOwotCWludCBibWNhc3QgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5kc3QpOwotCi0KLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSAmJgotCSAgICAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpIHx8Ci0JICAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpKSkgewotCi0JCS8qIGZpbHRlciBwYWNrZXRzIHRoYXQgU0EgaXMgbXlzZWxmIG9yIG11bHRpY2FzdCBvciBicm9hZGNhc3QgKi8KLQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobXlod2FkZHIsIHBhdHRyaWItPnNyYykpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJTQSA9PSBteXNlbGZcbiIpOwotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQkvKiAgZGEgc2hvdWxkIGJlIGZvciBtZSAqLwotCQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobXlod2FkZHIsIHBhdHRyaWItPmRzdCkgJiYgIWJtY2FzdCkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkJICJhcDJzdGFfZGF0YV9mcmFtZTogIGNvbXBhcmUgREEgZmFpbGVkOyBEQT0lcE1cbiIsCi0JCQkJIHBhdHRyaWItPmRzdCk7Ci0JCQlyZXQgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCS8qICBjaGVjayBCU1NJRCAqLwotCQlpZiAoZXRoZXJfYWRkcl9lcXVhbChwYXR0cmliLT5ic3NpZCwgIlx4MFx4MFx4MFx4MFx4MFx4MCIpIHx8Ci0JCSAgICBldGhlcl9hZGRyX2VxdWFsKG15YnNzaWQsICJceDBceDBceDBceDBceDBceDAiKSB8fAotCQkgICAgIWV0aGVyX2FkZHJfZXF1YWwocGF0dHJpYi0+YnNzaWQsIG15YnNzaWQpKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCQkgImFwMnN0YV9kYXRhX2ZyYW1lOiAgY29tcGFyZSBCU1NJRCBmYWlsZWQ7IEJTU0lEPSVwTVxuIiwKLQkJCQkgcGF0dHJpYi0+YnNzaWQpOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkJICJteWJzc2lkPSVwTVxuIiwgbXlic3NpZCk7Ci0KLQkJCWlmICghYm1jYXN0KSB7Ci0JCQkJREJHXzg3MjNBKCJpc3N1ZV9kZWF1dGgyM2EgdG8gdGhlIG5vbmFzc29jaWF0ZWQgYXA9JXBNIGZvciB0aGUgcmVhc29uKDcpXG4iLAotCQkJCQkgIHBhdHRyaWItPmJzc2lkKTsKLQkJCQlpc3N1ZV9kZWF1dGgyM2EoYWRhcHRlciwgcGF0dHJpYi0+YnNzaWQsCi0JCQkJCSAgICAgV0xBTl9SRUFTT05fQ0xBU1MzX0ZSQU1FX0ZST01fTk9OQVNTT0NfU1RBKTsKLQkJCX0KLQotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlpZiAoYm1jYXN0KQotCQkJKnBzdGEgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShhZGFwdGVyKTsKLQkJZWxzZQotCQkJLyogIGdldCBhcF9pbmZvICovCi0JCQkqcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcGF0dHJpYi0+YnNzaWQpOwotCi0JCWlmICgqcHN0YSA9PSBOVUxMKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAiYXAyc3RhOiBjYW4ndCBnZXQgcHN0YSB1bmRlciBTVEFUSU9OX01PREU7IGRyb3AgcGt0XG4iKTsKLQkJCXJldCA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJaWYgKGllZWU4MDIxMV9pc19udWxsZnVuYyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCQkvKiBObyBkYXRhLCB3aWxsIG5vdCBpbmRpY2F0ZSB0byB1cHBlciBsYXllciwKLQkJCSAgIHRlbXBvcmlseSBjb3VudCBpdCBoZXJlICovCi0JCQljb3VudF9yeF9zdGF0cyhhZGFwdGVyLCBwcmVjdl9mcmFtZSwgKnBzdGEpOwotCQkJcmV0ID0gUlRXX1JYX0hBTkRMRUQ7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfTVBfU1RBVEUpICYmCi0JCSAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+ZHN0LCBoZHItPmFkZHIxKTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnNyYywgaGRyLT5hZGRyMik7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5ic3NpZCwgaGRyLT5hZGRyMyk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5yYSwgcGF0dHJpYi0+ZHN0KTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnRhLCBwYXR0cmliLT5zcmMpOwotCi0JCS8qICAqLwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+YnNzaWQsICBteWJzc2lkKTsKLQotCQkvKiAgZ2V0IHN0YV9pbmZvICovCi0JCSpwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwYXR0cmliLT5ic3NpZCk7Ci0JCWlmICgqcHN0YSA9PSBOVUxMKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAiY2FuJ3QgZ2V0IHBzdGEgdW5kZXIgTVBfTU9ERSA7IGRyb3AgcGt0XG4iKTsKLQkJCXJldCA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0JfSBlbHNlIGlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLQkJLyogU3BlY2lhbCBjYXNlICovCi0JCXJldCA9IFJUV19SWF9IQU5ETEVEOwotCQlnb3RvIGV4aXQ7Ci0JfSBlbHNlIHsKLQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobXlod2FkZHIsIHBhdHRyaWItPmRzdCkgJiYgIWJtY2FzdCkgewotCQkJKnBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBhdHRyaWItPmJzc2lkKTsKLQkJCWlmICgqcHN0YSA9PSBOVUxMKSB7Ci0JCQkJREJHXzg3MjNBKCJpc3N1ZV9kZWF1dGgyM2EgdG8gdGhlIGFwPSVwTSBmb3IgdGhlIHJlYXNvbig3KVxuIiwKLQkJCQkJICBwYXR0cmliLT5ic3NpZCk7Ci0KLQkJCQlpc3N1ZV9kZWF1dGgyM2EoYWRhcHRlciwgcGF0dHJpYi0+YnNzaWQsCi0JCQkJCSAgICAgV0xBTl9SRUFTT05fQ0xBU1MzX0ZSQU1FX0ZST01fTk9OQVNTT0NfU1RBKTsKLQkJCX0KLQkJfQotCi0JCXJldCA9IF9GQUlMOwotCX0KLQotZXhpdDoKLQotCi0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgc3RhMmFwX2RhdGFfZnJhbWUoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsCi0JCSAgICAgIHN0cnVjdCBzdGFfaW5mbyAqKnBzdGEpOwotaW50IHN0YTJhcF9kYXRhX2ZyYW1lKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLAotCQkgICAgICBzdHJ1Y3Qgc3RhX2luZm8gKipwc3RhKQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJiBwcmVjdl9mcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0JdW5zaWduZWQgY2hhciAqbXlic3NpZCA9IGdldF9ic3NpZChwbWxtZXByaXYpOwotCWludCByZXQgPSBfU1VDQ0VTUzsKLQotCi0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSB7Ci0JCS8qIEZvciBBUCBtb2RlLCBSQSA9IEJTU0lELCBUWCA9IFNUQShTUkNfQUREUiksIEEzID0gRFNUX0FERFIgKi8KLQkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKHBhdHRyaWItPmJzc2lkLCBteWJzc2lkKSkgewotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQkqcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcGF0dHJpYi0+c3JjKTsKLQkJaWYgKCpwc3RhID09IE5VTEwpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJjYW4ndCBnZXQgcHN0YSB1bmRlciBBUF9NT0RFOyBkcm9wIHBrdFxuIik7Ci0JCQlEQkdfODcyM0EoImlzc3VlX2RlYXV0aDIzYSB0byBzdGE9JXBNIGZvciB0aGUgcmVhc29uKDcpXG4iLAotCQkJCSAgcGF0dHJpYi0+c3JjKTsKLQotCQkJaXNzdWVfZGVhdXRoMjNhKGFkYXB0ZXIsIHBhdHRyaWItPnNyYywKLQkJCQkgICAgIFdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSk7Ci0KLQkJCXJldCA9IFJUV19SWF9IQU5ETEVEOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJcHJvY2VzczIzYV9wd3JiaXRfZGF0YShhZGFwdGVyLCBwcmVjdl9mcmFtZSk7Ci0KLQkJLyogV2Ugb25seSBnZXQgaGVyZSBpZiBpdCdzIGEgZGF0YSBmcmFtZSwgc28gbm8gbmVlZCB0bwotCQkgKiBjb25maXJtIGRhdGEgZnJhbWUgdHlwZSBmaXJzdCAqLwotCQlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkpCi0JCQlwcm9jZXNzX3dtbXBzX2RhdGEoYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCi0JCWlmIChpZWVlODAyMTFfaXNfbnVsbGZ1bmMoaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQkJLyogTm8gZGF0YSwgd2lsbCBub3QgaW5kaWNhdGUgdG8gdXBwZXIgbGF5ZXIsCi0JCQkgICB0ZW1wb3JpbHkgY291bnQgaXQgaGVyZSAqLwotCQkJY291bnRfcnhfc3RhdHMoYWRhcHRlciwgcHJlY3ZfZnJhbWUsICpwc3RhKTsKLQkJCXJldCA9IFJUV19SWF9IQU5ETEVEOwotCQkJZ290byBleGl0OwotCQl9Ci0JfSBlbHNlIHsKLQkJdTggKm15aHdhZGRyID0gbXlpZCgmYWRhcHRlci0+ZWVwcm9tcHJpdik7Ci0KLQkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKHBhdHRyaWItPnJhLCBteWh3YWRkcikpIHsKLQkJCXJldCA9IFJUV19SWF9IQU5ETEVEOwotCQkJZ290byBleGl0OwotCQl9Ci0JCURCR184NzIzQSgiaXNzdWVfZGVhdXRoMjNhIHRvIHN0YT0lcE0gZm9yIHRoZSByZWFzb24oNylcbiIsCi0JCQkgIHBhdHRyaWItPnNyYyk7Ci0JCWlzc3VlX2RlYXV0aDIzYShhZGFwdGVyLCBwYXR0cmliLT5zcmMsCi0JCQkgICAgIFdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSk7Ci0JCXJldCA9IFJUV19SWF9IQU5ETEVEOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi1leGl0OgotCi0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmFsaWRhdGVfcmVjdl9jdHJsX2ZyYW1lKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7Ci0KLQlpZiAoIWllZWU4MDIxMV9pc19jdGwoaGRyLT5mcmFtZV9jb250cm9sKSkKLQkJcmV0dXJuIF9GQUlMOwotCi0JLyogcmVjZWl2ZSB0aGUgZnJhbWVzIHRoYXQgcmEoYTEpIGlzIG15IGFkZHJlc3MgKi8KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwoaGRyLT5hZGRyMSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpKSkKLQkJcmV0dXJuIF9GQUlMOwotCi0JLyogb25seSBoYW5kbGUgcHMtcG9sbCAqLwotCWlmIChpZWVlODAyMTFfaXNfcHNwb2xsKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJc3RydWN0IGllZWU4MDIxMV9wc3BvbGwgKnBzcCA9IChzdHJ1Y3QgaWVlZTgwMjExX3BzcG9sbCAqKWhkcjsKLQkJdTE2IGFpZDsKLQkJdTggd21tcHNfYWMgPSAwOwotCQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwotCi0JCWFpZCA9IGxlMTZfdG9fY3B1KHBzcC0+YWlkKSAmIDB4M2ZmZjsKLQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgaGRyLT5hZGRyMik7Ci0KLQkJaWYgKCFwc3RhIHx8IHBzdGEtPmFpZCAhPSBhaWQpCi0JCQlyZXR1cm4gX0ZBSUw7Ci0KLQkJLyogZm9yIHJ4IHBrdCBzdGF0aXN0aWNzICovCi0JCXBzdGEtPnN0YV9zdGF0cy5yeF9jdHJsX3BrdHMrKzsKLQotCQlzd2l0Y2ggKHBhdHRyaWItPnByaW9yaXR5KSB7Ci0JCWNhc2UgMToKLQkJY2FzZSAyOgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF9iayAmIEJJVCgwKTsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCWNhc2UgNToKLQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2RfdmkgJiBCSVQoMCk7Ci0JCQlicmVhazsKLQkJY2FzZSA2OgotCQljYXNlIDc6Ci0JCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX3ZvICYgQklUKDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMDoKLQkJY2FzZSAzOgotCQlkZWZhdWx0OgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF9iZSAmIEJJVCgwKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHdtbXBzX2FjKQotCQkJcmV0dXJuIF9GQUlMOwotCi0JCWlmIChwc3RhLT5zdGF0ZSAmIFdJRklfU1RBX0FMSVZFX0NIS19TVEFURSkgewotCQkJREJHXzg3MjNBKCIlcyBhbGl2ZSBjaGVjay1yeCBwcy1wb2xsXG4iLCBfX2Z1bmNfXyk7Ci0JCQlwc3RhLT5leHBpcmVfdG8gPSBwc3RhcHJpdi0+ZXhwaXJlX3RvOwotCQkJcHN0YS0+c3RhdGUgXj0gV0lGSV9TVEFfQUxJVkVfQ0hLX1NUQVRFOwotCQl9Ci0KLQkJaWYgKChwc3RhLT5zdGF0ZSAmIFdJRklfU0xFRVBfU1RBVEUpICYmCi0JCSAgICAocHN0YXByaXYtPnN0YV9kel9iaXRtYXAgJiBDSEtCSVQocHN0YS0+YWlkKSkpIHsKLQkJCXN0cnVjdCBsaXN0X2hlYWQgKnhtaXRmcmFtZV9waGVhZDsKLQkJCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lOwotCQkJc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCQkJc3Bpbl9sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCi0JCQl4bWl0ZnJhbWVfcGhlYWQgPSBnZXRfbGlzdF9oZWFkKCZwc3RhLT5zbGVlcF9xKTsKLQkJCXB4bWl0ZnJhbWUgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoeG1pdGZyYW1lX3BoZWFkLAotCQkJCQkJCSAgICAgIHN0cnVjdCB4bWl0X2ZyYW1lLAotCQkJCQkJCSAgICAgIGxpc3QpOwotCQkJaWYgKHB4bWl0ZnJhbWUpIHsKLQkJCQlsaXN0X2RlbF9pbml0KCZweG1pdGZyYW1lLT5saXN0KTsKLQotCQkJCXBzdGEtPnNsZWVwcV9sZW4tLTsKLQotCQkJCWlmIChwc3RhLT5zbGVlcHFfbGVuPjApCi0JCQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5tZGF0YSA9IDE7Ci0JCQkJZWxzZQotCQkJCQlweG1pdGZyYW1lLT5hdHRyaWIubWRhdGEgPSAwOwotCi0JCQkJcHhtaXRmcmFtZS0+YXR0cmliLnRyaWdnZXJlZCA9IDE7Ci0KLQkJCQlydGw4NzIzYXVfaGFsX3htaXRmcmFtZV9lbnF1ZXVlKHBhZGFwdGVyLAotCQkJCQkJCQlweG1pdGZyYW1lKTsKLQotCQkJCWlmIChwc3RhLT5zbGVlcHFfbGVuID09IDApIHsKLQkJCQkJcHN0YXByaXYtPnRpbV9iaXRtYXAgJj0gfkNIS0JJVChwc3RhLT5haWQpOwotCQkJCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCBXTEFOX0VJRF9USU0sCi0JCQkJCQkJIE5VTEwsIGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQotCQkJfSBlbHNlIHsKLQkJCQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQotCQkJCWlmIChwc3RhcHJpdi0+dGltX2JpdG1hcCAmIENIS0JJVChwc3RhLT5haWQpKSB7Ci0JCQkJCWlmIChwc3RhLT5zbGVlcHFfbGVuID09IDApIHsKLQkJCQkJCURCR184NzIzQSgibm8gYnVmZmVyZWQgcGFja2V0cyAiCi0JCQkJCQkJICAidG8geG1pdFxuIik7Ci0KLQkJCQkJCS8qIGlzc3VlIG51bGxkYXRhIHdpdGggTW9yZSBkYXRhIGJpdCA9IDAgdG8gaW5kaWNhdGUgd2UgaGF2ZSBubyBidWZmZXJlZCBwYWNrZXRzICovCi0JCQkJCQlpc3N1ZV9udWxsZGF0YTIzYShwYWRhcHRlciwKLQkJCQkJCQkgICAgICAgcHN0YS0+aHdhZGRyLAotCQkJCQkJCSAgICAgICAwLCAwLCAwKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCURCR184NzIzQSgiZXJyb3IhcHN0YS0+c2xlZXBxIgotCQkJCQkJCSAgIl9sZW4gPSVkXG4iLAotCQkJCQkJCSAgcHN0YS0+c2xlZXBxX2xlbik7Ci0JCQkJCQlwc3RhLT5zbGVlcHFfbGVuID0gMDsKLQkJCQkJfQotCi0JCQkJCXBzdGFwcml2LT50aW1fYml0bWFwICY9IH5DSEtCSVQocHN0YS0+YWlkKTsKLQotCQkJCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCBXTEFOX0VJRF9USU0sCi0JCQkJCQkJIE5VTEwsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLSNlbmRpZgotCXJldHVybiBfRkFJTDsKLX0KLQotc3RydWN0IHJlY3ZfZnJhbWUgKnJlY3ZmcmFtZV9jaGtfZGVmcmFnMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IHZhbGlkYXRlX3JlY3ZfbWdudF9mcmFtZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkgIit2YWxpZGF0ZV9yZWN2X21nbnRfZnJhbWVcbiIpOwotCi0JcHJlY3ZfZnJhbWUgPSByZWN2ZnJhbWVfY2hrX2RlZnJhZzIzYShwYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCWlmIChwcmVjdl9mcmFtZSA9PSBOVUxMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkgIiVzOiBmcmFnbWVudCBwYWNrZXRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIF9TVUNDRVNTOwotCX0KLQotCXNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQotCQkvKiBmb3IgcnggcGt0IHN0YXRpc3RpY3MgKi8KLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwgaGRyLT5hZGRyMik7Ci0JaWYgKHBzdGEpIHsKLQkJcHN0YS0+c3RhX3N0YXRzLnJ4X21nbnRfcGt0cysrOwotCi0JCWlmIChpZWVlODAyMTFfaXNfYmVhY29uKGhkci0+ZnJhbWVfY29udHJvbCkpCi0JCQlwc3RhLT5zdGFfc3RhdHMucnhfYmVhY29uX3BrdHMrKzsKLQkJZWxzZSBpZiAoaWVlZTgwMjExX2lzX3Byb2JlX3JlcShoZHItPmZyYW1lX2NvbnRyb2wpKQotCQkJcHN0YS0+c3RhX3N0YXRzLnJ4X3Byb2JlcmVxX3BrdHMrKzsKLQkJZWxzZSBpZiAoaWVlZTgwMjExX2lzX3Byb2JlX3Jlc3AoaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwocGFkYXB0ZXItPmVlcHJvbXByaXYubWFjX2FkZHIsCi0JCQkJICAgIGhkci0+YWRkcjEpKQotCQkJCXBzdGEtPnN0YV9zdGF0cy5yeF9wcm9iZXJzcF9wa3RzKys7Ci0JCQllbHNlIGlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSB8fAotCQkJCSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkKLQkJCQlwc3RhLT5zdGFfc3RhdHMucnhfcHJvYmVyc3BfYm1fcGt0cysrOwotCQkJZWxzZQotCQkJCXBzdGEtPnN0YV9zdGF0cy5yeF9wcm9iZXJzcF91b19wa3RzKys7Ci0JCX0KLQl9Ci0KLQltZ3RfZGlzcGF0Y2hlcjIzYShwYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IHZhbGlkYXRlX3JlY3ZfZGF0YV9mcmFtZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQl1OCBicmV0cnk7Ci0JdTggKnBzYSwgKnBkYTsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJiBwcmVjdl9mcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJmFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7Ci0KLQotCi0JYnJldHJ5ID0gaWVlZTgwMjExX2hhc19yZXRyeShoZHItPmZyYW1lX2NvbnRyb2wpOwotCXBkYSA9IGllZWU4MDIxMV9nZXRfREEoaGRyKTsKLQlwc2EgPSBpZWVlODAyMTFfZ2V0X1NBKGhkcik7Ci0KLQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+ZHN0LCBwZGEpOwotCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5zcmMsIHBzYSk7Ci0KLQlzd2l0Y2ggKGhkci0+ZnJhbWVfY29udHJvbCAmCi0JCWNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSB7Ci0JY2FzZSBjcHVfdG9fbGUxNigwKToKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPmJzc2lkLCBoZHItPmFkZHIzKTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnJhLCBwZGEpOwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+dGEsIHBzYSk7Ci0JCXJldCA9IHN0YTJzdGFfZGF0YV9mcmFtZShhZGFwdGVyLCBwcmVjdl9mcmFtZSwgJnBzdGEpOwotCQlicmVhazsKLQotCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfRlJPTURTKToKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPmJzc2lkLCBoZHItPmFkZHIyKTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnJhLCBwZGEpOwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+dGEsIGhkci0+YWRkcjIpOwotCQlyZXQgPSBhcDJzdGFfZGF0YV9mcmFtZShhZGFwdGVyLCBwcmVjdl9mcmFtZSwgJnBzdGEpOwotCQlicmVhazsKLQotCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfVE9EUyk6Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5ic3NpZCwgaGRyLT5hZGRyMSk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5yYSwgaGRyLT5hZGRyMSk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT50YSwgcHNhKTsKLQkJcmV0ID0gc3RhMmFwX2RhdGFfZnJhbWUoYWRhcHRlciwgcHJlY3ZfZnJhbWUsICZwc3RhKTsKLQkJYnJlYWs7Ci0KLQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpOgotCQkvKgotCQkgKiBUaGVyZSBpcyBubyBCU1NJRCBpbiB0aGlzIGNhc2UsIGJ1dCB0aGUgZHJpdmVyIGhhcyBiZWVuCi0JCSAqIHVzaW5nIGFkZHIxIHNvIGZhciwgc28ga2VlcCBpdCBmb3Igbm93LgotCQkgKi8KLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPmJzc2lkLCBoZHItPmFkZHIxKTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnJhLCBoZHItPmFkZHIxKTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnRhLCBoZHItPmFkZHIyKTsKLQkJcmV0ID0gX0ZBSUw7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sICJjYXNlIDNcbiIpOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoKHJldCA9PSBfRkFJTCkgfHwgKHJldCA9PSBSVFdfUlhfSEFORExFRCkpCi0JCWdvdG8gZXhpdDsKLQotCWlmICghcHN0YSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJICJhZnRlciB0b19mcl9kc19jaGs7IHBzdGEgPT0gTlVMTFxuIik7Ci0JCXJldCA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcHJlY3ZfZnJhbWUtPnBzdGEgPSBwc3RhOwotCi0JcGF0dHJpYi0+aGRybGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlpZiAoaWVlZTgwMjExX2hhc19hNChoZHItPmZyYW1lX2NvbnRyb2wpKQotCQlwYXR0cmliLT5oZHJsZW4gKz0gRVRIX0FMRU47Ci0KLQkvKiBwYXJzaW5nIFFDIGZpZWxkICovCi0JaWYgKHBhdHRyaWItPnFvcyA9PSAxKSB7Ci0JCV9fbGUxNiAqcXB0ciA9IChfX2xlMTYgKilpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKLQkJdTE2IHFvc19jdHJsID0gbGUxNl90b19jcHUoKnFwdHIpOwotCi0JCXBhdHRyaWItPnByaW9yaXR5ID0gcW9zX2N0cmwgJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKLQkJcGF0dHJpYi0+YWNrX3BvbGljeSA9IChxb3NfY3RybCA+PiA1KSAmIDM7Ci0JCXBhdHRyaWItPmFtc2R1ID0KLQkJCShxb3NfY3RybCAmIElFRUU4MDIxMV9RT1NfQ1RMX0FfTVNEVV9QUkVTRU5UKSA+PiA3OwotCQlwYXR0cmliLT5oZHJsZW4gKz0gSUVFRTgwMjExX1FPU19DVExfTEVOOwotCi0JCWlmIChwYXR0cmliLT5wcmlvcml0eSAhPSAwICYmIHBhdHRyaWItPnByaW9yaXR5ICE9IDMpIHsKLQkJCWFkYXB0ZXItPnJlY3Zwcml2LmJJc0FueU5vbkJFUGt0cyA9IHRydWU7Ci0JCX0KLQl9IGVsc2UgewotCQlwYXR0cmliLT5wcmlvcml0eSA9IDA7Ci0JCXBhdHRyaWItPmFja19wb2xpY3kgPSAwOwotCQlwYXR0cmliLT5hbXNkdSA9IDA7Ci0JfQotCi0JaWYgKHBhdHRyaWItPm9yZGVyKSB7IC8qIEhULUNUUkwgMTFuICovCi0JCXBhdHRyaWItPmhkcmxlbiArPSA0OwotCX0KLQotCXByZWN2X2ZyYW1lLT5wcmVvcmRlcl9jdHJsID0gJnBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbcGF0dHJpYi0+cHJpb3JpdHldOwotCi0JLyogIGRlY2FjaGUsIGRyb3AgZHVwbGljYXRlIHJlY3YgcGFja2V0cyAqLwotCWlmIChyZWN2X2RlY2FjaGUocHJlY3ZfZnJhbWUsIGJyZXRyeSwgJnBzdGEtPnN0YV9yZWN2cHJpdi5yeGNhY2hlKSA9PQotCSAgICBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJICJkZWNhY2hlIDogZHJvcCBwa3RcbiIpOwotCQlyZXQgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChwYXR0cmliLT5wcml2YWN5KSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJICJ2YWxpZGF0ZV9yZWN2X2RhdGFfZnJhbWU6cGF0dHJpYi0+cHJpdmFjeSA9JXhcbiIsCi0JCQkgcGF0dHJpYi0+cHJpdmFjeSk7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJICJeXl5eXl5eXl5eXmlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPnJhKDB4JTAyeCkpID0lZF5eXl5eXl5eXl5eXl5eXjZcbiIsCi0JCQkgcGF0dHJpYi0+cmFbMF0sCi0JCQkgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+cmEpKTsKLQotCQlHRVRfRU5DUllfQUxHTyhwc2VjdXJpdHlwcml2LCBwc3RhLCBwYXR0cmliLT5lbmNyeXB0LAotCQkJICAgICAgIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPnJhKSk7Ci0KLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkgInBhdHRyaWItPmVuY3J5cHQgPSVkXG4iLCBwYXR0cmliLT5lbmNyeXB0KTsKLQotCQlzd2l0Y2ggKHBhdHRyaWItPmVuY3J5cHQpIHsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6Ci0JCQlwYXR0cmliLT5pdl9sZW4gPSBJRUVFODAyMTFfV0VQX0lWX0xFTjsKLQkJCXBhdHRyaWItPmljdl9sZW4gPSBJRUVFODAyMTFfV0VQX0lDVl9MRU47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQkJcGF0dHJpYi0+aXZfbGVuID0gSUVFRTgwMjExX1RLSVBfSVZfTEVOOwotCQkJcGF0dHJpYi0+aWN2X2xlbiA9IElFRUU4MDIxMV9US0lQX0lDVl9MRU47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQkJcGF0dHJpYi0+aXZfbGVuID0gSUVFRTgwMjExX0NDTVBfSERSX0xFTjsKLQkJCXBhdHRyaWItPmljdl9sZW4gPSBJRUVFODAyMTFfQ0NNUF9NSUNfTEVOOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwYXR0cmliLT5pdl9sZW4gPSAwOwotCQkJcGF0dHJpYi0+aWN2X2xlbiA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCXBhdHRyaWItPmVuY3J5cHQgPSAwOwotCQlwYXR0cmliLT5pdl9sZW4gPSAwOwotCQlwYXR0cmliLT5pY3ZfbGVuID0gMDsKLQl9Ci0KLWV4aXQ6Ci0KLQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgZHVtcF9yeF9wa3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IHR5cGUsIGludCBsZXZlbCkKLXsKLQlpbnQgaTsKLQl1OCAqcHRyOwotCi0JaWYgKChsZXZlbCA9PSAxKSB8fAotCSAgICAoKGxldmVsID09IDIpICYmICh0eXBlID09IElFRUU4MDIxMV9GVFlQRV9NR01UKSkgfHwKLQkgICAgKChsZXZlbCA9PSAzKSAmJiAodHlwZSA9PSBJRUVFODAyMTFfRlRZUEVfREFUQSkpKSB7Ci0KLQkJcHRyID0gc2tiLT5kYXRhOwotCi0JCURCR184NzIzQSgiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiIpOwotCi0JCWZvciAoaSA9IDA7IGkgPCA2NDsgaSA9IGkgKyA4KQotCQkJREJHXzg3MjNBKCIlKnBoQzpcbiIsIDgsIHB0ciArIGkpOwotCQlEQkdfODcyM0EoIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgdmFsaWRhdGVfcmVjdl9mcmFtZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCS8qIHNoYWxsIGNoZWNrIGZyYW1lIHN1YnR5cGUsIHRvIC8gZnJvbSBkcywgZGEsIGJzc2lkICovCi0KLQkvKiB0aGVuIGNhbGwgY2hlY2sgaWYgcnggc2VxL2ZyYWcuIGR1cGxpY2F0ZWQuICovCi0JdTggdHlwZTsKLQl1OCBzdWJ0eXBlOwotCWludCByZXR2YWwgPSBfU1VDQ0VTUzsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICYgcHJlY3ZfZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQl1OCB2ZXI7Ci0JdTggYkR1bXBSeFBrdDsKLQl1MTYgc2VxX2N0cmwsIGZjdGw7Ci0KLQlmY3RsID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jb250cm9sKTsKLQl2ZXIgPSBmY3RsICYgSUVFRTgwMjExX0ZDVExfVkVSUzsKLQl0eXBlID0gZmN0bCAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFOwotCXN1YnR5cGUgPSBmY3RsICYgSUVFRTgwMjExX0ZDVExfU1RZUEU7Ci0KLQkvKiBhZGQgdmVyc2lvbiBjaGsgKi8KLQlpZiAodmVyICE9IDApIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCSAidmFsaWRhdGVfcmVjdl9kYXRhX2ZyYW1lIGZhaWwhICh2ZXIhPSAwKVxuIik7Ci0JCXJldHZhbCA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0Jc2VxX2N0cmwgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKTsKLQlwYXR0cmliLT5mcmFnX251bSA9IHNlcV9jdHJsICYgSUVFRTgwMjExX1NDVExfRlJBRzsKLQlwYXR0cmliLT5zZXFfbnVtID0gc2VxX2N0cmwgPj4gNDsKLQotCXBhdHRyaWItPnB3X3NhdmUgPSBpZWVlODAyMTFfaGFzX3BtKGhkci0+ZnJhbWVfY29udHJvbCk7Ci0JcGF0dHJpYi0+bWZyYWcgPSBpZWVlODAyMTFfaGFzX21vcmVmcmFncyhoZHItPmZyYW1lX2NvbnRyb2wpOwotCXBhdHRyaWItPm1kYXRhID0gaWVlZTgwMjExX2hhc19tb3JlZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpOwotCXBhdHRyaWItPnByaXZhY3kgPSBpZWVlODAyMTFfaGFzX3Byb3RlY3RlZChoZHItPmZyYW1lX2NvbnRyb2wpOwotCXBhdHRyaWItPm9yZGVyID0gaWVlZTgwMjExX2hhc19vcmRlcihoZHItPmZyYW1lX2NvbnRyb2wpOwotCi0JR2V0SGFsRGVmVmFyODE5MkNVc2IoYWRhcHRlciwgSEFMX0RFRl9EQkdfRFVNUF9SWFBLVCwgJmJEdW1wUnhQa3QpOwotCi0JaWYgKHVubGlrZWx5KGJEdW1wUnhQa3QgPT0gMSkpCi0JCWR1bXBfcnhfcGt0KHNrYiwgdHlwZSwgYkR1bXBSeFBrdCk7Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIElFRUU4MDIxMV9GVFlQRV9NR01UOgotCQlyZXR2YWwgPSB2YWxpZGF0ZV9yZWN2X21nbnRfZnJhbWUoYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCQlpZiAocmV0dmFsID09IF9GQUlMKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAidmFsaWRhdGVfcmVjdl9tZ250X2ZyYW1lIGZhaWxcbiIpOwotCQl9Ci0JCXJldHZhbCA9IF9GQUlMOyAvKiAgb25seSBkYXRhIGZyYW1lIHJldHVybiBfU1VDQ0VTUyAqLwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9GVFlQRV9DVEw6Ci0JCXJldHZhbCA9IHZhbGlkYXRlX3JlY3ZfY3RybF9mcmFtZShhZGFwdGVyLCBwcmVjdl9mcmFtZSk7Ci0JCWlmIChyZXR2YWwgPT0gX0ZBSUwpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJ2YWxpZGF0ZV9yZWN2X2N0cmxfZnJhbWUgZmFpbFxuIik7Ci0JCX0KLQkJcmV0dmFsID0gX0ZBSUw7IC8qICBvbmx5IGRhdGEgZnJhbWUgcmV0dXJuIF9TVUNDRVNTICovCi0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0RBVEE6Ci0JCXBhdHRyaWItPnFvcyA9IChzdWJ0eXBlICYgSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBKSA/IDEgOiAwOwotCQlyZXR2YWwgPSB2YWxpZGF0ZV9yZWN2X2RhdGFfZnJhbWUoYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCQlpZiAocmV0dmFsID09IF9GQUlMKSB7Ci0JCQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmYWRhcHRlci0+cmVjdnByaXY7Ci0KLQkJCXByZWN2cHJpdi0+cnhfZHJvcCsrOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgInZhbGlkYXRlX3JlY3ZfZGF0YV9mcmFtZSBmYWlsISB0eXBlID0gMHgleFxuIiwgdHlwZSk7Ci0JCXJldHZhbCA9IF9GQUlMOwotCQlicmVhazsKLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyogcmVtb3ZlIHRoZSB3bGFuaGRyIGFuZCBhZGQgdGhlIGV0aF9oZHIgKi8KLQotc3RhdGljIGludCB3bGFuaGRyX3RvX2V0aGhkciAoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCi17Ci0JdTE2CWV0aF90eXBlLCBsZW4sIGhkcmxlbjsKLQl1OAlic25hcGhkcjsKLQl1OAkqcHNuYXA7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gcHJlY3ZmcmFtZS0+YWRhcHRlcjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZmcmFtZS0+cGt0OwotCXU4ICpwdHI7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+YXR0cmliOwotCi0KLQotCXB0ciA9IHNrYi0+ZGF0YTsKLQloZHJsZW4gPSBwYXR0cmliLT5oZHJsZW47Ci0JcHNuYXAgPSBwdHIgKyBoZHJsZW47Ci0JZXRoX3R5cGUgPSAocHNuYXBbNl0gPDwgOCkgfCBwc25hcFs3XTsKLQkvKiBjb252ZXJ0IGhkciArIHBvc3NpYmxlIExMQyBoZWFkZXJzIGludG8gRXRoZXJuZXQgaGVhZGVyICovCi0JaWYgKChldGhlcl9hZGRyX2VxdWFsKHBzbmFwLCByZmMxMDQyX2hlYWRlcikgJiYKLQkgICAgIGV0aF90eXBlICE9IEVUSF9QX0FBUlAgJiYgZXRoX3R5cGUgIT0gRVRIX1BfSVBYKSB8fAotCSAgICBldGhlcl9hZGRyX2VxdWFsKHBzbmFwLCBicmlkZ2VfdHVubmVsX2hlYWRlcikpIHsKLQkJLyogcmVtb3ZlIFJGQzEwNDIgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uCi0JCSAgIGFuZCByZXBsYWNlIEV0aGVyVHlwZSAqLwotCQlic25hcGhkciA9IHRydWU7Ci0JCWhkcmxlbiArPSBTTkFQX1NJWkU7Ci0JfSBlbHNlIHsKLQkJLyogTGVhdmUgRXRoZXJuZXQgaGVhZGVyIHBhcnQgb2YgaGRyIGFuZCBmdWxsIHBheWxvYWQgKi8KLQkJYnNuYXBoZHIgPSBmYWxzZTsKLQkJZXRoX3R5cGUgPSAocHNuYXBbMF0gPDwgOCkgfCBwc25hcFsxXTsKLQl9Ci0KLQlsZW4gPSBza2ItPmxlbiAtIGhkcmxlbjsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkgIj09PSBwYXR0cmliLT5oZHJsZW46ICV4LCAgcGF0dHJpYi0+aXZfbGVuOiV4ID09PVxuIiwKLQkJIHBhdHRyaWItPmhkcmxlbiwgIHBhdHRyaWItPml2X2xlbik7Ci0KLQlwYXR0cmliLT5ldGhfdHlwZSA9IGV0aF90eXBlOwotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9NUF9TVEFURSkpIHsKLQkJcHRyICs9IGhkcmxlbjsKLQkJKnB0ciA9IDB4ODc7Ci0JCSoocHRyICsgMSkgPSAweDEyOwotCi0JCWV0aF90eXBlID0gMHg4NzEyOwotCQkvKiAgYXBwZW5kIHJ4IHN0YXR1cyBmb3IgbXAgdGVzdCBwYWNrZXRzICovCi0KLQkJcHRyID0gc2tiX3B1bGwoc2tiLCAoaGRybGVuIC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsgMikgLSAyNCk7Ci0JCW1lbWNweShwdHIsIHNrYi0+aGVhZCwgMjQpOwotCQlwdHIgKz0gMjQ7Ci0JfSBlbHNlIHsKLQkJcHRyID0gc2tiX3B1bGwoc2tiLCAoaGRybGVuIC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsKLQkJCQkgICAgIChic25hcGhkciA/IDI6MCkpKTsKLQl9Ci0KLQlldGhlcl9hZGRyX2NvcHkocHRyLCBwYXR0cmliLT5kc3QpOwotCWV0aGVyX2FkZHJfY29weShwdHIgKyBFVEhfQUxFTiwgcGF0dHJpYi0+c3JjKTsKLQotCWlmICghYnNuYXBoZHIpIHsKLQkJcHV0X3VuYWxpZ25lZF9iZTE2KGxlbiwgcHRyICsgMTIpOwotCX0KLQotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi0vKiBwZXJmb3JtIGRlZnJhZyAqLwotc3RydWN0IHJlY3ZfZnJhbWUgKnJlY3ZmcmFtZV9kZWZyYWcoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgICBzdHJ1Y3QgcnR3X3F1ZXVlICpkZWZyYWdfcSk7Ci1zdHJ1Y3QgcmVjdl9mcmFtZSAqcmVjdmZyYW1lX2RlZnJhZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJICAgIHN0cnVjdCBydHdfcXVldWUgKmRlZnJhZ19xKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCXU4IHdsYW5oZHJfb2Zmc2V0OwotCXU4IGN1cmZyYWdudW07Ci0Jc3RydWN0IHJlY3ZfZnJhbWUgKnBuZmhkciwgKnB0bXA7Ci0Jc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUsICpwbmV4dHJmcmFtZTsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQljdXJmcmFnbnVtID0gMDsKLQlwZnJlZV9yZWN2X3F1ZXVlID0gJmFkYXB0ZXItPnJlY3Zwcml2LmZyZWVfcmVjdl9xdWV1ZTsKLQotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChkZWZyYWdfcSk7Ci0JcHJmcmFtZSA9IGxpc3RfZmlyc3RfZW50cnkocGhlYWQsIHN0cnVjdCByZWN2X2ZyYW1lLCBsaXN0KTsKLQlsaXN0X2RlbF9pbml0KCZwcmZyYW1lLT5saXN0KTsKLQlza2IgPSBwcmZyYW1lLT5wa3Q7Ci0KLQlpZiAoY3VyZnJhZ251bSAhPSBwcmZyYW1lLT5hdHRyaWIuZnJhZ19udW0pIHsKLQkJLyogdGhlIGZpcnN0IGZyYWdtZW50IG51bWJlciBtdXN0IGJlIDAgKi8KLQkJLyogZnJlZSB0aGUgd2hvbGUgcXVldWUgKi8KLQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZnJhbWUpOwotCQlydHdfZnJlZV9yZWN2ZnJhbWUyM2FfcXVldWUoZGVmcmFnX3EpOwotCi0JCXJldHVybiBOVUxMOwotCX0KLQotCWN1cmZyYWdudW0rKzsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwbmZoZHIsIHB0bXAsIHBoZWFkLCBsaXN0KSB7Ci0JCXBuZXh0cmZyYW1lID0gKHN0cnVjdCByZWN2X2ZyYW1lICopcG5maGRyOwotCQkvKiBjaGVjayB0aGUgZnJhZ21lbnQgc2VxdWVuY2UgICgybmQgfm4gZnJhZ21lbnQgZnJhbWUpICovCi0KLQkJaWYgKGN1cmZyYWdudW0gIT0gcG5maGRyLT5hdHRyaWIuZnJhZ19udW0pIHsKLQkJCS8qIHRoZSBmcmFnbWVudCBudW1iZXIgbXVzdCBiZSBpbmNyZWFzaW5nCi0JCQkgICAoYWZ0ZXIgZGVjYWNoZSkgKi8KLQkJCS8qIHJlbGVhc2UgdGhlIGRlZnJhZ19xICYgcHJmcmFtZSAqLwotCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZnJhbWUpOwotCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhX3F1ZXVlKGRlZnJhZ19xKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0KLQkJY3VyZnJhZ251bSsrOwotCi0JCS8qIGNvcHkgdGhlIDJuZH5uIGZyYWdtZW50IGZyYW1lJ3MgcGF5bG9hZCB0byB0aGUKLQkJICAgZmlyc3QgZnJhZ21lbnQgKi8KLQkJLyogZ2V0IHRoZSAybmR+bGFzdCBmcmFnbWVudCBmcmFtZSdzIHBheWxvYWQgKi8KLQotCQl3bGFuaGRyX29mZnNldCA9IHBuZmhkci0+YXR0cmliLmhkcmxlbiArIHBuZmhkci0+YXR0cmliLml2X2xlbjsKLQotCQlza2JfcHVsbChwbmZoZHItPnBrdCwgd2xhbmhkcl9vZmZzZXQpOwotCi0JCS8qIGFwcGVuZCAgdG8gZmlyc3QgZnJhZ21lbnQgZnJhbWUncyB0YWlsCi0JCSAgIChpZiBwcml2YWN5IGZyYW1lLCBwdWxsIHRoZSBJQ1YpICovCi0KLQkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIHByZnJhbWUtPmF0dHJpYi5pY3ZfbGVuKTsKLQotCQltZW1jcHkoc2tiX3RhaWxfcG9pbnRlcihza2IpLCBwbmZoZHItPnBrdC0+ZGF0YSwKLQkJICAgICAgIHBuZmhkci0+cGt0LT5sZW4pOwotCi0JCXNrYl9wdXQoc2tiLCBwbmZoZHItPnBrdC0+bGVuKTsKLQotCQlwcmZyYW1lLT5hdHRyaWIuaWN2X2xlbiA9IHBuZmhkci0+YXR0cmliLmljdl9sZW47Ci0JfQotCi0JLyogZnJlZSB0aGUgZGVmcmFnX3EgcXVldWUgYW5kIHJldHVybiB0aGUgcHJmcmFtZSAqLwotCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYV9xdWV1ZShkZWZyYWdfcSk7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJICJQZXJmb3JtYW5jZSBkZWZyYWchISEhIVxuIik7Ci0KLQlyZXR1cm4gcHJmcmFtZTsKLX0KLQotLyogY2hlY2sgaWYgbmVlZCB0byBkZWZyYWcsIGlmIG5lZWRlZCBxdWV1ZSB0aGUgZnJhbWUgdG8gZGVmcmFnX3EgKi8KLXN0cnVjdCByZWN2X2ZyYW1lICpyZWN2ZnJhbWVfY2hrX2RlZnJhZzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JdTgJaXNtZnJhZzsKLQl1OAlmcmFnbnVtOwotCXU4CSpwc3RhX2FkZHI7Ci0Jc3RydWN0IHJlY3ZfZnJhbWUgKnBmaGRyOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCXN0cnVjdCByZWN2X2ZyYW1lICpwcnRuZnJhbWUgPSBOVUxMOwotCXN0cnVjdCBydHdfcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUsICpwZGVmcmFnX3E7Ci0KLQotCi0JcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0KLQlwZmhkciA9IHByZWN2X2ZyYW1lOwotCi0JcGZyZWVfcmVjdl9xdWV1ZSA9ICZwYWRhcHRlci0+cmVjdnByaXYuZnJlZV9yZWN2X3F1ZXVlOwotCi0JLyogbmVlZCB0byBkZWZpbmUgc3RydWN0IG9mIHdsYW4gaGVhZGVyIGZyYW1lIGN0cmwgKi8KLQlpc21mcmFnID0gcGZoZHItPmF0dHJpYi5tZnJhZzsKLQlmcmFnbnVtID0gcGZoZHItPmF0dHJpYi5mcmFnX251bTsKLQotCXBzdGFfYWRkciA9IHBmaGRyLT5hdHRyaWIudGE7Ci0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcHN0YV9hZGRyKTsKLQlpZiAoIXBzdGEpIHsKLQkJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9Ci0JCQkoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgcGZoZHItPnBrdC0+ZGF0YTsKLQkJaWYgKCFpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCQlwc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCQkJcGRlZnJhZ19xID0gJnBzdGEtPnN0YV9yZWN2cHJpdi5kZWZyYWdfcTsKLQkJfSBlbHNlCi0JCQlwZGVmcmFnX3EgPSBOVUxMOwotCX0gZWxzZQotCQlwZGVmcmFnX3EgPSAmcHN0YS0+c3RhX3JlY3Zwcml2LmRlZnJhZ19xOwotCi0JaWYgKChpc21mcmFnID09IDApICYmIChmcmFnbnVtID09IDApKSB7Ci0JCXBydG5mcmFtZSA9IHByZWN2X2ZyYW1lOy8qIGlzbid0IGEgZnJhZ21lbnQgZnJhbWUgKi8KLQl9Ci0KLQlpZiAoaXNtZnJhZyA9PSAxKSB7Ci0JCS8qIDB+KG4tMSkgZnJhZ21lbnQgZnJhbWUgKi8KLQkJLyogZW5xdWV1ZSB0byBkZWZyYWZfZyAqLwotCQlpZiAocGRlZnJhZ19xICE9IE5VTEwpIHsKLQkJCWlmIChmcmFnbnVtID09IDApIHsKLQkJCQkvKiB0aGUgZmlyc3QgZnJhZ21lbnQgKi8KLQkJCQlpZiAoIWxpc3RfZW1wdHkoJnBkZWZyYWdfcS0+cXVldWUpKSB7Ci0JCQkJCS8qIGZyZWUgY3VycmVudCBkZWZyYWdfcSAqLwotCQkJCQlydHdfZnJlZV9yZWN2ZnJhbWUyM2FfcXVldWUocGRlZnJhZ19xKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIFRoZW4gZW5xdWV1ZSB0aGUgMH4obi0xKSBmcmFnbWVudCBpbnRvIHRoZQotCQkJICAgZGVmcmFnX3EgKi8KLQotCQkJLyogc3Bpbl9sb2NrKCZwZGVmcmFnX3EtPmxvY2spOyAqLwotCQkJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBkZWZyYWdfcSk7Ci0JCQlsaXN0X2FkZF90YWlsKCZwZmhkci0+bGlzdCwgcGhlYWQpOwotCQkJLyogc3Bpbl91bmxvY2soJnBkZWZyYWdfcS0+bG9jayk7ICovCi0KLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiRW5xdWV1cTogaXNtZnJhZyA9ICVkLCBmcmFnbnVtID0gJWRcbiIsCi0JCQkJIGlzbWZyYWcsIGZyYWdudW0pOwotCi0JCQlwcnRuZnJhbWUgPSBOVUxMOwotCi0JCX0gZWxzZSB7Ci0JCQkvKiBjYW4ndCBmaW5kIHRoaXMgdGEncyBkZWZyYWdfcXVldWUsCi0JCQkgICBzbyBmcmVlIHRoaXMgcmVjdl9mcmFtZSAqLwotCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZWN2X2ZyYW1lKTsKLQkJCXBydG5mcmFtZSA9IE5VTEw7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAiRnJlZSBiZWNhdXNlIHBkZWZyYWdfcSA9PSBOVUxMOiBpc21mcmFnID0gJWQsIGZyYWdudW0gPSAlZFxuIiwKLQkJCQkgaXNtZnJhZywgZnJhZ251bSk7Ci0JCX0KLQl9Ci0KLQlpZiAoKGlzbWZyYWcgPT0gMCkgJiYgKGZyYWdudW0gIT0gMCkpIHsKLQkJLyogdGhlIGxhc3QgZnJhZ21lbnQgZnJhbWUgKi8KLQkJLyogZW5xdWV1ZSB0aGUgbGFzdCBmcmFnbWVudCAqLwotCQlpZiAocGRlZnJhZ19xICE9IE5VTEwpIHsKLQkJCS8qIHNwaW5fbG9jaygmcGRlZnJhZ19xLT5sb2NrKTsgKi8KLQkJCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZGVmcmFnX3EpOwotCQkJbGlzdF9hZGRfdGFpbCgmcGZoZHItPmxpc3QsIHBoZWFkKTsKLQkJCS8qIHNwaW5fdW5sb2NrKCZwZGVmcmFnX3EtPmxvY2spOyAqLwotCi0JCQkvKiBjYWxsIHJlY3ZmcmFtZV9kZWZyYWcgdG8gZGVmcmFnICovCi0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCQkgImRlZnJhZzogaXNtZnJhZyA9ICVkLCBmcmFnbnVtID0gJWRcbiIsCi0JCQkJIGlzbWZyYWcsIGZyYWdudW0pOwotCQkJcHJlY3ZfZnJhbWUgPSByZWN2ZnJhbWVfZGVmcmFnKHBhZGFwdGVyLCBwZGVmcmFnX3EpOwotCQkJcHJ0bmZyYW1lID0gcHJlY3ZfZnJhbWU7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBjYW4ndCBmaW5kIHRoaXMgdGEncyBkZWZyYWdfcXVldWUsCi0JCQkgICBzbyBmcmVlIHRoaXMgcmVjdl9mcmFtZSAqLwotCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZWN2X2ZyYW1lKTsKLQkJCXBydG5mcmFtZSA9IE5VTEw7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAiRnJlZSBiZWNhdXNlIHBkZWZyYWdfcSA9PSBOVUxMOiBpc21mcmFnID0gJWQsIGZyYWdudW0gPSAlZFxuIiwKLQkJCQkgaXNtZnJhZywgZnJhZ251bSk7Ci0JCX0KLQotCX0KLQotCWlmICgocHJ0bmZyYW1lICE9IE5VTEwpICYmIChwcnRuZnJhbWUtPmF0dHJpYi5wcml2YWN5KSkJewotCQkvKiBhZnRlciBkZWZyYWcgd2UgbXVzdCBjaGVjayB0a2lwIG1pYyBjb2RlICovCi0JCWlmIChyZWN2ZnJhbWVfY2hrbWljKHBhZGFwdGVyLCAgcHJ0bmZyYW1lKSA9PSBfRkFJTCkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgInJlY3ZmcmFtZV9jaGttaWMocGFkYXB0ZXIsICBwcnRuZnJhbWUpID09X0ZBSUxcbiIpOwotCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHBydG5mcmFtZSk7Ci0JCQlwcnRuZnJhbWUgPSBOVUxMOwotCQl9Ci0JfQotCi0KLQotCXJldHVybiBwcnRuZnJhbWU7Ci19Ci0KLWludCBhbXNkdV90b19tc2R1KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKTsKLWludCBhbXNkdV90b19tc2R1KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKQotewotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliOwotCXN0cnVjdCBza19idWZmICpza2IsICpzdWJfc2tiOwotCXN0cnVjdCBza19idWZmX2hlYWQgc2tiX2xpc3Q7Ci0KLQlwYXR0cmliID0gJnByZnJhbWUtPmF0dHJpYjsKLQotCXNrYiA9IHByZnJhbWUtPnBrdDsKLQlza2JfcHVsbChza2IsIHByZnJhbWUtPmF0dHJpYi5oZHJsZW4pOwotCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2tiX2xpc3QpOwotCi0JaWVlZTgwMjExX2Ftc2R1X3RvXzgwMjNzKHNrYiwgJnNrYl9saXN0LCBOVUxMLCAwLCAwLCBmYWxzZSk7Ci0KLQl3aGlsZSAoIXNrYl9xdWV1ZV9lbXB0eSgmc2tiX2xpc3QpKSB7Ci0JCXN1Yl9za2IgPSBfX3NrYl9kZXF1ZXVlKCZza2JfbGlzdCk7Ci0KLQkJc3ViX3NrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhzdWJfc2tiLCBwYWRhcHRlci0+cG5ldGRldik7Ci0JCXN1Yl9za2ItPmRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCi0JCXN1Yl9za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0KLQkJbmV0aWZfcngoc3ViX3NrYik7Ci0JfQotCi0JcHJmcmFtZS0+cGt0ID0gTlVMTDsKLQlydHdfZnJlZV9yZWN2ZnJhbWUyM2EocHJmcmFtZSk7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1pbnQgY2hlY2tfaW5kaWNhdGVfc2VxKHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCwgdTE2IHNlcV9udW0pOwotaW50IGNoZWNrX2luZGljYXRlX3NlcShzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmwsIHUxNiBzZXFfbnVtKQotewotCXU4CXdzaXplID0gcHJlb3JkZXJfY3RybC0+d3NpemVfYjsKLQl1MTYJd2VuZCA9IChwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgKyB3c2l6ZSAtMSkgJiAweEZGRjsKLQotCS8qICBSeCBSZW9yZGVyIGluaXRpYWxpemUgY29uZGl0aW9uLiAqLwotCWlmIChwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgPT0gMHhGRkZGKQotCQlwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgPSBzZXFfbnVtOwotCi0JLyogIERyb3Agb3V0IHRoZSBwYWNrZXQgd2hpY2ggU2VxTnVtIGlzIHNtYWxsZXIgdGhhbiBXaW5TdGFydCAqLwotCWlmIChTTl9MRVNTKHNlcV9udW0sIHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSkpCi0JCXJldHVybiBmYWxzZTsKLQotCS8qICAqLwotCS8qICBTbGlkaW5nIHdpbmRvdyBtYW5pcHVsYXRpb24uIENvbmRpdGlvbnMgaW5jbHVkZXM6ICovCi0JLyogIDEuIEluY29taW5nIFNlcU51bSBpcyBlcXVhbCB0byBXaW5TdGFydCA9PldpbmRvdyBzaGlmdCAxICovCi0JLyogIDIuIEluY29taW5nIFNlcU51bSBpcyBsYXJnZXIgdGhhbiB0aGUgV2luRW5kID0+IFdpbmRvdyBzaGlmdCBOICovCi0JLyogICovCi0JaWYgKFNOX0VRVUFMKHNlcV9udW0sIHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSkpIHsKLQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0KLQkJCShwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgKyAxKSAmIDB4RkZGOwotCX0gZWxzZSBpZiAoU05fTEVTUyh3ZW5kLCBzZXFfbnVtKSkgewotCQkvKiAgYm91bmRhcnkgc2l0dWF0aW9uLCB3aGVuIHNlcV9udW0gY3Jvc3MgMHhGRkYgKi8KLQkJaWYgKHNlcV9udW0gPj0gKHdzaXplIC0gMSkpCi0JCQlwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgPSBzZXFfbnVtICsgMSAtd3NpemU7Ci0JCWVsc2UKLQkJCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9IDB4RkZGIC0gKHdzaXplIC0gKHNlcV9udW0gKyAxKSkgKyAxOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludCBlbnF1ZXVlX3Jlb3JkZXJfcmVjdmZyYW1lMjNhKHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCwKLQkJCQkJc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUpCi17Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBydHdfcXVldWUgKnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZCwgKnBsaXN0LCAqcHRtcDsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqaGRyOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwbmV4dGF0dHJpYjsKLQotCXBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSA9ICZwcmVvcmRlcl9jdHJsLT5wZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKLQlwaGVhZCA9IGdldF9saXN0X2hlYWQocHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlKTsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwbGlzdCwgcHRtcCwgcGhlYWQpIHsKLQkJaGRyID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcmVjdl9mcmFtZSwgbGlzdCk7Ci0JCXBuZXh0YXR0cmliID0gJmhkci0+YXR0cmliOwotCi0JCWlmIChTTl9MRVNTKHBuZXh0YXR0cmliLT5zZXFfbnVtLCBwYXR0cmliLT5zZXFfbnVtKSkgewotCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAoU05fRVFVQUwocG5leHRhdHRyaWItPnNlcV9udW0sIHBhdHRyaWItPnNlcV9udW0pKSB7Ci0JCQkvKiBEdXBsaWNhdGUgZW50cnkgaXMgZm91bmQhISBEbyBub3QgaW5zZXJ0IGN1cnJlbnQgZW50cnkuICovCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlicmVhazsKLQkJfQotCi0JfQotCi0JbGlzdF9kZWxfaW5pdCgmcHJmcmFtZS0+bGlzdCk7Ci0KLQlsaXN0X2FkZF90YWlsKCZwcmZyYW1lLT5saXN0LCBwbGlzdCk7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotaW50IHJlY3ZfaW5kaWNhdGVwa3RzX2luX29yZGVyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsLAotCQkJICAgICAgIGludCBiZm9yY2VkKTsKLWludCByZWN2X2luZGljYXRlcGt0c19pbl9vcmRlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCwKLQkJCSAgICAgICBpbnQgYmZvcmNlZCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZCwgKnBsaXN0OwotCXN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliOwotCWludCBiUGt0SW5CdWYgPSBmYWxzZTsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXY7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlOwotCi0JcHJlY3Zwcml2ID0gJnBhZGFwdGVyLT5yZWN2cHJpdjsKLQlwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUgPSAmcHJlb3JkZXJfY3RybC0+cGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7Ci0JcGhlYWQgPQlnZXRfbGlzdF9oZWFkKHBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSk7Ci0JcGxpc3QgPSBwaGVhZC0+bmV4dDsKLQotCS8qICBIYW5kbGluZyBzb21lIGNvbmRpdGlvbiBmb3IgZm9yY2VkIGluZGljYXRlIGNhc2UuICovCi0JaWYgKGJmb3JjZWQpIHsKLQkJaWYgKGxpc3RfZW1wdHkocGhlYWQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXByZnJhbWUgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCByZWN2X2ZyYW1lLCBsaXN0KTsKLQkJcGF0dHJpYiA9ICZwcmZyYW1lLT5hdHRyaWI7Ci0JCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9IHBhdHRyaWItPnNlcV9udW07Ci0JfQotCi0JLyogIFByZXBhcmUgaW5kaWNhdGlvbiBsaXN0IGFuZCBpbmRpY2F0aW9uLiAqLwotCS8qICBDaGVjayBpZiB0aGVyZSBpcyBhbnkgcGFja2V0IG5lZWQgaW5kaWNhdGUuICovCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KHBoZWFkKSkgewotCi0JCXByZnJhbWUgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCByZWN2X2ZyYW1lLCBsaXN0KTsKLQkJcGF0dHJpYiA9ICZwcmZyYW1lLT5hdHRyaWI7Ci0KLQkJaWYgKCFTTl9MRVNTKHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSwgcGF0dHJpYi0+c2VxX251bSkpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkJICJyZWN2X2luZGljYXRlcGt0c19pbl9vcmRlcjogaW5kaWNhdGUgPSVkIHNlcSA9JWQgYW1zZHUgPSVkXG4iLAotCQkJCSBwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEsCi0JCQkJIHBhdHRyaWItPnNlcV9udW0sIHBhdHRyaWItPmFtc2R1KTsKLQotCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKLQkJCWxpc3RfZGVsX2luaXQoJnByZnJhbWUtPmxpc3QpOwotCi0JCQlpZiAoU05fRVFVQUwocHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxLAotCQkJCSAgICAgcGF0dHJpYi0+c2VxX251bSkpCXsKLQkJCQlwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgPQotCQkJCQkocHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxICsgMSkmMHhGRkY7Ci0JCQl9Ci0KLQkJCWlmICghcGF0dHJpYi0+YW1zZHUpIHsKLQkJCQlpZiAoKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9PSBmYWxzZSkgJiYKLQkJCQkgICAgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IGZhbHNlKSkgewotCQkJCQlydHdfcmVjdl9pbmRpY2F0ZXBrdDIzYShwYWRhcHRlciwgcHJmcmFtZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYW1zZHVfdG9fbXNkdShwYWRhcHRlciwgcHJmcmFtZSkgIT0KLQkJCQkgICAgX1NVQ0NFU1MpCi0JCQkJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmZyYW1lKTsKLQkJCX0KLQotCQkJLyogVXBkYXRlIGxvY2FsIHZhcmlhYmxlcy4gKi8KLQkJCWJQa3RJbkJ1ZiA9IGZhbHNlOwotCi0JCX0gZWxzZSB7Ci0JCQliUGt0SW5CdWYgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQotCX0KLQotCXJldHVybiBiUGt0SW5CdWY7Ci19Ci0KLWludCByZWN2X2luZGljYXRlcGt0X3Jlb3JkZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUpOwotaW50IHJlY3ZfaW5kaWNhdGVwa3RfcmVvcmRlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSkKLXsKLQlpbnQgcmV0dmFsID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWI7Ci0Jc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsOwotCXN0cnVjdCBydHdfcXVldWUgKnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKLQotCXBhdHRyaWIgPSAmcHJmcmFtZS0+YXR0cmliOwotCXByZW9yZGVyX2N0cmwgPSBwcmZyYW1lLT5wcmVvcmRlcl9jdHJsOwotCXBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSA9ICZwcmVvcmRlcl9jdHJsLT5wZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKLQotCWlmICghcGF0dHJpYi0+YW1zZHUpIHsKLQkJLyogczEuICovCi0JCXdsYW5oZHJfdG9fZXRoaGRyKHByZnJhbWUpOwotCi0JCWlmICgocGF0dHJpYi0+cW9zIT0gMSkgfHwgKHBhdHRyaWItPmV0aF90eXBlID09IEVUSF9QX0FSUCkgfHwKLQkJICAgIChwYXR0cmliLT5hY2tfcG9saWN5ICE9IDApKSB7Ci0JCQlpZiAoKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9PSBmYWxzZSkgJiYKLQkJCSAgICAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPT0gZmFsc2UpKSB7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfbm90aWNlXywKLQkJCQkJICJAQEBAICByZWN2X2luZGljYXRlcGt0X3Jlb3JkZXIgLXJlY3ZfZnVuYyByZWN2X2luZGljYXRlcGt0XG4iKTsKLQotCQkJCXJ0d19yZWN2X2luZGljYXRlcGt0MjNhKHBhZGFwdGVyLCBwcmZyYW1lKTsKLQkJCQlyZXR1cm4gX1NVQ0NFU1M7Ci0JCQl9Ci0KLQkJCXJldHVybiBfRkFJTDsKLQkJfQotCi0JCWlmIChwcmVvcmRlcl9jdHJsLT5lbmFibGUgPT0gZmFsc2UpIHsKLQkJCS8qIGluZGljYXRlIHRoaXMgcmVjdl9mcmFtZSAqLwotCQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0gcGF0dHJpYi0+c2VxX251bTsKLQkJCXJ0d19yZWN2X2luZGljYXRlcGt0MjNhKHBhZGFwdGVyLCBwcmZyYW1lKTsKLQotCQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0KLQkJCQkocHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxICsgMSkgJSA0MDk2OwotCQkJcmV0dXJuIF9TVUNDRVNTOwotCQl9Ci0JfSBlbHNlIHsKLQkJIC8qIHRlbXAgZmlsdGVyIC0+IG1lYW5zIGRpZG4ndCBzdXBwb3J0IEEtTVNEVXMgaW4gYSBBLU1QRFUgKi8KLQkJaWYgKHByZW9yZGVyX2N0cmwtPmVuYWJsZSA9PSBmYWxzZSkgewotCQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0gcGF0dHJpYi0+c2VxX251bTsKLQkJCXJldHZhbCA9IGFtc2R1X3RvX21zZHUocGFkYXB0ZXIsIHByZnJhbWUpOwotCi0JCQlwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgPQotCQkJCShwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgKyAxKSAlIDQwOTY7Ci0JCQlyZXR1cm4gcmV0dmFsOwotCQl9Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfbm90aWNlXywKLQkJICJyZWN2X2luZGljYXRlcGt0X3Jlb3JkZXI6IGluZGljYXRlID0lZCBzZXEgPSVkXG4iLAotCQkgcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxLCBwYXR0cmliLT5zZXFfbnVtKTsKLQotCS8qIHMyLiBjaGVjayBpZiB3aW5zdGFydF9iKGluZGljYXRlX3NlcSkgbmVlZHMgdG8gYmVlbiB1cGRhdGVkICovCi0JaWYgKCFjaGVja19pbmRpY2F0ZV9zZXEocHJlb3JkZXJfY3RybCwgcGF0dHJpYi0+c2VxX251bSkpIHsKLQkJZ290byBfZXJyX2V4aXQ7Ci0JfQotCi0JLyogczMuIEluc2VydCBhbGwgcGFja2V0IGludG8gUmVvcmRlciBRdWV1ZSB0byBtYWludGFpbiBpdHMgb3JkZXJpbmcuICovCi0JaWYgKCFlbnF1ZXVlX3Jlb3JkZXJfcmVjdmZyYW1lMjNhKHByZW9yZGVyX2N0cmwsIHByZnJhbWUpKSB7Ci0JCWdvdG8gX2Vycl9leGl0OwotCX0KLQotCS8qIHM0LiAqLwotCS8qICBJbmRpY2F0aW9uIHByb2Nlc3MuICovCi0JLyogIEFmdGVyIFBhY2tldCBkcm9wcGluZyBhbmQgU2xpZGluZyBXaW5kb3cgc2hpZnRpbmcgYXMgYWJvdmUsCi0JICAgIHdlIGNhbiBub3cganVzdCBpbmRpY2F0ZSB0aGUgcGFja2V0cyAqLwotCS8qICB3aXRoIHRoZSBTZXFOdW0gc21hbGxlciB0aGFuIGxhdGVzdCBXaW5TdGFydCBhbmQgYnVmZmVyCi0JICAgIG90aGVyIHBhY2tldHMuICovCi0JLyogICovCi0JLyogIEZvciBSeCBSZW9yZGVyIGNvbmRpdGlvbjogKi8KLQkvKiAgMS4gQWxsIHBhY2tldHMgd2l0aCBTZXFOdW0gc21hbGxlciB0aGFuIFdpblN0YXJ0ID0+IEluZGljYXRlICovCi0JLyogIDIuIEFsbCBwYWNrZXRzIHdpdGggU2VxTnVtIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIFdpblN0YXJ0ID0+Ci0JICAgIEJ1ZmZlciBpdC4gKi8KLQkvKiAgKi8KLQotCWlmIChyZWN2X2luZGljYXRlcGt0c19pbl9vcmRlcihwYWRhcHRlciwgcHJlb3JkZXJfY3RybCwgZmFsc2UpID09IHRydWUpIHsKLQkJbW9kX3RpbWVyKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFJFT1JERVJfV0FJVF9USU1FKSk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwotCX0gZWxzZSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwotCQlkZWxfdGltZXJfc3luYygmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyKTsKLQl9Ci0JcmV0dXJuIF9TVUNDRVNTOwotCi1fZXJyX2V4aXQ6Ci0KLQlzcGluX3VubG9ja19iaCgmcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlLT5sb2NrKTsKLQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLXZvaWQgcnR3X3Jlb3JkZXJpbmdfY3RybF90aW1lb3V0X2hhbmRsZXIyM2EodW5zaWduZWQgbG9uZyBwY29udGV4dCkKLXsKLQlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmw7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcjsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7Ci0KLQlwcmVvcmRlcl9jdHJsID0gKHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqKXBjb250ZXh0OwotCXBhZGFwdGVyID0gcHJlb3JkZXJfY3RybC0+cGFkYXB0ZXI7Ci0JcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlID0gJnByZW9yZGVyX2N0cmwtPnBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlOwotCi0JaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkgewotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwotCi0JaWYgKHJlY3ZfaW5kaWNhdGVwa3RzX2luX29yZGVyKHBhZGFwdGVyLCBwcmVvcmRlcl9jdHJsLCB0cnVlKSA9PSB0cnVlKSB7Ci0JCW1vZF90aW1lcigmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhSRU9SREVSX1dBSVRfVElNRSkpOwotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwotfQotCi1pbnQgcHJvY2Vzc19yZWN2X2luZGljYXRlcGt0cyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUpOwotaW50IHByb2Nlc3NfcmVjdl9pbmRpY2F0ZXBrdHMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKQotewotCWludCByZXR2YWwgPSBfU1VDQ0VTUzsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBodF9wcml2ICpwaHRwcml2ID0gJnBtbG1lcHJpdi0+aHRwcml2OwotCi0JaWYgKHBodHByaXYtPmh0X29wdGlvbiA9PSB0cnVlKSB7IC8qIEIvRy9OIE1vZGUgKi8KLQkJLyogIGluY2x1ZGluZyBwZXJmb3JtIEEtTVBEVSBSeCBPcmRlcmluZyBCdWZmZXIgQ29udHJvbCAqLwotCQlpZiAocmVjdl9pbmRpY2F0ZXBrdF9yZW9yZGVyKHBhZGFwdGVyLCBwcmZyYW1lKSAhPSBfU1VDQ0VTUykgewotCQkJaWYgKChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPT0gZmFsc2UpICYmCi0JCQkgICAgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IGZhbHNlKSkgewotCQkJCXJldHZhbCA9IF9GQUlMOwotCQkJCXJldHVybiByZXR2YWw7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgeyAvKiBCL0cgbW9kZSAqLwotCQlyZXR2YWwgPSB3bGFuaGRyX3RvX2V0aGhkcihwcmZyYW1lKTsKLQkJaWYgKHJldHZhbCAhPSBfU1VDQ0VTUykgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgIndsYW5oZHJfdG9fZXRoaGRyOiBkcm9wIHBrdFxuIik7Ci0JCQlyZXR1cm4gcmV0dmFsOwotCQl9Ci0KLQkJaWYgKChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPT0gZmFsc2UpICYmCi0JCSAgICAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPT0gZmFsc2UpKSB7Ci0JCQkvKiBpbmRpY2F0ZSB0aGlzIHJlY3ZfZnJhbWUgKi8KLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkJICJAQEBAIHByb2Nlc3NfcmVjdl9pbmRpY2F0ZXBrdHMtIHJlY3ZfZnVuYyByZWN2X2luZGljYXRlcGt0XG4iKTsKLQkJCXJ0d19yZWN2X2luZGljYXRlcGt0MjNhKHBhZGFwdGVyLCBwcmZyYW1lKTsKLQkJfSBlbHNlIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkJICJAQEBAIHByb2Nlc3NfcmVjdl9pbmRpY2F0ZXBrdHMtIHJlY3ZfZnVuYyBmcmVlX2luZGljYXRlcGt0XG4iKTsKLQotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfbm90aWNlXywKLQkJCQkgInJlY3ZfZnVuYzpiRHJpdmVyU3RvcHBlZCglZCkgT1IgYlN1cnByaXNlUmVtb3ZlZCglZClcbiIsCi0JCQkJIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCwKLQkJCQkgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpOwotCQkJcmV0dmFsID0gX0ZBSUw7Ci0JCQlyZXR1cm4gcmV0dmFsOwotCQl9Ci0KLQl9Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IHJlY3ZfZnVuY19wcmVoYW5kbGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcmZyYW1lKQotewotCWludCByZXQ7Ci0KLQkvKiBjaGVjayB0aGUgZnJhbWUgY3J0bCBmaWVsZCBhbmQgZGVjYWNoZSAqLwotCXJldCA9IHZhbGlkYXRlX3JlY3ZfZnJhbWUocGFkYXB0ZXIsIHJmcmFtZSk7Ci0JaWYgKHJldCAhPSBfU1VDQ0VTUykgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCSAicmVjdl9mdW5jOiB2YWxpZGF0ZV9yZWN2X2ZyYW1lIGZhaWwhIGRyb3AgcGt0XG4iKTsKLQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHJmcmFtZSk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByZWN2X2Z1bmNfcG9zdGhhbmRsZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKQotewotCWludCByZXQgPSBfU1VDQ0VTUzsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqb3JpZ19wcmZyYW1lID0gcHJmcmFtZTsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCi0JLyogIERBVEEgRlJBTUUgKi8KLQlwcmZyYW1lID0gZGVjcnlwdG9yKHBhZGFwdGVyLCBwcmZyYW1lKTsKLQlpZiAocHJmcmFtZSA9PSBOVUxMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgImRlY3J5cHRvcjogZHJvcCBwa3RcbiIpOwotCQlyZXQgPSBfRkFJTDsKLQkJZ290byBfcmVjdl9kYXRhX2Ryb3A7Ci0JfQotCi0JcHJmcmFtZSA9IHJlY3ZmcmFtZV9jaGtfZGVmcmFnMjNhKHBhZGFwdGVyLCBwcmZyYW1lKTsKLQlpZiAoIXByZnJhbWUpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCSAicmVjdmZyYW1lX2Noa19kZWZyYWcyM2E6IGRyb3AgcGt0XG4iKTsKLQkJZ290byBfcmVjdl9kYXRhX2Ryb3A7Ci0JfQotCi0JLyoKLQkgKiBQdWxsIG9mZiBjcnlwdG8gaGVhZGVycwotCSAqLwotCWlmIChwcmZyYW1lLT5hdHRyaWIuaXZfbGVuID4gMCkgewotCQlza2JfcHVsbChwcmZyYW1lLT5wa3QsIHByZnJhbWUtPmF0dHJpYi5pdl9sZW4pOwotCX0KLQotCWlmIChwcmZyYW1lLT5hdHRyaWIuaWN2X2xlbiA+IDApIHsKLQkJc2tiX3RyaW0ocHJmcmFtZS0+cGt0LAotCQkJIHByZnJhbWUtPnBrdC0+bGVuIC0gcHJmcmFtZS0+YXR0cmliLmljdl9sZW4pOwotCX0KLQotCXByZnJhbWUgPSBwb3J0Y3RybChwYWRhcHRlciwgcHJmcmFtZSk7Ci0JaWYgKCFwcmZyYW1lKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgInBvcnRjdHJsOiBkcm9wIHBrdFxuIik7Ci0JCXJldCA9IF9GQUlMOwotCQlnb3RvIF9yZWN2X2RhdGFfZHJvcDsKLQl9Ci0KLQljb3VudF9yeF9zdGF0cyhwYWRhcHRlciwgcHJmcmFtZSwgTlVMTCk7Ci0KLQlyZXQgPSBwcm9jZXNzX3JlY3ZfaW5kaWNhdGVwa3RzKHBhZGFwdGVyLCBwcmZyYW1lKTsKLQlpZiAocmV0ICE9IF9TVUNDRVNTKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgInJlY3ZfZnVuYzogcHJvY2Vzc19yZWN2X2luZGljYXRlcGt0cyBmYWlsIVxuIik7Ci0JCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShvcmlnX3ByZnJhbWUpOy8qIGZyZWUgdGhpcyByZWN2X2ZyYW1lICovCi0JCWdvdG8gX3JlY3ZfZGF0YV9kcm9wOwotCX0KLQlyZXR1cm4gcmV0OwotCi1fcmVjdl9kYXRhX2Ryb3A6Ci0JcHJlY3Zwcml2LT5yeF9kcm9wKys7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJ0d19yZWN2X2VudHJ5MjNhKHN0cnVjdCByZWN2X2ZyYW1lICpyZnJhbWUpCi17Ci0JaW50IHJldCwgcjsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gcmZyYW1lLT5hZGFwdGVyOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwcnhhdHRyaWIgPSAmcmZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHJlY3ZfcHJpdiAqcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0JLyogY2hlY2sgaWYgbmVlZCB0byBoYW5kbGUgdWNfc3dkZWNfcGVuZGluZ19xdWV1ZSovCi0JaWYgKGNoZWNrX2Z3c3RhdGUobWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkgJiYKLQkgICAgcHNlY3VyaXR5cHJpdi0+YnVzZXRraXBrZXkpCXsKLQkJc3RydWN0IHJlY3ZfZnJhbWUgKnBlbmRpbmdfZnJhbWU7Ci0KLQkJd2hpbGUgKChwZW5kaW5nX2ZyYW1lID0gcnR3X2FsbG9jX3JlY3ZmcmFtZTIzYSgmcGFkYXB0ZXItPnJlY3Zwcml2LnVjX3N3ZGVjX3BlbmRpbmdfcXVldWUpKSkgewotCQkJciA9IHJlY3ZfZnVuY19wb3N0aGFuZGxlKHBhZGFwdGVyLCBwZW5kaW5nX2ZyYW1lKTsKLQkJCWlmIChyID09IF9TVUNDRVNTKQotCQkJCURCR184NzIzQSgiJXM6IGRlcXVldWUgdWNfc3dkZWNfcGVuZGluZ19xdWV1ZVxuIiwgX19mdW5jX18pOwotCQl9Ci0JfQotCi0JcmV0ID0gcmVjdl9mdW5jX3ByZWhhbmRsZShwYWRhcHRlciwgcmZyYW1lKTsKLQotCWlmIChyZXQgPT0gX1NVQ0NFU1MpIHsKLQkJLyogY2hlY2sgaWYgbmVlZCB0byBlbnF1ZXVlIGludG8gdWNfc3dkZWNfcGVuZGluZ19xdWV1ZSovCi0JCWlmIChjaGVja19md3N0YXRlKG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpICYmCi0JCSAgICAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocHJ4YXR0cmliLT5yYSkgJiYKLQkJICAgIHByeGF0dHJpYi0+ZW5jcnlwdCA+IDAgJiYKLQkJICAgIChwcnhhdHRyaWItPmJkZWNyeXB0ZWQgPT0gMCkgJiYKLQkJICAgICFpc193ZXBfZW5jKHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0pICYmCi0JCSAgICAhcHNlY3VyaXR5cHJpdi0+YnVzZXRraXBrZXkpIHsKLQkJCXJ0d19lbnF1ZXVlX3JlY3ZmcmFtZTIzYShyZnJhbWUsICZwYWRhcHRlci0+cmVjdnByaXYudWNfc3dkZWNfcGVuZGluZ19xdWV1ZSk7Ci0JCQlEQkdfODcyM0EoIiVzOiBubyBrZXksIGVucXVldWUgdWNfc3dkZWNfcGVuZGluZ19xdWV1ZVxuIiwgX19mdW5jX18pOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJcmV0ID0gcmVjdl9mdW5jX3Bvc3RoYW5kbGUocGFkYXB0ZXIsIHJmcmFtZSk7Ci0KLQkJcmVjdnByaXYtPnJ4X3BrdHMrKzsKLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBydHdfc2lnbmFsX3N0YXRfdGltZXJfaGRsMjNhKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopZGF0YTsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpyZWN2cHJpdiA9ICZhZGFwdGVyLT5yZWN2cHJpdjsKLQotCXUzMiB0bXBfcywgdG1wX3E7Ci0JdTggYXZnX3NpZ25hbF9zdHJlbmd0aCA9IDA7Ci0JdTggYXZnX3NpZ25hbF9xdWFsID0gMDsKLQl1MzIgbnVtX3NpZ25hbF9zdHJlbmd0aCA9IDA7Ci0JdTMyIG51bV9zaWduYWxfcXVhbCA9IDA7Ci0JdTggX2FscGhhID0gMzsJLyogdGhpcyB2YWx1ZSBpcyBiYXNlZCBvbiBjb252ZXJnaW5nX2NvbnN0YW50ID0gNTAwMCAqLwotCQkJLyogYW5kIHNhbXBsaW5nX2ludGVydmFsID0gMTAwMCAqLwotCi0JaWYgKHJlY3Zwcml2LT5zaWduYWxfc3RyZW5ndGhfZGF0YS51cGRhdGVfcmVxID09IDApIHsKLQkJLyogIHVwZGF0ZV9yZXEgaXMgY2xlYXIsIG1lYW5zIHdlIGdvdCByeCAqLwotCQlhdmdfc2lnbmFsX3N0cmVuZ3RoID0gcmVjdnByaXYtPnNpZ25hbF9zdHJlbmd0aF9kYXRhLmF2Z192YWw7Ci0JCW51bV9zaWduYWxfc3RyZW5ndGggPSByZWN2cHJpdi0+c2lnbmFsX3N0cmVuZ3RoX2RhdGEudG90YWxfbnVtOwotCQkvKiAgYWZ0ZXIgYXZnX3ZhbHMgYXJlIGFjcXVpcmVkLCB3ZSBjYW4gcmUtc3RhdCAqLwotCQkvKiB0aGUgc2lnbmFsIHZhbHVlcyAqLwotCQlyZWN2cHJpdi0+c2lnbmFsX3N0cmVuZ3RoX2RhdGEudXBkYXRlX3JlcSA9IDE7Ci0JfQotCi0JaWYgKHJlY3Zwcml2LT5zaWduYWxfcXVhbF9kYXRhLnVwZGF0ZV9yZXEgPT0gMCkgewotCQkvKiAgdXBkYXRlX3JlcSBpcyBjbGVhciwgbWVhbnMgd2UgZ290IHJ4ICovCi0JCWF2Z19zaWduYWxfcXVhbCA9IHJlY3Zwcml2LT5zaWduYWxfcXVhbF9kYXRhLmF2Z192YWw7Ci0JCW51bV9zaWduYWxfcXVhbCA9IHJlY3Zwcml2LT5zaWduYWxfcXVhbF9kYXRhLnRvdGFsX251bTsKLQkJLyogIGFmdGVyIGF2Z192YWxzIGFyZSBhY3F1aXJlZCwgd2UgY2FuIHJlLXN0YXQgKi8KLQkJLyp0aGUgc2lnbmFsIHZhbHVlcyAqLwotCQlyZWN2cHJpdi0+c2lnbmFsX3F1YWxfZGF0YS51cGRhdGVfcmVxID0gMTsKLQl9Ci0KLQkvKiB1cGRhdGUgdmFsdWUgb2Ygc2lnbmFsX3N0cmVuZ3RoLCByc3NpLCBzaWduYWxfcXVhbCAqLwotCWlmICghY2hlY2tfZndzdGF0ZSgmYWRhcHRlci0+bWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpKSB7Ci0JCXRtcF9zID0gYXZnX3NpZ25hbF9zdHJlbmd0aCArIChfYWxwaGEgLSAxKSAqCi0JCQkgcmVjdnByaXYtPnNpZ25hbF9zdHJlbmd0aDsKLQkJaWYgKHRtcF9zICVfYWxwaGEpCi0JCQl0bXBfcyA9IHRtcF9zIC8gX2FscGhhICsgMTsKLQkJZWxzZQotCQkJdG1wX3MgPSB0bXBfcyAvIF9hbHBoYTsKLQkJaWYgKHRtcF9zID4gMTAwKQotCQkJdG1wX3MgPSAxMDA7Ci0KLQkJdG1wX3EgPSBhdmdfc2lnbmFsX3F1YWwgKyAoX2FscGhhIC0gMSkgKiByZWN2cHJpdi0+c2lnbmFsX3F1YWw7Ci0JCWlmICh0bXBfcSAlX2FscGhhKQotCQkJdG1wX3EgPSB0bXBfcSAvIF9hbHBoYSArIDE7Ci0JCWVsc2UKLQkJCXRtcF9xID0gdG1wX3EgLyBfYWxwaGE7Ci0JCWlmICh0bXBfcSA+IDEwMCkKLQkJCXRtcF9xID0gMTAwOwotCi0JCXJlY3Zwcml2LT5zaWduYWxfc3RyZW5ndGggPSB0bXBfczsKLQkJcmVjdnByaXYtPnNpZ25hbF9xdWFsID0gdG1wX3E7Ci0KLQkJREJHXzg3MjNBKCIlcyBzaWduYWxfc3RyZW5ndGg6JTN1LCBzaWduYWxfcXVhbDolM3UsICIKLQkJCSAgIm51bV9zaWduYWxfc3RyZW5ndGg6JXUsIG51bV9zaWduYWxfcXVhbDoldVxuIiwKLQkJCSAgX19mdW5jX18sIHJlY3Zwcml2LT5zaWduYWxfc3RyZW5ndGgsCi0JCQkgIHJlY3Zwcml2LT5zaWduYWxfcXVhbCwgbnVtX3NpZ25hbF9zdHJlbmd0aCwKLQkJCSAgbnVtX3NpZ25hbF9xdWFsKTsKLQl9Ci0KLQlydHdfc2V0X3NpZ25hbF9zdGF0X3RpbWVyKHJlY3Zwcml2KTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfc2VjdXJpdHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfc2VjdXJpdHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE0Y2ZkZjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19zZWN1cml0eS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgIF9SVFdfU0VDVVJJVFlfQ18KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDx3aWZpLmg+Ci0jaW5jbHVkZSA8b3NkZXBfaW50Zi5oPgotCi0vKiBXRVAgcmVsYXRlZCA9PT09PSAqLwotCi0jZGVmaW5lIENSQzMyX1BPTFkgMHgwNGMxMWRiNwotCi1zdHJ1Y3QgYXJjNGNvbnRleHQgewotCXUzMiB4OwotCXUzMiB5OwotCXU4IHN0YXRlWzI1Nl07Ci19OwotCi1zdGF0aWMgdm9pZCBhcmNmb3VyX2luaXQoc3RydWN0IGFyYzRjb250ZXh0ICpwYXJjNGN0eCwgdTggKmtleSwgdTMyIGtleV9sZW4pCi17Ci0JdTMyIHQsIHU7Ci0JdTMyIGtleWluZGV4OwotCXUzMiBzdGF0ZWluZGV4OwotCXU4ICpzdGF0ZTsKLQl1MzIgY291bnRlcjsKLQotCXN0YXRlID0gcGFyYzRjdHgtPnN0YXRlOwotCXBhcmM0Y3R4LT54ID0gMDsKLQlwYXJjNGN0eC0+eSA9IDA7Ci0JZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IDI1NjsgY291bnRlcisrKQotCQlzdGF0ZVtjb3VudGVyXSA9ICh1OCljb3VudGVyOwotCWtleWluZGV4ID0gMDsKLQlzdGF0ZWluZGV4ID0gMDsKLQlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspIHsKLQkJdCA9IHN0YXRlW2NvdW50ZXJdOwotCQlzdGF0ZWluZGV4ID0gKHN0YXRlaW5kZXggKyBrZXlba2V5aW5kZXhdICsgdCkgJiAweGZmOwotCQl1ID0gc3RhdGVbc3RhdGVpbmRleF07Ci0JCXN0YXRlW3N0YXRlaW5kZXhdID0gKHU4KXQ7Ci0JCXN0YXRlW2NvdW50ZXJdID0gKHU4KXU7Ci0JCWlmICgrK2tleWluZGV4ID49IGtleV9sZW4pCi0JCQlrZXlpbmRleCA9IDA7Ci0JfQotCi19Ci0KLXN0YXRpYyB1MzIgYXJjZm91cl9ieXRlKHN0cnVjdCBhcmM0Y29udGV4dCAqcGFyYzRjdHgpCi17Ci0JdTMyIHg7Ci0JdTMyIHk7Ci0JdTMyIHN4LCBzeTsKLQl1OCAqc3RhdGU7Ci0KLQlzdGF0ZSA9IHBhcmM0Y3R4LT5zdGF0ZTsKLQl4ID0gKHBhcmM0Y3R4LT54ICsgMSkgJiAweGZmOwotCXN4ID0gc3RhdGVbeF07Ci0JeSA9IChzeCArIHBhcmM0Y3R4LT55KSAmIDB4ZmY7Ci0Jc3kgPSBzdGF0ZVt5XTsKLQlwYXJjNGN0eC0+eCA9IHg7Ci0JcGFyYzRjdHgtPnkgPSB5OwotCXN0YXRlW3ldID0gKHU4KXN4OwotCXN0YXRlW3hdID0gKHU4KXN5OwotCi0JcmV0dXJuIHN0YXRlWyhzeCArIHN5KSAmIDB4ZmZdOwotfQotCi1zdGF0aWMgdm9pZCBhcmNmb3VyX2VuY3J5cHQoc3RydWN0IGFyYzRjb250ZXh0ICpwYXJjNGN0eCwgdTggKmRlc3QsCi0JCQkgICAgdTggKnNyYywgdTMyIGxlbikKLXsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJZGVzdFtpXSA9IHNyY1tpXSBeICh1bnNpZ25lZCBjaGFyKWFyY2ZvdXJfYnl0ZShwYXJjNGN0eCk7Ci19Ci0KLXN0YXRpYyBpbnQgYmNyYzMyaW5pdGlhbGl6ZWQ7Ci1zdGF0aWMgdTMyIGNyYzMyX3RhYmxlWzI1Nl07Ci0KLXN0YXRpYyB1OCBjcmMzMl9yZXZlcnNlQml0KHU4IGRhdGEpCi17Ci0JdTggcmV0dmFsID0gKChkYXRhIDw8IDcpICYgMHg4MCkgfCAoKGRhdGEgPDwgNSkgJiAweDQwKSB8Ci0JCSgoZGF0YSA8PCAzKSAmIDB4MjApIHwgKChkYXRhIDw8IDEpICYgMHgxMCkgfAotCQkoKGRhdGEgPj4gMSkgJiAweDA4KSB8ICgoZGF0YSA+PiAzKSAmIDB4MDQpIHwKLQkJKChkYXRhID4+IDUpICYgMHgwMikgfCAoKGRhdGEgPj4gNykgJiAweDAxKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgdm9pZCBjcmMzMl9pbml0KHZvaWQpCi17Ci0JaW50IGksIGo7Ci0JdTMyIGM7Ci0JdTggKnAsICpwMTsKLQl1OCBrOwotCi0JaWYgKGJjcmMzMmluaXRpYWxpemVkID09IDEpCi0JCXJldHVybjsKLQotCXAgPSAodTggKikgJmM7Ci0JYyA9IDB4MTIzNDAwMDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKLQkJayA9IGNyYzMyX3JldmVyc2VCaXQoKHU4KWkpOwotCi0JCWZvciAoYyA9ICgodTMyKWspIDw8IDI0LCBqID0gODsgaiA+IDA7IC0taikKLQkJCWMgPSBjICYgMHg4MDAwMDAwMCA/IChjIDw8IDEpIF4gQ1JDMzJfUE9MWSA6IChjIDw8IDEpOwotCi0JCXAxID0gKHU4ICopJmNyYzMyX3RhYmxlW2ldOwotCi0JCXAxWzBdID0gY3JjMzJfcmV2ZXJzZUJpdChwWzNdKTsKLQkJcDFbMV0gPSBjcmMzMl9yZXZlcnNlQml0KHBbMl0pOwotCQlwMVsyXSA9IGNyYzMyX3JldmVyc2VCaXQocFsxXSk7Ci0JCXAxWzNdID0gY3JjMzJfcmV2ZXJzZUJpdChwWzBdKTsKLQl9Ci0KLQliY3JjMzJpbml0aWFsaXplZCA9IDE7Ci19Ci0KLXN0YXRpYyB1MzIgZ2V0Y3JjMzIodTggKmJ1ZiwgaW50IGxlbikKLXsKLQl1OCAqcDsKLQl1MzIgY3JjOwotCi0JaWYgKGJjcmMzMmluaXRpYWxpemVkID09IDApCi0JCWNyYzMyX2luaXQoKTsKLQotCWNyYyA9IDB4ZmZmZmZmZmY7IC8qIHByZWxvYWQgc2hpZnQgcmVnaXN0ZXIsIHBlciBDUkMtMzIgc3BlYyAqLwotCi0JZm9yIChwID0gYnVmOyBsZW4gPiAwOyArK3AsIC0tbGVuKQotCQljcmMgPSBjcmMzMl90YWJsZVsoY3JjIF4gKnApICYgMHhmZl0gXiAoY3JjID4+IDgpOwotCi0JcmV0dXJuIH5jcmM7IC8qIHRyYW5zbWl0IGNvbXBsZW1lbnQsIHBlciBDUkMtMzIgc3BlYyAqLwotfQotCi0vKiBOZWVkIHRvIGNvbnNpZGVyIHRoZSBmcmFnbWVudCAgc2l0dWF0aW9uICovCi12b2lkIHJ0d193ZXBfZW5jcnlwdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKQotewotCS8qICBleGNsdWRlIElDViAqLwotCV9fbGUzMiBjcmM7Ci0Jc3RydWN0IGFyYzRjb250ZXh0IG15Y29udGV4dDsKLQlpbnQgY3VyZnJhZ251bSwgbGVuZ3RoLCBpbmRleDsKLQl1MzIga2V5bGVuZ3RoOwotCXU4ICpwZnJhbWUsICpwYXlsb2FkLCAqaXY7IC8qIHdlcGtleSAqLwotCXU4IHdlcGtleVsxNl07Ci0JdTggaHdfaGRyX29mZnNldCA9IDA7Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCWlmICghcHhtaXRmcmFtZS0+YnVmX2FkZHIpCi0JCXJldHVybjsKLQotCWh3X2hkcl9vZmZzZXQgPSBUWERFU0NfT0ZGU0VUOwotCi0JcGZyYW1lID0gcHhtaXRmcmFtZS0+YnVmX2FkZHIgKyBod19oZHJfb2Zmc2V0OwotCi0JLyogc3RhcnQgdG8gZW5jcnlwdCBlYWNoIGZyYWdtZW50ICovCi0JaWYgKHBhdHRyaWItPmVuY3J5cHQgIT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgJiYKLQkgICAgcGF0dHJpYi0+ZW5jcnlwdCAhPSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpCi0JCXJldHVybjsKLQotCWluZGV4ID0gcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5S2V5SW5kZXg7Ci0Ja2V5bGVuZ3RoID0gcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtpbmRleF0ua2V5bGVuOwotCi0JZm9yIChjdXJmcmFnbnVtID0gMDsgY3VyZnJhZ251bSA8IHBhdHRyaWItPm5yX2ZyYWdzIDsgY3VyZnJhZ251bSsrKSB7Ci0JCWl2ID0gcGZyYW1lICsgcGF0dHJpYi0+aGRybGVuOwotCQltZW1jcHkoJndlcGtleVswXSwgaXYsIDMpOwotCQltZW1jcHkoJndlcGtleVszXSwgJnBzZWN1cml0eXByaXYtPndlcF9rZXlbaW5kZXhdLmtleSwKLQkJICAgICAgIGtleWxlbmd0aCk7Ci0JCXBheWxvYWQgPSBwZnJhbWUgKyBwYXR0cmliLT5pdl9sZW4gKyBwYXR0cmliLT5oZHJsZW47Ci0KLQkJaWYgKChjdXJmcmFnbnVtICsgMSkgPT0gcGF0dHJpYi0+bnJfZnJhZ3MpIHsKLQkJCS8qIHRoZSBsYXN0IGZyYWdtZW50ICovCi0JCQlsZW5ndGggPSBwYXR0cmliLT5sYXN0X3R4Y21kc3ogLSBwYXR0cmliLT5oZHJsZW4gLQotCQkJCXBhdHRyaWItPml2X2xlbiAtIHBhdHRyaWItPmljdl9sZW47Ci0KLQkJCWNyYyA9IGNwdV90b19sZTMyKGdldGNyYzMyKHBheWxvYWQsIGxlbmd0aCkpOwotCi0JCQlhcmNmb3VyX2luaXQoJm15Y29udGV4dCwgd2Vwa2V5LCAzICsga2V5bGVuZ3RoKTsKLQkJCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkLCBwYXlsb2FkLCBsZW5ndGgpOwotCQkJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQgKyBsZW5ndGgsCi0JCQkJCShjaGFyICopJmNyYywgNCk7Ci0JCX0gZWxzZSB7Ci0JCQlsZW5ndGggPSBweG1pdHByaXYtPmZyYWdfbGVuIC0gcGF0dHJpYi0+aGRybGVuIC0KLQkJCQlwYXR0cmliLT5pdl9sZW4gLSBwYXR0cmliLT5pY3ZfbGVuOwotCQkJY3JjID0gY3B1X3RvX2xlMzIoZ2V0Y3JjMzIocGF5bG9hZCwgbGVuZ3RoKSk7Ci0JCQlhcmNmb3VyX2luaXQoJm15Y29udGV4dCwgd2Vwa2V5LCAzICsga2V5bGVuZ3RoKTsKLQkJCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkLCBwYXlsb2FkLCBsZW5ndGgpOwotCQkJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQgKyBsZW5ndGgsCi0JCQkJCShjaGFyICopJmNyYywgNCk7Ci0KLQkJCXBmcmFtZSArPSBweG1pdHByaXYtPmZyYWdfbGVuOwotCQkJcGZyYW1lID0gUFRSX0FMSUdOKHBmcmFtZSwgNCk7Ci0JCX0KLQl9Ci0KLX0KLQotdm9pZCBydHdfd2VwX2RlY3J5cHQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKLXsKLQkvKiAgZXhjbHVkZSBJQ1YgKi8KLQl1MzIgYWN0dWFsX2NyYywgZXhwZWN0ZWRfY3JjOwotCXN0cnVjdCBhcmM0Y29udGV4dCBteWNvbnRleHQ7Ci0JaW50IGxlbmd0aDsKLQl1MzIga2V5bGVuZ3RoOwotCXU4ICpwZnJhbWUsICpwYXlsb2FkLCAqaXYsIHdlcGtleVsxNl07Ci0JdTgga2V5aW5kZXg7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnByeGF0dHJpYiA9ICZwcmVjdmZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZmcmFtZS0+cGt0OwotCi0JcGZyYW1lID0gc2tiLT5kYXRhOwotCi0JLyogc3RhcnQgdG8gZGVjcnlwdCByZWN2ZnJhbWUgKi8KLQlpZiAocHJ4YXR0cmliLT5lbmNyeXB0ICE9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwICYmCi0JICAgIHByeGF0dHJpYi0+ZW5jcnlwdCAhPSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpCi0JCXJldHVybjsKLQotCWl2ID0gcGZyYW1lICsgcHJ4YXR0cmliLT5oZHJsZW47Ci0JLyoga2V5aW5kZXggPSAoaXZbM10mMHgzKTsgKi8KLQlrZXlpbmRleCA9IHByeGF0dHJpYi0+a2V5X2luZGV4OwotCWtleWxlbmd0aCA9IHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aW5kZXhdLmtleWxlbjsKLQltZW1jcHkoJndlcGtleVswXSwgaXYsIDMpOwotCS8qIG1lbWNweSgmd2Vwa2V5WzNdLCAmcHNlY3VyaXR5cHJpdi0+ZG90MTFEZWZLZXlbcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5S2V5SW5kZXhdLnNrZXlbMF0sIGtleWxlbmd0aCk7ICovCi0JbWVtY3B5KCZ3ZXBrZXlbM10sICZwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWluZGV4XS5rZXksIGtleWxlbmd0aCk7Ci0JbGVuZ3RoID0gc2tiLT5sZW4gLSBwcnhhdHRyaWItPmhkcmxlbiAtIHByeGF0dHJpYi0+aXZfbGVuOwotCi0JcGF5bG9hZCA9IHBmcmFtZSArIHByeGF0dHJpYi0+aXZfbGVuICsgcHJ4YXR0cmliLT5oZHJsZW47Ci0KLQkvKiBkZWNyeXB0IHBheWxvYWQgaW5jbHVkZSBpY3YgKi8KLQlhcmNmb3VyX2luaXQoJm15Y29udGV4dCwgd2Vwa2V5LCAzICsga2V5bGVuZ3RoKTsKLQlhcmNmb3VyX2VuY3J5cHQoJm15Y29udGV4dCwgcGF5bG9hZCwgcGF5bG9hZCwgbGVuZ3RoKTsKLQotCS8qIGNhbGN1bGF0ZSBpY3YgYW5kIGNvbXBhcmUgdGhlIGljdiAqLwotCWFjdHVhbF9jcmMgPSBnZXRjcmMzMihwYXlsb2FkLCBsZW5ndGggLSA0KTsKLQlleHBlY3RlZF9jcmMgPSBnZXRfdW5hbGlnbmVkX2xlMzIoJnBheWxvYWRbbGVuZ3RoIC0gNF0pOwotCi0JaWYgKGFjdHVhbF9jcmMgIT0gZXhwZWN0ZWRfY3JjKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkJICIlczppY3YgQ1JDIG1pc21hdGNoOiAiCi0JCQkgImFjdHVhbDogJTA4eCwgZXhwZWN0ZWQ6ICUwOHhcbiIsCi0JCQkgX19mdW5jX18sIGFjdHVhbF9jcmMsIGV4cGVjdGVkX2NyYyk7Ci0JfQotfQotCi0vKiAzCQk9PT09PSBUS0lQIHJlbGF0ZWQgPT09PT0gKi8KLQotc3RhdGljIHUzMiBzZWNtaWNnZXR1aW50MzIodTggKnApCi0vKiAgQ29udmVydCBmcm9tIEJ5dGVbXSB0byB1MzIgaW4gYSBwb3J0YWJsZSB3YXkgKi8KLXsKLQlzMzIgaTsKLQl1MzIgcmVzID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCXJlcyB8PSAoKHUzMikoKnArKykpIDw8ICg4ICogaSk7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgdm9pZCBzZWNtaWNwdXR1aW50MzIodTggKnAsIHUzMiB2YWwpCi0vKiAgQ29udmVydCBmcm9tIGxvbmcgdG8gQnl0ZVtdIGluIGEgcG9ydGFibGUgd2F5ICovCi17Ci0JbG9uZyBpOwotCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQkqcCsrID0gKHU4KSAodmFsICYgMHhmZik7Ci0JCXZhbCA+Pj0gODsKLQl9Ci0KLX0KLQotc3RhdGljIHZvaWQgc2VjbWljY2xlYXIoc3RydWN0IG1pY19kYXRhICpwbWljZGF0YSkKLXsKLS8qICBSZXNldCB0aGUgc3RhdGUgdG8gdGhlIGVtcHR5IG1lc3NhZ2UuICovCi0KLQlwbWljZGF0YS0+TCA9IHBtaWNkYXRhLT5LMDsKLQlwbWljZGF0YS0+UiA9IHBtaWNkYXRhLT5LMTsKLQlwbWljZGF0YS0+bkJ5dGVzSW5NID0gMDsKLQlwbWljZGF0YS0+TSA9IDA7Ci0KLX0KLQotdm9pZCBydHdfc2VjbWljc2V0a2V5MjNhKHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEsIHU4ICprZXkpCi17Ci0JLyogIFNldCB0aGUga2V5ICovCi0KLQlwbWljZGF0YS0+SzAgPSBzZWNtaWNnZXR1aW50MzIoa2V5KTsKLQlwbWljZGF0YS0+SzEgPSBzZWNtaWNnZXR1aW50MzIoa2V5ICsgNCk7Ci0JLyogIGFuZCByZXNldCB0aGUgbWVzc2FnZSAqLwotCXNlY21pY2NsZWFyKHBtaWNkYXRhKTsKLQotfQotCi12b2lkIHJ0d19zZWNtaWNhcHBlbmQyM2FieXRlMjNhKHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEsIHU4IGIpCi17Ci0KLQkvKiAgQXBwZW5kIHRoZSBieXRlIHRvIG91ciB3b3JkLXNpemVkIGJ1ZmZlciAqLwotCXBtaWNkYXRhLT5NIHw9ICgodW5zaWduZWQgbG9uZyliKSA8PCAoOCAqIHBtaWNkYXRhLT5uQnl0ZXNJbk0pOwotCXBtaWNkYXRhLT5uQnl0ZXNJbk0rKzsKLQkvKiAgUHJvY2VzcyB0aGUgd29yZCBpZiBpdCBpcyBmdWxsLiAqLwotCWlmIChwbWljZGF0YS0+bkJ5dGVzSW5NID49IDQpIHsKLQkJcG1pY2RhdGEtPkwgXj0gcG1pY2RhdGEtPk07Ci0JCXBtaWNkYXRhLT5SIF49IFJPTDMyKHBtaWNkYXRhLT5MLCAxNyk7Ci0JCXBtaWNkYXRhLT5MICs9IHBtaWNkYXRhLT5SOwotCQlwbWljZGF0YS0+UiBePSAoKHBtaWNkYXRhLT5MICYgMHhmZjAwZmYwMCkgPj4gOCkgfCAoKHBtaWNkYXRhLT5MICYgMHgwMGZmMDBmZikgPDwgOCk7Ci0JCXBtaWNkYXRhLT5MICs9IHBtaWNkYXRhLT5SOwotCQlwbWljZGF0YS0+UiBePSBST0wzMihwbWljZGF0YS0+TCwgMyk7Ci0JCXBtaWNkYXRhLT5MICs9IHBtaWNkYXRhLT5SOwotCQlwbWljZGF0YS0+UiBePSBST1IzMihwbWljZGF0YS0+TCwgMik7Ci0JCXBtaWNkYXRhLT5MICs9IHBtaWNkYXRhLT5SOwotCQkvKiAgQ2xlYXIgdGhlIGJ1ZmZlciAqLwotCQlwbWljZGF0YS0+TSA9IDA7Ci0JCXBtaWNkYXRhLT5uQnl0ZXNJbk0gPSAwOwotCX0KLQotfQotCi12b2lkIHJ0d19zZWNtaWNhcHBlbmQyM2Eoc3RydWN0IG1pY19kYXRhICpwbWljZGF0YSwgdTggKnNyYywgdTMyIG5ieXRlcykKLXsKLQotCS8qICBUaGlzIGlzIHNpbXBsZSAqLwotCXdoaWxlIChuYnl0ZXMgPiAwKSB7Ci0JCXJ0d19zZWNtaWNhcHBlbmQyM2FieXRlMjNhKHBtaWNkYXRhLCAqc3JjKyspOwotCQluYnl0ZXMtLTsKLQl9Ci0KLX0KLQotdm9pZCBydHdfc2VjZ2V0bWljMjNhKHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEsIHU4ICpkc3QpCi17Ci0KLQkvKiAgQXBwZW5kIHRoZSBtaW5pbXVtIHBhZGRpbmcgKi8KLQlydHdfc2VjbWljYXBwZW5kMjNhYnl0ZTIzYShwbWljZGF0YSwgMHg1YSk7Ci0JcnR3X3NlY21pY2FwcGVuZDIzYWJ5dGUyM2EocG1pY2RhdGEsIDApOwotCXJ0d19zZWNtaWNhcHBlbmQyM2FieXRlMjNhKHBtaWNkYXRhLCAwKTsKLQlydHdfc2VjbWljYXBwZW5kMjNhYnl0ZTIzYShwbWljZGF0YSwgMCk7Ci0JcnR3X3NlY21pY2FwcGVuZDIzYWJ5dGUyM2EocG1pY2RhdGEsIDApOwotCS8qICBhbmQgdGhlbiB6ZXJvZXMgdW50aWwgdGhlIGxlbmd0aCBpcyBhIG11bHRpcGxlIG9mIDQgKi8KLQl3aGlsZSAocG1pY2RhdGEtPm5CeXRlc0luTSAhPSAwKQotCQlydHdfc2VjbWljYXBwZW5kMjNhYnl0ZTIzYShwbWljZGF0YSwgMCk7Ci0JLyogIFRoZSBhcHBlbmRCeXRlIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGNvbXB1dGVkIHRoZSByZXN1bHQuICovCi0Jc2VjbWljcHV0dWludDMyKGRzdCwgcG1pY2RhdGEtPkwpOwotCXNlY21pY3B1dHVpbnQzMihkc3QgKyA0LCBwbWljZGF0YS0+Uik7Ci0JLyogIFJlc2V0IHRvIHRoZSBlbXB0eSBtZXNzYWdlLiAqLwotCXNlY21pY2NsZWFyKHBtaWNkYXRhKTsKLQotfQotCi12b2lkIHJ0d19zZWNjYWxjdGtpcG1pYzIzYSh1OCAqa2V5LCB1OCAqaGVhZGVyLCB1OCAqZGF0YSwgdTMyIGRhdGFfbGVuLAotCQkJICAgdTggKm1pY19jb2RlLCB1OCBwcmkpCi17Ci0KLQlzdHJ1Y3QgbWljX2RhdGEgbWljZGF0YTsKLQl1OCBwcmlvcml0eVs0XSA9IHsweDAsIDB4MCwgMHgwLCAweDB9OwotCi0JcnR3X3NlY21pY3NldGtleTIzYSgmbWljZGF0YSwga2V5KTsKLQlwcmlvcml0eVswXSA9IHByaTsKLQotCS8qIE1pY2hhZWwgTUlDIHBzZXVkbyBoZWFkZXI6IERBLCBTQSwgMyB4IDAsIFByaW9yaXR5ICovCi0JaWYgKGhlYWRlclsxXSYxKSB7IC8qIFRvRFMgPT0gMSAqLwotCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJmhlYWRlclsxNl0sIDYpOyAvKiBEQSAqLwotCQlpZiAoaGVhZGVyWzFdJjIpIC8qIEZyb20gRHMgPT0gMSAqLwotCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJmhlYWRlclsyNF0sIDYpOwotCQllbHNlCi0JCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmaGVhZGVyWzEwXSwgNik7Ci0JfSBlbHNlIHsgLyogVG9EUyA9PSAwICovCi0JCXJ0d19zZWNtaWNhcHBlbmQyM2EoJm1pY2RhdGEsICZoZWFkZXJbNF0sIDYpOyAvKiBEQSAqLwotCQlpZiAoaGVhZGVyWzFdJjIpIC8qIEZyb20gRHMgPT0gMSAqLwotCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJmhlYWRlclsxNl0sIDYpOwotCQllbHNlCi0JCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmaGVhZGVyWzEwXSwgNik7Ci0KLQl9Ci0JcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJnByaW9yaXR5WzBdLCA0KTsKLQotCXJ0d19zZWNtaWNhcHBlbmQyM2EoJm1pY2RhdGEsIGRhdGEsIGRhdGFfbGVuKTsKLQotCXJ0d19zZWNnZXRtaWMyM2EoJm1pY2RhdGEsIG1pY19jb2RlKTsKLQotfQotCi0vKiBtYWNyb3MgZm9yIGV4dHJhY3Rpb24vY3JlYXRpb24gb2YgdW5zaWduZWQgY2hhci91bnNpZ25lZCBzaG9ydCB2YWx1ZXMgICovCi0jZGVmaW5lIFJvdFIxKHYxNikgICAoKCgodjE2KSA+PiAxKSAmIDB4N0ZGRikgXiAoKCh2MTYpICYgMSkgPDwgMTUpKQotI2RlZmluZSAgIExvOCh2MTYpICAgKCh1OCkoKHYxNikgICAgICAgJiAweDAwRkYpKQotI2RlZmluZSAgIEhpOCh2MTYpICAgKCh1OCkoKCh2MTYpID4+IDgpICYgMHgwMEZGKSkKLSNkZWZpbmUgIExvMTYodjMyKSAgICgodTE2KSgodjMyKSAgICAgICAmIDB4RkZGRikpCi0jZGVmaW5lICBIaTE2KHYzMikgICAoKHUxNikoKCh2MzIpID4+IDE2KSAmIDB4RkZGRikpCi0jZGVmaW5lICBNazE2KGhpLCBsbykgKChsbykgXiAoKCh1MTYpKGhpKSkgPDwgOCkpCi0KLS8qIHNlbGVjdCB0aGUgTnRoIDE2LWJpdCB3b3JkIG9mIHRoZSB0ZW1wb3JhbCBrZXkgdW5zaWduZWQgY2hhciBhcnJheSBUS1tdICovCi0jZGVmaW5lICBUSzE2KE4pICAgICBNazE2KHRrWzIgKiAoTikgKyAxXSwgdGtbMiAqIChOKV0pCi0KLS8qIFMtYm94IGxvb2t1cDogMTYgYml0cyAtLT4gMTYgYml0cyAqLwotI2RlZmluZSBfU18odjE2KSAgICAgKFNib3gxWzBdW0xvOCh2MTYpXSBeIFNib3gxWzFdW0hpOCh2MTYpXSkKLQotLyogZml4ZWQgYWxnb3JpdGhtICJwYXJhbWV0ZXJzIiAqLwotI2RlZmluZSBQSEFTRTFfTE9PUF9DTlQgICA4ICAgIC8qIHRoaXMgbmVlZHMgdG8gYmUgImJpZyBlbm91Z2giICAgICAqLwotI2RlZmluZSBUQV9TSVpFICAgICAgICAgICA2ICAgIC8qICA0OC1iaXQgdHJhbnNtaXR0ZXIgYWRkcmVzcyAgICAgICAqLwotI2RlZmluZSBUS19TSVpFICAgICAgICAgIDE2ICAgIC8qIDEyOC1iaXQgdGVtcG9yYWwga2V5ICAgICAgICAgICAgICAqLwotI2RlZmluZSBQMUtfU0laRSAgICAgICAgIDEwICAgIC8qICA4MC1iaXQgUGhhc2UxIGtleSAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBSQzRfS0VZX1NJWkUgICAgIDE2ICAgIC8qIDEyOC1iaXQgUkM0S0VZICgxMDQgYml0cyB1bmtub3duKSAqLwotCi0vKiAyLXVuc2lnbmVkIGNoYXIgYnkgMi11bnNpZ25lZCBjaGFyIHN1YnNldCBvZiB0aGUgZnVsbCBBRVMgUy1ib3ggdGFibGUgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBTYm94MVsyXVsyNTZdID0gewotCS8qIFNib3ggZm9yIGhhc2ggKGNhbiBiZSBpbiBST00pICovCi0JewotCQkweEM2QTUsIDB4Rjg4NCwgMHhFRTk5LCAweEY2OEQsIDB4RkYwRCwgMHhENkJELCAweERFQjEsIDB4OTE1NCwKLQkJMHg2MDUwLCAweDAyMDMsIDB4Q0VBOSwgMHg1NjdELCAweEU3MTksIDB4QjU2MiwgMHg0REU2LCAweEVDOUEsCi0JCTB4OEY0NSwgMHgxRjlELCAweDg5NDAsIDB4RkE4NywgMHhFRjE1LCAweEIyRUIsIDB4OEVDOSwgMHhGQjBCLAotCQkweDQxRUMsIDB4QjM2NywgMHg1RkZELCAweDQ1RUEsIDB4MjNCRiwgMHg1M0Y3LCAweEU0OTYsIDB4OUI1QiwKLQkJMHg3NUMyLCAweEUxMUMsIDB4M0RBRSwgMHg0QzZBLCAweDZDNUEsIDB4N0U0MSwgMHhGNTAyLCAweDgzNEYsCi0JCTB4Njg1QywgMHg1MUY0LCAweEQxMzQsIDB4RjkwOCwgMHhFMjkzLCAweEFCNzMsIDB4NjI1MywgMHgyQTNGLAotCQkweDA4MEMsIDB4OTU1MiwgMHg0NjY1LCAweDlENUUsIDB4MzAyOCwgMHgzN0ExLCAweDBBMEYsIDB4MkZCNSwKLQkJMHgwRTA5LCAweDI0MzYsIDB4MUI5QiwgMHhERjNELCAweENEMjYsIDB4NEU2OSwgMHg3RkNELCAweEVBOUYsCi0JCTB4MTIxQiwgMHgxRDlFLCAweDU4NzQsIDB4MzQyRSwgMHgzNjJELCAweERDQjIsIDB4QjRFRSwgMHg1QkZCLAotCQkweEE0RjYsIDB4NzY0RCwgMHhCNzYxLCAweDdEQ0UsIDB4NTI3QiwgMHhERDNFLCAweDVFNzEsIDB4MTM5NywKLQkJMHhBNkY1LCAweEI5NjgsIDB4MDAwMCwgMHhDMTJDLCAweDQwNjAsIDB4RTMxRiwgMHg3OUM4LCAweEI2RUQsCi0JCTB4RDRCRSwgMHg4RDQ2LCAweDY3RDksIDB4NzI0QiwgMHg5NERFLCAweDk4RDQsIDB4QjBFOCwgMHg4NTRBLAotCQkweEJCNkIsIDB4QzUyQSwgMHg0RkU1LCAweEVEMTYsIDB4ODZDNSwgMHg5QUQ3LCAweDY2NTUsIDB4MTE5NCwKLQkJMHg4QUNGLCAweEU5MTAsIDB4MDQwNiwgMHhGRTgxLCAweEEwRjAsIDB4Nzg0NCwgMHgyNUJBLCAweDRCRTMsCi0JCTB4QTJGMywgMHg1REZFLCAweDgwQzAsIDB4MDU4QSwgMHgzRkFELCAweDIxQkMsIDB4NzA0OCwgMHhGMTA0LAotCQkweDYzREYsIDB4NzdDMSwgMHhBRjc1LCAweDQyNjMsIDB4MjAzMCwgMHhFNTFBLCAweEZEMEUsIDB4QkY2RCwKLQkJMHg4MTRDLCAweDE4MTQsIDB4MjYzNSwgMHhDMzJGLCAweEJFRTEsIDB4MzVBMiwgMHg4OENDLCAweDJFMzksCi0JCTB4OTM1NywgMHg1NUYyLCAweEZDODIsIDB4N0E0NywgMHhDOEFDLCAweEJBRTcsIDB4MzIyQiwgMHhFNjk1LAotCQkweEMwQTAsIDB4MTk5OCwgMHg5RUQxLCAweEEzN0YsIDB4NDQ2NiwgMHg1NDdFLCAweDNCQUIsIDB4MEI4MywKLQkJMHg4Q0NBLCAweEM3MjksIDB4NkJEMywgMHgyODNDLCAweEE3NzksIDB4QkNFMiwgMHgxNjFELCAweEFENzYsCi0JCTB4REIzQiwgMHg2NDU2LCAweDc0NEUsIDB4MTQxRSwgMHg5MkRCLCAweDBDMEEsIDB4NDg2QywgMHhCOEU0LAotCQkweDlGNUQsIDB4QkQ2RSwgMHg0M0VGLCAweEM0QTYsIDB4MzlBOCwgMHgzMUE0LCAweEQzMzcsIDB4RjI4QiwKLQkJMHhENTMyLCAweDhCNDMsIDB4NkU1OSwgMHhEQUI3LCAweDAxOEMsIDB4QjE2NCwgMHg5Q0QyLCAweDQ5RTAsCi0JCTB4RDhCNCwgMHhBQ0ZBLCAweEYzMDcsIDB4Q0YyNSwgMHhDQUFGLCAweEY0OEUsIDB4NDdFOSwgMHgxMDE4LAotCQkweDZGRDUsIDB4RjA4OCwgMHg0QTZGLCAweDVDNzIsIDB4MzgyNCwgMHg1N0YxLCAweDczQzcsIDB4OTc1MSwKLQkJMHhDQjIzLCAweEExN0MsIDB4RTg5QywgMHgzRTIxLCAweDk2REQsIDB4NjFEQywgMHgwRDg2LCAweDBGODUsCi0JCTB4RTA5MCwgMHg3QzQyLCAweDcxQzQsIDB4Q0NBQSwgMHg5MEQ4LCAweDA2MDUsIDB4RjcwMSwgMHgxQzEyLAotCQkweEMyQTMsIDB4NkE1RiwgMHhBRUY5LCAweDY5RDAsIDB4MTc5MSwgMHg5OTU4LCAweDNBMjcsIDB4MjdCOSwKLQkJMHhEOTM4LCAweEVCMTMsIDB4MkJCMywgMHgyMjMzLCAweEQyQkIsIDB4QTk3MCwgMHgwNzg5LCAweDMzQTcsCi0JCTB4MkRCNiwgMHgzQzIyLCAweDE1OTIsIDB4QzkyMCwgMHg4NzQ5LCAweEFBRkYsIDB4NTA3OCwgMHhBNTdBLAotCQkweDAzOEYsIDB4NTlGOCwgMHgwOTgwLCAweDFBMTcsIDB4NjVEQSwgMHhENzMxLCAweDg0QzYsIDB4RDBCOCwKLQkJMHg4MkMzLCAweDI5QjAsIDB4NUE3NywgMHgxRTExLCAweDdCQ0IsIDB4QThGQywgMHg2REQ2LCAweDJDM0EsCi0JfSwKLQl7IC8qIHNlY29uZCBoYWxmIG9mIHRhYmxlIGlzIHVuc2lnbmVkIGNoYXItcmV2ZXJzZWQgdmVyc2lvbiBvZiBmaXJzdCEgKi8KLQkJMHhBNUM2LCAweDg0RjgsIDB4OTlFRSwgMHg4REY2LCAweDBERkYsIDB4QkRENiwgMHhCMURFLCAweDU0OTEsCi0JCTB4NTA2MCwgMHgwMzAyLCAweEE5Q0UsIDB4N0Q1NiwgMHgxOUU3LCAweDYyQjUsIDB4RTY0RCwgMHg5QUVDLAotCQkweDQ1OEYsIDB4OUQxRiwgMHg0MDg5LCAweDg3RkEsIDB4MTVFRiwgMHhFQkIyLCAweEM5OEUsIDB4MEJGQiwKLQkJMHhFQzQxLCAweDY3QjMsIDB4RkQ1RiwgMHhFQTQ1LCAweEJGMjMsIDB4Rjc1MywgMHg5NkU0LCAweDVCOUIsCi0JCTB4QzI3NSwgMHgxQ0UxLCAweEFFM0QsIDB4NkE0QywgMHg1QTZDLCAweDQxN0UsIDB4MDJGNSwgMHg0RjgzLAotCQkweDVDNjgsIDB4RjQ1MSwgMHgzNEQxLCAweDA4RjksIDB4OTNFMiwgMHg3M0FCLCAweDUzNjIsIDB4M0YyQSwKLQkJMHgwQzA4LCAweDUyOTUsIDB4NjU0NiwgMHg1RTlELCAweDI4MzAsIDB4QTEzNywgMHgwRjBBLCAweEI1MkYsCi0JCTB4MDkwRSwgMHgzNjI0LCAweDlCMUIsIDB4M0RERiwgMHgyNkNELCAweDY5NEUsIDB4Q0Q3RiwgMHg5RkVBLAotCQkweDFCMTIsIDB4OUUxRCwgMHg3NDU4LCAweDJFMzQsIDB4MkQzNiwgMHhCMkRDLCAweEVFQjQsIDB4RkI1QiwKLQkJMHhGNkE0LCAweDRENzYsIDB4NjFCNywgMHhDRTdELCAweDdCNTIsIDB4M0VERCwgMHg3MTVFLCAweDk3MTMsCi0JCTB4RjVBNiwgMHg2OEI5LCAweDAwMDAsIDB4MkNDMSwgMHg2MDQwLCAweDFGRTMsIDB4Qzg3OSwgMHhFREI2LAotCQkweEJFRDQsIDB4NDY4RCwgMHhEOTY3LCAweDRCNzIsIDB4REU5NCwgMHhENDk4LCAweEU4QjAsIDB4NEE4NSwKLQkJMHg2QkJCLCAweDJBQzUsIDB4RTU0RiwgMHgxNkVELCAweEM1ODYsIDB4RDc5QSwgMHg1NTY2LCAweDk0MTEsCi0JCTB4Q0Y4QSwgMHgxMEU5LCAweDA2MDQsIDB4ODFGRSwgMHhGMEEwLCAweDQ0NzgsIDB4QkEyNSwgMHhFMzRCLAotCQkweEYzQTIsIDB4RkU1RCwgMHhDMDgwLCAweDhBMDUsIDB4QUQzRiwgMHhCQzIxLCAweDQ4NzAsIDB4MDRGMSwKLQkJMHhERjYzLCAweEMxNzcsIDB4NzVBRiwgMHg2MzQyLCAweDMwMjAsIDB4MUFFNSwgMHgwRUZELCAweDZEQkYsCi0JCTB4NEM4MSwgMHgxNDE4LCAweDM1MjYsIDB4MkZDMywgMHhFMUJFLCAweEEyMzUsIDB4Q0M4OCwgMHgzOTJFLAotCQkweDU3OTMsIDB4RjI1NSwgMHg4MkZDLCAweDQ3N0EsIDB4QUNDOCwgMHhFN0JBLCAweDJCMzIsIDB4OTVFNiwKLQkJMHhBMEMwLCAweDk4MTksIDB4RDE5RSwgMHg3RkEzLCAweDY2NDQsIDB4N0U1NCwgMHhBQjNCLCAweDgzMEIsCi0JCTB4Q0E4QywgMHgyOUM3LCAweEQzNkIsIDB4M0MyOCwgMHg3OUE3LCAweEUyQkMsIDB4MUQxNiwgMHg3NkFELAotCQkweDNCREIsIDB4NTY2NCwgMHg0RTc0LCAweDFFMTQsIDB4REI5MiwgMHgwQTBDLCAweDZDNDgsIDB4RTRCOCwKLQkJMHg1RDlGLCAweDZFQkQsIDB4RUY0MywgMHhBNkM0LCAweEE4MzksIDB4QTQzMSwgMHgzN0QzLCAweDhCRjIsCi0JCTB4MzJENSwgMHg0MzhCLCAweDU5NkUsIDB4QjdEQSwgMHg4QzAxLCAweDY0QjEsIDB4RDI5QywgMHhFMDQ5LAotCQkweEI0RDgsIDB4RkFBQywgMHgwN0YzLCAweDI1Q0YsIDB4QUZDQSwgMHg4RUY0LCAweEU5NDcsIDB4MTgxMCwKLQkJMHhENTZGLCAweDg4RjAsIDB4NkY0QSwgMHg3MjVDLCAweDI0MzgsIDB4RjE1NywgMHhDNzczLCAweDUxOTcsCi0JCTB4MjNDQiwgMHg3Q0ExLCAweDlDRTgsIDB4MjEzRSwgMHhERDk2LCAweERDNjEsIDB4ODYwRCwgMHg4NTBGLAotCQkweDkwRTAsIDB4NDI3QywgMHhDNDcxLCAweEFBQ0MsIDB4RDg5MCwgMHgwNTA2LCAweDAxRjcsIDB4MTIxQywKLQkJMHhBM0MyLCAweDVGNkEsIDB4RjlBRSwgMHhEMDY5LCAweDkxMTcsIDB4NTg5OSwgMHgyNzNBLCAweEI5MjcsCi0JCTB4MzhEOSwgMHgxM0VCLCAweEIzMkIsIDB4MzMyMiwgMHhCQkQyLCAweDcwQTksIDB4ODkwNywgMHhBNzMzLAotCQkweEI2MkQsIDB4MjIzQywgMHg5MjE1LCAweDIwQzksIDB4NDk4NywgMHhGRkFBLCAweDc4NTAsIDB4N0FBNSwKLQkJMHg4RjAzLCAweEY4NTksIDB4ODAwOSwgMHgxNzFBLCAweERBNjUsIDB4MzFENywgMHhDNjg0LCAweEI4RDAsCi0JCTB4QzM4MiwgMHhCMDI5LCAweDc3NUEsIDB4MTExRSwgMHhDQjdCLCAweEZDQTgsIDB4RDY2RCwgMHgzQTJDLAotCX0KLX07Ci0KLSAvKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBSb3V0aW5lOiBQaGFzZSAxIC0tIGdlbmVyYXRlIFAxSywgZ2l2ZW4gVEEsIFRLLCBJVjMyCi0qCi0qIElucHV0czoKLSogICAgIHRrW10gICAgICA9IHRlbXBvcmFsIGtleSAgICAgICAgICAgICAgICAgICAgICAgICBbMTI4IGJpdHNdCi0qICAgICB0YVtdICAgICAgPSB0cmFuc21pdHRlcidzIE1BQyBhZGRyZXNzICAgICAgICAgICAgWyA0OCBiaXRzXQotKiAgICAgaXYzMiAgICAgID0gdXBwZXIgMzIgYml0cyBvZiBJViAgICAgICAgICAgICAgICAgIFsgMzIgYml0c10KLSogT3V0cHV0OgotKiAgICAgcDFrW10gICAgID0gUGhhc2UgMSBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgIFsgODAgYml0c10KLSoKLSogTm90ZToKLSogICAgIFRoaXMgZnVuY3Rpb24gb25seSBuZWVkcyB0byBiZSBjYWxsZWQgZXZlcnkgMioqMTYgcGFja2V0cywKLSogICAgIGFsdGhvdWdoIGluIHRoZW9yeSBpdCBjb3VsZCBiZSBjYWxsZWQgZXZlcnkgcGFja2V0LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXN0YXRpYyB2b2lkIHBoYXNlMSh1MTYgKnAxaywgY29uc3QgdTggKnRrLCBjb25zdCB1OCAqdGEsIHUzMiBpdjMyKQotewotCWludCAgaTsKLQotCS8qIEluaXRpYWxpemUgdGhlIDgwIGJpdHMgb2YgUDFLW10gZnJvbSBJVjMyIGFuZCBUQVswLi41XSAqLwotCXAxa1swXSAgICAgID0gTG8xNihpdjMyKTsKLQlwMWtbMV0gICAgICA9IEhpMTYoaXYzMik7Ci0JcDFrWzJdICAgICAgPSBNazE2KHRhWzFdLCB0YVswXSk7IC8qIHVzZSBUQVtdIGFzIGxpdHRsZS1lbmRpYW4gKi8KLQlwMWtbM10gICAgICA9IE1rMTYodGFbM10sIHRhWzJdKTsKLQlwMWtbNF0gICAgICA9IE1rMTYodGFbNV0sIHRhWzRdKTsKLQotCS8qIE5vdyBjb21wdXRlIGFuIHVuYmFsYW5jZWQgRmVpc3RlbCBjaXBoZXIgd2l0aCA4MC1iaXQgYmxvY2sgKi8KLQkvKiBzaXplIG9uIHRoZSA4MC1iaXQgYmxvY2sgUDFLW10sIHVzaW5nIHRoZSAxMjgtYml0IGtleSBUS1tdICovCi0JZm9yIChpID0gMDsgaSA8IFBIQVNFMV9MT09QX0NOVDsgaSsrKSB7Ci0JCS8qIEVhY2ggYWRkIG9wZXJhdGlvbiBoZXJlIGlzIG1vZCAyKioxNiAqLwotCQlwMWtbMF0gKz0gX1NfKHAxa1s0XSBeIFRLMTYoKGkgJiAxKSArIDApKTsKLQkJcDFrWzFdICs9IF9TXyhwMWtbMF0gXiBUSzE2KChpICYgMSkgKyAyKSk7Ci0JCXAxa1syXSArPSBfU18ocDFrWzFdIF4gVEsxNigoaSAmIDEpICsgNCkpOwotCQlwMWtbM10gKz0gX1NfKHAxa1syXSBeIFRLMTYoKGkgJiAxKSArIDYpKTsKLQkJcDFrWzRdICs9IF9TXyhwMWtbM10gXiBUSzE2KChpICYgMSkgKyAwKSk7Ci0JCXAxa1s0XSArPSAgKHVuc2lnbmVkIHNob3J0KSBpOyAvKiBhdm9pZCAic2xpZGUgYXR0YWNrcyIgKi8KLQkJfQotCi19Ci0KLS8qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIFJvdXRpbmU6IFBoYXNlIDIgLS0gZ2VuZXJhdGUgUkM0S0VZLCBnaXZlbiBUSywgUDFLLCBJVjE2Ci0qCi0qIElucHV0czoKLSogICAgIHRrW10gICAgICA9IFRlbXBvcmFsIGtleSAgICAgICAgICAgICAgICAgICAgICAgICBbMTI4IGJpdHNdCi0qICAgICBwMWtbXSAgICAgPSBQaGFzZSAxIG91dHB1dCBrZXkgICAgICAgICAgICAgICAgICAgWyA4MCBiaXRzXQotKiAgICAgaXYxNiAgICAgID0gbG93IDE2IGJpdHMgb2YgSVYgY291bnRlciAgICAgICAgICAgIFsgMTYgYml0c10KLSogT3V0cHV0OgotKiAgICAgcmM0a2V5W10gID0gdGhlIGtleSB1c2VkIHRvIGVuY3J5cHQgdGhlIHBhY2tldCAgIFsxMjggYml0c10KLSoKLSogTm90ZToKLSogICAgIFRoZSB2YWx1ZSB7VEEsIElWMzIsIElWMTZ9IGZvciBQaGFzZTEvUGhhc2UyIG11c3QgYmUgdW5pcXVlCi0qICAgICBhY3Jvc3MgYWxsIHBhY2tldHMgdXNpbmcgdGhlIHNhbWUga2V5IFRLIHZhbHVlLiBUaGVuLCBmb3IgYQotKiAgICAgZ2l2ZW4gdmFsdWUgb2YgVEtbXSwgdGhpcyBUS0lQNDggY29uc3RydWN0aW9uIGd1YXJhbnRlZXMgdGhhdAotKiAgICAgdGhlIGZpbmFsIFJDNEtFWSB2YWx1ZSBpcyB1bmlxdWUgYWNyb3NzIGFsbCBwYWNrZXRzLgotKgotKiBTdWdnZXN0ZWQgaW1wbGVtZW50YXRpb24gb3B0aW1pemF0aW9uOiBpZiBQUEtbXSBpcyAib3ZlcmxhaWQiCi0qICAgICBhcHByb3ByaWF0ZWx5IG9uIFJDNEtFWVtdLCB0aGVyZSBpcyBubyBuZWVkIGZvciB0aGUgZmluYWwKLSogICAgIGZvciBsb29wIGJlbG93IHRoYXQgY29waWVzIHRoZSBQUEtbXSByZXN1bHQgaW50byBSQzRLRVlbXS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgdm9pZCBwaGFzZTIodTggKnJjNGtleSwgY29uc3QgdTggKnRrLCBjb25zdCB1MTYgKnAxaywgdTE2IGl2MTYpCi17Ci0JaW50ICBpOwotCXUxNiBQUEtbNl07IC8qIHRlbXBvcmFyeSBrZXkgZm9yIG1peGluZyAgICAqLwotCi0JLyogTm90ZTogYWxsIGFkZHMgaW4gdGhlIFBQS1tdIGVxdWF0aW9ucyBiZWxvdyBhcmUgbW9kIDIqKjE2ICovCi0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLQkJUFBLW2ldID0gcDFrW2ldOyAvKiBmaXJzdCwgY29weSBQMUsgdG8gUFBLICovCi0KLQlQUEtbNV0gPSBwMWtbNF0gKyBpdjE2OyAvKiBuZXh0LCAgYWRkIGluIElWMTYgKi8KLQotCS8qIEJpamVjdGl2ZSBub24tbGluZWFyIG1peGluZyBvZiB0aGUgOTYgYml0cyBvZiBQUEtbMC4uNV0gKi8KLQlQUEtbMF0gKz0gX1NfKFBQS1s1XSBeIFRLMTYoMCkpOyAvKiBNaXgga2V5IGluIGVhY2ggInJvdW5kIiAqLwotCVBQS1sxXSArPSBfU18oUFBLWzBdIF4gVEsxNigxKSk7Ci0JUFBLWzJdICs9IF9TXyhQUEtbMV0gXiBUSzE2KDIpKTsKLQlQUEtbM10gKz0gX1NfKFBQS1syXSBeIFRLMTYoMykpOwotCVBQS1s0XSArPSBfU18oUFBLWzNdIF4gVEsxNig0KSk7Ci0JUFBLWzVdICs9IF9TXyhQUEtbNF0gXiBUSzE2KDUpKTsgLyogVG90YWwgIyBTLWJveCBsb29rdXBzID09IDYgKi8KLQotCS8qIEZpbmFsIHN3ZWVwOiBiaWplY3RpdmUsICJsaW5lYXIiLiBSb3RhdGVzIGtpbGwgTFNCIGNvcnJlbGF0aW9ucyAqLwotCVBQS1swXSArPSAgUm90UjEoUFBLWzVdIF4gVEsxNig2KSk7Ci0JUFBLWzFdICs9ICBSb3RSMShQUEtbMF0gXiBUSzE2KDcpKTsgLyogVXNlIGFsbCBvZiBUS1tdIGluIFBoYXNlMiAqLwotCVBQS1syXSArPSAgUm90UjEoUFBLWzFdKTsKLQlQUEtbM10gKz0gIFJvdFIxKFBQS1syXSk7Ci0JUFBLWzRdICs9ICBSb3RSMShQUEtbM10pOwotCVBQS1s1XSArPSAgUm90UjEoUFBLWzRdKTsKLQkvKiBOb3RlOiBBdCB0aGlzIHBvaW50LCBmb3IgYSBnaXZlbiBrZXkgVEtbMC4uMTVdLCB0aGUgOTYtYml0IG91dHB1dCAqLwotCS8qICAgICAgIHZhbHVlIFBQS1swLi41XSBpcyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSwgYXMgYSBmdW5jdGlvbiAgICovCi0JLyogICAgICAgb2YgdGhlIDk2LWJpdCAiaW5wdXQiIHZhbHVlICAge1RBLCBJVjMyLCBJVjE2fS4gVGhhdCBpcywgICAgKi8KLQkvKiAgICAgICBQMUsgaXMgbm93IGEga2V5ZWQgcGVybXV0YXRpb24gb2Yge1RBLCBJVjMyLCBJVjE2fS4gICAgICAgICAqLwotCi0JLyogU2V0IFJDNEtFWVswLi4zXSwgd2hpY2ggaW5jbHVkZXMgImNsZWFydGV4dCIgcG9ydGlvbiBvZiBSQzQga2V5ICAgKi8KLQlyYzRrZXlbMF0gPSBIaTgoaXYxNik7ICAgICAgICAgICAgICAgICAvKiBSQzRLRVlbMC4uMl0gaXMgdGhlIFdFUCBJViAqLwotCXJjNGtleVsxXSA9IChIaTgoaXYxNikgfCAweDIwKSAmIDB4N0Y7IC8qIEhlbHAgYXZvaWQgd2VhayAoRk1TKSBrZXlzICovCi0JcmM0a2V5WzJdID0gTG84KGl2MTYpOwotCXJjNGtleVszXSA9IExvOCgoUFBLWzVdIF4gVEsxNigwKSkgPj4gMSk7Ci0KLQkvKiBDb3B5IDk2IGJpdHMgb2YgUFBLWzAuLjVdIHRvIFJDNEtFWVs0Li4xNV0gIChsaXR0bGUtZW5kaWFuKSAqLwotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKLQkJcmM0a2V5WzQgKyAyICogaV0gPSBMbzgoUFBLW2ldKTsKLQkJcmM0a2V5WzUgKyAyICogaV0gPSBIaTgoUFBLW2ldKTsKLQl9Ci0KLX0KLQotLyogVGhlIGhsZW4gaXNuJ3QgaW5jbHVkZSB0aGUgSVYgKi8KLWludCBydHdfdGtpcF9lbmNyeXB0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQl1MTYgcG5sOwotCXUzMiBwbmg7Ci0JdTggcmM0a2V5WzE2XTsKLQl1OCB0dGtleVsxNl07Ci0JX19sZTMyIGNyYzsKLQl1OCBod19oZHJfb2Zmc2V0ID0gMDsKLQlzdHJ1Y3QgYXJjNGNvbnRleHQgbXljb250ZXh0OwotCWludCBjdXJmcmFnbnVtLCBsZW5ndGg7Ci0JdTggKnBmcmFtZSwgKnBheWxvYWQsICppdiwgKnByd3NrZXk7Ci0JdW5pb24gcG40OCBkb3QxMXR4cG47Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGFpbmZvOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JaWYgKHBhdHRyaWItPmVuY3J5cHQgIT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkKLQkJcmV0dXJuIF9GQUlMOwotCi0JaWYgKCFweG1pdGZyYW1lLT5idWZfYWRkcikKLQkJcmV0dXJuIF9GQUlMOwotCi0JaHdfaGRyX29mZnNldCA9IFRYREVTQ19PRkZTRVQ7Ci0KLQlwZnJhbWUgPSBweG1pdGZyYW1lLT5idWZfYWRkciArIGh3X2hkcl9vZmZzZXQ7Ci0KLQlpZiAocGF0dHJpYi0+cHN0YSkKLQkJc3RhaW5mbyA9IHBhdHRyaWItPnBzdGE7Ci0JZWxzZSB7Ci0JCURCR184NzIzQSgiJXMsIGNhbGwgcnR3X2dldF9zdGFpbmZvKClcbiIsIF9fZnVuY19fKTsKLQkJc3RhaW5mbyA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsCi0JCQkJCSAgICAgJnBhdHRyaWItPnJhWzBdKTsKLQl9Ci0KLQlpZiAoIXN0YWluZm8pIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOiBzdGFpbmZvID09IE5VTEwhISFcbiIsIF9fZnVuY19fKTsKLQkJREJHXzg3MjNBKCIlcywgcHN0YSA9PSBOVUxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkgIiVzOiBzdGFpbmZvIT0gTlVMTCEhIVxuIiwgX19mdW5jX18pOwotCi0JaWYgKCEoc3RhaW5mby0+c3RhdGUgJiBfRldfTElOS0VEKSkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhLT5zdGF0ZSgweCV4KSAhPSBfRldfTElOS0VEXG4iLCBfX2Z1bmNfXywgc3RhaW5mby0+c3RhdGUpOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPnJhKSkKLQkJcHJ3c2tleSA9IHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlbcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleWlkXS5za2V5OwotCWVsc2UKLQkJcHJ3c2tleSA9ICZzdGFpbmZvLT5kb3QxMTgwMjF4X1VuY3N0S2V5LnNrZXlbMF07Ci0KLQkvKiA0IHN0YXJ0IHRvIGVuY3J5cHQgZWFjaCBmcmFnbWVudCAqLwotCWZvciAoY3VyZnJhZ251bSA9IDA7IGN1cmZyYWdudW0gPCBwYXR0cmliLT5ucl9mcmFnczsgY3VyZnJhZ251bSsrKSB7Ci0JCWl2ID0gcGZyYW1lICsgcGF0dHJpYi0+aGRybGVuOwotCQlwYXlsb2FkID0gcGZyYW1lICsgcGF0dHJpYi0+aXZfbGVuICsgcGF0dHJpYi0+aGRybGVuOwotCi0JCUdFVF9US0lQX1BOKGl2LCBkb3QxMXR4cG4pOwotCi0JCXBubCA9ICh1MTYpKGRvdDExdHhwbi52YWwpOwotCQlwbmggPSAodTMyKShkb3QxMXR4cG4udmFsPj4xNik7Ci0KLQkJcGhhc2UxKCh1MTYgKikmdHRrZXlbMF0sIHByd3NrZXksICZwYXR0cmliLT50YVswXSwgcG5oKTsKLQotCQlwaGFzZTIoJnJjNGtleVswXSwgcHJ3c2tleSwgKHUxNiAqKSZ0dGtleVswXSwgcG5sKTsKLQotCQlpZiAoKGN1cmZyYWdudW0gKyAxKSA9PSBwYXR0cmliLT5ucl9mcmFncykgeyAvKiA0IHRoZSBsYXN0IGZyYWdtZW50ICovCi0JCQlsZW5ndGggPSAocGF0dHJpYi0+bGFzdF90eGNtZHN6IC0KLQkJCQkgIHBhdHRyaWItPmhkcmxlbiAtCi0JCQkJICBwYXR0cmliLT5pdl9sZW4gLQotCQkJCSAgcGF0dHJpYi0+aWN2X2xlbik7Ci0KLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9pbmZvXywKLQkJCQkgInBhdHRyaWItPml2X2xlbiA9JXgsIHBhdHRyaWItPmljdl9sZW4gPSV4XG4iLAotCQkJCSBwYXR0cmliLT5pdl9sZW4sCi0JCQkJIHBhdHRyaWItPmljdl9sZW4pOwotCQkJY3JjID0gY3B1X3RvX2xlMzIoZ2V0Y3JjMzIocGF5bG9hZCwgbGVuZ3RoKSk7Ci0KLQkJCWFyY2ZvdXJfaW5pdCgmbXljb250ZXh0LCByYzRrZXksIDE2KTsKLQkJCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkLCBwYXlsb2FkLCBsZW5ndGgpOwotCQkJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQgKyBsZW5ndGgsCi0JCQkJCShjaGFyICopJmNyYywgNCk7Ci0KLQkJfSBlbHNlIHsKLQkJCWxlbmd0aCA9IChweG1pdHByaXYtPmZyYWdfbGVuIC0KLQkJCQkgIHBhdHRyaWItPmhkcmxlbiAtCi0JCQkJICBwYXR0cmliLT5pdl9sZW4gLQotCQkJCSAgcGF0dHJpYi0+aWN2X2xlbik7Ci0KLQkJCWNyYyA9IGNwdV90b19sZTMyKGdldGNyYzMyKHBheWxvYWQsIGxlbmd0aCkpOwotCQkJYXJjZm91cl9pbml0KCZteWNvbnRleHQsIHJjNGtleSwgMTYpOwotCQkJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQsIHBheWxvYWQsIGxlbmd0aCk7Ci0JCQlhcmNmb3VyX2VuY3J5cHQoJm15Y29udGV4dCwgcGF5bG9hZCArIGxlbmd0aCwKLQkJCQkJKGNoYXIgKikmY3JjLCA0KTsKLQotCQkJcGZyYW1lICs9IHB4bWl0cHJpdi0+ZnJhZ19sZW47Ci0JCQlwZnJhbWUgID0gUFRSX0FMSUdOKHBmcmFtZSwgNCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0vKiBUaGUgaGxlbiBpc24ndCBpbmNsdWRlIHRoZSBJViAqLwotaW50IHJ0d190a2lwX2RlY3J5cHQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQotewotCXUxNiBwbmw7Ci0JdTMyIHBuaDsKLQl1OCByYzRrZXlbMTZdOwotCXU4IHR0a2V5WzE2XTsKLQl1MzIgYWN0dWFsX2NyYywgZXhwZWN0ZWRfY3JjOwotCXN0cnVjdCBhcmM0Y29udGV4dCBteWNvbnRleHQ7Ci0JaW50IGxlbmd0aDsKLQl1OCAqcGZyYW1lLCAqcGF5bG9hZCwgKml2LCAqcHJ3c2tleTsKLQl1bmlvbiBwbjQ4IGRvdDExdHhwbjsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YWluZm87Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnByeGF0dHJpYiA9ICZwcmVjdmZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZmcmFtZS0+cGt0OwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCWlmIChwcnhhdHRyaWItPmVuY3J5cHQgIT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkKLQkJcmV0dXJuIF9GQUlMOwotCi0JcGZyYW1lID0gc2tiLT5kYXRhOwotCi0Jc3RhaW5mbyA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsCi0JCQkJICAgICAmcHJ4YXR0cmliLT50YVswXSk7Ci0JaWYgKCFzdGFpbmZvKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkJICIlczogc3RhaW5mbyA9PSBOVUxMISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQkvKiA0IHN0YXJ0IHRvIGRlY3J5cHQgcmVjdmZyYW1lICovCi0JaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHByeGF0dHJpYi0+cmEpKSB7Ci0JCWlmIChwc2VjdXJpdHlwcml2LT5iaW5zdGFsbEdycGtleSA9PSAwKSB7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCURCR184NzIzQSgiJXM6cnggYmMvbWMgcGFja2V0cywgYnV0IGRpZG4ndCBpbnN0YWxsIGdyb3VwIGtleSEhISEhISEhISFcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQlwcndza2V5ID0gcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleVtwcnhhdHRyaWItPmtleV9pbmRleF0uc2tleTsKLQl9IGVsc2UgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6IHN0YWluZm8hPSBOVUxMISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCXByd3NrZXkgPSAmc3RhaW5mby0+ZG90MTE4MDIxeF9VbmNzdEtleS5za2V5WzBdOwotCX0KLQotCWl2ID0gcGZyYW1lICsgcHJ4YXR0cmliLT5oZHJsZW47Ci0JcGF5bG9hZCA9IHBmcmFtZSArIHByeGF0dHJpYi0+aXZfbGVuICsgcHJ4YXR0cmliLT5oZHJsZW47Ci0JbGVuZ3RoID0gc2tiLT5sZW4gLSBwcnhhdHRyaWItPmhkcmxlbiAtIHByeGF0dHJpYi0+aXZfbGVuOwotCi0JR0VUX1RLSVBfUE4oaXYsIGRvdDExdHhwbik7Ci0KLQlwbmwgPSAodTE2KShkb3QxMXR4cG4udmFsKTsKLQlwbmggPSAodTMyKShkb3QxMXR4cG4udmFsPj4xNik7Ci0KLQlwaGFzZTEoKHUxNiAqKSZ0dGtleVswXSwgcHJ3c2tleSwgJnByeGF0dHJpYi0+dGFbMF0sIHBuaCk7Ci0JcGhhc2UyKCZyYzRrZXlbMF0sIHByd3NrZXksICh1bnNpZ25lZCBzaG9ydCAqKSZ0dGtleVswXSwgcG5sKTsKLQotCS8qIDQgZGVjcnlwdCBwYXlsb2FkIGluY2x1ZGUgaWN2ICovCi0JYXJjZm91cl9pbml0KCZteWNvbnRleHQsIHJjNGtleSwgMTYpOwotCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkLCBwYXlsb2FkLCBsZW5ndGgpOwotCi0JYWN0dWFsX2NyYyA9IGdldGNyYzMyKHBheWxvYWQsIGxlbmd0aCAtIDQpOwotCWV4cGVjdGVkX2NyYyA9IGdldF91bmFsaWduZWRfbGUzMigmcGF5bG9hZFtsZW5ndGggLSA0XSk7Ci0KLQlpZiAoYWN0dWFsX2NyYyAhPSBleHBlY3RlZF9jcmMpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOmljdiBDUkMgbWlzbWF0Y2g6ICIKLQkJCSAiYWN0dWFsOiAlMDh4LCBleHBlY3RlZDogJTA4eFxuIiwKLQkJCSBfX2Z1bmNfXywgYWN0dWFsX2NyYywgZXhwZWN0ZWRfY3JjKTsKLQkJcmVzID0gX0ZBSUw7Ci0JfQotCi1leGl0OgotCXJldHVybiByZXM7Ci19Ci0KLS8qIDMJCQk9PT09PSBBRVMgcmVsYXRlZCA9PT09PSAqLwotCi0jZGVmaW5lIE1BWF9NU0dfU0laRQkyMDQ4Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKiogU0JPWCBUYWJsZSAqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyAgdTggc2JveF90YWJsZVsyNTZdID0gewotCTB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUsCi0JMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NiwKLQkweGNhLCAweDgyLCAweGM5LCAweDdkLCAweGZhLCAweDU5LCAweDQ3LCAweGYwLAotCTB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAsCi0JMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYywKLQkweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1LAotCTB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEsCi0JMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSwKLQkweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwLAotCTB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQsCi0JMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1YiwKLQkweDZhLCAweGNiLCAweGJlLCAweDM5LCAweDRhLCAweDRjLCAweDU4LCAweGNmLAotCTB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUsCi0JMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCwKLQkweDUxLCAweGEzLCAweDQwLCAweDhmLCAweDkyLCAweDlkLCAweDM4LCAweGY1LAotCTB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIsCi0JMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNywKLQkweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczLAotCTB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgsCi0JMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYiwKLQkweGUwLCAweDMyLCAweDNhLCAweDBhLCAweDQ5LCAweDA2LCAweDI0LCAweDVjLAotCTB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzksCi0JMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSwKLQkweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhLCAweGFlLCAweDA4LAotCTB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYsCi0JMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSwKLQkweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlLAotCTB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUsCi0JMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCwKLQkweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1LCAweDI4LCAweGRmLAotCTB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgsCi0JMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNgotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKiogRnVuY3Rpb24gUHJvdG90eXBlcyAqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjIodTggKm1pY19oZWFkZXIyLCB1OCAqbXBkdSwgaW50IGE0X2V4aXN0cywKLQkJCQkgIGludCBxY19leGlzdHMpOwotCi1zdGF0aWMgdm9pZCB4b3JfMTI4KHU4ICphLCB1OCAqYiwgdTggKm91dCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQlvdXRbaV0gPSBhW2ldIF4gYltpXTsKLX0KLQotc3RhdGljIHZvaWQgeG9yXzMyKHU4ICphLCB1OCAqYiwgdTggKm91dCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCW91dFtpXSA9IGFbaV0gXiBiW2ldOwotfQotCi1zdGF0aWMgdTggc2JveCh1OCBhKQotewotCXJldHVybiBzYm94X3RhYmxlWyhpbnQpYV07Ci19Ci0KLXN0YXRpYyB2b2lkIG5leHRfa2V5KHU4ICprZXksIGludCByb3VuZCkKLXsKLQl1OCByY29uOwotCXU4IHNib3hfa2V5WzRdOwotCXU4IHJjb25fdGFibGVbMTJdID0gewotCQkweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLAotCQkweDFiLCAweDM2LCAweDM2LCAweDM2Ci0JfTsKLQotCXNib3hfa2V5WzBdID0gc2JveChrZXlbMTNdKTsKLQlzYm94X2tleVsxXSA9IHNib3goa2V5WzE0XSk7Ci0Jc2JveF9rZXlbMl0gPSBzYm94KGtleVsxNV0pOwotCXNib3hfa2V5WzNdID0gc2JveChrZXlbMTJdKTsKLQotCXJjb24gPSByY29uX3RhYmxlW3JvdW5kXTsKLQotCXhvcl8zMigma2V5WzBdLCBzYm94X2tleSwgJmtleVswXSk7Ci0Ja2V5WzBdID0ga2V5WzBdIF4gcmNvbjsKLQotCXhvcl8zMigma2V5WzRdLCAma2V5WzBdLCAma2V5WzRdKTsKLQl4b3JfMzIoJmtleVs4XSwgJmtleVs0XSwgJmtleVs4XSk7Ci0JeG9yXzMyKCZrZXlbMTJdLCAma2V5WzhdLCAma2V5WzEyXSk7Ci0KLX0KLQotc3RhdGljIHZvaWQgYnl0ZV9zdWIodTggKmluLCB1OCAqb3V0KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCW91dFtpXSA9IHNib3goaW5baV0pOwotfQotCi1zdGF0aWMgdm9pZCBzaGlmdF9yb3codTggKmluLCB1OCAqb3V0KQotewotCi0Jb3V0WzBdID0gIGluWzBdOwotCW91dFsxXSA9ICBpbls1XTsKLQlvdXRbMl0gPSAgaW5bMTBdOwotCW91dFszXSA9ICBpblsxNV07Ci0Jb3V0WzRdID0gIGluWzRdOwotCW91dFs1XSA9ICBpbls5XTsKLQlvdXRbNl0gPSAgaW5bMTRdOwotCW91dFs3XSA9ICBpblszXTsKLQlvdXRbOF0gPSAgaW5bOF07Ci0Jb3V0WzldID0gIGluWzEzXTsKLQlvdXRbMTBdID0gaW5bMl07Ci0Jb3V0WzExXSA9IGluWzddOwotCW91dFsxMl0gPSBpblsxMl07Ci0Jb3V0WzEzXSA9IGluWzFdOwotCW91dFsxNF0gPSBpbls2XTsKLQlvdXRbMTVdID0gaW5bMTFdOwotCi19Ci0KLXN0YXRpYyB2b2lkIG1peF9jb2x1bW4odTggKmluLCB1OCAqb3V0KQotewotCWludCBpOwotCXU4IGFkZDFiWzRdOwotCXU4IGFkZDFiZjdbNF07Ci0JdTggcm90bFs0XTsKLQl1OCBzd2FwX2hhbGZzWzRdOwotCXU4IGFuZGY3WzRdOwotCXU4IHJvdHJbNF07Ci0JdTggdGVtcFs0XTsKLQl1OCB0ZW1wYls0XTsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJaWYgKChpbltpXSAmIDB4ODApID09IDB4ODApCi0JCQlhZGQxYltpXSA9IDB4MWI7Ci0JCWVsc2UKLQkJCWFkZDFiW2ldID0gMHgwMDsKLQl9Ci0KLQlzd2FwX2hhbGZzWzBdID0gaW5bMl07IC8qIFN3YXAgaGFsZnMgKi8KLQlzd2FwX2hhbGZzWzFdID0gaW5bM107Ci0Jc3dhcF9oYWxmc1syXSA9IGluWzBdOwotCXN3YXBfaGFsZnNbM10gPSBpblsxXTsKLQotCXJvdGxbMF0gPSBpblszXTsgLyogUm90YXRlIGxlZnQgOCBiaXRzICovCi0Jcm90bFsxXSA9IGluWzBdOwotCXJvdGxbMl0gPSBpblsxXTsKLQlyb3RsWzNdID0gaW5bMl07Ci0KLQlhbmRmN1swXSA9IGluWzBdICYgMHg3ZjsKLQlhbmRmN1sxXSA9IGluWzFdICYgMHg3ZjsKLQlhbmRmN1syXSA9IGluWzJdICYgMHg3ZjsKLQlhbmRmN1szXSA9IGluWzNdICYgMHg3ZjsKLQotCWZvciAoaSA9IDM7IGkgPiAwOyBpLS0pIHsgLyogbG9naWNhbCBzaGlmdCBsZWZ0IDEgYml0ICovCi0JCWFuZGY3W2ldID0gYW5kZjdbaV0gPDwgMTsKLQkJaWYgKChhbmRmN1tpIC0gMV0gJiAweDgwKSA9PSAweDgwKQotCQkJYW5kZjdbaV0gPSAoYW5kZjdbaV0gfCAweDAxKTsKLQl9Ci0JYW5kZjdbMF0gPSBhbmRmN1swXSA8PCAxOwotCWFuZGY3WzBdID0gYW5kZjdbMF0gJiAweGZlOwotCi0JeG9yXzMyKGFkZDFiLCBhbmRmNywgYWRkMWJmNyk7Ci0KLQl4b3JfMzIoaW4sIGFkZDFiZjcsIHJvdHIpOwotCi0JdGVtcFswXSA9IHJvdHJbMF07IC8qIFJvdGF0ZSByaWdodCA4IGJpdHMgKi8KLQlyb3RyWzBdID0gcm90clsxXTsKLQlyb3RyWzFdID0gcm90clsyXTsKLQlyb3RyWzJdID0gcm90clszXTsKLQlyb3RyWzNdID0gdGVtcFswXTsKLQotCXhvcl8zMihhZGQxYmY3LCByb3RyLCB0ZW1wKTsKLQl4b3JfMzIoc3dhcF9oYWxmcywgcm90bCwgdGVtcGIpOwotCXhvcl8zMih0ZW1wLCB0ZW1wYiwgb3V0KTsKLQotfQotCi1zdGF0aWMgdm9pZCBhZXMxMjhrMTI4ZCh1OCAqa2V5LCB1OCAqZGF0YSwgdTggKmNpcGhlcnRleHQpCi17Ci0JaW50IHJvdW5kOwotCWludCBpOwotCXU4IGludGVybWVkaWF0ZWFbMTZdOwotCXU4IGludGVybWVkaWF0ZWJbMTZdOwotCXU4IHJvdW5kX2tleVsxNl07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJcm91bmRfa2V5W2ldID0ga2V5W2ldOwotCi0JZm9yIChyb3VuZCA9IDA7IHJvdW5kIDwgMTE7IHJvdW5kKyspIHsKLQkJaWYgKHJvdW5kID09IDApIHsKLQkJCXhvcl8xMjgocm91bmRfa2V5LCBkYXRhLCBjaXBoZXJ0ZXh0KTsKLQkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOwotCQl9IGVsc2UgaWYgKHJvdW5kID09IDEwKSB7Ci0JCQlieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKLQkJCXNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKLQkJCXhvcl8xMjgoaW50ZXJtZWRpYXRlYiwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKLQkJfSBlbHNlIHsgLyogMSAtIDkgKi8KLQkJCWJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOwotCQkJc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOwotCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlswXSwgJmludGVybWVkaWF0ZWFbMF0pOwotCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls0XSwgJmludGVybWVkaWF0ZWFbNF0pOwotCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls4XSwgJmludGVybWVkaWF0ZWFbOF0pOwotCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlsxMl0sICZpbnRlcm1lZGlhdGVhWzEyXSk7Ci0JCQl4b3JfMTI4KGludGVybWVkaWF0ZWEsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7Ci0JCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKLQkJfQotCX0KLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogY29uc3RydWN0X21pY19pdigpICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEJ1aWxkcyB0aGUgTUlDIElWIGZyb20gaGVhZGVyIGZpZWxkcyBhbmQgUE4gICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY29uc3RydWN0X21pY19pdih1OCAqbWljX2l2LCBpbnQgcWNfZXhpc3RzLCBpbnQgYTRfZXhpc3RzLCB1OCAqbXBkdSwKLQkJCSAgICAgdWludCBwYXlsb2FkX2xlbmd0aCwgdTggKnBuX3ZlY3RvcikKLXsKLQlpbnQgaTsKLQotCW1pY19pdlswXSA9IDB4NTk7Ci0JaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpCi0JCW1pY19pdlsxXSA9IG1wZHVbMzBdICYgMHgwZjsgLyogUW9TX1RDICAgICAgICAqLwotCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykKLQkJbWljX2l2WzFdID0gbXBkdVsyNF0gJiAweDBmOyAvKiBtdXRlIGJpdHMgNy00ICovCi0JaWYgKCFxY19leGlzdHMpCi0JCW1pY19pdlsxXSA9IDB4MDA7Ci0JZm9yIChpID0gMjsgaSA8IDg7IGkrKykKLQkJbWljX2l2W2ldID0gbXBkdVtpICsgOF07IC8qIG1pY19pdlsyOjddID0gQTJbMDo1XSA9IG1wZHVbMTA6MTVdICovCi0JZm9yIChpID0gODsgaSA8IDE0OyBpKyspCi0JCW1pY19pdltpXSA9IHBuX3ZlY3RvclsxMyAtIGldOyAvKiBtaWNfaXZbODoxM10gPSBQTls1OjBdICovCi0JbWljX2l2WzE0XSA9ICh1bnNpZ25lZCBjaGFyKShwYXlsb2FkX2xlbmd0aCAvIDI1Nik7Ci0JbWljX2l2WzE1XSA9ICh1bnNpZ25lZCBjaGFyKShwYXlsb2FkX2xlbmd0aCAlIDI1Nik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjEoKSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQnVpbGRzIHRoZSBmaXJzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgKi8KLS8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY29uc3RydWN0X21pY19oZWFkZXIxKHU4ICptaWNfaGVhZGVyMSwgaW50IGhlYWRlcl9sZW5ndGgsIHU4ICptcGR1KQotewotCW1pY19oZWFkZXIxWzBdID0gKHU4KSgoaGVhZGVyX2xlbmd0aCAtIDIpIC8gMjU2KTsKLQltaWNfaGVhZGVyMVsxXSA9ICh1OCkoKGhlYWRlcl9sZW5ndGggLSAyKSAlIDI1Nik7Ci0JbWljX2hlYWRlcjFbMl0gPSBtcGR1WzBdICYgMHhjZjsgLyogTXV0ZSBDRiBwb2xsICYgQ0YgYWNrIGJpdHMgKi8KLQltaWNfaGVhZGVyMVszXSA9IG1wZHVbMV0gJiAweGM3OyAvKiBNdXRlIHJldHJ5LCBtb3JlIGRhdGEgYW5kIHB3ciBtZ3QgYml0cyAqLwotCW1pY19oZWFkZXIxWzRdID0gbXBkdVs0XTsgLyogQTEgKi8KLQltaWNfaGVhZGVyMVs1XSA9IG1wZHVbNV07Ci0JbWljX2hlYWRlcjFbNl0gPSBtcGR1WzZdOwotCW1pY19oZWFkZXIxWzddID0gbXBkdVs3XTsKLQltaWNfaGVhZGVyMVs4XSA9IG1wZHVbOF07Ci0JbWljX2hlYWRlcjFbOV0gPSBtcGR1WzldOwotCW1pY19oZWFkZXIxWzEwXSA9IG1wZHVbMTBdOyAvKiBBMiAqLwotCW1pY19oZWFkZXIxWzExXSA9IG1wZHVbMTFdOwotCW1pY19oZWFkZXIxWzEyXSA9IG1wZHVbMTJdOwotCW1pY19oZWFkZXIxWzEzXSA9IG1wZHVbMTNdOwotCW1pY19oZWFkZXIxWzE0XSA9IG1wZHVbMTRdOwotCW1pY19oZWFkZXIxWzE1XSA9IG1wZHVbMTVdOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoKSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQnVpbGRzIHRoZSBsYXN0IE1JQyBoZWFkZXIgYmxvY2sgZnJvbSAgICAgICAgKi8KLS8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY29uc3RydWN0X21pY19oZWFkZXIyKHU4ICptaWNfaGVhZGVyMiwgdTggKm1wZHUsIGludCBhNF9leGlzdHMsCi0JCQkJICBpbnQgcWNfZXhpc3RzKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCW1pY19oZWFkZXIyW2ldID0gMHgwMDsKLQotCW1pY19oZWFkZXIyWzBdID0gbXBkdVsxNl07IC8qIEEzICovCi0JbWljX2hlYWRlcjJbMV0gPSBtcGR1WzE3XTsKLQltaWNfaGVhZGVyMlsyXSA9IG1wZHVbMThdOwotCW1pY19oZWFkZXIyWzNdID0gbXBkdVsxOV07Ci0JbWljX2hlYWRlcjJbNF0gPSBtcGR1WzIwXTsKLQltaWNfaGVhZGVyMls1XSA9IG1wZHVbMjFdOwotCi0JbWljX2hlYWRlcjJbNl0gPSAweDAwOwotCW1pY19oZWFkZXIyWzddID0gMHgwMDsgLyogbXBkdVsyM107ICovCi0KLQlpZiAoIXFjX2V4aXN0cyAmJiBhNF9leGlzdHMpIHsKLQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkJCW1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAvKiBBNCAqLwotCX0KLQotCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykgewotCQltaWNfaGVhZGVyMls4XSA9IG1wZHVbMjRdICYgMHgwZjsgLyogbXV0ZSBiaXRzIDE1IC0gNCAqLwotCQltaWNfaGVhZGVyMls5XSA9IG1wZHVbMjVdICYgMHgwMDsKLQl9Ci0KLQlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykgewotCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCQkJbWljX2hlYWRlcjJbOCtpXSA9IG1wZHVbMjQraV07IC8qIEE0ICovCi0KLQkJbWljX2hlYWRlcjJbMTRdID0gbXBkdVszMF0gJiAweDBmOwotCQltaWNfaGVhZGVyMlsxNV0gPSBtcGR1WzMxXSAmIDB4MDA7Ci0JfQotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoKSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQnVpbGRzIHRoZSBsYXN0IE1JQyBoZWFkZXIgYmxvY2sgZnJvbSAgICAgICAgKi8KLS8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY29uc3RydWN0X2N0cl9wcmVsb2FkKHU4ICpjdHJfcHJlbG9hZCwgaW50IGE0X2V4aXN0cywgaW50IHFjX2V4aXN0cywKLQkJCQkgIHU4ICptcGR1LCB1OCAqcG5fdmVjdG9yLCBpbnQgYykKLXsKLQlpbnQgaSA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJY3RyX3ByZWxvYWRbaV0gPSAweDAwOwotCi0JaSA9IDA7Ci0KLQljdHJfcHJlbG9hZFswXSA9IDB4MDE7IC8qIGZsYWcgKi8KLQlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKLQkJY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzMwXSAmIDB4MGY7IC8qIFFvQ19Db250cm9sICovCi0JaWYgKHFjX2V4aXN0cyAmJiAhYTRfZXhpc3RzKQotCQljdHJfcHJlbG9hZFsxXSA9IG1wZHVbMjRdICYgMHgwZjsKLQotCWZvciAoaSA9IDI7IGkgPCA4OyBpKyspCi0JCWN0cl9wcmVsb2FkW2ldID0gbXBkdVtpICsgOF07IC8qIGN0cl9wcmVsb2FkWzI6N10gPSBBMlswOjVdID0gbXBkdVsxMDoxNV0gKi8KLQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKLQkJY3RyX3ByZWxvYWRbaV0gPSBwbl92ZWN0b3JbMTMgLSBpXTsgLyogY3RyX3ByZWxvYWRbODoxM10gPSBQTls1OjBdICovCi0JY3RyX3ByZWxvYWRbMTRdID0gICh1bnNpZ25lZCBjaGFyKSAoYyAvIDI1Nik7IC8qIEN0ciAqLwotCWN0cl9wcmVsb2FkWzE1XSA9ICAodW5zaWduZWQgY2hhcikgKGMgJSAyNTYpOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBiaXR3aXNlX3hvcigpICAgICAgICAgICAgICAgICAgICAqLwotLyogQSAxMjggYml0LCBiaXR3aXNlIGV4Y2x1c2l2ZSBvciAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBiaXR3aXNlX3hvcih1OCAqaW5hLCB1OCAqaW5iLCB1OCAqb3V0KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCW91dFtpXSA9IGluYVtpXSBeIGluYltpXTsKLX0KLQotc3RhdGljIGludCBhZXNfY2lwaGVyKHU4ICprZXksIHVpbnQgaGRybGVuLCB1OCAqcGZyYW1lLCB1aW50IHBsZW4pCi17Ci0JdWludCBxY19leGlzdHMsIGE0X2V4aXN0cywgaSwgaiwgcGF5bG9hZF9yZW1haW5kZXIsCi0JICAgICBudW1fYmxvY2tzLCBwYXlsb2FkX2luZGV4OwotCXU4IHBuX3ZlY3Rvcls2XTsKLQl1OCBtaWNfaXZbMTZdOwotCXU4IG1pY19oZWFkZXIxWzE2XTsKLQl1OCBtaWNfaGVhZGVyMlsxNl07Ci0JdTggY3RyX3ByZWxvYWRbMTZdOwotCS8qIEludGVybWVkaWF0ZSBCdWZmZXJzICovCi0JdTggY2hhaW5fYnVmZmVyWzE2XTsKLQl1OCBhZXNfb3V0WzE2XTsKLQl1OCBwYWRkZWRfYnVmZmVyWzE2XTsKLQl1OCBtaWNbOF07Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKLQl1MTYgZnJzdWJ0eXBlID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jb250cm9sKSAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFOwotCi0JbWVtc2V0KCh2b2lkICopbWljX2l2LCAwLCAxNik7Ci0JbWVtc2V0KCh2b2lkICopbWljX2hlYWRlcjEsIDAsIDE2KTsKLQltZW1zZXQoKHZvaWQgKiltaWNfaGVhZGVyMiwgMCwgMTYpOwotCW1lbXNldCgodm9pZCAqKWN0cl9wcmVsb2FkLCAwLCAxNik7Ci0JbWVtc2V0KCh2b2lkICopY2hhaW5fYnVmZmVyLCAwLCAxNik7Ci0JbWVtc2V0KCh2b2lkICopYWVzX291dCwgMCwgMTYpOwotCW1lbXNldCgodm9pZCAqKXBhZGRlZF9idWZmZXIsIDAsIDE2KTsKLQotCWlmICgoaGRybGVuID09IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgfHwKLQkgICAgKGhkcmxlbiA9PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyKSkpKQotCQlhNF9leGlzdHMgPSAwOwotCWVsc2UKLQkJYTRfZXhpc3RzID0gMTsKLQotCWlmIChpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCWlmICgoZnJzdWJ0eXBlID09IElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLKSB8fAotCQkgICAgKGZyc3VidHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRlBPTEwpIHx8Ci0JCSAgICAoZnJzdWJ0eXBlID09IElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLUE9MTCkpIHsKLQkJCXFjX2V4aXN0cyA9IDE7Ci0JCQlpZiAoaGRybGVuICE9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIpKQotCQkJCWhkcmxlbiArPSAyOwotCQl9IGVsc2UgaWYgKChmcnN1YnR5cGUgPT0gSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBKSB8fAotCQkJICAgKGZyc3VidHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEFfQ0ZBQ0spIHx8Ci0JCQkgICAoZnJzdWJ0eXBlID09IElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQV9DRlBPTEwpIHx8Ci0JCQkgICAoZnJzdWJ0eXBlID09IElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQV9DRkFDS1BPTEwpKSB7Ci0JCQlpZiAoaGRybGVuICE9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIpKQotCQkJCWhkcmxlbiArPSAyOwotCQkJcWNfZXhpc3RzID0gMTsKLQkJfSBlbHNlIHsKLQkJCXFjX2V4aXN0cyA9IDA7Ci0JCX0KLQl9IGVsc2UgewotCQlxY19leGlzdHMgPSAwOwotCX0KLQlwbl92ZWN0b3JbMF0gPSBwZnJhbWVbaGRybGVuXTsKLQlwbl92ZWN0b3JbMV0gPSBwZnJhbWVbaGRybGVuICsgMV07Ci0JcG5fdmVjdG9yWzJdID0gcGZyYW1lW2hkcmxlbiArIDRdOwotCXBuX3ZlY3RvclszXSA9IHBmcmFtZVtoZHJsZW4gKyA1XTsKLQlwbl92ZWN0b3JbNF0gPSBwZnJhbWVbaGRybGVuICsgNl07Ci0JcG5fdmVjdG9yWzVdID0gcGZyYW1lW2hkcmxlbiArIDddOwotCi0JY29uc3RydWN0X21pY19pdihtaWNfaXYsIHFjX2V4aXN0cywgYTRfZXhpc3RzLCBwZnJhbWUsIHBsZW4sIHBuX3ZlY3Rvcik7Ci0KLQljb25zdHJ1Y3RfbWljX2hlYWRlcjEobWljX2hlYWRlcjEsIGhkcmxlbiwgcGZyYW1lKTsKLQljb25zdHJ1Y3RfbWljX2hlYWRlcjIobWljX2hlYWRlcjIsIHBmcmFtZSwgYTRfZXhpc3RzLCBxY19leGlzdHMpOwotCi0JcGF5bG9hZF9yZW1haW5kZXIgPSBwbGVuICUgMTY7Ci0JbnVtX2Jsb2NrcyA9IHBsZW4gLyAxNjsKLQotCS8qIEZpbmQgc3RhcnQgb2YgcGF5bG9hZCAqLwotCXBheWxvYWRfaW5kZXggPSBoZHJsZW4gKyA4OwotCi0JLyogQ2FsY3VsYXRlIE1JQyAqLwotCWFlczEyOGsxMjhkKGtleSwgbWljX2l2LCBhZXNfb3V0KTsKLQliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMSwgY2hhaW5fYnVmZmVyKTsKLQlhZXMxMjhrMTI4ZChrZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7Ci0JYml0d2lzZV94b3IoYWVzX291dCwgbWljX2hlYWRlcjIsIGNoYWluX2J1ZmZlcik7Ci0JYWVzMTI4azEyOGQoa2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgewotCQliaXR3aXNlX3hvcihhZXNfb3V0LCAmcGZyYW1lW3BheWxvYWRfaW5kZXhdLCBjaGFpbl9idWZmZXIpOwotCi0JCXBheWxvYWRfaW5kZXggKz0gMTY7Ci0JCWFlczEyOGsxMjhkKGtleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQl9Ci0KLQkvKiBBZGQgb24gdGhlIGZpbmFsIHBheWxvYWQgYmxvY2sgaWYgaXQgbmVlZHMgcGFkZGluZyAqLwotCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApIHsKLQkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0JCQlwYWRkZWRfYnVmZmVyW2pdID0gMHgwMDsKLQkJZm9yIChqID0gMDsgaiA8IHBheWxvYWRfcmVtYWluZGVyOyBqKyspCi0JCQlwYWRkZWRfYnVmZmVyW2pdID0gcGZyYW1lW3BheWxvYWRfaW5kZXgrK107Ci0JCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7Ci0JCWFlczEyOGsxMjhkKGtleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQl9Ci0KLQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQotCQltaWNbal0gPSBhZXNfb3V0W2pdOwotCi0JLyogSW5zZXJ0IE1JQyBpbnRvIHBheWxvYWQgKi8KLQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQotCQlwZnJhbWVbcGF5bG9hZF9pbmRleCArIGpdID0gbWljW2pdOwotCi0JcGF5bG9hZF9pbmRleCA9IGhkcmxlbiArIDg7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgewotCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsIGE0X2V4aXN0cywgcWNfZXhpc3RzLAotCQkJCSAgICAgIHBmcmFtZSwgcG5fdmVjdG9yLCBpICsgMSk7Ci0JCWFlczEyOGsxMjhkKGtleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCQliaXR3aXNlX3hvcihhZXNfb3V0LCAmcGZyYW1lW3BheWxvYWRfaW5kZXhdLCBjaGFpbl9idWZmZXIpOwotCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkJCXBmcmFtZVtwYXlsb2FkX2luZGV4KytdID0gY2hhaW5fYnVmZmVyW2pdOwotCX0KLQotCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApIHsKLQkJLyogSWYgdGhlcmUgaXMgYSBzaG9ydCBmaW5hbCBibG9jaywgdGhlbiBwYWQgaXQsCi0JCSAqIGVuY3J5cHQgaXQgYW5kIGNvcHkgdGhlIHVucGFkZGVkIHBhcnQgYmFjawotCQkgKi8KLQkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLCBhNF9leGlzdHMsIHFjX2V4aXN0cywgcGZyYW1lLAotCQkJCSAgICAgIHBuX3ZlY3RvciwgbnVtX2Jsb2NrcyArIDEpOwotCi0JCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotCQkJcGFkZGVkX2J1ZmZlcltqXSA9IDB4MDA7Ci0JCWZvciAoaiA9IDA7IGogPCBwYXlsb2FkX3JlbWFpbmRlcjsgaisrKQotCQkJcGFkZGVkX2J1ZmZlcltqXSA9IHBmcmFtZVtwYXlsb2FkX2luZGV4ICsgal07Ci0JCWFlczEyOGsxMjhkKGtleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOwotCQlmb3IgKGogPSAwOyBqIDwgcGF5bG9hZF9yZW1haW5kZXI7IGorKykKLQkJCXBmcmFtZVtwYXlsb2FkX2luZGV4KytdID0gY2hhaW5fYnVmZmVyW2pdOwotCX0KLQotCS8qIEVuY3J5cHQgdGhlIE1JQyAqLwotCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwgYTRfZXhpc3RzLCBxY19leGlzdHMsIHBmcmFtZSwKLQkJCSAgICAgIHBuX3ZlY3RvciwgMCk7Ci0KLQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkJcGFkZGVkX2J1ZmZlcltqXSA9IDB4MDA7Ci0JZm9yIChqID0gMDsgaiA8IDg7IGorKykKLQkJcGFkZGVkX2J1ZmZlcltqXSA9IHBmcmFtZVtqICsgaGRybGVuICsgOCArIHBsZW5dOwotCi0JYWVzMTI4azEyOGQoa2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7Ci0JYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKLQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQotCQlwZnJhbWVbcGF5bG9hZF9pbmRleCsrXSA9IGNoYWluX2J1ZmZlcltqXTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotaW50IHJ0d19hZXNfZW5jcnlwdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17CS8qIGV4Y2x1ZGUgSUNWICovCi0JLyogSW50ZXJtZWRpYXRlIEJ1ZmZlcnMgKi8KLQlpbnQgY3VyZnJhZ251bSwgbGVuZ3RoOwotCXU4ICpwZnJhbWUsICpwcndza2V5OwotCXU4IGh3X2hkcl9vZmZzZXQgPSAwOwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhaW5mbzsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCWlmICghcHhtaXRmcmFtZS0+YnVmX2FkZHIpCi0JCXJldHVybiBfRkFJTDsKLQotCWh3X2hkcl9vZmZzZXQgPSBUWERFU0NfT0ZGU0VUOwotCi0JcGZyYW1lID0gcHhtaXRmcmFtZS0+YnVmX2FkZHIgKyBod19oZHJfb2Zmc2V0OwotCi0JLyogNCBzdGFydCB0byBlbmNyeXB0IGVhY2ggZnJhZ21lbnQgKi8KLQlpZiAocGF0dHJpYi0+ZW5jcnlwdCAhPSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlpZiAocGF0dHJpYi0+cHN0YSkgewotCQlzdGFpbmZvID0gcGF0dHJpYi0+cHN0YTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzLCBjYWxsIHJ0d19nZXRfc3RhaW5mbzIzYSgpXG4iLCBfX2Z1bmNfXyk7Ci0JCXN0YWluZm8gPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LCAmcGF0dHJpYi0+cmFbMF0pOwotCX0KLQotCWlmICghc3RhaW5mbykgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6IHN0YWluZm8gPT0gTlVMTCEhIVxuIiwgX19mdW5jX18pOwotCQlEQkdfODcyM0EoIiVzLCBwc3RhID09IE5VTFxuIiwgX19mdW5jX18pOwotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmICghKHN0YWluZm8tPnN0YXRlICYgX0ZXX0xJTktFRCkpIHsKLQkJREJHXzg3MjNBKCIlcywgcHN0YS0+c3RhdGUoMHgleCkgIT0gX0ZXX0xJTktFRFxuIiwKLQkJCSAgX19mdW5jX18sIHN0YWluZm8tPnN0YXRlKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKLQkJICIlczogc3RhaW5mbyE9IE5VTEwhISFcbiIsIF9fZnVuY19fKTsKLQotCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSkpCi0JCXByd3NrZXkgPSBwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5W3BzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZF0uc2tleTsKLQllbHNlCi0JCXByd3NrZXkgPSAmc3RhaW5mby0+ZG90MTE4MDIxeF9VbmNzdEtleS5za2V5WzBdOwotCi0JZm9yIChjdXJmcmFnbnVtID0gMDsgY3VyZnJhZ251bSA8IHBhdHRyaWItPm5yX2ZyYWdzOyBjdXJmcmFnbnVtKyspIHsKLQkJLyogNCB0aGUgbGFzdCBmcmFnbWVudCAqLwotCQlpZiAoKGN1cmZyYWdudW0gKyAxKSA9PSBwYXR0cmliLT5ucl9mcmFncykgewotCQkJbGVuZ3RoID0gcGF0dHJpYi0+bGFzdF90eGNtZHN6IC0KLQkJCQlwYXR0cmliLT5oZHJsZW4tcGF0dHJpYi0+aXZfbGVuIC0KLQkJCQlwYXR0cmliLT5pY3ZfbGVuOwotCi0JCQlhZXNfY2lwaGVyKHByd3NrZXksIHBhdHRyaWItPmhkcmxlbiwgcGZyYW1lLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJbGVuZ3RoID0gcHhtaXRwcml2LT5mcmFnX2xlbi1wYXR0cmliLT5oZHJsZW4gLQotCQkJCXBhdHRyaWItPml2X2xlbiAtIHBhdHRyaWItPmljdl9sZW47Ci0KLQkJCWFlc19jaXBoZXIocHJ3c2tleSwgcGF0dHJpYi0+aGRybGVuLCBwZnJhbWUsIGxlbmd0aCk7Ci0JCQlwZnJhbWUgKz0gcHhtaXRwcml2LT5mcmFnX2xlbjsKLQkJCXBmcmFtZSA9IFBUUl9BTElHTihwZnJhbWUsIDQpOwotCQl9Ci0JfQotb3V0OgotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgYWVzX2RlY2lwaGVyKHU4ICprZXksIHVpbnQgaGRybGVuLCB1OCAqcGZyYW1lLCB1aW50IHBsZW4pCi17Ci0Jc3RhdGljIHU4IG1lc3NhZ2VbTUFYX01TR19TSVpFXTsKLQl1aW50IHFjX2V4aXN0cywgYTRfZXhpc3RzLCBpLCBqLCBwYXlsb2FkX3JlbWFpbmRlciwKLQkgICAgIG51bV9ibG9ja3MsIHBheWxvYWRfaW5kZXg7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCXU4IHBuX3ZlY3Rvcls2XTsKLQl1OCBtaWNfaXZbMTZdOwotCXU4IG1pY19oZWFkZXIxWzE2XTsKLQl1OCBtaWNfaGVhZGVyMlsxNl07Ci0JdTggY3RyX3ByZWxvYWRbMTZdOwotCS8qIEludGVybWVkaWF0ZSBCdWZmZXJzICovCi0JdTggY2hhaW5fYnVmZmVyWzE2XTsKLQl1OCBhZXNfb3V0WzE2XTsKLQl1OCBwYWRkZWRfYnVmZmVyWzE2XTsKLQl1OCBtaWNbOF07Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKLQl1MTYgZnJzdWJ0eXBlID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jb250cm9sKSAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFOwotCi0JbWVtc2V0KCh2b2lkICopbWljX2l2LCAwLCAxNik7Ci0JbWVtc2V0KCh2b2lkICopbWljX2hlYWRlcjEsIDAsIDE2KTsKLQltZW1zZXQoKHZvaWQgKiltaWNfaGVhZGVyMiwgMCwgMTYpOwotCW1lbXNldCgodm9pZCAqKWN0cl9wcmVsb2FkLCAwLCAxNik7Ci0JbWVtc2V0KCh2b2lkICopY2hhaW5fYnVmZmVyLCAwLCAxNik7Ci0JbWVtc2V0KCh2b2lkICopYWVzX291dCwgMCwgMTYpOwotCW1lbXNldCgodm9pZCAqKXBhZGRlZF9idWZmZXIsIDAsIDE2KTsKLQotCS8qIHN0YXJ0IHRvIGRlY3J5cHQgdGhlIHBheWxvYWQgKi8KLQotCW51bV9ibG9ja3MgPSAocGxlbiAtIDgpIC8gMTY7IC8qIHBsZW4gaW5jbHVkaW5nIGxsYywgcGF5bG9hZF9sZW5ndGggYW5kIG1pYykgKi8KLQotCXBheWxvYWRfcmVtYWluZGVyID0gKHBsZW4gLSA4KSAlIDE2OwotCi0JcG5fdmVjdG9yWzBdICA9IHBmcmFtZVtoZHJsZW5dOwotCXBuX3ZlY3RvclsxXSAgPSBwZnJhbWVbaGRybGVuICsgMV07Ci0JcG5fdmVjdG9yWzJdICA9IHBmcmFtZVtoZHJsZW4gKyA0XTsKLQlwbl92ZWN0b3JbM10gID0gcGZyYW1lW2hkcmxlbiArIDVdOwotCXBuX3ZlY3Rvcls0XSAgPSBwZnJhbWVbaGRybGVuICsgNl07Ci0JcG5fdmVjdG9yWzVdICA9IHBmcmFtZVtoZHJsZW4gKyA3XTsKLQotCWlmICgoaGRybGVuID09IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgfHwKLQkgICAgKGhkcmxlbiA9PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyKSkpKQotCQlhNF9leGlzdHMgPSAwOwotCWVsc2UKLQkJYTRfZXhpc3RzID0gMTsKLQotCWlmIChpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCWlmICgoZnJzdWJ0eXBlID09IElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLKSB8fAotCQkgICAgKGZyc3VidHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRlBPTEwpIHx8Ci0JCSAgICAoZnJzdWJ0eXBlID09IElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLUE9MTCkpIHsKLQkJCXFjX2V4aXN0cyA9IDE7Ci0JCQlpZiAoaGRybGVuICE9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpCi0JCQkJaGRybGVuICs9IDI7Ci0JCX0gZWxzZSBpZiAoKGZyc3VidHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEpIHx8Ci0JCQkgICAoZnJzdWJ0eXBlID09IElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQV9DRkFDSykgfHwKLQkJCSAgIChmcnN1YnR5cGUgPT0gSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBX0NGUE9MTCkgfHwKLQkJCSAgIChmcnN1YnR5cGUgPT0gSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBX0NGQUNLUE9MTCkpIHsKLQkJCWlmIChoZHJsZW4gIT0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSkKLQkJCQloZHJsZW4gKz0gMjsKLQkJCXFjX2V4aXN0cyA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlxY19leGlzdHMgPSAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJcWNfZXhpc3RzID0gMDsKLQl9Ci0KLQkvKiBub3csIGRlY3J5cHQgcGZyYW1lIHdpdGggaGRybGVuIG9mZnNldCBhbmQgcGxlbiBsb25nICovCi0KLQlwYXlsb2FkX2luZGV4ID0gaGRybGVuICsgODsgLyogIDggaXMgZm9yIGV4dGl2ICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7Ci0JCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwgYTRfZXhpc3RzLCBxY19leGlzdHMsCi0JCQkJICAgICAgcGZyYW1lLCBwbl92ZWN0b3IsIGkgKyAxKTsKLQotCQlhZXMxMjhrMTI4ZChrZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKLQkJYml0d2lzZV94b3IoYWVzX291dCwgJnBmcmFtZVtwYXlsb2FkX2luZGV4XSwgY2hhaW5fYnVmZmVyKTsKLQotCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkJCXBmcmFtZVtwYXlsb2FkX2luZGV4KytdID0gY2hhaW5fYnVmZmVyW2pdOwotCX0KLQotCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApIHsKLQkJLyogSWYgdGhlcmUgaXMgYSBzaG9ydCBmaW5hbCBibG9jaywgdGhlbiBwYWQgaXQsCi0JCSAqIGVuY3J5cHQgaXQgYW5kIGNvcHkgdGhlIHVucGFkZGVkIHBhcnQgYmFjawotCQkgKi8KLQkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLCBhNF9leGlzdHMsIHFjX2V4aXN0cywgcGZyYW1lLAotCQkJCSAgICAgIHBuX3ZlY3RvciwgbnVtX2Jsb2NrcyArIDEpOwotCi0JCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotCQkJcGFkZGVkX2J1ZmZlcltqXSA9IDB4MDA7Ci0JCWZvciAoaiA9IDA7IGogPCBwYXlsb2FkX3JlbWFpbmRlcjsgaisrKQotCQkJcGFkZGVkX2J1ZmZlcltqXSA9IHBmcmFtZVtwYXlsb2FkX2luZGV4ICsgal07Ci0JCWFlczEyOGsxMjhkKGtleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOwotCQlmb3IgKGogPSAwOyBqIDwgcGF5bG9hZF9yZW1haW5kZXI7IGorKykKLQkJCXBmcmFtZVtwYXlsb2FkX2luZGV4KytdID0gY2hhaW5fYnVmZmVyW2pdOwotCX0KLQotCS8qIHN0YXJ0IHRvIGNhbGN1bGF0ZSB0aGUgbWljICovCi0JaWYgKChoZHJsZW4gKyBwbGVuICsgOCkgPD0gTUFYX01TR19TSVpFKQotCQltZW1jcHkobWVzc2FnZSwgcGZyYW1lLCAoaGRybGVuICsgcGxlbiArIDgpKTsgLyogOCBpcyBmb3IgZXh0IGl2IGxlbiAqLwotCi0JcG5fdmVjdG9yWzBdID0gcGZyYW1lW2hkcmxlbl07Ci0JcG5fdmVjdG9yWzFdID0gcGZyYW1lW2hkcmxlbiArIDFdOwotCXBuX3ZlY3RvclsyXSA9IHBmcmFtZVtoZHJsZW4gKyA0XTsKLQlwbl92ZWN0b3JbM10gPSBwZnJhbWVbaGRybGVuICsgNV07Ci0JcG5fdmVjdG9yWzRdID0gcGZyYW1lW2hkcmxlbiArIDZdOwotCXBuX3ZlY3Rvcls1XSA9IHBmcmFtZVtoZHJsZW4gKyA3XTsKLQotCWNvbnN0cnVjdF9taWNfaXYobWljX2l2LCBxY19leGlzdHMsIGE0X2V4aXN0cywgbWVzc2FnZSwKLQkJCSBwbGVuIC0gOCwgcG5fdmVjdG9yKTsKLQotCWNvbnN0cnVjdF9taWNfaGVhZGVyMShtaWNfaGVhZGVyMSwgaGRybGVuLCBtZXNzYWdlKTsKLQljb25zdHJ1Y3RfbWljX2hlYWRlcjIobWljX2hlYWRlcjIsIG1lc3NhZ2UsIGE0X2V4aXN0cywgcWNfZXhpc3RzKTsKLQotCXBheWxvYWRfcmVtYWluZGVyID0gKHBsZW4gLSA4KSAlIDE2OwotCW51bV9ibG9ja3MgPSAocGxlbiAtIDgpIC8gMTY7Ci0KLQkvKiBGaW5kIHN0YXJ0IG9mIHBheWxvYWQgKi8KLQlwYXlsb2FkX2luZGV4ID0gaGRybGVuICsgODsKLQotCS8qIENhbGN1bGF0ZSBNSUMgKi8KLQlhZXMxMjhrMTI4ZChrZXksIG1pY19pdiwgYWVzX291dCk7Ci0JYml0d2lzZV94b3IoYWVzX291dCwgbWljX2hlYWRlcjEsIGNoYWluX2J1ZmZlcik7Ci0JYWVzMTI4azEyOGQoa2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOwotCWJpdHdpc2VfeG9yKGFlc19vdXQsIG1pY19oZWFkZXIyLCBjaGFpbl9idWZmZXIpOwotCWFlczEyOGsxMjhkKGtleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKLQkJYml0d2lzZV94b3IoYWVzX291dCwgJm1lc3NhZ2VbcGF5bG9hZF9pbmRleF0sIGNoYWluX2J1ZmZlcik7Ci0KLQkJcGF5bG9hZF9pbmRleCArPSAxNjsKLQkJYWVzMTI4azEyOGQoa2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOwotCX0KLQotCS8qIEFkZCBvbiB0aGUgZmluYWwgcGF5bG9hZCBibG9jayBpZiBpdCBuZWVkcyBwYWRkaW5nICovCi0JaWYgKHBheWxvYWRfcmVtYWluZGVyID4gMCkgewotCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkJCXBhZGRlZF9idWZmZXJbal0gPSAweDAwOwotCQlmb3IgKGogPSAwOyBqIDwgcGF5bG9hZF9yZW1haW5kZXI7IGorKykKLQkJCXBhZGRlZF9idWZmZXJbal0gPSBtZXNzYWdlW3BheWxvYWRfaW5kZXgrK107Ci0JCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7Ci0JCWFlczEyOGsxMjhkKGtleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQl9Ci0KLQlmb3IgKGogPSAwIDsgaiA8IDg7IGorKykKLQkJbWljW2pdID0gYWVzX291dFtqXTsKLQotCS8qIEluc2VydCBNSUMgaW50byBwYXlsb2FkICovCi0JZm9yIChqID0gMDsgaiA8IDg7IGorKykKLQkJbWVzc2FnZVtwYXlsb2FkX2luZGV4ICsgal0gPSBtaWNbal07Ci0KLQlwYXlsb2FkX2luZGV4ID0gaGRybGVuICsgODsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7Ci0JCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwgYTRfZXhpc3RzLCBxY19leGlzdHMsCi0JCQkJICAgICAgbWVzc2FnZSwgcG5fdmVjdG9yLCBpICsgMSk7Ci0JCWFlczEyOGsxMjhkKGtleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCQliaXR3aXNlX3hvcihhZXNfb3V0LCAmbWVzc2FnZVtwYXlsb2FkX2luZGV4XSwgY2hhaW5fYnVmZmVyKTsKLQkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0JCQltZXNzYWdlW3BheWxvYWRfaW5kZXgrK10gPSBjaGFpbl9idWZmZXJbal07Ci0JfQotCi0JaWYgKHBheWxvYWRfcmVtYWluZGVyID4gMCkgewotCQkvKiBJZiB0aGVyZSBpcyBhIHNob3J0IGZpbmFsIGJsb2NrLCB0aGVuIHBhZCBpdCwKLQkJICogZW5jcnlwdCBpdCBhbmQgY29weSB0aGUgdW5wYWRkZWQgcGFydCBiYWNrCi0JCSAqLwotCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsIGE0X2V4aXN0cywgcWNfZXhpc3RzLAotCQkJCSAgICAgIG1lc3NhZ2UsIHBuX3ZlY3RvciwgbnVtX2Jsb2NrcyArIDEpOwotCi0JCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotCQkJcGFkZGVkX2J1ZmZlcltqXSA9IDB4MDA7Ci0JCWZvciAoaiA9IDA7IGogPCBwYXlsb2FkX3JlbWFpbmRlcjsgaisrKQotCQkJcGFkZGVkX2J1ZmZlcltqXSA9IG1lc3NhZ2VbcGF5bG9hZF9pbmRleCArIGpdOwotCQlhZXMxMjhrMTI4ZChrZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKLQkJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKLQkJZm9yIChqID0gMDsgaiA8IHBheWxvYWRfcmVtYWluZGVyOyBqKyspCi0JCQltZXNzYWdlW3BheWxvYWRfaW5kZXgrK10gPSBjaGFpbl9idWZmZXJbal07Ci0JfQotCi0JLyogRW5jcnlwdCB0aGUgTUlDICovCi0JY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLCBhNF9leGlzdHMsIHFjX2V4aXN0cywgbWVzc2FnZSwKLQkJCSAgICAgIHBuX3ZlY3RvciwgMCk7Ci0KLQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkJcGFkZGVkX2J1ZmZlcltqXSA9IDB4MDA7Ci0JZm9yIChqID0gMDsgaiA8IDg7IGorKykKLQkJcGFkZGVkX2J1ZmZlcltqXSA9IG1lc3NhZ2VbaiArIGhkcmxlbiArIDggKyBwbGVuIC0gOF07Ci0KLQlhZXMxMjhrMTI4ZChrZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKLQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOwotCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCi0JCW1lc3NhZ2VbcGF5bG9hZF9pbmRleCsrXSA9IGNoYWluX2J1ZmZlcltqXTsKLQotCS8qIGNvbXBhcmUgdGhlIG1pYyAqLwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJaWYgKHBmcmFtZVtoZHJsZW4gKyA4ICsgcGxlbiAtIDggKyBpXSAhPSBtZXNzYWdlW2hkcmxlbiArIDggKyBwbGVuIC0gOCArIGldKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKLQkJCQkgIiVzOm1pYyBjaGVjayBlcnJvciBtaWNbJWRdOiBwZnJhbWUoJXgpICE9IG1lc3NhZ2UoJXgpXG4iLAotCQkJCSBfX2Z1bmNfXywgaSwKLQkJCQkgcGZyYW1lW2hkcmxlbiArIDggKyBwbGVuIC0gOCArIGldLAotCQkJCSBtZXNzYWdlW2hkcmxlbiArIDggKyBwbGVuIC0gOCArIGldKTsKLQkJCURCR184NzIzQSgiJXM6bWljIGNoZWNrIGVycm9yIG1pY1slZF06IHBmcmFtZSgleCkgIT0gbWVzc2FnZSgleClcbiIsCi0JCQkJICBfX2Z1bmNfXywgaSwKLQkJCQkgIHBmcmFtZVtoZHJsZW4gKyA4ICsgcGxlbiAtIDggKyBpXSwKLQkJCQkgIG1lc3NhZ2VbaGRybGVuICsgOCArIHBsZW4gLSA4ICsgaV0pOwotCQkJcmVzID0gX0ZBSUw7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlczsKLX0KLQotaW50IHJ0d19hZXNfZGVjcnlwdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCi17CS8qICBleGNsdWRlIElDViAqLwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhaW5mbzsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcHJ4YXR0cmliID0gJnByZWN2ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdmZyYW1lLT5wa3Q7Ci0JaW50IGxlbmd0aDsKLQl1OCAqcGZyYW1lLCAqcHJ3c2tleTsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlwZnJhbWUgPSBza2ItPmRhdGE7Ci0JLyogNCBzdGFydCB0byBlbmNyeXB0IGVhY2ggZnJhZ21lbnQgKi8KLQlpZiAocHJ4YXR0cmliLT5lbmNyeXB0ICE9IFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVApCi0JCXJldHVybiBfRkFJTDsKLQotCXN0YWluZm8gPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LCAmcHJ4YXR0cmliLT50YVswXSk7Ci0JaWYgKCFzdGFpbmZvKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkJICIlczogc3RhaW5mbyA9PSBOVUxMISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCi0JCSAiJXM6IHN0YWluZm8hPSBOVUxMISEhXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocHJ4YXR0cmliLT5yYSkpIHsKLQkJLyogaW4gY29uY3VycmVudCB3ZSBzaG91bGQgdXNlIHN3IGRlY3J5cHQgaW4KLQkJICogZ3JvdXAga2V5LCBzbyB3ZSByZW1vdmUgdGhpcyBtZXNzYWdlCi0JCSAqLwotCQlpZiAoIXBzZWN1cml0eXByaXYtPmJpbnN0YWxsR3Jwa2V5KSB7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCURCR184NzIzQSgiJXM6cnggYmMvbWMgcGFja2V0cywgYnV0IGRpZG4ndCBpbnN0YWxsICIKLQkJCQkgICJncm91cCBrZXkhISEhISEhISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJcHJ3c2tleSA9IHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlbcHJ4YXR0cmliLT5rZXlfaW5kZXhdLnNrZXk7Ci0JCWlmIChwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWQgIT0gcHJ4YXR0cmliLT5rZXlfaW5kZXgpIHsKLQkJCURCR184NzIzQSgibm90IG1hdGNoIHBhY2tldF9pbmRleCA9JWQsIGluc3RhbGxfaW5kZXggPSIKLQkJCQkgICIlZFxuIiwgcHJ4YXR0cmliLT5rZXlfaW5kZXgsCi0JCQkJICBwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWQpOwotCQkJcmVzID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQl9IGVsc2UgewotCQlwcndza2V5ID0gJnN0YWluZm8tPmRvdDExODAyMXhfVW5jc3RLZXkuc2tleVswXTsKLQl9Ci0KLQlsZW5ndGggPSBza2ItPmxlbiAtIHByeGF0dHJpYi0+aGRybGVuIC0JcHJ4YXR0cmliLT5pdl9sZW47Ci0KLQlyZXMgPSBhZXNfZGVjaXBoZXIocHJ3c2tleSwgcHJ4YXR0cmliLT5oZHJsZW4sIHBmcmFtZSwgbGVuZ3RoKTsKLWV4aXQ6Ci0JcmV0dXJuIHJlczsKLX0KLQotdm9pZCBydHdfdXNlX3RraXBrZXlfaGFuZGxlcjIzYSh2b2lkICpmdW5jdGlvbl9jb250ZXh0KQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBmdW5jdGlvbl9jb250ZXh0OwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCi0JCSAiXl5eJXMgXl5eXG4iLCBfX2Z1bmNfXyk7Ci0JcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSA9IDE7Ci0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCi0JCSAiXl5eJXMgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSA9JWReXl5cbiIsCi0JCSBfX2Z1bmNfXywgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3NyZXNldC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19zcmVzZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlhMjlkOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3NyZXNldC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8cnR3X3NyZXNldC5oPgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotdm9pZCBydHdfc3Jlc2V0X2luaXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3Qgc3Jlc2V0X3ByaXYgKnBzcnRwcml2ID0gJnBIYWxEYXRhLT5zcmVzdHByaXY7Ci0KLQltdXRleF9pbml0KCZwc3J0cHJpdi0+c2lsZW50cmVzZXRfbXV0ZXgpOwotCXBzcnRwcml2LT5zaWxlbnRfcmVzZXRfaW5wcm9ncmVzcyA9IGZhbHNlOwotCXBzcnRwcml2LT5sYXN0X3R4X3RpbWUgPSAwOwotCXBzcnRwcml2LT5sYXN0X3R4X2NvbXBsZXRlX3RpbWUgPSAwOwotfQotCi12b2lkIHJ0d19zcmVzZXRfcmVzZXRfdmFsdWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3Qgc3Jlc2V0X3ByaXYgKnBzcnRwcml2ID0gJnBIYWxEYXRhLT5zcmVzdHByaXY7Ci0KLQlwc3J0cHJpdi0+c2lsZW50X3Jlc2V0X2lucHJvZ3Jlc3MgPSBmYWxzZTsKLQlwc3J0cHJpdi0+bGFzdF90eF90aW1lID0gMDsKLQlwc3J0cHJpdi0+bGFzdF90eF9jb21wbGV0ZV90aW1lID0gMDsKLX0KLQotYm9vbCBydHdfc3Jlc2V0X2lucHJvZ3Jlc3Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnByaW1hcnlfYWRhcHRlciA9IEdFVF9QUklNQVJZX0FEQVBURVIocGFkYXB0ZXIpOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocHJpbWFyeV9hZGFwdGVyKTsKLQotCXJldHVybiBwSGFsRGF0YS0+c3Jlc3Rwcml2LnNpbGVudF9yZXNldF9pbnByb2dyZXNzOwotfQotCi1zdGF0aWMgdm9pZCBzcmVzZXRfcmVzdG9yZV9zZWN1cml0eV9zdGF0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2Lm1sbWV4dF9pbmZvOwotCXU4IHZhbDg7Ci0KLQlpZiAocG1sbWVpbmZvLT5hdXRoX2FsZ28gPT0gZG90MTFBdXRoQWxncnRobV84MDIxWCkKLQkJdmFsOCA9IDB4Y2M7Ci0JZWxzZQotCQl2YWw4ID0gMHhjZjsKLQotCXJ0bDg3MjNhX3NldF9zZWNfY2ZnKHBhZGFwdGVyLCB2YWw4KTsKLQotCWlmIChwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gPT0KLQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCB8fAotCSAgICBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gPT0KLQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCkgewotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBnZXRfYnNzaWQobWxtZXByaXYpKTsKLQkJaWYgKHBzdGEgPT0gTlVMTCkgewotCQkJLyogREVCVUdfRVJSKCgiU2V0IHdwYV9zZXRfZW5jcnlwdGlvbjogT2J0YWluIFN0YV9pbmZvIGZhaWxcbiIpKTsgKi8KLQkJfSBlbHNlIHsKLQkJCS8qIHBhaXJ3aXNlIGtleSAqLwotCQkJcnR3X3NldHN0YWtleV9jbWQyM2EocGFkYXB0ZXIsICh1bnNpZ25lZCBjaGFyICopcHN0YSwgdHJ1ZSk7Ci0JCQkvKiBncm91cCBrZXkgKi8KLQkJCXJ0d19zZXRfa2V5MjNhKHBhZGFwdGVyLCZwYWRhcHRlci0+c2VjdXJpdHlwcml2LCBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExODAyMVhHcnBLZXlpZCwgMCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHNyZXNldF9yZXN0b3JlX25ldHdvcmtfc3RhdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKm1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXU4IHRocmVzaG9sZDsKLQotCXJ0d19zZXRvcG1vZGVfY21kMjNhKHBhZGFwdGVyLCBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKTsKLQotCS8qICBUSCA9IDEgPT4gbWVhbnMgdGhhdCBpbnZhbGlkYXRlIHVzYiByeCBhZ2dyZWdhdGlvbiAqLwotCS8qICBUSCA9IDAgPT4gbWVhbnMgdGhhdCB2YWxpZGF0ZSB1c2IgcnggYWdncmVnYXRpb24sIHVzZSBpbml0IHZhbHVlLiAqLwotCWlmIChtbG1lcHJpdi0+aHRwcml2Lmh0X29wdGlvbikgewotCQlpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aWZpX3NwZWMgPT0gMSkKLQkJCXRocmVzaG9sZCA9IDE7Ci0JCWVsc2UKLQkJCXRocmVzaG9sZCA9IDA7Ci0JfSBlbHNlCi0JCXRocmVzaG9sZCA9IDE7Ci0KLQlydGw4NzIzYV9zZXRfcnhkbWFfYWdnX3BnX3RoKHBhZGFwdGVyLCB0aHJlc2hvbGQpOwotCi0Jc2V0X2NoYW5uZWxfYndtb2RlMjNhKHBhZGFwdGVyLCBwbWxtZWV4dC0+Y3VyX2NoYW5uZWwsCi0JCQkgICAgICBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCwgcG1sbWVleHQtPmN1cl9id21vZGUpOwotCi0JaHdfdmFyX3NldF9ic3NpZChwYWRhcHRlciwgcG1sbWVpbmZvLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCWh3X3Zhcl9zZXRfbWxtZV9qb2luKHBhZGFwdGVyLCAwKTsKLQotCXJ0bDg3MjNhX3NldF9tZWRpYV9zdGF0dXMocGFkYXB0ZXIsIHBtbG1laW5mby0+c3RhdGUgJiAweDMpOwotCi0JbWxtZWV4dF9qb2luYnNzX2V2ZW50X2NhbGxiYWNrMjNhKHBhZGFwdGVyLCAxKTsKLQkvKiByZXN0b3JlIFNlcXVlbmNlIE5vLiAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19OUU9TX1NFUSwgcGFkYXB0ZXItPnhtaXRwcml2Lm5xb3Nfc3NuKTsKLQotCXNyZXNldF9yZXN0b3JlX3NlY3VyaXR5X3N0YXRpb24ocGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBzcmVzZXRfcmVzdG9yZV9uZXR3b3JrX3N0YXR1cyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKm1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWlmIChjaGVja19md3N0YXRlKG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCURCR184NzIzQSgiJXMoJXMpOiBmd3N0YXRlOjB4JTA4eCAtIFdJRklfU1RBVElPTl9TVEFURVxuIiwKLQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJICBnZXRfZndzdGF0ZShtbG1lcHJpdikpOwotCQlzcmVzZXRfcmVzdG9yZV9uZXR3b3JrX3N0YXRpb24ocGFkYXB0ZXIpOwotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLQkJREJHXzg3MjNBKCIlcyglcyk6IGZ3c3RhdGU6MHglMDh4IC0gV0lGSV9BUF9TVEFURVxuIiwKLQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJICBnZXRfZndzdGF0ZShtbG1lcHJpdikpOwotCQlydHdfYXBfcmVzdG9yZV9uZXR3b3JrKHBhZGFwdGVyKTsKLSNlbmRpZgotCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSkpIHsKLQkJREJHXzg3MjNBKCIlcyglcyk6IGZ3c3RhdGU6MHglMDh4IC0gV0lGSV9BREhPQ19TVEFURVxuIiwKLQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJICBnZXRfZndzdGF0ZShtbG1lcHJpdikpOwotCX0gZWxzZSB7Ci0JCURCR184NzIzQSgiJXMoJXMpOiBmd3N0YXRlOjB4JTA4eCAtID8/P1xuIiwgX19mdW5jX18sCi0JCQkgIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLCBnZXRfZndzdGF0ZShtbG1lcHJpdikpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgc3Jlc2V0X3N0b3BfYWRhcHRlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCWlmIChwYWRhcHRlciA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQotCWlmICghcnR3X25ldGlmX3F1ZXVlX3N0b3BwZWQocGFkYXB0ZXItPnBuZXRkZXYpKQotCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMocGFkYXB0ZXItPnBuZXRkZXYpOwotCi0JcnR3X2NhbmNlbF9hbGxfdGltZXIyM2EocGFkYXB0ZXIpOwotCi0JLyogVE9ETzogT1MgYW5kIEhDSSBpbmRlcGVuZGVudCAqLwotCXRhc2tsZXRfa2lsbCgmcHhtaXRwcml2LT54bWl0X3Rhc2tsZXQpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSkKLQkJcnR3X3NjYW5fYWJvcnQyM2EocGFkYXB0ZXIpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORykpCi0JCXJ0dzIzYV9qb2luX3RvX2hhbmRsZXIoKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBzcmVzZXRfc3RhcnRfYWRhcHRlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCWlmIChwYWRhcHRlciA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpCi0JCXNyZXNldF9yZXN0b3JlX25ldHdvcmtfc3RhdHVzKHBhZGFwdGVyKTsKLQotCS8qIFRPRE86IE9TIGFuZCBIQ0kgaW5kZXBlbmRlbnQgKi8KLQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZweG1pdHByaXYtPnhtaXRfdGFza2xldCk7Ci0KLQltb2RfdGltZXIoJnBhZGFwdGVyLT5tbG1lcHJpdi5keW5hbWljX2Noa190aW1lciwKLQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKSk7Ci0KLQlpZiAocnR3X25ldGlmX3F1ZXVlX3N0b3BwZWQocGFkYXB0ZXItPnBuZXRkZXYpKQotCQluZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMocGFkYXB0ZXItPnBuZXRkZXYpOwotfQotCi12b2lkIHJ0d19zcmVzZXRfcmVzZXQoc3RydWN0IHJ0d19hZGFwdGVyICphY3RpdmVfYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gR0VUX1BSSU1BUllfQURBUFRFUihhY3RpdmVfYWRhcHRlcik7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IHNyZXNldF9wcml2ICpwc3J0cHJpdiA9ICZwSGFsRGF0YS0+c3Jlc3Rwcml2OwotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cnByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOwotCi0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JbXV0ZXhfbG9jaygmcHNydHByaXYtPnNpbGVudHJlc2V0X211dGV4KTsKLQlwc3J0cHJpdi0+c2lsZW50X3Jlc2V0X2lucHJvZ3Jlc3MgPSB0cnVlOwotCXB3cnByaXYtPmNoYW5nZV9yZnB3cnN0YXRlID0gcmZfb2ZmOwotCi0Jc3Jlc2V0X3N0b3BfYWRhcHRlcihwYWRhcHRlcik7Ci0KLQlpcHNfZW50ZXIyM2EocGFkYXB0ZXIpOwotCWlwc19sZWF2ZTIzYShwYWRhcHRlcik7Ci0KLQlzcmVzZXRfc3RhcnRfYWRhcHRlcihwYWRhcHRlcik7Ci0JcHNydHByaXYtPnNpbGVudF9yZXNldF9pbnByb2dyZXNzID0gZmFsc2U7Ci0JbXV0ZXhfdW5sb2NrKCZwc3J0cHJpdi0+c2lsZW50cmVzZXRfbXV0ZXgpOwotCi0JREJHXzg3MjNBKCIlcyBkb25lIGluICVkIG1zXG4iLCBfX2Z1bmNfXywKLQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19zdGFfbWd0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3N0YV9tZ3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliNzc4Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3N0YV9tZ3QuYworKysgL2Rldi9udWxsCkBAIC0xLDQzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1JUV19TVEFfTUdUX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgotI2luY2x1ZGUgPHhtaXRfb3NkZXAuaD4KLSNpbmNsdWRlIDxtbG1lX29zZGVwLmg+Ci0jaW5jbHVkZSA8c3RhX2luZm8uaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLQotc3RhdGljIGNvbnN0IHU4IGJjX2FkZHJbRVRIX0FMRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotCi1zdGF0aWMgdm9pZCBfcnR3X2luaXRfc3RhaW5mbyhzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0JbWVtc2V0KCh1OCAqKXBzdGEsIDAsIHNpemVvZihzdHJ1Y3Qgc3RhX2luZm8pKTsKLQlzcGluX2xvY2tfaW5pdCgmcHN0YS0+bG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnBzdGEtPmxpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZwc3RhLT5oYXNoX2xpc3QpOwotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHN0YS0+c2xlZXBfcSk7Ci0JcHN0YS0+c2xlZXBxX2xlbiA9IDA7Ci0JX3J0d19pbml0X3N0YV94bWl0X3ByaXYyM2EoJnBzdGEtPnN0YV94bWl0cHJpdik7Ci0JX3J0d19pbml0X3N0YV9yZWN2X3ByaXYyM2EoJnBzdGEtPnN0YV9yZWN2cHJpdik7Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JSU5JVF9MSVNUX0hFQUQoJnBzdGEtPmFzb2NfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJnBzdGEtPmF1dGhfbGlzdCk7Ci0JcHN0YS0+ZXhwaXJlX3RvID0gMDsKLQlwc3RhLT5mbGFncyA9IDA7Ci0JcHN0YS0+Y2FwYWJpbGl0eSA9IDA7Ci0JcHN0YS0+YnBhaXJ3aXNlX2tleV9pbnN0YWxsZWQgPSBmYWxzZTsKLQlwc3RhLT5ub25lcnBfc2V0ID0gMDsKLQlwc3RhLT5ub19zaG9ydF9zbG90X3RpbWVfc2V0ID0gMDsKLQlwc3RhLT5ub19zaG9ydF9wcmVhbWJsZV9zZXQgPSAwOwotCXBzdGEtPm5vX2h0X2dmX3NldCA9IDA7Ci0JcHN0YS0+bm9faHRfc2V0ID0gMDsKLQlwc3RhLT5odF8yMG1oel9zZXQgPSAwOwotCXBzdGEtPmtlZXBfYWxpdmVfdHJ5Y250ID0gMDsKLSNlbmRpZgkvKiAgQ09ORklHXzg3MjNBVV9BUF9NT0RFICovCi19Ci0KLWludCBfcnR3X2luaXRfc3RhX3ByaXYyM2Eoc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdikKLXsKLQlpbnQgaTsKLQotCXNwaW5fbG9ja19pbml0KCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JcHN0YXByaXYtPmFzb2Nfc3RhX2NvdW50ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1NUQTsgaSsrKQotCQlJTklUX0xJU1RfSEVBRCgmcHN0YXByaXYtPnN0YV9oYXNoW2ldKTsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCXBzdGFwcml2LT5zdGFfZHpfYml0bWFwID0gMDsKLQlwc3RhcHJpdi0+dGltX2JpdG1hcCA9IDA7Ci0JSU5JVF9MSVNUX0hFQUQoJnBzdGFwcml2LT5hc29jX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZwc3RhcHJpdi0+YXV0aF9saXN0KTsKLQlzcGluX2xvY2tfaW5pdCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmcHN0YXByaXYtPmF1dGhfbGlzdF9sb2NrKTsKLQlwc3RhcHJpdi0+YXNvY19saXN0X2NudCA9IDA7Ci0JcHN0YXByaXYtPmF1dGhfbGlzdF9jbnQgPSAwOwotCXBzdGFwcml2LT5hdXRoX3RvID0gMzsgLyogIDMqMiA9IDYgc2VjICovCi0JcHN0YXByaXYtPmFzc29jX3RvID0gMzsKLQkvKiBwc3RhcHJpdi0+ZXhwaXJlX3RvID0gOTAwOyAgOTAwKjIgPSAxODAwIHNlYyA9IDMwIG1pbiwKLQkgICAgZXhwaXJlIGFmdGVyIG5vIGFueSB0cmFmZmljLiAqLwotCS8qIHBzdGFwcml2LT5leHBpcmVfdG8gPSAzMDsgIDMwKjIgPSA2MCBzZWMgPSAxIG1pbiwKLQkgICAgZXhwaXJlIGFmdGVyIG5vIGFueSB0cmFmZmljLiAqLwotCXBzdGFwcml2LT5leHBpcmVfdG8gPSAzOyAvKiAgMyoyID0gNiBzZWMgKi8KLQlwc3RhcHJpdi0+bWF4X251bV9zdGEgPSBOVU1fU1RBOwotI2VuZGlmCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1pbnQgX3J0d19mcmVlX3N0YV9wcml2MjNhKHN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhLCAqcHRtcDsKLQlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmw7Ci0JaW50IGluZGV4OwotCi0JaWYgKHBzdGFwcml2KSB7Ci0JCS8qCWRlbGV0ZSBhbGwgcmVvcmRlcmluZ19jdHJsX3RpbWVyCQkqLwotCQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX1NUQTsgaW5kZXgrKykgewotCQkJcGhlYWQgPSAmcHN0YXByaXYtPnN0YV9oYXNoW2luZGV4XTsKLQkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwc3RhLCBwdG1wLCBwaGVhZCwgaGFzaF9saXN0KSB7Ci0JCQkJaW50IGk7Ci0KLQkJCQlmb3IgKGkgPSAwOyBpIDwgMTYgOyBpKyspIHsKLQkJCQkJcHJlb3JkZXJfY3RybCA9ICZwc3RhLT5yZWN2cmVvcmRlcl9jdHJsW2ldOwotCQkJCQlkZWxfdGltZXJfc3luYygmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQkJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQl9Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdHJ1Y3Qgc3RhX2luZm8gKgotcnR3X2FsbG9jX3N0YWluZm8yM2Eoc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiwgY29uc3QgdTggKmh3YWRkciwgZ2ZwX3QgZ2ZwKQotewotCXN0cnVjdCBsaXN0X2hlYWQJKnBoYXNoX2xpc3Q7Ci0Jc3RydWN0IHN0YV9pbmZvCSpwc3RhOwotCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybDsKLQlzMzIJaW5kZXg7Ci0JaW50IGkgPSAwOwotCXUxNiAgd1J4U2VxSW5pdGlhbFZhbHVlID0gMHhmZmZmOwotCi0JcHN0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdGFfaW5mbyksIGdmcCk7Ci0JaWYgKCFwc3RhKQotCQlyZXR1cm4gTlVMTDsKLQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCi0JX3J0d19pbml0X3N0YWluZm8ocHN0YSk7Ci0KLQlwc3RhLT5wYWRhcHRlciA9IHBzdGFwcml2LT5wYWRhcHRlcjsKLQotCWV0aGVyX2FkZHJfY29weShwc3RhLT5od2FkZHIsIGh3YWRkcik7Ci0KLQlpbmRleCA9IHdpZmlfbWFjX2hhc2goaHdhZGRyKTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zdGFfbWd0X2NfLCBfZHJ2X2luZm9fLAotCQkgInJ0d19hbGxvY19zdGFpbmZvMjNhOiBpbmRleCAgPSAleFxuIiwgaW5kZXgpOwotCWlmIChpbmRleCA+PSBOVU1fU1RBKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zdGFfbWd0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkVSUk9SID0+IHJ0d19hbGxvY19zdGFpbmZvMjNhOiBpbmRleCA+PSBOVU1fU1RBXG4iKTsKLQkJcHN0YSA9IE5VTEw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JcGhhc2hfbGlzdCA9ICZwc3RhcHJpdi0+c3RhX2hhc2hbaW5kZXhdOwotCi0JbGlzdF9hZGRfdGFpbCgmcHN0YS0+aGFzaF9saXN0LCBwaGFzaF9saXN0KTsKLQotCXBzdGFwcml2LT5hc29jX3N0YV9jb3VudCsrOwotCi0vKiAgRm9yIHRoZSBTTUMgcm91dGVyLCB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIGZpcnN0IHBhY2tldCBvZiBXUFMKLSAgICAgaGFuZHNoYWtlIHdpbGwgYmUgMC4gKi8KLS8qICBJbiB0aGlzIGNhc2UsIHRoaXMgcGFja2V0IHdpbGwgYmUgZHJvcHBlZCBieSByZWN2X2RlY2FjaGUgZnVuY3Rpb24KLSAgICBpZiB3ZSB1c2UgdGhlIDB4MDAgYXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRpZF9yeHNlcSB2YXJpYWJsZS4gKi8KLS8qICBTbywgd2UgaW5pdGlhbGl6ZSB0aGUgdGlkX3J4c2VxIHZhcmlhYmxlIGFzIHRoZSAweGZmZmYuICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJbWVtY3B5KCZwc3RhLT5zdGFfcmVjdnByaXYucnhjYWNoZS50aWRfcnhzZXFbaV0sCi0JCQkmd1J4U2VxSW5pdGlhbFZhbHVlLCAyKTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zdGFfbWd0X2NfLCBfZHJ2X2luZm9fLAotCQkgImFsbG9jIG51bWJlcl8lZCBzdGFpbmZvICB3aXRoIGh3YWRkciA9ICVwTVxuIiwKLQkJIHBzdGFwcml2LT5hc29jX3N0YV9jb3VudCwgaHdhZGRyKTsKLQotCWluaXRfYWRkYmFfcmV0cnlfdGltZXIyM2EocHN0YSk7Ci0KLQkvKiBmb3IgQS1NUERVIFJ4IHJlb3JkZXJpbmcgYnVmZmVyIGNvbnRyb2wgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQlwcmVvcmRlcl9jdHJsID0gJnBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbaV07Ci0KLQkJcHJlb3JkZXJfY3RybC0+cGFkYXB0ZXIgPSBwc3RhcHJpdi0+cGFkYXB0ZXI7Ci0KLQkJcHJlb3JkZXJfY3RybC0+ZW5hYmxlID0gZmFsc2U7Ci0KLQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0gMHhmZmZmOwotCQlwcmVvcmRlcl9jdHJsLT53ZW5kX2IgPSAweGZmZmY7Ci0JCS8qIHByZW9yZGVyX2N0cmwtPndzaXplX2IgPSAoTlJfUkVDVkJVRkYtMik7ICovCi0JCXByZW9yZGVyX2N0cmwtPndzaXplX2IgPSA2NDsvKiA2NDsgKi8KLQotCQlfcnR3X2luaXRfcXVldWUyM2EoJnByZW9yZGVyX2N0cmwtPnBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlKTsKLQotCQlydHdfaW5pdF9yZWN2X3RpbWVyMjNhKHByZW9yZGVyX2N0cmwpOwotCX0KLQkvKiBpbml0IGZvciBETSAqLwotCXBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA9ICgtMSk7Ci0JcHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRDQ0sgPSAoLTEpOwotCi0JLyogaW5pdCBmb3IgdGhlIHNlcXVlbmNlIG51bWJlciBvZiByZWNlaXZlZCBtYW5hZ2VtZW50IGZyYW1lICovCi0JcHN0YS0+UnhNZ210RnJhbWVTZXFOdW0gPSAweGZmZmY7Ci1leGl0OgotCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JcmV0dXJuIHBzdGE7Ci19Ci0KLS8qICB1c2luZyBwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayB0byBwcm90ZWN0ICovCi1pbnQgcnR3X2ZyZWVfc3RhaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0Jc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsOwotCXN0cnVjdAlzdGFfeG1pdF9wcml2CSpwc3RheG1pdHByaXY7Ci0Jc3RydWN0CXhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QJc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBod194bWl0ICpwaHd4bWl0OwotCWludCBpOwotCi0JaWYgKCFwc3RhKQotCQlnb3RvIGV4aXQ7Ci0KLQlzcGluX2xvY2tfYmgoJnBzdGEtPmxvY2spOwotCXBzdGEtPnN0YXRlICY9IH5fRldfTElOS0VEOwotCXNwaW5fdW5sb2NrX2JoKCZwc3RhLT5sb2NrKTsKLQotCXBzdGF4bWl0cHJpdiA9ICZwc3RhLT5zdGFfeG1pdHByaXY7Ci0KLQlzcGluX2xvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0KLQlydHdfZnJlZV94bWl0ZnJhbWVfcXVldWUyM2EocHhtaXRwcml2LCAmcHN0YS0+c2xlZXBfcSk7Ci0JcHN0YS0+c2xlZXBxX2xlbiA9IDA7Ci0KLQkvKiB2byAqLwotCXJ0d19mcmVlX3htaXRmcmFtZV9xdWV1ZTIzYShweG1pdHByaXYsICZwc3RheG1pdHByaXYtPnZvX3Euc3RhX3BlbmRpbmcpOwotCWxpc3RfZGVsX2luaXQoJnBzdGF4bWl0cHJpdi0+dm9fcS50eF9wZW5kaW5nKTsKLQlwaHd4bWl0ID0gcHhtaXRwcml2LT5od3htaXRzOwotCXBod3htaXQtPmFjY250IC09IHBzdGF4bWl0cHJpdi0+dm9fcS5xY250OwotCXBzdGF4bWl0cHJpdi0+dm9fcS5xY250ID0gMDsKLQotCS8qIHZpICovCi0JcnR3X2ZyZWVfeG1pdGZyYW1lX3F1ZXVlMjNhKHB4bWl0cHJpdiwgJnBzdGF4bWl0cHJpdi0+dmlfcS5zdGFfcGVuZGluZyk7Ci0JbGlzdF9kZWxfaW5pdCgmcHN0YXhtaXRwcml2LT52aV9xLnR4X3BlbmRpbmcpOwotCXBod3htaXQgPSBweG1pdHByaXYtPmh3eG1pdHMrMTsKLQlwaHd4bWl0LT5hY2NudCAtPSBwc3RheG1pdHByaXYtPnZpX3EucWNudDsKLQlwc3RheG1pdHByaXYtPnZpX3EucWNudCA9IDA7Ci0KLQkvKiBiZSAqLwotCXJ0d19mcmVlX3htaXRmcmFtZV9xdWV1ZTIzYShweG1pdHByaXYsICZwc3RheG1pdHByaXYtPmJlX3Euc3RhX3BlbmRpbmcpOwotCWxpc3RfZGVsX2luaXQoJnBzdGF4bWl0cHJpdi0+YmVfcS50eF9wZW5kaW5nKTsKLQlwaHd4bWl0ID0gcHhtaXRwcml2LT5od3htaXRzKzI7Ci0JcGh3eG1pdC0+YWNjbnQgLT0gcHN0YXhtaXRwcml2LT5iZV9xLnFjbnQ7Ci0JcHN0YXhtaXRwcml2LT5iZV9xLnFjbnQgPSAwOwotCi0JLyogYmsgKi8KLQlydHdfZnJlZV94bWl0ZnJhbWVfcXVldWUyM2EocHhtaXRwcml2LCAmcHN0YXhtaXRwcml2LT5ia19xLnN0YV9wZW5kaW5nKTsKLQlsaXN0X2RlbF9pbml0KCZwc3RheG1pdHByaXYtPmJrX3EudHhfcGVuZGluZyk7Ci0JcGh3eG1pdCA9IHB4bWl0cHJpdi0+aHd4bWl0cyszOwotCXBod3htaXQtPmFjY250IC09IHBzdGF4bWl0cHJpdi0+YmtfcS5xY250OwotCXBzdGF4bWl0cHJpdi0+YmtfcS5xY250ID0gMDsKLQotCXNwaW5fdW5sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCi0JbGlzdF9kZWxfaW5pdCgmcHN0YS0+aGFzaF9saXN0KTsKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc3RhX21ndF9jXywgX2Rydl9lcnJfLAotCQkgImZyZWUgbnVtYmVyXyVkIHN0YWluZm8gIHdpdGggaHdhZGRyID0gJXBNXG4iLAotCQkgcHN0YXByaXYtPmFzb2Nfc3RhX2NvdW50LCBwc3RhLT5od2FkZHIpOwotCXBzdGFwcml2LT5hc29jX3N0YV9jb3VudC0tOwotCi0JLyogIHJlLWluaXQgc3RhX2luZm87IDIwMDYxMTE0ICB3aWxsIGJlIGluaXQgaW4gYWxsb2Nfc3RhaW5mbyAqLwotCS8qIF9ydHdfaW5pdF9zdGFfeG1pdF9wcml2MjNhKCZwc3RhLT5zdGFfeG1pdHByaXYpOyAqLwotCS8qIF9ydHdfaW5pdF9zdGFfcmVjdl9wcml2MjNhKCZwc3RhLT5zdGFfcmVjdnByaXYpOyAqLwotCi0JZGVsX3RpbWVyX3N5bmMoJnBzdGEtPmFkZGJhX3JldHJ5X3RpbWVyKTsKLQotCS8qIGZvciBBLU1QRFUgUnggcmVvcmRlcmluZyBidWZmZXIgY29udHJvbCwKLQkgICBjYW5jZWwgcmVvcmRlcmluZ19jdHJsX3RpbWVyICovCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJc3RydWN0IGxpc3RfaGVhZAkqcGhlYWQsICpwbGlzdDsKLQkJc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWU7Ci0JCXN0cnVjdCBydHdfcXVldWUgKnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKLQotCQlwcmVvcmRlcl9jdHJsID0gJnBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbaV07Ci0KLQkJZGVsX3RpbWVyX3N5bmMoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lcik7Ci0KLQkJcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlID0KLQkJCSZwcmVvcmRlcl9jdHJsLT5wZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKLQotCQlzcGluX2xvY2tfYmgoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jayk7Ci0JCXBoZWFkID0JCWdldF9saXN0X2hlYWQocHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlKTsKLQkJcGxpc3QgPSBwaGVhZC0+bmV4dDsKLQotCQl3aGlsZSAoIWxpc3RfZW1wdHkocGhlYWQpKSB7Ci0JCQlwcmZyYW1lID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcmVjdl9mcmFtZSwgbGlzdCk7Ci0JCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwotCQkJbGlzdF9kZWxfaW5pdCgmcHJmcmFtZS0+bGlzdCk7Ci0JCQlydHdfZnJlZV9yZWN2ZnJhbWUyM2EocHJmcmFtZSk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jayk7Ci0JfQotCWlmICghKHBzdGEtPnN0YXRlICYgV0lGSV9BUF9TVEFURSkpCi0JCXJ0bDg3MjNhX1NldEhhbE9ETVZhcihwYWRhcHRlciwgSEFMX09ETV9TVEFfSU5GTywgcHN0YSwgZmFsc2UpOwotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmF1dGhfbGlzdF9sb2NrKTsKLQlpZiAoIWxpc3RfZW1wdHkoJnBzdGEtPmF1dGhfbGlzdCkpIHsKLQkJbGlzdF9kZWxfaW5pdCgmcHN0YS0+YXV0aF9saXN0KTsKLQkJcHN0YXByaXYtPmF1dGhfbGlzdF9jbnQtLTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hdXRoX2xpc3RfbG9jayk7Ci0KLQlwc3RhLT5leHBpcmVfdG8gPSAwOwotCi0JcHN0YS0+c2xlZXBxX2FjX2xlbiA9IDA7Ci0JcHN0YS0+cW9zX2luZm8gPSAwOwotCi0JcHN0YS0+bWF4X3NwX2xlbiA9IDA7Ci0JcHN0YS0+dWFwc2RfYmsgPSAwOwotCXBzdGEtPnVhcHNkX2JlID0gMDsKLQlwc3RhLT51YXBzZF92aSA9IDA7Ci0JcHN0YS0+dWFwc2Rfdm8gPSAwOwotCi0JcHN0YS0+aGFzX2xlZ2FjeV9hYyA9IDA7Ci0KLQlwc3RhcHJpdi0+c3RhX2R6X2JpdG1hcCAmPSB+Q0hLQklUKHBzdGEtPmFpZCk7Ci0JcHN0YXByaXYtPnRpbV9iaXRtYXAgJj0gfkNIS0JJVChwc3RhLT5haWQpOwotCi0JaWYgKChwc3RhLT5haWQgPiAwKSAmJiAocHN0YXByaXYtPnN0YV9haWRbcHN0YS0+YWlkIC0gMV0gPT0gcHN0YSkpIHsKLQkJcHN0YXByaXYtPnN0YV9haWRbcHN0YS0+YWlkIC0gMV0gPSBOVUxMOwotCQlwc3RhLT5haWQgPSAwOwotCX0KLSNlbmRpZgkvKiAgQ09ORklHXzg3MjNBVV9BUF9NT0RFICovCi0KLQlrZnJlZShwc3RhKTsKLWV4aXQ6Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi0vKiAgZnJlZSBhbGwgc3RhaW5mbyB3aGljaCBpbiBzdGFfaGFzaFthbGxdICovCi12b2lkIHJ0d19mcmVlX2FsbF9zdGFpbmZvMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhLCAqcHRtcDsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBzdGFfaW5mbyAqcGJjbWNfc3RhaW5mbyA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQlzMzIgaW5kZXg7Ci0KLQlpZiAocHN0YXByaXYtPmFzb2Nfc3RhX2NvdW50ID09IDEpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9TVEE7IGluZGV4KyspIHsKLQkJcGhlYWQgPSAmcHN0YXByaXYtPnN0YV9oYXNoW2luZGV4XTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBzdGEsIHB0bXAsIHBoZWFkLCBoYXNoX2xpc3QpIHsKLQkJCWlmIChwYmNtY19zdGFpbmZvICE9IHBzdGEpCi0JCQkJcnR3X2ZyZWVfc3RhaW5mbzIzYShwYWRhcHRlciwgcHN0YSk7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLX0KLQotLyogYW55IHN0YXRpb24gYWxsb2NhdGVkIGNhbiBiZSBzZWFyY2hlZCBieSBoYXNoIGxpc3QgKi8KLXN0cnVjdCBzdGFfaW5mbyAqcnR3X2dldF9zdGFpbmZvMjNhKHN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYsIGNvbnN0IHU4ICpod2FkZHIpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHN0YV9pbmZvICpwb3MsICpwc3RhID0gTlVMTDsKLQl1MzIgaW5kZXg7Ci0JY29uc3QgdTggKmFkZHI7Ci0KLQlpZiAoIWh3YWRkcikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaHdhZGRyKSkKLQkJYWRkciA9IGJjX2FkZHI7Ci0JZWxzZQotCQlhZGRyID0gaHdhZGRyOwotCi0JaW5kZXggPSB3aWZpX21hY19oYXNoKGFkZHIpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JcGhlYWQgPSAmcHN0YXByaXYtPnN0YV9oYXNoW2luZGV4XTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgcGhlYWQsIGhhc2hfbGlzdCkgewotCQlwc3RhID0gcG9zOwotCi0JCS8qICBpZiBmb3VuZCB0aGUgbWF0Y2hlZCBhZGRyZXNzICovCi0JCWlmIChldGhlcl9hZGRyX2VxdWFsKHBzdGEtPmh3YWRkciwgYWRkcikpCi0JCQlicmVhazsKLQotCQlwc3RhID0gTlVMTDsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQlyZXR1cm4gcHN0YTsKLX0KLQotaW50IHJ0d19pbml0X2JjbWNfc3RhaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdAlzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHN0YV9pbmZvCQkqcHN0YTsKLQlzdHJ1Y3QgdHhfc2VydnEJKnB0eHNlcnZxOwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCXBzdGEgPSBydHdfYWxsb2Nfc3RhaW5mbzIzYShwc3RhcHJpdiwgYmNfYWRkciwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwc3RhKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc3RhX21ndF9jXywgX2Rydl9lcnJfLAotCQkJICJydHdfYWxsb2Nfc3RhaW5mbzIzYSBmYWlsXG4iKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JLyogIGRlZmF1bHQgYnJvYWRjYXN0ICYgbXVsdGljYXN0IHVzZSBtYWNpZCAxICovCi0JcHN0YS0+bWFjX2lkID0gMTsKLQotCXB0eHNlcnZxID0gJnBzdGEtPnN0YV94bWl0cHJpdi5iZV9xOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RydWN0IHN0YV9pbmZvICpydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBzdGFfaW5mbwkJKnBzdGE7Ci0Jc3RydWN0IHN0YV9wcml2CQkqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0KLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBiY19hZGRyKTsKLQlyZXR1cm4gcHN0YTsKLX0KLQotYm9vbCBydHdfYWNjZXNzX2N0cmwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKm1hY19hZGRyKQotewotCWJvb2wgcmVzID0gdHJ1ZTsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQlzdHJ1Y3QgcnR3X3dsYW5fYWNsX25vZGUgKnBhY2xub2RlOwotCWJvb2wgbWF0Y2ggPSBmYWxzZTsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCB3bGFuX2FjbF9wb29sICpwYWNsX2xpc3QgPSAmcHN0YXByaXYtPmFjbF9saXN0OwotCXN0cnVjdCBydHdfcXVldWUgKnBhY2xfbm9kZV9xID0gJnBhY2xfbGlzdC0+YWNsX25vZGVfcTsKLQotCXNwaW5fbG9ja19iaCgmcGFjbF9ub2RlX3EtPmxvY2spOwotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwYWNsX25vZGVfcSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShwYWNsbm9kZSwgcGhlYWQsIGxpc3QpIHsKLQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwocGFjbG5vZGUtPmFkZHIsIG1hY19hZGRyKSkgewotCQkJaWYgKHBhY2xub2RlLT52YWxpZCkgewotCQkJCW1hdGNoID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlzcGluX3VubG9ja19iaCgmcGFjbF9ub2RlX3EtPmxvY2spOwotCi0JaWYgKHBhY2xfbGlzdC0+bW9kZSA9PSAxKS8qIGFjY2VwdCB1bmxlc3MgaW4gZGVueSBsaXN0ICovCi0JCXJlcyA9IChtYXRjaCkgPyAgZmFsc2UgOiB0cnVlOwotCWVsc2UgaWYgKHBhY2xfbGlzdC0+bW9kZSA9PSAyKS8qIGRlbnkgdW5sZXNzIGluIGFjY2VwdCBsaXN0ICovCi0JCXJlcyA9IChtYXRjaCkgPyAgdHJ1ZSA6IGZhbHNlOwotCWVsc2UKLQkJIHJlcyA9IHRydWU7Ci0jZW5kaWYKLQlyZXR1cm4gcmVzOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d193bGFuX3V0aWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfd2xhbl91dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NGNmMTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d193bGFuX3V0aWwuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9SVFdfV0xBTl9VVElMX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+Ci0jaW5jbHVkZSA8d2lmaS5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX3NwZWMuaD4KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgQVJUSEVST1NfT1VJMVtdID0gezB4MDAsIDB4MDMsIDB4N2Z9Owotc3RhdGljIHVuc2lnbmVkIGNoYXIgQVJUSEVST1NfT1VJMltdID0gezB4MDAsIDB4MTMsIDB4NzR9OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBCUk9BRENPTV9PVUkxW10gPSB7MHgwMCwgMHgxMCwgMHgxOH07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBCUk9BRENPTV9PVUkyW10gPSB7MHgwMCwgMHgwYSwgMHhmN307Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIENJU0NPX09VSVtdID0gezB4MDAsIDB4NDAsIDB4OTZ9Owotc3RhdGljIHVuc2lnbmVkIGNoYXIgTUFSVkVMTF9PVUlbXSA9IHsweDAwLCAweDUwLCAweDQzfTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFJBTElOS19PVUlbXSA9IHsweDAwLCAweDBjLCAweDQzfTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFJFQUxURUtfT1VJW10gPSB7MHgwMCwgMHhlMCwgMHg0Y307Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBBSVJHT0NBUF9PVUlbXSA9IHsweDAwLCAweDBhLCAweGY1fTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIEVQSUdSQU1fT1VJW10gPSB7MHgwMCwgMHg5MCwgMHg0Y307Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFdQQV9US0lQX0NJUEhFUls0XSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyfTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFJTTl9US0lQX0NJUEhFUls0XSA9IHsweDAwLCAweDBmLCAweGFjLCAweDAyfTsKLQotI2RlZmluZSBSMlRfUEhZX0RFTEFZCQkwCi0KLS8qIGRlZmluZSBXQUlUX0ZPUl9CQ05fVE9fTUlOCTMwMDAgKi8KLSNkZWZpbmUgV0FJVF9GT1JfQkNOX1RPX01JTgk2MDAwCi0jZGVmaW5lIFdBSVRfRk9SX0JDTl9UT19NQVgJMjAwMDAKLQotc3RhdGljIHU4IHJ0d19iYXNpY19yYXRlX2Nja1s0XSA9IHsKLQlJRUVFODAyMTFfQ0NLX1JBVEVfMU1CIHwgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSywKLQlJRUVFODAyMTFfQ0NLX1JBVEVfMk1CIHwgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSywKLQlJRUVFODAyMTFfQ0NLX1JBVEVfNU1CIHwgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSywKLQlJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sKLX07Ci0KLXN0YXRpYyB1OCBydHdfYmFzaWNfcmF0ZV9vZmRtWzNdID0gewotCUlFRUU4MDIxMV9PRkRNX1JBVEVfNk1CIHwgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSywKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUIgfCBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLLAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sKLX07Ci0KLXN0YXRpYyB1OCBydHdfYmFzaWNfcmF0ZV9taXhbN10gPSB7Ci0JSUVFRTgwMjExX0NDS19SQVRFXzFNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0ssCi0JSUVFRTgwMjExX0NDS19SQVRFXzJNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0ssCi0JSUVFRTgwMjExX0NDS19SQVRFXzVNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0ssCi0JSUVFRTgwMjExX0NDS19SQVRFXzExTUIgfCBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLLAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfNk1CIHwgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSywKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUIgfCBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLLAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sKLX07Ci0KLWludCBjY2tyYXRlc19pbmNsdWRlZDIzYSh1bnNpZ25lZCBjaGFyICpyYXRlLCBpbnQgcmF0ZWxlbikKLXsKLQlpbnQJaTsKLQotCWZvciAoaSA9IDA7IGkgPCByYXRlbGVuOyBpKyspIHsKLQkJaWYgICgoKHJhdGVbaV0pICYgMHg3ZikgPT0gMiB8fCAoKHJhdGVbaV0pICYgMHg3ZikgPT0gNCB8fAotCQkgICAgICgocmF0ZVtpXSkgJiAweDdmKSA9PSAxMSAgfHwgKChyYXRlW2ldKSAmIDB4N2YpID09IDIyKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1pbnQgY2NrcmF0ZXNvbmx5X2luY2x1ZGVkMjNhKHVuc2lnbmVkIGNoYXIgKnJhdGUsIGludCByYXRlbGVuKQotewotCWludAlpOwotCi0JZm9yIChpID0gMDsgaSA8IHJhdGVsZW47IGkrKykgewotCQlpZiAgKCgocmF0ZVtpXSkgJiAweDdmKSAhPSAyICYmICgocmF0ZVtpXSkgJiAweDdmKSAhPSA0ICYmCi0JCSAgICAgKChyYXRlW2ldKSAmIDB4N2YpICE9IDExICYmICgocmF0ZVtpXSkgJiAweDdmKSAhPSAyMikKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXJldHVybiB0cnVlOwotfQotCi11bnNpZ25lZCBjaGFyIG5ldHdvcmt0eXBlX3RvX3JhaWQyM2EodW5zaWduZWQgY2hhciBuZXR3b3JrX3R5cGUpCi17Ci0JdW5zaWduZWQgY2hhciByYWlkOwotCi0Jc3dpdGNoIChuZXR3b3JrX3R5cGUpIHsKLQljYXNlIFdJUkVMRVNTXzExQjoKLQkJcmFpZCA9IFJBVFJfSU5YX1dJUkVMRVNTX0I7Ci0JCWJyZWFrOwotCWNhc2UgV0lSRUxFU1NfMTFBOgotCWNhc2UgV0lSRUxFU1NfMTFHOgotCQlyYWlkID0gUkFUUl9JTlhfV0lSRUxFU1NfRzsKLQkJYnJlYWs7Ci0JY2FzZSBXSVJFTEVTU18xMUJHOgotCQlyYWlkID0gUkFUUl9JTlhfV0lSRUxFU1NfR0I7Ci0JCWJyZWFrOwotCWNhc2UgV0lSRUxFU1NfMTFfMjROOgotCWNhc2UgV0lSRUxFU1NfMTFfNU46Ci0JCXJhaWQgPSBSQVRSX0lOWF9XSVJFTEVTU19OOwotCQlicmVhazsKLQljYXNlIFdJUkVMRVNTXzExQV81TjoKLQljYXNlIFdJUkVMRVNTXzExR18yNE46Ci0JCXJhaWQgPSBSQVRSX0lOWF9XSVJFTEVTU19ORzsKLQkJYnJlYWs7Ci0JY2FzZSBXSVJFTEVTU18xMUJHXzI0TjoKLQkJcmFpZCA9IFJBVFJfSU5YX1dJUkVMRVNTX05HQjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmFpZCA9IFJBVFJfSU5YX1dJUkVMRVNTX0dCOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJhaWQ7Ci19Ci0KLXU4IGp1ZGdlX25ldHdvcmtfdHlwZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJIHVuc2lnbmVkIGNoYXIgKnJhdGUsIGludCByYXRlbGVuKQotewotCXU4IG5ldHdvcmtfdHlwZSA9IDA7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWlmIChwbWxtZWV4dC0+Y3VyX2NoYW5uZWwgPiAxNCkgewotCQlpZiAocG1sbWVpbmZvLT5IVF9lbmFibGUpCi0JCQluZXR3b3JrX3R5cGUgPSBXSVJFTEVTU18xMV81TjsKLQkJbmV0d29ya190eXBlIHw9IFdJUkVMRVNTXzExQTsKLQl9IGVsc2UgewotCQlpZiAocG1sbWVpbmZvLT5IVF9lbmFibGUpCi0JCQluZXR3b3JrX3R5cGUgPSBXSVJFTEVTU18xMV8yNE47Ci0KLQkJaWYgKChjY2tyYXRlc29ubHlfaW5jbHVkZWQyM2EocmF0ZSwgcmF0ZWxlbikpID09IHRydWUpCi0JCQluZXR3b3JrX3R5cGUgfD0gV0lSRUxFU1NfMTFCOwotCQllbHNlIGlmICgoY2NrcmF0ZXNfaW5jbHVkZWQyM2EocmF0ZSwgcmF0ZWxlbikpID09IHRydWUpCi0JCQluZXR3b3JrX3R5cGUgfD0gV0lSRUxFU1NfMTFCRzsKLQkJZWxzZQotCQkJbmV0d29ya190eXBlIHw9IFdJUkVMRVNTXzExRzsKLQl9Ci0JcmV0dXJuCW5ldHdvcmtfdHlwZTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgcmF0ZXRibF92YWxfMndpZmlyYXRlKHVuc2lnbmVkIGNoYXIgcmF0ZSkKLXsKLQl1bnNpZ25lZCBjaGFyIHZhbCA9IDA7Ci0KLQlzd2l0Y2ggKHJhdGUgJiAweDdmKSB7Ci0JY2FzZSAwOgotCQl2YWwgPSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXZhbCA9IElFRUU4MDIxMV9DQ0tfUkFURV8yTUI7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJdmFsID0gSUVFRTgwMjExX0NDS19SQVRFXzVNQjsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQl2YWwgPSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQl2YWwgPSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCQl2YWwgPSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQjsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCQl2YWwgPSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI7Ci0JCWJyZWFrOwotCWNhc2UgNzoKLQkJdmFsID0gSUVFRTgwMjExX09GRE1fUkFURV8xOE1COwotCQlicmVhazsKLQljYXNlIDg6Ci0JCXZhbCA9IElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjsKLQkJYnJlYWs7Ci0JY2FzZSA5OgotCQl2YWwgPSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI7Ci0JCWJyZWFrOwotCWNhc2UgMTA6Ci0JCXZhbCA9IElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjsKLQkJYnJlYWs7Ci0JY2FzZSAxMToKLQkJdmFsID0gSUVFRTgwMjExX09GRE1fUkFURV81NE1COwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIGludCBpc19iYXNpY3JhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciByYXRlKQotewotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgdmFsOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTnVtUmF0ZXM7IGkrKykgewotCQl2YWwgPSBwbWxtZWV4dC0+YmFzaWNyYXRlW2ldOwotCi0JCWlmICh2YWwgIT0gMHhmZiAmJiB2YWwgIT0gMHhmZSkgewotCQkJaWYgKHJhdGUgPT0gcmF0ZXRibF92YWxfMndpZmlyYXRlKHZhbCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXRibDJyYXRlc2V0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgIHVuc2lnbmVkIGNoYXIgKnJhdGVzZXQpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgY2hhciByYXRlOwotCXVuc2lnbmVkIGludCBsZW4gPSAwOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTnVtUmF0ZXM7IGkrKykgewotCQlyYXRlID0gcG1sbWVleHQtPmRhdGFyYXRlW2ldOwotCi0JCXN3aXRjaCAocmF0ZSkgewotCQljYXNlIDB4ZmY6Ci0JCQlyZXR1cm4gbGVuOwotCQljYXNlIDB4ZmU6Ci0JCQljb250aW51ZTsKLQkJZGVmYXVsdDoKLQkJCXJhdGUgPSByYXRldGJsX3ZhbF8yd2lmaXJhdGUocmF0ZSk7Ci0KLQkJCWlmIChpc19iYXNpY3JhdGUocGFkYXB0ZXIsIHJhdGUpID09IHRydWUpCi0JCQkJcmF0ZSB8PSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLOwotCi0JCQlyYXRlc2V0W2xlbl0gPSByYXRlOwotCQkJbGVuKys7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gbGVuOwotfQotCi12b2lkIGdldF9yYXRlX3NldDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgIHVuc2lnbmVkIGNoYXIgKnBic3NyYXRlLCBpbnQgKmJzc3JhdGVfbGVuKQotewotCXVuc2lnbmVkIGNoYXIgc3VwcG9ydGVkcmF0ZXNbTnVtUmF0ZXNdOwotCi0JbWVtc2V0KHN1cHBvcnRlZHJhdGVzLCAwLCBOdW1SYXRlcyk7Ci0JKmJzc3JhdGVfbGVuID0gcmF0ZXRibDJyYXRlc2V0KHBhZGFwdGVyLCBzdXBwb3J0ZWRyYXRlcyk7Ci0JbWVtY3B5KHBic3NyYXRlLCBzdXBwb3J0ZWRyYXRlcywgKmJzc3JhdGVfbGVuKTsKLX0KLQotdm9pZCBVcGRhdGVCcmF0ZVRibDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4ICptQnJhdGVzT1MpCi17Ci0JdTggaTsKLQl1OCByYXRlOwotCi0JLyogIDFNLCAyTSwgNS41TSwgMTFNLCA2TSwgMTJNLCAyNE0gYXJlIG1hbmRhdG9yeS4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYOyBpKyspIHsKLQkJcmF0ZSA9IG1CcmF0ZXNPU1tpXSAmIDB4N2Y7Ci0JCXN3aXRjaCAocmF0ZSkgewotCQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xTUI6Ci0JCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzJNQjoKLQkJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COgotCQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COgotCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COgotCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjoKLQkJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI6Ci0JCQltQnJhdGVzT1NbaV0gfD0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgVXBkYXRlMjNhVGJsRm9yU29mdEFQKHU4ICpic3NyYXRlc2V0LCB1MzIgYnNzcmF0ZWxlbikKLXsKLQl1OCBpOwotCXU4IHJhdGU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYnNzcmF0ZWxlbjsgaSsrKSB7Ci0JCXJhdGUgPSBic3NyYXRlc2V0W2ldICYgMHg3ZjsKLQkJc3dpdGNoIChyYXRlKSB7Ci0JCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzFNQjoKLQkJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COgotCQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV81TUI6Ci0JCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzExTUI6Ci0JCQlic3NyYXRlc2V0W2ldIHw9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0s7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotaW5saW5lIHU4IHJ0d19nZXRfb3Blcl9jaDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JcmV0dXJuIGFkYXB0ZXJfdG9fZHZvYmooYWRhcHRlciktPm9wZXJfY2hhbm5lbDsKLX0KLQotaW5saW5lIHZvaWQgcnR3X3NldF9vcGVyX2NoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTggY2gpCi17Ci0JYWRhcHRlcl90b19kdm9iaihhZGFwdGVyKS0+b3Blcl9jaGFubmVsID0gY2g7Ci19Ci0KLWlubGluZSB2b2lkIHJ0d19zZXRfb3Blcl9idzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGJ3KQotewotCWFkYXB0ZXJfdG9fZHZvYmooYWRhcHRlciktPm9wZXJfYndtb2RlID0gYnc7Ci19Ci0KLWlubGluZSB2b2lkIHJ0d19zZXRfb3Blcl9jaDIzYW9mZnNldDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IG9mZnNldCkKLXsKLQlhZGFwdGVyX3RvX2R2b2JqKGFkYXB0ZXIpLT5vcGVyX2NoX29mZnNldCA9IG9mZnNldDsKLX0KLQotdm9pZCBTZWxlY3RDaGFubmVsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgY2hhbm5lbCkKLXsKLQltdXRleF9sb2NrKCZhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKS0+c2V0Y2hfbXV0ZXgpOwotCi0JLyogc2F2ZWQgY2hhbm5lbCBpbmZvICovCi0JcnR3X3NldF9vcGVyX2NoMjNhKHBhZGFwdGVyLCBjaGFubmVsKTsKLQotCVBIWV9Td0Nobmw4NzIzQShwYWRhcHRlciwgY2hhbm5lbCk7Ci0KLQltdXRleF91bmxvY2soJmFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpLT5zZXRjaF9tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9id21vZGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgc2hvcnQgYndtb2RlLAotCQkgICAgICAgdW5zaWduZWQgY2hhciBjaGFubmVsX29mZnNldCkKLXsKLQltdXRleF9sb2NrKCZhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKS0+c2V0YndfbXV0ZXgpOwotCi0JLyogc2F2ZWQgYncgaW5mbyAqLwotCXJ0d19zZXRfb3Blcl9idzIzYShwYWRhcHRlciwgYndtb2RlKTsKLQlydHdfc2V0X29wZXJfY2gyM2FvZmZzZXQyM2EocGFkYXB0ZXIsIGNoYW5uZWxfb2Zmc2V0KTsKLQotCVBIWV9TZXRCV01vZGUyM2E4NzIzQShwYWRhcHRlciwgKGVudW0gaHRfY2hhbm5lbF93aWR0aClid21vZGUsCi0JCQkgICAgICBjaGFubmVsX29mZnNldCk7Ci0KLQltdXRleF91bmxvY2soJmFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpLT5zZXRid19tdXRleCk7Ci19Ci0KLXZvaWQgc2V0X2NoYW5uZWxfYndtb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgY2hhbm5lbCwKLQkJCSAgIHVuc2lnbmVkIGNoYXIgY2hhbm5lbF9vZmZzZXQsIHVuc2lnbmVkIHNob3J0IGJ3bW9kZSkKLXsKLQl1OCBjZW50ZXJfY2g7Ci0KLQlpZiAoYndtb2RlID09IEhUX0NIQU5ORUxfV0lEVEhfMjAgfHwKLQkgICAgY2hhbm5lbF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSkgewotCQkvKiBTZWxlY3RDaGFubmVsMjNhKHBhZGFwdGVyLCBjaGFubmVsKTsgKi8KLQkJY2VudGVyX2NoID0gY2hhbm5lbDsKLQl9IGVsc2UgewotCQkvKiBzd2l0Y2ggdG8gdGhlIHByb3BlciBjaGFubmVsICovCi0JCWlmIChjaGFubmVsX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIpIHsKLQkJCS8qIFNlbGVjdENoYW5uZWwyM2EocGFkYXB0ZXIsIGNoYW5uZWwgKyAyKTsgKi8KLQkJCWNlbnRlcl9jaCA9IGNoYW5uZWwgKyAyOwotCQl9IGVsc2UgewotCQkJLyogU2VsZWN0Q2hhbm5lbDIzYShwYWRhcHRlciwgY2hhbm5lbCAtIDIpOyAqLwotCQkJY2VudGVyX2NoID0gY2hhbm5lbCAtIDI7Ci0JCX0KLQl9Ci0KLQkvKiBzZXQgQ2hhbm5lbCAqLwotCW11dGV4X2xvY2soJmFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpLT5zZXRjaF9tdXRleCk7Ci0KLQkvKiBzYXZlZCBjaGFubmVsL2J3IGluZm8gKi8KLQlydHdfc2V0X29wZXJfY2gyM2EocGFkYXB0ZXIsIGNoYW5uZWwpOwotCXJ0d19zZXRfb3Blcl9idzIzYShwYWRhcHRlciwgYndtb2RlKTsKLQlydHdfc2V0X29wZXJfY2gyM2FvZmZzZXQyM2EocGFkYXB0ZXIsIGNoYW5uZWxfb2Zmc2V0KTsKLQotCVBIWV9Td0Nobmw4NzIzQShwYWRhcHRlciwgY2VudGVyX2NoKTsgLyogIHNldCBjZW50ZXIgY2hhbm5lbCAqLwotCi0JbXV0ZXhfdW5sb2NrKCZhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKS0+c2V0Y2hfbXV0ZXgpOwotCi0Jc2V0X2J3bW9kZShwYWRhcHRlciwgYndtb2RlLCBjaGFubmVsX29mZnNldCk7Ci19Ci0KLWlubGluZSB1OCAqZ2V0X215X2Jzc2lkMjNhKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yaykKLXsKLQlyZXR1cm4gcG5ldHdvcmstPk1hY0FkZHJlc3M7Ci19Ci0KLWJvb2wgaXNfY2xpZW50X2Fzc29jaWF0ZWRfdG9fYXAyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQ7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbzsKLQotCWlmICghcGFkYXB0ZXIpCi0JCXJldHVybiBmYWxzZTsKLQotCXBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JaWYgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FTU09DX1NVQ0NFU1MgJiYKLQkgICAgKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfSU5GUkEpCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGlzX2NsaWVudF9hc3NvY2lhdGVkX3RvX2lic3MyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JaWYgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FTU09DX1NVQ0NFU1MgJiYKLQkgICAgKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfQURIT0MpCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGlzX0lCU1NfZW1wdHkyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JZm9yIChpID0gSUJTU19TVEFSVF9NQUNfSUQ7IGkgPCBOVU1fU1RBOyBpKyspIHsKLQkJaWYgKHBtbG1laW5mby0+Rldfc3RhX2luZm9baV0uc3RhdHVzID09IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXVuc2lnbmVkIGludCBkZWNpZGVfd2FpdF9mb3JfYmVhY29uX3RpbWVvdXQyM2EodW5zaWduZWQgaW50IGJjbl9pbnRlcnZhbCkKLXsKLQlpZiAoKGJjbl9pbnRlcnZhbCA8PCAyKSA8IFdBSVRfRk9SX0JDTl9UT19NSU4pCi0JCXJldHVybiBXQUlUX0ZPUl9CQ05fVE9fTUlOOwotCWVsc2UgaWYgKChiY25faW50ZXJ2YWwgPDwgMikgPiBXQUlUX0ZPUl9CQ05fVE9fTUFYKQotCQlyZXR1cm4gV0FJVF9GT1JfQkNOX1RPX01BWDsKLQllbHNlCi0JCXJldHVybiBiY25faW50ZXJ2YWwgPDwgMjsKLX0KLQotdm9pZCBjbGVhcl9jYW1fZW50cnkyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggZW50cnkpCi17Ci0JdW5zaWduZWQgY2hhciBudWxsX3N0YVtdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotCi0JdW5zaWduZWQgY2hhciBudWxsX2tleVtdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JCQkJICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JCQkJICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotCi0JcnRsODcyM2FfY2FtX3dyaXRlKHBhZGFwdGVyLCBlbnRyeSwgMCwgbnVsbF9zdGEsIG51bGxfa2V5KTsKLX0KLQotaW50IGFsbG9jYXRlX2Z3X3N0YV9lbnRyeTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXVuc2lnbmVkIGludCBtYWNfaWQ7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWZvciAobWFjX2lkID0gSUJTU19TVEFSVF9NQUNfSUQ7IG1hY19pZCA8IE5VTV9TVEE7IG1hY19pZCsrKSB7Ci0JCWlmIChwbWxtZWluZm8tPkZXX3N0YV9pbmZvW21hY19pZF0uc3RhdHVzID09IDApIHsKLQkJCXBtbG1laW5mby0+Rldfc3RhX2luZm9bbWFjX2lkXS5zdGF0dXMgPSAxOwotCQkJcG1sbWVpbmZvLT5GV19zdGFfaW5mb1ttYWNfaWRdLnJldHJ5ID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIG1hY19pZDsKLX0KLQotdm9pZCBmbHVzaF9hbGxfY2FtX2VudHJ5MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCXJ0bDg3MjNhX2NhbV9pbnZhbGlkYXRlX2FsbChwYWRhcHRlcik7Ci0KLQltZW1zZXQocG1sbWVpbmZvLT5GV19zdGFfaW5mbywgMCwgc2l6ZW9mKHBtbG1laW5mby0+Rldfc3RhX2luZm8pKTsKLX0KLQotaW50IFdNTV9wYXJhbV9oYW5kbGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwKQotewotCS8qIHN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OyAqLwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWlmIChwbWxtZXByaXYtPnFvc19vcHRpb24gPT0gMCkgewotCQlwbWxtZWluZm8tPldNTV9lbmFibGUgPSAwOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JcG1sbWVpbmZvLT5XTU1fZW5hYmxlID0gMTsKLQltZW1jcHkoJnBtbG1laW5mby0+V01NX3BhcmFtLCBwICsgMiArIDYsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgV01NX3BhcmFfZWxlbWVudCkpOwotCXJldHVybiB0cnVlOwotfQotCi12b2lkIFdNTU9uQXNzb2NSc3AyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBBQ0ksIEFDTSwgQUlGUywgRUNXTWluLCBFQ1dNYXgsIGFTaWZzVGltZTsKLQl1OCBhY21fbWFzazsKLQl1MTYgVFhPUDsKLQl1MzIgYWNQYXJtLCBpOwotCXUzMiBlZGNhWzRdLCBpbnhbNF07Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCi0JaWYgKHBtbG1laW5mby0+V01NX2VuYWJsZSA9PSAwKSB7Ci0JCXBhZGFwdGVyLT5tbG1lcHJpdi5hY21fbWFzayA9IDA7Ci0JCXJldHVybjsKLQl9Ci0KLQlhY21fbWFzayA9IDA7Ci0KLQlpZiAocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlID09IFdJUkVMRVNTXzExQikKLQkJYVNpZnNUaW1lID0gMTA7Ci0JZWxzZQotCQlhU2lmc1RpbWUgPSAxNjsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJQUNJID0gKHBtbG1laW5mby0+V01NX3BhcmFtLmFjX3BhcmFtW2ldLkFDSV9BSUZTTiA+PiA1KSAmIDB4MDM7Ci0JCUFDTSA9IChwbWxtZWluZm8tPldNTV9wYXJhbS5hY19wYXJhbVtpXS5BQ0lfQUlGU04gPj4gNCkgJiAweDAxOwotCi0JCS8qIEFJRlMgPSBBSUZTTiAqIHNsb3QgdGltZSArIFNJRlMgLSByMnQgcGh5IGRlbGF5ICovCi0JCUFJRlMgPSAocG1sbWVpbmZvLT5XTU1fcGFyYW0uYWNfcGFyYW1baV0uQUNJX0FJRlNOICYgMHgwZikgKgotCQkJcG1sbWVpbmZvLT5zbG90VGltZSArIGFTaWZzVGltZTsKLQotCQlFQ1dNaW4gPSBwbWxtZWluZm8tPldNTV9wYXJhbS5hY19wYXJhbVtpXS5DVyAmIDB4MGY7Ci0JCUVDV01heCA9IChwbWxtZWluZm8tPldNTV9wYXJhbS5hY19wYXJhbVtpXS5DVyAmIDB4ZjApID4+IDQ7Ci0JCVRYT1AgPSBsZTE2X3RvX2NwdShwbWxtZWluZm8tPldNTV9wYXJhbS5hY19wYXJhbVtpXS5UWE9QX2xpbWl0KTsKLQotCQlhY1Bhcm0gPSBBSUZTIHwgKEVDV01pbiA8PCA4KSB8IChFQ1dNYXggPDwgMTIpIHwgKFRYT1AgPDwgMTYpOwotCi0JCXN3aXRjaCAoQUNJKSB7Ci0JCWNhc2UgMHgwOgotCQkJcnRsODcyM2Ffc2V0X2FjX3BhcmFtX2JlKHBhZGFwdGVyLCBhY1Bhcm0pOwotCQkJYWNtX21hc2sgfD0gKEFDTT8gQklUKDEpOjApOwotCQkJZWRjYVtYTUlUX0JFX1FVRVVFXSA9IGFjUGFybTsKLQkJCWJyZWFrOwotCQljYXNlIDB4MToKLQkJCXJ0bDg3MjNhX3NldF9hY19wYXJhbV9iayhwYWRhcHRlciwgYWNQYXJtKTsKLQkJCS8qIGFjbV9tYXNrIHw9IChBQ00/IEJJVCgwKTowKTsgKi8KLQkJCWVkY2FbWE1JVF9CS19RVUVVRV0gPSBhY1Bhcm07Ci0JCQlicmVhazsKLQkJY2FzZSAweDI6Ci0JCQlydGw4NzIzYV9zZXRfYWNfcGFyYW1fdmkocGFkYXB0ZXIsIGFjUGFybSk7Ci0JCQlhY21fbWFzayB8PSAoQUNNPyBCSVQoMik6MCk7Ci0JCQllZGNhW1hNSVRfVklfUVVFVUVdID0gYWNQYXJtOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgzOgotCQkJcnRsODcyM2Ffc2V0X2FjX3BhcmFtX3ZvKHBhZGFwdGVyLCBhY1Bhcm0pOwotCQkJYWNtX21hc2sgfD0gKEFDTT8gQklUKDMpOjApOwotCQkJZWRjYVtYTUlUX1ZPX1FVRVVFXSA9IGFjUGFybTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJREJHXzg3MjNBKCJXTU0oJXgpOiAleCwgJXhcbiIsIEFDSSwgQUNNLCBhY1Bhcm0pOwotCX0KLQotCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LmFjbV9tZXRob2QgPT0gMSkKLQkJcnRsODcyM2Ffc2V0X2FjbV9jdHJsKHBhZGFwdGVyLCBhY21fbWFzayk7Ci0JZWxzZQotCQlwYWRhcHRlci0+bWxtZXByaXYuYWNtX21hc2sgPSBhY21fbWFzazsKLQotCWlueFswXSA9IDA7IGlueFsxXSA9IDE7IGlueFsyXSA9IDI7IGlueFszXSA9IDM7Ci0KLQlpZiAocHJlZ3ByaXYtPndpZmlfc3BlYyA9PSAxKSB7Ci0JCXUzMiBqLCBjaGFuZ2VfaW54ID0gZmFsc2U7Ci0KLQkJLyogZW50cnkgaW5keDogMC0+dm8sIDEtPnZpLCAyLT5iZSwgMy0+YmsuICovCi0JCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCWZvciAoaiA9IGkrMTsgaiA8IDQ7IGorKykgewotCQkJCS8qIGNvbXBhcmUgQ1cgYW5kIEFJRlMgKi8KLQkJCQlpZiAoKGVkY2Fbal0gJiAweEZGRkYpIDwgKGVkY2FbaV0gJiAweEZGRkYpKSB7Ci0JCQkJCWNoYW5nZV9pbnggPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoKGVkY2Fbal0gJiAweEZGRkYpID09Ci0JCQkJCSAgIChlZGNhW2ldICYgMHhGRkZGKSkgewotCQkJCQkvKiBjb21wYXJlIFRYT1AgKi8KLQkJCQkJaWYgKChlZGNhW2pdID4+IDE2KSA+IChlZGNhW2ldID4+IDE2KSkKLQkJCQkJCWNoYW5nZV9pbnggPSB0cnVlOwotCQkJCX0KLQotCQkJCWlmIChjaGFuZ2VfaW54KSB7Ci0JCQkJCXN3YXAoZWRjYVtpXSwgZWRjYVtqXSk7Ci0JCQkJCXN3YXAoaW54W2ldLCBpbnhbal0pOwotCQkJCQljaGFuZ2VfaW54ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JZm9yIChpID0gMDsgaTw0OyBpKyspIHsKLQkJcHhtaXRwcml2LT53bW1fcGFyYV9zZXFbaV0gPSBpbnhbaV07Ci0JCURCR184NzIzQSgid21tX3BhcmFfc2VxKCVkKTogJWRcbiIsIGksCi0JCQkgIHB4bWl0cHJpdi0+d21tX3BhcmFfc2VxW2ldKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ3bW9kZV91cGRhdGVfY2hlY2soc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnApCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24gKnBIVF9pbmZvOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXN0cnVjdCBodF9wcml2ICpwaHRwcml2ID0gJnBtbG1lcHJpdi0+aHRwcml2OwotCXVuc2lnbmVkIGNoYXIgbmV3X2J3bW9kZTsKLQl1bnNpZ25lZCBjaGFyIG5ld19jaF9vZmZzZXQ7Ci0KLQlpZiAoIXApCi0JCXJldHVybjsKLQlpZiAoIXBodHByaXYtPmh0X29wdGlvbikKLQkJcmV0dXJuOwotCWlmIChwWzFdICE9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbikpCi0JCXJldHVybjsKLQotCXBIVF9pbmZvID0gKHN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uICopKHAgKyAyKTsKLQotCWlmICgocEhUX2luZm8tPmh0X3BhcmFtICYgSUVFRTgwMjExX0hUX1BBUkFNX0NIQU5fV0lEVEhfQU5ZKSAmJgotCSAgICBwcmVnaXN0cnlwcml2LT5jYnc0MF9lbmFibGUpIHsKLQkJbmV3X2J3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfNDA7Ci0KLQkJc3dpdGNoIChwSFRfaW5mby0+aHRfcGFyYW0gJiBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19PRkZTRVQpewotCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFOgotCQkJbmV3X2NoX29mZnNldCA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUjsKLQkJCWJyZWFrOwotCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOgotCQkJbmV3X2NoX29mZnNldCA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9VUFBFUjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJbmV3X2NoX29mZnNldCA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkU7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCW5ld19id21vZGUgPSBIVF9DSEFOTkVMX1dJRFRIXzIwOwotCQluZXdfY2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRTsKLQl9Ci0KLQlpZiAobmV3X2J3bW9kZSAhPSBwbWxtZWV4dC0+Y3VyX2J3bW9kZSB8fAotCSAgICBuZXdfY2hfb2Zmc2V0ICE9IHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0KSB7Ci0JCXBtbG1laW5mby0+Yndtb2RlX3VwZGF0ZWQgPSB0cnVlOwotCi0JCXBtbG1lZXh0LT5jdXJfYndtb2RlID0gbmV3X2J3bW9kZTsKLQkJcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPSBuZXdfY2hfb2Zmc2V0OwotCi0JCS8qIHVwZGF0ZSBIVCBpbmZvIGFsc28gKi8KLQkJSFRfaW5mb19oYW5kbGVyMjNhKHBhZGFwdGVyLCBwKTsKLQl9IGVsc2UKLQkJcG1sbWVpbmZvLT5id21vZGVfdXBkYXRlZCA9IGZhbHNlOwotCi0JaWYgKHBtbG1laW5mby0+Yndtb2RlX3VwZGF0ZWQpIHsKLQkJc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyX25ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCQlzdHJ1Y3Qgc3RhX3ByaXYJKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JCS8qIHNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsLAotCQkgICBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCwgcG1sbWVleHQtPmN1cl9id21vZGUpOyAqLwotCi0JCS8qIHVwZGF0ZSBhcCdzIHN0YWluZm8gKi8KLQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgY3VyX25ldHdvcmstPk1hY0FkZHJlc3MpOwotCQlpZiAocHN0YSkgewotCQkJc3RydWN0IGh0X3ByaXYgKnBodHByaXZfc3RhID0gJnBzdGEtPmh0cHJpdjsKLQotCQkJaWYgKHBodHByaXZfc3RhLT5odF9vcHRpb24pIHsKLQkJCQkvKiAgYndtb2RlICovCi0JCQkJcGh0cHJpdl9zdGEtPmJ3bW9kZSA9IHBtbG1lZXh0LT5jdXJfYndtb2RlOwotCQkJCXBodHByaXZfc3RhLT5jaF9vZmZzZXQgPQotCQkJCQlwbWxtZWV4dC0+Y3VyX2NoX29mZnNldDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGh0cHJpdl9zdGEtPmJ3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfMjA7Ci0JCQkJcGh0cHJpdl9zdGEtPmNoX29mZnNldCA9Ci0JCQkJCUhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkU7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgSFRfY2Fwc19oYW5kbGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwKQotewotCXVuc2lnbmVkIGludCBpOwotCXU4IHJmX3R5cGU7Ci0JdTggbWF4X0FNUERVX2xlbiwgbWluX01QRFVfc3BhY2luZzsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IGh0X3ByaXYgKnBodHByaXYgPSAmcG1sbWVwcml2LT5odHByaXY7Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmNhcDsKLQl1OCAqZHN0Y2FwOwotCi0JaWYgKCFwKQotCQlyZXR1cm47Ci0KLQlpZiAoIXBodHByaXYtPmh0X29wdGlvbikKLQkJcmV0dXJuOwotCi0JcG1sbWVpbmZvLT5IVF9jYXBzX2VuYWJsZSA9IDE7Ci0KLQljYXAgPSAmcG1sbWVpbmZvLT5odF9jYXA7Ci0JZHN0Y2FwID0gKHU4ICopY2FwOwotCWZvciAoaSA9IDA7IGkgPCBwWzFdOyBpKyspIHsKLQkJaWYgKGkgIT0gMikgewotCQkJZHN0Y2FwW2ldICY9IHBbaSArIDJdOwotCQl9IGVsc2UgewotCQkJLyogbW9kaWZ5IGZyb20gIGZ3IGJ5IFRob21hcyAyMDEwLzExLzE3ICovCi0JCQlpZiAoKGNhcC0+YW1wZHVfcGFyYW1zX2luZm8gJgotCQkJICAgICBJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9GQUNUT1IpID4KLQkJCSAgICAocFtpICsgMl0gJiBJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9GQUNUT1IpKQotCQkJCW1heF9BTVBEVV9sZW4gPSBwW2kgKyAyXSAmCi0JCQkJCUlFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0ZBQ1RPUjsKLQkJCWVsc2UKLQkJCQltYXhfQU1QRFVfbGVuID0gY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyAmCi0JCQkJCUlFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0ZBQ1RPUjsKLQotCQkJaWYgKChjYXAtPmFtcGR1X3BhcmFtc19pbmZvICYKLQkJCSAgICAgSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fREVOU0lUWSkgPgotCQkJICAgIChwW2kgKyAyXSAmIElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFkpKQotCQkJCW1pbl9NUERVX3NwYWNpbmcgPSBjYXAtPmFtcGR1X3BhcmFtc19pbmZvICYKLQkJCQkJSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fREVOU0lUWTsKLQkJCWVsc2UKLQkJCQltaW5fTVBEVV9zcGFjaW5nID0gcFtpICsgMl0gJgotCQkJCQlJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9ERU5TSVRZOwotCi0JCQljYXAtPmFtcGR1X3BhcmFtc19pbmZvID0KLQkJCQltYXhfQU1QRFVfbGVuIHwgbWluX01QRFVfc3BhY2luZzsKLQkJfQotCX0KLQotCXJmX3R5cGUgPSBydGw4NzIzYV9nZXRfcmZfdHlwZShwYWRhcHRlcik7Ci0KLQkvKiB1cGRhdGUgdGhlIE1DUyByYXRlcyAqLwotCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfSFRfTUNTX01BU0tfTEVOOyBpKyspIHsKLQkJaWYgKHJmX3R5cGUgPT0gUkZfMVQxUiB8fCByZl90eXBlID09IFJGXzFUMlIpCi0JCQljYXAtPm1jcy5yeF9tYXNrW2ldICY9IE1DU19yYXRlXzFSMjNBW2ldOwotCQllbHNlCi0JCQljYXAtPm1jcy5yeF9tYXNrW2ldICY9IE1DU19yYXRlXzJSMjNBW2ldOwotCX0KLX0KLQotdm9pZCBIVF9pbmZvX2hhbmRsZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnApCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBodF9wcml2ICpwaHRwcml2ID0gJnBtbG1lcHJpdi0+aHRwcml2OwotCi0JaWYgKCFwKQotCQlyZXR1cm47Ci0KLQlpZiAoIXBodHByaXYtPmh0X29wdGlvbikKLQkJcmV0dXJuOwotCi0JaWYgKHBbMV0gIT0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uKSkKLQkJcmV0dXJuOwotCi0JcG1sbWVpbmZvLT5IVF9pbmZvX2VuYWJsZSA9IDE7Ci0JbWVtY3B5KCZwbWxtZWluZm8tPkhUX2luZm8sIHAgKyAyLCBwWzFdKTsKLX0KLQotdm9pZCBIVE9uQXNzb2NSc3AyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1bnNpZ25lZCBjaGFyIG1heF9BTVBEVV9sZW47Ci0JdW5zaWduZWQgY2hhciBtaW5fTVBEVV9zcGFjaW5nOwotCS8qIHN0cnVjdCByZWdpc3RyeV9wcml2CSAqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsgKi8KLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKHBtbG1laW5mby0+SFRfaW5mb19lbmFibGUgJiYgcG1sbWVpbmZvLT5IVF9jYXBzX2VuYWJsZSkKLQkJcG1sbWVpbmZvLT5IVF9lbmFibGUgPSAxOwotCWVsc2UgewotCQlwbWxtZWluZm8tPkhUX2VuYWJsZSA9IDA7Ci0JCS8qIHNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsLAotCQkgICBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCwgcG1sbWVleHQtPmN1cl9id21vZGUpOyAqLwotCQlyZXR1cm47Ci0JfQotCi0JLyogaGFuZGxlIEEtTVBEVSBwYXJhbWV0ZXIgZmllbGQgKi8KLQkvKgotCQlBTVBEVV9wYXJhIFsxOjBdOk1heCBBTVBEVSBMZW4gPT4gMDo4ayAsIDE6MTZrLCAyOjMyaywgMzo2NGsKLQkJQU1QRFVfcGFyYSBbNDoyXTpNaW4gTVBEVSBTdGFydCBTcGFjaW5nCi0JKi8KLQltYXhfQU1QRFVfbGVuID0gcG1sbWVpbmZvLT5odF9jYXAuYW1wZHVfcGFyYW1zX2luZm8gJgotCQlJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9GQUNUT1I7Ci0KLQltaW5fTVBEVV9zcGFjaW5nID0KLQkJKHBtbG1laW5mby0+aHRfY2FwLmFtcGR1X3BhcmFtc19pbmZvICYKLQkJIElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFkpID4+IDI7Ci0KLQlydGw4NzIzYV9zZXRfYW1wZHVfbWluX3NwYWNlKHBhZGFwdGVyLCBtaW5fTVBEVV9zcGFjaW5nKTsKLQlydGw4NzIzYV9zZXRfYW1wZHVfZmFjdG9yKHBhZGFwdGVyLCBtYXhfQU1QRFVfbGVuKTsKLX0KLQotdm9pZCBFUlBfSUVfaGFuZGxlcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcCkKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JaWYgKHBbMV0gPiAxKQotCQlyZXR1cm47Ci0KLQlwbWxtZWluZm8tPkVSUF9lbmFibGUgPSAxOwotCW1lbWNweSgmcG1sbWVpbmZvLT5FUlBfSUUsIHAgKyAyLCBwWzFdKTsKLX0KLQotdm9pZCBWQ1NfdXBkYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSkKLXsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0Jc3dpdGNoIChwcmVncHJpdi0+dnJ0bF9jYXJyaWVyX3NlbnNlKSB7IC8qIDA6b2ZmIDE6b24gMjphdXRvICovCi0JY2FzZSAwOiAvKiBvZmYgKi8KLQkJcHN0YS0+cnRzZW4gPSAwOwotCQlwc3RhLT5jdHMyc2VsZiA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgMTogLyogb24gKi8KLQkJaWYgKHByZWdwcml2LT52Y3NfdHlwZSA9PSBSVFNfQ1RTKSB7Ci0JCQlwc3RhLT5ydHNlbiA9IDE7Ci0JCQlwc3RhLT5jdHMyc2VsZiA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlwc3RhLT5ydHNlbiA9IDA7Ci0JCQlwc3RhLT5jdHMyc2VsZiA9IDE7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAyOiAvKiBhdXRvICovCi0JZGVmYXVsdDoKLQkJaWYgKHBtbG1laW5mby0+RVJQX2VuYWJsZSAmJiBwbWxtZWluZm8tPkVSUF9JRSAmIEJJVCgxKSkgewotCQkJaWYgKHByZWdwcml2LT52Y3NfdHlwZSA9PSBSVFNfQ1RTKSB7Ci0JCQkJcHN0YS0+cnRzZW4gPSAxOwotCQkJCXBzdGEtPmN0czJzZWxmID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcHN0YS0+cnRzZW4gPSAwOwotCQkJCXBzdGEtPmN0czJzZWxmID0gMTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXBzdGEtPnJ0c2VuID0gMDsKLQkJCXBzdGEtPmN0czJzZWxmID0gMDsKLQkJfQotCQlicmVhazsKLQl9Ci19Ci0KLWludCBydHdfY2hlY2tfYmNuX2luZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsIHUzMiBwa3RfbGVuKQotewotCXN0cnVjdCB3bGFuX25ldHdvcmsgKmN1cl9uZXR3b3JrID0gJkFkYXB0ZXItPm1sbWVwcml2LmN1cl9uZXR3b3JrOwotCXN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uICpwaHRfaW5mbzsKLQl1bnNpZ25lZCBzaG9ydCB2YWwxNjsKLQl1OCBjcnlwdG8sIGJjbl9jaGFubmVsOwotCWludCBncm91cF9jaXBoZXIgPSAwLCBwYWlyd2lzZV9jaXBoZXIgPSAwLCBpc184MDIxeCA9IDAsIHI7Ci0JaW50IHBpZV9sZW4sIHNzaWRfbGVuLCBwcml2YWN5OwotCWNvbnN0IHU4ICpwLCAqc3NpZDsKLQotCWlmICghaXNfY2xpZW50X2Fzc29jaWF0ZWRfdG9fYXAyM2EoQWRhcHRlcikpCi0JCXJldHVybiBfU1VDQ0VTUzsKLQotCWlmICh1bmxpa2VseSghaWVlZTgwMjExX2lzX2JlYWNvbihtZ210LT5mcmFtZV9jb250cm9sKSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlY2VpdmVkIGEgbm9uIGJlYWNvbiBmcmFtZSFcbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwoY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywgbWdtdC0+YnNzaWQpKSB7Ci0JCURCR184NzIzQSgiJXM6IGxpbmtlZCBidXQgcmVjdiBvdGhlciBic3NpZCBiY24gJXBNICVwTVxuIiwKLQkJCSAgX19mdW5jX18sIG1nbXQtPmJzc2lkLAotCQkJICBjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCS8qIGNoZWNrIGJ3IGFuZCBjaGFubmVsIG9mZnNldCAqLwotCS8qIHBhcnNpbmcgSFRfQ0FQX0lFICovCi0JcGllX2xlbiA9IHBrdF9sZW4gLSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKLQotCS8qIENoZWNraW5nIGZvciBjaGFubmVsICovCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfRFNfUEFSQU1TLCBtZ210LT51LmJlYWNvbi52YXJpYWJsZSwKLQkJCSAgICAgcGllX2xlbik7Ci0JaWYgKHApCi0JCWJjbl9jaGFubmVsID0gcFsyXTsKLQllbHNlIHsKLQkJLyogSW4gNUcsIHNvbWUgYXAgZG8gbm90IGhhdmUgRFNTRVQgSUUgY2hlY2tpbmcgSFQKLQkJICAgaW5mbyBmb3IgY2hhbm5lbCAqLwotCQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9IVF9PUEVSQVRJT04sCi0JCQkJICAgICBtZ210LT51LmJlYWNvbi52YXJpYWJsZSwgcGllX2xlbik7Ci0KLQkJaWYgKHAgJiYgcFsxXSA+IDApIHsKLQkJCXBodF9pbmZvID0gKHN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uICopKHAgKyAyKTsKLQkJCWJjbl9jaGFubmVsID0gcGh0X2luZm8tPnByaW1hcnlfY2hhbjsKLQkJfSBlbHNlIHsgLyogd2UgZG9uJ3QgZmluZCBjaGFubmVsIElFLCBzbyBkb24ndCBjaGVjayBpdCAqLwotCQkJREJHXzg3MjNBKCJPb3BzOiAlcyB3ZSBkb24ndCBmaW5kIGNoYW5uZWwgSUUsIHNvIGRvbid0ICIKLQkJCQkgICJjaGVjayBpdFxuIiwgX19mdW5jX18pOwotCQkJYmNuX2NoYW5uZWwgPSBBZGFwdGVyLT5tbG1lZXh0cHJpdi5jdXJfY2hhbm5lbDsKLQkJfQotCX0KLQlpZiAoYmNuX2NoYW5uZWwgIT0gQWRhcHRlci0+bWxtZWV4dHByaXYuY3VyX2NoYW5uZWwpIHsKLQkJREJHXzg3MjNBKCIlcyBiZWFjb24gY2hhbm5lbDolZCBjdXIgY2hhbm5lbDolZCBkaXNjb25uZWN0XG4iLAotCQkJICBfX2Z1bmNfXywgYmNuX2NoYW5uZWwsCi0JCQkgIEFkYXB0ZXItPm1sbWVleHRwcml2LmN1cl9jaGFubmVsKTsKLQkJZ290byBfbWlzbWF0Y2g7Ci0JfQotCi0JLyogY2hlY2tpbmcgU1NJRCAqLwotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX1NTSUQsIG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlLCBwaWVfbGVuKTsKLQlpZiAocCAmJiBwWzFdKSB7Ci0JCXNzaWQgPSBwICsgMjsKLQkJc3NpZF9sZW4gPSBwWzFdOwotCX0gZWxzZSB7Ci0JCURCR184NzIzQSgiJXMgbWFyYzogY2Fubm90IGZpbmQgU1NJRCBmb3Igc3VydmV5IGV2ZW50XG4iLAotCQkJICBfX2Z1bmNfXyk7Ci0JCXNzaWQgPSBOVUxMOwotCQlzc2lkX2xlbiA9IDA7Ci0JfQotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCSAiJXMgYnNzaWQuU3NpZC5Tc2lkOiVzIGJzc2lkLlNzaWQuU3NpZExlbmd0aDolZCBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLlNzaWQ6JXMgbGVuOiVkXG4iLAotCQkgX19mdW5jX18sIHNzaWQsIHNzaWRfbGVuLCBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWQsCi0JCSBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuKTsKLQotCWlmIChzc2lkX2xlbiAhPSBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuIHx8IHNzaWRfbGVuID4gMzIgfHwKLQkgICAgKHNzaWRfbGVuICYmCi0JICAgICBtZW1jbXAoc3NpZCwgY3VyX25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkLCBzc2lkX2xlbikpKSB7Ci0JCURCR184NzIzQSgiJXMoKSwgU1NJRCBpcyBub3QgbWF0Y2ggcmV0dXJuIEZBSUxcbiIsIF9fZnVuY19fKTsKLQkJZ290byBfbWlzbWF0Y2g7Ci0JfQotCi0JLyogY2hlY2sgZW5jcnlwdGlvbiBpbmZvICovCi0JdmFsMTYgPSBsZTE2X3RvX2NwdShtZ210LT51LmJlYWNvbi5jYXBhYl9pbmZvKTsKLQotCWlmICh2YWwxNiAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKQotCQlwcml2YWN5ID0gMTsKLQllbHNlCi0JCXByaXZhY3kgPSAwOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCSAiJXMoKTogY3VyX25ldHdvcmstPm5ldHdvcmsuUHJpdmFjeSBpcyAlZCwgYnNzaWQuUHJpdmFjeSBpcyAlZFxuIiwKLQkJIF9fZnVuY19fLCBjdXJfbmV0d29yay0+bmV0d29yay5Qcml2YWN5LCBwcml2YWN5KTsKLQlpZiAoY3VyX25ldHdvcmstPm5ldHdvcmsuUHJpdmFjeSAhPSBwcml2YWN5KSB7Ci0JCURCR184NzIzQSgiJXMoKSwgcHJpdmFjeSBpcyBub3QgbWF0Y2ggcmV0dXJuIEZBSUxcbiIsIF9fZnVuY19fKTsKLQkJZ290byBfbWlzbWF0Y2g7Ci0JfQotCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfUlNOLCBtZ210LT51LmJlYWNvbi52YXJpYWJsZSwgcGllX2xlbik7Ci0JaWYgKHAgJiYgcFsxXSkgewotCQljcnlwdG8gPSBFTkNSWVBfUFJPVE9DT0xfV1BBMjsKLQkJaWYgKHAgJiYgcFsxXSkgewotCQkJciA9IHJ0d19wYXJzZV93cGEyX2llMjNhKHAsIHBbMV0gKyAyLCAmZ3JvdXBfY2lwaGVyLAotCQkJCQkJICZwYWlyd2lzZV9jaXBoZXIsICZpc184MDIxeCk7Ci0JCQlpZiAociA9PSBfU1VDQ0VTUykKLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCQkJICIlcyBwbmV0d29yay0+cGFpcndpc2VfY2lwaGVyOiAlZCwgcG5ldHdvcmstPmdyb3VwX2NpcGhlcjogJWQsIGlzXzgwMnggOiAlZFxuIiwKLQkJCQkJIF9fZnVuY19fLCBwYWlyd2lzZV9jaXBoZXIsCi0JCQkJCSBncm91cF9jaXBoZXIsIGlzXzgwMjF4KTsKLQkJCX0KLQl9IGVsc2UgewotCQlwID0gY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xBTl9PVUlfTUlDUk9TT0ZULAotCQkJCQkgICAgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV1BBLAotCQkJCQkgICAgbWdtdC0+dS5iZWFjb24udmFyaWFibGUsIHBpZV9sZW4pOwotCQlpZiAocCAmJiBwWzFdKSB7Ci0JCQljcnlwdG8gPSBFTkNSWVBfUFJPVE9DT0xfV1BBOwotCQkJciA9IHJ0d19wYXJzZV93cGFfaWUyM2EocCwgcFsxXSArIDIsICZncm91cF9jaXBoZXIsCi0JCQkJCQkmcGFpcndpc2VfY2lwaGVyLCAmaXNfODAyMXgpOwotCQkJaWYgKHIgPT0gX1NVQ0NFU1MpCi0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiJXMgcG5ldHdvcmstPnBhaXJ3aXNlX2NpcGhlcjogJWQsIGdyb3VwX2NpcGhlciBpcyAlZCwgaXNfODAyMXggaXMgJWRcbiIsCi0JCQkJCSBfX2Z1bmNfXywgcGFpcndpc2VfY2lwaGVyLAotCQkJCQkgZ3JvdXBfY2lwaGVyLCBpc184MDIxeCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocHJpdmFjeSkKLQkJCQljcnlwdG8gPSBFTkNSWVBfUFJPVE9DT0xfV0VQOwotCQkJZWxzZQotCQkJCWNyeXB0byA9IEVOQ1JZUF9QUk9UT0NPTF9PUEVOU1lTOwotCQl9Ci0JfQotCi0JaWYgKGN1cl9uZXR3b3JrLT5CY25JbmZvLmVuY3J5cF9wcm90b2NvbCAhPSBjcnlwdG8pIHsKLQkJREJHXzg3MjNBKCIlcygpOiBlbmNyeXB0aW9uIG1pc21hdGNoLCByZXR1cm4gRkFJTFxuIiwgX19mdW5jX18pOwotCQlnb3RvIF9taXNtYXRjaDsKLQl9Ci0KLQlpZiAoY3J5cHRvID09IEVOQ1JZUF9QUk9UT0NPTF9XUEEgfHwgY3J5cHRvID09IEVOQ1JZUF9QUk9UT0NPTF9XUEEyKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzIGN1cl9uZXR3b3JrLT5ncm91cF9jaXBoZXIgaXMgJWQ6ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSBjdXJfbmV0d29yay0+QmNuSW5mby5ncm91cF9jaXBoZXIsIGdyb3VwX2NpcGhlcik7Ci0JCWlmIChwYWlyd2lzZV9jaXBoZXIgIT0gY3VyX25ldHdvcmstPkJjbkluZm8ucGFpcndpc2VfY2lwaGVyIHx8Ci0JCSAgICBncm91cF9jaXBoZXIgIT0gY3VyX25ldHdvcmstPkJjbkluZm8uZ3JvdXBfY2lwaGVyKSB7Ci0JCQlEQkdfODcyM0EoIiVzIHBhaXJ3aXNlX2NpcGhlcigleDoleCkgb3IgZ3JvdXBfY2lwaGVyICIKLQkJCQkgICIoJXg6JXgpIGlzIG5vdCBtYXRjaCwgcmV0dXJuIEZBSUxcbiIsCi0JCQkJICBfX2Z1bmNfXywgcGFpcndpc2VfY2lwaGVyLAotCQkJCSAgY3VyX25ldHdvcmstPkJjbkluZm8ucGFpcndpc2VfY2lwaGVyLAotCQkJCSAgZ3JvdXBfY2lwaGVyLAotCQkJCSAgY3VyX25ldHdvcmstPkJjbkluZm8uZ3JvdXBfY2lwaGVyKTsKLQkJCWdvdG8gX21pc21hdGNoOwotCQl9Ci0KLQkJaWYgKGlzXzgwMjF4ICE9IGN1cl9uZXR3b3JrLT5CY25JbmZvLmlzXzgwMjF4KSB7Ci0JCQlEQkdfODcyM0EoIiVzIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCBtYXRjaCwgcmV0dXJuICIKLQkJCQkgICJGQUlMXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIF9taXNtYXRjaDsKLQkJfQotCX0KLQotCXJldHVybiBfU1VDQ0VTUzsKLQotX21pc21hdGNoOgotCi0JcmV0dXJuIF9GQUlMOwotfQotCi12b2lkIHVwZGF0ZV9iZWFjb24yM2FfaW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LAotCQkJICAgdWludCBwa3RfbGVuLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0JdW5zaWduZWQgaW50IGxlbjsKLQljb25zdCB1OCAqcDsKLQotCWxlbiA9IHBrdF9sZW4gLSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKLQotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX09QRVJBVElPTiwgbWdtdC0+dS5iZWFjb24udmFyaWFibGUsCi0JCQkgICAgIGxlbik7Ci0JaWYgKHApCi0JCWJ3bW9kZV91cGRhdGVfY2hlY2socGFkYXB0ZXIsIHApOwotCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfRVJQX0lORk8sIG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlLCBsZW4pOwotCWlmIChwKSB7Ci0JCUVSUF9JRV9oYW5kbGVyMjNhKHBhZGFwdGVyLCBwKTsKLQkJVkNTX3VwZGF0ZTIzYShwYWRhcHRlciwgcHN0YSk7Ci0JfQotfQotCi1ib29sIGlzX2FwX2luX3RraXAyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1MzIgaTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JY29uc3QgdTggKnA7Ci0KLQlpZiAoY3VyX25ldHdvcmstPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkgewotCQlmb3IgKGkgPSAwOyBpIDwgcG1sbWVpbmZvLT5uZXR3b3JrLklFTGVuZ3RoOykgewotCQkJcCA9IHBtbG1laW5mby0+bmV0d29yay5JRXMgKyBpOwotCi0JCQlzd2l0Y2ggKHBbMF0pIHsKLQkJCWNhc2UgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDOgotCQkJCWlmICghbWVtY21wKHAgKyAyLCBSVFdfV1BBX09VSTIzQV9UWVBFLCA0KSAmJgotCQkJCSAgICAhbWVtY21wKHAgKyAyICsgMTIsIFdQQV9US0lQX0NJUEhFUiwgNCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXTEFOX0VJRF9SU046Ci0JCQkJaWYgKCFtZW1jbXAocCArIDIgKyA4LCBSU05fVEtJUF9DSVBIRVIsIDQpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpICs9IChwWzFdICsgMik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0gZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgc2hvdWxkX2ZvcmJpZF9uX3JhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1MzIgaTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICAqY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrOwotCWNvbnN0IHU4ICpwOwotCi0JaWYgKGN1cl9uZXR3b3JrLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpIHsKLQkJZm9yIChpID0gMDsgaSA8IGN1cl9uZXR3b3JrLT5JRUxlbmd0aDspIHsKLQkJCXAgPSBjdXJfbmV0d29yay0+SUVzICsgaTsKLQotCQkJc3dpdGNoIChwWzBdKSB7Ci0JCQljYXNlIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzoKLQkJCQlpZiAoIW1lbWNtcChwICsgMiwgUlRXX1dQQV9PVUkyM0FfVFlQRSwgNCkgJiYKLQkJCQkgICAgKCFtZW1jbXAocCArIDIgKyAxMiwKLQkJCQkJICAgICBXUEFfQ0lQSEVSX1NVSVRFX0NDTVAyM0EsIDQpIHx8Ci0JCQkJICAgICAhbWVtY21wKHAgKyAyICsgMTYsCi0JCQkJCSAgICAgV1BBX0NJUEhFUl9TVUlURV9DQ01QMjNBLCA0KSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0xBTl9FSURfUlNOOgotCQkJCWlmICghbWVtY21wKHAgKyAyICsgOCwKLQkJCQkJICAgIFJTTl9DSVBIRVJfU1VJVEVfQ0NNUDIzQSwgNCkgfHwKLQkJCQkgICAgIW1lbWNtcChwICsgMiArIDEyLAotCQkJCQkgICAgUlNOX0NJUEhFUl9TVUlURV9DQ01QMjNBLCA0KSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpICs9IChwWzFdICsgMik7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KLQotYm9vbCBpc19hcF9pbl93ZXAyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1MzIgaTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JY29uc3QgdTggKnA7Ci0KLQlpZiAoY3VyX25ldHdvcmstPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkgewotCQlmb3IgKGkgPSAwOyBpIDwgcG1sbWVpbmZvLT5uZXR3b3JrLklFTGVuZ3RoOykgewotCQkJcCA9IHBtbG1laW5mby0+bmV0d29yay5JRXMgKyBpOwotCi0JCQlzd2l0Y2ggKHBbMF0pIHsKLQkJCWNhc2UgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDOgotCQkJCWlmICghbWVtY21wKHAgKyAyLCBSVFdfV1BBX09VSTIzQV9UWVBFLCA0KSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXTEFOX0VJRF9SU046Ci0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpICs9IChwWzFdICsgMik7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9IGVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50IHdpZmlyYXRlMl9yYXRldGJsX2lueDIzYSh1bnNpZ25lZCBjaGFyIHJhdGUpCi17Ci0JaW50IGlueCA9IDA7Ci0KLQlyYXRlID0gcmF0ZSAmIDB4N2Y7Ci0KLQlzd2l0Y2ggKHJhdGUpIHsKLQljYXNlIDU0KjI6Ci0JCWlueCA9IDExOwotCQlicmVhazsKLQljYXNlIDQ4KjI6Ci0JCWlueCA9IDEwOwotCQlicmVhazsKLQljYXNlIDM2KjI6Ci0JCWlueCA9IDk7Ci0JCWJyZWFrOwotCWNhc2UgMjQqMjoKLQkJaW54ID0gODsKLQkJYnJlYWs7Ci0JY2FzZSAxOCoyOgotCQlpbnggPSA3OwotCQlicmVhazsKLQljYXNlIDEyKjI6Ci0JCWlueCA9IDY7Ci0JCWJyZWFrOwotCWNhc2UgOSoyOgotCQlpbnggPSA1OwotCQlicmVhazsKLQljYXNlIDYqMjoKLQkJaW54ID0gNDsKLQkJYnJlYWs7Ci0JY2FzZSAxMSoyOgotCQlpbnggPSAzOwotCQlicmVhazsKLQljYXNlIDExOgotCQlpbnggPSAyOwotCQlicmVhazsKLQljYXNlIDIqMjoKLQkJaW54ID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSAxKjI6Ci0JCWlueCA9IDA7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gaW54OwotfQotCi11bnNpZ25lZCBpbnQgdXBkYXRlX2Jhc2ljX3JhdGUyM2EodW5zaWduZWQgY2hhciAqcHRuLCB1bnNpZ25lZCBpbnQgcHRuX3N6KQotewotCXVuc2lnbmVkIGludCBpLCBudW1fb2ZfcmF0ZTsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0KLQludW1fb2ZfcmF0ZSA9IChwdG5fc3ogPiBOdW1SYXRlcyk/IE51bVJhdGVzOiBwdG5fc3o7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX3JhdGU7IGkrKykgewotCQlpZiAoKCoocHRuICsgaSkpICYgMHg4MCkKLQkJCW1hc2sgfD0gMHgxIDw8IHdpZmlyYXRlMl9yYXRldGJsX2lueDIzYSgqKHB0biArIGkpKTsKLQl9Ci0JcmV0dXJuIG1hc2s7Ci19Ci0KLXVuc2lnbmVkIGludCB1cGRhdGVfc3VwcG9ydGVkX3JhdGUyM2EodW5zaWduZWQgY2hhciAqcHRuLCB1bnNpZ25lZCBpbnQgcHRuX3N6KQotewotCXVuc2lnbmVkIGludCBpLCBudW1fb2ZfcmF0ZTsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0KLQludW1fb2ZfcmF0ZSA9IChwdG5fc3ogPiBOdW1SYXRlcykgPyBOdW1SYXRlcyA6IHB0bl9zejsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fb2ZfcmF0ZTsgaSsrKQotCQltYXNrIHw9IDB4MSA8PCB3aWZpcmF0ZTJfcmF0ZXRibF9pbngyM2EoKihwdG4gKyBpKSk7Ci0JcmV0dXJuIG1hc2s7Ci19Ci0KLXVuc2lnbmVkIGludCB1cGRhdGVfTVNDX3JhdGUyM2Eoc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKnBIVF9jYXBzKQotewotCXVuc2lnbmVkIGludCBtYXNrOwotCi0JbWFzayA9IHBIVF9jYXBzLT5tY3MucnhfbWFza1swXSA8PCAxMiB8Ci0JCXBIVF9jYXBzLT5tY3MucnhfbWFza1sxXSA8PCAyMDsKLQotCXJldHVybiBtYXNrOwotfQotCi1pbnQgc3VwcG9ydF9zaG9ydF9HSTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKnBIVF9jYXBzKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JdW5zaWduZWQgY2hhciBiaXRfb2Zmc2V0OwotCi0JaWYgKCFwbWxtZWluZm8tPkhUX2VuYWJsZSkKLQkJcmV0dXJuIF9GQUlMOwotCWlmIChwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciA9PSBIVF9JT1RfUEVFUl9SQUxJTkspCi0JCXJldHVybiBfRkFJTDsKLQliaXRfb2Zmc2V0ID0gKHBtbG1lZXh0LT5jdXJfYndtb2RlICYgSFRfQ0hBTk5FTF9XSURUSF80MCk/IDY6IDU7Ci0KLQlpZiAocEhUX2NhcHMtPmNhcF9pbmZvICYgY3B1X3RvX2xlMTYoMHgxIDw8IGJpdF9vZmZzZXQpKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0JZWxzZQotCQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLXVuc2lnbmVkIGNoYXIgZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgyM2EodTMyIG1hc2spCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgY2hhciByYXRlX2lkeCA9IDA7Ci0KLQlmb3IgKGkgPSAyNzsgaSA+PSAwOyBpLS0pIHsKLQkJaWYgKG1hc2sgJiBCSVQoaSkpIHsKLQkJCXJhdGVfaWR4ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiByYXRlX2lkeDsKLX0KLQotdm9pZCBVcGRhdGVfUkFfRW50cnkyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCXJ0d19oYWxfdXBkYXRlX3JhX21hc2syM2EocHN0YSwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuYWJsZV9yYXRlX2FkYXB0aXZlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSkKLXsKLQlVcGRhdGVfUkFfRW50cnkyM2EocGFkYXB0ZXIsIHBzdGEpOwotfQotCi12b2lkIHNldF9zdGFfcmF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0JLyogcmF0ZSBhZGFwdGl2ZSAqLwotCWVuYWJsZV9yYXRlX2FkYXB0aXZlKHBhZGFwdGVyLCBwc3RhKTsKLX0KLQotLyogIFVwZGF0ZSBSUlNSIGFuZCBSYXRlIGZvciBVU0VSQVRFICovCi12b2lkIHVwZGF0ZV90eF9iYXNpY19yYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHdpcmVsZXNzbW9kZSkKLXsKLQl1bnNpZ25lZCBjaGFyIHN1cHBvcnRlZF9yYXRlc1tORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVhdOwotCi0JbWVtc2V0KHN1cHBvcnRlZF9yYXRlcywgMCwgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYKTsKLQotCWlmICh3aXJlbGVzc21vZGUgPT0gV0lSRUxFU1NfMTFCKSB7Ci0JCW1lbWNweShzdXBwb3J0ZWRfcmF0ZXMsIHJ0d19iYXNpY19yYXRlX2NjaywgNCk7Ci0JfSBlbHNlIGlmICh3aXJlbGVzc21vZGUgJiBXSVJFTEVTU18xMUIpIHsKLQkJbWVtY3B5KHN1cHBvcnRlZF9yYXRlcywgcnR3X2Jhc2ljX3JhdGVfbWl4LCA3KTsKLQl9IGVsc2UgewotCQltZW1jcHkoc3VwcG9ydGVkX3JhdGVzLCBydHdfYmFzaWNfcmF0ZV9vZmRtLCAzKTsKLQl9Ci0KLQlpZiAod2lyZWxlc3Ntb2RlICYgV0lSRUxFU1NfMTFCKQotCQl1cGRhdGVfbWdudF90eF9yYXRlMjNhKHBhZGFwdGVyLCBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CKTsKLQllbHNlCi0JCXVwZGF0ZV9tZ250X3R4X3JhdGUyM2EocGFkYXB0ZXIsIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CKTsKLQotCUhhbFNldEJyYXRlQ2ZnMjNhKHBhZGFwdGVyLCBzdXBwb3J0ZWRfcmF0ZXMpOwotfQotCi11bnNpZ25lZCBjaGFyIGNoZWNrX2Fzc29jX0FQMjNhKHU4ICpwZnJhbWUsIHVpbnQgbGVuKQotewotCWludCBpOwotCXU4IGVwaWdyYW1fdmVuZG9yX2ZsYWc7Ci0JdTggcmFsaW5rX3ZlbmRvcl9mbGFnOwotCWNvbnN0IHU4ICpwOwotCi0JZXBpZ3JhbV92ZW5kb3JfZmxhZyA9IDA7Ci0JcmFsaW5rX3ZlbmRvcl9mbGFnID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47KSB7Ci0JCXAgPSBwZnJhbWUgKyBpOwotCi0JCXN3aXRjaCAocFswXSkgewotCQljYXNlIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzoKLQkJCWlmICghbWVtY21wKHAgKyAyLCBBUlRIRVJPU19PVUkxLCAzKSB8fAotCQkJICAgICFtZW1jbXAocCArIDIsIEFSVEhFUk9TX09VSTIsIDMpKSB7Ci0JCQkJREJHXzg3MjNBKCJsaW5rIHRvIEFydGhlcm9zIEFQXG4iKTsKLQkJCQlyZXR1cm4gSFRfSU9UX1BFRVJfQVRIRVJPUzsKLQkJCX0gZWxzZSBpZiAoIW1lbWNtcChwICsgMiwgQlJPQURDT01fT1VJMSwgMykgfHwKLQkJCQkgICAhbWVtY21wKHAgKyAyLCBCUk9BRENPTV9PVUkyLCAzKSkgewotCQkJCURCR184NzIzQSgibGluayB0byBCcm9hZGNvbSBBUFxuIik7Ci0JCQkJcmV0dXJuIEhUX0lPVF9QRUVSX0JST0FEQ09NOwotCQkJfSBlbHNlIGlmICghbWVtY21wKHAgKyAyLCBNQVJWRUxMX09VSSwgMykpIHsKLQkJCQlEQkdfODcyM0EoImxpbmsgdG8gTWFydmVsbCBBUFxuIik7Ci0JCQkJcmV0dXJuIEhUX0lPVF9QRUVSX01BUlZFTEw7Ci0JCQl9IGVsc2UgaWYgKCFtZW1jbXAocCArIDIsIFJBTElOS19PVUksIDMpKSB7Ci0JCQkJaWYgKCFyYWxpbmtfdmVuZG9yX2ZsYWcpCi0JCQkJCXJhbGlua192ZW5kb3JfZmxhZyA9IDE7Ci0JCQkJZWxzZSB7Ci0JCQkJCURCR184NzIzQSgibGluayB0byBSYWxpbmsgQVBcbiIpOwotCQkJCQlyZXR1cm4gSFRfSU9UX1BFRVJfUkFMSU5LOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIW1lbWNtcChwICsgMiwgQ0lTQ09fT1VJLCAzKSkgewotCQkJCURCR184NzIzQSgibGluayB0byBDaXNjbyBBUFxuIik7Ci0JCQkJcmV0dXJuIEhUX0lPVF9QRUVSX0NJU0NPOwotCQkJfSBlbHNlIGlmICghbWVtY21wKHAgKyAyLCBSRUFMVEVLX09VSSwgMykpIHsKLQkJCQlEQkdfODcyM0EoImxpbmsgdG8gUmVhbHRlayA5NkJcbiIpOwotCQkJCXJldHVybiBIVF9JT1RfUEVFUl9SRUFMVEVLOwotCQkJfSBlbHNlIGlmICghbWVtY21wKHAgKyAyLCBBSVJHT0NBUF9PVUksIDMpKSB7Ci0JCQkJREJHXzg3MjNBKCJsaW5rIHRvIEFpcmdvIENhcFxuIik7Ci0JCQkJcmV0dXJuIEhUX0lPVF9QRUVSX0FJUkdPOwotCQkJfSBlbHNlIGlmICghbWVtY21wKHAgKyAyLCBFUElHUkFNX09VSSwgMykpIHsKLQkJCQllcGlncmFtX3ZlbmRvcl9mbGFnID0gMTsKLQkJCQlpZiAocmFsaW5rX3ZlbmRvcl9mbGFnKSB7Ci0JCQkJCURCR184NzIzQSgibGluayB0byBUZW5kYSBXMzExUiBBUFxuIik7Ci0JCQkJCXJldHVybiBIVF9JT1RfUEVFUl9URU5EQTsKLQkJCQl9IGVsc2UKLQkJCQkJREJHXzg3MjNBKCJDYXB0dXJlIEVQSUdSQU1fT1VJXG4iKTsKLQkJCX0gZWxzZQotCQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCQlpICs9IChwWzFdICsgMik7Ci0JfQotCi0JaWYgKHJhbGlua192ZW5kb3JfZmxhZyAmJiAhZXBpZ3JhbV92ZW5kb3JfZmxhZykgewotCQlEQkdfODcyM0EoImxpbmsgdG8gUmFsaW5rIEFQXG4iKTsKLQkJcmV0dXJuIEhUX0lPVF9QRUVSX1JBTElOSzsKLQl9IGVsc2UgaWYgKHJhbGlua192ZW5kb3JfZmxhZyAmJiBlcGlncmFtX3ZlbmRvcl9mbGFnKSB7Ci0JCURCR184NzIzQSgibGluayB0byBUZW5kYSBXMzExUiBBUFxuIik7Ci0JCXJldHVybiBIVF9JT1RfUEVFUl9URU5EQTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoImxpbmsgdG8gbmV3IEFQXG4iKTsKLQkJcmV0dXJuIEhUX0lPVF9QRUVSX1VOS05PV047Ci0JfQotfQotCi12b2lkIHVwZGF0ZV9JT1RfaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlzd2l0Y2ggKHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yKSB7Ci0JY2FzZSBIVF9JT1RfUEVFUl9NQVJWRUxMOgotCQlwbWxtZWluZm8tPnR1cmJvTW9kZV9jdHMyc2VsZiA9IDE7Ci0JCXBtbG1laW5mby0+dHVyYm9Nb2RlX3J0c2VuID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBIVF9JT1RfUEVFUl9SQUxJTks6Ci0JCXBtbG1laW5mby0+dHVyYm9Nb2RlX2N0czJzZWxmID0gMDsKLQkJcG1sbWVpbmZvLT50dXJib01vZGVfcnRzZW4gPSAxOwotCQkvKiBkaXNhYmxlIGhpZ2ggcG93ZXIgKi8KLQkJcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9jbHIocGFkYXB0ZXIsICh1MzIpCi0JCQkJCQkgfkRZTkFNSUNfQkJfRFlOQU1JQ19UWFBXUik7Ci0JCWJyZWFrOwotCWNhc2UgSFRfSU9UX1BFRVJfUkVBTFRFSzoKLQkJLyogcnR3X3dyaXRlMTYocGFkYXB0ZXIsIDB4NGNjLCAweGZmZmYpOyAqLwotCQkvKiBydHdfd3JpdGUxNihwYWRhcHRlciwgMHg1NDYsIDB4MDFjMCk7ICovCi0JCS8qIGRpc2FibGUgaGlnaCBwb3dlciAqLwotCQlydGw4NzIzYV9vZG1fc3VwcG9ydF9hYmlsaXR5X2NscihwYWRhcHRlciwgKHUzMikKLQkJCQkJCSB+RFlOQU1JQ19CQl9EWU5BTUlDX1RYUFdSKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcG1sbWVpbmZvLT50dXJib01vZGVfY3RzMnNlbGYgPSAwOwotCQlwbWxtZWluZm8tPnR1cmJvTW9kZV9ydHNlbiA9IDE7Ci0JCWJyZWFrOwotCX0KLX0KLQotdm9pZCB1cGRhdGVfY2FwaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHUxNiB1cGRhdGVDYXApCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJkFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JaWYgKHVwZGF0ZUNhcCAmIGNTaG9ydFByZWFtYmxlKSB7Ci0JCS8qICBTaG9ydCBQcmVhbWJsZSAqLwotCQlpZiAocG1sbWVpbmZvLT5wcmVhbWJsZV9tb2RlICE9IFBSRUFNQkxFX1NIT1JUKSB7Ci0JCQkvKiAgUFJFQU1CTEVfTE9ORyBvciBQUkVBTUJMRV9BVVRPICovCi0JCQlwbWxtZWluZm8tPnByZWFtYmxlX21vZGUgPSBQUkVBTUJMRV9TSE9SVDsKLQkJCXJ0bDg3MjNhX2Fja19wcmVhbWJsZShBZGFwdGVyLCB0cnVlKTsKLQkJfQotCX0gZWxzZSB7IC8qICBMb25nIFByZWFtYmxlICovCi0JCWlmIChwbWxtZWluZm8tPnByZWFtYmxlX21vZGUgIT0gUFJFQU1CTEVfTE9ORykgewotCQkJLyogIFBSRUFNQkxFX1NIT1JUIG9yIFBSRUFNQkxFX0FVVE8gKi8KLQkJCXBtbG1laW5mby0+cHJlYW1ibGVfbW9kZSA9IFBSRUFNQkxFX0xPTkc7Ci0JCQlydGw4NzIzYV9hY2tfcHJlYW1ibGUoQWRhcHRlciwgZmFsc2UpOwotCQl9Ci0JfQotCWlmICh1cGRhdGVDYXAgJiBjSUJTUykgewotCQkvKiBGaWxlbjogU2VlIDgwMi4xMS0yMDA3IHAuOTEgKi8KLQkJcG1sbWVpbmZvLT5zbG90VGltZSA9IE5PTl9TSE9SVF9TTE9UX1RJTUU7Ci0JfSBlbHNlIHsKLQkJLyogRmlsZW46IFNlZSA4MDIuMTEtMjAwNyBwLjkwICovCi0JCWlmIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgJgotCQkgICAgKFdJUkVMRVNTXzExRyB8IFdJUkVMRVNTXzExXzI0TikpIHsKLQkJCWlmICh1cGRhdGVDYXAgJiBjU2hvcnRTbG90VGltZSkgeyAvKiAgU2hvcnQgU2xvdCBUaW1lICovCi0JCQkJaWYgKHBtbG1laW5mby0+c2xvdFRpbWUgIT0gU0hPUlRfU0xPVF9USU1FKQotCQkJCQlwbWxtZWluZm8tPnNsb3RUaW1lID0gU0hPUlRfU0xPVF9USU1FOwotCQkJfSBlbHNlIHsgLyogIExvbmcgU2xvdCBUaW1lICovCi0JCQkJaWYgKHBtbG1laW5mby0+c2xvdFRpbWUgIT0gTk9OX1NIT1JUX1NMT1RfVElNRSkKLQkJCQkJcG1sbWVpbmZvLT5zbG90VGltZSA9Ci0JCQkJCQlOT05fU0hPUlRfU0xPVF9USU1FOwotCQkJfQotCQl9IGVsc2UgaWYgKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSAmCi0JCQkgICAoV0lSRUxFU1NfMTFBIHwgV0lSRUxFU1NfMTFfNU4pKSB7Ci0JCQlwbWxtZWluZm8tPnNsb3RUaW1lID0gU0hPUlRfU0xPVF9USU1FOwotCQl9IGVsc2UgewotCQkJLyogQiBNb2RlICovCi0JCQlwbWxtZWluZm8tPnNsb3RUaW1lID0gTk9OX1NIT1JUX1NMT1RfVElNRTsKLQkJfQotCX0KLQlydGw4NzIzYV9zZXRfc2xvdF90aW1lKEFkYXB0ZXIsIHBtbG1laW5mby0+c2xvdFRpbWUpOwotfQotCi12b2lkIHVwZGF0ZV93aXJlbGVzc19tb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaW50IHJhdGVsZW4sIG5ldHdvcmtfdHlwZSA9IDA7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyX25ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCXVuc2lnbmVkIGNoYXIgKnJhdGUgPSBjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXM7Ci0KLQlyYXRlbGVuID0gcnR3X2dldF9yYXRlc2V0X2xlbjIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCi0JaWYgKChwbWxtZWluZm8tPkhUX2luZm9fZW5hYmxlKSAmJiAocG1sbWVpbmZvLT5IVF9jYXBzX2VuYWJsZSkpCi0JCXBtbG1laW5mby0+SFRfZW5hYmxlID0gMTsKLQotCWlmIChwbWxtZWV4dC0+Y3VyX2NoYW5uZWwgPiAxNCkgewotCQlpZiAocG1sbWVpbmZvLT5IVF9lbmFibGUpCi0JCQluZXR3b3JrX3R5cGUgPSBXSVJFTEVTU18xMV81TjsKLQkJbmV0d29ya190eXBlIHw9IFdJUkVMRVNTXzExQTsKLQl9IGVsc2UgewotCQlpZiAocG1sbWVpbmZvLT5IVF9lbmFibGUpCi0JCQluZXR3b3JrX3R5cGUgPSBXSVJFTEVTU18xMV8yNE47Ci0KLQkJaWYgKGNja3JhdGVzb25seV9pbmNsdWRlZDIzYShyYXRlLCByYXRlbGVuKSA9PSB0cnVlKQotCQkJbmV0d29ya190eXBlIHw9IFdJUkVMRVNTXzExQjsKLQkJZWxzZSBpZiAoY2NrcmF0ZXNfaW5jbHVkZWQyM2EocmF0ZSwgcmF0ZWxlbikgPT0gdHJ1ZSkKLQkJCW5ldHdvcmtfdHlwZSB8PSBXSVJFTEVTU18xMUJHOwotCQllbHNlCi0JCQluZXR3b3JrX3R5cGUgfD0gV0lSRUxFU1NfMTFHOwotCX0KLQotCXBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSA9Ci0JCW5ldHdvcmtfdHlwZSAmIHBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lyZWxlc3NfbW9kZTsKLQotCS8qIDB4MDgwOCAtPiBmb3IgQ0NLLCAweDBhMGEgLT4gZm9yIE9GRE0gKi8KLQkvKiBjaGFuZ2UgdGhpcyB2YWx1ZSBpZiBoYXZpbmcgSU9UIGlzc3Vlcy4gKi8KLQlydGw4NzIzYV9zZXRfcmVzcF9zaWZzKHBhZGFwdGVyLCAweDA4LCAweDA4LCAweDBhLCAweDBhKTsKLQotCWlmIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgJiBXSVJFTEVTU18xMUIpCi0JCXVwZGF0ZV9tZ250X3R4X3JhdGUyM2EocGFkYXB0ZXIsIElFRUU4MDIxMV9DQ0tfUkFURV8xTUIpOwotCSBlbHNlCi0JCXVwZGF0ZV9tZ250X3R4X3JhdGUyM2EocGFkYXB0ZXIsIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CKTsKLX0KLQotdm9pZCB1cGRhdGVfYm1jX3N0YV9zdXBwb3J0X3JhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIG1hY19pZCkKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JaWYgKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSAmIFdJUkVMRVNTXzExQikgewotCQkvKiAgT25seSBCLCBCL0csIGFuZCBCL0cvTiBBUCBjb3VsZCB1c2UgQ0NLIHJhdGUgKi8KLQkJbWVtY3B5KChwbWxtZWluZm8tPkZXX3N0YV9pbmZvW21hY19pZF0uU3VwcG9ydGVkUmF0ZXMpLAotCQkgICAgICAgcnR3X2Jhc2ljX3JhdGVfY2NrLCA0KTsKLQl9IGVsc2UgewotCQltZW1jcHkocG1sbWVpbmZvLT5GV19zdGFfaW5mb1ttYWNfaWRdLlN1cHBvcnRlZFJhdGVzLAotCQkgICAgICAgcnR3X2Jhc2ljX3JhdGVfb2ZkbSwgMyk7Ci0JfQotfQotCi1pbnQgdXBkYXRlX3N0YV9zdXBwb3J0X3JhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnB2YXJfaWUsCi0JCQkgICAgICAgdWludCB2YXJfaWVfbGVuLCBpbnQgY2FtX2lkeCkKLXsKLQlpbnQgc3VwcG9ydFJhdGVOdW0gPSAwOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JY29uc3QgdTggKnA7Ci0KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9TVVBQX1JBVEVTLCBwdmFyX2llLCB2YXJfaWVfbGVuKTsKLQlpZiAoIXApCi0JCXJldHVybiBfRkFJTDsKLQotCW1lbWNweShwbWxtZWluZm8tPkZXX3N0YV9pbmZvW2NhbV9pZHhdLlN1cHBvcnRlZFJhdGVzLCBwICsgMiwgcFsxXSk7Ci0Jc3VwcG9ydFJhdGVOdW0gPSBwWzFdOwotCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfRVhUX1NVUFBfUkFURVMsIHB2YXJfaWUsIHZhcl9pZV9sZW4pOwotCWlmIChwKQotCQltZW1jcHkocG1sbWVpbmZvLT5GV19zdGFfaW5mb1tjYW1faWR4XS5TdXBwb3J0ZWRSYXRlcyArCi0JCSAgICAgICBzdXBwb3J0UmF0ZU51bSwgcCArIDIsIHBbMV0pOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotdm9pZCBwcm9jZXNzX2FkZGJhX3JlcTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICB1OCAqcGFkZGJhX3JlcSwgdTggKmFkZHIpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXUxNiB0aWQsIHN0YXJ0X3NlcSwgcGFyYW07Ci0Jc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IEFEREJBX3JlcXVlc3QgKnByZXEgPSAoc3RydWN0IEFEREJBX3JlcXVlc3QgKilwYWRkYmFfcmVxOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBhZGRyKTsKLQotCWlmIChwc3RhKSB7Ci0JCXN0YXJ0X3NlcSA9IGxlMTZfdG9fY3B1KHByZXEtPkJBX3N0YXJ0aW5nX3NlcWN0cmwpID4+IDQ7Ci0KLQkJcGFyYW0gPSBsZTE2X3RvX2NwdShwcmVxLT5CQV9wYXJhX3NldCk7Ci0JCXRpZCA9IChwYXJhbSA+PiAyKSAmIDB4MGY7Ci0KLQkJcHJlb3JkZXJfY3RybCA9ICZwc3RhLT5yZWN2cmVvcmRlcl9jdHJsW3RpZF07Ci0KLQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0gMHhmZmZmOwotCi0JCXByZW9yZGVyX2N0cmwtPmVuYWJsZSA9IChwbWxtZWluZm8tPmJBY2NlcHRBZGRiYVJlcSA9PSB0cnVlKSA/Ci0JCQl0cnVlIDogZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d194bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3htaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlNDBjZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3htaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9SVFdfWE1JVF9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHdpZmkuaD4KLSNpbmNsdWRlIDxvc2RlcF9pbnRmLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzLmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfeG1pdC5oPgotCi1zdGF0aWMgdm9pZCBfaW5pdF90eHNlcnZxKHN0cnVjdCB0eF9zZXJ2cSAqcHR4c2VydnEpCi17Ci0KLQlJTklUX0xJU1RfSEVBRCgmcHR4c2VydnEtPnR4X3BlbmRpbmcpOwotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHR4c2VydnEtPnN0YV9wZW5kaW5nKTsKLQlwdHhzZXJ2cS0+cWNudCA9IDA7Ci0KLX0KLQotdm9pZAlfcnR3X2luaXRfc3RhX3htaXRfcHJpdjIzYShzdHJ1Y3Qgc3RhX3htaXRfcHJpdiAqcHN0YV94bWl0cHJpdikKLXsKLQotCXNwaW5fbG9ja19pbml0KCZwc3RhX3htaXRwcml2LT5sb2NrKTsKLQotCS8qIGZvciAoaSA9IDAgOyBpIDwgTUFYX05VTUJMS1M7IGkrKykgKi8KLQkvKglfaW5pdF90eHNlcnZxKCZwc3RhX3htaXRwcml2LT5ibGtfcVtpXSk7ICovCi0KLQlfaW5pdF90eHNlcnZxKCZwc3RhX3htaXRwcml2LT5iZV9xKTsKLQlfaW5pdF90eHNlcnZxKCZwc3RhX3htaXRwcml2LT5ia19xKTsKLQlfaW5pdF90eHNlcnZxKCZwc3RhX3htaXRwcml2LT52aV9xKTsKLQlfaW5pdF90eHNlcnZxKCZwc3RhX3htaXRwcml2LT52b19xKTsKLQlJTklUX0xJU1RfSEVBRCgmcHN0YV94bWl0cHJpdi0+bGVnYWN5X2R6KTsKLQlJTklUX0xJU1RfSEVBRCgmcHN0YV94bWl0cHJpdi0+YXBzZCk7Ci0KLX0KLQotaW50IF9ydHdfaW5pdF94bWl0X3ByaXYyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LAotCQkJICAgc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpweGZyYW1lOwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQl1MzIgbWF4X3htaXRfZXh0YnVmX3NpemUgPSBNQVhfWE1JVF9FWFRCVUZfU1o7Ci0JdTMyIG51bV94bWl0X2V4dGJ1ZiA9IE5SX1hNSVRfRVhUQlVGRjsKLQotCXNwaW5fbG9ja19pbml0KCZweG1pdHByaXYtPmxvY2spOwotCXNwaW5fbG9ja19pbml0KCZweG1pdHByaXYtPmxvY2tfc2N0eCk7Ci0Jc2VtYV9pbml0KCZweG1pdHByaXYtPnhtaXRfc2VtYSwgMCk7Ci0Jc2VtYV9pbml0KCZweG1pdHByaXYtPnRlcm1pbmF0ZV94bWl0dGhyZWFkX3NlbWEsIDApOwotCi0JcHhtaXRwcml2LT5hZGFwdGVyID0gcGFkYXB0ZXI7Ci0KLQlfcnR3X2luaXRfcXVldWUyM2EoJnB4bWl0cHJpdi0+YmVfcGVuZGluZyk7Ci0JX3J0d19pbml0X3F1ZXVlMjNhKCZweG1pdHByaXYtPmJrX3BlbmRpbmcpOwotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHhtaXRwcml2LT52aV9wZW5kaW5nKTsKLQlfcnR3X2luaXRfcXVldWUyM2EoJnB4bWl0cHJpdi0+dm9fcGVuZGluZyk7Ci0JX3J0d19pbml0X3F1ZXVlMjNhKCZweG1pdHByaXYtPmJtX3BlbmRpbmcpOwotCi0JX3J0d19pbml0X3F1ZXVlMjNhKCZweG1pdHByaXYtPmZyZWVfeG1pdF9xdWV1ZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfWE1JVEZSQU1FOyBpKyspIHsKLQkJcHhmcmFtZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB4bWl0X2ZyYW1lKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcHhmcmFtZSkKLQkJCWJyZWFrOwotCQlJTklUX0xJU1RfSEVBRCgmcHhmcmFtZS0+bGlzdCk7Ci0KLQkJcHhmcmFtZS0+cGFkYXB0ZXIgPSBwYWRhcHRlcjsKLQkJcHhmcmFtZS0+ZnJhbWVfdGFnID0gTlVMTF9GUkFNRVRBRzsKLQotCQlsaXN0X2FkZF90YWlsKCZweGZyYW1lLT5saXN0LAotCQkJICAgICAgJnB4bWl0cHJpdi0+ZnJlZV94bWl0X3F1ZXVlLnF1ZXVlKTsKLQl9Ci0KLQlweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudCA9IGk7Ci0KLQlweG1pdHByaXYtPmZyYWdfbGVuID0gTUFYX0ZSQUdfVEhSRVNIT0xEOwotCi0JLyogaW5pdCB4bWl0X2J1ZiAqLwotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHhtaXRwcml2LT5mcmVlX3htaXRidWZfcXVldWUpOwotCUlOSVRfTElTVF9IRUFEKCZweG1pdHByaXYtPnhtaXRidWZfbGlzdCk7Ci0JX3J0d19pbml0X3F1ZXVlMjNhKCZweG1pdHByaXYtPnBlbmRpbmdfeG1pdGJ1Zl9xdWV1ZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfWE1JVEJVRkY7IGkrKykgewotCQlweG1pdGJ1ZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB4bWl0X2J1ZiksIEdGUF9LRVJORUwpOwotCQlpZiAoIXB4bWl0YnVmKQotCQkJZ290byBmYWlsOwotCQlJTklUX0xJU1RfSEVBRCgmcHhtaXRidWYtPmxpc3QpOwotCQlJTklUX0xJU1RfSEVBRCgmcHhtaXRidWYtPmxpc3QyKTsKLQotCQlweG1pdGJ1Zi0+cGFkYXB0ZXIgPSBwYWRhcHRlcjsKLQotCQkvKiBUeCBidWYgYWxsb2NhdGlvbiBtYXkgZmFpbCBzb21ldGltZXMsIHNvIHNsZWVwIGFuZCByZXRyeS4gKi8KLQkJcmVzID0gcnR3X29zX3htaXRfcmVzb3VyY2VfYWxsb2MyM2EocGFkYXB0ZXIsIHB4bWl0YnVmLAotCQkJCQkJIChNQVhfWE1JVEJVRl9TWiArIFhNSVRCVUZfQUxJR05fU1opKTsKLQkJaWYgKHJlcyA9PSBfRkFJTCkgewotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJbGlzdF9hZGRfdGFpbCgmcHhtaXRidWYtPmxpc3QsCi0JCQkgICAgICAmcHhtaXRwcml2LT5mcmVlX3htaXRidWZfcXVldWUucXVldWUpOwotCQlsaXN0X2FkZF90YWlsKCZweG1pdGJ1Zi0+bGlzdDIsCi0JCQkgICAgICAmcHhtaXRwcml2LT54bWl0YnVmX2xpc3QpOwotCX0KLQotCXB4bWl0cHJpdi0+ZnJlZV94bWl0YnVmX2NudCA9IE5SX1hNSVRCVUZGOwotCi0JLyogaW5pdCB4ZnJhbWVfZXh0IHF1ZXVlLCAgdGhlIHNhbWUgY291bnQgYXMgZXh0YnVmICAqLwotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHhtaXRwcml2LT5mcmVlX3hmcmFtZV9leHRfcXVldWUpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV94bWl0X2V4dGJ1ZjsgaSsrKSB7Ci0JCXB4ZnJhbWUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgeG1pdF9mcmFtZSksIEdGUF9LRVJORUwpOwotCQlpZiAoIXB4ZnJhbWUpCi0JCQlicmVhazsKLQkJSU5JVF9MSVNUX0hFQUQoJnB4ZnJhbWUtPmxpc3QpOwotCi0JCXB4ZnJhbWUtPnBhZGFwdGVyID0gcGFkYXB0ZXI7Ci0JCXB4ZnJhbWUtPmZyYW1lX3RhZyA9IE5VTExfRlJBTUVUQUc7Ci0KLQkJcHhmcmFtZS0+cGt0ID0gTlVMTDsKLQotCQlweGZyYW1lLT5idWZfYWRkciA9IE5VTEw7Ci0JCXB4ZnJhbWUtPnB4bWl0YnVmID0gTlVMTDsKLQotCQlweGZyYW1lLT5leHRfdGFnID0gMTsKLQotCQlsaXN0X2FkZF90YWlsKCZweGZyYW1lLT5saXN0LAotCQkJICAgICAgJnB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X3F1ZXVlLnF1ZXVlKTsKLQl9Ci0JcHhtaXRwcml2LT5mcmVlX3hmcmFtZV9leHRfY250ID0gaTsKLQotCS8qICBJbml0IHhtaXQgZXh0ZW5zaW9uIGJ1ZmYgKi8KLQlfcnR3X2luaXRfcXVldWUyM2EoJnB4bWl0cHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnB4bWl0cHJpdi0+eG1pdGV4dGJ1Zl9saXN0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1feG1pdF9leHRidWY7IGkrKykgewotCQlweG1pdGJ1ZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB4bWl0X2J1ZiksIEdGUF9LRVJORUwpOwotCQlpZiAoIXB4bWl0YnVmKQotCQkJZ290byBmYWlsOwotCQlJTklUX0xJU1RfSEVBRCgmcHhtaXRidWYtPmxpc3QpOwotCQlJTklUX0xJU1RfSEVBRCgmcHhtaXRidWYtPmxpc3QyKTsKLQotCQlweG1pdGJ1Zi0+cGFkYXB0ZXIgPSBwYWRhcHRlcjsKLQotCQkvKiBUeCBidWYgYWxsb2NhdGlvbiBtYXkgZmFpbCBzb21ldGltZXMsIHNvIHNsZWVwIGFuZCByZXRyeS4gKi8KLQkJcmVzID0gcnR3X29zX3htaXRfcmVzb3VyY2VfYWxsb2MyM2EocGFkYXB0ZXIsIHB4bWl0YnVmLAotCQkJCQkJIG1heF94bWl0X2V4dGJ1Zl9zaXplICsgWE1JVEJVRl9BTElHTl9TWik7Ci0JCWlmIChyZXMgPT0gX0ZBSUwpIHsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCWxpc3RfYWRkX3RhaWwoJnB4bWl0YnVmLT5saXN0LAotCQkJICAgICAgJnB4bWl0cHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9xdWV1ZS5xdWV1ZSk7Ci0JCWxpc3RfYWRkX3RhaWwoJnB4bWl0YnVmLT5saXN0MiwKLQkJCSAgICAgICZweG1pdHByaXYtPnhtaXRleHRidWZfbGlzdCk7Ci0JfQotCi0JcHhtaXRwcml2LT5mcmVlX3htaXRfZXh0YnVmX2NudCA9IG51bV94bWl0X2V4dGJ1ZjsKLQotCXJ0d19hbGxvY19od3htaXRzMjNhKHBhZGFwdGVyKTsKLQlydHdfaW5pdF9od3htaXRzMjNhKHB4bWl0cHJpdi0+aHd4bWl0cywgcHhtaXRwcml2LT5od3htaXRfZW50cnkpOwotCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkgKyspCi0JCXB4bWl0cHJpdi0+d21tX3BhcmFfc2VxW2ldID0gaTsKLQotCXNlbWFfaW5pdCgmcHhtaXRwcml2LT50eF9yZXRldnQsIDApOwotCi0JcHhtaXRwcml2LT5hY2tfdHggPSBmYWxzZTsKLQltdXRleF9pbml0KCZweG1pdHByaXYtPmFja190eF9tdXRleCk7Ci0JcnR3X3NjdHhfaW5pdDIzYSgmcHhtaXRwcml2LT5hY2tfdHhfb3BzLCAwKTsKLQl0YXNrbGV0X2luaXQoJnBhZGFwdGVyLT54bWl0cHJpdi54bWl0X3Rhc2tsZXQsCi0JCSAgICAgKHZvaWQoKikodW5zaWduZWQgbG9uZykpcnRsODcyM2F1X3htaXRfdGFza2xldCwKLQkJICAgICAodW5zaWduZWQgbG9uZylwYWRhcHRlcik7Ci0KLWV4aXQ6Ci0KLQlyZXR1cm4gcmVzOwotZmFpbDoKLQlnb3RvIGV4aXQ7Ci19Ci0KLXZvaWQgX3J0d19mcmVlX3htaXRfcHJpdjIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHB4bWl0cHJpdi0+YWRhcHRlcjsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhmcmFtZSwgKnB0bXA7Ci0Jc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZiwgKnB0bXAyOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB4ZnJhbWUsIHB0bXAsCi0JCQkJICZweG1pdHByaXYtPmZyZWVfeG1pdF9xdWV1ZS5xdWV1ZSwgbGlzdCkgewotCQlsaXN0X2RlbF9pbml0KCZweGZyYW1lLT5saXN0KTsKLQkJcnR3X29zX3htaXRfY29tcGxldGUyM2EocGFkYXB0ZXIsIHB4ZnJhbWUpOwotCQlrZnJlZShweGZyYW1lKTsKLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHhtaXRidWYsIHB0bXAyLAotCQkJCSAmcHhtaXRwcml2LT54bWl0YnVmX2xpc3QsIGxpc3QyKSB7Ci0JCWxpc3RfZGVsX2luaXQoJnB4bWl0YnVmLT5saXN0Mik7Ci0JCXJ0d19vc194bWl0X3Jlc291cmNlX2ZyZWUyM2EocGFkYXB0ZXIsIHB4bWl0YnVmKTsKLQkJa2ZyZWUocHhtaXRidWYpOwotCX0KLQotCS8qIGZyZWUgeGZyYW1lX2V4dCBxdWV1ZSwgIHRoZSBzYW1lIGNvdW50IGFzIGV4dGJ1ZiAgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHhmcmFtZSwgcHRtcCwKLQkJCQkgJnB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X3F1ZXVlLnF1ZXVlLAotCQkJCSBsaXN0KSB7Ci0JCWxpc3RfZGVsX2luaXQoJnB4ZnJhbWUtPmxpc3QpOwotCQlydHdfb3NfeG1pdF9jb21wbGV0ZTIzYShwYWRhcHRlciwgcHhmcmFtZSk7Ci0JCWtmcmVlKHB4ZnJhbWUpOwotCX0KLQotCS8qICBmcmVlIHhtaXQgZXh0ZW5zaW9uIGJ1ZmYgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHhtaXRidWYsIHB0bXAyLAotCQkJCSAmcHhtaXRwcml2LT54bWl0ZXh0YnVmX2xpc3QsIGxpc3QyKSB7Ci0JCWxpc3RfZGVsX2luaXQoJnB4bWl0YnVmLT5saXN0Mik7Ci0JCXJ0d19vc194bWl0X3Jlc291cmNlX2ZyZWUyM2EocGFkYXB0ZXIsIHB4bWl0YnVmKTsKLQkJa2ZyZWUocHhtaXRidWYpOwotCX0KLQotCXJ0d19mcmVlX2h3eG1pdHMyM2EocGFkYXB0ZXIpOwotCW11dGV4X2Rlc3Ryb3koJnB4bWl0cHJpdi0+YWNrX3R4X211dGV4KTsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX2F0dHJpYl92Y3NfaW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQl1MzIJc3o7Ci0Jc3RydWN0IHBrdF9hdHRyaWIJKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzdGFfaW5mbwkqcHN0YSA9IHBhdHRyaWItPnBzdGE7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWlmIChwYXR0cmliLT5wc3RhKSB7Ci0JCXBzdGEgPSBwYXR0cmliLT5wc3RhOwotCX0gZWxzZSB7Ci0JCURCR184NzIzQSgiJXMsIGNhbGwgcnR3X2dldF9zdGFpbmZvMjNhKClcbiIsIF9fZnVuY19fKTsKLQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsICZwYXR0cmliLT5yYVswXSk7Ci0JfQotCi0JaWYgKHBzdGEgPT0gTlVMTCkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhID09IE5VTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCEocHN0YS0+c3RhdGUgJl9GV19MSU5LRUQpKSB7Ci0JCURCR184NzIzQSgiJXMsIHBzdGEtPnN0YXRlKDB4JXgpICE9IF9GV19MSU5LRURcbiIsIF9fZnVuY19fLCBwc3RhLT5zdGF0ZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocGF0dHJpYi0+bnJfZnJhZ3MgIT0gMSkKLQkJc3ogPSBwYWRhcHRlci0+eG1pdHByaXYuZnJhZ19sZW47Ci0JZWxzZSAvKiBubyBmcmFnICovCi0JCXN6ID0gcGF0dHJpYi0+bGFzdF90eGNtZHN6OwotCi0JLyogICgxKSBSVFNfVGhyZXNob2xkIGlzIGNvbXBhcmVkIHRvIHRoZSBNUERVLCBub3QgTVNEVS4gKi8KLQkvKiAgKDIpIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGZyYWcgaW4gIHRoaXMgTVNEVSwgb25seSB0aGUgZmlyc3QgZnJhZyB1c2VzIHByb3RlY3Rpb24gZnJhbWUuICovCi0JLyoJCU90aGVyIGZyYWdtZW50cyBhcmUgcHJvdGVjdGVkIGJ5IHByZXZpb3VzIGZyYWdtZW50LiAqLwotCS8qCQlTbyB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlIGxlbmd0aCBvZiBmaXJzdCBmcmFnbWVudC4gKi8KLQlpZiAocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlIDwgV0lSRUxFU1NfMTFfMjROICB8fCBwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpZmlfc3BlYykgewotCQlpZiAoc3ogPiBwYWRhcHRlci0+cmVnaXN0cnlwcml2LnJ0c190aHJlc2gpIHsKLQkJCXBhdHRyaWItPnZjc19tb2RlID0gUlRTX0NUUzsKLQkJfSBlbHNlIHsKLQkJCWlmIChwc3RhLT5ydHNlbikKLQkJCQlwYXR0cmliLT52Y3NfbW9kZSA9IFJUU19DVFM7Ci0JCQllbHNlIGlmIChwc3RhLT5jdHMyc2VsZikKLQkJCQlwYXR0cmliLT52Y3NfbW9kZSA9IENUU19UT19TRUxGOwotCQkJZWxzZQotCQkJCXBhdHRyaWItPnZjc19tb2RlID0gTk9ORV9WQ1M7Ci0JCX0KLQl9IGVsc2UgewotCQl3aGlsZSAodHJ1ZSkgewotCQkJLyogSU9UIGFjdGlvbiAqLwotCQkJaWYgKHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID09IEhUX0lPVF9QRUVSX0FUSEVST1MgJiYKLQkJCSAgICBwYXR0cmliLT5hbXBkdV9lbiAmJgotCQkJICAgIHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSA9PQotCQkJICAgIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVApIHsKLQkJCQlwYXR0cmliLT52Y3NfbW9kZSA9IENUU19UT19TRUxGOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBjaGVjayBFUlAgcHJvdGVjdGlvbiAqLwotCQkJaWYgKHBzdGEtPnJ0c2VuIHx8IHBzdGEtPmN0czJzZWxmKSB7Ci0JCQkJaWYgKHBzdGEtPnJ0c2VuKQotCQkJCQlwYXR0cmliLT52Y3NfbW9kZSA9IFJUU19DVFM7Ci0JCQkJZWxzZSBpZiAocHN0YS0+Y3RzMnNlbGYpCi0JCQkJCXBhdHRyaWItPnZjc19tb2RlID0gQ1RTX1RPX1NFTEY7Ci0KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogY2hlY2sgSFQgb3AgbW9kZSAqLwotCQkJaWYgKHBhdHRyaWItPmh0X2VuKSB7Ci0JCQkJdTggSFRPcE1vZGUgPSBwbWxtZWluZm8tPkhUX3Byb3RlY3Rpb247Ci0KLQkJCQlpZiAoKHBtbG1lZXh0LT5jdXJfYndtb2RlICYmIChIVE9wTW9kZSA9PSAyIHx8IEhUT3BNb2RlID09IDMpKSB8fAotCQkJCSAgICAoIXBtbG1lZXh0LT5jdXJfYndtb2RlICYmIEhUT3BNb2RlID09IDMpKSB7Ci0JCQkJCXBhdHRyaWItPnZjc19tb2RlID0gUlRTX0NUUzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBjaGVjayBydHMgKi8KLQkJCWlmIChzeiA+IHBhZGFwdGVyLT5yZWdpc3RyeXByaXYucnRzX3RocmVzaCkgewotCQkJCXBhdHRyaWItPnZjc19tb2RlID0gUlRTX0NUUzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogdG8gZG8gbGlzdDogY2hlY2sgTUlNTyBwb3dlciBzYXZlIGNvbmRpdGlvbi4gKi8KLQotCQkJLyogY2hlY2sgQU1QRFUgYWdncmVnYXRpb24gZm9yIFRYT1AgKi8KLQkJCWlmIChwYXR0cmliLT5hbXBkdV9lbikgewotCQkJCXBhdHRyaWItPnZjc19tb2RlID0gUlRTX0NUUzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcGF0dHJpYi0+dmNzX21vZGUgPSBOT05FX1ZDUzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfYXR0cmliX3BoeV9pbmZvKHN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0JLyppZiAocHN0YS0+cnRzZW4pCi0JCXBhdHRyaWItPnZjc19tb2RlID0gUlRTX0NUUzsKLQllbHNlIGlmIChwc3RhLT5jdHMyc2VsZikKLQkJcGF0dHJpYi0+dmNzX21vZGUgPSBDVFNfVE9fU0VMRjsKLQllbHNlCi0JCXBhdHRyaWItPnZjc19tb2RlID0gTk9ORV9WQ1M7Ki8KLQotCXBhdHRyaWItPm1kYXRhID0gMDsKLQlwYXR0cmliLT5lb3NwID0gMDsKLQlwYXR0cmliLT50cmlnZ2VyZWQgPSAwOwotCi0JLyogcW9zX2VuLCBodF9lbiwgaW5pdCByYXRlLCAsIGJ3LCBjaF9vZmZzZXQsIHNnaSAqLwotCXBhdHRyaWItPnFvc19lbiA9IHBzdGEtPnFvc19vcHRpb247Ci0KLQlwYXR0cmliLT5yYWlkID0gcHN0YS0+cmFpZDsKLQlwYXR0cmliLT5odF9lbiA9IHBzdGEtPmh0cHJpdi5odF9vcHRpb247Ci0JcGF0dHJpYi0+Yndtb2RlID0gcHN0YS0+aHRwcml2LmJ3bW9kZTsKLQlwYXR0cmliLT5jaF9vZmZzZXQgPSBwc3RhLT5odHByaXYuY2hfb2Zmc2V0OwotCXBhdHRyaWItPnNnaSA9IHBzdGEtPmh0cHJpdi5zZ2k7Ci0JcGF0dHJpYi0+YW1wZHVfZW4gPSBmYWxzZTsKLQotCXBhdHRyaWItPnJldHJ5X2N0cmwgPSBmYWxzZTsKLX0KLQotdTggcW9zX2FjbTIzYSh1OCBhY21fbWFzaywgdTggcHJpb3JpdHkpCi17Ci0JdTggY2hhbmdlX3ByaW9yaXR5ID0gcHJpb3JpdHk7Ci0KLQlzd2l0Y2ggKHByaW9yaXR5KSB7Ci0JY2FzZSAwOgotCWNhc2UgMzoKLQkJaWYgKGFjbV9tYXNrICYgQklUKDEpKQotCQkJY2hhbmdlX3ByaW9yaXR5ID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCWNhc2UgMjoKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCWNhc2UgNToKLQkJaWYgKGFjbV9tYXNrICYgQklUKDIpKQotCQkJY2hhbmdlX3ByaW9yaXR5ID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCWNhc2UgNzoKLQkJaWYgKGFjbV9tYXNrICYgQklUKDMpKQotCQkJY2hhbmdlX3ByaW9yaXR5ID0gNTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJREJHXzg3MjNBKCJxb3NfYWNtMjNhKCk6IGludmFsaWQgcGF0dHJpYi0+cHJpb3JpdHk6ICVkISEhXG4iLAotCQkJICBwcmlvcml0eSk7Ci0JCWNoYW5nZV9wcmlvcml0eSA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBjaGFuZ2VfcHJpb3JpdHk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9xb3Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIpCi17Ci0JdTggKnBmcmFtZSA9IHNrYi0+ZGF0YTsKLQlzdHJ1Y3QgaXBoZHIgKmlwX2hkcjsKLQl1OCBVc2VyUHJpb3JpdHkgPSAwOwotCi0JLyogIGdldCBVc2VyUHJpb3JpdHkgZnJvbSBJUCBoZHIgKi8KLQlpZiAocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9JUCkgewotCQlpcF9oZHIgPSAoc3RydWN0IGlwaGRyICopKHBmcmFtZSArIEVUSF9ITEVOKTsKLQkJVXNlclByaW9yaXR5ID0gaXBfaGRyLT50b3MgPj4gNTsKLQl9IGVsc2UgaWYgKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gRVRIX1BfUEFFKSB7Ci0JCS8qICAiV2hlbiBwcmlvcml0eSBwcm9jZXNzaW5nIG9mIGRhdGEgZnJhbWVzIGlzIHN1cHBvcnRlZCwgKi8KLQkJLyogIGEgU1RBJ3MgU01FIHNob3VsZCBzZW5kIEVBUE9MLUtleSBmcmFtZXMgYXQgdGhlIGhpZ2hlc3QKLQkJICAgIHByaW9yaXR5LiIgKi8KLQkJVXNlclByaW9yaXR5ID0gNzsKLQl9Ci0KLQlwYXR0cmliLT5wcmlvcml0eSA9IFVzZXJQcmlvcml0eTsKLQlwYXR0cmliLT5oZHJsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyKTsKLQlwYXR0cmliLT50eXBlID0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgfCBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEE7Ci19Ci0KLXN0YXRpYyBpbnQgdXBkYXRlX2F0dHJpYihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliKQotewotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7Ci0JaW50IGJtY2FzdDsKLQlzdHJ1Y3Qgc3RhX3ByaXYJKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IGV0aGhkciAqZWhkciA9IChzdHJ1Y3QgZXRoaGRyICopIHNrYi0+ZGF0YTsKLQotCXBhdHRyaWItPmV0aGVyX3R5cGUgPSBudG9ocyhlaGRyLT5oX3Byb3RvKTsKLQotCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5kc3QsIGVoZHItPmhfZGVzdCk7Ci0JZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnNyYywgZWhkci0+aF9zb3VyY2UpOwotCi0JcGF0dHJpYi0+cGN0cmwgPSAwOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSB8fAotCSAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5yYSwgcGF0dHJpYi0+ZHN0KTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnRhLCBwYXR0cmliLT5zcmMpOwotCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpIHsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnJhLCBnZXRfYnNzaWQocG1sbWVwcml2KSk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT50YSwgcGF0dHJpYi0+c3JjKTsKLQl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgewotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+cmEsIHBhdHRyaWItPmRzdCk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT50YSwgZ2V0X2Jzc2lkKHBtbG1lcHJpdikpOwotCX0KLQotCXBhdHRyaWItPnBrdGxlbiA9IHNrYi0+bGVuIC0gRVRIX0hMRU47Ci0KLQlpZiAocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9JUCkgewotCQkvKiAgVGhlIGZvbGxvd2luZyBpcyBmb3IgREhDUCBhbmQgQVJQIHBhY2tldCwgd2UgdXNlIGNjazFNCi0JCSAgICB0byB0eCB0aGVzZSBwYWNrZXRzIGFuZCBsZXQgTFBTIGF3YWtlIHNvbWUgdGltZSAqLwotCQkvKiAgdG8gcHJldmVudCBESENQIHByb3RvY29sIGZhaWwgKi8KLQkJcGF0dHJpYi0+ZGhjcF9wa3QgPSAwOwotCQkvKiBNSU5JTVVNX0RIQ1BfUEFDS0VUX1NJWkUpIHsgKi8KLQkJaWYgKHBhdHRyaWItPnBrdGxlbiA+IDI4MiArIDI0KSB7Ci0JCQlpZiAocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9JUCkgey8qICBJUCBoZWFkZXIgKi8KLQkJCQl1OCAqcGZyYW1lID0gc2tiLT5kYXRhOwotCi0JCQkJcGZyYW1lICs9IEVUSF9ITEVOOwotCi0JCQkJaWYgKChwZnJhbWVbMjFdID09IDY4ICYmIHBmcmFtZVsyM10gPT0gNjcpIHx8Ci0JCQkJICAgIChwZnJhbWVbMjFdID09IDY3ICYmIHBmcmFtZVsyM10gPT0gNjgpKSB7Ci0JCQkJCS8qICA2OCA6IFVEUCBCT09UUCBjbGllbnQgKi8KLQkJCQkJLyogIDY3IDogVURQIEJPT1RQIHNlcnZlciAqLwotCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywKLQkJCQkJCSBfZHJ2X2Vycl8sCi0JCQkJCQkgIj09PT09PT09PT09PT09PT09PT09PT11cGRhdGVfYXR0cmliOiBnZXQgREhDUCBQYWNrZXRcbiIpOwotCQkJCQlwYXR0cmliLT5kaGNwX3BrdCA9IDE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChwYXR0cmliLT5ldGhlcl90eXBlID09IEVUSF9QX1BBRSkgewotCQlEQkdfODcyM0FfTEVWRUwoX2Rydl9hbHdheXNfLCAic2VuZCBlYXBvbCBwYWNrZXRcbiIpOwotCX0KLQotCWlmICgocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9QQUUpIHx8IChwYXR0cmliLT5kaGNwX3BrdCA9PSAxKSkgewotCQlydHdfc2V0X3NjYW5fZGVueShwYWRhcHRlciwgMzAwMCk7Ci0JfQotCi0JLyogIElmIEVBUE9MICwgQVJQICwgT1IgREhDUCBwYWNrZXQsIGRyaXZlciBtdXN0IGJlIGluIGFjdGl2ZSBtb2RlLiAqLwotCWlmICgocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9BUlApIHx8Ci0JICAgIChwYXR0cmliLT5ldGhlcl90eXBlID09IEVUSF9QX1BBRSkgfHwgKHBhdHRyaWItPmRoY3BfcGt0ID09IDEpKSB7Ci0JCXJ0d19scHNfY3RybF93a19jbWQyM2EocGFkYXB0ZXIsIExQU19DVFJMX1NQRUNJQUxfUEFDS0VULCAxKTsKLQl9Ci0KLQlibWNhc3QgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSk7Ci0KLQkvKiAgZ2V0IHN0YV9pbmZvICovCi0JaWYgKGJtY2FzdCkgewotCQlwc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCX0gZWxzZSB7Ci0JCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBhdHRyaWItPnJhKTsKLQkJaWYgKHBzdGEgPT0gTlVMTCkgeyAvKiAgaWYgd2UgY2Fubm90IGdldCBwc3RhID0+IGRycnAgdGhlIHBrdCAqLwotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfYWxlcnRfLAotCQkJCSAidXBkYXRlX2F0dHJpYiA9PiBnZXQgc3RhX2luZm8gZmFpbCwgcmE6JXBNXG4iLAotCQkJCSBwYXR0cmliLT5yYSk7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfSBlbHNlIGlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkgJiYKLQkJCSAgICghKHBzdGEtPnN0YXRlICYgX0ZXX0xJTktFRCkpKSB7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCX0KLQotCWlmIChwc3RhKSB7Ci0JCXBhdHRyaWItPm1hY19pZCA9IHBzdGEtPm1hY19pZDsKLQkJLyogREJHXzg3MjNBKCIlcyA9PT4gbWFjX2lkKCVkKVxuIiwgX19mdW5jX18sIHBhdHRyaWItPm1hY19pZCk7ICovCi0JCXBhdHRyaWItPnBzdGEgPSBwc3RhOwotCX0gZWxzZSB7Ci0JCS8qICBpZiB3ZSBjYW5ub3QgZ2V0IHBzdGEgPT4gZHJvcCB0aGUgcGt0ICovCi0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2FsZXJ0XywKLQkJCSAidXBkYXRlX2F0dHJpYiA9PiBnZXQgc3RhX2luZm8gZmFpbCwgcmE6JXBNXG4iLAotCQkJIHBhdHRyaWItPnJhKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwYXR0cmliLT5hY2tfcG9saWN5ID0gMDsKLQkvKiAgZ2V0IGV0aGVyX2hkcl9sZW4gKi8KLQotCS8qIHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gMHg4MTAwKSA/ICgxNCArIDQpOiAxNDsgdmxhbiB0YWcgKi8KLQlwYXR0cmliLT5wa3RfaGRybGVuID0gRVRIX0hMRU47Ci0KLQlwYXR0cmliLT5oZHJsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwotCXBhdHRyaWItPnR5cGUgPSBJRUVFODAyMTFfRlRZUEVfREFUQTsKLQlwYXR0cmliLT5wcmlvcml0eSA9IDA7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUgfCBXSUZJX0FESE9DX1NUQVRFIHwKLQkJCSAgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7Ci0JCWlmIChwc3RhLT5xb3Nfb3B0aW9uKQotCQkJc2V0X3Fvcyhza2IsIHBhdHRyaWIpOwotCX0gZWxzZSB7Ci0JCWlmIChwbWxtZXByaXYtPnFvc19vcHRpb24pIHsKLQkJCXNldF9xb3Moc2tiLCBwYXR0cmliKTsKLQotCQkJaWYgKHBtbG1lcHJpdi0+YWNtX21hc2sgIT0gMCkgewotCQkJCXBhdHRyaWItPnByaW9yaXR5ID0gcW9zX2FjbTIzYShwbWxtZXByaXYtPmFjbV9tYXNrLAotCQkJCQkJCSAgICBwYXR0cmliLT5wcmlvcml0eSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAocHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPT0gdHJ1ZSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJICJwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9PSB0cnVlXG4iKTsKLQotCQlwYXR0cmliLT5lbmNyeXB0ID0gMDsKLQotCQlpZiAoKHBhdHRyaWItPmV0aGVyX3R5cGUgIT0gRVRIX1BfUEFFKSAmJgotCQkgICAgIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX01QX1NUQVRFKSkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgInBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID09IHRydWUsICBwYXR0cmliLT5ldGhlcl90eXBlKCUuNHgpICE9IDB4ODg4ZVxuIiwKLQkJCQkgcGF0dHJpYi0+ZXRoZXJfdHlwZSk7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCX0gZWxzZSB7Ci0JCUdFVF9FTkNSWV9BTEdPKHBzZWN1cml0eXByaXYsIHBzdGEsIHBhdHRyaWItPmVuY3J5cHQsIGJtY2FzdCk7Ci0KLQkJc3dpdGNoIChwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtKSB7Ci0JCWNhc2UgZG90MTFBdXRoQWxncnRobV9PcGVuOgotCQljYXNlIGRvdDExQXV0aEFsZ3J0aG1fU2hhcmVkOgotCQljYXNlIGRvdDExQXV0aEFsZ3J0aG1fQXV0bzoKLQkJCXBhdHRyaWItPmtleV9pZHggPQotCQkJCSh1OClwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lLZXlJbmRleDsKLQkJCWJyZWFrOwotCQljYXNlIGRvdDExQXV0aEFsZ3J0aG1fODAyMVg6Ci0JCQlpZiAoYm1jYXN0KQotCQkJCXBhdHRyaWItPmtleV9pZHggPQotCQkJCQkodTgpcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleWlkOwotCQkJZWxzZQotCQkJCXBhdHRyaWItPmtleV9pZHggPSAwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwYXR0cmliLT5rZXlfaWR4ID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0KLQl9Ci0KLQlzd2l0Y2ggKHBhdHRyaWItPmVuY3J5cHQpIHsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQlwYXR0cmliLT5pdl9sZW4gPSBJRUVFODAyMTFfV0VQX0lWX0xFTjsKLQkJcGF0dHJpYi0+aWN2X2xlbiA9IElFRUU4MDIxMV9XRVBfSUNWX0xFTjsKLQkJYnJlYWs7Ci0KLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCXBhdHRyaWItPml2X2xlbiA9IElFRUU4MDIxMV9US0lQX0lWX0xFTjsKLQkJcGF0dHJpYi0+aWN2X2xlbiA9IElFRUU4MDIxMV9US0lQX0lDVl9MRU47Ci0KLQkJaWYgKCFwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ1c2V0a2lwa2V5KSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAicGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSglZCkgPT0gZmFsc2UgZHJvcCBwYWNrZXRcbiIsCi0JCQkJIHBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnVzZXRraXBrZXkpOwotCQkJcmVzID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlicmVhazsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJwYXR0cmliLT5lbmNyeXB0ID0lZCAoV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUClcbiIsCi0JCQkgcGF0dHJpYi0+ZW5jcnlwdCk7Ci0JCXBhdHRyaWItPml2X2xlbiA9IElFRUU4MDIxMV9DQ01QX0hEUl9MRU47Ci0JCXBhdHRyaWItPmljdl9sZW4gPSBJRUVFODAyMTFfQ0NNUF9NSUNfTEVOOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXBhdHRyaWItPml2X2xlbiA9IDA7Ci0JCXBhdHRyaWItPmljdl9sZW4gPSAwOwotCQlicmVhazsKLQl9Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJICJ1cGRhdGVfYXR0cmliOiBlbmNyeXB0ID0lZFxuIiwgcGF0dHJpYi0+ZW5jcnlwdCk7Ci0KLQlpZiAocGF0dHJpYi0+ZW5jcnlwdCAmJiAhcHNlY3VyaXR5cHJpdi0+aHdfZGVjcnlwdGVkKSB7Ci0JCXBhdHRyaWItPmJzd2VuYyA9IHRydWU7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgInVwZGF0ZV9hdHRyaWI6IGVuY3J5cHQgPSVkIGJzd2VuYyA9IHRydWVcbiIsCi0JCQkgcGF0dHJpYi0+ZW5jcnlwdCk7Ci0JfSBlbHNlIHsKLQkJcGF0dHJpYi0+YnN3ZW5jID0gZmFsc2U7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJ1cGRhdGVfYXR0cmliOiBic3dlbmMgPSBmYWxzZVxuIik7Ci0JfQotCXVwZGF0ZV9hdHRyaWJfcGh5X2luZm8ocGF0dHJpYiwgcHN0YSk7Ci0KLWV4aXQ6Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50IHhtaXRmcmFtZV9hZGRtaWMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkgewotCXN0cnVjdCBtaWNfZGF0YSBtaWNkYXRhOwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhaW5mbzsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCWludCBjdXJmcmFnbnVtLCBsZW5ndGg7Ci0JdTggKnBmcmFtZSwgKnBheWxvYWQsIG1pY1s4XTsKLQl1OCBwcmlvcml0eVs0XT0gezB4MCwgMHgwLCAweDAsIDB4MH07Ci0JdTggaHdfaGRyX29mZnNldCA9IDA7Ci0JaW50IGJtY3N0ID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+cmEpOwotCi0JaWYgKHBhdHRyaWItPnBzdGEpIHsKLQkJc3RhaW5mbyA9IHBhdHRyaWItPnBzdGE7Ci0JfSBlbHNlIHsKLQkJREJHXzg3MjNBKCIlcywgY2FsbCBydHdfZ2V0X3N0YWluZm8yM2EoKVxuIiwgX19mdW5jX18pOwotCQlzdGFpbmZvID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwgJnBhdHRyaWItPnJhWzBdKTsKLQl9Ci0KLQlpZiAoIXN0YWluZm8pIHsKLQkJREJHXzg3MjNBKCIlcywgcHN0YSA9PSBOVUxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCWlmICghKHN0YWluZm8tPnN0YXRlICZfRldfTElOS0VEKSkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhLT5zdGF0ZSgweCV4KSAhPSBfRldfTElOS0VEXG4iLAotCQkJICBfX2Z1bmNfXywgc3RhaW5mby0+c3RhdGUpOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JaHdfaGRyX29mZnNldCA9IFRYREVTQ19PRkZTRVQ7Ci0KLQlpZiAocGF0dHJpYi0+ZW5jcnlwdCA9PSBXTEFOX0NJUEhFUl9TVUlURV9US0lQKSB7Ci0JCS8qIGVuY29kZSBtaWMgY29kZSAqLwotCQlpZiAoc3RhaW5mbykgewotCQkJdTggbnVsbF9rZXlbMTZdPXsweDAsIDB4MCwgMHgwLCAweDAsCi0JCQkJCSAweDAsIDB4MCwgMHgwLCAweDAsCi0JCQkJCSAweDAsIDB4MCwgMHgwLCAweDAsCi0JCQkJCSAweDAsIDB4MCwgMHgwLCAweDB9OwotCi0JCQlwZnJhbWUgPSBweG1pdGZyYW1lLT5idWZfYWRkciArIGh3X2hkcl9vZmZzZXQ7Ci0KLQkJCWlmIChibWNzdCkgewotCQkJCWlmICghbWVtY21wKHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnB0eG1pY2tleVtwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWRdLnNrZXksIG51bGxfa2V5LCAxNikpIHsKLQkJCQkJcmV0dXJuIF9GQUlMOwotCQkJCX0KLQkJCQkvKiBzdGFydCB0byBjYWxjdWxhdGUgdGhlIG1pYyBjb2RlICovCi0JCQkJcnR3X3NlY21pY3NldGtleTIzYSgmbWljZGF0YSwgcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycHR4bWlja2V5W3BzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZF0uc2tleSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghbWVtY21wKCZzdGFpbmZvLT5kb3QxMXRraXB0eG1pY2tleS5za2V5WzBdLAotCQkJCQkgICAgbnVsbF9rZXksIDE2KSkgewotCQkJCQlyZXR1cm4gX0ZBSUw7Ci0JCQkJfQotCQkJCS8qIHN0YXJ0IHRvIGNhbGN1bGF0ZSB0aGUgbWljIGNvZGUgKi8KLQkJCQlydHdfc2VjbWljc2V0a2V5MjNhKCZtaWNkYXRhLCAmc3RhaW5mby0+ZG90MTF0a2lwdHhtaWNrZXkuc2tleVswXSk7Ci0JCQl9Ci0KLQkJCWlmIChwZnJhbWVbMV0gJiAxKSB7ICAgLyogVG9EUyA9PSAxICovCi0JCQkJLyogREEgKi8KLQkJCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmcGZyYW1lWzE2XSwgNik7Ci0JCQkJaWYgKHBmcmFtZVsxXSAmIDIpICAvKiBGcm9tIERzID09IDEgKi8KLQkJCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwKLQkJCQkJCQkgJnBmcmFtZVsyNF0sIDYpOwotCQkJCWVsc2UKLQkJCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwKLQkJCQkJCQkgJnBmcmFtZVsxMF0sIDYpOwotCQkJfSBlbHNlIHsJLyogVG9EUyA9PSAwICovCi0JCQkJLyogREEgKi8KLQkJCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmcGZyYW1lWzRdLCA2KTsKLQkJCQlpZiAocGZyYW1lWzFdICYgMikgIC8qIEZyb20gRHMgPT0gMSAqLwotCQkJCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLAotCQkJCQkJCSAmcGZyYW1lWzE2XSwgNik7Ci0JCQkJZWxzZQotCQkJCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLAotCQkJCQkJCSAmcGZyYW1lWzEwXSwgNik7Ci0JCQl9Ci0KLQkJCS8qIGlmIChwbWxtZXByaXYtPnFvc19vcHRpb24gPT0gMSkgKi8KLQkJCWlmIChwYXR0cmliLT5xb3NfZW4pCi0JCQkJcHJpb3JpdHlbMF0gPSAodTgpcHhtaXRmcmFtZS0+YXR0cmliLnByaW9yaXR5OwotCi0JCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmcHJpb3JpdHlbMF0sIDQpOwotCi0JCQlwYXlsb2FkID0gcGZyYW1lOwotCi0JCQlmb3IgKGN1cmZyYWdudW0gPSAwOyBjdXJmcmFnbnVtIDwgcGF0dHJpYi0+bnJfZnJhZ3M7Ci0JCQkgICAgIGN1cmZyYWdudW0rKykgewotCQkJCXBheWxvYWQgPSBQVFJfQUxJR04ocGF5bG9hZCwgNCk7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkJICI9PT0gY3VyZnJhZ251bSA9JWQsIHBmcmFtZSA9IDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCEhIVxuIiwKLQkJCQkJIGN1cmZyYWdudW0sICpwYXlsb2FkLCAqKHBheWxvYWQgKyAxKSwKLQkJCQkJICoocGF5bG9hZCArIDIpLCAqKHBheWxvYWQgKyAzKSwKLQkJCQkJICoocGF5bG9hZCArIDQpLCAqKHBheWxvYWQgKyA1KSwKLQkJCQkJICoocGF5bG9hZCArIDYpLCAqKHBheWxvYWQgKyA3KSk7Ci0KLQkJCQlwYXlsb2FkID0gcGF5bG9hZCArIHBhdHRyaWItPmhkcmxlbiArCi0JCQkJCXBhdHRyaWItPml2X2xlbjsKLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJCQkgImN1cmZyYWdudW0gPSVkIHBhdHRyaWItPmhkcmxlbiA9JWQgcGF0dHJpYi0+aXZfbGVuID0lZFxuIiwKLQkJCQkJIGN1cmZyYWdudW0sCi0JCQkJCSBwYXR0cmliLT5oZHJsZW4sIHBhdHRyaWItPml2X2xlbik7Ci0JCQkJaWYgKChjdXJmcmFnbnVtICsgMSkgPT0gcGF0dHJpYi0+bnJfZnJhZ3MpIHsKLQkJCQkJbGVuZ3RoID0gcGF0dHJpYi0+bGFzdF90eGNtZHN6IC0KLQkJCQkJCXBhdHRyaWItPmhkcmxlbiAtCi0JCQkJCQlwYXR0cmliLT5pdl9sZW4gLQotCQkJCQkJKChwYXR0cmliLT5ic3dlbmMpID8KLQkJCQkJCSBwYXR0cmliLT5pY3ZfbGVuIDogMCk7Ci0JCQkJCXJ0d19zZWNtaWNhcHBlbmQyM2EoJm1pY2RhdGEsIHBheWxvYWQsCi0JCQkJCQkJIGxlbmd0aCk7Ci0JCQkJCXBheWxvYWQgPSBwYXlsb2FkICsgbGVuZ3RoOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxlbmd0aCA9IHB4bWl0cHJpdi0+ZnJhZ19sZW4gLQotCQkJCQkJcGF0dHJpYi0+aGRybGVuIC0KLQkJCQkJCXBhdHRyaWItPml2X2xlbiAtCi0JCQkJCQkoKHBhdHRyaWItPmJzd2VuYykgPwotCQkJCQkJIHBhdHRyaWItPmljdl9sZW4gOiAwKTsKLQkJCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgcGF5bG9hZCwKLQkJCQkJCQkgbGVuZ3RoKTsKLQkJCQkJcGF5bG9hZCA9IHBheWxvYWQgKyBsZW5ndGggKwotCQkJCQkJcGF0dHJpYi0+aWN2X2xlbjsKLQkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sCi0JCQkJCQkgX2Rydl9lcnJfLAotCQkJCQkJICJjdXJmcmFnbnVtID0lZCBsZW5ndGggPSVkIHBhdHRyaWItPmljdl9sZW4gPSVkXG4iLAotCQkJCQkJIGN1cmZyYWdudW0sIGxlbmd0aCwKLQkJCQkJCSBwYXR0cmliLT5pY3ZfbGVuKTsKLQkJCQl9Ci0JCQl9Ci0JCQlydHdfc2VjZ2V0bWljMjNhKCZtaWNkYXRhLCAmbWljWzBdKTsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJ4bWl0ZnJhbWVfYWRkbWljOiBiZWZvcmUgYWRkIG1pYyBjb2RlISFcbiIpOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgInhtaXRmcmFtZV9hZGRtaWM6IHBhdHRyaWItPmxhc3RfdHhjbWRzeiA9JWQhISFcbiIsCi0JCQkJIHBhdHRyaWItPmxhc3RfdHhjbWRzeik7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAieG1pdGZyYW1lX2FkZG1pYzogbWljWzBdPSAweCUuMnggLCBtaWNbMV09MHglLjJ4ICwgbWljWzJdPSAweCUuMnggLCBtaWNbM109IDB4JS4yeFxubWljWzRdPSAweCUuMnggLCBtaWNbNV09IDB4JS4yeCAsIG1pY1s2XT0gMHglLjJ4ICwgbWljWzddPSAweCUuMnggISEhIVxuIiwKLQkJCQkgbWljWzBdLCBtaWNbMV0sIG1pY1syXSwgbWljWzNdLAotCQkJCSBtaWNbNF0sIG1pY1s1XSwgbWljWzZdLCBtaWNbN10pOwotCQkJLyogYWRkIG1pYyBjb2RlICBhbmQgYWRkIHRoZSBtaWMgY29kZSBsZW5ndGgKLQkJCSAgIGluIGxhc3RfdHhjbWRzeiAqLwotCi0JCQltZW1jcHkocGF5bG9hZCwgJm1pY1swXSwgOCk7Ci0JCQlwYXR0cmliLT5sYXN0X3R4Y21kc3ogKz0gODsKLQotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJICI9PT09PT09PSBsYXN0IHBrdCA9PT09PT09PVxuIik7Ci0JCQlwYXlsb2FkID0gcGF5bG9hZCAtIHBhdHRyaWItPmxhc3RfdHhjbWRzeiArIDg7Ci0JCQlmb3IgKGN1cmZyYWdudW0gPSAwOyBjdXJmcmFnbnVtIDwgcGF0dHJpYi0+bGFzdF90eGNtZHN6OwotCQkJICAgICBjdXJmcmFnbnVtID0gY3VyZnJhZ251bSArIDgpIHsKLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkJICIlLjJ4LCAgJS4yeCwgICUuMngsICAlLjJ4LCAgJS4yeCwgICUuMngsICAlLjJ4LCAgJS4yeFxuIiwKLQkJCQkJICoocGF5bG9hZCArIGN1cmZyYWdudW0pLAotCQkJCQkgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDEpLAotCQkJCQkgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDIpLAotCQkJCQkgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDMpLAotCQkJCQkgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDQpLAotCQkJCQkgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDUpLAotCQkJCQkgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDYpLAotCQkJCQkgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDcpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJ4bWl0ZnJhbWVfYWRkbWljOiBydHdfZ2V0X3N0YWluZm8yM2EgPT1OVUxMISEhXG4iKTsKLQkJfQotCX0KLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCB4bWl0ZnJhbWVfc3dlbmNyeXB0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCi0JLyogaWYgKChwc2VjdXJpdHlwcml2LT5zd19lbmNyeXB0KXx8KHBhdHRyaWItPmJzd2VuYykpICovCi0JaWYgKHBhdHRyaWItPmJzd2VuYykgewotCQkvKiBEQkdfODcyM0EoInN0YXJ0IHhtaXRmcmFtZV9zd2VuY3J5cHRcbiIpOyAqLwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9hbGVydF8sCi0JCQkgIiMjIyB4bWl0ZnJhbWVfc3dlbmNyeXB0XG4iKTsKLQkJc3dpdGNoIChwYXR0cmliLT5lbmNyeXB0KSB7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQkJcnR3X3dlcF9lbmNyeXB0MjNhKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCQlydHdfdGtpcF9lbmNyeXB0MjNhKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCQlydHdfYWVzX2VuY3J5cHQyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkgIiMjIyB4bWl0ZnJhbWVfaHdlbmNyeXB0XG4iKTsKLQl9Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X21ha2Vfd2xhbmhkcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqaGRyLAotCQkJICAgIHN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWhkcjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIgKnFvc2hkcjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXU4IHFvc19vcHRpb24gPSBmYWxzZTsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0KLQlpbnQgYm1jc3QgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSk7Ci0KLQlpZiAocGF0dHJpYi0+cHN0YSkgewotCQlwc3RhID0gcGF0dHJpYi0+cHN0YTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzLCBjYWxsIHJ0d19nZXRfc3RhaW5mbzIzYSgpXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmIChibWNzdCkgewotCQkJcHN0YSA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LCBwYXR0cmliLT5yYSk7Ci0JCX0KLQl9Ci0KLQlpZiAocHN0YSA9PSBOVUxMKSB7Ci0JCURCR184NzIzQSgiJXMsIHBzdGEgPT0gTlVMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlpZiAoIShwc3RhLT5zdGF0ZSAmX0ZXX0xJTktFRCkpIHsKLQkJREJHXzg3MjNBKCIlcywgcHN0YS0+c3RhdGUoMHgleCkgIT0gX0ZXX0xJTktFRFxuIiwgX19mdW5jX18sIHBzdGEtPnN0YXRlKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCW1lbXNldChoZHIsIDAsIFdMQU5IRFJfT0ZGU0VUKTsKLQotCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYocGF0dHJpYi0+dHlwZSk7Ci0KLQlpZiAocGF0dHJpYi0+dHlwZSAmIElFRUU4MDIxMV9GVFlQRV9EQVRBKSB7Ci0JCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgIFdJRklfU1RBVElPTl9TVEFURSkpIHsKLQkJCS8qIHRvX2RzID0gMSwgZnJfZHMgPSAwOyAqLwotCQkJLyogRGF0YSB0cmFuc2ZlciB0byBBUCAqLwotCQkJcHdsYW5oZHItPmZyYW1lX2NvbnRyb2wgfD0KLQkJCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9UT0RTKTsKLQkJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIGdldF9ic3NpZChwbWxtZXByaXYpKTsKLQkJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIHBhdHRyaWItPnNyYyk7Ci0JCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBwYXR0cmliLT5kc3QpOwotCi0JCQlpZiAocG1sbWVwcml2LT5xb3Nfb3B0aW9uKQotCQkJCXFvc19vcHRpb24gPSB0cnVlOwotCi0JCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsICBXSUZJX0FQX1NUQVRFKSkgewotCQkJLyogdG9fZHMgPSAwLCBmcl9kcyA9IDE7ICovCi0JCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PQotCQkJCWNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX0ZST01EUyk7Ci0JCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBwYXR0cmliLT5kc3QpOwotCQkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgZ2V0X2Jzc2lkKHBtbG1lcHJpdikpOwotCQkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgcGF0dHJpYi0+c3JjKTsKLQotCQkJaWYgKHBzdGEtPnFvc19vcHRpb24pCi0JCQkJcW9zX29wdGlvbiA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpIHx8Ci0JCQkgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7Ci0JCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBwYXR0cmliLT5kc3QpOwotCQkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgcGF0dHJpYi0+c3JjKTsKLQkJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIGdldF9ic3NpZChwbWxtZXByaXYpKTsKLQotCQkJaWYgKHBzdGEtPnFvc19vcHRpb24pCi0JCQkJcW9zX29wdGlvbiA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAiZndfc3RhdGU6JXggaXMgbm90IGFsbG93ZWQgdG8geG1pdCBmcmFtZVxuIiwKLQkJCQkgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQlpZiAocGF0dHJpYi0+bWRhdGEpCi0JCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PQotCQkJCWNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBKTsKLQkJaWYgKHBhdHRyaWItPmVuY3J5cHQpCi0JCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PQotCQkJCWNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCk7Ci0JCWlmIChxb3Nfb3B0aW9uKSB7Ci0JCQlxb3NoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyICopaGRyOwotCi0JCQlxb3NoZHItPnFvc19jdHJsID0gY3B1X3RvX2xlMTYoCi0JCQkJcGF0dHJpYi0+cHJpb3JpdHkgJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSyk7Ci0KLQkJCXFvc2hkci0+cW9zX2N0cmwgfD0gY3B1X3RvX2xlMTYoCi0JCQkJKHBhdHRyaWItPmFja19wb2xpY3kgPDwgNSkgJgotCQkJCUlFRUU4MDIxMV9RT1NfQ1RMX0FDS19QT0xJQ1lfTUFTSyk7Ci0KLQkJCWlmIChwYXR0cmliLT5lb3NwKQotCQkJCXFvc2hkci0+cW9zX2N0cmwgfD0KLQkJCQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX1FPU19DVExfRU9TUCk7Ci0JCX0KLQkJLyogVE9ETzogZmlsbCBIVCBDb250cm9sIEZpZWxkICovCi0KLQkJLyogVXBkYXRlIFNlcSBOdW0gd2lsbCBiZSBoYW5kbGVkIGJ5IGYvdyAqLwotCQlpZiAocHN0YSkgewotCQkJcHN0YS0+c3RhX3htaXRwcml2LnR4c2VxX3RpZFtwYXR0cmliLT5wcmlvcml0eV0rKzsKLQkJCXBzdGEtPnN0YV94bWl0cHJpdi50eHNlcV90aWRbcGF0dHJpYi0+cHJpb3JpdHldICY9IDB4RkZGOwotCQkJcGF0dHJpYi0+c2VxbnVtID0gcHN0YS0+c3RhX3htaXRwcml2LnR4c2VxX3RpZFtwYXR0cmliLT5wcmlvcml0eV07Ci0JCQkvKiBXZSBkb250IG5lZWQgdG8gd29ycnkgYWJvdXQgZnJhZyBiaXRzIGhlcmUgKi8KLQkJCXB3bGFuaGRyLT5zZXFfY3RybCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TTl9UT19TRVEoCi0JCQkJCQkJICAgICAgcGF0dHJpYi0+c2VxbnVtKSk7Ci0JCQkvKiBjaGVjayBpZiBlbmFibGUgYW1wZHUgKi8KLQkJCWlmIChwYXR0cmliLT5odF9lbiAmJiBwc3RhLT5odHByaXYuYW1wZHVfZW5hYmxlKSB7Ci0JCQkJaWYgKHBhdHRyaWItPnByaW9yaXR5ID49IDE2KQotCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSW52YWxpZCAiCi0JCQkJCSAgICAgICAicGF0dHJpYi0+cHJpb3JpdHkgJWlcbiIsCi0JCQkJCSAgICAgICBfX2Z1bmNfXywgcGF0dHJpYi0+cHJpb3JpdHkpOwotCQkJCWlmIChwc3RhLT5odHByaXYuYWdnX2VuYWJsZV9iaXRtYXAgJgotCQkJCSAgICBCSVQocGF0dHJpYi0+cHJpb3JpdHkpKQotCQkJCQlwYXR0cmliLT5hbXBkdV9lbiA9IHRydWU7Ci0JCQl9Ci0JCQkvKiByZS1jaGVjayBpZiBlbmFibGUgYW1wZHUgYnkgQkFfc3RhcnRpbmdfc2VxY3RybCAqLwotCQkJaWYgKHBhdHRyaWItPmFtcGR1X2VuKSB7Ci0JCQkJdTE2IHR4X3NlcTsKLQotCQkJCXR4X3NlcSA9IHBzdGEtPkJBX3N0YXJ0aW5nX3NlcWN0cmxbcGF0dHJpYi0+cHJpb3JpdHkgJiAweDBmXTsKLQotCQkJCS8qIGNoZWNrIEJBX3N0YXJ0aW5nX3NlcWN0cmwgKi8KLQkJCQlpZiAoU05fTEVTUyhwYXR0cmliLT5zZXFudW0sIHR4X3NlcSkpIHsKLQkJCQkJLyogREJHXzg3MjNBKCJ0eCBhbXBkdSBzZXFudW0oJWQpIDwgdHhfc2VxKCVkKVxuIiwgcGF0dHJpYi0+c2VxbnVtLCB0eF9zZXEpOyAqLwotCQkJCQlwYXR0cmliLT5hbXBkdV9lbiA9IGZhbHNlOy8qIEFHRyBCSyAqLwotCQkJCX0gZWxzZSBpZiAoU05fRVFVQUwocGF0dHJpYi0+c2VxbnVtLCB0eF9zZXEpKSB7Ci0JCQkJCXBzdGEtPkJBX3N0YXJ0aW5nX3NlcWN0cmxbcGF0dHJpYi0+cHJpb3JpdHkgJiAweDBmXSA9ICh0eF9zZXErMSkmMHhmZmY7Ci0JCQkJCXBhdHRyaWItPmFtcGR1X2VuID0gdHJ1ZTsvKiBBR0cgRU4gKi8KLQkJCQl9IGVsc2UgewotCQkJCQkvKiBEQkdfODcyM0EoInR4IGFtcGR1IG92ZXIgcnVuXG4iKTsgKi8KLQkJCQkJcHN0YS0+QkFfc3RhcnRpbmdfc2VxY3RybFtwYXR0cmliLT5wcmlvcml0eSAmIDB4MGZdID0gKHBhdHRyaWItPnNlcW51bSsxKSYweGZmZjsKLQkJCQkJcGF0dHJpYi0+YW1wZHVfZW4gPSB0cnVlOy8qIEFHRyBFTiAqLwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLWV4aXQ6Ci0JcmV0dXJuIHJlczsKLX0KLQotczMyIHJ0d190eGZyYW1lc19wZW5kaW5nMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCXJldHVybiAoIWxpc3RfZW1wdHkoJnB4bWl0cHJpdi0+YmVfcGVuZGluZy5xdWV1ZSkpIHx8Ci0JCSghbGlzdF9lbXB0eSgmcHhtaXRwcml2LT5ia19wZW5kaW5nLnF1ZXVlKSkgfHwKLQkJKCFsaXN0X2VtcHR5KCZweG1pdHByaXYtPnZpX3BlbmRpbmcucXVldWUpKSB8fAotCQkoIWxpc3RfZW1wdHkoJnB4bWl0cHJpdi0+dm9fcGVuZGluZy5xdWV1ZSkpOwotfQotCi1zMzIgcnR3X3R4ZnJhbWVzX3N0YV9hY19wZW5kaW5nMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXN0cnVjdCB0eF9zZXJ2cSAqcHR4c2VydnE7Ci0JaW50IHByaW9yaXR5ID0gcGF0dHJpYi0+cHJpb3JpdHk7Ci0KLQlpZiAocGF0dHJpYi0+cHN0YSkgewotCQlwc3RhID0gcGF0dHJpYi0+cHN0YTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzLCBjYWxsIHJ0d19nZXRfc3RhaW5mbzIzYSgpXG4iLCBfX2Z1bmNfXyk7Ci0JCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LCAmcGF0dHJpYi0+cmFbMF0pOwotCX0KLQlpZiAocHN0YSA9PSBOVUxMKSB7Ci0JCURCR184NzIzQSgiJXMsIHBzdGEgPT0gTlVMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoIShwc3RhLT5zdGF0ZSAmX0ZXX0xJTktFRCkpIHsKLQkJREJHXzg3MjNBKCIlcywgcHN0YS0+c3RhdGUoMHgleCkgIT0gX0ZXX0xJTktFRFxuIiwgX19mdW5jX18sCi0JCQkgIHBzdGEtPnN0YXRlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXN3aXRjaCAocHJpb3JpdHkpIHsKLQljYXNlIDE6Ci0JY2FzZSAyOgotCQlwdHhzZXJ2cSA9ICZwc3RhLT5zdGFfeG1pdHByaXYuYmtfcTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCWNhc2UgNToKLQkJcHR4c2VydnEgPSAmcHN0YS0+c3RhX3htaXRwcml2LnZpX3E7Ci0JCWJyZWFrOwotCWNhc2UgNjoKLQljYXNlIDc6Ci0JCXB0eHNlcnZxID0gJnBzdGEtPnN0YV94bWl0cHJpdi52b19xOwotCQlicmVhazsKLQljYXNlIDA6Ci0JY2FzZSAzOgotCWRlZmF1bHQ6Ci0JCXB0eHNlcnZxID0gJnBzdGEtPnN0YV94bWl0cHJpdi5iZV9xOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHB0eHNlcnZxLT5xY250OwotfQotCi0vKiBMb2dpY2FsIExpbmsgQ29udHJvbChMTEMpIFN1Yk5ldHdvcmsgQXR0YWNobWVudCBQb2ludChTTkFQKSBoZWFkZXIKLSAqIElFRUUgTExDL1NOQVAgaGVhZGVyIGNvbnRhaW5zIDggb2N0ZXRzCi0gKiBGaXJzdCAzIG9jdGV0cyBjb21wcmlzZSB0aGUgTExDIHBvcnRpb24KLSAqIFNOQVAgcG9ydGlvbiwgNSBvY3RldHMsIGlzIGRpdmlkZWQgaW50byB0d28gZmllbGRzOgotICoJT3JnYW5pemF0aW9uYWxseSBVbmlxdWUgSWRlbnRpZmllcihPVUkpLCAzIG9jdGV0cywKLSAqCXR5cGUsIGRlZmluZWQgYnkgdGhhdCBvcmdhbml6YXRpb24sIDIgb2N0ZXRzLgotICovCi1zdGF0aWMgaW50IHJ0d19wdXRfc25hcCh1OCAqZGF0YSwgdTE2IGhfcHJvdG8pCi17Ci0JaWYgKGhfcHJvdG8gPT0gRVRIX1BfSVBYIHx8IGhfcHJvdG8gPT0gRVRIX1BfQUFSUCkKLQkJZXRoZXJfYWRkcl9jb3B5KGRhdGEsIGJyaWRnZV90dW5uZWxfaGVhZGVyKTsKLQllbHNlCi0JCWV0aGVyX2FkZHJfY29weShkYXRhLCByZmMxMDQyX2hlYWRlcik7Ci0KLQlkYXRhICs9IEVUSF9BTEVOOwotCXB1dF91bmFsaWduZWRfYmUxNihoX3Byb3RvLCBkYXRhKTsKLQlyZXR1cm4gRVRIX0FMRU4gKyBzaXplb2YodTE2KTsKLX0KLQotLyoKLQotVGhpcyBzdWItcm91dGluZSB3aWxsIHBlcmZvcm0gYWxsIHRoZSBmb2xsb3dpbmc6Ci0KLTEuIHJlbW92ZSA4MDIuMyBoZWFkZXIuCi0yLiBjcmVhdGUgd2xhbl9oZWFkZXIsIGJhc2VkIG9uIHRoZSBpbmZvIGluIHB4bWl0ZnJhbWUKLTMuIGFwcGVuZCBzdGEncyBpdi9leHQtaXYKLTQuIGFwcGVuZCBMTEMKLTUuIG1vdmUgZnJhZyBjaHVuayBmcm9tIHBmcmFtZSB0byBweG1pdGZyYW1lLT5tZW0KLTYuIGFwcGx5IHN3LWVuY3J5cHQsIGlmIG5lY2Vzc2FyeS4KLQotKi8KLWludCBydHdfeG1pdGZyYW1lX2NvYWxlc2NlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKLQlzMzIgZnJnX2lueCwgZnJnX2xlbiwgbXBkdV9sZW4sIGxsY19zeiwgbWVtX3N6OwotCXU4ICpwZnJhbWUsICptZW1fc3RhcnQ7Ci0JdTggaHdfaGRyX29mZnNldDsKLQl1OCAqcGJ1Zl9zdGFydDsKLQl1OCAqcGRhdGEgPSBza2ItPmRhdGE7Ci0JaW50IGRhdGFfbGVuID0gc2tiLT5sZW47Ci0JczMyIGJtY3N0ID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+cmEpOwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCWlmIChwYXR0cmliLT5wc3RhKQotCQlwc3RhID0gcGF0dHJpYi0+cHN0YTsKLQllbHNlIHsKLQkJREJHXzg3MjNBKCIlcywgY2FsbCBydHdfZ2V0X3N0YWluZm8yM2EoKVxuIiwgX19mdW5jX18pOwotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwgcGF0dHJpYi0+cmEpOwotCX0KLQotCWlmICghcHN0YSkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhID09IE5VTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JaWYgKCEocHN0YS0+c3RhdGUgJl9GV19MSU5LRUQpKSB7Ci0JCURCR184NzIzQSgiJXMsIHBzdGEtPnN0YXRlKDB4JXgpICE9IF9GV19MSU5LRURcbiIsCi0JCQkgIF9fZnVuY19fLCBwc3RhLT5zdGF0ZSk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlpZiAoIXB4bWl0ZnJhbWUtPmJ1Zl9hZGRyKSB7Ci0JCURCR184NzIzQSgiPT0+ICVzIGJ1Zl9hZGRyID09IE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCXBidWZfc3RhcnQgPSBweG1pdGZyYW1lLT5idWZfYWRkcjsKLQotCWh3X2hkcl9vZmZzZXQgPSBUWERFU0NfT0ZGU0VUOwotCi0JbWVtX3N0YXJ0ID0gcGJ1Zl9zdGFydCArIGh3X2hkcl9vZmZzZXQ7Ci0KLQlpZiAocnR3X21ha2Vfd2xhbmhkcihwYWRhcHRlciwgbWVtX3N0YXJ0LCBwYXR0cmliKSA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJICIlczogcnR3X21ha2Vfd2xhbmhkciBmYWlsOyBkcm9wIHBrdFxuIiwgX19mdW5jX18pOwotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBkYXRhICs9IHBhdHRyaWItPnBrdF9oZHJsZW47Ci0JZGF0YV9sZW4gLT0gcGF0dHJpYi0+cGt0X2hkcmxlbjsKLQotCWZyZ19pbnggPSAwOwotCWZyZ19sZW4gPSBweG1pdHByaXYtPmZyYWdfbGVuIC0gNDsvKiAyMzQ2LTQgPSAyMzQyICovCi0KLQl3aGlsZSAoMSkgewotCQlsbGNfc3ogPSAwOwotCi0JCW1wZHVfbGVuID0gZnJnX2xlbjsKLQotCQlwZnJhbWUgPSBtZW1fc3RhcnQ7Ci0JCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKW1lbV9zdGFydDsKLQotCQlwZnJhbWUgKz0gcGF0dHJpYi0+aGRybGVuOwotCQltcGR1X2xlbiAtPSBwYXR0cmliLT5oZHJsZW47Ci0KLQkJLyogYWRkaW5nIGljdiwgaWYgbmVjZXNzYXJ5Li4uICovCi0JCWlmIChwYXR0cmliLT5pdl9sZW4pIHsKLQkJCWlmIChwc3RhKSB7Ci0JCQkJc3dpdGNoIChwYXR0cmliLT5lbmNyeXB0KSB7Ci0JCQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKLQkJCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJCQkJV0VQX0lWKHBhdHRyaWItPml2LCBwc3RhLT5kb3QxMXR4cG4sCi0JCQkJCSAgICAgICBwYXR0cmliLT5rZXlfaWR4KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQkJCQlpZiAoYm1jc3QpCi0JCQkJCQlUS0lQX0lWKHBhdHRyaWItPml2LAotCQkJCQkJCXBzdGEtPmRvdDExdHhwbiwKLQkJCQkJCQlwYXR0cmliLT5rZXlfaWR4KTsKLQkJCQkJZWxzZQotCQkJCQkJVEtJUF9JVihwYXR0cmliLT5pdiwKLQkJCQkJCQlwc3RhLT5kb3QxMXR4cG4sIDApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCQkJCWlmIChibWNzdCkKLQkJCQkJCUFFU19JVihwYXR0cmliLT5pdiwKLQkJCQkJCSAgICAgICBwc3RhLT5kb3QxMXR4cG4sCi0JCQkJCQkgICAgICAgcGF0dHJpYi0+a2V5X2lkeCk7Ci0JCQkJCWVsc2UKLQkJCQkJCUFFU19JVihwYXR0cmliLT5pdiwKLQkJCQkJCSAgICAgICBwc3RhLT5kb3QxMXR4cG4sIDApOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCW1lbWNweShwZnJhbWUsIHBhdHRyaWItPml2LCBwYXR0cmliLT5pdl9sZW4pOwotCi0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9ub3RpY2VfLAotCQkJCSAicnR3X3htaWFmcmFtZV9jb2FsZXNjZTIzYToga2V5aWQgPSVkIHBhdHRyaWItPml2WzNdPSUuMnggcGZyYW1lID0lLjJ4ICUuMnggJS4yeCAlLjJ4XG4iLAotCQkJCSBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUtleUluZGV4LAotCQkJCSBwYXR0cmliLT5pdlszXSwgKnBmcmFtZSwgKihwZnJhbWUrMSksCi0JCQkJICoocGZyYW1lKzIpLCAqKHBmcmFtZSszKSk7Ci0JCQlwZnJhbWUgKz0gcGF0dHJpYi0+aXZfbGVuOwotCQkJbXBkdV9sZW4gLT0gcGF0dHJpYi0+aXZfbGVuOwotCQl9Ci0JCWlmIChmcmdfaW54ID09IDApIHsKLQkJCWxsY19zeiA9IHJ0d19wdXRfc25hcChwZnJhbWUsIHBhdHRyaWItPmV0aGVyX3R5cGUpOwotCQkJcGZyYW1lICs9IGxsY19zejsKLQkJCW1wZHVfbGVuIC09IGxsY19zejsKLQkJfQotCi0JCWlmIChwYXR0cmliLT5pY3ZfbGVuID4gMCAmJiBwYXR0cmliLT5ic3dlbmMpCi0JCQltcGR1X2xlbiAtPSBwYXR0cmliLT5pY3ZfbGVuOwotCi0JCWlmIChibWNzdCkKLQkJCS8qICBkb24ndCBkbyBmcmFnbWVudCB0byBicm9hZGNhc3QvbXVsdGljYXN0IHBhY2tldHMgKi8KLQkJCW1lbV9zeiA9IG1pbl90KHMzMiwgZGF0YV9sZW4sIHBhdHRyaWItPnBrdGxlbik7Ci0JCWVsc2UKLQkJCW1lbV9zeiA9IG1pbl90KHMzMiwgZGF0YV9sZW4sIG1wZHVfbGVuKTsKLQotCQltZW1jcHkocGZyYW1lLCBwZGF0YSwgbWVtX3N6KTsKLQotCQlwZnJhbWUgKz0gbWVtX3N6OwotCQlwZGF0YSArPSBtZW1fc3o7Ci0JCWRhdGFfbGVuIC09IG1lbV9zejsKLQotCQlpZiAoKHBhdHRyaWItPmljdl9sZW4gPjApICYmIChwYXR0cmliLT5ic3dlbmMpKSB7Ci0JCQltZW1jcHkocGZyYW1lLCBwYXR0cmliLT5pY3YsIHBhdHRyaWItPmljdl9sZW4pOwotCQkJcGZyYW1lICs9IHBhdHRyaWItPmljdl9sZW47Ci0JCX0KLQotCQlmcmdfaW54Kys7Ci0KLQkJaWYgKGJtY3N0IHx8IGRhdGFfbGVuIDw9IDApIHsKLQkJCXBhdHRyaWItPm5yX2ZyYWdzID0gZnJnX2lueDsKLQotCQkJcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+aGRybGVuICsKLQkJCQkJCXBhdHRyaWItPml2X2xlbiArCi0JCQkJCQkoKHBhdHRyaWItPm5yX2ZyYWdzID09IDEpID8KLQkJCQkJCWxsY19zeiA6IDApICsKLQkJCQkJCSgocGF0dHJpYi0+YnN3ZW5jKSA/Ci0JCQkJCQlwYXR0cmliLT5pY3ZfbGVuIDogMCkgKyBtZW1fc3o7Ci0JCQloZHItPmZyYW1lX2NvbnRyb2wgJj0KLQkJCQl+Y3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKTsKLQotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAiJXM6IFRoZXJlJ3JlIHN0aWxsIHNvbWV0aGluZyBpbiBwYWNrZXQhXG4iLAotCQkJCSBfX2Z1bmNfXyk7Ci0JCX0KLQkJaGRyLT5mcmFtZV9jb250cm9sIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUyk7Ci0KLQkJbWVtX3N0YXJ0ID0gUFRSX0FMSUdOKHBmcmFtZSwgNCkgKyBod19oZHJfb2Zmc2V0OwotCQltZW1jcHkobWVtX3N0YXJ0LCBwYnVmX3N0YXJ0ICsgaHdfaGRyX29mZnNldCwgcGF0dHJpYi0+aGRybGVuKTsKLQl9Ci0KLQlpZiAoeG1pdGZyYW1lX2FkZG1pYyhwYWRhcHRlciwgcHhtaXRmcmFtZSkgPT0gX0ZBSUwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCSAieG1pdGZyYW1lX2FkZG1pYyhwYWRhcHRlciwgcHhtaXRmcmFtZSkgPT0gX0ZBSUxcbiIpOwotCQlEQkdfODcyM0EoInhtaXRmcmFtZV9hZGRtaWMocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpID09IF9GQUlMXG4iKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQl4bWl0ZnJhbWVfc3dlbmNyeXB0KHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKLQotCWlmIChibWNzdCA9PSBmYWxzZSkKLQkJdXBkYXRlX2F0dHJpYl92Y3NfaW5mbyhwYWRhcHRlciwgcHhtaXRmcmFtZSk7Ci0JZWxzZQotCQlwYXR0cmliLT52Y3NfbW9kZSA9IE5PTkVfVkNTOwotCi1leGl0OgotCXJldHVybiByZXM7Ci19Ci0KLXZvaWQgcnR3X3VwZGF0ZV9wcm90ZWN0aW9uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICppZSwgdWludCBpZV9sZW4pCi17Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXVpbnQgcHJvdGVjdGlvbjsKLQljb25zdCB1OCAqcDsKLQotCXN3aXRjaCAocHJlZ2lzdHJ5cHJpdi0+dnJ0bF9jYXJyaWVyX3NlbnNlKSB7Ci0JY2FzZSBESVNBQkxFX1ZDUzoKLQkJcHhtaXRwcml2LT52Y3MgPSBOT05FX1ZDUzsKLQkJYnJlYWs7Ci0JY2FzZSBFTkFCTEVfVkNTOgotCQlicmVhazsKLQljYXNlIEFVVE9fVkNTOgotCWRlZmF1bHQ6Ci0JCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0VSUF9JTkZPLCBpZSwgaWVfbGVuKTsKLQkJaWYgKCFwKQotCQkJcHhtaXRwcml2LT52Y3MgPSBOT05FX1ZDUzsKLQkJZWxzZSB7Ci0JCQlwcm90ZWN0aW9uID0gKCoocCArIDIpKSAmIEJJVCgxKTsKLQkJCWlmIChwcm90ZWN0aW9uKSB7Ci0JCQkJaWYgKHByZWdpc3RyeXByaXYtPnZjc190eXBlID09IFJUU19DVFMpCi0JCQkJCXB4bWl0cHJpdi0+dmNzID0gUlRTX0NUUzsKLQkJCQllbHNlCi0JCQkJCXB4bWl0cHJpdi0+dmNzID0gQ1RTX1RPX1NFTEY7Ci0JCQl9IGVsc2UgewotCQkJCXB4bWl0cHJpdi0+dmNzID0gTk9ORV9WQ1M7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotfQotCi12b2lkIHJ0d19jb3VudF90eF9zdGF0czIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSwgaW50IHN6KQotewotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7Ci0Jc3RydWN0IHN0YWluZm9fc3RhdHMgKnBzdGF0cyA9IE5VTEw7Ci0Jc3RydWN0IHhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2CSpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0JaWYgKHB4bWl0ZnJhbWUtPmZyYW1lX3RhZyA9PSBEQVRBX0ZSQU1FVEFHKSB7Ci0JCXB4bWl0cHJpdi0+dHhfYnl0ZXMgKz0gc3o7Ci0JCXBtbG1lcHJpdi0+TGlua0RldGVjdEluZm8uTnVtVHhPa0luUGVyaW9kKys7Ci0KLQkJcHN0YSA9IHB4bWl0ZnJhbWUtPmF0dHJpYi5wc3RhOwotCQlpZiAocHN0YSkgewotCQkJcHN0YXRzID0gJnBzdGEtPnN0YV9zdGF0czsKLQkJCXBzdGF0cy0+dHhfcGt0cysrOwotCQkJcHN0YXRzLT50eF9ieXRlcyArPSBzejsKLQkJfQotCX0KLX0KLQotc3RydWN0IHhtaXRfYnVmICpydHdfYWxsb2NfeG1pdGJ1ZjIzYV9leHQoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KQotewotCXVuc2lnbmVkIGxvbmcgaXJxTDsKLQlzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmID0gIE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqcGZyZWVfcXVldWUgPSAmcHhtaXRwcml2LT5mcmVlX3htaXRfZXh0YnVmX3F1ZXVlOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBmcmVlX3F1ZXVlLT5sb2NrLCBpcnFMKTsKLQotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJlZV9xdWV1ZSk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkocGhlYWQpKSB7Ci0JCXB4bWl0YnVmID0gbGlzdF9maXJzdF9lbnRyeShwaGVhZCwgc3RydWN0IHhtaXRfYnVmLCBsaXN0KTsKLQotCQlsaXN0X2RlbF9pbml0KCZweG1pdGJ1Zi0+bGlzdCk7Ci0KLQkJcHhtaXRwcml2LT5mcmVlX3htaXRfZXh0YnVmX2NudC0tOwotCQlweG1pdGJ1Zi0+cHJpdl9kYXRhID0gTlVMTDsKLQkJcHhtaXRidWYtPmV4dF90YWcgPSB0cnVlOwotCi0JCWlmIChweG1pdGJ1Zi0+c2N0eCkgewotCQkJREJHXzg3MjNBKCIlcyBweG1pdGJ1Zi0+c2N0eCBpcyBub3QgTlVMTFxuIiwgX19mdW5jX18pOwotCQkJcnR3MjNhX3NjdHhfZG9uZV9lcnIoJnB4bWl0YnVmLT5zY3R4LCBSVFdfU0NUWF9ET05FX0JVRl9BTExPQyk7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZnJlZV9xdWV1ZS0+bG9jaywgaXJxTCk7Ci0KLQlyZXR1cm4gcHhtaXRidWY7Ci19Ci0KLWludCBydHdfZnJlZV94bWl0YnVmX2V4dDIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsCi0JCQkgICAgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZikKLXsKLQl1bnNpZ25lZCBsb25nIGlycUw7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqcGZyZWVfcXVldWUgPSAmcHhtaXRwcml2LT5mcmVlX3htaXRfZXh0YnVmX3F1ZXVlOwotCi0JaWYgKHB4bWl0YnVmID09IE5VTEwpCi0JCXJldHVybiBfRkFJTDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwZnJlZV9xdWV1ZS0+bG9jaywgaXJxTCk7Ci0KLQlsaXN0X2RlbF9pbml0KCZweG1pdGJ1Zi0+bGlzdCk7Ci0KLQlsaXN0X2FkZF90YWlsKCZweG1pdGJ1Zi0+bGlzdCwgZ2V0X2xpc3RfaGVhZChwZnJlZV9xdWV1ZSkpOwotCXB4bWl0cHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9jbnQrKzsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmcmVlX3F1ZXVlLT5sb2NrLCBpcnFMKTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RydWN0IHhtaXRfYnVmICpydHdfYWxsb2NfeG1pdGJ1ZjIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBpcnFMOwotCXN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYgPSAgTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpwZnJlZV94bWl0YnVmX3F1ZXVlID0gJnB4bWl0cHJpdi0+ZnJlZV94bWl0YnVmX3F1ZXVlOwotCi0JLyogREJHXzg3MjNBKCIrcnR3X2FsbG9jX3htaXRidWYyM2FcbiIpOyAqLwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBmcmVlX3htaXRidWZfcXVldWUtPmxvY2ssIGlycUwpOwotCi0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBmcmVlX3htaXRidWZfcXVldWUpOwotCi0JaWYgKCFsaXN0X2VtcHR5KHBoZWFkKSkgewotCQlweG1pdGJ1ZiA9IGxpc3RfZmlyc3RfZW50cnkocGhlYWQsIHN0cnVjdCB4bWl0X2J1ZiwgbGlzdCk7Ci0KLQkJbGlzdF9kZWxfaW5pdCgmcHhtaXRidWYtPmxpc3QpOwotCi0JCXB4bWl0cHJpdi0+ZnJlZV94bWl0YnVmX2NudC0tOwotCQlweG1pdGJ1Zi0+cHJpdl9kYXRhID0gTlVMTDsKLQkJcHhtaXRidWYtPmV4dF90YWcgPSBmYWxzZTsKLQkJcHhtaXRidWYtPmZsYWdzID0gWE1JVF9WT19RVUVVRTsKLQotCQlpZiAocHhtaXRidWYtPnNjdHgpIHsKLQkJCURCR184NzIzQSgiJXMgcHhtaXRidWYtPnNjdHggaXMgbm90IE5VTExcbiIsIF9fZnVuY19fKTsKLQkJCXJ0dzIzYV9zY3R4X2RvbmVfZXJyKCZweG1pdGJ1Zi0+c2N0eCwgUlRXX1NDVFhfRE9ORV9CVUZfQUxMT0MpOwotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZyZWVfeG1pdGJ1Zl9xdWV1ZS0+bG9jaywgaXJxTCk7Ci0KLQlyZXR1cm4gcHhtaXRidWY7Ci19Ci0KLWludCBydHdfZnJlZV94bWl0YnVmMjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZikKLXsKLQl1bnNpZ25lZCBsb25nIGlycUw7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqcGZyZWVfeG1pdGJ1Zl9xdWV1ZSA9ICZweG1pdHByaXYtPmZyZWVfeG1pdGJ1Zl9xdWV1ZTsKLQotCS8qIERCR184NzIzQSgiK3J0d19mcmVlX3htaXRidWYyM2FcbiIpOyAqLwotCi0JaWYgKHB4bWl0YnVmID09IE5VTEwpCi0JCXJldHVybiBfRkFJTDsKLQotCWlmIChweG1pdGJ1Zi0+c2N0eCkgewotCQlEQkdfODcyM0EoIiVzIHB4bWl0YnVmLT5zY3R4IGlzIG5vdCBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJ0dzIzYV9zY3R4X2RvbmVfZXJyKCZweG1pdGJ1Zi0+c2N0eCwgUlRXX1NDVFhfRE9ORV9CVUZfRlJFRSk7Ci0JfQotCi0JaWYgKHB4bWl0YnVmLT5leHRfdGFnKSB7Ci0JCXJ0d19mcmVlX3htaXRidWZfZXh0MjNhKHB4bWl0cHJpdiwgcHhtaXRidWYpOwotCX0gZWxzZSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwZnJlZV94bWl0YnVmX3F1ZXVlLT5sb2NrLCBpcnFMKTsKLQotCQlsaXN0X2RlbF9pbml0KCZweG1pdGJ1Zi0+bGlzdCk7Ci0KLQkJbGlzdF9hZGRfdGFpbCgmcHhtaXRidWYtPmxpc3QsCi0JCQkgICAgICBnZXRfbGlzdF9oZWFkKHBmcmVlX3htaXRidWZfcXVldWUpKTsKLQotCQlweG1pdHByaXYtPmZyZWVfeG1pdGJ1Zl9jbnQrKzsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZyZWVfeG1pdGJ1Zl9xdWV1ZS0+bG9jaywgaXJxTCk7Ci0JfQotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZCBydHdfaW5pdF94bWl0ZnJhbWUoc3RydWN0IHhtaXRfZnJhbWUgKnB4ZnJhbWUpCi17Ci0JaWYgKHB4ZnJhbWUgIT0gIE5VTEwpIHsKLQkJLyogZGVmYXVsdCB2YWx1ZSBzZXR0aW5nICovCi0JCXB4ZnJhbWUtPmJ1Zl9hZGRyID0gTlVMTDsKLQkJcHhmcmFtZS0+cHhtaXRidWYgPSBOVUxMOwotCi0JCW1lbXNldCgmcHhmcmFtZS0+YXR0cmliLCAwLCBzaXplb2Yoc3RydWN0IHBrdF9hdHRyaWIpKTsKLQkJLyogcHhmcmFtZS0+YXR0cmliLnBzdGEgPSBOVUxMOyAqLwotCi0JCXB4ZnJhbWUtPmZyYW1lX3RhZyA9IERBVEFfRlJBTUVUQUc7Ci0KLQkJcHhmcmFtZS0+cGt0ID0gTlVMTDsKLQkJcHhmcmFtZS0+cGt0X29mZnNldCA9IDE7LyogZGVmYXVsdCB1c2UgcGt0X29mZnNldCB0byBmaWxsIHR4IGRlc2MgKi8KLQotCQlweGZyYW1lLT5hY2tfcmVwb3J0ID0gMDsKLQl9Ci19Ci0KLS8qCi1DYWxsaW5nIGNvbnRleHQ6Ci0xLiBPU19UWEVOVFJZCi0yLiBSWEVOVFJZIChyeF90aHJlYWQgb3IgUlhfSVNSL1JYX0NhbGxCYWNrKQotCi1JZiB3ZSB0dXJuIG9uIFVTRV9SWFRIUkVBRCwgdGhlbiwgbm8gbmVlZCBmb3IgY3JpdGljYWwgc2VjdGlvbi4KLU90aGVyd2lzZSwgd2UgbXVzdCB1c2UgX2VudGVyL19leGl0IGNyaXRpY2FsIHRvIHByb3RlY3QgZnJlZV94bWl0X3F1ZXVlLi4uCi0KLU11c3QgYmUgdmVyeSB2ZXJ5IGNhdXRpb3VzLi4uCi0KLSovCi1zdGF0aWMgc3RydWN0IHhtaXRfZnJhbWUgKnJ0d19hbGxvY194bWl0ZnJhbWUoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KQotewotCXN0cnVjdCB4bWl0X2ZyYW1lICpweGZyYW1lOwotCXN0cnVjdCBydHdfcXVldWUgKnBmcmVlX3htaXRfcXVldWUgPSAmcHhtaXRwcml2LT5mcmVlX3htaXRfcXVldWU7Ci0KLQlzcGluX2xvY2tfYmgoJnBmcmVlX3htaXRfcXVldWUtPmxvY2spOwotCi0JcHhmcmFtZSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmcGZyZWVfeG1pdF9xdWV1ZS0+cXVldWUsCi0JCQkJCSAgIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKLQlpZiAoIXB4ZnJhbWUpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgInJ0d19hbGxvY194bWl0ZnJhbWU6JWRcbiIsCi0JCQkgcHhtaXRwcml2LT5mcmVlX3htaXRmcmFtZV9jbnQpOwotCX0gZWxzZSB7Ci0JCWxpc3RfZGVsX2luaXQoJnB4ZnJhbWUtPmxpc3QpOwotCQlweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudC0tOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAicnR3X2FsbG9jX3htaXRmcmFtZSgpOmZyZWVfeG1pdGZyYW1lX2NudCA9JWRcbiIsCi0JCQkgcHhtaXRwcml2LT5mcmVlX3htaXRmcmFtZV9jbnQpOwotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZwZnJlZV94bWl0X3F1ZXVlLT5sb2NrKTsKLQotCXJ0d19pbml0X3htaXRmcmFtZShweGZyYW1lKTsKLQotCXJldHVybiBweGZyYW1lOwotfQotCi1zdHJ1Y3QgeG1pdF9mcmFtZSAqcnR3X2FsbG9jX3htaXRmcmFtZTIzYV9leHQoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KQotewotCXN0cnVjdCB4bWl0X2ZyYW1lICpweGZyYW1lOwotCXN0cnVjdCBydHdfcXVldWUgKnF1ZXVlID0gJnB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X3F1ZXVlOwotCi0Jc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+bG9jayk7Ci0KLQlweGZyYW1lID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZxdWV1ZS0+cXVldWUsCi0JCQkJCSAgIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKLQlpZiAoIXB4ZnJhbWUpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgInJ0d19hbGxvY194bWl0ZnJhbWUyM2FfZXh0OiVkXG4iLAotCQkJIHB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X2NudCk7Ci0JfSBlbHNlIHsKLQkJbGlzdF9kZWxfaW5pdCgmcHhmcmFtZS0+bGlzdCk7Ci0JCXB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X2NudC0tOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAicnR3X2FsbG9jX3htaXRmcmFtZTIzYV9leHQoKTpmcmVlX3htaXRmcmFtZV9jbnQgPSVkXG4iLAotCQkJIHB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X2NudCk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKLQotCXJ0d19pbml0X3htaXRmcmFtZShweGZyYW1lKTsKLQotCXJldHVybiBweGZyYW1lOwotfQotCi1zMzIgcnR3X2ZyZWVfeG1pdGZyYW1lMjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqcXVldWUgPSBOVUxMOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBweG1pdHByaXYtPmFkYXB0ZXI7Ci0Jc3RydWN0IHNrX2J1ZmYgKnBuZGlzX3BrdCA9IE5VTEw7Ci0KLQlpZiAocHhtaXRmcmFtZSA9PSBOVUxMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgIj09PT09PSBydHdfZnJlZV94bWl0ZnJhbWUyM2EoKTpweG1pdGZyYW1lID09IE5VTEwhISEhISEhISEhXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChweG1pdGZyYW1lLT5wa3QpIHsKLQkJcG5kaXNfcGt0ID0gcHhtaXRmcmFtZS0+cGt0OwotCQlweG1pdGZyYW1lLT5wa3QgPSBOVUxMOwotCX0KLQotCWlmIChweG1pdGZyYW1lLT5leHRfdGFnID09IDApCi0JCXF1ZXVlID0gJnB4bWl0cHJpdi0+ZnJlZV94bWl0X3F1ZXVlOwotCWVsc2UgaWYgKHB4bWl0ZnJhbWUtPmV4dF90YWcgPT0gMSkKLQkJcXVldWUgPSAmcHhtaXRwcml2LT5mcmVlX3hmcmFtZV9leHRfcXVldWU7Ci0KLQlpZiAoIXF1ZXVlKQotCQlnb3RvIGNoZWNrX3BrdF9jb21wbGV0ZTsKLQlzcGluX2xvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKLQotCWxpc3RfZGVsX2luaXQoJnB4bWl0ZnJhbWUtPmxpc3QpOwotCWxpc3RfYWRkX3RhaWwoJnB4bWl0ZnJhbWUtPmxpc3QsIGdldF9saXN0X2hlYWQocXVldWUpKTsKLQlpZiAocHhtaXRmcmFtZS0+ZXh0X3RhZyA9PSAwKSB7Ci0JCXB4bWl0cHJpdi0+ZnJlZV94bWl0ZnJhbWVfY250Kys7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2RlYnVnXywKLQkJCSAicnR3X2ZyZWVfeG1pdGZyYW1lMjNhKCk6ZnJlZV94bWl0ZnJhbWVfY250ID0lZFxuIiwKLQkJCSBweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudCk7Ci0JfSBlbHNlIGlmIChweG1pdGZyYW1lLT5leHRfdGFnID09IDEpIHsKLQkJcHhtaXRwcml2LT5mcmVlX3hmcmFtZV9leHRfY250Kys7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2RlYnVnXywKLQkJCSAicnR3X2ZyZWVfeG1pdGZyYW1lMjNhKCk6ZnJlZV94ZnJhbWVfZXh0X2NudCA9JWRcbiIsCi0JCQkgcHhtaXRwcml2LT5mcmVlX3hmcmFtZV9leHRfY250KTsKLQl9Ci0KLQlzcGluX3VubG9ja19iaCgmcXVldWUtPmxvY2spOwotCi1jaGVja19wa3RfY29tcGxldGU6Ci0KLQlpZiAocG5kaXNfcGt0KQotCQlydHdfb3NfcGt0X2NvbXBsZXRlMjNhKHBhZGFwdGVyLCBwbmRpc19wa3QpOwotCi1leGl0OgotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi12b2lkIHJ0d19mcmVlX3htaXRmcmFtZV9xdWV1ZTIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsCi0JCQkJIHN0cnVjdCBydHdfcXVldWUgKnBmcmFtZXF1ZXVlKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lLCAqcHRtcDsKLQotCXNwaW5fbG9ja19iaCgmcGZyYW1lcXVldWUtPmxvY2spOwotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJhbWVxdWV1ZSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB4bWl0ZnJhbWUsIHB0bXAsIHBoZWFkLCBsaXN0KQotCQlydHdfZnJlZV94bWl0ZnJhbWUyM2EocHhtaXRwcml2LCBweG1pdGZyYW1lKTsKLQlzcGluX3VubG9ja19iaCgmcGZyYW1lcXVldWUtPmxvY2spOwotCi19Ci0KLWludCBydHdfeG1pdGZyYW1lX2VucXVldWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0JaWYgKHJ0d194bWl0MjNhX2NsYXNzaWZpZXIocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpID09IF9GQUlMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgInJ0d194bWl0ZnJhbWVfZW5xdWV1ZTIzYTogZHJvcCB4bWl0IHBrdCBmb3IgY2xhc3NpZmllciBmYWlsXG4iKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHN0cnVjdCB4bWl0X2ZyYW1lICoKLWRlcXVldWVfb25lX3htaXRmcmFtZShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsIHN0cnVjdCBod194bWl0ICpwaHd4bWl0LAotCQkgICAgICBzdHJ1Y3QgdHhfc2VydnEgKnB0eHNlcnZxLCBzdHJ1Y3QgcnR3X3F1ZXVlICpwZnJhbWVfcXVldWUpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUgPSBOVUxMOwotCi0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBmcmFtZV9xdWV1ZSk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkocGhlYWQpKSB7Ci0JCXB4bWl0ZnJhbWUgPSBsaXN0X2ZpcnN0X2VudHJ5KHBoZWFkLCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7Ci0JCWxpc3RfZGVsX2luaXQoJnB4bWl0ZnJhbWUtPmxpc3QpOwotCQlwdHhzZXJ2cS0+cWNudC0tOwotCX0KLQlyZXR1cm4gcHhtaXRmcmFtZTsKLX0KLQotc3RydWN0IHhtaXRfZnJhbWUgKgotcnR3X2RlcXVldWVfeGZyYW1lMjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwgc3RydWN0IGh3X3htaXQgKnBod3htaXRfaSwKLQkJICAgaW50IGVudHJ5KQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnN0YV9waGVhZDsKLQlzdHJ1Y3QgaHdfeG1pdCAqcGh3eG1pdDsKLQlzdHJ1Y3QgdHhfc2VydnEgKnB0eHNlcnZxID0gTlVMTCwgKnB0bXA7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqcGZyYW1lX3F1ZXVlID0gTlVMTDsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSA9IE5VTEw7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHB4bWl0cHJpdi0+YWRhcHRlcjsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlpbnQgaSwgaW54WzRdOwotCi0JaW54WzBdID0gMDsKLQlpbnhbMV0gPSAxOwotCWlueFsyXSA9IDI7Ci0JaW54WzNdID0gMzsKLQlpZiAocHJlZ3ByaXYtPndpZmlfc3BlYyA9PSAxKSB7Ci0JCWludCBqOwotCi0JCWZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0JCQlpbnhbal0gPSBweG1pdHByaXYtPndtbV9wYXJhX3NlcVtqXTsKLQl9Ci0KLQlzcGluX2xvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZW50cnk7IGkrKykgewotCQlwaHd4bWl0ID0gcGh3eG1pdF9pICsgaW54W2ldOwotCi0JCXN0YV9waGVhZCA9IGdldF9saXN0X2hlYWQocGh3eG1pdC0+c3RhX3F1ZXVlKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB0eHNlcnZxLCBwdG1wLCBzdGFfcGhlYWQsCi0JCQkJCSB0eF9wZW5kaW5nKSB7Ci0JCQlwZnJhbWVfcXVldWUgPSAmcHR4c2VydnEtPnN0YV9wZW5kaW5nOwotCi0JCQlweG1pdGZyYW1lID0gZGVxdWV1ZV9vbmVfeG1pdGZyYW1lKHB4bWl0cHJpdiwgcGh3eG1pdCwgcHR4c2VydnEsIHBmcmFtZV9xdWV1ZSk7Ci0KLQkJCWlmIChweG1pdGZyYW1lKSB7Ci0JCQkJcGh3eG1pdC0+YWNjbnQtLTsKLQotCQkJCS8qIFJlbW92ZSBzdGEgbm9kZSB3aGVuIHRoZXJlIGlzIG5vIHBlbmRpbmcgcGFja2V0cy4gKi8KLQkJCQkvKiBtdXN0IGJlIGRvbmUgYWZ0ZXIgZ2V0X25leHQgYW5kCi0JCQkJICAgYmVmb3JlIGJyZWFrICovCi0JCQkJaWYgKGxpc3RfZW1wdHkoJnBmcmFtZV9xdWV1ZS0+cXVldWUpKQotCQkJCQlsaXN0X2RlbF9pbml0KCZwdHhzZXJ2cS0+dHhfcGVuZGluZyk7Ci0JCQkJZ290byBleGl0OwotCQkJfQotCQl9Ci0JfQotZXhpdDoKLQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQlyZXR1cm4gcHhtaXRmcmFtZTsKLX0KLQotc3RydWN0IHR4X3NlcnZxICpydHdfZ2V0X3N0YV9wZW5kaW5nMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgaW50IHVwLCB1OCAqYWMpCi17Ci0Jc3RydWN0IHR4X3NlcnZxICpwdHhzZXJ2cSA9IE5VTEw7Ci0KLQlzd2l0Y2ggKHVwKSB7Ci0JY2FzZSAxOgotCWNhc2UgMjoKLQkJcHR4c2VydnEgPSAmcHN0YS0+c3RhX3htaXRwcml2LmJrX3E7Ci0JCSooYWMpID0gMzsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgInJ0d19nZXRfc3RhX3BlbmRpbmcyM2EgOiBCS1xuIik7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQljYXNlIDU6Ci0JCXB0eHNlcnZxID0gJnBzdGEtPnN0YV94bWl0cHJpdi52aV9xOwotCQkqKGFjKSA9IDE7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJydHdfZ2V0X3N0YV9wZW5kaW5nMjNhIDogVklcbiIpOwotCQlicmVhazsKLQljYXNlIDY6Ci0JY2FzZSA3OgotCQlwdHhzZXJ2cSA9ICZwc3RhLT5zdGFfeG1pdHByaXYudm9fcTsKLQkJKihhYykgPSAwOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAicnR3X2dldF9zdGFfcGVuZGluZzIzYSA6IFZPXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSAwOgotCWNhc2UgMzoKLQlkZWZhdWx0OgotCQlwdHhzZXJ2cSA9ICZwc3RhLT5zdGFfeG1pdHByaXYuYmVfcTsKLQkJKihhYykgPSAyOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAicnR3X2dldF9zdGFfcGVuZGluZzIzYSA6IEJFXG4iKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBwdHhzZXJ2cTsKLX0KLQotLyoKLSAqIFdpbGwgZW5xdWV1ZSBweG1pdGZyYW1lIHRvIHRoZSBwcm9wZXIgcXVldWUsCi0gKiBhbmQgaW5kaWNhdGUgaXQgdG8geHhfcGVuZGluZyBsaXN0Li4uLi4KLSAqLwotaW50IHJ0d194bWl0MjNhX2NsYXNzaWZpZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKQotewotCXN0cnVjdCBzdGFfaW5mbwkqcHN0YTsKLQlzdHJ1Y3QgdHhfc2VydnEJKnB0eHNlcnZxOwotCXN0cnVjdCBwa3RfYXR0cmliCSpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3Qgc3RhX3ByaXYJKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBod194bWl0CSpwaHd4bWl0cyA9ICBwYWRhcHRlci0+eG1pdHByaXYuaHd4bWl0czsKLQl1OAlhY19pbmRleDsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlpZiAocGF0dHJpYi0+cHN0YSkgewotCQlwc3RhID0gcGF0dHJpYi0+cHN0YTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzLCBjYWxsIHJ0d19nZXRfc3RhaW5mbzIzYSgpXG4iLCBfX2Z1bmNfXyk7Ci0JCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBhdHRyaWItPnJhKTsKLQl9Ci0JaWYgKHBzdGEgPT0gTlVMTCkgewotCQlyZXMgPSBfRkFJTDsKLQkJREJHXzg3MjNBKCJydHdfeG1pdDIzYV9jbGFzc2lmaWVyOiBwc3RhID09IE5VTExcbiIpOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJICJydHdfeG1pdDIzYV9jbGFzc2lmaWVyOiBwc3RhID09IE5VTExcbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCWlmICghKHBzdGEtPnN0YXRlICYgX0ZXX0xJTktFRCkpIHsKLQkJREJHXzg3MjNBKCIlcywgcHN0YS0+c3RhdGUoMHgleCkgIT0gX0ZXX0xJTktFRFxuIiwgX19mdW5jX18sCi0JCQkgIHBzdGEtPnN0YXRlKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQlwdHhzZXJ2cSA9IHJ0d19nZXRfc3RhX3BlbmRpbmcyM2EocGFkYXB0ZXIsIHBzdGEsIHBhdHRyaWItPnByaW9yaXR5LAotCQkJCSAgICAgICAodTggKikoJmFjX2luZGV4KSk7Ci0KLQlpZiAobGlzdF9lbXB0eSgmcHR4c2VydnEtPnR4X3BlbmRpbmcpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJnB0eHNlcnZxLT50eF9wZW5kaW5nLAotCQkJICAgICAgZ2V0X2xpc3RfaGVhZChwaHd4bWl0c1thY19pbmRleF0uc3RhX3F1ZXVlKSk7Ci0JfQotCi0JbGlzdF9hZGRfdGFpbCgmcHhtaXRmcmFtZS0+bGlzdCwgZ2V0X2xpc3RfaGVhZCgmcHR4c2VydnEtPnN0YV9wZW5kaW5nKSk7Ci0JcHR4c2VydnEtPnFjbnQrKzsKLQlwaHd4bWl0c1thY19pbmRleF0uYWNjbnQrKzsKLWV4aXQ6Ci0JcmV0dXJuIHJlczsKLX0KLQotdm9pZCBydHdfYWxsb2NfaHd4bWl0czIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBod194bWl0ICpod3htaXRzOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0JaW50IHNpemU7Ci0KLQlweG1pdHByaXYtPmh3eG1pdF9lbnRyeSA9IEhXWE1JVF9FTlRSWTsKLQotCXNpemUgPSBzaXplb2Yoc3RydWN0IGh3X3htaXQpICogKHB4bWl0cHJpdi0+aHd4bWl0X2VudHJ5ICsgMSk7Ci0JcHhtaXRwcml2LT5od3htaXRzID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQotCWh3eG1pdHMgPSBweG1pdHByaXYtPmh3eG1pdHM7Ci0KLQlpZiAocHhtaXRwcml2LT5od3htaXRfZW50cnkgPT0gNSkgewotCQkvKiBweG1pdHByaXYtPmJtY190eHF1ZXVlLmhlYWQgPSAwOyAqLwotCQkvKiBod3htaXRzWzBdIC5waHd0eHF1ZXVlID0gJnB4bWl0cHJpdi0+Ym1jX3R4cXVldWU7ICovCi0JCWh3eG1pdHNbMF0gLnN0YV9xdWV1ZSA9ICZweG1pdHByaXYtPmJtX3BlbmRpbmc7Ci0KLQkJLyogcHhtaXRwcml2LT52b190eHF1ZXVlLmhlYWQgPSAwOyAqLwotCQkvKiBod3htaXRzWzFdIC5waHd0eHF1ZXVlID0gJnB4bWl0cHJpdi0+dm9fdHhxdWV1ZTsgKi8KLQkJaHd4bWl0c1sxXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+dm9fcGVuZGluZzsKLQotCQkvKiBweG1pdHByaXYtPnZpX3R4cXVldWUuaGVhZCA9IDA7ICovCi0JCS8qIGh3eG1pdHNbMl0gLnBod3R4cXVldWUgPSAmcHhtaXRwcml2LT52aV90eHF1ZXVlOyAqLwotCQlod3htaXRzWzJdIC5zdGFfcXVldWUgPSAmcHhtaXRwcml2LT52aV9wZW5kaW5nOwotCi0JCS8qIHB4bWl0cHJpdi0+YmtfdHhxdWV1ZS5oZWFkID0gMDsgKi8KLQkJLyogaHd4bWl0c1szXSAucGh3dHhxdWV1ZSA9ICZweG1pdHByaXYtPmJrX3R4cXVldWU7ICovCi0JCWh3eG1pdHNbM10gLnN0YV9xdWV1ZSA9ICZweG1pdHByaXYtPmJrX3BlbmRpbmc7Ci0KLQkJLyogcHhtaXRwcml2LT5iZV90eHF1ZXVlLmhlYWQgPSAwOyAqLwotCQkvKiBod3htaXRzWzRdIC5waHd0eHF1ZXVlID0gJnB4bWl0cHJpdi0+YmVfdHhxdWV1ZTsgKi8KLQkJaHd4bWl0c1s0XSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+YmVfcGVuZGluZzsKLQotCX0gZWxzZSBpZiAocHhtaXRwcml2LT5od3htaXRfZW50cnkgPT0gNCkgewotCi0JCS8qIHB4bWl0cHJpdi0+dm9fdHhxdWV1ZS5oZWFkID0gMDsgKi8KLQkJLyogaHd4bWl0c1swXSAucGh3dHhxdWV1ZSA9ICZweG1pdHByaXYtPnZvX3R4cXVldWU7ICovCi0JCWh3eG1pdHNbMF0gLnN0YV9xdWV1ZSA9ICZweG1pdHByaXYtPnZvX3BlbmRpbmc7Ci0KLQkJLyogcHhtaXRwcml2LT52aV90eHF1ZXVlLmhlYWQgPSAwOyAqLwotCQkvKiBod3htaXRzWzFdIC5waHd0eHF1ZXVlID0gJnB4bWl0cHJpdi0+dmlfdHhxdWV1ZTsgKi8KLQkJaHd4bWl0c1sxXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+dmlfcGVuZGluZzsKLQotCQkvKiBweG1pdHByaXYtPmJlX3R4cXVldWUuaGVhZCA9IDA7ICovCi0JCS8qIGh3eG1pdHNbMl0gLnBod3R4cXVldWUgPSAmcHhtaXRwcml2LT5iZV90eHF1ZXVlOyAqLwotCQlod3htaXRzWzJdIC5zdGFfcXVldWUgPSAmcHhtaXRwcml2LT5iZV9wZW5kaW5nOwotCi0JCS8qIHB4bWl0cHJpdi0+YmtfdHhxdWV1ZS5oZWFkID0gMDsgKi8KLQkJLyogaHd4bWl0c1szXSAucGh3dHhxdWV1ZSA9ICZweG1pdHByaXYtPmJrX3R4cXVldWU7ICovCi0JCWh3eG1pdHNbM10gLnN0YV9xdWV1ZSA9ICZweG1pdHByaXYtPmJrX3BlbmRpbmc7Ci0JfSBlbHNlIHsKLQotCX0KLX0KLQotdm9pZCBydHdfZnJlZV9od3htaXRzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGh3X3htaXQgKmh3eG1pdHM7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCWh3eG1pdHMgPSBweG1pdHByaXYtPmh3eG1pdHM7Ci0Ja2ZyZWUoaHd4bWl0cyk7Ci19Ci0KLXZvaWQgcnR3X2luaXRfaHd4bWl0czIzYShzdHJ1Y3QgaHdfeG1pdCAqcGh3eG1pdCwgaW50IGVudHJ5KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGVudHJ5OyBpKyssIHBod3htaXQrKykKLQkJcGh3eG1pdC0+YWNjbnQgPSAwOwotfQotCi11MzIgcnR3X2dldF9mZl9od2FkZHIyM2Eoc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0JdTMyIGFkZHI7Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCi0Jc3dpdGNoIChwYXR0cmliLT5xc2VsKSB7Ci0JY2FzZSAwOgotCWNhc2UgMzoKLQkJYWRkciA9IEJFX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCWNhc2UgMjoKLQkJYWRkciA9IEJLX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCWNhc2UgNToKLQkJYWRkciA9IFZJX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCWNhc2UgNzoKLQkJYWRkciA9IFZPX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSAweDEwOgotCQlhZGRyID0gQkNOX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSAweDExOi8qIEJDL01DIGluIFBTIChISVEpICovCi0JCWFkZHIgPSBISUdIX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSAweDEyOgotCWRlZmF1bHQ6Ci0JCWFkZHIgPSBNR1RfUVVFVUVfSU5YOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gYWRkcjsKLX0KLQotLyoKLSAqIFRoZSBtYWluIHRyYW5zbWl0KHR4KSBlbnRyeQotICoKLSAqIFJldHVybgotICoJMQllbnF1ZXVlCi0gKgkwCXN1Y2Nlc3MsIGhhcmR3YXJlIHdpbGwgaGFuZGxlIHRoaXMgeG1pdCBmcmFtZShwYWNrZXQpCi0gKgk8MAlmYWlsCi0gKi8KLWludCBydHdfeG1pdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUgPSBOVUxMOwotCWludCByZXM7Ci0KLQlweG1pdGZyYW1lID0gcnR3X2FsbG9jX3htaXRmcmFtZShweG1pdHByaXYpOwotCi0JaWYgKHB4bWl0ZnJhbWUgPT0gTlVMTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3htaXRfb3NkZXBfY18sIF9kcnZfZXJyXywKLQkJCSAicnR3X3htaXQyM2E6IG5vIG1vcmUgcHhtaXRmcmFtZVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXMgPSB1cGRhdGVfYXR0cmliKHBhZGFwdGVyLCBza2IsICZweG1pdGZyYW1lLT5hdHRyaWIpOwotCi0JaWYgKHJlcyA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3htaXRfb3NkZXBfY18sIF9kcnZfZXJyXywKLQkJCSAicnR3X3htaXQyM2E6IHVwZGF0ZSBhdHRyaWIgZmFpbFxuIik7Ci0JCXJ0d19mcmVlX3htaXRmcmFtZTIzYShweG1pdHByaXYsIHB4bWl0ZnJhbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXB4bWl0ZnJhbWUtPnBrdCA9IHNrYjsKLQotCXB4bWl0ZnJhbWUtPmF0dHJpYi5xc2VsID0gcHhtaXRmcmFtZS0+YXR0cmliLnByaW9yaXR5OwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0Jc3Bpbl9sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCWlmICh4bWl0ZnJhbWVfZW5xdWV1ZV9mb3Jfc2xlZXBpbmdfc3RhMjNhKHBhZGFwdGVyLCBweG1pdGZyYW1lKSkgewotCQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotI2VuZGlmCi0KLQlpZiAocnRsODcyM2F1X2hhbF94bWl0KHBhZGFwdGVyLCBweG1pdGZyYW1lKSA9PSBmYWxzZSkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmIGRlZmluZWQoQ09ORklHXzg3MjNBVV9BUF9NT0RFKQotCi1pbnQgeG1pdGZyYW1lX2VucXVldWVfZm9yX3NsZWVwaW5nX3N0YTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQlpbnQgcmV0ID0gZmFsc2U7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCWludCBibWNzdCA9IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPnJhKTsKLQotCWlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKHBhdHRyaWItPnBzdGEpIHsKLQkJcHN0YSA9IHBhdHRyaWItPnBzdGE7Ci0JfSBlbHNlIHsKLQkJREJHXzg3MjNBKCIlcywgY2FsbCBydHdfZ2V0X3N0YWluZm8yM2EoKVxuIiwgX19mdW5jX18pOwotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwYXR0cmliLT5yYSk7Ci0JfQotCi0JaWYgKHBzdGEgPT0gTlVMTCkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhID09IE5VTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JaWYgKCEocHN0YS0+c3RhdGUgJiBfRldfTElOS0VEKSkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhLT5zdGF0ZSgweCV4KSAhPSBfRldfTElOS0VEXG4iLCBfX2Z1bmNfXywKLQkJCSAgcHN0YS0+c3RhdGUpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JaWYgKHBhdHRyaWItPnRyaWdnZXJlZCA9PSAxKSB7Ci0JCWlmIChibWNzdCkKLQkJCXBhdHRyaWItPnFzZWwgPSAweDExOy8qIEhJUSAqLwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChibWNzdCkgewotCQlzcGluX2xvY2tfYmgoJnBzdGEtPnNsZWVwX3EubG9jayk7Ci0KLQkJaWYgKHBzdGFwcml2LT5zdGFfZHpfYml0bWFwKSB7Ci0JCQkvKiBpZiBhbnlvbmUgc3RhIGlzIGluIHBzIG1vZGUgKi8KLQkJCWxpc3RfZGVsX2luaXQoJnB4bWl0ZnJhbWUtPmxpc3QpOwotCi0JCQkvKiBzcGluX2xvY2tfYmgoJnBzdGEtPnNsZWVwX3EubG9jayk7ICovCi0KLQkJCWxpc3RfYWRkX3RhaWwoJnB4bWl0ZnJhbWUtPmxpc3QsIGdldF9saXN0X2hlYWQoJnBzdGEtPnNsZWVwX3EpKTsKLQotCQkJcHN0YS0+c2xlZXBxX2xlbisrOwotCi0JCQlwc3RhcHJpdi0+dGltX2JpdG1hcCB8PSBCSVQoMCk7LyogICovCi0JCQlwc3RhcHJpdi0+c3RhX2R6X2JpdG1hcCB8PSBCSVQoMCk7Ci0KLQkJCS8qIERCR184NzIzQSgiZW5xdWV1ZSwgc3FfbGVuID0lZCwgdGltID0leFxuIiwgcHN0YS0+c2xlZXBxX2xlbiwgcHN0YXByaXYtPnRpbV9iaXRtYXApOyAqLwotCi0JCQkvKiB0eCBiYy9tYyBwYWNrZXRzIGFmdGVyIHVwZGF0ZSBiY24gKi8KLQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIFdMQU5fRUlEX1RJTSwgTlVMTCwgZmFsc2UpOwotCi0JCQkvKiBzcGluX3VubG9ja19iaCgmcHN0YS0+c2xlZXBfcS5sb2NrKTsgKi8KLQotCQkJcmV0ID0gdHJ1ZTsKLQotCQl9Ci0KLQkJc3Bpbl91bmxvY2tfYmgoJnBzdGEtPnNsZWVwX3EubG9jayk7Ci0KLQkJcmV0dXJuIHJldDsKLQotCX0KLQotCXNwaW5fbG9ja19iaCgmcHN0YS0+c2xlZXBfcS5sb2NrKTsKLQotCWlmIChwc3RhLT5zdGF0ZSZXSUZJX1NMRUVQX1NUQVRFKSB7Ci0JCXU4IHdtbXBzX2FjID0gMDsKLQotCQlpZiAocHN0YXByaXYtPnN0YV9kel9iaXRtYXAgJiBDSEtCSVQocHN0YS0+YWlkKSkgewotCQkJbGlzdF9kZWxfaW5pdCgmcHhtaXRmcmFtZS0+bGlzdCk7Ci0KLQkJCS8qIHNwaW5fbG9ja19iaCgmcHN0YS0+c2xlZXBfcS5sb2NrKTsgKi8KLQotCQkJbGlzdF9hZGRfdGFpbCgmcHhtaXRmcmFtZS0+bGlzdCwgZ2V0X2xpc3RfaGVhZCgmcHN0YS0+c2xlZXBfcSkpOwotCi0JCQlwc3RhLT5zbGVlcHFfbGVuKys7Ci0KLQkJCXN3aXRjaCAocGF0dHJpYi0+cHJpb3JpdHkpIHsKLQkJCWNhc2UgMToKLQkJCWNhc2UgMjoKLQkJCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX2JrICYgQklUKDApOwotCQkJCWJyZWFrOwotCQkJY2FzZSA0OgotCQkJY2FzZSA1OgotCQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2RfdmkgJiBCSVQoMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDY6Ci0JCQljYXNlIDc6Ci0JCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF92byAmIEJJVCgwKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMDoKLQkJCWNhc2UgMzoKLQkJCWRlZmF1bHQ6Ci0JCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF9iZSAmIEJJVCgwKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKHdtbXBzX2FjKQotCQkJCXBzdGEtPnNsZWVwcV9hY19sZW4rKzsKLQotCQkJaWYgKCgocHN0YS0+aGFzX2xlZ2FjeV9hYykgJiYgKCF3bW1wc19hYykpIHx8Ci0JCQkgICAoKCFwc3RhLT5oYXNfbGVnYWN5X2FjKSAmJiAod21tcHNfYWMpKSkgewotCQkJCXBzdGFwcml2LT50aW1fYml0bWFwIHw9IENIS0JJVChwc3RhLT5haWQpOwotCi0JCQkJaWYgKHBzdGEtPnNsZWVwcV9sZW4gPT0gMSkgewotCQkJCQkvKiB1cGRhdGUgQkNOIGZvciBUSU0gSUUgKi8KLQkJCQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgV0xBTl9FSURfVElNLAotCQkJCQkJCSBOVUxMLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBzcGluX3VubG9ja19iaCgmcHN0YS0+c2xlZXBfcS5sb2NrKTsgKi8KLQotCQkJLyogaWYgKHBzdGEtPnNsZWVwcV9sZW4gPiAoTlJfWE1JVEZSQU1FPj4zKSkgKi8KLQkJCS8qICAqLwotCQkJLyoJd2FrZXVwX3N0YV90b194bWl0MjNhKHBhZGFwdGVyLCBwc3RhKTsgKi8KLQkJCS8qICAqLwotCi0JCQlyZXQgPSB0cnVlOwotCi0JCX0KLQotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZwc3RhLT5zbGVlcF9xLmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQKLWRlcXVldWVfeG1pdGZyYW1lc190b19zbGVlcGluZ19xdWV1ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICAgc3RydWN0IHN0YV9pbmZvICpwc3RhLAotCQkJCSAgICAgc3RydWN0IHJ0d19xdWV1ZSAqcGZyYW1lcXVldWUpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQl1OCBhY19pbmRleDsKLQlzdHJ1Y3QgdHhfc2VydnEJKnB0eHNlcnZxOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lLCAqcHRtcDsKLQlzdHJ1Y3QgaHdfeG1pdCAqcGh3eG1pdHMgPSBwYWRhcHRlci0+eG1pdHByaXYuaHd4bWl0czsKLQotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJhbWVxdWV1ZSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB4bWl0ZnJhbWUsIHB0bXAsIHBoZWFkLCBsaXN0KSB7Ci0JCXJldCA9IHhtaXRmcmFtZV9lbnF1ZXVlX2Zvcl9zbGVlcGluZ19zdGEyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCi0JCWlmIChyZXQgPT0gdHJ1ZSkgewotCQkJcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7Ci0KLQkJCXB0eHNlcnZxID0gcnR3X2dldF9zdGFfcGVuZGluZzIzYShwYWRhcHRlciwgcHN0YSwgcGF0dHJpYi0+cHJpb3JpdHksICh1OCAqKSgmYWNfaW5kZXgpKTsKLQotCQkJcHR4c2VydnEtPnFjbnQtLTsKLQkJCXBod3htaXRzW2FjX2luZGV4XS5hY2NudC0tOwotCQl9IGVsc2UgewotCQkJLyogREJHXzg3MjNBKCJ4bWl0ZnJhbWVfZW5xdWV1ZV9mb3Jfc2xlZXBpbmdfc3RhMjNhIHJldHVybiBmYWxzZVxuIik7ICovCi0JCX0KLQl9Ci19Ci0KLXZvaWQgc3RvcF9zdGFfeG1pdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhX2JtYzsKLQlzdHJ1Y3Qgc3RhX3htaXRfcHJpdiAqcHN0YXhtaXRwcml2OwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCXBzdGF4bWl0cHJpdiA9ICZwc3RhLT5zdGFfeG1pdHByaXY7Ci0KLQkvKiBmb3IgQkMvTUMgRnJhbWVzICovCi0JcHN0YV9ibWMgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0KLQlzcGluX2xvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0KLQlwc3RhLT5zdGF0ZSB8PSBXSUZJX1NMRUVQX1NUQVRFOwotCi0JcHN0YXByaXYtPnN0YV9kel9iaXRtYXAgfD0gQ0hLQklUKHBzdGEtPmFpZCk7Ci0KLQlkZXF1ZXVlX3htaXRmcmFtZXNfdG9fc2xlZXBpbmdfcXVldWUocGFkYXB0ZXIsIHBzdGEsICZwc3RheG1pdHByaXYtPnZvX3Euc3RhX3BlbmRpbmcpOwotCWxpc3RfZGVsX2luaXQoJnBzdGF4bWl0cHJpdi0+dm9fcS50eF9wZW5kaW5nKTsKLQotCWRlcXVldWVfeG1pdGZyYW1lc190b19zbGVlcGluZ19xdWV1ZShwYWRhcHRlciwgcHN0YSwgJnBzdGF4bWl0cHJpdi0+dmlfcS5zdGFfcGVuZGluZyk7Ci0JbGlzdF9kZWxfaW5pdCgmcHN0YXhtaXRwcml2LT52aV9xLnR4X3BlbmRpbmcpOwotCi0JZGVxdWV1ZV94bWl0ZnJhbWVzX3RvX3NsZWVwaW5nX3F1ZXVlKHBhZGFwdGVyLCBwc3RhLAotCQkJCQkgICAgICZwc3RheG1pdHByaXYtPmJlX3Euc3RhX3BlbmRpbmcpOwotCWxpc3RfZGVsX2luaXQoJnBzdGF4bWl0cHJpdi0+YmVfcS50eF9wZW5kaW5nKTsKLQotCWRlcXVldWVfeG1pdGZyYW1lc190b19zbGVlcGluZ19xdWV1ZShwYWRhcHRlciwgcHN0YSwKLQkJCQkJICAgICAmcHN0YXhtaXRwcml2LT5ia19xLnN0YV9wZW5kaW5nKTsKLQlsaXN0X2RlbF9pbml0KCZwc3RheG1pdHByaXYtPmJrX3EudHhfcGVuZGluZyk7Ci0KLQkvKiBmb3IgQkMvTUMgRnJhbWVzICovCi0JcHN0YXhtaXRwcml2ID0gJnBzdGFfYm1jLT5zdGFfeG1pdHByaXY7Ci0JZGVxdWV1ZV94bWl0ZnJhbWVzX3RvX3NsZWVwaW5nX3F1ZXVlKHBhZGFwdGVyLCBwc3RhX2JtYywKLQkJCQkJICAgICAmcHN0YXhtaXRwcml2LT5iZV9xLnN0YV9wZW5kaW5nKTsKLQlsaXN0X2RlbF9pbml0KCZwc3RheG1pdHByaXYtPmJlX3EudHhfcGVuZGluZyk7Ci0KLQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLX0KLQotdm9pZCB3YWtldXBfc3RhX3RvX3htaXQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCXU4IHVwZGF0ZV9tYXNrID0gMCwgd21tcHNfYWMgPSAwOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YV9ibWM7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUgPSBOVUxMLCAqcHRtcDsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0KLQlzcGluX2xvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKCZwc3RhLT5zbGVlcF9xKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHhtaXRmcmFtZSwgcHRtcCwgcGhlYWQsIGxpc3QpIHsKLQkJbGlzdF9kZWxfaW5pdCgmcHhtaXRmcmFtZS0+bGlzdCk7Ci0KLQkJc3dpdGNoIChweG1pdGZyYW1lLT5hdHRyaWIucHJpb3JpdHkpIHsKLQkJY2FzZSAxOgotCQljYXNlIDI6Ci0JCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX2JrICYgQklUKDEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJY2FzZSA1OgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF92aSAmIEJJVCgxKTsKLQkJCWJyZWFrOwotCQljYXNlIDY6Ci0JCWNhc2UgNzoKLQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2Rfdm8gJiBCSVQoMSk7Ci0JCQlicmVhazsKLQkJY2FzZSAwOgotCQljYXNlIDM6Ci0JCWRlZmF1bHQ6Ci0JCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX2JlICYgQklUKDEpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlwc3RhLT5zbGVlcHFfbGVuLS07Ci0JCWlmIChwc3RhLT5zbGVlcHFfbGVuID4gMCkKLQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5tZGF0YSA9IDE7Ci0JCWVsc2UKLQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5tZGF0YSA9IDA7Ci0KLQkJaWYgKHdtbXBzX2FjKSB7Ci0JCQlwc3RhLT5zbGVlcHFfYWNfbGVuLS07Ci0JCQlpZiAocHN0YS0+c2xlZXBxX2FjX2xlbiA+IDApIHsKLQkJCQlweG1pdGZyYW1lLT5hdHRyaWIubWRhdGEgPSAxOwotCQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5lb3NwID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcHhtaXRmcmFtZS0+YXR0cmliLm1kYXRhID0gMDsKLQkJCQlweG1pdGZyYW1lLT5hdHRyaWIuZW9zcCA9IDE7Ci0JCQl9Ci0JCX0KLQotCQlweG1pdGZyYW1lLT5hdHRyaWIudHJpZ2dlcmVkID0gMTsKLQkJcnRsODcyM2F1X2hhbF94bWl0ZnJhbWVfZW5xdWV1ZShwYWRhcHRlciwgcHhtaXRmcmFtZSk7Ci0JfQotCi0JaWYgKHBzdGEtPnNsZWVwcV9sZW4gPT0gMCkgewotCQlwc3RhcHJpdi0+dGltX2JpdG1hcCAmPSB+Q0hLQklUKHBzdGEtPmFpZCk7Ci0KLQkJLyogdXBkYXRlIEJDTiBmb3IgVElNIElFICovCi0JCXVwZGF0ZV9tYXNrID0gQklUKDApOwotCi0JCWlmIChwc3RhLT5zdGF0ZSZXSUZJX1NMRUVQX1NUQVRFKQotCQkJcHN0YS0+c3RhdGUgXj0gV0lGSV9TTEVFUF9TVEFURTsKLQotCQlpZiAocHN0YS0+c3RhdGUgJiBXSUZJX1NUQV9BTElWRV9DSEtfU1RBVEUpIHsKLQkJCXBzdGEtPmV4cGlyZV90byA9IHBzdGFwcml2LT5leHBpcmVfdG87Ci0JCQlwc3RhLT5zdGF0ZSBePSBXSUZJX1NUQV9BTElWRV9DSEtfU1RBVEU7Ci0JCX0KLQotCQlwc3RhcHJpdi0+c3RhX2R6X2JpdG1hcCAmPSB+Q0hLQklUKHBzdGEtPmFpZCk7Ci0JfQotCS8qIHNwaW5fdW5sb2NrX2JoKCZwc3RhLT5zbGVlcF9xLmxvY2spOyAqLwotCXNwaW5fdW5sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCi0JLyogZm9yIEJDL01DIEZyYW1lcyAqLwotCXBzdGFfYm1jID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCWlmICghcHN0YV9ibWMpCi0JCXJldHVybjsKLQotCWlmICgocHN0YXByaXYtPnN0YV9kel9iaXRtYXAmMHhmZmZlKSA9PSAweDApIHsKLQkJLyogbm8gYW55IHN0YSBpbiBwcyBtb2RlICovCi0JCXNwaW5fbG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQkJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKCZwc3RhX2JtYy0+c2xlZXBfcSk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShweG1pdGZyYW1lLCBwdG1wLCBwaGVhZCwgbGlzdCkgewotCQkJbGlzdF9kZWxfaW5pdCgmcHhtaXRmcmFtZS0+bGlzdCk7Ci0KLQkJCXBzdGFfYm1jLT5zbGVlcHFfbGVuLS07Ci0JCQlpZiAocHN0YV9ibWMtPnNsZWVwcV9sZW4gPiAwKQotCQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5tZGF0YSA9IDE7Ci0JCQllbHNlCi0JCQkJcHhtaXRmcmFtZS0+YXR0cmliLm1kYXRhID0gMDsKLQotCQkJcHhtaXRmcmFtZS0+YXR0cmliLnRyaWdnZXJlZCA9IDE7Ci0JCQlydGw4NzIzYXVfaGFsX3htaXRmcmFtZV9lbnF1ZXVlKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKLQkJfQotCQlpZiAocHN0YV9ibWMtPnNsZWVwcV9sZW4gPT0gMCkgewotCQkJcHN0YXByaXYtPnRpbV9iaXRtYXAgJj0gfkJJVCgwKTsKLQkJCXBzdGFwcml2LT5zdGFfZHpfYml0bWFwICY9IH5CSVQoMCk7Ci0KLQkJCS8qIHVwZGF0ZSBCQ04gZm9yIFRJTSBJRSAqLwotCQkJLyogdXBkYXRlX0JDTlRJTShwYWRhcHRlcik7ICovCi0JCQl1cGRhdGVfbWFzayB8PSBCSVQoMSk7Ci0JCX0KLQkJLyogc3Bpbl91bmxvY2tfYmgoJnBzdGFfYm1jLT5zbGVlcF9xLmxvY2spOyAqLwotCQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQl9Ci0KLQlpZiAodXBkYXRlX21hc2spCi0JCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIFdMQU5fRUlEX1RJTSwgTlVMTCwgZmFsc2UpOwotfQotCi12b2lkIHhtaXRfZGVsaXZlcnlfZW5hYmxlZF9mcmFtZXMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSkKLXsKLQl1OCB3bW1wc19hYyA9IDA7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUsICpwdG1wOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCS8qIHNwaW5fbG9ja19iaCgmcHN0YS0+c2xlZXBfcS5sb2NrKTsgKi8KLQlzcGluX2xvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKCZwc3RhLT5zbGVlcF9xKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHhtaXRmcmFtZSwgcHRtcCwgcGhlYWQsIGxpc3QpIHsKLQkJc3dpdGNoIChweG1pdGZyYW1lLT5hdHRyaWIucHJpb3JpdHkpIHsKLQkJY2FzZSAxOgotCQljYXNlIDI6Ci0JCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX2JrICYgQklUKDEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJY2FzZSA1OgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF92aSAmIEJJVCgxKTsKLQkJCWJyZWFrOwotCQljYXNlIDY6Ci0JCWNhc2UgNzoKLQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2Rfdm8gJiBCSVQoMSk7Ci0JCQlicmVhazsKLQkJY2FzZSAwOgotCQljYXNlIDM6Ci0JCWRlZmF1bHQ6Ci0JCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX2JlICYgQklUKDEpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoIXdtbXBzX2FjKQotCQkJY29udGludWU7Ci0KLQkJbGlzdF9kZWxfaW5pdCgmcHhtaXRmcmFtZS0+bGlzdCk7Ci0KLQkJcHN0YS0+c2xlZXBxX2xlbi0tOwotCQlwc3RhLT5zbGVlcHFfYWNfbGVuLS07Ci0KLQkJaWYgKHBzdGEtPnNsZWVwcV9hY19sZW4gPiAwKSB7Ci0JCQlweG1pdGZyYW1lLT5hdHRyaWIubWRhdGEgPSAxOwotCQkJcHhtaXRmcmFtZS0+YXR0cmliLmVvc3AgPSAwOwotCQl9IGVsc2UgewotCQkJcHhtaXRmcmFtZS0+YXR0cmliLm1kYXRhID0gMDsKLQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5lb3NwID0gMTsKLQkJfQotCi0JCXB4bWl0ZnJhbWUtPmF0dHJpYi50cmlnZ2VyZWQgPSAxOwotCi0JCXJ0bDg3MjNhdV9oYWxfeG1pdGZyYW1lX2VucXVldWUocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCi0JCWlmICgocHN0YS0+c2xlZXBxX2FjX2xlbiA9PSAwKSAmJiAoIXBzdGEtPmhhc19sZWdhY3lfYWMpICYmCi0JCSAgICAod21tcHNfYWMpKSB7Ci0JCQlwc3RhcHJpdi0+dGltX2JpdG1hcCAmPSB+Q0hLQklUKHBzdGEtPmFpZCk7Ci0KLQkJCS8qIHVwZGF0ZSBCQ04gZm9yIFRJTSBJRSAqLwotCQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgV0xBTl9FSURfVElNLCBOVUxMLCBmYWxzZSk7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci19Ci0KLSNlbmRpZgotCi12b2lkIHJ0d19zY3R4X2luaXQyM2Eoc3RydWN0IHN1Ym1pdF9jdHggKnNjdHgsIGludCB0aW1lb3V0X21zKQotewotCXNjdHgtPnRpbWVvdXRfbXMgPSB0aW1lb3V0X21zOwotCWluaXRfY29tcGxldGlvbigmc2N0eC0+ZG9uZSk7Ci0Jc2N0eC0+c3RhdHVzID0gUlRXX1NDVFhfU1VCTUlUVEVEOwotfQotCi1pbnQgcnR3X3NjdHhfd2FpdDIzYShzdHJ1Y3Qgc3VibWl0X2N0eCAqc2N0eCkKLXsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0JdW5zaWduZWQgbG9uZyBleHBpcmU7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQlleHBpcmUgPSBzY3R4LT50aW1lb3V0X21zID8gbXNlY3NfdG9famlmZmllcyhzY3R4LT50aW1lb3V0X21zKSA6Ci0JCSBNQVhfU0NIRURVTEVfVElNRU9VVDsKLQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmc2N0eC0+ZG9uZSwgZXhwaXJlKSkgewotCQkvKiB0aW1lb3V0LCBkbyBzb21ldGhpbmc/PyAqLwotCQlzdGF0dXMgPSBSVFdfU0NUWF9ET05FX1RJTUVPVVQ7Ci0JCURCR184NzIzQSgiJXMgdGltZW91dFxuIiwgX19mdW5jX18pOwotCX0gZWxzZSB7Ci0JCXN0YXR1cyA9IHNjdHgtPnN0YXR1czsKLQl9Ci0KLQlpZiAoc3RhdHVzID09IFJUV19TQ1RYX0RPTkVfU1VDQ0VTUykKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgYm9vbCBydHdfc2N0eF9jaGtfd2FyaW5nX3N0YXR1cyhpbnQgc3RhdHVzKQotewotCXN3aXRjaCAoc3RhdHVzKSB7Ci0JY2FzZSBSVFdfU0NUWF9ET05FX1VOS05PV046Ci0JY2FzZSBSVFdfU0NUWF9ET05FX0JVRl9BTExPQzoKLQljYXNlIFJUV19TQ1RYX0RPTkVfQlVGX0ZSRUU6Ci0JY2FzZSBSVFdfU0NUWF9ET05FX0RSVl9TVE9QOgotCWNhc2UgUlRXX1NDVFhfRE9ORV9ERVZfUkVNT1ZFOgotCQlyZXR1cm4gdHJ1ZTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotCi12b2lkIHJ0dzIzYV9zY3R4X2RvbmVfZXJyKHN0cnVjdCBzdWJtaXRfY3R4ICoqc2N0eCwgaW50IHN0YXR1cykKLXsKLQlpZiAoKnNjdHgpIHsKLQkJaWYgKHJ0d19zY3R4X2Noa193YXJpbmdfc3RhdHVzKHN0YXR1cykpCi0JCQlEQkdfODcyM0EoIiVzIHN0YXR1czolZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0JCSgqc2N0eCktPnN0YXR1cyA9IHN0YXR1czsKLQkJY29tcGxldGUoJigqc2N0eCktPmRvbmUpOwotCQkqc2N0eCA9IE5VTEw7Ci0JfQotfQotCi1pbnQgcnR3X2Fja190eF93YWl0MjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwgdTMyIHRpbWVvdXRfbXMpCi17Ci0Jc3RydWN0IHN1Ym1pdF9jdHggKnBhY2tfdHhfb3BzID0gJnB4bWl0cHJpdi0+YWNrX3R4X29wczsKLQotCXBhY2tfdHhfb3BzLT50aW1lb3V0X21zID0gdGltZW91dF9tczsKLQlwYWNrX3R4X29wcy0+c3RhdHVzID0gUlRXX1NDVFhfU1VCTUlUVEVEOwotCi0JcmV0dXJuIHJ0d19zY3R4X3dhaXQyM2EocGFja190eF9vcHMpOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWw4NzIzUHdyU2VxLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWw4NzIzUHdyU2VxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0N2Y4NmMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsODcyM1B3clNlcS5jCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJIYWw4NzIzUHdyU2VxLmgiCi0KLS8qCi0gICAgZHJpdmVycyBzaG91bGQgcGFyc2UgYmVsb3cgYXJyYXlzIGFuZCBkbyB0aGUgY29ycmVzcG9uZGluZyBhY3Rpb25zCi0qLwotLyogMyBQb3dlciBvbiAgQXJyYXkgKi8KLXN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX3Bvd2VyX29uX2Zsb3dbUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19BQ1RfU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXSA9IHsKLQlSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX0FDVAotCVJUTDg3MjNBX1RSQU5TX0VORAotfTsKLQotLyogMyBSYWRpbyBvZmYgR1BJTyBBcnJheSAqLwotc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfcmFkaW9fb2ZmX2Zsb3dbUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXSA9IHsKLQlSVEw4NzIzQV9UUkFOU19BQ1RfVE9fQ0FSREVNVQotCVJUTDg3MjNBX1RSQU5TX0VORAotfTsKLQotLyogMyBDYXJkIERpc2FibGUgQXJyYXkgKi8KLXN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX2NhcmRfZGlzYWJsZV9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU10gPSB7Ci0JUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVUKLQlSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX0NBUkRESVMKLQlSVEw4NzIzQV9UUkFOU19FTkQKLX07Ci0KLS8qIDMgQ2FyZCBFbmFibGUgQXJyYXkgKi8KLXN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX2NhcmRfZW5hYmxlX2Zsb3dbUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMrUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19QRE5fU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXSA9IHsKLQlSVEw4NzIzQV9UUkFOU19DQVJERElTX1RPX0NBUkRFTVUKLQlSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX0FDVAotCVJUTDg3MjNBX1RSQU5TX0VORAotfTsKLQotLyogMyBTdXNwZW5kIEFycmF5ICovCi1zdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg3MjNBVV9zdXNwZW5kX2Zsb3dbUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMrUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19TVVNfU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXSA9IHsKLQlSVEw4NzIzQV9UUkFOU19BQ1RfVE9fQ0FSREVNVQotCVJUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fU1VTCi0JUlRMODcyM0FfVFJBTlNfRU5ECi19OwotCi0vKiAzIFJlc3VtZSBBcnJheSAqLwotc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfcmVzdW1lX2Zsb3dbUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMrUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19TVVNfU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXSA9IHsKLQlSVEw4NzIzQV9UUkFOU19TVVNfVE9fQ0FSREVNVQotCVJUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fQUNUCi0JUlRMODcyM0FfVFJBTlNfRU5ECi19OwotCi0vKiAzIEhXUEROIEFycmF5ICovCi1zdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg3MjNBVV9od3Bkbl9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU10gPSB7Ci0JUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVUKLQlSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX1BETgotCVJUTDg3MjNBX1RSQU5TX0VORAotfTsKLQotLyogMyBFbnRlciBMUFMgKi8KLXN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX2VudGVyX2xwc19mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19MUFNfU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXSA9IHsKLQkvKiBGVyBiZWhhdmlvciAqLwotCVJUTDg3MjNBX1RSQU5TX0FDVF9UT19MUFMKLQlSVEw4NzIzQV9UUkFOU19FTkQKLX07Ci0KLS8qIDMgTGVhdmUgTFBTICovCi1zdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg3MjNBVV9sZWF2ZV9scHNfZmxvd1tSVEw4NzIzQV9UUkFOU19MUFNfVE9fQUNUX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU10gPSB7Ci0JLyogRlcgYmVoYXZpb3IgKi8KLQlSVEw4NzIzQV9UUkFOU19MUFNfVE9fQUNUCi0JUlRMODcyM0FfVFJBTlNfRU5ECi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsODcyM1VIV0ltZ19DRS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsODcyM1VIV0ltZ19DRS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjgzM2RhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbDg3MjNVSFdJbWdfQ0UuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLypDcmVhdGVkIG9uICAyMDEzLzAxLzE0LCAxNTo1MSovCi0jaW5jbHVkZSAib2RtX3ByZWNvbXAuaCIKLQotdTMyIFJ0bDg3MjNVUEhZX1JFR19BcnJheV9QR1tSdGw4NzIzVVBIWV9SRUdfQXJyYXlfUEdMZW5ndGhdID0gewotCTB4ZTAwLCAweGZmZmZmZmZmLCAweDBhMGMwYzBjLAotCTB4ZTA0LCAweGZmZmZmZmZmLCAweDAyMDQwNjA4LAotCTB4ZTA4LCAweDAwMDBmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ZTEwLCAweGZmZmZmZmZmLCAweDBhMGMwZDBlLAotCTB4ZTE0LCAweGZmZmZmZmZmLCAweDAyMDQwNjA4LAotCTB4ZTE4LCAweGZmZmZmZmZmLCAweDBhMGMwZDBlLAotCTB4ZTFjLCAweGZmZmZmZmZmLCAweDAyMDQwNjA4LAotCTB4ODMwLCAweGZmZmZmZmZmLCAweDBhMGMwYzBjLAotCTB4ODM0LCAweGZmZmZmZmZmLCAweDAyMDQwNjA4LAotCTB4ODM4LCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweDAwMDAwMGZmLCAweDAwMDAwMDAwLAotCTB4ODNjLCAweGZmZmZmZmZmLCAweDBhMGMwZDBlLAotCTB4ODQ4LCAweGZmZmZmZmZmLCAweDAyMDQwNjA4LAotCTB4ODRjLCAweGZmZmZmZmZmLCAweDBhMGMwZDBlLAotCTB4ODY4LCAweGZmZmZmZmZmLCAweDAyMDQwNjA4LAotCTB4ZTAwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTA0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTA4LCAweDAwMDBmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ZTEwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTFjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODMwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODM0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODM4LCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweDAwMDAwMGZmLCAweDAwMDAwMDAwLAotCTB4ODNjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODQ4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODRjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODY4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTAwLCAweGZmZmZmZmZmLCAweDA0MDQwNDA0LAotCTB4ZTA0LCAweGZmZmZmZmZmLCAweDAwMDIwMjA0LAotCTB4ZTA4LCAweDAwMDBmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ZTEwLCAweGZmZmZmZmZmLCAweDA2MDYwNjA2LAotCTB4ZTE0LCAweGZmZmZmZmZmLCAweDAwMDIwNDA2LAotCTB4ZTE4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTFjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODMwLCAweGZmZmZmZmZmLCAweDA0MDQwNDA0LAotCTB4ODM0LCAweGZmZmZmZmZmLCAweDAwMDIwMjA0LAotCTB4ODM4LCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweDAwMDAwMGZmLCAweDAwMDAwMDAwLAotCTB4ODNjLCAweGZmZmZmZmZmLCAweDA2MDYwNjA2LAotCTB4ODQ4LCAweGZmZmZmZmZmLCAweDAwMDIwNDA2LAotCTB4ODRjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODY4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTAwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTA0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTA4LCAweDAwMDBmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ZTEwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTFjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODMwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODM0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODM4LCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweDAwMDAwMGZmLCAweDAwMDAwMDAwLAotCTB4ODNjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODQ4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODRjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODY4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTAwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTA0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTA4LCAweDAwMDBmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ZTEwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTFjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODMwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODM0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODM4LCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweDAwMDAwMGZmLCAweDAwMDAwMDAwLAotCTB4ODNjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODQ4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODRjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODY4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTAwLCAweGZmZmZmZmZmLCAweDA0MDQwNDA0LAotCTB4ZTA0LCAweGZmZmZmZmZmLCAweDAwMDIwMjA0LAotCTB4ZTA4LCAweDAwMDBmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ZTEwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTFjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODMwLCAweGZmZmZmZmZmLCAweDA0MDQwNDA0LAotCTB4ODM0LCAweGZmZmZmZmZmLCAweDAwMDIwMjA0LAotCTB4ODM4LCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweDAwMDAwMGZmLCAweDAwMDAwMDAwLAotCTB4ODNjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODQ4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODRjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODY4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTAwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTA0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTA4LCAweDAwMDBmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ZTEwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTFjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODMwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODM0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODM4LCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweDAwMDAwMGZmLCAweDAwMDAwMDAwLAotCTB4ODNjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODQ4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODRjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODY4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCX07Ci0KLXUzMiBSdGw4NzIzVU1BQ1BIWV9BcnJheV9QR1tSdGw4NzIzVU1BQ1BIWV9BcnJheV9QR0xlbmd0aF0gPSB7Ci0JMHgwLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbERNT3V0U3JjODcyM0FfQ0UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbERNT3V0U3JjODcyM0FfQ0UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y5ZWM5ZTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsRE1PdXRTcmM4NzIzQV9DRS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICBEZXNjcmlwdGlvbjogKi8KLS8qICBUaGlzIGZpbGUgaXMgZm9yIDkyQ0UvOTJDVSBkeW5hbWljIG1lY2hhbmlzbSBvbmx5ICovCi0KLS8qICBpbmNsdWRlIGZpbGVzICovCi0KLSNpbmNsdWRlICJvZG1fcHJlY29tcC5oIgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotI2RlZmluZQkJRFBLX0RFTFRBX01BUFBJTkdfTlVNCTEzCi0jZGVmaW5lCQlpbmRleF9tYXBwaW5nX0hQX05VTQkxNQotLyogMDkxMjEyIGNoaXlva29saW4gKi8KLXN0YXRpYyB2b2lkCi1vZG1fVFhQb3dlclRyYWNraW5nQ2FsbGJhY2tfVGhlcm1hbE1ldGVyXzkyQyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCXU4IFRoZXJtYWxWYWx1ZSA9IDAsIGRlbHRhLCBkZWx0YV9MQ0ssIGRlbHRhX0lRSywgZGVsdGFfSFA7Ci0JaW50IGVsZV9BLCBlbGVfRCwgVGVtcENDaywgWCwgdmFsdWUzMjsKLQlpbnQgWSwgZWxlX0M7Ci0JczggT0ZETV9pbmRleFsyXSwgQ0NLX2luZGV4ID0gMCwgT0ZETV9pbmRleF9vbGRbMl0gPSB7MH07Ci0JczggQ0NLX2luZGV4X29sZCA9IDA7Ci0JaW50IGkgPSAwOwotCXU4IE9GRE1fbWluX2luZGV4ID0gNiwgcmY7IC8qIE9GRE0gQkIgU3dpbmcgc2hvdWxkIGJlIGxlc3MgdGhhbiArMy4wZEIqLwotCXU4IFRoZXJtYWxWYWx1ZV9IUF9jb3VudCA9IDA7Ci0JdTMyIFRoZXJtYWxWYWx1ZV9IUCA9IDA7Ci0JczMyIGluZGV4X21hcHBpbmdfSFBbaW5kZXhfbWFwcGluZ19IUF9OVU1dID0gewotCQkwLCAxLCAzLCA0LCA2LAotCQk3LCA5LCAxMCwgMTIsIDEzLAotCQkxNSwgMTYsIDE4LCAxOSwgMjEKLQl9OwotCXM4IGluZGV4X0hQOwotCi0JcGRtcHJpdi0+VFhQb3dlclRyYWNraW5nQ2FsbGJhY2tDbnQrKzsJLyogY29zYSBhZGQgZm9yIGRlYnVnICovCi0JcGRtcHJpdi0+YlRYUG93ZXJUcmFja2luZ0luaXQgPSB0cnVlOwotCi0JaWYgKHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbCA9PSAxNCAmJiAhcGRtcHJpdi0+YkNDS2luQ0gxNCkKLQkJcGRtcHJpdi0+YkNDS2luQ0gxNCA9IHRydWU7Ci0JZWxzZSBpZiAocEhhbERhdGEtPkN1cnJlbnRDaGFubmVsICE9IDE0ICYmIHBkbXByaXYtPmJDQ0tpbkNIMTQpCi0JCXBkbXByaXYtPmJDQ0tpbkNIMTQgPSBmYWxzZTsKLQotCVRoZXJtYWxWYWx1ZSA9ICh1OClQSFlfUXVlcnlSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0EsIFJGX1RfTUVURVIsCi0JCQkJCSAgMHgxZik7LyogIDB4MjQ6IFJGIFJlZ1s0OjBdCSAqLwotCi0JcnRsODcyM2FfcGh5X2FwX2NhbGlicmF0ZShBZGFwdGVyLCAoVGhlcm1hbFZhbHVlIC0KLQkJCQkgIHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIpKTsKLQotCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8yVDJSKQotCQlyZiA9IDI7Ci0JZWxzZQotCQlyZiA9IDE7Ci0KLQlpZiAoVGhlcm1hbFZhbHVlKSB7Ci0JCS8qIFF1ZXJ5IE9GRE0gcGF0aCBBIGRlZmF1bHQgc2V0dGluZwkgKi8KLQkJZWxlX0QgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UpICYKLQkJCWJNYXNrT0ZETV9EOwotCQlmb3IgKGkgPSAwOyBpIDwgT0ZETV9UQUJMRV9TSVpFXzkyQzsgaSsrKSB7Ci0JCQkvKiBmaW5kIHRoZSBpbmRleCAqLwotCQkJaWYgKGVsZV9EID09IChPRkRNU3dpbmdUYWJsZTIzQVtpXSZiTWFza09GRE1fRCkpIHsKLQkJCQlPRkRNX2luZGV4X29sZFswXSA9ICh1OClpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLyogUXVlcnkgT0ZETSBwYXRoIEIgZGVmYXVsdCBzZXR0aW5nICAqLwotCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMlQyUikgewotCQkJZWxlX0QgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsCi0JCQkJCQkgck9GRE0wX1hCVHhJUUltYmFsYW5jZSk7Ci0JCQllbGVfRCAmPSBiTWFza09GRE1fRDsKLQkJCWZvciAoaSA9IDA7IGkgPCBPRkRNX1RBQkxFX1NJWkVfOTJDOyBpKyspIHsJLyogZmluZCB0aGUgaW5kZXggICovCi0JCQkJaWYgKGVsZV9EID09IChPRkRNU3dpbmdUYWJsZTIzQVtpXSZiTWFza09GRE1fRCkpIHsKLQkJCQkJT0ZETV9pbmRleF9vbGRbMV0gPSAodTgpaTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyogUXVlcnkgQ0NLIGRlZmF1bHQgc2V0dGluZyBGcm9tIDB4YTI0ICovCi0JCVRlbXBDQ2sgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIHJDQ0swX1R4RmlsdGVyMikgJiBiTWFza0NDSzsKLQkJZm9yIChpID0gMCA7IGkgPCBDQ0tfVEFCTEVfU0laRSA7IGkrKykgewotCQkJaWYgKHBkbXByaXYtPmJDQ0tpbkNIMTQpIHsKLQkJCQlpZiAoIW1lbWNtcCgmVGVtcENDaywKLQkJCQkJICAgICZDQ0tTd2luZ1RhYmxlX0NoMTQyM0FbaV1bMl0sIDQpKSB7Ci0JCQkJCUNDS19pbmRleF9vbGQgPSAodTgpaTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIW1lbWNtcCgmVGVtcENDaywKLQkJCQkJICAgICZDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzMjNBW2ldWzJdLCA0KSkgewotCQkJCQlDQ0tfaW5kZXhfb2xkID0gKHU4KWk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcGRtcHJpdi0+VGhlcm1hbFZhbHVlKSB7Ci0JCQlwZG1wcml2LT5UaGVybWFsVmFsdWUgPSBwSGFsRGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyOwotCQkJcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0xDSyA9IFRoZXJtYWxWYWx1ZTsKLQkJCXBkbXByaXYtPlRoZXJtYWxWYWx1ZV9JUUsgPSBUaGVybWFsVmFsdWU7Ci0JCQlwZG1wcml2LT5UaGVybWFsVmFsdWVfRFBLID0gcEhhbERhdGEtPkVFUFJPTVRoZXJtYWxNZXRlcjsKLQotCQkJZm9yIChpID0gMDsgaSA8IHJmOyBpKyspIHsKLQkJCQlwZG1wcml2LT5PRkRNX2luZGV4X0hQW2ldID0gT0ZETV9pbmRleF9vbGRbaV07Ci0JCQkJcGRtcHJpdi0+T0ZETV9pbmRleFtpXSA9IE9GRE1faW5kZXhfb2xkW2ldOwotCQkJfQotCQkJcGRtcHJpdi0+Q0NLX2luZGV4X0hQID0gQ0NLX2luZGV4X29sZDsKLQkJCXBkbXByaXYtPkNDS19pbmRleCA9IENDS19pbmRleF9vbGQ7Ci0JCX0KLQotCQlpZiAocEhhbERhdGEtPkJvYXJkVHlwZSA9PSBCT0FSRF9VU0JfSGlnaF9QQSkgewotCQkJcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0hQW3BkbXByaXYtPlRoZXJtYWxWYWx1ZV9IUF9pbmRleF0gPSBUaGVybWFsVmFsdWU7Ci0JCQlwZG1wcml2LT5UaGVybWFsVmFsdWVfSFBfaW5kZXgrKzsKLQkJCWlmIChwZG1wcml2LT5UaGVybWFsVmFsdWVfSFBfaW5kZXggPT0gSFBfVEhFUk1BTF9OVU0pCi0JCQkJcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0hQX2luZGV4ID0gMDsKLQotCQkJZm9yIChpID0gMDsgaSA8IEhQX1RIRVJNQUxfTlVNOyBpKyspIHsKLQkJCQlpZiAocGRtcHJpdi0+VGhlcm1hbFZhbHVlX0hQW2ldKSB7Ci0JCQkJCVRoZXJtYWxWYWx1ZV9IUCArPSBwZG1wcml2LT5UaGVybWFsVmFsdWVfSFBbaV07Ci0JCQkJCVRoZXJtYWxWYWx1ZV9IUF9jb3VudCsrOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKFRoZXJtYWxWYWx1ZV9IUF9jb3VudCkKLQkJCQlUaGVybWFsVmFsdWUgPSAodTgpKFRoZXJtYWxWYWx1ZV9IUCAvIFRoZXJtYWxWYWx1ZV9IUF9jb3VudCk7Ci0JCX0KLQotCQlkZWx0YSA9IChUaGVybWFsVmFsdWUgPiBwZG1wcml2LT5UaGVybWFsVmFsdWUpID8KLQkJCShUaGVybWFsVmFsdWUgLSBwZG1wcml2LT5UaGVybWFsVmFsdWUpIDoKLQkJCShwZG1wcml2LT5UaGVybWFsVmFsdWUgLSBUaGVybWFsVmFsdWUpOwotCQlpZiAocEhhbERhdGEtPkJvYXJkVHlwZSA9PSBCT0FSRF9VU0JfSGlnaF9QQSkgewotCQkJaWYgKHBkbXByaXYtPmJEb25lVHhwb3dlcikKLQkJCQlkZWx0YV9IUCA9IChUaGVybWFsVmFsdWUgPiBwZG1wcml2LT5UaGVybWFsVmFsdWUpID8KLQkJCQkJICAgKFRoZXJtYWxWYWx1ZSAtIHBkbXByaXYtPlRoZXJtYWxWYWx1ZSkgOgotCQkJCQkgICAocGRtcHJpdi0+VGhlcm1hbFZhbHVlIC0gVGhlcm1hbFZhbHVlKTsKLQkJCWVsc2UKLQkJCQlkZWx0YV9IUCA9IFRoZXJtYWxWYWx1ZSA+IHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgPwotCQkJCQkgICAoVGhlcm1hbFZhbHVlIC0gcEhhbERhdGEtPkVFUFJPTVRoZXJtYWxNZXRlcikgOgotCQkJCQkgICAocEhhbERhdGEtPkVFUFJPTVRoZXJtYWxNZXRlciAtIFRoZXJtYWxWYWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlkZWx0YV9IUCA9IDA7Ci0JCX0KLQkJZGVsdGFfTENLID0gKFRoZXJtYWxWYWx1ZSA+IHBkbXByaXYtPlRoZXJtYWxWYWx1ZV9MQ0spID8KLQkJCSAgICAoVGhlcm1hbFZhbHVlIC0gcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0xDSykgOgotCQkJICAgIChwZG1wcml2LT5UaGVybWFsVmFsdWVfTENLIC0gVGhlcm1hbFZhbHVlKTsKLQkJZGVsdGFfSVFLID0gKFRoZXJtYWxWYWx1ZSA+IHBkbXByaXYtPlRoZXJtYWxWYWx1ZV9JUUspID8KLQkJCSAgICAoVGhlcm1hbFZhbHVlIC0gcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0lRSykgOgotCQkJICAgIChwZG1wcml2LT5UaGVybWFsVmFsdWVfSVFLIC0gVGhlcm1hbFZhbHVlKTsKLQotCQlpZiAoZGVsdGFfTENLID4gMSkgewotCQkJcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0xDSyA9IFRoZXJtYWxWYWx1ZTsKLQkJCXJ0bDg3MjNhX3BoeV9sY19jYWxpYnJhdGUoQWRhcHRlcik7Ci0JCX0KLQotCQlpZiAoKGRlbHRhID4gMCB8fCBkZWx0YV9IUCA+IDApICYmIHBkbXByaXYtPlR4UG93ZXJUcmFja0NvbnRyb2wpIHsKLQkJCWlmIChwSGFsRGF0YS0+Qm9hcmRUeXBlID09IEJPQVJEX1VTQl9IaWdoX1BBKSB7Ci0JCQkJcGRtcHJpdi0+YkRvbmVUeHBvd2VyID0gdHJ1ZTsKLQkJCQlkZWx0YV9IUCA9IFRoZXJtYWxWYWx1ZSA+IHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgPwotCQkJCQkgICAoVGhlcm1hbFZhbHVlIC0gcEhhbERhdGEtPkVFUFJPTVRoZXJtYWxNZXRlcikgOgotCQkJCQkgICAocEhhbERhdGEtPkVFUFJPTVRoZXJtYWxNZXRlciAtIFRoZXJtYWxWYWx1ZSk7Ci0KLQkJCQlpZiAoZGVsdGFfSFAgPiBpbmRleF9tYXBwaW5nX0hQX05VTS0xKQotCQkJCQlpbmRleF9IUCA9IGluZGV4X21hcHBpbmdfSFBbaW5kZXhfbWFwcGluZ19IUF9OVU0tMV07Ci0JCQkJZWxzZQotCQkJCQlpbmRleF9IUCA9IGluZGV4X21hcHBpbmdfSFBbZGVsdGFfSFBdOwotCi0JCQkJaWYgKFRoZXJtYWxWYWx1ZSA+IHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIpIHsKLQkJCQkJLyogc2V0IGxhcmdlciBUeCBwb3dlciAqLwotCQkJCQlmb3IgKGkgPSAwOyBpIDwgcmY7IGkrKykKLQkJCQkJCU9GRE1faW5kZXhbaV0gPSBwZG1wcml2LT5PRkRNX2luZGV4X0hQW2ldIC0gaW5kZXhfSFA7Ci0JCQkJCUNDS19pbmRleCA9IHBkbXByaXYtPkNDS19pbmRleF9IUCAtIGluZGV4X0hQOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvciAoaSA9IDA7IGkgPCByZjsgaSsrKQotCQkJCQkJT0ZETV9pbmRleFtpXSA9IHBkbXByaXYtPk9GRE1faW5kZXhfSFBbaV0gKyBpbmRleF9IUDsKLQkJCQkJQ0NLX2luZGV4ID0gcGRtcHJpdi0+Q0NLX2luZGV4X0hQICsgaW5kZXhfSFA7Ci0JCQkJfQotCi0JCQkJZGVsdGFfSFAgPSAoVGhlcm1hbFZhbHVlID4gcGRtcHJpdi0+VGhlcm1hbFZhbHVlKSA/Ci0JCQkJCSAgIChUaGVybWFsVmFsdWUgLSBwZG1wcml2LT5UaGVybWFsVmFsdWUpIDoKLQkJCQkJICAgKHBkbXByaXYtPlRoZXJtYWxWYWx1ZSAtIFRoZXJtYWxWYWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChUaGVybWFsVmFsdWUgPiBwZG1wcml2LT5UaGVybWFsVmFsdWUpIHsKLQkJCQkJZm9yIChpID0gMDsgaSA8IHJmOyBpKyspCi0JCQkJCQlwZG1wcml2LT5PRkRNX2luZGV4W2ldIC09IGRlbHRhOwotCQkJCQlwZG1wcml2LT5DQ0tfaW5kZXggLT0gZGVsdGE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm9yIChpID0gMDsgaSA8IHJmOyBpKyspCi0JCQkJCQlwZG1wcml2LT5PRkRNX2luZGV4W2ldICs9IGRlbHRhOwotCQkJCQlwZG1wcml2LT5DQ0tfaW5kZXggKz0gZGVsdGE7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBubyBhZGp1c3QgKi8KLQkJCWlmIChwSGFsRGF0YS0+Qm9hcmRUeXBlICE9IEJPQVJEX1VTQl9IaWdoX1BBKSB7Ci0JCQkJaWYgKFRoZXJtYWxWYWx1ZSA+IHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIpIHsKLQkJCQkJZm9yIChpID0gMDsgaSA8IHJmOyBpKyspCi0JCQkJCQlPRkRNX2luZGV4W2ldID0gcGRtcHJpdi0+T0ZETV9pbmRleFtpXSsxOwotCQkJCQlDQ0tfaW5kZXggPSBwZG1wcml2LT5DQ0tfaW5kZXgrMTsKLQkJCQl9IGVsc2UgewotCQkJCQlmb3IgKGkgPSAwOyBpIDwgcmY7IGkrKykKLQkJCQkJCU9GRE1faW5kZXhbaV0gPSBwZG1wcml2LT5PRkRNX2luZGV4W2ldOwotCQkJCQlDQ0tfaW5kZXggPSBwZG1wcml2LT5DQ0tfaW5kZXg7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChpID0gMDsgaSA8IHJmOyBpKyspIHsKLQkJCQlpZiAoT0ZETV9pbmRleFtpXSA+IChPRkRNX1RBQkxFX1NJWkVfOTJDLTEpKQotCQkJCQlPRkRNX2luZGV4W2ldID0gKE9GRE1fVEFCTEVfU0laRV85MkMtMSk7Ci0JCQkJZWxzZSBpZiAoT0ZETV9pbmRleFtpXSA8IE9GRE1fbWluX2luZGV4KQotCQkJCQlPRkRNX2luZGV4W2ldID0gT0ZETV9taW5faW5kZXg7Ci0JCQl9Ci0KLQkJCWlmIChDQ0tfaW5kZXggPiAoQ0NLX1RBQkxFX1NJWkUtMSkpCi0JCQkJQ0NLX2luZGV4ID0gQ0NLX1RBQkxFX1NJWkUtMTsKLQkJCWVsc2UgaWYgKENDS19pbmRleCA8IDApCi0JCQkJQ0NLX2luZGV4ID0gMDsKLQkJfQotCi0JCWlmIChwZG1wcml2LT5UeFBvd2VyVHJhY2tDb250cm9sICYmCi0JCSAgICAoZGVsdGEgIT0gMCB8fCBkZWx0YV9IUCAhPSAwKSkgewotCQkJLyogQWR1anN0IE9GRE0gQW50X0EgYWNjb3JkaW5nIHRvIElRSyByZXN1bHQgKi8KLQkJCWVsZV9EID0gKE9GRE1Td2luZ1RhYmxlMjNBW09GRE1faW5kZXhbMF1dICYgMHhGRkMwMDAwMCk+PjIyOwotCQkJWCA9IHBkbXByaXYtPlJlZ0U5NDsKLQkJCVkgPSBwZG1wcml2LT5SZWdFOUM7Ci0KLQkJCWlmIChYICE9IDApIHsKLQkJCQlpZiAoKFggJiAweDAwMDAwMjAwKSAhPSAwKQotCQkJCQlYID0gWCB8IDB4RkZGRkZDMDA7Ci0JCQkJZWxlX0EgPSAoKFggKiBlbGVfRCk+PjgpJjB4MDAwMDAzRkY7Ci0KLQkJCQkvKiBuZXcgZWxlbWVudCBDID0gZWxlbWVudCBEIHggWSAqLwotCQkJCWlmICgoWSAmIDB4MDAwMDAyMDApICE9IDApCi0JCQkJCVkgPSBZIHwgMHhGRkZGRkMwMDsKLQkJCQllbGVfQyA9ICgoWSAqIGVsZV9EKT4+OCkmMHgwMDAwMDNGRjsKLQotCQkJCS8qIHdyaXRlIG5ldyBlbGVtZW50cyBBLCBDLCBEIHRvIHJlZ0M4MCBhbmQgcmVnQzk0LCBlbGVtZW50IEIgaXMgYWx3YXlzIDAgKi8KLQkJCQl2YWx1ZTMyID0gKGVsZV9EPDwyMil8KChlbGVfQyYweDNGKTw8MTYpfGVsZV9BOwotCQkJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsCi0JCQkJCQkgIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsCi0JCQkJCQkgIHZhbHVlMzIpOwotCi0JCQkJdmFsdWUzMiA9IChlbGVfQyYweDAwMDAwM0MwKT4+NjsKLQkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0wX1hDVHhBRkUsIGJNYXNrSDRCaXRzLCB2YWx1ZTMyKTsKLQotCQkJCXZhbHVlMzIgPSAoKFggKiBlbGVfRCk+PjcpJjB4MDE7Ci0JCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLAotCQkJCQkgICAgIEJJVCgzMSksIHZhbHVlMzIpOwotCi0JCQkJdmFsdWUzMiA9ICgoWSAqIGVsZV9EKT4+NykmMHgwMTsKLQkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0wX0VDQ0FUaHJlc2hvbGQsCi0JCQkJCSAgICAgQklUKDI5KSwgdmFsdWUzMik7Ci0JCQl9IGVsc2UgewotCQkJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsCi0JCQkJCQkgIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsCi0JCQkJCQkgIE9GRE1Td2luZ1RhYmxlMjNBW09GRE1faW5kZXhbMF1dKTsKLQkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0wX1hDVHhBRkUsCi0JCQkJCSAgICAgYk1hc2tINEJpdHMsIDB4MDApOwotCQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByT0ZETTBfRUNDQVRocmVzaG9sZCwKLQkJCQkJICAgICBCSVQoMzEpIHwgQklUKDI5KSwgMHgwMCk7Ci0JCQl9Ci0KLQkJCS8qIEFkanVzdCBDQ0sgYWNjb3JkaW5nIHRvIElRSyByZXN1bHQgKi8KLQkJCWlmICghcGRtcHJpdi0+YkNDS2luQ0gxNCkgewotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjIsIENDS1N3aW5nVGFibGVfQ2gxX0NoMTMyM0FbQ0NLX2luZGV4XVswXSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGEyMywgQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxMzIzQVtDQ0tfaW5kZXhdWzFdKTsKLQkJCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4YTI0LCBDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzMjNBW0NDS19pbmRleF1bMl0pOwotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjUsIENDS1N3aW5nVGFibGVfQ2gxX0NoMTMyM0FbQ0NLX2luZGV4XVszXSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGEyNiwgQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxMzIzQVtDQ0tfaW5kZXhdWzRdKTsKLQkJCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4YTI3LCBDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzMjNBW0NDS19pbmRleF1bNV0pOwotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjgsIENDS1N3aW5nVGFibGVfQ2gxX0NoMTMyM0FbQ0NLX2luZGV4XVs2XSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGEyOSwgQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxMzIzQVtDQ0tfaW5kZXhdWzddKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGEyMiwgQ0NLU3dpbmdUYWJsZV9DaDE0MjNBW0NDS19pbmRleF1bMF0pOwotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjMsIENDS1N3aW5nVGFibGVfQ2gxNDIzQVtDQ0tfaW5kZXhdWzFdKTsKLQkJCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4YTI0LCBDQ0tTd2luZ1RhYmxlX0NoMTQyM0FbQ0NLX2luZGV4XVsyXSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGEyNSwgQ0NLU3dpbmdUYWJsZV9DaDE0MjNBW0NDS19pbmRleF1bM10pOwotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjYsIENDS1N3aW5nVGFibGVfQ2gxNDIzQVtDQ0tfaW5kZXhdWzRdKTsKLQkJCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4YTI3LCBDQ0tTd2luZ1RhYmxlX0NoMTQyM0FbQ0NLX2luZGV4XVs1XSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGEyOCwgQ0NLU3dpbmdUYWJsZV9DaDE0MjNBW0NDS19pbmRleF1bNl0pOwotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjksIENDS1N3aW5nVGFibGVfQ2gxNDIzQVtDQ0tfaW5kZXhdWzddKTsKLQkJCX0KLQotCQkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIpIHsKLQkJCQllbGVfRCA9IChPRkRNU3dpbmdUYWJsZTIzQVsodTgpT0ZETV9pbmRleFsxXV0gJiAweEZGQzAwMDAwKT4+MjI7Ci0KLQkJCQkvKiBuZXcgZWxlbWVudCBBID0gZWxlbWVudCBEIHggWCAqLwotCQkJCVggPSBwZG1wcml2LT5SZWdFQjQ7Ci0JCQkJWSA9IHBkbXByaXYtPlJlZ0VCQzsKLQotCQkJCWlmIChYICE9IDApIHsKLQkJCQkJaWYgKChYICYgMHgwMDAwMDIwMCkgIT0gMCkJLyogY29uc2lkZXIgbWludXMgKi8KLQkJCQkJCVggPSBYIHwgMHhGRkZGRkMwMDsKLQkJCQkJZWxlX0EgPSAoKFggKiBlbGVfRCk+PjgpJjB4MDAwMDAzRkY7Ci0KLQkJCQkJLyogbmV3IGVsZW1lbnQgQyA9IGVsZW1lbnQgRCB4IFkgKi8KLQkJCQkJaWYgKChZICYgMHgwMDAwMDIwMCkgIT0gMCkKLQkJCQkJCVkgPSBZIHwgMHhGRkZGRkMwMDsKLQkJCQkJZWxlX0MgPSAoKFkgKiBlbGVfRCk+PjgpJjB4MDAwMDNGRjsKLQotCQkJCQkvKiB3cml0ZSBuZXcgZWxlbWVudHMgQSwgQywgRCB0byByZWdDODggYW5kIHJlZ0M5QywgZWxlbWVudCBCIGlzIGFsd2F5cyAwICovCi0JCQkJCXZhbHVlMzIgPSAoZWxlX0Q8PDIyKXwoKGVsZV9DJjB4M0YpPDwxNikgfCBlbGVfQTsKLQkJCQkJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgck9GRE0wX1hCVHhJUUltYmFsYW5jZSwgdmFsdWUzMik7Ci0KLQkJCQkJdmFsdWUzMiA9IChlbGVfQyYweDAwMDAwM0MwKT4+NjsKLQkJCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9YRFR4QUZFLCBiTWFza0g0Qml0cywgdmFsdWUzMik7Ci0KLQkJCQkJdmFsdWUzMiA9ICgoWCAqIGVsZV9EKT4+NykmMHgwMTsKLQkJCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsCi0JCQkJCQkgICAgIHJPRkRNMF9FQ0NBVGhyZXNob2xkLAotCQkJCQkJICAgICBCSVQoMjcpLCB2YWx1ZTMyKTsKLQotCQkJCQl2YWx1ZTMyID0gKChZICogZWxlX0QpPj43KSYweDAxOwotCQkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwKLQkJCQkJCSAgICAgck9GRE0wX0VDQ0FUaHJlc2hvbGQsCi0JCQkJCQkgICAgIEJJVCgyNSksIHZhbHVlMzIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsCi0JCQkJCQkJICByT0ZETTBfWEJUeElRSW1iYWxhbmNlLAotCQkJCQkJCSAgT0ZETVN3aW5nVGFibGUyM0FbT0ZETV9pbmRleFsxXV0pOwotCQkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwKLQkJCQkJCSAgICAgck9GRE0wX1hEVHhBRkUsCi0JCQkJCQkgICAgIGJNYXNrSDRCaXRzLCAweDAwKTsKLQkJCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsCi0JCQkJCQkgICAgIHJPRkRNMF9FQ0NBVGhyZXNob2xkLAotCQkJCQkJICAgICBCSVQoMjcpIHwgQklUKDI1KSwgMHgwMCk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJaWYgKGRlbHRhX0lRSyA+IDMpIHsKLQkJCXBkbXByaXYtPlRoZXJtYWxWYWx1ZV9JUUsgPSBUaGVybWFsVmFsdWU7Ci0JCQlydGw4NzIzYV9waHlfaXFfY2FsaWJyYXRlKEFkYXB0ZXIsIGZhbHNlKTsKLQkJfQotCi0JCS8qIHVwZGF0ZSB0aGVybWFsIG1ldGVyIHZhbHVlICovCi0JCWlmIChwZG1wcml2LT5UeFBvd2VyVHJhY2tDb250cm9sKQotCQkJcGRtcHJpdi0+VGhlcm1hbFZhbHVlID0gVGhlcm1hbFZhbHVlOwotCX0KLQlwZG1wcml2LT5UWFBvd2VyY291bnQgPSAwOwotfQotCi0vKglEZXNjcmlwdGlvbjogKi8KLS8qCQktIERpc3BhdGNoIFR4UG93ZXIgVHJhY2tpbmcgZGlyZWN0IGNhbGwgT05MWSBmb3IgOTJzLiAqLwotLyoJCS0gV2Ugc2hhbGwgTk9UIHNjaGVkdWxlIFdvcmtpdGVtIHdpdGhpbiBQQVNTSVZFIExFVkVMLCB3aGljaCB3aWxsIGNhdXNlIHN5c3RlbSByZXNvdXJjZSAqLwotLyoJCSAgIGxlYWthZ2UgdW5kZXIgc29tZSBwbGF0Zm9ybS4gKi8KLS8qCUFzc3VtcHRpb246ICovCi0vKgkJUEFTU0lWRV9MRVZFTCB3aGVuIHRoaXMgcm91dGluZSBpcyBjYWxsZWQuICovCi1zdGF0aWMgdm9pZCBPRE1fVFhQb3dlclRyYWNraW5nOTJDRGlyZWN0Q2FsbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jb2RtX1RYUG93ZXJUcmFja2luZ0NhbGxiYWNrX1RoZXJtYWxNZXRlcl85MkMoQWRhcHRlcik7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffb2RtX2NoZWNrX3R4X3Bvd2VyX3RyYWNraW5nKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2ICpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0KLQlpZiAoIXBkbXByaXYtPlRNX1RyaWdnZXIpIHsJCS8qIGF0IGxlYXN0IGRlbGF5IDEgc2VjICovCi0JCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0EsIFJGX1RfTUVURVIsIGJSRlJlZ09mZnNldE1hc2ssIDB4NjApOwotCi0JCXBkbXByaXYtPlRNX1RyaWdnZXIgPSAxOwotCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJT0RNX1RYUG93ZXJUcmFja2luZzkyQ0RpcmVjdENhbGwoQWRhcHRlcik7Ci0JCXBkbXByaXYtPlRNX1RyaWdnZXIgPSAwOwotCX0KLX0KLQotLyoJSVFLICovCi0jZGVmaW5lIE1BWF9UT0xFUkFOQ0UJCTUKLSNkZWZpbmUgSVFLX0RFTEFZX1RJTUUJCTEJLyogbXMgKi8KLQotc3RhdGljIHU4IF9QSFlfUGF0aEFfSVFLKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIGJvb2wgY29uZmlnUGF0aEIpCi17Ci0JdTMyIHJlZ0VBQywgcmVnRTk0LCByZWdFOUMsIHJlZ0VBNDsKLQl1OCByZXN1bHQgPSAweDAwOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOwotCi0JLyogcGF0aC1BIElRSyBzZXR0aW5nICovCi0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJUeF9JUUtfVG9uZV9BLCAweDEwMDA4YzFmKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclJ4X0lRS19Ub25lX0EsIDB4MTAwMDhjMWYpOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByVHhfSVFLX1BJX0EsIDB4ODIxNDAxMDIpOwotCi0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJSeF9JUUtfUElfQSwgY29uZmlnUGF0aEIgPyAweDI4MTYwMjAyIDoKLQkJSVNfODF4eENfVkVORE9SX1VNQ19CX0NVVChwSGFsRGF0YS0+VmVyc2lvbklEKT8weDI4MTYwMjAyOjB4MjgxNjA1MDIpOwotCi0JLyogcGF0aC1CIElRSyBzZXR0aW5nICovCi0JaWYgKGNvbmZpZ1BhdGhCKSB7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByVHhfSVFLX1RvbmVfQiwgMHgxMDAwOGMyMik7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByUnhfSVFLX1RvbmVfQiwgMHgxMDAwOGMyMik7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByVHhfSVFLX1BJX0IsIDB4ODIxNDAxMDIpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclJ4X0lRS19QSV9CLCAweDI4MTYwMjAyKTsKLQl9Ci0KLQkvKiBMTyBjYWxpYnJhdGlvbiBzZXR0aW5nICovCi0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJJUUtfQUdDX1JzcCwgMHgwMDEwMjhkMSk7Ci0KLQkvKiBPbmUgc2hvdCwgcGF0aCBBIExPSyAmIElRSyAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCBySVFLX0FHQ19QdHMsIDB4ZjkwMDAwMDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCBySVFLX0FHQ19QdHMsIDB4ZjgwMDAwMDApOwotCi0JLyogIGRlbGF5IHggbXMgKi8KLQkvKiBQbGF0Zm9ybVN0YWxsRXhlY3V0aW9uKElRS19ERUxBWV9USU1FKjEwMDApOyAqLwotCXVkZWxheShJUUtfREVMQVlfVElNRSoxMDAwKTsKLQotCS8qICBDaGVjayBmYWlsZWQgKi8KLQlyZWdFQUMgPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByUnhfUG93ZXJfQWZ0ZXJfSVFLX0FfMik7Ci0JcmVnRTk0ID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQSk7Ci0JcmVnRTlDID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0FmdGVyX0lRS19BKTsKLQlyZWdFQTQgPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByUnhfUG93ZXJfQmVmb3JlX0lRS19BXzIpOwotCi0JaWYgKCEocmVnRUFDICYgQklUKDI4KSkgJiYKLQkgICAgKCgocmVnRTk0ICYgMHgwM0ZGMDAwMCk+PjE2KSAhPSAweDE0MikgJiYKLQkgICAgKCgocmVnRTlDICYgMHgwM0ZGMDAwMCk+PjE2KSAhPSAweDQyKSkKLQkJcmVzdWx0IHw9IDB4MDE7Ci0JZWxzZQkJCS8qIGlmIFR4IG5vdCBPSywgaWdub3JlIFJ4ICovCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlpZiAoIShyZWdFQUMgJiBCSVQoMjcpKSAmJiAvKiBpZiBUeCBpcyBPSywgY2hlY2sgd2hldGhlciBSeCBpcyBPSyAqLwotCSAgICAoKChyZWdFQTQgJiAweDAzRkYwMDAwKT4+MTYpICE9IDB4MTMyKSAmJgotCSAgICAoKChyZWdFQUMgJiAweDAzRkYwMDAwKT4+MTYpICE9IDB4MzYpKQotCQlyZXN1bHQgfD0gMHgwMjsKLQllbHNlCi0JCURCR184NzIzQSgiUGF0aCBBIFJ4IElRSyBmYWlsISFcbiIpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB1OCBfUEhZX1BhdGhCX0lRSyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyKQotewotCXUzMiByZWdFQUMsIHJlZ0VCNCwgcmVnRUJDLCByZWdFQzQsIHJlZ0VDQzsKLQl1OCByZXN1bHQgPSAweDAwOwotCi0JLyogT25lIHNob3QsIHBhdGggQiBMT0sgJiBJUUsgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgcklRS19BR0NfQ29udCwgMHgwMDAwMDAwMik7Ci0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJJUUtfQUdDX0NvbnQsIDB4MDAwMDAwMDApOwotCi0JLyogIGRlbGF5IHggbXMgKi8KLQl1ZGVsYXkoSVFLX0RFTEFZX1RJTUUqMTAwMCk7Ci0KLQkvKiAgQ2hlY2sgZmFpbGVkICovCi0JcmVnRUFDID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0FmdGVyX0lRS19BXzIpOwotCXJlZ0VCNCA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9CZWZvcmVfSVFLX0IpOwotCXJlZ0VCQyA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQik7Ci0JcmVnRUM0ID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0JlZm9yZV9JUUtfQl8yKTsKLQlyZWdFQ0MgPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByUnhfUG93ZXJfQWZ0ZXJfSVFLX0JfMik7Ci0KLQlpZiAoIShyZWdFQUMgJiBCSVQoMzEpKSAmJgotCSAgICAoKChyZWdFQjQgJiAweDAzRkYwMDAwKT4+MTYpICE9IDB4MTQyKSAmJgotCSAgICAoKChyZWdFQkMgJiAweDAzRkYwMDAwKT4+MTYpICE9IDB4NDIpKQotCQlyZXN1bHQgfD0gMHgwMTsKLQllbHNlCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlpZiAoIShyZWdFQUMgJiBCSVQoMzApKSAmJgotCSAgICAoKChyZWdFQzQgJiAweDAzRkYwMDAwKT4+MTYpICE9IDB4MTMyKSAmJgotCSAgICAoKChyZWdFQ0MgJiAweDAzRkYwMDAwKT4+MTYpICE9IDB4MzYpKQotCQlyZXN1bHQgfD0gMHgwMjsKLQllbHNlCi0JCURCR184NzIzQSgiUGF0aCBCIFJ4IElRSyBmYWlsISFcbiIpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9QSFlfUGF0aEFGaWxsSVFLTWF0cml4KHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsCi0JYm9vbCBiSVFLT0ssCi0JaW50IHJlc3VsdFtdWzhdLAotCXU4IGZpbmFsX2NhbmRpZGF0ZSwKLQlib29sIGJUeE9ubHkKLQkpCi17Ci0JdTMyIE9sZHZhbF8wLCBYLCBUWDBfQSwgcmVnOwotCXMzMiBZLCBUWDBfQzsKLQotCURCR184NzIzQSgiUGF0aCBBIElRIENhbGlicmF0aW9uICVzICFcbiIsIChiSVFLT0spPyJTdWNjZXNzIjoiRmFpbGVkIik7Ci0KLQlpZiAoZmluYWxfY2FuZGlkYXRlID09IDB4RkYpIHsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAoYklRS09LKSB7Ci0JCU9sZHZhbF8wID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSk7Ci0JCU9sZHZhbF8wID0gKE9sZHZhbF8wID4+IDIyKSAmIDB4M0ZGOwotCi0JCVggPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVswXTsKLQkJaWYgKChYICYgMHgwMDAwMDIwMCkgIT0gMCkKLQkJCVggPSBYIHwgMHhGRkZGRkMwMDsKLQkJVFgwX0EgPSAoWCAqIE9sZHZhbF8wKSA+PiA4OwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIDB4M0ZGLCBUWDBfQSk7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX0VDQ0FUaHJlc2hvbGQsIEJJVCgzMSksCi0JCQkgICAgICgoWCAqIE9sZHZhbF8wPj43KSAmIDB4MSkpOwotCi0JCVkgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVsxXTsKLQkJaWYgKChZICYgMHgwMDAwMDIwMCkgIT0gMCkKLQkJCVkgPSBZIHwgMHhGRkZGRkMwMDsKLQkJVFgwX0MgPSAoWSAqIE9sZHZhbF8wKSA+PiA4OwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQ1R4QUZFLCAweEYwMDAwMDAwLAotCQkJICAgICAoKFRYMF9DJjB4M0MwKT4+NikpOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIDB4MDAzRjAwMDAsCi0JCQkgICAgIChUWDBfQyYweDNGKSk7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX0VDQ0FUaHJlc2hvbGQsIEJJVCgyOSksCi0JCQkgICAgICgoWSAqIE9sZHZhbF8wPj43KSAmIDB4MSkpOwotCi0JCWlmIChiVHhPbmx5KSB7Ci0JCQlEQkdfODcyM0EoIl9QSFlfUGF0aEFGaWxsSVFLTWF0cml4IG9ubHkgVHggT0tcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcmVnID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bMl07Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1hBUnhJUUltYmFsYW5jZSwgMHgzRkYsIHJlZyk7Ci0KLQkJcmVnID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bM10gJiAweDNGOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQVJ4SVFJbWJhbGFuY2UsIDB4RkMwMCwgcmVnKTsKLQotCQlyZWcgPSAocmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bM10gPj4gNikgJiAweEY7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1J4SVFFeHRBbnRhLCAweEYwMDAwMDAwLCByZWcpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX1BIWV9QYXRoQkZpbGxJUUtNYXRyaXgoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgYm9vbCBiSVFLT0ssIGludCByZXN1bHRbXVs4XSwgdTggZmluYWxfY2FuZGlkYXRlLCBib29sIGJUeE9ubHkpCi17Ci0JdTMyIE9sZHZhbF8xLCBYLCBUWDFfQSwgcmVnOwotCXMzMiBZLCBUWDFfQzsKLQotCURCR184NzIzQSgiUGF0aCBCIElRIENhbGlicmF0aW9uICVzICFcbiIsIChiSVFLT0spPyJTdWNjZXNzIjoiRmFpbGVkIik7Ci0KLQlpZiAoZmluYWxfY2FuZGlkYXRlID09IDB4RkYpIHsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAoYklRS09LKSB7Ci0JCU9sZHZhbF8xID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgck9GRE0wX1hCVHhJUUltYmFsYW5jZSk7Ci0JCU9sZHZhbF8xID0gKE9sZHZhbF8xID4+IDIyKSAmIDB4M0ZGOwotCi0JCVggPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVs0XTsKLQkJaWYgKChYICYgMHgwMDAwMDIwMCkgIT0gMCkKLQkJCVggPSBYIHwgMHhGRkZGRkMwMDsKLQkJVFgxX0EgPSAoWCAqIE9sZHZhbF8xKSA+PiA4OwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQlR4SVFJbWJhbGFuY2UsIDB4M0ZGLCBUWDFfQSk7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX0VDQ0FUaHJlc2hvbGQsIEJJVCgyNyksCi0JCQkgICAgICgoWCAqIE9sZHZhbF8xID4+IDcpICYgMHgxKSk7Ci0KLQkJWSA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzVdOwotCQlpZiAoKFkgJiAweDAwMDAwMjAwKSAhPSAwKQotCQkJWSA9IFkgfCAweEZGRkZGQzAwOwotCQlUWDFfQyA9IChZICogT2xkdmFsXzEpID4+IDg7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1hEVHhBRkUsIDB4RjAwMDAwMDAsCi0JCQkgICAgICgoVFgxX0MgJiAweDNDMCkgPj4gNikpOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQlR4SVFJbWJhbGFuY2UsIDB4MDAzRjAwMDAsCi0JCQkgICAgIChUWDFfQyAmIDB4M0YpKTsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfRUNDQVRocmVzaG9sZCwgQklUKDI1KSwKLQkJCSAgICAgKChZICogT2xkdmFsXzEgPj4gNykgJiAweDEpKTsKLQotCQlpZiAoYlR4T25seSkKLQkJCXJldHVybjsKLQotCQlyZWcgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVs2XTsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfWEJSeElRSW1iYWxhbmNlLCAweDNGRiwgcmVnKTsKLQotCQlyZWcgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVs3XSAmIDB4M0Y7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1hCUnhJUUltYmFsYW5jZSwgMHhGQzAwLCByZWcpOwotCi0JCXJlZyA9IChyZXN1bHRbZmluYWxfY2FuZGlkYXRlXVs3XSA+PiA2KSAmIDB4RjsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfQUdDUlNTSVRhYmxlLCAweDAwMDBGMDAwLCByZWcpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX1BIWV9TYXZlQUREQVJlZ2lzdGVycyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MzIgKkFEREFSZWcsIHUzMiAqQUREQUJhY2t1cCwgdTMyIFJlZ2lzdGVyTnVtKQotewotCXUzMiBpOwotCi0JZm9yIChpID0gMCA7IGkgPCBSZWdpc3Rlck51bSA7IGkrKykgewotCQlBRERBQmFja3VwW2ldID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgQUREQVJlZ1tpXSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfUEhZX1NhdmVNQUNSZWdpc3RlcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTMyICpNQUNSZWcsCi0JCQkJICB1MzIgKk1BQ0JhY2t1cCkKLXsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDAgOyBpIDwgKElRS19NQUNfUkVHX05VTSAtIDEpOyBpKyspIHsKLQkJTUFDQmFja3VwW2ldID0gcnRsODcyM2F1X3JlYWQ4KHBBZGFwdGVyLCBNQUNSZWdbaV0pOwotCX0KLQlNQUNCYWNrdXBbaV0gPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCBNQUNSZWdbaV0pOwotfQotCi1zdGF0aWMgdm9pZCBfUEhZX1JlbG9hZEFEREFSZWdpc3RlcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwKLQkJCQkgICAgIHUzMiAqQUREQVJlZywgdTMyICpBRERBQmFja3VwLAotCQkJCSAgICAgdTMyIFJlZ2llc3Rlck51bSkKLXsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDAgOyBpIDwgUmVnaWVzdGVyTnVtIDsgaSsrKSB7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCBBRERBUmVnW2ldLCBBRERBQmFja3VwW2ldKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9QSFlfUmVsb2FkTUFDUmVnaXN0ZXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsCi0JCQkJICAgIHUzMiAqTUFDUmVnLCB1MzIgKk1BQ0JhY2t1cCkKLXsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDAgOyBpIDwgKElRS19NQUNfUkVHX05VTSAtIDEpOyBpKyspCi0JCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIE1BQ1JlZ1tpXSwgKHU4KU1BQ0JhY2t1cFtpXSk7Ci0KLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgTUFDUmVnW2ldLCBNQUNCYWNrdXBbaV0pOwotfQotCi1zdGF0aWMgdm9pZCBfUEhZX1BhdGhBRERBT24oc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTMyICpBRERBUmVnLAotCQkJICAgIGJvb2wgaXNQYXRoQU9uLCBib29sIGlzMlQpCi17Ci0JdTMyIHBhdGhPbjsKLQl1MzIgaTsKLQotCXBhdGhPbiA9IGlzUGF0aEFPbiA/IDB4MDRkYjI1YTQgOiAweDBiMWIyNWE0OwotCWlmICghaXMyVCkgewotCQlwYXRoT24gPSAweDBiZGIyNWEwOwotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgQUREQVJlZ1swXSwgMHgwYjFiMjVhMCk7Ci0JfSBlbHNlIHsKLQkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIEFEREFSZWdbMF0sIHBhdGhPbik7Ci0JfQotCi0JZm9yIChpID0gMSA7IGkgPCBJUUtfQUREQV9SRUdfTlVNIDsgaSsrKQotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgQUREQVJlZ1tpXSwgcGF0aE9uKTsKLX0KLQotc3RhdGljIHZvaWQgX1BIWV9NQUNTZXR0aW5nQ2FsaWJyYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwKLQkJCQkgICAgICAgdTMyICpNQUNSZWcsIHUzMiAqTUFDQmFja3VwKQotewotCXUzMiBpID0gMDsKLQotCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIE1BQ1JlZ1tpXSwgMHgzRik7Ci0KLQlmb3IgKGkgPSAxIDsgaSA8IChJUUtfTUFDX1JFR19OVU0gLSAxKTsgaSsrKSB7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIE1BQ1JlZ1tpXSwKLQkJCQkgKHU4KShNQUNCYWNrdXBbaV0gJiB+QklUKDMpKSk7Ci0JfQotCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIE1BQ1JlZ1tpXSwgKHU4KShNQUNCYWNrdXBbaV0gJiB+QklUKDUpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9QSFlfUGF0aEFTdGFuZEJ5KHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIpCi17Ci0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJGUEdBMF9JUUssIDB4MCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIDB4ODQwLCAweDAwMDEwMDAwKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgckZQR0EwX0lRSywgMHg4MDgwMDAwMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9QSFlfUElNb2RlU3dpdGNoKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIGJvb2wgUElNb2RlKQotewotCXUzMiBtb2RlOwotCi0JbW9kZSA9IFBJTW9kZSA/IDB4MDEwMDAxMDAgOiAweDAxMDAwMDAwOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCAweDgyMCwgbW9kZSk7Ci0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIDB4ODI4LCBtb2RlKTsKLX0KLQotLyoKLXJldHVybiBmYWxzZSA9PiBkbyBJUUsgYWdhaW4KLSovCi1zdGF0aWMgYm9vbCBfUEhZX1NpbXVsYXJpdHlDb21wYXJlKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIGludCByZXN1bHRbXVs4XSwgdTggYzEsIHU4IGMyKQotewotCXUzMiBpLCBqLCBkaWZmLCBTaW11bGFyaXR5Qml0TWFwLCBib3VuZCA9IDA7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7Ci0JdTggZmluYWxfY2FuZGlkYXRlWzJdID0gezB4RkYsIDB4RkZ9OwkvKiBmb3IgcGF0aCBBIGFuZCBwYXRoIEIgKi8KLQlib29sIGJSZXN1bHQgPSB0cnVlOwotCi0JaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIpCi0JCWJvdW5kID0gODsKLQllbHNlCi0JCWJvdW5kID0gNDsKLQotCVNpbXVsYXJpdHlCaXRNYXAgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IGJvdW5kOyBpKyspIHsKLQkJZGlmZiA9IChyZXN1bHRbYzFdW2ldID4gcmVzdWx0W2MyXVtpXSkgPyAocmVzdWx0W2MxXVtpXSAtIHJlc3VsdFtjMl1baV0pIDogKHJlc3VsdFtjMl1baV0gLSByZXN1bHRbYzFdW2ldKTsKLQkJaWYgKGRpZmYgPiBNQVhfVE9MRVJBTkNFKSB7Ci0JCQlpZiAoKGkgPT0gMiB8fCBpID09IDYpICYmICFTaW11bGFyaXR5Qml0TWFwKSB7Ci0JCQkJaWYgKHJlc3VsdFtjMV1baV0rcmVzdWx0W2MxXVtpKzFdID09IDApCi0JCQkJCWZpbmFsX2NhbmRpZGF0ZVsoaS80KV0gPSBjMjsKLQkJCQllbHNlIGlmIChyZXN1bHRbYzJdW2ldK3Jlc3VsdFtjMl1baSsxXSA9PSAwKQotCQkJCQlmaW5hbF9jYW5kaWRhdGVbKGkvNCldID0gYzE7Ci0JCQkJZWxzZQotCQkJCQlTaW11bGFyaXR5Qml0TWFwID0gU2ltdWxhcml0eUJpdE1hcHwoMTw8aSk7Ci0JCQl9IGVsc2UgewotCQkJCVNpbXVsYXJpdHlCaXRNYXAgPSBTaW11bGFyaXR5Qml0TWFwfCgxPDxpKTsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChTaW11bGFyaXR5Qml0TWFwID09IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IChib3VuZC80KTsgaSsrKSB7Ci0JCQlpZiAoZmluYWxfY2FuZGlkYXRlW2ldICE9IDB4RkYpIHsKLQkJCQlmb3IgKGogPSBpKjQ7IGogPCAoaSsxKSo0LTI7IGorKykKLQkJCQkJcmVzdWx0WzNdW2pdID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZVtpXV1bal07Ci0JCQkJYlJlc3VsdCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBiUmVzdWx0OwotCX0gZWxzZSBpZiAoIShTaW11bGFyaXR5Qml0TWFwICYgMHgwRikpIHsKLQkJLyogcGF0aCBBIE9LICovCi0JCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCQlyZXN1bHRbM11baV0gPSByZXN1bHRbYzFdW2ldOwotCQlyZXR1cm4gZmFsc2U7Ci0JfSBlbHNlIGlmICghKFNpbXVsYXJpdHlCaXRNYXAgJiAweEYwKSAmJiBwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8yVDJSKSB7Ci0JCS8qIHBhdGggQiBPSyAqLwotCQlmb3IgKGkgPSA0OyBpIDwgODsgaSsrKQotCQkJcmVzdWx0WzNdW2ldID0gcmVzdWx0W2MxXVtpXTsKLQkJcmV0dXJuIGZhbHNlOwotCX0gZWxzZSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9QSFlfSVFDYWxpYnJhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgaW50IHJlc3VsdFtdWzhdLCB1OCB0LCBib29sIGlzMlQpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYgKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQl1MzIgaTsKLQl1OCBQYXRoQU9LLCBQYXRoQk9LOwotCXUzMiBBRERBX1JFR1tJUUtfQUREQV9SRUdfTlVNXSA9IHsKLQkJckZQR0EwX1hDRF9Td2l0Y2hDb250cm9sLCByQmx1ZV9Ub290aCwKLQkJclJ4X1dhaXRfQ0NBLCByVHhfQ0NLX1JGT04sCi0JCXJUeF9DQ0tfQkJPTiwgclR4X09GRE1fUkZPTiwKLQkJclR4X09GRE1fQkJPTiwgclR4X1RvX1J4LAotCQlyVHhfVG9fVHgsIHJSeF9DQ0ssCi0JCXJSeF9PRkRNLCByUnhfV2FpdF9SSUZTLAotCQlyUnhfVE9fUngsIHJTdGFuZGJ5LAotCQlyU2xlZXAsIHJQTVBEX0FOQUVOCi0JfTsKLQotCXUzMiBJUUtfTUFDX1JFR1tJUUtfTUFDX1JFR19OVU1dID0gewotCQlSRUdfVFhQQVVTRSwgUkVHX0JDTl9DVFJMLAotCQlSRUdfQkNOX0NUUkxfMSwgUkVHX0dQSU9fTVVYQ0ZHCi0JfTsKLQotCXUzMiBJUUtfQkJfUkVHXzkyQ1tJUUtfQkJfUkVHX05VTV0gPSB7Ci0JCXJPRkRNMF9UUnhQYXRoRW5hYmxlLCByT0ZETTBfVFJNdXhQYXIsCi0JCXJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VTVywgckNvbmZpZ19BbnRBLCByQ29uZmlnX0FudEIsCi0JCXJGUEdBMF9YQUJfUkZJbnRlcmZhY2VTVywgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsCi0JCXJGUEdBMF9YQl9SRkludGVyZmFjZU9FLCByRlBHQTBfUkZNT0QKLQl9OwotCi0JY29uc3QgdTMyIHJldHJ5Q291bnQgPSAyOwotCi0JLyogIE5vdGU6IElRIGNhbGlicmF0aW9uIG11c3QgYmUgcGVyZm9ybWVkIGFmdGVyIGxvYWRpbmcgICovCi0JLyoJCVBIWV9SRUcudHh0ICwgYW5kIHJhZGlvX2EsIHJhZGlvX2IudHh0CSAqLwotCi0JdTMyIGJidmFsdWU7Ci0KLQlpZiAodCA9PSAwKSB7Ci0JCWJidmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByRlBHQTBfUkZNT0QpOwotCi0JCS8qICBTYXZlIEFEREEgcGFyYW1ldGVycywgdHVybiBQYXRoIEEgQUREQSBvbiAqLwotCQlfUEhZX1NhdmVBRERBUmVnaXN0ZXJzKHBBZGFwdGVyLCBBRERBX1JFRywgcGRtcHJpdi0+QUREQV9iYWNrdXAsIElRS19BRERBX1JFR19OVU0pOwotCQlfUEhZX1NhdmVNQUNSZWdpc3RlcnMocEFkYXB0ZXIsIElRS19NQUNfUkVHLCBwZG1wcml2LT5JUUtfTUFDX2JhY2t1cCk7Ci0JCV9QSFlfU2F2ZUFEREFSZWdpc3RlcnMocEFkYXB0ZXIsIElRS19CQl9SRUdfOTJDLCBwZG1wcml2LT5JUUtfQkJfYmFja3VwLCBJUUtfQkJfUkVHX05VTSk7Ci0JfQotCV9QSFlfUGF0aEFEREFPbihwQWRhcHRlciwgQUREQV9SRUcsIHRydWUsIGlzMlQpOwotCi0JaWYgKHQgPT0gMCkKLQkJcGRtcHJpdi0+YlJmUGlFbmFibGUgPSAodTgpCi0JCQlQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIxLAotCQkJCSAgICAgICBCSVQoOCkpOwotCi0JaWYgKCFwZG1wcml2LT5iUmZQaUVuYWJsZSkgewotCQkvKiAgU3dpdGNoIEJCIHRvIFBJIG1vZGUgdG8gZG8gSVEgQ2FsaWJyYXRpb24uICovCi0JCV9QSFlfUElNb2RlU3dpdGNoKHBBZGFwdGVyLCB0cnVlKTsKLQl9Ci0KLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCwgQklUKDI0KSwgMHgwMCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCAweDAzYTA1NjAwKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgck9GRE0wX1RSTXV4UGFyLCAweDAwMDgwMGU0KTsKLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgckZQR0EwX1hDRF9SRkludGVyZmFjZVNXLCAweDIyMjA0MDAwKTsKLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VTVywgQklUKDEwKSwgMHgwMSk7Ci0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1csIEJJVCgyNiksIDB4MDEpOwotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIEJJVCgxMCksIDB4MDApOwotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgckZQR0EwX1hCX1JGSW50ZXJmYWNlT0UsIEJJVCgxMCksIDB4MDApOwotCi0JaWYgKGlzMlQpIHsKLQkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsCi0JCQkJICByRlBHQTBfWEFfTFNTSVBhcmFtZXRlciwgMHgwMDAxMDAwMCk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLAotCQkJCSAgckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXIsIDB4MDAwMTAwMDApOwotCX0KLQotCS8qIE1BQyBzZXR0aW5ncyAqLwotCV9QSFlfTUFDU2V0dGluZ0NhbGlicmF0aW9uKHBBZGFwdGVyLCBJUUtfTUFDX1JFRywgcGRtcHJpdi0+SVFLX01BQ19iYWNrdXApOwotCi0JLyogUGFnZSBCIGluaXQgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgckNvbmZpZ19BbnRBLCAweDAwMDgwMDAwKTsKLQotCWlmIChpczJUKQotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgckNvbmZpZ19BbnRCLCAweDAwMDgwMDAwKTsKLQotCS8qICBJUSBjYWxpYnJhdGlvbiBzZXR0aW5nICovCi0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJGUEdBMF9JUUssIDB4ODA4MDAwMDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByVHhfSVFLLCAweDAxMDA3YzAwKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclJ4X0lRSywgMHgwMTAwNDgwMCk7Ci0KLQlmb3IgKGkgPSAwIDsgaSA8IHJldHJ5Q291bnQgOyBpKyspIHsKLQkJUGF0aEFPSyA9IF9QSFlfUGF0aEFfSVFLKHBBZGFwdGVyLCBpczJUKTsKLQkJaWYgKFBhdGhBT0sgPT0gMHgwMykgewotCQkJCURCR184NzIzQSgiUGF0aCBBIElRSyBTdWNjZXNzISFcbiIpOwotCQkJCXJlc3VsdFt0XVswXSA9IChydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByVHhfUG93ZXJfQmVmb3JlX0lRS19BKSYweDNGRjAwMDApPj4xNjsKLQkJCQlyZXN1bHRbdF1bMV0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0FmdGVyX0lRS19BKSYweDNGRjAwMDApPj4xNjsKLQkJCQlyZXN1bHRbdF1bMl0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0JlZm9yZV9JUUtfQV8yKSYweDNGRjAwMDApPj4xNjsKLQkJCQlyZXN1bHRbdF1bM10gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0FmdGVyX0lRS19BXzIpJjB4M0ZGMDAwMCk+PjE2OwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAoaSA9PSAocmV0cnlDb3VudC0xKSAmJiBQYXRoQU9LID09IDB4MDEpIHsKLQkJCS8qIFR4IElRSyBPSyAqLwotCQkJREJHXzg3MjNBKCJQYXRoIEEgSVFLIE9ubHkgIFR4IFN1Y2Nlc3MhIVxuIik7Ci0KLQkJCXJlc3VsdFt0XVswXSA9IChydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByVHhfUG93ZXJfQmVmb3JlX0lRS19BKSYweDNGRjAwMDApPj4xNjsKLQkJCXJlc3VsdFt0XVsxXSA9IChydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByVHhfUG93ZXJfQWZ0ZXJfSVFLX0EpJjB4M0ZGMDAwMCk+PjE2OwotCQl9Ci0JfQotCi0JaWYgKDB4MDAgPT0gUGF0aEFPSykgewotCQlEQkdfODcyM0EoIlBhdGggQSBJUUsgZmFpbGVkISFcbiIpOwotCX0KLQotCWlmIChpczJUKSB7Ci0JCV9QSFlfUGF0aEFTdGFuZEJ5KHBBZGFwdGVyKTsKLQotCQkvKiAgVHVybiBQYXRoIEIgQUREQSBvbiAqLwotCQlfUEhZX1BhdGhBRERBT24ocEFkYXB0ZXIsIEFEREFfUkVHLCBmYWxzZSwgaXMyVCk7Ci0KLQkJZm9yIChpID0gMCA7IGkgPCByZXRyeUNvdW50IDsgaSsrKSB7Ci0JCQlQYXRoQk9LID0gX1BIWV9QYXRoQl9JUUsocEFkYXB0ZXIpOwotCQkJaWYgKFBhdGhCT0sgPT0gMHgwMykgewotCQkJCURCR184NzIzQSgiUGF0aCBCIElRSyBTdWNjZXNzISFcbiIpOwotCQkJCXJlc3VsdFt0XVs0XSA9IChydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByVHhfUG93ZXJfQmVmb3JlX0lRS19CKSYweDNGRjAwMDApPj4xNjsKLQkJCQlyZXN1bHRbdF1bNV0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0FmdGVyX0lRS19CKSYweDNGRjAwMDApPj4xNjsKLQkJCQlyZXN1bHRbdF1bNl0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0JlZm9yZV9JUUtfQl8yKSYweDNGRjAwMDApPj4xNjsKLQkJCQlyZXN1bHRbdF1bN10gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0FmdGVyX0lRS19CXzIpJjB4M0ZGMDAwMCk+PjE2OwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChpID09IChyZXRyeUNvdW50IC0gMSkgJiYgUGF0aEJPSyA9PSAweDAxKSB7Ci0JCQkJLyogVHggSVFLIE9LICovCi0JCQkJREJHXzg3MjNBKCJQYXRoIEIgT25seSBUeCBJUUsgU3VjY2VzcyEhXG4iKTsKLQkJCQlyZXN1bHRbdF1bNF0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQikmMHgzRkYwMDAwKT4+MTY7Ci0JCQkJcmVzdWx0W3RdWzVdID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQikmMHgzRkYwMDAwKT4+MTY7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoMHgwMCA9PSBQYXRoQk9LKSB7Ci0JCQlEQkdfODcyM0EoIlBhdGggQiBJUUsgZmFpbGVkISFcbiIpOwotCQl9Ci0JfQotCi0JLyogQmFjayB0byBCQiBtb2RlLCBsb2FkIG9yaWdpbmFsIHZhbHVlICovCi0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJGUEdBMF9JUUssIDApOwotCi0JaWYgKHQgIT0gMCkgewotCQlpZiAoIXBkbXByaXYtPmJSZlBpRW5hYmxlKSB7Ci0JCQkvKiAgU3dpdGNoIGJhY2sgQkIgdG8gU0kgbW9kZSBhZnRlciBmaW5pc2ggSVEgQ2FsaWJyYXRpb24uICovCi0JCQlfUEhZX1BJTW9kZVN3aXRjaChwQWRhcHRlciwgZmFsc2UpOwotCQl9Ci0KLQkJLyogIFJlbG9hZCBBRERBIHBvd2VyIHNhdmluZyBwYXJhbWV0ZXJzICovCi0JCV9QSFlfUmVsb2FkQUREQVJlZ2lzdGVycyhwQWRhcHRlciwgQUREQV9SRUcsIHBkbXByaXYtPkFEREFfYmFja3VwLCBJUUtfQUREQV9SRUdfTlVNKTsKLQotCQkvKiAgUmVsb2FkIE1BQyBwYXJhbWV0ZXJzICovCi0JCV9QSFlfUmVsb2FkTUFDUmVnaXN0ZXJzKHBBZGFwdGVyLCBJUUtfTUFDX1JFRywgcGRtcHJpdi0+SVFLX01BQ19iYWNrdXApOwotCi0JCS8qICBSZWxvYWQgQkIgcGFyYW1ldGVycyAqLwotCQlfUEhZX1JlbG9hZEFEREFSZWdpc3RlcnMocEFkYXB0ZXIsIElRS19CQl9SRUdfOTJDLCBwZG1wcml2LT5JUUtfQkJfYmFja3VwLCBJUUtfQkJfUkVHX05VTSk7Ci0KLQkJLyogIFJlc3RvcmUgUlggaW5pdGlhbCBnYWluICovCi0JCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLAotCQkJCSAgckZQR0EwX1hBX0xTU0lQYXJhbWV0ZXIsIDB4MDAwMzJlZDMpOwotCQlpZiAoaXMyVCkgewotCQkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsCi0JCQkJCSAgckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXIsIDB4MDAwMzJlZDMpOwotCQl9Ci0KLQkJLyogbG9hZCAweGUzMCBJUUMgZGVmYXVsdCB2YWx1ZSAqLwotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclR4X0lRS19Ub25lX0EsIDB4MDEwMDhjMDApOwotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclJ4X0lRS19Ub25lX0EsIDB4MDEwMDhjMDApOwotCi0JfQotfQotCi1zdGF0aWMgdm9pZCBfUEhZX0xDQ2FsaWJyYXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIGJvb2wgaXMyVCkKLXsKLQl1OCB0bXBSZWc7Ci0JdTMyIFJGX0Ftb2RlID0gMCwgUkZfQm1vZGUgPSAwLCBMQ19DYWw7Ci0KLQkvKiBDaGVjayBjb250aW51b3VzIFRYIGFuZCBQYWNrZXQgVFggKi8KLQl0bXBSZWcgPSBydGw4NzIzYXVfcmVhZDgocEFkYXB0ZXIsIDB4ZDAzKTsKLQotCWlmICgodG1wUmVnJjB4NzApICE9IDApIHsKLQkJLyogRGVhbCB3aXRoIGNvbnRpc3VvdXMgVFggY2FzZSAqLwotCQkvKiBkaXNhYmxlIGFsbCBjb250aW51b3VzIFRYICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIDB4ZDAzLCB0bXBSZWcmMHg4Rik7Ci0JfSBlbHNlIHsKLQkJLyogIERlYWwgd2l0aCBQYWNrZXQgVFggY2FzZSAqLwotCQkvKiAgYmxvY2sgYWxsIHF1ZXVlcyAqLwotCQlydGw4NzIzYXVfd3JpdGU4KHBBZGFwdGVyLCBSRUdfVFhQQVVTRSwgMHhGRik7Ci0JfQotCi0JaWYgKCh0bXBSZWcmMHg3MCkgIT0gMCkgewotCQkvKiAxLiBSZWFkIG9yaWdpbmFsIFJGIG1vZGUgKi8KLQkJLyogUGF0aC1BICovCi0JCVJGX0Ftb2RlID0gUEhZX1F1ZXJ5UkZSZWcocEFkYXB0ZXIsIFJGX1BBVEhfQSwgUkZfQUMsIGJNYXNrMTJCaXRzKTsKLQotCQkvKiBQYXRoLUIgKi8KLQkJaWYgKGlzMlQpCi0JCQlSRl9CbW9kZSA9IFBIWV9RdWVyeVJGUmVnKHBBZGFwdGVyLCBSRl9QQVRIX0IsIFJGX0FDLCBiTWFzazEyQml0cyk7Ci0KLQkJLyogMi4gU2V0IFJGIG1vZGUgPSBzdGFuZGJ5IG1vZGUgKi8KLQkJLyogUGF0aC1BICovCi0JCVBIWV9TZXRSRlJlZyhwQWRhcHRlciwgUkZfUEFUSF9BLCBSRl9BQywgYk1hc2sxMkJpdHMsIChSRl9BbW9kZSYweDhGRkZGKXwweDEwMDAwKTsKLQotCQkvKiBQYXRoLUIgKi8KLQkJaWYgKGlzMlQpCi0JCQlQSFlfU2V0UkZSZWcocEFkYXB0ZXIsIFJGX1BBVEhfQiwgUkZfQUMsIGJNYXNrMTJCaXRzLCAoUkZfQm1vZGUmMHg4RkZGRil8MHgxMDAwMCk7Ci0JfQotCi0JLyogMy4gUmVhZCBSRiByZWcxOCAqLwotCUxDX0NhbCA9IFBIWV9RdWVyeVJGUmVnKHBBZGFwdGVyLCBSRl9QQVRIX0EsIFJGX0NITkxCVywgYk1hc2sxMkJpdHMpOwotCi0JLyogNC4gU2V0IExDIGNhbGlicmF0aW9uIGJlZ2luICovCi0JUEhZX1NldFJGUmVnKHBBZGFwdGVyLCBSRl9QQVRIX0EsIFJGX0NITkxCVywgYk1hc2sxMkJpdHMsIExDX0NhbHwweDA4MDAwKTsKLQotCW1zbGVlcCgxMDApOwotCi0JLyogUmVzdG9yZSBvcmlnaW5hbCBzaXR1YXRpb24gKi8KLQlpZiAoKHRtcFJlZyYweDcwKSAhPSAwKSB7CS8qIERlYWwgd2l0aCBjb250dW91cyBUWCBjYXNlICAqLwotCQkvKiBQYXRoLUEgKi8KLQkJcnRsODcyM2F1X3dyaXRlOChwQWRhcHRlciwgMHhkMDMsIHRtcFJlZyk7Ci0JCVBIWV9TZXRSRlJlZyhwQWRhcHRlciwgUkZfUEFUSF9BLCBSRl9BQywgYk1hc2sxMkJpdHMsIFJGX0Ftb2RlKTsKLQotCQkvKiBQYXRoLUIgKi8KLQkJaWYgKGlzMlQpCi0JCQlQSFlfU2V0UkZSZWcocEFkYXB0ZXIsIFJGX1BBVEhfQiwgUkZfQUMsIGJNYXNrMTJCaXRzLCBSRl9CbW9kZSk7Ci0JfSBlbHNlIC8qICBEZWFsIHdpdGggUGFja2V0IFRYIGNhc2UgKi8KLQkJcnRsODcyM2F1X3dyaXRlOChwQWRhcHRlciwgUkVHX1RYUEFVU0UsIDB4MDApOwotfQotCi0vKiBBbmFsb2cgUHJlLWRpc3RvcnRpb24gY2FsaWJyYXRpb24gKi8KLSNkZWZpbmUJCUFQS19CQl9SRUdfTlVNCTgKLSNkZWZpbmUJCUFQS19DVVJWRV9SRUdfTlVNIDQKLSNkZWZpbmUJCVBBVEhfTlVNCQkyCi0KLXZvaWQgcnRsODcyM2FfcGh5X2lxX2NhbGlicmF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCBib29sIGJSZUNvdmVyeSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCXMzMiByZXN1bHRbNF1bOF07CS8qIGxhc3QgaXMgZmluYWwgcmVzdWx0ICovCi0JdTggaSwgZmluYWxfY2FuZGlkYXRlOwotCWJvb2wgYlBhdGhBT0ssIGJQYXRoQk9LOwotCXMzMiBSZWdFOTQsIFJlZ0U5QywgUmVnRUE0LCBSZWdFQUMsIFJlZ0VCNCwgUmVnRUJDLCBSZWdFQzQ7Ci0JczMyIFJlZ0VDQywgUmVnVG1wID0gMDsKLQlib29sIGlzMTJzaW11bGFyLCBpczEzc2ltdWxhciwgaXMyM3NpbXVsYXI7Ci0JYm9vbCBiU3RhcnRDb250VHggPSBmYWxzZSwgYlNpbmdsZVRvbmUgPSBmYWxzZTsKLQlib29sIGJDYXJyaWVyU3VwcHJlc3Npb24gPSBmYWxzZTsKLQl1MzIgSVFLX0JCX1JFR185MkNbSVFLX0JCX1JFR19OVU1dID0gewotCQlyT0ZETTBfWEFSeElRSW1iYWxhbmNlLCByT0ZETTBfWEJSeElRSW1iYWxhbmNlLAotCQlyT0ZETTBfRUNDQVRocmVzaG9sZCwgck9GRE0wX0FHQ1JTU0lUYWJsZSwKLQkJck9GRE0wX1hBVHhJUUltYmFsYW5jZSwgck9GRE0wX1hCVHhJUUltYmFsYW5jZSwKLQkJck9GRE0wX1hDVHhBRkUsIHJPRkRNMF9YRFR4QUZFLAotCQlyT0ZETTBfUnhJUUV4dEFudGEKLQl9OwotCi0JLyogaWdub3JlIElRSyB3aGVuIGNvbnRpbnVvdXMgVHggKi8KLQlpZiAoYlN0YXJ0Q29udFR4IHx8IGJTaW5nbGVUb25lIHx8IGJDYXJyaWVyU3VwcHJlc3Npb24pCi0JCXJldHVybjsKLQotCWlmIChiUmVDb3ZlcnkpIHsKLQkJX1BIWV9SZWxvYWRBRERBUmVnaXN0ZXJzKHBBZGFwdGVyLCBJUUtfQkJfUkVHXzkyQywgcGRtcHJpdi0+SVFLX0JCX2JhY2t1cF9yZWNvdmVyLCA5KTsKLQkJcmV0dXJuOwotCX0KLQlEQkdfODcyM0EoIklRSzpTdGFydCEhIVxuIik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXJlc3VsdFswXVtpXSA9IDA7Ci0JCXJlc3VsdFsxXVtpXSA9IDA7Ci0JCXJlc3VsdFsyXVtpXSA9IDA7Ci0JCXJlc3VsdFszXVtpXSA9IDA7Ci0JfQotCWZpbmFsX2NhbmRpZGF0ZSA9IDB4ZmY7Ci0JYlBhdGhBT0sgPSBmYWxzZTsKLQliUGF0aEJPSyA9IGZhbHNlOwotCWlzMTJzaW11bGFyID0gZmFsc2U7Ci0JaXMyM3NpbXVsYXIgPSBmYWxzZTsKLQlpczEzc2ltdWxhciA9IGZhbHNlOwotCi0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMlQyUikKLQkJCV9QSFlfSVFDYWxpYnJhdGUocEFkYXB0ZXIsIHJlc3VsdCwgaSwgdHJ1ZSk7Ci0JCWVsc2UgLyogIEZvciA4OEMgMVQxUiAqLwotCQkJX1BIWV9JUUNhbGlicmF0ZShwQWRhcHRlciwgcmVzdWx0LCBpLCBmYWxzZSk7Ci0KLQkJaWYgKGkgPT0gMSkgewotCQkJaXMxMnNpbXVsYXIgPSBfUEhZX1NpbXVsYXJpdHlDb21wYXJlKHBBZGFwdGVyLCByZXN1bHQsIDAsIDEpOwotCQkJaWYgKGlzMTJzaW11bGFyKSB7Ci0JCQkJZmluYWxfY2FuZGlkYXRlID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChpID09IDIpIHsKLQkJCWlzMTNzaW11bGFyID0gX1BIWV9TaW11bGFyaXR5Q29tcGFyZShwQWRhcHRlciwgcmVzdWx0LCAwLCAyKTsKLQkJCWlmIChpczEzc2ltdWxhcikgewotCQkJCWZpbmFsX2NhbmRpZGF0ZSA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlzMjNzaW11bGFyID0gX1BIWV9TaW11bGFyaXR5Q29tcGFyZShwQWRhcHRlciwgcmVzdWx0LCAxLCAyKTsKLQkJCWlmIChpczIzc2ltdWxhcikgewotCQkJCWZpbmFsX2NhbmRpZGF0ZSA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQkJCVJlZ1RtcCArPSByZXN1bHRbM11baV07Ci0KLQkJCQlpZiAoUmVnVG1wICE9IDApCi0JCQkJCWZpbmFsX2NhbmRpZGF0ZSA9IDM7Ci0JCQkJZWxzZQotCQkJCQlmaW5hbF9jYW5kaWRhdGUgPSAweEZGOwotCQkJfQotCQl9Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQlSZWdFOTQgPSByZXN1bHRbaV1bMF07Ci0JCVJlZ0U5QyA9IHJlc3VsdFtpXVsxXTsKLQkJUmVnRUE0ID0gcmVzdWx0W2ldWzJdOwotCQlSZWdFQUMgPSByZXN1bHRbaV1bM107Ci0JCVJlZ0VCNCA9IHJlc3VsdFtpXVs0XTsKLQkJUmVnRUJDID0gcmVzdWx0W2ldWzVdOwotCQlSZWdFQzQgPSByZXN1bHRbaV1bNl07Ci0JCVJlZ0VDQyA9IHJlc3VsdFtpXVs3XTsKLQl9Ci0KLQlpZiAoZmluYWxfY2FuZGlkYXRlICE9IDB4ZmYpIHsKLQkJUmVnRTk0ID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bMF07Ci0JCXBkbXByaXYtPlJlZ0U5NCA9ICBSZWdFOTQ7Ci0JCVJlZ0U5QyA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzFdOwotCQlwZG1wcml2LT5SZWdFOUMgPSBSZWdFOUM7Ci0JCVJlZ0VBNCA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzJdOwotCQlSZWdFQUMgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVszXTsKLQkJUmVnRUI0ID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bNF07Ci0JCXBkbXByaXYtPlJlZ0VCNCA9IFJlZ0VCNDsKLQkJUmVnRUJDID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bNV07Ci0JCXBkbXByaXYtPlJlZ0VCQyA9IFJlZ0VCQzsKLQkJUmVnRUM0ID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bNl07Ci0JCVJlZ0VDQyA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzddOwotCQlEQkdfODcyM0EoIklRSzogZmluYWxfY2FuZGlkYXRlIGlzICV4XG4iLCBmaW5hbF9jYW5kaWRhdGUpOwotCQlEQkdfODcyM0EoIklRSzogUmVnRTk0ID0leCBSZWdFOUMgPSV4IFJlZ0VBNCA9JXggUmVnRUFDID0leCBSZWdFQjQgPSV4IFJlZ0VCQyA9JXggUmVnRUM0ID0leCBSZWdFQ0MgPSV4XG4gIiwKLQkJCSAgUmVnRTk0LCBSZWdFOUMsIFJlZ0VBNCwgUmVnRUFDLCBSZWdFQjQsIFJlZ0VCQywgUmVnRUM0LCBSZWdFQ0MpOwotCQliUGF0aEFPSyA9IGJQYXRoQk9LID0gdHJ1ZTsKLQl9IGVsc2UgewotCQlSZWdFOTQgPSBSZWdFQjQgPSBwZG1wcml2LT5SZWdFOTQgPSBwZG1wcml2LT5SZWdFQjQgPSAweDEwMDsJLyogWCBkZWZhdWx0IHZhbHVlICovCi0JCVJlZ0U5QyA9IFJlZ0VCQyA9IHBkbXByaXYtPlJlZ0U5QyA9IHBkbXByaXYtPlJlZ0VCQyA9IDB4MDsJCS8qIFkgZGVmYXVsdCB2YWx1ZSAqLwotCX0KLQotCWlmICgoUmVnRTk0ICE9IDApLyomJihSZWdFQTQgIT0gMCkqLykKLQkJX1BIWV9QYXRoQUZpbGxJUUtNYXRyaXgocEFkYXB0ZXIsIGJQYXRoQU9LLCByZXN1bHQsIGZpbmFsX2NhbmRpZGF0ZSwgKFJlZ0VBNCA9PSAwKSk7Ci0KLQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMlQyUikgewotCQlpZiAoKFJlZ0VCNCAhPSAwKS8qJiYoUmVnRUM0ICE9IDApKi8pCi0JCQlfUEhZX1BhdGhCRmlsbElRS01hdHJpeChwQWRhcHRlciwgYlBhdGhCT0ssIHJlc3VsdCwKLQkJCQkJCWZpbmFsX2NhbmRpZGF0ZSwgKFJlZ0VDNCA9PSAwKSk7Ci0JfQotCi0JX1BIWV9TYXZlQUREQVJlZ2lzdGVycyhwQWRhcHRlciwgSVFLX0JCX1JFR185MkMsIHBkbXByaXYtPklRS19CQl9iYWNrdXBfcmVjb3ZlciwgOSk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfcGh5X2xjX2NhbGlicmF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwQWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JYm9vbCBiU3RhcnRDb250VHggPSBmYWxzZSwgYlNpbmdsZVRvbmUgPSBmYWxzZSwgYkNhcnJpZXJTdXBwcmVzc2lvbiA9IGZhbHNlOwotCi0JLyogaWdub3JlIElRSyB3aGVuIGNvbnRpbnVvdXMgVHggKi8KLQlpZiAoYlN0YXJ0Q29udFR4IHx8IGJTaW5nbGVUb25lIHx8IGJDYXJyaWVyU3VwcHJlc3Npb24pCi0JCXJldHVybjsKLQotCWlmIChwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc3RhdGUgPT0gU0NBTl9QUk9DRVNTKQotCQlyZXR1cm47Ci0KLQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMlQyUikKLQkJX1BIWV9MQ0NhbGlicmF0ZShwQWRhcHRlciwgdHJ1ZSk7Ci0JZWxzZQkvKiAgRm9yIDg4QyAxVDFSICovCi0JCV9QSFlfTENDYWxpYnJhdGUocEFkYXB0ZXIsIGZhbHNlKTsKLX0KLQotdm9pZAotcnRsODcyM2FfcGh5X2FwX2NhbGlicmF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCBjaGFyIGRlbHRhKQotewotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsSFdJbWc4NzIzQV9CQi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsSFdJbWc4NzIzQV9CQi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDNlYTZjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfQkIuYworKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0qIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSogbW9yZSBkZXRhaWxzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAib2RtX3ByZWNvbXAuaCIKLQotc3RhdGljIGJvb2wgQ2hlY2tDb25kaXRpb24oY29uc3QgdTMyICBDb25kaXRpb24sIGNvbnN0IHUzMiAgSGV4KQotewotCXUzMiBfYm9hcmQgICAgID0gKEhleCAmIDB4MDAwMDAwRkYpOwotCXUzMiBfaW50ZXJmYWNlID0gKEhleCAmIDB4MDAwMEZGMDApID4+IDg7Ci0JdTMyIF9wbGF0Zm9ybSAgPSAoSGV4ICYgMHgwMEZGMDAwMCkgPj4gMTY7Ci0JdTMyIGNvbmQgPSBDb25kaXRpb247Ci0KLQlpZiAoQ29uZGl0aW9uID09IDB4Q0RDRENEQ0QpCi0JCXJldHVybiB0cnVlOwotCi0JY29uZCA9IENvbmRpdGlvbiAmIDB4MDAwMDAwRkY7Ci0JaWYgKChfYm9hcmQgPT0gY29uZCkgJiYgY29uZCAhPSAweDAwKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQljb25kID0gQ29uZGl0aW9uICYgMHgwMDAwRkYwMDsKLQljb25kID4+PSA4OwotCWlmICgoX2ludGVyZmFjZSAmIGNvbmQpID09IDAgJiYgY29uZCAhPSAweDA3KQotCQlyZXR1cm4gZmFsc2U7Ci0KLQljb25kID0gQ29uZGl0aW9uICYgMHgwMEZGMDAwMDsKLQljb25kID4+PSAxNjsKLQlpZiAoKF9wbGF0Zm9ybSAmIGNvbmQpID09IDAgJiYgY29uZCAhPSAweDBGKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBBR0NfVEFCXzFULlRYVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdTMyIEFycmF5X0FHQ19UQUJfMVRfODcyM0FbXSA9IHsKLQkweEM3OCwgMHg3QjAwMDAwMSwKLQkweEM3OCwgMHg3QjAxMDAwMSwKLQkweEM3OCwgMHg3QjAyMDAwMSwKLQkweEM3OCwgMHg3QjAzMDAwMSwKLQkweEM3OCwgMHg3QjA0MDAwMSwKLQkweEM3OCwgMHg3QjA1MDAwMSwKLQkweEM3OCwgMHg3QTA2MDAwMSwKLQkweEM3OCwgMHg3OTA3MDAwMSwKLQkweEM3OCwgMHg3ODA4MDAwMSwKLQkweEM3OCwgMHg3NzA5MDAwMSwKLQkweEM3OCwgMHg3NjBBMDAwMSwKLQkweEM3OCwgMHg3NTBCMDAwMSwKLQkweEM3OCwgMHg3NDBDMDAwMSwKLQkweEM3OCwgMHg3MzBEMDAwMSwKLQkweEM3OCwgMHg3MjBFMDAwMSwKLQkweEM3OCwgMHg3MTBGMDAwMSwKLQkweEM3OCwgMHg3MDEwMDAwMSwKLQkweEM3OCwgMHg2RjExMDAwMSwKLQkweEM3OCwgMHg2RTEyMDAwMSwKLQkweEM3OCwgMHg2RDEzMDAwMSwKLQkweEM3OCwgMHg2QzE0MDAwMSwKLQkweEM3OCwgMHg2QjE1MDAwMSwKLQkweEM3OCwgMHg2QTE2MDAwMSwKLQkweEM3OCwgMHg2OTE3MDAwMSwKLQkweEM3OCwgMHg2ODE4MDAwMSwKLQkweEM3OCwgMHg2NzE5MDAwMSwKLQkweEM3OCwgMHg2NjFBMDAwMSwKLQkweEM3OCwgMHg2NTFCMDAwMSwKLQkweEM3OCwgMHg2NDFDMDAwMSwKLQkweEM3OCwgMHg2MzFEMDAwMSwKLQkweEM3OCwgMHg2MjFFMDAwMSwKLQkweEM3OCwgMHg2MTFGMDAwMSwKLQkweEM3OCwgMHg2MDIwMDAwMSwKLQkweEM3OCwgMHg0OTIxMDAwMSwKLQkweEM3OCwgMHg0ODIyMDAwMSwKLQkweEM3OCwgMHg0NzIzMDAwMSwKLQkweEM3OCwgMHg0NjI0MDAwMSwKLQkweEM3OCwgMHg0NTI1MDAwMSwKLQkweEM3OCwgMHg0NDI2MDAwMSwKLQkweEM3OCwgMHg0MzI3MDAwMSwKLQkweEM3OCwgMHg0MjI4MDAwMSwKLQkweEM3OCwgMHg0MTI5MDAwMSwKLQkweEM3OCwgMHg0MDJBMDAwMSwKLQkweEM3OCwgMHgyNjJCMDAwMSwKLQkweEM3OCwgMHgyNTJDMDAwMSwKLQkweEM3OCwgMHgyNDJEMDAwMSwKLQkweEM3OCwgMHgyMzJFMDAwMSwKLQkweEM3OCwgMHgyMjJGMDAwMSwKLQkweEM3OCwgMHgyMTMwMDAwMSwKLQkweEM3OCwgMHgyMDMxMDAwMSwKLQkweEM3OCwgMHgwNjMyMDAwMSwKLQkweEM3OCwgMHgwNTMzMDAwMSwKLQkweEM3OCwgMHgwNDM0MDAwMSwKLQkweEM3OCwgMHgwMzM1MDAwMSwKLQkweEM3OCwgMHgwMjM2MDAwMSwKLQkweEM3OCwgMHgwMTM3MDAwMSwKLQkweEM3OCwgMHgwMDM4MDAwMSwKLQkweEM3OCwgMHgwMDM5MDAwMSwKLQkweEM3OCwgMHgwMDNBMDAwMSwKLQkweEM3OCwgMHgwMDNCMDAwMSwKLQkweEM3OCwgMHgwMDNDMDAwMSwKLQkweEM3OCwgMHgwMDNEMDAwMSwKLQkweEM3OCwgMHgwMDNFMDAwMSwKLQkweEM3OCwgMHgwMDNGMDAwMSwKLQkweEM3OCwgMHg3QjQwMDAwMSwKLQkweEM3OCwgMHg3QjQxMDAwMSwKLQkweEM3OCwgMHg3QjQyMDAwMSwKLQkweEM3OCwgMHg3QjQzMDAwMSwKLQkweEM3OCwgMHg3QjQ0MDAwMSwKLQkweEM3OCwgMHg3QjQ1MDAwMSwKLQkweEM3OCwgMHg3QTQ2MDAwMSwKLQkweEM3OCwgMHg3OTQ3MDAwMSwKLQkweEM3OCwgMHg3ODQ4MDAwMSwKLQkweEM3OCwgMHg3NzQ5MDAwMSwKLQkweEM3OCwgMHg3NjRBMDAwMSwKLQkweEM3OCwgMHg3NTRCMDAwMSwKLQkweEM3OCwgMHg3NDRDMDAwMSwKLQkweEM3OCwgMHg3MzREMDAwMSwKLQkweEM3OCwgMHg3MjRFMDAwMSwKLQkweEM3OCwgMHg3MTRGMDAwMSwKLQkweEM3OCwgMHg3MDUwMDAwMSwKLQkweEM3OCwgMHg2RjUxMDAwMSwKLQkweEM3OCwgMHg2RTUyMDAwMSwKLQkweEM3OCwgMHg2RDUzMDAwMSwKLQkweEM3OCwgMHg2QzU0MDAwMSwKLQkweEM3OCwgMHg2QjU1MDAwMSwKLQkweEM3OCwgMHg2QTU2MDAwMSwKLQkweEM3OCwgMHg2OTU3MDAwMSwKLQkweEM3OCwgMHg2ODU4MDAwMSwKLQkweEM3OCwgMHg2NzU5MDAwMSwKLQkweEM3OCwgMHg2NjVBMDAwMSwKLQkweEM3OCwgMHg2NTVCMDAwMSwKLQkweEM3OCwgMHg2NDVDMDAwMSwKLQkweEM3OCwgMHg2MzVEMDAwMSwKLQkweEM3OCwgMHg2MjVFMDAwMSwKLQkweEM3OCwgMHg2MTVGMDAwMSwKLQkweEM3OCwgMHg2MDYwMDAwMSwKLQkweEM3OCwgMHg0OTYxMDAwMSwKLQkweEM3OCwgMHg0ODYyMDAwMSwKLQkweEM3OCwgMHg0NzYzMDAwMSwKLQkweEM3OCwgMHg0NjY0MDAwMSwKLQkweEM3OCwgMHg0NTY1MDAwMSwKLQkweEM3OCwgMHg0NDY2MDAwMSwKLQkweEM3OCwgMHg0MzY3MDAwMSwKLQkweEM3OCwgMHg0MjY4MDAwMSwKLQkweEM3OCwgMHg0MTY5MDAwMSwKLQkweEM3OCwgMHg0MDZBMDAwMSwKLQkweEM3OCwgMHgyNjZCMDAwMSwKLQkweEM3OCwgMHgyNTZDMDAwMSwKLQkweEM3OCwgMHgyNDZEMDAwMSwKLQkweEM3OCwgMHgyMzZFMDAwMSwKLQkweEM3OCwgMHgyMjZGMDAwMSwKLQkweEM3OCwgMHgyMTcwMDAwMSwKLQkweEM3OCwgMHgyMDcxMDAwMSwKLQkweEM3OCwgMHgwNjcyMDAwMSwKLQkweEM3OCwgMHgwNTczMDAwMSwKLQkweEM3OCwgMHgwNDc0MDAwMSwKLQkweEM3OCwgMHgwMzc1MDAwMSwKLQkweEM3OCwgMHgwMjc2MDAwMSwKLQkweEM3OCwgMHgwMTc3MDAwMSwKLQkweEM3OCwgMHgwMDc4MDAwMSwKLQkweEM3OCwgMHgwMDc5MDAwMSwKLQkweEM3OCwgMHgwMDdBMDAwMSwKLQkweEM3OCwgMHgwMDdCMDAwMSwKLQkweEM3OCwgMHgwMDdDMDAwMSwKLQkweEM3OCwgMHgwMDdEMDAwMSwKLQkweEM3OCwgMHgwMDdFMDAwMSwKLQkweEM3OCwgMHgwMDdGMDAwMSwKLQkweEM3OCwgMHgzODAwMDAxRSwKLQkweEM3OCwgMHgzODAxMDAxRSwKLQkweEM3OCwgMHgzODAyMDAxRSwKLQkweEM3OCwgMHgzODAzMDAxRSwKLQkweEM3OCwgMHgzODA0MDAxRSwKLQkweEM3OCwgMHgzODA1MDAxRSwKLQkweEM3OCwgMHgzODA2MDAxRSwKLQkweEM3OCwgMHgzODA3MDAxRSwKLQkweEM3OCwgMHgzODA4MDAxRSwKLQkweEM3OCwgMHgzQzA5MDAxRSwKLQkweEM3OCwgMHgzRTBBMDAxRSwKLQkweEM3OCwgMHg0MDBCMDAxRSwKLQkweEM3OCwgMHg0NDBDMDAxRSwKLQkweEM3OCwgMHg0ODBEMDAxRSwKLQkweEM3OCwgMHg0QzBFMDAxRSwKLQkweEM3OCwgMHg1MDBGMDAxRSwKLQkweEM3OCwgMHg1MjEwMDAxRSwKLQkweEM3OCwgMHg1NjExMDAxRSwKLQkweEM3OCwgMHg1QTEyMDAxRSwKLQkweEM3OCwgMHg1RTEzMDAxRSwKLQkweEM3OCwgMHg2MDE0MDAxRSwKLQkweEM3OCwgMHg2MDE1MDAxRSwKLQkweEM3OCwgMHg2MDE2MDAxRSwKLQkweEM3OCwgMHg2MjE3MDAxRSwKLQkweEM3OCwgMHg2MjE4MDAxRSwKLQkweEM3OCwgMHg2MjE5MDAxRSwKLQkweEM3OCwgMHg2MjFBMDAxRSwKLQkweEM3OCwgMHg2MjFCMDAxRSwKLQkweEM3OCwgMHg2MjFDMDAxRSwKLQkweEM3OCwgMHg2MjFEMDAxRSwKLQkweEM3OCwgMHg2MjFFMDAxRSwKLQkweEM3OCwgMHg2MjFGMDAxRSwKLX07Ci0KLSNkZWZpbmUgUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKQkJCVwKLQlkbyB7CQkJCQkJXAotCQlpICs9IDI7IHYxID0gQXJyYXlbaV07IHYyID0gQXJyYXlbaSsxXTsJXAotCX0gd2hpbGUgKDApCi0KLXZvaWQgT0RNX1JlYWRBbmRDb25maWdfQUdDX1RBQl8xVF84NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0JdTMyIGhleDsKLQl1MzIgaTsKLQl1OCBwbGF0Zm9ybSA9IDB4MDQ7Ci0JdTggYm9hcmQgPSBwRE1fT2RtLT5Cb2FyZFR5cGU7Ci0JdTMyIEFycmF5TGVuID0gQVJSQVlfU0laRShBcnJheV9BR0NfVEFCXzFUXzg3MjNBKTsKLQl1MzIgKkFycmF5ID0gQXJyYXlfQUdDX1RBQl8xVF84NzIzQTsKLQotCWhleCA9IGJvYXJkOwotCWhleCArPSBPRE1fSVRSRl9VU0IgPDwgODsKLQloZXggKz0gcGxhdGZvcm0gPDwgMTY7Ci0JaGV4ICs9IDB4RkYwMDAwMDA7Ci0JZm9yIChpID0gMDsgaSA8IEFycmF5TGVuOyBpICs9IDIpIHsKLQkJdTMyIHYxID0gQXJyYXlbaV07Ci0JCXUzMiB2MiA9IEFycmF5W2krMV07Ci0KLQkJLyogIFRoaXMgKG9mZnNldCwgZGF0YSkgcGFpciBtZWV0cyB0aGUgY29uZGl0aW9uLiAqLwotCQlpZiAodjEgPCAweENEQ0RDRENEKSB7Ci0JCQlvZG1fQ29uZmlnQkJfQUdDXzg3MjNBKHBETV9PZG0sIHYxLCB2Mik7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsKLQkJCWlmICghQ2hlY2tDb25kaXRpb24oQXJyYXlbaV0sIGhleCkpIHsKLQkJCQkvKiBEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMgKi8KLQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKLQkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RDRCAmJiBpIDwgQXJyYXlMZW4gLSAyKQotCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCWkgLT0gMjsgLyogIHByZXZlbnQgZnJvbSBmb3ItbG9vcCArPSAyICovCi0JCQl9IGVsc2UgewotCQkJCS8qICBDb25maWd1cmUgbWF0Y2hlZCBwYWlycyBhbmQgc2tpcCB0bwotCQkJCSAgICBlbmQgb2YgaWYtZWxzZS4gKi8KLQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKLQkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RDRCAmJiBpIDwgQXJyYXlMZW4gLSAyKSB7Ci0JCQkJCW9kbV9Db25maWdCQl9BR0NfODcyM0EocERNX09kbSwgdjEsIHYyKTsKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl9Ci0JCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJiBpIDwgQXJyYXlMZW4gLSAyKQotCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhZX1JFR18xVC5UWFQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHUzMiBBcnJheV9QSFlfUkVHXzFUXzg3MjNBW10gPSB7Ci0JMHg4MDAsIDB4ODAwNDAwMDAsCi0JMHg4MDQsIDB4MDAwMDAwMDMsCi0JMHg4MDgsIDB4MDAwMEZDMDAsCi0JMHg4MEMsIDB4MDAwMDAwMEEsCi0JMHg4MTAsIDB4MTAwMDEzMzEsCi0JMHg4MTQsIDB4MDIwQzNEMTAsCi0JMHg4MTgsIDB4MDIyMDAzODUsCi0JMHg4MUMsIDB4MDAwMDAwMDAsCi0JMHg4MjAsIDB4MDEwMDAxMDAsCi0JMHg4MjQsIDB4MDAzOTAwMDQsCi0JMHg4MjgsIDB4MDAwMDAwMDAsCi0JMHg4MkMsIDB4MDAwMDAwMDAsCi0JMHg4MzAsIDB4MDAwMDAwMDAsCi0JMHg4MzQsIDB4MDAwMDAwMDAsCi0JMHg4MzgsIDB4MDAwMDAwMDAsCi0JMHg4M0MsIDB4MDAwMDAwMDAsCi0JMHg4NDAsIDB4MDAwMTAwMDAsCi0JMHg4NDQsIDB4MDAwMDAwMDAsCi0JMHg4NDgsIDB4MDAwMDAwMDAsCi0JMHg4NEMsIDB4MDAwMDAwMDAsCi0JMHg4NTAsIDB4MDAwMDAwMDAsCi0JMHg4NTQsIDB4MDAwMDAwMDAsCi0JMHg4NTgsIDB4NTY5QTU2OUEsCi0JMHg4NUMsIDB4MDAxQjI1QTQsCi0JMHg4NjAsIDB4NjZGNjAxMTAsCi0JMHg4NjQsIDB4MDYxRjAxMzAsCi0JMHg4NjgsIDB4MDAwMDAwMDAsCi0JMHg4NkMsIDB4MzIzMjMyMDAsCi0JMHg4NzAsIDB4MDcwMDA3NjAsCi0JMHg4NzQsIDB4MjIwMDQwMDAsCi0JMHg4NzgsIDB4MDAwMDA4MDgsCi0JMHg4N0MsIDB4MDAwMDAwMDAsCi0JMHg4ODAsIDB4QzAwODMwNzAsCi0JMHg4ODQsIDB4MDAwMDA0RDUsCi0JMHg4ODgsIDB4MDAwMDAwMDAsCi0JMHg4OEMsIDB4Q0NDMDAwQzAsCi0JMHg4OTAsIDB4MDAwMDA4MDAsCi0JMHg4OTQsIDB4RkZGRkZGRkUsCi0JMHg4OTgsIDB4NDAzMDIwMTAsCi0JMHg4OUMsIDB4MDA3MDYwNTAsCi0JMHg5MDAsIDB4MDAwMDAwMDAsCi0JMHg5MDQsIDB4MDAwMDAwMjMsCi0JMHg5MDgsIDB4MDAwMDAwMDAsCi0JMHg5MEMsIDB4ODExMjExMTEsCi0JMHhBMDAsIDB4MDBEMDQ3QzgsCi0JMHhBMDQsIDB4ODBGRjAwMEMsCi0JMHhBMDgsIDB4OEM4MzgzMDAsCi0JMHhBMEMsIDB4MkU2ODEyMEYsCi0JMHhBMTAsIDB4OTUwMEJCNzgsCi0JMHhBMTQsIDB4MTExNDQwMjgsCi0JMHhBMTgsIDB4MDA4ODExMTcsCi0JMHhBMUMsIDB4ODkxNDBGMDAsCi0JMHhBMjAsIDB4MUExQjAwMDAsCi0JMHhBMjQsIDB4MDkwRTEzMTcsCi0JMHhBMjgsIDB4MDAwMDAyMDQsCi0JMHhBMkMsIDB4MDBEMzAwMDAsCi0JMHhBNzAsIDB4MTAxRkJGMDAsCi0JMHhBNzQsIDB4MDAwMDAwMDcsCi0JMHhBNzgsIDB4MDAwMDA5MDAsCi0JMHhDMDAsIDB4NDgwNzFENDAsCi0JMHhDMDQsIDB4MDNBMDU2MTEsCi0JMHhDMDgsIDB4MDAwMDAwRTQsCi0JMHhDMEMsIDB4NkM2QzZDNkMsCi0JMHhDMTAsIDB4MDg4MDAwMDAsCi0JMHhDMTQsIDB4NDAwMDAxMDAsCi0JMHhDMTgsIDB4MDg4MDAwMDAsCi0JMHhDMUMsIDB4NDAwMDAxMDAsCi0JMHhDMjAsIDB4MDAwMDAwMDAsCi0JMHhDMjQsIDB4MDAwMDAwMDAsCi0JMHhDMjgsIDB4MDAwMDAwMDAsCi0JMHhDMkMsIDB4MDAwMDAwMDAsCi0JMHhDMzAsIDB4NjlFOUFDNDQsCi0JMHhGRjBGMDExRiwgMHhBQkNELAotCTB4QzM0LCAweDQ2OTY1MkNGLAotCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKLQkweEMzNCwgMHg0Njk2NTJBRiwKLQkweEZGMEYwMTFGLCAweERFQUQsCi0JMHhDMzgsIDB4NDk3OTU5OTQsCi0JMHhDM0MsIDB4MEE5Nzk3MUMsCi0JMHhDNDAsIDB4MUY3QzQwM0YsCi0JMHhDNDQsIDB4MDAwMTAwQjcsCi0JMHhDNDgsIDB4RUMwMjAxMDcsCi0JMHhDNEMsIDB4MDA3RjAzN0YsCi0JMHhDNTAsIDB4Njk1NDM0MjAsCi0JMHhDNTQsIDB4NDNCQzAwOTQsCi0JMHhDNTgsIDB4Njk1NDM0MjAsCi0JMHhDNUMsIDB4NDMzQzAwOTQsCi0JMHhDNjAsIDB4MDAwMDAwMDAsCi0JMHhGRjBGMDExRiwgMHhBQkNELAotCTB4QzY0LCAweDcxMTY4NDhCLAotCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKLQkweEM2NCwgMHg3MTEyODQ4QiwKLQkweEZGMEYwMTFGLCAweERFQUQsCi0JMHhDNjgsIDB4NDdDMDBCRkYsCi0JMHhDNkMsIDB4MDAwMDAwMzYsCi0JMHhDNzAsIDB4MkM3RjAwMEQsCi0JMHhDNzQsIDB4MDE4NjEwREIsCi0JMHhDNzgsIDB4MDAwMDAwMUYsCi0JMHhDN0MsIDB4MDBCOTE2MTIsCi0JMHhDODAsIDB4NDAwMDAxMDAsCi0JMHhDODQsIDB4MjBGNjAwMDAsCi0JMHhDODgsIDB4NDAwMDAxMDAsCi0JMHhDOEMsIDB4MjAyMDAwMDAsCi0JMHhDOTAsIDB4MDAxMjE4MjAsCi0JMHhDOTQsIDB4MDAwMDAwMDAsCi0JMHhDOTgsIDB4MDAxMjE4MjAsCi0JMHhDOUMsIDB4MDAwMDdGN0YsCi0JMHhDQTAsIDB4MDAwMDAwMDAsCi0JMHhDQTQsIDB4MDAwMDAwODAsCi0JMHhDQTgsIDB4MDAwMDAwMDAsCi0JMHhDQUMsIDB4MDAwMDAwMDAsCi0JMHhDQjAsIDB4MDAwMDAwMDAsCi0JMHhDQjQsIDB4MDAwMDAwMDAsCi0JMHhDQjgsIDB4MDAwMDAwMDAsCi0JMHhDQkMsIDB4MjgwMDAwMDAsCi0JMHhDQzAsIDB4MDAwMDAwMDAsCi0JMHhDQzQsIDB4MDAwMDAwMDAsCi0JMHhDQzgsIDB4MDAwMDAwMDAsCi0JMHhDQ0MsIDB4MDAwMDAwMDAsCi0JMHhDRDAsIDB4MDAwMDAwMDAsCi0JMHhDRDQsIDB4MDAwMDAwMDAsCi0JMHhDRDgsIDB4NjRCMjI0MjcsCi0JMHhDREMsIDB4MDA3NjY5MzIsCi0JMHhDRTAsIDB4MDAyMjIyMjIsCi0JMHhDRTQsIDB4MDAwMDAwMDAsCi0JMHhDRTgsIDB4Mzc2NDQzMDIsCi0JMHhDRUMsIDB4MkY5N0Q0MEMsCi0JMHhEMDAsIDB4MDAwODA3NDAsCi0JMHhEMDQsIDB4MDAwMjA0MDEsCi0JMHhEMDgsIDB4MDAwMDkwN0YsCi0JMHhEMEMsIDB4MjAwMTAyMDEsCi0JMHhEMTAsIDB4QTA2MzMzMzMsCi0JMHhEMTQsIDB4MzMzM0JDNDMsCi0JMHhEMTgsIDB4N0E4RjVCNkIsCi0JMHhEMkMsIDB4Q0M5Nzk5NzUsCi0JMHhEMzAsIDB4MDAwMDAwMDAsCi0JMHhEMzQsIDB4ODA2MDgwMDAsCi0JMHhEMzgsIDB4MDAwMDAwMDAsCi0JMHhEM0MsIDB4MDAwMjcyOTMsCi0JMHhENDAsIDB4MDAwMDAwMDAsCi0JMHhENDQsIDB4MDAwMDAwMDAsCi0JMHhENDgsIDB4MDAwMDAwMDAsCi0JMHhENEMsIDB4MDAwMDAwMDAsCi0JMHhENTAsIDB4NjQzNzE0MEEsCi0JMHhENTQsIDB4MDAwMDAwMDAsCi0JMHhENTgsIDB4MDAwMDAwMDAsCi0JMHhENUMsIDB4MzAwMzIwNjQsCi0JMHhENjAsIDB4NDY1M0RFNjgsCi0JMHhENjQsIDB4MDQ1MThBM0MsCi0JMHhENjgsIDB4MDAwMDIxMDEsCi0JMHhENkMsIDB4MkEyMDFDMTYsCi0JMHhENzAsIDB4MTgxMjM2MkUsCi0JMHhENzQsIDB4MzIyQzIyMjAsCi0JMHhENzgsIDB4MDAwRTNDMjQsCi0JMHhFMDAsIDB4MkEyQTJBMkEsCi0JMHhFMDQsIDB4MkEyQTJBMkEsCi0JMHhFMDgsIDB4MDM5MDJBMkEsCi0JMHhFMTAsIDB4MkEyQTJBMkEsCi0JMHhFMTQsIDB4MkEyQTJBMkEsCi0JMHhFMTgsIDB4MkEyQTJBMkEsCi0JMHhFMUMsIDB4MkEyQTJBMkEsCi0JMHhFMjgsIDB4MDAwMDAwMDAsCi0JMHhFMzAsIDB4MTAwMERDMUYsCi0JMHhFMzQsIDB4MTAwMDhDMUYsCi0JMHhFMzgsIDB4MDIxNDAxMDIsCi0JMHhFM0MsIDB4NjgxNjA0QzIsCi0JMHhFNDAsIDB4MDEwMDdDMDAsCi0JMHhFNDQsIDB4MDEwMDQ4MDAsCi0JMHhFNDgsIDB4RkIwMDAwMDAsCi0JMHhFNEMsIDB4MDAwMDI4RDEsCi0JMHhFNTAsIDB4MTAwMERDMUYsCi0JMHhFNTQsIDB4MTAwMDhDMUYsCi0JMHhFNTgsIDB4MDIxNDAxMDIsCi0JMHhFNUMsIDB4MjgxNjBEMDUsCi0JMHhFNjAsIDB4MDAwMDAwMDgsCi0JMHhFNjgsIDB4MDAxQjI1QTQsCi0JMHhFNkMsIDB4NjMxQjI1QTAsCi0JMHhFNzAsIDB4NjMxQjI1QTAsCi0JMHhFNzQsIDB4MDgxQjI1QTAsCi0JMHhFNzgsIDB4MDgxQjI1QTAsCi0JMHhFN0MsIDB4MDgxQjI1QTAsCi0JMHhFODAsIDB4MDgxQjI1QTAsCi0JMHhFODQsIDB4NjMxQjI1QTAsCi0JMHhFODgsIDB4MDgxQjI1QTAsCi0JMHhFOEMsIDB4NjMxQjI1QTAsCi0JMHhFRDAsIDB4NjMxQjI1QTAsCi0JMHhFRDQsIDB4NjMxQjI1QTAsCi0JMHhFRDgsIDB4NjMxQjI1QTAsCi0JMHhFREMsIDB4MDAxQjI1QTAsCi0JMHhFRTAsIDB4MDAxQjI1QTAsCi0JMHhFRUMsIDB4NkIxQjI1QTAsCi0JMHhGMTQsIDB4MDAwMDAwMDMsCi0JMHhGNEMsIDB4MDAwMDAwMDAsCi0JMHhGMDAsIDB4MDAwMDAzMDAsCi19OwotCi12b2lkIE9ETV9SZWFkQW5kQ29uZmlnX1BIWV9SRUdfMVRfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXUzMiBoZXggPSAwOwotCXUzMiBpID0gMDsKLQl1OCAgcGxhdGZvcm0gPSAweDA0OwotCXU4ICBib2FyZCA9IHBETV9PZG0tPkJvYXJkVHlwZTsKLQl1MzIgQXJyYXlMZW4gPSBBUlJBWV9TSVpFKEFycmF5X1BIWV9SRUdfMVRfODcyM0EpOwotCXUzMiAqQXJyYXkgPSBBcnJheV9QSFlfUkVHXzFUXzg3MjNBOwotCi0JaGV4ICs9IGJvYXJkOwotCWhleCArPSBPRE1fSVRSRl9VU0IgPDwgODsKLQloZXggKz0gcGxhdGZvcm0gPDwgMTY7Ci0JaGV4ICs9IDB4RkYwMDAwMDA7Ci0JZm9yIChpID0gMDsgaSA8IEFycmF5TGVuOyBpICs9IDIpIHsKLQkJdTMyIHYxID0gQXJyYXlbaV07Ci0JCXUzMiB2MiA9IEFycmF5W2krMV07Ci0KLQkJLyogIFRoaXMgKG9mZnNldCwgZGF0YSkgcGFpciBtZWV0cyB0aGUgY29uZGl0aW9uLiAqLwotCQlpZiAodjEgPCAweENEQ0RDRENEKSB7Ci0JCQlvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHBETV9PZG0sIHYxLCB2Mik7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsKLQkJCWlmICghQ2hlY2tDb25kaXRpb24oQXJyYXlbaV0sIGhleCkpIHsKLQkJCQkvKiBEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMgKi8KLQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKLQkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RDRCAmJiBpIDwgQXJyYXlMZW4gLSAyKQotCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCWkgLT0gMjsgLyogIHByZXZlbnQgZnJvbSBmb3ItbG9vcCArPSAyICovCi0JCQl9IGVsc2UgewotCQkJCS8qICBDb25maWd1cmUgbWF0Y2hlZCBwYWlycyBhbmQgc2tpcCB0bwotCQkJCSAgICBlbmQgb2YgaWYtZWxzZS4gKi8KLQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKLQkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RDRCAmJiBpIDwgQXJyYXlMZW4gLSAyKSB7Ci0JCQkJCW9kbV9Db25maWdCQl9QSFlfODcyM0EocERNX09kbSwgdjEsIHYyKTsKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl9Ci0JCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJiBpIDwgQXJyYXlMZW4gLSAyKQotCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhZX1JFR19NUC5UWFQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHUzMiBBcnJheV9QSFlfUkVHX01QXzg3MjNBW10gPSB7Ci0JMHhDMzAsIDB4NjlFOUFDNEEsCi0JMHhDM0MsIDB4MEE5Nzk3MTgsCi19OwotCi12b2lkIE9ETV9SZWFkQW5kQ29uZmlnX1BIWV9SRUdfTVBfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXUzMiBoZXggPSAwOwotCXUzMiBpOwotCXU4IHBsYXRmb3JtID0gMHgwNDsKLQl1OCBib2FyZCA9IHBETV9PZG0tPkJvYXJkVHlwZTsKLQl1MzIgQXJyYXlMZW4gPSBBUlJBWV9TSVpFKEFycmF5X1BIWV9SRUdfTVBfODcyM0EpOwotCXUzMiAqQXJyYXkgPSBBcnJheV9QSFlfUkVHX01QXzg3MjNBOwotCi0JaGV4ICs9IGJvYXJkOwotCWhleCArPSBPRE1fSVRSRl9VU0IgPDwgODsKLQloZXggKz0gcGxhdGZvcm0gPDwgMTY7Ci0JaGV4ICs9IDB4RkYwMDAwMDA7Ci0JZm9yIChpID0gMDsgaSA8IEFycmF5TGVuOyBpICs9IDIpIHsKLQkJdTMyIHYxID0gQXJyYXlbaV07Ci0JCXUzMiB2MiA9IEFycmF5W2krMV07Ci0KLQkJLyogIFRoaXMgKG9mZnNldCwgZGF0YSkgcGFpciBtZWV0cyB0aGUgY29uZGl0aW9uLiAqLwotCQlpZiAodjEgPCAweENEQ0RDRENEKSB7Ci0JCQlvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHBETV9PZG0sIHYxLCB2Mik7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsKLQkJCWlmICghQ2hlY2tDb25kaXRpb24oQXJyYXlbaV0sIGhleCkpIHsKLQkJCQkvKiBEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMgKi8KLQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKLQkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RDRCAmJiBpIDwgQXJyYXlMZW4gLSAyKQotCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCWkgLT0gMjsgLyogIHByZXZlbnQgZnJvbSBmb3ItbG9vcCArPSAyICovCi0JCQl9IGVsc2UgewotCQkJCS8qIENvbmZpZ3VyZSBtYXRjaGVkIHBhaXJzIGFuZCBza2lwIHRvCi0JCQkJICAgZW5kIG9mIGlmLWVsc2UuICovCi0JCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgotCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IEFycmF5TGVuIC0gMikgewotCQkJCQlvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHBETV9PZG0sIHYxLCB2Mik7Ci0JCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7Ci0JCQkJfQotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYgaSA8IEFycmF5TGVuIC0gMikKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfTUFDLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxIV0ltZzg3MjNBX01BQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmY2ODU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfTUFDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0qIG1vcmUgZGV0YWlscy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm9kbV9wcmVjb21wLmgiCi0KLXN0YXRpYyBib29sIENoZWNrQ29uZGl0aW9uKGNvbnN0IHUzMiAgQ29uZGl0aW9uLCBjb25zdCB1MzIgIEhleCkKLXsKLQl1MzIgX2JvYXJkICAgICA9IChIZXggJiAweDAwMDAwMEZGKTsKLQl1MzIgX2ludGVyZmFjZSA9IChIZXggJiAweDAwMDBGRjAwKSA+PiA4OwotCXUzMiBfcGxhdGZvcm0gID0gKEhleCAmIDB4MDBGRjAwMDApID4+IDE2OwotCXUzMiBjb25kID0gQ29uZGl0aW9uOwotCi0JaWYgKENvbmRpdGlvbiA9PSAweENEQ0RDRENEKQotCQlyZXR1cm4gdHJ1ZTsKLQotCWNvbmQgPSBDb25kaXRpb24gJiAweDAwMDAwMEZGOwotCWlmICgoX2JvYXJkID09IGNvbmQpICYmIGNvbmQgIT0gMHgwMCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JY29uZCA9IENvbmRpdGlvbiAmIDB4MDAwMEZGMDA7Ci0JY29uZCA+Pj0gODsKLQlpZiAoKF9pbnRlcmZhY2UgJiBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHgwNykKLQkJcmV0dXJuIGZhbHNlOwotCi0JY29uZCA9IENvbmRpdGlvbiAmIDB4MDBGRjAwMDA7Ci0JY29uZCA+Pj0gMTY7Ci0JaWYgKChfcGxhdGZvcm0gJiBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHgwRikKLQkJcmV0dXJuIGZhbHNlOwotCXJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFDX1JFRy5UWFQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHUzMiBBcnJheV9NQUNfUkVHXzg3MjNBW10gPSB7Ci0JCTB4NDIwLCAweDAwMDAwMDgwLAotCQkweDQyMywgMHgwMDAwMDAwMCwKLQkJMHg0MzAsIDB4MDAwMDAwMDAsCi0JCTB4NDMxLCAweDAwMDAwMDAwLAotCQkweDQzMiwgMHgwMDAwMDAwMCwKLQkJMHg0MzMsIDB4MDAwMDAwMDEsCi0JCTB4NDM0LCAweDAwMDAwMDA0LAotCQkweDQzNSwgMHgwMDAwMDAwNSwKLQkJMHg0MzYsIDB4MDAwMDAwMDYsCi0JCTB4NDM3LCAweDAwMDAwMDA3LAotCQkweDQzOCwgMHgwMDAwMDAwMCwKLQkJMHg0MzksIDB4MDAwMDAwMDAsCi0JCTB4NDNBLCAweDAwMDAwMDAwLAotCQkweDQzQiwgMHgwMDAwMDAwMSwKLQkJMHg0M0MsIDB4MDAwMDAwMDQsCi0JCTB4NDNELCAweDAwMDAwMDA1LAotCQkweDQzRSwgMHgwMDAwMDAwNiwKLQkJMHg0M0YsIDB4MDAwMDAwMDcsCi0JCTB4NDQwLCAweDAwMDAwMDVELAotCQkweDQ0MSwgMHgwMDAwMDAwMSwKLQkJMHg0NDIsIDB4MDAwMDAwMDAsCi0JCTB4NDQ0LCAweDAwMDAwMDE1LAotCQkweDQ0NSwgMHgwMDAwMDBGMCwKLQkJMHg0NDYsIDB4MDAwMDAwMEYsCi0JCTB4NDQ3LCAweDAwMDAwMDAwLAotCQkweDQ1OCwgMHgwMDAwMDA0MSwKLQkJMHg0NTksIDB4MDAwMDAwQTgsCi0JCTB4NDVBLCAweDAwMDAwMDcyLAotCQkweDQ1QiwgMHgwMDAwMDBCOSwKLQkJMHg0NjAsIDB4MDAwMDAwNjYsCi0JCTB4NDYxLCAweDAwMDAwMDY2LAotCQkweDQ2MiwgMHgwMDAwMDAwOCwKLQkJMHg0NjMsIDB4MDAwMDAwMDMsCi0JCTB4NEM4LCAweDAwMDAwMEZGLAotCQkweDRDOSwgMHgwMDAwMDAwOCwKLQkJMHg0Q0MsIDB4MDAwMDAwRkYsCi0JCTB4NENELCAweDAwMDAwMEZGLAotCQkweDRDRSwgMHgwMDAwMDAwMSwKLQkJMHg1MDAsIDB4MDAwMDAwMjYsCi0JCTB4NTAxLCAweDAwMDAwMEEyLAotCQkweDUwMiwgMHgwMDAwMDAyRiwKLQkJMHg1MDMsIDB4MDAwMDAwMDAsCi0JCTB4NTA0LCAweDAwMDAwMDI4LAotCQkweDUwNSwgMHgwMDAwMDBBMywKLQkJMHg1MDYsIDB4MDAwMDAwNUUsCi0JCTB4NTA3LCAweDAwMDAwMDAwLAotCQkweDUwOCwgMHgwMDAwMDAyQiwKLQkJMHg1MDksIDB4MDAwMDAwQTQsCi0JCTB4NTBBLCAweDAwMDAwMDVFLAotCQkweDUwQiwgMHgwMDAwMDAwMCwKLQkJMHg1MEMsIDB4MDAwMDAwNEYsCi0JCTB4NTBELCAweDAwMDAwMEE0LAotCQkweDUwRSwgMHgwMDAwMDAwMCwKLQkJMHg1MEYsIDB4MDAwMDAwMDAsCi0JCTB4NTEyLCAweDAwMDAwMDFDLAotCQkweDUxNCwgMHgwMDAwMDAwQSwKLQkJMHg1MTUsIDB4MDAwMDAwMTAsCi0JCTB4NTE2LCAweDAwMDAwMDBBLAotCQkweDUxNywgMHgwMDAwMDAxMCwKLQkJMHg1MUEsIDB4MDAwMDAwMTYsCi0JCTB4NTI0LCAweDAwMDAwMDBGLAotCQkweDUyNSwgMHgwMDAwMDA0RiwKLQkJMHg1NDYsIDB4MDAwMDAwNDAsCi0JCTB4NTQ3LCAweDAwMDAwMDAwLAotCQkweDU1MCwgMHgwMDAwMDAxMCwKLQkJMHg1NTEsIDB4MDAwMDAwMTAsCi0JCTB4NTU5LCAweDAwMDAwMDAyLAotCQkweDU1QSwgMHgwMDAwMDAwMiwKLQkJMHg1NUQsIDB4MDAwMDAwRkYsCi0JCTB4NjA1LCAweDAwMDAwMDMwLAotCQkweDYwOCwgMHgwMDAwMDAwRSwKLQkJMHg2MDksIDB4MDAwMDAwMkEsCi0JCTB4NjUyLCAweDAwMDAwMDIwLAotCQkweDYzQywgMHgwMDAwMDAwQSwKLQkJMHg2M0QsIDB4MDAwMDAwMEEsCi0JCTB4NjNFLCAweDAwMDAwMDBFLAotCQkweDYzRiwgMHgwMDAwMDAwRSwKLQkJMHg2NkUsIDB4MDAwMDAwMDUsCi0JCTB4NzAwLCAweDAwMDAwMDIxLAotCQkweDcwMSwgMHgwMDAwMDA0MywKLQkJMHg3MDIsIDB4MDAwMDAwNjUsCi0JCTB4NzAzLCAweDAwMDAwMDg3LAotCQkweDcwOCwgMHgwMDAwMDAyMSwKLQkJMHg3MDksIDB4MDAwMDAwNDMsCi0JCTB4NzBBLCAweDAwMDAwMDY1LAotCQkweDcwQiwgMHgwMDAwMDA4NywKLX07Ci0KLXZvaWQgT0RNX1JlYWRBbmRDb25maWdfTUFDX1JFR184NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0JI2RlZmluZSBSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpCQkJXAotCQkgZG8gewkJCQkJCVwKLQkJCWkgKz0gMjsgdjEgPSBBcnJheVtpXTsgdjIgPSBBcnJheVtpKzFdOwlcCi0JCSB9IHdoaWxlICgwKQotCi0JdTMyICAgICBoZXggICAgICAgICA9IDA7Ci0JdTMyICAgICBpICAgICAgICAgICA9IDA7Ci0JdTggICAgIHBsYXRmb3JtICAgID0gMHgwNDsKLQl1OCAgICAgYm9hcmQgICAgICAgPSBwRE1fT2RtLT5Cb2FyZFR5cGU7Ci0JdTMyICAgICBBcnJheUxlbiAgICA9IEFSUkFZX1NJWkUoQXJyYXlfTUFDX1JFR184NzIzQSk7Ci0JdTMyICpBcnJheSAgICAgICA9IEFycmF5X01BQ19SRUdfODcyM0E7Ci0KLQloZXggKz0gYm9hcmQ7Ci0JaGV4ICs9IE9ETV9JVFJGX1VTQiA8PCA4OwotCWhleCArPSBwbGF0Zm9ybSA8PCAxNjsKLQloZXggKz0gMHhGRjAwMDAwMDsKLQlmb3IgKGkgPSAwOyBpIDwgQXJyYXlMZW47IGkgKz0gMikgewotCQl1MzIgdjEgPSBBcnJheVtpXTsKLQkJdTMyIHYyID0gQXJyYXlbaSsxXTsKLQotCQkvKiAgVGhpcyAob2Zmc2V0LCBkYXRhKSBwYWlyIG1lZXRzIHRoZSBjb25kaXRpb24uICovCi0JCWlmICh2MSA8IDB4Q0RDRENEQ0QpIHsKLQkJCW9kbV9Db25maWdNQUNfODcyM0EocERNX09kbSwgdjEsICh1OCl2Mik7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsKLQkJCWlmICghQ2hlY2tDb25kaXRpb24oQXJyYXlbaV0sIGhleCkpIHsKLQkJCQkvKiBEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMuICovCi0JCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgotCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IEFycmF5TGVuIC0gMikKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQlpIC09IDI7IC8qICBwcmV2ZW50IGZyb20gZm9yLWxvb3AgKz0gMiAqLwotCQkJfSBlbHNlIHsKLQkJCQkvKiAgQ29uZmlndXJlIG1hdGNoZWQgcGFpcnMgYW5kIHNraXAgdG8gZW5kIG9mIGlmLWVsc2UuICovCi0JCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgotCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IEFycmF5TGVuIC0gMikgewotCQkJCQlvZG1fQ29uZmlnTUFDXzg3MjNBKHBETV9PZG0sIHYxLCAodTgpdjIpOwotCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCX0KLQotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYgaSA8IEFycmF5TGVuIC0gMikKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfUkYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfUkYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2ZjNlYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxIV0ltZzg3MjNBX1JGLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0qIG1vcmUgZGV0YWlscy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm9kbV9wcmVjb21wLmgiCi0KLXN0YXRpYyBib29sIENoZWNrQ29uZGl0aW9uKGNvbnN0IHUzMiAgQ29uZGl0aW9uLCBjb25zdCB1MzIgIEhleCkKLXsKLQl1MzIgX2JvYXJkICAgICA9IChIZXggJiAweDAwMDAwMEZGKTsKLQl1MzIgX2ludGVyZmFjZSA9IChIZXggJiAweDAwMDBGRjAwKSA+PiA4OwotCXUzMiBfcGxhdGZvcm0gID0gKEhleCAmIDB4MDBGRjAwMDApID4+IDE2OwotCXUzMiBjb25kID0gQ29uZGl0aW9uOwotCi0JaWYgKENvbmRpdGlvbiA9PSAweENEQ0RDRENEKQotCQlyZXR1cm4gdHJ1ZTsKLQotCWNvbmQgPSBDb25kaXRpb24gJiAweDAwMDAwMEZGOwotCWlmICgoX2JvYXJkID09IGNvbmQpICYmIGNvbmQgIT0gMHgwMCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JY29uZCA9IENvbmRpdGlvbiAmIDB4MDAwMEZGMDA7Ci0JY29uZCA+Pj0gODsKLQlpZiAoKF9pbnRlcmZhY2UgJiBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHgwNykKLQkJcmV0dXJuIGZhbHNlOwotCi0JY29uZCA9IENvbmRpdGlvbiAmIDB4MDBGRjAwMDA7Ci0JY29uZCA+Pj0gMTY7Ci0JaWYgKChfcGxhdGZvcm0gJiBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHgwRikKLQkJcmV0dXJuIGZhbHNlOwotCXJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9BXzFULlRYVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdTMyIEFycmF5X1JhZGlvQV8xVF84NzIzQVtdID0gewotCTB4MDAwLCAweDAwMDMwMTU5LAotCTB4MDAxLCAweDAwMDMxMjg0LAotCTB4MDAyLCAweDAwMDk4MDAwLAotCTB4RkYwRjAxMUYsIDB4QUJDRCwKLQkweDAwMywgMHgwMDAxOEM2MywKLQkweENEQ0RDRENELCAweENEQ0QsCi0JMHgwMDMsIDB4MDAwMzlDNjMsCi0JMHhGRjBGMDExRiwgMHhERUFELAotCTB4MDA0LCAweDAwMDIxMEU3LAotCTB4MDA5LCAweDAwMDIwNDRGLAotCTB4MDBBLCAweDAwMDFBM0YxLAotCTB4MDBCLCAweDAwMDE0Nzg3LAotCTB4MDBDLCAweDAwMDg5NkZFLAotCTB4MDBELCAweDAwMDBFMDJDLAotCTB4MDBFLCAweDAwMDM5Q0U3LAotCTB4MDBGLCAweDAwMDAwNDUxLAotCTB4MDE5LCAweDAwMDAwMDAwLAotCTB4MDFBLCAweDAwMDMwMzU1LAotCTB4MDFCLCAweDAwMDYwQTAwLAotCTB4MDFDLCAweDAwMEZDMzc4LAotCTB4MDFELCAweDAwMEExMjUwLAotCTB4MDFFLCAweDAwMDAwMjRGLAotCTB4MDFGLCAweDAwMDAwMDAwLAotCTB4MDIwLCAweDAwMDBCNjE0LAotCTB4MDIxLCAweDAwMDZDMDAwLAotCTB4MDIyLCAweDAwMDAwMDAwLAotCTB4MDIzLCAweDAwMDAxNTU4LAotCTB4MDI0LCAweDAwMDAwMDYwLAotCTB4MDI1LCAweDAwMDAwNDgzLAotCTB4MDI2LCAweDAwMDRGMDAwLAotCTB4MDI3LCAweDAwMEVDN0Q5LAotCTB4MDI4LCAweDAwMDU3NzMwLAotCTB4MDI5LCAweDAwMDA0NzgzLAotCTB4MDJBLCAweDAwMDAwMDAxLAotCTB4MDJCLCAweDAwMDIxMzM0LAotCTB4MDJBLCAweDAwMDAwMDAwLAotCTB4MDJCLCAweDAwMDAwMDU0LAotCTB4MDJBLCAweDAwMDAwMDAxLAotCTB4MDJCLCAweDAwMDAwODA4LAotCTB4MDJCLCAweDAwMDUzMzMzLAotCTB4MDJDLCAweDAwMDAwMDBDLAotCTB4MDJBLCAweDAwMDAwMDAyLAotCTB4MDJCLCAweDAwMDAwODA4LAotCTB4MDJCLCAweDAwMDVCMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDAzLAotCTB4MDJCLCAweDAwMDAwODA4LAotCTB4MDJCLCAweDAwMDYzMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDA0LAotCTB4MDJCLCAweDAwMDAwODA4LAotCTB4MDJCLCAweDAwMDZCMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDA1LAotCTB4MDJCLCAweDAwMDAwODA4LAotCTB4MDJCLCAweDAwMDczMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDA2LAotCTB4MDJCLCAweDAwMDAwNzA5LAotCTB4MDJCLCAweDAwMDVCMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDA3LAotCTB4MDJCLCAweDAwMDAwNzA5LAotCTB4MDJCLCAweDAwMDYzMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDA4LAotCTB4MDJCLCAweDAwMDAwNjBBLAotCTB4MDJCLCAweDAwMDRCMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDA5LAotCTB4MDJCLCAweDAwMDAwNjBBLAotCTB4MDJCLCAweDAwMDUzMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDBBLAotCTB4MDJCLCAweDAwMDAwNjBBLAotCTB4MDJCLCAweDAwMDVCMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDBCLAotCTB4MDJCLCAweDAwMDAwNjBBLAotCTB4MDJCLCAweDAwMDYzMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDBDLAotCTB4MDJCLCAweDAwMDAwNjBBLAotCTB4MDJCLCAweDAwMDZCMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDBELAotCTB4MDJCLCAweDAwMDAwNjBBLAotCTB4MDJCLCAweDAwMDczMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDBFLAotCTB4MDJCLCAweDAwMDAwNTBCLAotCTB4MDJCLCAweDAwMDY2NjY2LAotCTB4MDJDLCAweDAwMDAwMDFBLAotCTB4MDJBLCAweDAwMEUwMDAwLAotCTB4MDEwLCAweDAwMDQwMDBGLAotCTB4MDExLCAweDAwMEUzMUZDLAotCTB4MDEwLCAweDAwMDYwMDBGLAotCTB4MDExLCAweDAwMEZGOUY4LAotCTB4MDEwLCAweDAwMDIwMDBGLAotCTB4MDExLCAweDAwMDIwM0Y5LAotCTB4MDEwLCAweDAwMDMwMDBGLAotCTB4MDExLCAweDAwMEZGNTAwLAotCTB4MDEwLCAweDAwMDAwMDAwLAotCTB4MDExLCAweDAwMDAwMDAwLAotCTB4MDEwLCAweDAwMDgwMDBGLAotCTB4MDExLCAweDAwMDNGMTAwLAotCTB4MDEwLCAweDAwMDkwMDBGLAotCTB4MDExLCAweDAwMDIzMTAwLAotCTB4MDEyLCAweDAwMDMyMDAwLAotCTB4MDEyLCAweDAwMDcxMDAwLAotCTB4MDEyLCAweDAwMEIwMDAwLAotCTB4MDEyLCAweDAwMEZDMDAwLAotCTB4MDEzLCAweDAwMDI4N0IzLAotCTB4MDEzLCAweDAwMDI0NEI3LAotCTB4MDEzLCAweDAwMDIwNEFCLAotCTB4MDEzLCAweDAwMDFDNDlGLAotCTB4MDEzLCAweDAwMDE4NDkzLAotCTB4MDEzLCAweDAwMDE0MjlCLAotCTB4MDEzLCAweDAwMDEwMjk5LAotCTB4MDEzLCAweDAwMDBDMjlDLAotCTB4MDEzLCAweDAwMDA4MUEwLAotCTB4MDEzLCAweDAwMDA0MEFDLAotCTB4MDEzLCAweDAwMDAwMDIwLAotCTB4MDE0LCAweDAwMDE5NDRDLAotCTB4MDE0LCAweDAwMDU5NDQ0LAotCTB4MDE0LCAweDAwMDk5NDRDLAotCTB4MDE0LCAweDAwMEQ5NDQ0LAotCTB4RkYwRjAxMUYsIDB4QUJDRCwKLQkweDAxNSwgMHgwMDAwRjQyNCwKLQkweDAxNSwgMHgwMDA0RjQyNCwKLQkweDAxNSwgMHgwMDA4RjQyNCwKLQkweDAxNSwgMHgwMDBDRjQyNCwKLQkweENEQ0RDRENELCAweENEQ0QsCi0JMHgwMTUsIDB4MDAwMEY0NzQsCi0JMHgwMTUsIDB4MDAwNEY0NzcsCi0JMHgwMTUsIDB4MDAwOEY0NTUsCi0JMHgwMTUsIDB4MDAwQ0Y0NTUsCi0JMHhGRjBGMDExRiwgMHhERUFELAotCTB4MDE2LCAweDAwMDAwMzM5LAotCTB4MDE2LCAweDAwMDQwMzM5LAotCTB4MDE2LCAweDAwMDgwMzM5LAotCTB4RkYwRjAxMUYsIDB4QUJDRCwKLQkweDAxNiwgMHgwMDBDMDM1NiwKLQkweENEQ0RDRENELCAweENEQ0QsCi0JMHgwMTYsIDB4MDAwQzAzNjYsCi0JMHhGRjBGMDExRiwgMHhERUFELAotCTB4MDAwLCAweDAwMDEwMTU5LAotCTB4MDE4LCAweDAwMDBGNDAxLAotCTB4MEZFLCAweDAwMDAwMDAwLAotCTB4MEZFLCAweDAwMDAwMDAwLAotCTB4MDFGLCAweDAwMDAwMDAzLAotCTB4MEZFLCAweDAwMDAwMDAwLAotCTB4MEZFLCAweDAwMDAwMDAwLAotCTB4MDFFLCAweDAwMDAwMjQ3LAotCTB4MDFGLCAweDAwMDAwMDAwLAotCTB4MDAwLCAweDAwMDMwMTU5LAotfTsKLQotdm9pZCBPRE1fUmVhZEFuZENvbmZpZ19SYWRpb0FfMVRfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCSNkZWZpbmUgUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKQkJCVwKLQkJIGRvIHsJCQkJCQlcCi0JCQkgaSArPSAyOyB2MSA9IEFycmF5W2ldOyB2MiA9IEFycmF5W2krMV07XAotCQkgfSB3aGlsZSAoMCkKLQotCXUzMiAgICAgaGV4ICAgICAgICAgPSAwOwotCXUzMiAgICAgaSAgICAgICAgICAgPSAwOwotCXU4ICAgICBwbGF0Zm9ybSAgICA9IDB4MDQ7Ci0JdTggICAgIGJvYXJkICAgICAgID0gcERNX09kbS0+Qm9hcmRUeXBlOwotCXUzMiAgICAgQXJyYXlMZW4gICAgPSBBUlJBWV9TSVpFKEFycmF5X1JhZGlvQV8xVF84NzIzQSk7Ci0JdTMyICpBcnJheSA9IEFycmF5X1JhZGlvQV8xVF84NzIzQTsKLQotCWhleCArPSBib2FyZDsKLQloZXggKz0gT0RNX0lUUkZfVVNCIDw8IDg7Ci0JaGV4ICs9IHBsYXRmb3JtIDw8IDE2OwotCWhleCArPSAweEZGMDAwMDAwOwotCi0JZm9yIChpID0gMDsgaSA8IEFycmF5TGVuOyBpICs9IDIpIHsKLQkJdTMyIHYxID0gQXJyYXlbaV07Ci0JCXUzMiB2MiA9IEFycmF5W2krMV07Ci0KLQkJLyogIFRoaXMgKG9mZnNldCwgZGF0YSkgcGFpciBtZWV0cyB0aGUgY29uZGl0aW9uLiAqLwotCQlpZiAodjEgPCAweENEQ0RDRENEKSB7Ci0JCQlvZG1fQ29uZmlnUkZSZWdfODcyM0EocERNX09kbSwgdjEsIHYyLCBSRl9QQVRIX0EsIHYxKTsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgewotCQkJaWYgKCFDaGVja0NvbmRpdGlvbihBcnJheVtpXSwgaGV4KSkgewotCQkJCS8qICBEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMuICovCi0JCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgotCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IEFycmF5TGVuIC0gMikKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQlpIC09IDI7IC8qICBwcmV2ZW50IGZyb20gZm9yLWxvb3AgKz0gMiAqLwotCQkJfSBlbHNlIHsKLQkJCQkvKiAgQ29uZmlndXJlIG1hdGNoZWQgcGFpcnMgYW5kIHNraXAgdG8gZW5kIG9mIGlmLWVsc2UuICovCi0JCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgotCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IEFycmF5TGVuIC0gMikgewotCQkJCQlvZG1fQ29uZmlnUkZSZWdfODcyM0EocERNX09kbSwgdjEsIHYyLAotCQkJCQkJCSAgICAgIFJGX1BBVEhfQSwgdjEpOwotCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCX0KLQotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYgaSA8IEFycmF5TGVuIC0gMikKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbFB3clNlcUNtZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsUHdyU2VxQ21kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2Q5NmUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsUHdyU2VxQ21kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKisrCi1Db3B5cmlnaHQgKGMpIFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1Nb2R1bGUgTmFtZToKLQlIYWxQd3JTZXFDbWQuYwotCi1BYnN0cmFjdDoKLQlJbXBsZW1lbnQgSFcgUG93ZXIgc2VxdWVuY2UgY29uZmlndXJhdGlvbiBDTUQgaGFuZGxpbmcgcm91dGluZSBmb3IKLQlSZWFsdGVrIGRldmljZXMuCi0KLU1ham9yIENoYW5nZSBIaXN0b3J5OgotCVdoZW4gICAgICAgV2hvICAgICAgICAgICAgICAgV2hhdAotCS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCTIwMTEtMTAtMjYgTHVjYXMgICAgICAgICAgICBNb2RpZnkgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFNENC1DRSBkcml2ZXIuCi0JMjAxMS0wNy0wNyBSb2dlciAgICAgICAgICAgIENyZWF0ZS4KLQotLS0qLwotI2luY2x1ZGUgPEhhbFB3clNlcUNtZC5oPgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotLyogICovCi0vKglEZXNjcmlwdGlvbjogKi8KLS8qCQlUaGlzIHJvdXRpbmUgZGVhbCB3aXRoIHRoZSBQb3dlciBDb25maWd1cmF0aW9uIENNRHMgcGFyc2luZwotCQlmb3IgUlRMODcyMy9SVEw4MTg4RSBTZXJpZXMgSUMuICovCi0vKiAgKi8KLS8qCUFzc3VtcHRpb246ICovCi0vKgkJV2Ugc2hvdWxkIGZvbGxvdyBzcGVjaWZpYyBmb3JtYXQgd2hpY2ggd2FzIHJlbGVhc2VkIGZyb20KLQkJSFcgU0QuICovCi0vKiAgKi8KLS8qCTIwMTEuMDcuMDcsIGFkZGVkIGJ5IFJvZ2VyLiAqLwotLyogICovCi11OCBIYWxQd3JTZXFDbWRQYXJzaW5nMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IEN1dFZlcnNpb24sCi0JCSAgICAgICB1OCBGYWJWZXJzaW9uLCB1OCBJbnRlcmZhY2VUeXBlLAotCQkgICAgICAgc3RydWN0IHdsYW5fcHdyX2NmZyBQd3JTZXFDbWRbXSkKLXsKLQlzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIFB3ckNmZ0NtZDsKLQl1OCBiUG9sbGluZ0JpdDsKLQl1MzIgQXJ5SWR4ID0gMDsKLQl1OCB2YWx1ZTsKLQl1MzIgb2Zmc2V0OwotCXUzMiBwb2xsaW5nQ291bnQgPSAwOwkvKiAgcG9sbGluZyBhdXRvbG9hZCBkb25lLiAqLwotCXUzMiBtYXhQb2xsaW5nQ250ID0gNTAwMDsKLQotCWRvIHsKLQkJUHdyQ2ZnQ21kID0gUHdyU2VxQ21kW0FyeUlkeF07Ci0KLQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAiSGFsUHdyU2VxQ21kUGFyc2luZzIzYTogb2Zmc2V0KCUjeCkgY3V0X21zayglI3gpIGZhYl9tc2soJSN4KSBpbnRlcmZhY2VfbXNrKCUjeCkgYmFzZSglI3gpIGNtZCglI3gpIG1zayglI3gpIHZhbHVlKCUjeClcbiIsCi0JCQkgR0VUX1BXUl9DRkdfT0ZGU0VUKFB3ckNmZ0NtZCksCi0JCQkgR0VUX1BXUl9DRkdfQ1VUX01BU0soUHdyQ2ZnQ21kKSwKLQkJCSBHRVRfUFdSX0NGR19GQUJfTUFTSyhQd3JDZmdDbWQpLAotCQkJIEdFVF9QV1JfQ0ZHX0lOVEZfTUFTSyhQd3JDZmdDbWQpLAotCQkJIEdFVF9QV1JfQ0ZHX0JBU0UoUHdyQ2ZnQ21kKSwKLQkJCSBHRVRfUFdSX0NGR19DTUQoUHdyQ2ZnQ21kKSwKLQkJCSBHRVRfUFdSX0NGR19NQVNLKFB3ckNmZ0NtZCksCi0JCQkgR0VUX1BXUl9DRkdfVkFMVUUoUHdyQ2ZnQ21kKSk7Ci0KLQkJLyogMiBPbmx5IEhhbmRsZSB0aGUgY29tbWFuZCB3aG9zZSBGQUIsIENVVCwgYW5kIEludGVyZmFjZSBhcmUKLQkJICAgbWF0Y2hlZCAqLwotCQlpZiAoKEdFVF9QV1JfQ0ZHX0ZBQl9NQVNLKFB3ckNmZ0NtZCkgJiBGYWJWZXJzaW9uKSAmJgotCQkgICAgKEdFVF9QV1JfQ0ZHX0NVVF9NQVNLKFB3ckNmZ0NtZCkgJiBDdXRWZXJzaW9uKSAmJgotCQkgICAgKEdFVF9QV1JfQ0ZHX0lOVEZfTUFTSyhQd3JDZmdDbWQpICYgSW50ZXJmYWNlVHlwZSkpIHsKLQkJCXN3aXRjaCAoR0VUX1BXUl9DRkdfQ01EKFB3ckNmZ0NtZCkpIHsKLQkJCWNhc2UgUFdSX0NNRF9SRUFEOgotCQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiSGFsUHdyU2VxQ21kUGFyc2luZzIzYTogUFdSX0NNRF9SRUFEXG4iKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBQV1JfQ01EX1dSSVRFOgotCQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiSGFsUHdyU2VxQ21kUGFyc2luZzIzYTogUFdSX0NNRF9XUklURVxuIik7Ci0JCQkJb2Zmc2V0ID0gR0VUX1BXUl9DRkdfT0ZGU0VUKFB3ckNmZ0NtZCk7Ci0KLQkJCQkvKiAgUmVhZCB0aGUgdmFsdWUgZnJvbSBzeXN0ZW0gcmVnaXN0ZXIgKi8KLQkJCQl2YWx1ZSA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgb2Zmc2V0KTsKLQotCQkJCXZhbHVlICY9IH4oR0VUX1BXUl9DRkdfTUFTSyhQd3JDZmdDbWQpKTsKLQkJCQl2YWx1ZSB8PSAoR0VUX1BXUl9DRkdfVkFMVUUoUHdyQ2ZnQ21kKSAmCi0JCQkJCSAgR0VUX1BXUl9DRkdfTUFTSyhQd3JDZmdDbWQpKTsKLQotCQkJCS8qICBXcml0ZSB0aGUgdmFsdWUgYmFjayB0byBzeXN0ZW0gcmVnaXN0ZXIgKi8KLQkJCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBvZmZzZXQsIHZhbHVlKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBQV1JfQ01EX1BPTExJTkc6Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkJICJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiBQV1JfQ01EX1BPTExJTkdcbiIpOwotCi0JCQkJYlBvbGxpbmdCaXQgPSBmYWxzZTsKLQkJCQlvZmZzZXQgPSBHRVRfUFdSX0NGR19PRkZTRVQoUHdyQ2ZnQ21kKTsKLQkJCQlkbyB7Ci0JCQkJCXZhbHVlID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLAotCQkJCQkJCQlvZmZzZXQpOwotCi0JCQkJCXZhbHVlICY9IEdFVF9QV1JfQ0ZHX01BU0soUHdyQ2ZnQ21kKTsKLQkJCQkJaWYgKHZhbHVlID09Ci0JCQkJCSAgICAoR0VUX1BXUl9DRkdfVkFMVUUoUHdyQ2ZnQ21kKSAmCi0JCQkJCSAgICAgR0VUX1BXUl9DRkdfTUFTSyhQd3JDZmdDbWQpKSkKLQkJCQkJCWJQb2xsaW5nQml0ID0gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJdWRlbGF5KDEwKTsKLQotCQkJCQlpZiAocG9sbGluZ0NvdW50KysgPiBtYXhQb2xsaW5nQ250KSB7Ci0JCQkJCQlEQkdfODcyM0EoIkZhaWwgdG8gcG9sbGluZyAiCi0JCQkJCQkJICAiT2Zmc2V0WyUjeF1cbiIsCi0JCQkJCQkJICBvZmZzZXQpOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSB3aGlsZSAoIWJQb2xsaW5nQml0KTsKLQotCQkJCWJyZWFrOwotCi0JCQljYXNlIFBXUl9DTURfREVMQVk6Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkJICJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiBQV1JfQ01EX0RFTEFZXG4iKTsKLQkJCQlpZiAoR0VUX1BXUl9DRkdfVkFMVUUoUHdyQ2ZnQ21kKSA9PQotCQkJCSAgICBQV1JTRVFfREVMQVlfVVMpCi0JCQkJCXVkZWxheShHRVRfUFdSX0NGR19PRkZTRVQoUHdyQ2ZnQ21kKSk7Ci0JCQkJZWxzZQotCQkJCQl1ZGVsYXkoR0VUX1BXUl9DRkdfT0ZGU0VUKFB3ckNmZ0NtZCkgKgotCQkJCQkgICAgICAgMTAwMCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgUFdSX0NNRF9FTkQ6Ci0JCQkJLyogIFdoZW4gdGhpcyBjb21tYW5kIGlzIHBhcnNlZCwgZW5kCi0JCQkJICAgIHRoZSBwcm9jZXNzICovCi0JCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkJICJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiBQV1JfQ01EX0VORFxuIik7Ci0JCQkJcmV0dXJuIHRydWU7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJCQkgIkhhbFB3clNlcUNtZFBhcnNpbmcyM2E6IFVua25vd24gQ01EISFcbiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJQXJ5SWR4Kys7CS8qIEFkZCBBcnJheSBJbmRleCAqLwotCX0gd2hpbGUgKDEpOwotCi0JcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9oYWxfY29tLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9oYWxfY29tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkN2IxMWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvaGFsX2NvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsODUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotI2luY2x1ZGUgPGhhbF9pbnRmLmg+Ci0jaW5jbHVkZSA8aGFsX2NvbS5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotI2RlZmluZSBfSEFMX0lOSVRfQ18KLQotI2RlZmluZQlFRVBST01fQ0hBTk5FTF9QTEFOX0JZX0hXX01BU0sJMHg4MAotCi0vKiByZXR1cm4gdGhlIGZpbmFsIGNoYW5uZWwgcGxhbiBkZWNpc2lvbiAqLwotLyogaHdfY2hhbm5lbF9wbGFuOiAgY2hhbm5lbCBwbGFuIGZyb20gSFcgKGVmdXNlL2VlcHJvbSkgKi8KLS8qIHN3X2NoYW5uZWxfcGxhbjogIGNoYW5uZWwgcGxhbiBmcm9tIFNXIChyZWdpc3RyeS9tb2R1bGUgcGFyYW0pICovCi0vKiBkZWZfY2hhbm5lbF9wbGFuOiBjaGFubmVsIHBsYW4gdXNlZCB3aGVuIHRoZSBmb3JtZXIgdHdvIGlzIGludmFsaWQgKi8KLXU4IGhhbF9jb21fZ2V0X2NoYW5uZWxfcGxhbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBod19jaGFubmVsX3BsYW4sCi0JCQkgICAgdTggc3dfY2hhbm5lbF9wbGFuLCB1OCBkZWZfY2hhbm5lbF9wbGFuLAotCQkJICAgIGJvb2wgQXV0b0xvYWRGYWlsKQotewotCXU4IHN3Q29uZmlnOwotCXU4IGNobmxQbGFuOwotCi0Jc3dDb25maWcgPSB0cnVlOwotCWlmICghQXV0b0xvYWRGYWlsKSB7Ci0JCWlmICghcnR3X2lzX2NoYW5uZWxfcGxhbl92YWxpZChzd19jaGFubmVsX3BsYW4pKQotCQkJc3dDb25maWcgPSBmYWxzZTsKLQkJaWYgKGh3X2NoYW5uZWxfcGxhbiAmIEVFUFJPTV9DSEFOTkVMX1BMQU5fQllfSFdfTUFTSykKLQkJCXN3Q29uZmlnID0gZmFsc2U7Ci0JfQotCi0JaWYgKHN3Q29uZmlnID09IHRydWUpCi0JCWNobmxQbGFuID0gc3dfY2hhbm5lbF9wbGFuOwotCWVsc2UKLQkJY2hubFBsYW4gPSBod19jaGFubmVsX3BsYW4gJiAofkVFUFJPTV9DSEFOTkVMX1BMQU5fQllfSFdfTUFTSyk7Ci0KLQlpZiAoIXJ0d19pc19jaGFubmVsX3BsYW5fdmFsaWQoY2hubFBsYW4pKQotCQljaG5sUGxhbiA9IGRlZl9jaGFubmVsX3BsYW47Ci0KLQlyZXR1cm4gY2hubFBsYW47Ci19Ci0KLXU4IE1SYXRlVG9Id1JhdGUyM2EodTggcmF0ZSkKLXsKLQl1OCByZXQgPSBERVNDX1JBVEUxTTsKLQotCXN3aXRjaCAocmF0ZSkgewotCQkvKiAgQ0NLIGFuZCBPRkRNIG5vbi1IVCByYXRlcyAqLwotCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzFNQjoKLQkJcmV0ID0gREVTQ19SQVRFMU07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzJNQjoKLQkJcmV0ID0gREVTQ19SQVRFMk07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzVNQjoKLQkJcmV0ID0gREVTQ19SQVRFNV81TTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjoKLQkJcmV0ID0gREVTQ19SQVRFMTFNOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COgotCQlyZXQgPSBERVNDX1JBVEU2TTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQjoKLQkJcmV0ID0gREVTQ19SQVRFOU07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xMk1COgotCQlyZXQgPSBERVNDX1JBVEUxMk07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xOE1COgotCQlyZXQgPSBERVNDX1JBVEUxOE07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8yNE1COgotCQlyZXQgPSBERVNDX1JBVEUyNE07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8zNk1COgotCQlyZXQgPSBERVNDX1JBVEUzNk07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV80OE1COgotCQlyZXQgPSBERVNDX1JBVEU0OE07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV81NE1COgotCQlyZXQgPSBERVNDX1JBVEU1NE07Ci0JCWJyZWFrOwotCi0JCS8qICBIVCByYXRlcyBzaW5jZSBoZXJlICovCi0JCS8qIGNhc2UgTUdOX01DUzA6CXJldCA9IERFU0NfUkFURU1DUzA7ICAgIGJyZWFrOyAqLwotCQkvKiBjYXNlIE1HTl9NQ1MxOglyZXQgPSBERVNDX1JBVEVNQ1MxOyAgICBicmVhazsgKi8KLQkJLyogY2FzZSBNR05fTUNTMjoJcmV0ID0gREVTQ19SQVRFTUNTMjsgICAgYnJlYWs7ICovCi0JCS8qIGNhc2UgTUdOX01DUzM6CXJldCA9IERFU0NfUkFURU1DUzM7ICAgIGJyZWFrOyAqLwotCQkvKiBjYXNlIE1HTl9NQ1M0OglyZXQgPSBERVNDX1JBVEVNQ1M0OyAgICBicmVhazsgKi8KLQkJLyogY2FzZSBNR05fTUNTNToJcmV0ID0gREVTQ19SQVRFTUNTNTsgICAgYnJlYWs7ICovCi0JCS8qIGNhc2UgTUdOX01DUzY6CXJldCA9IERFU0NfUkFURU1DUzY7ICAgIGJyZWFrOyAqLwotCQkvKiBjYXNlIE1HTl9NQ1M3OglyZXQgPSBERVNDX1JBVEVNQ1M3OyAgICBicmVhazsgKi8KLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIEhhbFNldEJyYXRlQ2ZnMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICptQnJhdGVzT1MpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggaSwgaXNfYnJhdGUsIGJyYXRlOwotCXUxNiBicmF0ZV9jZmcgPSAwOwotCXU4IHJhdGVfaW5kZXg7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYOyBpKyspIHsKLQkJaXNfYnJhdGUgPSBtQnJhdGVzT1NbaV0gJiBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLOwotCQlicmF0ZSA9IG1CcmF0ZXNPU1tpXSAmIDB4N2Y7Ci0KLQkJaWYgKGlzX2JyYXRlKSB7Ci0JCQlzd2l0Y2ggKGJyYXRlKSB7Ci0JCQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xTUI6Ci0JCQkJYnJhdGVfY2ZnIHw9IFJBVEVfMU07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8yTUI6Ci0JCQkJYnJhdGVfY2ZnIHw9IFJBVEVfMk07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV81TUI6Ci0JCQkJYnJhdGVfY2ZnIHw9IFJBVEVfNV81TTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzExTUI6Ci0JCQkJYnJhdGVfY2ZnIHw9IFJBVEVfMTFNOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjoKLQkJCQlicmF0ZV9jZmcgfD0gUkFURV82TTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV85TUI6Ci0JCQkJYnJhdGVfY2ZnIHw9IFJBVEVfOU07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjoKLQkJCQlicmF0ZV9jZmcgfD0gUkFURV8xMk07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjoKLQkJCQlicmF0ZV9jZmcgfD0gUkFURV8xOE07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjoKLQkJCQlicmF0ZV9jZmcgfD0gUkFURV8yNE07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQjoKLQkJCQlicmF0ZV9jZmcgfD0gUkFURV8zNk07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjoKLQkJCQlicmF0ZV9jZmcgfD0gUkFURV80OE07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjoKLQkJCQlicmF0ZV9jZmcgfD0gUkFURV81NE07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAgMjAwNy4wMS4xNiwgYnkgRW1pbHkgKi8KLQkvKiAgU2VsZWN0IFJSU1IgKGluIExlZ2FjeS1PRkRNIGFuZCBDQ0spICovCi0JLyogIEZvciA4MTkwLCB3ZSBzZWxlY3Qgb25seSAyNE0sIDEyTSwgNk0sIDExTSwgNS41TSwgMk0sCi0JICAgIGFuZCAxTSBmcm9tIHRoZSBCYXNpYyByYXRlLiAqLwotCS8qICBXZSBkbyBub3QgdXNlIG90aGVyIHJhdGVzLiAqLwotCS8qIDIwMTEuMDMuMzAgYWRkIGJ5IEx1a2UgTGVlICovCi0JLyogQ0NLIDJNIEFDSyBzaG91bGQgYmUgZGlzYWJsZWQgZm9yIHNvbWUgQkNNIGFuZCBBdGhlcm9zIEFQIElPVCAqLwotCS8qIGJlY2F1c2UgQ0NLIDJNIGhhcyBwb29yIFRYRVZNICovCi0JLyogQ0NLIDUuNU0gJiAxMU0gQUNLIHNob3VsZCBiZSBlbmFibGVkIGZvciBiZXR0ZXIKLQkgICBwZXJmb3JtYW5jZSAqLwotCi0JYnJhdGVfY2ZnID0gKGJyYXRlX2NmZyB8IDB4ZCkgJiAweDE1ZDsKLQlwSGFsRGF0YS0+QmFzaWNSYXRlU2V0ID0gYnJhdGVfY2ZnOwotCWJyYXRlX2NmZyB8PSAweDAxOwkvKiAgZGVmYXVsdCBlbmFibGUgMU0gQUNLIHJhdGUgKi8KLQlEQkdfODcyM0EoIkhXX1ZBUl9CQVNJQ19SQVRFOiBCcmF0ZUNmZyglI3gpXG4iLCBicmF0ZV9jZmcpOwotCi0JLyogIFNldCBSUlNSIHJhdGUgdGFibGUuICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1JSU1IsIGJyYXRlX2NmZyAmIDB4ZmYpOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19SUlNSICsgMSwgKGJyYXRlX2NmZyA+PiA4KSAmIDB4ZmYpOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19SUlNSICsgMiwKLQkJCSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19SUlNSICsgMikgJiAweGYwKTsKLQotCXJhdGVfaW5kZXggPSAwOwotCS8qICBTZXQgUlRTIGluaXRpYWwgcmF0ZSAqLwotCXdoaWxlIChicmF0ZV9jZmcgPiAweDEpIHsKLQkJYnJhdGVfY2ZnID4+PSAxOwotCQlyYXRlX2luZGV4Kys7Ci0JfQotCQkvKiAgWml2IC0gQ2hlY2sgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfSU5JUlRTX1JBVEVfU0VMLCByYXRlX2luZGV4KTsKLX0KLQotc3RhdGljIHZvaWQgX09uZU91dFBpcGVNYXBwaW5nKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIpCi17Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9ianByaXYgPSBhZGFwdGVyX3RvX2R2b2JqKHBBZGFwdGVyKTsKLQotCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbMF0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07CS8qIFZPICovCi0JcGR2b2JqcHJpdi0+UXVldWUyUGlwZVsxXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsJLyogVkkgKi8KLQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzJdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOwkvKiBCRSAqLwotCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbM10gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07CS8qIEJLICovCi0KLQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzRdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOwkvKiBCQ04gKi8KLQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzVdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOwkvKiBNR1QgKi8KLQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzZdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOwkvKiBISUdIICovCi0JcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs3XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsJLyogVFhDTUQgKi8KLX0KLQotc3RhdGljIHZvaWQgX1R3b091dFBpcGVNYXBwaW5nKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIGJvb2wgYldJRklDZmcpCi17Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9ianByaXYgPSBhZGFwdGVyX3RvX2R2b2JqKHBBZGFwdGVyKTsKLQotCWlmIChiV0lGSUNmZykgewkJLyogV01NICovCi0JCS8qICAgIEJLLCAgIEJFLCAgIFZJLCAgIFZPLCAgIEJDTiwgIENNRCwgIE1HVCwgSElHSCwgSENDQSAqLwotCQkvKiAgICAgMCwgICAgMSwgICAgMCwgICAgMSwgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfTsgKi8KLQkJLyogMDpILCAxOkwgKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVswXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVsxXTsgLyogVk8gKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVsxXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogVkkgKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVsyXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVsxXTsgLyogQkUgKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVszXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogQksgKi8KLQotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzRdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBCQ04gKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs1XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogTUdUICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbNl0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIEhJR0ggKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs3XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogVFhDTUQqLwotCX0gZWxzZSB7CQkvKiB0eXBpY2FsIHNldHRpbmcgKi8KLQkJLyogICAgQkssICAgQkUsICAgVkksICAgVk8sICAgQkNOLCAgQ01ELCAgTUdULCBISUdILCBIQ0NBICovCi0JCS8qICAgICAxLCAgICAxLCAgICAwLCAgICAwLCAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9OyAqLwotCQkvKiAwOkgsIDE6TCAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzBdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBWTyAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzFdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBWSSAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzJdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzFdOyAvKiBCRSAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzNdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzFdOyAvKiBCSyAqLwotCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbNF0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIEJDTiAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzVdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBNR1QgKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs2XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogSElHSCAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzddID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBUWENNRCovCi0JfQotfQotCi1zdGF0aWMgdm9pZCBfVGhyZWVPdXRQaXBlTWFwcGluZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCBib29sIGJXSUZJQ2ZnKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmpwcml2ID0gYWRhcHRlcl90b19kdm9iaihwQWRhcHRlcik7Ci0KLQlpZiAoYldJRklDZmcpIHsJCS8qIGZvciBXTU0gKi8KLQkJLyogICAgQkssICAgQkUsICAgVkksICAgVk8sICAgQkNOLCAgQ01ELCAgTUdULCBISUdILCBIQ0NBICovCi0JCS8qICAgICAxLCAgICAyLCAgICAxLCAgICAwLCAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9OyAqLwotCQkvKiAwOkgsIDE6TiwgMjpMICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbMF0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIFZPICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbMV0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMV07IC8qIFZJICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbMl0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMl07IC8qIEJFICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbM10gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMV07IC8qIEJLICovCi0KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs0XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogQkNOICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbNV0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIE1HVCAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzZdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBISUdIICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbN10gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIFRYQ01EKi8KLQl9IGVsc2UgewkJLyogdHlwaWNhbCBzZXR0aW5nICovCi0JCS8qICAgIEJLLCAgIEJFLCAgIFZJLCAgIFZPLCAgIEJDTiwgIENNRCwgIE1HVCwgSElHSCwgSENDQSAqLwotCQkvKiAgICAgMiwgICAgMiwgICAgMSwgICAgMCwgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfTsgKi8KLQkJLyogMDpILCAxOk4sIDI6TCAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzBdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBWTyAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzFdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzFdOyAvKiBWSSAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzJdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzJdOyAvKiBCRSAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzNdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzJdOyAvKiBCSyAqLwotCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbNF0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIEJDTiAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzVdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBNR1QgKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs2XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogSElHSCAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzddID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBUWENNRCovCi0JfQotfQotCi1ib29sIEhhbF9NYXBwaW5nT3V0UGlwZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBOdW1PdXRQaXBlKQotewotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJnBBZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0JYm9vbCBiV0lGSUNmZyA9IChwcmVnaXN0cnlwcml2LT53aWZpX3NwZWMpID8gdHJ1ZSA6IGZhbHNlOwotCWJvb2wgcmVzdWx0ID0gdHJ1ZTsKLQotCXN3aXRjaCAoTnVtT3V0UGlwZSkgewotCWNhc2UgMjoKLQkJX1R3b091dFBpcGVNYXBwaW5nKHBBZGFwdGVyLCBiV0lGSUNmZyk7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJX1RocmVlT3V0UGlwZU1hcHBpbmcocEFkYXB0ZXIsIGJXSUZJQ2ZnKTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlfT25lT3V0UGlwZU1hcHBpbmcocEFkYXB0ZXIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXN1bHQgPSBmYWxzZTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLSogQzJIIGV2ZW50IGZvcm1hdDoKLSogRmllbGQJIFRSSUdHRVIJCUNPTlRFTlQJICAgQ01EX1NFUQlDTURfTEVOCQkgQ01EX0lECi0qIEJJVFMJIFsxMjc6MTIwXQlbMTE5OjE2XSAgICAgIFsxNTo4XQkJICBbNzo0XQkJICAgWzM6MF0KLSovCi0KLXZvaWQgYzJoX2V2dF9jbGVhcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JcnRsODcyM2F1X3dyaXRlOChhZGFwdGVyLCBSRUdfQzJIRVZUX0NMRUFSLCBDMkhfRVZUX0hPU1RfQ0xPU0UpOwotfQotCi1pbnQgYzJoX2V2dF9yZWFkMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTggKmJ1ZikKLXsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0Jc3RydWN0IGMyaF9ldnRfaGRyICpjMmhfZXZ0OwotCWludCBpOwotCXU4IHRyaWdnZXI7Ci0KLQlpZiAoYnVmID09IE5VTEwpCi0JCWdvdG8gZXhpdDsKLQotCXRyaWdnZXIgPSBydGw4NzIzYXVfcmVhZDgoYWRhcHRlciwgUkVHX0MySEVWVF9DTEVBUik7Ci0KLQlpZiAodHJpZ2dlciA9PSBDMkhfRVZUX0hPU1RfQ0xPU0UpCi0JCWdvdG8gZXhpdDsJLyogTm90IHJlYWR5ICovCi0JaWYgKHRyaWdnZXIgIT0gQzJIX0VWVF9GV19DTE9TRSkKLQkJZ290byBjbGVhcl9ldnQ7CS8qIE5vdCBhIHZhbGlkIHZhbHVlICovCi0KLQljMmhfZXZ0ID0gKHN0cnVjdCBjMmhfZXZ0X2hkciAqKWJ1ZjsKLQotCW1lbXNldChjMmhfZXZ0LCAwLCAxNik7Ci0KLQkqYnVmID0gcnRsODcyM2F1X3JlYWQ4KGFkYXB0ZXIsIFJFR19DMkhFVlRfTVNHX05PUk1BTCk7Ci0JKihidWYgKyAxKSA9IHJ0bDg3MjNhdV9yZWFkOChhZGFwdGVyLCBSRUdfQzJIRVZUX01TR19OT1JNQUwgKyAxKTsKLQotCVJUX1BSSU5UX0RBVEEoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgImMyaF9ldnRfcmVhZDIzYSgpOiAiLAotCQkgICAgICAmYzJoX2V2dCwgc2l6ZW9mKGMyaF9ldnQpKTsKLQotCWlmICgwKSB7Ci0JCURCR184NzIzQSgiJXMgaWQ6JXUsIGxlbjoldSwgc2VxOiV1LCB0cmlnZ2VyOjB4JTAyeFxuIiwKLQkJCSAgX19mdW5jX18sIGMyaF9ldnQtPmlkLCBjMmhfZXZ0LT5wbGVuLCBjMmhfZXZ0LT5zZXEsCi0JCQkgIHRyaWdnZXIpOwotCX0KLQotCS8qIFJlYWQgdGhlIGNvbnRlbnQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgYzJoX2V2dC0+cGxlbjsgaSsrKQotCQljMmhfZXZ0LT5wYXlsb2FkW2ldID0gcnRsODcyM2F1X3JlYWQ4KGFkYXB0ZXIsCi0JCQkJCQlSRUdfQzJIRVZUX01TR19OT1JNQUwgKwotCQkJCQkJc2l6ZW9mKCpjMmhfZXZ0KSArIGkpOwotCi0JUlRfUFJJTlRfREFUQShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgICAgICAiYzJoX2V2dF9yZWFkMjNhKCk6IENvbW1hbmQgQ29udGVudDpcbiIsIGMyaF9ldnQtPnBheWxvYWQsCi0JCSAgICAgIGMyaF9ldnQtPnBsZW4pOwotCi0JcmV0ID0gX1NVQ0NFU1M7Ci0KLWNsZWFyX2V2dDoKLQkvKgotCSAqIENsZWFyIGV2ZW50IHRvIG5vdGlmeSBGVyB3ZSBoYXZlIHJlYWQgdGhlIGNvbW1hbmQuCi0JICogSWYgdGhpcyBmaWVsZCBpc24ndCBjbGVhciwgdGhlIEZXIHdvbid0IHVwZGF0ZSB0aGUKLQkgKiBuZXh0IGNvbW1hbmQgbWVzc2FnZS4KLQkgKi8KLQljMmhfZXZ0X2NsZWFyMjNhKGFkYXB0ZXIpOwotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkCi1ydGw4NzIzYV9zZXRfYW1wZHVfbWluX3NwYWNlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IE1pblNwYWNpbmdUb1NldCkKLXsKLQl1OCBTZWNNaW5TcGFjZTsKLQotCWlmIChNaW5TcGFjaW5nVG9TZXQgPD0gNykgewotCQlzd2l0Y2ggKHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSkgewotCQljYXNlIDA6Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJCVNlY01pblNwYWNlID0gMDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCQlTZWNNaW5TcGFjZSA9IDY7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVNlY01pblNwYWNlID0gNzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKE1pblNwYWNpbmdUb1NldCA8IFNlY01pblNwYWNlKQotCQkJTWluU3BhY2luZ1RvU2V0ID0gU2VjTWluU3BhY2U7Ci0KLQkJTWluU3BhY2luZ1RvU2V0IHw9Ci0JCQlydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19BTVBEVV9NSU5fU1BBQ0UpICYgMHhmODsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0FNUERVX01JTl9TUEFDRSwKLQkJCQkgTWluU3BhY2luZ1RvU2V0KTsKLQl9Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X2FtcGR1X2ZhY3RvcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBGYWN0b3JUb1NldCkKLXsKLQl1OCBSZWdUb1NldF9Ob3JtYWxbNF0gPSB7IDB4NDEsIDB4YTgsIDB4NzIsIDB4YjkgfTsKLQl1OCBNYXhBZ2dOdW07Ci0JdTggKnBSZWdUb1NldDsKLQl1OCBpbmRleCA9IDA7Ci0KLQlwUmVnVG9TZXQgPSBSZWdUb1NldF9Ob3JtYWw7CS8qICAweGI5NzJhODQxOyAqLwotCi0JaWYgKHJ0bDg3MjNhX0JUX2VuYWJsZWQocGFkYXB0ZXIpICYmCi0JICAgIHJ0bDg3MjNhX0JUX3VzaW5nX2FudGVubmFfMShwYWRhcHRlcikpCi0JCU1heEFnZ051bSA9IDB4ODsKLQllbHNlCi0JCU1heEFnZ051bSA9IDB4RjsKLQotCWlmIChGYWN0b3JUb1NldCA8PSAzKSB7Ci0JCUZhY3RvclRvU2V0ID0gMSA8PCAoRmFjdG9yVG9TZXQgKyAyKTsKLQkJaWYgKEZhY3RvclRvU2V0ID4gTWF4QWdnTnVtKQotCQkJRmFjdG9yVG9TZXQgPSBNYXhBZ2dOdW07Ci0KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNDsgaW5kZXgrKykgewotCQkJaWYgKChwUmVnVG9TZXRbaW5kZXhdICYgMHhmMCkgPiAoRmFjdG9yVG9TZXQgPDwgNCkpCi0JCQkJcFJlZ1RvU2V0W2luZGV4XSA9IChwUmVnVG9TZXRbaW5kZXhdICYgMHgwZikgfAotCQkJCQkoRmFjdG9yVG9TZXQgPDwgNCk7Ci0KLQkJCWlmICgocFJlZ1RvU2V0W2luZGV4XSAmIDB4MGYpID4gRmFjdG9yVG9TZXQpCi0JCQkJcFJlZ1RvU2V0W2luZGV4XSA9IChwUmVnVG9TZXRbaW5kZXhdICYgMHhmMCkgfAotCQkJCQlGYWN0b3JUb1NldDsKLQotCQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0FHR0xFTl9MTVQgKyBpbmRleCwKLQkJCQkJIHBSZWdUb1NldFtpbmRleF0pOwotCQl9Ci0JfQotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9hY21fY3RybChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBjdHJsKQotewotCXU4IGh3Y3RybCA9IDA7Ci0KLQlpZiAoY3RybCAhPSAwKSB7Ci0JCWh3Y3RybCB8PSBBY21Id19Id0VuOwotCi0JCWlmIChjdHJsICYgQklUKDEpKQkvKiAgQkUgKi8KLQkJCWh3Y3RybCB8PSBBY21Id19CZXFFbjsKLQotCQlpZiAoY3RybCAmIEJJVCgyKSkJLyogIFZJICovCi0JCQlod2N0cmwgfD0gQWNtSHdfVmlxRW47Ci0KLQkJaWYgKGN0cmwgJiBCSVQoMykpCS8qICBWTyAqLwotCQkJaHdjdHJsIHw9IEFjbUh3X1ZvcUVuOwotCX0KLQotCURCR184NzIzQSgiW0hXX1ZBUl9BQ01fQ1RSTF0gV3JpdGUgMHglMDJYXG4iLCBod2N0cmwpOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19BQ01IV0NUUkwsIGh3Y3RybCk7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X21lZGlhX3N0YXR1cyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzdGF0dXMpCi17Ci0JdTggdmFsODsKLQotCXZhbDggPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIE1TUikgJiAweDBjOwotCXZhbDggfD0gc3RhdHVzOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIE1TUiwgdmFsOCk7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X21lZGlhX3N0YXR1czEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggc3RhdHVzKQotewotCXU4IHZhbDg7Ci0KLQl2YWw4ID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBNU1IpICYgMHgwMzsKLQl2YWw4IHw9IHN0YXR1cyA8PCAyOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIE1TUiwgdmFsOCk7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X2Jjbl9mdW5jKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHZhbCkKLXsKLQlpZiAodmFsKQotCQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCBFTl9CQ05fRlVOQ1RJT04gfCBFTl9UWEJDTl9SUFQsIDApOwotCWVsc2UKLQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgMCwgRU5fQkNOX0ZVTkNUSU9OIHwgRU5fVFhCQ05fUlBUKTsKLX0KLQotdm9pZCBydGw4NzIzYV9jaGVja19ic3NpZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB2YWwpCi17Ci0JdTMyIHZhbDMyOwotCi0JdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfUkNSKTsKLQlpZiAodmFsKQotCQl2YWwzMiB8PSBSQ1JfQ0JTU0lEX0RBVEEgfCBSQ1JfQ0JTU0lEX0JDTjsKLQllbHNlCi0JCXZhbDMyICY9IH4oUkNSX0NCU1NJRF9EQVRBIHwgUkNSX0NCU1NJRF9CQ04pOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfUkNSLCB2YWwzMik7Ci19Ci0KLXZvaWQgcnRsODcyM2FfbWxtZV9zaXRlc3VydmV5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGZsYWcpCi17Ci0JaWYgKGZsYWcpIHsJLyogdW5kZXIgc2l0ZXN1cnZleSAqLwotCQl1MzIgdjMyOwotCi0JCS8qICBjb25maWcgUkNSIHRvIHJlY2VpdmUgZGlmZmVyZW50IEJTU0lEICYgbm90Ci0JCSAgICB0byByZWNlaXZlIGRhdGEgZnJhbWUgKi8KLQkJdjMyID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX1JDUik7Ci0JCXYzMiAmPSB+KFJDUl9DQlNTSURfQkNOKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19SQ1IsIHYzMik7Ci0JCS8qICByZWplY3QgYWxsIGRhdGEgZnJhbWUgKi8KLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19SWEZMVE1BUDIsIDApOwotCi0JCS8qICBkaXNhYmxlIHVwZGF0ZSBUU0YgKi8KLQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgRElTX1RTRl9VRFQsIDApOwotCX0gZWxzZSB7CS8qIHNpdGVzdXJ2ZXkgZG9uZSAqLwotCi0JCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm87Ci0JCXUzMiB2MzI7Ci0KLQkJcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCQlpZiAoKGlzX2NsaWVudF9hc3NvY2lhdGVkX3RvX2FwMjNhKHBhZGFwdGVyKSA9PSB0cnVlKSB8fAotCQkgICAgKChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgPT0gTVNSX0FESE9DKSB8fAotCQkgICAgKChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgPT0gTVNSX0FQKSkgewotCQkJLyogIGVuYWJsZSB0byByeCBkYXRhIGZyYW1lICovCi0JCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1JYRkxUTUFQMiwgMHhGRkZGKTsKLQotCQkJLyogIGVuYWJsZSB1cGRhdGUgVFNGICovCi0JCQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCAwLCBESVNfVFNGX1VEVCk7Ci0JCX0KLQotCQl2MzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfUkNSKTsKLQkJdjMyIHw9IFJDUl9DQlNTSURfQkNOOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX1JDUiwgdjMyKTsKLQl9Ci0KLQlydGw4NzIzYV9CVF93aWZpc2Nhbl9ub3RpZnkocGFkYXB0ZXIsIGZsYWcgPyB0cnVlIDogZmFsc2UpOwotfQotCi12b2lkIHJ0bDg3MjNhX29uX3Jjcl9hbShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfUkNSLAotCQkgICAgcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX1JDUikgfCBSQ1JfQU0pOwotCURCR184NzIzQSgiJXMsICVkLCBSQ1IgPSAleFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkgIHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19SQ1IpKTsKLX0KLQotdm9pZCBydGw4NzIzYV9vZmZfcmNyX2FtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19SQ1IsCi0JCSAgICBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfUkNSKSAmICh+UkNSX0FNKSk7Ci0JREJHXzg3MjNBKCIlcywgJWQsIFJDUiA9ICV4XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCSAgcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX1JDUikpOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9zbG90X3RpbWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggc2xvdHRpbWUpCi17Ci0JdTggdTFiQUlGUywgYVNpZnNUaW1lOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfU0xPVCwgc2xvdHRpbWUpOwotCi0JaWYgKHBtbG1laW5mby0+V01NX2VuYWJsZSA9PSAwKSB7Ci0JCWlmIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgPT0gV0lSRUxFU1NfMTFCKQotCQkJYVNpZnNUaW1lID0gMTA7Ci0JCWVsc2UKLQkJCWFTaWZzVGltZSA9IDE2OwotCi0JCXUxYkFJRlMgPSBhU2lmc1RpbWUgKyAoMiAqIHBtbG1laW5mby0+c2xvdFRpbWUpOwotCi0JCS8qICA8Um9nZXJfRVhQPiBUZW1wb3JhcnkgcmVtb3ZlZCwgMjAwOC4wNi4yMC4gKi8KLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0VEQ0FfVk9fUEFSQU0sIHUxYkFJRlMpOwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfRURDQV9WSV9QQVJBTSwgdTFiQUlGUyk7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19FRENBX0JFX1BBUkFNLCB1MWJBSUZTKTsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0VEQ0FfQktfUEFSQU0sIHUxYkFJRlMpOwotCX0KLX0KLQotdm9pZCBydGw4NzIzYV9hY2tfcHJlYW1ibGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYlNob3J0UHJlYW1ibGUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggcmVnVG1wOwotCi0JLyogIEpvc2VwaCBtYXJrZWQgb3V0IGZvciBOZXRnZWFyIDM1MDAgVEtJUAotCSAgICBjaGFubmVsIDcgaXNzdWUuKFRlbXBvcmFyaWx5KSAqLwotCXJlZ1RtcCA9IChwSGFsRGF0YS0+bkN1cjQwTWh6UHJpbWVTQykgPDwgNTsKLQkvKiByZWdUbXAgPSAwOyAqLwotCWlmIChiU2hvcnRQcmVhbWJsZSkKLQkJcmVnVG1wIHw9IDB4ODA7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1JSU1IgKyAyLCByZWdUbXApOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9zZWNfY2ZnKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHNlYykKLXsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfU0VDQ0ZHLCBzZWMpOwotfQotCi12b2lkIHJ0bDg3MjNhX2NhbV9lbXB0eV9lbnRyeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB1Y0luZGV4KQotewotCXU4IGk7Ci0JdTMyIHVsQ29tbWFuZCA9IDA7Ci0JdTMyIHVsQ29udGVudCA9IDA7Ci0JdTMyIHVsRW5jQWxnbyA9IENBTV9BRVM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQ0FNX0NPTlRFTlRfQ09VTlQ7IGkrKykgewotCQkvKiAgZmlsbGVkIGlkIGluIENBTSBjb25maWcgMiBieXRlICovCi0JCWlmIChpID09IDApIHsKLQkJCXVsQ29udGVudCB8PSAodWNJbmRleCAmIDB4MDMpIHwKLQkJCQkoKHUxNikgKHVsRW5jQWxnbykgPDwgMik7Ci0JCQkvKiB1bENvbnRlbnQgfD0gQ0FNX1ZBTElEOyAqLwotCQl9IGVsc2UgewotCQkJdWxDb250ZW50ID0gMDsKLQkJfQotCQkvKiAgcG9sbGluZyBiaXQsIGFuZCBObyBXcml0ZSBlbmFibGUsIGFuZCBhZGRyZXNzICovCi0JCXVsQ29tbWFuZCA9IENBTV9DT05URU5UX0NPVU5UICogdWNJbmRleCArIGk7Ci0JCXVsQ29tbWFuZCA9IHVsQ29tbWFuZCB8IENBTV9QT0xMSU5JRyB8IENBTV9XUklURTsKLQkJLyogIHdyaXRlIGNvbnRlbnQgMCBpcyBlcXVhbGwgdG8gbWFyayBpbnZhbGlkICovCi0JCS8qIGRlbGF5X21zKDQwKTsgKi8KLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFdDQU1JLCB1bENvbnRlbnQpOwotCQkvKiBkZWxheV9tcyg0MCk7ICovCi0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfQ0FNQ01ELCB1bENvbW1hbmQpOwotCX0KLX0KLQotdm9pZCBydGw4NzIzYV9jYW1faW52YWxpZGF0ZV9hbGwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX0NBTUNNRCwgQ0FNX1BPTExJTklHIHwgQklUKDMwKSk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfY2FtX3dyaXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQl1OCBlbnRyeSwgdTE2IGN0cmwsIGNvbnN0IHU4ICptYWMsIGNvbnN0IHU4ICprZXkpCi17Ci0JdTMyIGNtZDsKLQl1bnNpZ25lZCBpbnQgaSwgdmFsLCBhZGRyOwotCWludCBqOwotCi0JYWRkciA9IGVudHJ5IDw8IDM7Ci0KLQlmb3IgKGogPSA1OyBqID49IDA7IGotLSkgewotCQlzd2l0Y2ggKGopIHsKLQkJY2FzZSAwOgotCQkJdmFsID0gY3RybCB8IChtYWNbMF0gPDwgMTYpIHwgKG1hY1sxXSA8PCAyNCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJdmFsID0gbWFjWzJdIHwgKG1hY1szXSA8PCA4KSB8Ci0JCQkJKG1hY1s0XSA8PCAxNikgfCAobWFjWzVdIDw8IDI0KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaSA9IChqIC0gMikgPDwgMjsKLQkJCXZhbCA9IGtleVtpXSB8IChrZXlbaSsxXSA8PCA4KSB8Ci0JCQkJKGtleVtpKzJdIDw8IDE2KSB8IChrZXlbaSszXSA8PCAyNCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBXQ0FNSSwgdmFsKTsKLQkJY21kID0gQ0FNX1BPTExJTklHIHwgQ0FNX1dSSVRFIHwgKGFkZHIgKyBqKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19DQU1DTUQsIGNtZCk7Ci0KLQkJLyogREJHXzg3MjNBKCIlcyA9PiBjYW0gd3JpdGU6ICV4LCAleFxuIiwgX19mdW5jX18sIGNtZCwgdmFsKTsqLwotCX0KLX0KLQotdm9pZCBydGw4NzIzYV9maWZvX2NsZWFudXAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLSNkZWZpbmUgUldfUkVMRUFTRV9FTgkJQklUKDE4KQotI2RlZmluZSBSWERNQV9JRExFCQlCSVQoMTcpCi0KLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQl1OCB0cnljbnQgPSAxMDA7Ci0KLQkvKiAgcGF1c2UgdHggKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfVFhQQVVTRSwgMHhmZik7Ci0KLQkvKiAga2VlcCBzbiAqLwotCXBhZGFwdGVyLT54bWl0cHJpdi5ucW9zX3NzbiA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX05RT1NfU0VRKTsKLQotCWlmIChwd3Jwcml2LT5ia2VlcGZ3YWxpdmUgIT0gdHJ1ZSkgewotCQl1MzIgdjMyOwotCi0JCS8qICBSWCBETUEgc3RvcCAqLwotCQl2MzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfUlhQS1RfTlVNKTsKLQkJdjMyIHw9IFJXX1JFTEVBU0VfRU47Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfUlhQS1RfTlVNLCB2MzIpOwotCQlkbyB7Ci0JCQl2MzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLAotCQkJCQkgICAgICAgUkVHX1JYUEtUX05VTSkgJiBSWERNQV9JRExFOwotCQkJaWYgKCF2MzIpCi0JCQkJYnJlYWs7Ci0JCX0gd2hpbGUgKHRyeWNudC0tKTsKLQkJaWYgKHRyeWNudCA9PSAwKQotCQkJREJHXzg3MjNBKCJTdG9wIFJYIERNQSBmYWlsZWQuLi4uLi5cbiIpOwotCi0JCS8qICBSUVBOIExvYWQgMCAqLwotCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1JRUE5fTlBRLCAwKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19SUVBOLCAweDgwMDAwMDAwKTsKLQkJbWRlbGF5KDEwKTsKLQl9Ci19Ci0KLXZvaWQgcnRsODcyM2FfYmNuX3ZhbGlkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JLyogQkNOX1ZBTElELCBCSVQxNiBvZiBSRUdfVERFQ1RSTCA9IEJJVDAgb2YgUkVHX1RERUNUUkwrMiwKLQkgICB3cml0ZSAxIHRvIGNsZWFyLCBDbGVhciBieSBzdyAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19UREVDVFJMICsgMiwKLQkJCSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19UREVDVFJMICsgMikgfCBCSVQoMCkpOwotfQotCi1ib29sIHJ0bDg3MjNhX2dldF9iY25fdmFsaWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlib29sIHJldHZhbDsKLQotCXJldHZhbCA9IChydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19UREVDVFJMICsgMikgJiBCSVQoMCkpID8gdHJ1ZSA6IGZhbHNlOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotdm9pZCBydGw4NzIzYV9zZXRfYmVhY29uX2ludGVydmFsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBpbnRlcnZhbCkKLXsKLQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX0JDTl9JTlRFUlZBTCwgaW50ZXJ2YWwpOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9yZXNwX3NpZnMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICB1OCByMnQxLCB1OCByMnQyLCB1OCB0MnQxLCB1OCB0MnQyKQotewotCS8qIFNJRlNfVGltZXIgPSAweDBhMGEwODA4OyAqLwotCS8qIFJFU1BfU0lGUyBmb3IgQ0NLICovCi0JLyogIFNJRlNfVDJUX0NDSyAoMHgwOCkgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfUjJUX1NJRlMsIHIydDEpOwotCS8qIFNJRlNfUjJUX0NDSygweDA4KSAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19SMlRfU0lGUyArIDEsIHIydDIpOwotCS8qIFJFU1BfU0lGUyBmb3IgT0ZETSAqLwotCS8qIFNJRlNfVDJUX09GRE0gKDB4MGEpICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1QyVF9TSUZTLCB0MnQxKTsKLQkvKiBTSUZTX1IyVF9PRkRNKDB4MGEpICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1QyVF9TSUZTICsgMSwgdDJ0Mik7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X2FjX3BhcmFtX3ZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiB2bykKLXsKLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX0VEQ0FfVk9fUEFSQU0sIHZvKTsKLX0KLQotdm9pZCBydGw4NzIzYV9zZXRfYWNfcGFyYW1fdmkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIHZpKQotewotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfRURDQV9WSV9QQVJBTSwgdmkpOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9hY19wYXJhbV9iZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgYmUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlwSGFsRGF0YS0+QWNQYXJhbV9CRSA9IGJlOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfRURDQV9CRV9QQVJBTSwgYmUpOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9hY19wYXJhbV9iayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgYmspCi17Ci0JcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19FRENBX0JLX1BBUkFNLCBiayk7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X3J4ZG1hX2FnZ19wZ190aChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB2YWwpCi17Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1JYRE1BX0FHR19QR19USCwgdmFsKTsKLX0KLQotdm9pZCBydGw4NzIzYV9zZXRfaW5pdGlhbF9nYWluKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiByeF9nYWluKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBkaWdfdCAqcERpZ1RhYmxlID0gJnBIYWxEYXRhLT5vZG1wcml2LkRNX0RpZ1RhYmxlOwotCi0JaWYgKHJ4X2dhaW4gPT0gMHhmZikJLyogcmVzdG9yZSByeCBnYWluICovCi0JCU9ETV9Xcml0ZV9ESUcyM2EoJnBIYWxEYXRhLT5vZG1wcml2LCBwRGlnVGFibGUtPkJhY2t1cElHVmFsdWUpOwotCWVsc2UgewotCQlwRGlnVGFibGUtPkJhY2t1cElHVmFsdWUgPSBwRGlnVGFibGUtPkN1cklHVmFsdWU7Ci0JCU9ETV9Xcml0ZV9ESUcyM2EoJnBIYWxEYXRhLT5vZG1wcml2LCByeF9nYWluKTsKLQl9Ci19Ci0KLXZvaWQgcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9yZXN0b3JlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlwSGFsRGF0YS0+b2RtcHJpdi5TdXBwb3J0QWJpbGl0eSA9IHBIYWxEYXRhLT5vZG1wcml2LkJLX1N1cHBvcnRBYmlsaXR5OwotfQotCi12b2lkIHJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfYmFja3VwKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlwSGFsRGF0YS0+b2RtcHJpdi5CS19TdXBwb3J0QWJpbGl0eSA9IHBIYWxEYXRhLT5vZG1wcml2LlN1cHBvcnRBYmlsaXR5OwotfQotCi12b2lkIHJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfc2V0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiB2YWwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAodmFsID09IERZTkFNSUNfQUxMX0ZVTkNfRU5BQkxFKQotCQlwSGFsRGF0YS0+b2RtcHJpdi5TdXBwb3J0QWJpbGl0eSA9IHBIYWxEYXRhLT5kbXByaXYuSW5pdE9ETUZsYWc7Ci0JZWxzZQotCQlwSGFsRGF0YS0+b2RtcHJpdi5TdXBwb3J0QWJpbGl0eSB8PSB2YWw7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9jbHIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIHZhbCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCXBIYWxEYXRhLT5vZG1wcml2LlN1cHBvcnRBYmlsaXR5ICY9IHZhbDsKLX0KLQotdm9pZCBydGw4NzIzYV9zZXRfcnB3bShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB2YWwpCi17Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1VTQl9IUlBXTSwgdmFsKTsKLX0KLQotdTggcnRsODcyM2FfZ2V0X3JmX3R5cGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCXJldHVybiBwSGFsRGF0YS0+cmZfdHlwZTsKLX0KLQotYm9vbCBydGw4NzIzYV9nZXRfZndscHNfcmZfb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlib29sIHJldHZhbDsKLQl1MzIgdmFsUkNSOwotCi0JLyogIFdoZW4gd2UgaGFsdCBOSUMsIHdlIHNob3VsZCBjaGVjayBpZiBGVyBMUFMgaXMgbGVhdmUuICovCi0KLQlpZiAoKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IHRydWUpIHx8Ci0JICAgIChwYWRhcHRlci0+cHdyY3RybHByaXYucmZfcHdyc3RhdGUgPT0gcmZfb2ZmKSkgewotCQkvKiAgSWYgaXQgaXMgaW4gSFcvU1cgUmFkaW8gT0ZGIG9yIElQUyBzdGF0ZSwgd2UgZG8KLQkJICAgIG5vdCBjaGVjayBGdyBMUFMgTGVhdmUsIGJlY2F1c2UgRncgaXMgdW5sb2FkLiAqLwotCQlyZXR2YWwgPSB0cnVlOwotCX0gZWxzZSB7Ci0JCXZhbFJDUiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19SQ1IpOwotCQlpZiAodmFsUkNSICYgMHgwMDA3MDAwMCkKLQkJCXJldHZhbCA9IGZhbHNlOwotCQllbHNlCi0JCQlyZXR2YWwgPSB0cnVlOwotCX0KLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLWJvb2wgcnRsODcyM2FfY2hrX2hpX3F1ZXVlX2VtcHR5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTMyIGhncTsKLQotCWhncSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19IR1FfSU5GT1JNQVRJT04pOwotCi0JcmV0dXJuICgoaGdxICYgMHgwMDAwZmYwMCkgPT0gMCkgPyB0cnVlIDogZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9oYWxfaW50Zi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvaGFsX2ludGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM4M2U2OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9oYWxfaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgX0hBTF9JTlRGX0NfCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi0jaW5jbHVkZSA8aGFsX2ludGYuaD4KLQotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotCi12b2lkIHJ0d19oYWxfdXBkYXRlX3JhX21hc2syM2Eoc3RydWN0IHN0YV9pbmZvICpwc3RhLCB1OCByc3NpX2xldmVsKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXI7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2OwotCi0JaWYgKCFwc3RhKQotCQlyZXR1cm47Ci0KLQlwYWRhcHRlciA9IHBzdGEtPnBhZGFwdGVyOwotCi0JcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQkJYWRkX1JBVGlkMjNhKHBhZGFwdGVyLCBwc3RhLCByc3NpX2xldmVsKTsKLSNlbmRpZgotCX0gZWxzZQotCQlydGw4NzIzYV91cGRhdGVfcmFtYXNrKHBhZGFwdGVyLCBwc3RhLT5tYWNfaWQsIHJzc2lfbGV2ZWwpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3OWMzNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG0uYworKysgL2Rldi9udWxsCkBAIC0xLDE3MzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJvZG1fcHJlY29tcC5oIgotI2luY2x1ZGUgInVzYl9vcHNfbGludXguaCIKLQotc3RhdGljIGNvbnN0IHUxNiBkQl9JbnZlcnRfVGFibGVbOF1bMTJdID0gewotCXsxLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCA0LCA0fSwKLQl7NCwgNSwgNiwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTQsIDE2fSwKLQl7MTgsIDIwLCAyMiwgMjUsIDI4LCAzMiwgMzUsIDQwLCA0NSwgNTAsIDU2LCA2M30sCi0JezcxLCA3OSwgODksIDEwMCwgMTEyLCAxMjYsIDE0MSwgMTU4LCAxNzgsIDIwMCwgMjI0LCAyNTF9LAotCXsyODIsIDMxNiwgMzU1LCAzOTgsIDQ0NywgNTAxLCA1NjIsIDYzMSwgNzA4LCA3OTQsIDg5MSwgMTAwMH0sCi0JezExMjIsIDEyNTksIDE0MTMsIDE1ODUsIDE3NzgsIDE5OTUsIDIyMzksIDI1MTIsIDI4MTgsIDMxNjIsIDM1NDgsIDM5ODF9LAotCXs0NDY3LCA1MDEyLCA1NjIzLCA2MzEwLCA3MDc5LCA3OTQzLCA4OTEzLCAxMDAwMCwgMTEyMjAsIDEyNTg5LCAxNDEyNSwgMTU4NDl9LAotCXsxNzc4MywgMTk5NTMsIDIyMzg3LCAyNTExOSwgMjgxODQsIDMxNjIzLCAzNTQ4MSwgMzk4MTEsIDQ0NjY4LCA1MDExOSwgNTYyMzQsIDY1NTM1fQotfTsKLQotc3RhdGljIHUzMiBFRENBUGFyYW1bSFRfSU9UX1BFRVJfTUFYXVszXSA9IHsgICAgICAgICAgLyogIFVMCQkJREwgKi8KLQl7MHg1ZWE0MmIsIDB4NWVhNDJiLCAweDVlYTQyYn0sIC8qIDA6dW5rbm93biBBUCAqLwotCXsweGE0NGYsIDB4NWVhNDRmLCAweDVlNDMxY30sIC8qICAxOnJlYWx0ZWsgQVAgKi8KLQl7MHg1ZWE0MmIsIDB4NWVhNDJiLCAweDVlYTQyYn0sIC8qICAyOnVua25vd24gQVAgPT4gcmVhbHRla185MlNFICovCi0JezB4NWVhMzJiLCAweDVlYTQyYiwgMHg1ZTQzMjJ9LCAvKiAgMzpicm9hZGNvbSBBUCAqLwotCXsweDVlYTQyMiwgMHgwMGE0NGYsIDB4MDBhNDRmfSwgLyogIDQ6cmFsaW5rIEFQICovCi0JezB4NWVhMzIyLCAweDAwYTYzMCwgMHgwMGE0NGZ9LCAvKiAgNTphdGhlcm9zIEFQICovCi0JezB4NWU0MzIyLCAweDVlNDMyMiwgMHg1ZTQzMjJ9LC8qICA2OmNpc2NvIEFQICovCi0JezB4NWVhNDRmLCAweDAwYTQ0ZiwgMHg1ZWE0MmJ9LCAvKiAgODptYXJ2ZWxsIEFQICovCi0JezB4NWVhNDJiLCAweDVlYTQyYiwgMHg1ZWE0MmJ9LCAvKiAgMTA6dW5rbm93biBBUCA9PiA5MlUgQVAgKi8KLQl7MHg1ZWE0MmIsIDB4YTYzMCwgMHg1ZTQzMWN9LCAvKiAgMTE6YWlyZ29jYXAgQVAgKi8KLX07Ci0KLS8qICBFRENBIFBhcmFtZXRlciBmb3IgQVAvQURTTCAgIGJ5IE1pbmd6aGkgMjAxMS0xMS0yMiAqLwotCi0vKiAgR2xvYmFsIHZhciAqLwotdTMyIE9GRE1Td2luZ1RhYmxlMjNBW09GRE1fVEFCTEVfU0laRV85MkRdID0gewotCTB4N2Y4MDAxZmUsIC8qICAwLCArNi4wZEIgKi8KLQkweDc4ODAwMWUyLCAvKiAgMSwgKzUuNWRCICovCi0JMHg3MWMwMDFjNywgLyogIDIsICs1LjBkQiAqLwotCTB4NmI4MDAxYWUsIC8qICAzLCArNC41ZEIgKi8KLQkweDY1NDAwMTk1LCAvKiAgNCwgKzQuMGRCICovCi0JMHg1ZmMwMDE3ZiwgLyogIDUsICszLjVkQiAqLwotCTB4NWE0MDAxNjksIC8qICA2LCArMy4wZEIgKi8KLQkweDU1NDAwMTU1LCAvKiAgNywgKzIuNWRCICovCi0JMHg1MDgwMDE0MiwgLyogIDgsICsyLjBkQiAqLwotCTB4NGMwMDAxMzAsIC8qICA5LCArMS41ZEIgKi8KLQkweDQ3YzAwMTFmLCAvKiAgMTAsICsxLjBkQiAqLwotCTB4NDNjMDAxMGYsIC8qICAxMSwgKzAuNWRCICovCi0JMHg0MDAwMDEwMCwgLyogIDEyLCArMGRCICovCi0JMHgzYzgwMDBmMiwgLyogIDEzLCAtMC41ZEIgKi8KLQkweDM5MDAwMGU0LCAvKiAgMTQsIC0xLjBkQiAqLwotCTB4MzVjMDAwZDcsIC8qICAxNSwgLTEuNWRCICovCi0JMHgzMmMwMDBjYiwgLyogIDE2LCAtMi4wZEIgKi8KLQkweDMwMDAwMGMwLCAvKiAgMTcsIC0yLjVkQiAqLwotCTB4MmQ0MDAwYjUsIC8qICAxOCwgLTMuMGRCICovCi0JMHgyYWMwMDBhYiwgLyogIDE5LCAtMy41ZEIgKi8KLQkweDI4ODAwMGEyLCAvKiAgMjAsIC00LjBkQiAqLwotCTB4MjYwMDAwOTgsIC8qICAyMSwgLTQuNWRCICovCi0JMHgyNDAwMDA5MCwgLyogIDIyLCAtNS4wZEIgKi8KLQkweDIyMDAwMDg4LCAvKiAgMjMsIC01LjVkQiAqLwotCTB4MjAwMDAwODAsIC8qICAyNCwgLTYuMGRCICovCi0JMHgxZTQwMDA3OSwgLyogIDI1LCAtNi41ZEIgKi8KLQkweDFjODAwMDcyLCAvKiAgMjYsIC03LjBkQiAqLwotCTB4MWIwMDAwNmMsIC8qICAyNy4gLTcuNWRCICovCi0JMHgxOTgwMDA2NiwgLyogIDI4LCAtOC4wZEIgKi8KLQkweDE4MDAwMDYwLCAvKiAgMjksIC04LjVkQiAqLwotCTB4MTZjMDAwNWIsIC8qICAzMCwgLTkuMGRCICovCi0JMHgxNTgwMDA1NiwgLyogIDMxLCAtOS41ZEIgKi8KLQkweDE0NDAwMDUxLCAvKiAgMzIsIC0xMC4wZEIgKi8KLQkweDEzMDAwMDRjLCAvKiAgMzMsIC0xMC41ZEIgKi8KLQkweDEyMDAwMDQ4LCAvKiAgMzQsIC0xMS4wZEIgKi8KLQkweDExMDAwMDQ0LCAvKiAgMzUsIC0xMS41ZEIgKi8KLQkweDEwMDAwMDQwLCAvKiAgMzYsIC0xMi4wZEIgKi8KLQkweDBmMDAwMDNjLC8qICAzNywgLTEyLjVkQiAqLwotCTB4MGU0MDAwMzksLyogIDM4LCAtMTMuMGRCICovCi0JMHgwZDgwMDAzNiwvKiAgMzksIC0xMy41ZEIgKi8KLQkweDBjYzAwMDMzLC8qICA0MCwgLTE0LjBkQiAqLwotCTB4MGMwMDAwMzAsLyogIDQxLCAtMTQuNWRCICovCi0JMHgwYjQwMDAyZCwvKiAgNDIsIC0xNS4wZEIgKi8KLX07Ci0KLXU4IENDS1N3aW5nVGFibGVfQ2gxX0NoMTMyM0FbQ0NLX1RBQkxFX1NJWkVdWzhdID0gewotCXsweDM2LCAweDM1LCAweDJlLCAweDI1LCAweDFjLCAweDEyLCAweDA5LCAweDA0fSwgLyogIDAsICswZEIgKi8KLQl7MHgzMywgMHgzMiwgMHgyYiwgMHgyMywgMHgxYSwgMHgxMSwgMHgwOCwgMHgwNH0sIC8qICAxLCAtMC41ZEIgKi8KLQl7MHgzMCwgMHgyZiwgMHgyOSwgMHgyMSwgMHgxOSwgMHgxMCwgMHgwOCwgMHgwM30sIC8qICAyLCAtMS4wZEIgKi8KLQl7MHgyZCwgMHgyZCwgMHgyNywgMHgxZiwgMHgxOCwgMHgwZiwgMHgwOCwgMHgwM30sIC8qICAzLCAtMS41ZEIgKi8KLQl7MHgyYiwgMHgyYSwgMHgyNSwgMHgxZSwgMHgxNiwgMHgwZSwgMHgwNywgMHgwM30sIC8qICA0LCAtMi4wZEIgKi8KLQl7MHgyOCwgMHgyOCwgMHgyMiwgMHgxYywgMHgxNSwgMHgwZCwgMHgwNywgMHgwM30sIC8qICA1LCAtMi41ZEIgKi8KLQl7MHgyNiwgMHgyNSwgMHgyMSwgMHgxYiwgMHgxNCwgMHgwZCwgMHgwNiwgMHgwM30sIC8qICA2LCAtMy4wZEIgKi8KLQl7MHgyNCwgMHgyMywgMHgxZiwgMHgxOSwgMHgxMywgMHgwYywgMHgwNiwgMHgwM30sIC8qICA3LCAtMy41ZEIgKi8KLQl7MHgyMiwgMHgyMSwgMHgxZCwgMHgxOCwgMHgxMSwgMHgwYiwgMHgwNiwgMHgwMn0sIC8qICA4LCAtNC4wZEIgKi8KLQl7MHgyMCwgMHgyMCwgMHgxYiwgMHgxNiwgMHgxMSwgMHgwOCwgMHgwNSwgMHgwMn0sIC8qICA5LCAtNC41ZEIgKi8KLQl7MHgxZiwgMHgxZSwgMHgxYSwgMHgxNSwgMHgxMCwgMHgwYSwgMHgwNSwgMHgwMn0sIC8qICAxMCwgLTUuMGRCICovCi0JezB4MWQsIDB4MWMsIDB4MTgsIDB4MTQsIDB4MGYsIDB4MGEsIDB4MDUsIDB4MDJ9LCAvKiAgMTEsIC01LjVkQiAqLwotCXsweDFiLCAweDFhLCAweDE3LCAweDEzLCAweDBlLCAweDA5LCAweDA0LCAweDAyfSwgLyogIDEyLCAtNi4wZEIgKi8KLQl7MHgxYSwgMHgxOSwgMHgxNiwgMHgxMiwgMHgwZCwgMHgwOSwgMHgwNCwgMHgwMn0sIC8qICAxMywgLTYuNWRCICovCi0JezB4MTgsIDB4MTcsIDB4MTUsIDB4MTEsIDB4MGMsIDB4MDgsIDB4MDQsIDB4MDJ9LCAvKiAgMTQsIC03LjBkQiAqLwotCXsweDE3LCAweDE2LCAweDEzLCAweDEwLCAweDBjLCAweDA4LCAweDA0LCAweDAyfSwgLyogIDE1LCAtNy41ZEIgKi8KLQl7MHgxNiwgMHgxNSwgMHgxMiwgMHgwZiwgMHgwYiwgMHgwNywgMHgwNCwgMHgwMX0sIC8qICAxNiwgLTguMGRCICovCi0JezB4MTQsIDB4MTQsIDB4MTEsIDB4MGUsIDB4MGIsIDB4MDcsIDB4MDMsIDB4MDJ9LCAvKiAgMTcsIC04LjVkQiAqLwotCXsweDEzLCAweDEzLCAweDEwLCAweDBkLCAweDBhLCAweDA2LCAweDAzLCAweDAxfSwgLyogIDE4LCAtOS4wZEIgKi8KLQl7MHgxMiwgMHgxMiwgMHgwZiwgMHgwYywgMHgwOSwgMHgwNiwgMHgwMywgMHgwMX0sIC8qICAxOSwgLTkuNWRCICovCi0JezB4MTEsIDB4MTEsIDB4MGYsIDB4MGMsIDB4MDksIDB4MDYsIDB4MDMsIDB4MDF9LCAvKiAgMjAsIC0xMC4wZEIgKi8KLQl7MHgxMCwgMHgxMCwgMHgwZSwgMHgwYiwgMHgwOCwgMHgwNSwgMHgwMywgMHgwMX0sIC8qICAyMSwgLTEwLjVkQiAqLwotCXsweDBmLCAweDBmLCAweDBkLCAweDBiLCAweDA4LCAweDA1LCAweDAzLCAweDAxfSwgLyogIDIyLCAtMTEuMGRCICovCi0JezB4MGUsIDB4MGUsIDB4MGMsIDB4MGEsIDB4MDgsIDB4MDUsIDB4MDIsIDB4MDF9LCAvKiAgMjMsIC0xMS41ZEIgKi8KLQl7MHgwZCwgMHgwZCwgMHgwYywgMHgwYSwgMHgwNywgMHgwNSwgMHgwMiwgMHgwMX0sIC8qICAyNCwgLTEyLjBkQiAqLwotCXsweDBkLCAweDBjLCAweDBiLCAweDA5LCAweDA3LCAweDA0LCAweDAyLCAweDAxfSwgLyogIDI1LCAtMTIuNWRCICovCi0JezB4MGMsIDB4MGMsIDB4MGEsIDB4MDksIDB4MDYsIDB4MDQsIDB4MDIsIDB4MDF9LCAvKiAgMjYsIC0xMy4wZEIgKi8KLQl7MHgwYiwgMHgwYiwgMHgwYSwgMHgwOCwgMHgwNiwgMHgwNCwgMHgwMiwgMHgwMX0sIC8qICAyNywgLTEzLjVkQiAqLwotCXsweDBiLCAweDBhLCAweDA5LCAweDA4LCAweDA2LCAweDA0LCAweDAyLCAweDAxfSwgLyogIDI4LCAtMTQuMGRCICovCi0JezB4MGEsIDB4MGEsIDB4MDksIDB4MDcsIDB4MDUsIDB4MDMsIDB4MDIsIDB4MDF9LCAvKiAgMjksIC0xNC41ZEIgKi8KLQl7MHgwYSwgMHgwOSwgMHgwOCwgMHgwNywgMHgwNSwgMHgwMywgMHgwMiwgMHgwMX0sIC8qICAzMCwgLTE1LjBkQiAqLwotCXsweDA5LCAweDA5LCAweDA4LCAweDA2LCAweDA1LCAweDAzLCAweDAxLCAweDAxfSwgLyogIDMxLCAtMTUuNWRCICovCi0JezB4MDksIDB4MDgsIDB4MDcsIDB4MDYsIDB4MDQsIDB4MDMsIDB4MDEsIDB4MDF9CS8qICAzMiwgLTE2LjBkQiAqLwotfTsKLQotdTggQ0NLU3dpbmdUYWJsZV9DaDE0MjNBW0NDS19UQUJMRV9TSVpFXVs4XSA9IHsKLQl7MHgzNiwgMHgzNSwgMHgyZSwgMHgxYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAwLCArMGRCICovCi0JezB4MzMsIDB4MzIsIDB4MmIsIDB4MTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMSwgLTAuNWRCICovCi0JezB4MzAsIDB4MmYsIDB4MjksIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMiwgLTEuMGRCICovCi0JezB4MmQsIDB4MmQsIDB4MTcsIDB4MTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMywgLTEuNWRCICovCi0JezB4MmIsIDB4MmEsIDB4MjUsIDB4MTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgNCwgLTIuMGRCICovCi0JezB4MjgsIDB4MjgsIDB4MjQsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgNSwgLTIuNWRCICovCi0JezB4MjYsIDB4MjUsIDB4MjEsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgNiwgLTMuMGRCICovCi0JezB4MjQsIDB4MjMsIDB4MWYsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgNywgLTMuNWRCICovCi0JezB4MjIsIDB4MjEsIDB4MWQsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgOCwgLTQuMGRCICovCi0JezB4MjAsIDB4MjAsIDB4MWIsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgOSwgLTQuNWRCICovCi0JezB4MWYsIDB4MWUsIDB4MWEsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMTAsIC01LjBkQiAqLwotCXsweDFkLCAweDFjLCAweDE4LCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDExLCAtNS41ZEIgKi8KLQl7MHgxYiwgMHgxYSwgMHgxNywgMHgwZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAxMiwgLTYuMGRCICovCi0JezB4MWEsIDB4MTksIDB4MTYsIDB4MGQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMTMsIC02LjVkQiAqLwotCXsweDE4LCAweDE3LCAweDE1LCAweDBjLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDE0LCAtNy4wZEIgKi8KLQl7MHgxNywgMHgxNiwgMHgxMywgMHgwYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAxNSwgLTcuNWRCICovCi0JezB4MTYsIDB4MTUsIDB4MTIsIDB4MGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMTYsIC04LjBkQiAqLwotCXsweDE0LCAweDE0LCAweDExLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDE3LCAtOC41ZEIgKi8KLQl7MHgxMywgMHgxMywgMHgxMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAxOCwgLTkuMGRCICovCi0JezB4MTIsIDB4MTIsIDB4MGYsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMTksIC05LjVkQiAqLwotCXsweDExLCAweDExLCAweDBmLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDIwLCAtMTAuMGRCICovCi0JezB4MTAsIDB4MTAsIDB4MGUsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMjEsIC0xMC41ZEIgKi8KLQl7MHgwZiwgMHgwZiwgMHgwZCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAyMiwgLTExLjBkQiAqLwotCXsweDBlLCAweDBlLCAweDBjLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDIzLCAtMTEuNWRCICovCi0JezB4MGQsIDB4MGQsIDB4MGMsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMjQsIC0xMi4wZEIgKi8KLQl7MHgwZCwgMHgwYywgMHgwYiwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAyNSwgLTEyLjVkQiAqLwotCXsweDBjLCAweDBjLCAweDBhLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDI2LCAtMTMuMGRCICovCi0JezB4MGIsIDB4MGIsIDB4MGEsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMjcsIC0xMy41ZEIgKi8KLQl7MHgwYiwgMHgwYSwgMHgwOSwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAyOCwgLTE0LjBkQiAqLwotCXsweDBhLCAweDBhLCAweDA5LCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDI5LCAtMTQuNWRCICovCi0JezB4MGEsIDB4MDksIDB4MDgsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMzAsIC0xNS4wZEIgKi8KLQl7MHgwOSwgMHgwOSwgMHgwOCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAzMSwgLTE1LjVkQiAqLwotCXsweDA5LCAweDA4LCAweDA3LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwfQkvKiAgMzIsIC0xNi4wZEIgKi8KLX07Ci0KLS8qICBMb2NhbCBGdW5jdGlvbiBwcmVkZWZpbmUuICovCi0KLS8qIFNUQVJULS0tLS0tLS0tLS0tQ09NTU9OIElORk8gUkVMQVRFRC0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBvZG1fQ29tbW9uSW5mb1NlbGZJbml0MjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLXN0YXRpYyB2b2lkIG9kbV9Db21tb25JbmZvU2VsZlVwZGF0ZShzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhKTsKLQotdm9pZCBvZG1fQ21uSW5mb0luaXRfRGVidWcyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotdm9pZCBvZG1fQ21uSW5mb1VwZGF0ZV9EZWJ1ZzIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi0vKiBTVEFSVC0tLS0tLS0tLS0tLS0tLURJRy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBvZG1fRmFsc2VBbGFybUNvdW50ZXJTdGF0aXN0aWNzMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLXZvaWQgb2RtX0RJRzIzYUluaXQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotdm9pZCBvZG1fRElHMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci0KLXZvaWQgb2RtX0NDS1BhY2tldERldGVjdGlvblRocmVzaDIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotLyogRU5ELS0tLS0tLS0tLS0tLS0tRElHLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIFNUQVJULS0tLS0tLUJCIFBPV0VSIFNBVkUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBvZG0yM2FfRHluQkJQU0luaXQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotCi0vKiBFTkQtLS0tLS0tLS1CQiBQT1dFUiBTQVZFLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdm9pZCBvZG1fRHluYW1pY1R4UG93ZXIyM2FJbml0KHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLXN0YXRpYyB2b2lkIG9kbV9SU1NJTW9uaXRvckNoZWNrKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci12b2lkIG9kbV9EeW5hbWljVHhQb3dlcjIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi1zdGF0aWMgdm9pZCBvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2soc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotdm9pZCBvZG1fUmF0ZUFkYXB0aXZlTWFza0luaXQyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotc3RhdGljIHZvaWQgb2RtX1RYUG93ZXJUcmFja2luZ0luaXQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotc3RhdGljIHZvaWQgb2RtX0VkY2FUdXJib0NoZWNrMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci1zdGF0aWMgdm9pZCBPRE1fRWRjYVR1cmJvSW5pdDIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi0jZGVmaW5lCQlSeERlZmF1bHRBbnQxCQkweDY1YTkKLSNkZWZpbmUJUnhEZWZhdWx0QW50MgkJMHg1NjlhCi0KLWJvb2wgb2RtX1N0YURlZkFudFNlbChzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JdTMyIE9GRE1fQW50MV9DbnQsCi0JdTMyIE9GRE1fQW50Ml9DbnQsCi0JdTMyIENDS19BbnQxX0NudCwKLQl1MzIgQ0NLX0FudDJfQ250LAotCXU4ICpwRGVmQW50Ci0JKTsKLQotdm9pZCBvZG1fU2V0UnhJZGxlQW50KHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwKLQl1OCBBbnQsCi0JYm9vbCAgIGJEdWFsUGF0aAotKTsKLQotLyogMyBFeHBvcnQgSW50ZXJmYWNlICovCi0KLS8qICAyMDExLzA5LzIxIE1IIEFkZCB0byBkZXNjcmliZSBkaWZmZXJlbnQgdGVhbSBuZWNlc3NhcnkgcmVzb3VyY2UgYWxsb2NhdGU/PyAqLwotdm9pZCBPRE0yM2FfRE1Jbml0KHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQkvKiBGb3IgYWxsIElDIHNlcmllcyAqLwotCW9kbV9Db21tb25JbmZvU2VsZkluaXQyM2EocERNX09kbSk7Ci0Jb2RtX0NtbkluZm9Jbml0X0RlYnVnMjNhKHBETV9PZG0pOwotCW9kbV9ESUcyM2FJbml0KHBETV9PZG0pOwotCW9kbV9SYXRlQWRhcHRpdmVNYXNrSW5pdDIzYShwRE1fT2RtKTsKLQotCW9kbTIzYV9EeW5CQlBTSW5pdChwRE1fT2RtKTsKLQlvZG1fRHluYW1pY1R4UG93ZXIyM2FJbml0KHBETV9PZG0pOwotCW9kbV9UWFBvd2VyVHJhY2tpbmdJbml0KHBETV9PZG0pOwotCU9ETV9FZGNhVHVyYm9Jbml0MjNhKHBETV9PZG0pOwotfQotCi0vKiAgMjAxMS8wOS8yMCBNSCBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludGVyIGZvciBhbGwgdGVhbSB0byBleGVjdXRlIEhXIG91dCBzb3VyY2UgRE0uICovCi0vKiAgWW91IGNhbiBub3QgYWRkIGFueSBkdW1teSBmdW5jdGlvbiBoZXJlLCBiZSBjYXJlLCB5b3UgY2FuIG9ubHkgdXNlIERNIHN0cnVjdHVyZSAqLwotLyogIHRvIHBlcmZvcm0gYW55IG5ldyBPRE1fRE0uICovCi12b2lkIE9ETV9ETVdhdGNoZG9nMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0ZXIpOwotCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSA9ICZwSGFsRGF0YS0+b2RtcHJpdjsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJscHJpdiA9ICZhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQotCS8qIDIwMTIuMDUuMDMgTHVrZTogRm9yIGFsbCBJQyBzZXJpZXMgKi8KLQlvZG1fQ21uSW5mb1VwZGF0ZV9EZWJ1ZzIzYShwRE1fT2RtKTsKLQlvZG1fQ29tbW9uSW5mb1NlbGZVcGRhdGUocEhhbERhdGEpOwotCW9kbV9GYWxzZUFsYXJtQ291bnRlclN0YXRpc3RpY3MyM2EocERNX09kbSk7Ci0Jb2RtX1JTU0lNb25pdG9yQ2hlY2socERNX09kbSk7Ci0KLQkvKiA4NzIzQSBvciA4MTg5RVMgcGxhdGZvcm0gKi8KLQkvKiBOZWlsQ2hlbi0tMjAxMi0tMDgtLTI0LS0gKi8KLQkvKiBGaXggTGVhdmUgTFBTIGlzc3VlICovCi0JaWYgKChwRE1fT2RtLT5BZGFwdGVyLT5wd3JjdHJscHJpdi5wd3JfbW9kZSAhPSBQU19NT0RFX0FDVElWRSkgJiYvKiAgaW4gTFBTIG1vZGUgKi8KLQkgICAgKHBETV9PZG0tPlN1cHBvcnRJQ1R5cGUgJiBPRE1fUlRMODcyM0EpKSB7Ci0JCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgiLS0tLVN0ZXAxOiBvZG1fRElHMjNhIGlzIGluIExQUyBtb2RlXG4iKSk7Ci0JCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgiLS0tU3RlcDI6IDg3MjNBUyBpcyBpbiBMUFMgbW9kZVxuIikpOwotCQkJb2RtX0RJRzIzYWJ5UlNTSV9MUFMocERNX09kbSk7Ci0JfSBlbHNlIHsKLQkJb2RtX0RJRzIzYShhZGFwdGVyKTsKLQl9Ci0KLQlvZG1fQ0NLUGFja2V0RGV0ZWN0aW9uVGhyZXNoMjNhKHBETV9PZG0pOwotCi0JaWYgKHB3cmN0cmxwcml2LT5icG93ZXJfc2F2aW5nKQotCQlyZXR1cm47Ci0KLQlvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2socERNX09kbSk7Ci0KLQotCW9kbV9FZGNhVHVyYm9DaGVjazIzYShwRE1fT2RtKTsKLX0KLQotLyogICovCi0vKiAgSW5pdCAvLi4gRml4ZWQgSFcgdmFsdWUuIE9ubHkgaW5pdCB0aW1lLiAqLwotLyogICovCi12b2lkIE9ETV9DbW5JbmZvSW5pdDIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JCWVudW0gb2RtX2NtbmluZm8gQ21uSW5mbywKLQkJdTMyIFZhbHVlCi0JKQotewotCS8qIE9ETV9SVF9UUkFDRShwRE1fT2RtLCk7ICovCi0KLQkvKiAgKi8KLQkvKiAgVGhpcyBzZWN0aW9uIGlzIHVzZWQgZm9yIGluaXQgdmFsdWUgKi8KLQkvKiAgKi8KLQlzd2l0Y2gJKENtbkluZm8pIHsKLQkvKiAgRml4ZWQgT0RNIHZhbHVlLiAqLwotCWNhc2UJT0RNX0NNTklORk9fTVBfVEVTVF9DSElQOgotCQlwRE1fT2RtLT5iSXNNUENoaXAgPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fSUNfVFlQRToKLQkJcERNX09kbS0+U3VwcG9ydElDVHlwZSA9IFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0NVVF9WRVI6Ci0JCXBETV9PZG0tPkN1dFZlcnNpb24gPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fRkFCX1ZFUjoKLQkJcERNX09kbS0+RmFiVmVyc2lvbiA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19CT0FSRF9UWVBFOgotCQlwRE1fT2RtLT5Cb2FyZFR5cGUgPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fRVhUX0xOQToKLQkJcERNX09kbS0+RXh0TE5BID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0VYVF9QQToKLQkJcERNX09kbS0+RXh0UEEgPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fRVhUX1RSU1c6Ci0JCXBETV9PZG0tPkV4dFRSU1cgPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fQklOSENUX1RFU1Q6Ci0JCXBETV9PZG0tPmJJbkhjdFRlc3QgPSAoYm9vbClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19CV0lGSV9URVNUOgotCQlwRE1fT2RtLT5iV0lGSVRlc3QgPSAoYm9vbClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19TTUFSVF9DT05DVVJSRU5UOgotCQlwRE1fT2RtLT5iRHVhbE1hY1NtYXJ0Q29uY3VycmVudCA9IChib29sKVZhbHVlOwotCQlicmVhazsKLQkvKiBUbyByZW1vdmUgdGhlIGNvbXBpbGVyIHdhcm5pbmcsIG11c3QgYWRkIGFuIGVtcHR5IGRlZmF1bHQgc3RhdGVtZW50IHRvIGhhbmRsZSB0aGUgb3RoZXIgdmFsdWVzLiAqLwotCWRlZmF1bHQ6Ci0JCS8qIGRvIG5vdGhpbmcgKi8KLQkJYnJlYWs7Ci0JfQotfQotCi12b2lkIE9ETV9DbW5JbmZvUHRyQXJyYXlIb29rMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgZW51bSBvZG1fY21uaW5mbyBDbW5JbmZvLAotCQkJCXUxNiBJbmRleCwgdm9pZCAqcFZhbHVlKQotewotCS8qICBIb29rIGNhbGwgYnkgcmVmZXJlbmNlIHBvaW50ZXIuICovCi0Jc3dpdGNoCShDbW5JbmZvKSB7Ci0JLyogIER5bmFtaWMgY2FsbCBieSByZWZlcmVuY2UgcG9pbnRlci4gKi8KLQljYXNlCU9ETV9DTU5JTkZPX1NUQV9TVEFUVVM6Ci0JCXBETV9PZG0tPnBPRE1fU3RhSW5mb1tJbmRleF0gPSAoc3RydWN0IHN0YV9pbmZvICopcFZhbHVlOwotCQlicmVhazsKLQkvKiBUbyByZW1vdmUgdGhlIGNvbXBpbGVyIHdhcm5pbmcsIG11c3QgYWRkIGFuIGVtcHR5IGRlZmF1bHQgc3RhdGVtZW50IHRvIGhhbmRsZSB0aGUgb3RoZXIgdmFsdWVzLiAqLwotCWRlZmF1bHQ6Ci0JCS8qIGRvIG5vdGhpbmcgKi8KLQkJYnJlYWs7Ci0JfQotfQotCi0vKiAgVXBkYXRlIEJhbmQvQ0hhbm5lbC8uLiBUaGUgdmFsdWVzIGFyZSBkeW5hbWljIGJ1dCBub24tcGVyLXBhY2tldC4gKi8KLXZvaWQgT0RNX0NtbkluZm9VcGRhdGUyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgQ21uSW5mbywgdTY0IFZhbHVlKQotewotCS8qICBUaGlzIGluaXQgdmFyaWFibGUgbWF5IGJlIGNoYW5nZWQgaW4gcnVuIHRpbWUuICovCi0Jc3dpdGNoCShDbW5JbmZvKSB7Ci0JY2FzZQlPRE1fQ01OSU5GT19XSUZJX0RJUkVDVDoKLQkJcERNX09kbS0+YldJRklfRGlyZWN0ID0gKGJvb2wpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fV0lGSV9ESVNQTEFZOgotCQlwRE1fT2RtLT5iV0lGSV9EaXNwbGF5ID0gKGJvb2wpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fTElOSzoKLQkJcERNX09kbS0+YkxpbmtlZCA9IChib29sKVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1JTU0lfTUlOOgotCQlwRE1fT2RtLT5SU1NJX01pbiA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19EQkdfQ09NUDoKLQkJcERNX09kbS0+RGVidWdDb21wb25lbnRzID0gVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fREJHX0xFVkVMOgotCQlwRE1fT2RtLT5EZWJ1Z0xldmVsID0gKHUzMilWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19SQV9USFJFU0hPTERfSElHSDoKLQkJcERNX09kbS0+UmF0ZUFkYXB0aXZlLkhpZ2hSU1NJVGhyZXNoID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1JBX1RIUkVTSE9MRF9MT1c6Ci0JCXBETV9PZG0tPlJhdGVBZGFwdGl2ZS5Mb3dSU1NJVGhyZXNoID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQl9Ci0KLX0KLQotdm9pZCBvZG1fQ29tbW9uSW5mb1NlbGZJbml0MjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQl1MzIgdmFsMzI7Ci0KLQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocERNX09kbS0+QWRhcHRlciwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyKTsKLQlpZiAodmFsMzIgJiBCSVQoOSkpCi0JCXBETV9PZG0tPmJDY2tIaWdoUG93ZXIgPSB0cnVlOwotCWVsc2UKLQkJcERNX09kbS0+YkNja0hpZ2hQb3dlciA9IGZhbHNlOwotCi0JcERNX09kbS0+UkZQYXRoUnhFbmFibGUgPQotCQlydGw4NzIzYXVfcmVhZDMyKHBETV9PZG0tPkFkYXB0ZXIsIHJPRkRNMF9UUnhQYXRoRW5hYmxlKSAmIDB4MEY7Ci0KLQlPRE1fSW5pdERlYnVnU2V0dGluZzIzYShwRE1fT2RtKTsKLX0KLQotc3RhdGljIHZvaWQgb2RtX0NvbW1vbkluZm9TZWxmVXBkYXRlKHN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEpCi17Ci0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtID0gJnBIYWxEYXRhLT5vZG1wcml2OwotCXN0cnVjdCBzdGFfaW5mbyAqcEVudHJ5OwotCXU4IEVudHJ5Q250ID0gMDsKLQl1OCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE9ETV9BU1NPQ0lBVEVfRU5UUllfTlVNOyBpKyspIHsKLQkJcEVudHJ5ID0gcERNX09kbS0+cE9ETV9TdGFJbmZvW2ldOwotCQlpZiAocEVudHJ5KQotCQkJRW50cnlDbnQrKzsKLQl9Ci0JaWYgKEVudHJ5Q250ID09IDEpCi0JCXBETV9PZG0tPmJPbmVFbnRyeU9ubHkgPSB0cnVlOwotCWVsc2UKLQkJcERNX09kbS0+Yk9uZUVudHJ5T25seSA9IGZhbHNlOwotfQotCi12b2lkIG9kbV9DbW5JbmZvSW5pdF9EZWJ1ZzIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIm9kbV9DbW5JbmZvSW5pdF9EZWJ1ZzIzYSA9PT5cbiIpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiU3VwcG9ydEFiaWxpdHkgPSAweCV4XG4iLCBwRE1fT2RtLT5TdXBwb3J0QWJpbGl0eSkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJTdXBwb3J0SUNUeXBlID0gMHgleFxuIiwgcERNX09kbS0+U3VwcG9ydElDVHlwZSkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJDdXRWZXJzaW9uID0lZFxuIiwgcERNX09kbS0+Q3V0VmVyc2lvbikpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJGYWJWZXJzaW9uID0lZFxuIiwgcERNX09kbS0+RmFiVmVyc2lvbikpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJCb2FyZFR5cGUgPSVkXG4iLCBwRE1fT2RtLT5Cb2FyZFR5cGUpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiRXh0TE5BID0lZFxuIiwgcERNX09kbS0+RXh0TE5BKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIkV4dFBBID0lZFxuIiwgcERNX09kbS0+RXh0UEEpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiRXh0VFJTVyA9JWRcbiIsIHBETV9PZG0tPkV4dFRSU1cpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiYkluSGN0VGVzdCA9JWRcbiIsIHBETV9PZG0tPmJJbkhjdFRlc3QpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiYldJRklUZXN0ID0lZFxuIiwgcERNX09kbS0+YldJRklUZXN0KSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoImJEdWFsTWFjU21hcnRDb25jdXJyZW50ID0lZFxuIiwgcERNX09kbS0+YkR1YWxNYWNTbWFydENvbmN1cnJlbnQpKTsKLQotfQotCi12b2lkIG9kbV9DbW5JbmZvVXBkYXRlX0RlYnVnMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgib2RtX0NtbkluZm9VcGRhdGVfRGVidWcyM2EgPT0+XG4iKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoImJXSUZJX0RpcmVjdCA9JWRcbiIsIHBETV9PZG0tPmJXSUZJX0RpcmVjdCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJiV0lGSV9EaXNwbGF5ID0lZFxuIiwgcERNX09kbS0+YldJRklfRGlzcGxheSkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJiTGlua2VkID0lZFxuIiwgcERNX09kbS0+YkxpbmtlZCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJSU1NJX01pbiA9JWRcbiIsIHBETV9PZG0tPlJTU0lfTWluKSk7Ci19Ci0KLXZvaWQgT0RNX1dyaXRlX0RJRzIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCXU4IEN1cnJlbnRJR0kpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQlzdHJ1Y3QgZGlnX3QgKnBETV9EaWdUYWJsZSA9ICZwRE1fT2RtLT5ETV9EaWdUYWJsZTsKLQl1MzIgdmFsMzI7Ci0KLQlpZiAocERNX0RpZ1RhYmxlLT5DdXJJR1ZhbHVlICE9IEN1cnJlbnRJR0kpIHsKLQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfSUdJX0FfMTFOKTsKLQkJdmFsMzIgJj0gfk9ETV9CSVRfSUdJXzExTjsKLQkJdmFsMzIgfD0gQ3VycmVudElHSTsKLQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19JR0lfQV8xMU4sIHZhbDMyKTsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELAotCQkJICAgICAoIkN1cnJlbnRJR0koMHglMDJ4KS4gXG4iLCBDdXJyZW50SUdJKSk7Ci0JCXBETV9EaWdUYWJsZS0+Q3VySUdWYWx1ZSA9IEN1cnJlbnRJR0k7Ci0JfQotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIk9ETV9Xcml0ZV9ESUcyM2EoKTpDdXJyZW50SUdJID0gMHgleCBcbiIsIEN1cnJlbnRJR0kpKTsKLX0KLQotLyogTmVlZCBMUFMgbW9kZSBmb3IgQ0UgcGxhdGZvcm0gLS0yMDEyLS0wOC0tMjQtLS0gKi8KLS8qIDg3MjNBUy84MTg5RVMgKi8KLXZvaWQgb2RtX0RJRzIzYWJ5UlNTSV9MUFMoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXN0cnVjdCBmYWxzZV9hbGFybV9zdGF0cyAqcEZhbHNlQWxtQ250ID0gJnBETV9PZG0tPkZhbHNlQWxtQ250OwotCXU4IFJTU0lfTG93ZXIgPSBETV9ESUdfTUlOX05JQzsgICAvKiAweDFFIG9yIDB4MUMgKi8KLQl1OCBiRndDdXJyZW50SW5QU01vZGUgPSBmYWxzZTsKLQl1OCBDdXJyZW50SUdJID0gcERNX09kbS0+UlNTSV9NaW47Ci0KLQlpZiAoIShwRE1fT2RtLT5TdXBwb3J0SUNUeXBlICYgT0RNX1JUTDg3MjNBKSkKLQkJcmV0dXJuOwotCi0JQ3VycmVudElHSSA9IEN1cnJlbnRJR0krUlNTSV9PRkZTRVRfRElHOwotCWJGd0N1cnJlbnRJblBTTW9kZSA9IHBBZGFwdGVyLT5wd3JjdHJscHJpdi5iRndDdXJyZW50SW5QU01vZGU7Ci0KLQkvKiAgVXNpbmcgRlcgUFMgbW9kZSB0byBtYWtlIElHSSAqLwotCWlmIChiRndDdXJyZW50SW5QU01vZGUpIHsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELAotCQkJICAgICAoIi0tLU5laWwtLS1vZG1fRElHMjNhIGlzIGluIExQUyBtb2RlXG4iKSk7Ci0JCS8qIEFkanVzdCBieSAgRkEgaW4gTFBTIE1PREUgKi8KLQkJaWYgKHBGYWxzZUFsbUNudC0+Q250X2FsbCA+IERNX0RJR19GQV9USDJfTFBTKQotCQkJQ3VycmVudElHSSA9IEN1cnJlbnRJR0krMjsKLQkJZWxzZSBpZiAocEZhbHNlQWxtQ250LT5DbnRfYWxsID4gRE1fRElHX0ZBX1RIMV9MUFMpCi0JCQlDdXJyZW50SUdJID0gQ3VycmVudElHSSsxOwotCQllbHNlIGlmIChwRmFsc2VBbG1DbnQtPkNudF9hbGwgPCBETV9ESUdfRkFfVEgwX0xQUykKLQkJCUN1cnJlbnRJR0kgPSBDdXJyZW50SUdJLTE7Ci0JfSBlbHNlIHsKLQkJQ3VycmVudElHSSA9IFJTU0lfTG93ZXI7Ci0JfQotCi0JLyogTG93ZXIgYm91bmQgY2hlY2tpbmcgKi8KLQotCS8qIFJTU0kgTG93ZXIgYm91bmQgY2hlY2sgKi8KLQlpZiAoKHBETV9PZG0tPlJTU0lfTWluLTEwKSA+IERNX0RJR19NSU5fTklDKQotCQlSU1NJX0xvd2VyID0gKHBETV9PZG0tPlJTU0lfTWluLTEwKTsKLQllbHNlCi0JCVJTU0lfTG93ZXIgPSBETV9ESUdfTUlOX05JQzsKLQotCS8qIFVwcGVyIGFuZCBMb3dlciBCb3VuZCBjaGVja2luZyAqLwotCSBpZiAoQ3VycmVudElHSSA+IERNX0RJR19NQVhfTklDKQotCQlDdXJyZW50SUdJID0gRE1fRElHX01BWF9OSUM7Ci0JIGVsc2UgaWYgKEN1cnJlbnRJR0kgPCBSU1NJX0xvd2VyKQotCQlDdXJyZW50SUdJID0gUlNTSV9Mb3dlcjsKLQotCU9ETV9Xcml0ZV9ESUcyM2EocERNX09kbSwgQ3VycmVudElHSSk7Ci19Ci0KLXZvaWQgb2RtX0RJRzIzYUluaXQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBkaWdfdCAqcERNX0RpZ1RhYmxlID0gJnBETV9PZG0tPkRNX0RpZ1RhYmxlOwotCXUzMiB2YWwzMjsKLQotCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihwRE1fT2RtLT5BZGFwdGVyLCBPRE1fUkVHX0lHSV9BXzExTik7Ci0JcERNX0RpZ1RhYmxlLT5DdXJJR1ZhbHVlID0gdmFsMzIgJiBPRE1fQklUX0lHSV8xMU47Ci0KLQlwRE1fRGlnVGFibGUtPlJzc2lMb3dUaHJlc2gJPSBETV9ESUdfVEhSRVNIX0xPVzsKLQlwRE1fRGlnVGFibGUtPlJzc2lIaWdoVGhyZXNoCT0gRE1fRElHX1RIUkVTSF9ISUdIOwotCXBETV9EaWdUYWJsZS0+RkFMb3dUaHJlc2gJPSBETV9GQUxTRUFMQVJNX1RIUkVTSF9MT1c7Ci0JcERNX0RpZ1RhYmxlLT5GQUhpZ2hUaHJlc2gJPSBETV9GQUxTRUFMQVJNX1RIUkVTSF9ISUdIOwotCWlmIChwRE1fT2RtLT5Cb2FyZFR5cGUgPT0gT0RNX0JPQVJEX0hJR0hQV1IpIHsKLQkJcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21heCA9IERNX0RJR19NQVhfTklDOwotCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWluID0gRE1fRElHX01JTl9OSUM7Ci0JfSBlbHNlIHsKLQkJcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21heCA9IERNX0RJR19NQVhfTklDOwotCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWluID0gRE1fRElHX01JTl9OSUM7Ci0JfQotCXBETV9EaWdUYWJsZS0+QmFja29mZlZhbCA9IERNX0RJR19CQUNLT0ZGX0RFRkFVTFQ7Ci0JcERNX0RpZ1RhYmxlLT5CYWNrb2ZmVmFsX3JhbmdlX21heCA9IERNX0RJR19CQUNLT0ZGX01BWDsKLQlwRE1fRGlnVGFibGUtPkJhY2tvZmZWYWxfcmFuZ2VfbWluID0gRE1fRElHX0JBQ0tPRkZfTUlOOwotCXBETV9EaWdUYWJsZS0+UHJlQ0NLX0NDQVRocmVzID0gMHhGRjsKLQlwRE1fRGlnVGFibGUtPkN1ckNDS19DQ0FUaHJlcyA9IDB4ODM7Ci0JcERNX0RpZ1RhYmxlLT5Gb3JiaWRkZW5JR0kgPSBETV9ESUdfTUlOX05JQzsKLQlwRE1fRGlnVGFibGUtPkxhcmdlRkFIaXQgPSAwOwotCXBETV9EaWdUYWJsZS0+UmVjb3Zlcl9jbnQgPSAwOwotCXBETV9EaWdUYWJsZS0+RElHX0R5bmFtaWNfTUlOXzAgPSBETV9ESUdfTUlOX05JQzsKLQlwRE1fRGlnVGFibGUtPkRJR19EeW5hbWljX01JTl8xID0gRE1fRElHX01JTl9OSUM7Ci0JcERNX0RpZ1RhYmxlLT5iTWVkaWFDb25uZWN0XzAgPSBmYWxzZTsKLQlwRE1fRGlnVGFibGUtPmJNZWRpYUNvbm5lY3RfMSA9IGZhbHNlOwotfQotCi12b2lkIG9kbV9ESUcyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHRlcik7Ci0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtID0gJnBIYWxEYXRhLT5vZG1wcml2OwotCXN0cnVjdCBkaWdfdCAqcERNX0RpZ1RhYmxlID0gJnBETV9PZG0tPkRNX0RpZ1RhYmxlOwotCXN0cnVjdCBmYWxzZV9hbGFybV9zdGF0cyAqcEZhbHNlQWxtQ250ID0gJnBETV9PZG0tPkZhbHNlQWxtQ250OwotCXU4IERJR19EeW5hbWljX01JTjsKLQl1OCBESUdfTWF4T2ZNaW47Ci0JYm9vbCBGaXJzdENvbm5lY3QsIEZpcnN0RGlzQ29ubmVjdDsKLQl1OCBkbV9kaWdfbWF4LCBkbV9kaWdfbWluOwotCXU4IEN1cnJlbnRJR0kgPSBwRE1fRGlnVGFibGUtPkN1cklHVmFsdWU7Ci0KLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCJvZG1fRElHMjNhKCkgPT0+XG4iKSk7Ci0JaWYgKGFkYXB0ZXItPm1sbWVwcml2LmJTY2FuSW5Qcm9jZXNzKSB7Ci0JCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwKLQkJCSAgICAgKCJvZG1fRElHMjNhKCkgUmV0dXJuOiBJbiBTY2FuIFByb2dyZXNzIFxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JRElHX0R5bmFtaWNfTUlOID0gcERNX0RpZ1RhYmxlLT5ESUdfRHluYW1pY19NSU5fMDsKLQlGaXJzdENvbm5lY3QgPSAocERNX09kbS0+YkxpbmtlZCkgJiYgKCFwRE1fRGlnVGFibGUtPmJNZWRpYUNvbm5lY3RfMCk7Ci0JRmlyc3REaXNDb25uZWN0ID0gKCFwRE1fT2RtLT5iTGlua2VkKSAmJgotCQkocERNX0RpZ1RhYmxlLT5iTWVkaWFDb25uZWN0XzApOwotCi0JLyogMSBCb3VuZGFyeSBEZWNpc2lvbiAqLwotCWlmICgocERNX09kbS0+U3VwcG9ydElDVHlwZSAmIE9ETV9SVEw4NzIzQSkgJiYKLQkgICAgKHBETV9PZG0tPkJvYXJkVHlwZSA9PSBPRE1fQk9BUkRfSElHSFBXUiB8fCBwRE1fT2RtLT5FeHRMTkEpKSB7Ci0JCWRtX2RpZ19tYXggPSBETV9ESUdfTUFYX05JQ19IUDsKLQkJZG1fZGlnX21pbiA9IERNX0RJR19NSU5fTklDX0hQOwotCQlESUdfTWF4T2ZNaW4gPSBETV9ESUdfTUFYX0FQX0hQOwotCX0gZWxzZSB7Ci0JCWRtX2RpZ19tYXggPSBETV9ESUdfTUFYX05JQzsKLQkJZG1fZGlnX21pbiA9IERNX0RJR19NSU5fTklDOwotCQlESUdfTWF4T2ZNaW4gPSBETV9ESUdfTUFYX0FQOwotCX0KLQotCWlmIChwRE1fT2RtLT5iTGlua2VkKSB7Ci0JICAgICAgLyogMiA4NzIzQSBTZXJpZXMsIG9mZnNldCBuZWVkIHRvIGJlIDEwICovCi0JCWlmIChwRE1fT2RtLT5TdXBwb3J0SUNUeXBlID09IE9ETV9SVEw4NzIzQSkgewotCQkJLyogMiBVcHBlciBCb3VuZCAqLwotCQkJaWYgKChwRE1fT2RtLT5SU1NJX01pbiArIDEwKSA+IERNX0RJR19NQVhfTklDKQotCQkJCXBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9tYXggPSBETV9ESUdfTUFYX05JQzsKLQkJCWVsc2UgaWYgKChwRE1fT2RtLT5SU1NJX01pbiArIDEwKSA8IERNX0RJR19NSU5fTklDKQotCQkJCXBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9tYXggPSBETV9ESUdfTUlOX05JQzsKLQkJCWVsc2UKLQkJCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWF4ID0gcERNX09kbS0+UlNTSV9NaW4gKyAxMDsKLQotCQkJLyogMiBJZiBCVCBpcyBDb25jdXJyZW50LCBuZWVkIHRvIHNldCBMb3dlciBCb3VuZCAqLwotCQkJRElHX0R5bmFtaWNfTUlOID0gRE1fRElHX01JTl9OSUM7Ci0JCX0gZWxzZSB7Ci0JCQkvKiAyIE1vZGlmeSBESUcgdXBwZXIgYm91bmQgKi8KLQkJCWlmICgocERNX09kbS0+UlNTSV9NaW4gKyAyMCkgPiBkbV9kaWdfbWF4KQotCQkJCXBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9tYXggPSBkbV9kaWdfbWF4OwotCQkJZWxzZSBpZiAoKHBETV9PZG0tPlJTU0lfTWluICsgMjApIDwgZG1fZGlnX21pbikKLQkJCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWF4ID0gZG1fZGlnX21pbjsKLQkJCWVsc2UKLQkJCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWF4ID0gcERNX09kbS0+UlNTSV9NaW4gKyAyMDsKLQotCQkJLyogMiBNb2RpZnkgRElHIGxvd2VyIGJvdW5kICovCi0JCQlpZiAocERNX09kbS0+Yk9uZUVudHJ5T25seSkgewotCQkJCWlmIChwRE1fT2RtLT5SU1NJX01pbiA8IGRtX2RpZ19taW4pCi0JCQkJCURJR19EeW5hbWljX01JTiA9IGRtX2RpZ19taW47Ci0JCQkJZWxzZSBpZiAocERNX09kbS0+UlNTSV9NaW4gPiBESUdfTWF4T2ZNaW4pCi0JCQkJCURJR19EeW5hbWljX01JTiA9IERJR19NYXhPZk1pbjsKLQkJCQllbHNlCi0JCQkJCURJR19EeW5hbWljX01JTiA9IHBETV9PZG0tPlJTU0lfTWluOwotCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwKLQkJCQkJICAgICAoIm9kbV9ESUcyM2EoKSA6IGJPbmVFbnRyeU9ubHkgPSB0cnVlLCAgRElHX0R5bmFtaWNfTUlOID0gMHgleFxuIiwKLQkJCQkJICAgICBESUdfRHluYW1pY19NSU4pKTsKLQkJCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsCi0JCQkJCSAgICAgKCJvZG1fRElHMjNhKCkgOiBwRE1fT2RtLT5SU1NJX01pbiA9JWRcbiIsCi0JCQkJCSAgICAgcERNX09kbS0+UlNTSV9NaW4pKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRElHX0R5bmFtaWNfTUlOID0gZG1fZGlnX21pbjsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCXBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9tYXggPSBkbV9kaWdfbWF4OwotCQlESUdfRHluYW1pY19NSU4gPSBkbV9kaWdfbWluOwotCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgib2RtX0RJRzIzYSgpIDogTm8gTGlua1xuIikpOwotCX0KLQotCS8qIDEgTW9kaWZ5IERJRyBsb3dlciBib3VuZCwgZGVhbCB3aXRoIGFibm9ybWFsbHkgbGFyZ2UgZmFsc2UgYWxhcm0gKi8KLQlpZiAocEZhbHNlQWxtQ250LT5DbnRfYWxsID4gMTAwMDApIHsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELAotCQkJICAgICAoImRtX0RJRygpOiBBYm5vcm5hbGx5IGZhbHNlIGFsYXJtIGNhc2UuIFxuIikpOwotCi0JCWlmIChwRE1fRGlnVGFibGUtPkxhcmdlRkFIaXQgIT0gMykKLQkJCXBETV9EaWdUYWJsZS0+TGFyZ2VGQUhpdCsrOwotCQlpZiAocERNX0RpZ1RhYmxlLT5Gb3JiaWRkZW5JR0kgPCBDdXJyZW50SUdJKSB7Ci0JCQlwRE1fRGlnVGFibGUtPkZvcmJpZGRlbklHSSA9IEN1cnJlbnRJR0k7Ci0JCQlwRE1fRGlnVGFibGUtPkxhcmdlRkFIaXQgPSAxOwotCQl9Ci0KLQkJaWYgKHBETV9EaWdUYWJsZS0+TGFyZ2VGQUhpdCA+PSAzKSB7Ci0JCQlpZiAoKHBETV9EaWdUYWJsZS0+Rm9yYmlkZGVuSUdJKzEpID4gcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21heCkKLQkJCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWluID0gcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21heDsKLQkJCWVsc2UKLQkJCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWluID0gKHBETV9EaWdUYWJsZS0+Rm9yYmlkZGVuSUdJICsgMSk7Ci0JCQlwRE1fRGlnVGFibGUtPlJlY292ZXJfY250ID0gMzYwMDsgLyogMzYwMCA9IDJociAqLwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogUmVjb3ZlcnkgbWVjaGFuaXNtIGZvciBJR0kgbG93ZXIgYm91bmQgKi8KLQkJaWYgKHBETV9EaWdUYWJsZS0+UmVjb3Zlcl9jbnQgIT0gMCkgewotCQkJcERNX0RpZ1RhYmxlLT5SZWNvdmVyX2NudC0tOwotCQl9IGVsc2UgewotCQkJaWYgKHBETV9EaWdUYWJsZS0+TGFyZ2VGQUhpdCA8IDMpIHsKLQkJCQlpZiAoKHBETV9EaWdUYWJsZS0+Rm9yYmlkZGVuSUdJIC0gMSkgPCBESUdfRHluYW1pY19NSU4pIHsKLQkJCQkJcERNX0RpZ1RhYmxlLT5Gb3JiaWRkZW5JR0kgPSBESUdfRHluYW1pY19NSU47IC8qIERNX0RJR19NSU47ICovCi0JCQkJCXBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9taW4gPSBESUdfRHluYW1pY19NSU47IC8qIERNX0RJR19NSU47ICovCi0JCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwKLQkJCQkJCSAgICAgKCJvZG1fRElHMjNhKCk6IE5vcm1hbCBDYXNlOiBBdCBMb3dlciBCb3VuZFxuIikpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBETV9EaWdUYWJsZS0+Rm9yYmlkZGVuSUdJLS07Ci0JCQkJCXBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9taW4gPSAocERNX0RpZ1RhYmxlLT5Gb3JiaWRkZW5JR0kgKyAxKTsKLQkJCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELAotCQkJCQkJICAgICAoIm9kbV9ESUcyM2EoKTogTm9ybWFsIENhc2U6IEFwcHJvYWNoIExvd2VyIEJvdW5kXG4iKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlwRE1fRGlnVGFibGUtPkxhcmdlRkFIaXQgPSAwOwotCQkJfQotCQl9Ci0JfQotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwgKCJvZG1fRElHMjNhKCk6IHBETV9EaWdUYWJsZS0+TGFyZ2VGQUhpdCA9JWRcbiIsIHBETV9EaWdUYWJsZS0+TGFyZ2VGQUhpdCkpOwotCi0JLyogMSBBZGp1c3QgaW5pdGlhbCBnYWluIGJ5IGZhbHNlIGFsYXJtICovCi0JaWYgKHBETV9PZG0tPmJMaW5rZWQpIHsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIm9kbV9ESUcyM2EoKTogRElHIEFmdGVyTGlua1xuIikpOwotCQlpZiAoRmlyc3RDb25uZWN0KSB7Ci0JCQlDdXJyZW50SUdJID0gcERNX09kbS0+UlNTSV9NaW47Ci0JCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgiRElHOiBGaXJzdCBDb25uZWN0XG4iKSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocEZhbHNlQWxtQ250LT5DbnRfYWxsID4gRE1fRElHX0ZBX1RIMikKLQkJCQlDdXJyZW50SUdJID0gQ3VycmVudElHSSArIDQ7LyogcERNX0RpZ1RhYmxlLT5DdXJJR1ZhbHVlID0gcERNX0RpZ1RhYmxlLT5QcmVJR1ZhbHVlKzI7ICovCi0JCQllbHNlIGlmIChwRmFsc2VBbG1DbnQtPkNudF9hbGwgPiBETV9ESUdfRkFfVEgxKQotCQkJCUN1cnJlbnRJR0kgPSBDdXJyZW50SUdJICsgMjsvKiBwRE1fRGlnVGFibGUtPkN1cklHVmFsdWUgPSBwRE1fRGlnVGFibGUtPlByZUlHVmFsdWUrMTsgKi8KLQkJCWVsc2UgaWYgKHBGYWxzZUFsbUNudC0+Q250X2FsbCA8IERNX0RJR19GQV9USDApCi0JCQkJQ3VycmVudElHSSA9IEN1cnJlbnRJR0kgLSAyOy8qIHBETV9EaWdUYWJsZS0+Q3VySUdWYWx1ZSA9IHBETV9EaWdUYWJsZS0+UHJlSUdWYWx1ZS0xOyAqLwotCQl9Ci0JfSBlbHNlIHsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIm9kbV9ESUcyM2EoKTogRElHIEJlZm9yZUxpbmtcbiIpKTsKLQkJaWYgKEZpcnN0RGlzQ29ubmVjdCkgewotCQkJQ3VycmVudElHSSA9IHBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9taW47Ci0JCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgib2RtX0RJRzIzYSgpOiBGaXJzdCBEaXNDb25uZWN0IFxuIikpOwotCQl9IGVsc2UgewotCQkJLyogMjAxMi4wMy4zMCBMdWtlTGVlOiBlbmFibGUgRElHIGJlZm9yZSBsaW5rIGJ1dCB3aXRoIHZlcnkgaGlnaCB0aHJlc2hvbGRzICovCi0JCQlpZiAocEZhbHNlQWxtQ250LT5DbnRfYWxsID4gMTAwMDApCi0JCQkJQ3VycmVudElHSSA9IEN1cnJlbnRJR0kgKyAyOy8qIHBETV9EaWdUYWJsZS0+Q3VySUdWYWx1ZSA9IHBETV9EaWdUYWJsZS0+UHJlSUdWYWx1ZSsyOyAqLwotCQkJZWxzZSBpZiAocEZhbHNlQWxtQ250LT5DbnRfYWxsID4gODAwMCkKLQkJCQlDdXJyZW50SUdJID0gQ3VycmVudElHSSArIDE7LyogcERNX0RpZ1RhYmxlLT5DdXJJR1ZhbHVlID0gcERNX0RpZ1RhYmxlLT5QcmVJR1ZhbHVlKzE7ICovCi0JCQllbHNlIGlmIChwRmFsc2VBbG1DbnQtPkNudF9hbGwgPCA1MDApCi0JCQkJQ3VycmVudElHSSA9IEN1cnJlbnRJR0kgLSAxOy8qIHBETV9EaWdUYWJsZS0+Q3VySUdWYWx1ZSA9IHBETV9EaWdUYWJsZS0+UHJlSUdWYWx1ZS0xOyAqLwotCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIm9kbV9ESUcyM2EoKTogRW5nbGFuZCBESUcgXG4iKSk7Ci0JCX0KLQl9Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIm9kbV9ESUcyM2EoKTogRElHIEVuZCBBZGp1c3QgSUdJXG4iKSk7Ci0JLyogMSBDaGVjayBpbml0aWFsIGdhaW4gYnkgdXBwZXIvbG93ZXIgYm91bmQgKi8KLQlpZiAoQ3VycmVudElHSSA+IHBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9tYXgpCi0JCUN1cnJlbnRJR0kgPSBwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWF4OwotCWlmIChDdXJyZW50SUdJIDwgcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21pbikKLQkJQ3VycmVudElHSSA9IHBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9taW47Ci0KLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgib2RtX0RJRzIzYSgpOiByeF9nYWluX3JhbmdlX21heCA9IDB4JXgsIHJ4X2dhaW5fcmFuZ2VfbWluID0gMHgleFxuIiwKLQkJcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21heCwgcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21pbikpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwgKCJvZG1fRElHMjNhKCk6IFRvdGFsRkEgPSVkXG4iLCBwRmFsc2VBbG1DbnQtPkNudF9hbGwpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgib2RtX0RJRzIzYSgpOiBDdXJJR1ZhbHVlID0gMHgleFxuIiwgQ3VycmVudElHSSkpOwotCi0JLyogMiBIaWdoIHBvd2VyIFJTU0kgdGhyZXNob2xkICovCi0KLQlPRE1fV3JpdGVfRElHMjNhKHBETV9PZG0sIEN1cnJlbnRJR0kpOy8qIE9ETV9Xcml0ZV9ESUcyM2EocERNX09kbSwgcERNX0RpZ1RhYmxlLT5DdXJJR1ZhbHVlKTsgKi8KLQlwRE1fRGlnVGFibGUtPmJNZWRpYUNvbm5lY3RfMCA9IHBETV9PZG0tPmJMaW5rZWQ7Ci0JcERNX0RpZ1RhYmxlLT5ESUdfRHluYW1pY19NSU5fMCA9IERJR19EeW5hbWljX01JTjsKLX0KLQotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgRkFTTEUgQUxBUk0gQ0hFQ0sgKi8KLS8qIDMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLXZvaWQgb2RtX0ZhbHNlQWxhcm1Db3VudGVyU3RhdGlzdGljczIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQlzdHJ1Y3QgZmFsc2VfYWxhcm1fc3RhdHMgKkZhbHNlQWxtQ250ID0gJnBETV9PZG0tPkZhbHNlQWxtQ250OwotCXUzMiByZXRfdmFsdWUsIHZhbDMyOwotCi0JLyogaG9sZCBvZmRtIGNvdW50ZXIgKi8KLQkvKiBob2xkIHBhZ2UgQyBjb3VudGVyICovCi0JdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9IT0xEQ18xMU4pOwotCXZhbDMyIHw9IEJJVCgzMSk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX0hPTERDXzExTiwgdmFsMzIpOwotCS8qIGhvbGQgcGFnZSBEIGNvdW50ZXIgKi8KLQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOKTsKLQl2YWwzMiB8PSBCSVQoMzEpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1REXzExTiwgdmFsMzIpOwotCXJldF92YWx1ZSA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1RZUEUxXzExTik7Ci0JRmFsc2VBbG1DbnQtPkNudF9GYXN0X0ZzeW5jID0gKHJldF92YWx1ZSYweGZmZmYpOwotCUZhbHNlQWxtQ250LT5DbnRfU0JfU2VhcmNoX2ZhaWwgPSAocmV0X3ZhbHVlICYgMHhmZmZmMDAwMCk+PjE2OwotCXJldF92YWx1ZSA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1RZUEUyXzExTik7Ci0JRmFsc2VBbG1DbnQtPkNudF9PRkRNX0NDQSA9IChyZXRfdmFsdWUmMHhmZmZmKTsKLQlGYWxzZUFsbUNudC0+Q250X1Bhcml0eV9GYWlsID0gKHJldF92YWx1ZSAmIDB4ZmZmZjAwMDApPj4xNjsKLQlyZXRfdmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9UWVBFM18xMU4pOwotCUZhbHNlQWxtQ250LT5DbnRfUmF0ZV9JbGxlZ2FsID0gKHJldF92YWx1ZSYweGZmZmYpOwotCUZhbHNlQWxtQ250LT5DbnRfQ3JjOF9mYWlsID0gKHJldF92YWx1ZSAmIDB4ZmZmZjAwMDApPj4xNjsKLQlyZXRfdmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9UWVBFNF8xMU4pOwotCUZhbHNlQWxtQ250LT5DbnRfTWNzX2ZhaWwgPSAocmV0X3ZhbHVlJjB4ZmZmZik7Ci0KLQlGYWxzZUFsbUNudC0+Q250X09mZG1fZmFpbCA9IEZhbHNlQWxtQ250LT5DbnRfUGFyaXR5X0ZhaWwgKwotCQlGYWxzZUFsbUNudC0+Q250X1JhdGVfSWxsZWdhbCArCi0JCUZhbHNlQWxtQ250LT5DbnRfQ3JjOF9mYWlsICsKLQkJRmFsc2VBbG1DbnQtPkNudF9NY3NfZmFpbCArCi0JCUZhbHNlQWxtQ250LT5DbnRfRmFzdF9Gc3luYyArCi0JCUZhbHNlQWxtQ250LT5DbnRfU0JfU2VhcmNoX2ZhaWw7Ci0JLyogaG9sZCBjY2sgY291bnRlciAqLwotCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX0NDS19GQV9SU1RfMTFOKTsKLQl2YWwzMiB8PSAoQklUKDEyKSB8IEJJVCgxNCkpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfQ0NLX0ZBX1JTVF8xMU4sIHZhbDMyKTsKLQotCXJldF92YWx1ZSA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19DQ0tfRkFfTFNCXzExTikgJiAweGZmOwotCUZhbHNlQWxtQ250LT5DbnRfQ2NrX2ZhaWwgPSByZXRfdmFsdWU7Ci0JcmV0X3ZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX0NDS19GQV9NU0JfMTFOKSA+PiAxNjsKLQlGYWxzZUFsbUNudC0+Q250X0Nja19mYWlsICs9IChyZXRfdmFsdWUgJiAweGZmMDApOwotCi0JcmV0X3ZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX0NDS19DQ0FfQ05UXzExTik7Ci0JRmFsc2VBbG1DbnQtPkNudF9DQ0tfQ0NBID0KLQkJKChyZXRfdmFsdWUmMHhGRik8PDgpIHwgKChyZXRfdmFsdWUmMHhGRjAwKT4+OCk7Ci0KLQlGYWxzZUFsbUNudC0+Q250X2FsbCA9IChGYWxzZUFsbUNudC0+Q250X0Zhc3RfRnN5bmMgKwotCQkJCUZhbHNlQWxtQ250LT5DbnRfU0JfU2VhcmNoX2ZhaWwgKwotCQkJCUZhbHNlQWxtQ250LT5DbnRfUGFyaXR5X0ZhaWwgKwotCQkJCUZhbHNlQWxtQ250LT5DbnRfUmF0ZV9JbGxlZ2FsICsKLQkJCQlGYWxzZUFsbUNudC0+Q250X0NyYzhfZmFpbCArCi0JCQkJRmFsc2VBbG1DbnQtPkNudF9NY3NfZmFpbCArCi0JCQkJRmFsc2VBbG1DbnQtPkNudF9DY2tfZmFpbCk7Ci0KLQlGYWxzZUFsbUNudC0+Q250X0NDQV9hbGwgPQotCQlGYWxzZUFsbUNudC0+Q250X09GRE1fQ0NBICsgRmFsc2VBbG1DbnQtPkNudF9DQ0tfQ0NBOwotCi0JaWYgKHBETV9PZG0tPlN1cHBvcnRJQ1R5cGUgPj0gT0RNX1JUTDg3MjNBKSB7Ci0JCS8qIHJlc2V0IGZhbHNlIGFsYXJtIGNvdW50ZXIgcmVnaXN0ZXJzICovCi0JCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNUQ18xMU4pOwotCQl2YWwzMiB8PSBCSVQoMzEpOwotCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNUQ18xMU4sIHZhbDMyKTsKLQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1RDXzExTik7Ci0JCXZhbDMyICY9IH5CSVQoMzEpOwotCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNUQ18xMU4sIHZhbDMyKTsKLQotCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOKTsKLQkJdmFsMzIgfD0gQklUKDI3KTsKLQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOLCB2YWwzMik7Ci0JCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNURF8xMU4pOwotCQl2YWwzMiAmPSB+QklUKDI3KTsKLQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOLCB2YWwzMik7Ci0KLQkJLyogdXBkYXRlIG9mZG0gY291bnRlciAqLwotCQkgLyogdXBkYXRlIHBhZ2UgQyBjb3VudGVyICovCi0JCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfSE9MRENfMTFOKTsKLQkJdmFsMzIgJj0gfkJJVCgzMSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9IT0xEQ18xMU4sIHZhbDMyKTsKLQotCQkgLyogdXBkYXRlIHBhZ2UgRCBjb3VudGVyICovCi0JCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNURF8xMU4pOwotCQl2YWwzMiAmPSB+QklUKDMxKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOLCB2YWwzMik7Ci0KLQkJLyogcmVzZXQgQ0NLIENDQSBjb3VudGVyICovCi0JCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX0NDS19GQV9SU1RfMTFOKTsKLQkJdmFsMzIgJj0gfihCSVQoMTIpIHwgQklUKDEzKSB8IEJJVCgxNCkgfCBCSVQoMTUpKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19DQ0tfRkFfUlNUXzExTiwgdmFsMzIpOwotCi0JCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX0NDS19GQV9SU1RfMTFOKTsKLQkJdmFsMzIgfD0gKEJJVCgxMykgfCBCSVQoMTUpKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19DQ0tfRkFfUlNUXzExTiwgdmFsMzIpOwotCX0KLQotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9GQV9DTlQsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIkVudGVyIG9kbV9GYWxzZUFsYXJtQ291bnRlclN0YXRpc3RpY3MyM2FcbiIpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRkFfQ05ULCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCJDbnRfRmFzdF9Gc3luYyA9JWQsIENudF9TQl9TZWFyY2hfZmFpbCA9JWRcbiIsCi0JCSAgICAgIEZhbHNlQWxtQ250LT5DbnRfRmFzdF9Gc3luYywKLQkJICAgICAgRmFsc2VBbG1DbnQtPkNudF9TQl9TZWFyY2hfZmFpbCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9GQV9DTlQsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIkNudF9QYXJpdHlfRmFpbCA9JWQsIENudF9SYXRlX0lsbGVnYWwgPSVkXG4iLAotCQkgICAgICBGYWxzZUFsbUNudC0+Q250X1Bhcml0eV9GYWlsLAotCQkgICAgICBGYWxzZUFsbUNudC0+Q250X1JhdGVfSWxsZWdhbCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9GQV9DTlQsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIkNudF9DcmM4X2ZhaWwgPSVkLCBDbnRfTWNzX2ZhaWwgPSVkXG4iLAotCQkgICAgICBGYWxzZUFsbUNudC0+Q250X0NyYzhfZmFpbCwgRmFsc2VBbG1DbnQtPkNudF9NY3NfZmFpbCkpOwotCi0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0ZBX0NOVCwgT0RNX0RCR19MT1VELAotCQkgICAgICgiQ250X0Nja19mYWlsID0lZFxuIiwgRmFsc2VBbG1DbnQtPkNudF9DY2tfZmFpbCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9GQV9DTlQsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIkNudF9PZmRtX2ZhaWwgPSVkXG4iLCBGYWxzZUFsbUNudC0+Q250X09mZG1fZmFpbCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9GQV9DTlQsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIlRvdGFsIEZhbHNlIEFsYXJtID0lZFxuIiwgRmFsc2VBbG1DbnQtPkNudF9hbGwpKTsKLX0KLQotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgQ0NLIFBhY2tldCBEZXRlY3QgVGhyZXNob2xkICovCi0vKiAzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi12b2lkIG9kbV9DQ0tQYWNrZXREZXRlY3Rpb25UaHJlc2gyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBmYWxzZV9hbGFybV9zdGF0cyAqRmFsc2VBbG1DbnQgPSAmcERNX09kbS0+RmFsc2VBbG1DbnQ7Ci0JdTggQ3VyQ0NLX0NDQVRocmVzOwotCi0JaWYgKHBETV9PZG0tPkV4dExOQSkKLQkJcmV0dXJuOwotCi0JaWYgKHBETV9PZG0tPmJMaW5rZWQpIHsKLQkJaWYgKHBETV9PZG0tPlJTU0lfTWluID4gMjUpIHsKLQkJCUN1ckNDS19DQ0FUaHJlcyA9IDB4Y2Q7Ci0JCX0gZWxzZSBpZiAocERNX09kbS0+UlNTSV9NaW4gPD0gMjUgJiYgcERNX09kbS0+UlNTSV9NaW4gPiAxMCkgewotCQkJQ3VyQ0NLX0NDQVRocmVzID0gMHg4MzsKLQkJfSBlbHNlIHsKLQkJCWlmIChGYWxzZUFsbUNudC0+Q250X0Nja19mYWlsID4gMTAwMCkKLQkJCQlDdXJDQ0tfQ0NBVGhyZXMgPSAweDgzOwotCQkJZWxzZQotCQkJCUN1ckNDS19DQ0FUaHJlcyA9IDB4NDA7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoRmFsc2VBbG1DbnQtPkNudF9DY2tfZmFpbCA+IDEwMDApCi0JCQlDdXJDQ0tfQ0NBVGhyZXMgPSAweDgzOwotCQllbHNlCi0JCQlDdXJDQ0tfQ0NBVGhyZXMgPSAweDQwOwotCX0KLQotCU9ETV9Xcml0ZV9DQ0tfQ0NBX1RocmVzMjNhKHBETV9PZG0sIEN1ckNDS19DQ0FUaHJlcyk7Ci19Ci0KLXZvaWQgT0RNX1dyaXRlX0NDS19DQ0FfVGhyZXMyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1OCBDdXJDQ0tfQ0NBVGhyZXMpCi17Ci0Jc3RydWN0IGRpZ190ICpwRE1fRGlnVGFibGUgPSAmcERNX09kbS0+RE1fRGlnVGFibGU7Ci0KLQlpZiAocERNX0RpZ1RhYmxlLT5DdXJDQ0tfQ0NBVGhyZXMgIT0gQ3VyQ0NLX0NDQVRocmVzKQotCQlydGw4NzIzYXVfd3JpdGU4KHBETV9PZG0tPkFkYXB0ZXIsIE9ETV9SRUcoQ0NLX0NDQSwgcERNX09kbSksCi0JCQkJIEN1ckNDS19DQ0FUaHJlcyk7Ci0JcERNX0RpZ1RhYmxlLT5QcmVDQ0tfQ0NBVGhyZXMgPSBwRE1fRGlnVGFibGUtPkN1ckNDS19DQ0FUaHJlczsKLQlwRE1fRGlnVGFibGUtPkN1ckNDS19DQ0FUaHJlcyA9IEN1ckNDS19DQ0FUaHJlczsKLX0KLQotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgQkIgUG93ZXIgU2F2ZSAqLwotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXZvaWQgb2RtMjNhX0R5bkJCUFNJbml0KHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQlzdHJ1Y3QgZHluYW1pY19wd3Jfc2F2ICpwRE1fUFNUYWJsZSA9ICZwRE1fT2RtLT5ETV9QU1RhYmxlOwotCi0JcERNX1BTVGFibGUtPlByZUNDQVN0YXRlID0gQ0NBX01BWDsKLQlwRE1fUFNUYWJsZS0+Q3VyQ0NBU3RhdGUgPSBDQ0FfTUFYOwotCXBETV9QU1RhYmxlLT5QcmVSRlN0YXRlID0gUkZfTUFYOwotCXBETV9QU1RhYmxlLT5DdXJSRlN0YXRlID0gUkZfTUFYOwotCXBETV9QU1RhYmxlLT5Sc3NpX3ZhbF9taW4gPSAwOwotCXBETV9QU1RhYmxlLT5pbml0aWFsaXplID0gMDsKLX0KLQotCi12b2lkIE9ETV9SRl9TYXZpbmcyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1OCBiRm9yY2VJbk5vcm1hbCkKLXsKLQlzdHJ1Y3QgZHluYW1pY19wd3Jfc2F2ICpwRE1fUFNUYWJsZSA9ICZwRE1fT2RtLT5ETV9QU1RhYmxlOwotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0JdTMyIHZhbDMyOwotCXU4IFJzc2lfVXBfYm91bmQgPSAzMDsKLQl1OCBSc3NpX0xvd19ib3VuZCA9IDI1OwotCWlmIChwRE1fUFNUYWJsZS0+aW5pdGlhbGl6ZSA9PSAwKSB7Ci0KLQkJcERNX1BTVGFibGUtPlJlZzg3NCA9Ci0JCQlydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODc0KSAmIDB4MUNDMDAwOwotCQlwRE1fUFNUYWJsZS0+UmVnQzcwID0KLQkJCXJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHhjNzApICYgQklUKDMpOwotCQlwRE1fUFNUYWJsZS0+UmVnODVDID0KLQkJCXJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NWMpICYgMHhGRjAwMDAwMDsKLQkJcERNX1BTVGFibGUtPlJlZ0E3NCA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHhhNzQpICYgMHhGMDAwOwotCQlwRE1fUFNUYWJsZS0+aW5pdGlhbGl6ZSA9IDE7Ci0JfQotCi0JaWYgKCFiRm9yY2VJbk5vcm1hbCkgewotCQlpZiAocERNX09kbS0+UlNTSV9NaW4gIT0gMHhGRikgewotCQkJaWYgKHBETV9QU1RhYmxlLT5QcmVSRlN0YXRlID09IFJGX05vcm1hbCkgewotCQkJCWlmIChwRE1fT2RtLT5SU1NJX01pbiA+PSBSc3NpX1VwX2JvdW5kKQotCQkJCQlwRE1fUFNUYWJsZS0+Q3VyUkZTdGF0ZSA9IFJGX1NhdmU7Ci0JCQkJZWxzZQotCQkJCQlwRE1fUFNUYWJsZS0+Q3VyUkZTdGF0ZSA9IFJGX05vcm1hbDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHBETV9PZG0tPlJTU0lfTWluIDw9IFJzc2lfTG93X2JvdW5kKQotCQkJCQlwRE1fUFNUYWJsZS0+Q3VyUkZTdGF0ZSA9IFJGX05vcm1hbDsKLQkJCQllbHNlCi0JCQkJCXBETV9QU1RhYmxlLT5DdXJSRlN0YXRlID0gUkZfU2F2ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXBETV9QU1RhYmxlLT5DdXJSRlN0YXRlID0gUkZfTUFYOwotCQl9Ci0JfSBlbHNlIHsKLQkJcERNX1BTVGFibGUtPkN1clJGU3RhdGUgPSBSRl9Ob3JtYWw7Ci0JfQotCi0JaWYgKHBETV9QU1RhYmxlLT5QcmVSRlN0YXRlICE9IHBETV9QU1RhYmxlLT5DdXJSRlN0YXRlKSB7Ci0JCWlmIChwRE1fUFNUYWJsZS0+Q3VyUkZTdGF0ZSA9PSBSRl9TYXZlKSB7Ci0JCQkvKiAgPHR5bmxpX25vdGU+IDg3MjMgUlNTSSByZXBvcnQgd2lsbCBiZSB3cm9uZy4KLQkJCSAqIFNldCAweDg3NFs1XT0gMSB3aGVuIGVudGVyIEJCIHBvd2VyIHNhdmluZyBtb2RlLiAqLwotCQkJLyogIFN1Z2dlc3RlZCBieSBTRDMgWXUtTmFuLiAyMDExLjAxLjIwLiAqLwotCQkJLyogUmVnODc0WzVdPSAxYicxICovCi0JCQlpZiAocERNX09kbS0+U3VwcG9ydElDVHlwZSA9PSBPRE1fUlRMODcyM0EpIHsKLQkJCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NzQpOwotCQkJCXZhbDMyIHw9IEJJVCg1KTsKLQkJCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCAweDg3NCwgdmFsMzIpOwotCQkJfQotCQkJLyogUmVnODc0WzIwOjE4XT0gMydiMDEwICovCi0JCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NzQpOwotCQkJdmFsMzIgJj0gfihCSVQoMTgpIHwgQklUKDIwKSk7Ci0JCQl2YWwzMiB8PSBCSVQoMTkpOwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4NzQsIHZhbDMyKTsKLQkJCS8qIFJlZ0M3MFszXT0gMSdiMCAqLwotCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4YzcwKTsKLQkJCXZhbDMyICY9IH5CSVQoMyk7Ci0JCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCAweGM3MCwgdmFsMzIpOwotCQkJLyogUmVnODVDWzMxOjI0XT0gMHg2MyAqLwotCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODVjKTsKLQkJCXZhbDMyICY9IDB4MDBmZmZmZmY7Ci0JCQl2YWwzMiB8PSAweDYzMDAwMDAwOwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4NWMsIHZhbDMyKTsKLQkJCS8qIFJlZzg3NFsxNToxNF09IDInYjEwICovCi0JCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NzQpOwotCQkJdmFsMzIgJj0gfkJJVCgxNCk7Ci0JCQl2YWwzMiB8PSBCSVQoMTUpOwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4NzQsIHZhbDMyKTsKLQkJCS8qIFJlZ0E3NVs3OjRdPSAweDMgKi8KLQkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweGE3NCk7Ci0JCQl2YWwzMiAmPSB+KEJJVCgxNCkgfCBCSVQoMTUpKTsKLQkJCXZhbDMyIHw9IChCSVQoMTIpIHwgQklUKDEzKSk7Ci0JCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCAweGE3NCwgdmFsMzIpOwotCQkJLyogUmVnODE4WzI4XT0gMSdiMCAqLwotCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODE4KTsKLQkJCXZhbDMyICY9IH5CSVQoMjgpOwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4MTgsIHZhbDMyKTsKLQkJCS8qIFJlZzgxOFsyOF09IDEnYjEgKi8KLQkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDgxOCk7Ci0JCQl2YWwzMiB8PSBCSVQoMjgpOwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4MTgsIHZhbDMyKTsKLQkJfSBlbHNlIHsKLQkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDg3NCk7Ci0JCQl2YWwzMiB8PSBwRE1fUFNUYWJsZS0+UmVnODc0OwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4NzQsIHZhbDMyKTsKLQotCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4YzcwKTsKLQkJCXZhbDMyIHw9IHBETV9QU1RhYmxlLT5SZWdDNzA7Ci0JCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCAweGM3MCwgdmFsMzIpOwotCi0JCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NWMpOwotCQkJdmFsMzIgfD0gcERNX1BTVGFibGUtPlJlZzg1QzsKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODVjLCB2YWwzMik7Ci0KLQkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweGE3NCk7Ci0JCQl2YWwzMiB8PSBwRE1fUFNUYWJsZS0+UmVnQTc0OwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHhhNzQsIHZhbDMyKTsKLQotCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODE4KTsKLQkJCXZhbDMyICY9IH5CSVQoMjgpOwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4MTgsIHZhbDMyKTsKLQotCQkJLyogUmVnODc0WzVdPSAxYicwICovCi0JCQlpZiAocERNX09kbS0+U3VwcG9ydElDVHlwZSA9PSBPRE1fUlRMODcyM0EpIHsKLQkJCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NzQpOwotCQkJCXZhbDMyICY9IH5CSVQoNSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4NzQsIHZhbDMyKTsKLQkJCX0KLQkJfQotCQlwRE1fUFNUYWJsZS0+UHJlUkZTdGF0ZSA9IHBETV9QU1RhYmxlLT5DdXJSRlN0YXRlOwotCX0KLX0KLQotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgUkFUUiBNQVNLICovCi0vKiAzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgUmF0ZSBBZGFwdGl2ZSAqLwotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotdm9pZCBvZG1fUmF0ZUFkYXB0aXZlTWFza0luaXQyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBvZG1fcmF0ZV9hZGFwdCAqcE9kbVJBID0gJnBETV9PZG0tPlJhdGVBZGFwdGl2ZTsKLQotCXBPZG1SQS0+VHlwZSA9IERNX1R5cGVfQnlEcml2ZXI7Ci0KLQlwT2RtUkEtPlJBVFJTdGF0ZSA9IERNX1JBVFJfU1RBX0lOSVQ7Ci0JcE9kbVJBLT5IaWdoUlNTSVRocmVzaCA9IDUwOwotCXBPZG1SQS0+TG93UlNTSVRocmVzaCA9IDIwOwotfQotCi11MzIgT0RNX0dldF9SYXRlX0JpdG1hcDIzYShzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhLCB1MzIgbWFjaWQsCi0JCQkgICB1MzIgcmFfbWFzaywgdTggcnNzaV9sZXZlbCkKLXsKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0gPSAmcEhhbERhdGEtPm9kbXByaXY7Ci0Jc3RydWN0IHN0YV9pbmZvICpwRW50cnk7Ci0JdTMyIHJhdGVfYml0bWFwID0gMHgwZmZmZmZmZjsKLQl1OCBXaXJlbGVzc01vZGU7Ci0KLQlwRW50cnkgPSBwRE1fT2RtLT5wT0RNX1N0YUluZm9bbWFjaWRdOwotCWlmICghcEVudHJ5KQotCQlyZXR1cm4gcmFfbWFzazsKLQotCVdpcmVsZXNzTW9kZSA9IHBFbnRyeS0+d2lyZWxlc3NfbW9kZTsKLQotCXN3aXRjaCAoV2lyZWxlc3NNb2RlKSB7Ci0JY2FzZSBPRE1fV01fQjoKLQkJaWYgKHJhX21hc2sgJiAweDAwMDAwMDBjKQkJLyogMTFNIG9yIDUuNU0gZW5hYmxlICovCi0JCQlyYXRlX2JpdG1hcCA9IDB4MDAwMDAwMGQ7Ci0JCWVsc2UKLQkJCXJhdGVfYml0bWFwID0gMHgwMDAwMDAwZjsKLQkJYnJlYWs7Ci0JY2FzZSAoT0RNX1dNX0F8T0RNX1dNX0cpOgotCQlpZiAocnNzaV9sZXZlbCA9PSBETV9SQVRSX1NUQV9ISUdIKQotCQkJcmF0ZV9iaXRtYXAgPSAweDAwMDAwZjAwOwotCQllbHNlCi0JCQlyYXRlX2JpdG1hcCA9IDB4MDAwMDBmZjA7Ci0JCWJyZWFrOwotCWNhc2UgKE9ETV9XTV9CfE9ETV9XTV9HKToKLQkJaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfSElHSCkKLQkJCXJhdGVfYml0bWFwID0gMHgwMDAwMGYwMDsKLQkJZWxzZSBpZiAocnNzaV9sZXZlbCA9PSBETV9SQVRSX1NUQV9NSURETEUpCi0JCQlyYXRlX2JpdG1hcCA9IDB4MDAwMDBmZjA7Ci0JCWVsc2UKLQkJCXJhdGVfYml0bWFwID0gMHgwMDAwMGZmNTsKLQkJYnJlYWs7Ci0JY2FzZSAoT0RNX1dNX0J8T0RNX1dNX0d8T0RNX1dNX04yNEcpOgotCWNhc2UgKE9ETV9XTV9BfE9ETV9XTV9CfE9ETV9XTV9HfE9ETV9XTV9OMjRHKToKLQkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzFUMlIgfHwKLQkJICAgIHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzFUMVIpIHsKLQkJCWlmIChyc3NpX2xldmVsID09IERNX1JBVFJfU1RBX0hJR0gpIHsKLQkJCQlyYXRlX2JpdG1hcCA9IDB4MDAwZjAwMDA7Ci0JCQl9IGVsc2UgaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfTUlERExFKSB7Ci0JCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGZmMDAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocEhhbERhdGEtPkN1cnJlbnRDaGFubmVsQlcgPT0KLQkJCQkgICAgSFRfQ0hBTk5FTF9XSURUSF80MCkKLQkJCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGZmMDE1OwotCQkJCWVsc2UKLQkJCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGZmMDA1OwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfSElHSCkgewotCQkJCXJhdGVfYml0bWFwID0gMHgwZjhmMDAwMDsKLQkJCX0gZWxzZSBpZiAocnNzaV9sZXZlbCA9PSBETV9SQVRSX1NUQV9NSURETEUpIHsKLQkJCQlyYXRlX2JpdG1hcCA9IDB4MGY4ZmYwMDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwSGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVyA9PQotCQkJCSAgICBIVF9DSEFOTkVMX1dJRFRIXzQwKQotCQkJCQlyYXRlX2JpdG1hcCA9IDB4MGY4ZmYwMTU7Ci0JCQkJZWxzZQotCQkJCQlyYXRlX2JpdG1hcCA9IDB4MGY4ZmYwMDU7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogY2FzZSBXSVJFTEVTU18xMV8yNE46ICovCi0JCS8qIGNhc2UgV0lSRUxFU1NfMTFfNU46ICovCi0JCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8xVDJSKQotCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGZmZmZmOwotCQllbHNlCi0JCQlyYXRlX2JpdG1hcCA9IDB4MGZmZmZmZmY7Ci0JCWJyZWFrOwotCX0KLQotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9SQV9NQVNLLCBPRE1fREJHX0xPVUQsCi0JKCIgPT0+IHJzc2lfbGV2ZWw6MHglMDJ4LCBXaXJlbGVzc01vZGU6MHglMDJ4LCByYXRlX2JpdG1hcDoweCUwOHggXG4iLAotCSByc3NpX2xldmVsLCBXaXJlbGVzc01vZGUsIHJhdGVfYml0bWFwKSk7Ci0KLQlyZXR1cm4gcmF0ZV9iaXRtYXA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOglvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2soKQotICoKLSAqIE92ZXJ2aWV3OglVcGRhdGUgcmF0ZSB0YWJsZSBtYXNrIGFjY29yZGluZyB0byByc3NpCi0gKgotICogSW5wdXQ6CQlOT05FCi0gKgotICogT3V0cHV0OgkJTk9ORQotICoKLSAqIFJldHVybjoJCU5PTkUKLSAqCi0gKiBSZXZpc2VkIEhpc3Rvcnk6Ci0gKldoZW4JCVdobwkJUmVtYXJrCi0gKjA1LzI3LzIwMDkJaHBmYW4JQ3JlYXRlIFZlcnNpb24gMC4KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2soc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXUzMiBzbW9vdGhlZDsKLQl1OCBpOwotCi0JaWYgKHBBZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkgewotCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfUkFfTUFTSywgT0RNX0RCR19UUkFDRSwKLQkJCSAgICAgKCI8LS0tLSAlczogZHJpdmVyIGlzIGdvaW5nIHRvIHVubG9hZFxuIiwKLQkJCSAgICAgIF9fZnVuY19fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgT0RNX0FTU09DSUFURV9FTlRSWV9OVU07IGkrKykgewotCQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGF0ID0gcERNX09kbS0+cE9ETV9TdGFJbmZvW2ldOwotCQlpZiAocHN0YXQpIHsKLQkJCXNtb290aGVkID0gcHN0YXQtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQkJCWlmIChPRE1fUkFTdGF0ZUNoZWNrMjNhKHBETV9PZG0sIHNtb290aGVkLCBmYWxzZSwKLQkJCQkJCSZwc3RhdC0+cnNzaV9sZXZlbCkpIHsKLQkJCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfUkFfTUFTSywKLQkJCQkJICAgICBPRE1fREJHX0xPVUQsCi0JCQkJCSAgICAgKCJSU1NJOiVkLCBSU1NJX0xFVkVMOiVkXG4iLAotCQkJCQkgICAgICBzbW9vdGhlZCwKLQkJCQkJICAgICAgcHN0YXQtPnJzc2lfbGV2ZWwpKTsKLQkJCQlydHdfaGFsX3VwZGF0ZV9yYV9tYXNrMjNhKHBzdGF0LAotCQkJCQkJCSAgcHN0YXQtPnJzc2lfbGV2ZWwpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKiAgUmV0dXJuIFZhbHVlOiBib29sICovCi0vKiAgLSB0cnVlOiBSQVRSU3RhdGUgaXMgY2hhbmdlZC4gKi8KLWJvb2wgT0RNX1JBU3RhdGVDaGVjazIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHMzMiBSU1NJLCBib29sIGJGb3JjZVVwZGF0ZSwKLQkJCSB1OCAqcFJBVFJTdGF0ZSkKLXsKLQlzdHJ1Y3Qgb2RtX3JhdGVfYWRhcHQgKnBSQSA9ICZwRE1fT2RtLT5SYXRlQWRhcHRpdmU7Ci0JY29uc3QgdTggR29VcEdhcCA9IDU7Ci0JdTggSGlnaFJTU0lUaHJlc2hGb3JSQSA9IHBSQS0+SGlnaFJTU0lUaHJlc2g7Ci0JdTggTG93UlNTSVRocmVzaEZvclJBID0gcFJBLT5Mb3dSU1NJVGhyZXNoOwotCXU4IFJBVFJTdGF0ZTsKLQotCS8qICBUaHJlc2hvbGQgQWRqdXN0bWVudDogKi8KLQkvKiAgd2hlbiBSU1NJIHN0YXRlIHRyZW5kcyB0byBnbyB1cCBvbmUgb3IgdHdvIGxldmVscywgbWFrZSBzdXJlIFJTU0kgaXMgaGlnaCBlbm91Z2guICovCi0JLyogIEhlcmUgR29VcEdhcCBpcyBhZGRlZCB0byBzb2x2ZSB0aGUgYm91bmRhcnkncyBsZXZlbCBhbHRlcm5hdGlvbiBpc3N1ZS4gKi8KLQlzd2l0Y2ggKCpwUkFUUlN0YXRlKSB7Ci0JY2FzZSBETV9SQVRSX1NUQV9JTklUOgotCWNhc2UgRE1fUkFUUl9TVEFfSElHSDoKLQkJYnJlYWs7Ci0JY2FzZSBETV9SQVRSX1NUQV9NSURETEU6Ci0JCUhpZ2hSU1NJVGhyZXNoRm9yUkEgKz0gR29VcEdhcDsKLQkJYnJlYWs7Ci0JY2FzZSBETV9SQVRSX1NUQV9MT1c6Ci0JCUhpZ2hSU1NJVGhyZXNoRm9yUkEgKz0gR29VcEdhcDsKLQkJTG93UlNTSVRocmVzaEZvclJBICs9IEdvVXBHYXA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU9ETV9SVF9BU1NFUlQocERNX09kbSwgZmFsc2UsICgid3JvbmcgcnNzaSBsZXZlbCBzZXR0aW5nICVkICEiLAotCQkJCQkgICAgICAgKnBSQVRSU3RhdGUpKTsKLQkJYnJlYWs7Ci0JfQotCi0JLyogIERlY2lkZSBSQVRSU3RhdGUgYnkgUlNTSS4gKi8KLQlpZiAoUlNTSSA+IEhpZ2hSU1NJVGhyZXNoRm9yUkEpCi0JCVJBVFJTdGF0ZSA9IERNX1JBVFJfU1RBX0hJR0g7Ci0JZWxzZSBpZiAoUlNTSSA+IExvd1JTU0lUaHJlc2hGb3JSQSkKLQkJUkFUUlN0YXRlID0gRE1fUkFUUl9TVEFfTUlERExFOwotCWVsc2UKLQkJUkFUUlN0YXRlID0gRE1fUkFUUl9TVEFfTE9XOwotCi0JaWYgKCpwUkFUUlN0YXRlICE9IFJBVFJTdGF0ZSB8fCBiRm9yY2VVcGRhdGUpIHsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX1JBX01BU0ssIE9ETV9EQkdfTE9VRCwKLQkJCSAgICAgKCJSU1NJIExldmVsICVkIC0+ICVkXG4iLCAqcFJBVFJTdGF0ZSwgUkFUUlN0YXRlKSk7Ci0JCSpwUkFUUlN0YXRlID0gUkFUUlN0YXRlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiAzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogMyBEeW5hbWljIFR4IFBvd2VyICovCi0vKiAzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi12b2lkIG9kbV9EeW5hbWljVHhQb3dlcjIzYUluaXQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCi0JLyoKLQkgKiBUaGlzIGlzIG5ldmVyIGNoYW5nZWQsIHNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIGNsZWFuIHVwIHRoZQotCSAqIGNvZGUgY2hlY2tpbmcgZm9yIGRpZmZlcmVudCB2YWx1ZXMgaW4gcnRsODcyM2FfcmY2MDUyLmMKLQkgKi8KLQlwZG1wcml2LT5EeW5hbWljVHhIaWdoUG93ZXJMdmwgPSBUeEhpZ2hQd3JMZXZlbF9Ob3JtYWw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1GaW5kTWluaW11bVJTU0koc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSA9ICZwSGFsRGF0YS0+b2RtcHJpdjsKLQotCS8qIDEgMS5EZXRlcm1pbmUgdGhlIG1pbmltdW0gUlNTSSAqLwotCi0JaWYgKCFwRE1fT2RtLT5iTGlua2VkICYmICFwZG1wcml2LT5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCKQotCQlwZG1wcml2LT5NaW5VbmRlY29yYXRlZFBXREJGb3JETSA9IDA7Ci0JZWxzZQotCQlwZG1wcml2LT5NaW5VbmRlY29yYXRlZFBXREJGb3JETSA9Ci0JCQlwZG1wcml2LT5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotfQotCi1zdGF0aWMgdm9pZCBvZG1fUlNTSU1vbml0b3JDaGVjayhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2ICpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0JaW50IGk7Ci0JaW50IE1heERCID0gMCwgTWluREIgPSAweGZmOwotCXU4IHN0YV9jbnQgPSAwOwotCXUzMiB0bXBkYjsKLQl1MzIgUFdEQl9yc3NpW05VTV9TVEFdID0gezB9Oy8qIDB+MTVdOk1BQ0lELCBbMTZ+MzFdOlBXREJfcnNzaSAqLwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQotCWlmICghcERNX09kbS0+YkxpbmtlZCkKLQkJcmV0dXJuOwotCi0JZm9yIChpID0gMDsgaSA8IE9ETV9BU1NPQ0lBVEVfRU5UUllfTlVNOyBpKyspIHsKLQkJcHN0YSA9IHBETV9PZG0tPnBPRE1fU3RhSW5mb1tpXTsKLQkJaWYgKHBzdGEpIHsKLQkJCWlmIChwc3RhLT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPCBNaW5EQikKLQkJCQlNaW5EQiA9IHBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQotCQkJaWYgKHBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA+IE1heERCKQotCQkJCU1heERCID0gcHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotCi0JCQlpZiAocHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCICE9IC0xKSB7Ci0JCQkJdG1wZGIgPSBwc3RhLT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0JCQkJUFdEQl9yc3NpW3N0YV9jbnQrK10gPSBwc3RhLT5tYWNfaWQgfAotCQkJCQkodG1wZGIgPDwgMTYpOwotCQkJfQotCQl9Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IHN0YV9jbnQ7IGkrKykgewotCQlpZiAoUFdEQl9yc3NpW2ldICE9ICgwKSkKLQkJCXJ0bDg3MjNhX3NldF9yc3NpX2NtZChBZGFwdGVyLCBQV0RCX3Jzc2lbaV0pOwotCX0KLQotCXBkbXByaXYtPkVudHJ5TWF4VW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSBNYXhEQjsKLQotCWlmIChNaW5EQiAhPSAweGZmKSAvKiAgSWYgYXNzb2NpYXRlZCBlbnRyeSBpcyBmb3VuZCAqLwotCQlwZG1wcml2LT5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gTWluREI7Ci0JZWxzZQotCQlwZG1wcml2LT5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gMDsKLQotCUZpbmRNaW5pbXVtUlNTSShBZGFwdGVyKTsvKiBnZXQgcGRtcHJpdi0+TWluVW5kZWNvcmF0ZWRQV0RCRm9yRE0gKi8KLQotCU9ETV9DbW5JbmZvVXBkYXRlMjNhKCZwSGFsRGF0YS0+b2RtcHJpdiwgT0RNX0NNTklORk9fUlNTSV9NSU4sCi0JCQkgICAgIHBkbXByaXYtPk1pblVuZGVjb3JhdGVkUFdEQkZvckRNKTsKLX0KLQotLyogZW5kaWYgKi8KLS8qIDMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAzIFR4IFBvd2VyIFRyYWNraW5nICovCi0vKiAzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1zdGF0aWMgdm9pZCBvZG1fVFhQb3dlclRyYWNraW5nSW5pdChzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2ICpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0KLQlwZG1wcml2LT5iVFhQb3dlclRyYWNraW5nID0gdHJ1ZTsKLQlwZG1wcml2LT5UWFBvd2VyY291bnQgPSAwOwotCXBkbXByaXYtPmJUWFBvd2VyVHJhY2tpbmdJbml0ID0gZmFsc2U7Ci0JcGRtcHJpdi0+VHhQb3dlclRyYWNrQ29udHJvbCA9IHRydWU7Ci0JTVNHXzg3MjNBKCJwZG1wcml2LT5UeFBvd2VyVHJhY2tDb250cm9sID0gJWRcbiIsCi0JCSAgcGRtcHJpdi0+VHhQb3dlclRyYWNrQ29udHJvbCk7Ci0KLQlwRE1fT2RtLT5SRkNhbGlicmF0ZUluZm8uVHhQb3dlclRyYWNrQ29udHJvbCA9IHRydWU7Ci19Ci0KLS8qIEVEQ0EgVHVyYm8gKi8KLXN0YXRpYyB2b2lkIE9ETV9FZGNhVHVyYm9Jbml0MjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCi0JcERNX09kbS0+RE1fRURDQV9UYWJsZS5iQ3VycmVudFR1cmJvRURDQSA9IGZhbHNlOwotCUFkYXB0ZXItPnJlY3Zwcml2LmJJc0FueU5vbkJFUGt0cyA9IGZhbHNlOwotCi0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIk9yZ2luaWFsIFZPIFBBUkFNOiAweCV4XG4iLAotCQkgICAgICBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIE9ETV9FRENBX1ZPX1BBUkFNKSkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCJPcmdpbmlhbCBWSSBQQVJBTTogMHgleFxuIiwKLQkJICAgICAgcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBPRE1fRURDQV9WSV9QQVJBTSkpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRURDQV9UVVJCTywgT0RNX0RCR19MT1VELAotCQkgICAgICgiT3JnaW5pYWwgQkUgUEFSQU06IDB4JXhcbiIsCi0JCSAgICAgIHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgT0RNX0VEQ0FfQkVfUEFSQU0pKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIk9yZ2luaWFsIEJLIFBBUkFNOiAweCV4XG4iLAotCQkgICAgICBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIE9ETV9FRENBX0JLX1BBUkFNKSkpOwotfQotCi1zdGF0aWMgdm9pZCBvZG1fRWRjYVR1cmJvQ2hlY2syM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmQWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2ID0gJkFkYXB0ZXItPnJlY3Zwcml2OwotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVncHJpdiA9ICZBZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJkFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXUzMiB0cmFmZmljSW5kZXg7Ci0JdTMyIGVkY2FfcGFyYW07Ci0JdTY0IGN1cl90eF9ieXRlczsKLQl1NjQgY3VyX3J4X2J5dGVzOwotCi0JLyogIEZvciBBUC9BRFNMIHVzZSBzdHJ1Y3QgcnRsODcyM2FfcHJpdiAqICovCi0JLyogIEZvciBDRS9OSUMgdXNlIHN0cnVjdCBydHdfYWRhcHRlciAqICovCi0KLQkvKgotCSAqIDIwMTEvMDkvMjkgTUggSW4gSFcgaW50ZWdyYXRpb24gZmlyc3Qgc3RhZ2UsIHdlIHByb3ZpZGUgNAotCSAqIGRpZmZlcmVudCBoYW5kbGUgdG8gb3BlcmF0ZSBhdCB0aGUgc2FtZSB0aW1lLiBJbiB0aGUgc3RhZ2UyLzMsCi0JICogd2UgbmVlZCB0byBwcml2ZSB1bml2ZXJzYWwgaW50ZXJmYWNlIGFuZCBtZXJnZSBhbGwgSFcgZHluYW1pYwotCSAqIG1lY2hhbmlzbS4KLQkgKi8KLQotCWlmICgocHJlZ3ByaXYtPndpZmlfc3BlYyA9PSAxKSkvKiAgKHBtbG1laW5mby0+SFRfZW5hYmxlID09IDApKSAqLwotCQlnb3RvIGRtX0NoZWNrRWRjYVR1cmJvX0VYSVQ7Ci0KLQlpZiAocG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3IgPj0gIEhUX0lPVF9QRUVSX01BWCkKLQkJZ290byBkbV9DaGVja0VkY2FUdXJib19FWElUOwotCi0JaWYgKHJ0bDg3MjNhX0JUX2Rpc2FibGVfRURDQV90dXJibyhBZGFwdGVyKSkKLQkJZ290byBkbV9DaGVja0VkY2FUdXJib19FWElUOwotCi0JLyogIENoZWNrIGlmIHRoZSBzdGF0dXMgbmVlZHMgdG8gYmUgY2hhbmdlZC4gKi8KLQlpZiAoIXByZWN2cHJpdi0+YklzQW55Tm9uQkVQa3RzKSB7Ci0JCWN1cl90eF9ieXRlcyA9IHB4bWl0cHJpdi0+dHhfYnl0ZXMgLSBweG1pdHByaXYtPmxhc3RfdHhfYnl0ZXM7Ci0JCWN1cl9yeF9ieXRlcyA9IHByZWN2cHJpdi0+cnhfYnl0ZXMgLSBwcmVjdnByaXYtPmxhc3RfcnhfYnl0ZXM7Ci0KLQkJLyogdHJhZmZpYywgVFggb3IgUlggKi8KLQkJaWYgKChwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciA9PSBIVF9JT1RfUEVFUl9SQUxJTkspIHx8Ci0JCSAgICAocG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3IgPT0gSFRfSU9UX1BFRVJfQVRIRVJPUykpIHsKLQkJCWlmIChjdXJfdHhfYnl0ZXMgPiAoY3VyX3J4X2J5dGVzIDw8IDIpKSB7Ci0JCQkJLyogIFVwbGluayBUUCBpcyBwcmVzZW50LiAqLwotCQkJCXRyYWZmaWNJbmRleCA9IFVQX0xJTks7Ci0JCQl9IGVsc2UgeyAvKiAgQmFsYW5jZSBUUCBpcyBwcmVzZW50LiAqLwotCQkJCXRyYWZmaWNJbmRleCA9IERPV05fTElOSzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChjdXJfcnhfYnl0ZXMgPiAoY3VyX3R4X2J5dGVzIDw8IDIpKSB7Ci0JCQkJLyogIERvd25saW5rIFRQIGlzIHByZXNlbnQuICovCi0JCQkJdHJhZmZpY0luZGV4ID0gRE9XTl9MSU5LOwotCQkJfSBlbHNlIHsgLyogIEJhbGFuY2UgVFAgaXMgcHJlc2VudC4gKi8KLQkJCQl0cmFmZmljSW5kZXggPSBVUF9MSU5LOwotCQkJfQotCQl9Ci0KLQkJaWYgKChwRE1fT2RtLT5ETV9FRENBX1RhYmxlLnBydl90cmFmZmljX2lkeCAhPSB0cmFmZmljSW5kZXgpIHx8Ci0JCSAgICAoIXBETV9PZG0tPkRNX0VEQ0FfVGFibGUuYkN1cnJlbnRUdXJib0VEQ0EpKSB7Ci0JCQlpZiAoKHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID09IEhUX0lPVF9QRUVSX0NJU0NPKSAmJgotCQkJICAgIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgJiBXSVJFTEVTU18xMV8yNE4pKQotCQkJCWVkY2FfcGFyYW0gPSBFRENBUGFyYW1bcG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3JdW3RyYWZmaWNJbmRleF07Ci0JCQllbHNlCi0JCQkJZWRjYV9wYXJhbSA9IEVEQ0FQYXJhbVtIVF9JT1RfUEVFUl9VTktOT1dOXVt0cmFmZmljSW5kZXhdOwotCQkJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0VEQ0FfQkVfUEFSQU0sCi0JCQkJCSAgZWRjYV9wYXJhbSk7Ci0KLQkJCXBETV9PZG0tPkRNX0VEQ0FfVGFibGUucHJ2X3RyYWZmaWNfaWR4ID0gdHJhZmZpY0luZGV4OwotCQl9Ci0KLQkJcERNX09kbS0+RE1fRURDQV9UYWJsZS5iQ3VycmVudFR1cmJvRURDQSA9IHRydWU7Ci0JfSBlbHNlIHsKLQkJLyogIFR1cm4gT2ZmIEVEQ0EgdHVyYm8gaGVyZS4gKi8KLQkJLyogIFJlc3RvcmUgb3JpZ2luYWwgRURDQSBhY2NvcmRpbmcgdG8gdGhlIGRlY2xhcmF0aW9uIG9mIEFQLiAqLwotCQlpZiAocERNX09kbS0+RE1fRURDQV9UYWJsZS5iQ3VycmVudFR1cmJvRURDQSkgewotCQkJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0VEQ0FfQkVfUEFSQU0sCi0JCQkJCSAgcEhhbERhdGEtPkFjUGFyYW1fQkUpOwotCQkJcERNX09kbS0+RE1fRURDQV9UYWJsZS5iQ3VycmVudFR1cmJvRURDQSA9IGZhbHNlOwotCQl9Ci0JfQotCi1kbV9DaGVja0VkY2FUdXJib19FWElUOgotCS8qICBTZXQgdmFyaWFibGVzIGZvciBuZXh0IHRpbWUuICovCi0JcHJlY3Zwcml2LT5iSXNBbnlOb25CRVBrdHMgPSBmYWxzZTsKLQlweG1pdHByaXYtPmxhc3RfdHhfYnl0ZXMgPSBweG1pdHByaXYtPnR4X2J5dGVzOwotCXByZWN2cHJpdi0+bGFzdF9yeF9ieXRlcyA9IHByZWN2cHJpdi0+cnhfYnl0ZXM7Ci19Ci0KLXUzMiBHZXRQU0REYXRhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdW5zaWduZWQgaW50IHBvaW50LAotCSAgICAgICB1OCBpbml0aWFsX2dhaW5fcHNkKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0JdTMyIHBzZF9yZXBvcnQsIHZhbDMyOwotCi0JLyogU2V0IERDTyBmcmVxdWVuY3kgaW5kZXgsIG9mZnNldCA9ICg0ME1Iei9TYW1wbGVQdHMpKnBvaW50ICovCi0JdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODA4KTsKLQl2YWwzMiAmPSB+MHgzZmY7Ci0JdmFsMzIgfD0gKHBvaW50ICYgMHgzZmYpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODA4LCB2YWwzMik7Ci0KLQkvKiBTdGFydCBQU0QgY2FsY3VsYXRpb24sIFJlZzgwOFsyMl09IDAtPjEgKi8KLQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4MDgpOwotCXZhbDMyIHw9IEJJVCgyMik7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4MDgsIHZhbDMyKTsKLQkvKiBOZWVkIHRvIHdhaXQgZm9yIEhXIFBTRCByZXBvcnQgKi8KLQl1ZGVsYXkoMzApOwotCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDgwOCk7Ci0JdmFsMzIgJj0gfkJJVCgyMik7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4MDgsIHZhbDMyKTsKLQkvKiBSZWFkIFBTRCByZXBvcnQsIFJlZzhCNFsxNTowXSAqLwotCXBzZF9yZXBvcnQgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4OEI0KSAmIDB4MDAwMEZGRkY7Ci0KLQlwc2RfcmVwb3J0ID0gKHUzMikoQ29udmVydFRvX2RCMjNhKHBzZF9yZXBvcnQpKSArCi0JCSh1MzIpKGluaXRpYWxfZ2Fpbl9wc2QtMHgxYyk7Ci0KLQlyZXR1cm4gcHNkX3JlcG9ydDsKLX0KLQotdTMyIENvbnZlcnRUb19kQjIzYSh1MzIgVmFsdWUpCi17Ci0JdTggaTsKLQl1OCBqOwotCXUzMiBkQjsKLQotCVZhbHVlID0gVmFsdWUgJiAweEZGRkY7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWlmIChWYWx1ZSA8PSBkQl9JbnZlcnRfVGFibGVbaV1bMTFdKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPj0gOCkKLQkJcmV0dXJuIDk2OwkvKiAgbWF4aW11bSA5NiBkQiAqLwotCi0JZm9yIChqID0gMDsgaiA8IDEyOyBqKyspIHsKLQkJaWYgKFZhbHVlIDw9IGRCX0ludmVydF9UYWJsZVtpXVtqXSkKLQkJCWJyZWFrOwotCX0KLQotCWRCID0gaSoxMiArIGogKyAxOwotCi0JcmV0dXJuIGRCOwotfQotCi0vKiAgKi8KLS8qICBEZXNjcmlwdGlvbjogKi8KLS8qIFNldCBTaW5nbGUvRHVhbCBBbnRlbm5hIGRlZmF1bHQgc2V0dGluZyBmb3IgcHJvZHVjdHMgdGhhdCBkbyBub3QKLSAqIGRvIGRldGVjdGlvbiBpbiBhZHZhbmNlLiAqLwotLyogICovCi0vKiAgQWRkZWQgYnkgSm9zZXBoLCAyMDEyLjAzLjIyICovCi0vKiAgKi8KLXZvaWQgT0RNX1NpbmdsZUR1YWxBbnRlbm5hRGVmYXVsdFNldHRpbmcoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBzd19hbnRfc3cgKnBETV9TV0FUX1RhYmxlID0gJnBETV9PZG0tPkRNX1NXQVRfVGFibGU7Ci0KLQlwRE1fU1dBVF9UYWJsZS0+QU5UQV9PTiA9IHRydWU7Ci0JcERNX1NXQVRfVGFibGUtPkFOVEJfT04gPSB0cnVlOwotfQotCi0vKiAyIDg3MjNBIEFOVCBERVRFQ1QgKi8KLQotc3RhdGljIHZvaWQgb2RtX1BIWV9TYXZlQUZFUmVnaXN0ZXJzKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyICpBRkVSZWcsCi0JCQkJICAgICB1MzIgKkFGRUJhY2t1cCwgdTMyIFJlZ2lzdGVyTnVtKQotewotCXUzMiBpOwotCi0JZm9yIChpID0gMCA7IGkgPCBSZWdpc3Rlck51bSA7IGkrKykKLQkJQUZFQmFja3VwW2ldID0gcnRsODcyM2F1X3JlYWQzMihwRE1fT2RtLT5BZGFwdGVyLCBBRkVSZWdbaV0pOwotfQotCi1zdGF0aWMgdm9pZCBvZG1fUEhZX1JlbG9hZEFGRVJlZ2lzdGVycyhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiAqQUZFUmVnLAotCQkJCSAgICAgICB1MzIgKkFGRUJhY2t1cCwgdTMyIFJlZ2llc3Rlck51bSkKLXsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDAgOyBpIDwgUmVnaWVzdGVyTnVtOyBpKyspCi0JCXJ0bDg3MjNhdV93cml0ZTMyKHBETV9PZG0tPkFkYXB0ZXIsIEFGRVJlZ1tpXSwgQUZFQmFja3VwW2ldKTsKLX0KLQotLyogMiA4NzIzQSBBTlQgREVURUNUICovCi0vKiAgRGVzY3JpcHRpb246ICovCi0vKiBJbXBsZW1lbnQgSVFLIHNpbmdsZSB0b25lIGZvciBSRiBEUEsgbG9vcGJhY2sgYW5kIEJCIFBTRCBzY2FubmluZy4gKi8KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY29vcGVyYXRlZCB3aXRoIEJCIHRlYW0gTmVpbC4gKi8KLWJvb2wgT0RNX1NpbmdsZUR1YWxBbnRlbm5hRGV0ZWN0aW9uKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTggbW9kZSkKLXsKLQlzdHJ1Y3Qgc3dfYW50X3N3ICpwRE1fU1dBVF9UYWJsZSA9ICZwRE1fT2RtLT5ETV9TV0FUX1RhYmxlOwotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0JdTMyIEN1cnJlbnRDaGFubmVsLCBSZkxvb3BSZWc7Ci0JdTggbjsKLQl1MzIgUmVnODhjLCBSZWdjMDgsIFJlZzg3NCwgUmVnYzUwLCB2YWwzMjsKLQl1OCBpbml0aWFsX2dhaW4gPSAweDVhOwotCXUzMiBQU0RfcmVwb3J0X3RtcDsKLQl1MzIgQW50QV9yZXBvcnQgPSAweDAsIEFudEJfcmVwb3J0ID0gMHgwLCBBbnRPX3JlcG9ydCA9IDB4MDsKLQlib29sIGJSZXN1bHQgPSB0cnVlOwotCXUzMiBBRkVfQmFja3VwWzE2XTsKLQl1MzIgQUZFX1JFR184NzIzQVsxNl0gPSB7Ci0JCXJSeF9XYWl0X0NDQSwgclR4X0NDS19SRk9OLAotCQlyVHhfQ0NLX0JCT04sIHJUeF9PRkRNX1JGT04sCi0JCXJUeF9PRkRNX0JCT04sIHJUeF9Ub19SeCwKLQkJclR4X1RvX1R4LCByUnhfQ0NLLAotCQlyUnhfT0ZETSwgclJ4X1dhaXRfUklGUywKLQkJclJ4X1RPX1J4LCByU3RhbmRieSwKLQkJclNsZWVwLCByUE1QRF9BTkFFTiwKLQkJckZQR0EwX1hDRF9Td2l0Y2hDb250cm9sLCByQmx1ZV9Ub290aH07Ci0KLQlpZiAoIShwRE1fT2RtLT5TdXBwb3J0SUNUeXBlICYgT0RNX1JUTDg3MjNBKSkKLQkJcmV0dXJuIGJSZXN1bHQ7Ci0KLQlpZiAoIShwRE1fT2RtLT5TdXBwb3J0QWJpbGl0eSZPRE1fQkJfQU5UX0RJVikpCi0JCXJldHVybiBiUmVzdWx0OwotCS8qIDEgQmFja3VwIEN1cnJlbnQgUkYvQkIgU2V0dGluZ3MgKi8KLQotCUN1cnJlbnRDaGFubmVsID0gT0RNX0dldFJGUmVnKHBETV9PZG0sIFJGX1BBVEhfQSwgT0RNX0NIQU5ORUwsCi0JCQkJICAgICAgYlJGUmVnT2Zmc2V0TWFzayk7Ci0JUmZMb29wUmVnID0gT0RNX0dldFJGUmVnKHBETV9PZG0sIFJGX1BBVEhfQSwgMHgwMCwgYlJGUmVnT2Zmc2V0TWFzayk7Ci0JLyogIGNoYW5nZSB0byBBbnRlbm5hIEEgKi8KLQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UpOwotCXZhbDMyICY9IH4weDMwMDsKLQl2YWwzMiB8PSAweDEwMDsJCS8qIEVuYWJsZSBhbnRlbm5hIEEgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSwgdmFsMzIpOwotCi0JLyogIFN0ZXAgMTogVVNFIElRSyB0byB0cmFuc21pdHRlciBzaW5nbGUgdG9uZSAqLwotCi0JdWRlbGF5KDEwKTsKLQotCS8qIFN0b3JlIEEgUGF0aCBSZWdpc3RlciA4OGMsIGMwOCwgODc0LCBjNTAgKi8KLQlSZWc4OGMgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXI0KTsKLQlSZWdjMDggPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIHJPRkRNMF9UUk11eFBhcik7Ci0JUmVnODc0ID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByRlBHQTBfWENEX1JGSW50ZXJmYWNlU1cpOwotCVJlZ2M1MCA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgck9GRE0wX1hBQUdDQ29yZTEpOwotCi0JLyogIFN0b3JlIEFGRSBSZWdpc3RlcnMgKi8KLQlvZG1fUEhZX1NhdmVBRkVSZWdpc3RlcnMocERNX09kbSwgQUZFX1JFR184NzIzQSwgQUZFX0JhY2t1cCwgMTYpOwotCi0JLyogU2V0IFBTRCAxMjggcHRzICovCi0JdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIHJGUEdBMF9QU0RGdW5jdGlvbik7Ci0JdmFsMzIgJj0gfihCSVQoMTQpIHwgQklUKDE1KSk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX1BTREZ1bmN0aW9uLCB2YWwzMik7Ci0KLQkvKiAgVG8gU0VUIENIMSB0byBkbyAqLwotCU9ETV9TZXRSRlJlZyhwRE1fT2RtLCBSRl9QQVRIX0EsIE9ETV9DSEFOTkVMLCBiUkZSZWdPZmZzZXRNYXNrLCAweDAxKTsKLQotCS8qICBBRkUgYWxsIG9uIHN0ZXAgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByUnhfV2FpdF9DQ0EsIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJUeF9DQ0tfUkZPTiwgMHg2RkRCMjVBNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclR4X0NDS19CQk9OLCAweDZGREIyNUE0KTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByVHhfT0ZETV9SRk9OLCAweDZGREIyNUE0KTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByVHhfT0ZETV9CQk9OLCAweDZGREIyNUE0KTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByVHhfVG9fUngsIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJUeF9Ub19UeCwgMHg2RkRCMjVBNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclJ4X0NDSywgMHg2RkRCMjVBNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclJ4X09GRE0sIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJSeF9XYWl0X1JJRlMsIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJSeF9UT19SeCwgMHg2RkRCMjVBNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclN0YW5kYnksIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJTbGVlcCwgMHg2RkRCMjVBNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclBNUERfQU5BRU4sIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9YQ0RfU3dpdGNoQ29udHJvbCwgMHg2RkRCMjVBNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckJsdWVfVG9vdGgsIDB4NkZEQjI1QTQpOwotCi0JLyogIDMgd2lyZSBEaXNhYmxlICovCi0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjQsIDB4Q0NGMDAwQzApOwotCi0JLyogQkIgSVFLIFNldHRpbmcgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByT0ZETTBfVFJNdXhQYXIsIDB4MDAwODAwRTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VTVywgMHgyMjIwODAwMCk7Ci0KLQkvKiBJUUsgc2V0dGluZyB0b25lQCA0LjM0TWh6ICovCi0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclR4X0lRS19Ub25lX0EsIDB4MTAwMDhDMUMpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJUeF9JUUssIDB4MDEwMDdjMDApOwotCi0JLyogUGFnZSBCIGluaXQgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByQ29uZmlnX0FudEEsIDB4MDAwODAwMDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJDb25maWdfQW50QSwgMHgwZjYwMDAwMCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclJ4X0lRSywgMHgwMTAwNDgwMCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclJ4X0lRS19Ub25lX0EsIDB4MTAwMDhjMWYpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJUeF9JUUtfUElfQSwgMHg4MjE1MDAwOCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclJ4X0lRS19QSV9BLCAweDI4MTUwMDA4KTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBySVFLX0FHQ19Sc3AsIDB4MDAxMDI4ZDApOwotCi0JLyogUkYgbG9vcCBTZXR0aW5nICovCi0JT0RNX1NldFJGUmVnKHBETV9PZG0sIFJGX1BBVEhfQSwgMHgwLCAweEZGRkZGLCAweDUwMDA4KTsKLQotCS8qIElRSyBTaW5nbGUgdG9uZSBzdGFydCAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9JUUssIDB4ODA4MDAwMDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJJUUtfQUdDX1B0cywgMHhmODAwMDAwMCk7Ci0JdWRlbGF5KDEwMDApOwotCVBTRF9yZXBvcnRfdG1wID0gMHgwOwotCi0JZm9yIChuID0gMDsgbiA8IDI7IG4rKykgewotCQlQU0RfcmVwb3J0X3RtcCA9ICBHZXRQU0REYXRhKHBETV9PZG0sIDE0LCBpbml0aWFsX2dhaW4pOwotCQlpZiAoUFNEX3JlcG9ydF90bXAgPiBBbnRBX3JlcG9ydCkKLQkJCUFudEFfcmVwb3J0ID0gUFNEX3JlcG9ydF90bXA7Ci0JfQotCi0JUFNEX3JlcG9ydF90bXAgPSAweDA7Ci0KLQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UpOwotCXZhbDMyICY9IH4weDMwMDsKLQl2YWwzMiB8PSAweDIwMDsJCS8qIEVuYWJsZSBhbnRlbm5hIEIgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSwgdmFsMzIpOwotCXVkZWxheSgxMCk7Ci0KLQlmb3IgKG4gPSAwOyBuIDwgMjsgbisrKSB7Ci0JCVBTRF9yZXBvcnRfdG1wID0gIEdldFBTRERhdGEocERNX09kbSwgMTQsIGluaXRpYWxfZ2Fpbik7Ci0JCWlmIChQU0RfcmVwb3J0X3RtcCA+IEFudEJfcmVwb3J0KQotCQkJQW50Ql9yZXBvcnQgPSBQU0RfcmVwb3J0X3RtcDsKLQl9Ci0KLQkvKiAgY2hhbmdlIHRvIG9wZW4gY2FzZSAqLwotCS8qICBjaGFuZ2UgdG8gQW50IEEgYW5kIEIgYWxsIG9wZW4gY2FzZSAqLwotCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSk7Ci0JdmFsMzIgJj0gfjB4MzAwOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCB2YWwzMik7Ci0JdWRlbGF5KDEwKTsKLQotCWZvciAobiA9IDA7IG4gPCAyOyBuKyspIHsKLQkJUFNEX3JlcG9ydF90bXAgPSAgR2V0UFNERGF0YShwRE1fT2RtLCAxNCwgaW5pdGlhbF9nYWluKTsKLQkJaWYgKFBTRF9yZXBvcnRfdG1wID4gQW50T19yZXBvcnQpCi0JCQlBbnRPX3JlcG9ydCA9IFBTRF9yZXBvcnRfdG1wOwotCX0KLQotCS8qIENsb3NlIElRSyBTaW5nbGUgVG9uZSBmdW5jdGlvbiAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9JUUssIDB4MDAwMDAwMDApOwotCVBTRF9yZXBvcnRfdG1wID0gMHgwOwotCi0JLyogMSBSZXR1cm4gdG8gYW50YW5uYSBBICovCi0JdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FKTsKLQl2YWwzMiAmPSB+MHgzMDA7Ci0JdmFsMzIgfD0gMHgxMDA7CQkvKiBFbmFibGUgYW50ZW5uYSBBICovCi0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIHZhbDMyKTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCwgUmVnODhjKTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByT0ZETTBfVFJNdXhQYXIsIFJlZ2MwOCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX1hDRF9SRkludGVyZmFjZVNXLCBSZWc4NzQpOwotCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByT0ZETTBfWEFBR0NDb3JlMSk7Ci0JdmFsMzIgJj0gfjB4N2Y7Ci0JdmFsMzIgfD0gMHg0MDsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByT0ZETTBfWEFBR0NDb3JlMSwgdmFsMzIpOwotCi0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgck9GRE0wX1hBQUdDQ29yZTEsIFJlZ2M1MCk7Ci0JT0RNX1NldFJGUmVnKHBETV9PZG0sIFJGX1BBVEhfQSwgUkZfQ0hOTEJXLCBiUkZSZWdPZmZzZXRNYXNrLAotCQkgICAgIEN1cnJlbnRDaGFubmVsKTsKLQlPRE1fU2V0UkZSZWcocERNX09kbSwgUkZfUEFUSF9BLCAweDAwLCBiUkZSZWdPZmZzZXRNYXNrLCBSZkxvb3BSZWcpOwotCi0JLyogUmVsb2FkIEFGRSBSZWdpc3RlcnMgKi8KLQlvZG1fUEhZX1JlbG9hZEFGRVJlZ2lzdGVycyhwRE1fT2RtLCBBRkVfUkVHXzg3MjNBLCBBRkVfQmFja3VwLCAxNik7Ci0KLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwgT0RNX0RCR19MT1VELAotCQkgICAgICgicHNkX3JlcG9ydF9BWyVkXT0gJWQgXG4iLCAyNDE2LCBBbnRBX3JlcG9ydCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCJwc2RfcmVwb3J0X0JbJWRdPSAlZCBcbiIsIDI0MTYsIEFudEJfcmVwb3J0KSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoInBzZF9yZXBvcnRfT1slZF09ICVkIFxuIiwgMjQxNiwgQW50T19yZXBvcnQpKTsKLQotCS8qIDIgVGVzdCBBbnQgQiBiYXNlZCBvbiBBbnQgQSBpcyBPTiAqLwotCWlmIChtb2RlID09IEFOVFRFU1RCKSB7Ci0JCWlmIChBbnRBX3JlcG9ydCA+PSAxMDApIHsKLQkJCWlmIChBbnRCX3JlcG9ydCA+IChBbnRBX3JlcG9ydCsxKSkgewotCQkJCXBETV9TV0FUX1RhYmxlLT5BTlRCX09OID0gZmFsc2U7Ci0JCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsIE9ETV9EQkdfTE9VRCwgKCJPRE1fU2luZ2xlRHVhbEFudGVubmFEZXRlY3Rpb24oKTogU2luZ2xlIEFudGVubmEgQVxuIikpOwotCQkJfSBlbHNlIHsKLQkJCQlwRE1fU1dBVF9UYWJsZS0+QU5UQl9PTiA9IHRydWU7Ci0JCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsIE9ETV9EQkdfTE9VRCwgKCJPRE1fU2luZ2xlRHVhbEFudGVubmFEZXRlY3Rpb24oKTogRHVhbCBBbnRlbm5hIGlzIEEgYW5kIEJcbiIpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLCBPRE1fREJHX0xPVUQsICgiT0RNX1NpbmdsZUR1YWxBbnRlbm5hRGV0ZWN0aW9uKCk6IE5lZWQgdG8gY2hlY2sgYWdhaW5cbiIpKTsKLQkJCXBETV9TV0FUX1RhYmxlLT5BTlRCX09OID0gZmFsc2U7IC8qICBTZXQgQW50ZW5uYSBCIG9mZiBhcyBkZWZhdWx0ICovCi0JCQliUmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQl9IGVsc2UgaWYgKG1vZGUgPT0gQU5UVEVTVEFMTCkgewotCQkvKiAyIFRlc3QgQW50IEEgYW5kIEIgYmFzZWQgb24gRFBEVCBPcGVuICovCi0JCWlmICgoQW50T19yZXBvcnQgPj0gMTAwKSAmIChBbnRPX3JlcG9ydCA8IDExOCkpIHsKLQkJCWlmIChBbnRBX3JlcG9ydCA+IChBbnRPX3JlcG9ydCsxKSkgewotCQkJCXBETV9TV0FUX1RhYmxlLT5BTlRBX09OID0gZmFsc2U7Ci0JCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsCi0JCQkJCSAgICAgT0RNX0RCR19MT1VELCAoIkFudCBBIGlzIE9GRiIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcERNX1NXQVRfVGFibGUtPkFOVEFfT04gPSB0cnVlOwotCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLAotCQkJCQkgICAgIE9ETV9EQkdfTE9VRCwgKCJBbnQgQSBpcyBPTiIpKTsKLQkJCX0KLQotCQkJaWYgKEFudEJfcmVwb3J0ID4gKEFudE9fcmVwb3J0KzIpKSB7Ci0JCQkJcERNX1NXQVRfVGFibGUtPkFOVEJfT04gPSBmYWxzZTsKLQkJCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwKLQkJCQkJICAgICBPRE1fREJHX0xPVUQsICgiQW50IEIgaXMgT0ZGIikpOwotCQkJfSBlbHNlIHsKLQkJCQlwRE1fU1dBVF9UYWJsZS0+QU5UQl9PTiA9IHRydWU7Ci0JCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsCi0JCQkJCSAgICAgT0RNX0RCR19MT1VELCAoIkFudCBCIGlzIE9OIikpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsIE9ETV9EQkdfTE9VRCwKLQkJKCJPRE1fU2luZ2xlRHVhbEFudGVubmFEZXRlY3Rpb24oKTogTmVlZCB0byBjaGVjayBhZ2FpblxuIikpOwotCQkvKiAgU2V0IEFudGVubmEgQSBvbiBhcyBkZWZhdWx0ICovCi0JCXBETV9TV0FUX1RhYmxlLT5BTlRBX09OID0gdHJ1ZTsKLQkJLyogIFNldCBBbnRlbm5hIEIgb2ZmIGFzIGRlZmF1bHQgKi8KLQkJcERNX1NXQVRfVGFibGUtPkFOVEJfT04gPSBmYWxzZTsKLQkJYlJlc3VsdCA9IGZhbHNlOwotCX0KLQotCXJldHVybiBiUmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX0hXQ29uZmlnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1fSFdDb25maWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2MmY2MS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1fSFdDb25maWcuYworKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogICovCi0vKiAgaW5jbHVkZSBmaWxlcyAqLwotLyogICovCi0KLSNpbmNsdWRlICJvZG1fcHJlY29tcC5oIgotCi1zdGF0aWMgdTggb2RtX1F1ZXJ5UnhQd3JQZXJjZW50YWdlKHM4IEFudFBvd2VyKQotewotCWlmICgoQW50UG93ZXIgPD0gLTEwMCkgfHwgKEFudFBvd2VyID49IDIwKSkKLQkJcmV0dXJuCTA7Ci0JZWxzZSBpZiAoQW50UG93ZXIgPj0gMCkKLQkJcmV0dXJuCTEwMDsKLQllbHNlCi0JCXJldHVybgkxMDAgKyBBbnRQb3dlcjsKLX0KLQotc3RhdGljIHMzMiBvZG1fU2lnbmFsU2NhbGVNYXBwaW5nXzkyQ1NlcmllcyhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHMzMiBDdXJyU2lnKQotewotCXMzMiBSZXRTaWcgPSAwOwotCi0JaWYgKEN1cnJTaWcgPj0gNTEgJiYgQ3VyclNpZyA8PSAxMDApCi0JCVJldFNpZyA9IDEwMDsKLQllbHNlIGlmIChDdXJyU2lnID49IDQxICYmIEN1cnJTaWcgPD0gNTApCi0JCVJldFNpZyA9IDgwICsgKChDdXJyU2lnIC0gNDApKjIpOwotCWVsc2UgaWYgKEN1cnJTaWcgPj0gMzEgJiYgQ3VyclNpZyA8PSA0MCkKLQkJUmV0U2lnID0gNjYgKyAoQ3VyclNpZyAtIDMwKTsKLQllbHNlIGlmIChDdXJyU2lnID49IDIxICYmIEN1cnJTaWcgPD0gMzApCi0JCVJldFNpZyA9IDU0ICsgKEN1cnJTaWcgLSAyMCk7Ci0JZWxzZSBpZiAoQ3VyclNpZyA+PSAxMCAmJiBDdXJyU2lnIDw9IDIwKQotCQlSZXRTaWcgPSA0MiArICgoKEN1cnJTaWcgLSAxMCkgKiAyKSAvIDMpOwotCWVsc2UgaWYgKEN1cnJTaWcgPj0gNSAmJiBDdXJyU2lnIDw9IDkpCi0JCVJldFNpZyA9IDIyICsgKCgoQ3VyclNpZyAtIDUpICogMykgLyAyKTsKLQllbHNlIGlmIChDdXJyU2lnID49IDEgJiYgQ3VyclNpZyA8PSA0KQotCQlSZXRTaWcgPSA2ICsgKCgoQ3VyclNpZyAtIDEpICogMykgLyAyKTsKLQllbHNlCi0JCVJldFNpZyA9IEN1cnJTaWc7Ci0KLQlyZXR1cm4gUmV0U2lnOwotfQotCi1zdGF0aWMgczMyIG9kbV9TaWduYWxTY2FsZU1hcHBpbmcoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCBzMzIgQ3VyclNpZykKLXsKLQlyZXR1cm4gb2RtX1NpZ25hbFNjYWxlTWFwcGluZ185MkNTZXJpZXMocERNX09kbSwgQ3VyclNpZyk7Ci19Ci0KLXN0YXRpYyB1OAotb2RtX0VWTWRiVG9QZXJjZW50YWdlKAotCXM4IFZhbHVlCi0gICkKLXsKLQkvKiAgKi8KLQkvKiAgLTMzZEJ+MGRCIHRvIDAlfjk5JSAqLwotCS8qICAqLwotCXM4IHJldF92YWw7Ci0KLQlyZXRfdmFsID0gVmFsdWU7Ci0KLQlpZiAocmV0X3ZhbCA+PSAwKQotCQlyZXRfdmFsID0gMDsKLQlpZiAocmV0X3ZhbCA8PSAtMzMpCi0JCXJldF92YWwgPSAtMzM7Ci0KLQlyZXRfdmFsID0gMCAtIHJldF92YWw7Ci0JcmV0X3ZhbCAqPSAzOwotCi0JaWYgKHJldF92YWwgPT0gOTkpCi0JCXJldF92YWwgPSAxMDA7Ci0KLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLQotc3RhdGljIHZvaWQgb2RtX1J4UGh5U3RhdHVzOTJDU2VyaWVzX1BhcnNpbmcoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCQkJCQkgICAgIHN0cnVjdCBwaHlfaW5mbyAqcFBoeUluZm8sCi0JCQkJCSAgICAgdTggKnBQaHlTdGF0dXMsCi0JCQkJCSAgICAgc3RydWN0IG9kbV9wYWNrZXRfaW5mbyAqcFBrdGluZm8pCi17Ci0Jc3RydWN0IHBoeV9zdGF0dXNfcnB0ICpwUGh5U3RhUnB0ID0gKHN0cnVjdCBwaHlfc3RhdHVzX3JwdCAqKXBQaHlTdGF0dXM7Ci0JdTggaSwgTWF4X3NwYXRpYWxfc3RyZWFtOwotCXM4IHJ4X3B3cls0XSwgcnhfcHdyX2FsbCA9IDA7Ci0JdTggRVZNLCBQV0RCX0FMTCA9IDAsIFBXREJfQUxMX0JUOwotCXU4IFJTU0ksIHRvdGFsX3Jzc2kgPSAwOwotCXU4IGlzQ0NLcmF0ZSA9IDA7Ci0JdTggcmZfcnhfbnVtID0gMDsKLQl1OCBjY2tfaGlnaHB3ciA9IDA7Ci0KLQlpc0NDS3JhdGUgPSAocFBrdGluZm8tPlJhdGUgPD0gREVTQzkyQ19SQVRFMTFNKSA/IHRydWUgOiBmYWxzZTsKLQlwUGh5SW5mby0+UnhNSU1PU2lnbmFsUXVhbGl0eVtSRl9QQVRIX0FdID0gLTE7Ci0JcFBoeUluZm8tPlJ4TUlNT1NpZ25hbFF1YWxpdHlbUkZfUEFUSF9CXSA9IC0xOwotCi0JaWYgKGlzQ0NLcmF0ZSkgewotCQl1OCByZXBvcnQ7Ci0JCXU4IGNja19hZ2NfcnB0OwotCi0JCXBETV9PZG0tPlBoeURiZ0luZm8uTnVtUXJ5UGh5U3RhdHVzQ0NLKys7Ci0JCS8qICAoMSlIYXJkd2FyZSBkb2VzIG5vdCBwcm92aWRlIFJTU0kgZm9yIENDSyAqLwotCQkvKiAgKDIpUFdEQiwgQXZlcmFnZSBQV0RCIGNhY2x1YXRlZCBieSBoYXJkd2FyZSAoZm9yIHJhdGUgYWRhcHRpdmUpICovCi0KLQkJY2NrX2hpZ2hwd3IgPSBwRE1fT2RtLT5iQ2NrSGlnaFBvd2VyOwotCi0JCWNja19hZ2NfcnB0ID0gIHBQaHlTdGFScHQtPmNja19hZ2NfcnB0X29mZG1fY2Zvc2hvX2E7Ci0KLQkJLyogVGhlIFJTU0kgZm9ybXVsYSBzaG91bGQgYmUgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBnYWluIHRhYmxlICovCi0JCWlmICghY2NrX2hpZ2hwd3IpIHsKLQkJCXJlcG9ydCA9IChjY2tfYWdjX3JwdCAmIDB4YzApPj42OwotCQkJc3dpdGNoIChyZXBvcnQpIHsKLQkJCS8qICBNb2RpZnkgdGhlIFJGIFJOQSBnYWluIHZhbHVlIHRvIC00MCwgLTIwLCAtMiwgMTQgYnkgSmVueXUncyBzdWdnZXN0aW9uICovCi0JCQkvKiAgTm90ZTogZGlmZmVyZW50IFJGIHdpdGggdGhlIGRpZmZlcmVudCBSTkEgZ2Fpbi4gKi8KLQkJCWNhc2UgMHgzOgotCQkJCXJ4X3B3cl9hbGwgPSAtNDYgLSAoY2NrX2FnY19ycHQgJiAweDNlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMHgyOgotCQkJCXJ4X3B3cl9hbGwgPSAtMjYgLSAoY2NrX2FnY19ycHQgJiAweDNlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMHgxOgotCQkJCXJ4X3B3cl9hbGwgPSAtMTIgLSAoY2NrX2FnY19ycHQgJiAweDNlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMHgwOgotCQkJCXJ4X3B3cl9hbGwgPSAxNiAtIChjY2tfYWdjX3JwdCAmIDB4M2UpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmVwb3J0ID0gKGNja19hZ2NfcnB0ICYgMHg2MCk+PjU7Ci0JCQlzd2l0Y2ggKHJlcG9ydCkgewotCQkJY2FzZSAweDM6Ci0JCQkJcnhfcHdyX2FsbCA9IC00NiAtICgoY2NrX2FnY19ycHQgJiAweDFmKTw8MSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDB4MjoKLQkJCQlyeF9wd3JfYWxsID0gLTI2IC0gKChjY2tfYWdjX3JwdCAmIDB4MWYpPDwxKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMHgxOgotCQkJCXJ4X3B3cl9hbGwgPSAtMTIgLSAoKGNja19hZ2NfcnB0ICYgMHgxZik8PDEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAweDA6Ci0JCQkJcnhfcHdyX2FsbCA9IDE2IC0gKChjY2tfYWdjX3JwdCAmIDB4MWYpPDwxKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCVBXREJfQUxMID0gb2RtX1F1ZXJ5UnhQd3JQZXJjZW50YWdlKHJ4X3B3cl9hbGwpOwotCi0JCS8qIE1vZGlmaWNhdGlvbiBmb3IgZXh0LUxOQSBib2FyZCAqLwotCQlpZiAocERNX09kbS0+Qm9hcmRUeXBlID09IE9ETV9CT0FSRF9ISUdIUFdSKSB7Ci0JCQlpZiAoKGNja19hZ2NfcnB0Pj43KSA9PSAwKSB7Ci0JCQkJUFdEQl9BTEwgPSAoUFdEQl9BTEwgPiA5NCkgPyAxMDAgOiAoUFdEQl9BTEwrNik7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChQV0RCX0FMTCA+IDM4KQotCQkJCQlQV0RCX0FMTCAtPSAxNjsKLQkJCQllbHNlCi0JCQkJCVBXREJfQUxMID0gKFBXREJfQUxMIDw9IDE2KSA/IChQV0RCX0FMTD4+MikgOiAoUFdEQl9BTEwtMTIpOwotCQkJfQotCi0JCQkvKiBDQ0sgbW9kaWZpY2F0aW9uICovCi0JCQlpZiAoUFdEQl9BTEwgPiAyNSAmJiBQV0RCX0FMTCA8PSA2MCkKLQkJCQlQV0RCX0FMTCArPSA2OwotCQl9IGVsc2UgeyAvKiBNb2RpZmljYXRpb24gZm9yIGludC1MTkEgYm9hcmQgKi8KLQkJCWlmIChQV0RCX0FMTCA+IDk5KQotCQkJCVBXREJfQUxMIC09IDg7Ci0JCQllbHNlIGlmIChQV0RCX0FMTCA+IDUwICYmIFBXREJfQUxMIDw9IDY4KQotCQkJCVBXREJfQUxMICs9IDQ7Ci0JCX0KLQkJcFBoeUluZm8tPlJ4UFdEQkFsbCA9IFBXREJfQUxMOwotCQlwUGh5SW5mby0+QlRSeFJTU0lQZXJjZW50YWdlID0gUFdEQl9BTEw7Ci0JCXBQaHlJbmZvLT5SZWN2U2lnbmFsUG93ZXIgPSByeF9wd3JfYWxsOwotCQkvKiAgKDMpIEdldCBTaWduYWwgUXVhbGl0eSAoRVZNKSAqLwotCQlpZiAocFBrdGluZm8tPmJQYWNrZXRNYXRjaEJTU0lEKSB7Ci0JCQl1OAlTUSwgU1FfcnB0OwotCi0JCQlTUV9ycHQgPSBwUGh5U3RhUnB0LT5jY2tfc2lnX3F1YWxfb2ZkbV9wd2RiX2FsbDsKLQotCQkJaWYgKFNRX3JwdCA+IDY0KQotCQkJCVNRID0gMDsKLQkJCWVsc2UgaWYgKFNRX3JwdCA8IDIwKQotCQkJCVNRID0gMTAwOwotCQkJZWxzZQotCQkJCVNRID0gKCg2NC1TUV9ycHQpICogMTAwKSAvIDQ0OwotCi0JCQlwUGh5SW5mby0+U2lnbmFsUXVhbGl0eSA9IFNROwotCQkJcFBoeUluZm8tPlJ4TUlNT1NpZ25hbFF1YWxpdHlbUkZfUEFUSF9BXSA9IFNROwotCQkJcFBoeUluZm8tPlJ4TUlNT1NpZ25hbFF1YWxpdHlbUkZfUEFUSF9CXSA9IC0xOwotCQl9Ci0JfSBlbHNlIHsgLyogaXMgT0ZETSByYXRlICovCi0JCXBETV9PZG0tPlBoeURiZ0luZm8uTnVtUXJ5UGh5U3RhdHVzT0ZETSsrOwotCi0JCS8qICAoMSlHZXQgUlNTSSBmb3IgSFQgcmF0ZSAqLwotCi0JCWZvciAoaSA9IFJGX1BBVEhfQTsgaSA8IFJGX1BBVEhfTUFYOyBpKyspIHsKLQkJCS8qICAyMDA4LzAxLzMwIE1IIHdlIHdpbGwganVkZ2UgUkYgUlggcGF0aCBub3cuICovCi0JCQlpZiAocERNX09kbS0+UkZQYXRoUnhFbmFibGUgJiBCSVQoaSkpCi0JCQkJcmZfcnhfbnVtKys7Ci0KLQkJCXJ4X3B3cltpXSA9ICgocFBoeVN0YVJwdC0+cGF0aF9hZ2NbaV0uZ2FpbiAmIDB4M0YpKjIpIC0gMTEwOwotCi0JCQlwUGh5SW5mby0+UnhQd3JbaV0gPSByeF9wd3JbaV07Ci0KLQkJCS8qIFRyYW5zbGF0ZSBEQk0gdG8gcGVyY2VudGFnZS4gKi8KLQkJCVJTU0kgPSBvZG1fUXVlcnlSeFB3clBlcmNlbnRhZ2UocnhfcHdyW2ldKTsKLQkJCXRvdGFsX3Jzc2kgKz0gUlNTSTsKLQotCQkJLyogTW9kaWZpY2F0aW9uIGZvciBleHQtTE5BIGJvYXJkICovCi0JCQlpZiAocERNX09kbS0+Qm9hcmRUeXBlID09IE9ETV9CT0FSRF9ISUdIUFdSKSB7Ci0JCQkJaWYgKChwUGh5U3RhUnB0LT5wYXRoX2FnY1tpXS50cnN3KSA9PSAxKQotCQkJCQlSU1NJID0gKFJTU0kgPiA5NCkgPyAxMDAgOiAoUlNTSSs2KTsKLQkJCQllbHNlCi0JCQkJCVJTU0kgPSAoUlNTSSA8PSAxNikgPyAoUlNTST4+MykgOiAoUlNTSS0xNik7Ci0KLQkJCQlpZiAoKFJTU0kgPD0gMzQpICYmIChSU1NJID49IDQpKQotCQkJCQlSU1NJIC09IDQ7Ci0JCQl9Ci0KLQkJCXBQaHlJbmZvLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtpXSA9ICh1OCkgUlNTSTsKLQotCQkJLyogR2V0IFJ4IHNuciB2YWx1ZSBpbiBEQiAqLwotCQkJcFBoeUluZm8tPlJ4U05SW2ldID0gcERNX09kbS0+UGh5RGJnSW5mby5SeFNOUmRCW2ldID0gKHMzMikocFBoeVN0YVJwdC0+cGF0aF9yeHNucltpXS8yKTsKLQkJfQotCi0JCS8qICAoMilQV0RCLCBBdmVyYWdlIFBXREIgY2FjbHVhdGVkIGJ5IGhhcmR3YXJlIChmb3IgcmF0ZSBhZGFwdGl2ZSkgKi8KLQkJcnhfcHdyX2FsbCA9ICgoKHBQaHlTdGFScHQtPmNja19zaWdfcXVhbF9vZmRtX3B3ZGJfYWxsKSA+PiAxKSAmIDB4N2YpLTExMDsKLQotCQlQV0RCX0FMTCA9IG9kbV9RdWVyeVJ4UHdyUGVyY2VudGFnZShyeF9wd3JfYWxsKTsKLQkJUFdEQl9BTExfQlQgPSBQV0RCX0FMTDsKLQotCQlwUGh5SW5mby0+UnhQV0RCQWxsID0gUFdEQl9BTEw7Ci0JCXBQaHlJbmZvLT5CVFJ4UlNTSVBlcmNlbnRhZ2UgPSBQV0RCX0FMTF9CVDsKLQkJcFBoeUluZm8tPlJ4UG93ZXIgPSByeF9wd3JfYWxsOwotCQlwUGh5SW5mby0+UmVjdlNpZ25hbFBvd2VyID0gcnhfcHdyX2FsbDsKLQotCQkvKiAgKDMpRVZNIG9mIEhUIHJhdGUgKi8KLQkJaWYgKHBQa3RpbmZvLT5SYXRlID49IERFU0M5MkNfUkFURU1DUzggJiYgcFBrdGluZm8tPlJhdGUgPD0gREVTQzkyQ19SQVRFTUNTMTUpCi0JCQlNYXhfc3BhdGlhbF9zdHJlYW0gPSAyOyAvKiBib3RoIHNwYXRpYWwgc3RyZWFtIG1ha2Ugc2Vuc2UgKi8KLQkJZWxzZQotCQkJTWF4X3NwYXRpYWxfc3RyZWFtID0gMTsgLyogb25seSBzcGF0aWFsIHN0cmVhbSAxIG1ha2VzIHNlbnNlICovCi0KLQkJZm9yIChpID0gMDsgaSA8IE1heF9zcGF0aWFsX3N0cmVhbTsgaSsrKSB7Ci0JCQkvKiAgRG8gbm90IHVzZSBzaGlmdCBvcGVyYXRpb24gbGlrZSAicnhfZXZtWCA+Pj0gMSIgYmVjYXVzZSB0aGUgY29tcGlsb3Igb2YgZnJlZSBidWlsZCBlbnZpcm9ubWVudCAqLwotCQkJLyogIGZpbGwgbW9zdCBzaWduaWZpY2FudCBiaXQgdG8gInplcm8iIHdoZW4gZG9pbmcgc2hpZnRpbmcgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2UgYSBuZWdhdGl2ZSAqLwotCQkJLyogIHZhbHVlIHRvIHBvc2l0aXZlIG9uZSwgdGhlbiB0aGUgZGJtIHZhbHVlICh3aGljaCBpcyBzdXBwb3NlZCB0byBiZSBuZWdhdGl2ZSkgIGlzIG5vdCBjb3JyZWN0IGFueW1vcmUuICovCi0JCQlFVk0gPSBvZG1fRVZNZGJUb1BlcmNlbnRhZ2UoKHBQaHlTdGFScHQtPnN0cmVhbV9yeGV2bVtpXSkpOwkvKiBkYm0gKi8KLQotCQkJaWYgKHBQa3RpbmZvLT5iUGFja2V0TWF0Y2hCU1NJRCkgewotCQkJCWlmIChpID09IFJGX1BBVEhfQSkgewotCQkJCQkvKiAgRmlsbCB2YWx1ZSBpbiBSRkQsIEdldCB0aGUgZmlyc3Qgc3BhdGlhbCBzdHJlYW0gb25seSAqLwotCQkJCQlwUGh5SW5mby0+U2lnbmFsUXVhbGl0eSA9ICh1OCkoRVZNICYgMHhmZik7Ci0JCQkJfQotCQkJCXBQaHlJbmZvLT5SeE1JTU9TaWduYWxRdWFsaXR5W2ldID0gKHU4KShFVk0gJiAweGZmKTsKLQkJCX0KLQkJfQotCX0KLQkvKiBVSSBCU1MgTGlzdCBzaWduYWwgc3RyZW5ndGgoaW4gcGVyY2VudGFnZSksIG1ha2UgaXQgZ29vZCBsb29raW5nLCBmcm9tIDB+MTAwLiAqLwotCS8qIEl0IGlzIGFzc2lnbmVkIHRvIHRoZSBCU1MgTGlzdCBpbiBHZXRWYWx1ZUZyb21CZWFjb25PclByb2JlUnNwKCkuICovCi0JaWYgKGlzQ0NLcmF0ZSkgewotCQlwUGh5SW5mby0+U2lnbmFsU3RyZW5ndGggPSAodTgpKG9kbV9TaWduYWxTY2FsZU1hcHBpbmcocERNX09kbSwgUFdEQl9BTEwpKTsvKiBQV0RCX0FMTDsgKi8KLQl9IGVsc2UgewotCQlpZiAocmZfcnhfbnVtICE9IDApCi0JCQlwUGh5SW5mby0+U2lnbmFsU3RyZW5ndGggPSAodTgpKG9kbV9TaWduYWxTY2FsZU1hcHBpbmcocERNX09kbSwgdG90YWxfcnNzaSAvPSByZl9yeF9udW0pKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG9kbV9Qcm9jZXNzX1JTU0lGb3JETShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JCQkJICBzdHJ1Y3QgcGh5X2luZm8gKnBQaHlJbmZvLAotCQkJCSAgc3RydWN0IG9kbV9wYWNrZXRfaW5mbyAqcFBrdGluZm8pCi17Ci0JczMyIFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCLCBVbmRlY29yYXRlZFNtb290aGVkQ0NLOwotCXMzMiBVbmRlY29yYXRlZFNtb290aGVkT0ZETSwgUlNTSV9BdmU7Ci0JdTggaXNDQ0tyYXRlID0gMDsKLQl1OCBSU1NJX21heCwgUlNTSV9taW4sIGk7Ci0JdTMyIE9GRE1fcGt0ID0gMDsKLQl1MzIgV2VpZ2h0aW5nID0gMDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBFbnRyeTsKLQotCWlmIChwUGt0aW5mby0+U3RhdGlvbklEID09IDB4RkYpCi0JCXJldHVybjsKLQotCXBFbnRyeSA9IHBETV9PZG0tPnBPRE1fU3RhSW5mb1twUGt0aW5mby0+U3RhdGlvbklEXTsKLQlpZiAoIXBFbnRyeSkKLQkJcmV0dXJuOwotCWlmICgoIXBQa3RpbmZvLT5iUGFja2V0TWF0Y2hCU1NJRCkpCi0JCXJldHVybjsKLQotCWlzQ0NLcmF0ZSA9IChwUGt0aW5mby0+UmF0ZSA8PSBERVNDOTJDX1JBVEUxMU0pID8gdHJ1ZSA6IGZhbHNlOwotCi0JLyogU21hcnQgQW50ZW5uYSBEZWJ1ZyBNZXNzYWdlLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCVVuZGVjb3JhdGVkU21vb3RoZWRDQ0sgPSAgcEVudHJ5LT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZENDSzsKLQlVbmRlY29yYXRlZFNtb290aGVkT0ZETSA9IHBFbnRyeS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRPRkRNOwotCVVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gcEVudHJ5LT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0KLQlpZiAocFBrdGluZm8tPmJQYWNrZXRUb1NlbGYgfHwgcFBrdGluZm8tPmJQYWNrZXRCZWFjb24pIHsKLQkJaWYgKCFpc0NDS3JhdGUpIHsgLyogb2ZkbSByYXRlICovCi0JCQlpZiAocFBoeUluZm8tPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW1JGX1BBVEhfQl0gPT0gMCkgewotCQkJCVJTU0lfQXZlID0gcFBoeUluZm8tPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW1JGX1BBVEhfQV07Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwUGh5SW5mby0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbUkZfUEFUSF9BXSA+IHBQaHlJbmZvLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtSRl9QQVRIX0JdKSB7Ci0JCQkJCVJTU0lfbWF4ID0gcFBoeUluZm8tPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW1JGX1BBVEhfQV07Ci0JCQkJCVJTU0lfbWluID0gcFBoeUluZm8tPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW1JGX1BBVEhfQl07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUlNTSV9tYXggPSBwUGh5SW5mby0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbUkZfUEFUSF9CXTsKLQkJCQkJUlNTSV9taW4gPSBwUGh5SW5mby0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbUkZfUEFUSF9BXTsKLQkJCQl9Ci0JCQkJaWYgKChSU1NJX21heCAtIFJTU0lfbWluKSA8IDMpCi0JCQkJCVJTU0lfQXZlID0gUlNTSV9tYXg7Ci0JCQkJZWxzZSBpZiAoKFJTU0lfbWF4IC0gUlNTSV9taW4pIDwgNikKLQkJCQkJUlNTSV9BdmUgPSBSU1NJX21heCAtIDE7Ci0JCQkJZWxzZSBpZiAoKFJTU0lfbWF4IC0gUlNTSV9taW4pIDwgMTApCi0JCQkJCVJTU0lfQXZlID0gUlNTSV9tYXggLSAyOwotCQkJCWVsc2UKLQkJCQkJUlNTSV9BdmUgPSBSU1NJX21heCAtIDM7Ci0JCQl9Ci0KLQkJCS8qIDEgUHJvY2VzcyBPRkRNIFJTU0kgKi8KLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkT0ZETSA8PSAwKSB7Ci0JCQkJLyogIGluaXRpYWxpemUgKi8KLQkJCQlVbmRlY29yYXRlZFNtb290aGVkT0ZETSA9IHBQaHlJbmZvLT5SeFBXREJBbGw7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwUGh5SW5mby0+UnhQV0RCQWxsID4gKHUzMilVbmRlY29yYXRlZFNtb290aGVkT0ZETSkgewotCQkJCQlVbmRlY29yYXRlZFNtb290aGVkT0ZETSA9Ci0JCQkJCQkJKCgoVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE0pKihSeF9TbW9vdGhfRmFjdG9yLTEpKSArCi0JCQkJCQkJKFJTU0lfQXZlKSkgLyAoUnhfU21vb3RoX0ZhY3Rvcik7Ci0JCQkJCVVuZGVjb3JhdGVkU21vb3RoZWRPRkRNID0gVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE0gKyAxOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVVuZGVjb3JhdGVkU21vb3RoZWRPRkRNID0KLQkJCQkJCQkoKChVbmRlY29yYXRlZFNtb290aGVkT0ZETSkqKFJ4X1Ntb290aF9GYWN0b3ItMSkpICsKLQkJCQkJCQkoUlNTSV9BdmUpKSAvIChSeF9TbW9vdGhfRmFjdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwRW50cnktPnJzc2lfc3RhdC5QYWNrZXRNYXAgPQotCQkJCShwRW50cnktPnJzc2lfc3RhdC5QYWNrZXRNYXA8PDEpIHwgQklUKDApOwotCQl9IGVsc2UgewotCQkJUlNTSV9BdmUgPSBwUGh5SW5mby0+UnhQV0RCQWxsOwotCi0JCQkvKiAxIFByb2Nlc3MgQ0NLIFJTU0kgKi8KLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkQ0NLIDw9IDApIHsKLQkJCQkvKiAgaW5pdGlhbGl6ZSAqLwotCQkJCVVuZGVjb3JhdGVkU21vb3RoZWRDQ0sgPSBwUGh5SW5mby0+UnhQV0RCQWxsOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocFBoeUluZm8tPlJ4UFdEQkFsbCA+ICh1MzIpVW5kZWNvcmF0ZWRTbW9vdGhlZENDSykgewotCQkJCQlVbmRlY29yYXRlZFNtb290aGVkQ0NLID0KLQkJCQkJCQkoKChVbmRlY29yYXRlZFNtb290aGVkQ0NLKSooUnhfU21vb3RoX0ZhY3Rvci0xKSkgKwotCQkJCQkJCShwUGh5SW5mby0+UnhQV0RCQWxsKSkgLyAoUnhfU21vb3RoX0ZhY3Rvcik7Ci0JCQkJCVVuZGVjb3JhdGVkU21vb3RoZWRDQ0sgPSBVbmRlY29yYXRlZFNtb290aGVkQ0NLICsgMTsKLQkJCQl9IGVsc2UgewotCQkJCQlVbmRlY29yYXRlZFNtb290aGVkQ0NLID0KLQkJCQkJCQkoKChVbmRlY29yYXRlZFNtb290aGVkQ0NLKSooUnhfU21vb3RoX0ZhY3Rvci0xKSkgKwotCQkJCQkJCShwUGh5SW5mby0+UnhQV0RCQWxsKSkgLyAoUnhfU21vb3RoX0ZhY3Rvcik7Ci0JCQkJfQotCQkJfQotCQkJcEVudHJ5LT5yc3NpX3N0YXQuUGFja2V0TWFwID0gcEVudHJ5LT5yc3NpX3N0YXQuUGFja2V0TWFwPDwxOwotCQl9Ci0KLQkJLyogMjAxMS4wNy4yOCBMdWtlTGVlOiBtb2RpZmllZCB0byBwcmV2ZW50IHVuc3RhYmxlIENDSyBSU1NJICovCi0JCWlmIChwRW50cnktPnJzc2lfc3RhdC5WYWxpZEJpdCA+PSA2NCkKLQkJCXBFbnRyeS0+cnNzaV9zdGF0LlZhbGlkQml0ID0gNjQ7Ci0JCWVsc2UKLQkJCXBFbnRyeS0+cnNzaV9zdGF0LlZhbGlkQml0Kys7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHBFbnRyeS0+cnNzaV9zdGF0LlZhbGlkQml0OyBpKyspCi0JCQlPRkRNX3BrdCArPQotCQkJCSh1OCkocEVudHJ5LT5yc3NpX3N0YXQuUGFja2V0TWFwPj5pKSAmIEJJVCgwKTsKLQotCQlpZiAocEVudHJ5LT5yc3NpX3N0YXQuVmFsaWRCaXQgPT0gNjQpIHsKLQkJCVdlaWdodGluZyA9ICgoT0ZETV9wa3Q8PDQpID4gNjQpPzY0OihPRkRNX3BrdDw8NCk7Ci0JCQlVbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IChXZWlnaHRpbmcqVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE0rKDY0LVdlaWdodGluZykqVW5kZWNvcmF0ZWRTbW9vdGhlZENDSyk+PjY7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocEVudHJ5LT5yc3NpX3N0YXQuVmFsaWRCaXQgIT0gMCkKLQkJCQlVbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IChPRkRNX3BrdCpVbmRlY29yYXRlZFNtb290aGVkT0ZETSsocEVudHJ5LT5yc3NpX3N0YXQuVmFsaWRCaXQtT0ZETV9wa3QpKlVuZGVjb3JhdGVkU21vb3RoZWRDQ0spL3BFbnRyeS0+cnNzaV9zdGF0LlZhbGlkQml0OwotCQkJZWxzZQotCQkJCVVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gMDsKLQkJfQotCQlwRW50cnktPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkQ0NLID0gVW5kZWNvcmF0ZWRTbW9vdGhlZENDSzsKLQkJcEVudHJ5LT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE0gPSBVbmRlY29yYXRlZFNtb290aGVkT0ZETTsKLQkJcEVudHJ5LT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSBVbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQl9Ci19Ci0KLXZvaWQgT0RNX1BoeVN0YXR1c1F1ZXJ5MjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgc3RydWN0IHBoeV9pbmZvICpwUGh5SW5mbywKLQkJCSAgIHU4ICpwUGh5U3RhdHVzLCBzdHJ1Y3Qgb2RtX3BhY2tldF9pbmZvICpwUGt0aW5mbykKLXsKLQlvZG1fUnhQaHlTdGF0dXM5MkNTZXJpZXNfUGFyc2luZyhwRE1fT2RtLCBwUGh5SW5mbywKLQkJCQkJIHBQaHlTdGF0dXMsIHBQa3RpbmZvKTsKLQotCW9kbV9Qcm9jZXNzX1JTU0lGb3JETShwRE1fT2RtLCBwUGh5SW5mbywgcFBrdGluZm8pOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX1JlZ0NvbmZpZzg3MjNBLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1fUmVnQ29uZmlnODcyM0EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYzYzZjYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1fUmVnQ29uZmlnODcyM0EuYworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAib2RtX3ByZWNvbXAuaCIKLSNpbmNsdWRlICJ1c2Jfb3BzX2xpbnV4LmgiCi0KLXZvaWQKLW9kbV9Db25maWdSRlJlZ184NzIzQSgKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JdTMyCQkJCQlBZGRyLAotCXUzMgkJCQkJRGF0YSwKLQllbnVtIFJGX1JBRElPX1BBVEggICAgIFJGX1BBVEgsCi0JdTMyCQkJCSAgICBSZWdBZGRyCi0JKQotewotCWlmIChBZGRyID09IDB4ZmUpIHsKLQkJbXNsZWVwKDUwKTsKLQl9IGVsc2UgaWYgKEFkZHIgPT0gMHhmZCkgewotCQltZGVsYXkoNSk7Ci0JfSBlbHNlIGlmIChBZGRyID09IDB4ZmMpIHsKLQkJbWRlbGF5KDEpOwotCX0gZWxzZSBpZiAoQWRkciA9PSAweGZiKSB7Ci0JCXVkZWxheSg1MCk7Ci0JfSBlbHNlIGlmIChBZGRyID09IDB4ZmEpIHsKLQkJdWRlbGF5KDUpOwotCX0gZWxzZSBpZiAoQWRkciA9PSAweGY5KSB7Ci0JCXVkZWxheSgxKTsKLQl9IGVsc2UgewotCQlPRE1fU2V0UkZSZWcocERNX09kbSwgUkZfUEFUSCwgUmVnQWRkciwgYlJGUmVnT2Zmc2V0TWFzaywgRGF0YSk7Ci0JCS8qICBBZGQgMXVzIGRlbGF5IGJldHdlZW4gQkIvUkYgcmVnaXN0ZXIgc2V0dGluZy4gKi8KLQkJdWRlbGF5KDEpOwotCX0KLX0KLQotdm9pZCBvZG1fQ29uZmlnTUFDXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIGFkZHIsIHU4CWRhdGEpCi17Ci0JcnRsODcyM2F1X3dyaXRlOChwRE1fT2RtLT5BZGFwdGVyLCBhZGRyLCBkYXRhKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfSU5JVCwgT0RNX0RCR19MT1VELAotCQkgICAgICgiPT09PiAlczogW01BQ19SRUddICUwOFggJTA4WFxuIiwgX19mdW5jX18sIGFkZHIsIGRhdGEpKTsKLX0KLQotdm9pZCBvZG1fQ29uZmlnQkJfQUdDXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIGFkZHIsIHUzMiBkYXRhKQotewotCXJ0bDg3MjNhdV93cml0ZTMyKHBETV9PZG0tPkFkYXB0ZXIsIGFkZHIsIGRhdGEpOwotCS8qICBBZGQgMXVzIGRlbGF5IGJldHdlZW4gQkIvUkYgcmVnaXN0ZXIgc2V0dGluZy4gKi8KLQl1ZGVsYXkoMSk7Ci0KLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfSU5JVCwgT0RNX0RCR19MT1VELAotCQkgICAgICgiPT09PiAlczogW0FHQ19UQUJdICUwOFggJTA4WFxuIiwgX19mdW5jX18sIGFkZHIsIGRhdGEpKTsKLX0KLQotdm9pZAotb2RtX0NvbmZpZ0JCX1BIWV84NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBhZGRyLCB1MzIgZGF0YSkKLXsKLQlpZiAoYWRkciA9PSAweGZlKQotCQltc2xlZXAoNTApOwotCWVsc2UgaWYgKGFkZHIgPT0gMHhmZCkKLQkJbWRlbGF5KDUpOwotCWVsc2UgaWYgKGFkZHIgPT0gMHhmYykKLQkJbWRlbGF5KDEpOwotCWVsc2UgaWYgKGFkZHIgPT0gMHhmYikKLQkJdWRlbGF5KDUwKTsKLQllbHNlIGlmIChhZGRyID09IDB4ZmEpCi0JCXVkZWxheSg1KTsKLQllbHNlIGlmIChhZGRyID09IDB4ZjkpCi0JCXVkZWxheSgxKTsKLQllbHNlIGlmIChhZGRyID09IDB4YTI0KQotCQlwRE1fT2RtLT5SRkNhbGlicmF0ZUluZm8uUmVnQTI0ID0gZGF0YTsKLQlydGw4NzIzYXVfd3JpdGUzMihwRE1fT2RtLT5BZGFwdGVyLCBhZGRyLCBkYXRhKTsKLQotCS8qICBBZGQgMXVzIGRlbGF5IGJldHdlZW4gQkIvUkYgcmVnaXN0ZXIgc2V0dGluZy4gKi8KLQl1ZGVsYXkoMSk7Ci0KLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfSU5JVCwgT0RNX0RCR19MT1VELAotCQkgICAgICgiPT09PiAlczogW1BIWV9SRUddICUwOFggJTA4WFxuIiwgX19mdW5jX18sIGFkZHIsIGRhdGEpKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbV9kZWJ1Zy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX2RlYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMmJkZGEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX2RlYnVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm9kbV9wcmVjb21wLmgiCi0KLXZvaWQgT0RNX0luaXREZWJ1Z1NldHRpbmcyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXBETV9PZG0tPkRlYnVnTGV2ZWwgPSBPRE1fREJHX1RSQUNFOwotCXBETV9PZG0tPkRlYnVnQ29tcG9uZW50cyA9IDA7Ci19Ci0KLXUzMiBHbG9iYWxEZWJ1Z0xldmVsMjNBOwotCi12b2lkIHJ0X3RyYWNlKGludCBjb21wLCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXN0cnVjdCB2YV9mb3JtYXQgdmFmOwotCXZhX2xpc3QgYXJnczsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0KLQl2YWYuZm10ID0gZm10OwotCXZhZi52YSA9ICZhcmdzOwotCi0JcHJfaW5mbyhEUklWRVJfUFJFRklYICIgWzB4JTA4eCwlZF0gJXBWIiwgY29tcCwgbGV2ZWwsICZ2YWYpOwotCi0JdmFfZW5kKGFyZ3MpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX2ludGVyZmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX2ludGVyZmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGY2NzkwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbV9pbnRlcmZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAgKi8KLS8qICBpbmNsdWRlIGZpbGVzICovCi0vKiAgKi8KLQotI2luY2x1ZGUgIm9kbV9wcmVjb21wLmgiCi0vKiAgKi8KLS8qICBPRE0gSU8gUmVsYXRpdmUgQVBJLiAqLwotLyogICovCi0jaW5jbHVkZSA8dXNiX29wc19saW51eC5oPgotCi12b2lkIE9ETV9TZXRSRlJlZygKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JZW51bSBSRl9SQURJT19QQVRICWVSRlBhdGgsCi0JdTMyCQkJCVJlZ0FkZHIsCi0JdTMyCQkJCUJpdE1hc2ssCi0JdTMyCQkJCURhdGEKLQkpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQotCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCBlUkZQYXRoLCBSZWdBZGRyLCBCaXRNYXNrLCBEYXRhKTsKLX0KLQotdTMyIE9ETV9HZXRSRlJlZygKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JZW51bSBSRl9SQURJT19QQVRICWVSRlBhdGgsCi0JdTMyCQkJCVJlZ0FkZHIsCi0JdTMyCQkJCUJpdE1hc2sKLQkpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQotCXJldHVybiBQSFlfUXVlcnlSRlJlZyhBZGFwdGVyLCBlUkZQYXRoLCBSZWdBZGRyLCBCaXRNYXNrKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2J0LWNvZXhpc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2J0LWNvZXhpc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjYmQ3YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9idC1jb2V4aXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKnB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotI2RlZmluZSBESVNfUFNfUlhfQkNOCi0KLXUzMiBCVENvZXhEYmdMZXZlbCA9IF9idF9kYmdfb2ZmXzsKLQotI2RlZmluZSBSVFBSSU5UKF9Db21wLCBfTGV2ZWwsIEZtdClcCi1kbyB7XAotCWlmICgoQlRDb2V4RGJnTGV2ZWwgPT0gX2J0X2RiZ19vbl8pKSB7XAotCQlwcmludGsgRm10O1wKLQl9CQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFJUUFJJTlRfQUREUihkYmd0eXBlLCBkYmdmbGFnLCBwcmludHN0ciwgX1B0cilcCi1pZiAoKEJUQ29leERiZ0xldmVsID09IF9idF9kYmdfb25fKSkge1wKLQl1MzIgX19pOwkJCQkJCVwKLQl1OCAqcHRyID0gKHU4ICopX1B0cjsJXAotCXByaW50ayBwcmludHN0cjsJCQkJXAotCXByaW50aygiICIpOwkJCQkJXAotCWZvciAoX19pID0gMDsgX19pIDwgNjsgX19pKyspCQlcCi0JCXByaW50aygiJTAyWCVzIiwgcHRyW19faV0sIChfX2kgPT0gNSk/IiI6Ii0iKTsJCVwKLQlwcmludGsoIlxuIik7CQkJCQkJCVwKLX0KLSNkZWZpbmUgUlRQUklOVF9EQVRBKGRiZ3R5cGUsIGRiZ2ZsYWcsIF9UaXRsZVN0cmluZywgX0hleERhdGEsIF9IZXhEYXRhTGVuKVwKLWlmICgoQlRDb2V4RGJnTGV2ZWwgPT0gX2J0X2RiZ19vbl8pKSB7XAotCXUzMiBfX2k7CQkJCQkJXAotCXU4ICpwdHIgPSAodTggKilfSGV4RGF0YTsJCQkJXAotCXByaW50ayhfVGl0bGVTdHJpbmcpOwkJCQkJXAotCWZvciAoX19pID0gMDsgX19pIDwgKHUzMilfSGV4RGF0YUxlbjsgX19pKyspIHsJCVwKLQkJcHJpbnRrKCIlMDJYJXMiLCBwdHJbX19pXSwgKCgoX19pICsgMSkgJSA0KSA9PSAwKT8iICAiOiIgIik7XAotCQlpZiAoKChfX2kgKyAxKSAlIDE2KSA9PSAwKQkJCVwKLQkJCXByaW50aygiXG4iKTsJCQkJXAotCX0JCQkJCQkJCVwKLQlwcmludGsoIlxuIik7CQkJCQkJCVwKLX0KLS8qICBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0yMi4gKi8KLSNkZWZpbmUgTUFYX1NUUl9MRU4JNjQKLS8qICBJIHdhbnQgdG8gc2VlIEFTQ0lJIDMzIHRvIDEyNiBvbmx5LiBPdGhlcndpc2UsIEkgcHJpbnQgJz8nLiAqLwotI2RlZmluZSBQUklOVEFCTEUoX2NoKQkoX2NoID49ICcgJyAmJiBfY2ggPD0gJ34nKQotI2RlZmluZSBSVF9QUklOVF9TVFIoX0NvbXAsIF9MZXZlbCwgX1RpdGxlU3RyaW5nLCBfUHRyLCBfTGVuKQkJXAotCXsJCQkJCQkJCVwKLQkJdTMyIF9faTsJCQkJCQlcCi0JCXU4IGJ1ZmZlcltNQVhfU1RSX0xFTl07CQkJCQlcCi0JCXUzMiBsZW5ndGggPSAoX0xlbiA8IE1BWF9TVFJfTEVOKSA/IF9MZW4gOiAoTUFYX1NUUl9MRU4tMSk7XAotCQltZW1zZXQoYnVmZmVyLCAwLCBNQVhfU1RSX0xFTik7CQkJCVwKLQkJbWVtY3B5KGJ1ZmZlciwgKHU4ICopX1B0ciwgbGVuZ3RoKTsJCQlcCi0JCWZvciAoX19pID0gMDsgX19pIDwgbGVuZ3RoOyBfX2krKykgewkJCVwKLQkJCWlmICghUFJJTlRBQkxFKGJ1ZmZlcltfX2ldKSkJCQlcCi0JCQkJYnVmZmVyW19faV0gPSAnPyc7CQkJXAotCQl9CQkJCQkJCVwKLQkJYnVmZmVyW2xlbmd0aF0gPSAnXDAnOwkJCQkJXAotCQlwcmludGsoX1RpdGxlU3RyaW5nKTsJCQkJCVwKLQkJcHJpbnRrKCI6ICVkLCA8JXM+XG4iLCBfTGVuLCBidWZmZXIpOwkJCVwKLQl9Ci0KLSNkZWZpbmUgRENNRF9QcmludGYoLi4uKQotI2RlZmluZSBSVF9BU1NFUlQoLi4uKQotCi0KLSNkZWZpbmUgR2V0RGVmYXVsdEFkYXB0ZXIocGFkYXB0ZXIpCXBhZGFwdGVyCi0KLSNkZWZpbmUgUGxhdGZvcm1aZXJvTWVtb3J5KHB0ciwgc3opCW1lbXNldChwdHIsIDAsIHN6KQotCi0jZGVmaW5lIEdFVF9VTkRFQ09SQVRFRF9BVkVSQUdFX1JTU0kocGFkYXB0ZXIpCVwKLQkJCShHRVRfSEFMX0RBVEEocGFkYXB0ZXIpLT5kbXByaXYuRW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQikKLSNkZWZpbmUgUlRfUkZfQ0hBTkdFX1NPVVJDRSB1MzIKLQotZW51bSB7Ci0JUlRfSk9JTl9JTkZSQSAgID0gMSwKLQlSVF9KT0lOX0lCU1MgID0gMiwKLQlSVF9TVEFSVF9JQlNTID0gMywKLQlSVF9OT19BQ1RJT04gID0gNCwKLX07Ci0KLS8qICBwb3dlciBzYXZpbmcgKi8KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBDT01NT00vQlQuYyA9PT09PSAqLwotCi1zdGF0aWMgdTggQlRfT3BlcmF0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlpZiAocEJ0TWdudC0+QnRPcGVyYXRpb25PbikKLQkJcmV0dXJuIHRydWU7Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB1OCBCVF9Jc0xlZ2FsQ2hhbm5lbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBjaGFubmVsKQotewotCXN0cnVjdCBydF9jaGFubmVsX2luZm8gKnBDaGFubmVMaXN0ID0gTlVMTDsKLQl1OCBjaGFubmVsTGVuLCBpOwotCi0JcENoYW5uZUxpc3QgPSBwYWRhcHRlci0+bWxtZWV4dHByaXYuY2hhbm5lbF9zZXQ7Ci0JY2hhbm5lbExlbiA9IHBhZGFwdGVyLT5tbG1lZXh0cHJpdi5tYXhfY2hhbl9udW1zOwotCi0JZm9yIChpID0gMDsgaSA8IGNoYW5uZWxMZW47IGkrKykgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsCi0JCQkoIkNoZWNrIGlmIGNobmwoJWQpIGluIGNoYW5uZWwgcGxhbiBjb250YWlucyBidCB0YXJnZXQgY2hubCglZCkgZm9yIEJUIGNvbm5lY3Rpb25cbiIsCi0JCQkgcENoYW5uZUxpc3RbaV0uQ2hhbm5lbE51bSwgY2hhbm5lbCkpOwotCQlpZiAoKGNoYW5uZWwgPT0gcENoYW5uZUxpc3RbaV0uQ2hhbm5lbE51bSkgfHwKLQkJICAgIChjaGFubmVsID09IHBDaGFubmVMaXN0W2ldLkNoYW5uZWxOdW0gKyAyKSkKLQkJCXJldHVybiBjaGFubmVsOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBCVF9TaWduYWxDb21wZW5zYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnJzc2lfd2lmaSwgdTggKnJzc2lfYnQpCi17Ci0JQlRETV9TaWduYWxDb21wZW5zYXRpb24ocGFkYXB0ZXIsIHJzc2lfd2lmaSwgcnNzaV9idCk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfQlRfd2lmaXNjYW5fbm90aWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHNjYW5UeXBlKQotewotCUJUSENJX1dpZmlTY2FuTm90aWZ5KHBhZGFwdGVyLCBzY2FuVHlwZSk7Ci0JQlRETV9DaGVja0FudFNlbE1vZGUocGFkYXB0ZXIpOwotCUJURE1fV2lmaVNjYW5Ob3RpZnkocGFkYXB0ZXIsIHNjYW5UeXBlKTsKLX0KLQotdm9pZCBydGw4NzIzYV9CVF93aWZpYXNzb2NpYXRlX25vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBhY3Rpb24pCi17Ci0JLyogIGFjdGlvbiA6ICovCi0JLyogIHRydWUgPSBhc3NvY2lhdGUgc3RhcnQgKi8KLQkvKiAgZmFsc2UgPSBhc3NvY2lhdGUgZmluaXNoZWQgKi8KLQlpZiAoYWN0aW9uKQotCQlCVERNX0NoZWNrQW50U2VsTW9kZShwYWRhcHRlcik7Ci0KLQlCVERNX1dpZmlBc3NvY2lhdGVOb3RpZnkocGFkYXB0ZXIsIGFjdGlvbik7Ci19Ci0KLXZvaWQgQlRfSGFsdFByb2Nlc3Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlCVERNX0ZvckhhbHQocGFkYXB0ZXIpOwotfQotCi0vKiAgPT09PT0gRW5kIG9mIHN5bmMgZnJvbSBTRDcgZHJpdmVyIENPTU1PTS9CVC5jID09PT09ICovCi0KLSNkZWZpbmUgaTY0Zm10CQkibGwiCi0jZGVmaW5lIFVJTlQ2NF9DKHYpICAodikKLQotI2RlZmluZSBGaWxsT2N0ZXRTdHJpbmcoX29zLCBfb2N0ZXQsIF9sZW4pCQlcCi0JKF9vcykuT2N0ZXQgPSAodTggKikoX29jdGV0KTsJCQlcCi0JKF9vcykuTGVuZ3RoID0gKF9sZW4pOwotCi1zdGF0aWMgZW51bSBydF9zdGF0dXMgUGxhdGZvcm1JbmRpY2F0ZUJURXZlbnQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl2b2lkCQkJCQkJKnBFdm50RGF0YSwKLQl1MzIJCQkJCQlkYXRhTGVuCi0JKQotewotCWVudW0gcnRfc3RhdHVzCXJ0X3N0YXR1cyA9IFJUX1NUQVRVU19GQUlMVVJFOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5UX0RFVEFJTCwgKCJCVCBldmVudCBzdGFydCwgJWQgYnl0ZXMgZGF0YSB0byBUcmFuc2ZlcnJlZCEhXG4iLCBkYXRhTGVuKSk7Ci0JUlRQUklOVF9EQVRBKEZJT0NUTCwgSU9DVExfQlRfRVZFTlRfREVUQUlMLCAiVG8gdHJhbnNmZXIgSGV4IERhdGEgOlxuIiwKLQkJcEV2bnREYXRhLCBkYXRhTGVuKTsKLQotCUJUX0V2ZW50UGFyc2UocGFkYXB0ZXIsIHBFdm50RGF0YSwgZGF0YUxlbik7Ci0KLQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTGludXggaGFzIG5vIHdheSB0byByZXBvcnQgQlQgZXZlbnQhIVxuIiwgX19mdW5jX18pOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5UX0RFVEFJTCwgKCJCVCBldmVudCBlbmQsICVzXG4iLAotCQkocnRfc3RhdHVzID09IFJUX1NUQVRVU19TVUNDRVNTKSA/ICJTVUNDRVNTIiA6ICJGQUlMIikpOwotCi0JcmV0dXJuIHJ0X3N0YXR1czsKLX0KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBDT01NT00vYnRfaGNpLmMgPT09PT0gKi8KLQotc3RhdGljIHU4IGJ0aGNpX0dldExvY2FsQ2hhbm5lbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXJldHVybiBwYWRhcHRlci0+bWxtZWV4dHByaXYuY3VyX2NoYW5uZWw7Ci19Ci0KLXN0YXRpYyB1OCBidGhjaV9HZXRDdXJyZW50RW50cnlOdW0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggUGh5SGFuZGxlKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JdTggaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfQlRfQVNPQ19FTlRSWV9OVU07IGkrKykgewotCQlpZiAoKHBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLmJVc2VkKSAmJgotCQkgICAgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLlBoeUxpbmtDbWREYXRhLkJ0UGh5TGlua2hhbmRsZSA9PSBQaHlIYW5kbGUpKQotCQkJcmV0dXJuIGk7Ci0JfQotCi0JcmV0dXJuIDB4RkY7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aGNpX0RlY2lkZUJUQ2hhbm5lbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbnRyeU51bSkKLXsKLS8qUE1HTlRfSU5GTyBwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdjsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250OwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbzsKLQlzdHJ1Y3QgY2hubF90eHBvd2VyX3RyaXBsZSAqcFRyaXBsZV9zdWJiYW5kID0gTlVMTDsKLQlzdHJ1Y3QgY29tbW9uX3RyaXBsZSAqcFRyaXBsZTsKLQl1OCBpLCBqLCBsb2NhbGNobmwsIGZpcnN0UmVtb3RlTGVnYWxDaG5sSW5UcmlwbGV0ID0gMDsKLQl1OCByZWd1bGF0b3J5X3NraXBMZW4gPSAwOwotCXU4IHN1YmJhbmRUcmlwbGV0Q250ID0gMDsKLQotCXBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQotCXBCdE1nbnQtPkNoZWNrQ2hubElzU3VpdCA9IHRydWU7Ci0JbG9jYWxjaG5sID0gYnRoY2lfR2V0TG9jYWxDaGFubmVsKHBhZGFwdGVyKTsKLQotCXBUcmlwbGUgPSAoc3RydWN0IGNvbW1vbl90cmlwbGUgKikKLQkJJnBCdEhjaUluZm8tPkJUUHJlQ2hubGxpc3RbQ09VTlRSWV9TVFJfTEVOXTsKLQotCS8qICBjb250YWlucyBjb3VudHJ5IHN0cmluZywgbGVuIGlzIDMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgKHBCdEhjaUluZm8tPkJ0UHJlQ2hubExpc3RMZW4tQ09VTlRSWV9TVFJfTEVOKTsgaSArPSAzLCBwVHJpcGxlKyspIHsKLQkJLyogICovCi0JCS8qICBjaGVjayBldmVyeSB0cmlwbGV0LCBhbiB0cmlwbGV0IG1heSBiZSAqLwotCQkvKiAgcmVndWxhdG9yeSBleHRlbnNpb24gaWRlbnRpZmllciBvciBzdWItYmFuZCB0cmlwbGV0ICovCi0JCS8qICAqLwotCQlpZiAocFRyaXBsZS0+Ynl0ZV8xc3QgPT0gMHhjOSkgewotCQkJLyogIFJlZ3VsYXRvcnkgRXh0ZW5zaW9uIElkZW50aWZpZXIsIHNraXAgaXQgKi8KLQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLAotCQkJCSgiRmluZCBSZWd1bGF0b3J5IElELCByZWd1bGF0b3J5IGNsYXNzID0gJWRcbiIsIHBUcmlwbGUtPmJ5dGVfMm5kKSk7Ci0JCQlyZWd1bGF0b3J5X3NraXBMZW4gKz0gMzsKLQkJCXBUcmlwbGVfc3ViYmFuZCA9IE5VTEw7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsJLyogIFN1Yi1iYW5kIHRyaXBsZXQgKi8KLQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIkZpbmQgU3ViLWJhbmQgdHJpcGxldCBcbiIpKTsKLQkJCXN1YmJhbmRUcmlwbGV0Q250Kys7Ci0JCQlwVHJpcGxlX3N1YmJhbmQgPSAoc3RydWN0IGNobmxfdHhwb3dlcl90cmlwbGUgKilwVHJpcGxlOwotCQkJLyogIGlmIHJlbW90ZSBmaXJzdCBsZWdhbCBjaGFubmVsIG5vdCBmb3VuZCwgdGhlbiBmaW5kIGZpcnN0IHJlbW90ZSBjaGFubmVsICovCi0JCQkvKiAgYW5kIGl0J3MgbGVnYWwgZm9yIG91ciBjaGFubmVsIHBsYW4uICovCi0KLQkJCS8qICBzZWFyY2ggdGhlIHN1Yi1iYW5kIHRyaXBsZXQgYW5kIGZpbmQgaWYgcmVtb3RlIGNoYW5uZWwgaXMgbGVnYWwgdG8gb3VyIGNoYW5uZWwgcGxhbi4gKi8KLQkJCWZvciAoaiA9IHBUcmlwbGVfc3ViYmFuZC0+Rmlyc3RDaG5sOyBqIDwgKHBUcmlwbGVfc3ViYmFuZC0+Rmlyc3RDaG5sK3BUcmlwbGVfc3ViYmFuZC0+TnVtQ2hubHMpOyBqKyspIHsKLQkJCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCIgQ2hlY2sgaWYgY2hubCglZCkgaXMgbGVnYWxcbiIsIGopKTsKLQkJCQlpZiAoQlRfSXNMZWdhbENoYW5uZWwocGFkYXB0ZXIsIGopKSB7Ci0JCQkJCS8qICByZW1vdGUgY2hhbm5lbCBpcyBsZWdhbCBmb3Igb3VyIGNoYW5uZWwgcGxhbi4gKi8KLQkJCQkJZmlyc3RSZW1vdGVMZWdhbENobmxJblRyaXBsZXQgPSBqOwotCQkJCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwKLQkJCQkJCSgiRmluZCBmaXJzdCByZW1vdGUgbGVnYWwgY2hhbm5lbCA6ICVkXG4iLAotCQkJCQkJZmlyc3RSZW1vdGVMZWdhbENobmxJblRyaXBsZXQpKTsKLQotCQkJCQkvKiAgSWYgd2UgZmluZCBhIHJlbW90ZSBsZWdhbCBjaGFubmVsIGluIHRoZSBzdWItYmFuZCB0cmlwbGV0ICovCi0JCQkJCS8qICBhbmQgb25seSBCVCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkKGxvY2FsIG5vdCBjb25uZWN0IHRvIGFueSBBUCBvciBJQlNTKSwgKi8KLQkJCQkJLyogIHRoZW4gd2UganVzdCBzd2l0Y2ggY2hhbm5lbCB0byByZW1vdGUgY2hhbm5lbC4gKi8KLQkJCQkJaWYgKCEoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVNPQ19TVEFURXxXSUZJX0FESE9DX1NUQVRFfFdJRklfQVBfU1RBVEUpIHx8Ci0JCQkJCSAgICBCVEhDSV9Ic0Nvbm5lY3Rpb25Fc3RhYmxpc2hlZChwYWRhcHRlcikpKSB7Ci0JCQkJCQlwQnRNZ250LT5CVENoYW5uZWwgPSBmaXJzdFJlbW90ZUxlZ2FsQ2hubEluVHJpcGxldDsKLQkJCQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIlJlbW90ZSBsZWdhbCBjaGFubmVsICglZCkgaXMgc2VsZWN0ZWQsIExvY2FsIG5vdCBjb25uZWN0IHRvIGFueSEhXG4iLCBwQnRNZ250LT5CVENoYW5uZWwpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICgobG9jYWxjaG5sID49IGZpcnN0UmVtb3RlTGVnYWxDaG5sSW5UcmlwbGV0KSAmJgotCQkJCQkJICAgIChsb2NhbGNobmwgPCAocFRyaXBsZV9zdWJiYW5kLT5GaXJzdENobmwrcFRyaXBsZV9zdWJiYW5kLT5OdW1DaG5scykpKSB7Ci0JCQkJCQkJcEJ0TWdudC0+QlRDaGFubmVsID0gbG9jYWxjaG5sOwotCQkJCQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIkxvY2FsIGNoYW5uZWwgKCVkKSBpcyBzZWxlY3RlZCwgd2lmaSBvciBCVCBjb25uZWN0aW9uIGV4aXN0c1xuIiwgcEJ0TWdudC0+QlRDaGFubmVsKSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCWlmIChzdWJiYW5kVHJpcGxldENudCkgewotCQkvKiBpZiBhbnkgcHJlZmVycmVkIGNoYW5uZWwgdHJpcGxldCBleGlzdHMgKi8KLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksICgiVGhlcmUgYXJlICVkIHN1YiBiYW5kIHRyaXBsZXQgZXhpc3RzLCAiLCBzdWJiYW5kVHJpcGxldENudCkpOwotCQlpZiAoZmlyc3RSZW1vdGVMZWdhbENobmxJblRyaXBsZXQgPT0gMCkgewotCQkJLyogbm8gbGVnYWwgY2hhbm5lbCBpcyBmb3VuZCwgcmVqZWN0IHRoZSBjb25uZWN0aW9uLiAqLwotCQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksICgibm8gbGVnYWwgY2hhbm5lbCBpcyBmb3VuZCEhXG4iKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiAgUmVtb3RlIExlZ2FsIGNoYW5uZWwgaXMgZm91bmQgYnV0IG5vdCBtYXRjaCB0byBsb2NhbCAqLwotCQkJLyogd2lmaSBjb25uZWN0aW9uIGV4aXN0cyksIHNvIHJlamVjdCB0aGUgY29ubmVjdGlvbi4gKi8KLQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLAotCQkJCSgiUmVtb3RlIExlZ2FsIGNoYW5uZWwgaXMgZm91bmQgYnV0IG5vdCBtYXRjaCB0byBsb2NhbCh3aWZpIGNvbm5lY3Rpb24gZXhpc3RzKSEhXG4iKSk7Ci0JCX0KLQkJcEJ0TWdudC0+Q2hlY2tDaG5sSXNTdWl0ID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJLyogIFRoZXJlIGFyZSBub3QgYW55IHByZWZlcnJlZCBjaGFubmVsIHRyaXBsZXQgZXhpc3RzICovCi0JCS8qICBVc2UgY3VycmVudCBsZWdhbCBjaGFubmVsIGFzIHRoZSBidCBjaGFubmVsLiAqLwotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJObyBzdWIgYmFuZCB0cmlwbGV0IGV4aXN0cyEhXG4iKSk7Ci0JfQotCXBCdE1nbnQtPkJUQ2hhbm5lbCA9IGxvY2FsY2hubDsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJMb2NhbCBjaGFubmVsICglZCkgaXMgc2VsZWN0ZWQhIVxuIiwgcEJ0TWdudC0+QlRDaGFubmVsKSk7Ci19Ci0KLS8qIFN1Y2Nlc3M6cmV0dXJuIHRydWUgKi8KLS8qIEZhaWw6cmV0dXJuIGZhbHNlICovCi1zdGF0aWMgdTggYnRoY2lfR2V0QXNzb2NJbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IEVudHJ5TnVtKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvOwotCXU4IHRlbXBCdWZbMjU2XTsKLQl1OCBpID0gMDsKLQl1OCBCYXNlTWVtb3J5U2hpZnQgPSAwOwotCXUxNglUb3RhbExlbiA9IDA7Ci0Jc3RydWN0IGFtcF9hc3NvY19zdHJ1Y3R1cmUgKnBBbXBBc29jOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJHZXRBc3NvY0luZm8gc3RhcnRcbiIpKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCi0JaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5MZW5Tb0ZhciA9PSAwKSB7Ci0JCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NSZW1MZW4gPCAoTUFYX0FNUF9BU1NPQ19GUkFHX0xFTikpCi0JCQlUb3RhbExlbiA9IHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5BTVBBc3NvY1JlbUxlbjsKLQkJZWxzZSBpZiAocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFtcEFzb2NDbWREYXRhLkFNUEFzc29jUmVtTGVuID09IChNQVhfQU1QX0FTU09DX0ZSQUdfTEVOKSkKLQkJCVRvdGFsTGVuID0gTUFYX0FNUF9BU1NPQ19GUkFHX0xFTjsKLQl9IGVsc2UgaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5MZW5Tb0ZhciA+IDApCi0JCVRvdGFsTGVuID0gcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFtcEFzb2NDbWREYXRhLkxlblNvRmFyOwotCi0Jd2hpbGUgKChwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuTGVuU29GYXIgPj0gQmFzZU1lbW9yeVNoaWZ0KSB8fCBUb3RhbExlbiA+IEJhc2VNZW1vcnlTaGlmdCkgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0RFVEFJTCwgKCJHZXRBc3NvY0luZm8sIFRvdGFsTGVuID0lZCwgQmFzZU1lbW9yeVNoaWZ0ID0lZFxuIiwgVG90YWxMZW4sIEJhc2VNZW1vcnlTaGlmdCkpOwotCQltZW1jcHkodGVtcEJ1ZiwKLQkJCSh1OCAqKXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5BTVBBc3NvY2ZyYWdtZW50K0Jhc2VNZW1vcnlTaGlmdCwKLQkJCVRvdGFsTGVuLUJhc2VNZW1vcnlTaGlmdCk7Ci0JCVJUUFJJTlRfREFUQShGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9ERVRBSUwsICJHZXRBc3NvY0luZm8gOlxuIiwKLQkJCXRlbXBCdWYsIFRvdGFsTGVuLUJhc2VNZW1vcnlTaGlmdCk7Ci0KLQkJcEFtcEFzb2MgPSAoc3RydWN0IGFtcF9hc3NvY19zdHJ1Y3R1cmUgKil0ZW1wQnVmOwotCQlsZTE2X3RvX2NwdXMoJnBBbXBBc29jLT5MZW5ndGgpOwotCQlCYXNlTWVtb3J5U2hpZnQgKz0gMyArIHBBbXBBc29jLT5MZW5ndGg7Ci0KLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJUeXBlSUQgPSAweCV4LCAiLCBwQW1wQXNvYy0+VHlwZUlEKSk7Ci0JCVJUUFJJTlRfREFUQShGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgIkhleCBEYXRhOiBcbiIsIHBBbXBBc29jLT5EYXRhLCBwQW1wQXNvYy0+TGVuZ3RoKTsKLQkJc3dpdGNoIChwQW1wQXNvYy0+VHlwZUlEKSB7Ci0JCWNhc2UgQU1QX01BQ19BRERSOgotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCI9PT4gQU1QX01BQ19BRERSXG4iKSk7Ci0JCQlpZiAocEFtcEFzb2MtPkxlbmd0aCA+IDYpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJbWVtY3B5KHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CVFJlbW90ZU1BQ0FkZHIsIHBBbXBBc29jLT5EYXRhLCA2KTsKLQkJCVJUUFJJTlRfQUREUihGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJSZW1vdGUgTWFjIGFkZHJlc3MgXG4iKSwgcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJUUmVtb3RlTUFDQWRkcik7Ci0JCQlicmVhazsKLQkJY2FzZSBBTVBfUFJFRkVSUkVEX0NIQU5ORUxfTElTVDoKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiPT0+IEFNUF9QUkVGRVJSRURfQ0hBTk5FTF9MSVNUXG4iKSk7Ci0JCQlwQnRIY2lJbmZvLT5CdFByZUNobmxMaXN0TGVuID0gcEFtcEFzb2MtPkxlbmd0aDsKLQkJCW1lbWNweShwQnRIY2lJbmZvLT5CVFByZUNobmxsaXN0LAotCQkJCXBBbXBBc29jLT5EYXRhLAotCQkJCXBCdEhjaUluZm8tPkJ0UHJlQ2hubExpc3RMZW4pOwotCQkJUlRQUklOVF9EQVRBKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAiUHJlZmVycmVkIGNoYW5uZWwgbGlzdCA6IFxuIiwgcEJ0SGNpSW5mby0+QlRQcmVDaG5sbGlzdCwgcEJ0SGNpSW5mby0+QnRQcmVDaG5sTGlzdExlbik7Ci0JCQlidGhjaV9EZWNpZGVCVENoYW5uZWwocGFkYXB0ZXIsIEVudHJ5TnVtKTsKLQkJCWJyZWFrOwotCQljYXNlIEFNUF9DT05ORUNURURfQ0hBTk5FTDoKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiPT0+IEFNUF9DT05ORUNURURfQ0hBTk5FTFxuIikpOwotCQkJcEJ0SGNpSW5mby0+QlRDb25uZWN0Q2hubExpc3RMZW4gPSBwQW1wQXNvYy0+TGVuZ3RoOwotCQkJbWVtY3B5KHBCdEhjaUluZm8tPkJUQ29ubmVjdENobmxsaXN0LAotCQkJCXBBbXBBc29jLT5EYXRhLAotCQkJCXBCdEhjaUluZm8tPkJUQ29ubmVjdENobmxMaXN0TGVuKTsKLQkJCWJyZWFrOwotCQljYXNlIEFNUF84MDIxMV9QQUxfQ0FQX0xJU1Q6Ci0JCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIj09PiBBTVBfODAyMTFfUEFMX0NBUF9MSVNUXG4iKSk7Ci0JCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQlRDYXBhYmlsaXR5ID0gKih1MzIgKikocEFtcEFzb2MtPkRhdGEpOwotCQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CVENhcGFiaWxpdHkgJiAweDAwMDAwMDAxKSB7Ci0JCQkJLyogIFRPRE86ICovCi0KLQkJCQkvKiBTaWduaWZpZXMgUEFMIGNhcGFibGUgb2YgdXRpbGl6aW5nIHJlY2VpdmVkIGFjdGl2aXR5IHJlcG9ydHMuICovCi0JCQl9Ci0JCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJUQ2FwYWJpbGl0eSAmIDB4MDAwMDAwMDIpIHsKLQkJCQkvKiAgVE9ETzogKi8KLQkJCQkvKiBTaWduaWZpZXMgUEFMIGlzIGNhcGFibGUgb2YgdXRpbGl6aW5nIHNjaGVkdWxpbmcgaW5mb3JtYXRpb24gcmVjZWl2ZWQgaW4gYW4gYWN0aXZpdHkgcmVwb3J0cy4gKi8KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEFNUF84MDIxMV9QQUxfVklTSU9OOgotCQkJcEJ0SGNpSW5mby0+QlRQYWxWZXJzaW9uID0gKih1OCAqKShwQW1wQXNvYy0+RGF0YSk7Ci0JCQlwQnRIY2lJbmZvLT5CVFBhbENvbXBhbnlJRCA9ICoodTE2ICopKCgodTggKikocEFtcEFzb2MtPkRhdGEpKSsxKTsKLQkJCXBCdEhjaUluZm8tPkJUUGFsc3VidmVyc2lvbiA9ICoodTE2ICopKCgodTggKikocEFtcEFzb2MtPkRhdGEpKSszKTsKLQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIj09PiBBTVBfODAyMTFfUEFMX1ZJU0lPTiBQYWxWZXJzaW9uICAweCV4LCBQYWxDb21wYW55SUQgIDB4JXgsIFBhbHN1YnZlcnNpb24gMHgleFxuIiwKLQkJCQlwQnRIY2lJbmZvLT5CVFBhbFZlcnNpb24sCi0JCQkJcEJ0SGNpSW5mby0+QlRQYWxDb21wYW55SUQsCi0JCQkJcEJ0SGNpSW5mby0+QlRQYWxzdWJ2ZXJzaW9uKSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiPT0+IFVuc3VwcG9ydCBUeXBlSUQgISFcbiIpKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWkrKzsKLQl9Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJHZXRBc3NvY0luZm8gZW5kXG4iKSk7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHU4IGJ0aGNpX0FkZEVudHJ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQl1OCBpOwotCi0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfQlRfQVNPQ19FTlRSWV9OVU07IGkrKykgewotCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbaV0uYlVzZWQgPT0gZmFsc2UpIHsKLQkJCXBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLmJVc2VkID0gdHJ1ZTsKLQkJCXBCdE1nbnQtPkN1cnJlbnRDb25uZWN0RW50cnlOdW0gPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoaSA9PSBNQVhfQlRfQVNPQ19FTlRSWV9OVU0pIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoImJ0aGNpX0FkZEVudHJ5KCksIEFkZCBlbnRyeSBmYWlsISFcbiIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHU4IGJ0aGNpX0Rpc2NhcmRUeFBhY2tldHMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IExMSCkKLXsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB1OAotYnRoY2lfQ2hlY2tMb2dMaW5rQmVoYXZpb3IoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgaGNpX2Zsb3dfc3BlYwkJCVR4Rmxvd1NwZWMKLQkpCi17Ci0JdTggSUQgPSBUeEZsb3dTcGVjLklkZW50aWZpZXI7Ci0JdTggU2VydmljZVR5cGUgPSBUeEZsb3dTcGVjLlNlcnZpY2VUeXBlOwotCXUxNglNYXhTRFVTaXplID0gVHhGbG93U3BlYy5NYXhpbXVtU0RVU2l6ZTsKLQl1MzIJU0RVSW50ZXJBcnJpdmF0aW1lID0gVHhGbG93U3BlYy5TRFVJbnRlckFycml2YWxUaW1lOwotCXU4IG1hdGNoID0gZmFsc2U7Ci0KLQlzd2l0Y2ggKElEKSB7Ci0JY2FzZSAxOgotCQlpZiAoU2VydmljZVR5cGUgPT0gQlRfTExfQkUpIHsKLQkJCW1hdGNoID0gdHJ1ZTsKLQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiTG9naWNhbCBMaW5rIFR5cGUgPSAgVFggYmVzdCBlZmZvcnQgZmxvd3NwZWNcbiIpKTsKLQkJfSBlbHNlIGlmICgoU2VydmljZVR5cGUgPT0gQlRfTExfR1UpICYmIChNYXhTRFVTaXplID09IDB4ZmZmZikpIHsKLQkJCW1hdGNoID0gdHJ1ZTsKLQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiTG9naWNhbCBMaW5rIFR5cGUgPSAgUlggZ3VhcmFudGVlZCBsYXRlbmN5IGZsb3dzcGVjXG4iKSk7Ci0JCX0gZWxzZSBpZiAoKFNlcnZpY2VUeXBlID09IEJUX0xMX0dVKSAmJiAoTWF4U0RVU2l6ZSA9PSAyNTAwKSkgewotCQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJMb2dpY2FsIExpbmsgVHlwZSA9ICBSWCBndWFyYW50ZWVkIExhcmdlIGxhdGVuY3kgZmxvd3NwZWNcbiIpKTsKLQkJfQotCQlicmVhazsKLQljYXNlIDI6Ci0JCWlmIChTZXJ2aWNlVHlwZSA9PSBCVF9MTF9CRSkgewotCQkJbWF0Y2ggPSB0cnVlOwotCQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJMb2dpY2FsIExpbmsgVHlwZSA9ICBSWCBiZXN0IGVmZm9ydCBmbG93c3BlY1xuIikpOwotCi0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlpZiAoKFNlcnZpY2VUeXBlID09IEJUX0xMX0dVKSAmJiAoTWF4U0RVU2l6ZSA9PSAxNDkyKSkgewotCQkJbWF0Y2ggPSB0cnVlOwotCQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJMb2dpY2FsIExpbmsgVHlwZSA9ICBUWCBndWFyYW50ZWVkIGxhdGVuY3kgZmxvd3NwZWNcbiIpKTsKLQkJfSBlbHNlIGlmICgoU2VydmljZVR5cGUgPT0gQlRfTExfR1UpICYmIChNYXhTRFVTaXplID09IDI1MDApKSB7Ci0JCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIkxvZ2ljYWwgTGluayBUeXBlID0gIFRYIGd1YXJhbnRlZWQgTGFyZ2UgbGF0ZW5jeSBmbG93c3BlY1xuIikpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJaWYgKFNlcnZpY2VUeXBlID09IEJUX0xMX0JFKSB7Ci0JCQlpZiAoKFNEVUludGVyQXJyaXZhdGltZSA9PSAweGZmZmZmZmZmKSAmJiAoU2VydmljZVR5cGUgPT0gQlRfTExfQkUpICYmIChNYXhTRFVTaXplID09IDE0OTIpKSB7Ci0JCQkJbWF0Y2ggPSB0cnVlOwotCQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiTG9naWNhbCBMaW5rIFR5cGUgPSAgVFgvUlggYWdncmVnYXRlZCBiZXN0IGVmZm9ydCBmbG93c3BlY1xuIikpOwotCQkJfQotCQl9IGVsc2UgaWYgKFNlcnZpY2VUeXBlID09IEJUX0xMX0dVKSB7Ci0JCQlpZiAoU0RVSW50ZXJBcnJpdmF0aW1lID09IDEwMCkgewotCQkJCW1hdGNoID0gdHJ1ZTsKLQkJCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIkxvZ2ljYWwgTGluayBUeXBlID0gIFRYL1JYIGd1YXJhbnRlZWQgYmFuZHdpZHRoIGZsb3dzcGVjXG4iKSk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJMb2dpY2FsIExpbmsgVHlwZSA9ICBVbmtub3cgVHlwZSAhISEhISEhIVxuIikpOwotCQlicmVhazsKLQl9Ci0KLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwKLQkJKCJJRCA9IDB4JXgsIFNlcnZpY2VUeXBlID0gMHgleCwgTWF4aW11bVNEVVNpemUgPSAweCV4LCBTRFVJbnRlckFycml2YWxUaW1lID0gMHgleCwgQWNjZXNzTGF0ZW5jeSA9IDB4JXgsIEZsdXNoVGltZW91dCA9IDB4JXhcbiIsCi0JCVR4Rmxvd1NwZWMuSWRlbnRpZmllciwgVHhGbG93U3BlYy5TZXJ2aWNlVHlwZSwgTWF4U0RVU2l6ZSwKLQkJU0RVSW50ZXJBcnJpdmF0aW1lLCBUeEZsb3dTcGVjLkFjY2Vzc0xhdGVuY3ksIFR4Rmxvd1NwZWMuRmx1c2hUaW1lb3V0KSk7Ci0JcmV0dXJuIG1hdGNoOwotfQotCi1zdGF0aWMgdTE2IGJ0aGNpX0Fzc29jTUFDQWRkcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB2b2lkCSpwYnVmKQotewotCXN0cnVjdCBhbXBfYXNzb2Nfc3RydWN0dXJlICpwQXNzb1N0cmMgPSAoc3RydWN0IGFtcF9hc3NvY19zdHJ1Y3R1cmUgKilwYnVmOwotCXBBc3NvU3RyYy0+VHlwZUlEID0gQU1QX01BQ19BRERSOwotCXBBc3NvU3RyYy0+TGVuZ3RoID0gMHgwNjsKLQltZW1jcHkoJnBBc3NvU3RyYy0+RGF0YVswXSwgcGFkYXB0ZXItPmVlcHJvbXByaXYubWFjX2FkZHIsIDYpOwotCVJUUFJJTlRfREFUQShGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwKLQkJICAgICAoIkFzc29jTUFDQWRkciA6IFxuIiksIHBBc3NvU3RyYywgcEFzc29TdHJjLT5MZW5ndGgrMyk7Ci0KLQlyZXR1cm4gcEFzc29TdHJjLT5MZW5ndGggKyAzOwotfQotCi1zdGF0aWMgdTE2Ci1idGhjaV9QQUxDYXBhYmlsaXRpZXMoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl2b2lkCSpwYnVmCi0JKQotewotCXN0cnVjdCBhbXBfYXNzb2Nfc3RydWN0dXJlICpwQXNzb1N0cmMgPSAoc3RydWN0IGFtcF9hc3NvY19zdHJ1Y3R1cmUgKilwYnVmOwotCi0JcEFzc29TdHJjLT5UeXBlSUQgPSBBTVBfODAyMTFfUEFMX0NBUF9MSVNUOwotCXBBc3NvU3RyYy0+TGVuZ3RoID0gMHgwNDsKLQotCXBBc3NvU3RyYy0+RGF0YVswXSA9IDB4MDA7Ci0JcEFzc29TdHJjLT5EYXRhWzFdID0gMHgwMDsKLQotCVJUUFJJTlRfREFUQShGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9ERVRBSUwsICgiUEFMQ2FwYWJpbGl0aWVzOlxuIiksIHBBc3NvU3RyYywgcEFzc29TdHJjLT5MZW5ndGgrMyk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0xPR08sICgiUEFMQ2FwYWJpbGl0aWVzIFxuIikpOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0xPR08sICgiIFR5cGVJRCA9IDB4JXgsXG4gTGVuZ3RoID0gMHgleCxcbiBDb250ZW50ID0gMHgwMDAwXG4iLAotCQlwQXNzb1N0cmMtPlR5cGVJRCwKLQkJcEFzc29TdHJjLT5MZW5ndGgpKTsKLQotCXJldHVybiBwQXNzb1N0cmMtPkxlbmd0aCArIDM7Ci19Ci0KLXN0YXRpYyB1MTYgYnRoY2lfQXNzb2NQcmVmZXJyZWRDaGFubmVsTGlzdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQkgICB2b2lkICpwYnVmLCB1OCBFbnRyeU51bSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBhbXBfYXNzb2Nfc3RydWN0dXJlICpwQXNzb1N0cmM7Ci0Jc3RydWN0IGFtcF9wcmVmX2NobmxfcmVndWxhdG9yeSAqcFJlZzsKLQlzdHJ1Y3QgY2hubF90eHBvd2VyX3RyaXBsZSAqcFRyaXBsZTsKLQljaGFyIGN0clN0cmluZ1szXSA9IHsnWCcsICdYJywgJ1gnfTsKLQl1MzIgbGVuID0gMDsKLQl1OCBwcmVmZXJyZWRDaG5sOwotCi0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQXNzb1N0cmMgPSAoc3RydWN0IGFtcF9hc3NvY19zdHJ1Y3R1cmUgKilwYnVmOwotCXBSZWcgPSAoc3RydWN0IGFtcF9wcmVmX2NobmxfcmVndWxhdG9yeSAqKSZwQXNzb1N0cmMtPkRhdGFbM107Ci0KLQlwcmVmZXJyZWRDaG5sID0gYnRoY2lfR2V0TG9jYWxDaGFubmVsKHBhZGFwdGVyKTsKLQlwQXNzb1N0cmMtPlR5cGVJRCA9IEFNUF9QUkVGRVJSRURfQ0hBTk5FTF9MSVNUOwotCi0JLyogIGxvY2FsZSB1bmtub3duICovCi0JbWVtY3B5KCZwQXNzb1N0cmMtPkRhdGFbMF0sICZjdHJTdHJpbmdbMF0sIDMpOwotCXBSZWctPnJlWElkID0gMjAxOwotCXBSZWctPnJlZ3VsYXRvcnlDbGFzcyA9IDI1NDsKLQlwUmVnLT5jb3ZlcmFnZUNsYXNzID0gMDsKLQlsZW4gKz0gNjsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRCB8IElPQ1RMX0JUX0xPR08pLCAoIlBSRUZFUlJFRF9DSE5MX0xJU1RcbiIpKTsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRCB8IElPQ1RMX0JUX0xPR08pLCAoIlhYWCwgMjAxLCAyNTQsIDBcbiIpKTsKLQkvKiAgYXQgdGhlIGZvbGxvd2luZywgY2hubCAxfjExIHNob3VsZCBiZSBjb250YWluZWQgKi8KLQlwVHJpcGxlID0gKHN0cnVjdCBjaG5sX3R4cG93ZXJfdHJpcGxlICopJnBBc3NvU3RyYy0+RGF0YVtsZW5dOwotCi0JLyogICgxKSBpZiBhbnkgd2lmaSBvciBidCBIUyBjb25uZWN0aW9uIGV4aXN0cyAqLwotCWlmICgocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFNUFJvbGUgPT0gQU1QX0JUQVBfQ1JFQVRPUikgfHwKLQkgICAgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9BU09DX1NUQVRFIHwKLQkJCSAgIFdJRklfQURIT0NfU1RBVEUgfCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSB8Ci0JCQkgICBXSUZJX0FQX1NUQVRFKSkgfHwKLQkgICAgQlRIQ0lfSHNDb25uZWN0aW9uRXN0YWJsaXNoZWQocGFkYXB0ZXIpKSB7Ci0JCXBUcmlwbGUtPkZpcnN0Q2hubCA9IHByZWZlcnJlZENobmw7Ci0JCXBUcmlwbGUtPk51bUNobmxzID0gMTsKLQkJcFRyaXBsZS0+TWF4VHhQb3dlckluRGJtID0gMjA7Ci0JCWxlbiArPSAzOwotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRCB8IElPQ1RMX0JUX0xPR08pLCAoIkZpcnN0IENoYW5uZWwgPSAlZCwgQ2hhbm5lbCBOdW0gPSAlZCwgTWF4RGJtID0gJWRcbiIsCi0JCQlwVHJpcGxlLT5GaXJzdENobmwsCi0JCQlwVHJpcGxlLT5OdW1DaG5scywKLQkJCXBUcmlwbGUtPk1heFR4UG93ZXJJbkRibSkpOwotCX0KLQotCXBBc3NvU3RyYy0+TGVuZ3RoID0gKHUxNilsZW47Ci0JUlRQUklOVF9EQVRBKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkFzc29jUHJlZmVycmVkQ2hhbm5lbExpc3QgOiBcbiIpLCBwQXNzb1N0cmMsIHBBc3NvU3RyYy0+TGVuZ3RoKzMpOwotCi0JcmV0dXJuIHBBc3NvU3RyYy0+TGVuZ3RoICsgMzsKLX0KLQotc3RhdGljIHUxNiBidGhjaV9Bc3NvY1BBTFZlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB2b2lkICpwYnVmKQotewotCXN0cnVjdCBhbXBfYXNzb2Nfc3RydWN0dXJlICpwQXNzb1N0cmMgPSAoc3RydWN0IGFtcF9hc3NvY19zdHJ1Y3R1cmUgKilwYnVmOwotCXU4ICpwdTFUbXA7Ci0JdTE2CSpwdTJUbXA7Ci0KLQlwQXNzb1N0cmMtPlR5cGVJRCA9IEFNUF84MDIxMV9QQUxfVklTSU9OOwotCXBBc3NvU3RyYy0+TGVuZ3RoID0gMHg1OwotCXB1MVRtcCA9ICZwQXNzb1N0cmMtPkRhdGFbMF07Ci0JKnB1MVRtcCA9IDB4MTsJLyogIFBBTCBWZXJzaW9uICovCi0JcHUyVG1wID0gKHUxNiAqKSZwQXNzb1N0cmMtPkRhdGFbMV07Ci0JKnB1MlRtcCA9IDB4NUQ7CS8qICBTSUcgQ29tcGFueSBpZGVudGlmaWVyIG9mIDgwMi4xMSBQQUwgdmVuZG9yICovCi0JcHUyVG1wID0gKHUxNiAqKSZwQXNzb1N0cmMtPkRhdGFbM107Ci0JKnB1MlRtcCA9IDB4MTsJLyogIFBBTCBTdWItdmVyc2lvbiBzcGVjaWZpZXIgKi8KLQotCVJUUFJJTlRfREFUQShGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9ERVRBSUwsICgiQXNzb2NQQUxWZXIgOiBcbiIpLCBwQXNzb1N0cmMsIHBBc3NvU3RyYy0+TGVuZ3RoKzMpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9MT0dPLCAoIkFzc29jUEFMVmVyIFxuIikpOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0xPR08sICgiIFR5cGVJRCA9IDB4JXgsXG4gTGVuZ3RoID0gMHgleCxcbiBQQUwgVmVyc2lvbiA9IDB4MDEsXG4gUEFMIHZlbmRvciA9IDB4MDEsXG4gUEFMIFN1Yi12ZXJzaW9uIHNwZWNpZmllciA9IDB4MDFcbiIsCi0JCXBBc3NvU3RyYy0+VHlwZUlELAotCQlwQXNzb1N0cmMtPkxlbmd0aCkpOwotCXJldHVybiBwQXNzb1N0cmMtPkxlbmd0aCArIDM7Ci19Ci0KLXN0YXRpYyB1OCBidGhjaV9DaGVja1JmU3RhdGVCZWZvcmVDb25uZWN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlCQlSZlN0YXRlOwotCi0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQotCVJmU3RhdGUgPSBwYWRhcHRlci0+cHdyY3RybHByaXYucmZfcHdyc3RhdGU7Ci0KLQlpZiAoUmZTdGF0ZSAhPSByZl9vbikgewotCQltb2RfdGltZXIoJnBCVEluZm8tPkJUUHNEaXNhYmxlVGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aGNpX1Jlc3BvbmRlclN0YXJ0VG9TY2FuKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci19Ci0KLXN0YXRpYyB1OCBidGhjaV9QaHlMaW5rQ29ubmVjdGlvbkluUHJvZ3Jlc3Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggUGh5TGlua0hhbmRsZSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250OwotCi0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCWlmIChwQnRNZ250LT5iUGh5TGlua0luUHJvZ3Jlc3MgJiYKLQkJKHBCdE1nbnQtPkJ0Q3VycmVudFBoeUxpbmtoYW5kbGUgPT0gUGh5TGlua0hhbmRsZSkpCi0JCXJldHVybiB0cnVlOwotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgYnRoY2lfUmVzZXRGbG93U3BlYyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbnRyeU51bSwgdTggaW5kZXgpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUaW5mbzsKLQotCXBCVGluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0KLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaW5kZXhdLkJ0TG9nTGlua2hhbmRsZSA9IDA7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2luZGV4XS5CdFBoeUxpbmtoYW5kbGUgPSAwOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uYkxMQ29tcGxldGVFdmVudElzU2V0ID0gZmFsc2U7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2luZGV4XS5iTExDYW5jZWxDTURJc1NldGFuZENvbXBsZXRlID0gZmFsc2U7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2luZGV4XS5CdFR4Rmxvd1NwZWNJRCA9IDA7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2luZGV4XS5UeFBhY2tldENvdW50ID0gMDsKLQotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uVHhfRmxvd19TcGVjLklkZW50aWZpZXIgPSAweDAxOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uVHhfRmxvd19TcGVjLlNlcnZpY2VUeXBlID0gU0VSVklDRV9CRVNUX0VGRk9SVDsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaW5kZXhdLlR4X0Zsb3dfU3BlYy5NYXhpbXVtU0RVU2l6ZSA9IDB4ZmZmZjsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaW5kZXhdLlR4X0Zsb3dfU3BlYy5TRFVJbnRlckFycml2YWxUaW1lID0gMHhmZmZmZmZmZjsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaW5kZXhdLlR4X0Zsb3dfU3BlYy5BY2Nlc3NMYXRlbmN5ID0gMHhmZmZmZmZmZjsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaW5kZXhdLlR4X0Zsb3dfU3BlYy5GbHVzaFRpbWVvdXQgPSAweGZmZmZmZmZmOwotCi0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2luZGV4XS5SeF9GbG93X1NwZWMuSWRlbnRpZmllciA9IDB4MDE7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2luZGV4XS5SeF9GbG93X1NwZWMuU2VydmljZVR5cGUgPSBTRVJWSUNFX0JFU1RfRUZGT1JUOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uUnhfRmxvd19TcGVjLk1heGltdW1TRFVTaXplID0gMHhmZmZmOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uUnhfRmxvd19TcGVjLlNEVUludGVyQXJyaXZhbFRpbWUgPSAweGZmZmZmZmZmOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uUnhfRmxvd19TcGVjLkFjY2Vzc0xhdGVuY3kgPSAweGZmZmZmZmZmOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uUnhfRmxvd19TcGVjLkZsdXNoVGltZW91dCA9IDB4ZmZmZmZmZmY7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aGNpX1Jlc2V0RW50cnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggRW50cnlOdW0pCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUaW5mbzsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQl1OCBqOwotCi0JcEJUaW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVGluZm8tPkJ0TWdudDsKLQotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5iVXNlZCA9IGZhbHNlOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CdEN1cnJlbnRTdGF0ZSA9IEhDSV9TVEFURV9ESVNDT05ORUNURUQ7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJ0TmV4dFN0YXRlID0gSENJX1NUQVRFX0RJU0NPTk5FQ1RFRDsKLQotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5BTVBBc3NvY1JlbUxlbiA9IDA7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFtcEFzb2NDbWREYXRhLkJ0UGh5TGlua2hhbmRsZSA9IDA7Ci0JaWYgKHBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5BTVBBc3NvY2ZyYWdtZW50ICE9IE5VTEwpCi0JCW1lbXNldChwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NmcmFnbWVudCwgMCwgVE9UQUxfQUxMT0NJQVRFX0FTU09DX0xFTik7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFtcEFzb2NDbWREYXRhLkxlblNvRmFyID0gMDsKLQotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdEFNUEtleVR5cGUgPSAwOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGUgPSAwOwotCW1lbXNldChwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRBTVBLZXksIDAsCi0JICAgICAgIHBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdEFNUEtleUxlbik7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0QU1QS2V5TGVuID0gMDsKLQotCS8qIDB4NjQwOyAwLjYyNW1zKjE2MDAgPSAxMDAwbXMsIDAuNjI1bXMqMTYwMDAgPSAxMDAwMG1zICovCi0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkxpbmtTdXBlcnZlcnNpb25UaW1lb3V0ID0gMHgzZTgwOwotCi0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFNUFJvbGUgPSBBTVBfQlRBUF9OT05FOwotCi0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLm1Bc3NvYyA9IGZhbHNlOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5iNHdheVN1Y2Nlc3MgPSBmYWxzZTsKLQotCS8qICBSZXNldCBCVCBXUEEgKi8KLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uS2V5UmVwbGF5Q291bnRlciA9IDA7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJUV1BBQXV0aFN0YXRlID0gU1RBVEVfV1BBX0FVVEhfVU5JTklUSUFMSVpFRDsKLQotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5iU2VuZFN1cGVydmlzaW9uUGFja2V0ID0gZmFsc2U7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLk5vUnhQa3RDbnQgPSAwOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5TaG9ydFJhbmdlTW9kZSA9IDA7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLnJ4U3V2cFBrdENudCA9IDA7Ci0KLQlmb3IgKGogPSAwOyBqIDwgTUFYX0xPR0lDQUxfTElOS19OVU07IGorKykKLQkJYnRoY2lfUmVzZXRGbG93U3BlYyhwYWRhcHRlciwgRW50cnlOdW0sIGopOwotCi0JcEJ0TWdudC0+QlRBdXRoQ291bnQgPSAwOwotCXBCdE1nbnQtPkJUQXNvY0NvdW50ID0gMDsKLQlwQnRNZ250LT5CVEN1cnJlbnRDb25uZWN0VHlwZSA9IEJUX0RJU0NPTk5FQ1Q7Ci0JcEJ0TWdudC0+QlRSZWNlaXZlQ29ubmVjdFBrdCA9IEJUX0RJU0NPTk5FQ1Q7Ci0KLQlIQUxCVF9SZW1vdmVLZXkocGFkYXB0ZXIsIEVudHJ5TnVtKTsKLX0KLQotc3RhdGljIHZvaWQgYnRoY2lfUmVtb3ZlRW50cnlCeUVudHJ5TnVtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IEVudHJ5TnVtKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JYnRoY2lfUmVzZXRFbnRyeShwYWRhcHRlciwgRW50cnlOdW0pOwotCi0JaWYgKHBCdE1nbnQtPkN1cnJlbnRCVENvbm5lY3Rpb25DbnQgPiAwKQotCQlwQnRNZ250LT5DdXJyZW50QlRDb25uZWN0aW9uQ250LS07Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIEZsYWddLCBDdXJyZW50QlRDb25uZWN0aW9uQ250ID0gJWQhIVxuIiwKLQkJcEJ0TWdudC0+Q3VycmVudEJUQ29ubmVjdGlvbkNudCkpOwotCi0JaWYgKHBCdE1nbnQtPkN1cnJlbnRCVENvbm5lY3Rpb25DbnQgPiAwKSB7Ci0JCXBCdE1nbnQtPkJ0T3BlcmF0aW9uT24gPSB0cnVlOwotCX0gZWxzZSB7Ci0JCXBCdE1nbnQtPkJ0T3BlcmF0aW9uT24gPSBmYWxzZTsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBGbGFnXSwgQnQgT3BlcmF0aW9uIE9GRiEhXG4iKSk7Ci0JfQotCi0JaWYgKCFwQnRNZ250LT5CdE9wZXJhdGlvbk9uKSB7Ci0JCWRlbF90aW1lcl9zeW5jKCZwQlRJbmZvLT5CVEhDSURpc2NhcmRBY2xEYXRhVGltZXIpOwotCQlkZWxfdGltZXJfc3luYygmcEJUSW5mby0+QlRCZWFjb25UaW1lcik7Ci0JCXBCdE1nbnQtPmJTdGFydFNlbmRTdXBlcnZpc2lvblBrdCA9IGZhbHNlOwotCX0KLX0KLQotc3RhdGljIHU4Ci1idGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoCi0JdTggKnBidWYsCi0JdTE2CQlPR0YsCi0JdTE2CQlPQ0YsCi0JZW51bSBoY2lfc3RhdHVzCXN0YXR1cwotCSkKLXsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKXBidWY7Ci0JdTggTnVtSENJX0NvbW0gPSAweDE7Ci0KLQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9DT01NQU5EX0NPTVBMRVRFOwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVswXSA9IE51bUhDSV9Db21tOwkvKiBwYWNrZXQgIyAqLwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsxXSA9IEhDSU9QQ09ERUxPVyhPQ0YsIE9HRik7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzJdID0gSENJT1BDT0RFSElHSFQoT0NGLCBPR0YpOwotCi0JaWYgKE9HRiA9PSBPR0ZfRVhURU5TSU9OKSB7Ci0JCWlmIChPQ0YgPT0gSENJX1NFVF9SU1NJX1ZBTFVFKSB7Ci0JCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UX1BFUklPRElDQUwpLAotCQkJCSgiW0JUIGV2ZW50XSwgQ29tbWFuZENvbXBsZXRlLCBOdW1fSENJX0NvbW0gPSAweCV4LCBPcGNvZGUgPSAweCUwMnglMDJ4LCBzdGF0dXMgPSAweCV4LCBPR0YgPSAweCV4LCBPQ0YgPSAweCV4XG4iLAotCQkJCU51bUhDSV9Db21tLCAoSENJT1BDT0RFSElHSFQoT0NGLCBPR0YpKSwgKEhDSU9QQ09ERUxPVyhPQ0YsIE9HRikpLCBzdGF0dXMsIE9HRiwgT0NGKSk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRF9FWFQpLAotCQkJCSgiW0JUIGV2ZW50XSwgQ29tbWFuZENvbXBsZXRlLCBOdW1fSENJX0NvbW0gPSAweCV4LCBPcGNvZGUgPSAweCUwMnglMDJ4LCBzdGF0dXMgPSAweCV4LCBPR0YgPSAweCV4LCBPQ0YgPSAweCV4XG4iLAotCQkJCU51bUhDSV9Db21tLCAoSENJT1BDT0RFSElHSFQoT0NGLCBPR0YpKSwgKEhDSU9QQ09ERUxPVyhPQ0YsIE9HRikpLCBzdGF0dXMsIE9HRiwgT0NGKSk7Ci0JCX0KLQl9IGVsc2UgewotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLAotCQkJKCJbQlQgZXZlbnRdLCBDb21tYW5kQ29tcGxldGUsIE51bV9IQ0lfQ29tbSA9IDB4JXgsIE9wY29kZSA9IDB4JTAyeCUwMngsIHN0YXR1cyA9IDB4JXgsIE9HRiA9IDB4JXgsIE9DRiA9IDB4JXhcbiIsCi0JCQlOdW1IQ0lfQ29tbSwgKEhDSU9QQ09ERUhJR0hUKE9DRiwgT0dGKSksIChIQ0lPUENPREVMT1coT0NGLCBPR0YpKSwgc3RhdHVzLCBPR0YsIE9DRikpOwotCX0KLQlyZXR1cm4gMzsKLX0KLQotc3RhdGljIHU4IGJ0aGNpX0V4dGVuc2lvbkV2ZW50SGVhZGVyUnRrKHU4ICpwYnVmLCB1OCBleHRlbnNpb25FdmVudCkKLXsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKXBidWY7Ci0JUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfRVhURU5TSU9OX1JUSzsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMF0gPSBleHRlbnNpb25FdmVudDsJLyogZXh0ZW5zaW9uIGV2ZW50IGNvZGUgKi8KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgZW51bSBydF9zdGF0dXMKLWJ0aGNpX0luZGljYXRlRXZlbnQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl2b2lkCQkqcEV2bnREYXRhLAotCXUzMgkJZGF0YUxlbgotCSkKLXsKLQlyZXR1cm4gUGxhdGZvcm1JbmRpY2F0ZUJURXZlbnQocGFkYXB0ZXIsIHBFdm50RGF0YSwgZGF0YUxlbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudFdyaXRlUmVtb3RlQW1wQXNzb2MoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQllbnVtIGhjaV9zdGF0dXMJc3RhdHVzLAotCXU4IFBMSGFuZGxlCi0JKQotewotCXU4IGxvY2FsQnVmW1RtcExvY2FsQnVmU2l6ZV0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCVBsYXRmb3JtWmVyb01lbW9yeSgmbG9jYWxCdWZbMF0sIFRtcExvY2FsQnVmU2l6ZSk7Ci0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfU1RBVFVTX1BBUkFNRVRFUlMsCi0JCUhDSV9XUklURV9SRU1PVEVfQU1QX0FTU09DLAotCQlzdGF0dXMpOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIlBoeUxpbmtIYW5kbGUgPSAweCV4LCBzdGF0dXMgPSAlZFxuIiwgUExIYW5kbGUsIHN0YXR1cykpOwotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JcFJldFBhclsxXSA9IFBMSGFuZGxlOwotCWxlbiArPSAyOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudEVuaGFuY2VkRmx1c2hDb21wbGV0ZSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXUxNgkJCQkJTExICi0JKQotewotCXU4IGxvY2FsQnVmWzRdID0gIiI7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5ULCAoIkV2ZW50RW5oYW5jZWRGbHVzaENvbXBsZXRlLCBMTEggPSAweCV4XG4iLCBMTEgpKTsKLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0JUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfRU5IQU5DRURfRkxVU0hfQ09NUExFVEU7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSAyOwotCS8qIExvZ2ljYWwgbGluayBoYW5kbGUgKi8KLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMF0gPSBUV09CWVRFX0xPV0JZVEUoTExIKTsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBUV09CWVRFX0hJR0hUQllURShMTEgpOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCA0KTsKLX0KLQotc3RhdGljIHZvaWQKLWJ0aGNpX0V2ZW50U2hvcnRSYW5nZU1vZGVDaGFuZ2VDb21wbGV0ZSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCWVudW0gaGNpX3N0YXR1cwkJCQlIY2lTdGF0dXMsCi0JdTggCQlTaG9ydFJhbmdlU3RhdGUsCi0JdTggCQlFbnRyeU51bQotCSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JdTggbG9jYWxCdWZbNV0gPSAiIjsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQlpZiAoIShwQnRIY2lJbmZvLT5CVEV2ZW50TWFza1BhZ2UyICYgRU1QMl9IQ0lfRVZFTlRfU0hPUlRfUkFOR0VfTU9ERV9DSEFOR0VfQ09NUExFVEUpKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwKLQkJCSgiW0JUIGV2ZW50XSwgU2hvcnQgUmFuZ2UgTW9kZSBDaGFuZ2UgQ29tcGxldGUsIElnbm9yZSB0byBzZW5kIHRoaXMgZXZlbnQgZHVlIHRvIGV2ZW50IG1hc2sgcGFnZSAyXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5ULCAoIltCVCBldmVudF0sIFNob3J0IFJhbmdlIE1vZGUgQ2hhbmdlIENvbXBsZXRlLCBTdGF0dXMgPSAlZFxuICwgUExIID0gMHgleFxuLCBTaG9ydF9SYW5nZV9Nb2RlX1N0YXRlID0gMHgleFxuIiwKLQkJSGNpU3RhdHVzLCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlLCBTaG9ydFJhbmdlU3RhdGUpKTsKLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0JUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfU0hPUlRfUkFOR0VfTU9ERV9DSEFOR0VfQ09NUExFVEU7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSAzOwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVswXSA9IEhjaVN0YXR1czsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlOwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsyXSA9IFNob3J0UmFuZ2VTdGF0ZTsKLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIDUpOwotfQotCi1zdGF0aWMgdm9pZCBidGhjaV9FdmVudFNlbmRGbG93U3BlY01vZGlmeUNvbXBsZXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJCQkgIGVudW0gaGNpX3N0YXR1cyBIY2lTdGF0dXMsCi0JCQkJCQkgIHUxNiBsb2dpY0hhbmRsZSkKLXsKLQl1OCBsb2NhbEJ1Zls1XSA9ICIiOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0KLQlpZiAoIShwQnRIY2lJbmZvLT5CVEV2ZW50TWFza1BhZ2UyICYgRU1QMl9IQ0lfRVZFTlRfRkxPV19TUEVDX01PRElGWV9DT01QTEVURSkpIHsKLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwKLQkJCSgiW0JUIGV2ZW50XSwgRmxvdyBTcGVjIE1vZGlmeSBDb21wbGV0ZSwgSWdub3JlIHRvIHNlbmQgdGhpcyBldmVudCBkdWUgdG8gZXZlbnQgbWFzayBwYWdlIDJcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLAotCQkoIltCVCBldmVudF0sIEZsb3cgU3BlYyBNb2RpZnkgQ29tcGxldGUsIHN0YXR1cyA9IDB4JXgsIExMSCA9IDB4JXhcbiIsIEhjaVN0YXR1cywgbG9naWNIYW5kbGUpKTsKLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX0ZMT1dfU1BFQ19NT0RJRllfQ09NUExFVEU7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSAzOwotCi0JUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gSGNpU3RhdHVzOwotCS8qIExvZ2ljYWwgbGluayBoYW5kbGUgKi8KLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBUV09CWVRFX0xPV0JZVEUobG9naWNIYW5kbGUpOwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsyXSA9IFRXT0JZVEVfSElHSFRCWVRFKGxvZ2ljSGFuZGxlKTsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgNSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudEV4dFdpZmlTY2FuTm90aWZ5KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JdTggCQkJc2NhblR5cGUKLQkpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0JdTggbGVuID0gMDsKLQl1OCBsb2NhbEJ1Zls3XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4ICpwdTFUZW1wOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCWlmICghcEJ0TWdudC0+QnRPcGVyYXRpb25PbikKLQkJcmV0dXJuOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9FeHRlbnNpb25FdmVudEhlYWRlclJ0aygmbG9jYWxCdWZbMF0sIEhDSV9FVkVOVF9FWFRfV0lGSV9TQ0FOX05PVElGWSk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcHUxVGVtcCA9ICh1OCAqKSZwUmV0UGFyWzBdOwotCSpwdTFUZW1wID0gc2NhblR5cGU7Ci0JbGVuICs9IDE7Ci0KLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWlmIChidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKSA9PSBSVF9TVEFUVVNfU1VDQ0VTUykgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfRVZFTlQsICgiW0JUIGV2ZW50XSwgV2lmaSBzY2FuIG5vdGlmeSwgc2NhbiB0eXBlID0gJWRcbiIsCi0JCQlzY2FuVHlwZSkpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWJ0aGNpX0V2ZW50QU1QUmVjZWl2ZXJSZXBvcnQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl1OCBSZWFzb24KLQkpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCi0JaWYgKHBCdEhjaUluZm8tPmJUZXN0TmVlZFJlcG9ydCkgewotCQl1OCBsb2NhbEJ1ZlsyMF0gPSAiIjsKLQkJdTMyCSpwdTRUZW1wOwotCQl1MTYJKnB1MlRlbXA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIiBIQ0lfRVZFTlRfQU1QX1JFQ0VJVkVSX1JFUE9SVFxuIikpOwotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9BTVBfUkVDRUlWRVJfUkVQT1JUOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IDI7Ci0KLQkJUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gcEJ0SGNpSW5mby0+VGVzdEN0clR5cGU7Ci0KLQkJUFBhY2tldElycEV2ZW50LT5EYXRhWzFdID0gUmVhc29uOwotCi0JCXB1NFRlbXAgPSAodTMyICopJlBQYWNrZXRJcnBFdmVudC0+RGF0YVsyXTsKLQkJKnB1NFRlbXAgPSBwQnRIY2lJbmZvLT5UZXN0RXZlbnRUeXBlOwotCi0JCXB1MlRlbXAgPSAodTE2ICopJlBQYWNrZXRJcnBFdmVudC0+RGF0YVs2XTsKLQkJKnB1MlRlbXAgPSBwQnRIY2lJbmZvLT5UZXN0TnVtT2ZGcmFtZTsKLQotCQlwdTJUZW1wID0gKHUxNiAqKSZQUGFja2V0SXJwRXZlbnQtPkRhdGFbOF07Ci0JCSpwdTJUZW1wID0gcEJ0SGNpSW5mby0+VGVzdE51bU9mRXJyRnJhbWU7Ci0KLQkJcHU0VGVtcCA9ICh1MzIgKikmUFBhY2tldElycEV2ZW50LT5EYXRhWzEwXTsKLQkJKnB1NFRlbXAgPSBwQnRIY2lJbmZvLT5UZXN0TnVtT2ZCaXRzOwotCi0JCXB1NFRlbXAgPSAodTMyICopJlBQYWNrZXRJcnBFdmVudC0+RGF0YVsxNF07Ci0JCSpwdTRUZW1wID0gcEJ0SGNpSW5mby0+VGVzdE51bU9mRXJyQml0czsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIDIwKTsKLQotCQkvKiBSZXR1cm4gdG8gSWRlbCBzdGF0ZSB3aXRoIFJYIGFuZCBUWCBvZmYuICovCi0KLQl9Ci0KLQlwQnRIY2lJbmZvLT5UZXN0TnVtT2ZGcmFtZSA9IDB4MDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudENoYW5uZWxTZWxlY3RlZCgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXU4IAlFbnRyeU51bQotCSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JdTggbG9jYWxCdWZbM10gPSAiIjsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQlpZiAoIShwQnRIY2lJbmZvLT5CVEV2ZW50TWFza1BhZ2UyICYgRU1QMl9IQ0lfRVZFTlRfQ0hBTk5FTF9TRUxFQ1QpKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwKLQkJCSgiW0JUIGV2ZW50XSwgQ2hhbm5lbCBTZWxlY3RlZCwgSWdub3JlIHRvIHNlbmQgdGhpcyBldmVudCBkdWUgdG8gZXZlbnQgbWFzayBwYWdlIDJcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVHxJT0NUTF9TVEFURSwKLQkJKCJbQlQgZXZlbnRdLCBDaGFubmVsIFNlbGVjdGVkLCBQaHlMaW5rSGFuZGxlICVkXG4iLAotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlKSk7Ci0KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX0NIQU5ORUxfU0VMRUNUOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gMTsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMF0gPSBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlOwotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgMyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudERpc2Nvbm5lY3RQaHlMaW5rQ29tcGxldGUoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQllbnVtIGhjaV9zdGF0dXMJCQkJSGNpU3RhdHVzLAotCWVudW0gaGNpX3N0YXR1cwkJCQlSZWFzb24sCi0JdTggCQlFbnRyeU51bQotCSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JdTggbG9jYWxCdWZbNV0gPSAiIjsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQlpZiAoIShwQnRIY2lJbmZvLT5CVEV2ZW50TWFza1BhZ2UyICYgRU1QMl9IQ0lfRVZFTlRfRElTQ09OTkVDVF9QSFlfTElOS19DT01QTEVURSkpIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5ULAotCQkJKCJbQlQgZXZlbnRdLCBEaXNjb25uZWN0IFBoeXNpY2FsIExpbmsgQ29tcGxldGUsIElnbm9yZSB0byBzZW5kIHRoaXMgZXZlbnQgZHVlIHRvIGV2ZW50IG1hc2sgcGFnZSAyXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5ULAotCQkoIltCVCBldmVudF0sIERpc2Nvbm5lY3QgUGh5c2ljYWwgTGluayBDb21wbGV0ZSwgU3RhdHVzID0gMHgleCwgUExIID0gMHgleCBSZWFzb24gPSAweCV4XG4iLAotCQlIY2lTdGF0dXMsIHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGUsIFJlYXNvbikpOwotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0JUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfRElTQ09OTkVDVF9QSFlfTElOS19DT01QTEVURTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IDM7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gSGNpU3RhdHVzOwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsxXSA9IHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGU7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzJdID0gUmVhc29uOwotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgNSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudFBoeXNpY2FsTGlua0NvbXBsZXRlKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JZW51bSBoY2lfc3RhdHVzCQkJCUhjaVN0YXR1cywKLQl1OCAJCUVudHJ5TnVtLAotCXU4IAkJUExIYW5kbGUKLQkpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0JdTggbG9jYWxCdWZbNF0gPSAiIjsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0JdTggUExfaGFuZGxlOwotCi0JcEJ0TWdudC0+YlBoeUxpbmtJblByb2dyZXNzID0gZmFsc2U7Ci0JcEJ0RGJnLT5kYmdIY2lJbmZvLmhjaUNtZFBoeUxpbmtTdGF0dXMgPSBIY2lTdGF0dXM7Ci0JaWYgKCEocEJ0SGNpSW5mby0+QlRFdmVudE1hc2tQYWdlMiAmIEVNUDJfSENJX0VWRU5UX1BIWV9MSU5LX0NPTVBMRVRFKSkgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfRVZFTlQsCi0JCQkoIltCVCBldmVudF0sIFBoeXNpY2FsIExpbmsgQ29tcGxldGUsIElnbm9yZSB0byBzZW5kIHRoaXMgZXZlbnQgZHVlIHRvIGV2ZW50IG1hc2sgcGFnZSAyXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoRW50cnlOdW0gPT0gMHhmZikgewotCQkvKiAgY29ubmVjdGlvbiBub3Qgc3RhcnRlZCB5ZXQsIGp1c3QgdXNlIHRoZSBpbnB1dCBwaHlzaWNhbCBsaW5rIGhhbmRsZSB0byByZXNwb25zZS4gKi8KLQkJUExfaGFuZGxlID0gUExIYW5kbGU7Ci0JfSBlbHNlIHsKLQkJLyogIGNvbm5lY3Rpb24gaXMgdW5kZXIgcHJvZ3Jlc3MsIHVzZSB0aGUgcGh5IGxpbmsgaGFuZGxlIHdlIHJlY29yZGVkLiAqLwotCQlQTF9oYW5kbGUgID0gcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0UGh5TGlua2hhbmRsZTsKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLmJOZWVkUGh5c0xpbmtDb21wbGV0ZUV2ZW50ID0gZmFsc2U7Ci0JfQotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5ULCAoIltCVCBldmVudF0sIFBoeXNpY2FsIExpbmsgQ29tcGxldGUsIFN0YXR1cyA9IDB4JXggUGh5TGlua0hhbmRsZSA9IDB4JXhcbiIsIEhjaVN0YXR1cywKLQkJUExfaGFuZGxlKSk7Ci0KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX1BIWV9MSU5LX0NPTVBMRVRFOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gMjsKLQotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVswXSA9IEhjaVN0YXR1czsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBQTF9oYW5kbGU7Ci0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCA0KTsKLQotfQotCi1zdGF0aWMgdm9pZAotYnRoY2lfRXZlbnRDb21tYW5kU3RhdHVzKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JdTggCQlPR0YsCi0JdTE2CQkJCQlPQ0YsCi0JZW51bSBoY2lfc3RhdHVzCQkJCUhjaVN0YXR1cwotCSkKLXsKLQotCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCXU4IE51bV9IY2lfQ29tbSA9IDB4MTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfRVZFTlQsCi0JCSgiW0JUIGV2ZW50XSwgQ29tbWFuZFN0YXR1cywgT3Bjb2RlID0gMHglMDJ4JTAyeCwgT0dGID0gMHgleCwgIE9DRiA9IDB4JXgsIFN0YXR1cyA9IDB4JXgsIE51bV9IQ0lfQ09NTSA9IDB4JXhcbiIsCi0JCShIQ0lPUENPREVISUdIVChPQ0YsIE9HRikpLCAoSENJT1BDT0RFTE9XKE9DRiwgT0dGKSksIE9HRiwgT0NGLCBIY2lTdGF0dXMsIE51bV9IY2lfQ29tbSkpOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9DT01NQU5EX1NUQVRVUzsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IDQ7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gSGNpU3RhdHVzOwkvKiBjdXJyZW50IHBlbmRpbmcgKi8KLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBOdW1fSGNpX0NvbW07CS8qIHBhY2tldCAjICovCi0JUFBhY2tldElycEV2ZW50LT5EYXRhWzJdID0gSENJT1BDT0RFTE9XKE9DRiwgT0dGKTsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbM10gPSBIQ0lPUENPREVISUdIVChPQ0YsIE9HRik7Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIDYpOwotCi19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudExvZ2ljYWxMaW5rQ29tcGxldGUoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQllbnVtIGhjaV9zdGF0dXMJCQkJSGNpU3RhdHVzLAotCXU4IAkJUGh5TGlua0hhbmRsZSwKLQl1MTYJCQkJCUxvZ0xpbmtIYW5kbGUsCi0JdTggCQlMb2dMaW5rSW5kZXgsCi0JdTggCQlFbnRyeU51bQotCSkKLXsKLS8qUE1HTlRfSU5GTyBwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1OCBsb2NhbEJ1Zls3XSA9ICIiOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCWlmICghKHBCdEhjaUluZm8tPkJURXZlbnRNYXNrUGFnZTIgJiBFTVAyX0hDSV9FVkVOVF9MT0dJQ0FMX0xJTktfQ09NUExFVEUpKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwKLQkJCSgiW0JUIGV2ZW50XSwgTG9naWNhbCBMaW5rIENvbXBsZXRlLCBJZ25vcmUgdG8gc2VuZCB0aGlzIGV2ZW50IGR1ZSB0byBldmVudCBtYXNrIHBhZ2UgMlxuIikpOwotCQlyZXR1cm47Ci0JfQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwgKCJbQlQgZXZlbnRdLCBMb2dpY2FsIExpbmsgQ29tcGxldGUsIFBoeUxpbmtIYW5kbGUgPSAweCV4LCAgTG9nTGlua0hhbmRsZSA9IDB4JXgsIFN0YXR1cyA9IDB4JXhcbiIsCi0JCVBoeUxpbmtIYW5kbGUsIExvZ0xpbmtIYW5kbGUsIEhjaVN0YXR1cykpOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9MT0dJQ0FMX0xJTktfQ09NUExFVEU7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSA1OwotCi0JUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gSGNpU3RhdHVzOy8qIHN0YXR1cyBjb2RlICovCi0JLyogTG9naWNhbCBsaW5rIGhhbmRsZSAqLwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsxXSA9IFRXT0JZVEVfTE9XQllURShMb2dMaW5rSGFuZGxlKTsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMl0gPSBUV09CWVRFX0hJR0hUQllURShMb2dMaW5rSGFuZGxlKTsKLQkvKiBQaHlzaWNhbCBsaW5rIGhhbmRsZSAqLwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVszXSA9IFRXT0JZVEVfTE9XQllURShQaHlMaW5rSGFuZGxlKTsKLQkvKiBjb3JyZXNwb25kaW5nIFR4IGZsb3cgc3BlYyBJRCAqLwotCWlmIChIY2lTdGF0dXMgPT0gSENJX1NUQVRVU19TVUNDRVNTKSB7Ci0JCVBQYWNrZXRJcnBFdmVudC0+RGF0YVs0XSA9Ci0JCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbTG9nTGlua0luZGV4XS5UeF9GbG93X1NwZWMuSWRlbnRpZmllcjsKLQl9IGVsc2UgewotCQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbNF0gPSAweDA7Ci0JfQotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCA3KTsKLX0KLQotc3RhdGljIHZvaWQKLWJ0aGNpX0V2ZW50RGlzY29ubmVjdExvZ2ljYWxMaW5rQ29tcGxldGUoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQllbnVtIGhjaV9zdGF0dXMJCQkJSGNpU3RhdHVzLAotCXUxNgkJCQkJTG9nTGlua0hhbmRsZSwKLQllbnVtIGhjaV9zdGF0dXMJCQkJUmVhc29uCi0JKQotewotCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCWlmICghKHBCdEhjaUluZm8tPkJURXZlbnRNYXNrUGFnZTIgJiBFTVAyX0hDSV9FVkVOVF9ESVNDT05ORUNUX0xPR0lDQUxfTElOS19DT01QTEVURSkpIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5ULCAoIltCVCBldmVudF0sIERpc2Nvbm5lY3QgTG9naWNhbCBMaW5rIENvbXBsZXRlLCBJZ25vcmUgdG8gc2VuZCB0aGlzIGV2ZW50IGR1ZSB0byBldmVudCBtYXNrIHBhZ2UgMlxuIikpOwotCQlyZXR1cm47Ci0JfQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwgKCJbQlQgZXZlbnRdLCBEaXNjb25uZWN0IExvZ2ljYWwgTGluayBDb21wbGV0ZSwgU3RhdHVzID0gMHgleCwgTExIID0gMHgleCBSZWFzb24gPSAweCV4XG4iLCBIY2lTdGF0dXMsIExvZ0xpbmtIYW5kbGUsIFJlYXNvbikpOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9ESVNDT05ORUNUX0xPR0lDQUxfTElOS19DT01QTEVURTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IDQ7Ci0KLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMF0gPSBIY2lTdGF0dXM7Ci0JLyogTG9naWNhbCBsaW5rIGhhbmRsZSAqLwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsxXSA9IFRXT0JZVEVfTE9XQllURShMb2dMaW5rSGFuZGxlKTsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMl0gPSBUV09CWVRFX0hJR0hUQllURShMb2dMaW5rSGFuZGxlKTsKLQkvKiBEaXNjb25uZWN0IHJlYXNvbiAqLwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVszXSA9IFJlYXNvbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgNik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudEZsdXNoT2NjdXJyZWQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl1MTYJCQkJCUxvZ0xpbmtIYW5kbGUKLQkpCi17Ci0JdTggbG9jYWxCdWZbNF0gPSAiIjsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5ULCAoImJ0aGNpX0V2ZW50Rmx1c2hPY2N1cnJlZCgpLCBMTEggPSAweCV4XG4iLCBMb2dMaW5rSGFuZGxlKSk7Ci0KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX0ZMVVNIX09DQ1JVRUQ7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSAyOwotCS8qIExvZ2ljYWwgbGluayBoYW5kbGUgKi8KLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMF0gPSBUV09CWVRFX0xPV0JZVEUoTG9nTGlua0hhbmRsZSk7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzFdID0gVFdPQllURV9ISUdIVEJZVEUoTG9nTGlua0hhbmRsZSk7Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIDQpOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9CdWlsZFBoeXNpY2FsTGluaygKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kLAotCXUxNglPQ0YKLSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQl1OCBFbnRyeU51bSwgUExIOwotCi0JLyogU2VuZCBIQ0kgQ29tbWFuZCBzdGF0dXMgZXZlbnQgdG8gQU1QLiAqLwotCWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cyhwYWRhcHRlciwKLQkJCUxJTktfQ09OVFJPTF9DT01NQU5EUywKLQkJCU9DRiwKLQkJCUhDSV9TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlQTEggPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCi0JLyogIENoZWNrIGlmIHJlc291cmNlIG9yIGJ0IGNvbm5lY3Rpb24gaXMgdW5kZXIgcHJvZ3Jlc3MsIGlmIHllcywgcmVqZWN0IHRoZSBsaW5rIGNyZWF0aW9uLiAqLwotCWlmICghYnRoY2lfQWRkRW50cnkocGFkYXB0ZXIpKSB7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfQ09OTkVDVF9SSlRfTElNSVRfUkVTT1VSQ0U7Ci0JCWJ0aGNpX0V2ZW50UGh5c2ljYWxMaW5rQ29tcGxldGUocGFkYXB0ZXIsIHN0YXR1cywgSU5WQUxJRF9FTlRSWV9OVU0sIFBMSCk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JRW50cnlOdW0gPSBwQnRNZ250LT5DdXJyZW50Q29ubmVjdEVudHJ5TnVtOwotCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGUgPSBQTEg7Ci0JcEJ0TWdudC0+QnRDdXJyZW50UGh5TGlua2hhbmRsZSA9IFBMSDsKLQotCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NmcmFnbWVudCA9PSBOVUxMKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIkNyZWF0ZS9BY2NlcHQgUGh5c2ljYWxMaW5rLCBBTVAgY29udHJvbGxlciBpcyBidXN5XG4iKSk7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfQ09OVFJPTExFUl9CVVNZOwotCQlidGhjaV9FdmVudFBoeXNpY2FsTGlua0NvbXBsZXRlKHBhZGFwdGVyLCBzdGF0dXMsIElOVkFMSURfRU5UUllfTlVNLCBQTEgpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qICBSZWNvcmQgS2V5IGFuZCB0aGUgaW5mbyAqLwotCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdEFNUEtleUxlbiA9ICgqKCh1OCAqKXBIY2lDbWQtPkRhdGErMSkpOwotCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdEFNUEtleVR5cGUgPSAoKigodTggKilwSGNpQ21kLT5EYXRhKzIpKTsKLQltZW1jcHkocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0QU1QS2V5LAotCQkoKCh1OCAqKXBIY2lDbWQtPkRhdGErMykpLCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRBTVBLZXlMZW4pOwotCW1lbWNweShwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUE1LLCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRBTVBLZXksIFBNS19MRU4pOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiQnVpbGRQaHlzaWNhbExpbmssIEVudHJ5TnVtID0gJWQsIFBMSCA9IDB4JXggIEtleUxlbiA9IDB4JXgsIEtleVR5cGUgPSAweCV4XG4iLAotCQlFbnRyeU51bSwgcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0UGh5TGlua2hhbmRsZSwKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0QU1QS2V5TGVuLAotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRBTVBLZXlUeXBlKSk7Ci0JUlRQUklOVF9EQVRBKEZJT0NUTCwgKElPQ1RMX0JUX0xPR098SU9DVExfQlRfSENJQ01EKSwgKCJCdEFNUEtleVxuIiksIHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdEFNUEtleSwKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0QU1QS2V5TGVuKTsKLQlSVFBSSU5UX0RBVEEoRklPQ1RMLCAoSU9DVExfQlRfTE9HT3xJT0NUTF9CVF9IQ0lDTUQpLCAoIlBNS1xuIiksIHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QTUssCi0JCVBNS19MRU4pOwotCi0JaWYgKE9DRiA9PSBIQ0lfQ1JFQVRFX1BIWVNJQ0FMX0xJTkspIHsKLQkJLyogVGhlc2UgbWFjcm9zIHJlcXVpcmUgYnJhY2VzICovCi0JCUJUSENJX1NNX1dJVEhfSU5GTyhwYWRhcHRlciwgSENJX1NUQVRFX0RJU0NPTk5FQ1RFRCwgU1RBVEVfQ01EX0NSRUFURV9QSFlfTElOSywgRW50cnlOdW0pOwotCX0gZWxzZSBpZiAoT0NGID09IEhDSV9BQ0NFUFRfUEhZU0lDQUxfTElOSykgewotCQlCVEhDSV9TTV9XSVRIX0lORk8ocGFkYXB0ZXIsIEhDSV9TVEFURV9ESVNDT05ORUNURUQsIFNUQVRFX0NNRF9BQ0NFUFRfUEhZX0xJTkssIEVudHJ5TnVtKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZAotYnRoY2lfQnVpbGRMb2dpY2FsTGluaygKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kLAotCXUxNiBPQ0YKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRpbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVGluZm8tPkJ0TWdudDsKLQl1OCBQaHlMaW5rSGFuZGxlLCBFbnRyeU51bTsKLQlzdGF0aWMgdTE2IEFzc2lnbkxvZ0hhbmRsZSA9IDE7Ci0KLQlzdHJ1Y3QgaGNpX2Zsb3dfc3BlYwlUeEZsb3dTcGVjOwotCXN0cnVjdCBoY2lfZmxvd19zcGVjCVJ4Rmxvd1NwZWM7Ci0JdTMyCU1heFNEVVNpemUsIEFycml2ZVRpbWUsIEJhbmR3aWR0aDsKLQotCVBoeUxpbmtIYW5kbGUgPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCi0JRW50cnlOdW0gPSBidGhjaV9HZXRDdXJyZW50RW50cnlOdW0ocGFkYXB0ZXIsIFBoeUxpbmtIYW5kbGUpOwotCi0JbWVtY3B5KCZUeEZsb3dTcGVjLAotCQkmcEhjaUNtZC0+RGF0YVsxXSwgc2l6ZW9mKHN0cnVjdCBoY2lfZmxvd19zcGVjKSk7Ci0JbWVtY3B5KCZSeEZsb3dTcGVjLAotCQkmcEhjaUNtZC0+RGF0YVsxN10sIHNpemVvZihzdHJ1Y3QgaGNpX2Zsb3dfc3BlYykpOwotCi0JTWF4U0RVU2l6ZSA9IFR4Rmxvd1NwZWMuTWF4aW11bVNEVVNpemU7Ci0JQXJyaXZlVGltZSA9IFR4Rmxvd1NwZWMuU0RVSW50ZXJBcnJpdmFsVGltZTsKLQotCWlmIChidGhjaV9DaGVja0xvZ0xpbmtCZWhhdmlvcihwYWRhcHRlciwgVHhGbG93U3BlYykgJiYgYnRoY2lfQ2hlY2tMb2dMaW5rQmVoYXZpb3IocGFkYXB0ZXIsIFJ4Rmxvd1NwZWMpKQotCQlCYW5kd2lkdGggPSBCVFRPVEFMQkFORFdJRFRIOwotCWVsc2UgaWYgKE1heFNEVVNpemUgPT0gMHhmZmZmICYmIEFycml2ZVRpbWUgPT0gMHhmZmZmZmZmZikKLQkJQmFuZHdpZHRoID0gQlRUT1RBTEJBTkRXSURUSDsKLQllbHNlCi0JCUJhbmR3aWR0aCA9IE1heFNEVVNpemUqOCoxMDAwLyhBcnJpdmVUaW1lKzI0NCk7Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELAotCQkoIkJ1aWxkTG9naWNhbExpbmssIFBoeUxpbmtIYW5kbGUgPSAweCV4LCBNYXhpbXVtU0RVU2l6ZSA9IDB4JXgsIFNEVUludGVyQXJyaXZhbFRpbWUgPSAweCV4LCBCYW5kd2lkdGggPSAweCV4XG4iLAotCQlQaHlMaW5rSGFuZGxlLCBNYXhTRFVTaXplLCBBcnJpdmVUaW1lLCBCYW5kd2lkdGgpKTsKLQotCWlmIChFbnRyeU51bSA9PSAweGZmKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSW52YWxpZCBQaHlzaWNhbCBMaW5rIGhhbmRsZSA9IDB4JXgsIHN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQsIHJldHVyblxuIiwgUGh5TGlua0hhbmRsZSkpOwotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCi0JCS8qIFdoZW4gd2UgcmVjZWl2ZSBDcmVhdGUvQWNjZXB0IGxvZ2ljYWwgbGluayBjb21tYW5kLCB3ZSBzaG91bGQgc2VuZCBjb21tYW5kIHN0YXR1cyBldmVudCBmaXJzdC4gKi8KLQkJYnRoY2lfRXZlbnRDb21tYW5kU3RhdHVzKHBhZGFwdGVyLAotCQkJTElOS19DT05UUk9MX0NPTU1BTkRTLAotCQkJT0NGLAotCQkJc3RhdHVzKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghcEJ0TWdudC0+YkxvZ0xpbmtJblByb2dyZXNzKSB7Ci0JCWlmIChidGhjaV9QaHlMaW5rQ29ubmVjdGlvbkluUHJvZ3Jlc3MocGFkYXB0ZXIsIFBoeUxpbmtIYW5kbGUpKSB7Ci0JCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIlBoeXNpY2FsIGxpbmsgY29ubmVjdGlvbiBpbiBwcm9ncmVzcywgc3RhdHVzID0gSENJX1NUQVRVU19DTURfRElTQUxMT1csIHJldHVyblxuIikpOwotCQkJc3RhdHVzID0gSENJX1NUQVRVU19DTURfRElTQUxMT1c7Ci0KLQkJCXBCdE1nbnQtPmJQaHlMaW5rSW5Qcm9ncmVzc1N0YXJ0TEwgPSB0cnVlOwotCQkJLyogV2hlbiB3ZSByZWNlaXZlIENyZWF0ZS9BY2NlcHQgbG9naWNhbCBsaW5rIGNvbW1hbmQsIHdlIHNob3VsZCBzZW5kIGNvbW1hbmQgc3RhdHVzIGV2ZW50IGZpcnN0LiAqLwotCQkJYnRoY2lfRXZlbnRDb21tYW5kU3RhdHVzKHBhZGFwdGVyLAotCQkJCUxJTktfQ09OVFJPTF9DT01NQU5EUywKLQkJCQlPQ0YsCi0JCQkJc3RhdHVzKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKEJhbmR3aWR0aCA+IEJUVE9UQUxCQU5EV0lEVEgpIHsKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgic3RhdHVzID0gSENJX1NUQVRVU19RT1NfUkVKRUNULCBCYW5kd2lkdGggPSAweCV4LCByZXR1cm5cbiIsIEJhbmR3aWR0aCkpOwotCQkJc3RhdHVzID0gSENJX1NUQVRVU19RT1NfUkVKRUNUOwotCi0JCQkvKiBXaGVuIHdlIHJlY2VpdmUgQ3JlYXRlL0FjY2VwdCBsb2dpY2FsIGxpbmsgY29tbWFuZCwgd2Ugc2hvdWxkIHNlbmQgY29tbWFuZCBzdGF0dXMgZXZlbnQgZmlyc3QuICovCi0JCQlidGhjaV9FdmVudENvbW1hbmRTdGF0dXMocGFkYXB0ZXIsCi0JCQkJTElOS19DT05UUk9MX0NPTU1BTkRTLAotCQkJCU9DRiwKLQkJCQlzdGF0dXMpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1NcbiIpKTsKLQkJCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQotCQkJLyogV2hlbiB3ZSByZWNlaXZlIENyZWF0ZS9BY2NlcHQgbG9naWNhbCBsaW5rIGNvbW1hbmQsIHdlIHNob3VsZCBzZW5kIGNvbW1hbmQgc3RhdHVzIGV2ZW50IGZpcnN0LiAqLwotCQkJYnRoY2lfRXZlbnRDb21tYW5kU3RhdHVzKHBhZGFwdGVyLAotCQkJCUxJTktfQ09OVFJPTF9DT01NQU5EUywKLQkJCQlPQ0YsCi0JCQkJc3RhdHVzKTsKLQotCQl9Ci0KLQkJaWYgKHBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CdEN1cnJlbnRTdGF0ZSAhPSBIQ0lfU1RBVEVfQ09OTkVDVEVEKSB7Ci0JCQlidGhjaV9FdmVudExvZ2ljYWxMaW5rQ29tcGxldGUocGFkYXB0ZXIsCi0JCQkJSENJX1NUQVRVU19DTURfRElTQUxMT1csIDAsIDAsIDAsIEVudHJ5TnVtKTsKLQkJfSBlbHNlIHsKLQkJCXU4IGksIGZpbmQgPSAwOwotCi0JCQlwQnRNZ250LT5iTG9nTGlua0luUHJvZ3Jlc3MgPSB0cnVlOwotCi0JCQkvKiAgZmluZCBhbiB1bnVzZWQgbG9naWNhbCBsaW5rIGluZGV4IGFuZCBjb3B5IHRoZSBkYXRhICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xPR0lDQUxfTElOS19OVU07IGkrKykgewotCQkJCWlmIChwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaV0uQnRMb2dMaW5raGFuZGxlID09IDApIHsKLQkJCQkJZW51bSBoY2lfc3RhdHVzIExvZ0NvbXBFdmVudHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQotCQkJCQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaV0uQnRQaHlMaW5raGFuZGxlID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQkJCQkJcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2ldLkJ0TG9nTGlua2hhbmRsZSA9IEFzc2lnbkxvZ0hhbmRsZTsKLQkJCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJCdWlsZExvZ2ljYWxMaW5rLCBFbnRyeU51bSA9ICVkLCBwaHlzaWNhbCBsaW5rIGhhbmRsZSA9IDB4JXgsIGxvZ2ljYWwgbGluayBoYW5kbGUgPSAweCV4XG4iLAotCQkJCQkJRW50cnlOdW0sIHBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGUsCi0JCQkJCQkJCSAgcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2ldLkJ0TG9nTGlua2hhbmRsZSkpOwotCQkJCQltZW1jcHkoJnBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpXS5UeF9GbG93X1NwZWMsCi0JCQkJCQkmVHhGbG93U3BlYywgc2l6ZW9mKHN0cnVjdCBoY2lfZmxvd19zcGVjKSk7Ci0JCQkJCW1lbWNweSgmcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2ldLlJ4X0Zsb3dfU3BlYywKLQkJCQkJCSZSeEZsb3dTcGVjLCBzaXplb2Yoc3RydWN0IGhjaV9mbG93X3NwZWMpKTsKLQotCQkJCQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaV0uYkxMQ29tcGxldGVFdmVudElzU2V0ID0gZmFsc2U7Ci0KLQkJCQkJaWYgKHBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpXS5iTExDYW5jZWxDTURJc1NldGFuZENvbXBsZXRlKQotCQkJCQkJTG9nQ29tcEV2ZW50c3RhdHVzID0gSENJX1NUQVRVU19VTktOT1dfQ09OTkVDVF9JRDsKLQkJCQkJYnRoY2lfRXZlbnRMb2dpY2FsTGlua0NvbXBsZXRlKHBhZGFwdGVyLAotCQkJCQkJTG9nQ29tcEV2ZW50c3RhdHVzLAotCQkJCQkJcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2ldLkJ0UGh5TGlua2hhbmRsZSwKLQkJCQkJCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpXS5CdExvZ0xpbmtoYW5kbGUsIGksIEVudHJ5TnVtKTsKLQotCQkJCQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaV0uYkxMQ29tcGxldGVFdmVudElzU2V0ID0gdHJ1ZTsKLQotCQkJCQlmaW5kID0gMTsKLQkJCQkJcEJ0TWdudC0+QnRDdXJyZW50TG9nTGlua2hhbmRsZSA9IEFzc2lnbkxvZ0hhbmRsZTsKLQkJCQkJQXNzaWduTG9nSGFuZGxlKys7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFmaW5kKSB7Ci0JCQkJYnRoY2lfRXZlbnRMb2dpY2FsTGlua0NvbXBsZXRlKHBhZGFwdGVyLAotCQkJCQlIQ0lfU1RBVFVTX0NPTk5FQ1RfUkpUX0xJTUlUX1JFU09VUkNFLCAwLCAwLCAwLCBFbnRyeU51bSk7Ci0JCQl9Ci0JCQlwQnRNZ250LT5iTG9nTGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJfQotCX0gZWxzZSB7Ci0JCWJ0aGNpX0V2ZW50TG9naWNhbExpbmtDb21wbGV0ZShwYWRhcHRlciwKLQkJCUhDSV9TVEFUVVNfQ09OVFJPTExFUl9CVVNZLCAwLCAwLCAwLCBFbnRyeU51bSk7Ci0JfQotCi19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9TdGFydEJlYWNvbkFuZENvbm5lY3QoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCwKLQl1OCBDdXJyZW50QXNzb2NOdW0KLQkpCi17Ci0vKlBNR05UX0lORk8gcE1nbnRJbmZvID0gJnBhZGFwdGVyLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiU3RhcnRCZWFjb25BbmRDb25uZWN0LCBDdXJyZW50QXNzb2NOdW0gPSVkLCBBTVBSb2xlID0lZFxuIiwKLQkJQ3VycmVudEFzc29jTnVtLAotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFNUFJvbGUpKTsKLQotCWlmICghcEJ0TWdudC0+Q2hlY2tDaG5sSXNTdWl0KSB7Ci0JCWJ0aGNpX0V2ZW50UGh5c2ljYWxMaW5rQ29tcGxldGUocGFkYXB0ZXIsIEhDSV9TVEFUVVNfQ09OTkVDVF9SRUpfTk9UX1NVSVRfQ0hOTF9GT1VORCwgQ3VycmVudEFzc29jTnVtLCBJTlZBTElEX1BMX0hBTkRMRSk7Ci0JCWJ0aGNpX1JlbW92ZUVudHJ5QnlFbnRyeU51bShwYWRhcHRlciwgQ3VycmVudEFzc29jTnVtKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFNUFJvbGUgPT0gQU1QX0JUQVBfQ1JFQVRPUikgewotCQlzbnByaW50ZigoY2hhciAqKXBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQlRTc2lkQnVmLCAzMiwKLQkJCSAiQU1QLSVwTUYiLCBwYWRhcHRlci0+ZWVwcm9tcHJpdi5tYWNfYWRkcik7Ci0JfSBlbHNlIGlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFNUFJvbGUgPT0gQU1QX0JUQVBfSk9JTkVSKSB7Ci0JCXNucHJpbnRmKChjaGFyICopcEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5CVFNzaWRCdWYsIDMyLAotCQkJICJBTVAtJXBNRiIsIHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQlRSZW1vdGVNQUNBZGRyKTsKLQl9Ci0KLQlGaWxsT2N0ZXRTdHJpbmcocEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5CVFNzaWQsIHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQlRTc2lkQnVmLCAyMSk7Ci0JcEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5CVFNzaWQuTGVuZ3RoID0gMjE7Ci0KLQkvKiBUbyBhdm9pZCBzZXQgdGhlIHN0YXJ0IGFwIG9yIGNvbm5lY3QgdHdpY2UsIG9yIHRoZSBvcmlnaW5hbCBjb25uZWN0aW9uIHdpbGwgYmUgZGlzY29ubmVjdGVkLiAqLwotCWlmICghcEJ0TWdudC0+YkJUQ29ubmVjdEluUHJvZ3Jlc3MpIHsKLQkJcEJ0TWdudC0+YkJUQ29ubmVjdEluUHJvZ3Jlc3MgPSB0cnVlOwotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIEZsYWddLCBCVCBDb25uZWN0IGluIHByb2dyZXNzIE9OISFcbiIpKTsKLQkJQlRIQ0lfU01fV0lUSF9JTkZPKHBhZGFwdGVyLCBIQ0lfU1RBVEVfU1RBUlRJTkcsIFNUQVRFX0NNRF9NQUNfU1RBUlRfQ09NUExFVEUsIEN1cnJlbnRBc3NvY051bSk7Ci0KLQkJLyogIDIwMTAwMzI1IEpvc2VwaDogQ2hlY2sgUkYgT04vT0ZGLiAqLwotCQkvKiAgSWYgUkYgT0ZGLCBpdCByZXNjaGVkdWxlIGNvbm5lY3Rpbmcgb3BlcmF0aW9uIGFmdGVyIDUwbXMuICovCi0JCWlmICghYnRoY2lfQ2hlY2tSZlN0YXRlQmVmb3JlQ29ubmVjdChwYWRhcHRlcikpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQU1QUm9sZSA9PSBBTVBfQlRBUF9DUkVBVE9SKSB7Ci0JCQkvKiBUaGVzZSBtYWNyb3MgbmVlZCBicmFjZXMgKi8KLQkJCUJUSENJX1NNX1dJVEhfSU5GTyhwYWRhcHRlciwgSENJX1NUQVRFX0NPTk5FQ1RJTkcsIFNUQVRFX0NNRF9NQUNfQ09OTkVDVF9DT01QTEVURSwgQ3VycmVudEFzc29jTnVtKTsKLQkJfSBlbHNlIGlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFNUFJvbGUgPT0gQU1QX0JUQVBfSk9JTkVSKSB7Ci0JCQlidGhjaV9SZXNwb25kZXJTdGFydFRvU2NhbihwYWRhcHRlcik7Ci0JCX0KLQl9Ci0JUlRfUFJJTlRfU1RSKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sCi0JCSAgICAgIlN0YXJ0QmVhY29uQW5kQ29ubmVjdCwgU1NJRDpcbiIsCi0JCSAgICAgcEJUSW5mby0+QnRBc29jRW50cnlbcEJ0TWdudC0+Q3VycmVudENvbm5lY3RFbnRyeU51bV0uQlRTc2lkLk9jdGV0LAotCQkgICAgIHBCVEluZm8tPkJ0QXNvY0VudHJ5W3BCdE1nbnQtPkN1cnJlbnRDb25uZWN0RW50cnlOdW1dLkJUU3NpZC5MZW5ndGgpOwotfQotCi1zdGF0aWMgdm9pZCBidGhjaV9SZXNldEJ0TWdudChzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCkKLXsKLQlwQnRNZ250LT5CdE9wZXJhdGlvbk9uID0gZmFsc2U7Ci0JcEJ0TWdudC0+YkJUQ29ubmVjdEluUHJvZ3Jlc3MgPSBmYWxzZTsKLQlwQnRNZ250LT5iTG9nTGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQlwQnRNZ250LT5iUGh5TGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQlwQnRNZ250LT5iUGh5TGlua0luUHJvZ3Jlc3NTdGFydExMID0gZmFsc2U7Ci0JcEJ0TWdudC0+RGlzY29ubmVjdEVudHJ5TnVtID0gMHhmZjsKLQlwQnRNZ250LT5iU3RhcnRTZW5kU3VwZXJ2aXNpb25Qa3QgPSBmYWxzZTsKLQlwQnRNZ250LT5Kb2luZXJOZWVkU2VuZEF1dGggPSBmYWxzZTsKLQlwQnRNZ250LT5DdXJyZW50QlRDb25uZWN0aW9uQ250ID0gMDsKLQlwQnRNZ250LT5CVEN1cnJlbnRDb25uZWN0VHlwZSA9IEJUX0RJU0NPTk5FQ1Q7Ci0JcEJ0TWdudC0+QlRSZWNlaXZlQ29ubmVjdFBrdCA9IEJUX0RJU0NPTk5FQ1Q7Ci0JcEJ0TWdudC0+QlRBdXRoQ291bnQgPSAwOwotCXBCdE1nbnQtPmJ0TG9nb1Rlc3QgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBidGhjaV9SZXNldEJ0SGNpSW5mbyhzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8pCi17Ci0JcEJ0SGNpSW5mby0+QlRFdmVudE1hc2sgPSAwOwotCXBCdEhjaUluZm8tPkJURXZlbnRNYXNrUGFnZTIgPSAwOwotCXBCdEhjaUluZm8tPkNvbm5BY2NlcHRUaW1lb3V0ID0gIDEwMDAwOwotCXBCdEhjaUluZm8tPlBhZ2VUaW1lb3V0ICA9ICAweDMwOwotCXBCdEhjaUluZm8tPkxvY2F0aW9uRG9tYWluQXdhcmUgPSAweDA7Ci0JcEJ0SGNpSW5mby0+TG9jYXRpb25Eb21haW4gPSAweDU4NTg7Ci0JcEJ0SGNpSW5mby0+TG9jYXRpb25Eb21haW5PcHRpb25zID0gMHg1ODsKLQlwQnRIY2lJbmZvLT5Mb2NhdGlvbk9wdGlvbnMgPSAweDA7Ci0JcEJ0SGNpSW5mby0+Rmxvd0NvbnRyb2xNb2RlID0gMHgxOwkvKiAgMDpQYWNrZXQgYmFzZWQgZGF0YSBmbG93IGNvbnRyb2wgbW9kZShCUi9FRFIpLCAxOiBEYXRhIGJsb2NrIGJhc2VkIGRhdGEgZmxvdyBjb250cm9sIG1vZGUoQU1QKS4gKi8KLQotCXBCdEhjaUluZm8tPmVuRmx1c2hfTExIID0gMDsKLQlwQnRIY2lJbmZvLT5GTFRPX0xMSCA9IDA7Ci0KLQkvKiBUZXN0IGNvbW1hbmQgb25seSAqLwotCXBCdEhjaUluZm8tPmJUZXN0SXNFbmQgPSB0cnVlOwotCXBCdEhjaUluZm8tPmJJblRlc3RNb2RlID0gZmFsc2U7Ci0JcEJ0SGNpSW5mby0+YlRlc3ROZWVkUmVwb3J0ID0gZmFsc2U7Ci0JcEJ0SGNpSW5mby0+VGVzdFNjZW5hcmlvID0gMHhmZjsKLQlwQnRIY2lJbmZvLT5UZXN0UmVwb3J0SW50ZXJ2YWwgPSAweDAxOwotCXBCdEhjaUluZm8tPlRlc3RDdHJUeXBlID0gMHg1ZDsKLQlwQnRIY2lJbmZvLT5UZXN0RXZlbnRUeXBlID0gMHgwMDsKLQlwQnRIY2lJbmZvLT5UZXN0TnVtT2ZGcmFtZSA9IDA7Ci0JcEJ0SGNpSW5mby0+VGVzdE51bU9mRXJyRnJhbWUgPSAwOwotCXBCdEhjaUluZm8tPlRlc3ROdW1PZkJpdHMgPSAwOwotCXBCdEhjaUluZm8tPlRlc3ROdW1PZkVyckJpdHMgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBidGhjaV9SZXNldEJ0U2VjKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBidF9zZWN1cml0eSAqcEJ0U2VjKQotewotLypQTUdOVF9JTkZPCXBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0KLQkvKiAgU2V0IEJUIHVzZWQgSFcgb3IgU1cgZW5jcnlwdCAhISAqLwotCWlmIChHRVRfSEFMX0RBVEEocGFkYXB0ZXIpLT5iQlRNb2RlKQotCQlwQnRTZWMtPmJVc2VkSHdFbmNyeXB0ID0gdHJ1ZTsKLQllbHNlCi0JCXBCdFNlYy0+YlVzZWRId0VuY3J5cHQgPSBmYWxzZTsKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfaW5mb18sCi0JCSAiJXM6IGJVc2VkSHdFbmNyeXB0ID0lZFxuIiwgX19mdW5jX18sIHBCdFNlYy0+YlVzZWRId0VuY3J5cHQpOwotCi0JcEJ0U2VjLT5SU05JRS5PY3RldCA9IHBCdFNlYy0+UlNOSUVCdWY7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aGNpX1Jlc2V0QnRFeHRJbmZvKHN0cnVjdCBidF9tZ250ICpwQnRNZ250KQotewotCXU4IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JUX0FTT0NfRU5UUllfTlVNOyBpKyspIHsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkNvbm5lY3RIYW5kbGUgPSAwOwotCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uSW5jb21pbmdUcmFmZmljTW9kZSA9IDA7Ci0JCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5PdXRnb2luZ1RyYWZmaWNNb2RlID0gMDsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUUHJvZmlsZSA9IEJUX1BST0ZJTEVfTk9ORTsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUQ29yZVNwZWMgPSBCVF9TUEVDXzJfMV9FRFI7Ci0JCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVF9SU1NJID0gMDsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLlRyYWZmaWNQcm9maWxlID0gQlRfUFJPRklMRV9OT05FOwotCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0ubGlua1JvbGUgPSBCVF9MSU5LX01BU1RFUjsKLQl9Ci0KLQlwQnRNZ250LT5FeHRDb25maWcuQ3VycmVudENvbm5lY3RIYW5kbGUgPSAwOwotCXBCdE1nbnQtPkV4dENvbmZpZy5DdXJyZW50SW5jb21pbmdUcmFmZmljTW9kZSA9IDA7Ci0JcEJ0TWdudC0+RXh0Q29uZmlnLkN1cnJlbnRPdXRnb2luZ1RyYWZmaWNNb2RlID0gMDsKLQlwQnRNZ250LT5FeHRDb25maWcuTUlOX0JUX1JTU0kgPSAwOwotCXBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9IDA7Ci0JcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mU0NPID0gMDsKLQlwQnRNZ250LT5FeHRDb25maWcuQ3VycmVudEJUU3RhdHVzID0gMDsKLQlwQnRNZ250LT5FeHRDb25maWcuSENJRXh0ZW5zaW9uVmVyID0gMDsKLQotCXBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCA9IGZhbHNlOwotCXBCdE1nbnQtPkV4dENvbmZpZy5iQlRCdXN5ID0gZmFsc2U7Ci0JcEJ0TWdudC0+RXh0Q29uZmlnLmJCVEEyRFBCdXN5ID0gZmFsc2U7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMgYnRoY2lfQ21kUmVzZXQoc3RydWN0IHJ0d19hZGFwdGVyICpfcGFkYXB0ZXIsIHU4IGJOZWVkU2VuZEV2ZW50KQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcjsKLS8qUE1HTlRfSU5GTyBwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvOwotCXN0cnVjdCBidF9zZWN1cml0eSAqcEJ0U2VjOwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZzsKLQl1OCBpOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJidGhjaV9DbWRSZXNldCgpXG4iKSk7Ci0KLQlwYWRhcHRlciA9IEdldERlZmF1bHRBZGFwdGVyKF9wYWRhcHRlcik7Ci0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQlwQnRTZWMgPSAmcEJUSW5mby0+QnRTZWM7Ci0JcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCi0JcEJUSW5mby0+cGFkYXB0ZXIgPSBwYWRhcHRlcjsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfQlRfQVNPQ19FTlRSWV9OVU07IGkrKykKLQkJYnRoY2lfUmVzZXRFbnRyeShwYWRhcHRlciwgaSk7Ci0KLQlidGhjaV9SZXNldEJ0TWdudChwQnRNZ250KTsKLQlidGhjaV9SZXNldEJ0SGNpSW5mbyhwQnRIY2lJbmZvKTsKLQlidGhjaV9SZXNldEJ0U2VjKHBhZGFwdGVyLCBwQnRTZWMpOwotCi0JcEJ0TWdudC0+QlRDaGFubmVsID0gQlRfRGVmYXVsdF9DaG5sOwotCXBCdE1nbnQtPkNoZWNrQ2hubElzU3VpdCA9IHRydWU7Ci0KLQlwQlRJbmZvLT5CVEJlYWNvblRtck9uID0gZmFsc2U7Ci0KLQlwQnRNZ250LT5iQ3JlYXRlU3Bwb3J0UW9zID0gdHJ1ZTsKLQotCWRlbF90aW1lcl9zeW5jKCZwQlRJbmZvLT5CVEhDSURpc2NhcmRBY2xEYXRhVGltZXIpOwotCWRlbF90aW1lcl9zeW5jKCZwQlRJbmZvLT5CVEJlYWNvblRpbWVyKTsKLQotCUhBTEJUX1NldFJ0c0N0c05vTGVuTGltaXQocGFkYXB0ZXIpOwotCS8qICAqLwotCS8qICBNYXliZSB3ZSBuZWVkIHRvIHRha2UgY2FyZSBHcm91cCAhPSBBRVMgY2FzZSAhISAqLwotCS8qICBub3cgd2UgUGFpcndpc2UgYW5kIEdyb3VwIGFsbCB1c2VkIEFFUyAhISAqLwotCi0JYnRoY2lfUmVzZXRCdEV4dEluZm8ocEJ0TWdudCk7Ci0KLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQlpZiAoYk5lZWRTZW5kRXZlbnQpIHsKLQkJdTggbG9jYWxCdWZbNl0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCQlIQ0lfUkVTRVQsCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQkJbGVuICs9IDE7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFdyaXRlUmVtb3RlQU1QQXNzb2MoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCXU4IEN1cnJlbnRBc3NvY051bTsKLQl1OCBQaHlMaW5rSGFuZGxlOwotCi0JcEJ0RGJnLT5kYmdIY2lJbmZvLmhjaUNtZENudFdyaXRlUmVtb3RlQW1wQXNzb2MrKzsKLQlQaHlMaW5rSGFuZGxlID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQlDdXJyZW50QXNzb2NOdW0gPSBidGhjaV9HZXRDdXJyZW50RW50cnlOdW0ocGFkYXB0ZXIsIFBoeUxpbmtIYW5kbGUpOwotCi0JaWYgKEN1cnJlbnRBc3NvY051bSA9PSAweGZmKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIldyaXRlUmVtb3RlQU1QQXNzb2MsIE5vIHN1Y2ggSGFuZGxlIGluIHRoZSBFbnRyeVxuIikpOwotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCQlidGhjaV9FdmVudFdyaXRlUmVtb3RlQW1wQXNzb2MocGFkYXB0ZXIsIHN0YXR1cywgUGh5TGlua0hhbmRsZSk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NmcmFnbWVudCA9PSBOVUxMKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIldyaXRlUmVtb3RlQU1QQXNzb2MsIEFNUCBjb250cm9sbGVyIGlzIGJ1c3lcbiIpKTsKLQkJc3RhdHVzID0gSENJX1NUQVRVU19DT05UUk9MTEVSX0JVU1k7Ci0JCWJ0aGNpX0V2ZW50V3JpdGVSZW1vdGVBbXBBc3NvYyhwYWRhcHRlciwgc3RhdHVzLCBQaHlMaW5rSGFuZGxlKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFtcEFzb2NDbWREYXRhLkJ0UGh5TGlua2hhbmRsZSA9IFBoeUxpbmtIYW5kbGU7LyogdTggKilwSGNpQ21kLT5EYXRhKTsgKi8KLQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFtcEFzb2NDbWREYXRhLkxlblNvRmFyID0gKigodTE2ICopKCh1OCAqKXBIY2lDbWQtPkRhdGErMSkpOwotCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NSZW1MZW4gPSAqKCh1MTYgKikoKHU4ICopcEhjaUNtZC0+RGF0YSszKSk7Ci0KLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRF9ERVRBSUx8SU9DVExfQlRfTE9HTyksICgiV3JpdGVSZW1vdGVBTVBBc3NvYywgTGVuU29GYXIgPSAweCV4LCBBc3NvY1JlbUxlbiA9IDB4JXhcbiIsCi0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQW1wQXNvY0NtZERhdGEuTGVuU29GYXIsCi0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NSZW1MZW4pKTsKLQotCVJUUFJJTlRfREFUQShGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTURfREVUQUlMfElPQ1RMX0JUX0xPR08pLAotCQkgICAgICgiV3JpdGVSZW1vdGVBTVBBc3NvYyBmcmFnbWVudCBcbiIpLAotCQkgICAgIHBIY2lDbWQtPkRhdGEsCi0JCSAgICAgcEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5BbXBBc29jQ21kRGF0YS5BTVBBc3NvY1JlbUxlbis1KTsKLQlpZiAoKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NSZW1MZW4pID4gTUFYX0FNUF9BU1NPQ19GUkFHX0xFTikgewotCQltZW1jcHkoKCh1OCAqKXBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NmcmFnbWVudCsocEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5BbXBBc29jQ21kRGF0YS5MZW5Tb0Zhciooc2l6ZW9mKHU4KSkpKSwKLQkJCSh1OCAqKXBIY2lDbWQtPkRhdGErNSwKLQkJCU1BWF9BTVBfQVNTT0NfRlJBR19MRU4pOwotCX0gZWxzZSB7Ci0JCW1lbWNweSgodTggKikocEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5BbXBBc29jQ21kRGF0YS5BTVBBc3NvY2ZyYWdtZW50KSsocEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5BbXBBc29jQ21kRGF0YS5MZW5Tb0Zhciooc2l6ZW9mKHU4KSkpLAotCQkJKCh1OCAqKXBIY2lDbWQtPkRhdGErNSksCi0JCQkocEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5BbXBBc29jQ21kRGF0YS5BTVBBc3NvY1JlbUxlbikpOwotCi0JCVJUUFJJTlRfREFUQShGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTURfREVUQUlMfElPQ1RMX0JUX0xPR08pLCAiV3JpdGVSZW1vdGVBTVBBc3NvYyA6XG4iLAotCQkJcEhjaUNtZC0+RGF0YSs1LCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFtcEFzb2NDbWREYXRhLkFNUEFzc29jUmVtTGVuKTsKLQotCQlpZiAoIWJ0aGNpX0dldEFzc29jSW5mbyhwYWRhcHRlciwgQ3VycmVudEFzc29jTnVtKSkKLQkJCXN0YXR1cyA9IEhDSV9TVEFUVVNfSU5WQUxJRF9IQ0lfQ01EX1BBUkFfVkFMVUU7Ci0KLQkJYnRoY2lfRXZlbnRXcml0ZVJlbW90ZUFtcEFzc29jKHBhZGFwdGVyLCBzdGF0dXMsIFBoeUxpbmtIYW5kbGUpOwotCi0JCWJ0aGNpX1N0YXJ0QmVhY29uQW5kQ29ubmVjdChwYWRhcHRlciwgcEhjaUNtZCwgQ3VycmVudEFzc29jTnVtKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKiA3LjMuMTMgKi8KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMgYnRoY2lfQ21kUmVhZENvbm5lY3Rpb25BY2NlcHRUaW1lb3V0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JZW51bSBoY2lfc3RhdHVzCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXU4IGxvY2FsQnVmWzhdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0JdTE2ICpwdTJUZW1wOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJSENJX1JFQURfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVCwKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhclsxXTsJCS8qICBDb25uX0FjY2VwdF9UaW1lb3V0ICovCi0JKnB1MlRlbXAgPSBwQnRIY2lJbmZvLT5Db25uQWNjZXB0VGltZW91dDsKLQlsZW4gKz0gMzsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyogNy4zLjE0ICovCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRXcml0ZUNvbm5lY3Rpb25BY2NlcHRUaW1lb3V0KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXUxNgkqcHUyVGVtcDsKLQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JcHUyVGVtcCA9ICh1MTYgKikmcEhjaUNtZC0+RGF0YVswXTsKLQlwQnRIY2lJbmZvLT5Db25uQWNjZXB0VGltZW91dCA9ICpwdTJUZW1wOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfREVUQUlMLCAoIkNvbm5BY2NlcHRUaW1lb3V0ID0gMHgleCIsCi0JCXBCdEhjaUluZm8tPkNvbm5BY2NlcHRUaW1lb3V0KSk7Ci0KLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQlIQ0lfV1JJVEVfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVCwKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JbGVuICs9IDE7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFJlYWRQYWdlVGltZW91dCgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cwkJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1OCBsb2NhbEJ1Zls4XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCXUxNiAqcHUyVGVtcDsKLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCUhDSV9SRUFEX1BBR0VfVElNRU9VVCwKLQkJc3RhdHVzKTsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiUmVhZCBQYWdlVGltZW91dCA9IDB4JXhcbiIsIHBCdEhjaUluZm8tPlBhZ2VUaW1lb3V0KSk7Ci0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQlwdTJUZW1wID0gKHUxNiAqKSZwUmV0UGFyWzFdOwkJLyogIFBhZ2VfVGltZW91dCAqLwotCSpwdTJUZW1wID0gcEJ0SGNpSW5mby0+UGFnZVRpbWVvdXQ7Ci0JbGVuICs9IDM7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFdyaXRlUGFnZVRpbWVvdXQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JdTE2CSpwdTJUZW1wOwotCi0JcHUyVGVtcCA9ICh1MTYgKikmcEhjaUNtZC0+RGF0YVswXTsKLQlwQnRIY2lJbmZvLT5QYWdlVGltZW91dCA9ICpwdTJUZW1wOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiV3JpdGUgUGFnZVRpbWVvdXQgPSAweCV4XG4iLAotCQlwQnRIY2lJbmZvLT5QYWdlVGltZW91dCkpOwotCi0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JewotCQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJCUhDSV9XUklURV9QQUdFX1RJTUVPVVQsCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQkJbGVuICs9IDE7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFJlYWRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRpbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXU4IHBoeXNpY2FsTGlua0hhbmRsZSwgRW50cnlOdW07Ci0KLQlwaHlzaWNhbExpbmtIYW5kbGUgPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCi0JRW50cnlOdW0gPSBidGhjaV9HZXRDdXJyZW50RW50cnlOdW0ocGFkYXB0ZXIsIHBoeXNpY2FsTGlua0hhbmRsZSk7Ci0KLQlpZiAoRW50cnlOdW0gPT0gMHhmZikgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIlJlYWRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0LCBObyBzdWNoIEhhbmRsZSBpbiB0aGUgRW50cnlcbiIpKTsKLQkJc3RhdHVzID0gSENJX1NUQVRVU19VTktOT1dfQ09OTkVDVF9JRDsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlpZiAocEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0UGh5TGlua2hhbmRsZSAhPSBwaHlzaWNhbExpbmtIYW5kbGUpCi0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0KLQl7Ci0JCXU4IGxvY2FsQnVmWzEwXSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCQl1MTYgKnB1MlRlbXA7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQkJSENJX1JFQURfTElOS19TVVBFUlZJU0lPTl9USU1FT1VULAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwotCQlwUmV0UGFyWzFdID0gcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0UGh5TGlua2hhbmRsZTsKLQkJcFJldFBhclsyXSA9IDA7Ci0JCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbM107CQkvKiAgQ29ubl9BY2NlcHRfVGltZW91dCAqLwotCQkqcHUyVGVtcCA9IHBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5MaW5rU3VwZXJ2ZXJzaW9uVGltZW91dDsKLQkJbGVuICs9IDU7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFdyaXRlTGlua1N1cGVydmlzaW9uVGltZW91dCgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cwlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUaW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQl1OCBwaHlzaWNhbExpbmtIYW5kbGUsIEVudHJ5TnVtOwotCi0JcGh5c2ljYWxMaW5rSGFuZGxlID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQotCUVudHJ5TnVtID0gYnRoY2lfR2V0Q3VycmVudEVudHJ5TnVtKHBhZGFwdGVyLCBwaHlzaWNhbExpbmtIYW5kbGUpOwotCi0JaWYgKEVudHJ5TnVtID09IDB4ZmYpIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJXcml0ZUxpbmtTdXBlcnZpc2lvblRpbWVvdXQsIE5vIHN1Y2ggSGFuZGxlIGluIHRoZSBFbnRyeVxuIikpOwotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCX0gZWxzZSB7Ci0JCWlmIChwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlICE9IHBoeXNpY2FsTGlua0hhbmRsZSkgewotCQkJc3RhdHVzID0gSENJX1NUQVRVU19VTktOT1dfQ09OTkVDVF9JRDsKLQkJfSBlbHNlIHsKLQkJCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5MaW5rU3VwZXJ2ZXJzaW9uVGltZW91dCA9ICooKHUxNiAqKSgoKHU4ICopcEhjaUNtZC0+RGF0YSkrMikpOwotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIkJUIFdyaXRlIExpbmtTdXBlcnZlcnNpb25UaW1lb3V0WyVkXSA9IDB4JXhcbiIsCi0JCQkJRW50cnlOdW0sIHBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5MaW5rU3VwZXJ2ZXJzaW9uVGltZW91dCkpOwotCQl9Ci0JfQotCi0JewotCQl1OCBsb2NhbEJ1Zls4XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJCUhDSV9XUklURV9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVQsCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7Ci0JCXBSZXRQYXJbMV0gPSBwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlOwotCQlwUmV0UGFyWzJdID0gMDsKLQkJbGVuICs9IDM7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZEVuaGFuY2VkRmx1c2goCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRpbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRpbmZvLT5CdEhjaUluZm87Ci0JdTE2CQlsb2dpY0hhbmRsZTsKLQl1OCBQYWNrZXRfVHlwZTsKLQotCWxvZ2ljSGFuZGxlID0gKigodTE2ICopJnBIY2lDbWQtPkRhdGFbMF0pOwotCVBhY2tldF9UeXBlID0gcEhjaUNtZC0+RGF0YVsyXTsKLQotCWlmIChQYWNrZXRfVHlwZSAhPSAwKQotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX0lOVkFMSURfSENJX0NNRF9QQVJBX1ZBTFVFOwotCWVsc2UKLQkJcEJ0SGNpSW5mby0+ZW5GbHVzaF9MTEggPSBsb2dpY0hhbmRsZTsKLQotCWlmIChidGhjaV9EaXNjYXJkVHhQYWNrZXRzKHBhZGFwdGVyLCBwQnRIY2lJbmZvLT5lbkZsdXNoX0xMSCkpCi0JCWJ0aGNpX0V2ZW50Rmx1c2hPY2N1cnJlZChwYWRhcHRlciwgcEJ0SGNpSW5mby0+ZW5GbHVzaF9MTEgpOwotCi0JLyogIHNob3VsZCBzZW5kIGNvbW1hbmQgc3RhdHVzIGV2ZW50ICovCi0JYnRoY2lfRXZlbnRDb21tYW5kU3RhdHVzKHBhZGFwdGVyLAotCQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCQlIQ0lfRU5IQU5DRURfRkxVU0gsCi0JCQlzdGF0dXMpOwotCi0JaWYgKHBCdEhjaUluZm8tPmVuRmx1c2hfTExIKSB7Ci0JCWJ0aGNpX0V2ZW50RW5oYW5jZWRGbHVzaENvbXBsZXRlKHBhZGFwdGVyLCBwQnRIY2lJbmZvLT5lbkZsdXNoX0xMSCk7Ci0JCXBCdEhjaUluZm8tPmVuRmx1c2hfTExIID0gMDsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRSZWFkTG9naWNhbExpbmtBY2NlcHRUaW1lb3V0KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXU4IGxvY2FsQnVmWzhdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0JdTE2ICpwdTJUZW1wOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJSENJX1JFQURfTE9HSUNBTF9MSU5LX0FDQ0VQVF9USU1FT1VULAotCQlzdGF0dXMpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7Ci0KLQlwdTJUZW1wID0gKHUxNiAqKSZwUmV0UGFyWzFdOwkJLyogIENvbm5fQWNjZXB0X1RpbWVvdXQgKi8KLQkqcHUyVGVtcCA9IHBCdEhjaUluZm8tPkxvZ2ljYWxBY2NlcHRUaW1lb3V0OwotCWxlbiArPSAzOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRXcml0ZUxvZ2ljYWxMaW5rQWNjZXB0VGltZW91dCgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cwkJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotLypQTUdOVF9JTkZPCQlwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JcEJ0SGNpSW5mby0+TG9naWNhbEFjY2VwdFRpbWVvdXQgPSAqKCh1MTYgKilwSGNpQ21kLT5EYXRhKTsKLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCUhDSV9XUklURV9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVQsCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsKLQotCWxlbiArPSAxOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kU2V0RXZlbnRNYXNrKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXU4ICpwdThUZW1wOwotCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQlwdThUZW1wID0gKHU4ICopJnBIY2lDbWQtPkRhdGFbMF07Ci0JcEJ0SGNpSW5mby0+QlRFdmVudE1hc2sgPSAqcHU4VGVtcDsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0RFVEFJTCwgKCJCVEV2ZW50TWFzayA9IDB4JSJpNjRmbXQieFxuIiwKLQkJcEJ0SGNpSW5mby0+QlRFdmVudE1hc2spKTsKLQotCS8qIHNlbmQgY29tbWFuZCBjb21wbGV0ZSBldmVudCBoZXJlIHdoZW4gYWxsIGRhdGEgYXJlIHJlY2VpdmVkLiAqLwotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCUhDSV9TRVRfRVZFTlRfTUFTSywKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JbGVuICs9IDE7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qICA3LjMuNjkgKi8KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFNldEV2ZW50TWFza1BhZ2UyKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXU4ICpwdThUZW1wOwotCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQlwdThUZW1wID0gKHU4ICopJnBIY2lDbWQtPkRhdGFbMF07Ci0JcEJ0SGNpSW5mby0+QlRFdmVudE1hc2tQYWdlMiA9ICpwdThUZW1wOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwgKCJCVEV2ZW50TWFza1BhZ2UyID0gMHglImk2NGZtdCJ4XG4iLAotCQlwQnRIY2lJbmZvLT5CVEV2ZW50TWFza1BhZ2UyKSk7Ci0KLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQlIQ0lfU0VUX0VWRU5UX01BU0tfUEFHRV8yLAotCQlzdGF0dXMpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQlsZW4gKz0gMTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kUmVhZExvY2F0aW9uRGF0YSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cwkJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1OCBsb2NhbEJ1ZlsxMl0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQl1MTYgKnB1MlRlbXA7Ci0KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQlIQ0lfUkVBRF9MT0NBVElPTl9EQVRBLAotCQlzdGF0dXMpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiRG9tYWluQXdhcmUgPSAweCV4XG4iLCBwQnRIY2lJbmZvLT5Mb2NhdGlvbkRvbWFpbkF3YXJlKSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJEb21haW4gPSAweCV4XG4iLCBwQnRIY2lJbmZvLT5Mb2NhdGlvbkRvbWFpbikpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiRG9tYWluT3B0aW9ucyA9IDB4JXhcbiIsIHBCdEhjaUluZm8tPkxvY2F0aW9uRG9tYWluT3B0aW9ucykpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiT3B0aW9ucyA9IDB4JXhcbiIsIHBCdEhjaUluZm8tPkxvY2F0aW9uT3B0aW9ucykpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7Ci0KLQlwUmV0UGFyWzFdID0gcEJ0SGNpSW5mby0+TG9jYXRpb25Eb21haW5Bd2FyZTsJLyogMHgwOwkgTG9jYXRpb25fRG9tYWluX0F3YXJlICovCi0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhclsyXTsJCQkJCS8qICBMb2NhdGlvbl9Eb21haW4gKi8KLQkqcHUyVGVtcCA9IHBCdEhjaUluZm8tPkxvY2F0aW9uRG9tYWluOwkJLyogMHg1ODU4OyAqLwotCXBSZXRQYXJbNF0gPSBwQnRIY2lJbmZvLT5Mb2NhdGlvbkRvbWFpbk9wdGlvbnM7CS8qIDB4NTg7CUxvY2F0aW9uX0RvbWFpbl9PcHRpb25zICovCi0JcFJldFBhcls1XSA9IHBCdEhjaUluZm8tPkxvY2F0aW9uT3B0aW9uczsJCS8qIDB4MDsJTG9jYXRpb25fT3B0aW9ucyAqLwotCWxlbiArPSA2OwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kV3JpdGVMb2NhdGlvbkRhdGEoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1MTYJKnB1MlRlbXA7Ci0JdTggbG9jYWxCdWZbNl0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCXBCdEhjaUluZm8tPkxvY2F0aW9uRG9tYWluQXdhcmUgPSBwSGNpQ21kLT5EYXRhWzBdOwotCXB1MlRlbXAgPSAodTE2ICopJnBIY2lDbWQtPkRhdGFbMV07Ci0JcEJ0SGNpSW5mby0+TG9jYXRpb25Eb21haW4gPSAqcHUyVGVtcDsKLQlwQnRIY2lJbmZvLT5Mb2NhdGlvbkRvbWFpbk9wdGlvbnMgPSBwSGNpQ21kLT5EYXRhWzNdOwotCXBCdEhjaUluZm8tPkxvY2F0aW9uT3B0aW9ucyA9IHBIY2lDbWQtPkRhdGFbNF07Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJEb21haW5Bd2FyZSA9IDB4JXhcbiIsIHBCdEhjaUluZm8tPkxvY2F0aW9uRG9tYWluQXdhcmUpKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkRvbWFpbiA9IDB4JXhcbiIsIHBCdEhjaUluZm8tPkxvY2F0aW9uRG9tYWluKSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJEb21haW5PcHRpb25zID0gMHgleFxuIiwgcEJ0SGNpSW5mby0+TG9jYXRpb25Eb21haW5PcHRpb25zKSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJPcHRpb25zID0gMHgleFxuIiwgcEJ0SGNpSW5mby0+TG9jYXRpb25PcHRpb25zKSk7Ci0KLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQlIQ0lfV1JJVEVfTE9DQVRJT05fREFUQSwKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JbGVuICs9IDE7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFJlYWRGbG93Q29udHJvbE1vZGUoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1OCBsb2NhbEJ1Zls3XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJSENJX1JFQURfRkxPV19DT05UUk9MX01PREUsCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsKLQlwUmV0UGFyWzFdID0gcEJ0SGNpSW5mby0+Rmxvd0NvbnRyb2xNb2RlOwkvKiAgRmxvdyBDb250cm9sIE1vZGUgKi8KLQlsZW4gKz0gMjsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFdyaXRlRmxvd0NvbnRyb2xNb2RlKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JdTggbG9jYWxCdWZbNl0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCXBCdEhjaUluZm8tPkZsb3dDb250cm9sTW9kZSA9IHBIY2lDbWQtPkRhdGFbMF07Ci0KLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQlIQ0lfV1JJVEVfRkxPV19DT05UUk9MX01PREUsCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCWxlbiArPSAxOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRSZWFkQmVzdEVmZm9ydEZsdXNoVGltZW91dCgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUaW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQl1MTYgaSwgaiwgbG9naWNIYW5kbGU7Ci0JdTMyIEJlc3RFZmZvcnRGbHVzaFRpbWVvdXQgPSAweGZmZmZmZmZmOwotCXU4IGZpbmQgPSAwOwotCi0JbG9naWNIYW5kbGUgPSAqKCh1MTYgKilwSGNpQ21kLT5EYXRhKTsKLQkvKiAgZmluZCBhbiBtYXRjaGVkIGxvZ2ljYWwgbGluayBpbmRleCBhbmQgY29weSB0aGUgZGF0YSAqLwotCWZvciAoaiA9IDA7IGogPCBNQVhfQlRfQVNPQ19FTlRSWV9OVU07IGorKykgewotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xPR0lDQUxfTElOS19OVU07IGkrKykgewotCQkJaWYgKHBCVGluZm8tPkJ0QXNvY0VudHJ5W2pdLkxvZ0xpbmtDbWREYXRhW2ldLkJ0TG9nTGlua2hhbmRsZSA9PSBsb2dpY0hhbmRsZSkgewotCQkJCUJlc3RFZmZvcnRGbHVzaFRpbWVvdXQgPSBwQlRpbmZvLT5CdEFzb2NFbnRyeVtqXS5Mb2dMaW5rQ21kRGF0YVtpXS5CZXN0RWZmb3J0Rmx1c2hUaW1lb3V0OwotCQkJCWZpbmQgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKCFmaW5kKQotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCi0JewotCQl1OCBsb2NhbEJ1ZlsxMF0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQkJdTMyICpwdTRUZW1wOwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJCUhDSV9SRUFEX0JFU1RfRUZGT1JUX0ZMVVNIX1RJTUVPVVQsCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7Ci0JCXB1NFRlbXAgPSAodTMyICopJnBSZXRQYXJbMV07CS8qICBCZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0ICovCi0JCSpwdTRUZW1wID0gQmVzdEVmZm9ydEZsdXNoVGltZW91dDsKLQkJbGVuICs9IDU7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRXcml0ZUJlc3RFZmZvcnRGbHVzaFRpbWVvdXQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVGluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JdTE2IGksIGosIGxvZ2ljSGFuZGxlOwotCXUzMiBCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0ID0gMHhmZmZmZmZmZjsKLQl1OCBmaW5kID0gMDsKLQotCWxvZ2ljSGFuZGxlID0gKigodTE2ICopcEhjaUNtZC0+RGF0YSk7Ci0JQmVzdEVmZm9ydEZsdXNoVGltZW91dCA9ICooKHUzMiAqKShwSGNpQ21kLT5EYXRhKzEpKTsKLQotCS8qICBmaW5kIGFuIG1hdGNoZWQgbG9naWNhbCBsaW5rIGluZGV4IGFuZCBjb3B5IHRoZSBkYXRhICovCi0JZm9yIChqID0gMDsgaiA8IE1BWF9CVF9BU09DX0VOVFJZX05VTTsgaisrKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTE9HSUNBTF9MSU5LX05VTTsgaSsrKSB7Ci0JCQlpZiAocEJUaW5mby0+QnRBc29jRW50cnlbal0uTG9nTGlua0NtZERhdGFbaV0uQnRMb2dMaW5raGFuZGxlID09IGxvZ2ljSGFuZGxlKSB7Ci0JCQkJcEJUaW5mby0+QnRBc29jRW50cnlbal0uTG9nTGlua0NtZERhdGFbaV0uQmVzdEVmZm9ydEZsdXNoVGltZW91dCA9IEJlc3RFZmZvcnRGbHVzaFRpbWVvdXQ7Ci0JCQkJZmluZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoIWZpbmQpCi0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0KLQl7Ci0JCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQkJSENJX1dSSVRFX0JFU1RfRUZGT1JUX0ZMVVNIX1RJTUVPVVQsCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7Ci0JCWxlbiArPSAxOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kU2hvcnRSYW5nZU1vZGUoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JdTggUGh5TGlua0hhbmRsZSwgRW50cnlOdW0sIFNob3J0UmFuZ2VNb2RlOwotCi0JUGh5TGlua0hhbmRsZSA9IHBIY2lDbWQtPkRhdGFbMF07Ci0JU2hvcnRSYW5nZU1vZGUgPSBwSGNpQ21kLT5EYXRhWzFdOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiUExIID0gMHgleCwgU2hvcnRfUmFuZ2VfTW9kZSA9IDB4JXhcbiIsIFBoeUxpbmtIYW5kbGUsIFNob3J0UmFuZ2VNb2RlKSk7Ci0KLQlFbnRyeU51bSA9IGJ0aGNpX0dldEN1cnJlbnRFbnRyeU51bShwYWRhcHRlciwgUGh5TGlua0hhbmRsZSk7Ci0JaWYgKEVudHJ5TnVtICE9IDB4ZmYpIHsKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlNob3J0UmFuZ2VNb2RlID0gU2hvcnRSYW5nZU1vZGU7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJObyBzdWNoIFBMSCgweCV4KVxuIiwgUGh5TGlua0hhbmRsZSkpOwotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCX0KLQotCWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cyhwYWRhcHRlciwKLQkJCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQkJSENJX1NIT1JUX1JBTkdFX01PREUsCi0JCQlzdGF0dXMpOwotCi0JYnRoY2lfRXZlbnRTaG9ydFJhbmdlTW9kZUNoYW5nZUNvbXBsZXRlKHBhZGFwdGVyLCBzdGF0dXMsIFNob3J0UmFuZ2VNb2RlLCBFbnRyeU51bSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzIGJ0aGNpX0NtZFJlYWRMb2NhbFN1cHBvcnRlZENvbW1hbmRzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQl1OCBsb2NhbEJ1ZltUbXBMb2NhbEJ1ZlNpemVdID0gIiI7Ci0JdTggKnBSZXRQYXIsICpwU3VwcG9ydGVkQ21kczsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCS8qICBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQlQbGF0Zm9ybVplcm9NZW1vcnkoJmxvY2FsQnVmWzBdLCBUbXBMb2NhbEJ1ZlNpemUpOwotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX0lORk9STUFUSU9OQUxfUEFSQU1FVEVSUywKLQkJSENJX1JFQURfTE9DQUxfU1VQUE9SVEVEX0NPTU1BTkRTLAotCQlzdGF0dXMpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQlsZW4gKz0gMTsKLQlwU3VwcG9ydGVkQ21kcyA9ICZwUmV0UGFyWzFdOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIk9jdGV0WzVdPSAweGMwXG5CaXQgWzZdPSBTZXQgRXZlbnQgTWFzaywgWzddPSBSZXNldFxuIikpOwotCXBTdXBwb3J0ZWRDbWRzWzVdID0gMHhjMDsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJPY3RldFs2XT0gMHgwMVxuQml0IFswXT0gU2V0IEV2ZW50IEZpbHRlclxuIikpOwotCXBTdXBwb3J0ZWRDbWRzWzZdID0gMHgwMTsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJPY3RldFs3XT0gMHgwY1xuQml0IFsyXT0gUmVhZCBDb25uZWN0aW9uIEFjY2VwdCBUaW1lb3V0LCBbM109IFdyaXRlIENvbm5lY3Rpb24gQWNjZXB0IFRpbWVvdXRcbiIpKTsKLQlwU3VwcG9ydGVkQ21kc1s3XSA9IDB4MGM7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksICgiT2N0ZXRbMTBdPSAweDgwXG5CaXQgWzddPSBIb3N0IE51bWJlciBPZiBDb21wbGV0ZWQgUGFja2V0c1xuIikpOwotCXBTdXBwb3J0ZWRDbWRzWzEwXSA9IDB4ODA7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksICgiT2N0ZXRbMTFdPSAweDAzXG5CaXQgWzBdPSBSZWFkIExpbmsgU3VwZXJ2aXNpb24gVGltZW91dCwgWzFdPSBXcml0ZSBMaW5rIFN1cGVydmlzaW9uIFRpbWVvdXRcbiIpKTsKLQlwU3VwcG9ydGVkQ21kc1sxMV0gPSAweDAzOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIk9jdGV0WzE0XT0gMHhhOFxuQml0IFszXT0gUmVhZCBMb2NhbCBWZXJzaW9uIEluZm9ybWF0aW9uLCBbNV09IFJlYWQgTG9jYWwgU3VwcG9ydGVkIEZlYXR1cmVzLCBbN109IFJlYWQgQnVmZmVyIFNpemVcbiIpKTsKLQlwU3VwcG9ydGVkQ21kc1sxNF0gPSAweGE4OwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIk9jdGV0WzE1XT0gMHgxY1xuQml0IFsyXT0gUmVhZCBGYWlsZWQgQ29udGFjdCBDb3VudCwgWzNdPSBSZXNldCBGYWlsZWQgQ29udGFjdCBDb3VudCwgWzRdPSBHZXQgTGluayBRdWFsaXR5XG4iKSk7Ci0JcFN1cHBvcnRlZENtZHNbMTVdID0gMHgxYzsKLQkvKiBwU3VwcG9ydGVkQ21kc1sxNl0gPSAweDA0OyAqLwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIk9jdGV0WzE5XT0gMHg0MFxuQml0IFs2XT0gRW5oYW5jZWQgRmx1c2hcbiIpKTsKLQlwU3VwcG9ydGVkQ21kc1sxOV0gPSAweDQwOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIk9jdGV0WzIxXT0gMHhmZlxuQml0IFswXT0gQ3JlYXRlIFBoeXNpY2FsIExpbmssIFsxXT0gQWNjZXB0IFBoeXNpY2FsIExpbmssIFsyXT0gRGlzY29ubmVjdCBQaHlzaWNhbCBMaW5rLCBbM109IENyZWF0ZSBMb2dpY2FsIExpbmtcbiIpKTsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCIJWzRdPSBBY2NlcHQgTG9naWNhbCBMaW5rLCBbNV09IERpc2Nvbm5lY3QgTG9naWNhbCBMaW5rLCBbNl09IExvZ2ljYWwgTGluayBDYW5jZWwsIFs3XT0gRmxvdyBTcGVjIE1vZGlmeVxuIikpOwotCXBTdXBwb3J0ZWRDbWRzWzIxXSA9IDB4ZmY7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksICgiT2N0ZXRbMjJdPSAweGZmXG5CaXQgWzBdPSBSZWFkIExvZ2ljYWwgTGluayBBY2NlcHQgVGltZW91dCwgWzFdPSBXcml0ZSBMb2dpY2FsIExpbmsgQWNjZXB0IFRpbWVvdXQsIFsyXT0gU2V0IEV2ZW50IE1hc2sgUGFnZSAyLCBbM109IFJlYWQgTG9jYXRpb24gRGF0YVxuIikpOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIglbNF09IFdyaXRlIExvY2F0aW9uIERhdGEsIFs1XT0gUmVhZCBMb2NhbCBBTVAgSW5mbywgWzZdPSBSZWFkIExvY2FsIEFNUF9BU1NPQywgWzddPSBXcml0ZSBSZW1vdGUgQU1QX0FTU09DXG4iKSk7Ci0JcFN1cHBvcnRlZENtZHNbMjJdID0gMHhmZjsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJPY3RldFsyM109IDB4MDdcbkJpdCBbMF09IFJlYWQgRmxvdyBDb250cm9sIE1vZGUsIFsxXT0gV3JpdGUgRmxvdyBDb250cm9sIE1vZGUsIFsyXT0gUmVhZCBEYXRhIEJsb2NrIFNpemVcbiIpKTsKLQlwU3VwcG9ydGVkQ21kc1syM10gPSAweDA3OwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIk9jdGV0WzI0XT0gMHgxY1xuQml0IFsyXT0gUmVhZCBCZXN0IEVmZm9ydCBGbHVzaCBUaW1lb3V0LCBbM109IFdyaXRlIEJlc3QgRWZmb3J0IEZsdXNoIFRpbWVvdXQsIFs0XT0gU2hvcnQgUmFuZ2UgTW9kZVxuIikpOwotCXBTdXBwb3J0ZWRDbWRzWzI0XSA9IDB4MWM7Ci0JbGVuICs9IDY0OwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzIGJ0aGNpX0NtZFJlYWRMb2NhbFN1cHBvcnRlZEZlYXR1cmVzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQl1OCBsb2NhbEJ1ZltUbXBMb2NhbEJ1ZlNpemVdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQlQbGF0Zm9ybVplcm9NZW1vcnkoJmxvY2FsQnVmWzBdLCBUbXBMb2NhbEJ1ZlNpemUpOwotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX0lORk9STUFUSU9OQUxfUEFSQU1FVEVSUywKLQkJSENJX1JFQURfTE9DQUxfU1VQUE9SVEVEX0ZFQVRVUkVTLAotCQlzdGF0dXMpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQlsZW4gKz0gOTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMgYnRoY2lfQ21kUmVhZExvY2FsQU1QQXNzb2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQl1OCBQaHlMaW5rSGFuZGxlLCBFbnRyeU51bTsKLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnRSZWFkTG9jYWxBbXBBc3NvYysrOwotCVBoeUxpbmtIYW5kbGUgPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCUVudHJ5TnVtID0gYnRoY2lfR2V0Q3VycmVudEVudHJ5TnVtKHBhZGFwdGVyLCBQaHlMaW5rSGFuZGxlKTsKLQotCWlmICgoRW50cnlOdW0gPT0gMHhmZikgJiYgUGh5TGlua0hhbmRsZSAhPSAwKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiUmVhZExvY2FsQU1QQXNzb2MsIEVudHJ5TnVtID0gJWQgICEhISEhLCBwaHlzaWNhbCBsaW5rIGhhbmRsZSA9IDB4JXhcbiIsCi0JCUVudHJ5TnVtLCBQaHlMaW5rSGFuZGxlKSk7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0JfSBlbHNlIGlmIChwQnRNZ250LT5iUGh5TGlua0luUHJvZ3Jlc3NTdGFydExMKSB7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0JCXBCdE1nbnQtPmJQaHlMaW5rSW5Qcm9ncmVzc1N0YXJ0TEwgPSBmYWxzZTsKLQl9IGVsc2UgewotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuQnRQaHlMaW5raGFuZGxlID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFtcEFzb2NDbWREYXRhLkxlblNvRmFyID0gKigodTE2ICopKCh1OCAqKXBIY2lDbWQtPkRhdGErMSkpOwotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuTWF4UmVtb3RlQVNTT0NMZW4gPSAqKCh1MTYgKikoKHU4ICopcEhjaUNtZC0+RGF0YSszKSk7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfREVUQUlMLCAoIlJlYWRMb2NhbEFNUEFzc29jLCBMZW5Tb0ZhciA9JWQsIE1heFJlbW90ZUFTU09DTGVuID0lZFxuIiwKLQkJCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5MZW5Tb0ZhciwKLQkJCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5NYXhSZW1vdGVBU1NPQ0xlbikpOwotCX0KLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiUmVhZExvY2FsQU1QQXNzb2MsIEVudHJ5TnVtID0gJWQgICEhISEhLCBwaHlzaWNhbCBsaW5rIGhhbmRsZSA9IDB4JXgsIExlbmd0aFNvRmFyID0gJXggIFxuIiwKLQkJRW50cnlOdW0sIFBoeUxpbmtIYW5kbGUsIHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5MZW5Tb0ZhcikpOwotCi0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JewotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJLyogUFZPSUQgYnVmZmVyID0gcGFkYXB0ZXItPklycEhDSUxvY2FsYnVmLlB0cjsgKi8KLQkJdTggbG9jYWxCdWZbVG1wTG9jYWxCdWZTaXplXSA9ICIiOwotCQl1MTYJKnBSZW1haW5MZW47Ci0JCXUzMgl0b3RhbExlbiA9IDA7Ci0JCXUxNgl0eXBlTGVuID0gMCwgcmVtYWluTGVuID0gMCwgcmV0X2luZGV4ID0gMDsKLQkJdTggKnBSZXRQYXI7Ci0KLQkJUGxhdGZvcm1aZXJvTWVtb3J5KCZsb2NhbEJ1ZlswXSwgVG1wTG9jYWxCdWZTaXplKTsKLQkJLyogUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoYnVmZmVyKTsgKi8KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQl0b3RhbExlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX1NUQVRVU19QQVJBTUVURVJTLAotCQkJSENJX1JFQURfTE9DQUxfQU1QX0FTU09DLAotCQkJc3RhdHVzKTsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJSZWFkTG9jYWxBTVBBc3NvYywgUmVtYWluaW5nX0xlbiA9JWQgIFxuIiwgcmVtYWluTGVuKSk7Ci0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW3RvdGFsTGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCQlwUmV0UGFyWzFdID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQkJcFJlbWFpbkxlbiA9ICh1MTYgKikmcFJldFBhclsyXTsJLyogQU1QX0FTU09DX1JlbWFpbmluZ19MZW5ndGggKi8KLQkJdG90YWxMZW4gKz0gNDsJLyogMF1+WzNdICovCi0JCXJldF9pbmRleCA9IDQ7Ci0KLQkJdHlwZUxlbiA9IGJ0aGNpX0Fzc29jTUFDQWRkcihwYWRhcHRlciwgJnBSZXRQYXJbcmV0X2luZGV4XSk7Ci0JCXRvdGFsTGVuICs9IHR5cGVMZW47Ci0JCXJlbWFpbkxlbiArPSB0eXBlTGVuOwotCQlyZXRfaW5kZXggKz0gdHlwZUxlbjsKLQkJdHlwZUxlbiA9IGJ0aGNpX0Fzc29jUHJlZmVycmVkQ2hhbm5lbExpc3QocGFkYXB0ZXIsICZwUmV0UGFyW3JldF9pbmRleF0sIEVudHJ5TnVtKTsKLQkJdG90YWxMZW4gKz0gdHlwZUxlbjsKLQkJcmVtYWluTGVuICs9IHR5cGVMZW47Ci0JCXJldF9pbmRleCArPSB0eXBlTGVuOwotCQl0eXBlTGVuID0gYnRoY2lfUEFMQ2FwYWJpbGl0aWVzKHBhZGFwdGVyLCAmcFJldFBhcltyZXRfaW5kZXhdKTsKLQkJdG90YWxMZW4gKz0gdHlwZUxlbjsKLQkJcmVtYWluTGVuICs9IHR5cGVMZW47Ci0JCXJldF9pbmRleCArPSB0eXBlTGVuOwotCQl0eXBlTGVuID0gYnRoY2lfQXNzb2NQQUxWZXIocGFkYXB0ZXIsICZwUmV0UGFyW3JldF9pbmRleF0pOwotCQl0b3RhbExlbiArPSB0eXBlTGVuOwotCQlyZW1haW5MZW4gKz0gdHlwZUxlbjsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSAodTgpdG90YWxMZW47Ci0JCSpwUmVtYWluTGVuID0gcmVtYWluTGVuOwkvKiAgQU1QX0FTU09DX1JlbWFpbmluZ19MZW5ndGggKi8KLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJSZWFkTG9jYWxBTVBBc3NvYywgUmVtYWluaW5nX0xlbiA9JWQgIFxuIiwgcmVtYWluTGVuKSk7Ci0JCVJUUFJJTlRfREFUQShGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTURfREVUQUlMfElPQ1RMX0JUX0xPR08pLCAoIkFNUF9BU1NPQ19mcmFnbWVudCA6IFxuIiksIFBQYWNrZXRJcnBFdmVudC0+RGF0YSwgdG90YWxMZW4pOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgdG90YWxMZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cyBidGhjaV9DbWRSZWFkRmFpbGVkQ29udGFjdENvdW50ZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICAgIHN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCi0JZW51bSBoY2lfc3RhdHVzCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXU4IGxvY2FsQnVmW1RtcExvY2FsQnVmU2l6ZV0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQl1MTYgaGFuZGxlOwotCi0JaGFuZGxlID0gKigodTE2ICopcEhjaUNtZC0+RGF0YSk7Ci0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JUGxhdGZvcm1aZXJvTWVtb3J5KCZsb2NhbEJ1ZlswXSwgVG1wTG9jYWxCdWZTaXplKTsKLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TVEFUVVNfUEFSQU1FVEVSUywKLQkJSENJX1JFQURfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUiwKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JcFJldFBhclsxXSA9IFRXT0JZVEVfTE9XQllURShoYW5kbGUpOwotCXBSZXRQYXJbMl0gPSBUV09CWVRFX0hJR0hUQllURShoYW5kbGUpOwotCXBSZXRQYXJbM10gPSBUV09CWVRFX0xPV0JZVEUocEJ0SGNpSW5mby0+RmFpbENvbnRhY3RDb3VudCk7Ci0JcFJldFBhcls0XSA9IFRXT0JZVEVfSElHSFRCWVRFKHBCdEhjaUluZm8tPkZhaWxDb250YWN0Q291bnQpOwotCWxlbiArPSA1OwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRSZXNldEZhaWxlZENvbnRhY3RDb3VudGVyKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXUxNgkJaGFuZGxlOwotCXU4IGxvY2FsQnVmW1RtcExvY2FsQnVmU2l6ZV0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCWhhbmRsZSA9ICooKHUxNiAqKXBIY2lDbWQtPkRhdGEpOwotCXBCdEhjaUluZm8tPkZhaWxDb250YWN0Q291bnQgPSAwOwotCi0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JUGxhdGZvcm1aZXJvTWVtb3J5KCZsb2NhbEJ1ZlswXSwgVG1wTG9jYWxCdWZTaXplKTsKLQkvKiBQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKShidWZmZXIpOyAqLwotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX1NUQVRVU19QQVJBTUVURVJTLAotCQlIQ0lfUkVTRVRfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUiwKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JcFJldFBhclsxXSA9IFRXT0JZVEVfTE9XQllURShoYW5kbGUpOwotCXBSZXRQYXJbMl0gPSBUV09CWVRFX0hJR0hUQllURShoYW5kbGUpOwotCWxlbiArPSAzOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyogICovCi0vKiAgQlQgMy4wK0hTIFtWb2wgMl0gNy40LjEgKi8KLS8qICAqLwotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kUmVhZExvY2FsVmVyc2lvbkluZm9ybWF0aW9uKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQl1OCBsb2NhbEJ1ZltUbXBMb2NhbEJ1ZlNpemVdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0JdTE2ICpwdTJUZW1wOwotCi0JUGxhdGZvcm1aZXJvTWVtb3J5KCZsb2NhbEJ1ZlswXSwgVG1wTG9jYWxCdWZTaXplKTsKLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9JTkZPUk1BVElPTkFMX1BBUkFNRVRFUlMsCi0JCUhDSV9SRUFEX0xPQ0FMX1ZFUlNJT05fSU5GT1JNQVRJT04sCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCXBSZXRQYXJbMV0gPSAweDA1OwkJCS8qICBIQ0lfVmVyc2lvbiAqLwotCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbMl07CQkvKiAgSENJX1JldmlzaW9uICovCi0JKnB1MlRlbXAgPSAweDAwMDE7Ci0JcFJldFBhcls0XSA9IDB4MDU7CQkJLyogIExNUC9QQUxfVmVyc2lvbiAqLwotCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbNV07CQkvKiAgTWFudWZhY3R1cmVyX05hbWUgKi8KLQkqcHUyVGVtcCA9IDB4MDA1ZDsKLQlwdTJUZW1wID0gKHUxNiAqKSZwUmV0UGFyWzddOwkJLyogIExNUC9QQUxfU3VidmVyc2lvbiAqLwotCSpwdTJUZW1wID0gMHgwMDAxOwotCWxlbiArPSA5OwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTURfREVUQUlMfElPQ1RMX0JUX0xPR08pLCAoIkxPQ0FMX1ZFUlNJT05fSU5GT1JNQVRJT05cbiIpKTsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRF9ERVRBSUx8SU9DVExfQlRfTE9HTyksICgiU3RhdHVzICAleFxuIiwgc3RhdHVzKSk7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTURfREVUQUlMfElPQ1RMX0JUX0xPR08pLCAoIkhDSV9WZXJzaW9uID0gMHgwNVxuIikpOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwgKCJIQ0lfUmV2aXNpb24gPSAweDAwMDFcbiIpKTsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRF9ERVRBSUx8SU9DVExfQlRfTE9HTyksICgiTE1QL1BBTF9WZXJzaW9uID0gMHgwNVxuIikpOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwgKCJNYW51ZmFjdHVyZXJfTmFtZSA9IDB4MDAwMVxuIikpOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwgKCJMTVAvUEFMX1N1YnZlcnNpb24gPSAweDAwMDFcbiIpKTsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyogNy40LjcgKi8KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMgYnRoY2lfQ21kUmVhZERhdGFCbG9ja1NpemUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQllbnVtIGhjaV9zdGF0dXMJCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0JdTggbG9jYWxCdWZbVG1wTG9jYWxCdWZTaXplXSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCXUxNiAqcHUyVGVtcDsKLQotCVBsYXRmb3JtWmVyb01lbW9yeSgmbG9jYWxCdWZbMF0sIFRtcExvY2FsQnVmU2l6ZSk7Ci0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfSU5GT1JNQVRJT05BTF9QQVJBTUVURVJTLAotCQlIQ0lfUkVBRF9EQVRBX0JMT0NLX1NJWkUsCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsJLyogc3RhdHVzICovCi0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhclsxXTsJCS8qICBNYXhfQUNMX0RhdGFfUGFja2V0X0xlbmd0aCAqLwotCSpwdTJUZW1wID0gTWF4ODAyMTFQQUxQRFVTaXplOwotCi0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhclszXTsJCS8qICBEYXRhX0Jsb2NrX0xlbmd0aCAqLwotCSpwdTJUZW1wID0gTWF4ODAyMTFQQUxQRFVTaXplOwotCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbNV07CQkvKiAgVG90YWxfTnVtX0RhdGFfQmxvY2tzICovCi0JKnB1MlRlbXAgPSBCVFRvdGFsRGF0YUJsb2NrTnVtOwotCWxlbiArPSA3OwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKiAgNy40LjUgKi8KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMgYnRoY2lfQ21kUmVhZEJ1ZmZlclNpemUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXU4IGxvY2FsQnVmW1RtcExvY2FsQnVmU2l6ZV0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQl1MTYgKnB1MlRlbXA7Ci0KLQlQbGF0Zm9ybVplcm9NZW1vcnkoJmxvY2FsQnVmWzBdLCBUbXBMb2NhbEJ1ZlNpemUpOwotCS8qIFBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKGJ1ZmZlcik7ICovCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfSU5GT1JNQVRJT05BTF9QQVJBTUVURVJTLAotCQlIQ0lfUkVBRF9CVUZGRVJfU0laRSwKLQkJc3RhdHVzKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIlN5bmNocm9ub3VzX0RhdGFfUGFja2V0X0xlbmd0aCA9IDB4JXhcbiIsIEJUU3luRGF0YVBhY2tldExlbmd0aCkpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiVG90YWxfTnVtX0FDTF9EYXRhX1BhY2tldHMgPSAweCV4XG4iLCBCVFRvdGFsRGF0YUJsb2NrTnVtKSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJUb3RhbF9OdW1fU3luY2hyb25vdXNfRGF0YV9QYWNrZXRzID0gMHgleFxuIiwgQlRUb3RhbERhdGFCbG9ja051bSkpOwotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhclsxXTsJCS8qICBIQ19BQ0xfRGF0YV9QYWNrZXRfTGVuZ3RoICovCi0JKnB1MlRlbXAgPSBNYXg4MDIxMVBBTFBEVVNpemU7Ci0KLQlwUmV0UGFyWzNdID0gQlRTeW5EYXRhUGFja2V0TGVuZ3RoOwkvKiAgSENfU3luY2hyb25vdXNfRGF0YV9QYWNrZXRfTGVuZ3RoICovCi0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhcls0XTsJCS8qICBIQ19Ub3RhbF9OdW1fQUNMX0RhdGFfUGFja2V0cyAqLwotCSpwdTJUZW1wID0gQlRUb3RhbERhdGFCbG9ja051bTsKLQlwdTJUZW1wID0gKHUxNiAqKSZwUmV0UGFyWzZdOwkJLyogIEhDX1RvdGFsX051bV9TeW5jaHJvbm91c19EYXRhX1BhY2tldHMgKi8KLQkqcHUyVGVtcCA9IEJUVG90YWxEYXRhQmxvY2tOdW07Ci0JbGVuICs9IDg7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMgYnRoY2lfQ21kUmVhZExvY2FsQU1QSW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWVudW0gaGNpX3N0YXR1cwlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHB3cmN0cmwgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCXU4IGxvY2FsQnVmW1RtcExvY2FsQnVmU2l6ZV0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQl1MTYgKnB1MlRlbXA7Ci0JdTMyICpwdTRUZW1wOwotCXUzMglUb3RhbEJhbmR3aWR0aCA9IEJUVE9UQUxCQU5EV0lEVEgsIE1heEJhbmRHVUJhbmR3aWR0aCA9IEJUTUFYQkFOREdVQkFORFdJRFRIOwotCXU4IENvbnRyb2xUeXBlID0gMHgwMSwgQW1wU3RhdHVzID0gMHgwMTsKLQl1MzIJTWF4Rmx1c2hUaW1lb3V0ID0gMTAwMDAsIEJlc3RFZmZvcnRGbHVzaFRpbWVvdXQgPSA1MDAwOwotCXUxNiBNYXhQRFVTaXplID0gTWF4ODAyMTFQQUxQRFVTaXplLCBQYWxDYXAgPSAweDEsIEFtcEFzc29jTGVuID0gTWF4ODAyMTFBTVBBU1NPQ0xlbiwgTWluTGF0ZW5jeSA9IDIwOwotCi0JaWYgKChwcHdyY3RybC0+cmZvZmZfcmVhc29uICYgUkZfQ0hBTkdFX0JZX0hXKSB8fAotCSAgICAocHB3cmN0cmwtPnJmb2ZmX3JlYXNvbiAmIFJGX0NIQU5HRV9CWV9TVykpIHsKLQkJQW1wU3RhdHVzID0gQU1QX1NUQVRVU19OT19DQVBBQ0lUWV9GT1JfQlQ7Ci0JfQotCi0JUGxhdGZvcm1aZXJvTWVtb3J5KCZsb2NhbEJ1ZlswXSwgVG1wTG9jYWxCdWZTaXplKTsKLQkvKiBQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKShidWZmZXIpOyAqLwotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX1NUQVRVU19QQVJBTUVURVJTLAotCQlIQ0lfUkVBRF9MT0NBTF9BTVBfSU5GTywKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJCS8qIHN0YXR1cyAqLwotCXBSZXRQYXJbMV0gPSBBbXBTdGF0dXM7CQkJLyogIEFNUF9TdGF0dXMgKi8KLQlwdTRUZW1wID0gKHUzMiAqKSZwUmV0UGFyWzJdOwkJLyogIFRvdGFsX0JhbmR3aWR0aCAqLwotCSpwdTRUZW1wID0gVG90YWxCYW5kd2lkdGg7CQkvKiAweDE5YmZjYzAwOzB4NzUzMDsgKi8KLQlwdTRUZW1wID0gKHUzMiAqKSZwUmV0UGFyWzZdOwkJLyogIE1heF9HdWFyYW50ZWVkX0JhbmR3aWR0aCAqLwotCSpwdTRUZW1wID0gTWF4QmFuZEdVQmFuZHdpZHRoOwkJLyogMHgxOWJmY2MwMDsweDRlMjA7ICovCi0JcHU0VGVtcCA9ICh1MzIgKikmcFJldFBhclsxMF07CQkvKiAgTWluX0xhdGVuY3kgKi8KLQkqcHU0VGVtcCA9IE1pbkxhdGVuY3k7CQkJLyogMTUwOyAqLwotCXB1NFRlbXAgPSAodTMyICopJnBSZXRQYXJbMTRdOwkJLyogIE1heF9QRFVfU2l6ZSAqLwotCSpwdTRUZW1wID0gTWF4UERVU2l6ZTsKLQlwUmV0UGFyWzE4XSA9IENvbnRyb2xUeXBlOwkJLyogIENvbnRyb2xsZXJfVHlwZSAqLwotCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbMTldOwkJLyogIFBBTF9DYXBhYmlsaXRpZXMgKi8KLQkqcHUyVGVtcCA9IFBhbENhcDsKLQlwdTJUZW1wID0gKHUxNiAqKSZwUmV0UGFyWzIxXTsJCS8qICBBTVBfQVNTT0NfTGVuZ3RoICovCi0JKnB1MlRlbXAgPSBBbXBBc3NvY0xlbjsKLQlwdTRUZW1wID0gKHUzMiAqKSZwUmV0UGFyWzIzXTsJCS8qICBNYXhfRmx1c2hfVGltZW91dCAqLwotCSpwdTRUZW1wID0gTWF4Rmx1c2hUaW1lb3V0OwotCXB1NFRlbXAgPSAodTMyICopJnBSZXRQYXJbMjddOwkJLyogIEJlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXQgKi8KLQkqcHU0VGVtcCA9IEJlc3RFZmZvcnRGbHVzaFRpbWVvdXQ7Ci0JbGVuICs9IDMxOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiQW1wU3RhdHVzID0gMHgleFxuIiwKLQkJQW1wU3RhdHVzKSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJUb3RhbEJhbmR3aWR0aCA9IDB4JXgsIE1heEJhbmRHVUJhbmR3aWR0aCA9IDB4JXgsIE1pbkxhdGVuY3kgPSAweCV4LCBcbiBNYXhQRFVTaXplID0gMHgleCwgQ29udHJvbFR5cGUgPSAweCV4XG4iLAotCQlUb3RhbEJhbmR3aWR0aCwgTWF4QmFuZEdVQmFuZHdpZHRoLCBNaW5MYXRlbmN5LCBNYXhQRFVTaXplLCBDb250cm9sVHlwZSkpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiUGFsQ2FwID0gMHgleCwgQW1wQXNzb2NMZW4gPSAweCV4LCBNYXhGbHVzaFRpbWVvdXQgPSAweCV4LCBCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0ID0gMHgleFxuIiwKLQkJUGFsQ2FwLCBBbXBBc3NvY0xlbiwgTWF4Rmx1c2hUaW1lb3V0LCBCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0KSk7Ci0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kQ3JlYXRlUGh5c2ljYWxMaW5rKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0KLQlwQnREYmctPmRiZ0hjaUluZm8uaGNpQ21kQ250Q3JlYXRlUGh5TGluaysrOwotCi0JcmV0dXJuIGJ0aGNpX0J1aWxkUGh5c2ljYWxMaW5rKHBhZGFwdGVyLAotCQlwSGNpQ21kLCBIQ0lfQ1JFQVRFX1BIWVNJQ0FMX0xJTkspOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRSZWFkTGlua1F1YWxpdHkoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQl1MTYJCQkJUExIOwotCXU4IAlFbnRyeU51bSwgTGlua1F1YWxpdHkgPSAweDU1OwotCi0JUExIID0gKigodTE2ICopJnBIY2lDbWQtPkRhdGFbMF0pOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiUExIID0gMHgleFxuIiwgUExIKSk7Ci0KLQlFbnRyeU51bSA9IGJ0aGNpX0dldEN1cnJlbnRFbnRyeU51bShwYWRhcHRlciwgKHU4KVBMSCk7Ci0JaWYgKEVudHJ5TnVtID09IDB4ZmYpIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJObyBzdWNoIFBMSCgweCV4KVxuIiwgUExIKSk7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0JfQotCi0JewotCQl1OCBsb2NhbEJ1ZlsxMV0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX1NUQVRVU19QQVJBTUVURVJTLAotCQkJSENJX1JFQURfTElOS19RVUFMSVRZLAotCQkJc3RhdHVzKTsKLQotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIiBQTEggPSAweCV4XG4gTGluayBRdWFsaXR5ID0gMHgleFxuIiwgUExILCBMaW5rUXVhbGl0eSkpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkJLyogc3RhdHVzICovCi0JCSooKHUxNiAqKSZwUmV0UGFyWzFdKSA9IHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGU7CS8qICBIYW5kbGUgKi8KLQkJcFJldFBhclszXSA9IDB4NTU7CS8qIExpbmsgUXVhaWx0eSAqLwotCQlsZW4gKz0gNDsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kQ3JlYXRlTG9naWNhbExpbmsoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnRDcmVhdGVMb2dMaW5rKys7Ci0KLQlidGhjaV9CdWlsZExvZ2ljYWxMaW5rKHBhZGFwdGVyLCBwSGNpQ21kLAotCQlIQ0lfQ1JFQVRFX0xPR0lDQUxfTElOSyk7Ci0KLQlyZXR1cm4gSENJX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRBY2NlcHRMb2dpY2FsTGluaygKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCi0JcEJ0RGJnLT5kYmdIY2lJbmZvLmhjaUNtZENudEFjY2VwdExvZ0xpbmsrKzsKLQotCWJ0aGNpX0J1aWxkTG9naWNhbExpbmsocGFkYXB0ZXIsIHBIY2lDbWQsCi0JCUhDSV9BQ0NFUFRfTE9HSUNBTF9MSU5LKTsKLQotCXJldHVybiBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZERpc2Nvbm5lY3RMb2dpY2FsTGluaygKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0vKlBNR05UX0lORk8gcE1nbnRJbmZvID0gJnBhZGFwdGVyLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRpbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVGluZm8tPkJ0TWdudDsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmcgPSAmcEJUaW5mby0+QnREYmc7Ci0JdTE2CWxvZ2ljSGFuZGxlOwotCXU4IGksIGosIGZpbmQgPSAwLCBMb2dMaW5rQ291bnQgPSAwOwotCi0JcEJ0RGJnLT5kYmdIY2lJbmZvLmhjaUNtZENudERpc2Nvbm5lY3RMb2dMaW5rKys7Ci0KLQlsb2dpY0hhbmRsZSA9ICooKHUxNiAqKXBIY2lDbWQtPkRhdGEpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiRGlzY29ubmVjdExvZ2ljYWxMaW5rLCBsb2dpY0hhbmRsZSA9IDB4JXhcbiIsIGxvZ2ljSGFuZGxlKSk7Ci0KLQkvKiAgZmluZCBhbiBjcmVhdGVkIGxvZ2ljYWwgbGluayBpbmRleCBhbmQgY2xlYXIgdGhlIGRhdGEgKi8KLQlmb3IgKGogPSAwOyBqIDwgTUFYX0JUX0FTT0NfRU5UUllfTlVNOyBqKyspIHsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9MT0dJQ0FMX0xJTktfTlVNOyBpKyspIHsKLQkJCWlmIChwQlRpbmZvLT5CdEFzb2NFbnRyeVtqXS5Mb2dMaW5rQ21kRGF0YVtpXS5CdExvZ0xpbmtoYW5kbGUgPT0gbG9naWNIYW5kbGUpIHsKLQkJCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkRpc2Nvbm5lY3RMb2dpY2FsTGluaywgbG9naWNIYW5kbGUgaXMgbWF0Y2hlZCAgMHgleFxuIiwgbG9naWNIYW5kbGUpKTsKLQkJCQlidGhjaV9SZXNldEZsb3dTcGVjKHBhZGFwdGVyLCBqLCBpKTsKLQkJCQlmaW5kID0gMTsKLQkJCQlwQnRNZ250LT5EaXNjb25uZWN0RW50cnlOdW0gPSBqOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKCFmaW5kKQotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCi0JLyogIFRvIGNoZWNrIGVhY2ggKi8KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xPR0lDQUxfTElOS19OVU07IGkrKykgewotCQlpZiAocEJUaW5mby0+QnRBc29jRW50cnlbcEJ0TWdudC0+RGlzY29ubmVjdEVudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpXS5CdExvZ0xpbmtoYW5kbGUgIT0gMCkKLQkJCUxvZ0xpbmtDb3VudCsrOwotCX0KLQotCS8qIFdoZW4gd2UgcmVjZWl2ZSBDcmVhdGUgbG9naWNhbCBsaW5rIGNvbW1hbmQsIHdlIHNob3VsZCBzZW5kIGNvbW1hbmQgc3RhdHVzIGV2ZW50IGZpcnN0LiAqLwotCWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cyhwYWRhcHRlciwKLQkJCUxJTktfQ09OVFJPTF9DT01NQU5EUywKLQkJCUhDSV9ESVNDT05ORUNUX0xPR0lDQUxfTElOSywKLQkJCXN0YXR1cyk7Ci0JLyogICovCi0JLyogV2hlbiB3ZSBkZXRlcm1pbmVzIHRoZSBsb2dpY2FsIGxpbmsgaXMgZXN0YWJsaXNoZWQsIHdlIHNob3VsZCBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuICovCi0JLyogICovCi0JaWYgKHN0YXR1cyA9PSBIQ0lfU1RBVFVTX1NVQ0NFU1MpIHsKLQkJYnRoY2lfRXZlbnREaXNjb25uZWN0TG9naWNhbExpbmtDb21wbGV0ZShwYWRhcHRlciwgc3RhdHVzLAotCQkJbG9naWNIYW5kbGUsIEhDSV9TVEFUVVNfQ09OTkVDVF9URVJNSU5BVEVfTE9DQUxfSE9TVCk7Ci0JfQotCi0JaWYgKExvZ0xpbmtDb3VudCA9PSAwKQotCQltb2RfdGltZXIoJnBCVGluZm8tPkJURGlzY29ubmVjdFBoeUxpbmtUaW1lciwKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRMb2dpY2FsTGlua0NhbmNlbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRpbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVGluZm8tPkJ0TWdudDsKLQl1OCBDdXJyZW50RW50cnlOdW0sIEN1cnJlbnRMb2dFbnRyeU51bTsKLQotCXU4IHBoeXNpY2FsTGlua0hhbmRsZSwgVHhGbG93U3BlY0lELCBpOwotCXUxNglDdXJyZW50TG9naWNhbEhhbmRsZTsKLQotCXBoeXNpY2FsTGlua0hhbmRsZSA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSk7Ci0JVHhGbG93U3BlY0lEID0gKigoKHU4ICopcEhjaUNtZC0+RGF0YSkrMSk7Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkxvZ2ljYWxMaW5rQ2FuY2VsLCBwaHlzaWNhbExpbmtIYW5kbGUgPSAweCV4LCBUeEZsb3dTcGVjSUQgPSAweCV4XG4iLAotCQlwaHlzaWNhbExpbmtIYW5kbGUsIFR4Rmxvd1NwZWNJRCkpOwotCi0JQ3VycmVudEVudHJ5TnVtID0gcEJ0TWdudC0+Q3VycmVudENvbm5lY3RFbnRyeU51bTsKLQlDdXJyZW50TG9naWNhbEhhbmRsZSA9IHBCdE1nbnQtPkJ0Q3VycmVudExvZ0xpbmtoYW5kbGU7Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkN1cnJlbnRFbnRyeU51bSA9IDB4JXgsIEN1cnJlbnRMb2dpY2FsSGFuZGxlID0gMHgleFxuIiwKLQkJQ3VycmVudEVudHJ5TnVtLCBDdXJyZW50TG9naWNhbEhhbmRsZSkpOwotCi0JQ3VycmVudExvZ0VudHJ5TnVtID0gMHhmZjsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xPR0lDQUxfTElOS19OVU07IGkrKykgewotCQlpZiAoKEN1cnJlbnRMb2dpY2FsSGFuZGxlID09IHBCVGluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaV0uQnRMb2dMaW5raGFuZGxlKSAmJgotCQkJKHBoeXNpY2FsTGlua0hhbmRsZSA9PSBwQlRpbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50RW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2ldLkJ0UGh5TGlua2hhbmRsZSkpIHsKLQkJCUN1cnJlbnRMb2dFbnRyeU51bSA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChDdXJyZW50TG9nRW50cnlOdW0gPT0gMHhmZikgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkxvZ2ljYWxMaW5rQ2FuY2VsLCBDdXJyZW50TG9nRW50cnlOdW0gPT0gMHhmZiAhISEhXG4iKSk7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfSBlbHNlIHsKLQkJaWYgKHBCVGluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbQ3VycmVudExvZ0VudHJ5TnVtXS5iTExDb21wbGV0ZUV2ZW50SXNTZXQpIHsKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiTG9naWNhbExpbmtDYW5jZWwsIExMQ29tcGxldGVFdmVudElzU2V0ISEhIVxuIikpOwotCQkJc3RhdHVzID0gSENJX1NUQVRVU19BQ0xfQ09OTkVDVF9FWElTVFM7Ci0JCX0KLQl9Ci0KLQl7Ci0JCXU4IGxvY2FsQnVmWzhdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCUxJTktfQ09OVFJPTF9DT01NQU5EUywKLQkJCUhDSV9MT0dJQ0FMX0xJTktfQ0FOQ0VMLAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JCXBSZXRQYXJbMV0gPSBwQlRpbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50RW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW0N1cnJlbnRMb2dFbnRyeU51bV0uQnRQaHlMaW5raGFuZGxlOwotCQlwUmV0UGFyWzJdID0gcEJUaW5mby0+QnRBc29jRW50cnlbQ3VycmVudEVudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtDdXJyZW50TG9nRW50cnlOdW1dLkJ0VHhGbG93U3BlY0lEOwotCQlsZW4gKz0gMzsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcEJUaW5mby0+QnRBc29jRW50cnlbQ3VycmVudEVudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtDdXJyZW50TG9nRW50cnlOdW1dLmJMTENhbmNlbENNRElzU2V0YW5kQ29tcGxldGUgPSB0cnVlOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kRmxvd1NwZWNNb2RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0vKlBNR05UX0lORk8gcE1nbnRJbmZvID0gJnBhZGFwdGVyLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRpbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXU4IGksIGosIGZpbmQgPSAwOwotCXUxNiBsb2dpY0hhbmRsZTsKLQotCWxvZ2ljSGFuZGxlID0gKigodTE2ICopcEhjaUNtZC0+RGF0YSk7Ci0JLyogIGZpbmQgYW4gbWF0Y2hlZCBsb2dpY2FsIGxpbmsgaW5kZXggYW5kIGNvcHkgdGhlIGRhdGEgKi8KLQlmb3IgKGogPSAwOyBqIDwgTUFYX0JUX0FTT0NfRU5UUllfTlVNOyBqKyspIHsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9MT0dJQ0FMX0xJTktfTlVNOyBpKyspIHsKLQkJCWlmIChwQlRpbmZvLT5CdEFzb2NFbnRyeVtqXS5Mb2dMaW5rQ21kRGF0YVtpXS5CdExvZ0xpbmtoYW5kbGUgPT0gbG9naWNIYW5kbGUpIHsKLQkJCQltZW1jcHkoJnBCVGluZm8tPkJ0QXNvY0VudHJ5W2pdLkxvZ0xpbmtDbWREYXRhW2ldLlR4X0Zsb3dfU3BlYywKLQkJCQkJJnBIY2lDbWQtPkRhdGFbMl0sIHNpemVvZihzdHJ1Y3QgaGNpX2Zsb3dfc3BlYykpOwotCQkJCW1lbWNweSgmcEJUaW5mby0+QnRBc29jRW50cnlbal0uTG9nTGlua0NtZERhdGFbaV0uUnhfRmxvd19TcGVjLAotCQkJCQkmcEhjaUNtZC0+RGF0YVsxOF0sIHNpemVvZihzdHJ1Y3QgaGNpX2Zsb3dfc3BlYykpOwotCi0JCQkJYnRoY2lfQ2hlY2tMb2dMaW5rQmVoYXZpb3IocGFkYXB0ZXIsIHBCVGluZm8tPkJ0QXNvY0VudHJ5W2pdLkxvZ0xpbmtDbWREYXRhW2ldLlR4X0Zsb3dfU3BlYyk7Ci0JCQkJZmluZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0xPR08sICgiRmxvd1NwZWNNb2RpZnksIExMSCA9IDB4JXgsIFxuIiwgbG9naWNIYW5kbGUpKTsKLQotCS8qIFdoZW4gd2UgcmVjZWl2ZSBGbG93IFNwZWMgTW9kaWZ5IGNvbW1hbmQsIHdlIHNob3VsZCBzZW5kIGNvbW1hbmQgc3RhdHVzIGV2ZW50IGZpcnN0LiAqLwotCWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cyhwYWRhcHRlciwKLQkJTElOS19DT05UUk9MX0NPTU1BTkRTLAotCQlIQ0lfRkxPV19TUEVDX01PRElGWSwKLQkJSENJX1NUQVRVU19TVUNDRVNTKTsKLQotCWlmICghZmluZCkKLQkJc3RhdHVzID0gSENJX1NUQVRVU19VTktOT1dfQ09OTkVDVF9JRDsKLQotCWJ0aGNpX0V2ZW50U2VuZEZsb3dTcGVjTW9kaWZ5Q29tcGxldGUocGFkYXB0ZXIsIHN0YXR1cywgbG9naWNIYW5kbGUpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kQWNjZXB0UGh5c2ljYWxMaW5rKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0KLQlwQnREYmctPmRiZ0hjaUluZm8uaGNpQ21kQ250QWNjZXB0UGh5TGluaysrOwotCi0JcmV0dXJuIGJ0aGNpX0J1aWxkUGh5c2ljYWxMaW5rKHBhZGFwdGVyLAotCQlwSGNpQ21kLCBIQ0lfQUNDRVBUX1BIWVNJQ0FMX0xJTkspOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWREaXNjb25uZWN0UGh5c2ljYWxMaW5rKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQl1OCBQTEgsIEN1cnJlbnRFbnRyeU51bSwgUGh5c0xpbmtEaXNjb25uZWN0UmVhc29uOwotCi0JcEJ0RGJnLT5kYmdIY2lJbmZvLmhjaUNtZENudERpc2Nvbm5lY3RQaHlMaW5rKys7Ci0KLQlQTEggPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCVBoeXNMaW5rRGlzY29ubmVjdFJlYXNvbiA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSsxKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9ESVNDT05ORUNUX1BIWVNJQ0FMX0xJTksgIFBoeUhhbmRsZSA9IDB4JXgsIFJlYXNvbiA9IDB4JXhcbiIsCi0JCVBMSCwgUGh5c0xpbmtEaXNjb25uZWN0UmVhc29uKSk7Ci0KLQlDdXJyZW50RW50cnlOdW0gPSBidGhjaV9HZXRDdXJyZW50RW50cnlOdW0ocGFkYXB0ZXIsIFBMSCk7Ci0KLQlpZiAoQ3VycmVudEVudHJ5TnVtID09IDB4ZmYpIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwKLQkJCSgiRGlzY29ubmVjdFBoeXNpY2FsTGluaywgTm8gc3VjaCBIYW5kbGUgaW4gdGhlIEVudHJ5XG4iKSk7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0JfSBlbHNlIHsKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEVudHJ5TnVtXS5QaHlMaW5rRGlzY29ubmVjdFJlYXNvbiA9Ci0JCQkoZW51bSBoY2lfc3RhdHVzKVBoeXNMaW5rRGlzY29ubmVjdFJlYXNvbjsKLQl9Ci0JLyogU2VuZCBIQ0kgQ29tbWFuZCBzdGF0dXMgZXZlbnQgdG8gQU1QLiAqLwotCWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cyhwYWRhcHRlciwgTElOS19DT05UUk9MX0NPTU1BTkRTLAotCQkJCSBIQ0lfRElTQ09OTkVDVF9QSFlTSUNBTF9MSU5LLCBzdGF0dXMpOwotCi0JaWYgKHN0YXR1cyAhPSBIQ0lfU1RBVFVTX1NVQ0NFU1MpCi0JCXJldHVybiBzdGF0dXM7Ci0KLQkvKiBUaGUgbWFjcm9zIGJlbG93IHJlcXVpcmUgeyBhbmQgfSBpbiB0aGUgaWYgc3RhdGVtZW50ICovCi0JaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRFbnRyeU51bV0uQnRDdXJyZW50U3RhdGUgPT0gSENJX1NUQVRFX0RJU0NPTk5FQ1RFRCkgewotCQlCVEhDSV9TTV9XSVRIX0lORk8ocGFkYXB0ZXIsIEhDSV9TVEFURV9ESVNDT05ORUNURUQsIFNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LLCBDdXJyZW50RW50cnlOdW0pOwotCX0gZWxzZSB7Ci0JCUJUSENJX1NNX1dJVEhfSU5GTyhwYWRhcHRlciwgSENJX1NUQVRFX0RJU0NPTk5FQ1RJTkcsIFNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LLCBDdXJyZW50RW50cnlOdW0pOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRTZXRBQ0xMaW5rRGF0YUZsb3dNb2RlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQl1OCBsb2NhbEJ1Zls4XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCXUxNiAqcHUyVGVtcDsKLQotCXBCdE1nbnQtPkV4dENvbmZpZy5DdXJyZW50Q29ubmVjdEhhbmRsZSA9ICooKHUxNiAqKXBIY2lDbWQtPkRhdGEpOwotCXBCdE1nbnQtPkV4dENvbmZpZy5DdXJyZW50SW5jb21pbmdUcmFmZmljTW9kZSA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSkrMjsKLQlwQnRNZ250LT5FeHRDb25maWcuQ3VycmVudE91dGdvaW5nVHJhZmZpY01vZGUgPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpKzM7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiQ29ubmVjdGlvbiBIYW5kbGUgPSAweCV4LCBJbmNvbWluZyBUcmFmZmljIG1vZGUgPSAweCV4LCBPdXRnb2luZyBUcmFmZmljIG1vZGUgPSAweCV4IiwKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLkN1cnJlbnRDb25uZWN0SGFuZGxlLAotCQlwQnRNZ250LT5FeHRDb25maWcuQ3VycmVudEluY29taW5nVHJhZmZpY01vZGUsCi0JCXBCdE1nbnQtPkV4dENvbmZpZy5DdXJyZW50T3V0Z29pbmdUcmFmZmljTW9kZSkpOwotCi0KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9FWFRFTlNJT04sCi0JCUhDSV9TRVRfQUNMX0xJTktfREFUQV9GTE9XX01PREUsCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCi0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhclsxXTsKLQkqcHUyVGVtcCA9IHBCdE1nbnQtPkV4dENvbmZpZy5DdXJyZW50Q29ubmVjdEhhbmRsZTsKLQlsZW4gKz0gMzsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFNldEFDTExpbmtTdGF0dXMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0JdTggaTsKLQl1OCAqcFRyaXBsZTsKLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnRTZXRBY2xMaW5rU3RhdHVzKys7Ci0JUlRQUklOVF9EQVRBKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgIlNldEFDTExpbmtTdGF0dXMsIEhleCBEYXRhIDpcbiIsCi0JCQkmcEhjaUNtZC0+RGF0YVswXSwgcEhjaUNtZC0+TGVuZ3RoKTsKLQotCS8qICBPbmx5IENvcmUgU3RhY2sgdjI1MSBhbmQgbGF0ZXIgdmVyc2lvbiBzdXBwb3J0IHRoaXMgY29tbWFuZC4gKi8KLQlwQnRNZ250LT5iU3VwcG9ydFByb2ZpbGUgPSB0cnVlOwotCi0JcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJOdW1iZXJPZkhhbmRsZSA9IDB4JXhcbiIsIHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSkpOwotCi0JcFRyaXBsZSA9ICZwSGNpQ21kLT5EYXRhWzFdOwotCWZvciAoaSA9IDA7IGkgPCBwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGU7IGkrKykgewotCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQ29ubmVjdEhhbmRsZSA9ICooKHUxNiAqKSZwVHJpcGxlWzBdKTsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkluY29taW5nVHJhZmZpY01vZGUgPSBwVHJpcGxlWzJdOwotCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uT3V0Z29pbmdUcmFmZmljTW9kZSA9IHBUcmlwbGVbM107Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULAotCQkJKCJDb25uZWN0aW9uX0hhbmRsZSA9IDB4JXgsIEluY29taW5nIFRyYWZmaWMgbW9kZSA9IDB4JXgsIE91dGdvaW5nIFRyYWZmaWMgTW9kZSA9IDB4JXhcbiIsCi0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQ29ubmVjdEhhbmRsZSwKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5JbmNvbWluZ1RyYWZmaWNNb2RlLAotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLk91dGdvaW5nVHJhZmZpY01vZGUpKTsKLQkJcFRyaXBsZSArPSA0OwotCX0KLQotCXsKLQkJdTggbG9jYWxCdWZbNl0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX0VYVEVOU0lPTiwKLQkJCUhDSV9TRVRfQUNMX0xJTktfU1RBVFVTLAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0KLQkJbGVuICs9IDE7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFNldFNDT0xpbmtTdGF0dXMoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnRTZXRTY29MaW5rU3RhdHVzKys7Ci0JcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mU0NPID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJOdW1iZXJPZlNDTyA9IDB4JXhcbiIsCi0JCXBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZlNDTykpOwotCi0JewotCQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfRVhURU5TSU9OLAotCQkJSENJX1NFVF9TQ09fTElOS19TVEFUVVMsCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQotCQlsZW4gKz0gMTsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kU2V0UlNTSVZhbHVlKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlzOAkJbWluX2J0X3Jzc2kgPSAwOwotCXU4IGk7Ci0JZm9yIChpID0gMDsgaSA8IHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZTsgaSsrKSB7Ci0JCWlmIChwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQ29ubmVjdEhhbmRsZSA9PSAqKCh1MTYgKikmcEhjaUNtZC0+RGF0YVswXSkpIHsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVF9SU1NJID0gKHM4KShwSGNpQ21kLT5EYXRhWzJdKTsKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVF9QRVJJT0RJQ0FMLAotCQkJKCJDb25uZWN0aW9uX0hhbmRsZSA9IDB4JXgsIFJTU0kgPSAlZCBcbiIsCi0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQ29ubmVjdEhhbmRsZSwKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVF9SU1NJKSk7Ci0JCX0KLQkJLyogIGdldCB0aGUgbWluaW11bSBidCByc3NpIHZhbHVlICovCi0JCWlmIChwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRfUlNTSSA8PSBtaW5fYnRfcnNzaSkKLQkJCW1pbl9idF9yc3NpID0gcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUX1JTU0k7Ci0JfQotCi0JcEJ0TWdudC0+RXh0Q29uZmlnLk1JTl9CVF9SU1NJID0gbWluX2J0X3Jzc2k7Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltidCByc3NpXSwgdGhlIG1pbiByc3NpIGlzICVkXG4iLCBtaW5fYnRfcnNzaSkpOwotCi0JewotCQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfRVhURU5TSU9OLAotCQkJSENJX1NFVF9SU1NJX1ZBTFVFLAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0KLQkJbGVuICs9IDE7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFNldEN1cnJlbnRCbHVldG9vdGhTdGF0dXMoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotLypQTUdOVF9JTkZPCXBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlwQnRNZ250LT5FeHRDb25maWcuQ3VycmVudEJUU3RhdHVzID0gKigodTggKikmcEhjaUNtZC0+RGF0YVswXSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiU2V0Q3VycmVudEJsdWV0b290aFN0YXR1cywgQ3VycmVudEJUU3RhdHVzID0gMHgleFxuIiwKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLkN1cnJlbnRCVFN0YXR1cykpOwotCi0JewotCQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfRVhURU5TSU9OLAotCQkJSENJX1NFVF9DVVJSRU5UX0JMVUVUT09USF9TVEFUVVMsCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQkJbGVuICs9IDE7Ci0KLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kRXh0ZW5zaW9uVmVyc2lvbk5vdGlmeSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cwlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCi0JcEJ0RGJnLT5kYmdIY2lJbmZvLmhjaUNtZENudEV4dGVuc2lvblZlcnNpb25Ob3RpZnkrKzsKLQlSVFBSSU5UX0RBVEEoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAiRXh0ZW5zaW9uVmVyc2lvbk5vdGlmeSwgSGV4IERhdGEgOlxuIiwKLQkJCSZwSGNpQ21kLT5EYXRhWzBdLCBwSGNpQ21kLT5MZW5ndGgpOwotCi0JcEJ0TWdudC0+RXh0Q29uZmlnLkhDSUV4dGVuc2lvblZlciA9ICooKHUxNiAqKSZwSGNpQ21kLT5EYXRhWzBdKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lFeHRlbnNpb25WZXIgPSAweCV4XG4iLCBwQnRNZ250LT5FeHRDb25maWcuSENJRXh0ZW5zaW9uVmVyKSk7Ci0KLQl7Ci0JCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9FWFRFTlNJT04sCi0JCQlIQ0lfRVhURU5TSU9OX1ZFUlNJT05fTk9USUZZLAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0KLQkJbGVuICs9IDE7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZExpbmtTdGF0dXNOb3RpZnkoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQl1OCBpOwotCXU4ICpwVHJpcGxlOwotCi0JcEJ0RGJnLT5kYmdIY2lJbmZvLmhjaUNtZENudExpbmtTdGF0dXNOb3RpZnkrKzsKLQlSVFBSSU5UX0RBVEEoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAiTGlua1N0YXR1c05vdGlmeSwgSGV4IERhdGEgOlxuIiwKLQkJCSZwSGNpQ21kLT5EYXRhWzBdLCBwSGNpQ21kLT5MZW5ndGgpOwotCi0JLyogIEN1cnJlbnQgb25seSBSVEw4NzIzIHN1cHBvcnQgdGhpcyBjb21tYW5kLiAqLwotCXBCdE1nbnQtPmJTdXBwb3J0UHJvZmlsZSA9IHRydWU7Ci0KLQlwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUgPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIk51bWJlck9mSGFuZGxlID0gMHgleFxuIiwgcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlKSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiSENJRXh0ZW5zaW9uVmVyID0gJWRcbiIsIHBCdE1nbnQtPkV4dENvbmZpZy5IQ0lFeHRlbnNpb25WZXIpKTsKLQotCXBUcmlwbGUgPSAmcEhjaUNtZC0+RGF0YVsxXTsKLQlmb3IgKGkgPSAwOyBpIDwgcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlOyBpKyspIHsKLQkJaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5IQ0lFeHRlbnNpb25WZXIgPCAxKSB7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQ29ubmVjdEhhbmRsZSA9ICooKHUxNiAqKSZwVHJpcGxlWzBdKTsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVFByb2ZpbGUgPSBwVHJpcGxlWzJdOwotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUQ29yZVNwZWMgPSBwVHJpcGxlWzNdOwotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsCi0JCQkJKCJDb25uZWN0aW9uX0hhbmRsZSA9IDB4JXgsIEJUUHJvZmlsZSA9JWQsIEJUU3BlYyA9JWRcbiIsCi0JCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkNvbm5lY3RIYW5kbGUsCi0JCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUUHJvZmlsZSwKLQkJCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRDb3JlU3BlYykpOwotCQkJcFRyaXBsZSArPSA0OwotCQl9IGVsc2UgaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5IQ0lFeHRlbnNpb25WZXIgPj0gMSkgewotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkNvbm5lY3RIYW5kbGUgPSAqKCh1MTYgKikmcFRyaXBsZVswXSk7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRQcm9maWxlID0gcFRyaXBsZVsyXTsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVENvcmVTcGVjID0gcFRyaXBsZVszXTsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5saW5rUm9sZSA9IHBUcmlwbGVbNF07Ci0JCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwKLQkJCQkoIkNvbm5lY3Rpb25fSGFuZGxlID0gMHgleCwgQlRQcm9maWxlID0lZCwgQlRTcGVjID0lZCwgTGlua1JvbGUgPSVkXG4iLAotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5Db25uZWN0SGFuZGxlLAotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVFByb2ZpbGUsCi0JCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUQ29yZVNwZWMsCi0JCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLmxpbmtSb2xlKSk7Ci0JCQlwVHJpcGxlICs9IDU7Ci0JCX0KLQotCX0KLQlCVEhDSV9VcGRhdGVCVFByb2ZpbGVSVEtUb01vdG8ocGFkYXB0ZXIpOwotCXsKLQkJdTggbG9jYWxCdWZbNl0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX0VYVEVOU0lPTiwKLQkJCUhDSV9MSU5LX1NUQVRVU19OT1RJRlksCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQotCQlsZW4gKz0gMTsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kQnRPcGVyYXRpb25Ob3RpZnkoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JUlRQUklOVF9EQVRBKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgIkJ0IE9wZXJhdGlvbiBub3RpZnksIEhleCBEYXRhIDpcbiIsCi0JCQkmcEhjaUNtZC0+RGF0YVswXSwgcEhjaUNtZC0+TGVuZ3RoKTsKLQotCXBCdE1nbnQtPkV4dENvbmZpZy5idE9wZXJhdGlvbkNvZGUgPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoImJ0T3BlcmF0aW9uQ29kZSA9IDB4JXhcbiIsIHBCdE1nbnQtPkV4dENvbmZpZy5idE9wZXJhdGlvbkNvZGUpKTsKLQlzd2l0Y2ggKHBCdE1nbnQtPkV4dENvbmZpZy5idE9wZXJhdGlvbkNvZGUpIHsKLQljYXNlIEhDSV9CVF9PUF9OT05FOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJbYnQgb3BlcmF0aW9uXSA6IE9wZXJhdGlvbiBOb25lISFcbiIpKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfQlRfT1BfSU5RVUlSWV9TVEFSVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiW2J0IG9wZXJhdGlvbl0gOiBJbnF1aXJlIHN0YXJ0ISFcbiIpKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfQlRfT1BfSU5RVUlSWV9GSU5JU0g6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIltidCBvcGVyYXRpb25dIDogSW5xdWlyZSBmaW5pc2hlZCEhXG4iKSk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0JUX09QX1BBR0lOR19TVEFSVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiW2J0IG9wZXJhdGlvbl0gOiBQYWdpbmcgaXMgc3RhcnRlZCEhXG4iKSk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0JUX09QX1BBR0lOR19TVUNDRVNTOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJbYnQgb3BlcmF0aW9uXSA6IFBhZ2luZyBjb21wbGV0ZSBzdWNjZXNzZnVsbHkhIVxuIikpOwotCQlicmVhazsKLQljYXNlIEhDSV9CVF9PUF9QQUdJTkdfVU5TVUNDRVNTOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJbYnQgb3BlcmF0aW9uXSA6IFBhZ2luZyBjb21wbGV0ZSB1bnN1Y2Nlc3NmdWxseSEhXG4iKSk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0JUX09QX1BBSVJJTkdfU1RBUlQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIltidCBvcGVyYXRpb25dIDogUGFpcmluZyBzdGFydCEhXG4iKSk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0JUX09QX1BBSVJJTkdfRklOSVNIOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJbYnQgb3BlcmF0aW9uXSA6IFBhaXJpbmcgZmluaXNoZWQhIVxuIikpOwotCQlicmVhazsKLQljYXNlIEhDSV9CVF9PUF9CVF9ERVZfRU5BQkxFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJbYnQgb3BlcmF0aW9uXSA6IEJUIERldmljZSBpcyBlbmFibGVkISFcbiIpKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfQlRfT1BfQlRfREVWX0RJU0FCTEU6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIltidCBvcGVyYXRpb25dIDogQlQgRGV2aWNlIGlzIGRpc2FibGVkISFcbiIpKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiW2J0IG9wZXJhdGlvbl0gOiBVbmtub3duLCBlcnJvciEhXG4iKSk7Ci0JCWJyZWFrOwotCX0KLQlCVERNX0FkanVzdEZvckJ0T3BlcmF0aW9uKHBhZGFwdGVyKTsKLQl7Ci0JCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9FWFRFTlNJT04sCi0JCQlIQ0lfQlRfT1BFUkFUSU9OX05PVElGWSwKLQkJCXN0YXR1cyk7Ci0KLQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCi0JCWxlbiArPSAxOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRFbmFibGVXaWZpU2Nhbk5vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCVJUUFJJTlRfREFUQShGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICJFbmFibGUgV2lmaSBzY2FuIG5vdGlmeSwgSGV4IERhdGEgOlxuIiwKLQkJCSZwSGNpQ21kLT5EYXRhWzBdLCBwSGNpQ21kLT5MZW5ndGgpOwotCi0JcEJ0TWdudC0+RXh0Q29uZmlnLmJFbmFibGVXaWZpU2Nhbk5vdGlmeSA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiYkVuYWJsZVdpZmlTY2FuTm90aWZ5ID0gJWRcbiIsIHBCdE1nbnQtPkV4dENvbmZpZy5iRW5hYmxlV2lmaVNjYW5Ob3RpZnkpKTsKLQotCXsKLQkJdTggbG9jYWxCdWZbNl0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX0VYVEVOU0lPTiwKLQkJCUhDSV9FTkFCTEVfV0lGSV9TQ0FOX05PVElGWSwKLQkJCXN0YXR1cyk7Ci0KLQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCi0JCWxlbiArPSAxOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRXSUZJQ3VycmVudENoYW5uZWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICBzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JdTggY2hubCA9IHBtbG1lZXh0LT5jdXJfY2hhbm5lbDsKLQotCWlmIChwbWxtZWV4dC0+Y3VyX2J3bW9kZSA9PSBIVF9DSEFOTkVMX1dJRFRIXzQwKSB7Ci0JCWlmIChwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIpCi0JCQljaG5sICs9IDI7Ci0JCWVsc2UgaWYgKHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0ID09IEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUikKLQkJCWNobmwgLT0gMjsKLQl9Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJDdXJyZW50IENoYW5uZWwgID0gMHgleFxuIiwgY2hubCkpOwotCi0JewotCQl1OCBsb2NhbEJ1Zls4XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfRVhURU5TSU9OLAotCQkJSENJX1dJRklfQ1VSUkVOVF9DSEFOTkVMLAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JCXBSZXRQYXJbMV0gPSBjaG5sOwkJCS8qIGN1cnJlbnQgY2hhbm5lbCAqLwotCQlsZW4gKz0gMjsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kV0lGSUN1cnJlbnRCYW5kd2lkdGgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIHN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0JZW51bSBodF9jaGFubmVsX3dpZHRoIGJ3OwotCXU4IEN1cnJlbnRCVyA9IDA7Ci0KLQlidyA9IHBhZGFwdGVyLT5tbG1lZXh0cHJpdi5jdXJfYndtb2RlOwotCi0JaWYgKGJ3ID09IEhUX0NIQU5ORUxfV0lEVEhfMjApCi0JCUN1cnJlbnRCVyA9IDA7Ci0JZWxzZSBpZiAoYncgPT0gSFRfQ0hBTk5FTF9XSURUSF80MCkKLQkJQ3VycmVudEJXID0gMTsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkN1cnJlbnQgQlcgPSAweCV4XG4iLAotCQlDdXJyZW50QlcpKTsKLQotCXsKLQkJdTggbG9jYWxCdWZbOF0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX0VYVEVOU0lPTiwKLQkJCUhDSV9XSUZJX0NVUlJFTlRfQkFORFdJRFRILAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JCXBSZXRQYXJbMV0gPSBDdXJyZW50Qlc7CQkvKiBjdXJyZW50IEJXICovCi0JCWxlbiArPSAyOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRXSUZJQ29ubmVjdGlvblN0YXR1cygKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0JdTggY29ubmVjdFN0YXR1cyA9IEhDSV9XSUZJX05PVF9DT05ORUNURUQ7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgewotCQlpZiAocGFkYXB0ZXItPnN0YXByaXYuYXNvY19zdGFfY291bnQgPj0gMykKLQkJCWNvbm5lY3RTdGF0dXMgPSBIQ0lfV0lGSV9DT05ORUNURUQ7Ci0JCWVsc2UKLQkJCWNvbm5lY3RTdGF0dXMgPSBIQ0lfV0lGSV9OT1RfQ09OTkVDVEVEOwotCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFfFdJRklfQURIT0NfTUFTVEVSX1NUQVRFfFdJRklfQVNPQ19TVEFURSkpIHsKLQkJY29ubmVjdFN0YXR1cyA9IEhDSV9XSUZJX0NPTk5FQ1RFRDsKLQl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9VTkRFUl9MSU5LSU5HKSkgewotCQljb25uZWN0U3RhdHVzID0gSENJX1dJRklfQ09OTkVDVF9JTl9QUk9HUkVTUzsKLQl9IGVsc2UgewotCQljb25uZWN0U3RhdHVzID0gSENJX1dJRklfTk9UX0NPTk5FQ1RFRDsKLQl9Ci0KLQl7Ci0JCXU4IGxvY2FsQnVmWzhdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9FWFRFTlNJT04sCi0JCQlIQ0lfV0lGSV9DT05ORUNUSU9OX1NUQVRVUywKLQkJCXN0YXR1cyk7Ci0KLQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsJCQkvKiBzdGF0dXMgKi8KLQkJcFJldFBhclsxXSA9IGNvbm5lY3RTdGF0dXM7CS8qIGNvbm5lY3Qgc3RhdHVzICovCi0JCWxlbiArPSAyOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRFbmFibGVEZXZpY2VVbmRlclRlc3RNb2RlKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0KLQlwQnRIY2lJbmZvLT5iSW5UZXN0TW9kZSA9IHRydWU7Ci0JcEJ0SGNpSW5mby0+YlRlc3RJc0VuZCA9IGZhbHNlOwotCi0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JewotCQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfVEVTVElOR19DT01NQU5EUywKLQkJCUhDSV9FTkFCTEVfREVWSUNFX1VOREVSX1RFU1RfTU9ERSwKLQkJCXN0YXR1cyk7Ci0KLQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCQlsZW4gKz0gMTsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kQU1QVGVzdEVuZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0KLQlpZiAoIXBCdEhjaUluZm8tPmJJblRlc3RNb2RlKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiTm90IGluIFRlc3QgbW9kZSwgcmV0dXJuIHN0YXR1cyA9IEhDSV9TVEFUVVNfQ01EX0RJU0FMTE9XXG4iKSk7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfQ01EX0RJU0FMTE9XOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXBCdEhjaUluZm8tPmJUZXN0SXNFbmQgPSB0cnVlOwotCi0JZGVsX3RpbWVyX3N5bmMoJnBCVEluZm8tPkJUVGVzdFNlbmRQYWNrZXRUaW1lcik7Ci0KLQlydGw4NzIzYV9jaGVja19ic3NpZChwYWRhcHRlciwgdHJ1ZSk7Ci0KLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQl7Ci0JCXU4IGxvY2FsQnVmWzRdID0gIiI7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIkFNUCBUZXN0IEVuZCBFdmVudCBcbiIpKTsKLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQkJUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfQU1QX1RFU1RfRU5EOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IDI7Ci0KLQkJUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gc3RhdHVzOwotCQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBwQnRIY2lJbmZvLT5UZXN0U2NlbmFyaW87Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCA0KTsKLQl9Ci0KLQlidGhjaV9FdmVudEFNUFJlY2VpdmVyUmVwb3J0KHBhZGFwdGVyLCAweDAxKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZEFNUFRlc3RDb21tYW5kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQotCWlmICghcEJ0SGNpSW5mby0+YkluVGVzdE1vZGUpIHsKLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJOb3QgaW4gVGVzdCBtb2RlLCByZXR1cm4gc3RhdHVzID0gSENJX1NUQVRVU19DTURfRElTQUxMT1dcbiIpKTsKLQkJc3RhdHVzID0gSENJX1NUQVRVU19DTURfRElTQUxMT1c7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcEJ0SGNpSW5mby0+VGVzdFNjZW5hcmlvID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQotCWlmIChwQnRIY2lJbmZvLT5UZXN0U2NlbmFyaW8gPT0gMHgwMSkKLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJUWCBTaW5nbGUgVGVzdCBcbiIpKTsKLQllbHNlIGlmIChwQnRIY2lJbmZvLT5UZXN0U2NlbmFyaW8gPT0gMHgwMikKLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJSZWNlaXZlIEZyYW1lIFRlc3QgXG4iKSk7Ci0JZWxzZQotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIk5vIFN1Y2ggVGVzdCAhISEhISEhISEhISEhISEhISEgXG4iKSk7Ci0KLQlpZiAocEJ0SGNpSW5mby0+YlRlc3RJc0VuZCkgewotCQl1OCBsb2NhbEJ1Zls1XSA9ICIiOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJBTVAgVGVzdCBFbmQgRXZlbnQgXG4iKSk7Ci0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0JCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX0FNUF9URVNUX0VORDsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSAyOwotCi0JCVBQYWNrZXRJcnBFdmVudC0+RGF0YVswXSA9IHN0YXR1czsKLQkJUFBhY2tldElycEV2ZW50LT5EYXRhWzFdID0gcEJ0SGNpSW5mby0+VGVzdFNjZW5hcmlvIDsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIDQpOwotCi0JCS8qIFJldHVybiB0byBJZGVsIHN0YXRlIHdpdGggUlggYW5kIFRYIG9mZi4gKi8KLQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qICBzaG91bGQgc2VuZCBjb21tYW5kIHN0YXR1cyBldmVudCAqLwotCWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cyhwYWRhcHRlciwKLQkJCU9HRl9URVNUSU5HX0NPTU1BTkRTLAotCQkJSENJX0FNUF9URVNUX0NPTU1BTkQsCi0JCQlzdGF0dXMpOwotCi0JLyogVGhlIEhDSV9BTVBfU3RhcnQgVGVzdCBFdmVudCBzaGFsbCBiZSBnZW5lcmF0ZWQgd2hlbiB0aGUgKi8KLQkvKiBIQ0lfQU1QX1Rlc3RfQ29tbWFuZCBoYXMgY29tcGxldGVkIGFuZCB0aGUgZmlyc3QgZGF0YSBpcyByZWFkeSB0byBiZSBzZW50ICovCi0JLyogb3IgcmVjZWl2ZWQuICovCi0KLQl7Ci0JCXU4IGxvY2FsQnVmWzVdID0gIiI7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIiBIQ0lfQU1QX1N0YXJ0IFRlc3QgRXZlbnQgXG4iKSk7Ci0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0JCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX0FNUF9TVEFSVF9URVNUOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IDI7Ci0KLQkJUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gc3RhdHVzOwotCQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBwQnRIY2lJbmZvLT5UZXN0U2NlbmFyaW8gOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgNCk7Ci0KLQkJLyogUmV0dXJuIHRvIElkZWwgc3RhdGUgd2l0aCBSWCBhbmQgVFggb2ZmLiAqLwotCX0KLQotCWlmIChwQnRIY2lJbmZvLT5UZXN0U2NlbmFyaW8gPT0gMHgwMSkgewotCQkvKgotCQkJV2hlbiBpbiBhIHRyYW5zbWl0dGVyIHRlc3Qgc2NlbmFyaW8gYW5kIHRoZSBmcmFtZXMvYnVyc3RzIGNvdW50IGhhdmUgYmVlbgotCQkJdHJhbnNtaXR0ZWQgdGhlIEhDSV9BTVBfVGVzdF9FbmQgZXZlbnQgc2hhbGwgYmUgc2VudC4KLQkJKi8KLQkJbW9kX3RpbWVyKCZwQlRJbmZvLT5CVFRlc3RTZW5kUGFja2V0VGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwKSk7Ci0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiVFggU2luZ2xlIFRlc3QgXG4iKSk7Ci0JfSBlbHNlIGlmIChwQnRIY2lJbmZvLT5UZXN0U2NlbmFyaW8gPT0gMHgwMikgewotCQlydGw4NzIzYV9jaGVja19ic3NpZChwYWRhcHRlciwgZmFsc2UpOwotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIlJlY2VpdmUgRnJhbWUgVGVzdCBcbiIpKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRFbmFibGVBTVBSZWNlaXZlclJlcG9ydHMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgIHN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCi0JaWYgKCFwQnRIY2lJbmZvLT5iSW5UZXN0TW9kZSkgewotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX0NNRF9ESVNBTExPVzsKLQkJLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JCXsKLQkJCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JCQl1OCAqcFJldFBhcjsKLQkJCXU4IGxlbiA9IDA7Ci0JCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJCU9HRl9URVNUSU5HX0NPTU1BTkRTLAotCQkJCUhDSV9FTkFCTEVfQU1QX1JFQ0VJVkVSX1JFUE9SVFMsCi0JCQkJc3RhdHVzKTsKLQotCQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JCQlsZW4gKz0gMTsKLQkJCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXBCdEhjaUluZm8tPmJUZXN0TmVlZFJlcG9ydCA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSk7Ci0JcEJ0SGNpSW5mby0+VGVzdFJlcG9ydEludGVydmFsID0gKCooKHU4ICopcEhjaUNtZC0+RGF0YSsyKSk7Ci0KLQlidGhjaV9FdmVudEFNUFJlY2VpdmVyUmVwb3J0KHBhZGFwdGVyLCAweDAwKTsKLQotCS8qIHNlbmQgY29tbWFuZCBjb21wbGV0ZSBldmVudCBoZXJlIHdoZW4gYWxsIGRhdGEgYXJlIHJlY2VpdmVkLiAqLwotCXsKLQkJdTggbG9jYWxCdWZbNl0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX1RFU1RJTkdfQ09NTUFORFMsCi0JCQlIQ0lfRU5BQkxFX0FNUF9SRUNFSVZFUl9SRVBPUlRTLAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JCWxlbiArPSAxOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRIb3N0QnVmZmVyU2l6ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0JdTggbG9jYWxCdWZbNl0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCi0JcEJUSW5mby0+QnRBc29jRW50cnlbcEJ0TWdudC0+Q3VycmVudENvbm5lY3RFbnRyeU51bV0uQUNMUGFja2V0c0RhdGEuQUNMRGF0YVBhY2tldExlbiA9ICooKHUxNiAqKXBIY2lDbWQtPkRhdGEpOwotCXBCVEluZm8tPkJ0QXNvY0VudHJ5W3BCdE1nbnQtPkN1cnJlbnRDb25uZWN0RW50cnlOdW1dLlN5bmNEYXRhUGFja2V0TGVuID0gKigodTggKikocEhjaUNtZC0+RGF0YSsyKSk7Ci0JcEJUSW5mby0+QnRBc29jRW50cnlbcEJ0TWdudC0+Q3VycmVudENvbm5lY3RFbnRyeU51bV0uVG90YWxOdW1BQ0xEYXRhUGFja2V0cyA9ICooKHUxNiAqKShwSGNpQ21kLT5EYXRhKzMpKTsKLQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtwQnRNZ250LT5DdXJyZW50Q29ubmVjdEVudHJ5TnVtXS5Ub3RhbFN5bmNOdW1EYXRhUGFja2V0cyA9ICooKHUxNiAqKShwSGNpQ21kLT5EYXRhKzUpKTsKLQotCS8qIHNlbmQgY29tbWFuZCBjb21wbGV0ZSBldmVudCBoZXJlIHdoZW4gYWxsIGRhdGEgYXJlIHJlY2VpdmVkLiAqLwotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCUhDSV9IT1NUX0JVRkZFUl9TSVpFLAotCQlzdGF0dXMpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQlsZW4gKz0gMTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfVW5rbm93bkNNRChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19VTktOT1dfSENJX0NNRDsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnRVbmtub3duKys7Ci0JYnRoY2lfRXZlbnRDb21tYW5kU3RhdHVzKHBhZGFwdGVyLAotCQkJKHU4KXBIY2lDbWQtPk9HRiwKLQkJCXBIY2lDbWQtPk9DRiwKLQkJCXN0YXR1cyk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9IYW5kbGVPR0ZJbmZvcm1hdGlvbmFsUGFyYW1ldGVycyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICAgICBzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCi0Jc3dpdGNoIChwSGNpQ21kLT5PQ0YpIHsKLQljYXNlIEhDSV9SRUFEX0xPQ0FMX1ZFUlNJT05fSU5GT1JNQVRJT046Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfTE9DQUxfVkVSU0lPTl9JTkZPUk1BVElPTlxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRSZWFkTG9jYWxWZXJzaW9uSW5mb3JtYXRpb24ocGFkYXB0ZXIpOwotCQlicmVhazsKLQljYXNlIEhDSV9SRUFEX0xPQ0FMX1NVUFBPUlRFRF9DT01NQU5EUzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVBRF9MT0NBTF9TVVBQT1JURURfQ09NTUFORFNcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kUmVhZExvY2FsU3VwcG9ydGVkQ29tbWFuZHMocGFkYXB0ZXIpOwotCQlicmVhazsKLQljYXNlIEhDSV9SRUFEX0xPQ0FMX1NVUFBPUlRFRF9GRUFUVVJFUzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVBRF9MT0NBTF9TVVBQT1JURURfRkVBVFVSRVNcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kUmVhZExvY2FsU3VwcG9ydGVkRmVhdHVyZXMocGFkYXB0ZXIpOwotCQlicmVhazsKLQljYXNlIEhDSV9SRUFEX0JVRkZFUl9TSVpFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9SRUFEX0JVRkZFUl9TSVpFXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRCdWZmZXJTaXplKHBhZGFwdGVyKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfUkVBRF9EQVRBX0JMT0NLX1NJWkU6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfREFUQV9CTE9DS19TSVpFXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWREYXRhQmxvY2tTaXplKHBhZGFwdGVyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJidGhjaV9IYW5kbGVPR0ZJbmZvcm1hdGlvbmFsUGFyYW1ldGVycygpLCBVbmtub3duIGNhc2UgPSAweCV4XG4iLCBwSGNpQ21kLT5PQ0YpKTsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfVU5LTk9XTl9DT01NQU5EXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX1Vua25vd25DTUQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfSGFuZGxlT0dGU2V0RXZlbnRNYXNrQ01EKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQotCXN3aXRjaCAocEhjaUNtZC0+T0NGKSB7Ci0JY2FzZSBIQ0lfU0VUX0VWRU5UX01BU0s6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1NFVF9FVkVOVF9NQVNLXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFNldEV2ZW50TWFzayhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFU0VUOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9SRVNFVFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRSZXNldChwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFQURfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVBRF9DT05ORUNUSU9OX0FDQ0VQVF9USU1FT1VUXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRDb25uZWN0aW9uQWNjZXB0VGltZW91dChwYWRhcHRlcik7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1NFVF9FVkVOVF9GSUxURVI6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1NFVF9FVkVOVF9GSUxURVJcbiIpKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfV1JJVEVfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfV1JJVEVfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRXcml0ZUNvbm5lY3Rpb25BY2NlcHRUaW1lb3V0KHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfUkVBRF9QQUdFX1RJTUVPVVQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfUEFHRV9USU1FT1VUXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRQYWdlVGltZW91dChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1dSSVRFX1BBR0VfVElNRU9VVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfV1JJVEVfUEFHRV9USU1FT1VUXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFdyaXRlUGFnZVRpbWVvdXQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9IT1NUX05VTUJFUl9PRl9DT01QTEVURURfUEFDS0VUUzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfSE9TVF9OVU1CRVJfT0ZfQ09NUExFVEVEX1BBQ0tFVFNcbiIpKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfUkVBRF9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0KHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfV1JJVEVfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9XUklURV9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVRcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kV3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0KHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfRU5IQU5DRURfRkxVU0g6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX0VOSEFOQ0VEX0ZMVVNIXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZEVuaGFuY2VkRmx1c2gocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9SRUFEX0xPR0lDQUxfTElOS19BQ0NFUFRfVElNRU9VVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVBRF9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVRcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kUmVhZExvZ2ljYWxMaW5rQWNjZXB0VGltZW91dChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1dSSVRFX0xPR0lDQUxfTElOS19BQ0NFUFRfVElNRU9VVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfV1JJVEVfTE9HSUNBTF9MSU5LX0FDQ0VQVF9USU1FT1VUXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFdyaXRlTG9naWNhbExpbmtBY2NlcHRUaW1lb3V0KHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfU0VUX0VWRU5UX01BU0tfUEFHRV8yOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9TRVRfRVZFTlRfTUFTS19QQUdFXzJcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kU2V0RXZlbnRNYXNrUGFnZTIocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9SRUFEX0xPQ0FUSU9OX0RBVEE6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfTE9DQVRJT05fREFUQVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRSZWFkTG9jYXRpb25EYXRhKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfV1JJVEVfTE9DQVRJT05fREFUQToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfV1JJVEVfTE9DQVRJT05fREFUQVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRXcml0ZUxvY2F0aW9uRGF0YShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFQURfRkxPV19DT05UUk9MX01PREU6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfRkxPV19DT05UUk9MX01PREVcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kUmVhZEZsb3dDb250cm9sTW9kZShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1dSSVRFX0ZMT1dfQ09OVFJPTF9NT0RFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9XUklURV9GTE9XX0NPTlRST0xfTU9ERVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRXcml0ZUZsb3dDb250cm9sTW9kZShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFQURfQkVTVF9FRkZPUlRfRkxVU0hfVElNRU9VVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVBRF9CRVNUX0VGRk9SVF9GTFVTSF9USU1FT1VUXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0KHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfV1JJVEVfQkVTVF9FRkZPUlRfRkxVU0hfVElNRU9VVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfV1JJVEVfQkVTVF9FRkZPUlRfRkxVU0hfVElNRU9VVFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRXcml0ZUJlc3RFZmZvcnRGbHVzaFRpbWVvdXQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9TSE9SVF9SQU5HRV9NT0RFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9TSE9SVF9SQU5HRV9NT0RFXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFNob3J0UmFuZ2VNb2RlKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfSE9TVF9CVUZGRVJfU0laRToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfSE9TVF9CVUZGRVJfU0laRVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRIb3N0QnVmZmVyU2l6ZShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiYnRoY2lfSGFuZGxlT0dGU2V0RXZlbnRNYXNrQ01EKCksIFVua25vd24gY2FzZSA9IDB4JXhcbiIsIHBIY2lDbWQtPk9DRikpOwotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9VTktOT1dOX0NPTU1BTkRcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfVW5rbm93bkNNRChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9IYW5kbGVPR0ZTdGF0dXNQYXJhbWV0ZXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQotCXN3aXRjaCAocEhjaUNtZC0+T0NGKSB7Ci0JY2FzZSBIQ0lfUkVBRF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9SRUFEX0ZBSUxFRF9DT05UQUNUX0NPVU5URVJcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfUkVTRVRfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUjoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVTRVRfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUlxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRSZXNldEZhaWxlZENvbnRhY3RDb3VudGVyKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfUkVBRF9MSU5LX1FVQUxJVFk6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfTElOS19RVUFMSVRZXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRMaW5rUXVhbGl0eShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFQURfUlNTSToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVBRF9SU1NJXG4iKSk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFQURfTE9DQUxfQU1QX0lORk86Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfTE9DQUxfQU1QX0lORk9cbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kUmVhZExvY2FsQU1QSW5mbyhwYWRhcHRlcik7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFQURfTE9DQUxfQU1QX0FTU09DOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9SRUFEX0xPQ0FMX0FNUF9BU1NPQ1xuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRSZWFkTG9jYWxBTVBBc3NvYyhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1dSSVRFX1JFTU9URV9BTVBfQVNTT0M6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1dSSVRFX1JFTU9URV9BTVBfQVNTT0NcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kV3JpdGVSZW1vdGVBTVBBc3NvYyhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiYnRoY2lfSGFuZGxlT0dGU3RhdHVzUGFyYW1ldGVycygpLCBVbmtub3duIGNhc2UgPSAweCV4XG4iLCBwSGNpQ21kLT5PQ0YpKTsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfVU5LTk9XTl9DT01NQU5EXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX1Vua25vd25DTUQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfSGFuZGxlT0dGTGlua0NvbnRyb2xDTUQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIHN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0KLQlzd2l0Y2ggKHBIY2lDbWQtPk9DRikgewotCWNhc2UgSENJX0NSRUFURV9QSFlTSUNBTF9MSU5LOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9DUkVBVEVfUEhZU0lDQUxfTElOS1xuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRDcmVhdGVQaHlzaWNhbExpbmsocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9BQ0NFUFRfUEhZU0lDQUxfTElOSzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfQUNDRVBUX1BIWVNJQ0FMX0xJTktcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kQWNjZXB0UGh5c2ljYWxMaW5rKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfRElTQ09OTkVDVF9QSFlTSUNBTF9MSU5LOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9ESVNDT05ORUNUX1BIWVNJQ0FMX0xJTktcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kRGlzY29ubmVjdFBoeXNpY2FsTGluayhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0NSRUFURV9MT0dJQ0FMX0xJTks6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX0NSRUFURV9MT0dJQ0FMX0xJTktcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kQ3JlYXRlTG9naWNhbExpbmsocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9BQ0NFUFRfTE9HSUNBTF9MSU5LOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9BQ0NFUFRfTE9HSUNBTF9MSU5LXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZEFjY2VwdExvZ2ljYWxMaW5rKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfRElTQ09OTkVDVF9MT0dJQ0FMX0xJTks6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX0RJU0NPTk5FQ1RfTE9HSUNBTF9MSU5LXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZERpc2Nvbm5lY3RMb2dpY2FsTGluayhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0xPR0lDQUxfTElOS19DQU5DRUw6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX0xPR0lDQUxfTElOS19DQU5DRUxcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kTG9naWNhbExpbmtDYW5jZWwocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9GTE9XX1NQRUNfTU9ESUZZOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9GTE9XX1NQRUNfTU9ESUZZXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZEZsb3dTcGVjTW9kaWZ5KHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJidGhjaV9IYW5kbGVPR0ZMaW5rQ29udHJvbENNRCgpLCBVbmtub3duIGNhc2UgPSAweCV4XG4iLCBwSGNpQ21kLT5PQ0YpKTsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfVU5LTk9XTl9DT01NQU5EXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX1Vua25vd25DTUQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfSGFuZGxlT0dGVGVzdGluZ0NNRChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICBzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN3aXRjaCAocEhjaUNtZC0+T0NGKSB7Ci0JY2FzZSBIQ0lfRU5BQkxFX0RFVklDRV9VTkRFUl9URVNUX01PREU6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX0VOQUJMRV9ERVZJQ0VfVU5ERVJfVEVTVF9NT0RFXG4iKSk7Ci0JCWJ0aGNpX0NtZEVuYWJsZURldmljZVVuZGVyVGVzdE1vZGUocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9BTVBfVEVTVF9FTkQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX0FNUF9URVNUX0VORFxuIikpOwotCQlidGhjaV9DbWRBTVBUZXN0RW5kKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfQU1QX1RFU1RfQ09NTUFORDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfQU1QX1RFU1RfQ09NTUFORFxuIikpOwotCQlidGhjaV9DbWRBTVBUZXN0Q29tbWFuZChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0VOQUJMRV9BTVBfUkVDRUlWRVJfUkVQT1JUUzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfRU5BQkxFX0FNUF9SRUNFSVZFUl9SRVBPUlRTXG4iKSk7Ci0JCWJ0aGNpX0NtZEVuYWJsZUFNUFJlY2VpdmVyUmVwb3J0cyhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1VOS05PV05fQ09NTUFORFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9Vbmtub3duQ01EKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0hhbmRsZU9HRkV4dGVuc2lvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJIHN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3dpdGNoIChwSGNpQ21kLT5PQ0YpIHsKLQljYXNlIEhDSV9TRVRfQUNMX0xJTktfREFUQV9GTE9XX01PREU6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkhDSV9TRVRfQUNMX0xJTktfREFUQV9GTE9XX01PREVcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kU2V0QUNMTGlua0RhdGFGbG93TW9kZShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1NFVF9BQ0xfTElOS19TVEFUVVM6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkhDSV9TRVRfQUNMX0xJTktfU1RBVFVTXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFNldEFDTExpbmtTdGF0dXMocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9TRVRfU0NPX0xJTktfU1RBVFVTOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lfU0VUX1NDT19MSU5LX1NUQVRVU1xuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRTZXRTQ09MaW5rU3RhdHVzKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfU0VUX1JTU0lfVkFMVUU6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVF9QRVJJT0RJQ0FMLCAoIkhDSV9TRVRfUlNTSV9WQUxVRVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRTZXRSU1NJVmFsdWUocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9TRVRfQ1VSUkVOVF9CTFVFVE9PVEhfU1RBVFVTOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lfU0VUX0NVUlJFTlRfQkxVRVRPT1RIX1NUQVRVU1xuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRTZXRDdXJyZW50Qmx1ZXRvb3RoU3RhdHVzKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JLyogVGhlIGZvbGxvd2luZyBpcyBmb3IgUlRLODcyMyAqLwotCi0JY2FzZSBIQ0lfRVhURU5TSU9OX1ZFUlNJT05fTk9USUZZOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lfRVhURU5TSU9OX1ZFUlNJT05fTk9USUZZXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZEV4dGVuc2lvblZlcnNpb25Ob3RpZnkocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9MSU5LX1NUQVRVU19OT1RJRlk6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkhDSV9MSU5LX1NUQVRVU19OT1RJRllcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kTGlua1N0YXR1c05vdGlmeShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0JUX09QRVJBVElPTl9OT1RJRlk6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkhDSV9CVF9PUEVSQVRJT05fTk9USUZZXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZEJ0T3BlcmF0aW9uTm90aWZ5KHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfRU5BQkxFX1dJRklfU0NBTl9OT1RJRlk6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkhDSV9FTkFCTEVfV0lGSV9TQ0FOX05PVElGWVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRFbmFibGVXaWZpU2Nhbk5vdGlmeShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCi0JLyogVGhlIGZvbGxvd2luZyBpcyBmb3IgSVZUICovCi0JY2FzZSBIQ0lfV0lGSV9DVVJSRU5UX0NIQU5ORUw6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkhDSV9XSUZJX0NVUlJFTlRfQ0hBTk5FTFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRXSUZJQ3VycmVudENoYW5uZWwocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9XSUZJX0NVUlJFTlRfQkFORFdJRFRIOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lfV0lGSV9DVVJSRU5UX0JBTkRXSURUSFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRXSUZJQ3VycmVudEJhbmR3aWR0aChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1dJRklfQ09OTkVDVElPTl9TVEFUVVM6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkhDSV9XSUZJX0NPTk5FQ1RJT05fU1RBVFVTXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFdJRklDb25uZWN0aW9uU3RhdHVzKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lfVU5LTk9XTl9DT01NQU5EXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX1Vua25vd25DTUQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQKLWJ0aGNpX1N0YXRlU3RhcnRpbmcoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgIGVudW0gaGNpX3N0YXRlX3dpdGhfY21kIFN0YXRlQ21kLCB1OCBFbnRyeU51bSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJbQlQgc3RhdGVdLCBbU3RhcnRpbmddLCAiKSk7Ci0Jc3dpdGNoIChTdGF0ZUNtZCkgewotCWNhc2UgU1RBVEVfQ01EX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfQ09OTkVDVF9BQ0NFUFRfVElNRU9VVFxuIikpOwotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5c0xpbmtDb21wbGV0ZVN0YXR1cyA9IEhDSV9TVEFUVVNfQ09OTkVDVF9BQ0NFUFRfVElNRU9VVDsKLQkJcEJ0TWdudC0+Yk5lZWROb3RpZnlBTVBOb0NhcCA9IHRydWU7Ci0JCUJUSENJX0Rpc2Nvbm5lY3RQZWVyKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVEVfQ01EX0RJU0NPTk5FQ1RfUEhZX0xJTks6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfRElTQ09OTkVDVF9QSFlfTElOS1xuIikpOwotCi0JCWJ0aGNpX0V2ZW50RGlzY29ubmVjdFBoeUxpbmtDb21wbGV0ZShwYWRhcHRlciwKLQkJSENJX1NUQVRVU19TVUNDRVNTLAotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0Rpc2Nvbm5lY3RSZWFzb24sCi0JCUVudHJ5TnVtKTsKLQotCQlkZWxfdGltZXJfc3luYygmcEJUSW5mby0+QlRIQ0lKb2luVGltZW91dFRpbWVyKTsKLQotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5c0xpbmtDb21wbGV0ZVN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0KLQkJQlRIQ0lfRGlzY29ubmVjdFBlZXIocGFkYXB0ZXIsIEVudHJ5TnVtKTsKLQkJYnJlYWs7Ci0JY2FzZSBTVEFURV9DTURfTUFDX1NUQVJUX0NPTVBMRVRFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX01BQ19TVEFSVF9DT01QTEVURVxuIikpOwotCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFNUFJvbGUgPT0gQU1QX0JUQVBfQ1JFQVRPUikKLQkJCWJ0aGNpX0V2ZW50Q2hhbm5lbFNlbGVjdGVkKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTdGF0ZSBjb21tYW5kKCVkKSBpcyBXcm9uZyAhISFcbiIsIFN0YXRlQ21kKSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWJ0aGNpX1N0YXRlQ29ubmVjdGluZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgICBlbnVtIGhjaV9zdGF0ZV93aXRoX2NtZCBTdGF0ZUNtZCwgdTggRW50cnlOdW0pCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIHN0YXRlXSwgW0Nvbm5lY3RpbmddLCAiKSk7Ci0Jc3dpdGNoIChTdGF0ZUNtZCkgewotCWNhc2UgU1RBVEVfQ01EX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfQ09OTkVDVF9BQ0NFUFRfVElNRU9VVFxuIikpOwotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5c0xpbmtDb21wbGV0ZVN0YXR1cyA9IEhDSV9TVEFUVVNfQ09OTkVDVF9BQ0NFUFRfVElNRU9VVDsKLQkJcEJ0TWdudC0+Yk5lZWROb3RpZnlBTVBOb0NhcCA9IHRydWU7Ci0JCUJUSENJX0Rpc2Nvbm5lY3RQZWVyKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVEVfQ01EX01BQ19DT05ORUNUX0NPTVBMRVRFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX01BQ19DT05ORUNUX0NPTVBMRVRFXG4iKSk7Ci0KLQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BTVBSb2xlID09IEFNUF9CVEFQX0pPSU5FUikgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiU3RhdGVDb25uZWN0aW5nXG4iKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX0RJU0NPTk5FQ1RfUEhZX0xJTktcbiIpKTsKLQotCQlidGhjaV9FdmVudERpc2Nvbm5lY3RQaHlMaW5rQ29tcGxldGUocGFkYXB0ZXIsCi0JCUhDSV9TVEFUVVNfU1VDQ0VTUywKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtEaXNjb25uZWN0UmVhc29uLAotCQlFbnRyeU51bSk7Ci0KLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeXNMaW5rQ29tcGxldGVTdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCi0JCWRlbF90aW1lcl9zeW5jKCZwQlRJbmZvLT5CVEhDSUpvaW5UaW1lb3V0VGltZXIpOwotCi0JCUJUSENJX0Rpc2Nvbm5lY3RQZWVyKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0KLQkJYnJlYWs7Ci0JY2FzZSBTVEFURV9DTURfTUFDX0NPTk5FQ1RfQ0FOQ0VMX0lORElDQVRFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX01BQ19DT05ORUNUX0NBTkNFTF9JTkRJQ0FURVxuIikpOwotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5c0xpbmtDb21wbGV0ZVN0YXR1cyA9IEhDSV9TVEFUVVNfQ09OVFJPTExFUl9CVVNZOwotCQkvKiAgQmVjYXVzZSB0aGlzIHN0YXRlIGNtZCBpcyBjYXVzZWQgYnkgdGhlIEJUSENJX0V2ZW50QU1QU3RhdHVzQ2hhbmdlKCksICovCi0JCS8qICB3ZSBkb24ndCBuZWVkIHRvIHNlbmQgZXZlbnQgaW4gdGhlIGZvbGxvd2luZyBCVEhDSV9EaXNjb25uZWN0UGVlcigpIGFnYWluLiAqLwotCQlwQnRNZ250LT5iTmVlZE5vdGlmeUFNUE5vQ2FwID0gZmFsc2U7Ci0JCUJUSENJX0Rpc2Nvbm5lY3RQZWVyKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTdGF0ZSBjb21tYW5kKCVkKSBpcyBXcm9uZyAhISFcbiIsIFN0YXRlQ21kKSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWJ0aGNpX1N0YXRlQ29ubmVjdGVkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICAgZW51bSBoY2lfc3RhdGVfd2l0aF9jbWQgU3RhdGVDbWQsIHU4IEVudHJ5TnVtKQotewotLypQTUdOVF9JTkZPIHBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0JdTggaTsKLQl1MTYgbG9naWNIYW5kbGUgPSAwOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBzdGF0ZV0sIFtDb25uZWN0ZWRdLCAiKSk7Ci0Jc3dpdGNoIChTdGF0ZUNtZCkgewotCWNhc2UgU1RBVEVfQ01EX0RJU0NPTk5FQ1RfUEhZX0xJTks6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfRElTQ09OTkVDVF9QSFlfTElOS1xuIikpOwotCi0JCS8qIFdoZW4gd2UgYXJlIHRyeWluZyB0byBkaXNjb25uZWN0IHRoZSBwaHkgbGluaywgd2Ugc2hvdWxkIGRpc2Nvbm5lY3QgbG9nIGxpbmsgZmlyc3QsICovCi0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTE9HSUNBTF9MSU5LX05VTTsgaSsrKSB7Ci0JCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhLT5CdExvZ0xpbmtoYW5kbGUgIT0gMCkgewotCQkJCWxvZ2ljSGFuZGxlID0gcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhLT5CdExvZ0xpbmtoYW5kbGU7Ci0KLQkJCQlidGhjaV9FdmVudERpc2Nvbm5lY3RMb2dpY2FsTGlua0NvbXBsZXRlKHBhZGFwdGVyLCBIQ0lfU1RBVFVTX1NVQ0NFU1MsCi0JCQkJCWxvZ2ljSGFuZGxlLCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0Rpc2Nvbm5lY3RSZWFzb24pOwotCi0JCQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhLT5CdExvZ0xpbmtoYW5kbGUgPSAwOwotCQkJfQotCQl9Ci0KLQkJYnRoY2lfRXZlbnREaXNjb25uZWN0UGh5TGlua0NvbXBsZXRlKHBhZGFwdGVyLAotCQlIQ0lfU1RBVFVTX1NVQ0NFU1MsCi0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rRGlzY29ubmVjdFJlYXNvbiwKLQkJRW50cnlOdW0pOwotCi0JCWRlbF90aW1lcl9zeW5jKCZwQlRJbmZvLT5CVEhDSUpvaW5UaW1lb3V0VGltZXIpOwotCi0JCUJUSENJX0Rpc2Nvbm5lY3RQZWVyKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTVEFURV9DTURfTUFDX0RJU0NPTk5FQ1RfSU5ESUNBVEU6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfTUFDX0RJU0NPTk5FQ1RfSU5ESUNBVEVcbiIpKTsKLQotCQlidGhjaV9FdmVudERpc2Nvbm5lY3RQaHlMaW5rQ29tcGxldGUocGFkYXB0ZXIsCi0JCUhDSV9TVEFUVVNfU1VDQ0VTUywKLQkJLyogIFRPRE86IFJlbW90ZSBIb3N0IG5vdCBsb2NhbCBob3N0ICovCi0JCUhDSV9TVEFUVVNfQ09OTkVDVF9URVJNSU5BVEVfTE9DQUxfSE9TVCwKLQkJRW50cnlOdW0pOwotCQlCVEhDSV9EaXNjb25uZWN0UGVlcihwYWRhcHRlciwgRW50cnlOdW0pOwotCi0JCWJyZWFrOwotCWNhc2UgU1RBVEVfQ01EX0VOVEVSX1NUQVRFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX0VOVEVSX1NUQVRFXG4iKSk7Ci0KLQkJaWYgKHBCdE1nbnQtPmJCVENvbm5lY3RJblByb2dyZXNzKSB7Ci0JCQlwQnRNZ250LT5iQlRDb25uZWN0SW5Qcm9ncmVzcyA9IGZhbHNlOwotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBGbGFnXSwgQlQgQ29ubmVjdCBpbiBwcm9ncmVzcyBPRkYhIVxuIikpOwotCQl9Ci0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CdEN1cnJlbnRTdGF0ZSA9IEhDSV9TVEFURV9DT05ORUNURUQ7Ci0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5iNHdheVN1Y2Nlc3MgPSB0cnVlOwotCQlwQnRNZ250LT5iU3RhcnRTZW5kU3VwZXJ2aXNpb25Qa3QgPSB0cnVlOwotCi0JCS8qICBmb3IgcmF0ZSBhZGFwdGl2ZSAqLwotCi0JCXJ0bDg3MjNhX3VwZGF0ZV9yYW1hc2socGFkYXB0ZXIsCi0JCQkJICAgICAgIE1BWF9GV19TVVBQT1JUX01BQ0lEX05VTS0xLUVudHJ5TnVtLCAwKTsKLQotCQlIYWxTZXRCcmF0ZUNmZzIzYShwYWRhcHRlciwgcGFkYXB0ZXItPm1sbWVwcml2LmN1cl9uZXR3b3JrLm5ldHdvcmsuU3VwcG9ydGVkUmF0ZXMpOwotCQlCVERNX1NldEZ3Q2hubEluZm8ocGFkYXB0ZXIsIFJUX01FRElBX0NPTk5FQ1QpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU3RhdGUgY29tbWFuZCglZCkgaXMgV3JvbmcgISEhXG4iLCBTdGF0ZUNtZCkpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9TdGF0ZUF1dGgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgZW51bSBoY2lfc3RhdGVfd2l0aF9jbWQgU3RhdGVDbWQsCi0JCXU4IEVudHJ5TnVtKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBzdGF0ZV0sIFtBdXRoZW50aWNhdGluZ10sICIpKTsKLQlzd2l0Y2ggKFN0YXRlQ21kKSB7Ci0JY2FzZSBTVEFURV9DTURfQ09OTkVDVF9BQ0NFUFRfVElNRU9VVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9DT05ORUNUX0FDQ0VQVF9USU1FT1VUXG4iKSk7Ci0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlzTGlua0NvbXBsZXRlU3RhdHVzID0gSENJX1NUQVRVU19DT05ORUNUX0FDQ0VQVF9USU1FT1VUOwotCQlwQnRNZ250LT5iTmVlZE5vdGlmeUFNUE5vQ2FwID0gdHJ1ZTsKLQkJQlRIQ0lfRGlzY29ubmVjdFBlZXIocGFkYXB0ZXIsIEVudHJ5TnVtKTsKLQkJYnJlYWs7Ci0JY2FzZSBTVEFURV9DTURfRElTQ09OTkVDVF9QSFlfTElOSzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LXG4iKSk7Ci0JCWJ0aGNpX0V2ZW50RGlzY29ubmVjdFBoeUxpbmtDb21wbGV0ZShwYWRhcHRlciwKLQkJSENJX1NUQVRVU19TVUNDRVNTLAotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0Rpc2Nvbm5lY3RSZWFzb24sCi0JCUVudHJ5TnVtKTsKLQotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5c0xpbmtDb21wbGV0ZVN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0KLQkJZGVsX3RpbWVyX3N5bmMoJnBCVEluZm8tPkJUSENJSm9pblRpbWVvdXRUaW1lcik7Ci0KLQkJQlRIQ0lfRGlzY29ubmVjdFBlZXIocGFkYXB0ZXIsIEVudHJ5TnVtKTsKLQkJYnJlYWs7Ci0JY2FzZSBTVEFURV9DTURfNFdBWV9GQUlMRUQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfNFdBWV9GQUlMRURcbiIpKTsKLQotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5c0xpbmtDb21wbGV0ZVN0YXR1cyA9IEhDSV9TVEFUVVNfQVVUSF9GQUlMOwotCQlwQnRNZ250LT5iTmVlZE5vdGlmeUFNUE5vQ2FwID0gdHJ1ZTsKLQotCQlCVEhDSV9EaXNjb25uZWN0UGVlcihwYWRhcHRlciwgRW50cnlOdW0pOwotCi0JCWRlbF90aW1lcl9zeW5jKCZwQlRJbmZvLT5CVEhDSUpvaW5UaW1lb3V0VGltZXIpOwotCQlicmVhazsKLQljYXNlIFNUQVRFX0NNRF80V0FZX1NVQ0NFU1NFRDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF80V0FZX1NVQ0NFU1NFRFxuIikpOwotCi0JCWJ0aGNpX0V2ZW50UGh5c2ljYWxMaW5rQ29tcGxldGUocGFkYXB0ZXIsIEhDSV9TVEFUVVNfU1VDQ0VTUywgRW50cnlOdW0sIElOVkFMSURfUExfSEFORExFKTsKLQotCQlkZWxfdGltZXJfc3luYygmcEJUSW5mby0+QlRIQ0lKb2luVGltZW91dFRpbWVyKTsKLQotCQlCVEhDSV9TTV9XSVRIX0lORk8ocGFkYXB0ZXIsIEhDSV9TVEFURV9DT05ORUNURUQsIFNUQVRFX0NNRF9FTlRFUl9TVEFURSwgRW50cnlOdW0pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU3RhdGUgY29tbWFuZCglZCkgaXMgV3JvbmcgISEhXG4iLCBTdGF0ZUNtZCkpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9TdGF0ZURpc2Nvbm5lY3Rpbmcoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSBlbnVtIGhjaV9zdGF0ZV93aXRoX2NtZCBTdGF0ZUNtZCwgdTggRW50cnlOdW0pCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIHN0YXRlXSwgW0Rpc2Nvbm5lY3RpbmddLCAiKSk7Ci0Jc3dpdGNoIChTdGF0ZUNtZCkgewotCWNhc2UgU1RBVEVfQ01EX01BQ19DT05ORUNUX0NBTkNFTF9JTkRJQ0FURToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9NQUNfQ09OTkVDVF9DQU5DRUxfSU5ESUNBVEVcbiIpKTsKLQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5iTmVlZFBoeXNMaW5rQ29tcGxldGVFdmVudCkgewotCQkJYnRoY2lfRXZlbnRQaHlzaWNhbExpbmtDb21wbGV0ZShwYWRhcHRlciwKLQkJCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5c0xpbmtDb21wbGV0ZVN0YXR1cywKLQkJCQlFbnRyeU51bSwgSU5WQUxJRF9QTF9IQU5ETEUpOwotCQl9Ci0KLQkJaWYgKHBCdE1nbnQtPmJCVENvbm5lY3RJblByb2dyZXNzKSB7Ci0JCQlwQnRNZ250LT5iQlRDb25uZWN0SW5Qcm9ncmVzcyA9IGZhbHNlOwotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBGbGFnXSwgQlQgQ29ubmVjdCBpbiBwcm9ncmVzcyBPRkYhIVxuIikpOwotCQl9Ci0KLQkJQlRIQ0lfU01fV0lUSF9JTkZPKHBhZGFwdGVyLCBIQ0lfU1RBVEVfRElTQ09OTkVDVEVELCBTVEFURV9DTURfRU5URVJfU1RBVEUsIEVudHJ5TnVtKTsKLQkJYnJlYWs7Ci0JY2FzZSBTVEFURV9DTURfRElTQ09OTkVDVF9QSFlfTElOSzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LXG4iKSk7Ci0KLQkJYnRoY2lfRXZlbnREaXNjb25uZWN0UGh5TGlua0NvbXBsZXRlKHBhZGFwdGVyLAotCQlIQ0lfU1RBVFVTX1NVQ0NFU1MsCi0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rRGlzY29ubmVjdFJlYXNvbiwKLQkJRW50cnlOdW0pOwotCi0JCWRlbF90aW1lcl9zeW5jKCZwQlRJbmZvLT5CVEhDSUpvaW5UaW1lb3V0VGltZXIpOwotCi0JCUJUSENJX0Rpc2Nvbm5lY3RQZWVyKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTdGF0ZSBjb21tYW5kKCVkKSBpcyBXcm9uZyAhISFcbiIsIFN0YXRlQ21kKSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWJ0aGNpX1N0YXRlRGlzY29ubmVjdGVkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQllbnVtIGhjaV9zdGF0ZV93aXRoX2NtZCBTdGF0ZUNtZCwgdTggRW50cnlOdW0pCi17Ci0vKlBNR05UX0lORk8gcE1nbnRJbmZvID0gJnBhZGFwdGVyLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBzdGF0ZV0sIFtEaXNjb25uZWN0ZWRdLCAiKSk7Ci0Jc3dpdGNoIChTdGF0ZUNtZCkgewotCWNhc2UgU1RBVEVfQ01EX0NSRUFURV9QSFlfTElOSzoKLQljYXNlIFNUQVRFX0NNRF9BQ0NFUFRfUEhZX0xJTks6Ci0JCWlmIChTdGF0ZUNtZCA9PSBTVEFURV9DTURfQ1JFQVRFX1BIWV9MSU5LKQotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9DUkVBVEVfUEhZX0xJTktcbiIpKTsKLQkJZWxzZQotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9BQ0NFUFRfUEhZX0xJTktcbiIpKTsKLQotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIFBTXSwgRGlzYWJsZSBJUFMgYW5kIExQU1xuIikpOwotCQlpcHNfbGVhdmUyM2EocGFkYXB0ZXIpOwotCQlMUFNfTGVhdmUyM2EocGFkYXB0ZXIpOwotCi0JCXBCdE1nbnQtPmJQaHlMaW5rSW5Qcm9ncmVzcyA9IHRydWU7Ci0JCXBCdE1nbnQtPkJUQ3VycmVudENvbm5lY3RUeXBlID0gQlRfRElTQ09OTkVDVDsKLQkJcEJ0TWdudC0+Q3VycmVudEJUQ29ubmVjdGlvbkNudCsrOwotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIEZsYWddLCBDdXJyZW50QlRDb25uZWN0aW9uQ250ID0gJWRcbiIsCi0JCQlwQnRNZ250LT5DdXJyZW50QlRDb25uZWN0aW9uQ250KSk7Ci0JCXBCdE1nbnQtPkJ0T3BlcmF0aW9uT24gPSB0cnVlOwotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIEZsYWddLCBCdCBPcGVyYXRpb24gT04hISBDdXJyZW50Q29ubmVjdEVudHJ5TnVtID0gJWRcbiIsCi0JCQlwQnRNZ250LT5DdXJyZW50Q29ubmVjdEVudHJ5TnVtKSk7Ci0KLQkJaWYgKHBCdE1nbnQtPmJCVENvbm5lY3RJblByb2dyZXNzKSB7Ci0JCQlidGhjaV9FdmVudFBoeXNpY2FsTGlua0NvbXBsZXRlKHBhZGFwdGVyLCBIQ0lfU1RBVFVTX0NPTlRST0xMRVJfQlVTWSwgSU5WQUxJRF9FTlRSWV9OVU0sIHBCdE1nbnQtPkJ0Q3VycmVudFBoeUxpbmtoYW5kbGUpOwotCQkJYnRoY2lfUmVtb3ZlRW50cnlCeUVudHJ5TnVtKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoU3RhdGVDbWQgPT0gU1RBVEVfQ01EX0NSRUFURV9QSFlfTElOSykKLQkJCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BTVBSb2xlID0gQU1QX0JUQVBfQ1JFQVRPUjsKLQkJZWxzZQotCQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFNUFJvbGUgPSBBTVBfQlRBUF9KT0lORVI7Ci0KLQkJLyogIDEuIE1BQyBub3QgeWV0IGluIHNlbGVjdGVkIGNoYW5uZWwgKi8KLQkJd2hpbGUgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9BU09DX1NUQVRFfFdJRklfU0lURV9NT05JVE9SKSkgewotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNjYW4vUm9hbWluZy9XaWZpIExpbmsgaXMgaW4gUHJvZ3Jlc3MsIHdhaXQgMjAwIG1zXG4iKSk7Ci0JCQltZGVsYXkoMjAwKTsKLQkJfQotCQkvKiAgMi4gTUFDIGFscmVhZHkgaW4gc2VsZWN0ZWQgY2hhbm5lbCAqLwotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiQ2hhbm5lbCBpcyBSZWFkeVxuIikpOwotCQltb2RfdGltZXIoJnBCVEluZm8tPkJUSENJSm9pblRpbWVvdXRUaW1lciwKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMocEJ0SGNpSW5mby0+Q29ubkFjY2VwdFRpbWVvdXQpKTsKLQotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uYk5lZWRQaHlzTGlua0NvbXBsZXRlRXZlbnQgPSB0cnVlOwotCQlicmVhazsKLQljYXNlIFNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX0RJU0NPTk5FQ1RfUEhZX0xJTktcbiIpKTsKLQotCQlkZWxfdGltZXJfc3luYygmcEJUSW5mby0+QlRIQ0lKb2luVGltZW91dFRpbWVyKTsKLQotCQlidGhjaV9FdmVudERpc2Nvbm5lY3RQaHlMaW5rQ29tcGxldGUocGFkYXB0ZXIsCi0JCUhDSV9TVEFUVVNfU1VDQ0VTUywKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtEaXNjb25uZWN0UmVhc29uLAotCQlFbnRyeU51bSk7Ci0KLQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5iTmVlZFBoeXNMaW5rQ29tcGxldGVFdmVudCkgewotCQkJYnRoY2lfRXZlbnRQaHlzaWNhbExpbmtDb21wbGV0ZShwYWRhcHRlciwKLQkJCQlIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lELAotCQkJCUVudHJ5TnVtLCBJTlZBTElEX1BMX0hBTkRMRSk7Ci0JCX0KLQotCQlpZiAocEJ0TWdudC0+YkJUQ29ubmVjdEluUHJvZ3Jlc3MpIHsKLQkJCXBCdE1nbnQtPmJCVENvbm5lY3RJblByb2dyZXNzID0gZmFsc2U7Ci0JCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIEZsYWddLCBCVCBDb25uZWN0IGluIHByb2dyZXNzIE9GRiEhXG4iKSk7Ci0JCX0KLQkJQlRIQ0lfU01fV0lUSF9JTkZPKHBhZGFwdGVyLCBIQ0lfU1RBVEVfRElTQ09OTkVDVEVELCBTVEFURV9DTURfRU5URVJfU1RBVEUsIEVudHJ5TnVtKTsKLQkJYnRoY2lfUmVtb3ZlRW50cnlCeUVudHJ5TnVtKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVEVfQ01EX0VOVEVSX1NUQVRFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX0VOVEVSX1NUQVRFXG4iKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTdGF0ZSBjb21tYW5kKCVkKSBpcyBXcm9uZyAhISFcbiIsIFN0YXRlQ21kKSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotdm9pZCBCVEhDSV9FdmVudFBhcnNlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHZvaWQgKnBFdm50RGF0YSwgdTMyIGRhdGFMZW4pCi17Ci19Ci0KLXU4IEJUSENJX0hzQ29ubmVjdGlvbkVzdGFibGlzaGVkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggYkJ0Q29ubmVjdGlvbkV4aXN0ID0gZmFsc2U7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJ0aW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQl1OCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9CVF9BU09DX0VOVFJZX05VTTsgaSsrKSB7Ci0JCWlmIChwQnRpbmZvLT5CdEFzb2NFbnRyeVtpXS5iNHdheVN1Y2Nlc3MpIHsKLQkJCWJCdENvbm5lY3Rpb25FeGlzdCA9IHRydWU7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotLypSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiIEJUSENJX0hzQ29ubmVjdGlvbkVzdGFibGlzaGVkKCksIGNvbm5lY3Rpb24gZXhpc3QgPSAlZFxuIiwgYkJ0Q29ubmVjdGlvbkV4aXN0KSk7ICovCi0KLQlyZXR1cm4gYkJ0Q29ubmVjdGlvbkV4aXN0OwotfQotCi1zdGF0aWMgdTgKLUJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQllbnVtIGJ0X3RyYWZmaWNfbW9kZV9wcm9maWxlIFByb2ZpbGUpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0JdTggSXNQUm9maWxlID0gZmFsc2U7Ci0JdTggaSA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlOyBpKyspIHsKLQkJaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5UcmFmZmljUHJvZmlsZSA9PSBQcm9maWxlKSB7Ci0JCQlJc1BSb2ZpbGUgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gSXNQUm9maWxlOwotfQotCi12b2lkIEJUSENJX1VwZGF0ZUJUUHJvZmlsZVJUS1RvTW90byhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXU4IGkgPSAwOwotCi0JcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mU0NPID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGU7IGkrKykgewotCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uVHJhZmZpY1Byb2ZpbGUgPSBCVF9QUk9GSUxFX05PTkU7Ci0KLQkJaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVFByb2ZpbGUgPT0gQlRfUFJPRklMRV9TQ08pCi0JCQlwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZTQ08rKzsKLQotCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uVHJhZmZpY1Byb2ZpbGUgPSBwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRQcm9maWxlOwotCQlzd2l0Y2ggKHBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5UcmFmZmljUHJvZmlsZSkgewotCQljYXNlIEJUX1BST0ZJTEVfU0NPOgotCQkJYnJlYWs7Ci0JCWNhc2UgQlRfUFJPRklMRV9QQU46Ci0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uSW5jb21pbmdUcmFmZmljTW9kZSA9IEJUX01PVE9SX0VYVF9CRTsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5PdXRnb2luZ1RyYWZmaWNNb2RlID0gQlRfTU9UT1JfRVhUX0JFOwotCQkJYnJlYWs7Ci0JCWNhc2UgQlRfUFJPRklMRV9BMkRQOgotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkluY29taW5nVHJhZmZpY01vZGUgPSBCVF9NT1RPUl9FWFRfR1VMQjsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5PdXRnb2luZ1RyYWZmaWNNb2RlID0gQlRfTU9UT1JfRVhUX0dVTEI7Ci0JCQlicmVhazsKLQkJY2FzZSBCVF9QUk9GSUxFX0hJRDoKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5JbmNvbWluZ1RyYWZmaWNNb2RlID0gQlRfTU9UT1JfRVhUX0dVTDsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5PdXRnb2luZ1RyYWZmaWNNb2RlID0gQlRfTU9UT1JfRVhUX0JFOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlRLLCBOdW1iZXJPZkhhbmRsZSA9ICVkLCBOdW1iZXJPZlNDTyA9ICVkXG4iLAotCQlwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUsIHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZlNDTykpOwotfQotCi12b2lkIEJUSENJX1dpZmlTY2FuTm90aWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHNjYW5UeXBlKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iRW5hYmxlV2lmaVNjYW5Ob3RpZnkpCi0JCWJ0aGNpX0V2ZW50RXh0V2lmaVNjYW5Ob3RpZnkocGFkYXB0ZXIsIHNjYW5UeXBlKTsKLX0KLQotdm9pZAotQlRIQ0lfU3RhdGVNYWNoaW5lKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JdTggCQlTdGF0ZVRvRW50ZXIsCi0JZW51bSBoY2lfc3RhdGVfd2l0aF9jbWQJCVN0YXRlQ21kLAotCXU4IAkJRW50cnlOdW0KLQkpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlpZiAoRW50cnlOdW0gPT0gMHhmZikgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiIFN0YXRlTWFjaGluZSwgZXJyb3IgRW50cnlOdW0gPSAweCV4IFxuIiwgRW50cnlOdW0pKTsKLQkJcmV0dXJuOwotCX0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiIFN0YXRlTWFjaGluZSwgRW50cnlOdW0gPSAweCV4LCBDdXJyZW50U3RhdGUgPSAweCV4LCBCdE5leHRTdGF0ZSA9IDB4JXgsICBTdGF0ZUNtZCA9IDB4JXggLCBTdGF0ZVRvRW50ZXIgPSAweCV4XG4iLAotCQlFbnRyeU51bSwgcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJ0Q3VycmVudFN0YXRlLCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQnROZXh0U3RhdGUsIFN0YXRlQ21kLCBTdGF0ZVRvRW50ZXIpKTsKLQotCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQnROZXh0U3RhdGUgJiBTdGF0ZVRvRW50ZXIpIHsKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJ0Q3VycmVudFN0YXRlID0gU3RhdGVUb0VudGVyOwotCi0JCXN3aXRjaCAoU3RhdGVUb0VudGVyKSB7Ci0JCWNhc2UgSENJX1NUQVRFX1NUQVJUSU5HOgotCQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJ0TmV4dFN0YXRlID0gSENJX1NUQVRFX0RJU0NPTk5FQ1RJTkcgfCBIQ0lfU1RBVEVfQ09OTkVDVElORzsKLQkJCWJ0aGNpX1N0YXRlU3RhcnRpbmcocGFkYXB0ZXIsIFN0YXRlQ21kLCBFbnRyeU51bSk7Ci0JCQlicmVhazsKLQkJY2FzZSBIQ0lfU1RBVEVfQ09OTkVDVElORzoKLQkJCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CdE5leHRTdGF0ZSA9IEhDSV9TVEFURV9DT05ORUNUSU5HIHwgSENJX1NUQVRFX0RJU0NPTk5FQ1RJTkcgfCBIQ0lfU1RBVEVfQVVUSEVOVElDQVRJTkc7Ci0JCQlidGhjaV9TdGF0ZUNvbm5lY3RpbmcocGFkYXB0ZXIsIFN0YXRlQ21kLCBFbnRyeU51bSk7Ci0JCQlicmVhazsKLQkJY2FzZSBIQ0lfU1RBVEVfQVVUSEVOVElDQVRJTkc6Ci0JCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQnROZXh0U3RhdGUgPSBIQ0lfU1RBVEVfRElTQ09OTkVDVElORyB8IEhDSV9TVEFURV9DT05ORUNURUQ7Ci0JCQlidGhjaV9TdGF0ZUF1dGgocGFkYXB0ZXIsIFN0YXRlQ21kLCBFbnRyeU51bSk7Ci0JCQlicmVhazsKLQkJY2FzZSBIQ0lfU1RBVEVfQ09OTkVDVEVEOgotCQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJ0TmV4dFN0YXRlID0gSENJX1NUQVRFX0NPTk5FQ1RFRCB8IEhDSV9TVEFURV9ESVNDT05ORUNUSU5HOwotCQkJYnRoY2lfU3RhdGVDb25uZWN0ZWQocGFkYXB0ZXIsIFN0YXRlQ21kLCBFbnRyeU51bSk7Ci0JCQlicmVhazsKLQkJY2FzZSBIQ0lfU1RBVEVfRElTQ09OTkVDVElORzoKLQkJCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CdE5leHRTdGF0ZSA9IEhDSV9TVEFURV9ESVNDT05ORUNURUQgfCBIQ0lfU1RBVEVfRElTQ09OTkVDVElORzsKLQkJCWJ0aGNpX1N0YXRlRGlzY29ubmVjdGluZyhwYWRhcHRlciwgU3RhdGVDbWQsIEVudHJ5TnVtKTsKLQkJCWJyZWFrOwotCQljYXNlIEhDSV9TVEFURV9ESVNDT05ORUNURUQ6Ci0JCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQnROZXh0U3RhdGUgPSBIQ0lfU1RBVEVfRElTQ09OTkVDVEVEIHwgSENJX1NUQVRFX1NUQVJUSU5HIHwgSENJX1NUQVRFX0NPTk5FQ1RJTkc7Ci0JCQlidGhjaV9TdGF0ZURpc2Nvbm5lY3RlZChwYWRhcHRlciwgU3RhdGVDbWQsIEVudHJ5TnVtKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIiBTdGF0ZU1hY2hpbmUsIFVua25vd24gc3RhdGUgdG8gZW50ZXIhISFcbiIpKTsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIiBTdGF0ZU1hY2hpbmUsIFdyb25nIHN0YXRlIHRvIGVudGVyXG4iKSk7Ci0JfQotCi0JLyogIDIwMTAwMzI1IEpvc2VwaDogRGlzYWJsZS9FbmFibGUgSVBTL0xQUyBhY2NvcmRpbmcgdG8gQlQgc3RhdHVzLiAqLwotCWlmICghcEJ0TWdudC0+YkJUQ29ubmVjdEluUHJvZ3Jlc3MgJiYgIXBCdE1nbnQtPkJ0T3BlcmF0aW9uT24pIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBQU10sIGlwc19lbnRlcjIzYSgpXG4iKSk7Ci0JCWlwc19lbnRlcjIzYShwYWRhcHRlcik7Ci0JfQotfQotCi12b2lkIEJUSENJX0Rpc2Nvbm5lY3RQZWVyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IEVudHJ5TnVtKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCIgQlRIQ0lfRGlzY29ubmVjdFBlZXIoKVxuIikpOwotCi0JQlRIQ0lfU01fV0lUSF9JTkZPKHBhZGFwdGVyLCBIQ0lfU1RBVEVfRElTQ09OTkVDVElORywgU1RBVEVfQ01EX01BQ19DT05ORUNUX0NBTkNFTF9JTkRJQ0FURSwgRW50cnlOdW0pOwotCi0JaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5iVXNlZCkgewotLypCVFBLVF9TZW5kRGVhdXRoZW50aWNhdGlvbihwYWRhcHRlciwgcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJUUmVtb3RlTUFDQWRkciwgdW5zcGVjX3JlYXNvbik7IG5vdCBwb3J0aW5nIHlldCAqLwotCX0KLQotCWlmIChwQnRNZ250LT5iQlRDb25uZWN0SW5Qcm9ncmVzcykgewotCQlwQnRNZ250LT5iQlRDb25uZWN0SW5Qcm9ncmVzcyA9IGZhbHNlOwotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIEZsYWddLCBCVCBDb25uZWN0IGluIHByb2dyZXNzIE9GRiEhXG4iKSk7Ci0JfQotCi0JYnRoY2lfUmVtb3ZlRW50cnlCeUVudHJ5TnVtKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0KLQlpZiAocEJ0TWdudC0+Yk5lZWROb3RpZnlBTVBOb0NhcCkgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIEFNUFN0YXR1c10sIHNldCB0byBpbnZhbGlkIGluIEJUSENJX0Rpc2Nvbm5lY3RQZWVyKClcbiIpKTsKLQkJQlRIQ0lfRXZlbnRBTVBTdGF0dXNDaGFuZ2UocGFkYXB0ZXIsIEFNUF9TVEFUVVNfTk9fQ0FQQUNJVFlfRk9SX0JUKTsKLQl9Ci19Ci0KLXZvaWQgQlRIQ0lfRXZlbnROdW1PZkNvbXBsZXRlZERhdGFCbG9ja3Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLS8qUE1HTlRfSU5GTyBwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1OCBsb2NhbEJ1ZltUbXBMb2NhbEJ1ZlNpemVdID0gIiI7Ci0JdTggKnBSZXRQYXIsICpwVHJpcGxlOwotCXU4IGxlbiA9IDAsIGksIGosIGhhbmRsZU51bSA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCXUxNiAqcHUyVGVtcCwgKnBQYWNrZXRzLCAqcEhhbmRsZSwgKnBEYmxvY2tzOwotCXU4IHNlbnQgPSAwOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWlmICghKHBCdEhjaUluZm8tPkJURXZlbnRNYXNrUGFnZTIgJiBFTVAyX0hDSV9FVkVOVF9OVU1fT0ZfQ09NUExFVEVfREFUQV9CTE9DS1MpKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwgKCJbQlQgZXZlbnRdLCBOdW0gT2YgQ29tcGxldGVkIERhdGFCbG9ja3MsIElnbm9yZSB0byBzZW5kIE51bU9mQ29tcGxldGVkRGF0YUJsb2Nrc0V2ZW50IGR1ZSB0byBldmVudCBtYXNrIHBhZ2UgMlxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVswXTsKLQlwVHJpcGxlID0gJnBSZXRQYXJbM107Ci0JZm9yIChqID0gMDsgaiA8IE1BWF9CVF9BU09DX0VOVFJZX05VTTsgaisrKSB7Ci0KLQkJZm9yIChpID0gMDsgaSA8IE1BWF9MT0dJQ0FMX0xJTktfTlVNOyBpKyspIHsKLQkJCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtqXS5Mb2dMaW5rQ21kRGF0YVtpXS5CdExvZ0xpbmtoYW5kbGUpIHsKLQkJCQloYW5kbGVOdW0rKzsKLQkJCQlwSGFuZGxlID0gKHUxNiAqKSZwVHJpcGxlWzBdOwkvKiAgSGFuZGxlW2ldICovCi0JCQkJcFBhY2tldHMgPSAodTE2ICopJnBUcmlwbGVbMl07CS8qICBOdW1fT2ZfQ29tcGxldGVkX1BhY2tldHNbaV0gKi8KLQkJCQlwRGJsb2NrcyA9ICh1MTYgKikmcFRyaXBsZVs0XTsJLyogIE51bV9PZl9Db21wbGV0ZWRfQmxvY2tzW2ldICovCi0JCQkJKnBIYW5kbGUgPSBwQlRJbmZvLT5CdEFzb2NFbnRyeVtqXS5Mb2dMaW5rQ21kRGF0YVtpXS5CdExvZ0xpbmtoYW5kbGU7Ci0JCQkJKnBQYWNrZXRzID0gKHUxNilwQlRJbmZvLT5CdEFzb2NFbnRyeVtqXS5Mb2dMaW5rQ21kRGF0YVtpXS5UeFBhY2tldENvdW50OwotCQkJCSpwRGJsb2NrcyA9ICh1MTYpcEJUSW5mby0+QnRBc29jRW50cnlbal0uTG9nTGlua0NtZERhdGFbaV0uVHhQYWNrZXRDb3VudDsKLQkJCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbal0uTG9nTGlua0NtZERhdGFbaV0uVHhQYWNrZXRDb3VudCkgewotCQkJCQlzZW50ID0gMTsKLQkJCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5UX0RFVEFJTCwKLQkJCQkJCSgiW0JUIGV2ZW50XSwgTnVtIE9mIENvbXBsZXRlZCBEYXRhQmxvY2tzLCBIYW5kbGUgPSAweCV4LCBOdW1fT2ZfQ29tcGxldGVkX1BhY2tldHMgPSAweCV4LCBOdW1fT2ZfQ29tcGxldGVkX0Jsb2NrcyA9IDB4JXhcbiIsCi0JCQkJCSpwSGFuZGxlLCAqcFBhY2tldHMsICpwRGJsb2NrcykpOwotCQkJCX0KLQkJCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtqXS5Mb2dMaW5rQ21kRGF0YVtpXS5UeFBhY2tldENvdW50ID0gMDsKLQkJCQlsZW4gKz0gNjsKLQkJCQlwVHJpcGxlICs9IGxlbjsKLQkJCX0KLQkJfQotCX0KLQotCXBSZXRQYXJbMl0gPSBoYW5kbGVOdW07CQkJCS8qICBOdW1iZXJfb2ZfSGFuZGxlcyAqLwotCWxlbiArPSAxOwotCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbMF07Ci0JKnB1MlRlbXAgPSBCVFRvdGFsRGF0YUJsb2NrTnVtOwotCWxlbiArPSAyOwotCi0JUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfTlVNX09GX0NPTVBMRVRFX0RBVEFfQkxPQ0tTOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCWlmIChoYW5kbGVOdW0gJiYgc2VudCkKLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci19Ci0KLXZvaWQgQlRIQ0lfRXZlbnRBTVBTdGF0dXNDaGFuZ2Uoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggQU1QX1N0YXR1cykKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0JdTggbGVuID0gMDsKLQl1OCBsb2NhbEJ1Zls3XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCi0JaWYgKEFNUF9TdGF0dXMgPT0gQU1QX1NUQVRVU19OT19DQVBBQ0lUWV9GT1JfQlQpIHsKLQkJcEJ0TWdudC0+QlROZWVkQU1QU3RhdHVzQ2hnID0gdHJ1ZTsKLQkJcEJ0TWdudC0+Yk5lZWROb3RpZnlBTVBOb0NhcCA9IGZhbHNlOwotCi0JCUJUSENJX0Rpc2Nvbm5lY3RBbGwocGFkYXB0ZXIpOwotCX0gZWxzZSBpZiAoQU1QX1N0YXR1cyA9PSBBTVBfU1RBVFVTX0ZVTExfQ0FQQUNJVFlfRk9SX0JUKSB7Ci0JCXBCdE1nbnQtPkJUTmVlZEFNUFN0YXR1c0NoZyA9IGZhbHNlOwotCX0KLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVswXTsKLQotCXBSZXRQYXJbMF0gPSAwOwkvKiAgU3RhdHVzICovCi0JbGVuICs9IDE7Ci0JcFJldFBhclsxXSA9IEFNUF9TdGF0dXM7CS8qICBBTVBfU3RhdHVzICovCi0JbGVuICs9IDE7Ci0KLQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9BTVBfU1RBVFVTX0NIQU5HRTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQlpZiAoYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMikgPT0gUlRfU1RBVFVTX1NVQ0NFU1MpCi0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfU1RBVEUpLCAoIltCVCBldmVudF0sIEFNUCBTdGF0dXMgQ2hhbmdlLCBBTVBfU3RhdHVzID0gJWRcbiIsIEFNUF9TdGF0dXMpKTsKLX0KLQotdm9pZCBCVEhDSV9EaXNjb25uZWN0QWxsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQl1OCBpOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIiBEaXNjb25uZWN0QUxMKClcbiIpKTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfQlRfQVNPQ19FTlRSWV9OVU07IGkrKykgewotCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbaV0uYjR3YXlTdWNjZXNzKSB7Ci0JCQlCVEhDSV9TTV9XSVRIX0lORk8ocGFkYXB0ZXIsIEhDSV9TVEFURV9DT05ORUNURUQsIFNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LLCBpKTsKLQkJfSBlbHNlIGlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5iVXNlZCkgewotCQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLkJ0Q3VycmVudFN0YXRlID09IEhDSV9TVEFURV9DT05ORUNUSU5HKSB7Ci0JCQkJQlRIQ0lfU01fV0lUSF9JTkZPKHBhZGFwdGVyLCBIQ0lfU1RBVEVfQ09OTkVDVElORywgU1RBVEVfQ01EX01BQ19DT05ORUNUX0NBTkNFTF9JTkRJQ0FURSwgaSk7Ci0JCQl9IGVsc2UgaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLkJ0Q3VycmVudFN0YXRlID09IEhDSV9TVEFURV9ESVNDT05ORUNUSU5HKSB7Ci0JCQkJQlRIQ0lfU01fV0lUSF9JTkZPKHBhZGFwdGVyLCBIQ0lfU1RBVEVfRElTQ09OTkVDVElORywgU1RBVEVfQ01EX01BQ19DT05ORUNUX0NBTkNFTF9JTkRJQ0FURSwgaSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLWVudW0gaGNpX3N0YXR1cwotQlRIQ0lfSGFuZGxlSENJQ01EKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiXG4iKSk7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTURfREVUQUlMfElPQ1RMX0JUX0xPR08pLCAoIkhDSSBDb21tYW5kIHN0YXJ0LCBPR0YgPSAweCV4LCBPQ0YgPSAweCV4LCBMZW5ndGggPSAweCV4XG4iLAotCQlwSGNpQ21kLT5PR0YsIHBIY2lDbWQtPk9DRiwgcEhjaUNtZC0+TGVuZ3RoKSk7Ci0JaWYgKHBIY2lDbWQtPkxlbmd0aCkgewotCQlSVFBSSU5UX0RBVEEoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwgIkhDSSBDb21tYW5kLCBIZXggRGF0YSA6XG4iLAotCQkJJnBIY2lDbWQtPkRhdGFbMF0sIHBIY2lDbWQtPkxlbmd0aCk7Ci0JfQotCWlmIChwSGNpQ21kLT5PR0YgPT0gT0dGX0VYVEVOU0lPTikgewotCQlpZiAocEhjaUNtZC0+T0NGID09IEhDSV9TRVRfUlNTSV9WQUxVRSkKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVF9QRVJJT0RJQ0FMLCAoIltCVCBjbWRdLCAiKSk7Ci0JCWVsc2UKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIltCVCBjbWRdLCAiKSk7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJbQlQgY21kXSwgIikpOwotCX0KLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnQrKzsKLQotCXN3aXRjaCAocEhjaUNtZC0+T0dGKSB7Ci0JY2FzZSBMSU5LX0NPTlRST0xfQ09NTUFORFM6Ci0JCXN0YXR1cyA9IGJ0aGNpX0hhbmRsZU9HRkxpbmtDb250cm9sQ01EKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIT0xEX01PREVfQ09NTUFORDoKLQkJYnJlYWs7Ci0JY2FzZSBPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORDoKLQkJc3RhdHVzID0gYnRoY2lfSGFuZGxlT0dGU2V0RXZlbnRNYXNrQ01EKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBPR0ZfSU5GT1JNQVRJT05BTF9QQVJBTUVURVJTOgotCQlzdGF0dXMgPSBidGhjaV9IYW5kbGVPR0ZJbmZvcm1hdGlvbmFsUGFyYW1ldGVycyhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgT0dGX1NUQVRVU19QQVJBTUVURVJTOgotCQlzdGF0dXMgPSBidGhjaV9IYW5kbGVPR0ZTdGF0dXNQYXJhbWV0ZXJzKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBPR0ZfVEVTVElOR19DT01NQU5EUzoKLQkJc3RhdHVzID0gYnRoY2lfSGFuZGxlT0dGVGVzdGluZ0NNRChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgT0dGX0VYVEVOU0lPTjoKLQkJc3RhdHVzID0gYnRoY2lfSGFuZGxlT0dGRXh0ZW5zaW9uKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0kgQ29tbWFuZCgpLCBVbmtub3duIE9HRiA9IDB4JXhcbiIsIHBIY2lDbWQtPk9HRikpOwotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9VTktOT1dOX0NPTU1BTkRcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfVW5rbm93bkNNRChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCX0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0RFVEFJTCwgKCJIQ0kgQ29tbWFuZCBleGVjdXRpb24gZW5kISFcbiIpKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgQ09NTU9NL2J0X2hjaS5jID09PT09ICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBCdFN0YXRlU3RyaW5nW10gPSB7Ci0JIkJUX0RJU0FCTEVEIiwKLQkiQlRfTk9fQ09OTkVDVElPTiIsCi0JIkJUX0NPTk5FQ1RfSURMRSIsCi0JIkJUX0lOUV9PUl9QQUciLAotCSJCVF9BQ0xfT05MWV9CVVNZIiwKLQkiQlRfU0NPX09OTFlfQlVTWSIsCi0JIkJUX0FDTF9TQ09fQlVTWSIsCi0JIkJUX0FDTF9JTlFfT1JfUEFHIiwKLQkiQlRfU1RBVEVfTk9UX0RFRklORUQiCi19OwotCi0vKiAgPT09PT0gQmVsb3cgdGhpcyBsaW5lIGlzIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjODcyMzFBbnQuYyA9PT09PSAqLwotCi1zdGF0aWMgdm9pZCBidGRtX1NldEZ3SWdub3JlV2xhbkFjdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiRW5hYmxlKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXU4IEgyQ19QYXJhbWV0ZXJbMV0gPSB7MH07Ci0KLQlpZiAoYkVuYWJsZSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEJUIElnbm9yZSBXbGFuX0FjdCAhIVxuIikpOwotCQlIMkNfUGFyYW1ldGVyWzBdIHw9IEJJVCgwKTsJCS8qICBmdW5jdGlvbiBlbmFibGUgKi8KLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkZXQ29leGlzdEFsbE9mZiA9IGZhbHNlOwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQlQgZG9uJ3QgaWdub3JlIFdsYW5fQWN0ICEhXG4iKSk7Ci0JfQotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBzZXQgRlcgZm9yIEJUIElnbm9yZSBXbGFuX0FjdCwgd3JpdGUgMHgyNSA9IDB4JTAyeFxuIiwKLQkJSDJDX1BhcmFtZXRlclswXSkpOwotCi0JRmlsbEgyQ0NtZChwYWRhcHRlciwgQlRfSUdOT1JFX1dMQU5fQUNUX0VJRCwgMSwgSDJDX1BhcmFtZXRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fTm90aWZ5RndTY2FuKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHNjYW5UeXBlKQotewotCXU4IEgyQ19QYXJhbWV0ZXJbMV0gPSB7MH07Ci0KLQlpZiAoc2NhblR5cGUgPT0gdHJ1ZSkKLQkJSDJDX1BhcmFtZXRlclswXSA9IDB4MTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgTm90aWZ5IEZXIGZvciB3aWZpIHNjYW4sIHdyaXRlIDB4M2IgPSAweCUwMnhcbiIsCi0JCUgyQ19QYXJhbWV0ZXJbMF0pKTsKLQotCUZpbGxIMkNDbWQocGFkYXB0ZXIsIDB4M2IsIDEsIEgyQ19QYXJhbWV0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBidGRtXzFBbnRTZXRQU01vZGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgICB1OCBlbmFibGUsIHU4IHNtYXJ0cHMsIHU4IG1vZGUpCi17Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybDsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQ3VycmVudCBMUFMoJXMsICVkKSwgc21hcnRwcyA9JWRcbiIsIGVuYWJsZSA9PSB0cnVlPyJPTiI6Ik9GRiIsIG1vZGUsIHNtYXJ0cHMpKTsKLQotCXB3cmN0cmwgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCi0JaWYgKGVuYWJsZSA9PSB0cnVlKSB7Ci0JCXJ0d19zZXRfcHNfbW9kZTIzYShwYWRhcHRlciwgUFNfTU9ERV9NSU4sIHNtYXJ0cHMsIG1vZGUpOwotCX0gZWxzZSB7Ci0JCXJ0d19zZXRfcHNfbW9kZTIzYShwYWRhcHRlciwgUFNfTU9ERV9BQ1RJVkUsIDAsIDApOwotCQlMUFNfUkZfT05fY2hlY2syM2EocGFkYXB0ZXIsIDEwMCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBidGRtXzFBbnRUU0ZTd2l0Y2goc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggZW5hYmxlKQotewotCXU4IG9sZFZhbCwgbmV3VmFsOwotCi0Jb2xkVmFsID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCAweDU1MCk7Ci0KLQlpZiAoZW5hYmxlKQotCQluZXdWYWwgPSBvbGRWYWwgfCBFTl9CQ05fRlVOQ1RJT047Ci0JZWxzZQotCQluZXdWYWwgPSBvbGRWYWwgJiB+RU5fQkNOX0ZVTkNUSU9OOwotCi0JaWYgKG9sZFZhbCAhPSBuZXdWYWwpCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIDB4NTUwLCBuZXdWYWwpOwotfQotCi1zdGF0aWMgdTggYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidGRtXzg3MjNhXzFhbnQgKnBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudDsKLQotCWlmICgocEJ0ZG04NzIzLT5iUHJlUHNUZG1hT24gIT0gcEJ0ZG04NzIzLT5iQ3VyUHNUZG1hT24pIHx8Ci0JCShwQnRkbTg3MjMtPnByZVBzVGRtYSAhPSBwQnRkbTg3MjMtPmN1clBzVGRtYSkpCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi0vKiAgQmVmb3JlIGVudGVyIFRETUEsIG1ha2Ugc3VyZSBQb3dlciBTYXZpbmcgaXMgZW5hYmxlISAqLwotc3RhdGljIHZvaWQKLWJ0ZG1fMUFudFBzVGRtYSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXU4IGJUdXJuT24sCi0JdTggdHlwZQotCSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8xYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTFBbnQ7Ci0KLQlwQnRkbTg3MjMtPmJDdXJQc1RkbWFPbiA9IGJUdXJuT247Ci0JcEJ0ZG04NzIzLT5jdXJQc1RkbWEgPSB0eXBlOwotCWlmIChiVHVybk9uKSB7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIDE6CS8qICBBMkRQIExldmVsLTEgb3IgRlRQL09QUCAqLwotCQlkZWZhdWx0OgotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKSB7Ci0JCQkJLyogIHdpZGUgZHVyYXRpb24gZm9yIFdpRmkgKi8KLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4ZDMsIDB4MWEsIDB4MWEsIDB4MCwgMHg1OCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAyOgkvKiAgQTJEUCBMZXZlbC0yICovCi0JCQlpZiAoYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShwYWRhcHRlcikpIHsKLQkJCQkvKiAgbm9ybWFsIGR1cmF0aW9uIGZvciBXaUZpICovCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweGQzLCAweDEyLCAweDEyLCAweDAsIDB4NTgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMzoJLyogIEJUIEZUUC9PUFAgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkgewotCQkJCS8qICBub3JtYWwgZHVyYXRpb24gZm9yIFdpRmkgKi8KLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4ZDMsIDB4MzAsIDB4MDMsIDB4MTAsIDB4NTgpOwotCi0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSA0OgkvKiAgZm9yIHdpZmkgc2NhbiAmIEJUIGlzIGNvbm5lY3RlZCAqLwotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKSB7Ci0JCQkJLyogIHByb3RlY3QgMyBiZWFjb25zIGluIDMtYmVhY29uIHBlcmlvZCAmIG5vIFR4IHBhdXNlIGF0IEJUIHNsb3QgKi8KLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4OTMsIDB4MTUsIDB4MDMsIDB4MTQsIDB4MCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSA1OgkvKiAgZm9yIFdpRmkgY29ubmVjdGVkLWJ1c3kgJiBCVCBpcyBOb24tQ29ubmVjdGVkLUlkbGUgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkgewotCQkJCS8qICBTQ08gbW9kZSwgQW50IGZpeGVkIGF0IFdpRmksIFdMQU5fQWN0IHRvZ2dsZSAqLwotCQkJCUJURE1fU2V0RnczYShwYWRhcHRlciwgMHg2MSwgMHgxNSwgMHgwMywgMHgzMSwgMHgwMCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSA5OgkvKiAgQUNMIGhpZ2gtcmV0cnkgdHlwZSAtIDIgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkgewotCQkJCS8qICBuYXJyb3cgZHVyYXRpb24gZm9yIFdpRmkgKi8KLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4ZDMsIDB4YSwgMHhhLCAweDAsIDB4NTgpOyAvKiBuYXJyb3cgZHVyYXRpb24gZm9yIFdpRmkgKi8KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDEwOiAvKiAgZm9yIFdpRmkgY29ubmVjdCBpZGxlICYgQlQgQUNMIGJ1c3kgb3IgV2lGaSBDb25uZWN0ZWQtQnVzeSAmIEJUIGlzIElucXVpcnkgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkKLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4MTMsIDB4YSwgMHhhLCAweDAsIDB4NDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTE6IC8qICBBQ0wgaGlnaC1yZXRyeSB0eXBlIC0gMyAqLwotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKSB7Ci0JCQkJLyogIG5hcnJvdyBkdXJhdGlvbiBmb3IgV2lGaSAqLwotCQkJCUJURE1fU2V0RnczYShwYWRhcHRlciwgMHhkMywgMHgwNSwgMHgwNSwgMHgwMCwgMHg1OCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAxMjogLyogIGZvciBXaUZpIENvbm5lY3RlZC1CdXN5ICYgQlQgaXMgQ29ubmVjdGVkLUlkbGUgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkgewotCQkJCS8qICBBbGxvdyBIaWdoLVByaSBCVCAqLwotCQkJCUJURE1fU2V0RnczYShwYWRhcHRlciwgMHhlYiwgMHgwYSwgMHgwMywgMHgzMSwgMHgxOCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAyMDogLyogIFdpRmkgb25seSBidXN5ICwgVERNQSBtb2RlIGZvciBwb3dlciBzYXZpbmcgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkKLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4MTMsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjc6IC8qICBXaUZpIERIQ1AvU2l0ZSBTdXJ2ZXkgJiBCVCBTQ08gYnVzeSAqLwotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKQotCQkJCUJURE1fU2V0RnczYShwYWRhcHRlciwgMHhhMywgMHgyNSwgMHgwMywgMHgzMSwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSAyODogLyogIFdpRmkgREhDUC9TaXRlIFN1cnZleSAmIEJUIGlkbGUgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkKLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4NjksIDB4MjUsIDB4MDMsIDB4MzEsIDB4MDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjk6IC8qICBXaUZpIERIQ1AvU2l0ZSBTdXJ2ZXkgJiBCVCBBQ0wgYnVzeSAqLwotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKSB7Ci0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweGViLCAweDFhLCAweDFhLCAweDAxLCAweDE4KTsKLQkJCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg2YzAsIDB4NWFmYTVhZmEpOwotCQkJCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDZjNCwgMHg1YWZhNWFmYSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAzMDogLyogIFdpRmkgaWRsZSAmIEJUIElucXVpcnkgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkKLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4OTMsIDB4MTUsIDB4MDMsIDB4MTQsIDB4MDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzE6ICAvKiAgQlQgSElEICovCi0JCQlpZiAoYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShwYWRhcHRlcikpCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweGQzLCAweDFhLCAweDFhLCAweDAwLCAweDU4KTsKLQkJCWJyZWFrOwotCQljYXNlIDMyOiAgLyogIEJUIFNDTyAmIElucXVpcnkgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkKLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4YWIsIDB4MGEsIDB4MDMsIDB4MTEsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzM6ICAvKiAgQlQgU0NPICYgV2lGaSBzaXRlIHN1cnZleSAqLwotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKQotCQkJCUJURE1fU2V0RnczYShwYWRhcHRlciwgMHhhMywgMHgyNSwgMHgwMywgMHgzMCwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSAzNDogIC8qICBCVCBISUQgJiBXaUZpIHNpdGUgc3VydmV5ICovCi0JCQlpZiAoYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShwYWRhcHRlcikpCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweGQzLCAweDFhLCAweDFhLCAweDAwLCAweDE4KTsKLQkJCWJyZWFrOwotCQljYXNlIDM1OiAgLyogIEJUIEhJRCAmIFdpRmkgQ29ubmVjdGluZyAqLwotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKQotCQkJCUJURE1fU2V0RnczYShwYWRhcHRlciwgMHhlMywgMHgxYSwgMHgxYSwgMHgwMCwgMHgxOCk7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qICBkaXNhYmxlIFBTLVRETUEgKi8KLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgODoKLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkgewotCQkJCS8qICBBbnRlbm5hIGNvbnRyb2wgYnkgUFRBLCAweDg3MCA9IDB4MzEwICovCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweDgsIDB4MCwgMHgwLCAweDAsIDB4MCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAwOgotCQlkZWZhdWx0OgotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKSB7Ci0JCQkJLyogIEFudGVubmEgY29udHJvbCBieSBQVEEsIDB4ODcwID0gMHgzMTAgKi8KLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4MCwgMHgwLCAweDAsIDB4OCwgMHgwKTsKLQkJCX0KLQkJCS8qICBTd2l0Y2ggQW50ZW5uYSB0byBCVCAqLwotCQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIDB4ODYwLCAweDIxMCk7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIDB4ODYwID0gMHgyMTAsIFN3aXRjaCBBbnRlbm5hIHRvIEJUXG4iKSk7Ci0JCQlicmVhazsKLQkJY2FzZSA5OgotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKSB7Ci0JCQkJLyogIEFudGVubmEgY29udHJvbCBieSBQVEEsIDB4ODcwID0gMHgzMTAgKi8KLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4MCwgMHgwLCAweDAsIDB4OCwgMHgwKTsKLQkJCX0KLQkJCS8qICBTd2l0Y2ggQW50ZW5uYSB0byBXaUZpICovCi0JCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgMHg4NjAsIDB4MTEwKTsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgMHg4NjAgPSAweDExMCwgU3dpdGNoIEFudGVubmEgdG8gV2lGaVxuIikpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEN1cnJlbnQgVERNQSglcywgJWQpXG4iLAotCQlwQnRkbTg3MjMtPmJDdXJQc1RkbWFPbj8iT04iOiJPRkYiLCBwQnRkbTg3MjMtPmN1clBzVGRtYSkpOwotCi0JLyogIHVwZGF0ZSBwcmUgc3RhdGUgKi8KLQlwQnRkbTg3MjMtPmJQcmVQc1RkbWFPbiA9IHBCdGRtODcyMy0+YkN1clBzVGRtYU9uOwotCXBCdGRtODcyMy0+cHJlUHNUZG1hID0gcEJ0ZG04NzIzLT5jdXJQc1RkbWE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1fYnRkbV8xQW50U2V0UFNURE1BKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJQU0VuLCB1OCBzbWFydHBzLAotCQkgICAgdTggcHNPcHRpb24sIHU4IGJURE1BT24sIHU4IHRkbWFUeXBlKQotewotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cmN0cmw7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8xYW50ICpwQnRkbTg3MjM7Ci0JdTggcHNNb2RlOwotCXU4IGJTd2l0Y2hQUzsKLQotCWlmICghY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpICYmCi0JICAgIChnZXRfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2KSAhPSBXSUZJX05VTExfU1RBVEUpKSB7Ci0JCWJ0ZG1fMUFudFBzVGRtYShwYWRhcHRlciwgYlRETUFPbiwgdGRtYVR5cGUpOwotCQlyZXR1cm47Ci0JfQotCXBzT3B0aW9uICY9IH5CSVQoMCk7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCSgiW0JUQ29leF0sIFNldCBMUFMoJXMsICVkKSBURE1BKCVzLCAlZClcbiIsCi0JCWJQU0VuID09IHRydWU/Ik9OIjoiT0ZGIiwgcHNPcHRpb24sCi0JCWJURE1BT24gPT0gdHJ1ZT8iT04iOiJPRkYiLCB0ZG1hVHlwZSkpOwotCi0JcHdyY3RybCA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudDsKLQotCWlmIChiUFNFbikgewotCQlpZiAocEJ0ZG04NzIzLT5iV2lGaUhhbHQpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRW5hYmxlIFBTIEZhaWwsIFdpRmkgaW4gSGFsdCEhXG4iKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAocHdyY3RybC0+YkluU3VzcGVuZCkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBFbmFibGUgUFMgRmFpbCwgV2lGaSBpbiBTdXNwZW5kISFcbiIpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRW5hYmxlIFBTIEZhaWwsIFdpRmkgZHJpdmVyIHN0b3BwZWQhIVxuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVuYWJsZSBQUyBGYWlsLCBXaUZpIFN1cnByaXNlIFJlbW92ZWQhIVxuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcHNNb2RlID0gUFNfTU9ERV9NSU47Ci0JfSBlbHNlIHsKLQkJcHNNb2RlID0gUFNfTU9ERV9BQ1RJVkU7Ci0JCXBzT3B0aW9uID0gMDsKLQl9Ci0KLQlpZiAocHNNb2RlICE9IHB3cmN0cmwtPnB3cl9tb2RlKSB7Ci0JCWJTd2l0Y2hQUyA9IHRydWU7Ci0JfSBlbHNlIGlmIChwc01vZGUgIT0gUFNfTU9ERV9BQ1RJVkUpIHsKLQkJaWYgKHBzT3B0aW9uICE9IHB3cmN0cmwtPmJjbl9hbnRfbW9kZSkKLQkJCWJTd2l0Y2hQUyA9IHRydWU7Ci0JCWVsc2UgaWYgKHNtYXJ0cHMgIT0gcHdyY3RybC0+c21hcnRfcHMpCi0JCQliU3dpdGNoUFMgPSB0cnVlOwotCQllbHNlCi0JCQliU3dpdGNoUFMgPSBmYWxzZTsKLQl9IGVsc2UgewotCQliU3dpdGNoUFMgPSBmYWxzZTsKLQl9Ci0KLQlpZiAoYlN3aXRjaFBTKSB7Ci0JCS8qICBkaXNhYmxlIFRETUEgKi8KLQkJaWYgKHBCdGRtODcyMy0+YkN1clBzVGRtYU9uKSB7Ci0JCQlpZiAoIWJURE1BT24pIHsKLQkJCQlidGRtXzFBbnRQc1RkbWEocGFkYXB0ZXIsIGZhbHNlLCB0ZG1hVHlwZSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghcnRsODcyM2FfQlRfZW5hYmxlZChwYWRhcHRlcikgfHwKLQkJCQkgICAgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmMyaEJ0SW5mbyA9PSBCVF9JTkZPX1NUQVRFX05PX0NPTk5FQ1RJT04pIHx8Ci0JCQkJICAgIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5jMmhCdEluZm8gPT0gQlRfSU5GT19TVEFURV9DT05ORUNUX0lETEUpIHx8Ci0JCQkJICAgICh0ZG1hVHlwZSA9PSAyOSkpCi0JCQkJCWJ0ZG1fMUFudFBzVGRtYShwYWRhcHRlciwgZmFsc2UsIDkpOwotCQkJCWVsc2UKLQkJCQkJYnRkbV8xQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgMCk7Ci0JCQl9Ci0JCX0KLQotCQkvKiAgY2hhbmdlIFBvd2VyIFNhdmUgU3RhdGUgKi8KLQkJYnRkbV8xQW50U2V0UFNNb2RlKHBhZGFwdGVyLCBiUFNFbiwgc21hcnRwcywgcHNPcHRpb24pOwotCX0KLQotCWJ0ZG1fMUFudFBzVGRtYShwYWRhcHRlciwgYlRETUFPbiwgdGRtYVR5cGUpOwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV8xQW50U2V0UFNURE1BKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJQU0VuLAotCQkgICB1OCBwc09wdGlvbiwgdTggYlRETUFPbiwgdTggdGRtYVR5cGUpCi17Ci0JX2J0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgYlBTRW4sIDAsIHBzT3B0aW9uLCBiVERNQU9uLCB0ZG1hVHlwZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMUFudFdpZmlQYXJhQWRqdXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJFbmFibGUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMWFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0xQW50OwotCi0JaWYgKGJFbmFibGUpIHsKLQkJcEJ0ZG04NzIzLT5jdXJXaWZpUGFyYSA9IDE7Ci0JCWlmIChwQnRkbTg3MjMtPnByZVdpZmlQYXJhICE9IHBCdGRtODcyMy0+Y3VyV2lmaVBhcmEpCi0JCQlCVERNX1NldFN3UGVuYWx0eVR4UmF0ZUFkYXB0aXZlKHBhZGFwdGVyLCBCVF9UWF9SQVRFX0FEQVBUSVZFX0xPV19QRU5BTFRZKTsKLQl9IGVsc2UgewotCQlwQnRkbTg3MjMtPmN1cldpZmlQYXJhID0gMjsKLQkJaWYgKHBCdGRtODcyMy0+cHJlV2lmaVBhcmEgIT0gcEJ0ZG04NzIzLT5jdXJXaWZpUGFyYSkKLQkJCUJURE1fU2V0U3dQZW5hbHR5VHhSYXRlQWRhcHRpdmUocGFkYXB0ZXIsIEJUX1RYX1JBVEVfQURBUFRJVkVfTk9STUFMKTsKLQl9Ci0KLX0KLQotc3RhdGljIHZvaWQgYnRkbV8xQW50UHRhUGFyYVJlbG9hZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCS8qICBQVEEgcGFyYW1ldGVyICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgMHg2Y2MsIDB4MCk7CQkvKiAgMS1BbnQgY29leCAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDZjOCwgMHhmZmZmKTsJLyogIHdpZmkgYnJlYWsgdGFibGUgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg2YzQsIDB4NTU1NTU1NTUpOwkvKiAgY29leCB0YWJsZSAqLwotCi0JLyogIEFudGVubmEgc3dpdGNoIGNvbnRyb2wgcGFyYW1ldGVyICovCi0JcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIDB4ODU4LCAweGFhYWFhYWFhKTsKLQlpZiAoSVNfODcyM0FfQV9DVVQoR0VUX0hBTF9EQVRBKHBhZGFwdGVyKS0+VmVyc2lvbklEKSkgewotCQkvKiAgU1BEVChjb25uZWN0ZWQgd2l0aCBUUlNXKSBjb250cm9sIGJ5IGhhcmR3YXJlIFBUQSAqLwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg4NzAsIDB4MCk7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIDB4NDAsIDB4MjQpOwotCX0gZWxzZSB7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIDB4NDAsIDB4MjApOwotCQkvKiAgc2V0IGFudGVubmEgYXQgYnQgc2lkZSBpZiBBTlRTVyBpcyBzb2Z0d2FyZSBjb250cm9sICovCi0JCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCAweDg2MCwgMHgyMTApOwotCQkvKiAgU1BEVChjb25uZWN0ZWQgd2l0aCBUUlNXKSBjb250cm9sIGJ5IGhhcmR3YXJlIFBUQSAqLwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg4NzAsIDB4MzAwKTsKLQkJLyogIEFOVFNXIGtlZXAgYnkgR05UX0JUICovCi0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDg3NCwgMHgyMjgwNDAwMCk7Ci0JfQotCi0JLyogIGNvZXhpc3RlbmNlIHBhcmFtZXRlcnMgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDc3OCwgMHgxKTsJLyogIGVuYWJsZSBSVEsgbW9kZSBQVEEgKi8KLQotCS8qICBCVCBkb24ndCBpZ25vcmUgV0xBTl9BY3QgKi8KLQlidGRtX1NldEZ3SWdub3JlV2xhbkFjdChwYWRhcHRlciwgZmFsc2UpOwotfQotCi0vKgotICogUmV0dXJuCi0gKjE6IHVwZ3JhZGUgKGFkZCBXaUZpIGR1cmF0aW9uIHRpbWUpCi0gKjA6IGtlZXAKLSAqLTE6IGRvd25ncmFkZSAoYWRkIEJUIGR1cmF0aW9uIHRpbWUpCi0gKi8KLXN0YXRpYyBzOCBidGRtXzFBbnRUZG1hSnVkZ2VtZW50KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHJldHJ5KQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMWFudCAqcEJ0ZG04NzIzOwotCXN0YXRpYyBzOCB1cCwgZG4sIG0gPSAxLCBXYWl0Q291bnQ7Ci0JczggcmV0OwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudDsKLQlyZXQgPSAwOwotCi0JaWYgKHBCdGRtODcyMy0+cHNUZG1hTW9uaXRvckNudCA9PSAwKSB7Ci0JCXVwID0gMDsKLQkJZG4gPSAwOwotCQltID0gMTsKLQkJV2FpdENvdW50ID0gMDsKLQl9IGVsc2UgewotCQlXYWl0Q291bnQrKzsKLQl9Ci0KLQlpZiAocmV0cnkgPT0gMCkgewotCS8qICBubyByZXRyeSBpbiB0aGUgbGFzdCAyLXNlY29uZCBkdXJhdGlvbiAqLwotCQl1cCsrOwotCQlkbi0tOwotCQlpZiAoZG4gPCAwKQotCQkJZG4gPSAwOwotCQlpZiAodXAgPj0gMyptKSB7Ci0JCQkvKiAgcmV0cnkgPSAwIGluIGNvbnNlY3V0aXZlIDNtKigycyksIGFkZCBXaUZpIGR1cmF0aW9uICovCi0JCQlyZXQgPSAxOwotCQkJdXAgPSAwOwotCQkJZG4gPSAwOwotCQkJV2FpdENvdW50ID0gMDsKLQkJfQotCX0gZWxzZSBpZiAocmV0cnkgPD0gMykgewotCQkvKiAgcmV0cnk8PSAzIGluIHRoZSBsYXN0IDItc2Vjb25kIGR1cmF0aW9uICovCi0JCXVwLS07Ci0JCWRuKys7Ci0JCWlmICh1cCA8IDApCi0JCQl1cCA9IDA7Ci0KLQkJaWYgKGRuID09IDIpIHsKLQkJCS8qICByZXRyeTw9IDMgaW4gY29uc2VjdXRpdmUgMiooMnMpLCBtaW51cyBXaUZpIGR1cmF0aW9uIChhZGQgQlQgZHVyYXRpb24pICovCi0JCQlyZXQgPSAtMTsKLQotCQkJLyogIHJlY29yZCBob3cgbWFueSB0aW1lIGRvd25ncmFkIFdpRmkgZHVyYXRpb24gKi8KLQkJCWlmIChXYWl0Q291bnQgPD0gMikKLQkJCQltKys7Ci0JCQllbHNlCi0JCQkJbSA9IDE7Ci0JCQkvKiAgdGhlIG1heCBudW1iZXIgb2YgbSBpcyAyMCAqLwotCQkJLyogIHRoZSBsb25nZXN0IHRpbWUgb2YgdXBncmFkZSBXaUZpIGR1cmF0aW9uIGlzIDIwKjMqMnMgPSAxMjBzICovCi0JCQlpZiAobSA+PSAyMCkKLQkJCQltID0gMjA7Ci0JCQl1cCA9IDA7Ci0JCQlkbiA9IDA7Ci0JCQlXYWl0Q291bnQgPSAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogIHJldHJ5IGNvdW50ID4gMyAqLwotCQkvKiAgcmV0cnk+MywgbWludXMgV2lGaSBkdXJhdGlvbiAoYWRkIEJUIGR1cmF0aW9uKSAqLwotCQlyZXQgPSAtMTsKLQotCQkvKiAgcmVjb3JkIGhvdyBtYW55IHRpbWUgZG93bmdyYWQgV2lGaSBkdXJhdGlvbiAqLwotCQlpZiAoV2FpdENvdW50ID09IDEpCi0JCQltKys7Ci0JCWVsc2UKLQkJCW0gPSAxOwotCQlpZiAobSA+PSAyMCkKLQkJCW0gPSAyMDsKLQotCQl1cCA9IDA7Ci0JCWRuID0gMDsKLQkJV2FpdENvdW50ID0gMDsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgYnRkbV8xQW50VGRtYUR1cmF0aW9uQWRqdXN0Rm9yQUNMKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMWFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0xQW50OwotCi0JaWYgKHBCdGRtODcyMy0+cHNUZG1hR2xvYmFsQ250ICE9IHBCdGRtODcyMy0+cHNUZG1hTW9uaXRvckNudCkgewotCQlwQnRkbTg3MjMtPnBzVGRtYU1vbml0b3JDbnQgPSAwOwotCQlwQnRkbTg3MjMtPnBzVGRtYUdsb2JhbENudCA9IDA7Ci0JfQotCWlmIChwQnRkbTg3MjMtPnBzVGRtYU1vbml0b3JDbnQgPT0gMCkgewotCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsIHRydWUsIDIpOwotCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDI7Ci0JfSBlbHNlIHsKLQkJLyogIE5vdyB3ZSBvbmx5IGhhdmUgNCBsZXZlbCBQcyBUZG1hLCAqLwotCQkvKiAgaWYgdGhhdCdzIG5vdCB0aGUgZm9sbG93aW5nIDQgbGV2ZWwod2lsbCBjaGFuZ2VkIGJ5IHdpZmkgc2NhbiwgZGhjcC4uLiksICovCi0JCS8qICB0aGVuIHdlIGhhdmUgdG8gYWRqdXN0IGl0IGJhY2sgdG8gdGhlIHByZXZpb3VzIHJlY29yZCBvbmUuICovCi0JCWlmICgocEJ0ZG04NzIzLT5jdXJQc1RkbWEgIT0gMSkgJiYKLQkJICAgIChwQnRkbTg3MjMtPmN1clBzVGRtYSAhPSAyKSAmJgotCQkgICAgKHBCdGRtODcyMy0+Y3VyUHNUZG1hICE9IDkpICYmCi0JCSAgICAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgIT0gMTEpKSB7Ci0JCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsIHRydWUsIHBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlKTsKLQkJfSBlbHNlIHsKLQkJCXMzMiBqdWRnZTsKLQotCQkJanVkZ2UgPSBidGRtXzFBbnRUZG1hSnVkZ2VtZW50KHBhZGFwdGVyLCBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idFJldHJ5Q250KTsKLQkJCWlmIChqdWRnZSA9PSAtMSkgewotCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxKSB7Ci0JCQkJCS8qICBEZWNyZWFzZSBXaUZpIGR1cmF0aW9uIGZvciBoaWdoIEJUIHJldHJ5ICovCi0JCQkJCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idEluZm9FeHQpCi0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDk7Ci0JCQkJCWVsc2UKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMjsKLQkJCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCB0cnVlLCAwLCB0cnVlLCBwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSk7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAyKSB7Ci0JCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwgdHJ1ZSwgOSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gOTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDkpIHsKLQkJCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCB0cnVlLCAwLCB0cnVlLCAxMSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChqdWRnZSA9PSAxKSB7Ci0JCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDExKSB7Ci0JCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwgdHJ1ZSwgOSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gOTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDkpIHsKLQkJCQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5mb0V4dCkKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gOTsKLQkJCQkJZWxzZQotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAyOwotCQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsIHRydWUsIHBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlKTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDIpIHsKLQkJCQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5mb0V4dCkKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gOTsKLQkJCQkJZWxzZQotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxOwotCQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsIHRydWUsIHBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJKCJbQlRDb2V4XSwgQUNMIGN1cnJlbnQgVERNQSglcywgJWQpXG4iLAotCQkJKHBCdGRtODcyMy0+YkN1clBzVGRtYU9uID8gIk9OIiA6ICJPRkYiKSwgcEJ0ZG04NzIzLT5jdXJQc1RkbWEpKTsKLQl9Ci0JcEJ0ZG04NzIzLT5wc1RkbWFNb25pdG9yQ250Kys7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMUFudENvZXhQcm9jZXNzRm9yV2lmaUNvbm5lY3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXY7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgYnRfY29leGlzdF84NzIzYSAqcEJ0Q29leDsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8xYW50ICpwQnRkbTg3MjM7Ci0JdTggQnRTdGF0ZTsKLQotCXBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0JcEJ0ZG04NzIzID0gJnBCdENvZXgtPmJ0ZG0xQW50OwotCUJ0U3RhdGUgPSBwQnRDb2V4LT5jMmhCdEluZm87Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFdpRmkgaXMgJXNcbiIsCi0JCQkJQlRETV9Jc1dpZmlCdXN5KHBhZGFwdGVyKT8iQnVzeSI6IklETEUiKSk7Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBCVCBpcyAlc1xuIiwKLQkJCQlCdFN0YXRlU3RyaW5nW0J0U3RhdGVdKSk7Ci0KLQlwYWRhcHRlci0+cHdyY3RybHByaXYuYnRjb2V4X3Jmb24gPSBmYWxzZTsKLQotCWlmICghQlRETV9Jc1dpZmlCdXN5KHBhZGFwdGVyKSAmJgotCSAgICAhY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSAmJgotCSAgICAoQnRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX05PX0NPTk5FQ1RJT04gfHwKLQkgICAgIEJ0U3RhdGUgPT0gQlRfSU5GT19TVEFURV9DT05ORUNUX0lETEUpKSB7Ci0JCXN3aXRjaCAoQnRTdGF0ZSkgewotCQljYXNlIEJUX0lORk9fU1RBVEVfTk9fQ09OTkVDVElPTjoKLQkJCV9idGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDIsIDB4MjYsIGZhbHNlLCA5KTsKLQkJCWJyZWFrOwotCQljYXNlIEJUX0lORk9fU1RBVEVfQ09OTkVDVF9JRExFOgotCQkJX2J0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMiwgMHgyNiwgZmFsc2UsIDApOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlzd2l0Y2ggKEJ0U3RhdGUpIHsKLQkJY2FzZSBCVF9JTkZPX1NUQVRFX05PX0NPTk5FQ1RJT046Ci0JCWNhc2UgQlRfSU5GT19TVEFURV9DT05ORUNUX0lETEU6Ci0JCQkvKiAgV2lGaSBpcyBCdXN5ICovCi0JCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGZhbHNlLCAwLCB0cnVlLCA1KTsKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDZjMCwgMHg1YTVhNWE1YSk7Ci0JCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg2YzQsIDB4NWE1YTVhNWEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQlRfSU5GT19TVEFURV9BQ0xfSU5RX09SX1BBRzoKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCQkoIltCVENvZXhdLCBCVCBQUk9GSUxFIGlzICIKLQkJCQkgIkJUX0lORk9fU1RBVEVfQUNMX0lOUV9PUl9QQUdcbiIpKTsKLQkJY2FzZSBCVF9JTkZPX1NUQVRFX0lOUV9PUl9QQUc6Ci0JCQlwYWRhcHRlci0+cHdyY3RybHByaXYuYnRjb2V4X3Jmb24gPSB0cnVlOwotCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCB0cnVlLCAwLCB0cnVlLCAzMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBCVF9JTkZPX1NUQVRFX1NDT19PTkxZX0JVU1k6Ci0JCWNhc2UgQlRfSU5GT19TVEFURV9BQ0xfU0NPX0JVU1k6Ci0JCQlpZiAodHJ1ZSA9PSBwQnRDb2V4LT5iQzJoQnRJbnF1aXJ5UGFnZSkKLQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGZhbHNlLCAwLAotCQkJCQkJICAgdHJ1ZSwgMzIpOwotCQkJZWxzZSB7Ci0jaWZkZWYgQlRDT0VYX0NNQ0NfVEVTVAotCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgZmFsc2UsIDAsCi0JCQkJCQkgICB0cnVlLCAyMyk7Ci0jZWxzZSAvKiAgIUJUQ09FWF9DTUNDX1RFU1QgKi8KLQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGZhbHNlLCAwLAotCQkJCQkJICAgZmFsc2UsIDgpOwotCQkJCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDZjMCwgMHg1YTVhNWE1YSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIDB4NmM0LCAweDVhNWE1YTVhKTsKLSNlbmRpZiAvKiAgIUJUQ09FWF9DTUNDX1RFU1QgKi8KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEJUX0lORk9fU1RBVEVfQUNMX09OTFlfQlVTWToKLQkJCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5idGNvZXhfcmZvbiA9IHRydWU7Ci0JCQlpZiAocEJ0Q29leC0+YzJoQnRQcm9maWxlID09IEJUX0lORk9fSElEKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJCQkoIltCVENvZXhdLCBCVCBQUk9GSUxFIGlzIEhJRFxuIikpOwotCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwgdHJ1ZSwgMzEpOwotCQkJfSBlbHNlIGlmIChwQnRDb2V4LT5jMmhCdFByb2ZpbGUgPT0gQlRfSU5GT19GVFApIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkJCSgiW0JUQ29leF0sIEJUIFBST0ZJTEUgaXMgRlRQL09QUFxuIikpOwotCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwgdHJ1ZSwgMyk7Ci0JCQl9IGVsc2UgaWYgKHBCdENvZXgtPmMyaEJ0UHJvZmlsZSA9PSAoQlRfSU5GT19BMkRQfEJUX0lORk9fRlRQKSkgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCQkJKCJbQlRDb2V4XSwgQlQgUFJPRklMRSBpcyBBMkRQX0ZUUFxuIikpOwotCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwgdHJ1ZSwgMTEpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocEJ0Q29leC0+YzJoQnRQcm9maWxlID09IEJUX0lORk9fQTJEUCkKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJCQkJKCJbQlRDb2V4XSwgQlQgUFJPRklMRSBpcyAiCi0JCQkJCQkgIkEyRFBcbiIpKTsKLQkJCQllbHNlCi0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCQkJCSgiW0JUQ29leF0sIEJUIFBST0ZJTEUgaXMgIgotCQkJCQkJICJVTktOT1dOKDB4JTAyWCkhIFVzZSBBMkRQICIKLQkJCQkJCSAiUHJvZmlsZVxuIiwKLQkJCQkJCSBwQnRDb2V4LT5jMmhCdFByb2ZpbGUpKTsKLQkJCQlidGRtXzFBbnRUZG1hRHVyYXRpb25BZGp1c3RGb3JBQ0wocGFkYXB0ZXIpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwQnRkbTg3MjMtPnBzVGRtYUdsb2JhbENudCsrOwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV8xQW50VXBkYXRlSGFsUkFNYXNrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBtYWNfaWQsIHUzMiBmaWx0ZXIpCi17Ci0JdTggaW5pdF9yYXRlID0gMDsKLQl1OCByYWlkLCBhcmc7Ci0JdTMyIG1hc2s7Ci0JdTggc2hvcnRHSXJhdGUgPSBmYWxzZTsKLQlpbnQgc3VwcG9ydFJhdGVOdW0gPSAwOwotCXN0cnVjdCBzdGFfaW5mbwkqcHN0YTsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBkbV9wcml2ICpwZG1wcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dDsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yazsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgJXMsIE1BQ0lEID0lZCwgZmlsdGVyID0gMHglMDh4ISFcbiIsCi0JCQkJX19mdW5jX18sIG1hY19pZCwgZmlsdGVyKSk7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCXBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCWN1cl9uZXR3b3JrID0gJnBtbG1laW5mby0+bmV0d29yazsKLQotCWlmIChtYWNfaWQgPj0gTlVNX1NUQSkgeyAvKiBDQU1fU0laRSAqLwotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sICVzLCBNQUNJRCA9JWQgaWxsZWdhbCEhXG4iLAotCQkJCQlfX2Z1bmNfXywgbWFjX2lkKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwc3RhID0gcG1sbWVpbmZvLT5GV19zdGFfaW5mb1ttYWNfaWRdLnBzdGE7Ci0JaWYgKCFwc3RhKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgJXMsIENhbid0IGZpbmQgc3RhdGlvbiEhXG4iLAotCQkJCQlfX2Z1bmNfXykpOwotCQlyZXR1cm47Ci0JfQotCi0JcmFpZCA9IHBzdGEtPnJhaWQ7Ci0KLQlzd2l0Y2ggKG1hY19pZCkgewotCWNhc2UgMDovKiAgZm9yIGluZnJhIG1vZGUgKi8KLQkJc3VwcG9ydFJhdGVOdW0gPQotCQkJcnR3X2dldF9yYXRlc2V0X2xlbjIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCQltYXNrID0gdXBkYXRlX3N1cHBvcnRlZF9yYXRlMjNhKGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcywKLQkJCQkJCXN1cHBvcnRSYXRlTnVtKTsKLQkJbWFzayB8PSAocG1sbWVpbmZvLT5IVF9lbmFibGUpID8KLQkJCXVwZGF0ZV9NU0NfcmF0ZTIzYSgmcG1sbWVpbmZvLT5odF9jYXApOjA7Ci0JCWlmIChzdXBwb3J0X3Nob3J0X0dJMjNhKHBhZGFwdGVyLCAmcG1sbWVpbmZvLT5odF9jYXApKQotCQkJc2hvcnRHSXJhdGUgPSB0cnVlOwotCQlicmVhazsKLQljYXNlIDE6LyogZm9yIGJyb2FkY2FzdC9tdWx0aWNhc3QgKi8KLQkJc3VwcG9ydFJhdGVOdW0gPSBydHdfZ2V0X3JhdGVzZXRfbGVuMjNhKAotCQkJcG1sbWVpbmZvLT5GV19zdGFfaW5mb1ttYWNfaWRdLlN1cHBvcnRlZFJhdGVzKTsKLQkJbWFzayA9IHVwZGF0ZV9iYXNpY19yYXRlMjNhKGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcywKLQkJCQkJICAgIHN1cHBvcnRSYXRlTnVtKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDogLyogZm9yIGVhY2ggc3RhIGluIElCU1MgKi8KLQkJc3VwcG9ydFJhdGVOdW0gPSBydHdfZ2V0X3JhdGVzZXRfbGVuMjNhKAotCQkJcG1sbWVpbmZvLT5GV19zdGFfaW5mb1ttYWNfaWRdLlN1cHBvcnRlZFJhdGVzKTsKLQkJbWFzayA9IHVwZGF0ZV9zdXBwb3J0ZWRfcmF0ZTIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsCi0JCQkJCQlzdXBwb3J0UmF0ZU51bSk7Ci0JCWJyZWFrOwotCX0KLQltYXNrIHw9ICgocmFpZDw8MjgpJjB4ZjAwMDAwMDApOwotCW1hc2sgJj0gMHhmZmZmZmZmZjsKLQltYXNrICY9IH5maWx0ZXI7Ci0JaW5pdF9yYXRlID0gZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgyM2EobWFzaykmMHgzZjsKLQotCWFyZyA9IG1hY19pZCYweDFmOy8qIE1BQ0lEICovCi0JYXJnIHw9IEJJVCg3KTsKLQlpZiAodHJ1ZSA9PSBzaG9ydEdJcmF0ZSkKLQkJYXJnIHw9IEJJVCg1KTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJKCJbQlRDb2V4XSwgVXBkYXRlIEZXIFJBSUQgZW50cnksIE1BU0sgPSAweCUwOHgsICIKLQkJICJhcmcgPSAweCUwMnhcbiIsIG1hc2ssIGFyZykpOwotCi0JcnRsODcyM2Ffc2V0X3JhaWRfY21kKHBhZGFwdGVyLCBtYXNrLCBhcmcpOwotCi0JcHN0YS0+aW5pdF9yYXRlID0gaW5pdF9yYXRlOwotCXBkbXByaXYtPklOSURBVEFfUkFURVttYWNfaWRdID0gaW5pdF9yYXRlOwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV8xQW50VXBkYXRlSGFsUkFNYXNrRm9yU0NPKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGZvcmNlVXBkYXRlKQotewotCXN0cnVjdCBidGRtXzg3MjNhXzFhbnQgKnBCdGRtODcyMzsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2OwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yazsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0JdTMyIG1hY2lkOwotCXUzMiBmaWx0ZXIgPSAwOwotCi0JcEJ0ZG04NzIzID0gJkdFVF9IQUxfREFUQShwYWRhcHRlciktPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTFBbnQ7Ci0KLQlpZiAocEJ0ZG04NzIzLT5iUkFDaGFuZ2VkID09IHRydWUgJiYgZm9yY2VVcGRhdGUgPT0gZmFsc2UpCi0JCXJldHVybjsKLQotCXBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCWN1cl9uZXR3b3JrID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdi5tbG1leHRfaW5mby5uZXR3b3JrOwotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIGN1cl9uZXR3b3JrLT5NYWNBZGRyZXNzKTsKLQltYWNpZCA9IHBzdGEtPm1hY19pZDsKLQotCWZpbHRlciB8PSBCSVQoXzFNX1JBVEVfKTsKLQlmaWx0ZXIgfD0gQklUKF8yTV9SQVRFXyk7Ci0JZmlsdGVyIHw9IEJJVChfNU1fUkFURV8pOwotCWZpbHRlciB8PSBCSVQoXzExTV9SQVRFXyk7Ci0JZmlsdGVyIHw9IEJJVChfNk1fUkFURV8pOwotCWZpbHRlciB8PSBCSVQoXzlNX1JBVEVfKTsKLQotCWJ0ZG1fMUFudFVwZGF0ZUhhbFJBTWFzayhwYWRhcHRlciwgbWFjaWQsIGZpbHRlcik7Ci0KLQlwQnRkbTg3MjMtPmJSQUNoYW5nZWQgPSB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBidGRtXzFBbnRSZWNvdmVySGFsUkFNYXNrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMWFudCAqcEJ0ZG04NzIzOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXY7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKmN1cl9uZXR3b3JrOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQotCXBCdGRtODcyMyA9ICZHRVRfSEFMX0RBVEEocGFkYXB0ZXIpLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0xQW50OwotCi0JaWYgKHBCdGRtODcyMy0+YlJBQ2hhbmdlZCA9PSBmYWxzZSkKLQkJcmV0dXJuOwotCi0JcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0JY3VyX25ldHdvcmsgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2Lm1sbWV4dF9pbmZvLm5ldHdvcms7Ci0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgY3VyX25ldHdvcmstPk1hY0FkZHJlc3MpOwotCi0JVXBkYXRlX1JBX0VudHJ5MjNhKHBhZGFwdGVyLCBwc3RhKTsKLQotCXBCdGRtODcyMy0+YlJBQ2hhbmdlZCA9IGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV8xQW50QlRTdGF0ZUNoYW5nZUhhbmRsZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIGVudW0gYnRfc3RhdGVfMWFudCBvbGRTdGF0ZSwKLQkJCSAgICAgIGVudW0gYnRfc3RhdGVfMWFudCBuZXdTdGF0ZSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBoYWxkYXRhOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQlQgc3RhdGUgY2hhbmdlLCAlcyA9PiAlc1xuIiwKLQkJCQlCdFN0YXRlU3RyaW5nW29sZFN0YXRlXSwKLQkJCQlCdFN0YXRlU3RyaW5nW25ld1N0YXRlXSkpOwotCi0JLyogIEJUIGRlZmF1bHQgaWdub3JlIHdsYW4gYWN0aXZlLCAqLwotCS8qICBXaUZpIE1VU1QgZGlzYWJsZSB0aGlzIHdoZW4gQlQgaXMgZW5hYmxlICovCi0JaWYgKG5ld1N0YXRlID4gQlRfSU5GT19TVEFURV9ESVNBQkxFRCkKLQkJYnRkbV9TZXRGd0lnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIGZhbHNlKTsKLQotCWlmICgoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSAmJgotCSAgICAoQlRETV9Jc1dpZmlDb25uZWN0aW9uRXhpc3QocGFkYXB0ZXIpKSkgewotCQlpZiAoKG5ld1N0YXRlID09IEJUX0lORk9fU1RBVEVfU0NPX09OTFlfQlVTWSkgfHwKLQkJICAgIChuZXdTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX0FDTF9TQ09fQlVTWSkpIHsKLQkJCWJ0ZG1fMUFudFVwZGF0ZUhhbFJBTWFza0ZvclNDTyhwYWRhcHRlciwgZmFsc2UpOwotCQl9IGVsc2UgewotCQkJLyogIFJlY292ZXIgb3JpZ2luYWwgUkEgc2V0dGluZyAqLwotCQkJYnRkbV8xQW50UmVjb3ZlckhhbFJBTWFzayhwYWRhcHRlcik7Ci0JCX0KLQl9IGVsc2UgewotCQlwaGFsZGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JCXBoYWxkYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0xQW50LmJSQUNoYW5nZWQgPSBmYWxzZTsKLQl9Ci0KLQlpZiAob2xkU3RhdGUgPT0gbmV3U3RhdGUpCi0JCXJldHVybjsKLQotCWlmIChvbGRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX0FDTF9PTkxZX0JVU1kpIHsKLQkJc3RydWN0IGhhbF9kYXRhXzg3MjNhICpIYWwgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCQlIYWwtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTFBbnQucHNUZG1hTW9uaXRvckNudCA9IDA7Ci0JCUhhbC0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudC5wc1RkbWFNb25pdG9yQ250Rm9yU0NPID0gMDsKLQl9Ci0KLQlpZiAoKG9sZFN0YXRlID09IEJUX0lORk9fU1RBVEVfU0NPX09OTFlfQlVTWSkgfHwKLQkgICAgKG9sZFN0YXRlID09IEJUX0lORk9fU1RBVEVfQUNMX1NDT19CVVNZKSkgewotCQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKkhhbCA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JCUhhbC0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudC5wc1RkbWFNb25pdG9yQ250Rm9yU0NPID0gMDsKLQl9Ci0KLQkvKiAgQWN0aXZlIDJBbnQgbWVjaGFuaXNtIHdoZW4gQlQgQ29ubmVjdGVkICovCi0JaWYgKChvbGRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX0RJU0FCTEVEKSB8fAotCSAgICAob2xkU3RhdGUgPT0gQlRfSU5GT19TVEFURV9OT19DT05ORUNUSU9OKSkgewotCQlpZiAoKG5ld1N0YXRlICE9IEJUX0lORk9fU1RBVEVfRElTQUJMRUQpICYmCi0JCSAgICAobmV3U3RhdGUgIT0gQlRfSU5GT19TVEFURV9OT19DT05ORUNUSU9OKSkgewotCQkJQlRETV9TZXRTd1JmUnhMcGZDb3JuZXIocGFkYXB0ZXIsCi0JCQkJCQlCVF9SRl9SWF9MUEZfQ09STkVSX1NIUklOSyk7Ci0JCQlCVERNX0FHQ1RhYmxlKHBhZGFwdGVyLCBCVF9BR0NUQUJMRV9PTik7Ci0JCQlCVERNX0JCQmFja09mZkxldmVsKHBhZGFwdGVyLCBCVF9CQl9CQUNLT0ZGX09OKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICgobmV3U3RhdGUgPT0gQlRfSU5GT19TVEFURV9ESVNBQkxFRCkgfHwKLQkJICAgIChuZXdTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX05PX0NPTk5FQ1RJT04pKSB7Ci0JCQlCVERNX1NldFN3UmZSeExwZkNvcm5lcihwYWRhcHRlciwKLQkJCQkJCUJUX1JGX1JYX0xQRl9DT1JORVJfUkVTVU1FKTsKLQkJCUJURE1fQUdDVGFibGUocGFkYXB0ZXIsIEJUX0FHQ1RBQkxFX09GRik7Ci0JCQlCVERNX0JCQmFja09mZkxldmVsKHBhZGFwdGVyLCBCVF9CQl9CQUNLT0ZGX09GRik7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMUFudEJ0Q29leGlzdEhhbmRsZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4ODcyMzsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8xYW50ICpwQnRkbTg3MjM7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcEJ0Q29leDg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0JcEJ0ZG04NzIzID0gJnBCdENvZXg4NzIzLT5idGRtMUFudDsKLQlwYWRhcHRlci0+cHdyY3RybHByaXYuYnRjb2V4X3Jmb24gPSBmYWxzZTsKLQlpZiAoIXJ0bDg3MjNhX0JUX2VuYWJsZWQocGFkYXB0ZXIpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQlQgaXMgZGlzYWJsZWRcbiIpKTsKLQotCQlpZiAoQlRETV9Jc1dpZmlDb25uZWN0aW9uRXhpc3QocGFkYXB0ZXIpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkJKCJbQlRDb2V4XSwgd2lmaSBpcyBjb25uZWN0ZWRcbiIpKTsKLQotCQkJaWYgKEJURE1fSXNXaWZpQnVzeShwYWRhcHRlcikpIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkJCSgiW0JUQ29leF0sIFdpZmkgaXMgYnVzeVxuIikpOwotCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgZmFsc2UsIDAsCi0JCQkJCQkgICBmYWxzZSwgOSk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCQkJKCJbQlRDb2V4XSwgV2lmaSBpcyBpZGxlXG4iKSk7Ci0JCQkJX2J0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMiwgMSwKLQkJCQkJCSAgICBmYWxzZSwgOSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkJKCJbQlRDb2V4XSwgd2lmaSBpcyBkaXNjb25uZWN0ZWRcbiIpKTsKLQotCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCBmYWxzZSwgMCwgZmFsc2UsIDkpOwotCQl9Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBCVCBpcyBlbmFibGVkXG4iKSk7Ci0KLQkJaWYgKEJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHBhZGFwdGVyKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJCSgiW0JUQ29leF0sIHdpZmkgaXMgY29ubmVjdGVkXG4iKSk7Ci0KLQkJCWJ0ZG1fMUFudFdpZmlQYXJhQWRqdXN0KHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMUFudENvZXhQcm9jZXNzRm9yV2lmaUNvbm5lY3QocGFkYXB0ZXIpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJCSgiW0JUQ29leF0sIHdpZmkgaXMgZGlzY29ubmVjdGVkXG4iKSk7Ci0KLQkJCS8qICBBbnRlbm5hIHN3aXRjaCBhdCBCVCBzaWRlKDB4ODcwID0gMHgzMDAsCi0JCQkgICAgMHg4NjAgPSAweDIxMCkgYWZ0ZXIgUFNURE1BIG9mZiAqLwotCQkJYnRkbV8xQW50V2lmaVBhcmFBZGp1c3QocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgZmFsc2UsIDAsIGZhbHNlLCAwKTsKLQkJfQotCX0KLQotCWJ0ZG1fMUFudEJUU3RhdGVDaGFuZ2VIYW5kbGVyKHBhZGFwdGVyLCBwQnRDb2V4ODcyMy0+cHJlYzJoQnRJbmZvLAotCQkJCSAgICAgIHBCdENvZXg4NzIzLT5jMmhCdEluZm8pOwotCXBCdENvZXg4NzIzLT5wcmVjMmhCdEluZm8gPSBwQnRDb2V4ODcyMy0+YzJoQnRJbmZvOwotfQotCi12b2lkIEJURE1fMUFudFNpZ25hbENvbXBlbnNhdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSB1OCAqcnNzaV93aWZpLCB1OCAqcnNzaV9idCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBidGRtXzg3MjNhXzFhbnQgKnBCdGRtODcyMzsKLQl1OCBSU1NJX1dpRmlfQ21wbnN0biwgUlNTSV9CVF9DbXBuc3RuOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudDsKLQlSU1NJX1dpRmlfQ21wbnN0biA9IDA7Ci0JUlNTSV9CVF9DbXBuc3RuID0gMDsKLQotCXN3aXRjaCAocEJ0ZG04NzIzLT5jdXJQc1RkbWEpIHsKLQljYXNlIDE6IC8qICBXaUZpIDUybXMgKi8KLQkJUlNTSV9XaUZpX0NtcG5zdG4gPSAxMTsgLyogIDIyKjAuNDggKi8KLQkJYnJlYWs7Ci0JY2FzZSAyOiAvKiAgV2lGaSAzNm1zICovCi0JCVJTU0lfV2lGaV9DbXBuc3RuID0gMTQ7IC8qICAyMiowLjY0ICovCi0JCWJyZWFrOwotCWNhc2UgOTogLyogIFdpRmkgMjBtcyAqLwotCQlSU1NJX1dpRmlfQ21wbnN0biA9IDE4OyAvKiAgMjIqMC44MCAqLwotCQlicmVhazsKLQljYXNlIDExOiAvKiAgV2lGaSAxMG1zICovCi0JCVJTU0lfV2lGaV9DbXBuc3RuID0gMjA7IC8qICAyMiowLjkwICovCi0JCWJyZWFrOwotCWNhc2UgNDogLyogIFdpRmkgMjFtcyAqLwotCQlSU1NJX1dpRmlfQ21wbnN0biA9IDE3OyAvKiAgMjIqMC43OSAqLwotCQlicmVhazsKLQljYXNlIDE2OiAvKiAgV2lGaSAyNG1zICovCi0JCVJTU0lfV2lGaV9DbXBuc3RuID0gMTg7IC8qICAyMiowLjc2ICovCi0JCWJyZWFrOwotCWNhc2UgMTg6IC8qICBXaUZpIDM3bXMgKi8KLQkJUlNTSV9XaUZpX0NtcG5zdG4gPSAxNDsgLyogIDIyKjAuNjQgKi8KLQkJYnJlYWs7Ci0JY2FzZSAyMzogLyogTGV2ZWwtMSwgQW50ZW5uYSBzd2l0Y2ggdG8gQlQgYXQgYWxsIHRpbWUgKi8KLQljYXNlIDI0OiAvKiBMZXZlbC0yLCBBbnRlbm5hIHN3aXRjaCB0byBCVCBhdCBhbGwgdGltZSAqLwotCWNhc2UgMjU6IC8qIExldmVsLTNhLCBBbnRlbm5hIHN3aXRjaCB0byBCVCBhdCBhbGwgdGltZSAqLwotCWNhc2UgMjY6IC8qIExldmVsLTNiLCBBbnRlbm5hIHN3aXRjaCB0byBCVCBhdCBhbGwgdGltZSAqLwotCWNhc2UgMjc6IC8qIExldmVsLTNiLCBBbnRlbm5hIHN3aXRjaCB0byBCVCBhdCBhbGwgdGltZSAqLwotCWNhc2UgMzM6IC8qIEJUIFNDTyAmIFdpRmkgc2l0ZSBzdXJ2ZXkgKi8KLQkJUlNTSV9XaUZpX0NtcG5zdG4gPSAyMjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHJzc2lfd2lmaSAmJiBSU1NJX1dpRmlfQ21wbnN0bikgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkoIltCVENvZXhdLCAxQW50U2dubENtcG5zdG4sIGNhc2UgJWQsIFdpRmlDbXBuc3RuICIKLQkJCSAiPSVkKCVkID0+ICVkKVxuIiwgcEJ0ZG04NzIzLT5jdXJQc1RkbWEsCi0JCQkgUlNTSV9XaUZpX0NtcG5zdG4sICpyc3NpX3dpZmksCi0JCQkgKnJzc2lfd2lmaStSU1NJX1dpRmlfQ21wbnN0bikpOwotCQkqcnNzaV93aWZpICs9IFJTU0lfV2lGaV9DbXBuc3RuOwotCX0KLQotCWlmIChyc3NpX2J0ICYmIFJTU0lfQlRfQ21wbnN0bikgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkoIltCVENvZXhdLCAxQW50U2dubENtcG5zdG4sIGNhc2UgJWQsIEJUQ21wbnN0biAiCi0JCQkgIj0lZCglZCA9PiAlZClcbiIsIHBCdGRtODcyMy0+Y3VyUHNUZG1hLAotCQkJIFJTU0lfQlRfQ21wbnN0biwgKnJzc2lfYnQsICpyc3NpX2J0K1JTU0lfQlRfQ21wbnN0bikpOwotCQkqcnNzaV9idCArPSBSU1NJX0JUX0NtcG5zdG47Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBCVERNXzFBbnRQYXJhSW5pdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EgKnBCdENvZXg7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMWFudCAqcEJ0ZG04NzIzOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0JcEJ0ZG04NzIzID0gJnBCdENvZXgtPmJ0ZG0xQW50OwotCi0JLyogIEVuYWJsZSBjb3VudGVyIHN0YXRpc3RpY3MgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDc2ZSwgMHg0KTsKLQlidGRtXzFBbnRQdGFQYXJhUmVsb2FkKHBhZGFwdGVyKTsKLQotCXBCdGRtODcyMy0+d2lmaVJzc2lUaHJlc2ggPSA0ODsKLQotCXBCdGRtODcyMy0+YldpRmlIYWx0ID0gZmFsc2U7Ci0JcEJ0ZG04NzIzLT5iUkFDaGFuZ2VkID0gZmFsc2U7Ci0KLQlpZiAoKHBCdENvZXgtPmMyaEJ0SW5mbyAhPSBCVF9JTkZPX1NUQVRFX0RJU0FCTEVEKSAmJgotCSAgICAocEJ0Q29leC0+YzJoQnRJbmZvICE9IEJUX0lORk9fU1RBVEVfTk9fQ09OTkVDVElPTikpIHsKLQkJQlRETV9TZXRTd1JmUnhMcGZDb3JuZXIocGFkYXB0ZXIsIEJUX1JGX1JYX0xQRl9DT1JORVJfU0hSSU5LKTsKLQkJQlRETV9BR0NUYWJsZShwYWRhcHRlciwgQlRfQUdDVEFCTEVfT04pOwotCQlCVERNX0JCQmFja09mZkxldmVsKHBhZGFwdGVyLCBCVF9CQl9CQUNLT0ZGX09OKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIEJURE1fMUFudEZvckhhbHQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiXG5bQlRDb2V4XSwgMUFudCBmb3IgaGFsdFxuIikpOwotCi0JR0VUX0hBTF9EQVRBKHBhZGFwdGVyKS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudC5iV2lGaUhhbHQgPQotCQl0cnVlOwotCi0JYnRkbV8xQW50V2lmaVBhcmFBZGp1c3QocGFkYXB0ZXIsIGZhbHNlKTsKLQotCS8qICBkb24ndCB1c2UgYnRkbV8xQW50U2V0UFNURE1BKCkgaGVyZSAqLwotCS8qICBpdCB3aWxsIGNhbGwgcnR3X3NldF9wc19tb2RlMjNhKCkgYW5kIHJlcXVlc3QgcHdycHJpdi0+bG9jay4gKi8KLQkvKiAgVGhpcyB3aWxsIGxlYWQgdG8gZGVhZGxvY2ssIGlmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIElQUyAqLwotCS8qICBMdWNhc0AyMDEzMDIwNSAqLwotCWJ0ZG1fMUFudFBzVGRtYShwYWRhcHRlciwgZmFsc2UsIDApOwotCi0JYnRkbV9TZXRGd0lnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIHRydWUpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNXzFBbnRMcHNMZWF2ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJcbltCVENvZXhdLCAxQW50IGZvciBMUFMgTGVhdmVcbiIpKTsKLQotCS8qICBQcmV2ZW50IGZyb20gZW50ZXJpbmcgTFBTIGFnYWluICovCi0JR0VUX0hBTF9EQVRBKHBhZGFwdGVyKS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudC5iV2lGaUhhbHQgPQotCQl0cnVlOwotCi0JYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCBmYWxzZSwgMCwgZmFsc2UsIDgpOwotLypidGRtXzFBbnRQc1RkbWEocGFkYXB0ZXIsIGZhbHNlLCA4KTsgKi8KLX0KLQotc3RhdGljIHZvaWQgQlRETV8xQW50V2lmaUFzc29jaWF0ZU5vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0eXBlKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIlxuW0JUQ29leF0sIDFBbnQgZm9yIGFzc29jaWF0ZSwgdHlwZSA9JWRcbiIsIHR5cGUpKTsKLQotCWlmICh0eXBlKSB7Ci0JCXJ0bDg3MjNhX0NoZWNrQW50ZW5uYV9TZWxlY3Rpb24ocGFkYXB0ZXIpOwotCQlpZiAoIXJ0bDg3MjNhX0JUX2VuYWJsZWQocGFkYXB0ZXIpKQotCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCBmYWxzZSwgMCwgZmFsc2UsIDkpOwotCQllbHNlIHsKLQkJCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4OwotCQkJdTggQnRTdGF0ZTsKLQotCQkJcEJ0Q29leCA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMzsKLQkJCUJ0U3RhdGUgPSBwQnRDb2V4LT5jMmhCdEluZm87Ci0KLQkJCWJ0ZG1fMUFudFRTRlN3aXRjaChwYWRhcHRlciwgdHJ1ZSk7Ci0KLQkJCWlmIChCdFN0YXRlID09IEJUX0lORk9fU1RBVEVfTk9fQ09OTkVDVElPTiB8fAotCQkJICAgIEJ0U3RhdGUgPT0gQlRfSU5GT19TVEFURV9DT05ORUNUX0lETEUpIHsKLQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGZhbHNlLCAwLAotCQkJCQkJICAgdHJ1ZSwgMjgpOwotCQkJfSBlbHNlIGlmIChCdFN0YXRlID09IEJUX0lORk9fU1RBVEVfU0NPX09OTFlfQlVTWSB8fAotCQkJCSAgIEJ0U3RhdGUgPT0gQlRfSU5GT19TVEFURV9BQ0xfU0NPX0JVU1kpIHsKLQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGZhbHNlLCAwLAotCQkJCQkJICAgZmFsc2UsIDgpOwotCQkJCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDZjMCwgMHg1YTVhNWE1YSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIDB4NmM0LCAweDVhNWE1YTVhKTsKLQkJCX0gZWxzZSBpZiAoQnRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX0FDTF9PTkxZX0JVU1kgfHwKLQkJCQkgICBCdFN0YXRlID09IEJUX0lORk9fU1RBVEVfQUNMX0lOUV9PUl9QQUcpIHsKLQkJCQlpZiAocEJ0Q29leC0+YzJoQnRQcm9maWxlID09IEJUX0lORk9fSElEKQotCQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGZhbHNlLCAwLAotCQkJCQkJCSAgIHRydWUsIDM1KTsKLQkJCQllbHNlCi0JCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgZmFsc2UsIDAsCi0JCQkJCQkJICAgdHJ1ZSwgMjkpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCFydGw4NzIzYV9CVF9lbmFibGVkKHBhZGFwdGVyKSkgewotCQkJaWYgKCFCVERNX0lzV2lmaUNvbm5lY3Rpb25FeGlzdChwYWRhcHRlcikpIHsKLQkJCQlidGRtXzFBbnRQc1RkbWEocGFkYXB0ZXIsIGZhbHNlLCAwKTsKLQkJCQlidGRtXzFBbnRUU0ZTd2l0Y2gocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCWJ0ZG1fMUFudEJ0Q29leGlzdEhhbmRsZXIocGFkYXB0ZXIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLUJURE1fMUFudE1lZGlhU3RhdHVzTm90aWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICBlbnVtIHJ0X21lZGlhX3N0YXR1cyBtc3RhdHVzKQotewotCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4OwotCi0JcEJ0Q29leCA9ICZHRVRfSEFMX0RBVEEocGFkYXB0ZXIpLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIlxuXG5bQlRDb2V4XSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIikpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgTWVkaWFTdGF0dXMsIFdpRmkgJXMgISFcbiIsCi0JCQltc3RhdHVzID09IFJUX01FRElBX0NPTk5FQ1Q/IkNPTk5FQ1QiOiJESVNDT05ORUNUIikpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIikpOwotCi0JaWYgKFJUX01FRElBX0NPTk5FQ1QgPT0gbXN0YXR1cykgewotCQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCQlpZiAocEJ0Q29leC0+YzJoQnRJbmZvID09IEJUX0lORk9fU1RBVEVfU0NPX09OTFlfQlVTWSB8fAotCQkJICAgIHBCdENvZXgtPmMyaEJ0SW5mbyA9PSBCVF9JTkZPX1NUQVRFX0FDTF9TQ09fQlVTWSkKLQkJCQlidGRtXzFBbnRVcGRhdGVIYWxSQU1hc2tGb3JTQ08ocGFkYXB0ZXIsIHRydWUpOwotCQl9Ci0KLQkJcGFkYXB0ZXItPnB3cmN0cmxwcml2LkRlbGF5TFBTTGFzdFRpbWVTdGFtcCA9IGppZmZpZXM7Ci0JCUJURE1fMUFudEZvckRoY3AocGFkYXB0ZXIpOwotCX0gZWxzZSB7Ci0JCS8qIERCR184NzIzQSgiJXMgcnRsODcyM2FfRGVpbml0QW50ZW5uYV9TZWxlY3Rpb25cbiIsCi0JCSAgIF9fZnVuY19fKTsgKi8KLQkJcnRsODcyM2FfRGVpbml0QW50ZW5uYV9TZWxlY3Rpb24ocGFkYXB0ZXIpOwotCQlidGRtXzFBbnRCdENvZXhpc3RIYW5kbGVyKHBhZGFwdGVyKTsKLQkJcEJ0Q29leC0+YnRkbTFBbnQuYlJBQ2hhbmdlZCA9IGZhbHNlOwotCX0KLX0KLQotdm9pZCBCVERNXzFBbnRGb3JEaGNwKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQl1OCBCdFN0YXRlOwotCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4OwotCXN0cnVjdCBidGRtXzg3MjNhXzFhbnQgKnBCdGRtODcyMzsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQnRDb2V4ID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzOwotCUJ0U3RhdGUgPSBwQnRDb2V4LT5jMmhCdEluZm87Ci0JcEJ0ZG04NzIzID0gJnBCdENvZXgtPmJ0ZG0xQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlxuW0JUQ29leF0sIDFBbnQgZm9yIERIQ1BcbiIpKTsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIDFBbnQgZm9yIERIQ1AsIFdpRmkgaXMgJXNcbiIsCi0JCQkJQlRETV9Jc1dpZmlCdXN5KHBhZGFwdGVyKT8iQnVzeSI6IklETEUiKSk7Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCAxQW50IGZvciBESENQLCAlc1xuIiwKLQkJCQlCdFN0YXRlU3RyaW5nW0J0U3RhdGVdKSk7Ci0KLQlCVERNXzFBbnRXaWZpQXNzb2NpYXRlTm90aWZ5KHBhZGFwdGVyLCB0cnVlKTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV8xQW50V2lmaVNjYW5Ob3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggc2NhblR5cGUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQl1OCBCdFN0YXRlOwotCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4OwotCXN0cnVjdCBidGRtXzg3MjNhXzFhbnQgKnBCdGRtODcyMzsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlCdFN0YXRlID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYzJoQnRJbmZvOwotCXBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0JcEJ0ZG04NzIzID0gJnBCdENvZXgtPmJ0ZG0xQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlxuW0JUQ29leF0sIDFBbnQgZm9yIHdpZmkgc2NhbiA9JWQhIVxuIiwKLQkJCQlzY2FuVHlwZSkpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgMUFudCBmb3Igd2lmaSBzY2FuLCBXaUZpIGlzICVzXG4iLAotCQkJCUJURE1fSXNXaWZpQnVzeShwYWRhcHRlcik/IkJ1c3kiOiJJRExFIikpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgMUFudCBmb3Igd2lmaSBzY2FuLCAlc1xuIiwKLQkJCQlCdFN0YXRlU3RyaW5nW0J0U3RhdGVdKSk7Ci0KLQlpZiAoc2NhblR5cGUpIHsKLQkJcnRsODcyM2FfQ2hlY2tBbnRlbm5hX1NlbGVjdGlvbihwYWRhcHRlcik7Ci0JCWlmICghcnRsODcyM2FfQlRfZW5hYmxlZChwYWRhcHRlcikpIHsKLQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgZmFsc2UsIDAsIGZhbHNlLCA5KTsKLQkJfSBlbHNlIGlmIChCVERNX0lzV2lmaUNvbm5lY3Rpb25FeGlzdChwYWRhcHRlcikgPT0gZmFsc2UpIHsKLQkJCUJURE1fMUFudFdpZmlBc3NvY2lhdGVOb3RpZnkocGFkYXB0ZXIsIHRydWUpOwotCQl9IGVsc2UgewotCQkJaWYgKChCdFN0YXRlID09IEJUX0lORk9fU1RBVEVfU0NPX09OTFlfQlVTWSkgfHwKLQkJCSAgICAoQnRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX0FDTF9TQ09fQlVTWSkpIHsKLQkJCQlpZiAocEJ0Q29leC0+YkMyaEJ0SW5xdWlyeVBhZ2UpIHsKLQkJCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCBmYWxzZSwgMCwKLQkJCQkJCQkgICB0cnVlLCAzMik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGFkYXB0ZXItPnB3cmN0cmxwcml2LmJ0Y29leF9yZm9uID0KLQkJCQkJCXRydWU7Ci0JCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwKLQkJCQkJCQkgICB0cnVlLCAzMyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICh0cnVlID09IHBCdENvZXgtPmJDMmhCdElucXVpcnlQYWdlKSB7Ci0JCQkJcGFkYXB0ZXItPnB3cmN0cmxwcml2LmJ0Y29leF9yZm9uID0gdHJ1ZTsKLQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsIHRydWUsIDMwKTsKLQkJCX0gZWxzZSBpZiAoQnRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX0FDTF9PTkxZX0JVU1kpIHsKLQkJCQlwYWRhcHRlci0+cHdyY3RybHByaXYuYnRjb2V4X3Jmb24gPSB0cnVlOwotCQkJCWlmIChwQnRDb2V4LT5jMmhCdFByb2ZpbGUgPT0gQlRfSU5GT19ISUQpCi0JCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwKLQkJCQkJCQkgICB0cnVlLCAzNCk7Ci0JCQkJZWxzZQotCQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsCi0JCQkJCQkJICAgdHJ1ZSwgNCk7Ci0JCQl9IGVsc2UgewotCQkJCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5idGNvZXhfcmZvbiA9IHRydWU7Ci0JCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCB0cnVlLCAwLCB0cnVlLCA1KTsKLQkJCX0KLQkJfQotCi0JCWJ0ZG1fTm90aWZ5RndTY2FuKHBhZGFwdGVyLCAxKTsKLQl9IGVsc2UgewotCQkvKiAgV2lGaV9GaW5pc2hfU2NhbiAqLwotCQlidGRtX05vdGlmeUZ3U2NhbihwYWRhcHRlciwgMCk7Ci0JCWJ0ZG1fMUFudEJ0Q29leGlzdEhhbmRsZXIocGFkYXB0ZXIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgQlRETV8xQW50RndDMmhCdEluZm84NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQlzdHJ1Y3QgYnRfY29leGlzdF84NzIzYSAqcEJ0Q29leDsKLQl1OCB1MXRtcCwgYnRTdGF0ZTsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0KLQl1MXRtcCA9IHBCdENvZXgtPmMyaEJ0SW5mb09yaWdpbmFsOwotCS8qICBzY28gQlVTWSBiaXQgaXMgbm90IHVzZWQgb24gdm9pY2Ugb3ZlciBQQ00gcGxhdGZvcm0gKi8KLQlidFN0YXRlID0gdTF0bXAgJiAweEY7Ci0JcEJ0Q29leC0+YzJoQnRQcm9maWxlID0gdTF0bXAgJiAweEUwOwotCi0JLyogIGRlZmF1bHQgc2V0IGJ0IHRvIGlkbGUgc3RhdGUuICovCi0JcEJ0TWdudC0+RXh0Q29uZmlnLmJCVEJ1c3kgPSBmYWxzZTsKLQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9CVF9JRExFOwotCi0JLyogIGNoZWNrIEJJVDIgZmlyc3QgPT0+IGNoZWNrIGlmIGJ0IGlzIHVuZGVyIGlucXVpcnkgb3IgcGFnZSBzY2FuICovCi0JaWYgKGJ0U3RhdGUgJiBCSVQoMikpCi0JCXBCdENvZXgtPmJDMmhCdElucXVpcnlQYWdlID0gdHJ1ZTsKLQllbHNlCi0JCXBCdENvZXgtPmJDMmhCdElucXVpcnlQYWdlID0gZmFsc2U7Ci0JYnRTdGF0ZSAmPSB+QklUKDIpOwotCi0JaWYgKCEoYnRTdGF0ZSAmIEJJVCgwKSkpCi0JCXBCdENvZXgtPmMyaEJ0SW5mbyA9IEJUX0lORk9fU1RBVEVfTk9fQ09OTkVDVElPTjsKLQllbHNlIHsKLQkJaWYgKGJ0U3RhdGUgPT0gMHgxKQotCQkJcEJ0Q29leC0+YzJoQnRJbmZvID0gQlRfSU5GT19TVEFURV9DT05ORUNUX0lETEU7Ci0JCWVsc2UgaWYgKGJ0U3RhdGUgPT0gMHg5KSB7Ci0JCQlpZiAocEJ0Q29leC0+YkMyaEJ0SW5xdWlyeVBhZ2UgPT0gdHJ1ZSkKLQkJCQlwQnRDb2V4LT5jMmhCdEluZm8gPQotCQkJCQlCVF9JTkZPX1NUQVRFX0FDTF9JTlFfT1JfUEFHOwotCQkJZWxzZQotCQkJCXBCdENvZXgtPmMyaEJ0SW5mbyA9Ci0JCQkJCUJUX0lORk9fU1RBVEVfQUNMX09OTFlfQlVTWTsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5iQlRCdXN5ID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChidFN0YXRlID09IDB4MykgewotCQkJcEJ0Q29leC0+YzJoQnRJbmZvID0gQlRfSU5GT19TVEFURV9TQ09fT05MWV9CVVNZOwotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJCVEJ1c3kgPSB0cnVlOwotCQl9IGVsc2UgaWYgKGJ0U3RhdGUgPT0gMHhiKSB7Ci0JCQlwQnRDb2V4LT5jMmhCdEluZm8gPSBCVF9JTkZPX1NUQVRFX0FDTF9TQ09fQlVTWTsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5iQlRCdXN5ID0gdHJ1ZTsKLQkJfSBlbHNlCi0JCQlwQnRDb2V4LT5jMmhCdEluZm8gPSBCVF9JTkZPX1NUQVRFX01BWDsKLQkJaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iQlRCdXN5KQotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9Ci0JCQkJfkJUX0NPRVhfU1RBVEVfQlRfSURMRTsKLQl9Ci0KLQlpZiAoQlRfSU5GT19TVEFURV9OT19DT05ORUNUSU9OID09IHBCdENvZXgtPmMyaEJ0SW5mbyB8fAotCSAgICBCVF9JTkZPX1NUQVRFX0NPTk5FQ1RfSURMRSA9PSBwQnRDb2V4LT5jMmhCdEluZm8pIHsKLQkJaWYgKHBCdENvZXgtPmJDMmhCdElucXVpcnlQYWdlKQotCQkJcEJ0Q29leC0+YzJoQnRJbmZvID0gQlRfSU5GT19TVEFURV9JTlFfT1JfUEFHOwotCX0KLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDMkhdLCAlcyglZClcbiIsCi0JCQlCdFN0YXRlU3RyaW5nW3BCdENvZXgtPmMyaEJ0SW5mb10sIHBCdENvZXgtPmMyaEJ0SW5mbykpOwotCi0JaWYgKHBCdENvZXgtPmMyaEJ0UHJvZmlsZSAhPSBCVF9JTkZPX0hJRCkKLQkJcEJ0Q29leC0+YzJoQnRQcm9maWxlICY9IH5CVF9JTkZPX0hJRDsKLX0KLQotdm9pZCBCVERNXzFBbnRCdENvZXhpc3Q4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXVuc2lnbmVkIGxvbmcgZGVsdGFfdGltZTsKLQotCXBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NJVEVfTU9OSVRPUikpIHsKLQkJLyogIGFscmVhZHkgZG9uZSBpbiBCVERNXzFBbnRGb3JTY2FuKCkgKi8KLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJKCJbQlRDb2V4XSwgd2lmaSBpcyB1bmRlciBzY2FuIHByb2dyZXNzISFcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9VTkRFUl9MSU5LSU5HKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkoIltCVENvZXhdLCB3aWZpIGlzIHVuZGVyIGxpbmsgcHJvZ3Jlc3MhIVxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogIHVuZGVyIERIQ1AoU3BlY2lhbCBwYWNrZXQpICovCi0JZGVsdGFfdGltZSA9IGppZmZpZXMgLSBwYWRhcHRlci0+cHdyY3RybHByaXYuRGVsYXlMUFNMYXN0VGltZVN0YW1wOwotCWRlbHRhX3RpbWUgPSBqaWZmaWVzX3RvX21zZWNzKGRlbHRhX3RpbWUpOwotCWlmIChkZWx0YV90aW1lIDwgNTAwKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgd2lmaSBpcyB1bmRlciBESENQICIKLQkJCQkJInByb2dyZXNzKCVsaSBtcykhIVxuIiwgZGVsdGFfdGltZSkpOwotCQlyZXR1cm47Ci0JfQotCi0JQlRETV9DaGVja1dpRmlTdGF0ZShwYWRhcHRlcik7Ci0KLQlidGRtXzFBbnRCdENvZXhpc3RIYW5kbGVyKHBhZGFwdGVyKTsKLX0KLQotLyogID09PT09IEVuZCBvZiBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Yzg3MjMxQW50LmMgPT09PT0gKi8KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Yzg3MjMyQW50LmMgPT09PT0gKi8KLQotLyogIGxvY2FsIGZ1bmN0aW9uIHN0YXJ0IHdpdGggYnRkbV8gKi8KLXN0YXRpYyB1OCBidGRtX0FjdGlvbkFsZ29yaXRobShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidGRtXzg3MjNhXzJhbnQgKnBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMkFudDsKLQl1OCBiU2NvRXhpc3QgPSBmYWxzZSwgYkJ0TGlua0V4aXN0ID0gZmFsc2UsIGJCdEhzTW9kZUV4aXN0ID0gZmFsc2U7Ci0JdTggYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fVU5ERUZJTkVEOwotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSkKLQkJYkJ0TGlua0V4aXN0ID0gdHJ1ZTsKLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mU0NPKQotCQliU2NvRXhpc3QgPSB0cnVlOwotCWlmIChCVF9Ic0Nvbm5lY3Rpb25Fc3RhYmxpc2hlZChwYWRhcHRlcikpCi0JCWJCdEhzTW9kZUV4aXN0ID0gdHJ1ZTsKLQotCS8qICBoZXJlIHdlIGdldCBCVCBzdGF0dXMgZmlyc3QgKi8KLQkvKiAgMSkgaW5pdGlhbGl6ZSAqLwotCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19JRExFOwotCi0JaWYgKChiU2NvRXhpc3QpIHx8IChiQnRIc01vZGVFeGlzdCkgfHwKLQkgICAgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0hJRCkpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgU0NPIG9yIEhJRCBvciBIUyBleGlzdHMsIHNldCBCVCBub24taWRsZSAhISFcbiIpKTsKLQkJcEJ0ZG04NzIzLT5idFN0YXR1cyA9IEJUXzJBTlRfQlRfU1RBVFVTX05PTl9JRExFOwotCX0gZWxzZSB7Ci0JCS8qICBBMmRwIHByb2ZpbGUgKi8KLQkJaWYgKChwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUgPT0gMSkgJiYKLQkJICAgIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9BMkRQKSkpIHsKLQkJCWlmIChCVERNX0J0VHhSeENvdW50ZXJMKHBhZGFwdGVyKSA8IDEwMCkgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCwgbG93IHByaW9yaXR5IHR4K3J4IDwgMTAwLCBzZXQgQlQgY29ubmVjdGVkLWlkbGUhISFcbiIpKTsKLQkJCQlwQnRkbTg3MjMtPmJ0U3RhdHVzID0gQlRfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEU7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCwgbG93IHByaW9yaXR5IHR4K3J4ID49IDEwMCwgc2V0IEJUIG5vbi1pZGxlISEhXG4iKSk7Ci0JCQkJcEJ0ZG04NzIzLT5idFN0YXR1cyA9IEJUXzJBTlRfQlRfU1RBVFVTX05PTl9JRExFOwotCQkJfQotCQl9Ci0JCS8qICBQYW4gcHJvZmlsZSAqLwotCQlpZiAoKHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9PSAxKSAmJgotCQkgICAgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX1BBTikpKSB7Ci0JCQlpZiAoQlRETV9CdFR4UnhDb3VudGVyTChwYWRhcHRlcikgPCA2MDApIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFBBTiwgbG93IHByaW9yaXR5IHR4K3J4IDwgNjAwLCBzZXQgQlQgY29ubmVjdGVkLWlkbGUhISFcbiIpKTsKLQkJCQlwQnRkbTg3MjMtPmJ0U3RhdHVzID0gQlRfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEU7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVR4KSB7Ci0JCQkJCWlmICgocEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMubG93UHJpb3JpdHlSeCAvCi0JCQkJCSAgICBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVR4KSA+IDkpIHsKLQkJCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgUEFOLCBsb3cgcHJpb3JpdHkgcngvdHggPiA5LCBzZXQgQlQgY29ubmVjdGVkLWlkbGUhISFcbiIpKTsKLQkJCQkJCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChCVF8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSAhPSBwQnRkbTg3MjMtPmJ0U3RhdHVzKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBQQU4sIHNldCBCVCBub24taWRsZSEhIVxuIikpOwotCQkJCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19OT05fSURMRTsKLQkJCX0KLQkJfQotCQkvKiAgUGFuK0EyZHAgcHJvZmlsZSAqLwotCQlpZiAoKHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9PSAyKSAmJgotCQkgICAgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0EyRFApKSAmJgotCQkgICAgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX1BBTikpKSB7Ci0JCQlpZiAoQlRETV9CdFR4UnhDb3VudGVyTChwYWRhcHRlcikgPCA2MDApIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFBBTitBMkRQLCBsb3cgcHJpb3JpdHkgdHgrcnggPCA2MDAsIHNldCBCVCBjb25uZWN0ZWQtaWRsZSEhIVxuIikpOwotCQkJCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmxvd1ByaW9yaXR5VHgpIHsKLQkJCQkJaWYgKChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVJ4IC8KLQkJCQkJICAgIHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmxvd1ByaW9yaXR5VHgpID4gOSkgewotCQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBQQU4rQTJEUCwgbG93IHByaW9yaXR5IHJ4L3R4ID4gOSwgc2V0IEJUIGNvbm5lY3RlZC1pZGxlISEhXG4iKSk7Ci0JCQkJCQlwQnRkbTg3MjMtPmJ0U3RhdHVzID0gQlRfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoQlRfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgIT0gcEJ0ZG04NzIzLT5idFN0YXR1cykgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgUEFOK0EyRFAsIHNldCBCVCBub24taWRsZSEhIVxuIikpOwotCQkJCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19OT05fSURMRTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoQlRfMkFOVF9CVF9TVEFUVVNfSURMRSAhPSBwQnRkbTg3MjMtPmJ0U3RhdHVzKQotCQlwQnRNZ250LT5FeHRDb25maWcuYkJUQnVzeSA9IHRydWU7Ci0JZWxzZQotCQlwQnRNZ250LT5FeHRDb25maWcuYkJUQnVzeSA9IGZhbHNlOwotCi0JaWYgKCFiQnRMaW5rRXhpc3QpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBObyBwcm9maWxlIGV4aXN0cyEhIVxuIikpOwotCQlyZXR1cm4gYWxnb3JpdGhtOwotCX0KLQotCWlmIChwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUgPT0gMSkgewotCQlpZiAoYlNjb0V4aXN0KSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFNDTyBvbmx5XG4iKSk7Ci0JCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19TQ087Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfSElEKSkgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgSElEIG9ubHlcbiIpKTsKLQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISUQ7Ci0JCQl9IGVsc2UgaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0EyRFApKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBBMkRQIG9ubHlcbiIpKTsKLQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19BMkRQOwotCQkJfSBlbHNlIGlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pKSB7Ci0JCQkJaWYgKGJCdEhzTW9kZUV4aXN0KSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgUEFOKEhTKSBvbmx5XG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX1BBTkhTOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgUEFOKEVEUikgb25seVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFI7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIE5PIG1hdGNoZWQgcHJvZmlsZSBmb3IgTnVtYmVyT2ZIYW5kbGUgPSVkIFxuIiwKLQkJCQlwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUpKTsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAocEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlID09IDIpIHsKLQkJaWYgKGJTY29FeGlzdCkgewotCQkJaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0hJRCkpIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRFxuIikpOwotCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0hJRDsKLQkJCX0gZWxzZSBpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkpIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIFNDTyArIEEyRFBcbiIpKTsKLQkJCX0gZWxzZSBpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfUEFOKSkgewotCQkJCWlmIChiQnRIc01vZGVFeGlzdCkgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIFBBTihIUylcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fU0NPOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgUEFOKEVEUilcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgU0NPIGV4aXN0cyBidXQgd2h5IE5PIG1hdGNoZWQgQUNMIHByb2ZpbGUgZm9yIE51bWJlck9mSGFuZGxlID0lZFxuIiwKLQkJCQlwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9ISUQpICYmCi0JCQkgICAgQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkpIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFBcbiIpKTsKLQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKLQkJfSBlbHNlIGlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9ISUQpICYmCi0JCQkgICBCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pKSB7Ci0JCQkJaWYgKGJCdEhzTW9kZUV4aXN0KSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgUEFOKEhTKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKLQkJCQl9IGVsc2UgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihFRFIpXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pICYmCi0JCQkJICAgQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkpIHsKLQkJCQlpZiAoYkJ0SHNNb2RlRXhpc3QpIHsKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBBMkRQICsgUEFOKEhTKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19BMkRQOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihFRFIpXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9BMkRQOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBFcnJvciEhISBOTyBtYXRjaGVkIHByb2ZpbGUgZm9yIE51bWJlck9mSGFuZGxlID0lZFxuIiwKLQkJCQkJcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlKSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9PSAzKSB7Ci0JCWlmIChiU2NvRXhpc3QpIHsKLQkJCWlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9ISUQpICYmCi0JCQkgICAgQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkpIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIFNDTyArIEhJRCArIEEyRFBcbiIpKTsKLQkJCX0gZWxzZSBpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfSElEKSAmJgotCQkJCSAgIEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX1BBTikpIHsKLQkJCQlpZiAoYkJ0SHNNb2RlRXhpc3QpIHsKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBQQU4oSFMpXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgSElEICsgUEFOKEVEUilcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX1BBTikgJiYKLQkJCQkgICBCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9BMkRQKSkgewotCQkJCWlmIChiQnRIc01vZGVFeGlzdCkgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIFNDTyArIEEyRFAgKyBQQU4oSFMpXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX1NDTzsKLQkJCQl9IGVsc2UgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIFNDTyArIEEyRFAgKyBQQU4oRURSKVxuIikpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBFcnJvciEhISBTQ08gZXhpc3RzIGJ1dCB3aHkgTk8gbWF0Y2hlZCBwcm9maWxlIGZvciBOdW1iZXJPZkhhbmRsZSA9JWRcbiIsCi0JCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0hJRCkgJiYKLQkJCSAgICBCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pICYmCi0JCQkgICAgQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkpIHsKLQkJCQlpZiAoYkJ0SHNNb2RlRXhpc3QpIHsKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBBMkRQICsgUEFOKEhTKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5IUzsKLQkJCQl9IGVsc2UgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFAgKyBQQU4oRURSKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFI7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIE5PIG1hdGNoZWQgcHJvZmlsZSBmb3IgTnVtYmVyT2ZIYW5kbGUgPSVkXG4iLAotCQkJCQlwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUpKTsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAocEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlID49IDMpIHsKLQkJaWYgKGJTY29FeGlzdCkgewotCQkJaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0hJRCkgJiYKLQkJCSAgICBCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pICYmCi0JCQkgICAgQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkpIHsKLQkJCQlpZiAoYkJ0SHNNb2RlRXhpc3QpCi0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgU0NPICsgSElEICsgQTJEUCArIFBBTihIUylcbiIpKTsKLQkJCQllbHNlCi0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgU0NPICsgSElEICsgQTJEUCArIFBBTihFRFIpXG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgU0NPIGV4aXN0cyBidXQgd2h5IE5PIG1hdGNoZWQgcHJvZmlsZSBmb3IgTnVtYmVyT2ZIYW5kbGUgPSVkXG4iLAotCQkJCQlwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgTk8gbWF0Y2hlZCBwcm9maWxlIGZvciBOdW1iZXJPZkhhbmRsZSA9JWRcbiIsCi0JCQkJcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlKSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGFsZ29yaXRobTsKLX0KLQotc3RhdGljIHU4IGJ0ZG1fTmVlZFRvRGVjQnRQd3Ioc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1OCBiUmV0ID0gZmFsc2U7Ci0KLQlpZiAoQlRfT3BlcmF0aW9uKHBhZGFwdGVyKSkgewotCQlpZiAocEhhbERhdGEtPmRtcHJpdi5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID4gNDcpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJOZWVkIHRvIGRlY3JlYXNlIGJ0IHBvd2VyIGZvciBIUyBtb2RlISFcbiIpKTsKLQkJCWJSZXQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIk5PIE5lZWQgdG8gZGVjcmVhc2UgYnQgcG93ZXIgZm9yIEhTIG1vZGUhIVxuIikpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKEJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHBhZGFwdGVyKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIk5lZWQgdG8gZGVjcmVhc2UgYnQgcG93ZXIgZm9yIFdpZmkgaXMgY29ubmVjdGVkISFcbiIpKTsKLQkJCWJSZXQgPSB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBiUmV0OwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV9TZXRDb2V4VGFibGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIHZhbDB4NmMwLAotCQkgIHUzMiB2YWwweDZjOCwgdTggdmFsMHg2Y2MpCi17Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoInNldCBjb2V4IHRhYmxlLCBzZXQgMHg2YzAgPSAweCV4XG4iLCB2YWwweDZjMCkpOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDZjMCwgdmFsMHg2YzApOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoInNldCBjb2V4IHRhYmxlLCBzZXQgMHg2YzggPSAweCV4XG4iLCB2YWwweDZjOCkpOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDZjOCwgdmFsMHg2YzgpOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoInNldCBjb2V4IHRhYmxlLCBzZXQgMHg2Y2MgPSAweCV4XG4iLCB2YWwweDZjYykpOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIDB4NmNjLCB2YWwweDZjYyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGRtX1NldFN3RnVsbFRpbWVEYWNTd2luZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiU3dEYWNTd2luZ09uLAotCQkJICAgdTMyIHN3RGFjU3dpbmdMdmwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAoYlN3RGFjU3dpbmdPbikgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFN3RGFjU3dpbmcgPSAweCV4XG4iLCBzd0RhY1N3aW5nTHZsKSk7Ci0JCVBIWV9TZXRCQlJlZyhwYWRhcHRlciwgMHg4ODAsIDB4ZmYwMDAwMDAsIHN3RGFjU3dpbmdMdmwpOwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iU1dDb2V4aXN0QWxsT2ZmID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBTd0RhY1N3aW5nIE9mZiFcbiIpKTsKLQkJUEhZX1NldEJCUmVnKHBhZGFwdGVyLCAweDg4MCwgMHhmZjAwMDAwMCwgMHhjMCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotYnRkbV9TZXRGd0RhY1N3aW5nTGV2ZWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggZGFjU3dpbmdMdmwpCi17Ci0JdTggSDJDX1BhcmFtZXRlclsxXSA9IHswfTsKLQotCUgyQ19QYXJhbWV0ZXJbMF0gPSBkYWNTd2luZ0x2bDsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgU2V0IERhYyBTd2luZyBMZXZlbCA9IDB4JXhcbiIsIGRhY1N3aW5nTHZsKSk7Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCB3cml0ZSAweDI5ID0gMHgleFxuIiwgSDJDX1BhcmFtZXRlclswXSkpOwotCi0JRmlsbEgyQ0NtZChwYWRhcHRlciwgMHgyOSwgMSwgSDJDX1BhcmFtZXRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMkFudERlY0J0UHdyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJEZWNCdFB3cikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8yYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQ7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCSgiW0JUQ29leF0sIERlYyBCVCBwb3dlciA9ICVzXG4iLAotCQkoKGJEZWNCdFB3cikgPyAiT04iIDogIk9GRiIpKSk7Ci0JcEJ0ZG04NzIzLT5iQ3VyRGVjQnRQd3IgPSBiRGVjQnRQd3I7Ci0KLQlpZiAocEJ0ZG04NzIzLT5iUHJlRGVjQnRQd3IgPT0gcEJ0ZG04NzIzLT5iQ3VyRGVjQnRQd3IpCi0JCXJldHVybjsKLQotCUJURE1fU2V0RndEZWNCdFB3cihwYWRhcHRlciwgcEJ0ZG04NzIzLT5iQ3VyRGVjQnRQd3IpOwotCi0JcEJ0ZG04NzIzLT5iUHJlRGVjQnRQd3IgPSBwQnRkbTg3MjMtPmJDdXJEZWNCdFB3cjsKLX0KLQotc3RhdGljIHZvaWQKLWJ0ZG1fMkFudEZ3RGFjU3dpbmdMdmwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggZndEYWNTd2luZ0x2bCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8yYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQ7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIHNldCBGVyBEYWMgU3dpbmcgbGV2ZWwgPSAlZFxuIiwgIGZ3RGFjU3dpbmdMdmwpKTsKLQlwQnRkbTg3MjMtPmN1ckZ3RGFjU3dpbmdMdmwgPSBmd0RhY1N3aW5nTHZsOwotCi0JLyogUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBwcmVGd0RhY1N3aW5nTHZsID0lZCwgY3VyRndEYWNTd2luZ0x2bCA9JWRcbiIsICovCi0JLypwQnRkbTg3MjMtPnByZUZ3RGFjU3dpbmdMdmwsIHBCdGRtODcyMy0+Y3VyRndEYWNTd2luZ0x2bCkpOyAqLwotCi0JaWYgKHBCdGRtODcyMy0+cHJlRndEYWNTd2luZ0x2bCA9PSBwQnRkbTg3MjMtPmN1ckZ3RGFjU3dpbmdMdmwpCi0JCXJldHVybjsKLQotCWJ0ZG1fU2V0RndEYWNTd2luZ0xldmVsKHBhZGFwdGVyLCBwQnRkbTg3MjMtPmN1ckZ3RGFjU3dpbmdMdmwpOwotCi0JcEJ0ZG04NzIzLT5wcmVGd0RhY1N3aW5nTHZsID0gcEJ0ZG04NzIzLT5jdXJGd0RhY1N3aW5nTHZsOwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV8yQW50UmZTaHJpbmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYlJ4UmZTaHJpbmtPbikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8yYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQ7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCSgiW0JUQ29leF0sIHR1cm4gUnggUkYgU2hyaW5rID0gJXNcbiIsCi0JCSgoYlJ4UmZTaHJpbmtPbikgPyAiT04iIDogIk9GRiIpKSk7Ci0JcEJ0ZG04NzIzLT5iQ3VyUmZSeExwZlNocmluayA9IGJSeFJmU2hyaW5rT247Ci0KLQkvKiBSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIGJQcmVSZlJ4THBmU2hyaW5rID0lZCwgYkN1clJmUnhMcGZTaHJpbmsgPSVkXG4iLCAqLwotCS8qcEJ0ZG04NzIzLT5iUHJlUmZSeExwZlNocmluaywgcEJ0ZG04NzIzLT5iQ3VyUmZSeExwZlNocmluaykpOyAqLwotCi0JaWYgKHBCdGRtODcyMy0+YlByZVJmUnhMcGZTaHJpbmsgPT0gcEJ0ZG04NzIzLT5iQ3VyUmZSeExwZlNocmluaykKLQkJcmV0dXJuOwotCi0JQlRETV9TZXRTd1JmUnhMcGZDb3JuZXIocGFkYXB0ZXIsICh1OClwQnRkbTg3MjMtPmJDdXJSZlJ4THBmU2hyaW5rKTsKLQotCXBCdGRtODcyMy0+YlByZVJmUnhMcGZTaHJpbmsgPSBwQnRkbTg3MjMtPmJDdXJSZlJ4THBmU2hyaW5rOwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV8yQW50TG93UGVuYWx0eVJhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJMb3dQZW5hbHR5UmEpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIltCVENvZXhdLCB0dXJuIExvd1BlbmFsdHlSQSA9ICVzXG4iLAotCQkoKGJMb3dQZW5hbHR5UmEpID8gIk9OIiA6ICJPRkYiKSkpOwotCXBCdGRtODcyMy0+YkN1ckxvd1BlbmFsdHlSYSA9IGJMb3dQZW5hbHR5UmE7Ci0KLQkvKiBSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIGJQcmVMb3dQZW5hbHR5UmEgPSVkLCBiQ3VyTG93UGVuYWx0eVJhID0lZFxuIiwgKi8KLQkvKnBCdGRtODcyMy0+YlByZUxvd1BlbmFsdHlSYSwgcEJ0ZG04NzIzLT5iQ3VyTG93UGVuYWx0eVJhKSk7ICovCi0KLQlpZiAocEJ0ZG04NzIzLT5iUHJlTG93UGVuYWx0eVJhID09IHBCdGRtODcyMy0+YkN1ckxvd1BlbmFsdHlSYSkKLQkJcmV0dXJuOwotCi0JQlRETV9TZXRTd1BlbmFsdHlUeFJhdGVBZGFwdGl2ZShwYWRhcHRlciwgKHU4KXBCdGRtODcyMy0+YkN1ckxvd1BlbmFsdHlSYSk7Ci0KLQlwQnRkbTg3MjMtPmJQcmVMb3dQZW5hbHR5UmEgPSBwQnRkbTg3MjMtPmJDdXJMb3dQZW5hbHR5UmE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGRtXzJBbnREYWNTd2luZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgIHU4IGJEYWNTd2luZ09uLCB1MzIgZGFjU3dpbmdMdmwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIltCVENvZXhdLCB0dXJuIERhY1N3aW5nID0lcywgZGFjU3dpbmdMdmwgPSAweCV4XG4iLAotCQkoYkRhY1N3aW5nT24gPyAiT04iIDogIk9GRiIpLCBkYWNTd2luZ0x2bCkpOwotCXBCdGRtODcyMy0+YkN1ckRhY1N3aW5nT24gPSBiRGFjU3dpbmdPbjsKLQlwQnRkbTg3MjMtPmN1ckRhY1N3aW5nTHZsID0gZGFjU3dpbmdMdmw7Ci0KLQlpZiAoKHBCdGRtODcyMy0+YlByZURhY1N3aW5nT24gPT0gcEJ0ZG04NzIzLT5iQ3VyRGFjU3dpbmdPbikgJiYKLQkgICAgKHBCdGRtODcyMy0+cHJlRGFjU3dpbmdMdmwgPT0gcEJ0ZG04NzIzLT5jdXJEYWNTd2luZ0x2bCkpCi0JCXJldHVybjsKLQotCW1kZWxheSgzMCk7Ci0JYnRkbV9TZXRTd0Z1bGxUaW1lRGFjU3dpbmcocGFkYXB0ZXIsIGJEYWNTd2luZ09uLCBkYWNTd2luZ0x2bCk7Ci0KLQlwQnRkbTg3MjMtPmJQcmVEYWNTd2luZ09uID0gcEJ0ZG04NzIzLT5iQ3VyRGFjU3dpbmdPbjsKLQlwQnRkbTg3MjMtPnByZURhY1N3aW5nTHZsID0gcEJ0ZG04NzIzLT5jdXJEYWNTd2luZ0x2bDsKLX0KLQotc3RhdGljIHZvaWQgYnRkbV8yQW50QWRjQmFja09mZihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiQWRjQmFja09mZikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8yYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQ7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCSgiW0JUQ29leF0sIHR1cm4gQWRjQmFja09mZiA9ICVzXG4iLAotCQkoKGJBZGNCYWNrT2ZmKSA/ICJPTiIgOiAiT0ZGIikpKTsKLQlwQnRkbTg3MjMtPmJDdXJBZGNCYWNrT2ZmID0gYkFkY0JhY2tPZmY7Ci0KLQlpZiAocEJ0ZG04NzIzLT5iUHJlQWRjQmFja09mZiA9PSBwQnRkbTg3MjMtPmJDdXJBZGNCYWNrT2ZmKQotCQlyZXR1cm47Ci0KLQlCVERNX0JCQmFja09mZkxldmVsKHBhZGFwdGVyLCAodTgpcEJ0ZG04NzIzLT5iQ3VyQWRjQmFja09mZik7Ci0KLQlwQnRkbTg3MjMtPmJQcmVBZGNCYWNrT2ZmID0gcEJ0ZG04NzIzLT5iQ3VyQWRjQmFja09mZjsKLX0KLQotc3RhdGljIHZvaWQgYnRkbV8yQW50QWdjVGFibGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYkFnY1RhYmxlRW4pCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIltCVENvZXhdLCAlcyBBZ2MgVGFibGVcbiIsICgoYkFnY1RhYmxlRW4pID8gIkVuYWJsZSIgOiAiRGlzYWJsZSIpKSk7Ci0JcEJ0ZG04NzIzLT5iQ3VyQWdjVGFibGVFbiA9IGJBZ2NUYWJsZUVuOwotCi0JLyogUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBiUHJlQWdjVGFibGVFbiA9JWQsIGJDdXJBZ2NUYWJsZUVuID0lZFxuIiwgKi8KLQkvKnBCdGRtODcyMy0+YlByZUFnY1RhYmxlRW4sIHBCdGRtODcyMy0+YkN1ckFnY1RhYmxlRW4pKTsgKi8KLQotCWlmIChwQnRkbTg3MjMtPmJQcmVBZ2NUYWJsZUVuID09IHBCdGRtODcyMy0+YkN1ckFnY1RhYmxlRW4pCi0JCXJldHVybjsKLQotCUJURE1fQUdDVGFibGUocGFkYXB0ZXIsICh1OCliQWdjVGFibGVFbik7Ci0KLQlwQnRkbTg3MjMtPmJQcmVBZ2NUYWJsZUVuID0gcEJ0ZG04NzIzLT5iQ3VyQWdjVGFibGVFbjsKLX0KLQotc3RhdGljIHZvaWQKLWJ0ZG1fMkFudENvZXhUYWJsZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICB1MzIgdmFsMHg2YzAsIHUzMiB2YWwweDZjOCwgdTggdmFsMHg2Y2MpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCB3cml0ZSBDb2V4IFRhYmxlIDB4NmMwID0gMHgleCwgMHg2YzggPSAweCV4LCAweDZjYyA9IDB4JXhcbiIsCi0JCXZhbDB4NmMwLCB2YWwweDZjOCwgdmFsMHg2Y2MpKTsKLQlwQnRkbTg3MjMtPmN1clZhbDB4NmMwID0gdmFsMHg2YzA7Ci0JcEJ0ZG04NzIzLT5jdXJWYWwweDZjOCA9IHZhbDB4NmM4OwotCXBCdGRtODcyMy0+Y3VyVmFsMHg2Y2MgPSB2YWwweDZjYzsKLQotCS8qIFJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgcHJlVmFsMHg2YzAgPSAweCV4LCBwcmVWYWwweDZjOCA9IDB4JXgsIHByZVZhbDB4NmNjID0gMHgleCAhIVxuIiwgKi8KLQkvKnBCdGRtODcyMy0+cHJlVmFsMHg2YzAsIHBCdGRtODcyMy0+cHJlVmFsMHg2YzgsIHBCdGRtODcyMy0+cHJlVmFsMHg2Y2MpKTsgKi8KLQkvKiBSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIGN1clZhbDB4NmMwID0gMHgleCwgY3VyVmFsMHg2YzggPSAweCV4LCBjdXJWYWwweDZjYyA9IDB4JXggISFcbiIsICovCi0JLypwQnRkbTg3MjMtPmN1clZhbDB4NmMwLCBwQnRkbTg3MjMtPmN1clZhbDB4NmM4LCBwQnRkbTg3MjMtPmN1clZhbDB4NmNjKSk7ICovCi0KLQlpZiAoKHBCdGRtODcyMy0+cHJlVmFsMHg2YzAgPT0gcEJ0ZG04NzIzLT5jdXJWYWwweDZjMCkgJiYKLQkgICAgKHBCdGRtODcyMy0+cHJlVmFsMHg2YzggPT0gcEJ0ZG04NzIzLT5jdXJWYWwweDZjOCkgJiYKLQkgICAgKHBCdGRtODcyMy0+cHJlVmFsMHg2Y2MgPT0gcEJ0ZG04NzIzLT5jdXJWYWwweDZjYykpCi0JCXJldHVybjsKLQotCWJ0ZG1fU2V0Q29leFRhYmxlKHBhZGFwdGVyLCB2YWwweDZjMCwgdmFsMHg2YzgsIHZhbDB4NmNjKTsKLQotCXBCdGRtODcyMy0+cHJlVmFsMHg2YzAgPSBwQnRkbTg3MjMtPmN1clZhbDB4NmMwOwotCXBCdGRtODcyMy0+cHJlVmFsMHg2YzggPSBwQnRkbTg3MjMtPmN1clZhbDB4NmM4OwotCXBCdGRtODcyMy0+cHJlVmFsMHg2Y2MgPSBwQnRkbTg3MjMtPmN1clZhbDB4NmNjOwotfQotCi1zdGF0aWMgdm9pZCBidGRtXzJBbnRJZ25vcmVXbGFuQWN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJFbmFibGUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIltCVENvZXhdLCB0dXJuIElnbm9yZSBXbGFuQWN0ICVzXG4iLCAoYkVuYWJsZSA/ICJPTiIgOiAiT0ZGIikpKTsKLQlwQnRkbTg3MjMtPmJDdXJJZ25vcmVXbGFuQWN0ID0gYkVuYWJsZTsKLQotCi0JaWYgKHBCdGRtODcyMy0+YlByZUlnbm9yZVdsYW5BY3QgPT0gcEJ0ZG04NzIzLT5iQ3VySWdub3JlV2xhbkFjdCkKLQkJcmV0dXJuOwotCi0JYnRkbV9TZXRGd0lnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIGJFbmFibGUpOwotCXBCdGRtODcyMy0+YlByZUlnbm9yZVdsYW5BY3QgPSBwQnRkbTg3MjMtPmJDdXJJZ25vcmVXbGFuQWN0OwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV8yQW50U2V0RnczYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBieXRlMSwgdTggYnl0ZTIsCi0JCSB1OCBieXRlMywgdTggYnl0ZTQsIHU4IGJ5dGU1KQotewotCXU4IEgyQ19QYXJhbWV0ZXJbNV0gPSB7MH07Ci0KLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCS8qICBieXRlMVsxOjBdICE9IDAgbWVhbnMgZW5hYmxlIHBzdGRtYSAqLwotCS8qICBmb3IgMkFudCBidCBjb2V4aXN0LCBpZiBieXRlMSAhPSAwIG1lYW5zIGVuYWJsZSBwc3RkbWEgKi8KLQlpZiAoYnl0ZTEpCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJGV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQlIMkNfUGFyYW1ldGVyWzBdID0gYnl0ZTE7Ci0JSDJDX1BhcmFtZXRlclsxXSA9IGJ5dGUyOwotCUgyQ19QYXJhbWV0ZXJbMl0gPSBieXRlMzsKLQlIMkNfUGFyYW1ldGVyWzNdID0gYnl0ZTQ7Ci0JSDJDX1BhcmFtZXRlcls0XSA9IGJ5dGU1OwotCi0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuZnczYVZhbFswXSA9IGJ5dGUxOwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LmZ3M2FWYWxbMV0gPSBieXRlMjsKLQlwSGFsRGF0YS0+YnRfY29leGlzdC5mdzNhVmFsWzJdID0gYnl0ZTM7Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuZnczYVZhbFszXSA9IGJ5dGU0OwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LmZ3M2FWYWxbNF0gPSBieXRlNTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRlcgd3JpdGUgMHgzYSg1Ynl0ZXMpID0gMHgleCUwOHhcbiIsCi0JCUgyQ19QYXJhbWV0ZXJbMF0sCi0JCUgyQ19QYXJhbWV0ZXJbMV08PDI0fEgyQ19QYXJhbWV0ZXJbMl08PDE2fEgyQ19QYXJhbWV0ZXJbM108PDh8SDJDX1BhcmFtZXRlcls0XSkpOwotCi0JRmlsbEgyQ0NtZChwYWRhcHRlciwgMHgzYSwgNSwgSDJDX1BhcmFtZXRlcik7Ci0JfQotCi1zdGF0aWMgdm9pZCBidGRtXzJBbnRQc1RkbWEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYlR1cm5PbiwgdTggdHlwZSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8yYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQ7Ci0JdTMyCQkJYnRUeFJ4Q250ID0gMDsKLQl1OCBiVHVybk9uQnlDbnQgPSBmYWxzZTsKLQl1OCBwc1RkbWFUeXBlQnlDbnQgPSAwOwotCi0JYnRUeFJ4Q250ID0gQlRETV9CdFR4UnhDb3VudGVySChwYWRhcHRlcikrQlRETV9CdFR4UnhDb3VudGVyTChwYWRhcHRlcik7Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBCVCBUeFJ4IENvdW50ZXJzID0gJWRcbiIsIGJ0VHhSeENudCkpOwotCWlmIChidFR4UnhDbnQgPiAzMDAwKSB7Ci0JCWJUdXJuT25CeUNudCA9IHRydWU7Ci0JCXBzVGRtYVR5cGVCeUNudCA9IDg7Ci0KLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJKCJbQlRDb2V4XSwgRm9yIEJUVHhSeENvdW50ZXJzLCB0dXJuICVzIFBTIFRETUEsIHR5cGUgPSVkXG4iLAotCQkJKGJUdXJuT25CeUNudCA/ICJPTiIgOiAiT0ZGIiksIHBzVGRtYVR5cGVCeUNudCkpOwotCQlwQnRkbTg3MjMtPmJDdXJQc1RkbWFPbiA9IGJUdXJuT25CeUNudDsKLQkJcEJ0ZG04NzIzLT5jdXJQc1RkbWEgPSBwc1RkbWFUeXBlQnlDbnQ7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJKCJbQlRDb2V4XSwgdHVybiAlcyBQUyBURE1BLCB0eXBlID0lZFxuIiwKLQkJCShiVHVybk9uID8gIk9OIiA6ICJPRkYiKSwgdHlwZSkpOwotCQlwQnRkbTg3MjMtPmJDdXJQc1RkbWFPbiA9IGJUdXJuT247Ci0JCXBCdGRtODcyMy0+Y3VyUHNUZG1hID0gdHlwZTsKLQl9Ci0KLQlpZiAoKHBCdGRtODcyMy0+YlByZVBzVGRtYU9uID09IHBCdGRtODcyMy0+YkN1clBzVGRtYU9uKSAmJgotCSAgICAocEJ0ZG04NzIzLT5wcmVQc1RkbWEgPT0gcEJ0ZG04NzIzLT5jdXJQc1RkbWEpKQotCQlyZXR1cm47Ci0KLQlpZiAoYlR1cm5PbikgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSAxOgotCQlkZWZhdWx0OgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHgxYSwgMHgxYSwgMHhhMSwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHgxMiwgMHgxMiwgMHhhMSwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHhhLCAweGEsIDB4YTEsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4YTMsIDB4NSwgMHg1LCAweGExLCAweDgwKTsKLQkJCWJyZWFrOwotCQljYXNlIDU6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDFhLCAweDFhLCAweDIwLCAweDk4KTsKLQkJCWJyZWFrOwotCQljYXNlIDY6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDEyLCAweDEyLCAweDIwLCAweDk4KTsKLQkJCWJyZWFrOwotCQljYXNlIDc6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweGEsIDB4YSwgMHgyMCwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSA4OgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhhMywgMHg1LCAweDUsIDB4MjAsIDB4ODApOwotCQkJYnJlYWs7Ci0JCWNhc2UgOToKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4ZTMsIDB4MWEsIDB4MWEsIDB4YTEsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTA6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDEyLCAweDEyLCAweGExLCAweDk4KTsKLQkJCWJyZWFrOwotCQljYXNlIDExOgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHhhLCAweGEsIDB4YTEsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTI6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDUsIDB4NSwgMHhhMSwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMzoKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4ZTMsIDB4MWEsIDB4MWEsIDB4MjAsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTQ6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDEyLCAweDEyLCAweDIwLCAweDk4KTsKLQkJCWJyZWFrOwotCQljYXNlIDE1OgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHhhLCAweGEsIDB4MjAsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTY6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDUsIDB4NSwgMHgyMCwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxNzoKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4YTMsIDB4MmYsIDB4MmYsIDB4MjAsIDB4ODApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTg6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDUsIDB4NSwgMHhhMSwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOToKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4ZTMsIDB4MjUsIDB4MjUsIDB4YTEsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjA6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDI1LCAweDI1LCAweDIwLCAweDk4KTsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogIGRpc2FibGUgUFMgdGRtYSAqLwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSAwOgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHgwLCAweDAsIDB4MCwgMHg4LCAweDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHgwLCAweDAsIDB4MCwgMHg4LCAweDApOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiAgdXBkYXRlIHByZSBzdGF0ZSAqLwotCXBCdGRtODcyMy0+YlByZVBzVGRtYU9uID0gIHBCdGRtODcyMy0+YkN1clBzVGRtYU9uOwotCXBCdGRtODcyMy0+cHJlUHNUZG1hID0gcEJ0ZG04NzIzLT5jdXJQc1RkbWE7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMkFudEJ0SW5xdWlyeVBhZ2Uoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlidGRtXzJBbnRDb2V4VGFibGUocGFkYXB0ZXIsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKLQlidGRtXzJBbnRJZ25vcmVXbGFuQWN0KHBhZGFwdGVyLCBmYWxzZSk7Ci0JYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA4KTsKLX0KLQotc3RhdGljIHU4IGJ0ZG1fSG9sZEZvckJ0SW5xUGFnZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXUzMiBjdXJUaW1lID0gamlmZmllczsKLQotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5iQzJoQnRJbnF1aXJ5UGFnZSkgewotCQkvKiAgYnQgaW5xdWlyeSBvciBwYWdlIGlzIHN0YXJ0ZWQuICovCi0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idElucVBhZ2VTdGFydFRpbWUgPT0gMCkgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRJbnFQYWdlU3RhcnRUaW1lID0gY3VyVGltZTsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQlQgSW5xdWlyeS9wYWdlIGlzIHN0YXJ0ZWQgYXQgdGltZSA6IDB4JWx4IFxuIiwKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5xUGFnZVN0YXJ0VGltZSkpOwotCQl9Ci0JfQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQlQgSW5xdWlyeS9wYWdlIHN0YXJ0ZWQgdGltZSA6IDB4JWx4LCBjdXJUaW1lIDogMHgleCBcbiIsCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5xUGFnZVN0YXJ0VGltZSwgY3VyVGltZSkpOwotCi0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5xUGFnZVN0YXJ0VGltZSkgewotCQlpZiAoKChjdXJUaW1lIC0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRJbnFQYWdlU3RhcnRUaW1lKS8xMDAwMDAwKSA+PSAxMCkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBCVCBJbnF1aXJ5L3BhZ2UgPj0gMTBzZWMhISEiKSk7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idElucVBhZ2VTdGFydFRpbWUgPSAwOwotCQl9Ci0JfQotCi0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5xUGFnZVN0YXJ0VGltZSkgewotCQlidGRtXzJBbnRDb2V4VGFibGUocGFkYXB0ZXIsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKLQkJYnRkbV8yQW50SWdub3JlV2xhbkFjdChwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9IGVsc2UgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotCi1zdGF0aWMgdTggYnRkbV9JczJBbnQ4NzIzQUNvbW1vbkFjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidGRtXzg3MjNhXzJhbnQgKnBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMkFudDsKLQl1OCBiQ29tbW9uID0gZmFsc2U7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiJXMgOkJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0ID0leCBjaGVja19md3N0YXRlID0leCBwbWxtZXByaXYtPmZ3X3N0YXRlID0gMHgleFxuIiwgX19mdW5jX18sIEJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHBhZGFwdGVyKSwgY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCAoX0ZXX1VOREVSX1NVUlZFWXxfRldfVU5ERVJfTElOS0lORykpLCBwYWRhcHRlci0+bWxtZXByaXYuZndfc3RhdGUpKTsKLQotCWlmICgoIUJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHBhZGFwdGVyKSkgJiYKLQkgICAgKCFjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIChfRldfVU5ERVJfU1VSVkVZfF9GV19VTkRFUl9MSU5LSU5HKSkpICYmCi0JICAgIChCVF8yQU5UX0JUX1NUQVRVU19JRExFID09IHBCdGRtODcyMy0+YnRTdGF0dXMpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIGlkbGUgKyBCdCBpZGxlISFcbiIpKTsKLQotCQlidGRtXzJBbnRMb3dQZW5hbHR5UmEocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50UmZTaHJpbmsocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50Q29leFRhYmxlKHBhZGFwdGVyLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Ci0KLQkJYnRkbV8yQW50SWdub3JlV2xhbkFjdChwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIGZhbHNlLCAwKTsKLQkJYnRkbV8yQW50RndEYWNTd2luZ0x2bChwYWRhcHRlciwgMHgyMCk7Ci0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCi0JCWJDb21tb24gPSB0cnVlOwotCX0gZWxzZSBpZiAoKChCVERNX0lzV2lmaUNvbm5lY3Rpb25FeGlzdChwYWRhcHRlcikpIHx8Ci0JCSAgIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIChfRldfVU5ERVJfU1VSVkVZfF9GV19VTkRFUl9MSU5LSU5HKSkpKSAmJgotCQkgICAoQlRfMkFOVF9CVF9TVEFUVVNfSURMRSA9PSBwQnRkbTg3MjMtPmJ0U3RhdHVzKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSBub24taWRsZSArIEJUIGlkbGUhIVxuIikpOwotCi0JCWJ0ZG1fMkFudExvd1BlbmFsdHlSYShwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudFJmU2hyaW5rKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudENvZXhUYWJsZShwYWRhcHRlciwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwotCi0JCWJ0ZG1fMkFudElnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgMCk7Ci0JCWJ0ZG1fMkFudEZ3RGFjU3dpbmdMdmwocGFkYXB0ZXIsIDB4MjApOwotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgdHJ1ZSk7Ci0KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCi0JCWJDb21tb24gPSB0cnVlOwotCX0gZWxzZSBpZiAoKCFCVERNX0lzV2lmaUNvbm5lY3Rpb25FeGlzdChwYWRhcHRlcikpICYmCi0JCSAgICghY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCAoX0ZXX1VOREVSX1NVUlZFWXxfRldfVU5ERVJfTElOS0lORykpKSAmJgotCQkgICAoQlRfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gcEJ0ZG04NzIzLT5idFN0YXR1cykpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgaWRsZSArIEJ0IGNvbm5lY3RlZCBpZGxlISFcbiIpKTsKLQotCQlidGRtXzJBbnRMb3dQZW5hbHR5UmEocGFkYXB0ZXIsIHRydWUpOwotCQlidGRtXzJBbnRSZlNocmluayhwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudENvZXhUYWJsZShwYWRhcHRlciwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwotCi0JCWJ0ZG1fMkFudElnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgMCk7Ci0JCWJ0ZG1fMkFudEZ3RGFjU3dpbmdMdmwocGFkYXB0ZXIsIDB4MjApOwotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCi0JCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQotCQliQ29tbW9uID0gdHJ1ZTsKLQl9IGVsc2UgaWYgKCgoQlRETV9Jc1dpZmlDb25uZWN0aW9uRXhpc3QocGFkYXB0ZXIpKSB8fAotCQkgICAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCAoX0ZXX1VOREVSX1NVUlZFWXxfRldfVU5ERVJfTElOS0lORykpKSkgJiYKLQkJICAgKEJUXzJBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09IHBCdGRtODcyMy0+YnRTdGF0dXMpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIG5vbi1pZGxlICsgQnQgY29ubmVjdGVkIGlkbGUhIVxuIikpOwotCi0JCWJ0ZG1fMkFudExvd1BlbmFsdHlSYShwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudFJmU2hyaW5rKHBhZGFwdGVyLCB0cnVlKTsKLQkJYnRkbV8yQW50Q29leFRhYmxlKHBhZGFwdGVyLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Ci0KLQkJYnRkbV8yQW50SWdub3JlV2xhbkFjdChwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIGZhbHNlLCAwKTsKLQkJYnRkbV8yQW50RndEYWNTd2luZ0x2bChwYWRhcHRlciwgMHgyMCk7Ci0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCB0cnVlKTsKLQotCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0KLQkJYkNvbW1vbiA9IHRydWU7Ci0JfSBlbHNlIGlmICgoIUJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHBhZGFwdGVyKSkgJiYKLQkJICAgKCFjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIChfRldfVU5ERVJfU1VSVkVZfF9GV19VTkRFUl9MSU5LSU5HKSkpICYmCi0JCSAgIChCVF8yQU5UX0JUX1NUQVRVU19OT05fSURMRSA9PSBwQnRkbTg3MjMtPmJ0U3RhdHVzKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSBpZGxlICsgQlQgbm9uLWlkbGUhIVxuIikpOwotCi0JCWJ0ZG1fMkFudExvd1BlbmFsdHlSYShwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudFJmU2hyaW5rKHBhZGFwdGVyLCB0cnVlKTsKLQkJYnRkbV8yQW50Q29leFRhYmxlKHBhZGFwdGVyLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Ci0KLQkJYnRkbV8yQW50SWdub3JlV2xhbkFjdChwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIGZhbHNlLCAwKTsKLQkJYnRkbV8yQW50RndEYWNTd2luZ0x2bChwYWRhcHRlciwgMHgyMCk7Ci0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCi0JCWJDb21tb24gPSB0cnVlOwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIG5vbi1pZGxlICsgQlQgbm9uLWlkbGUhIVxuIikpOwotCQlidGRtXzJBbnRMb3dQZW5hbHR5UmEocGFkYXB0ZXIsIHRydWUpOwotCQlidGRtXzJBbnRSZlNocmluayhwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudENvZXhUYWJsZShwYWRhcHRlciwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwotCQlidGRtXzJBbnRJZ25vcmVXbGFuQWN0KHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudEZ3RGFjU3dpbmdMdmwocGFkYXB0ZXIsIDB4MjApOwotCi0JCWJDb21tb24gPSBmYWxzZTsKLQl9Ci0JcmV0dXJuIGJDb21tb247Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYlNjb0hpZCwKLQkJCSAgICB1OCBiVHhQYXVzZSwgdTggbWF4SW50ZXJ2YWwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCXN0YXRpYyBzMzIJCXVwLCBkbiwgbSwgbiwgV2FpdENvdW50OwotCXMzMgkJCXJlc3VsdDsgICAvKiAwOiBubyBjaGFuZ2UsICsxOiBpbmNyZWFzZSBXaUZpIGR1cmF0aW9uLCAtMTogZGVjcmVhc2UgV2lGaSBkdXJhdGlvbiAqLwotCXU4IHJldHJ5Q291bnQgPSAwOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBUZG1hRHVyYXRpb25BZGp1c3QoKVxuIikpOwotCi0JaWYgKHBCdGRtODcyMy0+YlJlc2V0VGRtYUFkanVzdCkgewotCQlwQnRkbTg3MjMtPmJSZXNldFRkbWFBZGp1c3QgPSBmYWxzZTsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBmaXJzdCBydW4gVGRtYUR1cmF0aW9uQWRqdXN0KCkhIVxuIikpOwotCQlpZiAoYlNjb0hpZCkgewotCQkJaWYgKGJUeFBhdXNlKSB7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChiVHhQYXVzZSkgewotCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNyk7Ci0JCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJfSBlbHNlIHsKLQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDMpOwotCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMzsKLQkJCX0KLQkJfQotCQl1cCA9IDA7Ci0JCWRuID0gMDsKLQkJbSA9IDE7Ci0JCW4gPSAzOwotCQlyZXN1bHQgPSAwOwotCQlXYWl0Q291bnQgPSAwOwotCX0gZWxzZSB7Ci0JCS8qIGFjY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyICovCi0JCXJldHJ5Q291bnQgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idFJldHJ5Q250OwotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIHJldHJ5Q291bnQgPSAlZFxuIiwgcmV0cnlDb3VudCkpOwotCQlyZXN1bHQgPSAwOwotCQlXYWl0Q291bnQrKzsKLQotCQlpZiAocmV0cnlDb3VudCA9PSAwKSB7ICAvKiAgbm8gcmV0cnkgaW4gdGhlIGxhc3QgMi1zZWNvbmQgZHVyYXRpb24gKi8KLQkJCXVwKys7Ci0JCQlkbi0tOwotCi0JCQlpZiAoZG4gPD0gMCkKLQkJCQlkbiA9IDA7Ci0KLQkJCWlmICh1cCA+PSBuKSB7CS8qICBpZiCzc8TyIG4grdMyrO0gcmV0cnkgY291bnSssDAsIKtovdW8ZVdpRmkgZHVyYXRpb24gKi8KLQkJCQlXYWl0Q291bnQgPSAwOwotCQkJCW4gPSAzOwotCQkJCXVwID0gMDsKLQkJCQlkbiA9IDA7Ci0JCQkJcmVzdWx0ID0gMTsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEluY3JlYXNlIHdpZmkgZHVyYXRpb24hIVxuIikpOwotCQkJfQotCQl9IGVsc2UgaWYgKHJldHJ5Q291bnQgPD0gMykgewkvKiAgPD0gMyByZXRyeSBpbiB0aGUgbGFzdCAyLXNlY29uZCBkdXJhdGlvbiAqLwotCQkJdXAtLTsKLQkJCWRuKys7Ci0KLQkJCWlmICh1cCA8PSAwKQotCQkJCXVwID0gMDsKLQotCQkJaWYgKGRuID09IDIpIHsJLyogIGlmILNzxPIgMiCt0zKs7SByZXRyeSBjb3VudDwgMywgq2i91a+2V2lGaSBkdXJhdGlvbiAqLwotCQkJCWlmIChXYWl0Q291bnQgPD0gMikKLQkJCQkJbSsrOyAvKiAgwdenS6RAqr2mYqjirdNsZXZlbKSkqNOmXiAqLwotCQkJCWVsc2UKLQkJCQkJbSA9IDE7Ci0KLQkJCQlpZiAobSA+PSAyMCkgLyogbSCzzKRqrcggPSAyMCAnILPMpGoxMjCs7SByZWNoZWNrrE+nX73VvuMgV2lGaSBkdXJhdGlvbi4gKi8KLQkJCQkJbSA9IDIwOwotCi0JCQkJbiA9IDMqbTsKLQkJCQl1cCA9IDA7Ci0JCQkJZG4gPSAwOwotCQkJCVdhaXRDb3VudCA9IDA7Ci0JCQkJcmVzdWx0ID0gLTE7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBEZWNyZWFzZSB3aWZpIGR1cmF0aW9uIGZvciByZXRyeUNvdW50ZXI8MyEhXG4iKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7ICAvKiByZXRyeSBjb3VudCA+IDMsIKV1rW4xprggcmV0cnkgY291bnQgPiAzLCCraL3Vr7ZXaUZpIGR1cmF0aW9uICovCi0JCQlpZiAoV2FpdENvdW50ID09IDEpCi0JCQkJbSsrOyAvKiAgwdenS6RAqr2mYqjirdNsZXZlbKSkqNOmXiAqLwotCQkJZWxzZQotCQkJCW0gPSAxOwotCi0JCQlpZiAobSA+PSAyMCkgLyogbSCzzKRqrcggPSAyMCAnILPMpGoxMjCs7SByZWNoZWNrrE+nX73VvuMgV2lGaSBkdXJhdGlvbi4gKi8KLQkJCQltID0gMjA7Ci0JCQluID0gMyptOwotCQkJdXAgPSAwOwotCQkJZG4gPSAwOwotCQkJV2FpdENvdW50ID0gMDsKLQkJCXJlc3VsdCA9IC0xOwotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBEZWNyZWFzZSB3aWZpIGR1cmF0aW9uIGZvciByZXRyeUNvdW50ZXI+MyEhXG4iKSk7Ci0JCX0KLQotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIG1heCBJbnRlcnZhbCA9ICVkXG4iLCBtYXhJbnRlcnZhbCkpOwotCQlpZiAobWF4SW50ZXJ2YWwgPT0gMSkgewotCQkJaWYgKGJUeFBhdXNlKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBUeFBhdXNlID0gMVxuIikpOwotCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDIpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA2KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA2OwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMykgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDcpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDc7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA0KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgOCk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gODsKLQkJCQl9Ci0JCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDkpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMyk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTM7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMCkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE0KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDExKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTUpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTIpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNik7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTY7Ci0JCQkJfQotCi0JCQkJaWYgKHJlc3VsdCA9PSAtMSkgewotCQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA2KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNjsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA2KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDcpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDcpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgOCk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDg7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTMpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTQpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE1KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE2KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTY7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7Ci0JCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA4KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDcpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDcpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNik7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDY7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA1KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE1KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE0KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTQ7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTQpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTMpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMzsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBUeFBhdXNlID0gMFxuIikpOwotCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA1KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDYpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAyKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAyOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNykgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDMpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDM7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA4KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNCk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNDsKLQkJCQl9Ci0JCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEzKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgOSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gOTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE0KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTApOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDEwOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTUpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTE7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNikgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEyKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMjsKLQkJCQl9Ci0KLQkJCQlpZiAocmVzdWx0ID09IC0xKSB7Ci0JCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDIpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAyOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDIpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMyk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDM7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMykgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA0KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNDsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA5KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEwKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTA7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTApIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMik7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDEyOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gMSkgewotCQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAzKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMzsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAzKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDIpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAyOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDIpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTIpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMCk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDEwOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEwKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDkpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA5OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKG1heEludGVydmFsID09IDIpIHsKLQkJCWlmIChiVHhQYXVzZSkgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgVHhQYXVzZSA9IDFcbiIpKTsKLQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMSkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDYpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDY7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAyKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNik7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNjsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDMpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA3KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNCkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDgpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDg7Ci0JCQkJfQotCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA5KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTQpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE0OwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTApIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNCk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTQ7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMSkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE1KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEyKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTYpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE2OwotCQkJCX0KLQkJCQlpZiAocmVzdWx0ID09IC0xKSB7Ci0JCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA1KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDYpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA2OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDYpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNyk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDc7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNykgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA4KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gODsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMykgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNCk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE0OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE0KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE1KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTU7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTUpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTYpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNjsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAocmVzdWx0ID09IDEpIHsKLQkJCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDgpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNyk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDc7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNykgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA2KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNjsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA2KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDYpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA2OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE2KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE1KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTU7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTUpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTQpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNCk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE0OwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFR4UGF1c2UgPSAwXG4iKSk7Ci0JCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDUpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAyKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAyOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNikgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDIpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDI7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA3KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMyk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMzsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDgpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA0KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA0OwotCQkJCX0KLQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTMpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMCk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTA7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNCkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEwKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMDsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE1KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDExOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTYpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMik7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTI7Ci0JCQkJfQotCQkJCWlmIChyZXN1bHQgPT0gLTEpIHsKLQkJCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMik7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDI7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAzKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMzsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAzKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDQpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA0OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDkpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTApOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMDsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDExOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDExKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEyKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTI7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7Ci0JCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA0KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDMpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAzOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDMpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMik7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDI7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAyKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMjsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDExOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDExKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEwKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTA7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTApIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTApOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChtYXhJbnRlcnZhbCA9PSAzKSB7Ci0JCQlpZiAoYlR4UGF1c2UpIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFR4UGF1c2UgPSAxXG4iKSk7Ci0JCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA3KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMikgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDcpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDc7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAzKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNyk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNzsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDQpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA4KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA4OwotCQkJCX0KLQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gOSkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE1KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEwKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTUpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTEpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTU7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMikgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE2KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNjsKLQkJCQl9Ci0JCQkJaWYgKHJlc3VsdCA9PSAtMSkgewotCQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA3KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNzsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA2KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDcpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDcpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgOCk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDg7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTMpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTUpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE1KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE2KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTY7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7Ci0JCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA4KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDcpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDcpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNyk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDc7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA3KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNzsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE1KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE1KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTU7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTQpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTUpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBUeFBhdXNlID0gMFxuIikpOwotCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA1KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMyk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMzsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDYpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAzKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAzOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNykgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDMpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDM7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA4KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNCk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNDsKLQkJCQl9Ci0JCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEzKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDExOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTQpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTE7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNSkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDExKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE2KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTIpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDEyOwotCQkJCX0KLQkJCQlpZiAocmVzdWx0ID09IC0xKSB7Ci0JCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDMpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAzOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDIpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMyk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDM7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMykgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA0KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNDsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA5KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDExKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTE7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTApIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMik7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDEyOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gMSkgewotCQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAzKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMzsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAzKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDMpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAzOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDIpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMyk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDM7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTIpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDExOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEwKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDExKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBQc1RkbWEgdHlwZSA6IHJlY29yZFBzVGRtYSA9JWRcbiIsIHBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlKSk7Ci0JLyogIGlmIGN1cnJlbnQgUHNUZG1hIG5vdCBtYXRjaCB3aXRoIHRoZSByZWNvcmRlZCBvbmUgKHdoZW4gc2NhbiwgZGhjcC4uLiksICovCi0JLyogIHRoZW4gd2UgaGF2ZSB0byBhZGp1c3QgaXQgYmFjayB0byB0aGUgcHJldmlvdXMgcmVjb3JkIG9uZS4gKi8KLQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgIT0gcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBQc1RkbWEgdHlwZSBkaXNtYXRjaCEhISwgY3VyUHNUZG1hID0lZCwgcmVjb3JkUHNUZG1hID0lZFxuIiwKLQkJCXBCdGRtODcyMy0+Y3VyUHNUZG1hLCBwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSkpOwotCi0JCWlmICghY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZfF9GV19VTkRFUl9MSU5LSU5HKSkKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUpOwotCQllbHNlCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIHJvYW1pbmcvbGluay9zY2FuIGlzIHVuZGVyIHByb2dyZXNzLCB3aWxsIGFkanVzdCBuZXh0IHRpbWUhISFcbiIpKTsKLQl9Ci19Ci0KLS8qICBkZWZhdWx0IEFjdGlvbiAqLwotLyogIFNDTyBvbmx5IG9yIFNDTytQQU4oSFMpICovCi1zdGF0aWMgdm9pZCBidGRtXzJBbnQ4NzIzQVNDT0FjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IGJ0UnNzaVN0YXRlLCBidFJzc2lTdGF0ZTE7Ci0KLQlpZiAoYnRkbV9OZWVkVG9EZWNCdFB3cihwYWRhcHRlcikpCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCB0cnVlKTsKLQllbHNlCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlpZiAoQlRETV9Jc0hUNDAocGFkYXB0ZXIpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDQwXG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgbG93IFxuIikpOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCX0KLQotCQkvKiAgc3cgbWVjaGFuaXNtICovCi0JCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDIwIG9yIExlZ2FjeVxuIikpOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAzNywgMCk7Ci0JCWJ0UnNzaVN0YXRlMSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlMShwYWRhcHRlciwgMiwgMjcsIDApOwotCi0JCS8qICBmdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgbG93IFxuIikpOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCX0KLQotCQkvKiAgc3cgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBsb3cgXG4iKSk7Ci0JCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgYnRkbV8yQW50ODcyM0FISURBY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBidFJzc2lTdGF0ZSwgYnRSc3NpU3RhdGUxOwotCi0JaWYgKGJ0ZG1fTmVlZFRvRGVjQnRQd3IocGFkYXB0ZXIpKQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgdHJ1ZSk7Ci0JZWxzZQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCi0JaWYgKEJURE1fSXNIVDQwKHBhZGFwdGVyKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQ0MFxuIikpOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAzNywgMCk7Ci0JCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGhpZ2ggXG4iKSk7Ci0JCQlQbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKHBhZGFwdGVyLCAweDg4MywgMHg0MCk7Ci0JCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDkpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTMpOwotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUMjAgb3IgTGVnYWN5XG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQkJYnRSc3NpU3RhdGUxID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUxKHBhZGFwdGVyLCAyLCAyNywgMCk7Ci0KLQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGhpZ2ggXG4iKSk7Ci0JCQlQbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKHBhZGFwdGVyLCAweDg4MywgMHg0MCk7Ci0JCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDkpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTMpOwotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgbG93IFxuIikpOwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0KLQl9Ci19Ci0KLS8qIEEyRFAgb25seSAvIFBBTihFRFIpIG9ubHkvIEEyRFArUEFOKEhTKSAqLwotc3RhdGljIHZvaWQgYnRkbV8yQW50ODcyM0FBMkRQQWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggYnRSc3NpU3RhdGUsIGJ0UnNzaVN0YXRlMTsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1OCBidEluZm9FeHQgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idEluZm9FeHQ7Ci0KLQlpZiAoYnRkbV9OZWVkVG9EZWNCdFB3cihwYWRhcHRlcikpCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCB0cnVlKTsKLQllbHNlCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlpZiAoQlRETV9Jc0hUNDAocGFkYXB0ZXIpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDQwXG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQotCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCi0JCQlpZiAoYnRJbmZvRXh0JkJJVCgwKSkgewkvKiBhMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyICovCi0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgYmFzaWMgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIGZhbHNlLCBmYWxzZSwgMyk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGVkciByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgZmFsc2UsIGZhbHNlLCAxKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgbG93IFxuIikpOwotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCBmYWxzZSwgdHJ1ZSwgMyk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGVkciByYXRlIFxuIikpOwotCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCBmYWxzZSwgdHJ1ZSwgMSk7Ci0JCQl9Ci0JCX0KLQotCQkvKiAgc3cgbWVjaGFuaXNtICovCi0JCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDIwIG9yIExlZ2FjeVxuIikpOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAzNywgMCk7Ci0JCWJ0UnNzaVN0YXRlMSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlMShwYWRhcHRlciwgMiwgMjcsIDApOwotCi0JCS8qICBmdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCBmYWxzZSwgZmFsc2UsIDMpOwotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBlZHIgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIGZhbHNlLCBmYWxzZSwgMSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgbG93IFxuIikpOwotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCBmYWxzZSwgdHJ1ZSwgMyk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGVkciByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgZmFsc2UsIHRydWUsIDEpOwotCQkJfQotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgbG93IFxuIikpOwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMkFudDg3MjNBUEFORURSQWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggYnRSc3NpU3RhdGUsIGJ0UnNzaVN0YXRlMTsKLQotCWlmIChidGRtX05lZWRUb0RlY0J0UHdyKHBhZGFwdGVyKSkKLQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIHRydWUpOwotCWVsc2UKLQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIGZhbHNlKTsKLQotCWlmIChCVERNX0lzSFQ0MChwYWRhcHRlcikpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUNDBcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMzcsIDApOwotCi0JCS8qICBmdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGhpZ2ggXG4iKSk7Ci0JCQlQbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKHBhZGFwdGVyLCAweDg4MywgMHg0MCk7Ci0JCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDIpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBsb3cgXG4iKSk7Ci0JCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDYpOwotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQyMCBvciBMZWdhY3lcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMzcsIDApOwotCQlidFJzc2lTdGF0ZTEgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZTEocGFkYXB0ZXIsIDIsIDI3LCAwKTsKLQotCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgaGlnaCBcbiIpKTsKLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMik7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgbG93IFxuIikpOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA2KTsKLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGhpZ2ggXG4iKSk7Ci0JCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9Ci0JfQotfQotCi0vKiBQQU4oSFMpIG9ubHkgKi8KLXN0YXRpYyB2b2lkIGJ0ZG1fMkFudDg3MjNBUEFOSFNBY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBidFJzc2lTdGF0ZTsKLQotCWlmIChCVERNX0lzSFQ0MChwYWRhcHRlcikpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUNDBcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgNDcsIDApOwotCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIHRydWUpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBsb3cgXG4iKSk7Ci0JCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCQl9Ci0JCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgZmFsc2UsIDApOwotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUMjAgb3IgTGVnYWN5XG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDQ3LCAwKTsKLQotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaFxuIikpOwotCQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgMCk7Ci0KLQkJCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgbG93XG4iKSk7Ci0JCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgMCk7Ci0KLQkJCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9Ci0JfQotfQotCi0vKiBQQU4oRURSKStBMkRQICovCi1zdGF0aWMgdm9pZCBidGRtXzJBbnQ4NzIzQVBBTkVEUkEyRFBBY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBidFJzc2lTdGF0ZSwgYnRSc3NpU3RhdGUxLCBidEluZm9FeHQ7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlidEluZm9FeHQgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idEluZm9FeHQ7Ci0KLQlpZiAoYnRkbV9OZWVkVG9EZWNCdFB3cihwYWRhcHRlcikpCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCB0cnVlKTsKLQllbHNlCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlpZiAoQlRETV9Jc0hUNDAocGFkYXB0ZXIpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDQwXG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCS8qICBmdyBtZWNoYW5pc20gKi8KLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAyKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgbG93IFxuIikpOwotCQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA2KTsKLQkJCX0KLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUMjAgb3IgTGVnYWN5XG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQkJYnRSc3NpU3RhdGUxID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUxKHBhZGFwdGVyLCAyLCAyNywgMCk7Ci0KLQkJaWYgKChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAyKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBsb3cgXG4iKSk7Ci0JCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCQlpZiAoYnRJbmZvRXh0JkJJVCgwKSkgewkvKiBhMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyICovCi0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgYmFzaWMgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDgpOwotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBlZHIgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDYpOwotCQkJfQotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgbG93IFxuIikpOwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMkFudDg3MjNBUEFORURSSElEQWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggYnRSc3NpU3RhdGUsIGJ0UnNzaVN0YXRlMTsKLQotCWlmIChidGRtX05lZWRUb0RlY0J0UHdyKHBhZGFwdGVyKSkKLQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIHRydWUpOwotCWVsc2UKLQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIGZhbHNlKTsKLQotCWlmIChCVERNX0lzSFQ0MChwYWRhcHRlcikpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUNDBcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMzcsIDApOwotCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMCk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTQpOwotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQyMCBvciBMZWdhY3lcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMzcsIDApOwotCQlidFJzc2lTdGF0ZTEgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZTEocGFkYXB0ZXIsIDIsIDI3LCAwKTsKLQotCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgaGlnaCBcbiIpKTsKLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTApOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTQpOwotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgbG93IFxuIikpOwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0KLQl9Ci19Ci0KLS8qICBISUQrQTJEUCtQQU4oRURSKSAqLwotc3RhdGljIHZvaWQgYnRkbV8yQW50ODcyM0FISURBMkRQUEFORURSQWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggYnRSc3NpU3RhdGUsIGJ0UnNzaVN0YXRlMSwgYnRJbmZvRXh0OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JYnRJbmZvRXh0ID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRJbmZvRXh0OwotCi0JaWYgKGJ0ZG1fTmVlZFRvRGVjQnRQd3IocGFkYXB0ZXIpKQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgdHJ1ZSk7Ci0JZWxzZQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCi0JaWYgKEJURE1fSXNIVDQwKHBhZGFwdGVyKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQ0MFxuIikpOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAzNywgMCk7Ci0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCi0JCQlpZiAoYnRJbmZvRXh0JkJJVCgwKSkgewkvKiBhMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyICovCi0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgYmFzaWMgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWlmIChidEluZm9FeHQmQklUKDApKSB7CS8qIGEyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIgKi8KLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBiYXNpYyByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTYpOwotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBlZHIgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE0KTsKLQkJCX0KLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUMjAgb3IgTGVnYWN5XG4iKSk7Ci0JCWJ0UnNzaVN0YXRlMSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlMShwYWRhcHRlciwgMiwgMzcsIDApOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAyNywgMCk7Ci0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCi0JCQlpZiAoYnRJbmZvRXh0JkJJVCgwKSkgewkvKiBhMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyICovCi0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgYmFzaWMgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWlmIChidEluZm9FeHQmQklUKDApKSB7CS8qIGEyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIgKi8KLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBiYXNpYyByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTYpOwotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBlZHIgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE0KTsKLQkJCX0KLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBoaWdoIFxuIikpOwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGhpZ2ggXG4iKSk7Ci0JCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgYnRkbV8yQW50ODcyM0FISURBMkRQQWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggYnRSc3NpU3RhdGUsIGJ0UnNzaVN0YXRlMSwgYnRJbmZvRXh0OwotCi0JYnRJbmZvRXh0ID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRJbmZvRXh0OwotCi0JaWYgKGJ0ZG1fTmVlZFRvRGVjQnRQd3IocGFkYXB0ZXIpKQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgdHJ1ZSk7Ci0JZWxzZQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCi0JaWYgKEJURE1fSXNIVDQwKHBhZGFwdGVyKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQ0MFxuIikpOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAzNywgMCk7Ci0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCi0JCQlpZiAoYnRJbmZvRXh0JkJJVCgwKSkgewkvKiBhMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyICovCi0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgYmFzaWMgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIHRydWUsIGZhbHNlLCAzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCB0cnVlLCBmYWxzZSwgMSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWlmIChidEluZm9FeHQmQklUKDApKSB7CS8qIGEyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIgKi8KLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBiYXNpYyByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgdHJ1ZSwgdHJ1ZSwgMyk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGVkciByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgdHJ1ZSwgdHJ1ZSwgMSk7Ci0JCQl9Ci0JCX0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQyMCBvciBMZWdhY3lcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMzcsIDApOwotCQlidFJzc2lTdGF0ZTEgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMjcsIDApOwotCi0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCi0JCQlpZiAoYnRJbmZvRXh0JkJJVCgwKSkgewkvKiBhMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyICovCi0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgYmFzaWMgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIHRydWUsIGZhbHNlLCAzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCB0cnVlLCBmYWxzZSwgMSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWlmIChidEluZm9FeHQmQklUKDApKSB7CS8qIGEyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIgKi8KLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBiYXNpYyByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgdHJ1ZSwgdHJ1ZSwgMyk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGVkciByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgdHJ1ZSwgdHJ1ZSwgMSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBoaWdoIFxuIikpOwotCQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGxvdyBcbiIpKTsKLQkJCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBidGRtXzJBbnQ4NzIzQUEyZHAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1OCBidFJzc2lTdGF0ZSwgYnRSc3NpU3RhdGUxLCBidEluZm9FeHQ7Ci0KLQlidEluZm9FeHQgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idEluZm9FeHQ7Ci0KLQlpZiAoYnRkbV9OZWVkVG9EZWNCdFB3cihwYWRhcHRlcikpCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCB0cnVlKTsKLQllbHNlCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCBmYWxzZSk7Ci0JLyogIGNvZXggdGFibGUgKi8KLQlidGRtXzJBbnRDb2V4VGFibGUocGFkYXB0ZXIsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKLQlidGRtXzJBbnRJZ25vcmVXbGFuQWN0KHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlpZiAoQlRETV9Jc0hUNDAocGFkYXB0ZXIpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDQwXG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCBmYWxzZSwgZmFsc2UsIDEpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgZmFsc2UsIHRydWUsIDEpOwotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQyMCBvciBMZWdhY3lcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgNDcsIDApOwotCQlidFJzc2lTdGF0ZTEgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZTEocGFkYXB0ZXIsIDIsIDI3LCAwKTsKLQotCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgaGlnaCBcbiIpKTsKLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgZmFsc2UsIGZhbHNlLCAxKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBsb3cgXG4iKSk7Ci0JCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIGZhbHNlLCB0cnVlLCAxKTsKLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGhpZ2ggXG4iKSk7Ci0JCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9Ci0JfQotfQotCi0vKiAgZXh0ZXJuIGZ1bmN0aW9uIHN0YXJ0IHdpdGggQlRETV8gKi8KLXN0YXRpYyB2b2lkIEJURE1fMkFudFBhcmFJbml0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0KLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8yYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQ7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIDJBbnQgUGFyYW1ldGVyIEluaXQhIVxuIikpOwotCi0JLyogIEVuYWJsZSBjb3VudGVyIHN0YXRpc3RpY3MgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDc2ZSwgMHg0KTsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDc3OCwgMHgzKTsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDQwLCAweDIwKTsKLQotCS8qICBmb3JjZSB0byByZXNldCBjb2V4IG1lY2hhbmlzbSAqLwotCXBCdGRtODcyMy0+cHJlVmFsMHg2YzAgPSAweDA7Ci0JYnRkbV8yQW50Q29leFRhYmxlKHBhZGFwdGVyLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Ci0KLQlwQnRkbTg3MjMtPmJQcmVQc1RkbWFPbiA9IHRydWU7Ci0JYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgMCk7Ci0KLQlwQnRkbTg3MjMtPnByZUZ3RGFjU3dpbmdMdmwgPSAweDEwOwotCWJ0ZG1fMkFudEZ3RGFjU3dpbmdMdmwocGFkYXB0ZXIsIDB4MjApOwotCi0JcEJ0ZG04NzIzLT5iUHJlRGVjQnRQd3IgPSB0cnVlOwotCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlwQnRkbTg3MjMtPmJQcmVBZ2NUYWJsZUVuID0gdHJ1ZTsKLQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCi0JcEJ0ZG04NzIzLT5iUHJlQWRjQmFja09mZiA9IHRydWU7Ci0JYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCi0JcEJ0ZG04NzIzLT5iUHJlTG93UGVuYWx0eVJhID0gdHJ1ZTsKLQlidGRtXzJBbnRMb3dQZW5hbHR5UmEocGFkYXB0ZXIsIGZhbHNlKTsKLQotCXBCdGRtODcyMy0+YlByZVJmUnhMcGZTaHJpbmsgPSB0cnVlOwotCWJ0ZG1fMkFudFJmU2hyaW5rKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlwQnRkbTg3MjMtPmJQcmVEYWNTd2luZ09uID0gdHJ1ZTsKLQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCi0JcEJ0ZG04NzIzLT5iUHJlSWdub3JlV2xhbkFjdCA9IHRydWU7Ci0JYnRkbV8yQW50SWdub3JlV2xhbkFjdChwYWRhcHRlciwgZmFsc2UpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNXzJBbnRId0NvZXhBbGxPZmY4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWJ0ZG1fMkFudENvZXhUYWJsZShwYWRhcHRlciwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNXzJBbnRGd0NvZXhBbGxPZmY4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWJ0ZG1fMkFudElnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIGZhbHNlKTsKLQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIGZhbHNlLCAwKTsKLQlidGRtXzJBbnRGd0RhY1N3aW5nTHZsKHBhZGFwdGVyLCAweDIwKTsKLQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNXzJBbnRTd0NvZXhBbGxPZmY4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCWJ0ZG1fMkFudExvd1BlbmFsdHlSYShwYWRhcHRlciwgZmFsc2UpOwotCWJ0ZG1fMkFudFJmU2hyaW5rKHBhZGFwdGVyLCBmYWxzZSk7Ci0JYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV8yQW50RndDMmhCdEluZm84NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidGRtXzg3MjNhXzJhbnQgKnBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMkFudDsKLQl1OCBidEluZm8gPSAwOwotCXU4IGFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX1VOREVGSU5FRDsKLQl1OCBiQnRMaW5rRXhpc3QgPSBmYWxzZSwgYkJ0SHNNb2RlRXhpc3QgPSBmYWxzZTsKLQotCWJ0SW5mbyA9IHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmMyaEJ0SW5mb09yaWdpbmFsOwotCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19JRExFOwotCi0JLyogIGNoZWNrIEJJVDIgZmlyc3QgPT0+IGNoZWNrIGlmIGJ0IGlzIHVuZGVyIGlucXVpcnkgb3IgcGFnZSBzY2FuICovCi0JaWYgKGJ0SW5mbyAmIEJJVCgyKSkgewotCQlpZiAoIXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJDMmhCdElucXVpcnlQYWdlKSB7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcuYkhvbGRGb3JCdE9wZXJhdGlvbiA9IHRydWU7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcuYkhvbGRQZXJpb2RDbnQgPSAxOwotCQkJYnRkbV8yQW50QnRJbnF1aXJ5UGFnZShwYWRhcHRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcuYkhvbGRQZXJpb2RDbnQrKzsKLQkJCWJ0ZG1fSG9sZEZvckJ0SW5xUGFnZShwYWRhcHRlcik7Ci0JCX0KLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYkMyaEJ0SW5xdWlyeVBhZ2UgPSB0cnVlOwotCi0JfSBlbHNlIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYkMyaEJ0SW5xdWlyeVBhZ2UgPSBmYWxzZTsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkRm9yQnRPcGVyYXRpb24gPSBmYWxzZTsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkUGVyaW9kQ250ID0gMDsKLQotCX0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCSgiW0JUQzJIXSwgcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYkMyaEJ0SW5xdWlyeVBhZ2UgPSV4IHBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCA9JXggcEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkRm9yQnRPcGVyYXRpb24gPSV4XG4iLAotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5iQzJoQnRJbnF1aXJ5UGFnZSwKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkUGVyaW9kQ250LAotCQlwQnRNZ250LT5FeHRDb25maWcuYkhvbGRGb3JCdE9wZXJhdGlvbikpOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIltCVEMySF0sICAgYnRJbmZvID0leCAgIHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmMyaEJ0SW5mb09yaWdpbmFsID0leFxuIiwKLQkJYnRJbmZvLCBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5jMmhCdEluZm9PcmlnaW5hbCkpOwotCWlmIChidEluZm8mQlRfSU5GT19BQ0wpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVEMySF0sIEJUSW5mbzogYkNvbm5lY3QgPSB0cnVlICAgYnRJbmZvID0leFxuIiwgYnRJbmZvKSk7Ci0JCWJCdExpbmtFeGlzdCA9IHRydWU7Ci0JCWlmICgoKGJ0SW5mbyYoQlRfSU5GT19GVFB8QlRfSU5GT19BMkRQfEJUX0lORk9fSElEfEJUX0lORk9fU0NPX0JVU1kpKSAhPSAwKSB8fAotCQkgICAgcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRSZXRyeUNudCA+IDApIHsKLQkJCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19OT05fSURMRTsKLQkJfSBlbHNlIHsKLQkJCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKLQkJfQotCi0JCWlmIChidEluZm8mQlRfSU5GT19TQ08gfHwgYnRJbmZvJkJUX0lORk9fU0NPX0JVU1kpIHsKLQkJCWlmIChidEluZm8mQlRfSU5GT19GVFAgfHwgYnRJbmZvJkJUX0lORk9fQTJEUCB8fCBidEluZm8mQlRfSU5GT19ISUQpIHsKLQkJCQlzd2l0Y2ggKGJ0SW5mbyYweGUwKSB7Ci0JCQkJY2FzZSBCVF9JTkZPX0hJRDoKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISURcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fSElEOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEJUX0lORk9fQTJEUDoKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBFcnJvciEhISBTQ08gKyBBMkRQXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQlRfSU5GT19GVFA6Ci0JCQkJCWlmIChiQnRIc01vZGVFeGlzdCkgewotCQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBQQU4oSFMpXG4iKSk7Ci0JCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19TQ087Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIFBBTihFRFIpXG4iKSk7Ci0JCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKEJUX0lORk9fSElEIHwgQlRfSU5GT19BMkRQKToKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBBMkRQXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOwotCQkJCQlicmVhazsKLQkJCQljYXNlIChCVF9JTkZPX0hJRCB8IEJUX0lORk9fRlRQKToKLQkJCQkJaWYgKGJCdEhzTW9kZUV4aXN0KSB7Ci0JCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihIUylcbiIpKTsKLQkJCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOwotCQkJCQl9IGVsc2UgewotCQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBQQU4oRURSKVxuIikpOwotCQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIChCVF9JTkZPX0EyRFAgfCBCVF9JTkZPX0ZUUCk6Ci0JCQkJCWlmIChiQnRIc01vZGVFeGlzdCkgewotCQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBBMkRQICsgUEFOKEhTKVxuIikpOwotCQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fQTJEUDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihFRFIpXG4iKSk7Ci0JCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIChCVF9JTkZPX0hJRCB8IEJUX0lORk9fQTJEUCB8IEJUX0lORk9fRlRQKToKLQkJCQkJaWYgKGJCdEhzTW9kZUV4aXN0KSB7Ci0JCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFAgKyBQQU4oSFMpXG4iKSk7Ci0JCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUCArIFBBTihFRFIpXG4iKSk7Ci0JCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFI7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFNDTyBvbmx5XG4iKSk7Ci0JCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fU0NPOwotCQkJfQotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBub24gU0NPXG4iKSk7Ci0JCQlzd2l0Y2ggKGJ0SW5mbyYweGUwKSB7Ci0JCQljYXNlIEJUX0lORk9fSElEOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgSElEXG4iKSk7Ci0JCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fSElEOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF9JTkZPX0EyRFA6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCAgQTJEUFxuIikpOwotCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0EyRFA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJUX0lORk9fRlRQOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgUEFOKEVEUilcbiIpKTsKLQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwotCQkJCWJyZWFrOwotCQkJY2FzZSAoQlRfSU5GT19ISUQgfCBCVF9JTkZPX0EyRFApOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUFxuIikpOwotCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOwotCQkJCWJyZWFrOwotCQkJY2FzZSAoQlRfSU5GT19ISUR8QlRfSU5GT19GVFApOgotCQkJCWlmIChiQnRIc01vZGVFeGlzdCkgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihIUylcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fSElEX0EyRFA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBQQU4oRURSKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgKEJUX0lORk9fQTJEUHxCVF9JTkZPX0ZUUCk6Ci0JCQkJaWYgKGJCdEhzTW9kZUV4aXN0KSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihIUylcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fQTJEUDsKLQkJCQl9IGVsc2UgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAgKyBQQU4oRURSKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChCVF9JTkZPX0hJRHxCVF9JTkZPX0EyRFB8QlRfSU5GT19GVFApOgotCQkJCWlmIChiQnRIc01vZGVFeGlzdCkgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFAgKyBQQU4oSFMpXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUCArIFBBTihFRFIpXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQX1BBTkVEUjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJfQotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDMkhdLCBCVEluZm86IGJDb25uZWN0ID0gZmFsc2VcbiIpKTsKLQkJcEJ0ZG04NzIzLT5idFN0YXR1cyA9IEJUXzJBTlRfQlRfU1RBVFVTX0lETEU7Ci0JfQotCi0JcEJ0ZG04NzIzLT5jdXJBbGdvcml0aG0gPSBhbGdvcml0aG07Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBBbGdvcml0aG0gPSAlZCBcbiIsIHBCdGRtODcyMy0+Y3VyQWxnb3JpdGhtKSk7Ci0KLS8qIEZyb20gKi8KLQlCVERNX0NoZWNrV2lGaVN0YXRlKHBhZGFwdGVyKTsKLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gTWFudWFsIGNvbnRyb2wsIHdvbid0IGV4ZWN1dGUgYnQgY29leGlzdCBtZWNoYW5pc20hIVxuIikpOwotCQlyZXR1cm47Ci0JfQotfQotCi12b2lkIEJURE1fMkFudEJ0Q29leGlzdDg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCXU4IGJ0SW5mb09yaWdpbmFsID0gMDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8yYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQ7Ci0KLQlpZiAoQlRETV9CdFByb2ZpbGVTdXBwb3J0KHBhZGFwdGVyKSkgewotCQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkRm9yQnRPcGVyYXRpb24pIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gZm9yIEJUIE9wZXJhdGlvbiBhZGp1c3QhIVxuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChwQnRNZ250LT5FeHRDb25maWcuYkhvbGRQZXJpb2RDbnQpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIb2xkIEJUIGlucXVpcnkvcGFnZSBzY2FuIHNldHRpbmcgKGNudCA9ICVkKSEhXG4iLAotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCkpOwotCQkJaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCA+PSAxMSkgewotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCA9IDA7Ci0JCQkJLyogIG5leHQgdGltZSB0aGUgY29leGlzdCBwYXJhbWV0ZXJzIHNob3VsZCBiZSByZXNldCBhZ2Fpbi4gKi8KLQkJCX0gZWxzZSB7Ci0JCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkUGVyaW9kQ250Kys7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAocEJ0RGJnLT5kYmdDdHJsKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltEYmcgY29udHJvbF0sICIpKTsKLQotCQlwQnRkbTg3MjMtPmN1ckFsZ29yaXRobSA9IGJ0ZG1fQWN0aW9uQWxnb3JpdGhtKHBhZGFwdGVyKTsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBBbGdvcml0aG0gPSAlZCBcbiIsIHBCdGRtODcyMy0+Y3VyQWxnb3JpdGhtKSk7Ci0KLQkJaWYgKGJ0ZG1fSXMyQW50ODcyM0FDb21tb25BY3Rpb24ocGFkYXB0ZXIpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50IGNvbW1vbi5cbiIpKTsKLQkJCXBCdGRtODcyMy0+YlJlc2V0VGRtYUFkanVzdCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocEJ0ZG04NzIzLT5jdXJBbGdvcml0aG0gIT0gcEJ0ZG04NzIzLT5wcmVBbGdvcml0aG0pIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIHByZUFsZ29yaXRobSA9JWQsIGN1ckFsZ29yaXRobSA9JWRcbiIsCi0JCQkJcEJ0ZG04NzIzLT5wcmVBbGdvcml0aG0sIHBCdGRtODcyMy0+Y3VyQWxnb3JpdGhtKSk7Ci0JCQkJcEJ0ZG04NzIzLT5iUmVzZXRUZG1hQWRqdXN0ID0gdHJ1ZTsKLQkJCX0KLQkJCXN3aXRjaCAocEJ0ZG04NzIzLT5jdXJBbGdvcml0aG0pIHsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fU0NPOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFNDTy5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQVNDT0FjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJUXzJBTlRfQ09FWF9BTEdPX0hJRDoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBISUQuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FISURBY3Rpb24ocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19BMkRQOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEEyRFAuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FBMkRQQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fUEFORURSOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFBBTihFRFIpLlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBUEFORURSQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fUEFOSFM6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gSFMgbW9kZS5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQVBBTkhTQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0EyRFA6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gUEFOK0EyRFAuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FQQU5FRFJBMkRQQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBQQU4oRURSKStISUQuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FQQU5FRFJISURBY3Rpb24ocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFI6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gSElEK0EyRFArUEFOLlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBSElEQTJEUFBBTkVEUkFjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEhJRCtBMkRQLlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBSElEQTJEUEFjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IDAuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FBMkRQQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXBCdGRtODcyMy0+cHJlQWxnb3JpdGhtID0gcEJ0ZG04NzIzLT5jdXJBbGdvcml0aG07Ci0JCX0KLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0gR2V0IGJ0IGluZm8gYnkgZnchIVxuIikpOwotCQkvKiBtc2cgc2hvd3MgYzJoIHJzcCBmb3IgYnRfaW5mbyBpcyByZWNlaXZlZCBvciBub3QuICovCi0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5iQzJoQnRJbmZvUmVxU2VudCkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSBjMmggZm9yIGJ0SW5mbyBub3QgcmN2ZCB5ZXQhIVxuIikpOwotCi0JCWJ0SW5mb09yaWdpbmFsID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYzJoQnRJbmZvT3JpZ2luYWw7Ci0KLQkJaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZEZvckJ0T3BlcmF0aW9uKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIGZvciBCVCBPcGVyYXRpb24gYWRqdXN0ISFcbiIpKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkUGVyaW9kQ250KSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkJKCJIb2xkIEJUIGlucXVpcnkvcGFnZSBzY2FuIHNldHRpbmcgKGNudCA9ICVkKSEhXG4iLAotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCkpOwotCQkJaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCA+PSAxMSkgewotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCA9IDA7Ci0JCQkJLyogIG5leHQgdGltZSB0aGUgY29leGlzdCBwYXJhbWV0ZXJzIHNob3VsZCBiZSByZXNldCBhZ2Fpbi4gKi8KLQkJCX0gZWxzZSB7Ci0JCQkJIHBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCsrOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHBCdERiZy0+ZGJnQ3RybCkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRGJnIGNvbnRyb2xdLCAiKSk7Ci0JCWlmIChidGRtX0lzMkFudDg3MjNBQ29tbW9uQWN0aW9uKHBhZGFwdGVyKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCBjb21tb24uXG4iKSk7Ci0JCQlwQnRkbTg3MjMtPmJSZXNldFRkbWFBZGp1c3QgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJaWYgKHBCdGRtODcyMy0+Y3VyQWxnb3JpdGhtICE9IHBCdGRtODcyMy0+cHJlQWxnb3JpdGhtKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJCQkoIltCVENvZXhdLCBwcmVBbGdvcml0aG0gPSVkLCBjdXJBbGdvcml0aG0gPSVkXG4iLAotCQkJCQlwQnRkbTg3MjMtPnByZUFsZ29yaXRobSwKLQkJCQkJcEJ0ZG04NzIzLT5jdXJBbGdvcml0aG0pKTsKLQkJCQlwQnRkbTg3MjMtPmJSZXNldFRkbWFBZGp1c3QgPSB0cnVlOwotCQkJfQotCQkJc3dpdGNoIChwQnRkbTg3MjMtPmN1ckFsZ29yaXRobSkgewotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19TQ086Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gU0NPLlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBU0NPQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fSElEOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEhJRC5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQUhJREFjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJUXzJBTlRfQ09FWF9BTEdPX0EyRFA6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gQTJEUC5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQUEyZHAocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFI6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gUEFOKEVEUikuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FQQU5FRFJBY3Rpb24ocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19QQU5IUzoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBIUyBtb2RlLlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBUEFOSFNBY3Rpb24ocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUDoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBQQU4rQTJEUC5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQVBBTkVEUkEyRFBBY3Rpb24ocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFBBTihFRFIpK0hJRC5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQVBBTkVEUkhJREFjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQX1BBTkVEUjoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBISUQrQTJEUCtQQU4uXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FISURBMkRQUEFORURSQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fSElEX0EyRFA6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gSElEK0EyRFAuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FISURBMkRQQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gMC5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQUEyRFBBY3Rpb24ocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcEJ0ZG04NzIzLT5wcmVBbGdvcml0aG0gPSBwQnRkbTg3MjMtPmN1ckFsZ29yaXRobTsKLQkJfQotCX0KLX0KLQotLyogID09PT09IEVuZCBvZiBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Yzg3MjMyQW50LmMgPT09PT0gKi8KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Yzg3MjMuYyA9PT09PSAqLwotCi1zdGF0aWMgdTggYnRDb2V4RGJnQnVmW0JUX1RNUF9CVUZfU0laRV07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBCdFByb2ZpbGVTdHJpbmdbXSA9IHsKLQkiTk9ORSIsCi0JIkEyRFAiLAotCSJQQU4iLAotCSJISUQiLAotCSJTQ08iLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IEJ0U3BlY1N0cmluZ1tdID0gewotCSIxLjBiIiwKLQkiMS4xIiwKLQkiMS4yIiwKLQkiMi4wK0VEUiIsCi0JIjIuMStFRFIiLAotCSIzLjArSFMiLAotCSI0LjAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IEJ0TGlua1JvbGVTdHJpbmdbXSA9IHsKLQkiTWFzdGVyIiwKLQkiU2xhdmUiLAotfTsKLQotc3RhdGljIHU4IGJ0ZG1fQnRXaWZpQW50TnVtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EgKnBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0KLQlpZiAoQW50X3gyID09IHBIYWxEYXRhLT5idF9jb2V4aXN0LkJUX0FudF9OdW0pIHsKLQkJaWYgKEFudF94MiA9PSBwQnRDb2V4LT5Ub3RhbEFudE51bSkKLQkJCXJldHVybiBBbnRfeDI7Ci0JCWVsc2UKLQkJCXJldHVybiBBbnRfeDE7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIEFudF94MTsKLQl9Ci0JcmV0dXJuIEFudF94MjsKLX0KLQotc3RhdGljIHZvaWQgYnRkbV9CdEh3Q291bnRlcnNNb25pdG9yKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTMyCXJlZ0hQVHhSeCwgcmVnTFBUeFJ4LCB1NFRtcDsKLQl1MzIJcmVnSFBUeCA9IDAsIHJlZ0hQUnggPSAwLCByZWdMUFR4ID0gMCwgcmVnTFBSeCA9IDA7Ci0KLQlyZWdIUFR4UnggPSBSRUdfSElHSF9QUklPUklUWV9UWFJYOwotCXJlZ0xQVHhSeCA9IFJFR19MT1dfUFJJT1JJVFlfVFhSWDsKLQotCXU0VG1wID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgcmVnSFBUeFJ4KTsKLQlyZWdIUFR4ID0gdTRUbXAgJiBiTWFza0xXb3JkOwotCXJlZ0hQUnggPSAodTRUbXAgJiBiTWFza0hXb3JkKT4+MTY7Ci0KLQl1NFRtcCA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIHJlZ0xQVHhSeCk7Ci0JcmVnTFBUeCA9IHU0VG1wICYgYk1hc2tMV29yZDsKLQlyZWdMUFJ4ID0gKHU0VG1wICYgYk1hc2tIV29yZCk+PjE2OwotCi0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuaGlnaFByaW9yaXR5VHggPSByZWdIUFR4OwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmhpZ2hQcmlvcml0eVJ4ID0gcmVnSFBSeDsKLQlwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVR4ID0gcmVnTFBUeDsKLQlwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVJ4ID0gcmVnTFBSeDsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIaWdoIFByaW9yaXR5IFR4L1J4ID0gJWQgLyAlZFxuIiwgcmVnSFBUeCwgcmVnSFBSeCkpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJMb3cgUHJpb3JpdHkgVHgvUnggPSAlZCAvICVkXG4iLCByZWdMUFR4LCByZWdMUFJ4KSk7Ci0KLQkvKiAgcmVzZXQgY291bnRlciAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIDB4NzZlLCAweGMpOwotfQotCi0vKiAgVGhpcyBmdW5jdGlvbiBjaGVjayBpZiA4NzIzIGJ0IGlzIGRpc2FibGVkICovCi1zdGF0aWMgdm9pZCBidGRtX0J0RW5hYmxlRGlzYWJsZUNoZWNrODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBidEFsaWZlID0gdHJ1ZTsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotI2lmZGVmIENIRUNLX0JUX0VYSVNUX0ZST01fUkVHCi0JdTggdmFsODsKLQotCS8qICBveDY4WzI4XT0gMSA9PiBCVCBlbmFibGU7IG90aGVyd2lzZSBkaXNhYmxlICovCi0JdmFsOCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgMHg2Qik7Ci0JaWYgKCEodmFsOCAmIEJJVCg0KSkpCi0JCWJ0QWxpZmUgPSBmYWxzZTsKLQotCWlmIChidEFsaWZlKQotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iQ3VyQnREaXNhYmxlZCA9IGZhbHNlOwotCWVsc2UKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkN1ckJ0RGlzYWJsZWQgPSB0cnVlOwotI2Vsc2UKLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuaGlnaFByaW9yaXR5VHggPT0gMCAmJgotCSAgICBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5oaWdoUHJpb3JpdHlSeCA9PSAwICYmCi0JICAgIHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmxvd1ByaW9yaXR5VHggPT0gMCAmJgotCSAgICBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVJ4ID09IDApCi0JCWJ0QWxpZmUgPSBmYWxzZTsKLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuaGlnaFByaW9yaXR5VHggPT0gMHhlYWVhICYmCi0JICAgIHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmhpZ2hQcmlvcml0eVJ4ID09IDB4ZWFlYSAmJgotCSAgICBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVR4ID09IDB4ZWFlYSAmJgotCSAgICBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVJ4ID09IDB4ZWFlYSkKLQkJYnRBbGlmZSA9IGZhbHNlOwotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5oaWdoUHJpb3JpdHlUeCA9PSAweGZmZmYgJiYKLQkgICAgcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuaGlnaFByaW9yaXR5UnggPT0gMHhmZmZmICYmCi0JICAgIHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmxvd1ByaW9yaXR5VHggPT0gMHhmZmZmICYmCi0JICAgIHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmxvd1ByaW9yaXR5UnggPT0gMHhmZmZmKQotCQlidEFsaWZlID0gZmFsc2U7Ci0JaWYgKGJ0QWxpZmUpIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYnRBY3RpdmVaZXJvQ250ID0gMDsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkN1ckJ0RGlzYWJsZWQgPSBmYWxzZTsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIjg3MjNBIEJUIGlzIGVuYWJsZWQgISFcbiIpKTsKLQl9IGVsc2UgewotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5idEFjdGl2ZVplcm9DbnQrKzsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIjg3MjNBIGJ0IGFsbCBjb3VudGVycyA9IDAsICVkIHRpbWVzISFcbiIsCi0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYnRBY3RpdmVaZXJvQ250KSk7Ci0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5idEFjdGl2ZVplcm9DbnQgPj0gMikgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkN1ckJ0RGlzYWJsZWQgPSB0cnVlOwotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIjg3MjNBIEJUIGlzIGRpc2FibGVkICEhXG4iKSk7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCWlmICghcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkN1ckJ0RGlzYWJsZWQpIHsKLQkJaWYgKEJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHBhZGFwdGVyKSkKLQkJCUJURE1fU2V0RndDaG5sSW5mbyhwYWRhcHRlciwgUlRfTUVESUFfQ09OTkVDVCk7Ci0JCWVsc2UKLQkJCUJURE1fU2V0RndDaG5sSW5mbyhwYWRhcHRlciwgUlRfTUVESUFfRElTQ09OTkVDVCk7Ci0JfQotCi0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmJQcmVCdERpc2FibGVkICE9Ci0JICAgIHBIYWxEYXRhLT5idF9jb2V4aXN0LmJDdXJCdERpc2FibGVkKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCI4NzIzQSBCVCBpcyBmcm9tICVzIHRvICVzISFcbiIsCi0JCQkocEhhbERhdGEtPmJ0X2NvZXhpc3QuYlByZUJ0RGlzYWJsZWQgPyAiZGlzYWJsZWQiOiJlbmFibGVkIiksCi0JCQkocEhhbERhdGEtPmJ0X2NvZXhpc3QuYkN1ckJ0RGlzYWJsZWQgPyAiZGlzYWJsZWQiOiJlbmFibGVkIikpKTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYlByZUJ0RGlzYWJsZWQgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5iQ3VyQnREaXNhYmxlZDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fQlRDb2V4aXN0ODcyM0FIYW5kbGVyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChidGRtX0J0V2lmaUFudE51bShwYWRhcHRlcikgPT0gQW50X3gyKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgMiBBbnQgbWVjaGFuaXNtXG4iKSk7Ci0JCUJURE1fMkFudEJ0Q29leGlzdDg3MjNBKHBhZGFwdGVyKTsKLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIDEgQW50IG1lY2hhbmlzbVxuIikpOwotCQlCVERNXzFBbnRCdENvZXhpc3Q4NzIzQShwYWRhcHRlcik7Ci0JfQotCi0JaWYgKCFCVERNX0lzU2FtZUNvZXhpc3RTdGF0ZShwYWRhcHRlcikpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBDb2V4aXN0IFN0YXRlW2JpdE1hcF0gY2hhbmdlIGZyb20gMHglImk2NGZtdCJ4IHRvIDB4JSJpNjRmbXQieFxuIiwKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LlByZXZpb3VzU3RhdGUsCi0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUpKTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuUHJldmlvdXNTdGF0ZSA9IHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZTsKLQotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiWyIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfQlQzMCkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJCVCAzLjAsICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfV0lGSV9IVDIwKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUMjAsICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfV0lGSV9IVDQwKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUNDAsICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfV0lGSV9MRUdBQ1kpCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiTGVnYWN5LCAiKSk7Ci0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJiBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9MT1cpCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiUnNzaV9Mb3csICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX01FRElVTSkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJSc3NpX01pZCwgIikpOwotCQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICYgQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfSElHSCkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJSc3NpX0hpZ2gsICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfV0lGSV9JRExFKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmlfSWRsZSwgIikpOwotCQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICYgQlRfQ09FWF9TVEFURV9XSUZJX1VQTElOSykKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpX1VwbGluaywgIikpOwotCQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICYgQlRfQ09FWF9TVEFURV9XSUZJX0RPV05MSU5LKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmlfRG93bmxpbmssICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfQlRfSURMRSkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJCVF9pZGxlLCAiKSk7Ci0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJiBCVF9DT0VYX1NUQVRFX1BST0ZJTEVfSElEKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlBST19ISUQsICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfUFJPRklMRV9BMkRQKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlBST19BMkRQLCAiKSk7Ci0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJiBCVF9DT0VYX1NUQVRFX1BST0ZJTEVfUEFOKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlBST19QQU4sICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfUFJPRklMRV9TQ08pCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiUFJPX1NDTywgIikpOwotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiXVxuIikpOwotCX0KLX0KLQotLyogIGV4dGVybiBmdW5jdGlvbiBzdGFydCB3aXRoIEJURE1fICovCi11MzIgQlRETV9CdFR4UnhDb3VudGVySChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXUzMgljb3VudGVyczsKLQotCWNvdW50ZXJzID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuaGlnaFByaW9yaXR5VHgrCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmhpZ2hQcmlvcml0eVJ4OwotCXJldHVybiBjb3VudGVyczsKLX0KLQotdTMyIEJURE1fQnRUeFJ4Q291bnRlckwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1MzIJY291bnRlcnM7Ci0KLQljb3VudGVycyA9IHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmxvd1ByaW9yaXR5VHgrCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmxvd1ByaW9yaXR5Ung7Ci0JcmV0dXJuIGNvdW50ZXJzOwotfQotCi12b2lkIEJURE1fU2V0RndDaG5sSW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBlbnVtIHJ0X21lZGlhX3N0YXR1cyBtc3RhdHVzKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0JdTggSDJDX1BhcmFtZXRlclszXSA9IHswfTsKLQl1OCBjaG5sOwotCi0JLyogIG9wTW9kZSAqLwotCWlmIChSVF9NRURJQV9DT05ORUNUID09IG1zdGF0dXMpCi0JCUgyQ19QYXJhbWV0ZXJbMF0gPSAweDE7CS8qICAwOiBkaXNjb25uZWN0ZWQsIDE6Y29ubmVjdGVkICovCi0KLQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX0FTT0NfU1RBVEUpKSB7Ci0JCS8qICBjaGFubmVsICovCi0JCWNobmwgPSBwbWxtZWV4dC0+Y3VyX2NoYW5uZWw7Ci0JCWlmIChCVERNX0lzSFQ0MChwYWRhcHRlcikpIHsKLQkJCWlmIChwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIpCi0JCQkJY2hubCAtPSAyOwotCQkJZWxzZSBpZiAocG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSKQotCQkJCWNobmwgKz0gMjsKLQkJfQotCQlIMkNfUGFyYW1ldGVyWzFdID0gY2hubDsKLQl9IGVsc2UgewkvKiAgY2hlY2sgaWYgSFMgbGluayBpcyBleGlzdHMgKi8KLQkJLyogIGNoYW5uZWwgKi8KLQkJaWYgKEJUX09wZXJhdGlvbihwYWRhcHRlcikpCi0JCQlIMkNfUGFyYW1ldGVyWzFdID0gcEJ0TWdudC0+QlRDaGFubmVsOwotCQllbHNlCi0JCQlIMkNfUGFyYW1ldGVyWzFdID0gcG1sbWVleHQtPmN1cl9jaGFubmVsOwotCX0KLQotCWlmIChCVERNX0lzSFQ0MChwYWRhcHRlcikpCi0JCUgyQ19QYXJhbWV0ZXJbMl0gPSAweDMwOwotCWVsc2UKLQkJSDJDX1BhcmFtZXRlclsyXSA9IDB4MjA7Ci0KLQlGaWxsSDJDQ21kKHBhZGFwdGVyLCAweDE5LCAzLCBIMkNfUGFyYW1ldGVyKTsKLX0KLQotdTggQlRETV9Jc1dpZmlDb25uZWN0aW9uRXhpc3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBiUmV0ID0gZmFsc2U7Ci0KLQlpZiAoQlRIQ0lfSHNDb25uZWN0aW9uRXN0YWJsaXNoZWQocGFkYXB0ZXIpKQotCQliUmV0ID0gdHJ1ZTsKLQotCWlmIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfQVNPQ19TVEFURSkgPT0gdHJ1ZSkKLQkJYlJldCA9IHRydWU7Ci0KLQlyZXR1cm4gYlJldDsKLX0KLQotdm9pZCBCVERNX1NldEZ3M2EoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl1OCBieXRlMSwKLQl1OCBieXRlMiwKLQl1OCBieXRlMywKLQl1OCBieXRlNCwKLQl1OCBieXRlNQotCSkKLXsKLQl1OCBIMkNfUGFyYW1ldGVyWzVdID0gezB9OwotCi0JaWYgKHJ0bDg3MjNhX0JUX3VzaW5nX2FudGVubmFfMShwYWRhcHRlcikpIHsKLQkJaWYgKCghY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSAmJgotCQkgICAgKGdldF9md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYpICE9IFdJRklfTlVMTF9TVEFURSkpIHsKLQkJCS8qICBmb3Igc29mdGFwIG1vZGUgKi8KLQkJCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCQkJc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EgKnBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0JCQl1OCBCdFN0YXRlID0gcEJ0Q29leC0+YzJoQnRJbmZvOwotCi0JCQlpZiAoKEJ0U3RhdGUgIT0gQlRfSU5GT19TVEFURV9OT19DT05ORUNUSU9OKSAmJgotCQkJICAgIChCdFN0YXRlICE9IEJUX0lORk9fU1RBVEVfQ09OTkVDVF9JRExFKSkgewotCQkJCWlmIChieXRlMSAmIEJJVCg0KSkgewotCQkJCQlieXRlMSAmPSB+QklUKDQpOwotCQkJCQlieXRlMSB8PSBCSVQoNSk7Ci0JCQkJfQotCi0JCQkJYnl0ZTUgfD0gQklUKDUpOwotCQkJCWlmIChieXRlNSAmIEJJVCg2KSkKLQkJCQkJYnl0ZTUgJj0gfkJJVCg2KTsKLQkJCX0KLQkJfQotCX0KLQotCUgyQ19QYXJhbWV0ZXJbMF0gPSBieXRlMTsKLQlIMkNfUGFyYW1ldGVyWzFdID0gYnl0ZTI7Ci0JSDJDX1BhcmFtZXRlclsyXSA9IGJ5dGUzOwotCUgyQ19QYXJhbWV0ZXJbM10gPSBieXRlNDsKLQlIMkNfUGFyYW1ldGVyWzRdID0gYnl0ZTU7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEZXIHdyaXRlIDB4M2EoNWJ5dGVzKSA9IDB4JTAyeCUwOHhcbiIsCi0JCUgyQ19QYXJhbWV0ZXJbMF0sCi0JCUgyQ19QYXJhbWV0ZXJbMV08PDI0fEgyQ19QYXJhbWV0ZXJbMl08PDE2fEgyQ19QYXJhbWV0ZXJbM108PDh8SDJDX1BhcmFtZXRlcls0XSkpOwotCi0JRmlsbEgyQ0NtZChwYWRhcHRlciwgMHgzYSwgNSwgSDJDX1BhcmFtZXRlcik7Ci19Ci0KLXZvaWQgQlRETV9RdWVyeUJ0SW5mb3JtYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBIMkNfUGFyYW1ldGVyWzFdID0gezB9OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EgKnBCdENvZXg7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcEJ0Q29leCA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMzsKLQotCWlmICghcnRsODcyM2FfQlRfZW5hYmxlZChwYWRhcHRlcikpIHsKLQkJcEJ0Q29leC0+YzJoQnRJbmZvID0gQlRfSU5GT19TVEFURV9ESVNBQkxFRDsKLQkJcEJ0Q29leC0+YkMyaEJ0SW5mb1JlcVNlbnQgPSBmYWxzZTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwQnRDb2V4LT5jMmhCdEluZm8gPT0gQlRfSU5GT19TVEFURV9ESVNBQkxFRCkKLQkJcEJ0Q29leC0+YzJoQnRJbmZvID0gQlRfSU5GT19TVEFURV9OT19DT05ORUNUSU9OOwotCi0JaWYgKHBCdENvZXgtPmJDMmhCdEluZm9SZXFTZW50ID09IHRydWUpCi0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgZGlkbid0IHJlY3YgcHJldmlvdXMgQnRJbmZvIHJlcG9ydCFcbiIpKTsKLQllbHNlCi0JCXBCdENvZXgtPmJDMmhCdEluZm9SZXFTZW50ID0gdHJ1ZTsKLQotCUgyQ19QYXJhbWV0ZXJbMF0gfD0gQklUKDApOwkvKiAgdHJpZ2dlciAqLwotCi0vKlJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgUXVlcnkgQnQgaW5mb3JtYXRpb24sIHdyaXRlIDB4MzggPSAweCV4XG4iLCAqLwotLypIMkNfUGFyYW1ldGVyWzBdKSk7ICovCi0KLQlGaWxsSDJDQ21kKHBhZGFwdGVyLCAweDM4LCAxLCBIMkNfUGFyYW1ldGVyKTsKLX0KLQotdm9pZCBCVERNX1NldFN3UmZSeExwZkNvcm5lcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0eXBlKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JaWYgKEJUX1JGX1JYX0xQRl9DT1JORVJfU0hSSU5LID09IHR5cGUpIHsKLQkJLyogU2hyaW5rIFJGIFJ4IExQRiBjb3JuZXIgKi8KLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlNocmluayBSRiBSeCBMUEYgY29ybmVyISFcbiIpKTsKLQkJUEhZX1NldFJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgMHgxZSwgYlJGUmVnT2Zmc2V0TWFzaywgMHhmMGZmNyk7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJTV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQl9IGVsc2UgaWYgKEJUX1JGX1JYX0xQRl9DT1JORVJfUkVTVU1FID09IHR5cGUpIHsKLQkJLyogUmVzdW1lIFJGIFJ4IExQRiBjb3JuZXIgKi8KLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlJlc3VtZSBSRiBSeCBMUEYgY29ybmVyISFcbiIpKTsKLQkJUEhZX1NldFJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgMHgxZSwgYlJGUmVnT2Zmc2V0TWFzaywgcEhhbERhdGEtPmJ0X2NvZXhpc3QuQnRSZlJlZ09yaWdpbjFFKTsKLQl9Ci19Ci0KLXZvaWQKLUJURE1fU2V0U3dQZW5hbHR5VHhSYXRlQWRhcHRpdmUoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl1OCByYVR5cGUKLQkpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggdG1wVTE7Ci0KLQl0bXBVMSA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgMHg0ZmQpOwotCXRtcFUxIHw9IEJJVCgwKTsKLQlpZiAoQlRfVFhfUkFURV9BREFQVElWRV9MT1dfUEVOQUxUWSA9PSByYVR5cGUpIHsKLQkJdG1wVTEgJj0gfkJJVCgyKTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYlNXQ29leGlzdEFsbE9mZiA9IGZhbHNlOwotCX0gZWxzZSBpZiAoQlRfVFhfUkFURV9BREFQVElWRV9OT1JNQUwgPT0gcmFUeXBlKSB7Ci0JCXRtcFUxIHw9IEJJVCgyKTsKLQl9Ci0KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDRmZCwgdG1wVTEpOwotfQotCi12b2lkIEJURE1fU2V0RndEZWNCdFB3cihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiRGVjQnRQd3IpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggSDJDX1BhcmFtZXRlclsxXSA9IHswfTsKLQotCUgyQ19QYXJhbWV0ZXJbMF0gPSAwOwotCi0JaWYgKGJEZWNCdFB3cikgewotCQlIMkNfUGFyYW1ldGVyWzBdIHw9IEJJVCgxKTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkZXQ29leGlzdEFsbE9mZiA9IGZhbHNlOwotCX0KLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgZGVjcmVhc2UgQnQgUG93ZXIgOiAlcywgd3JpdGUgMHgyMSA9IDB4JXhcbiIsCi0JCShiRGVjQnRQd3IgPyAiWWVzISEiIDogIk5vISEiKSwgSDJDX1BhcmFtZXRlclswXSkpOwotCi0JRmlsbEgyQ0NtZChwYWRhcHRlciwgMHgyMSwgMSwgSDJDX1BhcmFtZXRlcik7Ci19Ci0KLXU4IEJURE1fQnRQcm9maWxlU3VwcG9ydChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IGJSZXQgPSBmYWxzZTsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChwQnRNZ250LT5iU3VwcG9ydFByb2ZpbGUgJiYKLQkgICAgIXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJGb3JjZUZ3QnRJbmZvKQotCQliUmV0ID0gdHJ1ZTsKLQotCXJldHVybiBiUmV0OwotfQotCi1zdGF0aWMgdm9pZCBCVERNX0FkanVzdEZvckJ0T3BlcmF0aW9uODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQkvKiBCVERNXzJBbnRBZGp1c3RGb3JCdE9wZXJhdGlvbjg3MjMocGFkYXB0ZXIpOyAqLwotfQotCi1zdGF0aWMgdm9pZCBCVERNX0Z3QzJoQnRSc3NpODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnRtcEJ1ZikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1OCBwZXJjZW50LCB1MXRtcDsKLQotCXUxdG1wID0gdG1wQnVmWzBdOwotCXBlcmNlbnQgPSB1MXRtcCoyKzEwOwotCi0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRSc3NpID0gcGVyY2VudDsKLS8qUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVEMySF0sIEJUIFJTU0kgPSVkXG4iLCBwZXJjZW50KSk7ICovCi19Ci0KLXZvaWQKLXJ0bDg3MjNhX2Z3X2MyaF9CVF9pbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICp0bXBCdWYsIHU4IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0Jc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EgKnBCdENvZXg7Ci0JdTggaTsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0KLQlwQnRDb2V4LT5iQzJoQnRJbmZvUmVxU2VudCA9IGZhbHNlOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVEMySF0sIEJUIGluZm9bJWRdPVsiLCBsZW5ndGgpKTsKLQotCXBCdENvZXgtPmJ0UmV0cnlDbnQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQlzd2l0Y2ggKGkpIHsKLQkJY2FzZSAwOgotCQkJcEJ0Q29leC0+YzJoQnRJbmZvT3JpZ2luYWwgPSB0bXBCdWZbaV07Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJcEJ0Q29leC0+YnRSZXRyeUNudCA9IHRtcEJ1ZltpXTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlCVERNX0Z3QzJoQnRSc3NpODcyM0EocGFkYXB0ZXIsICZ0bXBCdWZbaV0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCXBCdENvZXgtPmJ0SW5mb0V4dCA9IHRtcEJ1ZltpXSZCSVQoMCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChpID09IGxlbmd0aC0xKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIjB4JTAyeF1cbiIsIHRtcEJ1ZltpXSkpOwotCQllbHNlCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiMHglMDJ4LCAiLCB0bXBCdWZbaV0pKTsKLQl9Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVEMySF0sIEJUIFJTU0kgPSVkXG4iLCBwQnRDb2V4LT5idFJzc2kpKTsKLQlpZiAocEJ0Q29leC0+YnRJbmZvRXh0KQotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQzJIXSwgcEJ0Q29leC0+YnRJbmZvRXh0ID0leFxuIiwgcEJ0Q29leC0+YnRJbmZvRXh0KSk7Ci0KLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MSkKLQkJQlRETV8xQW50RndDMmhCdEluZm84NzIzQShwYWRhcHRlcik7Ci0JZWxzZQotCQlCVERNXzJBbnRGd0MyaEJ0SW5mbzg3MjNBKHBhZGFwdGVyKTsKLQotCWlmIChwQnRNZ250LT5FeHRDb25maWcuYk1hbnVhbENvbnRyb2wpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIiVzOiBBY3Rpb24gTWFudWFsIGNvbnRyb2whIVxuIiwgX19mdW5jX18pKTsKLQkJcmV0dXJuOwotCX0KLQotCWJ0ZG1fQlRDb2V4aXN0ODcyM0FIYW5kbGVyKHBhZGFwdGVyKTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV9EaXNwbGF5ODcyM0FCdENvZXhJbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EgKnBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0JdTggdTFUbXAsIHUxVG1wMSwgdTFUbXAyLCBpLCBidEluZm9FeHQsIHBzVGRtYUNhc2UgPSAwOwotCXUzMiB1NFRtcFs0XTsKLQl1OCBhbnROdW0gPSBBbnRfeDI7Ci0KLQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gPT09PT09PT09PT09W0JUIENvZXhpc3QgaW5mb109PT09PT09PT09PT0iKTsKLQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCi0JaWYgKCFydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSkgewotCQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gQlQgbm90IGV4aXN0cyAhISEiKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQkJcmV0dXJuOwotCX0KLQotCWFudE51bSA9IGJ0ZG1fQnRXaWZpQW50TnVtKHBhZGFwdGVyKTsKLQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8lZCAiLCAiQW50IG1lY2hhbmlzbSBQRy9Ob3cgcnVuIDoiLCBcCi0JCSgocEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQW50X051bSA9PSBBbnRfeDIpID8gMiA6IDEpLCAoKGFudE51bSA9PSBBbnRfeDIpID8gMiA6IDEpKTsKLQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkgewotCQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiW0FjdGlvbiBNYW51YWwgY29udHJvbF0hISIpOwotCQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCX0gZWxzZSB7Ci0JCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzIC8gJWQiLCAiQlQgc3RhY2svIGhjaSBleHQgdmVyIiwgXAotCQkJKChwQnRNZ250LT5iU3VwcG9ydFByb2ZpbGUpID8gIlllcyIgOiAiTm8iKSwgcEJ0TWdudC0+RXh0Q29uZmlnLkhDSUV4dGVuc2lvblZlcik7Ci0JCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0JfQotCi0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcbiAlLTM1cyA9IC8gJWQiLCAiRG90MTEgY2hhbm5lbCAvIEJUIGNoYW5uZWwiLCBcCi0JCXBCdE1nbnQtPkJUQ2hhbm5lbCk7Ci0JCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxuICUtMzVzID0gJWQgLyAlZCAvICVkIiwgIldpZmkvQlQvSFMgcnNzaSIsIFwKLQkJQlRETV9HZXRSeFNTKHBhZGFwdGVyKSwKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRSc3NpLAotCQlwSGFsRGF0YS0+ZG1wcml2LkVudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIpOwotCQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCWlmICghcEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKSB7Ci0JCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXG4gJS0zNXMgPSAlcyAvICVzICIsICJXSWZpIHN0YXR1cyIsCi0JCQkoKEJURE1fTGVnYWN5KHBhZGFwdGVyKSkgPyAiTGVnYWN5IiA6ICgoKEJURE1fSXNIVDQwKHBhZGFwdGVyKSkgPyAiSFQ0MCIgOiAiSFQyMCIpKSksCi0JCQkoKCFCVERNX0lzV2lmaUJ1c3kocGFkYXB0ZXIpKSA/ICJpZGxlIiA6ICgoQlRETV9Jc1dpZmlVcGxpbmsocGFkYXB0ZXIpKSA/ICJ1cGxpbmsiIDogImRvd25saW5rIikpKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCQlpZiAocEJ0TWdudC0+YlN1cHBvcnRQcm9maWxlKSB7Ci0JCQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAvICVkIC8gJWQgLyAlZCIsICJTQ08vSElEL1BBTi9BMkRQIiwKLQkJCQkoKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX1NDTykpID8gMSA6IDApLAotCQkJCSgoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfSElEKSkgPyAxIDogMCksCi0JCQkJKChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pKSA/IDEgOiAwKSwKLQkJCQkoKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0EyRFApKSA/IDEgOiAwKSk7Ci0JCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGU7IGkrKykgewotCQkJCWlmIChwQnRNZ250LT5FeHRDb25maWcuSENJRXh0ZW5zaW9uVmVyID49IDEpIHsKLQkJCQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMvICVzLyAlcyIsICJCdCBsaW5rIHR5cGUvc3BlYy9yb2xlIiwKLQkJCQkJCUJ0UHJvZmlsZVN0cmluZ1twQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRQcm9maWxlXSwKLQkJCQkJCUJ0U3BlY1N0cmluZ1twQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRDb3JlU3BlY10sCi0JCQkJCQlCdExpbmtSb2xlU3RyaW5nW3BCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5saW5rUm9sZV0pOwotCQkJCQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCi0JCQkJCWJ0SW5mb0V4dCA9IHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5mb0V4dDsKLQkJCQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMiLCAiQTJEUCByYXRlIiwgXAotCQkJCQkJIChidEluZm9FeHQgJiBCSVQoMCkpID8KLQkJCQkJCSAiQmFzaWMgcmF0ZSIgOiAiRURSIHJhdGUiKTsKLQkJCQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcy8gJXMiLCAiQnQgbGluayB0eXBlL3NwZWMiLCBcCi0JCQkJCQlCdFByb2ZpbGVTdHJpbmdbcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUUHJvZmlsZV0sCi0JCQkJCQlCdFNwZWNTdHJpbmdbcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUQ29yZVNwZWNdKTsKLQkJCQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAgU3cgbWVjaGFuaXNtICovCi0JaWYgKCFwQnRNZ250LT5FeHRDb25maWcuYk1hbnVhbENvbnRyb2wpIHsKLQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwgIj09PT09PT09PT09PVtTdyBCVCBDb2V4IG1lY2hhbmlzbV09PT09PT09PT09PT0iKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgIiwgIkFHQyBUYWJsZSIsIFwKLQkJCXBCdENvZXgtPmJ0ZG0yQW50LmJDdXJBZ2NUYWJsZUVuKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgIiwgIkFEQyBCYWNrb2ZmIiwgXAotCQkJcEJ0Q29leC0+YnRkbTJBbnQuYkN1ckFkY0JhY2tPZmYpOwotCQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAiLCAiTG93IHBlbmFsdHkgUkEiLCBcCi0JCQlwQnRDb2V4LT5idGRtMkFudC5iQ3VyTG93UGVuYWx0eVJhKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgIiwgIlJGIFJ4IExQRiBTaHJpbmsiLCBcCi0JCQlwQnRDb2V4LT5idGRtMkFudC5iQ3VyUmZSeExwZlNocmluayk7Ci0JCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0JfQotCXU0VG1wWzBdID0gUEhZX1F1ZXJ5UkZSZWcocGFkYXB0ZXIsIFBhdGhBLCAweDFlLCAweGZmMCk7Ci0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleCIsICJSRi1BLCAweDFlWzExOjRdL29yaWdpbmFsIHZhbCIsIFwKLQkJdTRUbXBbMF0sIHBIYWxEYXRhLT5idF9jb2V4aXN0LkJ0UmZSZWdPcmlnaW4xRSk7Ci0JRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCS8qICBGdyBtZWNoYW5pc20gKi8KLQlpZiAoIXBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkgewotCQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiPT09PT09PT09PT09W0Z3IEJUIENvZXggbWVjaGFuaXNtXT09PT09PT09PT09PSIpOwotCQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCX0KLQlpZiAoIXBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkgewotCQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MSkKLQkJCXBzVGRtYUNhc2UgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudC5jdXJQc1RkbWE7Ci0JCWVsc2UKLQkJCXBzVGRtYUNhc2UgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMkFudC5jdXJQc1RkbWE7Ci0JCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICUqcGggY2FzZS0lZCIsCi0JCQkgIlBTIFRETUEoMHgzYSkiLCA1LCBwSGFsRGF0YS0+YnRfY29leGlzdC5mdzNhVmFsLCBwc1RkbWFDYXNlKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAiLCAiRGVjcmVhc2UgQnQgUG93ZXIiLCBcCi0JCQlwQnRDb2V4LT5idGRtMkFudC5iQ3VyRGVjQnRQd3IpOwotCQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCX0KLQl1MVRtcCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgMHg3NzgpOwotCXUxVG1wMSA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgMHg3ODMpOwotCXUxVG1wMiA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgMHg3OTYpOwotCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgiLCAiMHg3NzgvIDB4NzgzLyAweDc5NiIsIFwKLQkJdTFUbXAsIHUxVG1wMSwgdTFUbXAyKTsKLQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCi0JaWYgKCFwQnRNZ250LT5FeHRDb25maWcuYk1hbnVhbENvbnRyb2wpIHsKLQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCAvIDB4JXgiLCAiU3cgRGFjU3dpbmcgQ3RybC9WYWwiLCBcCi0JCQlwQnRDb2V4LT5idGRtMkFudC5iQ3VyRGFjU3dpbmdPbiwgcEJ0Q29leC0+YnRkbTJBbnQuY3VyRGFjU3dpbmdMdmwpOwotCQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCX0KLQl1NFRtcFswXSA9ICBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCAweDg4MCk7Ci0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDg4MCIsIFwKLQkJdTRUbXBbMF0pOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQkvKiAgSHcgbWVjaGFuaXNtICovCi0JaWYgKCFwQnRNZ250LT5FeHRDb25maWcuYk1hbnVhbENvbnRyb2wpIHsKLQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwgIj09PT09PT09PT09PVtIdyBCVCBDb2V4IG1lY2hhbmlzbV09PT09PT09PT09PT0iKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQl9Ci0KLQl1MVRtcCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgMHg0MCk7Ci0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDQwIiwgXAotCQl1MVRtcCk7Ci0JRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCXU0VG1wWzBdID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgMHg1NTApOwotCXUxVG1wID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCAweDUyMik7Ci0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8weCV4IiwgIjB4NTUwKGJjbiBjb250cmwpLzB4NTIyIiwgXAotCQl1NFRtcFswXSwgdTFUbXApOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQl1NFRtcFswXSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4NDg0KTsKLQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4IiwgIjB4NDg0KHJhdGUgYWRhcHRpdmUpIiwgXAotCQl1NFRtcFswXSk7Ci0JRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCXU0VG1wWzBdID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgMHg1MCk7Ci0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweGM1MChkaWcpIiwgXAotCQl1NFRtcFswXSk7Ci0JRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCXU0VG1wWzBdID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgMHhkYTApOwotCXU0VG1wWzFdID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgMHhkYTQpOwotCXU0VG1wWzJdID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgMHhkYTgpOwotCXU0VG1wWzNdID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgMHhkYWMpOwotCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgvIDB4JXgiLCAiMHhkYTAvMHhkYTQvMHhkYTgvMHhkYWMoRkEgY250KSIsIFwKLQkJdTRUbXBbMF0sIHU0VG1wWzFdLCB1NFRtcFsyXSwgdTRUbXBbM10pOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQl1NFRtcFswXSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4NmMwKTsKLQl1NFRtcFsxXSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4NmM0KTsKLQl1NFRtcFsyXSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4NmM4KTsKLQl1MVRtcCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgMHg2Y2MpOwotCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgvIDB4JXgiLCAiMHg2YzAvMHg2YzQvMHg2YzgvMHg2Y2MoY29leFRhYmxlKSIsIFwKLQkJdTRUbXBbMF0sIHU0VG1wWzFdLCB1NFRtcFsyXSwgdTFUbXApOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQkvKiB1NFRtcCA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4NzcwKTsgKi8KLQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAvICVkIiwgIjB4NzcwKEhpIHByaSBSeFszMToxNl0vVHhbMTU6MF0pIiwgXAotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5oaWdoUHJpb3JpdHlSeCwKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuaGlnaFByaW9yaXR5VHgpOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0JLyogdTRUbXAgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCAweDc3NCk7ICovCi0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgLyAlZCIsICIweDc3NChMbyBwcmkgUnhbMzE6MTZdL1R4WzE1OjBdKSIsIFwKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMubG93UHJpb3JpdHlSeCwKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMubG93UHJpb3JpdHlUeCk7Ci0JRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCS8qICBUeCBtZ250IHF1ZXVlIGhhbmcgb3Igbm90LCAweDQxYiBzaG91bGQgPSAweGYsIGV4OiAweGQgPT0+aGFuZyAqLwotCXUxVG1wID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCAweDQxYik7Ci0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDQxYiAoaGFuZyBjaGsgPT0gMHhmKSIsIFwKLQkJdTFUbXApOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICJsYXN0SE1FQm94TnVtIiwgXAotCQlwSGFsRGF0YS0+TGFzdEhNRUJveE51bSk7Ci0JRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLUJURE1fODcyM0FTaWduYWxDb21wZW5zYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgdTggKnJzc2lfd2lmaSwgdTggKnJzc2lfYnQpCi17Ci0JaWYgKGJ0ZG1fQnRXaWZpQW50TnVtKHBhZGFwdGVyKSA9PSBBbnRfeDEpCi0JCUJURE1fMUFudFNpZ25hbENvbXBlbnNhdGlvbihwYWRhcHRlciwgcnNzaV93aWZpLCByc3NpX2J0KTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV84NzIzQUluaXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MikKLQkJQlRETV8yQW50UGFyYUluaXQocGFkYXB0ZXIpOwotCWVsc2UKLQkJQlRETV8xQW50UGFyYUluaXQocGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNX0hXQ29leEFsbE9mZjg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKQotCQlyZXR1cm47Ci0KLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MikKLQkJQlRETV8yQW50SHdDb2V4QWxsT2ZmODcyM0EocGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNX0ZXQ29leEFsbE9mZjg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKQotCQlyZXR1cm47Ci0KLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MikKLQkJQlRETV8yQW50RndDb2V4QWxsT2ZmODcyM0EocGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNX1NXQ29leEFsbE9mZjg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKQotCQlyZXR1cm47Ci0KLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MikKLQkJQlRETV8yQW50U3dDb2V4QWxsT2ZmODcyM0EocGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZAotQlRETV9TZXQ4NzIzQUJ0Q29leEN1cnJBbnROdW0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYW50TnVtKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4ID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzOwotCi0JaWYgKGFudE51bSA9PSAxKQotCQlwQnRDb2V4LT5Ub3RhbEFudE51bSA9IEFudF94MTsKLQllbHNlIGlmIChhbnROdW0gPT0gMikKLQkJcEJ0Q29leC0+VG90YWxBbnROdW0gPSBBbnRfeDI7Ci19Ci0KLXZvaWQgcnRsODcyM2FfQlRfbHBzX2xlYXZlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKQotCQlyZXR1cm47Ci0KLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MSkKLQkJQlRETV8xQW50THBzTGVhdmUocGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNX0ZvckhhbHQ4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkKLQkJcmV0dXJuOwotCi0JaWYgKGJ0ZG1fQnRXaWZpQW50TnVtKHBhZGFwdGVyKSA9PSBBbnRfeDEpCi0JCUJURE1fMUFudEZvckhhbHQocGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNX1dpZmlTY2FuTm90aWZ5ODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggc2NhblR5cGUpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKQotCQlyZXR1cm47Ci0KLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MSkKLQkJQlRETV8xQW50V2lmaVNjYW5Ob3RpZnkocGFkYXB0ZXIsIHNjYW5UeXBlKTsKLX0KLQotc3RhdGljIHZvaWQKLUJURE1fV2lmaUFzc29jaWF0ZU5vdGlmeTg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGFjdGlvbikKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCWlmIChwQnRNZ250LT5FeHRDb25maWcuYk1hbnVhbENvbnRyb2wpCi0JCXJldHVybjsKLQotCWlmIChidGRtX0J0V2lmaUFudE51bShwYWRhcHRlcikgPT0gQW50X3gxKQotCQlCVERNXzFBbnRXaWZpQXNzb2NpYXRlTm90aWZ5KHBhZGFwdGVyLCBhY3Rpb24pOwotfQotCi1zdGF0aWMgdm9pZAotQlRETV9NZWRpYVN0YXR1c05vdGlmeTg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgZW51bSBydF9tZWRpYV9zdGF0dXMgbXN0YXR1cykKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgTWVkaWFTdGF0dXNOb3RpZnksICVzXG4iLAotCQltc3RhdHVzPyJjb25uZWN0IjoiZGlzY29ubmVjdCIpKTsKLQotCUJURE1fU2V0RndDaG5sSW5mbyhwYWRhcHRlciwgbXN0YXR1cyk7Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKQotCQlyZXR1cm47Ci0KLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MSkKLQkJQlRETV8xQW50TWVkaWFTdGF0dXNOb3RpZnkocGFkYXB0ZXIsIG1zdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNX0ZvckRoY3A4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkKLQkJcmV0dXJuOwotCi0JaWYgKGJ0ZG1fQnRXaWZpQW50TnVtKHBhZGFwdGVyKSA9PSBBbnRfeDEpCi0JCUJURE1fMUFudEZvckRoY3AocGFkYXB0ZXIpOwotfQotCi1ib29sIHJ0bDg3MjNhX0JUX3VzaW5nX2FudGVubmFfMShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWlmIChidGRtX0J0V2lmaUFudE51bShwYWRhcHRlcikgPT0gQW50X3gxKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV9CVENvZXhpc3Q4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQlzdHJ1Y3QgYnRfY29leGlzdF84NzIzYSAqcEJ0Q29leDsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIGJlYWNvbiBSU1NJID0gMHgleCglZClcbiIsCi0JCXBIYWxEYXRhLT5kbXByaXYuRW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQiwKLQkJcEhhbERhdGEtPmRtcHJpdi5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCKSk7Ci0KLQlidGRtX0J0SHdDb3VudGVyc01vbml0b3IocGFkYXB0ZXIpOwotCWJ0ZG1fQnRFbmFibGVEaXNhYmxlQ2hlY2s4NzIzQShwYWRhcHRlcik7Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCIlczogQWN0aW9uIE1hbnVhbCBjb250cm9sISFcbiIsIF9fZnVuY19fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocEJ0Q29leC0+YkMyaEJ0SW5mb1JlcVNlbnQpIHsKLQkJaWYgKCFydGw4NzIzYV9CVF9lbmFibGVkKHBhZGFwdGVyKSkgewotCQkJcEJ0Q29leC0+YzJoQnRJbmZvID0gQlRfSU5GT19TVEFURV9ESVNBQkxFRDsKLQkJfSBlbHNlIHsKLQkJCWlmIChwQnRDb2V4LT5jMmhCdEluZm8gPT0gQlRfSU5GT19TVEFURV9ESVNBQkxFRCkKLQkJCQlwQnRDb2V4LT5jMmhCdEluZm8gPSBCVF9JTkZPX1NUQVRFX05PX0NPTk5FQ1RJT047Ci0JCX0KLQotCQlidGRtX0JUQ29leGlzdDg3MjNBSGFuZGxlcihwYWRhcHRlcik7Ci0JfSBlbHNlIGlmICghcnRsODcyM2FfQlRfZW5hYmxlZChwYWRhcHRlcikpIHsKLQkJcEJ0Q29leC0+YzJoQnRJbmZvID0gQlRfSU5GT19TVEFURV9ESVNBQkxFRDsKLQkJYnRkbV9CVENvZXhpc3Q4NzIzQUhhbmRsZXIocGFkYXB0ZXIpOwotCX0KLQotCUJURE1fUXVlcnlCdEluZm9ybWF0aW9uKHBhZGFwdGVyKTsKLX0KLQotLyogID09PT09IEVuZCBvZiBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Yzg3MjMuYyA9PT09PSAqLwotCi0vKiAgPT09PT0gQmVsb3cgdGhpcyBsaW5lIGlzIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjQ3NyMUFudC5jID09PT09ICovCi0KLS8qICBsb2NhbCBmdW5jdGlvbiBzdGFydCB3aXRoIGJ0ZG1fICovCi0vKiAgZXh0ZXJuIGZ1bmN0aW9uIHN0YXJ0IHdpdGggQlRETV8gKi8KLQotc3RhdGljIHZvaWQgQlRETV9TZXRBbnRlbm5hKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHdobykKLXsKLX0KLQotdm9pZAotQlRETV9TaW5nbGVBbnQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl1OCBiU2luZ2xlQW50T24sCi0JdTggYkludGVycnVwdE9uLAotCXU4IGJNdWx0aU5BVk9uCi0JKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXU4IEgyQ19QYXJhbWV0ZXJbM10gPSB7MH07Ci0KLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQW50X051bSAhPSBBbnRfeDEpCi0JCXJldHVybjsKLQotCUgyQ19QYXJhbWV0ZXJbMl0gPSAwOwotCUgyQ19QYXJhbWV0ZXJbMV0gPSAwOwotCUgyQ19QYXJhbWV0ZXJbMF0gPSAwOwotCi0JaWYgKGJJbnRlcnJ1cHRPbikgewotCQlIMkNfUGFyYW1ldGVyWzJdIHw9IDB4MDI7CS8qIEJJVDEgKi8KLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkZXQ29leGlzdEFsbE9mZiA9IGZhbHNlOwotCX0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5iSW50ZXJydXB0T24gPSBiSW50ZXJydXB0T247Ci0KLQlpZiAoYlNpbmdsZUFudE9uKSB7Ci0JCUgyQ19QYXJhbWV0ZXJbMl0gfD0gMHgxMDsJLyogQklUNCAqLwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iRldDb2V4aXN0QWxsT2ZmID0gZmFsc2U7Ci0JfQotCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJTaW5nbGVBbnRPbiA9IGJTaW5nbGVBbnRPbjsKLQotCWlmIChiTXVsdGlOQVZPbikgewotCQlIMkNfUGFyYW1ldGVyWzJdIHw9IDB4MjA7CS8qIEJJVDUgKi8KLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkZXQ29leGlzdEFsbE9mZiA9IGZhbHNlOwotCX0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5iTXVsdGlOQVZPbiA9IGJNdWx0aU5BVk9uOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBTaW5nbGVBbnRlbm5hID1bJXM6JXM6JXNdLCB3cml0ZSAweGUgPSAweCV4XG4iLAotCQliU2luZ2xlQW50T24/Ik9OIjoiT0ZGIiwgYkludGVycnVwdE9uPyJPTiI6Ik9GRiIsIGJNdWx0aU5BVk9uPyJPTiI6Ik9GRiIsCi0JCUgyQ19QYXJhbWV0ZXJbMF08PDE2fEgyQ19QYXJhbWV0ZXJbMV08PDh8SDJDX1BhcmFtZXRlclsyXSkpOwotfQotCi12b2lkIEJURE1fQ2hlY2tCVElkbGVDaGFuZ2UxQW50KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0JdTggCXN0YXRlQ2hhbmdlID0gZmFsc2U7Ci0JdTMyCQkJQlRfUG9sbGluZywgUmF0aW9fQWN0LCBSYXRpb19TVEE7Ci0JdTMyCQkJCUJUX0FjdGl2ZSwgQlRfU3RhdGU7Ci0JdTMyCQkJCXJlZ0JUQWN0aXZlID0gMCwgcmVnQlRTdGF0ZSA9IDAsIHJlZ0JUUG9sbGluZyA9IDA7Ci0KLQlpZiAoIXJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKQotCQlyZXR1cm47Ci0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkKLQkJcmV0dXJuOwotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5CVF9Db2V4aXN0VHlwZSAhPSBCVF9DU1JfQkM4KQotCQlyZXR1cm47Ci0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkJUX0FudF9OdW0gIT0gQW50X3gxKQotCQlyZXR1cm47Ci0KLQkvKiAgVGhlIGZvbGxvd2luZyB3ZSBvbmx5IGNvbnNpZGVyIENTUiBCQzggYW5kIGZ3IHZlcnNpb24gc2hvdWxkIGJlID49IDYyICovCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBGaXJtd2FyZVZlcnNpb24gPSAweCV4KCVkKVxuIiwKLQlwSGFsRGF0YS0+RmlybXdhcmVWZXJzaW9uLCBwSGFsRGF0YS0+RmlybXdhcmVWZXJzaW9uKSk7Ci0JcmVnQlRBY3RpdmUgPSBSRUdfQlRfQUNUSVZFOwotCXJlZ0JUU3RhdGUgPSBSRUdfQlRfU1RBVEU7Ci0JaWYgKHBIYWxEYXRhLT5GaXJtd2FyZVZlcnNpb24gPj0gRldfVkVSX0JUX1JFRzEpCi0JCXJlZ0JUUG9sbGluZyA9IFJFR19CVF9QT0xMSU5HMTsKLQllbHNlCi0JCXJlZ0JUUG9sbGluZyA9IFJFR19CVF9QT0xMSU5HOwotCi0JQlRfQWN0aXZlID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgcmVnQlRBY3RpdmUpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgQlRfQWN0aXZlKDB4JXgpID0leFxuIiwgcmVnQlRBY3RpdmUsIEJUX0FjdGl2ZSkpOwotCUJUX0FjdGl2ZSA9IEJUX0FjdGl2ZSAmIDB4MDBmZmZmZmY7Ci0KLQlCVF9TdGF0ZSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIHJlZ0JUU3RhdGUpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgQlRfU3RhdGUoMHgleCkgPSV4XG4iLCByZWdCVFN0YXRlLCBCVF9TdGF0ZSkpOwotCUJUX1N0YXRlID0gQlRfU3RhdGUgJiAweDAwZmZmZmZmOwotCi0JQlRfUG9sbGluZyA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIHJlZ0JUUG9sbGluZyk7Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBCVF9Qb2xsaW5nKDB4JXgpID0leFxuIiwgcmVnQlRQb2xsaW5nLCBCVF9Qb2xsaW5nKSk7Ci0KLQlpZiAoQlRfQWN0aXZlID09IDB4ZmZmZmZmZmYgJiYgQlRfU3RhdGUgPT0gMHhmZmZmZmZmZiAmJiBCVF9Qb2xsaW5nID09IDB4ZmZmZmZmZmYpCi0JCXJldHVybjsKLQlpZiAoQlRfUG9sbGluZyA9PSAwKQotCQlyZXR1cm47Ci0KLQlSYXRpb19BY3QgPSBCVF9BY3RpdmUqMTAwMC9CVF9Qb2xsaW5nOwotCVJhdGlvX1NUQSA9IEJUX1N0YXRlKjEwMDAvQlRfUG9sbGluZzsKLQotCXBIYWxEYXRhLT5idF9jb2V4aXN0LlJhdGlvX1R4ID0gUmF0aW9fQWN0OwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LlJhdGlvX1BSSSA9IFJhdGlvX1NUQTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUmF0aW9fQWN0ID0lZFxuIiwgUmF0aW9fQWN0KSk7Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSYXRpb19TVEEgPSVkXG4iLCBSYXRpb19TVEEpKTsKLQotCWlmIChSYXRpb19TVEEgPCA2MCAmJiBSYXRpb19BY3QgPCA1MDApIHsJLyogIEJUIFBBTiBpZGxlICovCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX0JUX1BBTl9JRExFOwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfQlRfUEFOX0RPV05MSU5LOwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfQlRfUEFOX1VQTElOSzsKLQl9IGVsc2UgewotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfQlRfUEFOX0lETEU7Ci0KLQkJaWYgKFJhdGlvX1NUQSkgewotCQkJLyogIENoZWNrIGlmIEJUIFBBTiAodW5kZXIgQlQgMi4xKSBpcyB1cGxpbmsgb3IgZG93bmxpbmsgKi8KLQkJCWlmICgoUmF0aW9fQWN0L1JhdGlvX1NUQSkgPCAyKSB7Ci0JCQkJLyogIEJUIFBBTiBVcGxpbmsgKi8KLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5CVDIxVHJhZmZpY1N0YXRpc3RpY3MuYlR4QnVzeVRyYWZmaWMgPSB0cnVlOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX0JUX1BBTl9VUExJTks7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQlQyMVRyYWZmaWNTdGF0aXN0aWNzLmJSeEJ1c3lUcmFmZmljID0gZmFsc2U7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX0JUX1BBTl9ET1dOTElOSzsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogIEJUIFBBTiBkb3dubGluayAqLwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkJUMjFUcmFmZmljU3RhdGlzdGljcy5iVHhCdXN5VHJhZmZpYyA9IGZhbHNlOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9CVF9QQU5fVVBMSU5LOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkJUMjFUcmFmZmljU3RhdGlzdGljcy5iUnhCdXN5VHJhZmZpYyA9IHRydWU7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfQlRfUEFOX0RPV05MSU5LOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogIEJUIFBBTiBkb3dubGluayAqLwotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQlQyMVRyYWZmaWNTdGF0aXN0aWNzLmJUeEJ1c3lUcmFmZmljID0gZmFsc2U7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfQlRfUEFOX1VQTElOSzsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkJUMjFUcmFmZmljU3RhdGlzdGljcy5iUnhCdXN5VHJhZmZpYyA9IHRydWU7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9CVF9QQU5fRE9XTkxJTks7Ci0JCX0KLQl9Ci0KLQkvKiAgQ2hlY2sgQlQgaXMgaWRsZSBvciBub3QgKi8KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlID09IDAgJiYKLQkgICAgcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mU0NPID09IDApIHsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJCVEJ1c3kgPSBmYWxzZTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfQlRfSURMRTsKLQl9IGVsc2UgewotCQlpZiAoUmF0aW9fU1RBIDwgNjApIHsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5iQlRCdXN5ID0gZmFsc2U7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9CVF9JRExFOwotCQl9IGVsc2UgewotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJCVEJ1c3kgPSB0cnVlOwotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX0JUX0lETEU7Ci0JCX0KLQl9Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlID09IDAgJiYKLQkgICAgcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mU0NPID09IDApIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX0JUX1JTU0lfTE9XOwotCQlwQnRNZ250LT5FeHRDb25maWcuTUlOX0JUX1JTU0kgPSAwOwotCQlCVERNX1NldEFudGVubmEocGFkYXB0ZXIsIEJURE1fQU5UX0JUX0lETEUpOwotCX0gZWxzZSB7Ci0JCWlmIChwQnRNZ250LT5FeHRDb25maWcuTUlOX0JUX1JTU0kgPD0gLTUpIHsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX0JUX1JTU0lfTE9XOwotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBjb3JlIHN0YWNrIG5vdGlmeSBidCByc3NpIExvd1xuIikpOwotCQl9IGVsc2UgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX0JUX1JTU0lfTE9XOwotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBjb3JlIHN0YWNrIG5vdGlmeSBidCByc3NpIE5vcm1hbFxuIikpOwotCQl9Ci0JfQotCi0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmJCVEJ1c3lUcmFmZmljICE9IHBCdE1nbnQtPkV4dENvbmZpZy5iQlRCdXN5KSB7Ci0JCS8qICBCVCBpZGxlIG9yIEJUIG5vbi1pZGxlICovCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJCVEJ1c3lUcmFmZmljID0gcEJ0TWdudC0+RXh0Q29uZmlnLmJCVEJ1c3k7Ci0JCXN0YXRlQ2hhbmdlID0gdHJ1ZTsKLQl9Ci0KLQlpZiAoc3RhdGVDaGFuZ2UpIHsKLQkJaWYgKCFwQnRNZ250LT5FeHRDb25maWcuYkJUQnVzeSkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgQlQgaXMgaWRsZSBvciBkaXNhYmxlXG4iKSk7Ci0JCWVsc2UKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgQlQgaXMgbm9uLWlkbGVcbiIpKTsKLQl9Ci0JaWYgKCFwQnRNZ250LT5FeHRDb25maWcuYkJUQnVzeSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIEJUIGlzIGlkbGUgb3IgZGlzYWJsZVxuIikpOwotCQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX1VOREVSX0xJTktJTkd8V0lGSV9TSVRFX01PTklUT1IpID09IHRydWUpCi0JCQlCVERNX1NldEFudGVubmEocGFkYXB0ZXIsIEJURE1fQU5UX1dJRkkpOwotCX0KLX0KLQotLyogID09PT09IEVuZCBvZiBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Y0NzcjFBbnQuYyA9PT09PSAqLwotCi0vKiAgPT09PT0gQmVsb3cgdGhpcyBsaW5lIGlzIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjQ3NyMkFudC5jID09PT09ICovCi0KLS8qICBsb2NhbCBmdW5jdGlvbiBzdGFydCB3aXRoIGJ0ZG1fICovCi0KLS8qICBOb3RlOiAqLwotLyogIEluIHRoZSBmb2xsb3dpbmcsIEZXIHNob3VsZCBiZSBkb25lIGJlZm9yZSBTVyBtZWNoYW5pc20uICovCi0vKiAgQlRETV9CYWxhbmNlKCksIEJURE1fRGltaW5pc2hXaUZpKCksIEJUX05BVigpIHNob3VsZCBiZSBkb25lICovCi0vKiAgYmVmb3JlIEJURE1fQUdDVGFibGUoKSwgQlRETV9CQkJhY2tPZmZMZXZlbCgpLCBidGRtX0RhY1N3aW5nKCkuICovCi0KLS8qICBleHRlcm4gZnVuY3Rpb24gc3RhcnQgd2l0aCBCVERNXyAqLwotCi12b2lkCi1CVERNX0RpbWluaXNoV2lGaSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXU4IGJEQUNPbiwKLQl1OCBiSW50ZXJydXB0T24sCi0JdTggREFDU3dpbmdMZXZlbCwKLQl1OCBiTkFWT24KLQkpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggSDJDX1BhcmFtZXRlclszXSA9IHswfTsKLQotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5CVF9BbnRfTnVtICE9IEFudF94MikKLQkJcmV0dXJuOwotCi0JaWYgKChwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJiBCVF9DT0VYX1NUQVRFX0JUX1JTU0lfTE9XKSAmJgotCSAgICAoREFDU3dpbmdMZXZlbCA9PSAweDIwKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUXURpbWluaXNoV2lGaSAweDIwIG9yaWdpbmFsLCBidXQgc2V0IDB4MTggZm9yIExvdyBSU1NJIVxuIikpOwotCQlEQUNTd2luZ0xldmVsID0gMHgxODsKLQl9Ci0KLQlIMkNfUGFyYW1ldGVyWzJdID0gMDsKLQlIMkNfUGFyYW1ldGVyWzFdID0gREFDU3dpbmdMZXZlbDsKLQlIMkNfUGFyYW1ldGVyWzBdID0gMDsKLQlpZiAoYkRBQ09uKSB7Ci0JCUgyQ19QYXJhbWV0ZXJbMl0gfD0gMHgwMTsJLyogQklUMCAqLwotCQlpZiAoYkludGVycnVwdE9uKQotCQkJSDJDX1BhcmFtZXRlclsyXSB8PSAweDAyOwkvKiBCSVQxICovCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJGV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQl9Ci0JaWYgKGJOQVZPbikgewotCQlIMkNfUGFyYW1ldGVyWzJdIHw9IDB4MDg7CS8qIEJJVDMgKi8KLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkZXQ29leGlzdEFsbE9mZiA9IGZhbHNlOwotCX0KLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgYkRBQ09uID0gJXMsIGJJbnRlcnJ1cHRPbiA9ICVzLCB3cml0ZSAweGUgPSAweCV4XG4iLAotCQliREFDT24/Ik9OIjoiT0ZGIiwgYkludGVycnVwdE9uPyJPTiI6Ik9GRiIsCi0JCUgyQ19QYXJhbWV0ZXJbMF08PDE2fEgyQ19QYXJhbWV0ZXJbMV08PDh8SDJDX1BhcmFtZXRlclsyXSkpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgYk5BVk9uID0gJXNcbiIsCi0JCWJOQVZPbj8iT04iOiJPRkYiKSk7Ci19Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGNDc3IyQW50LmMgPT09PT0gKi8KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Q29leGlzdC5jID09PT09ICovCi0KLS8qICBsb2NhbCBmdW5jdGlvbiAqLwotc3RhdGljIHZvaWQgYnRkbV9SZXNldEZXQ29leFN0YXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgPSAwOwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LlByZXZpb3VzU3RhdGUgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBidGRtX0luaXRCdENvZXhpc3RETShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JLyogIDIwMTAwNDE1IEpvc2VwaDogUmVzdG9yZSBSRiByZWdpc3RlciAweDFFIGFuZCAweDFGIHZhbHVlIGZvciBmdXJ0aGVyIHVzYWdlLiAqLwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LkJ0UmZSZWdPcmlnaW4xRSA9IFBIWV9RdWVyeVJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgUkZfUkNLMSwgYlJGUmVnT2Zmc2V0TWFzayk7Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuQnRSZlJlZ09yaWdpbjFGID0gUEhZX1F1ZXJ5UkZSZWcocGFkYXB0ZXIsIFBhdGhBLCBSRl9SQ0syLCAweGYwKTsKLQotCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSA9IDA7Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuUHJldmlvdXNTdGF0ZSA9IDA7Ci0KLQlCVERNXzg3MjNBSW5pdChwYWRhcHRlcik7Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkluaXRsaXplZCA9IHRydWU7Ci19Ci0KLS8qICAqLwotLyogIGV4dGVybiBmdW5jdGlvbiAqLwotLyogICovCi12b2lkIEJURE1fQ2hlY2tBbnRTZWxNb2RlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci19Ci0KLXZvaWQgQlRETV9Gd0MyaEJ0UnNzaShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqdG1wQnVmKQotewotCUJURE1fRndDMmhCdFJzc2k4NzIzQShwYWRhcHRlciwgdG1wQnVmKTsKLX0KLQotdm9pZCBCVERNX0Rpc3BsYXlCdENvZXhJbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JQlRETV9EaXNwbGF5ODcyM0FCdENvZXhJbmZvKHBhZGFwdGVyKTsKLX0KLQotdm9pZCBCVERNX1JlamVjdEFQQWdncmVnYXRlZFBhY2tldChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiUmVqZWN0KQotewotfQotCi11OCBCVERNX0lzSFQ0MChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IGlzaHQ0MCA9IHRydWU7Ci0JZW51bSBodF9jaGFubmVsX3dpZHRoIGJ3OwotCi0JYncgPSBwYWRhcHRlci0+bWxtZWV4dHByaXYuY3VyX2J3bW9kZTsKLQotCWlmIChidyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwKQotCQlpc2h0NDAgPSBmYWxzZTsKLQllbHNlIGlmIChidyA9PSBIVF9DSEFOTkVMX1dJRFRIXzQwKQotCQlpc2h0NDAgPSB0cnVlOwotCi0JcmV0dXJuIGlzaHQ0MDsKLX0KLQotdTggQlRETV9MZWdhY3koc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQ7Ci0JdTggaXNMZWdhY3kgPSBmYWxzZTsKLQotCXBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlpZiAoKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSA9PSBXSVJFTEVTU18xMUIpIHx8Ci0JCShwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgPT0gV0lSRUxFU1NfMTFHKSB8fAotCQkocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlID09IFdJUkVMRVNTXzExQkcpKQotCQlpc0xlZ2FjeSA9IHRydWU7Ci0KLQlyZXR1cm4gaXNMZWdhY3k7Ci19Ci0KLXZvaWQgQlRETV9DaGVja1dpRmlTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2OwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JaWYgKHBtbG1lcHJpdi0+TGlua0RldGVjdEluZm8uYkJ1c3lUcmFmZmljKSB7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX0lETEU7Ci0KLQkJaWYgKHBtbG1lcHJpdi0+TGlua0RldGVjdEluZm8uYlR4QnVzeVRyYWZmaWMpCi0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1VQTElOSzsKLQkJZWxzZQotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfVVBMSU5LOwotCi0JCWlmIChwbWxtZXByaXYtPkxpbmtEZXRlY3RJbmZvLmJSeEJ1c3lUcmFmZmljKQotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9ET1dOTElOSzsKLQkJZWxzZQotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfRE9XTkxJTks7Ci0JfSBlbHNlIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9JRExFOwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9VUExJTks7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX0RPV05MSU5LOwotCX0KLQotCWlmIChCVERNX0xlZ2FjeShwYWRhcHRlcikpIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9MRUdBQ1k7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX0hUMjA7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX0hUNDA7Ci0JfSBlbHNlIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfTEVHQUNZOwotCQlpZiAoQlRETV9Jc0hUNDAocGFkYXB0ZXIpKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX0hUNDA7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9IVDIwOwotCQl9IGVsc2UgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9IVDIwOwotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfSFQ0MDsKLQkJfQotCX0KLQotCWlmIChwQnRNZ250LT5CdE9wZXJhdGlvbk9uKQotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9CVDMwOwotCWVsc2UKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX0JUMzA7Ci19Ci0KLXMzMiBCVERNX0dldFJ4U1Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLS8qUE1HTlRfSU5GTwkJcE1nbnRJbmZvID0gJnBhZGFwdGVyLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXY7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzMzIJCQlVbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IDA7Ci0KLQlwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSBHRVRfVU5ERUNPUkFURURfQVZFUkFHRV9SU1NJKHBhZGFwdGVyKTsKLQl9IGVsc2UgeyAvKiAgYXNzb2NpYXRlZCBlbnRyeSBwd2RiICovCi0JCVVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gcEhhbERhdGEtPmRtcHJpdi5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotCQkvKiBwSGFsRGF0YS0+QlRfRW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQiAqLwotCX0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQlRETV9HZXRSeFNTKCkgPSAlZFxuIiwgVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIpKTsKLQlyZXR1cm4gVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci19Ci0KLXN0YXRpYyBzMzIgQlRETV9HZXRSeEJlYWNvblNTKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0JczMyCQkJcHdkYkJlYWNvbiA9IDA7Ci0KLQlwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJLyogcHdkYkJlYWNvbiA9IHBIYWxEYXRhLT5kbXByaXYuVW5kZWNvcmF0ZWRTbW9vdGhlZEJlYWNvbjsgKi8KLQkJcHdkYkJlYWNvbiA9IHBIYWxEYXRhLT5kbXByaXYuRW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQl9Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkJURE1fR2V0UnhCZWFjb25TUygpID0gJWRcbiIsIHB3ZGJCZWFjb24pKTsKLQlyZXR1cm4gcHdkYkJlYWNvbjsKLX0KLQotLyogIEdldCBiZWFjb24gcnNzaSBzdGF0ZSAqLwotdTggQlRETV9DaGVja0NvZXhCY25Sc3NpU3RhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbGV2ZWxOdW0sCi0JCQkgICAgICB1OCBSc3NpVGhyZXNoLCB1OCBSc3NpVGhyZXNoMSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzMzIgcHdkYkJlYWNvbiA9IDA7Ci0JdTggYmNuUnNzaVN0YXRlID0gMDsKLQotCXB3ZGJCZWFjb24gPSBCVERNX0dldFJ4QmVhY29uU1MocGFkYXB0ZXIpOwotCi0JaWYgKGxldmVsTnVtID09IDIpIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fTUVESVVNOwotCi0JCWlmICgocEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlQmVhY29uID09IEJUX1JTU0lfU1RBVEVfTE9XKSB8fAotCQkgICAgKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZUJlYWNvbiA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfTE9XKSkgewotCQkJaWYgKHB3ZGJCZWFjb24gPj0gKFJzc2lUaHJlc2grQlRfRldfQ09FWF9USFJFU0hfVE9MKSkgewotCQkJCWJjblJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfSElHSDsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fTE9XOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV9CRUFDT04gc3RhdGUgc3dpdGNoIHRvIEhpZ2hcbiIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYmNuUnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVzsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfQkVBQ09OIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocHdkYkJlYWNvbiA8IFJzc2lUaHJlc2gpIHsKLQkJCQliY25Sc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9ISUdIOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV9CRUFDT04gc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOwotCQkJfSBlbHNlIHsKLQkJCQliY25Sc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSDsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfQkVBQ09OIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChsZXZlbE51bSA9PSAzKSB7Ci0JCWlmIChSc3NpVGhyZXNoID4gUnNzaVRocmVzaDEpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV9CRUFDT04gdGhyZXNoIGVycm9yISFcbiIpKTsKLQkJCXJldHVybiBwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGVCZWFjb247Ci0JCX0KLQotCQlpZiAoKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZUJlYWNvbiA9PSBCVF9SU1NJX1NUQVRFX0xPVykgfHwKLQkJICAgIChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGVCZWFjb24gPT0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVykpIHsKLQkJCWlmIChwd2RiQmVhY29uID49IChSc3NpVGhyZXNoK0JUX0ZXX0NPRVhfVEhSRVNIX1RPTCkpIHsKLQkJCQliY25Sc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX01FRElVTTsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX01FRElVTTsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fSElHSDsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfQkVBQ09OIHN0YXRlIHN3aXRjaCB0byBNZWRpdW1cbiIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYmNuUnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVzsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfQkVBQ09OIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZUJlYWNvbiA9PSBCVF9SU1NJX1NUQVRFX01FRElVTSkgfHwKLQkJCSAgIChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGVCZWFjb24gPT0gQlRfUlNTSV9TVEFURV9TVEFZX01FRElVTSkpIHsKLQkJCWlmIChwd2RiQmVhY29uID49IChSc3NpVGhyZXNoMStCVF9GV19DT0VYX1RIUkVTSF9UT0wpKSB7Ci0JCQkJYmNuUnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fSElHSDsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fTUVESVVNOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV9CRUFDT04gc3RhdGUgc3dpdGNoIHRvIEhpZ2hcbiIpKTsKLQkJCX0gZWxzZSBpZiAocHdkYkJlYWNvbiA8IFJzc2lUaHJlc2gpIHsKLQkJCQliY25Sc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX01FRElVTTsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfQkVBQ09OIHN0YXRlIHN3aXRjaCB0byBMb3dcbiIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYmNuUnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX01FRElVTTsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfQkVBQ09OIHN0YXRlIHN0YXkgYXQgTWVkaXVtXG4iKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocHdkYkJlYWNvbiA8IFJzc2lUaHJlc2gxKSB7Ci0JCQkJYmNuUnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9NRURJVU07Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9NRURJVU07Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fSElHSDsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9MT1c7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJX0JFQUNPTiBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJjblJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV9CRUFDT04gc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGVCZWFjb24gPSBiY25Sc3NpU3RhdGU7Ci0KLQlyZXR1cm4gYmNuUnNzaVN0YXRlOwotfQotCi11OCBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZTEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbGV2ZWxOdW0sCi0JCQkgICAgdTggUnNzaVRocmVzaCwgdTggUnNzaVRocmVzaDEpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JczMyIFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gMDsKLQl1OCBidFJzc2lTdGF0ZSA9IDA7Ci0KLQlVbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IEJURE1fR2V0UnhTUyhwYWRhcHRlcik7Ci0KLQlpZiAobGV2ZWxOdW0gPT0gMikgewotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfTUVESVVNOwotCi0JCWlmICgocEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX0xPVykgfHwKLQkJICAgIChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfU1RBWV9MT1cpKSB7Ci0JCQlpZiAoVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPj0gKFJzc2lUaHJlc2grQlRfRldfQ09FWF9USFJFU0hfVE9MKSkgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0xPVzsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfMSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOwotCQkJfSBlbHNlIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9MT1c7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkUFdEQiA8IFJzc2lUaHJlc2gpIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfTE9XOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfSElHSDsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfMSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0g7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKGxldmVsTnVtID09IDMpIHsKLQkJaWYgKFJzc2lUaHJlc2ggPiBSc3NpVGhyZXNoMSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgdGhyZXNoIGVycm9yISFcbiIpKTsKLQkJCXJldHVybiBwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGUxOwotCQl9Ci0KLQkJaWYgKChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfTE9XKSB8fAotCQkgICAgKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVykpIHsKLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkUFdEQiA+PSAoUnNzaVRocmVzaCtCVF9GV19DT0VYX1RIUkVTSF9UT0wpKSB7Ci0JCQkJYnRSc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX01FRElVTTsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9NRURJVU07Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfSElHSDsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfMSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVzsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfMSBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOwotCQkJfQotCQl9IGVsc2UgaWYgKChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfTUVESVVNKSB8fAotCQkJICAgKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9TVEFZX01FRElVTSkpIHsKLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkUFdEQiA+PSAoUnNzaVRocmVzaDErQlRfRldfQ09FWF9USFJFU0hfVE9MKSkgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfTUVESVVNOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV8xIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7Ci0JCQl9IGVsc2UgaWYgKFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCIDwgUnNzaVRocmVzaCkgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfTE9XOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9NRURJVU07Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOwotCQkJfSBlbHNlIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9NRURJVU07Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3RheSBhdCBNZWRpdW1cbiIpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkUFdEQiA8IFJzc2lUaHJlc2gxKSB7Ci0JCQkJYnRSc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX01FRElVTTsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9NRURJVU07Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0xPVzsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfMSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0g7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGUxID0gYnRSc3NpU3RhdGU7Ci0KLQlyZXR1cm4gYnRSc3NpU3RhdGU7Ci19Ci0KLXU4IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGxldmVsTnVtLAotCQkJICAgdTggUnNzaVRocmVzaCwgdTggUnNzaVRocmVzaDEpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JczMyIFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gMDsKLQl1OCBidFJzc2lTdGF0ZSA9IDA7Ci0KLQlVbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IEJURE1fR2V0UnhTUyhwYWRhcHRlcik7Ci0KLQlpZiAobGV2ZWxOdW0gPT0gMikgewotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX01FRElVTTsKLQotCQlpZiAoKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0xPVykgfHwKLQkJICAgIChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVykpIHsKLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkUFdEQiA+PSAoUnNzaVRocmVzaCtCVF9GV19DT0VYX1RIUkVTSF9UT0wpKSB7Ci0JCQkJYnRSc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9MT1c7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVzsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0kgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkUFdEQiA8IFJzc2lUaHJlc2gpIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfTE9XOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9ISUdIOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0g7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChsZXZlbE51bSA9PSAzKSB7Ci0JCWlmIChSc3NpVGhyZXNoID4gUnNzaVRocmVzaDEpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSSB0aHJlc2ggZXJyb3IhIVxuIikpOwotCQkJcmV0dXJuIHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZTsKLQkJfQotCi0JCWlmICgocEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfTE9XKSB8fAotCQkgICAgKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfTE9XKSkgewotCQkJaWYgKFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID49IChSc3NpVGhyZXNoK0JUX0ZXX0NPRVhfVEhSRVNIX1RPTCkpIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfTUVESVVNOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9NRURJVU07Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9ISUdIOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVzsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0kgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKLQkJCX0KLQkJfSBlbHNlIGlmICgocEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfTUVESVVNKSB8fAotCQkJICAgKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfTUVESVVNKSkgewotCQkJaWYgKFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID49IChSc3NpVGhyZXNoMStCVF9GV19DT0VYX1RIUkVTSF9UT0wpKSB7Ci0JCQkJYnRSc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9NRURJVU07Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7Ci0JCQl9IGVsc2UgaWYgKFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCIDwgUnNzaVRocmVzaCkgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9NRURJVU07Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJIHN0YXRlIHN3aXRjaCB0byBMb3dcbiIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnRSc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX1NUQVlfTUVESVVNOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSSBzdGF0ZSBzdGF5IGF0IE1lZGl1bVxuIikpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCIDwgUnNzaVRocmVzaDEpIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfTUVESVVNOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9NRURJVU07Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfTE9XOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0g7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOwotCQkJfQotCQl9Ci0JfQotCi0JcEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlID0gYnRSc3NpU3RhdGU7Ci0KLQlyZXR1cm4gYnRSc3NpU3RhdGU7Ci19Ci0KLWJvb2wgcnRsODcyM2FfQlRfZGlzYWJsZV9FRENBX3R1cmJvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQl1OCBiQnRDaGFuZ2VFRENBID0gZmFsc2U7Ci0JdTMyIEVEQ0FfQlRfQkUgPSAweDVlYTQyYiwgY3VyX0VEQ0FfcmVnOwotCWJvb2wgYlJldCA9IGZhbHNlOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEhhbERhdGEtPkJ0SW5mby5CdE1nbnQ7Ci0KLQlpZiAoIXJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKSB7Ci0JCWJSZXQgPSBmYWxzZTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QubGFzdEJ0RWRjYSA9IDA7Ci0JCXJldHVybiBiUmV0OwotCX0KLQlpZiAoISgocEJ0TWdudC0+YlN1cHBvcnRQcm9maWxlKSB8fAotCSAgICAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQ29leGlzdFR5cGUgPT0gQlRfQ1NSX0JDOCkpKSB7Ci0JCWJSZXQgPSBmYWxzZTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QubGFzdEJ0RWRjYSA9IDA7Ci0JCXJldHVybiBiUmV0OwotCX0KLQotCWlmIChydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpKSB7Ci0JCWJSZXQgPSBmYWxzZTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QubGFzdEJ0RWRjYSA9IDA7Ci0JCXJldHVybiBiUmV0OwotCX0KLQotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5leGVjX2NudCA8IDMpCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmV4ZWNfY250Kys7Ci0JZWxzZQotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iRURDQUluaXRpYWxpemVkID0gdHJ1ZTsKLQotCS8qICBXaGVuIEJUIGlzIG5vbiBpZGxlICovCi0JaWYgKCEocEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICYgQlRfQ09FWF9TVEFURV9CVF9JRExFKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQlQgc3RhdGUgbm9uIGlkbGUsIHNldCBidCBFRENBXG4iKSk7Ci0KLQkJLyogYWdncl9udW0gPSAweDA5MDk7ICovCi0JCWlmIChwSGFsRGF0YS0+b2RtcHJpdi5ETV9FRENBX1RhYmxlLmJDdXJyZW50VHVyYm9FRENBKSB7Ci0JCQliQnRDaGFuZ2VFRENBID0gdHJ1ZTsKLQkJCXBIYWxEYXRhLT5vZG1wcml2LkRNX0VEQ0FfVGFibGUuYkN1cnJlbnRUdXJib0VEQ0EgPSBmYWxzZTsKLQkJCXBIYWxEYXRhLT5kbXByaXYucHJ2X3RyYWZmaWNfaWR4ID0gMzsKLQkJfQotCQljdXJfRURDQV9yZWcgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfRURDQV9CRV9QQVJBTSk7Ci0KLQkJaWYgKGN1cl9FRENBX3JlZyAhPSBFRENBX0JUX0JFKQotCQkJYkJ0Q2hhbmdlRURDQSA9IHRydWU7Ci0JCWlmIChiQnRDaGFuZ2VFRENBIHx8ICFwSGFsRGF0YS0+YnRfY29leGlzdC5iRURDQUluaXRpYWxpemVkKSB7Ci0JCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX0VEQ0FfQkVfUEFSQU0sCi0JCQkJCSAgRURDQV9CVF9CRSk7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5sYXN0QnRFZGNhID0gRURDQV9CVF9CRTsKLQkJfQotCQliUmV0ID0gdHJ1ZTsKLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQlQgc3RhdGUgaWRsZSwgc2V0IG9yaWdpbmFsIEVEQ0FcbiIpKTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QubGFzdEJ0RWRjYSA9IDA7Ci0JCWJSZXQgPSBmYWxzZTsKLQl9Ci0JcmV0dXJuIGJSZXQ7Ci19Ci0KLXZvaWQKLUJURE1fQmFsYW5jZSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXU4IGJCYWxhbmNlT24sCi0JdTggbXMwLAotCXU4IG1zMQotCSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1OCBIMkNfUGFyYW1ldGVyWzNdID0gezB9OwotCi0JaWYgKGJCYWxhbmNlT24pIHsKLQkJSDJDX1BhcmFtZXRlclsyXSA9IDE7Ci0JCUgyQ19QYXJhbWV0ZXJbMV0gPSBtczE7Ci0JCUgyQ19QYXJhbWV0ZXJbMF0gPSBtczA7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJGV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQl9IGVsc2UgewotCQlIMkNfUGFyYW1ldGVyWzJdID0gMDsKLQkJSDJDX1BhcmFtZXRlclsxXSA9IDA7Ci0JCUgyQ19QYXJhbWV0ZXJbMF0gPSAwOwotCX0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5iQmFsYW5jZU9uID0gYkJhbGFuY2VPbjsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgQmFsYW5jZSA9WyVzOiVkbXM6JWRtc10sIHdyaXRlIDB4YyA9IDB4JXhcbiIsCi0JCWJCYWxhbmNlT24/Ik9OIjoiT0ZGIiwgbXMwLCBtczEsCi0JCUgyQ19QYXJhbWV0ZXJbMF08PDE2fEgyQ19QYXJhbWV0ZXJbMV08PDh8SDJDX1BhcmFtZXRlclsyXSkpOwotCi0JRmlsbEgyQ0NtZChwYWRhcHRlciwgMHhjLCAzLCBIMkNfUGFyYW1ldGVyKTsKLX0KLQotdm9pZCBCVERNX0FHQ1RhYmxlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHR5cGUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JaWYgKHR5cGUgPT0gQlRfQUdDVEFCTEVfT0ZGKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRdQUdDVGFibGUgT2ZmIVxuIikpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjNzgsIDB4NjQxYzAwMDEpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjNzgsIDB4NjMxZDAwMDEpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjNzgsIDB4NjIxZTAwMDEpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjNzgsIDB4NjExZjAwMDEpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjNzgsIDB4NjAyMDAwMDEpOwotCi0JCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUGF0aEEsIFJGX1JYX0FHQ19IUCwgYlJGUmVnT2Zmc2V0TWFzaywgMHgzMjAwMCk7Ci0JCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUGF0aEEsIFJGX1JYX0FHQ19IUCwgYlJGUmVnT2Zmc2V0TWFzaywgMHg3MTAwMCk7Ci0JCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUGF0aEEsIFJGX1JYX0FHQ19IUCwgYlJGUmVnT2Zmc2V0TWFzaywgMHhiMDAwMCk7Ci0JCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUGF0aEEsIFJGX1JYX0FHQ19IUCwgYlJGUmVnT2Zmc2V0TWFzaywgMHhmYzAwMCk7Ci0JCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUGF0aEEsIFJGX1JYX0cxLCBiUkZSZWdPZmZzZXRNYXNrLCAweDMwMzU1KTsKLQotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iODcyM2FBZ2NUYWJsZU9uID0gZmFsc2U7Ci0JfSBlbHNlIGlmICh0eXBlID09IEJUX0FHQ1RBQkxFX09OKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRdQUdDVGFibGUgT24hXG4iKSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweGM3OCwgMHg0ZTFjMDAwMSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweGM3OCwgMHg0ZDFkMDAwMSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweGM3OCwgMHg0YzFlMDAwMSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweGM3OCwgMHg0YjFmMDAwMSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweGM3OCwgMHg0YTIwMDAwMSk7Ci0KLQkJUEhZX1NldFJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgUkZfUlhfQUdDX0hQLCBiUkZSZWdPZmZzZXRNYXNrLCAweGRjMDAwKTsKLQkJUEhZX1NldFJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgUkZfUlhfQUdDX0hQLCBiUkZSZWdPZmZzZXRNYXNrLCAweDkwMDAwKTsKLQkJUEhZX1NldFJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgUkZfUlhfQUdDX0hQLCBiUkZSZWdPZmZzZXRNYXNrLCAweDUxMDAwKTsKLQkJUEhZX1NldFJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgUkZfUlhfQUdDX0hQLCBiUkZSZWdPZmZzZXRNYXNrLCAweDEyMDAwKTsKLQkJUEhZX1NldFJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgUkZfUlhfRzEsIGJSRlJlZ09mZnNldE1hc2ssIDB4MDAzNTUpOwotCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmI4NzIzYUFnY1RhYmxlT24gPSB0cnVlOwotCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJTV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQl9Ci19Ci0KLXZvaWQgQlRETV9CQkJhY2tPZmZMZXZlbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0eXBlKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JaWYgKHR5cGUgPT0gQlRfQkJfQkFDS09GRl9PRkYpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVF1CQkJhY2tPZmZMZXZlbCBPZmYhXG4iKSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweGMwNCwgMHgzYTA1NjExKTsKLQl9IGVsc2UgaWYgKHR5cGUgPT0gQlRfQkJfQkFDS09GRl9PTikgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUXUJCQmFja09mZkxldmVsIE9uIVxuIikpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjMDQsIDB4M2EwNzYxMSk7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJTV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQl9Ci19Ci0KLXZvaWQgQlRETV9GV0NvZXhBbGxPZmYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJCVERNX0ZXQ29leEFsbE9mZigpXG4iKSk7Ci0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmJGV0NvZXhpc3RBbGxPZmYpCi0JCXJldHVybjsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQlRETV9GV0NvZXhBbGxPZmYoKSwgcmVhbCBEb1xuIikpOwotCi0JQlRETV9GV0NvZXhBbGxPZmY4NzIzQShwYWRhcHRlcik7Ci0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5iRldDb2V4aXN0QWxsT2ZmID0gdHJ1ZTsKLX0KLQotdm9pZCBCVERNX1NXQ29leEFsbE9mZihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkJURE1fU1dDb2V4QWxsT2ZmKClcbiIpKTsKLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuYlNXQ29leGlzdEFsbE9mZikKLQkJcmV0dXJuOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJCVERNX1NXQ29leEFsbE9mZigpLCByZWFsIERvXG4iKSk7Ci0JQlRETV9TV0NvZXhBbGxPZmY4NzIzQShwYWRhcHRlcik7Ci0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5iU1dDb2V4aXN0QWxsT2ZmID0gdHJ1ZTsKLX0KLQotdm9pZCBCVERNX0hXQ29leEFsbE9mZihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkJURE1fSFdDb2V4QWxsT2ZmKClcbiIpKTsKLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuYkhXQ29leGlzdEFsbE9mZikKLQkJcmV0dXJuOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJCVERNX0hXQ29leEFsbE9mZigpLCByZWFsIERvXG4iKSk7Ci0KLQlCVERNX0hXQ29leEFsbE9mZjg3MjNBKHBhZGFwdGVyKTsKLQotCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJIV0NvZXhpc3RBbGxPZmYgPSB0cnVlOwotfQotCi12b2lkIEJURE1fQ29leEFsbE9mZihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCUJURE1fRldDb2V4QWxsT2ZmKHBhZGFwdGVyKTsKLQlCVERNX1NXQ29leEFsbE9mZihwYWRhcHRlcik7Ci0JQlRETV9IV0NvZXhBbGxPZmYocGFkYXB0ZXIpOwotfQotCi12b2lkIHJ0bDg3MjNhX0JUX2Rpc2FibGVfY29leGlzdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnBwd3JjdHJsID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQotCWlmICghcnRsODcyM2FfQlRfY29leGlzdChwYWRhcHRlcikpCi0JCXJldHVybjsKLQotCS8qICA4NzIzIDFBbnQgZG9lc24ndCBuZWVkIHRvIHR1cm4gb2ZmIGJ0IGNvZXhpc3QgbWVjaGFuaXNtLiAqLwotCWlmIChydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpKQotCQlyZXR1cm47Ci0KLQkvKiAgQmVmb3JlIGVudGVyIElQUywgdHVybiBvZmYgRlcgQlQgQ28tZXhpc3QgbWVjaGFuaXNtICovCi0JaWYgKHBwd3JjdHJsLT5yZWdfcmZvZmYgPT0gcmZfb24pIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVF1bRE1dLCBCZWZvcmUgZW50ZXIgSVBTLCB0dXJuIG9mZiBhbGwgQ29leGlzdCBETVxuIikpOwotCQlidGRtX1Jlc2V0RldDb2V4U3RhdGUocGFkYXB0ZXIpOwotCQlCVERNX0NvZXhBbGxPZmYocGFkYXB0ZXIpOwotCQlCVERNX1NldEFudGVubmEocGFkYXB0ZXIsIEJURE1fQU5UX0JUKTsKLQl9Ci19Ci0KLXZvaWQgQlRETV9TaWduYWxDb21wZW5zYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnJzc2lfd2lmaSwgdTggKnJzc2lfYnQpCi17Ci0JQlRETV84NzIzQVNpZ25hbENvbXBlbnNhdGlvbihwYWRhcHRlciwgcnNzaV93aWZpLCByc3NpX2J0KTsKLX0KLQotdm9pZCBydGw4NzIzYV9CVF9kb19jb2V4aXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAoIXJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgQlQgbm90IGV4aXN0cyEhXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIXBIYWxEYXRhLT5idF9jb2V4aXN0LmJJbml0bGl6ZWQpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBidGRtX0luaXRCdENvZXhpc3RETSgpXG4iKSk7Ci0JCWJ0ZG1fSW5pdEJ0Q29leGlzdERNKHBhZGFwdGVyKTsKLQl9Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiXG5cbltETV1bQlRdLCBCVERNIHN0YXJ0ISFcbiIpKTsKLQotCUJURE1fUFdEQk1vbml0b3IocGFkYXB0ZXIpOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBIVyB0eXBlIGlzIDg3MjNcbiIpKTsKLQlCVERNX0JUQ29leGlzdDg3MjNBKHBhZGFwdGVyKTsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIEJURE0gZW5kISFcblxuIikpOwotfQotCi12b2lkIEJURE1fVXBkYXRlQ29leFN0YXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAoIUJURE1fSXNTYW1lQ29leGlzdFN0YXRlKHBhZGFwdGVyKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIENvZXhpc3QgU3RhdGVbYml0TWFwXSBjaGFuZ2UgZnJvbSAweCUiaTY0Zm10InggdG8gMHglImk2NGZtdCJ4LCAgY2hhbmdlQml0cyA9IDB4JSJpNjRmbXQieFxuIiwKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LlByZXZpb3VzU3RhdGUsCi0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUsCi0JCQkocEhhbERhdGEtPmJ0X2NvZXhpc3QuUHJldmlvdXNTdGF0ZV5wSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUpKSk7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LlByZXZpb3VzU3RhdGUgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGU7Ci0JfQotfQotCi11OCBCVERNX0lzU2FtZUNvZXhpc3RTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LlByZXZpb3VzU3RhdGUgPT0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgQ29leGlzdCBzdGF0ZSBjaGFuZ2VkISFcbiIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KLQotdm9pZCBCVERNX1BXREJNb25pdG9yKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKEdldERlZmF1bHRBZGFwdGVyKHBhZGFwdGVyKSk7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXU4IEgyQ19QYXJhbWV0ZXJbM10gPSB7MH07Ci0JczMyIHRtcEJURW50cnlNYXhQV0RCID0gMCwgdG1wQlRFbnRyeU1pblBXREIgPSAweGZmOwotCXU4IGk7Ci0KLQlpZiAocEJ0TWdudC0+QnRPcGVyYXRpb25PbikgewotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JUX0FTT0NfRU5UUllfTlVNOyBpKyspIHsKLQkJCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5iVXNlZCkgewotCQkJCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA8IHRtcEJURW50cnlNaW5QV0RCKQotCQkJCQl0bXBCVEVudHJ5TWluUFdEQiA9IHBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotCQkJCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA+IHRtcEJURW50cnlNYXhQV0RCKQotCQkJCQl0bXBCVEVudHJ5TWF4UFdEQiA9IHBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotCQkJCS8qICBSZXBvcnQgZXZlcnkgQlQgY29ubmVjdGlvbiAoSFMgbW9kZSkgUlNTSSB0byBGVyAqLwotCQkJCUgyQ19QYXJhbWV0ZXJbMl0gPSAodTgpKHBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCICYgMHhGRik7Ci0JCQkJSDJDX1BhcmFtZXRlclswXSA9IChNQVhfRldfU1VQUE9SVF9NQUNJRF9OVU0tMS1pKTsKLQkJCQlSVFBSSU5UKEZETSwgRE1fQlQzMCwgKCJSU1NJIHJlcG9ydCBmb3IgQlRbJWRdLCBIMkNfUGFyID0gMHgleFxuIiwgaSwgSDJDX1BhcmFtZXRlclswXSkpOwotCQkJCUZpbGxIMkNDbWQocGFkYXB0ZXIsIFJTU0lfU0VUVElOR19FSUQsIDMsIEgyQ19QYXJhbWV0ZXIpOwotCQkJCVJUUFJJTlRfQUREUihGRE0sIChETV9QV0RCfERNX0JUMzApLCAoIkJUX0VudHJ5IE1hYyA6IiksCi0JCQkJCSAgICAgcEJUSW5mby0+QnRBc29jRW50cnlbaV0uQlRSZW1vdGVNQUNBZGRyKQotCQkJCVJUUFJJTlQoRkRNLCAoRE1fUFdEQnxETV9CVDMwKSwKLQkJCQkJKCJCVCByeCBwd2RiWyVkXSA9IDB4JXgoJWQpXG4iLCBpLAotCQkJCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5VbmRlY29yYXRlZFNtb290aGVkUFdEQiwKLQkJCQkJcEJUSW5mby0+QnRBc29jRW50cnlbaV0uVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIpKTsKLQkJCX0KLQkJfQotCQlpZiAodG1wQlRFbnRyeU1heFBXREIgIT0gMCkgewkvKiAgSWYgYXNzb2NpYXRlZCBlbnRyeSBpcyBmb3VuZCAqLwotCQkJcEhhbERhdGEtPmRtcHJpdi5CVF9FbnRyeU1heFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gdG1wQlRFbnRyeU1heFBXREI7Ci0JCQlSVFBSSU5UKEZETSwgKERNX1BXREJ8RE1fQlQzMCksICgiQlRfRW50cnlNYXhQV0RCID0gMHgleCglZClcbiIsCi0JCQkJdG1wQlRFbnRyeU1heFBXREIsIHRtcEJURW50cnlNYXhQV0RCKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwSGFsRGF0YS0+ZG1wcml2LkJUX0VudHJ5TWF4VW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSAwOwotCQl9Ci0JCWlmICh0bXBCVEVudHJ5TWluUFdEQiAhPSAweGZmKSB7IC8qICBJZiBhc3NvY2lhdGVkIGVudHJ5IGlzIGZvdW5kICovCi0JCQlwSGFsRGF0YS0+ZG1wcml2LkJUX0VudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSB0bXBCVEVudHJ5TWluUFdEQjsKLQkJCVJUUFJJTlQoRkRNLCAoRE1fUFdEQnxETV9CVDMwKSwgKCJCVF9FbnRyeU1pblBXREIgPSAweCV4KCVkKVxuIiwKLQkJCQl0bXBCVEVudHJ5TWluUFdEQiwgdG1wQlRFbnRyeU1pblBXREIpKTsKLQkJfSBlbHNlIHsKLQkJCXBIYWxEYXRhLT5kbXByaXYuQlRfRW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IDA7Ci0JCX0KLQl9Ci19Ci0KLXU4IEJURE1fSXNCVEJ1c3koc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCWlmIChwQnRNZ250LT5FeHRDb25maWcuYkJUQnVzeSkKLQkJcmV0dXJuIHRydWU7Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXU4IEJURE1fSXNXaWZpQnVzeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotLypQTUdOVF9JTkZPCQlwTWdudEluZm8gPSAmR2V0RGVmYXVsdEFkYXB0ZXIocGFkYXB0ZXIpLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmR2V0RGVmYXVsdEFkYXB0ZXIocGFkYXB0ZXIpLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF90cmFmZmljICpwQnRUcmFmZmljID0gJnBCVEluZm8tPkJ0VHJhZmZpYzsKLQotCWlmIChwbWxtZXByaXYtPkxpbmtEZXRlY3RJbmZvLmJCdXN5VHJhZmZpYyB8fAotCQlwQnRUcmFmZmljLT5CdDMwVHJhZmZpY1N0YXRpc3RpY3MuYlR4QnVzeVRyYWZmaWMgfHwKLQkJcEJ0VHJhZmZpYy0+QnQzMFRyYWZmaWNTdGF0aXN0aWNzLmJSeEJ1c3lUcmFmZmljKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotdTggQlRETV9Jc0NvZXhpc3RTdGF0ZUNoYW5nZWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5QcmV2aW91c1N0YXRlID09IHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSkKLQkJcmV0dXJuIGZhbHNlOwotCWVsc2UKLQkJcmV0dXJuIHRydWU7Ci19Ci0KLXU4IEJURE1fSXNXaWZpVXBsaW5rKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZHZXREZWZhdWx0QWRhcHRlcihwYWRhcHRlciktPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdjsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBidF90cmFmZmljICpwQnRUcmFmZmljOwotCi0JcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdFRyYWZmaWMgPSAmcEJUSW5mby0+QnRUcmFmZmljOwotCi0JaWYgKChwbWxtZXByaXYtPkxpbmtEZXRlY3RJbmZvLmJUeEJ1c3lUcmFmZmljKSB8fAotCQkocEJ0VHJhZmZpYy0+QnQzMFRyYWZmaWNTdGF0aXN0aWNzLmJUeEJ1c3lUcmFmZmljKSkKLQkJcmV0dXJuIHRydWU7Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXU4IEJURE1fSXNXaWZpRG93bmxpbmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLS8qUE1HTlRfSU5GTwkJcE1nbnRJbmZvID0gJkdldERlZmF1bHRBZGFwdGVyKHBhZGFwdGVyKS0+TWdudEluZm87ICovCi0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2OwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X3RyYWZmaWMgKnBCdFRyYWZmaWM7Ci0KLQlwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JcEJ0VHJhZmZpYyA9ICZwQlRJbmZvLT5CdFRyYWZmaWM7Ci0KLQlpZiAoKHBtbG1lcHJpdi0+TGlua0RldGVjdEluZm8uYlJ4QnVzeVRyYWZmaWMpIHx8Ci0JCShwQnRUcmFmZmljLT5CdDMwVHJhZmZpY1N0YXRpc3RpY3MuYlJ4QnVzeVRyYWZmaWMpKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotdTggQlRETV9Jc0JUSFNNb2RlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZHZXREZWZhdWx0QWRhcHRlcihwYWRhcHRlciktPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcEJ0TWdudCA9ICZwSGFsRGF0YS0+QnRJbmZvLkJ0TWdudDsKLQotCWlmIChwQnRNZ250LT5CdE9wZXJhdGlvbk9uKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotdTggQlRETV9Jc0JUVXBsaW5rKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQlQyMVRyYWZmaWNTdGF0aXN0aWNzLmJUeEJ1c3lUcmFmZmljKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotdTggQlRETV9Jc0JURG93bmxpbmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5CVDIxVHJhZmZpY1N0YXRpc3RpY3MuYlJ4QnVzeVRyYWZmaWMpCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEJURE1fQWRqdXN0Rm9yQnRPcGVyYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUXVtETV0sIEJURE1fQWRqdXN0Rm9yQnRPcGVyYXRpb24oKVxuIikpOwotCUJURE1fQWRqdXN0Rm9yQnRPcGVyYXRpb244NzIzQShwYWRhcHRlcik7Ci19Ci0KLXZvaWQgQlRETV9TZXRCdENvZXhDdXJyQW50TnVtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGFudE51bSkKLXsKLQlCVERNX1NldDg3MjNBQnRDb2V4Q3VyckFudE51bShwYWRhcHRlciwgYW50TnVtKTsKLX0KLQotdm9pZCBCVERNX0ZvckhhbHQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlpZiAoIXJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKQotCQlyZXR1cm47Ci0KLQlCVERNX0ZvckhhbHQ4NzIzQShwYWRhcHRlcik7Ci0JR0VUX0hBTF9EQVRBKHBhZGFwdGVyKS0+YnRfY29leGlzdC5iSW5pdGxpemVkID0gZmFsc2U7Ci19Ci0KLXZvaWQgQlRETV9XaWZpU2Nhbk5vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzY2FuVHlwZSkKLXsKLQlpZiAoIXJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKQotCQlyZXR1cm47Ci0KLQlCVERNX1dpZmlTY2FuTm90aWZ5ODcyM0EocGFkYXB0ZXIsIHNjYW5UeXBlKTsKLX0KLQotdm9pZCBCVERNX1dpZmlBc3NvY2lhdGVOb3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYWN0aW9uKQotewotCWlmICghcnRsODcyM2FfQlRfY29leGlzdChwYWRhcHRlcikpCi0JCXJldHVybjsKLQotCUJURE1fV2lmaUFzc29jaWF0ZU5vdGlmeTg3MjNBKHBhZGFwdGVyLCBhY3Rpb24pOwotfQotCi12b2lkIHJ0bDg3MjNhX0JUX21lZGlhc3RhdHVzX25vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICBlbnVtIHJ0X21lZGlhX3N0YXR1cyBtc3RhdHVzKQotewotCWlmICghcnRsODcyM2FfQlRfY29leGlzdChwYWRhcHRlcikpCi0JCXJldHVybjsKLQotCUJURE1fTWVkaWFTdGF0dXNOb3RpZnk4NzIzQShwYWRhcHRlciwgbXN0YXR1cyk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfQlRfc3BlY2lhbHBhY2tldF9ub3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlpZiAoIXJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKQotCQlyZXR1cm47Ci0KLQlCVERNX0ZvckRoY3A4NzIzQShwYWRhcHRlcik7Ci19Ci0KLXZvaWQgQlRETV9SZXNldEFjdGlvblByb2ZpbGVTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5cCi0JCShCVF9DT0VYX1NUQVRFX1BST0ZJTEVfSElEfEJUX0NPRVhfU1RBVEVfUFJPRklMRV9BMkRQfAotCQlCVF9DT0VYX1NUQVRFX1BST0ZJTEVfUEFOfEJUX0NPRVhfU1RBVEVfUFJPRklMRV9TQ08pOwotfQotCi11OCBCVERNX0lzQWN0aW9uU0NPKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250OwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZzsKLQl1OCBiUmV0OwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0JcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCWJSZXQgPSBmYWxzZTsKLQotCWlmIChwQnREYmctPmRiZ0N0cmwpIHsKLQkJaWYgKHBCdERiZy0+ZGJnUHJvZmlsZSA9PSBCVF9EQkdfUFJPRklMRV9TQ08pIHsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1BST0ZJTEVfU0NPOwotCQkJYlJldCA9IHRydWU7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mU0NPID4gMCkgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfUFJPRklMRV9TQ087Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gYlJldDsKLX0KLQotdTggQlRETV9Jc0FjdGlvbkhJRChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmc7Ci0JdTggYlJldDsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQliUmV0ID0gZmFsc2U7Ci0KLQlpZiAocEJ0RGJnLT5kYmdDdHJsKSB7Ci0JCWlmIChwQnREYmctPmRiZ1Byb2ZpbGUgPT0gQlRfREJHX1BST0ZJTEVfSElEKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9QUk9GSUxFX0hJRDsKLQkJCWJSZXQgPSB0cnVlOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0hJRCkgJiYKLQkJICAgIHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9PSAxKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9QUk9GSUxFX0hJRDsKLQkJCWJSZXQgPSB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBiUmV0OwotfQotCi11OCBCVERNX0lzQWN0aW9uQTJEUChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmc7Ci0JdTggYlJldDsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQliUmV0ID0gZmFsc2U7Ci0KLQlpZiAocEJ0RGJnLT5kYmdDdHJsKSB7Ci0JCWlmIChwQnREYmctPmRiZ1Byb2ZpbGUgPT0gQlRfREJHX1BST0ZJTEVfQTJEUCkgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfUFJPRklMRV9BMkRQOwotCQkJYlJldCA9IHRydWU7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkgJiYKLQkJICAgIHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9PSAxKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9QUk9GSUxFX0EyRFA7Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gYlJldDsKLX0KLQotdTggQlRETV9Jc0FjdGlvblBBTihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmc7Ci0JdTggYlJldDsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQliUmV0ID0gZmFsc2U7Ci0KLQlpZiAocEJ0RGJnLT5kYmdDdHJsKSB7Ci0JCWlmIChwQnREYmctPmRiZ1Byb2ZpbGUgPT0gQlRfREJHX1BST0ZJTEVfUEFOKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9QUk9GSUxFX1BBTjsKLQkJCWJSZXQgPSB0cnVlOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX1BBTikgJiYKLQkJICAgIHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9PSAxKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9QUk9GSUxFX1BBTjsKLQkJCWJSZXQgPSB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBiUmV0OwotfQotCi11OCBCVERNX0lzQWN0aW9uSElEQTJEUChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmc7Ci0JdTggYlJldDsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQliUmV0ID0gZmFsc2U7Ci0KLQlpZiAocEJ0RGJnLT5kYmdDdHJsKSB7Ci0JCWlmIChwQnREYmctPmRiZ1Byb2ZpbGUgPT0gQlRfREJHX1BST0ZJTEVfSElEX0EyRFApIHsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSAoQlRfQ09FWF9TVEFURV9QUk9GSUxFX0hJRHxCVF9DT0VYX1NUQVRFX1BST0ZJTEVfQTJEUCk7Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9ISUQpICYmCi0JCSAgICBCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9BMkRQKSkgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IChCVF9DT0VYX1NUQVRFX1BST0ZJTEVfSElEfEJUX0NPRVhfU1RBVEVfUFJPRklMRV9BMkRQKTsKLQkJCWJSZXQgPSB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBiUmV0OwotfQotCi11OCBCVERNX0lzQWN0aW9uSElEUEFOKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZzsKLQl1OCBiUmV0OwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCWJSZXQgPSBmYWxzZTsKLQotCWlmIChwQnREYmctPmRiZ0N0cmwpIHsKLQkJaWYgKHBCdERiZy0+ZGJnUHJvZmlsZSA9PSBCVF9EQkdfUFJPRklMRV9ISURfUEFOKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gKEJUX0NPRVhfU1RBVEVfUFJPRklMRV9ISUR8QlRfQ09FWF9TVEFURV9QUk9GSUxFX1BBTik7Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9ISUQpICYmCi0JCSAgICBCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gKEJUX0NPRVhfU1RBVEVfUFJPRklMRV9ISUR8QlRfQ09FWF9TVEFURV9QUk9GSUxFX1BBTik7Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gYlJldDsKLX0KLQotdTggQlRETV9Jc0FjdGlvblBBTkEyRFAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnOwotCXU4IGJSZXQ7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0JYlJldCA9IGZhbHNlOwotCi0JaWYgKHBCdERiZy0+ZGJnQ3RybCkgewotCQlpZiAocEJ0RGJnLT5kYmdQcm9maWxlID09IEJUX0RCR19QUk9GSUxFX1BBTl9BMkRQKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gKEJUX0NPRVhfU1RBVEVfUFJPRklMRV9QQU58QlRfQ09FWF9TVEFURV9QUk9GSUxFX0EyRFApOwotCQkJYlJldCA9IHRydWU7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfUEFOKSAmJiBCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9BMkRQKSkgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IChCVF9DT0VYX1NUQVRFX1BST0ZJTEVfUEFOfEJUX0NPRVhfU1RBVEVfUFJPRklMRV9BMkRQKTsKLQkJCWJSZXQgPSB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBiUmV0OwotfQotCi1ib29sIHJ0bDg3MjNhX0JUX2VuYWJsZWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5iQ3VyQnREaXNhYmxlZCkKLQkJcmV0dXJuIGZhbHNlOwotCWVsc2UKLQkJcmV0dXJuIHRydWU7Ci19Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdENvZXhpc3QuYyA9PT09PSAqLwotCi0vKiAgPT09PT0gQmVsb3cgdGhpcyBsaW5lIGlzIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9IYWxCVC5jID09PT09ICovCi0KLS8qICAqLwotLypsb2NhbCBmdW5jdGlvbiAqLwotLyogICovCi0KLXN0YXRpYyB2b2lkIGhhbGJ0X0luaXRId0NvbmZpZzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci19Ci0KLS8qICAqLwotLypleHRlcm4gZnVuY3Rpb24gKi8KLS8qICAqLwotdTggSEFMQlRfR2V0UEdBbnROdW0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCXJldHVybiBwSGFsRGF0YS0+YnRfY29leGlzdC5CVF9BbnRfTnVtOwotfQotCi12b2lkIEhBTEJUX1NldEtleShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbnRyeU51bSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRpbmZvOwotCXN0cnVjdCBidF9hc29jX2VudHJ5ICpwQnRBc3NvY0VudHJ5OwotCXUxNgkJCQl1c0NvbmZpZyA9IDA7Ci0KLQlwQlRpbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdEFzc29jRW50cnkgPSAmcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dOwotCi0JcEJ0QXNzb2NFbnRyeS0+SHdDQU1JbmRleCA9IEJUX0hXQ0FNX1NUQVIgKyBFbnRyeU51bTsKLQotCXVzQ29uZmlnID0gQ0FNX1ZBTElEIHwgKENBTV9BRVMgPDwgMik7Ci0JcnRsODcyM2FfY2FtX3dyaXRlKHBhZGFwdGVyLCBwQnRBc3NvY0VudHJ5LT5Id0NBTUluZGV4LCB1c0NvbmZpZywKLQkJCSAgIHBCdEFzc29jRW50cnktPkJUUmVtb3RlTUFDQWRkciwKLQkJCSAgIHBCdEFzc29jRW50cnktPlBUSyArIFRLSVBfRU5DX0tFWV9QT1MpOwotfQotCi12b2lkIEhBTEJUX1JlbW92ZUtleShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbnRyeU51bSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRpbmZvOwotCXN0cnVjdCBidF9hc29jX2VudHJ5ICpwQnRBc3NvY0VudHJ5OwotCi0JcEJUaW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRBc3NvY0VudHJ5ID0gJnBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXTsKLQotCWlmIChwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uSHdDQU1JbmRleCAhPSAwKSB7Ci0JCS8qICBUb0RvIDogYWRkIE5ldyBIQUxCVF9SZW1vdmVLZXkgZnVuY3Rpb24gISEgKi8KLQkJaWYgKHBCdEFzc29jRW50cnktPkh3Q0FNSW5kZXggPj0gQlRfSFdDQU1fU1RBUiAmJgotCQkgICAgcEJ0QXNzb2NFbnRyeS0+SHdDQU1JbmRleCA8IEhBTEZfQ0FNX0VOVFJZKQotCQkJcnRsODcyM2FfY2FtX2VtcHR5X2VudHJ5KHBhZGFwdGVyLAotCQkJCQkJIHBCdEFzc29jRW50cnktPkh3Q0FNSW5kZXgpOwotCQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uSHdDQU1JbmRleCA9IDA7Ci0JfQotfQotCi12b2lkIHJ0bDg3MjNhX0JUX2luaXRfaGFsX3ZhcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuQmx1ZXRvb3RoQ29leGlzdCA9IHBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhDb2V4aXN0OwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LkJUX0FudF9OdW0gPSBwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoQW50TnVtOwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LkJUX0NvZXhpc3RUeXBlID0gcEhhbERhdGEtPkVFUFJPTUJsdWV0b290aFR5cGU7Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQW50X2lzb2xhdGlvbiA9IHBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhBbnRJc29sYXRpb247Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuYnRfcmFkaW9zaGFyZWR0eXBlID0gcEhhbERhdGEtPkVFUFJPTUJsdWV0b290aFJhZGlvU2hhcmVkOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICJCVCBDb2V4aXN0YW5jZSA9IDB4JXhcbiIsIHJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKTsKLQotCWlmIChydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSkgewotCQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQW50X051bSA9PSBBbnRfeDIpIHsKLQkJCUJURE1fU2V0QnRDb2V4Q3VyckFudE51bShwYWRhcHRlciwgMik7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiQmx1ZVRvb3RoIEJUX0FudF9OdW0gPSBBbnR4MlxuIik7Ci0JCX0gZWxzZSBpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQW50X051bSA9PSBBbnRfeDEpIHsKLQkJCUJURE1fU2V0QnRDb2V4Q3VyckFudE51bShwYWRhcHRlciwgMSk7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiQmx1ZVRvb3RoIEJUX0FudF9OdW0gPSBBbnR4MVxuIik7Ci0JCX0KLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkJUQnVzeVRyYWZmaWMgPSBmYWxzZTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkJUVHJhZmZpY01vZGVTZXQgPSBmYWxzZTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkJUTm9uVHJhZmZpY01vZGVTZXQgPSBmYWxzZTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlID0gMDsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuUHJldmlvdXNTdGF0ZSA9IDA7Ci0KLQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAiYnRfcmFkaW9zaGFyZWRUeXBlID0gMHgleFxuIiwKLQkJCSBwSGFsRGF0YS0+YnRfY29leGlzdC5idF9yYWRpb3NoYXJlZHR5cGUpOwotCX0KLX0KLQotYm9vbCBydGw4NzIzYV9CVF9jb2V4aXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQmx1ZXRvb3RoQ29leGlzdCkKLQkJcmV0dXJuIHRydWU7Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXU4IEhBTEJUX0JUQ2hpcFR5cGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCXJldHVybiBwSGFsRGF0YS0+YnRfY29leGlzdC5CVF9Db2V4aXN0VHlwZTsKLX0KLQotdm9pZCBydGw4NzIzYV9CVF9pbml0X2h3Y29uZmlnKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaGFsYnRfSW5pdEh3Q29uZmlnODcyM0EocGFkYXB0ZXIpOwotCXJ0bDg3MjNhX0JUX2RvX2NvZXhpc3QocGFkYXB0ZXIpOwotfQotCi12b2lkIEhBTEJUX1NldFJ0c0N0c05vTGVuTGltaXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLX0KLQotLyogID09PT09IEVuZCBvZiBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvSGFsQlQuYyA9PT09PSAqLwotCi12b2lkIHJ0bDg3MjNhX2R1YWxfYW50ZW5uYV9kZXRlY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbTsKLQlzdHJ1Y3Qgc3dfYW50X3N3ICpwRE1fU1dBVF9UYWJsZTsKLQl1OCBpOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBETV9PZG0gPSAmcEhhbERhdGEtPm9kbXByaXY7Ci0JcERNX1NXQVRfVGFibGUgPSAmcERNX09kbS0+RE1fU1dBVF9UYWJsZTsKLQotCS8qICAqLwotCS8qICA8Um9nZXJfTm90ZXM+IFJUTDg3MjNBIFNpbmdsZSBhbmQgRHVhbCBhbnRlbm5hIGR5bmFtaWMgZGV0ZWN0aW9uCi0JICAgIG1lY2hhbmlzbSB3aGVuIFJGIHBvd2VyIHN0YXRlIGlzIG9uLiAqLwotCS8qICBXZSBzaG91bGQgdGFrZSBwb3dlciB0cmFja2luZywgSVFLLCBMQ0ssIFJDSyBSRiByZWFkL3dyaXRlCi0JICAgIG9wZXJhdGlvbiBpbnRvIGNvbnNpZGVyYXRpb24uICovCi0JLyogIDIwMTEuMTIuMTUuICovCi0JLyogICovCi0JaWYgKCFwSGFsRGF0YS0+YkFudGVubmFEZXRlY3RlZCkgewotCQl1OCBidEFudE51bSA9IEJUX0dldFBHQW50TnVtKHBhZGFwdGVyKTsKLQotCQkvKiAgU2V0IGRlZmF1bHQgYW50ZW5uYSBCIHN0YXR1cyAqLwotCQlpZiAoYnRBbnROdW0gPT0gQW50X3gyKQotCQkJcERNX1NXQVRfVGFibGUtPkFOVEJfT04gPSB0cnVlOwotCQllbHNlIGlmIChidEFudE51bSA9PSBBbnRfeDEpCi0JCQlwRE1fU1dBVF9UYWJsZS0+QU5UQl9PTiA9IGZhbHNlOwotCQllbHNlCi0JCQlwRE1fU1dBVF9UYWJsZS0+QU5UQl9PTiA9IHRydWU7Ci0KLQkJaWYgKHBIYWxEYXRhLT5DdXN0b21lcklEICE9IFJUX0NJRF9UT1NISUJBKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0FOVEVOTkFfREVURUNUSU9OX0NOVDsgaSsrKSB7Ci0JCQkJaWYgKE9ETV9TaW5nbGVEdWFsQW50ZW5uYURldGVjdGlvbgotCQkJCSAgICAoJnBIYWxEYXRhLT5vZG1wcml2LCBBTlRURVNUQUxMKSA9PSB0cnVlKQotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogIFNldCBkZWZhdWx0IGFudGVubmEgbnVtYmVyIGZvciBCVCBjb2V4aXN0ZW5jZSAqLwotCQkJaWYgKGJ0QW50TnVtID09IEFudF94MikKLQkJCQlCVF9TZXRCdENvZXhDdXJyQW50TnVtKHBhZGFwdGVyLAotCQkJCQkJICAgICAgIHBETV9TV0FUX1RhYmxlLT4KLQkJCQkJCSAgICAgICBBTlRCX09OID8gMiA6IDEpOwotCQl9Ci0JCXBIYWxEYXRhLT5iQW50ZW5uYURldGVjdGVkID0gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2NtZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjMwZjRjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2NtZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRMODcyM0FfQ01EX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgotI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLSNkZWZpbmUgUlRMOTJDX01BWF9IMkNfQk9YX05VTVMJCTQKLSNkZWZpbmUgUlRMOTJDX01BWF9DTURfTEVOCQk1Ci0jZGVmaW5lIE1FU1NBR0VfQk9YX1NJWkUJCTQKLSNkZWZpbmUgRVhfTUVTU0FHRV9CT1hfU0laRQkJMgotCi1zdGF0aWMgdTggX2lzX2Z3X3JlYWRfY21kX2Rvd24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbXNnYm94X251bSkKLXsKLQl1OCByZWFkX2Rvd24gPSBmYWxzZTsKLQlpbnQJcmV0cnlfY250cyA9IDEwMDsKLQl1OCB2YWxpZDsKLQotCWRvIHsKLQkJdmFsaWQgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19ITUVURlIpICYgQklUKG1zZ2JveF9udW0pOwotCQlpZiAoMCA9PSB2YWxpZCkKLQkJCXJlYWRfZG93biA9IHRydWU7Ci0JfSB3aGlsZSAoKCFyZWFkX2Rvd24pICYmIChyZXRyeV9jbnRzLS0pKTsKLQotCXJldHVybiByZWFkX2Rvd247Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBIMkMgTXNnIGZvcm1hdCA6Ci0qfCAzMSAtIDgJCXw3CQl8IDYgLSAwCXwKLSp8IGgyY19tc2cJfEV4dF9iaXQJfENNRF9JRAl8Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgRmlsbEgyQ0NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbGVtZW50SUQsIHUzMiBDbWRMZW4sCi0JICAgICAgIHU4ICpwQ21kQnVmZmVyKQotewotCXU4IGJjbWRfZG93biA9IGZhbHNlOwotCXMzMiByZXRyeV9jbnRzID0gMTAwOwotCXU4IGgyY19ib3hfbnVtOwotCXUzMiBtc2dib3hfYWRkcjsKLQl1MzIgbXNnYm94X2V4X2FkZHI7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQl1MzIgaDJjX2NtZCA9IDA7Ci0JdTE2IGgyY19jbWRfZXggPSAwOwotCWludCByZXQgPSBfRkFJTDsKLQotCXBhZGFwdGVyID0gR0VUX1BSSU1BUllfQURBUFRFUihwYWRhcHRlcik7Ci0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JbXV0ZXhfbG9jaygmYWRhcHRlcl90b19kdm9iaihwYWRhcHRlciktPmgyY19md2NtZF9tdXRleCk7Ci0KLQlpZiAoIXBDbWRCdWZmZXIpCi0JCWdvdG8gZXhpdDsKLQlpZiAoQ21kTGVuID4gUlRMOTJDX01BWF9DTURfTEVOKQotCQlnb3RvIGV4aXQ7Ci0JaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IHRydWUpCi0JCWdvdG8gZXhpdDsKLQotCS8qIHBheSBhdHRlbnRpb24gdG8gaWYgIHJhY2UgY29uZGl0aW9uIGhhcHBlbmVkIGluICBIMkMgY21kIHNldHRpbmcuICovCi0JZG8gewotCQloMmNfYm94X251bSA9IHBIYWxEYXRhLT5MYXN0SE1FQm94TnVtOwotCi0JCWlmICghX2lzX2Z3X3JlYWRfY21kX2Rvd24ocGFkYXB0ZXIsIGgyY19ib3hfbnVtKSkgewotCQkJREJHXzg3MjNBKCIgZncgcmVhZCBjbWQgZmFpbGVkLi4uXG4iKTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCWlmIChDbWRMZW4gPD0gMykgewotCQkJbWVtY3B5KCh1OCAqKSgmaDJjX2NtZCkrMSwgcENtZEJ1ZmZlciwgQ21kTGVuKTsKLQkJfSBlbHNlIHsKLQkJCW1lbWNweSgodTggKikoJmgyY19jbWRfZXgpLCBwQ21kQnVmZmVyLCBFWF9NRVNTQUdFX0JPWF9TSVpFKTsKLQkJCW1lbWNweSgodTggKikoJmgyY19jbWQpKzEsIHBDbWRCdWZmZXIrMiwgKENtZExlbi1FWF9NRVNTQUdFX0JPWF9TSVpFKSk7Ci0JCQkqKHU4ICopKCZoMmNfY21kKSB8PSBCSVQoNyk7Ci0JCX0KLQotCQkqKHU4ICopKCZoMmNfY21kKSB8PSBFbGVtZW50SUQ7Ci0KLQkJaWYgKGgyY19jbWQgJiBCSVQoNykpIHsKLQkJCW1zZ2JveF9leF9hZGRyID0gUkVHX0hNRUJPWF9FWFRfMCArIChoMmNfYm94X251bSAqIEVYX01FU1NBR0VfQk9YX1NJWkUpOwotCQkJaDJjX2NtZF9leCA9IGxlMTZfdG9fY3B1KGgyY19jbWRfZXgpOwotCQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIG1zZ2JveF9leF9hZGRyLCBoMmNfY21kX2V4KTsKLQkJfQotCQltc2dib3hfYWRkciA9IFJFR19ITUVCT1hfMCArIChoMmNfYm94X251bSAqIE1FU1NBR0VfQk9YX1NJWkUpOwotCQloMmNfY21kID0gbGUzMl90b19jcHUoaDJjX2NtZCk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBtc2dib3hfYWRkciwgaDJjX2NtZCk7Ci0KLQkJYmNtZF9kb3duID0gdHJ1ZTsKLQotCQlwSGFsRGF0YS0+TGFzdEhNRUJveE51bSA9IChoMmNfYm94X251bSsxKSAlIFJUTDkyQ19NQVhfSDJDX0JPWF9OVU1TOwotCi0JfSB3aGlsZSAoKCFiY21kX2Rvd24pICYmIChyZXRyeV9jbnRzLS0pKTsKLQotCXJldCA9IF9TVUNDRVNTOwotCi1leGl0OgotCW11dGV4X3VubG9jaygmYWRhcHRlcl90b19kdm9iaihwYWRhcHRlciktPmgyY19md2NtZF9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJ0bDg3MjNhX3NldF9yc3NpX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgcGFyYW0pCi17Ci0JX19sZTMyIGNtZCA9IGNwdV90b19sZTMyKHBhcmFtKTsKLQotCUZpbGxIMkNDbWQocGFkYXB0ZXIsIFJTU0lfU0VUVElOR19FSUQsIDMsICh2b2lkICopJmNtZCk7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLWludCBydGw4NzIzYV9zZXRfcmFpZF9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIG1hc2ssIHU4IGFyZykKLXsKLQl1OCBidWZbNV07Ci0KLQltZW1zZXQoYnVmLCAwLCA1KTsKLQlwdXRfdW5hbGlnbmVkX2xlMzIobWFzaywgYnVmKTsKLQlidWZbNF0gID0gYXJnOwotCi0JRmlsbEgyQ0NtZChwYWRhcHRlciwgTUFDSURfQ09ORklHX0VJRCwgNSwgYnVmKTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotLyogYml0bWFwWzA6MjddID0gdHhfcmF0ZV9iaXRtYXAgKi8KLS8qIGJpdG1hcFsyODozMV09IFJhdGUgQWRhcHRpdmUgaWQgKi8KLS8qIGFyZ1swOjRdID0gbWFjaWQgKi8KLS8qIGFyZ1s1XSA9IFNob3J0IEdJICovCi12b2lkIHJ0bDg3MjNhX2FkZF9yYXRlYXRpZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MzIgYml0bWFwLCB1OCBhcmcsIHU4IHJzc2lfbGV2ZWwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7Ci0JdTggbWFjaWQgPSBhcmcgJiAweDFmOwotCXUzMiByYWlkID0gYml0bWFwICYgMHhmMDAwMDAwMDsKLQotCWJpdG1hcCAmPSAweDBmZmZmZmZmOwotCWlmIChyc3NpX2xldmVsICE9IERNX1JBVFJfU1RBX0lOSVQpCi0JCWJpdG1hcCA9IE9ETV9HZXRfUmF0ZV9CaXRtYXAyM2EocEhhbERhdGEsIG1hY2lkLCBiaXRtYXAsCi0JCQkJCQlyc3NpX2xldmVsKTsKLQotCWJpdG1hcCB8PSByYWlkOwotCi0JcnRsODcyM2Ffc2V0X3JhaWRfY21kKHBBZGFwdGVyLCBiaXRtYXAsIGFyZyk7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X0Z3UHdyTW9kZV9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggTW9kZSkKLXsKLQlzdHJ1Y3Qgc2V0cHdybW9kZV9wYXJtIEgyQ1NldFB3ck1vZGU7Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlEQkdfODcyM0EoIiVzOiBNb2RlID0lZCBTbWFydFBTID0lZCBVQVBTRCA9JWQgQmNuTW9kZSA9IDB4JTAyeFxuIiwgX19mdW5jX18sCi0JCQlNb2RlLCBwd3Jwcml2LT5zbWFydF9wcywgcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi51YXBzZF9lbmFibGUsIHB3cnByaXYtPmJjbl9hbnRfbW9kZSk7Ci0KLQkvKiAgRm9yZWNlIGxlYXZlIFJGIGxvdyBwb3dlciBtb2RlIGZvciAxVDFSIHRvCi0JICAgIHByZXZlbnQgY29uZmljdGluZyBzZXR0aW5nIGluIEZ3IHBvd2VyICovCi0JLyogIHNhdmluZyBzZXF1ZW5jZS4gMjAxMC4wNi4wNy4gQWRkZWQgYnkgdHlubGkuCi0JICAgIFN1Z2dlc3RlZCBieSBTRDMgeXNjaGFuZy4gKi8KLQlpZiAoTW9kZSAhPSBQU19NT0RFX0FDVElWRSAmJiBwSGFsRGF0YS0+cmZfdHlwZSAhPSBSRl8yVDJSKQotCQlPRE1fUkZfU2F2aW5nMjNhKCZwSGFsRGF0YS0+b2RtcHJpdiwgdHJ1ZSk7Ci0KLQlIMkNTZXRQd3JNb2RlLk1vZGUgPSBNb2RlOwotCUgyQ1NldFB3ck1vZGUuU21hcnRQUyA9IHB3cnByaXYtPnNtYXJ0X3BzOwotCUgyQ1NldFB3ck1vZGUuQXdha2VJbnRlcnZhbCA9IDE7Ci0JSDJDU2V0UHdyTW9kZS5iQWxsUXVldWVVQVBTRCA9IHBhZGFwdGVyLT5yZWdpc3RyeXByaXYudWFwc2RfZW5hYmxlOwotCUgyQ1NldFB3ck1vZGUuQmNuQW50TW9kZSA9IHB3cnByaXYtPmJjbl9hbnRfbW9kZTsKLQotCUZpbGxIMkNDbWQocGFkYXB0ZXIsIFNFVF9QV1JNT0RFX0VJRCwgc2l6ZW9mKEgyQ1NldFB3ck1vZGUpLCAodTggKikmSDJDU2V0UHdyTW9kZSk7Ci0KLX0KLQotc3RhdGljIHZvaWQKLUNvbnN0cnVjdEJlYWNvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcGZyYW1lLCB1MzIgKnBMZW5ndGgpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCXUzMiByYXRlX2xlbiwgcGt0bGVuOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKmN1cl9uZXR3b3JrID0gJnBtbG1laW5mby0+bmV0d29yazsKLQl1OCBiY19hZGRyW10gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07Ci0KLQkvKiBEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7ICovCi0KLQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXBmcmFtZTsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pOwotCi0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmRhLCBiY19hZGRyKTsKLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+c2EsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSk7Ci0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmJzc2lkLCBnZXRfbXlfYnNzaWQyM2EoY3VyX25ldHdvcmspKTsKLQotCS8qIEEgQmVhY29uIGZyYW1lIHNob3VsZG4ndCBoYXZlIGZyYWdtZW50IGJpdHMgc2V0ICovCi0JbWdtdC0+c2VxX2N0cmwgPSAwOwotCi0JLyogdGltZXN0YW1wIHdpbGwgYmUgaW5zZXJ0ZWQgYnkgaGFyZHdhcmUgKi8KLQotCXB1dF91bmFsaWduZWRfbGUxNihjdXJfbmV0d29yay0+YmVhY29uX2ludGVydmFsLAotCQkJICAgJm1nbXQtPnUuYmVhY29uLmJlYWNvbl9pbnQpOwotCi0JcHV0X3VuYWxpZ25lZF9sZTE2KGN1cl9uZXR3b3JrLT5jYXBhYmlsaXR5LAotCQkJICAgJm1nbXQtPnUuYmVhY29uLmNhcGFiX2luZm8pOwotCi0JcGZyYW1lID0gbWdtdC0+dS5iZWFjb24udmFyaWFibGU7Ci0JcGt0bGVuID0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmJlYWNvbi52YXJpYWJsZSk7Ci0KLQlpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gTVNSX0FQKSB7Ci0JCS8qIERCR184NzIzQSgiaWUgbGVuID0lZFxuIiwgY3VyX25ldHdvcmstPklFTGVuZ3RoKTsgKi8KLQkJcGt0bGVuICs9IGN1cl9uZXR3b3JrLT5JRUxlbmd0aDsKLQkJbWVtY3B5KHBmcmFtZSwgY3VyX25ldHdvcmstPklFcywgcGt0bGVuKTsKLQotCQlnb3RvIF9Db25zdHJ1Y3RCZWFjb247Ci0JfQotCi0JLyogYmVsb3cgZm9yIGFkLWhvYyBtb2RlICovCi0KLQkvKiAgU1NJRCAqLwotCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TU0lELAotCQkJICAgICAgIGN1cl9uZXR3b3JrLT5Tc2lkLnNzaWRfbGVuLAotCQkJICAgICAgIGN1cl9uZXR3b3JrLT5Tc2lkLnNzaWQsICZwa3RsZW4pOwotCi0JLyogIHN1cHBvcnRlZCByYXRlcy4uLiAqLwotCXJhdGVfbGVuID0gcnR3X2dldF9yYXRlc2V0X2xlbjIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TVVBQX1JBVEVTLCAoKHJhdGVfbGVuID4gOCkgPwotCQkJICAgICAgIDggOiByYXRlX2xlbiksIGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcywgJnBrdGxlbik7Ci0KLQkvKiAgRFMgcGFyYW1ldGVyIHNldCAqLwotCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9EU19QQVJBTVMsIDEsICh1bnNpZ25lZCBjaGFyICopCi0JCQkgICAgICAgJmN1cl9uZXR3b3JrLT5EU0NvbmZpZywgJnBrdGxlbik7Ci0KLQlpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gTVNSX0FESE9DKSB7Ci0JCXUzMiBBVElNV2luZG93OwotCQkvKiAgSUJTUyBQYXJhbWV0ZXIgU2V0Li4uICovCi0JCS8qIEFUSU1XaW5kb3cgPSBjdXItPkFUSU1XaW5kb3c7ICovCi0JCUFUSU1XaW5kb3cgPSAwOwotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfSUJTU19QQVJBTVMsIDIsCi0JCQkJICAgICAgICh1bnNpZ25lZCBjaGFyICopJkFUSU1XaW5kb3csICZwa3RsZW4pOwotCX0KLQotCS8qIHRvZG86IEVSUCBJRSAqLwotCi0JLyogIEVYVEVSTkRFRCBTVVBQT1JURUQgUkFURSAqLwotCWlmIChyYXRlX2xlbiA+IDgpCi0JCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9FWFRfU1VQUF9SQVRFUywKLQkJCQkgICAgICAgKHJhdGVfbGVuIC0gOCksCi0JCQkJICAgICAgIChjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMgKyA4KSwKLQkJCQkgICAgICAgJnBrdGxlbik7Ci0KLQkvKiB0b2RvOkhUIGZvciBhZGhvYyAqLwotCi1fQ29uc3RydWN0QmVhY29uOgotCi0JaWYgKChwa3RsZW4gKyBUWERFU0NfU0laRSkgPiA1MTIpIHsKLQkJREJHXzg3MjNBKCJiZWFjb24gZnJhbWUgdG9vIGxhcmdlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCSpwTGVuZ3RoID0gcGt0bGVuOwotCi0JLyogREJHXzg3MjNBKCIlcyBiY25fc3ogPSVkXG4iLCBfX2Z1bmNfXywgcGt0bGVuKTsgKi8KLQotfQotCi1zdGF0aWMgdm9pZCBDb25zdHJ1Y3RQU1BvbGwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICB1OCAqcGZyYW1lLCB1MzIgKnBMZW5ndGgpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKLQotCS8qICBGcmFtZSBjb250cm9sLiAqLwotCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sID0KLQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0NUTCB8IElFRUU4MDIxMV9TVFlQRV9QU1BPTEwpOwotCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1BNKTsKLQotCS8qICBBSUQuICovCi0JcHdsYW5oZHItPmR1cmF0aW9uX2lkID0gY3B1X3RvX2xlMTYocG1sbWVpbmZvLT5haWQgfCAweGMwMDApOwotCi0JLyogIEJTU0lELiAqLwotCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSwgRVRIX0FMRU4pOwotCi0JLyogIFRBLiAqLwotCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pOwotCi0JKnBMZW5ndGggPSAxNjsKLX0KLQotc3RhdGljIHZvaWQKLUNvbnN0cnVjdE51bGxGdW5jdGlvbkRhdGEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnBmcmFtZSwKLQkJCSAgdTMyICpwTGVuZ3RoLCB1OCAqU3RhQWRkciwgdTggYlFvUywgdTggQUMsCi0JCQkgIHU4IGJFb3NwLCB1OCBiRm9yY2VQb3dlclNhdmUpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwotCXUzMiBwa3RsZW47Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpjdXJfbmV0d29yayA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKLQotCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sID0gMDsKLQlwd2xhbmhkci0+c2VxX2N0cmwgPSAwOwotCi0JaWYgKGJGb3JjZVBvd2VyU2F2ZSkKLQkJcHdsYW5oZHItPmZyYW1lX2NvbnRyb2wgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfUE0pOwotCi0Jc3dpdGNoIChjdXJfbmV0d29yay0+bmV0d29yay5pZm1vZGUpIHsKLQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9UT0RTKTsKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwKLQkJICAgICAgIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSwgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksCi0JCSAgICAgICBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIFN0YUFkZHIsIEVUSF9BTEVOKTsKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKLQkJcHdsYW5oZHItPmZyYW1lX2NvbnRyb2wgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfRlJPTURTKTsKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgU3RhQWRkciwgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIyLAotCQkgICAgICAgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwKLQkJICAgICAgIEVUSF9BTEVOKTsKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKLQlkZWZhdWx0OgotCQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBTdGFBZGRyLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIzLAotCQkgICAgICAgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspLCBFVEhfQUxFTik7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChiUW9TID09IHRydWUpIHsKLQkJc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyICpxb3NoZHI7Ci0JCXFvc2hkciA9IChzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIgKilwZnJhbWU7Ci0KLQkJcW9zaGRyLT5mcmFtZV9jb250cm9sIHw9Ci0JCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfREFUQSB8Ci0JCQkJICAgIElFRUU4MDIxMV9TVFlQRV9RT1NfTlVMTEZVTkMpOwotCi0JCXFvc2hkci0+cW9zX2N0cmwgPSBjcHVfdG9fbGUxNihBQyAmIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLKTsKLQkJaWYgKGJFb3NwKQotCQkJcW9zaGRyLT5xb3NfY3RybCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfUU9TX0NUTF9FT1NQKTsKLQotCQlwa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyKTsKLQl9IGVsc2UgewotCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PQotCQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0RBVEEgfAotCQkJCSAgICBJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMpOwotCi0JCXBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JfQotCi0JKnBMZW5ndGggPSBwa3RsZW47Ci19Ci0KLXN0YXRpYyB2b2lkIENvbnN0cnVjdFByb2JlUnNwKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwZnJhbWUsCi0JCQkgICAgICB1MzIgKnBMZW5ndGgsIHU4ICpTdGFBZGRyLCBib29sIGJIaWRlU1NJRCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0JdTggKm1hYywgKmJzc2lkOwotCXUzMiBwa3RsZW47Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyX25ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCi0JLyogREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOyAqLwotCi0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilwZnJhbWU7Ci0KLQltYWMgPSBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdik7Ci0JYnNzaWQgPSBjdXJfbmV0d29yay0+TWFjQWRkcmVzczsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKTsKLQotCW1nbXQtPnNlcV9jdHJsID0gMDsKLQotCW1lbWNweShtZ210LT5kYSwgU3RhQWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5zYSwgbWFjLCBFVEhfQUxFTik7Ci0JbWVtY3B5KG1nbXQtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOwotCi0JcHV0X3VuYWxpZ25lZF9sZTY0KGN1cl9uZXR3b3JrLT50c2YsCi0JCQkgICAmbWdtdC0+dS5wcm9iZV9yZXNwLnRpbWVzdGFtcCk7Ci0JcHV0X3VuYWxpZ25lZF9sZTE2KGN1cl9uZXR3b3JrLT5iZWFjb25faW50ZXJ2YWwsCi0JCQkgICAmbWdtdC0+dS5wcm9iZV9yZXNwLmJlYWNvbl9pbnQpOwotCXB1dF91bmFsaWduZWRfbGUxNihjdXJfbmV0d29yay0+Y2FwYWJpbGl0eSwKLQkJCSAgICZtZ210LT51LnByb2JlX3Jlc3AuY2FwYWJfaW5mbyk7Ci0KLQlwa3RsZW4gPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUucHJvYmVfcmVzcC52YXJpYWJsZSk7Ci0KLQlpZiAoY3VyX25ldHdvcmstPklFTGVuZ3RoID4gTUFYX0lFX1NaKQotCQlyZXR1cm47Ci0KLQltZW1jcHkobWdtdC0+dS5wcm9iZV9yZXNwLnZhcmlhYmxlLCBjdXJfbmV0d29yay0+SUVzLAotCSAgICAgICBjdXJfbmV0d29yay0+SUVMZW5ndGgpOwotCXBrdGxlbiArPSAoY3VyX25ldHdvcmstPklFTGVuZ3RoKTsKLQotCSpwTGVuZ3RoID0gcGt0bGVuOwotfQotCi0vKiAgKi8KLS8qICBEZXNjcmlwdGlvbjogRmlsbCB0aGUgcmVzZXJ2ZWQgcGFja2V0cyB0aGF0IEZXIHdpbGwgdXNlIHRvIFJTVkQgcGFnZS4gKi8KLS8qCQkJTm93IHdlIGp1c3Qgc2VuZCA0IHR5cGVzIHBhY2tldCB0byByc3ZkIHBhZ2UuICovCi0vKgkJCSgxKUJlYWNvbiwgKDIpUHMtcG9sbCwgKDMpTnVsbCBkYXRhLCAoNClQcm9iZVJzcC4gKi8KLS8qCUlucHV0OiAqLwotLyoJICAgIGJETEZpbmlzaGVkIC0gZmFsc2U6IEF0IHRoZSBmaXJzdCB0aW1lIHdlIHdpbGwgc2VuZCBhbGwgdGhlIHBhY2tldHMgYXMgYSBsYXJnZSBwYWNrZXQgdG8gSHcsICovCi0vKgkJCQkJCXNvIHdlIG5lZWQgdG8gc2V0IHRoZSBwYWNrZXQgbGVuZ3RoIHRvIHRvdGFsIGxlbmdoLiAqLwotLyoJCQkgICAgICB0cnVlOiBBdCB0aGUgc2Vjb25kIHRpbWUsIHdlIHNob3VsZCBzZW5kIHRoZSBmaXJzdCBwYWNrZXQgKGRlZmF1bHQ6YmVhY29uKSAqLwotLyoJCQkJCQl0byBIdyBhZ2FpbiBhbmQgc2V0IHRoZSBsZW5naCBpbiBkZXNjcmlwdG9yIHRvIHRoZSByZWFsIGJlYWNvbiBsZW5naC4gKi8KLS8qICAyMDA5LjEwLjE1IGJ5IHR5bmxpLiAqLwotc3RhdGljIHZvaWQgU2V0RndSc3ZkUGFnZVBrdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBib29sIGJETEZpbmlzaGVkKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWU7Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWI7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dDsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvOwotCXUzMiBCZWFjb25MZW5ndGggPSAwLCBQcm9iZVJzcExlbmd0aCA9IDAsIFBTUG9sbExlbmd0aDsKLQl1MzIgTnVsbERhdGFMZW5ndGgsIFFvc051bGxMZW5ndGgsIEJUUW9zTnVsbExlbmd0aDsKLQl1OCAqUmVzZXJ2ZWRQYWdlUGFja2V0OwotCXU4IFBhZ2VOdW0sIFBhZ2VOZWVkLCBUeERlc2NMZW47Ci0JdTE2IEJ1ZkluZGV4OwotCXUzMiBUb3RhbFBhY2tldExlbjsKLQlzdHJ1Y3QgcnN2ZHBhZ2VfbG9jCVJzdmRQYWdlTG9jOwotCi0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JUmVzZXJ2ZWRQYWdlUGFja2V0ID0ga3phbGxvYygxMDAwLCBHRlBfS0VSTkVMKTsKLQlpZiAoUmVzZXJ2ZWRQYWdlUGFja2V0ID09IE5VTEwpIHsKLQkJREJHXzg3MjNBKCIlczogYWxsb2MgUmVzZXJ2ZWRQYWdlUGFja2V0IGZhaWwhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCVR4RGVzY0xlbiA9IFRYREVTQ19TSVpFOwotCVBhZ2VOdW0gPSAwOwotCi0JLyogMyAoMSkgYmVhY29uICovCi0JQnVmSW5kZXggPSBUWERFU0NfT0ZGU0VUOwotCUNvbnN0cnVjdEJlYWNvbihwYWRhcHRlciwgJlJlc2VydmVkUGFnZVBhY2tldFtCdWZJbmRleF0sICZCZWFjb25MZW5ndGgpOwotCi0JLyogIFdoZW4gd2UgY291bnQgdGhlIGZpcnN0IHBhZ2Ugc2l6ZSwgd2UgbmVlZCB0byByZXNlcnZlIGRlc2NyaXB0aW9uIHNpemUgZm9yIHRoZSBSU1ZEICovCi0JLyogIHBhY2tldCwgaXQgd2lsbCBiZSBmaWxsZWQgaW4gZnJvbnQgb2YgdGhlIHBhY2tldCBpbiBUWFBLVEJVRi4gKi8KLQlQYWdlTmVlZCA9ICh1OClQYWdlTnVtXzEyOChUeERlc2NMZW4gKyBCZWFjb25MZW5ndGgpOwotCS8qICBUbyByZXNlcnZlZCAyIHBhZ2VzIGZvciBiZWFjb24gYnVmZmVyLiAyMDEwLjA2LjI0LiAqLwotCWlmIChQYWdlTmVlZCA9PSAxKQotCQlQYWdlTmVlZCArPSAxOwotCVBhZ2VOdW0gKz0gUGFnZU5lZWQ7Ci0JcEhhbERhdGEtPkZ3UnN2ZFBhZ2VTdGFydE9mZnNldCA9IFBhZ2VOdW07Ci0KLQlCdWZJbmRleCArPSBQYWdlTmVlZCoxMjg7Ci0KLQkvKiAzICgyKSBwcy1wb2xsICovCi0JUnN2ZFBhZ2VMb2MuTG9jUHNQb2xsID0gUGFnZU51bTsKLQlDb25zdHJ1Y3RQU1BvbGwocGFkYXB0ZXIsICZSZXNlcnZlZFBhZ2VQYWNrZXRbQnVmSW5kZXhdLCAmUFNQb2xsTGVuZ3RoKTsKLQlydGw4NzIzYV9maWxsX2Zha2VfdHhkZXNjKHBhZGFwdGVyLCAmUmVzZXJ2ZWRQYWdlUGFja2V0W0J1ZkluZGV4LVR4RGVzY0xlbl0sIFBTUG9sbExlbmd0aCwgdHJ1ZSwgZmFsc2UpOwotCi0JUGFnZU5lZWQgPSAodTgpUGFnZU51bV8xMjgoVHhEZXNjTGVuICsgUFNQb2xsTGVuZ3RoKTsKLQlQYWdlTnVtICs9IFBhZ2VOZWVkOwotCi0JQnVmSW5kZXggKz0gUGFnZU5lZWQqMTI4OwotCi0JLyogMyAoMykgbnVsbCBkYXRhICovCi0JUnN2ZFBhZ2VMb2MuTG9jTnVsbERhdGEgPSBQYWdlTnVtOwotCUNvbnN0cnVjdE51bGxGdW5jdGlvbkRhdGEocGFkYXB0ZXIsICZSZXNlcnZlZFBhZ2VQYWNrZXRbQnVmSW5kZXhdLAotCQkJCSAgJk51bGxEYXRhTGVuZ3RoLAotCQkJCSAgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspLAotCQkJCSAgZmFsc2UsIDAsIDAsIGZhbHNlKTsKLQlydGw4NzIzYV9maWxsX2Zha2VfdHhkZXNjKHBhZGFwdGVyLAotCQkJCSAgJlJlc2VydmVkUGFnZVBhY2tldFtCdWZJbmRleC1UeERlc2NMZW5dLAotCQkJCSAgTnVsbERhdGFMZW5ndGgsIGZhbHNlLCBmYWxzZSk7Ci0KLQlQYWdlTmVlZCA9ICh1OClQYWdlTnVtXzEyOChUeERlc2NMZW4gKyBOdWxsRGF0YUxlbmd0aCk7Ci0JUGFnZU51bSArPSBQYWdlTmVlZDsKLQotCUJ1ZkluZGV4ICs9IFBhZ2VOZWVkKjEyODsKLQotCS8qIDMgKDQpIHByb2JlIHJlc3BvbnNlICovCi0JUnN2ZFBhZ2VMb2MuTG9jUHJvYmVSc3AgPSBQYWdlTnVtOwotCUNvbnN0cnVjdFByb2JlUnNwKAotCQlwYWRhcHRlciwKLQkJJlJlc2VydmVkUGFnZVBhY2tldFtCdWZJbmRleF0sCi0JCSZQcm9iZVJzcExlbmd0aCwKLQkJZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspLAotCQlmYWxzZSk7Ci0JcnRsODcyM2FfZmlsbF9mYWtlX3R4ZGVzYyhwYWRhcHRlciwgJlJlc2VydmVkUGFnZVBhY2tldFtCdWZJbmRleC1UeERlc2NMZW5dLCBQcm9iZVJzcExlbmd0aCwgZmFsc2UsIGZhbHNlKTsKLQotCVBhZ2VOZWVkID0gKHU4KVBhZ2VOdW1fMTI4KFR4RGVzY0xlbiArIFByb2JlUnNwTGVuZ3RoKTsKLQlQYWdlTnVtICs9IFBhZ2VOZWVkOwotCi0JQnVmSW5kZXggKz0gUGFnZU5lZWQqMTI4OwotCi0JLyogMyAoNSkgUW9zIG51bGwgZGF0YSAqLwotCVJzdmRQYWdlTG9jLkxvY1Fvc051bGwgPSBQYWdlTnVtOwotCUNvbnN0cnVjdE51bGxGdW5jdGlvbkRhdGEoCi0JCXBhZGFwdGVyLAotCQkmUmVzZXJ2ZWRQYWdlUGFja2V0W0J1ZkluZGV4XSwKLQkJJlFvc051bGxMZW5ndGgsCi0JCWdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSwKLQkJdHJ1ZSwgMCwgMCwgZmFsc2UpOwotCXJ0bDg3MjNhX2ZpbGxfZmFrZV90eGRlc2MocGFkYXB0ZXIsICZSZXNlcnZlZFBhZ2VQYWNrZXRbQnVmSW5kZXgtVHhEZXNjTGVuXSwgUW9zTnVsbExlbmd0aCwgZmFsc2UsIGZhbHNlKTsKLQotCVBhZ2VOZWVkID0gKHU4KVBhZ2VOdW1fMTI4KFR4RGVzY0xlbiArIFFvc051bGxMZW5ndGgpOwotCVBhZ2VOdW0gKz0gUGFnZU5lZWQ7Ci0KLQlCdWZJbmRleCArPSBQYWdlTmVlZCoxMjg7Ci0KLQkvKiAzICg2KSBCVCBRb3MgbnVsbCBkYXRhICovCi0JUnN2ZFBhZ2VMb2MuTG9jQlRRb3NOdWxsID0gUGFnZU51bTsKLQlDb25zdHJ1Y3ROdWxsRnVuY3Rpb25EYXRhKAotCQlwYWRhcHRlciwKLQkJJlJlc2VydmVkUGFnZVBhY2tldFtCdWZJbmRleF0sCi0JCSZCVFFvc051bGxMZW5ndGgsCi0JCWdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSwKLQkJdHJ1ZSwgMCwgMCwgZmFsc2UpOwotCXJ0bDg3MjNhX2ZpbGxfZmFrZV90eGRlc2MocGFkYXB0ZXIsICZSZXNlcnZlZFBhZ2VQYWNrZXRbQnVmSW5kZXgtVHhEZXNjTGVuXSwgQlRRb3NOdWxsTGVuZ3RoLCBmYWxzZSwgdHJ1ZSk7Ci0KLQlUb3RhbFBhY2tldExlbiA9IEJ1ZkluZGV4ICsgQlRRb3NOdWxsTGVuZ3RoOwotCi0JcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwotCWlmIChwbWdudGZyYW1lID09IE5VTEwpCi0JCWdvdG8gZXhpdDsKLQotCS8qICB1cGRhdGUgYXR0cmlidXRlICovCi0JcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIyM2EocGFkYXB0ZXIsIHBhdHRyaWIpOwotCXBhdHRyaWItPnFzZWwgPSAweDEwOwotCXBhdHRyaWItPnBrdGxlbiA9IHBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IFRvdGFsUGFja2V0TGVuIC0gVFhERVNDX09GRlNFVDsKLQltZW1jcHkocG1nbnRmcmFtZS0+YnVmX2FkZHIsIFJlc2VydmVkUGFnZVBhY2tldCwgVG90YWxQYWNrZXRMZW4pOwotCi0JcnRsODcyM2F1X21nbnRfeG1pdChwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci0KLQlEQkdfODcyM0EoIiVzOiBTZXQgUlNWRCBwYWdlIGxvY2F0aW9uIHRvIEZ3XG4iLCBfX2Z1bmNfXyk7Ci0JRmlsbEgyQ0NtZChwYWRhcHRlciwgUlNWRF9QQUdFX0VJRCwgc2l6ZW9mKFJzdmRQYWdlTG9jKSwgKHU4ICopJlJzdmRQYWdlTG9jKTsKLQotZXhpdDoKLQlrZnJlZShSZXNlcnZlZFBhZ2VQYWNrZXQpOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9Gd0pvaW5Cc3NSZXBvcnRfY21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG1zdGF0dXMpCi17Ci0Jc3RydWN0IGpvaW5ic3NycHRfcGFybQlKb2luQnNzUnB0UGFybTsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JREJHXzg3MjNBKCIlcyBtc3RhdHVzKCV4KVxuIiwgX19mdW5jX18sIG1zdGF0dXMpOwotCi0JaWYgKG1zdGF0dXMgPT0gMSkgewotCQlib29sIGJSZWNvdmVyID0gZmFsc2U7Ci0JCXU4IHY4OwotCi0JCS8qICBXZSBzaG91bGQgc2V0IEFJRCwgY29ycmVjdCBUU0YsIEhXIHNlcSBlbmFibGUgYmVmb3JlIHNldCBKb2luQnNzUmVwb3J0IHRvIEZ3IGluIDg4LzkyQy4gKi8KLQkJLyogIFN1Z2dlc3RlZCBieSBmaWxlbi4gQWRkZWQgYnkgdHlubGkuICovCi0JCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfQkNOX1BTUl9SUFQsCi0JCQkJICAweEMwMDB8cG1sbWVpbmZvLT5haWQpOwotCQkvKiAgRG8gbm90IHNldCBUU0YgYWdhaW4gaGVyZSBvciB2V2lGaSBiZWFjb24gRE1BIElOVCB3aWxsIG5vdCB3b3JrLiAqLwotCQkvKiBjb3JyZWN0X1RTRjIzYShwYWRhcHRlciwgcG1sbWVleHQpOyAqLwotCQkvKiAgSHcgc2VxdWVuZGUgZW5hYmxlIGJ5IGRlZGF1bHQuIDIwMTAuMDYuMjMuIGJ5IHR5bmxpLiAqLwotCQkvKiBydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX05RT1NfU0VRLCAoKHBtbG1lZXh0LT5tZ250X3NlcSsxMDApJjB4RkZGKSk7ICovCi0JCS8qIHJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19IV1NFUV9DVFJMLCAweEZGKTsgKi8KLQotCQkvKiAgc2V0IFJFR19DUiBiaXQgOCAqLwotCQl2OCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX0NSKzEpOwotCQl2OCB8PSBCSVQoMCk7IC8qICBFTlNXQkNOICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsICBSRUdfQ1IrMSwgdjgpOwotCi0JCS8qICBEaXNhYmxlIEh3IHByb3RlY3Rpb24gZm9yIGEgdGltZSB3aGljaCByZXZzZXJkIGZvciBIdyBzZW5kaW5nIGJlYWNvbi4gKi8KLQkJLyogIEZpeCBkb3dubG9hZCByZXNlcnZlZCBwYWdlIHBhY2tldCBmYWlsIHRoYXQgYWNjZXNzIGNvbGxpc2lvbiB3aXRoIHRoZSBwcm90ZWN0aW9uIHRpbWUuICovCi0JCS8qICAyMDEwLjA1LjExLiBBZGRlZCBieSB0eW5saS4gKi8KLS8qCQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgMCwgQklUKDMpKTsgKi8KLS8qCQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgQklUKDQpLCAwKTsgKi8KLQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgQklUKDQpLCBCSVQoMykpOwotCi0JCS8qICBTZXQgRldIV19UWFFfQ1RSTCAweDQyMls2XT0gMCB0byB0ZWxsIEh3IHRoZSBwYWNrZXQgaXMgbm90IGEgcmVhbCBiZWFjb24gZnJhbWUuICovCi0JCWlmIChwSGFsRGF0YS0+UmVnRndId1R4UUN0cmwgJiBCSVQoNikpCi0JCQliUmVjb3ZlciA9IHRydWU7Ci0KLQkJLyogIFRvIHRlbGwgSHcgdGhlIHBhY2tldCBpcyBub3QgYSByZWFsIGJlYWNvbiBmcmFtZS4gKi8KLQkJLyogVTFiVG1wID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfRldIV19UWFFfQ1RSTCsyKTsgKi8KLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0ZXSFdfVFhRX0NUUkwgKyAyLAotCQkJCSBwSGFsRGF0YS0+UmVnRndId1R4UUN0cmwgJiB+QklUKDYpKTsKLQkJcEhhbERhdGEtPlJlZ0Z3SHdUeFFDdHJsICY9IH5CSVQoNik7Ci0JCVNldEZ3UnN2ZFBhZ2VQa3QocGFkYXB0ZXIsIDApOwotCi0JCS8qICAyMDEwLjA1LjExLiBBZGRlZCBieSB0eW5saS4gKi8KLQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgQklUKDMpLCBCSVQoNCkpOwotCi0JCS8qICBUbyBtYWtlIHN1cmUgdGhhdCBpZiB0aGVyZSBleGlzdHMgYW4gYWRhcHRlciB3aGljaCB3b3VsZCBsaWtlIHRvIHNlbmQgYmVhY29uLiAqLwotCQkvKiAgSWYgZXhpc3RzLCB0aGUgb3JpZ2lhbmwgdmFsdWUgb2YgMHg0MjJbNl0gd2lsbCBiZSAxLCB3ZSBzaG91bGQgY2hlY2sgdGhpcyB0byAqLwotCQkvKiAgcHJldmVudCBmcm9tIHNldHRpbmcgMHg0MjJbNl0gdG8gMCBhZnRlciBkb3dubG9hZCByZXNlcnZlZCBwYWdlLCBvciBpdCB3aWxsIGNhdXNlICovCi0JCS8qICB0aGUgYmVhY29uIGNhbm5vdCBiZSBzZW50IGJ5IEhXLiAqLwotCQkvKiAgMjAxMC4wNi4yMy4gQWRkZWQgYnkgdHlubGkuICovCi0JCWlmIChiUmVjb3ZlcikgewotCQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0ZXSFdfVFhRX0NUUkwgKyAyLAotCQkJCQkgcEhhbERhdGEtPlJlZ0Z3SHdUeFFDdHJsIHwgQklUKDYpKTsKLQkJCXBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCB8PSBCSVQoNik7Ci0JCX0KLQotCQkvKiAgQ2xlYXIgQ1JbOF0gb3IgYmVhY29uIHBhY2tldCB3aWxsIG5vdCBiZSBzZW5kIHRvIFR4QnVmIGFueW1vcmUuICovCi0JCXY4ID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfQ1IrMSk7Ci0JCXY4ICY9IH5CSVQoMCk7IC8qICB+RU5TV0JDTiAqLwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfQ1IrMSwgdjgpOwotCX0KLQotCUpvaW5Cc3NScHRQYXJtLk9wTW9kZSA9IG1zdGF0dXM7Ci0KLQlGaWxsSDJDQ21kKHBhZGFwdGVyLCBKT0lOQlNTX1JQVF9FSUQsIHNpemVvZihKb2luQnNzUnB0UGFybSksICh1OCAqKSZKb2luQnNzUnB0UGFybSk7Ci0KLX0KLQotI2lmZGVmIENPTkZJR184NzIzQVVfQlRfQ09FWElTVAotc3RhdGljIHZvaWQgU2V0RndSc3ZkUGFnZVBrdF9CVENvZXgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQ7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbzsKLQl1OCBmYWtlbWFjWzZdID0gezB4MDAsIDB4ZTAsIDB4NGMsIDB4MDAsIDB4MDAsIDB4MDB9OwotCXUzMiBOdWxsRGF0YUxlbmd0aCwgQlRRb3NOdWxsTGVuZ3RoOwotCXU4ICpSZXNlcnZlZFBhZ2VQYWNrZXQ7Ci0JdTggUGFnZU51bSwgUGFnZU5lZWQsIFR4RGVzY0xlbjsKLQl1MTYgQnVmSW5kZXg7Ci0JdTMyIFRvdGFsUGFja2V0TGVuOwotCXN0cnVjdCByc3ZkcGFnZV9sb2MJUnN2ZFBhZ2VMb2M7Ci0KLQlEQkdfODcyM0EoIislc1xuIiwgX19mdW5jX18pOwotCi0JUmVzZXJ2ZWRQYWdlUGFja2V0ID0ga3phbGxvYygxMDI0LCBHRlBfS0VSTkVMKTsKLQlpZiAoUmVzZXJ2ZWRQYWdlUGFja2V0ID09IE5VTEwpIHsKLQkJREJHXzg3MjNBKCIlczogYWxsb2MgUmVzZXJ2ZWRQYWdlUGFja2V0IGZhaWwhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCVR4RGVzY0xlbiA9IFRYREVTQ19TSVpFOwotCVBhZ2VOdW0gPSAwOwotCi0JLyogMyAoMSkgYmVhY29uICovCi0JQnVmSW5kZXggPSBUWERFU0NfT0ZGU0VUOwotCS8qICBza2lwIEJlYWNvbiBQYWNrZXQgKi8KLQlQYWdlTmVlZCA9IDM7Ci0KLQlQYWdlTnVtICs9IFBhZ2VOZWVkOwotCXBIYWxEYXRhLT5Gd1JzdmRQYWdlU3RhcnRPZmZzZXQgPSBQYWdlTnVtOwotCi0JQnVmSW5kZXggKz0gUGFnZU5lZWQqMTI4OwotCi0JLyogMyAoMykgbnVsbCBkYXRhICovCi0JUnN2ZFBhZ2VMb2MuTG9jTnVsbERhdGEgPSBQYWdlTnVtOwotCUNvbnN0cnVjdE51bGxGdW5jdGlvbkRhdGEoCi0JCXBhZGFwdGVyLAotCQkmUmVzZXJ2ZWRQYWdlUGFja2V0W0J1ZkluZGV4XSwKLQkJJk51bGxEYXRhTGVuZ3RoLAotCQlmYWtlbWFjLAotCQlmYWxzZSwgMCwgMCwgZmFsc2UpOwotCXJ0bDg3MjNhX2ZpbGxfZmFrZV90eGRlc2MocGFkYXB0ZXIsICZSZXNlcnZlZFBhZ2VQYWNrZXRbQnVmSW5kZXgtVHhEZXNjTGVuXSwgTnVsbERhdGFMZW5ndGgsIGZhbHNlLCBmYWxzZSk7Ci0KLQlQYWdlTmVlZCA9ICh1OClQYWdlTnVtXzEyOChUeERlc2NMZW4gKyBOdWxsRGF0YUxlbmd0aCk7Ci0JUGFnZU51bSArPSBQYWdlTmVlZDsKLQotCUJ1ZkluZGV4ICs9IFBhZ2VOZWVkKjEyODsKLQotCS8qIDMgKDYpIEJUIFFvcyBudWxsIGRhdGEgKi8KLQlSc3ZkUGFnZUxvYy5Mb2NCVFFvc051bGwgPSBQYWdlTnVtOwotCUNvbnN0cnVjdE51bGxGdW5jdGlvbkRhdGEoCi0JCXBhZGFwdGVyLAotCQkmUmVzZXJ2ZWRQYWdlUGFja2V0W0J1ZkluZGV4XSwKLQkJJkJUUW9zTnVsbExlbmd0aCwKLQkJZmFrZW1hYywKLQkJdHJ1ZSwgMCwgMCwgZmFsc2UpOwotCXJ0bDg3MjNhX2ZpbGxfZmFrZV90eGRlc2MocGFkYXB0ZXIsICZSZXNlcnZlZFBhZ2VQYWNrZXRbQnVmSW5kZXgtVHhEZXNjTGVuXSwgQlRRb3NOdWxsTGVuZ3RoLCBmYWxzZSwgdHJ1ZSk7Ci0KLQlUb3RhbFBhY2tldExlbiA9IEJ1ZkluZGV4ICsgQlRRb3NOdWxsTGVuZ3RoOwotCi0JcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwotCWlmIChwbWdudGZyYW1lID09IE5VTEwpCi0JCWdvdG8gZXhpdDsKLQotCS8qICB1cGRhdGUgYXR0cmlidXRlICovCi0JcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIyM2EocGFkYXB0ZXIsIHBhdHRyaWIpOwotCXBhdHRyaWItPnFzZWwgPSAweDEwOwotCXBhdHRyaWItPnBrdGxlbiA9IHBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IFRvdGFsUGFja2V0TGVuIC0gVFhERVNDX09GRlNFVDsKLQltZW1jcHkocG1nbnRmcmFtZS0+YnVmX2FkZHIsIFJlc2VydmVkUGFnZVBhY2tldCwgVG90YWxQYWNrZXRMZW4pOwotCi0JcnRsODcyM2F1X21nbnRfeG1pdChwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci0KLQlEQkdfODcyM0EoIiVzOiBTZXQgUlNWRCBwYWdlIGxvY2F0aW9uIHRvIEZ3XG4iLCBfX2Z1bmNfXyk7Ci0JRmlsbEgyQ0NtZChwYWRhcHRlciwgUlNWRF9QQUdFX0VJRCwgc2l6ZW9mKFJzdmRQYWdlTG9jKSwgKHU4ICopJlJzdmRQYWdlTG9jKTsKLQotZXhpdDoKLQlrZnJlZShSZXNlcnZlZFBhZ2VQYWNrZXQpOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9CVENvZXhfQVBfbW9kZV9Gd1JzdmRQa3RfY21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQl1OCBiUmVjb3ZlciA9IGZhbHNlOwotCi0JREJHXzg3MjNBKCIrJXNcbiIsIF9fZnVuY19fKTsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCS8qICBTZXQgRldIV19UWFFfQ1RSTCAweDQyMls2XT0gMCB0byB0ZWxsIEh3IHRoZSBwYWNrZXQgaXMgbm90IGEgcmVhbCBiZWFjb24gZnJhbWUuICovCi0JaWYgKHBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCAmIEJJVCg2KSkKLQkJYlJlY292ZXIgPSB0cnVlOwotCi0JLyogIFRvIHRlbGwgSHcgdGhlIHBhY2tldCBpcyBub3QgYSByZWFsIGJlYWNvbiBmcmFtZS4gKi8KLQlwSGFsRGF0YS0+UmVnRndId1R4UUN0cmwgJj0gfkJJVCg2KTsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfRldIV19UWFFfQ1RSTCArIDIsCi0JCQkgcEhhbERhdGEtPlJlZ0Z3SHdUeFFDdHJsKTsKLQlTZXRGd1JzdmRQYWdlUGt0X0JUQ29leChwYWRhcHRlcik7Ci0KLQkvKiAgVG8gbWFrZSBzdXJlIHRoYXQgaWYgdGhlcmUgZXhpc3RzIGFuIGFkYXB0ZXIgd2hpY2ggd291bGQgbGlrZSB0byBzZW5kIGJlYWNvbi4gKi8KLQkvKiAgSWYgZXhpc3RzLCB0aGUgb3JpZ2lhbmwgdmFsdWUgb2YgMHg0MjJbNl0gd2lsbCBiZSAxLCB3ZSBzaG91bGQgY2hlY2sgdGhpcyB0byAqLwotCS8qICBwcmV2ZW50IGZyb20gc2V0dGluZyAweDQyMls2XSB0byAwIGFmdGVyIGRvd25sb2FkIHJlc2VydmVkIHBhZ2UsIG9yIGl0IHdpbGwgY2F1c2UgKi8KLQkvKiAgdGhlIGJlYWNvbiBjYW5ub3QgYmUgc2VudCBieSBIVy4gKi8KLQkvKiAgMjAxMC4wNi4yMy4gQWRkZWQgYnkgdHlubGkuICovCi0JaWYgKGJSZWNvdmVyKSB7Ci0JCXBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCB8PSBCSVQoNik7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19GV0hXX1RYUV9DVFJMICsgMiwKLQkJCQkgcEhhbERhdGEtPlJlZ0Z3SHdUeFFDdHJsKTsKLQl9Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9kbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTgzMWYyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2RtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgKi8KLS8qICBEZXNjcmlwdGlvbjogKi8KLS8qICAqLwotLyogIFRoaXMgZmlsZSBpcyBmb3IgOTJDRS85MkNVIGR5bmFtaWMgbWVjaGFuaXNtIG9ubHkgKi8KLS8qICAqLwotLyogICovCi0vKiAgKi8KLSNkZWZpbmUgX1JUTDg3MjNBX0RNX0NfCi0KLS8qICAqLwotLyogIGluY2x1ZGUgZmlsZXMgKi8KLS8qICAqLwotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotLyogICovCi0vKiAgR2xvYmFsIHZhciAqLwotLyogICovCi0KLXN0YXRpYyB2b2lkIGRtX0NoZWNrUGJjR1BJTyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4CXRtcDFieXRlOwotCXU4CWJQYmNQcmVzc2VkID0gZmFsc2U7Ci0KLQlpZiAoIXBhZGFwdGVyLT5yZWdpc3RyeXByaXYuaHdfd3BzX3BiYykKLQkJcmV0dXJuOwotCi0JdG1wMWJ5dGUgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIEdQSU9fSU9fU0VMKTsKLQl0bXAxYnl0ZSB8PSAoSEFMXzgxOTJDX0hXX0dQSU9fV1BTX0JJVCk7Ci0JLyogZW5hYmxlIEdQSU9bMl0gYXMgb3V0cHV0IG1vZGUgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBHUElPX0lPX1NFTCwgdG1wMWJ5dGUpOwotCi0JdG1wMWJ5dGUgJj0gfihIQUxfODE5MkNfSFdfR1BJT19XUFNfQklUKTsKLQkvKiByZXNldCB0aGUgZmxvYXRpbmcgdm9sdGFnZSBsZXZlbCAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsICBHUElPX0lOLCB0bXAxYnl0ZSk7Ci0KLQl0bXAxYnl0ZSA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgR1BJT19JT19TRUwpOwotCXRtcDFieXRlICY9IH4oSEFMXzgxOTJDX0hXX0dQSU9fV1BTX0JJVCk7Ci0JLyogZW5hYmxlIEdQSU9bMl0gYXMgaW5wdXQgbW9kZSAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIEdQSU9fSU9fU0VMLCB0bXAxYnl0ZSk7Ci0KLQl0bXAxYnl0ZSA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgR1BJT19JTik7Ci0KLQlpZiAodG1wMWJ5dGUgPT0gMHhmZikKLQkJcmV0dXJuOwotCi0JaWYgKHRtcDFieXRlJkhBTF84MTkyQ19IV19HUElPX1dQU19CSVQpCi0JCWJQYmNQcmVzc2VkID0gdHJ1ZTsKLQotCWlmIChiUGJjUHJlc3NlZCkgewotCQkvKiAgSGVyZSB3ZSBvbmx5IHNldCBiUGJjUHJlc3NlZCB0byB0cnVlICovCi0JCS8qICBBZnRlciB0cmlnZ2VyIFBCQywgdGhlIHZhcmlhYmxlIHdpbGwgYmUgc2V0IHRvIGZhbHNlICovCi0JCURCR184NzIzQSgiQ2hlY2tQYmNHUElPIC0gUEJDIGlzIHByZXNzZWRcbiIpOwotCi0JCWlmIChwYWRhcHRlci0+cGlkWzBdID09IDApIHsKLQkJCS8qIDAgaXMgdGhlIGRlZmF1bHQgdmFsdWUgYW5kIGl0IG1lYW5zIHRoZSBhcHBsaWNhdGlvbgotCQkJICogbW9uaXRvcnMgdGhlIEhXIFBCQyBkb2Vzbid0IHByaXZkZSBpdHMgcGlkIHRvIGRyaXZlci4KLQkJCSAqLwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJa2lsbF9waWQoZmluZF92cGlkKHBhZGFwdGVyLT5waWRbMF0pLCBTSUdVU1IxLCAxKTsKLQl9Ci19Ci0KLS8qICBJbml0aWFsaXplIEdQSU8gc2V0dGluZyByZWdpc3RlcnMgKi8KLS8qICBmdW5jdGlvbnMgKi8KLQotdm9pZCBydGw4NzIzYV9pbml0X2RtX3ByaXYoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0gPSAmcEhhbERhdGEtPm9kbXByaXY7Ci0JdTggY3V0X3ZlciwgZmFiX3ZlcjsKLQotCW1lbXNldChwZG1wcml2LCAwLCBzaXplb2Yoc3RydWN0IGRtX3ByaXYpKTsKLQltZW1zZXQocERNX09kbSwgMCwgc2l6ZW9mKCpwRE1fT2RtKSk7Ci0KLQlwRE1fT2RtLT5BZGFwdGVyID0gQWRhcHRlcjsKLQotCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19JQ19UWVBFLCBPRE1fUlRMODcyM0EpOwotCi0JaWYgKElTXzg3MjNBX0FfQ1VUKHBIYWxEYXRhLT5WZXJzaW9uSUQpKSB7Ci0JCWZhYl92ZXIgPSBPRE1fVU1DOwotCQljdXRfdmVyID0gT0RNX0NVVF9BOwotCX0gZWxzZSBpZiAoSVNfODcyM0FfQl9DVVQocEhhbERhdGEtPlZlcnNpb25JRCkpIHsKLQkJZmFiX3ZlciA9IE9ETV9VTUM7Ci0JCWN1dF92ZXIgPSBPRE1fQ1VUX0I7Ci0JfSBlbHNlIHsKLQkJZmFiX3ZlciA9IE9ETV9UU01DOwotCQljdXRfdmVyID0gT0RNX0NVVF9BOwotCX0KLQlPRE1fQ21uSW5mb0luaXQyM2EocERNX09kbSwgT0RNX0NNTklORk9fRkFCX1ZFUiwgZmFiX3Zlcik7Ci0JT0RNX0NtbkluZm9Jbml0MjNhKHBETV9PZG0sIE9ETV9DTU5JTkZPX0NVVF9WRVIsIGN1dF92ZXIpOwotCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19NUF9URVNUX0NISVAsIElTX05PUk1BTF9DSElQKHBIYWxEYXRhLT5WZXJzaW9uSUQpKTsKLQotCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19CT0FSRF9UWVBFLCBwSGFsRGF0YS0+Qm9hcmRUeXBlKTsKLQotCWlmIChwSGFsRGF0YS0+Qm9hcmRUeXBlID09IEJPQVJEX1VTQl9IaWdoX1BBKSB7Ci0JCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19FWFRfTE5BLCB0cnVlKTsKLQkJT0RNX0NtbkluZm9Jbml0MjNhKHBETV9PZG0sIE9ETV9DTU5JTkZPX0VYVF9QQSwgdHJ1ZSk7Ci0JfQotCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19CV0lGSV9URVNULCBBZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjKTsKLX0KLQotc3RhdGljIHZvaWQgVXBkYXRlX09ETV9Db21JbmZvXzg3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSA9ICZwSGFsRGF0YS0+b2RtcHJpdjsKLQlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCWludCBpOwotCXBkbXByaXYtPkluaXRPRE1GbGFnID0gMDsKLQkvKiAgUG9pbnRlciByZWZlcmVuY2UgKi8KLQlydGw4NzIzYV9vZG1fc3VwcG9ydF9hYmlsaXR5X3NldChBZGFwdGVyLCBEWU5BTUlDX0FMTF9GVU5DX0VOQUJMRSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1NUQTsgaSsrKQotCQlPRE1fQ21uSW5mb1B0ckFycmF5SG9vazIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19TVEFfU1RBVFVTLCBpLCBOVUxMKTsKLX0KLQotdm9pZCBydGw4NzIzYV9Jbml0SGFsRG0oc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0gPSAmcEhhbERhdGEtPm9kbXByaXY7Ci0JdTgJaTsKLQotCVVwZGF0ZV9PRE1fQ29tSW5mb184NzIzYShBZGFwdGVyKTsKLQlPRE0yM2FfRE1Jbml0KHBETV9PZG0pOwotCS8qICBTYXZlIFJFR19JTklEQVRBX1JBVEVfU0VMIHZhbHVlIGZvciBUWERFU0MuICovCi0JZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JCXBkbXByaXYtPklOSURBVEFfUkFURVtpXSA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfSU5JREFUQV9SQVRFX1NFTCtpKSAmIDB4M2Y7Ci19Ci0KLXZvaWQKLXJ0bDg3MjNhX0hhbERtV2F0Y2hEb2coCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyCi0JKQotewotCWJvb2wJCWJGd0N1cnJlbnRJblBTTW9kZSA9IGZhbHNlOwotCWJvb2wJCWJGd1BTQXdha2UgPSB0cnVlOwotCXU4IGJMaW5rZWQgPSBmYWxzZTsKLQl1OCBod19pbml0X2NvbXBsZXRlZCA9IGZhbHNlOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQotCWh3X2luaXRfY29tcGxldGVkID0gQWRhcHRlci0+aHdfaW5pdF9jb21wbGV0ZWQ7Ci0KLQlpZiAoaHdfaW5pdF9jb21wbGV0ZWQgPT0gZmFsc2UpCi0JCWdvdG8gc2tpcF9kbTsKLQotCWJGd0N1cnJlbnRJblBTTW9kZSA9IEFkYXB0ZXItPnB3cmN0cmxwcml2LmJGd0N1cnJlbnRJblBTTW9kZTsKLQliRndQU0F3YWtlID0gcnRsODcyM2FfZ2V0X2Z3bHBzX3JmX29uKEFkYXB0ZXIpOwotCi0JaWYgKCFiRndDdXJyZW50SW5QU01vZGUgJiYgYkZ3UFNBd2FrZSkgewotCQkvKiAgUmVhZCBSRUdfSU5JREFUQV9SQVRFX1NFTCB2YWx1ZSBmb3IgVFhERVNDLiAqLwotCQlpZiAoY2hlY2tfZndzdGF0ZSgmQWRhcHRlci0+bWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpIHsKLQkJCXBkbXByaXYtPklOSURBVEFfUkFURVswXSA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfSU5JREFUQV9SQVRFX1NFTCkgJiAweDNmOwotCQl9IGVsc2UgewotCQkJdTgJaTsKLQkJCWZvciAoaSA9IDEgOyBpIDwgKEFkYXB0ZXItPnN0YXByaXYuYXNvY19zdGFfY291bnQgKyAxKTsgaSsrKQotCQkJCXBkbXByaXYtPklOSURBVEFfUkFURVtpXSA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCAoUkVHX0lOSURBVEFfUkFURV9TRUwraSkpICYgMHgzZjsKLQkJfQotCX0KLQotCS8qIE9ETSAqLwotCWlmIChydHdfbGlua2VkX2NoZWNrKEFkYXB0ZXIpKQotCQliTGlua2VkID0gdHJ1ZTsKLQotCU9ETV9DbW5JbmZvVXBkYXRlMjNhKCZwSGFsRGF0YS0+b2RtcHJpdiwgT0RNX0NNTklORk9fTElOSywgYkxpbmtlZCk7Ci0JT0RNX0RNV2F0Y2hkb2cyM2EoQWRhcHRlcik7Ci0KLXNraXBfZG06Ci0KLQkvKiAgQ2hlY2sgR1BJTyB0byBkZXRlcm1pbmUgY3VycmVudCBSRiBvbi9vZmYgYW5kIFBiYyBzdGF0dXMuICovCi0JLyogIENoZWNrIEhhcmR3YXJlIFJhZGlvIE9OL09GRiBvciBub3QgKi8KLQlkbV9DaGVja1BiY0dQSU8oQWRhcHRlcik7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9oYWxfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfaGFsX2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhMGFmNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9oYWxfaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0hBTF9JTklUX0NfCi0KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHJ0d19lZnVzZS5oPgotCi0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0jaW5jbHVkZSA8dXNiX29wc19saW51eC5oPgotCi1zdGF0aWMgdm9pZCBfRldEb3dubG9hZEVuYWJsZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBib29sIGVuYWJsZSkKLXsKLQl1OCB0bXA7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCS8qICA4MDUxIGVuYWJsZSAqLwotCQl0bXAgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTiArIDEpOwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4gKyAxLCB0bXAgfCAweDA0KTsKLQotCQkvKiAgTUNVIGZpcm13YXJlIGRvd25sb2FkIGVuYWJsZS4gKi8KLQkJdG1wID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfTUNVRldETCk7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19NQ1VGV0RMLCB0bXAgfCAweDAxKTsKLQotCQkvKiAgODA1MSByZXNldCAqLwotCQl0bXAgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19NQ1VGV0RMICsgMik7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19NQ1VGV0RMICsgMiwgdG1wICYgMHhmNyk7Ci0JfSBlbHNlIHsKLQkJLyogIE1DVSBmaXJtd2FyZSBkb3dubG9hZCBkaXNhYmxlLiAqLwotCQl0bXAgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19NQ1VGV0RMKTsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX01DVUZXREwsIHRtcCAmIDB4ZmUpOwotCi0JCS8qICBSZXNlcnZlZCBmb3IgZncgZXh0ZW5zaW9uLiAqLwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfTUNVRldETCArIDEsIDB4MDApOwotCX0KLX0KLQotc3RhdGljIGludAotX1BhZ2VXcml0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgcGFnZSwgdm9pZCAqYnVmZmVyLCB1MzIgc2l6ZSkKLXsKLQl1OCB2YWx1ZTg7Ci0JdTggdThQYWdlID0gKHU4KSAocGFnZSAmIDB4MDcpOwotCi0JaWYgKHNpemUgPiBNQVhfUEFHRV9TSVpFKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQl2YWx1ZTggPSAocnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfTUNVRldETCArIDIpICYgMHhGOCkgfCB1OFBhZ2U7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX01DVUZXREwgKyAyLCB2YWx1ZTgpOwotCi0JcmV0dXJuIHJ0bDg3MjNhdV93cml0ZU4ocGFkYXB0ZXIsIEZXXzg3MjNBX1NUQVJUX0FERFJFU1MsIHNpemUsIGJ1ZmZlcik7Ci19Ci0KLXN0YXRpYyBpbnQgX1dyaXRlRlcoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdm9pZCAqYnVmZmVyLCB1MzIgc2l6ZSkKLXsKLQkvKiAgU2luY2Ugd2UgbmVlZCBkeW5hbWljIGRlY2lkZSBtZXRob2Qgb2YgZHdvbmxvYWQgZncsIHNvIHdlCi0JICAgIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBnZXQgY2hpcCB2ZXJzaW9uLiAqLwotCS8qICBXZSBjYW4gcmVtb3ZlIF9SZWFkQ2hpcFZlcnNpb24gZnJvbSBSZWFkcGFkYXB0ZXJJbmZvODE5MkMgbGF0ZXIuICovCi0JaW50IHJldCA9IF9TVUNDRVNTOwotCXUzMiBwYWdlTnVtcywgcmVtYWluU2l6ZTsKLQl1MzIgcGFnZSwgb2Zmc2V0OwotCXU4ICpidWZmZXJQdHIgPSAodTggKikgYnVmZmVyOwotCi0JcGFnZU51bXMgPSBzaXplIC8gTUFYX1BBR0VfU0laRTsKLQkvKiBSVF9BU1NFUlQoKHBhZ2VOdW1zIDw9IDQpLAotCSAgICgiUGFnZSBudW1iZXJzIHNob3VsZCBub3QgZ3JlYXRlciB0aGVuIDQgXG4iKSk7ICovCi0JcmVtYWluU2l6ZSA9IHNpemUgJSBNQVhfUEFHRV9TSVpFOwotCi0JZm9yIChwYWdlID0gMDsgcGFnZSA8IHBhZ2VOdW1zOyBwYWdlKyspIHsKLQkJb2Zmc2V0ID0gcGFnZSAqIE1BWF9QQUdFX1NJWkU7Ci0JCXJldCA9IF9QYWdlV3JpdGUocGFkYXB0ZXIsIHBhZ2UsIGJ1ZmZlclB0ciArIG9mZnNldCwKLQkJCQkgTUFYX1BBR0VfU0laRSk7Ci0KLQkJaWYgKHJldCA9PSBfRkFJTCkKLQkJCWdvdG8gZXhpdDsKLQl9Ci0JaWYgKHJlbWFpblNpemUpIHsKLQkJb2Zmc2V0ID0gcGFnZU51bXMgKiBNQVhfUEFHRV9TSVpFOwotCQlwYWdlID0gcGFnZU51bXM7Ci0JCXJldCA9IF9QYWdlV3JpdGUocGFkYXB0ZXIsIHBhZ2UsIGJ1ZmZlclB0ciArIG9mZnNldCwKLQkJCQkgcmVtYWluU2l6ZSk7Ci0KLQkJaWYgKHJldCA9PSBfRkFJTCkKLQkJCWdvdG8gZXhpdDsKLQl9Ci0JUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICJfV3JpdGVGVyBEb25lLSBmb3IgTm9ybWFsIGNoaXAuXG4iKTsKLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9GV0ZyZWVUb0dvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTMyIGNvdW50ZXIgPSAwOwotCXUzMiB2YWx1ZTMyOwotCi0JLyogIHBvbGxpbmcgQ2hlY2tTdW0gcmVwb3J0ICovCi0JZG8gewotCQl2YWx1ZTMyID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX01DVUZXREwpOwotCQlpZiAodmFsdWUzMiAmIEZXRExfQ2hrU3VtX3JwdCkKLQkJCWJyZWFrOwotCX0gd2hpbGUgKGNvdW50ZXIrKyA8IFBPTExJTkdfUkVBRFlfVElNRU9VVF9DT1VOVCk7Ci0KLQlpZiAoY291bnRlciA+PSBQT0xMSU5HX1JFQURZX1RJTUVPVVRfQ09VTlQpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJICIlczogY2hrc3VtIHJlcG9ydCBmYWlsISBSRUdfTUNVRldETDoweCUwOHhcbiIsCi0JCQkgX19mdW5jX18sIHZhbHVlMzIpOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiJXM6IENoZWNrc3VtIHJlcG9ydCBPSyEgUkVHX01DVUZXREw6MHglMDh4XG4iLCBfX2Z1bmNfXywKLQkJIHZhbHVlMzIpOwotCi0JdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19NQ1VGV0RMKTsKLQl2YWx1ZTMyIHw9IE1DVUZXRExfUkRZOwotCXZhbHVlMzIgJj0gfldJTlRJTklfUkRZOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfTUNVRldETCwgdmFsdWUzMik7Ci0KLQkvKiAgcG9sbGluZyBmb3IgRlcgcmVhZHkgKi8KLQljb3VudGVyID0gMDsKLQlkbyB7Ci0JCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfTUNVRldETCk7Ci0JCWlmICh2YWx1ZTMyICYgV0lOVElOSV9SRFkpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJICIlczogUG9sbGluZyBGVyByZWFkeSBzdWNjZXNzISEgUkVHX01DVUZXREw6MHglMDh4XG4iLAotCQkJCSBfX2Z1bmNfXywgdmFsdWUzMik7Ci0JCQlyZXR1cm4gX1NVQ0NFU1M7Ci0JCX0KLQkJdWRlbGF5KDUpOwotCX0gd2hpbGUgKGNvdW50ZXIrKyA8IFBPTExJTkdfUkVBRFlfVElNRU9VVF9DT1VOVCk7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sCi0JCSAiJXM6IFBvbGxpbmcgRlcgcmVhZHkgZmFpbCEhIFJFR19NQ1VGV0RMOjB4JTA4eFxuIiwKLQkJIF9fZnVuY19fLCB2YWx1ZTMyKTsKLQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLSNkZWZpbmUgSVNfRldfODF4eEMocGFkYXB0ZXIpCSgoKEdFVF9IQUxfREFUQShwYWRhcHRlcikpLT5GaXJtd2FyZVNpZ25hdHVyZSAmIDB4RkZGMCkgPT0gMHg4OEMwKQotCi12b2lkIHJ0bDg3MjNhX0Zpcm13YXJlU2VsZlJlc2V0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggdTFiVG1wOwotCXU4IERlbGF5ID0gMTAwOwotCi0JaWYgKCEoSVNfRldfODF4eEMocGFkYXB0ZXIpICYmCi0JICAgICAgKChwSGFsRGF0YS0+RmlybXdhcmVWZXJzaW9uIDwgMHgyMSkgfHwKLQkgICAgICAgKHBIYWxEYXRhLT5GaXJtd2FyZVZlcnNpb24gPT0gMHgyMSAmJgotCQlwSGFsRGF0YS0+RmlybXdhcmVTdWJWZXJzaW9uIDwgMHgwMSkpKSkgewotCQkvKiAgYWZ0ZXIgODhDIEZ3IHYzMy4xICovCi0JCS8qIDB4MWNmID0gMHgyMC4gSW5mb3JtIDgwNTEgdG8gcmVzZXQuIDIwMDkuMTIuMjUuIHR5bmxpX3Rlc3QgKi8KLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0hNRVRGUiArIDMsIDB4MjApOwotCi0JCXUxYlRtcCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOICsgMSk7Ci0JCXdoaWxlICh1MWJUbXAgJiBCSVQoMikpIHsKLQkJCURlbGF5LS07Ci0JCQlpZiAoRGVsYXkgPT0gMCkKLQkJCQlicmVhazsKLQkJCXVkZWxheSg1MCk7Ci0JCQl1MWJUbXAgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTiArIDEpOwotCQl9Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgIi0lczogODA1MSByZXNldCBzdWNjZXNzICglZClcbiIsIF9fZnVuY19fLAotCQkJIERlbGF5KTsKLQotCQlpZiAoKERlbGF5ID09IDApKSB7Ci0JCQkvKiBmb3JjZSBmaXJtd2FyZSByZXNldCAqLwotCQkJdTFiVG1wID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4gKyAxKTsKLQkJCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTiArIDEsCi0JCQkJCSB1MWJUbXAgJiB+QklUKDIpKTsKLQkJfQotCX0KLX0KLQotLyogICovCi0vKglEZXNjcmlwdGlvbjogKi8KLS8qCQlEb3dubG9hZCA4MTkyQyBmaXJtd2FyZSBjb2RlLiAqLwotLyogICovCi0vKiAgKi8KLWludCBydGw4NzIzYV9GaXJtd2FyZURvd25sb2FkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaW50IHJ0U3RhdHVzID0gX1NVQ0NFU1M7Ci0JdTggd3JpdGVGV19yZXRyeSA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmd2RsX3N0YXJ0X3RpbWU7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKmR2b2JqID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7Ci0Jc3RydWN0IGRldmljZSAqZGV2aWNlID0gZHZvYmpfdG9fZGV2KGR2b2JqKTsKLQlzdHJ1Y3QgcnRfODcyM2FfZmlybXdhcmVfaGRyICpwRndIZHIgPSBOVUxMOwotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7Ci0JY2hhciAqZndfbmFtZTsKLQl1OCAqZmlybXdhcmVfYnVmID0gTlVMTDsKLQl1OCAqYnVmOwotCWludCBmd19zaXplOwotCXN0YXRpYyBpbnQgbG9nX3ZlcnNpb247Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAiKyVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoSVNfODcyM0FfQV9DVVQocEhhbERhdGEtPlZlcnNpb25JRCkpIHsKLQkJZndfbmFtZSA9ICJydGx3aWZpL3J0bDg3MjNhdWZ3X0EuYmluIjsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAicnRsODcyM2FfRmlybXdhcmVEb3dubG9hZDogUjg3MjNGd0ltYWdlQXJyYXlfVU1DIGZvciBSVEw4NzIzQSBBIENVVFxuIik7Ci0JfSBlbHNlIGlmIChJU184NzIzQV9CX0NVVChwSGFsRGF0YS0+VmVyc2lvbklEKSkgewotCQkvKiAgV0xBTiBGdy4gKi8KLQkJaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjID09IDEpIHsKLQkJCWZ3X25hbWUgPSAicnRsd2lmaS9ydGw4NzIzYXVmd19CX05vQlQuYmluIjsKLQkJCURCR184NzIzQSgiIFJ0bDg3MjNfRndVTUNCQ3V0SW1hZ2VBcnJheVdpdGhvdXRCVCBmb3IgIgotCQkJCSAgIlJUTDg3MjNBIEIgQ1VUXG4iKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSkgewotCQkJCWZ3X25hbWUgPSAicnRsd2lmaS9ydGw4NzIzYXVmd19CLmJpbiI7Ci0JCQkJREJHXzg3MjNBKCIgUnRsODcyM19Gd1VNQ0JDdXRJbWFnZUFycmF5V2l0aEJUICIKLQkJCQkJICAiZm9yIFJUTDg3MjNBIEIgQ1VUXG4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZndfbmFtZSA9ICJydGx3aWZpL3J0bDg3MjNhdWZ3X0JfTm9CVC5iaW4iOwotCQkJCURCR184NzIzQSgiIFJ0bDg3MjNfRndVTUNCQ3V0SW1hZ2VBcnJheVdpdGhvdXQgIgotCQkJCQkgICJCVCBmb3IgUlRMODcyM0EgQiBDVVRcbiIpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJLyogIDxSb2dlcl9UT0RPPiBXZSBzaG91bGQgZG93bmxvYWQgcHJvcGVyIFJBTSBDb2RlIGhlcmUKLQkJICAgIHRvIG1hdGNoIHRoZSBST00gY29kZS4gKi8KLQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJICIlczogdW5rbm93biB2ZXJzaW9uIVxuIiwgX19mdW5jX18pOwotCQlydFN0YXR1cyA9IF9GQUlMOwotCQlnb3RvIEV4aXQ7Ci0JfQotCi0JcHJfaW5mbygicnRsODcyM2F1OiBMb2FkaW5nIGZpcm13YXJlICVzXG4iLCBmd19uYW1lKTsKLQlpZiAocmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X25hbWUsIGRldmljZSkpIHsKLQkJcHJfZXJyKCJydGw4NzIzYXU6IHJlcXVlc3RfZmlybXdhcmUgbG9hZCBmYWlsZWRcbiIpOwotCQlydFN0YXR1cyA9IF9GQUlMOwotCQlnb3RvIEV4aXQ7Ci0JfQotCWlmICghZncpIHsKLQkJcHJfZXJyKCJydGw4NzIzYXU6IEZpcm13YXJlICVzIG5vdCBhdmFpbGFibGVcbiIsIGZ3X25hbWUpOwotCQlydFN0YXR1cyA9IF9GQUlMOwotCQlnb3RvIEV4aXQ7Ci0JfQotCWZpcm13YXJlX2J1ZiA9IGttZW1kdXAoZnctPmRhdGEsIGZ3LT5zaXplLCBHRlBfS0VSTkVMKTsKLQlmd19zaXplID0gZnctPnNpemU7Ci0JcmVsZWFzZV9maXJtd2FyZShmdyk7Ci0JaWYgKCFmaXJtd2FyZV9idWYpIHsKLQkJcnRTdGF0dXMgPSBfRkFJTDsKLQkJZ290byBFeGl0OwotCX0KLQlidWYgPSBmaXJtd2FyZV9idWY7Ci0KLQkvKiAgVG8gQ2hlY2sgRncgaGVhZGVyLiBBZGRlZCBieSB0eW5saS4gMjAwOS4xMi4wNC4gKi8KLQlwRndIZHIgPSAoc3RydWN0IHJ0Xzg3MjNhX2Zpcm13YXJlX2hkciAqKWZpcm13YXJlX2J1ZjsKLQotCXBIYWxEYXRhLT5GaXJtd2FyZVZlcnNpb24gPSBsZTE2X3RvX2NwdShwRndIZHItPlZlcnNpb24pOwotCXBIYWxEYXRhLT5GaXJtd2FyZVN1YlZlcnNpb24gPSBwRndIZHItPlN1YnZlcnNpb247Ci0JcEhhbERhdGEtPkZpcm13YXJlU2lnbmF0dXJlID0gbGUxNl90b19jcHUocEZ3SGRyLT5TaWduYXR1cmUpOwotCi0JREJHXzg3MjNBKCIlczogZndfdmVyID0lZCBmd19zdWJ2ZXIgPSVkIHNpZyA9IDB4JXhcbiIsCi0JCSAgX19mdW5jX18sIHBIYWxEYXRhLT5GaXJtd2FyZVZlcnNpb24sCi0JCSAgcEhhbERhdGEtPkZpcm13YXJlU3ViVmVyc2lvbiwgcEhhbERhdGEtPkZpcm13YXJlU2lnbmF0dXJlKTsKLQotCWlmICghbG9nX3ZlcnNpb24rKykKLQkJcHJfaW5mbygiJXNGaXJtd2FyZSBWZXJzaW9uICVkLCBTdWJWZXJzaW9uICVkLCBTaWduYXR1cmUgIgotCQkJIjB4JXhcbiIsIERSSVZFUl9QUkVGSVgsIHBIYWxEYXRhLT5GaXJtd2FyZVZlcnNpb24sCi0JCQlwSGFsRGF0YS0+RmlybXdhcmVTdWJWZXJzaW9uLAotCQkJcEhhbERhdGEtPkZpcm13YXJlU2lnbmF0dXJlKTsKLQotCWlmIChJU19GV19IRUFERVJfRVhJU1QocEZ3SGRyKSkgewotCQkvKiAgU2hpZnQgMzIgYnl0ZXMgZm9yIEZXIGhlYWRlciAqLwotCQlidWYgPSBidWYgKyAzMjsKLQkJZndfc2l6ZSA9IGZ3X3NpemUgLSAzMjsKLQl9Ci0KLQkvKiAgU3VnZ2VzdGVkIGJ5IEZpbGVuLiBJZiA4MDUxIGlzIHJ1bm5pbmcgaW4gUkFNIGNvZGUsIGRyaXZlciBzaG91bGQKLQkgICAgaW5mb3JtIEZ3IHRvIHJlc2V0IGJ5IGl0c2VsZiwgKi8KLQkvKiAgb3IgaXQgd2lsbCBjYXVzZSBkb3dubG9hZCBGdyBmYWlsLiAyMDEwLjAyLjAxLiBieSB0eW5saS4gKi8KLQlpZiAocnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfTUNVRldETCkgJiBSQU1fRExfU0VMKSB7Ci0JCS8qIDgwNTEgUkFNIGNvZGUgKi8KLQkJcnRsODcyM2FfRmlybXdhcmVTZWxmUmVzZXQocGFkYXB0ZXIpOwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfTUNVRldETCwgMHgwMCk7Ci0JfQotCi0JX0ZXRG93bmxvYWRFbmFibGUocGFkYXB0ZXIsIHRydWUpOwotCWZ3ZGxfc3RhcnRfdGltZSA9IGppZmZpZXM7Ci0Jd2hpbGUgKDEpIHsKLQkJLyogcmVzZXQgdGhlIEZXREwgY2hrc3VtICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19NQ1VGV0RMLAotCQkJCSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19NQ1VGV0RMKSB8Ci0JCQkJIEZXRExfQ2hrU3VtX3JwdCk7Ci0KLQkJcnRTdGF0dXMgPSBfV3JpdGVGVyhwYWRhcHRlciwgYnVmLCBmd19zaXplKTsKLQotCQlpZiAocnRTdGF0dXMgPT0gX1NVQ0NFU1MgfHwKLQkJICAgIChqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBmd2RsX3N0YXJ0X3RpbWUpID4gNTAwICYmCi0JCSAgICAgd3JpdGVGV19yZXRyeSsrID49IDMpKQotCQkJYnJlYWs7Ci0KLQkJREJHXzg3MjNBKCIlcyB3cml0ZUZXX3JldHJ5OiV1LCB0aW1lIGFmdGVyIGZ3ZGxfc3RhcnRfdGltZToiCi0JCQkgICIldW1zXG4iLCBfX2Z1bmNfXywgd3JpdGVGV19yZXRyeSwKLQkJCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gZndkbF9zdGFydF90aW1lKSk7Ci0JfQotCV9GV0Rvd25sb2FkRW5hYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JaWYgKF9TVUNDRVNTICE9IHJ0U3RhdHVzKSB7Ci0JCURCR184NzIzQSgiREwgRmlybXdhcmUgZmFpbGVkIVxuIik7Ci0JCWdvdG8gRXhpdDsKLQl9Ci0KLQlydFN0YXR1cyA9IF9GV0ZyZWVUb0dvKHBhZGFwdGVyKTsKLQlpZiAoX1NVQ0NFU1MgIT0gcnRTdGF0dXMpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJICJETCBGaXJtd2FyZSBmYWlsZWQhXG4iKTsKLQkJZ290byBFeGl0OwotCX0KLQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgIkZpcm13YXJlIGlzIHJlYWR5IHRvIHJ1biFcbiIpOwotCi1FeGl0OgotCWtmcmVlKGZpcm13YXJlX2J1Zik7Ci0JcmV0dXJuIHJ0U3RhdHVzOwotfQotCi12b2lkIHJ0bDg3MjNhX0luaXRpYWxpemVGaXJtd2FyZVZhcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCS8qICBJbml0IEZ3IExQUyByZWxhdGVkLiAqLwotCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5iRndDdXJyZW50SW5QU01vZGUgPSBmYWxzZTsKLQotCS8qICBJbml0IEgyQyBjb3VudGVyLiBieSB0eW5saS4gMjAwOS4xMi4wOS4gKi8KLQlwSGFsRGF0YS0+TGFzdEhNRUJveE51bSA9IDA7Ci19Ci0KLS8qICAqLwotLyoJCQkJRWZ1c2UgcmVsYXRlZCBjb2RlICovCi0vKiAgKi8KLXN0YXRpYyB1OAotaGFsX0VmdXNlU3dpdGNoVG9CYW5rKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJhbmspCi17Ci0JdTggYlJldCA9IGZhbHNlOwotCXUzMiB2YWx1ZTMyID0gMDsKLQotCURCR184NzIzQSgiJXM6IEVmdXNlIHN3aXRjaCBiYW5rIHRvICVkXG4iLCBfX2Z1bmNfXywgYmFuayk7Ci0JdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIEVGVVNFX1RFU1QpOwotCWJSZXQgPSB0cnVlOwotCXN3aXRjaCAoYmFuaykgewotCWNhc2UgMDoKLQkJdmFsdWUzMiA9ICh2YWx1ZTMyICYgfkVGVVNFX1NFTF9NQVNLKSB8Ci0JCQlFRlVTRV9TRUwoRUZVU0VfV0lGSV9TRUxfMCk7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJdmFsdWUzMiA9ICh2YWx1ZTMyICYgfkVGVVNFX1NFTF9NQVNLKSB8Ci0JCQlFRlVTRV9TRUwoRUZVU0VfQlRfU0VMXzApOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXZhbHVlMzIgPSAodmFsdWUzMiAmIH5FRlVTRV9TRUxfTUFTSykgfAotCQkJRUZVU0VfU0VMKEVGVVNFX0JUX1NFTF8xKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQl2YWx1ZTMyID0gKHZhbHVlMzIgJiB+RUZVU0VfU0VMX01BU0spIHwKLQkJCUVGVVNFX1NFTChFRlVTRV9CVF9TRUxfMik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXZhbHVlMzIgPSAodmFsdWUzMiAmIH5FRlVTRV9TRUxfTUFTSykgfAotCQkJRUZVU0VfU0VMKEVGVVNFX1dJRklfU0VMXzApOwotCQliUmV0ID0gZmFsc2U7Ci0JCWJyZWFrOwotCX0KLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgRUZVU0VfVEVTVCwgdmFsdWUzMik7Ci0KLQlyZXR1cm4gYlJldDsKLX0KLQotc3RhdGljIHZvaWQKLWhhbF9SZWFkRUZ1c2VfV2lGaShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICB1MTYgX29mZnNldCwgdTE2IF9zaXplX2J5dGUsIHU4ICpwYnVmKQotewotCXU4ICplZnVzZVRibCA9IE5VTEw7Ci0JdTE2IGVGdXNlX0FkZHIgPSAwOwotCXU4IG9mZnNldCwgd2RlbjsKLQl1OCBlZnVzZUhlYWRlciwgZWZ1c2VFeHRIZHIsIGVmdXNlRGF0YTsKLQl1MTYgaSwgdG90YWwsIHVzZWQ7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQkvKiAgRG8gTk9UIGV4Y2VzcyB0b3RhbCBzaXplIG9mIEVGdXNlIHRhYmxlLgotCSAgICBBZGRlZCBieSBSb2dlciwgMjAwOC4xMS4xMC4gKi8KLQlpZiAoKF9vZmZzZXQgKyBfc2l6ZV9ieXRlKSA+IEVGVVNFX01BUF9MRU5fODcyM0EpIHsKLQkJREJHXzg3MjNBKCIlczogSW52YWxpZCBvZmZzZXQoJSN4KSB3aXRoIHJlYWQgYnl0ZXMoJSN4KSEhXG4iLAotCQkJICBfX2Z1bmNfXywgX29mZnNldCwgX3NpemVfYnl0ZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQllZnVzZVRibCA9IGttYWxsb2MoRUZVU0VfTUFQX0xFTl84NzIzQSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlZnVzZVRibCkKLQkJcmV0dXJuOwotCS8qICAweGZmIHdpbGwgYmUgZWZ1c2UgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkIG9mIDB4MDAuICovCi0JbWVtc2V0KGVmdXNlVGJsLCAweEZGLCBFRlVTRV9NQVBfTEVOXzg3MjNBKTsKLQotCS8qICBzd2l0Y2ggYmFuayBiYWNrIHRvIGJhbmsgMCBmb3IgbGF0ZXIgQlQgYW5kIHdpZmkgdXNlLiAqLwotCWhhbF9FZnVzZVN3aXRjaFRvQmFuayhwYWRhcHRlciwgMCk7Ci0KLQl3aGlsZSAoQVZBSUxBQkxFX0VGVVNFX0FERFIoZUZ1c2VfQWRkcikpIHsKLQkJUmVhZEVGdXNlQnl0ZTIzYShwYWRhcHRlciwgZUZ1c2VfQWRkcisrLCAmZWZ1c2VIZWFkZXIpOwotCQlpZiAoZWZ1c2VIZWFkZXIgPT0gMHhGRikgewotCQkJREJHXzg3MjNBKCIlczogZGF0YSBlbmQgYXQgYWRkcmVzcyA9JSN4XG4iLCBfX2Z1bmNfXywKLQkJCQkgIGVGdXNlX0FkZHIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiAgQ2hlY2sgUEcgaGVhZGVyIGZvciBzZWN0aW9uIG51bS4gKi8KLQkJaWYgKEVYVF9IRUFERVIoZWZ1c2VIZWFkZXIpKSB7CS8qIGV4dGVuZGVkIGhlYWRlciAqLwotCQkJb2Zmc2V0ID0gR0VUX0hEUl9PRkZTRVRfMl8wKGVmdXNlSGVhZGVyKTsKLQotCQkJUmVhZEVGdXNlQnl0ZTIzYShwYWRhcHRlciwgZUZ1c2VfQWRkcisrLCAmZWZ1c2VFeHRIZHIpOwotCQkJaWYgKEFMTF9XT1JEU19ESVNBQkxFRChlZnVzZUV4dEhkcikpCi0JCQkJY29udGludWU7Ci0KLQkJCW9mZnNldCB8PSAoKGVmdXNlRXh0SGRyICYgMHhGMCkgPj4gMSk7Ci0JCQl3ZGVuID0gZWZ1c2VFeHRIZHIgJiAweDBGOwotCQl9IGVsc2UgewotCQkJb2Zmc2V0ID0gKGVmdXNlSGVhZGVyID4+IDQpICYgMHgwZjsKLQkJCXdkZW4gPSBlZnVzZUhlYWRlciAmIDB4MGY7Ci0JCX0KLQotCQlpZiAob2Zmc2V0IDwgRUZVU0VfTUFYX1NFQ1RJT05fODcyM0EpIHsKLQkJCXUxNiBhZGRyOwotCQkJLyogIEdldCB3b3JkIGVuYWJsZSB2YWx1ZSBmcm9tIFBHIGhlYWRlciAqLwotCi0JCQlhZGRyID0gb2Zmc2V0ICogUEdQS1RfREFUQV9TSVpFOwotCQkJZm9yIChpID0gMDsgaSA8IEVGVVNFX01BWF9XT1JEX1VOSVQ7IGkrKykgewotCQkJCS8qIENoZWNrIHdvcmQgZW5hYmxlIGNvbmRpdGlvbiBpbiB0aGUgc2VjdGlvbiAqLwotCQkJCWlmICghKHdkZW4gJiAoMHgwMSA8PCBpKSkpIHsKLQkJCQkJUmVhZEVGdXNlQnl0ZTIzYShwYWRhcHRlciwgZUZ1c2VfQWRkcisrLAotCQkJCQkJICAgICAgJmVmdXNlRGF0YSk7Ci0JCQkJCWVmdXNlVGJsW2FkZHJdID0gZWZ1c2VEYXRhOwotCi0JCQkJCVJlYWRFRnVzZUJ5dGUyM2EocGFkYXB0ZXIsIGVGdXNlX0FkZHIrKywKLQkJCQkJCSAgICAgICZlZnVzZURhdGEpOwotCQkJCQllZnVzZVRibFthZGRyICsgMV0gPSBlZnVzZURhdGE7Ci0JCQkJfQotCQkJCWFkZHIgKz0gMjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCURCR184NzIzQShLRVJOX0VSUiAiJXM6IG9mZnNldCglZCkgaXMgaWxsZWdhbCEhXG4iLAotCQkJCSAgX19mdW5jX18sIG9mZnNldCk7Ci0JCQllRnVzZV9BZGRyICs9IEVmdXNlX0NhbGN1bGF0ZVdvcmRDbnRzMjNhKHdkZW4pICogMjsKLQkJfQotCX0KLQotCS8qICBDb3B5IGZyb20gRWZ1c2UgbWFwIHRvIG91dHB1dCBwb2ludGVyIG1lbW9yeSEhISAqLwotCWZvciAoaSA9IDA7IGkgPCBfc2l6ZV9ieXRlOyBpKyspCi0JCXBidWZbaV0gPSBlZnVzZVRibFtfb2Zmc2V0ICsgaV07Ci0KLQkvKiAgQ2FsY3VsYXRlIEVmdXNlIHV0aWxpemF0aW9uICovCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uMjNhKHBhZGFwdGVyLCBFRlVTRV9XSUZJLAotCQkJCSBUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19UT1RBTCwgJnRvdGFsKTsKLQl1c2VkID0gZUZ1c2VfQWRkciAtIDE7Ci0JcEhhbERhdGEtPkVmdXNlVXNlZEJ5dGVzID0gdXNlZDsKLQotCWtmcmVlKGVmdXNlVGJsKTsKLX0KLQotc3RhdGljIHZvaWQKLWhhbF9SZWFkRUZ1c2VfQlQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJIHUxNiBfb2Zmc2V0LCB1MTYgX3NpemVfYnl0ZSwgdTggKnBidWYpCi17Ci0JdTggKmVmdXNlVGJsOwotCXU4IGJhbms7Ci0JdTE2IGVGdXNlX0FkZHI7Ci0JdTggZWZ1c2VIZWFkZXIsIGVmdXNlRXh0SGRyLCBlZnVzZURhdGE7Ci0JdTggb2Zmc2V0LCB3ZGVuOwotCXUxNiBpLCB0b3RhbCwgdXNlZDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCS8qICBEbyBOT1QgZXhjZXNzIHRvdGFsIHNpemUgb2YgRUZ1c2UgdGFibGUuCi0JICAgIEFkZGVkIGJ5IFJvZ2VyLCAyMDA4LjExLjEwLiAqLwotCWlmICgoX29mZnNldCArIF9zaXplX2J5dGUpID4gRUZVU0VfQlRfTUFQX0xFTikgewotCQlEQkdfODcyM0EoIiVzOiBJbnZhbGlkIG9mZnNldCglI3gpIHdpdGggcmVhZCBieXRlcyglI3gpISFcbiIsCi0JCQkgIF9fZnVuY19fLCBfb2Zmc2V0LCBfc2l6ZV9ieXRlKTsKLQkJcmV0dXJuOwotCX0KLQotCWVmdXNlVGJsID0ga21hbGxvYyhFRlVTRV9CVF9NQVBfTEVOLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWVmdXNlVGJsKQotCQlyZXR1cm47Ci0JLyogIDB4ZmYgd2lsbCBiZSBlZnVzZSBkZWZhdWx0IHZhbHVlIGluc3RlYWQgb2YgMHgwMC4gKi8KLQltZW1zZXQoZWZ1c2VUYmwsIDB4RkYsIEVGVVNFX0JUX01BUF9MRU4pOwotCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uMjNhKHBhZGFwdGVyLCBFRlVTRV9CVCwKLQkJCQkgVFlQRV9BVkFJTEFCTEVfRUZVU0VfQllURVNfQkFOSywgJnRvdGFsKTsKLQotCWZvciAoYmFuayA9IDE7IGJhbmsgPCBFRlVTRV9NQVhfQkFOSzsgYmFuaysrKSB7Ci0JCWlmIChoYWxfRWZ1c2VTd2l0Y2hUb0JhbmsocGFkYXB0ZXIsIGJhbmspID09IGZhbHNlKSB7Ci0JCQlEQkdfODcyM0EoIiVzOiBoYWxfRWZ1c2VTd2l0Y2hUb0JhbmsgRmFpbCEhXG4iLAotCQkJCSAgX19mdW5jX18pOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJZUZ1c2VfQWRkciA9IDA7Ci0KLQkJd2hpbGUgKEFWQUlMQUJMRV9FRlVTRV9BRERSKGVGdXNlX0FkZHIpKSB7Ci0JCQlSZWFkRUZ1c2VCeXRlMjNhKHBhZGFwdGVyLCBlRnVzZV9BZGRyKyssICZlZnVzZUhlYWRlcik7Ci0JCQlpZiAoZWZ1c2VIZWFkZXIgPT0gMHhGRikKLQkJCQlicmVhazsKLQotCQkJLyogIENoZWNrIFBHIGhlYWRlciBmb3Igc2VjdGlvbiBudW0uICovCi0JCQlpZiAoRVhUX0hFQURFUihlZnVzZUhlYWRlcikpIHsJLyogZXh0ZW5kZWQgaGVhZGVyICovCi0JCQkJb2Zmc2V0ID0gR0VUX0hEUl9PRkZTRVRfMl8wKGVmdXNlSGVhZGVyKTsKLQotCQkJCVJlYWRFRnVzZUJ5dGUyM2EocGFkYXB0ZXIsIGVGdXNlX0FkZHIrKywKLQkJCQkJICAgICAgJmVmdXNlRXh0SGRyKTsKLQkJCQlpZiAoQUxMX1dPUkRTX0RJU0FCTEVEKGVmdXNlRXh0SGRyKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlvZmZzZXQgfD0gKChlZnVzZUV4dEhkciAmIDB4RjApID4+IDEpOwotCQkJCXdkZW4gPSBlZnVzZUV4dEhkciAmIDB4MEY7Ci0JCQl9IGVsc2UgewotCQkJCW9mZnNldCA9IChlZnVzZUhlYWRlciA+PiA0KSAmIDB4MGY7Ci0JCQkJd2RlbiA9IGVmdXNlSGVhZGVyICYgMHgwZjsKLQkJCX0KLQotCQkJaWYgKG9mZnNldCA8IEVGVVNFX0JUX01BWF9TRUNUSU9OKSB7Ci0JCQkJdTE2IGFkZHI7Ci0KLQkJCQkvKiAgR2V0IHdvcmQgZW5hYmxlIHZhbHVlIGZyb20gUEcgaGVhZGVyICovCi0KLQkJCQlhZGRyID0gb2Zmc2V0ICogUEdQS1RfREFUQV9TSVpFOwotCQkJCWZvciAoaSA9IDA7IGkgPCBFRlVTRV9NQVhfV09SRF9VTklUOyBpKyspIHsKLQkJCQkJLyogIENoZWNrIHdvcmQgZW5hYmxlIGNvbmRpdGlvbiBpbgotCQkJCQkgICAgdGhlIHNlY3Rpb24gKi8KLQkJCQkJaWYgKCEod2RlbiAmICgweDAxIDw8IGkpKSkgewotCQkJCQkJUmVhZEVGdXNlQnl0ZTIzYShwYWRhcHRlciwKLQkJCQkJCQkgICAgICBlRnVzZV9BZGRyKyssCi0JCQkJCQkJICAgICAgJmVmdXNlRGF0YSk7Ci0JCQkJCQllZnVzZVRibFthZGRyXSA9IGVmdXNlRGF0YTsKLQotCQkJCQkJUmVhZEVGdXNlQnl0ZTIzYShwYWRhcHRlciwKLQkJCQkJCQkgICAgICBlRnVzZV9BZGRyKyssCi0JCQkJCQkJICAgICAgJmVmdXNlRGF0YSk7Ci0JCQkJCQllZnVzZVRibFthZGRyICsgMV0gPSBlZnVzZURhdGE7Ci0JCQkJCX0KLQkJCQkJYWRkciArPSAyOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJREJHXzg3MjNBKEtFUk5fRVJSCi0JCQkJCSAgIiVzOiBvZmZzZXQoJWQpIGlzIGlsbGVnYWwhIVxuIiwKLQkJCQkJICBfX2Z1bmNfXywgb2Zmc2V0KTsKLQkJCQllRnVzZV9BZGRyICs9IEVmdXNlX0NhbGN1bGF0ZVdvcmRDbnRzMjNhKHdkZW4pICogMjsKLQkJCX0KLQkJfQotCi0JCWlmICgoZUZ1c2VfQWRkciAtIDEpIDwgdG90YWwpIHsKLQkJCURCR184NzIzQSgiJXM6IGJhbmsoJWQpIGRhdGEgZW5kIGF0ICUjeFxuIiwKLQkJCQkgIF9fZnVuY19fLCBiYW5rLCBlRnVzZV9BZGRyIC0gMSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qICBzd2l0Y2ggYmFuayBiYWNrIHRvIGJhbmsgMCBmb3IgbGF0ZXIgQlQgYW5kIHdpZmkgdXNlLiAqLwotCWhhbF9FZnVzZVN3aXRjaFRvQmFuayhwYWRhcHRlciwgMCk7Ci0KLQkvKiAgQ29weSBmcm9tIEVmdXNlIG1hcCB0byBvdXRwdXQgcG9pbnRlciBtZW1vcnkhISEgKi8KLQlmb3IgKGkgPSAwOyBpIDwgX3NpemVfYnl0ZTsgaSsrKQotCQlwYnVmW2ldID0gZWZ1c2VUYmxbX29mZnNldCArIGldOwotCi0JLyogICovCi0JLyogIENhbGN1bGF0ZSBFZnVzZSB1dGlsaXphdGlvbi4gKi8KLQkvKiAgKi8KLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24yM2EocGFkYXB0ZXIsIEVGVVNFX0JULAotCQkJCSBUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19UT1RBTCwgJnRvdGFsKTsKLQl1c2VkID0gKEVGVVNFX0JUX1JFQUxfQkFOS19DT05URU5UX0xFTiAqIChiYW5rIC0gMSkpICsgZUZ1c2VfQWRkciAtIDE7Ci0JcEhhbERhdGEtPkJURWZ1c2VVc2VkQnl0ZXMgPSB1c2VkOwotCi1leGl0OgotCWtmcmVlKGVmdXNlVGJsKTsKLX0KLQotdm9pZAotcnRsODcyM2FfcmVhZGVmdXNlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgIHU4IGVmdXNlVHlwZSwgdTE2IF9vZmZzZXQsIHUxNiBfc2l6ZV9ieXRlLCB1OCAqcGJ1ZikKLXsKLQlpZiAoZWZ1c2VUeXBlID09IEVGVVNFX1dJRkkpCi0JCWhhbF9SZWFkRUZ1c2VfV2lGaShwYWRhcHRlciwgX29mZnNldCwgX3NpemVfYnl0ZSwgcGJ1Zik7Ci0JZWxzZQotCQloYWxfUmVhZEVGdXNlX0JUKHBhZGFwdGVyLCBfb2Zmc2V0LCBfc2l6ZV9ieXRlLCBwYnVmKTsKLX0KLQotdTE2IHJ0bDg3MjNhX0VmdXNlR2V0Q3VycmVudFNpemVfV2lGaShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXUxNiBlZnVzZV9hZGRyID0gMDsKLQl1OCBob2Zmc2V0ID0gMCwgaHdvcmRlbiA9IDA7Ci0JdTggZWZ1c2VfZGF0YSwgd29yZF9jbnRzID0gMDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWVmdXNlX2FkZHIgPSBwSGFsRGF0YS0+RWZ1c2VVc2VkQnl0ZXM7Ci0KLQlEQkdfODcyM0EoIiVzOiBzdGFydF9lZnVzZV9hZGRyID0gMHglWFxuIiwgX19mdW5jX18sIGVmdXNlX2FkZHIpOwotCi0JLyogIHN3aXRjaCBiYW5rIGJhY2sgdG8gYmFuayAwIGZvciBsYXRlciBCVCBhbmQgd2lmaSB1c2UuICovCi0JaGFsX0VmdXNlU3dpdGNoVG9CYW5rKHBhZGFwdGVyLCAwKTsKLQotCXdoaWxlIChBVkFJTEFCTEVfRUZVU0VfQUREUihlZnVzZV9hZGRyKSkgewotCQlpZiAoZWZ1c2VfT25lQnl0ZVJlYWQyM2EocGFkYXB0ZXIsIGVmdXNlX2FkZHIsICZlZnVzZV9kYXRhKSA9PQotCQkgICAgX0ZBSUwpIHsKLQkJCURCR184NzIzQShLRVJOX0VSUiAiJXM6IGVmdXNlX09uZUJ5dGVSZWFkMjNhIEZhaWwhICIKLQkJCQkgICJhZGRyID0gMHglWCAhIVxuIiwgX19mdW5jX18sIGVmdXNlX2FkZHIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoZWZ1c2VfZGF0YSA9PSAweEZGKQotCQkJYnJlYWs7Ci0KLQkJaWYgKEVYVF9IRUFERVIoZWZ1c2VfZGF0YSkpIHsKLQkJCWhvZmZzZXQgPSBHRVRfSERSX09GRlNFVF8yXzAoZWZ1c2VfZGF0YSk7Ci0JCQllZnVzZV9hZGRyKys7Ci0JCQllZnVzZV9PbmVCeXRlUmVhZDIzYShwYWRhcHRlciwgZWZ1c2VfYWRkciwgJmVmdXNlX2RhdGEpOwotCQkJaWYgKEFMTF9XT1JEU19ESVNBQkxFRChlZnVzZV9kYXRhKSkKLQkJCQljb250aW51ZTsKLQotCQkJaG9mZnNldCB8PSAoKGVmdXNlX2RhdGEgJiAweEYwKSA+PiAxKTsKLQkJCWh3b3JkZW4gPSBlZnVzZV9kYXRhICYgMHgwRjsKLQkJfSBlbHNlIHsKLQkJCWhvZmZzZXQgPSAoZWZ1c2VfZGF0YSA+PiA0KSAmIDB4MEY7Ci0JCQlod29yZGVuID0gZWZ1c2VfZGF0YSAmIDB4MEY7Ci0JCX0KLQotCQl3b3JkX2NudHMgPSBFZnVzZV9DYWxjdWxhdGVXb3JkQ250czIzYShod29yZGVuKTsKLQkJZWZ1c2VfYWRkciArPSAod29yZF9jbnRzICogMikgKyAxOwotCX0KLQotCXBIYWxEYXRhLT5FZnVzZVVzZWRCeXRlcyA9IGVmdXNlX2FkZHI7Ci0KLQlEQkdfODcyM0EoIiVzOiBDdXJyZW50U2l6ZSA9JWRcbiIsIF9fZnVuY19fLCBlZnVzZV9hZGRyKTsKLQotCXJldHVybiBlZnVzZV9hZGRyOwotfQotCi11MTYgcnRsODcyM2FfRWZ1c2VHZXRDdXJyZW50U2l6ZV9CVChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXUxNiBidHVzZWRieXRlczsKLQl1MTYgZWZ1c2VfYWRkcjsKLQl1OCBiYW5rLCBzdGFydEJhbms7Ci0JdTggaG9mZnNldCA9IDAsIGh3b3JkZW4gPSAwOwotCXU4IGVmdXNlX2RhdGEsIHdvcmRfY250cyA9IDA7Ci0JdTE2IHJldFUyID0gMDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWJ0dXNlZGJ5dGVzID0gcEhhbERhdGEtPkJURWZ1c2VVc2VkQnl0ZXM7Ci0KLQllZnVzZV9hZGRyID0gKHUxNikgKChidHVzZWRieXRlcyAlIEVGVVNFX0JUX1JFQUxfQkFOS19DT05URU5UX0xFTikpOwotCXN0YXJ0QmFuayA9ICh1OCkgKDEgKyAoYnR1c2VkYnl0ZXMgLyBFRlVTRV9CVF9SRUFMX0JBTktfQ09OVEVOVF9MRU4pKTsKLQotCURCR184NzIzQSgiJXM6IHN0YXJ0IGZyb20gYmFuayA9JWQgYWRkciA9IDB4JVhcbiIsIF9fZnVuY19fLCBzdGFydEJhbmssCi0JCSAgZWZ1c2VfYWRkcik7Ci0KLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24yM2EocGFkYXB0ZXIsIEVGVVNFX0JULAotCQkJCSBUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19CQU5LLCAmcmV0VTIpOwotCi0JZm9yIChiYW5rID0gc3RhcnRCYW5rOyBiYW5rIDwgRUZVU0VfTUFYX0JBTks7IGJhbmsrKykgewotCQlpZiAoaGFsX0VmdXNlU3dpdGNoVG9CYW5rKHBhZGFwdGVyLCBiYW5rKSA9PSBmYWxzZSkgewotCQkJREJHXzg3MjNBKEtFUk5fRVJSICIlczogc3dpdGNoIGJhbmsoJWQpIEZhaWwhIVxuIiwKLQkJCQkgIF9fZnVuY19fLCBiYW5rKTsKLQkJCWJhbmsgPSBFRlVTRV9NQVhfQkFOSzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogIG9ubHkgd2hlbiBiYW5rIGlzIHN3aXRjaGVkIHdlIGhhdmUgdG8gcmVzZXQKLQkJICAgIHRoZSBlZnVzZV9hZGRyLiAqLwotCQlpZiAoYmFuayAhPSBzdGFydEJhbmspCi0JCQllZnVzZV9hZGRyID0gMDsKLQotCQl3aGlsZSAoQVZBSUxBQkxFX0VGVVNFX0FERFIoZWZ1c2VfYWRkcikpIHsKLQkJCWlmIChlZnVzZV9PbmVCeXRlUmVhZDIzYShwYWRhcHRlciwgZWZ1c2VfYWRkciwKLQkJCQkJICAgICAgJmVmdXNlX2RhdGEpID09IF9GQUlMKSB7Ci0JCQkJREJHXzg3MjNBKEtFUk5fRVJSICIlczogZWZ1c2VfT25lQnl0ZVJlYWQyM2EgRmFpbCEiCi0JCQkJCSAgIiBhZGRyID0gMHglWCAhIVxuIiwKLQkJCQkJICBfX2Z1bmNfXywgZWZ1c2VfYWRkcik7Ci0JCQkJYmFuayA9IEVGVVNFX01BWF9CQU5LOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoZWZ1c2VfZGF0YSA9PSAweEZGKQotCQkJCWJyZWFrOwotCi0JCQlpZiAoRVhUX0hFQURFUihlZnVzZV9kYXRhKSkgewotCQkJCWhvZmZzZXQgPSBHRVRfSERSX09GRlNFVF8yXzAoZWZ1c2VfZGF0YSk7Ci0JCQkJZWZ1c2VfYWRkcisrOwotCQkJCWVmdXNlX09uZUJ5dGVSZWFkMjNhKHBhZGFwdGVyLCBlZnVzZV9hZGRyLAotCQkJCQkJICAmZWZ1c2VfZGF0YSk7Ci0JCQkJaWYgKEFMTF9XT1JEU19ESVNBQkxFRChlZnVzZV9kYXRhKSkgewotCQkJCQllZnVzZV9hZGRyKys7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWhvZmZzZXQgfD0gKChlZnVzZV9kYXRhICYgMHhGMCkgPj4gMSk7Ci0JCQkJaHdvcmRlbiA9IGVmdXNlX2RhdGEgJiAweDBGOwotCQkJfSBlbHNlIHsKLQkJCQlob2Zmc2V0ID0gKGVmdXNlX2RhdGEgPj4gNCkgJiAweDBGOwotCQkJCWh3b3JkZW4gPSBlZnVzZV9kYXRhICYgMHgwRjsKLQkJCX0KLQkJCXdvcmRfY250cyA9IEVmdXNlX0NhbGN1bGF0ZVdvcmRDbnRzMjNhKGh3b3JkZW4pOwotCQkJLyogcmVhZCBuZXh0IGhlYWRlciAqLwotCQkJZWZ1c2VfYWRkciArPSAod29yZF9jbnRzICogMikgKyAxOwotCQl9Ci0KLQkJLyogIENoZWNrIGlmIHdlIG5lZWQgdG8gY2hlY2sgbmV4dCBiYW5rIGVmdXNlICovCi0JCWlmIChlZnVzZV9hZGRyIDwgcmV0VTIpCi0JCQlicmVhazsJLyogIGRvbid0IG5lZWQgdG8gY2hlY2sgbmV4dCBiYW5rLiAqLwotCX0KLQotCXJldFUyID0gKChiYW5rIC0gMSkgKiBFRlVTRV9CVF9SRUFMX0JBTktfQ09OVEVOVF9MRU4pICsgZWZ1c2VfYWRkcjsKLQlwSGFsRGF0YS0+QlRFZnVzZVVzZWRCeXRlcyA9IHJldFUyOwotCi0JREJHXzg3MjNBKCIlczogQ3VycmVudFNpemUgPSVkXG4iLCBfX2Z1bmNfXywgcmV0VTIpOwotCXJldHVybiByZXRVMjsKLX0KLQotdm9pZCBydGw4NzIzYV9yZWFkX2NoaXBfdmVyc2lvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXUzMiB2YWx1ZTMyOwotCXN0cnVjdCBoYWxfdmVyc2lvbiBDaGlwVmVyc2lvbjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19TWVNfQ0ZHKTsKLQlDaGlwVmVyc2lvbi5JQ1R5cGUgPSBDSElQXzg3MjNBOwotCUNoaXBWZXJzaW9uLkNoaXBUeXBlID0gKCh2YWx1ZTMyICYgUlRMX0lEKSA/IFRFU1RfQ0hJUCA6IE5PUk1BTF9DSElQKTsKLQlwSGFsRGF0YS0+cmZfdHlwZSA9IFJGXzFUMVI7Ci0JQ2hpcFZlcnNpb24uVmVuZG9yVHlwZSA9Ci0JCSgodmFsdWUzMiAmIFZFTkRPUl9JRCkgPyBDSElQX1ZFTkRPUl9VTUMgOiBDSElQX1ZFTkRPUl9UU01DKTsKLQlDaGlwVmVyc2lvbi5DVVRWZXJzaW9uID0gKHZhbHVlMzIgJiBDSElQX1ZFUl9SVExfTUFTSykgPj4gQ0hJUF9WRVJfUlRMX1NISUZUOwkvKiAgSUMgdmVyc2lvbiAoQ1VUKSAqLwotCi0JLyogIEZvciByZWd1bGF0b3IgbW9kZS4gYnkgdHlubGkuIDIwMTEuMDEuMTQgKi8KLQlwSGFsRGF0YS0+UmVndWxhdG9yTW9kZSA9ICgodmFsdWUzMiAmIFNQU19TRUwpID8KLQkJCQkgICBSVF9MRE9fUkVHVUxBVE9SIDogUlRfU1dJVENISU5HX1JFR1VMQVRPUik7Ci0KLQl2YWx1ZTMyID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX0dQSU9fT1VUU1RTKTsKLQkvKiAgUk9NIGNvZGUgdmVyc2lvbi4gKi8KLQlDaGlwVmVyc2lvbi5ST01WZXIgPSAodmFsdWUzMiAmIFJGX1JMX0lEKSA+PiAyMDsKLQotCS8qICBGb3IgbXVsdGktZnVuY3Rpb24gY29uc2lkZXJhdGlvbi4gQWRkZWQgYnkgUm9nZXIsIDIwMTAuMTAuMDYuICovCi0JcEhhbERhdGEtPk11bHRpRnVuYyA9IFJUX01VTFRJX0ZVTkNfTk9ORTsKLQl2YWx1ZTMyID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX01VTFRJX0ZVTkNfQ1RSTCk7Ci0JcEhhbERhdGEtPk11bHRpRnVuYyB8PQotCQkoKHZhbHVlMzIgJiBXTF9GVU5DX0VOKSA/IFJUX01VTFRJX0ZVTkNfV0lGSSA6IDApOwotCXBIYWxEYXRhLT5NdWx0aUZ1bmMgfD0gKCh2YWx1ZTMyICYgQlRfRlVOQ19FTikgPyBSVF9NVUxUSV9GVU5DX0JUIDogMCk7Ci0JcEhhbERhdGEtPk11bHRpRnVuYyB8PQotCQkoKHZhbHVlMzIgJiBHUFNfRlVOQ19FTikgPyBSVF9NVUxUSV9GVU5DX0dQUyA6IDApOwotCXBIYWxEYXRhLT5Qb2xhcml0eUN0bCA9Ci0JCSgodmFsdWUzMiAmIFdMX0hXUEROX1NMKSA/IFJUX1BPTEFSSVRZX0hJR0hfQUNUIDoKLQkJIFJUX1BPTEFSSVRZX0xPV19BQ1QpOwotCXBIYWxEYXRhLT5WZXJzaW9uSUQgPSBDaGlwVmVyc2lvbjsKLQotCU1TR184NzIzQSgiUkZfVHlwZSBpcyAleCEhXG4iLCBwSGFsRGF0YS0+cmZfdHlwZSk7Ci19Ci0KLS8qICAqLwotLyogICovCi0vKiAgMjAxMDAyMDkgSm9zZXBoOiAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGZvciA5MkMgdG8gc2V0IFJFR19CQ05fQ1RSTCgweDU1MCkgcmVnaXN0ZXIuICovCi0vKiAgV2UganVzdCByZXNlcnZlIHRoZSB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgaW4gdmFyaWFibGUKLSAgICBwSGFsRGF0YS0+UmVnQmNuQ3RybFZhbCBhbmQgdGhlbiBvcGVyYXRlICovCi0vKiAgdGhlIHZhbHVlIG9mIHRoZSByZWdpc3RlciB2aWEgYXRvbWljIG9wZXJhdGlvbi4gKi8KLS8qICBUaGlzIHByZXZlbnRzIGZyb20gcmFjZSBjb25kaXRpb24gd2hlbiBzZXR0aW5nIHRoaXMgcmVnaXN0ZXIuICovCi0vKiAgVGhlIHZhbHVlIG9mIHBIYWxEYXRhLT5SZWdCY25DdHJsVmFsIGlzIGluaXRpYWxpemVkIGluCi0gICAgSHdDb25maWd1cmVSVEw4MTkyQ0UoKSBmdW5jdGlvbi4gKi8KLS8qICAqLwotdm9pZCBTZXRCY25DdHJsUmVnMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IFNldEJpdHMsIHU4IENsZWFyQml0cykKLXsKLQl1OCB2YWw4OwotCi0JdmFsOCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX0JDTl9DVFJMKTsKLQl2YWw4IHw9IFNldEJpdHM7Ci0JdmFsOCAmPSB+Q2xlYXJCaXRzOwotCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0JDTl9DVFJMLCB2YWw4KTsKLX0KLQotdm9pZCBydGw4NzIzYV9Jbml0QmVhY29uUGFyYW1ldGVycyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfQkNOX0NUUkwsIDB4MTAxMCk7Ci0KLQkvKiAgVE9ETzogUmVtb3ZlIHRoZXNlIG1hZ2ljIG51bWJlciAqLwotCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfVEJUVF9QUk9ISUJJVCwgMHg2NDA0KTsJLyogIG1zICovCi0JLyogIEZpcm13YXJlIHdpbGwgY29udHJvbCBSRUdfRFJWRVJMWUlOVCB3aGVuIHBvd2VyIHNhdmluZyBpcyBlbmFibGUsICovCi0JLyogIHNvIGRvbid0IHNldCB0aGlzIHJlZ2lzdGVyIG9uIFNUQSBtb2RlLiAqLwotCWlmIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkgPT0gZmFsc2UpCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19EUlZFUkxZSU5ULAotCQkJCSBEUklWRVJfRUFSTFlfSU5UX1RJTUUpOwotCS8qICAybXMgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfQkNORE1BVElNLCBCQ05fRE1BX0FUSU1FX0lOVF9USU1FKTsKLQotCS8qICBTdWdnZXN0ZWQgYnkgZGVzaWduZXIgdGltY2hlbi4gQ2hhbmdlIGJlYWNvbiBBSUZTIHRvIHRoZQotCSAgICBsYXJnZXN0IG51bWJlciBiZWFjYXVzZSB0ZXN0IGNoaXAgZG9lcyBub3QgY29udGVuc2lvbiBiZWZvcmUKLQkgICAgc2VuZGluZyBiZWFjb24uIGJ5IHR5bmxpLiAyMDA5LjExLjAzICovCi0JcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19CQ05UQ0ZHLCAweDY2MEYpOwotfQotCi1zdGF0aWMgdm9pZCBSZXN1bWVUeEJlYWNvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JLyogIDIwMTAuMDMuMDEuIE1hcmtlZCBieSB0eW5saS4gTm8gbmVlZCB0byBjYWxsIHdvcmtpdGVtIGJlYWNhdXNlCi0JICAgIHdlIHJlY29yZCB0aGUgdmFsdWUgKi8KLQkvKiAgd2hpY2ggc2hvdWxkIGJlIHJlYWQgZnJvbSByZWdpc3RlciB0byBhIGdsb2JhbCB2YXJpYWJsZS4gKi8KLQotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAiK1Jlc3VtZVR4QmVhY29uXG4iKTsKLQotCXBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCB8PSBCSVQoNik7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0ZXSFdfVFhRX0NUUkwgKyAyLAotCQkJIHBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCk7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1RCVFRfUFJPSElCSVQgKyAxLCAweGZmKTsKLQlwSGFsRGF0YS0+UmVnUmVnNTQyIHw9IEJJVCgwKTsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfVEJUVF9QUk9ISUJJVCArIDIsIHBIYWxEYXRhLT5SZWdSZWc1NDIpOwotfQotCi1zdGF0aWMgdm9pZCBTdG9wVHhCZWFjb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCS8qICAyMDEwLjAzLjAxLiBNYXJrZWQgYnkgdHlubGkuIE5vIG5lZWQgdG8gY2FsbCB3b3JraXRlbSBiZWFjYXVzZQotCSAgICB3ZSByZWNvcmQgdGhlIHZhbHVlICovCi0JLyogIHdoaWNoIHNob3VsZCBiZSByZWFkIGZyb20gcmVnaXN0ZXIgdG8gYSBnbG9iYWwgdmFyaWFibGUuICovCi0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgIitTdG9wVHhCZWFjb25cbiIpOwotCi0JcEhhbERhdGEtPlJlZ0Z3SHdUeFFDdHJsICY9IH5CSVQoNik7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0ZXSFdfVFhRX0NUUkwgKyAyLAotCQkJIHBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCk7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1RCVFRfUFJPSElCSVQgKyAxLCAweDY0KTsKLQlwSGFsRGF0YS0+UmVnUmVnNTQyICY9IH5CSVQoMCk7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1RCVFRfUFJPSElCSVQgKyAyLCBwSGFsRGF0YS0+UmVnUmVnNTQyKTsKLX0KLQotc3RhdGljIHZvaWQgX0JlYWNvbkZ1bmN0aW9uRW5hYmxlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IEVuYWJsZSwKLQkJCQkgIHU4IExpbmtlZCkKLXsKLQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCBESVNfVFNGX1VEVCB8IEVOX0JDTl9GVU5DVElPTiB8IERJU19CQ05RX1NVQiwKLQkJICAgICAgMCk7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1JEX0NUUkwgKyAxLCAweDZGKTsKLX0KLQotdm9pZCBydGw4NzIzYV9TZXRCZWFjb25SZWxhdGVkUmVnaXN0ZXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTMyIHZhbHVlMzI7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCS8qIHJlc2V0IFRTRiwgZW5hYmxlIHVwZGF0ZSBUU0YsIGNvcnJlY3RpbmcgVFNGIE9uIEJlYWNvbiAqLwotCi0JLyogUkVHX0JDTl9JTlRFUlZBTCAqLwotCS8qIFJFR19CQ05ETUFUSU0gKi8KLQkvKiBSRUdfQVRJTVdORCAqLwotCS8qIFJFR19UQlRUX1BST0hJQklUICovCi0JLyogUkVHX0RSVkVSTFlJTlQgKi8KLQkvKiBSRUdfQkNOX01BWF9FUlIgKi8KLQkvKiBSRUdfQkNOVENGRyAoMHg1MTApICovCi0JLyogUkVHX0RVQUxfVFNGX1JTVCAqLwotCS8qIFJFR19CQ05fQ1RSTCAoMHg1NTApICovCi0KLQkvKiAgKi8KLQkvKiAgQVRJTSB3aW5kb3cgKi8KLQkvKiAgKi8KLQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX0FUSU1XTkQsIDIpOwotCi0JLyogICovCi0JLyogIEJlYWNvbiBpbnRlcnZhbCAoaW4gdW5pdCBvZiBUVSkuICovCi0JLyogICovCi0JcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19CQ05fSU5URVJWQUwsIHBtbG1laW5mby0+YmNuX2ludGVydmFsKTsKLQotCXJ0bDg3MjNhX0luaXRCZWFjb25QYXJhbWV0ZXJzKHBhZGFwdGVyKTsKLQotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19TTE9ULCAweDA5KTsKLQotCS8qICAqLwotCS8qICBSZXNldCBUU0YgVGltZXIgdG8gemVybywgYWRkZWQgYnkgUm9nZXIuIDIwMDguMDYuMjQgKi8KLQkvKiAgKi8KLQl2YWx1ZTMyID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX1RDUik7Ci0JdmFsdWUzMiAmPSB+VFNGUlNUOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfVENSLCB2YWx1ZTMyKTsKLQotCXZhbHVlMzIgfD0gVFNGUlNUOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfVENSLCB2YWx1ZTMyKTsKLQotCS8qICBOT1RFOiBGaXggdGVzdCBjaGlwJ3MgYnVnIChhYm91dCBjb250ZW50aW9uIHdpbmRvd3MncyByYW5kb21uZXNzKSAqLwotCWlmIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUgfAotCQkJICBXSUZJX0FESE9DX01BU1RFUl9TVEFURSB8IFdJRklfQVBfU1RBVEUpID09IHRydWUpIHsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1JYVFNGX09GRlNFVF9DQ0ssIDB4NTApOwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfUlhUU0ZfT0ZGU0VUX09GRE0sIDB4NTApOwotCX0KLQotCV9CZWFjb25GdW5jdGlvbkVuYWJsZShwYWRhcHRlciwgdHJ1ZSwgdHJ1ZSk7Ci0KLQlSZXN1bWVUeEJlYWNvbihwYWRhcHRlcik7Ci0JU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgRElTX0JDTlFfU1VCLCAwKTsKLX0KLQotdm9pZCBydGw4NzIzYV9TZXRIYWxPRE1WYXIoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJICAgZW51bSBoYWxfb2RtX3ZhcmlhYmxlIGVWYXJpYWJsZSwKLQkJCSAgIHZvaWQgKnBWYWx1ZTEsIGJvb2wgYlNldCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9vZG1fdCAqcG9kbXByaXYgPSAmcEhhbERhdGEtPm9kbXByaXY7Ci0Jc3dpdGNoIChlVmFyaWFibGUpIHsKLQljYXNlIEhBTF9PRE1fU1RBX0lORk86Ci0JewotCQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSAoc3RydWN0IHN0YV9pbmZvICopcFZhbHVlMTsKLQotCQlpZiAoYlNldCkgewotCQkJREJHXzg3MjNBKCJTZXQgU1RBXyglZCkgaW5mb1xuIiwgcHN0YS0+bWFjX2lkKTsKLQkJCU9ETV9DbW5JbmZvUHRyQXJyYXlIb29rMjNhKHBvZG1wcml2LAotCQkJCQkJT0RNX0NNTklORk9fU1RBX1NUQVRVUywKLQkJCQkJCXBzdGEtPm1hY19pZCwgcHN0YSk7Ci0JCX0gZWxzZSB7Ci0JCQlEQkdfODcyM0EoIkNsZWFuIFNUQV8oJWQpIGluZm9cbiIsIHBzdGEtPm1hY19pZCk7Ci0JCQkJT0RNX0NtbkluZm9QdHJBcnJheUhvb2syM2EocG9kbXByaXYsCi0JCQkJCQkJT0RNX0NNTklORk9fU1RBX1NUQVRVUywKLQkJCQkJCQlwc3RhLT5tYWNfaWQsIE5VTEwpOwotCQl9Ci0JfQotCQlicmVhazsKLQljYXNlIEhBTF9PRE1fUDJQX1NUQVRFOgotCQlPRE1fQ21uSW5mb1VwZGF0ZTIzYShwb2RtcHJpdiwgT0RNX0NNTklORk9fV0lGSV9ESVJFQ1QsIGJTZXQpOwotCQlicmVhazsKLQljYXNlIEhBTF9PRE1fV0lGSV9ESVNQTEFZX1NUQVRFOgotCQlPRE1fQ21uSW5mb1VwZGF0ZTIzYShwb2RtcHJpdiwgT0RNX0NNTklORk9fV0lGSV9ESVNQTEFZLCBiU2V0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi12b2lkIHJ0bDg3MjNhX25vdGNoX2ZpbHRlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgZW5hYmxlKQotewotCWlmIChlbmFibGUpIHsKLQkJREJHXzg3MjNBKCJFbmFibGUgbm90Y2ggZmlsdGVyXG4iKTsKLQkJcnRsODcyM2F1X3dyaXRlOChhZGFwdGVyLCByT0ZETTBfUnhEU1AgKyAxLAotCQkJCSBydGw4NzIzYXVfcmVhZDgoYWRhcHRlciwgck9GRE0wX1J4RFNQICsgMSkgfAotCQkJCSBCSVQoMSkpOwotCX0gZWxzZSB7Ci0JCURCR184NzIzQSgiRGlzYWJsZSBub3RjaCBmaWx0ZXJcbiIpOwotCQlydGw4NzIzYXVfd3JpdGU4KGFkYXB0ZXIsIHJPRkRNMF9SeERTUCArIDEsCi0JCQkgICBydGw4NzIzYXVfcmVhZDgoYWRhcHRlciwgck9GRE0wX1J4RFNQICsgMSkgJgotCQkJCSB+QklUKDEpKTsKLQl9Ci19Ci0KLWJvb2wgYzJoX2lkX2ZpbHRlcl9jY3hfODcyM2EodTggaWQpCi17Ci0JYm9vbCByZXQgPSBmYWxzZTsKLQlpZiAoaWQgPT0gQzJIX0NDWF9UWF9SUFQpCi0JCXJldCA9IHRydWU7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYzJoX2hhbmRsZXJfODcyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IGMyaF9ldnRfaGRyICpjMmhfZXZ0KQotewotCWludCByZXQgPSBfU1VDQ0VTUzsKLQl1OCBpID0gMDsKLQotCWlmIChjMmhfZXZ0ID09IE5VTEwpIHsKLQkJREJHXzg3MjNBKCIlcyBjMmhfZXZ0IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlzd2l0Y2ggKGMyaF9ldnQtPmlkKSB7Ci0JY2FzZSBDMkhfREJHOgotCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJDMkhDb21tYW5kSGFuZGxlcjogJXNcbiIsIGMyaF9ldnQtPnBheWxvYWQpOwotCQlicmVhazsKLQotCWNhc2UgQzJIX0NDWF9UWF9SUFQ6Ci0JCWhhbmRsZV90eHJwdF9jY3hfODcyM2EocGFkYXB0ZXIsIGMyaF9ldnQtPnBheWxvYWQpOwotCQlicmVhazsKLQljYXNlIEMySF9FWFRfUkFfUlBUOgotCQlicmVhazsKLQljYXNlIEMySF9IV19JTkZPX0VYQ0g6Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgIltCVF0sIEMySF9IV19JTkZPX0VYQ0hcbiIpOwotCQlmb3IgKGkgPSAwOyBpIDwgYzJoX2V2dC0+cGxlbjsgaSsrKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiW0JUXSwgdG1wQnVmWyVkXT0gMHgleFxuIiwgaSwKLQkJCQkgYzJoX2V2dC0+cGF5bG9hZFtpXSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEMySF9DMkhfSDJDX1RFU1Q6Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgIltCVF0sIEMySF9IMkNfVEVTVFxuIik7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgIltCVF0sIHRtcEJ1ZlswXS9bMV0vWzJdL1szXS9bNF09IDB4JXgvIDB4JXgvIDB4JXgvIDB4JXgvIDB4JXhcbiIsCi0JCQkgYzJoX2V2dC0+cGF5bG9hZFswXSwKLQkJCSBjMmhfZXZ0LT5wYXlsb2FkWzFdLCBjMmhfZXZ0LT5wYXlsb2FkWzJdLAotCQkJIGMyaF9ldnQtPnBheWxvYWRbM10sIGMyaF9ldnQtPnBheWxvYWRbNF0pOwotCQlicmVhazsKLQotCWNhc2UgQzJIX0JUX0lORk86Ci0JCURCR184NzIzQSgiJXMgLCAgR290ICBDMkhfQlRfSU5GTyBcbiIsIF9fZnVuY19fKTsKLQkJcnRsODcyM2FfZndfYzJoX0JUX2luZm8ocGFkYXB0ZXIsCi0JCQkJCWMyaF9ldnQtPnBheWxvYWQsIGMyaF9ldnQtPnBsZW4pOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldCA9IF9GQUlMOwotCQlicmVhazsKLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBoYW5kbGVfdHhycHRfY2N4Xzg3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdm9pZCAqYnVmKQotewotCXN0cnVjdCB0eHJwdF9jY3hfODcyM2EgKnR4cnB0X2NjeCA9IGJ1ZjsKLQlzdHJ1Y3Qgc3VibWl0X2N0eCAqcGFja190eF9vcHMgPSAmYWRhcHRlci0+eG1pdHByaXYuYWNrX3R4X29wczsKLQotCWlmICh0eHJwdF9jY3gtPmludF9jY3ggJiYgYWRhcHRlci0+eG1pdHByaXYuYWNrX3R4KSB7Ci0JCWlmICh0eHJwdF9jY3gtPnBrdF9vaykKLQkJCXJ0dzIzYV9zY3R4X2RvbmVfZXJyKCZwYWNrX3R4X29wcywKLQkJCQkJICAgICBSVFdfU0NUWF9ET05FX1NVQ0NFU1MpOwotCQllbHNlCi0JCQlydHcyM2Ffc2N0eF9kb25lX2VycigmcGFja190eF9vcHMsCi0JCQkJCSAgICAgUlRXX1NDVFhfRE9ORV9DQ1hfUEtUX0ZBSUwpOwotCX0KLX0KLQotdm9pZCBydGw4NzIzYV9Jbml0QW50ZW5uYV9TZWxlY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCB2YWw7Ci0KLQl2YWwgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19MRURDRkcyKTsKLQkvKiAgTGV0IDgwNTEgdGFrZSBjb250cm9sIGFudGVubmEgc2V0dGluZyAqLwotCXZhbCB8PSBCSVQoNyk7CQkvKiAgRFBEVF9TRUxfRU4sIDB4NENbMjNdICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0xFRENGRzIsIHZhbCk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfQ2hlY2tBbnRlbm5hX1NlbGVjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IHZhbDsKLQotCXZhbCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX0xFRENGRzIpOwotCS8qICBMZXQgODA1MSB0YWtlIGNvbnRyb2wgYW50ZW5uYSBzZXR0aW5nICovCi0JaWYgKCEodmFsICYgQklUKDcpKSkgewotCQl2YWwgfD0gQklUKDcpOwkvKiAgRFBEVF9TRUxfRU4sIDB4NENbMjNdICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19MRURDRkcyLCB2YWwpOwotCX0KLX0KLQotdm9pZCBydGw4NzIzYV9EZWluaXRBbnRlbm5hX1NlbGVjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IHZhbDsKLQotCXZhbCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX0xFRENGRzIpOwotCS8qICBMZXQgODA1MSB0YWtlIGNvbnRyb2wgYW50ZW5uYSBzZXR0aW5nICovCi0JdmFsICY9IH5CSVQoNyk7CQkvKiAgRFBEVF9TRUxfRU4sIGNsZWFyIDB4NENbMjNdICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0xFRENGRzIsIHZhbCk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfaW5pdF9kZWZhdWx0X3ZhbHVlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdjsKLQl1OCBpOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQotCS8qICBpbml0IGRlZmF1bHQgdmFsdWUgKi8KLQlwSGFsRGF0YS0+YklRS0luaXRpYWxpemVkID0gZmFsc2U7Ci0JaWYgKCFwYWRhcHRlci0+cHdyY3RybHByaXYuYmtlZXBmd2FsaXZlKQotCQlwSGFsRGF0YS0+TGFzdEhNRUJveE51bSA9IDA7Ci0KLQlwSGFsRGF0YS0+YklRS0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKiAgaW5pdCBkbSBkZWZhdWx0IHZhbHVlICovCi0JcGRtcHJpdi0+VE1fVHJpZ2dlciA9IDA7CS8qIGZvciBJUUsgKi8KLS8qCXBkbXByaXYtPmJpbml0aWFsaXplZCA9IGZhbHNlOyAqLwotLyoJcGRtcHJpdi0+cHJ2X3RyYWZmaWNfaWR4ID0gMzsgKi8KLS8qCXBkbXByaXYtPmluaXRpYWxpemUgPSAwOyAqLwotCi0JcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0hQX2luZGV4ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgSFBfVEhFUk1BTF9OVU07IGkrKykKLQkJcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0hQW2ldID0gMDsKLQotCS8qICBpbml0IEVmdXNlIHZhcmlhYmxlcyAqLwotCXBIYWxEYXRhLT5FZnVzZVVzZWRCeXRlcyA9IDA7Ci0JcEhhbERhdGEtPkJURWZ1c2VVc2VkQnl0ZXMgPSAwOwotfQotCi11OCBHZXRFRVBST01TaXplODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBzaXplID0gMDsKLQl1MzIgY3I7Ci0KLQljciA9IHJ0bDg3MjNhdV9yZWFkMTYocGFkYXB0ZXIsIFJFR185MzQ2Q1IpOwotCS8qICA2OiBFRVBST00gdXNlZCBpcyA5M0M0NiwgNDogYm9vdCBmcm9tIEUtRnVzZS4gKi8KLQlzaXplID0gKGNyICYgQk9PVF9GUk9NX0VFUFJPTSkgPyA2IDogNDsKLQotCU1TR184NzIzQSgiRUVQUk9NIHR5cGUgaXMgJXNcbiIsIHNpemUgPT0gNCA/ICJFLUZVU0UiIDogIjkzQzQ2Iik7Ci0KLQlyZXR1cm4gc2l6ZTsKLX0KLQotLyogICovCi0vKiAgKi8KLS8qICBMTFQgUi9XL0luaXQgZnVuY3Rpb24gKi8KLS8qICAqLwotLyogICovCi1zdGF0aWMgaW50IF9MTFRXcml0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgYWRkcmVzcywgdTMyIGRhdGEpCi17Ci0JaW50IHN0YXR1cyA9IF9TVUNDRVNTOwotCXMzMiBjb3VudCA9IDA7Ci0JdTMyIHZhbHVlID0gX0xMVF9JTklUX0FERFIoYWRkcmVzcykgfCBfTExUX0lOSVRfREFUQShkYXRhKSB8Ci0JCSAgICBfTExUX09QKF9MTFRfV1JJVEVfQUNDRVNTKTsKLQl1MTYgTExUUmVnID0gUkVHX0xMVF9JTklUOwotCi0JcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIExMVFJlZywgdmFsdWUpOwotCi0JLyogcG9sbGluZyAqLwotCWRvIHsKLQkJdmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBMTFRSZWcpOwotCQlpZiAoX0xMVF9OT19BQ1RJVkUgPT0gX0xMVF9PUF9WQUxVRSh2YWx1ZSkpCi0JCQlicmVhazsKLQotCQlpZiAoY291bnQgPiBQT0xMSU5HX0xMVF9USFJFU0hPTEQpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgIkZhaWxlZCB0byBwb2xsaW5nIHdyaXRlIExMVCBkb25lIGF0IGFkZHJlc3MgJWQhXG4iLAotCQkJCSBhZGRyZXNzKTsKLQkJCXN0YXR1cyA9IF9GQUlMOwotCQkJYnJlYWs7Ci0JCX0KLQl9IHdoaWxlIChjb3VudCsrKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLWludCBJbml0TExUVGFibGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIGJvdW5kYXJ5KQotewotCWludCBzdGF0dXMgPSBfU1VDQ0VTUzsKLQl1MzIgaTsKLQl1MzIgdHhwa3RidWZfYm5keSA9IGJvdW5kYXJ5OwotCXUzMiBMYXN0X0VudHJ5X09mX1R4UGt0QnVmID0gTEFTVF9FTlRSWV9PRl9UWF9QS1RfQlVGRkVSOwotCi0JZm9yIChpID0gMDsgaSA8ICh0eHBrdGJ1Zl9ibmR5IC0gMSk7IGkrKykgewotCQlzdGF0dXMgPSBfTExUV3JpdGUocGFkYXB0ZXIsIGksIGkgKyAxKTsKLQkJaWYgKHN0YXR1cyAhPSBfU1VDQ0VTUykKLQkJCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyogIGVuZCBvZiBsaXN0ICovCi0Jc3RhdHVzID0gX0xMVFdyaXRlKHBhZGFwdGVyLCAodHhwa3RidWZfYm5keSAtIDEpLCAweEZGKTsKLQlpZiAoc3RhdHVzICE9IF9TVUNDRVNTKQotCQlyZXR1cm4gc3RhdHVzOwotCi0JLyogIE1ha2UgdGhlIG90aGVyIHBhZ2VzIGFzIHJpbmcgYnVmZmVyICovCi0JLyogIFRoaXMgcmluZyBidWZmZXIgaXMgdXNlZCBhcyBiZWFjb24gYnVmZmVyIGlmIHdlIGNvbmZpZyB0aGlzCi0JICAgIE1BQyBhcyB0d28gTUFDIHRyYW5zZmVyLiAqLwotCS8qICBPdGhlcndpc2UgdXNlZCBhcyBsb2NhbCBsb29wYmFjayBidWZmZXIuICovCi0JZm9yIChpID0gdHhwa3RidWZfYm5keTsgaSA8IExhc3RfRW50cnlfT2ZfVHhQa3RCdWY7IGkrKykgewotCQlzdGF0dXMgPSBfTExUV3JpdGUocGFkYXB0ZXIsIGksIChpICsgMSkpOwotCQlpZiAoX1NVQ0NFU1MgIT0gc3RhdHVzKQotCQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKiAgTGV0IGxhc3QgZW50cnkgcG9pbnQgdG8gdGhlIHN0YXJ0IGVudHJ5IG9mIHJpbmcgYnVmZmVyICovCi0Jc3RhdHVzID0gX0xMVFdyaXRlKHBhZGFwdGVyLCBMYXN0X0VudHJ5X09mX1R4UGt0QnVmLCB0eHBrdGJ1Zl9ibmR5KTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyB2b2lkIF9EaXNhYmxlR1BJTyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotai4gR1BJT19QSU5fQ1RSTCAweDQ0WzMxOjBdPSAweDAwMAotay5WYWx1ZSA9IEdQSU9fUElOX0NUUkxbNzowXQotbC4gR1BJT19QSU5fQ1RSTCAweDQ0WzMxOjBdID0gMHgwMEZGMDAwMCB8ICh2YWx1ZSA8PDgpOyB3cml0ZSBleHRlcm5hbCBQSU4gbGV2ZWwKLW0uIEdQSU9fTVVYQ0ZHIDB4NDIgWzE1OjBdID0gMHgwNzgwCi1uLiBMRURDRkcgMHg0Q1sxNTowXSA9IDB4ODA4MAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCXUzMiB2YWx1ZTMyOwotCXUzMiB1NGJUbXA7Ci0KLQkvKiAxLiBEaXNhYmxlIEdQSU9bNzowXSAqLwotCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfR1BJT19QSU5fQ1RSTCArIDIsIDB4MDAwMCk7Ci0JdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19HUElPX1BJTl9DVFJMKSAmIDB4RkZGRjAwRkY7Ci0JdTRiVG1wID0gdmFsdWUzMiAmIDB4MDAwMDAwRkY7Ci0JdmFsdWUzMiB8PSAoKHU0YlRtcCA8PCA4KSB8IDB4MDBGRjAwMDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfR1BJT19QSU5fQ1RSTCwgdmFsdWUzMik7Ci0KLQkvKiAgKi8KLQkvKiAgPFJvZ2VyX05vdGVzPiBGb3IgUlRMODcyM3UgbXVsdGktZnVuY3Rpb24gY29uZmlndXJhdGlvbiB3aGljaAotCSAgICB3YXMgYXV0b2xvYWQgZnJvbSBFZnVzZSBvZmZzZXQgMHgwYSBhbmQgMHgwYiwgKi8KLQkvKiAgV0xBTiBIVyBHUElPWzldLCBHUFMgSFcgR1BJT1sxMF0gYW5kIEJUIEhXIEdQSU9bMTFdLiAqLwotCS8qICBBZGRlZCBieSBSb2dlciwgMjAxMC4xMC4wNy4gKi8KLQkvKiAgKi8KLQkvKiAyLiBEaXNhYmxlIEdQSU9bOF0gYW5kIEdQSU9bMTJdICovCi0KLQkvKiAgQ29uZmlndXJlIGFsbCBwaW5zIGFzIGlucHV0IG1vZGUuICovCi0JcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19HUElPX0lPX1NFTF8yLCAweDAwMDApOwotCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfR1BJT19QSU5fQ1RSTF8yKSAmIDB4RkZGRjAwMUY7Ci0JdTRiVG1wID0gdmFsdWUzMiAmIDB4MDAwMDAwMUY7Ci0JLyogIFNldCBwaW4gOCwgMTAsIDExIGFuZCBwaW4gMTIgdG8gb3V0cHV0IG1vZGUuICovCi0JdmFsdWUzMiB8PSAoKHU0YlRtcCA8PCA4KSB8IDB4MDAxRDAwMDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfR1BJT19QSU5fQ1RSTF8yLCB2YWx1ZTMyKTsKLQotCS8qIDMuIERpc2FibGUgTEVEMCAmIDEgKi8KLQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX0xFRENGRzAsIDB4ODA4MCk7Ci19CQkJCS8qIGVuZCBvZiBfRGlzYWJsZUdQSU8oKSAqLwotCi1zdGF0aWMgdm9pZCBfRGlzYWJsZVJGQUZFQW5kUmVzZXRCQjgxOTJDKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLWEuCVRYUEFVU0UgMHg1MjJbNzowXSA9IDB4RkYJCVBhdXNlIE1BQyBUWCBxdWV1ZQotYi4JUkYgcGF0aCAwIG9mZnNldCAweDAwID0gMHgwMAkJZGlzYWJsZSBSRgotYy4JQVBTRF9DVFJMIDB4NjAwWzc6MF0gPSAweDQwCi1kLglTWVNfRlVOQ19FTiAweDAyWzc6MF0gPSAweDE2CQlyZXNldCBCQiBzdGF0ZSBtYWNoaW5lCi1lLglTWVNfRlVOQ19FTiAweDAyWzc6MF0gPSAweDE0CQlyZXNldCBCQiBzdGF0ZSBtYWNoaW5lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JdTggdmFsdWU4OwotCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1RYUEFVU0UsIDB4RkYpOwotCi0JUEhZX1NldFJGUmVnKHBhZGFwdGVyLCBSRl9QQVRIX0EsIDB4MCwgYk1hc2tCeXRlMCwgMHgwKTsKLQotCXZhbHVlOCA9IEFQU0RPRkY7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0FQU0RfQ1RSTCwgdmFsdWU4KTsJLyogMHg0MCAqLwotCi0JLyogIFNldCBCQiByZXNldCBhdCBmaXJzdCAqLwotCXZhbHVlOCA9IEZFTl9VU0JEIHwgRkVOX1VTQkEgfCBGRU5fQkJfR0xCX1JTVG47Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOLCB2YWx1ZTgpOwkvKiAweDE2ICovCi0KLQkvKiAgU2V0IGdsb2JhbCByZXNldC4gKi8KLQl2YWx1ZTggJj0gfkZFTl9CQl9HTEJfUlNUbjsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4sIHZhbHVlOCk7CS8qIDB4MTQgKi8KLQotCS8qICAyMDEwLzA4LzEyIE1IIFdlIG5lZWQgdG8gc2V0IEJCL0dMQkFMIHJlc2V0IHRvIHNhdmUgcG93ZXIKLQkgICAgZm9yIFNTIG1vZGUuICovCi19Ci0KLXN0YXRpYyB2b2lkIF9SZXNldERpZ2l0YWxQcm9jZWR1cmUxXzkyQyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQlib29sIGJXaXRob3V0SFdTTSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChJU19GV184MXh4QyhwYWRhcHRlcikgJiYgKHBIYWxEYXRhLT5GaXJtd2FyZVZlcnNpb24gPD0gMHgyMCkpIHsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlmLglNQ1VGV0RMIDB4ODBbNzowXT0gMAkJcmVzZXQgTUNVIHJlYWR5IHN0YXR1cwotCWcuCVNZU19GVU5DX0VOIDB4MDJbMTBdPSAwCQlyZXNldCBNQ1UgcmVnaXN0ZXIsICg4MDUxIHJlc2V0KQotCWguCVNZU19GVU5DX0VOIDB4MDJbMTUtMTJdPSA1CXJlc2V0IE1BQyByZWdpc3RlciwgRENPUkUKLQlpLiAgICAgU1lTX0ZVTkNfRU4gMHgwMlsxMF09IDEJCWVuYWJsZSBNQ1UgcmVnaXN0ZXIsCi0JCQkJCQkoODA1MSBlbmFibGUpCi0JKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQl1MTYgdmFsdTE2OwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfTUNVRldETCwgMCk7Ci0KLQkJdmFsdTE2ID0gcnRsODcyM2F1X3JlYWQxNihwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOKTsKLQkJLyogcmVzZXQgTUNVICwgODA1MSAqLwotCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOLAotCQkJCSAgdmFsdTE2ICYgfkZFTl9DUFVFTik7Ci0KLQkJdmFsdTE2ID0gcnRsODcyM2F1X3JlYWQxNihwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOKSAmIDB4MEZGRjsKLQkJLyogcmVzZXQgTUFDICovCi0JCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4sCi0JCQkJICB2YWx1MTYgfCBGRU5fSFdQRE4gfCBGRU5fRUxEUik7Ci0KLQkJdmFsdTE2ID0gcnRsODcyM2F1X3JlYWQxNihwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOKTsKLQkJLyogZW5hYmxlIE1DVSAsIDgwNTEgKi8KLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTiwKLQkJCQkgIHZhbHUxNiB8IEZFTl9DUFVFTik7Ci0JfSBlbHNlIHsKLQkJdTggcmV0cnlfY250cyA9IDA7Ci0JCXU4IHZhbDg7Ci0KLQkJdmFsOCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX01DVUZXREwpOwotCi0JCS8qICAyMDEwLzA4LzEyIE1IIEZvciBVU0IgU1MsIHdlIGNhbiBub3Qgc3RvcCA4MDUxIHdoZW4gd2UKLQkJICAgIGFyZSB0cnlpbmcgdG8gZW50ZXIgSVBTL0hXJlNXIHJhZGlvIG9mZi4gRm9yCi0JCSAgICBTMy9TNC9TNS9EaXNhYmxlLCB3ZSBjYW4gc3RvcCA4MDUxIGJlY2F1c2UgKi8KLQkJLyogIHdlIHdpbGwgaW5pdCBGVyB3aGVuIHBvd2VyIG9uIGFnYWluLiAqLwotCQkvKiAgSWYgd2Ugd2FudCB0byBTUyBtb2RlLCB3ZSBjYW4gbm90IHJlc2V0IDgwNTEuICovCi0JCWlmICgodmFsOCAmIEJJVCgxKSkgJiYgcGFkYXB0ZXItPmJGV1JlYWR5KSB7Ci0JCQkvKiBJRiBmdyBpbiBSQU0gY29kZSwgZG8gcmVzZXQgKi8KLQkJCS8qICAyMDEwLzA4LzI1IE1IIEFjY29yZGluZyB0byBSRCBhbGZyZWQncwotCQkJICAgIHN1Z2dlc3Rpb24sIHdlIG5lZWQgdG8gZGlzYWJsZSBvdGhlciAqLwotCQkJLyogIEhSQ1YgSU5UIHRvIGluZmx1ZW5jZSA4MDUxIHJlc2V0LiAqLwotCQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0ZXSU1SLCAweDIwKTsKLQkJCS8qICAyMDExLzAyLzE1IE1IIEFjY29yZGluZyB0byBBbGV4J3MKLQkJCSAgICBzdWdnZXN0aW9uLCBjbG9zZSBtYXNrIHRvIHByZXZlbnQKLQkJCSAgICBpbmNvcnJlY3QgRlcgd3JpdGUgb3BlcmF0aW9uLiAqLwotCQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0ZUSU1SLCAweDAwKTsKLQkJCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19GU0lNUiwgMHgwMCk7Ci0KLQkJCS8qIDgwNTEgcmVzZXQgYnkgc2VsZiAqLwotCQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0hNRVRGUiArIDMsIDB4MjApOwotCi0JCQl3aGlsZSAoKHJldHJ5X2NudHMrKyA8IDEwMCkgJiYKLQkJCSAgICAgICAocnRsODcyM2F1X3JlYWQxNihwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOKSAmCi0JCQkJRkVOX0NQVUVOKSkgewotCQkJCXVkZWxheSg1MCk7CS8qIHVzICovCi0JCQl9Ci0KLQkJCWlmIChyZXRyeV9jbnRzID49IDEwMCkgewotCQkJCS8qIFJlc2V0IE1BQyBhbmQgRW5hYmxlIDgwNTEgKi8KLQkJCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLAotCQkJCQkJIFJFR19TWVNfRlVOQ19FTiArIDEsIDB4NTApOwotCQkJCW1kZWxheSgxMCk7Ci0JCQl9Ci0JCX0KLQkJLyogUmVzZXQgTUFDIGFuZCBFbmFibGUgODA1MSAqLwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4gKyAxLCAweDU0KTsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX01DVUZXREwsIDApOwotCX0KLQotCWlmIChiV2l0aG91dEhXU00pIHsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJV2l0aG91dCBIVyBhdXRvIHN0YXRlIG1hY2hpbmUKLQlnLglTWVNfQ0xLUiAweDA4WzE1OjBdID0gMHgzMEEzCQlkaXNhYmxlIE1BQyBjbG9jawotCWguCUFGRV9QTExfQ1RSTCAweDI4Wzc6MF0gPSAweDgwCQlkaXNhYmxlIEFGRSBQTEwKLQlpLglBRkVfWFRBTF9DVFJMIDB4MjRbMTU6MF0gPSAweDg4MEYJZ2F0ZWQgQUZFIERJR19DTE9DSwotCWouCVNZU19JU09fQ1RSTCAweDAwWzc6MF0gPSAweEY5CQlpc29sYXRlZCBkaWdpdGFsIHRvIFBPTgotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJLyogbW9kaWZ5IHRvIDB4NzBBMyBieSBTY290dC4gKi8KLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19TWVNfQ0xLUiwgMHg3MEEzKTsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0FGRV9QTExfQ1RSTCwgMHg4MCk7Ci0JCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfQUZFX1hUQUxfQ1RSTCwgMHg4ODBGKTsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1NZU19JU09fQ1RSTCwgMHhGOSk7Ci0JfSBlbHNlIHsKLQkJLyogIERpc2FibGUgYWxsIFJGL0JCIHBvd2VyICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19SRl9DVFJMLCAweDAwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9SZXNldERpZ2l0YWxQcm9jZWR1cmUyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLWsuCVNZU19GVU5DX0VOIDB4MDNbNzowXSA9IDB4NDQJCWRpc2FibGUgRUxEUiBydW5jdGlvbgotbC4JU1lTX0NMS1IgMHgwOFsxNTowXSA9IDB4MzA4MwkJZGlzYWJsZSBFTERSIGNsb2NrCi1tLglTWVNfSVNPX0NUUkwgMHgwMVs3OjBdID0gMHg4MwkJaXNvbGF0ZWQgRUxEUiB0byBQT04KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvKiBtb2RpZnkgdG8gMHg3MGEzIGJ5IFNjb3R0LiAqLwotCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfU1lTX0NMS1IsIDB4NzBhMyk7Ci0JLyogbW9kaWZ5IHRvIDB4ODIgYnkgU2NvdHQuICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1NZU19JU09fQ1RSTCArIDEsIDB4ODIpOwotfQotCi1zdGF0aWMgdm9pZCBfRGlzYWJsZUFuYWxvZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBib29sIGJXaXRob3V0SFdTTSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1MTYgdmFsdWUxNjsKLQl1OCB2YWx1ZTg7Ci0KLQlpZiAoYldpdGhvdXRIV1NNKSB7Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0Jbi4JTERPQTE1X0NUUkwgMHgyMFs3OjBdID0gMHgwNAlkaXNhYmxlIEExNSBwb3dlcgotCW8uCUxET1YxMkRfQ1RSTCAweDIxWzc6MF0gPSAweDU0CWRpc2FibGUgZGlnaXRhbCBjb3JlIHBvd2VyCi0Jci4JV2hlbiBkcml2ZXIgY2FsbCBkaXNhYmxlLCB0aGUgQVNJQyB3aWxsIHR1cm4gb2ZmIHJlbWFpbmluZwotCQljbG9jayBhdXRvbWF0aWNhbGx5Ci0JKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19MRE9BMTVfQ1RSTCwgMHgwNCk7Ci0JCS8qIHJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19MRE9WMTJEX0NUUkwsIDB4NTQpOyAqLwotCi0JCXZhbHVlOCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX0xET1YxMkRfQ1RSTCk7Ci0JCXZhbHVlOCAmPSB+TERWMTJfRU47Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19MRE9WMTJEX0NUUkwsIHZhbHVlOCk7Ci0JfQotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JaC4JU1BTMF9DVFJMIDB4MTFbNzowXSA9IDB4MjMJCWVudGVyIFBGTSBtb2RlCi0JaS4JQVBTX0ZTTUNPIDB4MDRbMTU6MF0gPSAweDQ4MDIJCXNldCBVU0Igc3VzcGVuZAotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl2YWx1ZTggPSAweDIzOwotCWlmIChJU184MXh4Q19WRU5ET1JfVU1DX0JfQ1VUKHBIYWxEYXRhLT5WZXJzaW9uSUQpKQotCQl2YWx1ZTggfD0gQklUKDMpOwotCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1NQUzBfQ1RSTCwgdmFsdWU4KTsKLQotCWlmIChiV2l0aG91dEhXU00pIHsKLQkJLyogdmFsdWUxNiB8PSAoQVBETV9IT1NUIHwgRlNNX0hTVVMgfC9QRk1fQUxETik7ICovCi0JCS8qICAyMDEwLzA4LzMxIEFjY29yZGluZyB0byBGaWxlbiBkZXNjcmlwdGlvbiwgd2UgbmVlZCB0bwotCQkgICAgdXNlIEhXIHRvIHNodXQgZG93biA4MDUxIGF1dG9tYXRpY2FsbHkuICovCi0JCS8qICBCZWNhdXNlIHN1c3BlbmQgb3BlcmF0aW9uIG5lZWQgdGhlIGFzaXN0YW5jZSBvZiA4MDUxCi0JCSAgICB0byB3YWl0IGZvciAzbXMuICovCi0JCXZhbHVlMTYgPSBBUERNX0hPU1QgfCBBRlNNX0hTVVMgfCBQRk1fQUxETjsKLQl9IGVsc2UgewotCQl2YWx1ZTE2ID0gQVBETV9IT1NUIHwgQUZTTV9IU1VTIHwgUEZNX0FMRE47Ci0JfQotCi0JcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19BUFNfRlNNQ08sIHZhbHVlMTYpOwkvKiAweDQ4MDIgKi8KLQotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19SU1ZfQ1RSTCwgMHgwZSk7Ci19Ci0KLS8qICBIVyBBdXRvIHN0YXRlIG1hY2hpbmUgKi8KLWludCBDYXJkRGlzYWJsZUhXU00oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggcmVzZXRNQ1UpCi17Ci0JaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQkvKiAgUkYgT2ZmIFNlcXVlbmNlID09PT0gKi8KLQlfRGlzYWJsZVJGQUZFQW5kUmVzZXRCQjgxOTJDKHBhZGFwdGVyKTsKLQotCS8qICAgPT09PSBSZXNldCBkaWdpdGFsIHNlcXVlbmNlICAgPT09PT09ICovCi0JX1Jlc2V0RGlnaXRhbFByb2NlZHVyZTFfOTJDKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQkvKiAgID09PT0gUHVsbCBHUElPIFBJTiB0byBiYWxhbmNlIGxldmVsIGFuZCBMRUQgY29udHJvbCA9PT09PT0gKi8KLQlfRGlzYWJsZUdQSU8ocGFkYXB0ZXIpOwotCi0JLyogICA9PT09IERpc2FibGUgYW5hbG9nIHNlcXVlbmNlID09PSAqLwotCV9EaXNhYmxlQW5hbG9nKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICI9PT09PT0+IENhcmQgZGlzYWJsZSBmaW5pc2hlZC5cbiIpOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi0vKiAgd2l0aG91dCBIVyBBdXRvIHN0YXRlIG1hY2hpbmUgKi8KLWludCBDYXJkRGlzYWJsZVdpdGhvdXRIV1NNKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQkvKiAgUkYgT2ZmIFNlcXVlbmNlID09PT0gKi8KLQlfRGlzYWJsZVJGQUZFQW5kUmVzZXRCQjgxOTJDKHBhZGFwdGVyKTsKLQotCS8qICAgPT09PSBSZXNldCBkaWdpdGFsIHNlcXVlbmNlICAgPT09PT09ICovCi0JX1Jlc2V0RGlnaXRhbFByb2NlZHVyZTFfOTJDKHBhZGFwdGVyLCB0cnVlKTsKLQotCS8qICAgPT09PSBQdWxsIEdQSU8gUElOIHRvIGJhbGFuY2UgbGV2ZWwgYW5kIExFRCBjb250cm9sID09PT09PSAqLwotCV9EaXNhYmxlR1BJTyhwYWRhcHRlcik7Ci0KLQkvKiAgID09PT0gUmVzZXQgZGlnaXRhbCBzZXF1ZW5jZSAgID09PT09PSAqLwotCV9SZXNldERpZ2l0YWxQcm9jZWR1cmUyKHBhZGFwdGVyKTsKLQotCS8qICAgPT09PSBEaXNhYmxlIGFuYWxvZyBzZXF1ZW5jZSA9PT0gKi8KLQlfRGlzYWJsZUFuYWxvZyhwYWRhcHRlciwgdHJ1ZSk7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXZvaWQgSGFsX0luaXRQR0RhdGEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKlBST01Db250ZW50KQotewotCXN0cnVjdCBlZXByb21fcHJpdiAqcEVFUFJPTSA9IEdFVF9FRVBST01fRUZVU0VfUFJJVihwYWRhcHRlcik7Ci0KLQlpZiAoIXBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpIHsJLyogIGF1dG9sb2FkIE9LLiAqLwotCQlpZiAoIXBFRVBST00tPkVlcHJvbU9yRWZ1c2UpIHsKLQkJCS8qICBSZWFkIEVGVVNFIHJlYWwgbWFwIHRvIHNoYWRvdy4gKi8KLQkJCUVGVVNFX1NoYWRvd01hcFVwZGF0ZTIzYShwYWRhcHRlciwgRUZVU0VfV0lGSSk7Ci0JCQltZW1jcHkoUFJPTUNvbnRlbnQsIHBFRVBST00tPmVmdXNlX2VlcHJvbV9kYXRhLAotCQkJICAgICAgIEhXU0VUX01BWF9TSVpFKTsKLQkJfQotCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkgIkF1dG9Mb2FkIEZhaWwgcmVwb3J0ZWQgZnJvbSBDUjkzNDYhIVxuIik7Ci0JCS8qIHVwZGF0ZSB0byBkZWZhdWx0IHZhbHVlIDB4RkYgKi8KLQkJaWYgKCFwRUVQUk9NLT5FZXByb21PckVmdXNlKQotCQkJRUZVU0VfU2hhZG93TWFwVXBkYXRlMjNhKHBhZGFwdGVyLCBFRlVTRV9XSUZJKTsKLQkJbWVtY3B5KFBST01Db250ZW50LCBwRUVQUk9NLT5lZnVzZV9lZXByb21fZGF0YSwKLQkJICAgICAgIEhXU0VUX01BWF9TSVpFKTsKLQl9Ci19Ci0KLXZvaWQgSGFsX0VmdXNlUGFyc2VJRENvZGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmh3aW5mbykKLXsKLQlzdHJ1Y3QgZWVwcm9tX3ByaXYgKnBFRVBST00gPSBHRVRfRUVQUk9NX0VGVVNFX1BSSVYocGFkYXB0ZXIpOwotLyoJc3RydWN0IGhhbF9kYXRhXzg3MjNhCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7ICovCi0JdTE2IEVFUFJPTUlkOwotCi0JLyogIENoZWNsIDB4ODEyOSBhZ2FpbiBmb3IgbWFraW5nIHN1cmUgYXV0b2xvYWQgc3RhdHVzISEgKi8KLQlFRVBST01JZCA9IGxlMTZfdG9fY3B1KCooKF9fbGUxNiAqKSBod2luZm8pKTsKLQlpZiAoRUVQUk9NSWQgIT0gUlRMX0VFUFJPTV9JRCkgewotCQlEQkdfODcyM0EoIkVFUFJPTSBJRCglI3gpIGlzIGludmFsaWQhIVxuIiwgRUVQUk9NSWQpOwotCQlwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnID0gdHJ1ZTsKLQl9IGVsc2UgewotCQlwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnID0gZmFsc2U7Ci0JfQotCi0JUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICJFRVBST00gSUQgPSAweCUwNHhcbiIsIEVFUFJPTUlkKTsKLX0KLQotc3RhdGljIHZvaWQKLUhhbF9SZWFkUG93ZXJWYWx1ZUZyb21QUk9NXzg3MjNBKHN0cnVjdCB0eHBvd2VyaW5mbyAqcHdySW5mbywKLQkJCQkgdTggKlBST01Db250ZW50LCBib29sIEF1dG9Mb2FkRmFpbCkKLXsKLQl1MzIgcmZQYXRoLCBlZUFkZHIsIGdyb3VwLCByZlBhdGhNYXggPSAxOwotCi0JbWVtc2V0KHB3ckluZm8sIDAsIHNpemVvZigqcHdySW5mbykpOwotCi0JaWYgKEF1dG9Mb2FkRmFpbCkgewotCQlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBNQVhfQ0hOTF9HUk9VUDsgZ3JvdXArKykgewotCQkJZm9yIChyZlBhdGggPSAwOyByZlBhdGggPCByZlBhdGhNYXg7IHJmUGF0aCsrKSB7Ci0JCQkJcHdySW5mby0+Q0NLSW5kZXhbcmZQYXRoXVtncm91cF0gPQotCQkJCQlFRVBST01fRGVmYXVsdF9UeFBvd2VyTGV2ZWw7Ci0JCQkJcHdySW5mby0+SFQ0MF8xU0luZGV4W3JmUGF0aF1bZ3JvdXBdID0KLQkJCQkJRUVQUk9NX0RlZmF1bHRfVHhQb3dlckxldmVsOwotCQkJCXB3ckluZm8tPkhUNDBfMlNJbmRleERpZmZbcmZQYXRoXVtncm91cF0gPQotCQkJCQlFRVBST01fRGVmYXVsdF9IVDQwXzJTRGlmZjsKLQkJCQlwd3JJbmZvLT5IVDIwSW5kZXhEaWZmW3JmUGF0aF1bZ3JvdXBdID0KLQkJCQkJRUVQUk9NX0RlZmF1bHRfSFQyMF9EaWZmOwotCQkJCXB3ckluZm8tPk9GRE1JbmRleERpZmZbcmZQYXRoXVtncm91cF0gPQotCQkJCQlFRVBST01fRGVmYXVsdF9MZWdhY3lIVFR4UG93ZXJEaWZmOwotCQkJCXB3ckluZm8tPkhUNDBNYXhPZmZzZXRbcmZQYXRoXVtncm91cF0gPQotCQkJCQlFRVBST01fRGVmYXVsdF9IVDQwX1B3ck1heE9mZnNldDsKLQkJCQlwd3JJbmZvLT5IVDIwTWF4T2Zmc2V0W3JmUGF0aF1bZ3JvdXBdID0KLQkJCQkJRUVQUk9NX0RlZmF1bHRfSFQyMF9Qd3JNYXhPZmZzZXQ7Ci0JCQl9Ci0JCX0KLQkJcHdySW5mby0+VFNTSV9BWzBdID0gRUVQUk9NX0RlZmF1bHRfVFNTSTsKLQkJcmV0dXJuOwotCX0KLQotCWZvciAocmZQYXRoID0gMDsgcmZQYXRoIDwgcmZQYXRoTWF4OyByZlBhdGgrKykgewotCQlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBNQVhfQ0hOTF9HUk9VUDsgZ3JvdXArKykgewotCQkJZWVBZGRyID0KLQkJCSAgICBFRVBST01fQ0NLX1RYX1BXUl9JTlhfODcyM0EgKyAocmZQYXRoICogMykgKyBncm91cDsKLQotCQkJcHdySW5mby0+Q0NLSW5kZXhbcmZQYXRoXVtncm91cF0gPSBQUk9NQ29udGVudFtlZUFkZHJdOwotCQkJaWYgKHB3ckluZm8tPkNDS0luZGV4W3JmUGF0aF1bZ3JvdXBdID4gNjMpCi0JCQkJcHdySW5mby0+Q0NLSW5kZXhbcmZQYXRoXVtncm91cF0gPQotCQkJCQlFRVBST01fRGVmYXVsdF9UeFBvd2VyTGV2ZWw7Ci0KLQkJCWVlQWRkciA9IEVFUFJPTV9IVDQwXzFTX1RYX1BXUl9JTlhfODcyM0EgKwotCQkJCShyZlBhdGggKiAzKSArIGdyb3VwOwotCQkJcHdySW5mby0+SFQ0MF8xU0luZGV4W3JmUGF0aF1bZ3JvdXBdID0KLQkJCQlQUk9NQ29udGVudFtlZUFkZHJdOwotCQkJaWYgKHB3ckluZm8tPkhUNDBfMVNJbmRleFtyZlBhdGhdW2dyb3VwXSA+IDYzKQotCQkJCXB3ckluZm8tPkhUNDBfMVNJbmRleFtyZlBhdGhdW2dyb3VwXSA9Ci0JCQkJCUVFUFJPTV9EZWZhdWx0X1R4UG93ZXJMZXZlbDsKLQkJfQotCX0KLQotCWZvciAoZ3JvdXAgPSAwOyBncm91cCA8IE1BWF9DSE5MX0dST1VQOyBncm91cCsrKSB7Ci0JCWZvciAocmZQYXRoID0gMDsgcmZQYXRoIDwgcmZQYXRoTWF4OyByZlBhdGgrKykgewotCQkJcHdySW5mby0+SFQ0MF8yU0luZGV4RGlmZltyZlBhdGhdW2dyb3VwXSA9IDA7Ci0JCQlwd3JJbmZvLT5IVDIwSW5kZXhEaWZmW3JmUGF0aF1bZ3JvdXBdID0KLQkJCQkoUFJPTUNvbnRlbnQKLQkJCQkgW0VFUFJPTV9IVDIwX1RYX1BXUl9JTlhfRElGRl84NzIzQSArCi0JCQkJICBncm91cF0gPj4gKHJmUGF0aCAqIDQpKSAmIDB4RjsKLQkJCS8qIDRiaXQgc2lnbiBudW1iZXIgdG8gOCBiaXQgc2lnbiBudW1iZXIgKi8KLQkJCWlmIChwd3JJbmZvLT5IVDIwSW5kZXhEaWZmW3JmUGF0aF1bZ3JvdXBdICYgQklUKDMpKQotCQkJCXB3ckluZm8tPkhUMjBJbmRleERpZmZbcmZQYXRoXVtncm91cF0gfD0gMHhGMDsKLQotCQkJcHdySW5mby0+T0ZETUluZGV4RGlmZltyZlBhdGhdW2dyb3VwXSA9Ci0JCQkJKFBST01Db250ZW50W0VFUFJPTV9PRkRNX1RYX1BXUl9JTlhfRElGRl84NzIzQSArCi0JCQkJCSAgICAgZ3JvdXBdID4+IChyZlBhdGggKiA0KSkgJiAweEY7Ci0KLQkJCXB3ckluZm8tPkhUNDBNYXhPZmZzZXRbcmZQYXRoXVtncm91cF0gPQotCQkJCShQUk9NQ29udGVudFtFRVBST01fSFQ0MF9NQVhfUFdSX09GRlNFVF84NzIzQSArCi0JCQkJCSAgICAgZ3JvdXBdID4+IChyZlBhdGggKiA0KSkgJiAweEY7Ci0KLQkJCXB3ckluZm8tPkhUMjBNYXhPZmZzZXRbcmZQYXRoXVtncm91cF0gPQotCQkJCShQUk9NQ29udGVudFtFRVBST01fSFQyMF9NQVhfUFdSX09GRlNFVF84NzIzQSArCi0JCQkJCSAgICAgZ3JvdXBdID4+IChyZlBhdGggKiA0KSkgJiAweEY7Ci0JCX0KLQl9Ci0KLQlwd3JJbmZvLT5UU1NJX0FbMF0gPSBQUk9NQ29udGVudFtFRVBST01fVFNTSV9BXzg3MjNBXTsKLX0KLQotc3RhdGljIHU4IEhhbF9HZXRDaG5sR3JvdXAodTggY2hubCkKLXsKLQl1OCBncm91cCA9IDA7Ci0KLQlpZiAoY2hubCA8IDMpCQkvKiAgQ2phbmVsIDEtMyAqLwotCQlncm91cCA9IDA7Ci0JZWxzZSBpZiAoY2hubCA8IDkpCS8qICBDaGFubmVsIDQtOSAqLwotCQlncm91cCA9IDE7Ci0JZWxzZQkJCS8qICBDaGFubmVsIDEwLTE0ICovCi0JCWdyb3VwID0gMjsKLQotCXJldHVybiBncm91cDsKLX0KLQotdm9pZAotSGFsX0VmdXNlUGFyc2V0eHBvd2VyaW5mb184NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCXU4ICpQUk9NQ29udGVudCwgYm9vbCBBdXRvTG9hZEZhaWwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IHR4cG93ZXJpbmZvIHB3ckluZm87Ci0JdTggcmZQYXRoLCBjaCwgZ3JvdXAsIHJmUGF0aE1heCA9IDE7Ci0JdTggcHdyLCBkaWZmOwotCi0JSGFsX1JlYWRQb3dlclZhbHVlRnJvbVBST01fODcyM0EoJnB3ckluZm8sIFBST01Db250ZW50LCBBdXRvTG9hZEZhaWwpOwotCWZvciAocmZQYXRoID0gMDsgcmZQYXRoIDwgcmZQYXRoTWF4OyByZlBhdGgrKykgewotCQlmb3IgKGNoID0gMDsgY2ggPCBDSEFOTkVMX01BWF9OVU1CRVI7IGNoKyspIHsKLQkJCWdyb3VwID0gSGFsX0dldENobmxHcm91cChjaCk7Ci0KLQkJCXBIYWxEYXRhLT5UeFB3ckxldmVsQ2NrW3JmUGF0aF1bY2hdID0KLQkJCQlwd3JJbmZvLkNDS0luZGV4W3JmUGF0aF1bZ3JvdXBdOwotCQkJcEhhbERhdGEtPlR4UHdyTGV2ZWxIVDQwXzFTW3JmUGF0aF1bY2hdID0KLQkJCQlwd3JJbmZvLkhUNDBfMVNJbmRleFtyZlBhdGhdW2dyb3VwXTsKLQotCQkJcEhhbERhdGEtPlR4UHdySHQyMERpZmZbcmZQYXRoXVtjaF0gPQotCQkJCXB3ckluZm8uSFQyMEluZGV4RGlmZltyZlBhdGhdW2dyb3VwXTsKLQkJCXBIYWxEYXRhLT5UeFB3ckxlZ2FjeUh0RGlmZltyZlBhdGhdW2NoXSA9Ci0JCQkJcHdySW5mby5PRkRNSW5kZXhEaWZmW3JmUGF0aF1bZ3JvdXBdOwotCQkJcEhhbERhdGEtPlB3ckdyb3VwSFQyMFtyZlBhdGhdW2NoXSA9Ci0JCQkJcHdySW5mby5IVDIwTWF4T2Zmc2V0W3JmUGF0aF1bZ3JvdXBdOwotCQkJcEhhbERhdGEtPlB3ckdyb3VwSFQ0MFtyZlBhdGhdW2NoXSA9Ci0JCQkJcHdySW5mby5IVDQwTWF4T2Zmc2V0W3JmUGF0aF1bZ3JvdXBdOwotCi0JCQlwd3IgPSBwd3JJbmZvLkhUNDBfMVNJbmRleFtyZlBhdGhdW2dyb3VwXTsKLQkJCWRpZmYgPSBwd3JJbmZvLkhUNDBfMlNJbmRleERpZmZbcmZQYXRoXVtncm91cF07Ci0KLQkJCXBIYWxEYXRhLT5UeFB3ckxldmVsSFQ0MF8yU1tyZlBhdGhdW2NoXSA9Ci0JCQkgICAgKHB3ciA+IGRpZmYpID8gKHB3ciAtIGRpZmYpIDogMDsKLQkJfQotCX0KLQlmb3IgKHJmUGF0aCA9IDA7IHJmUGF0aCA8IFJGX1BBVEhfTUFYOyByZlBhdGgrKykgewotCQlmb3IgKGNoID0gMDsgY2ggPCBDSEFOTkVMX01BWF9OVU1CRVI7IGNoKyspIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiUkYoJXUpLUNoKCV1KSBbQ0NLIC8gSFQ0MF8xUyAvIEhUNDBfMlNdID0gWzB4JXggLyAweCV4IC8gMHgleF1cbiIsCi0JCQkJIHJmUGF0aCwgY2gsCi0JCQkJIHBIYWxEYXRhLT5UeFB3ckxldmVsQ2NrW3JmUGF0aF1bY2hdLAotCQkJCSBwSGFsRGF0YS0+VHhQd3JMZXZlbEhUNDBfMVNbcmZQYXRoXVtjaF0sCi0JCQkJIHBIYWxEYXRhLT5UeFB3ckxldmVsSFQ0MF8yU1tyZlBhdGhdW2NoXSk7Ci0KLQkJfQotCX0KLQlmb3IgKGNoID0gMDsgY2ggPCBDSEFOTkVMX01BWF9OVU1CRVI7IGNoKyspIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgIlJGLUEgSHQyMCB0byBIVDQwIERpZmZbJXVdID0gMHgleCglZClcbiIsIGNoLAotCQkJIHBIYWxEYXRhLT5UeFB3ckh0MjBEaWZmW1JGX1BBVEhfQV1bY2hdLAotCQkJIHBIYWxEYXRhLT5UeFB3ckh0MjBEaWZmW1JGX1BBVEhfQV1bY2hdKTsKLQl9Ci0JZm9yIChjaCA9IDA7IGNoIDwgQ0hBTk5FTF9NQVhfTlVNQkVSOyBjaCsrKQotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAiUkYtQSBMZWdhY3kgdG8gSHQ0MCBEaWZmWyV1XSA9IDB4JXhcbiIsIGNoLAotCQkJIHBIYWxEYXRhLT5UeFB3ckxlZ2FjeUh0RGlmZltSRl9QQVRIX0FdW2NoXSk7Ci0JZm9yIChjaCA9IDA7IGNoIDwgQ0hBTk5FTF9NQVhfTlVNQkVSOyBjaCsrKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJSRi1CIEh0MjAgdG8gSFQ0MCBEaWZmWyV1XSA9IDB4JXgoJWQpXG4iLCBjaCwKLQkJCSBwSGFsRGF0YS0+VHhQd3JIdDIwRGlmZltSRl9QQVRIX0JdW2NoXSwKLQkJCSBwSGFsRGF0YS0+VHhQd3JIdDIwRGlmZltSRl9QQVRIX0JdW2NoXSk7Ci0JfQotCWZvciAoY2ggPSAwOyBjaCA8IENIQU5ORUxfTUFYX05VTUJFUjsgY2grKykKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgIlJGLUIgTGVnYWN5IHRvIEhUNDAgRGlmZlsldV0gPSAweCV4XG4iLCBjaCwKLQkJCSBwSGFsRGF0YS0+VHhQd3JMZWdhY3lIdERpZmZbUkZfUEFUSF9CXVtjaF0pOwotCWlmICghQXV0b0xvYWRGYWlsKSB7Ci0JCXN0cnVjdCByZWdpc3RyeV9wcml2ICpyZWdpc3RyeV9wYXIgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQkJaWYgKHJlZ2lzdHJ5X3Bhci0+cmVndWxhdG9yeV90aWQgPT0gMHhmZikgewotCQkJaWYgKFBST01Db250ZW50W1JGX09QVElPTjFfODcyM0FdID09IDB4ZmYpCi0JCQkJcEhhbERhdGEtPkVFUFJPTVJlZ3VsYXRvcnkgPSAwOwotCQkJZWxzZQotCQkJCXBIYWxEYXRhLT5FRVBST01SZWd1bGF0b3J5ID0KLQkJCQkJUFJPTUNvbnRlbnRbUkZfT1BUSU9OMV84NzIzQV0gJiAweDc7Ci0JCX0gZWxzZSB7Ci0JCQlwSGFsRGF0YS0+RUVQUk9NUmVndWxhdG9yeSA9Ci0JCQkgICAgcmVnaXN0cnlfcGFyLT5yZWd1bGF0b3J5X3RpZDsKLQkJfQotCX0gZWxzZSB7Ci0JCXBIYWxEYXRhLT5FRVBST01SZWd1bGF0b3J5ID0gMDsKLQl9Ci0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiRUVQUk9NUmVndWxhdG9yeSA9IDB4JXhcbiIsIHBIYWxEYXRhLT5FRVBST01SZWd1bGF0b3J5KTsKLQotCWlmICghQXV0b0xvYWRGYWlsKQotCQlwSGFsRGF0YS0+YlRYUG93ZXJEYXRhUmVhZEZyb21FRVBPUk0gPSB0cnVlOwotfQotCi12b2lkCi1IYWxfRWZ1c2VQYXJzZUJUQ29leGlzdEluZm9fODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXU4IHRlbXB2YWw7Ci0JdTMyIHRtcHU0OwotCi0JaWYgKCFBdXRvTG9hZEZhaWwpIHsKLQkJdG1wdTQgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfTVVMVElfRlVOQ19DVFJMKTsKLQkJaWYgKHRtcHU0ICYgQlRfRlVOQ19FTikKLQkJCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhDb2V4aXN0ID0gMTsKLQkJZWxzZQotCQkJcEhhbERhdGEtPkVFUFJPTUJsdWV0b290aENvZXhpc3QgPSAwOwotCQlwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoVHlwZSA9IEJUX1JUTDg3MjNBOwotCi0JCS8qICBUaGUgZm9sbG93aW5nIG5lZWQgdG8gYmUgY2hlY2tlZCB3aXRoIG5ld2VyIHZlcnNpb24gb2YgKi8KLQkJLyogIGVlcHJvbSBzcGVjICovCi0JCXRlbXB2YWwgPSBod2luZm9bUkZfT1BUSU9ONF84NzIzQV07Ci0JCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhBbnROdW0gPSAodGVtcHZhbCAmIDB4MSk7Ci0JCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhBbnRJc29sYXRpb24gPSAodGVtcHZhbCAmIDB4MTApID4+IDQ7Ci0JCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhSYWRpb1NoYXJlZCA9ICh0ZW1wdmFsICYgMHgyMCkgPj4gNTsKLQl9IGVsc2UgewotCQlwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoQ29leGlzdCA9IDA7Ci0JCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhUeXBlID0gQlRfUlRMODcyM0E7Ci0JCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhBbnROdW0gPSBBbnRfeDI7Ci0JCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhBbnRJc29sYXRpb24gPSAwOwotCQlwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoUmFkaW9TaGFyZWQgPSBCVF9SYWRpb19TaGFyZWQ7Ci0JfQotCi0JcnRsODcyM2FfQlRfaW5pdF9oYWxfdmFycyhwYWRhcHRlcik7Ci19Ci0KLXZvaWQKLUhhbF9FZnVzZVBhcnNlRUVQUk9NVmVyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQl1OCAqaHdpbmZvLCBib29sIEF1dG9Mb2FkRmFpbCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmICghQXV0b0xvYWRGYWlsKQotCQlwSGFsRGF0YS0+RUVQUk9NVmVyc2lvbiA9IGh3aW5mb1tFRVBST01fVkVSU0lPTl84NzIzQV07Ci0JZWxzZQotCQlwSGFsRGF0YS0+RUVQUk9NVmVyc2lvbiA9IDE7Ci0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiSGFsX0VmdXNlUGFyc2VFRVBST01WZXIoKSwgRUVWZXIgPSAlZFxuIiwKLQkJIHBIYWxEYXRhLT5FRVBST01WZXJzaW9uKTsKLX0KLQotdm9pZAotcnRsODcyM2FfRWZ1c2VQYXJzZUNobmxQbGFuKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpCi17Ci0JcGFkYXB0ZXItPm1sbWVwcml2LkNoYW5uZWxQbGFuID0KLQkJaGFsX2NvbV9nZXRfY2hhbm5lbF9wbGFuMjNhKHBhZGFwdGVyLCBod2luZm8gPwotCQkJCQkgaHdpbmZvW0VFUFJPTV9DaGFubmVsUGxhbl84NzIzQV06MHhGRiwKLQkJCQkJIHBhZGFwdGVyLT5yZWdpc3RyeXByaXYuY2hhbm5lbF9wbGFuLAotCQkJCQkgUlRfQ0hBTk5FTF9ET01BSU5fV09STERfV0lERV8xMywKLQkJCQkJIEF1dG9Mb2FkRmFpbCk7Ci0KLQlEQkdfODcyM0EoIm1sbWVwcml2LkNoYW5uZWxQbGFuID0gMHglMDJ4XG4iLAotCQkgIHBhZGFwdGVyLT5tbG1lcHJpdi5DaGFubmVsUGxhbik7Ci19Ci0KLXZvaWQKLUhhbF9FZnVzZVBhcnNlQ3VzdG9tZXJJRChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JaWYgKCFBdXRvTG9hZEZhaWwpIHsKLQkJcEhhbERhdGEtPkVFUFJPTUN1c3RvbWVySUQgPSBod2luZm9bRUVQUk9NX0N1c3RvbUlEXzg3MjNBXTsKLQkJcEhhbERhdGEtPkVFUFJPTVN1YkN1c3RvbWVySUQgPQotCQkgICAgaHdpbmZvW0VFUFJPTV9TdWJDdXN0b21JRF84NzIzQV07Ci0JfSBlbHNlIHsKLQkJcEhhbERhdGEtPkVFUFJPTUN1c3RvbWVySUQgPSAwOwotCQlwSGFsRGF0YS0+RUVQUk9NU3ViQ3VzdG9tZXJJRCA9IDA7Ci0JfQotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgIkVFUFJPTSBDdXN0b21lciBJRDogMHglMnhcbiIsIHBIYWxEYXRhLT5FRVBST01DdXN0b21lcklEKTsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICJFRVBST00gU3ViQ3VzdG9tZXIgSUQ6IDB4JTAyeFxuIiwKLQkJIHBIYWxEYXRhLT5FRVBST01TdWJDdXN0b21lcklEKTsKLX0KLQotdm9pZAotSGFsX0VmdXNlUGFyc2VBbnRlbm5hRGl2ZXJzaXR5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpCi17Ci19Ci0KLXZvaWQKLUhhbF9FZnVzZVBhcnNlUmF0ZUluZGljYXRpb25PcHRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICB1OCAqaHdpbmZvLCBib29sIEF1dG9Mb2FkRmFpbCkKLXsKLX0KLQotdm9pZAotSGFsX0VmdXNlUGFyc2VYdGFsXzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsCi0JCQkgdTggKmh3aW5mbywgdTggQXV0b0xvYWRGYWlsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOwotCi0JaWYgKCFBdXRvTG9hZEZhaWwpIHsKLQkJcEhhbERhdGEtPkNyeXN0YWxDYXAgPSBod2luZm9bRUVQUk9NX1hUQUxfS184NzIzQV07Ci0JCWlmIChwSGFsRGF0YS0+Q3J5c3RhbENhcCA9PSAweEZGKQotCQkJcEhhbERhdGEtPkNyeXN0YWxDYXAgPSBFRVBST01fRGVmYXVsdF9DcnlzdGFsQ2FwXzg3MjNBOwotCX0gZWxzZSB7Ci0JCXBIYWxEYXRhLT5DcnlzdGFsQ2FwID0gRUVQUk9NX0RlZmF1bHRfQ3J5c3RhbENhcF84NzIzQTsKLQl9Ci0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiJXM6IENyeXN0YWxDYXAgPSAweCUyeFxuIiwgX19mdW5jX18sCi0JCSBwSGFsRGF0YS0+Q3J5c3RhbENhcCk7Ci19Ci0KLXZvaWQKLUhhbF9FZnVzZVBhcnNlVGhlcm1hbE1ldGVyXzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJIHU4ICpQUk9NQ29udGVudCwgYm9vbCBBdXRvbG9hZEZhaWwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQkvKiAgKi8KLQkvKiAgVGhlcm1hbE1ldGVyIGZyb20gRUVQUk9NICovCi0JLyogICovCi0JaWYgKCFBdXRvbG9hZEZhaWwpCi0JCXBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgPQotCQkgICAgUFJPTUNvbnRlbnRbRUVQUk9NX1RIRVJNQUxfTUVURVJfODcyM0FdOwotCWVsc2UKLQkJcEhhbERhdGEtPkVFUFJPTVRoZXJtYWxNZXRlciA9IEVFUFJPTV9EZWZhdWx0X1RoZXJtYWxNZXRlcjsKLQotCWlmICgocEhhbERhdGEtPkVFUFJPTVRoZXJtYWxNZXRlciA9PSAweGZmKSB8fCBBdXRvbG9hZEZhaWwpIHsKLQkJcEhhbERhdGEtPmJBUEtUaGVybWFsTWV0ZXJJZ25vcmUgPSB0cnVlOwotCQlwSGFsRGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyID0gRUVQUk9NX0RlZmF1bHRfVGhlcm1hbE1ldGVyOwotCX0KLQotCURCR184NzIzQSgiJXM6IFRoZXJtYWxNZXRlciA9IDB4JXhcbiIsIF9fZnVuY19fLAotCQkgIHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBydGw4NzIzYV9jYWxfdHhkZXNjX2Noa3N1bShzdHJ1Y3QgdHhfZGVzYyAqcHR4ZGVzYykKLXsKLQlfX2xlMTYgKnVzUHRyID0gKF9fbGUxNiAqKXB0eGRlc2M7Ci0JdTMyIGNvdW50ID0gMTY7CQkvKiAgKDMyIGJ5dGVzIC8gMiBieXRlcyBwZXIgWE9SKSA9PiAxNiB0aW1lcyAqLwotCXUzMiBpbmRleDsKLQl1MTYgY2hlY2tzdW0gPSAwOwotCi0JLyogIENsZWFyIGZpcnN0ICovCi0JcHR4ZGVzYy0+dHhkdzcgJj0gY3B1X3RvX2xlMzIoMHhmZmZmMDAwMCk7Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykKLQkJY2hlY2tzdW0gXj0gbGUxNl90b19jcHUodXNQdHJbaW5kZXhdKTsKLQotCXB0eGRlc2MtPnR4ZHc3IHw9IGNwdV90b19sZTMyKGNoZWNrc3VtICYgMHgwMDAwZmZmZik7Ci19Ci0KLS8qCi0gKiAgRGVzY3JpcHRpb246IEluIG5vcm1hbCBjaGlwLCB3ZSBzaG91bGQgc2VuZCBzb21lIHBhY2tldCB0byBIdyB3aGljaAotICogIHdpbGwgYmUgdXNlZCBieSBGdyBpbiBGVyBMUFMgbW9kZS4gVGhlIGZ1bmN0aW9uIGlzIHRvIGZpbGwgdGhlIFR4Ci0gKiBkZXNjcmlwdG9yIG9mIHRoaXMgcGFja2V0cywgdGhlbgotICovCi0vKgkJCUZ3IGNhbiB0ZWxsIEh3IHRvIHNlbmQgdGhlc2UgcGFja2V0IGRlcmVjdGx5LiAqLwotLyogIEFkZGVkIGJ5IHR5bmxpLiAyMDA5LjEwLjE1LiAqLwotLyogICovCi12b2lkIHJ0bDg3MjNhX2ZpbGxfZmFrZV90eGRlc2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnBEZXNjLAotCQkJICAgICAgIHUzMiBCdWZmZXJMZW4sIHU4IElzUHNQb2xsLCB1OCBJc0JUUW9zTnVsbCkKLXsKLQlzdHJ1Y3QgdHhfZGVzYyAqcHR4ZGVzYzsKLQotCS8qICBDbGVhciBhbGwgc3RhdHVzICovCi0JcHR4ZGVzYyA9IChzdHJ1Y3QgdHhfZGVzYyAqKXBEZXNjOwotCW1lbXNldChwRGVzYywgMCwgVFhERVNDX1NJWkUpOwotCi0JLyogb2Zmc2V0IDAgKi8KLQkvKiBvd24sIGJGaXJzdFNlZywgYkxhc3RTZWc7ICovCi0JcHR4ZGVzYy0+dHhkdzAgfD0gY3B1X3RvX2xlMzIoT1dOIHwgRlNHIHwgTFNHKTsKLQotCS8qIDMyIGJ5dGVzIGZvciBUWCBEZXNjICovCi0JcHR4ZGVzYy0+dHhkdzAgfD0gY3B1X3RvX2xlMzIoKChUWERFU0NfU0laRSArIE9GRlNFVF9TWikgPDwKLQkJCQkgICAgICAgT0ZGU0VUX1NIVCkgJiAweDAwZmYwMDAwKTsKLQotCS8qICBCdWZmZXIgc2l6ZSArIGNvbW1hbmQgaGVhZGVyICovCi0JcHR4ZGVzYy0+dHhkdzAgfD0gY3B1X3RvX2xlMzIoQnVmZmVyTGVuICYgMHgwMDAwZmZmZik7Ci0KLQkvKiBvZmZzZXQgNCAqLwotCS8qICBGaXhlZCBxdWV1ZSBvZiBNZ250IHF1ZXVlICovCi0JcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoKFFTTFRfTUdOVCA8PCBRU0VMX1NIVCkgJiAweDAwMDAxZjAwKTsKLQotCS8qIFNldCBOQVZVU0VIRFIgdG8gcHJldmVudCBQcy1wb2xsIEFJZCBmaWxlZCB0byBiZSBjaGFuZ2VkCi0JICAgdG8gZXJyb3IgdmxhdWUgYnkgSHcuICovCi0JaWYgKElzUHNQb2xsKSB7Ci0JCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKE5BVlVTRUhEUik7Ci0JfSBlbHNlIHsKLQkJLyogIEh3IHNldCBzZXF1ZW5jZSBudW1iZXIgKi8KLQkJcHR4ZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoQklUKDcpKTsKLQkJLyogc2V0IGJpdDMgdG8gMS4gU3V1Z2VzdGVkIGJ5IFRpbUNoZW4uIDIwMDkuMTIuMjkuICovCi0JCXB0eGRlc2MtPnR4ZHczIHw9IGNwdV90b19sZTMyKCg4IDw8IDI4KSk7Ci0JfQotCi0JaWYgKHRydWUgPT0gSXNCVFFvc051bGwpCi0JCXB0eGRlc2MtPnR4ZHcyIHw9IGNwdV90b19sZTMyKEJJVCgyMykpOwkvKiAgQlQgTlVMTCAqLwotCi0JLyogb2Zmc2V0IDE2ICovCi0JcHR4ZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoQklUKDgpKTsJLyogZHJpdmVyIHVzZXMgcmF0ZSAqLwotCi0JLyogIFVTQiBpbnRlcmZhY2UgZHJvcCBwYWNrZXQgaWYgdGhlIGNoZWNrc3VtIG9mIGRlc2NyaXB0b3IgaXNuJ3QKLQkgICAgY29ycmVjdC4gKi8KLQkvKiAgVXNpbmcgdGhpcyBjaGVja3N1bSBjYW4gbGV0IGhhcmR3YXJlIHJlY292ZXJ5IGZyb20gcGFja2V0IGJ1bGsKLQkgICAgb3V0IGVycm9yIChlLmcuIENhbmNlbCBVUkMsIEJ1bGsgb3V0IGVycm9yLikuICovCi0JcnRsODcyM2FfY2FsX3R4ZGVzY19jaGtzdW0ocHR4ZGVzYyk7Ci19Ci0KLXZvaWQgaHdfdmFyX3NldF9vcG1vZGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbW9kZSkKLXsKLQl1OCB2YWw4OwotCi0JaWYgKG1vZGUgPT0gTVNSX0lORlJBIHx8IG1vZGUgPT0gTVNSX05PTElOSykgewotCQlTdG9wVHhCZWFjb24ocGFkYXB0ZXIpOwotCi0JCS8qICBkaXNhYmxlIGF0aW0gd25kICovCi0JCXZhbDggPSBESVNfVFNGX1VEVCB8IEVOX0JDTl9GVU5DVElPTiB8IERJU19BVElNOwotCQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCB2YWw4LCB+dmFsOCk7Ci0JfSBlbHNlIGlmIChtb2RlID09IE1TUl9BREhPQykgewotCQlSZXN1bWVUeEJlYWNvbihwYWRhcHRlcik7Ci0KLQkJdmFsOCA9IERJU19UU0ZfVURUIHwgRU5fQkNOX0ZVTkNUSU9OIHwgRElTX0JDTlFfU1VCOwotCQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCB2YWw4LCB+dmFsOCk7Ci0JfSBlbHNlIGlmIChtb2RlID09IE1TUl9BUCkgewotCQkvKiAgYWRkIE5VTEwgRGF0YSBhbmQgQlQgTlVMTCBEYXRhIFBhY2tldHMgdG8gRlcgUlNWRCBQYWdlICovCi0JCXJ0bDg3MjNhX3NldF9CVENvZXhfQVBfbW9kZV9Gd1JzdmRQa3RfY21kKHBhZGFwdGVyKTsKLQotCQlSZXN1bWVUeEJlYWNvbihwYWRhcHRlcik7Ci0KLQkJdmFsOCA9IERJU19UU0ZfVURUIHwgRElTX0JDTlFfU1VCOwotCQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCB2YWw4LCB+dmFsOCk7Ci0KLQkJLyogIFNldCBSQ1IgKi8KLQkJLyogcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19SQ1IsIDB4NzAwMDJhOGUpOwotCQkgICBDQlNTSURfREFUQSBtdXN0IHNldCB0byAwICovCi0JCS8qIENCU1NJRF9EQVRBIG11c3Qgc2V0IHRvIDAgKi8KLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19SQ1IsIDB4NzAwMDIyOGUpOwotCQkvKiAgZW5hYmxlIHRvIHJ4IGRhdGEgZnJhbWUgKi8KLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19SWEZMVE1BUDIsIDB4RkZGRik7Ci0JCS8qICBlbmFibGUgdG8gcnggcHMtcG9sbCAqLwotCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1JYRkxUTUFQMSwgMHgwNDAwKTsKLQotCQkvKiAgQmVhY29uIENvbnRyb2wgcmVsYXRlZCByZWdpc3RlciBmb3IgZmlyc3QgdGltZSAqLwotCQkvKiAgMm1zICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19CQ05ETUFUSU0sIDB4MDIpOwotCQkvKiAgNW1zICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19EUlZFUkxZSU5ULCAweDA1KTsKLQkJLyogIDEwbXMgZm9yIHBvcnQwICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19BVElNV05ELCAweDBhKTsKLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19CQ05UQ0ZHLCAweDAwKTsKLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19UQlRUX1BST0hJQklULCAweGZmMDQpOwotCQkvKiAgKzMyNzY3ICh+MzJtcykgKi8KLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19UU0ZUUl9TWU5fT0ZGU0VULCAweDdmZmYpOwotCi0JCS8qICByZXNldCBUU0YgKi8KLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0RVQUxfVFNGX1JTVCwgQklUKDApKTsKLQotCQkvKiAgZW5hYmxlIEJDTiBGdW5jdGlvbiAqLwotCQkvKiAgZG9uJ3QgZW5hYmxlIHVwZGF0ZSBUU0YgKGR1ZSB0byBUU0YgdXBkYXRlIHdoZW4KLQkJICAgIGJlYWNvbi9wcm9iZSByc3AgYXJlIHJlY2VpdmVkKSAqLwotCQl2YWw4ID0gRElTX1RTRl9VRFQgfCBFTl9CQ05fRlVOQ1RJT04gfAotCQkgICAgICAgRU5fVFhCQ05fUlBUIHwgRElTX0JDTlFfU1VCOwotCQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCB2YWw4LCB+dmFsOCk7Ci0JfQotCi0JdmFsOCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgTVNSKTsKLQl2YWw4ID0gKHZhbDggJiAweEMpIHwgbW9kZTsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBNU1IsIHZhbDgpOwotfQotCi12b2lkIGh3X3Zhcl9zZXRfbWFjYWRkcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqdmFsKQotewotCXU4IGlkeCA9IDA7Ci0JdTMyIHJlZ19tYWNpZDsKLQotCXJlZ19tYWNpZCA9IFJFR19NQUNJRDsKLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgNjsgaWR4KyspCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIChyZWdfbWFjaWQgKyBpZHgpLCB2YWxbaWR4XSk7Ci19Ci0KLXZvaWQgaHdfdmFyX3NldF9ic3NpZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqdmFsKQotewotCXU4IGlkeCA9IDA7Ci0JdTMyIHJlZ19ic3NpZDsKLQotCXJlZ19ic3NpZCA9IFJFR19CU1NJRDsKLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgNjsgaWR4KyspCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIChyZWdfYnNzaWQgKyBpZHgpLCB2YWxbaWR4XSk7Ci19Ci0KLXZvaWQgaHdfdmFyX3NldF9jb3JyZWN0X3RzZihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU2NCB0c2Y7Ci0JdTMyIHJlZ190c2Z0cjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JLyogdHNmID0gcG1sbWVleHQtPlRTRlZhbHVlIC0gKCh1MzIpcG1sbWVleHQtPlRTRlZhbHVlICUKLQkgICAocG1sbWVpbmZvLT5iY25faW50ZXJ2YWwqMTAyNCkpIC0gMTAyNDsgdXMgKi8KLQl0c2YgPSBwbWxtZWV4dC0+VFNGVmFsdWUgLQotCQlkb19kaXYocG1sbWVleHQtPlRTRlZhbHVlLAotCQkgICAgICAgKHBtbG1laW5mby0+YmNuX2ludGVydmFsICogMTAyNCkpIC0gMTAyNDsJLyogdXMgKi8KLQotCWlmICgoKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfQURIT0MpIHx8Ci0JICAgICgocG1sbWVpbmZvLT5zdGF0ZSAmIDB4MDMpID09IE1TUl9BUCkpIHsKLQkJLyogcEhhbERhdGEtPlJlZ1R4UGF1c2UgfD0gU1RPUF9CQ05RO0JJVCg2KSAqLwotCQkvKiBydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfVFhQQVVTRSwKLQkJICAgKHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfVFhQQVVTRSl8QklUKDYpKSk7ICovCi0JCVN0b3BUeEJlYWNvbihwYWRhcHRlcik7Ci0JfQotCi0JcmVnX3RzZnRyID0gUkVHX1RTRlRSOwotCi0JLyogIGRpc2FibGUgcmVsYXRlZCBUU0YgZnVuY3Rpb24gKi8KLQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCAwLCBFTl9CQ05fRlVOQ1RJT04pOwotCi0JcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIHJlZ190c2Z0ciwgdHNmKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgcmVnX3RzZnRyICsgNCwgdHNmID4+IDMyKTsKLQotCS8qIGVuYWJsZSByZWxhdGVkIFRTRiBmdW5jdGlvbiAqLwotCVNldEJjbkN0cmxSZWcyM2EocGFkYXB0ZXIsIEVOX0JDTl9GVU5DVElPTiwgMCk7Ci0KLQlpZiAoKChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgPT0gTVNSX0FESE9DKSB8fAotCSAgICAoKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfQVApKQotCQlSZXN1bWVUeEJlYWNvbihwYWRhcHRlcik7Ci19Ci0KLXZvaWQgaHdfdmFyX3NldF9tbG1lX2Rpc2Nvbm5lY3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQkvKiAgcmVqZWN0IGFsbCBkYXRhIGZyYW1lcyAqLwotCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfUlhGTFRNQVAyLCAwKTsKLQotCS8qICByZXNldCBUU0YgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfRFVBTF9UU0ZfUlNULCBCSVQoMCkpOwotCi0JLyogIGRpc2FibGUgdXBkYXRlIFRTRiAqLwotCVNldEJjbkN0cmxSZWcyM2EocGFkYXB0ZXIsIERJU19UU0ZfVURULCAwKTsKLX0KLQotdm9pZCBod192YXJfc2V0X21sbWVfam9pbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0eXBlKQotewotCXU4IFJldHJ5TGltaXQgPSAweDMwOwotCi0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWlmICh0eXBlID09IDApIHsJLyogIHByZXBhcmUgdG8gam9pbiAqLwotCQl1MzIgdjMyOwotCi0JCS8qICBlbmFibGUgdG8gcnggZGF0YSBmcmFtZS5BY2NlcHQgYWxsIGRhdGEgZnJhbWUgKi8KLQkJLyogcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19SQ1IsCi0JCSAgIHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19SQ1IpfFJDUl9BREYpOyAqLwotCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1JYRkxUTUFQMiwgMHhGRkZGKTsKLQotCQl2MzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfUkNSKTsKLQkJdjMyIHw9IFJDUl9DQlNTSURfREFUQSB8IFJDUl9DQlNTSURfQkNOOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX1JDUiwgdjMyKTsKLQotCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkgPT0gdHJ1ZSkKLQkJCVJldHJ5TGltaXQgPQotCQkJICAgIChwSGFsRGF0YS0+Q3VzdG9tZXJJRCA9PSBSVF9DSURfQ0NYKSA/IDcgOiA0ODsKLQkJZWxzZQkJLyogIEFkLWhvYyBNb2RlICovCi0JCQlSZXRyeUxpbWl0ID0gMHg3OwotCX0gZWxzZSBpZiAodHlwZSA9PSAxKSB7CS8qICBqb2luYnNzX2V2ZW50IGNhbGxiYWNrIHdoZW4gam9pbiByZXMgPCAwICovCi0JCS8qICBjb25maWcgUkNSIHRvIHJlY2VpdmUgZGlmZmVyZW50IEJTU0lEICYgbm90IHRvCi0JCSAgICByZWNlaXZlIGRhdGEgZnJhbWUgZHVyaW5nIGxpbmtpbmcgKi8KLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19SWEZMVE1BUDIsIDApOwotCX0gZWxzZSBpZiAodHlwZSA9PSAyKSB7CS8qICBzdGEgYWRkIGV2ZW50IGNhbGxiYWNrICovCi0JCS8qICBlbmFibGUgdXBkYXRlIFRTRiAqLwotCQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCAwLCBESVNfVFNGX1VEVCk7Ci0KLQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LAotCQkJCSAgV0lGSV9BREhPQ19TVEFURSB8IFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgewotCQkJLyogIGZpeGVkIGJlYWNvbiBpc3N1ZSBmb3IgODE5MXN1Li4uLi4uLi4uLi4gKi8KLQkJCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIDB4NTQyLCAweDAyKTsKLQkJCVJldHJ5TGltaXQgPSAweDc7Ci0JCX0KLQl9Ci0KLQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1JMLAotCQkJICBSZXRyeUxpbWl0IDw8IFJFVFJZX0xJTUlUX1NIT1JUX1NISUZUIHwgUmV0cnlMaW1pdCA8PAotCQkJICBSRVRSWV9MSU1JVF9MT05HX1NISUZUKTsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgMDoKLQkJLyogIHByZXBhcmUgdG8gam9pbiAqLwotCQlydGw4NzIzYV9CVF93aWZpYXNzb2NpYXRlX25vdGlmeShwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJLyogIGpvaW5ic3NfZXZlbnQgY2FsbGJhY2sgd2hlbiBqb2luIHJlcyA8IDAgKi8KLQkJcnRsODcyM2FfQlRfd2lmaWFzc29jaWF0ZV9ub3RpZnkocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQkvKiAgc3RhIGFkZCBldmVudCBjYWxsYmFjayAqLwotLyoJCUJUX1dpZmlNZWRpYVN0YXR1c05vdGlmeShwYWRhcHRlciwgUlRfTUVESUFfQ09OTkVDVCk7ICovCi0JCWJyZWFrOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3BoeWNmZy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfcGh5Y2ZnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YTZjM2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfcGh5Y2ZnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9SVEw4NzIzQV9QSFlDRkdfQ18KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgTG9jYWwgQ29uc3RhbnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ2hhbm5lbCBzd2l0Y2g6VGhlIHNpemUgb2YgY29tbWFuZCB0YWJsZXMgZm9yIHN3aXRjaCBjaGFubmVsKi8KLSNkZWZpbmUgTUFYX1BSRUNNRF9DTlQgMTYKLSNkZWZpbmUgTUFYX1JGREVQRU5EQ01EX0NOVCAxNgotI2RlZmluZSBNQVhfUE9TVENNRF9DTlQgMTYKLQotI2RlZmluZSBNQVhfRE9aRV9XQUlUSU5HX1RJTUVTXzl4IDY0Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIExvY2FsIENvbnN0YW50LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBsb2NhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZXhwb3J0IGZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICBQbGVhc2UgcmVmZXIgdG8gaGVhZGVyIGZpbGUgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZXhwb3J0IGZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRnVuY3Rpb24gQm9keS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogICovCi0vKiAgMS4gQkIgcmVnaXN0ZXIgUi9XIEFQSSAqLwotLyogICovCi0KLS8qKgotKiBGdW5jdGlvbjoJcGh5X0NhbGN1bGF0ZUJpdFNoaWZ0Ci0qCi0qIE92ZXJWaWV3OglHZXQgc2hpZnRlZCBwb3NpdGlvbiBvZiB0aGUgQml0TWFzawotKgotKiBJbnB1dDoKLSoJCQl1MzIJCUJpdE1hc2ssCi0qCi0qIE91dHB1dDoJbm9uZQotKiBSZXR1cm46CQl1MzIJCVJldHVybiB0aGUgc2hpZnQgYml0IGJpdCBwb3NpdGlvbiBvZiB0aGUgbWFzawotKi8KLXN0YXRpYwl1MzIgcGh5X0NhbGN1bGF0ZUJpdFNoaWZ0KHUzMiBCaXRNYXNrKQotewotCXUzMiBpOwotCi0JZm9yIChpID0gMDsgaSA8PSAzMTsgaSsrKSB7Ci0JCWlmICgoKEJpdE1hc2s+PmkpICYgMHgxKSA9PSAxKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGk7Ci19Ci0KLS8qKgotKiBGdW5jdGlvbjoJUEhZX1F1ZXJ5QkJSZWcKLSoKLSogT3ZlclZpZXc6CVJlYWQgInNlcGNpZmljIGJpdHMiIGZyb20gQkIgcmVnaXN0ZXIKLSoKLSogSW5wdXQ6Ci0qCXN0cnVjdCBydHdfYWRhcHRlciAqCUFkYXB0ZXIsCi0qCXUzMgkJCVJlZ0FkZHIsCVRhcmdldCBhZGRyZXNzIHRvIGJlIHJlYWRiYWNrCi0qCXUzMgkJCUJpdE1hc2sJCVRhcmdldCBiaXQgcG9zaXRpb24gaW4gdGhlCi0qCQkJCQkJdGFyZ2V0IGFkZHJlc3MgdG8gYmUgcmVhZGJhY2sKLSogT3V0cHV0OgotKglOb25lCi0qIFJldHVybjoKLSoJdTMyCQkJRGF0YQkJVGhlIHJlYWRiYWNrIHJlZ2lzdGVyIHZhbHVlCi0qIE5vdGU6Ci0qCVRoaXMgZnVuY3Rpb24gaXMgZXF1YWwgdG8gIkdldFJlZ1NldHRpbmciIGluIFBIWSBwcm9ncmFtbWluZyBndWlkZQotKi8KLXUzMgotUEhZX1F1ZXJ5QkJSZWcoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1MzIgUmVnQWRkciwgdTMyIEJpdE1hc2spCi17Ci0JdTMyCVJldHVyblZhbHVlID0gMCwgT3JpZ2luYWxWYWx1ZSwgQml0U2hpZnQ7Ci0KLQlPcmlnaW5hbFZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBSZWdBZGRyKTsKLQlCaXRTaGlmdCA9IHBoeV9DYWxjdWxhdGVCaXRTaGlmdChCaXRNYXNrKTsKLQlSZXR1cm5WYWx1ZSA9IChPcmlnaW5hbFZhbHVlICYgQml0TWFzaykgPj4gQml0U2hpZnQ7Ci0JcmV0dXJuIFJldHVyblZhbHVlOwotfQotCi0vKioKLSogRnVuY3Rpb246CVBIWV9TZXRCQlJlZwotKgotKiBPdmVyVmlldzoJV3JpdGUgIlNwZWNpZmljIGJpdHMiIHRvIEJCIHJlZ2lzdGVyIChwYWdlIDh+KQotKgotKiBJbnB1dDoKLSoJc3RydWN0IHJ0d19hZGFwdGVyICoJQWRhcHRlciwKLSoJdTMyCQkJUmVnQWRkciwJVGFyZ2V0IGFkZHJlc3MgdG8gYmUgbW9kaWZpZWQKLSoJdTMyCQkJQml0TWFzawkJVGFyZ2V0IGJpdCBwb3NpdGlvbiBpbiB0aGUKLSoJCQkJCQl0YXJnZXQgYWRkcmVzcyB0byBiZSBtb2RpZmllZAotKgl1MzIJCQlEYXRhCQlUaGUgbmV3IHJlZ2lzdGVyIHZhbHVlIGluIHRoZQotKgkJCQkJCXRhcmdldCBiaXQgcG9zaXRpb24gb2YgdGhlCi0qCQkJCQkJIHRhcmdldCBhZGRyZXNzCi0qCi0qIE91dHB1dDoKLSoJTm9uZQotKiBSZXR1cm46Ci0qCU5vbmUKLSogTm90ZToKLSoJVGhpcyBmdW5jdGlvbiBpcyBlcXVhbCB0byAiUHV0UmVnU2V0dGluZyIgaW4gUEhZIHByb2dyYW1taW5nIGd1aWRlCi0qLwotCi12b2lkCi1QSFlfU2V0QkJSZWcoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1MzIgUmVnQWRkciwgdTMyIEJpdE1hc2ssIHUzMglEYXRhKQotewotCXUzMiBPcmlnaW5hbFZhbHVlLCBCaXRTaGlmdDsKLQotCWlmIChCaXRNYXNrICE9IGJNYXNrRFdvcmQpIHsvKiBpZiBub3QgImRvdWJsZSB3b3JkIiB3cml0ZSAqLwotCQlPcmlnaW5hbFZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBSZWdBZGRyKTsKLQkJQml0U2hpZnQgPSBwaHlfQ2FsY3VsYXRlQml0U2hpZnQoQml0TWFzayk7Ci0JCURhdGEgPSAoT3JpZ2luYWxWYWx1ZSAmICh+Qml0TWFzaykpIHwgKERhdGEgPDwgQml0U2hpZnQpOwotCX0KLQotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJlZ0FkZHIsIERhdGEpOwotCi0JLyogUlRQUklOVChGUEhZLCBQSFlfQkJXLCAoIkJCVyBNQVNLID0gMHglbHggQWRkclsweCVseF09IDB4JWx4XG4iLCBCaXRNYXNrLCBSZWdBZGRyLCBEYXRhKSk7ICovCi19Ci0KLS8qICAqLwotLyogIDIuIFJGIHJlZ2lzdGVyIFIvVyBBUEkgKi8KLS8qICAqLwotCi0vKioKLSogRnVuY3Rpb246CXBoeV9SRlNlcmlhbFJlYWQKLSoKLSogT3ZlclZpZXc6CVJlYWQgcmVnc3RlciBmcm9tIFJGIGNoaXBzCi0qCi0qIElucHV0OgotKgkJc3RydWN0IHJ0d19hZGFwdGVyICoJCUFkYXB0ZXIsCi0qCQllbnVtIFJGX1JBRElPX1BBVEgJZVJGUGF0aCwJUmFkaW8gcGF0aCBvZiBBL0IvQy9ECi0qCQl1MzIgT2Zmc2V0LAkJCVRoZSB0YXJnZXQgYWRkcmVzcyB0byBiZSByZWFkCi0qCi0qIE91dHB1dDoJTm9uZQotKiBSZXR1cm46CXUzMgkJCXJlYmFjayB2YWx1ZQotKiBOb3RlOgkJVGhyZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBzZXJpYWwgb3BlcmF0aW9uczoKLSoJCTEuIFNvZnR3YXJlIHNlcmlhbCB3cml0ZQotKgkJMi4gSGFyZHdhcmUgTFNTSS1Mb3cgU3BlZWQgU2VyaWFsIEludGVyZmFjZQotKgkJMy4gSGFyZHdhcmUgSFNTSS1IaWdoIHNwZWVkCi0qCQlzZXJpYWwgd3JpdGUuIERyaXZlciBuZWVkIHRvIGltcGxlbWVudCAoMSkgYW5kICgyKS4KLSoJCVRoaXMgZnVuY3Rpb24gaXMgZXF1YWwgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIFJGX1JlYWRSZWcoKSBhbmQKLSoJCVJGTFNTSVJlYWQoKQotKi8KLXN0YXRpYyB1MzIKLXBoeV9SRlNlcmlhbFJlYWQoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCBlbnVtIFJGX1JBRElPX1BBVEggZVJGUGF0aCwKLQkJIHUzMiBPZmZzZXQpCi17Ci0JdTMyIHJldFZhbHVlID0gMDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBiYl9yZWdfZGVmaW5lICpwUGh5UmVnID0gJnBIYWxEYXRhLT5QSFlSZWdEZWZbZVJGUGF0aF07Ci0JdTMyIE5ld09mZnNldDsKLQl1MzIgdG1wbG9uZywgdG1wbG9uZzI7Ci0JdTggUmZQaUVuYWJsZSA9IDA7Ci0JLyogICovCi0JLyogIE1ha2Ugc3VyZSBSRiByZWdpc3RlciBvZmZzZXQgaXMgY29ycmVjdCAqLwotCS8qICAqLwotCU9mZnNldCAmPSAweDNmOwotCi0JLyogICovCi0JLyogIFN3aXRjaCBwYWdlIGZvciA4MjU2IFJGIElDICovCi0JLyogICovCi0JTmV3T2Zmc2V0ID0gT2Zmc2V0OwotCi0JLyogIDIwMDkvMDYvMTcgTUggV2UgY2FuIG5vdCBleGVjdXRlIElPIGZvciBwb3dlciBzYXZlIG9yCi0JICAgIG90aGVyIGFjY2lkZW50IG1vZGUuICovCi0JLyogaWYgKFJUX0NBTk5PVF9JTyhBZGFwdGVyKSkgKi8KLQkvKiAgKi8KLQkvKglSVFBSSU5UKEZQSFksIFBIWV9SRlIsICgicGh5X1JGU2VyaWFsUmVhZCByZXR1cm4gYWxsIG9uZVxuIikpOyAqLwotCS8qCXJldHVybgkweEZGRkZGRkZGOyAqLwotCS8qICAqLwotCi0JLyogIEZvciA5MlMgTFNTSSBSZWFkIFJGTFNTSVJlYWQgKi8KLQkvKiAgRm9yIFJGIEEvQiB3cml0ZSAweDgyNC84MmMoZG9lcyBub3Qgd29yayBpbiB0aGUgZnV0dXJlKSAqLwotCS8qICBXZSBtdXN0IHVzZSAweDgyNCBmb3IgUkYgQSBhbmQgQiB0byBleGVjdXRlIHJlYWQgdHJpZ2dlciAqLwotCXRtcGxvbmcgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMik7Ci0JaWYgKGVSRlBhdGggPT0gUkZfUEFUSF9BKQotCQl0bXBsb25nMiA9IHRtcGxvbmc7Ci0JZWxzZQotCQl0bXBsb25nMiA9IHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgcFBoeVJlZy0+cmZIU1NJUGFyYTIpOwotCi0JdG1wbG9uZzIgPSAodG1wbG9uZzIgJiB+YkxTU0lSZWFkQWRkcmVzcykgfAotCQkoTmV3T2Zmc2V0IDw8IDIzKSB8IGJMU1NJUmVhZEVkZ2U7CS8qIFQ2NSBSRiAqLwotCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyLAotCQkJICB0bXBsb25nICYgKH5iTFNTSVJlYWRFZGdlKSk7Ci0JdWRlbGF5KDEwKTsvKiAgUGxhdGZvcm1TdGFsbEV4ZWN1dGlvbigxMCk7ICovCi0KLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBwUGh5UmVnLT5yZkhTU0lQYXJhMiwgdG1wbG9uZzIpOwotCXVkZWxheSgxMDApOy8qIFBsYXRmb3JtU3RhbGxFeGVjdXRpb24oMTAwKTsgKi8KLQotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMiwKLQkJCSAgdG1wbG9uZyB8IGJMU1NJUmVhZEVkZ2UpOwotCXVkZWxheSgxMCk7LyogUGxhdGZvcm1TdGFsbEV4ZWN1dGlvbigxMCk7ICovCi0KLQlpZiAoZVJGUGF0aCA9PSBSRl9QQVRIX0EpCi0JCVJmUGlFbmFibGUgPSAodTgpUEhZX1F1ZXJ5QkJSZWcoQWRhcHRlciwKLQkJCQkJCXJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMSwKLQkJCQkJCUJJVCg4KSk7Ci0JZWxzZSBpZiAoZVJGUGF0aCA9PSBSRl9QQVRIX0IpCi0JCVJmUGlFbmFibGUgPSAodTgpUEhZX1F1ZXJ5QkJSZWcoQWRhcHRlciwKLQkJCQkJCXJGUEdBMF9YQl9IU1NJUGFyYW1ldGVyMSwKLQkJCQkJCUJJVCg4KSk7Ci0KLQlpZiAoUmZQaUVuYWJsZSkJewotCQkvKiBSZWFkIGZyb20gQkJyZWc4YjgsIDEyIGJpdHMgZm9yIDgxOTAsIDIwYml0cyBmb3IgVDY1IFJGICovCi0JCXJldFZhbHVlID0gUEhZX1F1ZXJ5QkJSZWcoQWRhcHRlciwgcFBoeVJlZy0+cmZMU1NJUmVhZEJhY2tQaSwKLQkJCQkJICBiTFNTSVJlYWRCYWNrRGF0YSk7Ci0JCS8qIERCR184NzIzQSgiUmVhZGJhY2sgZnJvbSBSRi1QSSA6IDB4JXhcbiIsIHJldFZhbHVlKTsgKi8KLQl9IGVsc2UgewotCQkvKiBSZWFkIGZyb20gQkJyZWc4YTAsIDEyIGJpdHMgZm9yIDgxOTAsIDIwIGJpdHMgZm9yIFQ2NSBSRiAqLwotCQlyZXRWYWx1ZSA9IFBIWV9RdWVyeUJCUmVnKEFkYXB0ZXIsIHBQaHlSZWctPnJmTFNTSVJlYWRCYWNrLAotCQkJCQkgIGJMU1NJUmVhZEJhY2tEYXRhKTsKLQkJLyogREJHXzg3MjNBKCJSZWFkYmFjayBmcm9tIFJGLVNJIDogMHgleFxuIiwgcmV0VmFsdWUpOyAqLwotCX0KLQkvKiBEQkdfODcyM0EoIlJGUi0lZCBBZGRyWzB4JXhdPSAweCV4XG4iLCBlUkZQYXRoLCBwUGh5UmVnLT5yZkxTU0lSZWFkQmFjaywgcmV0VmFsdWUpOyAqLwotCi0JcmV0dXJuIHJldFZhbHVlOwotfQotCi0vKioKLSogRnVuY3Rpb246CXBoeV9SRlNlcmlhbFdyaXRlCi0qCi0qIE92ZXJWaWV3OglXcml0ZSBkYXRhIHRvIFJGIHJlZ2lzdGVyIChwYWdlIDh+KQotKgotKiBJbnB1dDoKLSoJc3RydWN0IHJ0d19hZGFwdGVyICoJCUFkYXB0ZXIsCi0qCWVudW0gUkZfUkFESU9fUEFUSAllUkZQYXRoLAlSYWRpbyBwYXRoIG9mIEEvQi9DL0QKLSoJdTMyIE9mZnNldCwJCQlUaGUgdGFyZ2V0IGFkZHJlc3MgdG8gYmUgcmVhZAotKgl1MzIgRGF0YQkJCVRoZSBuZXcgcmVnaXN0ZXIgRGF0YSBpbiB0aGUgdGFyZ2V0Ci0qCQkJCQliaXQgcG9zaXRpb24gb2YgdGhlIHRhcmdldCB0byBiZSByZWFkCi0qCi0qIE91dHB1dDoKLSoJTm9uZQotKiBSZXR1cm46Ci0qCU5vbmUKLSogTm90ZToKLSoJVGhyZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBzZXJpYWwgb3BlcmF0aW9uczoKLSoJCTEuIFNvZnR3YXJlIHNlcmlhbCB3cml0ZQotKgkJMi4gSGFyZHdhcmUgTFNTSS1Mb3cgU3BlZWQgU2VyaWFsIEludGVyZmFjZQotKgkJMy4gSGFyZHdhcmUgSFNTSS1IaWdoIHNwZWVkCi0qCQlzZXJpYWwgd3JpdGUuIERyaXZlciBuZWVkIHRvIGltcGxlbWVudCAoMSkgYW5kICgyKS4KLSoJCVRoaXMgZnVuY3Rpb24gaXMgZXF1YWwgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIFJGX1JlYWRSZWcoKSBhbmQKLSoJCVJGTFNTSVJlYWQoKQotKgotKiBOb3RlOgkgIEZvciBSRjgyNTYgb25seQotKiBUaGUgdG90YWwgY291bnQgb2YgUlRMODI1NihaZWJyYTQpIHJlZ2lzdGVyIGlzIGFyb3VuZCAzNiBiaXQgaXQgb25seSBlbXBsb3lzCi0qIDQtYml0IFJGIGFkZHJlc3MuIFJUTDgyNTYgdXNlcyAicmVnaXN0ZXIgbW9kZSBjb250cm9sIGJpdCIKLSogKFJlZzAwWzEyXSwgUmVnMDBbMTBdKSB0byBhY2Nlc3MgcmVnaXN0ZXIgYWRkcmVzcyBiaWdnZXIgdGhhbiAweGYuCi0qIFNlZSAiQXBwZW5kaXgtNCBpbiBQSFkgQ29uZmlndXJhdGlvbiBwcm9ncmFtbWluZyBndWlkZSIgZm9yIG1vcmUgZGV0YWlscy4KLSogVGh1cywgd2UgZGVmaW5lIGEgc3ViLWZpbmN0aW9uIGZvciBSVEw4NTI2IHJlZ2lzdGVyIGFkZHJlc3MgY29udmVyc2lvbgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiBSZWdpc3RlciBNb2RlOglSZWdDVExbMV0JUmVnQ1RMWzBdCU5vdGUKLSoJCQkoUmVnMDBbMTJdKQkoUmVnMDBbMTBdKQotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiBSZWdfTW9kZTAJCTAJCXgJCVJlZyAwIH4xNSgweDAgfiAweGYpCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBSZWdfTW9kZTEJCTEJCTAJCVJlZyAxNiB+MzAoMHgxIH4gMHhmKQotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogUmVnX01vZGUyCQkxCQkxCQlSZWcgMzEgfiA0NSgweDEgfiAweGYpCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKgkyMDA4LzA5LzAyCU1ICUFkZCA5MlMgUkYgZGVmaW5pdGlvbgotKi8KLXN0YXRpYwl2b2lkCi1waHlfUkZTZXJpYWxXcml0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIGVudW0gUkZfUkFESU9fUEFUSCBlUkZQYXRoLAotCQkgIHUzMiBPZmZzZXQsIHUzMiBEYXRhKQotewotCXUzMiBEYXRhQW5kQWRkciA9IDA7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgYmJfcmVnX2RlZmluZSAqcFBoeVJlZyA9ICZwSGFsRGF0YS0+UEhZUmVnRGVmW2VSRlBhdGhdOwotCXUzMiBOZXdPZmZzZXQ7Ci0KLQkvKiAgMjAwOS8wNi8xNyBNSCBXZSBjYW4gbm90IGV4ZWN1dGUgSU8gZm9yIHBvd2VyIHNhdmUgb3IKLQkgICAgb3RoZXIgYWNjaWRlbnQgbW9kZS4gKi8KLQkvKiBpZiAoUlRfQ0FOTk9UX0lPKEFkYXB0ZXIpKSAqLwotCS8qICAqLwotCS8qCVJUUFJJTlQoRlBIWSwgUEhZX1JGVywgKCJwaHlfUkZTZXJpYWxXcml0ZSBzdG9wXG4iKSk7ICovCi0JLyoJcmV0dXJuOyAqLwotCS8qICAqLwotCi0JT2Zmc2V0ICY9IDB4M2Y7Ci0KLQkvKiAgKi8KLQkvKiAgU2hhZG93IFVwZGF0ZSAqLwotCS8qICAqLwotCS8qIFBIWV9SRlNoYWRvd1dyaXRlKEFkYXB0ZXIsIGVSRlBhdGgsIE9mZnNldCwgRGF0YSk7ICovCi0KLQkvKiAgKi8KLQkvKiAgU3dpdGNoIHBhZ2UgZm9yIDgyNTYgUkYgSUMgKi8KLQkvKiAgKi8KLQlOZXdPZmZzZXQgPSBPZmZzZXQ7Ci0KLQkvKiAgKi8KLQkvKiAgUHV0IHdyaXRlIGFkZHIgaW4gWzU6MF0gIGFuZCB3cml0ZSBkYXRhIGluIFszMToxNl0gKi8KLQkvKiAgKi8KLQkvKiBEYXRhQW5kQWRkciA9IChEYXRhPDwxNikgfCAoTmV3T2Zmc2V0JjB4M2YpOyAqLwotCS8qICBUNjUgUkYgKi8KLQlEYXRhQW5kQWRkciA9ICgoTmV3T2Zmc2V0PDwyMCkgfCAoRGF0YSYweDAwMGZmZmZmKSkgJiAweDBmZmZmZmZmOwotCi0JLyogICovCi0JLyogIFdyaXRlIE9wZXJhdGlvbiAqLwotCS8qICAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHBQaHlSZWctPnJmM3dpcmVPZmZzZXQsIERhdGFBbmRBZGRyKTsKLX0KLQotLyoqCi0qIEZ1bmN0aW9uOglQSFlfUXVlcnlSRlJlZwotKgotKiBPdmVyVmlldzoJUXVlcnkgIlNwZWNpZmljIGJpdHMiIHRvIFJGIHJlZ2lzdGVyIChwYWdlIDh+KQotKgotKiBJbnB1dDoKLSoJc3RydWN0IHJ0d19hZGFwdGVyICoJCUFkYXB0ZXIsCi0qCWVudW0gUkZfUkFESU9fUEFUSAllUkZQYXRoLAlSYWRpbyBwYXRoIG9mIEEvQi9DL0QKLSoJdTMyIFJlZ0FkZHIsCQkJVGhlIHRhcmdldCBhZGRyZXNzIHRvIGJlIHJlYWQKLSoJdTMyQml0TWFzawkJCVRoZSB0YXJnZXQgYml0IHBvc2l0aW9uIGluIHRoZSB0YXJnZXQKLSoJCQkJCWFkZHJlc3MJdG8gYmUgcmVhZAotKgotKiBPdXRwdXQ6Ci0qCU5vbmUKLSogUmV0dXJuOgotKgl1MzIJCQkJUmVhZGJhY2sgdmFsdWUKLSogTm90ZToKLSoJVGhpcyBmdW5jdGlvbiBpcyBlcXVhbCB0byAiR2V0UkZSZWdTZXR0aW5nIiBpbiBQSFkgcHJvZ3JhbW1pbmcgZ3VpZGUKLSovCi11MzIKLVBIWV9RdWVyeVJGUmVnKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgZW51bSBSRl9SQURJT19QQVRIIGVSRlBhdGgsCi0JICAgICAgIHUzMiBSZWdBZGRyLCB1MzIgQml0TWFzaykKLXsKLQl1MzIgT3JpZ2luYWxfVmFsdWUsIFJlYWRiYWNrX1ZhbHVlLCBCaXRTaGlmdDsKLQkvKiBzdHJ1Y3QgaGFsX2RhdGFfODcyM2EJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOyAqLwotCS8qIHU4CVJGV2FpdENvdW50ZXIgPSAwOyAqLwotCS8qIF9pcnFMCWlycUw7ICovCi0KLQlPcmlnaW5hbF9WYWx1ZSA9IHBoeV9SRlNlcmlhbFJlYWQoQWRhcHRlciwgZVJGUGF0aCwgUmVnQWRkcik7Ci0KLQlCaXRTaGlmdCA9ICBwaHlfQ2FsY3VsYXRlQml0U2hpZnQoQml0TWFzayk7Ci0JUmVhZGJhY2tfVmFsdWUgPSAoT3JpZ2luYWxfVmFsdWUgJiBCaXRNYXNrKSA+PiBCaXRTaGlmdDsKLQotCXJldHVybiBSZWFkYmFja19WYWx1ZTsKLX0KLQotLyoqCi0qIEZ1bmN0aW9uOglQSFlfU2V0UkZSZWcKLSoKLSogT3ZlclZpZXc6CVdyaXRlICJTcGVjaWZpYyBiaXRzIiB0byBSRiByZWdpc3RlciAocGFnZSA4fikKLSoKLSogSW5wdXQ6Ci0qCXN0cnVjdCBydHdfYWRhcHRlciAqCQlBZGFwdGVyLAotKgllbnVtIFJGX1JBRElPX1BBVEgJZVJGUGF0aCwJUmFkaW8gcGF0aCBvZiBBL0IvQy9ECi0qCXUzMiBSZWdBZGRyLAkJCVRoZSB0YXJnZXQgYWRkcmVzcyB0byBiZSBtb2RpZmllZAotKgl1MzIgQml0TWFzawkJCVRoZSB0YXJnZXQgYml0IHBvc2l0aW9uIGluIHRoZSB0YXJnZXQKLSoJCQkJCWFkZHJlc3MgdG8gYmUgbW9kaWZpZWQKLSoJdTMyIERhdGEJCQlUaGUgbmV3IHJlZ2lzdGVyIERhdGEgaW4gdGhlIHRhcmdldAotKgkJCQkJYml0IHBvc2l0aW9uIG9mIHRoZSB0YXJnZXQgYWRkcmVzcwotKgotKiBPdXRwdXQ6Ci0qCU5vbmUKLSogUmV0dXJuOgotKglOb25lCi0qIE5vdGU6CVRoaXMgZnVuY3Rpb24gaXMgZXF1YWwgdG8gIlB1dFJGUmVnU2V0dGluZyIgaW4gUEhZIHByb2dyYW1taW5nIGd1aWRlCi0qLwotdm9pZAotUEhZX1NldFJGUmVnKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgZW51bSBSRl9SQURJT19QQVRIIGVSRlBhdGgsCi0JICAgICB1MzIgUmVnQWRkciwgdTMyIEJpdE1hc2ssIHUzMiBEYXRhKQotewotCS8qIHN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7ICovCi0JLyogdTggUkZXYWl0Q291bnRlcgk9IDA7ICovCi0JdTMyIE9yaWdpbmFsX1ZhbHVlLCBCaXRTaGlmdDsKLQotCS8qICBSRiBkYXRhIGlzIDEyIGJpdHMgb25seSAqLwotCWlmIChCaXRNYXNrICE9IGJSRlJlZ09mZnNldE1hc2spIHsKLQkJT3JpZ2luYWxfVmFsdWUgPSBwaHlfUkZTZXJpYWxSZWFkKEFkYXB0ZXIsIGVSRlBhdGgsIFJlZ0FkZHIpOwotCQlCaXRTaGlmdCA9ICBwaHlfQ2FsY3VsYXRlQml0U2hpZnQoQml0TWFzayk7Ci0JCURhdGEgPSAoT3JpZ2luYWxfVmFsdWUgJiAofkJpdE1hc2spKSB8IChEYXRhIDw8IEJpdFNoaWZ0KTsKLQl9Ci0KLQlwaHlfUkZTZXJpYWxXcml0ZShBZGFwdGVyLCBlUkZQYXRoLCBSZWdBZGRyLCBEYXRhKTsKLX0KLQotLyogIDMuIEluaXRpYWwgTUFDL0JCL1JGIGNvbmZpZyBieSByZWFkaW5nIE1BQy9CQi9SRiB0eHQuICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOiAgICBQSFlfTUFDQ29uZmlnODcyM0EKLSAqCi0gKiBPdmVydmlldzoJQ29uZGlnIE1BQyBieSBoZWFkZXIgZmlsZSBvciBwYXJhbWV0ZXIgZmlsZS4KLSAqCi0gKiBJbnB1dDogICAgICAgTk9ORQotICoKLSAqIE91dHB1dDogICAgICBOT05FCi0gKgotICogUmV0dXJuOiAgICAgIE5PTkUKLSAqCi0gKiBSZXZpc2VkIEhpc3Rvcnk6Ci0gKiAgV2hlbgkJV2hvCQlSZW1hcmsKLSAqICAwOC8xMi8yMDA4CU1IQwkJQ3JlYXRlIFZlcnNpb24gMC4KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgUEhZX01BQ0NvbmZpZzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCi0JLyogICovCi0JLyogIENvbmZpZyBNQUMgKi8KLQkvKiAgKi8KLQlPRE1fUmVhZEFuZENvbmZpZ19NQUNfUkVHXzg3MjNBKCZwSGFsRGF0YS0+b2RtcHJpdik7Ci0KLQkvKiAgMjAxMC4wNy4xMyBBTVBEVSBhZ2dyZWdhdGlvbiBudW1iZXIgOSAqLwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX01BWF9BR0dSX05VTSwgMHgwQSk7Ci0JaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIgJiYKLQkgICAgQk9BUkRfVVNCX0RPTkdMRSA9PSBwSGFsRGF0YS0+Qm9hcmRUeXBlKQotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4NDAsIDB4MDQpOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi0vKioKLSogRnVuY3Rpb246CXBoeV9Jbml0QkJSRlJlZ2lzdGVyRGVmaW5pdGlvbgotKgotKiBPdmVyVmlldzoJSW5pdGlhbGl6ZSBSZWdpc3RlciBkZWZpbml0aW9uIG9mZnNldCBmb3IgUmFkaW8gUGF0aCBBL0IvQy9ECi0qCi0qIElucHV0OgotKgkJCXN0cnVjdCBydHdfYWRhcHRlciAqCQlBZGFwdGVyLAotKgotKiBPdXRwdXQ6CU5vbmUKLSogUmV0dXJuOgkJTm9uZQotKiBOb3RlOgotKglUaGUgaW5pdGlhbGl6YXRpb24gdmFsdWUgaXMgY29uc3RhbnQgYW5kIGl0IHNob3VsZCBuZXZlciBiZSBjaGFuZ2VzCi0qLwotc3RhdGljCXZvaWQKLXBoeV9Jbml0QkJSRlJlZ2lzdGVyRGVmaW5pdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQotCS8qICBSRiBJbnRlcmZhY2UgU293cnR3YXJlIENvbnRyb2wgKi8KLQkgLyogIDE2IExTQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg3MCAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZmludGZzID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVNXOwotCSAvKiAgMTYgTVNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODcwICgxNi1iaXQgZm9yIDB4ODcyKSAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZmludGZzID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVNXOwotCi0JLyogIFJGIEludGVyZmFjZSBSZWFkYmFjayBWYWx1ZSAqLwotCS8qICAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4RTAgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZpbnRmaSA9IHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VSQjsKLQkvKiAgMTYgTVNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4OEUwICgxNi1iaXQgZm9yIDB4OEUyKSAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZmludGZpID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVJCOwotCi0JLyogIFJGIEludGVyZmFjZSBPdXRwdXQgKGFuZCBFbmFibGUpICovCi0JLyogIDE2IExTQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg2MCAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZmludGZvID0gckZQR0EwX1hBX1JGSW50ZXJmYWNlT0U7Ci0JIC8qICAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NjQgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZpbnRmbyA9IHJGUEdBMF9YQl9SRkludGVyZmFjZU9FOwotCi0JLyogIFJGIEludGVyZmFjZSAoT3V0cHV0IGFuZCkgIEVuYWJsZSAqLwotCSAvKiAgMTYgTVNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODYwICgxNi1iaXQgZm9yIDB4ODYyKSAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZmludGZlID0gckZQR0EwX1hBX1JGSW50ZXJmYWNlT0U7Ci0JLyogIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg2NCAoMTYtYml0IGZvciAweDg2NikgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZpbnRmZSA9IHJGUEdBMF9YQl9SRkludGVyZmFjZU9FOwotCi0JLyogQWRkciBvZiBMU1NJLiBXaXJ0ZSBSRiByZWdpc3RlciBieSBkcml2ZXIgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmYzd2lyZU9mZnNldCA9IHJGUEdBMF9YQV9MU1NJUGFyYW1ldGVyOwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZjN3aXJlT2Zmc2V0ID0gckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXI7Ci0KLQkvKiAgUkYgcGFyYW1ldGVyICovCi0JLyogQkIgQmFuZCBTZWxlY3QgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZMU1NJX1NlbGVjdCA9IHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXI7Ci0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmTFNTSV9TZWxlY3QgPSByRlBHQTBfWEFCX1JGUGFyYW1ldGVyOwotCi0JLyogIFR4IEFHQyBHYWluIFN0YWdlIChzYW1lIGZvciBhbGwgcGF0aC4gU2hvdWxkIHdlIHJlbW92ZSB0aGlzPykgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsKLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsKLQotCS8qICBUcmFuY2VpdmVyIEF+RCBIU1NJIFBhcmFtZXRlci0xICovCi0JLyogd2lyZSBjb250cm9sIHBhcmFtZXRlcjEgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZIU1NJUGFyYTEgPSByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjE7Ci0JLyogd2lyZSBjb250cm9sIHBhcmFtZXRlcjEgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZIU1NJUGFyYTEgPSByRlBHQTBfWEJfSFNTSVBhcmFtZXRlcjE7Ci0KLQkvKiAgVHJhbmNlaXZlciBBfkQgSFNTSSBQYXJhbWV0ZXItMiAqLwotCS8qIHdpcmUgY29udHJvbCBwYXJhbWV0ZXIyICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmSFNTSVBhcmEyID0gckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyOwotCS8qIHdpcmUgY29udHJvbCBwYXJhbWV0ZXIyICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmSFNTSVBhcmEyID0gckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIyOwotCi0JLyogIFJGIHN3aXRjaCBDb250cm9sICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmU3dpdGNoQ29udHJvbCA9Ci0JCXJGUEdBMF9YQUJfU3dpdGNoQ29udHJvbDsgLyogVFIvQW50IHN3aXRjaCBjb250cm9sICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmU3dpdGNoQ29udHJvbCA9Ci0JCXJGUEdBMF9YQUJfU3dpdGNoQ29udHJvbDsKLQotCS8qICBBR0MgY29udHJvbCAxICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmQUdDQ29udHJvbDEgPSByT0ZETTBfWEFBR0NDb3JlMTsKLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZBR0NDb250cm9sMSA9IHJPRkRNMF9YQkFHQ0NvcmUxOwotCi0JLyogIEFHQyBjb250cm9sIDIgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZBR0NDb250cm9sMiA9IHJPRkRNMF9YQUFHQ0NvcmUyOwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZkFHQ0NvbnRyb2wyID0gck9GRE0wX1hCQUdDQ29yZTI7Ci0KLQkvKiAgUlggQUZFIGNvbnRyb2wgMSAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZlJ4SVFJbWJhbGFuY2UgPSByT0ZETTBfWEFSeElRSW1iYWxhbmNlOwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZlJ4SVFJbWJhbGFuY2UgPSByT0ZETTBfWEJSeElRSW1iYWxhbmNlOwotCi0JLyogIFJYIEFGRSBjb250cm9sIDEgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZSeEFGRSA9IHJPRkRNMF9YQVJ4QUZFOwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZlJ4QUZFID0gck9GRE0wX1hCUnhBRkU7Ci0KLQkvKiAgVHggQUZFIGNvbnRyb2wgMSAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZlR4SVFJbWJhbGFuY2UgPSByT0ZETTBfWEFUeElRSW1iYWxhbmNlOwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZlR4SVFJbWJhbGFuY2UgPSByT0ZETTBfWEJUeElRSW1iYWxhbmNlOwotCi0JLyogIFR4IEFGRSBjb250cm9sIDIgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZUeEFGRSA9IHJPRkRNMF9YQVR4QUZFOwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZlR4QUZFID0gck9GRE0wX1hCVHhBRkU7Ci0KLQkvKiAgVHJhbmNlaXZlciBMU1NJIFJlYWRiYWNrIFNJIG1vZGUgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZMU1NJUmVhZEJhY2sgPSByRlBHQTBfWEFfTFNTSVJlYWRCYWNrOwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZkxTU0lSZWFkQmFjayA9IHJGUEdBMF9YQl9MU1NJUmVhZEJhY2s7Ci0KLQkvKiAgVHJhbmNlaXZlciBMU1NJIFJlYWRiYWNrIFBJIG1vZGUgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZMU1NJUmVhZEJhY2tQaSA9Ci0JCVRyYW5zY2VpdmVyQV9IU1BJX1JlYWRiYWNrOwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZkxTU0lSZWFkQmFja1BpID0KLQkJVHJhbnNjZWl2ZXJCX0hTUElfUmVhZGJhY2s7Ci19Ci0KLS8qICBUaGUgZm9sbG93aW5nIGlzIGZvciBIaWdoIFBvd2VyIFBBICovCi1zdGF0aWMgdm9pZAotc3RvcmVQd3JJbmRleERpZmZSYXRlT2Zmc2V0KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTMyIFJlZ0FkZHIsCi0JCQkgICAgdTMyIEJpdE1hc2ssIHUzMiBEYXRhKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQlpZiAoUmVnQWRkciA9PSByVHhBR0NfQV9SYXRlMThfMDYpIHsKLQkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bMF0gPSBEYXRhOwotCX0KLQlpZiAoUmVnQWRkciA9PSByVHhBR0NfQV9SYXRlNTRfMjQpIHsKLQkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bMV0gPSBEYXRhOwotCX0KLQlpZiAoUmVnQWRkciA9PSByVHhBR0NfQV9DQ0sxX01jczMyKSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzZdID0gRGF0YTsKLQl9Ci0JaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0JfQ0NLMTFfQV9DQ0syXzExICYmIEJpdE1hc2sgPT0gMHhmZmZmZmYwMCkgewotCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVs3XSA9IERhdGE7Ci0JfQotCWlmIChSZWdBZGRyID09IHJUeEFHQ19BX01jczAzX01jczAwKSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzJdID0gRGF0YTsKLQl9Ci0JaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0FfTWNzMDdfTWNzMDQpIHsKLQkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bM10gPSBEYXRhOwotCX0KLQlpZiAoUmVnQWRkciA9PSByVHhBR0NfQV9NY3MxMV9NY3MwOCkgewotCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVs0XSA9IERhdGE7Ci0JfQotCWlmIChSZWdBZGRyID09IHJUeEFHQ19BX01jczE1X01jczEyKSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzVdID0gRGF0YTsKLQl9Ci0JaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0JfUmF0ZTE4XzA2KSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzhdID0gRGF0YTsKLQl9Ci0JaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0JfUmF0ZTU0XzI0KSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzldID0gRGF0YTsKLQl9Ci0JaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0JfQ0NLMV81NV9NY3MzMikgewotCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxNF0gPSBEYXRhOwotCX0KLQlpZiAoUmVnQWRkciA9PSByVHhBR0NfQl9DQ0sxMV9BX0NDSzJfMTEgJiYgQml0TWFzayA9PSAweDAwMDAwMGZmKSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzE1XSA9IERhdGE7Ci0JfQotCWlmIChSZWdBZGRyID09IHJUeEFHQ19CX01jczAzX01jczAwKSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzEwXSA9IERhdGE7Ci0JfQotCWlmIChSZWdBZGRyID09IHJUeEFHQ19CX01jczA3X01jczA0KSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzExXSA9IERhdGE7Ci0JfQotCWlmIChSZWdBZGRyID09IHJUeEFHQ19CX01jczExX01jczA4KSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzEyXSA9IERhdGE7Ci0JfQotCWlmIChSZWdBZGRyID09IHJUeEFHQ19CX01jczE1X01jczEyKSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzEzXSA9IERhdGE7Ci0JCXBIYWxEYXRhLT5wd3JHcm91cENudCsrOwotCX0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRnVuY3Rpb246CXBoeV9Db25maWdCQldpdGhQZ0hlYWRlckZpbGUKLSAqCi0gKiBPdmVydmlldzoJQ29uZmlnIFBIWV9SRUdfUEcgYXJyYXkKLSAqCi0gKiBJbnB1dDogICAgICAgTk9ORQotICoKLSAqIE91dHB1dDogICAgICBOT05FCi0gKgotICogUmV0dXJuOiAgICAgIE5PTkUKLSAqCi0gKiBSZXZpc2VkIEhpc3Rvcnk6Ci0gKiBXaGVuCQlXaG8JUmVtYXJrCi0gKiAxMS8wNi8yMDA4CU1IQwlBZGQgbGF0ZXIhISEhISEuLiBQbGVhc2UgbW9kaWZ5IGZvciBuZXcgZmlsZXMhISEhCi0gKiAxMS8xMC8yMDA4CXR5bmxpCU1vZGlmeSB0byBtZXcgZmlsZXMuCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMJaW50Ci1waHlfQ29uZmlnQkJXaXRoUGdIZWFkZXJGaWxlKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlpbnQgaTsKLQl1MzIgKlJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGVfUEc7Ci0JdTE2IFBIWV9SRUdBcnJheVBHTGVuOwotCi0JUEhZX1JFR0FycmF5UEdMZW4gPSBSdGw4NzIzX1BIWV9SRUdfQXJyYXlfUEdMZW5ndGg7Ci0JUnRsODE5WFBIWV9SRUdBcnJheV9UYWJsZV9QRyA9ICh1MzIgKilSdGw4NzIzX1BIWV9SRUdfQXJyYXlfUEc7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUEhZX1JFR0FycmF5UEdMZW47IGkgPSBpICsgMykgewotCQlzdG9yZVB3ckluZGV4RGlmZlJhdGVPZmZzZXQoQWRhcHRlciwKLQkJCQkJICAgIFJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGVfUEdbaV0sCi0JCQkJCSAgICBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlX1BHW2krMV0sCi0JCQkJCSAgICBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlX1BHW2krMl0pOwotCX0KLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQKLXBoeV9CQjgxOTJDX0NvbmZpZ18xVChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JLyogZm9yIHBhdGggLSBCICovCi0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9UeEluZm8sIDB4MywgMHgyKTsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0ExX1R4SW5mbywgMHgzMDAwMzMsIDB4MjAwMDIyKTsKLQotCS8qICAyMDEwMDUxOSBKb3NlcGg6IEFkZCBmb3IgMVQyUiBjb25maWcuIFN1Z2dlc3RlZCBieSBLZXZpbiwKLQkgICAgSmVueXUgYW5kIFl1bmFuLiAqLwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByQ0NLMF9BRkVTZXR0aW5nLCBiTWFza0J5dGUzLCAweDQ1KTsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0wX1RSeFBhdGhFbmFibGUsIGJNYXNrQnl0ZTAsIDB4MjMpOwotCS8qICBCIHBhdGggZmlyc3QgQUdDICovCi0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9BR0NQYXJhbWV0ZXIxLCAweDMwLCAweDEpOwotCi0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIDB4ZTc0LCAweDBjMDAwMDAwLCAweDIpOwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCAweGU3OCwgMHgwYzAwMDAwMCwgMHgyKTsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgMHhlN2MsIDB4MGMwMDAwMDAsIDB4Mik7Ci0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIDB4ZTgwLCAweDBjMDAwMDAwLCAweDIpOwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCAweGU4OCwgMHgwYzAwMDAwMCwgMHgyKTsKLX0KLQotc3RhdGljIGludAotcGh5X0JCODcyM2FfQ29uZmlnX1BhcmFGaWxlKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgZWVwcm9tX3ByaXYgKnBFRVBST00gPSBHRVRfRUVQUk9NX0VGVVNFX1BSSVYoQWRhcHRlcik7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlpbnQgcnRTdGF0dXMgPSBfU1VDQ0VTUzsKLQotCS8qICAqLwotCS8qICAxLiBSZWFkIFBIWV9SRUcuVFhUIEJCIElOSVQhISAqLwotCS8qICBXZSB3aWxsIHNlcGFyYXRlIGFzIDg4QyAvIDkyQyBhY2NvcmRpbmcgdG8gY2hpcCB2ZXJzaW9uICovCi0JLyogICovCi0JT0RNX1JlYWRBbmRDb25maWdfUEhZX1JFR18xVF84NzIzQSgmcEhhbERhdGEtPm9kbXByaXYpOwotCi0JLyogICovCi0JLyogIDIwMTAwMzE4IEpvc2VwaDogQ29uZmlnIDJUMlIgdG8gMVQyUiBpZiBuZWNlc3NhcnkuICovCi0JLyogICovCi0JaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzFUMlIpIHsKLQkJcGh5X0JCODE5MkNfQ29uZmlnXzFUKEFkYXB0ZXIpOwotCQlEQkdfODcyM0EoInBoeV9CQjg3MjNhX0NvbmZpZ19QYXJhRmlsZSgpOkNvbmZpZyB0byAxVCEhXG4iKTsKLQl9Ci0KLQkvKiAgKi8KLQkvKiAgMi4gSWYgRUVQUk9NIG9yIEVGVVNFIGF1dG9sb2FkIE9LLCBXZSBtdXN0IGNvbmZpZyBieQotCSAgICBQSFlfUkVHX1BHLnR4dCAqLwotCS8qICAqLwotCWlmIChwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnID09IGZhbHNlKSB7Ci0JCXBIYWxEYXRhLT5wd3JHcm91cENudCA9IDA7Ci0KLQkJcnRTdGF0dXMgPSBwaHlfQ29uZmlnQkJXaXRoUGdIZWFkZXJGaWxlKEFkYXB0ZXIpOwotCX0KLQotCWlmIChydFN0YXR1cyAhPSBfU1VDQ0VTUykKLQkJZ290byBwaHlfQkI4MTkwX0NvbmZpZ19QYXJhRmlsZV9GYWlsOwotCi0JLyogICovCi0JLyogIDMuIEJCIEFHQyB0YWJsZSBJbml0aWFsaXphdGlvbiAqLwotCS8qICAqLwotCU9ETV9SZWFkQW5kQ29uZmlnX0FHQ19UQUJfMVRfODcyM0EoJnBIYWxEYXRhLT5vZG1wcml2KTsKLQotcGh5X0JCODE5MF9Db25maWdfUGFyYUZpbGVfRmFpbDoKLQotCXJldHVybiBydFN0YXR1czsKLX0KLQotaW50Ci1QSFlfQkJDb25maWc4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JaW50IHJ0U3RhdHVzID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQl1OCBUbXBVMUIgPSAwOwotCXU4IENyeXN0YWxDYXA7Ci0KLQlwaHlfSW5pdEJCUkZSZWdpc3RlckRlZmluaXRpb24oQWRhcHRlcik7Ci0KLQkvKiAgU3VnZ2VzdGVkIGJ5IFNjb3R0LiB0eW5saV90ZXN0LiAyMDEwLjEyLjMwLiAqLwotCS8qIDEuIDB4MjhbMV0gPSAxICovCi0JVG1wVTFCID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIFJFR19BRkVfUExMX0NUUkwpOwotCXVkZWxheSgyKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19BRkVfUExMX0NUUkwsIFRtcFUxQiB8IEJJVCgxKSk7Ci0JdWRlbGF5KDIpOwotCi0JLyogMi4gMHgyOVs3OjBdID0gMHhGRiAqLwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX0FGRV9QTExfQ1RSTCsxLCAweGZmKTsKLQl1ZGVsYXkoMik7Ci0KLQkvKiAzLiAweDAyWzE6MF0gPSAyYicxMSAqLwotCVRtcFUxQiA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4pOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1NZU19GVU5DX0VOLAotCQkJIChUbXBVMUIgfCBGRU5fQkJfR0xCX1JTVG4gfCBGRU5fQkJSU1RCKSk7Ci0KLQkvKiA0LiAweDI1WzZdID0gMCAqLwotCVRtcFUxQiA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfQUZFX1hUQUxfQ1RSTCArIDEpOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX0FGRV9YVEFMX0NUUkwrMSwgVG1wVTFCICYgfkJJVCg2KSk7Ci0KLQkvKiA1LiAweDI0WzIwXSA9IDAJQWR2aXNlZCBieSBTRDMgQWxleCBXYW5nLiAyMDExLjAyLjA5LiAqLwotCVRtcFUxQiA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfQUZFX1hUQUxfQ1RSTCsyKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19BRkVfWFRBTF9DVFJMKzIsIFRtcFUxQiAmIH5CSVQoNCkpOwotCi0JLyogNi4gMHgxZls3OjBdID0gMHgwNyAqLwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1JGX0NUUkwsIDB4MDcpOwotCi0JLyogICovCi0JLyogIENvbmZpZyBCQiBhbmQgQUdDICovCi0JLyogICovCi0JcnRTdGF0dXMgPSBwaHlfQkI4NzIzYV9Db25maWdfUGFyYUZpbGUoQWRhcHRlcik7Ci0KLS8qIG9ubHkgZm9yIEItY3V0ICovCi0JaWYgKHBIYWxEYXRhLT5FRVBST01WZXJzaW9uID49IDB4MDEpIHsKLQkJQ3J5c3RhbENhcCA9IHBIYWxEYXRhLT5DcnlzdGFsQ2FwICYgMHgzRjsKLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIFJFR19NQUNfUEhZX0NUUkwsIDB4RkZGMDAwLAotCQkJICAgICAoQ3J5c3RhbENhcCB8IChDcnlzdGFsQ2FwIDw8IDYpKSk7Ci0JfQotCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0xET0ExNV9DVFJMLCAweDAxNTcyNTA1KTsKLQlyZXR1cm4gcnRTdGF0dXM7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOiAgICBTZXRUeFBvd2VyTGV2ZWw4NzIzQSgpCi0gKgotICogT3ZlcnZpZXc6ICAgIFRoaXMgZnVuY3Rpb24gaXMgZXhwb3J0IHRvICJIYWxDb21tb24iIG1vdWR1bGUKLSAqCQkJV2UgbXVzdCBjb25zaWRlciBSRiBwYXRoIGxhdGVyISEhISEhIQotICoKLSAqIElucHV0OiAgICAgICBzdHJ1Y3QgcnR3X2FkYXB0ZXIgKgkJQWRhcHRlcgotICoJCQl1OAkJY2hhbm5lbAotICoKLSAqIE91dHB1dDogICAgICBOT05FCi0gKgotICogUmV0dXJuOiAgICAgIE5PTkUKLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIFBIWV9TZXRUeFBvd2VyTGV2ZWw4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4IGNoYW5uZWwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQl1OCBjY2twd3JbMl0sIG9mZG1wd3JbMl07CS8qICBbMF06UkYtQSwgWzFdOlJGLUIgKi8KLQlpbnQgaSA9IGNoYW5uZWwgLSAxOwotCi0JaWYgKHBIYWxEYXRhLT5iVFhQb3dlckRhdGFSZWFkRnJvbUVFUE9STSA9PSBmYWxzZSkKLQkJcmV0dXJuOwotCi0JLyogIDEuIENDSyAqLwotCWNja3B3cltSRl9QQVRIX0FdID0gcEhhbERhdGEtPlR4UHdyTGV2ZWxDY2tbUkZfUEFUSF9BXVtpXTsKLQljY2twd3JbUkZfUEFUSF9CXSA9IHBIYWxEYXRhLT5UeFB3ckxldmVsQ2NrW1JGX1BBVEhfQl1baV07Ci0KLQkvKiAgMi4gT0ZETSBmb3IgMVMgb3IgMlMgKi8KLQlpZiAoR0VUX1JGX1RZUEUoQWRhcHRlcikgPT0gUkZfMVQyUiB8fAotCSAgICBHRVRfUkZfVFlQRShBZGFwdGVyKSA9PSBSRl8xVDFSKSB7Ci0JCS8qICBSZWFkIEhUIDQwIE9GRE0gVFggcG93ZXIgKi8KLQkJb2ZkbXB3cltSRl9QQVRIX0FdID0gcEhhbERhdGEtPlR4UHdyTGV2ZWxIVDQwXzFTW1JGX1BBVEhfQV1baV07Ci0JCW9mZG1wd3JbUkZfUEFUSF9CXSA9IHBIYWxEYXRhLT5UeFB3ckxldmVsSFQ0MF8xU1tSRl9QQVRIX0JdW2ldOwotCX0gZWxzZSBpZiAoR0VUX1JGX1RZUEUoQWRhcHRlcikgPT0gUkZfMlQyUikgewotCQkvKiAgUmVhZCBIVCA0MCBPRkRNIFRYIHBvd2VyICovCi0JCW9mZG1wd3JbUkZfUEFUSF9BXSA9IHBIYWxEYXRhLT5UeFB3ckxldmVsSFQ0MF8yU1tSRl9QQVRIX0FdW2ldOwotCQlvZmRtcHdyW1JGX1BBVEhfQl0gPSBwSGFsRGF0YS0+VHhQd3JMZXZlbEhUNDBfMlNbUkZfUEFUSF9CXVtpXTsKLQl9Ci0KLQlydGw4MjNhX3BoeV9yZjYwNTJzZXRjY2t0eHBvd2VyKEFkYXB0ZXIsICZjY2twd3JbMF0pOwotCXJ0bDg3MjNhX1BIWV9SRjYwNTJTZXRPRkRNVHhQb3dlcihBZGFwdGVyLCAmb2ZkbXB3clswXSwgY2hhbm5lbCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOiAgICBQSFlfU2V0QldNb2RlMjNhQ2FsbGJhY2s4MTkyQygpCi0gKgotICogT3ZlcnZpZXc6ICAgIFRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBTZXRTZXRCV01vZGUyM2EKLSAqCi0gKiBJbnB1dDoJCVBSVF9USU1FUgkJcFRpbWVyCi0gKgotICogT3V0cHV0OiAgICAgIE5PTkUKLSAqCi0gKiBSZXR1cm46ICAgICAgTk9ORQotICoKLSAqIE5vdGU6Ci0gKgkoMSkgV2UgZG8gbm90IHRha2UgaiBtb2RlIGludG8gY29uc2lkZXJhdGlvbiBub3cKLSAqCSgyKSBXaWxsIHR3byB3b3JraXRlbSBvZiAic3dpdGNoIGNoYW5uZWwiIGFuZAotICoJICAgICJzd2l0Y2ggY2hhbm5lbCBiYW5kd2lkdGgiIHJ1biBjb25jdXJyZW50bHk/Ci0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZAotX1BIWV9TZXRCV01vZGUyM2E5MkMoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0JdTggcmVnQndPcE1vZGU7Ci0JdTggcmVnUlJTUl9SU0M7Ci0KLQlpZiAoQWRhcHRlci0+YkRyaXZlclN0b3BwZWQpCi0JCXJldHVybjsKLQotCS8qIDMgKi8KLQkvKiAzPDE+U2V0IE1BQyByZWdpc3RlciAqLwotCS8qIDMgKi8KLQotCXJlZ0J3T3BNb2RlID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIFJFR19CV09QTU9ERSk7Ci0JcmVnUlJTUl9SU0MgPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgUkVHX1JSU1IrMik7Ci0KLQlzd2l0Y2ggKHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbEJXKSB7Ci0JY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwOgotCQlyZWdCd09wTW9kZSB8PSBCV19PUE1PREVfMjBNSFo7Ci0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX0JXT1BNT0RFLCByZWdCd09wTW9kZSk7Ci0JCWJyZWFrOwotCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF80MDoKLQkJcmVnQndPcE1vZGUgJj0gfkJXX09QTU9ERV8yME1IWjsKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfQldPUE1PREUsIHJlZ0J3T3BNb2RlKTsKLQkJcmVnUlJTUl9SU0MgPSAocmVnUlJTUl9SU0MgJiAweDkwKSB8Ci0JCQkocEhhbERhdGEtPm5DdXI0ME1oelByaW1lU0MgPDwgNSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1JSU1IrMiwgcmVnUlJTUl9SU0MpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCS8qIDMgKi8KLQkvKiAzPDI+U2V0IFBIWSByZWxhdGVkIHJlZ2lzdGVyICovCi0JLyogMyAqLwotCXN3aXRjaCAocEhhbERhdGEtPkN1cnJlbnRDaGFubmVsQlcpIHsKLQkJLyogMjAgTUh6IGNoYW5uZWwqLwotCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMDoKLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCwgYlJGTU9ELCAweDApOwotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0ExX1JGTU9ELCBiUkZNT0QsIDB4MCk7Ci0JCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMiwgQklUKDEwKSwgMSk7Ci0KLQkJYnJlYWs7Ci0KLQkJLyogNDAgTUh6IGNoYW5uZWwqLwotCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF80MDoKLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCwgYlJGTU9ELCAweDEpOwotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0ExX1JGTU9ELCBiUkZNT0QsIDB4MSk7Ci0KLQkJLyogIFNldCBDb250cm9sIGNoYW5uZWwgdG8gdXBwZXIgb3IgbG93ZXIuIFRoZXNlIHNldHRpbmdzCi0JCSAgICBhcmUgcmVxdWlyZWQgb25seSBmb3IgNDBNSHogKi8KLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJDQ0swX1N5c3RlbSwgYkNDS1NpZGVCYW5kLAotCQkJICAgICAocEhhbERhdGEtPm5DdXI0ME1oelByaW1lU0MgPj4gMSkpOwotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0xX0xTVEYsIDB4QzAwLAotCQkJICAgICBwSGFsRGF0YS0+bkN1cjQwTWh6UHJpbWVTQyk7Ci0JCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMiwgQklUKDEwKSwgMCk7Ci0KLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIDB4ODE4LCBCSVQoMjYpIHwgQklUKDI3KSwKLQkJCSAgICAgKHBIYWxEYXRhLT5uQ3VyNDBNaHpQcmltZVNDID09Ci0JCQkgICAgICBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIpID8gMjoxKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JLyogU2tpcCBvdmVyIHNldHRpbmcgb2YgSi1tb2RlIGluIEJCIHJlZ2lzdGVyIGhlcmUuIERlZmF1bHQgdmFsdWUKLQkgICBpcyAiTm9uZSBKIG1vZGUiLiBFbWlseSAyMDA3MDMxNSAqLwotCi0JLyogIEFkZGVkIGl0IGZvciAyMC80MCBtaHogc3dpdGNoIHRpbWUgZXZhbHVhdGlvbiBieSBndWFuZ2FuIDA3MDUzMSAqLwotCS8qIE5vd0wgPSBQbGF0Zm9ybUVGSU9SZWFkNEJ5dGUoQWRhcHRlciwgVFNGUik7ICovCi0JLyogTm93SCA9IFBsYXRmb3JtRUZJT1JlYWQ0Qnl0ZShBZGFwdGVyLCBUU0ZSKzQpOyAqLwotCS8qIEVuZFRpbWUgPSAoKHU2NClOb3dIIDw8IDMyKSArIE5vd0w7ICovCi0KLQlydGw4NzIzYV9waHlfcmY2MDUyc2V0X2J3KEFkYXB0ZXIsIHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbEJXKTsKLX0KLQotIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOiAgIFNldEJXTW9kZTIzYTgxOTBQY2koKQotICoKLSAqIE92ZXJ2aWV3OiAgVGhpcyBmdW5jdGlvbiBpcyBleHBvcnQgdG8gIkhhbENvbW1vbiIgbW91ZHVsZQotICoKLSAqIElucHV0OgkJc3RydWN0IHJ0d19hZGFwdGVyICoJCQlBZGFwdGVyCi0gKgkJCWVudW0gaHRfY2hhbm5lbF93aWR0aAlCYW5kd2lkdGgJMjBNIG9yIDQwTQotICoKLSAqIE91dHB1dDogICAgICBOT05FCi0gKgotICogUmV0dXJuOiAgICAgIE5PTkUKLSAqCi0gKiBOb3RlOgkJV2UgZG8gbm90IHRha2UgaiBtb2RlIGludG8gY29uc2lkZXJhdGlvbiBub3cKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQKLVBIWV9TZXRCV01vZGUyM2E4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsCi0JCSAgIGVudW0gaHRfY2hhbm5lbF93aWR0aCBCYW5kd2lkdGgsIHVuc2lnbmVkIGNoYXIgT2Zmc2V0KQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0JZW51bSBodF9jaGFubmVsX3dpZHRoIHRtcEJXID0gcEhhbERhdGEtPkN1cnJlbnRDaGFubmVsQlc7Ci0KLQlwSGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVyA9IEJhbmR3aWR0aDsKLQotCXBIYWxEYXRhLT5uQ3VyNDBNaHpQcmltZVNDID0gT2Zmc2V0OwotCi0JaWYgKCghQWRhcHRlci0+YkRyaXZlclN0b3BwZWQpICYmICghQWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkpCi0JCV9QSFlfU2V0QldNb2RlMjNhOTJDKEFkYXB0ZXIpOwotCWVsc2UKLQkJcEhhbERhdGEtPkN1cnJlbnRDaGFubmVsQlcgPSB0bXBCVzsKLX0KLQotc3RhdGljIHZvaWQgX1BIWV9Td0Nobmw4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4IGNoYW5uZWwpCi17Ci0JZW51bSBSRl9SQURJT19QQVRIIGVSRlBhdGg7Ci0JdTMyIHBhcmFtMSwgcGFyYW0yOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQkvKiBzMS4gcHJlIGNvbW1vbiBjb21tYW5kIC0gQ21kSURfU2V0VHhQb3dlckxldmVsICovCi0JUEhZX1NldFR4UG93ZXJMZXZlbDg3MjNBKEFkYXB0ZXIsIGNoYW5uZWwpOwotCi0JLyogczIuIFJGIGRlcGVuZGVudCBjb21tYW5kIC0gQ21kSURfUkZfV3JpdGVSZWcsCi0JICAgcGFyYW0xID0gUkZfQ0hOTEJXLCBwYXJhbTIgPSBjaGFubmVsICovCi0JcGFyYW0xID0gUkZfQ0hOTEJXOwotCXBhcmFtMiA9IGNoYW5uZWw7Ci0JZm9yIChlUkZQYXRoID0gMDsgZVJGUGF0aCA8IHBIYWxEYXRhLT5OdW1Ub3RhbFJGUGF0aDsgZVJGUGF0aCsrKSB7Ci0JCXBIYWxEYXRhLT5SZlJlZ0NobmxWYWxbZVJGUGF0aF0gPQotCQkJKHBIYWxEYXRhLT5SZlJlZ0NobmxWYWxbZVJGUGF0aF0gJiAweGZmZmZmYzAwKSB8IHBhcmFtMjsKLQkJUEhZX1NldFJGUmVnKEFkYXB0ZXIsIGVSRlBhdGgsIHBhcmFtMSwKLQkJCSAgICAgYlJGUmVnT2Zmc2V0TWFzaywgcEhhbERhdGEtPlJmUmVnQ2hubFZhbFtlUkZQYXRoXSk7Ci0JfQotCi0JLyogczMuIHBvc3QgY29tbW9uIGNvbW1hbmQgLSBDbWRJRF9FbmQsIE5vbmUgKi8KLX0KLQotdm9pZCBQSFlfU3dDaG5sODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1OCBjaGFubmVsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0JdTggdG1wY2hhbm5lbCA9IHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbDsKLQlib29sICByZXN1bHQgPSB0cnVlOwotCi0JaWYgKGNoYW5uZWwgPT0gMCkKLQkJY2hhbm5lbCA9IDE7Ci0KLQlwSGFsRGF0YS0+Q3VycmVudENoYW5uZWwgPSBjaGFubmVsOwotCi0JaWYgKCghQWRhcHRlci0+YkRyaXZlclN0b3BwZWQpICYmICghQWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkpIHsKLQkJX1BIWV9Td0Nobmw4NzIzQShBZGFwdGVyLCBjaGFubmVsKTsKLQotCQlpZiAoIXJlc3VsdCkKLQkJCXBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbCA9IHRtcGNoYW5uZWw7Ci0JfSBlbHNlIHsKLQkJcEhhbERhdGEtPkN1cnJlbnRDaGFubmVsID0gdG1wY2hhbm5lbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9yZjYwNTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3JmNjA1Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGMwZmYzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3JmNjA1Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqCi0gKiBNb2R1bGU6CXJ0bDgxOTJjX3JmNjA1Mi5jCShTb3VyY2UgQyBGaWxlKQotICoKLSAqIE5vdGU6CVByb3ZpZGUgUkYgNjA1MiBzZXJpZXMgcmVsYXRpdmUgQVBJLgotICoKLSAqIEZ1bmN0aW9uOgotICoKLSAqIEV4cG9ydDoKLSAqCi0gKiBBYmJyZXY6Ci0gKgotICogSGlzdG9yeToKLSAqIERhdGEJCQlXaG8JCVJlbWFyawotICoKLSAqIDA5LzI1LzIwMDgJTUhDCQlDcmVhdGUgaW5pdGlhbCB2ZXJzaW9uLgotICogMTEvMDUvMjAwOAlNSEMJCUFkZCBBUEkgZm9yIHR3IHBvd2VyIHNldHRpbmcuCi0gKgotICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBfUlRMODcyM0FfUkY2MDUyX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOiAgICBQSFlfUkY2MDUyU2V0QmFuZHdpZHRoKCkKLSAqCi0gKiBPdmVydmlldzogICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgU2V0QldNb2RlMjNhQ2FsbGJhY2s4MTkwUGNpKCkgb25seQotICoKLSAqIElucHV0OiAgICAgICBzdHJ1Y3QgcnR3X2FkYXB0ZXIgKgkJCQlBZGFwdGVyCi0gKgkJCVdJUkVMRVNTX0JBTkRXSURUSF9FCUJhbmR3aWR0aAkyME0gb3IgNDBNCi0gKgotICogT3V0cHV0OiAgICAgIE5PTkUKLSAqCi0gKiBSZXR1cm46ICAgICAgTk9ORQotICoKLSAqIE5vdGU6CQlGb3IgUkYgdHlwZSAwMjIyRAotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBydGw4NzIzYV9waHlfcmY2MDUyc2V0X2J3KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJCSAgICAgICBlbnVtIGh0X2NoYW5uZWxfd2lkdGggQmFuZHdpZHRoKQkvKiAyME0gb3IgNDBNICovCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQotCXN3aXRjaCAoQmFuZHdpZHRoKSB7Ci0JY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwOgotCQlwSGFsRGF0YS0+UmZSZWdDaG5sVmFsWzBdID0KLQkJCShwSGFsRGF0YS0+UmZSZWdDaG5sVmFsWzBdICYgMHhmZmZmZjNmZikgfCAweDA0MDA7Ci0JCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0EsIFJGX0NITkxCVywgYlJGUmVnT2Zmc2V0TWFzaywKLQkJCSAgICAgcEhhbERhdGEtPlJmUmVnQ2hubFZhbFswXSk7Ci0JCWJyZWFrOwotCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF80MDoKLQkJcEhhbERhdGEtPlJmUmVnQ2hubFZhbFswXSA9Ci0JCQkocEhhbERhdGEtPlJmUmVnQ2hubFZhbFswXSAmIDB4ZmZmZmYzZmYpOwotCQlQSFlfU2V0UkZSZWcoQWRhcHRlciwgUkZfUEFUSF9BLCBSRl9DSE5MQlcsIGJSRlJlZ09mZnNldE1hc2ssCi0JCQkgICAgIHBIYWxEYXRhLT5SZlJlZ0NobmxWYWxbMF0pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOglQSFlfUkY2MDUyU2V0Q2NrVHhQb3dlcgotICoKLSAqIE92ZXJ2aWV3OgotICoKLSAqIElucHV0OiAgICAgICBOT05FCi0gKgotICogT3V0cHV0OiAgICAgIE5PTkUKLSAqCi0gKiBSZXR1cm46ICAgICAgTk9ORQotICoKLSAqIFJldmlzZWQgSGlzdG9yeToKLSAqIFdoZW4JCQlXaG8JCVJlbWFyawotICogMTEvMDUvMjAwOAlNSEMJCVNpbXVsYXRlIDgxOTJzZXJpZXMuLgotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBydGw4MjNhX3BoeV9yZjYwNTJzZXRjY2t0eHBvd2VyKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJCQkgICAgIHU4ICpwUG93ZXJsZXZlbCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2ICpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJkFkYXB0ZXItPm1sbWVleHRwcml2OwotCXUzMiBUeEFHQ1syXSA9IHswLCAwfSwgdG1wdmFsID0gMDsKLQl1OCBpZHgxLCBpZHgyOwotCXU4ICpwdHI7Ci0KLQlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID09IFNDQU5fUFJPQ0VTUykgewotCQlUeEFHQ1tSRl9QQVRIX0FdID0gMHgzZjNmM2YzZjsKLQkJVHhBR0NbUkZfUEFUSF9CXSA9IDB4M2YzZjNmM2Y7Ci0KLQkJZm9yIChpZHgxID0gUkZfUEFUSF9BOyBpZHgxIDw9IFJGX1BBVEhfQjsgaWR4MSsrKSB7Ci0JCQlUeEFHQ1tpZHgxXSA9IHBQb3dlcmxldmVsW2lkeDFdIHwKLQkJCQkocFBvd2VybGV2ZWxbaWR4MV0gPDwgOCkgfAotCQkJCShwUG93ZXJsZXZlbFtpZHgxXSA8PCAxNikgfAotCQkJCShwUG93ZXJsZXZlbFtpZHgxXSA8PCAyNCk7Ci0JCQkvKgotCQkJICogMjAxMC8xMC8xOCBNSCBGb3IgZXh0ZXJuYWwgUEEgbW9kdWxlLiBXZSBuZWVkCi0JCQkgKiB0byBsaW1pdCBwb3dlciBpbmRleCB0byBiZSBsZXNzIHRoYW4gMHgyMC4KLQkJCSAqLwotCQkJaWYgKFR4QUdDW2lkeDFdID4gMHgyMCAmJiBwSGFsRGF0YS0+RXh0ZXJuYWxQQSkKLQkJCQlUeEFHQ1tpZHgxXSA9IDB4MjA7Ci0JCX0KLQl9IGVsc2UgewotLyogIDIwMTAwNDI3IEpvc2VwaDogRHJpdmVyIGR5bmFtaWMgVHggcG93ZXIgc2hhbGwgbm90IGFmZmVjdCBUeAotICogIHBvd2VyLiBJdCBzaGFsbCBiZSBkZXRlcm1pbmVkIGJ5IHBvd2VyIHRyYWluaW5nIG1lY2hhbmlzbS4gKi8KLS8qICBDdXJyZW50bHksIHdlIGNhbm5vdCBmdWxseSBkaXNhYmxlIGRyaXZlciBkeW5hbWljIHR4IHBvd2VyCi0gKiAgbWVjaGFuaXNtIGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZCBieSBCVCBjb2V4aXN0IG1lY2hhbmlzbS4gKi8KLS8qICBJbiB0aGUgZnV0dXJlLCB0d28gbWVjaGFuaXNtIHNoYWxsIGJlIHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIKLSAqICBhbmQgbWFpbnRhaW5lZCBpbmRlcGVuZGVudGx5LiBUaGFua3MgZm9yIExhbmhzaW4ncyByZW1pbmRlci4gKi8KLQkJaWYgKHBkbXByaXYtPkR5bmFtaWNUeEhpZ2hQb3dlckx2bCA9PSBUeEhpZ2hQd3JMZXZlbF9MZXZlbDEpIHsKLQkJCVR4QUdDW1JGX1BBVEhfQV0gPSAweDEwMTAxMDEwOwotCQkJVHhBR0NbUkZfUEFUSF9CXSA9IDB4MTAxMDEwMTA7Ci0JCX0gZWxzZSBpZiAocGRtcHJpdi0+RHluYW1pY1R4SGlnaFBvd2VyTHZsID09Ci0JCQkgICBUeEhpZ2hQd3JMZXZlbF9MZXZlbDIpIHsKLQkJCVR4QUdDW1JGX1BBVEhfQV0gPSAweDAwMDAwMDAwOwotCQkJVHhBR0NbUkZfUEFUSF9CXSA9IDB4MDAwMDAwMDA7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGlkeDEgPSBSRl9QQVRIX0E7IGlkeDEgPD0gUkZfUEFUSF9COyBpZHgxKyspIHsKLQkJCQlUeEFHQ1tpZHgxXSA9IHBQb3dlcmxldmVsW2lkeDFdIHwKLQkJCQkJKHBQb3dlcmxldmVsW2lkeDFdIDw8IDgpIHwKLQkJCQkJKHBQb3dlcmxldmVsW2lkeDFdIDw8IDE2KSB8Ci0JCQkJCShwUG93ZXJsZXZlbFtpZHgxXSA8PCAyNCk7Ci0JCQl9Ci0KLQkJCWlmIChwSGFsRGF0YS0+RUVQUk9NUmVndWxhdG9yeSA9PSAwKSB7Ci0JCQkJdG1wdmFsID0gKHBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFswXVs2XSkgKwotCQkJCQkJKHBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFswXVs3XTw8OCk7Ci0JCQkJVHhBR0NbUkZfUEFUSF9BXSArPSB0bXB2YWw7Ci0KLQkJCQl0bXB2YWwgPSAocEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzBdWzE0XSkgKwotCQkJCQkJKHBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFswXVsxNV08PDI0KTsKLQkJCQlUeEFHQ1tSRl9QQVRIX0JdICs9IHRtcHZhbDsKLQkJCX0KLQkJfQotCX0KLQotCWZvciAoaWR4MSA9IFJGX1BBVEhfQTsgaWR4MSA8PSBSRl9QQVRIX0I7IGlkeDErKykgewotCQlwdHIgPSAodTggKikoJlR4QUdDW2lkeDFdKTsKLQkJZm9yIChpZHgyID0gMDsgaWR4MiA8IDQ7IGlkeDIrKykgewotCQkJaWYgKCpwdHIgPiBSRjYwNTJfTUFYX1RYX1BXUikKLQkJCQkqcHRyID0gUkY2MDUyX01BWF9UWF9QV1I7Ci0JCQlwdHIrKzsKLQkJfQotCX0KLQotCS8qICByZi1BIGNjayB0eCBwb3dlciAqLwotCXRtcHZhbCA9IFR4QUdDW1JGX1BBVEhfQV0gJiAweGZmOwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByVHhBR0NfQV9DQ0sxX01jczMyLCBiTWFza0J5dGUxLCB0bXB2YWwpOwotCXRtcHZhbCA9IFR4QUdDW1JGX1BBVEhfQV0gPj4gODsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgclR4QUdDX0JfQ0NLMTFfQV9DQ0syXzExLCAweGZmZmZmZjAwLCB0bXB2YWwpOwotCi0JLyogIHJmLUIgY2NrIHR4IHBvd2VyICovCi0JdG1wdmFsID0gVHhBR0NbUkZfUEFUSF9CXSA+PiAyNDsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgclR4QUdDX0JfQ0NLMTFfQV9DQ0syXzExLCBiTWFza0J5dGUwLCB0bXB2YWwpOwotCXRtcHZhbCA9IFR4QUdDW1JGX1BBVEhfQl0gJiAweDAwZmZmZmZmOwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByVHhBR0NfQl9DQ0sxXzU1X01jczMyLCAweGZmZmZmZjAwLCB0bXB2YWwpOwotfQkvKiBQSFlfUkY2MDUyU2V0Q2NrVHhQb3dlciAqLwotCi0vKiAgcG93ZXJiYXNlMCBmb3IgT0ZETSByYXRlcyAqLwotLyogIHBvd2VyYmFzZTEgZm9yIEhUIE1DUyByYXRlcyAqLwotc3RhdGljIHZvaWQgZ2V0UG93ZXJCYXNlKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTggKnBQb3dlckxldmVsLAotCQkJIHU4IENoYW5uZWwsIHUzMiAqT2ZkbUJhc2UsIHUzMiAqTUNTQmFzZSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXUzMiBvZmRtLCBtY3M7Ci0JdTggTGVnYWN5X3B3cmRpZmYgPSAwOwotCXM4IEhUMjBfcHdyZGlmZiA9IDA7Ci0JdTggaSwgcG93ZXJsZXZlbFsyXTsKLQotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJcG93ZXJsZXZlbFtpXSA9IHBQb3dlckxldmVsW2ldOwotCQlMZWdhY3lfcHdyZGlmZiA9IHBIYWxEYXRhLT5UeFB3ckxlZ2FjeUh0RGlmZltpXVtDaGFubmVsLTFdOwotCQlvZmRtID0gcG93ZXJsZXZlbFtpXSArIExlZ2FjeV9wd3JkaWZmOwotCi0JCW9mZG0gPSBvZmRtIDw8IDI0IHwgb2ZkbSA8PCAxNiB8IG9mZG0gPDwgOCB8IG9mZG07Ci0JCSooT2ZkbUJhc2UgKyBpKSA9IG9mZG07Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQkvKiBDaGVjayBIVDIwIHRvIEhUNDAgZGlmZiAqLwotCQlpZiAocEhhbERhdGEtPkN1cnJlbnRDaGFubmVsQlcgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkgewotCQkJSFQyMF9wd3JkaWZmID0gcEhhbERhdGEtPlR4UHdySHQyMERpZmZbaV1bQ2hhbm5lbC0xXTsKLQkJCXBvd2VybGV2ZWxbaV0gKz0gSFQyMF9wd3JkaWZmOwotCQl9Ci0JCW1jcyA9IHBvd2VybGV2ZWxbaV07Ci0JCW1jcyA9IG1jcyA8PCAyNCB8IG1jcyA8PCAxNiB8IG1jcyA8PCA4IHwgbWNzOwotCQkqKE1DU0Jhc2UgKyBpKSA9IG1jczsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZXRUeFBvd2VyV3JpdGVWYWxCeVJlZ3VsYXRvcnkoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1OCBDaGFubmVsLAotCQkJICAgICAgIHU4IGluZGV4LCB1MzIgKnBvd2VyQmFzZTAsIHUzMiAqcG93ZXJCYXNlMSwKLQkJCSAgICAgICB1MzIgKnBPdXRXcml0ZVZhbCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0JdTggaSwgY2hubEdyb3VwID0gMCwgcHdyX2RpZmZfbGltaXRbNF07Ci0JdTMyIHdyaXRlVmFsLCBjdXN0b21lcl9saW1pdCwgcmY7Ci0KLQkvKiAgSW5kZXggMCAmIDEgPSBsZWdhY3kgT0ZETSwgMi01ID0gSFRfTUNTIHJhdGUgKi8KLQlmb3IgKHJmID0gMDsgcmYgPCAyOyByZisrKSB7Ci0JCXN3aXRjaCAocEhhbERhdGEtPkVFUFJPTVJlZ3VsYXRvcnkpIHsKLQkJY2FzZSAwOgkvKiAgUmVhbHRlayBiZXR0ZXIgcGVyZm9ybWFuY2UgKi8KLQkJCS8qICBpbmNyZWFzZSBwb3dlciBkaWZmIGRlZmluZWQgYnkgUmVhbHRlayBmb3IKLQkJCSAqICBsYXJnZSBwb3dlciAqLwotCQkJY2hubEdyb3VwID0gMDsKLQkJCXdyaXRlVmFsID0gcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2NobmxHcm91cF1baW5kZXgrKHJmPzg6MCldICsKLQkJCQkoKGluZGV4IDwgMikgPyBwb3dlckJhc2UwW3JmXSA6IHBvd2VyQmFzZTFbcmZdKTsKLQkJCWJyZWFrOwotCQljYXNlIDE6CS8qICBSZWFsdGVrIHJlZ3VsYXRvcnkgKi8KLQkJCS8qICBpbmNyZWFzZSBwb3dlciBkaWZmIGRlZmluZWQgYnkgUmVhbHRlayBmb3IKLQkJCSAqICByZWd1bGF0b3J5ICovCi0JCQlpZiAocEhhbERhdGEtPnB3ckdyb3VwQ250ID09IDEpCi0JCQkJY2hubEdyb3VwID0gMDsKLQkJCWlmIChwSGFsRGF0YS0+cHdyR3JvdXBDbnQgPj0gMykgewotCQkJCWlmIChDaGFubmVsIDw9IDMpCi0JCQkJCWNobmxHcm91cCA9IDA7Ci0JCQkJZWxzZSBpZiAoQ2hhbm5lbCA+PSA0ICYmIENoYW5uZWwgPD0gOSkKLQkJCQkJY2hubEdyb3VwID0gMTsKLQkJCQllbHNlIGlmIChDaGFubmVsID4gOSkKLQkJCQkJY2hubEdyb3VwID0gMjsKLQotCQkJCWlmIChwSGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVyA9PQotCQkJCSAgICBIVF9DSEFOTkVMX1dJRFRIXzIwKQotCQkJCQljaG5sR3JvdXArKzsKLQkJCQllbHNlCi0JCQkJCWNobmxHcm91cCArPSA0OwotCQkJfQotCQkJd3JpdGVWYWwgPSBwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbY2hubEdyb3VwXVtpbmRleCsocmY/ODowKV0gKwotCQkJCSAgICgoaW5kZXggPCAyKSA/IHBvd2VyQmFzZTBbcmZdIDoKLQkJCQkgICAgcG93ZXJCYXNlMVtyZl0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoJLyogIEJldHRlciByZWd1bGF0b3J5ICovCi0JCQkvKiAgZG9uJ3QgaW5jcmVhc2UgYW55IHBvd2VyIGRpZmYgKi8KLQkJCXdyaXRlVmFsID0gKGluZGV4IDwgMikgPyBwb3dlckJhc2UwW3JmXSA6Ci0JCQkJICAgIHBvd2VyQmFzZTFbcmZdOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoJLyogIEN1c3RvbWVyIGRlZmluZWQgcG93ZXIgZGlmZi4gKi8KLQkJCWNobmxHcm91cCA9IDA7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCQlwd3JfZGlmZl9saW1pdFtpXSA9ICh1OCkoKHBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtjaG5sR3JvdXBdW2luZGV4ICsKLQkJCQkJCSAgICAocmYgPyA4IDogMCldJigweDdmIDw8IChpKjgpKSkgPj4gKGkqOCkpOwotCQkJCWlmIChwSGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzQwKSB7Ci0JCQkJCWlmIChwd3JfZGlmZl9saW1pdFtpXSA+IHBIYWxEYXRhLT5Qd3JHcm91cEhUNDBbcmZdW0NoYW5uZWwtMV0pCi0JCQkJCQlwd3JfZGlmZl9saW1pdFtpXSA9IHBIYWxEYXRhLT5Qd3JHcm91cEhUNDBbcmZdW0NoYW5uZWwtMV07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHB3cl9kaWZmX2xpbWl0W2ldID4gcEhhbERhdGEtPlB3ckdyb3VwSFQyMFtyZl1bQ2hhbm5lbC0xXSkKLQkJCQkJCXB3cl9kaWZmX2xpbWl0W2ldID0gcEhhbERhdGEtPlB3ckdyb3VwSFQyMFtyZl1bQ2hhbm5lbC0xXTsKLQkJCQl9Ci0JCQl9Ci0JCQljdXN0b21lcl9saW1pdCA9IChwd3JfZGlmZl9saW1pdFszXTw8MjQpIHwgKHB3cl9kaWZmX2xpbWl0WzJdPDwxNikgfAotCQkJCQkJCShwd3JfZGlmZl9saW1pdFsxXTw8OCkgfCAocHdyX2RpZmZfbGltaXRbMF0pOwotCQkJd3JpdGVWYWwgPSBjdXN0b21lcl9saW1pdCArICgoaW5kZXg8Mik/cG93ZXJCYXNlMFtyZl06cG93ZXJCYXNlMVtyZl0pOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQljaG5sR3JvdXAgPSAwOwotCQkJd3JpdGVWYWwgPSBwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbY2hubEdyb3VwXVtpbmRleCsocmY/ODowKV0gKwotCQkJCQkoKGluZGV4IDwgMikgPyBwb3dlckJhc2UwW3JmXSA6IHBvd2VyQmFzZTFbcmZdKTsKLQkJCWJyZWFrOwotCQl9Ci0KLS8qICAyMDEwMDQyNyBKb3NlcGg6IERyaXZlciBkeW5hbWljIFR4IHBvd2VyIHNoYWxsIG5vdCBhZmZlY3QgVHggcG93ZXIuCi0gICAgSXQgc2hhbGwgYmUgZGV0ZXJtaW5lZCBieSBwb3dlciB0cmFpbmluZyBtZWNoYW5pc20uICovCi0vKiAgQ3VycmVudGx5LCB3ZSBjYW5ub3QgZnVsbHkgZGlzYWJsZSBkcml2ZXIgZHluYW1pYyB0eCBwb3dlciBtZWNoYW5pc20KLSAgICBiZWNhdXNlIGl0IGlzIHJlZmVyZW5jZWQgYnkgQlQgY29leGlzdCBtZWNoYW5pc20uICovCi0vKiAgSW4gdGhlIGZ1dHVyZSwgdHdvIG1lY2hhbmlzbSBzaGFsbCBiZSBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyIGFuZAotICAgIG1haW50YWluZWQgaW5kZXBlbmRlbnRseS4gVGhhbmtzIGZvciBMYW5oc2luJ3MgcmVtaW5kZXIuICovCi0KLQkJaWYgKHBkbXByaXYtPkR5bmFtaWNUeEhpZ2hQb3dlckx2bCA9PSBUeEhpZ2hQd3JMZXZlbF9MZXZlbDEpCi0JCQl3cml0ZVZhbCA9IDB4MTQxNDE0MTQ7Ci0JCWVsc2UgaWYgKHBkbXByaXYtPkR5bmFtaWNUeEhpZ2hQb3dlckx2bCA9PQotCQkJIFR4SGlnaFB3ckxldmVsX0xldmVsMikKLQkJCXdyaXRlVmFsID0gMHgwMDAwMDAwMDsKLQotCQkvKiAyMDEwMDYyOCBKb3NlcGg6IEhpZ2ggcG93ZXIgbW9kZSBmb3IgQlQtQ29leGlzdCBtZWNoYW5pc20uICovCi0JCS8qIFRoaXMgbWVjaGFuaXNtIGlzIG9ubHkgYXBwbGllZCB3aGVuCi0JCSAgIERyaXZlci1IaWdocG93ZXItTWVjaGFuaXNtIGlzIE9GRi4gKi8KLQkJaWYgKHBkbXByaXYtPkR5bmFtaWNUeEhpZ2hQb3dlckx2bCA9PSBUeEhpZ2hQd3JMZXZlbF9CVDEpCi0JCQl3cml0ZVZhbCA9IHdyaXRlVmFsIC0gMHgwNjA2MDYwNjsKLQkJZWxzZSBpZiAocGRtcHJpdi0+RHluYW1pY1R4SGlnaFBvd2VyTHZsID09IFR4SGlnaFB3ckxldmVsX0JUMikKLQkJCXdyaXRlVmFsID0gd3JpdGVWYWw7Ci0JCSoocE91dFdyaXRlVmFsICsgcmYpID0gd3JpdGVWYWw7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3cml0ZU9GRE1Qb3dlclJlZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4IGluZGV4LAotCQkJICAgICAgdTMyICpwVmFsdWUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQl1MTYgUmVnT2Zmc2V0X0FbNl0gPSB7Ci0JCXJUeEFHQ19BX1JhdGUxOF8wNiwgclR4QUdDX0FfUmF0ZTU0XzI0LAotCQlyVHhBR0NfQV9NY3MwM19NY3MwMCwgclR4QUdDX0FfTWNzMDdfTWNzMDQsCi0JCXJUeEFHQ19BX01jczExX01jczA4LCByVHhBR0NfQV9NY3MxNV9NY3MxMgotCX07Ci0JdTE2IFJlZ09mZnNldF9CWzZdID0gewotCQlyVHhBR0NfQl9SYXRlMThfMDYsIHJUeEFHQ19CX1JhdGU1NF8yNCwKLQkJclR4QUdDX0JfTWNzMDNfTWNzMDAsIHJUeEFHQ19CX01jczA3X01jczA0LAotCQlyVHhBR0NfQl9NY3MxMV9NY3MwOCwgclR4QUdDX0JfTWNzMTVfTWNzMTIKLQl9OwotCXU4IGksIHJmLCBwd3JfdmFsWzRdOwotCXUzMiB3cml0ZVZhbDsKLQl1MTYgUmVnT2Zmc2V0OwotCi0JZm9yIChyZiA9IDA7IHJmIDwgMjsgcmYrKykgewotCQl3cml0ZVZhbCA9IHBWYWx1ZVtyZl07Ci0JCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCXB3cl92YWxbaV0gPSAodTgpKCh3cml0ZVZhbCAmCi0JCQkJCSAgICgweDdmIDw8IChpICogOCkpKSA+PiAoaSAqIDgpKTsKLQkJCWlmIChwd3JfdmFsW2ldID4gUkY2MDUyX01BWF9UWF9QV1IpCi0JCQkJcHdyX3ZhbFtpXSAgPSBSRjYwNTJfTUFYX1RYX1BXUjsKLQkJfQotCQl3cml0ZVZhbCA9IHB3cl92YWxbM10gPDwgMjQgfCBwd3JfdmFsWzJdIDw8IDE2IHwKLQkJCXB3cl92YWxbMV0gPDwgOCB8IHB3cl92YWxbMF07Ci0KLQkJaWYgKHJmID09IDApCi0JCQlSZWdPZmZzZXQgPSBSZWdPZmZzZXRfQVtpbmRleF07Ci0JCWVsc2UKLQkJCVJlZ09mZnNldCA9IFJlZ09mZnNldF9CW2luZGV4XTsKLQotCQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSZWdPZmZzZXQsIHdyaXRlVmFsKTsKLQotCQkvKiAgMjAxMDA1MTE1IEpvc2VwaDogU2V0IFR4IFBvd2VyIGRpZmYgZm9yIFR4IHBvd2VyCi0JCSAgICB0cmFpbmluZyBtZWNoYW5pc20uICovCi0JCWlmICgoKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIpICYmCi0JCSAgICAoUmVnT2Zmc2V0ID09IHJUeEFHQ19BX01jczE1X01jczEyIHx8Ci0JCSAgICAgUmVnT2Zmc2V0ID09IHJUeEFHQ19CX01jczE1X01jczEyKSkgfHwKLQkJICAgICgocEhhbERhdGEtPnJmX3R5cGUgIT0gUkZfMlQyUikgJiYKLQkJICAgICAoUmVnT2Zmc2V0ID09IHJUeEFHQ19BX01jczA3X01jczA0IHx8Ci0JCSAgICAgIFJlZ09mZnNldCA9PSByVHhBR0NfQl9NY3MwN19NY3MwNCkpKSB7Ci0JCQl3cml0ZVZhbCA9IHB3cl92YWxbM107Ci0JCQlpZiAoUmVnT2Zmc2V0ID09IHJUeEFHQ19BX01jczE1X01jczEyIHx8Ci0JCQkgICAgUmVnT2Zmc2V0ID09IHJUeEFHQ19BX01jczA3X01jczA0KQotCQkJCVJlZ09mZnNldCA9IDB4YzkwOwotCQkJaWYgKFJlZ09mZnNldCA9PSByVHhBR0NfQl9NY3MxNV9NY3MxMiB8fAotCQkJICAgIFJlZ09mZnNldCA9PSByVHhBR0NfQl9NY3MwN19NY3MwNCkKLQkJCQlSZWdPZmZzZXQgPSAweGM5ODsKLQkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAyKQotCQkJCQl3cml0ZVZhbCA9ICh3cml0ZVZhbCA+IDgpID8KLQkJCQkJCSh3cml0ZVZhbCAtIDgpIDogMDsKLQkJCQllbHNlCi0JCQkJCXdyaXRlVmFsID0gKHdyaXRlVmFsID4gNikgPwotCQkJCQkJKHdyaXRlVmFsIC0gNikgOiAwOwotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUmVnT2Zmc2V0ICsgaSwKLQkJCQkJCSAodTgpd3JpdGVWYWwpOwotCQkJfQotCQl9Ci0JfQotfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRnVuY3Rpb246CVBIWV9SRjYwNTJTZXRPRkRNVHhQb3dlcgotICoKLSAqIE92ZXJ2aWV3OglGb3IgbGVnYWN5IGFuZCBIWSBPRkRNLCB3ZSBtdXN0IHJlYWQgRUVQUk9NIFRYIHBvd2VyIGluZGV4IGZvcgotICoJCWRpZmZlcmVudCBjaGFubmVsIGFuZCByZWFkIG9yaWdpbmFsIHZhbHVlIGluIFRYIHBvd2VyCi0gKgkJcmVnaXN0ZXIgYXJlYSBmcm9tIDB4ZTAwLiBXZSBpbmNyZWFzZSBvZmZzZXQgYW5kCi0gKgkJb3JpZ2luYWwgdmFsdWUgdG8gYmUgY29ycmVjdCB0eCBwd3IuCi0gKgotICogSW5wdXQ6ICAgICAgIE5PTkUKLSAqCi0gKiBPdXRwdXQ6ICAgICAgTk9ORQotICoKLSAqIFJldHVybjogICAgICBOT05FCi0gKgotICogUmV2aXNlZCBIaXN0b3J5OgotICogV2hlbgkJCVJlbWFyawotICogMTEvMDUvMjAwOAlNSEMJU2ltdWxhdGUgODE5MiBzZXJpZXMgbWV0aG9kLgotICogMDEvMDYvMjAwOQlNSEMJMS4gUHJldmVudCBQYXRoIEIgdHggcG93ZXIgb3ZlcmZsb3cgb3IKLSAqCQkJdW5kZXJmbG93IGR1cmUgdG8gQS9CIHB3ciBkaWZmZXJlbmNlIG9yCi0gKgkJCWxlZ2FjeS9IVCBwd3IgZGlmZi4KLSAqCQkJMi4gV2UgY29uY2VybiB3aXRoIHBhdGggQiBsZWdhY3kvSFQgT0ZETSBkaWZmZXJlbmNlLgotICogMDEvMjIvMjAwOQlNSEMJU3VwcG9ydCBuZXcgRVBSTyBmb3JtYXQgZnJvbSBTRDMuCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBydGw4NzIzYV9QSFlfUkY2MDUyU2V0T0ZETVR4UG93ZXIoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJCSAgICAgICB1OCAqcFBvd2VyTGV2ZWwsIHU4IENoYW5uZWwpCi17Ci0JdTMyIHdyaXRlVmFsWzJdLCBwb3dlckJhc2UwWzJdLCBwb3dlckJhc2UxWzJdOwotCXU4IGluZGV4ID0gMDsKLQotCWdldFBvd2VyQmFzZShBZGFwdGVyLCBwUG93ZXJMZXZlbCwgQ2hhbm5lbCwKLQkJICAgICAmcG93ZXJCYXNlMFswXSwgJnBvd2VyQmFzZTFbMF0pOwotCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNjsgaW5kZXgrKykgewotCQlnZXRUeFBvd2VyV3JpdGVWYWxCeVJlZ3VsYXRvcnkoQWRhcHRlciwgQ2hhbm5lbCwgaW5kZXgsCi0JCQkmcG93ZXJCYXNlMFswXSwgJnBvd2VyQmFzZTFbMF0sICZ3cml0ZVZhbFswXSk7Ci0KLQkJd3JpdGVPRkRNUG93ZXJSZWcoQWRhcHRlciwgaW5kZXgsICZ3cml0ZVZhbFswXSk7Ci0JfQotfQotCi1zdGF0aWMgaW50IHBoeV9SRjYwNTJfQ29uZmlnX1BhcmFGaWxlKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQl1MzIgdTRSZWdWYWx1ZSA9IDA7Ci0JdTggZVJGUGF0aDsKLQlzdHJ1Y3QgYmJfcmVnX2RlZmluZSAqcFBoeVJlZzsKLQlpbnQgcnRTdGF0dXMgPSBfU1VDQ0VTUzsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCi0JLyogMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0JLyogMyA8Mj4gSW5pdGlhbGl6ZSBSRiAqLwotCS8qIDMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCWZvciAoZVJGUGF0aCA9IDA7IGVSRlBhdGggPCBwSGFsRGF0YS0+TnVtVG90YWxSRlBhdGg7IGVSRlBhdGgrKykgewotCi0JCXBQaHlSZWcgPSAmcEhhbERhdGEtPlBIWVJlZ0RlZltlUkZQYXRoXTsKLQotCQkvKi0tLS1TdG9yZSBvcmlnaW5hbCBSRkVOViBjb250cm9sIHR5cGUtLS0tKi8KLQkJc3dpdGNoIChlUkZQYXRoKSB7Ci0JCWNhc2UgUkZfUEFUSF9BOgotCQkJdTRSZWdWYWx1ZSA9IFBIWV9RdWVyeUJCUmVnKEFkYXB0ZXIsIHBQaHlSZWctPnJmaW50ZnMsCi0JCQkJCQkgICAgYlJGU0lfUkZFTlYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUkZfUEFUSF9COgotCQkJdTRSZWdWYWx1ZSA9IFBIWV9RdWVyeUJCUmVnKEFkYXB0ZXIsIHBQaHlSZWctPnJmaW50ZnMsCi0JCQkJCQkgICAgYlJGU0lfUkZFTlYgPDwgMTYpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKi0tLS1TZXQgUkZfRU5WIGVuYWJsZS0tLS0qLwotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgcFBoeVJlZy0+cmZpbnRmZSwgYlJGU0lfUkZFTlYgPDwgMTYsIDB4MSk7Ci0JCXVkZWxheSgxKTsvKiBQbGF0Zm9ybVN0YWxsRXhlY3V0aW9uKDEpOyAqLwotCi0JCS8qLS0tLVNldCBSRl9FTlYgb3V0cHV0IGhpZ2gtLS0tKi8KLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHBQaHlSZWctPnJmaW50Zm8sIGJSRlNJX1JGRU5WLCAweDEpOwotCQl1ZGVsYXkoMSk7LyogUGxhdGZvcm1TdGFsbEV4ZWN1dGlvbigxKTsgKi8KLQotCQkvKiBTZXQgYml0IG51bWJlciBvZiBBZGRyZXNzIGFuZCBEYXRhIGZvciBSRiByZWdpc3RlciAqLwotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsIGIzV2lyZUFkZHJlc3NMZW5ndGgsCi0JCQkgICAgIDB4MCk7CS8qICBTZXQgMSB0byA0IGJpdHMgZm9yIDgyNTUgKi8KLQkJdWRlbGF5KDEpOy8qIFBsYXRmb3JtU3RhbGxFeGVjdXRpb24oMSk7ICovCi0KLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHBQaHlSZWctPnJmSFNTSVBhcmEyLCBiM1dpcmVEYXRhTGVuZ3RoLAotCQkJICAgICAweDApOwkvKiAgU2V0IDAgdG8gMTIgIGJpdHMgZm9yIDgyNTUgKi8KLQkJdWRlbGF5KDEpOy8qIFBsYXRmb3JtU3RhbGxFeGVjdXRpb24oMSk7ICovCi0KLQkJLyotLS0tSW5pdGlhbGl6ZSBSRiBmb20gY29ubmZpZ3VyYXRpb24gZmlsZS0tLS0qLwotCQlzd2l0Y2ggKGVSRlBhdGgpIHsKLQkJY2FzZSBSRl9QQVRIX0E6Ci0JCQlPRE1fUmVhZEFuZENvbmZpZ19SYWRpb0FfMVRfODcyM0EoJnBIYWxEYXRhLT5vZG1wcml2KTsKLQkJCWJyZWFrOwotCQljYXNlIFJGX1BBVEhfQjoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyotLS0tUmVzdG9yZSBSRkVOViBjb250cm9sIHR5cGUtLS0tKi8KLQkJc3dpdGNoIChlUkZQYXRoKSB7Ci0JCWNhc2UgUkZfUEFUSF9BOgotCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHBQaHlSZWctPnJmaW50ZnMsCi0JCQkJICAgICBiUkZTSV9SRkVOViwgdTRSZWdWYWx1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBSRl9QQVRIX0I6Ci0JCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgcFBoeVJlZy0+cmZpbnRmcywKLQkJCQkgICAgIGJSRlNJX1JGRU5WIDw8IDE2LCB1NFJlZ1ZhbHVlKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHJ0U3RhdHVzICE9IF9TVUNDRVNTKSB7Ci0JCQlnb3RvIHBoeV9SRjYwNTJfQ29uZmlnX1BhcmFGaWxlX0ZhaWw7Ci0JCX0KLQl9Ci1waHlfUkY2MDUyX0NvbmZpZ19QYXJhRmlsZV9GYWlsOgotCXJldHVybiBydFN0YXR1czsKLX0KLQotaW50IFBIWV9SRjYwNTJfQ29uZmlnODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQkvKiAgSW5pdGlhbGl6ZSBnZW5lcmFsIGdsb2JhbCB2YWx1ZSAqLwotCS8qICBUT0RPOiBFeHRlbmQgUkZfUEFUSF9DIGFuZCBSRl9QQVRIX0QgaW4gdGhlIGZ1dHVyZSAqLwotCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8xVDFSKQotCQlwSGFsRGF0YS0+TnVtVG90YWxSRlBhdGggPSAxOwotCWVsc2UKLQkJcEhhbERhdGEtPk51bVRvdGFsUkZQYXRoID0gMjsKLQotCS8qICBDb25maWcgQkIgYW5kIFJGICovCi0JcmV0dXJuIHBoeV9SRjYwNTJfQ29uZmlnX1BhcmFGaWxlKEFkYXB0ZXIpOwotfQotCi0vKiBFbmQgb2YgSGFsUmY2MDUyLmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3J4ZGVzYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfcnhkZXNjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYjVlZmUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfcnhkZXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1JUTDg3MjNBX1JFREVTQ19DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX3Jzc2koc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSkKLXsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHNpZ25hbF9zdGF0ICpzaWduYWxfc3RhdCA9ICZwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3N0cmVuZ3RoX2RhdGE7Ci0KLQlpZiAoc2lnbmFsX3N0YXQtPnVwZGF0ZV9yZXEpIHsKLQkJc2lnbmFsX3N0YXQtPnRvdGFsX251bSA9IDA7Ci0JCXNpZ25hbF9zdGF0LT50b3RhbF92YWwgPSAwOwotCQlzaWduYWxfc3RhdC0+dXBkYXRlX3JlcSA9IDA7Ci0JfQotCi0Jc2lnbmFsX3N0YXQtPnRvdGFsX251bSsrOwotCXNpZ25hbF9zdGF0LT50b3RhbF92YWwgICs9IHBhdHRyaWItPnBoeV9pbmZvLlNpZ25hbFN0cmVuZ3RoOwotCXNpZ25hbF9zdGF0LT5hdmdfdmFsID0gc2lnbmFsX3N0YXQtPnRvdGFsX3ZhbCAvIHNpZ25hbF9zdGF0LT50b3RhbF9udW07Ci19Ci0KLXN0YXRpYyB2b2lkIHByb2Nlc3NfbGlua19xdWFsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSkKLXsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQlzdHJ1Y3Qgc2lnbmFsX3N0YXQgKnNpZ25hbF9zdGF0OwotCi0JaWYgKHByZnJhbWUgPT0gTlVMTCB8fCBwYWRhcHRlciA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlwYXR0cmliID0gJnByZnJhbWUtPmF0dHJpYjsKLQlzaWduYWxfc3RhdCA9ICZwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3F1YWxfZGF0YTsKLQotCWlmIChzaWduYWxfc3RhdC0+dXBkYXRlX3JlcSkgewotCQlzaWduYWxfc3RhdC0+dG90YWxfbnVtID0gMDsKLQkJc2lnbmFsX3N0YXQtPnRvdGFsX3ZhbCA9IDA7Ci0JCXNpZ25hbF9zdGF0LT51cGRhdGVfcmVxID0gMDsKLQl9Ci0KLQlzaWduYWxfc3RhdC0+dG90YWxfbnVtKys7Ci0Jc2lnbmFsX3N0YXQtPnRvdGFsX3ZhbCAgKz0gcGF0dHJpYi0+cGh5X2luZm8uU2lnbmFsUXVhbGl0eTsKLQlzaWduYWxfc3RhdC0+YXZnX3ZhbCA9IHNpZ25hbF9zdGF0LT50b3RhbF92YWwgLyBzaWduYWxfc3RhdC0+dG90YWxfbnVtOwotfQotCi0vKiB2b2lkIHJ0bDg3MjNhX3Byb2Nlc3NfcGh5X2luZm8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJmcmFtZSkgKi8KLXZvaWQgcnRsODcyM2FfcHJvY2Vzc19waHlfaW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB2b2lkICpwcmZyYW1lKQotewotCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lID0gcHJmcmFtZTsKLQkvKiAgQ2hlY2sgUlNTSSAqLwotCXByb2Nlc3NfcnNzaShwYWRhcHRlciwgcHJlY3ZmcmFtZSk7Ci0JLyogIENoZWNrIEVWTSAqLwotCXByb2Nlc3NfbGlua19xdWFsKHBhZGFwdGVyLCAgcHJlY3ZmcmFtZSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9zcmVzZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3NyZXNldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzQ2Mjk0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3NyZXNldC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9SVEw4NzIzQV9TUkVTRVRfQ18KLQotI2luY2x1ZGUgPHJ0bDg3MjNhX3NyZXNldC5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotdm9pZCBydGw4NzIzYV9zcmVzZXRfeG1pdF9zdGF0dXNfY2hlY2soc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3Qgc3Jlc2V0X3ByaXYgKnBzcnRwcml2ID0gJnBIYWxEYXRhLT5zcmVzdHByaXY7Ci0KLQl1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGltZTsKLQlzdHJ1Y3QgeG1pdF9wcml2CSpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXVuc2lnbmVkIGludCBkaWZmX3RpbWU7Ci0JdTMyIHR4ZG1hX3N0YXR1czsKLQotCXR4ZG1hX3N0YXR1cyA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19UWERNQV9TVEFUVVMpOwotCWlmICh0eGRtYV9zdGF0dXMgIT0gMCkgewotCQlEQkdfODcyM0EoIiVzIFJFR19UWERNQV9TVEFUVVM6MHglMDh4XG4iLCBfX2Z1bmNfXywgdHhkbWFfc3RhdHVzKTsKLQkJcnR3X3NyZXNldF9yZXNldChwYWRhcHRlcik7Ci0JfQotCi0JY3VycmVudF90aW1lID0gamlmZmllczsKLQotCWlmICgwID09IHB4bWl0cHJpdi0+ZnJlZV94bWl0YnVmX2NudCB8fCAwID09IHB4bWl0cHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9jbnQpIHsKLQotCQlkaWZmX3RpbWUgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBwc3J0cHJpdi0+bGFzdF90eF90aW1lKTsKLQotCQlpZiAoZGlmZl90aW1lID4gMjAwMCkgewotCQkJaWYgKHBzcnRwcml2LT5sYXN0X3R4X2NvbXBsZXRlX3RpbWUgPT0gMCkgewotCQkJCXBzcnRwcml2LT5sYXN0X3R4X2NvbXBsZXRlX3RpbWUgPSBjdXJyZW50X3RpbWU7Ci0JCQl9IGVsc2UgewotCQkJCWRpZmZfdGltZSA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHBzcnRwcml2LT5sYXN0X3R4X2NvbXBsZXRlX3RpbWUpOwotCQkJCWlmIChkaWZmX3RpbWUgPiA0MDAwKSB7Ci0JCQkJCURCR184NzIzQSgiJXMgdHggaGFuZ1xuIiwgX19mdW5jX18pOwotCQkJCQlydHdfc3Jlc2V0X3Jlc2V0KHBhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYXVfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2F1X3JlY3YuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZlYzg0Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYXVfcmVjdi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRMODE5MkNVX1JFQ1ZfQ18KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgotI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+Ci0jaW5jbHVkZSA8dXNiX29wcy5oPgotI2luY2x1ZGUgPHdpZmkuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLQotaW50IHJ0bDg3MjNhdV9pbml0X3JlY3ZfcHJpdihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0JaW50IGksIHNpemUsIHJlcyA9IF9TVUNDRVNTOwotCXN0cnVjdCByZWN2X2J1ZiAqcHJlY3ZidWY7Ci0JdW5zaWduZWQgbG9uZyB0bXBhZGRyOwotCXVuc2lnbmVkIGxvbmcgYWxpZ25tZW50OwotCXN0cnVjdCBza19idWZmICpwc2tiOwotCi0JdGFza2xldF9pbml0KCZwcmVjdnByaXYtPnJlY3ZfdGFza2xldCwKLQkJICAgICAodm9pZCgqKSh1bnNpZ25lZCBsb25nKSlydGw4NzIzYXVfcmVjdl90YXNrbGV0LAotCQkgICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKLQotCXByZWN2cHJpdi0+aW50X2luX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcmVjdnByaXYtPmludF9pbl91cmIpCi0JCURCR184NzIzQSgiYWxsb2NfdXJiIGZvciBpbnRlcnJ1cHQgaW4gZW5kcG9pbnQgZmFpbCAhISEhXG4iKTsKLQlwcmVjdnByaXYtPmludF9pbl9idWYgPSBremFsbG9jKFVTQl9JTlRSX0NPTlRFTlRfTEVOR1RILCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByZWN2cHJpdi0+aW50X2luX2J1ZikKLQkJREJHXzg3MjNBKCJhbGxvY19tZW0gZm9yIGludGVycnVwdCBpbiBlbmRwb2ludCBmYWlsICEhISFcbiIpOwotCi0Jc2l6ZSA9IE5SX1JFQ1ZCVUZGICogc2l6ZW9mKHN0cnVjdCByZWN2X2J1Zik7Ci0JcHJlY3Zwcml2LT5wcmVjdl9idWYgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCWlmICghcHJlY3Zwcml2LT5wcmVjdl9idWYpIHsKLQkJcmVzID0gX0ZBSUw7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgImFsbG9jIHJlY3ZfYnVmIGZhaWwhXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQotCXByZWN2YnVmID0gKHN0cnVjdCByZWN2X2J1ZiAqKXByZWN2cHJpdi0+cHJlY3ZfYnVmOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX1JFQ1ZCVUZGOyBpKyspIHsKLQkJSU5JVF9MSVNUX0hFQUQoJnByZWN2YnVmLT5saXN0KTsKLQotCQlwcmVjdmJ1Zi0+cHVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcHJlY3ZidWYtPnB1cmIpCi0JCQlicmVhazsKLQotCQlwcmVjdmJ1Zi0+YWRhcHRlciA9IHBhZGFwdGVyOwotCi0JCXByZWN2YnVmKys7Ci0JfQotCi0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcHJlY3Zwcml2LT5yeF9za2JfcXVldWUpOwotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3NrYl9xdWV1ZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfUFJFQUxMT0NfUkVDVl9TS0I7IGkrKykgewotCQlzaXplID0gTUFYX1JFQ1ZCVUZfU1ogKyBSRUNWQlVGRl9BTElHTl9TWjsKLQkJcHNrYiA9IF9fbmV0ZGV2X2FsbG9jX3NrYihwYWRhcHRlci0+cG5ldGRldiwgc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0KLQkJaWYgKHBza2IpIHsKLQkJCXBza2ItPmRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCi0JCQl0bXBhZGRyID0gKHVuc2lnbmVkIGxvbmcpcHNrYi0+ZGF0YTsKLQkJCWFsaWdubWVudCA9IHRtcGFkZHIgJiAoUkVDVkJVRkZfQUxJR05fU1otMSk7Ci0JCQlza2JfcmVzZXJ2ZShwc2tiLCAoUkVDVkJVRkZfQUxJR05fU1ogLSBhbGlnbm1lbnQpKTsKLQotCQkJc2tiX3F1ZXVlX3RhaWwoJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3NrYl9xdWV1ZSwgcHNrYik7Ci0JCX0KLQotCQlwc2tiID0gTlVMTDsKLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJlczsKLX0KLQotdm9pZCBydGw4NzIzYXVfZnJlZV9yZWN2X3ByaXYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlpbnQJaTsKLQlzdHJ1Y3QgcmVjdl9idWYJKnByZWN2YnVmOwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0KLQlwcmVjdmJ1ZiA9IChzdHJ1Y3QgcmVjdl9idWYgKilwcmVjdnByaXYtPnByZWN2X2J1ZjsKLQotCWZvciAoaSA9IDA7IGkgPCBOUl9SRUNWQlVGRjsgaSsrKSB7Ci0JCXVzYl9mcmVlX3VyYihwcmVjdmJ1Zi0+cHVyYik7Ci0KLQkJaWYgKHByZWN2YnVmLT5wc2tiKQotCQkJZGV2X2tmcmVlX3NrYl9hbnkocHJlY3ZidWYtPnBza2IpOwotCi0JCXByZWN2YnVmKys7Ci0JfQotCi0Ja2ZyZWUocHJlY3Zwcml2LT5wcmVjdl9idWYpOwotCi0JdXNiX2ZyZWVfdXJiKHByZWN2cHJpdi0+aW50X2luX3VyYik7Ci0Ja2ZyZWUocHJlY3Zwcml2LT5pbnRfaW5fYnVmKTsKLQotCWlmIChza2JfcXVldWVfbGVuKCZwcmVjdnByaXYtPnJ4X3NrYl9xdWV1ZSkpCi0JCURCR184NzIzQShLRVJOX1dBUk5JTkcgInJ4X3NrYl9xdWV1ZSBub3QgZW1wdHlcbiIpOwotCi0Jc2tiX3F1ZXVlX3B1cmdlKCZwcmVjdnByaXYtPnJ4X3NrYl9xdWV1ZSk7Ci0KLQlpZiAoc2tiX3F1ZXVlX2xlbigmcHJlY3Zwcml2LT5mcmVlX3JlY3Zfc2tiX3F1ZXVlKSkgewotCQlEQkdfODcyM0EoS0VSTl9XQVJOSU5HICJmcmVlX3JlY3Zfc2tiX3F1ZXVlIG5vdCBlbXB0eSwgJWRcbiIsCi0JCQkgIHNrYl9xdWV1ZV9sZW4oJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3NrYl9xdWV1ZSkpOwotCX0KLQotCXNrYl9xdWV1ZV9wdXJnZSgmcHJlY3Zwcml2LT5mcmVlX3JlY3Zfc2tiX3F1ZXVlKTsKLX0KLQotc3RydWN0IHJlY3Zfc3RhdF9jcHUgewotCXUzMiByeGR3MDsKLQl1MzIgcnhkdzE7Ci0JdTMyIHJ4ZHcyOwotCXUzMiByeGR3MzsKLQl1MzIgcnhkdzQ7Ci0JdTMyIHJ4ZHc1OwotfTsKLQotdm9pZCB1cGRhdGVfcmVjdmZyYW1lX2F0dHJpYihzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwKLQkJCSAgICAgc3RydWN0IHJlY3Zfc3RhdCAqcHJ4c3RhdCkKLXsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQlzdHJ1Y3QgcmVjdl9zdGF0X2NwdSByZXBvcnQ7Ci0Jc3RydWN0IHJ4cmVwb3J0Xzg3MjNhICpwcnhyZXBvcnQ7Ci0KLQlyZXBvcnQucnhkdzAgPSBsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3MCk7Ci0JcmVwb3J0LnJ4ZHcxID0gbGUzMl90b19jcHUocHJ4c3RhdC0+cnhkdzEpOwotCXJlcG9ydC5yeGR3MiA9IGxlMzJfdG9fY3B1KHByeHN0YXQtPnJ4ZHcyKTsKLQlyZXBvcnQucnhkdzMgPSBsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3Myk7Ci0JcmVwb3J0LnJ4ZHc0ID0gbGUzMl90b19jcHUocHJ4c3RhdC0+cnhkdzQpOwotCXJlcG9ydC5yeGR3NSA9IGxlMzJfdG9fY3B1KHByeHN0YXQtPnJ4ZHc1KTsKLQotCXByeHJlcG9ydCA9IChzdHJ1Y3QgcnhyZXBvcnRfODcyM2EgKikmcmVwb3J0OwotCi0JcGF0dHJpYiA9ICZwcmVjdmZyYW1lLT5hdHRyaWI7Ci0JbWVtc2V0KHBhdHRyaWIsIDAsIHNpemVvZihzdHJ1Y3QgcnhfcGt0X2F0dHJpYikpOwotCi0JLyogIHVwZGF0ZSByeCByZXBvcnQgdG8gcmVjdl9mcmFtZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliLT5wa3RfbGVuID0gKHUxNilwcnhyZXBvcnQtPnBrdGxlbjsKLQlwYXR0cmliLT5kcnZpbmZvX3N6ID0gKHU4KShwcnhyZXBvcnQtPmRydmluZm9zaXplIDw8IDMpOwotCXBhdHRyaWItPnBoeXN0ID0gKHU4KXByeHJlcG9ydC0+cGh5c3Q7Ci0KLQlwYXR0cmliLT5jcmNfZXJyID0gKHU4KXByeHJlcG9ydC0+Y3JjMzI7Ci0JcGF0dHJpYi0+aWN2X2VyciA9ICh1OClwcnhyZXBvcnQtPmljdmVycjsKLQotCXBhdHRyaWItPmJkZWNyeXB0ZWQgPSAodTgpKHByeHJlcG9ydC0+c3dkZWMgPyAwIDogMSk7Ci0JcGF0dHJpYi0+ZW5jcnlwdCA9ICh1OClwcnhyZXBvcnQtPnNlY3VyaXR5OwotCi0JcGF0dHJpYi0+cW9zID0gKHU4KXByeHJlcG9ydC0+cW9zOwotCXBhdHRyaWItPnByaW9yaXR5ID0gKHU4KXByeHJlcG9ydC0+dGlkOwotCi0JcGF0dHJpYi0+YW1zZHUgPSAodTgpcHJ4cmVwb3J0LT5hbXNkdTsKLQotCXBhdHRyaWItPnNlcV9udW0gPSAodTE2KXByeHJlcG9ydC0+c2VxOwotCXBhdHRyaWItPmZyYWdfbnVtID0gKHU4KXByeHJlcG9ydC0+ZnJhZzsKLQlwYXR0cmliLT5tZnJhZyA9ICh1OClwcnhyZXBvcnQtPm1mOwotCXBhdHRyaWItPm1kYXRhID0gKHU4KXByeHJlcG9ydC0+bWQ7Ci0KLQlwYXR0cmliLT5tY3NfcmF0ZSA9ICh1OClwcnhyZXBvcnQtPnJ4bWNzOwotCXBhdHRyaWItPnJ4aHQgPSAodTgpcHJ4cmVwb3J0LT5yeGh0OwotfQotCi12b2lkIHVwZGF0ZV9yZWN2ZnJhbWVfcGh5aW5mbyhzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwKLQkJCSAgICAgIHN0cnVjdCBwaHlfc3RhdCAqcHBoeV9zdGF0dXMpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHByZWN2ZnJhbWUtPmFkYXB0ZXI7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBwaHlfaW5mbyAqcFBIWUluZm8gPSAmcGF0dHJpYi0+cGh5X2luZm87Ci0Jc3RydWN0IG9kbV9wYWNrZXRfaW5mbyBwa3RfaW5mbzsKLQl1OCAqc2EgPSBOVUxMLCAqZGE7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdjsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2ZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQlib29sIG1hdGNoYnNzaWQgPSBmYWxzZTsKLQl1OCAqYnNzaWQ7Ci0KLQltYXRjaGJzc2lkID0gIWllZWU4MDIxMV9pc19jdGwoaGRyLT5mcmFtZV9jb250cm9sKSAmJgotCQkgICAgICAhcGF0dHJpYi0+aWN2X2VyciAmJiAhcGF0dHJpYi0+Y3JjX2VycjsKLQotCWlmIChtYXRjaGJzc2lkKSB7Ci0JCXN3aXRjaCAoaGRyLT5mcmFtZV9jb250cm9sICYKLQkJCWNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1RPRFMgfAotCQkJCSAgICBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSB7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfVE9EUyk6Ci0JCQlic3NpZCA9IGhkci0+YWRkcjE7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9GUk9NRFMpOgotCQkJYnNzaWQgPSBoZHItPmFkZHIyOwotCQkJYnJlYWs7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoMCk6Ci0JCQlic3NpZCA9IGhkci0+YWRkcjM7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJzc2lkID0gTlVMTDsKLQkJCW1hdGNoYnNzaWQgPSBmYWxzZTsKLQkJfQotCi0JCWlmIChic3NpZCkKLQkJCW1hdGNoYnNzaWQgPSBldGhlcl9hZGRyX2VxdWFsKAotCQkJCWdldF9ic3NpZCgmcGFkYXB0ZXItPm1sbWVwcml2KSwgYnNzaWQpOwotCX0KLQotCXBrdF9pbmZvLmJQYWNrZXRNYXRjaEJTU0lEID0gbWF0Y2hic3NpZDsKLQotCWRhID0gaWVlZTgwMjExX2dldF9EQShoZHIpOwotCXBrdF9pbmZvLmJQYWNrZXRUb1NlbGYgPSBwa3RfaW5mby5iUGFja2V0TWF0Y2hCU1NJRCAmJgotCQkoIW1lbWNtcChkYSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTikpOwotCi0JcGt0X2luZm8uYlBhY2tldEJlYWNvbiA9IHBrdF9pbmZvLmJQYWNrZXRNYXRjaEJTU0lEICYmCi0JCWllZWU4MDIxMV9pc19iZWFjb24oaGRyLT5mcmFtZV9jb250cm9sKTsKLQotCXBrdF9pbmZvLlN0YXRpb25JRCA9IDB4RkY7Ci0JaWYgKHBrdF9pbmZvLmJQYWNrZXRCZWFjb24pIHsKLQkJaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSA9PSB0cnVlKQotCQkJc2EgPSBwYWRhcHRlci0+bWxtZXByaXYuY3VyX25ldHdvcmsubmV0d29yay5NYWNBZGRyZXNzOwotCQkvKiB0byBkbyBBZC1ob2MgKi8KLQl9IGVsc2UgewotCQlzYSA9IGllZWU4MDIxMV9nZXRfU0EoaGRyKTsKLQl9Ci0KLQlwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBzYSk7Ci0JaWYgKHBzdGEpIHsKLQkJcGt0X2luZm8uU3RhdGlvbklEID0gcHN0YS0+bWFjX2lkOwotCQkvKiBwcmludGsoIiVzID09PiBTdGF0aW9uSUQoJWQpXG4iLCBfX2Z1bmNfXywgcGt0X2luZm8uU3RhdGlvbklEKTsgKi8KLQl9Ci0JcGt0X2luZm8uUmF0ZSA9IHBhdHRyaWItPm1jc19yYXRlOwotCi0JT0RNX1BoeVN0YXR1c1F1ZXJ5MjNhKCZwSGFsRGF0YS0+b2RtcHJpdiwgcFBIWUluZm8sCi0JCQkgICAgICAodTggKilwcGh5X3N0YXR1cywgJnBrdF9pbmZvKTsKLQlwcmVjdmZyYW1lLT5wc3RhID0gTlVMTDsKLQlpZiAocGt0X2luZm8uYlBhY2tldE1hdGNoQlNTSUQgJiYKLQkgICAgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkgPT0gdHJ1ZSkpIHsKLQkJaWYgKHBzdGEpIHsKLQkJCXByZWN2ZnJhbWUtPnBzdGEgPSBwc3RhOwotCQkJcnRsODcyM2FfcHJvY2Vzc19waHlfaW5mbyhwYWRhcHRlciwgcHJlY3ZmcmFtZSk7Ci0JCX0KLQl9IGVsc2UgaWYgKHBrdF9pbmZvLmJQYWNrZXRUb1NlbGYgfHwgcGt0X2luZm8uYlBhY2tldEJlYWNvbikgewotCQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LAotCQkJCSAgV0lGSV9BREhPQ19TVEFURXxXSUZJX0FESE9DX01BU1RFUl9TVEFURSkgPT0KLQkJICAgIHRydWUpIHsKLQkJCWlmIChwc3RhKQotCQkJCXByZWN2ZnJhbWUtPnBzdGEgPSBwc3RhOwotCQl9Ci0JCXJ0bDg3MjNhX3Byb2Nlc3NfcGh5X2luZm8ocGFkYXB0ZXIsIHByZWN2ZnJhbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhdV94bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYXVfeG1pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDc0NmRkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhdV94bWl0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9SVEw4MTkyQ19YTUlUX0NfCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHdpZmkuaD4KLSNpbmNsdWRlIDxvc2RlcF9pbnRmLmg+Ci0jaW5jbHVkZSA8dXNiX29wcy5oPgotLyogaW5jbHVkZSA8cnRsODE5MmNfaGFsLmg+ICovCi0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0KLXN0YXRpYyBpbnQgdXJiX3plcm9fcGFja2V0X2NoayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBpbnQgc3opCi17Ci0JaW50IGJsblNldFR4RGVzY09mZnNldDsKLQlzdHJ1Y3QgZHZvYmpfcHJpdgkqcGR2b2JqID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7Ci0KLQlpZiAocGR2b2JqLT5pc2hpZ2hzcGVlZCkgewotCQlpZiAoKChzeiArIFRYREVTQ19TSVpFKSAlIDUxMikgPT0gMCkKLQkJCWJsblNldFR4RGVzY09mZnNldCA9IDE7Ci0JCWVsc2UKLQkJCWJsblNldFR4RGVzY09mZnNldCA9IDA7Ci0JfSBlbHNlIHsKLQkJaWYgKCgoc3ogKyBUWERFU0NfU0laRSkgJSA2NCkgPT0gMCkKLQkJCWJsblNldFR4RGVzY09mZnNldCA9IDE7Ci0JCWVsc2UKLQkJCWJsblNldFR4RGVzY09mZnNldCA9IDA7Ci0JfQotCXJldHVybiBibG5TZXRUeERlc2NPZmZzZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0bDgxOTJjdV9jYWxfdHhkZXNjX2Noa3N1bShzdHJ1Y3QgdHhfZGVzYwkqcHR4ZGVzYykKLXsKLQkJX19sZTE2CSp1c1B0ciA9IChfX2xlMTYgKilwdHhkZXNjOwotCQl1MzIgY291bnQgPSAxNjsJCS8qICAoMzIgYnl0ZXMgLyAyIGJ5dGVzIHBlciBYT1IpID0+IDE2IHRpbWVzICovCi0JCXUzMiBpbmRleDsKLQkJdTE2IGNoZWNrc3VtID0gMDsKLQotCQkvKiBDbGVhciBmaXJzdCAqLwotCQlwdHhkZXNjLT50eGR3NyAmPSBjcHVfdG9fbGUzMigweGZmZmYwMDAwKTsKLQotCQlmb3IgKGluZGV4ID0gMCA7IGluZGV4IDwgY291bnQgOyBpbmRleCsrKQotCQkJY2hlY2tzdW0gPSBjaGVja3N1bSBeIGxlMTZfdG9fY3B1KCoodXNQdHIgKyBpbmRleCkpOwotCi0JCXB0eGRlc2MtPnR4ZHc3IHw9IGNwdV90b19sZTMyKDB4MDAwMGZmZmYmY2hlY2tzdW0pOwotfQotCi1zdGF0aWMgdm9pZCBmaWxsX3R4ZGVzY19zZWN0eXBlKHN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliLCBzdHJ1Y3QgdHhfZGVzYyAqcHR4ZGVzYykKLXsKLQlpZiAoKHBhdHRyaWItPmVuY3J5cHQgPiAwKSAmJiAhcGF0dHJpYi0+YnN3ZW5jKSB7Ci0JCXN3aXRjaCAocGF0dHJpYi0+ZW5jcnlwdCkgewotCQkvKiBTRUNfVFlQRSAqLwotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKCgweDAxPDwyMikmMHgwMGMwMDAwMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQkJLyogcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoKDB4MDI8PDIyKSYweDAwYzAwMDAwKTsgKi8KLQkJCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKCgweDAxPDwyMikmMHgwMGMwMDAwMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQkJcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoKDB4MDM8PDIyKSYweDAwYzAwMDAwKTsKLQkJCWJyZWFrOwotCQljYXNlIDA6Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgZmlsbF90eGRlc2NfdmNzKHN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliLCBfX2xlMzIgKnBkdykKLXsKLQkvKiBEQkdfODcyM0EoImN2c19tb2RlID0lZFxuIiwgcGF0dHJpYi0+dmNzX21vZGUpOyAqLwotCi0Jc3dpdGNoIChwYXR0cmliLT52Y3NfbW9kZSkgewotCWNhc2UgUlRTX0NUUzoKLQkJKnBkdyB8PSBjcHVfdG9fbGUzMihCSVQoMTIpKTsKLQkJYnJlYWs7Ci0JY2FzZSBDVFNfVE9fU0VMRjoKLQkJKnBkdyB8PSBjcHVfdG9fbGUzMihCSVQoMTEpKTsKLQkJYnJlYWs7Ci0JY2FzZSBOT05FX1ZDUzoKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlpZiAocGF0dHJpYi0+dmNzX21vZGUpIHsKLQkJKnBkdyB8PSBjcHVfdG9fbGUzMihCSVQoMTMpKTsKLQotCQkvKiAgU2V0IFJUUyBCVyAqLwotCQlpZiAocGF0dHJpYi0+aHRfZW4pIHsKLQkJCSpwZHcgfD0gKHBhdHRyaWItPmJ3bW9kZSZIVF9DSEFOTkVMX1dJRFRIXzQwKSA/CWNwdV90b19sZTMyKEJJVCgyNykpIDogMDsKLQotCQkJaWYgKHBhdHRyaWItPmNoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIpCi0JCQkJKnBkdyB8PSBjcHVfdG9fbGUzMigoMHgwMTw8MjgpJjB4MzAwMDAwMDApOwotCQkJZWxzZSBpZiAocGF0dHJpYi0+Y2hfb2Zmc2V0ID09IEhBTF9QUklNRV9DSE5MX09GRlNFVF9VUFBFUikKLQkJCQkqcGR3IHw9IGNwdV90b19sZTMyKCgweDAyPDwyOCkmMHgzMDAwMDAwMCk7Ci0JCQllbHNlIGlmIChwYXR0cmliLT5jaF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSkKLQkJCQkqcGR3IHw9IDA7Ci0JCQllbHNlCi0JCQkJKnBkdyB8PSBjcHVfdG9fbGUzMigoMHgwMzw8MjgpJjB4MzAwMDAwMDApOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBmaWxsX3R4ZGVzY19waHkoc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIsIF9fbGUzMiAqcGR3KQotewotCWlmIChwYXR0cmliLT5odF9lbikgewotCQkqcGR3IHw9IChwYXR0cmliLT5id21vZGUmSFRfQ0hBTk5FTF9XSURUSF80MCkgPyBjcHVfdG9fbGUzMihCSVQoMjUpKSA6IDA7Ci0KLQkJaWYgKHBhdHRyaWItPmNoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIpCi0JCQkqcGR3IHw9IGNwdV90b19sZTMyKCgweDAxPDwyMCkmMHgwMDNmMDAwMCk7Ci0JCWVsc2UgaWYgKHBhdHRyaWItPmNoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIpCi0JCQkqcGR3IHw9IGNwdV90b19sZTMyKCgweDAyPDwyMCkmMHgwMDNmMDAwMCk7Ci0JCWVsc2UgaWYgKHBhdHRyaWItPmNoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFKQotCQkJKnBkdyB8PSAwOwotCQllbHNlCi0JCQkqcGR3IHw9IGNwdV90b19sZTMyKCgweDAzPDwyMCkmMHgwMDNmMDAwMCk7Ci0JfQotfQotCi1zdGF0aWMgczMyIHVwZGF0ZV90eGRlc2Moc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUsIHU4ICpwbWVtLCBzMzIgc3opCi17Ci0JaW50CXB1bGwgPSAwOwotCXVpbnQJcXNlbDsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIJKnBhZGFwdGVyID0gcHhtaXRmcmFtZS0+cGFkYXB0ZXI7Ci0Jc3RydWN0IHBrdF9hdHRyaWIJKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0Jc3RydWN0IHR4X2Rlc2MJKnB0eGRlc2MgPSAoc3RydWN0IHR4X2Rlc2MgKilwbWVtOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JaW50CWJtY3N0ID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+cmEpOwotCi0JaWYgKHVyYl96ZXJvX3BhY2tldF9jaGsocGFkYXB0ZXIsIHN6KSA9PSAwKSB7Ci0JCXB0eGRlc2MgPSAoc3RydWN0IHR4X2Rlc2MgKikocG1lbStQQUNLRVRfT0ZGU0VUX1NaKTsKLQkJcHVsbCA9IDE7Ci0JCXB4bWl0ZnJhbWUtPnBrdF9vZmZzZXQtLTsKLQl9Ci0KLQltZW1zZXQocHR4ZGVzYywgMCwgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSk7Ci0KLQlpZiAocHhtaXRmcmFtZS0+ZnJhbWVfdGFnID09IERBVEFfRlJBTUVUQUcpIHsKLQkJLyogb2Zmc2V0IDQgKi8KLQkJcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIocGF0dHJpYi0+bWFjX2lkJjB4MWYpOwotCi0JCXFzZWwgPSAodWludCkocGF0dHJpYi0+cXNlbCAmIDB4MDAwMDAwMWYpOwotCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMigocXNlbCA8PCBRU0VMX1NIVCkgJiAweDAwMDAxZjAwKTsKLQotCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMigocGF0dHJpYi0+cmFpZDw8MTYpICYgMHgwMDBmMDAwMCk7Ci0KLQkJZmlsbF90eGRlc2Nfc2VjdHlwZShwYXR0cmliLCBwdHhkZXNjKTsKLQotCQlpZiAocGF0dHJpYi0+YW1wZHVfZW4pCi0JCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMihCSVQoNSkpOy8qIEFHRyBFTiAqLwotCQllbHNlCi0JCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMihCSVQoNikpOy8qIEFHRyBCSyAqLwotCi0JCS8qIG9mZnNldCA4ICovCi0KLQkJLyogb2Zmc2V0IDEyICovCi0JCXB0eGRlc2MtPnR4ZHczIHw9IGNwdV90b19sZTMyKChwYXR0cmliLT5zZXFudW08PDE2KSYweGZmZmYwMDAwKTsKLQotCQkvKiBvZmZzZXQgMTYgLCBvZmZzZXQgMjAgKi8KLQkJaWYgKHBhdHRyaWItPnFvc19lbikKLQkJCXB0eGRlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKEJJVCg2KSk7LyogUW9TICovCi0KLQkJaWYgKChwYXR0cmliLT5ldGhlcl90eXBlICE9IDB4ODg4ZSkgJiYKLQkJICAgIChwYXR0cmliLT5ldGhlcl90eXBlICE9IDB4MDgwNikgJiYKLQkJICAgIChwYXR0cmliLT5kaGNwX3BrdCAhPSAxKSkgewotCQkJLyogTm9uIEVBUCAmIEFSUCAmIERIQ1AgdHlwZSBkYXRhIHBhY2tldCAqLwotCi0JCQlmaWxsX3R4ZGVzY192Y3MocGF0dHJpYiwgJnB0eGRlc2MtPnR4ZHc0KTsKLQkJCWZpbGxfdHhkZXNjX3BoeShwYXR0cmliLCAmcHR4ZGVzYy0+dHhkdzQpOwotCi0JCQlwdHhkZXNjLT50eGR3NCB8PSBjcHVfdG9fbGUzMigweDAwMDAwMDA4KTsvKiBSVFMgUmF0ZSA9IDI0TSAqLwotCQkJcHR4ZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoMHgwMDAxZmYwMCk7LyogICovCi0KLQkJCS8qIHVzZSBSRUdfSU5JREFUQV9SQVRFX1NFTCB2YWx1ZSAqLwotCQkJcHR4ZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIocGRtcHJpdi0+SU5JREFUQV9SQVRFW3BhdHRyaWItPm1hY19pZF0pOwotCQl9IGVsc2UgewotCQkJLyogIEVBUCBkYXRhIHBhY2tldCBhbmQgQVJQIHBhY2tldC4gKi8KLQkJCS8qICBVc2UgdGhlIDFNIGRhdGEgcmF0ZSB0byBzZW5kIHRoZSBFQVAvQVJQIHBhY2tldC4gKi8KLQkJCS8qICBUaGlzIHdpbGwgbWF5YmUgbWFrZSB0aGUgaGFuZHNoYWtlIHNtb290aC4gKi8KLQotCQkJcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoQklUKDYpKTsvKiBBR0cgQksgKi8KLQotCQkJcHR4ZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoQklUKDgpKTsvKiBkcml2ZXIgdXNlcyByYXRlICovCi0KLQkJCWlmIChwbWxtZWluZm8tPnByZWFtYmxlX21vZGUgPT0gUFJFQU1CTEVfU0hPUlQpCi0JCQkJcHR4ZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoQklUKDI0KSk7LyogIERBVEFfU0hPUlQgKi8KLQotCQkJcHR4ZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoTVJhdGVUb0h3UmF0ZTIzYShwbWxtZWV4dC0+dHhfcmF0ZSkpOwotCQl9Ci0JfSBlbHNlIGlmIChweG1pdGZyYW1lLT5mcmFtZV90YWcgPT0gTUdOVF9GUkFNRVRBRykgewotCQkvKiBvZmZzZXQgNCAqLwotCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMihwYXR0cmliLT5tYWNfaWQmMHgxZik7Ci0KLQkJcXNlbCA9ICh1aW50KShwYXR0cmliLT5xc2VsJjB4MDAwMDAwMWYpOwotCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMigocXNlbDw8UVNFTF9TSFQpJjB4MDAwMDFmMDApOwotCi0JCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKChwYXR0cmliLT5yYWlkPDwxNikgJiAweDAwMGYwMDAwKTsKLQotCQkvKiBvZmZzZXQgOCAqLwotCQkvKiBDQ1gtVFhSUFQgYWNrIGZvciB4bWl0IG1nbXQgZnJhbWVzLiAqLwotCQlpZiAocHhtaXRmcmFtZS0+YWNrX3JlcG9ydCkKLQkJCXB0eGRlc2MtPnR4ZHcyIHw9IGNwdV90b19sZTMyKEJJVCgxOSkpOwotCi0JCS8qIG9mZnNldCAxMiAqLwotCQlwdHhkZXNjLT50eGR3MyB8PSBjcHVfdG9fbGUzMigocGF0dHJpYi0+c2VxbnVtPDwxNikmMHhmZmZmMDAwMCk7Ci0KLQkJLyogb2Zmc2V0IDE2ICovCi0JCXB0eGRlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKEJJVCg4KSk7LyogZHJpdmVyIHVzZXMgcmF0ZSAqLwotCi0JCS8qIG9mZnNldCAyMCAqLwotCQlwdHhkZXNjLT50eGR3NSB8PSBjcHVfdG9fbGUzMihCSVQoMTcpKTsvKiByZXRyeSBsaW1pdCBlbmFibGUgKi8KLQkJcHR4ZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoMHgwMDE4MDAwMCk7LyogcmV0cnkgbGltaXQgPSA2ICovCi0KLQkJcHR4ZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoTVJhdGVUb0h3UmF0ZTIzYShwbWxtZWV4dC0+dHhfcmF0ZSkpOwotCX0gZWxzZSBpZiAocHhtaXRmcmFtZS0+ZnJhbWVfdGFnID09IFRYQUdHX0ZSQU1FVEFHKSB7Ci0JCURCR184NzIzQSgicHhtaXRmcmFtZS0+ZnJhbWVfdGFnID09IFRYQUdHX0ZSQU1FVEFHXG4iKTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoInB4bWl0ZnJhbWUtPmZyYW1lX3RhZyA9ICVkXG4iLAotCQkJICBweG1pdGZyYW1lLT5mcmFtZV90YWcpOwotCi0JCS8qIG9mZnNldCA0ICovCi0JCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKCg0KSYweDFmKTsvKiBDQU1fSUQoTUFDX0lEKSAqLwotCi0JCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKCg2PDwxNikgJiAweDAwMGYwMDAwKTsvKiByYWlkICovCi0KLQkJLyogb2Zmc2V0IDggKi8KLQotCQkvKiBvZmZzZXQgMTIgKi8KLQkJcHR4ZGVzYy0+dHhkdzMgfD0gY3B1X3RvX2xlMzIoKHBhdHRyaWItPnNlcW51bTw8MTYpJjB4ZmZmZjAwMDApOwotCi0JCS8qIG9mZnNldCAxNiAqLwotCQlwdHhkZXNjLT50eGR3NCB8PSBjcHVfdG9fbGUzMihCSVQoOCkpOy8qIGRyaXZlciB1c2VzIHJhdGUgKi8KLQotCQkvKiBvZmZzZXQgMjAgKi8KLQkJcHR4ZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoTVJhdGVUb0h3UmF0ZTIzYShwbWxtZWV4dC0+dHhfcmF0ZSkpOwotCX0KLQotCS8qICAoMSkgVGhlIHNlcXVlbmNlIG51bWJlciBvZiBlYWNoIG5vbi1Rb3MgZnJhbWUgLyBicm9hZGNhc3QgLyBtdWx0aWNhc3QgLyAqLwotCS8qICBtZ250IGZyYW1lIHNob3VsZCBiZSBjb250cm9sbGVkIGJ5IEh3IGJlY2F1c2UgRncgd2lsbCBhbHNvIHNlbmQgbnVsbCBkYXRhICovCi0JLyogIHdoaWNoIHdlIGNhbm5vdCBjb250cm9sIHdoZW4gRncgTFBTIGVuYWJsZS4gKi8KLQkvKiAgLS0+IGRlZmF1bHQgZW5hYmxlIG5vbi1Rb3MgZGF0YSBzZXF1ZW5zZSBudW1iZXIuIDIwMTAuMDYuMjMuIGJ5IHR5bmxpLiAqLwotCS8qICAoMikgRW5hYmxlIEhXIFNFUSBjb250cm9sIGZvciBiZWFjb24gcGFja2V0LCBiZWNhdXNlIHdlIHVzZSBIdyBiZWFjb24uICovCi0JLyogICgzKSBVc2UgSFcgUW9zIFNFUSB0byBjb250cm9sIHRoZSBzZXEgbnVtIG9mIEV4dCBwb3J0IG5vbi1Rb3MgcGFja2V0cy4gKi8KLQlpZiAoIXBhdHRyaWItPnFvc19lbikgewotCQkvKiAgSHcgc2V0IHNlcXVlbmNlIG51bWJlciAqLwotCQlwdHhkZXNjLT50eGR3NCB8PSBjcHVfdG9fbGUzMihCSVQoNykpOwotCQkvKiBzZXQgYml0MyB0byAxLiAqLwotCQlwdHhkZXNjLT50eGR3MyB8PSBjcHVfdG9fbGUzMigoOCA8PCAyOCkpOwotCX0KLQotCS8qIG9mZnNldCAwICovCi0JcHR4ZGVzYy0+dHhkdzAgfD0gY3B1X3RvX2xlMzIoc3omMHgwMDAwZmZmZik7Ci0JcHR4ZGVzYy0+dHhkdzAgfD0gY3B1X3RvX2xlMzIoT1dOIHwgRlNHIHwgTFNHKTsKLQlwdHhkZXNjLT50eGR3MCB8PSBjcHVfdG9fbGUzMigoKFRYREVTQ19TSVpFK09GRlNFVF9TWik8PE9GRlNFVF9TSFQpJjB4MDBmZjAwMDApOy8qIDMyIGJ5dGVzIGZvciBUWCBEZXNjICovCi0KLQlpZiAoYm1jc3QpCi0JCXB0eGRlc2MtPnR4ZHcwIHw9IGNwdV90b19sZTMyKEJJVCgyNCkpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCSAib2Zmc2V0MC10eGRlc2MgPSAweCV4XG4iLCBwdHhkZXNjLT50eGR3MCk7Ci0KLQkvKiBvZmZzZXQgNCAqLwotCS8qICBwa3Rfb2Zmc2V0LCB1bml0OjggYnl0ZXMgcGFkZGluZyAqLwotCWlmIChweG1pdGZyYW1lLT5wa3Rfb2Zmc2V0ID4gMCkKLQkJcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoKHB4bWl0ZnJhbWUtPnBrdF9vZmZzZXQgPDwgMjYpICYgMHg3YzAwMDAwMCk7Ci0KLQlydGw4MTkyY3VfY2FsX3R4ZGVzY19jaGtzdW0ocHR4ZGVzYyk7Ci0JcmV0dXJuIHB1bGw7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2R1bXBfeGZyYW1lKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0JaW50IGlubmVyX3JldCA9IF9TVUNDRVNTOwotCWludCB0LCBzeiwgd19zeiwgcHVsbCA9IDA7Ci0JdTggKm1lbV9hZGRyOwotCXUzMiBmZl9od2FkZHI7Ci0Jc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZiA9IHB4bWl0ZnJhbWUtPnB4bWl0YnVmOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCi0JaWYgKHB4bWl0ZnJhbWUtPmZyYW1lX3RhZyA9PSBEQVRBX0ZSQU1FVEFHICYmCi0JICAgIHB4bWl0ZnJhbWUtPmF0dHJpYi5ldGhlcl90eXBlICE9IEVUSF9QX0FSUCAmJgotCSAgICBweG1pdGZyYW1lLT5hdHRyaWIuZXRoZXJfdHlwZSAhPSBFVEhfUF9QQUUgJiYKLQkgICAgcHhtaXRmcmFtZS0+YXR0cmliLmRoY3BfcGt0ICE9IDEpCi0JCXJ0d19pc3N1ZV9hZGRiYXJlcV9jbWQyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCi0JbWVtX2FkZHIgPSBweG1pdGZyYW1lLT5idWZfYWRkcjsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLCAicnR3X2R1bXBfeGZyYW1lKClcbiIpOwotCi0JZm9yICh0ID0gMDsgdCA8IHBhdHRyaWItPm5yX2ZyYWdzOyB0KyspIHsKLQkJaWYgKGlubmVyX3JldCAhPSBfU1VDQ0VTUyAmJiByZXQgPT0gX1NVQ0NFU1MpCi0JCQlyZXQgPSBfRkFJTDsKLQotCQlpZiAodCAhPSAocGF0dHJpYi0+bnJfZnJhZ3MgLSAxKSkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgInBhdHRyaWItPm5yX2ZyYWdzID0lZFxuIiwgcGF0dHJpYi0+bnJfZnJhZ3MpOwotCi0JCQlzeiA9IHB4bWl0cHJpdi0+ZnJhZ19sZW47Ci0JCQlzeiA9IHN6IC0gNCAtIHBhdHRyaWItPmljdl9sZW47Ci0JCX0gZWxzZSB7Ci0JCQkvKiBubyBmcmFnICovCi0JCQlzeiA9IHBhdHRyaWItPmxhc3RfdHhjbWRzejsKLQkJfQotCi0JCXB1bGwgPSB1cGRhdGVfdHhkZXNjKHB4bWl0ZnJhbWUsIG1lbV9hZGRyLCBzeik7Ci0KLQkJaWYgKHB1bGwpIHsKLQkJCW1lbV9hZGRyICs9IFBBQ0tFVF9PRkZTRVRfU1o7IC8qIHB1bGwgdHhkZXNjIGhlYWQgKi8KLQotCQkJcHhtaXRmcmFtZS0+YnVmX2FkZHIgPSBtZW1fYWRkcjsKLQotCQkJd19zeiA9IHN6ICsgVFhERVNDX1NJWkU7Ci0JCX0gZWxzZSB7Ci0JCQl3X3N6ID0gc3ogKyBUWERFU0NfU0laRSArIFBBQ0tFVF9PRkZTRVRfU1o7Ci0JCX0KLQotCQlmZl9od2FkZHIgPSBydHdfZ2V0X2ZmX2h3YWRkcjIzYShweG1pdGZyYW1lKTsKLQkJaW5uZXJfcmV0ID0gcnRsODcyM2F1X3dyaXRlX3BvcnQocGFkYXB0ZXIsIGZmX2h3YWRkciwKLQkJCQkJCSB3X3N6LCBweG1pdGJ1Zik7Ci0JCXJ0d19jb3VudF90eF9zdGF0czIzYShwYWRhcHRlciwgcHhtaXRmcmFtZSwgc3opOwotCi0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJydHdfd3JpdGVfcG9ydCwgd19zeiA9JWRcbiIsIHdfc3opOwotCi0JCW1lbV9hZGRyICs9IHdfc3o7Ci0KLQkJbWVtX2FkZHIgPSBQVFJfQUxJR04obWVtX2FkZHIsIDQpOwotCX0KLQotCXJ0d19mcmVlX3htaXRmcmFtZTIzYShweG1pdHByaXYsIHB4bWl0ZnJhbWUpOwotCi0JaWYgIChyZXQgIT0gX1NVQ0NFU1MpCi0JCXJ0dzIzYV9zY3R4X2RvbmVfZXJyKCZweG1pdGJ1Zi0+c2N0eCwgUlRXX1NDVFhfRE9ORV9VTktOT1dOKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWJvb2wgcnRsODcyM2F1X3htaXRmcmFtZV9jb21wbGV0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LAotCQkJCSAgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZikKLXsKLQlzdHJ1Y3QgaHdfeG1pdCAqcGh3eG1pdHM7Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWU7Ci0JaW50IGh3ZW50cnk7Ci0JaW50IHJlcyA9IF9TVUNDRVNTLCB4Y250ID0gMDsKLQotCXBod3htaXRzID0gcHhtaXRwcml2LT5od3htaXRzOwotCWh3ZW50cnkgPSBweG1pdHByaXYtPmh3eG1pdF9lbnRyeTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLCAieG1pdGZyYW1lX2NvbXBsZXRlKClcbiIpOwotCi0JaWYgKHB4bWl0YnVmID09IE5VTEwpIHsKLQkJcHhtaXRidWYgPSBydHdfYWxsb2NfeG1pdGJ1ZjIzYShweG1pdHByaXYpOwotCQlpZiAoIXB4bWl0YnVmKQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQlweG1pdGZyYW1lID0gIHJ0d19kZXF1ZXVlX3hmcmFtZTIzYShweG1pdHByaXYsIHBod3htaXRzLCBod2VudHJ5KTsKLQotCWlmIChweG1pdGZyYW1lKSB7Ci0JCXB4bWl0ZnJhbWUtPnB4bWl0YnVmID0gcHhtaXRidWY7Ci0KLQkJcHhtaXRmcmFtZS0+YnVmX2FkZHIgPSBweG1pdGJ1Zi0+cGJ1ZjsKLQotCQlweG1pdGJ1Zi0+cHJpdl9kYXRhID0gcHhtaXRmcmFtZTsKLQotCQlpZiAocHhtaXRmcmFtZS0+ZnJhbWVfdGFnID09IERBVEFfRlJBTUVUQUcpIHsKLQkJCWlmIChweG1pdGZyYW1lLT5hdHRyaWIucHJpb3JpdHkgPD0gMTUpLyogVElEMH4xNSAqLwotCQkJCXJlcyA9IHJ0d194bWl0ZnJhbWVfY29hbGVzY2UyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUtPnBrdCwgcHhtaXRmcmFtZSk7Ci0KLQkJCXJ0d19vc194bWl0X2NvbXBsZXRlMjNhKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsvKiBhbHdheXMgcmV0dXJuIG5kaXNfcGFja2V0IGFmdGVyIHJ0d194bWl0ZnJhbWVfY29hbGVzY2UyM2EgKi8KLQkJfQotCi0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJ4bWl0ZnJhbWVfY29tcGxldGUoKTogcnR3X2R1bXBfeGZyYW1lXG4iKTsKLQotCQlpZiAocmVzID09IF9TVUNDRVNTKSB7Ci0JCQlydHdfZHVtcF94ZnJhbWUocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCQl9IGVsc2UgewotCQkJcnR3X2ZyZWVfeG1pdGJ1ZjIzYShweG1pdHByaXYsIHB4bWl0YnVmKTsKLQkJCXJ0d19mcmVlX3htaXRmcmFtZTIzYShweG1pdHByaXYsIHB4bWl0ZnJhbWUpOwotCQl9Ci0JCXhjbnQrKzsKLQl9IGVsc2UgewotCQlydHdfZnJlZV94bWl0YnVmMjNhKHB4bWl0cHJpdiwgcHhtaXRidWYpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50IHhtaXRmcmFtZV9kaXJlY3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQlpbnQgcmVzOwotCi0JcmVzID0gcnR3X3htaXRmcmFtZV9jb2FsZXNjZTIzYShwYWRhcHRlciwgcHhtaXRmcmFtZS0+cGt0LCBweG1pdGZyYW1lKTsKLQlpZiAocmVzID09IF9TVUNDRVNTKQotCQlydHdfZHVtcF94ZnJhbWUocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qCi0gKiBSZXR1cm4KLSAqCXRydWUJZHVtcCBwYWNrZXQgZGlyZWN0bHkKLSAqCWZhbHNlCWVucXVldWUgcGFja2V0Ci0gKi8KLWJvb2wgcnRsODcyM2F1X2hhbF94bWl0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQlpbnQgcmVzOwotCXN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYgPSBOVUxMOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlwYXR0cmliLT5xc2VsID0gcGF0dHJpYi0+cHJpb3JpdHk7Ci0Jc3Bpbl9sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JaWYgKHhtaXRmcmFtZV9lbnF1ZXVlX2Zvcl9zbGVlcGluZ19zdGEyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpKSB7Ci0JCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQkJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQotCQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQotCQlpZiAocGF0dHJpYi0+cHN0YSkKLQkJCXBzdGEgPSBwYXR0cmliLT5wc3RhOwotCQllbHNlCi0JCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwYXR0cmliLT5yYSk7Ci0KLQkJaWYgKHBzdGEpIHsKLQkJCWlmIChwc3RhLT5zbGVlcHFfbGVuID4gKE5SX1hNSVRGUkFNRT4+MykpCi0JCQkJd2FrZXVwX3N0YV90b194bWl0MjNhKHBhZGFwdGVyLCBwc3RhKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0jZW5kaWYKLQotCWlmIChydHdfdHhmcmFtZXNfc3RhX2FjX3BlbmRpbmcyM2EocGFkYXB0ZXIsIHBhdHRyaWIpID4gMCkKLQkJZ290byBlbnF1ZXVlOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZfF9GV19VTkRFUl9MSU5LSU5HKSA9PSB0cnVlKQotCQlnb3RvIGVucXVldWU7Ci0KLQlweG1pdGJ1ZiA9IHJ0d19hbGxvY194bWl0YnVmMjNhKHB4bWl0cHJpdik7Ci0JaWYgKHB4bWl0YnVmID09IE5VTEwpCi0JCWdvdG8gZW5xdWV1ZTsKLQotCXNwaW5fdW5sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCi0JcHhtaXRmcmFtZS0+cHhtaXRidWYgPSBweG1pdGJ1ZjsKLQlweG1pdGZyYW1lLT5idWZfYWRkciA9IHB4bWl0YnVmLT5wYnVmOwotCXB4bWl0YnVmLT5wcml2X2RhdGEgPSBweG1pdGZyYW1lOwotCi0JaWYgKHhtaXRmcmFtZV9kaXJlY3QocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpICE9IF9TVUNDRVNTKSB7Ci0JCXJ0d19mcmVlX3htaXRidWYyM2EocHhtaXRwcml2LCBweG1pdGJ1Zik7Ci0JCXJ0d19mcmVlX3htaXRmcmFtZTIzYShweG1pdHByaXYsIHB4bWl0ZnJhbWUpOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLQotZW5xdWV1ZToKLQlyZXMgPSBydHdfeG1pdGZyYW1lX2VucXVldWUyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCXNwaW5fdW5sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCi0JaWYgKHJlcyAhPSBfU1VDQ0VTUykgewotCQlSVF9UUkFDRShfbW9kdWxlX3htaXRfb3NkZXBfY18sIF9kcnZfZXJyXywKLQkJCSAicHJlX3htaXRmcmFtZTogZW5xdWV1ZSB4bWl0ZnJhbWUgZmFpbFxuIik7Ci0JCXJ0d19mcmVlX3htaXRmcmFtZTIzYShweG1pdHByaXYsIHB4bWl0ZnJhbWUpOwotCi0JCS8qICBUcmljaywgbWFrZSB0aGUgc3RhdGlzdGljcyBjb3JyZWN0ICovCi0JCXB4bWl0cHJpdi0+dHhfcGt0cy0tOwotCQlweG1pdHByaXYtPnR4X2Ryb3ArKzsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotaW50IHJ0bDg3MjNhdV9tZ250X3htaXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lKQotewotCXJldHVybiBydHdfZHVtcF94ZnJhbWUocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotfQotCi1pbnQgcnRsODcyM2F1X2hhbF94bWl0ZnJhbWVfZW5xdWV1ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCWludCBlcnI7Ci0KLQllcnIgPSBydHdfeG1pdGZyYW1lX2VucXVldWUyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCWlmIChlcnIgIT0gX1NVQ0NFU1MpIHsKLQkJcnR3X2ZyZWVfeG1pdGZyYW1lMjNhKHB4bWl0cHJpdiwgcHhtaXRmcmFtZSk7Ci0KLQkJLyogIFRyaWNrLCBtYWtlIHRoZSBzdGF0aXN0aWNzIGNvcnJlY3QgKi8KLQkJcHhtaXRwcml2LT50eF9wa3RzLS07Ci0JCXB4bWl0cHJpdi0+dHhfZHJvcCsrOwotCX0gZWxzZSB7Ci0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnB4bWl0cHJpdi0+eG1pdF90YXNrbGV0KTsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3VzYl9oYWxpbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC91c2JfaGFsaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTQ3YWViLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3VzYl9oYWxpbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfSENJX0hBTF9JTklUX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8cnR3X2VmdXNlLmg+Ci0KLSNpbmNsdWRlIDxIYWxQd3JTZXFDbWQuaD4KLSNpbmNsdWRlIDxIYWw4NzIzUHdyU2VxLmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0jaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+Ci0KLSNpbmNsdWRlIDx1c2Jfb3BzLmg+Ci0KLXN0YXRpYyB2b2lkIHBoeV9Tc1B3clN3aXRjaDkyQ1Uoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgZVJGUG93ZXJTdGF0ZSk7Ci0KLXN0YXRpYyB2b2lkCi1fQ29uZmlnQ2hpcE91dEVQKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHU4IE51bU91dFBpcGUpCi17Ci0JdTggdmFsdWU4OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOwotCi0JcEhhbERhdGEtPk91dEVwUXVldWVTZWwgPSAwOwotCXBIYWxEYXRhLT5PdXRFcE51bWJlciA9IDA7Ci0KLQkvKiAgTm9ybWFsIGFuZCBIaWdoIHF1ZXVlICovCi0JdmFsdWU4ID0gcnRsODcyM2F1X3JlYWQ4KHBBZGFwdGVyLCAoUkVHX05PUk1BTF9TSUVfRVAgKyAxKSk7Ci0KLQlpZiAodmFsdWU4ICYgVVNCX05PUk1BTF9TSUVfRVBfTUFTSykgewotCQlwSGFsRGF0YS0+T3V0RXBRdWV1ZVNlbCB8PSBUWF9TRUxFX0hROwotCQlwSGFsRGF0YS0+T3V0RXBOdW1iZXIrKzsKLQl9Ci0KLQlpZiAoKHZhbHVlOCA+PiBVU0JfTk9STUFMX1NJRV9FUF9TSElGVCkgJiBVU0JfTk9STUFMX1NJRV9FUF9NQVNLKSB7Ci0JCXBIYWxEYXRhLT5PdXRFcFF1ZXVlU2VsIHw9IFRYX1NFTEVfTlE7Ci0JCXBIYWxEYXRhLT5PdXRFcE51bWJlcisrOwotCX0KLQotCS8qICBMb3cgcXVldWUgKi8KLQl2YWx1ZTggPSBydGw4NzIzYXVfcmVhZDgocEFkYXB0ZXIsIChSRUdfTk9STUFMX1NJRV9FUCArIDIpKTsKLQlpZiAodmFsdWU4ICYgVVNCX05PUk1BTF9TSUVfRVBfTUFTSykgewotCQlwSGFsRGF0YS0+T3V0RXBRdWV1ZVNlbCB8PSBUWF9TRUxFX0xROwotCQlwSGFsRGF0YS0+T3V0RXBOdW1iZXIrKzsKLQl9Ci0KLQkvKiAgVE9ETzogRXJyb3IgcmVjb3ZlcnkgZm9yIHRoaXMgY2FzZSAqLwotCS8qIFJUX0FTU0VSVCgoTnVtT3V0UGlwZSA9PSBwSGFsRGF0YS0+T3V0RXBOdW1iZXIpLAotCSAgICgiT3V0IEVQIG51bWJlciBpc24ndCBtYXRjaCEgJWQoRGVzY3JpcHRvcikgIT0gJWQgKFNJRSByZWcpXG4iLAotCSAgICh1MzIpTnVtT3V0UGlwZSwgKHUzMilwSGFsRGF0YS0+T3V0RXBOdW1iZXIpKTsgKi8KLX0KLQotYm9vbCBydGw4NzIzYXVfY2hpcF9jb25maWd1cmUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqcGR2b2JqcHJpdiA9IGFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpOwotCXU4IE51bUluUGlwZSA9IHBkdm9ianByaXYtPlJ0TnVtSW5QaXBlczsKLQl1OCBOdW1PdXRQaXBlID0gcGR2b2JqcHJpdi0+UnROdW1PdXRQaXBlczsKLQotCV9Db25maWdDaGlwT3V0RVAocGFkYXB0ZXIsIE51bU91dFBpcGUpOwotCi0JLyogIE5vcm1hbCBjaGlwIHdpdGggb25lIElOIGFuZCBvbmUgT1VUIGRvZXNuJ3QgaGF2ZSBpbnRlcnJ1cHQgSU4gRVAuICovCi0JaWYgKHBIYWxEYXRhLT5PdXRFcE51bWJlciA9PSAxKSB7Ci0JCWlmIChOdW1JblBpcGUgIT0gMSkKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gSGFsX01hcHBpbmdPdXRQaXBlMjNhKHBhZGFwdGVyLCBOdW1PdXRQaXBlKTsKLX0KLQotc3RhdGljIGludCBfSW5pdFBvd2VyT24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1MTYgdmFsdWUxNjsKLQl1OCB2YWx1ZTg7Ci0KLQkvKiAgUlNWX0NUUkwgMHgxQ1s3OjBdID0gMHgwMAotCSAgICB1bmxvY2sgSVNPL0NMSy9Qb3dlciBjb250cm9sIHJlZ2lzdGVyICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1JTVl9DVFJMLCAweDApOwotCi0JLyogIEhXIFBvd2VyIG9uIHNlcXVlbmNlICovCi0JaWYgKCFIYWxQd3JTZXFDbWRQYXJzaW5nMjNhKHBhZGFwdGVyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywKLQkJCQkgUFdSX0lOVEZfVVNCX01TSywgcnRsODcyM0FVX2NhcmRfZW5hYmxlX2Zsb3cpKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQkvKiAgMHgwNFsxOV0gPSAxLCBzdWdnZXN0IGJ5IEphY2tpZSAyMDExLjA1LjA5LCByZXNldCA4MDUxICovCi0JdmFsdWU4ID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfQVBTX0ZTTUNPKzIpOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19BUFNfRlNNQ08gKyAyLCB2YWx1ZTggfCBCSVQoMykpOwotCi0JLyogIEVuYWJsZSBNQUMgRE1BL1dNQUMvU0NIRURVTEUvU0VDIGJsb2NrICovCi0JLyogIFNldCBDUiBiaXQxMCB0byBlbmFibGUgMzJrIGNhbGlicmF0aW9uLiBTdWdnZXN0ZWQgYnkgU0QxIEdpbW15LgotCSAgICBBZGRlZCBieSB0eW5saS4gMjAxMS4wOC4zMS4gKi8KLQl2YWx1ZTE2ID0gcnRsODcyM2F1X3JlYWQxNihwYWRhcHRlciwgUkVHX0NSKTsKLQl2YWx1ZTE2IHw9IChIQ0lfVFhETUFfRU4gfCBIQ0lfUlhETUFfRU4gfCBUWERNQV9FTiB8IFJYRE1BX0VOIHwKLQkJICAgIFBST1RPQ09MX0VOIHwgU0NIRURVTEVfRU4gfCBNQUNUWEVOIHwgTUFDUlhFTiB8Ci0JCSAgICBFTlNFQyB8IENBTFRNUl9FTik7Ci0JcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19DUiwgdmFsdWUxNik7Ci0KLQkvKiBmb3IgRWZ1c2UgUEcsIHN1Z2dlc3QgYnkgSmFja2llIDIwMTEuMTEuMjMgKi8KLQlQSFlfU2V0QkJSZWcocGFkYXB0ZXIsIFJFR19FRlVTRV9DVFJMLCBCSVQoMjgpfEJJVCgyOSl8QklUKDMwKSwgMHgwNik7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLS8qICBTaGFsbCBVU0IgaW50ZXJmYWNlIGluaXQgdGhpcz8gKi8KLXN0YXRpYyB2b2lkIF9Jbml0SW50ZXJydXB0KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQl1MzIgdmFsdWUzMjsKLQotCS8qICBISVNSIC0gdHVybiBhbGwgb24gKi8KLQl2YWx1ZTMyID0gMHhGRkZGRkZGRjsKLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfSElTUiwgdmFsdWUzMik7Ci0KLQkvKiAgSElNUiAtIHR1cm4gYWxsIG9uICovCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0hJTVIsIHZhbHVlMzIpOwotfQotCi1zdGF0aWMgdm9pZCBfSW5pdFF1ZXVlUmVzZXJ2ZWRQYWdlKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJkFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQl1MzIgbnVtSFEgPSAwOwotCXUzMiBudW1MUSA9IDA7Ci0JdTMyIG51bU5RID0gMDsKLQl1MzIgbnVtUHViUTsKLQl1MzIgdmFsdWUzMjsKLQl1OCB2YWx1ZTg7Ci0JYm9vbCBiV2lGaUNvbmZpZyA9IHByZWdpc3RyeXByaXYtPndpZmlfc3BlYzsKLQotCS8qIFJUX0FTU0VSVCgob3V0RVBOdW0+PSAyKSwgKCJmb3IgV01NICwgbnVtYmVyIG9mIG91dC1lcCAiCi0JICAgIm11c3QgbW9yZSB0aGFuIG9yIGVxdWFsIHRvIDIhXG4iKSk7ICovCi0KLQludW1QdWJRID0gYldpRmlDb25maWcgPyBXTU1fTk9STUFMX1BBR0VfTlVNX1BVQlEgOiBOT1JNQUxfUEFHRV9OVU1fUFVCUTsKLQotCWlmIChwSGFsRGF0YS0+T3V0RXBRdWV1ZVNlbCAmIFRYX1NFTEVfSFEpIHsKLQkJbnVtSFEgPSBiV2lGaUNvbmZpZyA/Ci0JCQlXTU1fTk9STUFMX1BBR0VfTlVNX0hQUSA6IE5PUk1BTF9QQUdFX05VTV9IUFE7Ci0JfQotCi0JaWYgKHBIYWxEYXRhLT5PdXRFcFF1ZXVlU2VsICYgVFhfU0VMRV9MUSkgewotCQludW1MUSA9IGJXaUZpQ29uZmlnID8KLQkJCVdNTV9OT1JNQUxfUEFHRV9OVU1fTFBRIDogTk9STUFMX1BBR0VfTlVNX0xQUTsKLQl9Ci0JLyogIE5PVEU6IFRoaXMgc3RlcCBzaGFsbCBiZSBwcm9jZWVkIGJlZm9yZQotCSAgICB3cml0dGluZyBSRUdfUlFQTi4gKi8KLQlpZiAocEhhbERhdGEtPk91dEVwUXVldWVTZWwgJiBUWF9TRUxFX05RKSB7Ci0JCW51bU5RID0gYldpRmlDb25maWcgPwotCQkJV01NX05PUk1BTF9QQUdFX05VTV9OUFEgOiBOT1JNQUxfUEFHRV9OVU1fTlBROwotCX0KLQl2YWx1ZTggPSAodTgpX05QUShudW1OUSk7Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfUlFQTl9OUFEsIHZhbHVlOCk7Ci0KLQkvKiAgVFggRE1BICovCi0JdmFsdWUzMiA9IF9IUFEobnVtSFEpIHwgX0xQUShudW1MUSkgfCBfUFVCUShudW1QdWJRKSB8IExEX1JRUE47Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX1JRUE4sIHZhbHVlMzIpOwotfQotCi1zdGF0aWMgdm9pZCBfSW5pdFR4QnVmZmVyQm91bmRhcnkoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJkFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQotCXU4IHR4cGt0YnVmX2JuZHk7Ci0KLQlpZiAoIXByZWdpc3RyeXByaXYtPndpZmlfc3BlYykKLQkJdHhwa3RidWZfYm5keSA9IFRYX1BBR0VfQk9VTkRBUlk7Ci0JZWxzZSAvKiBmb3IgV01NICovCi0JCXR4cGt0YnVmX2JuZHkgPSBXTU1fTk9STUFMX1RYX1BBR0VfQk9VTkRBUlk7Ci0KLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19UWFBLVEJVRl9CQ05RX0JETlksIHR4cGt0YnVmX2JuZHkpOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1RYUEtUQlVGX01HUV9CRE5ZLCB0eHBrdGJ1Zl9ibmR5KTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19UWFBLVEJVRl9XTUFDX0xCS19CRl9IRCwgdHhwa3RidWZfYm5keSk7Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfVFJYRkZfQk5EWSwgdHhwa3RidWZfYm5keSk7Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfVERFQ1RSTCsxLCB0eHBrdGJ1Zl9ibmR5KTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXRQYWdlQm91bmRhcnkoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCS8qICBSWCBQYWdlIEJvdW5kYXJ5ICovCi0JLyogc3JhbmQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Pih0aW1lKE5VTEwpKSk7ICovCi0JdTE2IHJ4ZmZfYm5keSA9IDB4MjdGRjsvKiByYW5kKCkgJSAxKSA/IDB4MjdGRiA6IDB4MjNGRjsgKi8KLQotCXJ0bDg3MjNhdV93cml0ZTE2KEFkYXB0ZXIsIChSRUdfVFJYRkZfQk5EWSArIDIpLCByeGZmX2JuZHkpOwotCi0JLyogIFRPRE86ID8/IHNoYWxsIHdlIHNldCB0eCBib3VuZGFyeT8gKi8KLX0KLQotc3RhdGljIHZvaWQKLV9Jbml0Tm9ybWFsQ2hpcFJlZ1ByaW9yaXR5KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTE2IGJlUSwgdTE2IGJrUSwKLQkJCSAgIHUxNiB2aVEsIHUxNiB2b1EsIHUxNiBtZ3RRLCB1MTYgaGlRKQotewotCXUxNiB2YWx1ZTE2ID0gcnRsODcyM2F1X3JlYWQxNihBZGFwdGVyLCBSRUdfVFJYRE1BX0NUUkwpICYgMHg3OwotCi0JdmFsdWUxNiB8PSBfVFhETUFfQkVRX01BUChiZVEpIHwgX1RYRE1BX0JLUV9NQVAoYmtRKSB8Ci0JCV9UWERNQV9WSVFfTUFQKHZpUSkgfCBfVFhETUFfVk9RX01BUCh2b1EpIHwKLQkJX1RYRE1BX01HUV9NQVAobWd0USkgfCBfVFhETUFfSElRX01BUChoaVEpOwotCi0JcnRsODcyM2F1X3dyaXRlMTYoQWRhcHRlciwgUkVHX1RSWERNQV9DVFJMLCB2YWx1ZTE2KTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXROb3JtYWxDaGlwT25lT3V0RXBQcmlvcml0eShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQl1MTYgdmFsdWUgPSAwOwotCi0Jc3dpdGNoIChwSGFsRGF0YS0+T3V0RXBRdWV1ZVNlbCkgewotCWNhc2UgVFhfU0VMRV9IUToKLQkJdmFsdWUgPSBRVUVVRV9ISUdIOwotCQlicmVhazsKLQljYXNlIFRYX1NFTEVfTFE6Ci0JCXZhbHVlID0gUVVFVUVfTE9XOwotCQlicmVhazsKLQljYXNlIFRYX1NFTEVfTlE6Ci0JCXZhbHVlID0gUVVFVUVfTk9STUFMOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBSVF9BU1NFUlQoZmFsc2UsICgiU2hhbGwgbm90IHJlYWNoIGhlcmUhXG4iKSk7ICovCi0JCWJyZWFrOwotCX0KLQotCV9Jbml0Tm9ybWFsQ2hpcFJlZ1ByaW9yaXR5KEFkYXB0ZXIsIHZhbHVlLCB2YWx1ZSwgdmFsdWUsCi0JCQkJICAgdmFsdWUsIHZhbHVlLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9Jbml0Tm9ybWFsQ2hpcFR3b091dEVwUHJpb3JpdHkoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmQWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXUxNiBiZVEsIGJrUSwgdmlRLCB2b1EsIG1ndFEsIGhpUTsKLQl1MTYgdmFsdWVIaSA9IDA7Ci0JdTE2IHZhbHVlTG93ID0gMDsKLQotCXN3aXRjaCAocEhhbERhdGEtPk91dEVwUXVldWVTZWwpIHsKLQljYXNlIChUWF9TRUxFX0hRIHwgVFhfU0VMRV9MUSk6Ci0JCXZhbHVlSGkgPSBRVUVVRV9ISUdIOwotCQl2YWx1ZUxvdyA9IFFVRVVFX0xPVzsKLQkJYnJlYWs7Ci0JY2FzZSAoVFhfU0VMRV9OUSB8IFRYX1NFTEVfTFEpOgotCQl2YWx1ZUhpID0gUVVFVUVfTk9STUFMOwotCQl2YWx1ZUxvdyA9IFFVRVVFX0xPVzsKLQkJYnJlYWs7Ci0JY2FzZSAoVFhfU0VMRV9IUSB8IFRYX1NFTEVfTlEpOgotCQl2YWx1ZUhpID0gUVVFVUVfSElHSDsKLQkJdmFsdWVMb3cgPSBRVUVVRV9OT1JNQUw7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIFJUX0FTU0VSVChmYWxzZSwgKCJTaGFsbCBub3QgcmVhY2ggaGVyZSFcbiIpKTsgKi8KLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCFwcmVnaXN0cnlwcml2LT53aWZpX3NwZWMpIHsKLQkJYmVRID0gdmFsdWVMb3c7Ci0JCWJrUSA9IHZhbHVlTG93OwotCQl2aVEgPSB2YWx1ZUhpOwotCQl2b1EgPSB2YWx1ZUhpOwotCQltZ3RRID0gdmFsdWVIaTsKLQkJaGlRID0gdmFsdWVIaTsKLQl9IGVsc2Ugey8qIGZvciBXTU0gLCBDT05GSUdfT1VUX0VQX1dJRklfTU9ERSAqLwotCQliZVEgPSB2YWx1ZUxvdzsKLQkJYmtRID0gdmFsdWVIaTsKLQkJdmlRID0gdmFsdWVIaTsKLQkJdm9RID0gdmFsdWVMb3c7Ci0JCW1ndFEgPSB2YWx1ZUhpOwotCQloaVEgPSB2YWx1ZUhpOwotCX0KLQotCV9Jbml0Tm9ybWFsQ2hpcFJlZ1ByaW9yaXR5KEFkYXB0ZXIsIGJlUSwgYmtRLCB2aVEsIHZvUSwgbWd0USwgaGlRKTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXROb3JtYWxDaGlwVGhyZWVPdXRFcFByaW9yaXR5KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZBZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0JdTE2IGJlUSwgYmtRLCB2aVEsIHZvUSwgbWd0USwgaGlROwotCi0JaWYgKCFwcmVnaXN0cnlwcml2LT53aWZpX3NwZWMpIHsvKiAgdHlwaWNhbCBzZXR0aW5nICovCi0JCWJlUSA9IFFVRVVFX0xPVzsKLQkJYmtRID0gUVVFVUVfTE9XOwotCQl2aVEgPSBRVUVVRV9OT1JNQUw7Ci0JCXZvUSA9IFFVRVVFX0hJR0g7Ci0JCW1ndFEgPSBRVUVVRV9ISUdIOwotCQloaVEgPSBRVUVVRV9ISUdIOwotCX0gZWxzZSB7LyogIGZvciBXTU0gKi8KLQkJYmVRID0gUVVFVUVfTE9XOwotCQlia1EgPSBRVUVVRV9OT1JNQUw7Ci0JCXZpUSA9IFFVRVVFX05PUk1BTDsKLQkJdm9RID0gUVVFVUVfSElHSDsKLQkJbWd0USA9IFFVRVVFX0hJR0g7Ci0JCWhpUSA9IFFVRVVFX0hJR0g7Ci0JfQotCV9Jbml0Tm9ybWFsQ2hpcFJlZ1ByaW9yaXR5KEFkYXB0ZXIsIGJlUSwgYmtRLCB2aVEsIHZvUSwgbWd0USwgaGlRKTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXRRdWV1ZVByaW9yaXR5KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCi0Jc3dpdGNoIChwSGFsRGF0YS0+T3V0RXBOdW1iZXIpIHsKLQljYXNlIDE6Ci0JCV9Jbml0Tm9ybWFsQ2hpcE9uZU91dEVwUHJpb3JpdHkoQWRhcHRlcik7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJX0luaXROb3JtYWxDaGlwVHdvT3V0RXBQcmlvcml0eShBZGFwdGVyKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlfSW5pdE5vcm1hbENoaXBUaHJlZU91dEVwUHJpb3JpdHkoQWRhcHRlcik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIFJUX0FTU0VSVChmYWxzZSwgKCJTaGFsbCBub3QgcmVhY2ggaGVyZSFcbiIpKTsgKi8KLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfSW5pdFRyYW5zZmVyUGFnZVNpemUoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCS8qICBUeCBwYWdlIHNpemUgaXMgYWx3YXlzIDEyOC4gKi8KLQotCXU4IHZhbHVlODsKLQl2YWx1ZTggPSBfUFNSWChQQlBfMTI4KSB8IF9QU1RYKFBCUF8xMjgpOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1BCUCwgdmFsdWU4KTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXREcml2ZXJJbmZvU2l6ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4IGRydkluZm9TaXplKQotewotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1JYX0RSVklORk9fU1osIGRydkluZm9TaXplKTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXRXTUFDU2V0dGluZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQotCS8qICBkb24ndCB0dXJuIG9uIEFBUCwgaXQgd2lsbCBhbGxvdyBhbGwgcGFja2V0cyB0byBkcml2ZXIgKi8KLQlwSGFsRGF0YS0+UmVjZWl2ZUNvbmZpZyA9IFJDUl9BUE0gfCBSQ1JfQU0gfCBSQ1JfQUIgfCBSQ1JfQ0JTU0lEX0RBVEEgfAotCQkJCSAgUkNSX0NCU1NJRF9CQ04gfCBSQ1JfQVBQX0lDViB8IFJDUl9BTUYgfAotCQkJCSAgUkNSX0hUQ19MT0NfQ1RSTCB8IFJDUl9BUFBfTUlDIHwKLQkJCQkgIFJDUl9BUFBfUEhZU1RTOwotCi0JLyogIHNvbWUgUkVHX1JDUiB3aWxsIGJlIG1vZGlmaWVkIGxhdGVyIGJ5Ci0JICAgIHBoeV9Db25maWdNQUNXaXRoSGVhZGVyRmlsZSgpICovCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX1JDUiwgcEhhbERhdGEtPlJlY2VpdmVDb25maWcpOwotCi0JLyogIEFjY2VwdCBhbGwgbXVsdGljYXN0IGFkZHJlc3MgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfTUFSLCAweEZGRkZGRkZGKTsKLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfTUFSICsgNCwgMHhGRkZGRkZGRik7Ci0KLQkvKiAgQWNjZXB0IGFsbCBkYXRhIGZyYW1lcyAqLwotCS8qIHZhbHVlMTYgPSAweEZGRkY7ICovCi0JLyogcnRsODcyM2F1X3dyaXRlMTYoQWRhcHRlciwgUkVHX1JYRkxUTUFQMiwgdmFsdWUxNik7ICovCi0KLQkvKiAgMjAxMC4wOS4wOCBocGZhbiAqLwotCS8qICBTaW5jZSBBREYgaXMgcmVtb3ZlZCBmcm9tIFJDUiwgcHMtcG9sbCB3aWxsIG5vdCBiZSBpbmRpY2F0ZQotCSAgICB0byBkcml2ZXIsICovCi0JLyogIFJ4RmlsdGVyTWFwIHNob3VsZCBtYXNrIHBzLXBvbGwgdG8gZ3VhcmFudGVlIEFQIG1vZGUgY2FuCi0JICAgIHJ4IHBzLXBvbGwuICovCi0JLyogdmFsdWUxNiA9IDB4NDAwOyAqLwotCS8qIHJ0bDg3MjNhdV93cml0ZTE2KEFkYXB0ZXIsIFJFR19SWEZMVE1BUDEsIHZhbHVlMTYpOyAqLwotCi0JLyogIEFjY2VwdCBhbGwgbWFuYWdlbWVudCBmcmFtZXMgKi8KLQkvKiB2YWx1ZTE2ID0gMHhGRkZGOyAqLwotCS8qIHJ0bDg3MjNhdV93cml0ZTE2KEFkYXB0ZXIsIFJFR19SWEZMVE1BUDAsIHZhbHVlMTYpOyAqLwotCi0JLyogZW5hYmxlIFJYX1NISUZUIGJpdHMgKi8KLQkvKiBydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19UUlhETUFfQ1RSTCwgcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsCi0JICAgUkVHX1RSWERNQV9DVFJMKXxCSVQoMSkpOyAqLwotfQotCi1zdGF0aWMgdm9pZCBfSW5pdEFkYXB0aXZlQ3RybChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JdTE2IHZhbHVlMTY7Ci0JdTMyIHZhbHVlMzI7Ci0KLQkvKiAgUmVzcG9uc2UgUmF0ZSBTZXQgKi8KLQl2YWx1ZTMyID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBSRUdfUlJTUik7Ci0JdmFsdWUzMiAmPSB+UkFURV9CSVRNQVBfQUxMOwotCXZhbHVlMzIgfD0gUkFURV9SUlNSX0NDS19PTkxZXzFNOwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19SUlNSLCB2YWx1ZTMyKTsKLQotCS8qICBDRi1FTkQgVGhyZXNob2xkICovCi0JLyogbV9zcElvQmFzZS0+cnRsODcyM2F1X3dyaXRlOChSRUdfQ0ZFTkRfVEgsIDB4MSk7ICovCi0KLQkvKiAgU0lGUyAodXNlZCBpbiBOQVYpICovCi0JdmFsdWUxNiA9IF9TUEVDX1NJRlNfQ0NLKDB4MTApIHwgX1NQRUNfU0lGU19PRkRNKDB4MTApOwotCXJ0bDg3MjNhdV93cml0ZTE2KEFkYXB0ZXIsIFJFR19TUEVDX1NJRlMsIHZhbHVlMTYpOwotCi0JLyogIFJldHJ5IExpbWl0ICovCi0JdmFsdWUxNiA9IF9MUkwoMHgzMCkgfCBfU1JMKDB4MzApOwotCXJ0bDg3MjNhdV93cml0ZTE2KEFkYXB0ZXIsIFJFR19STCwgdmFsdWUxNik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9Jbml0UmF0ZUZhbGxiYWNrKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQkvKiAgU2V0IERhdGEgQXV0byBSYXRlIEZhbGxiYWNrIFJldHJ5IENvdW50IHJlZ2lzdGVyLiAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19EQVJGUkMsIDB4MDAwMDAwMDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19EQVJGUkMrNCwgMHgxMDA4MDQwNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX1JBUkZSQywgMHgwNDAzMDIwMSk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX1JBUkZSQys0LCAweDA4MDcwNjA1KTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXRFRENBKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQkvKiAgU2V0IFNwZWMgU0lGUyAodXNlZCBpbiBOQVYpICovCi0JcnRsODcyM2F1X3dyaXRlMTYoQWRhcHRlciwgUkVHX1NQRUNfU0lGUywgMHgxMDBhKTsKLQlydGw4NzIzYXVfd3JpdGUxNihBZGFwdGVyLCBSRUdfTUFDX1NQRUNfU0lGUywgMHgxMDBhKTsKLQotCS8qICBTZXQgU0lGUyBmb3IgQ0NLICovCi0JcnRsODcyM2F1X3dyaXRlMTYoQWRhcHRlciwgUkVHX1NJRlNfQ1RYLCAweDEwMGEpOwotCi0JLyogIFNldCBTSUZTIGZvciBPRkRNICovCi0JcnRsODcyM2F1X3dyaXRlMTYoQWRhcHRlciwgUkVHX1NJRlNfVFJYLCAweDEwMGEpOwotCi0JLyogIFRYT1AgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfRURDQV9CRV9QQVJBTSwgMHgwMDVFQTQyQik7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0VEQ0FfQktfUEFSQU0sIDB4MDAwMEE0NEYpOwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19FRENBX1ZJX1BBUkFNLCAweDAwNUVBMzI0KTsKLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfRURDQV9WT19QQVJBTSwgMHgwMDJGQTIyNik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9Jbml0UkRHU2V0dGluZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfUkRfQ1RSTCwgMHhGRik7Ci0JcnRsODcyM2F1X3dyaXRlMTYoQWRhcHRlciwgUkVHX1JEX05BVl9OWFQsIDB4MjAwKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19SRF9SRVNQX1BLVF9USCwgMHgwNSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9Jbml0UmV0cnlGdW5jdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JdTggdmFsdWU4OwotCi0JdmFsdWU4ID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIFJFR19GV0hXX1RYUV9DVFJMKTsKLQl2YWx1ZTggfD0gRU5fQU1QRFVfUlRZX05FVzsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19GV0hXX1RYUV9DVFJMLCB2YWx1ZTgpOwotCi0JLyogIFNldCBBQ0sgdGltZW91dCAqLwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX0FDS1RPLCAweDQwKTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXRSRlR5cGUoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQlwSGFsRGF0YS0+cmZfdHlwZSA9IFJGXzFUMVI7Ci19Ci0KLS8qICBTZXQgQ0NLIGFuZCBPRkRNIEJsb2NrICJPTiIgKi8KLXN0YXRpYyB2b2lkIF9CQlR1cm5PbkJsb2NrKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0EwX1JGTU9ELCBiQ0NLRW4sIDB4MSk7Ci0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCwgYk9GRE1FbiwgMHgxKTsKLX0KLQotI2RlZmluZSBNZ250QWN0U2V0X1JGX1N0YXRlKC4uLikKLXN0YXRpYyB2b2lkIF9SZlBvd2VyU2F2ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotfQotCi1lbnVtIHsKLQlBbnRlbm5hX0xmZXQgPSAxLAotCUFudGVubmFfUmlnaHQgPSAyLAotfTsKLQotZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBSZk9uT2ZmRGV0ZWN0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIpCi17Ci0JLyogc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7ICovCi0JdTggdmFsODsKLQllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIHJmcG93ZXJzdGF0ZSA9IHJmX29mZjsKLQotCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIFJFR19NQUNfUElOTVVYX0NGRywKLQkJCSBydGw4NzIzYXVfcmVhZDgocEFkYXB0ZXIsCi0JCQkJCSBSRUdfTUFDX1BJTk1VWF9DRkcpICYgfkJJVCgzKSk7Ci0JdmFsOCA9IHJ0bDg3MjNhdV9yZWFkOChwQWRhcHRlciwgUkVHX0dQSU9fSU9fU0VMKTsKLQlEQkdfODcyM0EoIkdQSU9fSU4gPSUwMnhcbiIsIHZhbDgpOwotCXJmcG93ZXJzdGF0ZSA9ICh2YWw4ICYgQklUKDMpKSA/IHJmX29uIDogcmZfb2ZmOwotCi0JcmV0dXJuIHJmcG93ZXJzdGF0ZTsKLX0KLQotaW50IHJ0bDg3MjNhdV9oYWxfaW5pdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJscHJpdiA9ICZBZGFwdGVyLT5wd3JjdHJscHJpdjsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZBZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0JdTggdmFsOCA9IDA7Ci0JdTMyIGJvdW5kYXJ5OwotCWludCBzdGF0dXMgPSBfU1VDQ0VTUzsKLQlib29sIG1hY19vbjsKLQotCXVuc2lnbmVkIGxvbmcgaW5pdF9zdGFydF90aW1lID0gamlmZmllczsKLQotCUFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkID0gZmFsc2U7Ci0KLQlpZiAoQWRhcHRlci0+cHdyY3RybHByaXYuYmtlZXBmd2FsaXZlKSB7Ci0JCXBoeV9Tc1B3clN3aXRjaDkyQ1UoQWRhcHRlciwgcmZfb24pOwotCi0JCWlmIChwSGFsRGF0YS0+YklRS0luaXRpYWxpemVkKSB7Ci0JCQlydGw4NzIzYV9waHlfaXFfY2FsaWJyYXRlKEFkYXB0ZXIsIHRydWUpOwotCQl9IGVsc2UgewotCQkJcnRsODcyM2FfcGh5X2lxX2NhbGlicmF0ZShBZGFwdGVyLCBmYWxzZSk7Ci0JCQlwSGFsRGF0YS0+YklRS0luaXRpYWxpemVkID0gdHJ1ZTsKLQkJfQotCQlydGw4NzIzYV9vZG1fY2hlY2tfdHhfcG93ZXJfdHJhY2tpbmcoQWRhcHRlcik7Ci0JCXJ0bDg3MjNhX3BoeV9sY19jYWxpYnJhdGUoQWRhcHRlcik7Ci0KLQkJZ290byBleGl0OwotCX0KLQotCS8qICBDaGVjayBpZiBNQUMgaGFzIGFscmVhZHkgcG93ZXIgb24uIGJ5IHR5bmxpLiAyMDExLjA1LjI3LiAqLwotCXZhbDggPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgUkVHX0NSKTsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICIlczogUkVHX0NSIDB4MTAwID0gMHglMDJ4XG4iLCBfX2Z1bmNfXywgdmFsOCk7Ci0JLyogRml4IDkyRFUtVkMgUzMgaGFuZyB3aXRoIHRoZSByZWFzb24gaXMgdGhhdCBzZWNvbmRhcnkgbWFjIGlzIG5vdAotCSAgIGluaXRpYWxpemVkLiAqLwotCS8qIDB4MTAwIHZhbHVlIG9mIGZpcnN0IG1hYyBpcyAweEVBIHdoaWxlIDB4MTAwIHZhbHVlIG9mIHNlY29uZGFyeQotCSAgIGlzIDB4MDAgKi8KLQlpZiAodmFsOCA9PSAweEVBKSB7Ci0JCW1hY19vbiA9IGZhbHNlOwotCX0gZWxzZSB7Ci0JCW1hY19vbiA9IHRydWU7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICIlczogTUFDIGhhcyBhbHJlYWR5IHBvd2VyIG9uXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCi0Jc3RhdHVzID0gX0luaXRQb3dlck9uKEFkYXB0ZXIpOwotCWlmIChzdGF0dXMgPT0gX0ZBSUwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCSAiRmFpbGVkIHRvIGluaXQgcG93ZXIgb24hXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQotCWlmICghcHJlZ2lzdHJ5cHJpdi0+d2lmaV9zcGVjKSB7Ci0JCWJvdW5kYXJ5ID0gVFhfUEFHRV9CT1VOREFSWTsKLQl9IGVsc2UgewotCQkvKiAgZm9yIFdNTSAqLwotCQlib3VuZGFyeSA9IFdNTV9OT1JNQUxfVFhfUEFHRV9CT1VOREFSWTsKLQl9Ci0KLQlpZiAoIW1hY19vbikgewotCQlzdGF0dXMgPSAgSW5pdExMVFRhYmxlMjNhKEFkYXB0ZXIsIGJvdW5kYXJ5KTsKLQkJaWYgKHN0YXR1cyA9PSBfRkFJTCkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgIkZhaWxlZCB0byBpbml0IExMVCB0YWJsZVxuIik7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQl9Ci0KLQlpZiAocEhhbERhdGEtPmJSREdFbmFibGUpCi0JCV9Jbml0UkRHU2V0dGluZyhBZGFwdGVyKTsKLQotCXN0YXR1cyA9IHJ0bDg3MjNhX0Zpcm13YXJlRG93bmxvYWQoQWRhcHRlcik7Ci0JaWYgKHN0YXR1cyAhPSBfU1VDQ0VTUykgewotCQlBZGFwdGVyLT5iRldSZWFkeSA9IGZhbHNlOwotCQlEQkdfODcyM0EoImZ3IGRvd25sb2FkIGZhaWwhXG4iKTsKLQkJZ290byBleGl0OwotCX0gZWxzZSB7Ci0JCUFkYXB0ZXItPmJGV1JlYWR5ID0gdHJ1ZTsKLQkJREJHXzg3MjNBKCJmdyBkb3dubG9hZCBvayFcbiIpOwotCX0KLQotCXJ0bDg3MjNhX0luaXRpYWxpemVGaXJtd2FyZVZhcnMoQWRhcHRlcik7Ci0KLQlpZiAocHdyY3RybHByaXYtPnJlZ19yZm9mZiA9PSB0cnVlKSB7Ci0JCXB3cmN0cmxwcml2LT5yZl9wd3JzdGF0ZSA9IHJmX29mZjsKLQl9Ci0KLQkvKiAgMjAxMC8wOC8wOSBNSCBXZSBuZWVkIHRvIGNoZWNrIGlmIHdlIG5lZWQgdG8gdHVybm9uIG9yIG9mZiBSRiBhZnRlciBkZXRlY3RpbmcgKi8KLQkvKiAgSFcgR1BJTyBwaW4uIEJlZm9yZSBQSFlfUkZDb25maWc4MTkyQy4gKi8KLQkvKiBIYWxEZXRlY3RQd3JEb3duTW9kZShBZGFwdGVyKTsgKi8KLQkvKiAgMjAxMC8wOC8yNiBNSCBJZiBFZnVzZSBkb2VzIG5vdCBzdXBwb3J0IHNlY3RpdmUgc3VzcGVuZCB0aGVuIGRpc2FibGUgdGhlIGZ1bmN0aW9uLiAqLwotCS8qIEhhbERldGVjdFNlbGVjdGl2ZVN1c3BlbmRNb2RlKEFkYXB0ZXIpOyAqLwotCi0JLyogIFNldCBSRiB0eXBlIGZvciBCQi9SRiBjb25maWd1cmF0aW9uICovCi0JX0luaXRSRlR5cGUoQWRhcHRlcik7LyogX1JlYWRSRlR5cGUoKSAqLwotCi0JLyogIFNhdmUgdGFyZ2V0IGNoYW5uZWwgKi8KLQkvKiAgPFJvZ2VyX05vdGVzPiBDdXJyZW50IENoYW5uZWwgd2lsbCBiZSB1cGRhdGVkIGFnYWluIGxhdGVyLiAqLwotCXBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbCA9IDY7LyogZGVmYXVsdCBzZXQgdG8gNiAqLwotCi0Jc3RhdHVzID0gUEhZX01BQ0NvbmZpZzg3MjNBKEFkYXB0ZXIpOwotCWlmIChzdGF0dXMgPT0gX0ZBSUwpIHsKLQkJREJHXzg3MjNBKCJQSFlfTUFDQ29uZmlnODcyM0EgZmF1bHQgISFcbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogICovCi0JLyogZC4gSW5pdGlhbGl6ZSBCQiByZWxhdGVkIGNvbmZpZ3VyYXRpb25zLiAqLwotCS8qICAqLwotCXN0YXR1cyA9IFBIWV9CQkNvbmZpZzg3MjNBKEFkYXB0ZXIpOwotCWlmIChzdGF0dXMgPT0gX0ZBSUwpIHsKLQkJREJHXzg3MjNBKCJQSFlfQkJDb25maWc4NzIzQSBmYXVsdCAhIVxuIik7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiAgQWRkIGZvciB0eCBwb3dlciBieSByYXRlIGZpbmUgdHVuZS4gV2UgbmVlZCB0byBjYWxsIHRoZSBmdW5jdGlvbiBhZnRlciBCQiBjb25maWcuICovCi0JLyogIEJlY2F1c2UgdGhlIHR4IHBvd2VyIGJ5IHJhdGUgdGFibGUgaXMgaW5pdGVkIGluIEJCIGNvbmZpZy4gKi8KLQotCXN0YXR1cyA9IFBIWV9SRjYwNTJfQ29uZmlnODcyM0EoQWRhcHRlcik7Ci0JaWYgKHN0YXR1cyA9PSBfRkFJTCkgewotCQlEQkdfODcyM0EoIlBIWV9SRjYwNTJfQ29uZmlnODcyM0EgZmFpbGVkISFcbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogcmVkdWNpbmcgODBNIHNwdXIgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfQUZFX1hUQUxfQ1RSTCwgMHgwMzgxODA4ZCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0FGRV9QTExfQ1RSTCwgMHhmMGZmZmY4Myk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0FGRV9QTExfQ1RSTCwgMHhmMGZmZmY4Mik7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0FGRV9QTExfQ1RSTCwgMHhmMGZmZmY4Myk7Ci0KLQkvKiBSRlNXIENvbnRyb2wgKi8KLQkvKiAweDgwNFsxNF09IDAgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCByRlBHQTBfVHhJbmZvLCAweDAwMDAwMDAzKTsKLQkvKiAweDg3MFs2OjVdPSBiJzExICovCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgckZQR0EwX1hBQl9SRkludGVyZmFjZVNXLCAweDA3MDAwNzYwKTsKLQkvKiAweDg2MFs2OjVdPSBiJzAwICovCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIDB4NjZGNjAyMTApOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiJXM6IDB4ODcwID0gdmFsdWUgMHgleFxuIiwgX19mdW5jX18sCi0JCSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIDB4ODcwKSk7Ci0KLQkvKiAgKi8KLQkvKiAgSm9zZXBoIE5vdGU6IEtlZXAgUmZSZWdDaG5sVmFsIGZvciBsYXRlciB1c2UuICovCi0JLyogICovCi0JcEhhbERhdGEtPlJmUmVnQ2hubFZhbFswXSA9IFBIWV9RdWVyeVJGUmVnKEFkYXB0ZXIsIFJGX1BBVEhfQSwKLQkJCQkJCSAgIFJGX0NITkxCVywgYlJGUmVnT2Zmc2V0TWFzayk7Ci0JcEhhbERhdGEtPlJmUmVnQ2hubFZhbFsxXSA9IFBIWV9RdWVyeVJGUmVnKEFkYXB0ZXIsIFJGX1BBVEhfQiwKLQkJCQkJCSAgIFJGX0NITkxCVywgYlJGUmVnT2Zmc2V0TWFzayk7Ci0KLQlpZiAoIW1hY19vbikgewotCQlfSW5pdFF1ZXVlUmVzZXJ2ZWRQYWdlKEFkYXB0ZXIpOwotCQlfSW5pdFR4QnVmZmVyQm91bmRhcnkoQWRhcHRlcik7Ci0JfQotCV9Jbml0UXVldWVQcmlvcml0eShBZGFwdGVyKTsKLQlfSW5pdFBhZ2VCb3VuZGFyeShBZGFwdGVyKTsKLQlfSW5pdFRyYW5zZmVyUGFnZVNpemUoQWRhcHRlcik7Ci0KLQkvKiAgR2V0IFJ4IFBIWSBzdGF0dXMgaW4gb3JkZXIgdG8gcmVwb3J0IFJTU0kgYW5kIG90aGVycy4gKi8KLQlfSW5pdERyaXZlckluZm9TaXplKEFkYXB0ZXIsIERSVklORk9fU1opOwotCi0JX0luaXRJbnRlcnJ1cHQoQWRhcHRlcik7Ci0JaHdfdmFyX3NldF9tYWNhZGRyKEFkYXB0ZXIsIEFkYXB0ZXItPmVlcHJvbXByaXYubWFjX2FkZHIpOwotCXJ0bDg3MjNhX3NldF9tZWRpYV9zdGF0dXMoQWRhcHRlciwgTVNSX0lORlJBKTsKLQlfSW5pdFdNQUNTZXR0aW5nKEFkYXB0ZXIpOwotCV9Jbml0QWRhcHRpdmVDdHJsKEFkYXB0ZXIpOwotCV9Jbml0RURDQShBZGFwdGVyKTsKLQlfSW5pdFJhdGVGYWxsYmFjayhBZGFwdGVyKTsKLQlfSW5pdFJldHJ5RnVuY3Rpb24oQWRhcHRlcik7Ci0JcnRsODcyM2FfSW5pdEJlYWNvblBhcmFtZXRlcnMoQWRhcHRlcik7Ci0KLQlfQkJUdXJuT25CbG9jayhBZGFwdGVyKTsKLQkvKiBOaWNJRlNldE1hY0FkZHJlc3MocGFkYXB0ZXIsIHBhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzKTsgKi8KLQotCXJ0bDg3MjNhX2NhbV9pbnZhbGlkYXRlX2FsbChBZGFwdGVyKTsKLQotCS8qICAyMDEwLzEyLzE3IE1IIFdlIG5lZWQgdG8gc2V0IFRYIHBvd2VyIGFjY29yZGluZyB0byBFRlVTRSBjb250ZW50IGF0IGZpcnN0LiAqLwotCVBIWV9TZXRUeFBvd2VyTGV2ZWw4NzIzQShBZGFwdGVyLCBwSGFsRGF0YS0+Q3VycmVudENoYW5uZWwpOwotCi0JcnRsODcyM2FfSW5pdEFudGVubmFfU2VsZWN0aW9uKEFkYXB0ZXIpOwotCi0JLyogIEhXIFNFUSBDVFJMICovCi0JLyogc2V0IDB4MCB0byAweEZGIGJ5IHR5bmxpLiBEZWZhdWx0IGVuYWJsZSBIVyBTRVEgTlVNLiAqLwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX0hXU0VRX0NUUkwsIDB4RkYpOwotCi0JLyogICovCi0JLyogIERpc2FibGUgQkFSLCBzdWdnZXN0ZWQgYnkgU2NvdHQgKi8KLQkvKiAgMjAxMC4wNC4wOSBhZGQgYnkgaHBmYW4gKi8KLQkvKiAgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfQkFSX01PREVfQ1RSTCwgMHgwMjAxZmZmZik7Ci0KLQlpZiAocHJlZ2lzdHJ5cHJpdi0+d2lmaV9zcGVjKQotCQlydGw4NzIzYXVfd3JpdGUxNihBZGFwdGVyLCBSRUdfRkFTVF9FRENBX0NUUkwsIDApOwotCi0JLyogIE1vdmUgYnkgTmVvIGZvciBVU0IgU1MgZnJvbSBhYm92ZSBzZXRwICovCi0JX1JmUG93ZXJTYXZlKEFkYXB0ZXIpOwotCi0JLyogIDIwMTAvMDgvMjYgTUggTWVyZ2UgZnJvbSA4MTkyQ0UuICovCi0JLyogc2hlcnJ5IG1hc2tlZCB0aGF0IGl0IGhhcyBiZWVuIGRvbmUgaW4gX1JmUG93ZXJTYXZlICovCi0JLyogMjAxMTA5MjcgKi8KLQkvKiByZWNvdmVyeSBmb3IgODE5MmN1IGFuZCA5NzIzQXUgMjAxMTEwMTcgKi8KLQlpZiAocHdyY3RybHByaXYtPnJmX3B3cnN0YXRlID09IHJmX29uKSB7Ci0JCWlmIChwSGFsRGF0YS0+YklRS0luaXRpYWxpemVkKSB7Ci0JCQlydGw4NzIzYV9waHlfaXFfY2FsaWJyYXRlKEFkYXB0ZXIsIHRydWUpOwotCQl9IGVsc2UgewotCQkJcnRsODcyM2FfcGh5X2lxX2NhbGlicmF0ZShBZGFwdGVyLCBmYWxzZSk7Ci0JCQlwSGFsRGF0YS0+YklRS0luaXRpYWxpemVkID0gdHJ1ZTsKLQkJfQotCi0JCXJ0bDg3MjNhX29kbV9jaGVja190eF9wb3dlcl90cmFja2luZyhBZGFwdGVyKTsKLQotCQlydGw4NzIzYV9waHlfbGNfY2FsaWJyYXRlKEFkYXB0ZXIpOwotCi0JCXJ0bDg3MjNhX2R1YWxfYW50ZW5uYV9kZXRlY3Rpb24oQWRhcHRlcik7Ci0JfQotCi0JLyogZml4ZWQgVVNCIGludGVyZmFjZSBpbnRlcmZlcmVuY2UgaXNzdWUgKi8KLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4ZmU0MCwgMHhlMCk7Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGZlNDEsIDB4OGQpOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhmZTQyLCAweDgwKTsKLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCAweDIwYywgMHhmZDAzMjApOwotCS8qIFNvbHZlIHRvbyBtYW55IHByb3RvY29sIGVycm9yIG9uIFVTQiBidXMgKi8KLQlpZiAoIUlTXzgxeHhDX1ZFTkRPUl9VTUNfQV9DVVQocEhhbERhdGEtPlZlcnNpb25JRCkpIHsKLQkJLyogIDB4RTYgPSAweDk0ICovCi0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhGRTQwLCAweEU2KTsKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweEZFNDEsIDB4OTQpOwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4RkU0MiwgMHg4MCk7Ci0KLQkJLyogIDB4RTAgPSAweDE5ICovCi0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhGRTQwLCAweEUwKTsKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweEZFNDEsIDB4MTkpOwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4RkU0MiwgMHg4MCk7Ci0KLQkJLyogIDB4RTUgPSAweDkxICovCi0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhGRTQwLCAweEU1KTsKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweEZFNDEsIDB4OTEpOwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4RkU0MiwgMHg4MCk7Ci0KLQkJLyogIDB4RTIgPSAweDgxICovCi0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhGRTQwLCAweEUyKTsKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweEZFNDEsIDB4ODEpOwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4RkU0MiwgMHg4MCk7Ci0KLQl9Ci0KLS8qCV9Jbml0UEFCaWFzKEFkYXB0ZXIpOyAqLwotCi0JLyogIEluaXQgQlQgaHcgY29uZmlnLiAqLwotCXJ0bDg3MjNhX0JUX2luaXRfaHdjb25maWcoQWRhcHRlcik7Ci0KLQlydGw4NzIzYV9Jbml0SGFsRG0oQWRhcHRlcik7Ci0KLQl2YWw4ID0gRElWX1JPVU5EX1VQKFdpRmlOYXZVcHBlclVzLCBIQUxfODcyM0FfTkFWX1VQUEVSX1VOSVQpOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX05BVl9VUFBFUiwgdmFsOCk7Ci0KLQkvKiAgMjAxMS8wMy8wOSBNSCBkZWJ1ZyBvbmx5LCBVTUMtQiBjdXQgcGFzcyAyNTAwIFM1IHRlc3QsIGJ1dCB3ZSBuZWVkIHRvIGZpbiByb290IGNhdXNlLiAqLwotCWlmICgoKHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgckZQR0EwX1JGTU9EKSAmIDB4RkYwMDAwMDApICE9Ci0JICAgICAweDgzMDAwMDAwKSkgewotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0EwX1JGTU9ELCBCSVQoMjQpLCAxKTsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6IElRSyBmYWlsIHJlY292ZXJcbiIsIF9fZnVuY19fKTsKLQl9Ci0KLQkvKiBhY2sgZm9yIHhtaXQgbWdtdCBmcmFtZXMuICovCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0ZXSFdfVFhRX0NUUkwsCi0JCQkgIHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgUkVHX0ZXSFdfVFhRX0NUUkwpfEJJVCgxMikpOwotCi1leGl0OgotCWlmIChzdGF0dXMgPT0gX1NVQ0NFU1MpIHsKLQkJQWRhcHRlci0+aHdfaW5pdF9jb21wbGV0ZWQgPSB0cnVlOwotCi0JCWlmIChBZGFwdGVyLT5yZWdpc3RyeXByaXYubm90Y2hfZmlsdGVyID09IDEpCi0JCQlydGw4NzIzYV9ub3RjaF9maWx0ZXIoQWRhcHRlciwgMSk7Ci0JfQotCi0JREJHXzg3MjNBKCIlcyBpbiAlZG1zXG4iLCBfX2Z1bmNfXywKLQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBpbml0X3N0YXJ0X3RpbWUpKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZCBwaHlfU3NQd3JTd2l0Y2g5MkNVKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJCQllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIGVSRlBvd2VyU3RhdGUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQl1OCBzcHMwOwotCi0Jc3BzMCA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfU1BTMF9DVFJMKTsKLQotCXN3aXRjaCAoZVJGUG93ZXJTdGF0ZSkgewotCWNhc2UgcmZfb246Ci0JCS8qICAxLiBFbmFibGUgTUFDIENsb2NrLiBDYW4gbm90IGJlIGVuYWJsZWQgbm93LiAqLwotCQkvKiBXcml0ZVhCWVRFKFJFR19TWVNfQ0xLUisxLAotCQkgICBSZWFkWEJZVEUoUkVHX1NZU19DTEtSKzEpIHwgQklUKDMpKTsgKi8KLQotCQkvKiAgMi4gRm9yY2UgUFdNLCBFbmFibGUgU1BTMThfTERPX01hcmNvX0Jsb2NrICovCi0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1NQUzBfQ1RSTCwKLQkJCQkgc3BzMCB8IEJJVCgwKSB8IEJJVCgzKSk7Ci0KLQkJLyogIDMuIHJlc3RvcmUgQkIsIEFGRSBjb250cm9sIHJlZ2lzdGVyLiAqLwotCQkvKiBSRiAqLwotCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gIFJGXzJUMlIpCi0JCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0EwX1hBQl9SRlBhcmFtZXRlciwKLQkJCQkgICAgIDB4MzgwMDM4LCAxKTsKLQkJZWxzZQotCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXIsCi0JCQkJICAgICAweDM4LCAxKTsKLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCAweGYwLCAxKTsKLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCwgQklUKDEpLCAwKTsKLQotCQkvKiBBRkUgKi8KLQkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09ICBSRl8yVDJSKQotCQkJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgclJ4X1dhaXRfQ0NBLCAweDYzREIyNUEwKTsKLQkJZWxzZSBpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gIFJGXzFUMVIpCi0JCQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCByUnhfV2FpdF9DQ0EsIDB4NjMxQjI1QTApOwotCi0JCS8qICA0LiBpc3N1ZSAzLXdpcmUgY29tbWFuZCB0aGF0IFJGIHNldCB0byBSeCBpZGxlCi0JCSAgICBtb2RlLiBUaGlzIGlzIHVzZWQgdG8gcmUtd3JpdGUgdGhlIFJYIGlkbGUgbW9kZS4gKi8KLQkJLyogIFdlIGNhbiBvbmx5IHBydmlkZSBhIHVzdWFsIHZhbHVlIGluc3RlYWQgYW5kIHRoZW4KLQkJICAgIEhXIHdpbGwgbW9kaWZ5IHRoZSB2YWx1ZSBieSBpdHNlbGYuICovCi0JCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0EsIFJGX0FDLAotCQkJICAgICBiUkZSZWdPZmZzZXRNYXNrLCAweDMyRDk1KTsKLQkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09ICBSRl8yVDJSKSB7Ci0JCQlQSFlfU2V0UkZSZWcoQWRhcHRlciwgUkZfUEFUSF9CLCBSRl9BQywKLQkJCQkgICAgIGJSRlJlZ09mZnNldE1hc2ssIDB4MzJEOTUpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgcmZfc2xlZXA6Ci0JY2FzZSByZl9vZmY6Ci0JCWlmIChJU184MXh4Q19WRU5ET1JfVU1DX0JfQ1VUKHBIYWxEYXRhLT5WZXJzaW9uSUQpKQotCQkJc3BzMCAmPSB+QklUKDApOwotCQllbHNlCi0JCQlzcHMwICY9IH4oQklUKDApIHwgQklUKDMpKTsKLQotCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sICJTUyBMVkwxXG4iKTsKLQkJLyogIERpc2FibGUgUkYgYW5kIEJCIG9ubHkgZm9yIFNlbGVjdFN1c3BlbmQuICovCi0KLQkJLyogIDEuIFNldCBCQi9SRiB0byBzaHV0ZG93bi4gKi8KLQkJLyoJKDEpIFJlZzg3OFs1OjNdPSAwCVJGIHJ4X2NvZGUgZm9yCi0JCQkJCQlwcmVhbWJsZSBwb3dlciBzYXZpbmcgKi8KLQkJLyoJKDIpUmVnODc4WzIxOjE5XT0gMAlUdXJuIG9mZiBSRi1CICovCi0JCS8qCSgzKSBSZWdDMDRbNzo0XT0gMAlUdXJuIG9mZiBhbGwgcGF0aHMKLQkJCQkJCWZvciBwYWNrZXQgZGV0ZWN0aW9uICovCi0JCS8qCSg0KSBSZWc4MDBbMV0gPSAxCWVuYWJsZSBwcmVhbWJsZSBwb3dlciBzYXZpbmcgKi8KLQkJQWRhcHRlci0+cHdyY3RybHByaXYuUFNfQkJSZWdCYWNrdXBbUFNCQlJFR19SRjBdID0KLQkJCXJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgckZQR0EwX1hBQl9SRlBhcmFtZXRlcik7Ci0JCUFkYXB0ZXItPnB3cmN0cmxwcml2LlBTX0JCUmVnQmFja3VwW1BTQkJSRUdfUkYxXSA9Ci0JCQlydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIHJPRkRNMF9UUnhQYXRoRW5hYmxlKTsKLQkJQWRhcHRlci0+cHdyY3RybHByaXYuUFNfQkJSZWdCYWNrdXBbUFNCQlJFR19SRjJdID0KLQkJCXJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgckZQR0EwX1JGTU9EKTsKLQkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09ICBSRl8yVDJSKQotCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXIsCi0JCQkJICAgICAweDM4MDAzOCwgMCk7Ci0JCWVsc2UgaWYgKHBIYWxEYXRhLT5yZl90eXBlID09ICBSRl8xVDFSKQotCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXIsIDB4MzgsIDApOwotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0wX1RSeFBhdGhFbmFibGUsIDB4ZjAsIDApOwotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0EwX1JGTU9ELCBCSVQoMSksIDEpOwotCi0JCS8qICAyIC5BRkUgY29udHJvbCByZWdpc3RlciB0byBwb3dlciBkb3duLiBiaXRbMzA6MjJdICovCi0JCUFkYXB0ZXItPnB3cmN0cmxwcml2LlBTX0JCUmVnQmFja3VwW1BTQkJSRUdfQUZFMF0gPQotCQkJcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCByUnhfV2FpdF9DQ0EpOwotCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gIFJGXzJUMlIpCi0JCQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCByUnhfV2FpdF9DQ0EsIDB4MDBEQjI1QTApOwotCQllbHNlIGlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSAgUkZfMVQxUikKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHJSeF9XYWl0X0NDQSwgMHgwMDFCMjVBMCk7Ci0KLQkJLyogIDMuIGlzc3VlIDMtd2lyZSBjb21tYW5kIHRoYXQgUkYgc2V0IHRvIHBvd2VyIGRvd24uKi8KLQkJUEhZX1NldFJGUmVnKEFkYXB0ZXIsIFJGX1BBVEhfQSwgUkZfQUMsIGJSRlJlZ09mZnNldE1hc2ssIDApOwotCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gIFJGXzJUMlIpCi0JCQlQSFlfU2V0UkZSZWcoQWRhcHRlciwgUkZfUEFUSF9CLCBSRl9BQywKLQkJCQkgICAgIGJSRlJlZ09mZnNldE1hc2ssIDApOwotCi0JCS8qICA0LiBGb3JjZSBQRk0gLCBkaXNhYmxlIFNQUzE4X0xET19NYXJjb19CbG9jayAqLwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19TUFMwX0NUUkwsIHNwczApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIENhcmREaXNhYmxlUlRMODcyM1Uoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXU4CQl1MWJUbXA7Ci0KLQlEQkdfODcyM0EoIkNhcmREaXNhYmxlUlRMODcyM1VcbiIpOwotCS8qICBVU0ItTUYgQ2FyZCBEaXNhYmxlIEZsb3cgKi8KLQkvKiAgMS4gUnVuIExQUyBXTCBSRk9GRiBmbG93ICovCi0JSGFsUHdyU2VxQ21kUGFyc2luZzIzYShBZGFwdGVyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywKLQkJCSAgICBQV1JfSU5URl9VU0JfTVNLLCBydGw4NzIzQVVfZW50ZXJfbHBzX2Zsb3cpOwotCi0JLyogIDIuIDB4MUZbNzowXSA9IDAJCXR1cm4gb2ZmIFJGICovCi0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfUkZfQ1RSTCwgMHgwMCk7Ci0KLQkvKgk9PT09IFJlc2V0IGRpZ2l0YWwgc2VxdWVuY2UgICA9PT09PT0gKi8KLQlpZiAoKHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfTUNVRldETCkgJiBCSVQoNykpICYmCi0JICAgIEFkYXB0ZXItPmJGV1JlYWR5KSAvKiA4MDUxIFJBTSBjb2RlICovCi0JCXJ0bDg3MjNhX0Zpcm13YXJlU2VsZlJlc2V0KEFkYXB0ZXIpOwotCi0JLyogIFJlc2V0IE1DVS4gU3VnZ2VzdGVkIGJ5IEZpbGVuLiAyMDExLjAxLjI2LiBieSB0eW5saS4gKi8KLQl1MWJUbXAgPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgUkVHX1NZU19GVU5DX0VOKzEpOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1NZU19GVU5DX0VOKzEsIHUxYlRtcCAmIH5CSVQoMikpOwotCi0JLyogIGcuCU1DVUZXREwgMHg4MFsxOjBdPSAwCQlyZXNldCBNQ1UgcmVhZHkgc3RhdHVzICovCi0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfTUNVRldETCwgMHgwMCk7Ci0KLQkvKgk9PT09IFJlc2V0IGRpZ2l0YWwgc2VxdWVuY2UgZW5kID09PT09PSAqLwotCS8qICBDYXJkIGRpc2FibGUgcG93ZXIgYWN0aW9uIGZsb3cgKi8KLQlIYWxQd3JTZXFDbWRQYXJzaW5nMjNhKEFkYXB0ZXIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLAotCQkJICAgICAgIFBXUl9JTlRGX1VTQl9NU0ssCi0JCQkgICAgICAgcnRsODcyM0FVX2NhcmRfZGlzYWJsZV9mbG93KTsKLQotCS8qICBSZXNldCBNQ1UgSU8gV3JhcHBlciwgYWRkZWQgYnkgUm9nZXIsIDIwMTEuMDguMzAuICovCi0JdTFiVG1wID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIFJFR19SU1ZfQ1RSTCArIDEpOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1JTVl9DVFJMKzEsIHUxYlRtcCAmIH5CSVQoMCkpOwotCXUxYlRtcCA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfUlNWX0NUUkwgKyAxKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19SU1ZfQ1RSTCsxLCB1MWJUbXAgfCBCSVQoMCkpOwotCi0JLyogIDcuIFJTVl9DVFJMIDB4MUNbNzowXSA9IDB4MEUgIGxvY2sgSVNPL0NMSy9Qb3dlciBjb250cm9sIHJlZ2lzdGVyICovCi0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfUlNWX0NUUkwsIDB4MGUpOwotfQotCi1pbnQgcnRsODcyM2F1X2hhbF9kZWluaXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlEQkdfODcyM0EoIj09PiAlc1xuIiwgX19mdW5jX18pOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9CVF9DT0VYSVNUCi0JQlRfSGFsdFByb2Nlc3MocGFkYXB0ZXIpOwotI2VuZGlmCi0JLyogIDIwMTEvMDIvMTggVG8gRml4IFJVIExOQSAgcG93ZXIgbGVha2FnZSBwcm9ibGVtLiBXZSBuZWVkIHRvCi0JICAgIGV4ZWN1dGUgYmVsb3cgYmVsb3cgaW4gQWRhcHRlciBpbml0IGFuZCBoYWx0IHNlcXVlbmNlLgotCSAgICBBY2NvcmRpbmcgdG8gRUVjaG91J3Mgb3Bpbmlvbiwgd2UgY2FuIGVuYWJsZSB0aGUgYWJpbGl0eSBmb3IgYWxsICovCi0JLyogIElDLiBBY2NvcmQgdG8gam9obm55J3Mgb3Bpbmlvbiwgb25seSBSVSBuZWVkIHRoZSBzdXBwb3J0LiAqLwotCUNhcmREaXNhYmxlUlRMODcyM1UocGFkYXB0ZXIpOwotCi0JcGFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkID0gZmFsc2U7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLWludCBydGw4NzIzYXVfaW5pcnBfaW5pdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JdTggaTsKLQlzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmOwotCWludCBzdGF0dXM7Ci0Jc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2ID0gJkFkYXB0ZXItPnJlY3Zwcml2OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQlzdGF0dXMgPSBfU1VDQ0VTUzsKLQotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAiPT09PiB1c2JfaW5pcnBfaW5pdFxuIik7Ci0KLQkvKiBpc3N1ZSBSeCBpcnAgdG8gcmVjZWl2ZSBkYXRhICovCi0JcHJlY3ZidWYgPSAoc3RydWN0IHJlY3ZfYnVmICopcHJlY3Zwcml2LT5wcmVjdl9idWY7Ci0JZm9yIChpID0gMDsgaSA8IE5SX1JFQ1ZCVUZGOyBpKyspIHsKLQkJaWYgKHJ0bDg3MjNhdV9yZWFkX3BvcnQoQWRhcHRlciwgMCwgcHJlY3ZidWYpID09IF9GQUlMKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAidXNiX3J4X2luaXQ6IHVzYl9yZWFkX3BvcnQgZXJyb3JcbiIpOwotCQkJc3RhdHVzID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJcHJlY3ZidWYrKzsKLQl9Ci0JaWYgKHJ0bDg3MjNhdV9yZWFkX2ludGVycnVwdChBZGFwdGVyKSA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJICIlczogdXNiX3JlYWRfaW50ZXJydXB0IGVycm9yXG4iLCBfX2Z1bmNfXyk7Ci0JCXN0YXR1cyA9IF9GQUlMOwotCX0KLQlwSGFsRGF0YS0+SW50ck1hc2tbMF0gPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIFJFR19VU0JfSElNUik7Ci0JTVNHXzg3MjNBKCJwSGFsRGF0YS0+SW50ck1hc2sgPSAweCUwNHhcbiIsIHBIYWxEYXRhLT5JbnRyTWFza1swXSk7Ci0JcEhhbERhdGEtPkludHJNYXNrWzBdIHw9IFVISU1SX0MySENNRHxVSElNUl9DUFdNOwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19VU0JfSElNUiwgcEhhbERhdGEtPkludHJNYXNrWzBdKTsKLWV4aXQ6Ci0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiPD09PSB1c2JfaW5pcnBfaW5pdFxuIik7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotaW50IHJ0bDg3MjNhdV9pbmlycF9kZWluaXQoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICI9PT0+IHVzYl9yeF9kZWluaXRcbiIpOwotCXJ0bDg3MjNhdV9yZWFkX3BvcnRfY2FuY2VsKEFkYXB0ZXIpOwotCXBIYWxEYXRhLT5JbnRyTWFza1swXSA9IHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgUkVHX1VTQl9ISU1SKTsKLQlNU0dfODcyM0EoIiVzIHBIYWxEYXRhLT5JbnRyTWFzayA9IDB4JTA0eFxuIiwgX19mdW5jX18sCi0JCSAgcEhhbERhdGEtPkludHJNYXNrWzBdKTsKLQlwSGFsRGF0YS0+SW50ck1hc2tbMF0gPSAweDA7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX1VTQl9ISU1SLCBwSGFsRGF0YS0+SW50ck1hc2tbMF0pOwotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgIjw9PT0gdXNiX3J4X2RlaW5pdFxuIik7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZCBfUmVhZEJvYXJkVHlwZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4ICpQUk9NQ29udGVudCwKLQkJCSAgIGJvb2wgQXV0b2xvYWRGYWlsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0JdTggYm9hcmRUeXBlID0gQk9BUkRfVVNCX0RPTkdMRTsKLQotCWlmIChBdXRvbG9hZEZhaWwpIHsKLQkJaWYgKElTXzg3MjNfU0VSSUVTKHBIYWxEYXRhLT5WZXJzaW9uSUQpKQotCQkJcEhhbERhdGEtPnJmX3R5cGUgPSBSRl8xVDFSOwotCQllbHNlCi0JCQlwSGFsRGF0YS0+cmZfdHlwZSA9IFJGXzJUMlI7Ci0JCXBIYWxEYXRhLT5Cb2FyZFR5cGUgPSBib2FyZFR5cGU7Ci0JCXJldHVybjsKLQl9Ci0KLQlib2FyZFR5cGUgPSBQUk9NQ29udGVudFtFRVBST01fTk9STUFMX0JvYXJkVHlwZV07Ci0JYm9hcmRUeXBlICY9IEJPQVJEX1RZUEVfTk9STUFMX01BU0s7LyogYml0Wzc6NV0gKi8KLQlib2FyZFR5cGUgPj49IDU7Ci0KLQlwSGFsRGF0YS0+Qm9hcmRUeXBlID0gYm9hcmRUeXBlOwotCU1TR184NzIzQSgiX1JlYWRCb2FyZFR5cGUoJXgpXG4iLCBwSGFsRGF0YS0+Qm9hcmRUeXBlKTsKLQotCWlmIChib2FyZFR5cGUgPT0gQk9BUkRfVVNCX0hpZ2hfUEEpCi0JCXBIYWxEYXRhLT5FeHRlcm5hbFBBID0gMTsKLX0KLQotc3RhdGljIHZvaWQgSGFsX0VmdXNlUGFyc2VNQUNBZGRyXzg3MjNBVShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQkgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpCi17Ci0JdTE2IGk7Ci0JdTggc01hY0FkZHJbRVRIX0FMRU5dID0gezB4MDAsIDB4RTAsIDB4NEMsIDB4ODcsIDB4MjMsIDB4MDB9OwotCXN0cnVjdCBlZXByb21fcHJpdiAqcEVFUFJPTSA9IEdFVF9FRVBST01fRUZVU0VfUFJJVihwYWRhcHRlcik7Ci0KLQlpZiAoQXV0b0xvYWRGYWlsKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JCQlwRUVQUk9NLT5tYWNfYWRkcltpXSA9IHNNYWNBZGRyW2ldOwotCX0gZWxzZSB7Ci0JCS8qIFJlYWQgUGVybWFuZW50IE1BQyBhZGRyZXNzICovCi0JCW1lbWNweShwRUVQUk9NLT5tYWNfYWRkciwgJmh3aW5mb1tFRVBST01fTUFDX0FERFJfODcyM0FVXSwKLQkJICAgICAgIEVUSF9BTEVOKTsKLQl9Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9ub3RpY2VfLAotCQkgIkhhbF9FZnVzZVBhcnNlTUFDQWRkcl84NzIzQVU6IFBlcm1hbmVudCBBZGRyZXNzID0lcE1cbiIsCi0JCSBwRUVQUk9NLT5tYWNfYWRkcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlYWRBZGFwdGVySW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBlZXByb21fcHJpdiAqcEVFUFJPTSA9IEdFVF9FRVBST01fRUZVU0VfUFJJVihwYWRhcHRlcik7Ci0JLyogc3RydWN0IGhhbF9kYXRhXzg3MjNhICogcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOyAqLwotCXU4IGh3aW5mb1tIV1NFVF9NQVhfU0laRV07Ci0KLQlIYWxfSW5pdFBHRGF0YShwYWRhcHRlciwgaHdpbmZvKTsKLQlIYWxfRWZ1c2VQYXJzZUlEQ29kZShwYWRhcHRlciwgaHdpbmZvKTsKLQlIYWxfRWZ1c2VQYXJzZUVFUFJPTVZlcihwYWRhcHRlciwgaHdpbmZvLAotCQkJCXBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOwotCUhhbF9FZnVzZVBhcnNlTUFDQWRkcl84NzIzQVUocGFkYXB0ZXIsIGh3aW5mbywKLQkJCQkgICAgIHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOwotCUhhbF9FZnVzZVBhcnNldHhwb3dlcmluZm9fODcyM0EocGFkYXB0ZXIsIGh3aW5mbywKLQkJCQkJcEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyk7Ci0JX1JlYWRCb2FyZFR5cGUocGFkYXB0ZXIsIGh3aW5mbywgcEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyk7Ci0JSGFsX0VmdXNlUGFyc2VCVENvZXhpc3RJbmZvXzg3MjNBKHBhZGFwdGVyLCBod2luZm8sCi0JCQkJCSAgcEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyk7Ci0KLQlydGw4NzIzYV9FZnVzZVBhcnNlQ2hubFBsYW4ocGFkYXB0ZXIsIGh3aW5mbywKLQkJCQkgICAgcEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyk7Ci0JSGFsX0VmdXNlUGFyc2VUaGVybWFsTWV0ZXJfODcyM0EocGFkYXB0ZXIsIGh3aW5mbywKLQkJCQkJIHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOwotLyoJX1JlYWRSRlNldHRpbmcoQWRhcHRlciwgUFJPTUNvbnRlbnQsIHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOyAqLwotLyoJX1JlYWRQU1NldHRpbmcoQWRhcHRlciwgUFJPTUNvbnRlbnQsIHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOyAqLwotCUhhbF9FZnVzZVBhcnNlQW50ZW5uYURpdmVyc2l0eShwYWRhcHRlciwgaHdpbmZvLAotCQkJCSAgICAgICBwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnKTsKLQotCUhhbF9FZnVzZVBhcnNlRUVQUk9NVmVyKHBhZGFwdGVyLCBod2luZm8sIHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOwotCUhhbF9FZnVzZVBhcnNlQ3VzdG9tZXJJRChwYWRhcHRlciwgaHdpbmZvLAotCQkJCSBwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnKTsKLQlIYWxfRWZ1c2VQYXJzZVJhdGVJbmRpY2F0aW9uT3B0aW9uKHBhZGFwdGVyLCBod2luZm8sCi0JCQkJCSAgIHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOwotCUhhbF9FZnVzZVBhcnNlWHRhbF84NzIzQShwYWRhcHRlciwgaHdpbmZvLAotCQkJCSBwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnKTsKLQotCS8qIGhhbF9DdXN0b21pemVkQmVoYXZpb3JfODcyM1UoQWRhcHRlcik7ICovCi0KLS8qCUFkYXB0ZXItPmJEb25nbGUgPSAoUFJPTUNvbnRlbnRbRUVQUk9NX0VBU1lfUkVQTEFDRU1FTlRdID09IDEpPyAwOiAxOyAqLwotCURCR184NzIzQSgiJXMoKTogUkVQTEFDRU1FTlQgPSAleFxuIiwgX19mdW5jX18sIHBhZGFwdGVyLT5iRG9uZ2xlKTsKLX0KLQotc3RhdGljIHZvaWQgX1JlYWRQUk9NQ29udGVudChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGVlcHJvbV9wcml2ICpwRUVQUk9NID0gR0VUX0VFUFJPTV9FRlVTRV9QUklWKEFkYXB0ZXIpOwotCXU4IGVlVmFsdWU7Ci0KLQllZVZhbHVlID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIFJFR185MzQ2Q1IpOwotCS8qICBUbyBjaGVjayBzeXN0ZW0gYm9vdCBzZWxlY3Rpb24uICovCi0JcEVFUFJPTS0+RWVwcm9tT3JFZnVzZSA9IChlZVZhbHVlICYgQk9PVF9GUk9NX0VFUFJPTSkgPyB0cnVlIDogZmFsc2U7Ci0JcEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyA9IChlZVZhbHVlICYgRUVQUk9NX0VOKSA/IGZhbHNlIDogdHJ1ZTsKLQotCURCR184NzIzQSgiQm9vdCBmcm9tICVzLCBBdXRvbG9hZCAlcyAhXG4iLAotCQkgIChwRUVQUk9NLT5FZXByb21PckVmdXNlID8gIkVFUFJPTSIgOiAiRUZVU0UiKSwKLQkJICAocEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyA/ICJGYWlsIiA6ICJPSyIpKTsKLQotCXJlYWRBZGFwdGVySW5mbyhBZGFwdGVyKTsKLX0KLQotLyogICovCi0vKglEZXNjcmlwdGlvbjogKi8KLS8qCQlXZSBzaG91bGQgc2V0IEVmdXNlIGNlbGwgc2VsZWN0aW9uIHRvIFdpRmkgY2VsbCBpbiBkZWZhdWx0LiAqLwotLyogICovCi0vKglBc3N1bXB0aW9uOiAqLwotLyoJCVBBU1NJVkVfTEVWRUwgKi8KLS8qICAqLwotLyoJQWRkZWQgYnkgUm9nZXIsIDIwMTAuMTEuMjMuICovCi0vKiAgKi8KLXN0YXRpYyB2b2lkIGhhbF9FZnVzZUNlbGxTZWwoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXUzMiB2YWx1ZTMyOwotCi0JdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgRUZVU0VfVEVTVCk7Ci0JdmFsdWUzMiA9ICh2YWx1ZTMyICYgfkVGVVNFX1NFTF9NQVNLKSB8IEVGVVNFX1NFTChFRlVTRV9XSUZJX1NFTF8wKTsKLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBFRlVTRV9URVNULCB2YWx1ZTMyKTsKLX0KLQotdm9pZCBydGw4NzIzYV9yZWFkX2FkYXB0ZXJfaW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9IGppZmZpZXM7Ci0KLQkvKiAgUmVhZCBFRVBST00gc2l6ZSBiZWZvcmUgY2FsbCBhbnkgRUVQUk9NIGZ1bmN0aW9uICovCi0JQWRhcHRlci0+RWVwcm9tQWRkcmVzc1NpemUgPSBHZXRFRVBST01TaXplODcyM0EoQWRhcHRlcik7Ci0KLQlNU0dfODcyM0EoIj09PT0+IF9SZWFkQWRhcHRlckluZm84NzIzQVVcbiIpOwotCi0JaGFsX0VmdXNlQ2VsbFNlbChBZGFwdGVyKTsKLQotCV9SZWFkUFJPTUNvbnRlbnQoQWRhcHRlcik7Ci0KLQlNU0dfODcyM0EoIjw9PT09IF9SZWFkQWRhcHRlckluZm84NzIzQVUgaW4gJWQgbXNcbiIsCi0JCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpKTsKLX0KLQotLyogICovCi0vKglEZXNjcmlwdGlvbjogKi8KLS8qCQlRdWVyeSBzZXR0aW5nIG9mIHNwZWNpZmllZCB2YXJpYWJsZS4gKi8KLS8qICAqLwotaW50IEdldEhhbERlZlZhcjgxOTJDVXNiKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJCSBlbnVtIGhhbF9kZWZfdmFyaWFibGUgZVZhcmlhYmxlLCB2b2lkICpwVmFsdWUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlpbnQgYlJlc3VsdCA9IF9TVUNDRVNTOwotCi0Jc3dpdGNoIChlVmFyaWFibGUpIHsKLQljYXNlIEhBTF9ERUZfVU5ERVJDT1JBVEVEU01PT1RIRURQV0RCOgotCQkqKChpbnQgKilwVmFsdWUpID0gcEhhbERhdGEtPmRtcHJpdi5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQkJYnJlYWs7Ci0JY2FzZSBIQUxfREVGX0lTX1NVUFBPUlRfQU5UX0RJVjoKLQkJYnJlYWs7Ci0JY2FzZSBIQUxfREVGX0NVUlJFTlRfQU5URU5OQToKLQkJYnJlYWs7Ci0JY2FzZSBIQUxfREVGX0RSVklORk9fU1o6Ci0JCSooKHUzMiAqKXBWYWx1ZSkgPSBEUlZJTkZPX1NaOwotCQlicmVhazsKLQljYXNlIEhBTF9ERUZfTUFYX1JFQ1ZCVUZfU1o6Ci0JCSooKHUzMiAqKXBWYWx1ZSkgPSBNQVhfUkVDVkJVRl9TWjsKLQkJYnJlYWs7Ci0JY2FzZSBIQUxfREVGX1JYX1BBQ0tFVF9PRkZTRVQ6Ci0JCSooKHUzMiAqKXBWYWx1ZSkgPSBSWERFU0NfU0laRSArIERSVklORk9fU1o7Ci0JCWJyZWFrOwotCWNhc2UgSEFMX0RFRl9EQkdfRFVNUF9SWFBLVDoKLQkJKigodTggKilwVmFsdWUpID0gcEhhbERhdGEtPmJEdW1wUnhQa3Q7Ci0JCWJyZWFrOwotCWNhc2UgSEFMX0RFRl9EQkdfRE1fRlVOQzoKLQkJKigodTMyICopcFZhbHVlKSA9IHBIYWxEYXRhLT5vZG1wcml2LlN1cHBvcnRBYmlsaXR5OwotCQlicmVhazsKLQljYXNlIEhXX1ZBUl9NQVhfUlhfQU1QRFVfRkFDVE9SOgotCQkqKCh1MzIgKilwVmFsdWUpID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEs7Ci0JCWJyZWFrOwotCWNhc2UgSFdfREVGX09ETV9EQkdfRkxBRzoKLQl7Ci0JCXN0cnVjdCBkbV9vZG1fdAkqcERNX09kbSA9ICZwSGFsRGF0YS0+b2RtcHJpdjsKLQkJcHJpbnRrKCJwRE1fT2RtLT5EZWJ1Z0NvbXBvbmVudHMgPSAweCVsbHhcbiIsCi0JCSAgICAgICBwRE1fT2RtLT5EZWJ1Z0NvbXBvbmVudHMpOwotCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYlJlc3VsdCA9IF9GQUlMOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gYlJlc3VsdDsKLX0KLQotdm9pZCBydGw4NzIzYV91cGRhdGVfcmFtYXNrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgdTMyIG1hY19pZCwgdTggcnNzaV9sZXZlbCkKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8JKnBzdGE7Ci0Jc3RydWN0IEZXX1N0YV9JbmZvICpmd19zdGE7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYgKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JdTggaW5pdF9yYXRlLCBuZXR3b3JrVHlwZSwgcmFpZCwgYXJnOwotCXUzMiBtYXNrLCByYXRlX2JpdG1hcDsKLQl1OCBzaG9ydEdJcmF0ZSA9IGZhbHNlOwotCWludCBzdXBwb3J0UmF0ZU51bTsKLQotCWlmIChtYWNfaWQgPj0gTlVNX1NUQSkgLyogQ0FNX1NJWkUgKi8KLQkJcmV0dXJuOwotCi0JcHN0YSA9IHBtbG1laW5mby0+Rldfc3RhX2luZm9bbWFjX2lkXS5wc3RhOwotCWlmIChwc3RhID09IE5VTEwpCi0JCXJldHVybjsKLQotCXN3aXRjaCAobWFjX2lkKSB7Ci0JY2FzZSAwOi8qICBmb3IgaW5mcmEgbW9kZSAqLwotCQlzdXBwb3J0UmF0ZU51bSA9Ci0JCQlydHdfZ2V0X3JhdGVzZXRfbGVuMjNhKGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcyk7Ci0JCW5ldHdvcmtUeXBlID0ganVkZ2VfbmV0d29ya190eXBlMjNhKHBhZGFwdGVyLAotCQkJCQkJIGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcywKLQkJCQkJCSBzdXBwb3J0UmF0ZU51bSkgJiAweGY7Ci0JCS8qIHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSA9IG5ldHdvcmtUeXBlOyAqLwotCQlyYWlkID0gbmV0d29ya3R5cGVfdG9fcmFpZDIzYShuZXR3b3JrVHlwZSk7Ci0KLQkJbWFzayA9IHVwZGF0ZV9zdXBwb3J0ZWRfcmF0ZTIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsCi0JCQkJCSAgICAgc3VwcG9ydFJhdGVOdW0pOwotCQltYXNrIHw9IChwbWxtZWluZm8tPkhUX2VuYWJsZSkgPwotCQkJdXBkYXRlX01TQ19yYXRlMjNhKCZwbWxtZWluZm8tPmh0X2NhcCkgOiAwOwotCi0JCWlmIChzdXBwb3J0X3Nob3J0X0dJMjNhKHBhZGFwdGVyLCAmcG1sbWVpbmZvLT5odF9jYXApKQotCQkJc2hvcnRHSXJhdGUgPSB0cnVlOwotCQlicmVhazsKLQotCWNhc2UgMTovKiBmb3IgYnJvYWRjYXN0L211bHRpY2FzdCAqLwotCQlmd19zdGEgPSAmcG1sbWVpbmZvLT5GV19zdGFfaW5mb1ttYWNfaWRdOyAKLQkJc3VwcG9ydFJhdGVOdW0gPSBydHdfZ2V0X3JhdGVzZXRfbGVuMjNhKGZ3X3N0YS0+U3VwcG9ydGVkUmF0ZXMpOwotCQlpZiAocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFCKQotCQkJbmV0d29ya1R5cGUgPSBXSVJFTEVTU18xMUI7Ci0JCWVsc2UKLQkJCW5ldHdvcmtUeXBlID0gV0lSRUxFU1NfMTFHOwotCQlyYWlkID0gbmV0d29ya3R5cGVfdG9fcmFpZDIzYShuZXR3b3JrVHlwZSk7Ci0KLQkJbWFzayA9IHVwZGF0ZV9iYXNpY19yYXRlMjNhKGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcywKLQkJCQkJIHN1cHBvcnRSYXRlTnVtKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OiAvKiBmb3IgZWFjaCBzdGEgaW4gSUJTUyAqLwotCQlmd19zdGEgPSAmcG1sbWVpbmZvLT5GV19zdGFfaW5mb1ttYWNfaWRdOyAKLQkJc3VwcG9ydFJhdGVOdW0gPSBydHdfZ2V0X3JhdGVzZXRfbGVuMjNhKGZ3X3N0YS0+U3VwcG9ydGVkUmF0ZXMpOwotCQluZXR3b3JrVHlwZSA9IGp1ZGdlX25ldHdvcmtfdHlwZTIzYShwYWRhcHRlciwKLQkJCQkJCSAgICBmd19zdGEtPlN1cHBvcnRlZFJhdGVzLAotCQkJCQkJICAgIHN1cHBvcnRSYXRlTnVtKSAmIDB4ZjsKLQkJLyogcG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlID0gbmV0d29ya1R5cGU7ICovCi0JCXJhaWQgPSBuZXR3b3JrdHlwZV90b19yYWlkMjNhKG5ldHdvcmtUeXBlKTsKLQotCQltYXNrID0gdXBkYXRlX3N1cHBvcnRlZF9yYXRlMjNhKGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcywKLQkJCQkJCXN1cHBvcnRSYXRlTnVtKTsKLQotCQkvKiB0b2RvOiBzdXBwb3J0IEhUIGluIElCU1MgKi8KLQkJYnJlYWs7Ci0JfQotCi0JLyogbWFzayAmPSAweDBmZmZmZmZmOyAqLwotCXJhdGVfYml0bWFwID0gT0RNX0dldF9SYXRlX0JpdG1hcDIzYShwSGFsRGF0YSwgbWFjX2lkLCBtYXNrLAotCQkJCQkgICAgIHJzc2lfbGV2ZWwpOwotCURCR184NzIzQSgiJXMgPT4gbWFjX2lkOiVkLCBuZXR3b3JrVHlwZToweCUwMngsICIKLQkJICAibWFzazoweCUwOHhcblx0ID09PiByc3NpX2xldmVsOiVkLCByYXRlX2JpdG1hcDoweCUwOHhcbiIsCi0JCSAgX19mdW5jX18sIG1hY19pZCwgbmV0d29ya1R5cGUsIG1hc2ssIHJzc2lfbGV2ZWwsIHJhdGVfYml0bWFwKTsKLQotCW1hc2sgJj0gcmF0ZV9iaXRtYXA7Ci0JbWFzayB8PSAoKHJhaWQgPDwgMjgpICYgMHhmMDAwMDAwMCk7Ci0KLQlpbml0X3JhdGUgPSBnZXRfaGlnaGVzdF9yYXRlX2lkeDIzYShtYXNrKSAmIDB4M2Y7Ci0KLQlhcmcgPSBtYWNfaWQgJiAweDFmOy8qIE1BQ0lEICovCi0JYXJnIHw9IEJJVCg3KTsKLQotCWlmIChzaG9ydEdJcmF0ZSA9PSB0cnVlKQotCQlhcmcgfD0gQklUKDUpOwotCi0JREJHXzg3MjNBKCJ1cGRhdGUgcmFpZCBlbnRyeSwgbWFzayA9IDB4JXgsIGFyZyA9IDB4JXhcbiIsIG1hc2ssIGFyZyk7Ci0KLQlydGw4NzIzYV9zZXRfcmFpZF9jbWQocGFkYXB0ZXIsIG1hc2ssIGFyZyk7Ci0KLQkvKiBzZXQgcmFfaWQgKi8KLQlwc3RhLT5yYWlkID0gcmFpZDsKLQlwc3RhLT5pbml0X3JhdGUgPSBpbml0X3JhdGU7Ci0KLQkvKiBzZXQgY29ycmVjdCBpbml0aWFsIGRhdGUgcmF0ZSBmb3IgZWFjaCBtYWNfaWQgKi8KLQlwZG1wcml2LT5JTklEQVRBX1JBVEVbbWFjX2lkXSA9IGluaXRfcmF0ZTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3VzYl9vcHNfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3VzYl9vcHNfbGludXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM4MWZmNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC91c2Jfb3BzX2xpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9IQ0lfT1BTX09TX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8b3NkZXBfaW50Zi5oPgotI2luY2x1ZGUgPHVzYl9vcHMuaD4KLSNpbmNsdWRlIDxyZWN2X29zZGVwLmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfcmVjdi5oPgotCi11OCBydGw4NzIzYXVfcmVhZDgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHIpCi17Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9ianByaXYgPSBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHBkdm9ianByaXYtPnB1c2JkZXY7Ci0JaW50IGxlbjsKLQl1OCBkYXRhOwotCi0JbXV0ZXhfbG9jaygmcGR2b2JqcHJpdi0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwotCWxlbiA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCi0JCQkgICAgICBSRUFMVEVLX1VTQl9WRU5RVF9DTURfUkVRLCBSRUFMVEVLX1VTQl9WRU5RVF9SRUFELAotCQkJICAgICAgYWRkciwgMCwgJnBkdm9ianByaXYtPnVzYl9idWYudmFsOCwgc2l6ZW9mKGRhdGEpLAotCQkJICAgICAgUlRXX1VTQl9DT05UUk9MX01TR19USU1FT1VUKTsKLQotCWRhdGEgPSBwZHZvYmpwcml2LT51c2JfYnVmLnZhbDg7Ci0JbXV0ZXhfdW5sb2NrKCZwZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9tdXRleCk7Ci0KLQlyZXR1cm4gZGF0YTsKLX0KLQotdTE2IHJ0bDg3MjNhdV9yZWFkMTYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHIpCi17Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9ianByaXYgPSBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHBkdm9ianByaXYtPnB1c2JkZXY7Ci0JaW50IGxlbjsKLQl1MTYgZGF0YTsKLQotCW11dGV4X2xvY2soJnBkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKLQlsZW4gPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLAotCQkJICAgICAgUkVBTFRFS19VU0JfVkVOUVRfQ01EX1JFUSwgUkVBTFRFS19VU0JfVkVOUVRfUkVBRCwKLQkJCSAgICAgIGFkZHIsIDAsICZwZHZvYmpwcml2LT51c2JfYnVmLnZhbDE2LCBzaXplb2YoZGF0YSksCi0JCQkgICAgICBSVFdfVVNCX0NPTlRST0xfTVNHX1RJTUVPVVQpOwotCi0JZGF0YSA9IGxlMTZfdG9fY3B1KHBkdm9ianByaXYtPnVzYl9idWYudmFsMTYpOwotCW11dGV4X3VubG9jaygmcGR2b2JqcHJpdi0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwotCi0JcmV0dXJuIGRhdGE7Ci19Ci0KLXUzMiBydGw4NzIzYXVfcmVhZDMyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmpwcml2ID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwZHZvYmpwcml2LT5wdXNiZGV2OwotCWludCBsZW47Ci0JdTMyIGRhdGE7Ci0KLQltdXRleF9sb2NrKCZwZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9tdXRleCk7Ci0JbGVuID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKLQkJCSAgICAgIFJFQUxURUtfVVNCX1ZFTlFUX0NNRF9SRVEsIFJFQUxURUtfVVNCX1ZFTlFUX1JFQUQsCi0JCQkgICAgICBhZGRyLCAwLCAmcGR2b2JqcHJpdi0+dXNiX2J1Zi52YWwzMiwgc2l6ZW9mKGRhdGEpLAotCQkJICAgICAgUlRXX1VTQl9DT05UUk9MX01TR19USU1FT1VUKTsKLQotCWRhdGEgPSBsZTMyX3RvX2NwdShwZHZvYmpwcml2LT51c2JfYnVmLnZhbDMyKTsKLQltdXRleF91bmxvY2soJnBkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKLQotCXJldHVybiBkYXRhOwotfQotCi1pbnQgcnRsODcyM2F1X3dyaXRlOChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgYWRkciwgdTggdmFsKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmpwcml2ID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwZHZvYmpwcml2LT5wdXNiZGV2OwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZwZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9tdXRleCk7Ci0JcGR2b2JqcHJpdi0+dXNiX2J1Zi52YWw4ID0gdmFsOwotCi0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKLQkJCSAgICAgIFJFQUxURUtfVVNCX1ZFTlFUX0NNRF9SRVEsCi0JCQkgICAgICBSRUFMVEVLX1VTQl9WRU5RVF9XUklURSwKLQkJCSAgICAgIGFkZHIsIDAsICZwZHZvYmpwcml2LT51c2JfYnVmLnZhbDgsIHNpemVvZih2YWwpLAotCQkJICAgICAgUlRXX1VTQl9DT05UUk9MX01TR19USU1FT1VUKTsKLQotCWlmIChyZXQgIT0gc2l6ZW9mKHZhbCkpCi0JCXJldCA9IF9GQUlMOwotCWVsc2UKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0KLQltdXRleF91bmxvY2soJnBkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgcnRsODcyM2F1X3dyaXRlMTYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHIsIHUxNiB2YWwpCi17Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9ianByaXYgPSBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHBkdm9ianByaXYtPnB1c2JkZXY7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJnBkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKLQlwZHZvYmpwcml2LT51c2JfYnVmLnZhbDE2ID0gY3B1X3RvX2xlMTYodmFsKTsKLQotCXJldCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCi0JCQkgICAgICBSRUFMVEVLX1VTQl9WRU5RVF9DTURfUkVRLAotCQkJICAgICAgUkVBTFRFS19VU0JfVkVOUVRfV1JJVEUsCi0JCQkgICAgICBhZGRyLCAwLCAmcGR2b2JqcHJpdi0+dXNiX2J1Zi52YWwxNiwgc2l6ZW9mKHZhbCksCi0JCQkgICAgICBSVFdfVVNCX0NPTlRST0xfTVNHX1RJTUVPVVQpOwotCi0JaWYgKHJldCAhPSBzaXplb2YodmFsKSkKLQkJcmV0ID0gX0ZBSUw7Ci0JZWxzZQotCQlyZXQgPSBfU1VDQ0VTUzsKLQotCW11dGV4X3VubG9jaygmcGR2b2JqcHJpdi0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCBydGw4NzIzYXVfd3JpdGUzMihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgYWRkciwgdTMyIHZhbCkKLXsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqcGR2b2JqcHJpdiA9IGFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpOwotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcGR2b2JqcHJpdi0+cHVzYmRldjsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmcGR2b2JqcHJpdi0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwotCXBkdm9ianByaXYtPnVzYl9idWYudmFsMzIgPSBjcHVfdG9fbGUzMih2YWwpOwotCi0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKLQkJCSAgICAgIFJFQUxURUtfVVNCX1ZFTlFUX0NNRF9SRVEsCi0JCQkgICAgICBSRUFMVEVLX1VTQl9WRU5RVF9XUklURSwKLQkJCSAgICAgIGFkZHIsIDAsICZwZHZvYmpwcml2LT51c2JfYnVmLnZhbDMyLCBzaXplb2YodmFsKSwKLQkJCSAgICAgIFJUV19VU0JfQ09OVFJPTF9NU0dfVElNRU9VVCk7Ci0KLQlpZiAocmV0ICE9IHNpemVvZih2YWwpKQotCQlyZXQgPSBfRkFJTDsKLQllbHNlCi0JCXJldCA9IF9TVUNDRVNTOwotCi0JbXV0ZXhfdW5sb2NrKCZwZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJ0bDg3MjNhdV93cml0ZU4oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHIsIHUxNiBsZW4sIHU4ICpidWYpCi17Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9ianByaXYgPSBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHBkdm9ianByaXYtPnB1c2JkZXY7Ci0JaW50IHJldDsKLQotCXJldCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCi0JCQkgICAgICBSRUFMVEVLX1VTQl9WRU5RVF9DTURfUkVRLAotCQkJICAgICAgUkVBTFRFS19VU0JfVkVOUVRfV1JJVEUsCi0JCQkgICAgICBhZGRyLCAwLCBidWYsIGxlbiwgUlRXX1VTQl9DT05UUk9MX01TR19USU1FT1VUKTsKLQotCWlmIChyZXQgIT0gbGVuKQotCQlyZXR1cm4gX0ZBSUw7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKglSZWNvZ25pemUgdGhlIGludGVycnVwdCBjb250ZW50IGJ5IHJlYWRpbmcgdGhlIGludGVycnVwdAotICoJcmVnaXN0ZXIgb3IgY29udGVudCBhbmQgbWFza2luZyBpbnRlcnJ1cHQgbWFzayAoSU1SKQotICoJaWYgaXQgaXMgb3VyIE5JQydzIGludGVycnVwdC4gQWZ0ZXIgcmVjb2duaXppbmcsIHdlIG1heSBjbGVhcgotICoJdGhlIGFsbCBpbnRlcnJ1cHRzIChJU1IpLgotICogQXJndW1lbnRzOgotICoJW2luXSBBZGFwdGVyIC0KLSAqCQlUaGUgYWRhcHRlciBjb250ZXh0LgotICoJW2luXSBwQ29udGVudCAtCi0gKgkJVW5kZXIgUENJIGludGVyZmFjZSwgdGhpcyBmaWVsZCBpcyBpZ25vcmQuCi0gKgkJVW5kZXIgVVNCIGludGVyZmFjZSwgdGhlIGNvbnRlbnQgaXMgdGhlIGludGVycnVwdAotICoJCWNvbnRlbnQgcG9pbnRlci4KLSAqCQlVbmRlciBTRElPIGludGVyZmFjZSwgdGhpcyBpcyB0aGUgaW50ZXJydXB0IHR5cGUgd2hpY2gKLSAqCQlpcyBMb2NhbCBpbnRlcnJ1cHQgb3Igc3lzdGVtIGludGVycnVwdC4KLSAqCVtpbl0gQ29udGVudExlbiAtCi0gKgkJVGhlIGxlbmd0aCBpbiBieXRlIG9mIHBDb250ZW50LgotICogUmV0dXJuOgotICoJSWYgYW55IGludGVycnVwdCBtYXRjaGVzIHRoZSBtYXNrIChJTVIpLCByZXR1cm4gdHJ1ZSwgYW5kCi0gKglyZXR1cm4gZmFsc2Ugb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgYm9vbAotSW50ZXJydXB0UmVjb2duaXplZDg3MjNBVShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHZvaWQgKnBDb250ZW50LAotCQkJICB1MzIgQ29udGVudExlbikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXU4ICpidWZmZXIgPSAodTggKilwQ29udGVudDsKLQlzdHJ1Y3QgcmVwb3J0cHdyc3RhdGVfcGFybSByZXBvcnQ7Ci0KLQltZW1jcHkoJnBIYWxEYXRhLT5JbnRBcnJheVswXSwgJmJ1ZmZlcltVU0JfSU5UUl9DT05URU5UX0hJU1JfT0ZGU0VUXSwKLQkgICAgICAgNCk7Ci0JcEhhbERhdGEtPkludEFycmF5WzBdICY9IHBIYWxEYXRhLT5JbnRyTWFza1swXTsKLQotCS8qIEZvciBISVNSIGV4dGVuc2lvbi4gQWRkZWQgYnkgdHlubGkuIDIwMDkuMTAuMDcuICovCi0JbWVtY3B5KCZwSGFsRGF0YS0+SW50QXJyYXlbMV0sCi0JICAgICAgICZidWZmZXJbVVNCX0lOVFJfQ09OVEVOVF9ISVNSRV9PRkZTRVRdLCA0KTsKLQlwSGFsRGF0YS0+SW50QXJyYXlbMV0gJj0gcEhhbERhdGEtPkludHJNYXNrWzFdOwotCi0JLyogV2Ugc2hvbHVkIHJlbW92ZSB0aGlzIGZ1bmN0aW9uIGxhdGVyIGJlY2F1c2UgRERLIHN1Z2dlc3QKLQkgKiBub3QgdG8gZXhlY3V0aW5nIHRvbyBtYW55IG9wZXJhdGlvbnMgaW4gTVBJU1IgICovCi0KLQltZW1jcHkoJnJlcG9ydC5zdGF0ZSwgJmJ1ZmZlcltVU0JfSU5UUl9DUFdNX09GRlNFVF0sIDEpOwotCi0JcmV0dXJuIChwSGFsRGF0YS0+SW50QXJyYXlbMF0gJiBwSGFsRGF0YS0+SW50ck1hc2tbMF0pICE9IDAgfHwKLQkJKHBIYWxEYXRhLT5JbnRBcnJheVsxXSAmIHBIYWxEYXRhLT5JbnRyTWFza1sxXSkgIT0gMDsKLX0KLQotc3RhdGljIHZvaWQgdXNiX3JlYWRfaW50ZXJydXB0X2NvbXBsZXRlKHN0cnVjdCB1cmIgKnB1cmIpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBydHdfYWRhcHRlciAqKXB1cmItPmNvbnRleHQ7Ci0KLQlpZiAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgfHwgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8Ci0JICAgIHBhZGFwdGVyLT5iUmVhZFBvcnRDYW5jZWwpIHsKLQkJREJHXzg3MjNBKCIlcygpIFJYIFdhcm5pbmchIGJEcml2ZXJTdG9wcGVkKCVkKSBPUiAiCi0JCQkgICJiU3VycHJpc2VSZW1vdmVkKCVkKSBiUmVhZFBvcnRDYW5jZWwoJWQpXG4iLAotCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkLAotCQkJICBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCwKLQkJCSAgcGFkYXB0ZXItPmJSZWFkUG9ydENhbmNlbCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocHVyYi0+c3RhdHVzID09IDApIHsKLQkJc3RydWN0IGMyaF9ldnRfaGRyICpjMmhfZXZ0OwotCi0JCWMyaF9ldnQgPSAoc3RydWN0IGMyaF9ldnRfaGRyICopcHVyYi0+dHJhbnNmZXJfYnVmZmVyOwotCi0JCWlmIChwdXJiLT5hY3R1YWxfbGVuZ3RoID4gVVNCX0lOVFJfQ09OVEVOVF9MRU5HVEgpIHsKLQkJCURCR184NzIzQSgidXNiX3JlYWRfaW50ZXJydXB0X2NvbXBsZXRlOiBwdXJiLT5hY3R1YWxfIgotCQkJCSAgImxlbmd0aCA+IFVTQl9JTlRSX0NPTlRFTlRfTEVOR1RIXG4iKTsKLQkJCWdvdG8gdXJiX3N1Ym1pdDsKLQkJfQotCi0JCUludGVycnVwdFJlY29nbml6ZWQ4NzIzQVUocGFkYXB0ZXIsIHB1cmItPnRyYW5zZmVyX2J1ZmZlciwKLQkJCQkJICBwdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQotCQlpZiAoYzJoX2V2dF9leGlzdChjMmhfZXZ0KSkgewotCQkJaWYgKGMyaF9pZF9maWx0ZXJfY2N4Xzg3MjNhKGMyaF9ldnQtPmlkKSkgewotCQkJCS8qIEhhbmRsZSBDQ1ggcmVwb3J0IGhlcmUgKi8KLQkJCQloYW5kbGVfdHhycHRfY2N4Xzg3MjNhKHBhZGFwdGVyLCAodm9pZCAqKQotCQkJCQkJICAgICAgIGMyaF9ldnQtPnBheWxvYWQpOwotCQkJCXNjaGVkdWxlX3dvcmsoJnBhZGFwdGVyLT5ldnRwcml2LmlycV93ayk7Ci0JCQl9IGVsc2UgewotCQkJCXN0cnVjdCBldnRfd29yayAqYzJ3OwotCQkJCWludCByZXM7Ci0KLQkJCQljMncgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXZ0X3dvcmspLAotCQkJCQkJR0ZQX0FUT01JQyk7Ci0KLQkJCQlpZiAoIWMydykKLQkJCQkJZ290byB1cmJfc3VibWl0OwotCi0JCQkJYzJ3LT5hZGFwdGVyID0gcGFkYXB0ZXI7Ci0JCQkJSU5JVF9XT1JLKCZjMnctPndvcmssIHJ0d19ldnRfd29yayk7Ci0JCQkJbWVtY3B5KGMydy0+dS5idWYsIHB1cmItPnRyYW5zZmVyX2J1ZmZlciwgMTYpOwotCi0JCQkJcmVzID0gcXVldWVfd29yayhwYWRhcHRlci0+ZXZ0cHJpdi53cSwKLQkJCQkJCSAmYzJ3LT53b3JrKTsKLQotCQkJCWlmICghcmVzKSB7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbGwgdG8gIgotCQkJCQkgICAgICAgInF1ZXVlX3dvcmsoKSBmYWlsZWRcbiIsCi0JCQkJCSAgICAgICBfX2Z1bmNfXyk7Ci0JCQkJCWtmcmVlKGMydyk7Ci0JCQkJCWdvdG8gdXJiX3N1Ym1pdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotdXJiX3N1Ym1pdDoKLQkJZXJyID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0FUT01JQyk7Ci0JCWlmIChlcnIgJiYgKGVyciAhPSAtRVBFUk0pKSB7Ci0JCQlEQkdfODcyM0EoImNhbm5vdCBzdWJtaXQgaW50ZXJydXB0IGluLXRva2VuKGVyciA9ICIKLQkJCQkgICIweCUwOHgpLCB1cmJfc3RhdHVzID0gJWRcbiIsCi0JCQkJICBlcnIsIHB1cmItPnN0YXR1cyk7Ci0JCX0KLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiMjIz0+IHVzYl9yZWFkX2ludGVycnVwdF9jb21wbGV0ZSA9PiB1cmIgIgotCQkJICAic3RhdHVzKCVkKVxuIiwgcHVyYi0+c3RhdHVzKTsKLQotCQlzd2l0Y2ggKHB1cmItPnN0YXR1cykgewotCQljYXNlIC1FSU5WQUw6Ci0JCWNhc2UgLUVQSVBFOgotCQljYXNlIC1FTk9ERVY6Ci0JCWNhc2UgLUVTSFVURE9XTjoKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJCSAidXNiX3JlYWRfcG9ydF9jb21wbGV0ZTpiU3VycHJpc2VSZW1vdmVkID10cnVlXG4iKTsKLQkJCS8qIEZhbGwgVGhyb3VnaCBoZXJlICovCi0JCWNhc2UgLUVOT0VOVDoKLQkJCXBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9IHRydWU7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgInVzYl9yZWFkX3BvcnRfY29tcGxldGU6YkRyaXZlclN0b3BwZWQgPXRydWVcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgLUVQUk9UTzoKLQkJCWJyZWFrOwotCQljYXNlIC1FSU5QUk9HUkVTUzoKLQkJCURCR184NzIzQSgiRVJST1I6IFVSQiBJUyBJTiBQUk9HUkVTUyFcbiIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotaW50IHJ0bDg3MjNhdV9yZWFkX2ludGVycnVwdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaW50IGVycjsKLQl1bnNpZ25lZCBpbnQgcGlwZTsKLQlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9iaiA9IGFkYXB0ZXJfdG9fZHZvYmooYWRhcHRlcik7Ci0Jc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2ID0gJmFkYXB0ZXItPnJlY3Zwcml2OwotCXN0cnVjdCB1c2JfZGV2aWNlICpwdXNiZCA9IHBkdm9iai0+cHVzYmRldjsKLQotCS8qIHRyYW5zbGF0ZSBETUEgRklGTyBhZGRyIHRvIHBpcGVoYW5kbGUgKi8KLQlwaXBlID0gdXNiX3JjdmludHBpcGUocHVzYmQsIHBkdm9iai0+UnRJblBpcGVbMV0pOwotCi0JdXNiX2ZpbGxfaW50X3VyYihwcmVjdnByaXYtPmludF9pbl91cmIsIHB1c2JkLCBwaXBlLAotCQkJIHByZWN2cHJpdi0+aW50X2luX2J1ZiwgVVNCX0lOVFJfQ09OVEVOVF9MRU5HVEgsCi0JCQkgdXNiX3JlYWRfaW50ZXJydXB0X2NvbXBsZXRlLCBhZGFwdGVyLCAxKTsKLQotCWVyciA9IHVzYl9zdWJtaXRfdXJiKHByZWN2cHJpdi0+aW50X2luX3VyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKGVyciAmJiAoZXJyICE9IC1FUEVSTSkpIHsKLQkJREJHXzg3MjNBKCJjYW5ub3Qgc3VibWl0IGludGVycnVwdCBpbi10b2tlbihlcnIgPSAweCUwOHgpLCIKLQkJCSAgInVyYl9zdGF0dXMgPSAlZFxuIiwgZXJyLAotCQkJICBwcmVjdnByaXYtPmludF9pbl91cmItPnN0YXR1cyk7Ci0JCXJldCA9IF9GQUlMOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcmVjdmJ1ZjJyZWN2ZnJhbWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnBza2IpCi17Ci0JdTgJKnBidWY7Ci0JdTgJc2hpZnRfc3ogPSAwOwotCXUxNglwa3RfY250OwotCXUzMglwa3Rfb2Zmc2V0LCBza2JfbGVuLCBhbGxvY19zejsKLQlpbnQJdHJhbnNmZXJfbGVuOwotCXN0cnVjdCByZWN2X3N0YXQgKnByeHN0YXQ7Ci0Jc3RydWN0IHBoeV9zdGF0CSpwcGh5X2luZm87Ci0Jc3RydWN0IHNrX2J1ZmYgKnBrdF9jb3B5OwotCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliOwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSA9ICZwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZTsKLQotCXRyYW5zZmVyX2xlbiA9IChpbnQpcHNrYi0+bGVuOwotCXBidWYgPSBwc2tiLT5kYXRhOwotCi0JcHJ4c3RhdCA9IChzdHJ1Y3QgcmVjdl9zdGF0ICopcGJ1ZjsKLQlwa3RfY250ID0gKGxlMzJfdG9fY3B1KHByeHN0YXQtPnJ4ZHcyKSA+PiAxNikgJiAweGZmOwotCi0JZG8gewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCSAicmVjdmJ1ZjJyZWN2ZnJhbWU6IHJ4ZGVzYyA9IG9mZnNzZXQgMDoweCUwOHgsIDQ6MHglMDh4LCA4OjB4JTA4eCwgQzoweCUwOHhcbiIsCi0JCQkgcHJ4c3RhdC0+cnhkdzAsIHByeHN0YXQtPnJ4ZHcxLAotCQkJIHByeHN0YXQtPnJ4ZHcyLCBwcnhzdGF0LT5yeGR3NCk7Ci0KLQkJcHJ4c3RhdCA9IChzdHJ1Y3QgcmVjdl9zdGF0ICopcGJ1ZjsKLQotCQlwcmVjdmZyYW1lID0gcnR3X2FsbG9jX3JlY3ZmcmFtZTIzYShwZnJlZV9yZWN2X3F1ZXVlKTsKLQkJaWYgKCFwcmVjdmZyYW1lKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAicmVjdmJ1ZjJyZWN2ZnJhbWU6IHByZWN2ZnJhbWUgPT0gTlVMTFxuIik7Ci0JCQlEQkdfODcyM0EoIiVzKCktJWQ6IHJ0d19hbGxvY19yZWN2ZnJhbWUyM2EoKSBmYWlsZWQhIFJYICIKLQkJCQkgICJEcm9wIVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJCWdvdG8gX2V4aXRfcmVjdmJ1ZjJyZWN2ZnJhbWU7Ci0JCX0KLQotCQlJTklUX0xJU1RfSEVBRCgmcHJlY3ZmcmFtZS0+bGlzdCk7Ci0KLQkJdXBkYXRlX3JlY3ZmcmFtZV9hdHRyaWIocHJlY3ZmcmFtZSwgcHJ4c3RhdCk7Ci0KLQkJcGF0dHJpYiA9ICZwcmVjdmZyYW1lLT5hdHRyaWI7Ci0KLQkJaWYgKHBhdHRyaWItPmNyY19lcnIpIHsKLQkJCURCR184NzIzQSgiJXMoKS0lZDogUlggV2FybmluZyEgcnggQ1JDIEVSUk9SICEhXG4iLAotCQkJCSAgX19mdW5jX18sIF9fTElORV9fKTsKLQkJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmVjdmZyYW1lKTsKLQkJCWdvdG8gX2V4aXRfcmVjdmJ1ZjJyZWN2ZnJhbWU7Ci0JCX0KLQotCQlwa3Rfb2Zmc2V0ID0gUlhERVNDX1NJWkUgKyBwYXR0cmliLT5kcnZpbmZvX3N6ICsKLQkJCXBhdHRyaWItPnNoaWZ0X3N6ICsgcGF0dHJpYi0+cGt0X2xlbjsKLQotCQlpZiAocGF0dHJpYi0+cGt0X2xlbiA8PSAwIHx8IHBrdF9vZmZzZXQgPiB0cmFuc2Zlcl9sZW4pIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAicmVjdmJ1ZjJyZWN2ZnJhbWU6IHBrdF9sZW48PSAwXG4iKTsKLQkJCURCR184NzIzQSgiJXMoKS0lZDogUlggV2FybmluZyFcbiIsCi0JCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZWN2ZnJhbWUpOwotCQkJZ290byBfZXhpdF9yZWN2YnVmMnJlY3ZmcmFtZTsKLQkJfQotCi0JCS8qCU1vZGlmaWVkIGJ5IEFsYmVydCAyMDEwMTIxMyAqLwotCQkvKglGb3IgOCBieXRlcyBJUCBoZWFkZXIgYWxpZ25tZW50LiAqLwotCQkvKglRb3MgZGF0YSwgd2lyZWxlc3MgbGFuIGhlYWRlciBsZW5ndGggaXMgMjYgKi8KLQkJaWYgKHBhdHRyaWItPnFvcykKLQkJCXNoaWZ0X3N6ID0gNjsKLQkJZWxzZQotCQkJc2hpZnRfc3ogPSAwOwotCi0JCXNrYl9sZW4gPSBwYXR0cmliLT5wa3RfbGVuOwotCi0JCS8qIGZvciBmaXJzdCBmcmFnbWVudCBwYWNrZXQsIGRyaXZlciBuZWVkIGFsbG9jYXRlCi0JCSAqIDE1MzYrZHJ2aW5mb19zeitSWERFU0NfU0laRSB0byBkZWZyYWcgcGFja2V0LgotCQkgKiBtb2RpZnkgYWxsb2Nfc3ogZm9yIHJlY3ZpdmUgY3JjIGVycm9yIHBhY2tldAotCQkgKiBieSB0aG9tYXMgMjAxMS0wNi0wMiAqLwotCQlpZiAocGF0dHJpYi0+bWZyYWcgPT0gMSAmJiBwYXR0cmliLT5mcmFnX251bSA9PSAwKSB7Ci0JCQkvKiBhbGxvY19zeiA9IDE2NjQ7CTE2NjQgaXMgMTI4IGFsaWdubWVudC4gKi8KLQkJCWlmIChza2JfbGVuIDw9IDE2NTApCi0JCQkJYWxsb2Nfc3ogPSAxNjY0OwotCQkJZWxzZQotCQkJCWFsbG9jX3N6ID0gc2tiX2xlbiArIDE0OwotCQl9IGVsc2UgewotCQkJYWxsb2Nfc3ogPSBza2JfbGVuOwotCQkvKiAgNiBpcyBmb3IgSVAgaGVhZGVyIDggYnl0ZXMgYWxpZ25tZW50IGluIFFvUyBwYWNrZXQgY2FzZS4gKi8KLQkJLyogIDggaXMgZm9yIHNrYi0+ZGF0YSA0IGJ5dGVzIGFsaWdubWVudC4gKi8KLQkJCWFsbG9jX3N6ICs9IDE0OwotCQl9Ci0KLQkJcGt0X2NvcHkgPSBuZXRkZXZfYWxsb2Nfc2tiKHBhZGFwdGVyLT5wbmV0ZGV2LCBhbGxvY19zeik7Ci0JCWlmIChwa3RfY29weSkgewotCQkJcGt0X2NvcHktPmRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCQkJcHJlY3ZmcmFtZS0+cGt0ID0gcGt0X2NvcHk7Ci0JCQkvKiBmb3JjZSBwa3RfY29weS0+ZGF0YSBhdCA4LWJ5dGUgYWxpZ25tZW50IGFkZHJlc3MgKi8KLQkJCXNrYl9yZXNlcnZlKHBrdF9jb3B5LCA4IC0KLQkJCQkgICAgKCh1bnNpZ25lZCBsb25nKShwa3RfY29weS0+ZGF0YSkgJiA3KSk7Ci0JCQkvKmZvcmNlIGlwX2hkciBhdCA4LWJ5dGUgYWxpZ25tZW50IGFkZHJlc3MKLQkJCSAgYWNjb3JkaW5nIHRvIHNoaWZ0X3N6LiAqLwotCQkJc2tiX3Jlc2VydmUocGt0X2NvcHksIHNoaWZ0X3N6KTsKLQkJCW1lbWNweShwa3RfY29weS0+ZGF0YSwgcGJ1ZiArIHBhdHRyaWItPnNoaWZ0X3N6ICsKLQkJCSAgICAgICBwYXR0cmliLT5kcnZpbmZvX3N6ICsgUlhERVNDX1NJWkUsIHNrYl9sZW4pOwotCQkJc2tiX3B1dChwa3RfY29weSwgc2tiX2xlbik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocGF0dHJpYi0+bWZyYWcgPT0gMSAmJiBwYXR0cmliLT5mcmFnX251bSA9PSAwKSB7Ci0JCQkJREJHXzg3MjNBKCJyZWN2YnVmMnJlY3ZmcmFtZTogYWxsb2Nfc2tiIGZhaWwsICIKLQkJCQkJICAiZHJvcCBmcmFnIGZyYW1lIFxuIik7Ci0JCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZWN2ZnJhbWUpOwotCQkJCWdvdG8gX2V4aXRfcmVjdmJ1ZjJyZWN2ZnJhbWU7Ci0JCQl9Ci0KLQkJCXByZWN2ZnJhbWUtPnBrdCA9IHNrYl9jbG9uZShwc2tiLCBHRlBfQVRPTUlDKTsKLQkJCWlmICghcHJlY3ZmcmFtZS0+cGt0KSB7Ci0JCQkJREJHXzg3MjNBKCJyZWN2YnVmMnJlY3ZmcmFtZTogc2tiX2Nsb25lICIKLQkJCQkJICAiZmFpbFxuIik7Ci0JCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZWN2ZnJhbWUpOwotCQkJCWdvdG8gX2V4aXRfcmVjdmJ1ZjJyZWN2ZnJhbWU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocGF0dHJpYi0+cGh5c3QpIHsKLQkJCXBwaHlfaW5mbyA9IChzdHJ1Y3QgcGh5X3N0YXQgKikocGJ1ZiArIFJYREVTQ19PRkZTRVQpOwotCQkJdXBkYXRlX3JlY3ZmcmFtZV9waHlpbmZvKHByZWN2ZnJhbWUsIHBwaHlfaW5mbyk7Ci0JCX0KLQotCQlpZiAocnR3X3JlY3ZfZW50cnkyM2EocHJlY3ZmcmFtZSkgIT0gX1NVQ0NFU1MpCi0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAicmVjdmJ1ZjJyZWN2ZnJhbWU6IHJ0d19yZWN2X2VudHJ5MjNhKHByZWN2ZnJhbWUpICE9IF9TVUNDRVNTXG4iKTsKLQotCQlwa3RfY250LS07Ci0JCXRyYW5zZmVyX2xlbiAtPSBwa3Rfb2Zmc2V0OwotCQlwYnVmICs9IHBrdF9vZmZzZXQ7Ci0JCXByZWN2ZnJhbWUgPSBOVUxMOwotCQlwa3RfY29weSA9IE5VTEw7Ci0KLQkJaWYgKHRyYW5zZmVyX2xlbiA+IDAgJiYgcGt0X2NudCA9PSAwKQotCQkJcGt0X2NudCA9IChsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3Mik+PjE2KSAmIDB4ZmY7Ci0KLQl9IHdoaWxlICh0cmFuc2Zlcl9sZW4gPiAwICYmIHBrdF9jbnQgPiAwKTsKLQotX2V4aXRfcmVjdmJ1ZjJyZWN2ZnJhbWU6Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXZvaWQgcnRsODcyM2F1X3JlY3ZfdGFza2xldCh2b2lkICpwcml2KQotewotCXN0cnVjdCBza19idWZmICpwc2tiOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopcHJpdjsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCi0Jd2hpbGUgKE5VTEwgIT0gKHBza2IgPSBza2JfZGVxdWV1ZSgmcHJlY3Zwcml2LT5yeF9za2JfcXVldWUpKSkgewotCQlpZiAocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSB7Ci0JCQlEQkdfODcyM0EoInJlY3ZfdGFza2xldCA9PiBiRHJpdmVyU3RvcHBlZCBvciAiCi0JCQkJICAiYlN1cnByaXNlUmVtb3ZlZCBcbiIpOwotCQkJZGV2X2tmcmVlX3NrYl9hbnkocHNrYik7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJlY3ZidWYycmVjdmZyYW1lKHBhZGFwdGVyLCBwc2tiKTsKLQkJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihwc2tiKTsKLQotCQlwc2tiLT5sZW4gPSAwOwotCi0JCXNrYl9xdWV1ZV90YWlsKCZwcmVjdnByaXYtPmZyZWVfcmVjdl9za2JfcXVldWUsIHBza2IpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdXNiX3JlYWRfcG9ydF9jb21wbGV0ZShzdHJ1Y3QgdXJiICpwdXJiKQotewotCXN0cnVjdCByZWN2X2J1ZiAqcHJlY3ZidWYgPSAoc3RydWN0IHJlY3ZfYnVmICopcHVyYi0+Y29udGV4dDsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBydHdfYWRhcHRlciAqKXByZWN2YnVmLT5hZGFwdGVyOwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJICJ1c2JfcmVhZF9wb3J0X2NvbXBsZXRlISEhXG4iKTsKLQotCXByZWN2cHJpdi0+cnhfcGVuZGluZ19jbnQtLTsKLQotCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fCBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwKLQkgICAgcGFkYXB0ZXItPmJSZWFkUG9ydENhbmNlbCkgewotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCSAidXNiX3JlYWRfcG9ydF9jb21wbGV0ZTpiRHJpdmVyU3RvcHBlZCglZCkgT1IgYlN1cnByaXNlUmVtb3ZlZCglZClcbiIsCi0JCQkgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkLCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCk7Ci0KLQkJREJHXzg3MjNBKCIlcygpLSVkOiBSWCBXYXJuaW5nISBiRHJpdmVyU3RvcHBlZCglZCkgT1IgIgotCQkJICAiYlN1cnByaXNlUmVtb3ZlZCglZCkgYlJlYWRQb3J0Q2FuY2VsKCVkKVxuIiwKLQkJCSAgX19mdW5jX18sIF9fTElORV9fLCBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQsCi0JCQkgIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkLCBwYWRhcHRlci0+YlJlYWRQb3J0Q2FuY2VsKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwdXJiLT5zdGF0dXMgPT0gMCkgewotCQlpZiAocHVyYi0+YWN0dWFsX2xlbmd0aCA+IE1BWF9SRUNWQlVGX1NaIHx8Ci0JCSAgICBwdXJiLT5hY3R1YWxfbGVuZ3RoIDwgUlhERVNDX1NJWkUpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJCSAidXNiX3JlYWRfcG9ydF9jb21wbGV0ZTogKHB1cmItPmFjdHVhbF9sZW5ndGggPiBNQVhfUkVDVkJVRl9TWikgfHwgKHB1cmItPmFjdHVhbF9sZW5ndGggPCBSWERFU0NfU0laRSlcbiIpOwotCQkJcnRsODcyM2F1X3JlYWRfcG9ydChwYWRhcHRlciwgMCwgcHJlY3ZidWYpOwotCQkJREJHXzg3MjNBKCIlcygpLSVkOiBSWCBXYXJuaW5nIVxuIiwKLQkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCX0gZWxzZSB7Ci0JCQlydHdfcmVzZXRfY29udGludWFsX3VyYl9lcnJvcigKLQkJCQlhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKSk7Ci0KLQkJCXNrYl9wdXQocHJlY3ZidWYtPnBza2IsIHB1cmItPmFjdHVhbF9sZW5ndGgpOwotCQkJc2tiX3F1ZXVlX3RhaWwoJnByZWN2cHJpdi0+cnhfc2tiX3F1ZXVlLAotCQkJCSAgICAgICBwcmVjdmJ1Zi0+cHNrYik7Ci0KLQkJCWlmIChza2JfcXVldWVfbGVuKCZwcmVjdnByaXYtPnJ4X3NrYl9xdWV1ZSkgPD0gMSkKLQkJCQl0YXNrbGV0X3NjaGVkdWxlKCZwcmVjdnByaXYtPnJlY3ZfdGFza2xldCk7Ci0KLQkJCXByZWN2YnVmLT5wc2tiID0gTlVMTDsKLQkJCXJ0bDg3MjNhdV9yZWFkX3BvcnQocGFkYXB0ZXIsIDAsIHByZWN2YnVmKTsKLQkJfQotCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJICJ1c2JfcmVhZF9wb3J0X2NvbXBsZXRlIDogcHVyYi0+c3RhdHVzKCVkKSAhPSAwXG4iLAotCQkJIHB1cmItPnN0YXR1cyk7Ci0JCXNrYl9wdXQocHJlY3ZidWYtPnBza2IsIHB1cmItPmFjdHVhbF9sZW5ndGgpOwotCQlwcmVjdmJ1Zi0+cHNrYiA9IE5VTEw7Ci0KLQkJREJHXzg3MjNBKCIjIyM9PiB1c2JfcmVhZF9wb3J0X2NvbXBsZXRlID0+IHVyYiBzdGF0dXMoJWQpXG4iLAotCQkJICBwdXJiLT5zdGF0dXMpOwotCi0JCWlmIChydHdfaW5jX2FuZF9jaGtfY29udGludWFsX3VyYl9lcnJvcigKLQkJCSAgICBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKSkpIHsKLQkJCXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID0gdHJ1ZTsKLQkJfQotCi0JCXN3aXRjaCAocHVyYi0+c3RhdHVzKSB7Ci0JCWNhc2UgLUVJTlZBTDoKLQkJY2FzZSAtRVBJUEU6Ci0JCWNhc2UgLUVOT0RFVjoKLQkJY2FzZSAtRVNIVVRET1dOOgotCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJ1c2JfcmVhZF9wb3J0X2NvbXBsZXRlOmJTdXJwcmlzZVJlbW92ZWQgPSB0cnVlXG4iKTsKLQkJCS8qIEludGVudGlvbmFsIGZhbGwgdGhyb3VnaCBoZXJlICovCi0JCWNhc2UgLUVOT0VOVDoKLQkJCXBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9IHRydWU7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgInVzYl9yZWFkX3BvcnRfY29tcGxldGU6YkRyaXZlclN0b3BwZWQgPSB0cnVlXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIC1FUFJPVE86Ci0JCWNhc2UgLUVPVkVSRkxPVzoKLQkJCXJ0bDg3MjNhdV9yZWFkX3BvcnQocGFkYXB0ZXIsIDAsIHByZWN2YnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIC1FSU5QUk9HUkVTUzoKLQkJCURCR184NzIzQSgiRVJST1I6IFVSQiBJUyBJTiBQUk9HUkVTUyFcbiIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotaW50IHJ0bDg3MjNhdV9yZWFkX3BvcnQoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1MzIgY250LAotCQkJc3RydWN0IHJlY3ZfYnVmICpwcmVjdmJ1ZikKLXsKLQlzdHJ1Y3QgdXJiICpwdXJiOwotCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmogPSBhZGFwdGVyX3RvX2R2b2JqKGFkYXB0ZXIpOwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZhZGFwdGVyLT5yZWN2cHJpdjsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYmQgPSBwZHZvYmotPnB1c2JkZXY7Ci0JaW50IGVycjsKLQl1bnNpZ25lZCBpbnQgcGlwZTsKLQl1bnNpZ25lZCBsb25nIHRtcGFkZHI7Ci0JdW5zaWduZWQgbG9uZyBhbGlnbm1lbnQ7Ci0JaW50IHJldCA9IF9TVUNDRVNTOwotCi0JaWYgKGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkgInVzYl9yZWFkX3BvcnQ6KHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSEhIVxuIik7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlpZiAoIXByZWN2YnVmKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJICJ1c2JfcmVhZF9wb3J0OnByZWN2YnVmID09IE5VTExcbiIpOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JaWYgKCFwcmVjdmJ1Zi0+cHNrYikKLQkJcHJlY3ZidWYtPnBza2IgPSBza2JfZGVxdWV1ZSgmcHJlY3Zwcml2LT5mcmVlX3JlY3Zfc2tiX3F1ZXVlKTsKLQotCS8qIHJlLWFzc2lnbiBmb3IgbGludXggYmFzZWQgb24gc2tiICovCi0JaWYgKCFwcmVjdmJ1Zi0+cHNrYikgewotCQlwcmVjdmJ1Zi0+cHNrYiA9IG5ldGRldl9hbGxvY19za2IoYWRhcHRlci0+cG5ldGRldiwgTUFYX1JFQ1ZCVUZfU1ogKyBSRUNWQlVGRl9BTElHTl9TWik7Ci0JCWlmIChwcmVjdmJ1Zi0+cHNrYiA9PSBOVUxMKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgImluaXRfcmVjdmJ1ZigpOiBhbGxvY19za2IgZmFpbCFcbiIpOwotCQkJcmV0dXJuIF9GQUlMOwotCQl9Ci0KLQkJdG1wYWRkciA9ICh1bnNpZ25lZCBsb25nKXByZWN2YnVmLT5wc2tiLT5kYXRhOwotCQlhbGlnbm1lbnQgPSB0bXBhZGRyICYgKFJFQ1ZCVUZGX0FMSUdOX1NaLTEpOwotCQlza2JfcmVzZXJ2ZShwcmVjdmJ1Zi0+cHNrYiwgKFJFQ1ZCVUZGX0FMSUdOX1NaIC0gYWxpZ25tZW50KSk7Ci0JfQotCi0JcHJlY3Zwcml2LT5yeF9wZW5kaW5nX2NudCsrOwotCi0JcHVyYiA9IHByZWN2YnVmLT5wdXJiOwotCi0JLyogdHJhbnNsYXRlIERNQSBGSUZPIGFkZHIgdG8gcGlwZWhhbmRsZSAqLwotCXBpcGUgPSB1c2JfcmN2YnVsa3BpcGUocHVzYmQsIHBkdm9iai0+UnRJblBpcGVbMF0pOwotCi0JdXNiX2ZpbGxfYnVsa191cmIocHVyYiwgcHVzYmQsIHBpcGUsIHByZWN2YnVmLT5wc2tiLT5kYXRhLAotCQkJICBNQVhfUkVDVkJVRl9TWiwgdXNiX3JlYWRfcG9ydF9jb21wbGV0ZSwKLQkJCSAgcHJlY3ZidWYpOy8qIGNvbnRleHQgaXMgcHJlY3ZidWYgKi8KLQotCWVyciA9IHVzYl9zdWJtaXRfdXJiKHB1cmIsIEdGUF9BVE9NSUMpOwotCWlmICgoZXJyKSAmJiAoZXJyICE9IC1FUEVSTSkpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkgImNhbm5vdCBzdWJtaXQgcnggaW4tdG9rZW4oZXJyID0gMHglLjh4KSwgVVJCX1NUQVRVUyA9IDB4JS44eFxuIiwKLQkJCSBlcnIsIHB1cmItPnN0YXR1cyk7Ci0JCURCR184NzIzQSgiY2Fubm90IHN1Ym1pdCByeCBpbi10b2tlbihlcnIgPSAweCUwOHgpLCB1cmJfc3RhdHVzICIKLQkJCSAgIj0gJWRcbiIsIGVyciwgcHVyYi0+c3RhdHVzKTsKLQkJcmV0ID0gX0ZBSUw7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgcnRsODcyM2F1X3htaXRfdGFza2xldCh2b2lkICpwcml2KQotewotCWludCByZXQ7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKilwcml2OwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSkKLQkJcmV0dXJuOwotCi0Jd2hpbGUgKDEpIHsKLQkJaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fAotCQkgICAgcGFkYXB0ZXItPmJXcml0ZVBvcnRDYW5jZWwpIHsKLQkJCURCR184NzIzQSgieG1pdF90YXNrbGV0ID0+IGJEcml2ZXJTdG9wcGVkIG9yICIKLQkJCQkgICJiU3VycHJpc2VSZW1vdmVkIG9yIGJXcml0ZVBvcnRDYW5jZWxcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXQgPSBydGw4NzIzYXVfeG1pdGZyYW1lX2NvbXBsZXRlKHBhZGFwdGVyLCBweG1pdHByaXYsIE5VTEwpOwotCi0JCWlmICghcmV0KQotCQkJYnJlYWs7Ci0JfQotfQotCi12b2lkIHJ0bDg3MjNhdV9zZXRfaHdfdHlwZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXBhZGFwdGVyLT5jaGlwX3R5cGUgPSBSVEw4NzIzQTsKLQlwYWRhcHRlci0+SGFyZHdhcmVUeXBlID0gSEFSRFdBUkVfVFlQRV9SVEw4NzIzQVU7Ci0JREJHXzg3MjNBKCJDSElQIFRZUEU6IFJUTDg3MjNBXG4iKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWw4NzIzQVBoeUNmZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbDg3MjNBUGh5Q2ZnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZjM2NTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbDg3MjNBUGh5Q2ZnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX0lOQ19IQUw4NzIzUEhZQ0ZHX0hfXwotI2RlZmluZSBfX0lOQ19IQUw4NzIzUEhZQ0ZHX0hfXwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBzdHJ1Y3R1cmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWVudW0gUkZfUkFESU9fUEFUSCB7Ci0JUkZfUEFUSF9BID0gMCwJCQkvKiBSYWRpbyBQYXRoIEEgKi8KLQlSRl9QQVRIX0IgPSAxLAkJCS8qIFJhZGlvIFBhdGggQiAqLwotCVJGX1BBVEhfTUFYCQkJLyogTWF4IFJGIG51bWJlciA5MCBzdXBwb3J0ICovCi19OwotCi0jZGVmaW5lIENIQU5ORUxfTUFYX05VTUJFUgkJMTQJLyogIDE0IGlzIHRoZSBtYXggY2hhbm5lbCBudW1iZXIgKi8KLQotZW51bSBXSVJFTEVTU19NT0RFIHsKLQlXSVJFTEVTU19NT0RFX1VOS05PV04JPSAweDAwLAotCVdJUkVMRVNTX01PREVfQQkJPSBCSVQoMiksCi0JV0lSRUxFU1NfTU9ERV9CCQk9IEJJVCgwKSwKLQlXSVJFTEVTU19NT0RFX0cJCT0gQklUKDEpLAotCVdJUkVMRVNTX01PREVfQVVUTwk9IEJJVCg1KSwKLQlXSVJFTEVTU19NT0RFX05fMjRHCT0gQklUKDMpLAotCVdJUkVMRVNTX01PREVfTl81Rwk9IEJJVCg0KSwKLQlXSVJFTEVTU19NT0RFX0FDCT0gQklUKDYpCi19OwotCi1zdHJ1Y3QgYmJfcmVnX2RlZmluZSB7Ci0JdTMyIHJmaW50ZnM7CQkvKiAgc2V0IHNvZnR3YXJlIGNvbnRyb2w6ICovCi0JCQkJLyoJCTB4ODcwfjB4ODc3WzggYnl0ZXNdICovCi0JdTMyIHJmaW50Zmk7CQkvKiAgcmVhZGJhY2sgZGF0YTogKi8KLQkJCQkvKgkJMHg4ZTB+MHg4ZTdbOCBieXRlc10gKi8KLQl1MzIgcmZpbnRmbzsJCS8qICBvdXRwdXQgZGF0YTogKi8KLQkJCQkvKgkJMHg4NjB+MHg4NmYgWzE2IGJ5dGVzXSAqLwotCXUzMiByZmludGZlOwkJLyogIG91dHB1dCBlbmFibGU6ICovCi0JCQkJLyoJCTB4ODYwfjB4ODZmIFsxNiBieXRlc10gKi8KLQl1MzIgcmYzd2lyZU9mZnNldDsJLyogIExTU0kgZGF0YTogKi8KLQkJCQkvKgkJMHg4NDB+MHg4NGYgWzE2IGJ5dGVzXSAqLwotCXUzMiByZkxTU0lfU2VsZWN0OwkvKiAgQkIgQmFuZCBTZWxlY3Q6ICovCi0JCQkJLyoJCTB4ODc4fjB4ODdmIFs4IGJ5dGVzXSAqLwotCXUzMiByZlR4R2FpblN0YWdlOwkvKiAgVHggZ2FpbiBzdGFnZTogKi8KLQkJCQkvKgkJMHg4MGN+MHg4MGYgWzQgYnl0ZXNdICovCi0JdTMyIHJmSFNTSVBhcmExOwkvKiAgd2lyZSBwYXJhbWV0ZXIgY29udHJvbDEgOiAqLwotCQkJCS8qCQkweDgyMH4weDgyMywgMHg4Mjh+MHg4MmIsIDB4ODMwfjB4ODMzLCAweDgzOH4weDgzYiBbMTYgYnl0ZXNdICovCi0JdTMyIHJmSFNTSVBhcmEyOwkvKiAgd2lyZSBwYXJhbWV0ZXIgY29udHJvbDIgOiAqLwotCQkJCS8qCQkweDgyNH4weDgyNywgMHg4MmN+MHg4MmYsIDB4ODM0fjB4ODM3LCAweDgzY34weDgzZiBbMTYgYnl0ZXNdICovCi0JdTMyIHJmU3dpdGNoQ29udHJvbDsgLyogVHggUnggYW50ZW5uYSBjb250cm9sIDogKi8KLQkJCQkvKgkJMHg4NTh+MHg4NWYgWzE2IGJ5dGVzXSAqLwotCXUzMiByZkFHQ0NvbnRyb2wxOwkvKiBBR0MgcGFyYW1ldGVyIGNvbnRyb2wxIDogKi8KLQkJCQkvKgkweGM1MH4weGM1MywgMHhjNTh+MHhjNWIsIDB4YzYwfjB4YzYzLCAweGM2OH4weGM2YiBbMTYgYnl0ZXNdICovCi0JdTMyIHJmQUdDQ29udHJvbDI7CS8qIEFHQyBwYXJhbWV0ZXIgY29udHJvbDIgOiAqLwotCQkJCS8qCQkweGM1NH4weGM1NywgMHhjNWN+MHhjNWYsIDB4YzY0fjB4YzY3LCAweGM2Y34weGM2ZiBbMTYgYnl0ZXNdICovCi0JdTMyIHJmUnhJUUltYmFsYW5jZTsgLyogT0ZETSBSeCBJUSBpbWJhbGFuY2UgbWF0cml4IDogKi8KLQkJCQkvKgkJMHhjMTR+MHhjMTcsIDB4YzFjfjB4YzFmLCAweGMyNH4weGMyNywgMHhjMmN+MHhjMmYgWzE2IGJ5dGVzXSAqLwotCXUzMiByZlJ4QUZFOwkJLyogUnggSVEgREMgb2ZzZXQgYW5kIFJ4IGRpZ2l0YWwgZmlsdGVyLCBSeCBEQyBub3RjaCBmaWx0ZXIgOiAqLwotCQkJCS8qCTB4YzEwfjB4YzEzLCAweGMxOH4weGMxYiwgMHhjMjB+MHhjMjMsIDB4YzI4fjB4YzJiIFsxNiBieXRlc10gKi8KLQl1MzIgcmZUeElRSW1iYWxhbmNlOyAvKiBPRkRNIFR4IElRIGltYmFsYW5jZSBtYXRyaXggKi8KLQkJCQkvKgkweGM4MH4weGM4MywgMHhjODh+MHhjOGIsIDB4YzkwfjB4YzkzLCAweGM5OH4weGM5YiBbMTYgYnl0ZXNdICovCi0JdTMyIHJmVHhBRkU7CQkvKiBUeCBJUSBEQyBPZmZzZXQgYW5kIFR4IERGSVIgdHlwZSAqLwotCQkJCS8qCTB4Yzg0fjB4Yzg3LCAweGM4Y34weGM4ZiwgMHhjOTR+MHhjOTcsIDB4YzljfjB4YzlmIFsxNiBieXRlc10gKi8KLQl1MzIgcmZMU1NJUmVhZEJhY2s7CS8qIExTU0kgUkYgcmVhZGJhY2sgZGF0YSBTSSBtb2RlICovCi0JCQkJLyoJMHg4YTB+MHg4YWYgWzE2IGJ5dGVzXSAqLwotCXUzMiByZkxTU0lSZWFkQmFja1BpOwkvKiBMU1NJIFJGIHJlYWRiYWNrIGRhdGEgUEkgbW9kZSAweDhiOC04YmMgZm9yIFBhdGggQSBhbmQgQiAqLwotfTsKLQotc3RydWN0IHJfYW50ZW5uYV9zZWxfb2ZkbSB7Ci0JdTMyCQkJcl90eF9hbnRlbm5hOjQ7Ci0JdTMyCQkJcl9hbnRfbDo0OwotCXUzMgkJCXJfYW50X25vbl9odDo0OwotCXUzMgkJCXJfYW50X2h0MTo0OwotCXUzMgkJCXJfYW50X2h0Mjo0OwotCXUzMgkJCXJfYW50X2h0X3MxOjQ7Ci0JdTMyCQkJcl9hbnRfbm9uX2h0X3MxOjQ7Ci0JdTMyCQkJT0ZETV9UWFNDOjI7Ci0JdTMyCQkJUmVzZXJ2ZWQ6MjsKLX07Ci0KLXN0cnVjdCByX2FudGVubmFfc2VsX2NjayB7Ci0JdTgJCQlyX2Nja3J4X2VuYWJsZV8yOjI7Ci0JdTgJCQlyX2Nja3J4X2VuYWJsZToyOwotCXU4CQkJcl9jY2t0eF9lbmFibGU6NDsKLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIHN0cnVjdHVyZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgTWFjcm8gRGVmaW5pdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBNYWNybyBEZWZpbml0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0ZWQgRnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAqLwotLyogIEJCIGFuZCBSRiByZWdpc3RlciByZWFkL3dyaXRlICovCi0vKiAgKi8KLXUzMglQSFlfUXVlcnlCQlJlZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHUzMiBSZWdBZGRyLAotCQkgICAgICAgdTMyIEJpdE1hc2spOwotdm9pZAlQSFlfU2V0QkJSZWcoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1MzIgUmVnQWRkciwKLQkJICAgICB1MzIgQml0TWFzaywgdTMyIERhdGEpOwotdTMyCVBIWV9RdWVyeVJGUmVnKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJICAgICAgIGVudW0gUkZfUkFESU9fUEFUSAllUkZQYXRoLCB1MzIgUmVnQWRkciwKLQkJICAgICAgIHUzMiBCaXRNYXNrKTsKLXZvaWQJUEhZX1NldFJGUmVnKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJICAgICBlbnVtIFJGX1JBRElPX1BBVEggZVJGUGF0aCwgdTMyIFJlZ0FkZHIsCi0JCSAgICAgdTMyIEJpdE1hc2ssICB1MzIJRGF0YSk7Ci0KLS8qICAqLwotLyogIEJCIFRYIFBvd2VyIFIvVyAqLwotLyogICovCi12b2lkIFBIWV9TZXRUeFBvd2VyTGV2ZWw4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4IGNoYW5uZWwpOwotCi0vKiAgKi8KLS8qICBTd2l0Y2ggYmFuZHdpZHRoIGZvciA4NzIzQSAqLwotLyogICovCi12b2lkCVBIWV9TZXRCV01vZGUyM2E4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLAotCQkJICAgZW51bSBodF9jaGFubmVsX3dpZHRoIENobmxXaWR0aCwKLQkJCSAgIHVuc2lnbmVkIGNoYXIgT2Zmc2V0KTsKLQotLyogICovCi0vKiAgY2hhbm5lbCBzd2l0Y2ggcmVsYXRlZCBmdW5jaXRvbiAqLwotLyogICovCi12b2lkCVBIWV9Td0Nobmw4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBjaGFubmVsKTsKLQkJCQkvKiAgQ2FsbCBhZnRlciBpbml0aWFsaXphdGlvbiAqLwotdm9pZCBDaGtGd0NtZElvRG9uZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpOwotCi0vKiAgKi8KLS8qICBNb2RpZnkgdGhlIHZhbHVlIG9mIHRoZSBodyByZWdpc3RlciB3aGVuIGJlYWNvbiBpbnRlcnZhbCBiZSBjaGFuZ2VkLiAqLwotLyogICovCi12b2lkCi1ydGw4MTkyY19QSFlfU2V0QmVhY29uSHdSZWcoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1MTYgQmVhY29uSW50ZXJ2YWwpOwotCi0KLXZvaWQgUEhZX1N3aXRjaEVwaHlQYXJhbWV0ZXIoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKTsKLQotdm9pZCBQSFlfRW5hYmxlSG9zdENsa1JlcShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpOwotCi1ib29sCi1TZXRBbnRlbm5hQ29uZmlnOTJDKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTggRGVmYXVsdEFudCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnRlZCBGdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIFBIWV9TZXRNYWNSZWcJUEhZX1NldEJCUmVnCi0KLS8qIE1BQy9CQi9SRiBIQUwgY29uZmlnICovCi1pbnQgUEhZX0JCQ29uZmlnODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKTsKLXMzMiBQSFlfTUFDQ29uZmlnODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbDg3MjNBUGh5UmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsODcyM0FQaHlSZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU5OTI4Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsODcyM0FQaHlSZWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX0lOQ19IQUw4NzIzQVBIWVJFR19IX18KLSNkZWZpbmUgX19JTkNfSEFMODcyM0FQSFlSRUdfSF9fCi0KLS8qICAxLiBQTUFDIGR1cGxpY2F0ZSByZWdpc3RlciBkdWUgdG8gY29ubmVjdGlvbjogUkZfTW9kZSwgVFJ4Uk4sIE51bU9mIEwtU1RGICovCi0vKiAgMS4gUGFnZTEoMHgxMDApICovCi0jZGVmaW5lIHJQTUFDX1Jlc2V0CQkJCTB4MTAwCi0jZGVmaW5lIHJQTUFDX1R4U3RhcnQJCQkJMHgxMDQKLSNkZWZpbmUgclBNQUNfVHhMZWdhY3lTSUcJCQkweDEwOAotI2RlZmluZSByUE1BQ19UeEhUU0lHMQkJCQkweDEwYwotI2RlZmluZSByUE1BQ19UeEhUU0lHMgkJCQkweDExMAotI2RlZmluZSByUE1BQ19QSFlEZWJ1ZwkJCQkweDExNAotI2RlZmluZSByUE1BQ19UeFBhY2tldE51bQkJCTB4MTE4Ci0jZGVmaW5lIHJQTUFDX1R4SWRsZQkJCQkweDExYwotI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjAJCQkweDEyMAotI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjEJCQkweDEyNAotI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjIJCQkweDEyOAotI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjMJCQkweDEyYwotI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjQJCQkweDEzMAotI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjUJCQkweDEzNAotI2RlZmluZSByUE1BQ19UeERhdGFUeXBlCQkJMHgxMzgKLSNkZWZpbmUgclBNQUNfVHhSYW5kb21TZWVkCQkJMHgxM2MKLSNkZWZpbmUgclBNQUNfQ0NLUExDUFByZWFtYmxlCQkJMHgxNDAKLSNkZWZpbmUgclBNQUNfQ0NLUExDUEhlYWRlcgkJCTB4MTQ0Ci0jZGVmaW5lIHJQTUFDX0NDS0NSQzE2CQkJCTB4MTQ4Ci0jZGVmaW5lIHJQTUFDX09GRE1SeENSQzMyT0sJCQkweDE3MAotI2RlZmluZSByUE1BQ19PRkRNUnhDUkMzMkVyCQkJMHgxNzQKLSNkZWZpbmUgclBNQUNfT0ZETVJ4UGFyaXR5RXIJCQkweDE3OAotI2RlZmluZSByUE1BQ19PRkRNUnhDUkM4RXIJCQkweDE3YwotI2RlZmluZSByUE1BQ19DQ0tDUnhSQzE2RXIJCQkweDE4MAotI2RlZmluZSByUE1BQ19DQ0tDUnhSQzMyRXIJCQkweDE4NAotI2RlZmluZSByUE1BQ19DQ0tDUnhSQzMyT0sJCQkweDE4OAotI2RlZmluZSByUE1BQ19UeFN0YXR1cwkJCQkweDE4YwotCi0vKiAgMi4gUGFnZTIoMHgyMDApICovCi0vKiAgVGhlIGZvbGxvd2luZyB0d28gZGVmaW5pdGlvbiBhcmUgb25seSB1c2VkIGZvciBVU0IgaW50ZXJmYWNlLiAqLwotI2RlZmluZSBSRl9CQl9DTURfQUREUgkJMHgwMmMwCS8qICBSRi9CQiByZWFkL3dyaXRlIGNvbW1hbmQgYWRkcmVzcy4gKi8KLSNkZWZpbmUgUkZfQkJfQ01EX0RBVEEJCTB4MDJjNAkvKiAgUkYvQkIgcmVhZC93cml0ZSBjb21tYW5kIGRhdGEuICovCi0KLS8qICAzLiBQYWdlOCgweDgwMCkgKi8KLSNkZWZpbmUgckZQR0EwX1JGTU9ECQkweDgwMAkvKiBSRiBtb2RlICYgQ0NLIFR4U0MgIFJGIEJXIFNldHRpbmc/PyAqLwotCi0jZGVmaW5lIHJGUEdBMF9UeEluZm8JCTB4ODA0CS8qICBTdGF0dXMgcmVwb3J0Pz8gKi8KLSNkZWZpbmUgckZQR0EwX1BTREZ1bmN0aW9uCTB4ODA4Ci0KLSNkZWZpbmUgckZQR0EwX1R4R2FpblN0YWdlCTB4ODBjCS8qICBTZXQgVFggUFdSIGluaXQgZ2Fpbj8gKi8KLQotI2RlZmluZSByRlBHQTBfUkZUaW1pbmcxCTB4ODEwCS8qICBVc2VsZXNzIG5vdyAqLwotI2RlZmluZSByRlBHQTBfUkZUaW1pbmcyCTB4ODE0Ci0KLSNkZWZpbmUgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIxCTB4ODIwCS8qICBSRiAzIHdpcmUgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyCTB4ODI0Ci0jZGVmaW5lIHJGUEdBMF9YQl9IU1NJUGFyYW1ldGVyMQkweDgyOAotI2RlZmluZSByRlBHQTBfWEJfSFNTSVBhcmFtZXRlcjIJMHg4MmMKLSNkZWZpbmUgclR4QUdDX0JfUmF0ZTE4XzA2CQkweDgzMAotI2RlZmluZSByVHhBR0NfQl9SYXRlNTRfMjQJCTB4ODM0Ci0jZGVmaW5lIHJUeEFHQ19CX0NDSzFfNTVfTWNzMzIJCTB4ODM4Ci0jZGVmaW5lIHJUeEFHQ19CX01jczAzX01jczAwCQkweDgzYwotCi0jZGVmaW5lIHJUeEFHQ19CX01jczA3X01jczA0CQkweDg0OAotI2RlZmluZSByVHhBR0NfQl9NY3MxMV9NY3MwOAkJMHg4NGMKLQotI2RlZmluZSByRlBHQTBfWEFfTFNTSVBhcmFtZXRlcgkJMHg4NDAKLSNkZWZpbmUgckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXIJCTB4ODQ0Ci0KLSNkZWZpbmUgckZQR0EwX1JGV2FrZVVwUGFyYW1ldGVyCTB4ODUwCS8qICBVc2VsZXNzIG5vdyAqLwotI2RlZmluZSByRlBHQTBfUkZTbGVlcFVwUGFyYW1ldGVyCTB4ODU0Ci0KLSNkZWZpbmUgckZQR0EwX1hBQl9Td2l0Y2hDb250cm9sCTB4ODU4CS8qICBSRiBDaGFubmVsIHN3aXRjaCAqLwotI2RlZmluZSByRlBHQTBfWENEX1N3aXRjaENvbnRyb2wJMHg4NWMKLQotI2RlZmluZSByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRQkJMHg4NjAJLyogIFJGIENoYW5uZWwgc3dpdGNoICovCi0jZGVmaW5lIHJGUEdBMF9YQl9SRkludGVyZmFjZU9FCQkweDg2NAotCi0jZGVmaW5lIHJUeEFHQ19CX01jczE1X01jczEyCQkweDg2OAotI2RlZmluZSByVHhBR0NfQl9DQ0sxMV9BX0NDSzJfMTEJMHg4NmMKLQotI2RlZmluZSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1cJMHg4NzAJLyogIFJGIEludGVyZmFjZSBTb2Z0d2FyZSBDb250cm9sICovCi0jZGVmaW5lIHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VTVwkweDg3NAotCi0jZGVmaW5lIHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXIJCTB4ODc4CS8qICBSRiBQYXJhbWV0ZXIgKi8KLSNkZWZpbmUgckZQR0EwX1hDRF9SRlBhcmFtZXRlcgkJMHg4N2MKLQotI2RlZmluZSByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMQkJMHg4ODAJLyogIENyeXN0YWwgY2FwIHNldHRpbmcgUkYtUi9XIHByb3RlY3Rpb24gZm9yIHBhcmFtZXRlcjQ/PyAqLwotI2RlZmluZSByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMgkJMHg4ODQKLSNkZWZpbmUgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjMJCTB4ODg4CS8qICBVc2VsZXNzIG5vdyAqLwotI2RlZmluZSByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNAkJMHg4OGMKLQotI2RlZmluZSByRlBHQTBfWEFfTFNTSVJlYWRCYWNrCQkweDhhMAkvKiAgVHJhbmNlaXZlciBMU1NJIFJlYWRiYWNrICovCi0jZGVmaW5lIHJGUEdBMF9YQl9MU1NJUmVhZEJhY2sJCTB4OGE0Ci0jZGVmaW5lIHJGUEdBMF9YQ19MU1NJUmVhZEJhY2sJCTB4OGE4Ci0jZGVmaW5lIHJGUEdBMF9YRF9MU1NJUmVhZEJhY2sJCTB4OGFjCi0KLSNkZWZpbmUgckZQR0EwX1BTRFJlcG9ydAkJMHg4YjQJLyogIFVzZWxlc3Mgbm93ICovCi0jZGVmaW5lIFRyYW5zY2VpdmVyQV9IU1BJX1JlYWRiYWNrCTB4OGI4CS8qICBUcmFuc2NlaXZlciBBIEhTUEkgUmVhZGJhY2sgKi8KLSNkZWZpbmUgVHJhbnNjZWl2ZXJCX0hTUElfUmVhZGJhY2sJMHg4YmMJLyogIFRyYW5zY2VpdmVyIEIgSFNQSSBSZWFkYmFjayAqLwotI2RlZmluZSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlUkIJMHg4ZTAJLyogIFVzZWxlc3Mgbm93IFJGIEludGVyZmFjZSBSZWFkYmFjayBWYWx1ZSAqLwotI2RlZmluZSByRlBHQTBfWENEX1JGSW50ZXJmYWNlUkIJMHg4ZTQJLyogIFVzZWxlc3Mgbm93ICovCi0KLS8qICA0LiBQYWdlOSgweDkwMCkgKi8KLSNkZWZpbmUgckZQR0ExX1JGTU9ECQkJMHg5MDAJLyogUkYgbW9kZSAmIE9GRE0gVHhTQyBSRiBCVyBTZXR0aW5nPz8gKi8KLQotI2RlZmluZSByRlBHQTFfVHhCbG9jawkJCTB4OTA0CS8qICBVc2VsZXNzIG5vdyAqLwotI2RlZmluZSByRlBHQTFfRGVidWdTZWxlY3QJCTB4OTA4CS8qICBVc2VsZXNzIG5vdyAqLwotI2RlZmluZSByRlBHQTFfVHhJbmZvCQkJMHg5MGMJLyogIFVzZWxlc3Mgbm93IFN0YXR1cyByZXBvcnQ/PyAqLwotCi0vKiAgNS4gUGFnZUEoMHhBMDApICovCi0vKiAgU2V0IENvbnRyb2wgY2hhbm5lbCB0byB1cHBlciBvciBsb3dlci4gVGhlc2Ugc2V0dGluZ3MgYXJlIHJlcXVpcmVkIG9ubHkgZm9yIDQwTUh6ICovCi0jZGVmaW5lIHJDQ0swX1N5c3RlbQkJCTB4YTAwCi0KLSNkZWZpbmUgckNDSzBfQUZFU2V0dGluZwkJMHhhMDQJLyogIERpc2FibGUgaW5pdCBnYWluIG5vdyBTZWxlY3QgUlggcGF0aCBieSBSU1NJICovCi0jZGVmaW5lIHJDQ0swX0NDQQkJCTB4YTA4CS8qICBEaXNhYmxlIGluaXQgZ2FpbiBub3cgSW5pdCBnYWluICovCi0KLSNkZWZpbmUgckNDSzBfUnhBR0MxCQkJMHhhMGMJLyogQUdDIGRlZmF1bHQgdmFsdWUsIHNhdHVyYXRpb24gbGV2ZWwgQW50ZW5uYSBEaXZlcnNpdHksIFJYIEFHQywgTE5BIFRocmVzaG9sZCwgUlggTE5BIFRocmVzaG9sZCB1c2VsZXNzIG5vdy4gTm90IHRoZSBzYW1lIGFzIDkwIHNlcmllcyAqLwotI2RlZmluZSByQ0NLMF9SeEFHQzIJCQkweGExMAkvKiBBR0MgJiBEQUdDICovCi0KLSNkZWZpbmUgckNDSzBfUnhIUAkJCTB4YTE0Ci0KLSNkZWZpbmUgckNDSzBfRFNQUGFyYW1ldGVyMQkJMHhhMTgJLyogVGltaW5nIHJlY292ZXJ5ICYgQ2hhbm5lbCBlc3RpbWF0aW9uIHRocmVzaG9sZCAqLwotI2RlZmluZSByQ0NLMF9EU1BQYXJhbWV0ZXIyCQkweGExYwkvKiBTUSB0aHJlc2hvbGQgKi8KLQotI2RlZmluZSByQ0NLMF9UeEZpbHRlcjEJCQkweGEyMAotI2RlZmluZSByQ0NLMF9UeEZpbHRlcjIJCQkweGEyNAotI2RlZmluZSByQ0NLMF9EZWJ1Z1BvcnQJCQkweGEyOAkvKiBkZWJ1ZyBwb3J0IGFuZCBUeCBmaWx0ZXIzICovCi0jZGVmaW5lIHJDQ0swX0ZhbHNlQWxhcm1SZXBvcnQJCTB4YTJjCS8qIDB4YTJkCXVzZWxlc3Mgbm93IDB4YTMwLWE0ZiBjaGFubmVsIHJlcG9ydCAqLwotI2RlZmluZSByQ0NLMF9UUlNTSVJlcG9ydAkJMHhhNTAKLSNkZWZpbmUgckNDSzBfUnhSZXBvcnQJCQkweGE1NCAgLyogMHhhNTcgKi8KLSNkZWZpbmUgckNDSzBfRkFDb3VudGVyTG93ZXIJCTB4YTVjICAvKiAweGE1YiAqLwotI2RlZmluZSByQ0NLMF9GQUNvdW50ZXJVcHBlcgkJMHhhNTggIC8qIDB4YTVjICovCi0vKiAgUGFnZUIoMHhCMDApICovCi0jZGVmaW5lIHJQZHBfQW50QQkJCTB4YjAwCi0jZGVmaW5lIHJQZHBfQW50QV80CQkJMHhiMDQKLSNkZWZpbmUgckNvbmZpZ19QbXBkX0FudEEJCTB4YjI4Ci0jZGVmaW5lIHJDb25maWdfQW50QQkJCTB4YjY4Ci0jZGVmaW5lIHJDb25maWdfQW50QgkJCTB4YjZjCi0jZGVmaW5lIHJQZHBfQW50QgkJCTB4YjcwCi0jZGVmaW5lIHJQZHBfQW50Ql80CQkJMHhiNzQKLSNkZWZpbmUgckNvbmZpZ19QbXBkX0FudEIJCTB4Yjk4Ci0jZGVmaW5lIHJBUEsJCQkJMHhiZDgKLQotLyogIDYuIFBhZ2VDKDB4QzAwKSAqLwotI2RlZmluZSByT0ZETTBfTFNURgkJCTB4YzAwCi0KLSNkZWZpbmUgck9GRE0wX1RSeFBhdGhFbmFibGUJCTB4YzA0Ci0jZGVmaW5lIHJPRkRNMF9UUk11eFBhcgkJCTB4YzA4Ci0jZGVmaW5lIHJPRkRNMF9UUlNXSXNvbGF0aW9uCQkweGMwYwotCi0jZGVmaW5lIHJPRkRNMF9YQVJ4QUZFCQkJMHhjMTAgIC8qIFJ4SVEgREMgb2Zmc2V0LCBSeCBkaWdpdGFsIGZpbHRlciwgREMgbm90Y2ggZmlsdGVyICovCi0jZGVmaW5lIHJPRkRNMF9YQVJ4SVFJbWJhbGFuY2UJCTB4YzE0ICAvKiBSeElRIGltYmxhbmNlIG1hdHJpeCAqLwotI2RlZmluZSByT0ZETTBfWEJSeEFGRQkJCTB4YzE4Ci0jZGVmaW5lIHJPRkRNMF9YQlJ4SVFJbWJhbGFuY2UJCTB4YzFjCi0jZGVmaW5lIHJPRkRNMF9YQ1J4QUZFCQkJMHhjMjAKLSNkZWZpbmUgck9GRE0wX1hDUnhJUUltYmFsYW5jZQkJMHhjMjQKLSNkZWZpbmUgck9GRE0wX1hEUnhBRkUJCQkweGMyOAotI2RlZmluZSByT0ZETTBfWERSeElRSW1iYWxhbmNlCQkweGMyYwotCi0jZGVmaW5lIHJPRkRNMF9SeERldGVjdG9yMQkJMHhjMzAgIC8qIFBELEJXICYgU0JECURNIHR1bmUgaW5pdCBnYWluICovCi0jZGVmaW5lIHJPRkRNMF9SeERldGVjdG9yMgkJMHhjMzQgIC8qIFNCRCAmIEZhbWUgU3luYy4gKi8KLSNkZWZpbmUgck9GRE0wX1J4RGV0ZWN0b3IzCQkweGMzOCAgLyogRnJhbWUgU3luYy4gKi8KLSNkZWZpbmUgck9GRE0wX1J4RGV0ZWN0b3I0CQkweGMzYyAgLyogUEQsIFNCRCwgRnJhbWUgU3luYyAmIFNob3J0LUdJICovCi0KLSNkZWZpbmUgck9GRE0wX1J4RFNQCQkJMHhjNDAgIC8qIFJ4IFN5bmMgUGF0aCAqLwotI2RlZmluZSByT0ZETTBfQ0ZPYW5kREFHQwkJMHhjNDQgIC8qIENGTyAmIERBR0MgKi8KLSNkZWZpbmUgck9GRE0wX0NDQURyb3BUaHJlc2hvbGQJMHhjNDggLyogQ0NBIERyb3AgdGhyZXNob2xkICovCi0jZGVmaW5lIHJPRkRNMF9FQ0NBVGhyZXNob2xkCQkweGM0YyAvKiAgZW5lcmd5IENDQSAqLwotCi0jZGVmaW5lIHJPRkRNMF9YQUFHQ0NvcmUxCQkweGM1MAkvKiAgRElHICovCi0jZGVmaW5lIHJPRkRNMF9YQUFHQ0NvcmUyCQkweGM1NAotI2RlZmluZSByT0ZETTBfWEJBR0NDb3JlMQkJMHhjNTgKLSNkZWZpbmUgck9GRE0wX1hCQUdDQ29yZTIJCTB4YzVjCi0jZGVmaW5lIHJPRkRNMF9YQ0FHQ0NvcmUxCQkweGM2MAotI2RlZmluZSByT0ZETTBfWENBR0NDb3JlMgkJMHhjNjQKLSNkZWZpbmUgck9GRE0wX1hEQUdDQ29yZTEJCTB4YzY4Ci0jZGVmaW5lIHJPRkRNMF9YREFHQ0NvcmUyCQkweGM2YwotCi0jZGVmaW5lIHJPRkRNMF9BR0NQYXJhbWV0ZXIxCQkweGM3MAotI2RlZmluZSByT0ZETTBfQUdDUGFyYW1ldGVyMgkJMHhjNzQKLSNkZWZpbmUgck9GRE0wX0FHQ1JTU0lUYWJsZQkJMHhjNzgKLSNkZWZpbmUgck9GRE0wX0hUU1RGQUdDCQkJMHhjN2MKLQotI2RlZmluZSByT0ZETTBfWEFUeElRSW1iYWxhbmNlCQkweGM4MAkvKiAgVFggUFdSIFRSQUNLIGFuZCBESUcgKi8KLSNkZWZpbmUgck9GRE0wX1hBVHhBRkUJCQkweGM4NAotI2RlZmluZSByT0ZETTBfWEJUeElRSW1iYWxhbmNlCQkweGM4OAotI2RlZmluZSByT0ZETTBfWEJUeEFGRQkJCTB4YzhjCi0jZGVmaW5lIHJPRkRNMF9YQ1R4SVFJbWJhbGFuY2UJCTB4YzkwCi0jZGVmaW5lIHJPRkRNMF9YQ1R4QUZFCQkJMHhjOTQKLSNkZWZpbmUgck9GRE0wX1hEVHhJUUltYmFsYW5jZQkJMHhjOTgKLSNkZWZpbmUgck9GRE0wX1hEVHhBRkUJCQkweGM5YwotCi0jZGVmaW5lIHJPRkRNMF9SeElRRXh0QW50YQkJMHhjYTAKLSNkZWZpbmUgck9GRE0wX1R4Q29lZmYxCQkJMHhjYTQKLSNkZWZpbmUgck9GRE0wX1R4Q29lZmYyCQkJMHhjYTgKLSNkZWZpbmUgck9GRE0wX1R4Q29lZmYzCQkJMHhjYWMKLSNkZWZpbmUgck9GRE0wX1R4Q29lZmY0CQkJMHhjYjAKLSNkZWZpbmUgck9GRE0wX1R4Q29lZmY1CQkJMHhjYjQKLSNkZWZpbmUgck9GRE0wX1R4Q29lZmY2CQkJMHhjYjgKLSNkZWZpbmUgck9GRE0wX1J4SFBQYXJhbWV0ZXIJCTB4Y2UwCi0jZGVmaW5lIHJPRkRNMF9UeFBzZXVkb05vaXNlV2d0CQkweGNlNAotI2RlZmluZSByT0ZETTBfRnJhbWVTeW5jCQkweGNmMAotI2RlZmluZSByT0ZETTBfREZTUmVwb3J0CQkweGNmNAotCi0vKiAgNy4gUGFnZUQoMHhEMDApICovCi0jZGVmaW5lIHJPRkRNMV9MU1RGCQkJMHhkMDAKLSNkZWZpbmUgck9GRE0xX1RSeFBhdGhFbmFibGUJCTB4ZDA0Ci0KLSNkZWZpbmUgck9GRE0xX0NGTwkJCTB4ZDA4CS8qICBObyBzZXR0aW5nIG5vdyAqLwotI2RlZmluZSByT0ZETTFfQ1NJMQkJCTB4ZDEwCi0jZGVmaW5lIHJPRkRNMV9TQkQJCQkweGQxNAotI2RlZmluZSByT0ZETTFfQ1NJMgkJCTB4ZDE4Ci0jZGVmaW5lIHJPRkRNMV9DRk9UcmFja2luZwkJMHhkMmMKLSNkZWZpbmUgck9GRE0xX1RSeE1lc2F1cmUxCQkweGQzNAotI2RlZmluZSByT0ZETTFfSW50ZkRldAkJCTB4ZDNjCi0jZGVmaW5lIHJPRkRNMV9Qc2V1ZG9Ob2lzZVN0YXRlQUIJMHhkNTAKLSNkZWZpbmUgck9GRE0xX1BzZXVkb05vaXNlU3RhdGVDRAkweGQ1NAotI2RlZmluZSByT0ZETTFfUnhQc2V1ZG9Ob2lzZVdndAkJMHhkNTgKLQotI2RlZmluZSByT0ZETV9QSFlDb3VudGVyMQkJMHhkYTAgIC8qIGNjYSwgcGFyaXR5IGZhaWwgKi8KLSNkZWZpbmUgck9GRE1fUEhZQ291bnRlcjIJCTB4ZGE0ICAvKiByYXRlIGlsbGVnYWwsIGNyYzggZmFpbCAqLwotI2RlZmluZSByT0ZETV9QSFlDb3VudGVyMwkJMHhkYTggIC8qIE1DUyBub3Qgc3VwcG9ydCAqLwotCi0jZGVmaW5lIHJPRkRNX1Nob3J0Q0ZPQUIJCTB4ZGFjCS8qICBObyBzZXR0aW5nIG5vdyAqLwotI2RlZmluZSByT0ZETV9TaG9ydENGT0NECQkweGRiMAotI2RlZmluZSByT0ZETV9Mb25nQ0ZPQUIJCQkweGRiNAotI2RlZmluZSByT0ZETV9Mb25nQ0ZPQ0QJCQkweGRiOAotI2RlZmluZSByT0ZETV9UYWlsQ0ZPQUIJCQkweGRiYwotI2RlZmluZSByT0ZETV9UYWlsQ0ZPQ0QJCQkweGRjMAotI2RlZmluZSByT0ZETV9QV01lYXN1cmUxCQkweGRjNAotI2RlZmluZSByT0ZETV9QV01lYXN1cmUyCQkweGRjOAotI2RlZmluZSByT0ZETV9CV1JlcG9ydAkJCTB4ZGNjCi0jZGVmaW5lIHJPRkRNX0FHQ1JlcG9ydAkJCTB4ZGQwCi0jZGVmaW5lIHJPRkRNX1J4U05SCQkJMHhkZDQKLSNkZWZpbmUgck9GRE1fUnhFVk1DU0kJCQkweGRkOAotI2RlZmluZSByT0ZETV9TSUdSZXBvcnQJCQkweGRkYwotCi0KLS8qICA4LiBQYWdlRSgweEUwMCkgKi8KLSNkZWZpbmUgclR4QUdDX0FfUmF0ZTE4XzA2CQkweGUwMAotI2RlZmluZSByVHhBR0NfQV9SYXRlNTRfMjQJCTB4ZTA0Ci0jZGVmaW5lIHJUeEFHQ19BX0NDSzFfTWNzMzIJCTB4ZTA4Ci0jZGVmaW5lIHJUeEFHQ19BX01jczAzX01jczAwCQkweGUxMAotI2RlZmluZSByVHhBR0NfQV9NY3MwN19NY3MwNAkJMHhlMTQKLSNkZWZpbmUgclR4QUdDX0FfTWNzMTFfTWNzMDgJCTB4ZTE4Ci0jZGVmaW5lIHJUeEFHQ19BX01jczE1X01jczEyCQkweGUxYwotCi0jZGVmaW5lIHJGUEdBMF9JUUsJCQkweGUyOAotI2RlZmluZSByVHhfSVFLX1RvbmVfQQkJCTB4ZTMwCi0jZGVmaW5lIHJSeF9JUUtfVG9uZV9BCQkJMHhlMzQKLSNkZWZpbmUgclR4X0lRS19QSV9BCQkJMHhlMzgKLSNkZWZpbmUgclJ4X0lRS19QSV9BCQkJMHhlM2MKLQotI2RlZmluZSByVHhfSVFLCQkJCTB4ZTQwCi0jZGVmaW5lIHJSeF9JUUsJCQkJMHhlNDQKLSNkZWZpbmUgcklRS19BR0NfUHRzCQkJMHhlNDgKLSNkZWZpbmUgcklRS19BR0NfUnNwCQkJMHhlNGMKLSNkZWZpbmUgclR4X0lRS19Ub25lX0IJCQkweGU1MAotI2RlZmluZSByUnhfSVFLX1RvbmVfQgkJCTB4ZTU0Ci0jZGVmaW5lIHJUeF9JUUtfUElfQgkJCTB4ZTU4Ci0jZGVmaW5lIHJSeF9JUUtfUElfQgkJCTB4ZTVjCi0jZGVmaW5lIHJJUUtfQUdDX0NvbnQJCQkweGU2MAotCi0jZGVmaW5lIHJCbHVlX1Rvb3RoCQkJMHhlNmMKLSNkZWZpbmUgclJ4X1dhaXRfQ0NBCQkJMHhlNzAKLSNkZWZpbmUgclR4X0NDS19SRk9OCQkJMHhlNzQKLSNkZWZpbmUgclR4X0NDS19CQk9OCQkJMHhlNzgKLSNkZWZpbmUgclR4X09GRE1fUkZPTgkJCTB4ZTdjCi0jZGVmaW5lIHJUeF9PRkRNX0JCT04JCQkweGU4MAotI2RlZmluZSByVHhfVG9fUngJCQkweGU4NAotI2RlZmluZSByVHhfVG9fVHgJCQkweGU4OAotI2RlZmluZSByUnhfQ0NLCQkJCTB4ZThjCi0KLSNkZWZpbmUgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQQkJMHhlOTQKLSNkZWZpbmUgclR4X1Bvd2VyX0FmdGVyX0lRS19BCQkweGU5YwotCi0jZGVmaW5lIHJSeF9Qb3dlcl9CZWZvcmVfSVFLX0EJCTB4ZWEwCi0jZGVmaW5lIHJSeF9Qb3dlcl9CZWZvcmVfSVFLX0FfMgkweGVhNAotI2RlZmluZSByUnhfUG93ZXJfQWZ0ZXJfSVFLX0EJCTB4ZWE4Ci0jZGVmaW5lIHJSeF9Qb3dlcl9BZnRlcl9JUUtfQV8yCQkweGVhYwotCi0jZGVmaW5lIHJUeF9Qb3dlcl9CZWZvcmVfSVFLX0IJCTB4ZWI0Ci0jZGVmaW5lIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQgkJMHhlYmMKLQotI2RlZmluZSByUnhfUG93ZXJfQmVmb3JlX0lRS19CCQkweGVjMAotI2RlZmluZSByUnhfUG93ZXJfQmVmb3JlX0lRS19CXzIJMHhlYzQKLSNkZWZpbmUgclJ4X1Bvd2VyX0FmdGVyX0lRS19CCQkweGVjOAotI2RlZmluZSByUnhfUG93ZXJfQWZ0ZXJfSVFLX0JfMgkJMHhlY2MKLQotI2RlZmluZSByUnhfT0ZETQkJCTB4ZWQwCi0jZGVmaW5lIHJSeF9XYWl0X1JJRlMJCQkweGVkNAotI2RlZmluZSByUnhfVE9fUngJCQkweGVkOAotI2RlZmluZSByU3RhbmRieQkJCTB4ZWRjCi0jZGVmaW5lIHJTbGVlcAkJCQkweGVlMAotI2RlZmluZSByUE1QRF9BTkFFTgkJCTB4ZWVjCi0KLS8qICA3LiBSRiBSZWdpc3RlciAweDAwLTB4MkUgKFJGIDgyNTYpICovCi0vKiAgICAgUkYtMDIyMkQgMHgwMC0zRiAqLwotLyogWmVicmExICovCi0jZGVmaW5lIHJaZWJyYTFfSFNTSUVuYWJsZQkJMHgwCS8qICBVc2VsZXNzIG5vdyAqLwotI2RlZmluZSByWmVicmExX1RSeEVuYWJsZTEJCTB4MQotI2RlZmluZSByWmVicmExX1RSeEVuYWJsZTIJCTB4MgotI2RlZmluZSByWmVicmExX0FHQwkJCTB4NAotI2RlZmluZSByWmVicmExX0NoYXJnZVB1bXAJCTB4NQotI2RlZmluZSByWmVicmExX0NoYW5uZWwJCQkweDcJLyogIFJGIGNoYW5uZWwgc3dpdGNoICovCi0KLSNkZWZpbmUgclplYnJhMV9UeEdhaW4JCQkweDgJLyogIFVzZWxlc3Mgbm93ICovCi0jZGVmaW5lIHJaZWJyYTFfVHhMUEYJCQkweDkKLSNkZWZpbmUgclplYnJhMV9SeExQRgkJCTB4YgotI2RlZmluZSByWmVicmExX1J4SFBGQ29ybmVyCQkweGMKLQotLyogWmVicmE0ICovCi0jZGVmaW5lIHJHbG9iYWxDdHJsCQkJMAkvKiAgVXNlbGVzcyBub3cgKi8KLSNkZWZpbmUgclJUTDgyNTZfVHhMUEYJCQkxOQotI2RlZmluZSByUlRMODI1Nl9SeExQRgkJCTExCi0KLS8qIFJUTDgyNTggKi8KLSNkZWZpbmUgclJUTDgyNThfVHhMUEYJCQkweDExCS8qICBVc2VsZXNzIG5vdyAqLwotI2RlZmluZSByUlRMODI1OF9SeExQRgkJCTB4MTMKLSNkZWZpbmUgclJUTDgyNThfUlNTSUxQRgkJMHhhCi0KLS8qICBSTDYwNTIgUmVnaXN0ZXIgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBSRl9BQwkJCQkweDAwCi0jZGVmaW5lIFJGX0lRQURKX0cxCQkJMHgwMQotI2RlZmluZSBSRl9JUUFESl9HMgkJCTB4MDIKLSNkZWZpbmUgUkZfQlNfUEFfQVBTRVRfRzFfRzQJCTB4MDMKLSNkZWZpbmUgUkZfQlNfUEFfQVBTRVRfRzVfRzgJCTB4MDQKLSNkZWZpbmUgUkZfUE9XX1RSU1cJCQkweDA1Ci0jZGVmaW5lIFJGX0dBSU5fUlgJCQkweDA2Ci0jZGVmaW5lIFJGX0dBSU5fVFgJCQkweDA3Ci0jZGVmaW5lIFJGX1RYTV9JREFDCQkJMHgwOAotI2RlZmluZSBSRl9JUEFfRwkJCTB4MDkKLSNkZWZpbmUgUkZfVFhCSUFTX0cJCQkweDBBCi0jZGVmaW5lIFJGX1RYUEFfQUcJCQkweDBCCi0jZGVmaW5lIFJGX0lQQV9BCQkJMHgwQwotI2RlZmluZSBSRl9UWEJJQVNfQQkJCTB4MEQKLSNkZWZpbmUgUkZfQlNfUEFfQVBTRVRfRzlfRzExCQkweDBFCi0jZGVmaW5lIFJGX0JTX0lRR0VOCQkJMHgwRgotI2RlZmluZSBSRl9NT0RFMQkJCTB4MTAKLSNkZWZpbmUgUkZfTU9ERTIJCQkweDExCi0jZGVmaW5lIFJGX1JYX0FHQ19IUAkJCTB4MTIKLSNkZWZpbmUgUkZfVFhfQUdDCQkJMHgxMwotI2RlZmluZSBSRl9CSUFTCQkJCTB4MTQKLSNkZWZpbmUgUkZfSVBBCQkJCTB4MTUKLSNkZWZpbmUgUkZfVFhCSUFTCQkJMHgxNgotI2RlZmluZSBSRl9QT1dfQUJJTElUWQkJCTB4MTcKLSNkZWZpbmUgUkZfTU9ERV9BRwkJCTB4MTgKLSNkZWZpbmUgclJmQ2hhbm5lbAkJCTB4MTgJLyogIFJGIGNoYW5uZWwgYW5kIEJXIHN3aXRjaCAqLwotI2RlZmluZSBSRl9DSE5MQlcJCQkweDE4CS8qICBSRiBjaGFubmVsIGFuZCBCVyBzd2l0Y2ggKi8KLSNkZWZpbmUgUkZfVE9QCQkJCTB4MTkKLSNkZWZpbmUgUkZfUlhfRzEJCQkweDFBCi0jZGVmaW5lIFJGX1JYX0cyCQkJMHgxQgotI2RlZmluZSBSRl9SWF9CQjIJCQkweDFDCi0jZGVmaW5lIFJGX1JYX0JCMQkJCTB4MUQKLSNkZWZpbmUgUkZfUkNLMQkJCQkweDFFCi0jZGVmaW5lIFJGX1JDSzIJCQkJMHgxRgotI2RlZmluZSBSRl9UWF9HMQkJCTB4MjAKLSNkZWZpbmUgUkZfVFhfRzIJCQkweDIxCi0jZGVmaW5lIFJGX1RYX0czCQkJMHgyMgotI2RlZmluZSBSRl9UWF9CQjEJCQkweDIzCi0jZGVmaW5lIFJGX1RfTUVURVIJCQkweDI0Ci0jZGVmaW5lIFJGX1NZTl9HMQkJCTB4MjUJLyogIFJGIFRYIFBvd2VyIGNvbnRyb2wgKi8KLSNkZWZpbmUgUkZfU1lOX0cyCQkJMHgyNgkvKiAgUkYgVFggUG93ZXIgY29udHJvbCAqLwotI2RlZmluZSBSRl9TWU5fRzMJCQkweDI3CS8qICBSRiBUWCBQb3dlciBjb250cm9sICovCi0jZGVmaW5lIFJGX1NZTl9HNAkJCTB4MjgJLyogIFJGIFRYIFBvd2VyIGNvbnRyb2wgKi8KLSNkZWZpbmUgUkZfU1lOX0c1CQkJMHgyOQkvKiAgUkYgVFggUG93ZXIgY29udHJvbCAqLwotI2RlZmluZSBSRl9TWU5fRzYJCQkweDJBCS8qICBSRiBUWCBQb3dlciBjb250cm9sICovCi0jZGVmaW5lIFJGX1NZTl9HNwkJCTB4MkIJLyogIFJGIFRYIFBvd2VyIGNvbnRyb2wgKi8KLSNkZWZpbmUgUkZfU1lOX0c4CQkJMHgyQwkvKiAgUkYgVFggUG93ZXIgY29udHJvbCAqLwotCi0jZGVmaW5lIFJGX1JDS19PUwkJCTB4MzAJLyogIFJGIFRYIFBBIGNvbnRyb2wgKi8KLQotI2RlZmluZSBSRl9UWFBBX0cxCQkJMHgzMQkvKiAgUkYgVFggUEEgY29udHJvbCAqLwotI2RlZmluZSBSRl9UWFBBX0cyCQkJMHgzMgkvKiAgUkYgVFggUEEgY29udHJvbCAqLwotI2RlZmluZSBSRl9UWFBBX0czCQkJMHgzMwkvKiAgUkYgVFggUEEgY29udHJvbCAqLwotCi0vKiBCaXQgTWFzayAqLwotLyogIDEuIFBhZ2UxKDB4MTAwKSAqLwotI2RlZmluZSBiQkJSZXNldEIJCQkweDEwMAkvKiAgVXNlbGVzcyBub3c/ICovCi0jZGVmaW5lIGJHbG9iYWxSZXNldEIJCQkweDIwMAotI2RlZmluZSBiT0ZETVR4U3RhcnQJCQkweDQKLSNkZWZpbmUgYkNDS1R4U3RhcnQJCQkweDgKLSNkZWZpbmUgYkNSQzMyRGVidWcJCQkweDEwMAotI2RlZmluZSBiUE1BQ0xvb3BiYWNrCQkJMHgxMAotI2RlZmluZSBiVHhMU0lHCQkJCTB4ZmZmZmZmCi0jZGVmaW5lIGJPRkRNVHhSYXRlCQkJMHhmCi0jZGVmaW5lIGJPRkRNVHhSZXNlcnZlZAkJCTB4MTAKLSNkZWZpbmUgYk9GRE1UeExlbmd0aAkJCTB4MWZmZTAKLSNkZWZpbmUgYk9GRE1UeFBhcml0eQkJCTB4MjAwMDAKLSNkZWZpbmUgYlR4SFRTSUcxCQkJMHhmZmZmZmYKLSNkZWZpbmUgYlR4SFRNQ1NSYXRlCQkJMHg3ZgotI2RlZmluZSBiVHhIVEJXCQkJCTB4ODAKLSNkZWZpbmUgYlR4SFRMZW5ndGgJCQkweGZmZmYwMAotI2RlZmluZSBiVHhIVFNJRzIJCQkweGZmZmZmZgotI2RlZmluZSBiVHhIVFNtb290aGluZwkJCTB4MQotI2RlZmluZSBiVHhIVFNvdW5kaW5nCQkJMHgyCi0jZGVmaW5lIGJUeEhUUmVzZXJ2ZWQJCQkweDQKLSNkZWZpbmUgYlR4SFRBZ2dyZWF0aW9uCQkJMHg4Ci0jZGVmaW5lIGJUeEhUU1RCQwkJCTB4MzAKLSNkZWZpbmUgYlR4SFRBZHZhbmNlQ29kaW5nCQkweDQwCi0jZGVmaW5lIGJUeEhUU2hvcnRHSQkJCTB4ODAKLSNkZWZpbmUgYlR4SFROdW1iZXJIVF9MVEYJCTB4MzAwCi0jZGVmaW5lIGJUeEhUQ1JDOAkJCTB4M2ZjMDAKLSNkZWZpbmUgYkNvdW50ZXJSZXNldAkJCTB4MTAwMDAKLSNkZWZpbmUgYk51bU9mT0ZETVR4CQkJMHhmZmZmCi0jZGVmaW5lIGJOdW1PZkNDS1R4CQkJMHhmZmZmMDAwMAotI2RlZmluZSBiVHhJZGxlSW50ZXJ2YWwJCQkweGZmZmYKLSNkZWZpbmUgYk9GRE1TZXJ2aWNlCQkJMHhmZmZmMDAwMAotI2RlZmluZSBiVHhNQUNIZWFkZXIJCQkweGZmZmZmZmZmCi0jZGVmaW5lIGJUeERhdGFJbml0CQkJMHhmZgotI2RlZmluZSBiVHhIVE1vZGUJCQkweDEwMAotI2RlZmluZSBiVHhEYXRhVHlwZQkJCTB4MzAwMDAKLSNkZWZpbmUgYlR4UmFuZG9tU2VlZAkJCTB4ZmZmZmZmZmYKLSNkZWZpbmUgYkNDS1R4UHJlYW1ibGUJCQkweDEKLSNkZWZpbmUgYkNDS1R4U0ZECQkJMHhmZmZmMDAwMAotI2RlZmluZSBiQ0NLVHhTSUcJCQkweGZmCi0jZGVmaW5lIGJDQ0tUeFNlcnZpY2UJCQkweGZmMDAKLSNkZWZpbmUgYkNDS0xlbmd0aEV4dAkJCTB4ODAwMAotI2RlZmluZSBiQ0NLVHhMZW5ndGgJCQkweGZmZmYwMDAwCi0jZGVmaW5lIGJDQ0tUeENSQzE2CQkJMHhmZmZmCi0jZGVmaW5lIGJDQ0tUeFN0YXR1cwkJCTB4MQotI2RlZmluZSBiT0ZETVR4U3RhdHVzCQkJMHgyCi0KLSNkZWZpbmUgSVNfQkJfUkVHX09GRlNFVF85MlMoX09mZnNldCkJCQlcCi0JKChfT2Zmc2V0ID49IDB4ODAwKSAmJiAoX09mZnNldCA8PSAweGZmZikpCi0KLS8qICAyLiBQYWdlOCgweDgwMCkgKi8KLSNkZWZpbmUgYlJGTU9ECQkJCTB4MQkvKiAgUmVnIDB4ODAwIHJGUEdBMF9SRk1PRCAqLwotI2RlZmluZSBiSmFwYW5Nb2RlCQkJMHgyCi0jZGVmaW5lIGJDQ0tUeFNDCQkJMHgzMAotI2RlZmluZSBiQ0NLRW4JCQkJMHgxMDAwMDAwCi0jZGVmaW5lIGJPRkRNRW4JCQkJMHgyMDAwMDAwCi0KLSNkZWZpbmUgYk9GRE1SeEFEQ1BoYXNlCQkJMHgxMDAwMAkvKiAgVXNlbGVzcyBub3cgKi8KLSNkZWZpbmUgYk9GRE1UeERBQ1BoYXNlCQkJMHg0MDAwMAotI2RlZmluZSBiWEFUeEFHQwkJCTB4M2YKLQotI2RlZmluZSBiQW50ZW5uYVNlbGVjdAkJCTB4MDMwMAotCi0jZGVmaW5lIGJYQlR4QUdDCQkJMHhmMDAJLyogIFJlZyA4MGMgckZQR0EwX1R4R2FpblN0YWdlICovCi0jZGVmaW5lIGJYQ1R4QUdDCQkJMHhmMDAwCi0jZGVmaW5lIGJYRFR4QUdDCQkJMHhmMDAwMAotCi0jZGVmaW5lIGJQQVN0YXJ0CQkJMHhmMDAwMDAwMAkvKiAgVXNlbGVzcyBub3cgKi8KLSNkZWZpbmUgYlRSU3RhcnQJCQkweDAwZjAwMDAwCi0jZGVmaW5lIGJSRlN0YXJ0CQkJMHgwMDAwZjAwMAotI2RlZmluZSBiQkJTdGFydAkJCTB4MDAwMDAwZjAKLSNkZWZpbmUgYkJCQ0NLU3RhcnQJCQkweDAwMDAwMDBmCi0jZGVmaW5lIGJQQUVuZAkJCQkweGYgICAgICAgICAgLyogUmVnMHg4MTQgKi8KLSNkZWZpbmUgYlRSRW5kCQkJCTB4MGYwMDAwMDAKLSNkZWZpbmUgYlJGRW5kCQkJCTB4MDAwZjAwMDAKLSNkZWZpbmUgYkNDQU1hc2sJCQkweDAwMDAwMGYwICAgLyogVDJSICovCi0jZGVmaW5lIGJSMlJDQ0FNYXNrCQkJMHgwMDAwMGYwMAotI2RlZmluZSBiSFNTSV9SMlREZWxheQkJCTB4ZjgwMDAwMDAKLSNkZWZpbmUgYkhTU0lfVDJSRGVsYXkJCQkweGY4MDAwMAotI2RlZmluZSBiQ29udFR4SFNTSQkJCTB4NDAwICAgICAvKiBjaGFuZSBnYWluIGF0IGNvbnRpbnVlIFR4ICovCi0jZGVmaW5lIGJJR0Zyb21DQ0sJCQkweDIwMAotI2RlZmluZSBiQUdDQWRkcmVzcwkJCTB4M2YKLSNkZWZpbmUgYlJ4SFBUeAkJCQkweDcwMDAKLSNkZWZpbmUgYlJ4SFBUMlIJCQkweDM4MDAwCi0jZGVmaW5lIGJSeEhQQ0NLSW5pCQkJMHhjMDAwMAotI2RlZmluZSBiQUdDVHhDb2RlCQkJMHhjMDAwMDAKLSNkZWZpbmUgYkFHQ1J4Q29kZQkJCTB4MzAwMDAwCi0KLSNkZWZpbmUgYjNXaXJlRGF0YUxlbmd0aAkJMHg4MDAJLyogIFJlZyAweDgyMH44NGYgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIxICovCi0jZGVmaW5lIGIzV2lyZUFkZHJlc3NMZW5ndGgJCTB4NDAwCi0KLSNkZWZpbmUgYjNXaXJlUkZQb3dlckRvd24JCTB4MQkvKiAgVXNlbGVzcyBub3cgKi8KLS8qIGRlZmluZSBiSFdTSVNlbGVjdAkJCTB4OCAqLwotI2RlZmluZSBiNUdQQVBFUG9sYXJpdHkJCQkweDQwMDAwMDAwCi0jZGVmaW5lIGIyR1BBUEVQb2xhcml0eQkJCTB4ODAwMDAwMDAKLSNkZWZpbmUgYlJGU1dfVHhEZWZhdWx0QW50CQkweDMKLSNkZWZpbmUgYlJGU1dfVHhPcHRpb25BbnQJCTB4MzAKLSNkZWZpbmUgYlJGU1dfUnhEZWZhdWx0QW50CQkweDMwMAotI2RlZmluZSBiUkZTV19SeE9wdGlvbkFudAkJMHgzMDAwCi0jZGVmaW5lIGJSRlNJXzNXaXJlRGF0YQkJCTB4MQotI2RlZmluZSBiUkZTSV8zV2lyZUNsb2NrCQkweDIKLSNkZWZpbmUgYlJGU0lfM1dpcmVMb2FkCQkJMHg0Ci0jZGVmaW5lIGJSRlNJXzNXaXJlUlcJCQkweDgKLSNkZWZpbmUgYlJGU0lfM1dpcmUJCQkweGYKLQotI2RlZmluZSBiUkZTSV9SRkVOVgkJCTB4MTAJLyogIFJlZyAweDg3MCByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1cgKi8KLQotI2RlZmluZSBiUkZTSV9UUlNXCQkJMHgyMAkvKiAgVXNlbGVzcyBub3cgKi8KLSNkZWZpbmUgYlJGU0lfVFJTV0IJCQkweDQwCi0jZGVmaW5lIGJSRlNJX0FOVFNXCQkJMHgxMDAKLSNkZWZpbmUgYlJGU0lfQU5UU1dCCQkJMHgyMDAKLSNkZWZpbmUgYlJGU0lfUEFQRQkJCTB4NDAwCi0jZGVmaW5lIGJSRlNJX1BBUEU1RwkJCTB4ODAwCi0jZGVmaW5lIGJCYW5kU2VsZWN0CQkJMHgxCi0jZGVmaW5lIGJIVFNJRzJfR0kJCQkweDgwCi0jZGVmaW5lIGJIVFNJRzJfU21vb3RoaW5nCQkweDAxCi0jZGVmaW5lIGJIVFNJRzJfU291bmRpbmcJCTB4MDIKLSNkZWZpbmUgYkhUU0lHMl9BZ2dyZWF0b24JCTB4MDgKLSNkZWZpbmUgYkhUU0lHMl9TVEJDCQkJMHgzMAotI2RlZmluZSBiSFRTSUcyX0FkdkNvZGluZwkJMHg0MAotI2RlZmluZSBiSFRTSUcyX051bU9mSFRMVEYJCTB4MzAwCi0jZGVmaW5lIGJIVFNJRzJfQ1JDOAkJCTB4M2ZjCi0jZGVmaW5lIGJIVFNJRzFfTUNTCQkJMHg3ZgotI2RlZmluZSBiSFRTSUcxX0JhbmRXaWR0aAkJMHg4MAotI2RlZmluZSBiSFRTSUcxX0hUTGVuZ3RoCQkweGZmZmYKLSNkZWZpbmUgYkxTSUdfUmF0ZQkJCTB4ZgotI2RlZmluZSBiTFNJR19SZXNlcnZlZAkJCTB4MTAKLSNkZWZpbmUgYkxTSUdfTGVuZ3RoCQkJMHgxZmZmZQotI2RlZmluZSBiTFNJR19QYXJpdHkJCQkweDIwCi0jZGVmaW5lIGJDQ0tSeFBoYXNlCQkJMHg0Ci0KLSNkZWZpbmUgYkxTU0lSZWFkQWRkcmVzcwkJMHg3ZjgwMDAwMCAgIC8qICBUNjUgUkYgKi8KLQotI2RlZmluZSBiTFNTSVJlYWRFZGdlCQkJMHg4MDAwMDAwMCAgIC8qIExTU0kgIlJlYWQiIGVkZ2Ugc2lnbmFsICovCi0KLSNkZWZpbmUgYkxTU0lSZWFkQmFja0RhdGEJCTB4ZmZmZmYJCS8qICBUNjUgUkYgKi8KLQotI2RlZmluZSBiTFNTSVJlYWRPS0ZsYWcJCQkweDEwMDAJLyogIFVzZWxlc3Mgbm93ICovCi0jZGVmaW5lIGJDQ0tTYW1wbGVSYXRlCQkJMHg4ICAgICAgIC8qIDA6IDQ0TUh6LCAxOjg4TUh6ICovCi0jZGVmaW5lIGJSZWd1bGF0b3IwU3RhbmRieQkJMHgxCi0jZGVmaW5lIGJSZWd1bGF0b3JQTExTdGFuZGJ5CQkweDIKLSNkZWZpbmUgYlJlZ3VsYXRvcjFTdGFuZGJ5CQkweDQKLSNkZWZpbmUgYlBMTFBvd2VyVXAJCQkweDgKLSNkZWZpbmUgYkRQTExQb3dlclVwCQkJMHgxMAotI2RlZmluZSBiREExMFBvd2VyVXAJCQkweDIwCi0jZGVmaW5lIGJBRDdQb3dlclVwCQkJMHgyMDAKLSNkZWZpbmUgYkRBNlBvd2VyVXAJCQkweDIwMDAKLSNkZWZpbmUgYlh0YWxQb3dlclVwCQkJMHg0MDAwCi0jZGVmaW5lIGI0ME1EQ2xrUG93ZXJVUAkJCTB4ODAwMAotI2RlZmluZSBiREE2RGVidWdNb2RlCQkJMHgyMDAwMAotI2RlZmluZSBiREE2U3dpbmcJCQkweDM4MDAwMAotCi0jZGVmaW5lIGJBRENsa1BoYXNlCQkJMHg0MDAwMDAwCS8qICBSZWcgMHg4ODAgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEgMjAvNDAgQ0NLIHN1cHBvcnQgc3dpdGNoIDQwLzgwIEJCIE1IWiAqLwotCi0jZGVmaW5lIGI4ME1DbGtEZWxheQkJCTB4MTgwMDAwMDAJLyogIFVzZWxlc3MgKi8KLSNkZWZpbmUgYkFGRVdhdGNoRG9nRW5hYmxlCQkweDIwMDAwMDAwCi0KLSNkZWZpbmUgYlh0YWxDYXAwMQkJCTB4YzAwMDAwMDAJLyogIFJlZyAweDg4NCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMiBDcnlzdGFsIGNhcCAqLwotI2RlZmluZSBiWHRhbENhcDIzCQkJMHgzCi0jZGVmaW5lIGJYdGFsQ2FwOTJ4CQkJMHgwZjAwMDAwMAotI2RlZmluZQkJYlh0YWxDYXAJCTB4MGYwMDAwMDAKLQotI2RlZmluZSBiSW50RGlmQ2xrRW5hYmxlCQkweDQwMAkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiRXh0U2lnQ2xrRW5hYmxlCQkweDgwMAotI2RlZmluZSBiQmFuZGdhcE1iaWFzUG93ZXJVcAkJMHgxMDAwMAotI2RlZmluZSBiQUQxMVNIR2FpbgkJCTB4YzAwMDAKLSNkZWZpbmUgYkFEMTFJbnB1dFJhbmdlCQkJMHg3MDAwMDAKLSNkZWZpbmUgYkFEMTFPUEN1cnJlbnQJCQkweDM4MDAwMDAKLSNkZWZpbmUgYklQYXRoTG9vcGJhY2sJCQkweDQwMDAwMDAKLSNkZWZpbmUgYlFQYXRoTG9vcGJhY2sJCQkweDgwMDAwMDAKLSNkZWZpbmUgYkFGRUxvb3BiYWNrCQkJMHgxMDAwMDAwMAotI2RlZmluZSBiREExMFN3aW5nCQkJMHg3ZTAKLSNkZWZpbmUgYkRBMTBSZXZlcnNlCQkJMHg4MDAKLSNkZWZpbmUgYkRBQ2xrU291cmNlCQkJMHgxMDAwCi0jZGVmaW5lIGJBRDdJbnB1dFJhbmdlCQkJMHg2MDAwCi0jZGVmaW5lIGJBRDdHYWluCQkJMHgzODAwMAotI2RlZmluZSBiQUQ3T3V0cHV0Q01Nb2RlCQkweDQwMDAwCi0jZGVmaW5lIGJBRDdJbnB1dENNTW9kZQkJCTB4MzgwMDAwCi0jZGVmaW5lIGJBRDdDdXJyZW50CQkJMHhjMDAwMDAKLSNkZWZpbmUgYlJlZ3VsYXRvckFkanVzdAkJMHg3MDAwMDAwCi0jZGVmaW5lIGJBRDExUG93ZXJVcEF0VHgJCTB4MQotI2RlZmluZSBiREExMFBTQXRUeAkJCTB4MTAKLSNkZWZpbmUgYkFEMTFQb3dlclVwQXRSeAkJMHgxMDAKLSNkZWZpbmUgYkRBMTBQU0F0UngJCQkweDEwMDAKLSNkZWZpbmUgYkNDS1J4QUdDRm9ybWF0CQkJMHgyMDAKLSNkZWZpbmUgYlBTREZGVFNhbXBsZXBQb2ludAkJMHhjMDAwCi0jZGVmaW5lIGJQU0RBdmVyYWdlTnVtCQkJMHgzMDAwCi0jZGVmaW5lIGJJUVBhdGhDb250cm9sCQkJMHhjMDAKLSNkZWZpbmUgYlBTREZyZXEJCQkweDNmZgotI2RlZmluZSBiUFNEQW50ZW5uYVBhdGgJCQkweDMwCi0jZGVmaW5lIGJQU0RJUVN3aXRjaAkJCTB4NDAKLSNkZWZpbmUgYlBTRFJ4VHJpZ2dlcgkJCTB4NDAwMDAwCi0jZGVmaW5lIGJQU0RUeFRyaWdnZXIJCQkweDgwMDAwMDAwCi0jZGVmaW5lIGJQU0RTaW5lVG9uZVNjYWxlCQkweDdmMDAwMDAwCi0jZGVmaW5lIGJQU0RSZXBvcnQJCQkweGZmZmYKLQotLyogIDMuIFBhZ2U5KDB4OTAwKSAqLwotI2RlZmluZSBiT0ZETVR4U0MJCQkweDMwMDAwMDAwCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIGJDQ0tUeE9uCQkJMHgxCi0jZGVmaW5lIGJPRkRNVHhPbgkJCTB4MgotI2RlZmluZSBiRGVidWdQYWdlCQkJMHhmZmYgIC8qIHJlc2V0IGRlYnVnIHBhZ2UgYW5kIGFsc28gSFdvcmQsIExXb3JkICovCi0jZGVmaW5lIGJEZWJ1Z0l0ZW0JCQkweGZmICAgLyogcmVzZXQgZGVidWcgcGFnZSBhbmQgTFdvcmQgKi8KLSNkZWZpbmUgYkFudEwJCQkJMHgxMAotI2RlZmluZSBiQW50Tm9uSFQJCQkweDEwMAotI2RlZmluZSBiQW50SFQxCQkJCTB4MTAwMAotI2RlZmluZSBiQW50SFQyCQkJCTB4MTAwMDAKLSNkZWZpbmUgYkFudEhUMVMxCQkJMHgxMDAwMDAKLSNkZWZpbmUgYkFudE5vbkhUUzEJCQkweDEwMDAwMDAKLQotLyogIDQuIFBhZ2VBKDB4QTAwKSAqLwotI2RlZmluZSBiQ0NLQkJNb2RlCQkJMHgzCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIGJDQ0tUeFBvd2VyU2F2aW5nCQkweDgwCi0jZGVmaW5lIGJDQ0tSeFBvd2VyU2F2aW5nCQkweDQwCi0KLSNkZWZpbmUgYkNDS1NpZGVCYW5kCQkJMHgxMAkvKiAgUmVnIDB4YTAwIHJDQ0swX1N5c3RlbSAyMC80MCBzd2l0Y2ggKi8KLQotI2RlZmluZSBiQ0NLU2NyYW1ibGUJCQkweDgJLyogIFVzZWxlc3MgKi8KLSNkZWZpbmUgYkNDS0FudERpdmVyc2l0eQkJMHg4MDAwCi0jZGVmaW5lIGJDQ0tDYXJyaWVyUmVjb3ZlcnkJCTB4NDAwMAotI2RlZmluZSBiQ0NLVHhSYXRlCQkJMHgzMDAwCi0jZGVmaW5lIGJDQ0tEQ0NhbmNlbAkJCTB4MDgwMAotI2RlZmluZSBiQ0NLSVNJQ2FuY2VsCQkJMHgwNDAwCi0jZGVmaW5lIGJDQ0tNYXRjaEZpbHRlcgkJCTB4MDIwMAotI2RlZmluZSBiQ0NLRXF1YWxpemVyCQkJMHgwMTAwCi0jZGVmaW5lIGJDQ0tQcmVhbWJsZURldGVjdAkJMHg4MDAwMDAKLSNkZWZpbmUgYkNDS0Zhc3RGYWxzZUNDQQkJMHg0MDAwMDAKLSNkZWZpbmUgYkNDS0NoRXN0U3RhcnQJCQkweDMwMDAwMAotI2RlZmluZSBiQ0NLQ0NBQ291bnQJCQkweDA4MDAwMAotI2RlZmluZSBiQ0NLY3NfbGltCQkJMHgwNzAwMDAKLSNkZWZpbmUgYkNDS0Jpc3RNb2RlCQkJMHg4MDAwMDAwMAotI2RlZmluZSBiQ0NLQ0NBTWFzawkJCTB4NDAwMDAwMDAKLSNkZWZpbmUgYkNDS1R4REFDUGhhc2UJCQkweDQKLSNkZWZpbmUgYkNDS1J4QURDUGhhc2UJCQkweDIwMDAwMDAwICAgLyogcl9yeF9jbGsgKi8KLSNkZWZpbmUgYkNDS3JfY3BfbW9kZTAJCQkweDAxMDAKLSNkZWZpbmUgYkNDS1R4RENPZmZzZXQJCQkweGYwCi0jZGVmaW5lIGJDQ0tSeERDT2Zmc2V0CQkJMHhmCi0jZGVmaW5lIGJDQ0tDQ0FNb2RlCQkJMHhjMDAwCi0jZGVmaW5lIGJDQ0tGYWxzZUNTX2xpbQkJCTB4M2YwMAotI2RlZmluZSBiQ0NLQ1NfcmF0aW8JCQkweGMwMDAwMAotI2RlZmluZSBiQ0NLQ29yZ0JpdF9zZWwJCQkweDMwMDAwMAotI2RlZmluZSBiQ0NLUERfbGltCQkJMHgwZjAwMDAKLSNkZWZpbmUgYkNDS05ld0NDQQkJCTB4ODAwMDAwMDAKLSNkZWZpbmUgYkNDS1J4SFBvZklHCQkJMHg4MDAwCi0jZGVmaW5lIGJDQ0tSeElHCQkJMHg3ZjAwCi0jZGVmaW5lIGJDQ0tMTkFQb2xhcml0eQkJCTB4ODAwMDAwCi0jZGVmaW5lIGJDQ0tSeDFzdEdhaW4JCQkweDdmMDAwMAotI2RlZmluZSBiQ0NLUkZFeHRlbmQJCQkweDIwMDAwMDAwIC8qIENDSyBSeCBJaW5pdGFsIGdhaW4gcG9sYXJpdHkgKi8KLSNkZWZpbmUgYkNDS1J4QUdDU2F0TGV2ZWwJCTB4MWYwMDAwMDAKLSNkZWZpbmUgYkNDS1J4QUdDU2F0Q291bnQJCTB4ZTAKLSNkZWZpbmUgYkNDS1J4UkZTZXR0bGUJCQkweDFmICAgICAgIC8qIEFHQ3NhbXBfZGx5ICovCi0jZGVmaW5lIGJDQ0tGaXhlZFJ4QUdDCQkJMHg4MDAwCi0vKiBkZWZpbmUgYkNDS1J4QUdDRm9ybWF0CQkweDQwMDAgICByZW1vdmUgdG8gSFNTSSByZWdpc3RlciAweDgyNCAqLwotI2RlZmluZSBiQ0NLQW50ZW5uYVBvbGFyaXR5CQkweDIwMDAKLSNkZWZpbmUgYkNDS1R4RmlsdGVyVHlwZQkJMHgwYzAwCi0jZGVmaW5lIGJDQ0tSeEFHQ1JlcG9ydFR5cGUJCTB4MDMwMAotI2RlZmluZSBiQ0NLUnhEQUdDRW4JCQkweDgwMDAwMDAwCi0jZGVmaW5lIGJDQ0tSeERBR0NQZXJpb2QJCTB4MjAwMDAwMDAKLSNkZWZpbmUgYkNDS1J4REFHQ1NhdExldmVsCQkweDFmMDAwMDAwCi0jZGVmaW5lIGJDQ0tUaW1pbmdSZWNvdmVyeQkJMHg4MDAwMDAKLSNkZWZpbmUgYkNDS1R4QzAJCQkweDNmMDAwMAotI2RlZmluZSBiQ0NLVHhDMQkJCTB4M2YwMDAwMDAKLSNkZWZpbmUgYkNDS1R4QzIJCQkweDNmCi0jZGVmaW5lIGJDQ0tUeEMzCQkJMHgzZjAwCi0jZGVmaW5lIGJDQ0tUeEM0CQkJMHgzZjAwMDAKLSNkZWZpbmUgYkNDS1R4QzUJCQkweDNmMDAwMDAwCi0jZGVmaW5lIGJDQ0tUeEM2CQkJMHgzZgotI2RlZmluZSBiQ0NLVHhDNwkJCTB4M2YwMAotI2RlZmluZSBiQ0NLRGVidWdQb3J0CQkJMHhmZjAwMDAKLSNkZWZpbmUgYkNDS0RBQ0RlYnVnCQkJMHgwZjAwMDAwMAotI2RlZmluZSBiQ0NLRmFsc2VBbGFybUVuYWJsZQkJMHg4MDAwCi0jZGVmaW5lIGJDQ0tGYWxzZUFsYXJtUmVhZAkJMHg0MDAwCi0jZGVmaW5lIGJDQ0tUUlNTSQkJCTB4N2YKLSNkZWZpbmUgYkNDS1J4QUdDUmVwb3J0CQkJMHhmZQotI2RlZmluZSBiQ0NLUnhSZXBvcnRfQW50U2VsCQkweDgwMDAwMDAwCi0jZGVmaW5lIGJDQ0tSeFJlcG9ydF9NRk9mZgkJMHg0MDAwMDAwMAotI2RlZmluZSBiQ0NLUnhSeFJlcG9ydF9TUUxvc3MJCTB4MjAwMDAwMDAKLSNkZWZpbmUgYkNDS1J4UmVwb3J0X1BrdGxvc3MJCTB4MTAwMDAwMDAKLSNkZWZpbmUgYkNDS1J4UmVwb3J0X0xvY2tlZGJpdAkJMHgwODAwMDAwMAotI2RlZmluZSBiQ0NLUnhSZXBvcnRfUmF0ZUVycm9yCQkweDA0MDAwMDAwCi0jZGVmaW5lIGJDQ0tSeFJlcG9ydF9SeFJhdGUJCTB4MDMwMDAwMDAKLSNkZWZpbmUgYkNDS1J4RkFDb3VudGVyTG93ZXIJCTB4ZmYKLSNkZWZpbmUgYkNDS1J4RkFDb3VudGVyVXBwZXIJCTB4ZmYwMDAwMDAKLSNkZWZpbmUgYkNDS1J4SFBBR0NTdGFydAkJMHhlMDAwCi0jZGVmaW5lIGJDQ0tSeEhQQUdDRmluYWwJCTB4MWMwMAotI2RlZmluZSBiQ0NLUnhGYWxzZUFsYXJtRW5hYmxlCQkweDgwMDAKLSNkZWZpbmUgYkNDS0ZBQ291bnRlckZyZWV6ZQkJMHg0MDAwCi0jZGVmaW5lIGJDQ0tUeFBhdGhTZWwJCQkweDEwMDAwMDAwCi0jZGVmaW5lIGJDQ0tEZWZhdWx0UnhQYXRoCQkweGMwMDAwMDAKLSNkZWZpbmUgYkNDS09wdGlvblJ4UGF0aAkJMHgzMDAwMDAwCi0KLS8qICA1LiBQYWdlQygweEMwMCkgKi8KLSNkZWZpbmUgYk51bU9mU1RGCQkJMHgzCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIGJTaGlmdF9MCQkJMHhjMAotI2RlZmluZSBiR0lfVEgJCQkJMHhjCi0jZGVmaW5lIGJSeFBhdGhBCQkJMHgxCi0jZGVmaW5lIGJSeFBhdGhCCQkJMHgyCi0jZGVmaW5lIGJSeFBhdGhDCQkJMHg0Ci0jZGVmaW5lIGJSeFBhdGhECQkJMHg4Ci0jZGVmaW5lIGJUeFBhdGhBCQkJMHgxCi0jZGVmaW5lIGJUeFBhdGhCCQkJMHgyCi0jZGVmaW5lIGJUeFBhdGhDCQkJMHg0Ci0jZGVmaW5lIGJUeFBhdGhECQkJMHg4Ci0jZGVmaW5lIGJUUlNTSUZyZXEJCQkweDIwMAotI2RlZmluZSBiQURDQmFja29mZgkJCTB4MzAwMAotI2RlZmluZSBiREZJUkJhY2tvZmYJCQkweGMwMDAKLSNkZWZpbmUgYlRSU1NJTGF0Y2hQaGFzZQkJMHgxMDAwMAotI2RlZmluZSBiUnhJRENPZmZzZXQJCQkweGZmCi0jZGVmaW5lIGJSeFFEQ09mZnNldAkJCTB4ZmYwMAotI2RlZmluZSBiUnhERklSTW9kZQkJCTB4MTgwMDAwMAotI2RlZmluZSBiUnhEQ05GVHlwZQkJCTB4ZTAwMDAwMAotI2RlZmluZSBiUlhJUUltYl9BCQkJMHgzZmYKLSNkZWZpbmUgYlJYSVFJbWJfQgkJCTB4ZmMwMAotI2RlZmluZSBiUlhJUUltYl9DCQkJMHgzZjAwMDAKLSNkZWZpbmUgYlJYSVFJbWJfRAkJCTB4ZmZjMDAwMDAKLSNkZWZpbmUgYkRDX2RjX05vdGNoCQkJMHg2MDAwMAotI2RlZmluZSBiUnhOQklOb3RjaAkJCTB4MWYwMDAwMDAKLSNkZWZpbmUgYlBEX1RICQkJCTB4ZgotI2RlZmluZSBiUERfVEhfT3B0MgkJCTB4YzAwMAotI2RlZmluZSBiUFdFRF9USAkJCTB4NzAwCi0jZGVmaW5lIGJJZk1GX1dpbl9MCQkJMHg4MDAKLSNkZWZpbmUgYlBEX09wdGlvbgkJCTB4MTAwMAotI2RlZmluZSBiTUZfV2luX0wJCQkweGUwMDAKLSNkZWZpbmUgYkJXX1NlYXJjaF9MCQkJMHgzMDAwMAotI2RlZmluZSBid2luX2VuaF9MCQkJMHhjMDAwMAotI2RlZmluZSBiQldfVEgJCQkJMHg3MDAwMDAKLSNkZWZpbmUgYkVEX1RIMgkJCQkweDM4MDAwMDAKLSNkZWZpbmUgYkJXX29wdGlvbgkJCTB4NDAwMDAwMAotI2RlZmluZSBiUmF0aW9fVEgJCQkweDE4MDAwMDAwCi0jZGVmaW5lIGJXaW5kb3dfTAkJCTB4ZTAwMDAwMDAKLSNkZWZpbmUgYlNCRF9PcHRpb24JCQkweDEKLSNkZWZpbmUgYkZyYW1lX1RICQkJMHgxYwotI2RlZmluZSBiRlNfT3B0aW9uCQkJMHg2MAotI2RlZmluZSBiRENfU2xvcGVfY2hlY2sJCQkweDgwCi0jZGVmaW5lIGJGR3VhcmRfQ291bnRlcl9EQ19MCQkweGUwMAotI2RlZmluZSBiRnJhbWVfV2VpZ2h0X1Nob3J0CQkweDcwMDAKLSNkZWZpbmUgYlN1Yl9UdW5lCQkJMHhlMDAwMDAKLSNkZWZpbmUgYkZyYW1lX0RDX0xlbmd0aAkJMHhlMDAwMDAwCi0jZGVmaW5lIGJTQkRfc3RhcnRfb2Zmc2V0CQkweDMwMDAwMDAwCi0jZGVmaW5lIGJGcmFtZV9USF8yCQkJMHg3Ci0jZGVmaW5lIGJGcmFtZV9HSTJfVEgJCQkweDM4Ci0jZGVmaW5lIGJHSTJfU3luY19lbgkJCTB4NDAKLSNkZWZpbmUgYlNhcmNoX1Nob3J0X0Vhcmx5CQkweDMwMAotI2RlZmluZSBiU2FyY2hfU2hvcnRfTGF0ZQkJMHhjMDAKLSNkZWZpbmUgYlNhcmNoX0dJMl9MYXRlCQkJMHg3MDAwMAotI2RlZmluZSBiQ0ZPQW50U3VtCQkJMHgxCi0jZGVmaW5lIGJDRk9BY2MJCQkJMHgyCi0jZGVmaW5lIGJDRk9TdGFydE9mZnNldAkJCTB4YwotI2RlZmluZSBiQ0ZPTG9va0JhY2sJCQkweDcwCi0jZGVmaW5lIGJDRk9TdW1XZWlnaHQJCQkweDgwCi0jZGVmaW5lIGJEQUdDRW5hYmxlCQkJMHgxMDAwMAotI2RlZmluZSBiVFhJUUltYl9BCQkJMHgzZmYKLSNkZWZpbmUgYlRYSVFJbWJfQgkJCTB4ZmMwMAotI2RlZmluZSBiVFhJUUltYl9DCQkJMHgzZjAwMDAKLSNkZWZpbmUgYlRYSVFJbWJfRAkJCTB4ZmZjMDAwMDAKLSNkZWZpbmUgYlR4SURDT2Zmc2V0CQkJMHhmZgotI2RlZmluZSBiVHhRRENPZmZzZXQJCQkweGZmMDAKLSNkZWZpbmUgYlR4REZJUk1vZGUJCQkweDEwMDAwCi0jZGVmaW5lIGJUeFBlc3Vkb05vaXNlT24JCTB4NDAwMDAwMAotI2RlZmluZSBiVHhQZXN1ZG9Ob2lzZV9BCQkweGZmCi0jZGVmaW5lIGJUeFBlc3Vkb05vaXNlX0IJCTB4ZmYwMAotI2RlZmluZSBiVHhQZXN1ZG9Ob2lzZV9DCQkweGZmMDAwMAotI2RlZmluZSBiVHhQZXN1ZG9Ob2lzZV9ECQkweGZmMDAwMDAwCi0jZGVmaW5lIGJDQ0FEcm9wT3B0aW9uCQkJMHgyMDAwMAotI2RlZmluZSBiQ0NBRHJvcFRocmVzCQkJMHhmZmYwMDAwMAotI2RlZmluZSBiRURDQ0FfSAkJCTB4ZgotI2RlZmluZSBiRURDQ0FfTAkJCTB4ZjAKLSNkZWZpbmUgYkxhbWJkYV9FRAkJCTB4MzAwCi0jZGVmaW5lIGJSeEluaXRpYWxHYWluCQkJMHg3ZgotI2RlZmluZSBiUnhBbnREaXZFbgkJCTB4ODAKLSNkZWZpbmUgYlJ4QUdDQWRkcmVzc0ZvckxOQQkJMHg3ZjAwCi0jZGVmaW5lIGJSeEhpZ2hQb3dlckZsb3cJCTB4ODAwMAotI2RlZmluZSBiUnhBR0NGcmVlemVUaHJlcwkJMHhjMDAwMAotI2RlZmluZSBiUnhGcmVlemVTdGVwX0FHQzEJCTB4MzAwMDAwCi0jZGVmaW5lIGJSeEZyZWV6ZVN0ZXBfQUdDMgkJMHhjMDAwMDAKLSNkZWZpbmUgYlJ4RnJlZXplU3RlcF9BR0MzCQkweDMwMDAwMDAKLSNkZWZpbmUgYlJ4RnJlZXplU3RlcF9BR0MwCQkweGMwMDAwMDAKLSNkZWZpbmUgYlJ4UnNzaV9DbXBfRW4JCQkweDEwMDAwMDAwCi0jZGVmaW5lIGJSeFF1aWNrQUdDRW4JCQkweDIwMDAwMDAwCi0jZGVmaW5lIGJSeEFHQ0ZyZWV6ZVRocmVzTW9kZQkJMHg0MDAwMDAwMAotI2RlZmluZSBiUnhPdmVyRmxvd0NoZWNrVHlwZQkJMHg4MDAwMDAwMAotI2RlZmluZSBiUnhBR0NTaGlmdAkJCTB4N2YKLSNkZWZpbmUgYlRSU1dfVHJpX09ubHkJCQkweDgwCi0jZGVmaW5lIGJQb3dlclRocmVzCQkJMHgzMDAKLSNkZWZpbmUgYlJ4QUdDRW4JCQkweDEKLSNkZWZpbmUgYlJ4QUdDVG9nZXRoZXJFbgkJMHgyCi0jZGVmaW5lIGJSeEFHQ01pbgkJCTB4NAotI2RlZmluZSBiUnhIUF9JbmkJCQkweDcKLSNkZWZpbmUgYlJ4SFBfVFJMTkEJCQkweDcwCi0jZGVmaW5lIGJSeEhQX1JTU0kJCQkweDcwMAotI2RlZmluZSBiUnhIUF9CQlAxCQkJMHg3MDAwCi0jZGVmaW5lIGJSeEhQX0JCUDIJCQkweDcwMDAwCi0jZGVmaW5lIGJSeEhQX0JCUDMJCQkweDcwMDAwMAotI2RlZmluZSBiUlNTSV9ICQkJCTB4N2YwMDAwICAgICAvKiB0aGUgdGhyZXNob2xkIGZvciBoaWdoIHBvd2VyICovCi0jZGVmaW5lIGJSU1NJX0dlbgkJCTB4N2YwMDAwMDAgICAvKiB0aGUgdGhyZXNob2xkIGZvciBhbnQgZGl2ZXJzaXR5ICovCi0jZGVmaW5lIGJSeFNldHRsZV9UUlNXCQkJMHg3Ci0jZGVmaW5lIGJSeFNldHRsZV9MTkEJCQkweDM4Ci0jZGVmaW5lIGJSeFNldHRsZV9SU1NJCQkJMHgxYzAKLSNkZWZpbmUgYlJ4U2V0dGxlX0JCUAkJCTB4ZTAwCi0jZGVmaW5lIGJSeFNldHRsZV9SeEhQCQkJMHg3MDAwCi0jZGVmaW5lIGJSeFNldHRsZV9BbnRTV19SU1NJCQkweDM4MDAwCi0jZGVmaW5lIGJSeFNldHRsZV9BbnRTVwkJCTB4YzAwMDAKLSNkZWZpbmUgYlJ4UHJvY2Vzc1RpbWVfREFHQwkJMHgzMDAwMDAKLSNkZWZpbmUgYlJ4U2V0dGxlX0hTU0kJCQkweDQwMDAwMAotI2RlZmluZSBiUnhQcm9jZXNzVGltZV9CQlBQVwkJMHg4MDAwMDAKLSNkZWZpbmUgYlJ4QW50ZW5uYVBvd2VyU2hpZnQJCTB4MzAwMDAwMAotI2RlZmluZSBiUlNTSVRhYmxlU2VsZWN0CQkweGMwMDAwMDAKLSNkZWZpbmUgYlJ4SFBfRmluYWwJCQkweDcwMDAwMDAKLSNkZWZpbmUgYlJ4SFRTZXR0bGVfQkJQCQkJMHg3Ci0jZGVmaW5lIGJSeEhUU2V0dGxlX0hTU0kJCTB4OAotI2RlZmluZSBiUnhIVFNldHRsZV9SeEhQCQkweDcwCi0jZGVmaW5lIGJSeEhUU2V0dGxlX0JCUFBXCQkweDgwCi0jZGVmaW5lIGJSeEhUU2V0dGxlX0lkbGUJCTB4MzAwCi0jZGVmaW5lIGJSeEhUU2V0dGxlX1Jlc2VydmVkCQkweDFjMDAKLSNkZWZpbmUgYlJ4SFRSeEhQRW4JCQkweDgwMDAKLSNkZWZpbmUgYlJ4SFRBR0NGcmVlemVUaHJlcwkJMHgzMDAwMAotI2RlZmluZSBiUnhIVEFHQ1RvZ2V0aGVyRW4JCTB4NDAwMDAKLSNkZWZpbmUgYlJ4SFRBR0NNaW4JCQkweDgwMDAwCi0jZGVmaW5lIGJSeEhUQUdDRW4JCQkweDEwMDAwMAotI2RlZmluZSBiUnhIVERBR0NFbgkJCTB4MjAwMDAwCi0jZGVmaW5lIGJSeEhUUnhIUF9CQlAJCQkweDFjMDAwMDAKLSNkZWZpbmUgYlJ4SFRSeEhQX0ZpbmFsCQkJMHhlMDAwMDAwMAotI2RlZmluZSBiUnhQV1JhdGlvVEgJCQkweDMKLSNkZWZpbmUgYlJ4UFdSYXRpb0VuCQkJMHg0Ci0jZGVmaW5lIGJSeE1GSG9sZAkJCTB4MzgwMAotI2RlZmluZSBiUnhQRF9EZWxheV9USDEJCQkweDM4Ci0jZGVmaW5lIGJSeFBEX0RlbGF5X1RIMgkJCTB4MWMwCi0jZGVmaW5lIGJSeFBEX0RDX0NPVU5UX01BWAkJMHg2MDAKLS8qIGRlZmluZSBiUnhNRl9Ib2xkICAgICAgICAgICAJICAgIDB4MzgwMCAqLwotI2RlZmluZSBiUnhQRF9EZWxheV9USAkJCTB4ODAwMAotI2RlZmluZSBiUnhQcm9jZXNzX0RlbGF5CQkweGYwMDAwCi0jZGVmaW5lIGJSeFNlYXJjaHJhbmdlX0dJMl9FYXJseQkweDcwMDAwMAotI2RlZmluZSBiUnhGcmFtZV9HdWFyZF9Db3VudGVyX0wJMHgzODAwMDAwCi0jZGVmaW5lIGJSeFNHSV9HdWFyZF9MCQkJMHhjMDAwMDAwCi0jZGVmaW5lIGJSeFNHSV9TZWFyY2hfTAkJCTB4MzAwMDAwMDAKLSNkZWZpbmUgYlJ4U0dJX1RICQkJMHhjMDAwMDAwMAotI2RlZmluZSBiREZTQ250MAkJCTB4ZmYKLSNkZWZpbmUgYkRGU0NudDEJCQkweGZmMDAKLSNkZWZpbmUgYkRGU0ZsYWcJCQkweGYwMDAwCi0jZGVmaW5lIGJNRldlaWdodFN1bQkJCTB4MzAwMDAwCi0jZGVmaW5lIGJNaW5JZHhUSAkJCTB4N2YwMDAwMDAKLSNkZWZpbmUgYkRBRm9ybWF0CQkJMHg0MDAwMAotI2RlZmluZSBiVHhDaEVtdUVuYWJsZQkJCTB4MDEwMDAwMDAKLSNkZWZpbmUgYlRSU1dJc29sYXRpb25fQQkJMHg3ZgotI2RlZmluZSBiVFJTV0lzb2xhdGlvbl9CCQkweDdmMDAKLSNkZWZpbmUgYlRSU1dJc29sYXRpb25fQwkJMHg3ZjAwMDAKLSNkZWZpbmUgYlRSU1dJc29sYXRpb25fRAkJMHg3ZjAwMDAwMAotI2RlZmluZSBiRXh0TE5BR2FpbgkJCTB4N2MwMAotCi0vKiAgNi4gUGFnZUUoMHhFMDApICovCi0jZGVmaW5lIGJTVEJDRW4JCQkJMHg0CS8qICBVc2VsZXNzICovCi0jZGVmaW5lIGJBbnRlbm5hTWFwcGluZwkJCTB4MTAKLSNkZWZpbmUgYk5zcwkJCQkweDIwCi0jZGVmaW5lIGJDRk9BbnRTdW1ECQkJMHgyMDAKLSNkZWZpbmUgYlBIWUNvdW50ZXJSZXNldAkJMHg4MDAwMDAwCi0jZGVmaW5lIGJDRk9SZXBvcnRHZXQJCQkweDQwMDAwMDAKLSNkZWZpbmUgYk9GRE1Db250aW51ZVR4CQkJMHgxMDAwMDAwMAotI2RlZmluZSBiT0ZETVNpbmdsZUNhcnJpZXIJCTB4MjAwMDAwMDAKLSNkZWZpbmUgYk9GRE1TaW5nbGVUb25lCQkJMHg0MDAwMDAwMAotLyogZGVmaW5lIGJSeFBhdGgxICAgICAgICAgICAgICAgICAweDAxICovCi0vKiBkZWZpbmUgYlJ4UGF0aDIgICAgICAgICAgICAgICAgIDB4MDIgKi8KLS8qIGRlZmluZSBiUnhQYXRoMyAgICAgICAgICAgICAgICAgMHgwNCAqLwotLyogZGVmaW5lIGJSeFBhdGg0ICAgICAgICAgICAgICAgICAweDA4ICovCi0vKiBkZWZpbmUgYlR4UGF0aDEgICAgICAgICAgICAgICAgIDB4MTAgKi8KLS8qIGRlZmluZSBiVHhQYXRoMiAgICAgICAgICAgICAgICAgMHgyMCAqLwotI2RlZmluZSBiSFREZXRlY3QJCQkweDEwMAotI2RlZmluZSBiQ0ZPRW4JCQkJMHgxMDAwMAotI2RlZmluZSBiQ0ZPVmFsdWUJCQkweGZmZjAwMDAwCi0jZGVmaW5lIGJTaWdUb25lX1JlCQkJMHgzZgotI2RlZmluZSBiU2lnVG9uZV9JbQkJCTB4N2YwMAotI2RlZmluZSBiQ291bnRlcl9DQ0EJCQkweGZmZmYKLSNkZWZpbmUgYkNvdW50ZXJfUGFyaXR5RmFpbAkJMHhmZmZmMDAwMAotI2RlZmluZSBiQ291bnRlcl9SYXRlSWxsZWdhbAkJMHhmZmZmCi0jZGVmaW5lIGJDb3VudGVyX0NSQzhGYWlsCQkweGZmZmYwMDAwCi0jZGVmaW5lIGJDb3VudGVyX01DU05vU3VwcG9ydAkJMHhmZmZmCi0jZGVmaW5lIGJDb3VudGVyX0Zhc3RTeW5jCQkweGZmZmYKLSNkZWZpbmUgYlNob3J0Q0ZPCQkJMHhmZmYKLSNkZWZpbmUgYlNob3J0Q0ZPVExlbmd0aAkJMTIgICAvKiB0b3RhbCAqLwotI2RlZmluZSBiU2hvcnRDRk9GTGVuZ3RoCQkxMSAgIC8qIGZyYWN0aW9uICovCi0jZGVmaW5lIGJMb25nQ0ZPCQkJMHg3ZmYKLSNkZWZpbmUgYkxvbmdDRk9UTGVuZ3RoCQkJMTEKLSNkZWZpbmUgYkxvbmdDRk9GTGVuZ3RoCQkJMTEKLSNkZWZpbmUgYlRhaWxDRk8JCQkweDFmZmYKLSNkZWZpbmUgYlRhaWxDRk9UTGVuZ3RoCQkJMTMKLSNkZWZpbmUgYlRhaWxDRk9GTGVuZ3RoCQkJMTIKLSNkZWZpbmUgYm1heF9lbl9wd2RCCQkJMHhmZmZmCi0jZGVmaW5lIGJDQ19wb3dlcl9kQgkJCTB4ZmZmZjAwMDAKLSNkZWZpbmUgYm5vaXNlX3B3ZEIJCQkweGZmZmYKLSNkZWZpbmUgYlBvd2VyTWVhc1RMZW5ndGgJCTEwCi0jZGVmaW5lIGJQb3dlck1lYXNGTGVuZ3RoCQkzCi0jZGVmaW5lIGJSeF9IVF9CVwkJCTB4MQotI2RlZmluZSBiUnhTQwkJCQkweDYKLSNkZWZpbmUgYlJ4X0hUCQkJCTB4OAotI2RlZmluZSBiTkJfaW50Zl9kZXRfb24JCQkweDEKLSNkZWZpbmUgYkludGZfd2luX2xlbl9jZmcJCTB4MzAKLSNkZWZpbmUgYk5CX0ludGZfVEhfY2ZnCQkJMHgxYzAKLSNkZWZpbmUgYlJGR2FpbgkJCQkweDNmCi0jZGVmaW5lIGJUYWJsZVNlbAkJCTB4NDAKLSNkZWZpbmUgYlRSU1cJCQkJMHg4MAotI2RlZmluZSBiUnhTTlJfQQkJCTB4ZmYKLSNkZWZpbmUgYlJ4U05SX0IJCQkweGZmMDAKLSNkZWZpbmUgYlJ4U05SX0MJCQkweGZmMDAwMAotI2RlZmluZSBiUnhTTlJfRAkJCTB4ZmYwMDAwMDAKLSNkZWZpbmUgYlNOUkVWTVRMZW5ndGgJCQk4Ci0jZGVmaW5lIGJTTlJFVk1GTGVuZ3RoCQkJMQotI2RlZmluZSBiQ1NJMXN0CQkJCTB4ZmYKLSNkZWZpbmUgYkNTSTJuZAkJCQkweGZmMDAKLSNkZWZpbmUgYlJ4RVZNMXN0CQkJMHhmZjAwMDAKLSNkZWZpbmUgYlJ4RVZNMm5kCQkJMHhmZjAwMDAwMAotI2RlZmluZSBiU0lHRVZNCQkJCTB4ZmYKLSNkZWZpbmUgYlBXREIJCQkJMHhmZjAwCi0jZGVmaW5lIGJTR0lFTgkJCQkweDEwMDAwCi0KLSNkZWZpbmUgYlNGYWN0b3JRQU0xCQkJMHhmCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIGJTRmFjdG9yUUFNMgkJCTB4ZjAKLSNkZWZpbmUgYlNGYWN0b3JRQU0zCQkJMHhmMDAKLSNkZWZpbmUgYlNGYWN0b3JRQU00CQkJMHhmMDAwCi0jZGVmaW5lIGJTRmFjdG9yUUFNNQkJCTB4ZjAwMDAKLSNkZWZpbmUgYlNGYWN0b3JRQU02CQkJMHhmMDAwMAotI2RlZmluZSBiU0ZhY3RvclFBTTcJCQkweGYwMDAwMAotI2RlZmluZSBiU0ZhY3RvclFBTTgJCQkweGYwMDAwMDAKLSNkZWZpbmUgYlNGYWN0b3JRQU05CQkJMHhmMDAwMDAwMAotI2RlZmluZSBiQ1NJU2NoZW1lCQkJMHgxMDAwMDAKLQotI2RlZmluZSBiTm9pc2VMdmxUb3BTZXQJCQkweDMJLyogIFVzZWxlc3MgKi8KLSNkZWZpbmUgYkNoU21vb3RoCQkJMHg0Ci0jZGVmaW5lIGJDaFNtb290aENmZzEJCQkweDM4Ci0jZGVmaW5lIGJDaFNtb290aENmZzIJCQkweDFjMAotI2RlZmluZSBiQ2hTbW9vdGhDZmczCQkJMHhlMDAKLSNkZWZpbmUgYkNoU21vb3RoQ2ZnNAkJCTB4NzAwMAotI2RlZmluZSBiTVJDTW9kZQkJCTB4ODAwMDAwCi0jZGVmaW5lIGJUSEVWTUNmZwkJCTB4NzAwMDAwMAotCi0jZGVmaW5lIGJMb29wRml0VHlwZQkJCTB4MQkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiVXBkQ0ZPCQkJCTB4NDAKLSNkZWZpbmUgYlVwZENGT09mZkRhdGEJCQkweDgwCi0jZGVmaW5lIGJBZHZVcGRDRk8JCQkweDEwMAotI2RlZmluZSBiQWR2VGltZUN0cmwJCQkweDgwMAotI2RlZmluZSBiVXBkQ2xrbwkJCTB4MTAwMAotI2RlZmluZSBiRkMJCQkJMHg2MDAwCi0jZGVmaW5lIGJUcmFja2luZ01vZGUJCQkweDgwMDAKLSNkZWZpbmUgYlBoQ21wRW5hYmxlCQkJMHgxMDAwMAotI2RlZmluZSBiVXBkQ2xrb0xURgkJCTB4MjAwMDAKLSNkZWZpbmUgYkNvbUNoQ0ZPCQkJMHg0MDAwMAotI2RlZmluZSBiQ1NJRXN0aU1vZGUJCQkweDgwMDAwCi0jZGVmaW5lIGJBZHZVcGRFcXoJCQkweDEwMDAwMAotI2RlZmluZSBiVUNoQ2ZnCQkJCTB4NzAwMDAwMAotI2RlZmluZSBiVXBkRXF6CQkJCTB4ODAwMDAwMAotCi0vKiBSeCBQc2VkdW8gbm9pc2UgKi8KLSNkZWZpbmUgYlJ4UGVzdWRvTm9pc2VPbgkJMHgyMDAwMDAwMAkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiUnhQZXN1ZG9Ob2lzZV9BCQkweGZmCi0jZGVmaW5lIGJSeFBlc3Vkb05vaXNlX0IJCTB4ZmYwMAotI2RlZmluZSBiUnhQZXN1ZG9Ob2lzZV9DCQkweGZmMDAwMAotI2RlZmluZSBiUnhQZXN1ZG9Ob2lzZV9ECQkweGZmMDAwMDAwCi0jZGVmaW5lIGJQZXN1ZG9Ob2lzZVN0YXRlX0EJCTB4ZmZmZgotI2RlZmluZSBiUGVzdWRvTm9pc2VTdGF0ZV9CCQkweGZmZmYwMDAwCi0jZGVmaW5lIGJQZXN1ZG9Ob2lzZVN0YXRlX0MJCTB4ZmZmZgotI2RlZmluZSBiUGVzdWRvTm9pc2VTdGF0ZV9ECQkweGZmZmYwMDAwCi0KLS8qIDcuIFJGIFJlZ2lzdGVyICovCi0vKiBaZWJyYTEgKi8KLSNkZWZpbmUgYlplYnJhMV9IU1NJRW5hYmxlCQkweDgJCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIGJaZWJyYTFfVFJ4Q29udHJvbAkJMHhjMDAKLSNkZWZpbmUgYlplYnJhMV9UUnhHYWluU2V0dGluZwkJMHgwN2YKLSNkZWZpbmUgYlplYnJhMV9SeENvcm5lcgkJMHhjMDAKLSNkZWZpbmUgYlplYnJhMV9UeENoYXJnZVB1bXAJCTB4MzgKLSNkZWZpbmUgYlplYnJhMV9SeENoYXJnZVB1bXAJCTB4NwotI2RlZmluZSBiWmVicmExX0NoYW5uZWxOdW0JCTB4ZjgwCi0jZGVmaW5lIGJaZWJyYTFfVHhMUEZCVwkJCTB4NDAwCi0jZGVmaW5lIGJaZWJyYTFfUnhMUEZCVwkJCTB4NjAwCi0KLS8qIFplYnJhNCAqLwotI2RlZmluZSBiUlRMODI1NlJlZ01vZGVDdHJsMQkJMHgxMDAJLyogIFVzZWxlc3MgKi8KLSNkZWZpbmUgYlJUTDgyNTZSZWdNb2RlQ3RybDAJCTB4NDAKLSNkZWZpbmUgYlJUTDgyNTZfVHhMUEZCVwkJMHgxOAotI2RlZmluZSBiUlRMODI1Nl9SeExQRkJXCQkweDYwMAotCi0vKiBSVEw4MjU4ICovCi0jZGVmaW5lIGJSVEw4MjU4X1R4TFBGQlcJCTB4YwkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiUlRMODI1OF9SeExQRkJXCQkweGMwMAotI2RlZmluZSBiUlRMODI1OF9SU1NJTFBGQlcJCTB4YzAKLQotCi0vKiAgT3RoZXIgRGVmaW5pdGlvbiAqLwotCi0vKiBieXRlIGVuZGFibGUgZm9yIHNiX3dyaXRlICovCi0jZGVmaW5lIGJCeXRlMAkJCQkweDEJLyogIFVzZWxlc3MgKi8KLSNkZWZpbmUgYkJ5dGUxCQkJCTB4MgotI2RlZmluZSBiQnl0ZTIJCQkJMHg0Ci0jZGVmaW5lIGJCeXRlMwkJCQkweDgKLSNkZWZpbmUgYldvcmQwCQkJCTB4MwotI2RlZmluZSBiV29yZDEJCQkJMHhjCi0jZGVmaW5lIGJEV29yZAkJCQkweGYKLQotLyogZm9yIFB1dFJlZ3NldHRpbmcgJiBHZXRSZWdTZXR0aW5nIEJpdE1hc2sgKi8KLSNkZWZpbmUgYk1hc2tCeXRlMAkJCTB4ZmYJLyogIFJlZyAweGM1MCByT0ZETTBfWEFBR0NDb3JlfjB4QzZmICovCi0jZGVmaW5lIGJNYXNrQnl0ZTEJCQkweGZmMDAKLSNkZWZpbmUgYk1hc2tCeXRlMgkJCTB4ZmYwMDAwCi0jZGVmaW5lIGJNYXNrQnl0ZTMJCQkweGZmMDAwMDAwCi0jZGVmaW5lIGJNYXNrSFdvcmQJCQkweGZmZmYwMDAwCi0jZGVmaW5lIGJNYXNrTFdvcmQJCQkweDAwMDBmZmZmCi0jZGVmaW5lIGJNYXNrRFdvcmQJCQkweGZmZmZmZmZmCi0jZGVmaW5lIGJNYXNrMTJCaXRzCQkJMHhmZmYKLSNkZWZpbmUgYk1hc2tINEJpdHMJCQkweGYwMDAwMDAwCi0jZGVmaW5lIGJNYXNrT0ZETV9ECQkJMHhmZmMwMDAwMAotI2RlZmluZSBiTWFza0NDSwkJCTB4M2YzZjNmM2YKLQotLyogZm9yIFB1dFJGUmVnc2V0dGluZyAmIEdldFJGUmVnU2V0dGluZyBCaXRNYXNrICovCi0jZGVmaW5lCQliUkZSZWdPZmZzZXRNYXNrCTB4ZmZmZmYKLQotI2RlZmluZSBiRGlzYWJsZQkJCTB4MAotCi0jZGVmaW5lIExlZnRBbnRlbm5hCQkJMHgwCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIFJpZ2h0QW50ZW5uYQkJCTB4MQotCi0jZGVmaW5lIHRDaGVja1R4U3RhdHVzCQkJNTAwICAgLyogNTAwbXMgVXNlbGVzcyAqLwotI2RlZmluZSB0VXBkYXRlUnhDb3VudGVyCQkxMDAgICAvKiAxMDBtcyAqLwotCi0jZGVmaW5lIHJhdGVDQ0sJCQkJMAkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSByYXRlT0ZETQkJCTEKLSNkZWZpbmUgcmF0ZUhUCQkJCTIKLQotLyogZGVmaW5lIFJlZ2lzdGVyLUVuZCAqLwotI2RlZmluZSBiUE1BQ19FbmQJCQkweDFmZgkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiRlBHQVBIWTBfRW5kCQkJMHg4ZmYKLSNkZWZpbmUgYkZQR0FQSFkxX0VuZAkJCTB4OWZmCi0jZGVmaW5lIGJDQ0tQSFkwX0VuZAkJCTB4YWZmCi0jZGVmaW5lIGJPRkRNUEhZMF9FbmQJCQkweGNmZgotI2RlZmluZSBiT0ZETVBIWTFfRW5kCQkJMHhkZmYKLQotLyogZGVmaW5lIG1heCBkZWJ1ZyBpdGVtIGluIGVhY2ggZGVidWcgcGFnZSAqLwotLyogZGVmaW5lIGJNYXhJdGVtX0ZQR0FfUEhZMCAgICAgICAgMHg5ICovCi0vKiBkZWZpbmUgYk1heEl0ZW1fRlBHQV9QSFkxICAgICAgICAweDMgKi8KLS8qIGRlZmluZSBiTWF4SXRlbV9QSFlfMTFCICAgICAgICAgIDB4MTYgKi8KLS8qIGRlZmluZSBiTWF4SXRlbV9PRkRNX1BIWTAgICAgICAgIDB4MjkgKi8KLS8qIGRlZmluZSBiTWF4SXRlbV9PRkRNX1BIWTEgICAgICAgIDB4MCAqLwotCi0jZGVmaW5lIGJQTUFDQ29udHJvbAkJCTB4MAkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiV01BQ0NvbnRyb2wJCQkweDEKLSNkZWZpbmUgYldOSUNDb250cm9sCQkJMHgyCi0KLSNkZWZpbmUgUGF0aEEJCQkJMHgwCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIFBhdGhCCQkJCTB4MQotI2RlZmluZSBQYXRoQwkJCQkweDIKLSNkZWZpbmUgUGF0aEQJCQkJMHgzCi0KLS8qICBQYWdlQigweEIwMCkgKi8KLSNkZWZpbmUgclBkcF9BbnRBCQkJMHhiMDAKLSNkZWZpbmUgclBkcF9BbnRBXzQJCQkweGIwNAotI2RlZmluZSByUGRwX0FudEFfOAkJCTB4YjA4Ci0jZGVmaW5lIHJQZHBfQW50QV9DCQkJMHhiMGMKLSNkZWZpbmUgclBkcF9BbnRBXzE4CQkJMHhiMTgKLSNkZWZpbmUgclBkcF9BbnRBXzFDCQkJMHhiMWMKLSNkZWZpbmUgclBkcF9BbnRBXzIwCQkJMHhiMjAKLSNkZWZpbmUgclBkcF9BbnRBXzI0CQkJMHhiMjQKLQotI2RlZmluZSByQ29uZmlnX1BtcGRfQW50QQkJMHhiMjgKLSNkZWZpbmUgckNvbmZpZ19yYW02NHgxNgkJMHhiMmMKLQotI2RlZmluZSByQm5kQQkJCQkweGIzMAotI2RlZmluZSBySHNzaVBhcgkJCTB4YjM0Ci0KLSNkZWZpbmUgckNvbmZpZ19BbnRBCQkJMHhiNjgKLSNkZWZpbmUgckNvbmZpZ19BbnRCCQkJMHhiNmMKLQotI2RlZmluZSByUGRwX0FudEIJCQkweGI3MAotI2RlZmluZSByUGRwX0FudEJfNAkJCTB4Yjc0Ci0jZGVmaW5lIHJQZHBfQW50Ql84CQkJMHhiNzgKLSNkZWZpbmUgclBkcF9BbnRCX0MJCQkweGI3YwotI2RlZmluZSByUGRwX0FudEJfMTAJCQkweGI4MAotI2RlZmluZSByUGRwX0FudEJfMTQJCQkweGI4NAotI2RlZmluZSByUGRwX0FudEJfMTgJCQkweGI4OAotI2RlZmluZSByUGRwX0FudEJfMUMJCQkweGI4YwotI2RlZmluZSByUGRwX0FudEJfMjAJCQkweGI5MAotI2RlZmluZSByUGRwX0FudEJfMjQJCQkweGI5NAotCi0jZGVmaW5lIHJDb25maWdfUG1wZF9BbnRCCQkweGI5OAotCi0jZGVmaW5lIHJCbmRCCQkJCTB4YmEwCi0KLSNkZWZpbmUgckFQSwkJCQkweGJkOAotI2RlZmluZSByUG1fUngwX0FudEEJCQkweGJkYwotI2RlZmluZSByUG1fUngxX0FudEEJCQkweGJlMAotI2RlZmluZSByUG1fUngyX0FudEEJCQkweGJlNAotI2RlZmluZSByUG1fUngzX0FudEEJCQkweGJlOAotI2RlZmluZSByUG1fUngwX0FudEIJCQkweGJlYwotI2RlZmluZSByUG1fUngxX0FudEIJCQkweGJmMAotI2RlZmluZSByUG1fUngyX0FudEIJCQkweGJmNAotI2RlZmluZSByUG1fUngzX0FudEIJCQkweGJmOAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWw4NzIzUHdyU2VxLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsODcyM1B3clNlcS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzcxZDZiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWw4NzIzUHdyU2VxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotI2lmbmRlZiBfX0hBTDg3MjNQV1JTRVFfSF9fCi0jZGVmaW5lIF9fSEFMODcyM1BXUlNFUV9IX18KLS8qCi0JQ2hlY2sgZG9jdW1lbnQgV00tMjAxMTA2MDctUGF1bC1SVEw4NzIzQV9Qb3dlcl9BcmNoaXRlY3R1cmUtUjAyLnZzZAotCVRoZXJlIGFyZSA2IEhXIFBvd2VyIFN0YXRlczoKLQkwOiBQT0ZGLS1Qb3dlciBPZmYKLQkxOiBQRE4tLVBvd2VyIERvd24KLQkyOiBDQVJERU1VLS1DYXJkIEVtdWxhdGlvbgotCTM6IEFDVC0tQWN0aXZlIE1vZGUKLQk0OiBMUFMtLUxvdyBQb3dlciBTdGF0ZQotCTU6IFNVUy0tU3VzcGVuZAotCi0JVGhlIHRyYW5zaXNpb24gZnJvbSBkaWZmZXJlbnQgc3RhdGVzIGFyZSBkZWZpbmVkIGJlbG93Ci0JVFJBTlNfQ0FSREVNVV9UT19BQ1QKLQlUUkFOU19BQ1RfVE9fQ0FSREVNVQotCVRSQU5TX0NBUkRFTVVfVE9fU1VTCi0JVFJBTlNfU1VTX1RPX0NBUkRFTVUKLQlUUkFOU19DQVJERU1VX1RPX1BETgotCVRSQU5TX0FDVF9UT19MUFMKLQlUUkFOU19MUFNfVE9fQUNUCi0KLQlUUkFOU19FTkQKLSovCi0jaW5jbHVkZSAiSGFsUHdyU2VxQ21kLmgiCi0jaW5jbHVkZSAicnRsODcyM2Ffc3BlYy5oIgotCi0jZGVmaW5lCVJUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fQUNUX1NURVBTCTE1Ci0jZGVmaW5lCVJUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTCTE1Ci0jZGVmaW5lCVJUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fU1VTX1NURVBTCTE1Ci0jZGVmaW5lCVJUTDg3MjNBX1RSQU5TX1NVU19UT19DQVJERU1VX1NURVBTCTE1Ci0jZGVmaW5lCVJUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTCTE1Ci0jZGVmaW5lCVJUTDg3MjNBX1RSQU5TX1BETl9UT19DQVJERU1VX1NURVBTCTE1Ci0jZGVmaW5lCVJUTDg3MjNBX1RSQU5TX0FDVF9UT19MUFNfU1RFUFMJMTUKLSNkZWZpbmUJUlRMODcyM0FfVFJBTlNfTFBTX1RPX0FDVF9TVEVQUwkxNQotI2RlZmluZQlSVEw4NzIzQV9UUkFOU19FTkRfU1RFUFMJMQotCi0KLS8qIGZvcm1hdAotICogeyBvZmZzZXQsIGN1dF9tc2ssIGZhYl9tc2t8aW50ZXJmYWNlX21zaywgYmFzZXxjbWQsIG1zaywgdmFsdWUgfSwgIGNvbW1lbnRzIGhlcmUKLSAqLwotI2RlZmluZSBSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX0FDVAkJCQkJCQkJCQkJCQkJXAotCXsweDAwMjAsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMCksIEJJVCgwKX0sIC8qMHgyMFswXSA9IDFiJzEgZW5hYmxlIExET0ExMiBNQUNSTyBibG9jayBmb3IgYWxsIGludGVyZmFjZSovIFwKLQl7MHgwMDY3LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDQpLCAwfSwgLyoweDY3WzBdID0gMCB0byBkaXNhYmxlIEJUX0dQU19TRUwgcGlucyovCVwKLQl7MHgwMDAxLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9ERUxBWSwgMSwgUFdSU0VRX0RFTEFZX01TfSwvKkRlbGF5IDFtcyovICAgXAotCXsweDAwMDAsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoNSksIDB9LCAvKjB4MDBbNV0gPSAxYicwIHJlbGVhc2UgYW5hbG9nIElwcyB0byBkaWdpdGFsICwgMTppc29sYXRpb24qLyAgIFwKLQl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDIpLCAwfSwvKiBkaXNhYmxlIFNXIExQUyAweDA0WzEwXT0gMCovCVwKLQl7MHgwMDA2LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9QT0xMSU5HLCBCSVQoMSksIEJJVCgxKX0sLyogd2FpdCB0aWxsIDB4MDRbMTddID0gMSAgICBwb3dlciByZWFkeSovCVwKLQl7MHgwMDA2LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDApLCBCSVQoMCl9LC8qIHJlbGVhc2UgV0xPTiByZXNldCAgMHgwNFsxNl09IDEqLyBcCi0JezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCg3KSwgMH0sLyogZGlzYWJsZSBIV1BETiAweDA0WzE1XT0gMCovCVwKLQl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgKEJJVCg0KXxCSVQoMykpLCAwfSwvKiBkaXNhYmxlIFdMIHN1c3BlbmQqLwlcCi0JezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgwKSwgQklUKDApfSwvKiBwb2xsaW5nIHVudGlsIHJldHVybiAwKi8JXAotCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1BPTExJTkcsIEJJVCgwKSwgMH0sLyoqLwlcCi0JezB4MDA0RSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCg3KSwgMX0sLyoweDRDWzIzXSA9IDB4NEVbN10gPSAxLCBzd2l0Y2ggRFBEVF9TRUxfUCBvdXRwdXQgZnJvbSBXTCBCQiAqL1wKLQotI2RlZmluZSBSVEw4NzIzQV9UUkFOU19BQ1RfVE9fQ0FSREVNVQkJCQkJCQkJCQkJCQlcCi0JezB4MDAxRiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIDB4RkYsIDB9LC8qMHgxRls3OjBdID0gMCB0dXJuIG9mZiBSRiovCVwKLQl7MHgwMDRFLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDcpLCAwfSwvKjB4NENbMjNdID0gMHg0RVs3XSA9IDAsIHN3aXRjaCBEUERUX1NFTF9QIG91dHB1dCBmcm9tIHJlZ2lzdGVyIDB4NjVbMl0gKi9cCi0JezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgxKSwgQklUKDEpfSwgLyoweDA0WzldID0gMSB0dXJuIG9mZiBNQUMgYnkgSFcgc3RhdGUgbWFjaGluZSovCVwKLQl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9QT0xMSU5HLCBCSVQoMSksIDB9LCAvKndhaXQgdGlsbCAweDA0WzldID0gMCBwb2xsaW5nIHVudGlsIHJldHVybiAwIHRvIGRpc2FibGUqLwlcCi0JezB4MDAwMCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCg1KSwgQklUKDUpfSwgLyoweDAwWzVdID0gMWInMSBhbmFsb2cgSXBzIHRvIGRpZ2l0YWwgLCAxOmlzb2xhdGlvbiovICAgXAotCXsweDAwMjAsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMCksIDB9LCAvKjB4MjBbMF0gPSAxYicwIGRpc2FibGUgTERPQTEyIE1BQ1JPIGJsb2NrKi8gICBcCi0KLQotI2RlZmluZSBSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX1NVUwkJCQkJCQkJCQkJCQlcCi0JezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgzKXxCSVQoNCksIEJJVCgzKX0sIC8qMHgwNFsxMjoxMV0gPSAyYicwMSBlbmFibGUgV0wgc3VzcGVuZCovCi0KLSNkZWZpbmUgUlRMODcyM0FfVFJBTlNfU1VTX1RPX0NBUkRFTVUJCQkJCQkJCQkJCQkJXAotCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMykgfCBCSVQoNyksIDB9LCAvKmNsZWFyIHN1c3BlbmQgZW5hYmxlIGFuZCBwb3dlciBkb3duIGVuYWJsZSovCVwKLQl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDMpfEJJVCg0KSwgMH0sIC8qMHgwNFsxMjoxMV0gPSAyYicwMWVuYWJsZSBXTCBzdXNwZW5kKi8KLQotI2RlZmluZSBSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX0NBUkRESVMJCQkJCQkJCQkJCQkJXAotCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMyl8QklUKDQpLCBCSVQoMyl9LCAvKjB4MDRbMTI6MTFdID0gMmInMDEgZW5hYmxlIFdMIHN1c3BlbmQqLwlcCi0JezB4MDA0QSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgwKSwgQklUKDApfSwgLyoweDQ4WzE2XSA9IDEgdG8gZW5hYmxlIEdQSU85IGFzIEVYVCBXQUtFVVAqLwotCi0jZGVmaW5lIFJUTDg3MjNBX1RSQU5TX0NBUkRESVNfVE9fQ0FSREVNVQkJCQkJCQkJCQkJCQlcCi0JezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgzKSB8IEJJVCg3KSwgMH0sIC8qY2xlYXIgc3VzcGVuZCBlbmFibGUgYW5kIHBvd2VyIGRvd24gZW5hYmxlKi8JXAotCXsweDAwNEEsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMCksIDB9LCAvKjB4NDhbMTZdID0gMCB0byBkaXNhYmxlIEdQSU85IGFzIEVYVCBXQUtFVVAqLyAgIFwKLQl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDMpfEJJVCg0KSwgMH0sIC8qMHgwNFsxMjoxMV0gPSAyYicwMWVuYWJsZSBXTCBzdXNwZW5kKi8KLQotI2RlZmluZSBSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX1BETgkJCQkJCQkJCQkJCVwKLQl7MHgwMDA3LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgMHhGRiwgMHgyMH0sIC8qMHgwN1s3OjBdID0gMHgyMCBTT1Agb3B0aW9uIHRvIGRpc2FibGUgQkcvTUIvQUNLL1NXUiovICAgXAotCXsweDAwMDYsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMCksIDB9LC8qIDB4MDRbMTZdID0gMCovXAotCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoNyksIEJJVCg3KX0sLyogMHgwNFsxNV0gPSAxKi8KLQotI2RlZmluZSBSVEw4NzIzQV9UUkFOU19QRE5fVE9fQ0FSREVNVQkJCQkJCQkJCQkJCVwKLQl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDcpLCAwfSwvKiAweDA0WzE1XSA9IDAqLwotCi0jZGVmaW5lIFJUTDg3MjNBX1RSQU5TX0FDVF9UT19MUFMJCQkJCQkJCQkJCQkJCVwKLQl7MHgwNTIyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgMHhGRiwgMHhGRn0sLypUeCBQYXVzZSovCVwKLQl7MHgwNUY4LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9QT0xMSU5HLCAweEZGLCAwfSwvKlNob3VsZCBiZSB6ZXJvIGlmIG5vIHBhY2tldCBpcyB0cmFuc21pdHRpbmcqLwlcCi0JezB4MDVGOSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfUE9MTElORywgMHhGRiwgMH0sLypTaG91bGQgYmUgemVybyBpZiBubyBwYWNrZXQgaXMgdHJhbnNtaXR0aW5nKi8JXAotCXsweDA1RkEsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1BPTExJTkcsIDB4RkYsIDB9LC8qU2hvdWxkIGJlIHplcm8gaWYgbm8gcGFja2V0IGlzIHRyYW5zbWl0dGluZyovCVwKLQl7MHgwNUZCLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9QT0xMSU5HLCAweEZGLCAwfSwvKlNob3VsZCBiZSB6ZXJvIGlmIG5vIHBhY2tldCBpcyB0cmFuc21pdHRpbmcqLwlcCi0JezB4MDAwMiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgwKSwgMH0sLypDQ0sgYW5kIE9GRE0gYXJlIGRpc2FibGVkLCBhbmQgY2xvY2sgYXJlIGdhdGVkKi8JXAotCXsweDAwMDIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX0RFTEFZLCAwLCBQV1JTRVFfREVMQVlfVVN9LC8qRGVsYXkgMXVzKi8JXAotCXsweDAwMDIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMSksIDB9LC8qV2hvbGUgQkIgaXMgcmVzZXQqLwlcCi0JezB4MDEwMCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4MDN9LC8qUmVzZXQgTUFDIFRSWCovCVwKLQl7MHgwMTAxLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDEpLCAwfSwvKmNoZWNrIGlmIHJlbW92ZWQgbGF0ZXIqLwlcCi0JezB4MDU1MywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCg1KSwgQklUKDUpfSwvKlJlc3BvbmQgVHhPSyB0byBzY2hlZHVsZXIqLwotCi0jZGVmaW5lIFJUTDg3MjNBX1RSQU5TX0xQU19UT19BQ1QJCQkJCQkJCQkJCQkJCQlcCi0JezB4RkU1OCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4ODR9LCAvKlVTQiBSUFdNKi9cCi0JezB4MDAwMiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfREVMQVksIDAsIFBXUlNFUV9ERUxBWV9NU30sIC8qRGVsYXkqL1wKLQl7MHgwMDA4LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDQpLCAwfSwgLyouCTB4MDhbNF0gPSAwCQkgc3dpdGNoIFRTRiB0byA0ME0qL1wKLQl7MHgwMTA5LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9QT0xMSU5HLCBCSVQoNyksIDB9LCAvKlBvbGxpbmcgMHgxMDlbN109IDAgIFRTRiBpbiA0ME0qL1wKLQl7MHgwMDI5LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDYpfEJJVCg3KSwgMH0sIC8qLgkweDI5Wzc6Nl0gPSAyYicwMAkgZW5hYmxlIEJCIGNsb2NrKi9cCi0JezB4MDEwMSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgxKSwgQklUKDEpfSwgLyouCTB4MTAxWzFdID0gMSovXAotCXsweDAxMDAsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCAweEZGLCAweEZGfSwgLyouCTB4MTAwWzc6MF0gPSAweEZGCSBlbmFibGUgV01BQyBUUlgqL1wKLQl7MHgwMDAyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDEpfEJJVCgwKSwgQklUKDEpfEJJVCgwKX0sIC8qLgkweDAyWzE6MF0gPSAyYicxMQkgZW5hYmxlIEJCIG1hY3JvKi9cCi0JezB4MDUyMiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIDB4RkYsIDB9LCAvKi4JMHg1MjIgPSAwKi8KLQotI2RlZmluZSBSVEw4NzIzQV9UUkFOU19FTkQJCQkJCQkJCQkJCQkJCQlcCi0JezB4RkZGRiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIDAsIFBXUl9DTURfRU5ELCAwLCAwfSwKLQotCi1leHRlcm4gc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfcG93ZXJfb25fZmxvd1tSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX0FDVF9TVEVQUytSVEw4NzIzQV9UUkFOU19FTkRfU1RFUFNdOwotZXh0ZXJuIHN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX3JhZGlvX29mZl9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU107Ci1leHRlcm4gc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfY2FyZF9kaXNhYmxlX2Zsb3dbUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMrUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19QRE5fU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXTsKLWV4dGVybiBzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg3MjNBVV9jYXJkX2VuYWJsZV9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU107Ci1leHRlcm4gc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfc3VzcGVuZF9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fU1VTX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU107Ci1leHRlcm4gc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfcmVzdW1lX2Zsb3dbUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMrUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19TVVNfU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXTsKLWV4dGVybiBzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg3MjNBVV9od3Bkbl9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU107Ci1leHRlcm4gc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfZW50ZXJfbHBzX2Zsb3dbUlRMODcyM0FfVFJBTlNfQUNUX1RPX0xQU19TVEVQUytSVEw4NzIzQV9UUkFOU19FTkRfU1RFUFNdOwotZXh0ZXJuIHN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX2xlYXZlX2xwc19mbG93W1JUTDg3MjNBX1RSQU5TX0xQU19UT19BQ1RfU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsODcyM1VIV0ltZ19DRS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbDg3MjNVSFdJbWdfQ0UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgzNGIzYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsODcyM1VIV0ltZ19DRS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotI2lmbmRlZiBfX0lOQ19IQUw4NzIzVV9GV19JTUdfSAotI2RlZmluZSBfX0lOQ19IQUw4NzIzVV9GV19JTUdfSAotCi0vKkNyZWF0ZWQgb24gIDIwMTMvMDEvMTQsIDE1OjUxKi8KLQotLyogRlcgdjE2IGVuYWJsZSB1c2IgaW50ZXJydXB0ICovCi0jZGVmaW5lIFJ0bDg3MjNVSW1nQXJyYXlMZW5ndGggMjIxNzIKLWV4dGVybiB1OCBSdGw4NzIzVUZ3SW1nQXJyYXlbUnRsODcyM1VJbWdBcnJheUxlbmd0aF07Ci0jZGVmaW5lIFJ0bDg3MjNVQlRJbWdBcnJheUxlbmd0aCAxCi1leHRlcm4gdTggUnRsODcyM1VGd0JUSW1nQXJyYXlbUnRsODcyM1VCVEltZ0FycmF5TGVuZ3RoXTsKLQotI2RlZmluZSBSdGw4NzIzVVVNQ0JDdXRJbWdBcnJheVdpdGhCVExlbmd0aCAyNDExOAotI2RlZmluZSBSdGw4NzIzVVVNQ0JDdXRJbWdBcnJheVdpdGhvdXRCVExlbmd0aCAxOTIwMAotCi1leHRlcm4gdTggUnRsODcyM1VGd1VNQ0JDdXRJbWdBcnJheVdpdGhCVFtSdGw4NzIzVVVNQ0JDdXRJbWdBcnJheVdpdGhCVExlbmd0aF07Ci1leHRlcm4gdTggUnRsODcyM1VGd1VNQ0JDdXRJbWdBcnJheVdpdGhvdXRCVFtSdGw4NzIzVVVNQ0JDdXRJbWdBcnJheVdpdGhvdXRCVExlbmd0aF07Ci0KLSNkZWZpbmUgUnRsODcyM1NVTUNCQ3V0TVBJbWdBcnJheUxlbmd0aCAyNDE3NAotZXh0ZXJuIGNvbnN0IHU4IFJ0bDg3MjNTRndVTUNCQ3V0TVBJbWdBcnJheVtSdGw4NzIzU1VNQ0JDdXRNUEltZ0FycmF5TGVuZ3RoXTsKLQotI2RlZmluZSBSdGw4NzIzRUJUSW1nQXJyYXlMZW5ndGggMTUyNzYKLWV4dGVybiB1OCBSdGw4NzIzRUZ3QlRJbWdBcnJheVtSdGw4NzIzRUJUSW1nQXJyYXlMZW5ndGhdOwotCi0jZGVmaW5lIFJ0bDg3MjNVUEhZX1JFR19BcnJheV9QR0xlbmd0aCAzMzYKLWV4dGVybiB1MzIgUnRsODcyM1VQSFlfUkVHX0FycmF5X1BHW1J0bDg3MjNVUEhZX1JFR19BcnJheV9QR0xlbmd0aF07Ci0jZGVmaW5lIFJ0bDg3MjNVTUFDUEhZX0FycmF5X1BHTGVuZ3RoIDEKLWV4dGVybiB1MzIgUnRsODcyM1VNQUNQSFlfQXJyYXlfUEdbUnRsODcyM1VNQUNQSFlfQXJyYXlfUEdMZW5ndGhdOwotCi0jZW5kaWYgLyogaWZuZGVmIF9fSU5DX0hBTDg3MjNVX0ZXX0lNR19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsRE1PdXRTcmM4NzIzQS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbERNT3V0U3JjODcyM0EuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc2NTFmNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsRE1PdXRTcmM4NzIzQS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZglfX1JUTDg3MjNBX09ETV9IX18KLSNkZWZpbmUgX19SVEw4NzIzQV9PRE1fSF9fCi0vKiAgKi8KLQotI2RlZmluZQlSU1NJX0NDSwkwCi0jZGVmaW5lCVJTU0lfT0ZETQkxCi0jZGVmaW5lCVJTU0lfREVGQVVMVAkyCi0KLSNkZWZpbmUgSVFLX01BQ19SRUdfTlVNCQk0Ci0jZGVmaW5lIElRS19BRERBX1JFR19OVU0JCTE2Ci0jZGVmaW5lIElRS19CQl9SRUdfTlVNCQkJOQotI2RlZmluZSBIUF9USEVSTUFMX05VTQkJOAotCi0KLS8qICAqLwotLyogIHN0cnVjdHVyZSBhbmQgZGVmaW5lICovCi0vKiAgKi8KLQotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IE1hcmNvIERlZmluaXRpb24tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogZGVmaW5lIERNX011bHRpU1RBX0luaXRHYWluQ2hhbmdlTm90aWZ5KEV2ZW50KSB7RE1fRGlnVGFibGUuQ3VyTXVsdGlTVEFDb25uZWN0U3RhdGUgPSBFdmVudDt9ICovCi0KLQotLyogICovCi0vKiAgZnVuY3Rpb24gcHJvdG90eXBlICovCi0vKiAgKi8KLQotLyogICovCi0vKiAgSVEgY2FsaWJyYXRlICovCi0vKiAgKi8KLXZvaWQgcnRsODcyM2FfcGh5X2lxX2NhbGlicmF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCBib29sIGJSZUNvdmVyeSk7Ci0KLS8qICAqLwotLyogIExDIGNhbGlicmF0ZSAqLwotLyogICovCi12b2lkIHJ0bDg3MjNhX3BoeV9sY19jYWxpYnJhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlcik7Ci0KLS8qICAqLwotLyogIEFQIGNhbGlicmF0ZSAqLwotLyogICovCi12b2lkIHJ0bDg3MjNhX3BoeV9hcF9jYWxpYnJhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgY2hhciBkZWx0YSk7Ci0KLXZvaWQgcnRsODcyM2Ffb2RtX2NoZWNrX3R4X3Bvd2VyX3RyYWNraW5nKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbEhXSW1nODcyM0FfQkIuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxIV0ltZzg3MjNBX0JCLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNzYwOTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbEhXSW1nODcyM0FfQkIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0qIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0qIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0qIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotKiBtb3JlIGRldGFpbHMuCi0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19JTkNfQkJfODcyM0FfSFdfSU1HX0gKLSNkZWZpbmUgX19JTkNfQkJfODcyM0FfSFdfSU1HX0gKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHQ19UQUJfMVQuVFhUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgT0RNX1JlYWRBbmRDb25maWdfQUdDX1RBQl8xVF84NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhZX1JFR18xVC5UWFQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBPRE1fUmVhZEFuZENvbmZpZ19QSFlfUkVHXzFUXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBQSFlfUkVHX01QLlRYVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIE9ETV9SZWFkQW5kQ29uZmlnX1BIWV9SRUdfTVBfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotI2VuZGlmIC8qICBlbmQgb2YgSFdJTUdfU1VQUE9SVCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbEhXSW1nODcyM0FfRlcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxIV0ltZzg3MjNBX0ZXLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZTM2M2IuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbEhXSW1nODcyM0FfRlcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0qIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0qIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0qIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotKiBtb3JlIGRldGFpbHMuCi0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19JTkNfRldfODcyM0FfSFdfSU1HX0gKLSNkZWZpbmUgX19JTkNfRldfODcyM0FfSFdfSU1HX0gKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRsODcyM2Z3X0IuVFhUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgT0RNX1JlYWRGaXJtd2FyZV84NzIzQV9ydGw4NzIzZndfQihzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JCQkJCXU4ICpwRmlybXdhcmUsIHUzMiAqcEZpcm13YXJlU2l6ZSk7Ci0KLSNlbmRpZiAvKiAgZW5kIG9mIEhXSU1HX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxIV0ltZzg3MjNBX01BQy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbEhXSW1nODcyM0FfTUFDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMWJlMWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbEhXSW1nODcyM0FfTUFDLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0qIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSogbW9yZSBkZXRhaWxzLgotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fSU5DX01BQ184NzIzQV9IV19JTUdfSAotI2RlZmluZSBfX0lOQ19NQUNfODcyM0FfSFdfSU1HX0gKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BQ19SRUcuVFhUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgT0RNX1JlYWRBbmRDb25maWdfTUFDX1JFR184NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi0jZW5kaWYgLyogIGVuZCBvZiBIV0lNR19TVVBQT1JUICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsSFdJbWc4NzIzQV9SRi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbEhXSW1nODcyM0FfUkYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhZjFjMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsSFdJbWc4NzIzQV9SRi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0qIG1vcmUgZGV0YWlscy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0lOQ19SRl84NzIzQV9IV19JTUdfSAotI2RlZmluZSBfX0lOQ19SRl84NzIzQV9IV19JTUdfSAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9BXzFULlRYVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIE9ETV9SZWFkQW5kQ29uZmlnX1JhZGlvQV8xVF84NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi0jZW5kaWYgLyogIGVuZCBvZiBIV0lNR19TVVBQT1JUICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsUHdyU2VxQ21kLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsUHdyU2VxQ21kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZTAzYTMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbFB3clNlcUNtZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19IQUxQV1JTRVFDTURfSF9fCi0jZGVmaW5lIF9fSEFMUFdSU0VRQ01EX0hfXwotCi0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgUFdSX0NNRF9SRUFECQkJMHgwMAotICAgICAvKiAgb2Zmc2V0OiB0aGUgcmVhZCByZWdpc3RlciBvZmZzZXQgKi8KLSAgICAgLyogIG1zazogdGhlIG1hc2sgb2YgdGhlIHJlYWQgdmFsdWUgKi8KLSAgICAgLyogIHZhbHVlOiBOL0EsIGxlZnQgYnkgMCAqLwotICAgICAvKiAgbm90ZTogZGlydmVyIHNoYWxsIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIGJ5IHJlYWQgJiBtc2sgKi8KLQotI2RlZmluZSBQV1JfQ01EX1dSSVRFCQkJMHgwMQotICAgICAvKiAgb2Zmc2V0OiB0aGUgcmVhZCByZWdpc3RlciBvZmZzZXQgKi8KLSAgICAgLyogIG1zazogdGhlIG1hc2sgb2YgdGhlIHdyaXRlIGJpdHMgKi8KLSAgICAgLyogIHZhbHVlOiB3cml0ZSB2YWx1ZSAqLwotICAgICAvKiAgbm90ZTogZHJpdmVyIHNoYWxsIGltcGxlbWVudCB0aGlzIGNtZCBieSByZWFkICYgbXNrIGFmdGVyIHdyaXRlICovCi0KLSNkZWZpbmUgUFdSX0NNRF9QT0xMSU5HCQkJMHgwMgotICAgICAvKiAgb2Zmc2V0OiB0aGUgcmVhZCByZWdpc3RlciBvZmZzZXQgKi8KLSAgICAgLyogIG1zazogdGhlIG1hc2sgb2YgdGhlIHBvbGxlZCB2YWx1ZSAqLwotICAgICAvKiAgdmFsdWU6IHRoZSB2YWx1ZSB0byBiZSBwb2xsZWQsIG1hc2tlZCBieSB0aGUgbXNkIGZpZWxkLiAqLwotICAgICAvKiAgbm90ZTogZHJpdmVyIHNoYWxsIGltcGxlbWVudCB0aGlzIGNtZCBieSAqLwotICAgICAvKiAgZG97ICovCi0gICAgIC8qICBpZiggKFJlYWQob2Zmc2V0KSAmIG1zaykgPT0gKHZhbHVlICYgbXNrKSApICovCi0gICAgIC8qICBicmVhazsgKi8KLSAgICAgLyogIH0gd2hpbGUobm90IHRpbWVvdXQpOyAqLwotCi0jZGVmaW5lIFBXUl9DTURfREVMQVkJCQkweDAzCi0gICAgIC8qICBvZmZzZXQ6IHRoZSB2YWx1ZSB0byBkZWxheSAqLwotICAgICAvKiAgbXNrOiBOL0EgKi8KLSAgICAgLyogIHZhbHVlOiB0aGUgdW5pdCBvZiBkZWxheSwgMDogdXMsIDE6IG1zICovCi0KLSNkZWZpbmUgUFdSX0NNRF9FTkQJCQkJMHgwNAotICAgICAvKiAgb2Zmc2V0OiBOL0EgKi8KLSAgICAgLyogIG1zazogTi9BICovCi0gICAgIC8qICB2YWx1ZTogTi9BICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIDMgVGhlIHZhbHVlIG9mIGJhc2U6IDQgYml0cyAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgLyogIGRlZmluZSB0aGUgYmFzZSBhZGRyZXNzIG9mIGVhY2ggYmxvY2sgKi8KLSNkZWZpbmUgUFdSX0JBU0VBRERSX01BQwkJMHgwMAotI2RlZmluZSBQV1JfQkFTRUFERFJfVVNCCQkweDAxCi0jZGVmaW5lIFBXUl9CQVNFQUREUl9QQ0lFCQkweDAyCi0jZGVmaW5lIFBXUl9CQVNFQUREUl9TRElPCQkweDAzCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIDMgVGhlIHZhbHVlIG9mIGludGVyZmFjZV9tc2s6IDQgYml0cyAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQlQV1JfSU5URl9TRElPX01TSwkJQklUKDApCi0jZGVmaW5lCVBXUl9JTlRGX1VTQl9NU0sJCUJJVCgxKQotI2RlZmluZQlQV1JfSU5URl9QQ0lfTVNLCQlCSVQoMikKLSNkZWZpbmUJUFdSX0lOVEZfQUxMX01TSwkJKEJJVCgwKXxCSVQoMSl8QklUKDIpfEJJVCgzKSkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogMyBUaGUgdmFsdWUgb2YgZmFiX21zazogNCBiaXRzICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCVBXUl9GQUJfVFNNQ19NU0sJCUJJVCgwKQotI2RlZmluZQlQV1JfRkFCX1VNQ19NU0sJCQlCSVQoMSkKLSNkZWZpbmUJUFdSX0ZBQl9BTExfTVNLCQkJKEJJVCgwKXxCSVQoMSl8QklUKDIpfEJJVCgzKSkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogMyBUaGUgdmFsdWUgb2YgY3V0X21zazogOCBiaXRzICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCVBXUl9DVVRfVEVTVENISVBfTVNLCUJJVCgwKQotI2RlZmluZQlQV1JfQ1VUX0FfTVNLCQkJQklUKDEpCi0jZGVmaW5lCVBXUl9DVVRfQl9NU0sJCQlCSVQoMikKLSNkZWZpbmUJUFdSX0NVVF9DX01TSwkJCUJJVCgzKQotI2RlZmluZQlQV1JfQ1VUX0RfTVNLCQkJQklUKDQpCi0jZGVmaW5lCVBXUl9DVVRfRV9NU0sJCQlCSVQoNSkKLSNkZWZpbmUJUFdSX0NVVF9GX01TSwkJCUJJVCg2KQotI2RlZmluZQlQV1JfQ1VUX0dfTVNLCQkJQklUKDcpCi0jZGVmaW5lCVBXUl9DVVRfQUxMX01TSwkJCTB4RkYKLQotCi1lbnVtIHB3cnNlcV9kZWxheV91bml0IHsKLQlQV1JTRVFfREVMQVlfVVMsCi0JUFdSU0VRX0RFTEFZX01TLAotfTsKLQotc3RydWN0IHdsYW5fcHdyX2NmZyB7Ci0JdTE2IG9mZnNldDsKLQl1OCBjdXRfbXNrOwotCXU4IGZhYl9tc2s6NDsKLQl1OCBpbnRlcmZhY2VfbXNrOjQ7Ci0JdTggYmFzZTo0OwotCXU4IGNtZDo0OwotCXU4IG1zazsKLQl1OCB2YWx1ZTsKLX07Ci0KLQotI2RlZmluZSBHRVRfUFdSX0NGR19PRkZTRVQoX19QV1JfQ01EKQkJX19QV1JfQ01ELm9mZnNldAotI2RlZmluZSBHRVRfUFdSX0NGR19DVVRfTUFTSyhfX1BXUl9DTUQpCQlfX1BXUl9DTUQuY3V0X21zawotI2RlZmluZSBHRVRfUFdSX0NGR19GQUJfTUFTSyhfX1BXUl9DTUQpCQlfX1BXUl9DTUQuZmFiX21zawotI2RlZmluZSBHRVRfUFdSX0NGR19JTlRGX01BU0soX19QV1JfQ01EKQlfX1BXUl9DTUQuaW50ZXJmYWNlX21zawotI2RlZmluZSBHRVRfUFdSX0NGR19CQVNFKF9fUFdSX0NNRCkJCQlfX1BXUl9DTUQuYmFzZQotI2RlZmluZSBHRVRfUFdSX0NGR19DTUQoX19QV1JfQ01EKQkJCV9fUFdSX0NNRC5jbWQKLSNkZWZpbmUgR0VUX1BXUl9DRkdfTUFTSyhfX1BXUl9DTUQpCQkJX19QV1JfQ01ELm1zawotI2RlZmluZSBHRVRfUFdSX0NGR19WQUxVRShfX1BXUl9DTUQpCQlfX1BXUl9DTUQudmFsdWUKLQotCi0vKiAgKi8KLS8qCVByb3RvdHlwZSBvZiBwcm90ZWN0ZWQgZnVuY3Rpb24uICovCi0vKiAgKi8KLXU4IEhhbFB3clNlcUNtZFBhcnNpbmcyM2EoCi0Jc3RydWN0IHJ0d19hZGFwdGVyCQkqcGFkYXB0ZXIsCi0JdTgJCQkJQ3V0VmVyc2lvbiwKLQl1OAkJCQlGYWJWZXJzaW9uLAotCXU4CQkJCUludGVyZmFjZVR5cGUsCi0Jc3RydWN0IHdsYW5fcHdyX2NmZwlQd3JDZmdDbWRbXSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbFZlckRlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbFZlckRlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTBlNGVhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxWZXJEZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19IQUxfVkVSU0lPTl9ERUZfSF9fCi0jZGVmaW5lIF9fSEFMX1ZFUlNJT05fREVGX0hfXwotCi1lbnVtIGhhbF9pY190eXBlIHsKLQlDSElQXzgxOTJTCQk9CTAsCi0JQ0hJUF84MTg4Qwk9CTEsCi0JQ0hJUF84MTkyQwk9CTIsCi0JQ0hJUF84MTkyRAk9CTMsCi0JQ0hJUF84NzIzQQk9CTQsCi0JQ0hJUF84MTg4RQk9CTUsCi0JQ0hJUF84ODgxQQk9CTYsCi0JQ0hJUF84ODEyQQk9CTcsCi0JQ0hJUF84ODIxQQk9CTgsCi0JQ0hJUF84NzIzQgk9CTksCi0JQ0hJUF84MTkyRQkJPQkxMCwKLX07Ci0KLWVudW0gaGFsX2NoaXBfdHlwZSB7Ci0JVEVTVF9DSElQCQk9CTAsCi0JTk9STUFMX0NISVAJCT0JMSwKLQlGUEdBCQkJPQkyLAotfTsKLQotZW51bSBoYWxfY3V0X3ZlcnNpb24gewotCUFfQ1VUX1ZFUlNJT04JCT0JMCwKLQlCX0NVVF9WRVJTSU9OCQk9CTEsCi0JQ19DVVRfVkVSU0lPTgkJPQkyLAotCURfQ1VUX1ZFUlNJT04JCT0JMywKLQlFX0NVVF9WRVJTSU9OCQk9CTQsCi0JRl9DVVRfVkVSU0lPTgkJPQk1LAotCUdfQ1VUX1ZFUlNJT04JCT0JNiwKLX07Ci0KLS8qICBIQUxfTWFudWZhY3R1cmVyICovCi1lbnVtIGhhbF92ZW5kb3IgewotCUNISVBfVkVORE9SX1RTTUMJPQkwLAotCUNISVBfVkVORE9SX1VNQwkJPQkxLAotfTsKLQotc3RydWN0IGhhbF92ZXJzaW9uIHsKLQllbnVtIGhhbF9pY190eXBlCUlDVHlwZTsKLQllbnVtIGhhbF9jaGlwX3R5cGUJQ2hpcFR5cGU7Ci0JZW51bSBoYWxfY3V0X3ZlcnNpb24JQ1VUVmVyc2lvbjsKLQllbnVtIGhhbF92ZW5kb3IJCVZlbmRvclR5cGU7Ci0JdTgJCQlST01WZXI7Ci19OwotCi0vKiAgR2V0IGVsZW1lbnQgKi8KLSNkZWZpbmUgR0VUX0NWSURfSUNfVFlQRSh2ZXJzaW9uKQkoKHZlcnNpb24pLklDVHlwZSkKLSNkZWZpbmUgR0VUX0NWSURfQ0hJUF9UWVBFKHZlcnNpb24pCSgodmVyc2lvbikuQ2hpcFR5cGUpCi0jZGVmaW5lIEdFVF9DVklEX01BTlVGQUNUVUVSKHZlcnNpb24pCSgodmVyc2lvbikuVmVuZG9yVHlwZSkKLSNkZWZpbmUgR0VUX0NWSURfQ1VUX1ZFUlNJT04odmVyc2lvbikJKCh2ZXJzaW9uKS5DVVRWZXJzaW9uKQotI2RlZmluZSBHRVRfQ1ZJRF9ST01fVkVSU0lPTih2ZXJzaW9uKQkoKCh2ZXJzaW9uKS5ST01WZXIpICYgUk9NX1ZFUlNJT05fTUFTSykKLQotLyogQ29tbW9uIE1hY3JvLiAtLSAqLwotCi0jZGVmaW5lIElTXzgxWFhDKHZlcnNpb24pCQkJXAotCSgoKEdFVF9DVklEX0lDX1RZUEUodmVyc2lvbikgPT0gQ0hJUF84MTkyQykgfHwJXAotCSAoR0VUX0NWSURfSUNfVFlQRSh2ZXJzaW9uKSA9PSBDSElQXzgxODhDKSkgPyB0cnVlIDogZmFsc2UpCi0jZGVmaW5lIElTXzg3MjNfU0VSSUVTKHZlcnNpb24pCQkJXAotCSgoR0VUX0NWSURfSUNfVFlQRSh2ZXJzaW9uKSA9PSBDSElQXzg3MjNBKSA/IHRydWUgOiBmYWxzZSkKLQotI2RlZmluZSBJU19URVNUX0NISVAodmVyc2lvbikJCQlcCi0JKChHRVRfQ1ZJRF9DSElQX1RZUEUodmVyc2lvbikgPT0gVEVTVF9DSElQKSA/IHRydWUgOiBmYWxzZSkKLSNkZWZpbmUgSVNfTk9STUFMX0NISVAodmVyc2lvbikJCQlcCi0JKChHRVRfQ1ZJRF9DSElQX1RZUEUodmVyc2lvbikgPT0gTk9STUFMX0NISVApID8gdHJ1ZSA6IGZhbHNlKQotCi0jZGVmaW5lIElTX0FfQ1VUKHZlcnNpb24pCQkJXAotCSgoR0VUX0NWSURfQ1VUX1ZFUlNJT04odmVyc2lvbikgPT0gQV9DVVRfVkVSU0lPTikgPyB0cnVlIDogZmFsc2UpCi0jZGVmaW5lIElTX0JfQ1VUKHZlcnNpb24pCQkJXAotCSgoR0VUX0NWSURfQ1VUX1ZFUlNJT04odmVyc2lvbikgPT0gQl9DVVRfVkVSU0lPTikgPyB0cnVlIDogZmFsc2UpCi0jZGVmaW5lIElTX0NfQ1VUKHZlcnNpb24pCQkJXAotCSgoR0VUX0NWSURfQ1VUX1ZFUlNJT04odmVyc2lvbikgPT0gQ19DVVRfVkVSU0lPTikgPyB0cnVlIDogZmFsc2UpCi0jZGVmaW5lIElTX0RfQ1VUKHZlcnNpb24pCQkJXAotCSgoR0VUX0NWSURfQ1VUX1ZFUlNJT04odmVyc2lvbikgPT0gRF9DVVRfVkVSU0lPTikgPyB0cnVlIDogZmFsc2UpCi0jZGVmaW5lIElTX0VfQ1VUKHZlcnNpb24pCQkJXAotCSgoR0VUX0NWSURfQ1VUX1ZFUlNJT04odmVyc2lvbikgPT0gRV9DVVRfVkVSU0lPTikgPyB0cnVlIDogZmFsc2UpCi0KLSNkZWZpbmUgSVNfQ0hJUF9WRU5ET1JfVFNNQyh2ZXJzaW9uKQkJXAotCSgoR0VUX0NWSURfTUFOVUZBQ1RVRVIodmVyc2lvbikgPT0gQ0hJUF9WRU5ET1JfVFNNQykgPyB0cnVlIDogZmFsc2UpCi0jZGVmaW5lIElTX0NISVBfVkVORE9SX1VNQyh2ZXJzaW9uKQkJXAotCSgoR0VUX0NWSURfTUFOVUZBQ1RVRVIodmVyc2lvbikgPT0gQ0hJUF9WRU5ET1JfVU1DKSA/IHRydWUgOiBmYWxzZSkKLQotLyogQ2hpcCB2ZXJzaW9uIE1hY3JvLiAtLSAqLwotCi0jZGVmaW5lIElTXzgxeHhDX1ZFTkRPUl9VTUNfQV9DVVQodmVyc2lvbikJCQlcCi0JKElTXzgxWFhDKHZlcnNpb24pPyhJU19DSElQX1ZFTkRPUl9VTUModmVyc2lvbikgPwlcCi0JKElTX0FfQ1VUKHZlcnNpb24pID8gdHJ1ZSA6IGZhbHNlKSA6IGZhbHNlKSA6IGZhbHNlKQotI2RlZmluZSBJU184MXh4Q19WRU5ET1JfVU1DX0JfQ1VUKHZlcnNpb24pCQkJXAotCShJU184MVhYQyh2ZXJzaW9uKSA/IChJU19DSElQX1ZFTkRPUl9VTUModmVyc2lvbikgPwlcCi0JIChJU19CX0NVVCh2ZXJzaW9uKSA/IHRydWUgOiBmYWxzZSkgOiBmYWxzZSk6IGZhbHNlKQotI2RlZmluZSBJU184MXh4Q19WRU5ET1JfVU1DX0NfQ1VUKHZlcnNpb24pCQkJXAotCShJU184MVhYQyh2ZXJzaW9uKT8oSVNfQ0hJUF9WRU5ET1JfVU1DKHZlcnNpb24pID8JXAotCShJU19DX0NVVCh2ZXJzaW9uKSA/IHRydWUgOiBmYWxzZSkgOiBmYWxzZSkgOiBmYWxzZSkKLSNkZWZpbmUgSVNfODcyM0FfQV9DVVQodmVyc2lvbikJCQkJXAotCSgoSVNfODcyM19TRVJJRVModmVyc2lvbikpID8gKElTX0FfQ1VUKHZlcnNpb24pID8gdHJ1ZSA6IGZhbHNlKSA6IGZhbHNlKQotI2RlZmluZSBJU184NzIzQV9CX0NVVCh2ZXJzaW9uKQkJCQkJXAotCSgoSVNfODcyM19TRVJJRVModmVyc2lvbikpID8gKElTX0JfQ1VUKHZlcnNpb24pID8gdHJ1ZSA6IGZhbHNlKSA6IGZhbHNlKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9kcnZfdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9kcnZfdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgzNDYzYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvZHJ2X3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQlGb3IgdHlwZSBkZWZpbmVzIGFuZCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotI2lmbmRlZiBfX0RSVl9UWVBFU19IX18KLSNkZWZpbmUgX19EUlZfVFlQRVNfSF9fCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8d2xhbl9ic3NkZWYuaD4KLQotCi1lbnVtIF9OSUNfVkVSU0lPTiB7Ci0JUlRMODcxMV9OSUMsCi0JUlRMODcxMl9OSUMsCi0JUlRMODcxM19OSUMsCi0JUlRMODcxNl9OSUMKLQotfTsKLQotCi0jaW5jbHVkZSA8cnR3X2h0Lmg+Ci0KLSNpbmNsdWRlIDxydHdfY21kLmg+Ci0jaW5jbHVkZSA8cnR3X3htaXQuaD4KLSNpbmNsdWRlIDxydHdfcmVjdi5oPgotI2luY2x1ZGUgPGhhbF9pbnRmLmg+Ci0jaW5jbHVkZSA8aGFsX2NvbS5oPgotI2luY2x1ZGUgPHJ0d19zZWN1cml0eS5oPgotI2luY2x1ZGUgPHJ0d19wd3JjdHJsLmg+Ci0jaW5jbHVkZSA8cnR3X2lvLmg+Ci0jaW5jbHVkZSA8cnR3X2VlcHJvbS5oPgotI2luY2x1ZGUgPHN0YV9pbmZvLmg+Ci0jaW5jbHVkZSA8cnR3X21sbWUuaD4KLSNpbmNsdWRlIDxydHdfZGVidWcuaD4KLSNpbmNsdWRlIDxydHdfcmYuaD4KLSNpbmNsdWRlIDxydHdfZXZlbnQuaD4KLSNpbmNsdWRlIDxydHdfbWxtZV9leHQuaD4KLSNpbmNsdWRlIDxydHdfYXAuaD4KLQotI2luY2x1ZGUgImlvY3RsX2NmZzgwMjExLmgiCi0KLXN0cnVjdCByZWdpc3RyeV9wcml2IHsKLQl1OAljaGlwX3ZlcnNpb247Ci0JdTgJcmZpbnRmczsKLQlzdHJ1Y3QJY2ZnODAyMTFfc3NpZCBzc2lkOwotCXU4CWNoYW5uZWw7LyogYWQtaG9jIHN1cHBvcnQgcmVxdWlyZW1lbnQgKi8KLQl1OAl3aXJlbGVzc19tb2RlOy8qIEEsIEIsIEcsIGF1dG8gKi8KLQl1OAlzY2FuX21vZGU7LyogYWN0aXZlLCBwYXNzaXZlICovCi0JdTgJcHJlYW1ibGU7LyogbG9uZywgc2hvcnQsIGF1dG8gKi8KLQl1OAl2cnRsX2NhcnJpZXJfc2Vuc2U7LyogRW5hYmxlLCBEaXNhYmxlLCBBdXRvICovCi0JdTgJdmNzX3R5cGU7LyogUlRTL0NUUywgQ1RTLXRvLXNlbGYgKi8KLQl1MTYJcnRzX3RocmVzaDsKLQl1MTYgIGZyYWdfdGhyZXNoOwotCXU4CWFkaG9jX3R4X3B3cjsKLQl1OAlzb2Z0X2FwOwotCXU4CXBvd2VyX21nbnQ7Ci0JdTgJaXBzX21vZGU7Ci0JdTgJc21hcnRfcHM7Ci0JdTgJbG9uZ19yZXRyeV9sbXQ7Ci0JdTgJc2hvcnRfcmV0cnlfbG10OwotCXUxNglidXN5X3RocmVzaDsKLQl1OAlhY2tfcG9saWN5OwotCXU4CXNvZnR3YXJlX2VuY3J5cHQ7Ci0JdTgJc29mdHdhcmVfZGVjcnlwdDsKLQl1OAlhY21fbWV0aG9kOwotCSAgLyogVUFQU0QgKi8KLQl1OAl3bW1fZW5hYmxlOwotCXU4CXVhcHNkX2VuYWJsZTsKLQotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICAgIGRldl9uZXR3b3JrOwotCi0JdTgJaHRfZW5hYmxlOwotCXU4CWNidzQwX2VuYWJsZTsKLQl1OAlhbXBkdV9lbmFibGU7LyogZm9yIHR4ICovCi0JdTgJcnhfc3RiYzsKLQl1OAlhbXBkdV9hbXNkdTsvKiBBLU1QRFUgU3VwcG9ydHMgQS1NU0RVIGlzIHBlcm1pdHRlZCAqLwotCXU4CWxvd3JhdGVfdHdvX3htaXQ7Ci0KLQl1OAlyZl9jb25maWc7Ci0JdTgJbG93X3Bvd2VyOwotCi0JdTgJd2lmaV9zcGVjOy8qICAhdHVyYm9fbW9kZSAqLwotCi0JdTgJY2hhbm5lbF9wbGFuOwotI2lmZGVmIENPTkZJR184NzIzQVVfQlRfQ09FWElTVAotCXU4CWJ0Y29leDsKLQl1OAlidF9pc287Ci0JdTgJYnRfc2NvOwotCXU4CWJ0X2FtcGR1OwotI2VuZGlmCi0JYm9vbAliQWNjZXB0QWRkYmFSZXE7Ci0KLQl1OAlhbnRkaXZfY2ZnOwotCXU4CWFudGRpdl90eXBlOwotCi0JdTgJaHdwZG5fbW9kZTsvKiAwOmRpc2FibGUsMTplbmFibGUsMjpkZWNpZGUgYnkgRUZVU0UgY29uZmlnICovCi0JdTgJaHdwd3JwX2RldGVjdDsvKiAwOmRpc2FibGUsMTplbmFibGUgKi8KLQotCXU4CWh3X3dwc19wYmM7LyogMDpkaXNhYmxlLDE6ZW5hYmxlICovCi0KLQl1OAltYXhfcm9hbWluZ190aW1lczsgLyogbWF4IG51bWJlciBkcml2ZXIgd2lsbCB0cnkgdG8gcm9hbWluZyAqLwotCi0JdTggZW5hYmxlODAyMTFkOwotCi0JdTggaWZuYW1lWzE2XTsKLQl1OCBpZjJuYW1lWzE2XTsKLQotCXU4IG5vdGNoX2ZpbHRlcjsKLQotCXU4IHJlZ3VsYXRvcnlfdGlkOwotfTsKLQotCi0jZGVmaW5lIE1BWF9DT05USU5VQUxfVVJCX0VSUiA0Ci0KLSNkZWZpbmUgR0VUX1BSSU1BUllfQURBUFRFUihwYWRhcHRlcikJCQkJCVwKLQkoKChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKilwYWRhcHRlciktPmR2b2JqLT5pZjEpCi0KLWVudW0gX0lGQUNFX0lEIHsKLQlJRkFDRV9JRDAsIC8qIG1hcGluZyB0byBQUklNQVJZX0FEQVBURVIgKi8KLQlJRkFDRV9JRDEsIC8qIG1hcGluZyB0byBTRUNPTkRBUllfQURBUFRFUiAqLwotCUlGQUNFX0lEMiwKLQlJRkFDRV9JRDMsCi0JSUZBQ0VfSURfTUFYLAotfTsKLQotc3RydWN0IGR2b2JqX3ByaXYgewotCXN0cnVjdCBydHdfYWRhcHRlciAqaWYxOyAvKiBQUklNQVJZX0FEQVBURVIgKi8KLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmlmMjsgLyogU0VDT05EQVJZX0FEQVBURVIgKi8KLQotCS8qIGZvciBsb2NhbC9nbG9iYWwgc3luY2hyb25pemF0aW9uICovCi0Jc3RydWN0IG11dGV4IGh3X2luaXRfbXV0ZXg7Ci0Jc3RydWN0IG11dGV4IGgyY19md2NtZF9tdXRleDsKLQlzdHJ1Y3QgbXV0ZXggc2V0Y2hfbXV0ZXg7Ci0Jc3RydWN0IG11dGV4IHNldGJ3X211dGV4OwotCi0JdW5zaWduZWQgY2hhcglvcGVyX2NoYW5uZWw7IC8qIHNhdmVkIGNoYW4gaW5mbyB3aGVuIHNldCBjaGFuIGJ3ICovCi0JdW5zaWduZWQgY2hhcglvcGVyX2J3bW9kZTsKLQl1bnNpZ25lZCBjaGFyCW9wZXJfY2hfb2Zmc2V0Oy8qIFBSSU1FX0NITkxfT0ZGU0VUICovCi0KLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyc1tJRkFDRV9JRF9NQVhdOwotCXU4IGlmYWNlX251bXM7IC8qICB0b3RhbCBudW1iZXIgb2YgaWZhY2VzIHVzZWQgcnVudGltZSAqLwotCi0JLyogRm9yIDkyRCwgRE1EUCBoYXZlIDIgaW50ZXJmYWNlLiAqLwotCXU4CUludGVyZmFjZU51bWJlcjsKLQl1OAlOdW1JbnRlcmZhY2VzOwotCi0JLyogSW4gL091dCBQaXBlIGluZm9ybWF0aW9uICovCi0JaW50CVJ0SW5QaXBlWzJdOwotCWludAlSdE91dFBpcGVbM107Ci0JdTgJUXVldWUyUGlwZVtIV19RVUVVRV9FTlRSWV07LyogZm9yIG91dCBwaXBlIG1hcHBpbmcgKi8KLQotLyotLS0tLS0tLSBiZWxvdyBpcyBmb3IgVVNCIElOVEVSRkFDRSAtLS0tLS0tLSovCi0KLQl1OAlucl9lbmRwb2ludDsKLQl1OAlpc2hpZ2hzcGVlZDsKLQl1OAlSdE51bUluUGlwZXM7Ci0JdTgJUnROdW1PdXRQaXBlczsKLQlpbnQJZXBfbnVtWzVdOyAvKiBlbmRwb2ludCBudW1iZXIgKi8KLQotCXN0cnVjdCBtdXRleCB1c2JfdmVuZG9yX3JlcV9tdXRleDsKLQotCXVuaW9uIHsKLQkJX19sZTMyIHZhbDMyOwotCQlfX2xlMTYgdmFsMTY7Ci0JCXU4IHZhbDg7Ci0JfSB1c2JfYnVmOwotCi0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JpbnRmOwotCXN0cnVjdCB1c2JfZGV2aWNlICpwdXNiZGV2OwotCWF0b21pY190IGNvbnRpbnVhbF91cmJfZXJyb3I7Ci0KLS8qLS0tLS0tLS0gYmVsb3cgaXMgZm9yIFBDSUUgSU5URVJGQUNFIC0tLS0tLS0tKi8KLQotfTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICpkdm9ial90b19kZXYoc3RydWN0IGR2b2JqX3ByaXYgKmR2b2JqKQotewotCS8qIHRvZG86IGdldCBpbnRlcmZhY2UgdHlwZSBmcm9tIGR2b2JqIGFuZCB0aGUgcmV0dXJuIHRoZSBkZXYgYWNjb3JkaW5nbHkgKi8KLQlyZXR1cm4gJmR2b2JqLT5wdXNiaW50Zi0+ZGV2OwotfQotCi1lbnVtIF9JRkFDRV9UWVBFIHsKLQlJRkFDRV9QT1JUMCwgLyogbWFwcGluZyB0byBwb3J0MCBmb3IgQy9EIHNlcmllcyBjaGlwcyAqLwotCUlGQUNFX1BPUlQxLCAvKiBtYXBwaW5nIHRvIHBvcnQxIGZvciBDL0Qgc2VyaWVzIGNoaXAgKi8KLQlNQVhfSUZBQ0VfUE9SVCwKLX07Ci0KLWVudW0gX0FEQVBURVJfVFlQRSB7Ci0JUFJJTUFSWV9BREFQVEVSLAotCVNFQ09OREFSWV9BREFQVEVSLAotCU1BWF9BREFQVEVSLAotfTsKLQotc3RydWN0IHJ0d19hZGFwdGVyIHsKLQlpbnQJcGlkWzNdOy8qIHByb2Nlc3MgaWQgZnJvbSBVSSwgMDp3cHMsIDE6aG9zdGFwZCwgMjpkaGNwY2QgKi8KLQlpbnQJYkRvbmdsZTsvKiBidWlsZC1pbiBtb2R1bGUgb3IgZXh0ZXJuYWwgZG9uZ2xlICovCi0JdTE2CWNoaXBfdHlwZTsKLQl1MTYJSGFyZHdhcmVUeXBlOwotCi0Jc3RydWN0IGR2b2JqX3ByaXYgKmR2b2JqOwotCXN0cnVjdAltbG1lX3ByaXYgbWxtZXByaXY7Ci0Jc3RydWN0CW1sbWVfZXh0X3ByaXYgbWxtZWV4dHByaXY7Ci0Jc3RydWN0CWNtZF9wcml2CWNtZHByaXY7Ci0Jc3RydWN0CWV2dF9wcml2CWV2dHByaXY7Ci0Jc3RydWN0CXhtaXRfcHJpdgl4bWl0cHJpdjsKLQlzdHJ1Y3QJcmVjdl9wcml2CXJlY3Zwcml2OwotCXN0cnVjdAlzdGFfcHJpdglzdGFwcml2OwotCXN0cnVjdAlzZWN1cml0eV9wcml2CXNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QJcmVnaXN0cnlfcHJpdglyZWdpc3RyeXByaXY7Ci0Jc3RydWN0CXB3cmN0cmxfcHJpdglwd3JjdHJscHJpdjsKLQlzdHJ1Y3QJZWVwcm9tX3ByaXYgZWVwcm9tcHJpdjsKLQotCXUzMglzZXRiYW5kOwotCi0Jdm9pZCAqSGFsRGF0YTsKLQotCXMzMgliRHJpdmVyU3RvcHBlZDsKLQlzMzIJYlN1cnByaXNlUmVtb3ZlZDsKLQlzMzIgIGJDYXJkRGlzYWJsZVdPSFNNOwotCi0JdTMyCUlzckNvbnRlbnQ7Ci0JdTMyCUltckNvbnRlbnQ7Ci0KLQl1OAlFZXByb21BZGRyZXNzU2l6ZTsKLQl1OAlod19pbml0X2NvbXBsZXRlZDsKLQl1OAliRHJpdmVySXNHb2luZ1RvVW5sb2FkOwotCXU4CWluaXRfYWRwdF9pbl9wcm9ncmVzczsKLQl1OAliSGFsdEluUHJvZ3Jlc3M7Ci0KLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldjsKLQotCS8qICB1c2VkIGJ5IHJ0d19yZXJlZ19uZF9uYW1lIHJlbGF0ZWQgZnVuY3Rpb24gKi8KLQlpbnQgYnVwOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCi0Jc3RydWN0IHdpcmVsZXNzX2RldiAqcnR3X3dkZXY7Ci0JaW50IG5ldF9jbG9zZWQ7Ci0KLQl1OCBiRldSZWFkeTsKLQl1OCBiUmVhZFBvcnRDYW5jZWw7Ci0JdTggYldyaXRlUG9ydENhbmNlbDsKLQotCS8qIGV4dGVuZCB0byBzdXBwb3J0IG11bHRpIGludGVyZmFjZSAqLwotCS8qIElGQUNFX0lEMCBpcyBlcXVhbHMgdG8gUFJJTUFSWV9BREFQVEVSICovCi0JLyogSUZBQ0VfSUQxIGlzIGVxdWFscyB0byBTRUNPTkRBUllfQURBUFRFUiAqLwotCXU4IGlmYWNlX2lkOwotfTsKLQotI2RlZmluZSBhZGFwdGVyX3RvX2R2b2JqKGFkYXB0ZXIpIChhZGFwdGVyLT5kdm9iaikKLQotc3RhdGljIGlubGluZSB1OCAqbXlpZChzdHJ1Y3QgZWVwcm9tX3ByaXYgKnBlZXByaXYpCi17Ci0JcmV0dXJuIHBlZXByaXYtPm1hY19hZGRyOwotfQotCi0jZW5kaWYgLyogX19EUlZfVFlQRVNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaGFsX2NvbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2hhbF9jb20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM1MDMyMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaGFsX2NvbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX0hBTF9DT01NT05fSF9fCi0jZGVmaW5lIF9fSEFMX0NPTU1PTl9IX18KLQotLyogICovCi0vKiAgICAgICAgUmF0ZSBEZWZpbml0aW9uICovCi0vKiAgKi8KLS8qIENDSyAqLwotI2RlZmluZQlSQVRSXzFNCQkJCQkweDAwMDAwMDAxCi0jZGVmaW5lCVJBVFJfMk0JCQkJCTB4MDAwMDAwMDIKLSNkZWZpbmUJUkFUUl81NU0JCQkJMHgwMDAwMDAwNAotI2RlZmluZQlSQVRSXzExTQkJCQkweDAwMDAwMDA4Ci0vKiBPRkRNICovCi0jZGVmaW5lCVJBVFJfNk0JCQkJCTB4MDAwMDAwMTAKLSNkZWZpbmUJUkFUUl85TQkJCQkJMHgwMDAwMDAyMAotI2RlZmluZQlSQVRSXzEyTQkJCQkweDAwMDAwMDQwCi0jZGVmaW5lCVJBVFJfMThNCQkJCTB4MDAwMDAwODAKLSNkZWZpbmUJUkFUUl8yNE0JCQkJMHgwMDAwMDEwMAotI2RlZmluZQlSQVRSXzM2TQkJCQkweDAwMDAwMjAwCi0jZGVmaW5lCVJBVFJfNDhNCQkJCTB4MDAwMDA0MDAKLSNkZWZpbmUJUkFUUl81NE0JCQkJMHgwMDAwMDgwMAotLyogTUNTIDEgU3BhdGlhbCBTdHJlYW0gKi8KLSNkZWZpbmUJUkFUUl9NQ1MwCQkJCTB4MDAwMDEwMDAKLSNkZWZpbmUJUkFUUl9NQ1MxCQkJCTB4MDAwMDIwMDAKLSNkZWZpbmUJUkFUUl9NQ1MyCQkJCTB4MDAwMDQwMDAKLSNkZWZpbmUJUkFUUl9NQ1MzCQkJCTB4MDAwMDgwMDAKLSNkZWZpbmUJUkFUUl9NQ1M0CQkJCTB4MDAwMTAwMDAKLSNkZWZpbmUJUkFUUl9NQ1M1CQkJCTB4MDAwMjAwMDAKLSNkZWZpbmUJUkFUUl9NQ1M2CQkJCTB4MDAwNDAwMDAKLSNkZWZpbmUJUkFUUl9NQ1M3CQkJCTB4MDAwODAwMDAKLS8qIE1DUyAyIFNwYXRpYWwgU3RyZWFtICovCi0jZGVmaW5lCVJBVFJfTUNTOAkJCQkweDAwMTAwMDAwCi0jZGVmaW5lCVJBVFJfTUNTOQkJCQkweDAwMjAwMDAwCi0jZGVmaW5lCVJBVFJfTUNTMTAJCQkJMHgwMDQwMDAwMAotI2RlZmluZQlSQVRSX01DUzExCQkJCTB4MDA4MDAwMDAKLSNkZWZpbmUJUkFUUl9NQ1MxMgkJCQkweDAxMDAwMDAwCi0jZGVmaW5lCVJBVFJfTUNTMTMJCQkJMHgwMjAwMDAwMAotI2RlZmluZQlSQVRSX01DUzE0CQkJCTB4MDQwMDAwMDAKLSNkZWZpbmUJUkFUUl9NQ1MxNQkJCQkweDA4MDAwMDAwCi0KLS8qIENDSyAqLwotI2RlZmluZSBSQVRFXzFNCQkJCQlCSVQoMCkKLSNkZWZpbmUgUkFURV8yTQkJCQkJQklUKDEpCi0jZGVmaW5lIFJBVEVfNV81TQkJCQlCSVQoMikKLSNkZWZpbmUgUkFURV8xMU0JCQkJQklUKDMpCi0vKiBPRkRNICovCi0jZGVmaW5lIFJBVEVfNk0JCQkJCUJJVCg0KQotI2RlZmluZSBSQVRFXzlNCQkJCQlCSVQoNSkKLSNkZWZpbmUgUkFURV8xMk0JCQkJQklUKDYpCi0jZGVmaW5lIFJBVEVfMThNCQkJCUJJVCg3KQotI2RlZmluZSBSQVRFXzI0TQkJCQlCSVQoOCkKLSNkZWZpbmUgUkFURV8zNk0JCQkJQklUKDkpCi0jZGVmaW5lIFJBVEVfNDhNCQkJCUJJVCgxMCkKLSNkZWZpbmUgUkFURV81NE0JCQkJQklUKDExKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUeCBEZXNjIGRlZmluaXRpb24gTWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIHByYWdtYSBtYXJrIC0tIFR4IERlc2MgcmVsYXRlZCBkZWZpbml0aW9uLiAtLSAqLwotLyogICovCi0vKiAgKi8KLS8qCVJhdGUgKi8KLS8qICAqLwotLyogIENDSyBSYXRlcywgVHhIVCA9IDAgKi8KLSNkZWZpbmUgREVTQ19SQVRFMU0JCQkJMHgwMAotI2RlZmluZSBERVNDX1JBVEUyTQkJCQkweDAxCi0jZGVmaW5lIERFU0NfUkFURTVfNU0JCQkJMHgwMgotI2RlZmluZSBERVNDX1JBVEUxMU0JCQkJMHgwMwotCi0vKiAgT0ZETSBSYXRlcywgVHhIVCA9IDAgKi8KLSNkZWZpbmUgREVTQ19SQVRFNk0JCQkJMHgwNAotI2RlZmluZSBERVNDX1JBVEU5TQkJCQkweDA1Ci0jZGVmaW5lIERFU0NfUkFURTEyTQkJCQkweDA2Ci0jZGVmaW5lIERFU0NfUkFURTE4TQkJCQkweDA3Ci0jZGVmaW5lIERFU0NfUkFURTI0TQkJCQkweDA4Ci0jZGVmaW5lIERFU0NfUkFURTM2TQkJCQkweDA5Ci0jZGVmaW5lIERFU0NfUkFURTQ4TQkJCQkweDBhCi0jZGVmaW5lIERFU0NfUkFURTU0TQkJCQkweDBiCi0KLS8qICBNQ1MgUmF0ZXMsIFR4SFQgPSAxICovCi0jZGVmaW5lIERFU0NfUkFURU1DUzAJCQkJMHgwYwotI2RlZmluZSBERVNDX1JBVEVNQ1MxCQkJCTB4MGQKLSNkZWZpbmUgREVTQ19SQVRFTUNTMgkJCQkweDBlCi0jZGVmaW5lIERFU0NfUkFURU1DUzMJCQkJMHgwZgotI2RlZmluZSBERVNDX1JBVEVNQ1M0CQkJCTB4MTAKLSNkZWZpbmUgREVTQ19SQVRFTUNTNQkJCQkweDExCi0jZGVmaW5lIERFU0NfUkFURU1DUzYJCQkJMHgxMgotI2RlZmluZSBERVNDX1JBVEVNQ1M3CQkJCTB4MTMKLSNkZWZpbmUgREVTQ19SQVRFTUNTOAkJCQkweDE0Ci0jZGVmaW5lIERFU0NfUkFURU1DUzkJCQkJMHgxNQotI2RlZmluZSBERVNDX1JBVEVNQ1MxMAkJCQkweDE2Ci0jZGVmaW5lIERFU0NfUkFURU1DUzExCQkJCTB4MTcKLSNkZWZpbmUgREVTQ19SQVRFTUNTMTIJCQkJMHgxOAotI2RlZmluZSBERVNDX1JBVEVNQ1MxMwkJCQkweDE5Ci0jZGVmaW5lIERFU0NfUkFURU1DUzE0CQkJCTB4MWEKLSNkZWZpbmUgREVTQ19SQVRFTUNTMTUJCQkJMHgxYgotI2RlZmluZSBERVNDX1JBVEVNQ1MxNV9TRwkJCTB4MWMKLSNkZWZpbmUgREVTQ19SQVRFTUNTMzIJCQkJMHgyMAotCi0jZGVmaW5lIFJFR19QMlBfQ1RXSU4JCQkJCTB4MDU3MiAvKiAgMSBCeXRlIGxvbmcgKGluIHVuaXQgb2YgVFUpICovCi0jZGVmaW5lIFJFR19OT0FfREVTQ19TRUwJCQkJMHgwNUNGCi0jZGVmaW5lIFJFR19OT0FfREVTQ19EVVJBVElPTgkJMHgwNUUwCi0jZGVmaW5lIFJFR19OT0FfREVTQ19JTlRFUlZBTAkJCTB4MDVFNAotI2RlZmluZSBSRUdfTk9BX0RFU0NfU1RBUlQJCQkweDA1RTgKLSNkZWZpbmUgUkVHX05PQV9ERVNDX0NPVU5UCQkJMHgwNUVDCi0KLSNpbmNsdWRlICJIYWxWZXJEZWYuaCIKLQotCi11OAkvKiByZXR1cm4gdGhlIGZpbmFsIGNoYW5uZWwgcGxhbiBkZWNpc2lvbiAqLwotaGFsX2NvbV9nZXRfY2hhbm5lbF9wbGFuMjNhKAotCXN0cnVjdCBydHdfYWRhcHRlcgkqcGFkYXB0ZXIsCi0JdTgJCQlod19jaGFubmVsX3BsYW4sCS8qIGNoYW5uZWwgcGxhbiBmcm9tIEhXIChlZnVzZS9lZXByb20pICovCi0JdTgJCQlzd19jaGFubmVsX3BsYW4sCS8qIGNoYW5uZWwgcGxhbiBmcm9tIFNXIChyZWdpc3RyeS9tb2R1bGUgcGFyYW0pICovCi0JdTgJCQlkZWZfY2hhbm5lbF9wbGFuLAkvKiBjaGFubmVsIHBsYW4gdXNlZCB3aGVuIHRoZSBmb3JtZXIgdHdvIGlzIGludmFsaWQgKi8KLQlib29sCQlBdXRvTG9hZEZhaWwKLQkpOwotCi11OAlNUmF0ZVRvSHdSYXRlMjNhKHU4IHJhdGUpOwotCi12b2lkIEhhbFNldEJyYXRlQ2ZnMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICptQnJhdGVzT1MpOwotCi1ib29sCi1IYWxfTWFwcGluZ091dFBpcGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTggTnVtT3V0UGlwZSk7Ci0KLXZvaWQgYzJoX2V2dF9jbGVhcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotczMyIGMyaF9ldnRfcmVhZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpidWYpOwotCi12b2lkIHJ0bDg3MjNhX3NldF9hbXBkdV9taW5fc3BhY2Uoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggTWluU3BhY2luZ1RvU2V0KTsKLXZvaWQgcnRsODcyM2Ffc2V0X2FtcGR1X2ZhY3RvcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBGYWN0b3JUb1NldCk7Ci12b2lkIHJ0bDg3MjNhX3NldF9hY21fY3RybChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBjdHJsKTsKLXZvaWQgcnRsODcyM2Ffc2V0X21lZGlhX3N0YXR1cyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzdGF0dXMpOwotdm9pZCBydGw4NzIzYV9zZXRfbWVkaWFfc3RhdHVzMShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzdGF0dXMpOwotdm9pZCBydGw4NzIzYV9zZXRfYmNuX2Z1bmMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdmFsKTsKLXZvaWQgcnRsODcyM2FfY2hlY2tfYnNzaWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdmFsKTsKLXZvaWQgcnRsODcyM2FfbWxtZV9zaXRlc3VydmV5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGZsYWcpOwotdm9pZCBydGw4NzIzYV9vbl9yY3JfYW0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX29mZl9yY3JfYW0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX3NldF9zbG90X3RpbWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggc2xvdHRpbWUpOwotdm9pZCBydGw4NzIzYV9hY2tfcHJlYW1ibGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYlNob3J0UHJlYW1ibGUpOwotdm9pZCBydGw4NzIzYV9zZXRfc2VjX2NmZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzZWMpOwotdm9pZCBydGw4NzIzYV9jYW1fZW1wdHlfZW50cnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdWNJbmRleCk7Ci12b2lkIHJ0bDg3MjNhX2NhbV9pbnZhbGlkYXRlX2FsbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2FfY2FtX3dyaXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQl1OCBlbnRyeSwgdTE2IGN0cmwsIGNvbnN0IHU4ICptYWMsIGNvbnN0IHU4ICprZXkpOwotdm9pZCBydGw4NzIzYV9maWZvX2NsZWFudXAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX3NldF9hcGZtX29uX21hYyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB2YWwpOwotdm9pZCBydGw4NzIzYV9iY25fdmFsaWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1ib29sIHJ0bDg3MjNhX2dldF9iY25fdmFsaWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX3NldF9iZWFjb25faW50ZXJ2YWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGludGVydmFsKTsKLXZvaWQgcnRsODcyM2Ffc2V0X3Jlc3Bfc2lmcyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgIHU4IHIydDEsIHU4IHIydDIsIHU4IHQydDEsIHU4IHQydDIpOwotdm9pZCBydGw4NzIzYV9zZXRfYWNfcGFyYW1fdm8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIHZvKTsKLXZvaWQgcnRsODcyM2Ffc2V0X2FjX3BhcmFtX3ZpKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiB2aSk7Ci12b2lkIHJ0bDg3MjNhX3NldF9hY19wYXJhbV9iZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgYmUpOwotdm9pZCBydGw4NzIzYV9zZXRfYWNfcGFyYW1fYmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIGJrKTsKLXZvaWQgcnRsODcyM2Ffc2V0X3J4ZG1hX2FnZ19wZ190aChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB2YWwpOwotdm9pZCBydGw4NzIzYV9zZXRfaW5pdGlhbF9nYWluKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiByeF9nYWluKTsKLQotdm9pZCBydGw4NzIzYV9vZG1fc3VwcG9ydF9hYmlsaXR5X3dyaXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiB2YWwpOwotdm9pZCBydGw4NzIzYV9vZG1fc3VwcG9ydF9hYmlsaXR5X2JhY2t1cChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9yZXN0b3JlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9vZG1fc3VwcG9ydF9hYmlsaXR5X3NldChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgdmFsKTsKLXZvaWQgcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9jbHIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIHZhbCk7Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X3Jwd20oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdmFsKTsKLXU4IHJ0bDg3MjNhX2dldF9yZl90eXBlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotYm9vbCBydGw4NzIzYV9nZXRfZndscHNfcmZfb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1ib29sIHJ0bDg3MjNhX2Noa19oaV9xdWV1ZV9lbXB0eShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotI2VuZGlmIC8qIF9fSEFMX0NPTU1PTl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9oYWxfaW50Zi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2hhbF9pbnRmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjRkNDcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2hhbF9pbnRmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fSEFMX0lOVEZfSF9fCi0jZGVmaW5lIF9fSEFMX0lOVEZfSF9fCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLWVudW0gX0NISVBfVFlQRSB7Ci0JTlVMTF9DSElQX1RZUEUsCi0JUlRMODcxMl84MTg4U184MTkxU184MTkyUywKLQlSVEw4MTg4Q184MTkyQywKLQlSVEw4MTkyRCwKLQlSVEw4NzIzQSwKLQlSVEw4MTg4RSwKLQlNQVhfQ0hJUF9UWVBFCi19OwotCi1lbnVtIGhhbF9kZWZfdmFyaWFibGUgewotCUhBTF9ERUZfVU5ERVJDT1JBVEVEU01PT1RIRURQV0RCLAotCUhBTF9ERUZfSVNfU1VQUE9SVF9BTlRfRElWLAotCUhBTF9ERUZfQ1VSUkVOVF9BTlRFTk5BLAotCUhBTF9ERUZfRFJWSU5GT19TWiwKLQlIQUxfREVGX01BWF9SRUNWQlVGX1NaLAotCUhBTF9ERUZfUlhfUEFDS0VUX09GRlNFVCwKLQlIQUxfREVGX0RCR19EVU1QX1JYUEtULC8qIGZvciBkYmcgKi8KLQlIQUxfREVGX0RCR19ETV9GVU5DLC8qIGZvciBkYmcgKi8KLQlIQUxfREVGX1JBX0RFQ0lTSU9OX1JBVEUsCi0JSEFMX0RFRl9SQV9TR0ksCi0JSEFMX0RFRl9QVF9QV1JfU1RBVFVTLAotCUhXX1ZBUl9NQVhfUlhfQU1QRFVfRkFDVE9SLAotCUhXX0RFRl9SQV9JTkZPX0RVTVAsCi0JSEFMX0RFRl9EQkdfRFVNUF9UWFBLVCwKLQlIV19ERUZfRkFfQ05UX0RVTVAsCi0JSFdfREVGX09ETV9EQkdfRkxBRywKLX07Ci0KLWVudW0gaGFsX29kbV92YXJpYWJsZSB7Ci0JSEFMX09ETV9TVEFfSU5GTywKLQlIQUxfT0RNX1AyUF9TVEFURSwKLQlIQUxfT0RNX1dJRklfRElTUExBWV9TVEFURSwKLX07Ci0KLWVudW0gcnRfZWVwcm9tX3R5cGUgewotCUVFUFJPTV85M0M0NiwKLQlFRVBST01fOTNDNTYsCi0JRUVQUk9NX0JPT1RfRUZVU0UsCi19OwotCi0KLQotI2RlZmluZSBSRl9DSEFOR0VfQllfSU5JVAkwCi0jZGVmaW5lIFJGX0NIQU5HRV9CWV9JUFMJQklUKDI4KQotI2RlZmluZSBSRl9DSEFOR0VfQllfUFMJCUJJVCgyOSkKLSNkZWZpbmUgUkZfQ0hBTkdFX0JZX0hXCQlCSVQoMzApCi0jZGVmaW5lIFJGX0NIQU5HRV9CWV9TVwkJQklUKDMxKQotCi1lbnVtIGhhcmR3YXJlX3R5cGUgewotCUhBUkRXQVJFX1RZUEVfUlRMODE4MCwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxODUsCi0JSEFSRFdBUkVfVFlQRV9SVEw4MTg3LAotCUhBUkRXQVJFX1RZUEVfUlRMODE4OCwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxOTBQLAotCUhBUkRXQVJFX1RZUEVfUlRMODE5MkUsCi0JSEFSRFdBUkVfVFlQRV9SVEw4MTl4VSwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxOTJTRSwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxOTJTVSwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxOTJDRSwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxOTJDVSwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxOTJERSwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxOTJEVSwKLQlIQVJEV0FSRV9UWVBFX1JUTDg3MjNBRSwKLQlIQVJEV0FSRV9UWVBFX1JUTDg3MjNBVSwKLQlIQVJEV0FSRV9UWVBFX1JUTDg3MjNBUywKLQlIQVJEV0FSRV9UWVBFX1JUTDgxODhFRSwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxODhFVSwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxODhFUywKLQlIQVJEV0FSRV9UWVBFX01BWCwKLX07Ci0KLSNkZWZpbmUgR0VUX0VFUFJPTV9FRlVTRV9QUklWKGFkYXB0ZXIpICgmYWRhcHRlci0+ZWVwcm9tcHJpdikKLQotdm9pZCBydHdfaGFsX2RlZl92YWx1ZV9pbml0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotaW50IHBtX25ldGRldl9vcGVuMjNhKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2LCB1OCBibm9ybWFsKTsKLQotaW50IHJ0bDg3MjNhdV9oYWxfaW5pdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWludCBydGw4NzIzYXVfaGFsX2RlaW5pdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnR3X2hhbF9zdG9wKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIHJ0d19oYWxfdXBkYXRlX3JhX21hc2syM2Eoc3RydWN0IHN0YV9pbmZvICpwc3RhLCB1OCByc3NpX2xldmVsKTsKLXZvaWQJcnR3X2hhbF9jbG9uZV9kYXRhKHN0cnVjdCBydHdfYWRhcHRlciAqZHN0X3BhZGFwdGVyLCBzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnNyY19wYWRhcHRlcik7Ci0KLXZvaWQgaHdfdmFyX3NldF9jb3JyZWN0X3RzZihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgaHdfdmFyX3NldF9tbG1lX2Rpc2Nvbm5lY3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIGh3X3Zhcl9zZXRfb3Btb2RlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG1vZGUpOwotdm9pZCBod192YXJfc2V0X21hY2FkZHIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnZhbCk7Ci12b2lkIGh3X3Zhcl9zZXRfYnNzaWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnZhbCk7Ci12b2lkIGh3X3Zhcl9zZXRfbWxtZV9qb2luKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHR5cGUpOwotCi1pbnQgR2V0SGFsRGVmVmFyODE5MkNVc2Ioc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJIGVudW0gaGFsX2RlZl92YXJpYWJsZSBlVmFyaWFibGUsIHZvaWQgKnBWYWx1ZSk7Ci0KLSNlbmRpZiAvKiBfX0hBTF9JTlRGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2llZWU4MDIxMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzQxMDJlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9pZWVlODAyMTEuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19JRUVFODAyMTFfSAotI2RlZmluZSBfX0lFRUU4MDIxMV9ICi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSAibGludXgvaWVlZTgwMjExLmgiCi0jaW5jbHVkZSAid2lmaS5oIgotCi0jaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KLQotI2lmIChXSVJFTEVTU19FWFQgPCAyMikKLSNlcnJvciAiT2Jzb2xldGUgcHJlIDIwMDcgd2lyZWxlc3MgZXh0ZW5zaW9ucyBhcmUgbm90IHN1cHBvcnRlZCIKLSNlbmRpZgotCi0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQotLyogU1RBIGZsYWdzICovCi0jZGVmaW5lIFdMQU5fU1RBX0FVVEggQklUKDApCi0jZGVmaW5lIFdMQU5fU1RBX0FTU09DIEJJVCgxKQotI2RlZmluZSBXTEFOX1NUQV9QUyBCSVQoMikKLSNkZWZpbmUgV0xBTl9TVEFfVElNIEJJVCgzKQotI2RlZmluZSBXTEFOX1NUQV9QRVJNIEJJVCg0KQotI2RlZmluZSBXTEFOX1NUQV9BVVRIT1JJWkVEIEJJVCg1KQotI2RlZmluZSBXTEFOX1NUQV9QRU5ESU5HX1BPTEwgQklUKDYpIC8qIHBlbmRpbmcgYWN0aXZpdHkgcG9sbCBub3QgQUNLZWQgKi8KLSNkZWZpbmUgV0xBTl9TVEFfU0hPUlRfUFJFQU1CTEUgQklUKDcpCi0jZGVmaW5lIFdMQU5fU1RBX1BSRUFVVEggQklUKDgpCi0jZGVmaW5lIFdMQU5fU1RBX1dNRSBCSVQoOSkKLSNkZWZpbmUgV0xBTl9TVEFfTUZQIEJJVCgxMCkKLSNkZWZpbmUgV0xBTl9TVEFfSFQgQklUKDExKQotI2RlZmluZSBXTEFOX1NUQV9XUFMgQklUKDEyKQotI2RlZmluZSBXTEFOX1NUQV9NQVlCRV9XUFMgQklUKDEzKQotI2RlZmluZSBXTEFOX1NUQV9OT05FUlAgQklUKDMxKQotCi0jZW5kaWYKLQotI2RlZmluZSBXUEFfQ0lQSEVSX05PTkUJCUJJVCgwKQotI2RlZmluZSBXUEFfQ0lQSEVSX1dFUDQwCUJJVCgxKQotI2RlZmluZSBXUEFfQ0lQSEVSX1dFUDEwNAlCSVQoMikKLSNkZWZpbmUgV1BBX0NJUEhFUl9US0lQCQlCSVQoMykKLSNkZWZpbmUgV1BBX0NJUEhFUl9DQ01QCQlCSVQoNCkKLQotCi0KLSNkZWZpbmUgV1BBX1NFTEVDVE9SX0xFTiA0Ci1leHRlcm4gdTggUlRXX1dQQV9PVUkyM0FfVFlQRVtdIDsKLWV4dGVybiB1MTYgUlRXX1dQQV9WRVJTSU9OMjNBIDsKLWV4dGVybiB1OCBXUEFfQVVUSF9LRVlfTUdNVF9OT05FMjNBW107Ci1leHRlcm4gdTggV1BBX0FVVEhfS0VZX01HTVRfVU5TUEVDXzgwMl8xWDIzQVtdOwotZXh0ZXJuIHU4IFdQQV9BVVRIX0tFWV9NR01UX1BTS19PVkVSXzgwMl8xWDIzQVtdOwotZXh0ZXJuIHU4IFdQQV9DSVBIRVJfU1VJVEVfTk9ORTIzQVtdOwotZXh0ZXJuIHU4IFdQQV9DSVBIRVJfU1VJVEVfV0VQNDAyM0FbXTsKLWV4dGVybiB1OCBXUEFfQ0lQSEVSX1NVSVRFX1RLSVAyM0FbXTsKLWV4dGVybiB1OCBXUEFfQ0lQSEVSX1NVSVRFX1dSQVAyM0FbXTsKLWV4dGVybiB1OCBXUEFfQ0lQSEVSX1NVSVRFX0NDTVAyM0FbXTsKLWV4dGVybiB1OCBXUEFfQ0lQSEVSX1NVSVRFX1dFUDEwNDIzQVtdOwotCi0KLSNkZWZpbmUgUlNOX0hFQURFUl9MRU4gNAotI2RlZmluZSBSU05fU0VMRUNUT1JfTEVOIDQKLQotZXh0ZXJuIHU4IFJTTl9BVVRIX0tFWV9NR01UX1VOU1BFQ184MDJfMVgyM0FbXTsKLWV4dGVybiB1OCBSU05fQVVUSF9LRVlfTUdNVF9QU0tfT1ZFUl84MDJfMVgyM0FbXTsKLWV4dGVybiB1OCBSU05fQ0lQSEVSX1NVSVRFX05PTkUyM0FbXTsKLWV4dGVybiB1OCBSU05fQ0lQSEVSX1NVSVRFX1dFUDQwMjNBW107Ci1leHRlcm4gdTggUlNOX0NJUEhFUl9TVUlURV9US0lQMjNBW107Ci1leHRlcm4gdTggUlNOX0NJUEhFUl9TVUlURV9XUkFQMjNBW107Ci1leHRlcm4gdTggUlNOX0NJUEhFUl9TVUlURV9DQ01QMjNBW107Ci1leHRlcm4gdTggUlNOX0NJUEhFUl9TVUlURV9XRVAxMDQyM0FbXTsKLQotZW51bSByYXRyX3RhYmxlX21vZGUgewotCVJBVFJfSU5YX1dJUkVMRVNTX05HQiA9IDAsCS8qICBCR04gNDAgTWh6IDJTUyAxU1MgKi8KLQlSQVRSX0lOWF9XSVJFTEVTU19ORyA9IDEsCS8qICBHTiBvciBOICovCi0JUkFUUl9JTlhfV0lSRUxFU1NfTkIgPSAyLAkvKiAgQkdOIDIwIE1oeiAyU1MgMVNTICBvciBCTiAqLwotCVJBVFJfSU5YX1dJUkVMRVNTX04gPSAzLAotCVJBVFJfSU5YX1dJUkVMRVNTX0dCID0gNCwKLQlSQVRSX0lOWF9XSVJFTEVTU19HID0gNSwKLQlSQVRSX0lOWF9XSVJFTEVTU19CID0gNiwKLQlSQVRSX0lOWF9XSVJFTEVTU19NQyA9IDcsCi0JUkFUUl9JTlhfV0lSRUxFU1NfQUNfTiA9IDgsCi19OwotCi1lbnVtIE5FVFdPUktfVFlQRQotewotCVdJUkVMRVNTX0lOVkFMSUQgPSAwLAotCS8qIFN1Yi1FbGVtZW50ICovCi0JLyogIHR4OiBjY2sgb25seSAsIHJ4OiBjY2sgb25seSwgaHc6IGNjayAqLwotCVdJUkVMRVNTXzExQiA9IEJJVCgwKSwKLQkvKiAgdHg6IG9mZG0gb25seSwgcng6IG9mZG0gJiBjY2ssIGh3OiBjY2sgJiBvZmRtICovCi0JV0lSRUxFU1NfMTFHID0gQklUKDEpLAotCS8qICB0eDogb2ZkbSBvbmx5LCByeDogb2ZkbSBvbmx5LCBodzogb2ZkbSBvbmx5ICovCi0JV0lSRUxFU1NfMTFBID0gQklUKDIpLAotCS8qICB0eDogTUNTIG9ubHksIHJ4OiBNQ1MgJiBjY2ssIGh3OiBNQ1MgJiBjY2sgKi8KLQlXSVJFTEVTU18xMV8yNE4gPSBCSVQoMyksCi0JLyogIHR4OiBNQ1Mgb25seSwgcng6IE1DUyAmIG9mZG0sIGh3OiBvZmRtIG9ubHkgKi8KLQlXSVJFTEVTU18xMV81TiA9IEJJVCg0KSwKLQkvKiBXSVJFTEVTU19BVVRPCQk9IEJJVCg1KSwgKi8KLQlXSVJFTEVTU19BQyA9IEJJVCg2KSwKLQotCS8qIENvbWJpbmF0aW9uICovCi0JIC8qICB0eDogY2NrICYgb2ZkbSwgcng6IGNjayAmIG9mZG0gJiBNQ1MsIGh3OiBjY2sgJiBvZmRtICovCi0JV0lSRUxFU1NfMTFCRyA9IFdJUkVMRVNTXzExQnxXSVJFTEVTU18xMUcsCi0JLyogIHR4OiBvZmRtICYgTUNTLCByeDogb2ZkbSAmIGNjayAmIE1DUywgaHc6IGNjayAmIG9mZG0gKi8KLQlXSVJFTEVTU18xMUdfMjROID0gV0lSRUxFU1NfMTFHIHwgV0lSRUxFU1NfMTFfMjROLAotCS8qICB0eDogb2ZkbSAmIE1DUywgcng6IG9mZG0gJiBNQ1MsIGh3OiBvZmRtIG9ubHkgKi8KLQlXSVJFTEVTU18xMUFfNU4gPSBXSVJFTEVTU18xMUEgfCBXSVJFTEVTU18xMV81TiwKLQkvKiAgdHg6IG9mZG0gJiBjY2sgJiBNQ1MsIHJ4OiBvZmRtICYgY2NrICYgTUNTLCBodzogb2ZkbSAmIGNjayAqLwotCVdJUkVMRVNTXzExQkdfMjROID0gV0lSRUxFU1NfMTFCIHwgV0lSRUxFU1NfMTFHIHwgV0lSRUxFU1NfMTFfMjROLAotCS8qICB0eDogb2ZkbSAmIE1DUywgcng6IG9mZG0gJiBNQ1MsIGh3OiBvZmRtIG9ubHkgKi8KLQlXSVJFTEVTU18xMUFHTiA9IFdJUkVMRVNTXzExQSB8IFdJUkVMRVNTXzExRyB8IFdJUkVMRVNTXzExXzI0TiB8Ci0JCQkJV0lSRUxFU1NfMTFfNU4sCi0JV0lSRUxFU1NfMTFBQkdOID0gV0lSRUxFU1NfMTFBIHwgV0lSRUxFU1NfMTFCIHwgV0lSRUxFU1NfMTFHIHwKLQkJCQlXSVJFTEVTU18xMV8yNE4gfCBXSVJFTEVTU18xMV81TiwKLX07Ci0KLSNkZWZpbmUgU1VQUE9SVEVEXzI0R19ORVRUWVBFX01TSyAoV0lSRUxFU1NfMTFCIHwgV0lSRUxFU1NfMTFHIHwgV0lSRUxFU1NfMTFfMjROKQotI2RlZmluZSBTVVBQT1JURURfNUdfTkVUVFlQRV9NU0sgKFdJUkVMRVNTXzExQSB8IFdJUkVMRVNTXzExXzVOKQotCi0jZGVmaW5lIElzU3VwcG9ydGVkMjRHKE5ldFR5cGUpIChOZXRUeXBlICYgU1VQUE9SVEVEXzI0R19ORVRUWVBFX01TSyA/IHRydWUgOiBmYWxzZSkKLSNkZWZpbmUgSXNTdXBwb3J0ZWQ1RyhOZXRUeXBlKSAoTmV0VHlwZSAmIFNVUFBPUlRFRF81R19ORVRUWVBFX01TSyA/IHRydWUgOiBmYWxzZSkKLQotI2RlZmluZSBJc0VuYWJsZUhXQ0NLKE5ldFR5cGUpIElzU3VwcG9ydGVkMjRHKE5ldFR5cGUpCi0jZGVmaW5lIElzRW5hYmxlSFdPRkRNKE5ldFR5cGUpIChOZXRUeXBlICYgKFdJUkVMRVNTXzExR3xXSVJFTEVTU18xMV8yNE58U1VQUE9SVEVEXzVHX05FVFRZUEVfTVNLKSA/IHRydWUgOiBmYWxzZSkKLQotI2RlZmluZSBJc1N1cHBvcnRlZFJ4Q0NLKE5ldFR5cGUpIElzRW5hYmxlSFdDQ0soTmV0VHlwZSkKLSNkZWZpbmUgSXNTdXBwb3J0ZWRSeE9GRE0oTmV0VHlwZSkgSXNFbmFibGVIV09GRE0oTmV0VHlwZSkKLSNkZWZpbmUgSXNTdXBwb3J0ZWRSeE1DUyhOZXRUeXBlKSBJc0VuYWJsZUhXT0ZETShOZXRUeXBlKQotCi0jZGVmaW5lIElzU3VwcG9ydGVkVHhDQ0soTmV0VHlwZSkgKE5ldFR5cGUgJiAoV0lSRUxFU1NfMTFCKSA/IHRydWUgOiBmYWxzZSkKLSNkZWZpbmUgSXNTdXBwb3J0ZWRUeE9GRE0oTmV0VHlwZSkgKE5ldFR5cGUgJiAoV0lSRUxFU1NfMTFHfFdJUkVMRVNTXzExQSkgPyB0cnVlIDogZmFsc2UpCi0jZGVmaW5lIElzU3VwcG9ydGVkVHhNQ1MoTmV0VHlwZSkgKE5ldFR5cGUgJiAoV0lSRUxFU1NfMTFfMjROfFdJUkVMRVNTXzExXzVOKSA/IHRydWUgOiBmYWxzZSkKLQotCi0jZGVmaW5lIE1JTl9GUkFHX1RIUkVTSE9MRCAgICAgMjU2VQotI2RlZmluZQlNQVhfRlJBR19USFJFU0hPTEQgICAgIDIzNDZVCi0KLS8qIFFvUyxRT1MgKi8KLSNkZWZpbmUgTk9STUFMX0FDSwkJCTAKLSNkZWZpbmUgTk9fQUNLCQkJCTEKLSNkZWZpbmUgTk9OX0VYUExJQ0lUX0FDSwkJMgotI2RlZmluZSBCTE9DS19BQ0sJCQkzCi0KLS8qIElFRUUgODAyLjExIGRlZmluZXMgKi8KLQotI2RlZmluZSBQODAyMTFfT1VJX0xFTiAzCi0KLXN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgewotCXU4ICAgIGRzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KLQl1OCAgICBzc2FwOyAgIC8qIGFsd2F5cyAweEFBICovCi0JdTggICAgY3RybDsgICAvKiBhbHdheXMgMHgwMyAqLwotCXU4ICAgIG91aVtQODAyMTFfT1VJX0xFTl07ICAgIC8qIG9yZ2FuaXphdGlvbmFsIHVuaXZlcnNhbCBpZCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotI2RlZmluZSBTTkFQX1NJWkUgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIpCi0KLSNkZWZpbmUgV0xBTl9SRUFTT05fSk9JTl9XUk9OR19DSEFOTkVMICAgICAgIDY1NTM0Ci0jZGVmaW5lIFdMQU5fUkVBU09OX0VYUElSQVRJT05fQ0hLIDY1NTM1Ci0KLSNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFX0xFTgkJCTQKLSNkZWZpbmUgSUVFRTgwMjExX05VTV9PRkRNX1JBVEVTTEVOCTgKLQotCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUIJCSAgICAgICAgMHgwMgotI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1CCQkgICAgICAgIDB4MDQKLSNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzVNQgkJICAgICAgICAweDBCCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CCQkgICAgICAgIDB4MTYKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV9MRU4JCQk4Ci0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CCQkgICAgICAgIDB4MEMKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUIJCSAgICAgICAgMHgxMgotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUIJCTB4MTgKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CCQkweDI0Ci0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQgkJMHgzMAotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUIJCTB4NDgKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CCQkweDYwCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQgkJMHg2QwotI2RlZmluZSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLCQkweDgwCi0KLSNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzFNQl9NQVNLCQkoMTw8MCkKLSNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLCQkoMTw8MSkKLSNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLCQkoMTw8MikKLSNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzExTUJfTUFTSwkJKDE8PDMpCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CX01BU0sJCSgxPDw0KQotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQl9NQVNLCQkoMTw8NSkKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CX01BU0sJCSgxPDw2KQotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUJfTUFTSwkJKDE8PDcpCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQl9NQVNLCQkoMTw8OCkKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CX01BU0sJCSgxPDw5KQotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUJfTUFTSwkJKDE8PDEwKQotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUJfTUFTSwkJKDE8PDExKQotCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURVNfTUFTSwkgICAgICAgIDB4MDAwMDAwMEYKLSNkZWZpbmUgSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLCShJRUVFODAyMTFfQ0NLX1JBVEVfMU1CX01BU0sgfCBcCi0JSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLKQotI2RlZmluZSBJRUVFODAyMTFfQ0NLX0RFRkFVTFRfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLIHwgXAotCUlFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSyB8IFwKLQlJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLKQotCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0sJCTB4MDAwMDBGRjAKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyB8IFwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSyB8IFwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSykKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sgIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLKQotI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9SQVRFU19NQVNLIChJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sgfCBcCi0JCQkJICAgICAgSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0spCi0KLSNkZWZpbmUgSUVFRTgwMjExX05VTV9PRkRNX1JBVEVTCSAgICA4Ci0jZGVmaW5lIElFRUU4MDIxMV9OVU1fQ0NLX1JBVEVTCSAgICAgICAgICAgIDQKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fU0hJRlRfTUFTS19BICAgICAgICAgNAotCi0jZGVmaW5lIFdFUF9LRVlTIDQKLQotCi0vKiBNQVhfUkFURVNfTEVOR1RIIG5lZWRzIHRvIGJlIDEyLiAgVGhlIHNwZWMgc2F5cyA4LCBhbmQgbWFueSBBUHMKLSAqIG9ubHkgdXNlIDgsIGFuZCB0aGVuIHVzZSBleHRlbmRlZCByYXRlcyBmb3IgdGhlIHJlbWFpbmluZyBzdXBwb3J0ZWQKLSAqIHJhdGVzLiAgT3RoZXIgQVBzLCBob3dldmVyLCBzdGljayBhbGwgb2YgdGhlaXIgc3VwcG9ydGVkIHJhdGVzIG9uIHRoZQotICogbWFpbiByYXRlcyBpbmZvcm1hdGlvbiBlbGVtZW50Li4uICovCi0jZGVmaW5lIE1BWF9SQVRFU19MRU5HVEgJMTIKLSNkZWZpbmUgTUFYX1JBVEVTX0VYX0xFTkdUSAkxNgotI2RlZmluZSBNQVhfQ0hBTk5FTF9OVU1CRVIJMTYxCi0jZGVmaW5lIFJUV19DSF9NQVhfMkdfQ0hBTk5FTAkxNAkvKiBNYXggY2hhbm5lbCBpbiAyRyBiYW5kICovCi0KLSNkZWZpbmUgTUFYX1dQQV9JRV9MRU4JCTI1NgotI2RlZmluZSBNQVhfV1BTX0lFX0xFTgkJMjU2Ci0jZGVmaW5lIE1BWF9QMlBfSUVfTEVOCQkyNTYKLSNkZWZpbmUgTUFYX1dGRF9JRV9MRU4JCTEyOAotCi0vKgotam9pbl9yZXM6Ci0tMTogYXV0aGVudGljYXRpb24gZmFpbAotLTI6IGFzc29jaWF0aW9uIGZhaWwKLT4gMDogVElECi0qLwotCi0jZGVmaW5lIE1BWFRJRAkxNgotCi0jZGVmaW5lIFdNRV9PVUlfVFlQRSAyCi0jZGVmaW5lIFdNRV9PVUlfU1VCVFlQRV9JTkZPUk1BVElPTl9FTEVNRU5UIDAKLSNkZWZpbmUgV01FX09VSV9TVUJUWVBFX1BBUkFNRVRFUl9FTEVNRU5UIDEKLSNkZWZpbmUgV01FX09VSV9TVUJUWVBFX1RTUEVDX0VMRU1FTlQgMgotI2RlZmluZSBXTUVfVkVSU0lPTiAxCi0KLQotI2RlZmluZSBPVUlfQlJPQURDT00gMHgwMDkwNGMgLyogQnJvYWRjb20gKEVwaWdyYW0pICovCi0KLSNkZWZpbmUgVkVORE9SX0hUX0NBUEFCX09VSV9UWVBFIDB4MzMgLyogMDAtOTAtNGM6MHgzMyAqLwotCi0vKiBSZXByZXNlbnQgY2hhbm5lbCBkZXRhaWxzLCBzdWJzZXQgb2YgaWVlZTgwMjExX2NoYW5uZWwgKi8KLXN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwgewotCS8qIGVudW0gbmw4MDIxMV9iYW5kIGJhbmQ7ICovCi0JLyogdTE2IGNlbnRlcl9mcmVxOyAqLwotCXUxNiBod192YWx1ZTsKLQl1MzIgZmxhZ3M7Ci0JLyogaW50IG1heF9hbnRlbm5hX2dhaW47ICovCi0JLyogaW50IG1heF9wb3dlcjsgKi8KLQkvKiBpbnQgbWF4X3JlZ19wb3dlcjsgKi8KLQkvKiBib29sIGJlYWNvbl9mb3VuZDsgKi8KLQkvKiB1MzIgb3JpZ19mbGFnczsgKi8KLQkvKiBpbnQgb3JpZ19tYWc7ICovCi0JLyogaW50IG9yaWdfbXB3cjsgKi8KLX07Ci0KLSNkZWZpbmUgQ0hBTl9GTVQgXAotCS8qImJhbmQ6JWQsICIqLyBcCi0JLyoiY2VudGVyX2ZyZXE6JXUsICIqLyBcCi0JImh3X3ZhbHVlOiV1LCAiIFwKLQkiZmxhZ3M6MHglMDh4IiBcCi0JLyoibWF4X2FudGVubmFfZ2FpbjolZFxuIiovIFwKLQkvKiJtYXhfcG93ZXI6JWRcbiIqLyBcCi0JLyoibWF4X3JlZ19wb3dlcjolZFxuIiovIFwKLQkvKiJiZWFjb25fZm91bmQ6JXVcbiIqLyBcCi0JLyoib3JpZ19mbGFnczoweCUwOHhcbiIqLyBcCi0JLyoib3JpZ19tYWc6JWRcbiIqLyBcCi0JLyoib3JpZ19tcHdyOiVkXG4iKi8KLQotI2RlZmluZSBDSEFOX0FSRyhjaGFubmVsKSBcCi0JLyooY2hhbm5lbCktPmJhbmQqLyBcCi0JLyosIChjaGFubmVsKS0+Y2VudGVyX2ZyZXEqLyBcCi0JKGNoYW5uZWwpLT5od192YWx1ZSBcCi0JLCAoY2hhbm5lbCktPmZsYWdzIFwKLQkvKiwgKGNoYW5uZWwpLT5tYXhfYW50ZW5uYV9nYWluKi8gXAotCS8qLCAoY2hhbm5lbCktPm1heF9wb3dlciovIFwKLQkvKiwgKGNoYW5uZWwpLT5tYXhfcmVnX3Bvd2VyKi8gXAotCS8qLCAoY2hhbm5lbCktPmJlYWNvbl9mb3VuZCovIFwKLQkvKiwgKGNoYW5uZWwpLT5vcmlnX2ZsYWdzKi8gXAotCS8qLCAoY2hhbm5lbCktPm9yaWdfbWFnKi8gXAotCS8qLCAoY2hhbm5lbCktPm9yaWdfbXB3ciovIFwKLQotdTggKnJ0d19zZXRfaWUyM2EodTggKnBidWYsIGludCBpbmRleCwgdWludCBsZW4sIGNvbnN0IHU4ICpzb3VyY2UsIHVpbnQgKmZybGVuKTsKLQotdTggaGFsX2NoX29mZnNldF90b19zZWNvbmRhcnlfY2hfb2Zmc2V0MjNhKHU4IGNoX29mZnNldCk7Ci11OCAqcnR3X3NldF9pZTIzYV9jaF9zd2l0Y2godTggKmJ1ZiwgdTMyICpidWZfbGVuLCB1OCBjaF9zd2l0Y2hfbW9kZSwgdTggbmV3X2NoLCB1OCBjaF9zd2l0Y2hfY250KTsKLXU4ICpydHdfc2V0X2llMjNhX3NlY29uZGFyeV9jaF9vZmZzZXQodTggKmJ1ZiwgdTMyICpidWZfbGVuLCB1OCBzZWNvbmRhcnlfY2hfb2Zmc2V0KTsKLQotdTggKnJ0d19nZXRfaWUyM2EodTgqcGJ1ZiwgaW50IGluZGV4LCBpbnQgKmxlbiwgaW50IGxpbWl0KTsKLXU4ICpydHdfZ2V0X2llMjNhX2V4KHU4ICppbl9pZSwgdWludCBpbl9sZW4sIHU4IGVpZCwgdTggKm91aSwgdTggb3VpX2xlbiwgdTggKmllLCB1aW50ICppZWxlbik7Ci1pbnQgcnR3X2llc19yZW1vdmVfaWUyM2EodTggKmllcywgdWludCAqaWVzX2xlbiwgdWludCBvZmZzZXQsIHU4IGVpZCwgdTggKm91aSwgdTggb3VpX2xlbik7Ci0KLXZvaWQgcnR3X3NldF9zdXBwb3J0ZWRfcmF0ZTIzYSh1OCAqU3VwcG9ydGVkUmF0ZXMsIHVpbnQgbW9kZSk7Ci0KLWludCBydHdfcGFyc2Vfd3BhX2llMjNhKGNvbnN0IHU4KiB3cGFfaWUsIGludCB3cGFfaWVfbGVuLCBpbnQgKmdyb3VwX2NpcGhlciwgaW50ICpwYWlyd2lzZV9jaXBoZXIsIGludCAqaXNfODAyMXgpOwotaW50IHJ0d19wYXJzZV93cGEyX2llMjNhKGNvbnN0IHU4KiB3cGFfaWUsIGludCB3cGFfaWVfbGVuLCBpbnQgKmdyb3VwX2NpcGhlciwgaW50ICpwYWlyd2lzZV9jaXBoZXIsIGludCAqaXNfODAyMXgpOwotCi1jb25zdCB1OCAqcnR3X2dldF93cHNfYXR0cjIzYShjb25zdCB1OCAqd3BzX2llLCB1aW50IHdwc19pZWxlbiwgdTE2IHRhcmdldF9hdHRyX2lkICx1OCAqYnVmX2F0dHIsIHUzMiAqbGVuX2F0dHIpOwotY29uc3QgdTggKnJ0d19nZXRfd3BzX2F0dHJfY29udGVudDIzYShjb25zdCB1OCAqd3BzX2llLCB1aW50IHdwc19pZWxlbiwgdTE2IHRhcmdldF9hdHRyX2lkICx1OCAqYnVmX2NvbnRlbnQpOwotCi11aW50CXJ0d19nZXRfcmF0ZXNldF9sZW4yM2EodTgJKnJhdGVzZXQpOwotCi1zdHJ1Y3QgcmVnaXN0cnlfcHJpdjsKLWludCBydHdfZ2VuZXJhdGVfaWUyM2Eoc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYpOwotCi0KLWludCBydHdfZ2V0X2JpdF92YWx1ZV9mcm9tX2llZWVfdmFsdWUyM2EodTggdmFsKTsKLQotaW50IHJ0d19jaGVja19uZXR3b3JrX3R5cGUyM2EodW5zaWduZWQgY2hhciAqcmF0ZSwgaW50IHJhdGVsZW4sIGludCBjaGFubmVsKTsKLQotdm9pZCBydHdfZ2V0X2Jjbl9pbmZvMjNhKHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKTsKLQotdTE2IHJ0d19tY3NfcmF0ZTIzYSh1OCByZl90eXBlLCB1OCBid180ME1IeiwgdTggc2hvcnRfR0lfMjAsIHU4IHNob3J0X0dJXzQwLAotCQkgICAgc3RydWN0IGllZWU4MDIxMV9tY3NfaW5mbyAqbWNzKTsKLQotI2VuZGlmIC8qIElFRUU4MDIxMV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaW9jdGxfY2ZnODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9pb2N0bF9jZmc4MDIxMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTRlYWQ1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9pb2N0bF9jZmc4MDIxMS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fSU9DVExfQ0ZHODAyMTFfSF9fCi0jZGVmaW5lIF9fSU9DVExfQ0ZHODAyMTFfSF9fCi0KLXN0cnVjdCBydHdfd2Rldl9wcml2IHsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICpydHdfd2RldjsKLQotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXI7Ci0KLQlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpzY2FuX3JlcXVlc3Q7Ci0Jc3BpbmxvY2tfdCBzY2FuX3JlcV9sb2NrOwotCi0Jc3RydWN0IG5ldF9kZXZpY2UgKnBtb25fbmRldjsvKiBmb3IgbW9uaXRvciBpbnRlcmZhY2UgKi8KLQljaGFyIGlmbmFtZV9tb25bSUZOQU1TSVogKyAxXTsgLyogbmFtZSBmb3IgbW9uaXRvciBpbnRlcmZhY2UgKi8KLQotCXU4IHAycF9lbmFibGVkOwotCi0JYm9vbCBwb3dlcl9tZ210OwotfTsKLQotI2RlZmluZSB3ZGV2X3RvX3ByaXYodykgKChzdHJ1Y3QgcnR3X3dkZXZfcHJpdiAqKSh3ZGV2X3ByaXYodykpKQotCi0jZGVmaW5lIHdpcGh5X3RvX2FkYXB0ZXIoeCkJCQkJCVwKLQkoc3RydWN0IHJ0d19hZGFwdGVyICopKCgoc3RydWN0IHJ0d193ZGV2X3ByaXYgKikJXAotCXdpcGh5X3ByaXYoeCkpLT5wYWRhcHRlcikKLQotI2RlZmluZSB3aXBoeV90b193ZGV2KHgpCQkJCQlcCi0JKHN0cnVjdCB3aXJlbGVzc19kZXYgKikoKChzdHJ1Y3QgcnR3X3dkZXZfcHJpdiAqKQlcCi0Jd2lwaHlfcHJpdih4KSktPnJ0d193ZGV2KQotCi1pbnQgcnR3X3dkZXZfYWxsb2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IGRldmljZSAqZGV2KTsKLXZvaWQgcnR3X3dkZXZfZnJlZShzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKLXZvaWQgcnR3X3dkZXZfdW5yZWdpc3RlcihzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKLQotdm9pZCBydHdfY2ZnODAyMTFfaW5pdF93aXBoeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotdm9pZCBydHdfY2ZnODAyMTFfc3VydmV5ZG9uZV9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotdm9pZCBydHdfY2ZnODAyMTFfaW5kaWNhdGVfY29ubmVjdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnR3X2NmZzgwMjExX2luZGljYXRlX2Rpc2Nvbm5lY3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zY2FuX2RvbmUoc3RydWN0IHJ0d193ZGV2X3ByaXYgKnB3ZGV2X3ByaXYsCi0JCQkJICAgICBib29sIGFib3J0ZWQpOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zdGFfYXNzb2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgIHU4ICpwbWdtdF9mcmFtZSwgdWludCBmcmFtZV9sZW4pOwotdm9pZCBydHdfY2ZnODAyMTFfaW5kaWNhdGVfc3RhX2Rpc2Fzc29jKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJCXVuc2lnbmVkIGNoYXIgKmRhLCB1bnNpZ25lZCBzaG9ydCByZWFzb24pOwotI2VuZGlmIC8qIENPTkZJR184NzIzQVVfQVBfTU9ERSAqLwotCi1ib29sIHJ0d19jZmc4MDIxMV9wd3JfbWdtdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotCi0jZW5kaWYgLyogX19JT0NUTF9DRkc4MDIxMV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9tbG1lX29zZGVwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvbWxtZV9vc2RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmI1NTI1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9tbG1lX29zZGVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYJX19NTE1FX09TREVQX0hfCi0jZGVmaW5lIF9fTUxNRV9PU0RFUF9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi12b2lkIHJ0d19vc19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIHJ0d19yZXNldF9zZWN1cml0eXByaXYyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLQotI2VuZGlmCS8qIF9NTE1FX09TREVQX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZjJmMjguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbS5oCisrKyAvZGV2L251bGwKQEAgLTEsODYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYJX19IQUxETU9VVFNSQ19IX18KLSNkZWZpbmUgX19IQUxETU9VVFNSQ19IX18KLQotLyogICovCi0vKiAgRGVmaW5pdGlvbiAqLwotLyogICovCi0vKiAgKi8KLS8qICAyMDExLzA5LzIyIE1IIERlZmluZSBhbGwgdGVhbSBzdXBwcnQgYWJpbGl0eS4gKi8KLS8qICAqLwotCi0vKiAgKi8KLS8qICAyMDExLzA5LzIyIE1IIERlZmluZSBmb3IgYWxsIHRlYW1zLiBQbGVhc2UgRGVmaW5lIHRoZSBjb25zdGFuIGluIHlvdXIgcHJlY29tcCBoZWFkZXIuICovCi0vKiAgKi8KLS8qIGRlZmluZQkJRE1fT0RNX1NVUFBPUlRfQVAJCQkwICovCi0vKiBkZWZpbmUJCURNX09ETV9TVVBQT1JUX0FEU0wJCQkwICovCi0vKiBkZWZpbmUJCURNX09ETV9TVVBQT1JUX0NFCQkJMCAqLwotLyogZGVmaW5lCQlETV9PRE1fU1VQUE9SVF9NUAkJCTEgKi8KLQotI2RlZmluZQlUUF9NT0RFCQkwCi0jZGVmaW5lCVJTU0lfTU9ERQkJMQotI2RlZmluZQlUUkFGRklDX0xPVwkwCi0jZGVmaW5lCVRSQUZGSUNfSElHSAkxCi0KLQotLyogICovCi0vKiAzIFR4IFBvd2VyIFRyYWNraW5nICovCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lCQlEUEtfREVMVEFfTUFQUElOR19OVU0JMTMKLSNkZWZpbmUJCWluZGV4X21hcHBpbmdfSFBfTlVNCTE1Ci0KLQotLyogICovCi0vKiAzIFBTRCBIYW5kbGVyICovCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLSNkZWZpbmUJQUZIX1BTRAkJMQkvKiAwOm5vcm1hbCBQU0Qgc2NhbiwgMTogb25seSBkbyAyMCBwdHMgUFNEICovCi0jZGVmaW5lCU1PREVfNDBNCQkwCS8qIDA6MjBNLCAxOjQwTSAqLwotI2RlZmluZQlQU0RfVEgyCQkzCi0jZGVmaW5lCVBTRF9DSE1JTgkJMjAgICAvKiAgTWluaW11bSBjaGFubmVsIG51bWJlciBmb3IgQlQgQUZIICovCi0jZGVmaW5lCVNJUl9TVEVQX1NJWkUJMwotI2RlZmluZSAgIFNtb290aF9TaXplXzEJCTUKLSNkZWZpbmUJU21vb3RoX1RIXzEJMwotI2RlZmluZSAgIFNtb290aF9TaXplXzIJCTEwCi0jZGVmaW5lCVNtb290aF9USF8yCTQKLSNkZWZpbmUgICBTbW9vdGhfU2l6ZV8zCQkyMAotI2RlZmluZQlTbW9vdGhfVEhfMwk0Ci0jZGVmaW5lICAgU21vb3RoX1N0ZXBfU2l6ZSA1Ci0jZGVmaW5lCUFkYXB0aXZlX1NJUgkxCi0jZGVmaW5lCVBTRF9SRVNDQU4JCTQKLSNkZWZpbmUJUFNEX1NDQU5fSU5URVJWQUwJNzAwIC8qIG1zICovCi0KLS8qIDg3MjNBIEhpZ2ggUG93ZXIgSUdJIFNldHRpbmcgKi8KLSNkZWZpbmUgRE1fRElHX0hJR0hfUFdSX0lHSV9MT1dFUl9CT1VORAkweDIyCi0jZGVmaW5lIERNX0RJR19HbW9kZV9ISUdIX1BXUl9JR0lfTE9XRVJfQk9VTkQgMHgyOAotI2RlZmluZSBETV9ESUdfSElHSF9QV1JfVEhSRVNIT0xECTB4M2EKLQotLyogIExQUyBkZWZpbmUgKi8KLSNkZWZpbmUgRE1fRElHX0ZBX1RIMF9MUFMJCQkJNCAvKiAgNCBpbiBscHMgKi8KLSNkZWZpbmUgRE1fRElHX0ZBX1RIMV9MUFMJCQkJMTUgLyogIDE1IGxwcyAqLwotI2RlZmluZSBETV9ESUdfRkFfVEgyX0xQUwkJCQkzMCAvKiAgMzAgbHBzICovCi0jZGVmaW5lIFJTU0lfT0ZGU0VUX0RJRwkJCQkJMHgwNTsKLQotLyogQU5UIFRlc3QgKi8KLSNkZWZpbmUJCQlBTlRURVNUQUxMCQkweDAwCQkvKiBBbnQgQSBvciBCIHdpbGwgYmUgVGVzdGluZyAqLwotI2RlZmluZQkJQU5UVEVTVEEJCTB4MDEJCS8qIEFudCBBIHdpbGwgYmUgVGVzdGluZyAqLwotI2RlZmluZQkJQU5UVEVTVEIJCTB4MDIJCS8qIEFudCBCIHdpbGwgYmUgdGVzdGluZyAqLwotCi0KLS8qICAqLwotLyogIHN0cnVjdHVyZSBhbmQgZGVmaW5lICovCi0vKiAgKi8KLQotc3RydWN0ICBkaWdfdCB7Ci0JdTgJCURpZ19FbmFibGVfRmxhZzsKLQl1OAkJRGlnX0V4dF9Qb3J0X1N0YWdlOwotCi0JaW50CQlSc3NpTG93VGhyZXNoOwotCWludAkJUnNzaUhpZ2hUaHJlc2g7Ci0KLQl1MzIJCUZBTG93VGhyZXNoOwotCXUzMgkJRkFIaWdoVGhyZXNoOwotCi0JdTgJCUN1clNUQUNvbm5lY3RTdGF0ZTsKLQl1OAkJUHJlU1RBQ29ubmVjdFN0YXRlOwotCXU4CQlDdXJNdWx0aVNUQUNvbm5lY3RTdGF0ZTsKLQotCXU4CQlQcmVJR1ZhbHVlOwotCXU4CQlDdXJJR1ZhbHVlOwotCXU4CQlCYWNrdXBJR1ZhbHVlOwotCi0JczgJCUJhY2tvZmZWYWw7Ci0JczgJCUJhY2tvZmZWYWxfcmFuZ2VfbWF4OwotCXM4CQlCYWNrb2ZmVmFsX3JhbmdlX21pbjsKLQl1OAkJcnhfZ2Fpbl9yYW5nZV9tYXg7Ci0JdTgJCXJ4X2dhaW5fcmFuZ2VfbWluOwotCXU4CQlSc3NpX3ZhbF9taW47Ci0KLQl1OAkJUHJlQ0NLX0NDQVRocmVzOwotCXU4CQlDdXJDQ0tfQ0NBVGhyZXM7Ci0JdTgJCVByZUNDS1BEU3RhdGU7Ci0JdTgJCUN1ckNDS1BEU3RhdGU7Ci0KLQl1OAkJTGFyZ2VGQUhpdDsKLQl1OAkJRm9yYmlkZGVuSUdJOwotCXUzMgkJUmVjb3Zlcl9jbnQ7Ci0KLQl1OAkJRElHX0R5bmFtaWNfTUlOXzA7Ci0JdTgJCURJR19EeW5hbWljX01JTl8xOwotCWJvb2wJCWJNZWRpYUNvbm5lY3RfMDsKLQlib29sCQliTWVkaWFDb25uZWN0XzE7Ci0KLQl1MzIJCVJTU0lfbWF4OwotfTsKLQotc3RydWN0IGR5bmFtaWNfcHdyX3NhdiB7Ci0JdTgJCVByZUNDQVN0YXRlOwotCXU4CQlDdXJDQ0FTdGF0ZTsKLQotCXU4CQlQcmVSRlN0YXRlOwotCXU4CQlDdXJSRlN0YXRlOwotCi0JaW50CQkgICAgUnNzaV92YWxfbWluOwotCi0JdTgJCWluaXRpYWxpemU7Ci0JdTMyCQlSZWc4NzQsIFJlZ0M3MCwgUmVnODVDLCBSZWdBNzQ7Ci19OwotCi1zdHJ1Y3QgZmFsc2VfYWxhcm1fc3RhdHMgewotCXUzMglDbnRfUGFyaXR5X0ZhaWw7Ci0JdTMyCUNudF9SYXRlX0lsbGVnYWw7Ci0JdTMyCUNudF9DcmM4X2ZhaWw7Ci0JdTMyCUNudF9NY3NfZmFpbDsKLQl1MzIJQ250X09mZG1fZmFpbDsKLQl1MzIJQ250X0Nja19mYWlsOwotCXUzMglDbnRfYWxsOwotCXUzMglDbnRfRmFzdF9Gc3luYzsKLQl1MzIJQ250X1NCX1NlYXJjaF9mYWlsOwotCXUzMglDbnRfT0ZETV9DQ0E7Ci0JdTMyCUNudF9DQ0tfQ0NBOwotCXUzMglDbnRfQ0NBX2FsbDsKLQl1MzIJQ250X0JXX1VTQzsJLyogR2FyeSAqLwotCXUzMglDbnRfQldfTFNDOwkvKiBHYXJ5ICovCi19OwotCi0jZGVmaW5lIEFTU09DSUFURV9FTlRSWV9OVU0JCQkJCTMyIC8qICBNYXggc2l6ZSBvZiBBc29jRW50cnlbXS4gKi8KLSNkZWZpbmUJT0RNX0FTU09DSUFURV9FTlRSWV9OVU0JCQkJQVNTT0NJQVRFX0VOVFJZX05VTQotCi0vKiAgVGhpcyBpbmRpY2F0ZXMgdHdvIGRpZmZlcmVudCB0aGUgc3RlcHMuICovCi0vKiAgSW4gU1dBV19TVEVQX1BFQUssIGRyaXZlciBuZWVkcyB0byBzd2l0Y2ggYW50ZW5uYSBhbmQgbGlzdGVuIHRvIHRoZSBzaWduYWwgb24gdGhlIGFpci4gKi8KLS8qICBJbiBTV0FXX1NURVBfREVURVJNSU5FLCBkcml2ZXIganVzdCBjb21wYXJlcyB0aGUgc2lnbmFsIGNhcHR1cmVkIGluIFNXQVdfU1RFUF9QRUFLICovCi0vKiAgd2l0aCBvcmlnaW5hbCBSU1NJIHRvIGRldGVybWluZSBpZiBpdCBpcyBuZWNlc3NhcnkgdG8gc3dpdGNoIGFudGVubmEuICovCi0jZGVmaW5lIFNXQVdfU1RFUF9QRUFLCQkwCi0jZGVmaW5lIFNXQVdfU1RFUF9ERVRFUk1JTkUJMQotCi0jZGVmaW5lCVRQX01PREUJCTAKLSNkZWZpbmUJUlNTSV9NT0RFCQkxCi0jZGVmaW5lCVRSQUZGSUNfTE9XCTAKLSNkZWZpbmUJVFJBRkZJQ19ISUdICTEKLQotc3RydWN0IHN3X2FudF9zdyB7Ci0JdTgJCXRyeV9mbGFnOwotCXMzMgkJUHJlUlNTSTsKLQl1OAkJQ3VyQW50ZW5uYTsKLQl1OAkJUHJlQW50ZW5uYTsKLQl1OAkJUlNTSV9Ucnlpbmc7Ci0JdTgJCVRlc3RNb2RlOwotCXU4CQliVHJpZ2dlckFudGVubmFTd2l0Y2g7Ci0JdTgJCVNlbGVjdEFudGVubmFNYXA7Ci0JdTgJCVJTU0lfdGFyZ2V0OwotCi0JLyogIEJlZm9yZSBsaW5rIEFudGVubmEgU3dpdGNoIGNoZWNrICovCi0JdTgJCVNXQVNfTm9MaW5rX1N0YXRlOwotCXUzMgkJU1dBU19Ob0xpbmtfQktfUmVnODYwOwotCWJvb2wJCUFOVEFfT047CS8qIFRvIGluZGljYXRlIEFudCBBIGlzIG9yIG5vdCAqLwotCWJvb2wJCUFOVEJfT047CS8qIFRvIGluZGljYXRlIEFudCBCIGlzIG9uIG9yIG5vdCAqLwotCi0JczMyCQlSU1NJX3N1bV9BOwotCXMzMgkJUlNTSV9zdW1fQjsKLQlzMzIJCVJTU0lfY250X0E7Ci0JczMyCQlSU1NJX2NudF9COwotCi0JdTY0CQlsYXN0VHhPa0NudDsKLQl1NjQJCWxhc3RSeE9rQ250OwotCXU2NAkJVFhCeXRlQ250X0E7Ci0JdTY0CQlUWEJ5dGVDbnRfQjsKLQl1NjQJCVJYQnl0ZUNudF9BOwotCXU2NAkJUlhCeXRlQ250X0I7Ci0JdTgJCVRyYWZmaWNMb2FkOwotfTsKLQotc3RydWN0IGVkY2FfdHVyYm8gewotCWJvb2wgYkN1cnJlbnRUdXJib0VEQ0E7Ci0JdTMyCXBydl90cmFmZmljX2lkeDsgLyogIGVkY2EgdHVyYm8gKi8KLX07Ci0KLXN0cnVjdCBvZG1fcmF0ZV9hZGFwdCB7Ci0JdTgJVHlwZTsJCS8qICBETV9UeXBlX0J5RlcvRE1fVHlwZV9CeURyaXZlciAqLwotCXU4CUhpZ2hSU1NJVGhyZXNoOwkvKiAgaWYgUlNTSSA+IEhpZ2hSU1NJVGhyZXNoCT0+IFJBVFJTdGF0ZSBpcyBETV9SQVRSX1NUQV9ISUdIICovCi0JdTgJTG93UlNTSVRocmVzaDsJLyogIGlmIFJTU0kgPD0gTG93UlNTSVRocmVzaAk9PiBSQVRSU3RhdGUgaXMgRE1fUkFUUl9TVEFfTE9XICovCi0JdTgJUkFUUlN0YXRlOwkvKiAgQ3VycmVudCBSU1NJIGxldmVsLCBETV9SQVRSX1NUQV9ISUdIL0RNX1JBVFJfU1RBX01JRERMRS9ETV9SQVRSX1NUQV9MT1cgKi8KLQl1MzIJTGFzdFJBVFI7CS8qICBSQVRSIFJlZ2lzdGVyIENvbnRlbnQgKi8KLX07Ci0KLSNkZWZpbmUgSVFLX01BQ19SRUdfTlVNCQk0Ci0jZGVmaW5lIElRS19BRERBX1JFR19OVU0JCTE2Ci0jZGVmaW5lIElRS19CQl9SRUdfTlVNX01BWAkxMAotI2RlZmluZSBJUUtfQkJfUkVHX05VTQkJOQotI2RlZmluZSBIUF9USEVSTUFMX05VTQkJOAotCi0jZGVmaW5lIEFWR19USEVSTUFMX05VTQkJOAotI2RlZmluZSBJUUtfTWF0cml4X1JFR19OVU0JOAotI2RlZmluZSBJUUtfTWF0cml4X1NldHRpbmdzX05VTQkxKzI0KzIxCi0KLSNkZWZpbmUJCURNX1R5cGVfQnlGVwkJCTAKLSNkZWZpbmUJCURNX1R5cGVfQnlEcml2ZXIJCTEKLQotLyogIERlY2xhcmUgZm9yIGNvbW1vbiBpbmZvICovCi0KLXN0cnVjdCBvZG1fcGh5X2RiZ19pbmZvIHsKLQkvKiBPRE0gV3JpdGUsZGVidWcgaW5mbyAqLwotCXM4CQlSeFNOUmRCW1JGX1BBVEhfTUFYXTsKLQl1NjQJCU51bVFyeVBoeVN0YXR1czsKLQl1NjQJCU51bVFyeVBoeVN0YXR1c0NDSzsKLQl1NjQJCU51bVFyeVBoeVN0YXR1c09GRE07Ci0JLyogT3RoZXJzICovCi0JczMyCQlSeEVWTVtSRl9QQVRIX01BWF07Ci0KLX07Ci0KLXN0cnVjdCBvZG1fcGFja2V0X2luZm8gewotCXU4CQlSYXRlOwotCXU4CQlTdGF0aW9uSUQ7Ci0JYm9vbAkJYlBhY2tldE1hdGNoQlNTSUQ7Ci0JYm9vbAkJYlBhY2tldFRvU2VsZjsKLQlib29sCQliUGFja2V0QmVhY29uOwotfTsKLQotCi1lbnVtIHsKLQkvKiAgQkIgVGVhbSAqLwotCU9ETV9ESUcJCQk9IDB4MDAwMDAwMDEsCi0JT0RNX0hJR0hfUE9XRVIJCT0gMHgwMDAwMDAwMiwKLQlPRE1fQ0NLX0NDQV9USAkJPSAweDAwMDAwMDA0LAotCU9ETV9GQV9TVEFUSVNUSUNTCT0gMHgwMDAwMDAwOCwKLQlPRE1fUkFNQVNLCQk9IDB4MDAwMDAwMTAsCi0JT0RNX1JTU0lfTU9OSVRPUgk9IDB4MDAwMDAwMjAsCi0JT0RNX1NXX0FOVERJVgkJPSAweDAwMDAwMDQwLAotCU9ETV9IV19BTlRESVYJCT0gMHgwMDAwMDA4MCwKLQlPRE1fQkJfUFdSU1YJCT0gMHgwMDAwMDEwMCwKLQlPRE1fMlRQQVRIRElWCQk9IDB4MDAwMDAyMDAsCi0JT0RNXzFUUEFUSERJVgkJPSAweDAwMDAwNDAwLAotCU9ETV9QU0QyQUZICQk9IDB4MDAwMDA4MDAKLX07Ci0KLS8qICAqLwotLyogIDIwMTEvMTAvMjAgTUggRGVmaW5lIENvbW1vbiBpbmZvIGVudW0gZm9yIGFsbCB0ZWFtLiAqLwotLyogICovCi0KLWVudW0gb2RtX2NtbmluZm8gewotCS8qICBGaXhlZCB2YWx1ZTogKi8KLQkvKiAgKi8KLQotCU9ETV9DTU5JTkZPX01QX1RFU1RfQ0hJUCA9IDIsCi0JT0RNX0NNTklORk9fSUNfVFlQRSwJCQkvKiAgZW51bSBvZG1faWNfdHlwZV9kZWYgKi8KLQlPRE1fQ01OSU5GT19DVVRfVkVSLAkJCS8qICBlbnVtIG9kbV9jdXRfdmVyc2lvbiAqLwotCU9ETV9DTU5JTkZPX0ZBQl9WRVIsCQkJLyogIGVudW0gb2RtX2ZhYl92ZXJzaW9uICovCi0JT0RNX0NNTklORk9fQk9BUkRfVFlQRSwJCQkvKiAgZW51bSBvZG1fYm9hcmRfdHlwZSAqLwotCU9ETV9DTU5JTkZPX0VYVF9MTkEsCQkJLyogIHRydWUgKi8KLQlPRE1fQ01OSU5GT19FWFRfUEEsCi0JT0RNX0NNTklORk9fRVhUX1RSU1csCi0JT0RNX0NNTklORk9fQklOSENUX1RFU1QsCi0JT0RNX0NNTklORk9fQldJRklfVEVTVCwKLQlPRE1fQ01OSU5GT19TTUFSVF9DT05DVVJSRU5ULAotCi0KLQkvKiAgKi8KLQkvKiAgRHluYW1pYyB2YWx1ZTogKi8KLQkvKiAgKi8KLQlPRE1fQ01OSU5GT19NUF9NT0RFLAotCi0JT0RNX0NNTklORk9fV0lGSV9ESVJFQ1QsCi0JT0RNX0NNTklORk9fV0lGSV9ESVNQTEFZLAotCU9ETV9DTU5JTkZPX0xJTkssCi0JT0RNX0NNTklORk9fUlNTSV9NSU4sCi0JT0RNX0NNTklORk9fREJHX0NPTVAsCQkJCS8qICB1NjQgKi8KLQlPRE1fQ01OSU5GT19EQkdfTEVWRUwsCQkJCS8qICB1MzIgKi8KLQlPRE1fQ01OSU5GT19SQV9USFJFU0hPTERfSElHSCwJCS8qICB1OCAqLwotCU9ETV9DTU5JTkZPX1JBX1RIUkVTSE9MRF9MT1csCQkvKiAgdTggKi8KLQlPRE1fQ01OSU5GT19SRl9BTlRFTk5BX1RZUEUsCQkvKiAgdTggKi8KLQlPRE1fQ01OSU5GT19CVF9ESVNBQkxFRCwKLQlPRE1fQ01OSU5GT19CVF9PUEVSQVRJT04sCi0JT0RNX0NNTklORk9fQlRfRElHLAotCU9ETV9DTU5JTkZPX0JUX0JVU1ksCQkJCQkvKiBDaGVjayBCdCBpcyB1c2luZyBvciBub3QgKi8KLQlPRE1fQ01OSU5GT19CVF9ESVNBQkxFX0VEQ0EsCi0KLQkvKiAgKi8KLQkvKiAgRHluYW1pYyBwdHIgYXJyYXkgaG9vayBpdG1zLiAqLwotCS8qICAqLwotCU9ETV9DTU5JTkZPX1NUQV9TVEFUVVMsCi0JT0RNX0NNTklORk9fUEhZX1NUQVRVUywKLQlPRE1fQ01OSU5GT19NQUNfU1RBVFVTLAotCi0JT0RNX0NNTklORk9fTUFYLAotfTsKLQotLyogIERlZmluZSBPRE0gc3VwcG9ydCBhYmlsaXR5LiAgT0RNX0NNTklORk9fQUJJTElUWSAqLwotZW51bSB7Ci0JLyogIEJCIE9ETSBzZWN0aW9uIEJJVCAwLTE1ICovCi0JT0RNX0JCX0FOVF9ESVYJCQkJPSBCSVQoNiksCi19OwotCi0vKglPRE1fQ01OSU5GT19JTlRFUkZBQ0UgKi8KLWVudW0gb2RtX2ludGVyZmFjZV9kZWYgewotCU9ETV9JVFJGX1BDSUUJPQkweDEsCi0JT0RNX0lUUkZfVVNCCT0JMHgyLAotCU9ETV9JVFJGX1NESU8JPQkweDQsCi0JT0RNX0lUUkZfQUxMCT0JMHg3LAotfTsKLQotLyogIE9ETV9DTU5JTkZPX0lDX1RZUEUgKi8KLWVudW0gb2RtX2ljX3R5cGVfZGVmIHsKLQlPRE1fUlRMODE5MlMJPQlCSVQoMCksCi0JT0RNX1JUTDgxOTJDCT0JQklUKDEpLAotCU9ETV9SVEw4MTkyRAk9CUJJVCgyKSwKLQlPRE1fUlRMODcyM0EJPQlCSVQoMyksCi0JT0RNX1JUTDgxODhFCT0JQklUKDQpLAotCU9ETV9SVEw4ODEyCT0JQklUKDUpLAotCU9ETV9SVEw4ODIxCT0JQklUKDYpLAotfTsKLQotLyogT0RNX0NNTklORk9fQ1VUX1ZFUiAqLwotZW51bSBvZG1fY3V0X3ZlcnNpb24gewotCU9ETV9DVVRfQQkJPQkxLAotCU9ETV9DVVRfQgkJPQkyLAotCU9ETV9DVVRfQwkJPQkzLAotCU9ETV9DVVRfRAkJPQk0LAotCU9ETV9DVVRfRQkJPQk1LAotCU9ETV9DVVRfRgkJPQk2LAotCU9ETV9DVVRfVEVTVAkJPQk3LAotfTsKLQotLyogIE9ETV9DTU5JTkZPX0ZBQl9WRVIgKi8KLWVudW0gb2RtX2ZhYl92ZXJzaW9uIHsKLQlPRE1fVFNNQwk9CTAsCi0JT0RNX1VNQwkJPQkxLAotfTsKLQotLyogIEZvciBleGFtcGxlIDFUMlIgKEErQUIgPSBCSVQwfEJJVDR8QklUNSkgKi8KLWVudW0gcmZfcGF0aF9kZWYgewotCU9ETV9SRl9UWF9BCT0JQklUKDApLAotCU9ETV9SRl9UWF9CCT0JQklUKDEpLAotCU9ETV9SRl9UWF9DCT0JQklUKDIpLAotCU9ETV9SRl9UWF9ECT0JQklUKDMpLAotCU9ETV9SRl9SWF9BCT0JQklUKDQpLAotCU9ETV9SRl9SWF9CCT0JQklUKDUpLAotCU9ETV9SRl9SWF9DCT0JQklUKDYpLAotCU9ETV9SRl9SWF9ECT0JQklUKDcpLAotfTsKLQotLyogIE9ETSBEeW5hbWljIGNvbW1vbiBpbmZvIHZhbHVlIGRlZmluaXRpb24gKi8KLQotZW51bSBvZG1fbWFjX3BoeV9tb2RlIHsKLQlPRE1fU01TUAk9IDAsCi0JT0RNX0RNU1AJPSAxLAotCU9ETV9ETURQCT0gMiwKLX07Ci0KLQotZW51bSBvZG1fYnRfY29leGlzdCB7Ci0JT0RNX0JUX0JVU1kJCT0gMSwKLQlPRE1fQlRfT04JCT0gMiwKLQlPRE1fQlRfT0ZGCQk9IDMsCi0JT0RNX0JUX05PTkUJCT0gNCwKLX07Ci0KLS8qICBPRE1fQ01OSU5GT19PUF9NT0RFICovCi1lbnVtIG9kbV9vcGVyYXRpb25fbW9kZSB7Ci0JT0RNX05PX0xJTksJCT0gQklUKDApLAotCU9ETV9MSU5LCQk9IEJJVCgxKSwKLQlPRE1fU0NBTgkJPSBCSVQoMiksCi0JT0RNX1BPV0VSU0FWRQkJPSBCSVQoMyksCi0JT0RNX0FQX01PREUJCT0gQklUKDQpLAotCU9ETV9DTElFTlRfTU9ERQkJPSBCSVQoNSksCi0JT0RNX0FEX0hPQwkJPSBCSVQoNiksCi0JT0RNX1dJRklfRElSRUNUCQk9IEJJVCg3KSwKLQlPRE1fV0lGSV9ESVNQTEFZCT0gQklUKDgpLAotfTsKLQotLyogIE9ETV9DTU5JTkZPX1dNX01PREUgKi8KLWVudW0gb2RtX3dpcmVsZXNzX21vZGUgewotCU9ETV9XTV9VTktOT1cJCT0gMHgwLAotCU9ETV9XTV9CCQk9IEJJVCgwKSwKLQlPRE1fV01fRwkJPSBCSVQoMSksCi0JT0RNX1dNX0EJCT0gQklUKDIpLAotCU9ETV9XTV9OMjRHCQk9IEJJVCgzKSwKLQlPRE1fV01fTjVHCQk9IEJJVCg0KSwKLQlPRE1fV01fQVVUTwkJPSBCSVQoNSksCi0JT0RNX1dNX0FDCQk9IEJJVCg2KSwKLX07Ci0KLS8qICBPRE1fQ01OSU5GT19CQU5EICovCi1lbnVtIG9kbV9iYW5kX3R5cGUgewotCU9ETV9CQU5EXzJfNEcJCT0gQklUKDApLAotCU9ETV9CQU5EXzVHCQk9IEJJVCgxKSwKLQotfTsKLQotLyogIE9ETV9DTU5JTkZPX1NFQ19DSE5MX09GRlNFVCAqLwotZW51bSBvZG1fc2VjX2Nobmxfb2Zmc2V0IHsKLQlPRE1fRE9OVF9DQVJFCQk9IDAsCi0JT0RNX0JFTE9XCQk9IDEsCi0JT0RNX0FCT1ZFCQk9IDIKLX07Ci0KLS8qICBPRE1fQ01OSU5GT19DSE5MICovCi0KLS8qICBPRE1fQ01OSU5GT19CT0FSRF9UWVBFICovCi1lbnVtIG9kbV9ib2FyZF90eXBlIHsKLQlPRE1fQk9BUkRfTk9STUFMCT0gMCwKLQlPRE1fQk9BUkRfSElHSFBXUgk9IDEsCi0JT0RNX0JPQVJEX01JTklDQVJECT0gMiwKLQlPRE1fQk9BUkRfU0xJTQkJPSAzLAotCU9ETV9CT0FSRF9DT01CTwkJPSA0LAotCi19OwotCi0vKiAgT0RNX0NNTklORk9fT05FX1BBVEhfQ0NBICovCi1lbnVtIG9kbV9jY2FfcGF0aCB7Ci0JT0RNX0NDQV8yUgkJCT0gMCwKLQlPRE1fQ0NBXzFSX0EJCQk9IDEsCi0JT0RNX0NDQV8xUl9CCQkJPSAyLAotfTsKLQotc3RydWN0IGlxa19tYXRyaXhfcmVnc19zZXQgewotCWJvb2wJYklRS0RvbmU7Ci0JczMyCVZhbHVlWzFdW0lRS19NYXRyaXhfUkVHX05VTV07Ci19OwotCi1zdHJ1Y3Qgb2RtX3JmX2NhbF90IHsKLQkvKiBmb3IgdHggcG93ZXIgdHJhY2tpbmcgKi8KLQotCXUzMglSZWdBMjQ7IC8qICBmb3IgVGVtcENDSyAqLwotCXMzMglSZWdFOTQ7Ci0JczMyCVJlZ0U5QzsKLQlzMzIJUmVnRUI0OwotCXMzMglSZWdFQkM7Ci0KLQkvKiB1OCBiVFhQb3dlclRyYWNraW5nOyAqLwotCXU4CQlUWFBvd2VyY291bnQ7Ci0JYm9vbCBiVFhQb3dlclRyYWNraW5nSW5pdDsKLQlib29sIGJUWFBvd2VyVHJhY2tpbmc7Ci0JdTgJCVR4UG93ZXJUcmFja0NvbnRyb2w7IC8qIGZvciBtcCBtb2RlLCB0dXJuIG9mZiB0eHB3cnRyYWNraW5nIGFzIGRlZmF1bHQgKi8KLQl1OAkJVE1fVHJpZ2dlcjsKLQl1OAkJSW50ZXJuYWxQQTVHWzJdOwkvKiBwYXRoQSAvIHBhdGhCICovCi0KLQl1OAkJVGhlcm1hbE1ldGVyWzJdOyAgICAvKiAgVGhlcm1hbE1ldGVyLCBpbmRleCAwIGZvciBSRklDMCwgYW5kIDEgZm9yIFJGSUMxICovCi0JdTgJCVRoZXJtYWxWYWx1ZTsKLQl1OAkJVGhlcm1hbFZhbHVlX0xDSzsKLQl1OAkJVGhlcm1hbFZhbHVlX0lRSzsKLQl1OAlUaGVybWFsVmFsdWVfRFBLOwotCXU4CVRoZXJtYWxWYWx1ZV9BVkdbQVZHX1RIRVJNQUxfTlVNXTsKLQl1OAlUaGVybWFsVmFsdWVfQVZHX2luZGV4OwotCXU4CVRoZXJtYWxWYWx1ZV9SeEdhaW47Ci0JdTgJVGhlcm1hbFZhbHVlX0NyeXN0YWw7Ci0JdTgJVGhlcm1hbFZhbHVlX0RQS3N0b3JlOwotCXU4CVRoZXJtYWxWYWx1ZV9EUEt0cmFjazsKLQlib29sCVR4UG93ZXJUcmFja2luZ0luUHJvZ3Jlc3M7Ci0JYm9vbAliRFBLZW5hYmxlOwotCi0JYm9vbAliUmVsb2FkdHhwb3dlcmluZGV4OwotCXU4CWJSZlBpRW5hYmxlOwotCXUzMglUWFBvd2VyVHJhY2tpbmdDYWxsYmFja0NudDsgLyogY29zYSBhZGQgZm9yIGRlYnVnICovCi0KLQl1OAliQ0NLaW5DSDE0OwotCXU4CUNDS19pbmRleDsKLQl1OAlPRkRNX2luZGV4WzJdOwotCWJvb2wgYkRvbmVUeHBvd2VyOwotCi0JdTgJVGhlcm1hbFZhbHVlX0hQW0hQX1RIRVJNQUxfTlVNXTsKLQl1OAlUaGVybWFsVmFsdWVfSFBfaW5kZXg7Ci0Jc3RydWN0IGlxa19tYXRyaXhfcmVnc19zZXQgSVFLTWF0cml4UmVnU2V0dGluZ1tJUUtfTWF0cml4X1NldHRpbmdzX05VTV07Ci0KLQl1OAlEZWx0YV9JUUs7Ci0JdTgJRGVsdGFfTENLOwotCi0JLyogZm9yIElRSyAqLwotCXUzMglSZWdDMDQ7Ci0JdTMyCVJlZzg3NDsKLQl1MzIJUmVnQzA4OwotCXUzMglSZWdCNjg7Ci0JdTMyCVJlZ0I2QzsKLQl1MzIJUmVnODcwOwotCXUzMglSZWc4NjA7Ci0JdTMyCVJlZzg2NDsKLQotCWJvb2wJYklRS0luaXRpYWxpemVkOwotCWJvb2wgYkxDS0luUHJvZ3Jlc3M7Ci0JYm9vbAliQW50ZW5uYURldGVjdGVkOwotCXUzMglBRERBX2JhY2t1cFtJUUtfQUREQV9SRUdfTlVNXTsKLQl1MzIJSVFLX01BQ19iYWNrdXBbSVFLX01BQ19SRUdfTlVNXTsKLQl1MzIJSVFLX0JCX2JhY2t1cF9yZWNvdmVyWzldOwotCXUzMglJUUtfQkJfYmFja3VwW0lRS19CQl9SRUdfTlVNXTsKLQotCS8qIGZvciBBUEsgKi8KLQl1MzIJQVBLb3V0cHV0WzJdWzJdOyAvKiBwYXRoIEEvQjsgb3V0cHV0MV8xYS9vdXRwdXQxXzJhICovCi0JdTgJYkFQS2RvbmU7Ci0JdTgJYkFQS1RoZXJtYWxNZXRlcklnbm9yZTsKLQl1OAliRFBkb25lOwotCXU4CWJEUFBhdGhBT0s7Ci0JdTgJYkRQUGF0aEJPSzsKLX07Ci0KLWVudW0gYW50X2RpZl90eXBlIHsKLQlOT19BTlRESVYJCQk9IDB4RkYsCi0JQ0dfVFJYX0hXX0FOVERJVgkJPSAweDAxLAotCUNHQ1NfUlhfSFdfQU5URElWCQk9IDB4MDIsCi0JRklYRURfSFdfQU5URElWCQkJPSAweDAzLAotCUNHX1RSWF9TTUFSVF9BTlRESVYJCT0gMHgwNCwKLQlDR0NTX1JYX1NXX0FOVERJVgkJPSAweDA1LAotfTsKLQotLyogIDIwMTEvMDkvMjIgTUggQ29weSBmcm9tIFNENCBkZWZpbmVkIHN0cnVjdHVyZS4gV2UgdXNlIHRvIHN1cHBvcnQgUEhZIERNIGludGVncmF0aW9uLiAqLwotc3RydWN0IGRtX29kbV90IHsKLQkvKiAgKi8KLQkvKglBZGQgZm9yIGRpZmZlcmVudCB0ZWFtIHVzZSB0ZW1wb3JhcmlseSAqLwotCS8qICAqLwotCXN0cnVjdCBydHdfYWRhcHRlcgkqQWRhcHRlcjsJCS8qICBGb3IgQ0UvTklDIHRlYW0gKi8KLQotCXU2NAkJCURlYnVnQ29tcG9uZW50czsKLQl1MzIJCQlEZWJ1Z0xldmVsOwotCi0vKiAgT0RNIEhBTkRMRSwgRFJJVkVSIE5FRURTIE5PVCBUTyBIT09LLS0tLS0tICovCi0JYm9vbAkJCWJDY2tIaWdoUG93ZXI7Ci0JdTgJCQlSRlBhdGhSeEVuYWJsZTsJCS8qICBPRE1fQ01OSU5GT19SRlBBVEhfRU5BQkxFICovCi0vKiAgT0RNIEhBTkRMRSwgRFJJVkVSIE5FRURTIE5PVCBUTyBIT09LLS0tLS0tICovCi0KLS8qIDEgIENPTU1PTiBJTkZPUk1BVElPTiAqLwotCi0JLyogIEluaXQgVmFsdWUgKi8KLS8qIEhPT0sgQkVGT1JFIFJFRyBJTklULS0tLS0tLS0tLS0gKi8KLQkvKiAgT0RNIFN1cHBvcnQgQWJpbGl0eSBESUcvUkFUUi9UWF9QV1JfVFJBQ0svIKFLoUsgPSAxLzIvMy+hSyAqLwotCXUzMgkJCVN1cHBvcnRBYmlsaXR5OwotCS8qICBPRE0gY29tcG9zaXRlIG9yIGluZGVwZW5kZW50LiBCaXQgb3JpZW50ZWQvIDkyQys5MkQrIC4uLi4gb3IgYW55IG90aGVyIHR5cGUgPSAxLzIvMy8uLi4gKi8KLQl1MzIJCQlTdXBwb3J0SUNUeXBlOwotCS8qICBDdXQgVmVyc2lvbiBUZXN0Q2hpcC9BLWN1dC9CLWN1dC4uLiA9IDAvMS8yLzMvLi4uICovCi0JdTgJCQlDdXRWZXJzaW9uOwotCS8qICBGYWIgVmVyc2lvbiBUU01DL1VNQyA9IDAvMSAqLwotCXU4CQkJRmFiVmVyc2lvbjsKLQkvKiAgQm9hcmQgVHlwZSBOb3JtYWwvSGlnaFBvd2VyL01pbmlDYXJkL1NMSU0vQ29tYm8vLi4uID0gMC8xLzIvMy80Ly4uLiAqLwotCXU4CQkJQm9hcmRUeXBlOwotCS8qICB3aXRoIGV4dGVybmFsIExOQSAgTk8vWWVzID0gMC8xICovCi0JdTgJCQlFeHRMTkE7Ci0JLyogIHdpdGggZXh0ZXJuYWwgUEEgIE5PL1llcyA9IDAvMSAqLwotCXU4CQkJRXh0UEE7Ci0JLyogIHdpdGggZXh0ZXJuYWwgVFJTVyAgTk8vWWVzID0gMC8xICovCi0JdTgJCQlFeHRUUlNXOwotCWJvb2wJCQliSW5IY3RUZXN0OwotCWJvb2wJCQliV0lGSVRlc3Q7Ci0KLQlib29sCQkJYkR1YWxNYWNTbWFydENvbmN1cnJlbnQ7Ci0JdTMyCQkJQktfU3VwcG9ydEFiaWxpdHk7Ci0vKiBIT09LIEJFRk9SRSBSRUcgSU5JVC0tLS0tLS0tLS0tICovCi0KLQkvKiAgKi8KLQkvKiAgRHluYW1pYyBWYWx1ZSAqLwotCS8qICAqLwotLyogIFBPSU5URVIgUkVGRVJFTkNFLS0tLS0tLS0tLS0gKi8KLQotCXU4CQkJdThfdGVtcDsKLQlib29sCQkJYm9vbF90ZW1wOwotCXN0cnVjdCBydHdfYWRhcHRlcgkqUEFEQVBURVJfdGVtcDsKLQotLyogIFBPSU5URVIgUkVGRVJFTkNFLS0tLS0tLS0tLS0gKi8KLQkvKiAgKi8KLS8qIENBTEwgQlkgVkFMVUUtLS0tLS0tLS0tLS0tICovCi0JYm9vbAkJCWJXSUZJX0RpcmVjdDsKLQlib29sCQkJYldJRklfRGlzcGxheTsKLQlib29sCQkJYkxpbmtlZDsKLQl1OAkJCVJTU0lfTWluOwotCXU4CQkJSW50ZXJmYWNlSW5kZXg7IC8qICBBZGQgZm9yIDkyRCAgZHVhbCBNQUM6IDAtLU1hYzAgMS0tTWFjMSAqLwotCWJvb2wJCWJJc01QQ2hpcDsKLQlib29sCQkJYk9uZUVudHJ5T25seTsKLQkvKiAgQ29tbW9uIGluZm8gZm9yIEJURE0gKi8KLQlib29sCQkJYkJ0RGlzYWJsZWQ7CQkJLyogIEJUIGlzIGRpc2FibGVkICovCi0JYm9vbAkJCWJCdEhzT3BlcmF0aW9uOwkJLyogIEJUIEhTIG1vZGUgaXMgdW5kZXIgcHJvZ3Jlc3MgKi8KLQl1OAkJCWJ0SHNEaWdWYWw7CQkJLyogIHVzZSBCVCByc3NpIHRvIGRlY2lkZSB0aGUgRElHIHZhbHVlICovCi0JYm9vbAkJCWJCdERpc2FibGVFZGNhVHVyYm87CS8qICBVbmRlciBzb21lIGNvbmRpdGlvbiwgZG9uJ3QgZW5hYmxlIHRoZSBFRENBIFR1cmJvICovCi0JYm9vbAkJCWJCdEJ1c3k7CQkJLyogIEJUIGlzIGJ1c3kuICovCi0vKiBDQUxMIEJZIFZBTFVFLS0tLS0tLS0tLS0tLSAqLwotCi0JLyogMiBEZWZpbmUgU1RBIGluZm8uICovCi0JLyogIF9PRE1fU1RBX0lORk8gKi8KLQkvKiAgMjAxMi8wMS8xMiBNSCBGb3IgTVAsIHdlIG5lZWQgdG8gcmVkdWNlIG9uZSBhcnJheSBwb2ludGVyIGZvciBkZWZhdWx0IHBvcnQuPz8gKi8KLQlzdHJ1Y3Qgc3RhX2luZm8gKgkJcE9ETV9TdGFJbmZvW09ETV9BU1NPQ0lBVEVfRU5UUllfTlVNXTsKLQotCS8qICBMYXRlc3QgcGFja2V0IHBoeSBpbmZvIChPRE0gd3JpdGUpICovCi0Jc3RydWN0IG9kbV9waHlfZGJnX2luZm8JIFBoeURiZ0luZm87Ci0JLyogUEhZX0lORk9fODhFCQlQaHlJbmZvOyAqLwotCi0JLyogIExhdGVzdCBwYWNrZXQgcGh5IGluZm8gKE9ETSB3cml0ZSkgKi8KLQkvKiBNQUNfSU5GT184OEUJCU1hY0luZm87ICovCi0KLQkvKiAgRGlmZmVyZW50IFRlYW0gaW5kZXBlbmR0IHN0cnVjdHVyZT8/ICovCi0KLQkvKiAgKi8KLQkvKiBUWF9SVFBfQ01OCQlUWF9yZXRycG87ICovCi0JLyogVFhfUlRQXzg4RQkJVFhfcmV0cnBvOyAqLwotCS8qIFRYX1JUUF84MTk1CQlUWF9yZXRycG87ICovCi0KLQkvKiAgKi8KLQkvKiBPRE0gU3RydWN0dXJlICovCi0JLyogICovCi0Jc3RydWN0IGRpZ190CURNX0RpZ1RhYmxlOwotCXN0cnVjdCBkeW5hbWljX3B3cl9zYXYJCURNX1BTVGFibGU7Ci0Jc3RydWN0IGZhbHNlX2FsYXJtX3N0YXRzCUZhbHNlQWxtQ250OwotCXN0cnVjdCBmYWxzZV9hbGFybV9zdGF0cwlGbGFzZUFsbUNudEJ1ZGR5QWRhcHRlcjsKLQlzdHJ1Y3Qgc3dfYW50X3N3CQlETV9TV0FUX1RhYmxlOwotCi0Jc3RydWN0IGVkY2FfdHVyYm8JCURNX0VEQ0FfVGFibGU7Ci0JdTMyCQlXTU1FRENBX0JFOwotCS8qICBDb3B5IGZyb20gU0Q0IHN0cnVjdHVyZSAqLwotCS8qICAqLwotCS8qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCS8qICAqLwotCi0JLyogUFNEICovCi0JdTgJCQlSU1NJX0JUOwkJLyogY29tZSBmcm9tIEJUICovCi0Jc3RydWN0IG9kbV9yYXRlX2FkYXB0CVJhdGVBZGFwdGl2ZTsKLQotCi0Jc3RydWN0IG9kbV9yZl9jYWxfdAlSRkNhbGlicmF0ZUluZm87Ci19OwkvKiAgRE1fRHluYW1pY19NZWNoYW5pc21fU3RydWN0dXJlICovCi0KLWVudW0gb2RtX3JmX2NvbnRlbnQgewotCW9kbV9yYWRpb2FfdHh0ID0gMHgxMDAwLAotCW9kbV9yYWRpb2JfdHh0ID0gMHgxMDAxLAotCW9kbV9yYWRpb2NfdHh0ID0gMHgxMDAyLAotCW9kbV9yYWRpb2RfdHh0ID0gMHgxMDAzCi19OwotCi0vKiAgU3RhdHVzIGNvZGUgKi8KLWVudW0gcnRfc3RhdHVzIHsKLQlSVF9TVEFUVVNfU1VDQ0VTUywKLQlSVF9TVEFUVVNfRkFJTFVSRSwKLQlSVF9TVEFUVVNfUEVORElORywKLQlSVF9TVEFUVVNfUkVTT1VSQ0UsCi0JUlRfU1RBVFVTX0lOVkFMSURfQ09OVEVYVCwKLQlSVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIsCi0JUlRfU1RBVFVTX05PVF9TVVBQT1JULAotCVJUX1NUQVRVU19PU19BUElfRkFJTEVELAotfTsKLQotLyogaW5jbHVkZSAib2RtX2Z1bmN0aW9uLmgiICovCi0KLS8qIDM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogMyBESUcgKi8KLS8qIDM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1lbnVtIGRtX2RpZ19vcCB7Ci0JRElHX1RZUEVfVEhSRVNIX0hJR0gJPSAwLAotCURJR19UWVBFX1RIUkVTSF9MT1cJPSAxLAotCURJR19UWVBFX0JBQ0tPRkYJCT0gMiwKLQlESUdfVFlQRV9SWF9HQUlOX01JTgk9IDMsCi0JRElHX1RZUEVfUlhfR0FJTl9NQVgJPSA0LAotCURJR19UWVBFX0VOQUJMRQkJCT0gNSwKLQlESUdfVFlQRV9ESVNBQkxFCQk9IDYsCi0JRElHX09QX1RZUEVfTUFYCi19OwotCi0jZGVmaW5lCQlETV9ESUdfVEhSRVNIX0hJR0gJCQk0MAotI2RlZmluZQkJRE1fRElHX1RIUkVTSF9MT1cJCQkzNQotCi0jZGVmaW5lCQlETV9TQ0FOX1JTU0lfVEgJCQkJMHgxNCAvKiBzY2FuIHJldHVybiBpc3N1ZSBmb3IgTEMgKi8KLQotCi0jZGVmaW5lCQlETV9GQUxTRUFMQVJNX1RIUkVTSF9MT1cJNDAwCi0jZGVmaW5lCQlETV9GQUxTRUFMQVJNX1RIUkVTSF9ISUdICTEwMDAKLQotI2RlZmluZQkJRE1fRElHX01BWF9OSUMJCQkJMHg0ZQotI2RlZmluZQkJRE1fRElHX01JTl9OSUMJCQkJMHgxZQotCi0jZGVmaW5lCQlETV9ESUdfTUFYX0FQCQkJCTB4MzIKLSNkZWZpbmUJCURNX0RJR19NSU5fQVAJCQkJMHgyMAotCi0jZGVmaW5lCQlETV9ESUdfTUFYX05JQ19IUAkJCTB4NDYKLSNkZWZpbmUJCURNX0RJR19NSU5fTklDX0hQCQkJMHgyZQotCi0jZGVmaW5lCQlETV9ESUdfTUFYX0FQX0hQCQkJCTB4NDIKLSNkZWZpbmUJCURNX0RJR19NSU5fQVBfSFAJCQkJMHgzMAotCi0vKiB2aXZpIDkyYyY5MmQgaGFzIGRpZmZlcmVudCBkZWZpbml0aW9uLCAyMDExMDUwNCAqLwotLyogdGhpcyBpcyBmb3IgOTJjICovCi0jZGVmaW5lCQlETV9ESUdfRkFfVEgwCQkJCTB4MjAwCi0jZGVmaW5lCQlETV9ESUdfRkFfVEgxCQkJCTB4MzAwCi0jZGVmaW5lCQlETV9ESUdfRkFfVEgyCQkJCTB4NDAwCi0vKiB0aGlzIGlzIGZvciA5MmQgKi8KLSNkZWZpbmUJCURNX0RJR19GQV9USDBfOTJECQkJMHgxMDAKLSNkZWZpbmUJCURNX0RJR19GQV9USDFfOTJECQkJMHg0MDAKLSNkZWZpbmUJCURNX0RJR19GQV9USDJfOTJECQkJMHg2MDAKLQotI2RlZmluZQkJRE1fRElHX0JBQ0tPRkZfTUFYCQkJMTIKLSNkZWZpbmUJCURNX0RJR19CQUNLT0ZGX01JTgkJCS00Ci0jZGVmaW5lCQlETV9ESUdfQkFDS09GRl9ERUZBVUxUCQkxMAotCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgQUdDIFJYIEhpZ2ggUG93ZXIgTW9kZSAqLwotLyogMz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lICAgICAgICAgIExOQV9Mb3dfR2Fpbl8xICAgICAgICAgICAgICAgICAgICAgIDB4NjQKLSNkZWZpbmUgICAgICAgICAgTE5BX0xvd19HYWluXzIgICAgICAgICAgICAgICAgICAgICAgMHg1QQotI2RlZmluZSAgICAgICAgICBMTkFfTG93X0dhaW5fMyAgICAgICAgICAgICAgICAgICAgICAweDU4Ci0KLSNkZWZpbmUgICAgICAgICAgRkFfUlhIUF9USDEgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDAwCi0jZGVmaW5lICAgICAgICAgIEZBX1JYSFBfVEgyICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUwMAotI2RlZmluZSAgICAgICAgICBGQV9SWEhQX1RIMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODAwCi0jZGVmaW5lICAgICAgICAgIEZBX1JYSFBfVEg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MDAKLSNkZWZpbmUgICAgICAgICAgRkFfUlhIUF9USDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMAotCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgRURDQSAqLwotLyogMz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLS8qIDM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogMyBEeW5hbWljIFR4IFBvd2VyICovCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIER5bmFtaWMgVHggUG93ZXIgQ29udHJvbCBUaHJlc2hvbGQgKi8KLSNkZWZpbmUJCVRYX1BPV0VSX05FQVJfRklFTERfVEhSRVNIX0xWTDIJNzQKLSNkZWZpbmUJCVRYX1BPV0VSX05FQVJfRklFTERfVEhSRVNIX0xWTDEJNjcKLSNkZWZpbmUJCVRYX1BPV0VSX05FQVJfRklFTERfVEhSRVNIX0FQCQkweDNGCi0KLSNkZWZpbmUJCVR4SGlnaFB3ckxldmVsX05vcm1hbAkJMAotI2RlZmluZQkJVHhIaWdoUHdyTGV2ZWxfTGV2ZWwxCQkxCi0jZGVmaW5lCQlUeEhpZ2hQd3JMZXZlbF9MZXZlbDIJCTIKLSNkZWZpbmUJCVR4SGlnaFB3ckxldmVsX0JUMQkJCTMKLSNkZWZpbmUJCVR4SGlnaFB3ckxldmVsX0JUMgkJCTQKLSNkZWZpbmUJCVR4SGlnaFB3ckxldmVsXzE1CQkJNQotI2RlZmluZQkJVHhIaWdoUHdyTGV2ZWxfMzUJCQk2Ci0jZGVmaW5lCQlUeEhpZ2hQd3JMZXZlbF81MAkJCTcKLSNkZWZpbmUJCVR4SGlnaFB3ckxldmVsXzcwCQkJOAotI2RlZmluZQkJVHhIaWdoUHdyTGV2ZWxfMTAwCQkJOQotCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgUmF0ZSBBZGFwdGl2ZSAqLwotLyogMz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lCQlETV9SQVRSX1NUQV9JTklUCQkJMAotI2RlZmluZQkJRE1fUkFUUl9TVEFfSElHSAkJCTEKLSNkZWZpbmUJCQlETV9SQVRSX1NUQV9NSURETEUJCTIKLSNkZWZpbmUJCQlETV9SQVRSX1NUQV9MT1cJCQkzCi0KLS8qIDM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogMyBCQiBQb3dlciBTYXZlICovCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotCi1lbnVtIGRtXzFyX2NjYSB7Ci0JQ0NBXzFSID0wLAotCUNDQV8yUiA9IDEsCi0JQ0NBX01BWCA9IDIsCi19OwotCi1lbnVtIGRtX3JmX2RlZiB7Ci0JUkZfU2F2ZSA9MCwKLQlSRl9Ob3JtYWwgPSAxLAotCVJGX01BWCA9IDIsCi19OwotCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgQW50ZW5uYSBEaXZlcnNpdHkgKi8KLS8qIDM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotZW51bSBkbV9zd2FzIHsKLQlBbnRlbm5hX0EgPSAxLAotCUFudGVubmFfQiA9IDIsCi0JQW50ZW5uYV9NQVggPSAzLAotfTsKLQotLyogIE1heGltYWwgbnVtYmVyIG9mIGFudGVubmEgZGV0ZWN0aW9uIG1lY2hhbmlzbSBuZWVkcyB0byBwZXJmb3JtLCBhZGRlZCBieSBSb2dlciwgMjAxMS4xMi4yOC4gKi8KLSNkZWZpbmUJTUFYX0FOVEVOTkFfREVURUNUSU9OX0NOVAkxMAotCi0vKiAgKi8KLS8qICBFeHRlcm4gR2xvYmFsIFZhcmlhYmxlcy4gKi8KLS8qICAqLwotI2RlZmluZQlPRkRNX1RBQkxFX1NJWkVfOTJDCTM3Ci0jZGVmaW5lCU9GRE1fVEFCTEVfU0laRV85MkQJNDMKLSNkZWZpbmUJQ0NLX1RBQkxFX1NJWkUJCTMzCi0KLWV4dGVybgl1MzIgT0ZETVN3aW5nVGFibGUyM0FbT0ZETV9UQUJMRV9TSVpFXzkyRF07Ci1leHRlcm4JdTggQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxMzIzQVtDQ0tfVEFCTEVfU0laRV1bOF07Ci1leHRlcm4JdTggQ0NLU3dpbmdUYWJsZV9DaDE0MjNBIFtDQ0tfVEFCTEVfU0laRV1bOF07Ci0KLQotCi0vKiAgMjAxMDA1MTQgSm9zZXBoOiBBZGQgZGVmaW5pdGlvbiBmb3IgYW50ZW5uYSBzd2l0Y2hpbmcgdGVzdCBhZnRlciBsaW5rLiAqLwotLyogIFRoaXMgaW5kaWNhdGVzIHR3byBkaWZmZXJlbnQgdGhlIHN0ZXBzLiAqLwotLyogIEluIFNXQVdfU1RFUF9QRUFLLCBkcml2ZXIgbmVlZHMgdG8gc3dpdGNoIGFudGVubmEgYW5kIGxpc3RlbiB0byB0aGUgc2lnbmFsIG9uIHRoZSBhaXIuICovCi0vKiAgSW4gU1dBV19TVEVQX0RFVEVSTUlORSwgZHJpdmVyIGp1c3QgY29tcGFyZXMgdGhlIHNpZ25hbCBjYXB0dXJlZCBpbiBTV0FXX1NURVBfUEVBSyAqLwotLyogIHdpdGggb3JpZ2luYWwgUlNTSSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIHN3aXRjaCBhbnRlbm5hLiAqLwotI2RlZmluZSBTV0FXX1NURVBfUEVBSwkJMAotI2RlZmluZSBTV0FXX1NURVBfREVURVJNSU5FCTEKLQotc3RydWN0IGhhbF9kYXRhXzg3MjNhOwotCi12b2lkIE9ETV9Xcml0ZV9ESUcyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAl1OAlDdXJyZW50SUdJKTsKLXZvaWQgT0RNX1dyaXRlX0NDS19DQ0FfVGhyZXMyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1OAlDdXJDQ0tfQ0NBVGhyZXMpOwotCi12b2lkIE9ETV9TZXRBbnRlbm5hKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTggQW50ZW5uYSk7Ci0KLQotI2RlZmluZSBkbV9SRl9TYXZpbmcJT0RNX1JGX1NhdmluZzIzYQotdm9pZCBPRE1fUkZfU2F2aW5nMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTggYkZvcmNlSW5Ob3JtYWwpOwotCi0jZGVmaW5lIGRtX0NoZWNrVFhQb3dlclRyYWNraW5nCQlPRE1fVFhQb3dlclRyYWNraW5nQ2hlY2syM2EKLXZvaWQgT0RNX1RYUG93ZXJUcmFja2luZ0NoZWNrMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLWJvb2wgT0RNX1JBU3RhdGVDaGVjazIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHMzMiBSU1NJLCBib29sIGJGb3JjZVVwZGF0ZSwKLQkJICAgICAgdTggKnBSQVRSU3RhdGUpOwotCi0KLXUzMiBDb252ZXJ0VG9fZEIyM2EodTMyIFZhbHVlKTsKLQotdTMyIEdldFBTRERhdGEoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1bnNpZ25lZCBpbnQgcG9pbnQsIHU4IGluaXRpYWxfZ2Fpbl9wc2QpOwotCi12b2lkIG9kbV9ESUcyM2FieVJTU0lfTFBTKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLXUzMiBPRE1fR2V0X1JhdGVfQml0bWFwMjNhKHN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEsIHUzMiBtYWNpZCwgdTMyIHJhX21hc2ssIHU4IHJzc2lfbGV2ZWwpOwotCi0KLXZvaWQgT0RNMjNhX0RNSW5pdChzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi12b2lkIE9ETV9ETVdhdGNoZG9nMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci0KLXZvaWQgT0RNX0NtbkluZm9Jbml0MjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgZW51bSBvZG1fY21uaW5mbwlDbW5JbmZvLCB1MzIgVmFsdWUpOwotCi12b2lkIE9ETV9DbW5JbmZvUHRyQXJyYXlIb29rMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgZW51bSBvZG1fY21uaW5mbwlDbW5JbmZvLCB1MTYgSW5kZXgsIHZvaWQgKnBWYWx1ZSk7Ci0KLXZvaWQgT0RNX0NtbkluZm9VcGRhdGUyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgQ21uSW5mbywgdTY0IFZhbHVlKTsKLQotdm9pZCBPRE1fUmVzZXRJUUtSZXN1bHQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotdm9pZCBPRE1fQW50c2VsU3RhdGlzdGljc184OEMoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1OCBNYWNJZCwgdTMyIFBXREJBbGwsIGJvb2wgaXNDQ0tyYXRlKTsKLQotdm9pZCBPRE1fU2luZ2xlRHVhbEFudGVubmFEZWZhdWx0U2V0dGluZyhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi1ib29sIE9ETV9TaW5nbGVEdWFsQW50ZW5uYURldGVjdGlvbihzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHU4IG1vZGUpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fSFdDb25maWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fSFdDb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0OGQ1Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX0hXQ29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZglfX0hBTEhXT1VUU1JDX0hfXwotI2RlZmluZSBfX0hBTEhXT1VUU1JDX0hfXwotCi0jaW5jbHVkZSA8SGFsODcyM0FQaHlDZmcuaD4KLQotLyogICovCi0vKiAgRGVmaW5pdGlvbiAqLwotLyogICovCi0vKiAgKi8KLS8qICAqLwotLyogIENDSyBSYXRlcywgVHhIVCA9IDAgKi8KLSNkZWZpbmUgREVTQzkyQ19SQVRFMU0JCQkJCTB4MDAKLSNkZWZpbmUgREVTQzkyQ19SQVRFMk0JCQkJCTB4MDEKLSNkZWZpbmUgREVTQzkyQ19SQVRFNV81TQkJCQkweDAyCi0jZGVmaW5lIERFU0M5MkNfUkFURTExTQkJCQkweDAzCi0KLS8qICBPRkRNIFJhdGVzLCBUeEhUID0gMCAqLwotI2RlZmluZSBERVNDOTJDX1JBVEU2TQkJCQkJMHgwNAotI2RlZmluZSBERVNDOTJDX1JBVEU5TQkJCQkJMHgwNQotI2RlZmluZSBERVNDOTJDX1JBVEUxMk0JCQkJMHgwNgotI2RlZmluZSBERVNDOTJDX1JBVEUxOE0JCQkJMHgwNwotI2RlZmluZSBERVNDOTJDX1JBVEUyNE0JCQkJMHgwOAotI2RlZmluZSBERVNDOTJDX1JBVEUzNk0JCQkJMHgwOQotI2RlZmluZSBERVNDOTJDX1JBVEU0OE0JCQkJMHgwYQotI2RlZmluZSBERVNDOTJDX1JBVEU1NE0JCQkJMHgwYgotCi0vKiAgTUNTIFJhdGVzLCBUeEhUID0gMSAqLwotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1MwCQkJCTB4MGMKLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTMQkJCQkweDBkCi0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzIJCQkJMHgwZQotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1MzCQkJCTB4MGYKLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTNAkJCQkweDEwCi0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzUJCQkJMHgxMQotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1M2CQkJCTB4MTIKLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTNwkJCQkweDEzCi0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzgJCQkJMHgxNAotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1M5CQkJCTB4MTUKLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTMTAJCQkJMHgxNgotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1MxMQkJCQkweDE3Ci0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzEyCQkJCTB4MTgKLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTMTMJCQkJMHgxOQotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1MxNAkJCQkweDFhCi0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzE1CQkJCTB4MWIKLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTMTVfU0cJCQkweDFjCi0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzMyCQkJCTB4MjAKLQotCi0vKiAgKi8KLS8qICBzdHJ1Y3R1cmUgYW5kIGRlZmluZSAqLwotLyogICovCi0KLXN0cnVjdCBwaHlfcnhfYWdjX2luZm8gewotCSNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KLQkJdTgJZ2Fpbjo3LCB0cnN3OjE7Ci0JI2Vsc2UKLQkJdTgJdHJzdzoxLCBnYWluOjc7Ci0JI2VuZGlmCi19OwotCi1zdHJ1Y3QgcGh5X3N0YXR1c19ycHQgewotCXN0cnVjdCBwaHlfcnhfYWdjX2luZm8gcGF0aF9hZ2NbUkZfUEFUSF9NQVhdOwotCXU4CWNoX2NvcnJbUkZfUEFUSF9NQVhdOwotCXU4CWNja19zaWdfcXVhbF9vZmRtX3B3ZGJfYWxsOwotCXU4CWNja19hZ2NfcnB0X29mZG1fY2Zvc2hvX2E7Ci0JdTgJY2NrX3JwdF9iX29mZG1fY2Zvc2hvX2I7Ci0JdTgJcnN2ZF8xOy8qIGNoX2NvcnJfbXNiOyAqLwotCXU4CW5vaXNlX3Bvd2VyX2RiX21zYjsKLQl1OAlwYXRoX2Nmb3RhaWxbUkZfUEFUSF9NQVhdOwotCXU4CXBjdHNfbWFza1tSRl9QQVRIX01BWF07Ci0JczgJc3RyZWFtX3J4ZXZtW1JGX1BBVEhfTUFYXTsKLQl1OAlwYXRoX3J4c25yW1JGX1BBVEhfTUFYXTsKLQl1OAlub2lzZV9wb3dlcl9kYl9sc2I7Ci0JdTgJcnN2ZF8yWzNdOwotCXU4CXN0cmVhbV9jc2lbUkZfUEFUSF9NQVhdOwotCXU4CXN0cmVhbV90YXJnZXRfY3NpW1JGX1BBVEhfTUFYXTsKLQlzOAlzaWdfZXZtOwotCXU4CXJzdmRfMzsKLQotI2lmZGVmIF9fTElUVExFX0VORElBTgotCXU4CWFudHNlbF9yeF9rZWVwXzI6MTsJLyogZXhfaW50Zl9mbGc6MTsgKi8KLQl1OAlzZ2lfZW46MTsKLQl1OAlyeHNjOjI7Ci0JdTgJaWRsZV9sb25nOjE7Ci0JdTgJcl9hbnRfdHJhaW5fZW46MTsKLQl1OAlhbnRfc2VsX2I6MTsKLQl1OAlhbnRfc2VsOjE7Ci0jZWxzZQkvKiAgX0JJR19FTkRJQU5fICovCi0JdTgJYW50X3NlbDoxOwotCXU4CWFudF9zZWxfYjoxOwotCXU4CXJfYW50X3RyYWluX2VuOjE7Ci0JdTgJaWRsZV9sb25nOjE7Ci0JdTgJcnhzYzoyOwotCXU4CXNnaV9lbjoxOwotCXU4CWFudHNlbF9yeF9rZWVwXzI6MTsJLyogZXhfaW50Zl9mbGc6MTsgKi8KLSNlbmRpZgotfTsKLQotCi1zdHJ1Y3QgcGh5X3N0YXR1c19ycHRfODE5NSB7Ci0Jc3RydWN0IHBoeV9yeF9hZ2NfaW5mbyBwYXRoX2FnY1syXTsKLQl1OAljaF9udW1bMl07Ci0JdTgJY2NrX3NpZ19xdWFsX29mZG1fcHdkYl9hbGw7Ci0JdTgJY2NrX2FnY19ycHRfb2ZkbV9jZm9zaG9fYTsKLQl1OAljY2tfYmJfcHdyX29mZG1fY2Zvc2hvX2I7Ci0JdTggICAgY2NrX3J4X3BhdGg7CS8qIENDS19SWF9QQVRIIFszOjBdICh3aXRoIHJlZ0EwN1szOjBdIGRlZmluaXRpb24pICovCi0JdTgJcnN2ZF8xOwotCXU4CXBhdGhfY2ZvdGFpbFsyXTsKLQl1OAlwY3RzX21hc2tbMl07Ci0JczgJc3RyZWFtX3J4ZXZtWzJdOwotCXU4CXBhdGhfcnhzbnJbMl07Ci0JdTgJcnN2ZF8yWzJdOwotCXU4CXN0cmVhbV9zbnJbMl07Ci0JdTgJc3RyZWFtX2NzaVsyXTsKLQl1OAlyc3ZkXzNbMl07Ci0JczgJc2lnX2V2bTsKLQl1OAlyc3ZkXzQ7Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0JdTgJYW50aWR4X2FudGE6MzsKLQl1OAlhbnRpZHhfYW50YjozOwotCXU4CXJzdmRfNToyOwotI2Vsc2UJLyogIF9CSUdfRU5ESUFOXyAqLwotCXU4CXJzdmRfNToyOwotCXU4CWFudGlkeF9hbnRiOjM7Ci0JdTgJYW50aWR4X2FudGE6MzsKLSNlbmRpZgotfTsKLQotCi12b2lkCi1PRE1fUGh5U3RhdHVzUXVlcnkyM2EoCi0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCXN0cnVjdCBwaHlfaW5mbyAqcFBoeUluZm8sCi0JdTggKgkJCQkJCXBQaHlTdGF0dXMsCi0Jc3RydWN0IG9kbV9wYWNrZXRfaW5mbyAqcFBrdGluZm8KLQkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fUmVnQ29uZmlnODcyM0EuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fUmVnQ29uZmlnODcyM0EuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhNTRkOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX1JlZ0NvbmZpZzg3MjNBLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19JTkNfT0RNX1JFR0NPTkZJR19IXzg3MjNBCi0jZGVmaW5lIF9fSU5DX09ETV9SRUdDT05GSUdfSF84NzIzQQotCi12b2lkIG9kbV9Db25maWdSRlJlZ184NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBBZGRyLCB1MzIgRGF0YSwKLQkJCSAgIGVudW0gUkZfUkFESU9fUEFUSCBSRl9QQVRILCB1MzIgUmVnQWRkcik7Ci0KLXZvaWQgb2RtX0NvbmZpZ01BQ184NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBBZGRyLCB1OCBEYXRhKTsKLQotdm9pZCBvZG1fQ29uZmlnQkJfQUdDXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIGFkZHIsIHUzMiBkYXRhKTsKLQotdm9pZCBvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIGFkZHIsIHUzMiBkYXRhKTsKLQotI2VuZGlmIC8qICBlbmQgb2YgU1VQUE9SVCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9SZWdEZWZpbmUxMU4uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fUmVnRGVmaW5lMTFOLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NzgyMTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9SZWdEZWZpbmUxMU4uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZglfX09ETV9SRUdERUZJTkUxMU5fSF9fCi0jZGVmaW5lIF9fT0RNX1JFR0RFRklORTExTl9IX18KLQotCi0vKiAyIFJGIFJFRyBMSVNUICovCi0jZGVmaW5lCU9ETV9SRUdfUkZfTU9ERV8xMU4JCQkweDAwCi0jZGVmaW5lCU9ETV9SRUdfUkZfMEJfMTFOCQkJMHgwQgotI2RlZmluZQlPRE1fUkVHX0NITkJXXzExTgkJCTB4MTgKLSNkZWZpbmUJT0RNX1JFR19UX01FVEVSXzExTgkJCTB4MjQKLSNkZWZpbmUJT0RNX1JFR19SRl8yNV8xMU4JCQkweDI1Ci0jZGVmaW5lCU9ETV9SRUdfUkZfMjZfMTFOCQkJMHgyNgotI2RlZmluZQlPRE1fUkVHX1JGXzI3XzExTgkJCTB4MjcKLSNkZWZpbmUJT0RNX1JFR19SRl8yQl8xMU4JCQkweDJCCi0jZGVmaW5lCU9ETV9SRUdfUkZfMkNfMTFOCQkJMHgyQwotI2RlZmluZQlPRE1fUkVHX1JYUkZfQTNfMTFOCQkJMHgzQwotI2RlZmluZQlPRE1fUkVHX1RfTUVURVJfOTJEXzExTgkJCTB4NDIKLSNkZWZpbmUJT0RNX1JFR19UX01FVEVSXzg4RV8xMU4JCQkweDQyCi0KLQotCi0vKiAyIEJCIFJFRyBMSVNUICovCi0vKiBQQUdFIDggKi8KLSNkZWZpbmUJT0RNX1JFR19CQl9DVFJMXzExTgkJCTB4ODAwCi0jZGVmaW5lCU9ETV9SRUdfUkZfUElOXzExTgkJCTB4ODA0Ci0jZGVmaW5lCU9ETV9SRUdfUFNEX0NUUkxfMTFOCQkJMHg4MDgKLSNkZWZpbmUJT0RNX1JFR19UWF9BTlRfQ1RSTF8xMU4JCQkweDgwQwotI2RlZmluZQlPRE1fUkVHX0JCX1BXUl9TQVY1XzExTgkJCTB4ODE4Ci0jZGVmaW5lCU9ETV9SRUdfQ0NLX1JQVF9GT1JNQVRfMTFOCQkweDgyNAotI2RlZmluZQlPRE1fUkVHX1JYX0RFRlVBTFRfQV8xMU4JCTB4ODU4Ci0jZGVmaW5lCU9ETV9SRUdfUlhfREVGVUFMVF9CXzExTgkJMHg4NUEKLSNkZWZpbmUJT0RNX1JFR19CQl9QV1JfU0FWM18xMU4JCQkweDg1QwotI2RlZmluZQlPRE1fUkVHX0FOVFNFTF9DVFJMXzExTgkJCTB4ODYwCi0jZGVmaW5lCU9ETV9SRUdfUlhfQU5UX0NUUkxfMTFOCQkJMHg4NjQKLSNkZWZpbmUJT0RNX1JFR19QSU5fQ1RSTF8xMU4JCQkweDg3MAotI2RlZmluZQlPRE1fUkVHX0JCX1BXUl9TQVYxXzExTgkJCTB4ODc0Ci0jZGVmaW5lCU9ETV9SRUdfQU5UU0VMX1BBVEhfMTFOCQkJMHg4NzgKLSNkZWZpbmUJT0RNX1JFR19CQl8zV0lSRV8xMU4JCQkweDg4QwotI2RlZmluZQlPRE1fUkVHX1NDX0NOVF8xMU4JCQkweDhDNAotI2RlZmluZQlPRE1fUkVHX1BTRF9EQVRBXzExTgkJCTB4OEI0Ci0vKiBQQUdFIDkgKi8KLSNkZWZpbmUJT0RNX1JFR19BTlRfTUFQUElORzFfMTFOCQkweDkxNAotI2RlZmluZQlPRE1fUkVHX0FOVF9NQVBQSU5HMl8xMU4JCTB4OTE4Ci0vKiBQQUdFIEEgKi8KLSNkZWZpbmUJT0RNX1JFR19DQ0tfQU5URElWX1BBUkExXzExTgkJMHhBMDAKLSNkZWZpbmUJT0RNX1JFR19DQ0tfQ0NBXzExTgkJCTB4QTBBCi0jZGVmaW5lCU9ETV9SRUdfQ0NLX0FOVERJVl9QQVJBMl8xMU4JCTB4QTBDCi0jZGVmaW5lCU9ETV9SRUdfQ0NLX0FOVERJVl9QQVJBM18xMU4JCTB4QTEwCi0jZGVmaW5lCU9ETV9SRUdfQ0NLX0FOVERJVl9QQVJBNF8xMU4JCTB4QTE0Ci0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBMV8xMU4JCTB4QTIyCi0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBMl8xMU4JCTB4QTIzCi0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBM18xMU4JCTB4QTI0Ci0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBNF8xMU4JCTB4QTI1Ci0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBNV8xMU4JCTB4QTI2Ci0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBNl8xMU4JCTB4QTI3Ci0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBN18xMU4JCTB4QTI4Ci0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBOF8xMU4JCTB4QTI5Ci0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZBX1JTVF8xMU4JCQkweEEyQwotI2RlZmluZQlPRE1fUkVHX0NDS19GQV9NU0JfMTFOCQkJMHhBNTgKLSNkZWZpbmUJT0RNX1JFR19DQ0tfRkFfTFNCXzExTgkJCTB4QTVDCi0jZGVmaW5lCU9ETV9SRUdfQ0NLX0NDQV9DTlRfMTFOCQkJMHhBNjAKLSNkZWZpbmUJT0RNX1JFR19CQl9QV1JfU0FWNF8xMU4JCQkweEE3NAotLyogUEFHRSBCICovCi0jZGVmaW5lCU9ETV9SRUdfTE5BX1NXSVRDSF8xMU4JCQkweEIyQwotI2RlZmluZQlPRE1fUkVHX1BBVEhfU1dJVENIXzExTgkJCTB4QjMwCi0jZGVmaW5lCU9ETV9SRUdfUlNTSV9DVFJMXzExTgkJCTB4QjM4Ci0jZGVmaW5lCU9ETV9SRUdfQ09ORklHX0FOVEFfMTFOCQkJMHhCNjgKLSNkZWZpbmUJT0RNX1JFR19SU1NJX0JUXzExTgkJCTB4QjlDCi0vKiBQQUdFIEMgKi8KLSNkZWZpbmUJT0RNX1JFR19PRkRNX0ZBX0hPTERDXzExTgkJMHhDMDAKLSNkZWZpbmUJT0RNX1JFR19SWF9QQVRIXzExTgkJCTB4QzA0Ci0jZGVmaW5lCU9ETV9SRUdfVFJNVVhfMTFOCQkJMHhDMDgKLSNkZWZpbmUJT0RNX1JFR19PRkRNX0ZBX1JTVENfMTFOCQkweEMwQwotI2RlZmluZQlPRE1fUkVHX1JYSVFJX01BVFJJWF8xMU4JCTB4QzE0Ci0jZGVmaW5lCU9ETV9SRUdfVFhJUUtfTUFUUklYX0xTQjFfMTFOCQkweEM0QwotI2RlZmluZQlPRE1fUkVHX0lHSV9BXzExTgkJCTB4QzUwCi0jZGVmaW5lCU9ETV9SRUdfQU5URElWX1BBUkEyXzExTgkJMHhDNTQKLSNkZWZpbmUJT0RNX1JFR19JR0lfQl8xMU4JCQkweEM1OAotI2RlZmluZQlPRE1fUkVHX0FOVERJVl9QQVJBM18xMU4JCTB4QzVDCi0jZGVmaW5lCU9ETV9SRUdfQkJfUFdSX1NBVjJfMTFOCQkJMHhDNzAKLSNkZWZpbmUJT0RNX1JFR19SWF9PRkZfMTFOCQkJMHhDN0MKLSNkZWZpbmUJT0RNX1JFR19UWElRS19NQVRSSVhBXzExTgkJMHhDODAKLSNkZWZpbmUJT0RNX1JFR19UWElRS19NQVRSSVhCXzExTgkJMHhDODgKLSNkZWZpbmUJT0RNX1JFR19UWElRS19NQVRSSVhBX0xTQjJfMTFOCQkweEM5NAotI2RlZmluZQlPRE1fUkVHX1RYSVFLX01BVFJJWEJfTFNCMl8xMU4JCTB4QzlDCi0jZGVmaW5lCU9ETV9SRUdfUlhJUUtfTUFUUklYX0xTQl8xMU4JCTB4Q0EwCi0jZGVmaW5lCU9ETV9SRUdfQU5URElWX1BBUkExXzExTgkJMHhDQTQKLSNkZWZpbmUJT0RNX1JFR19PRkRNX0ZBX1RZUEUxXzExTgkJMHhDRjAKLS8qIFBBR0UgRCAqLwotI2RlZmluZQlPRE1fUkVHX09GRE1fRkFfUlNURF8xMU4JCTB4RDAwCi0jZGVmaW5lCU9ETV9SRUdfT0ZETV9GQV9UWVBFMl8xMU4JCTB4REEwCi0jZGVmaW5lCU9ETV9SRUdfT0ZETV9GQV9UWVBFM18xMU4JCTB4REE0Ci0jZGVmaW5lCU9ETV9SRUdfT0ZETV9GQV9UWVBFNF8xMU4JCTB4REE4Ci0vKiBQQUdFIEUgKi8KLSNkZWZpbmUJT0RNX1JFR19UWEFHQ19BXzZfMThfMTFOCQkweEUwMAotI2RlZmluZQlPRE1fUkVHX1RYQUdDX0FfMjRfNTRfMTFOCQkweEUwNAotI2RlZmluZQlPRE1fUkVHX1RYQUdDX0FfMV9NQ1MzMl8xMU4JCTB4RTA4Ci0jZGVmaW5lCU9ETV9SRUdfVFhBR0NfQV9NQ1MwXzNfMTFOCQkweEUxMAotI2RlZmluZQlPRE1fUkVHX1RYQUdDX0FfTUNTNF83XzExTgkJMHhFMTQKLSNkZWZpbmUJT0RNX1JFR19UWEFHQ19BX01DUzhfMTFfMTFOCQkweEUxOAotI2RlZmluZQlPRE1fUkVHX1RYQUdDX0FfTUNTMTJfMTVfMTFOCQkweEUxQwotI2RlZmluZQlPRE1fUkVHX0ZQR0EwX0lRS18xMU4JCQkweEUyOAotI2RlZmluZQlPRE1fUkVHX1RYSVFLX1RPTkVfQV8xMU4JCTB4RTMwCi0jZGVmaW5lCU9ETV9SRUdfUlhJUUtfVE9ORV9BXzExTgkJMHhFMzQKLSNkZWZpbmUJT0RNX1JFR19UWElRS19QSV9BXzExTgkJCTB4RTM4Ci0jZGVmaW5lCU9ETV9SRUdfUlhJUUtfUElfQV8xMU4JCQkweEUzQwotI2RlZmluZQlPRE1fUkVHX1RYSVFLXzExTgkJCTB4RTQwCi0jZGVmaW5lCU9ETV9SRUdfUlhJUUtfMTFOCQkJMHhFNDQKLSNkZWZpbmUJT0RNX1JFR19JUUtfQUdDX1BUU18xMU4JCQkweEU0OAotI2RlZmluZQlPRE1fUkVHX0lRS19BR0NfUlNQXzExTgkJCTB4RTRDCi0jZGVmaW5lCU9ETV9SRUdfQkxVRVRPT1RIXzExTgkJCTB4RTZDCi0jZGVmaW5lCU9ETV9SRUdfUlhfV0FJVF9DQ0FfMTFOCQkJMHhFNzAKLSNkZWZpbmUJT0RNX1JFR19UWF9DQ0tfUkZPTl8xMU4JCQkweEU3NAotI2RlZmluZQlPRE1fUkVHX1RYX0NDS19CQk9OXzExTgkJCTB4RTc4Ci0jZGVmaW5lCU9ETV9SRUdfT0ZETV9SRk9OXzExTgkJCTB4RTdDCi0jZGVmaW5lCU9ETV9SRUdfT0ZETV9CQk9OXzExTgkJCTB4RTgwCi0jZGVmaW5lIE9ETV9SRUdfVFgyUlhfMTFOCQkJMHhFODQKLSNkZWZpbmUJT0RNX1JFR19UWDJUWF8xMU4JCQkweEU4OAotI2RlZmluZQlPRE1fUkVHX1JYX0NDS18xMU4JCQkweEU4QwotI2RlZmluZQlPRE1fUkVHX1JYX09GRE1fMTFOCQkJMHhFRDAKLSNkZWZpbmUJT0RNX1JFR19SWF9XQUlUX1JJRlNfMTFOCQkweEVENAotI2RlZmluZQlPRE1fUkVHX1JYMlJYXzExTgkJCTB4RUQ4Ci0jZGVmaW5lCU9ETV9SRUdfU1RBTkRCWV8xMU4JCQkweEVEQwotI2RlZmluZQlPRE1fUkVHX1NMRUVQXzExTgkJCTB4RUUwCi0jZGVmaW5lCU9ETV9SRUdfUE1QRF9BTkFFTl8xMU4JCQkweEVFQwotCi0KLQotCi0KLQotCi0vKiAyIE1BQyBSRUcgTElTVCAqLwotI2RlZmluZQlPRE1fUkVHX0JCX1JTVF8xMU4JCQkweDAyCi0jZGVmaW5lCU9ETV9SRUdfQU5UU0VMX1BJTl8xMU4JCQkweDRDCi0jZGVmaW5lCU9ETV9SRUdfRUFSTFlfTU9ERV8xMU4JCQkweDREMAotI2RlZmluZQlPRE1fUkVHX1JTU0lfTU9OSVRPUl8xMU4JCTB4NEZFCi0jZGVmaW5lCU9ETV9SRUdfRURDQV9WT18xMU4JCQkweDUwMAotI2RlZmluZQlPRE1fUkVHX0VEQ0FfVklfMTFOCQkJMHg1MDQKLSNkZWZpbmUJT0RNX1JFR19FRENBX0JFXzExTgkJCTB4NTA4Ci0jZGVmaW5lCU9ETV9SRUdfRURDQV9CS18xMU4JCQkweDUwQwotI2RlZmluZQlPRE1fUkVHX1RYUEFVU0VfMTFOCQkJMHg1MjIKLSNkZWZpbmUJT0RNX1JFR19SRVNQX1RYXzExTgkJCTB4NkQ4Ci0jZGVmaW5lCU9ETV9SRUdfQU5UX1RSQUlOX1BBUkExXzExTgkJMHg3YjAKLSNkZWZpbmUJT0RNX1JFR19BTlRfVFJBSU5fUEFSQTJfMTFOCQkweDdiNAotCi0KLS8qIERJRyBSZWxhdGVkICovCi0jZGVmaW5lCU9ETV9CSVRfSUdJXzExTgkJCQkweDAwMDAwMDdGCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9kZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9kZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGIzNzVhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmCV9fT0RNX0RCR19IX18KLSNkZWZpbmUgX19PRE1fREJHX0hfXwotCi0KLS8qICAqLwotLyoJRGVmaW5lIHRoZSBkZWJ1ZyBsZXZlbHMgKi8KLS8qICAqLwotLyoJMS4JREJHX1RSQUNFIGFuZCBEQkdfTE9VRCBhcmUgdXNlZCBmb3Igbm9ybWFsIGNhc2VzLiAqLwotLyoJU28gdGhhdCwgdGhleSBjYW4gaGVscCBTVyBlbmdpbmVlciB0byBkZXZlbG9wIG9yIHRyYWNlIHN0YXRlcyBjaGFuZ2VkICovCi0vKglhbmQgYWxzbyBoZWxwIEhXIGVuZ2lubmVyIHRvIHRyYWNlIGV2ZXJ5IG9wZXJhdGlvbiB0byBhbmQgZnJvbSBIVywgKi8KLS8qCWUuZyBJTywgVHgsIFJ4LiAqLwotLyogICovCi0vKgkyLglEQkdfV0FSTk5JTkcgYW5kIERCR19TRVJJT1VTIGFyZSB1c2VkIGZvciB1bnVzdWFsIG9yIGVycm9yIGNhc2VzLCAqLwotLyoJd2hpY2ggaGVscCB1cyB0byBkZWJ1ZyBTVyBvciBIVy4gKi8KLS8qICAqLwotLyogICovCi0vKiAgKi8KLS8qCU5ldmVyIHVzZWQgaW4gYSBjYWxsIHRvIE9ETV9SVF9UUkFDRSgpISAqLwotLyogICovCi0jZGVmaW5lIE9ETV9EQkdfT0ZGCQkJCQkxCi0KLS8qICAqLwotLyoJRmF0YWwgYnVnLiAqLwotLyoJRm9yIGV4YW1wbGUsIFR4L1J4L0lPIGxvY2tlZCB1cCwgT1MgaGFuZ3MsIG1lbW9yeSBhY2Nlc3MgdmlvbGF0aW9uLCAqLwotLyoJcmVzb3VyY2UgYWxsb2NhdGlvbiBmYWlsZWQsIHVuZXhwZWN0ZWQgSFcgYmVoYXZpb3IsIEhXIEJVRyBhbmQgc28gb24uICovCi0vKiAgKi8KLSNkZWZpbmUgT0RNX0RCR19TRVJJT1VTCQkJCTIKLQotLyogICovCi0vKglBYm5vcm1hbCwgcmFyZSwgb3IgdW5leHBldGVkIGNhc2VzLiAqLwotLyoJRm9yIGV4YW1wbGUsIElSUC9QYWNrZXQvT0lEIGNhbmNlbGVkLCBkZXZpY2Ugc3VwcmlzZWx5IHVucmVtb3ZlZCBhbmQgc28gb24uICovCi0vKiAgKi8KLSNkZWZpbmUgT0RNX0RCR19XQVJOSU5HCQkJCTMKLQotLyogICovCi0vKglOb3JtYWwgY2FzZSB3aXRoIHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IFNXIG9yIEhXIHN0YXRlLiAqLwotLyoJRm9yIGV4YW1wbGUsIFR4L1J4IGRlc2NyaXB0b3IgdG8gZmlsbCwgVHgvUnggZGVzY3JpcHRvciBjb21wbGV0ZWQgc3RhdHVzLCAqLwotLyoJU1cgcHJvdG9jb2wgc3RhdGUgY2hhbmdlLCBkeW5hbWljIG1lY2hhbmlzbSBzdGF0ZSBjaGFuZ2UgYW5kIHNvIG9uLiAqLwotLyogICovCi0jZGVmaW5lIE9ETV9EQkdfTE9VRAkJCQkJNAotCi0vKiAgKi8KLS8qCU5vcm1hbCBjYXNlIHdpdGggZGV0YWlsIGV4ZWN1dGlvbiBmbG93IG9yIGluZm9ybWF0aW9uLiAqLwotLyogICovCi0jZGVmaW5lIE9ETV9EQkdfVFJBQ0UJCQkJCTUKLQotLyogICovCi0vKiAgRGVmaW5lIHRoZSB0cmFjaW5nIGNvbXBvbmVudHMgKi8KLS8qICAqLwotLyogICovCi0vKiBCQiBGdW5jdGlvbnMgKi8KLSNkZWZpbmUgT0RNX0NPTVBfRElHCQkJCUJJVCgwKQotI2RlZmluZSBPRE1fQ09NUF9SQV9NQVNLCQkJQklUKDEpCi0jZGVmaW5lIE9ETV9DT01QX0RZTkFNSUNfVFhQV1IJCQlCSVQoMikKLSNkZWZpbmUgT0RNX0NPTVBfRkFfQ05UCQkJCUJJVCgzKQotI2RlZmluZSBPRE1fQ09NUF9SU1NJX01PTklUT1IJCQlCSVQoNCkKLSNkZWZpbmUgT0RNX0NPTVBfQ0NLX1BECQkJCUJJVCg1KQotI2RlZmluZSBPRE1fQ09NUF9BTlRfRElWCQkJQklUKDYpCi0jZGVmaW5lIE9ETV9DT01QX1BXUl9TQVZFCQkJQklUKDcpCi0jZGVmaW5lIE9ETV9DT01QX1BXUl9UUkFJTgkJCUJJVCg4KQotI2RlZmluZSBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFCQkJQklUKDkpCi0jZGVmaW5lIE9ETV9DT01QX1BBVEhfRElWCQkJQklUKDEwKQotI2RlZmluZSBPRE1fQ09NUF9QU0QJCQkJQklUKDExKQotI2RlZmluZSBPRE1fQ09NUF9EWU5BTUlDX1BSSUNDQQkJCUJJVCgxMikKLSNkZWZpbmUgT0RNX0NPTVBfUlhIUAkJCQlCSVQoMTMpCi0vKiBNQUMgRnVuY3Rpb25zICovCi0jZGVmaW5lIE9ETV9DT01QX0VEQ0FfVFVSQk8JCQlCSVQoMTYpCi0jZGVmaW5lIE9ETV9DT01QX0VBUkxZX01PREUJCQlCSVQoMTcpCi0vKiBSRiBGdW5jdGlvbnMgKi8KLSNkZWZpbmUgT0RNX0NPTVBfVFhfUFdSX1RSQUNLCQkJQklUKDI0KQotI2RlZmluZSBPRE1fQ09NUF9SWF9HQUlOX1RSQUNLCQkJQklUKDI1KQotI2RlZmluZSBPRE1fQ09NUF9DQUxJQlJBVElPTgkJCUJJVCgyNikKLS8qIENvbW1vbiBGdW5jdGlvbnMgKi8KLSNkZWZpbmUgT0RNX0NPTVBfQ09NTU9OCQkJCUJJVCgzMCkKLSNkZWZpbmUgT0RNX0NPTVBfSU5JVAkJCQlCSVQoMzEpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IE1hY3JvIERlZmluaXRpb24tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCSNkZWZpbmUgUlRfUFJJTlRLKGZtdCwgYXJncy4uLikJcHJpbnRrKCIlcygpOiAiIGZtdCwgX19mdW5jX18sICMjIGFyZ3MpOwotCi0jaWZuZGVmIEFTU0VSVAotCSNkZWZpbmUgQVNTRVJUKGV4cHIpCi0jZW5kaWYKLQotI2RlZmluZSBPRE1fUlRfVFJBQ0UocERNX09kbSwgY29tcCwgbGV2ZWwsIGZtdCkJCQkJCQkJXAotCQlpZigoKGNvbXApICYgcERNX09kbS0+RGVidWdDb21wb25lbnRzKSAmJiAobGV2ZWwgPD0gcERNX09kbS0+RGVidWdMZXZlbCkpCVwKLQkJewkJCQkJCQkJCQlcCi0JCQlwcmludGsoIltPRE0tODcyM0FdICIpOwkJCQkJCVwKLQkJCVJUX1BSSU5USyBmbXQ7CQkJCQkJCQlcCi0JCX0KLQotI2RlZmluZSBPRE1fUlRfQVNTRVJUKHBETV9PZG0sIGV4cHIsIGZtdCkJCQkJCQkJXAotCQlpZighKGV4cHIpKSB7CQkJCQkJCQkJXAotCQkJcHJpbnRrKCJBc3NlcnRpb24gZmFpbGVkISAlcyBhdCAuLi4uLi5cbiIsICNleHByKTsJCQlcCi0JCQlwcmludGsoIiAgICAgIC4uLi4uLiVzLCVzLGxpbmU9JWRcbiIsIF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18pO1wKLQkJCVJUX1BSSU5USyBmbXQ7CQkJCQkJCQlcCi0JCQlBU1NFUlQoZmFsc2UpOwkJCQkJCQkJXAotCQl9Ci0KLXZvaWQgT0RNX0luaXREZWJ1Z1NldHRpbmcyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotI2VuZGlmCS8qICBfX09ETV9EQkdfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX2ludGVyZmFjZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzYmYwMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZglfX09ETV9JTlRFUkZBQ0VfSF9fCi0jZGVmaW5lIF9fT0RNX0lOVEVSRkFDRV9IX18KLQotCi0vKiAgX2NhdDogaW1wbGVtZW50ZWQgYnkgVG9rZW4tUGFzdGluZyBPcGVyYXRvci4gKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jZGVmaW5lIE9ETV9SRUdfRElHXzExTgkJMHhDNTAKLSNkZWZpbmUgT0RNX1JFR19ESUdfMTFBQwkweERERAotCi1PRE1fUkVHKERJRyxfcERNX09kbSkKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jZGVmaW5lIF9yZWdfMTFOKF9uYW1lKQkJCU9ETV9SRUdfIyNfbmFtZSMjXzExTgotI2RlZmluZSBfcmVnXzExQUMoX25hbWUpCQlPRE1fUkVHXyMjX25hbWUjI18xMUFDCi0jZGVmaW5lIF9iaXRfMTFOKF9uYW1lKQkJCU9ETV9CSVRfIyNfbmFtZSMjXzExTgotI2RlZmluZSBfYml0XzExQUMoX25hbWUpCQlPRE1fQklUXyMjX25hbWUjI18xMUFDCi0KLSNkZWZpbmUgX2NhdChfbmFtZSwgX2Z1bmMpCQkJCQlcCi0JKAkJCQkJCQlcCi0JCV9mdW5jIyNfMTFOKF9uYW1lKQkJCQlcCi0JKQotCi0vKiAgX25hbWU6IG5hbWUgb2YgcmVnaXN0ZXIgb3IgYml0LiAqLwotLyogIEV4YW1wbGU6ICJPRE1fUkVHKFJfQV9BR0NfQ09SRTEsIHBETV9PZG0pIiAqLwotLyogICAgICAgICBnZXRzICJPRE1fUl9BX0FHQ19DT1JFMSIgb3IgIk9ETV9SX0FfQUdDX0NPUkUxXzgxOTJDIiwgZGVwZW5kcyBvbiBTdXBwb3J0SUNUeXBlLiAqLwotI2RlZmluZSBPRE1fUkVHKF9uYW1lLCBfcERNX09kbSkJX2NhdChfbmFtZSwgX3JlZykKLSNkZWZpbmUgT0RNX0JJVChfbmFtZSwgX3BETV9PZG0pCV9jYXQoX25hbWUsIF9iaXQpCi0KLS8qICAqLwotLyogIDIwMTIvMDIvMTcgTUggRm9yIG5vbi1NUCBjb21waWxlIHBhc3Mgb25seS4gTGludXggZG9lcyBub3Qgc3VwcG9ydCB3b3JraXRlbS4gKi8KLS8qICBTdWdnZXN0IEhXIHRlYW0gdG8gdXNlIHRocmVhZCBpbnN0ZWFkIG9mIHdvcmtpdGVtLiBXaW5kb3dzIGFsc28gc3VwcG9ydCB0aGUgZmVhdHVyZS4gKi8KLS8qICAqLwotdHlwZWRlZiB2b2lkICgqUlRfV09SS0lURU1fQ0FMTF9CQUNLKShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnBDb250ZXh0KTsKLQotLyogICovCi0vKiAgPT09PT09PT09PT0gRVh0ZXJuIEZ1bmN0aW9uIFByb3RvdHlwZSAqLwotLyogICovCi0KLXZvaWQgT0RNX1NldFJGUmVnKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgZW51bSBSRl9SQURJT19QQVRIIGVSRlBhdGgsCi0JCSAgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrLCB1MzIgRGF0YSk7Ci11MzIgT0RNX0dldFJGUmVnKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgZW51bSBSRl9SQURJT19QQVRIIGVSRlBhdGgsCi0JCSB1MzIgUmVnQWRkciwgdTMyIEJpdE1hc2spOwotCi0jZW5kaWYJLyogIF9fT0RNX0lOVEVSRkFDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fcHJlY29tcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9wcmVjb21wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNzkzYzguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9wcmVjb21wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZglfX09ETV9QUkVDT01QX0hfXwotI2RlZmluZSBfX09ETV9QUkVDT01QX0hfXwotCi0vKiAyIENvbmZpZyBGbGFncyBhbmQgU3RydWN0cyAtIGRlZmluZWQgYnkgZWFjaCBPRE0gVHlwZSAqLwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPGhhbF9pbnRmLmg+Ci0KLQotLyogMiBIYXJkd2FyZSBQYXJhbWV0ZXIgRmlsZXMgKi8KLSNpbmNsdWRlICJIYWw4NzIzVUhXSW1nX0NFLmgiCi0KLQotLyogMiBPdXRTcmMgSGVhZGVyIEZpbGVzICovCi0KLSNpbmNsdWRlICJvZG0uaCIKLSNpbmNsdWRlICJvZG1fSFdDb25maWcuaCIKLSNpbmNsdWRlICJvZG1fZGVidWcuaCIKLSNpbmNsdWRlICJvZG1fUmVnRGVmaW5lMTFOLmgiCi0KLSNpbmNsdWRlICJIYWxETU91dFNyYzg3MjNBLmgiIC8qIGZvciBJUUssTENLLFBvd2VyLXRyYWNraW5nICovCi0jaW5jbHVkZSAicnRsODcyM2FfaGFsLmgiCi0KLSNpbmNsdWRlICJvZG1faW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAib2RtX3JlZy5oIgotCi0jaW5jbHVkZSAiSGFsSFdJbWc4NzIzQV9NQUMuaCIKLSNpbmNsdWRlICJIYWxIV0ltZzg3MjNBX1JGLmgiCi0jaW5jbHVkZSAiSGFsSFdJbWc4NzIzQV9CQi5oIgotI2luY2x1ZGUgIkhhbEhXSW1nODcyM0FfRlcuaCIKLSNpbmNsdWRlICJvZG1fUmVnQ29uZmlnODcyM0EuaCIKLQotI2VuZGlmCS8qICBfX09ETV9QUkVDT01QX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fcmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODQzMzEyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fcmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgKi8KLS8qICBGaWxlIE5hbWU6IG9kbV9yZWcuaCAqLwotLyogICovCi0vKiAgRGVzY3JpcHRpb246ICovCi0vKiAgKi8KLS8qICBUaGlzIGZpbGUgaXMgZm9yIGdlbmVyYWwgcmVnaXN0ZXIgZGVmaW5pdGlvbi4gKi8KLS8qICAqLwotLyogICovCi0vKiAgKi8KLSNpZm5kZWYJX19IQUxfT0RNX1JFR19IX18KLSNkZWZpbmUgX19IQUxfT0RNX1JFR19IX18KLQotLyogICovCi0vKiAgUmVnaXN0ZXIgRGVmaW5pdGlvbiAqLwotLyogICovCi0KLS8qIE1BQyBSRUcgKi8KLSNkZWZpbmUJT0RNX0JCX1JFU0VUCQkJCQkweDAwMgotI2RlZmluZQlPRE1fRFVNTVkJCQkJCQkweDRmZQotI2RlZmluZQlPRE1fRURDQV9WT19QQVJBTQkJCTB4NTAwCi0jZGVmaW5lCU9ETV9FRENBX1ZJX1BBUkFNCQkJMHg1MDQKLSNkZWZpbmUJT0RNX0VEQ0FfQkVfUEFSQU0JCQkweDUwOAotI2RlZmluZQlPRE1fRURDQV9CS19QQVJBTQkJCTB4NTBDCi0jZGVmaW5lCU9ETV9UWFBBVVNFCQkJCQkweDUyMgotCi0vKiBCQiBSRUcgKi8KLSNkZWZpbmUJT0RNX0ZQR0FfUEhZMF9QQUdFOAkJCTB4ODAwCi0jZGVmaW5lCU9ETV9QU0RfU0VUVElORwkJCQkweDgwOAotI2RlZmluZQlPRE1fQUZFX1NFVFRJTkcJCQkJMHg4MTgKLSNkZWZpbmUJT0RNX1RYQUdDX0JfNl8xOAkJCQkweDgzMAotI2RlZmluZQlPRE1fVFhBR0NfQl8yNF81NAkJCTB4ODM0Ci0jZGVmaW5lCU9ETV9UWEFHQ19CX01DUzMyXzUJCQkweDgzOAotI2RlZmluZQlPRE1fVFhBR0NfQl9NQ1MwX01DUzMJCTB4ODNjCi0jZGVmaW5lCU9ETV9UWEFHQ19CX01DUzRfTUNTNwkJMHg4NDgKLSNkZWZpbmUJT0RNX1RYQUdDX0JfTUNTOF9NQ1MxMQkJMHg4NGMKLSNkZWZpbmUJT0RNX0FOQUxPR19SRUdJU1RFUgkJCTB4ODVjCi0jZGVmaW5lCU9ETV9SRl9JTlRFUkZBQ0VfT1VUUFVUCQkweDg2MAotI2RlZmluZQlPRE1fVFhBR0NfQl9NQ1MxMl9NQ1MxNQkweDg2OAotI2RlZmluZQlPRE1fVFhBR0NfQl8xMV9BXzJfMTEJCTB4ODZjCi0jZGVmaW5lCU9ETV9BRF9EQV9MU0JfTUFTSwkJCTB4ODc0Ci0jZGVmaW5lCU9ETV9FTkFCTEVfM19XSVJFCQkJMHg4OGMKLSNkZWZpbmUJT0RNX1BTRF9SRVBPUlQJCQkJMHg4YjQKLSNkZWZpbmUJT0RNX1JfQU5UX1NFTEVDVAkJCQkweDkwYwotI2RlZmluZQlPRE1fQ0NLX0FOVF9TRUxFQ1QJCQkweGEwNwotI2RlZmluZQlPRE1fQ0NLX1BEX1RIUkVTSAkJCTB4YTBhCi0jZGVmaW5lCU9ETV9DQ0tfUkZfUkVHMQkJCQkweGExMQotI2RlZmluZQlPRE1fQ0NLX01BVENIX0ZJTFRFUgkJCTB4YTIwCi0jZGVmaW5lCU9ETV9DQ0tfUkFLRV9NQUMJCQkJMHhhMmUKLSNkZWZpbmUJT0RNX0NDS19DTlRfUkVTRVQJCQkweGEyZAotI2RlZmluZQlPRE1fQ0NLX1RYX0RJVkVSU0lUWQkJCTB4YTJmCi0jZGVmaW5lCU9ETV9DQ0tfRkFfQ05UX01TQgkJCTB4YTViCi0jZGVmaW5lCU9ETV9DQ0tfRkFfQ05UX0xTQgkJCTB4YTVjCi0jZGVmaW5lCU9ETV9DQ0tfTkVXX0ZVTkNUSU9OCQkweGE3NQotI2RlZmluZQlPRE1fT0ZETV9QSFkwX1BBR0VfQwkJMHhjMDAKLSNkZWZpbmUJT0RNX09GRE1fUlhfQU5UCQkJCTB4YzA0Ci0jZGVmaW5lCU9ETV9SX0FfUlhJUUkJCQkJCTB4YzE0Ci0jZGVmaW5lCU9ETV9SX0FfQUdDX0NPUkUxCQkJMHhjNTAKLSNkZWZpbmUJT0RNX1JfQV9BR0NfQ09SRTIJCQkweGM1NAotI2RlZmluZQlPRE1fUl9CX0FHQ19DT1JFMQkJCTB4YzU4Ci0jZGVmaW5lCU9ETV9SX0FHQ19QQVIJCQkJCTB4YzcwCi0jZGVmaW5lCU9ETV9SX0hUU1RGX0FHQ19QQVIJCQkweGM3YwotI2RlZmluZQlPRE1fVFhfUFdSX1RSQUlOSU5HX0EJCTB4YzkwCi0jZGVmaW5lCU9ETV9UWF9QV1JfVFJBSU5JTkdfQgkJMHhjOTgKLSNkZWZpbmUJT0RNX09GRE1fRkFfQ05UMQkJCQkweGNmMAotI2RlZmluZQlPRE1fT0ZETV9QSFkwX1BBR0VfRAkJMHhkMDAKLSNkZWZpbmUJT0RNX09GRE1fRkFfQ05UMgkJCQkweGRhMAotI2RlZmluZQlPRE1fT0ZETV9GQV9DTlQzCQkJCTB4ZGE0Ci0jZGVmaW5lCU9ETV9PRkRNX0ZBX0NOVDQJCQkJMHhkYTgKLSNkZWZpbmUJT0RNX1RYQUdDX0FfNl8xOAkJCQkweGUwMAotI2RlZmluZQlPRE1fVFhBR0NfQV8yNF81NAkJCTB4ZTA0Ci0jZGVmaW5lCU9ETV9UWEFHQ19BXzFfTUNTMzIJCQkweGUwOAotI2RlZmluZQlPRE1fVFhBR0NfQV9NQ1MwX01DUzMJCTB4ZTEwCi0jZGVmaW5lCU9ETV9UWEFHQ19BX01DUzRfTUNTNwkJMHhlMTQKLSNkZWZpbmUJT0RNX1RYQUdDX0FfTUNTOF9NQ1MxMQkJMHhlMTgKLSNkZWZpbmUJT0RNX1RYQUdDX0FfTUNTMTJfTUNTMTUJCTB4ZTFjCi0KLS8qIFJGIFJFRyAqLwotI2RlZmluZQlPRE1fR0FJTl9TRVRUSU5HCQkJCTB4MDAKLSNkZWZpbmUJT0RNX0NIQU5ORUwJCQkJCTB4MTgKLQotLyogQW50IERldGVjdCBSZWcgKi8KLSNkZWZpbmUJT0RNX0RQRFQJCQkJCQkweDMwMAotCi0vKiBQU0QgSW5pdCAqLwotI2RlZmluZQlPRE1fUFNEUkVHCQkJCQkweDgwOAotCi0vKiA5MkQgUGF0aCBEaXYgKi8KLSNkZWZpbmUJUEFUSERJVl9SRUcJCQkJCTB4QjMwCi0jZGVmaW5lCVBBVEhESVZfVFJJCQkJCQkweEJBMAotCi0vKiAgKi8KLS8qICBCaXRtYXAgRGVmaW5pdGlvbiAqLwotLyogICovCi0KLSNkZWZpbmUJQklUX0ZBX1JFU0VUCQkJCQlCSVQoMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb3NkZXBfaW50Zi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29zZGVwX2ludGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE1N2ViMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb3NkZXBfaW50Zi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19PU0RFUF9JTlRGX0hfCi0jZGVmaW5lIF9fT1NERVBfSU5URl9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi1pbnQgcnR3X2luaXRfZHJ2X3N3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotaW50IHJ0d19mcmVlX2Rydl9zdzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWludCBydHdfcmVzZXRfZHJ2X3N3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIHJ0d19jYW5jZWxfYWxsX3RpbWVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi1pbnQgcnR3X2luaXRfbmV0ZGV2MjNhX25hbWUyM2Eoc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYsIGNvbnN0IGNoYXIgKmlmbmFtZSk7Ci1zdHJ1Y3QgbmV0X2RldmljZSAqcnR3X2luaXRfbmV0ZGV2MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi11MTYgcnR3X3JlY3Zfc2VsZWN0X3F1ZXVlMjNhKHN0cnVjdCBza19idWZmICpza2IpOwotCi12b2lkIHJ0d19pcHNfZGV2X3VubG9hZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotaW50IHJ0d19pcHNfcHdyX3VwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydHdfaXBzX3B3cl9kb3duMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi1pbnQgcnR3X2Rydl9yZWdpc3Rlcl9uZXRkZXYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0d19uZGV2X2Rlc3RydWN0b3Ioc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpOwotCi1pbnQgcnRsODcyM2F1X2luaXJwX2luaXQoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKTsKLWludCBydGw4NzIzYXVfaW5pcnBfZGVpbml0KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX3VzYl9pbnRmX3N0b3Aoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLSNlbmRpZgkvKiBfT1NERVBfSU5URl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29zZGVwX3NlcnZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vc2RlcF9zZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MjUwYjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29zZGVwX3NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX09TREVQX1NFUlZJQ0VfSF8KLSNkZWZpbmUgX19PU0RFUF9TRVJWSUNFX0hfCi0KLSNkZWZpbmUgX0ZBSUwJCTAKLSNkZWZpbmUgX1NVQ0NFU1MJMQotI2RlZmluZSBSVFdfUlhfSEFORExFRCAyCi0KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VtLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4JLyogIGZvciBzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgKi8KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotCi0jaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oPgotI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgotCi1zdHJ1Y3QgcnR3X3F1ZXVlIHsKLQlzdHJ1Y3QJbGlzdF9oZWFkCXF1ZXVlOwotCXNwaW5sb2NrX3QJCWxvY2s7Ci19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBsaXN0X2hlYWQgKmdldF9saXN0X2hlYWQoc3RydWN0IHJ0d19xdWV1ZSAqcXVldWUpCi17Ci0JcmV0dXJuICZxdWV1ZS0+cXVldWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHJ0d19uZXRpZl9xdWV1ZV9zdG9wcGVkKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KQotewotCXJldHVybiAobmV0aWZfdHhfcXVldWVfc3RvcHBlZChuZXRkZXZfZ2V0X3R4X3F1ZXVlKHBuZXRkZXYsIDApKSAmJgotCQluZXRpZl90eF9xdWV1ZV9zdG9wcGVkKG5ldGRldl9nZXRfdHhfcXVldWUocG5ldGRldiwgMSkpICYmCi0JCW5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQobmV0ZGV2X2dldF90eF9xdWV1ZShwbmV0ZGV2LCAyKSkgJiYKLQkJbmV0aWZfdHhfcXVldWVfc3RvcHBlZChuZXRkZXZfZ2V0X3R4X3F1ZXVlKHBuZXRkZXYsIDMpKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIENIS0JJVCh1MzIgeCkKLXsKLQlXQVJOX09OKHggPj0gMzIpOwotCWlmICh4ID49IDMyKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gQklUKHgpOwotfQotCi1leHRlcm4gdW5zaWduZWQgY2hhciBNQ1NfcmF0ZV8yUjIzQVsxNl07Ci0KLWV4dGVybiB1bnNpZ25lZCBjaGFyCU1DU19yYXRlXzJSMjNBWzE2XTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyCU1DU19yYXRlXzFSMjNBWzE2XTsKLQotdm9pZAlfcnR3X2luaXRfcXVldWUyM2Eoc3RydWN0IHJ0d19xdWV1ZSAqcHF1ZXVlKTsKLQotLyogTWFjcm9zIGZvciBoYW5kbGluZyB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzICovCi0KLSNkZWZpbmUgUlRXX0dFVF9CRTI0KGEpICgoKCh1MzIpIChhKVswXSkgPDwgMTYpIHwgKCgodTMyKSAoYSlbMV0pIDw8IDgpIHwgXAotCQkJICgodTMyKSAoYSlbMl0pKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9yZWN2X29zZGVwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcmVjdl9vc2RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmQzZjFiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9yZWN2X29zZGVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SRUNWX09TREVQX0hfCi0jZGVmaW5lIF9fUkVDVl9PU0RFUF9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi1pbnQgX3J0d19pbml0X3JlY3ZfcHJpdjIzYShzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYsIHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBfcnR3X2ZyZWVfcmVjdl9wcml2MjNhIChzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYpOwotCi1pbnQgcnR3X3JlY3ZfZW50cnkyM2Eoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLWludCBydHdfcmVjdl9pbmRpY2F0ZXBrdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci0KLXZvaWQgcnR3X2hhbmRsZV90a2lwX21pY19lcnIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYmdyb3VwKTsKLQotaW50CXJ0d19pbml0X3JlY3ZfcHJpdihzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYsIHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydHdfZnJlZV9yZWN2X3ByaXYgKHN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdik7Ci0KLWludCBydHdfb3NfcmVjdl9yZXNvdXJjZV9pbml0KHN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiwgc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcnR3X2luaXRfcmVjdl90aW1lcjIzYShzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmwpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9idC1jb2V4aXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfYnQtY29leGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWRkNWRmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9idC1jb2V4aXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUTDg3MjNBX0JUX0NPRVhJU1RfSF9fCi0jZGVmaW5lIF9fUlRMODcyM0FfQlRfQ09FWElTVF9IX18KLQotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgIm9kbV9wcmVjb21wLmgiCi0KLQotLyogIEhFQURFUi9QbGF0Zm9ybURlZi5oICovCi1lbnVtIHJ0X21lZGlhX3N0YXR1cyB7Ci0JUlRfTUVESUFfRElTQ09OTkVDVAk9IDAsCi0JUlRfTUVESUFfQ09OTkVDVAk9IDEKLX07Ci0KLS8qICA9PT09PSBCZWxvdyB0aGlzIGxpbmUgaXMgc3luYyBmcm9tIFNENyBkcml2ZXIgQ09NTU9OL0JULmggPT09PT0gKi8KLQotI2RlZmluZQlCVF9UTVBfQlVGX1NJWkUJCTEwMAotCi12b2lkIEJUX1NpZ25hbENvbXBlbnNhdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgdTggKnJzc2lfd2lmaSwgdTggKnJzc2lfYnQpOwotdm9pZCBCVF9IYWx0UHJvY2VzcyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRfTHBzTGVhdmUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLQotI2RlZmluZQlCVF9Ic0Nvbm5lY3Rpb25Fc3RhYmxpc2hlZChBZGFwdGVyKQkJZmFsc2UKLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgQ09NTU9OL0JULmggPT09PT0gKi8KLQotLyogIEhFQURFUi9TZWN1cml0eVR5cGUuaCAqLwotI2RlZmluZSBUS0lQX0VOQ19LRVlfUE9TCQkzMgkJLyogS0VLX0xFTitLRUtfTEVOKSAqLwotI2RlZmluZSBNQVhSU05JRUxFTgkJCQkyNTYKLQotLyogIENPTU1PTi9Qcm90b2NvbDgwMl8xMS5oICovCi0vKiAgKi8KLS8qICAgICAgIDgwMi4xMSBNYW5hZ2VtZW50IGZyYW1lIFN0YXR1cyBDb2RlIGZpZWxkICovCi0vKiAgKi8KLXN0cnVjdCBvY3RldF9zdHJpbmcgewotCXU4CQkqT2N0ZXQ7Ci0JdTE2CQlMZW5ndGg7Ci19OwotCi0KLS8qICBBRVNfQ0NNUCBzcGVjaWZpYyAqLwotZW51bSB7Ci0JQUVTQ0NNUF9CTEtfU0laRQkJPSAgIDE2LCAgICAgLyogICMgb2N0ZXRzIGluIGFuIEFFUyBibG9jayAqLwotCUFFU0NDTVBfTUFYX1BBQ0tFVAkJPSAgIDQqNTEyLCAgLyogIGxhcmdlc3QgcGFja2V0IHNpemUgKi8KLQlBRVNDQ01QX05fUkVTRVJWRUQJCT0gICAwLCAgICAgIC8qICByZXNlcnZlZCBub25jZSBvY3RldCB2YWx1ZSAqLwotCUFFU0NDTVBfQV9EQVRBCQkJPSAgIDB4NDAsICAgLyogIHRoZSBBZGF0YSBiaXQgaW4gdGhlIGZsYWdzICovCi0JQUVTQ0NNUF9NX1NISUZUCQkJPSAgIDMsICAgICAgLyogIGhvdyBtdWNoIHRvIHNoaWZ0IHRoZSAzLWJpdCBNIGZpZWxkICovCi0JQUVTQ0NNUF9MX1NISUZUCQkJPSAgIDAsICAgICAgLyogIGhvdyBtdWNoIHRvIHNoaWZ0IHRoZSAzLWJpdCBMIGZpZWxkICovCi0JQUVTQ0NNUF9MX1NJWkUJCQk9ICAgMiwgICAgICAgLyogIHNpemUgb2YgdGhlIGwobSkgbGVuZ3RoIGZpZWxkIChpbiBvY3RldHMpICovCi0JQUVTQ0NNUF9PRkZTRVRfU0MJCT0JMjIsCi0JQUVTQ0NNUF9PRkZTRVRfRFVSQVRJT04JPQk0LAotCUFFU0NDTVBfT0ZGU0VUX0EyCQk9CTEwLAotCUFFU0NDTVBfT0ZGU0VUX0E0CQk9CTI0LAotCUFFU0NDTVBfUUNfVElEX01BU0sJCT0JMHgwZiwKLQlBRVNDQ01QX0JMS19TSVpFX1RPVEFMCT0gICAxNioxNiwgICAgIC8qICBBZGRlZCBieSBBbm5pZSBmb3IgQ0tJUCBBRVMgTUlDIEJTT0QsIDIwMDYtMDgtMTcuICovCi0JCQkJCQkJCQkJCS8qICAxNio4IDwgNCo2MCAgUmVzb3ZlIHRvIDE2KjE2ICovCi19OwotCi0vKiAgS2V5IExlbmd0aCAqLwotI2RlZmluZSBQTUtfTEVOCQkJCTMyCi0jZGVmaW5lIFBUS19MRU5fVEtJUAkJCTY0Ci0jZGVmaW5lIEdUS19MRU4JCQkJMzIKLSNkZWZpbmUgS0VZX05PTkNFX0xFTgkJCTMyCi0KLQotLyogIENPTU1PTi9Eb3QxMWQuaCAqLwotc3RydWN0IGNobmxfdHhwb3dlcl90cmlwbGUgewotCXU4IEZpcnN0Q2hubDsKLQl1OCBOdW1DaG5sczsKLQlzOCBNYXhUeFBvd2VySW5EYm07Ci19OwotCi0KLS8qICA9PT09PSBCZWxvdyB0aGlzIGxpbmUgaXMgc3luYyBmcm9tIFNENyBkcml2ZXIgQ09NTU9OL2J0X2hjaS5oID09PT09ICovCi0vKiAgVGhlIGZvbGxvd2luZyBpcyBmb3IgQlQgMy4wICsgSFMgSENJIENPTU1BTkQgRVJST1JTIENPREVTICovCi0KLSNkZWZpbmUgTWF4ODAyMTFQQUxQRFVTaXplCQkJMTQ5MgotI2RlZmluZSBNYXg4MDIxMUFNUEFTU09DTGVuCQkJNjcyCi0jZGVmaW5lIE1pbkdVc2VyUHJpbwkJCQkJNAotI2RlZmluZSBNYXhHVXNlclByaW8JCQkJCTcKLSNkZWZpbmUgQkVVc2VyUHJpbzAJCQkJCQkwCi0jZGVmaW5lIEJFVXNlclByaW8xCQkJCQkJMwotI2RlZmluZSBNYXg4MDIxMUJlYWNvblBlcmlvZAkJMjAwMAotI2RlZmluZSBTaG9ydFJhbmdlTW9kZVBvd2VyTWF4CQk0Ci0KLSNkZWZpbmUgQlRfRGVmYXVsdF9DaG5sCQkJCQkxMAotI2RlZmluZSBBQ0xEYXRhSGVhZGVyTGVuCQkJCTQKLQotI2RlZmluZSBCVFRvdGFsRGF0YUJsb2NrTnVtCQkJMHgxMDAKLSNkZWZpbmUgQlRMb2NhbEJ1Zk51bQkJCQkJMHgyMDAKLSNkZWZpbmUgQlRNYXhEYXRhQmxvY2tMZW4JCQkJMHg4MDAKLSNkZWZpbmUgQlRUT1RBTEJBTkRXSURUSAkJCQkweDc1MzAKLSNkZWZpbmUgQlRNQVhCQU5ER1VCQU5EV0lEVEgJCTB4NGUyMAotI2RlZmluZSBUbXBMb2NhbEJ1ZlNpemUJCQkJCTB4MTAwCi0jZGVmaW5lIEJUU3luRGF0YVBhY2tldExlbmd0aAkJCTB4ZmYKLS8qICAqLwotCi0jZGVmaW5lIEJUTWF4QXV0aENvdW50CQkJCQk1Ci0jZGVmaW5lIEJUTWF4QXNvY0NvdW50CQkJCQk1Ci0KLSNkZWZpbmUgTUFYX0xPR0lDQUxfTElOS19OVU0JCQkyCS8qIHRlbXBvcmFyaWx5IGRlZmluZSAqLwotI2RlZmluZSBNQVhfQlRfQVNPQ19FTlRSWV9OVU0JCTIJLyogdGVtcG9yYXJpbHkgZGVmaW5lICovCi0KLSNkZWZpbmUgSU5WQUxJRF9QTF9IQU5ETEUJCQkJMHhmZgotI2RlZmluZSBJTlZBTElEX0VOVFJZX05VTQkJCQkweGZmCi0vKiAgKi8KLQotI2RlZmluZSBDQU1fQlRfU1RBUlRfSU5ERVgJCShIQUxGX0NBTV9FTlRSWSAtIDQpICAgLyogIE1BWF9CVF9BU09DX0VOVFJZX05VTSA6IDQgISEhICovCi0jZGVmaW5lIEJUX0hXQ0FNX1NUQVIJCQlDQU1fQlRfU1RBUlRfSU5ERVggIC8qICBXZSB1c2VkICBIQUxGX0NBTV9FTlRSWSB+IEhBTEZfQ0FNX0VOVFJZIC1NQVhfQlRfQVNPQ19FTlRSWV9OVU0gKi8KLQotZW51bSBoY2lfc3RhdHVzIHsKLQlIQ0lfU1RBVFVTX1NVQ0NFU1MJCQk9IDB4MDAsIC8qIFN1Y2Nlc3MgKi8KLQlIQ0lfU1RBVFVTX1VOS05PV19IQ0lfQ01ECQk9IDB4MDEsIC8qIFVua25vd24gSENJIENvbW1hbmQgKi8KLQlIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lECQk9IDBYMDIsIC8qIFVua25vd24gQ29ubmVjdGlvbiBJZGVudGlmaWVyICovCi0JSENJX1NUQVRVU19IV19GQUlMCQkJPSAwWDAzLCAvKiBIYXJkd2FyZSBGYWlsdXJlICovCi0JSENJX1NUQVRVU19QQUdFX1RJTUVPVVQJCQk9IDBYMDQsIC8qIFBhZ2UgVGltZW91dCAqLwotCUhDSV9TVEFUVVNfQVVUSF9GQUlMCQkJPSAwWDA1LCAvKiBBdXRoZW50aWNhdGlvbiBGYWlsdXJlICovCi0JSENJX1NUQVRVU19QSU5fT1JfS0VZX01JU1NJTkcJCT0gMFgwNiwgLyogUElOIG9yIEtleSBNaXNzaW5nICovCi0JSENJX1NUQVRVU19NRU1fQ0FQX0VYQ0VFRAkJPSAwWDA3LCAvKiBNZW1vcnkgQ2FwYWNpdHkgRXhjZWVkZWQgKi8KLQlIQ0lfU1RBVFVTX0NPTk5FQ1RfVElNRU9VVAkJPSAwWDA4LCAvKiBDb25uZWN0aW9uIFRpbWVvdXQgKi8KLQlIQ0lfU1RBVFVTX0NPTk5FQ1RfTElNSVQJCT0gMFgwOSwgLyogQ29ubmVjdGlvbiBMaW1pdCBFeGNlZWRlZCAqLwotCUhDSV9TVEFUVVNfU1lOX0NPTk5FQ1RfTElNSVQJCT0gMFgwYSwgLyogU3luY2hyb25vdXMgQ29ubmVjdGlvbiBMaW1pdCBUbyBBIERldmljZSBFeGNlZWRlZCAqLwotCUhDSV9TVEFUVVNfQUNMX0NPTk5FQ1RfRVhJU1RTCQk9IDBYMGIsIC8qIEFDTCBDb25uZWN0aW9uIEFscmVhZHkgRXhpc3RzICovCi0JSENJX1NUQVRVU19DTURfRElTQUxMT1cJCQk9IDBYMGMsIC8qIENvbW1hbmQgRGlzYWxsb3dlZCAqLwotCUhDSV9TVEFUVVNfQ09OTkVDVF9SSlRfTElNSVRfUkVTT1VSQ0UJPSAwWDBkLCAvKiBDb25uZWN0aW9uIFJlamVjdGVkIGR1ZSB0byBMaW1pdGVkIFJlc291cmNlcyAqLwotCUhDSV9TVEFUVVNfQ09OTkVDVF9SSlRfU0VDX1JFQVNPTgk9IDBYMGUsIC8qIENvbm5lY3Rpb24gUmVqZWN0ZWQgRHVlIFRvIFNlY3VyaXR5IFJlYXNvbnMgKi8KLQlIQ0lfU1RBVFVTX0NPTk5FQ1RfUkpUX1VOQUNDRVBUX0JEX0FERFIJPSAwWDBmLCAvKiBDb25uZWN0aW9uIFJlamVjdGVkIGR1ZSB0byBVbmFjY2VwdGFibGUgQkRfQUREUiAqLwotCUhDSV9TVEFUVVNfQ09OTkVDVF9BQ0NFUFRfVElNRU9VVAk9IDBYMTAsIC8qIENvbm5lY3Rpb24gQWNjZXB0IFRpbWVvdXQgRXhjZWVkZWQgKi8KLQlIQ0lfU1RBVFVTX1VOU1VQUE9SVF9GRUFUVVJFX1BBUkFfVkFMVUUJPSAwWDExLCAvKiBVbnN1cHBvcnRlZCBGZWF0dXJlIG9yIFBhcmFtZXRlciBWYWx1ZSAqLwotCUhDSV9TVEFUVVNfSU5WQUxJRF9IQ0lfQ01EX1BBUkFfVkFMVUUJPSAwWDEyLCAvKiBJbnZhbGlkIEhDSSBDb21tYW5kIFBhcmFtZXRlcnMgKi8KLQlIQ0lfU1RBVFVTX1JFTU9URV9VU0VSX1RFUk1JTkFURV9DT05ORUNUID0gMFgxMywgLyogUmVtb3RlIFVzZXIgVGVybWluYXRlZCBDb25uZWN0aW9uICovCi0JSENJX1NUQVRVU19SRU1PVEVfREVWX1RFUk1JTkFURV9MT1dfUkVTT1VSQ0UgPSAwWDE0LCAvKiBSZW1vdGUgRGV2aWNlIFRlcm1pbmF0ZWQgQ29ubmVjdGlvbiBkdWUgdG8gTG93IFJlc291cmNlcyAqLwotCUhDSV9TVEFUVVNfUkVNT1RFX0RFVl9URVJNSU5BVEVfQ09OTkVDVF9QT1dFUl9PRkYgPSAwWDE1LCAvKiBSZW1vdGUgRGV2aWNlIFRlcm1pbmF0ZWQgQ29ubmVjdGlvbiBkdWUgdG8gUG93ZXIgT2ZmICovCi0JSENJX1NUQVRVU19DT05ORUNUX1RFUk1JTkFURV9MT0NBTF9IT1NUCT0gMFgxNiwgLyogQ29ubmVjdGlvbiBUZXJtaW5hdGVkIEJ5IExvY2FsIEhvc3QgKi8KLQlIQ0lfU1RBVFVTX1JFUEVBVEVfQVRURU1QVAkJPSAwWDE3LCAvKiBSZXBlYXRlZCBBdHRlbXB0cyAqLwotCUhDSV9TVEFUVVNfUEFJUl9OT1RfQUxMT1cJCT0gMFgxOCwgLyogUGFpcmluZyBOb3QgQWxsb3dlZCAqLwotCUhDSV9TVEFUVVNfVU5LTk9XX0xNUF9QRFUJCT0gMFgxOSwgLyogVW5rbm93biBMTVAgUERVICovCi0JSENJX1NUQVRVU19VTlNVUFBPUlRfUkVNT1RFX0xNUF9GRUFUVVJFCT0gMFgxYSwgLyogVW5zdXBwb3J0ZWQgUmVtb3RlIEZlYXR1cmUgLyBVbnN1cHBvcnRlZCBMTVAgRmVhdHVyZSAqLwotCUhDSV9TVEFUVVNfU09DX09GRlNFVF9SRUpFQ1QJCT0gMFgxYiwgLyogU0NPIE9mZnNldCBSZWplY3RlZCAqLwotCUhDSV9TVEFUVVNfU09DX0lOVEVSVkFMX1JFSkVDVAkJPSAwWDFjLCAvKiBTQ08gSW50ZXJ2YWwgUmVqZWN0ZWQgKi8KLQlIQ0lfU1RBVFVTX1NPQ19BSVJfTU9ERV9SRUpFQ1QJCT0gMFgxZCwvKiBTQ08gQWlyIE1vZGUgUmVqZWN0ZWQgKi8KLQlIQ0lfU1RBVFVTX0lOVkFMSURfTE1QX1BBUkEJCT0gMFgxZSwgLyogSW52YWxpZCBMTVAgUGFyYW1ldGVycyAqLwotCUhDSV9TVEFUVVNfVU5TUEVDSUZJQ19FUlJPUgkJPSAwWDFmLCAvKiBVbnNwZWNpZmllZCBFcnJvciAqLwotCUhDSV9TVEFUVVNfVU5TVVBQT1JUX0xNUF9QQVJBX1ZBTFVFCT0gMFgyMCwgLyogVW5zdXBwb3J0ZWQgTE1QIFBhcmFtZXRlciBWYWx1ZSAqLwotCUhDSV9TVEFUVVNfUk9MRV9DSEFOR0VfTk9UX0FMTE9XCT0gMFgyMSwgLyogUm9sZSBDaGFuZ2UgTm90IEFsbG93ZWQgKi8KLQlIQ0lfU1RBVFVTX0xNUF9SRVNQT05TRV9USU1FT1VUCQk9IDBYMjIsIC8qIExNUCBSZXNwb25zZSBUaW1lb3V0ICovCi0JSENJX1NUQVRVU19MTVBfRVJST1JfVFJBTlNBQ1RJT05fQ09MTElTSU9OID0gMFgyMywgLyogTE1QIEVycm9yIFRyYW5zYWN0aW9uIENvbGxpc2lvbiAqLwotCUhDSV9TVEFUVVNfTE1QX1BEVV9OT1RfQUxMT1cJCT0gMFgyNCwgLyogTE1QIFBEVSBOb3QgQWxsb3dlZCAqLwotCUhDSV9TVEFUVVNfRU5DUllQVElPTl9NT0RFX05PVF9BTExPVwk9IDBYMjUsIC8qIEVuY3J5cHRpb24gTW9kZSBOb3QgQWNjZXB0YWJsZSAqLwotCUhDSV9TVEFUVVNfTElOS19LRVlfQ0FOX05PVF9DSEFOR0UJPSAwWDI2LCAvKiBMaW5rIEtleSBDYW4gTm90IGJlIENoYW5nZWQgKi8KLQlIQ0lfU1RBVFVTX1JFUVVFU1RfUU9TX05PVF9TVVBQT1JUCT0gMFgyNywgLyogUmVxdWVzdGVkIFFvUyBOb3QgU3VwcG9ydGVkICovCi0JSENJX1NUQVRVU19JTlNUQU5UX1BBU1NFRAkJPSAwWDI4LCAvKiBJbnN0YW50IFBhc3NlZCAqLwotCUhDSV9TVEFUVVNfUEFJUklOR19VTklUX0tFWV9OT1RfU1VQUE9SVCA9IDBYMjksIC8qIFBhaXJpbmcgV2l0aCBVbml0IEtleSBOb3QgU3VwcG9ydGVkICovCi0JSENJX1NUQVRVU19ESUZGRVJFTlRfVFJBTlNBQ1RJT05fQ09MTElTSU9OID0gMFgyYSwgLyogRGlmZmVyZW50IFRyYW5zYWN0aW9uIENvbGxpc2lvbiAqLwotCUhDSV9TVEFUVVNfUkVTRVJWRV8xCQkJPSAwWDJiLCAvKiBSZXNlcnZlZCAqLwotCUhDSV9TVEFUVVNfUU9TX1VOQUNDRVBUX1BBUkEJCT0gMFgyYywgLyogUW9TIFVuYWNjZXB0YWJsZSBQYXJhbWV0ZXIgKi8KLQlIQ0lfU1RBVFVTX1FPU19SRUpFQ1QJCQk9IDBYMmQsIC8qIFFvUyBSZWplY3RlZCAqLwotCUhDSV9TVEFUVVNfQ0hOTF9DTEFTU0lGSUNBVElPTl9OT1RfU1VQUE9SVCA9IDBYMmUsIC8qIENoYW5uZWwgQ2xhc3NpZmljYXRpb24gTm90IFN1cHBvcnRlZCAqLwotCUhDSV9TVEFUVVNfSU5TVUZGSUNJRU5UX1NFQ1VSSVRZCT0gMFgyZiwgLyogSW5zdWZmaWNpZW50IFNlY3VyaXR5ICovCi0JSENJX1NUQVRVU19QQVJBX09VVF9PRl9SQU5HRQkJPSAweDMwLCAvKiBQYXJhbWV0ZXIgT3V0IE9mIE1hbmRhdG9yeSBSYW5nZSAqLwotCUhDSV9TVEFUVVNfUkVTRVJWRV8yCQkJPSAwWDMxLCAvKiBSZXNlcnZlZCAqLwotCUhDSV9TVEFUVVNfUk9MRV9TV0lUQ0hfUEVORElORwkJPSAwWDMyLCAvKiBSb2xlIFN3aXRjaCBQZW5kaW5nICovCi0JSENJX1NUQVRVU19SRVNFUlZFXzMJCQk9IDBYMzMsIC8qIFJlc2VydmVkICovCi0JSENJX1NUQVRVU19SRVNFUlZFX1NPTFRfVklPTEFUSU9OCT0gMFgzNCwgLyogUmVzZXJ2ZWQgU2xvdCBWaW9sYXRpb24gKi8KLQlIQ0lfU1RBVFVTX1JPTEVfU1dJVENIX0ZBSUwJCT0gMFgzNSwgLyogUm9sZSBTd2l0Y2ggRmFpbGVkICovCi0JSENJX1NUQVRVU19FWFRFTkRfSU5RVUlSWV9SU1BfVE9PX0xBUkdFCT0gMFgzNiwgLyogRXh0ZW5kZWQgSW5xdWlyeSBSZXNwb25zZSBUb28gTGFyZ2UgKi8KLQlIQ0lfU1RBVFVTX1NFQ19TSU1QTEVfUEFJUklOR19OT1RfU1VQUE9SVCA9IDBYMzcsIC8qIFNlY3VyZSBTaW1wbGUgUGFpcmluZyBOb3QgU3VwcG9ydGVkIEJ5IEhvc3QuICovCi0JSENJX1NUQVRVU19IT1NUX0JVU1lfUEFJUklORwkJPSAwWDM4LCAvKiBIb3N0IEJ1c3kgLSBQYWlyaW5nICovCi0JSENJX1NUQVRVU19DT05ORUNUX1JFSl9OT1RfU1VJVF9DSE5MX0ZPVU5EID0gMFgzOSwgLyogQ29ubmVjdGlvbiBSZWplY3RlZCBkdWUgdG8gTm8gU3VpdGFibGUgQ2hhbm5lbCBGb3VuZCAqLwotCUhDSV9TVEFUVVNfQ09OVFJPTExFUl9CVVNZCQk9IDBYM2EgIC8qIENPTlRST0xMRVIgQlVTWSAqLwotfTsKLQotLyogICovCi0vKiAgVGhlIGZvbGxvd2luZyBpcyBmb3IgQlQgMy4wICsgSFMgSENJIENPTU1BTkQgKi8KLS8qICAqLwotCi0vKiBiaXQgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAxMCAxMSAxMiAxMyAxNCAxNSAqLwotLyoJIHwJT0NGCQkJICAgICAgICAgICAgIHwJICAgT0dGICAgICAgIHwgKi8KLS8qICAqLwotCi0vKiBPR0YgMHgwMSAqLwotI2RlZmluZSBMSU5LX0NPTlRST0xfQ09NTUFORFMJCQkweDAxCi1lbnVtIGxpbmtfY29udHJvbF9jb21tYW5kcyB7Ci0JSENJX0lOUVVJUlkJCQkJCT0gMHgwMDAxLAotCUhDSV9JTlFVSVJZX0NBTkNFTAkJCQk9IDB4MDAwMiwKLQlIQ0lfUEVSSU9ESUNfSU5RVUlSWV9NT0RFCQkJPSAweDAwMDMsCi0JSENJX0VYSVRfUEVSSU9ESUNfSU5RVUlSWV9NT0RFCQkJPSAweDAwMDQsCi0JSENJX0NSRUFURV9DT05ORUNUSU9OCQkJCT0gMHgwMDA1LAotCUhDSV9ESVNDT05ORUNUCQkJCQk9IDB4MDAwNiwKLQlIQ0lfQ1JFQVRFX0NPTk5FQ1RJT05fQ0FOQ0VMCQkJPSAweDAwMDgsCi0JSENJX0FDQ0VQVF9DT05ORUNUSU9OUkVRVUVTVAkJCT0gMHgwMDA5LAotCUhDSV9SRUpFQ1RfQ09OTkVDVElPTl9SRVFVRVNUCQkJPSAweDAwMGEsCi0JSENJX0xJTktfS0VZX1JFUVVFU1RfUkVQTFkJCQk9IDB4MDAwYiwKLQlIQ0lfTElOS19LRVlfUkVRVUVTVF9ORUdBVElWRV9SRVBMWQkJPSAweDAwMGMsCi0JSENJX1BJTl9DT0RFX1JFUVVFU1RfUkVQTFkJCQk9IDB4MDAwZCwKLQlIQ0lfUElOX0NPREVfUkVRVUVTVF9ORUdBVElWRV9SRVBMWQkJPSAweDAwMGUsCi0JSENJX0NIQU5HRV9DT05ORUNUSU9OX1BBQ0tFVF9UWVBFCQk9IDB4MDAwZiwKLQlIQ0lfQVVUSEVOVElDQVRJT05fUkVRVUVTVEVECQkJPSAweDAwMTEsCi0JSENJX1NFVF9DT05ORUNUSU9OX0VOQ1JZUFRJT04JCQk9IDB4MDAxMywKLQlIQ0lfQ0hBTkdFX0NPTk5FQ1RJT05fTElOS19LRVkJCQk9IDB4MDAxNSwKLQlIQ0lfTUFTVEVSX0xJTktfS0VZCQkJCT0gMHgwMDE3LAotCUhDSV9SRU1PVEVfTkFNRV9SRVFVRVNUCQkJCT0gMHgwMDE5LAotCUhDSV9SRU1PVEVfTkFNRV9SRVFVRVNUX0NBTkNFTAkJCT0gMHgwMDFhLAotCUhDSV9SRUFEX1JFTU9URV9TVVBQT1JURURfRkVBVFVSRVMJCT0gMHgwMDFiLAotCUhDSV9SRUFEX1JFTU9URV9FWFRFTkRFRF9GRUFUVVJFUwkJPSAweDAwMWMsCi0JSENJX1JFQURfUkVNT1RFX1ZFUlNJT05fSU5GT1JNQVRJT04JCT0gMHgwMDFkLAotCUhDSV9SRUFEX0NMT0NLX09GRlNFVAkJCQk9IDB4MDAxZiwKLQlIQ0lfUkVBRF9MTVBfSEFORExFCQkJCT0gMHgwMDIwLAotCUhDSV9TRVRVUF9TWU5DSFJPTk9VU19DT05ORUNUSU9OCQk9IDB4MDAyOCwKLQlIQ0lfQUNDRVBUX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT05fUkVRVUVTVAk9IDB4MDAyOSwKLQlIQ0lfUkVKRUNUX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT05fUkVRVUVTVAk9IDB4MDAyYSwKLQlIQ0lfSU9fQ0FQQUJJTElUWV9SRVFVRVNUX1JFUExZCQkJPSAweDAwMmIsCi0JSENJX1VTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1RfUkVQTFkJCT0gMHgwMDJjLAotCUhDSV9VU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUX05FR0FUSVZFX1JFUExZCT0gMHgwMDJkLAotCUhDSV9VU0VSX1BBU1NLRVlfUkVRVUVTVF9SRVBMWQkJCT0gMHgwMDJlLAotCUhDSV9VU0VSX1BBU1NLRVlfUkVRVUVTVE5FR0FUSVZFX1JFUExZCQk9IDB4MDAyZiwKLQlIQ0lfUkVNT1RFX09PQl9EQVRBX1JFUVVFU1RfUkVQTFkJCT0gMHgwMDMwLAotCUhDSV9SRU1PVEVfT09CX0RBVEFfUkVRVUVTVF9ORUdBVElWRV9SRVBMWQk9IDB4MDAzMywKLQlIQ0lfSU9fQ0FQQUJJTElUWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZCT0gMHgwMDM0LAotCUhDSV9DUkVBVEVfUEhZU0lDQUxfTElOSwkJCT0gMHgwMDM1LAotCUhDSV9BQ0NFUFRfUEhZU0lDQUxfTElOSwkJCT0gMHgwMDM2LAotCUhDSV9ESVNDT05ORUNUX1BIWVNJQ0FMX0xJTksJCQk9IDB4MDAzNywKLQlIQ0lfQ1JFQVRFX0xPR0lDQUxfTElOSwkJCQk9IDB4MDAzOCwKLQlIQ0lfQUNDRVBUX0xPR0lDQUxfTElOSwkJCQk9IDB4MDAzOSwKLQlIQ0lfRElTQ09OTkVDVF9MT0dJQ0FMX0xJTksJCQk9IDB4MDAzYSwKLQlIQ0lfTE9HSUNBTF9MSU5LX0NBTkNFTAkJCQk9IDB4MDAzYiwKLQlIQ0lfRkxPV19TUEVDX01PRElGWQkJCQk9IDB4MDAzYwotfTsKLQotLyogT0dGIDB4MDIgKi8KLSNkZWZpbmUgSE9MRF9NT0RFX0NPTU1BTkQJCQkJMHgwMgotZW51bSBob2xkX21vZGVfY29tbWFuZCB7Ci0JSENJX0hPTERfTU9ERQkJCQkJPSAweDAwMDEsCi0JSENJX1NOSUZGX01PREUJCQkJCT0gMHgwMDAyLAotCUhDSV9FWElUX1NOSUZGX01PREUJCQkJPSAweDAwMDMsCi0JSENJX1BBUktfU1RBVEUJCQkJCT0gMHgwMDA1LAotCUhDSV9FWElUX1BBUktfU1RBVEUJCQkJPSAweDAwMDYsCi0JSENJX1FPU19TRVRVUAkJCQkJPSAweDAwMDcsCi0JSENJX1JPTEVfRElTQ09WRVJZCQkJCT0gMHgwMDA5LAotCUhDSV9TV0lUQ0hfUk9MRQkJCQkJPSAweDAwMGIsCi0JSENJX1JFQURfTElOS19QT0xJQ1lfU0VUVElOR1MJCQk9IDB4MDAwYywKLQlIQ0lfV1JJVEVfTElOS19QT0xJQ1lfU0VUVElOR1MJCQk9IDB4MDAwZCwKLQlIQ0lfUkVBRF9ERUZBVUxUX0xJTktfUE9MSUNZX1NFVFRJTkdTCQk9IDB4MDAwZSwKLQlIQ0lfV1JJVEVfREVGQVVMVF9MSU5LX1BPTElDWV9TRVRUSU5HUwkJPSAweDAwMGYsCi0JSENJX0ZMT1dfU1BFQ0lGSUNBVElPTgkJCQk9IDB4MDAxMCwKLQlIQ0lfU05JRkZfU1VCUkFUSU5HCQkJCT0gMHgwMDExCi19OwotCi0vKiBPR0YgMHgwMyAqLwotI2RlZmluZSBPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORAkJCTB4MDMKLWVudW0gc2V0X2V2ZW50X21hc2tfY29tbWFuZCB7Ci0JSENJX1NFVF9FVkVOVF9NQVNLCQkJCT0gMHgwMDAxLAotCUhDSV9SRVNFVAkJCQkJPSAweDAwMDMsCi0JSENJX1NFVF9FVkVOVF9GSUxURVIJCQkJPSAweDAwMDUsCi0JSENJX0ZMVVNICQkJCQk9IDB4MDAwOCwKLQlIQ0lfUkVBRF9QSU5fVFlQRQkJCQk9IDB4MDAwOSwKLQlIQ0lfV1JJVEVfUElOX1RZUEUJCQkJPSAweDAwMGEsCi0JSENJX0NSRUFURV9ORVdfVU5JVF9LRVkJCQkJPSAweDAwMGIsCi0JSENJX1JFQURfU1RPUkVEX0xJTktfS0VZCQkJPSAweDAwMGQsCi0JSENJX1dSSVRFX1NUT1JFRF9MSU5LX0tFWQkJCT0gMHgwMDExLAotCUhDSV9ERUxFVEVfU1RPUkVEX0xJTktfS0VZCQkJPSAweDAwMTIsCi0JSENJX1dSSVRFX0xPQ0FMX05BTUUJCQkJPSAweDAwMTMsCi0JSENJX1JFQURfTE9DQUxfTkFNRQkJCQk9IDB4MDAxNCwKLQlIQ0lfUkVBRF9DT05ORUNUSU9OX0FDQ0VQVF9USU1FT1VUCQk9IDB4MDAxNSwKLQlIQ0lfV1JJVEVfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVAkJPSAweDAwMTYsCi0JSENJX1JFQURfUEFHRV9USU1FT1VUCQkJCT0gMHgwMDE3LAotCUhDSV9XUklURV9QQUdFX1RJTUVPVVQJCQkJPSAweDAwMTgsCi0JSENJX1JFQURfU0NBTl9FTkFCTEUJCQkJPSAweDAwMTksCi0JSENJX1dSSVRFX1NDQU5fRU5BQkxFCQkJCT0gMHgwMDFhLAotCUhDSV9SRUFEX1BBR0VfU0NBTl9BQ1RJVklUWQkJCT0gMHgwMDFiLAotCUhDSV9XUklURV9QQUdFX1NDQU5fQUNUSVZJVFkJCQk9IDB4MDAxYywKLQlIQ0lfUkVBRF9JTlFVSVJZX1NDQU5fQUNUSVZJVFkJCQk9IDB4MDAxZCwKLQlIQ0lfV1JJVEVfSU5RVUlSWV9TQ0FOX0FDVElWSVRZCQkJPSAweDAwMWUsCi0JSENJX1JFQURfQVVUSEVOVElDQVRJT05fRU5BQkxFCQkJPSAweDAwMWYsCi0JSENJX1dSSVRFX0FVVEhFTlRJQ0FUSU9OX0VOQUJMRQkJCT0gMHgwMDIwLAotCUhDSV9SRUFEX0NMQVNTX09GX0RFVklDRQkJCT0gMHgwMDIzLAotCUhDSV9XUklURV9DTEFTU19PRl9ERVZJQ0UJCQk9IDB4MDAyNCwKLQlIQ0lfUkVBRF9WT0lDRV9TRVRUSU5HCQkJCT0gMHgwMDI1LAotCUhDSV9XUklURV9WT0lDRV9TRVRUSU5HCQkJCT0gMHgwMDI2LAotCUhDSV9SRUFEX0FVVE9NQVRJQ19GTFVTSF9USU1FT1VUCQk9IDB4MDAyNywKLQlIQ0lfV1JJVEVfQVVUT01BVElDX0ZMVVNIX1RJTUVPVVQJCT0gMHgwMDI4LAotCUhDSV9SRUFEX05VTV9CUk9BRENBU1RfUkVUUkFOU01JU1NJT05TCQk9IDB4MDAyOSwKLQlIQ0lfV1JJVEVfTlVNX0JST0FEQ0FTVF9SRVRSQU5TTUlTU0lPTlMJCT0gMHgwMDJhLAotCUhDSV9SRUFEX0hPTERfTU9ERV9BQ1RJVklUWQkJCT0gMHgwMDJiLAotCUhDSV9XUklURV9IT0xEX01PREVfQUNUSVZJVFkJCQk9IDB4MDAyYywKLQlIQ0lfUkVBRF9TWU5DSFJPTk9VU19GTE9XX0NPTlRST0xfRU5BQkxFCT0gMHgwMDJlLAotCUhDSV9XUklURV9TWU5DSFJPTk9VU19GTE9XX0NPTlRST0xfRU5BQkxFCT0gMHgwMDJmLAotCUhDSV9TRVRfQ09OVFJPTExFUl9UT19IT1NUX0ZMT1dfQ09OVFJPTAkJPSAweDAwMzEsCi0JSENJX0hPU1RfQlVGRkVSX1NJWkUJCQkJPSAweDAwMzMsCi0JSENJX0hPU1RfTlVNQkVSX09GX0NPTVBMRVRFRF9QQUNLRVRTCQk9IDB4MDAzNSwKLQlIQ0lfUkVBRF9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVQJCT0gMHgwMDM2LAotCUhDSV9XUklURV9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVQJCT0gMHgwMDM3LAotCUhDSV9SRUFEX05VTUJFUl9PRl9TVVBQT1JURURfSUFDCQk9IDB4MDAzOCwKLQlIQ0lfUkVBRF9DVVJSRU5UX0lBQ19MQVAJCQk9IDB4MDAzOSwKLQlIQ0lfV1JJVEVfQ1VSUkVOVF9JQUNfTEFQCQkJPSAweDAwM2EsCi0JSENJX1JFQURfUEFHRV9TQ0FOX01PREUJCQkJPSAweDAwM2QsCi0JSENJX1dSSVRFX1BBR0VfU0NBTl9NT0RFCQkJPSAweDAwM2UsCi0JSENJX1NFVF9BRkhfSE9TVF9DSEFOTkVMX0NMQVNTSUZJQ0FUSU9OCQk9IDB4MDAzZiwKLQlIQ0lfUkVBRF9JTlFVSVJZX1NDQU5fVFlQRQkJCT0gMHgwMDQyLAotCUhDSV9XUklURV9JTlFVSVJZX1NDQU5fVFlQRQkJCT0gMHgwMDQzLAotCUhDSV9SRUFEX0lOUVVJUllfTU9ERQkJCQk9IDB4MDA0NCwKLQlIQ0lfV1JJVEVfSU5RVUlSWV9NT0RFCQkJCT0gMHgwMDQ1LAotCUhDSV9SRUFEX1BBR0VfU0NBTl9UWVBFCQkJCT0gMHgwMDQ2LAotCUhDSV9XUklURV9QQUdFX1NDQU5fVFlQRQkJCT0gMHgwMDQ3LAotCUhDSV9SRUFEX0FGSF9DSEFOTkVMX0FTU0VTU01FTlRfTU9ERQkJPSAweDAwNDgsCi0JSENJX1dSSVRFX0FGSF9DSEFOTkVMX0FTU0VTU01FTlRfTU9ERQkJPSAweDAwNDksCi0JSENJX1JFQURfRVhURU5ERURfSU5RVUlSWV9SRVNQT05TRQkJPSAweDAwNTEsCi0JSENJX1dSSVRFX0VYVEVOREVEX0lOUVVJUllfUkVTUE9OU0UJCT0gMHgwMDUyLAotCUhDSV9SRUZSRVNIX0VOQ1JZUFRJT05fS0VZCQkJPSAweDAwNTMsCi0JSENJX1JFQURfU0lNUExFX1BBSVJJTkdfTU9ERQkJCT0gMHgwMDU1LAotCUhDSV9XUklURV9TSU1QTEVfUEFJUklOR19NT0RFCQkJPSAweDAwNTYsCi0JSENJX1JFQURfTE9DQUxfT09CX0RBVEEJCQkJPSAweDAwNTcsCi0JSENJX1JFQURfSU5RVUlSWV9SRVNQT05TRV9UUkFOU01JVF9QT1dFUl9MRVZFTAk9IDB4MDA1OCwKLQlIQ0lfV1JJVEVfSU5RVUlSWV9UUkFOU01JVF9QT1dFUl9MRVZFTAkJPSAweDAwNTksCi0JSENJX1JFQURfREVGQVVMVF9FUlJPTkVPVVNfREFUQV9SRVBPUlRJTkcJPSAweDAwNWEsCi0JSENJX1dSSVRFX0RFRkFVTFRfRVJST05FT1VTX0RBVEFfUkVQT1JUSU5HCT0gMHgwMDViLAotCUhDSV9FTkhBTkNFRF9GTFVTSAkJCQk9IDB4MDA1ZiwKLQlIQ0lfU0VORF9LRVlQUkVTU19OT1RJRklDQVRJT04JCQk9IDB4MDA2MCwKLQlIQ0lfUkVBRF9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVQJCT0gMHgwMDYxLAotCUhDSV9XUklURV9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVQJCT0gMHgwMDYyLAotCUhDSV9TRVRfRVZFTlRfTUFTS19QQUdFXzIJCQk9IDB4MDA2MywKLQlIQ0lfUkVBRF9MT0NBVElPTl9EQVRBCQkJCT0gMHgwMDY0LAotCUhDSV9XUklURV9MT0NBVElPTl9EQVRBCQkJCT0gMHgwMDY1LAotCUhDSV9SRUFEX0ZMT1dfQ09OVFJPTF9NT0RFCQkJPSAweDAwNjYsCi0JSENJX1dSSVRFX0ZMT1dfQ09OVFJPTF9NT0RFCQkJPSAweDAwNjcsCi0JSENJX1JFQURfRU5IQU5DRV9UUkFOU01JVF9QT1dFUl9MRVZFTAkJPSAweDAwNjgsCi0JSENJX1JFQURfQkVTVF9FRkZPUlRfRkxVU0hfVElNRU9VVAkJPSAweDAwNjksCi0JSENJX1dSSVRFX0JFU1RfRUZGT1JUX0ZMVVNIX1RJTUVPVVQJCT0gMHgwMDZhLAotCUhDSV9TSE9SVF9SQU5HRV9NT0RFCQkJCT0gMHgwMDZiCi19OwotCi0vKiBPR0YgMHgwNCAqLwotI2RlZmluZSBPR0ZfSU5GT1JNQVRJT05BTF9QQVJBTUVURVJTCQkJMHgwNAotZW51bSBpbmZvcm1hdGlvbmFsX3BhcmFtcyB7Ci0JSENJX1JFQURfTE9DQUxfVkVSU0lPTl9JTkZPUk1BVElPTgkJPSAweDAwMDEsCi0JSENJX1JFQURfTE9DQUxfU1VQUE9SVEVEX0NPTU1BTkRTCQk9IDB4MDAwMiwKLQlIQ0lfUkVBRF9MT0NBTF9TVVBQT1JURURfRkVBVFVSRVMJCT0gMHgwMDAzLAotCUhDSV9SRUFEX0xPQ0FMX0VYVEVOREVEX0ZFQVRVUkVTCQk9IDB4MDAwNCwKLQlIQ0lfUkVBRF9CVUZGRVJfU0laRQkJCQk9IDB4MDAwNSwKLQlIQ0lfUkVBRF9CRF9BRERSCQkJCT0gMHgwMDA5LAotCUhDSV9SRUFEX0RBVEFfQkxPQ0tfU0laRQkJCT0gMHgwMDBhCi19OwotCi0vKiBPR0YgMHgwNSAqLwotI2RlZmluZSBPR0ZfU1RBVFVTX1BBUkFNRVRFUlMJCQkJMHgwNQotZW51bSBzdGF0dXNfcGFyYW1zIHsKLQlIQ0lfUkVBRF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSCQkJPSAweDAwMDEsCi0JSENJX1JFU0VUX0ZBSUxFRF9DT05UQUNUX0NPVU5URVIJCT0gMHgwMDAyLAotCUhDSV9SRUFEX0xJTktfUVVBTElUWQkJCQk9IDB4MDAwMywKLQlIQ0lfUkVBRF9SU1NJCQkJCQk9IDB4MDAwNSwKLQlIQ0lfUkVBRF9BRkhfQ0hBTk5FTF9NQVAJCQk9IDB4MDAwNiwKLQlIQ0lfUkVBRF9DTE9DSwkJCQkJPSAweDAwMDcsCi0JSENJX1JFQURfRU5DUllQVElPTl9LRVlfU0laRQkJCT0gMHgwMDA4LAotCUhDSV9SRUFEX0xPQ0FMX0FNUF9JTkZPCQkJCT0gMHgwMDA5LAotCUhDSV9SRUFEX0xPQ0FMX0FNUF9BU1NPQwkJCT0gMHgwMDBhLAotCUhDSV9XUklURV9SRU1PVEVfQU1QX0FTU09DCQkJPSAweDAwMGIKLX07Ci0KLS8qIE9HRiAweDA2ICovCi0jZGVmaW5lIE9HRl9URVNUSU5HX0NPTU1BTkRTCQkJCTB4MDYKLWVudW0gdGVzdGluZ19jb21tYW5kcyB7Ci0JSENJX1JFQURfTE9PUEJBQ0tfTU9ERQkJCQk9IDB4MDAwMSwKLQlIQ0lfV1JJVEVfTE9PUEJBQ0tfTU9ERQkJCQk9IDB4MDAwMiwKLQlIQ0lfRU5BQkxFX0RFVklDRV9VTkRFUl9URVNUX01PREUJCT0gMHgwMDAzLAotCUhDSV9XUklURV9TSU1QTEVfUEFJUklOR19ERUJVR19NT0RFCQk9IDB4MDAwNCwKLQlIQ0lfRU5BQkxFX0FNUF9SRUNFSVZFUl9SRVBPUlRTCQkJPSAweDAwMDcsCi0JSENJX0FNUF9URVNUX0VORAkJCQk9IDB4MDAwOCwKLQlIQ0lfQU1QX1RFU1RfQ09NTUFORAkJCQk9IDB4MDAwOQotfTsKLQotLyogT0dGIDB4M2YgKi8KLSNkZWZpbmUgT0dGX0VYVEVOU0lPTgkJCQkJMFgzZgotZW51bSBoY2lfZXh0ZW5zaW9uX2NvbW1hbmRzIHsKLQlIQ0lfU0VUX0FDTF9MSU5LX0RBVEFfRkxPV19NT0RFCQkJPSAweDAwMTAsCi0JSENJX1NFVF9BQ0xfTElOS19TVEFUVVMJCQkJPSAweDAwMjAsCi0JSENJX1NFVF9TQ09fTElOS19TVEFUVVMJCQkJPSAweDAwMzAsCi0JSENJX1NFVF9SU1NJX1ZBTFVFCQkJCT0gMHgwMDQwLAotCUhDSV9TRVRfQ1VSUkVOVF9CTFVFVE9PVEhfU1RBVFVTCQk9IDB4MDA0MSwKLQotCS8qIFRoZSBmb2xsb3dpbmcgaXMgZm9yIFJUSzg3MjMgKi8KLQlIQ0lfRVhURU5TSU9OX1ZFUlNJT05fTk9USUZZCQkJPSAweDAxMDAsCi0JSENJX0xJTktfU1RBVFVTX05PVElGWQkJCQk9IDB4MDEwMSwKLQlIQ0lfQlRfT1BFUkFUSU9OX05PVElGWQkJCQk9IDB4MDEwMiwKLQlIQ0lfRU5BQkxFX1dJRklfU0NBTl9OT1RJRlkJCQk9IDB4MDEwMywKLQotCi0JLyogVGhlIGZvbGxvd2luZyBpcyBmb3IgSVZUICovCi0JSENJX1dJRklfQ1VSUkVOVF9DSEFOTkVMCQkJPSAweDAzMDAsCi0JSENJX1dJRklfQ1VSUkVOVF9CQU5EV0lEVEgJCQk9IDB4MDMwMSwKLQlIQ0lfV0lGSV9DT05ORUNUSU9OX1NUQVRVUwkJCT0gMHgwMzAyLAotfTsKLQotZW51bSBidF9zcGVjIHsKLQlCVF9TUEVDXzFfMF9iCQkJCQk9IDB4MDAsCi0JQlRfU1BFQ18xXzEJCQkJCT0gMHgwMSwKLQlCVF9TUEVDXzFfMgkJCQkJPSAweDAyLAotCUJUX1NQRUNfMl8wX0VEUgkJCQkJPSAweDAzLAotCUJUX1NQRUNfMl8xX0VEUgkJCQkJPSAweDA0LAotCUJUX1NQRUNfM18wX0hTCQkJCQk9IDB4MDUsCi0JQlRfU1BFQ180XzAJCQkJCT0gMHgwNgotfTsKLQotLyogIFRoZSBmb2xsb3dpbmcgaXMgZm9yIEJUIDMuMCArIEhTIEVWRU5UUyAqLwotZW51bSBoY2lfZXZlbnQgewotCUhDSV9FVkVOVF9JTlFVSVJZX0NPTVBMRVRFCQkJPSAweDAxLAotCUhDSV9FVkVOVF9JTlFVSVJZX1JFU1VMVAkJCT0gMHgwMiwKLQlIQ0lfRVZFTlRfQ09OTkVDVElPTl9DT01QTEVURQkJCT0gMHgwMywKLQlIQ0lfRVZFTlRfQ09OTkVDVElPTl9SRVFVRVNUCQkJPSAweDA0LAotCUhDSV9FVkVOVF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFCQk9IDB4MDUsCi0JSENJX0VWRU5UX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFCQk9IDB4MDYsCi0JSENJX0VWRU5UX1JFTU9URV9OQU1FX1JFUVVFU1RfQ09NUExFVEUJCT0gMHgwNywKLQlIQ0lfRVZFTlRfRU5DUllQVElPTl9DSEFOR0UJCQk9IDB4MDgsCi0JSENJX0VWRU5UX0NIQU5HRV9MSU5LX0tFWV9DT01QTEVURQkJPSAweDA5LAotCUhDSV9FVkVOVF9NQVNURVJfTElOS19LRVlfQ09NUExFVEUJCT0gMHgwYSwKLQlIQ0lfRVZFTlRfUkVBRF9SRU1PVEVfU1VQUE9SVF9GRUFUVVJFU19DT01QTEVURQk9IDB4MGIsCi0JSENJX0VWRU5UX1JFQURfUkVNT1RFX1ZFUl9JTkZPX0NPTVBMRVRFCQk9IDB4MGMsCi0JSENJX0VWRU5UX1FPU19TRVRVUF9DT01QTEVURQkJCT0gMHgwZCwKLQlIQ0lfRVZFTlRfQ09NTUFORF9DT01QTEVURQkJCT0gMHgwZSwKLQlIQ0lfRVZFTlRfQ09NTUFORF9TVEFUVVMJCQk9IDB4MGYsCi0JSENJX0VWRU5UX0hBUkRXQVJFX0VSUk9SCQkJPSAweDEwLAotCUhDSV9FVkVOVF9GTFVTSF9PQ0NSVUVECQkJCT0gMHgxMSwKLQlIQ0lfRVZFTlRfUk9MRV9DSEFOR0UJCQkJPSAweDEyLAotCUhDSV9FVkVOVF9OVU1CRVJfT0ZfQ09NUExFVEVfUEFDS0VUUwkJPSAweDEzLAotCUhDSV9FVkVOVF9NT0RFX0NIQU5HRQkJCQk9IDB4MTQsCi0JSENJX0VWRU5UX1JFVFVSTl9MSU5LX0tFWVMJCQk9IDB4MTUsCi0JSENJX0VWRU5UX1BJTl9DT0RFX1JFUVVFU1QJCQk9IDB4MTYsCi0JSENJX0VWRU5UX0xJTktfS0VZX1JFUVVFU1QJCQk9IDB4MTcsCi0JSENJX0VWRU5UX0xJTktfS0VZX05PVElGSUNBVElPTgkJCT0gMHgxOCwKLQlIQ0lfRVZFTlRfTE9PUEJBQ0tfQ09NTUFORAkJCT0gMHgxOSwKLQlIQ0lfRVZFTlRfREFUQV9CVUZGRVJfT1ZFUkZMT1cJCQk9IDB4MWEsCi0JSENJX0VWRU5UX01BWF9TTE9UU19DSEFOR0UJCQk9IDB4MWIsCi0JSENJX0VWRU5UX1JFQURfQ0xPQ0tfT0ZGU0VUX0NPTVBMRVRFCQk9IDB4MWMsCi0JSENJX0VWRU5UX0NPTk5FQ1RfUEFDS0VUX1RZUEVfQ0hBTkdFCQk9IDB4MWQsCi0JSENJX0VWRU5UX1FPU19WSU9MQVRJT04JCQkJPSAweDFlLAotCUhDSV9FVkVOVF9QQUdFX1NDQU5fUkVQRVRJVElPTl9NT0RFX0NIQU5HRQk9IDB4MjAsCi0JSENJX0VWRU5UX0ZMT1dfU0VQQ19DT01QTEVURQkJCT0gMHgyMSwKLQlIQ0lfRVZFTlRfSU5RVUlSWV9SRVNVTFRfV0lUSF9SU1NJCQk9IDB4MjIsCi0JSENJX0VWRU5UX1JFQURfUkVNT1RFX0VYVF9GRUFUVVJFU19DT01QTEVURQk9IDB4MjMsCi0JSENJX0VWRU5UX1NZTkNfQ09OTkVDVF9DT01QTEVURQkJCT0gMHgyYywKLQlIQ0lfRVZFTlRfU1lOQ19DT05ORUNUX0NIQU5HRQkJCT0gMHgyZCwKLQlIQ0lfRVZFTlRfU05JRkZFUl9TVUJSQVRJTkcJCQk9IDB4MmUsCi0JSENJX0VWRU5UX0VYVEVOVEVEX0lOUVVJUllfUkVTVUxUCQk9IDB4MmYsCi0JSENJX0VWRU5UX0VOQ1JZUFRJT05fS0VZX1JFRkxBU0hfQ09NUExFVEUJPSAweDMwLAotCUhDSV9FVkVOVF9JT19DQVBJQklMSVRZX0NPTVBMRVRFCQk9IDB4MzEsCi0JSENJX0VWRU5UX0lPX0NBUElCSUxJVFlfUkVTUE9OU0UJCT0gMHgzMiwKLQlIQ0lfRVZFTlRfVVNFUl9DT05GSVJNVElPTl9SRVFVRVNUCQk9IDB4MzMsCi0JSENJX0VWRU5UX1VTRVJfUEFTU0tFWV9SRVFVRVNUCQkJPSAweDM0LAotCUhDSV9FVkVOVF9SRU1PVEVfT09CX0RBVEFfUkVRVUVTVAkJPSAweDM1LAotCUhDSV9FVkVOVF9TSU1QTEVfUEFJUklOR19DT01QTEVURQkJPSAweDM2LAotCUhDSV9FVkVOVF9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVRfQ0hBTkdFCT0gMHgzOCwKLQlIQ0lfRVZFTlRfRU5IQU5DRURfRkxVU0hfQ09NUExFVEUJCT0gMHgzOSwKLQlIQ0lfRVZFTlRfVVNFUl9QQVNTS0VZX05PVElGSUNBVElPTgkJPSAweDNiLAotCUhDSV9FVkVOVF9LRVlQUkVTU19OT1RJRklDQVRJT04JCQk9IDB4M2MsCi0JSENJX0VWRU5UX1JFTU9URV9IT1NUX1NVUFBPUlRfRkVBVFVSRVNfTk9USUZJQ0FUSU9OCT0gMHgzZCwKLQlIQ0lfRVZFTlRfUEhZX0xJTktfQ09NUExFVEUJCQk9IDB4NDAsCi0JSENJX0VWRU5UX0NIQU5ORUxfU0VMRUNUCQkJPSAweDQxLAotCUhDSV9FVkVOVF9ESVNDT05ORUNUX1BIWV9MSU5LX0NPTVBMRVRFCQk9IDB4NDIsCi0JSENJX0VWRU5UX1BIWV9MSU5LX0xPU1NfRUFSTFlfV0FSTklORwkJPSAweDQzLAotCUhDSV9FVkVOVF9QSFlfTElOS19SRUNPVkVSCQkJPSAweDQ0LAotCUhDSV9FVkVOVF9MT0dJQ0FMX0xJTktfQ09NUExFVEUJCQk9IDB4NDUsCi0JSENJX0VWRU5UX0RJU0NPTk5FQ1RfTE9HSUNBTF9MSU5LX0NPTVBMRVRFCT0gMHg0NiwKLQlIQ0lfRVZFTlRfRkxPV19TUEVDX01PRElGWV9DT01QTEVURQkJPSAweDQ3LAotCUhDSV9FVkVOVF9OVU1fT0ZfQ09NUExFVEVfREFUQV9CTE9DS1MJCT0gMHg0OCwKLQlIQ0lfRVZFTlRfQU1QX1NUQVJUX1RFU1QJCQk9IDB4NDksCi0JSENJX0VWRU5UX0FNUF9URVNUX0VORAkJCQk9IDB4NGEsCi0JSENJX0VWRU5UX0FNUF9SRUNFSVZFUl9SRVBPUlQJCQk9IDB4NGIsCi0JSENJX0VWRU5UX1NIT1JUX1JBTkdFX01PREVfQ0hBTkdFX0NPTVBMRVRFCT0gMHg0YywKLQlIQ0lfRVZFTlRfQU1QX1NUQVRVU19DSEFOR0UJCQk9IDB4NGQsCi0JSENJX0VWRU5UX0VYVEVOU0lPTl9SVEsJCQkJPSAweGZlLAotCUhDSV9FVkVOVF9FWFRFTlNJT05fTU9UTwkJCT0gMHhmZiwKLX07Ci0KLWVudW0gaGNpX2V4dGVuc2lvbl9ldmVudF9tb3RvIHsKLQlIQ0lfRVZFTlRfR0VUX0JUX1JTU0kJCQkJPSAweDAxLAotfTsKLQotZW51bSBoY2lfZXh0ZW5zaW9uX2V2ZW50IHsKLQlIQ0lfRVZFTlRfRVhUX1dJRklfU0NBTl9OT1RJRlkJCQk9IDB4MDEsCi19OwotCi1lbnVtIGhjaV9ldmVudF9tYXNrX3BhZ2VfMiB7Ci0JRU1QMl9IQ0lfRVZFTlRfUEhZX0xJTktfQ09NUExFVEUJCT0gMHgwMDAwMDAwMDAwMDAwMDAxLAotCUVNUDJfSENJX0VWRU5UX0NIQU5ORUxfU0VMRUNUCQkJPSAweDAwMDAwMDAwMDAwMDAwMDIsCi0JRU1QMl9IQ0lfRVZFTlRfRElTQ09OTkVDVF9QSFlfTElOS19DT01QTEVURQk9IDB4MDAwMDAwMDAwMDAwMDAwNCwKLQlFTVAyX0hDSV9FVkVOVF9QSFlfTElOS19MT1NTX0VBUkxZX1dBUk5JTkcJPSAweDAwMDAwMDAwMDAwMDAwMDgsCi0JRU1QMl9IQ0lfRVZFTlRfUEhZX0xJTktfUkVDT1ZFUgkJCT0gMHgwMDAwMDAwMDAwMDAwMDEwLAotCUVNUDJfSENJX0VWRU5UX0xPR0lDQUxfTElOS19DT01QTEVURQkJPSAweDAwMDAwMDAwMDAwMDAwMjAsCi0JRU1QMl9IQ0lfRVZFTlRfRElTQ09OTkVDVF9MT0dJQ0FMX0xJTktfQ09NUExFVEUJPSAweDAwMDAwMDAwMDAwMDAwNDAsCi0JRU1QMl9IQ0lfRVZFTlRfRkxPV19TUEVDX01PRElGWV9DT01QTEVURQk9IDB4MDAwMDAwMDAwMDAwMDA4MCwKLQlFTVAyX0hDSV9FVkVOVF9OVU1fT0ZfQ09NUExFVEVfREFUQV9CTE9DS1MJPSAweDAwMDAwMDAwMDAwMDAxMDAsCi0JRU1QMl9IQ0lfRVZFTlRfQU1QX1NUQVJUX1RFU1QJCQk9IDB4MDAwMDAwMDAwMDAwMDIwMCwKLQlFTVAyX0hDSV9FVkVOVF9BTVBfVEVTVF9FTkQJCQk9IDB4MDAwMDAwMDAwMDAwMDQwMCwKLQlFTVAyX0hDSV9FVkVOVF9BTVBfUkVDRUlWRVJfUkVQT1JUCQk9IDB4MDAwMDAwMDAwMDAwMDgwMCwKLQlFTVAyX0hDSV9FVkVOVF9TSE9SVF9SQU5HRV9NT0RFX0NIQU5HRV9DT01QTEVURQk9IDB4MDAwMDAwMDAwMDAwMTAwMCwKLQlFTVAyX0hDSV9FVkVOVF9BTVBfU1RBVFVTX0NIQU5HRQkJPSAweDAwMDAwMDAwMDAwMDIwMDAsCi19OwotCi1lbnVtIGhjaV9zdGF0ZV9tYWNoaW5lIHsKLQlIQ0lfU1RBVEVfU1RBUlRJTkcJCQk9IDB4MDEsCi0JSENJX1NUQVRFX0NPTk5FQ1RJTkcJCQk9IDB4MDIsCi0JSENJX1NUQVRFX0FVVEhFTlRJQ0FUSU5HCQk9IDB4MDQsCi0JSENJX1NUQVRFX0NPTk5FQ1RFRAkJCT0gMHgwOCwKLQlIQ0lfU1RBVEVfRElTQ09OTkVDVElORwkJCT0gMHgxMCwKLQlIQ0lfU1RBVEVfRElTQ09OTkVDVEVECQkJPSAweDIwCi19OwotCi1lbnVtIGFtcF9hc3NvY19zdHJ1Y3R1cmVfdHlwZSB7Ci0JQU1QX01BQ19BRERSCQkJCT0gMHgwMSwKLQlBTVBfUFJFRkVSUkVEX0NIQU5ORUxfTElTVAkJPSAweDAyLAotCUFNUF9DT05ORUNURURfQ0hBTk5FTAkJCT0gMHgwMywKLQlBTVBfODAyMTFfUEFMX0NBUF9MSVNUCQkJPSAweDA0LAotCUFNUF84MDIxMV9QQUxfVklTSU9OCQkJPSAweDA1LAotCUFNUF9SRVNFUlZFRF9GT1JfVEVTVElORwkJPSAweDMzCi19OwotCi1lbnVtIGFtcF9idGFwX3R5cGUgewotCUFNUF9CVEFQX05PTkUsCi0JQU1QX0JUQVBfQ1JFQVRPUiwKLQlBTVBfQlRBUF9KT0lORVIKLX07Ci0KLWVudW0gaGNpX3N0YXRlX3dpdGhfY21kIHsKLQlTVEFURV9DTURfQ1JFQVRFX1BIWV9MSU5LLAotCVNUQVRFX0NNRF9BQ0NFUFRfUEhZX0xJTkssCi0JU1RBVEVfQ01EX0RJU0NPTk5FQ1RfUEhZX0xJTkssCi0JU1RBVEVfQ01EX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVQsCi0JU1RBVEVfQ01EX01BQ19TVEFSVF9DT01QTEVURSwKLQlTVEFURV9DTURfTUFDX1NUQVJUX0ZBSUxFRCwKLQlTVEFURV9DTURfTUFDX0NPTk5FQ1RfQ09NUExFVEUsCi0JU1RBVEVfQ01EX01BQ19DT05ORUNUX0ZBSUxFRCwKLQlTVEFURV9DTURfTUFDX0RJU0NPTk5FQ1RfSU5ESUNBVEUsCi0JU1RBVEVfQ01EX01BQ19DT05ORUNUX0NBTkNFTF9JTkRJQ0FURSwKLQlTVEFURV9DTURfNFdBWV9GQUlMRUQsCi0JU1RBVEVfQ01EXzRXQVlfU1VDQ0VTU0VELAotCVNUQVRFX0NNRF9FTlRFUl9TVEFURSwKLQlTVEFURV9DTURfTk9fU1VDSF9DTUQsCi19OwotCi1lbnVtIGhjaV9zZXJ2aWNlX3R5cGUgewotCVNFUlZJQ0VfTk9fVFJBRkZJQywKLQlTRVJWSUNFX0JFU1RfRUZGT1JULAotCVNFUlZJQ0VfR1VBUkFOVEVFCi19OwotCi1lbnVtIGhjaV90cmFmZmljX21vZGUgewotCVRSQUZGSUNfTU9ERV9CRVNUX0VGRk9SVAkJCT0gMHgwMCwKLQlUUkFGRklDX01PREVfR1VBUkFOVEVFRF9MQVRFTkNZCQkJPSAweDAxLAotCVRSQUZGSUNfTU9ERV9HVUFSQU5URUVEX0JBTkRXSURUSAkJPSAweDAyLAotCVRSQUZGSUNfTU9ERV9HVUFSQU5URUVEX0xBVEVOQ1lfQU5EX0JBTkRXSURUSAk9IDB4MDMKLX07Ci0KLSNkZWZpbmUgSENJT1BDT0RFKF9PQ0YsIF9PR0YpCQkoX09HRjw8MTB8X09DRikKLSNkZWZpbmUgSENJT1BDT0RFTE9XKF9PQ0YsIF9PR0YpCSh1OCkoSENJT1BDT0RFKF9PQ0YsIF9PR0YpJjB4MDBmZikKLSNkZWZpbmUgSENJT1BDT0RFSElHSFQoX09DRiwgX09HRikJKHU4KShIQ0lPUENPREUoX09DRiwgX09HRik+PjgpCi0KLSNkZWZpbmUgVFdPQllURV9ISUdIVEJZVEUoX0RBVEEpCSh1OCkoX0RBVEE+PjgpCi0jZGVmaW5lIFRXT0JZVEVfTE9XQllURShfREFUQSkJCSh1OCkoX0RBVEEpCi0KLWVudW0gYW1wX3N0YXR1cyB7Ci0JQU1QX1NUQVRVU19BVkFfUEhZX1BXUl9EV04JCT0gMHgwLAotCUFNUF9TVEFUVVNfQlRfVVNFX09OTFkJCQk9IDB4MSwKLQlBTVBfU1RBVFVTX05PX0NBUEFDSVRZX0ZPUl9CVAkJPSAweDIsCi0JQU1QX1NUQVRVU19MT1dfQ0FQQUNJVFlfRk9SX0JUCQk9IDB4MywKLQlBTVBfU1RBVFVTX01FRElVTV9DQVBBQ0lUWV9GT1JfQlQJPSAweDQsCi0JQU1QX1NUQVRVU19ISUdIX0NBUEFDSVRZX0ZPUl9CVAkJPSAweDUsCi0JQU1QX1NUQVRVU19GVUxMX0NBUEFDSVRZX0ZPUl9CVAkJPSAweDYKLX07Ci0KLWVudW0gYnRfd3BhX21zZ190eXBlIHsKLQlUeXBlX0JUXzR3YXkxc3QJPSAwLAotCVR5cGVfQlRfNHdheTJuZAk9IDEsCi0JVHlwZV9CVF80d2F5M3JkCT0gMiwKLQlUeXBlX0JUXzR3YXk0dGgJPSAzLAotCVR5cGVfQlRfdW5rbm93CT0gNAotfTsKLQotZW51bSBidF9jb25uZWN0X3R5cGUgewotCUJUX0NPTk5FQ1RfQVVUSF9SRVEJCQk9IDB4MDAsCi0JQlRfQ09OTkVDVF9BVVRIX1JTUAkJCT0gMHgwMSwKLQlCVF9DT05ORUNUX0FTT0NfUkVRCQkJPSAweDAyLAotCUJUX0NPTk5FQ1RfQVNPQ19SU1AJCQk9IDB4MDMsCi0JQlRfRElTQ09OTkVDVAkJCQk9IDB4MDQKLX07Ci0KLWVudW0gYnRfbGxfc2VydmljZV90eXBlIHsKLQlCVF9MTF9CRSA9IDB4MDEsCi0JQlRfTExfR1UgPSAweDAyCi19OwotCi1lbnVtIGJ0X2xsX2Zsb3dzcGVjIHsKLQlCVF9UWF9CRV9GUywJCQkvKiBUWCBiZXN0IGVmZm9ydCBmbG93c3BlYyAqLwotCUJUX1JYX0JFX0ZTLAkJCS8qIFJYIGJlc3QgZWZmb3J0IGZsb3dzcGVjICovCi0JQlRfVFhfR1VfRlMsCQkJLyogVFggZ3VhcmFudGVlZCBsYXRlbmN5IGZsb3dzcGVjICovCi0JQlRfUlhfR1VfRlMsCQkJLyogUlggZ3VhcmFudGVlZCBsYXRlbmN5IGZsb3dzcGVjICovCi0JQlRfVFhfQkVfQUdHX0ZTLAkJLyogVFggYWdncmVnYXRlZCBiZXN0IGVmZm9ydCBmbG93c3BlYyAqLwotCUJUX1JYX0JFX0FHR19GUywJCS8qIFJYIGFnZ3JlZ2F0ZWQgYmVzdCBlZmZvcnQgZmxvd3NwZWMgKi8KLQlCVF9UWF9HVV9CV19GUywJCQkvKiBUWCBndWFyYW50ZWVkIGJhbmR3aWR0aCBmbG93c3BlYyAqLwotCUJUX1JYX0dVX0JXX0ZTLAkJCS8qIFJYIGd1YXJhbnRlZWQgYmFuZHdpZHRoIGZsb3dzcGVjICovCi0JQlRfVFhfR1VfTEFSR0VfRlMsCQkvKiBUWCBndWFyYW50ZWVkIGxhdGVuY3kgZmxvd3NwZWMsIGZvciB0ZXN0aW5nIG9ubHkgKi8KLQlCVF9SWF9HVV9MQVJHRV9GUywJCS8qIFJYIGd1YXJhbnRlZWQgbGF0ZW5jeSBmbG93c3BlYywgZm9yIHRlc3Rpbmcgb25seSAqLwotfTsKLQotZW51bSBidF90cmFmZmljX21vZGUgewotCUJUX01PVE9SX0VYVF9CRQkJPSAweDAwLCAvKiBCZXN0IEVmZm9ydC4gRGVmYXVsdC4gZm9yIEhDUlAsIFBBTiwgU0RQLCBSRkNPTU0tYmFzZWQgcHJvZmlsZXMgbGlrZSBGVFAsIE9QUCwgU1BQLCBEVU4sIGV0Yy4gKi8KLQlCVF9NT1RPUl9FWFRfR1VMCT0gMHgwMSwgLyogR3VhcmFudGVlZCBMYXRlbmN5LiBUaGlzIHR5cGUgb2YgdHJhZmZpYyBpcyB1c2VkIGUuZy4gZm9yIEhJRCBhbmQgQVZSQ1AuICovCi0JQlRfTU9UT1JfRVhUX0dVQgk9IDBYMDIsIC8qIEd1YXJhbnRlZWQgQmFuZHdpZHRoLiAqLwotCUJUX01PVE9SX0VYVF9HVUxCCT0gMFgwMyAgLyogR3VhcmFudGVlZCBMYXRlbmN5IGFuZCBCYW5kd2lkdGguIGZvciBBMkRQIGFuZCBWRFAuICovCi19OwotCi1lbnVtIGJ0X3RyYWZmaWNfbW9kZV9wcm9maWxlIHsKLQlCVF9QUk9GSUxFX05PTkUsCi0JQlRfUFJPRklMRV9BMkRQLAotCUJUX1BST0ZJTEVfUEFOLAotCUJUX1BST0ZJTEVfSElELAotCUJUX1BST0ZJTEVfU0NPCi19OwotCi1lbnVtIGJ0X2xpbmtfcm9sZSB7Ci0JQlRfTElOS19NQVNURVIJPSAwLAotCUJUX0xJTktfU0xBVkUJPSAxCi19OwotCi1lbnVtIGJ0X3N0YXRlX3dwYV9hdXRoIHsKLQlTVEFURV9XUEFfQVVUSF9VTklOSVRJQUxJWkVELAotCVNUQVRFX1dQQV9BVVRIX1dBSVRfUEFDS0VUXzEsIC8qICBKb2luICovCi0JU1RBVEVfV1BBX0FVVEhfV0FJVF9QQUNLRVRfMiwgLyogIENyZWF0ICovCi0JU1RBVEVfV1BBX0FVVEhfV0FJVF9QQUNLRVRfMywKLQlTVEFURV9XUEFfQVVUSF9XQUlUX1BBQ0tFVF80LAotCVNUQVRFX1dQQV9BVVRIX1NVQ0NFU1NFRAotfTsKLQotI2RlZmluZSBCVF9XUEFfQVVUSF9USU1FT1VUX1BFUklPRAkJMTAwMAotI2RlZmluZSBCVE1heFdQQUF1dGhSZVRyYW5zbWl0Q291bgkJNQotCi0jZGVmaW5lIE1BWF9BTVBfQVNTT0NfRlJBR19MRU4JCQkyNDgKLSNkZWZpbmUgVE9UQUxfQUxMT0NJQVRFX0FTU09DX0xFTgkJCTEwMDAKLQotc3RydWN0IGhjaV9mbG93X3NwZWMgewotCXU4CQkJCUlkZW50aWZpZXI7Ci0JdTgJCQkJU2VydmljZVR5cGU7Ci0JdTE2CQkJCU1heGltdW1TRFVTaXplOwotCXUzMgkJCQlTRFVJbnRlckFycml2YWxUaW1lOwotCXUzMgkJCQlBY2Nlc3NMYXRlbmN5OwotCXUzMgkJCQlGbHVzaFRpbWVvdXQ7Ci19OwotCi1zdHJ1Y3QgaGNpX2xvZ19saW5rX2NtZF9kYXRhIHsKLQl1OAkJCQlCdFBoeUxpbmtoYW5kbGU7Ci0JdTE2CQkJCUJ0TG9nTGlua2hhbmRsZTsKLQl1OAkJCQlCdFR4Rmxvd1NwZWNJRDsKLQlzdHJ1Y3QgaGNpX2Zsb3dfc3BlYwkJVHhfRmxvd19TcGVjOwotCXN0cnVjdCBoY2lfZmxvd19zcGVjCQlSeF9GbG93X1NwZWM7Ci0JdTMyCQkJCVR4UGFja2V0Q291bnQ7Ci0JdTMyCQkJCUJlc3RFZmZvcnRGbHVzaFRpbWVvdXQ7Ci0KLQl1OAkJCQliTExDb21wbGV0ZUV2ZW50SXNTZXQ7Ci0KLQl1OAkJCQliTExDYW5jZWxDTURJc1NldGFuZENvbXBsZXRlOwotfTsKLQotc3RydWN0IGhjaV9waHlfbGlua19jbWRfZGF0YSB7Ci0JLyogUGh5c2ljYWxfTGlua19IYW5kbGUgKi8KLQl1OAkJCQlCdFBoeUxpbmtoYW5kbGU7Ci0KLQl1MTYJCQkJTGlua1N1cGVydmVyc2lvblRpbWVvdXQ7Ci0KLQkvKiB1MTYJCQkJU3VwZXJUaW1lT3V0Q250OyAqLwotCi0JLyogRGVkaWNhdGVkX0FNUF9LZXlfTGVuZ3RoICovCi0JdTgJCQkJQnRBTVBLZXlMZW47Ci0JLyogRGVkaWNhdGVkX0FNUF9LZXlfVHlwZSAqLwotCXU4CQkJCUJ0QU1QS2V5VHlwZTsKLQkvKiBEZWRpY2F0ZWRfQU1QX0tleSAqLwotCXU4CQkJCUJ0QU1QS2V5W1BNS19MRU5dOwotfTsKLQotc3RydWN0IGFtcF9hc3NvY19zdHJ1Y3R1cmUgewotCS8qIFRZUEUgSUQgKi8KLQl1OAkJCQlUeXBlSUQ7Ci0JLyogTGVuZ3RoICovCi0JdTE2CQkJCUxlbmd0aDsKLQkvKiBWYWx1ZSAqLwotCXU4CQkJCURhdGFbMV07Ci19OwotCi1zdHJ1Y3QgYW1wX3ByZWZfY2hubF9yZWd1bGF0b3J5IHsKLQl1OAkJCQlyZVhJZDsKLQl1OAkJCQlyZWd1bGF0b3J5Q2xhc3M7Ci0JdTgJCQkJY292ZXJhZ2VDbGFzczsKLX07Ci0KLXN0cnVjdCBhbXBfYXNzb2NfY21kX2RhdGEgewotCS8qIFBoeXNpY2FsX0xpbmtfSGFuZGxlICovCi0JdTgJCQkJQnRQaHlMaW5raGFuZGxlOwotCS8qIExlbmd0aF9Tb19GYXIgKi8KLQl1MTYJCQkJTGVuU29GYXI7Ci0KLQl1MTYJCQkJTWF4UmVtb3RlQVNTT0NMZW47Ci0JLyogQU1QX0FTU09DX1JlbWFpbmluZ19MZW5ndGggKi8KLQl1MTYJCQkJQU1QQXNzb2NSZW1MZW47Ci0JLyogQU1QX0FTU09DX2ZyYWdtZW50ICovCi0Jdm9pZAkJCQkqQU1QQXNzb2NmcmFnbWVudDsKLX07Ci0KLXN0cnVjdCBoY2lfbGlua19pbmZvIHsKLQl1MTYJCQkJQ29ubmVjdEhhbmRsZTsKLQl1OAkJCQlJbmNvbWluZ1RyYWZmaWNNb2RlOwotCXU4CQkJCU91dGdvaW5nVHJhZmZpY01vZGU7Ci0JdTgJCQkJQlRQcm9maWxlOwotCXU4CQkJCUJUQ29yZVNwZWM7Ci0JczgJCQkJQlRfUlNTSTsKLQl1OAkJCQlUcmFmZmljUHJvZmlsZTsKLQl1OAkJCQlsaW5rUm9sZTsKLX07Ci0KLXN0cnVjdCBoY2lfZXh0X2NvbmZpZyB7Ci0Jc3RydWN0IGhjaV9saW5rX2luZm8JCWxpbmtJbmZvW01BWF9CVF9BU09DX0VOVFJZX05VTV07Ci0JdTgJCQkJYnRPcGVyYXRpb25Db2RlOwotCXUxNgkJCQlDdXJyZW50Q29ubmVjdEhhbmRsZTsKLQl1OAkJCQlDdXJyZW50SW5jb21pbmdUcmFmZmljTW9kZTsKLQl1OAkJCQlDdXJyZW50T3V0Z29pbmdUcmFmZmljTW9kZTsKLQlzOAkJCQlNSU5fQlRfUlNTSTsKLQl1OAkJCQlOdW1iZXJPZkhhbmRsZTsKLQl1OAkJCQlOdW1iZXJPZlNDTzsKLQl1OAkJCQlDdXJyZW50QlRTdGF0dXM7Ci0JdTE2CQkJCUhDSUV4dGVuc2lvblZlcjsKLQotCS8qIEJ0IGNvZXhpc3QgcmVsYXRlZCAqLwotCXU4CQkJCWJ0UHJvZmlsZUNhc2U7Ci0JdTgJCQkJYnRQcm9maWxlQWN0aW9uOwotCXU4CQkJCWJNYW51YWxDb250cm9sOwotCXU4CQkJCWJCVEJ1c3k7Ci0JdTgJCQkJYkJUQTJEUEJ1c3k7Ci0JdTgJCQkJYkVuYWJsZVdpZmlTY2FuTm90aWZ5OwotCi0JdTgJCQkJYkhvbGRGb3JCdE9wZXJhdGlvbjsKLQl1MzIJCQkJYkhvbGRQZXJpb2RDbnQ7Ci19OwotCi1zdHJ1Y3QgaGNpX2FjbF9wYWNrZXRfZGF0YSB7Ci0JdTE2CQkJCUFDTERhdGFQYWNrZXRMZW47Ci0JdTgJCQkJU3luY0RhdGFQYWNrZXRMZW47Ci0JdTE2CQkJCVRvdGFsTnVtQUNMRGF0YVBhY2tldHM7Ci0JdTE2CQkJCVRvdGFsU3luY051bURhdGFQYWNrZXRzOwotfTsKLQotc3RydWN0IGhjaV9waHlfbGlua19ic3NfaW5mbyB7Ci0JdTE2CQkJCWJkQ2FwOwkvKiAgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAqLwotfTsKLQotc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgewotCXUxNgkJT0NGOjEwOwotCXUxNgkJT0dGOjY7Ci0JdTgJCUxlbmd0aDsKLQl1OAkJRGF0YVsyMF07Ci19OwotCi1zdHJ1Y3QgYnRfYXNvY19lbnRyeSB7Ci0JdTgJCQkJCQliVXNlZDsKLQl1OAkJCQkJCW1Bc3NvYzsKLQl1OAkJCQkJCWI0d2F5U3VjY2VzczsKLQl1OAkJCQkJCUJzc2lkWzZdOwotCXN0cnVjdCBoY2lfcGh5X2xpbmtfY21kX2RhdGEJCVBoeUxpbmtDbWREYXRhOwotCi0Jc3RydWN0IGhjaV9sb2dfbGlua19jbWRfZGF0YQkJTG9nTGlua0NtZERhdGFbTUFYX0xPR0lDQUxfTElOS19OVU1dOwotCi0Jc3RydWN0IGhjaV9hY2xfcGFja2V0X2RhdGEJCQlBQ0xQYWNrZXRzRGF0YTsKLQotCXN0cnVjdCBhbXBfYXNzb2NfY21kX2RhdGEJCUFtcEFzb2NDbWREYXRhOwotCXN0cnVjdCBvY3RldF9zdHJpbmcJCQkJQlRTc2lkOwotCXU4CQkJCQkJQlRTc2lkQnVmWzMzXTsKLQotCWVudW0gaGNpX3N0YXR1cwkJCQkJCVBoeUxpbmtEaXNjb25uZWN0UmVhc29uOwotCi0JdTgJCQkJCQliU2VuZFN1cGVydmlzaW9uUGFja2V0OwotCS8qIHU4CQkJCQkJQ3VycmVudFN1ZXJ2aXNpb25QYWNrZXRTZW5kTnVtOyAqLwotCS8qIHU4CQkJCQkJTGFzdFN1ZXJ2aXNpb25QYWNrZXRTZW5kTnVtOyAqLwotCXUzMgkJCQkJCU5vUnhQa3RDbnQ7Ci0JLyogSXMgQ3JlYXRvciBvciBKb2luZXIgKi8KLQllbnVtIGFtcF9idGFwX3R5cGUJCQkJQU1QUm9sZTsKLQotCS8qIEJUIGN1cnJlbnQgc3RhdGUgKi8KLQl1OAkJCQkJCUJ0Q3VycmVudFN0YXRlOwotCS8qIEJUIG5leHQgc3RhdGUgKi8KLQl1OAkJCQkJCUJ0TmV4dFN0YXRlOwotCi0JdTgJCQkJCQliTmVlZFBoeXNMaW5rQ29tcGxldGVFdmVudDsKLQotCWVudW0gaGNpX3N0YXR1cwkJCQkJUGh5c0xpbmtDb21wbGV0ZVN0YXR1czsKLQotCXU4CQkJCQkJQlRSZW1vdGVNQUNBZGRyWzZdOwotCi0JdTMyCQkJCQkJQlRDYXBhYmlsaXR5OwotCi0JdTgJCQkJCQlTeW5jRGF0YVBhY2tldExlbjsKLQotCXUxNgkJCQkJCVRvdGFsU3luY051bURhdGFQYWNrZXRzOwotCXUxNgkJCQkJCVRvdGFsTnVtQUNMRGF0YVBhY2tldHM7Ci0KLQl1OAkJCQkJCVNob3J0UmFuZ2VNb2RlOwotCi0JdTgJCQkJCQlQVEtbUFRLX0xFTl9US0lQXTsKLQl1OAkJCQkJCUdUS1tHVEtfTEVOXTsKLQl1OAkJCQkJCUFOb25jZVtLRVlfTk9OQ0VfTEVOXTsKLQl1OAkJCQkJCVNOb25jZVtLRVlfTk9OQ0VfTEVOXTsKLQl1NjQJCQkJCQlLZXlSZXBsYXlDb3VudGVyOwotCXU4CQkJCQkJV1BBQXV0aFJlcGxheUNvdW50OwotCXU4CQkJCQkJQUVTS2V5QnVmW0FFU0NDTVBfQkxLX1NJWkVfVE9UQUxdOwotCXU4CQkJCQkJUE1LW1BNS19MRU5dOwotCWVudW0gYnRfc3RhdGVfd3BhX2F1dGgJCQlCVFdQQUF1dGhTdGF0ZTsKLQlzMzIJCQkJCQlVbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQotCS8qICBBZGQgZm9yIEhXIHNlY3VyaXR5ICEhICovCi0JdTgJCQkJCQlId0NBTUluZGV4OyAgLyogIENhbSBpbmRleCAqLwotCXU4CQkJCQkJYlBlZXJRb3NTdGE7Ci0KLQl1MzIJCQkJCQlyeFN1dnBQa3RDbnQ7Ci19OwotCi1zdHJ1Y3QgYnRfdHJhZmZpY19zdGF0aXN0aWNzIHsKLQl1OAkJCQliVHhCdXN5VHJhZmZpYzsKLQl1OAkJCQliUnhCdXN5VHJhZmZpYzsKLQl1OAkJCQliSWRsZTsKLQl1MzIJCQkJVHhQa3RDbnRJblBlcmlvZDsKLQl1MzIJCQkJUnhQa3RDbnRJblBlcmlvZDsKLQl1NjQJCQkJVHhQa3RMZW5JblBlcmlvZDsKLQl1NjQJCQkJUnhQa3RMZW5JblBlcmlvZDsKLX07Ci0KLXN0cnVjdCBidF9tZ250IHsKLQl1OAkJCQliQlRDb25uZWN0SW5Qcm9ncmVzczsKLQl1OAkJCQliTG9nTGlua0luUHJvZ3Jlc3M7Ci0JdTgJCQkJYlBoeUxpbmtJblByb2dyZXNzOwotCXU4CQkJCWJQaHlMaW5rSW5Qcm9ncmVzc1N0YXJ0TEw7Ci0JdTgJCQkJQnRDdXJyZW50UGh5TGlua2hhbmRsZTsKLQl1MTYJCQkJQnRDdXJyZW50TG9nTGlua2hhbmRsZTsKLQl1OAkJCQlDdXJyZW50Q29ubmVjdEVudHJ5TnVtOwotCXU4CQkJCURpc2Nvbm5lY3RFbnRyeU51bTsKLQl1OAkJCQlDdXJyZW50QlRDb25uZWN0aW9uQ250OwotCWVudW0gYnRfY29ubmVjdF90eXBlCQlCVEN1cnJlbnRDb25uZWN0VHlwZTsKLQllbnVtIGJ0X2Nvbm5lY3RfdHlwZQkJQlRSZWNlaXZlQ29ubmVjdFBrdDsKLQl1OAkJCQlCVEF1dGhDb3VudDsKLQl1OAkJCQlCVEFzb2NDb3VudDsKLQl1OAkJCQliU3RhcnRTZW5kU3VwZXJ2aXNpb25Qa3Q7Ci0JdTgJCQkJQnRPcGVyYXRpb25PbjsKLQl1OAkJCQlCVE5lZWRBTVBTdGF0dXNDaGc7Ci0JdTgJCQkJSm9pbmVyTmVlZFNlbmRBdXRoOwotCXN0cnVjdCBoY2lfcGh5X2xpbmtfYnNzX2luZm8JYnNzRGVzYzsKLQlzdHJ1Y3QgaGNpX2V4dF9jb25maWcJCUV4dENvbmZpZzsKLQl1OAkJCQliTmVlZE5vdGlmeUFNUE5vQ2FwOwotCXU4CQkJCWJDcmVhdGVTcHBvcnRRb3M7Ci0JdTgJCQkJYlN1cHBvcnRQcm9maWxlOwotCXU4CQkJCUJUQ2hhbm5lbDsKLQl1OAkJCQlDaGVja0NobmxJc1N1aXQ7Ci0JdTgJCQkJYkJ0U2NhbjsKLQl1OAkJCQlidExvZ29UZXN0OwotfTsKLQotc3RydWN0IGJ0X2hjaV9kZ2JfaW5mbyB7Ci0JdTMyCQkJCWhjaUNtZENudDsKLQl1MzIJCQkJaGNpQ21kQ250VW5rbm93bjsKLQl1MzIJCQkJaGNpQ21kQ250Q3JlYXRlUGh5TGluazsKLQl1MzIJCQkJaGNpQ21kQ250QWNjZXB0UGh5TGluazsKLQl1MzIJCQkJaGNpQ21kQ250RGlzY29ubmVjdFBoeUxpbms7Ci0JdTMyCQkJCWhjaUNtZFBoeUxpbmtTdGF0dXM7Ci0JdTMyCQkJCWhjaUNtZENudENyZWF0ZUxvZ0xpbms7Ci0JdTMyCQkJCWhjaUNtZENudEFjY2VwdExvZ0xpbms7Ci0JdTMyCQkJCWhjaUNtZENudERpc2Nvbm5lY3RMb2dMaW5rOwotCXUzMgkJCQloY2lDbWRDbnRSZWFkTG9jYWxBbXBBc3NvYzsKLQl1MzIJCQkJaGNpQ21kQ250V3JpdGVSZW1vdGVBbXBBc3NvYzsKLQl1MzIJCQkJaGNpQ21kQ250U2V0QWNsTGlua1N0YXR1czsKLQl1MzIJCQkJaGNpQ21kQ250U2V0U2NvTGlua1N0YXR1czsKLQl1MzIJCQkJaGNpQ21kQ250RXh0ZW5zaW9uVmVyc2lvbk5vdGlmeTsKLQl1MzIJCQkJaGNpQ21kQ250TGlua1N0YXR1c05vdGlmeTsKLX07Ci0KLXN0cnVjdCBidF9pcnBfZGdiX2luZm8gewotCXUzMgkJCQlpcnBNSkNyZWF0ZTsKLQkvKiAgSW8gQ29udHJvbCAqLwotCXUzMgkJCQlpcnBJb0NvbnRyb2w7Ci0JdTMyCQkJCWlycElvQ3RybEhjaUNtZDsKLQl1MzIJCQkJaXJwSW9DdHJsSGNpRXZlbnQ7Ci0JdTMyCQkJCWlycElvQ3RybEhjaVR4RGF0YTsKLQl1MzIJCQkJaXJwSW9DdHJsSGNpUnhEYXRhOwotCXUzMgkJCQlpcnBJb0N0cmxVbmtub3duOwotCi0JdTMyCQkJCWlycElvQ3RybEhjaVR4RGF0YTFzOwotfTsKLQotc3RydWN0IGJ0X3BhY2tldF9kZ2JfaW5mbyB7Ci0JdTMyCQkJCWJ0UGt0VHhQcm9iUmVxOwotCXUzMgkJCQlidFBrdFJ4UHJvYlJlcTsKLQl1MzIJCQkJYnRQa3RSeFByb2JSZXFGYWlsOwotCXUzMgkJCQlidFBrdFR4UHJvYlJzcDsKLQl1MzIJCQkJYnRQa3RSeFByb2JSc3A7Ci0JdTMyCQkJCWJ0UGt0VHhBdXRoOwotCXUzMgkJCQlidFBrdFJ4QXV0aDsKLQl1MzIJCQkJYnRQa3RSeEF1dGhCdXREcm9wOwotCXUzMgkJCQlidFBrdFR4QXNzb2NSZXE7Ci0JdTMyCQkJCWJ0UGt0UnhBc3NvY1JlcTsKLQl1MzIJCQkJYnRQa3RSeEFzc29jUmVxQnV0RHJvcDsKLQl1MzIJCQkJYnRQa3RUeEFzc29jUnNwOwotCXUzMgkJCQlidFBrdFJ4QXNzb2NSc3A7Ci0JdTMyCQkJCWJ0UGt0VHhEaXNhc3NvYzsKLQl1MzIJCQkJYnRQa3RSeERpc2Fzc29jOwotCXUzMgkJCQlidFBrdFJ4RGVhdXRoOwotCXUzMgkJCQlidFBrdFR4NHdheTFzdDsKLQl1MzIJCQkJYnRQa3RSeDR3YXkxc3Q7Ci0JdTMyCQkJCWJ0UGt0VHg0d2F5Mm5kOwotCXUzMgkJCQlidFBrdFJ4NHdheTJuZDsKLQl1MzIJCQkJYnRQa3RUeDR3YXkzcmQ7Ci0JdTMyCQkJCWJ0UGt0Ung0d2F5M3JkOwotCXUzMgkJCQlidFBrdFR4NHdheTR0aDsKLQl1MzIJCQkJYnRQa3RSeDR3YXk0dGg7Ci0JdTMyCQkJCWJ0UGt0VHhMaW5rU3VwZXJSZXE7Ci0JdTMyCQkJCWJ0UGt0UnhMaW5rU3VwZXJSZXE7Ci0JdTMyCQkJCWJ0UGt0VHhMaW5rU3VwZXJSc3A7Ci0JdTMyCQkJCWJ0UGt0UnhMaW5rU3VwZXJSc3A7Ci0JdTMyCQkJCWJ0UGt0VHhEYXRhOwotCXUzMgkJCQlidFBrdFJ4RGF0YTsKLX07Ci0KLXN0cnVjdCBidF9kZ2IgewotCXU4CQkJCWRiZ0N0cmw7Ci0JdTMyCQkJCWRiZ1Byb2ZpbGU7Ci0Jc3RydWN0IGJ0X2hjaV9kZ2JfaW5mbwkJZGJnSGNpSW5mbzsKLQlzdHJ1Y3QgYnRfaXJwX2RnYl9pbmZvCQlkYmdJcnBJbmZvOwotCXN0cnVjdCBidF9wYWNrZXRfZGdiX2luZm8JZGJnQnRQa3Q7Ci19OwotCi1zdHJ1Y3QgYnRfaGNpX2luZm8gewotCS8qIDgwMi4xMSBQYWwgdmVyc2lvbiBzcGVjaWZpZXIgKi8KLQl1OAkJCQlCVFBhbFZlcnNpb247Ci0JdTE2CQkJCUJUUGFsQ29tcGFueUlEOwotCXUxNgkJCQlCVFBhbHN1YnZlcnNpb247Ci0KLQkvKiBDb25uZWN0ZWQgY2hhbm5lbCBsaXN0ICovCi0JdTE2CQkJCUJUQ29ubmVjdENobmxMaXN0TGVuOwotCXU4CQkJCUJUQ29ubmVjdENobmxsaXN0WzY0XTsKLQotCS8qIEZhaWwgY29udGFjdCBjb3VudGVyICovCi0JdTE2CQkJCUZhaWxDb250YWN0Q291bnQ7Ci0KLQkvKiBFdmVudCBtYXNrICovCi0JdTY0CQkJCUJURXZlbnRNYXNrOwotCXU2NAkJCQlCVEV2ZW50TWFza1BhZ2UyOwotCi0JLyogdGltZW91dCB2YXIgKi8KLQl1MTYJCQkJQ29ubkFjY2VwdFRpbWVvdXQ7Ci0JdTE2CQkJCUxvZ2ljYWxBY2NlcHRUaW1lb3V0OwotCXUxNgkJCQlQYWdlVGltZW91dDsKLQotCXU4CQkJCUxvY2F0aW9uRG9tYWluQXdhcmU7Ci0JdTE2CQkJCUxvY2F0aW9uRG9tYWluOwotCXU4CQkJCUxvY2F0aW9uRG9tYWluT3B0aW9uczsKLQl1OAkJCQlMb2NhdGlvbk9wdGlvbnM7Ci0KLQl1OAkJCQlGbG93Q29udHJvbE1vZGU7Ci0KLQkvKiBQcmVmZXJyZWQgY2hhbm5lbCBsaXN0ICovCi0JdTE2CQkJCUJ0UHJlQ2hubExpc3RMZW47Ci0JdTgJCQkJQlRQcmVDaG5sbGlzdFs2NF07Ci0KLQl1MTYJCQkJZW5GbHVzaF9MTEg7CS8qIGVuaGFuY2VkIGZsdXNoIGhhbmRsZSAqLwotCXUxNgkJCQlGTFRPX0xMSDsJCS8qIGVuaGFuY2VkIGZsdXNoIGhhbmRsZSAqLwotCi0JLyogICovCi0JLyogVGVzdCBjb21tYW5kIG9ubHkuICovCi0JdTgJCQkJYkluVGVzdE1vZGU7Ci0JdTgJCQkJYlRlc3RJc0VuZDsKLQl1OAkJCQliVGVzdE5lZWRSZXBvcnQ7Ci0JdTgJCQkJVGVzdFNjZW5hcmlvOwotCXU4CQkJCVRlc3RSZXBvcnRJbnRlcnZhbDsKLQl1OAkJCQlUZXN0Q3RyVHlwZTsKLQl1MzIJCQkJVGVzdEV2ZW50VHlwZTsKLQl1MTYJCQkJVGVzdE51bU9mRnJhbWU7Ci0JdTE2CQkJCVRlc3ROdW1PZkVyckZyYW1lOwotCXUxNgkJCQlUZXN0TnVtT2ZCaXRzOwotCXUxNgkJCQlUZXN0TnVtT2ZFcnJCaXRzOwotCS8qICAqLwotfTsKLQotc3RydWN0IGJ0X3RyYWZmaWMgewotCS8qICBBZGQgZm9yIGNoZWNrIHJlcGxheSBkYXRhICovCi0JdTgJCQkJCUxhc3RSeFVuaUZyYWdOdW07Ci0JdTE2CQkJCQlMYXN0UnhVbmlTZXFOdW07Ci0KLQkvKiBzMzIJCQkJCUVudHJ5TWF4VW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7ICovCi0JLyogczMyCQkJCQlFbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOyAqLwotCi0Jc3RydWN0IGJ0X3RyYWZmaWNfc3RhdGlzdGljcwkJQnQzMFRyYWZmaWNTdGF0aXN0aWNzOwotfTsKLQotI2RlZmluZSBSVF9XT1JLX0lURU0gc3RydWN0IHdvcmtfc3RydWN0Ci0KLXN0cnVjdCBidF9zZWN1cml0eSB7Ci0JLyogIFdQQSBhdXRoIHN0YXRlCi0JICogIE1heSBuZWVkIHRvIHJlbW92ZSB0byBCVFNlY0luZm8gLi4uIAotCSAqIGVudW0gYnRfc3RhdGVfd3BhX2F1dGggQlRXUEFBdXRoU3RhdGU7Ci0JICovCi0Jc3RydWN0IG9jdGV0X3N0cmluZwlSU05JRTsKLQl1OAkJCVJTTklFQnVmW01BWFJTTklFTEVOXTsKLQl1OAkJCWJSZWdOb0VuY3J5cHQ7Ci0JdTgJCQliVXNlZEh3RW5jcnlwdDsKLX07Ci0KLXN0cnVjdCBidF8zMGluZm8gewotCXN0cnVjdCBydHdfYWRhcHRlcgkqcGFkYXB0ZXI7Ci0Jc3RydWN0IGJ0X2Fzb2NfZW50cnkJCUJ0QXNvY0VudHJ5W01BWF9CVF9BU09DX0VOVFJZX05VTV07Ci0Jc3RydWN0IGJ0X21nbnQJCQkJQnRNZ250OwotCXN0cnVjdCBidF9kZ2IJCQkJQnREYmc7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvCQkJQnRIY2lJbmZvOwotCXN0cnVjdCBidF90cmFmZmljCQkJQnRUcmFmZmljOwotCXN0cnVjdCBidF9zZWN1cml0eQkJCUJ0U2VjOwotCVJUX1dPUktfSVRFTQkJSENJQ21kV29ya0l0ZW07Ci0Jc3RydWN0IHRpbWVyX2xpc3QgQlRIQ0lDbWRUaW1lcjsKLQlSVF9XT1JLX0lURU0JCUJUUHNEaXNhYmxlV29ya0l0ZW07Ci0JUlRfV09SS19JVEVNCQlCVENvbm5lY3RXb3JrSXRlbTsKLQlzdHJ1Y3QgdGltZXJfbGlzdCBCVEhDSURpc2NhcmRBY2xEYXRhVGltZXI7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgQlRIQ0lKb2luVGltZW91dFRpbWVyOwotCXN0cnVjdCB0aW1lcl9saXN0IEJUVGVzdFNlbmRQYWNrZXRUaW1lcjsKLQlzdHJ1Y3QgdGltZXJfbGlzdCBCVERpc2Nvbm5lY3RQaHlMaW5rVGltZXI7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgQlRCZWFjb25UaW1lcjsKLQl1OAkJCQlCVEJlYWNvblRtck9uOwotCi0Jc3RydWN0IHRpbWVyX2xpc3QgQlRQc0Rpc2FibGVUaW1lcjsKLQotCXZvaWQgKgkJCQlwQnRDaG5sTGlzdDsKLX07Ci0KLXN0cnVjdCBwYWNrZXRfaXJwX2FjbF9kYXRhIHsKLQl1MTYJCUhhbmRsZToxMjsKLQl1MTYJCVBCX0ZsYWc6MjsKLQl1MTYJCUJDX0ZsYWc6MjsKLQl1MTYJCUxlbmd0aDsKLQl1OAkJRGF0YVsxXTsKLX07Ci0KLXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgewotCXU4CQlFdmVudENvZGU7Ci0JdTgJCUxlbmd0aDsKLQl1OAkJRGF0YVsyMF07Ci19OwotCi1zdHJ1Y3QgY29tbW9uX3RyaXBsZSB7Ci0JdTggYnl0ZV8xc3Q7Ci0JdTggYnl0ZV8ybmQ7Ci0JdTggYnl0ZV8zcmQ7Ci19OwotCi0jZGVmaW5lIENPVU5UUllfU1RSX0xFTgkJMwkvKiAgY291bnRyeSBzdHJpbmcgbGVuID0gMyAqLwotCi0jZGVmaW5lIExPQ0FMX1BNSwkwCi0KLWVudW0gaGNpX3dpZmlfY29ubmVjdF9zdGF0dXMgewotCUhDSV9XSUZJX05PVF9DT05ORUNURUQJCQk9IDB4MCwKLQlIQ0lfV0lGSV9DT05ORUNURUQJCQk9IDB4MSwKLQlIQ0lfV0lGSV9DT05ORUNUX0lOX1BST0dSRVNTCQk9IDB4MiwKLX07Ci0KLWVudW0gaGNpX2V4dF9icF9vcGVyYXRpb24gewotCUhDSV9CVF9PUF9OT05FCQkJCT0gMHgwLAotCUhDSV9CVF9PUF9JTlFVSVJZX1NUQVJUCQkJPSAweDEsCi0JSENJX0JUX09QX0lOUVVJUllfRklOSVNICQk9IDB4MiwKLQlIQ0lfQlRfT1BfUEFHSU5HX1NUQVJUCQkJPSAweDMsCi0JSENJX0JUX09QX1BBR0lOR19TVUNDRVNTCQk9IDB4NCwKLQlIQ0lfQlRfT1BfUEFHSU5HX1VOU1VDQ0VTUwkJPSAweDUsCi0JSENJX0JUX09QX1BBSVJJTkdfU1RBUlQJCQk9IDB4NiwKLQlIQ0lfQlRfT1BfUEFJUklOR19GSU5JU0gJCT0gMHg3LAotCUhDSV9CVF9PUF9CVF9ERVZfRU5BQkxFCQkJPSAweDgsCi0JSENJX0JUX09QX0JUX0RFVl9ESVNBQkxFCQk9IDB4OSwKLQlIQ0lfQlRfT1BfTUFYCi19OwotCi0jZGVmaW5lIEJUSENJX1NNX1dJVEhfSU5GTyhfQWRhcHRlciwgX1N0YXRlVG9FbnRlciwgX1N0YXRlQ21kLCBfRW50cnlOdW0pCVwKLXsJCQkJCQkJCQkJXAotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJbQlQgc3RhdGUgY2hhbmdlXSBjYXVzZWQgYnkgIiIlcyIiLCBsaW5lID0lZFxuIiwgX19mdW5jX18sIF9fTElORV9fKSk7CQkJCQkJCVwKLQlCVEhDSV9TdGF0ZU1hY2hpbmUoX0FkYXB0ZXIsIF9TdGF0ZVRvRW50ZXIsIF9TdGF0ZUNtZCwgX0VudHJ5TnVtKTtcCi19Ci0KLXZvaWQgQlRIQ0lfRXZlbnRQYXJzZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB2b2lkICpwRXZudERhdGEsCi0JCSAgICAgIHUzMiBkYXRhTGVuKTsKLSNkZWZpbmUgQlRfRXZlbnRQYXJzZSBCVEhDSV9FdmVudFBhcnNlCi11OCBCVEhDSV9Ic0Nvbm5lY3Rpb25Fc3RhYmxpc2hlZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRIQ0lfVXBkYXRlQlRQcm9maWxlUlRLVG9Nb3RvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVEhDSV9XaWZpU2Nhbk5vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzY2FuVHlwZSk7Ci12b2lkIEJUSENJX1N0YXRlTWFjaGluZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBTdGF0ZVRvRW50ZXIsCi0JCQllbnVtIGhjaV9zdGF0ZV93aXRoX2NtZCBTdGF0ZUNtZCwgdTggRW50cnlOdW0pOwotdm9pZCBCVEhDSV9EaXNjb25uZWN0UGVlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbnRyeU51bSk7Ci12b2lkIEJUSENJX0V2ZW50TnVtT2ZDb21wbGV0ZWREYXRhQmxvY2tzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVEhDSV9FdmVudEFNUFN0YXR1c0NoYW5nZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBBTVBfU3RhdHVzKTsKLXZvaWQgQlRIQ0lfRGlzY29ubmVjdEFsbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWVudW0gaGNpX3N0YXR1cyBCVEhDSV9IYW5kbGVIQ0lDTUQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICBzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCk7Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgQ09NTU9OL2J0X2hjaS5oID09PT09ICovCi0KLS8qICA9PT09PSBCZWxvdyB0aGlzIGxpbmUgaXMgc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGM4NzIzMUFudC5oID09PT09ICovCi0jZGVmaW5lIEdFVF9CVF9JTkZPKHBhZGFwdGVyKQkoJkdFVF9IQUxfREFUQShwYWRhcHRlciktPkJ0SW5mbykKLQotI2RlZmluZQlCVENfRk9SX1NDQU5fU1RBUlQJCQkJMQotI2RlZmluZQlCVENfRk9SX1NDQU5fRklOSVNICQkJCTAKLQotI2RlZmluZQlCVF9UWFJYX0NOVF9USFJFU18xCQkJCTEyMDAKLSNkZWZpbmUJQlRfVFhSWF9DTlRfVEhSRVNfMgkJCQkxNDAwCi0jZGVmaW5lCUJUX1RYUlhfQ05UX1RIUkVTXzMJCQkJMzAwMAotI2RlZmluZQlCVF9UWFJYX0NOVF9MRVZFTF8wCQkJCTAJLyogIDwgMTIwMCAqLwotI2RlZmluZQlCVF9UWFJYX0NOVF9MRVZFTF8xCQkJCTEJLyogID49IDEyMDAgJiYgPCAxNDAwICovCi0jZGVmaW5lCUJUX1RYUlhfQ05UX0xFVkVMXzIJCQkJMgkvKiAgPj0gMTQwMCAqLwotI2RlZmluZQlCVF9UWFJYX0NOVF9MRVZFTF8zCQkJCTMJLyogID49IDMwMDAgKi8KLQotZW51bSBidF9zdGF0ZV8xYW50IHsKLQlCVF9JTkZPX1NUQVRFX0RJU0FCTEVECQkJPSAwLAotCUJUX0lORk9fU1RBVEVfTk9fQ09OTkVDVElPTgkJPSAxLAotCUJUX0lORk9fU1RBVEVfQ09OTkVDVF9JRExFCQk9IDIsCi0JQlRfSU5GT19TVEFURV9JTlFfT1JfUEFHCQk9IDMsCi0JQlRfSU5GT19TVEFURV9BQ0xfT05MWV9CVVNZCQk9IDQsCi0JQlRfSU5GT19TVEFURV9TQ09fT05MWV9CVVNZCQk9IDUsCi0JQlRfSU5GT19TVEFURV9BQ0xfU0NPX0JVU1kJCT0gNiwKLQlCVF9JTkZPX1NUQVRFX0FDTF9JTlFfT1JfUEFHCQk9IDcsCi0JQlRfSU5GT19TVEFURV9NQVgJCQk9IDgKLX07Ci0KLXN0cnVjdCBidGRtXzg3MjNhXzFhbnQgewotCXU4CQlwcmVQc1RkbWE7Ci0JdTgJCWN1clBzVGRtYTsKLQl1OAkJcHNUZG1hRHVBZGpUeXBlOwotCXU4CQliUHJlUHNUZG1hT247Ci0JdTgJCWJDdXJQc1RkbWFPbjsKLQl1OAkJcHJlV2lmaVBhcmE7Ci0JdTgJCWN1cldpZmlQYXJhOwotCXU4CQlwcmVDb2V4V2lmaUNvbjsKLQl1OAkJY3VyQ29leFdpZmlDb247Ci0JdTgJCXdpZmlSc3NpVGhyZXNoOwotCi0JdTMyCQlwc1RkbWFNb25pdG9yQ250OwotCXUzMgkJcHNUZG1hR2xvYmFsQ250OwotCi0JLyogRHVyYXRpb25BZGp1c3QgRm9yIFNDTyAqLwotCXUzMgkJcHNUZG1hTW9uaXRvckNudEZvclNDTzsKLQl1OAkJcHNUZG1hRHVBZGpUeXBlRm9yU0NPOwotCXU4CQlSU1NJX1dpRmlfTGFzdDsKLQl1OAkJUlNTSV9CVF9MYXN0OwotCi0JdTgJCWJXaUZpSGFsdDsKLQl1OAkJYlJBQ2hhbmdlZDsKLX07Ci0KLXZvaWQgQlRETV8xQW50U2lnbmFsQ29tcGVuc2F0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJIHU4ICpyc3NpX3dpZmksIHU4ICpyc3NpX2J0KTsKLXZvaWQgQlRETV8xQW50Rm9yRGhjcChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV8xQW50QnRDb2V4aXN0ODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGM4NzIzMUFudC5oID09PT09ICovCi0KLS8qICA9PT09PSBCZWxvdyB0aGlzIGxpbmUgaXMgc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGM4NzIzMkFudC5oID09PT09ICovCi1lbnVtIGJ0XzJhbnRfYnRfc3RhdHVzIHsKLQlCVF8yQU5UX0JUX1NUQVRVU19JRExFCQkJPSAweDAsCi0JQlRfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUJPSAweDEsCi0JQlRfMkFOVF9CVF9TVEFUVVNfTk9OX0lETEUJCT0gMHgyLAotCUJUXzJBTlRfQlRfU1RBVFVTX01BWAotfTsKLQotZW51bSBidF8yYW50X2NvZXhfYWxnbyB7Ci0JQlRfMkFOVF9DT0VYX0FMR09fVU5ERUZJTkVECQkJPSAweDAsCi0JQlRfMkFOVF9DT0VYX0FMR09fU0NPCQkJCT0gMHgxLAotCUJUXzJBTlRfQ09FWF9BTEdPX0hJRAkJCQk9IDB4MiwKLQlCVF8yQU5UX0NPRVhfQUxHT19BMkRQCQkJCT0gMHgzLAotCUJUXzJBTlRfQ09FWF9BTEdPX1BBTkVEUgkJCT0gMHg0LAotCUJUXzJBTlRfQ09FWF9BTEdPX1BBTkhTCQkJCT0gMHg1LAotCUJUXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9BMkRQCQk9IDB4NiwKLQlCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElECQk9IDB4NywKLQlCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFIJPSAweDgsCi0JQlRfMkFOVF9DT0VYX0FMR09fSElEX0EyRFAJCQk9IDB4OSwKLQlCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5IUwk9IDB4QSwKLQlCVF8yQU5UX0NPRVhfQUxHT19NQVgJCQkJPSAweEIsCi19OwotCi1zdHJ1Y3QgYnRkbV84NzIzYV8yYW50IHsKLQl1OAliUHJlRGVjQnRQd3I7Ci0JdTgJYkN1ckRlY0J0UHdyOwotCi0JdTgJcHJlV2xhbkFjdEhpOwotCXU4CWN1cldsYW5BY3RIaTsKLQl1OAlwcmVXbGFuQWN0TG87Ci0JdTgJY3VyV2xhbkFjdExvOwotCi0JdTgJcHJlRndEYWNTd2luZ0x2bDsKLQl1OAljdXJGd0RhY1N3aW5nTHZsOwotCi0JdTgJYlByZVJmUnhMcGZTaHJpbms7Ci0JdTgJYkN1clJmUnhMcGZTaHJpbms7Ci0KLQl1OAliUHJlTG93UGVuYWx0eVJhOwotCXU4CWJDdXJMb3dQZW5hbHR5UmE7Ci0KLQl1OAlwcmVCdFJldHJ5SW5kZXg7Ci0JdTgJY3VyQnRSZXRyeUluZGV4OwotCi0JdTgJYlByZURhY1N3aW5nT247Ci0JdTMyCXByZURhY1N3aW5nTHZsOwotCXU4CWJDdXJEYWNTd2luZ09uOwotCXUzMgljdXJEYWNTd2luZ0x2bDsKLQotCXU4CWJQcmVBZGNCYWNrT2ZmOwotCXU4CWJDdXJBZGNCYWNrT2ZmOwotCi0JdTgJYlByZUFnY1RhYmxlRW47Ci0JdTgJYkN1ckFnY1RhYmxlRW47Ci0KLQl1MzIJcHJlVmFsMHg2YzA7Ci0JdTMyCWN1clZhbDB4NmMwOwotCXUzMglwcmVWYWwweDZjODsKLQl1MzIJY3VyVmFsMHg2Yzg7Ci0JdTgJcHJlVmFsMHg2Y2M7Ci0JdTgJY3VyVmFsMHg2Y2M7Ci0KLQl1OAliQ3VySWdub3JlV2xhbkFjdDsKLQl1OAliUHJlSWdub3JlV2xhbkFjdDsKLQotCXU4CXByZVBzVGRtYTsKLQl1OAljdXJQc1RkbWE7Ci0JdTgJcHNUZG1hRHVBZGpUeXBlOwotCXU4CWJQcmVQc1RkbWFPbjsKLQl1OAliQ3VyUHNUZG1hT247Ci0KLQl1OAlwcmVBbGdvcml0aG07Ci0JdTgJY3VyQWxnb3JpdGhtOwotCXU4CWJSZXNldFRkbWFBZGp1c3Q7Ci0KLQl1OAlidFN0YXR1czsKLX07Ci0KLXZvaWQgQlRETV8yQW50QnRDb2V4aXN0ODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0vKiAgPT09PT0gRW5kIG9mIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjODcyMzJBbnQuaCA9PT09PSAqLwotCi0vKiAgPT09PT0gQmVsb3cgdGhpcyBsaW5lIGlzIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjODcyMy5oID09PT09ICovCi0KLSNkZWZpbmUJQlRfUV9QS1RfT0ZGCQkwCi0jZGVmaW5lCUJUX1FfUEtUX09OCQkxCi0KLSNkZWZpbmUJQlRfVFhfUFdSX09GRgkJMAotI2RlZmluZQlCVF9UWF9QV1JfT04JCTEKLQotLyogIFRETUEgbW9kZSBkZWZpbml0aW9uICovCi0jZGVmaW5lCVRETUFfMkFOVAkJCTAKLSNkZWZpbmUJVERNQV8xQU5UCQkJMQotI2RlZmluZQlURE1BX05BVl9PRkYJCTAKLSNkZWZpbmUJVERNQV9OQVZfT04JCTEKLSNkZWZpbmUJVERNQV9EQUNfU1dJTkdfT0ZGCTAKLSNkZWZpbmUJVERNQV9EQUNfU1dJTkdfT04JMQotCi0jZGVmaW5lCUJUX1JTU0lfTEVWRUxfSAkwCi0jZGVmaW5lCUJUX1JTU0lfTEVWRUxfTQkxCi0jZGVmaW5lCUJUX1JTU0lfTEVWRUxfTAkyCi0KLS8qICBQVEEgbW9kZSByZWxhdGVkIGRlZmluaXRpb24gKi8KLSNkZWZpbmUJQlRfUFRBX01PREVfT0ZGCQkwCi0jZGVmaW5lCUJUX1BUQV9NT0RFX09OCQkxCi0KLS8qICBQZW5hbHR5IFR4IFJhdGUgQWRhcHRpdmUgKi8KLSNkZWZpbmUJQlRfVFhfUkFURV9BREFQVElWRV9OT1JNQUwJCQkwCi0jZGVmaW5lCUJUX1RYX1JBVEVfQURBUFRJVkVfTE9XX1BFTkFMVFkJMQotCi0vKiAgUkYgQ29ybmVyICovCi0jZGVmaW5lCUJUX1JGX1JYX0xQRl9DT1JORVJfUkVTVU1FCQkJMAotI2RlZmluZQlCVF9SRl9SWF9MUEZfQ09STkVSX1NIUklOSwkJCTEKLQotI2RlZmluZSBCVF9JTkZPX0FDTAkJCUJJVCgwKQotI2RlZmluZSBCVF9JTkZPX1NDTwkJCUJJVCgxKQotI2RlZmluZSBCVF9JTkZPX0lOUV9QQUcJCUJJVCgyKQotI2RlZmluZSBCVF9JTkZPX0FDTF9CVVNZCUJJVCgzKQotI2RlZmluZSBCVF9JTkZPX1NDT19CVVNZCUJJVCg0KQotI2RlZmluZSBCVF9JTkZPX0hJRAkJCUJJVCg1KQotI2RlZmluZSBCVF9JTkZPX0EyRFAJCUJJVCg2KQotI2RlZmluZSBCVF9JTkZPX0ZUUAkJCUJJVCg3KQotCi0KLQotc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EgewotCXUzMgkJCQkJaGlnaFByaW9yaXR5VHg7Ci0JdTMyCQkJCQloaWdoUHJpb3JpdHlSeDsKLQl1MzIJCQkJCWxvd1ByaW9yaXR5VHg7Ci0JdTMyCQkJCQlsb3dQcmlvcml0eVJ4OwotCXU4CQkJCQlidFJzc2k7Ci0JdTgJCQkJCVRvdGFsQW50TnVtOwotCXU4CQkJCQliQzJoQnRJbmZvU3VwcG9ydDsKLQl1OAkJCQkJYzJoQnRJbmZvOwotCXU4CQkJCQljMmhCdEluZm9PcmlnaW5hbDsKLQl1OAkJCQkJcHJlYzJoQnRJbmZvOyAvKiAgZm9yIDFBbnQgKi8KLQl1OAkJCQkJYkMyaEJ0SW5xdWlyeVBhZ2U7Ci0JdW5zaWduZWQgbG9uZwkJCQlidElucVBhZ2VTdGFydFRpbWU7IC8qICBmb3IgMkFudCAqLwotCXU4CQkJCQljMmhCdFByb2ZpbGU7IC8qICBmb3IgMUFudCAqLwotCXU4CQkJCQlidFJldHJ5Q250OwotCXU4CQkJCQlidEluZm9FeHQ7Ci0JdTgJCQkJCWJDMmhCdEluZm9SZXFTZW50OwotCXU4CQkJCQliRm9yY2VGd0J0SW5mbzsKLQl1OAkJCQkJYkZvcmNlQTJkcFNpbms7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudAkJCWJ0ZG0yQW50OwotCXN0cnVjdCBidGRtXzg3MjNhXzFhbnQJCQlidGRtMUFudDsKLX07Ci0KLXZvaWQgQlRETV9TZXRGd0NobmxJbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQllbnVtIHJ0X21lZGlhX3N0YXR1cyBtc3RhdHVzKTsKLXU4IEJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVERNX1NldEZ3M2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYnl0ZTEsIHU4IGJ5dGUyLCB1OCBieXRlMywKLQkJICB1OCBieXRlNCwgdTggYnl0ZTUpOwotdm9pZCBCVERNX1F1ZXJ5QnRJbmZvcm1hdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9TZXRTd1JmUnhMcGZDb3JuZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdHlwZSk7Ci12b2lkIEJURE1fU2V0U3dQZW5hbHR5VHhSYXRlQWRhcHRpdmUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggcmFUeXBlKTsKLXZvaWQgQlRETV9TZXRGd0RlY0J0UHdyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJEZWNCdFB3cik7Ci11OCBCVERNX0J0UHJvZmlsZVN1cHBvcnQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIEJURE1fTHBzTGVhdmUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGM4NzIzLmggPT09PT0gKi8KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Y0NzcjFBbnQuaCA9PT09PSAqLwotCi1lbnVtIEJUX0EyRFBfSU5ERVh7Ci0JQlRfQTJEUF9JTkRFWDAJCT0gMCwJCQkvKiAgMzIsIDEyOyB0aGUgbW9zdCBjcml0aWNhbCBmb3IgQlQgKi8KLQlCVF9BMkRQX0lOREVYMSwJCQkJCS8qICAxMiwgMjQgKi8KLQlCVF9BMkRQX0lOREVYMiwJCQkJCS8qICAwLCAwICovCi0JQlRfQTJEUF9JTkRFWF9NQVgKLX07Ci0KLSNkZWZpbmUgQlRfQTJEUF9TVEFURV9OT1RfRU5URVJFRAkJMAotI2RlZmluZSBCVF9BMkRQX1NUQVRFX0RFVEVDVElORwkJMQotI2RlZmluZSBCVF9BMkRQX1NUQVRFX0RFVEVDVEVECQkJMgotCi0jZGVmaW5lIEJURE1fQU5UX0JUX0lETEUJCQkJMAotI2RlZmluZSBCVERNX0FOVF9XSUZJCQkJCQkxCi0jZGVmaW5lIEJURE1fQU5UX0JUCQkJCQkJMgotCi0KLXZvaWQgQlRETV9TaW5nbGVBbnQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYlNpbmdsZUFudE9uLAotCQkgICAgdTggYkludGVycnVwdE9uLCB1OCBiTXVsdGlOQVZPbik7Ci12b2lkIEJURE1fQ2hlY2tCVElkbGVDaGFuZ2UxQW50KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0vKiAgPT09PT0gRW5kIG9mIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjQ3NyMUFudC5oID09PT09ICovCi0KLS8qICA9PT09PSBCZWxvdyB0aGlzIGxpbmUgaXMgc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGNDc3IyQW50LmggPT09PT0gKi8KLQotLyogICovCi0vKiAgRm9yIG9sZCBjb3JlIHN0YWNrIGJlZm9yZSB2MjUxICovCi0vKiAgKi8KLSNkZWZpbmUgQlRfUlNTSV9TVEFURV9OT1JNQUxfUE9XRVIJQklUKDApCi0jZGVmaW5lIEJUX1JTU0lfU1RBVEVfQU1EUFVfT0ZGCQlCSVQoMSkKLSNkZWZpbmUgQlRfUlNTSV9TVEFURV9TUEVDSUFMX0xPVwlCSVQoMikKLSNkZWZpbmUgQlRfUlNTSV9TVEFURV9CR19FRENBX0xPVwlCSVQoMykKLSNkZWZpbmUgQlRfUlNTSV9TVEFURV9UWFBPV0VSX0xPVwlCSVQoNCkKLQotI2RlZmluZQlCVF9EQUNTV0lOR19PRkYJCQkJMAotI2RlZmluZQlCVF9EQUNTV0lOR19NNAkJCQkxCi0jZGVmaW5lCUJUX0RBQ1NXSU5HX003CQkJCTIKLSNkZWZpbmUJQlRfREFDU1dJTkdfTTEwCQkJCTMKLQotdm9pZCBCVERNX0RpbWluaXNoV2lGaShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4IGJEQUNPbiwgdTggYkludGVycnVwdE9uLAotCQkgICAgICAgdTggREFDU3dpbmdMZXZlbCwgdTggYk5BVk9uKTsKLQotLyogID09PT09IEVuZCBvZiBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Y0NzcjJBbnQuaCA9PT09PSAqLwotCi0vKiAgSEVBREVSL1R5cGVEZWYuaCAqLwotI2RlZmluZSBNQVhfRldfU1VQUE9SVF9NQUNJRF9OVU0JCQk2NAotCi0vKiAgPT09PT0gQmVsb3cgdGhpcyBsaW5lIGlzIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRDb2V4aXN0LmggPT09PT0gKi8KLQotI2RlZmluZQlGV19WRVJfQlRfUkVHCQkJNjIKLSNkZWZpbmUJRldfVkVSX0JUX1JFRzEJCTc0Ci0jZGVmaW5lCVJFR19CVF9BQ1RJVkUJCQkweDQ0NAotI2RlZmluZQlSRUdfQlRfU1RBVEUJCQkweDQ0OAotI2RlZmluZQlSRUdfQlRfUE9MTElORzEJCTB4NDRjCi0jZGVmaW5lCVJFR19CVF9QT0xMSU5HCQkJMHg3MDAKLQotI2RlZmluZQlSRUdfQlRfQUNUSVZFX09MRAkJMHg0ODgKLSNkZWZpbmUJUkVHX0JUX1NUQVRFX09MRAkJMHg0OGMKLSNkZWZpbmUJUkVHX0JUX1BPTExJTkdfT0xECTB4NDkwCi0KLS8qICBUaGUgcmVnIGRlZmluZSBpcyBmb3IgODcyMyAqLwotI2RlZmluZQlSRUdfSElHSF9QUklPUklUWV9UWFJYCQkJMHg3NzAKLSNkZWZpbmUJUkVHX0xPV19QUklPUklUWV9UWFJYCQkJMHg3NzQKLQotI2RlZmluZSBCVF9GV19DT0VYX1RIUkVTSF9UT0wJCQk2Ci0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzIwCQkJCTIwCi0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzIzCQkJCTIzCi0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzI1CQkJCTI1Ci0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzMwCQkJCTMwCi0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzM1CQkJCTM1Ci0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzQwCQkJCTQwCi0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzQ1CQkJCTQ1Ci0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzQ3CQkJCTQ3Ci0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzUwCQkJCTUwCi0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzU1CQkJCTU1Ci0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzY1CQkJCTY1Ci0KLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVDMwCQkJQklUKDApCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9IVDIwCQkJQklUKDEpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9IVDQwCQkJQklUKDIpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9MRUdBQ1kJCUJJVCgzKQotCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0xPVwkJQklUKDQpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX01FRElVTQkJQklUKDUpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0hJR0gJCUJJVCg2KQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX0RFQ19CVF9QT1dFUgkJQklUKDcpCi0KLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX0lETEUJCQlCSVQoOCkKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX1VQTElOSwkJQklUKDkpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9ET1dOTElOSwkJQklUKDEwKQotCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfSU5RX1BBR0UJCUJJVCgxMSkKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVF9JRExFCQkJQklUKDEyKQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX0JUX1VQTElOSwkJCUJJVCgxMykKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVF9ET1dOTElOSwkJQklUKDE0KQotLyogICovCi0vKiAgVG9kbzogUmVtb3ZlIHRoZXNlIGRlZmluaXRpb25zICovCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfUEFOX0lETEUJCUJJVCgxNSkKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVF9QQU5fVVBMSU5LCQlCSVQoMTYpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfUEFOX0RPV05MSU5LCQlCSVQoMTcpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfQTJEUF9JRExFCQlCSVQoMTgpCi0vKiAgKi8KLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVF9SU1NJX0xPVwkJQklUKDE5KQotCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfUFJPRklMRV9ISUQJCUJJVCgyMCkKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9QUk9GSUxFX0EyRFAJCUJJVCgyMSkKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9QUk9GSUxFX1BBTgkJQklUKDIyKQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX1BST0ZJTEVfU0NPCQlCSVQoMjMpCi0KLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9MT1cJCUJJVCgyNCkKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9NRURJVU0JQklUKDI1KQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0hJR0gJCUJJVCgyNikKLQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fTE9XCUJJVCgyNykKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX01FRElVTQlCSVQoMjgpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9ISUdICUJJVCgyOSkKLQotCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRJTkZPX0NPTU1PTgkJQklUKDMwKQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX0JUSU5GT19CX0hJRF9TQ09FU0NPCUJJVCgzMSkKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVElORk9fQl9GVFBfQTJEUAkJQklUKDMyKQotCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfQ05UX0xFVkVMXzAJCUJJVCgzMykKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVF9DTlRfTEVWRUxfMQkJQklUKDM0KQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX0JUX0NOVF9MRVZFTF8yCQlCSVQoMzUpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfQ05UX0xFVkVMXzMJCUJJVCgzNikKLQotI2RlZmluZSBCVF9SU1NJX1NUQVRFX0hJR0gJCQkwCi0jZGVmaW5lIEJUX1JTU0lfU1RBVEVfTUVESVVNCQkJMQotI2RlZmluZSBCVF9SU1NJX1NUQVRFX0xPVwkJCTIKLSNkZWZpbmUgQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gJCQkzCi0jZGVmaW5lIEJUX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0JCTQKLSNkZWZpbmUgQlRfUlNTSV9TVEFURV9TVEFZX0xPVwkJCTUKLQotI2RlZmluZQlCVF9BR0NUQUJMRV9PRkYJCQkJMAotI2RlZmluZQlCVF9BR0NUQUJMRV9PTgkJCQkxCi0KLSNkZWZpbmUJQlRfQkJfQkFDS09GRl9PRkYJCQkwCi0jZGVmaW5lCUJUX0JCX0JBQ0tPRkZfT04JCQkxCi0KLSNkZWZpbmUJQlRfRldfTkFWX09GRgkJCQkwCi0jZGVmaW5lCUJUX0ZXX05BVl9PTgkJCQkxCi0KLSNkZWZpbmUJQlRfQ09FWF9NRUNIX05PTkUJCQkwCi0jZGVmaW5lCUJUX0NPRVhfTUVDSF9TQ08JCQkxCi0jZGVmaW5lCUJUX0NPRVhfTUVDSF9ISUQJCQkyCi0jZGVmaW5lCUJUX0NPRVhfTUVDSF9BMkRQCQkJMwotI2RlZmluZQlCVF9DT0VYX01FQ0hfUEFOCQkJNAotI2RlZmluZQlCVF9DT0VYX01FQ0hfSElEX0EyRFAJCQk1Ci0jZGVmaW5lCUJUX0NPRVhfTUVDSF9ISURfUEFOCQkJNgotI2RlZmluZQlCVF9DT0VYX01FQ0hfUEFOX0EyRFAJCQk3Ci0jZGVmaW5lCUJUX0NPRVhfTUVDSF9ISURfU0NPX0VTQ08JCTgKLSNkZWZpbmUJQlRfQ09FWF9NRUNIX0ZUUF9BMkRQCQkJOQotI2RlZmluZQlCVF9DT0VYX01FQ0hfQ09NTU9OCQkJMTAKLSNkZWZpbmUJQlRfQ09FWF9NRUNIX01BWAkJCTExCi0vKglCVCBEYmcgQ3RybCAqLwotI2RlZmluZQlCVF9EQkdfUFJPRklMRV9OT05FCQkJMAotI2RlZmluZQlCVF9EQkdfUFJPRklMRV9TQ08JCQkxCi0jZGVmaW5lCUJUX0RCR19QUk9GSUxFX0hJRAkJCTIKLSNkZWZpbmUJQlRfREJHX1BST0ZJTEVfQTJEUAkJCTMKLSNkZWZpbmUJQlRfREJHX1BST0ZJTEVfUEFOCQkJNAotI2RlZmluZQlCVF9EQkdfUFJPRklMRV9ISURfQTJEUAkJCTUKLSNkZWZpbmUJQlRfREJHX1BST0ZJTEVfSElEX1BBTgkJCTYKLSNkZWZpbmUJQlRfREJHX1BST0ZJTEVfUEFOX0EyRFAJCQk3Ci0jZGVmaW5lCUJUX0RCR19QUk9GSUxFX01BWAkJCTkKLQotc3RydWN0IGJ0X2NvZXhpc3Rfc3RyIHsKLQl1OAkJCUJsdWV0b290aENvZXhpc3Q7Ci0JdTgJCQlCVF9BbnRfTnVtOwotCXU4CQkJQlRfQ29leGlzdFR5cGU7Ci0JdTgJCQlCVF9BbnRfaXNvbGF0aW9uOwkvKiAwOmdvb2QsIDE6YmFkICovCi0JdTgJCQlidF9yYWRpb3NoYXJlZHR5cGU7Ci0JdTMyCQkJUmF0aW9fVHg7Ci0JdTMyCQkJUmF0aW9fUFJJOwotCXU4CQkJYkluaXRsaXplZDsKLQl1MzIJCQlCdFJmUmVnT3JpZ2luMUU7Ci0JdTMyCQkJQnRSZlJlZ09yaWdpbjFGOwotCXU4CQkJYkJUQnVzeVRyYWZmaWM7Ci0JdTgJCQliQlRUcmFmZmljTW9kZVNldDsKLQl1OAkJCWJCVE5vblRyYWZmaWNNb2RlU2V0OwotCXN0cnVjdCBidF90cmFmZmljX3N0YXRpc3RpY3MJCUJUMjFUcmFmZmljU3RhdGlzdGljczsKLQl1NjQJCQlDdXJyZW50U3RhdGU7Ci0JdTY0CQkJUHJldmlvdXNTdGF0ZTsKLQl1OAkJCXByZVJzc2lTdGF0ZTsKLQl1OAkJCXByZVJzc2lTdGF0ZTE7Ci0JdTgJCQlwcmVSc3NpU3RhdGVCZWFjb247Ci0JdTgJCQliRldDb2V4aXN0QWxsT2ZmOwotCXU4CQkJYlNXQ29leGlzdEFsbE9mZjsKLQl1OAkJCWJIV0NvZXhpc3RBbGxPZmY7Ci0JdTgJCQliQmFsYW5jZU9uOwotCXU4CQkJYlNpbmdsZUFudE9uOwotCXU4CQkJYkludGVycnVwdE9uOwotCXU4CQkJYk11bHRpTkFWT247Ci0JdTgJCQlQcmVXTEFOQWN0SDsKLQl1OAkJCVByZVdMQU5BY3RMOwotCXU4CQkJV0xBTkFjdEg7Ci0JdTgJCQlXTEFOQWN0TDsKLQl1OAkJCUEyRFBTdGF0ZTsKLQl1OAkJCUFudGVubmFTdGF0ZTsKLQl1MzIJCQlsYXN0QnRFZGNhOwotCXUxNgkJCWxhc3RfYWdncl9udW07Ci0JdTgJCQliRURDQUluaXRpYWxpemVkOwotCXU4CQkJZXhlY19jbnQ7Ci0JdTgJCQliODcyM2FBZ2NUYWJsZU9uOwotCXU4CQkJYjkyREFnY1RhYmxlT247Ci0Jc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EJaGFsQ29leDg3MjM7Ci0JdTgJCQlidEFjdGl2ZVplcm9DbnQ7Ci0JdTgJCQliQ3VyQnREaXNhYmxlZDsKLQl1OAkJCWJQcmVCdERpc2FibGVkOwotCXU4CQkJYk5lZWRUb1JvYW1Gb3JCdERpc2FibGVFbmFibGU7Ci0JdTgJCQlmdzNhVmFsWzVdOwotfTsKLQotdm9pZCBCVERNX0NoZWNrQW50U2VsTW9kZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9Gd0MyaEJ0UnNzaShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqdG1wQnVmKTsKLSNkZWZpbmUgQlRfRndDMmhCdFJzc2kgQlRETV9Gd0MyaEJ0UnNzaQotdm9pZCBCVERNX0Rpc3BsYXlCdENvZXhJbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotI2RlZmluZSBCVF9EaXNwbGF5QnRDb2V4SW5mbyBCVERNX0Rpc3BsYXlCdENvZXhJbmZvCi12b2lkIEJURE1fUmVqZWN0QVBBZ2dyZWdhdGVkUGFja2V0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJSZWplY3QpOwotdTggQlRETV9Jc0hUNDAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0xlZ2FjeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9DaGVja1dpRmlTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXMzMiBCVERNX0dldFJ4U1Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0NoZWNrQ29leEJjblJzc2lTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBsZXZlbE51bSwKLQkJCSAgICAgIHU4IFJzc2lUaHJlc2gsIHU4IFJzc2lUaHJlc2gxKTsKLXU4IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlMShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBsZXZlbE51bSwKLQkJCSAgICB1OCBSc3NpVGhyZXNoLCB1OCBSc3NpVGhyZXNoMSk7Ci11OCBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBsZXZlbE51bSwKLQkJCSAgIHU4IFJzc2lUaHJlc2gsIHU4IFJzc2lUaHJlc2gxKTsKLXZvaWQgQlRETV9CYWxhbmNlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJCYWxhbmNlT24sIHU4IG1zMCwgdTggbXMxKTsKLXZvaWQgQlRETV9BR0NUYWJsZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0eXBlKTsKLXZvaWQgQlRETV9CQkJhY2tPZmZMZXZlbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0eXBlKTsKLXZvaWQgQlRETV9GV0NvZXhBbGxPZmYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIEJURE1fU1dDb2V4QWxsT2ZmKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVERNX0hXQ29leEFsbE9mZihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9Db2V4QWxsT2ZmKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVERNX1R1cm5PZmZCdENvZXhpc3RCZWZvcmVFbnRlcklQUyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9TaWduYWxDb21wZW5zYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnJzc2lfd2lmaSwKLQkJCSAgICAgdTggKnJzc2lfYnQpOwotdm9pZCBCVERNX1VwZGF0ZUNvZXhTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXU4IEJURE1fSXNTYW1lQ29leGlzdFN0YXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVERNX1BXREJNb25pdG9yKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9Jc0JUQnVzeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLSNkZWZpbmUgQlRfSXNCdEJ1c3kgQlRETV9Jc0JUQnVzeQotdTggQlRETV9Jc1dpZmlCdXN5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9Jc0NvZXhpc3RTdGF0ZUNoYW5nZWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0lzV2lmaVVwbGluayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXU4IEJURE1fSXNXaWZpRG93bmxpbmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0lzQlRIU01vZGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0lzQlRVcGxpbmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0lzQlREb3dubGluayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9BZGp1c3RGb3JCdE9wZXJhdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9Gb3JIYWx0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVERNX1dpZmlTY2FuTm90aWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHNjYW5UeXBlKTsKLXZvaWQgQlRETV9XaWZpQXNzb2NpYXRlTm90aWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGFjdGlvbik7Ci12b2lkIEJURE1fTWVkaWFTdGF0dXNOb3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICBlbnVtIHJ0X21lZGlhX3N0YXR1cyBtc3RhdHVzKTsKLXZvaWQgQlRETV9Gb3JEaGNwKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVERNX1Jlc2V0QWN0aW9uUHJvZmlsZVN0YXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVERNX1NldEJ0Q29leEN1cnJBbnROdW0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYW50TnVtKTsKLSNkZWZpbmUgQlRfU2V0QnRDb2V4Q3VyckFudE51bSBCVERNX1NldEJ0Q29leEN1cnJBbnROdW0KLXU4IEJURE1fSXNBY3Rpb25TQ08oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0lzQWN0aW9uSElEKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9Jc0FjdGlvbkEyRFAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0lzQWN0aW9uUEFOKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9Jc0FjdGlvbkhJREEyRFAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0lzQWN0aW9uSElEUEFOKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9Jc0FjdGlvblBBTkEyRFAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11MzIgQlRETV9CdFR4UnhDb3VudGVySChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXUzMiBCVERNX0J0VHhSeENvdW50ZXJMKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0vKiAgPT09PT0gRW5kIG9mIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRDb2V4aXN0LmggPT09PT0gKi8KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvSGFsQlQuaCA9PT09PSAqLwotCi0jZGVmaW5lIFJUU19DVFNfTk9fTEVOX0xJTUlUCTAKLQotdTggSEFMQlRfR2V0UEdBbnROdW0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0jZGVmaW5lIEJUX0dldFBHQW50TnVtIEhBTEJUX0dldFBHQW50TnVtCi12b2lkIEhBTEJUX1NldEtleShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbnRyeU51bSk7Ci12b2lkIEhBTEJUX1JlbW92ZUtleShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbnRyeU51bSk7Ci11OCBIQUxCVF9Jc0JURXhpc3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0jZGVmaW5lIEJUX0lzQnRFeGlzdCBIQUxCVF9Jc0JURXhpc3QKLXU4IEhBTEJUX0JUQ2hpcFR5cGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIEhBTEJUX1NldFJ0c0N0c05vTGVuTGltaXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0hhbEJULmMgPT09PT0gKi8KLQotI2RlZmluZSBfYnRfZGJnX29mZl8JCTAKLSNkZWZpbmUgX2J0X2RiZ19vbl8JCTEKLQotZXh0ZXJuIHUzMiBCVENvZXhEYmdMZXZlbDsKLQotCi0KLSNlbmRpZiAvKiAgX19SVEw4NzIzQV9CVF9DT0VYSVNUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX2J0X2ludGYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9idF9pbnRmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MzM1NTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX2J0X2ludGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodChjKSAyMDE0LCBKZXMgU29yZW5zZW4gPEplcy5Tb3JlbnNlbkByZWRoYXQuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fUlRMODcyM0FfQlRfSU5URl9IX18KLSNkZWZpbmUgX19SVEw4NzIzQV9CVF9JTlRGX0hfXwotCi0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLWVudW0gcnRfbWVkaWFfc3RhdHVzOwotYm9vbCBydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1ib29sIHJ0bDg3MjNhX0JUX2VuYWJsZWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1ib29sIHJ0bDg3MjNhX0JUX2NvZXhpc3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX0JUX2RvX2NvZXhpc3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX0JUX3dpZmlzY2FuX25vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzY2FuVHlwZSk7Ci12b2lkIHJ0bDg3MjNhX0JUX21lZGlhc3RhdHVzX25vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICBlbnVtIHJ0X21lZGlhX3N0YXR1cyBtc3RhdHVzKTsKLXZvaWQgcnRsODcyM2FfQlRfc3BlY2lhbHBhY2tldF9ub3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX0JUX2xwc19sZWF2ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2FfQlRfZGlzYWJsZV9jb2V4aXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotYm9vbCBydGw4NzIzYV9CVF9kaXNhYmxlX0VEQ0FfdHVyYm8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX2R1YWxfYW50ZW5uYV9kZXRlY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX0JUX2luaXRfaHdjb25maWcoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX0JUX3dpZmlhc3NvY2lhdGVfbm90aWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGFjdGlvbik7Ci12b2lkIHJ0bDg3MjNhX0JUX2luaXRfaGFsX3ZhcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX2Z3X2MyaF9CVF9pbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICp0bXBCdWYsIHU4IGxlbmd0aCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBib29sIHJ0bDg3MjNhX0JUX3VzaW5nX2FudGVubmFfMShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXJldHVybiBmYWxzZTsKLX0KLXN0YXRpYyBpbmxpbmUgYm9vbCBydGw4NzIzYV9CVF9lbmFibGVkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQotc3RhdGljIGlubGluZSBib29sIHJ0bDg3MjNhX0JUX2NvZXhpc3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0jZGVmaW5lIHJ0bDg3MjNhX0JUX2RvX2NvZXhpc3QocGFkYXB0ZXIpCQkJZG8ge30gd2hpbGUoMCkKLSNkZWZpbmUgcnRsODcyM2FfQlRfd2lmaXNjYW5fbm90aWZ5KHBhZGFwdGVyLCBzY2FuVHlwZSkJCWRvIHt9IHdoaWxlKDApCi0jZGVmaW5lIHJ0bDg3MjNhX0JUX21lZGlhc3RhdHVzX25vdGlmeShwYWRhcHRlciwgbXN0YXR1cykJZG8ge30gd2hpbGUoMCkKLSNkZWZpbmUgcnRsODcyM2FfQlRfc3BlY2lhbHBhY2tldF9ub3RpZnkocGFkYXB0ZXIpCQlkbyB7fSB3aGlsZSgwKQotI2RlZmluZSBydGw4NzIzYV9CVF9scHNfbGVhdmUocGFkYXB0ZXIpCQkJCWRvIHt9IHdoaWxlKDApCi0jZGVmaW5lIHJ0bDg3MjNhX0JUX2Rpc2FibGVfY29leGlzdChwYWRhcHRlcikJCQlkbyB7fSB3aGlsZSgwKQotc3RhdGljIGlubGluZSBib29sIHJ0bDg3MjNhX0JUX2Rpc2FibGVfRURDQV90dXJibyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXJldHVybiBmYWxzZTsKLX0KLSNkZWZpbmUgcnRsODcyM2FfZHVhbF9hbnRlbm5hX2RldGVjdGlvbihwYWRhcHRlcikJCWRvIHt9IHdoaWxlKDApCi0jZGVmaW5lIHJ0bDg3MjNhX0JUX2luaXRfaHdjb25maWcocGFkYXB0ZXIpCQkJZG8ge30gd2hpbGUoMCkKLSNkZWZpbmUgcnRsODcyM2FfQlRfd2lmaWFzc29jaWF0ZV9ub3RpZnkocGFkYXB0ZXIsIGFjdGlvbikJZG8ge30gd2hpbGUoMCkKLSNkZWZpbmUgcnRsODcyM2FfQlRfaW5pdF9oYWxfdmFycyhwYWRhcHRlcikJCQlkbyB7fSB3aGlsZSgwKQotI2RlZmluZSBydGw4NzIzYV9md19jMmhfQlRfaW5mbyhwYWRhcHRlciwgdG1wQnVmLCBsZW5ndGgpCWRvIHt9IHdoaWxlKDApCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfY21kLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfY21kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NTUzNWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX2NtZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUTDg3MjNBX0NNRF9IX18KLSNkZWZpbmUgX19SVEw4NzIzQV9DTURfSF9fCi0KLQotI2RlZmluZSBIMkNfQlRfRldfUEFUQ0hfTEVOCQkzCi0jZGVmaW5lIEgyQ19CVF9QV1JfRk9SQ0VfTEVOCQkzCi0KLWVudW0gY21kX21zZ19lbGVtZW50X2lkCi17Ci0JTk9ORV9DTURNU0dfRUlELAotCUFQX09GRkxPQURfRUlEID0gMCwKLQlTRVRfUFdSTU9ERV9FSUQgPSAxLAotCUpPSU5CU1NfUlBUX0VJRCA9IDIsCi0JUlNWRF9QQUdFX0VJRCA9IDMsCi0JUlNTSV80X0VJRCA9IDQsCi0JUlNTSV9TRVRUSU5HX0VJRCA9IDUsCi0JTUFDSURfQ09ORklHX0VJRCA9IDYsCi0JTUFDSURfUFNfTU9ERV9FSUQgPSA3LAotCVAyUF9QU19PRkZMT0FEX0VJRCA9IDgsCi0JU0VMRUNUSVZFX1NVU1BFTkRfUk9GX0NNRCA9IDksCi0JQlRfUVVFVUVfUEtUX0VJRCA9IDE3LAotCUJUX0FOVF9URE1BX0VJRCA9IDIwLAotCUJUXzJBTlRfSElEX0VJRCA9IDIxLAotCVAyUF9QU19DVFdfQ01EX0VJRCA9IDMyLAotCUZPUkNFX0JUX1RYX1BXUl9FSUQgPSAzMywKLQlTRVRfVERNQV9XTEFOX0FDVF9USU1FX0VJRCA9IDM0LAotCVNFVF9CVF9UWF9SRVRSWV9JTkRFWF9FSUQgPSAzNSwKLQlISURfUFJPRklMRV9FTkFCTEVfRUlEID0gMzYsCi0JQlRfSUdOT1JFX1dMQU5fQUNUX0VJRCA9IDM3LAotCUJUX1BUQV9NQU5BR0VSX1VQREFURV9FTkFCTEVfRUlEID0gMzgsCi0JREFDX1NXSU5HX1ZBTFVFX0VJRCA9IDQxLAotCVRSQURJVElPTkFMX1RETUFfRU5fRUlEID0gNTEsCi0JSDJDX0JUX0ZXX1BBVENIID0gNTQsCi0JQl9UWVBFX1RETUFfRUlEID0gNTgsCi0JU0NBTl9FTl9FSUQgPSA1OSwKLQlMT1dQV1JfTFBTX0VJRCA9IDcxLAotCUgyQ19SRVNFVF9UU0YgPSA3NSwKLQlNQVhfQ01ETVNHX0VJRAotfTsKLQotc3RydWN0IGNtZF9tc2dfcGFybSB7Ci0JdTggZWlkOyAvKiBlbGVtZW50IGlkICovCi0JdTggc3o7IC8qICBzeiAqLwotCXU4IGJ1Zls2XTsKLX07Ci0KLXN0cnVjdCBzZXRwd3Jtb2RlX3Bhcm0gewotCXU4IE1vZGU7Ci0JdTggU21hcnRQUzsKLQl1OCBBd2FrZUludGVydmFsOwkvKiAgdW5pdDogYmVhY29uIGludGVydmFsICovCi0JdTggYkFsbFF1ZXVlVUFQU0Q7Ci0KLSNkZWZpbmUgU0VUUE1fTE9XUlhCQ04JCQlCSVQoMCkKLSNkZWZpbmUgU0VUUE1fQVVUT0FOVFNXSVRDSAkJQklUKDEpCi0jZGVmaW5lIFNFVFBNX1BTQUxMT1dCVEhJR0hQUkkJQklUKDIpCi0JdTggQmNuQW50TW9kZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBIMkNfU1NfUkZPRkZfUEFSQU17Ci0JdTggUk9GT247IC8qICAxOiBvbiwgMDpvZmYgKi8KLQl1MTYgZ3Bpb19wZXJpb2Q7IC8qICB1bml0OiAxMDI0IHVzICovCi19X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0KLXN0cnVjdCBqb2luYnNzcnB0X3Bhcm0gewotCXU4IE9wTW9kZTsJLyogIGVudW0gcnRfbWVkaWFfc3RhdHVzICovCi19OwotCi1zdHJ1Y3QgcnN2ZHBhZ2VfbG9jIHsKLQl1OCBMb2NQcm9iZVJzcDsKLQl1OCBMb2NQc1BvbGw7Ci0JdTggTG9jTnVsbERhdGE7Ci0JdTggTG9jUW9zTnVsbDsKLQl1OCBMb2NCVFFvc051bGw7Ci19OwotCi1zdHJ1Y3QgUDJQX1BTX09mZmxvYWRfdCB7Ci0JdTggT2ZmbG9hZF9FbjoxOwotCXU4IHJvbGU6MTsgLyogIDE6IE93bmVyLCAwOiBDbGllbnQgKi8KLQl1OCBDVFdpbmRvd19FbjoxOwotCXU4IE5vQTBfRW46MTsKLQl1OCBOb0ExX0VuOjE7Ci0JdTggQWxsU3RhU2xlZXA6MTsgLyogIE9ubHkgdmFsaWQgaW4gT3duZXIgKi8KLQl1OCBkaXNjb3Zlcnk6MTsKLQl1OCByc3ZkOjE7Ci19OwotCi1zdHJ1Y3QgUDJQX1BTX0NUV1BlcmlvZF90IHsKLQl1OCBDVFdQZXJpb2Q7CS8qIFRVICovCi19OwotCi0jZGVmaW5lIEJfVERNQV9FTgkJCUJJVCgwKQotI2RlZmluZSBCX1RETUFfRklYQU5USU5CVAkJQklUKDEpCi0jZGVmaW5lIEJfVERNQV9UWFBTUE9MTAkJCUJJVCgyKQotI2RlZmluZSBCX1RETUFfVkFMODcwCQkJQklUKDMpCi0jZGVmaW5lIEJfVERNQV9BVVRPV0FLRVVQCQlCSVQoNCkKLSNkZWZpbmUgQl9URE1BX05PUFMJCQlCSVQoNSkKLSNkZWZpbmUgQl9URE1BX1dMQU5ISUdIUFJJCQlCSVQoNikKLQotc3RydWN0IGJfdHlwZV90ZG1hX3Bhcm0gewotCXU4IG9wdGlvbjsKLQotCXU4IFRCVFRPblBlcmlvZDsKLQl1OCBNZWRQZXJpb2Q7Ci0JdTggcnN2ZDMwOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHNjYW5fZW5fcGFybSB7Ci0JdTggRW47Ci19IF9fcGFja2VkOwotCi0vKiAgQlRfUFdSICovCi0jZGVmaW5lIFNFVF9IMkNDTURfQlRfUFdSX0lEWChfX3BIMkNDbWQsIF9fVmFsdWUpCQkJCQkJCVNFVF9CSVRTX1RPX0xFXzFCWVRFXzhCSVQoX19wSDJDQ21kLCAwLCA4LCBfX1ZhbHVlKQotCi0vKiAgQlRfRldfUEFUQ0ggKi8KLSNkZWZpbmUgU0VUX0gyQ0NNRF9CVF9GV19QQVRDSF9FTkFCTEUoX19wSDJDQ21kLCBfX1ZhbHVlKQkJCQkJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wSDJDQ21kLCAwLCA4LCBfX1ZhbHVlKSAvKglTRVRfQklUU19UT19MRV8xQllURShfX3BIMkNDbWQsIDAsIDgsIF9fVmFsdWUpICovCi0jZGVmaW5lIFNFVF9IMkNDTURfQlRfRldfUEFUQ0hfU0laRShfX3BIMkNDbWQsIF9fVmFsdWUpCQkJCQkJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wSDJDQ21kLCA4LCAxNiwgX19WYWx1ZSkgLyoJU0VUX0JJVFNfVE9fTEVfMkJZVEUoKF9fcEgyQ0NtZCkrMSwgMCwgMTYsIF9fVmFsdWUpICovCi0KLXN0cnVjdCBsb3dwd3JfbHBzX3Bhcm17Ci0JdTggYmNuX2NvdW50OjQ7Ci0JdTggdGJfYmNuX3RocmVzaG9sZDozOwotCXU4IGVuYWJsZToxOwotCXU4IGJjbl9pbnRlcnZhbDsKLQl1OCBkcm9wX3RocmVzaG9sZDsKLQl1OCBtYXhfZWFybHlfcGVyaW9kOwotCXU4IG1heF9iY25fdGltZW91dF9wZXJpb2Q7Ci19IF9fcGFja2VkOwotCi0KLS8qICBob3N0IG1lc3NhZ2UgdG8gZmlybXdhcmUgY21kICovCi12b2lkIHJ0bDg3MjNhX3NldF9Gd1B3ck1vZGVfY21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IE1vZGUpOwotdm9pZCBydGw4NzIzYV9zZXRfRndKb2luQnNzUmVwb3J0X2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBtc3RhdHVzKTsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLXZvaWQgcnRsODcyM2Ffc2V0X0JUQ29leF9BUF9tb2RlX0Z3UnN2ZFBrdF9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0jZWxzZQotI2RlZmluZSBydGw4NzIzYV9zZXRfQlRDb2V4X0FQX21vZGVfRndSc3ZkUGt0X2NtZChwYWRhcHRlcikgZG8ge30gd2hpbGUoMCkKLSNlbmRpZgotaW50IHJ0bDg3MjNhX3NldF9yc3NpX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgcGFyYW0pOwotaW50IHJ0bDg3MjNhX3NldF9yYWlkX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgbWFzaywgdTggYXJnKTsKLXZvaWQgcnRsODcyM2FfYWRkX3JhdGVhdGlkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBiaXRtYXAsIHU4IGFyZywgdTggcnNzaV9sZXZlbCk7Ci0KLWludCBGaWxsSDJDQ21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IEVsZW1lbnRJRCwgdTMyIENtZExlbiwgdTggKnBDbWRCdWZmZXIpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9kbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX2RtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjM2ZTguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX2RtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fUlRMODcyM0FfRE1fSF9fCi0jZGVmaW5lIF9fUlRMODcyM0FfRE1fSF9fCi0vKiAgKi8KLS8qICBEZXNjcmlwdGlvbjogKi8KLS8qICAqLwotLyogIFRoaXMgZmlsZSBpcyBmb3IgODcyM0EgZHluYW1pYyBtZWNoYW5pc20gb25seSAqLwotLyogICovCi0vKiAgKi8KLS8qICAqLwotI2RlZmluZSBEWU5BTUlDX0ZVTkNfQlQgQklUKDApCi0KLWVudW17Ci0JVVBfTElOSywKLQlET1dOX0xJTkssCi19OwotLyogICovCi0vKiAgc3RydWN0dXJlIGFuZCBkZWZpbmUgKi8KLS8qICAqLwotCi0vKiAgZHVwbGljYXRlIGNvZGUsd2lsbCBtb3ZlIHRvIE9ETSAjIyMjIyMjIyMgKi8KLSNkZWZpbmUgSVFLX01BQ19SRUdfTlVNCQk0Ci0jZGVmaW5lIElRS19BRERBX1JFR19OVU0JCTE2Ci0jZGVmaW5lIElRS19CQl9SRUdfTlVNCQkJOQotI2RlZmluZSBIUF9USEVSTUFMX05VTQkJOAotLyogIGR1cGxpY2F0ZSBjb2RlLHdpbGwgbW92ZSB0byBPRE0gIyMjIyMjIyMjICovCi1zdHJ1Y3QgZG1fcHJpdiB7Ci0JdTMyCUluaXRPRE1GbGFnOwotCi0JLyogIFVwcGVyIGFuZCBMb3dlciBTaWduYWwgdGhyZXNob2xkIGZvciBSYXRlIEFkYXB0aXZlKi8KLQlpbnQJVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0JaW50CVVuZGVjb3JhdGVkU21vb3RoZWRDQ0s7Ci0JaW50CUVudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0JaW50CUVudHJ5TWF4VW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0JaW50CU1pblVuZGVjb3JhdGVkUFdEQkZvckRNOwotCWludAlMYXN0TWluVW5kZWNvcmF0ZWRQV0RCRm9yRE07Ci0KLQlzMzIJVW5kZWNvcmF0ZWRTbW9vdGhlZEJlYWNvbjsKLQkjaWZkZWYgQ09ORklHXzg3MjNBVV9CVF9DT0VYSVNUCi0JczMyIEJUX0VudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0JczMyIEJUX0VudHJ5TWF4VW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0JI2VuZGlmCi0KLQkvKiBmb3IgSGlnaCBQb3dlciAqLwotCXU4IER5bmFtaWNUeEhpZ2hQb3dlckx2bDsvKiBBZGQgYnkgSmFja2VuIFR4IFBvd2VyIENvbnRyb2wgZm9yIE5lYXIvRmFyIFJhbmdlIDIwMDgvMDMvMDYgKi8KLQotCS8qIGZvciB0eCBwb3dlciB0cmFja2luZyAqLwotCXU4CWJUWFBvd2VyVHJhY2tpbmc7Ci0JdTgJVFhQb3dlcmNvdW50OwotCXU4CWJUWFBvd2VyVHJhY2tpbmdJbml0OwotCXU4CVR4UG93ZXJUcmFja0NvbnRyb2w7CS8qIGZvciBtcCBtb2RlLCB0dXJuIG9mZiB0eHB3cnRyYWNraW5nIGFzIGRlZmF1bHQgKi8KLQl1OAlUTV9UcmlnZ2VyOwotCi0JdTgJVGhlcm1hbE1ldGVyWzJdOwkJCQkvKiAgVGhlcm1hbE1ldGVyLCBpbmRleCAwIGZvciBSRklDMCwgYW5kIDEgZm9yIFJGSUMxICovCi0JdTgJVGhlcm1hbFZhbHVlOwotCXU4CVRoZXJtYWxWYWx1ZV9MQ0s7Ci0JdTgJVGhlcm1hbFZhbHVlX0lRSzsKLQl1OAlUaGVybWFsVmFsdWVfRFBLOwotCi0JdTgJYlJmUGlFbmFibGU7Ci0KLQkvKiBmb3IgQVBLICovCi0JdTMyCUFQS291dHB1dFsyXVsyXTsJLyogcGF0aCBBL0I7IG91dHB1dDFfMWEvb3V0cHV0MV8yYSAqLwotCXU4CWJBUEtkb25lOwotCXU4CWJBUEtUaGVybWFsTWV0ZXJJZ25vcmU7Ci0JdTgJYkRQZG9uZTsKLQl1OAliRFBQYXRoQU9LOwotCXU4CWJEUFBhdGhCT0s7Ci0KLQkvKiBmb3IgSVFLICovCi0JdTMyCVJlZ0MwNDsKLQl1MzIJUmVnODc0OwotCXUzMglSZWdDMDg7Ci0JdTMyCVJlZ0I2ODsKLQl1MzIJUmVnQjZDOwotCXUzMglSZWc4NzA7Ci0JdTMyCVJlZzg2MDsKLQl1MzIJUmVnODY0OwotCXUzMglBRERBX2JhY2t1cFtJUUtfQUREQV9SRUdfTlVNXTsKLQl1MzIJSVFLX01BQ19iYWNrdXBbSVFLX01BQ19SRUdfTlVNXTsKLQl1MzIJSVFLX0JCX2JhY2t1cF9yZWNvdmVyWzldOwotCXUzMglJUUtfQkJfYmFja3VwW0lRS19CQl9SRUdfTlVNXTsKLQl1OAlQb3dlckluZGV4X2JhY2t1cFs2XTsKLQotCXU4CWJDQ0tpbkNIMTQ7Ci0KLQl1OAlDQ0tfaW5kZXg7Ci0JdTgJT0ZETV9pbmRleFsyXTsKLQotCXU4CWJEb25lVHhwb3dlcjsKLQl1OAlDQ0tfaW5kZXhfSFA7Ci0JdTgJT0ZETV9pbmRleF9IUFsyXTsKLQl1OAlUaGVybWFsVmFsdWVfSFBbSFBfVEhFUk1BTF9OVU1dOwotCXU4CVRoZXJtYWxWYWx1ZV9IUF9pbmRleDsKLQotCS8qIGZvciBUeFB3clRyYWNraW5nICovCi0JczMyCVJlZ0U5NDsKLQlzMzIgICAgIFJlZ0U5QzsKLQlzMzIJUmVnRUI0OwotCXMzMglSZWdFQkM7Ci0KLQl1MzIJVFhQb3dlclRyYWNraW5nQ2FsbGJhY2tDbnQ7CS8qIGNvc2EgYWRkIGZvciBkZWJ1ZyAqLwotCi0JdTMyCXBydl90cmFmZmljX2lkeDsgLyogIGVkY2EgdHVyYm8gKi8KLQotCXMzMglPRkRNX1BrdF9DbnQ7Ci0JdTgJUlNTSV9TZWxlY3Q7Ci0vKgl1OAlESUdfRHluYW1pY19NSU4gOyAqLwotLyogIGR1cGxpY2F0ZSBjb2RlLHdpbGwgbW92ZSB0byBPRE0gIyMjIyMjIyMjICovCi0JLyogIEFkZCBmb3IgUmVhZGluZyBJbml0aWFsIERhdGEgUmF0ZSBTRUwgUmVnaXN0ZXIgMHg0ODQgZHVyaW5nIHdhdGNoZG9nLiBVc2luZyBmb3IgZmlsbCB0eCBkZXNjLiAyMDExLjMuMjEgYnkgVGhvbWFzICovCi0JdTgJSU5JREFUQV9SQVRFWzMyXTsKLX07Ci0KLQotLyogICovCi0vKiAgZnVuY3Rpb24gcHJvdG90eXBlICovCi0vKiAgKi8KLQotdm9pZCBydGw4NzIzYV9pbml0X2RtX3ByaXYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcnRsODcyM2FfSW5pdEhhbERtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9IYWxEbVdhdGNoRG9nKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9oYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9oYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdhMGZkNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfaGFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fUlRMODcyM0FfSEFMX0hfXwotI2RlZmluZSBfX1JUTDg3MjNBX0hBTF9IX18KLQotI2luY2x1ZGUgInJ0bDg3MjNhX3NwZWMuaCIKLSNpbmNsdWRlICJydGw4NzIzYV9wZy5oIgotI2luY2x1ZGUgIkhhbDg3MjNBUGh5UmVnLmgiCi0jaW5jbHVkZSAiSGFsODcyM0FQaHlDZmcuaCIKLSNpbmNsdWRlICJydGw4NzIzYV9yZi5oIgotI2luY2x1ZGUgInJ0bDg3MjNhX2J0X2ludGYuaCIKLSNpZmRlZiBDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLSNpbmNsdWRlICJydGw4NzIzYV9idC1jb2V4aXN0LmgiCi0jZW5kaWYKLSNpbmNsdWRlICJydGw4NzIzYV9kbS5oIgotI2luY2x1ZGUgInJ0bDg3MjNhX3JlY3YuaCIKLSNpbmNsdWRlICJydGw4NzIzYV94bWl0LmgiCi0jaW5jbHVkZSAicnRsODcyM2FfY21kLmgiCi0jaW5jbHVkZSAicnRsODcyM2Ffc3Jlc2V0LmgiCi0jaW5jbHVkZSAicnR3X2VmdXNlLmgiCi0jaW5jbHVkZSAicnR3X2VlcHJvbS5oIgotCi0jaW5jbHVkZSAib2RtX3ByZWNvbXAuaCIKLSNpbmNsdWRlICJvZG0uaCIKLQotCi0vKiAyVE9ETzogV2Ugc2hvdWxkIGRlZmluZSA4MTkyUyBmaXJtd2FyZSByZWxhdGVkIG1hY3JvIHNldHRpbmdzIGhlcmUhISAqLwotI2RlZmluZSBSVEw4MTlYX0RFRkFVTFRfUkZfVFlQRQkJCVJGXzFUMlIKLSNkZWZpbmUgUlRMODE5WF9UT1RBTF9SRl9QQVRICQkJCTIKLQotLyogICovCi0vKgkJUlRMODcyM1MgRnJvbSBoZWFkZXIgKi8KLS8qICAqLwotCi0vKiAgRncgQXJyYXkgKi8KLSNkZWZpbmUgUnRsODcyM19Gd0ltYWdlQXJyYXkJCQkJUnRsODcyM1VGd0ltZ0FycmF5Ci0jZGVmaW5lIFJ0bDg3MjNfRndVTUNCQ3V0SW1hZ2VBcnJheVdpdGhCVAkJUnRsODcyM1VGd1VNQ0JDdXRJbWdBcnJheVdpdGhCVAotI2RlZmluZSBSdGw4NzIzX0Z3VU1DQkN1dEltYWdlQXJyYXlXaXRob3V0QlQJUnRsODcyM1VGd1VNQ0JDdXRJbWdBcnJheVdpdGhvdXRCVAotCi0jZGVmaW5lIFJ0bDg3MjNfSW1nQXJyYXlMZW5ndGgJCQkJUnRsODcyM1VJbWdBcnJheUxlbmd0aAotI2RlZmluZSBSdGw4NzIzX1VNQ0JDdXRJbWdBcnJheVdpdGhCVExlbmd0aAkJUnRsODcyM1VVTUNCQ3V0SW1nQXJyYXlXaXRoQlRMZW5ndGgKLSNkZWZpbmUgUnRsODcyM19VTUNCQ3V0SW1nQXJyYXlXaXRob3V0QlRMZW5ndGgJUnRsODcyM1VVTUNCQ3V0SW1nQXJyYXlXaXRob3V0QlRMZW5ndGgKLQotI2RlZmluZSBSdGw4NzIzX1BIWV9SRUdfQXJyYXlfUEcJCQlSdGw4NzIzVVBIWV9SRUdfQXJyYXlfUEcKLSNkZWZpbmUgUnRsODcyM19QSFlfUkVHX0FycmF5X1BHTGVuZ3RoCQlSdGw4NzIzVVBIWV9SRUdfQXJyYXlfUEdMZW5ndGgKLQotI2RlZmluZSBSdGw4NzIzX0Z3VU1DQkN1dE1QSW1hZ2VBcnJheQkJUnRsODcyM1NGd1VNQ0JDdXRNUEltZ0FyCi0jZGVmaW5lIFJ0bDg3MjNfVU1DQkN1dE1QSW1nQXJyYXlMZW5ndGgJCVJ0bDg3MjNTVU1DQkN1dE1QSW1nQXJyYXlMZW5ndGgKLQotI2RlZmluZSBEUlZJTkZPX1NaCQkJCTQgLyogIHVuaXQgaXMgOGJ5dGVzICovCi0jZGVmaW5lIFBhZ2VOdW1fMTI4KF9MZW4pCQkodTMyKSgoKF9MZW4pPj43KSArICgoX0xlbikmMHg3RiA/IDE6MCkpCi0KLSNkZWZpbmUgRldfODcyM0FfU0laRQkJCTB4ODAwMAotI2RlZmluZSBGV184NzIzQV9TVEFSVF9BRERSRVNTCTB4MTAwMAotI2RlZmluZSBGV184NzIzQV9FTkRfQUREUkVTUwkJMHgxRkZGIC8qIDB4NUZGRiAqLwotCi0jZGVmaW5lIE1BWF9QQUdFX1NJWkUJCQk0MDk2CS8qICBAIHBhZ2UgOiA0ayBieXRlcyAqLwotCi0jZGVmaW5lIElTX0ZXX0hFQURFUl9FWElTVChfcEZ3SGRyKQkoKGxlMTZfdG9fY3B1KF9wRndIZHItPlNpZ25hdHVyZSkmMHhGRkYwKSA9PSAweDkyQzAgfHxcCi0JCQkJCQkJCQkobGUxNl90b19jcHUoX3BGd0hkci0+U2lnbmF0dXJlKSYweEZGRjApID09IDB4ODhDMCB8fFwKLQkJCQkJCQkJCShsZTE2X3RvX2NwdShfcEZ3SGRyLT5TaWduYXR1cmUpJjB4RkZGMCkgPT0gMHgyMzAwKQotCi0vKiAgKi8KLS8qICBUaGlzIHN0cnVjdHVyZSBtdXN0IGJlIGNhcmVkIGJ5dGUtb3JkZXJpbmcgKi8KLS8qICAqLwotLyogIEFkZGVkIGJ5IHR5bmxpLiAyMDA5LjEyLjA0LiAqLwotc3RydWN0IHJ0Xzg3MjNhX2Zpcm13YXJlX2hkciB7Ci0JLyogIDgtYnl0ZSBhbGlubWVudCByZXF1aXJlZCAqLwotCi0JLyogIExPTkcgV09SRCAwIC0tLS0gKi8KLQlfX2xlMTYJCVNpZ25hdHVyZTsgIC8qCi0JCQkJICAgICAqIDkyQzA6IHRlc3QgY2hpcDsgOTJDLCA4OEMwOiB0ZXN0IGNoaXA7Ci0JCQkJICAgICAqIDg4QzE6IE1QIEEtY3V0OyA5MkMxOiBNUCBBLWN1dAotCQkJCSAgICAgKi8KLQl1OAkJQ2F0ZWdvcnk7CS8qICBBUC9OSUMgYW5kIFVTQi9QQ0kgKi8KLQl1OAkJRnVuY3Rpb247CS8qICBSZXNlcnZlZCBmb3IgZGlmZmVyZW50IEZXIGZ1bmN0aW9uIGluZGNhdGlvbiwgZm9yIGZ1cnRoZXIgdXNlIHdoZW4gZHJpdmVyIG5lZWRzIHRvIGRvd25sb2FkIGRpZmZlcmVudCBGVyBpbiBkaWZmZXJlbnQgY29uZGl0aW9ucyAqLwotCV9fbGUxNgkJVmVyc2lvbjsJCS8qICBGVyBWZXJzaW9uICovCi0JdTgJCVN1YnZlcnNpb247CS8qICBGVyBTdWJ2ZXJzaW9uLCBkZWZhdWx0IDB4MDAgKi8KLQl1OAkJUnN2ZDE7Ci0KLQotCS8qICBMT05HIFdPUkQgMSAtLS0tICovCi0JdTgJCU1vbnRoOwkvKiAgUmVsZWFzZSB0aW1lIE1vbnRoIGZpZWxkICovCi0JdTgJCURhdGU7CS8qICBSZWxlYXNlIHRpbWUgRGF0ZSBmaWVsZCAqLwotCXU4CQlIb3VyOwkvKiAgUmVsZWFzZSB0aW1lIEhvdXIgZmllbGQgKi8KLQl1OAkJTWludXRlOwkvKiAgUmVsZWFzZSB0aW1lIE1pbnV0ZSBmaWVsZCAqLwotCV9fbGUxNgkJUmFtQ29kZVNpemU7CS8qICBUaGUgc2l6ZSBvZiBSQU0gY29kZSAqLwotCV9fbGUxNgkJUnN2ZDI7Ci0KLQkvKiAgTE9ORyBXT1JEIDIgLS0tLSAqLwotCV9fbGUzMgkJU3ZuSWR4OwkvKiAgVGhlIFNWTiBlbnRyeSBpbmRleCAqLwotCV9fbGUzMgkJUnN2ZDM7Ci0KLQkvKiAgTE9ORyBXT1JEIDMgLS0tLSAqLwotCV9fbGUzMgkJUnN2ZDQ7Ci0JX19sZTMyCQlSc3ZkNTsKLX07Ci0KLSNkZWZpbmUgRFJJVkVSX0VBUkxZX0lOVF9USU1FCQkweDA1Ci0jZGVmaW5lIEJDTl9ETUFfQVRJTUVfSU5UX1RJTUUJCTB4MDIKLQotCi0vKiAgQkssIEJFLCBWSSwgVk8sIEhDQ0EsIE1BTkFHRU1FTlQsIENPTU1BTkQsIEhJR0gsIEJFQUNPTi4gKi8KLSNkZWZpbmUgTUFYX1RYX1FVRVVFCQk5Ci0KLSNkZWZpbmUgVFhfU0VMRV9IUQkJCUJJVCgwKQkJLyogIEhpZ2ggUXVldWUgKi8KLSNkZWZpbmUgVFhfU0VMRV9MUQkJCUJJVCgxKQkJLyogIExvdyBRdWV1ZSAqLwotI2RlZmluZSBUWF9TRUxFX05RCQkJQklUKDIpCQkvKiAgTm9ybWFsIFF1ZXVlICovCi0KLS8qICBOb3RlOiBXZSB3aWxsIGRpdmlkZSBudW1iZXIgb2YgcGFnZSBlcXVhbGx5IGZvciBlYWNoIHF1ZXVlIG90aGVyIHRoYW4gcHVibGljIHF1ZXVlISAqLwotI2RlZmluZSBUWF9UT1RBTF9QQUdFX05VTUJFUgkweEY4Ci0jZGVmaW5lIFRYX1BBR0VfQk9VTkRBUlkJCShUWF9UT1RBTF9QQUdFX05VTUJFUiArIDEpCi0KLS8qICBGb3IgTm9ybWFsIENoaXAgU2V0dGluZyAqLwotLyogIChIUFEgKyBMUFEgKyBOUFEgKyBQVUJRKSBzaGFsbCBiZSBUWF9UT1RBTF9QQUdFX05VTUJFUiAqLwotI2RlZmluZSBOT1JNQUxfUEFHRV9OVU1fUFVCUQkweEU3Ci0jZGVmaW5lIE5PUk1BTF9QQUdFX05VTV9IUFEJCTB4MEMKLSNkZWZpbmUgTk9STUFMX1BBR0VfTlVNX0xQUQkJMHgwMgotI2RlZmluZSBOT1JNQUxfUEFHRV9OVU1fTlBRCQkweDAyCi0KLS8qICBGb3IgVGVzdCBDaGlwIFNldHRpbmcgKi8KLS8qICAoSFBRICsgTFBRICsgUFVCUSkgc2hhbGwgYmUgVFhfVE9UQUxfUEFHRV9OVU1CRVIgKi8KLSNkZWZpbmUgVEVTVF9QQUdFX05VTV9QVUJRCQkweDdFCi0KLS8qICBGb3IgVGVzdCBDaGlwIFNldHRpbmcgKi8KLSNkZWZpbmUgV01NX1RFU1RfVFhfVE9UQUxfUEFHRV9OVU1CRVIJMHhGNQotI2RlZmluZSBXTU1fVEVTVF9UWF9QQUdFX0JPVU5EQVJZCQkoV01NX1RFU1RfVFhfVE9UQUxfUEFHRV9OVU1CRVIgKyAxKSAvKiBGNiAqLwotCi0jZGVmaW5lIFdNTV9URVNUX1BBR0VfTlVNX1BVQlEJCTB4QTMKLSNkZWZpbmUgV01NX1RFU1RfUEFHRV9OVU1fSFBRCQkweDI5Ci0jZGVmaW5lIFdNTV9URVNUX1BBR0VfTlVNX0xQUQkJMHgyOQotCi0vKiAgTm90ZTogRm9yIE5vcm1hbCBDaGlwIFNldHRpbmcsIG1vZGlmeSBsYXRlciAqLwotI2RlZmluZSBXTU1fTk9STUFMX1RYX1RPVEFMX1BBR0VfTlVNQkVSCTB4RjUKLSNkZWZpbmUgV01NX05PUk1BTF9UWF9QQUdFX0JPVU5EQVJZCQkoV01NX1RFU1RfVFhfVE9UQUxfUEFHRV9OVU1CRVIgKyAxKSAvKiBGNiAqLwotCi0jZGVmaW5lIFdNTV9OT1JNQUxfUEFHRV9OVU1fUFVCUQkweEIwCi0jZGVmaW5lIFdNTV9OT1JNQUxfUEFHRV9OVU1fSFBRCQkweDI5Ci0jZGVmaW5lIFdNTV9OT1JNQUxfUEFHRV9OVU1fTFBRCQkweDFDCi0jZGVmaW5lIFdNTV9OT1JNQUxfUEFHRV9OVU1fTlBRCQkweDFDCi0KLQotLyogICovCi0vKglDaGlwIHNwZWNpZmljICovCi0vKiAgKi8KLSNkZWZpbmUgQ0hJUF9CT05ESU5HX0lERU5USUZJRVIoX3ZhbHVlKQkoKChfdmFsdWUpPj4yMikmMHgzKQotI2RlZmluZSBDSElQX0JPTkRJTkdfOTJDXzFUMlIJCQkweDEKLSNkZWZpbmUgQ0hJUF9CT05ESU5HXzg4Q19VU0JfTUNBUkQJCTB4MgotI2RlZmluZSBDSElQX0JPTkRJTkdfODhDX1VTQl9IUAkJCTB4MQotCi0jaW5jbHVkZSAiSGFsVmVyRGVmLmgiCi0jaW5jbHVkZSAiaGFsX2NvbS5oIgotCi0vKiAgKi8KLS8qCUNoYW5uZWwgUGxhbiAqLwotLyogICovCi1lbnVtIENoYW5uZWxQbGFuCi17Ci0JQ0hQTF9GQ0MJPSAwLAotCUNIUExfSUMJCT0gMSwKLQlDSFBMX0VUU0kJPSAyLAotCUNIUExfU1BBSU4JPSAzLAotCUNIUExfRlJBTkNFCT0gNCwKLQlDSFBMX01LSwk9IDUsCi0JQ0hQTF9NS0sxCT0gNiwKLQlDSFBMX0lTUkFFTAk9IDcsCi0JQ0hQTF9URUxFQwk9IDgsCi0JQ0hQTF9HTE9CQUwJPSA5LAotCUNIUExfV09STEQJPSAxMCwKLX07Ci0KLSNkZWZpbmUgRUZVU0VfUkVBTF9DT05URU5UX0xFTgkJNTEyCi0jZGVmaW5lIEVGVVNFX01BUF9MRU4JCQkJMTI4Ci0jZGVmaW5lIEVGVVNFX01BWF9TRUNUSU9OCQkJMTYKLSNkZWZpbmUgRUZVU0VfSUNfSURfT0ZGU0VUCQkJNTA2CS8qIEZvciBzb21lIGluZmVyaW9yaXR5IElDIHB1cnBvc2UuIGFkZGVkIGJ5IFJvZ2VyLCAyMDA5LjA5LjAyLiAqLwotI2RlZmluZSBBVkFJTEFCTEVfRUZVU0VfQUREUihhZGRyKQkoYWRkciA8IEVGVVNFX1JFQUxfQ09OVEVOVF9MRU4pCi0vKiAgKi8KLS8qICA8Um9nZXJfTm90ZXM+ICovCi0vKiAgVG8gcHJldmVudCBvdXQgb2YgYm91bmRhcnkgcHJvZ3JhbW1pbmcgY2FzZSwgKi8KLS8qICBsZWF2ZSAxYnl0ZSBhbmQgcHJvZ3JhbSBmdWxsIHNlY3Rpb24gKi8KLS8qICA5Ynl0ZXMgKyAxYnl0ICsgNWJ5dGVzIGFuZCBwcmUgMWJ5dGUuICovCi0vKiAgRm9yIHdvcnN0IGNhc2U6ICovCi0vKiAgfCAxYnl0ZXwtLS0tOGJ5dGVzLS0tLXwxYnl0ZXwtLTVieXRlcy0tfCAqLwotLyogIHwgICAgICAgICB8ICAgICAgICAgICAgUmVzZXJ2ZWQoMTRieXRlcykJICAgICAgfCAqLwotLyogICovCi0KLS8qICBQRyBkYXRhIGV4Y2x1ZGUgaGVhZGVyLCBkdW1teSA2IGJ5dGVzIGZyb20gQ1AgdGVzdCBhbmQgcmVzZXJ2ZWQgMWJ5dGUuICovCi0jZGVmaW5lIEVGVVNFX09PQl9QUk9URUNUX0JZVEVTCQkJMTUKLQotI2RlZmluZSBFRlVTRV9SRUFMX0NPTlRFTlRfTEVOXzg3MjNBCTUxMgotI2RlZmluZSBFRlVTRV9NQVBfTEVOXzg3MjNBCQkJCTI1NgotI2RlZmluZSBFRlVTRV9NQVhfU0VDVElPTl84NzIzQQkJCTMyCi0KLS8qICAqLwotLyoJCQlFRlVTRSBmb3IgQlQgZGVmaW5pdGlvbiAqLwotLyogICovCi0jZGVmaW5lIEVGVVNFX0JUX1JFQUxfQkFOS19DT05URU5UX0xFTgk1MTIKLSNkZWZpbmUgRUZVU0VfQlRfUkVBTF9DT05URU5UX0xFTgkJMTUzNgkvKiAgNTEyKjMgKi8KLSNkZWZpbmUgRUZVU0VfQlRfTUFQX0xFTgkJCQkxMDI0CS8qICAxayBieXRlcyAqLwotI2RlZmluZSBFRlVTRV9CVF9NQVhfU0VDVElPTgkJCTEyOAkJLyogIDEwMjQvOCAqLwotCi0jZGVmaW5lIEVGVVNFX1BST1RFQ1RfQllURVNfQkFOSwkJMTYKLQotLyogICovCi0vKiAgPFJvZ2VyX05vdGVzPiBGb3IgUlRMODcyMyBXaUZpL0JUL0dQUyBtdWx0aS1mdW5jdGlvbiBjb25maWd1cmF0aW9uLiAyMDEwLjEwLjA2LiAqLwotLyogICovCi1lbnVtIFJUX01VTFRJX0ZVTkMgewotCVJUX01VTFRJX0ZVTkNfTk9ORSA9IDB4MDAsCi0JUlRfTVVMVElfRlVOQ19XSUZJID0gMHgwMSwKLQlSVF9NVUxUSV9GVU5DX0JUID0gMHgwMiwKLQlSVF9NVUxUSV9GVU5DX0dQUyA9IDB4MDQsCi19OwotCi0vKiAgKi8KLS8qICA8Um9nZXJfTm90ZXM+IEZvciBSVEw4NzIzIFdpRmkgUERuL0dQSU8gcG9sYXJpdHkgY29udHJvbCBjb25maWd1cmF0aW9uLiAyMDEwLjEwLjA4LiAqLwotLyogICovCi1lbnVtIFJUX1BPTEFSSVRZX0NUTCB7Ci0JUlRfUE9MQVJJVFlfTE9XX0FDVCA9IDAsCi0JUlRfUE9MQVJJVFlfSElHSF9BQ1QgPSAxLAotfTsKLQotLyogIEZvciBSVEw4NzIzIHJlZ3VsYXRvciBtb2RlLiBieSB0eW5saS4gMjAxMS4wMS4xNC4gKi8KLWVudW0gUlRfUkVHVUxBVE9SX01PREUgewotCVJUX1NXSVRDSElOR19SRUdVTEFUT1IgPSAwLAotCVJUX0xET19SRUdVTEFUT1IgPSAxLAotfTsKLQotLyogIERlc2NyaXB0aW9uOiBEZXRlcm1pbmUgdGhlIHR5cGVzIG9mIEMySCBldmVudHMgdGhhdCBhcmUgdGhlIHNhbWUgaW4gZHJpdmVyIGFuZCBGdy4gKi8KLS8qICBGaXNydCBjb25zdHJ1Y3RlZCBieSB0eW5saS4gMjAwOS4xMC4wOS4gKi8KLWVudW0gewotCUMySF9EQkcgPSAwLAotCUMySF9UU0YgPSAxLAotCUMySF9BUF9SUFRfUlNQID0gMiwKLQlDMkhfQ0NYX1RYX1JQVCA9IDMsCS8qICBUaGUgRlcgbm90aWZ5IHRoZSByZXBvcnQgb2YgdGhlIHNwZWNpZmljIHR4IHBhY2tldC4gKi8KLQlDMkhfQlRfUlNTSSA9IDQsCi0JQzJIX0JUX09QX01PREUgPSA1LAotCUMySF9FWFRfUkFfUlBUID0gNiwKLQlDMkhfSFdfSU5GT19FWENIID0gMTAsCi0JQzJIX0MySF9IMkNfVEVTVCA9IDExLAotCUMySF9CVF9JTkZPID0gMTIsCi0JQzJIX0JUX01QX0lORk8gPSAxNSwKLQlNQVhfQzJIRVZFTlQKLX07Ci0KLXN0cnVjdCBoYWxfZGF0YV84NzIzYSB7Ci0Jc3RydWN0IGhhbF92ZXJzaW9uCQlWZXJzaW9uSUQ7Ci0JZW51bSBydF9jdXN0b21lcl9pZCBDdXN0b21lcklEOwotCi0JdTE2CUZpcm13YXJlVmVyc2lvbjsKLQl1MTYJRmlybXdhcmVWZXJzaW9uUmV2OwotCXUxNglGaXJtd2FyZVN1YlZlcnNpb247Ci0JdTE2CUZpcm13YXJlU2lnbmF0dXJlOwotCi0JLyogY3VycmVudCBXSUZJX1BIWSB2YWx1ZXMgKi8KLQl1MzIJUmVjZWl2ZUNvbmZpZzsKLQllbnVtIFdJUkVMRVNTX01PREUJCUN1cnJlbnRXaXJlbGVzc01vZGU7Ci0JZW51bSBodF9jaGFubmVsX3dpZHRoCUN1cnJlbnRDaGFubmVsQlc7Ci0JdTgJQ3VycmVudENoYW5uZWw7Ci0JdTgJbkN1cjQwTWh6UHJpbWVTQzsvKiAgQ29udHJvbCBjaGFubmVsIHN1Yi1jYXJyaWVyICovCi0KLQl1MTYJQmFzaWNSYXRlU2V0OwotCi0JLyogcmZfY3RybCAqLwotCXU4CXJmX3R5cGU7Ci0JdTgJTnVtVG90YWxSRlBhdGg7Ci0KLQl1OAlCb2FyZFR5cGU7Ci0JdTgJQ3J5c3RhbENhcDsKLQkvKiAgKi8KLQkvKiAgRUVQUk9NIHNldHRpbmcuICovCi0JLyogICovCi0JdTgJRUVQUk9NVmVyc2lvbjsKLQl1OAlFRVBST01DdXN0b21lcklEOwotCXU4CUVFUFJPTVN1YkN1c3RvbWVySUQ7Ci0JdTgJRUVQUk9NUmVndWxhdG9yeTsKLQl1OAlFRVBST01UaGVybWFsTWV0ZXI7Ci0JdTgJRUVQUk9NQmx1ZXRvb3RoQ29leGlzdDsKLQl1OAlFRVBST01CbHVldG9vdGhUeXBlOwotCXU4CUVFUFJPTUJsdWV0b290aEFudE51bTsKLQl1OAlFRVBST01CbHVldG9vdGhBbnRJc29sYXRpb247Ci0JdTgJRUVQUk9NQmx1ZXRvb3RoUmFkaW9TaGFyZWQ7Ci0KLQl1OAliVFhQb3dlckRhdGFSZWFkRnJvbUVFUE9STTsKLQl1OAliQVBLVGhlcm1hbE1ldGVySWdub3JlOwotCi0JdTgJYklRS0luaXRpYWxpemVkOwotCXU4CWJBbnRlbm5hRGV0ZWN0ZWQ7Ci0KLQl1OAlUeFB3ckxldmVsQ2NrW1JGX1BBVEhfTUFYXVtDSEFOTkVMX01BWF9OVU1CRVJdOwotCXU4CVR4UHdyTGV2ZWxIVDQwXzFTW1JGX1BBVEhfTUFYXVtDSEFOTkVMX01BWF9OVU1CRVJdOwkvKiAgRm9yIEhUIDQwTUhaIHB3ciAqLwotCXU4CVR4UHdyTGV2ZWxIVDQwXzJTW1JGX1BBVEhfTUFYXVtDSEFOTkVMX01BWF9OVU1CRVJdOwkvKiAgRm9yIEhUIDQwTUhaIHB3ciAqLwotCXU4CVR4UHdySHQyMERpZmZbUkZfUEFUSF9NQVhdW0NIQU5ORUxfTUFYX05VTUJFUl07LyogIEhUIDIwPC0+NDAgUHdyIGRpZmYgKi8KLQl1OAlUeFB3ckxlZ2FjeUh0RGlmZltSRl9QQVRIX01BWF1bQ0hBTk5FTF9NQVhfTlVNQkVSXTsvKiAgRm9yIEhUPC0+bGVnYWN5IHB3ciBkaWZmICovCi0JLyogIEZvciBwb3dlciBncm91cCAqLwotCXU4CVB3ckdyb3VwSFQyMFtSRl9QQVRIX01BWF1bQ0hBTk5FTF9NQVhfTlVNQkVSXTsKLQl1OAlQd3JHcm91cEhUNDBbUkZfUEFUSF9NQVhdW0NIQU5ORUxfTUFYX05VTUJFUl07Ci0KLQl1OAlMZWdhY3lIVFR4UG93ZXJEaWZmOy8qICBMZWdhY3kgdG8gSFQgcmF0ZSBwb3dlciBkaWZmICovCi0KLQkvKiAgUmVhZC93cml0ZSBhcmUgYWxsb3cgZm9yIGZvbGxvd2luZyBoYXJkd2FyZSBpbmZvcm1hdGlvbiB2YXJpYWJsZXMgKi8KLQl1OAlmcmFtZXN5bmM7Ci0JdTMyCWZyYW1lc3luY0MzNDsKLQl1OAlmcmFtZXN5bmNNb25pdG9yOwotCXU4CXB3ckdyb3VwQ250OwotCXUzMglNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFs3XVsxNl07Ci0JdTMyCUNDS1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0OwotCi0JdTMyCUFudGVubmFUeFBhdGg7CQkJCQkvKiAgQW50ZW5uYSBwYXRoIFR4ICovCi0JdTMyCUFudGVubmFSeFBhdGg7CQkJCQkvKiAgQW50ZW5uYSBwYXRoIFJ4ICovCi0JdTgJRXh0ZXJuYWxQQTsKLQotCXU4CWJMZWRPcGVuRHJhaW47IC8qICBTdXBwb3J0IE9wZW4tZHJhaW4gYXJyYW5nZW1lbnQgZm9yIGNvbnRyb2xsaW5nIHRoZSBMRUQuIEFkZGVkIGJ5IFJvZ2VyLCAyMDA5LjEwLjE2LiAqLwotCi0JdTgJYjF4MVJlY3ZDb21iaW5lOwkvKiAgZm9yIDFUMVIgcmVjZWl2ZSBjb21iaW5pbmcgKi8KLQotCS8qICBGb3IgRURDQSBUdXJibyBtb2RlICovCi0KLQl1MzIJQWNQYXJhbV9CRTsgLyogT3JpZ2luYWwgcGFyYW1ldGVyIGZvciBCRSwgdXNlIGZvciBFRENBIHR1cmJvLiAqLwotCi0JLyogdml2aSwgZm9yIHR4IHBvd2VyIHRyYWNraW5nLCAyMDA4MDQwNyAqLwotCS8qIHUxNglUU1NJXzEzZEJtOyAqLwotCS8qIHUzMglQd3JfVHJhY2s7ICovCi0JLyogIFRoZSBjdXJyZW50IFR4IFBvd2VyIExldmVsICovCi0JdTgJQ3VycmVudENja1R4UHdySWR4OwotCXU4CUN1cnJlbnRPZmRtMjRHVHhQd3JJZHg7Ci0KLQlzdHJ1Y3QgYmJfcmVnX2RlZmluZQlQSFlSZWdEZWZbNF07CS8qIFJhZGlvIEEvQi9DL0QgKi8KLQotCWJvb2wJCWJSRlBhdGhSeEVuYWJsZVs0XTsJLyogIFdlIHN1cHBvcnQgNCBSRiBwYXRoIG5vdy4gKi8KLQotCXUzMglSZlJlZ0NobmxWYWxbMl07Ci0KLQl1OAliQ2NrSGlnaFBvd2VyOwotCi0JLyogUkRHIGVuYWJsZSAqLwotCWJvb2wJIGJSREdFbmFibGU7Ci0KLQkvKiBmb3IgaG9zdCBtZXNzYWdlIHRvIGZ3ICovCi0JdTgJTGFzdEhNRUJveE51bTsKLQotCXU4CVJlZ1R4UGF1c2U7Ci0JLyogIEJlYWNvbiBmdW5jdGlvbiByZWxhdGVkIGdsb2JhbCB2YXJpYWJsZS4gKi8KLQl1OAlSZWdGd0h3VHhRQ3RybDsKLQl1OAlSZWdSZWc1NDI7Ci0KLQlzdHJ1Y3QgZG1fcHJpdglkbXByaXY7Ci0Jc3RydWN0IGRtX29kbV90CQlvZG1wcml2OwotCXN0cnVjdCBzcmVzZXRfcHJpdiBzcmVzdHByaXY7Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLQl1OAkJCQliQlRNb2RlOwotCS8qICBCVCBvbmx5LiAqLwotCXN0cnVjdCBidF8zMGluZm8JCUJ0SW5mbzsKLQkvKiAgRm9yIGJsdWV0b290aCBjby1leGlzdGFuY2UgKi8KLQlzdHJ1Y3QgYnRfY29leGlzdF9zdHIJYnRfY29leGlzdDsKLSNlbmRpZgotCi0JdTgJYkR1bXBSeFBrdDsvKiBmb3IgZGVidWcgKi8KLQl1OAlGd1JzdmRQYWdlU3RhcnRPZmZzZXQ7IC8qIDIwMTAuMDYuMjMuIEFkZGVkIGJ5IHR5bmxpLiBSZXNlcnZlIHBhZ2Ugc3RhcnQgb2Zmc2V0IGV4Y2VwdCBiZWFjb24gaW4gVHhRLiAqLwotCi0JLyogIDIwMTAvMDgvMDkgTUggQWRkIENVIHBvd2VyIGRvd24gbW9kZS4gKi8KLQl1OAlwd3Jkb3duOwotCi0JdTgJT3V0RXBRdWV1ZVNlbDsKLQl1OAlPdXRFcE51bWJlcjsKLQotCS8qICAqLwotCS8qICBBZGQgRm9yIEVFUFJPTSBFZnVzZSBzd2l0Y2ggYW5kICBFZnVzZSBTaGFkb3cgbWFwIFNldHRpbmcgKi8KLQkvKiAgKi8KLQl1OAkJCUVlcHJvbU9yRWZ1c2U7Ci0JdTE2CQkJRWZ1c2VVc2VkQnl0ZXM7Ci0JdTE2CQkJQlRFZnVzZVVzZWRCeXRlczsKLQotCS8qICBJbnRlcnJ1cHQgcmVsYXRkIHJlZ2lzdGVyIGluZm9ybWF0aW9uLiAqLwotCXUzMgkJCVN5c0ludHJTdGF0dXM7Ci0JdTMyCQkJU3lzSW50ck1hc2s7Ci0KLQkvKiAgKi8KLQkvKiAgMjAxMS8wMi8yMyBNSCBBZGQgZm9yIDg3MjMgbXlsdGkgZnVuY3Rpb24gZGVmaW5pdGlvbi4gVGhlIGRlZmluZSBzaG91bGQgYmUgbW92ZWQgdG8gYW4gKi8KLQkvKiAgaW5kZXBlbmRlbnQgZmlsZSBpbiB0aGUgZnV0dXJlLiAqLwotCS8qICAqLwotCS8qIDg3MjMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JZW51bSBSVF9NVUxUSV9GVU5DCU11bHRpRnVuYzsgLyogIEZvciBtdWx0aS1mdW5jdGlvbiBjb25zaWRlcmF0aW9uLiAqLwotCWVudW0gUlRfUE9MQVJJVFlfQ1RMCVBvbGFyaXR5Q3RsOyAvKiAgRm9yIFdpZmkgUERuIFBvbGFyaXR5IGNvbnRyb2wuICovCi0JZW51bSBSVF9SRUdVTEFUT1JfTU9ERQlSZWd1bGF0b3JNb2RlOyAvKiAgc3dpdGNoaW5nIHJlZ3VsYXRvciBvciBMRE8gKi8KLQkvKiA4NzIzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKiAgMjAxMS8wMi8yMyBNSCBBZGQgZm9yIDg3MjMgbXlsdGkgZnVuY3Rpb24gZGVmaW5pdGlvbi4gVGhlIGRlZmluZSBzaG91bGQgYmUgbW92ZWQgdG8gYW4gKi8KLQkvKiAgaW5kZXBlbmRlbnQgZmlsZSBpbiB0aGUgZnV0dXJlLiAqLwotCi0JLyogIEludGVycnVwdCByZWxhdGVkIHJlZ2lzdGVyIGluZm9ybWF0aW9uLiAqLwotCXUzMglJbnRBcnJheVsyXTsKLQl1MzIJSW50ck1hc2tbMl07Ci19OwotCi0jZGVmaW5lIEdFVF9IQUxfREFUQShfX3BBZGFwdGVyKQkoKHN0cnVjdCBoYWxfZGF0YV84NzIzYSAqKSgoX19wQWRhcHRlciktPkhhbERhdGEpKQotI2RlZmluZSBHRVRfUkZfVFlQRShwcml2KQkJCShHRVRfSEFMX0RBVEEocHJpdiktPnJmX3R5cGUpCi0KLSNkZWZpbmUgSU5DTFVERV9NVUxUSV9GVU5DX0JUKF9BZGFwdGVyKQkJKEdFVF9IQUxfREFUQShfQWRhcHRlciktPk11bHRpRnVuYyAmIFJUX01VTFRJX0ZVTkNfQlQpCi0jZGVmaW5lIElOQ0xVREVfTVVMVElfRlVOQ19HUFMoX0FkYXB0ZXIpCShHRVRfSEFMX0RBVEEoX0FkYXB0ZXIpLT5NdWx0aUZ1bmMgJiBSVF9NVUxUSV9GVU5DX0dQUykKLQotc3RydWN0IHJ4cmVwb3J0Xzg3MjNhIHsKLQl1MzIgcGt0bGVuOjE0OwotCXUzMiBjcmMzMjoxOwotCXUzMiBpY3ZlcnI6MTsKLQl1MzIgZHJ2aW5mb3NpemU6NDsKLQl1MzIgc2VjdXJpdHk6MzsKLQl1MzIgcW9zOjE7Ci0JdTMyIHNoaWZ0OjI7Ci0JdTMyIHBoeXN0OjE7Ci0JdTMyIHN3ZGVjOjE7Ci0JdTMyIGxzOjE7Ci0JdTMyIGZzOjE7Ci0JdTMyIGVvcjoxOwotCXUzMiBvd246MTsKLQotCXUzMiBtYWNpZDo1OwotCXUzMiB0aWQ6NDsKLQl1MzIgaHdyc3ZkOjQ7Ci0JdTMyIGFtc2R1OjE7Ci0JdTMyIHBhZ2dyOjE7Ci0JdTMyIGZhZ2dyOjE7Ci0JdTMyIGExZml0OjQ7Ci0JdTMyIGEyZml0OjQ7Ci0JdTMyIHBhbToxOwotCXUzMiBwd3I6MTsKLQl1MzIgbWQ6MTsKLQl1MzIgbWY6MTsKLQl1MzIgdHlwZToyOwotCXUzMiBtYzoxOwotCXUzMiBiYzoxOwotCi0JdTMyIHNlcToxMjsKLQl1MzIgZnJhZzo0OwotCXUzMiBuZXh0cGt0bGVuOjE0OwotCXUzMiBuZXh0aW5kOjE7Ci0JdTMyIHJzdmQwODMxOjE7Ci0KLQl1MzIgcnhtY3M6NjsKLQl1MzIgcnhodDoxOwotCXUzMiBnZjoxOwotCXUzMiBzcGxjcDoxOwotCXUzMiBidzoxOwotCXUzMiBodGM6MTsKLQl1MzIgZW9zcDoxOwotCXUzMiBic3NpZGZpdDoyOwotCXUzMiByc3ZkMTIxNDoxNjsKLQl1MzIgdW5pY2FzdHdha2U6MTsKLQl1MzIgbWFnaWN3YWtlOjE7Ci0KLQl1MzIgcGF0dGVybjBtYXRjaDoxOwotCXUzMiBwYXR0ZXJuMW1hdGNoOjE7Ci0JdTMyIHBhdHRlcm4ybWF0Y2g6MTsKLQl1MzIgcGF0dGVybjNtYXRjaDoxOwotCXUzMiBwYXR0ZXJuNG1hdGNoOjE7Ci0JdTMyIHBhdHRlcm41bWF0Y2g6MTsKLQl1MzIgcGF0dGVybjZtYXRjaDoxOwotCXUzMiBwYXR0ZXJuN21hdGNoOjE7Ci0JdTMyIHBhdHRlcm44bWF0Y2g6MTsKLQl1MzIgcGF0dGVybjltYXRjaDoxOwotCXUzMiBwYXR0ZXJuYW1hdGNoOjE7Ci0JdTMyIHBhdHRlcm5ibWF0Y2g6MTsKLQl1MzIgcGF0dGVybmNtYXRjaDoxOwotCXUzMiByc3ZkMTYxMzoxOTsKLQotCXUzMiB0c2ZsOwotCi0JdTMyIGJhc3NuOjEyOwotCXUzMiBiYXZsZDoxOwotCXUzMiByc3ZkMjQxMzoxOTsKLX07Ci0KLS8qICBydGw4NzIzYV9oYWxfaW5pdC5jICovCi1zMzIgcnRsODcyM2FfRmlybXdhcmVEb3dubG9hZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2FfRmlybXdhcmVTZWxmUmVzZXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX0luaXRpYWxpemVGaXJtd2FyZVZhcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcnRsODcyM2FfSW5pdEFudGVubmFfU2VsZWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9EZWluaXRBbnRlbm5hX1NlbGVjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2FfQ2hlY2tBbnRlbm5hX1NlbGVjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2FfaW5pdF9kZWZhdWx0X3ZhbHVlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi1zMzIgSW5pdExMVFRhYmxlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBib3VuZGFyeSk7Ci0KLXMzMiBDYXJkRGlzYWJsZUhXU00oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggcmVzZXRNQ1UpOwotczMyIENhcmREaXNhYmxlV2l0aG91dEhXU00oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLS8qICBFRnVzZSAqLwotdTggR2V0RUVQUk9NU2l6ZTg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBIYWxfSW5pdFBHRGF0YShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqUFJPTUNvbnRlbnQpOwotdm9pZCBIYWxfRWZ1c2VQYXJzZUlEQ29kZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqaHdpbmZvKTsKLXZvaWQgSGFsX0VmdXNlUGFyc2V0eHBvd2VyaW5mb184NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqUFJPTUNvbnRlbnQsIGJvb2wgQXV0b0xvYWRGYWlsKTsKLXZvaWQgSGFsX0VmdXNlUGFyc2VCVENvZXhpc3RJbmZvXzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKTsKLXZvaWQgSGFsX0VmdXNlUGFyc2VFRVBST01WZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpOwotdm9pZCBydGw4NzIzYV9FZnVzZVBhcnNlQ2hubFBsYW4oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpOwotdm9pZCBIYWxfRWZ1c2VQYXJzZUN1c3RvbWVySUQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpOwotdm9pZCBIYWxfRWZ1c2VQYXJzZUFudGVubmFEaXZlcnNpdHkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpOwotdm9pZCBIYWxfRWZ1c2VQYXJzZVJhdGVJbmRpY2F0aW9uT3B0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKTsKLXZvaWQgSGFsX0VmdXNlUGFyc2VYdGFsXzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHU4ICpod2luZm8sIHU4IEF1dG9Mb2FkRmFpbCk7Ci12b2lkIEhhbF9FZnVzZVBhcnNlVGhlcm1hbE1ldGVyXzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKTsKLQotLyogIHJlZ2lzdGVyICovCi12b2lkIFNldEJjbkN0cmxSZWcyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggU2V0Qml0cywgdTggQ2xlYXJCaXRzKTsKLXZvaWQgcnRsODcyM2FfSW5pdEJlYWNvblBhcmFtZXRlcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcnRsODcyM2Ffc3RhcnRfdGhyZWFkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9zdG9wX3RocmVhZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotYm9vbCBjMmhfaWRfZmlsdGVyX2NjeF84NzIzYSh1OCBpZCk7Ci1pbnQgYzJoX2hhbmRsZXJfODcyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IGMyaF9ldnRfaGRyICpjMmhfZXZ0KTsKLQotdm9pZCBydGw4NzIzYV9yZWFkX2FkYXB0ZXJfaW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9yZWFkX2NoaXBfdmVyc2lvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2Ffbm90Y2hfZmlsdGVyKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgYm9vbCBlbmFibGUpOwotdm9pZCBydGw4NzIzYV9TZXRCZWFjb25SZWxhdGVkUmVnaXN0ZXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9TZXRIYWxPRE1WYXIoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJICAgZW51bSBoYWxfb2RtX3ZhcmlhYmxlIGVWYXJpYWJsZSwKLQkJCSAgIHZvaWQgKnBWYWx1ZTEsIGJvb2wgYlNldCk7Ci12b2lkCi1ydGw4NzIzYV9yZWFkZWZ1c2Uoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgdTggZWZ1c2VUeXBlLCB1MTYgX29mZnNldCwgdTE2IF9zaXplX2J5dGUsIHU4ICpwYnVmKTsKLXUxNiBydGw4NzIzYV9FZnVzZUdldEN1cnJlbnRTaXplX1dpRmkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11MTYgcnRsODcyM2FfRWZ1c2VHZXRDdXJyZW50U2l6ZV9CVChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2FfdXBkYXRlX3JhbWFzayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgIHUzMiBtYWNfaWQsIHU4IHJzc2lfbGV2ZWwpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9wZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX3BnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMmVjNDQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX3BnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVEw4NzIzQV9QR19IX18KLSNkZWZpbmUgX19SVEw4NzIzQV9QR19IX18KLQotLyoJCQlFRVBST00vRWZ1c2UgUEcgT2Zmc2V0IGZvciA4NzIzRS84NzIzVS84NzIzUyAqLwotI2RlZmluZSBFRVBST01fQ0NLX1RYX1BXUl9JTlhfODcyM0EJCQkweDEwCi0jZGVmaW5lIEVFUFJPTV9IVDQwXzFTX1RYX1BXUl9JTlhfODcyM0EJCTB4MTYKLSNkZWZpbmUgRUVQUk9NX0hUMjBfVFhfUFdSX0lOWF9ESUZGXzg3MjNBCTB4MUMKLSNkZWZpbmUgRUVQUk9NX09GRE1fVFhfUFdSX0lOWF9ESUZGXzg3MjNBCTB4MUYKLSNkZWZpbmUgRUVQUk9NX0hUNDBfTUFYX1BXUl9PRkZTRVRfODcyM0EJMHgyMgotI2RlZmluZSBFRVBST01fSFQyMF9NQVhfUFdSX09GRlNFVF84NzIzQQkweDI1Ci0KLSNkZWZpbmUgRUVQUk9NX0NoYW5uZWxQbGFuXzg3MjNBCQkJMHgyOAotI2RlZmluZSBFRVBST01fVFNTSV9BXzg3MjNBCQkJCQkweDI5Ci0jZGVmaW5lIEVFUFJPTV9USEVSTUFMX01FVEVSXzg3MjNBCQkJMHgyQQotI2RlZmluZSBSRl9PUFRJT04xXzg3MjNBCQkJCQkweDJCCi0jZGVmaW5lIFJGX09QVElPTjJfODcyM0EJCQkJCTB4MkMKLSNkZWZpbmUgUkZfT1BUSU9OM184NzIzQQkJCQkJMHgyRAotI2RlZmluZSBSRl9PUFRJT040Xzg3MjNBCQkJCQkweDJFCi0jZGVmaW5lIEVFUFJPTV9WRVJTSU9OXzg3MjNBCQkJCTB4MzAKLSNkZWZpbmUgRUVQUk9NX0N1c3RvbUlEXzg3MjNBCQkJCTB4MzEKLSNkZWZpbmUgRUVQUk9NX1N1YkN1c3RvbUlEXzg3MjNBCQkJMHgzMgotI2RlZmluZSBFRVBST01fWFRBTF9LXzg3MjNBCQkJCQkweDMzCi0jZGVmaW5lIEVFUFJPTV9DaGlwc2V0Xzg3MjNBCQkJCTB4MzQKLQotLyogIFJUTDg3MjNBRSAqLwotI2RlZmluZSBFRVBST01fVklEXzg3MjNBRQkJCQkJMHg0OQotI2RlZmluZSBFRVBST01fRElEXzg3MjNBRQkJCQkJMHg0QgotI2RlZmluZSBFRVBST01fU1ZJRF84NzIzQUUJCQkJCTB4NEQKLSNkZWZpbmUgRUVQUk9NX1NNSURfODcyM0FFCQkJCQkweDRGCi0jZGVmaW5lIEVFUFJPTV9NQUNfQUREUl84NzIzQUUJCQkJMHg2NwotCi0vKiAgUlRMODcyM0FVICovCi0jZGVmaW5lIEVFUFJPTV9NQUNfQUREUl84NzIzQVUJCQkJMHhDNgotI2RlZmluZSBFRVBST01fVklEXzg3MjNBVQkJCQkJMHhCNwotI2RlZmluZSBFRVBST01fUElEXzg3MjNBVQkJCQkJMHhCOQotCi0vKiAgUlRMODcyM0FTICovCi0jZGVmaW5lIEVFUFJPTV9NQUNfQUREUl84NzIzQVMJCQkJMHhBQQotCi0vKgkJCUVFUFJPTS9FZnVzZSBWYWx1ZSBUeXBlICovCi0jZGVmaW5lIEVFVFlQRV9UWF9QV1IJCQkJCQkweDAKLQotLyoJCQlFRVBST00vRWZ1c2UgRGVmYXVsdCBWYWx1ZSAqLwotI2RlZmluZSBFRVBST01fRGVmYXVsdF9DcnlzdGFsQ2FwXzg3MjNBCQkweDIwCi0KLQotLyogICAgICAgIEVFUFJPTS9FRlVTRSBkYXRhIHN0cnVjdHVyZSBkZWZpbml0aW9uLiAqLwotI2RlZmluZQlNQVhfQ0hOTF9HUk9VUAkJMys5Ci0KLXN0cnVjdCB0eHBvd2VyaW5mbyB7Ci0JdTggQ0NLSW5kZXhbUkZfUEFUSF9NQVhdW01BWF9DSE5MX0dST1VQXTsKLQl1OCBIVDQwXzFTSW5kZXhbUkZfUEFUSF9NQVhdW01BWF9DSE5MX0dST1VQXTsKLQl1OCBIVDQwXzJTSW5kZXhEaWZmW1JGX1BBVEhfTUFYXVtNQVhfQ0hOTF9HUk9VUF07Ci0JdTggSFQyMEluZGV4RGlmZltSRl9QQVRIX01BWF1bTUFYX0NITkxfR1JPVVBdOwotCXU4IE9GRE1JbmRleERpZmZbUkZfUEFUSF9NQVhdW01BWF9DSE5MX0dST1VQXTsKLQl1OCBIVDQwTWF4T2Zmc2V0W1JGX1BBVEhfTUFYXVtNQVhfQ0hOTF9HUk9VUF07Ci0JdTggSFQyME1heE9mZnNldFtSRl9QQVRIX01BWF1bTUFYX0NITkxfR1JPVVBdOwotCXU4IFRTU0lfQVszXTsKLQl1OCBUU1NJX0JbM107Ci0JdTggVFNTSV9BXzVHWzNdOwkJLyogNUdMLzVHTS81R0ggKi8KLQl1OCBUU1NJX0JfNUdbM107Ci19OwotCi1lbnVtIGJ0X2FudF9udW0gewotCUFudF94Mgk9IDAsCi0JQW50X3gxCT0gMQotfTsKLQotZW51bSBidF9jb3R5cGUgewotCUJUXzJXaXJlCQk9IDAsCi0JQlRfSVNTQ18zV2lyZQkJPSAxLAotCUJUX0FjY2VsCQk9IDIsCi0JQlRfQ1NSX0JDNAkJPSAzLAotCUJUX0NTUl9CQzgJCT0gNCwKLQlCVF9SVEw4NzU2CQk9IDUsCi0JQlRfUlRMODcyM0EJCT0gNgotfTsKLQotZW51bSBidF9yYWRpb3NoYXJlZCB7Ci0JQlRfUmFkaW9fU2hhcmVkCQk9IDAsCi0JQlRfUmFkaW9fSW5kaXZpZHVhbAk9IDEsCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9yZWN2LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfcmVjdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzVkMzdiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9yZWN2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVEw4NzIzQV9SRUNWX0hfXwotI2RlZmluZSBfX1JUTDg3MjNBX1JFQ1ZfSF9fCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNkZWZpbmUgTlJfUkVDVkJVRkYJCQk0Ci0KLSNkZWZpbmUgTlJfUFJFQUxMT0NfUkVDVl9TS0IJCTgKLQotI2RlZmluZSBSRUNWX0JMS19TWgkJCTUxMgotI2RlZmluZSBSRUNWX0JMS19DTlQJCQkxNgotI2RlZmluZSBSRUNWX0JMS19USAkJCVJFQ1ZfQkxLX0NOVAotCi0jZGVmaW5lIE1BWF9SRUNWQlVGX1NaCQkJMTUzNjAgLyogIDE1ayA8IDE2ayAqLwotCi0jZGVmaW5lIFBIWV9SU1NJX1NMSURfV0lOX01BWAkJMTAwCi0jZGVmaW5lIFBIWV9MSU5LUVVBTElUWV9TTElEX1dJTl9NQVgJMjAKLQotCi1zdHJ1Y3QgcGh5X3N0YXQgewotCXVuc2lnbmVkIGludCBwaHlkdzA7Ci0JdW5zaWduZWQgaW50IHBoeWR3MTsKLQl1bnNpZ25lZCBpbnQgcGh5ZHcyOwotCXVuc2lnbmVkIGludCBwaHlkdzM7Ci0JdW5zaWduZWQgaW50IHBoeWR3NDsKLQl1bnNpZ25lZCBpbnQgcGh5ZHc1OwotCXVuc2lnbmVkIGludCBwaHlkdzY7Ci0JdW5zaWduZWQgaW50IHBoeWR3NzsKLX07Ci0KLS8qICBSeCBzbW9vdGggZmFjdG9yICovCi0jZGVmaW5lCVJ4X1Ntb290aF9GYWN0b3IJCTIwCi0KLXN0cnVjdCBpbnRlcnJ1cHRfbXNnX2Zvcm1hdCB7Ci0JdW5zaWduZWQgaW50IEMySF9NU0cwOwotCXVuc2lnbmVkIGludCBDMkhfTVNHMTsKLQl1bnNpZ25lZCBpbnQgQzJIX01TRzI7Ci0JdW5zaWduZWQgaW50IEMySF9NU0czOwotCXVuc2lnbmVkIGludCBISVNSOyAvKiAgZnJvbSBISVNSIFJlZzB4MTI0LCByZWFkIHRvIGNsZWFyICovCi0JdW5zaWduZWQgaW50IEhJU1JFOy8qICBmcm9tIEhJU1JFIFJlZzB4MTJjLCByZWFkIHRvIGNsZWFyICovCi0JdW5zaWduZWQgaW50ICBNU0dfRVg7Ci19OwotCi1pbnQgcnRsODcyM2F1X2luaXRfcmVjdl9wcml2KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYXVfZnJlZV9yZWN2X3ByaXYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX3Byb2Nlc3NfcGh5X2luZm8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdm9pZCAqcHJmcmFtZSk7Ci12b2lkIHVwZGF0ZV9yZWN2ZnJhbWVfYXR0cmliKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgcmVjdl9zdGF0ICpwcnhzdGF0KTsKLXZvaWQgdXBkYXRlX3JlY3ZmcmFtZV9waHlpbmZvKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgcGh5X3N0YXQgKnBwaHlfaW5mbyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX3JmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfcmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzMjc5OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfcmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUTDg3MjNBX1JGX0hfXwotI2RlZmluZSBfX1JUTDg3MjNBX1JGX0hfXwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIFBhcmFtZXRlcnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogICovCi0vKiAgRm9yIFJGIDYwNTIgU2VyaWVzICovCi0vKiAgKi8KLSNkZWZpbmUJCVJGNjA1Ml9NQVhfVFhfUFdSCQkJMHgzRgotI2RlZmluZQkJUkY2MDUyX01BWF9SRUcJCQkJMHgzRgotI2RlZmluZQkJUkY2MDUyX01BWF9QQVRICQkJCTIKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgUGFyYW1ldGVycy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIHN0cnVjdHVyZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBzdHJ1Y3R1cmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBNYXJjbyBEZWZpbml0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgTWFyY28gRGVmaW5pdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydGVkIEZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qICAqLwotLyogIFJGIFJMNjA1MiBTZXJpZXMgQVBJICovCi0vKiAgKi8KLXZvaWQgcnRsODcyM2FfcGh5X3JmNjA1MnNldF9idyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsCi0JCQkgICAgICAgZW51bSBodF9jaGFubmVsX3dpZHRoIEJhbmR3aWR0aCk7Ci12b2lkIHJ0bDgyM2FfcGh5X3JmNjA1MnNldGNja3R4cG93ZXIoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJCSAgICAgIHU4ICpwUG93ZXJsZXZlbCk7Ci12b2lkIHJ0bDg3MjNhX1BIWV9SRjYwNTJTZXRPRkRNVHhQb3dlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsCi0JCQkJICAgICAgIHU4ICpwUG93ZXJMZXZlbCwgdTggQ2hhbm5lbCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnRlZCBGdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1pbnQJUEhZX1JGNjA1Ml9Db25maWc4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9zcGVjLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2Ffc3BlYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjE4Njg5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9zcGVjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVEw4NzIzQV9TUEVDX0hfXwotI2RlZmluZSBfX1JUTDg3MjNBX1NQRUNfSF9fCi0KLS8qICAqLwotLyogICovCi0vKgkweDAwMDBoIH4gMHgwMEZGaAlTeXN0ZW0gQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLSNkZWZpbmUgUkVHX1NZU19JU09fQ1RSTAkJMHgwMDAwCi0jZGVmaW5lIFJFR19TWVNfRlVOQ19FTgkJCTB4MDAwMgotI2RlZmluZSBSRUdfQVBTX0ZTTUNPCQkJMHgwMDA0Ci0jZGVmaW5lIFJFR19TWVNfQ0xLUgkJCTB4MDAwOAotI2RlZmluZSBSRUdfOTM0NkNSCQkJMHgwMDBBCi0jZGVmaW5lIFJFR19FRV9WUEQJCQkweDAwMEMKLSNkZWZpbmUgUkVHX0FGRV9NSVNDCQkJMHgwMDEwCi0jZGVmaW5lIFJFR19TUFMwX0NUUkwJCQkweDAwMTEKLSNkZWZpbmUgUkVHX1NQU19PQ1BfQ0ZHCQkJMHgwMDE4Ci0jZGVmaW5lIFJFR19SU1ZfQ1RSTAkJCTB4MDAxQwotI2RlZmluZSBSRUdfUkZfQ1RSTAkJCTB4MDAxRgotI2RlZmluZSBSRUdfTERPQTE1X0NUUkwJCQkweDAwMjAKLSNkZWZpbmUgUkVHX0xET1YxMkRfQ1RSTAkJMHgwMDIxCi0jZGVmaW5lIFJFR19MRE9IQ0kxMl9DVFJMCQkweDAwMjIKLSNkZWZpbmUgUkVHX0xQTERPX0NUUkwJCQkweDAwMjMKLSNkZWZpbmUgUkVHX0FGRV9YVEFMX0NUUkwJCTB4MDAyNAotI2RlZmluZSBSRUdfQUZFX1BMTF9DVFJMCQkweDAwMjgKLSNkZWZpbmUgUkVHX01BQ19QSFlfQ1RSTAkJMHgwMDJjCi0jZGVmaW5lIFJFR19FRlVTRV9DVFJMCQkJMHgwMDMwCi0jZGVmaW5lIFJFR19FRlVTRV9URVNUCQkJMHgwMDM0Ci0jZGVmaW5lIFJFR19QV1JfREFUQQkJCTB4MDAzOAotI2RlZmluZSBSRUdfQ0FMX1RJTUVSCQkJMHgwMDNDCi0jZGVmaW5lIFJFR19BQ0xLX01PTgkJCTB4MDAzRQotI2RlZmluZSBSRUdfR1BJT19NVVhDRkcJCQkweDAwNDAKLSNkZWZpbmUgUkVHX0dQSU9fSU9fU0VMCQkJMHgwMDQyCi0jZGVmaW5lIFJFR19NQUNfUElOTVVYX0NGRwkJMHgwMDQzCi0jZGVmaW5lIFJFR19HUElPX1BJTl9DVFJMCQkweDAwNDQKLSNkZWZpbmUgUkVHX0dQSU9fSU5UTQkJCTB4MDA0OAotI2RlZmluZSBSRUdfTEVEQ0ZHMAkJCTB4MDA0QwotI2RlZmluZSBSRUdfTEVEQ0ZHMQkJCTB4MDA0RAotI2RlZmluZSBSRUdfTEVEQ0ZHMgkJCTB4MDA0RQotI2RlZmluZSBSRUdfTEVEQ0ZHMwkJCTB4MDA0RgotI2RlZmluZSBSRUdfTEVEQ0ZHCQkJUkVHX0xFRENGRzIKLSNkZWZpbmUgUkVHX0ZTSU1SCQkJMHgwMDUwCi0jZGVmaW5lIFJFR19GU0lTUgkJCTB4MDA1NAotI2RlZmluZSBSRUdfSFNJTVIJCQkweDAwNTgKLSNkZWZpbmUgUkVHX0hTSVNSCQkJMHgwMDVjCi0gLyogIFJUTDg3MjMgV0lGSS9CVC9HUFMgTXVsdGktRnVuY3Rpb24gR1BJTyBQaW4gQ29udHJvbC4gKi8KLSNkZWZpbmUgUkVHX0dQSU9fUElOX0NUUkxfMgkJMHgwMDYwCi0gLyogIFJUTDg3MjMgV0lGSS9CVC9HUFMgTXVsdGktRnVuY3Rpb24gR1BJTyBTZWxlY3QuICovCi0jZGVmaW5lIFJFR19HUElPX0lPX1NFTF8yCQkweDAwNjIKLSAvKiAgUlRMODcyMyBXSUZJL0JUL0dQUyBNdWx0aS1GdW5jdGlvbiBjb250cm9sIHNvdXJjZS4gKi8KLSNkZWZpbmUgUkVHX01VTFRJX0ZVTkNfQ1RSTAkJMHgwMDY4Ci0jZGVmaW5lIFJFR19NQ1VGV0RMCQkJMHgwMDgwCi0jZGVmaW5lIFJFR19ITUVCT1hfRVhUXzAJCTB4MDA4OAotI2RlZmluZSBSRUdfSE1FQk9YX0VYVF8xCQkweDAwOEEKLSNkZWZpbmUgUkVHX0hNRUJPWF9FWFRfMgkJMHgwMDhDCi0jZGVmaW5lIFJFR19ITUVCT1hfRVhUXzMJCTB4MDA4RQotCS8qICBIb3N0IHN1c3BlbmQgY291bnRlciBvbiBGUEdBIHBsYXRmb3JtICovCi0jZGVmaW5lIFJFR19IT1NUX1NVU1BfQ05UCQkweDAwQkMKLQkvKiAgRWZ1c2UgYWNjZXNzIHByb3RlY3Rpb24gZm9yIFJUTDg3MjMgKi8KLSNkZWZpbmUgUkVHX0VGVVNFX0FDQ0VTUwkJMHgwMENGCi0jZGVmaW5lIFJFR19CSVNUX1NDQU4JCQkweDAwRDAKLSNkZWZpbmUgUkVHX0JJU1RfUlBUCQkJMHgwMEQ0Ci0jZGVmaW5lIFJFR19CSVNUX1JPTV9SUFQJCTB4MDBEOAotI2RlZmluZSBSRUdfVVNCX1NJRV9JTlRGCQkweDAwRTAKLSNkZWZpbmUgUkVHX1BDSUVfTUlPX0lOVEYJCTB4MDBFNAotI2RlZmluZSBSRUdfUENJRV9NSU9fSU5URAkJMHgwMEU4Ci0jZGVmaW5lIFJFR19IUE9OX0ZTTQkJCTB4MDBFQwotI2RlZmluZSBSRUdfU1lTX0NGRwkJCTB4MDBGMAotI2RlZmluZSBSRUdfR1BJT19PVVRTVFMJCQkweDAwRjQJLyogIEZvciBSVEw4NzIzIG9ubHkuICovCi0KLS8qICAqLwotLyogICovCi0vKgkweDAxMDBoIH4gMHgwMUZGaAlNQUNUT1AgR2VuZXJhbCBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotI2RlZmluZSBSRUdfQ1IJCQkJMHgwMTAwCi0jZGVmaW5lIFJFR19QQlAJCQkJMHgwMTA0Ci0jZGVmaW5lIFJFR19UUlhETUFfQ1RSTAkJCTB4MDEwQwotI2RlZmluZSBSRUdfVFJYRkZfQk5EWQkJCTB4MDExNAotI2RlZmluZSBSRUdfVFJYRkZfU1RBVFVTCQkweDAxMTgKLSNkZWZpbmUgUkVHX1JYRkZfUFRSCQkJMHgwMTFDCi0jZGVmaW5lIFJFR19ISU1SCQkJMHgwMTIwCi0jZGVmaW5lIFJFR19ISVNSCQkJMHgwMTI0Ci0jZGVmaW5lIFJFR19ISU1SRQkJCTB4MDEyOAotI2RlZmluZSBSRUdfSElTUkUJCQkweDAxMkMKLSNkZWZpbmUgUkVHX0NQV00JCQkweDAxMkYKLSNkZWZpbmUgUkVHX0ZXSU1SCQkJMHgwMTMwCi0jZGVmaW5lIFJFR19GV0lTUgkJCTB4MDEzNAotI2RlZmluZSBSRUdfUEtUQlVGX0RCR19DVFJMCQkweDAxNDAKLSNkZWZpbmUgUkVHX1BLVEJVRl9EQkdfREFUQV9MCQkweDAxNDQKLSNkZWZpbmUgUkVHX1BLVEJVRl9EQkdfREFUQV9ICQkweDAxNDgKLQotI2RlZmluZSBSRUdfVEMwX0NUUkwJCQkweDAxNTAKLSNkZWZpbmUgUkVHX1RDMV9DVFJMCQkJMHgwMTU0Ci0jZGVmaW5lIFJFR19UQzJfQ1RSTAkJCTB4MDE1OAotI2RlZmluZSBSRUdfVEMzX0NUUkwJCQkweDAxNUMKLSNkZWZpbmUgUkVHX1RDNF9DVFJMCQkJMHgwMTYwCi0jZGVmaW5lIFJFR19UQ1VOSVRfQkFTRQkJCTB4MDE2NAotI2RlZmluZSBSRUdfTUJJU1RfU1RBUlQJCQkweDAxNzQKLSNkZWZpbmUgUkVHX01CSVNUX0RPTkUJCQkweDAxNzgKLSNkZWZpbmUgUkVHX01CSVNUX0ZBSUwJCQkweDAxN0MKLSNkZWZpbmUgUkVHX0MySEVWVF9NU0dfTk9STUFMCQkweDAxQTAKLSNkZWZpbmUgUkVHX0MySEVWVF9DTEVBUgkJMHgwMUFGCi0jZGVmaW5lIFJFR19DMkhFVlRfTVNHX1RFU1QJCTB4MDFCOAotI2RlZmluZSBSRUdfTUNVVFNUXzEJCQkweDAxYzAKLSNkZWZpbmUgUkVHX0ZNRVRIUgkJCTB4MDFDOAotI2RlZmluZSBSRUdfSE1FVEZSCQkJMHgwMUNDCi0jZGVmaW5lIFJFR19ITUVCT1hfMAkJCTB4MDFEMAotI2RlZmluZSBSRUdfSE1FQk9YXzEJCQkweDAxRDQKLSNkZWZpbmUgUkVHX0hNRUJPWF8yCQkJMHgwMUQ4Ci0jZGVmaW5lIFJFR19ITUVCT1hfMwkJCTB4MDFEQwotCi0jZGVmaW5lIFJFR19MTFRfSU5JVAkJCTB4MDFFMAotI2RlZmluZSBSRUdfQkJfQUNDRUVTU19DVFJMCQkweDAxRTgKLSNkZWZpbmUgUkVHX0JCX0FDQ0VTU19EQVRBCQkweDAxRUMKLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMjAwaCB+IDB4MDI3RmgJVFhETUEgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLSNkZWZpbmUgUkVHX1JRUE4JCQkweDAyMDAKLSNkZWZpbmUgUkVHX0ZJRk9QQUdFCQkJMHgwMjA0Ci0jZGVmaW5lIFJFR19UREVDVFJMCQkJMHgwMjA4Ci0jZGVmaW5lIFJFR19UWERNQV9PRkZTRVRfQ0hLCQkweDAyMEMKLSNkZWZpbmUgUkVHX1RYRE1BX1NUQVRVUwkJMHgwMjEwCi0jZGVmaW5lIFJFR19SUVBOX05QUQkJCTB4MDIxNAotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMjgwaCB+IDB4MDJGRmgJUlhETUEgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLSNkZWZpbmUgUkVHX1JYRE1BX0FHR19QR19USAkJMHgwMjgwCi0jZGVmaW5lIFJFR19SWFBLVF9OVU0JCQkweDAyODQKLSNkZWZpbmUgUkVHX1JYRE1BX1NUQVRVUwkJMHgwMjg4Ci0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDMwMGggfiAweDAzRkZoCVBDSWUgKi8KLS8qICAqLwotLyogICovCi0jZGVmaW5lCVJFR19QQ0lFX0NUUkxfUkVHCQkweDAzMDAKLSNkZWZpbmUJUkVHX0lOVF9NSUcJCQkweDAzMDQJLyogIEludGVycnVwdCBNaWdyYXRpb24gKi8KLQkvKiAgVFggQmVhY29uIERlc2NyaXB0b3IgQWRkcmVzcyAqLwotI2RlZmluZQlSRUdfQkNOUV9ERVNBCQkJMHgwMzA4Ci0JLyogIFRYIEhpZ2ggUXVldWUgRGVzY3JpcHRvciBBZGRyZXNzICovCi0jZGVmaW5lCVJFR19IUV9ERVNBCQkJMHgwMzEwCi0JLyogIFRYIE1hbmFnZSBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KLSNkZWZpbmUJUkVHX01HUV9ERVNBCQkJMHgwMzE4Ci0JLyogIFRYIFZPIFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcyAqLwotI2RlZmluZQlSRUdfVk9RX0RFU0EJCQkweDAzMjAKLQkvKiAgVFggVkkgUXVldWUgRGVzY3JpcHRvciBBZGRyZXNzICovCi0jZGVmaW5lCVJFR19WSVFfREVTQQkJCTB4MDMyOAotCS8qICBUWCBCRSBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KLSNkZWZpbmUJUkVHX0JFUV9ERVNBCQkJMHgwMzMwCi0JLyogIFRYIEJLIFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcyAqLwotI2RlZmluZQlSRUdfQktRX0RFU0EJCQkweDAzMzgKLQkvKiAgUlggUXVldWUJRGVzY3JpcHRvciBBZGRyZXNzICovCi0jZGVmaW5lCVJFR19SWF9ERVNBCQkJMHgwMzQwCi0JLyogIEJhY2tkb29yIFJFRyBmb3IgQWNjZXNzIENvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUJUkVHX0RCSQkJCQkweDAzNDgKLQkvKiAgTURJTyBmb3IgQWNjZXNzIFBDSUUgUEhZICovCi0jZGVmaW5lCVJFR19NRElPCQkJMHgwMzU0Ci0JLyogIERlYnVnIFNlbGVjdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlSRUdfREJHX1NFTAkJCTB4MDM2MAotCS8qIFBDSWUgUlBXTSAqLwotI2RlZmluZQlSRUdfUENJRV9IUlBXTQkJCTB4MDM2MQotCS8qIFBDSWUgQ1BXTSAqLwotI2RlZmluZQlSRUdfUENJRV9IQ1BXTQkJCTB4MDM2MwotCS8qICBVQVJUCUNvbnRyb2wgKi8KLSNkZWZpbmUJUkVHX1VBUlRfQ1RSTAkJCTB4MDM2NAotCS8qICBVQVJUIFRYIERlc2NyaXB0b3IgQWRkcmVzcyAqLwotI2RlZmluZQlSRUdfVUFSVF9UWF9ERVNBCQkweDAzNzAKLQkvKiAgVUFSVCBSeCBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KLSNkZWZpbmUJUkVHX1VBUlRfUlhfREVTQQkJMHgwMzc4Ci0KLQotLyogIHNwZWMgdmVyc2lvbiAxMSAqLwotLyogICovCi0vKiAgKi8KLS8qCTB4MDQwMGggfiAweDA0N0ZoCVByb3RvY29sIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0jZGVmaW5lIFJFR19WT1FfSU5GT1JNQVRJT04JCTB4MDQwMAotI2RlZmluZSBSRUdfVklRX0lORk9STUFUSU9OCQkweDA0MDQKLSNkZWZpbmUgUkVHX0JFUV9JTkZPUk1BVElPTgkJMHgwNDA4Ci0jZGVmaW5lIFJFR19CS1FfSU5GT1JNQVRJT04JCTB4MDQwQwotI2RlZmluZSBSRUdfTUdRX0lORk9STUFUSU9OCQkweDA0MTAKLSNkZWZpbmUgUkVHX0hHUV9JTkZPUk1BVElPTgkJMHgwNDE0Ci0jZGVmaW5lIFJFR19CQ05RX0lORk9STUFUSU9OCQkweDA0MTgKLQotCi0jZGVmaW5lIFJFR19DUFVfTUdRX0lORk9STUFUSU9OCQkweDA0MUMKLSNkZWZpbmUgUkVHX0ZXSFdfVFhRX0NUUkwJCTB4MDQyMAotI2RlZmluZSBSRUdfSFdTRVFfQ1RSTAkJCTB4MDQyMwotI2RlZmluZSBSRUdfVFhQS1RCVUZfQkNOUV9CRE5ZCQkweDA0MjQKLSNkZWZpbmUgUkVHX1RYUEtUQlVGX01HUV9CRE5ZCQkweDA0MjUKLSNkZWZpbmUgUkVHX0xJRkVUSU1FX0VOCQkJMHgwNDI2Ci0jZGVmaW5lIFJFR19NVUxUSV9CQ05RX09GRlNFVAkJMHgwNDI3Ci0jZGVmaW5lIFJFR19TUEVDX1NJRlMJCQkweDA0MjgKLSNkZWZpbmUgUkVHX1JMCQkJCTB4MDQyQQotI2RlZmluZSBSRUdfREFSRlJDCQkJMHgwNDMwCi0jZGVmaW5lIFJFR19SQVJGUkMJCQkweDA0MzgKLSNkZWZpbmUgUkVHX1JSU1IJCQkweDA0NDAKLSNkZWZpbmUgUkVHX0FSRlIwCQkJMHgwNDQ0Ci0jZGVmaW5lIFJFR19BUkZSMQkJCTB4MDQ0OAotI2RlZmluZSBSRUdfQVJGUjIJCQkweDA0NEMKLSNkZWZpbmUgUkVHX0FSRlIzCQkJMHgwNDUwCi0jZGVmaW5lIFJFR19BR0dMRU5fTE1UCQkJMHgwNDU4Ci0jZGVmaW5lIFJFR19BTVBEVV9NSU5fU1BBQ0UJCTB4MDQ1QwotI2RlZmluZSBSRUdfVFhQS1RCVUZfV01BQ19MQktfQkZfSEQJMHgwNDVECi0jZGVmaW5lIFJFR19GQVNUX0VEQ0FfQ1RSTAkJMHgwNDYwCi0jZGVmaW5lIFJFR19SRF9SRVNQX1BLVF9USAkJMHgwNDYzCi0jZGVmaW5lIFJFR19JTklSVFNfUkFURV9TRUwJCTB4MDQ4MAotI2RlZmluZSBSRUdfSU5JREFUQV9SQVRFX1NFTAkJMHgwNDg0Ci0KLQotI2RlZmluZSBSRUdfUE9XRVJfU1RBVFVTCQkweDA0QTQKLSNkZWZpbmUgUkVHX1BPV0VSX1NUQUdFMQkJMHgwNEI0Ci0jZGVmaW5lIFJFR19QT1dFUl9TVEFHRTIJCTB4MDRCOAotI2RlZmluZSBSRUdfUEtUX1ZPX1ZJX0xJRkVfVElNRQkJMHgwNEMwCi0jZGVmaW5lIFJFR19QS1RfQkVfQktfTElGRV9USU1FCQkweDA0QzIKLSNkZWZpbmUgUkVHX1NUQkNfU0VUVElORwkJMHgwNEM0Ci0jZGVmaW5lIFJFR19QUk9UX01PREVfQ1RSTAkJMHgwNEM4Ci0jZGVmaW5lIFJFR19NQVhfQUdHUl9OVU0JCTB4MDRDQQotI2RlZmluZSBSRUdfUlRTX01BWF9BR0dSX05VTQkJMHgwNENCCi0jZGVmaW5lIFJFR19CQVJfTU9ERV9DVFJMCQkweDA0Q0MKLSNkZWZpbmUgUkVHX1JBX1RSWV9SQVRFX0FHR19MTVQJCTB4MDRDRgotI2RlZmluZSBSRUdfTlFPU19TRVEJCQkweDA0REMKLSNkZWZpbmUgUkVHX1FPU19TRVEJCQkweDA0REUKLSNkZWZpbmUgUkVHX05FRURfQ1BVX0hBTkRMRQkJMHgwNEUwCi0jZGVmaW5lIFJFR19QS1RfTE9TRV9SUFQJCTB4MDRFMQotI2RlZmluZSBSRUdfUFRDTF9FUlJfU1RBVFVTCQkweDA0RTIKLSNkZWZpbmUgUkVHX0RVTU1ZCQkJMHgwNEZDCi0KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwNTAwaCB+IDB4MDVGRmgJRURDQSBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotI2RlZmluZSBSRUdfRURDQV9WT19QQVJBTQkJMHgwNTAwCi0jZGVmaW5lIFJFR19FRENBX1ZJX1BBUkFNCQkweDA1MDQKLSNkZWZpbmUgUkVHX0VEQ0FfQkVfUEFSQU0JCTB4MDUwOAotI2RlZmluZSBSRUdfRURDQV9CS19QQVJBTQkJMHgwNTBDCi0jZGVmaW5lIFJFR19CQ05UQ0ZHCQkJMHgwNTEwCi0jZGVmaW5lIFJFR19QSUZTCQkJMHgwNTEyCi0jZGVmaW5lIFJFR19SREdfUElGUwkJCTB4MDUxMwotI2RlZmluZSBSRUdfU0lGU19DQ0sJCQkweDA1MTQKLSNkZWZpbmUgUkVHX1NJRlNfT0ZETQkJCTB4MDUxNgotI2RlZmluZSBSRUdfU0lGU19DVFgJCQkweDA1MTQKLSNkZWZpbmUgUkVHX1NJRlNfVFJYCQkJMHgwNTE2Ci0jZGVmaW5lIFJFR19UU0ZUUl9TWU5fT0ZGU0VUCQkweDA1MTgKLSNkZWZpbmUgUkVHX0FHR1JfQlJFQUtfVElNRQkJMHgwNTFBCi0jZGVmaW5lIFJFR19TTE9UCQkJMHgwNTFCCi0jZGVmaW5lIFJFR19UWF9QVENMX0NUUkwJCTB4MDUyMAotI2RlZmluZSBSRUdfVFhQQVVTRQkJCTB4MDUyMgotI2RlZmluZSBSRUdfRElTX1RYUkVRX0NMUgkJMHgwNTIzCi0jZGVmaW5lIFJFR19SRF9DVFJMCQkJMHgwNTI0Ci0jZGVmaW5lIFJFR19UQlRUX1BST0hJQklUCQkweDA1NDAKLSNkZWZpbmUgUkVHX1JEX05BVl9OWFQJCQkweDA1NDQKLSNkZWZpbmUgUkVHX05BVl9QUk9UX0xFTgkJMHgwNTQ2Ci0jZGVmaW5lIFJFR19CQ05fQ1RSTAkJCTB4MDU1MAotI2RlZmluZSBSRUdfQkNOX0NUUkxfMQkJCTB4MDU1MQotI2RlZmluZSBSRUdfTUJJRF9OVU0JCQkweDA1NTIKLSNkZWZpbmUgUkVHX0RVQUxfVFNGX1JTVAkJMHgwNTUzCi0JLyogIFRoZSBzYW1lIGFzIFJFR19NQlNTSURfQkNOX1NQQUNFICovCi0jZGVmaW5lIFJFR19CQ05fSU5URVJWQUwJCTB4MDU1NAotI2RlZmluZSBSRUdfTUJTU0lEX0JDTl9TUEFDRQkJMHgwNTU0Ci0jZGVmaW5lIFJFR19EUlZFUkxZSU5UCQkJMHgwNTU4Ci0jZGVmaW5lIFJFR19CQ05ETUFUSU0JCQkweDA1NTkKLSNkZWZpbmUgUkVHX0FUSU1XTkQJCQkweDA1NUEKLSNkZWZpbmUgUkVHX0JDTl9NQVhfRVJSCQkJMHgwNTVECi0jZGVmaW5lIFJFR19SWFRTRl9PRkZTRVRfQ0NLCQkweDA1NUUKLSNkZWZpbmUgUkVHX1JYVFNGX09GRlNFVF9PRkRNCQkweDA1NUYKLSNkZWZpbmUgUkVHX1RTRlRSCQkJMHgwNTYwCi0jZGVmaW5lIFJFR19UU0ZUUjEJCQkweDA1NjgKLSNkZWZpbmUgUkVHX0lOSVRfVFNGVFIJCQkweDA1NjQKLSNkZWZpbmUgUkVHX0FUSU1XTkRfMQkJCTB4MDU3MAotI2RlZmluZSBSRUdfUFNUSU1FUgkJCTB4MDU4MAotI2RlZmluZSBSRUdfVElNRVIwCQkJMHgwNTg0Ci0jZGVmaW5lIFJFR19USU1FUjEJCQkweDA1ODgKLSNkZWZpbmUgUkVHX0FDTUhXQ1RSTAkJCTB4MDVDMAotI2RlZmluZSBSRUdfQUNNUlNUQ1RSTAkJCTB4MDVDMQotI2RlZmluZSBSRUdfQUNNQVZHCQkJMHgwNUMyCi0jZGVmaW5lIFJFR19WT19BRE1USU1FCQkJMHgwNUM0Ci0jZGVmaW5lIFJFR19WSV9BRE1USU1FCQkJMHgwNUM2Ci0jZGVmaW5lIFJFR19CRV9BRE1USU1FCQkJMHgwNUM4Ci0jZGVmaW5lIFJFR19FRENBX1JBTkRPTV9HRU4JCTB4MDVDQwotI2RlZmluZSBSRUdfU0NIX1RYQ01ECQkJMHgwNUQwCi0KLS8qIGRlZmluZSBSRUdfRldfVFNGX1NZTkNfQ05UCQkweDA0QTAgKi8KLSNkZWZpbmUgUkVHX0ZXX1JFU0VUX1RTRl9DTlRfMQkJMHgwNUZDCi0jZGVmaW5lIFJFR19GV19SRVNFVF9UU0ZfQ05UXzAJCTB4MDVGRAotI2RlZmluZSBSRUdfRldfQkNOX0RJU19DTlQJCTB4MDVGRQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwNjAwaCB+IDB4MDdGRmgJV01BQyBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotI2RlZmluZSBSRUdfQVBTRF9DVFJMCQkJMHgwNjAwCi0jZGVmaW5lIFJFR19CV09QTU9ERQkJCTB4MDYwMwotI2RlZmluZSBSRUdfVENSCQkJCTB4MDYwNAotI2RlZmluZSBSRUdfUkNSCQkJCTB4MDYwOAotI2RlZmluZSBSRUdfUlhfUEtUX0xJTUlUCQkweDA2MEMKLSNkZWZpbmUgUkVHX1JYX0RMS19USU1FCQkJMHgwNjBECi0jZGVmaW5lIFJFR19SWF9EUlZJTkZPX1NaCQkweDA2MEYKLQotI2RlZmluZSBSRUdfTUFDSUQJCQkweDA2MTAKLSNkZWZpbmUgUkVHX0JTU0lECQkJMHgwNjE4Ci0jZGVmaW5lIFJFR19NQVIJCQkJMHgwNjIwCi0jZGVmaW5lIFJFR19NQklEQ0FNQ0ZHCQkJMHgwNjI4Ci0KLSNkZWZpbmUgUkVHX1VTVElNRV9FRENBCQkJMHgwNjM4Ci0jZGVmaW5lIFJFR19NQUNfU1BFQ19TSUZTCQkweDA2M0EKLQotLyogIDIwMTAwNzE5IEpvc2VwaDogSGFyZHdhcmUgcmVnaXN0ZXIgZGVmaW5pdGlvbiBjaGFuZ2UuIChIVyBkYXRhc2hlZXQgdjU0KSAqLwotCS8qICBbMTU6OF1TSUZTX1IyVF9PRkRNLCBbNzowXVNJRlNfUjJUX0NDSyAqLwotI2RlZmluZSBSRUdfUjJUX1NJRlMJCQkweDA2M0MKLQkvKiAgWzE1OjhdU0lGU19UMlRfT0ZETSwgWzc6MF1TSUZTX1QyVF9DQ0sgKi8KLSNkZWZpbmUgUkVHX1QyVF9TSUZTCQkJMHgwNjNFCi0jZGVmaW5lIFJFR19BQ0tUTwkJCTB4MDY0MAotI2RlZmluZSBSRUdfQ1RTMlRPCQkJMHgwNjQxCi0jZGVmaW5lIFJFR19FSUZTCQkJMHgwNjQyCi0KLS8qIFdNQSwgQkEsIENDWCAqLwotI2RlZmluZSBSRUdfTkFWX0NUUkwJCQkweDA2NTAKLSNkZWZpbmUgUkVHX0JBQ0FNQ01ECQkJMHgwNjU0Ci0jZGVmaW5lIFJFR19CQUNBTUNPTlRFTlQJCTB4MDY1OAotI2RlZmluZSBSRUdfTEJETFkJCQkweDA2NjAKLSNkZWZpbmUgUkVHX0ZXRExZCQkJMHgwNjYxCi0jZGVmaW5lIFJFR19SWEVSUl9SUFQJCQkweDA2NjQKLSNkZWZpbmUgUkVHX1dNQUNfVFJYUFRDTF9DVEwJCTB4MDY2OAotCi0KLS8qICBTZWN1cml0eSAqLwotI2RlZmluZSBSRUdfQ0FNQ01ECQkJMHgwNjcwCi0jZGVmaW5lIFJFR19DQU1XUklURQkJCTB4MDY3NAotI2RlZmluZSBSRUdfQ0FNUkVBRAkJCTB4MDY3OAotI2RlZmluZSBSRUdfQ0FNREJHCQkJMHgwNjdDCi0jZGVmaW5lIFJFR19TRUNDRkcJCQkweDA2ODAKLQotLyogIFBvd2VyICovCi0jZGVmaW5lIFJFR19XT1dfQ1RSTAkJCTB4MDY5MAotI2RlZmluZSBSRUdfUFNTVEFUVVMJCQkweDA2OTEKLSNkZWZpbmUgUkVHX1BTX1JYX0lORk8JCQkweDA2OTIKLSNkZWZpbmUgUkVHX0xQTkFWX0NUUkwJCQkweDA2OTQKLSNkZWZpbmUgUkVHX1dLRk1DQU1fQ01ECQkJMHgwNjk4Ci0jZGVmaW5lIFJFR19XS0ZNQ0FNX1JXRAkJCTB4MDY5QwotI2RlZmluZSBSRUdfUlhGTFRNQVAwCQkJMHgwNkEwCi0jZGVmaW5lIFJFR19SWEZMVE1BUDEJCQkweDA2QTIKLSNkZWZpbmUgUkVHX1JYRkxUTUFQMgkJCTB4MDZBNAotI2RlZmluZSBSRUdfQkNOX1BTUl9SUFQJCQkweDA2QTgKLSNkZWZpbmUgUkVHX0NBTEIzMktfQ1RSTAkJMHgwNkFDCi0jZGVmaW5lIFJFR19QS1RfTU9OX0NUUkwJCTB4MDZCNAotI2RlZmluZSBSRUdfQlRfQ09FWF9UQUJMRQkJMHgwNkMwCi0jZGVmaW5lIFJFR19XTUFDX1JFU1BfVFhJTkZPCQkweDA2RDgKLQotI2RlZmluZSBSRUdfTUFDSUQxCQkJMHgwNzAwCi0jZGVmaW5lIFJFR19CU1NJRDEJCQkweDA3MDgKLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHhGRTAwaCB+IDB4RkU1NWgJVVNCIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0jZGVmaW5lIFJFR19VU0JfSU5GTwkJCTB4RkUxNwotI2RlZmluZSBSRUdfVVNCX1NQRUNJQUxfT1BUSU9OCQkweEZFNTUKLSNkZWZpbmUgUkVHX1VTQl9ETUFfQUdHX1RPCQkweEZFNUIKLSNkZWZpbmUgUkVHX1VTQl9BR0dfVE8JCQkweEZFNUMKLSNkZWZpbmUgUkVHX1VTQl9BR0dfVEgJCQkweEZFNUQKLQotLyogIEZvciB0ZXN0IGNoaXAgKi8KLSNkZWZpbmUgUkVHX1RFU1RfVVNCX1RYUVMJCTB4RkU0OAotI2RlZmluZSBSRUdfVEVTVF9TSUVfVklECQkweEZFNjAJCS8qICAweEZFNjB+MHhGRTYxICovCi0jZGVmaW5lIFJFR19URVNUX1NJRV9QSUQJCTB4RkU2MgkJLyogIDB4RkU2Mn4weEZFNjMgKi8KLSNkZWZpbmUgUkVHX1RFU1RfU0lFX09QVElPTkFMCQkweEZFNjQKLSNkZWZpbmUgUkVHX1RFU1RfU0lFX0NISVJQX0sJCTB4RkU2NQotI2RlZmluZSBSRUdfVEVTVF9TSUVfUEhZCQkweEZFNjYJCS8qICAweEZFNjZ+MHhGRTZCICovCi0jZGVmaW5lIFJFR19URVNUX1NJRV9NQUNfQUREUgkJMHhGRTcwCQkvKiAgMHhGRTcwfjB4RkU3NSAqLwotI2RlZmluZSBSRUdfVEVTVF9TSUVfU1RSSU5HCQkweEZFODAJCS8qICAweEZFODB+MHhGRUI5ICovCi0KLQotLyogIEZvciBub3JtYWwgY2hpcCAqLwotI2RlZmluZSBSRUdfTk9STUFMX1NJRV9WSUQJCTB4RkU2MAkJLyogIDB4RkU2MH4weEZFNjEgKi8KLSNkZWZpbmUgUkVHX05PUk1BTF9TSUVfUElECQkweEZFNjIJCS8qICAweEZFNjJ+MHhGRTYzICovCi0jZGVmaW5lIFJFR19OT1JNQUxfU0lFX09QVElPTkFMCQkweEZFNjQKLSNkZWZpbmUgUkVHX05PUk1BTF9TSUVfRVAJCTB4RkU2NQkJLyogIDB4RkU2NX4weEZFNjcgKi8KLSNkZWZpbmUgUkVHX05PUk1BTF9TSUVfUEhZCQkweEZFNjgJCS8qICAweEZFNjh+MHhGRTZCICovCi0jZGVmaW5lIFJFR19OT1JNQUxfU0lFX09QVElPTkFMMgkweEZFNkMKLSNkZWZpbmUgUkVHX05PUk1BTF9TSUVfR1BTX0VQCQkweEZFNkQJCS8qICBSVEw4NzIzIG9ubHkgKi8KLSNkZWZpbmUgUkVHX05PUk1BTF9TSUVfTUFDX0FERFIJCTB4RkU3MAkJLyogIDB4RkU3MH4weEZFNzUgKi8KLSNkZWZpbmUgUkVHX05PUk1BTF9TSUVfU1RSSU5HCQkweEZFODAJCS8qICAweEZFODB+MHhGRURGICovCi0KLQotLyogICovCi0vKiAgKi8KLS8qCVJlZGlmaW5lIDgxOTJDIHJlZ2lzdGVyIGRlZmluaXRpb24gZm9yIGNvbXBhdGliaWxpdHkgKi8KLS8qICAqLwotLyogICovCi0KLS8qICBUT0RPOiB1c2UgdGhlc2UgZGVmaW5pdGlvbiB3aGVuIHVzaW5nIFJFR194eHggbmFtaW5nIHJ1bGUuICovCi0vKiAgTk9URTogRE8gTk9UIFJlbW92ZSB0aGVzZSBkZWZpbml0aW9uLiBVc2UgbGF0ZXIuICovCi0KLQkvKiAgU3lzdGVtIElzb2xhdGlvbiBJbnRlcmZhY2UgQ29udHJvbC4gKi8KLSNkZWZpbmUJU1lTX0lTT19DVFJMCQkJUkVHX1NZU19JU09fQ1RSTAotCS8qICBTeXN0ZW0gRnVuY3Rpb24gRW5hYmxlLiAqLwotI2RlZmluZQlTWVNfRlVOQ19FTgkJCVJFR19TWVNfRlVOQ19FTgotI2RlZmluZQlTWVNfQ0xLCQkJCVJFR19TWVNfQ0xLUgotCS8qICA5M0M0Ni85M0M1NiBDb21tYW5kIFJlZ2lzdGVyLiAqLwotI2RlZmluZQlDUjkzNDYJCQkJUkVHXzkzNDZDUgotCS8qICBFLUZ1c2UgQ29udHJvbC4gKi8KLSNkZWZpbmUJRUZVU0VfQ1RSTAkJCVJFR19FRlVTRV9DVFJMCi0JLyogIEUtRnVzZSBUZXN0LiAqLwotI2RlZmluZQlFRlVTRV9URVNUCQkJUkVHX0VGVVNFX1RFU1QKLQkvKiAgTWVkaWEgU3RhdHVzIHJlZ2lzdGVyICovCi0jZGVmaW5lCU1TUgkJCQkoUkVHX0NSICsgMikKLSNkZWZpbmUJSVNSCQkJCVJFR19ISVNSCi0JLyogIFRpbWluZyBTeW5jIEZ1bmN0aW9uIFRpbWVyIFJlZ2lzdGVyLiAqLwotI2RlZmluZQlUU0ZSCQkJCVJFR19UU0ZUUgotCi0JLyogIE1BQyBJRCBSZWdpc3RlciwgT2Zmc2V0IDB4MDA1MC0weDAwNTMgKi8KLSNkZWZpbmUJTUFDSURSMAkJCQlSRUdfTUFDSUQKLQkvKiAgTUFDIElEIFJlZ2lzdGVyLCBPZmZzZXQgMHgwMDU0LTB4MDA1NSAqLwotI2RlZmluZQlNQUNJRFI0CQkJCShSRUdfTUFDSUQgKyA0KQotCi0jZGVmaW5lCVBCUAkJCQlSRUdfUEJQCi0KLQkvKiAgUmVkaWZpbmUgTUFDSUQgcmVnaXN0ZXIsIHRvIGNvbXBhdGlibGUgcHJpb3IgSUNzLiAqLwotI2RlZmluZQlJRFIwCQkJCU1BQ0lEUjAKLSNkZWZpbmUJSURSNAkJCQlNQUNJRFI0Ci0KLQotLyogICovCi0vKiAgOS4gU2VjdXJpdHkgQ29udHJvbCBSZWdpc3RlcnMJKE9mZnNldDogKSAqLwotLyogICovCi0JLyogIFNvZnR3YXJlIHdyaXRlIENBTSBpbnB1dCBjb250ZW50ICovCi0jZGVmaW5lCVdDQU1JCQkJCVJFR19DQU1XUklURQotCS8qICBTb2Z0d2FyZSByZWFkL3dyaXRlIENBTSBjb25maWcgKi8KLSNkZWZpbmUJUkNBTU8JCQkJUkVHX0NBTVJFQUQKLSNkZWZpbmUJQ0FNREJHCQkJCVJFR19DQU1EQkcKLQkvKiBTZWN1cml0eSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNFQ1IJCQkJUkVHX1NFQ0NGRwotCi0vKiAgVW51c2VkIHJlZ2lzdGVyICovCi0jZGVmaW5lCVVudXNlZFJlZ2lzdGVyCQkJMHgxQkYKLSNkZWZpbmUJRENBTQkJCQlVbnVzZWRSZWdpc3RlcgotI2RlZmluZQlQU1IJCQkJVW51c2VkUmVnaXN0ZXIKLSNkZWZpbmUJQkJBZGRyCQkJCVVudXNlZFJlZ2lzdGVyCi0jZGVmaW5lCVBoeURhdGFSCQkJVW51c2VkUmVnaXN0ZXIKLQotI2RlZmluZQlJbnZhbGlkQkJSRlZhbHVlCQkweDEyMzQ1Njc4Ci0KLS8qICBNaW4gU3BhY2luZyByZWxhdGVkIHNldHRpbmdzLiAqLwotI2RlZmluZQlNQVhfTVNTX0RFTlNJVFlfMlQJCTB4MTMKLSNkZWZpbmUJTUFYX01TU19ERU5TSVRZXzFUCQkweDBBCi0KLS8qICAqLwotLyogODE5MkMgQ21kOTM0NkNSIGJpdHMJCQkoT2Zmc2V0IDB4QSwgMTZiaXQpICovCi0vKiAgKi8KLQkgLyogIEVFUFJPTSBlbmFibGUgd2hlbiBzZXQgMSAqLwotI2RlZmluZQlDbWRFRVBST01fRW4JCQlCSVQoNSkKLQkvKiAgU3lzdGVtIEVFUFJPTSBzZWxlY3QsIDA6IGJvb3QgZnJvbSBFLUZVU0UsCi0JICAgIDE6IFRoZSBFRVBST00gdXNlZCBpcyA5MzQ2ICovCi0jZGVmaW5lCUNtZEVFUlBPTVNFTAkJCUJJVCg0KQotI2RlZmluZQlDbWQ5MzQ2Q1JfOTM1NlNFTAkJQklUKDQpCi0jZGVmaW5lCUF1dG9Mb2FkRUVQUk9NCQkJKENtZEVFUFJPTV9FbnxDbWRFRVJQT01TRUwpCi0jZGVmaW5lCUF1dG9Mb2FkRUZVU0UJCQlDbWRFRVBST01fRW4KLQotLyogICovCi0vKiA4MTkyQyBHUElPIE1VWCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChvZmZzZXQgMHg0MCwgNCBieXRlKSAqLwotLyogICovCi0jZGVmaW5lCUdQSU9TRUxfR1BJTwkJCTAKLSNkZWZpbmUJR1BJT1NFTF9FTkJUCQkJQklUKDUpCi0KLS8qICAqLwotLyogICAgICAgIDgxOTJDIEdQSU8gUElOIENvbnRyb2wgUmVnaXN0ZXIgKG9mZnNldCAweDQ0LCA0IGJ5dGUpICovCi0vKiAgKi8KLQkvKiAgR1BJTyBwaW5zIGlucHV0IHZhbHVlICovCi0jZGVmaW5lCUdQSU9fSU4JCQkJUkVHX0dQSU9fUElOX0NUUkwKLQkvKiAgR1BJTyBwaW5zIG91dHB1dCB2YWx1ZSAqLwotI2RlZmluZQlHUElPX09VVAkJCShSRUdfR1BJT19QSU5fQ1RSTCsxKQotCS8qICBHUElPIHBpbnMgb3V0cHV0IGVuYWJsZSB3aGVuIGEgYml0IGlzIHNldCB0byAiMSI7Ci0JICAgIG90aGVyd2lzZSwgaW5wdXQgaXMgY29uZmlndXJlZC4gKi8KLSNkZWZpbmUJR1BJT19JT19TRUwJCQkoUkVHX0dQSU9fUElOX0NUUkwrMikKLSNkZWZpbmUJR1BJT19NT0QJCQkoUkVHX0dQSU9fUElOX0NUUkwrMykKLQotLyogICovCi0vKiA4MTkyQyAoTVNSKSBNZWRpYSBTdGF0dXMgUmVnaXN0ZXIJKE9mZnNldCAweDRDLCA4IGJpdHMpICovCi0vKiAgKi8KLS8qCi1OZXR3b3JrIFR5cGUKLTAwOiBObyBsaW5rCi0wMTogTGluayBpbiBhZCBob2MgbmV0d29yawotMTA6IExpbmsgaW4gaW5mcmFzdHJ1Y3R1cmUgbmV0d29yawotMTE6IEFQIG1vZGUKLURlZmF1bHQ6IDAwYi4KLSovCi0jZGVmaW5lCU1TUl9OT0xJTksJCQkweDAwCi0jZGVmaW5lCU1TUl9BREhPQwkJCTB4MDEKLSNkZWZpbmUJTVNSX0lORlJBCQkJMHgwMgotI2RlZmluZQlNU1JfQVAJCQkJMHgwMwotCi0vKiAgKi8KLS8qICA2LiBBZGFwdGl2ZSBDb250cm9sIFJlZ2lzdGVycyAgKE9mZnNldDogMHgwMTYwIC0gMHgwMUNGKSAqLwotLyogICovCi0vKiAgKi8KLS8qIDgxOTJDIFJlc3BvbnNlIFJhdGUgU2V0IFJlZ2lzdGVyCShvZmZzZXQgMHgxODEsIDI0Yml0cykgKi8KLS8qICAqLwotI2RlZmluZQlSUlNSX1JTQ19PRkZTRVQJCQkyMQotI2RlZmluZQlSUlNSX1NIT1JUX09GRlNFVAkJMjMKLSNkZWZpbmUJUlJTUl9SU0NfQldfNDBNCQkJMHg2MDAwMDAKLSNkZWZpbmUJUlJTUl9SU0NfVVBTVUJDSE5MCQkweDQwMDAwMAotI2RlZmluZQlSUlNSX1JTQ19MT1dTVUJDSE5MCQkweDIwMDAwMAotI2RlZmluZQlSUlNSX1NIT1JUCQkJMHg4MDAwMDAKLSNkZWZpbmUJUlJTUl8xTQkJCQlCSVQoMCkKLSNkZWZpbmUJUlJTUl8yTQkJCQlCSVQoMSkKLSNkZWZpbmUJUlJTUl81XzVNCQkJQklUKDIpCi0jZGVmaW5lCVJSU1JfMTFNCQkJQklUKDMpCi0jZGVmaW5lCVJSU1JfNk0JCQkJQklUKDQpCi0jZGVmaW5lCVJSU1JfOU0JCQkJQklUKDUpCi0jZGVmaW5lCVJSU1JfMTJNCQkJQklUKDYpCi0jZGVmaW5lCVJSU1JfMThNCQkJQklUKDcpCi0jZGVmaW5lCVJSU1JfMjRNCQkJQklUKDgpCi0jZGVmaW5lCVJSU1JfMzZNCQkJQklUKDkpCi0jZGVmaW5lCVJSU1JfNDhNCQkJQklUKDEwKQotI2RlZmluZQlSUlNSXzU0TQkJCUJJVCgxMSkKLSNkZWZpbmUJUlJTUl9NQ1MwCQkJQklUKDEyKQotI2RlZmluZQlSUlNSX01DUzEJCQlCSVQoMTMpCi0jZGVmaW5lCVJSU1JfTUNTMgkJCUJJVCgxNCkKLSNkZWZpbmUJUlJTUl9NQ1MzCQkJQklUKDE1KQotI2RlZmluZQlSUlNSX01DUzQJCQlCSVQoMTYpCi0jZGVmaW5lCVJSU1JfTUNTNQkJCUJJVCgxNykKLSNkZWZpbmUJUlJTUl9NQ1M2CQkJQklUKDE4KQotI2RlZmluZQlSUlNSX01DUzcJCQlCSVQoMTkpCi0jZGVmaW5lCUJSU1JfQWNrU2hvcnRQbWIJCUJJVCgyMykKLS8qICBDQ0sgQUNLOiB1c2UgU2hvcnQgUHJlYW1ibGUgb3Igbm90ICovCi0KLS8qICAqLwotLyogODE5MkMgQldfT1BNT0RFIGJpdHMJCQkoT2Zmc2V0IDB4MjAzLCA4Yml0KSAqLwotLyogICovCi0jZGVmaW5lCUJXX09QTU9ERV8yME1IWgkJCUJJVCgyKQotI2RlZmluZQlCV19PUE1PREVfNUcJCQlCSVQoMSkKLSNkZWZpbmUJQldfT1BNT0RFXzExSgkJCUJJVCgwKQotCi0KLS8qICAqLwotLyogODE5MkMgQ0FNIENvbmZpZyBTZXR0aW5nIChvZmZzZXQgMHgyNTAsIDEgYnl0ZSkgKi8KLS8qICAqLwotI2RlZmluZQlDQU1fVkFMSUQJCQlCSVQoMTUpCi0jZGVmaW5lCUNBTV9OT1RWQUxJRAkJCTB4MDAwMAotI2RlZmluZQlDQU1fVVNFREsJCQlCSVQoNSkKLQotI2RlZmluZQlDQU1fQ09OVEVOVF9DT1VOVAkJOAotCi0jZGVmaW5lCUNBTV9OT05FCQkJMHgwCi0jZGVmaW5lCUNBTV9XRVA0MAkJCTB4MDEKLSNkZWZpbmUJQ0FNX1RLSVAJCQkweDAyCi0jZGVmaW5lCUNBTV9BRVMJCQkJMHgwNAotI2RlZmluZQlDQU1fV0VQMTA0CQkJMHgwNQotCi0jZGVmaW5lCVRPVEFMX0NBTV9FTlRSWQkJCTMyCi0jZGVmaW5lCUhBTEZfQ0FNX0VOVFJZCQkJMTYKLQotI2RlZmluZQlDQU1fQ09ORklHX1VTRURLCQl0cnVlCi0jZGVmaW5lCUNBTV9DT05GSUdfTk9fVVNFREsJCWZhbHNlCi0KLSNkZWZpbmUJQ0FNX1dSSVRFCQkJQklUKDE2KQotI2RlZmluZQlDQU1fUkVBRAkJCTB4MDAwMDAwMDAKLSNkZWZpbmUJQ0FNX1BPTExJTklHCQkJQklUKDMxKQotCi0jZGVmaW5lCVNDUl9Vc2VESwkJCTB4MDEKLSNkZWZpbmUJU0NSX1R4U2VjRW5hYmxlCQkJMHgwMgotI2RlZmluZQlTQ1JfUnhTZWNFbmFibGUJCQkweDA0Ci0KLQotLyogICovCi0vKiAgMTIuIEhvc3QgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcnMJIChPZmZzZXQ6IDB4MDMwMCAtIDB4MDMwRikgKi8KLS8qICAqLwotLyogICovCi0vKiA4MTkwIElNUi9JU1IgYml0cwkJCShvZmZzZXQgMHhmZCwgIDhiaXRzKSAqLwotLyogICovCi0jZGVmaW5lCUlNUjgxOTBfRElTQUJMRUQJCTB4MAotLyogIElNUiBEVzAgQml0IDAtMzEgKi8KLQotI2RlZmluZQlJTVJfQkNORE1BSU5UNgkJCUJJVCgzMSkJLyogIEJlYWNvbiBETUEgSW50ZXJydXB0IDYgKi8KLSNkZWZpbmUJSU1SX0JDTkRNQUlOVDUJCQlCSVQoMzApCS8qICBCZWFjb24gRE1BIEludGVycnVwdCA1ICovCi0jZGVmaW5lCUlNUl9CQ05ETUFJTlQ0CQkJQklUKDI5KQkvKiAgQmVhY29uIERNQSBJbnRlcnJ1cHQgNCAqLwotI2RlZmluZQlJTVJfQkNORE1BSU5UMwkJCUJJVCgyOCkJLyogIEJlYWNvbiBETUEgSW50ZXJydXB0IDMgKi8KLSNkZWZpbmUJSU1SX0JDTkRNQUlOVDIJCQlCSVQoMjcpCS8qICBCZWFjb24gRE1BIEludGVycnVwdCAyICovCi0jZGVmaW5lCUlNUl9CQ05ETUFJTlQxCQkJQklUKDI2KQkvKiAgQmVhY29uIERNQSBJbnRlcnJ1cHQgMSAqLwotI2RlZmluZQlJTVJfQkNORE9LOAkJCUJJVCgyNSkJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgOCAqLwotI2RlZmluZQlJTVJfQkNORE9LNwkJCUJJVCgyNCkJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgNyAqLwotI2RlZmluZQlJTVJfQkNORE9LNgkJCUJJVCgyMykJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgNiAqLwotI2RlZmluZQlJTVJfQkNORE9LNQkJCUJJVCgyMikJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgNSAqLwotI2RlZmluZQlJTVJfQkNORE9LNAkJCUJJVCgyMSkJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgNCAqLwotI2RlZmluZQlJTVJfQkNORE9LMwkJCUJJVCgyMCkJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgMyAqLwotI2RlZmluZQlJTVJfQkNORE9LMgkJCUJJVCgxOSkJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgMiAqLwotI2RlZmluZQlJTVJfQkNORE9LMQkJCUJJVCgxOCkJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgMSAqLwotI2RlZmluZQlJTVJfVElNRU9VVDIJCQlCSVQoMTcpCS8qICBUaW1lb3V0IGludGVycnVwdCAyICovCi0jZGVmaW5lCUlNUl9USU1FT1VUMQkJCUJJVCgxNikJLyogIFRpbWVvdXQgaW50ZXJydXB0IDEgKi8KLSNkZWZpbmUJSU1SX1RYRk9WVwkJCUJJVCgxNSkJLyogIFRyYW5zbWl0IEZJRk8gT3ZlcmZsb3cgKi8KLSNkZWZpbmUJSU1SX1BTVElNRU9VVAkJCUJJVCgxNCkJLyogIFBvd2VyIHNhdmUgdGltZSBvdXQKLQkJCQkJCSAgICBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUJSU1SX0JjbkludAkJCUJJVCgxMykJLyogIEJlYWNvbiBETUEgSW50ZXJydXB0IDAgKi8KLSNkZWZpbmUJSU1SX1JYRk9WVwkJCUJJVCgxMikJLyogIFJlY2VpdmUgRklGTyBPdmVyZmxvdyAqLwotI2RlZmluZQlJTVJfUkRVCQkJCUJJVCgxMSkJLyogIFJlY2VpdmUgRGVzY3JpcHRvcgotCQkJCQkJICAgIFVuYXZhaWxhYmxlICovCi0jZGVmaW5lCUlNUl9BVElNRU5ECQkJQklUKDEwKQkvKiAgRm9yIDkyQyxBVElNIFdpbmRvdwotCQkJCQkJICAgIEVuZCBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJSU1SX0JET0sJCQlCSVQoOSkJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cCAqLwotI2RlZmluZQlJTVJfSElHSERPSwkJCUJJVCg4KQkvKiAgSGlnaCBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJSU1SX1RCRE9LCQkJQklUKDcpCS8qICBUcmFuc21pdCBCZWFjb24gT0sKLQkJCQkJCSAgICBpbnRlcnJ1cCAqLwotI2RlZmluZQlJTVJfTUdOVERPSwkJCUJJVCg2KQkvKiAgTWFuYWdlbWVudCBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJSU1SX1RCREVSCQkJQklUKDUpCS8qICBGb3IgOTJDLFRyYW5zbWl0IEJlYWNvbgotCQkJCQkJICAgIEVycm9yIEludGVycnVwdCAqLwotI2RlZmluZQlJTVJfQktET0sJCQlCSVQoNCkJLyogIEFDX0JLIERNQSBPSyBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJSU1SX0JFRE9LCQkJQklUKDMpCS8qICBBQ19CRSBETUEgT0sgSW50ZXJydXB0ICovCi0jZGVmaW5lCUlNUl9WSURPSwkJCUJJVCgyKQkvKiAgQUNfVkkgRE1BIE9LIEludGVycnVwdCAqLwotI2RlZmluZQlJTVJfVk9ET0sJCQlCSVQoMSkJLyogIEFDX1ZPIERNQSBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJSU1SX1JPSwkJCQlCSVQoMCkJLyogIFJlY2VpdmUgRE1BIE9LIEludGVycnVwdCAqLwotCi0jZGVmaW5lCUlNUl9SWF9NQVNLCQkJKElNUl9ST0t8SU1SX1JEVXxJTVJfUlhGT1ZXKQotI2RlZmluZQlJTVJfVFhfTUFTSwkJCShJTVJfVk9ET0t8SU1SX1ZJRE9LfElNUl9CRURPS3wgXAotCQkJCQkgSU1SX0JLRE9LfElNUl9NR05URE9LfElNUl9ISUdIRE9LfCBcCi0JCQkJCSBJTVJfQkRPSykKLQotLyogIDEzLiBIb3N0IEludGVycnVwdCBTdGF0dXMgRXh0ZW5zaW9uIFJlZ2lzdGVyIChPZmZzZXQ6IDB4MDEyQy0wMTJFaCkgKi8KLSNkZWZpbmUJSU1SX0JjbkludF9FCQkJQklUKDEyKQotI2RlZmluZQlJTVJfVFhFUlIJCQlCSVQoMTEpCi0jZGVmaW5lCUlNUl9SWEVSUgkJCUJJVCgxMCkKLSNkZWZpbmUJSU1SX0MySENNRAkJCUJJVCg5KQotI2RlZmluZQlJTVJfQ1BXTQkJCUJJVCg4KQotLyogUlNWRCBbMi03XSAqLwotI2RlZmluZQlJTVJfT0NQSU5UCQkJQklUKDEpCi0jZGVmaW5lCUlNUl9XTEFOT0ZGCQkJQklUKDApCi0KLQotLyogICAgICAgIDgxOTJDIEVFUFJPTS9FRlVTRSBzaGFyZSByZWdpc3RlciBkZWZpbml0aW9uLiAqLwotCi0vKiAgRGVmYXVsdCBWYWx1ZSBmb3IgRUVQUk9NIG9yIEVGVVNFISEhICovCi0jZGVmaW5lIEVFUFJPTV9EZWZhdWx0X1RTU0kJCQkweDAKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfVHhQb3dlckRpZmYJCTB4MAotI2RlZmluZSBFRVBST01fRGVmYXVsdF9DcnlzdGFsQ2FwCQkweDUKLSAvKiAgRGVmYXVsdDogMlgyLCBSVEw4MTkyQ0UoUUZQTjY4KSAqLwotI2RlZmluZSBFRVBST01fRGVmYXVsdF9Cb2FyZFR5cGUJCTB4MDIKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfVHhQb3dlcgkJCTB4MTAxMAotI2RlZmluZSBFRVBST01fRGVmYXVsdF9IVDJUX1R4UHdyCQkweDEwCi0KLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfTGVnYWN5SFRUeFBvd2VyRGlmZgkweDMKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfVGhlcm1hbE1ldGVyCQkweDEyCi0KLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfQW50VHhQb3dlckRpZmYJCTB4MAotI2RlZmluZSBFRVBST01fRGVmYXVsdF9UeFB3RGlmZl9DcnlzdGFsQ2FwCTB4NQotI2RlZmluZSBFRVBST01fRGVmYXVsdF9UeFBvd2VyTGV2ZWwJCTB4MjIKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfSFQ0MF8yU0RpZmYJCTB4MAotCS8qICBIVDIwPC0+NDAgZGVmYXVsdCBUeCBQb3dlciBJbmRleCBEaWZmZXJlbmNlICovCi0jZGVmaW5lIEVFUFJPTV9EZWZhdWx0X0hUMjBfRGlmZgkJMgotI2RlZmluZSBFRVBST01fRGVmYXVsdF9MZWdhY3lIVFR4UG93ZXJEaWZmCTB4MwotI2RlZmluZSBFRVBST01fRGVmYXVsdF9IVDQwX1B3ck1heE9mZnNldAkwCi0jZGVmaW5lIEVFUFJPTV9EZWZhdWx0X0hUMjBfUHdyTWF4T2Zmc2V0CTAKLQotLyogIEZvciBkZWJ1ZyAqLwotI2RlZmluZSBFRVBST01fRGVmYXVsdF9QSUQJCQkweDEyMzQKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfVklECQkJMHg1Njc4Ci0jZGVmaW5lIEVFUFJPTV9EZWZhdWx0X0N1c3RvbWVySUQJCTB4QUIKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfU3ViQ3VzdG9tZXJJRAkJMHhDRAotI2RlZmluZSBFRVBST01fRGVmYXVsdF9WZXJzaW9uCQkJMAotCi0jZGVmaW5lIEVFUFJPTV9DSEFOTkVMX1BMQU5fRkNDCQkJMHgwCi0jZGVmaW5lIEVFUFJPTV9DSEFOTkVMX1BMQU5fSUMJCQkweDEKLSNkZWZpbmUgRUVQUk9NX0NIQU5ORUxfUExBTl9FVFNJCQkweDIKLSNkZWZpbmUgRUVQUk9NX0NIQU5ORUxfUExBTl9TUEFJTgkJMHgzCi0jZGVmaW5lIEVFUFJPTV9DSEFOTkVMX1BMQU5fRlJBTkNFCQkweDQKLSNkZWZpbmUgRUVQUk9NX0NIQU5ORUxfUExBTl9NS0sJCQkweDUKLSNkZWZpbmUgRUVQUk9NX0NIQU5ORUxfUExBTl9NS0sxCQkweDYKLSNkZWZpbmUgRUVQUk9NX0NIQU5ORUxfUExBTl9JU1JBRUwJCTB4NwotI2RlZmluZSBFRVBST01fQ0hBTk5FTF9QTEFOX1RFTEVDCQkweDgKLSNkZWZpbmUgRUVQUk9NX0NIQU5ORUxfUExBTl9HTE9CQUxfRE9NQUlOCTB4OQotI2RlZmluZSBFRVBST01fQ0hBTk5FTF9QTEFOX1dPUkxEX1dJREVfMTMJMHhBCi0jZGVmaW5lIEVFUFJPTV9DSEFOTkVMX1BMQU5fTkNDCQkJMHhCCi0jZGVmaW5lIEVFUFJPTV9VU0JfT1BUSU9OQUwxCQkJMHhFCi0jZGVmaW5lIEVFUFJPTV9DSEFOTkVMX1BMQU5fQllfSFdfTUFTSwkJMHg4MAotCi0KLSNkZWZpbmUgRUVQUk9NX0NJRF9ERUZBVUxUCQkJMHgwCi0jZGVmaW5lIEVFUFJPTV9DSURfVE9TSElCQQkJCTB4NAotIC8qICBDQ1ggdGVzdC4gQnkgQnJ1Y2UsIDIwMDktMDItMjUuICovCi0jZGVmaW5lIEVFUFJPTV9DSURfQ0NYCQkJCTB4MTAKLSNkZWZpbmUgRUVQUk9NX0NJRF9RTUkJCQkJMHgwRAotIC8qICBhZGRlZCBieSBjaGl5b2tvIGZvciBkdG0sIDIwMDkwMTA4ICovCi0jZGVmaW5lIEVFUFJPTV9DSURfV0hRTAkJCQkweEZFCi0KLQotI2RlZmluZQlSVExfRUVQUk9NX0lECQkJCTB4ODEyOQotCi0jZGVmaW5lCVNVUFBPUlRfSFdfUkFESU9fREVURUNUKHBIYWxEYXRhKQkJXAotCShwSGFsRGF0YS0+Qm9hcmRUeXBlID09IEJPQVJEX01JTklDQVJEIHx8CVwKLQlwSGFsRGF0YS0+Qm9hcmRUeXBlID09IEJPQVJEX1VTQl9TT0xPIHx8CVwKLQlwSGFsRGF0YS0+Qm9hcmRUeXBlID09IEJPQVJEX1VTQl9DT01CTykKLQotLyogICovCi0vKiAgRUVQUk9NIGFkZHJlc3MgZm9yIFRlc3QgY2hpcCAqLwotLyogICovCi0jZGVmaW5lIEVFUFJPTV9URVNUX1VTQl9PUFQJCTB4MEUKLSNkZWZpbmUgRUVQUk9NX1RFU1RfQ0hJUlBfSwkJMHgwRgotI2RlZmluZSBFRVBST01fVEVTVF9FUF9TRVRUSU5HCQkweDBFCi0jZGVmaW5lIEVFUFJPTV9URVNUX1VTQl9QSFkJCTB4MTAKLQotCi0vKiAgKi8KLS8qICBFRVBST00gYWRkcmVzcyBmb3IgTm9ybWFsIGNoaXAgKi8KLS8qICAqLwotI2RlZmluZSBFRVBST01fTk9STUFMX1VTQl9PUFQJCTB4MEUKLSNkZWZpbmUgRUVQUk9NX05PUk1BTF9DSElSUF9LCQkweDBFCS8qICBDaGFuZ2VkICovCi0jZGVmaW5lIEVFUFJPTV9OT1JNQUxfRVBfU0VUVElORwkweDBGCS8qICBDaGFuZ2VkICovCi0jZGVmaW5lIEVFUFJPTV9OT1JNQUxfVVNCX1BIWQkJMHgxMgkvKiAgQ2hhbmdlZCAqLwotCi1lbnVtIHsKLQlCT0FSRF9VU0JfRE9OR0xFID0gMCwJLyogIFVTQiBkb25nbGUgKi8KLQlCT0FSRF9VU0JfSGlnaF9QQSA9IDEsCS8qICBVU0IgZG9uZ2xlIHdpdGggaGlnaCBwb3dlciBQQSAqLwotCUJPQVJEX01JTklDQVJEID0gMiwJLyogIE1pbmljYXJkICovCi0JQk9BUkRfVVNCX1NPTE8gPSAzLAkvKiAgVVNCIHNvbG8tU2xpbSBtb2R1bGUgKi8KLQlCT0FSRF9VU0JfQ09NQk8gPSA0LAkvKiAgVVNCIENvbWJvLVNsaW0gbW9kdWxlICovCi19OwotCi0vKiAgVGVzdCBjaGlwIGFuZCBub3JtYWwgY2hpcCBjb21tb24gZGVmaW5lICovCi0vKiAgKi8KLS8qICBFRVBST00gYWRkcmVzcyBmb3IgYm90aCAqLwotLyogICovCi0jZGVmaW5lIEVFUFJPTV9JRDAJCQkweDAwCi0jZGVmaW5lIEVFUFJPTV9JRDEJCQkweDAxCi0jZGVmaW5lIEVFUFJPTV9SVEtfUlNWMQkJCTB4MDIKLSNkZWZpbmUgRUVQUk9NX1JUS19SU1YyCQkJMHgwMwotI2RlZmluZSBFRVBST01fUlRLX1JTVjMJCQkweDA0Ci0jZGVmaW5lIEVFUFJPTV9SVEtfUlNWNAkJCTB4MDUKLSNkZWZpbmUgRUVQUk9NX1JUS19SU1Y1CQkJMHgwNgotI2RlZmluZSBFRVBST01fREJHX1NFTAkJCTB4MDcKLSNkZWZpbmUgRUVQUk9NX1JUS19SU1Y2CQkJMHgwOAotI2RlZmluZSBFRVBST01fVklECQkJMHgwQQotI2RlZmluZSBFRVBST01fUElECQkJMHgwQwotCi0jZGVmaW5lIEVFUFJPTV9NQUNfQUREUgkJCTB4MTYKLSNkZWZpbmUgRUVQUk9NX1NUUklORwkJCTB4MUMKLSNkZWZpbmUgRUVQUk9NX1NVQkNVU1RPTUVSX0lECQkweDU5Ci0jZGVmaW5lIEVFUFJPTV9DQ0tfVFhfUFdSX0lOWAkJMHg1QQotI2RlZmluZSBFRVBST01fSFQ0MF8xU19UWF9QV1JfSU5YCTB4NjAKLSNkZWZpbmUgRUVQUk9NX0hUNDBfMlNfVFhfUFdSX0lOWF9ESUZGCTB4NjYKLSNkZWZpbmUgRUVQUk9NX0hUMjBfVFhfUFdSX0lOWF9ESUZGCTB4NjkKLSNkZWZpbmUgRUVQUk9NX09GRE1fVFhfUFdSX0lOWF9ESUZGCTB4NkMKLSNkZWZpbmUgRUVQUk9NX0hUNDBfTUFYX1BXUl9PRkZTRVQJMHg2RgotI2RlZmluZSBFRVBST01fSFQyMF9NQVhfUFdSX09GRlNFVAkweDcyCi0KLSNkZWZpbmUgRUVQUk9NX0NIQU5ORUxfUExBTgkJMHg3NQotI2RlZmluZSBFRVBST01fVFNTSV9BCQkJMHg3NgotI2RlZmluZSBFRVBST01fVFNTSV9CCQkJMHg3NwotI2RlZmluZSBFRVBST01fVEhFUk1BTF9NRVRFUgkJMHg3OAotI2RlZmluZSBFRVBST01fUkZfT1BUMQkJCTB4NzkKLSNkZWZpbmUgRUVQUk9NX1JGX09QVDIJCQkweDdBCi0jZGVmaW5lIEVFUFJPTV9SRl9PUFQzCQkJMHg3QgotI2RlZmluZSBFRVBST01fUkZfT1BUNAkJCTB4N0MKLSNkZWZpbmUgRUVQUk9NX1ZFUlNJT04JCQkweDdFCi0jZGVmaW5lIEVFUFJPTV9DVVNUT01FUl9JRAkJMHg3RgotCi0JIC8qIDB4MDogUlRMODE4OFNVLCAweDE6IFJUTDgxOTFTVSwgMHgyOiBSVEw4MTkyU1UsIDB4MzogUlRMODE5MUdVICovCi0jZGVmaW5lIEVFUFJPTV9Cb2FyZFR5cGUJCTB4NTQKLQkvKiAweDVDLTB4NzYsIFR4IFBvd2VyIGluZGV4LiAqLwotI2RlZmluZSBFRVBST01fVHhQd0luZGV4CQkweDVDCi0JLyogIERpZmZlcmVuY2Ugb2YgZ2FpbiBpbmRleCBiZXR3ZWVuIGxlZ2FjeSBhbmQgaGlnaCB0aHJvdWdocHV0IE9GRE0uICovCi0jZGVmaW5lIEVFUFJPTV9Qd0RpZmYJCQkweDY3Ci0JLyogIENDSyBUeCBQb3dlciAqLwotI2RlZmluZSBFRVBST01fVHhQb3dlckNDSwkJMHg1QQotCi0vKiAgMjAwOS8wMi8wOSBDb3NhIEFkZCBmb3IgU0QzIHJlcXVpcmVtZW50ICovCi0JLyogIEhUMjAgVHggUG93ZXIgSW5kZXggRGlmZmVyZW5jZSAqLwotI2RlZmluZSBFRVBST01fVFhfUFdSX0hUMjBfRElGRgkJMHg2ZQotCS8qICBIVDIwPC0+NDAgZGVmYXVsdCBUeCBQb3dlciBJbmRleCBEaWZmZXJlbmNlICovCi0jZGVmaW5lIERFRkFVTFRfSFQyMF9UWFBXUl9ESUZGCQkyCi0JLyogIE9GRE0gVHggUG93ZXIgSW5kZXggRGlmZmVyZW5jZSAqLwotI2RlZmluZSBFRVBST01fVFhfUFdSX09GRE1fRElGRgkJMHg3MQotCi0JLyogIFBvd2VyIGRpZmYgZm9yIGNoYW5uZWwgZ3JvdXAgKi8KLSNkZWZpbmUgRUVQUk9NX1R4UFdSR3JvdXAJCTB4NzMKLQkvKiAgQ2hlY2sgaWYgcG93ZXIgc2FmZXR5IGlzIG5lZWQgKi8KLSNkZWZpbmUgRUVQUk9NX1JlZ3VsYXRvcnkJCTB4NzkKLQotCS8qICA5MmN1LCAweDdFWzRdICovCi0jZGVmaW5lIEVFUFJPTV9CTFVFVE9PVEhfQ09FWElTVAkweDdFCi0jZGVmaW5lIEVFUFJPTV9OT1JNQUxfQm9hcmRUeXBlCQlFRVBST01fUkZfT1BUMQkvKiA3OjVdICovCi0jZGVmaW5lIEJPQVJEX1RZUEVfTk9STUFMX01BU0sJCTB4RTAKLSNkZWZpbmUgQk9BUkRfVFlQRV9URVNUX01BU0sJCTB4MEYKLQkvKiBCSVQwIDEgZm9yIGJ1aWxkLWluIG1vZHVsZSwgMCBmb3IgZXh0ZXJuYWwgZG9uZ2xlICovCi0jZGVmaW5lIEVFUFJPTV9FQVNZX1JFUExBQ0VNRU5UCQkweDUwCi0vKiAgKi8KLS8qIEVQUk9NIGNvbnRlbnQgZGVmaW5pdGlvbnMgKi8KLS8qICAqLwotI2RlZmluZSBPU19MSU5LX1NQRUVECQkJQklUKDUpCi0KLSNkZWZpbmUgQk9BUkRfVFlQRV9NQVNLCQkJMHhGCi0KLSNkZWZpbmUgQlRfQ09FWElTVEVOQ0UJCQlCSVQoNCkKLSNkZWZpbmUgQlRfQ09fU0hJRlQJCQk0Ci0KLSNkZWZpbmUgRVBfTlVNQkVSX01BU0sJCQkweDMwCS8qIGJpdCA0OjUgMEVoICovCi0jZGVmaW5lIEVQX05VTUJFUl9TSElGVAkJCTQKLQotCi0jZGVmaW5lIFVTQl9QSFlfUEFSQV9TSVpFCQk1Ci0KLQotLyogICovCi0vKgkURUVQUk9NIGRlZmF1bHQgdmFsdWUgZGVmaW5pdGlvbnMgKi8KLS8qICAqLwotLyogIFVzZSAweEFCQ0QgaW5zdGVhZCBvZiAweDgxOTIgZm9yIGRlYnVnICovCi0jZGVmaW5lIEVFUFJPTV9ERUZfSURfMAkJCTB4Q0QJLyogIEJ5dGUgMHgwMCAqLwotI2RlZmluZSBFRVBST01fREVGX0lEXzEJCQkweEFCCS8qICBCeXRlIDB4MDEgKi8KLQotI2RlZmluZSBFRVBST01fREVGX1JUS19SU1ZfQTMJCTB4NzQJLyogIEJ5dGUgMHgwMyAqLwotI2RlZmluZSBFRVBST01fREVGX1JUS19SU1ZfQTQJCTB4NkQJLyogIEJ5dGUgMHgwNCAqLwotI2RlZmluZSBFRVBST01fREVGX1JUS19SU1ZfQTgJCTB4RkYJLyogIEJ5dGUgMHgwOCAqLwotCi0jZGVmaW5lIEVFUFJPTV9ERUZfVklEXzAJCTB4MEEJLyogIEJ5dGUgMHgwQSAqLwotI2RlZmluZSBFRVBST01fREVGX1ZJRF8xCQkweDBCCi0KLSNkZWZpbmUgRUVQUk9NX0RFRl9QSURfMAkJMHg5MgkvKiAgQnl0ZSAweDBDICovCi0jZGVmaW5lIEVFUFJPTV9ERUZfUElEXzEJCTB4ODEKLQotCi0jZGVmaW5lIEVFUFJPTV9URVNUX0RFRl9VU0JfT1BUCQkweDgwCS8qICBCeXRlIDB4MEUgKi8KLSNkZWZpbmUgRUVQUk9NX05PUk1BTF9ERUZfVVNCX09QVAkweDAwCS8qICBCeXRlIDB4MEUgKi8KLQotI2RlZmluZSBFRVBST01fREVGX0NISVJQSwkJMHgxNQkvKiAgQnl0ZSAweDBGICovCi0KLSNkZWZpbmUgRUVQUk9NX0RFRl9VU0JfUEhZXzAJCTB4ODUJLyogIEJ5dGUgMHgxMCAqLwotI2RlZmluZSBFRVBST01fREVGX1VTQl9QSFlfMQkJMHg2MgkvKiAgQnl0ZSAweDExICovCi0jZGVmaW5lIEVFUFJPTV9ERUZfVVNCX1BIWV8yCQkweDlFCS8qICBCeXRlIDB4MTIgKi8KLSNkZWZpbmUgRUVQUk9NX0RFRl9VU0JfUEhZXzMJCTB4MDYJLyogIEJ5dGUgMHgxMyAqLwotCi0jZGVmaW5lIEVFUFJPTV9ERUZfVFNTSV9BCQkweDA5CS8qICBCeXRlIDB4NzggKi8KLSNkZWZpbmUgRUVQUk9NX0RFRl9UU1NJX0IJCTB4MDkJLyogIEJ5dGUgMHg3OSAqLwotCi0KLSNkZWZpbmUgRUVQUk9NX0RFRl9USEVSTUFMX01FVEVSCTB4MTIJLyogIEJ5dGUgMHg3QSAqLwotCi0JLyogIENoZWNrIGlmIHBvd2VyIHNhZmV0eSBzcGVjIGlzIG5lZWQgKi8KLSNkZWZpbmUgUkZfT1BUSU9OMQkJCTB4NzkKLSNkZWZpbmUgUkZfT1BUSU9OMgkJCTB4N0EKLSNkZWZpbmUgUkZfT1BUSU9OMwkJCTB4N0IKLSNkZWZpbmUgUkZfT1BUSU9ONAkJCTB4N0MKLQotCi0jZGVmaW5lCUVFUFJPTV9VU0JfU04JCQlCSVQoMCkKLSNkZWZpbmUJRUVQUk9NX1VTQl9SRU1PVEVfV0FLRVVQCUJJVCgxKQotI2RlZmluZQlFRVBST01fVVNCX0RFVklDRV9QV1IJCUJJVCgyKQotI2RlZmluZQlFRVBST01fRVBfTlVNQkVSCQkoQklUKDMpfEJJVCg0KSkKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUhlcmUgdGhlIHJlZ2lzdGVyIGRlZmluZXMgYXJlIGZvciA5MkMuIFdoZW4gdGhlIGRlZmluZSBpcyBhcyBzYW1lIHdpdGggOTJDLAotd2Ugd2lsbCB1c2UgdGhlIDkyQydzIGRlZmluZSBmb3IgdGhlIGNvbnNpc3RlbmN5Ci1TbyB0aGUgZm9sbG93aW5nIGRlZmluZXMgZm9yIDkyQyBpcyBub3QgZW50aXJlISEhISEhCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKgotQmFzZWQgb24gRGF0YXNoZWV0IFYzMy0tLTA5MDQwMQotUmVnaXN0ZXIgU3VtbWFyeQotQ3VycmVudCBJT1JFRyBNQVAKLTB4MDAwMGggfiAweDAwRkZoICAgU3lzdGVtIENvbmZpZ3VyYXRpb24gKDI1NiBCeXRlcykKLTB4MDEwMGggfiAweDAxRkZoICAgTUFDVE9QIEdlbmVyYWwgQ29uZmlndXJhdGlvbiAoMjU2IEJ5dGVzKQotMHgwMjAwaCB+IDB4MDI3RmggICBUWERNQSBDb25maWd1cmF0aW9uICgxMjggQnl0ZXMpCi0weDAyODBoIH4gMHgwMkZGaCAgIFJYRE1BIENvbmZpZ3VyYXRpb24gKDEyOCBCeXRlcykKLTB4MDMwMGggfiAweDAzRkZoICAgUENJRSBFTUFDIFJlc2VydmVkIFJlZ2lvbiAoMjU2IEJ5dGVzKQotMHgwNDAwaCB+IDB4MDRGRmggICBQcm90b2NvbCBDb25maWd1cmF0aW9uICgyNTYgQnl0ZXMpCi0weDA1MDBoIH4gMHgwNUZGaCAgIEVEQ0EgQ29uZmlndXJhdGlvbiAoMjU2IEJ5dGVzKQotMHgwNjAwaCB+IDB4MDdGRmggICBXTUFDIENvbmZpZ3VyYXRpb24gKDUxMiBCeXRlcykKLTB4MjAwMGggfiAweDNGRkZoICAgODA1MSBGVyBEb3dubG9hZCBSZWdpb24gKDgxOTYgQnl0ZXMpCi0qLwotCi0vKiAgKi8KLS8qIDgxOTJDIChSQ1IpIFJlY2VpdmUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkoT2Zmc2V0IDB4NjA4LCAzMiBiaXRzKSAqLwotLyogICovCi0jZGVmaW5lCVJDUl9BUFBGQ1MJCQlCSVQoMzEpIC8qIFdNQUMgYXBwZW5kIEZDUyBhZnRlciBwYXlsb2FkKi8KLSNkZWZpbmUJUkNSX0FQUF9NSUMJCQlCSVQoMzApCi0jZGVmaW5lCVJDUl9BUFBfUEhZU1RTCQkJQklUKDI4KQotI2RlZmluZQlSQ1JfQVBQX0lDVgkJCUJJVCgyOSkKLSNkZWZpbmUJUkNSX0FQUF9QSFlTVF9SWEZGCQlCSVQoMjgpCi0jZGVmaW5lCVJDUl9BUFBfQkFfU1NOCQkJQklUKDI3KSAvKiBBY2NlcHQgQkEgU1NOICovCi0jZGVmaW5lCVJDUl9FTk1CSUQJCQlCSVQoMjQpIC8qIEVuYWJsZSBNdWx0aXBsZSBCc3NJZC4gKi8KLSNkZWZpbmUJUkNSX0xTSUdFTgkJCUJJVCgyMykKLSNkZWZpbmUJUkNSX01GQkVOCQkJQklUKDIyKQotI2RlZmluZQlSQ1JfSFRDX0xPQ19DVFJMCQlCSVQoMTQpIC8qIE1GQzwtLUhUQz0xIE1GQy0tPkhUQz0wICovCi0jZGVmaW5lCVJDUl9BTUYJCQkJQklUKDEzKSAvKiBBY2NlcHQgbWFuYWdlbWVudCB0eXBlIGZyYW1lICovCi0jZGVmaW5lCVJDUl9BQ0YJCQkJQklUKDEyKSAvKiBBY2NlcHQgY29udHJvbCB0eXBlIGZyYW1lICovCi0jZGVmaW5lCVJDUl9BREYJCQkJQklUKDExKSAvKiBBY2NlcHQgZGF0YSB0eXBlIGZyYW1lICovCi0jZGVmaW5lCVJDUl9BSUNWCQkJQklUKDkpICAvKiBBY2NlcHQgSUNWIGVycm9yIHBhY2tldCAqLwotI2RlZmluZQlSQ1JfQUNSQzMyCQkJQklUKDgpICAvKiBBY2NlcHQgQ1JDMzIgZXJyb3IgcGFja2V0ICovCi0jZGVmaW5lCVJDUl9DQlNTSURfQkNOCQkJQklUKDcpICAvKiBBY2NlcHQgQlNTSUQgbWF0Y2ggcGFja2V0Ci0JCQkJCQkgKFJ4IGJlYWNvbiwgcHJvYmUgcnNwKSAqLwotI2RlZmluZQlSQ1JfQ0JTU0lEX0RBVEEJCQlCSVQoNikgIC8qIEFjY2VwdCBCU1NJRCBtYXRjaCBwYWNrZXQKLQkJCQkJCSAoRGF0YSkgKi8KLSNkZWZpbmUJUkNSX0NCU1NJRAkJCVJDUl9DQlNTSURfREFUQQkvKiBBY2NlcHQgQlNTSUQgbWF0Y2gKLQkJCQkJCQkgICBwYWNrZXQgKi8KLSNkZWZpbmUJUkNSX0FQV1JNR1QJCQlCSVQoNSkgIC8qIEFjY2VwdCBwb3dlciBtYW5hZ2VtZW50Ci0JCQkJCQkgcGFja2V0ICovCi0jZGVmaW5lCVJDUl9BREQzCQkJQklUKDQpICAvKiBBY2NlcHQgYWRkcmVzcyAzIG1hdGNoCi0JCQkJCQkgcGFja2V0ICovCi0jZGVmaW5lCVJDUl9BQgkJCQlCSVQoMykgIC8qIEFjY2VwdCBicm9hZGNhc3QgcGFja2V0ICovCi0jZGVmaW5lCVJDUl9BTQkJCQlCSVQoMikgIC8qIEFjY2VwdCBtdWx0aWNhc3QgcGFja2V0ICovCi0jZGVmaW5lCVJDUl9BUE0JCQkJQklUKDEpICAvKiBBY2NlcHQgcGh5c2ljYWwgbWF0Y2ggcGFja2V0ICovCi0jZGVmaW5lCVJDUl9BQVAJCQkJQklUKDApICAvKiBBY2NlcHQgYWxsIHVuaWNhc3QgcGFja2V0ICovCi0jZGVmaW5lCVJDUl9NWERNQV9PRkZTRVQJCTgKLSNkZWZpbmUJUkNSX0ZJRk9fT0ZGU0VUCQkJMTMKLQotCi0KLS8qICAqLwotLyogODE5MmMgVVNCIHNwZWNpZmljIFJlZ3NpdGVyIE9mZnNldCBhbmQgQ29udGVudCBkZWZpbml0aW9uLCAqLwotLyogMjAwOS4wOC4xOCwgYWRkZWQgYnkgdml2aS4gZm9yIG1lcmdlIDkyYyBhbmQgOTJDIGludG8gb25lIGRyaXZlciAqLwotLyogICovCi0vKiBkZWZpbmUgQVBTX0ZTTUNPCQkJMHgwMDA0ICBzYW1lIHdpdGggOTJDZSAqLwotI2RlZmluZSBSU1ZfQ1RSTAkJCTB4MDAxQwotI2RlZmluZSBSRF9DVFJMCQkJCTB4MDUyNAotCi0vKiAgKi8KLS8qICAqLwotLyoJMHhGRTAwaCB+IDB4RkU1NWgJVVNCIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0jZGVmaW5lIFJFR19VU0JfSU5GTwkJCTB4RkUxNwotI2RlZmluZSBSRUdfVVNCX1NQRUNJQUxfT1BUSU9OCQkweEZFNTUKLSNkZWZpbmUgUkVHX1VTQl9ETUFfQUdHX1RPCQkweEZFNUIKLSNkZWZpbmUgUkVHX1VTQl9BR0dfVE8JCQkweEZFNUMKLSNkZWZpbmUgUkVHX1VTQl9BR0dfVEgJCQkweEZFNUQKLQotI2RlZmluZSBSRUdfVVNCX1ZJRAkJCTB4RkU2MAotI2RlZmluZSBSRUdfVVNCX1BJRAkJCTB4RkU2MgotI2RlZmluZSBSRUdfVVNCX09QVElPTkFMCQkweEZFNjQKLSNkZWZpbmUgUkVHX1VTQl9DSElSUF9LCQkJMHhGRTY1Ci0jZGVmaW5lIFJFR19VU0JfUEhZCQkJMHhGRTY2Ci0jZGVmaW5lIFJFR19VU0JfTUFDX0FERFIJCTB4RkU3MAotCi0jZGVmaW5lIFJFR19VU0JfSFJQV00JCQkweEZFNTgKLSNkZWZpbmUgUkVHX1VTQl9IQ1BXTQkJCTB4RkU1NwotCi0jZGVmaW5lCUludmFsaWRCQlJGVmFsdWUJCTB4MTIzNDU2NzgKLQotLyogICovCi0vKiAgICAgICAgODE5MkMgUmVnc2l0ZXIgQml0IGFuZCBDb250ZW50IGRlZmluaXRpb24gKi8KLS8qICAqLwotLyogICovCi0vKiAgKi8KLS8qCTB4MDAwMGggfiAweDAwRkZoCVN5c3RlbSBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotCi0vKiAyIFNQUzBfQ1RSTCAqLwotI2RlZmluZSBTVzE4X0ZQV00JCQlCSVQoMykKLQotCi0vKiAyIFNZU19JU09fQ1RSTCAqLwotI2RlZmluZSBJU09fTUQyUFAJCQlCSVQoMCkKLSNkZWZpbmUgSVNPX1VBMlVTQgkJCUJJVCgxKQotI2RlZmluZSBJU09fVUQyQ09SRQkJCUJJVCgyKQotI2RlZmluZSBJU09fUEEyUENJRQkJCUJJVCgzKQotI2RlZmluZSBJU09fUEQyQ09SRQkJCUJJVCg0KQotI2RlZmluZSBJU09fSVAyTUFDCQkJQklUKDUpCi0jZGVmaW5lIElTT19ESU9QCQkJQklUKDYpCi0jZGVmaW5lIElTT19ESU9FCQkJQklUKDcpCi0jZGVmaW5lIElTT19FQjJDT1JFCQkJQklUKDgpCi0jZGVmaW5lIElTT19ESU9SCQkJQklUKDkpCi0KLSNkZWZpbmUgUFdDX0VWMjVWCQkJQklUKDE0KQotI2RlZmluZSBQV0NfRVYxMlYJCQlCSVQoMTUpCi0KLQotLyogMiBTWVNfRlVOQ19FTiAqLwotI2RlZmluZSBGRU5fQkJSU1RCCQkJQklUKDApCi0jZGVmaW5lIEZFTl9CQl9HTEJfUlNUbgkJCUJJVCgxKQotI2RlZmluZSBGRU5fVVNCQQkJCUJJVCgyKQotI2RlZmluZSBGRU5fVVBMTAkJCUJJVCgzKQotI2RlZmluZSBGRU5fVVNCRAkJCUJJVCg0KQotI2RlZmluZSBGRU5fRElPX1BDSUUJCQlCSVQoNSkKLSNkZWZpbmUgRkVOX1BDSUVBCQkJQklUKDYpCi0jZGVmaW5lIEZFTl9QUExMCQkJQklUKDcpCi0jZGVmaW5lIEZFTl9QQ0lFRAkJCUJJVCg4KQotI2RlZmluZSBGRU5fRElPRQkJCUJJVCg5KQotI2RlZmluZSBGRU5fQ1BVRU4JCQlCSVQoMTApCi0jZGVmaW5lIEZFTl9EQ09SRQkJCUJJVCgxMSkKLSNkZWZpbmUgRkVOX0VMRFIJCQlCSVQoMTIpCi0jZGVmaW5lIEZFTl9ESU9fUkYJCQlCSVQoMTMpCi0jZGVmaW5lIEZFTl9IV1BETgkJCUJJVCgxNCkKLSNkZWZpbmUgRkVOX01SRUdFTgkJCUJJVCgxNSkKLQotLyogMiBBUFNfRlNNQ08gKi8KLSNkZWZpbmUgUEZNX0xEQUxMCQkJQklUKDApCi0jZGVmaW5lIFBGTV9BTEROCQkJQklUKDEpCi0jZGVmaW5lIFBGTV9MREtQCQkJQklUKDIpCi0jZGVmaW5lIFBGTV9XT1dMCQkJQklUKDMpCi0jZGVmaW5lIEVuUEROCQkJCUJJVCg0KQotI2RlZmluZSBQRE5fUEwJCQkJQklUKDUpCi0jZGVmaW5lIEFQRk1fT05NQUMJCQlCSVQoOCkKLSNkZWZpbmUgQVBGTV9PRkYJCQlCSVQoOSkKLSNkZWZpbmUgQVBGTV9SU00JCQlCSVQoMTApCi0jZGVmaW5lIEFGU01fSFNVUwkJCUJJVCgxMSkKLSNkZWZpbmUgQUZTTV9QQ0lFCQkJQklUKDEyKQotI2RlZmluZSBBUERNX01BQwkJCUJJVCgxMykKLSNkZWZpbmUgQVBETV9IT1NUCQkJQklUKDE0KQotI2RlZmluZSBBUERNX0hQRE4JCQlCSVQoMTUpCi0jZGVmaW5lIFJEWV9NQUNPTgkJCUJJVCgxNikKLSNkZWZpbmUgU1VTX0hPU1QJCQlCSVQoMTcpCi0jZGVmaW5lIFJPUF9BTEQJCQkJQklUKDIwKQotI2RlZmluZSBST1BfUFdSCQkJCUJJVCgyMSkKLSNkZWZpbmUgUk9QX1NQUwkJCQlCSVQoMjIpCi0jZGVmaW5lIFNPUF9NUlNUCQkJQklUKDI1KQotI2RlZmluZSBTT1BfRlVTRQkJCUJJVCgyNikKLSNkZWZpbmUgU09QX0FCRwkJCQlCSVQoMjcpCi0jZGVmaW5lIFNPUF9BTUIJCQkJQklUKDI4KQotI2RlZmluZSBTT1BfUkNLCQkJCUJJVCgyOSkKLSNkZWZpbmUgU09QX0E4TQkJCQlCSVQoMzApCi0jZGVmaW5lIFhPUF9CVENLCQkJQklUKDMxKQotCi0vKiAyIFNZU19DTEtSICovCi0jZGVmaW5lIEFOQUQxNlZfRU4JCQlCSVQoMCkKLSNkZWZpbmUgQU5BOE0JCQkJQklUKDEpCi0jZGVmaW5lIE1BQ1NMUAkJCQlCSVQoNCkKLSNkZWZpbmUgTE9BREVSX0NMS19FTgkJCUJJVCg1KQotI2RlZmluZSBfODBNX1NTQ19ESVMJCQlCSVQoNykKLSNkZWZpbmUgXzgwTV9TU0NfRU5fSE8JCQlCSVQoOCkKLSNkZWZpbmUgUEhZX1NTQ19SU1RCCQkJQklUKDkpCi0jZGVmaW5lIFNFQ19DTEtfRU4JCQlCSVQoMTApCi0jZGVmaW5lIE1BQ19DTEtfRU4JCQlCSVQoMTEpCi0jZGVmaW5lIFNZU19DTEtfRU4JCQlCSVQoMTIpCi0jZGVmaW5lIFJJTkdfQ0xLX0VOCQkJQklUKDEzKQotCi0KLS8qIDIgOTM0NkNSICovCi0KLQotI2RlZmluZQkJRUVETwkJCUJJVCgwKQotI2RlZmluZQkJRUVESQkJCUJJVCgxKQotI2RlZmluZQkJRUVTSwkJCUJJVCgyKQotI2RlZmluZQkJRUVDUwkJCUJJVCgzKQotLyogZGVmaW5lCUVFUlBST01TRUwJCUJJVCg0KSAqLwotLyogZGVmaW5lCUVFUFJPTV9FTgkJQklUKDUpICovCi0jZGVmaW5lCQlCT09UX0ZST01fRUVQUk9NCUJJVCg0KQotI2RlZmluZQkJRUVQUk9NX0VOCQlCSVQoNSkKLSNkZWZpbmUJCUVFTTAJCQlCSVQoNikKLSNkZWZpbmUJCUVFTTEJCQlCSVQoNykKLQotCi0vKiAyIEFGRV9NSVNDICovCi0jZGVmaW5lIEFGRV9CR0VOCQkJQklUKDApCi0jZGVmaW5lIEFGRV9NQkVOCQkJQklUKDEpCi0jZGVmaW5lIE1BQ19JRF9FTgkJCUJJVCg3KQotCi0KLS8qIDIgU1BTMF9DVFJMICovCi0KLQotLyogMiBTUFNfT0NQX0NGRyAqLwotCi0KLS8qIDIgUlNWX0NUUkwgKi8KLSNkZWZpbmUgV0xPQ0tfQUxMCQkJQklUKDApCi0jZGVmaW5lIFdMT0NLXzAwCQkJQklUKDEpCi0jZGVmaW5lIFdMT0NLXzA0CQkJQklUKDIpCi0jZGVmaW5lIFdMT0NLXzA4CQkJQklUKDMpCi0jZGVmaW5lIFdMT0NLXzQwCQkJQklUKDQpCi0jZGVmaW5lIFJfRElTX1BSU1RfMAkJCUJJVCg1KQotI2RlZmluZSBSX0RJU19QUlNUXzEJCQlCSVQoNikKLSNkZWZpbmUgTE9DS19BTExfRU4JCQlCSVQoNykKLQotLyogMiBSRl9DVFJMICovCi0jZGVmaW5lIFJGX0VOCQkJCUJJVCgwKQotI2RlZmluZSBSRl9SU1RCCQkJCUJJVCgxKQotI2RlZmluZSBSRl9TRE1SU1RCCQkJQklUKDIpCi0KLQotCi0vKiAyIExET0ExNV9DVFJMICovCi0jZGVmaW5lIExEQTE1X0VOCQkJQklUKDApCi0jZGVmaW5lIExEQTE1X1NUQlkJCQlCSVQoMSkKLSNkZWZpbmUgTERBMTVfT0JVRgkJCUJJVCgyKQotI2RlZmluZSBMREExNV9SRUdfVk9TCQkJQklUKDMpCi0jZGVmaW5lIF9MREExNV9WT0FESih4KQkJCSgoKHgpICYgMHg3KSA8PCA0KQotCi0KLQotLyogMiBMRE9WMTJEX0NUUkwgKi8KLSNkZWZpbmUgTERWMTJfRU4JCQlCSVQoMCkKLSNkZWZpbmUgTERWMTJfU0RCWQkJCUJJVCgxKQotI2RlZmluZSBMUExET19IU00JCQlCSVQoMikKLSNkZWZpbmUgTFBMRE9fTFNNX0RJUwkJCUJJVCgzKQotI2RlZmluZSBfTERWMTJfVkFESih4KQkJCSgoKHgpICYgMHhGKSA8PCA0KQotCi0KLS8qIDIgQUZFX1hUQUxfQ1RSTCAqLwotI2RlZmluZSBYVEFMX0VOCQkJCUJJVCgwKQotI2RlZmluZSBYVEFMX0JTRUwJCQlCSVQoMSkKLSNkZWZpbmUgX1hUQUxfQk9TQyh4KQkJCSgoKHgpICYgMHgzKSA8PCAyKQotI2RlZmluZSBfWFRBTF9DQURKKHgpCQkJKCgoeCkgJiAweEYpIDw8IDQpCi0jZGVmaW5lIFhUQUxfR0FURV9VU0IJCQlCSVQoOCkKLSNkZWZpbmUgX1hUQUxfVVNCX0RSVih4KQkJKCgoeCkgJiAweDMpIDw8IDkpCi0jZGVmaW5lIFhUQUxfR0FURV9BRkUJCQlCSVQoMTEpCi0jZGVmaW5lIF9YVEFMX0FGRV9EUlYoeCkJCSgoKHgpICYgMHgzKSA8PCAxMikKLSNkZWZpbmUgWFRBTF9SRl9HQVRFCQkJQklUKDE0KQotI2RlZmluZSBfWFRBTF9SRl9EUlYoeCkJCQkoKCh4KSAmIDB4MykgPDwgMTUpCi0jZGVmaW5lIFhUQUxfR0FURV9ESUcJCQlCSVQoMTcpCi0jZGVmaW5lIF9YVEFMX0RJR19EUlYoeCkJCSgoKHgpICYgMHgzKSA8PCAxOCkKLSNkZWZpbmUgWFRBTF9CVF9HQVRFCQkJQklUKDIwKQotI2RlZmluZSBfWFRBTF9CVF9EUlYoeCkJCQkoKCh4KSAmIDB4MykgPDwgMjEpCi0jZGVmaW5lIF9YVEFMX0dQSU8oeCkJCQkoKCh4KSAmIDB4NykgPDwgMjMpCi0KLQotI2RlZmluZSBDS0RMWV9BRkUJCQlCSVQoMjYpCi0jZGVmaW5lIENLRExZX1VTQgkJCUJJVCgyNykKLSNkZWZpbmUgQ0tETFlfRElHCQkJQklUKDI4KQotI2RlZmluZSBDS0RMWV9CVAkJCUJJVCgyOSkKLQotCi0vKiAyIEFGRV9QTExfQ1RSTCAqLwotI2RlZmluZSBBUExMX0VOCQkJCUJJVCgwKQotI2RlZmluZSBBUExMXzMyMF9FTgkJCUJJVCgxKQotI2RlZmluZSBBUExMX0ZSRUZfU0VMCQkJQklUKDIpCi0jZGVmaW5lIEFQTExfRURHRV9TRUwJCQlCSVQoMykKLSNkZWZpbmUgQVBMTF9XRE9HQgkJCUJJVCg0KQotI2RlZmluZSBBUExMX0xQRkVOCQkJQklUKDUpCi0KLSNkZWZpbmUgQVBMTF9SRUZfQ0xLXzEzTUhaCQkweDEKLSNkZWZpbmUgQVBMTF9SRUZfQ0xLXzE5XzJNSFoJCTB4MgotI2RlZmluZSBBUExMX1JFRl9DTEtfMjBNSFoJCTB4MwotI2RlZmluZSBBUExMX1JFRl9DTEtfMjVNSFoJCTB4NAotI2RlZmluZSBBUExMX1JFRl9DTEtfMjZNSFoJCTB4NQotI2RlZmluZSBBUExMX1JFRl9DTEtfMzhfNE1IWgkJMHg2Ci0jZGVmaW5lIEFQTExfUkVGX0NMS180ME1IWgkJMHg3Ci0KLSNkZWZpbmUgQVBMTF8zMjBFTgkJCUJJVCgxNCkKLSNkZWZpbmUgQVBMTF84MEVOCQkJQklUKDE1KQotI2RlZmluZSBBUExMXzFNRU4JCQlCSVQoMjQpCi0KLQotLyogMiBFRlVTRV9DVFJMICovCi0jZGVmaW5lIEFMRF9FTgkJCQlCSVQoMTgpCi0jZGVmaW5lIEVGX1BECQkJCUJJVCgxOSkKLSNkZWZpbmUgRUZfRkxBRwkJCQlCSVQoMzEpCi0KLS8qIDIgRUZVU0VfVEVTVCAoRm9yIFJUTDg3MjMgcGFydGlhbGx5KSAqLwotI2RlZmluZSBFRl9UUlBUCQkJCUJJVCg3KQotCS8qICAwMDogV2lmaSBFZnVzZSwgMDE6IEJUIEVmdXNlMCwgMTA6IEJUIEVmdXNlMSwgMTE6IEJUIEVmdXNlMiAqLwotI2RlZmluZSBFRl9DRUxMX1NFTAkJCShCSVQoOCl8QklUKDkpKQotI2RlZmluZSBMRE9FMjVfRU4JCQlCSVQoMzEpCi0jZGVmaW5lIEVGVVNFX1NFTCh4KQkJCSgoKHgpICYgMHgzKSA8PCA4KQotI2RlZmluZSBFRlVTRV9TRUxfTUFTSwkJCTB4MzAwCi0jZGVmaW5lIEVGVVNFX1dJRklfU0VMXzAJCTB4MAotI2RlZmluZSBFRlVTRV9CVF9TRUxfMAkJCTB4MQotI2RlZmluZSBFRlVTRV9CVF9TRUxfMQkJCTB4MgotI2RlZmluZSBFRlVTRV9CVF9TRUxfMgkJCTB4MwotCi0jZGVmaW5lIEVGVVNFX0FDQ0VTU19PTgkJCTB4NjkJLyogIEZvciBSVEw4NzIzIG9ubHkuICovCi0jZGVmaW5lIEVGVVNFX0FDQ0VTU19PRkYJCTB4MDAJLyogIEZvciBSVEw4NzIzIG9ubHkuICovCi0KLS8qIDIgUFdSX0RBVEEgKi8KLQotLyogMiBDQUxfVElNRVIgKi8KLQotLyogMiBBQ0xLX01PTiAqLwotI2RlZmluZSBSU01fRU4JCQkJQklUKDApCi0jZGVmaW5lIFRpbWVyX0VOCQkJQklUKDQpCi0KLQotLyogMiBHUElPX01VWENGRyAqLwotI2RlZmluZSBUUlNXMEVOCQkJCUJJVCgyKQotI2RlZmluZSBUUlNXMUVOCQkJCUJJVCgzKQotI2RlZmluZSBFUk9NX0VOCQkJCUJJVCg0KQotI2RlZmluZSBFbkJUCQkJCUJJVCg1KQotI2RlZmluZSBFblVhcnQJCQkJQklUKDgpCi0jZGVmaW5lIFVhcnRfOTEwCQkJQklUKDkpCi0jZGVmaW5lIEVuUE1BQwkJCQlCSVQoMTApCi0jZGVmaW5lIFNJQ19TV1JTVAkJCUJJVCgxMSkKLSNkZWZpbmUgRW5TSUMJCQkJQklUKDEyKQotI2RlZmluZSBTSUNfMjMJCQkJQklUKDEzKQotI2RlZmluZSBFbkhEUAkJCQlCSVQoMTQpCi0jZGVmaW5lIFNJQ19MQksJCQkJQklUKDE1KQotCi0vKiAyIEdQSU9fUElOX0NUUkwgKi8KLQotLyogIEdQSU8gQklUICovCi0jZGVmaW5lIEhBTF84MTkyQ19IV19HUElPX1dQU19CSVQJQklUKDIpCi0KLS8qIDIgR1BJT19JTlRNICovCi0KLS8qIDIgTEVEQ0ZHICovCi0jZGVmaW5lIExFRDBQTAkJCQlCSVQoNCkKLSNkZWZpbmUgTEVEMERJUwkJCQlCSVQoNykKLSNkZWZpbmUgTEVEMURJUwkJCQlCSVQoMTUpCi0jZGVmaW5lIExFRDFQTAkJCQlCSVQoMTIpCi0KLSNkZWZpbmUgIFNFQ0NBTV9DTFIJCQlCSVQoMzApCi0KLQotLyogMiBGU0lNUiAqLwotCi0vKiAyIEZTSVNSICovCi0KLQotLyogMiA4MDUxRldETCAqLwotLyogMiBNQ1VGV0RMICovCi0jZGVmaW5lIE1DVUZXRExfRU4JCQlCSVQoMCkKLSNkZWZpbmUgTUNVRldETF9SRFkJCQlCSVQoMSkKLSNkZWZpbmUgRldETF9DaGtTdW1fcnB0CQkJQklUKDIpCi0jZGVmaW5lIE1BQ0lOSV9SRFkJCQlCSVQoMykKLSNkZWZpbmUgQkJJTklfUkRZCQkJQklUKDQpCi0jZGVmaW5lIFJGSU5JX1JEWQkJCUJJVCg1KQotI2RlZmluZSBXSU5USU5JX1JEWQkJCUJJVCg2KQotI2RlZmluZSBDUFJTVAkJCQlCSVQoMjMpCi0KLS8qIDJSRUdfSFBPTl9GU00gKi8KLSNkZWZpbmUgQk9ORDkyQ0VfMVQyUl9DRkcJCUJJVCgyMikKLQotCi0vKiAyIFJFR19TWVNfQ0ZHICovCi0jZGVmaW5lIFhDTEtfVkxECQkJQklUKDApCi0jZGVmaW5lIEFDTEtfVkxECQkJQklUKDEpCi0jZGVmaW5lIFVDTEtfVkxECQkJQklUKDIpCi0jZGVmaW5lIFBDTEtfVkxECQkJQklUKDMpCi0jZGVmaW5lIFBDSVJTVEIJCQkJQklUKDQpCi0jZGVmaW5lIFYxNV9WTEQJCQkJQklUKDUpCi0jZGVmaW5lIFRSUF9CMTVWX0VOCQkJQklUKDcpCi0jZGVmaW5lIFNJQ19JRExFCQkJQklUKDgpCi0jZGVmaW5lIEJEX01BQzIJCQkJQklUKDkpCi0jZGVmaW5lIEJEX01BQzEJCQkJQklUKDEwKQotI2RlZmluZSBJQ19NQUNQSFlfTU9ERQkJCUJJVCgxMSkKLSNkZWZpbmUgQ0hJUF9WRVIJCQkoQklUKDEyKXxCSVQoMTMpfEJJVCgxNCl8QklUKDE1KSkKLSNkZWZpbmUgQlRfRlVOQwkJCQlCSVQoMTYpCi0jZGVmaW5lIFZFTkRPUl9JRAkJCUJJVCgxOSkKLSNkZWZpbmUgUEFEX0hXUERfSUROCQkJQklUKDIyKQotI2RlZmluZSBUUlBfVkFVWF9FTgkJCUJJVCgyMykKLSNkZWZpbmUgVFJQX0JUX0VOCQkJQklUKDI0KQotI2RlZmluZSBCRF9QS0dfU0VMCQkJQklUKDI1KQotI2RlZmluZSBCRF9IQ0lfU0VMCQkJQklUKDI2KQotI2RlZmluZSBUWVBFX0lECQkJCUJJVCgyNykKLQotI2RlZmluZSBDSElQX1ZFUl9SVExfTUFTSwkJMHhGMDAwCS8qIEJpdCAxMiB+IDE1ICovCi0jZGVmaW5lIENISVBfVkVSX1JUTF9TSElGVAkJMTIKLQotLyogMlJFR19HUElPX09VVFNUUyAoRm9yIFJUTDg3MjMgb25seSkgKi8KLSNkZWZpbmUJRUZTX0hDSV9TRUwJCQkoQklUKDApfEJJVCgxKSkKLSNkZWZpbmUJUEFEX0hDSV9TRUwJCQkoQklUKDIpfEJJVCgzKSkKLSNkZWZpbmUJSENJX1NFTAkJCQkoQklUKDQpfEJJVCg1KSkKLSNkZWZpbmUJUEtHX1NFTF9IQ0kJCQlCSVQoNikKLSNkZWZpbmUJRkVOX0dQUwkJCQlCSVQoNykKLSNkZWZpbmUJRkVOX0JUCQkJCUJJVCg4KQotI2RlZmluZQlGRU5fV0wJCQkJQklUKDkpCi0jZGVmaW5lCUZFTl9QQ0kJCQkJQklUKDEwKQotI2RlZmluZQlGRU5fVVNCCQkJCUJJVCgxMSkKLSNkZWZpbmUJQlRSRl9IV1BETl9OCQkJQklUKDEyKQotI2RlZmluZQlXTFJGX0hXUEROX04JCQlCSVQoMTMpCi0jZGVmaW5lCVBETl9CVF9OCQkJQklUKDE0KQotI2RlZmluZQlQRE5fR1BTX04JCQlCSVQoMTUpCi0jZGVmaW5lCUJUX0NUTF9IV1BETgkJCUJJVCgxNikKLSNkZWZpbmUJR1BTX0NUTF9IV1BETgkJCUJJVCgxNykKLSNkZWZpbmUJUFBIWV9TVVNCCQkJQklUKDIwKQotI2RlZmluZQlVUEhZX1NVU0IJCQlCSVQoMjEpCi0jZGVmaW5lCVBDSV9TVVNFTgkJCUJJVCgyMikKLSNkZWZpbmUJVVNCX1NVU0VOCQkJQklUKDIzKQotI2RlZmluZQlSRl9STF9JRAkJCShCSVQoMzEpfEJJVCgzMCl8QklUKDI5KXxCSVQoMjgpKQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMTAwaCB+IDB4MDFGRmgJTUFDVE9QIEdlbmVyYWwgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotCi0vKiAyIEZ1bmN0aW9uIEVuYWJsZSBSZWdpc3RlcnMgKi8KLS8qIDIgQ1IgKi8KLQotI2RlZmluZSBSRUdfTEJNT0RFCQkJKFJFR19DUiArIDMpCi0KLQotI2RlZmluZSBIQ0lfVFhETUFfRU4JCQlCSVQoMCkKLSNkZWZpbmUgSENJX1JYRE1BX0VOCQkJQklUKDEpCi0jZGVmaW5lIFRYRE1BX0VOCQkJQklUKDIpCi0jZGVmaW5lIFJYRE1BX0VOCQkJQklUKDMpCi0jZGVmaW5lIFBST1RPQ09MX0VOCQkJQklUKDQpCi0jZGVmaW5lIFNDSEVEVUxFX0VOCQkJQklUKDUpCi0jZGVmaW5lIE1BQ1RYRU4JCQkJQklUKDYpCi0jZGVmaW5lIE1BQ1JYRU4JCQkJQklUKDcpCi0jZGVmaW5lIEVOU1dCQ04JCQkJQklUKDgpCi0jZGVmaW5lIEVOU0VDCQkJCUJJVCg5KQotCi0jZGVmaW5lIF9MQk1PREUoeCkJCQkoKCh4KSAmIDB4RikgPDwgMjQpCi0jZGVmaW5lIE1BU0tfTEJNT0RFCQkJMHhGMDAwMDAwCi0jZGVmaW5lIExPT1BCQUNLX05PUk1BTAkJCTB4MAotI2RlZmluZSBMT09QQkFDS19JTU1FRElBVEVMWQkJMHhCCi0jZGVmaW5lIExPT1BCQUNLX01BQ19ERUxBWQkJMHgzCi0jZGVmaW5lIExPT1BCQUNLX1BIWQkJCTB4MQotI2RlZmluZSBMT09QQkFDS19ETUEJCQkweDcKLQotCi0vKiAyIFBCUCAtIFBhZ2UgU2l6ZSBSZWdpc3RlciAqLwotI2RlZmluZSBHRVRfUlhfUEFHRV9TSVpFKHZhbHVlKQkJKCh2YWx1ZSkgJiAweEYpCi0jZGVmaW5lIEdFVF9UWF9QQUdFX1NJWkUodmFsdWUpCQkoKCh2YWx1ZSkgJiAweEYwKSA+PiA0KQotI2RlZmluZSBfUFNSWF9NQVNLCQkJMHhGCi0jZGVmaW5lIF9QU1RYX01BU0sJCQkweEYwCi0jZGVmaW5lIF9QU1JYKHgpCQkJKHgpCi0jZGVmaW5lIF9QU1RYKHgpCQkJKCh4KSA8PCA0KQotCi0jZGVmaW5lIFBCUF82NAkJCQkweDAKLSNkZWZpbmUgUEJQXzEyOAkJCQkweDEKLSNkZWZpbmUgUEJQXzI1NgkJCQkweDIKLSNkZWZpbmUgUEJQXzUxMgkJCQkweDMKLSNkZWZpbmUgUEJQXzEwMjQJCQkweDQKLQotCi0vKiAyIFRYL1JYRE1BICovCi0jZGVmaW5lIFJYRE1BX0FSQkJXX0VOCQkJQklUKDApCi0jZGVmaW5lIFJYU0hGVF9FTgkJCUJJVCgxKQotI2RlZmluZSBSWERNQV9BR0dfRU4JCQlCSVQoMikKLSNkZWZpbmUgUVNfVk9fUVVFVUUJCQlCSVQoOCkKLSNkZWZpbmUgUVNfVklfUVVFVUUJCQlCSVQoOSkKLSNkZWZpbmUgUVNfQkVfUVVFVUUJCQlCSVQoMTApCi0jZGVmaW5lIFFTX0JLX1FVRVVFCQkJQklUKDExKQotI2RlZmluZSBRU19NQU5BR0VSX1FVRVVFCQlCSVQoMTIpCi0jZGVmaW5lIFFTX0hJR0hfUVVFVUUJCQlCSVQoMTMpCi0KLSNkZWZpbmUgSFFTRUxfVk9RCQkJQklUKDApCi0jZGVmaW5lIEhRU0VMX1ZJUQkJCUJJVCgxKQotI2RlZmluZSBIUVNFTF9CRVEJCQlCSVQoMikKLSNkZWZpbmUgSFFTRUxfQktRCQkJQklUKDMpCi0jZGVmaW5lIEhRU0VMX01HVFEJCQlCSVQoNCkKLSNkZWZpbmUgSFFTRUxfSElRCQkJQklUKDUpCi0KLS8qICBGb3Igbm9ybWFsIGRyaXZlciwgMHgxMEMgKi8KLSNkZWZpbmUgX1RYRE1BX0hJUV9NQVAoeCkJCSgoKHgpJjB4MykgPDwgMTQpCi0jZGVmaW5lIF9UWERNQV9NR1FfTUFQKHgpCQkoKCh4KSYweDMpIDw8IDEyKQotI2RlZmluZSBfVFhETUFfQktRX01BUCh4KQkJKCgoeCkmMHgzKSA8PCAxMCkKLSNkZWZpbmUgX1RYRE1BX0JFUV9NQVAoeCkJCSgoKHgpJjB4MykgPDwgOCkKLSNkZWZpbmUgX1RYRE1BX1ZJUV9NQVAoeCkJCSgoKHgpJjB4MykgPDwgNikKLSNkZWZpbmUgX1RYRE1BX1ZPUV9NQVAoeCkJCSgoKHgpJjB4MykgPDwgNCkKLQotI2RlZmluZSBRVUVVRV9MT1cJCQkxCi0jZGVmaW5lIFFVRVVFX05PUk1BTAkJCTIKLSNkZWZpbmUgUVVFVUVfSElHSAkJCTMKLQotCi0KLS8qIDIgVFJYRkZfQk5EWSAqLwotCi0KLS8qIDIgTExUX0lOSVQgKi8KLSNkZWZpbmUgX0xMVF9OT19BQ1RJVkUJCQkweDAKLSNkZWZpbmUgX0xMVF9XUklURV9BQ0NFU1MJCTB4MQotI2RlZmluZSBfTExUX1JFQURfQUNDRVNTCQkweDIKLQotI2RlZmluZSBfTExUX0lOSVRfREFUQSh4KQkJKCh4KSAmIDB4RkYpCi0jZGVmaW5lIF9MTFRfSU5JVF9BRERSKHgpCQkoKCh4KSAmIDB4RkYpIDw8IDgpCi0jZGVmaW5lIF9MTFRfT1AoeCkJCQkoKCh4KSAmIDB4MykgPDwgMzApCi0jZGVmaW5lIF9MTFRfT1BfVkFMVUUoeCkJCSgoKHgpID4+IDMwKSAmIDB4MykKLQotCi0vKiAyIEJCX0FDQ0VTU19DVFJMICovCi0jZGVmaW5lIEJCX1dSSVRFX1JFQURfTUFTSwkJKEJJVCgzMSkgfCBCSVQoMzApKQotI2RlZmluZSBCQl9XUklURV9FTgkJCUJJVCgzMCkKLSNkZWZpbmUgQkJfUkVBRF9FTgkJCUJJVCgzMSkKLS8qIGRlZmluZSBCQl9BRERSX01BU0sJCQkweEZGRiAqLwotLyogZGVmaW5lIF9CQl9BRERSKHgpCQkJKCh4KSAmIEJCX0FERFJfTUFTSykgKi8KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDIwMGggfiAweDAyN0ZoCVRYRE1BIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0vKiAyIFJRUE4gKi8KLSNkZWZpbmUgX0hQUSh4KQkJCQkoKHgpICYgMHhGRikKLSNkZWZpbmUgX0xQUSh4KQkJCQkoKCh4KSAmIDB4RkYpIDw8IDgpCi0jZGVmaW5lIF9QVUJRKHgpCQkJKCgoeCkgJiAweEZGKSA8PCAxNikKLQkvKiAgTk9URTogaW4gUlFQTl9OUFEgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgX05QUSh4KQkJCQkoKHgpICYgMHhGRikKLQotCi0jZGVmaW5lIEhQUV9QVUJMSUNfRElTCQkJQklUKDI0KQotI2RlZmluZSBMUFFfUFVCTElDX0RJUwkJCUJJVCgyNSkKLSNkZWZpbmUgTERfUlFQTgkJCQlCSVQoMzEpCi0KLQotLyogMiBUREVDVFJMICovCi0jZGVmaW5lIEJDTl9WQUxJRAkJCUJJVCgxNikKLSNkZWZpbmUgQkNOX0hFQUQoeCkJCQkoKCh4KSAmIDB4RkYpIDw8IDgpCi0jZGVmaW5lCUJDTl9IRUFEX01BU0sJCQkweEZGMDAKLQotLyogMiBUREVDVEwgKi8KLSNkZWZpbmUgQkxLX0RFU0NfTlVNX1NISUZUCQk0Ci0jZGVmaW5lIEJMS19ERVNDX05VTV9NQVNLCQkweEYKLQotCi0vKiAyIFRYRE1BX09GRlNFVF9DSEsgKi8KLSNkZWZpbmUgRFJPUF9EQVRBX0VOCQkJQklUKDkpCi0KLS8qICAqLwotLyogICovCi0vKgkweDA0MDBoIH4gMHgwNDdGaAlQcm90b2NvbCBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotLyogMiBGV0hXX1RYUV9DVFJMICovCi0jZGVmaW5lIEVOX0FNUERVX1JUWV9ORVcJCUJJVCg3KQotCi0vKiAyIElOSVJUU01DU19TRUwgKi8KLSNkZWZpbmUgX0lOSVJUU01DU19TRUwoeCkJCSgoeCkgJiAweDNGKQotCi0KLS8qIDIgU1BFQyBTSUZTICovCi0jZGVmaW5lIF9TUEVDX1NJRlNfQ0NLKHgpCQkoKHgpICYgMHhGRikKLSNkZWZpbmUgX1NQRUNfU0lGU19PRkRNKHgpCQkoKCh4KSAmIDB4RkYpIDw8IDgpCi0KLQotLyogMiBSUlNSICovCi0KLSNkZWZpbmUgUkFURV9SRUdfQklUTUFQX0FMTAkJMHhGRkZGRgotCi0jZGVmaW5lIF9SUlNDX0JJVE1BUCh4KQkJCSgoeCkgJiAweEZGRkZGKQotCi0jZGVmaW5lIF9SUlNSX1JTQyh4KQkJCSgoKHgpICYgMHgzKSA8PCAyMSkKLSNkZWZpbmUgUlJTUl9SU0NfUkVTRVJWRUQJCTB4MAotI2RlZmluZSBSUlNSX1JTQ19VUFBFUl9TVUJDSEFOTkVMCTB4MQotI2RlZmluZSBSUlNSX1JTQ19MT1dFUl9TVUJDSEFOTkVMCTB4MgotI2RlZmluZSBSUlNSX1JTQ19EVVBMSUNBVEVfTU9ERQkJMHgzCi0KLQotLyogMiBBUkZSICovCi0jZGVmaW5lIFVTRV9TSE9SVF9HMQkJCUJJVCgyMCkKLQotLyogMiBBR0dMRU5fTE1UX0wgKi8KLSNkZWZpbmUgX0FHR0xNVF9NQ1MwKHgpCQkJKCh4KSAmIDB4RikKLSNkZWZpbmUgX0FHR0xNVF9NQ1MxKHgpCQkJKCgoeCkgJiAweEYpIDw8IDQpCi0jZGVmaW5lIF9BR0dMTVRfTUNTMih4KQkJCSgoKHgpICYgMHhGKSA8PCA4KQotI2RlZmluZSBfQUdHTE1UX01DUzMoeCkJCQkoKCh4KSAmIDB4RikgPDwgMTIpCi0jZGVmaW5lIF9BR0dMTVRfTUNTNCh4KQkJCSgoKHgpICYgMHhGKSA8PCAxNikKLSNkZWZpbmUgX0FHR0xNVF9NQ1M1KHgpCQkJKCgoeCkgJiAweEYpIDw8IDIwKQotI2RlZmluZSBfQUdHTE1UX01DUzYoeCkJCQkoKCh4KSAmIDB4RikgPDwgMjQpCi0jZGVmaW5lIF9BR0dMTVRfTUNTNyh4KQkJCSgoKHgpICYgMHhGKSA8PCAyOCkKLQotCi0vKiAyIFJMICovCi0jZGVmaW5lCVJFVFJZX0xJTUlUX1NIT1JUX1NISUZUCQk4Ci0jZGVmaW5lCVJFVFJZX0xJTUlUX0xPTkdfU0hJRlQJCTAKLQotCi0vKiAyIERBUkZSQyAqLwotI2RlZmluZSBfREFSRl9SQzEoeCkJCQkoKHgpICYgMHgxRikKLSNkZWZpbmUgX0RBUkZfUkMyKHgpCQkJKCgoeCkgJiAweDFGKSA8PCA4KQotI2RlZmluZSBfREFSRl9SQzMoeCkJCQkoKCh4KSAmIDB4MUYpIDw8IDE2KQotI2RlZmluZSBfREFSRl9SQzQoeCkJCQkoKCh4KSAmIDB4MUYpIDw8IDI0KQotLyogIE5PVEU6IHNoaWZ0IHN0YXJ0aW5nIGZyb20gYWRkcmVzcyAoREFSRlJDICsgNCkgKi8KLSNkZWZpbmUgX0RBUkZfUkM1KHgpCQkJKCh4KSAmIDB4MUYpCi0jZGVmaW5lIF9EQVJGX1JDNih4KQkJCSgoKHgpICYgMHgxRikgPDwgOCkKLSNkZWZpbmUgX0RBUkZfUkM3KHgpCQkJKCgoeCkgJiAweDFGKSA8PCAxNikKLSNkZWZpbmUgX0RBUkZfUkM4KHgpCQkJKCgoeCkgJiAweDFGKSA8PCAyNCkKLQotCi0vKiAyIFJBUkZSQyAqLwotI2RlZmluZSBfUkFSRl9SQzEoeCkJCQkoKHgpICYgMHgxRikKLSNkZWZpbmUgX1JBUkZfUkMyKHgpCQkJKCgoeCkgJiAweDFGKSA8PCA4KQotI2RlZmluZSBfUkFSRl9SQzMoeCkJCQkoKCh4KSAmIDB4MUYpIDw8IDE2KQotI2RlZmluZSBfUkFSRl9SQzQoeCkJCQkoKCh4KSAmIDB4MUYpIDw8IDI0KQotLyogIE5PVEU6IHNoaWZ0IHN0YXJ0aW5nIGZyb20gYWRkcmVzcyAoUkFSRlJDICsgNCkgKi8KLSNkZWZpbmUgX1JBUkZfUkM1KHgpCQkJKCh4KSAmIDB4MUYpCi0jZGVmaW5lIF9SQVJGX1JDNih4KQkJCSgoKHgpICYgMHgxRikgPDwgOCkKLSNkZWZpbmUgX1JBUkZfUkM3KHgpCQkJKCgoeCkgJiAweDFGKSA8PCAxNikKLSNkZWZpbmUgX1JBUkZfUkM4KHgpCQkJKCgoeCkgJiAweDFGKSA8PCAyNCkKLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwNTAwaCB+IDB4MDVGRmgJRURDQSBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotCi0KLQotLyogMiBFRENBIHNldHRpbmcgKi8KLSNkZWZpbmUgQUNfUEFSQU1fVFhPUF9MSU1JVF9PRkZTRVQJMTYKLSNkZWZpbmUgQUNfUEFSQU1fRUNXX01BWF9PRkZTRVQJCTEyCi0jZGVmaW5lIEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUCQk4Ci0jZGVmaW5lIEFDX1BBUkFNX0FJRlNfT0ZGU0VUCQkwCi0KLQotLyogMiBFRENBX1ZPX1BBUkFNICovCi0jZGVmaW5lIF9BSUZTKHgpCQkJKHgpCi0jZGVmaW5lIF9FQ1dfTUFYX01JTih4KQkJCSgoeCkgPDwgOCkKLSNkZWZpbmUgX1RYT1BfTElNSVQoeCkJCQkoKHgpIDw8IDE2KQotCi0KLSNkZWZpbmUgX0JDTklGUyh4KQkJCSgoeCkgJiAweEZGKQotI2RlZmluZSBfQkNORUNXKHgpCQkJKCgoeCkgJiAweEYpKTw8IDgpCi0KLQotI2RlZmluZSBfTFJMKHgpCQkJCSgoeCkgJiAweDNGKQotI2RlZmluZSBfU1JMKHgpCQkJCSgoKHgpICYgMHgzRikgPDwgOCkKLQotCi0vKiAyIFNJRlNfQ0NLICovCi0jZGVmaW5lIF9TSUZTX0NDS19DVFgoeCkJCSgoeCkgJiAweEZGKQotI2RlZmluZSBfU0lGU19DQ0tfVFJYKHgpCQkoKCh4KSAmIDB4RkYpIDw8IDgpOwotCi0KLS8qIDIgU0lGU19PRkRNICovCi0jZGVmaW5lIF9TSUZTX09GRE1fQ1RYKHgpCQkoKHgpICYgMHhGRikKLSNkZWZpbmUgX1NJRlNfT0ZETV9UUlgoeCkJCSgoKHgpICYgMHhGRikgPDwgOCk7Ci0KLQotLyogMiBUQlRUIFBST0hJQklUICovCi0jZGVmaW5lIF9UQlRUX1BST0hJQklUX0hPTEQoeCkJCSgoKHgpICYgMHhGRikgPDwgOCkKLQotCi0vKiAyIFJFR19SRF9DVFJMICovCi0jZGVmaW5lIERJU19FRENBX0NOVF9EV04JCUJJVCgxMSkKLQotCi0vKiAyIEJDTl9DVFJMICovCi0jZGVmaW5lIEVOX01CU1NJRAkJCUJJVCgxKQotI2RlZmluZSBFTl9UWEJDTl9SUFQJCQlCSVQoMikKLSNkZWZpbmUJRU5fQkNOX0ZVTkNUSU9OCQkJQklUKDMpCi0jZGVmaW5lIERJU19UU0ZfVVBEQVRFCQkJQklUKDMpCi0KLS8qICBUaGUgc2FtZSBmdW5jdGlvbiBidXQgZGlmZmVyZW50IGJpdCBmaWVsZC4gKi8KLSNkZWZpbmUJRElTX1RTRl9VRFQwX05PUk1BTF9DSElQCUJJVCg0KQotI2RlZmluZQlESVNfVFNGX1VEVDBfVEVTVF9DSElQCQlCSVQoNSkKLQotLyogMiBBQ01IV0NUUkwgKi8KLSNkZWZpbmUJQWNtSHdfSHdFbgkJCUJJVCgwKQotI2RlZmluZQlBY21Id19CZXFFbgkJCUJJVCgxKQotI2RlZmluZQlBY21Id19WaXFFbgkJCUJJVCgyKQotI2RlZmluZQlBY21Id19Wb3FFbgkJCUJJVCgzKQotI2RlZmluZQlBY21Id19CZXFTdGF0dXMJCQlCSVQoNCkKLSNkZWZpbmUJQWNtSHdfVmlxU3RhdHVzCQkJQklUKDUpCi0jZGVmaW5lCUFjbUh3X1ZvcVN0YXR1cwkJCUJJVCg2KQotCi0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDYwMGggfiAweDA3RkZoCVdNQUMgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotLyogMiBBUFNEX0NUUkwgKi8KLSNkZWZpbmUgQVBTRE9GRgkJCQlCSVQoNikKLSNkZWZpbmUgQVBTRE9GRl9TVEFUVVMJCQlCSVQoNykKLQotCi0vKiAyIEJXT1BNT0RFICovCi0jZGVmaW5lIEJXXzIwTUhaCQkJQklUKDIpCi0KLQotI2RlZmluZSBSQVRFX0JJVE1BUF9BTEwJCQkweEZGRkZGCi0KLS8qICBPbmx5IHVzZSBDQ0sgMU0gcmF0ZSBmb3IgQUNLICovCi0jZGVmaW5lIFJBVEVfUlJTUl9DQ0tfT05MWV8xTQkJMHhGRkZGMQotCi0vKiAyIFRDUiAqLwotI2RlZmluZSBUU0ZSU1QJCQkJQklUKDApCi0jZGVmaW5lIERJU19HQ0xLCQkJQklUKDEpCi0jZGVmaW5lIFBBRF9TRUwJCQkJQklUKDIpCi0jZGVmaW5lIFBXUl9TVAkJCQlCSVQoNikKLSNkZWZpbmUgUFdSQklUX09XX0VOCQkJQklUKDcpCi0jZGVmaW5lIEFDUkMJCQkJQklUKDgpCi0jZGVmaW5lIENGRU5ERk9STQkJCUJJVCg5KQotI2RlZmluZSBJQ1YJCQkJQklUKDEwKQotCi0KLQotLyogMiBSQ1IgKi8KLSNkZWZpbmUgQUFQCQkJCUJJVCgwKQotI2RlZmluZSBBUE0JCQkJQklUKDEpCi0jZGVmaW5lIEFNCQkJCUJJVCgyKQotI2RlZmluZSBBQgkJCQlCSVQoMykKLSNkZWZpbmUgQUREMwkJCQlCSVQoNCkKLSNkZWZpbmUgQVBXUk1HVAkJCQlCSVQoNSkKLSNkZWZpbmUgQ0JTU0lECQkJCUJJVCg2KQotI2RlZmluZSBDQlNTSURfQkNOCQkJQklUKDcpCi0jZGVmaW5lIEFDUkMzMgkJCQlCSVQoOCkKLSNkZWZpbmUgQUlDVgkJCQlCSVQoOSkKLSNkZWZpbmUgQURGCQkJCUJJVCgxMSkKLSNkZWZpbmUgQUNGCQkJCUJJVCgxMikKLSNkZWZpbmUgQU1GCQkJCUJJVCgxMykKLSNkZWZpbmUgSFRDX0xPQ19DVFJMCQkJQklUKDE0KQotI2RlZmluZSBVQ19EQVRBX0VOCQkJQklUKDE2KQotI2RlZmluZSBCTV9EQVRBX0VOCQkJQklUKDE3KQotI2RlZmluZSBNRkJFTgkJCQlCSVQoMjIpCi0jZGVmaW5lIExTSUdFTgkJCQlCSVQoMjMpCi0jZGVmaW5lIEVuTUJJRAkJCQlCSVQoMjQpCi0jZGVmaW5lIEFQUF9CQVNTTgkJCUJJVCgyNykKLSNkZWZpbmUgQVBQX1BIWVNUUwkJCUJJVCgyOCkKLSNkZWZpbmUgQVBQX0lDVgkJCQlCSVQoMjkpCi0jZGVmaW5lIEFQUF9NSUMJCQkJQklUKDMwKQotI2RlZmluZSBBUFBfRkNTCQkJCUJJVCgzMSkKLQotLyogMiBSWF9QS1RfTElNSVQgKi8KLQotLyogMiBSWF9ETEtfVElNRSAqLwotCi0vKiAyIE1CSURDQU1DRkcgKi8KLQotCi0KLS8qIDIgQU1QRFVfTUlOX1NQQUNFICovCi0jZGVmaW5lIF9NSU5fU1BBQ0UoeCkJCQkoKHgpICYgMHg3KQotI2RlZmluZSBfU0hPUlRfR0lfUEFERElORyh4KQkJKCgoeCkgJiAweDFGKSA8PCAzKQotCi0KLS8qIDIgUlhFUlJfUlBUICovCi0jZGVmaW5lIFJYRVJSX1RZUEVfT0ZETV9QUERVCQkwCi0jZGVmaW5lIFJYRVJSX1RZUEVfT0ZETWZhbHNlX0FMQVJNCTEKLSNkZWZpbmUJUlhFUlJfVFlQRV9PRkRNX01QRFVfT0sJCTIKLSNkZWZpbmUgUlhFUlJfVFlQRV9PRkRNX01QRFVfRkFJTAkzCi0jZGVmaW5lIFJYRVJSX1RZUEVfQ0NLX1BQRFUJCTQKLSNkZWZpbmUgUlhFUlJfVFlQRV9DQ0tmYWxzZV9BTEFSTQk1Ci0jZGVmaW5lIFJYRVJSX1RZUEVfQ0NLX01QRFVfT0sJCTYKLSNkZWZpbmUgUlhFUlJfVFlQRV9DQ0tfTVBEVV9GQUlMCTcKLSNkZWZpbmUgUlhFUlJfVFlQRV9IVF9QUERVCQk4Ci0jZGVmaW5lIFJYRVJSX1RZUEVfSFRmYWxzZV9BTEFSTQk5Ci0jZGVmaW5lIFJYRVJSX1RZUEVfSFRfTVBEVV9UT1RBTAkxMAotI2RlZmluZSBSWEVSUl9UWVBFX0hUX01QRFVfT0sJCTExCi0jZGVmaW5lIFJYRVJSX1RZUEVfSFRfTVBEVV9GQUlMCQkxMgotI2RlZmluZSBSWEVSUl9UWVBFX1JYX0ZVTExfRFJPUAkJMTUKLQotI2RlZmluZSBSWEVSUl9DT1VOVEVSX01BU0sJCTB4RkZGRkYKLSNkZWZpbmUgUlhFUlJfUlBUX1JTVAkJCUJJVCgyNykKLSNkZWZpbmUgX1JYRVJSX1JQVF9TRUwodHlwZSkJCSgodHlwZSkgPDwgMjgpCi0KLQotLyogMiBTRUNDRkcgKi8KLSNkZWZpbmUJU0NSX1R4VXNlREsJCQlCSVQoMCkJLyogRm9yY2UgVHggVXNlIERlZmF1bHQgS2V5ICovCi0jZGVmaW5lCVNDUl9SeFVzZURLCQkJQklUKDEpCS8qIEZvcmNlIFJ4IFVzZSBEZWZhdWx0IEtleSAqLwotI2RlZmluZQlTQ1JfVHhFbmNFbmFibGUJCQlCSVQoMikJLyogRW5hYmxlIFR4IEVuY3J5cHRpb24gKi8KLSNkZWZpbmUJU0NSX1J4RGVjRW5hYmxlCQkJQklUKDMpCS8qIEVuYWJsZSBSeCBEZWNyeXB0aW9uICovCi0jZGVmaW5lCVNDUl9TS0J5QTIJCQlCSVQoNCkJLyogU2VhcmNoIGtFWSBCWSBBMiAqLwotI2RlZmluZQlTQ1JfTm9TS01DCQkJQklUKDUpCS8qIE5vIEtleSBTZWFyY2ggTXVsdGljYXN0ICovCi0KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHhGRTAwaCB+IDB4RkU1NWgJVVNCIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0KLS8qIDIgVVNCIEluZm9ybWF0aW9uICgweEZFMTcpICovCi0jZGVmaW5lIFVTQl9JU19ISUdIX1NQRUVECQkwCi0jZGVmaW5lIFVTQl9JU19GVUxMX1NQRUVECQkxCi0jZGVmaW5lIFVTQl9TUEVFRF9NQVNLCQkJQklUKDUpCi0KLSNkZWZpbmUgVVNCX05PUk1BTF9TSUVfRVBfTUFTSwkJMHhGCi0jZGVmaW5lIFVTQl9OT1JNQUxfU0lFX0VQX1NISUZUCQk0Ci0KLSNkZWZpbmUgVVNCX1RFU1RfRVBfTUFTSwkJMHgzMAotI2RlZmluZSBVU0JfVEVTVF9FUF9TSElGVAkJNAotCi0vKiAyIFNwZWNpYWwgT3B0aW9uICovCi0jZGVmaW5lIFVTQl9BR0dfRU4JCQlCSVQoMykKLQotCi0vKiAyUkVHX0MySEVWVF9DTEVBUiAqLwotCS8qICBTZXQgYnkgZHJpdmVyIGFuZCBub3RpZnkgRlcgdGhhdCB0aGUgZHJpdmVyIGhhcyByZWFkIHRoZQotCSAgICBDMkggY29tbWFuZCBtZXNzYWdlICovCi0jZGVmaW5lIEMySF9FVlRfSE9TVF9DTE9TRQkJMHgwMAotCS8qICBTZXQgYnkgRlcgaW5kaWNhdGluZyB0aGF0IEZXIGhhZCBzZXQgdGhlIEMySCBjb21tYW5kIG1lc3NhZ2UKLQkgICAgYW5kIGl0J3Mgbm90IHlldCByZWFkIGJ5IGRyaXZlci4gKi8KLSNkZWZpbmUgQzJIX0VWVF9GV19DTE9TRQkJMHhGRgotCi0KLS8qIDJSRUdfTVVMVElfRlVOQ19DVFJMKEZvciBSVEw4NzIzIE9ubHkpICovCi0JLyogIEVuYWJsZSBHUElPWzldIGFzIFdpRmkgSFcgUERuIHNvdXJjZSAqLwotI2RlZmluZQlXTF9IV1BETl9FTgkJCUJJVCgwKQotCS8qICBXaUZpIEhXIFBEbiBwb2xhcml0eSBjb250cm9sICovCi0jZGVmaW5lCVdMX0hXUEROX1NMCQkJQklUKDEpCi0JLyogIFdpRmkgZnVuY3Rpb24gZW5hYmxlICovCi0jZGVmaW5lCVdMX0ZVTkNfRU4JCQlCSVQoMikKLQkvKiAgRW5hYmxlIEdQSU9bOV0gYXMgV2lGaSBSRiBIVyBQRG4gc291cmNlICovCi0jZGVmaW5lCVdMX0hXUk9GX0VOCQkJQklUKDMpCi0JLyogIEVuYWJsZSBHUElPWzExXSBhcyBCVCBIVyBQRG4gc291cmNlICovCi0jZGVmaW5lCUJUX0hXUEROX0VOCQkJQklUKDE2KQotCS8qICBCVCBIVyBQRG4gcG9sYXJpdHkgY29udHJvbCAqLwotI2RlZmluZQlCVF9IV1BETl9TTAkJCUJJVCgxNykKLQkvKiAgQlQgZnVuY3Rpb24gZW5hYmxlICovCi0jZGVmaW5lCUJUX0ZVTkNfRU4JCQlCSVQoMTgpCi0JLyogIEVuYWJsZSBHUElPWzExXSBhcyBCVC9HUFMgUkYgSFcgUERuIHNvdXJjZSAqLwotI2RlZmluZQlCVF9IV1JPRl9FTgkJCUJJVCgxOSkKLQkvKiAgRW5hYmxlIEdQSU9bMTBdIGFzIEdQUyBIVyBQRG4gc291cmNlICovCi0jZGVmaW5lCUdQU19IV1BETl9FTgkJCUJJVCgyMCkKLQkvKiAgR1BTIEhXIFBEbiBwb2xhcml0eSBjb250cm9sICovCi0jZGVmaW5lCUdQU19IV1BETl9TTAkJCUJJVCgyMSkKLQkvKiAgR1BTIGZ1bmN0aW9uIGVuYWJsZSAqLwotI2RlZmluZQlHUFNfRlVOQ19FTgkJCUJJVCgyMikKLQotLyogMyBSRUdfTElGRUNUUkxfQ1RSTCAqLwotI2RlZmluZQlIQUw5MkNfRU5fUEtUX0xJRkVfVElNRV9CSwlCSVQoMykKLSNkZWZpbmUJSEFMOTJDX0VOX1BLVF9MSUZFX1RJTUVfQkUJQklUKDIpCi0jZGVmaW5lCUhBTDkyQ19FTl9QS1RfTElGRV9USU1FX1ZJCUJJVCgxKQotI2RlZmluZQlIQUw5MkNfRU5fUEtUX0xJRkVfVElNRV9WTwlCSVQoMCkKLQotI2RlZmluZQlIQUw5MkNfTVNEVV9MSUZFX1RJTUVfVU5JVAkxMjgJLyogIGluIHVzLCBzYWlkIGJ5IFRpbS4gKi8KLQotLyogICovCi0vKiAgR2VuZXJhbCBkZWZpbml0aW9ucyAqLwotLyogICovCi0KLSNkZWZpbmUgTEFTVF9FTlRSWV9PRl9UWF9QS1RfQlVGRkVSCTI1NQotCi0jZGVmaW5lIFBPTExJTkdfTExUX1RIUkVTSE9MRAkJMjAKLSNkZWZpbmUgUE9MTElOR19SRUFEWV9USU1FT1VUX0NPVU5UCTEwMDAKLQotLyogIE1pbiBTcGFjaW5nIHJlbGF0ZWQgc2V0dGluZ3MuICovCi0jZGVmaW5lCU1BWF9NU1NfREVOU0lUWV8yVAkJMHgxMwotI2RlZmluZQlNQVhfTVNTX0RFTlNJVFlfMVQJCTB4MEEKLQotLyogICovCi0vKgk4NzIzQSBSZWdzaXRlciBvZmZzZXQgZGVmaW5pdGlvbiAqLwotLyogICovCi0jZGVmaW5lIEhBTF84NzIzQV9OQVZfVVBQRVJfVU5JVAkxMjgJCS8qICBtaWNyby1zZWNvbmQgKi8KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDAwMGggfiAweDAwRkZoCVN5c3RlbSBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotI2RlZmluZSBSRUdfU1lTT05fUkVHX0xPQ0sJCTB4MDAxQwotCi0KLS8qICAqLwotLyogICovCi0vKgkweDAxMDBoIH4gMHgwMUZGaAlNQUNUT1AgR2VuZXJhbCBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotI2RlZmluZSBSRUdfRlRJTVIJCQkweDAxMzgKLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMjAwaCB+IDB4MDI3RmgJVFhETUEgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMjgwaCB+IDB4MDJGRmgJUlhETUEgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMzAwaCB+IDB4MDNGRmgJUENJZSAqLwotLyogICovCi0vKiAgKi8KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwNDAwaCB+IDB4MDQ3RmgJUHJvdG9jb2wgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLSNkZWZpbmUgUkVHX0VBUkxZX01PREVfQ09OVFJPTAkJMHg0RDAKLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwNTAwaCB+IDB4MDVGRmgJRURDQSBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotCi0vKiAyIEJDTl9DVFJMICovCi0jZGVmaW5lIERJU19BVElNCQkJQklUKDApCi0jZGVmaW5lIERJU19CQ05RX1NVQgkJCUJJVCgxKQotI2RlZmluZSBESVNfVFNGX1VEVAkJCUJJVCg0KQotCi0KLS8qICAqLwotLyogICovCi0vKgkweDA2MDBoIH4gMHgwN0ZGaAlXTUFDIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0vKiAgKi8KLS8qICBOb3RlOiAqLwotLyoJVGhlIE5BViB1cHBlciB2YWx1ZSBpcyB2ZXJ5IGltcG9ydGFudCB0byBXaUZpIDExbiA1LjIuMyBOQVYgdGVzdC4KLSAqCVRoZSBkZWZhdWx0IHZhbHVlIGlzIGFsd2F5cyB0b28gc21hbGwsIGJ1dCB0aGUgV2lGaSBUZXN0UGxhbiB0ZXN0Ci0gKglieSAyNSwwMDAgbWljcm9zZWNvbmRzIG9mIE5BViB0aHJvdWdoIHNlbmRpbmcgQ1RTIGluIHRoZSBhaXIuIFdlCi0gKgltdXN0IHVwZGF0ZSB0aGlzIHZhbHVlIGdyZWF0ZXIgdGhhbiAyNSwwMDAgbWljcm9zZWNvbmRzIHRvIHBhc3MgdGhlCi0gKglpdGVtLgotKglUaGUgb2Zmc2V0IG9mIE5BVl9VUFBFUiBpbiA4MTkyQyBTcGVjIGlzIGluY29ycmVjdCwgYW5kIHRoZSBvZmZzZXQKLSoJc2hvdWxkIGJlIDB4MDY1Mi4gQ29tbWVudGVkIGJ5IFNEMSBTY290dC4gKi8KLS8qICBCeSBCcnVjZSwgMjAxMS0wNy0xOC4gKi8KLS8qICAqLwotI2RlZmluZQlSRUdfTkFWX1VQUEVSCQkJMHgwNjUyCS8qICB1bml0IG9mIDEyOCAqLwotCi0KLS8qICAqLwotLyoJODcyMyBSZWdzaXRlciBCaXQgYW5kIENvbnRlbnQgZGVmaW5pdGlvbiAqLwotLyogICovCi0KLS8qICAqLwotLyogICovCi0vKgkweDAwMDBoIH4gMHgwMEZGaAlTeXN0ZW0gQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotLyogMiBTUFMwX0NUUkwgKi8KLQotLyogMiBTWVNfSVNPX0NUUkwgKi8KLQotLyogMiBTWVNfRlVOQ19FTiAqLwotCi0vKiAyIEFQU19GU01DTyAqLwotI2RlZmluZSBFTl9XTE9OCQkJCUJJVCgxNikKLQotLyogMiBTWVNfQ0xLUiAqLwotCi0vKiAyIDkzNDZDUiAqLwotCi0vKiAyIEFGRV9NSVNDICovCi0KLS8qIDIgU1BTMF9DVFJMICovCi0KLS8qIDIgU1BTX09DUF9DRkcgKi8KLQotLyogMiBTWVNPTl9SRUdfTE9DSyAqLwotI2RlZmluZSBXTE9DS19BTEwJCQlCSVQoMCkKLSNkZWZpbmUgV0xPQ0tfMDAJCQlCSVQoMSkKLSNkZWZpbmUgV0xPQ0tfMDQJCQlCSVQoMikKLSNkZWZpbmUgV0xPQ0tfMDgJCQlCSVQoMykKLSNkZWZpbmUgV0xPQ0tfNDAJCQlCSVQoNCkKLSNkZWZpbmUgV0xPQ0tfMUNfQjYJCQlCSVQoNSkKLSNkZWZpbmUgUl9ESVNfUFJTVF8xCQkJQklUKDYpCi0jZGVmaW5lIExPQ0tfQUxMX0VOCQkJQklUKDcpCi0KLS8qIDIgUkZfQ1RSTCAqLwotCi0vKiAyIExET0ExNV9DVFJMICovCi0KLS8qIDIgTERPVjEyRF9DVFJMICovCi0KLS8qIDIgQUZFX1hUQUxfQ1RSTCAqLwotCi0vKiAyIEFGRV9QTExfQ1RSTCAqLwotCi0vKiAyIEVGVVNFX0NUUkwgKi8KLQotLyogMiBFRlVTRV9URVNUIChGb3IgUlRMODcyMyBwYXJ0aWFsbHkpICovCi0KLS8qIDIgUFdSX0RBVEEgKi8KLQotLyogMiBDQUxfVElNRVIgKi8KLQotLyogMiBBQ0xLX01PTiAqLwotCi0vKiAyIEdQSU9fTVVYQ0ZHICovCi0KLS8qIDIgR1BJT19QSU5fQ1RSTCAqLwotCi0vKiAyIEdQSU9fSU5UTSAqLwotCi0vKiAyIExFRENGRyAqLwotCi0vKiAyIEZTSU1SICovCi0KLS8qIDIgRlNJU1IgKi8KLQotLyogMiBIU0lNUiAqLwotLyogIDg3MjMgSG9zdCBTeXN0ZW0gSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKG9mZnNldCAweDU4LCAzMiBieXRlKSAqLwotI2RlZmluZSBIU0lNUl9HUElPMTJfMF9JTlRfRU4JCUJJVCgwKQotI2RlZmluZSBIU0lNUl9TUFNfT0NQX0lOVF9FTgkJQklUKDUpCi0jZGVmaW5lIEhTSU1SX1JPTl9JTlRfRU4JCUJJVCg2KQotI2RlZmluZSBIU0lNUl9QRE5JTlRfRU4JCQlCSVQoNykKLSNkZWZpbmUgSFNJTVJfR1BJTzlfSU5UX0VOCQlCSVQoMjUpCi0KLS8qIDIgSFNJU1IgKi8KLS8qICA4NzIzIEhvc3QgU3lzdGVtIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKG9mZnNldCAweDVDLCAzMiBieXRlKSAqLwotI2RlZmluZSBIU0lTUl9HUElPMTJfMF9JTlQJCUJJVCgwKQotI2RlZmluZSBIU0lTUl9TUFNfT0NQX0lOVAkJQklUKDUpCi0jZGVmaW5lIEhTSVNSX1JPTl9JTlQJCQlCSVQoNikKLSNkZWZpbmUgSFNJU1JfUEROSU5UCQkJQklUKDcpCi0jZGVmaW5lCUhTSVNSX0dQSU85X0lOVAkJCUJJVCgyNSkKLQotLyogIGludGVycnVwdCBtYXNrIHdoaWNoIG5lZWRzIHRvIGNsZWFyICovCi0jZGVmaW5lIE1BU0tfSFNJU1JfQ0xFQVIJCShIU0lTUl9HUElPMTJfMF9JTlQgfCBcCi0JCQkJCSBIU0lTUl9TUFNfT0NQX0lOVCB8IFwKLQkJCQkJIEhTSVNSX1JPTl9JTlQgfCBcCi0JCQkJCSBIU0lTUl9QRE5JTlQgfAlcCi0JCQkJCSBIU0lTUl9HUElPOV9JTlQpCi0KLS8qIDIgTUNVRldETCAqLwotI2RlZmluZSBSQU1fRExfU0VMCQkJQklUKDcpCS8qICAxOlJBTSwgMDpST00gKi8KLQotLyogMiBIUE9OX0ZTTSAqLwotCi0vKiAyIFNZU19DRkcgKi8KLSNkZWZpbmUgUlRMX0lECQkJCUJJVCgyMykJLyogIFRlc3RDaGlwIElELAotCQkJCQkJICAgIDE6VGVzdChSTEUpOyAwOk1QKFJMKSAqLwotI2RlZmluZSBTUFNfU0VMCQkJCUJJVCgyNCkgLyogIDE6TERPIHJlZ3VsYXRvciBtb2RlOwotCQkJCQkJICAgIDA6U3dpdGNoaW5nIHJlZ3VsYXRvciBtb2RlKi8KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMTAwaCB+IDB4MDFGRmgJTUFDVE9QIEdlbmVyYWwgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotLyogMiBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXJzICovCi0KLS8qIDIgQ1IgKi8KLSNkZWZpbmUgQ0FMVE1SX0VOCQkJQklUKDEwKQotCi0vKiAyIFBCUCAtIFBhZ2UgU2l6ZSBSZWdpc3RlciAqLwotCi0vKiAyIFRYL1JYRE1BICovCi0KLS8qIDIgVFJYRkZfQk5EWSAqLwotCi0vKiAyIExMVF9JTklUICovCi0KLS8qIDIgQkJfQUNDRVNTX0NUUkwgKi8KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMjAwaCB+IDB4MDI3RmgJVFhETUEgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotLyogMiBSUVBOICovCi0KLS8qIDIgVERFQ1RSTCAqLwotCi0vKiAyIFRERUNUTCAqLwotCi0vKiAyIFRYRE1BX09GRlNFVF9DSEsgKi8KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwNDAwaCB+IDB4MDQ3RmgJUHJvdG9jb2wgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotLyogMiBGV0hXX1RYUV9DVFJMICovCi0KLS8qIDIgSU5JUlRTTUNTX1NFTCAqLwotCi0vKiAyIFNQRUMgU0lGUyAqLwotCi0vKiAyIFJSU1IgKi8KLQotLyogMiBBUkZSICovCi0KLS8qIDIgQUdHTEVOX0xNVF9MICovCi0KLS8qIDIgUkwgKi8KLQotLyogMiBEQVJGUkMgKi8KLQotLyogMiBSQVJGUkMgKi8KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwNTAwaCB+IDB4MDVGRmgJRURDQSBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotCi0vKiAyIEVEQ0Egc2V0dGluZyAqLwotCi0vKiAyIEVEQ0FfVk9fUEFSQU0gKi8KLQotLyogMiBTSUZTX0NDSyAqLwotCi0vKiAyIFNJRlNfT0ZETSAqLwotCi0vKiAyIFRCVFQgUFJPSElCSVQgKi8KLQotLyogMiBSRUdfUkRfQ1RSTCAqLwotCi0vKiAyIEJDTl9DVFJMICovCi0KLS8qIDIgQUNNSFdDVFJMICovCi0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDYwMGggfiAweDA3RkZoCVdNQUMgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotLyogMiBBUFNEX0NUUkwgKi8KLQotLyogMiBCV09QTU9ERSAqLwotCi0vKiAyIFRDUiAqLwotCi0vKiAyIFJDUiAqLwotCi0vKiAyIFJYX1BLVF9MSU1JVCAqLwotCi0vKiAyIFJYX0RMS19USU1FICovCi0KLS8qIDIgTUJJRENBTUNGRyAqLwotCi0vKiAyIEFNUERVX01JTl9TUEFDRSAqLwotCi0vKiAyIFJYRVJSX1JQVCAqLwotCi0vKiAyIFNFQ0NGRyAqLwotCi0KLS8qICAqLwotLyogICovCi0vKgkweEZFMDBoIH4gMHhGRTU1aAlSVEw4NzIzIFNESU8gQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotLyogIEkvTyBidXMgZG9tYWluIGFkZHJlc3MgbWFwcGluZyAqLwotI2RlZmluZSBXTEFOX0lPUkVHX0JBU0UJCQkweDEwMjYwMDAwCi0jZGVmaW5lIEZJUk1XQVJFX0ZJRk9fQkFTRQkJMHgxMDI3MDAwMAotI2RlZmluZSBUWF9ISVFfQkFTRQkJCTB4MTAzMTAwMDAKLSNkZWZpbmUgVFhfTUlRX0JBU0UJCQkweDEwMzIwMDAwCi0jZGVmaW5lIFRYX0xPUV9CQVNFCQkJMHgxMDMzMDAwMAotI2RlZmluZSBSWF9SWDBGRl9CQVNFCQkJMHgxMDM0MDAwMAotCi0vKiAgU0RJTyBob3N0IGxvY2FsIHJlZ2lzdGVyIHNwYWNlIG1hcHBpbmcuICovCi0jZGVmaW5lIFdMQU5fSU9SRUdfTVNLCQkJMHg3RkZGCi0jZGVmaW5lIFdMQU5fRklGT19NU0sJCQkweDFGRkYJLyogIEFnZ3JlZ2F0aW9uIExlbmd0aFsxMjowXSAqLwotI2RlZmluZSBXTEFOX1JYMEZGX01TSwkJCTB4MDAwMwotCi0jZGVmaW5lIFdMQU5fUlgwRkZfREVWSUNFX0lECQk3CS8qICAwYlsxNl0sIDExMWJbMTU6MTNdICovCi0jZGVmaW5lIFdMQU5fSU9SRUdfREVWSUNFX0lECQk4CS8qICAxYlsxNl0gKi8KLQotLyogIDg3MjMgRUZVU0UgKi8KLSNkZWZpbmUgSFdTRVRfTUFYX1NJWkUJCQkyNTYKLQotCi0vKiBVU0IgaW50ZXJydXB0ICovCi0jZGVmaW5lCVVISU1SX1RJTUVPVVQyCQkJQklUKDMxKQotI2RlZmluZQlVSElNUl9USU1FT1VUMQkJCUJJVCgzMCkKLSNkZWZpbmUJVUhJTVJfUFNUSU1FT1VUCQkJQklUKDI5KQotI2RlZmluZQlVSElNUl9HVElOVDQJCQlCSVQoMjgpCi0jZGVmaW5lCVVISU1SX0dUSU5UMwkJCUJJVCgyNykKLSNkZWZpbmUJVUhJTVJfVFhCQ05FUlIJCQlCSVQoMjYpCi0jZGVmaW5lCVVISU1SX1RYQkNOT0sJCQlCSVQoMjUpCi0jZGVmaW5lCVVISU1SX1RTRl9CSVQzMl9UT0dHTEUJCUJJVCgyNCkKLSNkZWZpbmUJVUhJTVJfQkNORE1BSU5UMwkJQklUKDIzKQotI2RlZmluZQlVSElNUl9CQ05ETUFJTlQyCQlCSVQoMjIpCi0jZGVmaW5lCVVISU1SX0JDTkRNQUlOVDEJCUJJVCgyMSkKLSNkZWZpbmUJVUhJTVJfQkNORE1BSU5UMAkJQklUKDIwKQotI2RlZmluZQlVSElNUl9CQ05ET0szCQkJQklUKDE5KQotI2RlZmluZQlVSElNUl9CQ05ET0syCQkJQklUKDE4KQotI2RlZmluZQlVSElNUl9CQ05ET0sxCQkJQklUKDE3KQotI2RlZmluZQlVSElNUl9CQ05ET0swCQkJQklUKDE2KQotI2RlZmluZQlVSElNUl9IU0lTUl9JTkQJCQlCSVQoMTUpCi0jZGVmaW5lCVVISU1SX0JDTkRNQUlOVF9FCQlCSVQoMTQpCi0vKiBSU1ZECUJJVCgxMykgKi8KLSNkZWZpbmUJVUhJTVJfQ1RXX0VORAkJCUJJVCgxMikKLS8qIFJTVkQJQklUKDExKSAqLwotI2RlZmluZQlVSElNUl9DMkhDTUQJCQlCSVQoMTApCi0jZGVmaW5lCVVISU1SX0NQV00yCQkJQklUKDkpCi0jZGVmaW5lCVVISU1SX0NQV00JCQlCSVQoOCkKLSNkZWZpbmUJVUhJTVJfSElHSERPSwkJCUJJVCg3KQkvKiAgSGlnaCBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJVUhJTVJfTUdOVERPSwkJCUJJVCg2KQkvKiAgTWFuYWdlbWVudCBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJVUhJTVJfQktET0sJCQlCSVQoNSkJLyogIEFDX0JLIERNQSBPSyBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJVUhJTVJfQkVET0sJCQlCSVQoNCkJLyogIEFDX0JFIERNQSBPSyBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJVUhJTVJfVklET0sJCQlCSVQoMykJLyogIEFDX1ZJIERNQSBPSyBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJVUhJTVJfVk9ET0sJCQlCSVQoMikJLyogIEFDX1ZPIERNQSBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJVUhJTVJfUkRVCQkJQklUKDEpCS8qICBSZWNlaXZlIERlc2NyaXB0b3IKLQkJCQkJCSAgICBVbmF2YWlsYWJsZSAqLwotI2RlZmluZQlVSElNUl9ST0sJCQlCSVQoMCkJLyogIFJlY2VpdmUgRE1BIE9LIEludGVycnVwdCAqLwotCi0vKiAgVVNCIEhvc3QgSW50ZXJydXB0IFN0YXR1cyBFeHRlbnNpb24gYml0ICovCi0jZGVmaW5lCVVISU1SX0JDTkRNQUlOVDcJCUJJVCgyMykKLSNkZWZpbmUJVUhJTVJfQkNORE1BSU5UNgkJQklUKDIyKQotI2RlZmluZQlVSElNUl9CQ05ETUFJTlQ1CQlCSVQoMjEpCi0jZGVmaW5lCVVISU1SX0JDTkRNQUlOVDQJCUJJVCgyMCkKLSNkZWZpbmUJVUhJTVJfQkNORE9LNwkJCUJJVCgxOSkKLSNkZWZpbmUJVUhJTVJfQkNORE9LNgkJCUJJVCgxOCkKLSNkZWZpbmUJVUhJTVJfQkNORE9LNQkJCUJJVCgxNykKLSNkZWZpbmUJVUhJTVJfQkNORE9LNAkJCUJJVCgxNikKLS8qICBiaXQxNC0xNTogUlNWRCAqLwotI2RlZmluZQlVSElNUl9BVElNRU5EX0UJCQlCSVQoMTMpCi0jZGVmaW5lCVVISU1SX0FUSU1FTkQJCQlCSVQoMTIpCi0jZGVmaW5lCVVISU1SX1RYRVJSCQkJQklUKDExKQotI2RlZmluZQlVSElNUl9SWEVSUgkJCUJJVCgxMCkKLSNkZWZpbmUJVUhJTVJfVFhGT1ZXCQkJQklUKDkpCi0jZGVmaW5lCVVISU1SX1JYRk9WVwkJCUJJVCg4KQotLyogIGJpdDItNzogUlNWRCAqLwotI2RlZmluZQlVSElNUl9PQ1BJTlQJCQlCSVQoMSkKLS8qICBiaXQwOiBSU1ZEICovCi0KLSNkZWZpbmUJUkVHX1VTQl9ISU1SCQkJMHhGRTM4Ci0jZGVmaW5lCVJFR19VU0JfSElNUkUJCQkweEZFM0MKLSNkZWZpbmUJUkVHX1VTQl9ISVNSCQkJMHhGRTc4Ci0jZGVmaW5lCVJFR19VU0JfSElTUkUJCQkweEZFN0MKLQotI2RlZmluZQlVU0JfSU5UUl9DUFdNX09GRlNFVAkJMTYKLSNkZWZpbmUJVVNCX0lOVFJfQ09OVEVOVF9ISVNSX09GRlNFVAk0OAotI2RlZmluZQlVU0JfSU5UUl9DT05URU5UX0hJU1JFX09GRlNFVAk1MgotI2RlZmluZQlVU0JfSU5UUl9DT05URU5UX0xFTkdUSAkJNTYKLSNkZWZpbmUJVVNCX0MySF9DTURJRF9PRkZTRVQJCTAKLSNkZWZpbmUJVVNCX0MySF9TRVFfT0ZGU0VUCQkxCi0jZGVmaW5lCVVTQl9DMkhfRVZFTlRfT0ZGU0VUCQkyCi0vKiAgKi8KLS8qCUdlbmVyYWwgZGVmaW5pdGlvbnMgKi8KLS8qICAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9zcmVzZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9zcmVzZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5NzkxMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2Ffc3Jlc2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX1JUTDg3MjNBX1NSRVNFVF9IXwotI2RlZmluZSBfUlRMODcyM0FfU1JFU0VUX0hfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8cnR3X3NyZXNldC5oPgotCi12b2lkIHJ0bDg3MjNhX3NyZXNldF94bWl0X3N0YXR1c19jaGVjayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfeG1pdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX3htaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RiMjlmNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfeG1pdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUTDg3MjNBX1hNSVRfSF9fCi0jZGVmaW5lIF9fUlRMODcyM0FfWE1JVF9IX18KLQotLyogICovCi0vKiAgUXVldWUgU2VsZWN0IFZhbHVlIGluIFR4RGVzYyAqLwotLyogICovCi0jZGVmaW5lIFFTTFRfQksJCQkJCQkJMHgyLyogMHgwMSAqLwotI2RlZmluZSBRU0xUX0JFCQkJCQkJCTB4MAotI2RlZmluZSBRU0xUX1ZJCQkJCQkJCTB4NS8qIDB4NCAqLwotI2RlZmluZSBRU0xUX1ZPCQkJCQkJCTB4Ny8qIDB4NiAqLwotI2RlZmluZSBRU0xUX0JFQUNPTgkJCQkJCTB4MTAKLSNkZWZpbmUgUVNMVF9ISUdICQkJCQkJMHgxMQotI2RlZmluZSBRU0xUX01HTlQJCQkJCQkweDEyCi0jZGVmaW5lIFFTTFRfQ01ECQkJCQkJMHgxMwotCi0vKiAgKi8KLS8qIGRlZmluZWQgZm9yIFRYIERFU0MgT3BlcmF0aW9uICovCi0vKiAgKi8KLQotI2RlZmluZSBNQVhfVElEICgxNSkKLQotLyogT0ZGU0VUIDAgKi8KLSNkZWZpbmUgT0ZGU0VUX1NaCTAKLSNkZWZpbmUgT0ZGU0VUX1NIVAkxNgotI2RlZmluZSBCTUMJCUJJVCgyNCkKLSNkZWZpbmUgTFNHCQlCSVQoMjYpCi0jZGVmaW5lIEZTRwkJQklUKDI3KQotI2RlZmluZSBPV04JCUJJVCgzMSkKLQotCi0vKiBPRkZTRVQgNCAqLwotI2RlZmluZSBQS1RfT0ZGU0VUX1NaCTAKLSNkZWZpbmUgQksJCUJJVCg2KQotI2RlZmluZSBRU0VMX1NIVAk4Ci0jZGVmaW5lIFJhdGVfSURfU0hUCTE2Ci0jZGVmaW5lIE5BVlVTRUhEUglCSVQoMjApCi0jZGVmaW5lIFBLVF9PRkZTRVRfU0hUCTI2Ci0jZGVmaW5lIEhXUEMJCUJJVCgzMSkKLQotLyogT0ZGU0VUIDggKi8KLSNkZWZpbmUgQUdHX0VOCQlCSVQoMjkpCi0KLS8qIE9GRlNFVCAxMiAqLwotI2RlZmluZSBTRVFfU0hUCQkxNgotCi0vKiBPRkZTRVQgMTYgKi8KLSNkZWZpbmUgUW9TCQlCSVQoNikKLSNkZWZpbmUgSFdfU0VRX0VOCUJJVCg3KQotI2RlZmluZSBVU0VSQVRFCQlCSVQoOCkKLSNkZWZpbmUgRElTREFUQUZCCUJJVCgxMCkKLSNkZWZpbmUgREFUQV9TSE9SVAlCSVQoMjQpCi0jZGVmaW5lIERBVEFfQlcJCUJJVCgyNSkKLQotLyogT0ZGU0VUIDIwICovCi0jZGVmaW5lIFNHSQkJQklUKDYpCi0KLXN0cnVjdCB0eGRlc2NfODcyM2EgewotCXUzMiBwa3RsZW46MTY7Ci0JdTMyIG9mZnNldDo4OwotCXUzMiBibWM6MTsKLQl1MzIgaHRjOjE7Ci0JdTMyIGxzOjE7Ci0JdTMyIGZzOjE7Ci0JdTMyIGxpbmlwOjE7Ci0JdTMyIG5vYWNtOjE7Ci0JdTMyIGdmOjE7Ci0JdTMyIG93bjoxOwotCi0JdTMyIG1hY2lkOjU7Ci0JdTMyIGFnZ19lbjoxOwotCXUzMiBiazoxOwotCXUzMiByZF9lbjoxOwotCXUzMiBxc2VsOjU7Ci0JdTMyIHJkX25hdl9leHQ6MTsKLQl1MzIgbHNpZ190eG9wX2VuOjE7Ci0JdTMyIHBpZnM6MTsKLQl1MzIgcmF0ZV9pZDo0OwotCXUzMiBuYXZ1c2VoZHI6MTsKLQl1MzIgZW5fZGVzY19pZDoxOwotCXUzMiBzZWN0eXBlOjI7Ci0JdTMyIHJzdmQwNDI0OjI7Ci0JdTMyIHBrdF9vZmZzZXQ6NTsJLyogIHVuaXQ6IDggYnl0ZXMgKi8KLQl1MzIgcnN2ZDA0MzE6MTsKLQotCXUzMiBydHNfcmM6NjsKLQl1MzIgZGF0YV9yYzo2OwotCXUzMiByc3ZkMDgxMjoyOwotCXUzMiBiYXJfcnR5X3RoOjI7Ci0JdTMyIHJzdmQwODE2OjE7Ci0JdTMyIG1vcmVmcmFnOjE7Ci0JdTMyIHJhdzoxOwotCXUzMiBjY3g6MTsKLQl1MzIgYW1wZHVfZGVuc2l0eTozOwotCXUzMiBidF9udWxsOjE7Ci0JdTMyIGFudF9zZWxfYToxOwotCXUzMiBhbnRfc2VsX2I6MTsKLQl1MzIgdHhfYW50X2NjazoyOwotCXUzMiB0eF9hbnRsOjI7Ci0JdTMyIHR4X2FudF9odDoyOwotCi0JdTMyIG5leHRoZWFkcGFnZTo4OwotCXUzMiB0YWlscGFnZTo4OwotCXUzMiBzZXE6MTI7Ci0JdTMyIGNwdV9oYW5kbGU6MTsKLQl1MzIgdGFnMToxOwotCXUzMiB0cmlnZ2VyX2ludDoxOwotCXUzMiBod3NlcV9lbjoxOwotCi0JdTMyIHJ0c3JhdGU6NTsKLQl1MzIgYXBfZGNmZToxOwotCXUzMiBod3NlcV9zZWw6MjsKLQl1MzIgdXNlcmF0ZToxOwotCXUzMiBkaXNydHNmYjoxOwotCXUzMiBkaXNkYXRhZmI6MTsKLQl1MzIgY3RzMnNlbGY6MTsKLQl1MzIgcnRzZW46MTsKLQl1MzIgaHdfcnRzX2VuOjE7Ci0JdTMyIHBvcnRfaWQ6MTsKLQl1MzIgcnN2ZDE2MTU6MzsKLQl1MzIgd2FpdF9kY3RzOjE7Ci0JdTMyIGN0czJhcF9lbjoxOwotCXUzMiBkYXRhX3NjOjI7Ci0JdTMyIGRhdGFfc3RiYzoyOwotCXUzMiBkYXRhX3Nob3J0OjE7Ci0JdTMyIGRhdGFfYnc6MTsKLQl1MzIgcnRzX3Nob3J0OjE7Ci0JdTMyIHJ0c19idzoxOwotCXUzMiBydHNfc2M6MjsKLQl1MzIgdmNzX3N0YmM6MjsKLQotCXUzMiBkYXRhcmF0ZTo2OwotCXUzMiBzZ2k6MTsKLQl1MzIgdHJ5X3JhdGU6MTsKLQl1MzIgZGF0YV9yYXRlZmJfbG10OjU7Ci0JdTMyIHJ0c19yYXRlZmJfbG10OjQ7Ci0JdTMyIHJ0eV9sbXRfZW46MTsKLQl1MzIgZGF0YV9ydF9sbXQ6NjsKLQl1MzIgdXNiX3R4YWdnX251bTo4OwotCi0JdTMyIHR4YWdnX2E6NTsKLQl1MzIgdHhhZ2dfYjo1OwotCXUzMiB1c2VfbWF4X2xlbjoxOwotCXUzMiBtYXhfYWdnX251bTo1OwotCXUzMiBtY3NnMV9tYXhfbGVuOjQ7Ci0JdTMyIG1jc2cyX21heF9sZW46NDsKLQl1MzIgbWNzZzNfbWF4X2xlbjo0OwotCXUzMiBtY3M3X3NnaV9tYXhfbGVuOjQ7Ci0KLQl1MzIgY2hlY2tzdW06MTY7CS8qICBUeEJ1ZmZTaXplKFBDSWUpL0NoZWNrU3VtKFVTQikgKi8KLQl1MzIgbWNzZzRfbWF4X2xlbjo0OwotCXUzMiBtY3NnNV9tYXhfbGVuOjQ7Ci0JdTMyIG1jc2c2X21heF9sZW46NDsKLQl1MzIgbWNzMTVfc2dpX21heF9sZW46NDsKLX07Ci0KLSNkZWZpbmUgdHhkZXNjX3NldF9jY3hfc3dfODcyM2EodHhkZXNjLCB2YWx1ZSkgXAotCWRvIHsgXAotCQkoKHN0cnVjdCB0eGRlc2NfODcyM2EgKikodHhkZXNjKSktPm1jc2c0X21heF9sZW4gPSAoKCh2YWx1ZSk+PjgpICYgMHgwZik7IFwKLQkJKChzdHJ1Y3QgdHhkZXNjXzg3MjNhICopKHR4ZGVzYykpLT5tY3MxNV9zZ2lfbWF4X2xlbj0gKCgodmFsdWUpPj40KSAmIDB4MGYpOyBcCi0JCSgoc3RydWN0IHR4ZGVzY184NzIzYSAqKSh0eGRlc2MpKS0+bWNzZzZfbWF4X2xlbiA9ICgodmFsdWUpICYgMHgwZik7IFwKLQl9IHdoaWxlICgwKQotCi1zdHJ1Y3QgdHhycHRfY2N4Xzg3MjNhIHsKLQkvKiBvZmZzZXQgMCAqLwotCXU4IHRhZzE6MTsKLQl1OCByc3ZkOjQ7Ci0JdTggaW50X2J0OjE7Ci0JdTggaW50X3RyaToxOwotCXU4IGludF9jY3g6MTsKLQotCS8qIG9mZnNldCAxICovCi0JdTggbWFjX2lkOjU7Ci0JdTggcGt0X2Ryb3A6MTsKLQl1OCBwa3Rfb2s6MTsKLQl1OCBibWM6MTsKLQotCS8qIG9mZnNldCAyICovCi0JdTggcmV0cnlfY250OjY7Ci0JdTggbGlmZXRpbWVfb3ZlcjoxOwotCXU4IHJldHJ5X292ZXI6MTsKLQotCS8qIG9mZnNldCAzICovCi0JdTggY2N4X3F0aW1lMDsKLQl1OCBjY3hfcXRpbWUxOwotCi0JLyogb2Zmc2V0IDUgKi8KLQl1OCBmaW5hbF9kYXRhX3JhdGU7Ci0KLQkvKiBvZmZzZXQgNiAqLwotCXU4IHN3MTo0OwotCXU4IHFzZWw6NDsKLQotCS8qIG9mZnNldCA3ICovCi0JdTggc3cwOwotfTsKLQotI2RlZmluZSB0eHJwdF9jY3hfc3dfODcyM2EodHhycHRfY2N4KSAoKHR4cnB0X2NjeCktPnN3MCArICgodHhycHRfY2N4KS0+c3cxPDw4KSkKLSNkZWZpbmUgdHhycHRfY2N4X3F0aW1lXzg3MjNhKHR4cnB0X2NjeCkgKCh0eHJwdF9jY3gpLT5jY3hfcXRpbWUwKygodHhycHRfY2N4KS0+Y2N4X3F0aW1lMTw8OCkpCi0KLXZvaWQgaGFuZGxlX3R4cnB0X2NjeF84NzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHZvaWQgKmJ1Zik7Ci12b2lkIHJ0bDg3MjNhX2ZpbGxfZmFrZV90eGRlc2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnBEZXNjLCB1MzIgQnVmZmVyTGVuLCB1OCBJc1BzUG9sbCwgdTggSXNCVFFvc051bGwpOwotCi1pbnQgcnRsODcyM2F1X2hhbF94bWl0ZnJhbWVfZW5xdWV1ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSk7Ci1zMzIgcnRsODcyM2F1X3htaXRfYnVmX2hhbmRsZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0jZGVmaW5lIGhhbF94bWl0X2hhbmRsZXIgcnRsODcyM2F1X3htaXRfYnVmX2hhbmRsZXIKLWJvb2wgcnRsODcyM2F1X2hhbF94bWl0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKTsKLWludCBydGw4NzIzYXVfbWdudF94bWl0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lKTsKLWJvb2wgcnRsODcyM2F1X3htaXRmcmFtZV9jb21wbGV0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsIHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYpOwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19hcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWE3MDhmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUV19BUF9IXwotI2RlZmluZSBfX1JUV19BUF9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQotLyogZXh0ZXJuYWwgZnVuY3Rpb24gKi8KLQotdm9pZCBpbml0X21sbWVfYXBfaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgZnJlZV9tbG1lX2FwX2luZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0vKiB2b2lkIHVwZGF0ZV9CQ05USU0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7ICovCi12b2lkIHJ0d19hZGRfYmNuX2llKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yaywgdTggaW5kZXgsIHU4ICpkYXRhLCB1OCBsZW4pOwotdm9pZCBydHdfcmVtb3ZlX2Jjbl9pZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmssIHU4IGluZGV4KTsKLXZvaWQgdXBkYXRlX2JlYWNvbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBpZV9pZCwgdTggKm91aSwgdTggdHgpOwotdm9pZCBhZGRfUkFUaWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhLCB1OCByc3NpX2xldmVsKTsKLXZvaWQgZXhwaXJlX3RpbWVvdXRfY2hrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCB1cGRhdGVfc3RhX2luZm8yM2FfYXBtb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci1pbnQgcnR3X2NoZWNrX2JlYWNvbl9kYXRhMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwgdW5zaWduZWQgaW50IGxlbik7Ci12b2lkIHJ0d19hcF9yZXN0b3JlX25ldHdvcmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0d19zZXRfbWFjYWRkcl9hY2wyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgaW50IG1vZGUpOwotCi12b2lkIGFzc29jaWF0ZWRfY2xpZW50c191cGRhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdXBkYXRlZCk7Ci12b2lkIGJzc19jYXBfdXBkYXRlX29uX3N0YV9qb2luMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci11OCBic3NfY2FwX3VwZGF0ZV9vbl9zdGFfbGVhdmUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKTsKLXZvaWQgc3RhX2luZm9fdXBkYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci12b2lkIGFwX3N0YV9pbmZvX2RlZmVyX3VwZGF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpOwotdTggYXBfZnJlZV9zdGEyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhLCBib29sIGFjdGl2ZSwgdTE2IHJlYXNvbik7Ci1pbnQgcnR3X3N0YV9mbHVzaDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgc3RhcnRfYXBfbW9kZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgc3RvcF9hcF9tb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotI2VuZGlmIC8qIGVuZCBvZiBDT05GSUdfODcyM0FVX0FQX01PREUgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2NtZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19jbWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmYTk1ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2NtZC5oCisrKyAvZGV2L251bGwKQEAgLTEsODE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUV19DTURfSF8KLSNkZWZpbmUgX19SVFdfQ01EX0hfCi0KLSNpbmNsdWRlIDx3bGFuX2Jzc2RlZi5oPgotI2luY2x1ZGUgPHJ0d19yZi5oPgotCi0jZGVmaW5lIEMySF9NRU1fU1ogKDE2KjEwMjQpCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8aWVlZTgwMjExLmg+IC8qICA8aWVlZTgwMjExL2llZWU4MDIxMS5oPiAqLwotCi0KLSNkZWZpbmUgTUFYX0NNRFNaCTEwMjQKLSNkZWZpbmUgTUFYX1JTUFNaCTUxMgotI2RlZmluZSBNQVhfRVZUU1oJMTAyNAotCi0jZGVmaW5lIENNREJVRkZfQUxJR05fU1ogNTEyCi0KLXN0cnVjdCBjbWRfb2JqIHsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyOwotCXUxNgljbWRjb2RlOwotCWludAlyZXM7Ci0JdTMyCWNtZHN6OwotCXU4CSpwYXJtYnVmOwotCXU4CSpyc3A7Ci0JdTMyCXJzcHN6OwotfTsKLQotc3RydWN0IGNtZF9wcml2IHsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7Ci0JdTMyCWNtZF9pc3N1ZWRfY250OwotCXUzMgljbWRfZG9uZV9jbnQ7Ci0JdTMyCXJzcF9jbnQ7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcjsKLX07Ci0KLSNkZWZpbmUgQzJIX1FVRVVFX01BWF9MRU4gMTAKLQotc3RydWN0CWV2dF9wcml2IHsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGlycV93azsKLX07Ci0KLSNkZWZpbmUgaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGNtZCwgcHBhcm0sIGNvZGUpIFwKLWRvIHtcCi0JcGNtZC0+Y21kY29kZSA9IGNvZGU7XAotCXBjbWQtPnBhcm1idWYgPSAodTggKikocHBhcm0pO1wKLQlwY21kLT5jbWRzeiA9IHNpemVvZiAoKnBwYXJtKTtcCi0JcGNtZC0+cnNwID0gTlVMTDtcCi0JcGNtZC0+cnNwc3ogPSAwO1wKLX0gd2hpbGUoMCkKLQotc3RydWN0IGMyaF9ldnRfaGRyIHsKLQl1OCBpZDo0OwotCXU4IHBsZW46NDsKLQl1OCBzZXE7Ci0JdTggcGF5bG9hZFswXTsKLX07Ci0KLS8qCi0gKiBEbyBub3QgcmVvcmRlciAtIHRoaXMgYWxsb3dzIGZvciBzdHJ1Y3QgZXZ0X3dvcmsgdG8gYmUgcGFzc2VkIG9uIHRvCi0gKiBydHdfYzJoX3drX2NtZDIzYSgpIGFzIGEgJ3N0cnVjdCBjMmhfZXZ0X2hkciAqJyB3aXRob3V0IG1ha2luZyBhbgotICogYWRkaXRpb25hbCBjb3B5LgotICovCi1zdHJ1Y3QgZXZ0X3dvcmsgewotCXVuaW9uIHsKLQkJc3RydWN0IGMyaF9ldnRfaGRyIGMyaF9ldnQ7Ci0JCXU4IGJ1ZlsxNl07Ci0JfSB1OwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcjsKLX07Ci0KLSNkZWZpbmUgYzJoX2V2dF9leGlzdChjMmhfZXZ0KSAoKGMyaF9ldnQpLT5pZCB8fCAoYzJoX2V2dCktPnBsZW4pCi0KLXZvaWQgcnR3X2V2dF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci0KLWludCBydHdfZW5xdWV1ZV9jbWQyM2Eoc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiwgc3RydWN0IGNtZF9vYmogKm9iaik7Ci12b2lkIHJ0d19mcmVlX2NtZF9vYmoyM2Eoc3RydWN0IGNtZF9vYmogKnBjbWQpOwotCi1pbnQgcnR3X2NtZF90aHJlYWQyM2Eodm9pZCAqY29udGV4dCk7Ci0KLWludCBydHdfaW5pdF9jbWRfcHJpdjIzYShzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2KTsKLQotdTMyIHJ0d19pbml0X2V2dF9wcml2MjNhIChzdHJ1Y3QgZXZ0X3ByaXYgKnBldnRwcml2KTsKLXZvaWQgcnR3X2ZyZWVfZXZ0X3ByaXYyM2EgKHN0cnVjdCBldnRfcHJpdiAqcGV2dHByaXYpOwotdm9pZCBydHdfZXZ0X25vdGlmeV9pc3Ioc3RydWN0IGV2dF9wcml2ICpwZXZ0cHJpdik7Ci0KLWVudW0gcnR3X2RydmV4dHJhX2NtZF9pZAotewotCU5PTkVfV0tfQ0lELAotCURZTkFNSUNfQ0hLX1dLX0NJRCwKLQlETV9DVFJMX1dLX0NJRCwKLQlQQkNfUE9MTElOR19XS19DSUQsCi0JUE9XRVJfU0FWSU5HX0NUUkxfV0tfQ0lELC8qIElQUyxBVVRPU3VzcGVuZCAqLwotCUxQU19DVFJMX1dLX0NJRCwKLQlBTlRfU0VMRUNUX1dLX0NJRCwKLQlQMlBfUFNfV0tfQ0lELAotCVAyUF9QUk9UT19XS19DSUQsCi0JQ0hFQ0tfSElRX1dLX0NJRCwvKiBmb3Igc29mdGFwIG1vZGUsIGNoZWNrIGhpIHF1ZXVlIGlmIGVtcHR5ICovCi0JQzJIX1dLX0NJRCwKLQlSVFBfVElNRVJfQ0ZHX1dLX0NJRCwKLQlNQVhfV0tfQ0lECi19OwotCi1lbnVtIExQU19DVFJMX1RZUEUKLXsKLQlMUFNfQ1RSTF9TQ0FOPTAsCi0JTFBTX0NUUkxfSk9JTkJTUz0xLAotCUxQU19DVFJMX0NPTk5FQ1Q9MiwKLQlMUFNfQ1RSTF9ESVNDT05ORUNUPTMsCi0JTFBTX0NUUkxfU1BFQ0lBTF9QQUNLRVQ9NCwKLQlMUFNfQ1RSTF9MRUFWRT01LAotfTsKLQotZW51bSBSRklOVEZTIHsKLQlTV1NJLAotCUhXU0ksCi0JSFdQSSwKLX07Ci0KLS8qCi1DYWxsZXIgTW9kZTogSW5mcmEsIEFkLUhvQyhDKQotCi1Ob3RlczogVG8gZW50ZXIgVVNCIHN1c3BlbmQgbW9kZQotCi1Db21tYW5kIE1vZGUKLQotKi8KLXN0cnVjdCB1c2Jfc3VzcGVuZF9wYXJtIHsKLQl1MzIgYWN0aW9uOy8qICAxOiBzbGVlcCwgMDpyZXN1bWUgKi8KLX07Ci0KLS8qCi1DYWxsZXIgTW9kZTogSW5mcmEsIEFkLUhvQwotCi1Ob3RlczogVG8gam9pbiBhIGtub3duIEJTUy4KLQotQ29tbWFuZC1FdmVudCBNb2RlCi0KLSovCi0KLS8qCi1DYWxsZXIgTW9kZTogSW5mcmEsIEFkLUhvQyhDKQotCi1Ob3RlczogVG8gZGlzY29ubmVjdCB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEJTUwotCi1Db21tYW5kIE1vZGUKLQotKi8KLXN0cnVjdCBkaXNjb25uZWN0X3Bhcm0gewotCXUzMiBkZWF1dGhfdGltZW91dF9tczsKLX07Ci0KLXN0cnVjdAlzZXRvcG1vZGVfcGFybSB7Ci0JZW51bSBubDgwMjExX2lmdHlwZSBtb2RlOwotfTsKLQotLyoKLUNhbGxlciBNb2RlOiBBUCwgQWQtSG9DLCBJbmZyYQotCi1Ob3RlczogVG8gYXNrIFJUTDg3MTEgcGVyZm9ybWluZyBzaXRlLXN1cnZleQotCi1Db21tYW5kLUV2ZW50IE1vZGUKLQotKi8KLQotI2RlZmluZSBSVFdfU1NJRF9TQ0FOX0FNT1VOVCA5IC8qICBmb3IgV0VYVF9DU0NBTl9BTU9VTlQgOSAqLwotI2RlZmluZSBSVFdfQ0hBTk5FTF9TQ0FOX0FNT1VOVCAoMTQrMzcpCi1zdHJ1Y3Qgc2l0ZXN1cnZleV9wYXJtIHsKLQlpbnQgc2Nhbl9tb2RlOwkvKiBhY3RpdmU6IDEsIHBhc3NpdmU6IDAgKi8KLQl1OCBzc2lkX251bTsKLQl1OCBjaF9udW07Ci0Jc3RydWN0IGNmZzgwMjExX3NzaWQgc3NpZFtSVFdfU1NJRF9TQ0FOX0FNT1VOVF07Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCBjaFtSVFdfQ0hBTk5FTF9TQ0FOX0FNT1VOVF07Ci19OwotCi0vKgotQ2FsbGVyIE1vZGU6IEFueQotCi1Ob3RlczogVG8gc2V0IHRoZSBhdXRoIHR5cGUgb2YgUlRMODcxMS4gb3Blbi9zaGFyZWQvODAyLjF4Ci0KLUNvbW1hbmQgTW9kZQotCi0qLwotc3RydWN0IHNldGF1dGhfcGFybSB7Ci0JdTggbW9kZTsgIC8qIDA6IGxlZ2FjeSBvcGVuLCAxOiBsZWdhY3kgc2hhcmVkIDI6IDgwMi4xeCAqLwotCXU4IF8xeDsgICAvKiAwOiBQU0ssIDE6IFRMUyAqLwotCXU4IHJzdmRbMl07Ci19OwotCi0vKgotQ2FsbGVyIE1vZGU6IEluZnJhCi0KLWEuIGFsZ29yaXRobTogd2VwNDAsIHdlcDEwNCwgdGtpcCAmIGFlcwotYi4ga2V5dHlwZTogZ3JwIGtleS91bmljYXN0IGtleQotYy4ga2V5IGNvbnRlbnRzCi0KLXdoZW4gc2hhcmVkIGtleSA9PT4ga2V5aWQgaXMgdGhlIGNhbWlkCi13aGVuIDgwMi4xeCA9PT4ga2V5aWQgWzA6MV0gPT0+IGdycCBrZXkKLXdoZW4gODAyLjF4ID09PiBrZXlpZCA+IDIgPT0+IHVuaWNhc3Qga2V5Ci0KLSovCi1zdHJ1Y3Qgc2V0a2V5X3Bhcm0gewotCXUzMglhbGdvcml0aG07CS8qICBlbmNyeXB0aW9uIGFsZ29yaXRobSwgY291bGQgYmUgbm9uZSwgd2VwNDAsIFRLSVAsIENDTVAsIHdlcDEwNCAqLwotCXU4CWtleWlkOwotCXU4CWdycGtleTsJCS8qICAxOiB0aGlzIGlzIHRoZSBncnBrZXkgZm9yIDgwMi4xeC4gMDogdGhpcyBpcyB0aGUgdW5pY2FzdCBrZXkgZm9yIDgwMi4xeCAqLwotCXU4CXNldF90eDsJCS8qICAxOiBtYWluIHR4IGtleSBmb3Igd2VwLiAwOiBvdGhlciBrZXkuICovCi0JdTgJa2V5WzE2XTsJLyogIHRoaXMgY291bGQgYmUgNDAgb3IgMTA0ICovCi19OwotCi0vKgotV2hlbiBpbiBBUCBvciBBZC1Ib2MgbW9kZSwgdGhpcyBpcyB1c2VkIHRvCi1hbGxvY2F0ZSBhbiBzdy9odyBlbnRyeSBmb3IgYSBuZXdseSBhc3NvY2lhdGVkIHN0YS4KLQotQ29tbWFuZAotCi13aGVuIHNoYXJlZCBrZXkgPT0+IGFsZ29yaXRobS9rZXlpZAotCi0qLwotc3RydWN0IHNldF9zdGFrZXlfcGFybSB7Ci0JdTgJYWRkcltFVEhfQUxFTl07Ci0JdTgJaWQ7LyogIGN1cnJlbnRseSBmb3IgZXJhc2luZyBjYW0gZW50cnkgaWYgYWxnb3JpdGhtID09IF9OT19QUklWQUNZXyAqLwotCXUzMglhbGdvcml0aG07Ci0JdTgJa2V5WzE2XTsKLX07Ci0KLXN0cnVjdCBzZXRfc3Rha2V5X3JzcCB7Ci0JdTgJYWRkcltFVEhfQUxFTl07Ci0JdTgJa2V5aWQ7Ci0JdTgJcnN2ZDsKLX07Ci0KLS8qCi1DYWxsZXIgQWQtSG9jL0FQCi0KLUNvbW1hbmQgLVJzcChBSUQgPT0gQ0FNSUQpIG1vZGUKLQotVGhpcyBpcyB0byBmb3JjZSBmdyB0byBhZGQgYW4gc3RhX2RhdGEgZW50cnkgcGVyIGRyaXZlcidzIHJlcXVlc3QuCi0KLUZXIHdpbGwgd3JpdGUgYW4gY2FtIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCBpdC4KLQotKi8KLXN0cnVjdCBzZXRfYXNzb2NzdGFfcGFybSB7Ci0JdTgJYWRkcltFVEhfQUxFTl07Ci19OwotCi1zdHJ1Y3Qgc2V0X2Fzc29jc3RhX3JzcCB7Ci0JdTgJY2FtX2lkOwotCXU4CXJzdmRbM107Ci19OwotCi0vKgotCUNhbGxlciBBZC1Ib2MvQVAKLQotCUNvbW1hbmQgbW9kZQotCi0JVGhpcyBpcyB0byBmb3JjZSBmdyB0byBkZWwgYW4gc3RhX2RhdGEgZW50cnkgcGVyIGRyaXZlcidzIHJlcXVlc3QKLQotCUZXIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2FtIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCBpdC4KLQotKi8KLXN0cnVjdCBkZWxfYXNzb2NzdGFfcGFybSB7Ci0JdTgJYWRkcltFVEhfQUxFTl07Ci19OwotCi0vKgotQ2FsbGVyIE1vZGU6IEFQL0FkLUhvQyhNKQotCi1Ob3RlczogVG8gbm90aWZ5IGZ3IHRoYXQgZ2l2ZW4gc3RhaWQgaGFzIGNoYW5nZWQgaXRzIHBvd2VyIHN0YXRlCi0KLUNvbW1hbmQgTW9kZQotCi0qLwotc3RydWN0IHNldHN0YXB3cnN0YXRlX3Bhcm0gewotCXU4CXN0YWlkOwotCXU4CXN0YXR1czsKLQl1OAlod2FkZHJbNl07Ci19OwotCi0vKgotQ2FsbGVyIE1vZGU6IEFueQotCi1Ob3RlczogVG8gc2V0dXAgdGhlIGJhc2ljIHJhdGUgb2YgUlRMODcxMQotCi1Db21tYW5kIE1vZGUKLQotKi8KLXN0cnVjdAlzZXRiYXNpY3JhdGVfcGFybSB7Ci0JdTgJYmFzaWNyYXRlc1tOdW1SYXRlc107Ci19OwotCi0vKgotQ2FsbGVyIE1vZGU6IEFueQotCi1Ob3RlczogVG8gcmVhZCB0aGUgY3VycmVudCBiYXNpYyByYXRlCi0KLUNvbW1hbmQtUnNwIE1vZGUKLQotKi8KLXN0cnVjdCBnZXRiYXNpY3JhdGVfcGFybSB7Ci0JdTMyIHJzdmQ7Ci19OwotCi1zdHJ1Y3QgZ2V0YmFzaWNyYXRlX3JzcCB7Ci0JdTggYmFzaWNyYXRlc1tOdW1SYXRlc107Ci19OwotCi0vKgotQ2FsbGVyIE1vZGU6IEFueQotCi1Ob3RlczogVG8gc2V0dXAgdGhlIGRhdGEgcmF0ZSBvZiBSVEw4NzExCi0KLUNvbW1hbmQgTW9kZQotCi0qLwotc3RydWN0IHNldGRhdGFyYXRlX3Bhcm0gewotCXU4CW1hY19pZDsKLQl1OAlkYXRhcmF0ZXNbTnVtUmF0ZXNdOwotfTsKLQotLyoKLUNhbGxlciBNb2RlOiBBbnkKLQotTm90ZXM6IFRvIHJlYWQgdGhlIGN1cnJlbnQgZGF0YSByYXRlCi0KLUNvbW1hbmQtUnNwIE1vZGUKLQotKi8KLXN0cnVjdCBnZXRkYXRhcmF0ZV9wYXJtIHsKLQl1MzIgcnN2ZDsKLX07Ci0KLXN0cnVjdCBnZXRkYXRhcmF0ZV9yc3AgewotCXU4IGRhdGFyYXRlc1tOdW1SYXRlc107Ci19OwotCi0KLS8qCi1DYWxsZXIgTW9kZTogQW55Ci1BUDogQVAgY2FuIHVzZSB0aGUgaW5mbyBmb3IgdGhlIGNvbnRlbnRzIG9mIGJlYWNvbiBmcmFtZQotSW5mcmE6IFNUQSBjYW4gdXNlIHRoZSBpbmZvIHdoZW4gc2l0ZXN1cnZleWluZwotQWQtSG9DKE0pOiBMaWtlIEFQCi1BZC1Ib0MoQyk6IExpa2UgU1RBCi0KLQotTm90ZXM6IFRvIHNldCB0aGUgcGh5IGNhcGFiaWxpdHkgb2YgdGhlIE5JQwotCi1Db21tYW5kIE1vZGUKLQotKi8KLQotc3RydWN0CXNldHBoeWluZm9fcGFybSB7Ci0Jc3RydWN0IHJlZ3VsYXRvcnlfY2xhc3MgY2xhc3Nfc2V0c1tOVU1fUkVHVUxBVE9SWVNdOwotCXU4CXN0YXR1czsKLX07Ci0KLXN0cnVjdAlnZXRwaHlpbmZvX3Bhcm0gewotCXUzMiByc3ZkOwotfTsKLQotc3RydWN0CWdldHBoeWluZm9fcnNwIHsKLQlzdHJ1Y3QgcmVndWxhdG9yeV9jbGFzcyBjbGFzc19zZXRzW05VTV9SRUdVTEFUT1JZU107Ci0JdTgJc3RhdHVzOwotfTsKLQotLyoKLUNhbGxlciBNb2RlOiBBbnkKLQotTm90ZXM6IFRvIHNldCB0aGUgY2hhbm5lbC9tb2RlbS9iYW5kCi1UaGlzIGNvbW1hbmQgd2lsbCBiZSB1c2VkIHdoZW4gY2hhbm5lbC9tb2RlbS9iYW5kIGlzIGNoYW5nZWQuCi0KLUNvbW1hbmQgTW9kZQotCi0qLwotc3RydWN0CXNldHBoeV9wYXJtIHsKLQl1OAlyZmNoYW5uZWw7Ci0JdTgJbW9kZW07Ci19OwotCi0vKgotQ2FsbGVyIE1vZGU6IEFueQotCi1Ob3RlczogVG8gZ2V0IHRoZSBjdXJyZW50IHNldHRpbmcgb2YgY2hhbm5lbC9tb2RlbS9iYW5kCi0KLUNvbW1hbmQtUnNwIE1vZGUKLQotKi8KLXN0cnVjdAlnZXRwaHlfcGFybSB7Ci0JdTMyIHJzdmQ7Ci19OwotCi1zdHJ1Y3QJZ2V0cGh5X3JzcCB7Ci0JdTgJcmZjaGFubmVsOwotCXU4CW1vZGVtOwotfTsKLQotc3RydWN0IHJlYWRCQl9wYXJtIHsKLQl1OAlvZmZzZXQ7Ci19OwotCi1zdHJ1Y3QgcmVhZEJCX3JzcCB7Ci0JdTgJdmFsdWU7Ci19OwotCi1zdHJ1Y3QgcmVhZFRTU0lfcGFybSB7Ci0JdTgJb2Zmc2V0OwotfTsKLQotc3RydWN0IHJlYWRUU1NJX3JzcCB7Ci0JdTgJdmFsdWU7Ci19OwotCi1zdHJ1Y3Qgd3JpdGVCQl9wYXJtIHsKLQl1OAlvZmZzZXQ7Ci0JdTgJdmFsdWU7Ci19OwotCi1zdHJ1Y3QgcmVhZFJGX3Bhcm0gewotCXU4CW9mZnNldDsKLX07Ci0KLXN0cnVjdCByZWFkUkZfcnNwIHsKLQl1MzIJdmFsdWU7Ci19OwotCi1zdHJ1Y3Qgd3JpdGVSRl9wYXJtIHsKLQl1MzIJb2Zmc2V0OwotCXUzMgl2YWx1ZTsKLX07Ci0KLXN0cnVjdCBnZXRyZmludGZzX3Bhcm0gewotCXU4CXJmaW50ZnM7Ci19OwotCi1zdHJ1Y3QgVHhfQmVhY29uX3BhcmFtIHsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCBuZXR3b3JrOwotfTsKLQotLyogIENNRCBwYXJhbSBGb3JtYXJ0IGZvciBkcml2ZXIgZXh0cmEgY21kIGhhbmRsZXIgKi8KLXN0cnVjdCBkcnZleHRyYV9jbWRfcGFybSB7Ci0JaW50IGVjX2lkOyAvKiBleHRyYSBjbWQgaWQgKi8KLQlpbnQgdHlwZV9zaXplOyAvKiAgQ2FuIHVzZSB0aGlzIGZpZWxkIGFzIHRoZSB0eXBlIGlkIG9yIGNvbW1hbmQgc2l6ZSAqLwotCXVuc2lnbmVkIGNoYXIgKnBidWY7Ci19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0gQmVsb3cgYXJlIHVzZWQgZm9yIFJGL0JCIHR1bm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RydWN0CXNldGFudGVubmFfcGFybSB7Ci0JdTgJdHhfYW50c2V0OwotCXU4CXJ4X2FudHNldDsKLQl1OAl0eF9hbnRlbm5hOwotCXU4CXJ4X2FudGVubmE7Ci19OwotCi1zdHJ1Y3QJZW5yYXRlYWRhcHRpdmVfcGFybSB7Ci0JdTMyCWVuOwotfTsKLQotc3RydWN0IHNldHR4YWdjdGJsX3Bhcm0gewotCXUzMgl0eGFnY1tNQVhfUkFURVNfTEVOR1RIXTsKLX07Ci0KLXN0cnVjdCBnZXR0eGFnY3RibF9wYXJtIHsKLQl1MzIgcnN2ZDsKLX07Ci0KLXN0cnVjdCBnZXR0eGFnY3RibF9yc3AgewotCXUzMgl0eGFnY1tNQVhfUkFURVNfTEVOR1RIXTsKLX07Ci0KLXN0cnVjdCBzZXRhZ2NjdHJsX3Bhcm0gewotCXUzMglhZ2NjdHJsOwkJLyogIDA6IHB1cmUgaHcsIDE6IGZ3ICovCi19OwotCi1zdHJ1Y3Qgc2V0c3N1cF9wYXJtCXsKLQl1MzIJc3NfRm9yY2VVcFtNQVhfUkFURVNfTEVOR1RIXTsKLX07Ci0KLXN0cnVjdCBnZXRzc3VwX3Bhcm0JewotCXUzMiByc3ZkOwotfTsKLQotc3RydWN0IGdldHNzdXBfcnNwCXsKLQl1OAlzc19Gb3JjZVVwW01BWF9SQVRFU19MRU5HVEhdOwotfTsKLQotc3RydWN0IHNldHNzZGxldmVsX3Bhcm0JewotCXU4CXNzX0RMZXZlbFtNQVhfUkFURVNfTEVOR1RIXTsKLX07Ci0KLXN0cnVjdCBnZXRzc2RsZXZlbF9wYXJtCXsKLQl1MzIgcnN2ZDsKLX07Ci0KLXN0cnVjdCBnZXRzc2RsZXZlbF9yc3AJewotCXU4CXNzX0RMZXZlbFtNQVhfUkFURVNfTEVOR1RIXTsKLX07Ci0KLXN0cnVjdCBzZXRzc3VsZXZlbF9wYXJtCXsKLQl1OAlzc19VTGV2ZWxbTUFYX1JBVEVTX0xFTkdUSF07Ci19OwotCi1zdHJ1Y3QgZ2V0c3N1bGV2ZWxfcGFybQl7Ci0JdTMyIHJzdmQ7Ci19OwotCi1zdHJ1Y3QgZ2V0c3N1bGV2ZWxfcnNwCXsKLQl1OAlzc19VTGV2ZWxbTUFYX1JBVEVTX0xFTkdUSF07Ci19OwotCi1zdHJ1Y3QJc2V0Y291bnRqdWRnZV9wYXJtIHsKLQl1OAljb3VudF9qdWRnZVtNQVhfUkFURVNfTEVOR1RIXTsKLX07Ci0KLXN0cnVjdAlnZXRjb3VudGp1ZGdlX3Bhcm0gewotCXUzMiByc3ZkOwotfTsKLQotc3RydWN0CWdldGNvdW50anVkZ2VfcnNwIHsKLQl1OAljb3VudF9qdWRnZVtNQVhfUkFURVNfTEVOR1RIXTsKLX07Ci0KLXN0cnVjdCBzZXRyYXRhYmxlX3Bhcm0gewotCXU4IHNzX0ZvcmNlVXBbTnVtUmF0ZXNdOwotCXU4IHNzX1VMZXZlbFtOdW1SYXRlc107Ci0JdTggc3NfRExldmVsW051bVJhdGVzXTsKLQl1OCBjb3VudF9qdWRnZVtOdW1SYXRlc107Ci19OwotCi1zdHJ1Y3QgZ2V0cmF0YWJsZV9wYXJtIHsKLQl1aW50IHJzdmQ7Ci19OwotCi1zdHJ1Y3QgZ2V0cmF0YWJsZV9yc3AgewotCXU4IHNzX0ZvcmNlVXBbTnVtUmF0ZXNdOwotCXU4IHNzX1VMZXZlbFtOdW1SYXRlc107Ci0JdTggc3NfRExldmVsW051bVJhdGVzXTsKLQl1OCBjb3VudF9qdWRnZVtOdW1SYXRlc107Ci19OwotCi0vKiB0byBnZXQgVFgsUlggcmV0cnkgY291bnQgKi8KLXN0cnVjdCBnZXR0eHJldHJ5Y250X3Bhcm17Ci0JdW5zaWduZWQgaW50IHJzdmQ7Ci19Owotc3RydWN0IGdldHR4cmV0cnljbnRfcnNwewotCXVuc2lnbmVkIGxvbmcgdHhfcmV0cnljbnQ7Ci19OwotCi1zdHJ1Y3QgZ2V0cnhyZXRyeWNudF9wYXJtewotCXVuc2lnbmVkIGludCByc3ZkOwotfTsKLXN0cnVjdCBnZXRyeHJldHJ5Y250X3JzcHsKLQl1bnNpZ25lZCBsb25nIHJ4X3JldHJ5Y250OwotfTsKLQotLyogdG8gZ2V0IEJDTk9LLEJDTkVSUiBjb3VudCAqLwotc3RydWN0IGdldGJjbm9rY250X3Bhcm17Ci0JdW5zaWduZWQgaW50IHJzdmQ7Ci19Owotc3RydWN0IGdldGJjbm9rY250X3JzcHsKLQl1bnNpZ25lZCBsb25nICBiY25va2NudDsKLX07Ci0KLXN0cnVjdCBnZXRiY25lcnJjbnRfcGFybXsKLQl1bnNpZ25lZCBpbnQgcnN2ZDsKLX07Ci1zdHJ1Y3QgZ2V0YmNuZXJyY250X3JzcHsKLQl1bnNpZ25lZCBsb25nIGJjbmVycmNudDsKLX07Ci0KLS8qICB0byBnZXQgY3VycmVudCBUWCBwb3dlciBsZXZlbCAqLwotc3RydWN0IGdldGN1cnR4cHdybGV2ZWxfcGFybXsKLQl1bnNpZ25lZCBpbnQgcnN2ZDsKLX07Ci0KLXN0cnVjdCBnZXRjdXJ0eHB3cmxldmVsX3JzcHsKLQl1bnNpZ25lZCBzaG9ydCB0eF9wb3dlcjsKLX07Ci0KLXN0cnVjdCBzZXRwcm9iZXJlcWV4dHJhaWVfcGFybSB7Ci0JdW5zaWduZWQgY2hhciBlX2lkOwotCXVuc2lnbmVkIGNoYXIgaWVfbGVuOwotCXVuc2lnbmVkIGNoYXIgaWVbMF07Ci19OwotCi1zdHJ1Y3Qgc2V0YXNzb2NyZXFleHRyYWllX3Bhcm0gewotCXVuc2lnbmVkIGNoYXIgZV9pZDsKLQl1bnNpZ25lZCBjaGFyIGllX2xlbjsKLQl1bnNpZ25lZCBjaGFyIGllWzBdOwotfTsKLQotc3RydWN0IHNldHByb2JlcnNwZXh0cmFpZV9wYXJtIHsKLQl1bnNpZ25lZCBjaGFyIGVfaWQ7Ci0JdW5zaWduZWQgY2hhciBpZV9sZW47Ci0JdW5zaWduZWQgY2hhciBpZVswXTsKLX07Ci0KLXN0cnVjdCBzZXRhc3NvY3JzcGV4dHJhaWVfcGFybSB7Ci0JdW5zaWduZWQgY2hhciBlX2lkOwotCXVuc2lnbmVkIGNoYXIgaWVfbGVuOwotCXVuc2lnbmVkIGNoYXIgaWVbMF07Ci19OwotCi1zdHJ1Y3QgYWRkQmFSZXFfcGFybSB7Ci0JdW5zaWduZWQgaW50IHRpZDsKLQl1OAlhZGRyW0VUSF9BTEVOXTsKLX07Ci0KLS8qSDJDIEhhbmRsZXIgaW5kZXg6IDQ2ICovCi1zdHJ1Y3Qgc2V0X2NoX3Bhcm0gewotCXU4IGNoOwotCXU4IGJ3OwotCXU4IGNoX29mZnNldDsKLX07Ci0KLS8qSDJDIEhhbmRsZXIgaW5kZXg6IDU5ICovCi1zdHJ1Y3QgU2V0Q2hhbm5lbFBsYW5fcGFyYW0gewotCXU4IGNoYW5uZWxfcGxhbjsKLX07Ci0KLS8qSDJDIEhhbmRsZXIgaW5kZXg6IDYwICovCi1zdHJ1Y3QgTGVkQmxpbmtfcGFyYW0gewotCXN0cnVjdCBsZWRfODcyM2EgKnBMZWQ7Ci19OwotCi0vKkgyQyBIYW5kbGVyIGluZGV4OiA2MSAqLwotc3RydWN0IFNldENoYW5uZWxTd2l0Y2hfcGFyYW0gewotCXU4IG5ld19jaF9ubzsKLX07Ci0KLS8qSDJDIEhhbmRsZXIgaW5kZXg6IDYyICovCi1zdHJ1Y3QgVERMU29wdGlvbl9wYXJhbSB7Ci0JdTggYWRkcltFVEhfQUxFTl07Ci0JdTggb3B0aW9uOwotfTsKLQotI2RlZmluZSBHRU5fQ01EX0NPREUoY21kKQljbWQgIyMgX0NNRF8KLQotCi0vKgotCi1SZXN1bHQ6Ci0weDAwOiBzdWNjZXNzCi0weDAxOiBzdWNjZXNzLCBhbmQgY2hlY2sgUmVzcG9uc2UuCi0weDAyOiBjbWQgaWdub3JlZCBkdWUgdG8gZHVwbGljYXRlZCBzZXF1Y25lIG51bWJlcgotMHgwMzogY21kIGRyb3BwZWQgZHVlIHRvIGludmFsaWQgY21kIGNvZGUKLTB4MDQ6IHJlc2VydmVkLgotCi0qLwotCi0jZGVmaW5lIEgyQ19SU1BfT0ZGU0VUCQkJNTEyCi0KLSNkZWZpbmUgSDJDX1NVQ0NFU1MJCQkweDAwCi0jZGVmaW5lIEgyQ19TVUNDRVNTX1JTUAkJCTB4MDEKLSNkZWZpbmUgSDJDX0RVUExJQ0FURUQJCQkweDAyCi0jZGVmaW5lIEgyQ19EUk9QUEVECQkJMHgwMwotI2RlZmluZSBIMkNfUEFSQU1FVEVSU19FUlJPUgkJMHgwNAotI2RlZmluZSBIMkNfUkVKRUNURUQJCQkweDA1Ci0jZGVmaW5lIEgyQ19DTURfT1ZFUkZMT1cJCTB4MDYKLSNkZWZpbmUgSDJDX1JFU0VSVkVECQkJMHgwNwotCi1pbnQgcnR3X3NldGFzc29jc3RhX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgdTggKm1hY19hZGRyKTsKLWludCBydHdfc2V0c3RhbmRieV9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdWludCBhY3Rpb24pOwotaW50IHJ0d19zaXRlc3VydmV5X2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgc3RydWN0IGNmZzgwMjExX3NzaWQgKnNzaWQsIGludCBzc2lkX251bSwgc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCAqY2gsIGludCBjaF9udW0pOwotaW50IHJ0d19jcmVhdGVic3NfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAgKnBhZGFwdGVyKTsKLWludCBydHdfY3JlYXRlYnNzX2NtZDIzYV9leChzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqcGJzcywgdW5zaWduZWQgaW50IHN6KTsKLWludCBydHdfc2V0cGh5X2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgdTggbW9kZW0sIHU4IGNoKTsKLWludCBydHdfc2V0c3Rha2V5X2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgdTggKnBzdGEsIHU4IHVuaWNhc3Rfa2V5KTsKLWludCBydHdfY2xlYXJzdGFrZXlfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwc3RhLCB1OCBlbnRyeSwgdTggZW5xdWV1ZSk7Ci1pbnQgcnR3X2pvaW5ic3NfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAgKnBhZGFwdGVyLCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrKiBwbmV0d29yayk7Ci1pbnQgcnR3X2Rpc2Fzc29jX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgZGVhdXRoX3RpbWVvdXRfbXMsIGJvb2wgZW5xdWV1ZSk7Ci1pbnQgcnR3X3NldG9wbW9kZV9jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgZW51bSBubDgwMjExX2lmdHlwZSBpZm1vZGUpOwotaW50IHJ0d19zZXRkYXRhcmF0ZV9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHU4ICpyYXRlc2V0KTsKLWludCBydHdfc2V0YmFzaWNyYXRlX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgdTggKnJhdGVzZXQpOwotaW50IHJ0d19zZXRiYnJlZ19jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggb2Zmc2V0LCB1OCB2YWwpOwotaW50IHJ0d19zZXRyZnJlZ19jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggb2Zmc2V0LCB1MzIgdmFsKTsKLWludCBydHdfZ2V0YmJyZWdfY21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG9mZnNldCwgdTggKnB2YWwpOwotaW50IHJ0d19nZXRyZnJlZ19jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggb2Zmc2V0LCB1OCAqcHZhbCk7Ci1pbnQgcnR3X3NldHJmaW50ZnNfY21kKHN0cnVjdCBydHdfYWRhcHRlciAgKnBhZGFwdGVyLCB1OCBtb2RlKTsKLWludCBydHdfc2V0cnR0YmxfY21kKHN0cnVjdCBydHdfYWRhcHRlciAgKnBhZGFwdGVyLCBzdHJ1Y3Qgc2V0cmF0YWJsZV9wYXJtICpwcmF0ZV90YWJsZSk7Ci1pbnQgcnR3X2dldHJ0dGJsX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgc3RydWN0IGdldHJhdGFibGVfcnNwICpwdmFsKTsKLQotaW50IHJ0d19nZXR0c3NpX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgdTggb2Zmc2V0LCB1OCAqcHZhbCk7Ci1pbnQgcnR3X3NldGZ3ZGlnX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIqcGFkYXB0ZXIsIHU4IHR5cGUpOwotaW50IHJ0d19zZXRmd3JhX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIqcGFkYXB0ZXIsIHU4IHR5cGUpOwotCi1pbnQgcnR3X2FkZGJhcmVxX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIqcGFkYXB0ZXIsIHU4IHRpZCwgdTggKmFkZHIpOwotCi1pbnQgcnR3X2R5bmFtaWNfY2hrX3drX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotCi1pbnQgcnR3X2xwc19jdHJsX3drX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIqcGFkYXB0ZXIsIHU4IGxwc19jdHJsX3R5cGUsIHU4IGVucXVldWUpOwotCi1pbnQgcnR3X3BzX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIqcGFkYXB0ZXIpOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi1pbnQgcnR3X2Noa19oaV9xdWV1ZV9jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyKnBhZGFwdGVyKTsKLSNlbmRpZgotCi1pbnQgcnR3X3NldF9jaHBsYW5fY21kKHN0cnVjdCBydHdfYWRhcHRlcipwYWRhcHRlciwgdTggY2hwbGFuLCB1OCBlbnF1ZXVlKTsKLWludCBydHdfbGVkX2JsaW5rX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIqcGFkYXB0ZXIsIHN0cnVjdCBsZWRfODcyM2EgKnBMZWQpOwotaW50IHJ0d19zZXRfY3NhX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIqcGFkYXB0ZXIsIHU4IG5ld19jaF9ubyk7Ci0KLWludCBydHdfYzJoX3drX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqYzJoX2V2dCk7Ci0KLWludCBydHdfZHJ2ZXh0cmFfY21kX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci0KLXZvaWQgcnR3X3N1cnZleV9jbWRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHN0cnVjdCBjbWRfb2JqICpwY21kKTsKLXZvaWQgcnR3X2Rpc2Fzc29jX2NtZDIzYV9jYWxsYmFjayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgc3RydWN0IGNtZF9vYmogKnBjbWQpOwotdm9pZCBydHdfam9pbmJzc19jbWQyM2FfY2FsbGJhY2soc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHN0cnVjdCBjbWRfb2JqICpwY21kKTsKLXZvaWQgcnR3X2NyZWF0ZWJzc19jbWQyM2FfY2FsbGJhY2soc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHN0cnVjdCBjbWRfb2JqICpwY21kKTsKLXZvaWQgcnR3X2dldGJicmZyZWdfY21kcnNwX2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAgKnBhZGFwdGVyLCBzdHJ1Y3QgY21kX29iaiAqcGNtZCk7Ci0KLXZvaWQgcnR3X3NldHN0YUtleV9jbWRyc3BfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsICBzdHJ1Y3QgY21kX29iaiAqcGNtZCk7Ci12b2lkIHJ0d19zZXRhc3NvY3N0YV9jbWRyc3BfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsICBzdHJ1Y3QgY21kX29iaiAqcGNtZCk7Ci0KLXN0cnVjdCBfY21kX2NhbGxiYWNrIHsKLQl1MzIJY21kX2NvZGU7Ci0Jdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgc3RydWN0IGNtZF9vYmogKmNtZCk7Ci19OwotCi1lbnVtIHJ0d19oMmNfY21kIHsKLQlHRU5fQ01EX0NPREUoX1JlYWRfTUFDUkVHKSAsCS8qMCovCi0JR0VOX0NNRF9DT0RFKF9Xcml0ZV9NQUNSRUcpICwKLQlHRU5fQ01EX0NPREUoX1JlYWRfQkJSRUcpICwKLQlHRU5fQ01EX0NPREUoX1dyaXRlX0JCUkVHKSAsCi0JR0VOX0NNRF9DT0RFKF9SZWFkX1JGUkVHKSAsCi0JR0VOX0NNRF9DT0RFKF9Xcml0ZV9SRlJFRykgLCAvKjUqLwotCUdFTl9DTURfQ09ERShfUmVhZF9FRVBST00pICwKLQlHRU5fQ01EX0NPREUoX1dyaXRlX0VFUFJPTSkgLAotCUdFTl9DTURfQ09ERShfUmVhZF9FRlVTRSkgLAotCUdFTl9DTURfQ09ERShfV3JpdGVfRUZVU0UpICwKLQotCUdFTl9DTURfQ09ERShfUmVhZF9DQU0pICwJLyoxMCovCi0JR0VOX0NNRF9DT0RFKF9Xcml0ZV9DQU0pICwKLQlHRU5fQ01EX0NPREUoX3NldEJDTklUViksCi0JR0VOX0NNRF9DT0RFKF9zZXRNQklEQ0ZHKSwKLQlHRU5fQ01EX0NPREUoX0pvaW5Cc3MpLCAgIC8qMTQqLwotCUdFTl9DTURfQ09ERShfRGlzQ29ubmVjdCkgLCAvKjE1Ki8KLQlHRU5fQ01EX0NPREUoX0NyZWF0ZUJzcykgLAotCUdFTl9DTURfQ09ERShfU2V0T3BNb2RlKSAsCi0JR0VOX0NNRF9DT0RFKF9TaXRlU3VydmV5KSwgIC8qMTgqLwotCUdFTl9DTURfQ09ERShfU2V0QXV0aCkgLAotCi0JR0VOX0NNRF9DT0RFKF9TZXRLZXkpICwJLyoyMCovCi0JR0VOX0NNRF9DT0RFKF9TZXRTdGFLZXkpICwKLQlHRU5fQ01EX0NPREUoX1NldEFzc29jU3RhKSAsCi0JR0VOX0NNRF9DT0RFKF9EZWxBc3NvY1N0YSkgLAotCUdFTl9DTURfQ09ERShfU2V0U3RhUHdyU3RhdGUpICwKLQlHRU5fQ01EX0NPREUoX1NldEJhc2ljUmF0ZSkgLCAvKjI1Ki8KLQlHRU5fQ01EX0NPREUoX0dldEJhc2ljUmF0ZSkgLAotCUdFTl9DTURfQ09ERShfU2V0RGF0YVJhdGUpICwKLQlHRU5fQ01EX0NPREUoX0dldERhdGFSYXRlKSAsCi0JR0VOX0NNRF9DT0RFKF9TZXRQaHlJbmZvKSAsCi0KLQlHRU5fQ01EX0NPREUoX0dldFBoeUluZm8pICwJLyozMCovCi0JR0VOX0NNRF9DT0RFKF9TZXRQaHkpICwKLQlHRU5fQ01EX0NPREUoX0dldFBoeSkgLAotCUdFTl9DTURfQ09ERShfcmVhZFJzc2kpICwKLQlHRU5fQ01EX0NPREUoX3JlYWRHYWluKSAsCi0JR0VOX0NNRF9DT0RFKF9TZXRBdGltKSAsIC8qMzUqLwotCUdFTl9DTURfQ09ERShfU2V0UHdyTW9kZSkgLAotCUdFTl9DTURfQ09ERShfSm9pbmJzc1JwdCksCi0JR0VOX0NNRF9DT0RFKF9TZXRSYVRhYmxlKSAsCi0JR0VOX0NNRF9DT0RFKF9HZXRSYVRhYmxlKSAsCi0KLQlHRU5fQ01EX0NPREUoX0dldENDWFJlcG9ydCksIC8qNDAqLwotCUdFTl9DTURfQ09ERShfR2V0RFRNUmVwb3J0KSwKLQlHRU5fQ01EX0NPREUoX0dldFRYUmF0ZVN0YXRpc3RpY3MpLAotCUdFTl9DTURfQ09ERShfU2V0VXNiU3VzcGVuZCksCi0JR0VOX0NNRF9DT0RFKF9TZXRIMmNMYmspLAotCUdFTl9DTURfQ09ERShfQWRkQkFSZXEpICwgLyo0NSovCi0JR0VOX0NNRF9DT0RFKF9TZXRDaGFubmVsKSwgLyo0NiovCi0JR0VOX0NNRF9DT0RFKF9TZXRUeFBvd2VyKSwKLQlHRU5fQ01EX0NPREUoX1N3aXRjaEFudGVubmEpLAotCUdFTl9DTURfQ09ERShfU2V0Q3J5c3RhbENhcCksCi0JR0VOX0NNRF9DT0RFKF9TZXRTaW5nbGVDYXJyaWVyVHgpLCAvKjUwKi8KLQotCUdFTl9DTURfQ09ERShfU2V0U2luZ2xlVG9uZVR4KSwvKjUxKi8KLQlHRU5fQ01EX0NPREUoX1NldENhcnJpZXJTdXBwcmVzc2lvblR4KSwKLQlHRU5fQ01EX0NPREUoX1NldENvbnRpbnVvdXNUeCksCi0JR0VOX0NNRF9DT0RFKF9Td2l0Y2hCYW5kd2lkdGgpLCAvKjU0Ki8KLQlHRU5fQ01EX0NPREUoX1RYX0JlYWNvbiksIC8qNTUqLwotCi0JR0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpLCAvKjU2Ki8KLQlHRU5fQ01EX0NPREUoX1NldF9EcnZfRXh0cmEpLCAvKjU3Ki8KLQlHRU5fQ01EX0NPREUoX1NldF9IMkNfTVNHKSwgLyo1OCovCi0KLQlHRU5fQ01EX0NPREUoX1NldENoYW5uZWxQbGFuKSwgLyo1OSovCi0JR0VOX0NNRF9DT0RFKF9MZWRCbGluayksIC8qNjAqLwotCi0JR0VOX0NNRF9DT0RFKF9TZXRDaGFubmVsU3dpdGNoKSwgLyo2MSovCi0JR0VOX0NNRF9DT0RFKF9URExTKSwgLyo2MiovCi0KLQlNQVhfSDJDQ01ECi19OwotCi1leHRlcm4gc3RydWN0IF9jbWRfY2FsbGJhY2sJcnR3X2NtZF9jYWxsYmFja1tdOwotCi0jZW5kaWYgLyogIF9DTURfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU5MTgzZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUV19ERUJVR19IX18KLSNkZWZpbmUgX19SVFdfREVCVUdfSF9fCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNkZWZpbmUgX2Rydl9hbHdheXNfCQkJMQotI2RlZmluZSBfZHJ2X2VtZXJnXwkJCTIKLSNkZWZpbmUgX2Rydl9hbGVydF8JCQkzCi0jZGVmaW5lIF9kcnZfZXJyXwkJCTQKLSNkZWZpbmUJX2Rydl93YXJuaW5nXwkJCTUKLSNkZWZpbmUgX2Rydl9ub3RpY2VfCQkJNgotI2RlZmluZSBfZHJ2X2luZm9fCQkJNwotI2RlZmluZQlfZHJ2X2RlYnVnXwkJCTgKLQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXwkJQklUKDApCi0jZGVmaW5lIF9tb2R1bGVfeG1pdF9vc2RlcF9jXwkJQklUKDEpCi0jZGVmaW5lIF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfCQlCSVQoMikKLSNkZWZpbmUgX21vZHVsZV9yZWN2X29zZGVwX2NfCQlCSVQoMykKLSNkZWZpbmUgX21vZHVsZV9ydGw4NzF4X21sbWVfY18JCUJJVCg0KQotI2RlZmluZSBfbW9kdWxlX21sbWVfb3NkZXBfY18JCUJJVCg1KQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MXhfc3RhX21ndF9jXwlCSVQoNikKLSNkZWZpbmUgX21vZHVsZV9ydGw4NzF4X2NtZF9jXwkJQklUKDcpCi0jZGVmaW5lIF9tb2R1bGVfY21kX29zZGVwX2NfCQlCSVQoOCkKLSNkZWZpbmUgX21vZHVsZV9ydGw4NzF4X2lvX2NfCQlCSVQoOSkKLSNkZWZpbmUgX21vZHVsZV9pb19vc2RlcF9jXwkJQklUKDEwKQotI2RlZmluZSBfbW9kdWxlX29zX2ludGZzX2NfCQlCSVQoMTEpCi0jZGVmaW5lIF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXwlCSVQoMTIpCi0jZGVmaW5lIF9tb2R1bGVfcnRsODcxeF9lZXByb21fY18JQklUKDEzKQotI2RlZmluZSBfbW9kdWxlX2hhbF9pbml0X2NfCQlCSVQoMTQpCi0jZGVmaW5lIF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfCQlCSVQoMTUpCi0jZGVmaW5lIF9tb2R1bGVfcnRsODcxeF9pb2N0bF9jXwlCSVQoMTYpCi0jZGVmaW5lIF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18JQklUKDE3KQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MXhfaW9jdGxfcXVlcnlfY18JQklUKDE4KQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXwlCSVQoMTkpCi0jZGVmaW5lIF9tb2R1bGVfaGNpX2ludGZzX2NfCQlCSVQoMjApCi0jZGVmaW5lIF9tb2R1bGVfaGNpX29wc19jXwkJQklUKDIxKQotI2RlZmluZSBfbW9kdWxlX29zZGVwX3NlcnZpY2VfY18JQklUKDIyKQotI2RlZmluZSBfbW9kdWxlX21wXwkJCUJJVCgyMykKLSNkZWZpbmUgX21vZHVsZV9oY2lfb3BzX29zX2NfCQlCSVQoMjQpCi0jZGVmaW5lIF9tb2R1bGVfcnRsODcxeF9pb2N0bF9vc19jCUJJVCgyNSkKLSNkZWZpbmUgX21vZHVsZV9ydGw4NzEyX2NtZF9jXwkJQklUKDI2KQotI2RlZmluZQlfbW9kdWxlX3J0bDgxOTJjX3htaXRfY18JQklUKDI4KQotI2RlZmluZSBfbW9kdWxlX2hhbF94bWl0X2NfCQlCSVQoMjgpIC8qIGR1cGxpY2F0aW9uIGludGVudGlvbmFsICovCi0jZGVmaW5lIF9tb2R1bGVfZWZ1c2VfCQkJQklUKDI5KQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MTJfcmVjdl9jXwkJQklUKDMwKQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MTJfbGVkX2NfCQlCSVQoMzEpCi0KLSN1bmRlZiBfTU9EVUxFX0RFRklORV8KLQotI2lmIGRlZmluZWQgX1JUV19YTUlUX0NfCi0JI2RlZmluZSBfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X3htaXRfY18KLSNlbGlmIGRlZmluZWQgX1hNSVRfT1NERVBfQ18KLQkjZGVmaW5lIF9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX3htaXRfb3NkZXBfY18KLSNlbGlmIGRlZmluZWQgX1JUV19SRUNWX0NfCi0JI2RlZmluZSBfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18KLSNlbGlmIGRlZmluZWQgX1JFQ1ZfT1NERVBfQ18KLQkjZGVmaW5lIF9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX3JlY3Zfb3NkZXBfY18KLSNlbGlmIGRlZmluZWQgX1JUV19NTE1FX0NfCi0JI2RlZmluZSBfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X21sbWVfY18KLSNlbGlmIGRlZmluZWQgX01MTUVfT1NERVBfQ18KLQkjZGVmaW5lIF9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX21sbWVfb3NkZXBfY18KLSNlbGlmIGRlZmluZWQgX1JUV19NTE1FX0VYVF9DXwotCSNkZWZpbmUgX01PRFVMRV9ERUZJTkVfIDEKLSNlbGlmIGRlZmluZWQgX1JUV19TVEFfTUdUX0NfCi0JI2RlZmluZSBfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X3N0YV9tZ3RfY18KLSNlbGlmIGRlZmluZWQgX1JUV19DTURfQ18KLQkjZGVmaW5lIF9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX3J0bDg3MXhfY21kX2NfCi0jZWxpZiBkZWZpbmVkIF9DTURfT1NERVBfQ18KLQkjZGVmaW5lIF9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX2NtZF9vc2RlcF9jXwotI2VsaWYgZGVmaW5lZCBfUlRXX0lPX0NfCi0JI2RlZmluZSBfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X2lvX2NfCi0jZWxpZiBkZWZpbmVkIF9JT19PU0RFUF9DXwotCSNkZWZpbmUgX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfaW9fb3NkZXBfY18KLSNlbGlmIGRlZmluZWQgX09TX0lOVEZTX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JX21vZHVsZV9vc19pbnRmc19jXwotI2VsaWYgZGVmaW5lZCBfUlRXX1NFQ1VSSVRZX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfCi0jZWxpZiBkZWZpbmVkIF9SVFdfRUVQUk9NX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X2VlcHJvbV9jXwotI2VsaWYgZGVmaW5lZCBfSEFMX0lOVEZfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX2hhbF9pbml0X2NfCi0jZWxpZiAoZGVmaW5lZCBfSENJX0hBTF9JTklUX0NfKSB8fCAoZGVmaW5lZCBfU0RJT19IQUxJTklUX0NfKQotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfaGNpX2hhbF9pbml0X2NfCi0jZWxpZiBkZWZpbmVkIF9SVEw4NzFYX0lPQ1RMX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X2lvY3RsX2NfCi0jZWxpZiBkZWZpbmVkIF9SVEw4NzFYX0lPQ1RMX1NFVF9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18KLSNlbGlmIGRlZmluZWQgX1JUTDg3MVhfSU9DVExfUVVFUllfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX3J0bDg3MXhfaW9jdGxfcXVlcnlfY18KLSNlbGlmIGRlZmluZWQgX1JUTDg3MVhfUFdSQ1RSTF9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxeF9wd3JjdHJsX2NfCi0jZWxpZiBkZWZpbmVkIF9SVFdfUFdSQ1RSTF9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCTEKLSNlbGlmIGRlZmluZWQgX0hDSV9JTlRGX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JX21vZHVsZV9oY2lfaW50ZnNfY18KLSNlbGlmIGRlZmluZWQgX0hDSV9PUFNfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX2hjaV9vcHNfY18KLSNlbGlmIGRlZmluZWQgX1NESU9fT1BTX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8gMQotI2VsaWYgZGVmaW5lZCBfT1NERVBfSENJX0lOVEZfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX2hjaV9pbnRmc19jXwotI2VsaWYgZGVmaW5lZCBfT1NERVBfU0VSVklDRV9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfb3NkZXBfc2VydmljZV9jXwotI2VsaWYgZGVmaW5lZCBfSENJX09QU19PU19DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfaGNpX29wc19vc19jXwotI2VsaWYgZGVmaW5lZCBfUlRMODcxWF9JT0NUTF9MSU5VWF9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxeF9pb2N0bF9vc19jCi0jZWxpZiBkZWZpbmVkIF9SVEw4NzEyX0NNRF9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxMl9jbWRfY18KLSNlbGlmIGRlZmluZWQgX1JUTDgxOTJDX1hNSVRfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwkxCi0jZWxpZiBkZWZpbmVkIF9SVEw4NzIzQVNfWE1JVF9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCTEKLSNlbGlmIGRlZmluZWQgX1JUTDg3MTJfUkVDVl9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxMl9yZWN2X2NfCi0jZWxpZiBkZWZpbmVkIF9SVEw4MTkyQ1VfUkVDVl9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxMl9yZWN2X2NfCi0jZWxpZiBkZWZpbmVkIF9SVEw4NzFYX01MTUVfRVhUX0NfCi0JI2RlZmluZSBfTU9EVUxFX0RFRklORV8JX21vZHVsZV9tbG1lX29zZGVwX2NfCi0jZWxpZiBkZWZpbmVkIF9SVFdfTVBfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX21wXwotI2VsaWYgZGVmaW5lZCBfUlRXX01QX0lPQ1RMX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JX21vZHVsZV9tcF8KLSNlbGlmIGRlZmluZWQgX1JUV19FRlVTRV9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfZWZ1c2VfCi0jZW5kaWYKLQotI2RlZmluZSBEUklWRVJfUFJFRklYCSJSVEw4NzIzQVU6ICIKLSNkZWZpbmUgREVCVUdfTEVWRUwJKF9kcnZfZXJyXykKLSNkZWZpbmUgREJHXzg3MjNBX0xFVkVMKF9sZXZlbCwgZm10LCBhcmcuLi4pCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCWlmIChfbGV2ZWwgPD0gR2xvYmFsRGVidWdMZXZlbDIzQSkJCQkJXAotCQkJcHJfaW5mbyhEUklWRVJfUFJFRklYIGZtdCwgIyNhcmcpO1wKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIERCR184NzIzQSguLi4pCQkJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCWlmIChfZHJ2X2Vycl8gPD0gR2xvYmFsRGVidWdMZXZlbDIzQSkJCQlcCi0JCQlwcl9pbmZvKERSSVZFUl9QUkVGSVggX19WQV9BUkdTX18pOwkJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgTVNHXzg3MjNBKC4uLikJCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJaWYgKF9kcnZfZXJyXyA8PSBHbG9iYWxEZWJ1Z0xldmVsMjNBKQkJCVwKLQkJCXByX2luZm8oRFJJVkVSX1BSRUZJWCBfX1ZBX0FSR1NfXyk7CQlcCi0JfSB3aGlsZSAoMCkKLQotZXh0ZXJuIHUzMiBHbG9iYWxEZWJ1Z0xldmVsMjNBOwotCi1fX3ByaW50ZigzLCA0KQotdm9pZCBydF90cmFjZShpbnQgY29tcCwgaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Ci0KLSNkZWZpbmUgUlRfVFJBQ0UoX0NvbXAsIF9MZXZlbCwgRm10LCAuLi4pCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JaWYgKF9MZXZlbCA8PSBHbG9iYWxEZWJ1Z0xldmVsMjNBKQkJCQlcCi0JCXJ0X3RyYWNlKF9Db21wLCBfTGV2ZWwsIEZtdCwgIyNfX1ZBX0FSR1NfXyk7CQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFJUX1BSSU5UX0RBVEEoX0NvbXAsIF9MZXZlbCwgX1RpdGxlU3RyaW5nLCBfSGV4RGF0YSwJCVwKLQkJICAgICAgX0hleERhdGFMZW4pCQkJCQlcCi0JaWYgKF9MZXZlbCA8PSBHbG9iYWxEZWJ1Z0xldmVsMjNBKSB7CQkJCVwKLQkJaW50IF9faTsJCQkJCQlcCi0JCXU4CSpwdHIgPSAodTggKilfSGV4RGF0YTsJCQkJXAotCQlwcl9pbmZvKCIlcyIsIERSSVZFUl9QUkVGSVgpOwkJCQlcCi0JCXByX2luZm8oX1RpdGxlU3RyaW5nKTsJCQkJCVwKLQkJZm9yIChfX2kgPSAwOyBfX2kgPCAoaW50KV9IZXhEYXRhTGVuOyBfX2krKykgewkJXAotCQkJcHJpbnRrKCIlMDJYJXMiLCBwdHJbX19pXSwJCQlcCi0JCQkgICAgICAgKCgoX19pICsgMSkgJSA0KSA9PSAwKSA/ICIgICIgOiAiICIpOwlcCi0JCQlpZiAoKChfX2kgKyAxKSAlIDE2KSA9PSAwKQkJCVwKLQkJCQlwcmludGsoIlxuIik7CQkJCVwKLQkJfQkJCQkJCQlcCi0JCXByaW50aygiXG4iKTsJCQkJCQlcCi0JfQotCi0jZW5kaWYJLyogX19SVFdfREVCVUdfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2VlcHJvbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19lZXByb20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg2ZjM2ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2VlcHJvbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUV19FRVBST01fSF9fCi0jZGVmaW5lIF9fUlRXX0VFUFJPTV9IX18KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotI2RlZmluZQlSVEw4NzEyX0VFUFJPTV9JRAkJCTB4ODcxMgotLyogZGVmaW5lCUVFUFJPTV9NQVhfU0laRQkJCTI1NiAqLwotCi0jZGVmaW5lCUhXU0VUX01BWF9TSVpFXzUxMgkJNTEyCi0jZGVmaW5lCUVFUFJPTV9NQVhfU0laRQkJCUhXU0VUX01BWF9TSVpFXzUxMgotCi0jZGVmaW5lCUNMT0NLX1JBVEUJCQkJCTUwCQkJLyogMTAwdXMgKi8KLQotLyogIEVFUFJPTSBvcGNvZGVzICovCi0jZGVmaW5lIEVFUFJPTV9SRUFEX09QQ09ERQkJMDYKLSNkZWZpbmUgRUVQUk9NX1dSSVRFX09QQ09ERQkJMDUKLSNkZWZpbmUgRUVQUk9NX0VSQVNFX09QQ09ERQkJMDcKLSNkZWZpbmUgRUVQUk9NX0VXRU5fT1BDT0RFCQkxOSAgICAgIC8qICBFcmFzZS93cml0ZSBlbmFibGUgKi8KLSNkZWZpbmUgRUVQUk9NX0VXRFNfT1BDT0RFCQkxNiAgICAgIC8qICBFcmFzZS93cml0ZSBkaXNhYmxlICovCi0KLS8qIENvdW50cnkgY29kZXMgKi8KLSNkZWZpbmUgVVNBCQkJCQkJCTB4NTU1MzIwCi0jZGVmaW5lIEVVUk9QRQkJCQkJCTB4MSAvKiB0ZW1wLCBzaG91bGQgYmUgcHJvdmlkZWQgbGF0ZXIgKi8KLSNkZWZpbmUgSkFQQU4JCQkJCQkweDIgLyogdGVtcCwgc2hvdWxkIGJlIHByb3ZpZGVkIGxhdGVyICovCi0KLSNkZWZpbmUJRUVQUk9NX0NJRF9ERUZBVUxUCQkJMHgwCi0jZGVmaW5lCUVFUFJPTV9DSURfQUxQSEEJCQkJMHgxCi0jZGVmaW5lCUVFUFJPTV9DSURfU2VuYW8JCQkJMHgzCi0jZGVmaW5lCUVFUFJPTV9DSURfTmV0Q29yZQkJCQkweDUKLSNkZWZpbmUJRUVQUk9NX0NJRF9DQU1FTwkJCQkwWDgKLSNkZWZpbmUJRUVQUk9NX0NJRF9TSVRFQ09NCQkJCTB4OQotI2RlZmluZQlFRVBST01fQ0lEX0NPUkVHQQkJCQkweEIKLSNkZWZpbmUJRUVQUk9NX0NJRF9FRElNQVhfQkVMS0lOCQkweEMKLSNkZWZpbmUJRUVQUk9NX0NJRF9TRVJDT01NX0JFTEtJTgkJMHhFCi0jZGVmaW5lCUVFUFJPTV9DSURfQ0FNRU8xCQkJCTB4RgotI2RlZmluZQlFRVBST01fQ0lEX1dOQ19DT1JFR0EJCTB4MTIKLSNkZWZpbmUJRUVQUk9NX0NJRF9DTEVWTwkJCQkweDEzCi0jZGVmaW5lCUVFUFJPTV9DSURfV0hRTAkJCQkweEZFIC8qICBhZGRlZCBieSBjaGl5b2tvIGZvciBkdG0sIDIwMDkwMTA4ICovCi0KLS8qICAqLwotLyogIEN1c3RvbWVyIElELCBub3RlIHRoYXQ6ICovCi0vKiAgVGhpcyB2YXJpYWJsZSBpcyBpbml0aWFpbHplZCB0aHJvdWdoIEVFUFJPTSBvciByZWdpc3RyeSwgKi8KLS8qICBob3dldmVyLCBpdHMgZGVmaW5pdGlvbiBtYXkgYmUgZGlmZmVyZW50IHdpdGggdGhhdCBpbiBFRVBST00gZm9yICovCi0vKiAgRUVQUk9NIHNpemUgY29uc2lkZXJhdGlvbi4gU28sIHdlIGhhdmUgdG8gcGVyZm9ybSBwcm9wZXIgdHJhbnNsYXRpb24gYmV0d2VlbiB0aGVtLiAqLwotLyogIEJlc2lkZXMsIEN1c3RvbWVySUQgb2YgcmVnaXN0cnkgaGFzIHByZWNlZGVuY2Ugb2YgdGhhdCBvZiBFRVBST00uICovCi0vKiAgZGVmaW5lZCBiZWxvdy4gMDYwNzAzLCBieSByY25qa28uICovCi0vKiAgKi8KLWVudW0gcnRfY3VzdG9tZXJfaWQKLXsKLQlSVF9DSURfREVGQVVMVCA9IDAsCi0JUlRfQ0lEXzgxODdfQUxQSEEwID0gMSwKLQlSVF9DSURfODE4N19TRVJDT01NX1BTID0gMiwKLQlSVF9DSURfODE4N19IV19MRUQgPSAzLAotCVJUX0NJRF84MTg3X05FVEdFQVIgPSA0LAotCVJUX0NJRF9XSFFMID0gNSwKLQlSVF9DSURfODE5eF9DQU1FTyAgPSA2LAotCVJUX0NJRF84MTl4X1JVTlRPUCA9IDcsCi0JUlRfQ0lEXzgxOXhfU2VuYW8gPSA4LAotCVJUX0NJRF9UT1NISUJBID0gOSwJLyogIE1lcmdlIGJ5IEphY2tlbiwgMjAwOC8wMS8zMS4gKi8KLQlSVF9DSURfODE5eF9OZXRjb3JlID0gMTAsCi0JUlRfQ0lEX05ldHRyb25peCA9IDExLAotCVJUX0NJRF9ETElOSyA9IDEyLAotCVJUX0NJRF9QUk9ORVQgPSAxMywKLQlSVF9DSURfQ09SRUdBID0gMTQsCi0JUlRfQ0lEX0NISU5BX01PQklMRSA9IDE1LAotCVJUX0NJRF84MTl4X0FMUEhBID0gMTYsCi0JUlRfQ0lEXzgxOXhfU2l0ZWNvbSA9IDE3LAotCVJUX0NJRF9DQ1ggPSAxOCwgLyogIEl0J3Mgc2V0IHVuZGVyIENDWCBsb2dvIHRlc3QgYW5kIGlzbid0IGRlbWFuZGVkIGZvciBDQ1ggZnVuY3Rpb25zLCBidXQgZm9yIHRlc3QgYmVoYXZpb3IgbGlrZSByZXRyeSBsaW1pdCBhbmQgdHggcmVwb3J0LiBCeSBCcnVjZSwgMjAwOS0wMi0xNy4gKi8KLQlSVF9DSURfODE5eF9MZW5vdm8gPSAxOSwKLQlSVF9DSURfODE5eF9RTUkgPSAyMCwKLQlSVF9DSURfODE5eF9FZGltYXhfQmVsa2luID0gMjEsCi0JUlRfQ0lEXzgxOXhfU2VyY29tbV9CZWxraW4gPSAyMiwKLQlSVF9DSURfODE5eF9DQU1FTzEgPSAyMywKLQlSVF9DSURfODE5eF9NU0kgPSAyNCwKLQlSVF9DSURfODE5eF9BY2VyID0gMjUsCi0JUlRfQ0lEXzgxOXhfQXpXYXZlX0FTVVMgPSAyNiwKLQlSVF9DSURfODE5eF9BeldhdmUgPSAyNywgLyogIEZvciBBeldhdmUgaW4gUENJZSwgVGhlIElEIGlzIEF6V2F2ZSB1c2UgYW5kIG5vdCBvbmx5IEFzdXMgKi8KLQlSVF9DSURfODE5eF9IUCA9IDI4LAotCVJUX0NJRF84MTl4X1dOQ19DT1JFR0EgPSAyOSwKLQlSVF9DSURfODE5eF9BcmNhZHlhbl9CZWxraW4gPSAzMCwKLQlSVF9DSURfODE5eF9TQU1TVU5HID0gMzEsCi0JUlRfQ0lEXzgxOXhfQ0xFVk8gPSAzMiwKLQlSVF9DSURfODE5eF9ERUxMID0gMzMsCi0JUlRfQ0lEXzgxOXhfUFJPTkVUUyA9IDM0LAotCVJUX0NJRF84MTl4X0VkaW1heF9BU1VTID0gMzUsCi0JUlRfQ0lEXzgxOXhfQ0FNRU9fTkVUR0VBUiA9IDM2LAotCVJUX0NJRF9QTEFORVggPSAzNywKLQlSVF9DSURfQ0NfQyA9IDM4LAotCVJUX0NJRF84MTl4X1hhdmkgPSAzOSwKLQlSVF9DSURfODE5eF9GVU5BSV9UViA9IDQwLAotCVJUX0NJRF84MTl4X0FMUEhBX1dEPTQxLAotfTsKLQotc3RydWN0IGVlcHJvbV9wcml2IHsKLQl1OAkJbWFjX2FkZHJbNl07CS8qIFBlcm1hbmVudEFkZHJlc3MgKi8KLQl1OAkJYmF1dG9sb2FkX2ZhaWxfZmxhZzsKLQl1OAkJYmxvYWRmaWxlX2ZhaWxfZmxhZzsKLQl1OAkJYmxvYWRtYWNfZmFpbF9mbGFnOwotCS8qIHU4CQliZW1wdHk7ICovCi0JLyogdTgJCXN5c19jb25maWc7ICovCi0JLyogdTgJCWNvbmZpZzA7ICovCi0JdTE2CQljaGFubmVsX3BsYW47Ci0JLyogdTgJCWNvdW50cnlfc3RyaW5nWzNdOyAqLwotCS8qIHU4CQl0eF9wb3dlcl9iWzE1XTsgKi8KLQkvKiB1OAkJdHhfcG93ZXJfZ1sxNV07ICovCi0JLyogdTgJCXR4X3Bvd2VyX2FbMjAxXTsgKi8KLQotCXU4CQlFZXByb21PckVmdXNlOwotCi0JdTgJCWVmdXNlX2VlcHJvbV9kYXRhW0hXU0VUX01BWF9TSVpFXzUxMl07IC8qIDkyQzoyNTZieXRlcywgODhFOjUxMmJ5dGVzLCB3ZSB1c2UgdW5pb24gc2V0ICg1MTJieXRlcykgKi8KLX07Ci0KLXZvaWQgZWVwcm9tX3dyaXRlMTYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IHJlZywgdTE2IGRhdGEpOwotdTE2IGVlcHJvbV9yZWFkMTYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IHJlZyk7Ci12b2lkIHJlYWRfZWVwcm9tX2NvbnRlbnQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIGVlcHJvbV9yZWFkX3N6KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiByZWcsIHU4ICpkYXRhLCB1MzIgc3opOwotCi12b2lkIHJlYWRfZWVwcm9tX2NvbnRlbnRfYnlfYXR0cmliKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0jZW5kaWYgIC8qIF9fUlRMODcxWF9FRVBST01fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2VmdXNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2VmdXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NzdlMjYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19lZnVzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVFdfRUZVU0VfSF9fCi0jZGVmaW5lIF9fUlRXX0VGVVNFX0hfXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotCi0jZGVmaW5lCUVGVVNFX0VSUk9FX0hBTkRMRQkJMQotCi0jZGVmaW5lCVBHX1NUQVRFX0hFQURFUgkJCTB4MDEKLSNkZWZpbmUJUEdfU1RBVEVfV09SRF8wCQkweDAyCi0jZGVmaW5lCVBHX1NUQVRFX1dPUkRfMQkJMHgwNAotI2RlZmluZQlQR19TVEFURV9XT1JEXzIJCTB4MDgKLSNkZWZpbmUJUEdfU1RBVEVfV09SRF8zCQkweDEwCi0jZGVmaW5lCVBHX1NUQVRFX0RBVEEJCQkweDIwCi0KLSNkZWZpbmUJUEdfU1dCWVRFX0gJCQkweDAxCi0jZGVmaW5lCVBHX1NXQllURV9MCQkJMHgwMgotCi0jZGVmaW5lCVBHUEtUX0RBVEFfU0laRQkJOAotCi0jZGVmaW5lCUVGVVNFX1dJRkkJCQkJMAotI2RlZmluZQlFRlVTRV9CVAkJCQkxCi0KLWVudW0gX0VGVVNFX0RFRl9UWVBFIHsKLQlUWVBFX0VGVVNFX01BWF9TRUNUSU9OCQkJCT0gMCwKLQlUWVBFX0VGVVNFX1JFQUxfQ09OVEVOVF9MRU4JCQk9IDEsCi0JVFlQRV9BVkFJTEFCTEVfRUZVU0VfQllURVNfQkFOSwkJPSAyLAotCVRZUEVfQVZBSUxBQkxFX0VGVVNFX0JZVEVTX1RPVEFMCT0gMywKLQlUWVBFX0VGVVNFX01BUF9MRU4JCQkJCT0gNCwKLQlUWVBFX0VGVVNFX1BST1RFQ1RfQllURVNfQkFOSwkJPSA1LAotCVRZUEVfRUZVU0VfQ09OVEVOVF9MRU5fQkFOSwkJCT0gNiwKLX07Ci0KLS8qIEUtRnVzZSAqLwotI2RlZmluZSBFRlVTRV9NQVBfU0laRSAgICAgIDI1NgotCi0jZGVmaW5lIEVGVVNFX01BWF9TSVpFICAgICAgNTEyCi0vKiBlbmQgb2YgRS1GdXNlICovCi0KLSNkZWZpbmUJCUVGVVNFX01BWF9NQVBfTEVOCQkyNTYKLSNkZWZpbmUJCUVGVVNFX01BWF9IV19TSVpFCQk1MTIKLSNkZWZpbmUJCUVGVVNFX01BWF9TRUNUSU9OX0JBU0UJMTYKLQotI2RlZmluZSBFWFRfSEVBREVSKGhlYWRlcikgKChoZWFkZXIgJiAweDFGKSA9PSAweDBGKQotI2RlZmluZSBBTExfV09SRFNfRElTQUJMRUQod2RlKQkoKHdkZSAmIDB4MEYpID09IDB4MEYpCi0jZGVmaW5lIEdFVF9IRFJfT0ZGU0VUXzJfMChoZWFkZXIpICggKGhlYWRlciAmIDB4RTApID4+IDUpCi0KLSNkZWZpbmUJCUVGVVNFX1JFUEVBVF9USFJFU0hPTERfCQkJMwotCi0vKiAgKi8KLS8qCVRoZSBmb2xsb3dpbmcgaXMgZm9yIEJUIEVmdXNlIGRlZmluaXRpb24gKi8KLS8qICAqLwotI2RlZmluZQkJRUZVU0VfQlRfTUFYX01BUF9MRU4JCTEwMjQKLSNkZWZpbmUJCUVGVVNFX01BWF9CQU5LCQkJNAotI2RlZmluZQkJRUZVU0VfTUFYX0JUX0JBTksJCShFRlVTRV9NQVhfQkFOSy0xKQotLyogICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIFBhcmFtZXRlcnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUVGVVNFX01BWF9XT1JEX1VOSVQJCQk0Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIHN0cnVjdHVyZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RydWN0IHBnX3BrdF9zdHJ1Y3QgewotCXU4IG9mZnNldDsKLQl1OCB3b3JkX2VuOwotCXU4IGRhdGFbOF07Ci0JdTggd29yZF9jbnRzOwotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUxNgllZnVzZV9HZXRNYXhTaXplMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotaW50CXJ0d19lZnVzZV9hY2Nlc3MyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYlJlYWQsIHUxNiBzdGFydF9hZGRyLCB1MTYgY250cywgdTggKmRhdGEpOwotaW50CXJ0d19lZnVzZV9tYXBfcmVhZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgYWRkciwgdTE2IGNudHMsIHU4ICpkYXRhKTsKLXU4CXJ0d19lZnVzZV9tYXBfd3JpdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHIsIHUxNiBjbnRzLCB1OCAqZGF0YSk7Ci1pbnQJcnR3X0JUX2VmdXNlX21hcF9yZWFkMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyLCB1MTYgY250cywgdTggKmRhdGEpOwotdTgJcnR3X0JUX2VmdXNlX21hcF93cml0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgYWRkciwgdTE2IGNudHMsIHU4ICpkYXRhKTsKLQotdTE2CUVmdXNlX0dldEN1cnJlbnRTaXplMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHU4IGVmdXNlVHlwZSk7Ci11OAlFZnVzZV9DYWxjdWxhdGVXb3JkQ250czIzYSh1OCB3b3JkX2VuKTsKLXZvaWQJUmVhZEVGdXNlQnl0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHUxNiBfb2Zmc2V0LCB1OCAqcGJ1Zik7Ci12b2lkCUVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBlZnVzZVR5cGUsIHU4IHR5cGUsIHZvaWQgKnBPdXQpOwotaW50CWVmdXNlX09uZUJ5dGVSZWFkMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHUxNiBhZGRyLCB1OCAqZGF0YSk7Ci1pbnQJZWZ1c2VfT25lQnl0ZVdyaXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHUxNiBhZGRyLCB1OCBkYXRhKTsKLQotdm9pZAlFZnVzZV9Qb3dlclN3aXRjaDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBiV3JpdGUsCi0JCQkgICAgIHU4IFB3clN0YXRlKTsKLWludAlFZnVzZV9QZ1BhY2tldFJlYWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTggb2Zmc2V0LCB1OCAqZGF0YSk7Ci1pbnQJRWZ1c2VfUGdQYWNrZXRXcml0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBvZmZzZXQsIHU4IHdvcmRfZW4sIHU4ICpkYXRhKTsKLXZvaWQJZWZ1c2VfV29yZEVuYWJsZURhdGFSZWFkMjNhKHU4IHdvcmRfZW4sIHU4ICpzb3VyZGF0YSwgdTggKnRhcmdldGRhdGEpOwotdTgJRWZ1c2VfV29yZEVuYWJsZURhdGFXcml0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MTYgZWZ1c2VfYWRkciwgdTggd29yZF9lbiwgdTggKmRhdGEpOwotCi11OAlFRlVTRV9SZWFkMUJ5dGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTE2IEFkZHJlc3MpOwotdm9pZAlFRlVTRV9TaGFkb3dNYXBVcGRhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTggZWZ1c2VUeXBlKTsKLXZvaWQJRUZVU0VfU2hhZG93UmVhZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBUeXBlLCB1MTYgT2Zmc2V0LCB1MzIgKlZhbHVlKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2V2ZW50LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2V2ZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NTdhZWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19ldmVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9SVFdfRVZFTlRfSF8KLSNkZWZpbmUgX1JUV19FVkVOVF9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPHdsYW5fYnNzZGVmLmg+Ci0KLS8qCi1Vc2VkIHRvIHJlcG9ydCBhIGJzcyBoYXMgYmVlbiBzY2FubmVkCi0qLwotc3RydWN0IHN1cnZleV9ldmVudCB7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKmJzczsKLX07Ci0KLS8qCi1Vc2VkIHRvIHJlcG9ydCB0aGF0IHRoZSByZXF1ZXN0ZWQgc2l0ZSBzdXJ2ZXkgaGFzIGJlZW4gZG9uZS4KLWJzc19jbnQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYnNzIHRoYXQgaGFzIGJlZW4gcmVwb3J0ZWQuCi0qLwotc3RydWN0IHN1cnZleWRvbmVfZXZlbnQgewotCXVuc2lnbmVkIGludCBic3NfY250OwotfTsKLQotLyoKLVVzZWQgdG8gcmVwb3J0IHRoZSBsaW5rIHJlc3VsdCBvZiBqb2lubmluZyB0aGUgZ2l2ZW4gYnNzCi1qb2luX3JlczoKLS0xOiBhdXRoZW50aWNhdGlvbiBmYWlsCi0tMjogYXNzb2NpYXRpb24gZmFpbAotPiAwOiBUSUQKLSovCi1zdHJ1Y3Qgam9pbmJzc19ldmVudCB7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayBuZXR3b3JrOwotfTsKLQotLyoKLVVzZWQgdG8gcmVwb3J0IGEgZ2l2ZW4gU1RBIGhhcyBqb2lubmVkIHRoZSBjcmVhdGVkIEJTUy4KLUl0IGlzIHVzZWQgaW4gQVAvQWQtSG9DKE0pIG1vZGUuCi0qLwotc3RydWN0IHN0YXNzb2NfZXZlbnQgewotCXVuc2lnbmVkIGNoYXIgbWFjYWRkcls2XTsKLQl1bnNpZ25lZCBjaGFyIHJzdmRbMl07Ci0JaW50IGNhbV9pZDsKLX07Ci0KLXN0cnVjdCBzdGFkZWxfZXZlbnQgewotCXVuc2lnbmVkIGNoYXIgbWFjYWRkcls2XTsKLQl1bnNpZ25lZCBjaGFyIHJzdmRbMl07IC8qIGZvciByZWFzb24gKi8KLQlpbnQgbWFjX2lkOwotfTsKLQotc3RydWN0IGFkZGJhX2V2ZW50IHsKLQl1bnNpZ25lZCBpbnQgdGlkOwotfTsKLQotI2RlZmluZSBHRU5fRVZUX0NPREUoZXZlbnQpCWV2ZW50ICMjIF9FVlRfCi0KLXN0cnVjdCBmd2V2ZW50IHsKLQl1MzIgcGFybXNpemU7Ci0Jdm9pZCAoKmV2ZW50X2NhbGxiYWNrKShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmRldiwgY29uc3QgdTggKnBidWYpOwotfTsKLQotI2VuZGlmIC8qICBfV0xBTkVWRU5UX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2h0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2h0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MGViODkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19odC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9SVFdfSFRfSF8KLSNkZWZpbmUgX1JUV19IVF9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgImxpbnV4L2llZWU4MDIxMS5oIgotI2luY2x1ZGUgIndpZmkuaCIKLQotc3RydWN0IGh0X3ByaXYgewotCWJvb2wJaHRfb3B0aW9uOwotCWJvb2wJYW1wZHVfZW5hYmxlOy8qIGZvciBlbmFibGUgVHggQS1NUERVICovCi0JLyogdTgJYmFkZGJhcmVxX2lzc3VlZFsxNl07ICovCi0JdTMyCXR4X2Ftc2R1X2VuYWJsZTsvKiBmb3IgZW5hYmxlIFR4IEEtTVNEVSAqLwotCXUzMgl0eF9hbWRzdV9tYXhsZW47IC8qICAxOiA4aywgMDo0ayA7IGRlZmF1bHQ6OGssIGZvciB0eCAqLwotCXUzMglyeF9hbXBkdV9tYXhsZW47IC8qIGZvciByeCByZW9yZGVyaW5nIGN0cmwgd2luX3N6LCB1cGRhdGVkIHdoZW4gam9pbl9jYWxsYmFjay4gKi8KLQotCXU4CWJ3bW9kZTsvKiAgKi8KLQl1OAljaF9vZmZzZXQ7LyogUFJJTUVfQ0hOTF9PRkZTRVQgKi8KLQl1OAlzZ2k7Lyogc2hvcnQgR0kgKi8KLQotCS8qIGZvciBwcm9jZXNzaW5nIFR4IEEtTVBEVSAqLwotCXUxNglhZ2dfZW5hYmxlX2JpdG1hcDsKLQkvKiB1OAlBRERCQV9yZXRyeV9jb3VudDsgKi8KLQl1MTYJY2FuZGlkYXRlX3RpZF9iaXRtYXA7Ci0KLQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodF9jYXA7Ci19OwotCi0jZW5kaWYJLyogX1JUTDg3MVhfSFRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfaW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxMTllMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX1JUV19JT19IXwotI2RlZmluZSBfUlRXX0lPX0hfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8b3NkZXBfaW50Zi5oPgotCi0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLS8qIGluY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+ICovCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+Ci0KLSNkZWZpbmUgcnR3X3VzYl9idWZmZXJfYWxsb2MoZGV2LCBzaXplLCBkbWEpIHVzYl9hbGxvY19jb2hlcmVudCgoZGV2KSwgKHNpemUpLCAoaW5faW50ZXJydXB0KCkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTCksIChkbWEpKQotI2RlZmluZSBydHdfdXNiX2J1ZmZlcl9mcmVlKGRldiwgc2l6ZSwgYWRkciwgZG1hKSB1c2JfZnJlZV9jb2hlcmVudCgoZGV2KSwgKHNpemUpLCAoYWRkciksIChkbWEpKQotCi0jZGVmaW5lIE5VTV9JT1JFUQkJOAotCi0jZGVmaW5lIE1BWF9QUk9UX1NaCSg2NC0xNikKLQotI2RlZmluZSBfSU9SRUFEWQkJCTAKLSNkZWZpbmUgX0lPX1dBSVRfQ09NUExFVEUgICAxCi0jZGVmaW5lIF9JT19XQUlUX1JTUCAgICAgICAgMgotCi0vKiAgSU8gQ09NTUFORCBUWVBFICovCi0jZGVmaW5lIF9JT1NaX01BU0tfCQkoMHg3RikKLSNkZWZpbmUgX0lPX1dSSVRFXwkJQklUKDcpCi0jZGVmaW5lIF9JT19GSVhFRF8JCUJJVCg4KQotI2RlZmluZSBfSU9fQlVSU1RfCQlCSVQoOSkKLSNkZWZpbmUgX0lPX0JZVEVfCQlCSVQoMTApCi0jZGVmaW5lIF9JT19IV18JCQlCSVQoMTEpCi0jZGVmaW5lIF9JT19XT1JEXwkJQklUKDEyKQotI2RlZmluZSBfSU9fU1lOQ18JCUJJVCgxMykKLSNkZWZpbmUgX0lPX0NNRE1BU0tfCSgweDFGODApCi0KLQotLyoKLQlGb3IgcHJvbXB0IG1vZGUgYWNjZXNzaW5nLCBjYWxsZXIgc2hhbGwgZnJlZSBpb19yZXEKLQlPdGhlcndpc2UsIGlvX2hhbmRsZXIgd2lsbCBmcmVlIGlvX3JlcQotKi8KLQotCi0KLS8qICBJTyBTVEFUVVMgVFlQRSAqLwotI2RlZmluZSBfSU9fRVJSXwkJQklUKDIpCi0jZGVmaW5lIF9JT19TVUNDRVNTXwlCSVQoMSkKLSNkZWZpbmUgX0lPX0RPTkVfCQlCSVQoMCkKLQotCi0jZGVmaW5lIElPX1JEMzIJCQkoX0lPX1NZTkNfIHwgX0lPX1dPUkRfKQotI2RlZmluZSBJT19SRDE2CQkJKF9JT19TWU5DXyB8IF9JT19IV18pCi0jZGVmaW5lIElPX1JEOAkJCShfSU9fU1lOQ18gfCBfSU9fQllURV8pCi0KLSNkZWZpbmUgSU9fUkQzMl9BU1lOQwkoX0lPX1dPUkRfKQotI2RlZmluZSBJT19SRDE2X0FTWU5DCShfSU9fSFdfKQotI2RlZmluZSBJT19SRDhfQVNZTkMJKF9JT19CWVRFXykKLQotI2RlZmluZSBJT19XUjMyCQkJKF9JT19XUklURV8gfCBfSU9fU1lOQ18gfCBfSU9fV09SRF8pCi0jZGVmaW5lIElPX1dSMTYJCQkoX0lPX1dSSVRFXyB8IF9JT19TWU5DXyB8IF9JT19IV18pCi0jZGVmaW5lIElPX1dSOAkJCShfSU9fV1JJVEVfIHwgX0lPX1NZTkNfIHwgX0lPX0JZVEVfKQotCi0jZGVmaW5lIElPX1dSMzJfQVNZTkMJKF9JT19XUklURV8gfCBfSU9fV09SRF8pCi0jZGVmaW5lIElPX1dSMTZfQVNZTkMJKF9JT19XUklURV8gfCBfSU9fSFdfKQotI2RlZmluZSBJT19XUjhfQVNZTkMJKF9JT19XUklURV8gfCBfSU9fQllURV8pCi0KLS8qCi0KLQlPbmx5IFN5bmMuIGJ1cnN0IGFjY2Vzc2luZyBpcyBwcm92aWRlZC4KLQotKi8KLQotI2RlZmluZSBJT19XUl9CVVJTVCh4KQkJKF9JT19XUklURV8gfCBfSU9fU1lOQ18gfCBfSU9fQlVSU1RfIHwgKCAoeCkgJiBfSU9TWl9NQVNLXykpCi0jZGVmaW5lIElPX1JEX0JVUlNUKHgpCQkoX0lPX1NZTkNfIHwgX0lPX0JVUlNUXyB8ICggKHgpICYgX0lPU1pfTUFTS18pKQotCi0KLQotLyogYmVsb3cgaXMgZm9yIHRoZSBpbnRmX29wdGlvbiBiaXQgZGVmaXRpb24uLi4gKi8KLQotI2RlZmluZSBfSU5URl9BU1lOQ18JQklUKDApCS8qIHN1cHBvcnQgYXN5bmMgaW8gKi8KLQotc3RydWN0IGludGZfcHJpdjsKLQotc3RydWN0IGlvX3JlcSB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCXUzMglhZGRyOwotCXZvbGF0aWxlIHUzMgl2YWw7Ci0JdTMyCWNvbW1hbmQ7Ci0JdTMyCXN0YXR1czsKLQl1OAkqcGJ1ZjsKLQlzdHJ1Y3Qgc2VtYXBob3JlCXNlbWE7Ci0KLQl2b2lkICgqX2FzeW5jX2lvX2NhbGxiYWNrKShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGF0ZXIsIHN0cnVjdCBpb19yZXEgKnBpb19yZXEsIHU4ICpjbnh0KTsKLQl1OCAqY254dDsKLX07Ci0KLXN0cnVjdCByZWdfcHJvdG9jb2xfcmQgewotCi0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0KLQkvKiBEVzEgKi8KLQl1MzIJCU51bU9mVHJhbnM6NDsKLQl1MzIJCVJlc2VydmVkMTo0OwotCXUzMgkJUmVzZXJ2ZWQyOjI0OwotCS8qIERXMiAqLwotCXUzMgkJQnl0ZUNvdW50Ojc7Ci0JdTMyCQlXcml0ZUVuYWJsZToxOwkJLyogMDpyZWFkLCAxOndyaXRlICovCi0JdTMyCQlGaXhPckNvbnRpbnVvdXM6MTsJLyogMDpjb250aW51b3VzLCAxOiBGaXggKi8KLQl1MzIJCUJ1cnN0TW9kZToxOwotCXUzMgkJQnl0ZTFBY2Nlc3M6MTsKLQl1MzIJCUJ5dGUyQWNjZXNzOjE7Ci0JdTMyCQlCeXRlNEFjY2VzczoxOwotCXUzMgkJUmVzZXJ2ZWQzOjM7Ci0JdTMyCQlSZXNlcnZlZDQ6MTY7Ci0JLyogRFczICovCi0JdTMyCQlCdXNBZGRyZXNzOwotCS8qIERXNCAqLwotCS8qIHUzMgkJVmFsdWU7ICovCi0jZWxzZQotCi0KLS8qIERXMSAqLwotCXUzMiBSZXNlcnZlZDEgIDo0OwotCXUzMiBOdW1PZlRyYW5zIDo0OwotCi0JdTMyIFJlc2VydmVkMiAgOjI0OwotCi0JLyogRFcyICovCi0JdTMyIFdyaXRlRW5hYmxlIDogMTsKLQl1MzIgQnl0ZUNvdW50IDo3OwotCi0KLQl1MzIgUmVzZXJ2ZWQzIDogMzsKLQl1MzIgQnl0ZTRBY2Nlc3MgOiAxOwotCi0JdTMyIEJ5dGUyQWNjZXNzIDogMTsKLQl1MzIgQnl0ZTFBY2Nlc3MgOiAxOwotCXUzMiBCdXJzdE1vZGUgOjEgOwotCXUzMiBGaXhPckNvbnRpbnVvdXMgOiAxOwotCi0JdTMyIFJlc2VydmVkNCA6IDE2OwotCi0JLyogRFczICovCi0JdTMyCQlCdXNBZGRyZXNzOwotCi0JLyogRFc0ICovCi0JLyogdTMyCQlWYWx1ZTsgKi8KLQotI2VuZGlmCi0KLX07Ci0KLQotc3RydWN0IHJlZ19wcm90b2NvbF93dCB7Ci0KLQotI2lmZGVmIF9fTElUVExFX0VORElBTgotCi0JLyogRFcxICovCi0JdTMyCQlOdW1PZlRyYW5zOjQ7Ci0JdTMyCQlSZXNlcnZlZDE6NDsKLQl1MzIJCVJlc2VydmVkMjoyNDsKLQkvKiBEVzIgKi8KLQl1MzIJCUJ5dGVDb3VudDo3OwotCXUzMgkJV3JpdGVFbmFibGU6MTsJCS8qIDA6cmVhZCwgMTp3cml0ZSAqLwotCXUzMgkJRml4T3JDb250aW51b3VzOjE7CS8qIDA6Y29udGludW91cywgMTogRml4ICovCi0JdTMyCQlCdXJzdE1vZGU6MTsKLQl1MzIJCUJ5dGUxQWNjZXNzOjE7Ci0JdTMyCQlCeXRlMkFjY2VzczoxOwotCXUzMgkJQnl0ZTRBY2Nlc3M6MTsKLQl1MzIJCVJlc2VydmVkMzozOwotCXUzMgkJUmVzZXJ2ZWQ0OjE2OwotCS8qIERXMyAqLwotCXUzMgkJQnVzQWRkcmVzczsKLQkvKiBEVzQgKi8KLQl1MzIJCVZhbHVlOwotCi0jZWxzZQotCS8qIERXMSAqLwotCXUzMiBSZXNlcnZlZDEgIDo0OwotCXUzMiBOdW1PZlRyYW5zIDo0OwotCi0JdTMyIFJlc2VydmVkMiAgOjI0OwotCi0JLyogRFcyICovCi0JdTMyIFdyaXRlRW5hYmxlIDogMTsKLQl1MzIgQnl0ZUNvdW50IDo3OwotCi0JdTMyIFJlc2VydmVkMyA6IDM7Ci0JdTMyIEJ5dGU0QWNjZXNzIDogMTsKLQotCXUzMiBCeXRlMkFjY2VzcyA6IDE7Ci0JdTMyIEJ5dGUxQWNjZXNzIDogMTsKLQl1MzIgQnVyc3RNb2RlIDoxIDsKLQl1MzIgRml4T3JDb250aW51b3VzIDogMTsKLQotCXUzMiBSZXNlcnZlZDQgOiAxNjsKLQotCS8qIERXMyAqLwotCXUzMgkJQnVzQWRkcmVzczsKLQotCS8qIERXNCAqLwotCXUzMgkJVmFsdWU7Ci0KLSNlbmRpZgotCi19OwotCi0jZGVmaW5lIFBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUoX2EsIF9iLCBfYykJCVwKLQlydGw4NzIzYXVfd3JpdGU4KF9hLCBfYiwgX2MpCi0jZGVmaW5lIFBsYXRmb3JtRUZJT1dyaXRlMkJ5dGUoX2EsIF9iLCBfYykJCVwKLQlydGw4NzIzYXVfd3JpdGUxNihfYSwgX2IsIF9jKQotI2RlZmluZSBQbGF0Zm9ybUVGSU9Xcml0ZTRCeXRlKF9hLCBfYiwgX2MpCQlcCi0JcnRsODcyM2F1X3dyaXRlMzIoX2EsIF9iLCBfYykKLQotI2RlZmluZSBQbGF0Zm9ybUVGSU9SZWFkMUJ5dGUoX2EsIF9iKQkJcnRsODcyM2F1X3JlYWQ4KF9hLCBfYikKLSNkZWZpbmUgUGxhdGZvcm1FRklPUmVhZDJCeXRlKF9hLCBfYikJCXJ0bDg3MjNhdV9yZWFkMTYoX2EsIF9iKQotI2RlZmluZSBQbGF0Zm9ybUVGSU9SZWFkNEJ5dGUoX2EsIF9iKQkJcnRsODcyM2F1X3JlYWQzMihfYSwgX2IpCi0KLSNlbmRpZgkvKiBfUlRMODcxMV9JT19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19tbG1lLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X21sbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJkM2E1Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X21sbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fUlRXX01MTUVfSF8KLSNkZWZpbmUgX19SVFdfTUxNRV9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDx3bGFuX2Jzc2RlZi5oPgotCi0jZGVmaW5lCU1BWF9CU1NfQ05UCTEyOAotI2RlZmluZSAgIE1BWF9KT0lOX1RJTUVPVVQJNjUwMAotCi0vKiBJbmNyZWFzZSB0aGUgc2Nhbm5pbmcgdGltZW91dCBiZWNhdXNlIG9mIGluY3JlYXNpbmcgdGhlIFNVUlZFWV9UTyB2YWx1ZS4gKi8KLQotI2RlZmluZQlTQ0FOTklOR19USU1FT1VUCTgwMDAKLQotI2RlZmluZQlTQ0FOX0lOVEVSVkFMCSgzMCkgLyogIHVuaXQ6MnNlYywgMzAqMiA9IDYwc2VjICovCi0KLSNkZWZpbmUJU0NBTlFVRVVFX0xJRkVUSU1FIDIwIC8qICB1bml0OnNlYyAqLwotCi0jZGVmaW5lCVdJRklfTlVMTF9TVEFURQkJMHgwMDAwMDAwMAotCi0jZGVmaW5lCVdJRklfQVNPQ19TVEFURQkJMHgwMDAwMDAwMSAvKiAgVW5kZXIgTGlua2VkIHN0YXRlLiovCi0jZGVmaW5lCVdJRklfUkVBU09DX1NUQVRFCTB4MDAwMDAwMDIKLSNkZWZpbmUJV0lGSV9TTEVFUF9TVEFURQkweDAwMDAwMDA0Ci0jZGVmaW5lCVdJRklfU1RBVElPTl9TVEFURQkweDAwMDAwMDA4Ci0KLSNkZWZpbmUJV0lGSV9BUF9TVEFURQkJMHgwMDAwMDAxMAotI2RlZmluZQlXSUZJX0FESE9DX1NUQVRFCTB4MDAwMDAwMjAKLSNkZWZpbmUgICBXSUZJX0FESE9DX01BU1RFUl9TVEFURQkweDAwMDAwMDQwCi0jZGVmaW5lICAgV0lGSV9VTkRFUl9MSU5LSU5HCTB4MDAwMDAwODAKLQotI2RlZmluZQlXSUZJX1VOREVSX1dQUwkJMHgwMDAwMDEwMAotI2RlZmluZQlXSUZJX1NUQV9BTElWRV9DSEtfU1RBVEUJMHgwMDAwMDQwMAotLyogdG8gaW5kaWNhdGUgdGhlIHN0YXRpb24gaXMgdW5kZXIgc2l0ZSBzdXJ2ZXlpbmcgKi8KLSNkZWZpbmUJV0lGSV9TSVRFX01PTklUT1IJMHgwMDAwMDgwMAotCi0jZGVmaW5lCVdJRklfTVBfU1RBVEUJCTB4MDAwMTAwMDAKLSNkZWZpbmUJV0lGSV9NUF9DVFhfQkFDS0dST1VORAkweDAwMDIwMDAwCS8qICBpbiBjb250aW51b3VzIHR4IGJhY2tncm91bmQgKi8KLSNkZWZpbmUJV0lGSV9NUF9DVFhfU1QJCTB4MDAwNDAwMDAJLyogIGluIGNvbnRpbnVvdXMgdHggd2l0aCBzaW5nbGUtdG9uZSAqLwotI2RlZmluZQlXSUZJX01QX0NUWF9CQUNLR1JPVU5EX1BFTkRJTkcJMHgwMDA4MDAwMAkvKiAgcGVuZGluZyBpbiBjb250aW51b3VzIHR4IGJhY2tncm91bmQgZHVlIHRvIG91dCBvZiBza2IgKi8KLSNkZWZpbmUJV0lGSV9NUF9DVFhfQ0NLX0hXCTB4MDAxMDAwMDAJLyogIGluIGNvbnRpbnVvdXMgdHggKi8KLSNkZWZpbmUJV0lGSV9NUF9DVFhfQ0NLX0NTCTB4MDAyMDAwMDAJLyogIGluIGNvbnRpbnVvdXMgdHggd2l0aCBjYXJyaWVyIHN1cHByZXNzaW9uICovCi0jZGVmaW5lICAgV0lGSV9NUF9MUEJLX1NUQVRFCTB4MDA0MDAwMDAKLQotI2RlZmluZSBfRldfVU5ERVJfTElOS0lORwlXSUZJX1VOREVSX0xJTktJTkcKLSNkZWZpbmUgX0ZXX0xJTktFRAkJV0lGSV9BU09DX1NUQVRFCi0jZGVmaW5lIF9GV19VTkRFUl9TVVJWRVkJV0lGSV9TSVRFX01PTklUT1IKLQotCi1lbnVtIGRvdDExQXV0aEFsZ3J0aG1OdW0gewotCWRvdDExQXV0aEFsZ3J0aG1fT3BlbiA9IDAsCi0JZG90MTFBdXRoQWxncnRobV9TaGFyZWQsCi0JZG90MTFBdXRoQWxncnRobV84MDIxWCwKLQlkb3QxMUF1dGhBbGdydGhtX0F1dG8sCi0JZG90MTFBdXRoQWxncnRobV9NYXhOdW0KLX07Ci0KLS8qICBTY2FuIHR5cGUgaW5jbHVkaW5nIGFjdGl2ZSBhbmQgcGFzc2l2ZSBzY2FuLiAqLwotZW51bSBydF9zY2FuX3R5cGUgewotCVNDQU5fUEFTU0lWRSwKLQlTQ0FOX0FDVElWRSwKLQlTQ0FOX01JWCwKLX07Ci0KLWVudW0gewotCUdIWjI0XzUwID0gMCwKLQlHSFpfNTAsCi0JR0haXzI0LAotfTsKLQotLyoKLQotdGhlcmUgYXJlIHNldmVyYWwgImxvY2tzIiBpbiBtbG1lX3ByaXYsCi1zaW5jZSBtbG1lX3ByaXYgaXMgYSBzaGFyZWQgcmVzb3VyY2UgYmV0d2VlbiBtYW55IHRocmVhZHMsCi1saWtlIElTUi9DYWxsLUJhY2sgZnVuY3Rpb25zLCB0aGUgT0lEIGhhbmRsZXJzLCBhbmQgZXZlbiB0aW1lciBmdW5jdGlvbnMuCi0KLQotRWFjaCBfcXVldWUgaGFzIGl0cyBvd24gbG9ja3MsIGFscmVhZHkuCi1PdGhlciBpdGVtcyBhcmUgcHJvdGVjdGVkIGJ5IG1sbWVfcHJpdi5sb2NrLgotCi1UbyBhdm9pZCBwb3NzaWJsZSBkZWFkIGxvY2ssIGFueSB0aHJlYWQgdHJ5aW5nIHRvIG1vZGlmaXlpbmcgbWxtZV9wcml2Ci1TSEFMTCBub3QgbG9jayB1cCBtb3JlIHRoYW4gb25lIGxvY2tzIGF0IGEgdGltZSEKLSovCi0KLXN0cnVjdCBydF9saW5rX2RldGVjdCB7Ci0JdTMyCU51bVR4T2tJblBlcmlvZDsKLQl1MzIJTnVtUnhPa0luUGVyaW9kOwotCXUzMglOdW1SeFVuaWNhc3RPa0luUGVyaW9kOwotCWJvb2wJYkJ1c3lUcmFmZmljOwotCWJvb2wJYlR4QnVzeVRyYWZmaWM7Ci0JYm9vbAliUnhCdXN5VHJhZmZpYzsKLQlib29sCWJIaWdoZXJCdXN5VHJhZmZpYzsgLyogIEZvciBpbnRlcnJ1cHQgbWlncmF0aW9uIHB1cnBvc2UuICovCi0JYm9vbAliSGlnaGVyQnVzeVJ4VHJhZmZpYzsgLyogIFdlIG1heSBkaXNhYmxlIFR4IGludGVycnVwdCBhY2NvcmRpbmcgYXMgUnggdHJhZmZpYy4gKi8KLQlib29sCWJIaWdoZXJCdXN5VHhUcmFmZmljOyAvKiAgV2UgbWF5IGRpc2FibGUgVHggaW50ZXJydXB0IGFjY29yZGluZyBhcyBUeCB0cmFmZmljLiAqLwotfTsKLQotc3RydWN0IG1sbWVfcHJpdiB7Ci0Jc3BpbmxvY2tfdAlsb2NrOwotCWludAlmd19zdGF0ZTsKLQl1OCBiU2NhbkluUHJvY2VzczsKLQl1OAl0b19qb2luOyAvKiBmbGFnICovCi0JdTggdG9fcm9hbWluZzsgLyogIHJvYW1pbmcgdHJ5aW5nIHRpbWVzICovCi0KLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKm5pY19oZGw7Ci0KLQl1OAlub3RfaW5kaWNfZGlzY287Ci0Jc3RydWN0IHJ0d19xdWV1ZQlzY2FubmVkX3F1ZXVlOwotCi0Jc3RydWN0IGNmZzgwMjExX3NzaWQgYXNzb2Nfc3NpZDsKLQl1OAlhc3NvY19ic3NpZFs2XTsKLQotCXN0cnVjdCB3bGFuX25ldHdvcmsJY3VyX25ldHdvcms7Ci0KLQkvKiB1aW50IHdpcmVsZXNzX21vZGU7IG5vIHVzZWQsIHJlbW92ZSBpdCAqLwotCi0JdTMyCXNjYW5faW50ZXJ2YWw7Ci0KLQlzdHJ1Y3QgdGltZXJfbGlzdCBhc3NvY190aW1lcjsKLQotCXVpbnQgYXNzb2NfYnlfYnNzaWQ7Ci0JdWludCBhc3NvY19ieV9yc3NpOwotCi0Jc3RydWN0IHRpbWVyX2xpc3Qgc2Nhbl90b190aW1lcjsKLQotCXN0cnVjdCB0aW1lcl9saXN0IHNldF9zY2FuX2RlbnlfdGltZXI7Ci0JYXRvbWljX3Qgc2V0X3NjYW5fZGVueTsgLyogMDogYWxsb3dlZCwgMTogZGVueSAqLwotCi0JdW5zaWduZWQgaW50IHFvc19vcHRpb247Ci0KLQkvKiBOdW1iZXIgb2Ygbm9uLUhUIEFQL3N0YXRpb25zICovCi0JaW50IG51bV9zdGFfbm9faHQ7Ci0KLQlpbnQgbnVtX0ZvcnR5TUh6SW50b2xlcmFudDsKLQotCXN0cnVjdCBodF9wcml2CWh0cHJpdjsKLQotCXN0cnVjdCBydF9saW5rX2RldGVjdCBMaW5rRGV0ZWN0SW5mbzsKLQlzdHJ1Y3QgdGltZXJfbGlzdCBkeW5hbWljX2Noa190aW1lcjsgLyogZHluYW1pYy9wZXJpb2RpYyBjaGVjayB0aW1lciAqLwotCi0JdTgJa2V5X21hc2s7IC8qIHVzZSBmb3IgaXBzIHRvIHNldCB3ZXAga2V5IGFmdGVyIGlwc19sZWF2ZTIzYSAqLwotCXU4CWFjbV9tYXNrOyAvKiAgZm9yIHdtbSBhY20gbWFzayAqLwotCXU4CUNoYW5uZWxQbGFuOwotCWVudW0gcnRfc2Nhbl90eXBlIHNjYW5fbW9kZTsgLyogIGFjdGl2ZTogMSwgcGFzc2l2ZTogMCAqLwotCi0JdTggKndwc19wcm9iZV9yZXFfaWU7Ci0JdTMyIHdwc19wcm9iZV9yZXFfaWVfbGVuOwotCXU4ICphc3NvY19yZXE7Ci0JdTMyIGFzc29jX3JlcV9sZW47Ci0JdTMyIGFzc29jX3JzcF9sZW47Ci0JdTggKmFzc29jX3JzcDsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCS8qIE51bWJlciBvZiBhc3NvY2lhdGVkIE5vbi1FUlAgc3RhdGlvbnMgKGkuZS4sIHN0YXRpb25zIHVzaW5nIDgwMi4xMWIKLQkgKiBpbiA4MDIuMTFnIEJTUykgKi8KLQlpbnQgbnVtX3N0YV9ub25fZXJwOwotCi0JLyogTnVtYmVyIG9mIGFzc29jaWF0ZWQgc3RhdGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBTaG9ydCBTbG90IFRpbWUgKi8KLQlpbnQgbnVtX3N0YV9ub19zaG9ydF9zbG90X3RpbWU7Ci0KLQkvKiBOdW1iZXIgb2YgYXNzb2NpYXRlZCBzdGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IFNob3J0IFByZWFtYmxlICovCi0JaW50IG51bV9zdGFfbm9fc2hvcnRfcHJlYW1ibGU7Ci0KLQlpbnQgb2xiYzsgLyogT3ZlcmxhcHBpbmcgTGVnYWN5IEJTUyBDb25kaXRpb24gKi8KLQotCS8qIE51bWJlciBvZiBIVCBhc3NvY2lhdGVkIHN0YXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgZ3JlZW5maWVsZCAqLwotCWludCBudW1fc3RhX2h0X25vX2dmOwotCi0JLyogTnVtYmVyIG9mIGFzc29jaWF0ZWQgbm9uLUhUIHN0YXRpb25zICovCi0JLyogaW50IG51bV9zdGFfbm9faHQ7ICovCi0KLQkvKiBOdW1iZXIgb2YgSFQgYXNzb2NpYXRlZCBzdGF0aW9ucyAyMCBNSHogKi8KLQlpbnQgbnVtX3N0YV9odF8yMG1oejsKLQotCS8qIE92ZXJsYXBwaW5nIEJTUyBpbmZvcm1hdGlvbiAqLwotCWludCBvbGJjX2h0OwotCi0JdTE2IGh0X29wX21vZGU7Ci0KLQlzcGlubG9ja190CWJjbl91cGRhdGVfbG9jazsKLQl1OAkJdXBkYXRlX2JjbjsKLQotI2VuZGlmIC8qIGlmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERSAqLwotfTsKLQotdm9pZCBydHdfam9pbmJzc19ldmVudF9wcmVoYW5kbGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1OCAqcGJ1Zik7Ci12b2lkIHJ0d19zdXJ2ZXlfZXZlbnRfY2IyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci12b2lkIHJ0d19zdXJ2ZXlkb25lX2V2ZW50X2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotdm9pZCBydHcyM2Ffam9pbmJzc19ldmVudF9jYihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLXZvaWQgcnR3X3N0YXNzb2NfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci12b2lkIHJ0d19zdGFkZWxfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci0KLWludCBldmVudF90aHJlYWQodm9pZCAqY29udGV4dCk7Ci12b2lkIHJ0dzIzYV9qb2luX3RvX2hhbmRsZXIodW5zaWduZWQgbG9uZyk7Ci0KLXZvaWQgcnR3X2ZyZWVfbmV0d29ya19xdWV1ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotaW50IHJ0d19pbml0X21sbWVfcHJpdjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotCi12b2lkIHJ0d19mcmVlX21sbWVfcHJpdjIzYShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpOwotCi1pbnQgcnR3X2RvX2pvaW5fYWRob2Moc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLWludCBydHdfZG9fam9pbl9uZXR3b3JrKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCXN0cnVjdCB3bGFuX25ldHdvcmsgKmNhbmRpZGF0ZSk7Ci1pbnQgcnR3X3NlbGVjdF9hbmRfam9pbl9mcm9tX3NjYW5uZWRfcXVldWUyM2Eoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2KTsKLWludCBydHdfc2V0X2tleTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2LCBpbnQga2V5aWQsIHU4IHNldF90eCk7Ci1pbnQgcnR3X3NldF9hdXRoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJIHN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2KTsKLQotc3RhdGljIGlubGluZSB1OCAqZ2V0X2Jzc2lkKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKLXsJLyogaWYgc3RhX21vZGU6cG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLk1hY0FkZHJlc3MgPT4gYnNzaWQgKi8KLQkvKiAgaWYgYWRob2NfbW9kZTpwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuTWFjQWRkcmVzcyA9PiBpYnNzIG1hYyBhZGRyZXNzICovCi0JcmV0dXJuIHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5NYWNBZGRyZXNzOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgY2hlY2tfZndzdGF0ZShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsIGludCBzdGF0ZSkKLXsKLQlpZiAocG1sbWVwcml2LT5md19zdGF0ZSAmIHN0YXRlKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZ2V0X2Z3c3RhdGUoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2KQotewotCXJldHVybiBwbWxtZXByaXYtPmZ3X3N0YXRlOwotfQotCi0vKgotICogTm8gTGltaXQgb24gdGhlIGNhbGxpbmcgY29udGV4dCwKLSAqIHRoZXJlZm9yZSBzZXQgaXQgdG8gYmUgdGhlIGNyaXRpY2FsIHNlY3Rpb24uLi4KLSAqCi0gKiAjIyMgTk9URTojIyMjICghISEhKQotICogTVVTVCBUQUtFIENBUkUgVEhBVCBCRUZPUkUgQ0FMTElORyBUSElTIEZVTkMsIFlPVSBTSE9VTEQgSEFWRSBMT0NLRUQgcG1sbWVwcml2LT5sb2NrCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZndzdGF0ZShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsIGludCBzdGF0ZSkKLXsKLQlwbWxtZXByaXYtPmZ3X3N0YXRlIHw9IHN0YXRlOwotCS8qIEZPUiBIVyBpbnRlZ3JhdGlvbiAqLwotCWlmIChfRldfVU5ERVJfU1VSVkVZID09IHN0YXRlKQotCQlwbWxtZXByaXYtPmJTY2FuSW5Qcm9jZXNzID0gdHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9jbHJfZndzdGF0ZV8oc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2LCBpbnQgc3RhdGUpCi17Ci0JcG1sbWVwcml2LT5md19zdGF0ZSAmPSB+c3RhdGU7Ci0JLyogRk9SIEhXIGludGVncmF0aW9uICovCi0JaWYgKF9GV19VTkRFUl9TVVJWRVkgPT0gc3RhdGUpCi0JCXBtbG1lcHJpdi0+YlNjYW5JblByb2Nlc3MgPSBmYWxzZTsKLX0KLQotLyoKLSAqIE5vIExpbWl0IG9uIHRoZSBjYWxsaW5nIGNvbnRleHQsCi0gKiB0aGVyZWZvcmUgc2V0IGl0IHRvIGJlIHRoZSBjcml0aWNhbCBzZWN0aW9uLi4uCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBjbHJfZndzdGF0ZShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsIGludCBzdGF0ZSkKLXsKLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBzdGF0ZSkpCi0JCXBtbG1lcHJpdi0+Zndfc3RhdGUgXj0gc3RhdGU7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjbHJfZndzdGF0ZV9leChzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsIGludCBzdGF0ZSkKLXsKLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0JX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIHN0YXRlKTsKLQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLX0KLQotdm9pZCBydHdfZGlzY29ubmVjdF9oZGwyM2FfdW5kZXJfbGlua2VkKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgICAgIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgdTggZnJlZV9hc3NvYyk7Ci12b2lkIHJ0d19nZW5lcmF0ZV9yYW5kb21faWJzczIzYSh1OCAqcGlic3MpOwotc3RydWN0IHdsYW5fbmV0d29yayAqcnR3X2ZpbmRfbmV0d29yazIzYShzdHJ1Y3QgcnR3X3F1ZXVlICpzY2FubmVkX3F1ZXVlLCB1OCAqYWRkcik7Ci1zdHJ1Y3Qgd2xhbl9uZXR3b3JrICpydHdfZ2V0X29sZGVzdF93bGFuX25ldHdvcmsyM2Eoc3RydWN0IHJ0d19xdWV1ZSAqc2Nhbm5lZF9xdWV1ZSk7Ci0KLXZvaWQgcnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCSAgICAgIGludCBsb2NrX3NjYW5uZWRfcXVldWUpOwotdm9pZCBydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBydHdfaW5kaWNhdGVfY29ubmVjdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBydHdfc2Nhbl9hYm9ydDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotCi1pbnQgcnR3X3Jlc3RydWN0X3NlY19pZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICppbl9pZSwgdTggKm91dF9pZSwKLQkJCXVpbnQgaW5fbGVuKTsKLWludCBydHdfcmVzdHJ1Y3Rfd21tX2llMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTggKmluX2llLCB1OCAqb3V0X2llLAotCQkJdWludCBpbl9sZW4sIHVpbnQgaW5pdGlhbF9vdXRfbGVuKTsKLXZvaWQgcnR3X2luaXRfcmVnaXN0cnlwcml2X2Rldl9uZXR3b3JrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci0KLXZvaWQgcnR3X3VwZGF0ZV9yZWdpc3RyeXByaXZfZGV2X25ldHdvcmsyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLQotdm9pZCBydHdfc2Nhbl90aW1lb3V0X2hhbmRsZXIyM2EodW5zaWduZWQgbG9uZyBkYXRhKTsKLQotdm9pZCBydHdfZHluYW1pY19jaGVja190aW1lcl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1ib29sIHJ0d19pc19zY2FuX2Rlbnkoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgcnR3X2NsZWFyX3NjYW5fZGVueShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBydHdfc2V0X3NjYW5fZGVueV90aW1lcl9oZGwodW5zaWduZWQgbG9uZyBkYXRhKTsKLXZvaWQgcnR3X3NldF9zY2FuX2Rlbnkoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1MzIgbXMpOwotCi12b2lkIHJ0dzIzYV9mcmVlX21sbWVfcHJpdl9pZV9kYXRhKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdik7Ci0KLXZvaWQgX3J0d19mcmVlX21sbWVfcHJpdjIzYShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpOwotCi1zdHJ1Y3Qgd2xhbl9uZXR3b3JrICpydHdfYWxsb2NfbmV0d29yayhzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsIGdmcF90IGdmcCk7Ci0KLWludCBydHdfaWZfdXAyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLWludCBydHdfbGlua2VkX2NoZWNrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIHJ0d19qb2luYnNzX3Jlc2V0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi1ib29sIHJ0d19yZXN0cnVjdHVyZV9odF9pZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqaW5faWUsCi0JCQkgICAgICB1OCAqb3V0X2llLCB1aW50IGluX2xlbiwgdWludCAqcG91dF9sZW4pOwotdm9pZCBydHdfdXBkYXRlX2h0X2NhcDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgICAgdTggKnBpZSwgdWludCBpZV9sZW4pOwotdm9pZCBydHdfaXNzdWVfYWRkYmFyZXFfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpOwotCi1ib29sIHJ0d19pc19zYW1lX2lic3MyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJIHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKTsKLWludCBpc19zYW1lX25ldHdvcmsyM2Eoc3RydWN0IHdsYW5fYnNzaWRfZXggKnNyYywgc3RydWN0IHdsYW5fYnNzaWRfZXggKmRzdCk7Ci0KLXZvaWQgcnR3MjNhX3JvYW1pbmcoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkgc3RydWN0IHdsYW5fbmV0d29yayAqdGd0X25ldHdvcmspOwotdm9pZCBydHdfc2V0X3JvYW1pbmcoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1OCB0b19yb2FtaW5nKTsKLQotI2VuZGlmIC8qIF9fUlRMODcxWF9NTE1FX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X21sbWVfZXh0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X21sbWVfZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlN2QzZGE5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfbWxtZV9leHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVFdfTUxNRV9FWFRfSF8KLSNkZWZpbmUgX19SVFdfTUxNRV9FWFRfSF8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDx3bGFuX2Jzc2RlZi5oPgotCi0KLS8qCUNvbW1lbnRlZCBieSBBbGJlcnQgMjAxMDExMDUgKi8KLS8qCUluY3JlYXNlIHRoZSBTVVJWRVlfVE8gdmFsdWUgZnJvbSAxMDAgdG8gMTUwICAoIDEwMG1zIHRvIDE1MG1zICkgKi8KLS8qCVRoZSBSZWFsdGVrIDgxODhDRSBTb2Z0QVAgd2lsbCBzcGVuZCBhcm91bmQgMTAwbXMgdG8gc2VuZCB0aGUgcHJvYmUgcmVzcG9uc2UgYWZ0ZXIgcmVjZWl2aW5nIHRoZSBwcm9iZSByZXF1ZXN0LiAqLwotLyoJU28sIHRoaXMgZHJpdmVyIHRyaWVkIHRvIGV4dGVuZCB0aGUgZHdlbGwgdGltZSBmb3IgZWFjaCBzY2FubmluZyBjaGFubmVsLiAqLwotLyoJVGhpcyB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2UgdG8gcmVjZWl2ZSB0aGUgcHJvYmUgcmVzcG9uc2UgZnJvbSBTb2Z0QVAuICovCi0KLSNkZWZpbmUgU1VSVkVZX1RPCQkoMTAwKQotI2RlZmluZSBSRUFVVEhfVE8JCSgzMDApIC8qIDUwKSAqLwotI2RlZmluZSBSRUFTU09DX1RPCQkoMzAwKSAvKiA1MCkgKi8KLS8qIGRlZmluZSBESVNDT05ORUNUX1RPCSgzMDAwKSAqLwotI2RlZmluZSBBRERCQV9UTwkJCSgyMDAwKQotCi0jZGVmaW5lIExJTktFRF9UTyAoMSkgLyogdW5pdDoyIHNlYywgMXgyPTIgc2VjICovCi0KLSNkZWZpbmUgUkVBVVRIX0xJTUlUCSg0KQotI2RlZmluZSBSRUFTU09DX0xJTUlUCSg0KQotI2RlZmluZSBSRUFEREJBX0xJTUlUCSgyKQotCi0jZGVmaW5lIFJPQU1JTkdfTElNSVQJOAotCi0jZGVmaW5lCURZTkFNSUNfRlVOQ19ESVNBQkxFCQkJKDB4MCkKLQotLyogID09PT09PSBlbnVtIG9kbV9hYmlsaXR5ID09PT09PT09ICovCi0vKiAgQkIgT0RNIHNlY3Rpb24gQklUIDAtMTUgKi8KLSNkZWZpbmUJRFlOQU1JQ19CQl9ESUcJCQkJQklUKDApCi0jZGVmaW5lCURZTkFNSUNfQkJfUkFfTUFTSwkJCUJJVCgxKQotI2RlZmluZQlEWU5BTUlDX0JCX0RZTkFNSUNfVFhQV1IJQklUKDIpCi0jZGVmaW5lCURZTkFNSUNfQkJfQkJfRkFfQ05UCQkJQklUKDMpCi0KLSNkZWZpbmUJCURZTkFNSUNfQkJfUlNTSV9NT05JVE9SCQlCSVQoNCkKLSNkZWZpbmUJCURZTkFNSUNfQkJfQ0NLX1BECQkJQklUKDUpCi0jZGVmaW5lCQlEWU5BTUlDX0JCX0FOVF9ESVYJCQlCSVQoNikKLSNkZWZpbmUJCURZTkFNSUNfQkJfUFdSX1NBVkUJCQlCSVQoNykKLSNkZWZpbmUJCURZTkFNSUNfQkJfUFdSX1RSQUlOCQkJQklUKDgpCi0jZGVmaW5lCQlEWU5BTUlDX0JCX1JBVEVfQURBUFRJVkUJCUJJVCg5KQotI2RlZmluZQkJRFlOQU1JQ19CQl9QQVRIX0RJVgkJCUJJVCgxMCkKLSNkZWZpbmUJCURZTkFNSUNfQkJfUFNECQkJCUJJVCgxMSkKLQotLyogIE1BQyBETSBzZWN0aW9uIEJJVCAxNi0yMyAqLwotI2RlZmluZQkJRFlOQU1JQ19NQUNfc3RydWN0IGVkY2FfdHVyYm9VUkJPCQlCSVQoMTYpCi0jZGVmaW5lCQlEWU5BTUlDX01BQ19FQVJMWV9NT0RFCQlCSVQoMTcpCi0KLS8qICBSRiBPRE0gc2VjdGlvbiBCSVQgMjQtMzEgKi8KLSNkZWZpbmUJCURZTkFNSUNfUkZfVFhfUFdSX1RSQUNLCQlCSVQoMjQpCi0jZGVmaW5lCQlEWU5BTUlDX1JGX1JYX0dBSU5fVFJBQ0sJCUJJVCgyNSkKLSNkZWZpbmUJCURZTkFNSUNfUkZfQ0FMSUJSQVRJT04JCUJJVCgyNikKLQotI2RlZmluZQkJRFlOQU1JQ19BTExfRlVOQ19FTkFCTEUJCTB4RkZGRkZGRgotCi0jZGVmaW5lIF9IV19TVEFURV9OT0xJTktfCQkweDAwCi0jZGVmaW5lIF9IV19TVEFURV9BREhPQ18JCTB4MDEKLSNkZWZpbmUgX0hXX1NUQVRFX1NUQVRJT05fCTB4MDIKLSNkZWZpbmUgX0hXX1NUQVRFX0FQXwkJCTB4MDMKLQotCi0jZGVmaW5lCQlfMU1fUkFURV8JMAotI2RlZmluZQkJXzJNX1JBVEVfCTEKLSNkZWZpbmUJCV81TV9SQVRFXwkyCi0jZGVmaW5lCQlfMTFNX1JBVEVfCTMKLSNkZWZpbmUJCV82TV9SQVRFXwk0Ci0jZGVmaW5lCQlfOU1fUkFURV8JNQotI2RlZmluZQkJXzEyTV9SQVRFXwk2Ci0jZGVmaW5lCQlfMThNX1JBVEVfCTcKLSNkZWZpbmUJCV8yNE1fUkFURV8JOAotI2RlZmluZQkJXzM2TV9SQVRFXwk5Ci0jZGVmaW5lCQlfNDhNX1JBVEVfCTEwCi0jZGVmaW5lCQlfNTRNX1JBVEVfCTExCi0KLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgV01NX09VSTIzQVtdOwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgV1BTX09VSTIzQVtdOwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgV0ZEX09VSTIzQVtdOwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgUDJQX09VSTIzQVtdOwotCi1leHRlcm4gdW5zaWduZWQgY2hhciBXTU1fSU5GT19PVUkyM0FbXTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIFdNTV9QQVJBX09VSTIzQVtdOwotCi0KLS8qICAqLwotLyogIENoYW5uZWwgUGxhbiBUeXBlLiAqLwotLyogIE5vdGU6ICovCi0vKglXZSBqdXN0IGFkZCBuZXcgY2hhbm5lbCBwbGFuIHdoZW4gdGhlIG5ldyBjaGFubmVsIHBsYW4gaXMgZGlmZmVyZW50IGZyb20gYW55IG9mIHRoZSBmb2xsb3dpbmcgKi8KLS8qCWNoYW5uZWwgcGxhbi4gKi8KLS8qCUlmIHlvdSBqdXN0IHdhbnQgdG8gY3VzdG9taXplIHRoZSBhY3Rpb25zKHNjYW4gcGVyaW9kIG9yIGpvaW4gYWN0aW9ucykgYWJvdXQgb25lIG9mIHRoZSBjaGFubmVsIHBsYW4sICovCi0vKgljdXN0b21pemUgdGhlbSBpbiBzdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvIGluIHRoZSBSVF9DSEFOTkVMX0xJU1QuICovCi0vKiAgKi8KLWVudW0gIHsgLyogX1JUX0NIQU5ORUxfRE9NQUlOICovCi0JLyogIG9sZCBjaGFubmVsIHBsYW4gbWFwcGluZyA9PT09PSAqLwotCVJUX0NIQU5ORUxfRE9NQUlOX0ZDQyA9IDB4MDAsCi0JUlRfQ0hBTk5FTF9ET01BSU5fSUMgPSAweDAxLAotCVJUX0NIQU5ORUxfRE9NQUlOX0VUU0kgPSAweDAyLAotCVJUX0NIQU5ORUxfRE9NQUlOX1NQQUlOID0gMHgwMywKLQlSVF9DSEFOTkVMX0RPTUFJTl9GUkFOQ0UgPSAweDA0LAotCVJUX0NIQU5ORUxfRE9NQUlOX01LSyA9IDB4MDUsCi0JUlRfQ0hBTk5FTF9ET01BSU5fTUtLMSA9IDB4MDYsCi0JUlRfQ0hBTk5FTF9ET01BSU5fSVNSQUVMID0gMHgwNywKLQlSVF9DSEFOTkVMX0RPTUFJTl9URUxFQyA9IDB4MDgsCi0JUlRfQ0hBTk5FTF9ET01BSU5fR0xPQkFMX0RPQU1JTiA9IDB4MDksCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfV0lERV8xMyA9IDB4MEEsCi0JUlRfQ0hBTk5FTF9ET01BSU5fVEFJV0FOID0gMHgwQiwKLQlSVF9DSEFOTkVMX0RPTUFJTl9DSElOQSA9IDB4MEMsCi0JUlRfQ0hBTk5FTF9ET01BSU5fU0lOR0FQT1JFX0lORElBX01FWElDTyA9IDB4MEQsCi0JUlRfQ0hBTk5FTF9ET01BSU5fS09SRUEgPSAweDBFLAotCVJUX0NIQU5ORUxfRE9NQUlOX1RVUktFWSA9IDB4MEYsCi0JUlRfQ0hBTk5FTF9ET01BSU5fSkFQQU4gPSAweDEwLAotCVJUX0NIQU5ORUxfRE9NQUlOX0ZDQ19OT19ERlMgPSAweDExLAotCVJUX0NIQU5ORUxfRE9NQUlOX0pBUEFOX05PX0RGUyA9IDB4MTIsCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfV0lERV81RyA9IDB4MTMsCi0JUlRfQ0hBTk5FTF9ET01BSU5fVEFJV0FOX05PX0RGUyA9IDB4MTQsCi0KLQkvKiAgbmV3IGNoYW5uZWwgcGxhbiBtYXBwaW5nLCAoMkdET01BSU5fNUdET01BSU4pID09PT09ICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfTlVMTCA9IDB4MjAsCi0JUlRfQ0hBTk5FTF9ET01BSU5fRVRTSTFfTlVMTCA9IDB4MjEsCi0JUlRfQ0hBTk5FTF9ET01BSU5fRkNDMV9OVUxMID0gMHgyMiwKLQlSVF9DSEFOTkVMX0RPTUFJTl9NS0sxX05VTEwgPSAweDIzLAotCVJUX0NIQU5ORUxfRE9NQUlOX0VUU0kyX05VTEwgPSAweDI0LAotCVJUX0NIQU5ORUxfRE9NQUlOX0ZDQzFfRkNDMSA9IDB4MjUsCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfRVRTSTEgPSAweDI2LAotCVJUX0NIQU5ORUxfRE9NQUlOX01LSzFfTUtLMSA9IDB4MjcsCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfS0NDMSA9IDB4MjgsCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfRkNDMiA9IDB4MjksCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfRkNDMyA9IDB4MzAsCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfRkNDNCA9IDB4MzEsCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfRkNDNSA9IDB4MzIsCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfRkNDNiA9IDB4MzMsCi0JUlRfQ0hBTk5FTF9ET01BSU5fRkNDMV9GQ0M3ID0gMHgzNCwKLQlSVF9DSEFOTkVMX0RPTUFJTl9XT1JMRF9FVFNJMiA9IDB4MzUsCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfRVRTSTMgPSAweDM2LAotCVJUX0NIQU5ORUxfRE9NQUlOX01LSzFfTUtLMiA9IDB4MzcsCi0JUlRfQ0hBTk5FTF9ET01BSU5fTUtLMV9NS0szID0gMHgzOCwKLQlSVF9DSEFOTkVMX0RPTUFJTl9GQ0MxX05DQzEgPSAweDM5LAotCVJUX0NIQU5ORUxfRE9NQUlOX0ZDQzFfTkNDMiA9IDB4NDAsCi0JUlRfQ0hBTk5FTF9ET01BSU5fR0xPQkFMX0RPQU1JTl8yRyA9IDB4NDEsCi0JLyogIEFkZCBuZXcgY2hhbm5lbCBwbGFuIGFib3ZlIHRoaXMgbGluZT09PT09PT09PT09PT09PSAqLwotCVJUX0NIQU5ORUxfRE9NQUlOX01BWCwKLQlSVF9DSEFOTkVMX0RPTUFJTl9SRUFMVEVLX0RFRklORSA9IDB4N0YsCi19OwotCi1lbnVtIHsgLyogX1JUX0NIQU5ORUxfRE9NQUlOXzJHICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fMkdfV09STEQgPSAweDAwLAkJLyogV29ybGR3aXJkIDEzICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fMkdfRVRTSTEgPSAweDAxLAkJLyogRXVyb3BlICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fMkdfRkNDMSA9IDB4MDIsCQkvKiBVUyAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzJHX01LSzEgPSAweDAzLAkJLyogSmFwYW4gKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl8yR19FVFNJMiA9IDB4MDQsCQkvKiBGcmFuY2UgKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl8yR19OVUxMID0gMHgwNSwKLQkvKiAgQWRkIG5ldyBjaGFubmVsIHBsYW4gYWJvdmUgdGhpcyBsaW5lPT09PT09PT09PT09PT09ICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fMkdfTUFYLAotfTsKLQotZW51bSB7IC8qIF9SVF9DSEFOTkVMX0RPTUFJTl81RyAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX05VTEwgPSAweDAwLAotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX0VUU0kxID0gMHgwMSwJCS8qIEV1cm9wZSAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX0VUU0kyID0gMHgwMiwJCS8qIEF1c3RyYWxpYSwgTmV3IFplYWxhbmQgKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl81R19FVFNJMyA9IDB4MDMsCQkvKiBSdXNzaWEgKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0MxID0gMHgwNCwJCS8qIFVTICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDMiA9IDB4MDUsCQkvKiBGQ0Mgby93IERGUyBDaGFubmVscyAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQzMgPSAweDA2LAkJLyogSW5kaWEsIE1leGljbyAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQzQgPSAweDA3LAkJLyogVmVuZXp1ZWxhICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDNSA9IDB4MDgsCQkvKiBDaGluYSAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQzYgPSAweDA5LAkJLyogSXNyYWVsICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDN19JQzEgPSAweDBBLAkvKiBVUywgQ2FuYWRhICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfS0NDMSA9IDB4MEIsCQkvKiBLb3JlYSAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX01LSzEgPSAweDBDLAkJLyogSmFwYW4gKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl81R19NS0syID0gMHgwRCwJCS8qIEphcGFuIChXNTIsIFc1MykgKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl81R19NS0szID0gMHgwRSwJCS8qIEphcGFuIChXNTYpICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfTkNDMSA9IDB4MEYsCQkvKiBUYWl3YW4gKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl81R19OQ0MyID0gMHgxMCwJCS8qIFRhaXdhbiBvL3cgREZTICovCi0JLyogIEFkZCBuZXcgY2hhbm5lbCBwbGFuIGFib3ZlIHRoaXMgbGluZT09PT09PT09PT09PT09PSAqLwotCS8qICBEcml2ZXIgU2VsZiBEZWZpbmVkID09PT09ICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDID0gMHgxMSwKLQlSVF9DSEFOTkVMX0RPTUFJTl81R19KQVBBTl9OT19ERlMgPSAweDEyLAotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQzRfTk9fREZTID0gMHgxMywKLQlSVF9DSEFOTkVMX0RPTUFJTl81R19NQVgsCi19OwotCi0jZGVmaW5lIHJ0d19pc19jaGFubmVsX3BsYW5fdmFsaWQoY2hwbGFuKSAoY2hwbGFuPFJUX0NIQU5ORUxfRE9NQUlOX01BWCB8fCBjaHBsYW4gPT0gUlRfQ0hBTk5FTF9ET01BSU5fUkVBTFRFS19ERUZJTkUpCi0KLXN0cnVjdCBydF9jaGFubmVsX3BsYW4gewotCXVuc2lnbmVkIGNoYXIJQ2hhbm5lbFtNQVhfQ0hBTk5FTF9OVU1dOwotCXVuc2lnbmVkIGNoYXIJTGVuOwotfTsKLQotc3RydWN0IHJ0X2NoYW5uZWxfcGxhbl8yZyB7Ci0JdW5zaWduZWQgY2hhcglDaGFubmVsW01BWF9DSEFOTkVMX05VTV8yR107Ci0JdW5zaWduZWQgY2hhcglMZW47Ci19OwotCi1zdHJ1Y3QgcnRfY2hhbm5lbF9wbGFuXzVnIHsKLQl1bnNpZ25lZCBjaGFyCUNoYW5uZWxbTUFYX0NIQU5ORUxfTlVNXzVHXTsKLQl1bnNpZ25lZCBjaGFyCUxlbjsKLX07Ci0KLXN0cnVjdCBydF9jaGFubmVsX3BsYW5fbWFwIHsKLQl1bnNpZ25lZCBjaGFyCUluZGV4Mkc7Ci0JdW5zaWduZWQgY2hhcglJbmRleDVHOwotfTsKLQotZW51bSBBc3NvY2lhdGVkX0FQIHsKLQlhdGhlcm9zQVAJPSAwLAotCWJyb2FkY29tQVAJPSAxLAotCWNpc2NvQVAJCT0gMiwKLQltYXJ2ZWxsQVAJPSAzLAotCXJhbGlua0FQCT0gNCwKLQlyZWFsdGVrQVAJPSA1LAotCWFpcmdvY2FwQVAJPSA2LAotCXVua25vd25BUAk9IDcsCi0JbWF4QVAsCi19OwotCi1lbnVtIHsgLyogSFRfSU9UX1BFRVJfRSAqLwotCUhUX0lPVF9QRUVSX1VOS05PV04JCT0gMCwKLQlIVF9JT1RfUEVFUl9SRUFMVEVLCQk9IDEsCi0JSFRfSU9UX1BFRVJfUkVBTFRFS185MlNFCT0gMiwKLQlIVF9JT1RfUEVFUl9CUk9BRENPTQkJPSAzLAotCUhUX0lPVF9QRUVSX1JBTElOSwkJPSA0LAotCUhUX0lPVF9QRUVSX0FUSEVST1MJCT0gNSwKLQlIVF9JT1RfUEVFUl9DSVNDTwkJPSA2LAotCUhUX0lPVF9QRUVSX01FUlUJCT0gNywKLQlIVF9JT1RfUEVFUl9NQVJWRUxMCQk9IDgsCi0JSFRfSU9UX1BFRVJfUkVBTFRFS19TT0ZUQVAJPSA5LC8qICBwZWVyIGlzIFJlYWxUZWsgU09GVF9BUCwgYnkgQm9obiwgMjAwOS4xMi4xNyAqLwotCUhUX0lPVF9QRUVSX1NFTEZfU09GVEFQCQk9IDEwLCAvKiAgU2VsZiBpcyBTb2Z0QVAgKi8KLQlIVF9JT1RfUEVFUl9BSVJHTwkJPSAxMSwKLQlIVF9JT1RfUEVFUl9JTlRFTAkJPSAxMiwKLQlIVF9JT1RfUEVFUl9SVEtfQVBDTElFTlQJPSAxMywKLQlIVF9JT1RfUEVFUl9SRUFMVEVLXzgxWFgJPSAxNCwKLQlIVF9JT1RfUEVFUl9SRUFMVEVLX1dPVwkJPSAxNSwKLQlIVF9JT1RfUEVFUl9URU5EQQkJPSAxNiwKLQlIVF9JT1RfUEVFUl9NQVgJCQk9IDE3Ci19OwotCi1lbnVtIFNDQU5fU1RBVEUgewotCVNDQU5fRElTQUJMRSA9IDAsCi0JU0NBTl9TVEFSVCA9IDEsCi0JU0NBTl9UWE5VTEwgPSAyLAotCVNDQU5fUFJPQ0VTUyA9IDMsCi0JU0NBTl9DT01QTEVURSA9IDQsCi0JU0NBTl9TVEFURV9NQVgsCi19OwotCi1zdHJ1Y3QgbWxtZV9oYW5kbGVyIHsKLQljaGFyICpzdHI7Ci0JaW50ICgqZnVuYykoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLX07Ci0KLXN0cnVjdCBhY3Rpb25faGFuZGxlciB7Ci0JdW5zaWduZWQgaW50ICAgbnVtOwotCWNoYXIgKnN0cjsKLQlpbnQgKCpmdW5jKShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotfTsKLQotc3RydWN0CXNzX3JlcyB7Ci0JaW50CXN0YXRlOwotCWludAlic3NfY250OwotCWludAljaGFubmVsX2lkeDsKLQlpbnQJc2Nhbl9tb2RlOwotCXU4IHNzaWRfbnVtOwotCXU4IGNoX251bTsKLQlzdHJ1Y3QgY2ZnODAyMTFfc3NpZCBzc2lkW1JUV19TU0lEX1NDQU5fQU1PVU5UXTsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9jaGFubmVsIGNoW1JUV19DSEFOTkVMX1NDQU5fQU1PVU5UXTsKLX07Ci0KLSNkZWZpbmUJV0lGSV9GV19BVVRIX05VTEwJCQkweDAwMDAwMTAwCi0jZGVmaW5lCVdJRklfRldfQVVUSF9TVEFURQkJCTB4MDAwMDAyMDAKLSNkZWZpbmUJV0lGSV9GV19BVVRIX1NVQ0NFU1MJCQkweDAwMDAwNDAwCi0KLSNkZWZpbmUJV0lGSV9GV19BU1NPQ19TVEFURQkJCTB4MDAwMDIwMDAKLSNkZWZpbmUJV0lGSV9GV19BU1NPQ19TVUNDRVNTCQkweDAwMDA0MDAwCi0KLSNkZWZpbmUJV0lGSV9GV19MSU5LSU5HX1NUQVRFCQkoV0lGSV9GV19BVVRIX05VTEwgfCBXSUZJX0ZXX0FVVEhfU1RBVEUgfCBXSUZJX0ZXX0FVVEhfU1VDQ0VTUyB8V0lGSV9GV19BU1NPQ19TVEFURSkKLQotc3RydWN0IEZXX1N0YV9JbmZvIHsKLQlzdHJ1Y3Qgc3RhX2luZm8JKnBzdGE7Ci0JdTMyCXN0YXR1czsKLQl1MzIJcnhfcGt0OwotCXUzMglyZXRyeTsKLQl1bnNpZ25lZCBjaGFyIFN1cHBvcnRlZFJhdGVzW05ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWF07Ci19OwotCi0vKgotICogVXNhZ2U6Ci0gKiBXaGVuIG9uZSBpZmFjZSBhY3RlZCBhcyBBUCBtb2RlIGFuZCB0aGUgb3RoZXIgaWZhY2UgaXMgU1RBIG1vZGUgYW5kIHNjYW5uaW5nLAotICogaXQgc2hvdWxkIHN3aXRjaCBiYWNrIHRvIEFQJ3Mgb3BlcmF0aW5nIGNoYW5uZWwgcGVyaW9kaWNhbGx5LgotICogUGFyYW1ldGVycyBpbmZvOgotICogV2hlbiB0aGUgZHJpdmVyIHNjYW5uZWQgUlRXX1NDQU5fTlVNX09GX0NIIGNoYW5uZWxzLCBpdCB3b3VsZCBzd2l0Y2ggYmFjayB0byBBUCdzIG9wZXJhdGluZyBjaGFubmVsIGZvcgotICogUlRXX1NUQVlfQVBfQ0hfTUlMTElTRUNPTkQgKiBTVVJWRVlfVE8gbWlsbGlzZWNvbmRzLgotICogRXhhbXBsZToKLSAqIEZvciBjaGlwIHN1cHBvcnRzIDIuNEcgKyA1R0h6IGFuZCBBUCBtb2RlIGlzIG9wZXJhdGluZyBpbiBjaGFubmVsIDEsCi0gKiBSVFdfU0NBTl9OVU1fT0ZfQ0ggaXMgOCwgUlRXX1NUQVlfQVBfQ0hfTUlMTElTRUNPTkQgaXMgMyBhbmQgU1VSVkVZX1RPIGlzIDEwMC4KLSAqIFdoZW4gaXQncyBTVEEgbW9kZSBnZXRzIHNldF9zY2FuIGNvbW1hbmQsCi0gKiBpdCB3b3VsZAotICogMS4gRG9pbmcgdGhlIHNjYW4gb24gY2hhbm5lbCAxLjIuMy40LjUuNi43LjgKLSAqIDIuIEJhY2sgdG8gY2hhbm5lbCAxIGZvciAzMDAgbWlsbGlzZWNvbmRzCi0gKiAzLiBHbyB0aHJvdWdoIGRvaW5nIHNpdGUgc3VydmV5IG9uIGNoYW5uZWwgOS4xMC4xMS4zNi40MC40NC40OC41MgotICogNC4gQmFjayB0byBjaGFubmVsIDEgZm9yIDMwMCBtaWxsaXNlY29uZHMKLSAqIDUuIC4uLiBhbmQgc28gb24sIHRpbGwgc3VydmV5IGRvbmUuCi0gKi8KLQotc3RydWN0IG1sbWVfZXh0X2luZm8gewotCXUzMglzdGF0ZTsKLQl1MzIJcmVhdXRoX2NvdW50OwotCXUzMglyZWFzc29jX2NvdW50OwotCXUzMglsaW5rX2NvdW50OwotCXUzMglhdXRoX3NlcTsKLQl1MzIJYXV0aF9hbGdvOwkvKiAgODAyLjExIGF1dGgsIGNvdWxkIGJlIG9wZW4sIHNoYXJlZCwgYXV0byAqLwotCXUzMglhdXRoTW9kZVRvZ2dsZTsKLQl1MzIJZW5jX2FsZ287LyogZW5jcnlwdCBhbGdvcml0aG07ICovCi0JdTMyCWtleV9pbmRleDsJLyogIHRoaXMgaXMgb25seSB2YWxpZCBmb3IgbGVnZW5kYXJ5IHdlcCwgMH4zIGZvciBrZXkgaWQuICovCi0JdTMyCWl2OwotCXU4CWNoZ190eHRbMTI4XTsKLQl1MTYJYWlkOwotCXUxNgliY25faW50ZXJ2YWw7Ci0JdTE2CWNhcGFiaWxpdHk7Ci0JdTgJYXNzb2NfQVBfdmVuZG9yOwotCXU4CXNsb3RUaW1lOwotCXU4CXByZWFtYmxlX21vZGU7Ci0JdTgJV01NX2VuYWJsZTsKLQl1OAlFUlBfZW5hYmxlOwotCXU4CUVSUF9JRTsKLQl1OAlIVF9lbmFibGU7Ci0JdTgJSFRfY2Fwc19lbmFibGU7Ci0JdTgJSFRfaW5mb19lbmFibGU7Ci0JdTgJSFRfcHJvdGVjdGlvbjsKLQl1OAl0dXJib01vZGVfY3RzMnNlbGY7Ci0JdTgJdHVyYm9Nb2RlX3J0c2VuOwotCXU4CVNNX1BTOwotCXU4CUFEREJBX3JldHJ5X2NvdW50OwotCXU4CWRpYWxvZ1Rva2VuOwotCS8qICBBY2NlcHQgQUREQkEgUmVxdWVzdCAqLwotCWJvb2wgYkFjY2VwdEFkZGJhUmVxOwotCXU4CWJ3bW9kZV91cGRhdGVkOwotCXU4CWhpZGRlbl9zc2lkX21vZGU7Ci0KLQlzdHJ1Y3QgQUREQkFfcmVxdWVzdAkJQUREQkFfcmVxOwotCXN0cnVjdCBXTU1fcGFyYV9lbGVtZW50CVdNTV9wYXJhbTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodF9jYXA7Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24gSFRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leAkJCW5ldHdvcms7Lyogam9pbiBuZXR3b3JrIG9yIGJzc19uZXR3b3JrLCBpZiBpbiBhcCBtb2RlLCBpdCBpcyB0aGUgc2FtZSB0byBjdXJfbmV0d29yay5uZXR3b3JrICovCi0Jc3RydWN0IEZXX1N0YV9JbmZvCQlGV19zdGFfaW5mb1tOVU1fU1RBXTsKLX07Ci0KLS8qICBUaGUgY2hhbm5lbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNoYW5uZWwgaW5jbHVkaW5nIGpvaW5pbmcsIHNjYW5uaW5nLCBhbmQgcG93ZXIgY29uc3RyYWludHMuICovCi1zdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvIHsKLQl1OAkJQ2hhbm5lbE51bTsJCS8qICBUaGUgY2hhbm5lbCBudW1iZXIuICovCi0JZW51bSBydF9zY2FuX3R5cGUgU2NhblR5cGU7CQkvKiAgU2NhbiB0eXBlIHN1Y2ggYXMgcGFzc2l2ZSBvciBhY3RpdmUgc2Nhbi4gKi8KLX07Ci0KLWludCBydHdfY2hfc2V0X3NlYXJjaF9jaDIzYShzdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvICpjaF9zZXQsIGNvbnN0IHUzMiBjaCk7Ci0KLS8qICBQMlBfTUFYX1JFR19DTEFTU0VTIC0gTWF4aW11bSBudW1iZXIgb2YgcmVndWxhdG9yeSBjbGFzc2VzICovCi0jZGVmaW5lIFAyUF9NQVhfUkVHX0NMQVNTRVMgMTAKLQotLyogIFAyUF9NQVhfUkVHX0NMQVNTX0NIQU5ORUxTIC0gTWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgcGVyIHJlZ3VsYXRvcnkgY2xhc3MgKi8KLSNkZWZpbmUgUDJQX01BWF9SRUdfQ0xBU1NfQ0hBTk5FTFMgMjAKLQotLyogICBzdHJ1Y3QgcDJwX2NoYW5uZWxzIC0gTGlzdCBvZiBzdXBwb3J0ZWQgY2hhbm5lbHMgKi8KLXN0cnVjdCBwMnBfY2hhbm5lbHMgewotCS8qICBzdHJ1Y3QgcDJwX3JlZ19jbGFzcyAtIFN1cHBvcnRlZCByZWd1bGF0b3J5IGNsYXNzICovCi0Jc3RydWN0IHAycF9yZWdfY2xhc3MgewotCQkvKiAgcmVnX2NsYXNzIC0gUmVndWxhdG9yeSBjbGFzcyAoSUVFRSA4MDIuMTEtMjAwNywgQW5uZXggSikgKi8KLQkJdTggcmVnX2NsYXNzOwotCi0JCS8qICBjaGFubmVsIC0gU3VwcG9ydGVkIGNoYW5uZWxzICovCi0JCXU4IGNoYW5uZWxbUDJQX01BWF9SRUdfQ0xBU1NfQ0hBTk5FTFNdOwotCi0JCS8qICBjaGFubmVscyAtIE51bWJlciBvZiBjaGFubmVsIGVudHJpZXMgaW4gdXNlICovCi0JCXNpemVfdCBjaGFubmVsczsKLQl9IHJlZ19jbGFzc1tQMlBfTUFYX1JFR19DTEFTU0VTXTsKLQotCS8qICByZWdfY2xhc3NlcyAtIE51bWJlciBvZiByZWdfY2xhc3MgZW50cmllcyBpbiB1c2UgKi8KLQlzaXplX3QgcmVnX2NsYXNzZXM7Ci19OwotCi1zdHJ1Y3QgcDJwX29wZXJfY2xhc3NfbWFwIHsKLQllbnVtIGh3X21vZGUge0lFRUU4MDIxMUcsIElFRUU4MDIxMUF9IG1vZGU7Ci0JdTggb3BfY2xhc3M7Ci0JdTggbWluX2NoYW47Ci0JdTggbWF4X2NoYW47Ci0JdTggaW5jOwotCWVudW0gewotCQlCVzIwLCBCVzQwUExVUywgQlc0ME1JTlVTCi0JfSBidzsKLX07Ci0KLXN0cnVjdCBtbG1lX2V4dF9wcml2IHsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIJKnBhZGFwdGVyOwotCXU4CW1sbWVleHRfaW5pdDsKLQlhdG9taWNfdAkJZXZlbnRfc2VxOwotCXUxNgltZ250X3NlcTsKLQotCS8qIHN0cnVjdCBmd19wcml2CWZ3cHJpdjsgKi8KLQotCXVuc2lnbmVkIGNoYXIJY3VyX2NoYW5uZWw7Ci0JdW5zaWduZWQgY2hhcgljdXJfYndtb2RlOwotCXVuc2lnbmVkIGNoYXIJY3VyX2NoX29mZnNldDsvKiBQUklNRV9DSE5MX09GRlNFVCAqLwotCXVuc2lnbmVkIGNoYXIJY3VyX3dpcmVsZXNzX21vZGU7CS8qICBORVRXT1JLX1RZUEUgKi8KLQotCXVuc2lnbmVkIGNoYXIJbWF4X2NoYW5fbnVtczsKLQlzdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvCQljaGFubmVsX3NldFtNQVhfQ0hBTk5FTF9OVU1dOwotCXN0cnVjdCBwMnBfY2hhbm5lbHMgY2hhbm5lbF9saXN0OwotCXVuc2lnbmVkIGNoYXIJYmFzaWNyYXRlW051bVJhdGVzXTsKLQl1bnNpZ25lZCBjaGFyCWRhdGFyYXRlW051bVJhdGVzXTsKLQotCXN0cnVjdCBzc19yZXMJCXNpdGVzdXJ2ZXlfcmVzOwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvCW1sbWV4dF9pbmZvOy8qIGZvciBzdGEvYWRob2MgbW9kZSwgaW5jbHVkaW5nIGN1cnJlbnQgc2Nhbm5pbmcvY29ubmVjdGluZy9jb25uZWN0ZWQgcmVsYXRlZCBpbmZvLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgYXAgbW9kZSwgbmV0d29yayBpbmNsdWRlcyBhcCdzIGNhcF9pbmZvICovCi0Jc3RydWN0IHRpbWVyX2xpc3QJCXN1cnZleV90aW1lcjsKLQlzdHJ1Y3QgdGltZXJfbGlzdAkJbGlua190aW1lcjsKLQl1MTYJCQljaGFuX3NjYW5fdGltZTsKLQotCXU4CXNjYW5fYWJvcnQ7Ci0JdTgJdHhfcmF0ZTsgLyogIFRYUkFURSB3aGVuIFVTRVJBVEUgaXMgc2V0LiAqLwotCi0JdTMyCXJldHJ5OyAvKiByZXRyeSBmb3IgaXNzdWUgcHJvYmVyZXEgKi8KLQotCXU2NCBUU0ZWYWx1ZTsKLQotCXVuc2lnbmVkIGNoYXIgYnN0YXJ0X2JzczsKLQl1OCB1cGRhdGVfY2hhbm5lbF9wbGFuX2J5X2FwX2RvbmU7Ci0JLyogcmVjdl9kZWNhY2hlIGNoZWNrIGZvciBBY3Rpb25fcHVibGljIGZyYW1lICovCi0JdTggYWN0aW9uX3B1YmxpY19kaWFsb2dfdG9rZW47Ci0JdTE2CSBhY3Rpb25fcHVibGljX3J4c2VxOwotCXU4IGFjdGl2ZV9rZWVwX2FsaXZlX2NoZWNrOwotfTsKLQotaW50IGluaXRfbWxtZV9leHRfcHJpdjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWludCBpbml0X2h3X21sbWVfZXh0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBmcmVlX21sbWVfZXh0X3ByaXYyM2EgKHN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCk7Ci12b2lkIGluaXRfbWxtZV9leHRfdGltZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIGluaXRfYWRkYmFfcmV0cnlfdGltZXIyM2Eoc3RydWN0IHN0YV9pbmZvICpwc3RhKTsKLXN0cnVjdCB4bWl0X2ZyYW1lICphbGxvY19tZ3R4bWl0ZnJhbWUyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KTsKLQotdW5zaWduZWQgY2hhciBuZXR3b3JrdHlwZV90b19yYWlkMjNhKHVuc2lnbmVkIGNoYXIgbmV0d29ya190eXBlKTsKLXU4IGp1ZGdlX25ldHdvcmtfdHlwZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpyYXRlLAotCQkgICAgICBpbnQgcmF0ZWxlbik7Ci12b2lkIGdldF9yYXRlX3NldDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpwYnNzcmF0ZSwKLQkJICBpbnQgKmJzc3JhdGVfbGVuKTsKLXZvaWQgVXBkYXRlQnJhdGVUYmwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKm1CcmF0ZXNPUyk7Ci12b2lkIFVwZGF0ZTIzYVRibEZvclNvZnRBUCh1OCAqYnNzcmF0ZXNldCwgdTMyIGJzc3JhdGVsZW4pOwotCi11OCBydHdfZ2V0X29wZXJfY2gyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgcnR3X3NldF9vcGVyX2NoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTggY2gpOwotdm9pZCBydHdfc2V0X29wZXJfYncyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1OCBidyk7Ci12b2lkIHJ0d19zZXRfb3Blcl9jaDIzYW9mZnNldDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IG9mZnNldCk7Ci0KLXZvaWQgc2V0X2NoYW5uZWxfYndtb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgY2hhbm5lbCwKLQkJCXVuc2lnbmVkIGNoYXIgY2hhbm5lbF9vZmZzZXQsIHVuc2lnbmVkIHNob3J0IGJ3bW9kZSk7Ci12b2lkIFNlbGVjdENoYW5uZWwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciBjaGFubmVsKTsKLQotdW5zaWduZWQgaW50IGRlY2lkZV93YWl0X2Zvcl9iZWFjb25fdGltZW91dDIzYSh1bnNpZ25lZCBpbnQgYmNuX2ludGVydmFsKTsKLQotdm9pZCBjbGVhcl9jYW1fZW50cnkyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggZW50cnkpOwotCi12b2lkIGludmFsaWRhdGVfY2FtX2FsbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotaW50IGFsbG9jYXRlX2Z3X3N0YV9lbnRyeTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgZmx1c2hfYWxsX2NhbV9lbnRyeTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotYm9vbCBJc0xlZ2FsNUdDaGFubmVsKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTggY2hhbm5lbCk7Ci0KLXZvaWQgdXBkYXRlX25ldHdvcmsyM2Eoc3RydWN0IHdsYW5fYnNzaWRfZXggKmRzdCwgc3RydWN0IHdsYW5fYnNzaWRfZXggKnNyYywKLQkJICAgIHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGJvb2wgdXBkYXRlX2llKTsKLQotdTggKmdldF9teV9ic3NpZDIzYShzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmspOwotCi1ib29sIGlzX2NsaWVudF9hc3NvY2lhdGVkX3RvX2FwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotYm9vbCBpc19jbGllbnRfYXNzb2NpYXRlZF90b19pYnNzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotYm9vbCBpc19JQlNTX2VtcHR5MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi11bnNpZ25lZCBjaGFyIGNoZWNrX2Fzc29jX0FQMjNhKHU4ICpwZnJhbWUsIHVpbnQgbGVuKTsKLQotaW50IFdNTV9wYXJhbV9oYW5kbGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwKTsKLXZvaWQgV01NT25Bc3NvY1JzcDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotdm9pZCBIVF9jYXBzX2hhbmRsZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnApOwotdm9pZCBIVF9pbmZvX2hhbmRsZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnApOwotdm9pZCBIVE9uQXNzb2NSc3AyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgRVJQX0lFX2hhbmRsZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnApOwotdm9pZCBWQ1NfdXBkYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci0KLXZvaWQgdXBkYXRlX2JlYWNvbjIzYV9pbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsIHVpbnQgbGVuLAotCQkJICAgc3RydWN0IHN0YV9pbmZvICpwc3RhKTsKLWludCBydHdfY2hlY2tfYmNuX2luZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsIHUzMiBwYWNrZXRfbGVuKTsKLXZvaWQgdXBkYXRlX0lPVF9pbmZvMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCB1cGRhdGVfY2FwaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHUxNiB1cGRhdGVDYXApOwotdm9pZCB1cGRhdGVfd2lyZWxlc3NfbW9kZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgdXBkYXRlX3R4X2Jhc2ljX3JhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbW9kdWxhdGlvbik7Ci12b2lkIHVwZGF0ZV9ibWNfc3RhX3N1cHBvcnRfcmF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgbWFjX2lkKTsKLWludCB1cGRhdGVfc3RhX3N1cHBvcnRfcmF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcHZhcl9pZSwKLQkJCSAgICB1aW50IHZhcl9pZV9sZW4sIGludCBjYW1faWR4KTsKLQotLyogZm9yIHN0YS9hZGhvYyBtb2RlICovCi12b2lkIHVwZGF0ZV9zdGFfaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpOwotdW5zaWduZWQgaW50IHVwZGF0ZV9iYXNpY19yYXRlMjNhKHVuc2lnbmVkIGNoYXIgKnB0biwgdW5zaWduZWQgaW50IHB0bl9zeik7Ci11bnNpZ25lZCBpbnQgdXBkYXRlX3N1cHBvcnRlZF9yYXRlMjNhKHVuc2lnbmVkIGNoYXIgKnB0biwgdW5zaWduZWQgaW50IHB0bl9zeik7Ci11bnNpZ25lZCBpbnQgdXBkYXRlX01TQ19yYXRlMjNhKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXApOwotdm9pZCBVcGRhdGVfUkFfRW50cnkyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKTsKLXZvaWQgc2V0X3N0YV9yYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci0KLWludCByZWNlaXZlX2Rpc2Nvbm5lY3QyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgdW5zaWduZWQgY2hhciAqTWFjQWRkciwgdW5zaWduZWQgc2hvcnQgcmVhc29uKTsKLQotdW5zaWduZWQgY2hhciBnZXRfaGlnaGVzdF9yYXRlX2lkeDIzYSh1MzIgbWFzayk7Ci1pbnQgc3VwcG9ydF9zaG9ydF9HSTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcCk7Ci1ib29sIGlzX2FwX2luX3RraXAyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1ib29sIGlzX2FwX2luX3dlcDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWJvb2wgc2hvdWxkX2ZvcmJpZF9uX3JhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcmVwb3J0X2pvaW5fcmVzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGludCByZXMpOwotdm9pZCByZXBvcnRfc3VydmV5X2V2ZW50MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXZvaWQgcmVwb3J0X3N1cnZleWRvbmVfZXZlbnQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJlcG9ydF9kZWxfc3RhX2V2ZW50MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgIHVuc2lnbmVkIGNoYXIgKk1hY0FkZHIsIHVuc2lnbmVkIHNob3J0IHJlYXNvbik7Ci12b2lkIHJlcG9ydF9hZGRfc3RhX2V2ZW50MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgIHVuc2lnbmVkIGNoYXIgKk1hY0FkZHIsIGludCBjYW1faWR4KTsKLQotaW50IHNldF90eF9iZWFjb25fY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlcipwYWRhcHRlcik7Ci11bnNpZ25lZCBpbnQgc2V0dXBfYmVhY29uX2ZyYW1lKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJdW5zaWduZWQgY2hhciAqYmVhY29uX2ZyYW1lKTsKLXZvaWQgdXBkYXRlX21nbnRfdHhfcmF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCByYXRlKTsKLXZvaWQgdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIpOwotdm9pZCBkdW1wX21nbnRmcmFtZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWUpOwotczMyIGR1bXBfbWdudGZyYW1lMjNhX2FuZF93YWl0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWUsIGludCB0aW1lb3V0X21zKTsKLXMzMiBkdW1wX21nbnRmcmFtZTIzYV9hbmRfd2FpdF9hY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZSk7Ci0KLXZvaWQgaXNzdWVfYmVhY29uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGludCB0aW1lb3V0X21zKTsKLWludCBpc3N1ZV9udWxsZGF0YTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpkYSwKLQkJICAgdW5zaWduZWQgaW50IHBvd2VyX21vZGUsIGludCB0cnlfY250LCBpbnQgd2FpdF9tcyk7Ci1pbnQgaXNzdWVfcW9zX251bGxkYXRhMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhLCB1MTYgdGlkLAotCQkgICAgICAgaW50IHRyeV9jbnQsIGludCB3YWl0X21zKTsKLWludCBpc3N1ZV9kZWF1dGgyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqZGEsCi0JCSB1bnNpZ25lZCBzaG9ydCByZWFzb24pOwotdm9pZCBpc3N1ZV9hY3Rpb25fc3BjdF9jaF9zd2l0Y2gyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnJhLAotCQkJCSB1OCBuZXdfY2gsIHU4IGNoX29mZnNldCk7Ci12b2lkIGlzc3VlX2FjdGlvbl9CQTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJY29uc3QgdW5zaWduZWQgY2hhciAqcmFkZHIsCi0JCQl1bnNpZ25lZCBjaGFyIGFjdGlvbiwgdW5zaWduZWQgc2hvcnQgc3RhdHVzKTsKLWludCBzZW5kX2RlbGJhMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGluaXRpYXRvciwgdTggKmFkZHIpOwotaW50IHNlbmRfYmVhY29uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIG1sbWVleHRfam9pbmJzc19ldmVudF9jYWxsYmFjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBpbnQgam9pbl9yZXMpOwotdm9pZCBtbG1lZXh0X3N0YV9kZWxfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIG1sbWVleHRfc3RhX2FkZF9ldmVudF9jYWxsYmFjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpOwotCi12b2lkIGxpbmtlZF9zdGF0dXNfY2hrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0jZGVmaW5lIHNldF9zdXJ2ZXlfdGltZXIobWxtZWV4dCwgbXMpIFwKLQkvKkRCR184NzIzQSgiJXMgc2V0X3N1cnZleV90aW1lciglcCwgJWQpXG4iLCBfX2Z1bmNfXywgKG1sbWVleHQpLCAobXMpKTsqLyBcCi0JbW9kX3RpbWVyKCZtbG1lZXh0LT5zdXJ2ZXlfdGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKG1zKSk7Ci0KLSNkZWZpbmUgc2V0X2xpbmtfdGltZXIobWxtZWV4dCwgbXMpIFwKLQkvKkRCR184NzIzQSgiJXMgc2V0X2xpbmtfdGltZXIoJXAsICVkKVxuIiwgX19mdW5jX18sIChtbG1lZXh0KSwgKG1zKSk7Ki8gXAotCW1vZF90aW1lcigmbWxtZWV4dC0+bGlua190aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMobXMpKTsKLQotaW50IGNja3JhdGVzX2luY2x1ZGVkMjNhKHVuc2lnbmVkIGNoYXIgKnJhdGUsIGludCByYXRlbGVuKTsKLWludCBjY2tyYXRlc29ubHlfaW5jbHVkZWQyM2EodW5zaWduZWQgY2hhciAqcmF0ZSwgaW50IHJhdGVsZW4pOwotCi12b2lkIHByb2Nlc3NfYWRkYmFfcmVxMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwYWRkYmFfcmVxLCB1OCAqYWRkcik7Ci0KLXZvaWQgY29ycmVjdF9UU0YyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0KTsKLQotc3RydWN0IGNtZF9oZGwgewotCXVpbnQJcGFybXNpemU7Ci0JaW50ICgqaDJjZnVucykoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotfTsKLQotCi1pbnQgcmVhZF9tYWNyZWdfaGRsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwYnVmKTsKLWludCB3cml0ZV9tYWNyZWdfaGRsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwYnVmKTsKLWludCByZWFkX2JicmVnX2hkbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcGJ1Zik7Ci1pbnQgd3JpdGVfYmJyZWdfaGRsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwYnVmKTsKLWludCByZWFkX3JmcmVnX2hkbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcGJ1Zik7Ci1pbnQgd3JpdGVfcmZyZWdfaGRsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwYnVmKTsKLQotCi1pbnQgTlVMTF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IGpvaW5fY21kX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci1pbnQgZGlzY29ubmVjdF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IGNyZWF0ZWJzc19oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IHNldG9wbW9kZV9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IHNpdGVzdXJ2ZXlfY21kX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci1pbnQgc2V0YXV0aF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IHNldGtleV9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IHNldF9zdGFrZXlfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBzZXRfYXNzb2NzdGFfaGRsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBkZWxfYXNzb2NzdGFfaGRsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBhZGRfYmFfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLQotaW50IG1sbWVfZXZ0X2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci1pbnQgaDJjX21zZ19oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IHR4X2JlYWNvbl9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IHNldF9jaF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IHNldF9jaHBsYW5faGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBsZWRfYmxpbmtfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBzZXRfY3NhX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7CS8qIEt1cnQ6IEhhbmRsaW5nIERGUyBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgaWUuICovCi1pbnQgdGRsc19oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotCi0jZGVmaW5lIEdFTl9EUlZfQ01EX0hBTkRMRVIoc2l6ZSwgY21kKQl7c2l6ZSwgJmNtZCAjIyBfaGRsMjNhfSwKLSNkZWZpbmUgR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZSwgY21kKQl7c2l6ZSwgY21kfSwKLQotc3RydWN0IEMySEV2ZW50X0hlYWRlciB7Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0KLQl1bnNpZ25lZCBpbnQgbGVuOjE2OwotCXVuc2lnbmVkIGludCBJRDo4OwotCXVuc2lnbmVkIGludCBzZXE6ODsKLQotI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0KLQl1bnNpZ25lZCBpbnQgc2VxOjg7Ci0JdW5zaWduZWQgaW50IElEOjg7Ci0JdW5zaWduZWQgaW50IGxlbjoxNjsKLQotI2Vsc2UKLQotIyAgZXJyb3IgIk11c3QgYmUgTElUVExFIG9yIEJJRyBFbmRpYW4iCi0KLSNlbmRpZgotCi0JdW5zaWduZWQgaW50IHJzdmQ7Ci19OwotCi1lbnVtIHJ0d19jMmhfZXZlbnQgewotCUdFTl9FVlRfQ09ERShfUmVhZF9NQUNSRUcpID0gMCwgLyowKi8KLQlHRU5fRVZUX0NPREUoX1JlYWRfQkJSRUcpLAotCUdFTl9FVlRfQ09ERShfUmVhZF9SRlJFRyksCi0JR0VOX0VWVF9DT0RFKF9SZWFkX0VFUFJPTSksCi0JR0VOX0VWVF9DT0RFKF9SZWFkX0VGVVNFKSwKLQlHRU5fRVZUX0NPREUoX1JlYWRfQ0FNKSwJCQkvKjUqLwotCUdFTl9FVlRfQ09ERShfR2V0X0Jhc2ljUmF0ZSksCi0JR0VOX0VWVF9DT0RFKF9HZXRfRGF0YVJhdGUpLAotCUdFTl9FVlRfQ09ERShfU3VydmV5KSwJIC8qOCovCi0JR0VOX0VWVF9DT0RFKF9TdXJ2ZXlEb25lKSwJIC8qOSovCi0KLQlHRU5fRVZUX0NPREUoX0pvaW5Cc3MpICwgLyoxMCovCi0JR0VOX0VWVF9DT0RFKF9BZGRTVEEpLAotCUdFTl9FVlRfQ09ERShfRGVsU1RBKSwKLQlHRU5fRVZUX0NPREUoX0F0aW1Eb25lKSAsCi0JR0VOX0VWVF9DT0RFKF9UWF9SZXBvcnQpLAotCUdFTl9FVlRfQ09ERShfQ0NYX1JlcG9ydCksCQkJLyoxNSovCi0JR0VOX0VWVF9DT0RFKF9EVE1fUmVwb3J0KSwKLQlHRU5fRVZUX0NPREUoX1RYX1JhdGVfU3RhdGlzdGljcyksCi0JR0VOX0VWVF9DT0RFKF9DMkhMQkspLAotCUdFTl9FVlRfQ09ERShfRldEQkcpLAotCUdFTl9FVlRfQ09ERShfQzJIRkVFREJBQ0spLCAgICAgICAgICAgICAgIC8qMjAqLwotCUdFTl9FVlRfQ09ERShfQUREQkEpLAotCUdFTl9FVlRfQ09ERShfQzJIQkNOKSwKLQlHRU5fRVZUX0NPREUoX1JlcG9ydFB3clN0YXRlKSwJCS8qIGZpbGVuOiBvbmx5IGZvciBQQ0lFLCBVU0IgKi8KLQlHRU5fRVZUX0NPREUoX0Nsb3NlUkYpLAkJCQkvKiBmaWxlbjogb25seSBmb3IgUENJRSwgd29yayBhcm91bmQgQVNQTSAqLwotCU1BWF9DMkhFVlQKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19wd3JjdHJsLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3B3cmN0cmwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk5ZmVkOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3B3cmN0cmwuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVFdfUFdSQ1RSTF9IXwotI2RlZmluZSBfX1JUV19QV1JDVFJMX0hfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNkZWZpbmUgRldfUFdSMAkJMAotI2RlZmluZSBGV19QV1IxCQkxCi0jZGVmaW5lIEZXX1BXUjIJCTIKLSNkZWZpbmUgRldfUFdSMwkJMwotCi0KLSNkZWZpbmUgSFdfUFdSMAkJNwotI2RlZmluZSBIV19QV1IxCQk2Ci0jZGVmaW5lIEhXX1BXUjIJCTIKLSNkZWZpbmUgSFdfUFdSMwkJMAotI2RlZmluZSBIV19QV1I0CQk4Ci0KLSNkZWZpbmUgRldfUFdSTVNLCTB4NwotCi0KLSNkZWZpbmUgWE1JVF9BTElWRQlCSVQoMCkKLSNkZWZpbmUgUkVDVl9BTElWRQlCSVQoMSkKLSNkZWZpbmUgQ01EX0FMSVZFCUJJVCgyKQotI2RlZmluZSBFVlRfQUxJVkUJQklUKDMpCi0KLWVudW0gUG93ZXJfTWdudCB7Ci0JUFNfTU9ERV9BQ1RJVkUJPSAwLAotCVBTX01PREVfTUlOLAotCVBTX01PREVfTUFYLAotCVBTX01PREVfRFRJTSwKLQlQU19NT0RFX1ZPSVAsCi0JUFNfTU9ERV9VQVBTRF9XTU0sCi0JUFNfTU9ERV9VQVBTRCwKLQlQU19NT0RFX0lCU1MsCi0JUFNfTU9ERV9XV0xBTiwKLQlQTV9SYWRpb19PZmYsCi0JUE1fQ2FyZF9EaXNhYmxlLAotCVBTX01PREVfTlVNCi19OwotCi0KLS8qIEJJVFsyOjBdID0gSFcgc3RhdGUKLSAqIEJJVFszXSA9IFByb3RvY29sIFBTIHN0YXRlLCAgMDogYWN0aXZlLCAxOiBzbGVlcCBzdGF0ZQotICogQklUWzRdID0gc3ViLXN0YXRlCi0gKi8KLQotI2RlZmluZSBQU19EUFMJCQlCSVQoMCkKLSNkZWZpbmUgUFNfTENMSwkJCShQU19EUFMpCi0jZGVmaW5lIFBTX1JGX09GRgkJQklUKDEpCi0jZGVmaW5lIFBTX0FMTF9PTgkJQklUKDIpCi0jZGVmaW5lIFBTX1NUX0FDVElWRQkJQklUKDMpCi0KLSNkZWZpbmUgUFNfSVNSX0VOQUJMRQkJQklUKDQpCi0jZGVmaW5lIFBTX0lNUl9FTkFCTEUJCUJJVCg1KQotI2RlZmluZSBQU19BQ0sJCQlCSVQoNikKLSNkZWZpbmUgUFNfVE9HR0xFCQlCSVQoNykKLQotI2RlZmluZSBQU19TVEFURV9NQVNLCQkoMHgwRikKLSNkZWZpbmUgUFNfU1RBVEVfSFdfTUFTSwkoMHgwNykKLSNkZWZpbmUgUFNfU0VRX01BU0sJCSgweGMwKQotCi0jZGVmaW5lIFBTX1NUQVRFKHgpCQkoUFNfU1RBVEVfTUFTSyAmICh4KSkKLSNkZWZpbmUgUFNfU1RBVEVfSFcoeCkJKFBTX1NUQVRFX0hXX01BU0sgJiAoeCkpCi0jZGVmaW5lIFBTX1NFUSh4KQkJKFBTX1NFUV9NQVNLICYgKHgpKQotCi0jZGVmaW5lIFBTX1NUQVRFX1MwCQkoUFNfRFBTKQotI2RlZmluZSBQU19TVEFURV9TMQkJKFBTX0xDTEspCi0jZGVmaW5lIFBTX1NUQVRFX1MyCQkoUFNfUkZfT0ZGKQotI2RlZmluZSBQU19TVEFURV9TMwkJKFBTX0FMTF9PTikKLSNkZWZpbmUgUFNfU1RBVEVfUzQJCSgoUFNfU1RfQUNUSVZFKSB8IChQU19BTExfT04pKQotCi0KLSNkZWZpbmUgUFNfSVNfUkZfT04oeCkJKCh4KSAmIChQU19BTExfT04pKQotI2RlZmluZSBQU19JU19BQ1RJVkUoeCkJKCh4KSAmIChQU19TVF9BQ1RJVkUpKQotI2RlZmluZSBDTFJfUFNfU1RBVEUoeCkJKCh4KSA9ICgoeCkgJiAoMHhGMCkpKQotCi0KLXN0cnVjdCByZXBvcnRwd3JzdGF0ZV9wYXJtIHsKLQl1bnNpZ25lZCBjaGFyIG1vZGU7Ci0JdW5zaWduZWQgY2hhciBzdGF0ZTsgLyogdGhlIENQV00gdmFsdWUgKi8KLQl1bnNpZ25lZCBzaG9ydCByc3ZkOwotfTsKLQotI2RlZmluZSBMUFNfREVMQVlfVElNRQkoMSpIWikgLyogIDEgc2VjICovCi0KLSNkZWZpbmUgRVhFX1BXUl9OT05FCQkweDAxCi0jZGVmaW5lIEVYRV9QV1JfSVBTCQkweDAyCi0jZGVmaW5lIEVYRV9QV1JfTFBTCQkweDA0Ci0KLS8qICBSRiBzdGF0ZS4gKi8KLWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgewotCXJmX29uLAkJLyogIFJGIGlzIG9uIGFmdGVyIFJGU2xlZXAgb3IgUkZPZmYgKi8KLQlyZl9zbGVlcCwJLyogIDgwMi4xMSBQb3dlciBTYXZlIG1vZGUgKi8KLQlyZl9vZmYsCQkvKiAgSFcvU1cgUmFkaW8gT0ZGIG9yIEluYWN0aXZlIFBvd2VyIFNhdmUgKi8KLQkvKiBBZGQgdGhlIG5ldyBSRiBzdGF0ZSBhYm92ZSB0aGlzIGxpbmU9PT09PSAqLwotCXJmX21heAotfTsKLQotLyogIFJGIE9mZiBMZXZlbCBmb3IgSVBTIG9yIEhXL1NXIHJhZGlvIG9mZiAqLwotI2RlZmluZQlSVF9SRl9PRkZfTEVWTF9BU1BNCQlCSVQoMCkJLyogIFBDSSBBU1BNICovCi0jZGVmaW5lCVJUX1JGX09GRl9MRVZMX0NMS19SRVEJCUJJVCgxKQkvKiAgUENJIGNsb2NrIHJlcXVlc3QgKi8KLSNkZWZpbmUJUlRfUkZfT0ZGX0xFVkxfUENJX0QzCQlCSVQoMikJLyogIFBDSSBEMyBtb2RlICovCi0vKiBOSUMgaGFsdCwgcmUtaW5pdCBodyBwYXJhbXMgKi8KLSNkZWZpbmUJUlRfUkZfT0ZGX0xFVkxfSEFMVF9OSUMJCUJJVCgzKQotLyogIEZXIGZyZWUsIHJlLWRvd25sb2FkIHRoZSBGVyAqLwotI2RlZmluZQlSVF9SRl9PRkZfTEVWTF9GUkVFX0ZXCQlCSVQoNCkKLSNkZWZpbmUJUlRfUkZfT0ZGX0xFVkxfRldfMzJLCQlCSVQoNSkJLyogIEZXIGluIDMyayAqLwotLyogIEFsd2F5cyBlbmFibGUgQVNQTSBhbmQgQ2xvY2sgUmVxIGluIGluaXRpYWxpemF0aW9uLiAqLwotI2RlZmluZQlSVF9SRl9QU19MRVZFTF9BTFdBWVNfQVNQTQlCSVQoNikKLS8qICBXaGVuIExQUyBpcyBvbiwgZGlzYWJsZSAyUiBpZiBubyBwYWNrZXQgaXMgcmVjZWl2ZWQgb3IgdHJhbnNtaXR0ZC4gKi8KLSNkZWZpbmUJUlRfUkZfTFBTX0RJU0FMQkVfMlIJCUJJVCgzMCkKLSNkZWZpbmUJUlRfUkZfTFBTX0xFVkVMX0FTUE0JCUJJVCgzMSkJLyogIExQUyB3aXRoIEFTUE0gKi8KLQotI2RlZmluZQlSVF9JTl9QU19MRVZFTChwcHNjLCBfUFNfRkxBRykJCQkJXAotCSgocHBzYy0+Y3VyX3BzX2xldmVsICYgX1BTX0ZMQUcpID8gdHJ1ZSA6IGZhbHNlKQotI2RlZmluZQlSVF9DTEVBUl9QU19MRVZFTChwcHNjLCBfUFNfRkxBRykJCQlcCi0JKHBwc2MtPmN1cl9wc19sZXZlbCAmPSAofihfUFNfRkxBRykpKQotI2RlZmluZQlSVF9TRVRfUFNfTEVWRUwocHBzYywgX1BTX0ZMQUcpCQkJCVwKLQkocHBzYy0+Y3VyX3BzX2xldmVsIHw9IF9QU19GTEFHKQotCi0KLWVudW0gewotCVBTQkJSRUdfUkYwID0gMCwKLQlQU0JCUkVHX1JGMSwKLQlQU0JCUkVHX1JGMiwKLQlQU0JCUkVHX0FGRTAsCi0JUFNCQlJFR19UT1RBTENOVAotfTsKLQotZW51bSB7IC8qICBmb3IgaXBzX21vZGUgKi8KLQlJUFNfTk9ORSA9IDAsCi0JSVBTX05PUk1BTCwKLQlJUFNfTEVWRUxfMiwKLX07Ci0KLXN0cnVjdCBwd3JjdHJsX3ByaXYgewotCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKLQl2b2xhdGlsZSB1OCBycHdtOyAvKiByZXF1ZXN0ZWQgcG93ZXIgc3RhdGUgZm9yIGZ3ICovCi0Jdm9sYXRpbGUgdTggY3B3bTsgLyogZncgY3VycmVudCBwb3dlciBzdGF0ZS4gdXBkYXRlZCB3aGVuIDEuCi0JCQkgICAqIHJlYWQgZnJvbSBIQ1BXTSAyLiBkcml2ZXIgbG93ZXJzIHBvd2VyIGxldmVsCi0JCQkgICAqLwotCXZvbGF0aWxlIHU4IHRvZzsgLyogIHRvZ2dsaW5nICovCi0KLQl1OAlwd3JfbW9kZTsKLQl1OAlzbWFydF9wczsKLQl1OAliY25fYW50X21vZGU7Ci0KLQl1OAlicG93ZXJfc2F2aW5nOwotCi0JdTgJcmVnX3Jmb2ZmOwotCXUzMglyZm9mZl9yZWFzb247Ci0KLQkvKiBSRiBPRkYgTGV2ZWwgKi8KLQl1MzIJY3VyX3BzX2xldmVsOwotCXUzMglyZWdfcmZwc19sZXZlbDsKLQotCXVpbnQJaXBzX2VudGVyMjNhX2NudHM7Ci0JdWludAlpcHNfbGVhdmUyM2FfY250czsKLQotCXU4CWlwc19tb2RlOwotCXU4CWlwc19tb2RlX3JlcTsgLyogIHVzZWQgdG8gYWNjZXB0IHRoZSBtb2RlIHNldHRpbmcgcmVxdWVzdCAqLwotCXVpbnQgYmlwc19wcm9jZXNzaW5nOwotCXVuc2lnbmVkIGxvbmcgaXBzX2RlbnlfdGltZTsgLyogZGVueSBJUFMgd2hlbiBzeXN0ZW0gdGltZSBpcyBzbWFsbGVyICovCi0JdTggcHNfcHJvY2Vzc2luZzsgLyogdXNlZCB0byBtYXJrIHdoZXRoZXIgaW4gcnR3X3BzX3Byb2Nlc3NvcjIzYSAqLwotCi0JdTgJYkxlaXN1cmVQczsKLQl1OAlMcHNJZGxlQ291bnQ7Ci0JdTgJcG93ZXJfbWdudDsKLQl1OAliRndDdXJyZW50SW5QU01vZGU7Ci0JdW5zaWduZWQgbG9uZwlEZWxheUxQU0xhc3RUaW1lU3RhbXA7Ci0JdTgJYnRjb2V4X3Jmb247Ci0KLQl1OAkJYkluU3VzcGVuZDsKLSNpZmRlZglDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLQl1OAkJYkF1dG9SZXN1bWU7Ci0JdTgJCWF1dG9wbV9jbnQ7Ci0jZW5kaWYKLQl1OAkJYlN1cHBvcnRSZW1vdGVXYWtldXA7Ci0Jc3RydWN0IHRpbWVyX2xpc3QJcHdyX3N0YXRlX2NoZWNrX3RpbWVyOwotCWludAkJcHdyX3N0YXRlX2NoZWNrX2ludGVydmFsOwotCXU4CQlwd3Jfc3RhdGVfY2hlY2tfY250czsKLQotCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUJcmZfcHdyc3RhdGU7LyogY3VyIHBvd2VyIHN0YXRlICovCi0JZW51bSBydF9yZl9wb3dlcl9zdGF0ZQljaGFuZ2VfcmZwd3JzdGF0ZTsKLQotCXU4CWJrZWVwZndhbGl2ZTsKLQl1bnNpZ25lZCBsb25nIFBTX0JCUmVnQmFja3VwW1BTQkJSRUdfVE9UQUxDTlRdOwotfTsKLQotI2RlZmluZSBSVFdfUFdSX1NUQVRFX0NIS19JTlRFUlZBTCAyMDAwCi0KLSNkZWZpbmUgX3J0d19zZXRfcHdyX3N0YXRlX2NoZWNrX3RpbWVyKHB3cmN0cmxwcml2LCBtcykgXAotCShtb2RfdGltZXIoJnB3cmN0cmxwcml2LT5wd3Jfc3RhdGVfY2hlY2tfdGltZXIsIGppZmZpZXMgKwlcCi0JCSAgbXNlY3NfdG9famlmZmllcyhtcykpKQotCi0jZGVmaW5lIHJ0d19zZXRfcHdyX3N0YXRlX2NoZWNrX3RpbWVyKHB3cmN0cmxwcml2KQlcCi0JKF9ydHdfc2V0X3B3cl9zdGF0ZV9jaGVja190aW1lcigocHdyY3RybHByaXYpLAlcCi0JCQkgKHB3cmN0cmxwcml2KS0+cHdyX3N0YXRlX2NoZWNrX2ludGVydmFsKSkKLQotdm9pZCBydHdfaW5pdF9wd3JjdHJsX3ByaXYyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgcnR3X2ZyZWVfcHdyY3RybF9wcml2KHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci0KLXZvaWQgcnR3X3NldF9wc19tb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHBzX21vZGUsCi0JCSAgICAgdTggc21hcnRfcHMsIHU4IGJjbl9hbnRfbW9kZSk7Ci12b2lkIHJ0d19zZXRfcnB3bTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB2YWw4KTsKLXZvaWQgTGVhdmVBbGxQb3dlclNhdmVNb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIGlwc19lbnRlcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWludCBpcHNfbGVhdmUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcnR3X3BzX3Byb2Nlc3NvcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBSZk9uT2ZmRGV0ZWN0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci0KLXMzMiBMUFNfUkZfT05fY2hlY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIGRlbGF5X21zKTsKLXZvaWQgTFBTX0VudGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBMUFNfTGVhdmUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcnR3X3NldF9pcHNfZGVueTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgbXMpOwotaW50IF9ydHdfcHdyX3dha2V1cDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgaXBzX2RlZmZlcl9tcywKLQkJICAgIGNvbnN0IGNoYXIgKmNhbGxlcik7Ci0jZGVmaW5lIHJ0d19wd3Jfd2FrZXVwKGFkYXB0ZXIpIF9ydHdfcHdyX3dha2V1cDIzYShhZGFwdGVyLAkJXAotCSBSVFdfUFdSX1NUQVRFX0NIS19JTlRFUlZBTCwgX19mdW5jX18pCi1pbnQgcnR3X3BtX3NldF9pcHMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbW9kZSk7Ci1pbnQgcnR3X3BtX3NldF9scHMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbW9kZSk7Ci0KLSNlbmRpZiAgLyogX19SVEw4NzFYX1BXUkNUUkxfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfcmVjdi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19yZWN2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTVlZGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19yZWN2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9SVFdfUkVDVl9IXwotI2RlZmluZSBfUlRXX1JFQ1ZfSF8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDxIYWw4NzIzQVBoeUNmZy5oPgotCi0jZGVmaW5lIE5SX1JFQ1ZGUkFNRQkJMjU2Ci0KLSNkZWZpbmUgTUFYX1JYRlJBTUVfQ05UCQk1MTIKLSNkZWZpbmUgTUFYX1JYX05VTUJMS1MJCSgzMikKLSNkZWZpbmUgUkVDVkZSQU1FX0hEUl9BTElHTgkxMjgKLQotI2RlZmluZSBTTkFQX1NJWkUgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIpCi0KLSNkZWZpbmUgTUFYX1NVQkZSQU1FX0NPVU5UCTY0Ci0KLS8qIGZvciBSeCByZW9yZGVyaW5nIGJ1ZmZlciBjb250cm9sICovCi1zdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgewotCXN0cnVjdCBydHdfYWRhcHRlcgkqcGFkYXB0ZXI7Ci0JdTggZW5hYmxlOwotCXUxNiBpbmRpY2F0ZV9zZXE7Lyogd3N0YXJ0X2IsIGluaXRfdmFsdWU9MHhmZmZmICovCi0JdTE2IHdlbmRfYjsKLQl1OCB3c2l6ZV9iOwotCXN0cnVjdCBydHdfcXVldWUgcGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgcmVvcmRlcmluZ19jdHJsX3RpbWVyOwotfTsKLQotc3RydWN0CXN0YWluZm9fcnhjYWNoZQl7Ci0JdTE2CXRpZF9yeHNlcVsxNl07Ci0vKgotCXVuc2lnbmVkIHNob3J0CXRpZDBfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkMV9yeHNlcTsKLQl1bnNpZ25lZCBzaG9ydAl0aWQyX3J4c2VxOwotCXVuc2lnbmVkIHNob3J0CXRpZDNfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkNF9yeHNlcTsKLQl1bnNpZ25lZCBzaG9ydAl0aWQ1X3J4c2VxOwotCXVuc2lnbmVkIHNob3J0CXRpZDZfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkN19yeHNlcTsKLQl1bnNpZ25lZCBzaG9ydAl0aWQ4X3J4c2VxOwotCXVuc2lnbmVkIHNob3J0CXRpZDlfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkMTBfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkMTFfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkMTJfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkMTNfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkMTRfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkMTVfcnhzZXE7Ci0qLwotfTsKLQotc3RydWN0IHNtb290aF9yc3NpX2RhdGEgewotCXUzMgllbGVtZW50c1sxMDBdOwkvKiBhcnJheSB0byBzdG9yZSB2YWx1ZXMgKi8KLQl1MzIJaW5kZXg7CQkJLyogaW5kZXggdG8gY3VycmVudCBhcnJheSB0byBzdG9yZSAqLwotCXUzMgl0b3RhbF9udW07CQkvKiBudW0gb2YgdmFsaWQgZWxlbWVudHMgKi8KLQl1MzIJdG90YWxfdmFsOwkJLyogc3VtIG9mIHZhbGlkIGVsZW1lbnRzICovCi19OwotCi1zdHJ1Y3Qgc2lnbmFsX3N0YXQgewotCXU4CXVwZGF0ZV9yZXE7CQkvKiB1c2VkIHRvIGluZGljYXRlICovCi0JdTgJYXZnX3ZhbDsJCS8qIGF2ZyBvZiB2YWxpZCBlbGVtZW50cyAqLwotCXUzMgl0b3RhbF9udW07CQkvKiBudW0gb2YgdmFsaWQgZWxlbWVudHMgKi8KLQl1MzIJdG90YWxfdmFsOwkJLyogc3VtIG9mIHZhbGlkIGVsZW1lbnRzICovCi19OwotCi1zdHJ1Y3QgcGh5X2luZm8gewotCXU4CQlSeFBXREJBbGw7Ci0JdTgJCVNpZ25hbFF1YWxpdHk7CSAvKiAgaW4gMC0xMDAgaW5kZXguICovCi0JdTgJCVJ4TUlNT1NpZ25hbFF1YWxpdHlbUkZfUEFUSF9NQVhdOyAvKiBFVk0gKi8KLQl1OAkJUnhNSU1PU2lnbmFsU3RyZW5ndGhbUkZfUEFUSF9NQVhdOy8qIDB+MTAwICovCi0JczgJCVJ4UG93ZXI7IC8qICBpbiBkQm0gVHJhbnNsYXRlIGZyb20gUFdkQiAqLwotCS8qIFJlYWwgcG93ZXIgaW4gZEJtIGZvciB0aGlzIHBhY2tldCwgbm8gYmVhdXRpZmljYXRpb24gYW5kIGFnZ3JlZ2F0aW9uLgotCSAqIEtlZXAgdGhpcyByYXcgaW5mbyB0byBiZSB1c2VkIGZvciB0aGUgb3RoZXIgcHJvY2VkdXJlcy4KLQkgKi8KLQlzOAkJUmVjdlNpZ25hbFBvd2VyOwotCXU4CQlCVFJ4UlNTSVBlcmNlbnRhZ2U7Ci0JdTgJCVNpZ25hbFN0cmVuZ3RoOyAvKiAgaW4gMC0xMDAgaW5kZXguICovCi0JdTgJCVJ4UHdyW1JGX1BBVEhfTUFYXTsvKiBwZXItcGF0aCdzIHB3ZGIgKi8KLQl1OAkJUnhTTlJbUkZfUEFUSF9NQVhdOy8qIHBlci1wYXRoJ3MgU05SICovCi19OwotCi0KLXN0cnVjdCByeF9wa3RfYXR0cmliCXsKLQl1MTYJcGt0X2xlbjsKLQl1OAlwaHlzdDsKLQl1OAlkcnZpbmZvX3N6OwotCXU4CXNoaWZ0X3N6OwotCXU4CWhkcmxlbjsgLyogdGhlIFdMQU4gSGVhZGVyIExlbiAqLwotCXU4CWFtc2R1OwotCXU4CXFvczsKLQl1OAlwcmlvcml0eTsKLQl1OAlwd19zYXZlOwotCXU4CW1kYXRhOwotCXUxNglzZXFfbnVtOwotCXU4CWZyYWdfbnVtOwotCXU4CW1mcmFnOwotCXU4CW9yZGVyOwotCXU4CXByaXZhY3k7IC8qIGluIGZyYW1lX2N0cmwgZmllbGQgKi8KLQl1OAliZGVjcnlwdGVkOwotCS8qIHdoZW4gMCBpbmRpY2F0ZSBubyBlbmNyeXB0LiB3aGVuIG5vbi16ZXJvLCBpbmRpY2F0ZSB0aGUgYWxnb3JpdGggKi8KLQl1MzIJZW5jcnlwdDsKLQl1OAlpdl9sZW47Ci0JdTgJaWN2X2xlbjsKLQl1OAljcmNfZXJyOwotCXU4CWljdl9lcnI7Ci0KLQl1MTYgZXRoX3R5cGU7Ci0KLQl1OAlkc3RbRVRIX0FMRU5dOwotCXU4CXNyY1tFVEhfQUxFTl07Ci0JdTgJdGFbRVRIX0FMRU5dOwotCXU4CXJhW0VUSF9BTEVOXTsKLQl1OAlic3NpZFtFVEhfQUxFTl07Ci0KLQl1OCBhY2tfcG9saWN5OwotCi0JdTgJdGNwY2hrX3ZhbGlkOyAvKiAgMDogaW52YWxpZCwgMTogdmFsaWQgKi8KLQl1OAlpcF9jaGtycHQ7IC8qIDA6IGluY29ycmVjdCwgMTogY29ycmVjdCAqLwotCXU4CXRjcF9jaGtycHQ7IC8qIDA6IGluY29ycmVjdCwgMTogY29ycmVjdCAqLwotCXU4CWtleV9pbmRleDsKLQotCXU4CW1jc19yYXRlOwotCXU4CXJ4aHQ7Ci0JdTgJc2dpOwotCXU4CXBrdF9ycHRfdHlwZTsKLQl1MzIJTWFjSURWYWxpZEVudHJ5WzJdOwkvKiAgNjQgYml0cyBwcmVzZW50IDY0IGVudHJ5LiAqLwotCXN0cnVjdCBwaHlfaW5mbyBwaHlfaW5mbzsKLX07Ci0KLS8qIFRoZXNlIGRlZmluaXRpb24gaXMgdXNlZCBmb3IgUnggcGFja2V0IHJlb3JkZXJpbmcuICovCi0jZGVmaW5lIFNOX0xFU1MoYSwgYikJCSgoKGEtYikgJiAweDgwMCkgIT0gMCkKLSNkZWZpbmUgU05fRVFVQUwoYSwgYikJCShhID09IGIpCi0jZGVmaW5lIFJFT1JERVJfV0FJVF9USU1FCSg1MCkgLyogIChtcykgKi8KLQotI2RlZmluZSBSRUNWQlVGRl9BTElHTl9TWiA4Ci0KLSNkZWZpbmUgUlhERVNDX1NJWkUJMjQKLSNkZWZpbmUgUlhERVNDX09GRlNFVCBSWERFU0NfU0laRQotCi1zdHJ1Y3QgcmVjdl9zdGF0IHsKLQlfX2xlMzIgcnhkdzA7Ci0JX19sZTMyIHJ4ZHcxOwotCV9fbGUzMiByeGR3MjsKLQlfX2xlMzIgcnhkdzM7Ci0JX19sZTMyIHJ4ZHc0OwotCV9fbGUzMiByeGR3NTsKLX07Ci0KLS8qIGFjY2Vzc2VyIG9mIHJlY3ZfcHJpdjogcnR3X3JlY3ZfZW50cnkyM2EoZGlzcGF0Y2ggLyBwYXNzaXZlIGxldmVsKTsJXAotICogcmVjdl90aHJlYWQocGFzc2l2ZSkgOyByZXR1cm5wa3QoZGlzcGF0Y2gpIDsgaGFsdChwYXNzaXZlKSA7Ci0gKgotICogdXNpbmcgZW50ZXJfY3JpdGljYWwgc2VjdGlvbiB0byBwcm90ZWN0Ci0gKi8KLXN0cnVjdCByZWN2X3ByaXYgewotCXNwaW5sb2NrX3QJbG9jazsKLQotCXN0cnVjdCBydHdfcXVldWUJZnJlZV9yZWN2X3F1ZXVlOwotCXN0cnVjdCBydHdfcXVldWUJcmVjdl9wZW5kaW5nX3F1ZXVlOwotCXN0cnVjdCBydHdfcXVldWUJdWNfc3dkZWNfcGVuZGluZ19xdWV1ZTsKLQotCWludCBmcmVlX3JlY3ZmcmFtZV9jbnQ7Ci0KLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIJKmFkYXB0ZXI7Ci0KLQl1MzIJYklzQW55Tm9uQkVQa3RzOwotCXU2NAlyeF9ieXRlczsKLQl1NjQJcnhfcGt0czsKLQl1NjQJcnhfZHJvcDsKLQl1NjQJbGFzdF9yeF9ieXRlczsKLQotCXVpbnQgIHJ4X2ljdl9lcnI7Ci0JdWludCAgcnhfbGFyZ2VwYWNrZXRfY3JjZXJyOwotCXVpbnQgIHJ4X3NtYWxscGFja2V0X2NyY2VycjsKLQl1aW50ICByeF9taWRkbGVwYWNrZXRfY3JjZXJyOwotCi0JLyogdTggKnBhbGxvY2F0ZWRfdXJiX2J1ZjsgKi8KLQl1OAlyeF9wZW5kaW5nX2NudDsKLQotCXN0cnVjdCB1cmIgKmludF9pbl91cmI7Ci0KLQl1OAkqaW50X2luX2J1ZjsKLQotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpcnFfcHJlcGFyZV9iZWFjb25fdGFza2xldDsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgcmVjdl90YXNrbGV0OwotCXN0cnVjdCBza19idWZmX2hlYWQgZnJlZV9yZWN2X3NrYl9xdWV1ZTsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJ4X3NrYl9xdWV1ZTsKLQl1OCAqcHJlY3ZfYnVmOwotCi0JLyogRm9yIGRpc3BsYXkgdGhlIHBoeSBpbmZvcm1hdGlvbSAqLwotCXM4IHJ4cHdkYjsKLQl1OCBzaWduYWxfc3RyZW5ndGg7Ci0JdTggc2lnbmFsX3F1YWw7Ci0JdTggbm9pc2U7Ci0JaW50IFJ4U05SZEJbMl07Ci0JczggUnhSc3NpWzJdOwotCWludCBGYWxzZUFsbUNudF9hbGw7Ci0KLQlzdHJ1Y3QgdGltZXJfbGlzdCBzaWduYWxfc3RhdF90aW1lcjsKLQl1MzIgc2lnbmFsX3N0YXRfc2FtcGxpbmdfaW50ZXJ2YWw7Ci0JLyogdTMyIHNpZ25hbF9zdGF0X2NvbnZlcmdpbmdfY29uc3RhbnQ7ICovCi0Jc3RydWN0IHNpZ25hbF9zdGF0IHNpZ25hbF9xdWFsX2RhdGE7Ci0Jc3RydWN0IHNpZ25hbF9zdGF0IHNpZ25hbF9zdHJlbmd0aF9kYXRhOwotfTsKLQotI2RlZmluZSBydHdfc2V0X3NpZ25hbF9zdGF0X3RpbWVyKHJlY3Zwcml2KQkJCVwKLQkgbW9kX3RpbWVyKCYocmVjdnByaXYpLT5zaWduYWxfc3RhdF90aW1lciwgamlmZmllcyArCVwKLQkJICAgbXNlY3NfdG9famlmZmllcygocmVjdnByaXYpLT5zaWduYWxfc3RhdF9zYW1wbGluZ19pbnRlcnZhbCkpCi0KLXN0cnVjdCBzdGFfcmVjdl9wcml2IHsKLQlzcGlubG9ja190CWxvY2s7Ci0JaW50CW9wdGlvbjsKLQotCS8qIHN0cnVjdCBydHdfcXVldWUJYmxrX3N0cm1zW01BWF9SWF9OVU1CTEtTXTsgKi8KLQlzdHJ1Y3QgcnR3X3F1ZXVlIGRlZnJhZ19xOwkgLyoga2VlcGluZyB0aGUgZnJhZ21lbnQgZnJhbWUgdW50aWwgZGVmcmFnICovCi0KLQlzdHJ1Y3QJc3RhaW5mb19yeGNhY2hlIHJ4Y2FjaGU7Ci0KLQkvKiB1aW50CXN0YV9yeF9ieXRlczsgKi8KLQkvKiB1aW50CXN0YV9yeF9wa3RzOyAqLwotCS8qIHVpbnQJc3RhX3J4X2ZhaWw7ICovCi0KLX07Ci0KLQotc3RydWN0IHJlY3ZfYnVmIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXI7Ci0KLQlzdHJ1Y3QgdXJiICpwdXJiOwotCXN0cnVjdCBza19idWZmICpwc2tiOwotfTsKLQotLyoJaGVhZCAgLS0tLS0+Ci0gKgotICoJCWRhdGEgIC0tLS0tPgotICoKLSAqCQkJcGF5bG9hZAotICoKLSAqCQl0YWlsICAtLS0tLT4KLSAqCi0gKgllbmQgICAtLS0tLT4KLSAqCi0gKglsZW4gPSAodW5zaWduZWQgaW50ICkodGFpbCAtIGRhdGEpOwotICoKLSAqLwotc3RydWN0IHJlY3ZfZnJhbWUgewotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwotCi0Jc3RydWN0IHJ0d19hZGFwdGVyICAqYWRhcHRlcjsKLQotCXN0cnVjdCByeF9wa3RfYXR0cmliIGF0dHJpYjsKLQotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQotCS8qIGZvciBBLU1QRFUgUnggcmVvcmRlcmluZyBidWZmZXIgY29udHJvbCAqLwotCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybDsKLX07Ci0KLS8qIGdldCBhIGZyZWUgcmVjdl9mcmFtZSBmcm9tIHBmcmVlX3JlY3ZfcXVldWUgKi8KLXN0cnVjdCByZWN2X2ZyYW1lICpydHdfYWxsb2NfcmVjdmZyYW1lMjNhKHN0cnVjdCBydHdfcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpOwotaW50IHJ0d19mcmVlX3JlY3ZmcmFtZTIzYShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSk7Ci0KLWludCBydHdfZW5xdWV1ZV9yZWN2ZnJhbWUyM2Eoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIHN0cnVjdCBydHdfcXVldWUgKnF1ZXVlKTsKLQotdTMyIHJ0d19mcmVlX3VjX3N3ZGVjX3BlbmRpbmdfcXVldWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLQotc3RydWN0IHJlY3ZfYnVmICpydHdfZGVxdWV1ZV9yZWN2YnVmMjNhKHN0cnVjdCBydHdfcXVldWUgKnF1ZXVlKTsKLQotdm9pZCBydHdfcmVvcmRlcmluZ19jdHJsX3RpbWVvdXRfaGFuZGxlcjIzYSh1bnNpZ25lZCBsb25nIHBjb250ZXh0KTsKLQotc3RhdGljIGlubGluZSBzMzIgdHJhbnNsYXRlX3BlcmNlbnRhZ2VfdG9fZGJtKHUzMiBTaWduYWxTdHJlbmd0aEluZGV4KQotewotCXMzMglTaWduYWxQb3dlcjsgLyogIGluIGRCbS4gKi8KLQotCS8qICBUcmFuc2xhdGUgdG8gZEJtICh4PTAuNXktOTUpLiAqLwotCVNpZ25hbFBvd2VyID0gKHMzMikoKFNpZ25hbFN0cmVuZ3RoSW5kZXggKyAxKSA+PiAxKTsKLQlTaWduYWxQb3dlciAtPSA5NTsKLQotCXJldHVybiBTaWduYWxQb3dlcjsKLX0KLQotCi1zdHJ1Y3Qgc3RhX2luZm87Ci0KLXZvaWQgX3J0d19pbml0X3N0YV9yZWN2X3ByaXYyM2Eoc3RydWN0IHN0YV9yZWN2X3ByaXYgKnBzdGFfcmVjdnByaXYpOwotCi12b2lkIG1ndF9kaXNwYXRjaGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfcmYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfcmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdkZTcxNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3JmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmCV9fUlRXX1JGX0hfCi0jZGVmaW5lIF9fUlRXX1JGX0hfCi0KLSNpbmNsdWRlIDxydHdfY21kLmg+Ci0KLSNkZWZpbmUgT0ZETV9QSFkJCTEKLSNkZWZpbmUgTUlYRURfUEhZCQkyCi0jZGVmaW5lIENDS19QSFkJCQkzCi0KLSNkZWZpbmUgTnVtUmF0ZXMJCSgxMykKLQotLyogIHNsb3QgdGltZSBmb3IgMTFnICovCi0jZGVmaW5lIFNIT1JUX1NMT1RfVElNRQkJCTkKLSNkZWZpbmUgTk9OX1NIT1JUX1NMT1RfVElNRQkJMjAKLQotLyogIFdlIG5vdyBkZWZpbmUgdGhlIG1heCBjaGFubmVscyBpbiBlYWNoIGNoYW5uZWwgcGxhbi4gKi8KLSNkZWZpbmUJTUFYX0NIQU5ORUxfTlVNXzJHCTE0Ci0jZGVmaW5lCU1BWF9DSEFOTkVMX05VTV81RwkyNAotI2RlZmluZQlNQVhfQ0hBTk5FTF9OVU0JCTM4LyogMTQrMjQgKi8KLQotLyogZGVmaW5lIE5VTV9SRUdVTEFUT1JZUwkyMSAqLwotI2RlZmluZSBOVU1fUkVHVUxBVE9SWVMJMQotCi0vKiBDb3VudHJ5IGNvZGVzICovCi0jZGVmaW5lIFVTQQkJMHg1NTUzMjAKLSNkZWZpbmUgRVVST1BFCQkweDEgLyogdGVtcCwgc2hvdWxkIGJlIHByb3ZpZGVkIGxhdGVyICovCi0jZGVmaW5lIEpBUEFOCQkweDIgLyogdGVtcCwgc2hvdWxkIGJlIHByb3ZpZGVkIGxhdGVyICovCi0KLXN0cnVjdAlyZWd1bGF0b3J5X2NsYXNzIHsKLQl1MzIJc3RhcnRpbmdfZnJlcTsJCQkJCS8qIE1IeiwgKi8KLQl1OAljaGFubmVsX3NldFtNQVhfQ0hBTk5FTF9OVU1dOwotCXU4CWNoYW5uZWxfY2NrX3Bvd2VyW01BWF9DSEFOTkVMX05VTV07LyogZGJtICovCi0JdTgJY2hhbm5lbF9vZmRtX3Bvd2VyW01BWF9DSEFOTkVMX05VTV07LyogZGJtICovCi0JdTgJdHhwb3dlcl9saW1pdDsJCQkJCS8qIGRibSAqLwotCXU4CWNoYW5uZWxfc3BhY2luZzsJCQkJLyogTUh6ICovCi0JdTgJbW9kZW07Ci19OwotCi1lbnVtIHsKLQljRVNTCQk9IDB4MDAwMSwKLQljSUJTUwkJPSAweDAwMDIsCi0JY1BvbGxhYmxlCT0gMHgwMDA0LAotCWNQb2xsUmVxCT0gMHgwMDA4LAotCWNQcml2YWN5CT0gMHgwMDEwLAotCWNTaG9ydFByZWFtYmxlCT0gMHgwMDIwLAotCWNQQkNDCQk9IDB4MDA0MCwKLQljQ2hhbm5lbEFnaWxpdHkJPSAweDAwODAsCi0JY1NwZWN0cnVtTWdudAk9IDB4MDEwMCwKLQljUW9zCQk9IDB4MDIwMCwJLyogIEZvciBIQ0NBLCB1c2Ugd2l0aCBDRi1Qb2xsYWJsZSBhbmQgQ0YtUG9sbFJlcSAqLwotCWNTaG9ydFNsb3RUaW1lCT0gMHgwNDAwLAotCWNBUFNECQk9IDB4MDgwMCwKLQljUk0JCT0gMHgxMDAwLAkvKiAgUlJNIChSYWRpbyBSZXF1ZXN0IE1lYXN1cmVtZW50KSAqLwotCWNEU1NTX09GRE0JPSAweDIwMDAsCi0JY0RlbGF5ZWRCQQk9IDB4NDAwMCwKLQljSW1tZWRpYXRlQkEJPSAweDgwMDAsCi19OwotCi1lbnVtIHsKLQlQUkVBTUJMRV9MT05HCT0gMSwKLQlQUkVBTUJMRV9BVVRPCT0gMiwKLQlQUkVBTUJMRV9TSE9SVAk9IDMsCi19OwotCi0vKiAgQmFuZHdpZHRoIE9mZnNldCAqLwotI2RlZmluZSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFCTAKLSNkZWZpbmUgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSCTEKLSNkZWZpbmUgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX1VQUEVSCTIKLQotLyogIFJlcHJlc2VudCBDaGFubmVsIFdpZHRoIGluIEhUIENhcGFiaWxpdGllcyAqLwotZW51bSBodF9jaGFubmVsX3dpZHRoIHsKLQlIVF9DSEFOTkVMX1dJRFRIXzIwID0gMCwKLQlIVF9DSEFOTkVMX1dJRFRIXzQwID0gMSwKLQlIVF9DSEFOTkVMX1dJRFRIXzgwID0gMiwKLQlIVF9DSEFOTkVMX1dJRFRIXzE2MCA9IDMsCi0JSFRfQ0hBTk5FTF9XSURUSF8xMCA9IDQsCi19OwotCi0vKiAyMDA3LzExLzE1IE1IIERlZmluZSBkaWZmZXJlbnQgUkYgdHlwZS4gKi8KLWVudW0gewotCVJGXzFUMlIgPSAwLAotCVJGXzJUNFIgPSAxLAotCVJGXzJUMlIgPSAyLAotCVJGXzFUMVIgPSAzLAotCVJGXzJUMlJfR1JFRU4gPSA0LAotCVJGXzgxOVhfTUFYX1RZUEUgPSA1LAotfTsKLQotI2VuZGlmIC8qIF9SVEw4NzExX1JGX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3NlY3VyaXR5LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3NlY3VyaXR5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNGE5ZDcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19zZWN1cml0eS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUV19TRUNVUklUWV9IXwotI2RlZmluZSBfX1JUV19TRUNVUklUWV9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPG5ldC9saWI4MDIxMS5oPgotCi0KLSNkZWZpbmUgaXNfd2VwX2VuYyhhbGcpIChhbGcgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwgXAotCQkJIGFsZyA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpCi0KLSNkZWZpbmUgU0hBMjU2X01BQ19MRU4gMzIKLSNkZWZpbmUgQUVTX0JMT0NLX1NJWkUgMTYKLSNkZWZpbmUgQUVTX1BSSVZfU0laRSAoNCAqIDQ0KQotCi1lbnVtIEVOQ1JZUF9QUk9UT0NPTCB7Ci0JRU5DUllQX1BST1RPQ09MX09QRU5TWVMsICAgLyogb3BlbiBzeXN0ZW0gKi8KLQlFTkNSWVBfUFJPVE9DT0xfV0VQLCAgICAgICAvKiBXRVAgKi8KLQlFTkNSWVBfUFJPVE9DT0xfV1BBLCAgICAgICAvKiBXUEEgKi8KLQlFTkNSWVBfUFJPVE9DT0xfV1BBMiwgICAgICAvKiBXUEEyICovCi0JRU5DUllQX1BST1RPQ09MX01BWAotfTsKLQotI2lmbmRlZiBOZGlzODAyXzExQXV0aE1vZGVXUEEyCi0jZGVmaW5lIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgKE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUgKyAxKQotI2VuZGlmCi0KLSNpZm5kZWYgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSwotI2RlZmluZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLIChOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lICsgMikKLSNlbmRpZgotCi11bmlvbiBwbjQ4IHsKLQl1NjQJdmFsOwotCi0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0KLXN0cnVjdCB7Ci0JdTggVFNDMDsKLQl1OCBUU0MxOwotCXU4IFRTQzI7Ci0JdTggVFNDMzsKLQl1OCBUU0M0OwotCXU4IFRTQzU7Ci0JdTggVFNDNjsKLQl1OCBUU0M3OwotfSBfYnl0ZV87Ci0KLSNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCi1zdHJ1Y3QgewotCXU4IFRTQzc7Ci0JdTggVFNDNjsKLQl1OCBUU0M1OwotCXU4IFRTQzQ7Ci0JdTggVFNDMzsKLQl1OCBUU0MyOwotCXU4IFRTQzE7Ci0JdTggVFNDMDsKLX0gX2J5dGVfOwotI2Vsc2UKLSNlcnJvciBOZWVkIEJJRyBvciBMSVRUTEUgZW5kaWFuCi0KLSNlbmRpZgotCi19OwotCi11bmlvbiBLZXl0eXBlIHsKLQl1OCAgIHNrZXlbMTZdOwotCXUzMiAgICBsa2V5WzRdOwotfTsKLQotc3RydWN0IHJ0d193ZXBfa2V5IHsKLQl1OCBrZXlbV0xBTl9LRVlfTEVOX1dFUDEwNCArIDFdOyAvKiAxNCAqLwotCXUxNiBrZXlsZW47Ci19OwotCi1zdHJ1Y3QgcnRfcG1raWRfbGlzdCB7Ci0JdTgJYlVzZWQ7Ci0JdTgJQnNzaWRbNl07Ci0JdTgJUE1LSURbMTZdOwotCXU4CVNzaWRCdWZbMzNdOwotCXU4CSpzc2lkX29jdGV0OwotCXUxNglzc2lkX2xlbmd0aDsKLX07Ci0KLXN0cnVjdCBzZWN1cml0eV9wcml2IHsKLQl1MzIJICBkb3QxMUF1dGhBbGdydGhtOwkvKiAgODAyLjExIGF1dGgsIGNvdWxkIGJlIG9wZW4sIHNoYXJlZCwKLQkJCQkJICogODAyMXggYW5kIGF1dGhzd2l0Y2ggKi8KLQl1MzIJICBkb3QxMVByaXZhY3lBbGdydGhtOwkvKiBUaGlzIHNwZWNpZmllcyB0aGUgcHJpdmFjeSBmb3IKLQkJCQkJICogc2hhcmVkIGF1dGguIGFsZ29yaXRobS4KLQkJCQkJICovCi0JLyogV0VQICovCi0JdTMyCSAgZG90MTFQcml2YWN5S2V5SW5kZXg7CS8qICB0aGlzIGlzIG9ubHkgdmFsaWQgZm9yIGxlZ2VuZGFyeQotCQkJCQkgKiB3ZXAsIDB+MyBmb3Iga2V5IGlkLiAodHgga2V5IGluZGV4KQotCQkJCQkgKi8KLQlzdHJ1Y3QgcnR3X3dlcF9rZXkgd2VwX2tleVtOVU1fV0VQX0tFWVNdOwotCi0JdTMyIGRvdDExODAyMVhHcnBQcml2YWN5OwkvKiBzcGVjaWZ5IHRoZSBwcml2YWN5IGFsZ3RobS4KLQkJCQkJICogdXNlZCBmb3IgR3JwIGtleQotCQkJCQkgKi8KLQl1MzIJZG90MTE4MDIxWEdycEtleWlkOwkvKiAga2V5IGlkIHVzZWQgZm9yIEdycCBLZXkKLQkJCQkJICogKHR4IGtleSBpbmRleCkKLQkJCQkJICovCi0JdW5pb24gS2V5dHlwZQlkb3QxMTgwMjFYR3JwS2V5WzRdOy8qIDgwMi4xeCBHcnAgS2V5LCBpbngwIGFuZCBpbngxICovCi0JdW5pb24gS2V5dHlwZQlkb3QxMTgwMjFYR3JwdHhtaWNrZXlbNF07Ci0JdW5pb24gS2V5dHlwZQlkb3QxMTgwMjFYR3JwcnhtaWNrZXlbNF07Ci0JdW5pb24gcG40OAlkb3QxMUdycHR4cG47CQkvKiBQTjQ4IHVzZWQgZm9yIEdycCBLZXkgeG1pdC4qLwotCXVuaW9uIHBuNDgJZG90MTFHcnByeHBuOwkJLyogUE40OCB1c2VkIGZvciBHcnAgS2V5IHJlY3YuKi8KLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCS8qIGV4dGVuZCBzZWN1cml0eSBjYXBhYmlsaXRpZXMgZm9yIEFQX01PREUgKi8KLQl1bnNpZ25lZCBpbnQgZG90ODAyMXhhbGc7LyogMDpkaXNhYmxlLCAxOnBzaywgMjo4MDIuMXggKi8KLQl1bnNpZ25lZCBpbnQgd3BhX3BzazsvKiAwOmRpc2FibGUsIGJpdCgwKTogV1BBLCBiaXQoMSk6V1BBMiAqLwotCXVuc2lnbmVkIGludCB3cGFfZ3JvdXBfY2lwaGVyOwotCXVuc2lnbmVkIGludCB3cGEyX2dyb3VwX2NpcGhlcjsKLQl1bnNpZ25lZCBpbnQgd3BhX3BhaXJ3aXNlX2NpcGhlcjsKLQl1bnNpZ25lZCBpbnQgd3BhMl9wYWlyd2lzZV9jaXBoZXI7Ci0jZW5kaWYKLQotCXU4IHdwc19pZVtNQVhfV1BTX0lFX0xFTl07LyogYWRkZWQgaW4gYXNzb2MgcmVxICovCi0JaW50IHdwc19pZV9sZW47Ci0JdW5zaWduZWQgaW50IGJpbnN0YWxsR3Jwa2V5OjE7Ci0JdW5zaWduZWQgaW50IGJ1c2V0a2lwa2V5OjE7Ci0JdW5zaWduZWQgaW50IGJjaGVja19ncnBrZXk6MTsKLQl1bnNpZ25lZCBpbnQgaHdfZGVjcnlwdGVkOjE7Ci0JdTMyIG5kaXNhdXRodHlwZTsJLyogIGVudW0gbmRpc184MDJfMTFfYXV0aF9tb2RlICovCi0JdTMyIG5kaXNlbmNyeXB0c3RhdHVzOwkvKiAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgKi8KLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCBzZWNfYnNzOyAgLyogZm9yIGpvaW5ic3MgKGgyYyBidWZmZXIpIHVzYWdlICovCi0JdTggYXNzb2NfaW5mb1s2MDBdOwotCXU4IHN6b2ZjYXBhYmlsaXR5WzI1Nl07IC8qIGZvciB3cGEyIHVzYWdlICovCi0JdTggb2lkYXNzb2NpYXRpb25bNTEyXTsgLyogZm9yIHdwYS93cGEyIHVzYWdlICovCi0JdTggc3VwcGxpY2FudF9pZVsyNTZdOyAgLyogc3RvcmUgc3RhIHNlY3VyaXR5IGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KLQotCS8qIGZvciB0a2lwIGNvdW50ZXJtZWFzdXJlICovCi0JdW5zaWduZWQgbG9uZyBsYXN0X21pY19lcnJfdGltZTsKLQl1OAlidGtpcF9jb3VudGVybWVhc3VyZTsKLQl1OAlidGtpcF93YWl0X3JlcG9ydDsKLQl1bnNpZ25lZCBsb25nIGJ0a2lwX2NvdW50ZXJtZWFzdXJlX3RpbWU7Ci0KLQkvKiAgRm9yIFdQQTIgUHJlLUF1dGhlbnRpY2F0aW9uLiAqLwotCXN0cnVjdCBydF9wbWtpZF9saXN0IFBNS0lETGlzdFtOVU1fUE1LSURfQ0FDSEVdOwotCXU4IFBNS0lESW5kZXg7Ci0JdTggYldlcERlZmF1bHRLZXlJZHhTZXQ7Ci19OwotCi1zdHJ1Y3Qgc2hhMjU2X3N0YXRlIHsKLQl1NjQgbGVuZ3RoOwotCXUzMiBzdGF0ZVs4XSwgY3VybGVuOwotCXU4IGJ1Zls2NF07Ci19OwotCi0jZGVmaW5lIEdFVF9FTkNSWV9BTEdPKHBzZWN1cml0eXByaXYsIHBzdGEsIGVuY3J5X2FsZ28sIGJtY3N0KVwKLWRvIHtcCi0Jc3dpdGNoIChwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtKSB7XAotCWNhc2UgZG90MTFBdXRoQWxncnRobV9PcGVuOlwKLQljYXNlIGRvdDExQXV0aEFsZ3J0aG1fU2hhcmVkOlwKLQljYXNlIGRvdDExQXV0aEFsZ3J0aG1fQXV0bzpcCi0JCWVuY3J5X2FsZ28gPSBwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtO1wKLQkJYnJlYWs7XAotCWNhc2UgZG90MTFBdXRoQWxncnRobV84MDIxWDpcCi0JCWlmIChibWNzdClcCi0JCQllbmNyeV9hbGdvID0gcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3k7XAotCQllbHNlXAotCQkJZW5jcnlfYWxnbyA9IHBzdGEtPmRvdDExODAyMVhQcml2YWN5O1wKLQkJYnJlYWs7XAotCX0JXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBHRVRfVEtJUF9QTihpdiwgZG90MTF0eHBuKVwKLWRvIHtcCi0JZG90MTF0eHBuLl9ieXRlXy5UU0MwID0gaXZbMl07XAotCWRvdDExdHhwbi5fYnl0ZV8uVFNDMSA9IGl2WzBdO1wKLQlkb3QxMXR4cG4uX2J5dGVfLlRTQzIgPSBpdls0XTtcCi0JZG90MTF0eHBuLl9ieXRlXy5UU0MzID0gaXZbNV07XAotCWRvdDExdHhwbi5fYnl0ZV8uVFNDNCA9IGl2WzZdO1wKLQlkb3QxMXR4cG4uX2J5dGVfLlRTQzUgPSBpdls3XTtcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFJPTDMyKEEsIG4pICAoKChBKSA8PCAobikpIHwgKCgoQSk+PigzMi0obikpKSAgJiAoKDFVTCA8PCAobikpIC0gMSkpKQotI2RlZmluZSBST1IzMihBLCBuKSAgUk9MMzIoKEEpLCAzMi0obikpCi0KLXN0cnVjdCBtaWNfZGF0YSB7Ci0JdTMyICBLMCwgSzE7ICAgICAgICAgLyogIEtleSAqLwotCXUzMiAgTCwgUjsgICAgICAgICAgIC8qICBDdXJyZW50IHN0YXRlICovCi0JdTMyICBNOyAgICAgICAgICAgICAgLyogIE1lc3NhZ2UgYWNjdW11bGF0b3IgKHNpbmdsZSB3b3JkKSAqLwotCXUzMiAgICAgbkJ5dGVzSW5NOyAgICAgIC8qICAjIGJ5dGVzIGluIE0gKi8KLX07Ci0KLWV4dGVybiBjb25zdCB1MzIgVGUwWzI1Nl07Ci1leHRlcm4gY29uc3QgdTMyIFRlMVsyNTZdOwotZXh0ZXJuIGNvbnN0IHUzMiBUZTJbMjU2XTsKLWV4dGVybiBjb25zdCB1MzIgVGUzWzI1Nl07Ci1leHRlcm4gY29uc3QgdTMyIFRlNFsyNTZdOwotZXh0ZXJuIGNvbnN0IHUzMiBUZDBbMjU2XTsKLWV4dGVybiBjb25zdCB1MzIgVGQxWzI1Nl07Ci1leHRlcm4gY29uc3QgdTMyIFRkMlsyNTZdOwotZXh0ZXJuIGNvbnN0IHUzMiBUZDNbMjU2XTsKLWV4dGVybiBjb25zdCB1MzIgVGQ0WzI1Nl07Ci1leHRlcm4gY29uc3QgdTMyIHJjb25bMTBdOwotZXh0ZXJuIGNvbnN0IHU4IFRkNHNbMjU2XTsKLWV4dGVybiBjb25zdCB1OCByY29uc1sxMF07Ci0KLSNkZWZpbmUgUkNPTihpKSAocmNvbnNbKGkpXSA8PCAyNCkKLQotc3RhdGljIGlubGluZSB1MzIgcm90cih1MzIgdmFsLCBpbnQgYml0cykKLXsKLQlyZXR1cm4gKHZhbCA+PiBiaXRzKSB8ICh2YWwgPDwgKDMyIC0gYml0cykpOwotfQotCi0jZGVmaW5lIFRFMChpKSBUZTBbKChpKSA+PiAyNCkgJiAweGZmXQotI2RlZmluZSBURTEoaSkgcm90cihUZTBbKChpKSA+PiAxNikgJiAweGZmXSwgOCkKLSNkZWZpbmUgVEUyKGkpIHJvdHIoVGUwWygoaSkgPj4gOCkgJiAweGZmXSwgMTYpCi0jZGVmaW5lIFRFMyhpKSByb3RyKFRlMFsoaSkgJiAweGZmXSwgMjQpCi0jZGVmaW5lIFRFNDEoaSkgKChUZTBbKChpKSA+PiAyNCkgJiAweGZmXSA8PCA4KSAmIDB4ZmYwMDAwMDApCi0jZGVmaW5lIFRFNDIoaSkgKFRlMFsoKGkpID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkKLSNkZWZpbmUgVEU0MyhpKSAoVGUwWygoaSkgPj4gOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApCi0jZGVmaW5lIFRFNDQoaSkgKChUZTBbKGkpICYgMHhmZl0gPj4gOCkgJiAweDAwMDAwMGZmKQotI2RlZmluZSBURTQyMShpKSAoKFRlMFsoKGkpID4+IDE2KSAmIDB4ZmZdIDw8IDgpICYgMHhmZjAwMDAwMCkKLSNkZWZpbmUgVEU0MzIoaSkgKFRlMFsoKGkpID4+IDgpICYgMHhmZl0gJiAweDAwZmYwMDAwKQotI2RlZmluZSBURTQ0MyhpKSAoVGUwWyhpKSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkKLSNkZWZpbmUgVEU0MTQoaSkgKChUZTBbKChpKSA+PiAyNCkgJiAweGZmXSA+PiA4KSAmIDB4MDAwMDAwZmYpCi0jZGVmaW5lIFRFNChpKSAoKFRlMFsoaSldID4+IDgpICYgMHgwMDAwMDBmZikKLQotI2RlZmluZSBURDAoaSkgVGQwWygoaSkgPj4gMjQpICYgMHhmZl0KLSNkZWZpbmUgVEQxKGkpIHJvdHIoVGQwWygoaSkgPj4gMTYpICYgMHhmZl0sIDgpCi0jZGVmaW5lIFREMihpKSByb3RyKFRkMFsoKGkpID4+IDgpICYgMHhmZl0sIDE2KQotI2RlZmluZSBURDMoaSkgcm90cihUZDBbKGkpICYgMHhmZl0sIDI0KQotI2RlZmluZSBURDQxKGkpIChUZDRzWygoaSkgPj4gMjQpICYgMHhmZl0gPDwgMjQpCi0jZGVmaW5lIFRENDIoaSkgKFRkNHNbKChpKSA+PiAxNikgJiAweGZmXSA8PCAxNikKLSNkZWZpbmUgVEQ0MyhpKSAoVGQ0c1soKGkpID4+IDgpICYgMHhmZl0gPDwgOCkKLSNkZWZpbmUgVEQ0NChpKSAoVGQ0c1soaSkgJiAweGZmXSkKLSNkZWZpbmUgVEQwXyhpKSBUZDBbKGkpICYgMHhmZl0KLSNkZWZpbmUgVEQxXyhpKSByb3RyKFRkMFsoaSkgJiAweGZmXSwgOCkKLSNkZWZpbmUgVEQyXyhpKSByb3RyKFRkMFsoaSkgJiAweGZmXSwgMTYpCi0jZGVmaW5lIFREM18oaSkgcm90cihUZDBbKGkpICYgMHhmZl0sIDI0KQotCi0jZGVmaW5lIEdFVFUzMihwdCkgKCgodTMyKShwdClbMF0gPDwgMjQpIF4gKCh1MzIpKHB0KVsxXSA8PCAxNikgXiBcCi0JCQkoKHUzMikocHQpWzJdIDw8ICA4KSBeICgodTMyKShwdClbM10pKQotCi0jZGVmaW5lIFBVVFUzMihjdCwgc3QpIHsgXAotKGN0KVswXSA9ICh1OCkoKHN0KSA+PiAyNCk7IChjdClbMV0gPSAodTgpKChzdCkgPj4gMTYpOyBcCi0oY3QpWzJdID0gKHU4KSgoc3QpID4+ICA4KTsgKGN0KVszXSA9ICh1OCkoc3QpOyB9Ci0KLSNkZWZpbmUgV1BBX0dFVF9CRTMyKGEpICgoKCh1MzIpIChhKVswXSkgPDwgMjQpIHwgKCgodTMyKSAoYSlbMV0pIDw8IDE2KSB8IFwKLQkJCSAoKCh1MzIpIChhKVsyXSkgPDwgOCkgfCAoKHUzMikgKGEpWzNdKSkKLQotI2RlZmluZSBXUEFfUFVUX0xFMTYoYSwgdmFsKQkJCVwKLQlkbyB7CQkJCQlcCi0JCShhKVsxXSA9ICgodTE2KSAodmFsKSkgPj4gODsJXAotCQkoYSlbMF0gPSAoKHUxNikgKHZhbCkpICYgMHhmZjsJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgV1BBX1BVVF9CRTMyKGEsIHZhbCkJCQkJCVwKLQlkbyB7CQkJCQkJCVwKLQkJKGEpWzBdID0gKHU4KSAoKCgodTMyKSAodmFsKSkgPj4gMjQpICYgMHhmZik7CVwKLQkJKGEpWzFdID0gKHU4KSAoKCgodTMyKSAodmFsKSkgPj4gMTYpICYgMHhmZik7CVwKLQkJKGEpWzJdID0gKHU4KSAoKCgodTMyKSAodmFsKSkgPj4gOCkgJiAweGZmKTsJXAotCQkoYSlbM10gPSAodTgpICgoKHUzMikgKHZhbCkpICYgMHhmZik7CQlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBXUEFfUFVUX0JFNjQoYSwgdmFsKQkJCQlcCi0JZG8gewkJCQkJCVwKLQkJKGEpWzBdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiA1Nik7CVwKLQkJKGEpWzFdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiA0OCk7CVwKLQkJKGEpWzJdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiA0MCk7CVwKLQkJKGEpWzNdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiAzMik7CVwKLQkJKGEpWzRdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiAyNCk7CVwKLQkJKGEpWzVdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiAxNik7CVwKLQkJKGEpWzZdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiA4KTsJXAotCQkoYSlbN10gPSAodTgpICgoKHU2NCkgKHZhbCkpICYgMHhmZik7CVwKLQl9IHdoaWxlICgwKQotCi0vKiA9PT09PSBzdGFydCAtIHB1YmxpYyBkb21haW4gU0hBMjU2IGltcGxlbWVudGF0aW9uID09PT09ICovCi0KLS8qIFRoaXMgaXMgYmFzZWQgb24gU0hBMjU2IGltcGxlbWVudGF0aW9uIGluIExpYlRvbUNyeXB0IHRoYXQgd2FzIHJlbGVhc2VkIGludG8KLSAqIHB1YmxpYyBkb21haW4gYnkgVG9tIFN0IERlbmlzLiAqLwotCi0vKiB0aGUgSyBhcnJheSAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgS1s2NF0gPSB7Ci0JMHg0MjhhMmY5OFVMLCAweDcxMzc0NDkxVUwsIDB4YjVjMGZiY2ZVTCwgMHhlOWI1ZGJhNVVMLCAweDM5NTZjMjViVUwsCi0JMHg1OWYxMTFmMVVMLCAweDkyM2Y4MmE0VUwsIDB4YWIxYzVlZDVVTCwgMHhkODA3YWE5OFVMLCAweDEyODM1YjAxVUwsCi0JMHgyNDMxODViZVVMLCAweDU1MGM3ZGMzVUwsIDB4NzJiZTVkNzRVTCwgMHg4MGRlYjFmZVVMLCAweDliZGMwNmE3VUwsCi0JMHhjMTliZjE3NFVMLCAweGU0OWI2OWMxVUwsIDB4ZWZiZTQ3ODZVTCwgMHgwZmMxOWRjNlVMLCAweDI0MGNhMWNjVUwsCi0JMHgyZGU5MmM2ZlVMLCAweDRhNzQ4NGFhVUwsIDB4NWNiMGE5ZGNVTCwgMHg3NmY5ODhkYVVMLCAweDk4M2U1MTUyVUwsCi0JMHhhODMxYzY2ZFVMLCAweGIwMDMyN2M4VUwsIDB4YmY1OTdmYzdVTCwgMHhjNmUwMGJmM1VMLCAweGQ1YTc5MTQ3VUwsCi0JMHgwNmNhNjM1MVVMLCAweDE0MjkyOTY3VUwsIDB4MjdiNzBhODVVTCwgMHgyZTFiMjEzOFVMLCAweDRkMmM2ZGZjVUwsCi0JMHg1MzM4MGQxM1VMLCAweDY1MGE3MzU0VUwsIDB4NzY2YTBhYmJVTCwgMHg4MWMyYzkyZVVMLCAweDkyNzIyYzg1VUwsCi0JMHhhMmJmZThhMVVMLCAweGE4MWE2NjRiVUwsIDB4YzI0YjhiNzBVTCwgMHhjNzZjNTFhM1VMLCAweGQxOTJlODE5VUwsCi0JMHhkNjk5MDYyNFVMLCAweGY0MGUzNTg1VUwsIDB4MTA2YWEwNzBVTCwgMHgxOWE0YzExNlVMLCAweDFlMzc2YzA4VUwsCi0JMHgyNzQ4Nzc0Y1VMLCAweDM0YjBiY2I1VUwsIDB4MzkxYzBjYjNVTCwgMHg0ZWQ4YWE0YVVMLCAweDViOWNjYTRmVUwsCi0JMHg2ODJlNmZmM1VMLCAweDc0OGY4MmVlVUwsIDB4NzhhNTYzNmZVTCwgMHg4NGM4NzgxNFVMLCAweDhjYzcwMjA4VUwsCi0JMHg5MGJlZmZmYVVMLCAweGE0NTA2Y2ViVUwsIDB4YmVmOWEzZjdVTCwgMHhjNjcxNzhmMlVMCi19OwotCi12b2lkIHJ0d19zZWNtaWNzZXRrZXkyM2Eoc3RydWN0IG1pY19kYXRhICpwbWljZGF0YSwgdTggKmtleSk7Ci12b2lkIHJ0d19zZWNtaWNhcHBlbmQyM2FieXRlMjNhKHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEsIHU4IGIpOwotdm9pZCBydHdfc2VjbWljYXBwZW5kMjNhKHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEsIHU4ICpzcmMsIHUzMiBuYkJ5dGVzKTsKLXZvaWQgcnR3X3NlY2dldG1pYzIzYShzdHJ1Y3QgbWljX2RhdGEgKnBtaWNkYXRhLCB1OCAqZHN0KTsKLQotdm9pZCBydHdfc2VjY2FsY3RraXBtaWMyM2EodTggKmtleSwgdTggKmhlYWRlciwgdTggKmRhdGEsIHUzMiBkYXRhX2xlbiwKLQkJCXU4ICpNaWNjb2RlLCB1OCBwcmlvcml0eWkpOwotCi1pbnQgcnR3X2Flc19lbmNyeXB0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSk7Ci1pbnQgcnR3X3RraXBfZW5jcnlwdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKTsKLXZvaWQgcnR3X3dlcF9lbmNyeXB0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpOwotaW50IHJ0d19hZXNfZGVjcnlwdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpOwotaW50IHJ0d190a2lwX2RlY3J5cHQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSk7Ci12b2lkIHJ0d193ZXBfZGVjcnlwdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSk7Ci0KLXZvaWQgcnR3X3VzZV90a2lwa2V5X2hhbmRsZXIyM2Eodm9pZCAqRnVuY3Rpb25Db250ZXh0KTsKLQotI2VuZGlmCS8qIF9fUlRMODcxWF9TRUNVUklUWV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19zcmVzZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfc3Jlc2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZmE4MjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19zcmVzZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfUlRXX1NSRVNFVF9DXwotI2RlZmluZSBfUlRXX1NSRVNFVF9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi1zdHJ1Y3Qgc3Jlc2V0X3ByaXYgewotCXN0cnVjdCBtdXRleAlzaWxlbnRyZXNldF9tdXRleDsKLQl1OAlzaWxlbnRfcmVzZXRfaW5wcm9ncmVzczsKLQl1bnNpZ25lZCBsb25nIGxhc3RfdHhfdGltZTsKLQl1bnNpZ25lZCBsb25nIGxhc3RfdHhfY29tcGxldGVfdGltZTsKLX07Ci0KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLQotdm9pZCBydHdfc3Jlc2V0X2luaXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0d19zcmVzZXRfcmVzZXRfdmFsdWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1ib29sIHJ0d19zcmVzZXRfaW5wcm9ncmVzcyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgc3Jlc2V0X3NldF90cmlnZ2VyX3BvaW50KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHMzMiB0Z3ApOwotdm9pZCBydHdfc3Jlc2V0X3Jlc2V0KHN0cnVjdCBydHdfYWRhcHRlciAqYWN0aXZlX2FkYXB0ZXIpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfdmVyc2lvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d192ZXJzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NDc3MzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d192ZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jZGVmaW5lIERSSVZFUlZFUlNJT04JInY0LjEuNl83MzM2LjIwMTMwNDI2IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d194bWl0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3htaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3ZDZkMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3htaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX1JUV19YTUlUX0hfCi0jZGVmaW5lIF9SVFdfWE1JVF9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi0jZGVmaW5lIE1BWF9YTUlUQlVGX1NaCQkyMDQ4Ci0jZGVmaW5lIE5SX1hNSVRCVUZGCQk0Ci0KLSNkZWZpbmUgWE1JVEJVRl9BTElHTl9TWgk1MTIKLQotLyogIHhtaXQgZXh0ZW5zaW9uIGJ1ZmYgZGVmaW5hdGlvbiAqLwotI2RlZmluZSBNQVhfWE1JVF9FWFRCVUZfU1oJMTUzNgotI2RlZmluZSBOUl9YTUlUX0VYVEJVRkYJCTMyCi0KLSNkZWZpbmUgTUFYX05VTUJMS1MJCTEKLQotI2RlZmluZSBYTUlUX1ZPX1FVRVVFCQkwCi0jZGVmaW5lIFhNSVRfVklfUVVFVUUJCTEKLSNkZWZpbmUgWE1JVF9CRV9RVUVVRQkJMgotI2RlZmluZSBYTUlUX0JLX1FVRVVFCQkzCi0KLSNkZWZpbmUgVk9fUVVFVUVfSU5YCQkwCi0jZGVmaW5lIFZJX1FVRVVFX0lOWAkJMQotI2RlZmluZSBCRV9RVUVVRV9JTlgJCTIKLSNkZWZpbmUgQktfUVVFVUVfSU5YCQkzCi0jZGVmaW5lIEJDTl9RVUVVRV9JTlgJCTQKLSNkZWZpbmUgTUdUX1FVRVVFX0lOWAkJNQotI2RlZmluZSBISUdIX1FVRVVFX0lOWAkJNgotI2RlZmluZSBUWENNRF9RVUVVRV9JTlgJCTcKLQotI2RlZmluZSBIV19RVUVVRV9FTlRSWQkJOAotCi0jZGVmaW5lIFdFUF9JVihwYXR0cmliX2l2LCBkb3QxMXR4cG4sIGtleWlkeCkJCQkJXAotZG8gewkJCQkJCQkJCVwKLQlwYXR0cmliX2l2WzBdID0gZG90MTF0eHBuLl9ieXRlXy5UU0MwOwkJCQlcCi0JcGF0dHJpYl9pdlsxXSA9IGRvdDExdHhwbi5fYnl0ZV8uVFNDMTsJCQkJXAotCXBhdHRyaWJfaXZbMl0gPSBkb3QxMXR4cG4uX2J5dGVfLlRTQzI7CQkJCVwKLQlwYXR0cmliX2l2WzNdID0gKChrZXlpZHggJiAweDMpIDw8IDYpOwkJCQlcCi0JZG90MTF0eHBuLnZhbCA9IChkb3QxMXR4cG4udmFsID09IDB4ZmZmZmZmKSA/IDAgOgkJXAotCQkJIChkb3QxMXR4cG4udmFsKzEpOwkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFRLSVBfSVYocGF0dHJpYl9pdiwgZG90MTF0eHBuLCBrZXlpZHgpCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JcGF0dHJpYl9pdlswXSA9IGRvdDExdHhwbi5fYnl0ZV8uVFNDMTsJCQkJXAotCXBhdHRyaWJfaXZbMV0gPSAoZG90MTF0eHBuLl9ieXRlXy5UU0MxIHwgMHgyMCkgJiAweDdmOwkJXAotCXBhdHRyaWJfaXZbMl0gPSBkb3QxMXR4cG4uX2J5dGVfLlRTQzA7CQkJCVwKLQlwYXR0cmliX2l2WzNdID0gQklUKDUpIHwgKChrZXlpZHggJiAweDMpPDw2KTsJCQlcCi0JcGF0dHJpYl9pdls0XSA9IGRvdDExdHhwbi5fYnl0ZV8uVFNDMjsJCQkJXAotCXBhdHRyaWJfaXZbNV0gPSBkb3QxMXR4cG4uX2J5dGVfLlRTQzM7CQkJCVwKLQlwYXR0cmliX2l2WzZdID0gZG90MTF0eHBuLl9ieXRlXy5UU0M0OwkJCQlcCi0JcGF0dHJpYl9pdls3XSA9IGRvdDExdHhwbi5fYnl0ZV8uVFNDNTsJCQkJXAotCWRvdDExdHhwbi52YWwgPSBkb3QxMXR4cG4udmFsID09IDB4ZmZmZmZmZmZmZmZmVUxMID8gMCA6CVwKLQkJCQkJIChkb3QxMXR4cG4udmFsKzEpOwkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBRVNfSVYocGF0dHJpYl9pdiwgZG90MTF0eHBuLCBrZXlpZHgpXAotZG8gewkJCQkJCQkJCVwKLQlwYXR0cmliX2l2WzBdID0gZG90MTF0eHBuLl9ieXRlXy5UU0MwOwkJCQlcCi0JcGF0dHJpYl9pdlsxXSA9IGRvdDExdHhwbi5fYnl0ZV8uVFNDMTsJCQkJXAotCXBhdHRyaWJfaXZbMl0gPSAwOwkJCQkJCVwKLQlwYXR0cmliX2l2WzNdID0gQklUKDUpIHwgKChrZXlpZHggJiAweDMpIDw8IDYpOwkJCVwKLQlwYXR0cmliX2l2WzRdID0gZG90MTF0eHBuLl9ieXRlXy5UU0MyOwkJCQlcCi0JcGF0dHJpYl9pdls1XSA9IGRvdDExdHhwbi5fYnl0ZV8uVFNDMzsJCQkJXAotCXBhdHRyaWJfaXZbNl0gPSBkb3QxMXR4cG4uX2J5dGVfLlRTQzQ7CQkJCVwKLQlwYXR0cmliX2l2WzddID0gZG90MTF0eHBuLl9ieXRlXy5UU0M1OwkJCQlcCi0JZG90MTF0eHBuLnZhbCA9IGRvdDExdHhwbi52YWwgPT0gMHhmZmZmZmZmZmZmZmZVTEwgPyAwIDoJXAotCQkJCQkgKGRvdDExdHhwbi52YWwrMSk7CQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEhXWE1JVF9FTlRSWQk0Ci0KLSNkZWZpbmUgVFhERVNDX1NJWkUgMzIKLQotI2RlZmluZSBQQUNLRVRfT0ZGU0VUX1NaIDgKLSNkZWZpbmUgVFhERVNDX09GRlNFVCAoVFhERVNDX1NJWkUgKyBQQUNLRVRfT0ZGU0VUX1NaKQotCi1zdHJ1Y3QgdHhfZGVzYyB7Ci0JLyogRFdPUkQgMCAqLwotCV9fbGUzMiB0eGR3MDsKLQlfX2xlMzIgdHhkdzE7Ci0JX19sZTMyIHR4ZHcyOwotCV9fbGUzMiB0eGR3MzsKLQlfX2xlMzIgdHhkdzQ7Ci0JX19sZTMyIHR4ZHc1OwotCV9fbGUzMiB0eGR3NjsKLQlfX2xlMzIgdHhkdzc7Ci19OwotCi11bmlvbiB0eGRlc2MgewotCXN0cnVjdCB0eF9kZXNjIHR4ZGVzYzsKLQl1bnNpZ25lZCBpbnQgdmFsdWVbVFhERVNDX1NJWkU+PjJdOwotfTsKLQotc3RydWN0CWh3X3htaXQJewotCXN0cnVjdCBydHdfcXVldWUgKnN0YV9xdWV1ZTsKLQlpbnQJYWNjbnQ7Ci19OwotCi0vKiByZWR1Y2Ugc2l6ZSAqLwotc3RydWN0IHBrdF9hdHRyaWIgewotCXUxNgl0eXBlOwotCXU4CWJzd2VuYzsKLQl1OAlkaGNwX3BrdDsKLQl1MTYJZXRoZXJfdHlwZTsKLQl1MTYJc2VxbnVtOwotCXUxNglwa3RfaGRybGVuOwkvKiB0aGUgb3JpZ2luYWwgODAyLjMgcGt0IGhlYWRlciBsZW4gKi8KLQl1MTYJaGRybGVuOwkJLyogdGhlIFdMQU4gSGVhZGVyIExlbiAqLwotCXUzMglwa3RsZW47CQkvKiB0aGUgb3JpZ2luYWwgODAyLjMgcGt0IHJhd19kYXRhIGxlbiAqLwotCXUzMglsYXN0X3R4Y21kc3o7Ci0JdTMyCWVuY3J5cHQ7CS8qIHdoZW4gMCBpbmRpY2F0ZSBubyBlbmNyeXB0LiAqLwotCXU4CW5yX2ZyYWdzOwotCXU4CWl2X2xlbjsKLQl1OAlpY3ZfbGVuOwotCXU4CWl2WzE4XTsKLQl1OAlpY3ZbMTZdOwotCXU4CXByaW9yaXR5OwotCXU4CWFja19wb2xpY3k7Ci0JdTgJbWFjX2lkOwotCXU4CXZjc19tb2RlOwkvKiB2aXJ0dWFsIGNhcnJpZXIgc2Vuc2UgbWV0aG9kICovCi0JdTgJZHN0W0VUSF9BTEVOXTsKLQl1OAlzcmNbRVRIX0FMRU5dOwotCXU4CXRhW0VUSF9BTEVOXTsKLQl1OAlyYVtFVEhfQUxFTl07Ci0JdTgJa2V5X2lkeDsKLQl1OAlxb3NfZW47Ci0JdTgJaHRfZW47Ci0JdTgJcmFpZDsvKiByYXRlIGFkcGF0aXZlIGlkICovCi0JdTgJYndtb2RlOwotCXU4CWNoX29mZnNldDsvKiBQUklNRV9DSE5MX09GRlNFVCAqLwotCXU4CXNnaTsvKiBzaG9ydCBHSSAqLwotCXU4CWFtcGR1X2VuOy8qIHR4IGFtcGR1IGVuYWJsZSAqLwotCXU4CW1kYXRhOy8qIG1vcmUgZGF0YSBiaXQgKi8KLQl1OAlwY3RybDsvKiBwZXIgcGFja2V0IHR4ZGVzYyBjb250cm9sIGVuYWJsZSAqLwotCXU4CXRyaWdnZXJlZDsvKiBmb3IgYXAgbW9kZSBoYW5kbGluZyBQb3dlciBTYXZpbmcgc3RhICovCi0JdTgJcXNlbDsKLQl1OAllb3NwOwotCXU4CXJhdGU7Ci0JdTgJcmV0cnlfY3RybDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci19OwotCi0jZGVmaW5lIFdMQU5IRFJfT0ZGU0VUCQk2NAotCi0jZGVmaW5lIE5VTExfRlJBTUVUQUcJCTB4MAotI2RlZmluZSBEQVRBX0ZSQU1FVEFHCQkweDAxCi0jZGVmaW5lIEwyX0ZSQU1FVEFHCQkweDAyCi0jZGVmaW5lIE1HTlRfRlJBTUVUQUcJCTB4MDMKLSNkZWZpbmUgQU1TRFVfRlJBTUVUQUcJCTB4MDQKLQotI2RlZmluZSBFSUlfRlJBTUVUQUcJCTB4MDUKLSNkZWZpbmUgSUVFRTgwMjNfRlJBTUVUQUcgCTB4MDYKLQotI2RlZmluZSBNUF9GUkFNRVRBRwkJMHgwNwotCi0jZGVmaW5lIFRYQUdHX0ZSQU1FVEFHCQkweDA4Ci0KLXN0cnVjdCAgc3VibWl0X2N0eCB7Ci0JdTMyIHRpbWVvdXRfbXM7IC8qIDwwOiBub3Qgc3luY2hyb25vdXMsIDA6IHdhaXQgZm9yZXZlciwKLQkJCSAqID4wOiB1cCB0byBtcyB3YWl0aW5nCi0JCQkgKi8KLQlpbnQgc3RhdHVzOyAvKiBzdGF0dXMgZm9yIG9wZXJhdGlvbiAqLwotCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7Ci19OwotCi1lbnVtIHsKLQlSVFdfU0NUWF9TVUJNSVRURUQgPSAtMSwKLQlSVFdfU0NUWF9ET05FX1NVQ0NFU1MgPSAwLAotCVJUV19TQ1RYX0RPTkVfVU5LTk9XTiwKLQlSVFdfU0NUWF9ET05FX1RJTUVPVVQsCi0JUlRXX1NDVFhfRE9ORV9CVUZfQUxMT0MsCi0JUlRXX1NDVFhfRE9ORV9CVUZfRlJFRSwKLQlSVFdfU0NUWF9ET05FX1dSSVRFX1BPUlRfRVJSLAotCVJUV19TQ1RYX0RPTkVfVFhfREVTQ19OQSwKLQlSVFdfU0NUWF9ET05FX1RYX0RFTlksCi0JUlRXX1NDVFhfRE9ORV9DQ1hfUEtUX0ZBSUwsCi0JUlRXX1NDVFhfRE9ORV9EUlZfU1RPUCwKLQlSVFdfU0NUWF9ET05FX0RFVl9SRU1PVkUsCi19OwotCi12b2lkIHJ0d19zY3R4X2luaXQyM2Eoc3RydWN0IHN1Ym1pdF9jdHggKnNjdHgsIGludCB0aW1lb3V0X21zKTsKLWludCBydHdfc2N0eF93YWl0MjNhKHN0cnVjdCBzdWJtaXRfY3R4ICpzY3R4KTsKLXZvaWQgcnR3MjNhX3NjdHhfZG9uZV9lcnIoc3RydWN0IHN1Ym1pdF9jdHggKipzY3R4LCBpbnQgc3RhdHVzKTsKLQotc3RydWN0IHhtaXRfYnVmIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3QsIGxpc3QyOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXI7Ci0KLQl1OCAqcGFsbG9jYXRlZF9idWY7Ci0JdTggKnBidWY7Ci0Jdm9pZCAqcHJpdl9kYXRhOwotCi0JdTE2IGV4dF90YWc7IC8qICAwOiBOb3JtYWwgeG1pdGJ1ZiwgMTogZXh0ZW5zaW9uIHhtaXRidWYuICovCi0JdTE2IGZsYWdzOwotCXUzMiBhbGxvY19zejsKLQl1MzIgIGxlbjsKLQlzdHJ1Y3Qgc3VibWl0X2N0eCAqc2N0eDsKLQl1MzIJZmZfaHdhZGRyOwotCXN0cnVjdCB1cmIgKnB4bWl0X3VyYls4XTsKLQl1OCBicGVuZGluZ1s4XTsKLQlpbnQgbGFzdFs4XTsKLSNpZiBkZWZpbmVkKERCR19YTUlUX0JVRikgfHwgZGVmaW5lZChEQkdfWE1JVF9CVUZfRVhUKQotCXU4IG5vOwotI2VuZGlmCi19OwotCi1zdHJ1Y3QgeG1pdF9mcmFtZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCXN0cnVjdCBwa3RfYXR0cmliIGF0dHJpYjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwotCWludAlmcmFtZV90YWc7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcjsKLQl1OAkqYnVmX2FkZHI7Ci0Jc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZjsKLQotCXM4CXBrdF9vZmZzZXQ7Ci0KLQl1OCBhY2tfcmVwb3J0OwotCi0JdTggZXh0X3RhZzsgLyogMDpkYXRhLCAxOm1nbXQgKi8KLX07Ci0KLXN0cnVjdCB0eF9zZXJ2cSB7Ci0Jc3RydWN0IGxpc3RfaGVhZAl0eF9wZW5kaW5nOwotCXN0cnVjdCBydHdfcXVldWUJc3RhX3BlbmRpbmc7Ci0JaW50IHFjbnQ7Ci19OwotCi1zdHJ1Y3Qgc3RhX3htaXRfcHJpdiB7Ci0Jc3BpbmxvY2tfdAlsb2NrOwotCWludAlvcHRpb247Ci0JaW50CWFwc2Rfc2V0dGluZzsJLyogV2hlbiBiaXQgbWFzayBpcyBvbiwgdGhlIGFzc29jaWF0ZWQgZWRjYQotCQkJCSAqIHF1ZXVlIHN1cHBvcnRzIEFQU0QuCi0JCQkJICovCi0Jc3RydWN0IHR4X3NlcnZxCWJlX3E7CQkJLyogcHJpb3JpdHkgPT0gMCwzICovCi0Jc3RydWN0IHR4X3NlcnZxCWJrX3E7CQkJLyogcHJpb3JpdHkgPT0gMSwyICovCi0Jc3RydWN0IHR4X3NlcnZxCXZpX3E7CQkJLyogcHJpb3JpdHkgPT0gNCw1ICovCi0Jc3RydWN0IHR4X3NlcnZxCXZvX3E7CQkJLyogcHJpb3JpdHkgPT0gNiw3ICovCi0Jc3RydWN0IGxpc3RfaGVhZCBsZWdhY3lfZHo7Ci0Jc3RydWN0IGxpc3RfaGVhZCBhcHNkOwotCXUxNiB0eHNlcV90aWRbMTZdOwotfTsKLQotc3RydWN0CWh3X3R4cXVldWUgewotCXZvbGF0aWxlIGludCBoZWFkOwotCXZvbGF0aWxlIGludCB0YWlsOwotCXZvbGF0aWxlIGludCBmcmVlX3N6OwkvKiBpbiB1bml0cyBvZiA2NCBieXRlcyAqLwotCXZvbGF0aWxlIGludCBmcmVlX2NtZHN6OwotCXZvbGF0aWxlIGludCB0eHN6WzhdOwotCXVpbnQJZmZfaHdhZGRyOwotCXVpbnQJY21kX2h3YWRkcjsKLQlpbnQJYWNfdGFnOwotfTsKLQotc3RydWN0IGFnZ19wa3RfaW5mbyB7Ci0JdTE2IG9mZnNldDsKLQl1MTYgcGt0X2xlbjsKLX07Ci0KLXN0cnVjdAl4bWl0X3ByaXYgewotCXNwaW5sb2NrX3QJbG9jazsKLQotCXN0cnVjdCBzZW1hcGhvcmUJeG1pdF9zZW1hOwotCXN0cnVjdCBzZW1hcGhvcmUJdGVybWluYXRlX3htaXR0aHJlYWRfc2VtYTsKLQotCXN0cnVjdCBydHdfcXVldWUJYmVfcGVuZGluZzsKLQlzdHJ1Y3QgcnR3X3F1ZXVlCWJrX3BlbmRpbmc7Ci0Jc3RydWN0IHJ0d19xdWV1ZQl2aV9wZW5kaW5nOwotCXN0cnVjdCBydHdfcXVldWUJdm9fcGVuZGluZzsKLQlzdHJ1Y3QgcnR3X3F1ZXVlCWJtX3BlbmRpbmc7Ci0KLQlpbnQgZnJlZV94bWl0ZnJhbWVfY250OwotCXN0cnVjdCBydHdfcXVldWUJZnJlZV94bWl0X3F1ZXVlOwotCi0JaW50IGZyZWVfeGZyYW1lX2V4dF9jbnQ7Ci0Jc3RydWN0IHJ0d19xdWV1ZSBmcmVlX3hmcmFtZV9leHRfcXVldWU7Ci0KLQl1aW50CWZyYWdfbGVuOwotCi0Jc3RydWN0IHJ0d19hZGFwdGVyCSphZGFwdGVyOwotCi0JdTY0CXR4X2J5dGVzOwotCXU2NAl0eF9wa3RzOwotCXU2NAl0eF9kcm9wOwotCXU2NAlsYXN0X3R4X2J5dGVzOwotCXU2NAlsYXN0X3R4X3BrdHM7Ci0KLQlzdHJ1Y3QgaHdfeG1pdCAqaHd4bWl0czsKLQl1OAlod3htaXRfZW50cnk7Ci0JdTgJdmNzOwotCXU4CW5xb3Nfc3NuOwotCi0JdTgJd21tX3BhcmFfc2VxWzRdOy8qIHNlcXVlbmNlIGZvciB3bW0gYWMgcGFyYW1ldGVyIHN0cmVuZ3RoIGZyb20KLQkJCQkgKiBsYXJnZSB0byBzbWFsbC4gaXQncyB2YWx1ZSBpcyAwLT52bywgMS0+dmksCi0JCQkJICogMi0+YmUsIDMtPmJrLgotCQkJCSAqLwotCi0Jc3RydWN0IHNlbWFwaG9yZQl0eF9yZXRldnQ7LyogYWxsIHR4IHJldHVybiBldmVudDsgKi8KLQotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB4bWl0X3Rhc2tsZXQ7Ci0KLQlzdHJ1Y3QgcnR3X3F1ZXVlIGZyZWVfeG1pdGJ1Zl9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHhtaXRidWZfbGlzdDsJCS8qIHRyYWNrIGJ1ZmZlcnMgZm9yIGNsZWFudXAgKi8KLQlzdHJ1Y3QgcnR3X3F1ZXVlIHBlbmRpbmdfeG1pdGJ1Zl9xdWV1ZTsKLQl1aW50IGZyZWVfeG1pdGJ1Zl9jbnQ7Ci0KLQlzdHJ1Y3QgcnR3X3F1ZXVlIGZyZWVfeG1pdF9leHRidWZfcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCB4bWl0ZXh0YnVmX2xpc3Q7CS8qIHRyYWNrIGJ1ZmZlcnMgZm9yIGNsZWFudXAgKi8KLQl1aW50IGZyZWVfeG1pdF9leHRidWZfY250OwotCi0JaW50CWFja190eDsKLQlzdHJ1Y3QgbXV0ZXggYWNrX3R4X211dGV4OwotCXN0cnVjdCBzdWJtaXRfY3R4IGFja190eF9vcHM7Ci0Jc3BpbmxvY2tfdCBsb2NrX3NjdHg7Ci19OwotCi1zdHJ1Y3QgeG1pdF9idWYgKnJ0d19hbGxvY194bWl0YnVmMjNhX2V4dChzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYpOwotczMyIHJ0d19mcmVlX3htaXRidWZfZXh0MjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwKLQkJCSBzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmKTsKLQotc3RydWN0IHhtaXRfYnVmICpydHdfYWxsb2NfeG1pdGJ1ZjIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYpOwotczMyIHJ0d19mcmVlX3htaXRidWYyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LCBzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmKTsKLQotdm9pZCBydHdfY291bnRfdHhfc3RhdHMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lLCBpbnQgc3opOwotdm9pZCBydHdfdXBkYXRlX3Byb3RlY3Rpb24yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmllLCB1aW50IGllX2xlbik7Ci1zdHJ1Y3QgeG1pdF9mcmFtZSAqcnR3X2FsbG9jX3htaXRmcmFtZTIzYV9leHQoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KTsKLXN0cnVjdCB4bWl0X2ZyYW1lICpydHdfYWxsb2NfeG1pdGZyYW1lMjNhX29uY2Uoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KTsKLXMzMiBydHdfZnJlZV94bWl0ZnJhbWUyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LAotCQkgICAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpOwotdm9pZCBydHdfZnJlZV94bWl0ZnJhbWVfcXVldWUyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LCBzdHJ1Y3QgcnR3X3F1ZXVlICpwZnJhbWVxdWV1ZSk7Ci1zdHJ1Y3QgdHhfc2VydnEgKnJ0d19nZXRfc3RhX3BlbmRpbmcyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgaW50IHVwLCB1OCAqYWMpOwotczMyIHJ0d194bWl0ZnJhbWVfZW5xdWV1ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSk7Ci1zdHJ1Y3QgeG1pdF9mcmFtZSAqcnR3X2RlcXVldWVfeGZyYW1lMjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwKLQkJCQkgICAgICBzdHJ1Y3QgaHdfeG1pdCAqcGh3eG1pdF9pLCBpbnQgZW50cnkpOwotczMyIHJ0d194bWl0MjNhX2NsYXNzaWZpZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKTsKLXMzMiBydHdfeG1pdGZyYW1lX2NvYWxlc2NlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpwa3QsCi0JCQkgICAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSk7Ci1zMzIgX3J0d19pbml0X2h3X3R4cXVldWUoc3RydWN0IGh3X3R4cXVldWUgKnBod190eHF1ZXVlLCB1OCBhY190YWcpOwotdm9pZCBfcnR3X2luaXRfc3RhX3htaXRfcHJpdjIzYShzdHJ1Y3Qgc3RhX3htaXRfcHJpdiAqcHN0YV94bWl0cHJpdik7Ci0KLXMzMiBydHdfdHhmcmFtZXNfcGVuZGluZzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXMzMiBydHdfdHhmcmFtZXNfc3RhX2FjX3BlbmRpbmcyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYik7Ci12b2lkIHJ0d19pbml0X2h3eG1pdHMyM2Eoc3RydWN0IGh3X3htaXQgKnBod3htaXQsIGludCBlbnRyeSk7Ci1pbnQgX3J0d19pbml0X3htaXRfcHJpdjIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsCi0JCQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgX3J0d19mcmVlX3htaXRfcHJpdjIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYpOwotdm9pZCBydHdfYWxsb2NfaHd4bWl0czIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnR3X2ZyZWVfaHd4bWl0czIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWludCBydHdfeG1pdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KTsKLSNpZiBkZWZpbmVkKENPTkZJR184NzIzQVVfQVBfTU9ERSkKLWludCB4bWl0ZnJhbWVfZW5xdWV1ZV9mb3Jfc2xlZXBpbmdfc3RhMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKTsKLXZvaWQgc3RvcF9zdGFfeG1pdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpOwotdm9pZCB3YWtldXBfc3RhX3RvX3htaXQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKTsKLXZvaWQgeG1pdF9kZWxpdmVyeV9lbmFibGVkX2ZyYW1lczIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgc3RydWN0IHN0YV9pbmZvICpwc3RhKTsKLSNlbmRpZgotdTgJcW9zX2FjbTIzYSh1OCBhY21fbWFzaywgdTggcHJpb3JpdHkpOwotdTMyCXJ0d19nZXRfZmZfaHdhZGRyMjNhKHN0cnVjdCB4bWl0X2ZyYW1lCSpweG1pdGZyYW1lKTsKLWludCBydHdfYWNrX3R4X3dhaXQyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LCB1MzIgdGltZW91dF9tcyk7Ci0KLS8qIGluY2x1ZGUgYWZ0ZXIgZGVjbGFyaW5nIHN0cnVjdCB4bWl0X2J1ZiwgaW4gb3JkZXIgdG8gYXZvaWQgd2FybmluZyAqLwotI2luY2x1ZGUgPHhtaXRfb3NkZXAuaD4KLQotI2VuZGlmCS8qIF9SVEw4NzFYX1hNSVRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9zdGFfaW5mby5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3N0YV9pbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjYwMDUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3N0YV9pbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fU1RBX0lORk9fSF8KLSNkZWZpbmUgX19TVEFfSU5GT19IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHdpZmkuaD4KLQotI2RlZmluZSBJQlNTX1NUQVJUX01BQ19JRAkyCi0jZGVmaW5lIE5VTV9TVEEgMzIKLSNkZWZpbmUgTlVNX0FDTCAxNgotCi0KLS8qIGlmIG1vZGUgPT0wLCB0aGVuIHRoZSBzdGEgaXMgYWxsb3dlZCBvbmNlIHRoZSBhZGRyIGlzIGhpdC4gKi8KLS8qIGlmIG1vZGUgPT0xLCB0aGVuIHRoZSBzdGEgaXMgcmVqZWN0ZWQgb25jZSB0aGUgYWRkciBpcyBub24taGl0LiAqLwotc3RydWN0IHJ0d193bGFuX2FjbF9ub2RlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Ci0JdTggICAgICAgYWRkcltFVEhfQUxFTl07Ci0JdTggICAgICAgdmFsaWQ7Ci19OwotCi0vKiBtb2RlPTAsIGRpc2FibGUgKi8KLS8qIG1vZGU9MSwgYWNjZXB0IHVubGVzcyBpbiBkZW55IGxpc3QgKi8KLS8qIG1vZGU9MiwgZGVueSB1bmxlc3MgaW4gYWNjZXB0IGxpc3QgKi8KLXN0cnVjdCB3bGFuX2FjbF9wb29sIHsKLQlpbnQgbW9kZTsKLQlpbnQgbnVtOwotCXN0cnVjdCBydHdfd2xhbl9hY2xfbm9kZSBhY2xub2RlW05VTV9BQ0xdOwotCXN0cnVjdCBydHdfcXVldWUJYWNsX25vZGVfcTsKLX07Ci0KLXN0cnVjdCByc3NpX3N0YSAgewotCXMzMglVbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQlzMzIJVW5kZWNvcmF0ZWRTbW9vdGhlZENDSzsKLQlzMzIJVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE07Ci0JdTY0CVBhY2tldE1hcDsKLQl1OAlWYWxpZEJpdDsKLX07Ci0KLXN0cnVjdAlzdGFpbmZvX3N0YXRzCXsKLQl1NjQgcnhfbWdudF9wa3RzOwotCQl1NjQgcnhfYmVhY29uX3BrdHM7Ci0JCXU2NCByeF9wcm9iZXJlcV9wa3RzOwotCQl1NjQgcnhfcHJvYmVyc3BfcGt0czsKLQkJdTY0IHJ4X3Byb2JlcnNwX2JtX3BrdHM7Ci0JCXU2NCByeF9wcm9iZXJzcF91b19wa3RzOwotCXU2NCByeF9jdHJsX3BrdHM7Ci0JdTY0IHJ4X2RhdGFfcGt0czsKLQotCXU2NAlsYXN0X3J4X21nbnRfcGt0czsKLQkJdTY0IGxhc3RfcnhfYmVhY29uX3BrdHM7Ci0JCXU2NCBsYXN0X3J4X3Byb2JlcmVxX3BrdHM7Ci0JCXU2NCBsYXN0X3J4X3Byb2JlcnNwX3BrdHM7Ci0JCXU2NCBsYXN0X3J4X3Byb2JlcnNwX2JtX3BrdHM7Ci0JCXU2NCBsYXN0X3J4X3Byb2JlcnNwX3VvX3BrdHM7Ci0JdTY0CWxhc3RfcnhfY3RybF9wa3RzOwotCXU2NAlsYXN0X3J4X2RhdGFfcGt0czsKLQotCXU2NAlyeF9ieXRlczsKLQl1NjQJcnhfZHJvcHM7Ci0KLQl1NjQJdHhfcGt0czsKLQl1NjQJdHhfYnl0ZXM7Ci0JdTY0ICB0eF9kcm9wczsKLQotfTsKLQotc3RydWN0IHN0YV9pbmZvIHsKLQlzcGlubG9ja190CWxvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OyAvKiBmcmVlX3N0YV9xdWV1ZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQJaGFzaF9saXN0OyAvKiBzdGFfaGFzaCAqLwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXI7Ci0KLQlzdHJ1Y3Qgc3RhX3htaXRfcHJpdiBzdGFfeG1pdHByaXY7Ci0Jc3RydWN0IHN0YV9yZWN2X3ByaXYgc3RhX3JlY3Zwcml2OwotCi0Jc3RydWN0IHJ0d19xdWV1ZSBzbGVlcF9xOwotCXVuc2lnbmVkIGludCBzbGVlcHFfbGVuOwotCi0JdWludCBzdGF0ZTsKLQl1aW50IGFpZDsKLQl1aW50IG1hY19pZDsKLQl1aW50IHFvc19vcHRpb247Ci0JdTgJaHdhZGRyW0VUSF9BTEVOXTsKLQotCXVpbnQJaWVlZTgwMjF4X2Jsb2NrZWQ7CS8qIDA6IGFsbG93ZWQsIDE6YmxvY2tlZCAqLwotCXUzMglkb3QxMTgwMjFYUHJpdmFjeTsgLyogYWVzLCB0a2lwLi4uICovCi0JdW5pb24gS2V5dHlwZQlkb3QxMXRraXB0eG1pY2tleTsKLQl1bmlvbiBLZXl0eXBlCWRvdDExdGtpcHJ4bWlja2V5OwotCXVuaW9uIEtleXR5cGUJZG90MTE4MDIxeF9VbmNzdEtleTsKLQl1bmlvbiBwbjQ4CQlkb3QxMXR4cG47CQkJLyogIFBONDggdXNlZCBmb3IgVW5pY2FzdCB4bWl0LiAqLwotCXVuaW9uIHBuNDgJCWRvdDExcnhwbjsJCQkvKiAgUE40OCB1c2VkIGZvciBVbmljYXN0IHJlY3YuICovCi0KLQotCXU4CWJzc3JhdGVzZXRbMTZdOwotCXUzMglic3NyYXRlbGVuOwotCXMzMiAgcnNzaTsKLQlzMzIJc2lnbmFsX3F1YWxpdHk7Ci0KLQl1OAljdHMyc2VsZjsKLQl1OAlydHNlbjsKLQotCXU4CXJhaWQ7Ci0JdTgJaW5pdF9yYXRlOwotCXUzMglyYV9tYXNrOwotCXU4CXdpcmVsZXNzX21vZGU7CS8qICBORVRXT1JLX1RZUEUgKi8KLQlzdHJ1Y3Qgc3RhaW5mb19zdGF0cyBzdGFfc3RhdHM7Ci0KLQkvKiBmb3IgQS1NUERVIFRYLCBBRERCQSB0aW1lb3V0IGNoZWNrICovCi0Jc3RydWN0IHRpbWVyX2xpc3QgYWRkYmFfcmV0cnlfdGltZXI7Ci0KLQkvKiBmb3IgQS1NUERVIFJ4IHJlb3JkZXJpbmcgYnVmZmVyIGNvbnRyb2wgKi8KLQlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgcmVjdnJlb3JkZXJfY3RybFsxNl07Ci0KLQkvKiBmb3IgQS1NUERVIFR4ICovCi0JLyogdW5zaWduZWQgY2hhcgkJYW1wZHVfdHhlbl9iaXRtYXA7ICovCi0JdTE2CUJBX3N0YXJ0aW5nX3NlcWN0cmxbMTZdOwotCi0Jc3RydWN0IGh0X3ByaXYJaHRwcml2OwotCi0JLyogTm90ZXM6ICovCi0JLyogU1RBX01vZGU6ICovCi0JLyogY3Vycl9uZXR3b3JrKG1sbWVfcHJpdi9zZWN1cml0eV9wcml2L3Fvcy9odCkgKyBzdGFfaW5mbzogKFNUQSAmIEFQKSBDQVAvSU5GTyAqLwotCS8qIHNjYW5fcTogQVAgQ0FQL0lORk8gKi8KLQotCS8qIEFQX01vZGU6ICovCi0JLyogY3Vycl9uZXR3b3JrKG1sbWVfcHJpdi9zZWN1cml0eV9wcml2L3Fvcy9odCkgOiBBUCBDQVAvSU5GTyAqLwotCS8qIHN0YV9pbmZvOiAoQVAgJiBTVEEpIENBUC9JTkZPICovCi0KLQlzdHJ1Y3QgbGlzdF9oZWFkIGFzb2NfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGF1dGhfbGlzdDsKLQotCXVuc2lnbmVkIGludCBleHBpcmVfdG87Ci0JdW5zaWduZWQgaW50IGF1dGhfc2VxOwotCXVuc2lnbmVkIGludCBhdXRoYWxnOwotCXVuc2lnbmVkIGNoYXIgY2hnX3R4dFsxMjhdOwotCi0JdTE2IGNhcGFiaWxpdHk7Ci0JaW50IGZsYWdzOwotCi0JaW50IGRvdDgwMjF4YWxnOy8qIDA6ZGlzYWJsZSwgMTpwc2ssIDI6ODAyLjF4ICovCi0JaW50IHdwYV9wc2s7LyogMDpkaXNhYmxlLCBiaXQoMCk6IFdQQSwgYml0KDEpOldQQTIgKi8KLQlpbnQgd3BhX2dyb3VwX2NpcGhlcjsKLQlpbnQgd3BhMl9ncm91cF9jaXBoZXI7Ci0JaW50IHdwYV9wYWlyd2lzZV9jaXBoZXI7Ci0JaW50IHdwYTJfcGFpcndpc2VfY2lwaGVyOwotCi0JdTggYnBhaXJ3aXNlX2tleV9pbnN0YWxsZWQ7Ci0KLQl1OCB3cGFfaWVbMzJdOwotCi0JdTggbm9uZXJwX3NldDsKLQl1OCBub19zaG9ydF9zbG90X3RpbWVfc2V0OwotCXU4IG5vX3Nob3J0X3ByZWFtYmxlX3NldDsKLQl1OCBub19odF9nZl9zZXQ7Ci0JdTggbm9faHRfc2V0OwotCXU4IGh0XzIwbWh6X3NldDsKLQotCXVuc2lnbmVkIGludCB0eF9yYV9iaXRtYXA7Ci0JdTggcW9zX2luZm87Ci0KLQl1OCBtYXhfc3BfbGVuOwotCXU4IHVhcHNkX2JrOy8qIEJJVCgwKTogRGVsaXZlcnkgZW5hYmxlZCwgQklUKDEpOiBUcmlnZ2VyIGVuYWJsZWQgKi8KLQl1OCB1YXBzZF9iZTsKLQl1OCB1YXBzZF92aTsKLQl1OCB1YXBzZF92bzsKLQotCXU4IGhhc19sZWdhY3lfYWM7Ci0JdW5zaWduZWQgaW50IHNsZWVwcV9hY19sZW47Ci0KLQkvKiBwMnAgcHJpdiBkYXRhICovCi0JdTggaXNfcDJwX2RldmljZTsKLQl1OCBwMnBfc3RhdHVzX2NvZGU7Ci0KLQl1OCBrZWVwX2FsaXZlX3RyeWNudDsKLQotCS8qIHAycCBjbGllbnQgaW5mbyAqLwotCXU4IGRldl9hZGRyW0VUSF9BTEVOXTsKLQl1OCBkZXZfY2FwOwotCXUxNiBjb25maWdfbWV0aG9kczsKLQl1OCBwcmltYXJ5X2Rldl90eXBlWzhdOwotCXU4IG51bV9vZl9zZWNkZXZfdHlwZTsKLQl1OCBzZWNkZXZfdHlwZXNfbGlzdFszMl07LyogIDMyLzggPT0gNDsgKi8KLQl1MTYgZGV2X25hbWVfbGVuOwotCXU4IGRldl9uYW1lWzMyXTsKLQl1OCAqcGFzc29jX3JlcTsKLQl1MzIgYXNzb2NfcmVxX2xlbjsKLQotCS8qIGZvciBETSAqLwotCXN0cnVjdCByc3NpX3N0YQkgcnNzaV9zdGF0OwotCi0JLyogICovCi0JLyogID09PT09PT09PT09PT09PT1PRE0gUmVsYXRpdmUgSW5mbz09PT09PT09PT09PT09PT09PT09PT09ICovCi0JLyogIFBsZWFzZSBiZSBjYXJlLCBkb250IGRlY2xhcmUgdG9vIG11Y2ggc3RydWN0dXJlIGhlcmUuIEl0IHdpbGwgY29zdCBtZW1vcnkgKiBTVEEgc3VwcG9ydCBudW0uICovCi0JLyogICovCi0JLyogICovCi0JLyogIDIwMTEvMTAvMjAgTUggQWRkIGZvciBPRE0gU1RBIGluZm8uICovCi0JLyogICovCi0JLyogIERyaXZlciBXcml0ZSAqLwotCXU4CQliVmFsaWQ7CQkJCS8qICByZWNvcmQgdGhlIHN0YSBzdGF0dXMgbGluayBvciBub3Q/ICovCi0JdTgJCXJzc2lfbGV2ZWw7CQkJLyogZm9yIFJlZnJlc2ggUkEgbWFzayAqLwotCS8qICBPRE0gV3JpdGUgKi8KLQkvKiAxIFBIWV9TVEFUVVNfSU5GTyAqLwotCXU4CQlSU1NJX1BhdGhbNF07CQkvKiAgKi8KLQl1OAkJUlNTSV9BdmU7Ci0JdTgJCVJYRVZNWzRdOwotCXU4CQlSWFNOUls0XTsKLQotCS8qICBPRE0gV3JpdGUgKi8KLQkvKiAxIFRYX0lORk8gKG1heSBjaGFuZ2VkIGJ5IElDKSAqLwotCS8qICA9PT09PT09PT09PT09PT09T0RNIFJlbGF0aXZlIEluZm89PT09PT09PT09PT09PT09PT09PT09PSAqLwotCS8qICAqLwotCi0JLyogVG8gc3RvcmUgdGhlIHNlcXVlbmNlIG51bWJlciBvZiByZWNlaXZlZCBtYW5hZ2VtZW50IGZyYW1lICovCi0JdTE2IFJ4TWdtdEZyYW1lU2VxTnVtOwotfTsKLQotI2RlZmluZSBzdGFfcnhfcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMucnhfbWdudF9wa3RzIFwKLQkrIHN0YS0+c3RhX3N0YXRzLnJ4X2N0cmxfcGt0cyBcCi0JKyBzdGEtPnN0YV9zdGF0cy5yeF9kYXRhX3BrdHMpCi0KLSNkZWZpbmUgc3RhX2xhc3RfcnhfcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9tZ250X3BrdHMgXAotCSsgc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9jdHJsX3BrdHMgXAotCSsgc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9kYXRhX3BrdHMpCi0KLSNkZWZpbmUgc3RhX3J4X2RhdGFfcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMucnhfZGF0YV9wa3RzKQotCi0jZGVmaW5lIHN0YV9sYXN0X3J4X2RhdGFfcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9kYXRhX3BrdHMpCi0KLSNkZWZpbmUgc3RhX3J4X21nbnRfcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMucnhfbWdudF9wa3RzKQotCi0jZGVmaW5lIHN0YV9sYXN0X3J4X21nbnRfcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9tZ250X3BrdHMpCi0KLSNkZWZpbmUgc3RhX3J4X2JlYWNvbl9wa3RzKHN0YSkgXAotCShzdGEtPnN0YV9zdGF0cy5yeF9iZWFjb25fcGt0cykKLQotI2RlZmluZSBzdGFfbGFzdF9yeF9iZWFjb25fcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9iZWFjb25fcGt0cykKLQotI2RlZmluZSBzdGFfcnhfcHJvYmVyZXFfcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMucnhfcHJvYmVyZXFfcGt0cykKLQotI2RlZmluZSBzdGFfbGFzdF9yeF9wcm9iZXJlcV9wa3RzKHN0YSkgXAotCShzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X3Byb2JlcmVxX3BrdHMpCi0KLSNkZWZpbmUgc3RhX3J4X3Byb2JlcnNwX3BrdHMoc3RhKSBcCi0JKHN0YS0+c3RhX3N0YXRzLnJ4X3Byb2JlcnNwX3BrdHMpCi0KLSNkZWZpbmUgc3RhX2xhc3RfcnhfcHJvYmVyc3BfcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9wcm9iZXJzcF9wa3RzKQotCi0jZGVmaW5lIHN0YV9yeF9wcm9iZXJzcF9ibV9wa3RzKHN0YSkgXAotCShzdGEtPnN0YV9zdGF0cy5yeF9wcm9iZXJzcF9ibV9wa3RzKQotCi0jZGVmaW5lIHN0YV9sYXN0X3J4X3Byb2JlcnNwX2JtX3BrdHMoc3RhKSBcCi0JKHN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfcHJvYmVyc3BfYm1fcGt0cykKLQotI2RlZmluZSBzdGFfcnhfcHJvYmVyc3BfdW9fcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMucnhfcHJvYmVyc3BfdW9fcGt0cykKLQotI2RlZmluZSBzdGFfbGFzdF9yeF9wcm9iZXJzcF91b19wa3RzKHN0YSkgXAotCShzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X3Byb2JlcnNwX3VvX3BrdHMpCi0KLSNkZWZpbmUgc3RhX3VwZGF0ZV9sYXN0X3J4X3BrdHMoc3RhKSBcCi0JZG8geyBcCi0JCXN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfbWdudF9wa3RzID0gc3RhLT5zdGFfc3RhdHMucnhfbWdudF9wa3RzOyBcCi0JCXN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfYmVhY29uX3BrdHMgPSBzdGEtPnN0YV9zdGF0cy5yeF9iZWFjb25fcGt0czsgXAotCQlzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X3Byb2JlcmVxX3BrdHMgPSBzdGEtPnN0YV9zdGF0cy5yeF9wcm9iZXJlcV9wa3RzOyBcCi0JCXN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfcHJvYmVyc3BfcGt0cyA9IHN0YS0+c3RhX3N0YXRzLnJ4X3Byb2JlcnNwX3BrdHM7IFwKLQkJc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9wcm9iZXJzcF9ibV9wa3RzID0gc3RhLT5zdGFfc3RhdHMucnhfcHJvYmVyc3BfYm1fcGt0czsgXAotCQlzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X3Byb2JlcnNwX3VvX3BrdHMgPSBzdGEtPnN0YV9zdGF0cy5yeF9wcm9iZXJzcF91b19wa3RzOyBcCi0JCXN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfY3RybF9wa3RzID0gc3RhLT5zdGFfc3RhdHMucnhfY3RybF9wa3RzOyBcCi0JCXN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfZGF0YV9wa3RzID0gc3RhLT5zdGFfc3RhdHMucnhfZGF0YV9wa3RzOyBcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBTVEFfUlhfUEtUU19BUkcoc3RhKSBcCi0Jc3RhLT5zdGFfc3RhdHMucnhfbWdudF9wa3RzIFwKLQksIHN0YS0+c3RhX3N0YXRzLnJ4X2N0cmxfcGt0cyBcCi0JLCBzdGEtPnN0YV9zdGF0cy5yeF9kYXRhX3BrdHMKLQotI2RlZmluZSBTVEFfTEFTVF9SWF9QS1RTX0FSRyhzdGEpIFwKLQlzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X21nbnRfcGt0cywgXAotCXN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfY3RybF9wa3RzLCBcCi0Jc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9kYXRhX3BrdHMKLQotI2RlZmluZSBTVEFfUlhfUEtUU19ESUZGX0FSRyhzdGEpIFwKLQlzdGEtPnN0YV9zdGF0cy5yeF9tZ250X3BrdHMgLSBzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X21nbnRfcGt0cywgXAotCXN0YS0+c3RhX3N0YXRzLnJ4X2N0cmxfcGt0cyAtIHN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfY3RybF9wa3RzLCBcCi0Jc3RhLT5zdGFfc3RhdHMucnhfZGF0YV9wa3RzIC0gc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9kYXRhX3BrdHMKLQotI2RlZmluZSBTVEFfUEtUU19GTVQgIihtOiVsbHUsIGM6JWxsdSwgZDolbGx1KSIKLQotc3RydWN0IHN0YV9wcml2IHsKLQlzcGlubG9ja190IHN0YV9oYXNoX2xvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZCBzdGFfaGFzaFtOVU1fU1RBXTsKLQlpbnQgYXNvY19zdGFfY291bnQ7Ci0KLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyOwotCXN0cnVjdCBsaXN0X2hlYWQgYXNvY19saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgYXV0aF9saXN0OwotCXNwaW5sb2NrX3QgYXNvY19saXN0X2xvY2s7Ci0Jc3BpbmxvY2tfdCBhdXRoX2xpc3RfbG9jazsKLQl1OCBhc29jX2xpc3RfY250OwotCXU4IGF1dGhfbGlzdF9jbnQ7Ci0KLQl1bnNpZ25lZCBpbnQgYXV0aF90bzsgIC8qIHNlYywgdGltZSB0byBleHBpcmUgaW4gYXV0aGVudGljYXRpbmcuICovCi0JdW5zaWduZWQgaW50IGFzc29jX3RvOyAvKiBzZWMsIHRpbWUgdG8gZXhwaXJlIGJlZm9yZSBhc3NvY2lhdGluZy4gKi8KLQl1bnNpZ25lZCBpbnQgZXhwaXJlX3RvOyAvKiBzZWMgLCB0aW1lIHRvIGV4cGlyZSBhZnRlciBhc3NvY2lhdGVkLiAqLwotCi0JLyogcG9pbnRlcnMgdG8gU1RBIGluZm87IGJhc2VkIG9uIGFsbG9jYXRlZCBBSUQgb3IgTlVMTCBpZiBBSUQgZnJlZQotCSAqIEFJRCBpcyBpbiB0aGUgcmFuZ2UgMS0yMDA3LCBzbyBzdGFfYWlkWzBdIGNvcnJlc3BvbmRlcnMgdG8gQUlEIDEKLQkgKiBhbmQgc28gb24KLQkgKi8KLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YV9haWRbTlVNX1NUQV07Ci0KLQl1MTYgc3RhX2R6X2JpdG1hcDsvKiBvbmx5IHN1cHBvcnQgMTUgc3RhdGlvbnMsIHN0YXRpb24gYWlkIGJpdG1hcAotCQkJICAgKiBmb3Igc2xlZXBpbmcgc3RhLiAqLwotCXUxNiB0aW1fYml0bWFwOy8qIG9ubHkgc3VwcG9ydCAxNSBzdGF0aW9ucywKLQkJCSogYWlkPTB+MTUgbWFwcGluZyBiaXQwfmJpdDE1ICovCi0KLQl1MTYgbWF4X251bV9zdGE7Ci0KLQlzdHJ1Y3Qgd2xhbl9hY2xfcG9vbCBhY2xfbGlzdDsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIHdpZmlfbWFjX2hhc2goY29uc3QgdTggKm1hYykKLXsKLQl1MzIgeDsKLQotCXggPSBtYWNbMF07Ci0JeCA9ICh4IDw8IDIpIF4gbWFjWzFdOwotCXggPSAoeCA8PCAyKSBeIG1hY1syXTsKLQl4ID0gKHggPDwgMikgXiBtYWNbM107Ci0JeCA9ICh4IDw8IDIpIF4gbWFjWzRdOwotCXggPSAoeCA8PCAyKSBeIG1hY1s1XTsKLQotCXggXj0geCA+PiA4OwotCXggID0geCAmIChOVU1fU1RBIC0gMSk7Ci0KLQlyZXR1cm4geDsKLX0KLQotaW50IF9ydHdfaW5pdF9zdGFfcHJpdjIzYShzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2KTsKLWludCBfcnR3X2ZyZWVfc3RhX3ByaXYyM2Eoc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdik7Ci0KLXN0cnVjdCBzdGFfaW5mbyAqcnR3X2FsbG9jX3N0YWluZm8yM2Eoc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiwgY29uc3QgdTggKmh3YWRkciwgZ2ZwX3QgZ2ZwKTsKLWludCBydHdfZnJlZV9zdGFpbmZvMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci12b2lkIHJ0d19mcmVlX2FsbF9zdGFpbmZvMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotc3RydWN0IHN0YV9pbmZvICpydHdfZ2V0X3N0YWluZm8yM2Eoc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiwgY29uc3QgdTggKmh3YWRkcik7Ci1pbnQgcnR3X2luaXRfYmNtY19zdGFpbmZvMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotc3RydWN0IHN0YV9pbmZvICpydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWJvb2wgcnR3X2FjY2Vzc19jdHJsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICptYWNfYWRkcik7Ci0KLSNlbmRpZiAvKiBfU1RBX0lORk9fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS91c2Jfb3BzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvdXNiX29wcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjExZTEzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS91c2Jfb3BzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19VU0JfT1BTX0hfCi0jZGVmaW5lIF9fVVNCX09QU19IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPG9zZGVwX2ludGYuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLSNkZWZpbmUgUkVBTFRFS19VU0JfVkVOUVRfUkVBRAkJMHhDMAotI2RlZmluZSBSRUFMVEVLX1VTQl9WRU5RVF9XUklURQkJMHg0MAotI2RlZmluZSBSRUFMVEVLX1VTQl9WRU5RVF9DTURfUkVRCTB4MDUKLSNkZWZpbmUgUkVBTFRFS19VU0JfVkVOUVRfQ01EX0lEWAkweDAwCi0KLWVudW0gewotCVZFTkRPUl9XUklURSA9IDB4MDAsCi0JVkVORE9SX1JFQUQgPSAweDAxLAotfTsKLQotI2RlZmluZSBBTElHTk1FTlRfVU5JVAkJCQkxNgotI2RlZmluZSBNQVhfVkVORE9SX1JFUV9DTURfU0laRQkyNTQJCS8qIDgxODhjdSBTSUUgU3VwcG9ydCAqLwotI2RlZmluZSBNQVhfVVNCX0lPX0NUTF9TSVpFCShNQVhfVkVORE9SX1JFUV9DTURfU0laRSArQUxJR05NRU5UX1VOSVQpCi0KLXZvaWQgcnRsODcyM2F1X3NldF9od190eXBlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIHJ0bDg3MjNhdV9yZWN2X3Rhc2tsZXQodm9pZCAqcHJpdik7Ci0KLXZvaWQgcnRsODcyM2F1X3htaXRfdGFza2xldCh2b2lkICpwcml2KTsKLQotLyogSW5jcmVhc2UgYW5kIGNoZWNrIGlmIHRoZSBjb250aW51YWxfdXJiX2Vycm9yIG9mIHRoaXMgQHBhcmFtIGR2b2JqcHJpdmUgaXMKLSAqIGxhcmdlciB0aGFuIE1BWF9DT05USU5VQUxfVVJCX0VSUi4gUmV0dXJuIHJlc3VsdAotICovCi1zdGF0aWMgaW5saW5lIGludCBydHdfaW5jX2FuZF9jaGtfY29udGludWFsX3VyYl9lcnJvcihzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmopCi17Ci0JaW50IHJldCA9IGZhbHNlOwotCWludCB2YWx1ZTsKLQotCXZhbHVlID0gYXRvbWljX2luY19yZXR1cm4oJmR2b2JqLT5jb250aW51YWxfdXJiX2Vycm9yKTsKLQlpZiAodmFsdWUgPiBNQVhfQ09OVElOVUFMX1VSQl9FUlIpIHsKLQkJREJHXzg3MjNBKCJbZHZvYmo6JXBdW0VSUk9SXSBjb250aW51YWxfdXJiX2Vycm9yOiVkID4gJWRcbiIsCi0JCQkgIGR2b2JqLCB2YWx1ZSwgTUFYX0NPTlRJTlVBTF9VUkJfRVJSKTsKLQkJcmV0ID0gdHJ1ZTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogU2V0IHRoZSBjb250aW51YWxfdXJiX2Vycm9yIG9mIHRoaXMgQHBhcmFtIGR2b2JqcHJpdmUgdG8gMCAqLwotc3RhdGljIGlubGluZSB2b2lkIHJ0d19yZXNldF9jb250aW51YWxfdXJiX2Vycm9yKHN0cnVjdCBkdm9ial9wcml2ICpkdm9iaikKLXsKLQlhdG9taWNfc2V0KCZkdm9iai0+Y29udGludWFsX3VyYl9lcnJvciwgMCk7Ci19Ci0KLWJvb2wgcnRsODcyM2F1X2NoaXBfY29uZmlndXJlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0jZW5kaWYgLyogX19VU0JfT1BTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvdXNiX29wc19saW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3VzYl9vcHNfbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYyZjE0Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvdXNiX29wc19saW51eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fVVNCX09QU19MSU5VWF9IX18KLSNkZWZpbmUgX19VU0JfT1BTX0xJTlVYX0hfXwotCi0jZGVmaW5lIFZFTkRPUl9DTURfTUFYX0RBVEFfTEVOCTI1NAotCi0jZGVmaW5lIFJUV19VU0JfQ09OVFJPTF9NU0dfVElNRU9VVAk1MDAvKiBtcyAqLwotCi0jZGVmaW5lIE1BWF9VU0JDVFJMX1ZFTkRPUlJFUV9USU1FUwkxMAotCi1pbnQgcnRsODcyM2F1X3JlYWRfcG9ydChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBjbnQsCi0JCQlzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmKTsKLXZvaWQgcnRsODcyM2F1X3JlYWRfcG9ydF9jYW5jZWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1pbnQgcnRsODcyM2F1X3dyaXRlX3BvcnQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIGFkZHIsIHUzMiBjbnQsCi0JCQkgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1Zik7Ci12b2lkIHJ0bDg3MjNhdV93cml0ZV9wb3J0X2NhbmNlbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWludCBydGw4NzIzYXVfcmVhZF9pbnRlcnJ1cHQoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLQotdTggcnRsODcyM2F1X3JlYWQ4KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyKTsKLXUxNiBydGw4NzIzYXVfcmVhZDE2KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyKTsKLXUzMiBydGw4NzIzYXVfcmVhZDMyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyKTsKLWludCBydGw4NzIzYXVfd3JpdGU4KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyLCB1OCB2YWwpOwotaW50IHJ0bDg3MjNhdV93cml0ZTE2KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyLCB1MTYgdmFsKTsKLWludCBydGw4NzIzYXVfd3JpdGUzMihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgYWRkciwgdTMyIHZhbCk7Ci1pbnQgcnRsODcyM2F1X3dyaXRlTihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgIHUxNiBhZGRyLCB1MTYgbGVuZ3RoLCB1OCAqcGRhdGEpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS93aWZpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvd2lmaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWQ1NzNjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS93aWZpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX1dJRklfSF8KLSNkZWZpbmUgX1dJRklfSF8KLQotLyogIFRoaXMgdmFsdWUgaXMgdGVzdGVkIGJ5IFdpRmkgMTFuIFRlc3QgUGxhbiA1LjIuMy4KLSAqICBUaGlzIHRlc3QgdmVyaWZpZXMgdGhlIFdMQU4gTklDIGNhbiB1cGRhdGUgdGhlIE5BViB0aHJvdWdoIHNlbmRpbmcKLSAqICB0aGUgQ1RTIHdpdGggbGFyZ2UgZHVyYXRpb24uCi0gKi8KLSNkZWZpbmUJV2lGaU5hdlVwcGVyVXMJCTMwMDAwCS8qICAzMCBtcyAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkJQmVsb3cgaXMgdGhlIGRlZmluaXRpb24gZm9yIDgwMi4xMW4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0cnVjdCBBQ19wYXJhbSB7Ci0JdTgJCQlBQ0lfQUlGU047Ci0JdTgJCQlDVzsKLQlfX2xlMTYJCQlUWE9QX2xpbWl0OwotfSAgX19wYWNrZWQ7Ci0KLXN0cnVjdCBXTU1fcGFyYV9lbGVtZW50IHsKLQl1bnNpZ25lZCBjaGFyCQlRb1NfaW5mbzsKLQl1bnNpZ25lZCBjaGFyCQlyZXNlcnZlZDsKLQlzdHJ1Y3QgQUNfcGFyYW0JYWNfcGFyYW1bNF07Ci19ICBfX3BhY2tlZDsKLQotc3RydWN0IEFEREJBX3JlcXVlc3QgewotCXU4CQlkaWFsb2dfdG9rZW47Ci0JX19sZTE2CQlCQV9wYXJhX3NldDsKLQlfX2xlMTYJCUJBX3RpbWVvdXRfdmFsdWU7Ci0JX19sZTE2CQlCQV9zdGFydGluZ19zZXFjdHJsOwotfSAgX19wYWNrZWQ7Ci0KLQotLyoJPT09PT09PT09PT09PT09V1BTIFNlY3Rpb249PT09PT09PT09PT09PT0gKi8KLS8qCVdQUyBhdHRyaWJ1dGUgSUQgKi8KLSNkZWZpbmUgV1BTX0FUVFJfVkVSMQkJCQkweDEwNEEKLSNkZWZpbmUgV1BTX0FUVFJfU0lNUExFX0NPTkZfU1RBVEUJCTB4MTA0NAotI2RlZmluZSBXUFNfQVRUUl9SRVNQX1RZUEUJCQkweDEwM0IKLSNkZWZpbmUgV1BTX0FUVFJfVVVJRF9FCQkJCTB4MTA0NwotI2RlZmluZSBXUFNfQVRUUl9NQU5VRkFDVFVSRVIJCQkweDEwMjEKLSNkZWZpbmUgV1BTX0FUVFJfTU9ERUxfTkFNRQkJCTB4MTAyMwotI2RlZmluZSBXUFNfQVRUUl9NT0RFTF9OVU1CRVIJCQkweDEwMjQKLSNkZWZpbmUgV1BTX0FUVFJfU0VSSUFMX05VTUJFUgkJCTB4MTA0MgotI2RlZmluZSBXUFNfQVRUUl9QUklNQVJZX0RFVl9UWVBFCQkweDEwNTQKLSNkZWZpbmUgV1BTX0FUVFJfU0VDX0RFVl9UWVBFX0xJU1QJCTB4MTA1NQotI2RlZmluZSBXUFNfQVRUUl9ERVZJQ0VfTkFNRQkJCTB4MTAxMQotI2RlZmluZSBXUFNfQVRUUl9DT05GX01FVEhPRAkJCTB4MTAwOAotI2RlZmluZSBXUFNfQVRUUl9SRl9CQU5EUwkJCTB4MTAzQwotI2RlZmluZSBXUFNfQVRUUl9ERVZJQ0VfUFdJRAkJCTB4MTAxMgotI2RlZmluZSBXUFNfQVRUUl9SRVFVRVNUX1RZUEUJCQkweDEwM0EKLSNkZWZpbmUgV1BTX0FUVFJfQVNTT0NJQVRJT05fU1RBVEUJCTB4MTAwMgotI2RlZmluZSBXUFNfQVRUUl9DT05GSUdfRVJST1IJCQkweDEwMDkKLSNkZWZpbmUgV1BTX0FUVFJfVkVORE9SX0VYVAkJCTB4MTA0OQotI2RlZmluZSBXUFNfQVRUUl9TRUxFQ1RFRF9SRUdJU1RSQVIJCTB4MTA0MQotCi0vKglXUFMgQ29uZmlndXJhdGlvbiBNZXRob2QgKi8KLSNkZWZpbmUJV1BTX0NNX05PTkUJCQkJCTB4MDAwMAotI2RlZmluZQlXUFNfQ01fTEFCRUwJCQkJCTB4MDAwNAotI2RlZmluZQlXUFNfQ01fRElTUExZQQkJCQkJMHgwMDA4Ci0jZGVmaW5lCVdQU19DTV9FWFRFUk5BTF9ORkNfVE9LRU4JCQkweDAwMTAKLSNkZWZpbmUJV1BTX0NNX0lOVEVHUkFURURfTkZDX1RPS0VOCQkJMHgwMDIwCi0jZGVmaW5lCVdQU19DTV9ORkNfSU5URVJGQUNFCQkJCTB4MDA0MAotI2RlZmluZQlXUFNfQ01fUFVTSF9CVVRUT04JCQkJMHgwMDgwCi0jZGVmaW5lCVdQU19DTV9LRVlQQUQJCQkJCTB4MDEwMAotI2RlZmluZQlXUFNfQ01fU1dfUFVIU19CVVRUT04JCQkJMHgwMjgwCi0jZGVmaW5lCVdQU19DTV9IV19QVUhTX0JVVFRPTgkJCQkweDA0ODAKLSNkZWZpbmUJV1BTX0NNX1NXX0RJU1BMQVlfUElOCQkJCTB4MjAwOAotI2RlZmluZQlXUFNfQ01fTENEX0RJU1BMQVlfUElOCQkJCTB4NDAwOAotCi0jZW5kaWYgLyogIF9XSUZJX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvd2xhbl9ic3NkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS93bGFuX2Jzc2RlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWIzMmUxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS93bGFuX2Jzc2RlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1dMQU5fQlNTREVGX0hfXwotI2RlZmluZSBfX1dMQU5fQlNTREVGX0hfXwotCi0KLSNkZWZpbmUgTUFYX0lFX1NaCTc2OAotCi0KLSNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTICAgICAgICA4Ci0jZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWCAgICAgMTYKLQotLyogTGVuZ3RoIGlzIHRoZSA0IGJ5dGVzIG11bHRpcGxlcyBvZiB0aGUgc3VtIG9mCi0gKiBzaXplb2YoNiAqIHNpemVvZih1bnNpZ25lZCBjaGFyKSkgKyAyICsgc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9zc2lkKSArCi0gKiBzaXplb2YodTMyKSArIHNpemVvZihsb25nKSArIHNpemVvZihlbnVtIG5kaXNfODAyXzExX25ldF90eXBlKSArCi0gKiBzaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX2NvbmZpZykgKyBzaXplb2Yoc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICoKLSAqIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWCkgKyBJRUxlbmd0aAotICoKLSAqIEV4Y2VwdCB0aGUgSUVMZW5ndGgsIGFsbCBvdGhlciBmaWVsZHMgYXJlIGZpeGVkIGxlbmd0aC4gVGhlcmVmb3JlLAotICogd2UgY2FuIGRlZmluZSBhIG1hY3JvIHRvIHByZXNlbnQgdGhlIHBhcnRpYWwgc3VtLgotICovCi0KLWVudW0gbmRpc184MDJfMTFfYXV0aF9tb2RlIHsKLQlOZGlzODAyXzExQXV0aE1vZGVPcGVuLAotCU5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCwKLQlOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLAotCU5kaXM4MDJfMTFBdXRoTW9kZVdQQSwKLQlOZGlzODAyXzExQXV0aE1vZGVXUEFQU0ssCi0JTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSwKLQlkaXM4MDJfMTFBdXRoTW9kZU1heCAgICAgICAvKiAgdXBwZXIgYm91bmQgKi8KLX07Ci0KLWVudW0gIHsKLQlOZGlzODAyXzExV0VQRW5hYmxlZCwKLQlOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkID0gTmRpczgwMl8xMVdFUEVuYWJsZWQsCi0JTmRpczgwMl8xMVdFUERpc2FibGVkLAotCU5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQsCi0JTmRpczgwMl8xMVdFUEtleUFic2VudCwKLQlOZGlzODAyXzExRW5jcnlwdGlvbjFLZXlBYnNlbnQgPSBOZGlzODAyXzExV0VQS2V5QWJzZW50LAotCU5kaXM4MDJfMTFXRVBOb3RTdXBwb3J0ZWQsCi0JTmRpczgwMl8xMUVuY3J5cHRpb25Ob3RTdXBwb3J0ZWQgPSBOZGlzODAyXzExV0VQTm90U3VwcG9ydGVkLAotCU5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQsCi0JTmRpczgwMl8xMUVuY3J5cHRpb24yS2V5QWJzZW50LAotCU5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQsCi0JTmRpczgwMl8xMUVuY3J5cHRpb24zS2V5QWJzZW50LAotfTsKLQotc3RydWN0IHdsYW5fYmNuX2luZm8gewotCS8qIHRoZXNlIGluZm9yIGdldCBmcm9tIHJ0d19nZXRfZW5jcnlwdF9pbmZvIHdoZW4KLQkgKgkgKiB0cmFuc2xhdGUgc2NhbiB0byBVSSAqLwotCXU4IGVuY3J5cF9wcm90b2NvbDsvKiBFTkNSWVBfUFJPVE9DT0xfRTogT1BFTi9XRVAvV1BBL1dQQTIgKi8KLQlpbnQgZ3JvdXBfY2lwaGVyOyAvKiBXUEEvV1BBMiBncm91cCBjaXBoZXIgKi8KLQlpbnQgcGFpcndpc2VfY2lwaGVyOy8qIFdQQS9XUEEyL1dFUCBwYWlyd2lzZSBjaXBoZXIgKi8KLQlpbnQgaXNfODAyMXg7Ci0KLQkvKiBid21vZGUgMjAvNDAgYW5kIGNoX29mZnNldCBVUC9MT1cgKi8KLX07Ci0KLXN0cnVjdCB3bGFuX2Jzc2lkX2V4IHsKLQl1MzIgIExlbmd0aDsKLQl1OCBNYWNBZGRyZXNzW0VUSF9BTEVOXTsKLQl1MTYgcmVzZXJ2ZWQ7Ci0Jc3RydWN0IGNmZzgwMjExX3NzaWQgU3NpZDsKLQl1MzIgIFByaXZhY3k7Ci0JbG9uZyAgUnNzaTsvKiBpbiBkQk0sIHJhdyBkYXRhICwgZ2V0IGZyb20gUEhZKSAqLwotCXUxNiBiZWFjb25faW50ZXJ2YWw7Ci0JdTE2IGNhcGFiaWxpdHk7Ci0JdTY0IHRzZjsKLQl1MzIgQVRJTVdpbmRvdzsgICAgICAgICAvKiAgdW5pdHMgYXJlIEt1c2VjICovCi0JdTMyIERTQ29uZmlnOyAgICAgICAgICAgLyogIEZyZXF1ZW5jeSwgdW5pdHMgYXJlIGtIeiAqLwotCWVudW0gbmw4MDIxMV9pZnR5cGUgaWZtb2RlOwotCXVuc2lnbmVkIGNoYXIgU3VwcG9ydGVkUmF0ZXNbTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYXTsKLQl1OCBTaWduYWxTdHJlbmd0aDsvKiBpbiBwZXJjZW50YWdlICovCi0JdTggU2lnbmFsUXVhbGl0eTsvKiBpbiBwZXJjZW50YWdlICovCi0JdTMyICBJRUxlbmd0aDsKLQl1OCAgSUVzW01BWF9JRV9TWl07IC8qIHRpbWVzdGFtcCwgYmVhY29uIGludGVydmFsLCBhbmQgY2FwYWJpbGl0eSBpbmZvKi8KLX0gX19wYWNrZWQ7Ci0KLXN0YXRpYyBpbmxpbmUgdWludCBnZXRfd2xhbl9ic3NpZF9leF9zeihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYnNzKQotewotCXJldHVybiBzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpIC0gTUFYX0lFX1NaICsgYnNzLT5JRUxlbmd0aDsKLX0KLQotc3RydWN0CXdsYW5fbmV0d29yayB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCWludAluZXR3b3JrX3R5cGU7CS8qIHJlZmVyIHRvIGllZWU4MDIxMS5oIGZvciAxMUEvQi9HICovCi0JLyogIHNldCB0byBmaXhlZCB3aGVuIG5vdCB0byBiZSByZW1vdmVkIGFzIHNpdGUtc3VydmV5aW5nICovCi0JaW50CWZpeGVkOwotCXVuc2lnbmVkIGxvbmcJbGFzdF9zY2FubmVkOyAvKiB0aW1lc3RhbXAgZm9yIHRoZSBuZXR3b3JrICovCi0JaW50CWpvaW5fcmVzOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4CW5ldHdvcms7IC8qIG11c3QgYmUgdGhlIGxhc3QgaXRlbSAqLwotCXN0cnVjdCB3bGFuX2Jjbl9pbmZvCUJjbkluZm87Ci19OwotCi1lbnVtIFZSVExfQ0FSUklFUl9TRU5TRSB7Ci0JRElTQUJMRV9WQ1MsCi0JRU5BQkxFX1ZDUywKLQlBVVRPX1ZDUwotfTsKLQotZW51bSBWQ1NfVFlQRSB7Ci0JTk9ORV9WQ1MsCi0JUlRTX0NUUywKLQlDVFNfVE9fU0VMRgotfTsKLQotLyogam9obiAqLwotI2RlZmluZSBOVU1fUFJFX0FVVEhfS0VZIDE2Ci0jZGVmaW5lIE5VTV9QTUtJRF9DQUNIRSBOVU1fUFJFX0FVVEhfS0VZCi0KLSNlbmRpZiAvKiBpZm5kZWYgV0xBTl9CU1NERUZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS94bWl0X29zZGVwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUveG1pdF9vc2RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmUwNGM0OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUveG1pdF9vc2RlcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fWE1JVF9PU0RFUF9IXwotI2RlZmluZSBfX1hNSVRfT1NERVBfSF8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotCi0jZGVmaW5lIE5SX1hNSVRGUkFNRQkyNTYKLQotaW50IHJ0d194bWl0MjNhX2VudHJ5MjNhKHN0cnVjdCBza19idWZmICpwa3QsIHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KTsKLQotdm9pZCBydHdfb3NfeG1pdF9zY2hlZHVsZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotaW50IHJ0d19vc194bWl0X3Jlc291cmNlX2FsbG9jMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZiwgdTMyIGFsbG9jX3N6KTsKLXZvaWQgcnR3X29zX3htaXRfcmVzb3VyY2VfZnJlZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYpOwotCi12b2lkIHJ0d19vc19wa3RfY29tcGxldGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnBrdCk7Ci12b2lkIHJ0d19vc194bWl0X2NvbXBsZXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgIHN0cnVjdCB4bWl0X2ZyYW1lICpweGZyYW1lKTsKLWludCBuZXRkZXZfb3BlbjIzYShzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldik7Ci0KLSNlbmRpZiAvKiBfX1hNSVRfT1NERVBfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL2lvY3RsX2NmZzgwMjExLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9pb2N0bF9jZmc4MDIxMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGJhMzc3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL2lvY3RsX2NmZzgwMjExLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSAgX0lPQ1RMX0NGRzgwMjExX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8eG1pdF9vc2RlcC5oPgotCi0jaW5jbHVkZSAiaW9jdGxfY2ZnODAyMTEuaCIKLQotI2RlZmluZSBSVFdfTUFYX01HTVRfVFhfQ05UIDgKLQotI2RlZmluZSBSVFdfTUFYX1JFTUFJTl9PTl9DSEFOTkVMX0RVUkFUSU9OIDY1NTM1CS8qIG1zICovCi0jZGVmaW5lIFJUV19NQVhfTlVNX1BNS0lEUyA0Ci0KLXN0YXRpYyBjb25zdCB1MzIgcnR3X2NpcGhlcl9zdWl0ZXNbXSA9IHsKLQlXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCwKLQlXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQsCi0JV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCwKLQlXTEFOX0NJUEhFUl9TVUlURV9DQ01QLAotfTsKLQotI2RlZmluZSBSQVRFVEFCX0VOVChfcmF0ZSwgX3JhdGVpZCwgX2ZsYWdzKSB7CQkJXAotCS5iaXRyYXRlCT0gKF9yYXRlKSwJCQkJXAotCS5od192YWx1ZQk9IChfcmF0ZWlkKSwJCQkJXAotCS5mbGFncwkJPSAoX2ZsYWdzKSwJCQkJXAotfQotCi0jZGVmaW5lIENIQU4yRyhfY2hhbm5lbCwgX2ZyZXEsIF9mbGFncykgewkJCVwKLQkuYmFuZAkJCT0gTkw4MDIxMV9CQU5EXzJHSFosCQlcCi0JLmNlbnRlcl9mcmVxCQk9IChfZnJlcSksCQkJXAotCS5od192YWx1ZQkJPSAoX2NoYW5uZWwpLAkJCVwKLQkuZmxhZ3MJCQk9IChfZmxhZ3MpLAkJCVwKLQkubWF4X2FudGVubmFfZ2Fpbgk9IDAsCQkJCVwKLQkubWF4X3Bvd2VyCQk9IDMwLAkJCQlcCi19Ci0KLSNkZWZpbmUgQ0hBTjVHKF9jaGFubmVsLCBfZmxhZ3MpIHsJCQkJXAotCS5iYW5kCQkJPSBOTDgwMjExX0JBTkRfNUdIWiwJCVwKLQkuY2VudGVyX2ZyZXEJCT0gNTAwMCArICg1ICogKF9jaGFubmVsKSksCVwKLQkuaHdfdmFsdWUJCT0gKF9jaGFubmVsKSwJCQlcCi0JLmZsYWdzCQkJPSAoX2ZsYWdzKSwJCQlcCi0JLm1heF9hbnRlbm5hX2dhaW4JPSAwLAkJCQlcCi0JLm1heF9wb3dlcgkJPSAzMCwJCQkJXAotfQotCi1zdGF0aWMgc3RydWN0IGllZWU4MDIxMV9yYXRlIHJ0d19yYXRlc1tdID0gewotCVJBVEVUQUJfRU5UKDEwLCAweDEsIDApLAotCVJBVEVUQUJfRU5UKDIwLCAweDIsIDApLAotCVJBVEVUQUJfRU5UKDU1LCAweDQsIDApLAotCVJBVEVUQUJfRU5UKDExMCwgMHg4LCAwKSwKLQlSQVRFVEFCX0VOVCg2MCwgMHgxMCwgMCksCi0JUkFURVRBQl9FTlQoOTAsIDB4MjAsIDApLAotCVJBVEVUQUJfRU5UKDEyMCwgMHg0MCwgMCksCi0JUkFURVRBQl9FTlQoMTgwLCAweDgwLCAwKSwKLQlSQVRFVEFCX0VOVCgyNDAsIDB4MTAwLCAwKSwKLQlSQVRFVEFCX0VOVCgzNjAsIDB4MjAwLCAwKSwKLQlSQVRFVEFCX0VOVCg0ODAsIDB4NDAwLCAwKSwKLQlSQVRFVEFCX0VOVCg1NDAsIDB4ODAwLCAwKSwKLX07Ci0KLSNkZWZpbmUgcnR3X2FfcmF0ZXMJCShydHdfcmF0ZXMgKyA0KQotI2RlZmluZSBSVFdfQV9SQVRFU19OVU0JOAotI2RlZmluZSBydHdfZ19yYXRlcwkJKHJ0d19yYXRlcyArIDApCi0jZGVmaW5lIFJUV19HX1JBVEVTX05VTQkxMgotCi0jZGVmaW5lIFJUV18yR19DSEFOTkVMU19OVU0gMTQKLSNkZWZpbmUgUlRXXzVHX0NIQU5ORUxTX05VTSAzNwotCi1zdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIHJ0d18yZ2h6X2NoYW5uZWxzW10gPSB7Ci0JQ0hBTjJHKDEsIDI0MTIsIDApLAotCUNIQU4yRygyLCAyNDE3LCAwKSwKLQlDSEFOMkcoMywgMjQyMiwgMCksCi0JQ0hBTjJHKDQsIDI0MjcsIDApLAotCUNIQU4yRyg1LCAyNDMyLCAwKSwKLQlDSEFOMkcoNiwgMjQzNywgMCksCi0JQ0hBTjJHKDcsIDI0NDIsIDApLAotCUNIQU4yRyg4LCAyNDQ3LCAwKSwKLQlDSEFOMkcoOSwgMjQ1MiwgMCksCi0JQ0hBTjJHKDEwLCAyNDU3LCAwKSwKLQlDSEFOMkcoMTEsIDI0NjIsIDApLAotCUNIQU4yRygxMiwgMjQ2NywgMCksCi0JQ0hBTjJHKDEzLCAyNDcyLCAwKSwKLQlDSEFOMkcoMTQsIDI0ODQsIDApLAotfTsKLQotc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBydHdfNWdoel9hX2NoYW5uZWxzW10gPSB7Ci0JQ0hBTjVHKDM0LCAwKSwgQ0hBTjVHKDM2LCAwKSwKLQlDSEFONUcoMzgsIDApLCBDSEFONUcoNDAsIDApLAotCUNIQU41Ryg0MiwgMCksIENIQU41Ryg0NCwgMCksCi0JQ0hBTjVHKDQ2LCAwKSwgQ0hBTjVHKDQ4LCAwKSwKLQlDSEFONUcoNTIsIDApLCBDSEFONUcoNTYsIDApLAotCUNIQU41Ryg2MCwgMCksIENIQU41Ryg2NCwgMCksCi0JQ0hBTjVHKDEwMCwgMCksIENIQU41RygxMDQsIDApLAotCUNIQU41RygxMDgsIDApLCBDSEFONUcoMTEyLCAwKSwKLQlDSEFONUcoMTE2LCAwKSwgQ0hBTjVHKDEyMCwgMCksCi0JQ0hBTjVHKDEyNCwgMCksIENIQU41RygxMjgsIDApLAotCUNIQU41RygxMzIsIDApLCBDSEFONUcoMTM2LCAwKSwKLQlDSEFONUcoMTQwLCAwKSwgQ0hBTjVHKDE0OSwgMCksCi0JQ0hBTjVHKDE1MywgMCksIENIQU41RygxNTcsIDApLAotCUNIQU41RygxNjEsIDApLCBDSEFONUcoMTY1LCAwKSwKLQlDSEFONUcoMTg0LCAwKSwgQ0hBTjVHKDE4OCwgMCksCi0JQ0hBTjVHKDE5MiwgMCksIENIQU41RygxOTYsIDApLAotCUNIQU41RygyMDAsIDApLCBDSEFONUcoMjA0LCAwKSwKLQlDSEFONUcoMjA4LCAwKSwgQ0hBTjVHKDIxMiwgMCksCi0JQ0hBTjVHKDIxNiwgMCksCi19OwotCi1zdGF0aWMgdm9pZCBydHdfMmdfY2hhbm5lbHNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWxzKQotewotCW1lbWNweSgodm9pZCAqKWNoYW5uZWxzLCAodm9pZCAqKXJ0d18yZ2h6X2NoYW5uZWxzLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jaGFubmVsKSAqIFJUV18yR19DSEFOTkVMU19OVU0pOwotfQotCi1zdGF0aWMgdm9pZCBydHdfNWdfY2hhbm5lbHNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWxzKQotewotCW1lbWNweSgodm9pZCAqKWNoYW5uZWxzLCAodm9pZCAqKXJ0d181Z2h6X2FfY2hhbm5lbHMsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwpICogUlRXXzVHX0NIQU5ORUxTX05VTSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0d18yZ19yYXRlc19pbml0KHN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZXMpCi17Ci0JbWVtY3B5KHJhdGVzLCBydHdfZ19yYXRlcywKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcmF0ZSkgKiBSVFdfR19SQVRFU19OVU0pOwotfQotCi1zdGF0aWMgdm9pZCBydHdfNWdfcmF0ZXNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGVzKQotewotCW1lbWNweShyYXRlcywgcnR3X2FfcmF0ZXMsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JhdGUpICogUlRXX0FfUkFURVNfTlVNKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKgotcnR3X3NwdF9iYW5kX2FsbG9jKGVudW0gbmw4MDIxMV9iYW5kIGJhbmQpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc3B0X2JhbmQgPSBOVUxMOwotCWludCBuX2NoYW5uZWxzLCBuX2JpdHJhdGVzOwotCi0JaWYgKGJhbmQgPT0gTkw4MDIxMV9CQU5EXzJHSFopIHsKLQkJbl9jaGFubmVscyA9IFJUV18yR19DSEFOTkVMU19OVU07Ci0JCW5fYml0cmF0ZXMgPSBSVFdfR19SQVRFU19OVU07Ci0JfSBlbHNlIGlmIChiYW5kID09IE5MODAyMTFfQkFORF81R0haKSB7Ci0JCW5fY2hhbm5lbHMgPSBSVFdfNUdfQ0hBTk5FTFNfTlVNOwotCQluX2JpdHJhdGVzID0gUlRXX0FfUkFURVNfTlVNOwotCX0gZWxzZSB7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0Jc3B0X2JhbmQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kKSArCi0JCQkgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jaGFubmVsKSAqIG5fY2hhbm5lbHMgKwotCQkJICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcmF0ZSkgKiBuX2JpdHJhdGVzLAotCQkJICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzcHRfYmFuZCkKLQkJZ290byBleGl0OwotCi0Jc3B0X2JhbmQtPmNoYW5uZWxzID0KLQkJKHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqKSgoKHU4ICopIHNwdF9iYW5kKSArCi0JCQkJCSAgICAgc2l6ZW9mKHN0cnVjdAotCQkJCQkJICAgIGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCkpOwotCXNwdF9iYW5kLT5iaXRyYXRlcyA9Ci0JCShzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKikoKCh1OCAqKSBzcHRfYmFuZC0+Y2hhbm5lbHMpICsKLQkJCQkJICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jaGFubmVsKSAqCi0JCQkJCSAgbl9jaGFubmVscyk7Ci0Jc3B0X2JhbmQtPmJhbmQgPSBiYW5kOwotCXNwdF9iYW5kLT5uX2NoYW5uZWxzID0gbl9jaGFubmVsczsKLQlzcHRfYmFuZC0+bl9iaXRyYXRlcyA9IG5fYml0cmF0ZXM7Ci0KLQlpZiAoYmFuZCA9PSBOTDgwMjExX0JBTkRfMkdIWikgewotCQlydHdfMmdfY2hhbm5lbHNfaW5pdChzcHRfYmFuZC0+Y2hhbm5lbHMpOwotCQlydHdfMmdfcmF0ZXNfaW5pdChzcHRfYmFuZC0+Yml0cmF0ZXMpOwotCX0gZWxzZSBpZiAoYmFuZCA9PSBOTDgwMjExX0JBTkRfNUdIWikgewotCQlydHdfNWdfY2hhbm5lbHNfaW5pdChzcHRfYmFuZC0+Y2hhbm5lbHMpOwotCQlydHdfNWdfcmF0ZXNfaW5pdChzcHRfYmFuZC0+Yml0cmF0ZXMpOwotCX0KLQotCS8qIHNwdF9iYW5kLmh0X2NhcCAqLwotCi1leGl0OgotCXJldHVybiBzcHRfYmFuZDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhyeF9zdHlwZXMKLXJ0d19jZmc4MDIxMV9kZWZhdWx0X21nbXRfc3R5cGVzW05VTV9OTDgwMjExX0lGVFlQRVNdID0gewotCVtOTDgwMjExX0lGVFlQRV9BREhPQ10gPSB7Ci0JCS50eCA9IDB4ZmZmZiwKLQkJLnJ4ID0gQklUKElFRUU4MDIxMV9TVFlQRV9BQ1RJT04gPj4gNCkKLQl9LAotCVtOTDgwMjExX0lGVFlQRV9TVEFUSU9OXSA9IHsKLQkJLnR4ID0gMHhmZmZmLAotCQkucnggPSBCSVQoSUVFRTgwMjExX1NUWVBFX0FDVElPTiA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRID4+IDQpCi0JfSwKLQlbTkw4MDIxMV9JRlRZUEVfQVBdID0gewotCQkudHggPSAweGZmZmYsCi0JCS5yeCA9IEJJVChJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVRID4+IDQpIHwKLQkJICAgICAgQklUKElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFUSA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRID4+IDQpIHwKLQkJICAgICAgQklUKElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQyA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfQVVUSCA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfREVBVVRIID4+IDQpIHwKLQkJICAgICAgQklUKElFRUU4MDIxMV9TVFlQRV9BQ1RJT04gPj4gNCkKLQl9LAotCVtOTDgwMjExX0lGVFlQRV9BUF9WTEFOXSA9IHsKLQkJLyogY29weSBBUCAqLwotCQkudHggPSAweGZmZmYsCi0JCS5yeCA9IEJJVChJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVRID4+IDQpIHwKLQkJICAgICAgQklUKElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFUSA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRID4+IDQpIHwKLQkJICAgICAgQklUKElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQyA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfQVVUSCA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfREVBVVRIID4+IDQpIHwKLQkJICAgICAgQklUKElFRUU4MDIxMV9TVFlQRV9BQ1RJT04gPj4gNCkKLQl9LAotCVtOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UXSA9IHsKLQkJLnR4ID0gMHhmZmZmLAotCQkucnggPSBCSVQoSUVFRTgwMjExX1NUWVBFX0FDVElPTiA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRID4+IDQpCi0JfSwKLQlbTkw4MDIxMV9JRlRZUEVfUDJQX0dPXSA9IHsKLQkJLnR4ID0gMHhmZmZmLAotCQkucnggPSBCSVQoSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUSA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVEgPj4gNCkgfAotCQkgICAgICBCSVQoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MgPj4gNCkgfAotCQkgICAgICBCSVQoSUVFRTgwMjExX1NUWVBFX0FVVEggPj4gNCkgfAotCQkgICAgICBCSVQoSUVFRTgwMjExX1NUWVBFX0RFQVVUSCA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfQUNUSU9OID4+IDQpCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgcnR3X2NmZzgwMjExX2luZm9ybV9ic3Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaykKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKm5vdGlmeV9jaGFubmVsOwotCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKLQl1MTYgY2hhbm5lbDsKLQl1MzIgZnJlcTsKLQl1OCAqbm90aWZ5X2llOwotCXNpemVfdCBub3RpZnlfaWVsZW47Ci0JczMyIG5vdGlmeV9zaWduYWw7Ci0Jc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IHBhZGFwdGVyLT5ydHdfd2RldjsKLQlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2Rldi0+d2lwaHk7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWNoYW5uZWwgPSBwbmV0d29yay0+bmV0d29yay5EU0NvbmZpZzsKLQlpZiAoY2hhbm5lbCA8PSBSVFdfQ0hfTUFYXzJHX0NIQU5ORUwpCi0JCWZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbm5lbCwKLQkJCQkJCSAgICAgIE5MODAyMTFfQkFORF8yR0haKTsKLQllbHNlCi0JCWZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbm5lbCwKLQkJCQkJCSAgICAgIE5MODAyMTFfQkFORF81R0haKTsKLQotCW5vdGlmeV9jaGFubmVsID0gaWVlZTgwMjExX2dldF9jaGFubmVsKHdpcGh5LCBmcmVxKTsKLQotCW5vdGlmeV9pZSA9IHBuZXR3b3JrLT5uZXR3b3JrLklFczsKLQlub3RpZnlfaWVsZW4gPSBwbmV0d29yay0+bmV0d29yay5JRUxlbmd0aDsKLQotCS8qIFdlJ3ZlIHNldCB3aXBoeSdzIHNpZ25hbF90eXBlIGFzIENGRzgwMjExX1NJR05BTF9UWVBFX01CTToKLQkgKiAgc2lnbmFsIHN0cmVuZ3RoIGluIG1CbSAoMTAwKmRCbSkKLQkgKi8KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpICYmCi0JICAgIGlzX3NhbWVfbmV0d29yazIzYSgmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLAotCQkJICAgICZwbmV0d29yay0+bmV0d29yaykpIHsKLQkJbm90aWZ5X3NpZ25hbCA9IDEwMCAqIHRyYW5zbGF0ZV9wZXJjZW50YWdlX3RvX2RibShwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3N0cmVuZ3RoKTsJLyogZGJtICovCi0JfSBlbHNlIHsKLQkJbm90aWZ5X3NpZ25hbCA9IDEwMCAqIHRyYW5zbGF0ZV9wZXJjZW50YWdlX3RvX2RibSgKLQkJCXBuZXR3b3JrLT5uZXR3b3JrLlNpZ25hbFN0cmVuZ3RoKTsJLyogZGJtICovCi0JfQotCi0JYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzcyh3aXBoeSwgbm90aWZ5X2NoYW5uZWwsCi0JCQkJICBDRkc4MDIxMV9CU1NfRlRZUEVfVU5LTk9XTiwKLQkJCQkgIHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsCi0JCQkJICBwbmV0d29yay0+bmV0d29yay50c2YsCi0JCQkJICBwbmV0d29yay0+bmV0d29yay5jYXBhYmlsaXR5LAotCQkJCSAgcG5ldHdvcmstPm5ldHdvcmsuYmVhY29uX2ludGVydmFsLAotCQkJCSAgbm90aWZ5X2llLCBub3RpZnlfaWVsZW4sCi0JCQkJICBub3RpZnlfc2lnbmFsLCBHRlBfQVRPTUlDKTsKLQotCWlmICh1bmxpa2VseSghYnNzKSkgewotCQlEQkdfODcyM0EoInJ0d19jZmc4MDIxMV9pbmZvcm1fYnNzIGVycm9yXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JY2ZnODAyMTFfcHV0X2Jzcyh3aXBoeSwgYnNzKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgcnR3X2NmZzgwMjExX2luZGljYXRlX2Nvbm5lY3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKmN1cl9uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcms7Ci0Jc3RydWN0IHdpcmVsZXNzX2RldiAqcHdkZXYgPSBwYWRhcHRlci0+cnR3X3dkZXY7Ci0KLQlEQkdfODcyM0EoIiVzKHBhZGFwdGVyID0lcClcbiIsIF9fZnVuY19fLCBwYWRhcHRlcik7Ci0KLQlpZiAocHdkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCi0JICAgIHB3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkKLQkJcmV0dXJuOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkKLQkJcmV0dXJuOwotCi0JaWYgKHBhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nID4gMCkgewotCQlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gcHdkZXYtPndpcGh5OwotCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKm5vdGlmeV9jaGFubmVsOwotCQl1MzIgZnJlcTsKLQkJdTE2IGNoYW5uZWwgPSBjdXJfbmV0d29yay0+bmV0d29yay5EU0NvbmZpZzsKLQotCQlpZiAoY2hhbm5lbCA8PSBSVFdfQ0hfTUFYXzJHX0NIQU5ORUwpCi0JCQlmcmVxID0KLQkJCSAgICBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbm5lbCwKLQkJCQkJCQkgICBOTDgwMjExX0JBTkRfMkdIWik7Ci0JCWVsc2UKLQkJCWZyZXEgPQotCQkJICAgIGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShjaGFubmVsLAotCQkJCQkJCSAgIE5MODAyMTFfQkFORF81R0haKTsKLQotCQlub3RpZnlfY2hhbm5lbCA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbCh3aXBoeSwgZnJlcSk7Ci0KLQkJREJHXzg3MjNBKCIlcyBjYWxsIGNmZzgwMjExX3JvYW1lZFxuIiwgX19mdW5jX18pOwotCQljZmc4MDIxMV9yb2FtZWQocGFkYXB0ZXItPnBuZXRkZXYsIG5vdGlmeV9jaGFubmVsLAotCQkJCWN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsCi0JCQkJcG1sbWVwcml2LT5hc3NvY19yZXEgKwotCQkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyAyLAotCQkJCXBtbG1lcHJpdi0+YXNzb2NfcmVxX2xlbiAtCi0JCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSAtIDIsCi0JCQkJcG1sbWVwcml2LT5hc3NvY19yc3AgKwotCQkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA2LAotCQkJCXBtbG1lcHJpdi0+YXNzb2NfcnNwX2xlbiAtCi0JCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSAtIDYsCi0JCQkJR0ZQX0FUT01JQyk7Ci0JfSBlbHNlIHsKLQkJY2ZnODAyMTFfY29ubmVjdF9yZXN1bHQocGFkYXB0ZXItPnBuZXRkZXYsCi0JCQkJCWN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsCi0JCQkJCXBtbG1lcHJpdi0+YXNzb2NfcmVxICsKLQkJCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArIDIsCi0JCQkJCXBtbG1lcHJpdi0+YXNzb2NfcmVxX2xlbiAtCi0JCQkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgLSAyLAotCQkJCQlwbWxtZXByaXYtPmFzc29jX3JzcCArCi0JCQkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA2LAotCQkJCQlwbWxtZXByaXYtPmFzc29jX3JzcF9sZW4gLQotCQkJCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpIC0gNiwKLQkJCQkJV0xBTl9TVEFUVVNfU1VDQ0VTUywgR0ZQX0FUT01JQyk7Ci0JfQotfQotCi12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9kaXNjb25uZWN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICpwd2RldiA9IHBhZGFwdGVyLT5ydHdfd2RldjsKLQotCURCR184NzIzQSgiJXMocGFkYXB0ZXIgPSVwKVxuIiwgX19mdW5jX18sIHBhZGFwdGVyKTsKLQotCWlmIChwd2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKLQkgICAgcHdkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKQotCQlyZXR1cm47Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKQotCQlyZXR1cm47Ci0KLQlpZiAoIXBhZGFwdGVyLT5tbG1lcHJpdi5ub3RfaW5kaWNfZGlzY28pIHsKLQkJaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9VTkRFUl9MSU5LSU5HKSkgewotCQkJY2ZnODAyMTFfY29ubmVjdF9yZXN1bHQocGFkYXB0ZXItPnBuZXRkZXYsIE5VTEwsIE5VTEwsCi0JCQkJCQkwLCBOVUxMLCAwLAotCQkJCQkJV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRSwKLQkJCQkJCUdGUF9BVE9NSUMpOwotCQl9IGVsc2UgewotCQkJY2ZnODAyMTFfZGlzY29ubmVjdGVkKHBhZGFwdGVyLT5wbmV0ZGV2LCAwLCBOVUxMLAotCQkJCQkgICAgICAwLCBmYWxzZSwgR0ZQX0FUT01JQyk7Ci0JCX0KLQl9Ci19Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLXN0YXRpYyBpbnQgc2V0X3BhaXJ3aXNlX2tleShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0Jc3RydWN0IGNtZF9vYmogKnBoMmM7Ci0Jc3RydWN0IHNldF9zdGFrZXlfcGFybSAqcHNldHN0YWtleV9wYXJhOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBoMmMgPT0gTlVMTCkgewotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBzZXRzdGFrZXlfcGFyYSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXRfc3Rha2V5X3Bhcm0pLCBHRlBfS0VSTkVMKTsKLQlpZiAocHNldHN0YWtleV9wYXJhID09IE5VTEwpIHsKLQkJa2ZyZWUocGgyYyk7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHNldHN0YWtleV9wYXJhLCBfU2V0U3RhS2V5X0NNRF8pOwotCi0JcHNldHN0YWtleV9wYXJhLT5hbGdvcml0aG0gPSBwc3RhLT5kb3QxMTgwMjFYUHJpdmFjeTsKLQotCWV0aGVyX2FkZHJfY29weShwc2V0c3Rha2V5X3BhcmEtPmFkZHIsIHBzdGEtPmh3YWRkcik7Ci0KLQltZW1jcHkocHNldHN0YWtleV9wYXJhLT5rZXksICZwc3RhLT5kb3QxMTgwMjF4X1VuY3N0S2V5LCAxNik7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBoMmMpOwotCi1leGl0OgotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X2dyb3VwX2tleShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qga2V5X3BhcmFtcyAqcGFybXMsCi0JCQkgdTMyIGFsZywgdTgga2V5aWQpCi17Ci0Jc3RydWN0IGNtZF9vYmogKnBjbWQ7Ci0Jc3RydWN0IHNldGtleV9wYXJtICpwc2V0a2V5cGFybTsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmIChrZXlpZCA+PSA0KSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwY21kKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCXBzZXRrZXlwYXJtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNldGtleV9wYXJtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwc2V0a2V5cGFybSkgewotCQlrZnJlZShwY21kKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwc2V0a2V5cGFybS0+a2V5aWQgPSBrZXlpZDsKLQlpZiAoaXNfd2VwX2VuYyhhbGcpKQotCQlwYWRhcHRlci0+bWxtZXByaXYua2V5X21hc2sgfD0gQklUKHBzZXRrZXlwYXJtLT5rZXlpZCk7Ci0KLQlwc2V0a2V5cGFybS0+YWxnb3JpdGhtID0gYWxnOwotCi0JcHNldGtleXBhcm0tPnNldF90eCA9IDE7Ci0KLQltZW1jcHkoJnBzZXRrZXlwYXJtLT5rZXksIHBhcm1zLT5rZXksIHBhcm1zLT5rZXlfbGVuKTsKLQotCXBjbWQtPmNtZGNvZGUgPSBfU2V0S2V5X0NNRF87Ci0JcGNtZC0+cGFybWJ1ZiA9ICh1OCAqKSBwc2V0a2V5cGFybTsKLQlwY21kLT5jbWRzeiA9IHNpemVvZihzdHJ1Y3Qgc2V0a2V5X3Bhcm0pOwotCXBjbWQtPnJzcCA9IE5VTEw7Ci0JcGNtZC0+cnNwc3ogPSAwOwotCi0JcmVzID0gcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwY21kKTsKLQotZXhpdDoKLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50IHJ0d19jZmc4MDIxMV9hcF9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBrZXlfaW5kZXgsCi0JCQkJCSAgaW50IHNldF90eCwgY29uc3QgdTggKnN0YV9hZGRyLAotCQkJCQkgIHN0cnVjdCBrZXlfcGFyYW1zICprZXlwYXJtcykKLXsKLQlpbnQga2V5X2xlbjsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMLCAqcGJjbWNfc3RhID0gTlVMTDsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0KLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHN0YV9hZGRyKSkgewotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBzdGFfYWRkcik7Ci0JCWlmICghcHN0YSkgewotCQkJLyogcmV0ID0gLUVJTlZBTDsgKi8KLQkJCURCR184NzIzQSgicnR3X3NldF9lbmNyeXB0aW9uKCksIHN0YSBoYXMgYWxyZWFkeSAiCi0JCQkJICAiYmVlbiByZW1vdmVkIG9yIG5ldmVyIGJlZW4gYWRkZWRcbiIpOwotCQkJZ290byBleGl0OwotCQl9Ci0JfQotCi0Ja2V5X2xlbiA9IGtleXBhcm1zLT5rZXlfbGVuOwotCi0JaWYgKCFwc3RhICYmIChrZXlwYXJtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwIHx8Ci0JCSAgICAgIGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KSkgewotCQlEQkdfODcyM0EoInI4NzF4X3NldF9lbmNyeXB0aW9uLCBjcnlwdC5hbGcgPSBXRVBcbiIpOwotCi0JCURCR184NzIzQSgicjg3MXhfc2V0X2VuY3J5cHRpb24sIHdlcF9rZXlfaWR4ID0lZCwgbGVuID0lZFxuIiwKLQkJCSAga2V5X2luZGV4LCBrZXlfbGVuKTsKLQotCQlpZiAocHNlY3VyaXR5cHJpdi0+YldlcERlZmF1bHRLZXlJZHhTZXQgPT0gMCkgewotCQkJLyogd2VwIGRlZmF1bHQga2V5IGhhcyBub3QgYmVlbiBzZXQsIHNvIHVzZQotCQkJICAgdGhpcyBrZXkgaW5kZXggYXMgZGVmYXVsdCBrZXkuICovCi0KLQkJCXBzZWN1cml0eXByaXYtPm5kaXNlbmNyeXB0c3RhdHVzID0KLQkJCQlOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9IGtleXBhcm1zLT5jaXBoZXI7Ci0JCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9IGtleXBhcm1zLT5jaXBoZXI7Ci0KLQkJCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUtleUluZGV4ID0ga2V5X2luZGV4OwotCQl9Ci0KLQkJbWVtY3B5KCZwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleV9pbmRleF0ua2V5LAotCQkgICAgICAga2V5cGFybXMtPmtleSwga2V5X2xlbik7Ci0KLQkJcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlfaW5kZXhdLmtleWxlbiA9IGtleV9sZW47Ci0KLQkJc2V0X2dyb3VwX2tleShwYWRhcHRlciwga2V5cGFybXMsIGtleXBhcm1zLT5jaXBoZXIsIGtleV9pbmRleCk7Ci0KLQkJZ290byBleGl0OwotCX0KLQotCWlmICghcHN0YSkgewkvKiAgZ3JvdXAga2V5ICovCi0JCWlmIChzZXRfdHggPT0gMCkgewkvKiBncm91cCBrZXkgKi8KLQkJCWlmIChrZXlwYXJtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwIHx8Ci0JCQkgICAga2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpIHsKLQkJCQlEQkdfODcyM0EoIiVzLCBzZXQgZ3JvdXBfa2V5LCBXRVBcbiIsIF9fZnVuY19fKTsKLQotCQkJCW1lbWNweShwc2VjdXJpdHlwcml2LT4KLQkJCQkgICAgICAgZG90MTE4MDIxWEdycEtleVtrZXlfaW5kZXhdLnNrZXksCi0JCQkJICAgICAgIGtleXBhcm1zLT5rZXksIGtleV9sZW4pOwotCi0JCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3kgPQotCQkJCQlrZXlwYXJtcy0+Y2lwaGVyOwotCQkJfSBlbHNlIGlmIChrZXlwYXJtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVApIHsKLQkJCQlEQkdfODcyM0EoIiVzLCBzZXQgZ3JvdXBfa2V5LCBUS0lQXG4iLAotCQkJCQkgIF9fZnVuY19fKTsKLQotCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0KLQkJCQkJV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDsKLQotCQkJCW1lbWNweShwc2VjdXJpdHlwcml2LT4KLQkJCQkgICAgICAgZG90MTE4MDIxWEdycEtleVtrZXlfaW5kZXhdLnNrZXksCi0JCQkJICAgICAgIGtleXBhcm1zLT5rZXksCi0JCQkJICAgICAgIChtaW4oMTYsIGtleV9sZW4pKSk7Ci0KLQkJCQkvKiBzZXQgbWljIGtleSAqLwotCQkJCW1lbWNweShwc2VjdXJpdHlwcml2LT4KLQkJCQkgICAgICAgZG90MTE4MDIxWEdycHR4bWlja2V5W2tleV9pbmRleF0uc2tleSwKLQkJCQkgICAgICAgJmtleXBhcm1zLT5rZXlbMTZdLCA4KTsKLQkJCQltZW1jcHkocHNlY3VyaXR5cHJpdi0+Ci0JCQkJICAgICAgIGRvdDExODAyMVhHcnByeG1pY2tleVtrZXlfaW5kZXhdLnNrZXksCi0JCQkJICAgICAgICZrZXlwYXJtcy0+a2V5WzI0XSwgOCk7Ci0KLQkJCQlwc2VjdXJpdHlwcml2LT5idXNldGtpcGtleSA9IDE7Ci0KLQkJCX0gZWxzZSBpZiAoa2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QKSB7Ci0JCQkJCURCR184NzIzQSgiJXMsIHNldCBncm91cF9rZXksIENDTVBcbiIsCi0JCQkJCSAgX19mdW5jX18pOwotCi0JCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3kgPQotCQkJCQlXTEFOX0NJUEhFUl9TVUlURV9DQ01QOwotCi0JCQkJbWVtY3B5KHBzZWN1cml0eXByaXYtPgotCQkJCSAgICAgICBkb3QxMTgwMjFYR3JwS2V5W2tleV9pbmRleF0uc2tleSwKLQkJCQkgICAgICAga2V5cGFybXMtPmtleSwKLQkJCQkgICAgICAgKG1pbigxNiwga2V5X2xlbikpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJREJHXzg3MjNBKCIlcywgc2V0IGdyb3VwX2tleSwgbm9uZVxuIiwKLQkJCQkJICBfX2Z1bmNfXyk7Ci0KLQkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9IDA7Ci0JCQl9Ci0KLQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZCA9IGtleV9pbmRleDsKLQotCQkJcHNlY3VyaXR5cHJpdi0+Ymluc3RhbGxHcnBrZXkgPSAxOwotCi0JCQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0KLQkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeTsKLQotCQkJc2V0X2dyb3VwX2tleShwYWRhcHRlciwga2V5cGFybXMsCi0JCQkJICAgICAgcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3ksCi0JCQkJICAgICAga2V5X2luZGV4KTsKLQotCQkJcGJjbWNfc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCQkJaWYgKHBiY21jX3N0YSkgewotCQkJCXBiY21jX3N0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPSBmYWxzZTsKLQkJCQkvKiByeCB3aWxsIHVzZSBibWNfc3RhJ3MgZG90MTE4MDIxWFByaXZhY3kgKi8KLQkJCQlwYmNtY19zdGEtPmRvdDExODAyMVhQcml2YWN5ID0KLQkJCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3k7Ci0KLQkJCX0KLQotCQl9Ci0KLQkJZ290byBleGl0OwotCX0KLQotCWlmIChwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID09IGRvdDExQXV0aEFsZ3J0aG1fODAyMVggJiYgcHN0YSkgewotCQkvKiAgcHNrLzgwMl8xeCAqLwotCQlpZiAoc2V0X3R4ID09IDEpIHsKLQkJCS8qIHBhaXJ3aXNlIGtleSAqLwotCQkJbWVtY3B5KHBzdGEtPmRvdDExODAyMXhfVW5jc3RLZXkuc2tleSwKLQkJCSAgICAgICBrZXlwYXJtcy0+a2V5LCAobWluKDE2LCBrZXlfbGVuKSkpOwotCi0JCQlpZiAoa2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fAotCQkJICAgIGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KSB7Ci0JCQkJREJHXzg3MjNBKCIlcywgc2V0IHBhaXJ3aXNlIGtleSwgV0VQXG4iLAotCQkJCQkgIF9fZnVuY19fKTsKLQotCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0KLQkJCQkJa2V5cGFybXMtPmNpcGhlcjsKLQkJCX0gZWxzZSBpZiAoa2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9US0lQKSB7Ci0JCQkJREJHXzg3MjNBKCIlcywgc2V0IHBhaXJ3aXNlIGtleSwgVEtJUFxuIiwKLQkJCQkJICBfX2Z1bmNfXyk7Ci0KLQkJCQlwc3RhLT5kb3QxMTgwMjFYUHJpdmFjeSA9Ci0JCQkJCVdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA7Ci0KLQkJCQkvKiBzZXQgbWljIGtleSAqLwotCQkJCW1lbWNweShwc3RhLT5kb3QxMXRraXB0eG1pY2tleS5za2V5LAotCQkJCSAgICAgICAma2V5cGFybXMtPmtleVsxNl0sIDgpOwotCQkJCW1lbWNweShwc3RhLT5kb3QxMXRraXByeG1pY2tleS5za2V5LAotCQkJCSAgICAgICAma2V5cGFybXMtPmtleVsyNF0sIDgpOwotCi0JCQkJcHNlY3VyaXR5cHJpdi0+YnVzZXRraXBrZXkgPSAxOwotCi0JCQl9IGVsc2UgaWYgKGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCkgewotCQkJCURCR184NzIzQSgiJXMsIHNldCBwYWlyd2lzZSBrZXksIENDTVBcbiIsCi0JCQkJCSAgX19mdW5jX18pOwotCi0JCQkJcHN0YS0+ZG90MTE4MDIxWFByaXZhY3kgPQotCQkJCQlXTEFOX0NJUEhFUl9TVUlURV9DQ01QOwotCQkJfSBlbHNlIHsKLQkJCQlEQkdfODcyM0EoIiVzLCBzZXQgcGFpcndpc2Uga2V5LCBub25lXG4iLAotCQkJCQkgIF9fZnVuY19fKTsKLQotCQkJCXBzdGEtPmRvdDExODAyMVhQcml2YWN5ID0gMDsKLQkJCX0KLQotCQkJc2V0X3BhaXJ3aXNlX2tleShwYWRhcHRlciwgcHN0YSk7Ci0KLQkJCXBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID0gZmFsc2U7Ci0KLQkJCXBzdGEtPmJwYWlyd2lzZV9rZXlfaW5zdGFsbGVkID0gdHJ1ZTsKLQkJfSBlbHNlIHsJLyogZ3JvdXAga2V5Pz8/ICovCi0JCQlpZiAoa2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fAotCQkJICAgIGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KSB7Ci0JCQkJbWVtY3B5KHBzZWN1cml0eXByaXYtPgotCQkJCSAgICAgICBkb3QxMTgwMjFYR3JwS2V5W2tleV9pbmRleF0uc2tleSwKLQkJCQkgICAgICAga2V5cGFybXMtPmtleSwga2V5X2xlbik7Ci0KLQkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9Ci0JCQkJCWtleXBhcm1zLT5jaXBoZXI7Ci0JCQl9IGVsc2UgaWYgKGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkgewotCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0KLQkJCQkJV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDsKLQotCQkJCW1lbWNweShwc2VjdXJpdHlwcml2LT4KLQkJCQkgICAgICAgZG90MTE4MDIxWEdycEtleVtrZXlfaW5kZXhdLnNrZXksCi0JCQkJICAgICAgIGtleXBhcm1zLT5rZXksCi0JCQkJICAgICAgIChtaW4oMTYsIGtleV9sZW4pKSk7Ci0KLQkJCQkvKiBzZXQgbWljIGtleSAqLwotCQkJCW1lbWNweShwc2VjdXJpdHlwcml2LT4KLQkJCQkgICAgICAgZG90MTE4MDIxWEdycHR4bWlja2V5W2tleV9pbmRleF0uc2tleSwKLQkJCQkgICAgICAgJmtleXBhcm1zLT5rZXlbMTZdLCA4KTsKLQkJCQltZW1jcHkocHNlY3VyaXR5cHJpdi0+Ci0JCQkJICAgICAgIGRvdDExODAyMVhHcnByeG1pY2tleVtrZXlfaW5kZXhdLnNrZXksCi0JCQkJICAgICAgICZrZXlwYXJtcy0+a2V5WzI0XSwgOCk7Ci0KLQkJCQlwc2VjdXJpdHlwcml2LT5idXNldGtpcGtleSA9IDE7Ci0JCQl9IGVsc2UgaWYgKGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCkgewotCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0KLQkJCQkJV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDsKLQotCQkJCW1lbWNweShwc2VjdXJpdHlwcml2LT4KLQkJCQkgICAgICAgZG90MTE4MDIxWEdycEtleVtrZXlfaW5kZXhdLnNrZXksCi0JCQkJICAgICAgIGtleXBhcm1zLT5rZXksCi0JCQkJICAgICAgIChtaW4oMTYsIGtleV9sZW4pKSk7Ci0JCQl9IGVsc2UgewotCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0gMDsKLQkJCX0KLQotCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleWlkID0ga2V5X2luZGV4OwotCi0JCQlwc2VjdXJpdHlwcml2LT5iaW5zdGFsbEdycGtleSA9IDE7Ci0KLQkJCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPQotCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5OwotCi0JCQlzZXRfZ3JvdXBfa2V5KHBhZGFwdGVyLCBrZXlwYXJtcywKLQkJCQkgICAgICBwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSwKLQkJCQkgICAgICBrZXlfaW5kZXgpOwotCi0JCQlwYmNtY19zdGEgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0JCQlpZiAocGJjbWNfc3RhKSB7Ci0JCQkJLyogcnggd2lsbCB1c2UgYm1jX3N0YSdzCi0JCQkJICAgZG90MTE4MDIxWFByaXZhY3kgKi8KLQkJCQlwYmNtY19zdGEtPmllZWU4MDIxeF9ibG9ja2VkID0gZmFsc2U7Ci0JCQkJcGJjbWNfc3RhLT5kb3QxMTgwMjFYUHJpdmFjeSA9Ci0JCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5OwotCQkJfQotCQl9Ci0JfQotCi1leGl0OgotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBydHdfY2ZnODAyMTFfc2V0X2VuY3J5cHRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTgga2V5X2luZGV4LAotCQkJCSAgICAgICBpbnQgc2V0X3R4LCBjb25zdCB1OCAqc3RhX2FkZHIsCi0JCQkJICAgICAgIHN0cnVjdCBrZXlfcGFyYW1zICprZXlwYXJtcykKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQga2V5X2xlbjsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0KLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlrZXlfbGVuID0ga2V5cGFybXMtPmtleV9sZW47Ci0KLQlpZiAoa2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fAotCSAgICBrZXlwYXJtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfb3NfYywgX2Rydl9lcnJfLAotCQkJICJ3cGFfc2V0X2VuY3J5cHRpb24sIGNyeXB0LmFsZyA9IFdFUFxuIik7Ci0JCURCR184NzIzQSgid3BhX3NldF9lbmNyeXB0aW9uLCBjcnlwdC5hbGcgPSBXRVBcbiIpOwotCi0JCWlmIChwc2VjdXJpdHlwcml2LT5iV2VwRGVmYXVsdEtleUlkeFNldCA9PSAwKSB7Ci0JCQkvKiB3ZXAgZGVmYXVsdCBrZXkgaGFzIG5vdCBiZWVuIHNldCwgc28gdXNlIHRoaXMKLQkJCSAgIGtleSBpbmRleCBhcyBkZWZhdWx0IGtleS4gKi8KLQotCQkJcHNlY3VyaXR5cHJpdi0+bmRpc2VuY3J5cHRzdGF0dXMgPQotCQkJCU5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0ga2V5cGFybXMtPmNpcGhlcjsKLQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0ga2V5cGFybXMtPmNpcGhlcjsKLQotCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5S2V5SW5kZXggPSBrZXlfaW5kZXg7Ci0JCX0KLQotCQltZW1jcHkoJnBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5X2luZGV4XS5rZXksCi0JCSAgICAgICBrZXlwYXJtcy0+a2V5LCBrZXlfbGVuKTsKLQotCQlwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleV9pbmRleF0ua2V5bGVuID0ga2V5X2xlbjsKLQotCQlydHdfc2V0X2tleTIzYShwYWRhcHRlciwgcHNlY3VyaXR5cHJpdiwga2V5X2luZGV4LCAwKTsKLQotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFBdXRoQWxncnRobSA9PQotCSAgICBkb3QxMUF1dGhBbGdydGhtXzgwMjFYKSB7CS8qICA4MDJfMXggKi8KLQkJc3RydWN0IHN0YV9pbmZvICpwc3RhLCAqcGJjbWNfc3RhOwotCQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwKLQkJCQkgIFdJRklfU1RBVElPTl9TVEFURSB8IFdJRklfTVBfU1RBVEUpKSB7Ci0JCQkvKiBzdGEgbW9kZSAqLwotCQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgZ2V0X2Jzc2lkKHBtbG1lcHJpdikpOwotCQkJaWYgKHBzdGEgPT0gTlVMTCkgewotCQkJCURCR184NzIzQSgiJXMsIDogT2J0YWluIFN0YV9pbmZvIGZhaWxcbiIsCi0JCQkJCSAgX19mdW5jX18pOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBKZWZmOiBkb24ndCBkaXNhYmxlIGllZWU4MDIxeF9ibG9ja2VkCi0JCQkJICAgd2hpbGUgY2xlYXJpbmcga2V5ICovCi0JCQkJaWYgKGtleXBhcm1zLT5jaXBoZXIgIT0gSVdfQVVUSF9DSVBIRVJfTk9ORSAmJgotCQkJCSAgICBrZXlwYXJtcy0+Y2lwaGVyICE9IDApCi0JCQkJCXBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID0gZmFsc2U7Ci0KLQkJCQlpZiAoKHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPT0KLQkJCQkgICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8Ci0JCQkJICAgIChwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID09Ci0JCQkJICAgICBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgewotCQkJCQlwc3RhLT5kb3QxMTgwMjFYUHJpdmFjeSA9Ci0JCQkJCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LgotCQkJCQkJZG90MTFQcml2YWN5QWxncnRobTsKLQkJCQl9Ci0KLQkJCQlpZiAoc2V0X3R4ID09IDEpIHsKLQkJCQkJLyogcGFpcndpc2Uga2V5ICovCi0JCQkJCURCR184NzIzQSgiJXMsIDogc2V0X3R4ID09IDFcbiIsCi0JCQkJCQkgIF9fZnVuY19fKTsKLQotCQkJCQltZW1jcHkocHN0YS0+ZG90MTE4MDIxeF9VbmNzdEtleS5za2V5LAotCQkJCQkgICAgICAga2V5cGFybXMtPmtleSwKLQkJCQkJICAgICAgIChtaW4oMTYsIGtleV9sZW4pKSk7Ci0KLQkJCQkJaWYgKGtleXBhcm1zLT5jaXBoZXIgPT0KLQkJCQkJICAgIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVApIHsKLQkJCQkJCW1lbWNweShwc3RhLT5kb3QxMXRraXB0eG1pY2tleS4KLQkJCQkJCSAgICAgICBza2V5LAotCQkJCQkJICAgICAgICZrZXlwYXJtcy0+a2V5WzE2XSwgOCk7Ci0JCQkJCQltZW1jcHkocHN0YS0+ZG90MTF0a2lwcnhtaWNrZXkuCi0JCQkJCQkgICAgICAgc2tleSwKLQkJCQkJCSAgICAgICAma2V5cGFybXMtPmtleVsyNF0sIDgpOwotCi0JCQkJCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LgotCQkJCQkJCWJ1c2V0a2lwa2V5ID0gMDsKLQkJCQkJfQotCQkJCQlEQkdfODcyM0EoIiB+fn5+c2V0IHN0YSBrZXk6dW5pY2FzdGtleVxuIik7Ci0KLQkJCQkJcnR3X3NldHN0YWtleV9jbWQyM2EocGFkYXB0ZXIsCi0JCQkJCQkJICAodW5zaWduZWQgY2hhciAqKXBzdGEsCi0JCQkJCQkJICB0cnVlKTsKLQkJCQl9IGVsc2UgewkvKiBncm91cCBrZXkgKi8KLQkJCQkJbWVtY3B5KHBhZGFwdGVyLT5zZWN1cml0eXByaXYuCi0JCQkJCSAgICAgICBkb3QxMTgwMjFYR3JwS2V5W2tleV9pbmRleF0uc2tleSwKLQkJCQkJICAgICAgIGtleXBhcm1zLT5rZXksCi0JCQkJCSAgICAgICAobWluKDE2LCBrZXlfbGVuKSkpOwotCQkJCQltZW1jcHkocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi4KLQkJCQkJICAgICAgIGRvdDExODAyMVhHcnB0eG1pY2tleVtrZXlfaW5kZXhdLgotCQkJCQkgICAgICAgc2tleSwgJmtleXBhcm1zLT5rZXlbMTZdLCA4KTsKLQkJCQkJbWVtY3B5KHBhZGFwdGVyLT5zZWN1cml0eXByaXYuCi0JCQkJCSAgICAgICBkb3QxMTgwMjFYR3JwcnhtaWNrZXlba2V5X2luZGV4XS4KLQkJCQkJICAgICAgIHNrZXksICZrZXlwYXJtcy0+a2V5WzI0XSwgOCk7Ci0JCQkJCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuYmluc3RhbGxHcnBrZXkgPQotCQkJCQkJMTsKLQkJCQkJREJHXzg3MjNBCi0JCQkJCSAgICAoIiB+fn5+c2V0IHN0YSBrZXk6Z3JvdXBrZXlcbiIpOwotCi0JCQkJCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuCi0JCQkJCSAgICBkb3QxMTgwMjFYR3JwS2V5aWQgPSBrZXlfaW5kZXg7Ci0KLQkJCQkJcnR3X3NldF9rZXkyM2EocGFkYXB0ZXIsCi0JCQkJCQkgICAgJnBhZGFwdGVyLT5zZWN1cml0eXByaXYsCi0JCQkJCQkgICAga2V5X2luZGV4LCAxKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXBiY21jX3N0YSA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQkJCWlmIChwYmNtY19zdGEpIHsKLQkJCQkvKiBKZWZmOiBkb24ndCBkaXNhYmxlIGllZWU4MDIxeF9ibG9ja2VkCi0JCQkJICAgd2hpbGUgY2xlYXJpbmcga2V5ICovCi0JCQkJaWYgKGtleXBhcm1zLT5jaXBoZXIgIT0gSVdfQVVUSF9DSVBIRVJfTk9ORSAmJgotCQkJCSAgICBrZXlwYXJtcy0+Y2lwaGVyICE9IDApCi0JCQkJCXBiY21jX3N0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPSBmYWxzZTsKLQotCQkJCWlmICgocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzZW5jcnlwdHN0YXR1cyA9PQotCQkJCSAgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKLQkJCQkgICAgKHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPT0KLQkJCQkgICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKSB7Ci0JCQkJCXBiY21jX3N0YS0+ZG90MTE4MDIxWFByaXZhY3kgPQotCQkJCQkgICAgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi4KLQkJCQkJICAgIGRvdDExUHJpdmFjeUFsZ3J0aG07Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi1leGl0OgotCi0JREJHXzg3MjNBKCIlcywgcmV0ID0lZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfYWRkX2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQl1OCBrZXlfaW5kZXgsIGJvb2wgcGFpcndpc2UsCi0JCQkJY29uc3QgdTggKm1hY19hZGRyLCBzdHJ1Y3Qga2V5X3BhcmFtcyAqcGFyYW1zKQotewotCWludCBzZXRfdHgsIHJldCA9IDA7Ci0Jc3RydWN0IHdpcmVsZXNzX2RldiAqcnR3X3dkZXYgPSB3aXBoeV90b193ZGV2KHdpcGh5KTsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gd2lwaHlfdG9fYWRhcHRlcih3aXBoeSk7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQl1OCBzdGFfYWRkcltFVEhfQUxFTl07Ci0KLQlEQkdfODcyM0EoIiVzKCVzKTogYWRkaW5nIGtleSBmb3IgJXBNXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSwKLQkJICBtYWNfYWRkcik7Ci0JREJHXzg3MjNBKCJjaXBoZXIgPSAweCV4XG4iLCBwYXJhbXMtPmNpcGhlcik7Ci0JREJHXzg3MjNBKCJrZXlfbGVuID0gMHgleFxuIiwgcGFyYW1zLT5rZXlfbGVuKTsKLQlEQkdfODcyM0EoInNlcV9sZW4gPSAweCV4XG4iLCBwYXJhbXMtPnNlcV9sZW4pOwotCURCR184NzIzQSgia2V5X2luZGV4ID0lZFxuIiwga2V5X2luZGV4KTsKLQlEQkdfODcyM0EoInBhaXJ3aXNlID0lZFxuIiwgcGFpcndpc2UpOwotCi0Jc3dpdGNoIChwYXJhbXMtPmNpcGhlcikgewotCWNhc2UgSVdfQVVUSF9DSVBIRVJfTk9ORToKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgotCQlpZiAocGFyYW1zLT5rZXlfbGVuICE9IFdMQU5fS0VZX0xFTl9XRVA0MCkgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQlpZiAocGFyYW1zLT5rZXlfbGVuICE9IFdMQU5fS0VZX0xFTl9XRVAxMDQpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRU5PVFNVUFA7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoa2V5X2luZGV4ID49IFdFUF9LRVlTIHx8IHBhcmFtcy0+a2V5X2xlbiA8IDApIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KLQotCWV0aF9icm9hZGNhc3RfYWRkcihzdGFfYWRkcik7Ci0KLQlpZiAoIW1hY19hZGRyIHx8IGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1hY19hZGRyKSkKLQkJc2V0X3R4ID0gMDsJLyogZm9yIHdwYS93cGEyIGdyb3VwIGtleSAqLwotCWVsc2UKLQkJc2V0X3R4ID0gMTsJLyogZm9yIHdwYS93cGEyIHBhaXJ3aXNlIGtleSAqLwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCXJldCA9IHJ0d19jZmc4MDIxMV9zZXRfZW5jcnlwdGlvbihuZGV2LCBrZXlfaW5kZXgsIHNldF90eCwKLQkJCQkJCSAgc3RhX2FkZHIsIHBhcmFtcyk7Ci0JfSBlbHNlIGlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQkJaWYgKG1hY19hZGRyKQotCQkJZXRoZXJfYWRkcl9jb3B5KHN0YV9hZGRyLCBtYWNfYWRkcik7Ci0KLQkJcmV0ID0gcnR3X2NmZzgwMjExX2FwX3NldF9lbmNyeXB0aW9uKG5kZXYsIGtleV9pbmRleCwgc2V0X3R4LAotCQkJCQkJICAgICBzdGFfYWRkciwgcGFyYW1zKTsKLSNlbmRpZgotCX0gZWxzZSB7Ci0JCURCR184NzIzQSgiZXJyb3IhIGZ3X3N0YXRlID0gMHgleCwgaWZ0eXBlID0lZFxuIiwKLQkJCSAgcG1sbWVwcml2LT5md19zdGF0ZSwgcnR3X3dkZXYtPmlmdHlwZSk7Ci0KLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotY2ZnODAyMTFfcnR3X2dldF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCSAgICAgdTgga2V5X2luZGV4LCBib29sIHBhaXJ3aXNlLCBjb25zdCB1OCAqbWFjX2FkZHIsCi0JCSAgICAgdm9pZCAqY29va2llLAotCQkgICAgIHZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmNvb2tpZSwgc3RydWN0IGtleV9wYXJhbXMgKikpCi17Ci0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfZGVsX2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQl1OCBrZXlfaW5kZXgsIGJvb2wgcGFpcndpc2UsCi0JCQkJY29uc3QgdTggKm1hY19hZGRyKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCi0JREJHXzg3MjNBKCIlcyglcyk6IGtleV9pbmRleCA9JWRcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lLCBrZXlfaW5kZXgpOwotCi0JaWYgKGtleV9pbmRleCA9PSBwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lLZXlJbmRleCkgewotCQkvKiBjbGVhciB0aGUgZmxhZyBvZiB3ZXAgZGVmYXVsdCBrZXkgc2V0LiAqLwotCQlwc2VjdXJpdHlwcml2LT5iV2VwRGVmYXVsdEtleUlkeFNldCA9IDA7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X3NldF9kZWZhdWx0X2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTgga2V5X2luZGV4LAotCQkJCQlib29sIHVuaWNhc3QsIGJvb2wgbXVsdGljYXN0KQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCi0JREJHXzg3MjNBKCIlcyglcyk6IGtleV9pbmRleCA9JWQsIHVuaWNhc3QgPSVkLCBtdWx0aWNhc3QgPSVkLlxuIiwKLQkJICBfX2Z1bmNfXywgbmRldi0+bmFtZSwga2V5X2luZGV4LCB1bmljYXN0LCBtdWx0aWNhc3QpOwotCi0JaWYgKGtleV9pbmRleCA8IE5VTV9XRVBfS0VZUyAmJgotCSAgICAocHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fAotCSAgICAgcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpKSB7Ci0JCS8qIHNldCB3ZXAgZGVmYXVsdCBrZXkgKi8KLQkJcHNlY3VyaXR5cHJpdi0+bmRpc2VuY3J5cHRzdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCi0JCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUtleUluZGV4ID0ga2V5X2luZGV4OwotCi0JCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDsKLQkJcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3kgPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDsKLQkJaWYgKHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5X2luZGV4XS5rZXlsZW4gPT0gMTMpIHsKLQkJCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPQotCQkJCVdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDsKLQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0KLQkJCQlXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ7Ci0JCX0KLQotCQkvKiBzZXQgdGhlIGZsYWcgdG8gcmVwcmVzZW50IHRoYXQgd2VwIGRlZmF1bHQga2V5Ci0JCSAgIGhhcyBiZWVuIHNldCAqLwotCQlwc2VjdXJpdHlwcml2LT5iV2VwRGVmYXVsdEtleUlkeFNldCA9IDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1MTYgcnR3X2dldF9jdXJfbWF4X3JhdGUoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCWludCBpID0gMDsKLQljb25zdCB1OCAqcDsKLQl1MTYgcmF0ZSA9IDAsIG1heF9yYXRlID0gMDsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAgKnBjdXJfYnNzID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcGllOwotCXU4IHJmX3R5cGUgPSAwOwotCXU4IGJ3XzQwTUh6ID0gMCwgc2hvcnRfR0lfMjAgPSAwLCBzaG9ydF9HSV80MCA9IDA7Ci0JdTE2IG1jc19yYXRlID0gMDsKLQotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX0NBUEFCSUxJVFksCi0JCQkgICAgIHBjdXJfYnNzLT5JRXMsIHBjdXJfYnNzLT5JRUxlbmd0aCk7Ci0JaWYgKHAgJiYgcFsxXSA+IDApIHsKLQkJcGh0X2NhcGllID0gKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICopKHAgKyAyKTsKLQotCQltZW1jcHkoJm1jc19yYXRlLCAmcGh0X2NhcGllLT5tY3MsIDIpOwotCi0JCS8qIGJ3XzQwTUh6ID0gKHBodF9jYXBpZS0+Y2FwX2luZm8mCi0JCSAgIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwKSA/IDE6MDsgKi8KLQkJLyogY3VyX2J3bW9kIGlzIHVwZGF0ZWQgYnkgYmVhY29uLCBwbWxtZWluZm8gaXMKLQkJICAgdXBkYXRlZCBieSBhc3NvY2lhdGlvbiByZXNwb25zZSAqLwotCQlid180ME1IeiA9IChwbWxtZWV4dC0+Y3VyX2J3bW9kZSAmJgotCQkJICAgIChwbWxtZWluZm8tPkhUX2luZm8uaHRfcGFyYW0gJgotCQkJICAgICBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBTl9XSURUSF9BTlkpKSA/IDE6MDsKLQotCQkvKiBzaG9ydF9HSSA9IChwaHRfY2FwaWUtPmNhcF9pbmZvICYgKElFRUU4MDIxMV9IVF9DQVAKLQkJICAgX1NHSV8yMHxJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkpID8gMSA6IDA7ICovCi0JCXNob3J0X0dJXzIwID0gKHBtbG1laW5mby0+aHRfY2FwLmNhcF9pbmZvICYKLQkJCSAgICAgICBjcHVfdG9fbGUxNihJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCkpID8gMTowOwotCQlzaG9ydF9HSV80MCA9IChwbWxtZWluZm8tPmh0X2NhcC5jYXBfaW5mbyAmCi0JCQkgICAgICAgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0hUX0NBUF9TR0lfNDApKSA/IDE6MDsKLQotCQlyZl90eXBlID0gcnRsODcyM2FfZ2V0X3JmX3R5cGUoYWRhcHRlcik7Ci0JCW1heF9yYXRlID0gcnR3X21jc19yYXRlMjNhKHJmX3R5cGUsIGJ3XzQwTUh6ICYKLQkJCQkJICAgcHJlZ2lzdHJ5cHJpdi0+Y2J3NDBfZW5hYmxlLAotCQkJCQkgICBzaG9ydF9HSV8yMCwgc2hvcnRfR0lfNDAsCi0JCQkJCSAgICZwbWxtZWluZm8tPmh0X2NhcC5tY3MpOwotCX0gZWxzZSB7Ci0JCXdoaWxlIChwY3VyX2Jzcy0+U3VwcG9ydGVkUmF0ZXNbaV0gIT0gMCAmJgotCQkgICAgICAgcGN1cl9ic3MtPlN1cHBvcnRlZFJhdGVzW2ldICE9IDB4RkYpIHsKLQkJCXJhdGUgPSBwY3VyX2Jzcy0+U3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdGOwotCQkJaWYgKHJhdGUgPiBtYXhfcmF0ZSkKLQkJCQltYXhfcmF0ZSA9IHJhdGU7Ci0JCQlpKys7Ci0JCX0KLQotCQltYXhfcmF0ZSA9IG1heF9yYXRlICogMTAgLyAyOwotCX0KLQotCXJldHVybiBtYXhfcmF0ZTsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfZ2V0X3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQkJICAgIGNvbnN0IHU4ICptYWMsIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSB3aXBoeV90b19hZGFwdGVyKHdpcGh5KTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQotCXNpbmZvLT5maWxsZWQgPSAwOwotCi0JaWYgKCFtYWMpIHsKLQkJREJHXzg3MjNBKCIlcyglcyk6IG1hYyA9PSVwXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSwgbWFjKTsKLQkJcmV0ID0gLUVOT0VOVDsKLQkJZ290byBleGl0OwotCX0KLQotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIG1hYyk7Ci0JaWYgKHBzdGEgPT0gTlVMTCkgewotCQlEQkdfODcyM0EoIiVzLCBzdGFfaW5mbyBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FTk9FTlQ7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JREJHXzg3MjNBKCIlcyglcyk6IG1hYz0lcE1cbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lLCBtYWMpOwotCi0JLyogZm9yIGluZnJhLi9QMlBDbGllbnQgbW9kZSAqLwotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSAmJgotCSAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJc3RydWN0IHdsYW5fbmV0d29yayAqY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQotCQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobWFjLCBjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKSkgewotCQkJREJHXzg3MjNBKCIlcywgbWlzbWF0Y2ggYnNzaWQ9JXBNXG4iLAotCQkJCSAgX19mdW5jX18sIGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCQkJcmV0ID0gLUVOT0VOVDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCXNpbmZvLT5maWxsZWQgfD0gQklUKE5MODAyMTFfU1RBX0lORk9fU0lHTkFMKTsKLQkJc2luZm8tPnNpZ25hbCA9IHRyYW5zbGF0ZV9wZXJjZW50YWdlX3RvX2RibShwYWRhcHRlci0+cmVjdnByaXYuCi0JCQkJCQkJICAgIHNpZ25hbF9zdHJlbmd0aCk7Ci0KLQkJc2luZm8tPmZpbGxlZCB8PSBCSVQoTkw4MDIxMV9TVEFfSU5GT19UWF9CSVRSQVRFKTsKLQkJc2luZm8tPnR4cmF0ZS5sZWdhY3kgPSBydHdfZ2V0X2N1cl9tYXhfcmF0ZShwYWRhcHRlcik7Ci0KLQkJc2luZm8tPmZpbGxlZCB8PSBCSVQoTkw4MDIxMV9TVEFfSU5GT19SWF9QQUNLRVRTKTsKLQkJc2luZm8tPnJ4X3BhY2tldHMgPSBzdGFfcnhfZGF0YV9wa3RzKHBzdGEpOwotCi0JCXNpbmZvLT5maWxsZWQgfD0gQklUKE5MODAyMTFfU1RBX0lORk9fVFhfUEFDS0VUUyk7Ci0JCXNpbmZvLT50eF9wYWNrZXRzID0gcHN0YS0+c3RhX3N0YXRzLnR4X3BrdHM7Ci0JfQotCi0JLyogZm9yIEFkLUhvYy9BUCBtb2RlICovCi0JaWYgKChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSkgfHwKLQkgICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkgfHwKLQkgICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgJiYKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpCi0JICAgICkgewotCQkvKiBUT0RPOiBzaG91bGQgYWNxdWlyZSBzdGF0aW9uIGluZm8uLi4gKi8KLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9pbmZyYXN0cnVjdHVyZV9tb2RlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJIGVudW0gbmw4MDIxMV9pZnR5cGUgaWZtb2RlKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQllbnVtIG5sODAyMTFfaWZ0eXBlIG9sZF9tb2RlOwotCi0Jb2xkX21vZGUgPSBjdXJfbmV0d29yay0+bmV0d29yay5pZm1vZGU7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X25vdGljZV8sCi0JCSAiKyVzOiBvbGQgPSVkIG5ldyA9JWQgZndfc3RhdGUgPSAweCUwOHhcbiIsIF9fZnVuY19fLAotCQkgb2xkX21vZGUsIGlmbW9kZSwgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci0KLQlpZiAob2xkX21vZGUgIT0gaWZtb2RlKSB7Ci0JCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJjaGFuZ2UgbW9kZSFcbiIpOwotCi0JCWlmIChvbGRfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAotCQkgICAgb2xkX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0dPKSB7Ci0JCQkvKiBjaGFuZ2UgdG8gb3RoZXIgbW9kZSBmcm9tIE5kaXM4MDJfMTFBUE1vZGUgKi8KLQkJCWN1cl9uZXR3b3JrLT5qb2luX3JlcyA9IC0xOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JCQlzdG9wX2FwX21vZGUyM2EocGFkYXB0ZXIpOwotI2VuZGlmCi0JCX0KLQotCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpIHx8Ci0JCSAgICBvbGRfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKLQkJCXJ0d19kaXNhc3NvY19jbWQyM2EocGFkYXB0ZXIsIDAsIHRydWUpOwotCi0JCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkgfHwKLQkJICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpCi0JCQlydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2EocGFkYXB0ZXIsIDEpOwotCi0JCWlmIChvbGRfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8Ci0JCSAgICBvbGRfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UIHx8Ci0JCSAgICBvbGRfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgewotCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQkJCS8qIHdpbGwgY2xyIExpbmtlZF9zdGF0ZTsgYmVmb3JlIHRoaXMgZnVuY3Rpb24sCi0JCQkJICAgd2UgbXVzdCBoYXZlIGNoa2VkIHdoZXRoZXIgaXNzdWUKLQkJCQkgICBkaXMtYXNzb2NfY21kIG9yIG5vdCAqLwotCQkJCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHBhZGFwdGVyKTsKLQkJCX0KLQkgICAgICAgfQotCi0JCWN1cl9uZXR3b3JrLT5uZXR3b3JrLmlmbW9kZSA9IGlmbW9kZTsKLQotCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgfldJRklfTlVMTF9TVEFURSk7Ci0KLQkJc3dpdGNoIChpZm1vZGUpIHsKLQkJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKLQkJCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSk7Ci0JCQlicmVhazsKLQotCQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6Ci0JCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0dPOgotCQljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgotCQkJc2V0X2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKTsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQkJCXN0YXJ0X2FwX21vZGUyM2EocGFkYXB0ZXIpOwotCQkJLyogcnR3X2luZGljYXRlX2Nvbm5lY3QyM2EocGFkYXB0ZXIpOyAqLwotI2VuZGlmCi0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBTZWNDbGVhckFsbEtleXMoYWRhcHRlcik7ICovCi0KLQkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0JfQotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19jaGFuZ2VfaWZhY2Uoc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJCSAgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLCB1MzIgKmZsYWdzLAotCQkJCSAgICAgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKLXsKLQllbnVtIG5sODAyMTFfaWZ0eXBlIG9sZF90eXBlOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSB3aXBoeV90b19hZGFwdGVyKHdpcGh5KTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCB3aXJlbGVzc19kZXYgKnJ0d193ZGV2ID0gd2lwaHlfdG9fd2Rldih3aXBoeSk7Ci0JaW50IHJldCA9IDA7Ci0KLQlEQkdfODcyM0EoIiVzKCVzKTogY2FsbCBuZXRkZXZfb3BlbjIzYVxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUpOwotCi0Jb2xkX3R5cGUgPSBydHdfd2Rldi0+aWZ0eXBlOwotCURCR184NzIzQSgiJXMoJXMpOiBvbGRfaWZ0eXBlID0lZCwgbmV3X2lmdHlwZSA9JWRcbiIsCi0JCSAgX19mdW5jX18sIG5kZXYtPm5hbWUsIG9sZF90eXBlLCB0eXBlKTsKLQotCWlmIChvbGRfdHlwZSAhPSB0eXBlKSB7Ci0JCXBtbG1lZXh0LT5hY3Rpb25fcHVibGljX3J4c2VxID0gMHhmZmZmOwotCQlwbWxtZWV4dC0+YWN0aW9uX3B1YmxpY19kaWFsb2dfdG9rZW4gPSAweGZmOwotCX0KLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzoKLQljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0KLQlydHdfd2Rldi0+aWZ0eXBlID0gdHlwZTsKLQotCWlmIChjZmc4MDIxMV9pbmZyYXN0cnVjdHVyZV9tb2RlKHBhZGFwdGVyLCB0eXBlKSAhPSBfU1VDQ0VTUykgewotCQlydHdfd2Rldi0+aWZ0eXBlID0gb2xkX3R5cGU7Ci0JCXJldCA9IC1FUEVSTTsKLQkJZ290byBleGl0OwotCX0KLQotCXJ0d19zZXRvcG1vZGVfY21kMjNhKHBhZGFwdGVyLCB0eXBlKTsKLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zY2FuX2RvbmUoc3RydWN0IHJ0d193ZGV2X3ByaXYgKnB3ZGV2X3ByaXYsCi0JCQkJICAgICBib29sIGFib3J0ZWQpCi17Ci0Jc3Bpbl9sb2NrX2JoKCZwd2Rldl9wcml2LT5zY2FuX3JlcV9sb2NrKTsKLQlpZiAocHdkZXZfcHJpdi0+c2Nhbl9yZXF1ZXN0ICE9IE5VTEwpIHsKLQkJREJHXzg3MjNBKCIlcyB3aXRoIHNjYW4gcmVxXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJaWYgKHB3ZGV2X3ByaXYtPnNjYW5fcmVxdWVzdC0+d2lwaHkgIT0KLQkJICAgIHB3ZGV2X3ByaXYtPnJ0d193ZGV2LT53aXBoeSkgewotCQkJREJHXzg3MjNBKCJlcnJvciB3aXBoeSBjb21wYXJlXG4iKTsKLQkJfSBlbHNlIHsKLQkJCXN0cnVjdCBjZmc4MDIxMV9zY2FuX2luZm8gaW5mbyA9IHsKLQkJCQkuYWJvcnRlZCA9IGFib3J0ZWQsCi0JCQl9OwotCi0JCQljZmc4MDIxMV9zY2FuX2RvbmUocHdkZXZfcHJpdi0+c2Nhbl9yZXF1ZXN0LCAmaW5mbyk7Ci0JCX0KLQotCQlwd2Rldl9wcml2LT5zY2FuX3JlcXVlc3QgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCURCR184NzIzQSgiJXMgd2l0aG91dCBzY2FuIHJlcVxuIiwgX19mdW5jX18pOwotCX0KLQlzcGluX3VubG9ja19iaCgmcHdkZXZfcHJpdi0+c2Nhbl9yZXFfbG9jayk7Ci19Ci0KLXZvaWQgcnR3X2NmZzgwMjExX3N1cnZleWRvbmVfZXZlbnRfY2FsbGJhY2soc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBydHdfcXVldWUgKnF1ZXVlID0gJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZTsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaywgKnB0bXA7Ci0KLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwbmV0d29yaywgcHRtcCwgcGhlYWQsIGxpc3QpIHsKLQkJLyogcmVwb3J0IG5ldHdvcmsgb25seSBpZiB0aGUgY3VycmVudCBjaGFubmVsIHNldAotCQkgICBjb250YWlucyB0aGUgY2hhbm5lbCB0byB3aGljaCB0aGlzIG5ldHdvcmsgYmVsb25ncyAqLwotCQlpZiAocnR3X2NoX3NldF9zZWFyY2hfY2gyM2EKLQkJICAgIChwYWRhcHRlci0+bWxtZWV4dHByaXYuY2hhbm5lbF9zZXQsCi0JCSAgICAgcG5ldHdvcmstPm5ldHdvcmsuRFNDb25maWcpID49IDApCi0JCQlydHdfY2ZnODAyMTFfaW5mb3JtX2JzcyhwYWRhcHRlciwgcG5ldHdvcmspOwotCX0KLQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCi0JLyogY2FsbCB0aGlzIGFmdGVyIG90aGVyIHRoaW5ncyBoYXZlIGJlZW4gZG9uZSAqLwotCXJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zY2FuX2RvbmUod2Rldl90b19wcml2KHBhZGFwdGVyLT5ydHdfd2RldiksCi0JCQkJCWZhbHNlKTsKLX0KLQotc3RhdGljIGludCBydHdfY2ZnODAyMTFfc2V0X3Byb2JlX3JlcV93cHNwMnBpZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQkgICAgICAgY2hhciAqYnVmLCBpbnQgbGVuKQotewotCWludCByZXQgPSAwOwotCWNvbnN0IHU4ICp3cHNfaWU7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCURCR184NzIzQSgiJXMsIGllbGVuID0lZFxuIiwgX19mdW5jX18sIGxlbik7Ci0KLQlpZiAobGVuID4gMCkgewotCQl3cHNfaWUgPSBjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZShXTEFOX09VSV9NSUNST1NPRlQsCi0JCQkJCQkgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV1BTLAotCQkJCQkJIGJ1ZiwgbGVuKTsKLQkJaWYgKHdwc19pZSkgewotCQkJREJHXzg3MjNBKCJwcm9iZV9yZXFfd3BzX2llbGVuID0lZFxuIiwgd3BzX2llWzFdKTsKLQotCQkJaWYgKHBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSkgewotCQkJCXBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZV9sZW4gPSAwOwotCQkJCWtmcmVlKHBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSk7Ci0JCQkJcG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llID0gTlVMTDsKLQkJCX0KLQotCQkJcG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llID0ga21lbWR1cCh3cHNfaWUsIHdwc19pZVsxXSwKLQkJCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKLQkJCWlmIChwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWUgPT0gTlVMTCkgewotCQkJCURCR184NzIzQSgiJXMoKS0lZDoga21hbGxvYygpIEVSUk9SIVxuIiwKLQkJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJcG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llX2xlbiA9IHdwc19pZVsxXTsKLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X3NjYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCSAgICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxdWVzdCkKLXsKLQlpbnQgaTsKLQl1OCBfc3RhdHVzID0gZmFsc2U7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IGNmZzgwMjExX3NzaWQgc3NpZFtSVFdfU1NJRF9TQ0FOX0FNT1VOVF07Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCBjaFtSVFdfQ0hBTk5FTF9TQ0FOX0FNT1VOVF07Ci0Jc3RydWN0IHJ0d193ZGV2X3ByaXYgKnB3ZGV2X3ByaXYgPSB3ZGV2X3RvX3ByaXYocGFkYXB0ZXItPnJ0d193ZGV2KTsKLQlzdHJ1Y3QgY2ZnODAyMTFfc3NpZCAqc3NpZHMgPSByZXF1ZXN0LT5zc2lkczsKLQlib29sIG5lZWRfaW5kaWNhdGVfc2Nhbl9kb25lID0gZmFsc2U7Ci0KLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQotCXNwaW5fbG9ja19iaCgmcHdkZXZfcHJpdi0+c2Nhbl9yZXFfbG9jayk7Ci0JcHdkZXZfcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gcmVxdWVzdDsKLQlzcGluX3VubG9ja19iaCgmcHdkZXZfcHJpdi0+c2Nhbl9yZXFfbG9jayk7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSB7Ci0JCURCR184NzIzQSgiJXMgdW5kZXIgV0lGSV9BUF9TVEFURVxuIiwgX19mdW5jX18pOwotCQkvKiBuZWVkX2luZGljYXRlX3NjYW5fZG9uZSA9IHRydWU7ICovCi0JCS8qIGdvdG8gY2hlY2tfbmVlZF9pbmRpY2F0ZV9zY2FuX2RvbmU7ICovCi0JfQotCi0JaWYgKHJ0d19wd3Jfd2FrZXVwKHBhZGFwdGVyKSA9PSBfRkFJTCkgewotCQluZWVkX2luZGljYXRlX3NjYW5fZG9uZSA9IHRydWU7Ci0JCWdvdG8gY2hlY2tfbmVlZF9pbmRpY2F0ZV9zY2FuX2RvbmU7Ci0JfQotCi0JaWYgKHJlcXVlc3QtPmllICYmIHJlcXVlc3QtPmllX2xlbiA+IDApIHsKLQkJcnR3X2NmZzgwMjExX3NldF9wcm9iZV9yZXFfd3BzcDJwaWUocGFkYXB0ZXIsCi0JCQkJCQkgICAgKHU4ICopIHJlcXVlc3QtPmllLAotCQkJCQkJICAgIHJlcXVlc3QtPmllX2xlbik7Ci0JfQotCi0JaWYgKHBtbG1lcHJpdi0+TGlua0RldGVjdEluZm8uYkJ1c3lUcmFmZmljID09IHRydWUpIHsKLQkJREJHXzg3MjNBKCIlcywgYkJ1c3lUcmFmZmljID09IHRydWVcbiIsIF9fZnVuY19fKTsKLQkJbmVlZF9pbmRpY2F0ZV9zY2FuX2RvbmUgPSB0cnVlOwotCQlnb3RvIGNoZWNrX25lZWRfaW5kaWNhdGVfc2Nhbl9kb25lOwotCX0KLQlpZiAocnR3X2lzX3NjYW5fZGVueShwYWRhcHRlcikpIHsKLQkJREJHXzg3MjNBKCIlcyglcyk6IHNjYW4gZGVueVxuIiwgX19mdW5jX18sCi0JCQkgIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQkJbmVlZF9pbmRpY2F0ZV9zY2FuX2RvbmUgPSB0cnVlOwotCQlnb3RvIGNoZWNrX25lZWRfaW5kaWNhdGVfc2Nhbl9kb25lOwotCX0KLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSB8IF9GV19VTkRFUl9MSU5LSU5HKSA9PQotCSAgICB0cnVlKSB7Ci0JCURCR184NzIzQSgiJXMsIGZ3c3RhdGUgPSAweCV4XG4iLCBfX2Z1bmNfXywgcG1sbWVwcml2LT5md19zdGF0ZSk7Ci0JCW5lZWRfaW5kaWNhdGVfc2Nhbl9kb25lID0gdHJ1ZTsKLQkJZ290byBjaGVja19uZWVkX2luZGljYXRlX3NjYW5fZG9uZTsKLQl9Ci0KLQltZW1zZXQoc3NpZCwgMCwgc2l6ZW9mKHN0cnVjdCBjZmc4MDIxMV9zc2lkKSAqIFJUV19TU0lEX1NDQU5fQU1PVU5UKTsKLQkvKiBwYXJzaW5nIHJlcXVlc3Qgc3NpZHMsIG5fc3NpZHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcmVxdWVzdC0+bl9zc2lkcyAmJiBpIDwgUlRXX1NTSURfU0NBTl9BTU9VTlQ7IGkrKykgewotCQlEQkdfODcyM0EoInNzaWQgPSVzLCBsZW4gPSVkXG4iLCBzc2lkc1tpXS5zc2lkLAotCQkJICBzc2lkc1tpXS5zc2lkX2xlbik7Ci0JCW1lbWNweShzc2lkW2ldLnNzaWQsIHNzaWRzW2ldLnNzaWQsIHNzaWRzW2ldLnNzaWRfbGVuKTsKLQkJc3NpZFtpXS5zc2lkX2xlbiA9IHNzaWRzW2ldLnNzaWRfbGVuOwotCX0KLQotCS8qIHBhcnNpbmcgY2hhbm5lbHMsIG5fY2hhbm5lbHMgKi8KLQltZW1zZXQoY2gsIDAsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9jaGFubmVsKSAqIFJUV19DSEFOTkVMX1NDQU5fQU1PVU5UKTsKLQotCWlmIChyZXF1ZXN0LT5uX2NoYW5uZWxzID09IDEpIHsKLQkJZm9yIChpID0gMDsgaSA8IHJlcXVlc3QtPm5fY2hhbm5lbHMgJiYKLQkJICAgICBpIDwgUlRXX0NIQU5ORUxfU0NBTl9BTU9VTlQ7IGkrKykgewotCQkJREJHXzg3MjNBKCIlczooJXMpOiIgQ0hBTl9GTVQgIlxuIiwKLQkJCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKLQkJCQkgIENIQU5fQVJHKHJlcXVlc3QtPmNoYW5uZWxzW2ldKSk7Ci0JCQljaFtpXS5od192YWx1ZSA9IHJlcXVlc3QtPmNoYW5uZWxzW2ldLT5od192YWx1ZTsKLQkJCWNoW2ldLmZsYWdzID0gcmVxdWVzdC0+Y2hhbm5lbHNbaV0tPmZsYWdzOwotCQl9Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCWlmIChyZXF1ZXN0LT5uX2NoYW5uZWxzID09IDEpIHsKLQkJbWVtY3B5KCZjaFsxXSwgJmNoWzBdLCBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCkpOwotCQltZW1jcHkoJmNoWzJdLCAmY2hbMF0sIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9jaGFubmVsKSk7Ci0JCV9zdGF0dXMgPSBydHdfc2l0ZXN1cnZleV9jbWQyM2EocGFkYXB0ZXIsIHNzaWQsCi0JCQkJCSAgICAgUlRXX1NTSURfU0NBTl9BTU9VTlQsIGNoLCAzKTsKLQl9IGVsc2UgewotCQlfc3RhdHVzID0gcnR3X3NpdGVzdXJ2ZXlfY21kMjNhKHBhZGFwdGVyLCBzc2lkLAotCQkJCQkgICAgIFJUV19TU0lEX1NDQU5fQU1PVU5ULCBOVUxMLCAwKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLQlpZiAoX3N0YXR1cyA9PSBmYWxzZSkKLQkJcmV0ID0gLTE7Ci0KLWNoZWNrX25lZWRfaW5kaWNhdGVfc2Nhbl9kb25lOgotCWlmIChuZWVkX2luZGljYXRlX3NjYW5fZG9uZSkKLQkJcnR3X2NmZzgwMjExX3N1cnZleWRvbmVfZXZlbnRfY2FsbGJhY2socGFkYXB0ZXIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X3NldF93aXBoeV9wYXJhbXMoc3RydWN0IHdpcGh5ICp3aXBoeSwgdTMyIGNoYW5nZWQpCi17Ci0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19qb2luX2lic3Moc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQkJICBzdHJ1Y3QgY2ZnODAyMTFfaWJzc19wYXJhbXMgKnBhcmFtcykKLXsKLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19sZWF2ZV9pYnNzKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQotewotCURCR184NzIzQSgiJXMoJXMpXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2NmZzgwMjExX3NldF93cGFfdmVyc2lvbihzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiwKLQkJCQkJdTMyIHdwYV92ZXJzaW9uKQotewotCURCR184NzIzQSgiJXMsIHdwYV92ZXJzaW9uID0lZFxuIiwgX19mdW5jX18sIHdwYV92ZXJzaW9uKTsKLQotCWlmICghd3BhX3ZlcnNpb24pIHsKLQkJcHNlY3VyaXR5cHJpdi0+bmRpc2F1dGh0eXBlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHdwYV92ZXJzaW9uICYgKE5MODAyMTFfV1BBX1ZFUlNJT05fMSB8IE5MODAyMTFfV1BBX1ZFUlNJT05fMikpCi0JCXBzZWN1cml0eXByaXYtPm5kaXNhdXRodHlwZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKLQotLyoKLQlpZiAod3BhX3ZlcnNpb24gJiBOTDgwMjExX1dQQV9WRVJTSU9OXzIpCi0JewotCQlwc2VjdXJpdHlwcml2LT5uZGlzYXV0aHR5cGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOwotCX0KLSovCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBydHdfY2ZnODAyMTFfc2V0X2F1dGhfdHlwZShzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiwKLQkJCQkgICAgICBlbnVtIG5sODAyMTFfYXV0aF90eXBlIHNtZV9hdXRoX3R5cGUpCi17Ci0JREJHXzg3MjNBKCIlcywgbmw4MDIxMV9hdXRoX3R5cGUgPSVkXG4iLCBfX2Z1bmNfXywgc21lX2F1dGhfdHlwZSk7Ci0KLQlzd2l0Y2ggKHNtZV9hdXRoX3R5cGUpIHsKLQljYXNlIE5MODAyMTFfQVVUSFRZUEVfQVVUT01BVElDOgotCQlwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID0gZG90MTFBdXRoQWxncnRobV9BdXRvOwotCi0JCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9PUEVOX1NZU1RFTToKLQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fT3BlbjsKLQotCQlpZiAocHNlY3VyaXR5cHJpdi0+bmRpc2F1dGh0eXBlID4gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9Ci0JCQkJZG90MTFBdXRoQWxncnRobV84MDIxWDsKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0FVVEhUWVBFX1NIQVJFRF9LRVk6Ci0JCXBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPSBkb3QxMUF1dGhBbGdydGhtX1NoYXJlZDsKLQotCQlwc2VjdXJpdHlwcml2LT5uZGlzZW5jcnlwdHN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPSBkb3QxMUF1dGhBbGdydGhtX09wZW47Ci0JCS8qIHJldHVybiAtRU5PVFNVUFA7ICovCi0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2NmZzgwMjExX3NldF9jaXBoZXIoc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYsCi0JCQkJICAgdTMyIGNpcGhlciwgYm9vbCB1Y2FzdCkKLXsKLQl1MzIgbmRpc2VuY3J5cHRzdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwotCi0JdTMyICpwcm9maWxlX2NpcGhlciA9IHVjYXN0ID8gJnBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gOgotCSAgICAmcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3k7Ci0KLQlEQkdfODcyM0EoIiVzLCB1Y2FzdCA9JWQsIGNpcGhlciA9IDB4JXhcbiIsIF9fZnVuY19fLCB1Y2FzdCwgY2lwaGVyKTsKLQotCWlmICghY2lwaGVyKSB7Ci0JCSpwcm9maWxlX2NpcGhlciA9IDA7Ci0JCXBzZWN1cml0eXByaXYtPm5kaXNlbmNyeXB0c3RhdHVzID0gbmRpc2VuY3J5cHRzdGF0dXM7Ci0JCXJldHVybiAwOwotCX0KLQotCXN3aXRjaCAoY2lwaGVyKSB7Ci0JY2FzZSBJV19BVVRIX0NJUEhFUl9OT05FOgotCQkqcHJvZmlsZV9jaXBoZXIgPSAwOwotCQluZGlzZW5jcnlwdHN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6Ci0JCSpwcm9maWxlX2NpcGhlciA9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOwotCQluZGlzZW5jcnlwdHN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQkqcHJvZmlsZV9jaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ7Ci0JCW5kaXNlbmNyeXB0c3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQkqcHJvZmlsZV9jaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOwotCQluZGlzZW5jcnlwdHN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJKnByb2ZpbGVfY2lwaGVyID0gV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDsKLQkJbmRpc2VuY3J5cHRzdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlEQkdfODcyM0EoIlVuc3VwcG9ydGVkIGNpcGhlcjogMHgleFxuIiwgY2lwaGVyKTsKLQkJcmV0dXJuIC1FTk9UU1VQUDsKLQl9Ci0KLQlpZiAodWNhc3QpCi0JCXBzZWN1cml0eXByaXYtPm5kaXNlbmNyeXB0c3RhdHVzID0gbmRpc2VuY3J5cHRzdGF0dXM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBydHdfY2ZnODAyMTFfc2V0X2tleV9tZ3Qoc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYsCi0JCQkJICAgIHUzMiBrZXlfbWd0KQotewotCURCR184NzIzQSgiJXMsIGtleV9tZ3QgPSAweCV4XG4iLCBfX2Z1bmNfXywga2V5X21ndCk7Ci0KLQlpZiAoa2V5X21ndCA9PSBXTEFOX0FLTV9TVUlURV84MDIxWCkKLQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fODAyMVg7Ci0JZWxzZSBpZiAoa2V5X21ndCA9PSBXTEFOX0FLTV9TVUlURV9QU0spCi0JCXBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPSBkb3QxMUF1dGhBbGdydGhtXzgwMjFYOwotCWVsc2UKLQkJREJHXzg3MjNBKCJJbnZhbGlkIGtleSBtZ3Q6IDB4JXhcbiIsIGtleV9tZ3QpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2NmZzgwMjExX3NldF93cGFfaWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBpZSwKLQkJCQkgICBzaXplX3QgaWVsZW4pCi17Ci0JY29uc3QgdTggKndwc19pZTsKLQlpbnQgZ3JvdXBfY2lwaGVyID0gMCwgcGFpcndpc2VfY2lwaGVyID0gMDsKLQlpbnQgcmV0ID0gMDsKLQljb25zdCB1OCAqcHdwYSwgKnB3cGEyOwotCWludCBpOwotCi0JaWYgKCFwaWUgfHwgIWllbGVuKSB7Ci0JCS8qIFRyZWF0IHRoaXMgYXMgbm9ybWFsIGNhc2UsIGJ1dCBuZWVkIHRvIGNsZWFyCi0JCSAgIFdJRklfVU5ERVJfV1BTICovCi0JCV9jbHJfZndzdGF0ZV8oJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9VTkRFUl9XUFMpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCWlmIChpZWxlbiA+IE1BWF9XUEFfSUVfTEVOICsgTUFYX1dQU19JRV9MRU4gKyBNQVhfUDJQX0lFX0xFTikgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogZHVtcCAqLwotCURCR184NzIzQSgic2V0IHdwYV9pZShsZW5ndGg6JXp1KTpcbiIsIGllbGVuKTsKLQlmb3IgKGkgPSAwOyBpIDwgaWVsZW47IGkgPSBpICsgOCkKLQkJREJHXzg3MjNBKCIweCUuMnggMHglLjJ4IDB4JS4yeCAweCUuMnggIgotCQkJICAiMHglLjJ4IDB4JS4yeCAweCUuMnggMHglLjJ4XG4iLAotCQkJICBwaWVbaV0sIHBpZVtpICsgMV0sIHBpZVtpICsgMl0sIHBpZVtpICsgM10sCi0JCQkgIHBpZVtpICsgNF0sIHBpZVtpICsgNV0sIHBpZVtpICsgNl0sIHBpZVtpICsgN10pOwotCWlmIChpZWxlbiA8IFJTTl9IRUFERVJfTEVOKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9vc19jLCBfZHJ2X2Vycl8sCi0JCQkgIkllIGxlbiB0b28gc2hvcnQgJWRcbiIsIChpbnQpaWVsZW4pOwotCQlyZXQgPSAtMTsKLQkJZ290byBleGl0OwotCX0KLQotCXB3cGEgPSBjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZShXTEFOX09VSV9NSUNST1NPRlQsCi0JCQkJICAgICAgIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQQSwKLQkJCQkgICAgICAgcGllLCBpZWxlbik7Ci0JaWYgKHB3cGEgJiYgcHdwYVsxXSA+IDApIHsKLQkJaWYgKHJ0d19wYXJzZV93cGFfaWUyM2EocHdwYSwgcHdwYVsxXSArIDIsICZncm91cF9jaXBoZXIsCi0JCQkJCSZwYWlyd2lzZV9jaXBoZXIsIE5VTEwpID09IF9TVUNDRVNTKSB7Ci0JCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExQXV0aEFsZ3J0aG0gPQotCQkJCWRvdDExQXV0aEFsZ3J0aG1fODAyMVg7Ci0JCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNhdXRodHlwZSA9Ci0JCQkJTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOwotCQkJbWVtY3B5KHBhZGFwdGVyLT5zZWN1cml0eXByaXYuc3VwcGxpY2FudF9pZSwgcHdwYSwKLQkJCSAgICAgICBwd3BhWzFdICsgMik7Ci0KLQkJCURCR184NzIzQSgiZ290IHdwYV9pZSwgd3BhX2llbGVuOiV1XG4iLCBwd3BhWzFdKTsKLQkJfQotCX0KLQotCXB3cGEyID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9SU04sIHBpZSwgaWVsZW4pOwotCWlmIChwd3BhMiAmJiBwd3BhMlsxXSA+IDApIHsKLQkJaWYgKHJ0d19wYXJzZV93cGEyX2llMjNhIChwd3BhMiwgcHdwYTJbMV0gKyAyLCAmZ3JvdXBfY2lwaGVyLAotCQkJCQkgICZwYWlyd2lzZV9jaXBoZXIsIE5VTEwpID09IF9TVUNDRVNTKSB7Ci0JCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExQXV0aEFsZ3J0aG0gPQotCQkJCWRvdDExQXV0aEFsZ3J0aG1fODAyMVg7Ci0JCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNhdXRodHlwZSA9Ci0JCQkJTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKLQkJCW1lbWNweShwYWRhcHRlci0+c2VjdXJpdHlwcml2LnN1cHBsaWNhbnRfaWUsIHB3cGEyLAotCQkJICAgICAgIHB3cGEyWzFdICsgMik7Ci0KLQkJCURCR184NzIzQSgiZ290IHdwYTJfaWUsIHdwYTJfaWVsZW46JXVcbiIsIHB3cGEyWzFdKTsKLQkJfQotCX0KLQotCWlmIChncm91cF9jaXBoZXIgPT0gMCkgewotCQlncm91cF9jaXBoZXIgPSBXUEFfQ0lQSEVSX05PTkU7Ci0JfQotCWlmIChwYWlyd2lzZV9jaXBoZXIgPT0gMCkgewotCQlwYWlyd2lzZV9jaXBoZXIgPSBXUEFfQ0lQSEVSX05PTkU7Ci0JfQotCi0Jc3dpdGNoIChncm91cF9jaXBoZXIpIHsKLQljYXNlIFdQQV9DSVBIRVJfTk9ORToKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9IDA7Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPQotCQkJTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKLQkJYnJlYWs7Ci0JY2FzZSBXUEFfQ0lQSEVSX1dFUDQwOgotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExODAyMVhHcnBQcml2YWN5ID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA7Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPQotCQkJTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJYnJlYWs7Ci0JY2FzZSBXUEFfQ0lQSEVSX1RLSVA6Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTE4MDIxWEdycFByaXZhY3kgPSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOwotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID0KLQkJCU5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCWJyZWFrOwotCWNhc2UgV1BBX0NJUEhFUl9DQ01QOgotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExODAyMVhHcnBQcml2YWN5ID0gV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDsKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzZW5jcnlwdHN0YXR1cyA9Ci0JCQlOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCQlicmVhazsKLQljYXNlIFdQQV9DSVBIRVJfV0VQMTA0OgotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExODAyMVhHcnBQcml2YWN5ID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OwotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID0KLQkJCU5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCWJyZWFrOwotCX0KLQotCXN3aXRjaCAocGFpcndpc2VfY2lwaGVyKSB7Ci0JY2FzZSBXUEFfQ0lQSEVSX05PTkU6Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSA9IDA7Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPQotCQkJTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKLQkJYnJlYWs7Ci0JY2FzZSBXUEFfQ0lQSEVSX1dFUDQwOgotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDsKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzZW5jcnlwdHN0YXR1cyA9Ci0JCQlOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQlicmVhazsKLQljYXNlIFdQQV9DSVBIRVJfVEtJUDoKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDsKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzZW5jcnlwdHN0YXR1cyA9Ci0JCQlOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCQlicmVhazsKLQljYXNlIFdQQV9DSVBIRVJfQ0NNUDoKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID0gV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDsKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzZW5jcnlwdHN0YXR1cyA9Ci0JCQlOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCQlicmVhazsKLQljYXNlIFdQQV9DSVBIRVJfV0VQMTA0OgotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gPSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ7Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPQotCQkJTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJYnJlYWs7Ci0JfQotCi0Jd3BzX2llID0gY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xBTl9PVUlfTUlDUk9TT0ZULAotCQkJCQkgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV1BTLAotCQkJCQkgcGllLCBpZWxlbik7Ci0JaWYgKHdwc19pZSAmJiB3cHNfaWVbMV0gPiAwKSB7Ci0JCURCR184NzIzQSgiZ290IHdwc19pZSwgd3BzX2llbGVuOiV1XG4iLCB3cHNfaWVbMV0pOwotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2Lndwc19pZV9sZW4gPSB3cHNfaWVbMV07Ci0JCW1lbWNweShwYWRhcHRlci0+c2VjdXJpdHlwcml2Lndwc19pZSwgd3BzX2llLAotCQkgICAgICAgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi53cHNfaWVfbGVuKTsKLQkJc2V0X2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9VTkRFUl9XUFMpOwotCX0gZWxzZSB7Ci0JCV9jbHJfZndzdGF0ZV8oJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9VTkRFUl9XUFMpOwotCX0KLQotCS8qIFRLSVAgYW5kIEFFUyBkaXNhbGxvdyBtdWx0aWNhc3QgcGFja2V0cyB1bnRpbCBpbnN0YWxsaW5nIGdyb3VwIGtleSAqLwotCWlmIChwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gPT0KLQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCB8fAotCSAgICBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gPT0KLQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCkKLQkJLyogV1BTIG9wZW4gbmVlZCB0byBlbmFibGUgbXVsdGljYXN0ICovCi0JCS8qIGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9VTkRFUl9XUFMpID09IHRydWUpKi8KLQkJcnRsODcyM2Ffb2ZmX3Jjcl9hbShwYWRhcHRlcik7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfb3NfYywgX2Rydl9pbmZvXywKLQkJICJydHdfc2V0X3dwYV9pZTogcGFpcndpc2VfY2lwaGVyID0gMHglMDh4IHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPSVkIHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2F1dGh0eXBlID0lZFxuIiwKLQkJIHBhaXJ3aXNlX2NpcGhlciwKLQkJIHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMsCi0JCSBwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNhdXRodHlwZSk7Ci0KLWV4aXQ6Ci0JaWYgKHJldCkKLQkJX2Nscl9md3N0YXRlXygmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX1VOREVSX1dQUyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBydHdfY2ZnODAyMTFfYWRkX3dlcChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCXN0cnVjdCBydHdfd2VwX2tleSAqd2VwLCB1OCBrZXlpZCkKLXsKLQlpbnQgcmVzOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0KLQlpZiAoa2V5aWQgPj0gTlVNX1dFUF9LRVlTKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6a2V5aWQ+NCA9PmZhaWxcbiIsIF9fZnVuY19fKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlzd2l0Y2ggKHdlcC0+a2V5bGVuKSB7Ci0JY2FzZSBXTEFOX0tFWV9MRU5fV0VQNDA6Ci0JCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJCSAiJXM6d2VwLT5LZXlMZW5ndGggPSA1XG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9LRVlfTEVOX1dFUDEwNDoKLQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJCSAiJXM6d2VwLT5LZXlMZW5ndGggPSAxM1xuIiwgX19mdW5jX18pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0gMDsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJCSAiJXM6d2VwLT5LZXlMZW5ndGghPSA1IG9yIDEzXG4iLCBfX2Z1bmNfXyk7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJICIlczpiZWZvcmUgbWVtY3B5LCB3ZXAtPktleUxlbmd0aCA9IDB4JXgga2V5aWQgPSV4XG4iLAotCQkgX19mdW5jX18sIHdlcC0+a2V5bGVuLCBrZXlpZCk7Ci0KLQltZW1jcHkoJnBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLCB3ZXAsIHNpemVvZihzdHJ1Y3QgcnR3X3dlcF9rZXkpKTsKLQotCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUtleUluZGV4ID0ga2V5aWQ7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOnNlY3VyaXR5IGtleSBtYXRlcmlhbCA6ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLAotCQkgX19mdW5jX18sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMF0sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMV0sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMl0sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbM10sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbNF0sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbNV0sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbNl0sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbN10sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbOF0sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbOV0sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMTBdLAotCQkgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzExXSwKLQkJIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVsxMl0pOwotCi0JcmVzID0gcnR3X3NldF9rZXkyM2EocGFkYXB0ZXIsIHBzZWN1cml0eXByaXYsIGtleWlkLCAxKTsKLQotZXhpdDoKLQotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X3NldF9zc2lkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpuZXduZXR3b3JrKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQlpbnQgc3RhdHVzID0gX1NVQ0NFU1M7Ci0JdTMyIGN1cl90aW1lID0gMDsKLQotCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJzZXQgc3NpZCBbJXNdIGZ3X3N0YXRlID0gMHglMDh4XG4iLAotCQkJbmV3bmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWQsIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwotCi0JaWYgKHBhZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZCA9PSBmYWxzZSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgInNldF9zc2lkOiBod19pbml0X2NvbXBsZXRlZCA9PSBmYWxzZSA9PmV4aXQhISFcbiIpOwotCQlzdGF0dXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQotCURCR184NzIzQSgiU2V0IFNTSUQgdW5kZXIgZndfc3RhdGUgPSAweCUwOHhcbiIsIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkpCi0JCWdvdG8gaGFuZGxlX3RraXBfY291bnRlcm1lYXN1cmU7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUR8V0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sCi0JCQkgInNldF9zc2lkOiBfRldfTElOS0VEfHxXSUZJX0FESE9DX01BU1RFUl9TVEFURVxuIik7Ci0KLQkJaWYgKHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkX2xlbiA9PQotCQkgICAgbmV3bmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuICYmCi0JCSAgICAhbWVtY21wKCZwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZCwKLQkJCSAgICBuZXduZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZCwKLQkJCSAgICBuZXduZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZF9sZW4pKSB7Ci0JCQlpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywKLQkJCQkJIF9kcnZfZXJyXywKLQkJCQkJICJOZXcgU1NJRCBpcyBzYW1lIFNTSUQsIGZ3X3N0YXRlID0gMHglMDh4XG4iLAotCQkJCQkgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci0KLQkJCQlpZiAocnR3X2lzX3NhbWVfaWJzczIzYShwYWRhcHRlciwgcG5ldHdvcmspKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIGl0IG1lYW5zIGRyaXZlciBpcyBpbgotCQkJCQkgKiBXSUZJX0FESE9DX01BU1RFUl9TVEFURSwgd2UgbmVlZG4ndAotCQkJCQkgKiBjcmVhdGUgYnNzIGFnYWluLgotCQkJCQkgKi8KLQkJCQkJZ290byByZWxlYXNlX21sbWVfbG9jazsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIGlmIGluIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFIHwKLQkJCQkgKiBXSUZJX0FESE9DX1NUQVRFLCBjcmVhdGUgYnNzIG9yCi0JCQkJICogcmVqb2luIGFnYWluCi0JCQkJICovCi0JCQkJcnR3X2Rpc2Fzc29jX2NtZDIzYShwYWRhcHRlciwgMCwgdHJ1ZSk7Ci0KLQkJCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKQotCQkJCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShwYWRhcHRlcik7Ci0KLQkJCQlydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2EocGFkYXB0ZXIsIDEpOwotCi0JCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LAotCQkJCQkJICBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpIHsKLQkJCQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsCi0JCQkJCQkgICAgICBXSUZJX0FESE9DX01BU1RFUl9TVEFURSk7Ci0JCQkJCXNldF9md3N0YXRlKHBtbG1lcHJpdiwKLQkJCQkJCSAgICBXSUZJX0FESE9DX1NUQVRFKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJ0d19scHNfY3RybF93a19jbWQyM2EocGFkYXB0ZXIsCi0JCQkJCQkgICAgICAgTFBTX0NUUkxfSk9JTkJTUywgMSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiU2V0IFNTSUQgbm90IHRoZSBzYW1lIHNzaWRcbiIpOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJCQkgInNldF9zc2lkID1bJXNdIGxlbiA9IDB4JXhcbiIsCi0JCQkJIG5ld25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkLAotCQkJCSBuZXduZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZF9sZW4pOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJCQkgImFzc29jX3NzaWQgPVslc10gbGVuID0gMHgleFxuIiwKLQkJCQkgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQsCi0JCQkJIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkX2xlbik7Ci0KLQkJCXJ0d19kaXNhc3NvY19jbWQyM2EocGFkYXB0ZXIsIDAsIHRydWUpOwotCi0JCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKQotCQkJCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHBhZGFwdGVyKTsKLQotCQkJcnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhKHBhZGFwdGVyLCAxKTsKLQotCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpIHsKLQkJCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpOwotCQkJCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLWhhbmRsZV90a2lwX2NvdW50ZXJtZWFzdXJlOgotCi0JaWYgKHBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnRraXBfY291bnRlcm1lYXN1cmUgPT0gdHJ1ZSkgewotCQljdXJfdGltZSA9IGppZmZpZXM7Ci0KLQkJaWYgKChjdXJfdGltZSAtCi0JCSAgICAgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idGtpcF9jb3VudGVybWVhc3VyZV90aW1lKSA+Ci0JCSAgICA2MCAqIEhaKSB7Ci0JCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ0a2lwX2NvdW50ZXJtZWFzdXJlID0gZmFsc2U7Ci0JCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ0a2lwX2NvdW50ZXJtZWFzdXJlX3RpbWUgPSAwOwotCQl9IGVsc2UgewotCQkJc3RhdHVzID0gX0ZBSUw7Ci0JCQlnb3RvIHJlbGVhc2VfbWxtZV9sb2NrOwotCQl9Ci0JfQotCi0JbWVtY3B5KCZwbWxtZXByaXYtPmFzc29jX3NzaWQsICZuZXduZXR3b3JrLT5uZXR3b3JrLlNzaWQsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgY2ZnODAyMTFfc3NpZCkpOwotCi0JcG1sbWVwcml2LT5hc3NvY19ieV9ic3NpZCA9IGZhbHNlOwotCi0JcG1sbWVwcml2LT50b19qb2luID0gdHJ1ZTsKLQotCWlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpKSB7Ci0JCXBtbG1lcHJpdi0+Y3VyX25ldHdvcmsuam9pbl9yZXMgPSAtMjsKLQotCQlzdGF0dXMgPSBydHdfZG9fam9pbl9uZXR3b3JrKHBhZGFwdGVyLCBuZXduZXR3b3JrKTsKLQkJaWYgKHN0YXR1cyA9PSBfU1VDQ0VTUykgewotCQkJcG1sbWVwcml2LT50b19qb2luID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpKSB7Ci0JCQkJLyogc3dpdGNoIHRvIEFESE9DX01BU1RFUiAqLwotCQkJCXN0YXR1cyA9IHJ0d19kb19qb2luX2FkaG9jKHBhZGFwdGVyKTsKLQkJCQlpZiAoc3RhdHVzICE9IF9TVUNDRVNTKQotCQkJCQlnb3RvIHJlbGVhc2VfbWxtZV9sb2NrOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBjYW4ndCBhc3NvY2lhdGUgOyByZXNldCB1bmRlci1saW5raW5nICovCi0JCQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKTsKLQkJCQlzdGF0dXMgPSBfRkFJTDsKLQkJCQlwbWxtZXByaXYtPnRvX2pvaW4gPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLXJlbGVhc2VfbWxtZV9sb2NrOgotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi1leGl0OgotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfZXJyXywKLQkJICItJXM6IHN0YXR1cyA9JWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfY29ubmVjdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQlzdHJ1Y3QgY2ZnODAyMTFfY29ubmVjdF9wYXJhbXMgKnNtZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZCwgKnBsaXN0LCAqcHRtcDsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yayA9IE5VTEw7Ci0JLyogdTggbWF0Y2hlZF9ieV9ic3NpZCA9IGZhbHNlOyAqLwotCS8qIHU4IG1hdGNoZWRfYnlfc3NpZCA9IGZhbHNlOyAqLwotCXU4IG1hdGNoZWQgPSBmYWxzZTsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gd2lwaHlfdG9fYWRhcHRlcih3aXBoeSk7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCBydHdfcXVldWUgKnF1ZXVlID0gJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZTsKLQotCURCR184NzIzQSgiPT4iICIlcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQlEQkdfODcyM0EoInByaXZhY3kgPSVkLCBrZXkgPSVwLCBrZXlfbGVuID0lZCwga2V5X2lkeCA9JWRcbiIsCi0JCSAgc21lLT5wcml2YWN5LCBzbWUtPmtleSwgc21lLT5rZXlfbGVuLCBzbWUtPmtleV9pZHgpOwotCi0JaWYgKF9GQUlMID09IHJ0d19wd3Jfd2FrZXVwKHBhZGFwdGVyKSkgewotCQlyZXQgPSAtRVBFUk07Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSB7Ci0JCXJldCA9IC1FUEVSTTsKLQkJZ290byBleGl0OwotCX0KLQotCWlmICghc21lLT5zc2lkIHx8ICFzbWUtPnNzaWRfbGVuIHx8Ci0JICAgIHNtZS0+c3NpZF9sZW4gPiBJRUVFODAyMTFfTUFYX1NTSURfTEVOKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlEQkdfODcyM0EoInNzaWQgPSVzLCBsZW4gPSV6dVxuIiwgc21lLT5zc2lkLCBzbWUtPnNzaWRfbGVuKTsKLQotCWlmIChzbWUtPmJzc2lkKQotCQlEQkdfODcyM0EoImJzc2lkPSVwTVxuIiwgc21lLT5ic3NpZCk7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKSkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCURCR184NzIzQSgiJXMsIGZ3X3N0YXRlID0gMHgleCwgZ290byBleGl0XG4iLCBfX2Z1bmNfXywKLQkJCSAgcG1sbWVwcml2LT5md19zdGF0ZSk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSkgewotCQlydHdfc2Nhbl9hYm9ydDIzYShwYWRhcHRlcik7Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+bG9jayk7Ci0KLQlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBsaXN0LCBwdG1wLCBwaGVhZCkgewotCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7Ci0KLQkJaWYgKHNtZS0+YnNzaWQpIHsKLQkJCWlmICghZXRoZXJfYWRkcl9lcXVhbChwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLAotCQkJCQkgICAgICBzbWUtPmJzc2lkKSkKLQkJCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChzbWUtPnNzaWQgJiYgc21lLT5zc2lkX2xlbikgewotCQkJaWYgKHBuZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZF9sZW4gIT0gc21lLT5zc2lkX2xlbiB8fAotCQkJICAgIG1lbWNtcChwbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWQsIHNtZS0+c3NpZCwKLQkJCQkgICBzbWUtPnNzaWRfbGVuKSkKLQkJCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChzbWUtPmJzc2lkKSB7Ci0JCQlpZiAoZXRoZXJfYWRkcl9lcXVhbChwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLAotCQkJCQkgICAgIHNtZS0+YnNzaWQpKSB7Ci0JCQkJREJHXzg3MjNBKCJtYXRjaGVkIGJ5IGJzc2lkXG4iKTsKLQotCQkJCW1hdGNoZWQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgaWYgKHNtZS0+c3NpZCAmJiBzbWUtPnNzaWRfbGVuKSB7Ci0JCQlpZiAoIW1lbWNtcChwbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWQsCi0JCQkJICAgIHNtZS0+c3NpZCwgc21lLT5zc2lkX2xlbikgJiYKLQkJCSAgICBwbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuID09IHNtZS0+c3NpZF9sZW4pIHsKLQkJCQlEQkdfODcyM0EoIm1hdGNoZWQgYnkgc3NpZFxuIik7Ci0KLQkJCQltYXRjaGVkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZS0+bG9jayk7Ci0KLQlpZiAoIW1hdGNoZWQgfHwgIXBuZXR3b3JrKSB7Ci0JCXJldCA9IC1FTk9FTlQ7Ci0JCURCR184NzIzQSgiY29ubmVjdCwgbWF0Y2hlZCA9PSBmYWxzZSwgZ290byBleGl0XG4iKTsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChjZmc4MDIxMV9pbmZyYXN0cnVjdHVyZV9tb2RlKAotCQkgICAgcGFkYXB0ZXIsIHBuZXR3b3JrLT5uZXR3b3JrLmlmbW9kZSkgIT0gX1NVQ0NFU1MpIHsKLQkJcmV0ID0gLUVQRVJNOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcHNlY3VyaXR5cHJpdi0+bmRpc2VuY3J5cHRzdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwotCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPSAwOwotCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0gMDsKLQlwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID0gZG90MTFBdXRoQWxncnRobV9PcGVuOwotCXBzZWN1cml0eXByaXYtPm5kaXNhdXRodHlwZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0KLQlyZXQgPSBydHdfY2ZnODAyMTFfc2V0X3dwYV92ZXJzaW9uKHBzZWN1cml0eXByaXYsCi0JCQkJCSAgIHNtZS0+Y3J5cHRvLndwYV92ZXJzaW9ucyk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXhpdDsKLQotCXJldCA9IHJ0d19jZmc4MDIxMV9zZXRfYXV0aF90eXBlKHBzZWN1cml0eXByaXYsIHNtZS0+YXV0aF90eXBlKTsKLQotCWlmIChyZXQgPCAwKQotCQlnb3RvIGV4aXQ7Ci0KLQlEQkdfODcyM0EoIiVzLCBpZV9sZW4gPSV6dVxuIiwgX19mdW5jX18sIHNtZS0+aWVfbGVuKTsKLQotCXJldCA9IHJ0d19jZmc4MDIxMV9zZXRfd3BhX2llKHBhZGFwdGVyLCBzbWUtPmllLCBzbWUtPmllX2xlbik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXhpdDsKLQotCWlmIChzbWUtPmNyeXB0by5uX2NpcGhlcnNfcGFpcndpc2UpIHsKLQkJcmV0ID0gcnR3X2NmZzgwMjExX3NldF9jaXBoZXIocHNlY3VyaXR5cHJpdiwKLQkJCQkJICAgICAgc21lLT5jcnlwdG8uY2lwaGVyc19wYWlyd2lzZVswXSwKLQkJCQkJICAgICAgdHJ1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBleGl0OwotCX0KLQotCS8qIEZvciBXRVAgU2hhcmVkIGF1dGggKi8KLQlpZiAoKHBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPT0gZG90MTFBdXRoQWxncnRobV9TaGFyZWQgfHwKLQkgICAgIHBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPT0gZG90MTFBdXRoQWxncnRobV9BdXRvKSAmJgotCSAgICBzbWUtPmtleSkgewotCQlzdHJ1Y3QgcnR3X3dlcF9rZXkgd2VwX2tleTsKLQkJdTggd2VwX2tleV9pZHgsIHdlcF9rZXlfbGVuOwotCQlEQkdfODcyM0EoIiVzKCk6IFNoYXJlZC9BdXRvIFdFUFxuIiwgX19mdW5jX18pOwotCi0JCXdlcF9rZXlfaWR4ID0gc21lLT5rZXlfaWR4OwotCQl3ZXBfa2V5X2xlbiA9IHNtZS0+a2V5X2xlbjsKLQotCQlpZiAod2VwX2tleV9pZHggPiBXRVBfS0VZUyB8fCAhd2VwX2tleV9sZW4gfHwKLQkJICAgIHdlcF9rZXlfbGVuID4gV0xBTl9LRVlfTEVOX1dFUDEwNCkgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCXdlcF9rZXlfbGVuID0gd2VwX2tleV9sZW4gPD0gNSA/IDUgOiAxMzsKLQotCQltZW1zZXQoJndlcF9rZXksIDAsIHNpemVvZihzdHJ1Y3QgcnR3X3dlcF9rZXkpKTsKLQotCQl3ZXBfa2V5LmtleWxlbiA9IHdlcF9rZXlfbGVuOwotCi0JCWlmICh3ZXBfa2V5X2xlbiA9PSAxMykgewotCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID0KLQkJCQlXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ7Ci0JCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExODAyMVhHcnBQcml2YWN5ID0KLQkJCQlXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gPQotCQkJCVdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOwotCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9Ci0JCQkJV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA7Ci0JCX0KLQotCQltZW1jcHkod2VwX2tleS5rZXksICh2b2lkICopc21lLT5rZXksIHdlcF9rZXkua2V5bGVuKTsKLQotCQlpZiAocnR3X2NmZzgwMjExX2FkZF93ZXAocGFkYXB0ZXIsICZ3ZXBfa2V5LCB3ZXBfa2V5X2lkeCkgIT0KLQkJICAgIF9TVUNDRVNTKQotCQkJcmV0ID0gLUVPUE5PVFNVUFA7Ci0KLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcmV0ID0gcnR3X2NmZzgwMjExX3NldF9jaXBoZXIocHNlY3VyaXR5cHJpdiwKLQkJCQkgICAgICBzbWUtPmNyeXB0by5jaXBoZXJfZ3JvdXAsIGZhbHNlKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBleGl0OwotCi0JaWYgKHNtZS0+Y3J5cHRvLm5fYWttX3N1aXRlcykgewotCQlyZXQgPSBydHdfY2ZnODAyMTFfc2V0X2tleV9tZ3QocHNlY3VyaXR5cHJpdiwKLQkJCQkJICAgICAgIHNtZS0+Y3J5cHRvLmFrbV9zdWl0ZXNbMF0pOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAocHNlY3VyaXR5cHJpdi0+bmRpc2F1dGh0eXBlID4gMykKLQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fODAyMVg7Ci0KLQlpZiAocnR3X3NldF9hdXRoMjNhKHBhZGFwdGVyLCBwc2VjdXJpdHlwcml2KSAhPSBfU1VDQ0VTUykgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBydHdfc2V0XzgwMl8xMV9lbmNyeXB0aW9uX21vZGUocGFkYXB0ZXIsCi0JICAgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzZW5jcnlwdHN0YXR1cyk7ICovCi0KLQlpZiAocnR3X3NldF9zc2lkKHBhZGFwdGVyLCBwbmV0d29yaykgIT0gX1NVQ0NFU1MpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JREJHXzg3MjNBKCJzZXQgc3NpZDpkb3QxMUF1dGhBbGdydGhtID0lZCwgZG90MTFQcml2YWN5QWxncnRobSA9JWQsICIKLQkJICAiZG90MTE4MDIxWEdycFByaXZhY3kgPSVkXG4iLCBwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtLAotCQkgIHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0sCi0JCSAgcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3kpOwotCi1leGl0OgotCi0JREJHXzg3MjNBKCI8PSVzLCByZXQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfZGlzY29ubmVjdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQkgICB1MTYgcmVhc29uX2NvZGUpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCi0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQotCXJ0d19zZXRfcm9hbWluZyhwYWRhcHRlciwgMCk7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQlydHdfc2Nhbl9hYm9ydDIzYShwYWRhcHRlcik7Ci0JCUxlYXZlQWxsUG93ZXJTYXZlTW9kZTIzYShwYWRhcHRlcik7Ci0JCXJ0d19kaXNhc3NvY19jbWQyM2EocGFkYXB0ZXIsIDUwMCwgZmFsc2UpOwotCi0JCURCR184NzIzQSgiJXMuLi5jYWxsIHJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcGFkYXB0ZXItPm1sbWVwcml2Lm5vdF9pbmRpY19kaXNjbyA9IHRydWU7Ci0JCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHBhZGFwdGVyKTsKLQkJcGFkYXB0ZXItPm1sbWVwcml2Lm5vdF9pbmRpY19kaXNjbyA9IGZhbHNlOwotCi0JCXJ0d19mcmVlX2Fzc29jX3Jlc291cmNlczIzYShwYWRhcHRlciwgMSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X3NldF90eHBvd2VyKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCi0JCQkJICAgIGVudW0gbmw4MDIxMV90eF9wb3dlcl9zZXR0aW5nIHR5cGUsIGludCBtYm0pCi17Ci0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19nZXRfdHhwb3dlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCSAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LCBpbnQgKmRibSkKLXsKLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JKmRibSA9IDEyOwotCXJldHVybiAwOwotfQotCi1pbmxpbmUgYm9vbCBydHdfY2ZnODAyMTFfcHdyX21nbXQoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBydHdfd2Rldl9wcml2ICpydHdfd2Rldl9wcml2ID0gd2Rldl90b19wcml2KGFkYXB0ZXItPnJ0d193ZGV2KTsKLQlyZXR1cm4gcnR3X3dkZXZfcHJpdi0+cG93ZXJfbWdtdDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfc2V0X3Bvd2VyX21nbXQoc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQkJICAgICAgIGJvb2wgZW5hYmxlZCwgaW50IHRpbWVvdXQpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCXN0cnVjdCBydHdfd2Rldl9wcml2ICpydHdfd2Rldl9wcml2ID0gd2Rldl90b19wcml2KHBhZGFwdGVyLT5ydHdfd2Rldik7Ci0KLQlEQkdfODcyM0EoIiVzKCVzKTogZW5hYmxlZDoldSwgdGltZW91dDolZFxuIiwKLQkJICBfX2Z1bmNfXywgbmRldi0+bmFtZSwgZW5hYmxlZCwgdGltZW91dCk7Ci0KLQlydHdfd2Rldl9wcml2LT5wb3dlcl9tZ210ID0gZW5hYmxlZDsKLQotCWlmICghZW5hYmxlZCkKLQkJTFBTX0xlYXZlMjNhKHBhZGFwdGVyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19zZXRfcG1rc2Eoc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICBzdHJ1Y3QgY2ZnODAyMTFfcG1rc2EgKnBta3NhKQotewotCXU4IGluZGV4LCBibEluc2VydGVkID0gZmFsc2U7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0KLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIG5ldGRldi0+bmFtZSk7Ci0KLQlpZiAoaXNfemVyb19ldGhlcl9hZGRyKHBta3NhLT5ic3NpZCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JYmxJbnNlcnRlZCA9IGZhbHNlOwotCi0JLyogb3ZlcndyaXRlIFBNS0lEICovCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX1BNS0lEX0NBQ0hFOyBpbmRleCsrKSB7Ci0JCWlmIChldGhlcl9hZGRyX2VxdWFsKHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpbmRleF0uQnNzaWQsCi0JCQkJICAgICBwbWtzYS0+YnNzaWQpKSB7Ci0JCQkvKiBCU1NJRCBpcyBtYXRjaGVkLCB0aGUgc2FtZSBBUCA9PiByZXdyaXRlIHdpdGgKLQkJCSAgIG5ldyBQTUtJRC4gKi8KLQkJCURCR184NzIzQSgiJXMoJXMpOiAgQlNTSUQgZXhpc3RzIGluIHRoZSBQTUtMaXN0LlxuIiwKLQkJCQkgIF9fZnVuY19fLCBuZXRkZXYtPm5hbWUpOwotCi0JCQltZW1jcHkocHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W2luZGV4XS5QTUtJRCwKLQkJCSAgICAgICBwbWtzYS0+cG1raWQsIFdMQU5fUE1LSURfTEVOKTsKLQkJCXBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpbmRleF0uYlVzZWQgPSB0cnVlOwotCQkJcHNlY3VyaXR5cHJpdi0+UE1LSURJbmRleCA9IGluZGV4ICsgMTsKLQkJCWJsSW5zZXJ0ZWQgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoIWJsSW5zZXJ0ZWQpIHsKLQkJLyogIEZpbmQgYSBuZXcgZW50cnkgKi8KLQkJREJHXzg3MjNBKCIlcyglcyk6IFVzZSBuZXcgZW50cnkgaW5kZXggPSAlZCBmb3IgdGhpcyBQTUtJRFxuIiwKLQkJCSAgX19mdW5jX18sIG5ldGRldi0+bmFtZSwgcHNlY3VyaXR5cHJpdi0+UE1LSURJbmRleCk7Ci0KLQkJZXRoZXJfYWRkcl9jb3B5KAotCQkJcHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W3BzZWN1cml0eXByaXYtPlBNS0lESW5kZXhdLgotCQkJQnNzaWQsIHBta3NhLT5ic3NpZCk7Ci0JCW1lbWNweShwc2VjdXJpdHlwcml2LT5QTUtJRExpc3RbcHNlY3VyaXR5cHJpdi0+UE1LSURJbmRleF0uCi0JCSAgICAgICBQTUtJRCwgcG1rc2EtPnBta2lkLCBXTEFOX1BNS0lEX0xFTik7Ci0KLQkJcHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W3BzZWN1cml0eXByaXYtPlBNS0lESW5kZXhdLmJVc2VkID0KLQkJCXRydWU7Ci0JCXBzZWN1cml0eXByaXYtPlBNS0lESW5kZXgrKzsKLQkJaWYgKHBzZWN1cml0eXByaXYtPlBNS0lESW5kZXggPT0gMTYpIHsKLQkJCXBzZWN1cml0eXByaXYtPlBNS0lESW5kZXggPSAwOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X2RlbF9wbWtzYShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgIHN0cnVjdCBjZmc4MDIxMV9wbWtzYSAqcG1rc2EpCi17Ci0JdTggaW5kZXgsIGJNYXRjaGVkID0gZmFsc2U7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0KLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIG5ldGRldi0+bmFtZSk7Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fUE1LSURfQ0FDSEU7IGluZGV4KyspIHsKLQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwocHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W2luZGV4XS5Cc3NpZCwKLQkJCQkgICAgIHBta3NhLT5ic3NpZCkpIHsKLQkJCS8qIEJTU0lEIGlzIG1hdGNoZWQsIHRoZSBzYW1lIEFQID0+IFJlbW92ZSB0aGlzIFBNS0lECi0JCQkgICBpbmZvcm1hdGlvbiBhbmQgcmVzZXQgaXQuICovCi0JCQlldGhfemVyb19hZGRyKHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpbmRleF0uQnNzaWQpOwotCQkJbWVtc2V0KHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpbmRleF0uUE1LSUQsIDB4MDAsCi0JCQkgICAgICAgV0xBTl9QTUtJRF9MRU4pOwotCQkJcHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W2luZGV4XS5iVXNlZCA9IGZhbHNlOwotCQkJYk1hdGNoZWQgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoZmFsc2UgPT0gYk1hdGNoZWQpIHsKLQkJREJHXzg3MjNBKCIlcyglcyk6IGRvIG5vdCBoYXZlIG1hdGNoZWQgQlNTSURcbiIsIF9fZnVuY19fLAotCQkJICBuZXRkZXYtPm5hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfZmx1c2hfcG1rc2Eoc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gd2lwaHlfdG9fYWRhcHRlcih3aXBoeSk7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQotCURCR184NzIzQSgiJXMoJXMpXG4iLCBfX2Z1bmNfXywgbmV0ZGV2LT5uYW1lKTsKLQotCW1lbXNldCgmcHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0WzBdLCAweDAwLAotCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3Bta2lkX2xpc3QpICogTlVNX1BNS0lEX0NBQ0hFKTsKLQlwc2VjdXJpdHlwcml2LT5QTUtJREluZGV4ID0gMDsKLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zdGFfYXNzb2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgIHU4ICpwbWdtdF9mcmFtZSwgdWludCBmcmFtZV9sZW4pCi17Ci0JczMyIGZyZXE7Ci0JaW50IGNoYW5uZWw7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCi0JREJHXzg3MjNBKCIlcyhwYWRhcHRlciA9JXAsJXMpXG4iLCBfX2Z1bmNfXywgcGFkYXB0ZXIsIG5kZXYtPm5hbWUpOwotCi0jaWYgZGVmaW5lZChSVFdfVVNFX0NGRzgwMjExX1NUQV9FVkVOVCkKLQl7Ci0JCXN0cnVjdCBzdGF0aW9uX2luZm8gc2luZm87Ci0JCXU4IGllX29mZnNldDsKLQotCQlpZiAoaWVlZTgwMjExX2lzX2Fzc29jX3JlcShoZHItPmZyYW1lX2NvbnRyb2wpKQotCQkJaWVfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LAotCQkJCQkgICAgIHUuYXNzb2NfcmVxLnZhcmlhYmxlKTsKLQkJZWxzZQkJLyogIFdJRklfUkVBU1NPQ1JFUSAqLwotCQkJaWVfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LAotCQkJCQkgICAgIHUucmVhc3NvY19yZXEudmFyaWFibGUpOwotCi0JCXNpbmZvLmZpbGxlZCA9IDA7Ci0JCXNpbmZvLmFzc29jX3JlcV9pZXMgPSBwbWdtdF9mcmFtZSArIGllX29mZnNldDsKLQkJc2luZm8uYXNzb2NfcmVxX2llc19sZW4gPSBmcmFtZV9sZW4gLSBpZV9vZmZzZXQ7Ci0JCWNmZzgwMjExX25ld19zdGEobmRldiwgaGRyLT5hZGRyMiwgJnNpbmZvLCBHRlBfQVRPTUlDKTsKLQl9Ci0jZWxzZSAvKiBkZWZpbmVkKFJUV19VU0VfQ0ZHODAyMTFfU1RBX0VWRU5UKSAqLwotCWNoYW5uZWwgPSBwbWxtZWV4dC0+Y3VyX2NoYW5uZWw7Ci0JaWYgKGNoYW5uZWwgPD0gUlRXX0NIX01BWF8yR19DSEFOTkVMKQotCQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5uZWwsCi0JCQkJCQkgICAgICBOTDgwMjExX0JBTkRfMkdIWik7Ci0JZWxzZQotCQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5uZWwsCi0JCQkJCQkgICAgICBOTDgwMjExX0JBTkRfNUdIWik7Ci0KLQljZmc4MDIxMV9yeF9tZ210KHBhZGFwdGVyLT5ydHdfd2RldiwgZnJlcSwgMCwgcG1nbXRfZnJhbWUsIGZyYW1lX2xlbiwKLQkJCSAwKTsKLSNlbmRpZiAvKiBkZWZpbmVkKFJUV19VU0VfQ0ZHODAyMTFfU1RBX0VWRU5UKSAqLwotfQotCi12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zdGFfZGlzYXNzb2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkJdW5zaWduZWQgY2hhciAqZGEsCi0JCQkJCXVuc2lnbmVkIHNob3J0IHJlYXNvbikKLXsKLQlzMzIgZnJlcTsKLQlpbnQgY2hhbm5lbDsKLQl1aW50IGZyYW1lX2xlbjsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgbWdtdDsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGFkYXB0ZXItPnBuZXRkZXY7Ci0KLQlEQkdfODcyM0EoIiVzKHBhZGFwdGVyID0lcCwlcylcbiIsIF9fZnVuY19fLCBwYWRhcHRlciwgbmRldi0+bmFtZSk7Ci0KLQltZW1zZXQoJm1nbXQsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQpKTsKLQotI2lmIGRlZmluZWQoUlRXX1VTRV9DRkc4MDIxMV9TVEFfRVZFTlQpCi0JY2ZnODAyMTFfZGVsX3N0YShuZGV2LCBkYSwgR0ZQX0FUT01JQyk7Ci0jZWxzZSAvKiBkZWZpbmVkKFJUV19VU0VfQ0ZHODAyMTFfU1RBX0VWRU5UKSAqLwotCWNoYW5uZWwgPSBwbWxtZWV4dC0+Y3VyX2NoYW5uZWw7Ci0JaWYgKGNoYW5uZWwgPD0gUlRXX0NIX01BWF8yR19DSEFOTkVMKQotCQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5uZWwsCi0JCQkJCQkgICAgICBOTDgwMjExX0JBTkRfMkdIWik7Ci0JZWxzZQotCQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5uZWwsCi0JCQkJCQkgICAgICBOTDgwMjExX0JBTkRfNUdIWik7Ci0KLQltZ210LmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9ERUFVVEgpOwotCi0JZXRoZXJfYWRkcl9jb3B5KG1nbXQuZGEsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSk7Ci0JZXRoZXJfYWRkcl9jb3B5KG1nbXQuc2EsIGRhKTsKLQlldGhlcl9hZGRyX2NvcHkobWdtdC5ic3NpZCwgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKTsKLQotCW1nbXQuc2VxX2N0cmwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU05fVE9fU0VRKHBtbG1lZXh0LT5tZ250X3NlcSkpOwotCXBtbG1lZXh0LT5tZ250X3NlcSsrOwotCi0JbWdtdC51LmRpc2Fzc29jLnJlYXNvbl9jb2RlID0gY3B1X3RvX2xlMTYocmVhc29uKTsKLQotCWZyYW1lX2xlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyAyOwotCi0JY2ZnODAyMTFfcnhfbWdtdChwYWRhcHRlci0+cnR3X3dkZXYsIGZyZXEsIDAsICh1OCAqKSZtZ210LCBmcmFtZV9sZW4sCi0JCQkgMCk7Ci0jZW5kaWYgLyogZGVmaW5lZChSVFdfVVNFX0NGRzgwMjExX1NUQV9FVkVOVCkgKi8KLX0KLQotc3RhdGljIGludCBydHdfY2ZnODAyMTFfbW9uaXRvcl9pZl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQotewotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJ0d19jZmc4MDIxMV9tb25pdG9yX2lmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQotewotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJ0d19jZmc4MDIxMV9tb25pdG9yX2lmX3htaXRfZW50cnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IHJ0YXBfbGVuOwotCWludCBxb3NfbGVuID0gMDsKLQlpbnQgZG90MTFfaGRyX2xlbiA9IDI0OwotCWludCBzbmFwX2xlbiA9IDY7Ci0JdW5zaWduZWQgY2hhciAqcGRhdGE7Ci0JdW5zaWduZWQgY2hhciBzcmNfbWFjX2FkZHJbNl07Ci0JdW5zaWduZWQgY2hhciBkc3RfbWFjX2FkZHJbNl07Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmRvdDExX2hkcjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciAqcnRhcF9oZHI7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KG5kZXYpOwotCi0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQotCWlmICh1bmxpa2VseShza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlcikpKQotCQlnb3RvIGZhaWw7Ci0KLQlydGFwX2hkciA9IChzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciAqKXNrYi0+ZGF0YTsKLQlpZiAodW5saWtlbHkocnRhcF9oZHItPml0X3ZlcnNpb24pKQotCQlnb3RvIGZhaWw7Ci0KLQlydGFwX2xlbiA9IGllZWU4MDIxMV9nZXRfcmFkaW90YXBfbGVuKHNrYi0+ZGF0YSk7Ci0JaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgcnRhcF9sZW4pKQotCQlnb3RvIGZhaWw7Ci0KLQlpZiAocnRhcF9sZW4gIT0gMTQpIHsKLQkJREJHXzg3MjNBKCJyYWRpb3RhcCBsZW4gKHNob3VsZCBiZSAxNCk6ICVkXG4iLCBydGFwX2xlbik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBTa2lwIHRoZSByYXRpbyB0YXAgaGVhZGVyICovCi0Jc2tiX3B1bGwoc2tiLCBydGFwX2xlbik7Ci0KLQlkb3QxMV9oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7Ci0JLyogQ2hlY2sgaWYgdGhlIFFvUyBiaXQgaXMgc2V0ICovCi0JaWYgKGllZWU4MDIxMV9pc19kYXRhKGRvdDExX2hkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJLyogQ2hlY2sgaWYgdGhpcyBpYSBhIFdpcmVsZXNzIERpc3RyaWJ1dGlvbiBTeXN0ZW0gKFdEUykgZnJhbWUKLQkJICogd2hpY2ggaGFzIDQgTUFDIGFkZHJlc3NlcwotCQkgKi8KLQkJaWYgKGllZWU4MDIxMV9pc19kYXRhX3Fvcyhkb3QxMV9oZHItPmZyYW1lX2NvbnRyb2wpKQotCQkJcW9zX2xlbiA9IElFRUU4MDIxMV9RT1NfQ1RMX0xFTjsKLQkJaWYgKGllZWU4MDIxMV9oYXNfYTQoZG90MTFfaGRyLT5mcmFtZV9jb250cm9sKSkKLQkJCWRvdDExX2hkcl9sZW4gKz0gNjsKLQotCQltZW1jcHkoZHN0X21hY19hZGRyLCBkb3QxMV9oZHItPmFkZHIxLCBzaXplb2YoZHN0X21hY19hZGRyKSk7Ci0JCW1lbWNweShzcmNfbWFjX2FkZHIsIGRvdDExX2hkci0+YWRkcjIsIHNpemVvZihzcmNfbWFjX2FkZHIpKTsKLQotCQkvKgotCQkgKiBTa2lwIHRoZSA4MDIuMTEgaGVhZGVyLCBRb1MgKGlmIGFueSkgYW5kIFNOQVAsCi0JCSAqIGJ1dCBsZWF2ZSBzcGFjZXMgZm9yIHR3byBNQUMgYWRkcmVzc2VzCi0JCSAqLwotCQlza2JfcHVsbChza2IsIGRvdDExX2hkcl9sZW4gKyBxb3NfbGVuICsgc25hcF9sZW4gLQotCQkJIEVUSF9BTEVOICogMik7Ci0JCXBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKilza2ItPmRhdGE7Ci0JCWV0aGVyX2FkZHJfY29weShwZGF0YSwgZHN0X21hY19hZGRyKTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBkYXRhICsgRVRIX0FMRU4sIHNyY19tYWNfYWRkcik7Ci0KLQkJREJHXzg3MjNBKCJzaG91bGQgYmUgZWFwb2wgcGFja2V0XG4iKTsKLQotCQkvKiBVc2UgdGhlIHJlYWwgbmV0IGRldmljZSB0byB0cmFuc21pdCB0aGUgcGFja2V0ICovCi0JCXJldCA9IHJ0d194bWl0MjNhX2VudHJ5MjNhKHNrYiwgcGFkYXB0ZXItPnBuZXRkZXYpOwotCi0JCXJldHVybiByZXQ7Ci0KLQl9IGVsc2UgaWYgKGllZWU4MDIxMV9pc19hY3Rpb24oZG90MTFfaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0JCS8qIG9ubHkgZm9yIGFjdGlvbiBmcmFtZXMgKi8KLQkJc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWU7Ci0JCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCQl1bnNpZ25lZCBjaGFyICpwZnJhbWU7Ci0JCS8qIHU4IGNhdGVnb3J5LCBhY3Rpb24sIE9VSV9TdWJ0eXBlLCBkaWFsb2dUb2tlbiA9IDA7ICovCi0JCS8qIHVuc2lnbmVkIGNoYXIgICAgICAgICpmcmFtZV9ib2R5OyAqLwotCQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCQl1MzIgbGVuID0gc2tiLT5sZW47Ci0JCXU4IGNhdGVnb3J5LCBhY3Rpb247Ci0KLQkJbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilkb3QxMV9oZHI7Ci0KLQkJREJHXzg3MjNBKCJSVFdfVHg6ZGE9JXBNIHZpYSAlcyglcylcbiIsCi0JCQkgIG1nbXQtPmRhLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7Ci0JCWNhdGVnb3J5ID0gbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnk7Ci0JCWFjdGlvbiA9IG1nbXQtPnUuYWN0aW9uLnUud21lX2FjdGlvbi5hY3Rpb25fY29kZTsKLQkJREJHXzg3MjNBKCJSVFdfVHg6Y2F0ZWdvcnkoJXUpLCBhY3Rpb24oJXUpXG4iLAotCQkJICBjYXRlZ29yeSwgYWN0aW9uKTsKLQotCQkvKiBzdGFydGluZyBhbGxvYyBtZ210IGZyYW1lIHRvIGR1bXAgaXQgKi8KLQkJcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwotCQlpZiAocG1nbnRmcmFtZSA9PSBOVUxMKQotCQkJZ290byBmYWlsOwotCi0JCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQkJcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JCXVwZGF0ZV9tZ250ZnJhbWVfYXR0cmliMjNhKHBhZGFwdGVyLCBwYXR0cmliKTsKLQkJcGF0dHJpYi0+cmV0cnlfY3RybCA9IGZhbHNlOwotCi0JCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKLQotCQlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQotCQltZW1jcHkocGZyYW1lLCBza2ItPmRhdGEsIGxlbik7Ci0JCXBhdHRyaWItPnBrdGxlbiA9IGxlbjsKLQotCQkvKiB1cGRhdGUgc2VxIG51bWJlciAqLwotCQlwbWxtZWV4dC0+bWdudF9zZXEgPSBsZTE2X3RvX2NwdShkb3QxMV9oZHItPnNlcV9jdHJsKSA+PiA0OwotCQlwYXR0cmliLT5zZXFudW0gPSBwbWxtZWV4dC0+bWdudF9zZXE7Ci0JCXBtbG1lZXh0LT5tZ250X3NlcSsrOwotCi0JCXBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IHBhdHRyaWItPnBrdGxlbjsKLQotCQlkdW1wX21nbnRmcmFtZTIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci0JfQotCi1mYWlsOgotCi0JZGV2X2tmcmVlX3NrYihza2IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXJ0d19jZmc4MDIxMV9tb25pdG9yX2lmX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqYWRkcikKLXsKLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBydHdfY2ZnODAyMTFfbW9uaXRvcl9pZl9vcHMgPSB7Ci0JLm5kb19vcGVuID0gcnR3X2NmZzgwMjExX21vbml0b3JfaWZfb3BlbiwKLQkubmRvX3N0b3AgPSBydHdfY2ZnODAyMTFfbW9uaXRvcl9pZl9jbG9zZSwKLQkubmRvX3N0YXJ0X3htaXQgPSBydHdfY2ZnODAyMTFfbW9uaXRvcl9pZl94bWl0X2VudHJ5LAotCS5uZG9fc2V0X21hY19hZGRyZXNzID0gcnR3X2NmZzgwMjExX21vbml0b3JfaWZfc2V0X21hY19hZGRyZXNzLAotfTsKLQotc3RhdGljIGludCBydHdfY2ZnODAyMTFfYWRkX21vbml0b3JfaWYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY2hhciAqbmFtZSwKLQkJCQkgICAgICAgdW5zaWduZWQgY2hhciBuYW1lX2Fzc2lnbl90eXBlLAotCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqKm5kZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm1vbl9uZGV2ID0gTlVMTDsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICptb25fd2RldiA9IE5VTEw7Ci0Jc3RydWN0IHJ0d193ZGV2X3ByaXYgKnB3ZGV2X3ByaXYgPSB3ZGV2X3RvX3ByaXYocGFkYXB0ZXItPnJ0d193ZGV2KTsKLQotCWlmICghbmFtZSkgewotCQlEQkdfODcyM0EoIiVzKCVzKTogd2l0aG91dCBzcGVjaWZpYyBuYW1lXG4iLAotCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAocHdkZXZfcHJpdi0+cG1vbl9uZGV2KSB7Ci0JCURCR184NzIzQSgiJXMoJXMpOiBtb25pdG9yIGludGVyZmFjZSBleGlzdDogJXNcbiIsIF9fZnVuY19fLAotCQkJICBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwgcHdkZXZfcHJpdi0+cG1vbl9uZGV2LT5uYW1lKTsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0KLQltb25fbmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgcnR3X2FkYXB0ZXIpKTsKLQlpZiAoIW1vbl9uZGV2KSB7Ci0JCURCR184NzIzQSgiJXMoJXMpOiBhbGxvY2F0ZSBuZGV2IGZhaWxcbiIsIF9fZnVuY19fLAotCQkJICBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSk7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCW1vbl9uZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMV9SQURJT1RBUDsKLQlzdHJuY3B5KG1vbl9uZGV2LT5uYW1lLCBuYW1lLCBJRk5BTVNJWik7Ci0JbW9uX25kZXYtPm5hbWVbSUZOQU1TSVogLSAxXSA9IDA7Ci0JbW9uX25kZXYtPm5hbWVfYXNzaWduX3R5cGUgPSBuYW1lX2Fzc2lnbl90eXBlOwotCW1vbl9uZGV2LT5kZXN0cnVjdG9yID0gcnR3X25kZXZfZGVzdHJ1Y3RvcjsKLQotCW1vbl9uZGV2LT5uZXRkZXZfb3BzID0gJnJ0d19jZmc4MDIxMV9tb25pdG9yX2lmX29wczsKLQotCS8qICB3ZGV2ICovCi0JbW9uX3dkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd2lyZWxlc3NfZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtb25fd2RldikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQltb25fd2Rldi0+d2lwaHkgPSBwYWRhcHRlci0+cnR3X3dkZXYtPndpcGh5OwotCW1vbl93ZGV2LT5uZXRkZXYgPSBtb25fbmRldjsKLQltb25fd2Rldi0+aWZ0eXBlID0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjsKLQltb25fbmRldi0+aWVlZTgwMjExX3B0ciA9IG1vbl93ZGV2OwotCi0JcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2aWNlKG1vbl9uZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWdvdG8gb3V0OwotCX0KLQotCSpuZGV2ID0gcHdkZXZfcHJpdi0+cG1vbl9uZGV2ID0gbW9uX25kZXY7Ci0JbWVtY3B5KHB3ZGV2X3ByaXYtPmlmbmFtZV9tb24sIG5hbWUsIElGTkFNU0laICsgMSk7Ci0KLW91dDoKLQlpZiAocmV0KSB7Ci0JCWtmcmVlKG1vbl93ZGV2KTsKLQkJbW9uX3dkZXYgPSBOVUxMOwotCX0KLQotCWlmIChyZXQgJiYgbW9uX25kZXYpIHsKLQkJZnJlZV9uZXRkZXYobW9uX25kZXYpOwotCQkqbmRldiA9IG1vbl9uZGV2ID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IHdpcmVsZXNzX2RldiAqCi1jZmc4MDIxMV9ydHdfYWRkX3ZpcnR1YWxfaW50ZihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgICAgdW5zaWduZWQgY2hhciBuYW1lX2Fzc2lnbl90eXBlLAotCQkJICAgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLCB1MzIgKmZsYWdzLAotCQkJICAgICAgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IE5VTEw7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCi0JREJHXzg3MjNBKCIlcyglcyk6IHdpcGh5OiVzLCBuYW1lOiVzLCB0eXBlOiVkXG4iLCBfX2Z1bmNfXywKLQkJICBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwgd2lwaHlfbmFtZSh3aXBoeSksIG5hbWUsIHR5cGUpOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKLQljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9XRFM6Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgotCQlyZXQgPSAtRU5PREVWOwotCQlicmVhazsKLQljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6Ci0JCXJldCA9Ci0JCSAgICBydHdfY2ZnODAyMTFfYWRkX21vbml0b3JfaWYocGFkYXB0ZXIsIChjaGFyICopbmFtZSwKLQkJCQkJCW5hbWVfYXNzaWduX3R5cGUsICZuZGV2KTsKLQkJYnJlYWs7Ci0KLQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQlyZXQgPSAtRU5PREVWOwotCQlicmVhazsKLQotCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0dPOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCURCR184NzIzQSgiVW5zdXBwb3J0ZWQgaW50ZXJmYWNlIHR5cGVcbiIpOwotCQlicmVhazsKLQl9Ci0KLQlEQkdfODcyM0EoIiVzKCVzKTogbmRldjolcCwgcmV0OiVkXG4iLCBfX2Z1bmNfXywKLQkJICBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKLQkJICBuZGV2LCByZXQpOwotCi0JcmV0dXJuIG5kZXYgPyBuZGV2LT5pZWVlODAyMTFfcHRyIDogRVJSX1BUUihyZXQpOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19kZWxfdmlydHVhbF9pbnRmKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJCSBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQotewotCXN0cnVjdCBydHdfd2Rldl9wcml2ICpwd2Rldl9wcml2ID0KLQkgICAgKHN0cnVjdCBydHdfd2Rldl9wcml2ICopd2lwaHlfcHJpdih3aXBoeSk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7Ci0JbmRldiA9IHdkZXYgPyB3ZGV2LT5uZXRkZXYgOiBOVUxMOwotCi0JaWYgKCFuZGV2KQotCQlnb3RvIGV4aXQ7Ci0KLQl1bnJlZ2lzdGVyX25ldGRldmljZShuZGV2KTsKLQotCWlmIChuZGV2ID09IHB3ZGV2X3ByaXYtPnBtb25fbmRldikgewotCQlwd2Rldl9wcml2LT5wbW9uX25kZXYgPSBOVUxMOwotCQlwd2Rldl9wcml2LT5pZm5hbWVfbW9uWzBdID0gJ1wwJzsKLQkJREJHXzg3MjNBKCIlcyglcyk6IHJlbW92ZSBtb25pdG9yIGludGVyZmFjZVxuIiwKLQkJCSAgX19mdW5jX18sIG5kZXYtPm5hbWUpOwotCX0KLQotZXhpdDoKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBydHdfYWRkX2JlYWNvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIGNvbnN0IHU4ICpoZWFkLAotCQkJICBzaXplX3QgaGVhZF9sZW4sIGNvbnN0IHU4ICp0YWlsLCBzaXplX3QgdGFpbF9sZW4pCi17Ci0JaW50IHJldCA9IDA7Ci0JdTggKnBidWY7Ci0JdWludCBsZW4sIGllbGVuLCB3cHNfaWVsZW4gPSAwOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYnNzID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKLQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopaGVhZDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKnRtcG1nbXQ7Ci0JLyogc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsgKi8KLQotCURCR184NzIzQSgiJXMgYmVhY29uX2hlYWRfbGVuID0lenUsIGJlYWNvbl90YWlsX2xlbiA9JXp1XG4iLAotCQkgIF9fZnVuY19fLCBoZWFkX2xlbiwgdGFpbF9sZW4pOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSAhPSB0cnVlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChoZWFkX2xlbiA8IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5iZWFjb24udmFyaWFibGUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBidWYgPSBremFsbG9jKGhlYWRfbGVuICsgdGFpbF9sZW4sIEdGUF9LRVJORUwpOwotCWlmICghcGJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JdG1wbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilwYnVmOwotCi0JYnNzLT5iZWFjb25faW50ZXJ2YWwgPSBnZXRfdW5hbGlnbmVkX2xlMTYoJm1nbXQtPnUuYmVhY29uLmJlYWNvbl9pbnQpOwotCWJzcy0+Y2FwYWJpbGl0eSA9IGdldF91bmFsaWduZWRfbGUxNigmbWdtdC0+dS5iZWFjb24uY2FwYWJfaW5mbyk7Ci0JYnNzLT50c2YgPSBnZXRfdW5hbGlnbmVkX2xlNjQoJm1nbXQtPnUuYmVhY29uLnRpbWVzdGFtcCk7Ci0KLQkvKiAgMjQgPSBiZWFjb24gaGVhZGVyIGxlbi4gKi8KLQltZW1jcHkocGJ1ZiwgKHZvaWQgKiloZWFkLCBoZWFkX2xlbik7Ci0JbWVtY3B5KHBidWYgKyBoZWFkX2xlbiwgKHZvaWQgKil0YWlsLCB0YWlsX2xlbik7Ci0KLQlsZW4gPSBoZWFkX2xlbiArIHRhaWxfbGVuOwotCWllbGVuID0gbGVuIC0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmJlYWNvbi52YXJpYWJsZSk7Ci0JLyogY2hlY2sgd3BzIGllIGlmIGluY2x1ZWQgKi8KLQlpZiAoY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xBTl9PVUlfTUlDUk9TT0ZULAotCQkJCSAgICBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XUFMsCi0JCQkJICAgIHRtcG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlLCBpZWxlbikpCi0JCURCR184NzIzQSgiYWRkIGJjbiwgd3BzX2llbGVuID0lZFxuIiwgd3BzX2llbGVuKTsKLQotCS8qIHBic3NfbmV0d29yay0+SUVzIHdpbGwgbm90IGluY2x1ZGUgcDJwX2llLCB3ZmQgaWUgKi8KLQlydHdfaWVzX3JlbW92ZV9pZTIzYSh0bXBtZ210LT51LmJlYWNvbi52YXJpYWJsZSwgJmllbGVuLCAwLAotCQkJICAgICBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMsIFAyUF9PVUkyM0EsIDQpOwotCXJ0d19pZXNfcmVtb3ZlX2llMjNhKHRtcG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlLCAmaWVsZW4sIDAsCi0JCQkgICAgIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQywgV0ZEX09VSTIzQSwgNCk7Ci0KLQlsZW4gPSBpZWxlbiArIG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5iZWFjb24udmFyaWFibGUpOwotCWlmIChydHdfY2hlY2tfYmVhY29uX2RhdGEyM2EoYWRhcHRlciwgdG1wbWdtdCwgbGVuKSA9PSBfU1VDQ0VTUykgewotCQlyZXQgPSAwOwotCX0gZWxzZSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0Ja2ZyZWUocGJ1Zik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19zdGFydF9hcChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQkgc3RydWN0IGNmZzgwMjExX2FwX3NldHRpbmdzICpzZXR0aW5ncykKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIgPSB3aXBoeV90b19hZGFwdGVyKHdpcGh5KTsKLQotCURCR184NzIzQSgiJXMoJXMpOiBoaWRkZW5fc3NpZDolZCwgYXV0aF90eXBlOiVkXG4iLAotCQkgIF9fZnVuY19fLCBuZGV2LT5uYW1lLCBzZXR0aW5ncy0+aGlkZGVuX3NzaWQsCi0JCSAgc2V0dGluZ3MtPmF1dGhfdHlwZSk7Ci0KLQlyZXQgPSBydHdfYWRkX2JlYWNvbihhZGFwdGVyLCBzZXR0aW5ncy0+YmVhY29uLmhlYWQsCi0JCQkgICAgIHNldHRpbmdzLT5iZWFjb24uaGVhZF9sZW4sIHNldHRpbmdzLT5iZWFjb24udGFpbCwKLQkJCSAgICAgc2V0dGluZ3MtPmJlYWNvbi50YWlsX2xlbik7Ci0KLQlhZGFwdGVyLT5tbG1lZXh0cHJpdi5tbG1leHRfaW5mby5oaWRkZW5fc3NpZF9tb2RlID0KLQkJc2V0dGluZ3MtPmhpZGRlbl9zc2lkOwotCi0JaWYgKHNldHRpbmdzLT5zc2lkICYmIHNldHRpbmdzLT5zc2lkX2xlbikgewotCQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGJzc19uZXR3b3JrID0KLQkJCSZhZGFwdGVyLT5tbG1lcHJpdi5jdXJfbmV0d29yay5uZXR3b3JrOwotCQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGJzc19uZXR3b3JrX2V4dCA9Ci0JCQkmYWRhcHRlci0+bWxtZWV4dHByaXYubWxtZXh0X2luZm8ubmV0d29yazsKLQotCQltZW1jcHkocGJzc19uZXR3b3JrLT5Tc2lkLnNzaWQsICh2b2lkICopc2V0dGluZ3MtPnNzaWQsCi0JCSAgICAgICBzZXR0aW5ncy0+c3NpZF9sZW4pOwotCQlwYnNzX25ldHdvcmstPlNzaWQuc3NpZF9sZW4gPSBzZXR0aW5ncy0+c3NpZF9sZW47Ci0JCW1lbWNweShwYnNzX25ldHdvcmtfZXh0LT5Tc2lkLnNzaWQsICh2b2lkICopc2V0dGluZ3MtPnNzaWQsCi0JCSAgICAgICBzZXR0aW5ncy0+c3NpZF9sZW4pOwotCQlwYnNzX25ldHdvcmtfZXh0LT5Tc2lkLnNzaWRfbGVuID0gc2V0dGluZ3MtPnNzaWRfbGVuOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X2NoYW5nZV9iZWFjb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQkgICAgICBzdHJ1Y3QgY2ZnODAyMTFfYmVhY29uX2RhdGEgKmluZm8pCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gd2lwaHlfdG9fYWRhcHRlcih3aXBoeSk7Ci0KLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUpOwotCi0JcmV0ID0gcnR3X2FkZF9iZWFjb24oYWRhcHRlciwgaW5mby0+aGVhZCwgaW5mby0+aGVhZF9sZW4sIGluZm8tPnRhaWwsCi0JCQkgICAgIGluZm8tPnRhaWxfbGVuKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X3N0b3BfYXAoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCi17Ci0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfYWRkX3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGNvbnN0IHU4ICptYWMsCi0JCQkJICAgIHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgKnBhcmFtcykKLXsKLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X2RlbF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJCSAgICBzdHJ1Y3Qgc3RhdGlvbl9kZWxfcGFyYW1ldGVycyAqcGFyYW1zKQotewotCWNvbnN0IHU4ICptYWMgPSBwYXJhbXMtPm1hYzsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQl1OCB1cGRhdGVkID0gMDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsICpwdG1wOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0KLQlEQkdfODcyM0EoIislcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgKF9GV19MSU5LRUQgfCBXSUZJX0FQX1NUQVRFKSkgIT0gdHJ1ZSkgewotCQlEQkdfODcyM0EoIiVzLCBmd19zdGF0ZSAhPSBGV19MSU5LRUR8V0lGSV9BUF9TVEFURVxuIiwKLQkJCSAgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIW1hYykgewotCQlEQkdfODcyM0EoImZsdXNoIGFsbCBzdGEsIGFuZCBjYW1fZW50cnlcbiIpOwotCi0JCWZsdXNoX2FsbF9jYW1fZW50cnkyM2EocGFkYXB0ZXIpOwkvKiBjbGVhciBDQU0gKi8KLQotCQlyZXQgPSBydHdfc3RhX2ZsdXNoMjNhKHBhZGFwdGVyKTsKLQotCQlyZXR1cm4gcmV0OwotCX0KLQotCURCR184NzIzQSgiZnJlZSBzdGEgbWFjYWRkcj0lcE1cbiIsIG1hYyk7Ci0KLQlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIobWFjKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0JcGhlYWQgPSAmcHN0YXByaXYtPmFzb2NfbGlzdDsKLQkvKiBjaGVjayBhc29jX3F1ZXVlICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBzdGEsIHB0bXAsIHBoZWFkLCBhc29jX2xpc3QpIHsKLQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobWFjLCBwc3RhLT5od2FkZHIpKSB7Ci0JCQlpZiAocHN0YS0+ZG90ODAyMXhhbGcgPT0gMSAmJgotCQkJICAgIHBzdGEtPmJwYWlyd2lzZV9rZXlfaW5zdGFsbGVkID09IGZhbHNlKSB7Ci0JCQkJREJHXzg3MjNBKCIlcywgc3RhJ3MgZG90ODAyMXhhbGcgPSAxIGFuZCAiCi0JCQkJCSAgImtleV9pbnN0YWxsZWQgPSBmYWxzZVxuIiwgX19mdW5jX18pOwotCQkJfSBlbHNlIHsKLQkJCQlEQkdfODcyM0EoImZyZWUgcHN0YSA9JXAsIGFpZCA9JWRcbiIsIHBzdGEsCi0JCQkJCSAgcHN0YS0+YWlkKTsKLQotCQkJCWxpc3RfZGVsX2luaXQoJnBzdGEtPmFzb2NfbGlzdCk7Ci0JCQkJcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQtLTsKLQotCQkJCS8qIHNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOyAqLwotCQkJCXVwZGF0ZWQgPQotCQkJCSAgICBhcF9mcmVlX3N0YTIzYShwYWRhcHRlciwgcHN0YSwgdHJ1ZSwKLQkJCQkJCVdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKLQkJCQkvKiBzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7ICovCi0KLQkJCQlwc3RhID0gTlVMTDsKLQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCi0JYXNzb2NpYXRlZF9jbGllbnRzX3VwZGF0ZTIzYShwYWRhcHRlciwgdXBkYXRlZCk7Ci0KLQlEQkdfODcyM0EoIi0lcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X2NoYW5nZV9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBjb25zdCB1OCAqbWFjLAotCQkJCSAgICAgICBzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzICpwYXJhbXMpCi17Ci0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfZHVtcF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgaW50IGlkeCwgdTggKm1hYywKLQkJCQkgICAgIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKQotewotCURCR184NzIzQSgiJXMoJXMpXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7Ci0KLQkvKiBUT0RPOiBkdW1wIHNjYW5uZWQgcXVldWUgKi8KLQotCXJldHVybiAtRU5PRU5UOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19jaGFuZ2VfYnNzKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJCSAgIHN0cnVjdCBic3NfcGFyYW1ldGVycyAqcGFyYW1zKQotewotCURCR184NzIzQSgiJXMoJXMpXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHXzg3MjNBVV9BUF9NT0RFICovCi0KLXN0YXRpYyBpbnQgX2NmZzgwMjExX3J0d19tZ210X3R4KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHR4X2NoLAotCQkJCSBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKQotewotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXVuc2lnbmVkIGNoYXIgKnBmcmFtZTsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCWlmIChfRkFJTCA9PSBydHdfcHdyX3dha2V1cChwYWRhcHRlcikpIHsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBleGl0OwotCX0KLQotCXJ0d19zZXRfc2Nhbl9kZW55KHBhZGFwdGVyLCAxMDAwKTsKLQotCXJ0d19zY2FuX2Fib3J0MjNhKHBhZGFwdGVyKTsKLQotCWlmICh0eF9jaCAhPSBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpKSB7Ci0JCWlmICghY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBfRldfTElOS0VEKSkKLQkJCXBtbG1lZXh0LT5jdXJfY2hhbm5lbCA9IHR4X2NoOwotCQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHR4X2NoLAotCQkJCSAgIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUsCi0JCQkJICAgSFRfQ0hBTk5FTF9XSURUSF8yMCk7Ci0JfQotCi0JLyogc3RhcnRpbmcgYWxsb2MgbWdtdCBmcmFtZSB0byBkdW1wIGl0ICovCi0JcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwotCWlmICghcG1nbnRmcmFtZSkgewotCQkvKiByZXQgPSAtRU5PTUVNOyAqLwotCQlyZXQgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0JcGF0dHJpYi0+cmV0cnlfY3RybCA9IGZhbHNlOwotCi0JbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwotCi0JcGZyYW1lID0gKHU4ICopIChwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCi0JbWVtY3B5KHBmcmFtZSwgKHZvaWQgKilidWYsIGxlbik7Ci0JcGF0dHJpYi0+cGt0bGVuID0gbGVuOwotCi0JcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7Ci0JLyogdXBkYXRlIHNlcSBudW1iZXIgKi8KLQlwbWxtZWV4dC0+bWdudF9zZXEgPSBsZTE2X3RvX2NwdShwd2xhbmhkci0+c2VxX2N0cmwpID4+IDQ7Ci0JcGF0dHJpYi0+c2VxbnVtID0gcG1sbWVleHQtPm1nbnRfc2VxOwotCXBtbG1lZXh0LT5tZ250X3NlcSsrOwotCi0JcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwotCi0JcmV0ID0gZHVtcF9tZ250ZnJhbWUyM2FfYW5kX3dhaXRfYWNrMjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLQotCWlmIChyZXQgICE9IF9TVUNDRVNTKQotCQlEQkdfODcyM0EoIiVzLCBhY2sgPT0gZmFsc2VcbiIsIF9fZnVuY19fKTsKLQllbHNlCi0JCURCR184NzIzQSgiJXMsIGFjayA9PSB0cnVlXG4iLCBfX2Z1bmNfXyk7Ci0KLWV4aXQ6Ci0KLQlEQkdfODcyM0EoIiVzLCByZXQgPSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X21nbXRfdHgoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKLQkJCQlzdHJ1Y3QgY2ZnODAyMTFfbWdtdF90eF9wYXJhbXMgKnBhcmFtcywKLQkJCQl1NjQgKmNvb2tpZSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0KLQkJKHN0cnVjdCBydHdfYWRhcHRlciAqKXdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCWludCByZXQgPSAwOwotCWludCB0eF9yZXQ7Ci0JdTMyIGR1bXBfbGltaXQgPSBSVFdfTUFYX01HTVRfVFhfQ05UOwotCXUzMiBkdW1wX2NudCA9IDA7Ci0JYm9vbCBhY2sgPSB0cnVlOwotCXU4IGNhdGVnb3J5LCBhY3Rpb247Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9IGppZmZpZXM7Ci0Jc2l6ZV90IGxlbiA9IHBhcmFtcy0+bGVuOwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiA9IHBhcmFtcy0+Y2hhbjsKLQljb25zdCB1OCAqYnVmID0gcGFyYW1zLT5idWY7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopYnVmOwotCXU4IHR4X2NoID0gKHU4KSBpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoY2hhbi0+Y2VudGVyX2ZyZXEpOwotCi0JaWYgKCFpZWVlODAyMTFfaXNfYWN0aW9uKGhkci0+ZnJhbWVfY29udHJvbCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogY29va2llIGdlbmVyYXRpb24gKi8KLQkqY29va2llID0gKHVuc2lnbmVkIGxvbmcpYnVmOwotCi0JREJHXzg3MjNBKCIlcyglcyk6IGxlbiA9JXp1LCBjaCA9JWRcbiIsIF9fZnVuY19fLAotCQkgIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLCBsZW4sIHR4X2NoKTsKLQotCS8qIGluZGljYXRlIGFjayBiZWZvcmUgaXNzdWUgZnJhbWUgdG8gYXZvaWQgcmFjaW5nIHdpdGggcnNwIGZyYW1lICovCi0JY2ZnODAyMTFfbWdtdF90eF9zdGF0dXMocGFkYXB0ZXItPnJ0d193ZGV2LCAqY29va2llLCBidWYsIGxlbiwgYWNrLAotCQkJCUdGUF9LRVJORUwpOwotCi0JREJHXzg3MjNBKCJSVFdfVHg6dHhfY2ggPSVkLCBkYSA9JXBNXG4iLCB0eF9jaCwgaGRyLT5kYSk7Ci0JY2F0ZWdvcnkgPSBoZHItPnUuYWN0aW9uLmNhdGVnb3J5OwotCWFjdGlvbiA9IGhkci0+dS5hY3Rpb24udS53bWVfYWN0aW9uLmFjdGlvbl9jb2RlOwotCURCR184NzIzQSgiUlRXX1R4OmNhdGVnb3J5KCV1KSwgYWN0aW9uKCV1KVxuIiwgY2F0ZWdvcnksIGFjdGlvbik7Ci0KLQlkbyB7Ci0JCWR1bXBfY250Kys7Ci0JCXR4X3JldCA9IF9jZmc4MDIxMV9ydHdfbWdtdF90eChwYWRhcHRlciwgdHhfY2gsIGJ1ZiwgbGVuKTsKLQl9IHdoaWxlIChkdW1wX2NudCA8IGR1bXBfbGltaXQgJiYgdHhfcmV0ICE9IF9TVUNDRVNTKTsKLQotCWlmICh0eF9yZXQgIT0gX1NVQ0NFU1MgfHwgZHVtcF9jbnQgPiAxKSB7Ci0JCURCR184NzIzQSgiJXMoJXMpOiAlcyAoJWQvJWQpIGluICVkIG1zXG4iLAotCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCQkgIHR4X3JldCA9PSBfU1VDQ0VTUyA/ICJPSyIgOiAiRkFJTCIsIGR1bXBfY250LAotCQkJICBkdW1wX2xpbWl0LCBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGNmZzgwMjExX3J0d19tZ210X2ZyYW1lX3JlZ2lzdGVyKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJCSAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKLQkJCQkJICAgICB1MTYgZnJhbWVfdHlwZSwgYm9vbCByZWcpCi17Ci0JaWYgKGZyYW1lX3R5cGUgIT0gKElFRUU4MDIxMV9GVFlQRV9NR01UIHwgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSkpCi0JCXJldHVybjsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIHN0cnVjdCBjZmc4MDIxMV9vcHMgcnR3X2NmZzgwMjExX29wcyA9IHsKLQkuY2hhbmdlX3ZpcnR1YWxfaW50ZiA9IGNmZzgwMjExX3J0d19jaGFuZ2VfaWZhY2UsCi0JLmFkZF9rZXkgPSBjZmc4MDIxMV9ydHdfYWRkX2tleSwKLQkuZ2V0X2tleSA9IGNmZzgwMjExX3J0d19nZXRfa2V5LAotCS5kZWxfa2V5ID0gY2ZnODAyMTFfcnR3X2RlbF9rZXksCi0JLnNldF9kZWZhdWx0X2tleSA9IGNmZzgwMjExX3J0d19zZXRfZGVmYXVsdF9rZXksCi0JLmdldF9zdGF0aW9uID0gY2ZnODAyMTFfcnR3X2dldF9zdGF0aW9uLAotCS5zY2FuID0gY2ZnODAyMTFfcnR3X3NjYW4sCi0JLnNldF93aXBoeV9wYXJhbXMgPSBjZmc4MDIxMV9ydHdfc2V0X3dpcGh5X3BhcmFtcywKLQkuY29ubmVjdCA9IGNmZzgwMjExX3J0d19jb25uZWN0LAotCS5kaXNjb25uZWN0ID0gY2ZnODAyMTFfcnR3X2Rpc2Nvbm5lY3QsCi0JLmpvaW5faWJzcyA9IGNmZzgwMjExX3J0d19qb2luX2lic3MsCi0JLmxlYXZlX2lic3MgPSBjZmc4MDIxMV9ydHdfbGVhdmVfaWJzcywKLQkuc2V0X3R4X3Bvd2VyID0gY2ZnODAyMTFfcnR3X3NldF90eHBvd2VyLAotCS5nZXRfdHhfcG93ZXIgPSBjZmc4MDIxMV9ydHdfZ2V0X3R4cG93ZXIsCi0JLnNldF9wb3dlcl9tZ210ID0gY2ZnODAyMTFfcnR3X3NldF9wb3dlcl9tZ210LAotCS5zZXRfcG1rc2EgPSBjZmc4MDIxMV9ydHdfc2V0X3Bta3NhLAotCS5kZWxfcG1rc2EgPSBjZmc4MDIxMV9ydHdfZGVsX3Bta3NhLAotCS5mbHVzaF9wbWtzYSA9IGNmZzgwMjExX3J0d19mbHVzaF9wbWtzYSwKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCS5hZGRfdmlydHVhbF9pbnRmID0gY2ZnODAyMTFfcnR3X2FkZF92aXJ0dWFsX2ludGYsCi0JLmRlbF92aXJ0dWFsX2ludGYgPSBjZmc4MDIxMV9ydHdfZGVsX3ZpcnR1YWxfaW50ZiwKLQotCS5zdGFydF9hcCA9IGNmZzgwMjExX3J0d19zdGFydF9hcCwKLQkuY2hhbmdlX2JlYWNvbiA9IGNmZzgwMjExX3J0d19jaGFuZ2VfYmVhY29uLAotCS5zdG9wX2FwID0gY2ZnODAyMTFfcnR3X3N0b3BfYXAsCi0KLQkuYWRkX3N0YXRpb24gPSBjZmc4MDIxMV9ydHdfYWRkX3N0YXRpb24sCi0JLmRlbF9zdGF0aW9uID0gY2ZnODAyMTFfcnR3X2RlbF9zdGF0aW9uLAotCS5jaGFuZ2Vfc3RhdGlvbiA9IGNmZzgwMjExX3J0d19jaGFuZ2Vfc3RhdGlvbiwKLQkuZHVtcF9zdGF0aW9uID0gY2ZnODAyMTFfcnR3X2R1bXBfc3RhdGlvbiwKLQkuY2hhbmdlX2JzcyA9IGNmZzgwMjExX3J0d19jaGFuZ2VfYnNzLAotI2VuZGlmIC8qIENPTkZJR184NzIzQVVfQVBfTU9ERSAqLwotCi0JLm1nbXRfdHggPSBjZmc4MDIxMV9ydHdfbWdtdF90eCwKLQkubWdtdF9mcmFtZV9yZWdpc3RlciA9IGNmZzgwMjExX3J0d19tZ210X2ZyYW1lX3JlZ2lzdGVyLAotfTsKLQotc3RhdGljIHZvaWQgcnR3X2NmZzgwMjExX2luaXRfaHRfY2FwYWIoc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXAsCi0JCQkJICAgICAgIGVudW0gbmw4MDIxMV9iYW5kIGJhbmQsIHU4IHJmX3R5cGUpCi17Ci0KLSNkZWZpbmUgTUFYX0JJVF9SQVRFXzQwTUhaX01DUzE1CTMwMAkvKiBNYnBzICovCi0jZGVmaW5lIE1BWF9CSVRfUkFURV80ME1IWl9NQ1M3CQkxNTAJLyogTWJwcyAqLwotCi0JaHRfY2FwLT5odF9zdXBwb3J0ZWQgPSB0cnVlOwotCi0JaHRfY2FwLT5jYXAgPSBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCB8Ci0JICAgIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwIHwgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAgfAotCSAgICBJRUVFODAyMTFfSFRfQ0FQX0RTU1NDQ0s0MCB8IElFRUU4MDIxMV9IVF9DQVBfTUFYX0FNU0RVOwotCi0JLyoKLQkgKk1heGltdW0gbGVuZ3RoIG9mIEFNUERVIHRoYXQgdGhlIFNUQSBjYW4gcmVjZWl2ZS4KLQkgKkxlbmd0aCA9IDIgXiAoMTMgKyBtYXhfYW1wZHVfbGVuZ3RoX2V4cCkgLSAxIChvY3RldHMpCi0JICovCi0JaHRfY2FwLT5hbXBkdV9mYWN0b3IgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SzsKLQotCS8qTWluaW11bSBNUERVIHN0YXJ0IHNwYWNpbmcgLCAqLwotCWh0X2NhcC0+YW1wZHVfZGVuc2l0eSA9IElFRUU4MDIxMV9IVF9NUERVX0RFTlNJVFlfMTY7Ci0KLQlodF9jYXAtPm1jcy50eF9wYXJhbXMgPSBJRUVFODAyMTFfSFRfTUNTX1RYX0RFRklORUQ7Ci0KLQkvKgotCSAqaHctPndpcGh5LT5iYW5kc1tOTDgwMjExX0JBTkRfMkdIWl0KLQkgKmJhc2Ugb24gYW50X251bQotCSAqcnhfbWFzazogUlggbWFzawotCSAqaWYgcnhfYW50ID0gMSByeF9tYXNrWzBdPSAweGZmOz09Pk1DUzAtTUNTNwotCSAqaWYgcnhfYW50ID0gMiByeF9tYXNrWzFdPSAweGZmOz09Pk1DUzgtTUNTMTUKLQkgKmlmIHJ4X2FudCA+PSAzIHJ4X21hc2tbMl09IDB4ZmY7Ci0JICppZiBCV180MCByeF9tYXNrWzRdPSAweDAxOwotCSAqaGlnaGVzdCBzdXBwb3J0ZWQgUlggcmF0ZQotCSAqLwotCWlmIChyZl90eXBlID09IFJGXzFUMVIpIHsKLQkJaHRfY2FwLT5tY3MucnhfbWFza1swXSA9IDB4RkY7Ci0JCWh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gPSAweDAwOwotCQlodF9jYXAtPm1jcy5yeF9tYXNrWzRdID0gMHgwMTsKLQotCQlodF9jYXAtPm1jcy5yeF9oaWdoZXN0ID0gY3B1X3RvX2xlMTYoTUFYX0JJVF9SQVRFXzQwTUhaX01DUzcpOwotCX0gZWxzZSBpZiAoKHJmX3R5cGUgPT0gUkZfMVQyUikgfHwgKHJmX3R5cGUgPT0gUkZfMlQyUikpIHsKLQkJaHRfY2FwLT5tY3MucnhfbWFza1swXSA9IDB4RkY7Ci0JCWh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gPSAweEZGOwotCQlodF9jYXAtPm1jcy5yeF9tYXNrWzRdID0gMHgwMTsKLQotCQlodF9jYXAtPm1jcy5yeF9oaWdoZXN0ID0gY3B1X3RvX2xlMTYoTUFYX0JJVF9SQVRFXzQwTUhaX01DUzE1KTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzLCBlcnJvciByZl90eXBlID0lZFxuIiwgX19mdW5jX18sIHJmX3R5cGUpOwotCX0KLQotfQotCi12b2lkIHJ0d19jZmc4MDIxMV9pbml0X3dpcGh5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggcmZfdHlwZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpiYW5kczsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICpwd2RldiA9IHBhZGFwdGVyLT5ydHdfd2RldjsKLQlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gcHdkZXYtPndpcGh5OwotCi0JcmZfdHlwZSA9IHJ0bDg3MjNhX2dldF9yZl90eXBlKHBhZGFwdGVyKTsKLQotCURCR184NzIzQSgiJXM6cmZfdHlwZSA9JWRcbiIsIF9fZnVuY19fLCByZl90eXBlKTsKLQotCS8qIGlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpcmVsZXNzX21vZGUgJiBXSVJFTEVTU18xMUcpICovCi0JewotCQliYW5kcyA9IHdpcGh5LT5iYW5kc1tOTDgwMjExX0JBTkRfMkdIWl07Ci0JCWlmIChiYW5kcykKLQkJCXJ0d19jZmc4MDIxMV9pbml0X2h0X2NhcGFiKCZiYW5kcy0+aHRfY2FwLAotCQkJCQkJICAgTkw4MDIxMV9CQU5EXzJHSFosCi0JCQkJCQkgICByZl90eXBlKTsKLQl9Ci0KLQkvKiBpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFBKSAqLwotCXsKLQkJYmFuZHMgPSB3aXBoeS0+YmFuZHNbTkw4MDIxMV9CQU5EXzVHSFpdOwotCQlpZiAoYmFuZHMpCi0JCQlydHdfY2ZnODAyMTFfaW5pdF9odF9jYXBhYigmYmFuZHMtPmh0X2NhcCwKLQkJCQkJCSAgIE5MODAyMTFfQkFORF81R0haLAotCQkJCQkJICAgcmZfdHlwZSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBydHdfY2ZnODAyMTFfcHJlaW5pdF93aXBoeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICAgICBzdHJ1Y3Qgd2lwaHkgKndpcGh5KQotewotCXdpcGh5LT5zaWduYWxfdHlwZSA9IENGRzgwMjExX1NJR05BTF9UWVBFX01CTTsKLQotCXdpcGh5LT5tYXhfc2Nhbl9zc2lkcyA9IFJUV19TU0lEX1NDQU5fQU1PVU5UOwotCXdpcGh5LT5tYXhfc2Nhbl9pZV9sZW4gPSBJRUVFODAyMTFfTUFYX0RBVEFfTEVOOwotCXdpcGh5LT5tYXhfbnVtX3Bta2lkcyA9IFJUV19NQVhfTlVNX1BNS0lEUzsKLQotCXdpcGh5LT5tYXhfcmVtYWluX29uX2NoYW5uZWxfZHVyYXRpb24gPQotCSAgICBSVFdfTUFYX1JFTUFJTl9PTl9DSEFOTkVMX0RVUkFUSU9OOwotCi0Jd2lwaHktPmludGVyZmFjZV9tb2RlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB8Ci0JICAgIEJJVChOTDgwMjExX0lGVFlQRV9BREhPQykgfAotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCSAgICBCSVQoTkw4MDIxMV9JRlRZUEVfQVApIHwgQklUKE5MODAyMTFfSUZUWVBFX01PTklUT1IpIHwKLSNlbmRpZgotCSAgICAwOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0Jd2lwaHktPm1nbXRfc3R5cGVzID0gcnR3X2NmZzgwMjExX2RlZmF1bHRfbWdtdF9zdHlwZXM7Ci0jZW5kaWYgLyogQ09ORklHXzg3MjNBVV9BUF9NT0RFICovCi0KLQl3aXBoeS0+c29mdHdhcmVfaWZ0eXBlcyB8PSBCSVQoTkw4MDIxMV9JRlRZUEVfTU9OSVRPUik7Ci0KLQkvKgotCSAgIHdpcGh5LT5pZmFjZV9jb21iaW5hdGlvbnMgPSAmcnR3X2NvbWJpbmF0aW9uczsKLQkgICB3aXBoeS0+bl9pZmFjZV9jb21iaW5hdGlvbnMgPSAxOwotCSAqLwotCi0Jd2lwaHktPmNpcGhlcl9zdWl0ZXMgPSBydHdfY2lwaGVyX3N1aXRlczsKLQl3aXBoeS0+bl9jaXBoZXJfc3VpdGVzID0gQVJSQVlfU0laRShydHdfY2lwaGVyX3N1aXRlcyk7Ci0KLQkvKiBpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFHKSAqLwotCXdpcGh5LT5iYW5kc1tOTDgwMjExX0JBTkRfMkdIWl0gPQotCSAgICBydHdfc3B0X2JhbmRfYWxsb2MoTkw4MDIxMV9CQU5EXzJHSFopOwotCS8qIGlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpcmVsZXNzX21vZGUgJiBXSVJFTEVTU18xMUEpICovCi0Jd2lwaHktPmJhbmRzW05MODAyMTFfQkFORF81R0haXSA9Ci0JICAgIHJ0d19zcHRfYmFuZF9hbGxvYyhOTDgwMjExX0JBTkRfNUdIWik7Ci0KLQl3aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19IQVNfUkVNQUlOX09OX0NIQU5ORUw7Ci0Jd2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfT0ZGQ0hBTl9UWCB8IFdJUEhZX0ZMQUdfSEFWRV9BUF9TTUU7Ci0KLQlpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5wb3dlcl9tZ250ICE9IFBTX01PREVfQUNUSVZFKQotCQl3aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOwotCWVsc2UKLQkJd2lwaHktPmZsYWdzICY9IH5XSVBIWV9GTEFHX1BTX09OX0JZX0RFRkFVTFQ7Ci19Ci0KLWludCBydHdfd2Rldl9hbGxvYyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHdpcGh5ICp3aXBoeTsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OwotCXN0cnVjdCBydHdfd2Rldl9wcml2ICpwd2Rldl9wcml2OwotCXN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2ID0gcGFkYXB0ZXItPnBuZXRkZXY7Ci0KLQlEQkdfODcyM0EoIiVzKHBhZGFwdGVyID0lcClcbiIsIF9fZnVuY19fLCBwYWRhcHRlcik7Ci0KLQkvKiB3aXBoeSAqLwotCXdpcGh5ID0gd2lwaHlfbmV3KCZydHdfY2ZnODAyMTFfb3BzLCBzaXplb2Yoc3RydWN0IHJ0d193ZGV2X3ByaXYpKTsKLQlpZiAoIXdpcGh5KSB7Ci0JCURCR184NzIzQSgiQ291bGRuJ3QgYWxsb2NhdGUgd2lwaHkgZGV2aWNlXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBleGl0OwotCX0KLQotCS8qICB3ZGV2ICovCi0Jd2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3aXJlbGVzc19kZXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXdkZXYpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmcmVlX3dpcGh5OwotCX0KLQotCXNldF93aXBoeV9kZXYod2lwaHksIGRldik7Ci0JcnR3X2NmZzgwMjExX3ByZWluaXRfd2lwaHkocGFkYXB0ZXIsIHdpcGh5KTsKLQotCXJldCA9IHdpcGh5X3JlZ2lzdGVyKHdpcGh5KTsKLQlpZiAocmV0IDwgMCkgewotCQlEQkdfODcyM0EoIkNvdWxkbid0IHJlZ2lzdGVyIHdpcGh5IGRldmljZVxuIik7Ci0JCWdvdG8gZnJlZV93ZGV2OwotCX0KLQotCXdkZXYtPndpcGh5ID0gd2lwaHk7Ci0Jd2Rldi0+bmV0ZGV2ID0gcG5ldGRldjsKLQkvKiB3ZGV2LT5pZnR5cGUgPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOyAqLwotCS8qICBmb3IgcnR3X3NldG9wbW9kZV9jbWQyM2EoKSBpbiBjZmc4MDIxMV9ydHdfY2hhbmdlX2lmYWNlKCkgKi8KLQl3ZGV2LT5pZnR5cGUgPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOwotCXBhZGFwdGVyLT5ydHdfd2RldiA9IHdkZXY7Ci0JcG5ldGRldi0+aWVlZTgwMjExX3B0ciA9IHdkZXY7Ci0KLQkvKiBpbml0IHB3ZGV2X3ByaXYgKi8KLQlwd2Rldl9wcml2ID0gd2Rldl90b19wcml2KHdkZXYpOwotCXB3ZGV2X3ByaXYtPnJ0d193ZGV2ID0gd2RldjsKLQlwd2Rldl9wcml2LT5wbW9uX25kZXYgPSBOVUxMOwotCXB3ZGV2X3ByaXYtPmlmbmFtZV9tb25bMF0gPSAnXDAnOwotCXB3ZGV2X3ByaXYtPnBhZGFwdGVyID0gcGFkYXB0ZXI7Ci0JcHdkZXZfcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKLQlzcGluX2xvY2tfaW5pdCgmcHdkZXZfcHJpdi0+c2Nhbl9yZXFfbG9jayk7Ci0KLQlwd2Rldl9wcml2LT5wMnBfZW5hYmxlZCA9IGZhbHNlOwotCi0JaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYucG93ZXJfbWdudCAhPSBQU19NT0RFX0FDVElWRSkKLQkJcHdkZXZfcHJpdi0+cG93ZXJfbWdtdCA9IHRydWU7Ci0JZWxzZQotCQlwd2Rldl9wcml2LT5wb3dlcl9tZ210ID0gZmFsc2U7Ci0KLQlyZXR1cm4gcmV0OwotZnJlZV93ZGV2OgotCWtmcmVlKHdkZXYpOwotZnJlZV93aXBoeToKLQl3aXBoeV9mcmVlKHdpcGh5KTsKLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBydHdfd2Rldl9mcmVlKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpCi17Ci0JREJHXzg3MjNBKCIlcyh3ZGV2ID0lcClcbiIsIF9fZnVuY19fLCB3ZGV2KTsKLQotCWlmICghd2RldikKLQkJcmV0dXJuOwotCi0Ja2ZyZWUod2Rldi0+d2lwaHktPmJhbmRzW05MODAyMTFfQkFORF8yR0haXSk7Ci0Ja2ZyZWUod2Rldi0+d2lwaHktPmJhbmRzW05MODAyMTFfQkFORF81R0haXSk7Ci0KLQl3aXBoeV9mcmVlKHdkZXYtPndpcGh5KTsKLQotCWtmcmVlKHdkZXYpOwotfQotCi12b2lkIHJ0d193ZGV2X3VucmVnaXN0ZXIoc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldikKLXsKLQlzdHJ1Y3QgcnR3X3dkZXZfcHJpdiAqcHdkZXZfcHJpdjsKLQotCURCR184NzIzQSgiJXMod2RldiA9JXApXG4iLCBfX2Z1bmNfXywgd2Rldik7Ci0KLQlpZiAoIXdkZXYpCi0JCXJldHVybjsKLQotCXB3ZGV2X3ByaXYgPSB3ZGV2X3RvX3ByaXYod2Rldik7Ci0KLQlydHdfY2ZnODAyMTFfaW5kaWNhdGVfc2Nhbl9kb25lKHB3ZGV2X3ByaXYsIHRydWUpOwotCi0JaWYgKHB3ZGV2X3ByaXYtPnBtb25fbmRldikgewotCQlEQkdfODcyM0EoIiVzLCB1bnJlZ2lzdGVyIG1vbml0b3IgaW50ZXJmYWNlXG4iLCBfX2Z1bmNfXyk7Ci0JCXVucmVnaXN0ZXJfbmV0ZGV2KHB3ZGV2X3ByaXYtPnBtb25fbmRldik7Ci0JfQotCi0Jd2lwaHlfdW5yZWdpc3Rlcih3ZGV2LT53aXBoeSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9tbG1lX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9tbG1lX2xpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMjQzNjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvbWxtZV9saW51eC5jCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgX01MTUVfT1NERVBfQ18KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDxtbG1lX29zZGVwLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcnRfcG1raWRfbGlzdCBiYWNrdXBQTUtJRExpc3RbTlVNX1BNS0lEX0NBQ0hFXTsKLQotdm9pZCBydHdfcmVzZXRfc2VjdXJpdHlwcml2MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQl1OAliYWNrdXBQTUtJREluZGV4ID0gMDsKLQl1OAliYWNrdXBUS0lQQ291bnRlcm1lYXN1cmUgPSAweDAwOwotCXVuc2lnbmVkIGxvbmcgYmFja3VwVEtJUGNvdW50ZXJtZWFzdXJlX3RpbWUgPSAwOwotCi0JaWYgKGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMUF1dGhBbGdydGhtID09Ci0JICAgIGRvdDExQXV0aEFsZ3J0aG1fODAyMVgpIHsgLyogODAyLjF4ICovCi0JCS8qICBXZSBoYXZlIHRvIGJhY2t1cCB0aGUgUE1LIGluZm9ybWF0aW9uIGZvciBXaUZpIFBNSwotCQkgKiAgQ2FjaGluZyB0ZXN0IGl0ZW0uCi0JCSAqICBCYWNrdXAgdGhlIGJ0a2lwX2NvdW50ZXJtZWFzdXJlIGluZm9ybWF0aW9uLgotCQkgKiAgV2hlbiB0aGUgY291bnRlcm1lYXN1cmUgaXMgdHJpZ2dlciwgdGhlIGRyaXZlciBoYXZlIHRvCi0JCSAqICBkaXNjb25uZWN0IHdpdGggQVAgZm9yIDYwIHNlY29uZHMuCi0JCSAqLwotCQltZW1jcHkoJmJhY2t1cFBNS0lETGlzdFswXSwgJmFkYXB0ZXItPnNlY3VyaXR5cHJpdi5QTUtJRExpc3RbMF0sCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3Bta2lkX2xpc3QpICogTlVNX1BNS0lEX0NBQ0hFKTsKLQkJYmFja3VwUE1LSURJbmRleCA9IGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5QTUtJREluZGV4OwotCQliYWNrdXBUS0lQQ291bnRlcm1lYXN1cmUgPSBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnRraXBfY291bnRlcm1lYXN1cmU7Ci0JCWJhY2t1cFRLSVBjb3VudGVybWVhc3VyZV90aW1lID0gYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ0a2lwX2NvdW50ZXJtZWFzdXJlX3RpbWU7Ci0KLQkJbWVtc2V0KCh1bnNpZ25lZCBjaGFyICopJmFkYXB0ZXItPnNlY3VyaXR5cHJpdiwgMCwKLQkJICAgICAgIHNpemVvZiAoc3RydWN0IHNlY3VyaXR5X3ByaXYpKTsKLQkJLyogUmVzdG9yZSB0aGUgUE1LIGluZm9ybWF0aW9uIHRvIHNlY3VyaXR5cHJpdiBzdHJ1Y3R1cmUKLQkJICogZm9yIHRoZSBmb2xsb3dpbmcgY29ubmVjdGlvbi4KLQkJICovCi0JCW1lbWNweSgmYWRhcHRlci0+c2VjdXJpdHlwcml2LlBNS0lETGlzdFswXSwgJmJhY2t1cFBNS0lETGlzdFswXSwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcG1raWRfbGlzdCkgKiBOVU1fUE1LSURfQ0FDSEUpOwotCQlhZGFwdGVyLT5zZWN1cml0eXByaXYuUE1LSURJbmRleCA9IGJhY2t1cFBNS0lESW5kZXg7Ci0JCWFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idGtpcF9jb3VudGVybWVhc3VyZSA9IGJhY2t1cFRLSVBDb3VudGVybWVhc3VyZTsKLQkJYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ0a2lwX2NvdW50ZXJtZWFzdXJlX3RpbWUgPSBiYWNrdXBUS0lQY291bnRlcm1lYXN1cmVfdGltZTsKLQotCQlhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2F1dGh0eXBlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQkJYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCX0gZWxzZSB7ICAvKiByZXNldCB2YWx1ZXMgaW4gc2VjdXJpdHlwcml2ICovCi0JCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjX3ByaXYgPSAmYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCi0JCS8qIG9wZW4gc3lzdGVtICovCi0JCXBzZWNfcHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fT3BlbjsKLQkJcHNlY19wcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0gMDsKLQkJcHNlY19wcml2LT5kb3QxMVByaXZhY3lLZXlJbmRleCA9IDA7Ci0KLQkJcHNlY19wcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9IDA7Ci0JCXBzZWNfcHJpdi0+ZG90MTE4MDIxWEdycEtleWlkID0gMTsKLQotCQlwc2VjX3ByaXYtPm5kaXNhdXRodHlwZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0JCXBzZWNfcHJpdi0+bmRpc2VuY3J5cHRzdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JfQotfQotCi12b2lkIHJ0d19vc19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQkvKiBEbyBpdCBmaXJzdCBmb3IgdHggYnJvYWRjYXN0IHBrdCBhZnRlciBkaXNjb25uZWN0aW9uIGlzc3VlISAqLwotCW5ldGlmX2NhcnJpZXJfb2ZmKGFkYXB0ZXItPnBuZXRkZXYpOwotCi0JcnR3X2NmZzgwMjExX2luZGljYXRlX2Rpc2Nvbm5lY3QoYWRhcHRlcik7Ci0KLQlydHdfcmVzZXRfc2VjdXJpdHlwcml2MjNhKGFkYXB0ZXIpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvb3NfaW50ZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL29zX2ludGZzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ODQ4YzIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvb3NfaW50ZnMuYworKysgL2Rldi9udWxsCkBAIC0xLDg1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX09TX0lOVEZTX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8eG1pdF9vc2RlcC5oPgotI2luY2x1ZGUgPHJlY3Zfb3NkZXAuaD4KLSNpbmNsdWRlIDxoYWxfaW50Zi5oPgotI2luY2x1ZGUgPHJ0d192ZXJzaW9uLmg+Ci0KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWFsdGVrIFdpcmVsZXNzIExhbiBEcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIlJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiIpOwotTU9EVUxFX0FVVEhPUigiTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PiIpOwotTU9EVUxFX0FVVEhPUigiSmVzIFNvcmVuc2VuIDxKZXMuU29yZW5zZW5AcmVkaGF0LmNvbT4iKTsKLU1PRFVMRV9WRVJTSU9OKERSSVZFUlZFUlNJT04pOwotTU9EVUxFX0ZJUk1XQVJFKCJydGx3aWZpL3J0bDg3MjNhdWZ3X0EuYmluIik7Ci1NT0RVTEVfRklSTVdBUkUoInJ0bHdpZmkvcnRsODcyM2F1ZndfQi5iaW4iKTsKLU1PRFVMRV9GSVJNV0FSRSgicnRsd2lmaS9ydGw4NzIzYXVmd19CX05vQlQuYmluIik7Ci0KLS8qIG1vZHVsZSBwYXJhbSBkZWZhdWx0cyAqLwotc3RhdGljIGludCBydHdfY2hpcF92ZXJzaW9uOwotc3RhdGljIGludCBydHdfcmZpbnRmcyA9IEhXUEk7Ci1zdGF0aWMgaW50IHJ0d19kZWJ1ZyA9IDE7Ci0KLXN0YXRpYyBpbnQgcnR3X2NoYW5uZWwgPSAxOy8qIGFkLWhvYyBzdXBwb3J0IHJlcXVpcmVtZW50ICovCi1zdGF0aWMgaW50IHJ0d193aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfMTFCR18yNE47Ci1zdGF0aWMgaW50IHJ0d192cnRsX2NhcnJpZXJfc2Vuc2UgPSBBVVRPX1ZDUzsKLXN0YXRpYyBpbnQgcnR3X3Zjc190eXBlID0gUlRTX0NUUzsvKiAgKi8KLXN0YXRpYyBpbnQgcnR3X3J0c190aHJlc2ggPSAyMzQ3Oy8qICAqLwotc3RhdGljIGludCBydHdfZnJhZ190aHJlc2ggPSAyMzQ2Oy8qICAqLwotc3RhdGljIGludCBydHdfcHJlYW1ibGUgPSBQUkVBTUJMRV9MT05HOy8qIGxvbmcsIHNob3J0LCBhdXRvICovCi1zdGF0aWMgaW50IHJ0d19zY2FuX21vZGUgPSAxOy8qIGFjdGl2ZSwgcGFzc2l2ZSAqLwotc3RhdGljIGludCBydHdfYWRob2NfdHhfcHdyID0gMTsKLXN0YXRpYyBpbnQgcnR3X3NvZnRfYXA7Ci1zdGF0aWMgaW50IHJ0d19wb3dlcl9tZ250ID0gMTsKLXN0YXRpYyBpbnQgcnR3X2lwc19tb2RlID0gSVBTX05PUk1BTDsKLQotc3RhdGljIGludCBydHdfc21hcnRfcHMgPSAyOwotCi1tb2R1bGVfcGFyYW0ocnR3X2lwc19tb2RlLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhydHdfaXBzX21vZGUsICJUaGUgZGVmYXVsdCBJUFMgbW9kZSIpOwotCi1zdGF0aWMgaW50IHJ0d19sb25nX3JldHJ5X2xtdCA9IDc7Ci1zdGF0aWMgaW50IHJ0d19zaG9ydF9yZXRyeV9sbXQgPSA3Owotc3RhdGljIGludCBydHdfYnVzeV90aHJlc2ggPSA0MDsKLXN0YXRpYyBpbnQgcnR3X2Fja19wb2xpY3kgPSBOT1JNQUxfQUNLOwotCi1zdGF0aWMgaW50IHJ0d19hY21fbWV0aG9kOy8qICAwOkJ5IFNXIDE6QnkgSFcuICovCi0KLXN0YXRpYyBpbnQgcnR3X3dtbV9lbmFibGUgPSAxOy8qICBkZWZhdWx0IGlzIHNldCB0byBlbmFibGUgdGhlIHdtbS4gKi8KLXN0YXRpYyBpbnQgcnR3X3VhcHNkX2VuYWJsZTsKLQotc3RhdGljIGludCBydHdfaHRfZW5hYmxlID0gMTsKLS8qIDAgOmRpYWJsZSwgYml0KDApOiBlbmFibGUgMi40ZywgYml0KDEpOiBlbmFibGUgNWcgKi8KLXN0YXRpYyBpbnQgcnR3X2NidzQwX2VuYWJsZSA9IDM7Ci1zdGF0aWMgaW50IHJ0d19hbXBkdV9lbmFibGUgPSAxOy8qIGZvciBlbmFibGUgdHhfYW1wZHUgKi8KLS8qICAwOiBkaXNhYmxlLCBiaXQoMCk6ZW5hYmxlIDIuNGcsIGJpdCgxKTplbmFibGUgNWcsIGRlZmF1bHQgaXMgc2V0IHRvIGVuYWJsZQotICogMi40R0haIGZvciBJT1QgaXNzdWUgd2l0aCBidWZmbGFvJ3MgQVAgYXQgNUdIWgotICovCi1zdGF0aWMgaW50IHJ0d19yeF9zdGJjID0gMTsKLXN0YXRpYyBpbnQgcnR3X2FtcGR1X2Ftc2R1Oy8qICAwOiBkaXNhYmxlZCwgMTplbmFibGVkLCAyOmF1dG8gKi8KLQotLyogVXNlIDIgcGF0aCBUeCB0byB0cmFuc21pdCBNQ1MwfjcgYW5kIGxlZ2FjeSBtb2RlICovCi1zdGF0aWMgaW50IHJ0d19sb3dyYXRlX3R3b194bWl0ID0gMTsKLQotLyogaW50IHJmX2NvbmZpZyA9IFJGXzFUMlI7ICAxVDJSICovCi1zdGF0aWMgaW50IHJ0d19yZl9jb25maWcgPSBSRl84MTlYX01BWF9UWVBFOyAgLyogYXV0byAqLwotc3RhdGljIGludCBydHdfbG93X3Bvd2VyOwotc3RhdGljIGludCBydHdfd2lmaV9zcGVjOwotc3RhdGljIGludCBydHdfY2hhbm5lbF9wbGFuID0gUlRfQ0hBTk5FTF9ET01BSU5fTUFYOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9CVF9DT0VYSVNUCi1zdGF0aWMgaW50IHJ0d19idGNvZXhfZW5hYmxlID0gMTsKLXN0YXRpYyBpbnQgcnR3X2J0X2lzbyA9IDI7LyogIDA6TG93LCAxOkhpZ2gsIDI6RnJvbSBFZnVzZSAqLwotLyogIDA6SWRsZSwgMTpOb25lLVNDTywgMjpTQ08sIDM6RnJvbSBDb3VudGVyLCA0LkJ1c3ksIDUuT3RoZXJCdXN5ICovCi1zdGF0aWMgaW50IHJ0d19idF9zY28gPSAzOwotLyogIDA6RGlzYWJsZSBCVCBjb250cm9sIEEtTVBEVSwgMTpFbmFibGUgQlQgY29udHJvbCBBLU1QRFUuICovCi1zdGF0aWMgaW50IHJ0d19idF9hbXBkdSA9IDE7Ci0jZW5kaWYKLQotLyogIDA6UmVqZWN0IEFQJ3MgQWRkIEJBIHJlcSwgMTpBY2NlcHQgQVAncyBBZGQgQkEgcmVxLiAqLwotc3RhdGljIGludCBydHdfQWNjZXB0QWRkYmFSZXEgPSB0cnVlOwotCi1zdGF0aWMgaW50IHJ0d19hbnRkaXZfY2ZnID0gMjsgLyogIDA6T0ZGICwgMTpPTiwgMjpkZWNpZGUgYnkgRWZ1c2UgY29uZmlnICovCi1zdGF0aWMgaW50IHJ0d19hbnRkaXZfdHlwZTsgLyogMDpkZWNpZGUgYnkgZWZ1c2UgKi8KLQotc3RhdGljIGludCBydHdfZW51c2JzczsvKiAwOmRpc2FibGUsIDE6ZW5hYmxlICovCi0KLXN0YXRpYyBpbnQgcnR3X2h3cGRuX21vZGUgPSAyOy8qIDA6ZGlzYWJsZSwgMTplbmFibGUsIDI6IGJ5IEVGVVNFIGNvbmZpZyAqLwotCi1zdGF0aWMgaW50IHJ0d19od3B3cnBfZGV0ZWN0OyAvKiBIVyBwb3dlciAgcGluZyBkZXRlY3QgMDpkaXNhYmxlICwgMTplbmFibGUgKi8KLQotc3RhdGljIGludCBydHdfaHdfd3BzX3BiYyA9IDE7Ci0KLXN0YXRpYyBpbnQgcnR3XzgwMjExZDsKLQotc3RhdGljIGludCBydHdfcmVndWxhdG9yeV9pZCA9IDB4ZmY7LyogIFJlZ3VsYXRvcnkgdGFiIGlkLCAweGZmID0gZm9sbG93IGVmdXNlJ3Mgc2V0dGluZyAqLwotCi1tb2R1bGVfcGFyYW0ocnR3X3JlZ3VsYXRvcnlfaWQsIGludCwgMDY0NCk7Ci0KLXN0YXRpYyBjaGFyICppZm5hbWUgPSAid2xhbiVkIjsKLW1vZHVsZV9wYXJhbShpZm5hbWUsIGNoYXJwLCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaWZuYW1lLCAiVGhlIGRlZmF1bHQgbmFtZSB0byBhbGxvY2F0ZSBmb3IgZmlyc3QgaW50ZXJmYWNlIik7Ci0KLXN0YXRpYyBjaGFyICppZjJuYW1lID0gIndsYW4lZCI7Ci1tb2R1bGVfcGFyYW0oaWYybmFtZSwgY2hhcnAsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhpZjJuYW1lLCAiVGhlIGRlZmF1bHQgbmFtZSB0byBhbGxvY2F0ZSBmb3Igc2Vjb25kIGludGVyZmFjZSIpOwotCi1tb2R1bGVfcGFyYW0ocnR3X2NoYW5uZWxfcGxhbiwgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfY2hpcF92ZXJzaW9uLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19yZmludGZzLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19jaGFubmVsLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d193bW1fZW5hYmxlLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d192cnRsX2NhcnJpZXJfc2Vuc2UsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X3Zjc190eXBlLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19idXN5X3RocmVzaCwgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfaHRfZW5hYmxlLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19jYnc0MF9lbmFibGUsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X2FtcGR1X2VuYWJsZSwgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfcnhfc3RiYywgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfYW1wZHVfYW1zZHUsIGludCwgMDY0NCk7Ci0KLW1vZHVsZV9wYXJhbShydHdfbG93cmF0ZV90d29feG1pdCwgaW50LCAwNjQ0KTsKLQotbW9kdWxlX3BhcmFtKHJ0d19yZl9jb25maWcsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X3Bvd2VyX21nbnQsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X3NtYXJ0X3BzLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19sb3dfcG93ZXIsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X3dpZmlfc3BlYywgaW50LCAwNjQ0KTsKLQotbW9kdWxlX3BhcmFtKHJ0d19hbnRkaXZfY2ZnLCBpbnQsIDA2NDQpOwotCi1tb2R1bGVfcGFyYW0ocnR3X2VudXNic3MsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X2h3cGRuX21vZGUsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X2h3cHdycF9kZXRlY3QsIGludCwgMDY0NCk7Ci0KLW1vZHVsZV9wYXJhbShydHdfaHdfd3BzX3BiYywgaW50LCAwNjQ0KTsKLQotc3RhdGljIHVpbnQgcnR3X21heF9yb2FtaW5nX3RpbWVzID0gMjsKLW1vZHVsZV9wYXJhbShydHdfbWF4X3JvYW1pbmdfdGltZXMsIHVpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhydHdfbWF4X3JvYW1pbmdfdGltZXMsICJUaGUgbWF4IHJvYW1pbmcgdGltZXMgdG8gdHJ5Iik7Ci0KLW1vZHVsZV9wYXJhbShydHdfODAyMTFkLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhydHdfODAyMTFkLCAiRW5hYmxlIDgwMi4xMWQgbWVjaGFuaXNtIik7Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLW1vZHVsZV9wYXJhbShydHdfYnRjb2V4X2VuYWJsZSwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MocnR3X2J0Y29leF9lbmFibGUsICJFbmFibGUgQlQgY28tZXhpc3RlbmNlIG1lY2hhbmlzbSIpOwotI2VuZGlmCi0KLXN0YXRpYyB1aW50IHJ0d19ub3RjaF9maWx0ZXI7Ci1tb2R1bGVfcGFyYW0ocnR3X25vdGNoX2ZpbHRlciwgdWludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHJ0d19ub3RjaF9maWx0ZXIsICIwOkRpc2FibGUsIDE6RW5hYmxlLCAyOkVuYWJsZSBvbmx5IGZvciBQMlAiKTsKLW1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgcnR3X2RlYnVnLCBpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlNldCBkZWJ1ZyBsZXZlbCAoMS05KSAoZGVmYXVsdCAxKSIpOwotCi1zdGF0aWMgaW50IG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldik7Ci0KLXN0YXRpYyB2b2lkIGxvYWRwYXJhbShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCAgc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYpCi17Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgICpyZWdpc3RyeV9wYXIgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQotCUdsb2JhbERlYnVnTGV2ZWwyM0EgPSBydHdfZGVidWc7Ci0JcmVnaXN0cnlfcGFyLT5jaGlwX3ZlcnNpb24gPSAodTgpcnR3X2NoaXBfdmVyc2lvbjsKLQlyZWdpc3RyeV9wYXItPnJmaW50ZnMgPSAodTgpcnR3X3JmaW50ZnM7Ci0JbWVtY3B5KHJlZ2lzdHJ5X3Bhci0+c3NpZC5zc2lkLCAiQU5ZIiwgMyk7Ci0JcmVnaXN0cnlfcGFyLT5zc2lkLnNzaWRfbGVuID0gMzsKLQlyZWdpc3RyeV9wYXItPmNoYW5uZWwgPSAodTgpcnR3X2NoYW5uZWw7Ci0JcmVnaXN0cnlfcGFyLT53aXJlbGVzc19tb2RlID0gKHU4KXJ0d193aXJlbGVzc19tb2RlOwotCXJlZ2lzdHJ5X3Bhci0+dnJ0bF9jYXJyaWVyX3NlbnNlID0gKHU4KXJ0d192cnRsX2NhcnJpZXJfc2Vuc2U7Ci0JcmVnaXN0cnlfcGFyLT52Y3NfdHlwZSA9ICh1OClydHdfdmNzX3R5cGU7Ci0JcmVnaXN0cnlfcGFyLT5ydHNfdGhyZXNoID0gKHUxNilydHdfcnRzX3RocmVzaDsKLQlyZWdpc3RyeV9wYXItPmZyYWdfdGhyZXNoID0gKHUxNilydHdfZnJhZ190aHJlc2g7Ci0JcmVnaXN0cnlfcGFyLT5wcmVhbWJsZSA9ICh1OClydHdfcHJlYW1ibGU7Ci0JcmVnaXN0cnlfcGFyLT5zY2FuX21vZGUgPSAodTgpcnR3X3NjYW5fbW9kZTsKLQlyZWdpc3RyeV9wYXItPmFkaG9jX3R4X3B3ciA9ICh1OClydHdfYWRob2NfdHhfcHdyOwotCXJlZ2lzdHJ5X3Bhci0+c29mdF9hcCA9ICAodTgpcnR3X3NvZnRfYXA7Ci0JcmVnaXN0cnlfcGFyLT5zbWFydF9wcyA9ICAodTgpcnR3X3NtYXJ0X3BzOwotCXJlZ2lzdHJ5X3Bhci0+cG93ZXJfbWdudCA9ICh1OClydHdfcG93ZXJfbWdudDsKLQlyZWdpc3RyeV9wYXItPmlwc19tb2RlID0gKHU4KXJ0d19pcHNfbW9kZTsKLQlyZWdpc3RyeV9wYXItPmxvbmdfcmV0cnlfbG10ID0gKHU4KXJ0d19sb25nX3JldHJ5X2xtdDsKLQlyZWdpc3RyeV9wYXItPnNob3J0X3JldHJ5X2xtdCA9ICh1OClydHdfc2hvcnRfcmV0cnlfbG10OwotCXJlZ2lzdHJ5X3Bhci0+YnVzeV90aHJlc2ggPSAodTE2KXJ0d19idXN5X3RocmVzaDsKLQlyZWdpc3RyeV9wYXItPmFja19wb2xpY3kgPSAodTgpcnR3X2Fja19wb2xpY3k7Ci0JcmVnaXN0cnlfcGFyLT5hY21fbWV0aG9kID0gKHU4KXJ0d19hY21fbWV0aG9kOwotCSAvKiBVQVBTRCAqLwotCXJlZ2lzdHJ5X3Bhci0+d21tX2VuYWJsZSA9ICh1OClydHdfd21tX2VuYWJsZTsKLQlyZWdpc3RyeV9wYXItPnVhcHNkX2VuYWJsZSA9ICh1OClydHdfdWFwc2RfZW5hYmxlOwotCXJlZ2lzdHJ5X3Bhci0+aHRfZW5hYmxlID0gKHU4KXJ0d19odF9lbmFibGU7Ci0JcmVnaXN0cnlfcGFyLT5jYnc0MF9lbmFibGUgPSAodTgpcnR3X2NidzQwX2VuYWJsZTsKLQlyZWdpc3RyeV9wYXItPmFtcGR1X2VuYWJsZSA9ICh1OClydHdfYW1wZHVfZW5hYmxlOwotCXJlZ2lzdHJ5X3Bhci0+cnhfc3RiYyA9ICh1OClydHdfcnhfc3RiYzsKLQlyZWdpc3RyeV9wYXItPmFtcGR1X2Ftc2R1ID0gKHU4KXJ0d19hbXBkdV9hbXNkdTsKLQlyZWdpc3RyeV9wYXItPmxvd3JhdGVfdHdvX3htaXQgPSAodTgpcnR3X2xvd3JhdGVfdHdvX3htaXQ7Ci0JcmVnaXN0cnlfcGFyLT5yZl9jb25maWcgPSAodTgpcnR3X3JmX2NvbmZpZzsKLQlyZWdpc3RyeV9wYXItPmxvd19wb3dlciA9ICh1OClydHdfbG93X3Bvd2VyOwotCXJlZ2lzdHJ5X3Bhci0+d2lmaV9zcGVjID0gKHU4KXJ0d193aWZpX3NwZWM7Ci0JcmVnaXN0cnlfcGFyLT5jaGFubmVsX3BsYW4gPSAodTgpcnR3X2NoYW5uZWxfcGxhbjsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLQlyZWdpc3RyeV9wYXItPmJ0Y29leCA9ICh1OClydHdfYnRjb2V4X2VuYWJsZTsKLQlyZWdpc3RyeV9wYXItPmJ0X2lzbyA9ICh1OClydHdfYnRfaXNvOwotCXJlZ2lzdHJ5X3Bhci0+YnRfc2NvID0gKHU4KXJ0d19idF9zY287Ci0JcmVnaXN0cnlfcGFyLT5idF9hbXBkdSA9ICh1OClydHdfYnRfYW1wZHU7Ci0jZW5kaWYKLQlyZWdpc3RyeV9wYXItPmJBY2NlcHRBZGRiYVJlcSA9ICh1OClydHdfQWNjZXB0QWRkYmFSZXE7Ci0JcmVnaXN0cnlfcGFyLT5hbnRkaXZfY2ZnID0gKHU4KXJ0d19hbnRkaXZfY2ZnOwotCXJlZ2lzdHJ5X3Bhci0+YW50ZGl2X3R5cGUgPSAodTgpcnR3X2FudGRpdl90eXBlOwotCi0JLyogMDpkaXNhYmxlLCAxOmVuYWJsZSwgMjpieSBFRlVTRSBjb25maWcgKi8KLQlyZWdpc3RyeV9wYXItPmh3cGRuX21vZGUgPSAodTgpcnR3X2h3cGRuX21vZGU7Ci0JLyogMDpkaXNhYmxlLCAxOmVuYWJsZSAqLwotCXJlZ2lzdHJ5X3Bhci0+aHdwd3JwX2RldGVjdCA9ICh1OClydHdfaHdwd3JwX2RldGVjdDsKLQlyZWdpc3RyeV9wYXItPmh3X3dwc19wYmMgPSAodTgpcnR3X2h3X3dwc19wYmM7Ci0JcmVnaXN0cnlfcGFyLT5tYXhfcm9hbWluZ190aW1lcyA9ICh1OClydHdfbWF4X3JvYW1pbmdfdGltZXM7Ci0JcmVnaXN0cnlfcGFyLT5lbmFibGU4MDIxMWQgPSAodTgpcnR3XzgwMjExZDsKLQlzbnByaW50ZihyZWdpc3RyeV9wYXItPmlmbmFtZSwgMTYsICIlcyIsIGlmbmFtZSk7Ci0Jc25wcmludGYocmVnaXN0cnlfcGFyLT5pZjJuYW1lLCAxNiwgIiVzIiwgaWYybmFtZSk7Ci0JcmVnaXN0cnlfcGFyLT5ub3RjaF9maWx0ZXIgPSAodTgpcnR3X25vdGNoX2ZpbHRlcjsKLQlyZWdpc3RyeV9wYXItPnJlZ3VsYXRvcnlfdGlkID0gKHU4KXJ0d19yZWd1bGF0b3J5X2lkOwotfQotCi1zdGF0aWMgaW50IHJ0d19uZXRfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2LCB2b2lkICpwKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKLQlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOwotCi0JaWYgKCFwYWRhcHRlci0+YnVwKQotCQlldGhlcl9hZGRyX2NvcHkocGFkYXB0ZXItPmVlcHJvbXByaXYubWFjX2FkZHIsIGFkZHItPnNhX2RhdGEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnJ0d19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0KLQlwYWRhcHRlci0+c3RhdHMudHhfcGFja2V0cyA9IHB4bWl0cHJpdi0+dHhfcGt0czsKLQlwYWRhcHRlci0+c3RhdHMucnhfcGFja2V0cyA9IHByZWN2cHJpdi0+cnhfcGt0czsKLQlwYWRhcHRlci0+c3RhdHMudHhfZHJvcHBlZCA9IHB4bWl0cHJpdi0+dHhfZHJvcDsKLQlwYWRhcHRlci0+c3RhdHMucnhfZHJvcHBlZCA9IHByZWN2cHJpdi0+cnhfZHJvcDsKLQlwYWRhcHRlci0+c3RhdHMudHhfYnl0ZXMgPSBweG1pdHByaXYtPnR4X2J5dGVzOwotCXBhZGFwdGVyLT5zdGF0cy5yeF9ieXRlcyA9IHByZWN2cHJpdi0+cnhfYnl0ZXM7Ci0KLQlyZXR1cm4gJnBhZGFwdGVyLT5zdGF0czsKLX0KLQotLyoKLSAqIEFDIHRvIHF1ZXVlIG1hcHBpbmcKLSAqCi0gKiBBQ19WTyAtPiBxdWV1ZSAwCi0gKiBBQ19WSSAtPiBxdWV1ZSAxCi0gKiBBQ19CRSAtPiBxdWV1ZSAyCi0gKiBBQ19CSyAtPiBxdWV1ZSAzCi0gKi8KLXN0YXRpYyBjb25zdCB1MTYgcnR3XzFkX3RvX3F1ZXVlWzhdID0geyAyLCAzLCAzLCAyLCAxLCAxLCAwLCAwIH07Ci0KLS8qIEdpdmVuIGEgZGF0YSBmcmFtZSBkZXRlcm1pbmUgdGhlIDgwMi4xcC8xZCB0YWcgdG8gdXNlLiAqLwotc3RhdGljIHUzMiBydHdfY2xhc3NpZnk4MDIxZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXUzMiBkc2NwOwotCi0JLyogc2tiLT5wcmlvcml0eSB2YWx1ZXMgZnJvbSAyNTYtPjI2MyBhcmUgbWFnaWMgdmFsdWVzIHRvCi0JICogZGlyZWN0bHkgaW5kaWNhdGUgYSBzcGVjaWZpYyA4MDIuMWQgcHJpb3JpdHkuICBUaGlzIGlzIHVzZWQKLQkgKiB0byBhbGxvdyA4MDIuMWQgcHJpb3JpdHkgdG8gYmUgcGFzc2VkIGRpcmVjdGx5IGluIGZyb20gVkxBTgotCSAqIHRhZ3MsIGV0Yy4KLQkgKi8KLQlpZiAoc2tiLT5wcmlvcml0eSA+PSAyNTYgJiYgc2tiLT5wcmlvcml0eSA8PSAyNjMpCi0JCXJldHVybiBza2ItPnByaW9yaXR5IC0gMjU2OwotCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgewotCWNhc2UgaHRvbnMoRVRIX1BfSVApOgotCQlkc2NwID0gaXBfaGRyKHNrYiktPnRvcyAmIDB4ZmM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gZHNjcCA+PiA1OwotfQotCi1zdGF0aWMgdTE2IHJ0d19zZWxlY3RfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICB2b2lkICphY2NlbF9wcml2LAotCQkJICAgIHNlbGVjdF9xdWV1ZV9mYWxsYmFja190IGZhbGxiYWNrKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlza2ItPnByaW9yaXR5ID0gcnR3X2NsYXNzaWZ5ODAyMWQoc2tiKTsKLQotCWlmIChwbWxtZXByaXYtPmFjbV9tYXNrICE9IDApCi0JCXNrYi0+cHJpb3JpdHkgPSBxb3NfYWNtMjNhKHBtbG1lcHJpdi0+YWNtX21hc2ssIHNrYi0+cHJpb3JpdHkpOwotCXJldHVybiBydHdfMWRfdG9fcXVldWVbc2tiLT5wcmlvcml0eV07Ci19Ci0KLXUxNiBydHdfcmVjdl9zZWxlY3RfcXVldWUyM2Eoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaXBoZHIgKnBpcGhkcjsKLQlzdHJ1Y3QgZXRoaGRyICpldGggPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKLQl1bnNpZ25lZCBpbnQgZHNjcDsKLQl1MTYgZXRoX3R5cGUgPSBnZXRfdW5hbGlnbmVkX2JlMTYoJmV0aC0+aF9wcm90byk7Ci0JdTMyIHByaW9yaXR5OwotCXU4ICpwZGF0YSA9IHNrYi0+ZGF0YTsKLQotCXN3aXRjaCAoZXRoX3R5cGUpIHsKLQljYXNlIEVUSF9QX0lQOgotCQlwaXBoZHIgPSAoc3RydWN0IGlwaGRyICopKHBkYXRhICsgRVRIX0hMRU4pOwotCQlkc2NwID0gcGlwaGRyLT50b3MgJiAweGZjOwotCQlwcmlvcml0eSA9IGRzY3AgPj4gNTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpb3JpdHkgPSAwOwotCX0KLQlyZXR1cm4gcnR3XzFkX3RvX3F1ZXVlW3ByaW9yaXR5XTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBydHdfbmV0ZGV2X29wcyA9IHsKLQkubmRvX29wZW4gPSBuZXRkZXZfb3BlbjIzYSwKLQkubmRvX3N0b3AgPSBuZXRkZXZfY2xvc2UsCi0JLm5kb19zdGFydF94bWl0ID0gcnR3X3htaXQyM2FfZW50cnkyM2EsCi0JLm5kb19zZWxlY3RfcXVldWUgPSBydHdfc2VsZWN0X3F1ZXVlLAotCS5uZG9fc2V0X21hY19hZGRyZXNzID0gcnR3X25ldF9zZXRfbWFjX2FkZHJlc3MsCi0JLm5kb19nZXRfc3RhdHMgPSBydHdfbmV0X2dldF9zdGF0cywKLX07Ci0KLWludCBydHdfaW5pdF9uZXRkZXYyM2FfbmFtZTIzYShzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiwgY29uc3QgY2hhciAqaWZuYW1lKQotewotCWlmIChkZXZfYWxsb2NfbmFtZShwbmV0ZGV2LCBpZm5hbWUpIDwgMCkgewotCQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgImRldl9hbGxvY19uYW1lLCBmYWlsIVxuIik7Ci0JfQotCW5ldGlmX2NhcnJpZXJfb2ZmKHBuZXRkZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldmljZV90eXBlIHdsYW5fdHlwZSA9IHsKLQkubmFtZSA9ICJ3bGFuIiwKLX07Ci0KLXN0cnVjdCBuZXRfZGV2aWNlICpydHdfaW5pdF9uZXRkZXYyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpvbGRfcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldjsKLQotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICIraW5pdF9uZXRfZGV2XG4iKTsKLQotCXBuZXRkZXYgPSBhbGxvY19ldGhlcmRldl9tcShzaXplb2Yoc3RydWN0IHJ0d19hZGFwdGVyKSwgNCk7Ci0JaWYgKCFwbmV0ZGV2KQotCQlyZXR1cm4gTlVMTDsKLQotCXBuZXRkZXYtPmRldi50eXBlID0gJndsYW5fdHlwZTsKLQlwYWRhcHRlciA9IG5ldGRldl9wcml2KHBuZXRkZXYpOwotCXBhZGFwdGVyLT5wbmV0ZGV2ID0gcG5ldGRldjsKLQotCURCR184NzIzQSgicmVnaXN0ZXIgcnR3X25ldGRldl9vcHMgdG8gbmV0ZGV2X29wc1xuIik7Ci0JcG5ldGRldi0+bmV0ZGV2X29wcyA9ICZydHdfbmV0ZGV2X29wczsKLQotCXBuZXRkZXYtPndhdGNoZG9nX3RpbWVvID0gSFoqMzsgLyogMyBzZWNvbmQgdGltZW91dCAqLwotCi0JbG9hZHBhcmFtKHBhZGFwdGVyLCBwbmV0ZGV2KTsKLQlyZXR1cm4gcG5ldGRldjsKLX0KLQotc3RhdGljIGludCBydHdfaW5pdF9kZWZhdWx0X3ZhbHVlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQotCS8qIHhtaXRfcHJpdiAqLwotCXB4bWl0cHJpdi0+dmNzID0gcHJlZ2lzdHJ5cHJpdi0+dmNzX3R5cGU7Ci0JLyogcHhtaXRwcml2LT5ydHNfdGhyZXNoID0gcHJlZ2lzdHJ5cHJpdi0+cnRzX3RocmVzaDsgKi8KLQlweG1pdHByaXYtPmZyYWdfbGVuID0gcHJlZ2lzdHJ5cHJpdi0+ZnJhZ190aHJlc2g7Ci0KLQkvKiBtbG1lX3ByaXYgKi8KLQlwbWxtZXByaXYtPnNjYW5faW50ZXJ2YWwgPSBTQ0FOX0lOVEVSVkFMOy8qICAzMCoyIHNlYyA9IDYwc2VjICovCi0JcG1sbWVwcml2LT5zY2FuX21vZGUgPSBTQ0FOX0FDVElWRTsKLQotCS8qIGh0X3ByaXYgKi8KLQlwbWxtZXByaXYtPmh0cHJpdi5hbXBkdV9lbmFibGUgPSBmYWxzZTsvKiBzZXQgdG8gZGlzYWJsZWQgKi8KLQotCS8qIHNlY3VyaXR5X3ByaXYgKi8KLQlwc2VjdXJpdHlwcml2LT5iaW5zdGFsbEdycGtleSA9IDA7Ci0KLQkgLyogb3BlbiBzeXN0ZW0gKi8KLQlwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID0gZG90MTFBdXRoQWxncnRobV9PcGVuOwotCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPSAwOwotCi0JcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5S2V5SW5kZXggPSAwOwotCi0JcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3kgPSAwOwotCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZCA9IDE7Ci0KLQlwc2VjdXJpdHlwcml2LT5uZGlzYXV0aHR5cGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCXBzZWN1cml0eXByaXYtPm5kaXNlbmNyeXB0c3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCi0JLyogcmVnaXN0cnlfcHJpdiAqLwotCXJ0d19pbml0X3JlZ2lzdHJ5cHJpdl9kZXZfbmV0d29yazIzYShwYWRhcHRlcik7Ci0JcnR3X3VwZGF0ZV9yZWdpc3RyeXByaXZfZGV2X25ldHdvcmsyM2EocGFkYXB0ZXIpOwotCi0JLyogaGFsX3ByaXYgKi8KLQlydGw4NzIzYV9pbml0X2RlZmF1bHRfdmFsdWUocGFkYXB0ZXIpOwotCi0JLyogbWlzYy4gKi8KLQlwYWRhcHRlci0+YlJlYWRQb3J0Q2FuY2VsID0gZmFsc2U7Ci0JcGFkYXB0ZXItPmJXcml0ZVBvcnRDYW5jZWwgPSBmYWxzZTsKLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLWludCBydHdfcmVzZXRfZHJ2X3N3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJscHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQkvKiBoYWxfcHJpdiAqLwotCXJ0bDg3MjNhX2luaXRfZGVmYXVsdF92YWx1ZShwYWRhcHRlcik7Ci0JcGFkYXB0ZXItPmJSZWFkUG9ydENhbmNlbCA9IGZhbHNlOwotCXBhZGFwdGVyLT5iV3JpdGVQb3J0Q2FuY2VsID0gZmFsc2U7Ci0JcG1sbWVwcml2LT5zY2FuX2ludGVydmFsID0gU0NBTl9JTlRFUlZBTDsvKiAgMzAqMiBzZWMgPSA2MHNlYyAqLwotCi0JcGFkYXB0ZXItPnhtaXRwcml2LnR4X3BrdHMgPSAwOwotCXBhZGFwdGVyLT5yZWN2cHJpdi5yeF9wa3RzID0gMDsKLQotCXBtbG1lcHJpdi0+TGlua0RldGVjdEluZm8uYkJ1c3lUcmFmZmljID0gZmFsc2U7Ci0KLQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSB8IF9GV19VTkRFUl9MSU5LSU5HKTsKLQotCXJ0d19zcmVzZXRfcmVzZXRfdmFsdWUocGFkYXB0ZXIpOwotCXB3cmN0cmxwcml2LT5wd3Jfc3RhdGVfY2hlY2tfY250cyA9IDA7Ci0KLQkvKiBtbG1lZXh0cHJpdiAqLwotCXBhZGFwdGVyLT5tbG1lZXh0cHJpdi5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9IFNDQU5fRElTQUJMRTsKLQotCXJ0d19zZXRfc2lnbmFsX3N0YXRfdGltZXIoJnBhZGFwdGVyLT5yZWN2cHJpdik7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1pbnQgcnR3X2luaXRfZHJ2X3N3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaW50IHJldDggPSBfU1VDQ0VTUzsKLQotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICIrcnR3X2luaXRfZHJ2X3N3MjNhXG4iKTsKLQotCWlmIChydHdfaW5pdF9jbWRfcHJpdjIzYSgmcGFkYXB0ZXItPmNtZHByaXYpID09IF9GQUlMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJCSAiQ2FuJ3QgaW5pdCBjbWRfcHJpdlxuIik7Ci0JCXJldDggPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBhZGFwdGVyLT5jbWRwcml2LnBhZGFwdGVyID0gcGFkYXB0ZXI7Ci0KLQlpZiAocnR3X2luaXRfZXZ0X3ByaXYyM2EoJnBhZGFwdGVyLT5ldnRwcml2KSA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkNhbid0IGluaXQgZXZ0X3ByaXZcbiIpOwotCQlyZXQ4ID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAocnR3X2luaXRfbWxtZV9wcml2MjNhKHBhZGFwdGVyKSA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkNhbid0IGluaXQgbWxtZV9wcml2XG4iKTsKLQkJcmV0OCA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0KLQlpZiAoaW5pdF9tbG1lX2V4dF9wcml2MjNhKHBhZGFwdGVyKSA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkNhbid0IGluaXQgbWxtZV9leHRfcHJpdlxuIik7Ci0JCXJldDggPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChfcnR3X2luaXRfeG1pdF9wcml2MjNhKCZwYWRhcHRlci0+eG1pdHByaXYsIHBhZGFwdGVyKSA9PSBfRkFJTCkgewotCQlEQkdfODcyM0EoIkNhbid0IF9ydHdfaW5pdF94bWl0X3ByaXYyM2FcbiIpOwotCQlyZXQ4ID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoX3J0d19pbml0X3JlY3ZfcHJpdjIzYSgmcGFkYXB0ZXItPnJlY3Zwcml2LCBwYWRhcHRlcikgPT0gX0ZBSUwpIHsKLQkJREJHXzg3MjNBKCJDYW4ndCBfcnR3X2luaXRfcmVjdl9wcml2MjNhXG4iKTsKLQkJcmV0OCA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKF9ydHdfaW5pdF9zdGFfcHJpdjIzYSgmcGFkYXB0ZXItPnN0YXByaXYpID09IF9GQUlMKSB7Ci0JCURCR184NzIzQSgiQ2FuJ3QgX3J0d19pbml0X3N0YV9wcml2MjNhXG4iKTsKLQkJcmV0OCA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGFkYXB0ZXItPnN0YXByaXYucGFkYXB0ZXIgPSBwYWRhcHRlcjsKLQlwYWRhcHRlci0+c2V0YmFuZCA9IEdIWjI0XzUwOwotCXJ0d19pbml0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0KLQlydHdfaW5pdF9wd3JjdHJsX3ByaXYyM2EocGFkYXB0ZXIpOwotCi0JcmV0OCA9IHJ0d19pbml0X2RlZmF1bHRfdmFsdWUocGFkYXB0ZXIpOwotCi0JcnRsODcyM2FfaW5pdF9kbV9wcml2KHBhZGFwdGVyKTsKLQotCXJ0d19zcmVzZXRfaW5pdChwYWRhcHRlcik7Ci0KLWV4aXQ6Ci0KLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAiLXJ0d19pbml0X2Rydl9zdzIzYVxuIik7Ci0JcmV0dXJuIHJldDg7Ci19Ci0KLXZvaWQgcnR3X2NhbmNlbF9hbGxfdGltZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLAotCQkgIitydHdfY2FuY2VsX2FsbF90aW1lcjIzYVxuIik7Ci0KLQlkZWxfdGltZXJfc3luYygmcGFkYXB0ZXItPm1sbWVwcml2LmFzc29jX3RpbWVyKTsKLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOmNhbmNlbCBhc3NvY2lhdGlvbiB0aW1lciBjb21wbGV0ZSFcbiIsIF9fZnVuY19fKTsKLQotCWRlbF90aW1lcl9zeW5jKCZwYWRhcHRlci0+bWxtZXByaXYuc2Nhbl90b190aW1lcik7Ci0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywKLQkJICIlczpjYW5jZWwgc2Nhbl90b190aW1lciFcbiIsIF9fZnVuY19fKTsKLQotCWRlbF90aW1lcl9zeW5jKCZwYWRhcHRlci0+bWxtZXByaXYuZHluYW1pY19jaGtfdGltZXIpOwotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sCi0JCSAiJXM6Y2FuY2VsIGR5bmFtaWNfY2hrX3RpbWVyIVxuIiwgX19mdW5jX18pOwotCi0JZGVsX3RpbWVyX3N5bmMoJnBhZGFwdGVyLT5wd3JjdHJscHJpdi5wd3Jfc3RhdGVfY2hlY2tfdGltZXIpOwotCi0JZGVsX3RpbWVyX3N5bmMoJnBhZGFwdGVyLT5tbG1lcHJpdi5zZXRfc2Nhbl9kZW55X3RpbWVyKTsKLQlydHdfY2xlYXJfc2Nhbl9kZW55KHBhZGFwdGVyKTsKLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOmNhbmNlbCBzZXRfc2Nhbl9kZW55X3RpbWVyIVxuIiwgX19mdW5jX18pOwotCi0JZGVsX3RpbWVyX3N5bmMoJnBhZGFwdGVyLT5yZWN2cHJpdi5zaWduYWxfc3RhdF90aW1lcik7Ci19Ci0KLWludCBydHdfZnJlZV9kcnZfc3cyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAiPT0+cnR3X2ZyZWVfZHJ2X3N3MjNhXG4iKTsKLQotCWZyZWVfbWxtZV9leHRfcHJpdjIzYSgmcGFkYXB0ZXItPm1sbWVleHRwcml2KTsKLQotCXJ0d19mcmVlX2V2dF9wcml2MjNhKCZwYWRhcHRlci0+ZXZ0cHJpdik7Ci0KLQlydHdfZnJlZV9tbG1lX3ByaXYyM2EoJnBhZGFwdGVyLT5tbG1lcHJpdik7Ci0KLQlfcnR3X2ZyZWVfeG1pdF9wcml2MjNhKCZwYWRhcHRlci0+eG1pdHByaXYpOwotCi0JLyogd2lsbCBmcmVlIGJjbWNfc3RhaW5mbyBoZXJlICovCi0JX3J0d19mcmVlX3N0YV9wcml2MjNhKCZwYWRhcHRlci0+c3RhcHJpdik7Ci0KLQlfcnR3X2ZyZWVfcmVjdl9wcml2MjNhKCZwYWRhcHRlci0+cmVjdnByaXYpOwotCi0JcnR3X2ZyZWVfcHdyY3RybF9wcml2KHBhZGFwdGVyKTsKLQotCWtmcmVlKHBhZGFwdGVyLT5IYWxEYXRhKTsKLQlwYWRhcHRlci0+SGFsRGF0YSA9IE5VTEw7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAiLXJ0d19mcmVlX2Rydl9zdzIzYVxuIik7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IF9ydHdfZHJ2X3JlZ2lzdGVyX25ldGRldihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2ID0gcGFkYXB0ZXItPnBuZXRkZXY7Ci0JaW50IHJldCA9IF9TVUNDRVNTOwotCi0JLyogYWxsb2MgbmV0ZGV2IG5hbWUgKi8KLQlydHdfaW5pdF9uZXRkZXYyM2FfbmFtZTIzYShwbmV0ZGV2LCBuYW1lKTsKLQotCWV0aGVyX2FkZHJfY29weShwbmV0ZGV2LT5kZXZfYWRkciwgcGFkYXB0ZXItPmVlcHJvbXByaXYubWFjX2FkZHIpOwotCi0JLyogVGVsbCB0aGUgbmV0d29yayBzdGFjayB3ZSBleGlzdCAqLwotCWlmIChyZWdpc3Rlcl9uZXRkZXYocG5ldGRldikpIHsKLQkJREJHXzg3MjNBKCIlcyglcyk6IEZhaWxlZCFcbiIsIF9fZnVuY19fLCBwbmV0ZGV2LT5uYW1lKTsKLQkJcmV0ID0gX0ZBSUw7Ci0JCWdvdG8gZXJyb3JfcmVnaXN0ZXJfbmV0ZGV2OwotCX0KLQlEQkdfODcyM0EoIiVzLCBNQUMgQWRkcmVzcyAoaWYlZCkgPSAlcE1cbiIsCi0JCSAgX19mdW5jX18sIHBhZGFwdGVyLT5pZmFjZV9pZCArIDEsIHBuZXRkZXYtPmRldl9hZGRyKTsKLQlyZXR1cm4gcmV0OwotCi1lcnJvcl9yZWdpc3Rlcl9uZXRkZXY6Ci0KLQlpZiAocGFkYXB0ZXItPmlmYWNlX2lkID4gSUZBQ0VfSUQwKSB7Ci0JCXJ0d19mcmVlX2Rydl9zdzIzYShwYWRhcHRlcik7Ci0KLQkJZnJlZV9uZXRkZXYocG5ldGRldik7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBydHdfZHJ2X3JlZ2lzdGVyX25ldGRldihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmlmMSkKLXsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmogPSBpZjEtPmR2b2JqOwotCWludCBpLCBzdGF0dXMgPSBfU1VDQ0VTUzsKLQotCWlmIChkdm9iai0+aWZhY2VfbnVtcyA+PSBJRkFDRV9JRF9NQVgpIHsKLQkJc3RhdHVzID0gX0ZBSUw7IC8qIC1FSU5WQUwgKi8KLQkJZ290byBleGl0OwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBkdm9iai0+aWZhY2VfbnVtczsgaSsrKSB7Ci0JCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBkdm9iai0+cGFkYXB0ZXJzW2ldOwotCi0JCWlmIChwYWRhcHRlcikgewotCQkJY2hhciAqbmFtZTsKLQotCQkJaWYgKHBhZGFwdGVyLT5pZmFjZV9pZCA9PSBJRkFDRV9JRDApCi0JCQkJbmFtZSA9IGlmMS0+cmVnaXN0cnlwcml2LmlmbmFtZTsKLQkJCWVsc2UgaWYgKHBhZGFwdGVyLT5pZmFjZV9pZCA9PSBJRkFDRV9JRDEpCi0JCQkJbmFtZSA9IGlmMS0+cmVnaXN0cnlwcml2LmlmMm5hbWU7Ci0JCQllbHNlCi0JCQkJbmFtZSA9ICJ3bGFuJWQiOwotCQkJc3RhdHVzID0gX3J0d19kcnZfcmVnaXN0ZXJfbmV0ZGV2KHBhZGFwdGVyLCBuYW1lKTsKLQkJCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotaW50IG5ldGRldl9vcGVuMjNhKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJscHJpdjsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgc3RhdHVzOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgIis4NzF4X2RydiAtIGRldl9vcGVuXG4iKTsKLQlEQkdfODcyM0EoIis4NzF4X2RydiAtIGRydl9vcGVuLCBidXAgPSVkXG4iLCBwYWRhcHRlci0+YnVwKTsKLQotCW11dGV4X2xvY2soJmFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpLT5od19pbml0X211dGV4KTsKLQotCXB3cmN0cmxwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQotCWlmICghcGFkYXB0ZXItPmJ1cCkgewotCQlwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPSBmYWxzZTsKLQkJcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPSBmYWxzZTsKLQkJcGFkYXB0ZXItPmJDYXJkRGlzYWJsZVdPSFNNID0gZmFsc2U7Ci0KLQkJc3RhdHVzID0gcnRsODcyM2F1X2hhbF9pbml0KHBhZGFwdGVyKTsKLQkJaWYgKHN0YXR1cyA9PSBfRkFJTCkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJCSAicnRsODcxeF9oYWxfaW5pdCgpOiBDYW4ndCBpbml0IGgvdyFcbiIpOwotCQkJZ290byBuZXRkZXZfb3BlbjIzYV9lcnJvcjsKLQkJfQotCi0JCURCR184NzIzQSgiTUFDIEFkZHJlc3MgPSAlcE1cbiIsIHBuZXRkZXYtPmRldl9hZGRyKTsKLQotCQlpZiAoaW5pdF9od19tbG1lX2V4dDIzYShwYWRhcHRlcikgPT0gX0ZBSUwpIHsKLQkJCURCR184NzIzQSgiY2FuJ3QgaW5pdCBtbG1lX2V4dF9wcml2XG4iKTsKLQkJCWdvdG8gbmV0ZGV2X29wZW4yM2FfZXJyb3I7Ci0JCX0KLQotCQlydGw4NzIzYXVfaW5pcnBfaW5pdChwYWRhcHRlcik7Ci0KLQkJcnR3X2NmZzgwMjExX2luaXRfd2lwaHkocGFkYXB0ZXIpOwotCi0JCXBhZGFwdGVyLT5idXAgPSB0cnVlOwotCX0KLQlwYWRhcHRlci0+bmV0X2Nsb3NlZCA9IGZhbHNlOwotCi0JbW9kX3RpbWVyKCZwYWRhcHRlci0+bWxtZXByaXYuZHluYW1pY19jaGtfdGltZXIsCi0JCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpOwotCi0JcGFkYXB0ZXItPnB3cmN0cmxwcml2LmJpcHNfcHJvY2Vzc2luZyA9IGZhbHNlOwotCXJ0d19zZXRfcHdyX3N0YXRlX2NoZWNrX3RpbWVyKCZwYWRhcHRlci0+cHdyY3RybHByaXYpOwotCi0JLyogbmV0aWZfY2Fycmllcl9vbihwbmV0ZGV2KTtjYWxsIHRoaXMgZnVuYyB3aGVuCi0JICAgcnR3MjNhX2pvaW5ic3NfZXZlbnRfY2IgcmV0dXJuIHN1Y2Nlc3MgKi8KLQlpZiAoIXJ0d19uZXRpZl9xdWV1ZV9zdG9wcGVkKHBuZXRkZXYpKQotCQluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKHBuZXRkZXYpOwotCWVsc2UKLQkJbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKHBuZXRkZXYpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgIi04NzF4X2RydiAtIGRldl9vcGVuXG4iKTsKLQlEQkdfODcyM0EoIi04NzF4X2RydiAtIGRydl9vcGVuLCBidXAgPSVkXG4iLCBwYWRhcHRlci0+YnVwKTsKLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKS0+aHdfaW5pdF9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLQotbmV0ZGV2X29wZW4yM2FfZXJyb3I6Ci0JcGFkYXB0ZXItPmJ1cCA9IGZhbHNlOwotCi0JbmV0aWZfY2Fycmllcl9vZmYocG5ldGRldik7Ci0JbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKHBuZXRkZXYpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9lcnJfLAotCQkgIi04NzF4X2RydiAtIGRldl9vcGVuLCBmYWlsIVxuIik7Ci0JREJHXzg3MjNBKCItODcxeF9kcnYgLSBkcnZfb3BlbiBmYWlsLCBidXAgPSVkXG4iLCBwYWRhcHRlci0+YnVwKTsKLQotCXJldCA9IC0xOwotCWdvdG8gZXhpdDsKLX0KLQotc3RhdGljIGludCBpcHNfbmV0ZHJ2X29wZW4oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlpbnQgc3RhdHVzID0gX1NVQ0NFU1M7Ci0KLQlwYWRhcHRlci0+bmV0X2Nsb3NlZCA9IGZhbHNlOwotCURCR184NzIzQSgiPT09PiAlcy4uLi4uLi4uLlxuIiwgX19mdW5jX18pOwotCi0JcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkID0gZmFsc2U7Ci0JcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPSBmYWxzZTsKLQlwYWRhcHRlci0+YkNhcmREaXNhYmxlV09IU00gPSBmYWxzZTsKLQotCXN0YXR1cyA9IHJ0bDg3MjNhdV9oYWxfaW5pdChwYWRhcHRlcik7Ci0JaWYgKHN0YXR1cyA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgImlwc19uZXRkcnZfb3BlbigpOiBDYW4ndCBpbml0IGgvdyFcbiIpOwotCQlnb3RvIG5ldGRldl9vcGVuMjNhX2Vycm9yOwotCX0KLQotCXJ0bDg3MjNhdV9pbmlycF9pbml0KHBhZGFwdGVyKTsKLQotCXJ0d19zZXRfcHdyX3N0YXRlX2NoZWNrX3RpbWVyKCZwYWRhcHRlci0+cHdyY3RybHByaXYpOwotCW1vZF90aW1lcigmcGFkYXB0ZXItPm1sbWVwcml2LmR5bmFtaWNfY2hrX3RpbWVyLAotCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMDApKTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLQotbmV0ZGV2X29wZW4yM2FfZXJyb3I6Ci0JLyogcGFkYXB0ZXItPmJ1cCA9IGZhbHNlOyAqLwotCURCR184NzIzQSgiLWlwc19uZXRkcnZfb3BlbiAtIGRydl9vcGVuIGZhaWx1cmUsIGJ1cCA9JWRcbiIsCi0JCSAgcGFkYXB0ZXItPmJ1cCk7Ci0KLQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLWludCBydHdfaXBzX3B3cl91cDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWludCByZXN1bHQ7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF90aW1lID0gamlmZmllczsKLQotCURCR184NzIzQSgiPT09PiAgcnR3X2lwc19wd3JfdXAyM2EuLi4uLi4uLi4uLi4uLlxuIik7Ci0JcnR3X3Jlc2V0X2Rydl9zdzIzYShwYWRhcHRlcik7Ci0KLQlyZXN1bHQgPSBpcHNfbmV0ZHJ2X29wZW4ocGFkYXB0ZXIpOwotCi0JREJHXzg3MjNBKCI8PT09ICBydHdfaXBzX3B3cl91cDIzYS4uLi4uLi4uLi4uLi4uIGluICVkbXNcbiIsCi0JCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnRfdGltZSkpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgcnR3X2lwc19wd3JfZG93bjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZSA9IGppZmZpZXM7Ci0KLQlEQkdfODcyM0EoIj09PT4gcnR3X2lwc19wd3JfZG93bjIzYS4uLi4uLi4uLi4uLi4uLi4uLi5cbiIpOwotCi0JcGFkYXB0ZXItPmJDYXJkRGlzYWJsZVdPSFNNID0gdHJ1ZTsKLQlwYWRhcHRlci0+bmV0X2Nsb3NlZCA9IHRydWU7Ci0KLQlydHdfaXBzX2Rldl91bmxvYWQyM2EocGFkYXB0ZXIpOwotCXBhZGFwdGVyLT5iQ2FyZERpc2FibGVXT0hTTSA9IGZhbHNlOwotCURCR184NzIzQSgiPD09PSBydHdfaXBzX3B3cl9kb3duMjNhLi4uLi4uLi4uLi4uLi4uLi4uLi4uIGluICVkbXNcbiIsCi0JCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnRfdGltZSkpOwotfQotCi12b2lkIHJ0d19pcHNfZGV2X3VubG9hZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXJ0bDg3MjNhX2ZpZm9fY2xlYW51cChwYWRhcHRlcik7Ci0KLQlydGw4NzIzYV91c2JfaW50Zl9zdG9wKHBhZGFwdGVyKTsKLQotCS8qIHM1LiAqLwotCWlmICghcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpCi0JCXJ0bDg3MjNhdV9oYWxfZGVpbml0KHBhZGFwdGVyKTsKLX0KLQotaW50IHBtX25ldGRldl9vcGVuMjNhKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2LCB1OCBibm9ybWFsKQotewotCWludCBzdGF0dXM7Ci0KLQlpZiAoYm5vcm1hbCkKLQkJc3RhdHVzID0gbmV0ZGV2X29wZW4yM2EocG5ldGRldik7Ci0JZWxzZQotCQlzdGF0dXMgPSAoX1NVQ0NFU1MgPT0gaXBzX25ldGRydl9vcGVuKG5ldGRldl9wcml2KHBuZXRkZXYpKSkgPwotCQkJICgwKSA6ICgtMSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldikKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYocG5ldGRldik7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAiKzg3MXhfZHJ2IC0gZHJ2X2Nsb3NlXG4iKTsKLQotCXBhZGFwdGVyLT5uZXRfY2xvc2VkID0gdHJ1ZTsKLQotCWlmIChwYWRhcHRlci0+cHdyY3RybHByaXYucmZfcHdyc3RhdGUgPT0gcmZfb24pIHsKLQkJREJHXzg3MjNBKCIoMik4NzF4X2RydiAtIGRydl9jbG9zZSwgYnVwID0lZCwgIgotCQkJICAiaHdfaW5pdF9jb21wbGV0ZWQgPSVkXG4iLCBwYWRhcHRlci0+YnVwLAotCQkJICBwYWRhcHRlci0+aHdfaW5pdF9jb21wbGV0ZWQpOwotCi0JCS8qIHMxLiAqLwotCQlpZiAocG5ldGRldikgewotCQkJaWYgKCFydHdfbmV0aWZfcXVldWVfc3RvcHBlZChwbmV0ZGV2KSkKLQkJCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMocG5ldGRldik7Ci0JCX0KLQotCQkvKiBzMi4gKi8KLQkJTGVhdmVBbGxQb3dlclNhdmVNb2RlMjNhKHBhZGFwdGVyKTsKLQkJcnR3X2Rpc2Fzc29jX2NtZDIzYShwYWRhcHRlciwgNTAwLCBmYWxzZSk7Ci0JCS8qIHMyLTIuICBpbmRpY2F0ZSBkaXNjb25uZWN0IHRvIG9zICovCi0JCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHBhZGFwdGVyKTsKLQkJLyogczItMy4gKi8KLQkJcnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhKHBhZGFwdGVyLCAxKTsKLQkJLyogczItNC4gKi8KLQkJcnR3X2ZyZWVfbmV0d29ya19xdWV1ZTIzYShwYWRhcHRlcik7Ci0JfQotCi0JcnR3X3NjYW5fYWJvcnQyM2EocGFkYXB0ZXIpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgIi04NzF4X2RydiAtIGRydl9jbG9zZVxuIik7Ci0JREJHXzg3MjNBKCItODcxeF9kcnYgLSBkcnZfY2xvc2UsIGJ1cCA9JWRcbiIsIHBhZGFwdGVyLT5idXApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcnR3X25kZXZfZGVzdHJ1Y3RvcihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKLXsKLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUpOwotCWtmcmVlKG5kZXYtPmllZWU4MDIxMV9wdHIpOwotCWZyZWVfbmV0ZGV2KG5kZXYpOwotfQotCi12b2lkIF9ydHdfaW5pdF9xdWV1ZTIzYShzdHJ1Y3QgcnR3X3F1ZXVlICpwcXVldWUpCi17Ci0JSU5JVF9MSVNUX0hFQUQoJnBxdWV1ZS0+cXVldWUpOwotCXNwaW5fbG9ja19pbml0KCZwcXVldWUtPmxvY2spOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvcmVjdl9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvcmVjdl9saW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODRiNTA2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3JlY3ZfbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1JFQ1ZfT1NERVBfQ18KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotI2luY2x1ZGUgPHdpZmkuaD4KLSNpbmNsdWRlIDxyZWN2X29zZGVwLmg+Ci0KLSNpbmNsdWRlIDxvc2RlcF9pbnRmLmg+Ci0KLSNpbmNsdWRlIDx1c2Jfb3BzLmg+Ci0KLXZvaWQgcnR3X2hhbmRsZV90a2lwX21pY19lcnIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYmdyb3VwKQotewotCWVudW0gbmw4MDIxMV9rZXlfdHlwZSBrZXlfdHlwZSA9IDA7Ci0JdW5pb24gaXdyZXFfZGF0YSB3cnF1OwotCXN0cnVjdCBpd19taWNoYWVsbWljZmFpbHVyZSBldjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXVuc2lnbmVkIGxvbmcgY3VyX3RpbWU7Ci0KLQlpZiAocHNlY3VyaXR5cHJpdi0+bGFzdF9taWNfZXJyX3RpbWUgPT0gMCkgewotCQlwc2VjdXJpdHlwcml2LT5sYXN0X21pY19lcnJfdGltZSA9IGppZmZpZXM7Ci0JfSBlbHNlIHsKLQkJY3VyX3RpbWUgPSBqaWZmaWVzOwotCi0JCWlmIChjdXJfdGltZSAtIHBzZWN1cml0eXByaXYtPmxhc3RfbWljX2Vycl90aW1lIDwgNjAqSFopIHsKLQkJCXBzZWN1cml0eXByaXYtPmJ0a2lwX2NvdW50ZXJtZWFzdXJlID0gdHJ1ZTsKLQkJCXBzZWN1cml0eXByaXYtPmxhc3RfbWljX2Vycl90aW1lID0gMDsKLQkJCXBzZWN1cml0eXByaXYtPmJ0a2lwX2NvdW50ZXJtZWFzdXJlX3RpbWUgPSBjdXJfdGltZTsKLQkJfSBlbHNlIHsKLQkJCXBzZWN1cml0eXByaXYtPmxhc3RfbWljX2Vycl90aW1lID0gamlmZmllczsKLQkJfQotCX0KLQotCWlmIChiZ3JvdXApCi0JCWtleV90eXBlIHw9IE5MODAyMTFfS0VZVFlQRV9HUk9VUDsKLQllbHNlCi0JCWtleV90eXBlIHw9IE5MODAyMTFfS0VZVFlQRV9QQUlSV0lTRTsKLQotCWNmZzgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUocGFkYXB0ZXItPnBuZXRkZXYsCi0JCQkJICAgICAodTggKikmcG1sbWVwcml2LT5hc3NvY19ic3NpZFswXSwKLQkJCQkgICAgIGtleV90eXBlLCAtMSwgTlVMTCwgR0ZQX0FUT01JQyk7Ci0KLQltZW1zZXQoJmV2LCAweDAwLCBzaXplb2YoZXYpKTsKLQlpZiAoYmdyb3VwKQotCQlldi5mbGFncyB8PSBJV19NSUNGQUlMVVJFX0dST1VQOwotCWVsc2UKLQkJZXYuZmxhZ3MgfD0gSVdfTUlDRkFJTFVSRV9QQUlSV0lTRTsKLQotCWV2LnNyY19hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQlldGhlcl9hZGRyX2NvcHkoZXYuc3JjX2FkZHIuc2FfZGF0YSwgJnBtbG1lcHJpdi0+YXNzb2NfYnNzaWRbMF0pOwotCi0JbWVtc2V0KCZ3cnF1LCAweDAwLCBzaXplb2Yod3JxdSkpOwotCXdycXUuZGF0YS5sZW5ndGggPSBzaXplb2YoZXYpOwotfQotCi1pbnQgcnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0Jc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2OwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCXByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0KLQlza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCWlmICghc2tiKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcmVjdl9vc2RlcF9jXywgX2Rydl9lcnJfLAotCQkJICJydHdfcmVjdl9pbmRpY2F0ZXBrdDIzYSgpOnNrYiA9PSBOVUxMISEhIVxuIik7Ci0JCWdvdG8gX3JlY3ZfaW5kaWNhdGVwa3RfZHJvcDsKLQl9Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3JlY3Zfb3NkZXBfY18sIF9kcnZfaW5mb18sCi0JCSAicnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2EoKTpza2IgIT0gTlVMTCAhISFcbiIpOwotCVJUX1RSQUNFKF9tb2R1bGVfcmVjdl9vc2RlcF9jXywgX2Rydl9pbmZvXywKLQkJICJydHdfcmVjdl9pbmRpY2F0ZXBrdDIzYSgpOnByZWN2X2ZyYW1lLT5oZHIucnhfZGF0YSA9JXBcbiIsCi0JCSBwcmVjdl9mcmFtZS0+cGt0LT5kYXRhKTsKLQlSVF9UUkFDRShfbW9kdWxlX3JlY3Zfb3NkZXBfY18sIF9kcnZfaW5mb18sCi0JCSAic2tiLT5oZWFkID0lcCBza2ItPmRhdGEgPSVwIHNrYi0+dGFpbCA9JXAgc2tiLT5lbmQgPSVwIHNrYi0+bGVuID0lZFxuIiwKLQkJIHNrYi0+aGVhZCwgc2tiLT5kYXRhLAotCQkgc2tiX3RhaWxfcG9pbnRlcihza2IpLCBza2JfZW5kX3BvaW50ZXIoc2tiKSwgc2tiLT5sZW4pOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSA9PSB0cnVlKSB7Ci0JCXN0cnVjdCBza19idWZmICpwc2tiMiA9IE5VTEw7Ci0JCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7Ci0JCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0JCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT5hdHRyaWI7Ci0JCWludCBibWNhc3QgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5kc3QpOwotCi0JCS8qIERCR184NzIzQSgiYm1jYXN0ID0lZFxuIiwgYm1jYXN0KTsgKi8KLQotCQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwocGF0dHJpYi0+ZHN0LAotCQkJCSAgICAgIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSkpIHsKLQkJCS8qIERCR184NzIzQSgibm90IGFwIHBzdGEgPSVwLCBhZGRyID0lcE1cbiIsIHBzdGEsIHBhdHRyaWItPmRzdCk7ICovCi0JCQlpZiAoYm1jYXN0KSB7Ci0JCQkJcHN0YSA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQkJCQlwc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwotCQkJfSBlbHNlIHsKLQkJCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwYXR0cmliLT5kc3QpOwotCQkJfQotCi0JCQlpZiAocHN0YSkgewotCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2ID0gcGFkYXB0ZXItPnBuZXRkZXY7Ci0KLQkJCQkvKiBEQkdfODcyM0EoImRpcmVjdGx5IGZvcndhcmRpbmcgdG8gdGhlIHJ0d194bWl0MjNhX2VudHJ5MjNhXG4iKTsgKi8KLQotCQkJCS8qIHNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsgKi8KLQkJCQlza2ItPmRldiA9IHBuZXRkZXY7Ci0JCQkJc2tiX3NldF9xdWV1ZV9tYXBwaW5nKHNrYiwgcnR3X3JlY3Zfc2VsZWN0X3F1ZXVlMjNhKHNrYikpOwotCi0JCQkJcnR3X3htaXQyM2FfZW50cnkyM2Eoc2tiLCBwbmV0ZGV2KTsKLQotCQkJCWlmIChibWNhc3QpCi0JCQkJCXNrYiA9IHBza2IyOwotCQkJCWVsc2UKLQkJCQkJZ290byBfcmVjdl9pbmRpY2F0ZXBrdF9lbmQ7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8qICB0byBBUHNlbGYgKi8KLQkJCS8qIERCR184NzIzQSgidG8gQVBTZWxmXG4iKTsgKi8KLQkJfQotCX0KLQotCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLQlza2ItPmRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHBhZGFwdGVyLT5wbmV0ZGV2KTsKLQotCW5ldGlmX3J4KHNrYik7Ci0KLV9yZWN2X2luZGljYXRlcGt0X2VuZDoKLQotCXByZWN2X2ZyYW1lLT5wa3QgPSBOVUxMOyAvKiAgcG9pbnRlcnMgdG8gTlVMTCBiZWZvcmUgcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKCkgKi8KLQotCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmVjdl9mcmFtZSk7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3JlY3Zfb3NkZXBfY18sIF9kcnZfaW5mb18sCi0JCSAicnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2EgOmFmdGVyIG5ldGlmX3J4ISEhIVxuIik7Ci0JcmV0dXJuIF9TVUNDRVNTOwotCi1fcmVjdl9pbmRpY2F0ZXBrdF9kcm9wOgotCi0JIHJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmVjdl9mcmFtZSk7Ci0JIHJldHVybiBfRkFJTDsKLX0KLQotdm9pZCBydHdfaW5pdF9yZWN2X3RpbWVyMjNhKHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCkKLXsKLQlzZXR1cF90aW1lcigmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyLAotCQkgICAgcnR3X3Jlb3JkZXJpbmdfY3RybF90aW1lb3V0X2hhbmRsZXIyM2EsCi0JCSAgICAodW5zaWduZWQgbG9uZylwcmVvcmRlcl9jdHJsKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3VzYl9pbnRmLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC91c2JfaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjgzZWZmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3VzYl9pbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9IQ0lfSU5URl9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHJlY3Zfb3NkZXAuaD4KLSNpbmNsdWRlIDx4bWl0X29zZGVwLmg+Ci0jaW5jbHVkZSA8aGFsX2ludGYuaD4KLSNpbmNsdWRlIDxydHdfdmVyc2lvbi5oPgotI2luY2x1ZGUgPG9zZGVwX2ludGYuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzLmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0KLXN0YXRpYyBpbnQgcnR3X3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKTsKLXN0YXRpYyBpbnQgcnR3X3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7Ci1zdGF0aWMgaW50IHJ0d19kcnZfaW5pdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqcHVzYl9pbnRmLAotCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKnBkaWQpOwotc3RhdGljIHZvaWQgcnR3X2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JfaW50Zik7Ci0KLSNkZWZpbmUgVVNCX1ZFTkRFUl9JRF9SRUFMVEVLCQkweDBCREEKLQotI2RlZmluZSBSVEw4NzIzQV9VU0JfSURTIFwKLQl7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oVVNCX1ZFTkRFUl9JRF9SRUFMVEVLLCAweDg3MjQsCVwKLQkgMHhmZiwgMHhmZiwgMHhmZil9LCAvKiA4NzIzQVUgMSoxICovIFwKLQl7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oVVNCX1ZFTkRFUl9JRF9SRUFMVEVLLCAweDE3MjQsCVwKLQkgMHhmZiwgMHhmZiwgMHhmZil9LCAvKiA4NzIzQVUgMSoxICovIFwKLQl7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oVVNCX1ZFTkRFUl9JRF9SRUFMVEVLLCAweDA3MjQsCVwKLQkgMHhmZiwgMHhmZiwgMHhmZil9LCAvKiA4NzIzQVUgMSoxICovCi0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBydGw4NzIzYV91c2JfaWRfdGJsW10gPSB7Ci0JUlRMODcyM0FfVVNCX0lEUwotCXt9CS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgcnRsODcyM2FfdXNiX2lkX3RibCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBydGw4NzIzYV91c2JfZHJ2ID0gewotCS5uYW1lID0gKGNoYXIgKikicnRsODcyM2F1IiwKLQkucHJvYmUgPSBydHdfZHJ2X2luaXQsCi0JLmRpc2Nvbm5lY3QgPSBydHdfZGlzY29ubmVjdCwKLQkuaWRfdGFibGUgPSBydGw4NzIzYV91c2JfaWRfdGJsLAotCS5zdXNwZW5kID0gcnR3X3N1c3BlbmQsCi0JLnJlc3VtZSA9IHJ0d19yZXN1bWUsCi0JLnJlc2V0X3Jlc3VtZSAgPSBydHdfcmVzdW1lLAotfTsKLQotc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyICp1c2JfZHJ2ID0gJnJ0bDg3MjNhX3VzYl9kcnY7Ci0KLXN0YXRpYyBpbnQgcnR3X2luaXRfaW50Zl9wcml2KHN0cnVjdCBkdm9ial9wcml2ICpkdm9iaikKLXsKLQltdXRleF9pbml0KCZkdm9iai0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IHJ0d19kZWluaXRfaW50Zl9wcml2KHN0cnVjdCBkdm9ial9wcml2ICpkdm9iaikKLXsKLQltdXRleF9kZXN0cm95KCZkdm9iai0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgc3RydWN0IGR2b2JqX3ByaXYgKnVzYl9kdm9ial9pbml0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICp1c2JfaW50ZikKLXsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqcGR2b2JqcHJpdjsKLQlzdHJ1Y3QgdXNiX2hvc3RfY29uZmlnCSAqcGhvc3RfY29uZjsKLQlzdHJ1Y3QgdXNiX2NvbmZpZ19kZXNjcmlwdG9yICpwY29uZl9kZXNjOwotCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKnBob3N0X2lmYWNlOwotCXN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKnBpZmFjZV9kZXNjOwotCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqcGVuZHBfZGVzYzsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYmQ7Ci0JaW50IGksIHN0YXR1cyA9IF9GQUlMOwotCi0JcGR2b2JqcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwZHZvYmpwcml2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZHZvYmpwcml2KQotCQlnb3RvIGV4aXQ7Ci0KLQltdXRleF9pbml0KCZwZHZvYmpwcml2LT5od19pbml0X211dGV4KTsKLQltdXRleF9pbml0KCZwZHZvYmpwcml2LT5oMmNfZndjbWRfbXV0ZXgpOwotCW11dGV4X2luaXQoJnBkdm9ianByaXYtPnNldGNoX211dGV4KTsKLQltdXRleF9pbml0KCZwZHZvYmpwcml2LT5zZXRid19tdXRleCk7Ci0KLQlwZHZvYmpwcml2LT5wdXNiaW50ZiA9IHVzYl9pbnRmOwotCXB1c2JkID0gaW50ZXJmYWNlX3RvX3VzYmRldih1c2JfaW50Zik7Ci0JcGR2b2JqcHJpdi0+cHVzYmRldiA9IHB1c2JkOwotCXVzYl9zZXRfaW50ZmRhdGEodXNiX2ludGYsIHBkdm9ianByaXYpOwotCi0JcGR2b2JqcHJpdi0+UnROdW1JblBpcGVzID0gMDsKLQlwZHZvYmpwcml2LT5SdE51bU91dFBpcGVzID0gMDsKLQotCXBob3N0X2NvbmYgPSBwdXNiZC0+YWN0Y29uZmlnOwotCXBjb25mX2Rlc2MgPSAmcGhvc3RfY29uZi0+ZGVzYzsKLQotCXBob3N0X2lmYWNlID0gJnVzYl9pbnRmLT5hbHRzZXR0aW5nWzBdOwotCXBpZmFjZV9kZXNjID0gJnBob3N0X2lmYWNlLT5kZXNjOwotCi0JcGR2b2JqcHJpdi0+TnVtSW50ZXJmYWNlcyA9IHBjb25mX2Rlc2MtPmJOdW1JbnRlcmZhY2VzOwotCXBkdm9ianByaXYtPkludGVyZmFjZU51bWJlciA9IHBpZmFjZV9kZXNjLT5iSW50ZXJmYWNlTnVtYmVyOwotCXBkdm9ianByaXYtPm5yX2VuZHBvaW50ID0gcGlmYWNlX2Rlc2MtPmJOdW1FbmRwb2ludHM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGR2b2JqcHJpdi0+bnJfZW5kcG9pbnQ7IGkrKykgewotCQlwZW5kcF9kZXNjID0gJnBob3N0X2lmYWNlLT5lbmRwb2ludFtpXS5kZXNjOwotCi0JCURCR184NzIzQSgiXG51c2JfZW5kcG9pbnRfZGVzY3JpcHRvciglZCk6XG4iLCBpKTsKLQkJREJHXzg3MjNBKCJiTGVuZ3RoID0leFxuIiwgcGVuZHBfZGVzYy0+Ykxlbmd0aCk7Ci0JCURCR184NzIzQSgiYkRlc2NyaXB0b3JUeXBlID0leFxuIiwgcGVuZHBfZGVzYy0+YkRlc2NyaXB0b3JUeXBlKTsKLQkJREJHXzg3MjNBKCJiRW5kcG9pbnRBZGRyZXNzID0leFxuIiwKLQkJCSAgcGVuZHBfZGVzYy0+YkVuZHBvaW50QWRkcmVzcyk7Ci0JCURCR184NzIzQSgid01heFBhY2tldFNpemUgPSVkXG4iLAotCQkJICBsZTE2X3RvX2NwdShwZW5kcF9kZXNjLT53TWF4UGFja2V0U2l6ZSkpOwotCQlEQkdfODcyM0EoImJJbnRlcnZhbCA9JXhcbiIsIHBlbmRwX2Rlc2MtPmJJbnRlcnZhbCk7Ci0KLQkJaWYgKHVzYl9lbmRwb2ludF9pc19idWxrX2luKHBlbmRwX2Rlc2MpKSB7Ci0JCQlEQkdfODcyM0EoInVzYl9lbmRwb2ludF9pc19idWxrX2luID0gJXhcbiIsCi0JCQkJICB1c2JfZW5kcG9pbnRfbnVtKHBlbmRwX2Rlc2MpKTsKLQkJCXBkdm9ianByaXYtPlJ0SW5QaXBlW3Bkdm9ianByaXYtPlJ0TnVtSW5QaXBlc10gPQotCQkJCXVzYl9lbmRwb2ludF9udW0ocGVuZHBfZGVzYyk7Ci0JCQlwZHZvYmpwcml2LT5SdE51bUluUGlwZXMrKzsKLQkJfSBlbHNlIGlmICh1c2JfZW5kcG9pbnRfaXNfaW50X2luKHBlbmRwX2Rlc2MpKSB7Ci0JCQlEQkdfODcyM0EoInVzYl9lbmRwb2ludF9pc19pbnRfaW4gPSAleCwgSW50ZXJ2YWwgPSAiCi0JCQkJICAiJXhcbiIsIHVzYl9lbmRwb2ludF9udW0ocGVuZHBfZGVzYyksCi0JCQkJICBwZW5kcF9kZXNjLT5iSW50ZXJ2YWwpOwotCQkJcGR2b2JqcHJpdi0+UnRJblBpcGVbcGR2b2JqcHJpdi0+UnROdW1JblBpcGVzXSA9Ci0JCQkJdXNiX2VuZHBvaW50X251bShwZW5kcF9kZXNjKTsKLQkJCXBkdm9ianByaXYtPlJ0TnVtSW5QaXBlcysrOwotCQl9IGVsc2UgaWYgKHVzYl9lbmRwb2ludF9pc19idWxrX291dChwZW5kcF9kZXNjKSkgewotCQkJREJHXzg3MjNBKCJ1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQgPSAleFxuIiwKLQkJCQkgIHVzYl9lbmRwb2ludF9udW0ocGVuZHBfZGVzYykpOwotCQkJcGR2b2JqcHJpdi0+UnRPdXRQaXBlW3Bkdm9ianByaXYtPlJ0TnVtT3V0UGlwZXNdID0KLQkJCQl1c2JfZW5kcG9pbnRfbnVtKHBlbmRwX2Rlc2MpOwotCQkJcGR2b2JqcHJpdi0+UnROdW1PdXRQaXBlcysrOwotCQl9Ci0JCXBkdm9ianByaXYtPmVwX251bVtpXSA9IHVzYl9lbmRwb2ludF9udW0ocGVuZHBfZGVzYyk7Ci0JfQotCURCR184NzIzQSgibnJfZW5kcG9pbnQgPSVkLCBpbl9udW0gPSVkLCBvdXRfbnVtID0lZFxuXG4iLAotCQkgIHBkdm9ianByaXYtPm5yX2VuZHBvaW50LCBwZHZvYmpwcml2LT5SdE51bUluUGlwZXMsCi0JCSAgcGR2b2JqcHJpdi0+UnROdW1PdXRQaXBlcyk7Ci0KLQlpZiAocHVzYmQtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKSB7Ci0JCXBkdm9ianByaXYtPmlzaGlnaHNwZWVkID0gdHJ1ZTsKLQkJREJHXzg3MjNBKCJVU0JfU1BFRURfSElHSFxuIik7Ci0JfSBlbHNlIHsKLQkJcGR2b2JqcHJpdi0+aXNoaWdoc3BlZWQgPSBmYWxzZTsKLQkJREJHXzg3MjNBKCJOT04gVVNCX1NQRUVEX0hJR0hcbiIpOwotCX0KLQotCWlmIChydHdfaW5pdF9pbnRmX3ByaXYocGR2b2JqcHJpdikgPT0gX0ZBSUwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICJDYW4ndCBJTklUIHJ0d19pbml0X2ludGZfcHJpdlxuIik7Ci0JCWdvdG8gZnJlZV9kdm9iajsKLQl9Ci0JLyogMyBtaXNjICovCi0JcnR3X3Jlc2V0X2NvbnRpbnVhbF91cmJfZXJyb3IocGR2b2JqcHJpdik7Ci0JdXNiX2dldF9kZXYocHVzYmQpOwotCXN0YXR1cyA9IF9TVUNDRVNTOwotZnJlZV9kdm9iajoKLQlpZiAoc3RhdHVzICE9IF9TVUNDRVNTICYmIHBkdm9ianByaXYpIHsKLQkJdXNiX3NldF9pbnRmZGF0YSh1c2JfaW50ZiwgTlVMTCk7Ci0JCW11dGV4X2Rlc3Ryb3koJnBkdm9ianByaXYtPmh3X2luaXRfbXV0ZXgpOwotCQltdXRleF9kZXN0cm95KCZwZHZvYmpwcml2LT5oMmNfZndjbWRfbXV0ZXgpOwotCQltdXRleF9kZXN0cm95KCZwZHZvYmpwcml2LT5zZXRjaF9tdXRleCk7Ci0JCW11dGV4X2Rlc3Ryb3koJnBkdm9ianByaXYtPnNldGJ3X211dGV4KTsKLQkJa2ZyZWUocGR2b2JqcHJpdik7Ci0JCXBkdm9ianByaXYgPSBOVUxMOwotCX0KLWV4aXQ6Ci0JcmV0dXJuIHBkdm9ianByaXY7Ci19Ci0KLXN0YXRpYyB2b2lkIHVzYl9kdm9ial9kZWluaXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKnVzYl9pbnRmKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpkdm9iaiA9IHVzYl9nZXRfaW50ZmRhdGEodXNiX2ludGYpOwotCi0JdXNiX3NldF9pbnRmZGF0YSh1c2JfaW50ZiwgTlVMTCk7Ci0JaWYgKGR2b2JqKSB7Ci0JCS8qIE1vZGlmeSBjb25kaXRpb24gZm9yIDkyRFUgRE1EUCAyMDEwLjExLjE4LCBieSBUaG9tYXMgKi8KLQkJaWYgKChkdm9iai0+TnVtSW50ZXJmYWNlcyAhPSAyICYmIGR2b2JqLT5OdW1JbnRlcmZhY2VzICE9IDMpIHx8Ci0JCSAgICAoZHZvYmotPkludGVyZmFjZU51bWJlciA9PSAxKSkgewotCQkJaWYgKGludGVyZmFjZV90b191c2JkZXYodXNiX2ludGYpLT5zdGF0ZSAhPQotCQkJICAgIFVTQl9TVEFURV9OT1RBVFRBQ0hFRCkgewotCQkJCS8qIElmIHdlIGRpZG4ndCB1bnBsdWcgdXNiIGRvbmdsZSBhbmQKLQkJCQkgKiByZW1vdmUvaW5zZXJ0IG1vZHVsZSwgZHJpdmVyIGZhaWxzIG9uCi0JCQkJICogc2l0ZXN1cnZleSBmb3IgdGhlIGZpcnN0IHRpbWUgd2hlbgotCQkJCSAqIGRldmljZSBpcyB1cCAuCi0JCQkJICogUmVzZXQgdXNiIHBvcnQgZm9yIHNpdGVzdXJ2ZXkgZmFpbCBpc3N1ZS4KLQkJCQkgKi8KLQkJCQlEQkdfODcyM0EoInVzYiBhdHRhY2hlZC4uLiwgdHJ5IHRvIHJlc2V0IHVzYiBkZXZpY2VcbiIpOwotCQkJCXVzYl9yZXNldF9kZXZpY2UoaW50ZXJmYWNlX3RvX3VzYmRldih1c2JfaW50ZikpOwotCQkJfQotCQl9Ci0JCXJ0d19kZWluaXRfaW50Zl9wcml2KGR2b2JqKTsKLQkJbXV0ZXhfZGVzdHJveSgmZHZvYmotPmh3X2luaXRfbXV0ZXgpOwotCQltdXRleF9kZXN0cm95KCZkdm9iai0+aDJjX2Z3Y21kX211dGV4KTsKLQkJbXV0ZXhfZGVzdHJveSgmZHZvYmotPnNldGNoX211dGV4KTsKLQkJbXV0ZXhfZGVzdHJveSgmZHZvYmotPnNldGJ3X211dGV4KTsKLQkJa2ZyZWUoZHZvYmopOwotCX0KLQl1c2JfcHV0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KHVzYl9pbnRmKSk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfdXNiX2ludGZfc3RvcChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICIrdXNiX2ludGZfc3RvcFxuIik7Ci0KLQkvKiBkaXNhYmxlX2h3X2ludGVycnVwdCAqLwotCWlmICghcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpIHsKLQkJLyogZGV2aWNlIHN0aWxsIGV4aXN0cywgc28gZHJpdmVyIGNhbiBkbyBpL28gb3BlcmF0aW9uCi0JCSAqIFRPRE86Ci0JCSAqLwotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICJTdXJwcmlzZVJlbW92ZWQgPT0gZmFsc2VcbiIpOwotCX0KLQotCS8qIGNhbmNlbCBpbiBpcnAgKi8KLQlydGw4NzIzYXVfaW5pcnBfZGVpbml0KHBhZGFwdGVyKTsKLQotCS8qIGNhbmNlbCBvdXQgaXJwICovCi0JcnRsODcyM2F1X3dyaXRlX3BvcnRfY2FuY2VsKHBhZGFwdGVyKTsKLQotCS8qIHRvZG86Y2FuY2VsIG90aGVyIGlycHMgKi8KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiLXVzYl9pbnRmX3N0b3BcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBydHdfZGV2X3VubG9hZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBzdWJtaXRfY3R4ICpwYWNrX3R4X29wcyA9ICZwYWRhcHRlci0+eG1pdHByaXYuYWNrX3R4X29wczsKLQotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICIrcnR3X2Rldl91bmxvYWRcbiIpOwotCi0JaWYgKHBhZGFwdGVyLT5idXApIHsKLQkJREJHXzg3MjNBKCI9PT0+IHJ0d19kZXZfdW5sb2FkXG4iKTsKLQotCQlwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPSB0cnVlOwotCQlpZiAocGFkYXB0ZXItPnhtaXRwcml2LmFja190eCkKLQkJCXJ0dzIzYV9zY3R4X2RvbmVfZXJyKCZwYWNrX3R4X29wcywKLQkJCQkJICAgICBSVFdfU0NUWF9ET05FX0RSVl9TVE9QKTsKLQotCQkvKiBzMy4gKi8KLQkJcnRsODcyM2FfdXNiX2ludGZfc3RvcChwYWRhcHRlcik7Ci0KLQkJLyogczQuICovCi0JCWZsdXNoX3dvcmtxdWV1ZShwYWRhcHRlci0+Y21kcHJpdi53cSk7Ci0KLQkJLyogczUuICovCi0JCWlmICghcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpIHsKLQkJCXJ0bDg3MjNhdV9oYWxfZGVpbml0KHBhZGFwdGVyKTsKLQkJCXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID0gdHJ1ZTsKLQkJfQotCQlwYWRhcHRlci0+YnVwID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJCSAicjg3MXhfZGV2X3VubG9hZCgpOnBhZGFwdGVyLT5idXAgPT0gZmFsc2VcbiIpOwotCX0KLQlEQkdfODcyM0EoIjw9PT0gcnR3X2Rldl91bmxvYWRcbiIpOwotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICItcnR3X2Rldl91bmxvYWRcbiIpOwotfQotCi1zdGF0aWMgaW50IHJ0d19zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICpwdXNiX2ludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpkdm9iaiA9IHVzYl9nZXRfaW50ZmRhdGEocHVzYl9pbnRmKTsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gZHZvYmotPmlmMTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0JaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF90aW1lID0gamlmZmllczsKLQotCURCR184NzIzQSgiPT0+ICVzICglczolZClcbiIsIF9fZnVuY19fLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQpOwotCi0JaWYgKCghcGFkYXB0ZXItPmJ1cCkgfHwgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkgfHwKLQkgICAgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSkgewotCQlEQkdfODcyM0EoInBhZGFwdGVyLT5idXAgPSVkIGJEcml2ZXJTdG9wcGVkID0lZCBiU3VycHJpc2VSZW1vdmVkID0gJWRcbiIsCi0JCQkgIHBhZGFwdGVyLT5idXAsIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCwKLQkJCSAgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCXB3cnByaXYtPmJJblN1c3BlbmQgPSB0cnVlOwotCXJ0d19jYW5jZWxfYWxsX3RpbWVyMjNhKHBhZGFwdGVyKTsKLQlMZWF2ZUFsbFBvd2VyU2F2ZU1vZGUyM2EocGFkYXB0ZXIpOwotCi0JZG93bigmcHdycHJpdi0+bG9jayk7Ci0JLyogcGFkYXB0ZXItPm5ldF9jbG9zZWQgPSB0cnVlOyAqLwotCS8qIHMxLiAqLwotCWlmIChwbmV0ZGV2KSB7Ci0JCW5ldGlmX2NhcnJpZXJfb2ZmKHBuZXRkZXYpOwotCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMocG5ldGRldik7Ci0JfQotCi0JLyogczIuICovCi0JcnR3X2Rpc2Fzc29jX2NtZDIzYShwYWRhcHRlciwgMCwgZmFsc2UpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpICYmCi0JICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQlEQkdfODcyM0EoIiVzOiVkICVzKCVwTSksIGxlbmd0aDolZCBhc3NvY19zc2lkLmxlbmd0aDolZFxuIiwKLQkJCSAgX19mdW5jX18sIF9fTElORV9fLAotCQkJICBwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuU3NpZC5zc2lkLAotCQkJICBwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuTWFjQWRkcmVzcywKLQkJCSAgcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLlNzaWQuc3NpZF9sZW4sCi0JCQkgIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkX2xlbik7Ci0KLQkJcnR3X3NldF9yb2FtaW5nKHBhZGFwdGVyLCAxKTsKLQl9Ci0JLyogczItMi4gIGluZGljYXRlIGRpc2Nvbm5lY3QgdG8gb3MgKi8KLQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShwYWRhcHRlcik7Ci0JLyogczItMy4gKi8KLQlydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2EocGFkYXB0ZXIsIDEpOwotCS8qIHMyLTQuICovCi0JcnR3X2ZyZWVfbmV0d29ya19xdWV1ZTIzYShwYWRhcHRlcik7Ci0KLQlydHdfZGV2X3VubG9hZChwYWRhcHRlcik7Ci0JdXAoJnB3cnByaXYtPmxvY2spOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSkKLQkJcnR3X2NmZzgwMjExX2luZGljYXRlX3NjYW5fZG9uZSgKLQkJCXdkZXZfdG9fcHJpdihwYWRhcHRlci0+cnR3X3dkZXYpLCB0cnVlKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpKQotCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShwYWRhcHRlcik7Ci0KLWV4aXQ6Ci0JREJHXzg3MjNBKCI8PT09ICAlcyByZXR1cm4gJWQuLi4uLi4uLi4uLi4uLiBpbiAlZG1zXG4iLCBfX2Z1bmNfXywKLQkJICByZXQsIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0X3RpbWUpKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqcHVzYl9pbnRmKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpkdm9iaiA9IHVzYl9nZXRfaW50ZmRhdGEocHVzYl9pbnRmKTsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gZHZvYmotPmlmMTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldjsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gTlVMTDsKLQlpbnQgcmV0ID0gLTE7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF90aW1lID0gamlmZmllczsKLQotCURCR184NzIzQSgiPT0+ICVzICglczolZClcbiIsIF9fZnVuY19fLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQpOwotCi0JaWYgKCFwYWRhcHRlcikKLQkJZ290byBleGl0OwotCXBuZXRkZXYgPSBwYWRhcHRlci0+cG5ldGRldjsKLQlwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQotCWRvd24oJnB3cnByaXYtPmxvY2spOwotCXJ0d19yZXNldF9kcnZfc3cyM2EocGFkYXB0ZXIpOwotCXB3cnByaXYtPmJrZWVwZndhbGl2ZSA9IGZhbHNlOwotCi0JREJHXzg3MjNBKCJia2VlcGZ3YWxpdmUoJXgpXG4iLCBwd3Jwcml2LT5ia2VlcGZ3YWxpdmUpOwotCWlmIChwbV9uZXRkZXZfb3BlbjIzYShwbmV0ZGV2LCB0cnVlKSAhPSAwKSB7Ci0JCXVwKCZwd3Jwcml2LT5sb2NrKTsKLQkJZ290byBleGl0OwotCX0KLQotCW5ldGlmX2RldmljZV9hdHRhY2gocG5ldGRldik7Ci0JbmV0aWZfY2Fycmllcl9vbihwbmV0ZGV2KTsKLQotCXVwKCZwd3Jwcml2LT5sb2NrKTsKLQotCWlmIChwYWRhcHRlci0+cGlkWzFdICE9IDApIHsKLQkJREJHXzg3MjNBKCJwaWRbMV06JWRcbiIsIHBhZGFwdGVyLT5waWRbMV0pOwotCQlraWxsX3BpZChmaW5kX3ZwaWQocGFkYXB0ZXItPnBpZFsxXSksIFNJR1VTUjIsIDEpOwotCX0KLQotCXJ0dzIzYV9yb2FtaW5nKHBhZGFwdGVyLCBOVUxMKTsKLQotCXJldCA9IDA7Ci1leGl0OgotCWlmIChwd3Jwcml2KQotCQlwd3Jwcml2LT5iSW5TdXNwZW5kID0gZmFsc2U7Ci0JREJHXzg3MjNBKCI8PT09ICAlcyByZXR1cm4gJWQuLi4uLi4uLi4uLi4uLiBpbiAlZG1zXG4iLCBfX2Z1bmNfXywKLQkJICByZXQsIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0X3RpbWUpKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBkcnZfaW5pdCgpIC0gYSBkZXZpY2UgcG90ZW50aWFsbHkgZm9yIHVzCi0gKgotICogbm90ZXM6IGRydl9pbml0KCkgaXMgY2FsbGVkIHdoZW4gdGhlIGJ1cyBkcml2ZXIgaGFzIGxvY2F0ZWQgYSBjYXJkCi0gKiBmb3IgdXMgdG8gc3VwcG9ydC4KLSAqICAgICAgICBXZSBhY2NlcHQgdGhlIG5ldyBkZXZpY2UgYnkgcmV0dXJuaW5nIDAuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnJ0d191c2JfaWYxX2luaXQoc3RydWN0IGR2b2JqX3ByaXYgKmR2b2JqLAotCQkJCQkgICAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JfaW50ZiwKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICpwZGlkKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBOVUxMOwotCXN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2ID0gTlVMTDsKLQlpbnQgc3RhdHVzID0gX0ZBSUw7Ci0KLQlwbmV0ZGV2ID0gcnR3X2luaXRfbmV0ZGV2MjNhKHBhZGFwdGVyKTsKLQlpZiAoIXBuZXRkZXYpCi0JCWdvdG8gZnJlZV9hZGFwdGVyOwotCXBhZGFwdGVyID0gbmV0ZGV2X3ByaXYocG5ldGRldik7Ci0KLQlwYWRhcHRlci0+ZHZvYmogPSBkdm9iajsKLQlwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPSB0cnVlOwotCWR2b2JqLT5pZjEgPSBwYWRhcHRlcjsKLQlkdm9iai0+cGFkYXB0ZXJzW2R2b2JqLT5pZmFjZV9udW1zKytdID0gcGFkYXB0ZXI7Ci0JcGFkYXB0ZXItPmlmYWNlX2lkID0gSUZBQ0VfSUQwOwotCi0JcnRsODcyM2F1X3NldF9od190eXBlKHBhZGFwdGVyKTsKLQotCVNFVF9ORVRERVZfREVWKHBuZXRkZXYsIGR2b2JqX3RvX2Rldihkdm9iaikpOwotCi0JaWYgKHJ0d193ZGV2X2FsbG9jKHBhZGFwdGVyLCBkdm9ial90b19kZXYoZHZvYmopKSkKLQkJZ290byBmcmVlX2FkYXB0ZXI7Ci0KLQkvKiBzdGVwIDIuIGFsbG9jYXRlIEhhbERhdGEgKi8KLQlwYWRhcHRlci0+SGFsRGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoYWxfZGF0YV84NzIzYSksIEdGUF9LRVJORUwpOwotCWlmICghcGFkYXB0ZXItPkhhbERhdGEpCi0JCWdvdG8gZnJlZV93ZGV2OwotCi0JLyogc3RlcCByZWFkX2NoaXBfdmVyc2lvbiAqLwotCXJ0bDg3MjNhX3JlYWRfY2hpcF92ZXJzaW9uKHBhZGFwdGVyKTsKLQotCS8qIHN0ZXAgdXNiIGVuZHBvaW50IG1hcHBpbmcgKi8KLQlpZiAoIXJ0bDg3MjNhdV9jaGlwX2NvbmZpZ3VyZShwYWRhcHRlcikpCi0JCWdvdG8gZnJlZV9oYWxfZGF0YTsKLQotCS8qIHN0ZXAgcmVhZCBlZnVzZS9lZXByb20gZGF0YSBhbmQgZ2V0IG1hY19hZGRyICovCi0JcnRsODcyM2FfcmVhZF9hZGFwdGVyX2luZm8ocGFkYXB0ZXIpOwotCi0JLyogc3RlcCA1LiAqLwotCWlmIChydHdfaW5pdF9kcnZfc3cyM2EocGFkYXB0ZXIpID09IF9GQUlMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkluaXRpYWxpemUgZHJpdmVyIHNvZnR3YXJlIHJlc291cmNlIEZhaWxlZCFcbiIpOwotCQlnb3RvIGZyZWVfaGFsX2RhdGE7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1BNCi0JaWYgKHBhZGFwdGVyLT5wd3JjdHJscHJpdi5iU3VwcG9ydFJlbW90ZVdha2V1cCkgewotCQlkdm9iai0+cHVzYmRldi0+ZG9fcmVtb3RlX3dha2V1cCA9IDE7Ci0JCXB1c2JfaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDE7Ci0JCWRldmljZV9pbml0X3dha2V1cCgmcHVzYl9pbnRmLT5kZXYsIDEpOwotCQlEQkdfODcyM0EoIlxuICBwYWRhcHRlci0+cHdyY3RybHByaXYuYlN1cHBvcnRSZW1vdGVXYWtldXB+fn5+fn5cbiIpOwotCQlEQkdfODcyM0EoIlxuICBwYWRhcHRlci0+cHdyY3RybHByaXYuYlN1cHBvcnRSZW1vdGVXYWtldXB+fn5bJWRdfn5+XG4iLAotCQkJICBkZXZpY2VfbWF5X3dha2V1cCgmcHVzYl9pbnRmLT5kZXYpKTsKLQl9Ci0jZW5kaWYKLQkvKiAyMDEyLTA3LTExIE1vdmUgaGVyZSB0byBwcmV2ZW50IHRoZSA4NzIzQVMtVkFVIEJUCi0JICogYXV0byBzdXNwZW5kIGluZmx1ZW5jZQotCSAqLwotCWlmICh1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UocHVzYl9pbnRmKSA8IDApCi0JCURCR184NzIzQSgiY2FuJ3QgZ2V0IGF1dG9wbTpcbiIpOwotI2lmZGVmCUNPTkZJR184NzIzQVVfQlRfQ09FWElTVAotCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5hdXRvcG1fY250ID0gMTsKLSNlbmRpZgotCi0JLyogSWYgdGhlIGVlcHJvbSBtYWMgYWRkcmVzcyBpcyBjb3JydXB0ZWQsIGFzc2lnbiBhIHJhbmRvbSBhZGRyZXNzICovCi0JaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHBhZGFwdGVyLT5lZXByb21wcml2Lm1hY19hZGRyKSB8fAotCSAgICBpc196ZXJvX2V0aGVyX2FkZHIocGFkYXB0ZXItPmVlcHJvbXByaXYubWFjX2FkZHIpKQotCQlldGhfcmFuZG9tX2FkZHIocGFkYXB0ZXItPmVlcHJvbXByaXYubWFjX2FkZHIpOwotCi0JREJHXzg3MjNBKCJiRHJpdmVyU3RvcHBlZDolZCwgYlN1cnByaXNlUmVtb3ZlZDolZCwgYnVwOiVkLCBod19pbml0X2NvbXBsZXRlZDolZFxuIiwKLQkJICBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQsIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkLAotCQkgIHBhZGFwdGVyLT5idXAsIHBhZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZAotCSk7Ci0Jc3RhdHVzID0gX1NVQ0NFU1M7Ci0KLWZyZWVfaGFsX2RhdGE6Ci0JaWYgKHN0YXR1cyAhPSBfU1VDQ0VTUykKLQkJa2ZyZWUocGFkYXB0ZXItPkhhbERhdGEpOwotZnJlZV93ZGV2OgotCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MpIHsKLQkJcnR3X3dkZXZfdW5yZWdpc3RlcihwYWRhcHRlci0+cnR3X3dkZXYpOwotCQlydHdfd2Rldl9mcmVlKHBhZGFwdGVyLT5ydHdfd2Rldik7Ci0JfQotZnJlZV9hZGFwdGVyOgotCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MpIHsKLQkJaWYgKHBuZXRkZXYpCi0JCQlmcmVlX25ldGRldihwbmV0ZGV2KTsKLQkJcGFkYXB0ZXIgPSBOVUxMOwotCX0KLQlyZXR1cm4gcGFkYXB0ZXI7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0d191c2JfaWYxX2RlaW5pdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmlmMSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiA9IGlmMS0+cG5ldGRldjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmaWYxLT5tbG1lcHJpdjsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpCi0JCXJ0d19kaXNhc3NvY19jbWQyM2EoaWYxLCAwLCBmYWxzZSk7Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlmcmVlX21sbWVfYXBfaW5mbzIzYShpZjEpOwotI2VuZGlmCi0KLQlpZiAocG5ldGRldikKLQkJdW5yZWdpc3Rlcl9uZXRkZXYocG5ldGRldik7IC8qIHdpbGwgY2FsbCBuZXRkZXZfY2xvc2UoKSAqLwotCi0JcnR3X2NhbmNlbF9hbGxfdGltZXIyM2EoaWYxKTsKLQotCXJ0d19kZXZfdW5sb2FkKGlmMSk7Ci0KLQlEQkdfODcyM0EoIityODcxeHVfZGV2X3JlbW92ZSwgaHdfaW5pdF9jb21wbGV0ZWQgPSVkXG4iLAotCQkgIGlmMS0+aHdfaW5pdF9jb21wbGV0ZWQpOwotCi0JaWYgKGlmMS0+cnR3X3dkZXYpIHsKLQkJcnR3X3dkZXZfdW5yZWdpc3RlcihpZjEtPnJ0d193ZGV2KTsKLQkJcnR3X3dkZXZfZnJlZShpZjEtPnJ0d193ZGV2KTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLQlpZiAoMSA9PSBpZjEtPnB3cmN0cmxwcml2LmF1dG9wbV9jbnQpIHsKLQkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGFkYXB0ZXJfdG9fZHZvYmooaWYxKS0+cHVzYmludGYpOwotCQlpZjEtPnB3cmN0cmxwcml2LmF1dG9wbV9jbnQtLTsKLQl9Ci0jZW5kaWYKLQotCXJ0d19mcmVlX2Rydl9zdzIzYShpZjEpOwotCi0JaWYgKHBuZXRkZXYpCi0JCWZyZWVfbmV0ZGV2KHBuZXRkZXYpOwotfQotCi1zdGF0aWMgaW50IHJ0d19kcnZfaW5pdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqcHVzYl9pbnRmLAotCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKnBkaWQpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICppZjEgPSBOVUxMOwotCXN0cnVjdCBkdm9ial9wcml2ICpkdm9iajsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKLQlpbnQgc3RhdHVzID0gX0ZBSUw7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiK3J0d19kcnZfaW5pdFxuIik7Ci0KLQkvKiBJbml0aWFsaXplIGR2b2JqX3ByaXYgKi8KLQlkdm9iaiA9IHVzYl9kdm9ial9pbml0KHB1c2JfaW50Zik7Ci0JaWYgKCFkdm9iaikgewotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICJpbml0aWFsaXplIGRldmljZSBvYmplY3QgcHJpdiBGYWlsZWQhXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQotCXVkZXYgPSBkdm9iai0+cHVzYmRldjsKLQlkZXZfd2FybigmdWRldi0+ZGV2LCAiV0FSTklORzogVGhlIHJ0bDg3MjNhdSBkcml2ZXIgaXMgZGVwcmVjYXRlZCEiKTsKLQlkZXZfd2FybigmdWRldi0+ZGV2LCAiUGxlYXNlIHVzZSB0aGUgcnRsOHh4eHUgZHJpdmVyIGZvciB0aGlzIGRldmljZSEiKTsKLQotCWlmMSA9IHJ0d191c2JfaWYxX2luaXQoZHZvYmosIHB1c2JfaW50ZiwgcGRpZCk7Ci0JaWYgKCFpZjEpIHsKLQkJREJHXzg3MjNBKCJydHdfaW5pdF9wcmltYXJ5X2FkYXB0ZXIgRmFpbGVkIVxuIik7Ci0JCWdvdG8gZnJlZV9kdm9iajsKLQl9Ci0KLQkvKiBkZXZfYWxsb2NfbmFtZSAmJiByZWdpc3Rlcl9uZXRkZXYgKi8KLQlzdGF0dXMgPSBydHdfZHJ2X3JlZ2lzdGVyX25ldGRldihpZjEpOwotCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MpCi0JCWdvdG8gZnJlZV9pZjE7Ci0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJICItODcxeF9kcnYgLSBkcnZfaW5pdCwgc3VjY2VzcyFcbiIpOwotCi0Jc3RhdHVzID0gX1NVQ0NFU1M7Ci0KLWZyZWVfaWYxOgotCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MgJiYgaWYxKQotCQlydHdfdXNiX2lmMV9kZWluaXQoaWYxKTsKLWZyZWVfZHZvYmo6Ci0JaWYgKHN0YXR1cyAhPSBfU1VDQ0VTUykKLQkJdXNiX2R2b2JqX2RlaW5pdChwdXNiX2ludGYpOwotZXhpdDoKLQlyZXR1cm4gc3RhdHVzID09IF9TVUNDRVNTID8gMCA6IC1FTk9ERVY7Ci19Ci0KLS8qIGRldl9yZW1vdmUoKSAtIG91ciBkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZCAqLwotc3RhdGljIHZvaWQgcnR3X2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JfaW50ZikKLXsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmo7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXY7Ci0KLQlkdm9iaiA9IHVzYl9nZXRfaW50ZmRhdGEocHVzYl9pbnRmKTsKLQlpZiAoIWR2b2JqKQotCQlyZXR1cm47Ci0KLQlwYWRhcHRlciA9IGR2b2JqLT5pZjE7Ci0JcG5ldGRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCXBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQl1c2Jfc2V0X2ludGZkYXRhKHB1c2JfaW50ZiwgTlVMTCk7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiK2Rldl9yZW1vdmUoKVxuIik7Ci0KLQlydHdfcG1fc2V0X2lwczIzYShwYWRhcHRlciwgSVBTX05PTkUpOwotCXJ0d19wbV9zZXRfbHBzMjNhKHBhZGFwdGVyLCBQU19NT0RFX0FDVElWRSk7Ci0KLQlMZWF2ZUFsbFBvd2VyU2F2ZU1vZGUyM2EocGFkYXB0ZXIpOwotCi0JcnR3X3VzYl9pZjFfZGVpbml0KHBhZGFwdGVyKTsKLQotCXVzYl9kdm9ial9kZWluaXQocHVzYl9pbnRmKTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICItZGV2X3JlbW92ZSgpXG4iKTsKLQlEQkdfODcyM0EoIi1yODcxeHVfZGV2X3JlbW92ZSwgZG9uZVxuIik7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJ0d19kcnZfZW50cnkodm9pZCkKLXsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiK3J0d19kcnZfZW50cnlcbiIpOwotCXJldHVybiB1c2JfcmVnaXN0ZXIodXNiX2Rydik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBydHdfZHJ2X2hhbHQodm9pZCkKLXsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiK3J0d19kcnZfaGFsdFxuIik7Ci0JREJHXzg3MjNBKCIrcnR3X2Rydl9oYWx0XG4iKTsKLQotCXVzYl9kZXJlZ2lzdGVyKHVzYl9kcnYpOwotCi0JREJHXzg3MjNBKCItcnR3X2Rydl9oYWx0XG4iKTsKLX0KLQotbW9kdWxlX2luaXQocnR3X2Rydl9lbnRyeSk7Ci1tb2R1bGVfZXhpdChydHdfZHJ2X2hhbHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvdXNiX29wc19saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvdXNiX29wc19saW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjRhNTA2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3VzYl9vcHNfbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1VTQl9PUFNfTElOVVhfQ18KLQotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLSNpbmNsdWRlIDxydHdfc3Jlc2V0Lmg+Ci0KLXZvaWQgcnRsODcyM2F1X3JlYWRfcG9ydF9jYW5jZWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmOwotCWludCBpOwotCi0JcHJlY3ZidWYgPSAoc3RydWN0IHJlY3ZfYnVmICopcGFkYXB0ZXItPnJlY3Zwcml2LnByZWN2X2J1ZjsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCXBhZGFwdGVyLT5iUmVhZFBvcnRDYW5jZWwgPSB0cnVlOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX1JFQ1ZCVUZGIDsgaSsrKSB7Ci0JCWlmIChwcmVjdmJ1Zi0+cHVyYikKLQkJCXVzYl9raWxsX3VyYihwcmVjdmJ1Zi0+cHVyYik7Ci0JCXByZWN2YnVmKys7Ci0JfQotCXVzYl9raWxsX3VyYihwYWRhcHRlci0+cmVjdnByaXYuaW50X2luX3VyYik7Ci19Ci0KLXN0YXRpYyB2b2lkIHVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnB1cmIpCi17Ci0Jc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZiA9IChzdHJ1Y3QgeG1pdF9idWYgKilwdXJiLT5jb250ZXh0OwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBweG1pdGJ1Zi0+cGFkYXB0ZXI7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBoYWxkYXRhOwotCXVuc2lnbmVkIGxvbmcgaXJxTDsKLQotCXN3aXRjaCAocHhtaXRidWYtPmZsYWdzKSB7Ci0JY2FzZSBISUdIX1FVRVVFX0lOWDoKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQkJcnR3X2Noa19oaV9xdWV1ZV9jbWQyM2EocGFkYXB0ZXIpOwotI2VuZGlmCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fCBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwKLQkgICAgcGFkYXB0ZXItPmJXcml0ZVBvcnRDYW5jZWwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkgInVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlOmJEcml2ZXJTdG9wcGVkKCVkKSBPUiBiU3VycHJpc2VSZW1vdmVkKCVkKVxuIiwKLQkJCSBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQsIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKTsKLQkJREJHXzg3MjNBKCIlcygpOiBUWCBXYXJuaW5nISBiRHJpdmVyU3RvcHBlZCglZCkgT1IgIgotCQkJICAiYlN1cnByaXNlUmVtb3ZlZCglZCkgYldyaXRlUG9ydENhbmNlbCglZCkgIgotCQkJICAicHhtaXRidWYtPmV4dF90YWcoJXgpXG4iLCBfX2Z1bmNfXywKLQkJCSAgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkLCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCwKLQkJCSAgcGFkYXB0ZXItPmJSZWFkUG9ydENhbmNlbCwgcHhtaXRidWYtPmV4dF90YWcpOwotCi0JCWdvdG8gY2hlY2tfY29tcGxldGlvbjsKLQl9Ci0KLQlpZiAocHVyYi0+c3RhdHVzKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJICJ1c2Jfd3JpdGVfcG9ydDIzYV9jb21wbGV0ZSA6IHB1cmItPnN0YXR1cyglZCkgIT0gMFxuIiwKLQkJCSBwdXJiLT5zdGF0dXMpOwotCQlEQkdfODcyM0EoIiMjIz0+IHVyYl93cml0ZV9wb3J0X2NvbXBsZXRlIHN0YXR1cyglZClcbiIsCi0JCQkgIHB1cmItPnN0YXR1cyk7Ci0JCWlmIChwdXJiLT5zdGF0dXMgPT0gLUVQSVBFIHx8IHB1cmItPnN0YXR1cyA9PSAtRVBST1RPKSB7Ci0JCX0gZWxzZSBpZiAocHVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJ1c2Jfd3JpdGVfcG9ydDIzYV9jb21wbGV0ZTogRUlOUFJPR0VTU1xuIik7Ci0JCQlnb3RvIGNoZWNrX2NvbXBsZXRpb247Ci0JCX0gZWxzZSBpZiAocHVyYi0+c3RhdHVzID09IC1FTk9FTlQpIHsKLQkJCURCR184NzIzQSgiJXM6IC1FTk9FTlRcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gY2hlY2tfY29tcGxldGlvbjsKLQkJfSBlbHNlIGlmIChwdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQpIHsKLQkJCURCR184NzIzQSgiJXM6IC1FQ09OTlJFU0VUXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGNoZWNrX2NvbXBsZXRpb247Ci0JCX0gZWxzZSBpZiAocHVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJCSAidXNiX3dyaXRlX3BvcnQyM2FfY29tcGxldGU6IEVTSFVURE9XTlxuIik7Ci0JCQlwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPSB0cnVlOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJ1c2Jfd3JpdGVfcG9ydDIzYV9jb21wbGV0ZTpiRHJpdmVyU3RvcHBlZCA9IHRydWVcbiIpOwotCQkJZ290byBjaGVja19jb21wbGV0aW9uOwotCQl9IGVsc2UgewotCQkJcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPSB0cnVlOwotCQkJREJHXzg3MjNBKCJiU3VycHJpc2VSZW1vdmVkID0gdHJ1ZVxuIik7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgInVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlOmJTdXJwcmlzZVJlbW92ZWQgPSB0cnVlXG4iKTsKLQkJCWdvdG8gY2hlY2tfY29tcGxldGlvbjsKLQkJfQotCX0KLQlwaGFsZGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcGhhbGRhdGEtPnNyZXN0cHJpdi5sYXN0X3R4X2NvbXBsZXRlX3RpbWUgPSBqaWZmaWVzOwotCi1jaGVja19jb21wbGV0aW9uOgotCXNwaW5fbG9ja19pcnFzYXZlKCZweG1pdHByaXYtPmxvY2tfc2N0eCwgaXJxTCk7Ci0JcnR3MjNhX3NjdHhfZG9uZV9lcnIoJnB4bWl0YnVmLT5zY3R4LAotCQkJICAgICBwdXJiLT5zdGF0dXMgPyBSVFdfU0NUWF9ET05FX1dSSVRFX1BPUlRfRVJSIDoKLQkJCSAgICAgUlRXX1NDVFhfRE9ORV9TVUNDRVNTKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZweG1pdHByaXYtPmxvY2tfc2N0eCwgaXJxTCk7Ci0KLQlydHdfZnJlZV94bWl0YnVmMjNhKHB4bWl0cHJpdiwgcHhtaXRidWYpOwotCi0JdGFza2xldF9oaV9zY2hlZHVsZSgmcHhtaXRwcml2LT54bWl0X3Rhc2tsZXQpOwotfQotCi1pbnQgcnRsODcyM2F1X3dyaXRlX3BvcnQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIGFkZHIsIHUzMiBjbnQsCi0JCQkgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZikKLXsKLQlzdHJ1Y3QgdXJiICpwdXJiID0gTlVMTDsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqcGR2b2JqID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZTsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYmQgPSBwZHZvYmotPnB1c2JkZXY7Ci0JdW5zaWduZWQgbG9uZyBpcnFMOwotCXVuc2lnbmVkIGludCBwaXBlLCBlcF9udW07Ci0JaW50IHN0YXR1czsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywgIit1c2Jfd3JpdGVfcG9ydDIzYVxuIik7Ci0KLQlpZiAocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJICIlczoocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSEhIVxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCXJ0dzIzYV9zY3R4X2RvbmVfZXJyKCZweG1pdGJ1Zi0+c2N0eCwgUlRXX1NDVFhfRE9ORV9UWF9ERU5ZKTsKLQkJZ290byBleGl0OwotCX0KLQotCXB4bWl0ZnJhbWUgPSAoc3RydWN0IHhtaXRfZnJhbWUgKilweG1pdGJ1Zi0+cHJpdl9kYXRhOwotCXNwaW5fbG9ja19pcnFzYXZlKCZweG1pdHByaXYtPmxvY2ssIGlycUwpOwotCi0Jc3dpdGNoIChhZGRyKSB7Ci0JY2FzZSBWT19RVUVVRV9JTlg6Ci0JCXB4bWl0YnVmLT5mbGFncyA9IFZPX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSBWSV9RVUVVRV9JTlg6Ci0JCXB4bWl0YnVmLT5mbGFncyA9IFZJX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSBCRV9RVUVVRV9JTlg6Ci0JCXB4bWl0YnVmLT5mbGFncyA9IEJFX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSBCS19RVUVVRV9JTlg6Ci0JCXB4bWl0YnVmLT5mbGFncyA9IEJLX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSBISUdIX1FVRVVFX0lOWDoKLQkJcHhtaXRidWYtPmZsYWdzID0gSElHSF9RVUVVRV9JTlg7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXB4bWl0YnVmLT5mbGFncyA9IE1HVF9RVUVVRV9JTlg7Ci0JCWJyZWFrOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnB4bWl0cHJpdi0+bG9jaywgaXJxTCk7Ci0KLQlwdXJiID0gcHhtaXRidWYtPnB4bWl0X3VyYlswXTsKLQotCS8qIHRyYW5zbGF0ZSBETUEgRklGTyBhZGRyIHRvIHBpcGVoYW5kbGUgKi8KLQllcF9udW0gPSBwZHZvYmotPlF1ZXVlMlBpcGVbYWRkcl07Ci0JcGlwZSA9IHVzYl9zbmRidWxrcGlwZShwdXNiZCwgZXBfbnVtKTsKLQotCXVzYl9maWxsX2J1bGtfdXJiKHB1cmIsIHB1c2JkLCBwaXBlLAotCQkJICBweG1pdGZyYW1lLT5idWZfYWRkciwgLyogIHB4bWl0YnVmLT5wYnVmICovCi0JCQkgIGNudCwgdXNiX3dyaXRlX3BvcnQyM2FfY29tcGxldGUsCi0JCQkgIHB4bWl0YnVmKTsvKiBjb250ZXh0IGlzIHB4bWl0YnVmICovCi0KLQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXN0YXR1cykgewotCQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBoYWxkYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQkJcGhhbGRhdGEtPnNyZXN0cHJpdi5sYXN0X3R4X3RpbWUgPSBqaWZmaWVzOwotCX0gZWxzZSB7Ci0JCXJ0dzIzYV9zY3R4X2RvbmVfZXJyKCZweG1pdGJ1Zi0+c2N0eCwKLQkJCQkgICAgIFJUV19TQ1RYX0RPTkVfV1JJVEVfUE9SVF9FUlIpOwotCQlEQkdfODcyM0EoInVzYl93cml0ZV9wb3J0MjNhLCBzdGF0dXMgPSVkXG4iLCBzdGF0dXMpOwotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCSAidXNiX3dyaXRlX3BvcnQyM2EoKTogdXNiX3N1Ym1pdF91cmIsIHN0YXR1cyA9JXhcbiIsCi0JCQkgc3RhdHVzKTsKLQotCQlzd2l0Y2ggKHN0YXR1cykgewotCQljYXNlIC1FTk9ERVY6Ci0JCQlwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlnb3RvIGV4aXQ7Ci0JfQotCXJldCA9IF9TVUNDRVNTOwotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLCAiLXVzYl93cml0ZV9wb3J0MjNhXG4iKTsKLQotZXhpdDoKLQlpZiAocmV0ICE9IF9TVUNDRVNTKQotCQlydHdfZnJlZV94bWl0YnVmMjNhKHB4bWl0cHJpdiwgcHhtaXRidWYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBydGw4NzIzYXVfd3JpdGVfcG9ydF9jYW5jZWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmOwotCWludCBqOwotCi0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JcGFkYXB0ZXItPmJXcml0ZVBvcnRDYW5jZWwgPSB0cnVlOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShweG1pdGJ1ZiwgJnBhZGFwdGVyLT54bWl0cHJpdi54bWl0YnVmX2xpc3QsCi0JCQkgICAgbGlzdDIpIHsKLQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgewotCQkJaWYgKHB4bWl0YnVmLT5weG1pdF91cmJbal0pCi0JCQkJdXNiX2tpbGxfdXJiKHB4bWl0YnVmLT5weG1pdF91cmJbal0pOwotCQl9Ci0JfQotCWxpc3RfZm9yX2VhY2hfZW50cnkocHhtaXRidWYsICZwYWRhcHRlci0+eG1pdHByaXYueG1pdGV4dGJ1Zl9saXN0LAotCQkJICAgIGxpc3QyKSB7Ci0JCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKLQkJCWlmIChweG1pdGJ1Zi0+cHhtaXRfdXJiW2pdKQotCQkJCXVzYl9raWxsX3VyYihweG1pdGJ1Zi0+cHhtaXRfdXJiW2pdKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3htaXRfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3htaXRfbGludXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiZTcyYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC94bWl0X2xpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9YTUlUX09TREVQX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8d2lmaS5oPgotI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KLSNpbmNsdWRlIDx4bWl0X29zZGVwLmg+Ci0jaW5jbHVkZSA8b3NkZXBfaW50Zi5oPgotCi1pbnQgcnR3X29zX3htaXRfcmVzb3VyY2VfYWxsb2MyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgICBzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmLCB1MzIgYWxsb2Nfc3opCi17Ci0JaW50IGk7Ci0KLQlweG1pdGJ1Zi0+cGFsbG9jYXRlZF9idWYgPSBremFsbG9jKGFsbG9jX3N6LCBHRlBfS0VSTkVMKTsKLQlpZiAocHhtaXRidWYtPnBhbGxvY2F0ZWRfYnVmID09IE5VTEwpCi0JCXJldHVybiBfRkFJTDsKLQotCXB4bWl0YnVmLT5wYnVmID0gUFRSX0FMSUdOKHB4bWl0YnVmLT5wYWxsb2NhdGVkX2J1ZiwgWE1JVEJVRl9BTElHTl9TWik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXB4bWl0YnVmLT5weG1pdF91cmJbaV0gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQlpZiAoIXB4bWl0YnVmLT5weG1pdF91cmJbaV0pIHsKLQkJCURCR184NzIzQSgicHhtaXRidWYtPnB4bWl0X3VyYltpXT09TlVMTCIpOwotCQkJcmV0dXJuIF9GQUlMOwotCQl9Ci0JfQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotdm9pZCBydHdfb3NfeG1pdF9yZXNvdXJjZV9mcmVlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXVzYl9mcmVlX3VyYihweG1pdGJ1Zi0+cHhtaXRfdXJiW2ldKTsKLQlrZnJlZShweG1pdGJ1Zi0+cGFsbG9jYXRlZF9idWYpOwotfQotCi0jZGVmaW5lIFdNTV9YTUlUX1RIUkVTSE9MRAkoTlJfWE1JVEZSQU1FKjIvNSkKLQotdm9pZCBydHdfb3NfcGt0X2NvbXBsZXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpwa3QpCi17Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQl1MTYJcXVldWU7Ci0KLQlxdWV1ZSA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhwa3QpOwotCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpZmlfc3BlYykgewotCQlpZiAoX19uZXRpZl9zdWJxdWV1ZV9zdG9wcGVkKHBhZGFwdGVyLT5wbmV0ZGV2LCBxdWV1ZSkgJiYKLQkJICAgIChweG1pdHByaXYtPmh3eG1pdHNbcXVldWVdLmFjY250IDwgV01NX1hNSVRfVEhSRVNIT0xEKSkKLQkJCW5ldGlmX3dha2Vfc3VicXVldWUocGFkYXB0ZXItPnBuZXRkZXYsIHF1ZXVlKTsKLQl9IGVsc2UgewotCQlpZiAoX19uZXRpZl9zdWJxdWV1ZV9zdG9wcGVkKHBhZGFwdGVyLT5wbmV0ZGV2LCBxdWV1ZSkpCi0JCQluZXRpZl93YWtlX3N1YnF1ZXVlKHBhZGFwdGVyLT5wbmV0ZGV2LCBxdWV1ZSk7Ci0JfQotCWRldl9rZnJlZV9za2JfYW55KHBrdCk7Ci19Ci0KLXZvaWQgcnR3X29zX3htaXRfY29tcGxldGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgc3RydWN0IHhtaXRfZnJhbWUgKnB4ZnJhbWUpCi17Ci0JaWYgKHB4ZnJhbWUtPnBrdCkKLQkJcnR3X29zX3BrdF9jb21wbGV0ZTIzYShwYWRhcHRlciwgcHhmcmFtZS0+cGt0KTsKLQotCXB4ZnJhbWUtPnBrdCA9IE5VTEw7Ci19Ci0KLXZvaWQgcnR3X29zX3htaXRfc2NoZWR1bGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXY7Ci0KLQlpZiAoIXBhZGFwdGVyKQotCQlyZXR1cm47Ci0JcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCXNwaW5fbG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQotCWlmIChydHdfdHhmcmFtZXNfcGVuZGluZzIzYShwYWRhcHRlcikpCi0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnB4bWl0cHJpdi0+eG1pdF90YXNrbGV0KTsKLQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgcnR3X2NoZWNrX3htaXRfcmVzb3VyY2Uoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnBrdCkKLXsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXUxNglxdWV1ZTsKLQotCXF1ZXVlID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHBrdCk7Ci0JaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjKSB7Ci0JCS8qIE5vIGZyZWUgc3BhY2UgZm9yIFR4LCB0eF93b3JrZXIgaXMgdG9vIHNsb3cgKi8KLQkJaWYgKHB4bWl0cHJpdi0+aHd4bWl0c1txdWV1ZV0uYWNjbnQgPiBXTU1fWE1JVF9USFJFU0hPTEQpCi0JCQluZXRpZl9zdG9wX3N1YnF1ZXVlKHBhZGFwdGVyLT5wbmV0ZGV2LCBxdWV1ZSk7Ci0JfSBlbHNlIHsKLQkJaWYgKHB4bWl0cHJpdi0+ZnJlZV94bWl0ZnJhbWVfY250IDw9IDQpIHsKLQkJCWlmICghbmV0aWZfdHhfcXVldWVfc3RvcHBlZChuZXRkZXZfZ2V0X3R4X3F1ZXVlKHBhZGFwdGVyLT5wbmV0ZGV2LCBxdWV1ZSkpKQotCQkJCW5ldGlmX3N0b3Bfc3VicXVldWUocGFkYXB0ZXItPnBuZXRkZXYsIHF1ZXVlKTsKLQkJfQotCX0KLX0KLQotaW50IHJ0d194bWl0MjNhX2VudHJ5MjNhKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCWludCByZXMgPSAwOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sICIreG1pdF9lbnJ5XG4iKTsKLQotCWlmICghcnR3X2lmX3VwMjNhKHBhZGFwdGVyKSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3htaXRfb3NkZXBfY18sIF9kcnZfZXJyXywKLQkJCSAicnR3X3htaXQyM2FfZW50cnkyM2E6IHJ0d19pZl91cDIzYSBmYWlsXG4iKTsKLQkJZ290byBkcm9wX3BhY2tldDsKLQl9Ci0KLQlydHdfY2hlY2tfeG1pdF9yZXNvdXJjZShwYWRhcHRlciwgc2tiKTsKLQotCXJlcyA9IHJ0d194bWl0MjNhKHBhZGFwdGVyLCBza2IpOwotCWlmIChyZXMgPCAwKQotCQlnb3RvIGRyb3BfcGFja2V0OwotCi0JcHhtaXRwcml2LT50eF9wa3RzKys7Ci0JUlRfVFJBQ0UoX21vZHVsZV94bWl0X29zZGVwX2NfLCBfZHJ2X2luZm9fLAotCQkgInJ0d194bWl0MjNhX2VudHJ5MjNhOiB0eF9wa3RzPSVkXG4iLAotCQkgKHUzMilweG1pdHByaXYtPnR4X3BrdHMpOwotCWdvdG8gZXhpdDsKLQotZHJvcF9wYWNrZXQ6Ci0JcHhtaXRwcml2LT50eF9kcm9wKys7Ci0JZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQlSVF9UUkFDRShfbW9kdWxlX3htaXRfb3NkZXBfY18sIF9kcnZfbm90aWNlXywKLQkJICJydHdfeG1pdDIzYV9lbnRyeTIzYTogZHJvcCwgdHhfZHJvcD0lZFxuIiwKLQkJICh1MzIpcHhtaXRwcml2LT50eF9kcm9wKTsKLWV4aXQ6Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuYwppbmRleCAwZjBjZDRhLi5mMjdkZjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L21zLmMKQEAgLTYzLDEyICs2MywxMiBAQAogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19CWVRFX0NOVCwgMHhGRiwgY250KTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfVFJBTlNfQ0ZHLCAweEZGLCBjZmcpOwogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0RBVEFfU09VUkNFLAotCQkweDAxLCBQSU5HUE9OR19CVUZGRVIpOworCQkgICAgIDB4MDEsIFBJTkdQT05HX0JVRkZFUik7CiAKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfVFJBTlNGRVIsCi0JCTB4RkYsIE1TX1RSQU5TRkVSX1NUQVJUIHwgdHJhbnNfbW9kZSk7CisJCSAgICAgMHhGRiwgTVNfVFJBTlNGRVJfU1RBUlQgfCB0cmFuc19tb2RlKTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgQ0hFQ0tfUkVHX0NNRCwgTVNfVFJBTlNGRVIsCi0JCU1TX1RSQU5TRkVSX0VORCwgTVNfVFJBTlNGRVJfRU5EKTsKKwkJICAgICBNU19UUkFOU0ZFUl9FTkQsIE1TX1RSQU5TRkVSX0VORCk7CiAKIAlydHN4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBNU19UUkFOU19DRkcsIDAsIDApOwogCkBAIC0xMDksOCArMTA5LDggQEAKIH0KIAogc3RhdGljIGludCBtc190cmFuc2Zlcl9kYXRhKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IHRyYW5zX21vZGUsCi0JCQl1OCB0cGMsIHUxNiBzZWNfY250LCB1OCBjZmcsIGJvb2wgbW9kZV8yaywKLQkJCWludCB1c2Vfc2csIHZvaWQgKmJ1ZiwgaW50IGJ1Zl9sZW4pCisJCQkgICAgdTggdHBjLCB1MTYgc2VjX2NudCwgdTggY2ZnLCBib29sIG1vZGVfMmssCisJCQkgICAgaW50IHVzZV9zZywgdm9pZCAqYnVmLCBpbnQgYnVmX2xlbikKIHsKIAlpbnQgcmV0dmFsOwogCXU4IHZhbCwgZXJyX2NvZGUgPSAwOwpAQCAtMjA2LDcgKzIwNiw3IEBACiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX0JZVEVfQ05ULCAweEZGLCBjbnQpOwogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19UUkFOU19DRkcsIDB4RkYsIGNmZyk7CiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfREFUQV9TT1VSQ0UsCi0JCTB4MDEsIFBJTkdQT05HX0JVRkZFUik7CisJCSAgICAgMHgwMSwgUElOR1BPTkdfQlVGRkVSKTsKIAogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELAogCQkgICAgIE1TX1RSQU5TRkVSLCAweEZGLCBNU19UUkFOU0ZFUl9TVEFSVCB8IE1TX1RNX1dSSVRFX0JZVEVTKTsKQEAgLTI1Myw3ICsyNTMsNyBAQAogfQogCiBzdGF0aWMgaW50IG1zX3JlYWRfYnl0ZXMoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwKLQkJCXU4IHRwYywgdTggY250LCB1OCBjZmcsIHU4ICpkYXRhLCBpbnQgZGF0YV9sZW4pCisJCQkgdTggdHBjLCB1OCBjbnQsIHU4IGNmZywgdTggKmRhdGEsIGludCBkYXRhX2xlbikKIHsKIAlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICZjaGlwLT5tc19jYXJkOwogCWludCByZXR2YWwsIGk7CkBAIC0yNzAsMTIgKzI3MCwxMiBAQAogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19CWVRFX0NOVCwgMHhGRiwgY250KTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfVFJBTlNfQ0ZHLCAweEZGLCBjZmcpOwogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0RBVEFfU09VUkNFLAotCQkweDAxLCBQSU5HUE9OR19CVUZGRVIpOworCQkgICAgIDB4MDEsIFBJTkdQT05HX0JVRkZFUik7CiAKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfVFJBTlNGRVIsIDB4RkYsCi0JCU1TX1RSQU5TRkVSX1NUQVJUIHwgTVNfVE1fUkVBRF9CWVRFUyk7CisJCSAgICAgTVNfVFJBTlNGRVJfU1RBUlQgfCBNU19UTV9SRUFEX0JZVEVTKTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgQ0hFQ0tfUkVHX0NNRCwgTVNfVFJBTlNGRVIsCi0JCU1TX1RSQU5TRkVSX0VORCwgTVNfVFJBTlNGRVJfRU5EKTsKKwkJICAgICBNU19UUkFOU0ZFUl9FTkQsIE1TX1RSQU5TRkVSX0VORCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGF0YV9sZW4gLSAxOyBpKyspCiAJCXJ0c3hfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFBQQlVGX0JBU0UyICsgaSwgMCwgMCk7CkBAIC0yODQsNyArMjg0LDcgQEAKIAkJcnRzeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgUFBCVUZfQkFTRTIgKyBkYXRhX2xlbiwgMCwgMCk7CiAJZWxzZQogCQlydHN4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBQUEJVRl9CQVNFMiArIGRhdGFfbGVuIC0gMSwKLQkJCTAsIDApOworCQkJICAgICAwLCAwKTsKIAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgTVNfQ0FSRCwgNTAwMCk7CiAJaWYgKHJldHZhbCA8IDApIHsKQEAgLTMzNCw4ICszMzQsOCBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotc3RhdGljIGludCBtc19zZXRfcndfcmVnX2FkZHIoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwKLQkJdTggcmVhZF9zdGFydCwgdTggcmVhZF9jbnQsIHU4IHdyaXRlX3N0YXJ0LCB1OCB3cml0ZV9jbnQpCitzdGF0aWMgaW50IG1zX3NldF9yd19yZWdfYWRkcihzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCByZWFkX3N0YXJ0LAorCQkJICAgICAgdTggcmVhZF9jbnQsIHU4IHdyaXRlX3N0YXJ0LCB1OCB3cml0ZV9jbnQpCiB7CiAJaW50IHJldHZhbCwgaTsKIAl1OCBkYXRhWzRdOwpAQCAtMTQxNyw3ICsxNDE3LDYgQEAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQogc3RhdGljIGludCBtc19yZWFkX2V4dHJhX2RhdGEoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwKIAkJdTE2IGJsb2NrX2FkZHIsIHU4IHBhZ2VfbnVtLCB1OCAqYnVmLCBpbnQgYnVmX2xlbikKIHsKQEAgLTE1ODIsNyArMTU4MSw2IEBACiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi0KIHN0YXRpYyBpbnQgbXNfcmVhZF9wYWdlKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHUxNiBibG9ja19hZGRyLCB1OCBwYWdlX251bSkKIHsKIAlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICZjaGlwLT5tc19jYXJkOwpAQCAtMTY2Nyw3ICsxNjY1LDYgQEAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQogc3RhdGljIGludCBtc19zZXRfYmFkX2Jsb2NrKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHUxNiBwaHlfYmxrKQogewogCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJmNoaXAtPm1zX2NhcmQ7CkBAIC0xNzM4LDcgKzE3MzUsNiBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiBzdGF0aWMgaW50IG1zX2VyYXNlX2Jsb2NrKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHUxNiBwaHlfYmxrKQogewogCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJmNoaXAtPm1zX2NhcmQ7CkBAIC0xODA4LDcgKzE4MDQsNiBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiBzdGF0aWMgdm9pZCBtc19zZXRfcGFnZV9zdGF0dXModTE2IGxvZ19ibGssIHU4IHR5cGUsIHU4ICpleHRyYSwgaW50IGV4dHJhX2xlbikKIHsKIAlpZiAoIWV4dHJhIHx8IChleHRyYV9sZW4gPCBNU19FWFRSQV9TSVpFKSkKQEAgLTIxNTIsNyArMjE0Nyw2IEBACiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi0KIHN0YXRpYyBpbnQgcmVzZXRfbXMoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKIAlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICZjaGlwLT5tc19jYXJkOwpAQCAtMjQ3MSw3ICsyNDY1LDcgQEAKIAlpZiAoIW1zX2NhcmQtPnNlZ21lbnQpCiAJCXJldHVybiAweEZGRkY7CiAKLQlzZWdtZW50ID0gJihtc19jYXJkLT5zZWdtZW50W3NlZ19ub10pOworCXNlZ21lbnQgPSAmbXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dOwogCiAJaWYgKHNlZ21lbnQtPmwycF90YWJsZSkKIAkJcmV0dXJuIHNlZ21lbnQtPmwycF90YWJsZVtsb2dfb2ZmXTsKQEAgLTI0ODgsNyArMjQ4Miw3IEBACiAJaWYgKCFtc19jYXJkLT5zZWdtZW50KQogCQlyZXR1cm47CiAKLQlzZWdtZW50ID0gJihtc19jYXJkLT5zZWdtZW50W3NlZ19ub10pOworCXNlZ21lbnQgPSAmbXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dOwogCWlmIChzZWdtZW50LT5sMnBfdGFibGUpCiAJCXNlZ21lbnQtPmwycF90YWJsZVtsb2dfb2ZmXSA9IHBoeV9ibGs7CiB9CkBAIC0yNTAwLDcgKzI0OTQsNyBAQAogCWludCBzZWdfbm87CiAKIAlzZWdfbm8gPSAoaW50KXBoeV9ibGsgPj4gOTsKLQlzZWdtZW50ID0gJihtc19jYXJkLT5zZWdtZW50W3NlZ19ub10pOworCXNlZ21lbnQgPSAmbXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dOwogCiAJc2VnbWVudC0+ZnJlZV90YWJsZVtzZWdtZW50LT5zZXRfaW5kZXgrK10gPSBwaHlfYmxrOwogCWlmIChzZWdtZW50LT5zZXRfaW5kZXggPj0gTVNfRlJFRV9UQUJMRV9DTlQpCkBAIC0yNTE1LDcgKzI1MDksNyBAQAogCXN0cnVjdCB6b25lX2VudHJ5ICpzZWdtZW50OwogCXUxNiBwaHlfYmxrOwogCi0Jc2VnbWVudCA9ICYobXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dKTsKKwlzZWdtZW50ID0gJm1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXTsKIAogCWlmIChzZWdtZW50LT51bnVzZWRfYmxrX2NudCA8PSAwKQogCQlyZXR1cm4gMHhGRkZGOwpAQCAtMjU0NCw3ICsyNTM4LDcgQEAKIAl1MTYgdG1wX2JsazsKIAogCXNlZ19ubyA9IChpbnQpcGh5X2JsayA+PiA5OwotCXNlZ21lbnQgPSAmKG1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXSk7CisJc2VnbWVudCA9ICZtc19jYXJkLT5zZWdtZW50W3NlZ19ub107CiAJdG1wX2JsayA9IHNlZ21lbnQtPmwycF90YWJsZVtsb2dfb2ZmXTsKIAogCWlmICh1czEgIT0gdXMyKSB7CkBAIC0yNjA4LDcgKzI2MDIsNyBAQAogCWVsc2UKIAkJdGFibGVfc2l6ZSA9IDQ5NjsKIAotCXNlZ21lbnQgPSAmKG1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXSk7CisJc2VnbWVudCA9ICZtc19jYXJkLT5zZWdtZW50W3NlZ19ub107CiAKIAlpZiAoIXNlZ21lbnQtPmwycF90YWJsZSkgewogCQlzZWdtZW50LT5sMnBfdGFibGUgPSB2bWFsbG9jKHRhYmxlX3NpemUgKiAyKTsKQEAgLTI3MTcsNyArMjcxMSw3IEBACiAJCXVzMiA9IGV4dHJhWzBdICYgMHgxMDsKIAogCQkodm9pZCltc19hcmJpdHJhdGVfbDJwKGNoaXAsIHBoeV9ibGssCi0JCQkJbG9nX2Jsay1tc19zdGFydF9pZHhbc2VnX25vXSwgdXMxLCB1czIpOworCQkJCWxvZ19ibGsgLSBtc19zdGFydF9pZHhbc2VnX25vXSwgdXMxLCB1czIpOwogCQljb250aW51ZTsKIAl9CiAKQEAgLTI4MDksNyArMjgwMyw2IEBACiAJcmV0dXJuIFNUQVRVU19GQUlMOwogfQogCi0KIGludCByZXNldF9tc19jYXJkKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmY2hpcC0+bXNfY2FyZDsKQEAgLTI4OTYsNyArMjg4OSw2IEBACiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi0KIHZvaWQgbXNwcm9fc3RvcF9zZXFfbW9kZShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewogCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJmNoaXAtPm1zX2NhcmQ7CkBAIC0zMzEyLDcgKzMzMDQsNiBAQAogCXJldHVybiBTVEFUVVNfRkFJTDsKIH0KIAotCiBzdGF0aWMgaW50IG1zX3JlYWRfbXVsdGlwbGVfcGFnZXMoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTE2IHBoeV9ibGssCiAJCQkJdTE2IGxvZ19ibGssIHU4IHN0YXJ0X3BhZ2UsIHU4IGVuZF9wYWdlLAogCQkJCXU4ICpidWYsIHVuc2lnbmVkIGludCAqaW5kZXgsCkBAIC0zNzE5LDcgKzM3MTAsNiBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiBzdGF0aWMgaW50IG1zX2ZpbmlzaF93cml0ZShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1MTYgb2xkX2JsaywgdTE2IG5ld19ibGssCiAJCXUxNiBsb2dfYmxrLCB1OCBwYWdlX29mZikKIHsKQEAgLTM3NzAsNyArMzc2MCw3IEBACiBpbnQgbXNfZGVsYXlfd3JpdGUoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKIAlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICZjaGlwLT5tc19jYXJkOwotCXN0cnVjdCBtc19kZWxheV93cml0ZV90YWcgKmRlbGF5X3dyaXRlID0gJihtc19jYXJkLT5kZWxheV93cml0ZSk7CisJc3RydWN0IG1zX2RlbGF5X3dyaXRlX3RhZyAqZGVsYXlfd3JpdGUgPSAmbXNfY2FyZC0+ZGVsYXlfd3JpdGU7CiAJaW50IHJldHZhbDsKIAogCWlmIChkZWxheV93cml0ZS0+ZGVsYXlfd3JpdGVfZmxhZykgewpAQCAtMzgxNiw3ICszODA2LDcgQEAKIAl1OCBzdGFydF9wYWdlLCBlbmRfcGFnZSA9IDAsIHBhZ2VfY250OwogCXU4ICpwdHI7CiAjaWZkZWYgTVNfREVMQVlfV1JJVEUKLQlzdHJ1Y3QgbXNfZGVsYXlfd3JpdGVfdGFnICpkZWxheV93cml0ZSA9ICYobXNfY2FyZC0+ZGVsYXlfd3JpdGUpOworCXN0cnVjdCBtc19kZWxheV93cml0ZV90YWcgKmRlbGF5X3dyaXRlID0gJm1zX2NhcmQtPmRlbGF5X3dyaXRlOwogI2VuZGlmCiAKIAltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fRVJST1IpOwpAQCAtMzk5Niw3ICszOTg2LDcgQEAKIAogCQlmb3IgKHNlZ19ubyA9IDA7IHNlZ19ubyA8IEFSUkFZX1NJWkUobXNfc3RhcnRfaWR4KSAtIDE7CiAJCQkJc2VnX25vKyspIHsKLQkJCWlmIChsb2dfYmxrIDwgbXNfc3RhcnRfaWR4W3NlZ19ubysxXSkKKwkJCWlmIChsb2dfYmxrIDwgbXNfc3RhcnRfaWR4W3NlZ19ubyArIDFdKQogCQkJCWJyZWFrOwogCQl9CiAKQEAgLTQwODIsMTMgKzQwNzIsMTIgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi0KIHZvaWQgbXNfZnJlZV9sMnBfdGJsKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmY2hpcC0+bXNfY2FyZDsKIAlpbnQgaSA9IDA7CiAKLQlpZiAobXNfY2FyZC0+c2VnbWVudCAhPSBOVUxMKSB7CisJaWYgKG1zX2NhcmQtPnNlZ21lbnQpIHsKIAkJZm9yIChpID0gMDsgaSA8IG1zX2NhcmQtPnNlZ21lbnRfY250OyBpKyspIHsKIAkJCXZmcmVlKG1zX2NhcmQtPnNlZ21lbnRbaV0ubDJwX3RhYmxlKTsKIAkJCW1zX2NhcmQtPnNlZ21lbnRbaV0ubDJwX3RhYmxlID0gTlVMTDsKQEAgLTQzMTMsNyArNDMwMiw3IEBACiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfS0VZX0ZBSUxfTk9UX0FVVEhFTik7CiAJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCWdvdG8gR2V0RUtCRmluaXNoOworCQlnb3RvIGZyZWVfYnVmZmVyOwogCX0KIAogCXJldHZhbCA9IG1zX3RyYW5zZmVyX2RhdGEoY2hpcCwgTVNfVE1fQVVUT19SRUFELCBQUk9fUkVBRF9MT05HX0RBVEEsCkBAIC00MzIyLDE5ICs0MzExLDIwIEBACiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfQVVUSEVOKTsKIAkJcnRzeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKIAkJcnRzeF90cmFjZShjaGlwKTsKLQkJZ290byBHZXRFS0JGaW5pc2g7CisJCWdvdG8gZnJlZV9idWZmZXI7CiAJfQogCWlmIChjaGVja19tc19lcnIoY2hpcCkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9BVVRIRU4pOwogCQlydHN4X2NsZWFyX21zX2Vycm9yKGNoaXApOwogCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCXJldHZhbCA9IFNUQVRVU19GQUlMOworCQlnb3RvIGZyZWVfYnVmZmVyOwogCX0KIAogCWJ1ZmZsZW4gPSBtaW5fdChpbnQsIDEwNTIsIHNjc2lfYnVmZmxlbihzcmIpKTsKIAlydHN4X3N0b3Jfc2V0X3hmZXJfYnVmKGJ1ZiwgYnVmZmxlbiwgc3JiKTsKIAotR2V0RUtCRmluaXNoOgorZnJlZV9idWZmZXI6CiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtNDU2Niw3ICs0NTU2LDcgQEAKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwogCQlydHN4X3RyYWNlKGNoaXApOwotCQlnb3RvIEdldElDVkZpbmlzaDsKKwkJZ290byBmcmVlX2J1ZmZlcjsKIAl9CiAKIAlyZXR2YWwgPSBtc190cmFuc2Zlcl9kYXRhKGNoaXAsIE1TX1RNX0FVVE9fUkVBRCwgUFJPX1JFQURfTE9OR19EQVRBLApAQCAtNDU3NSwxOSArNDU2NSwyMCBAQAogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfVU5SRUNPVkVSX1JFQURfRVJSKTsKIAkJcnRzeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKIAkJcnRzeF90cmFjZShjaGlwKTsKLQkJZ290byBHZXRJQ1ZGaW5pc2g7CisJCWdvdG8gZnJlZV9idWZmZXI7CiAJfQogCWlmIChjaGVja19tc19lcnIoY2hpcCkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7CiAJCXJ0c3hfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CiAJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJcmV0dmFsID0gU1RBVFVTX0ZBSUw7CisJCWdvdG8gZnJlZV9idWZmZXI7CiAJfQogCiAJYnVmZmxlbiA9IG1pbl90KGludCwgMTAyOCwgc2NzaV9idWZmbGVuKHNyYikpOwogCXJ0c3hfc3Rvcl9zZXRfeGZlcl9idWYoYnVmLCBidWZmbGVuLCBzcmIpOwogCi1HZXRJQ1ZGaW5pc2g6CitmcmVlX2J1ZmZlcjoKIAlrZnJlZShidWYpOwogCXJldHVybiByZXR2YWw7CiB9CkBAIC00NjU3LDggKzQ2NDgsOCBAQAogCiAJCXJ0c3hfc2VuZF9jbWRfbm9fd2FpdChjaGlwKTsKIAotCQlyZXR2YWwgPSBydHN4X3RyYW5zZmVyX2RhdGEoY2hpcCwgTVNfQ0FSRCwgYnVmICsgNCArIGkqNTEyLAotCQkJCQk1MTIsIDAsIERNQV9UT19ERVZJQ0UsIDMwMDApOworCQlyZXR2YWwgPSBydHN4X3RyYW5zZmVyX2RhdGEoY2hpcCwgTVNfQ0FSRCwgYnVmICsgNCArIGkgKiA1MTIsCisJCQkJCSAgICA1MTIsIDAsIERNQV9UT19ERVZJQ0UsIDMwMDApOwogCQlpZiAoKHJldHZhbCA8IDApIHx8IGNoZWNrX21zX2VycihjaGlwKSkgewogCQkJcnRzeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKIAkJCWlmIChtc19jYXJkLT5tZ19hdXRoID09IDApIHsKQEAgLTQ3MDUsNyArNDY5Niw3IEBACiAKIHZvaWQgbXNfY2xlYW51cF93b3JrKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7Ci0Jc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJmNoaXAtPm1zX2NhcmQ7CiAKIAlpZiAoQ0hLX01TUFJPKG1zX2NhcmQpKSB7CiAJCWlmIChtc19jYXJkLT5zZXFfbW9kZSkgewpAQCAtNDc3MCw3ICs0NzYxLDcgQEAKIAogaW50IHJlbGVhc2VfbXNfY2FyZChzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewotCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICZjaGlwLT5tc19jYXJkOwogCWludCByZXR2YWw7CiAKICNpZmRlZiBNU19ERUxBWV9XUklURQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L21zLmgKaW5kZXggZDkxOTE3MC4uZDc2ODYzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5oCkBAIC0xMjUsNyArMTI1LDYgQEAKICNkZWZpbmUgUHJvX0NhdGFnb3J5UmVnCQkweDA2CiAjZGVmaW5lIFByb19DbGFzc1JlZwkJMHgwNwogCi0KICNkZWZpbmUgUHJvX1N5c3RlbVBhcm0JCTB4MTAKICNkZWZpbmUgUHJvX0RhdGFDb3VudDEJCTB4MTEKICNkZWZpbmUgUHJvX0RhdGFDb3VudDAJCTB4MTIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3guYwppbmRleCAyNWQwOTVhLi41ZDY1YTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeC5jCkBAIC0zNCwyNyArMzQsMjcgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBkZWxheV91c2UgPSAxOwotbW9kdWxlX3BhcmFtKGRlbGF5X3VzZSwgdWludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtKGRlbGF5X3VzZSwgdWludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlbGF5X3VzZSwgInNlY29uZHMgdG8gZGVsYXkgYmVmb3JlIHVzaW5nIGEgbmV3IGRldmljZSIpOwogCiBzdGF0aWMgaW50IHNzX2VuOwotbW9kdWxlX3BhcmFtKHNzX2VuLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShzc19lbiwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Moc3NfZW4sICJlbmFibGUgc2VsZWN0aXZlIHN1c3BlbmQiKTsKIAogc3RhdGljIGludCBzc19pbnRlcnZhbCA9IDUwOwotbW9kdWxlX3BhcmFtKHNzX2ludGVydmFsLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShzc19pbnRlcnZhbCwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Moc3NfaW50ZXJ2YWwsICJJbnRlcnZhbCB0byBlbnRlciBzcyBzdGF0ZSBpbiBzZWNvbmRzIik7CiAKIHN0YXRpYyBpbnQgYXV0b19kZWxpbmtfZW47Ci1tb2R1bGVfcGFyYW0oYXV0b19kZWxpbmtfZW4sIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtKGF1dG9fZGVsaW5rX2VuLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhdXRvX2RlbGlua19lbiwgImVuYWJsZSBhdXRvIGRlbGluayIpOwogCiBzdGF0aWMgdW5zaWduZWQgY2hhciBhc3BtX2wwc19sMV9lbjsKLW1vZHVsZV9wYXJhbShhc3BtX2wwc19sMV9lbiwgYnl0ZSwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtKGFzcG1fbDBzX2wxX2VuLCBieXRlLCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYXNwbV9sMHNfbDFfZW4sICJlbmFibGUgZGV2aWNlIGFzcG0iKTsKIAogc3RhdGljIGludCBtc2lfZW47Ci1tb2R1bGVfcGFyYW0obXNpX2VuLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShtc2lfZW4sIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1zaV9lbiwgImVuYWJsZSBtc2kiKTsKIAogc3RhdGljIGlycXJldHVybl90IHJ0c3hfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCk7CkBAIC04MSwxNCArODEsMTYgQEAKIAogc3RhdGljIGludCBzbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewotCS8qIFNjYXR0ZXItZ2F0aGVyIGJ1ZmZlcnMgKGFsbCBidXQgdGhlIGxhc3QpIG11c3QgaGF2ZSBhIGxlbmd0aAorCS8qCisJICogU2NhdHRlci1nYXRoZXIgYnVmZmVycyAoYWxsIGJ1dCB0aGUgbGFzdCkgbXVzdCBoYXZlIGEgbGVuZ3RoCiAJICogZGl2aXNpYmxlIGJ5IHRoZSBidWxrIG1heHBhY2tldCBzaXplLiAgT3RoZXJ3aXNlIGEgZGF0YSBwYWNrZXQKIAkgKiB3b3VsZCBlbmQgdXAgYmVpbmcgc2hvcnQsIGNhdXNpbmcgYSBwcmVtYXR1cmUgZW5kIHRvIHRoZSBkYXRhCiAJICogdHJhbnNmZXIuICBTaW5jZSBoaWdoLXNwZWVkIGJ1bGsgcGlwZXMgaGF2ZSBhIG1heHBhY2tldCBzaXplCiAJICogb2YgNTEyLCB3ZSdsbCB1c2UgdGhhdCBhcyB0aGUgc2NzaSBkZXZpY2UgcXVldWUncyBETUEgYWxpZ25tZW50CiAJICogbWFzay4gIEd1YXJhbnRlZWluZyBwcm9wZXIgYWxpZ25tZW50IG9mIHRoZSBmaXJzdCBidWZmZXIgd2lsbAogCSAqIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0IGJlY2F1c2UsIGV4Y2VwdCBhdCB0aGUgYmVnaW5uaW5nIGFuZAotCSAqIHRoZSBlbmQsIHNjYXR0ZXItZ2F0aGVyIGJ1ZmZlcnMgZm9sbG93IHBhZ2UgYm91bmRhcmllcy4gKi8KKwkgKiB0aGUgZW5kLCBzY2F0dGVyLWdhdGhlciBidWZmZXJzIGZvbGxvdyBwYWdlIGJvdW5kYXJpZXMuCisJICovCiAJYmxrX3F1ZXVlX2RtYV9hbGlnbm1lbnQoc2Rldi0+cmVxdWVzdF9xdWV1ZSwgKDUxMiAtIDEpKTsKIAogCS8qIFNldCB0aGUgU0NTSSBsZXZlbCB0byBhdCBsZWFzdCAyLiAgV2UnbGwgbGVhdmUgaXQgYXQgMyBpZiB0aGF0J3MKQEAgLTExMSw3ICsxMTMsNiBAQAogCXJldHVybiAwOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogL3Byb2Mvc2NzaS8gZnVuY3Rpb25zCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMzAsNyArMTMxLDcgQEAKIAlzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwID0gZGV2LT5jaGlwOwogCiAJLyogY2hlY2sgZm9yIHN0YXRlLXRyYW5zaXRpb24gZXJyb3JzICovCi0JaWYgKGNoaXAtPnNyYiAhPSBOVUxMKSB7CisJaWYgKGNoaXAtPnNyYikgewogCQlkZXZfZXJyKCZkZXYtPnBjaS0+ZGV2LCAiRXJyb3I6IGNoaXAtPnNyYiA9ICVwXG4iLAogCQkJY2hpcC0+c3JiKTsKIAkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CkBAIC0xODYsOCArMTg3LDEwIEBACiAJcmV0dXJuIFNVQ0NFU1M7CiB9CiAKLS8qIFRoaXMgaW52b2tlcyB0aGUgdHJhbnNwb3J0IHJlc2V0IG1lY2hhbmlzbSB0byByZXNldCB0aGUgc3RhdGUgb2YgdGhlCi0gKiBkZXZpY2UgKi8KKy8qCisgKiBUaGlzIGludm9rZXMgdGhlIHRyYW5zcG9ydCByZXNldCBtZWNoYW5pc20gdG8gcmVzZXQgdGhlIHN0YXRlIG9mIHRoZQorICogZGV2aWNlCisgKi8KIHN0YXRpYyBpbnQgZGV2aWNlX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKQEAgLTIwOSw3ICsyMTIsNiBAQAogCXJldHVybiByZXN1bHQgPCAwID8gRkFJTEVEIDogU1VDQ0VTUzsKIH0KIAotCiAvKgogICogdGhpcyBkZWZpbmVzIG91ciBob3N0IHRlbXBsYXRlLCB3aXRoIHdoaWNoIHdlJ2xsIGFsbG9jYXRlIGhvc3RzCiAgKi8KQEAgLTI1OSw3ICsyNjEsNiBAQAogCS5tb2R1bGUgPQkJCVRISVNfTU9EVUxFCiB9OwogCi0KIHN0YXRpYyBpbnQgcnRzeF9hY3F1aXJlX2lycShzdHJ1Y3QgcnRzeF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwID0gZGV2LT5jaGlwOwpAQCAtMjgyLDcgKzI4Myw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogaW50IHJ0c3hfcmVhZF9wY2lfY2ZnX2J5dGUodTggYnVzLCB1OCBkZXYsIHU4IGZ1bmMsIHU4IG9mZnNldCwgdTggKnZhbCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKQEAgLTUxNSw3ICs1MTUsNiBAQAogCWNvbXBsZXRlX2FuZF9leGl0KCZkZXYtPmNvbnRyb2xfZXhpdCwgMCk7CiB9CiAKLQogc3RhdGljIGludCBydHN4X3BvbGxpbmdfdGhyZWFkKHZvaWQgKl9fZGV2KQogewogCXN0cnVjdCBydHN4X2RldiAqZGV2ID0gX19kZXY7CkBAIC02MjUsNyArNjI0LDYgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLQogLyogUmVsZWFzZSBhbGwgb3VyIGR5bmFtaWMgcmVzb3VyY2VzICovCiBzdGF0aWMgdm9pZCBydHN4X3JlbGVhc2VfcmVzb3VyY2VzKHN0cnVjdCBydHN4X2RldiAqZGV2KQogewpAQCAtNjYwLDE1ICs2NTgsMTkgQEAKIAlrZnJlZShkZXYtPmNoaXApOwogfQogCi0vKiBGaXJzdCBzdGFnZSBvZiBkaXNjb25uZWN0IHByb2Nlc3Npbmc6IHN0b3AgYWxsIGNvbW1hbmRzIGFuZCByZW1vdmUKLSAqIHRoZSBob3N0ICovCisvKgorICogRmlyc3Qgc3RhZ2Ugb2YgZGlzY29ubmVjdCBwcm9jZXNzaW5nOiBzdG9wIGFsbCBjb21tYW5kcyBhbmQgcmVtb3ZlCisgKiB0aGUgaG9zdAorICovCiBzdGF0aWMgdm9pZCBxdWllc2NlX2FuZF9yZW1vdmVfaG9zdChzdHJ1Y3QgcnRzeF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcnRzeF90b19ob3N0KGRldik7CiAJc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCA9IGRldi0+Y2hpcDsKIAotCS8qIFByZXZlbnQgbmV3IHRyYW5zZmVycywgc3RvcCB0aGUgY3VycmVudCBjb21tYW5kLCBhbmQKLQkgKiBpbnRlcnJ1cHQgYSBTQ1NJLXNjYW4gb3IgZGV2aWNlLXJlc2V0IGRlbGF5ICovCisJLyoKKwkgKiBQcmV2ZW50IG5ldyB0cmFuc2ZlcnMsIHN0b3AgdGhlIGN1cnJlbnQgY29tbWFuZCwgYW5kCisJICogaW50ZXJydXB0IGEgU0NTSS1zY2FuIG9yIGRldmljZS1yZXNldCBkZWxheQorCSAqLwogCW11dGV4X2xvY2soJmRldi0+ZGV2X211dGV4KTsKIAlzY3NpX2xvY2soaG9zdCk7CiAJcnRzeF9zZXRfc3RhdChjaGlwLCBSVFNYX1NUQVRfRElTQ09OTkVDVCk7CkBAIC02ODAsOSArNjgyLDExIEBACiAJLyogV2FpdCBzb21lIHRpbWUgdG8gbGV0IG90aGVyIHRocmVhZHMgZXhpc3QgKi8KIAl3YWl0X3RpbWVvdXQoMTAwKTsKIAotCS8qIHF1ZXVlY29tbWFuZCB3b24ndCBhY2NlcHQgYW55IG5ldyBjb21tYW5kcyBhbmQgdGhlIGNvbnRyb2wKKwkvKgorCSAqIHF1ZXVlY29tbWFuZCB3b24ndCBhY2NlcHQgYW55IG5ldyBjb21tYW5kcyBhbmQgdGhlIGNvbnRyb2wKIAkgKiB0aHJlYWQgd29uJ3QgZXhlY3V0ZSBhIHByZXZpb3VzbHktcXVldWVkIGNvbW1hbmQuICBJZiB0aGVyZQotCSAqIGlzIHN1Y2ggYSBjb21tYW5kIHBlbmRpbmcsIGNvbXBsZXRlIGl0IHdpdGggYW4gZXJyb3IuICovCisJICogaXMgc3VjaCBhIGNvbW1hbmQgcGVuZGluZywgY29tcGxldGUgaXQgd2l0aCBhbiBlcnJvci4KKwkgKi8KIAltdXRleF9sb2NrKCZkZXYtPmRldl9tdXRleCk7CiAJaWYgKGNoaXAtPnNyYikgewogCQljaGlwLT5zcmItPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OwpAQCAtNzAyLDggKzcwNiwxMCBAQAogewogCXJ0c3hfcmVsZWFzZV9yZXNvdXJjZXMoZGV2KTsKIAotCS8qIERyb3Agb3VyIHJlZmVyZW5jZSB0byB0aGUgaG9zdDsgdGhlIFNDU0kgY29yZSB3aWxsIGZyZWUgaXQKLQkgKiB3aGVuIHRoZSByZWZjb3VudCBiZWNvbWVzIDAuICovCisJLyoKKwkgKiBEcm9wIG91ciByZWZlcmVuY2UgdG8gdGhlIGhvc3Q7IHRoZSBTQ1NJIGNvcmUgd2lsbCBmcmVlIGl0CisJICogd2hlbiB0aGUgcmVmY291bnQgYmVjb21lcyAwLgorCSAqLwogCXNjc2lfaG9zdF9wdXQocnRzeF90b19ob3N0KGRldikpOwogfQogCkBAIC05NDIsOCArOTQ4LDEwIEBACiAKIAlydHN4X2luaXRfY2hpcChkZXYtPmNoaXApOwogCi0JLyogc2V0IHRoZSBzdXBwb3J0ZWQgbWF4X2x1biBhbmQgbWF4X2lkIGZvciB0aGUgc2NzaSBob3N0Ci0JICogTk9URTogdGhlIG1pbmltYWwgdmFsdWUgb2YgbWF4X2lkIGlzIDEgKi8KKwkvKgorCSAqIHNldCB0aGUgc3VwcG9ydGVkIG1heF9sdW4gYW5kIG1heF9pZCBmb3IgdGhlIHNjc2kgaG9zdAorCSAqIE5PVEU6IHRoZSBtaW5pbWFsIHZhbHVlIG9mIG1heF9pZCBpcyAxCisJICovCiAJaG9zdC0+bWF4X2lkID0gMTsKIAlob3N0LT5tYXhfbHVuID0gZGV2LT5jaGlwLT5tYXhfbHVuOwogCkBAIC05OTQsNyArMTAwMiw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotCiBzdGF0aWMgdm9pZCBydHN4X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQogewogCXN0cnVjdCBydHN4X2RldiAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmgKaW5kZXggMTM5NjI2My4uZTcyNWIxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3guaApAQCAtNzAsMTQgKzcwLDEzIEBACiAjZGVmaW5lIHJ0c3hfd3JpdGVfY29uZmlnX2J5dGUoY2hpcCwgd2hlcmUsIHZhbCkgXAogCXBjaV93cml0ZV9jb25maWdfYnl0ZSgoY2hpcCktPnJ0c3gtPnBjaSwgd2hlcmUsIHZhbCkKIAotI2RlZmluZSB3YWl0X3RpbWVvdXRfeCh0YXNrX3N0YXRlLCBtc2VjcykJCVwKLWRvIHsJCQkJCQkJXAotCQlzZXRfY3VycmVudF9zdGF0ZSgodGFza19zdGF0ZSkpOwlcCi0JCXNjaGVkdWxlX3RpbWVvdXQoKG1zZWNzKSAqIEhaIC8gMTAwMCk7CVwKKyNkZWZpbmUgd2FpdF90aW1lb3V0X3godGFza19zdGF0ZSwgbXNlY3MpCVwKK2RvIHsJCQkJCQlcCisJc2V0X2N1cnJlbnRfc3RhdGUoKHRhc2tfc3RhdGUpKTsJXAorCXNjaGVkdWxlX3RpbWVvdXQoKG1zZWNzKSAqIEhaIC8gMTAwMCk7CVwKIH0gd2hpbGUgKDApCiAjZGVmaW5lIHdhaXRfdGltZW91dChtc2VjcykJd2FpdF90aW1lb3V0X3goVEFTS19JTlRFUlJVUFRJQkxFLCAobXNlY3MpKQogCi0KICNkZWZpbmUgU1RBVEVfVFJBTlNfTk9ORQkwCiAjZGVmaW5lIFNUQVRFX1RSQU5TX0NNRAkJMQogI2RlZmluZSBTVEFURV9UUkFOU19CVUYJCTIKQEAgLTg5LDggKzg4LDYgQEAKIAogI2RlZmluZSBTQ1NJX0xVTihzcmIpCQkoKHNyYiktPmRldmljZS0+bHVuKQogCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgREVMQVlfUEFSQV9UOwotCiBzdHJ1Y3QgcnRzeF9jaGlwOwogCiBzdHJ1Y3QgcnRzeF9kZXYgewpAQCAtMTMxLDE2ICsxMjgsMTUgQEAKIAlzdHJ1Y3QgcnRzeF9jaGlwCSpjaGlwOwogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgcnRzeF9kZXYgcnRzeF9kZXZfdDsKLQogLyogQ29udmVydCBiZXR3ZWVuIHJ0c3hfZGV2IGFuZCB0aGUgY29ycmVzcG9uZGluZyBTY3NpX0hvc3QgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IFNjc2lfSG9zdCAqcnRzeF90b19ob3N0KHN0cnVjdCBydHN4X2RldiAqZGV2KQogewotCXJldHVybiBjb250YWluZXJfb2YoKHZvaWQgKikgZGV2LCBzdHJ1Y3QgU2NzaV9Ib3N0LCBob3N0ZGF0YSk7CisJcmV0dXJuIGNvbnRhaW5lcl9vZigodm9pZCAqKWRldiwgc3RydWN0IFNjc2lfSG9zdCwgaG9zdGRhdGEpOwogfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBydHN4X2RldiAqaG9zdF90b19ydHN4KHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgcnRzeF9kZXYgKikgaG9zdC0+aG9zdGRhdGE7CisJcmV0dXJuIChzdHJ1Y3QgcnRzeF9kZXYgKilob3N0LT5ob3N0ZGF0YTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGdldF9jdXJyZW50X3RpbWUodTggKnRpbWV2YWxfYnVmLCBpbnQgYnVmX2xlbikKQEAgLTE2NSw4ICsxNjEsMTAgQEAKIAl0aW1ldmFsX2J1Zls3XSA9ICh1OCkodHZfdXNlYyk7CiB9CiAKLS8qIFRoZSBzY3NpX2xvY2soKSBhbmQgc2NzaV91bmxvY2soKSBtYWNyb3MgcHJvdGVjdCB0aGUgc21fc3RhdGUgYW5kIHRoZQotICogc2luZ2xlIHF1ZXVlIGVsZW1lbnQgc3JiIGZvciB3cml0ZSBhY2Nlc3MgKi8KKy8qCisgKiBUaGUgc2NzaV9sb2NrKCkgYW5kIHNjc2lfdW5sb2NrKCkgbWFjcm9zIHByb3RlY3QgdGhlIHNtX3N0YXRlIGFuZCB0aGUKKyAqIHNpbmdsZSBxdWV1ZSBlbGVtZW50IHNyYiBmb3Igd3JpdGUgYWNjZXNzCisgKi8KICNkZWZpbmUgc2NzaV91bmxvY2soaG9zdCkJc3Bpbl91bmxvY2tfaXJxKGhvc3QtPmhvc3RfbG9jaykKICNkZWZpbmUgc2NzaV9sb2NrKGhvc3QpCQlzcGluX2xvY2tfaXJxKGhvc3QtPmhvc3RfbG9jaykKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jYXJkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NhcmQuYwppbmRleCAyMzE4MzNhLi45NzcxNzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NhcmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NhcmQuYwpAQCAtNjMxLDIxICs2MzEsMjEgQEAKIGludCBzd2l0Y2hfc3NjX2Nsb2NrKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIGludCBjbGspCiB7CiAJaW50IHJldHZhbDsKLQl1OCBOID0gKHU4KShjbGsgLSAyKSwgbWluX04sIG1heF9OOworCXU4IG4gPSAodTgpKGNsayAtIDIpLCBtaW5fbiwgbWF4X247CiAJdTggbWN1X2NudCwgZGl2LCBtYXhfZGl2LCBzc2NfZGVwdGgsIHNzY19kZXB0aF9tYXNrOwogCWludCBzZF92cGNsa19waGFzZV9yZXNldCA9IDA7CiAKIAlpZiAoY2hpcC0+Y3VyX2NsayA9PSBjbGspCiAJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIAotCW1pbl9OID0gNjA7Ci0JbWF4X04gPSAxMjA7CisJbWluX24gPSA2MDsKKwltYXhfbiA9IDEyMDsKIAltYXhfZGl2ID0gQ0xLX0RJVl80OwogCiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlN3aXRjaCBTU0MgY2xvY2sgdG8gJWRNSHogKGN1cl9jbGsgPSAlZClcbiIsCiAJCWNsaywgY2hpcC0+Y3VyX2Nsayk7CiAKLQlpZiAoKGNsayA8PSAyKSB8fCAoTiA+IG1heF9OKSkgeworCWlmICgoY2xrIDw9IDIpIHx8IChuID4gbWF4X24pKSB7CiAJCXJ0c3hfdHJhY2UoY2hpcCk7CiAJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CkBAIC02NTUsMTUgKzY1NSwxNSBAQAogCQltY3VfY250ID0gNzsKIAogCWRpdiA9IENMS19ESVZfMTsKLQl3aGlsZSAoKE4gPCBtaW5fTikgJiYgKGRpdiA8IG1heF9kaXYpKSB7Ci0JCU4gPSAoTiArIDIpICogMiAtIDI7CisJd2hpbGUgKChuIDwgbWluX24pICYmIChkaXYgPCBtYXhfZGl2KSkgeworCQluID0gKG4gKyAyKSAqIDIgLSAyOwogCQlkaXYrKzsKIAl9Ci0JZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIk4gPSAlZCwgZGl2ID0gJWRcbiIsIE4sIGRpdik7CisJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIm4gPSAlZCwgZGl2ID0gJWRcbiIsIG4sIGRpdik7CiAKIAlpZiAoY2hpcC0+c3NjX2VuKSB7CiAJCXNzY19kZXB0aCA9IDB4MDE7Ci0JCU4gLT0gMjsKKwkJbiAtPSAyOwogCX0gZWxzZSB7CiAJCXNzY19kZXB0aCA9IDA7CiAJfQpAQCAtNjc3LDcgKzY3Nyw3IEBACiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENMS19ESVYsIDB4RkYsIChkaXYgPDwgNCkgfCBtY3VfY250KTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU1NDX0NUTDEsIFNTQ19SU1RCLCAwKTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU1NDX0NUTDIsIHNzY19kZXB0aF9tYXNrLCBzc2NfZGVwdGgpOwotCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTU0NfRElWX05fMCwgMHhGRiwgTik7CisJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNTQ19ESVZfTl8wLCAweEZGLCBuKTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU1NDX0NUTDEsIFNTQ19SU1RCLCBTU0NfUlNUQik7CiAJaWYgKHNkX3ZwY2xrX3BoYXNlX3Jlc2V0KSB7CiAJCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9WUENMSzBfQ1RMLApAQCAtMTAyNywyNiArMTAyNywyNiBAQAogCiAJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyMDgpKSB7CiAJCW1hc2sgPSBDQVJEX1NIQVJFX01BU0s7Ci0JCWlmIChjYXJkID09IFNEX0NBUkQpCisJCWlmIChjYXJkID09IFNEX0NBUkQpIHsKIAkJCXZhbHVlID0gQ0FSRF9TSEFSRV80OF9TRDsKLQkJZWxzZSBpZiAoY2FyZCA9PSBNU19DQVJEKQorCQl9IGVsc2UgaWYgKGNhcmQgPT0gTVNfQ0FSRCkgewogCQkJdmFsdWUgPSBDQVJEX1NIQVJFXzQ4X01TOwotCQllbHNlIGlmIChjYXJkID09IFhEX0NBUkQpCisJCX0gZWxzZSBpZiAoY2FyZCA9PSBYRF9DQVJEKSB7CiAJCQl2YWx1ZSA9IENBUkRfU0hBUkVfNDhfWEQ7Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJcnRzeF90cmFjZShjaGlwKTsKIAkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJfSBlbHNlIGlmIChDSEVDS19QSUQoY2hpcCwgMHg1Mjg4KSkgewogCQltYXNrID0gMHgwMzsKLQkJaWYgKGNhcmQgPT0gU0RfQ0FSRCkKKwkJaWYgKGNhcmQgPT0gU0RfQ0FSRCkgewogCQkJdmFsdWUgPSBDQVJEX1NIQVJFX0JBUk9TU0FfU0Q7Ci0JCWVsc2UgaWYgKGNhcmQgPT0gTVNfQ0FSRCkKKwkJfSBlbHNlIGlmIChjYXJkID09IE1TX0NBUkQpIHsKIAkJCXZhbHVlID0gQ0FSRF9TSEFSRV9CQVJPU1NBX01TOwotCQllbHNlIGlmIChjYXJkID09IFhEX0NBUkQpCisJCX0gZWxzZSBpZiAoY2FyZCA9PSBYRF9DQVJEKSB7CiAJCQl2YWx1ZSA9IENBUkRfU0hBUkVfQkFST1NTQV9YRDsKLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQlydHN4X3RyYWNlKGNoaXApOwogCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CkBAIC0xMDY1LDcgKzEwNjUsNiBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiBpbnQgc2VsZWN0X2NhcmQoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgaW50IGNhcmQpCiB7CiAJaW50IHJldHZhbDsKQEAgLTEwNzMsMTUgKzEwNzIsMTUgQEAKIAlpZiAoY2hpcC0+Y3VyX2NhcmQgIT0gY2FyZCkgewogCQl1OCBtb2Q7CiAKLQkJaWYgKGNhcmQgPT0gU0RfQ0FSRCkKKwkJaWYgKGNhcmQgPT0gU0RfQ0FSRCkgewogCQkJbW9kID0gU0RfTU9EX1NFTDsKLQkJZWxzZSBpZiAoY2FyZCA9PSBNU19DQVJEKQorCQl9IGVsc2UgaWYgKGNhcmQgPT0gTVNfQ0FSRCkgewogCQkJbW9kID0gTVNfTU9EX1NFTDsKLQkJZWxzZSBpZiAoY2FyZCA9PSBYRF9DQVJEKQorCQl9IGVsc2UgaWYgKGNhcmQgPT0gWERfQ0FSRCkgewogCQkJbW9kID0gWERfTU9EX1NFTDsKLQkJZWxzZSBpZiAoY2FyZCA9PSBTUElfQ0FSRCkKKwkJfSBlbHNlIGlmIChjYXJkID09IFNQSV9DQVJEKSB7CiAJCQltb2QgPSBTUElfTU9EX1NFTDsKLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQlydHN4X3RyYWNlKGNoaXApOwogCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NoaXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5jCmluZGV4IGJjYzRiNjYuLmExMGRkNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5jCkBAIC03NDMsNyArNzQzLDcgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJdTggdG1wID0gKHU4KShzZF9zcGVlZF9wcmlvciA+PiAoaSo4KSk7CisJCXU4IHRtcCA9ICh1OCkoc2Rfc3BlZWRfcHJpb3IgPj4gKGkgKiA4KSk7CiAKIAkJaWYgKCh0bXAgPCAweDAxKSB8fCAodG1wID4gMHgwNCkpIHsKIAkJCWZha2VfcGFyYSA9IHRydWU7CkBAIC03NjAsNyArNzYwLDcgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJdTggdG1wID0gKHU4KShzZF9jdXJyZW50X3ByaW9yID4+IChpKjgpKTsKKwkJdTggdG1wID0gKHU4KShzZF9jdXJyZW50X3ByaW9yID4+IChpICogOCkpOwogCiAJCWlmICh0bXAgPiAweDAzKSB7CiAJCQlmYWtlX3BhcmEgPSB0cnVlOwpAQCAtMjI4OCw3ICsyMjg4LDcgQEAKIAogCXB0ciA9IGJ1ZjsKIAlyZWdfYWRkciA9IFBQQlVGX0JBU0UyOwotCWZvciAoaSA9IDA7IGkgPCBidWZfbGVuLzI1NjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGJ1Zl9sZW4gLyAyNTY7IGkrKykgewogCQlydHN4X2luaXRfY21kKGNoaXApOwogCiAJCWZvciAoaiA9IDA7IGogPCAyNTY7IGorKykKQEAgLTIzMDQsMTAgKzIzMDQsMTAgQEAKIAkJcHRyICs9IDI1NjsKIAl9CiAKLQlpZiAoYnVmX2xlbiUyNTYpIHsKKwlpZiAoYnVmX2xlbiAlIDI1NikgewogCQlydHN4X2luaXRfY21kKGNoaXApOwogCi0JCWZvciAoaiA9IDA7IGogPCBidWZfbGVuJTI1NjsgaisrKQorCQlmb3IgKGogPSAwOyBqIDwgYnVmX2xlbiAlIDI1NjsgaisrKQogCQkJcnRzeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgcmVnX2FkZHIrKywgMCwgMCk7CiAKIAkJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCAwLCAyNTApOwpAQCAtMjMxNyw3ICsyMzE3LDcgQEAKIAkJfQogCX0KIAotCW1lbWNweShwdHIsIHJ0c3hfZ2V0X2NtZF9kYXRhKGNoaXApLCBidWZfbGVuJTI1Nik7CisJbWVtY3B5KHB0ciwgcnRzeF9nZXRfY21kX2RhdGEoY2hpcCksIGJ1Zl9sZW4gJSAyNTYpOwogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtMjMzNiw3ICsyMzM2LDcgQEAKIAogCXB0ciA9IGJ1ZjsKIAlyZWdfYWRkciA9IFBQQlVGX0JBU0UyOwotCWZvciAoaSA9IDA7IGkgPCBidWZfbGVuLzI1NjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGJ1Zl9sZW4gLyAyNTY7IGkrKykgewogCQlydHN4X2luaXRfY21kKGNoaXApOwogCiAJCWZvciAoaiA9IDA7IGogPCAyNTY7IGorKykgewpAQCAtMjM1MiwxMCArMjM1MiwxMCBAQAogCQl9CiAJfQogCi0JaWYgKGJ1Zl9sZW4lMjU2KSB7CisJaWYgKGJ1Zl9sZW4gJSAyNTYpIHsKIAkJcnRzeF9pbml0X2NtZChjaGlwKTsKIAotCQlmb3IgKGogPSAwOyBqIDwgYnVmX2xlbiUyNTY7IGorKykgeworCQlmb3IgKGogPSAwOyBqIDwgYnVmX2xlbiAlIDI1NjsgaisrKSB7CiAJCQlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgcmVnX2FkZHIrKywgMHhGRiwKIAkJCQkgICAgICpwdHIpOwogCQkJcHRyKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NoaXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5oCmluZGV4IGMwODE2NGYuLmYzNjY0MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5oCkBAIC00NCw4ICs0NCwxMCBAQAogCSNkZWZpbmUgTUdfU0VUX0lDVl9TTE9XCiAJLyogSFcgbWF5IG1pc3MgRVJSL0NNRE5LIHNpZ25hbCB3aGVuIHNhbXBsaW5nIElOVCBzdGF0dXMuICovCiAJI2RlZmluZSBNU19TQU1QTEVfSU5UX0VSUgotCS8qIEhXIERPIE5PVCBzdXBwb3J0IFdhaXRfSU5UIGZ1bmN0aW9uIGR1cmluZyBSRUFEX0JZVEVTCi0JICogdHJhbnNmZXIgbW9kZSAqLworCS8qCisJICogSFcgRE8gTk9UIHN1cHBvcnQgV2FpdF9JTlQgZnVuY3Rpb24KKwkgKiBkdXJpbmcgUkVBRF9CWVRFUyB0cmFuc2ZlciBtb2RlCisJICovCiAJI2RlZmluZSBSRUFEX0JZVEVTX1dBSVRfSU5UCiAjZW5kaWYKIApAQCAtMTAxLDE4ICsxMDMsMTcgQEAKICNkZWZpbmUgVFJBTlNQT1JUX05PX1NFTlNFCTIgIC8qIENvbW1hbmQgZmFpbGVkLCBubyBhdXRvLXNlbnNlICAgICovCiAjZGVmaW5lIFRSQU5TUE9SVF9FUlJPUgkJMyAgIC8qIFRyYW5zcG9ydCBiYWQgKGkuZS4gZGV2aWNlIGRlYWQpICovCiAKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFN0YXJ0LVN0b3AtVW5pdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFN0YXJ0LVN0b3AtVW5pdAorICovCiAjZGVmaW5lIFNUT1BfTUVESVVNCQkJMHgwMCAgICAvKiBhY2Nlc3MgZGlzYWJsZSAgICAgICAgICovCiAjZGVmaW5lIE1BS0VfTUVESVVNX1JFQURZCQkweDAxICAgIC8qIGFjY2VzcyBlbmFibGUgICAgICAgICAgKi8KICNkZWZpbmUgVU5MT0FEX01FRElVTQkJCTB4MDIgICAgLyogdW5sb2FkICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBMT0FEX01FRElVTQkJCTB4MDMgICAgLyogbG9hZCAgICAgICAgICAgICAgICAgICAqLwogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgU1RBTkRBUkRfSU5RVUlSWQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNUQU5EQVJEX0lOUVVJUlkKKyAqLwogI2RlZmluZSBRVUxJRklSRSAgICAgICAgICAgICAgICAweDAwCiAjZGVmaW5lIEFFTkNfRk5DICAgICAgICAgICAgICAgIDB4MDAKICNkZWZpbmUgVFJNTF9JT1AgICAgICAgICAgICAgICAgMHgwMApAQCAtMTI5LDE3ICsxMzAsMTUgQEAKICNkZWZpbmUgUFJEQ1RfUkVWX0xFTiAgICAgICAgICAgNCAgICAgICAgICAgICAgIC8qIFByb2R1Y3QgTE9UIExlbmd0aCAgICAgICAqLwogCiAvKiBEeW5hbWljIGZsYWcgZGVmaW5pdGlvbnM6IHVzZWQgaW4gc2V0X2JpdCgpIGV0Yy4gKi8KLSNkZWZpbmUgUlRTWF9GTElEWF9UUkFOU19BQ1RJVkUJCTE4ICAvKiAweDAwMDQwMDAwICB0cmFuc2ZlciBpcyBhY3RpdmUgKi8KLSNkZWZpbmUgUlRTWF9GTElEWF9BQk9SVElORwkJMjAgIC8qIDB4MDAxMDAwMDAgYWJvcnQgaXMgaW4KLQkJCQkJICAgICAqIHByb2dyZXNzICovCi0jZGVmaW5lIFJUU1hfRkxJRFhfRElTQ09OTkVDVElORwkyMSAgLyogMHgwMDIwMDAwMCBkaXNjb25uZWN0Ci0JCQkJCSAgICAgKiBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBSVFNYX0ZMSURYX1RSQU5TX0FDVElWRQkJMTggIC8qIDB4MDAwNDAwMDAgdHJhbnNmZXIgaXMgYWN0aXZlCSAqLworI2RlZmluZSBSVFNYX0ZMSURYX0FCT1JUSU5HCQkyMCAgLyogMHgwMDEwMDAwMCBhYm9ydCBpcyBpbiBwcm9ncmVzcwkgKi8KKyNkZWZpbmUgUlRTWF9GTElEWF9ESVNDT05ORUNUSU5HCTIxICAvKiAweDAwMjAwMDAwIGRpc2Nvbm5lY3QgaW4gcHJvZ3Jlc3MgKi8KKwogI2RlZmluZSBBQk9SVElOR19PUl9ESVNDT05ORUNUSU5HCSgoMVVMIDw8IFVTX0ZMSURYX0FCT1JUSU5HKSB8IFwKIAkJCQkJICgxVUwgPDwgVVNfRkxJRFhfRElTQ09OTkVDVElORykpCi0jZGVmaW5lIFJUU1hfRkxJRFhfUkVTRVRUSU5HCQkyMiAgLyogMHgwMDQwMDAwMCBkZXZpY2UgcmVzZXQKLQkJCQkJICAgICAqIGluIHByb2dyZXNzICovCi0jZGVmaW5lIFJUU1hfRkxJRFhfVElNRURfT1VUCQkyMyAgLyogMHgwMDgwMDAwMCBTQ1NJCi0JCQkJCSAgICAgKiBtaWRsYXllciB0aW1lZCBvdXQgKi8KKworI2RlZmluZSBSVFNYX0ZMSURYX1JFU0VUVElORwkJMjIgIC8qIDB4MDA0MDAwMDAgZGV2aWNlIHJlc2V0IGluIHByb2dyZXNzICovCisjZGVmaW5lIFJUU1hfRkxJRFhfVElNRURfT1VUCQkyMyAgLyogMHgwMDgwMDAwMCBTQ1NJIG1pZGxheWVyIHRpbWVkIG91dCAgKi8KIAogI2RlZmluZSBEUkNUX0FDQ0VTU19ERVYgICAgICAgICAweDAwICAgIC8qIERpcmVjdCBBY2Nlc3MgRGV2aWNlICAgICAgKi8KICNkZWZpbmUgUk1CX0RJU0MgICAgICAgICAgICAgICAgMHg4MCAgICAvKiBUaGUgRGV2aWNlIGlzIFJlbW92YWJsZSAgICovCkBAIC0xNzQsOSArMTczLDkgQEAKICNkZWZpbmUJRklSU1RfUkVTRVQJCTB4MDEKICNkZWZpbmUJVVNFRF9FWElTVAkJMHgwMgogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgU0VOU0VfREFUQQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNFTlNFX0RBVEEKKyAqLwogLyotLS0tIHZhbGlkIC0tLS0qLwogI2RlZmluZSBTRU5TRV9WQUxJRCAgICAgICAgICAgICAweDgwICAgIC8qIFNlbnNlIGRhdGEgaXMgdmFsaWQgYXMgU0NTSTIgICAgICovCiAjZGVmaW5lIFNFTlNFX0lOVkFMSUQgICAgICAgICAgIDB4MDAgICAgLyogU2Vuc2UgZGF0YSBpcyBpbnZhbGlkIGFzIFNDU0kyICAgKi8KQEAgLTIyOCw3ICsyMjcsNiBAQAogI2RlZmluZSBBU0NRX0xPQURfRUpDVF9FUlIgICAgICAweDAwCiAjZGVmaW5lCUFTQ1FfV1JJVEVfUFJPVEVDVAkweDAwCiAKLQogc3RydWN0IHNlbnNlX2RhdGFfdCB7CiAJdW5zaWduZWQgY2hhciAgIGVycl9jb2RlOwkvKiBlcnJvciBjb2RlICovCiAJLyogYml0NyA6IHZhbGlkICovCkBAIC0yNjgsMjIgKzI2NiwyMiBAQAogI2RlZmluZSBUUklHX0RNQQkJKDB4MDEgPDwgMzEpCiAKIC8qIEJ1cyBpbnRlcnJ1cHQgcGVuZGluZyByZWdpc3RlciAqLwotI2RlZmluZSBDTURfRE9ORV9JTlQJCSgxIDw8IDMxKQotI2RlZmluZSBEQVRBX0RPTkVfSU5UCQkoMSA8PCAzMCkKLSNkZWZpbmUgVFJBTlNfT0tfSU5UCQkoMSA8PCAyOSkKLSNkZWZpbmUgVFJBTlNfRkFJTF9JTlQJCSgxIDw8IDI4KQotI2RlZmluZSBYRF9JTlQJCQkoMSA8PCAyNykKLSNkZWZpbmUgTVNfSU5UCQkJKDEgPDwgMjYpCi0jZGVmaW5lIFNEX0lOVAkJCSgxIDw8IDI1KQotI2RlZmluZSBHUElPMF9JTlQJCSgxIDw8IDI0KQotI2RlZmluZSBPQ19JTlQJCQkoMSA8PCAyMykKLSNkZWZpbmUgU0RfV1JJVEVfUFJPVEVDVAkoMSA8PCAxOSkKLSNkZWZpbmUgWERfRVhJU1QJCSgxIDw8IDE4KQotI2RlZmluZSBNU19FWElTVAkJKDEgPDwgMTcpCi0jZGVmaW5lIFNEX0VYSVNUCQkoMSA8PCAxNikKKyNkZWZpbmUgQ01EX0RPTkVfSU5UCQlCSVQoMzEpCisjZGVmaW5lIERBVEFfRE9ORV9JTlQJCUJJVCgzMCkKKyNkZWZpbmUgVFJBTlNfT0tfSU5UCQlCSVQoMjkpCisjZGVmaW5lIFRSQU5TX0ZBSUxfSU5UCQlCSVQoMjgpCisjZGVmaW5lIFhEX0lOVAkJCUJJVCgyNykKKyNkZWZpbmUgTVNfSU5UCQkJQklUKDI2KQorI2RlZmluZSBTRF9JTlQJCQlCSVQoMjUpCisjZGVmaW5lIEdQSU8wX0lOVAkJQklUKDI0KQorI2RlZmluZSBPQ19JTlQJCQlCSVQoMjMpCisjZGVmaW5lIFNEX1dSSVRFX1BST1RFQ1QJQklUKDE5KQorI2RlZmluZSBYRF9FWElTVAkJQklUKDE4KQorI2RlZmluZSBNU19FWElTVAkJQklUKDE3KQorI2RlZmluZSBTRF9FWElTVAkJQklUKDE2KQogI2RlZmluZSBERUxJTktfSU5UCQlHUElPMF9JTlQKLSNkZWZpbmUgTVNfT0NfSU5UCQkoMSA8PCAyMykKLSNkZWZpbmUgU0RfT0NfSU5UCQkoMSA8PCAyMikKKyNkZWZpbmUgTVNfT0NfSU5UCQlCSVQoMjMpCisjZGVmaW5lIFNEX09DX0lOVAkJQklUKDIyKQogCiAjZGVmaW5lIENBUkRfSU5UCQkoWERfSU5UIHwgTVNfSU5UIHwgU0RfSU5UKQogI2RlZmluZSBORUVEX0NPTVBMRVRFX0lOVAkoREFUQV9ET05FX0lOVCB8IFRSQU5TX09LX0lOVCB8IFRSQU5TX0ZBSUxfSU5UKQpAQCAtMzA1LDcgKzMwMyw2IEBACiAjZGVmaW5lIE1TX09DX0lOVF9FTgkJKDEgPDwgMjMpCiAjZGVmaW5lIFNEX09DX0lOVF9FTgkJKDEgPDwgMjIpCiAKLQogI2RlZmluZSBSRUFEX1JFR19DTUQJCTAKICNkZWZpbmUgV1JJVEVfUkVHX0NNRAkJMQogI2RlZmluZSBDSEVDS19SRUdfQ01ECQkyCkBAIC0zMTMsNyArMzEwLDYgQEAKICNkZWZpbmUgSE9TVF9UT19ERVZJQ0UJCTAKICNkZWZpbmUgREVWSUNFX1RPX0hPU1QJCTEKIAotCiAjZGVmaW5lIFJUU1hfUkVTVl9CVUZfTEVOCTQwOTYKICNkZWZpbmUgSE9TVF9DTURTX0JVRl9MRU4JMTAyNAogI2RlZmluZSBIT1NUX1NHX1RCTF9CVUZfTEVOCShSVFNYX1JFU1ZfQlVGX0xFTiAtIEhPU1RfQ01EU19CVUZfTEVOKQpAQCAtMzMyLDcgKzMyOCw2IEBACiAjZGVmaW5lIFhEX0ZSRUVfVEFCTEVfQ05UCTEyMDAKICNkZWZpbmUgTVNfRlJFRV9UQUJMRV9DTlQJNTEyCiAKLQogLyogQml0IE9wZXJhdGlvbiAqLwogI2RlZmluZSBTRVRfQklUKGRhdGEsIGlkeCkJKChkYXRhKSB8PSAxIDw8IChpZHgpKQogI2RlZmluZSBDTFJfQklUKGRhdGEsIGlkeCkJKChkYXRhKSAmPSB+KDEgPDwgKGlkeCkpKQpAQCAtNjE4LDcgKzYxMyw2IEBACiAJaW50IHNwaV9jbG9jazsKIH07CiAKLQogI2lmZGVmIF9NU0dfVFJBQ0UKIHN0cnVjdCB0cmFjZV9tc2dfdCB7CiAJdTE2IGxpbmU7CkBAIC02ODksNyArNjgzLDcgQEAKICNkZWZpbmUgQ0xSX1NESU9fSUdOT1JFRChjaGlwKQkJKChjaGlwKS0+c2Rpb19mdW5jX2V4aXN0ICY9IH5TRElPX0lHTk9SRUQpCiAKIHN0cnVjdCBydHN4X2NoaXAgewotCXJ0c3hfZGV2X3QJKnJ0c3g7CisJc3RydWN0IHJ0c3hfZGV2CSpydHN4OwogCiAJdTMyCQlpbnRfcmVnOyAvKiBCdXMgaW50ZXJydXB0IHBlbmRpbmcgcmVnaXN0ZXIgKi8KIAljaGFyCQltYXhfbHVuOwpAQCAtNzEyLDkgKzcwNiw5IEBACiAJaW50CQkJY3VyX2NhcmQ7CiAKIAl1bnNpZ25lZCBsb25nCW5lZWRfcmVsZWFzZTsJCS8qIG5lZWQgcmVsZWFzZSBiaXQgbWFwICovCi0JdW5zaWduZWQgbG9uZwluZWVkX3Jlc2V0OwkJLyogbmVlZCByZXNldAotCQkJCQkJICogYml0IG1hcCAqLwotCS8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGNhcmQgaXMganVzdCByZXN1bWVkIGZyb20gU1Mgc3RhdGUsCisJdW5zaWduZWQgbG9uZwluZWVkX3Jlc2V0OwkJLyogbmVlZCByZXNldCBiaXQgbWFwICovCisJLyoKKwkgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhpcyBjYXJkIGlzIGp1c3QgcmVzdW1lZCBmcm9tIFNTIHN0YXRlLAogCSAqIGFuZCBuZWVkIHJlbGVhc2VkIGJlZm9yZSBiZWluZyByZXNldHRlZAogCSAqLwogCXVuc2lnbmVkIGxvbmcJCW5lZWRfcmVpbml0OwpAQCAtNzMyLDggKzcyNiwxMCBAQAogCXU4CWNhcmRfZWplY3RlZDsJLyogY2FyZCBlamVjdGVkIGJpdCBtYXAgKi8KIAl1OAljYXJkX3dwOwkvKiBjYXJkIHdyaXRlIHByb3RlY3RlZCBiaXQgbWFwICovCiAKLQl1OAlsdW5fbWM7CQkvKiBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdG8gYW5zd2VyCi0JCQkJICogTWVkaWFDaGFuZ2UgKi8KKwl1OAlsdW5fbWM7CQkvKgorCQkJCSAqIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0byBhbnN3ZXIKKwkJCQkgKiBNZWRpYUNoYW5nZQorCQkJCSAqLwogCiAjaWZuZGVmIExFRF9BVVRPX0JMSU5LCiAJaW50CQkJbGVkX3RvZ2dsZV9jb3VudGVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9zY3NpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3Njc2kuYwppbmRleCBkMjAzMTA0Li5iZWNiNGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3Njc2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3Njc2kuYwpAQCAtNDg0LDE0ICs0ODQsMTQgQEAKIAl1OCBjYXJkID0gZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bik7CiAJYm9vbCBwcm9fZm9ybWF0dGVyX2ZsYWcgPSBmYWxzZTsKIAl1bnNpZ25lZCBjaGFyIGlucXVpcnlfYnVmW10gPSB7Ci0JCVFVTElGSVJFfERSQ1RfQUNDRVNTX0RFViwKLQkJUk1CX0RJU0N8MHgwRCwKKwkJUVVMSUZJUkUgfCBEUkNUX0FDQ0VTU19ERVYsCisJCVJNQl9ESVNDIHwgMHgwRCwKIAkJMHgwMCwKIAkJMHgwMSwKIAkJMHgxZiwKIAkJMHgwMiwKIAkJMCwKLQkJUkVMX0FEUnxXQlVTXzMyfFdCVVNfMTZ8U1lOQ3xMSU5LRUR8Q01EX1FVRXxTRlRfUkUsCisJCVJFTF9BRFIgfCBXQlVTXzMyIHwgV0JVU18xNiB8IFNZTkMgfCBMSU5LRUQgfCBDTURfUVVFIHwgU0ZUX1JFLAogCX07CiAKIAlpZiAoQ0hFQ0tfTFVOX01PREUoY2hpcCwgU0RfTVNfMkxVTikpIHsKQEAgLTU1OCw3ICs1NTgsNiBAQAogCXJldHVybiBUUkFOU1BPUlRfR09PRDsKIH0KIAotCiBzdGF0aWMgaW50IHN0YXJ0X3N0b3BfdW5pdChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJdW5zaWduZWQgaW50IGx1biA9IFNDU0lfTFVOKHNyYik7CkBAIC01OTQsNyArNTkzLDYgQEAKIAlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOwogfQogCi0KIHN0YXRpYyBpbnQgYWxsb3dfbWVkaXVtX3JlbW92YWwoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewogCWludCBwcmV2ZW50OwpAQCAtNjEzLDcgKzYxMSw2IEBACiAJcmV0dXJuIFRSQU5TUE9SVF9HT09EOwogfQogCi0KIHN0YXRpYyBpbnQgcmVxdWVzdF9zZW5zZShzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJc3RydWN0IHNlbnNlX2RhdGFfdCAqc2Vuc2U7CkBAIC0xNDAwLDcgKzEzOTcsNyBAQAogCWJ1Zl9sZW4gPSA0ICsgKCgyICsgTVNHX0ZVTkNfTEVOICsgTVNHX0ZJTEVfTEVOICsgVElNRV9WQUxfTEVOKSAqCiAJCVRSQUNFX0lURU1fQ05UKTsKIAotCWlmICgoc2NzaV9idWZmbGVuKHNyYikgPCBidWZfbGVuKSB8fCAoc2NzaV9zZ2xpc3Qoc3JiKSA9PSBOVUxMKSkgeworCWlmICgoc2NzaV9idWZmbGVuKHNyYikgPCBidWZfbGVuKSB8fCAhc2NzaV9zZ2xpc3Qoc3JiKSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwogCQlydHN4X3RyYWNlKGNoaXApOwpAQCAtMTUyMSw3ICsxNTE4LDcgQEAKIAogc3RhdGljIGludCBzZXRfdmFyaWFibGUoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewotCXVuc2lnbmVkIGx1biA9IFNDU0lfTFVOKHNyYik7CisJdW5zaWduZWQgaW50IGx1biA9IFNDU0lfTFVOKHNyYik7CiAKIAlpZiAoc3JiLT5jbW5kWzNdID09IDEpIHsKIAkJLyogVmFyaWFibGUgQ2xvY2sgKi8KQEAgLTE5ODksOCArMTk4Niw4IEBACiAJCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCQl9CiAKLQkJCWJ1ZlsyKmldID0gKHU4KSh2YWwgPj4gOCk7Ci0JCQlidWZbMippKzFdID0gKHU4KXZhbDsKKwkJCWJ1ZlsyICogaV0gPSAodTgpKHZhbCA+PiA4KTsKKwkJCWJ1ZlsyICogaSArIDFdID0gKHU4KXZhbDsKIAkJfQogCiAJCWxlbiA9ICh1bnNpZ25lZCBzaG9ydCltaW5fdCh1bnNpZ25lZCBpbnQsIHNjc2lfYnVmZmxlbihzcmIpLApAQCAtMjA0OCw3ICsyMDQ1LDcgQEAKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBsZW4gLyAyOyBpKyspIHsKLQkJCXZhbCA9ICgodTE2KWJ1ZlsyKmldIDw8IDgpIHwgYnVmWzIqaSsxXTsKKwkJCXZhbCA9ICgodTE2KWJ1ZlsyICogaV0gPDwgOCkgfCBidWZbMiAqIGkgKyAxXTsKIAkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcGh5X3JlZ2lzdGVyKGNoaXAsIGFkZHIgKyBpLCB2YWwpOwogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXZmcmVlKGJ1Zik7CkBAIC0yNjA0LDcgKzI2MDEsNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLQogc3RhdGljIGludCByZWFkX3N0YXR1cyhzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJdTggcnRzeF9zdGF0dXNbMTZdOwpAQCAtMzA3MSwxOCArMzA2NywxOCBAQAogCWJ1ZltpKytdID0gMHg4MDsKIAlpZiAoKGRldl9pbmZvX2lkID09IDB4MTApIHx8IChkZXZfaW5mb19pZCA9PSAweDEzKSkgewogCQkvKiBTeXN0ZW0gSW5mb3JtYXRpb24gKi8KLQkJbWVtY3B5KGJ1ZitpLCBtc19jYXJkLT5yYXdfc3lzX2luZm8sIDk2KTsKKwkJbWVtY3B5KGJ1ZiArIGksIG1zX2NhcmQtPnJhd19zeXNfaW5mbywgOTYpOwogCX0gZWxzZSB7CiAJCS8qIE1vZGVsIE5hbWUgKi8KLQkJbWVtY3B5KGJ1ZitpLCBtc19jYXJkLT5yYXdfbW9kZWxfbmFtZSwgNDgpOworCQltZW1jcHkoYnVmICsgaSwgbXNfY2FyZC0+cmF3X21vZGVsX25hbWUsIDQ4KTsKIAl9CiAKIAlydHN4X3N0b3Jfc2V0X3hmZXJfYnVmKGJ1ZiwgYnVmX2xlbiwgc3JiKTsKIAogCWlmIChkZXZfaW5mb19pZCA9PSAweDE1KQotCQlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpLTB4M0MpOworCQlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpIC0gMHgzQyk7CiAJZWxzZQotCQlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpLTB4NkMpOworCQlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpIC0gMHg2Qyk7CiAKIAlrZnJlZShidWYpOwogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfc3lzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3N5cy5oCmluZGV4IDBiNmI0ZDQuLmY0OWJlZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfc3lzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9zeXMuaApAQCAtMjgsOCArMjgsNiBAQAogI2luY2x1ZGUgInJ0c3hfY2hpcC5oIgogI2luY2x1ZGUgInJ0c3hfY2FyZC5oIgogCi10eXBlZGVmIGRtYV9hZGRyX3QgVUxPTkdfUFRSOwotCiBzdGF0aWMgaW5saW5lIHZvaWQgcnRzeF9leGNsdXNpdmVfZW50ZXJfc3Moc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKIAlzdHJ1Y3QgcnRzeF9kZXYgKmRldiA9IGNoaXAtPnJ0c3g7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3RyYW5zcG9ydC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF90cmFuc3BvcnQuaAppbmRleCA4OTliYzIwLi40NzkxMzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3RyYW5zcG9ydC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfdHJhbnNwb3J0LmgKQEAgLTM4LDcgKzM4LDYgQEAKIAl1bnNpZ25lZCBpbnQgYnVmbGVuLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpOwogdm9pZCBydHN4X2ludm9rZV90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKTsKIAotCiAjZGVmaW5lIHJ0c3hfaW5pdF9jbWQoY2hpcCkJCQkoKGNoaXApLT5jaSA9IDApCiAKIHZvaWQgcnRzeF9hZGRfY21kKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc2QuYwppbmRleCA2MjE5ZTA0Li5iMGJiYjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3NkLmMKQEAgLTE0MjgsNyArMTQyOCw2IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0KIAkJaWYgKGZ1bmNfdG9fc3dpdGNoKQogCQkJYnJlYWs7CiAKQEAgLTE0MzcsOSArMTQzNiw5IEBACiAJCWZ1bmNfdG9fc3dpdGNoKTsKIAogI2lmZGVmIFNVUFBPUlRfU0RfTE9DSwotCWlmICgoc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJiBTRF9TRFJfUlNUKQotCQkJJiYgKEREUjUwX1NVUFBPUlQgPT0gZnVuY190b19zd2l0Y2gpCi0JCQkmJiAoc2RfY2FyZC0+ZnVuY19ncm91cDFfbWFzayAmIFNEUjUwX1NVUFBPUlRfTUFTSykpIHsKKwlpZiAoKHNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzICYgU0RfU0RSX1JTVCkgJiYKKwkgICAgKGZ1bmNfdG9fc3dpdGNoID09IEREUjUwX1NVUFBPUlQpICYmCisJICAgIChzZF9jYXJkLT5mdW5jX2dyb3VwMV9tYXNrICYgU0RSNTBfU1VQUE9SVF9NQVNLKSkgewogCQlmdW5jX3RvX3N3aXRjaCA9IFNEUjUwX1NVUFBPUlQ7CiAJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJVc2luZyBTRFI1MCBpbnN0ZWFkIG9mIEREUjUwIGZvciBTRCBMb2NrXG4iKTsKIAl9CkBAIC0yNTg5LDE2ICsyNTg4LDEyIEBACiAjZW5kaWYKIAogCXJldHZhbCA9IHNkX3ByZXBhcmVfcmVzZXQoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAlyZXR2YWwgPSBzZF9kdW1teV9jbG9jayhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKLQl9CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJZ290byBTdGF0dXNfRmFpbDsKIAogCWlmIChDSEtfU0RJT19FWElTVChjaGlwKSAmJiAhQ0hLX1NESU9fSUdOT1JFRChjaGlwKSAmJiB0cnlfc2RpbykgewogCQlpbnQgcnR5X2NudCA9IDA7CkBAIC0yNjA2LDggKzI2MDEsNyBAQAogCQlmb3IgKDsgcnR5X2NudCA8IGNoaXAtPnNkaW9fcmV0cnlfY250OyBydHlfY250KyspIHsKIAkJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBTRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9OT19DQVJEKTsKLQkJCQlydHN4X3RyYWNlKGNoaXApOwotCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQlnb3RvIFN0YXR1c19GYWlsOwogCQkJfQogCiAJCQlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIElPX1NFTkRfT1BfQ09ORCwgMCwKQEAgLTI2MTksOCArMjYxMyw3IEBACiAJCQkJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJTRF9JTyBjYXJkIChGdW5jdGlvbiBudW1iZXI6ICVkKSFcbiIsCiAJCQkJCQlmdW5jX251bSk7CiAJCQkJCWNoaXAtPnNkX2lvID0gMTsKLQkJCQkJcnRzeF90cmFjZShjaGlwKTsKLQkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCQlnb3RvIFN0YXR1c19GYWlsOwogCQkJCX0KIAogCQkJCWJyZWFrOwpAQCAtMjYzOCwxMCArMjYzMSw4IEBACiBSVFlfU0RfUlNUOgogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgR09fSURMRV9TVEFURSwgMCwgU0RfUlNQX1RZUEVfUjAsCiAJCQkJTlVMTCwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAl3YWl0X3RpbWVvdXQoMjApOwogCkBAIC0yNjU5LDEwICsyNjUwLDggQEAKIAogCQlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEdPX0lETEVfU1RBVEUsIDAsCiAJCQkJCVNEX1JTUF9UWVBFX1IwLCBOVUxMLCAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJcnRzeF90cmFjZShjaGlwKTsKLQkJCXJldHVybiBTVEFUVVNfRkFJTDsKLQkJfQorCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJZ290byBTdGF0dXNfRmFpbDsKIAogCQl3YWl0X3RpbWVvdXQoMjApOwogCX0KQEAgLTI2NzMsMzkgKzI2NjIsMzIgQEAKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFNEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX05PX0NBUkQpOwotCQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAJCQl9CiAKIAkJCWorKzsKLQkJCWlmIChqIDwgMykgeworCQkJaWYgKGogPCAzKQogCQkJCWdvdG8gUlRZX1NEX1JTVDsKLQkJCX0gZWxzZSB7Ci0JCQkJcnRzeF90cmFjZShjaGlwKTsKLQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JCQl9CisJCQllbHNlCisJCQkJZ290byBTdGF0dXNfRmFpbDsKIAkJfQogCiAJCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0RfQVBQX09QX0NPTkQsIHZvbHRhZ2UsCiAJCQkJCVNEX1JTUF9UWVBFX1IzLCByc3AsIDUpOwogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQlrKys7Ci0JCQlpZiAoayA8IDMpIHsKKwkJCWlmIChrIDwgMykKIAkJCQlnb3RvIFJUWV9TRF9SU1Q7Ci0JCQl9IGVsc2UgewotCQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCQkJfQorCQkJZWxzZQorCQkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAJCX0KIAogCQlpKys7CiAJCXdhaXRfdGltZW91dCgyMCk7CiAJfSB3aGlsZSAoIShyc3BbMV0gJiAweDgwKSAmJiAoaSA8IDI1NSkpOwogCi0JaWYgKGkgPT0gMjU1KSB7Ci0JCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKLQl9CisJaWYgKGkgPT0gMjU1KQorCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJaWYgKGhpX2NhcF9mbG93KSB7CiAJCWlmIChyc3BbMV0gJiAweDQwKQpAQCAtMjcyMiwyNiArMjcwNCwyMCBAQAogCiAJaWYgKHN1cHBvcnRfMXY4KSB7CiAJCXJldHZhbCA9IHNkX3ZvbHRhZ2Vfc3dpdGNoKGNoaXApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQlydHN4X3RyYWNlKGNoaXApOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCQl9CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlnb3RvIFN0YXR1c19GYWlsOwogCX0KIAogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgQUxMX1NFTkRfQ0lELCAwLCBTRF9SU1BfVFlQRV9SMiwKIAkJCQlOVUxMLCAwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKLQl9CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJZ290byBTdGF0dXNfRmFpbDsKIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRU5EX1JFTEFUSVZFX0FERFIsIDAsCiAJCQkJCVNEX1JTUF9UWVBFX1I2LCByc3AsIDUpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQlydHN4X3RyYWNlKGNoaXApOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCQl9CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJCXNkX2NhcmQtPnNkX2FkZHIgPSAodTMyKXJzcFsxXSA8PCAyNDsKIAkJc2RfY2FyZC0+c2RfYWRkciArPSAodTMyKXJzcFsyXSA8PCAxNjsKQEAgLTI3NTEsMjQgKzI3MjcsMTggQEAKIAl9CiAKIAlyZXR2YWwgPSBzZF9jaGVja19jc2QoY2hpcCwgMSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAlyZXR2YWwgPSBzZF9zZWxlY3RfY2FyZChjaGlwLCAxKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKLQl9CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJZ290byBTdGF0dXNfRmFpbDsKIAogI2lmZGVmIFNVUFBPUlRfU0RfTE9DSwogU0RfVU5MT0NLX0VOVFJZOgogCXJldHZhbCA9IHNkX3VwZGF0ZV9sb2NrX3N0YXR1cyhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKLQl9CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJZ290byBTdGF0dXNfRmFpbDsKIAogCWlmIChzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyAmIFNEX0xPQ0tFRCkgewogCQlzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyB8PSAoU0RfTE9DS18xQklUX01PREUgfCBTRF9QV0RfRVhJU1QpOwpAQCAtMjc4MCwzMiArMjc1MCwyNCBAQAogCiAJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBUFBfQ01ELCBzZF9jYXJkLT5zZF9hZGRyLAogCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKLQl9CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJZ290byBTdGF0dXNfRmFpbDsKIAogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VUX0NMUl9DQVJEX0RFVEVDVCwgMCwKIAkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAlpZiAoc3VwcG9ydF8xdjgpIHsKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBUFBfQ01ELCBzZF9jYXJkLT5zZF9hZGRyLAogCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JCX0KKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRVRfQlVTX1dJRFRILCAyLAogCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JCX0KKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAkJc3dpdGNoX2J1c193aWR0aCA9IFNEX0JVU19XSURUSF80OwogCX0gZWxzZSB7CkBAIC0yODE0LDE2ICsyNzc2LDEyIEBACiAKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFVF9CTE9DS0xFTiwgMHgyMDAsIFNEX1JTUF9UWVBFX1IxLAogCQkJCU5VTEwsIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJcnRzeF90cmFjZShjaGlwKTsKLQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCX0KKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJcmV0dmFsID0gc2Rfc2V0X2Nsb2NrX2RpdmlkZXIoY2hpcCwgU0RfQ0xLX0RJVklERV8wKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKLQl9CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJZ290byBTdGF0dXNfRmFpbDsKIAogCWlmICghKHNkX2NhcmQtPnJhd19jc2RbNF0gJiAweDQwKSkKIAkJc2RfZG9udF9zd2l0Y2ggPSB0cnVlOwpAQCAtMjg2MiwxNyArMjgyMCwxMyBAQAogCWlmICghc3VwcG9ydF8xdjgpIHsKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBUFBfQ01ELCBzZF9jYXJkLT5zZF9hZGRyLAogCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JCX0KKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRVRfQlVTX1dJRFRILCAyLAogCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JCX0KKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAJfQogCiAjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCkBAIC0yODkwLDEwICsyODQ0LDggQEAKIAkJfQogCiAJCXJldHZhbCA9IHNkX3NldF9pbml0X3BhcmEoY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JCX0KKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAkJaWYgKENIS19TRF9ERFI1MChzZF9jYXJkKSkKIAkJCXJldHZhbCA9IHNkX2Rkcl90dW5pbmcoY2hpcCk7CkBAIC0yOTAyLDE0ICsyODU0LDExIEBACiAKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJaWYgKHNkMjBfbW9kZSkgewotCQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAJCQl9IGVsc2UgewogCQkJCXJldHZhbCA9IHNkX2luaXRfcG93ZXIoY2hpcCk7Ci0JCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJCQlydHN4X3RyYWNlKGNoaXApOwotCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JCQkJfQorCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAkJCQl0cnlfc2RpbyA9IGZhbHNlOwogCQkJCXNkMjBfbW9kZSA9IHRydWU7CkBAIC0yOTMwLDE0ICsyODc5LDExIEBACiAJCQlyZXR2YWwgPSBzZF9yZWFkX2xiYTAoY2hpcCk7CiAJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJaWYgKHNkMjBfbW9kZSkgewotCQkJCQlydHN4X3RyYWNlKGNoaXApOwotCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAJCQkJfSBlbHNlIHsKIAkJCQkJcmV0dmFsID0gc2RfaW5pdF9wb3dlcihjaGlwKTsKLQkJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJCQkJcnRzeF90cmFjZShjaGlwKTsKLQkJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKLQkJCQkJfQorCQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCQkJZ290byBTdGF0dXNfRmFpbDsKIAogCQkJCQl0cnlfc2RpbyA9IGZhbHNlOwogCQkJCQlzZDIwX21vZGUgPSB0cnVlOwpAQCAtMjk0OCwxMCArMjg5NCw4IEBACiAJfQogCiAJcmV0dmFsID0gc2RfY2hlY2tfd3Bfc3RhdGUoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAljaGlwLT5jYXJkX2J1c193aWR0aFtjaGlwLT5jYXJkMmx1bltTRF9DQVJEXV0gPSA0OwogCkBAIC0yOTczLDggKzI5MTcsMTEgQEAKICNlbmRpZgogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQogCitTdGF0dXNfRmFpbDoKKwlydHN4X3RyYWNlKGNoaXApOworCXJldHVybiBTVEFUVVNfRkFJTDsKK30KIAogc3RhdGljIGludCBtbWNfdGVzdF9zd2l0Y2hfYnVzKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IHdpZHRoKQogewpAQCAtMzEwNSw3ICszMDUyLDYgQEAKIAlyZXR1cm4gU1dJVENIX0ZBSUw7CiB9CiAKLQogc3RhdGljIGludCBtbWNfc3dpdGNoX3RpbWluZ19idXMoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgYm9vbCBzd2l0Y2hfZGRyKQogewogCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKQEAgLTMyMzAsNyArMzE3Niw2IEBACiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi0KIHN0YXRpYyBpbnQgcmVzZXRfbW1jKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc3BpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zcGkuYwppbmRleCAyNmViMmExLi4xM2M1MzljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zcGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zcGkuYwpAQCAtMzksNyArMzksOCBAQAogCWludCByZXR2YWw7CiAKIAlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNQSV9DT05UUk9MLCAweEZGLAotCQkJCSAgICAgQ1NfUE9MQVJJVFlfTE9XIHwgRFRPX01TQl9GSVJTVCB8IFNQSV9NQVNURVIgfCBTUElfTU9ERTAgfCBTUElfQVVUTyk7CisJCQkJICAgICBDU19QT0xBUklUWV9MT1cgfCBEVE9fTVNCX0ZJUlNUCisJCQkJICAgICB8IFNQSV9NQVNURVIgfCBTUElfTU9ERTAgfCBTUElfQVVUTyk7CiAJaWYgKHJldHZhbCkgewogCQlydHN4X3RyYWNlKGNoaXApOwogCQlyZXR1cm4gcmV0dmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc3BpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zcGkuaAppbmRleCBmYzgyNGI1Li5jOGQyYmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zcGkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zcGkuaApAQCAtNjEsNSArNjEsNCBAQAogaW50IHNwaV9lcmFzZV9mbGFzaChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXApOwogaW50IHNwaV93cml0ZV9mbGFzaF9zdGF0dXMoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKTsKIAotCiAjZW5kaWYgIC8qIF9fUkVBTFRFS19SVFNYX1NQSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC94ZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgveGQuYwppbmRleCBmYzFkZmUwLi4xZGUwMmJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC94ZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3hkLmMKQEAgLTgzNCw3ICs4MzQsNiBAQAogCQkhPSAoWERfRUNDMV9BTEwxIHwgWERfRUNDMl9BTEwxKSkKIAkJcmV0dXJuIDA7CiAKLQogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJaWYgKHJlZHVudFtSRVNFUlZFRDAgKyBpXSAhPSAweEZGKQogCQkJcmV0dXJuIDA7CkBAIC05MzgsNyArOTM3LDcgQEAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiU2V0IHVudXNlZCBibG9jayB0byBpbmRleCAlZFxuIiwKIAkJem9uZS0+c2V0X2luZGV4KTsKIAotCXpvbmUtPmZyZWVfdGFibGVbem9uZS0+c2V0X2luZGV4KytdID0gKHUxNikgKHBoeV9ibGsgJiAweDNmZik7CisJem9uZS0+ZnJlZV90YWJsZVt6b25lLT5zZXRfaW5kZXgrK10gPSAodTE2KShwaHlfYmxrICYgMHgzZmYpOwogCWlmICh6b25lLT5zZXRfaW5kZXggPj0gWERfRlJFRV9UQUJMRV9DTlQpCiAJCXpvbmUtPnNldF9pbmRleCA9IDA7CiAJem9uZS0+dW51c2VkX2Jsa19jbnQrKzsKQEAgLTE0MDIsNyArMTQwMSw2IEBACiAJcmV0dXJuIFNUQVRVU19GQUlMOwogfQogCi0KIHN0YXRpYyBpbnQgeGRfYnVpbGRfbDJwX3RibChzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCBpbnQgem9uZV9ubykKIHsKIAlzdHJ1Y3QgeGRfaW5mbyAqeGRfY2FyZCA9ICYoY2hpcC0+eGRfY2FyZCk7CkBAIC0xNjI0LDEwICsxNjIyLDggQEAKIAl1OCByZWdfdmFsLCBwYWdlX2NudDsKIAlpbnQgem9uZV9ubywgcmV0dmFsLCBpOwogCi0JaWYgKHN0YXJ0X3BhZ2UgPiBlbmRfcGFnZSkgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChzdGFydF9wYWdlID4gZW5kX3BhZ2UpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAlwYWdlX2NudCA9IGVuZF9wYWdlIC0gc3RhcnRfcGFnZTsKIAl6b25lX25vID0gKGludCkobG9nX2JsayAvIDEwMDApOwpAQCAtMTY0Myw4ICsxNjM5LDcgQEAKIAogCQkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFhEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX05PX0NBUkQpOwotCQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAJCQl9CiAJCX0KIAl9CkBAIC0xNjc5LDggKzE2NzQsNyBAQAogCiAJCWlmIChyZXR2YWwgPT0gLUVUSU1FRE9VVCkgewogCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX1RPX0VSUk9SKTsKLQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQlnb3RvIFN0YXR1c19GYWlsOwogCQl9IGVsc2UgewogCQkJcnRzeF90cmFjZShjaGlwKTsKIAkJCWdvdG8gRmFpbDsKQEAgLTE3MTMsOCArMTcwNyw3IEBACiAKIAkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFhEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfTk9fQ0FSRCk7Ci0JCQlydHN4X3RyYWNlKGNoaXApOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJZ290byBTdGF0dXNfRmFpbDsKIAkJfQogCiAJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9FQ0NfRVJST1IpOwpAQCAtMTcyMiw4ICsxNzE1LDcgQEAKIAkJbmV3X2JsayA9IHhkX2dldF91bnVzZWRfYmxvY2soY2hpcCwgem9uZV9ubyk7CiAJCWlmIChuZXdfYmxrID09IE5PX05FV19CTEspIHsKIAkJCVhEX0NMUl9CQURfT0xEQkxLKHhkX2NhcmQpOwotCQkJcnRzeF90cmFjZShjaGlwKTsKLQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAJCX0KIAogCQlyZXR2YWwgPSB4ZF9jb3B5X3BhZ2UoY2hpcCwgcGh5X2JsaywgbmV3X2JsaywgMCwKQEAgLTE3MzcsOCArMTcyOSw3IEBACiAJCQkJWERfQ0xSX0JBRF9ORVdCTEsoeGRfY2FyZCk7CiAJCQl9CiAJCQlYRF9DTFJfQkFEX09MREJMSyh4ZF9jYXJkKTsKLQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQlnb3RvIFN0YXR1c19GYWlsOwogCQl9CiAJCXhkX3NldF9sMnBfdGJsKGNoaXAsIHpvbmVfbm8sIGxvZ19vZmYsICh1MTYpKG5ld19ibGsgJiAweDNGRikpOwogCQl4ZF9lcmFzZV9ibG9jayhjaGlwLCBwaHlfYmxrKTsKQEAgLTE3NDYsNiArMTczNyw3IEBACiAJCVhEX0NMUl9CQURfT0xEQkxLKHhkX2NhcmQpOwogCX0KIAorU3RhdHVzX0ZhaWw6CiAJcnRzeF90cmFjZShjaGlwKTsKIAlyZXR1cm4gU1RBVFVTX0ZBSUw7CiB9CkBAIC0xODMwLDcgKzE4MjIsNiBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiBzdGF0aWMgaW50IHhkX3dyaXRlX211bHRpcGxlX3BhZ2VzKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHUzMiBvbGRfYmxrLAogCQkJCXUzMiBuZXdfYmxrLCB1MzIgbG9nX2JsaywgdTggc3RhcnRfcGFnZSwKIAkJCQl1OCBlbmRfcGFnZSwgdTggKmJ1ZiwgdW5zaWduZWQgaW50ICppbmRleCwKQEAgLTE4NDUsMTAgKzE4MzYsOCBAQAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICIlcywgb2xkX2JsayA9IDB4JXgsIG5ld19ibGsgPSAweCV4LCBsb2dfYmxrID0gMHgleFxuIiwKIAkJX19mdW5jX18sIG9sZF9ibGssIG5ld19ibGssIGxvZ19ibGspOwogCi0JaWYgKHN0YXJ0X3BhZ2UgPiBlbmRfcGFnZSkgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChzdGFydF9wYWdlID4gZW5kX3BhZ2UpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAlwYWdlX2NudCA9IGVuZF9wYWdlIC0gc3RhcnRfcGFnZTsKIAl6b25lX25vID0gKGludCkobG9nX2JsayAvIDEwMDApOwpAQCAtMTg1NywxMCArMTg0Niw4IEBACiAJcGFnZV9hZGRyID0gKG5ld19ibGsgPDwgeGRfY2FyZC0+YmxvY2tfc2hpZnQpICsgc3RhcnRfcGFnZTsKIAogCXJldHZhbCA9IHhkX3NlbmRfY21kKGNoaXAsIFJFQUQxXzEpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJcnRzeF90cmFjZShjaGlwKTsKLQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCX0KKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJcnRzeF9pbml0X2NtZChjaGlwKTsKIApAQCAtMTg5NSw4ICsxODgyLDcgQEAKIAogCQlpZiAocmV0dmFsID09IC1FVElNRURPVVQpIHsKIAkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9UT19FUlJPUik7Ci0JCQlydHN4X3RyYWNlKGNoaXApOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJZ290byBTdGF0dXNfRmFpbDsKIAkJfSBlbHNlIHsKIAkJCXJ0c3hfdHJhY2UoY2hpcCk7CiAJCQlnb3RvIEZhaWw7CkBAIC0xOTM2LDYgKzE5MjIsNyBAQAogCQl4ZF9tYXJrX2JhZF9ibG9jayhjaGlwLCBuZXdfYmxrKTsKIAl9CiAKK1N0YXR1c19GYWlsOgogCXJ0c3hfdHJhY2UoY2hpcCk7CiAJcmV0dXJuIFNUQVRVU19GQUlMOwogfQpAQCAtMjAwMCw3ICsxOTg3LDYgQEAKIAkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAotCiAJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFhEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCWNoaXAtPmNhcmRfZmFpbCB8PSBYRF9DQVJEOwogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpYy5oIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpYy5oCmluZGV4IGNjMGFmZWUuLjQyMDU0NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljLmgKQEAgLTkyLDYgKzkyLDcgQEAKIAl1MzIgICAgIGxhc3R0aW1lOwogCXUzMiAgICAgbGFzdGlkOwogfTsKKwogLyoKICAqIFNMSUMgSGFuZGxlIHN0cnVjdHVyZS4gIFVzZWQgdG8gcmVzdHJpY3QgaGFuZGxlIHZhbHVlcyB0bwogICogMzIgYml0cyBieSB1c2luZyBhbiBpbmRleCByYXRoZXIgdGhhbiBhbiBhZGRyZXNzLgpAQCAtMjIzLDggKzIyNCw4IEBACiAKIHN0cnVjdCBzbGljX2lmYWNlX3N0YXRzIHsKIAkvKgotCSogU3RhdHMKLQkqLworCSAqIFN0YXRzCisJICovCiAJdTY0ICAgICAgICB4bXRfYnl0ZXM7CiAJdTY0ICAgICAgICB4bXRfdWNhc3Q7CiAJdTY0ICAgICAgICB4bXRfbWNhc3Q7CkBAIC0zNTEsMTAgKzM1MiwzNSBAQAogCXVpbnQgICAgICAgICAgICAgICAgIGNhcmRudW1pbnVzZVtTTElDX01BWF9DQVJEU107CiB9OwogCi1zdHJ1Y3Qgc2xpY19zaG1lbSB7Ci0Jdm9sYXRpbGUgdTMyICAgICAgICAgIGlzcjsKLQl2b2xhdGlsZSB1MzIgICAgICAgICAgbGlua3N0YXR1czsKLQl2b2xhdGlsZSBzdHJ1Y3Qgc2xpY19zdGF0cyAgICAgaW5pY3N0YXRzOworc3RydWN0IHNsaWNfc3RhdHMgeworCS8qIHhtaXQgc3RhdHMgKi8KKwl1NjQgeG1pdF90Y3BfYnl0ZXM7CisJdTY0IHhtaXRfdGNwX3NlZ3M7CisJdTY0IHhtaXRfYnl0ZXM7CisJdTY0IHhtaXRfY29sbGlzaW9uczsKKwl1NjQgeG1pdF91bmljYXN0czsKKwl1NjQgeG1pdF9vdGhlcl9lcnJvcjsKKwl1NjQgeG1pdF9leGNlc3NfY29sbGlzaW9uczsKKwkvKiByY3Ygc3RhdHMgKi8KKwl1NjQgcmN2X3RjcF9ieXRlczsKKwl1NjQgcmN2X3RjcF9zZWdzOworCXU2NCByY3ZfYnl0ZXM7CisJdTY0IHJjdl91bmljYXN0czsKKwl1NjQgcmN2X290aGVyX2Vycm9yOworCXU2NCByY3ZfZHJvcHM7Cit9OworCitzdHJ1Y3Qgc2xpY19zaG1lbV9kYXRhIHsKKwl1MzIgaXNyOworCXUzMiBsbmtzdGF0dXM7CisJc3RydWN0IHNsaWNfc3RhdHMgc3RhdHM7Cit9OworCitzdHJ1Y3Qgc2xpY19zaG1lbW9yeSB7CisJZG1hX2FkZHJfdCBpc3JfcGhhZGRyOworCWRtYV9hZGRyX3QgbG5rc3RhdHVzX3BoYWRkcjsKKwlkbWFfYWRkcl90IHN0YXRzX3BoYWRkcjsKKwlzdHJ1Y3Qgc2xpY19zaG1lbV9kYXRhIF9faW9tZW0gKnNobWVtX2RhdGE7CiB9OwogCiBzdHJ1Y3Qgc2xpY191cHIgewpAQCAtNDE0LDEwICs0NDAsOSBAQAogCXUzMiAgICAgICAgICAgICBpbnRycmVnaXN0ZXJlZDsKIAl1aW50ICAgICAgICAgICAgICAgIGlzcF9pbml0aWFsaXplZDsKIAl1aW50ICAgICAgICAgICAgICAgIGdlbm51bWJlcjsKLQlzdHJ1Y3Qgc2xpY19zaG1lbSAgICAgICpwc2htZW07CisJc3RydWN0IHNsaWNfc2htZW1vcnkgc2htZW07CiAJZG1hX2FkZHJfdCAgICAgICAgICBwaHlzX3NobWVtOwotCXUzMiAgICAgICAgICAgICBpc3Jjb3B5OwotCV9faW9tZW0gc3RydWN0IHNsaWNfcmVncyAgICAgICAqc2xpY19yZWdzOworCXZvaWQgX19pb21lbSAqcmVnczsKIAl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgc3RhdGU7CiAJdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgIGxpbmtzdGF0ZTsKIAl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgbGlua3NwZWVkOwpAQCAtNDQ0LDggKzQ2OSw4IEBACiAJc3RydWN0IHNsaWNfY21kcXVldWUgICAgIGNtZHFfYWxsOwogCXN0cnVjdCBzbGljX2NtZHFtZW0gICAgICBjbWRxbWVtOwogCS8qCi0JKiAgU0xJQyBIYW5kbGVzCi0JKi8KKwkgKiBTTElDIEhhbmRsZXMKKwkgKi8KIAkvKiBPYmplY3QgaGFuZGxlcyovCiAJc3RydWN0IHNsaWNfaGFuZGxlIHNsaWNfaGFuZGxlc1tTTElDX0NNRFFfTUFYQ01EUyArIDFdOwogCS8qIEZyZWUgb2JqZWN0IGhhbmRsZXMqLwpAQCAtNDg3LDYgKzUxMiwzNCBAQAogCXN0cnVjdCBzbGljbmV0X3N0YXRzICAgICBzbGljX3N0YXRzOwogfTsKIAorc3RhdGljIGlubGluZSB1MzIgc2xpY19yZWFkMzIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCByZWcpCit7CisJcmV0dXJuIGlvcmVhZDMyKGFkYXB0ZXItPnJlZ3MgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2xpY193cml0ZTMyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkJCXUzMiB2YWwpCit7CisJaW93cml0ZTMyKHZhbCwgYWRhcHRlci0+cmVncyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbGljX3dyaXRlNjQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCByZWcsCisJCQkJdTMyIHZhbCwgdTMyIGhpYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmJpdDY0cmVnbG9jaywgZmxhZ3MpOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19BRERSX1VQUEVSLCBoaWFkZHIpOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCByZWcsIHZhbCk7CisJbW1pb3diKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+Yml0NjRyZWdsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbGljX2ZsdXNoX3dyaXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCWlvcmVhZDMyKGFkYXB0ZXItPnJlZ3MgKyBTTElDX1JFR19IT1NUSUQpOworfQorCiAjZGVmaW5lIFVQREFURV9TVEFUUyhsYXJnZXN0YXQsIG5ld3N0YXQsIG9sZHN0YXQpICAgICAgICAgICAgICAgICAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlpZiAoKG5ld3N0YXQpIDwgKG9sZHN0YXQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNody5oIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY2h3LmgKaW5kZXggOTcyM2I0YS4uNDljYjkxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY2h3LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY2h3LmgKQEAgLTI4OSwyMjQgKzI4OSwxMTggQEAKIAl1MzIgcGFkMls0XTsKIH07CiAKLXN0cnVjdCBzbGljX3JlZ3MgewotCXUzMglzbGljX3Jlc2V0OwkvKiBSZXNldCBSZWdpc3RlciAqLwotCXUzMglwYWQwOworLyogUmVzZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0xJQ19SRUdfUkVTRVQJCTB4MDAwMAorLyogSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0xJQ19SRUdfSUNSCQkweDAwMDgKKy8qIEludGVycnVwdCBzdGF0dXMgcG9pbnRlciAqLworI2RlZmluZSBTTElDX1JFR19JU1AJCTB4MDAxMAorLyogSW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBTTElDX1JFR19JU1IJCTB4MDAxOAorLyoKKyAqIEhlYWRlciBidWZmZXIgYWRkcmVzcyByZWcKKyAqIDMxLTggLSBwaHkgYWRkciBvZiBzZXQgb2YgY29udGlndW91cyBoZHIgYnVmZmVycworICogIDctMCAtIG51bWJlciBvZiBidWZmZXJzIHBhc3NlZAorICogQnVmZmVycyBhcmUgMjU2IGJ5dGVzIGxvbmcgb24gMjU2LWJ5dGUgYm91bmRhcmllcy4KKyAqLworI2RlZmluZSBTTElDX1JFR19IQkFSCQkweDAwMjAKKy8qCisgKiBEYXRhIGJ1ZmZlciBoYW5kbGUgJiBhZGRyZXNzIHJlZworICogNCBzZXRzIG9mIHJlZ2lzdGVyczsgQnVmZmVycyBhcmUgMksgYnl0ZXMgbG9uZyAyIHBlciA0SyBwYWdlLgorICovCisjZGVmaW5lIFNMSUNfUkVHX0RCQVIJCTB4MDAyOAorLyoKKyAqIFhtdCBDbWQgYnVmIGFkZHIgcmVncy4KKyAqIDEgcGVyIFhNVCBpbnRlcmZhY2UKKyAqIDMxLTUgLSBwaHkgYWRkciBvZiBob3N0IGNvbW1hbmQgYnVmZmVyCisgKiAgNC0wIC0gbGVuZ3RoIG9mIGNtZCBpbiBtdWx0aXBsZXMgb2YgMzIgYnl0ZXMKKyAqIEJ1ZmZlcnMgYXJlIDMyIGJ5dGVzIHVwIHRvIDUxMiBieXRlcyBsb25nCisgKi8KKyNkZWZpbmUgU0xJQ19SRUdfQ0JBUgkJMHgwMDMwCisvKiBXcml0ZSBjb250cm9sIHN0b3JlICovCisjZGVmaW5lCVNMSUNfUkVHX1dDUwkJMHgwMDM0CisvKgorICogUmVzcG9uc2UgYnVmZmVyIGFkZHJlc3MgcmVnLgorICogMzEtOCAtIHBoeSBhZGRyIG9mIHNldCBvZiBjb250aWd1b3VzIHJlc3BvbnNlIGJ1ZmZlcnMKKyAqIDctMCAtIG51bWJlciBvZiBidWZmZXJzIHBhc3NlZAorICogQnVmZmVycyBhcmUgMzIgYnl0ZXMgbG9uZyBvbiAzMi1ieXRlIGJvdW5kYXJpZXMuCisgKi8KKyNkZWZpbmUJU0xJQ19SRUdfUkJBUgkJMHgwMDM4CisvKiBSZWFkIHN0YXRpc3RpY3MgKFVQUikgKi8KKyNkZWZpbmUJU0xJQ19SRUdfUlNUQVQJCTB4MDA0MAorLyogUmVhZCBsaW5rIHN0YXR1cyAqLworI2RlZmluZQlTTElDX1JFR19MU1RBVAkJMHgwMDQ4CisvKiBXcml0ZSBNYWMgQ29uZmlnICovCisjZGVmaW5lCVNMSUNfUkVHX1dNQ0ZHCQkweDAwNTAKKy8qIFdyaXRlIHBoeSByZWdpc3RlciAqLworI2RlZmluZSBTTElDX1JFR19XUEhZCQkweDAwNTgKKy8qIFJjdiBDbWQgYnVmIGFkZHIgcmVnICovCisjZGVmaW5lCVNMSUNfUkVHX1JDQkFSCQkweDAwNjAKKy8qIFJlYWQgU0xJQyBDb25maWcqLworI2RlZmluZSBTTElDX1JFR19SQ09ORklHCTB4MDA2OAorLyogSW50ZXJydXB0IGFnZ3JlZ2F0aW9uIHRpbWUgKi8KKyNkZWZpbmUgU0xJQ19SRUdfSU5UQUdHCQkweDAwNzAKKy8qIFdyaXRlIFhNSVQgY29uZmlnIHJlZyAqLworI2RlZmluZQlTTElDX1JFR19XWENGRwkJMHgwMDc4CisvKiBXcml0ZSBSQ1YgY29uZmlnIHJlZyAqLworI2RlZmluZQlTTElDX1JFR19XUkNGRwkJMHgwMDgwCisvKiBXcml0ZSByY3YgYWRkciBhIGxvdyAqLworI2RlZmluZQlTTElDX1JFR19XUkFERFJBTAkweDAwODgKKy8qIFdyaXRlIHJjdiBhZGRyIGEgaGlnaCAqLworI2RlZmluZQlTTElDX1JFR19XUkFERFJBSAkweDAwOTAKKy8qIFdyaXRlIHJjdiBhZGRyIGIgbG93ICovCisjZGVmaW5lCVNMSUNfUkVHX1dSQUREUkJMCTB4MDA5OAorLyogV3JpdGUgcmN2IGFkZHIgYiBoaWdoICovCisjZGVmaW5lCVNMSUNfUkVHX1dSQUREUkJICTB4MDBhMAorLyogTG93IGJpdHMgb2YgbWNhc3QgbWFzayAqLworI2RlZmluZQlTTElDX1JFR19NQ0FTVExPVwkweDAwYTgKKy8qIEhpZ2ggYml0cyBvZiBtY2FzdCBtYXNrICovCisjZGVmaW5lCVNMSUNfUkVHX01DQVNUSElHSAkweDAwYjAKKy8qIFBpbmcgdGhlIGNhcmQgKi8KKyNkZWZpbmUgU0xJQ19SRUdfUElORwkJMHgwMGI4CisvKiBEdW1wIGNvbW1hbmQgKi8KKyNkZWZpbmUgU0xJQ19SRUdfRFVNUF9DTUQJMHgwMGMwCisvKiBEdW1wIGRhdGEgcG9pbnRlciAqLworI2RlZmluZSBTTElDX1JFR19EVU1QX0RBVEEJMHgwMGM4CisvKiBSZWFkIGNhcmQncyBwY2lfc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCVNMSUNfUkVHX1BDSVNUQVRVUwkweDAwZDAKKy8qIFdyaXRlIGhvc3RpZCBmaWVsZCAqLworI2RlZmluZSBTTElDX1JFR19XUkhPU1RJRAkweDAwZDgKKy8qIFB1dCBjYXJkIGluIGEgbG93IHBvd2VyIHN0YXRlICovCisjZGVmaW5lIFNMSUNfUkVHX0xPV19QT1dFUgkweDAwZTAKKy8qIEZvcmNlIHNsaWMgaW50byBxdWllc2NlbnQgc3RhdGUgIGJlZm9yZSBzb2Z0IHJlc2V0ICovCisjZGVmaW5lIFNMSUNfUkVHX1FVSUVTQ0UJMHgwMGU4CisvKiBSZXNldCBpbnRlcmZhY2UgcXVldWVzICovCisjZGVmaW5lIFNMSUNfUkVHX1JFU0VUX0lGQUNFCTB4MDBmMAorLyoKKyAqIFJlZ2lzdGVyIGlzIG9ubHkgd3JpdHRlbiB3aGVuIGl0IGhhcyBjaGFuZ2VkLgorICogQml0cyA2My0zMiBmb3IgaG9zdCBpL2YgYWRkcnMuCisgKi8KKyNkZWZpbmUgU0xJQ19SRUdfQUREUl9VUFBFUgkweDAwZjgKKy8qIDY0IGJpdCBIZWFkZXIgYnVmZmVyIGFkZHJlc3MgcmVnICovCisjZGVmaW5lIFNMSUNfUkVHX0hCQVI2NAkJMHgwMTAwCisvKiA2NCBiaXQgRGF0YSBidWZmZXIgaGFuZGxlICYgYWRkcmVzcyByZWcgKi8KKyNkZWZpbmUgU0xJQ19SRUdfREJBUjY0CQkweDAxMDgKKy8qIDY0IGJpdCBYbXQgQ21kIGJ1ZiBhZGRyIHJlZ3MuICovCisjZGVmaW5lIFNMSUNfUkVHX0NCQVI2NAkJMHgwMTEwCisvKiA2NCBiaXQgUmVzcG9uc2UgYnVmZmVyIGFkZHJlc3MgcmVnLiovCisjZGVmaW5lIFNMSUNfUkVHX1JCQVI2NAkJMHgwMTE4CisvKiA2NCBiaXQgUmN2IENtZCBidWYgYWRkciByZWcqLworI2RlZmluZQlTTElDX1JFR19SQ0JBUjY0CTB4MDEyMAorLyogUmVhZCBzdGF0aXN0aWNzICg2NCBiaXQgVVBSKSAqLworI2RlZmluZQlTTElDX1JFR19SU1RBVDY0CTB4MDEyOAorLyogRG93bmxvYWQgR2lnYWJpdCBSQ1Ygc2VxdWVuY2VyIHVjb2RlICovCisjZGVmaW5lIFNMSUNfUkVHX1JDVl9XQ1MJMHgwMTMwCisvKiBXcml0ZSBWbGFuSWQgZmllbGQgKi8KKyNkZWZpbmUgU0xJQ19SRUdfV1JWTEFOSUQJMHgwMTM4CisvKiBSZWFkIFRyYW5zZm9ybWVyIGluZm8gKi8KKyNkZWZpbmUgU0xJQ19SRUdfUkVBRF9YRl9JTkZPCTB4MDE0MAorLyogV3JpdGUgVHJhbnNmb3JtZXIgaW5mbyAqLworI2RlZmluZSBTTElDX1JFR19XUklURV9YRl9JTkZPCTB4MDE0OAorLyogV3JpdGUgY2FyZCB0aWNrcyBwZXIgc2Vjb25kICovCisjZGVmaW5lIFNMSUNfUkVHX1RJQ0tTX1BFUl9TRUMJMHgwMTcwCiAKLQl1MzIJc2xpY19pY3I7CS8qIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyICovCi0JdTMyCXBhZDI7Ci0jZGVmaW5lIFNMSUNfSUNSCQkweDAwMDgKLQotCXUzMglzbGljX2lzcDsJLyogSW50ZXJydXB0IHN0YXR1cyBwb2ludGVyICovCi0JdTMyCXBhZDE7Ci0jZGVmaW5lIFNMSUNfSVNQCQkweDAwMTAKLQotCXUzMglzbGljX2lzcjsJLyogSW50ZXJydXB0IHN0YXR1cyAqLwotCXUzMglwYWQzOwotI2RlZmluZSBTTElDX0lTUgkJMHgwMDE4Ci0KLQl1MzIJc2xpY19oYmFyOwkvKiBIZWFkZXIgYnVmZmVyIGFkZHJlc3MgcmVnICovCi0JdTMyCXBhZDQ7Ci0JLyoKLQkgKiAzMS04IC0gcGh5IGFkZHIgb2Ygc2V0IG9mIGNvbnRpZ3VvdXMgaGRyIGJ1ZmZlcnMKLQkgKiAgNy0wIC0gbnVtYmVyIG9mIGJ1ZmZlcnMgcGFzc2VkCi0JICogQnVmZmVycyBhcmUgMjU2IGJ5dGVzIGxvbmcgb24gMjU2LWJ5dGUgYm91bmRhcmllcy4KLQkgKi8KLSNkZWZpbmUgU0xJQ19IQkFSCQkweDAwMjAKLSNkZWZpbmUgU0xJQ19IQkFSX0NOVF9NU0sJMHgwMDAwMDBGRgotCi0JdTMyCXNsaWNfZGJhcjsJLyogRGF0YSBidWZmZXIgaGFuZGxlICYgYWRkcmVzcyByZWcgKi8KLQl1MzIJcGFkNTsKLQotCS8qIDQgc2V0cyBvZiByZWdpc3RlcnM7IEJ1ZmZlcnMgYXJlIDJLIGJ5dGVzIGxvbmcgMiBwZXIgNEsgcGFnZS4gKi8KLSNkZWZpbmUgU0xJQ19EQkFSCQkweDAwMjgKLSNkZWZpbmUgU0xJQ19EQkFSX1NJWkUJCTIwNDgKLQotCXUzMglzbGljX2NiYXI7CS8qIFhtdCBDbWQgYnVmIGFkZHIgcmVncy4qLwotCS8qCi0JICogMSBwZXIgWE1UIGludGVyZmFjZQotCSAqIDMxLTUgLSBwaHkgYWRkciBvZiBob3N0IGNvbW1hbmQgYnVmZmVyCi0JICogIDQtMCAtIGxlbmd0aCBvZiBjbWQgaW4gbXVsdGlwbGVzIG9mIDMyIGJ5dGVzCi0JICogQnVmZmVycyBhcmUgMzIgYnl0ZXMgdXAgdG8gNTEyIGJ5dGVzIGxvbmcKLQkgKi8KLSNkZWZpbmUgU0xJQ19DQkFSCQkweDAwMzAKLSNkZWZpbmUgU0xJQ19DQkFSX0xFTl9NU0sJMHgwMDAwMDAxRgotI2RlZmluZSBTTElDX0NCQVJfQUxJR04JCTB4MDAwMDAwMjAKLQotCXUzMglzbGljX3djczsJLyogd3JpdGUgY29udHJvbCBzdG9yZSovCi0jZGVmaW5lCVNMSUNfV0NTCQkweDAwMzQKLSNkZWZpbmUgU0xJQ19XQ1NfU1RBUlQJCTB4ODAwMDAwMDAJLypTdGFydCB0aGUgU0xJQyAoSnVtcCB0byBXQ1MpKi8KLSNkZWZpbmUgU0xJQ19XQ1NfQ09NUEFSRQkweDQwMDAwMDAwCS8qIENvbXBhcmUgd2l0aCB2YWx1ZSBpbiBXQ1MqLwotCi0JdTMyCXNsaWNfcmJhcjsJLyogUmVzcG9uc2UgYnVmZmVyIGFkZHJlc3MgcmVnLiovCi0JdTMyCXBhZDc7Ci0JLyoKLQkgKiAzMS04IC0gcGh5IGFkZHIgb2Ygc2V0IG9mIGNvbnRpZ3VvdXMgcmVzcG9uc2UgYnVmZmVycwotCSAqIDctMCAtIG51bWJlciBvZiBidWZmZXJzIHBhc3NlZAotCSAqIEJ1ZmZlcnMgYXJlIDMyIGJ5dGVzIGxvbmcgb24gMzItYnl0ZSBib3VuZGFyaWVzLgotCSAqLwotI2RlZmluZSBTTElDX1JCQVIJCTB4MDAzOAotI2RlZmluZSBTTElDX1JCQVJfQ05UX01TSwkweDAwMDAwMEZGCi0jZGVmaW5lIFNMSUNfUkJBUl9TSVpFCQkzMgotCi0JdTMyCXNsaWNfc3RhdHM7CS8qIHJlYWQgc3RhdGlzdGljcyAoVVBSKSAqLwotCXUzMglwYWQ4OwotI2RlZmluZQlTTElDX1JTVEFUCQkweDAwNDAKLQotCXUzMglzbGljX3Jsc3I7CS8qIHJlYWQgbGluayBzdGF0dXMgKi8KLQl1MzIJcGFkOTsKLSNkZWZpbmUgU0xJQ19MU1RBVAkJMHgwMDQ4Ci0KLQl1MzIJc2xpY193bWNmZzsJLyogV3JpdGUgTWFjIENvbmZpZyAqLwotCXUzMglwYWQxMDsKLSNkZWZpbmUJU0xJQ19XTUNGRwkJMHgwMDUwCi0KLQl1MzIJc2xpY193cGh5OwkvKiBXcml0ZSBwaHkgcmVnaXN0ZXIgKi8KLQl1MzIJcGFkMTE7Ci0jZGVmaW5lIFNMSUNfV1BIWQkJMHgwMDU4Ci0KLQl1MzIJc2xpY19yY2JhcjsJLyogUmN2IENtZCBidWYgYWRkciByZWcgKi8KLQl1MzIJcGFkMTI7Ci0jZGVmaW5lCVNMSUNfUkNCQVIJCTB4MDA2MAotCi0JdTMyCXNsaWNfcmNvbmZpZzsJLyogUmVhZCBTTElDIENvbmZpZyovCi0JdTMyCXBhZDEzOwotI2RlZmluZSBTTElDX1JDT05GSUcJMHgwMDY4Ci0KLQl1MzIJc2xpY19pbnRhZ2c7CS8qIEludGVycnVwdCBhZ2dyZWdhdGlvbiB0aW1lICovCi0JdTMyCXBhZDE0OwotI2RlZmluZSBTTElDX0lOVEFHRwkJMHgwMDcwCi0KLQl1MzIJc2xpY193eGNmZzsJLyogV3JpdGUgWE1JVCBjb25maWcgcmVnKi8KLQl1MzIJcGFkMTY7Ci0jZGVmaW5lCVNMSUNfV1hDRkcJCTB4MDA3OAotCi0JdTMyCXNsaWNfd3JjZmc7CS8qIFdyaXRlIFJDViBjb25maWcgcmVnKi8KLQl1MzIJcGFkMTc7Ci0jZGVmaW5lCVNMSUNfV1JDRkcJCTB4MDA4MAotCi0JdTMyCXNsaWNfd3JhZGRyYWw7CS8qIFdyaXRlIHJjdiBhZGRyIGEgbG93Ki8KLQl1MzIJcGFkMTg7Ci0jZGVmaW5lCVNMSUNfV1JBRERSQUwJMHgwMDg4Ci0KLQl1MzIJc2xpY193cmFkZHJhaDsJLyogV3JpdGUgcmN2IGFkZHIgYSBoaWdoKi8KLQl1MzIJcGFkMTk7Ci0jZGVmaW5lCVNMSUNfV1JBRERSQUgJMHgwMDkwCi0KLQl1MzIJc2xpY193cmFkZHJibDsJLyogV3JpdGUgcmN2IGFkZHIgYiBsb3cqLwotCXUzMglwYWQyMDsKLSNkZWZpbmUJU0xJQ19XUkFERFJCTAkweDAwOTgKLQotCXUzMglzbGljX3dyYWRkcmJoOwkvKiBXcml0ZSByY3YgYWRkciBiIGhpZ2gqLwotCXUzMgkJcGFkMjE7Ci0jZGVmaW5lCVNMSUNfV1JBRERSQkgJMHgwMGEwCi0KLQl1MzIJc2xpY19tY2FzdGxvdzsJLyogTG93IGJpdHMgb2YgbWNhc3QgbWFzayovCi0JdTMyCQlwYWQyMjsKLSNkZWZpbmUJU0xJQ19NQ0FTVExPVwkweDAwYTgKLQotCXUzMglzbGljX21jYXN0aGlnaDsJLyogSGlnaCBiaXRzIG9mIG1jYXN0IG1hc2sqLwotCXUzMgkJcGFkMjM7Ci0jZGVmaW5lCVNMSUNfTUNBU1RISUdICTB4MDBiMAotCi0JdTMyCXNsaWNfcGluZzsJLyogUGluZyB0aGUgY2FyZCovCi0JdTMyCXBhZDI0OwotI2RlZmluZSBTTElDX1BJTkcJCTB4MDBiOAotCi0JdTMyCXNsaWNfZHVtcF9jbWQ7CS8qIER1bXAgY29tbWFuZCAqLwotCXUzMglwYWQyNTsKLSNkZWZpbmUgU0xJQ19EVU1QX0NNRAkweDAwYzAKLQotCXUzMglzbGljX2R1bXBfZGF0YTsJLyogRHVtcCBkYXRhIHBvaW50ZXIgKi8KLQl1MzIJcGFkMjY7Ci0jZGVmaW5lIFNMSUNfRFVNUF9EQVRBCTB4MDBjOAotCi0JdTMyCXNsaWNfcGNpc3RhdHVzOwkvKiBSZWFkIGNhcmQncyBwY2lfc3RhdHVzIHJlZ2lzdGVyICovCi0JdTMyCXBhZDI3OwotI2RlZmluZQlTTElDX1BDSVNUQVRVUwkweDAwZDAKLQotCXUzMglzbGljX3dyaG9zdGlkOwkvKiBXcml0ZSBob3N0aWQgZmllbGQgKi8KLQl1MzIJCXBhZDI4OwotI2RlZmluZSBTTElDX1dSSE9TVElECQkgMHgwMGQ4Ci0jZGVmaW5lIFNMSUNfUkRIT1NUSURfMUdCCSAweDE1NTQKLSNkZWZpbmUgU0xJQ19SREhPU1RJRF8yR0IJIDB4MTU1NAotCi0JdTMyCXNsaWNfbG93X3Bvd2VyOwkvKiBQdXQgY2FyZCBpbiBhIGxvdyBwb3dlciBzdGF0ZSAqLwotCXUzMglwYWQyOTsKLSNkZWZpbmUgU0xJQ19MT1dfUE9XRVIJMHgwMGUwCi0KLQl1MzIJc2xpY19xdWllc2NlOwkvKiBmb3JjZSBzbGljIGludG8gcXVpZXNjZW50IHN0YXRlCi0JCQkJICogYmVmb3JlIHNvZnQgcmVzZXQKLQkJCQkgKi8KLQl1MzIJcGFkMzA7Ci0jZGVmaW5lIFNMSUNfUVVJRVNDRQkweDAwZTgKLQotCXUzMglzbGljX3Jlc2V0X2lmYWNlOy8qIHJlc2V0IGludGVyZmFjZSBxdWV1ZXMgKi8KLQl1MzIJcGFkMzE7Ci0jZGVmaW5lIFNMSUNfUkVTRVRfSUZBQ0UgMHgwMGYwCi0KLQl1MzIJc2xpY19hZGRyX3VwcGVyOy8qIEJpdHMgNjMtMzIgZm9yIGhvc3QgaS9mIGFkZHJzICovCi0JdTMyCXBhZDMyOwotI2RlZmluZSBTTElDX0FERFJfVVBQRVIJMHgwMGY4IC8qUmVnaXN0ZXIgaXMgb25seSB3cml0dGVuIHdoZW4gaXQgaGFzIGNoYW5nZWQqLwotCi0JdTMyCXNsaWNfaGJhcjY0OwkvKiA2NCBiaXQgSGVhZGVyIGJ1ZmZlciBhZGRyZXNzIHJlZyAqLwotCXUzMglwYWQzMzsKLSNkZWZpbmUgU0xJQ19IQkFSNjQJCTB4MDEwMAotCi0JdTMyCXNsaWNfZGJhcjY0OwkvKiA2NCBiaXQgRGF0YSBidWZmZXIgaGFuZGxlICYgYWRkcmVzcyByZWcgKi8KLQl1MzIJcGFkMzQ7Ci0jZGVmaW5lIFNMSUNfREJBUjY0CQkweDAxMDgKLQotCXUzMglzbGljX2NiYXI2NDsJLyogNjQgYml0IFhtdCBDbWQgYnVmIGFkZHIgcmVncy4gKi8KLQl1MzIJcGFkMzU7Ci0jZGVmaW5lIFNMSUNfQ0JBUjY0CQkweDAxMTAKLQotCXUzMglzbGljX3JiYXI2NDsJLyogNjQgYml0IFJlc3BvbnNlIGJ1ZmZlciBhZGRyZXNzIHJlZy4qLwotCXUzMglwYWQzNjsKLSNkZWZpbmUgU0xJQ19SQkFSNjQJCTB4MDExOAotCi0JdTMyCXNsaWNfcmNiYXI2NDsJLyogNjQgYml0IFJjdiBDbWQgYnVmIGFkZHIgcmVnKi8KLQl1MzIJcGFkMzc7Ci0jZGVmaW5lCVNMSUNfUkNCQVI2NAkweDAxMjAKLQotCXUzMglzbGljX3N0YXRzNjQ7CS8qIHJlYWQgc3RhdGlzdGljcyAoNjQgYml0IFVQUikgKi8KLQl1MzIJcGFkMzg7Ci0jZGVmaW5lCVNMSUNfUlNUQVQ2NAkweDAxMjgKLQotCXUzMglzbGljX3Jjdl93Y3M7CS8qRG93bmxvYWQgR2lnYWJpdCBSQ1Ygc2VxdWVuY2VyIHVjb2RlKi8KLQl1MzIJcGFkMzk7Ci0jZGVmaW5lIFNMSUNfUkNWX1dDUwkweDAxMzAKLSNkZWZpbmUgU0xJQ19SQ1ZXQ1NfQkVHSU4JMHg0MDAwMDAwMAotI2RlZmluZSBTTElDX1JDVldDU19GSU5JU0gJMHg4MDAwMDAwMAotCi0JdTMyCXNsaWNfd3J2bGFuaWQ7CS8qIFdyaXRlIFZsYW5JZCBmaWVsZCAqLwotCXUzMglwYWQ0MDsKLSNkZWZpbmUgU0xJQ19XUlZMQU5JRAkweDAxMzgKLQotCXUzMglzbGljX3JlYWRfeGZfaW5mbzsJLyogUmVhZCBUcmFuc2Zvcm1lciBpbmZvICovCi0JdTMyCXBhZDQxOwotI2RlZmluZSBTTElDX1JFQURfWEZfSU5GTwkweDAxNDAKLQotCXUzMglzbGljX3dyaXRlX3hmX2luZm87CS8qIFdyaXRlIFRyYW5zZm9ybWVyIGluZm8gKi8KLQl1MzIJcGFkNDI7Ci0jZGVmaW5lIFNMSUNfV1JJVEVfWEZfSU5GTwkweDAxNDgKLQotCXUzMglSU1ZEMTsJCS8qIFRPRSBPbmx5ICovCi0JdTMyCXBhZDQzOwotCi0JdTMyCVJTVkQyOwkJLyogVE9FIE9ubHkgKi8KLQl1MzIJcGFkNDQ7Ci0KLQl1MzIJUlNWRDM7CQkvKiBUT0UgT25seSAqLwotCXUzMglwYWQ0NTsKLQotCXUzMglSU1ZENDsJCS8qIFRPRSBPbmx5ICovCi0JdTMyCXBhZDQ2OwotCi0JdTMyCXNsaWNfdGlja3NfcGVyX3NlYzsgLyogV3JpdGUgY2FyZCB0aWNrcyBwZXIgc2Vjb25kICovCi0JdTMyCXBhZDQ3OwotI2RlZmluZSBTTElDX1RJQ0tTX1BFUl9TRUMJMHgwMTcwCi19OworI2RlZmluZSBTTElDX1JFR19IT1NUSUQJCTB4MTU1NAogCiBlbnVtIFVQUl9SRVFVRVNUIHsKIAlTTElDX1VQUl9TVEFUUywKQEAgLTU2NSw4NSArNDU5LDYgQEAKIAlzdHJ1Y3Qgc2xpY3BtX3dha2V1cF9jYXBhYmlsaXRpZXMgd2FrZXVwX2NhcGFiaWxpdGllczsKIH07CiAKLXN0cnVjdCB4bXRfc3RhdHMgewotCXUzMiB4bWl0X3RjcF9ieXRlczsKLQl1MzIgeG1pdF90Y3Bfc2VnczsKLQl1MzIgeG1pdF9ieXRlczsKLQl1MzIgeG1pdF9jb2xsaXNpb25zOwotCXUzMiB4bWl0X3VuaWNhc3RzOwotCXUzMiB4bWl0X290aGVyX2Vycm9yOwotCXUzMiB4bWl0X2V4Y2Vzc19jb2xsaXNpb25zOwotfTsKLQotc3RydWN0IHJjdl9zdGF0cyB7Ci0JdTMyIHJjdl90Y3BfYnl0ZXM7Ci0JdTMyIHJjdl90Y3Bfc2VnczsKLQl1MzIgcmN2X2J5dGVzOwotCXUzMiByY3ZfdW5pY2FzdHM7Ci0JdTMyIHJjdl9vdGhlcl9lcnJvcjsKLQl1MzIgcmN2X2Ryb3BzOwotfTsKLQotc3RydWN0IHhtdF9zdGF0c2diIHsKLQl1NjQgeG1pdF90Y3BfYnl0ZXM7Ci0JdTY0IHhtaXRfdGNwX3NlZ3M7Ci0JdTY0IHhtaXRfYnl0ZXM7Ci0JdTY0IHhtaXRfY29sbGlzaW9uczsKLQl1NjQgeG1pdF91bmljYXN0czsKLQl1NjQgeG1pdF9vdGhlcl9lcnJvcjsKLQl1NjQgeG1pdF9leGNlc3NfY29sbGlzaW9uczsKLX07Ci0KLXN0cnVjdCByY3Zfc3RhdHNnYiB7Ci0JdTY0IHJjdl90Y3BfYnl0ZXM7Ci0JdTY0IHJjdl90Y3Bfc2VnczsKLQl1NjQgcmN2X2J5dGVzOwotCXU2NCByY3ZfdW5pY2FzdHM7Ci0JdTY0IHJjdl9vdGhlcl9lcnJvcjsKLQl1NjQgcmN2X2Ryb3BzOwotfTsKLQotc3RydWN0IHNsaWNfc3RhdHMgewotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCXN0cnVjdCB4bXRfc3RhdHMgeG10MTAwOwotCQkJc3RydWN0IHJjdl9zdGF0cyByY3YxMDA7Ci0JCX0gc3RhdHNfMTAwOwotCQlzdHJ1Y3QgewotCQkJc3RydWN0IHhtdF9zdGF0c2diIHhtdEdCOwotCQkJc3RydWN0IHJjdl9zdGF0c2diIHJjdkdCOwotCQl9IHN0YXRzX0dCOwotCX0gdTsKLX07Ci0KLSNkZWZpbmUgeG1pdF90Y3Bfc2VnczEwMAkJdS5zdGF0c18xMDAueG10MTAwLnhtaXRfdGNwX3NlZ3MKLSNkZWZpbmUgeG1pdF90Y3BfYnl0ZXMxMDAJCXUuc3RhdHNfMTAwLnhtdDEwMC54bWl0X3RjcF9ieXRlcwotI2RlZmluZSB4bWl0X2J5dGVzMTAwCQkJdS5zdGF0c18xMDAueG10MTAwLnhtaXRfYnl0ZXMKLSNkZWZpbmUgeG1pdF9jb2xsaXNpb25zMTAwCQl1LnN0YXRzXzEwMC54bXQxMDAueG1pdF9jb2xsaXNpb25zCi0jZGVmaW5lIHhtaXRfdW5pY2FzdHMxMDAJCXUuc3RhdHNfMTAwLnhtdDEwMC54bWl0X3VuaWNhc3RzCi0jZGVmaW5lIHhtaXRfb3RoZXJfZXJyb3IxMDAJCXUuc3RhdHNfMTAwLnhtdDEwMC54bWl0X290aGVyX2Vycm9yCi0jZGVmaW5lIHhtaXRfZXhjZXNzX2NvbGxpc2lvbnMxMDAJdS5zdGF0c18xMDAueG10MTAwLnhtaXRfZXhjZXNzX2NvbGxpc2lvbnMKLSNkZWZpbmUgcmN2X3RjcF9zZWdzMTAwCQkJdS5zdGF0c18xMDAucmN2MTAwLnJjdl90Y3Bfc2VncwotI2RlZmluZSByY3ZfdGNwX2J5dGVzMTAwCQl1LnN0YXRzXzEwMC5yY3YxMDAucmN2X3RjcF9ieXRlcwotI2RlZmluZSByY3ZfYnl0ZXMxMDAJCQl1LnN0YXRzXzEwMC5yY3YxMDAucmN2X2J5dGVzCi0jZGVmaW5lIHJjdl91bmljYXN0czEwMAkJCXUuc3RhdHNfMTAwLnJjdjEwMC5yY3ZfdW5pY2FzdHMKLSNkZWZpbmUgcmN2X290aGVyX2Vycm9yMTAwCQl1LnN0YXRzXzEwMC5yY3YxMDAucmN2X290aGVyX2Vycm9yCi0jZGVmaW5lIHJjdl9kcm9wczEwMAkJCXUuc3RhdHNfMTAwLnJjdjEwMC5yY3ZfZHJvcHMKLSNkZWZpbmUgeG1pdF90Y3Bfc2Vnc19nYgkJdS5zdGF0c19HQi54bXRHQi54bWl0X3RjcF9zZWdzCi0jZGVmaW5lIHhtaXRfdGNwX2J5dGVzX2diCQl1LnN0YXRzX0dCLnhtdEdCLnhtaXRfdGNwX2J5dGVzCi0jZGVmaW5lIHhtaXRfYnl0ZXNfZ2IJCQl1LnN0YXRzX0dCLnhtdEdCLnhtaXRfYnl0ZXMKLSNkZWZpbmUgeG1pdF9jb2xsaXNpb25zX2diCQl1LnN0YXRzX0dCLnhtdEdCLnhtaXRfY29sbGlzaW9ucwotI2RlZmluZSB4bWl0X3VuaWNhc3RzX2diCQl1LnN0YXRzX0dCLnhtdEdCLnhtaXRfdW5pY2FzdHMKLSNkZWZpbmUgeG1pdF9vdGhlcl9lcnJvcl9nYgkJdS5zdGF0c19HQi54bXRHQi54bWl0X290aGVyX2Vycm9yCi0jZGVmaW5lIHhtaXRfZXhjZXNzX2NvbGxpc2lvbnNfZ2IJdS5zdGF0c19HQi54bXRHQi54bWl0X2V4Y2Vzc19jb2xsaXNpb25zCi0KLSNkZWZpbmUgcmN2X3RjcF9zZWdzX2diCQkJdS5zdGF0c19HQi5yY3ZHQi5yY3ZfdGNwX3NlZ3MKLSNkZWZpbmUgcmN2X3RjcF9ieXRlc19nYgkJdS5zdGF0c19HQi5yY3ZHQi5yY3ZfdGNwX2J5dGVzCi0jZGVmaW5lIHJjdl9ieXRlc19nYgkJCXUuc3RhdHNfR0IucmN2R0IucmN2X2J5dGVzCi0jZGVmaW5lIHJjdl91bmljYXN0c19nYgkJCXUuc3RhdHNfR0IucmN2R0IucmN2X3VuaWNhc3RzCi0jZGVmaW5lIHJjdl9vdGhlcl9lcnJvcl9nYgkJdS5zdGF0c19HQi5yY3ZHQi5yY3Zfb3RoZXJfZXJyb3IKLSNkZWZpbmUgcmN2X2Ryb3BzX2diCQkJdS5zdGF0c19HQi5yY3ZHQi5yY3ZfZHJvcHMKLQogc3RydWN0IHNsaWNfY29uZmlnX21hYyB7CiAJdTggbWFjYWRkckFbNl07CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jCmluZGV4IGFjMTI2ZDQuLjA2MjMwN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMKQEAgLTEyNCwzMSArMTI0LDEwIEBACiAJeyAwIH0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgc2xpY19ldGh0b29sX29wczsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgc2xpY19ldGh0b29sX29wczsKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNsaWNfcGNpX3RibCk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzbGljX3JlZzMyX3dyaXRlKHZvaWQgX19pb21lbSAqcmVnLCB1MzIgdmFsdWUsIGJvb2wgZmx1c2gpCi17Ci0Jd3JpdGVsKHZhbHVlLCByZWcpOwotCWlmIChmbHVzaCkKLQkJbWIoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNsaWNfcmVnNjRfd3JpdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHZvaWQgX19pb21lbSAqcmVnLAotCQkJCSAgICB1MzIgdmFsdWUsIHZvaWQgX19pb21lbSAqcmVnaCwgdTMyIHBhZGRyaCwKLQkJCQkgICAgYm9vbCBmbHVzaCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmJpdDY0cmVnbG9jaywgZmxhZ3MpOwotCXdyaXRlbChwYWRkcmgsIHJlZ2gpOwotCXdyaXRlbCh2YWx1ZSwgcmVnKTsKLQlpZiAoZmx1c2gpCi0JCW1iKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+Yml0NjRyZWdsb2NrLCBmbGFncyk7Ci19Ci0KIHN0YXRpYyB2b2lkIHNsaWNfbWNhc3Rfc2V0X2JpdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgY2hhciAqYWRkcmVzcykKIHsKIAl1bnNpZ25lZCBjaGFyIGNyY3BvbHk7CkBAIC0xNzIsOCArMTUxLDYgQEAKIAogc3RhdGljIHZvaWQgc2xpY19tY2FzdF9zZXRfbWFzayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKLQogCWlmIChhZGFwdGVyLT5tYWNvcHRzICYgKE1BQ19BTExNQ0FTVCB8IE1BQ19QUk9NSVNDKSkgewogCQkvKgogCQkgKiBUdXJuIG9uIGFsbCBtdWx0aWNhc3QgYWRkcmVzc2VzLiBXZSBoYXZlIHRvIGRvIHRoaXMgZm9yCkBAIC0xODEsMTggKzE1OCwxNyBAQAogCQkgKiBNaWNyb2NvZGUgZnJvbSBoYXZpbmcgdG8ga2VlcCBzdGF0ZSBhYm91dCB0aGUgTUFDCiAJCSAqIGNvbmZpZ3VyYXRpb24uCiAJCSAqLwotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfbWNhc3Rsb3csIDB4RkZGRkZGRkYsIEZMVVNIKTsKLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX21jYXN0aGlnaCwgMHhGRkZGRkZGRiwKLQkJCQkgRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfTUNBU1RMT1csIDB4RkZGRkZGRkYpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfTUNBU1RISUdILCAweEZGRkZGRkZGKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBDb21taXQgb3VyIG11bHRpY2FzdCBtYXN0IHRvIHRoZSBTTElDIGJ5IHdyaXRpbmcgdG8gdGhlCiAJCSAqIG11bHRpY2FzdCBhZGRyZXNzIG1hc2sgcmVnaXN0ZXJzCiAJCSAqLwotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfbWNhc3Rsb3csCi0JCQkodTMyKShhZGFwdGVyLT5tY2FzdG1hc2sgJiAweEZGRkZGRkZGKSwgRkxVU0gpOwotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfbWNhc3RoaWdoLAotCQkJKHUzMikoKGFkYXB0ZXItPm1jYXN0bWFzayA+PiAzMikgJiAweEZGRkZGRkZGKSwgRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfTUNBU1RMT1csCisJCQkgICAgICh1MzIpKGFkYXB0ZXItPm1jYXN0bWFzayAmIDB4RkZGRkZGRkYpKTsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX01DQVNUSElHSCwKKwkJCSAgICAgKHUzMikoKGFkYXB0ZXItPm1jYXN0bWFzayA+PiAzMikgJiAweEZGRkZGRkZGKSk7CiAJfQogfQogCkBAIC0yMDgsMTMgKzE4NCw2IEBACiAJYWRkX3RpbWVyKCZhZGFwdGVyLT5waW5ndGltZXIpOwogfQogCi1zdGF0aWMgdm9pZCBzbGljX3VubWFwX21taW9fc3BhY2Uoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaWYgKGFkYXB0ZXItPnNsaWNfcmVncykKLQkJaW91bm1hcChhZGFwdGVyLT5zbGljX3JlZ3MpOwotCWFkYXB0ZXItPnNsaWNfcmVncyA9IE5VTEw7Ci19Ci0KIC8qCiAgKiAgc2xpY19saW5rX2NvbmZpZwogICoKQEAgLTIyNCw3ICsxOTMsNiBAQAogc3RhdGljIHZvaWQgc2xpY19saW5rX2NvbmZpZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKIAkJICAgICAgdTMyIGxpbmtzcGVlZCwgdTMyIGxpbmtkdXBsZXgpCiB7Ci0JdTMyIF9faW9tZW0gKndwaHk7CiAJdTMyIHNwZWVkOwogCXUzMiBkdXBsZXg7CiAJdTMyIHBoeV9jb25maWc7CkBAIC0yMzksOCArMjA3LDYgQEAKIAlpZiAobGlua2R1cGxleCA+IExJTktfQVVUT0QpCiAJCWxpbmtkdXBsZXggPSBMSU5LX0FVVE9EOwogCi0Jd3BoeSA9ICZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfd3BoeTsKLQogCWlmICgobGlua3NwZWVkID09IExJTktfQVVUT1NQRUVEKSB8fCAobGlua3NwZWVkID09IExJTktfMTAwME1CKSkgewogCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBBREFQVF9GTEFHU19GSUJFUk1FRElBKSB7CiAJCQkvKgpAQCAtMjUyLDcgKzIxOCw3IEBACiAJCQlwaHlfYWR2cmVnID0gKE1JSUNSX1JFR180IHwgKFBBUl9BRFYxMDAwWEZEKSk7CiAJCQkvKiBlbmFibGUgUEFVU0UgZnJhbWVzICAgICAgICAqLwogCQkJcGh5X2FkdnJlZyB8PSBQQVJfQVNZTVBBVVNFX0ZJQkVSOwotCQkJc2xpY19yZWczMl93cml0ZSh3cGh5LCBwaHlfYWR2cmVnLCBGTFVTSCk7CisJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1BIWSwgcGh5X2FkdnJlZyk7CiAKIAkJCWlmIChsaW5rc3BlZWQgPT0gTElOS19BVVRPU1BFRUQpIHsKIAkJCQkvKiByZXNldCBwaHksIGVuYWJsZSBhdXRvLW5lZyAgKi8KQEAgLTI2MCwxNCArMjI2LDE3IEBACiAJCQkJICAgIChNSUlDUl9SRUdfUENSIHwKIAkJCQkgICAgIChQQ1JfUkVTRVQgfCBQQ1JfQVVUT05FRyB8CiAJCQkJICAgICAgUENSX0FVVE9ORUdfUlNUKSk7Ci0JCQkJc2xpY19yZWczMl93cml0ZSh3cGh5LCBwaHlfY29uZmlnLCBGTFVTSCk7CisJCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dQSFksCisJCQkJCSAgICAgcGh5X2NvbmZpZyk7CiAJCQl9IGVsc2UgewkvKiBmb3JjZWQgMTAwMCBNYiBGRCovCiAJCQkJLyoKIAkJCQkgKiBwb3dlciBkb3duIHBoeSB0byBicmVhayBsaW5rCiAJCQkJICogdGhpcyBtYXkgbm90IHdvcmspCiAJCQkJICovCiAJCQkJcGh5X2NvbmZpZyA9IChNSUlDUl9SRUdfUENSIHwgUENSX1BPV0VSRE9XTik7Ci0JCQkJc2xpY19yZWczMl93cml0ZSh3cGh5LCBwaHlfY29uZmlnLCBGTFVTSCk7CisJCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dQSFksCisJCQkJCSAgICAgcGh5X2NvbmZpZyk7CisJCQkJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKIAkJCQkvKgogCQkJCSAqIHdhaXQsIE1hcnZlbGwgc2F5cyAxIHNlYywKIAkJCQkgKiB0cnkgdG8gZ2V0IGF3YXkgd2l0aCAxMCBtcwpAQCAtMjgyLDcgKzI1MSw4IEBACiAJCQkJICAgIChNSUlDUl9SRUdfUENSIHwKIAkJCQkgICAgIChQQ1JfUkVTRVQgfCBQQ1JfU1BFRURfMTAwMCB8CiAJCQkJICAgICAgUENSX0RVUExFWF9GVUxMKSk7Ci0JCQkJc2xpY19yZWczMl93cml0ZSh3cGh5LCBwaHlfY29uZmlnLCBGTFVTSCk7CisJCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dQSFksCisJCQkJCSAgICAgcGh5X2NvbmZpZyk7CiAJCQl9CiAJCX0gZWxzZSB7CS8qIGNvcHBlciBnaWdhYml0ICovCiAKQEAgLTMwOSwxMCArMjc5LDEwIEBACiAJCQlwaHlfYWR2cmVnIHw9IFBBUl9BU1lNUEFVU0U7CiAJCQkvKiByZXF1aXJlZCBieSB0aGUgQ2ljYWRhIFBIWSAgKi8KIAkJCXBoeV9hZHZyZWcgfD0gUEFSXzgwMl8zOwotCQkJc2xpY19yZWczMl93cml0ZSh3cGh5LCBwaHlfYWR2cmVnLCBGTFVTSCk7CisJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1BIWSwgcGh5X2FkdnJlZyk7CiAJCQkvKiBhZHZlcnRpc2UgRkQgb25seSBAMTAwMCBNYiAgKi8KIAkJCXBoeV9nY3RscmVnID0gKE1JSUNSX1JFR185IHwgKFBHQ19BRFYxMDAwRkQpKTsKLQkJCXNsaWNfcmVnMzJfd3JpdGUod3BoeSwgcGh5X2djdGxyZWcsIEZMVVNIKTsKKwkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XUEhZLCBwaHlfZ2N0bHJlZyk7CiAKIAkJCWlmIChhZGFwdGVyLT5zdWJzeXNpZCAhPSBTTElDXzFHQl9DSUNBREFfU1VCU1lTX0lEKSB7CiAJCQkJLyoKQEAgLTMyMSwyMCArMjkxLDIzIEBACiAJCQkJICovCiAJCQkJcGh5X2NvbmZpZyA9CiAJCQkJICAgIChNSUlDUl9SRUdfMTYgfCAoTVJWX1JFRzE2X1hPVkVST04pKTsKLQkJCQlzbGljX3JlZzMyX3dyaXRlKHdwaHksIHBoeV9jb25maWcsIEZMVVNIKTsKKwkJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1BIWSwKKwkJCQkJICAgICBwaHlfY29uZmlnKTsKIAogCQkJCS8qIHJlc2V0IHBoeSwgZW5hYmxlIGF1dG8tbmVnICAqLwogCQkJCXBoeV9jb25maWcgPQogCQkJCSAgICAoTUlJQ1JfUkVHX1BDUiB8CiAJCQkJICAgICAoUENSX1JFU0VUIHwgUENSX0FVVE9ORUcgfAogCQkJCSAgICAgIFBDUl9BVVRPTkVHX1JTVCkpOwotCQkJCXNsaWNfcmVnMzJfd3JpdGUod3BoeSwgcGh5X2NvbmZpZywgRkxVU0gpOworCQkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XUEhZLAorCQkJCQkgICAgIHBoeV9jb25maWcpOwogCQkJfSBlbHNlIHsJLyogaXQncyBhIENpY2FkYSBQSFkgICovCiAJCQkJLyogZW5hYmxlIGFuZCByZXN0YXJ0IGF1dG8tbmVnIChkb24ndCByZXNldCkgICovCiAJCQkJcGh5X2NvbmZpZyA9CiAJCQkJICAgIChNSUlDUl9SRUdfUENSIHwKIAkJCQkgICAgIChQQ1JfQVVUT05FRyB8IFBDUl9BVVRPTkVHX1JTVCkpOwotCQkJCXNsaWNfcmVnMzJfd3JpdGUod3BoeSwgcGh5X2NvbmZpZywgRkxVU0gpOworCQkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XUEhZLAorCQkJCQkgICAgIHBoeV9jb25maWcpOwogCQkJfQogCQl9CiAJfSBlbHNlIHsKQEAgLTM1NCwxMyArMzI3LDEzIEBACiAJCQkgKiBkaXNhYmxlIGF1dG8gY3Jvc3NvdmVyCiAJCQkgKi8KIAkJCXBoeV9jb25maWcgPSAoTUlJQ1JfUkVHXzE2IHwgKE1SVl9SRUcxNl9YT1ZFUk9GRikpOwotCQkJc2xpY19yZWczMl93cml0ZSh3cGh5LCBwaHlfY29uZmlnLCBGTFVTSCk7CisJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1BIWSwgcGh5X2NvbmZpZyk7CiAJCX0KIAogCQkvKiBwb3dlciBkb3duIHBoeSB0byBicmVhayBsaW5rICh0aGlzIG1heSBub3Qgd29yaykgICovCiAJCXBoeV9jb25maWcgPSAoTUlJQ1JfUkVHX1BDUiB8IChQQ1JfUE9XRVJET1dOIHwgc3BlZWQgfCBkdXBsZXgpKTsKLQkJc2xpY19yZWczMl93cml0ZSh3cGh5LCBwaHlfY29uZmlnLCBGTFVTSCk7Ci0KKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dQSFksIHBoeV9jb25maWcpOworCQlzbGljX2ZsdXNoX3dyaXRlKGFkYXB0ZXIpOwogCQkvKiB3YWl0LCBNYXJ2ZWxsIHNheXMgMSBzZWMsIHRyeSB0byBnZXQgYXdheSB3aXRoIDEwIG1zICovCiAJCW1kZWxheSgxMCk7CiAKQEAgLTM3MiwxMSArMzQ1LDExIEBACiAJCQkgKi8KIAkJCXBoeV9jb25maWcgPQogCQkJICAgIChNSUlDUl9SRUdfUENSIHwgKFBDUl9SRVNFVCB8IHNwZWVkIHwgZHVwbGV4KSk7Ci0JCQlzbGljX3JlZzMyX3dyaXRlKHdwaHksIHBoeV9jb25maWcsIEZMVVNIKTsKKwkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XUEhZLCBwaHlfY29uZmlnKTsKIAkJfSBlbHNlIHsJLyogaXQncyBhIENpY2FkYSBQSFkgICovCiAJCQkvKiBkaXNhYmxlIGF1dG8tbmVnLCBzZXQgc3BlZWQsIHBvd2VydXAgICovCiAJCQlwaHlfY29uZmlnID0gKE1JSUNSX1JFR19QQ1IgfCAoc3BlZWQgfCBkdXBsZXgpKTsKLQkJCXNsaWNfcmVnMzJfd3JpdGUod3BoeSwgcGh5X2NvbmZpZywgRkxVU0gpOworCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dQSFksIHBoeV9jb25maWcpOwogCQl9CiAJfQogfQpAQCAtMzg2LDcgKzM1OSw2IEBACiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKIAljb25zdCBjaGFyICpmaWxlID0gIiI7CiAJaW50IHJldDsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKIAl1MzIgY29kZWFkZHI7CiAJdTMyIGluc3RydWN0aW9uOwogCWludCBpbmRleCA9IDA7CkBAIC00MjcsMjcgKzM5OSwyOCBAQAogCQlicmVhazsKIAl9CiAJLyogc3RhcnQgZG93bmxvYWQgKi8KLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfcmN2X3djcywgU0xJQ19SQ1ZXQ1NfQkVHSU4sIEZMVVNIKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfUkNWX1dDUywgU0xJQ19SQ1ZXQ1NfQkVHSU4pOwogCS8qIGRvd25sb2FkIHRoZSByY3Ygc2VxdWVuY2VyIHVjb2RlICovCiAJZm9yIChjb2RlYWRkciA9IDA7IGNvZGVhZGRyIDwgcmN2dWNvZGVsZW47IGNvZGVhZGRyKyspIHsKIAkJLyogd3JpdGUgb3V0IGluc3RydWN0aW9uIGFkZHJlc3MgKi8KLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3Jjdl93Y3MsIGNvZGVhZGRyLCBGTFVTSCk7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19SQ1ZfV0NTLCBjb2RlYWRkcik7CiAKIAkJaW5zdHJ1Y3Rpb24gPSAqKHUzMiAqKShmdy0+ZGF0YSArIGluZGV4KTsKIAkJaW5kZXggKz0gNDsKIAkJLyogd3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbiBkYXRhIGxvdyBhZGRyICovCi0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19yY3Zfd2NzLCBpbnN0cnVjdGlvbiwgRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfUkNWX1dDUywgaW5zdHJ1Y3Rpb24pOwogCiAJCWluc3RydWN0aW9uID0gKih1OCAqKShmdy0+ZGF0YSArIGluZGV4KTsKIAkJaW5kZXgrKzsKIAkJLyogd3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbiBkYXRhIGhpZ2ggYWRkciAqLwotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfcmN2X3djcywgKHU4KWluc3RydWN0aW9uLAotCQkJCSBGTFVTSCk7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19SQ1ZfV0NTLCBpbnN0cnVjdGlvbik7CiAJfQogCiAJLyogZG93bmxvYWQgZmluaXNoZWQgKi8KIAlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfcmN2X3djcywgU0xJQ19SQ1ZXQ1NfRklOSVNILCBGTFVTSCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1JDVl9XQ1MsIFNMSUNfUkNWV0NTX0ZJTklTSCk7CisJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKKwogCXJldHVybiAwOwogfQogCkBAIC00NjIsNyArNDM1LDYgQEAKIAl1MzIgc2VjdGlvbjsKIAlpbnQgdGhpc3NlY3Rpb25zaXplOwogCWludCBjb2RlYWRkcjsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKIAl1MzIgaW5zdHJ1Y3Rpb247CiAJdTMyIGJhc2VhZGRyZXNzOwogCXUzMiBpOwpAQCAtNTA2LDE3ICs0NzgsMTcgQEAKIAogCQlmb3IgKGNvZGVhZGRyID0gMDsgY29kZWFkZHIgPCB0aGlzc2VjdGlvbnNpemU7IGNvZGVhZGRyKyspIHsKIAkJCS8qIFdyaXRlIG91dCBpbnN0cnVjdGlvbiBhZGRyZXNzICovCi0JCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd2NzLAotCQkJCQkgYmFzZWFkZHJlc3MgKyBjb2RlYWRkciwgRkxVU0gpOworCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dDUywKKwkJCQkgICAgIGJhc2VhZGRyZXNzICsgY29kZWFkZHIpOwogCQkJLyogV3JpdGUgb3V0IGluc3RydWN0aW9uIHRvIGxvdyBhZGRyICovCi0JCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd2NzLAotCQkJCQlpbnN0cnVjdGlvbiwgRkxVU0gpOworCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dDUywKKwkJCQkgICAgIGluc3RydWN0aW9uKTsKIAkJCWluc3RydWN0aW9uID0gKih1MzIgKikoZnctPmRhdGEgKyBpbmRleCk7CiAJCQlpbmRleCArPSA0OwogCiAJCQkvKiBXcml0ZSBvdXQgaW5zdHJ1Y3Rpb24gdG8gaGlnaCBhZGRyICovCi0JCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd2NzLAotCQkJCQlpbnN0cnVjdGlvbiwgRkxVU0gpOworCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dDUywKKwkJCQkgICAgIGluc3RydWN0aW9uKTsKIAkJCWluc3RydWN0aW9uID0gKih1MzIgKikoZnctPmRhdGEgKyBpbmRleCk7CiAJCQlpbmRleCArPSA0OwogCQl9CkBAIC01MzEsMjcgKzUwMywyNSBAQAogCiAJCWZvciAoY29kZWFkZHIgPSAwOyBjb2RlYWRkciA8IHRoaXNzZWN0aW9uc2l6ZTsgY29kZWFkZHIrKykgewogCQkJLyogV3JpdGUgb3V0IGluc3RydWN0aW9uIGFkZHJlc3MgKi8KLQkJCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193Y3MsCi0JCQkJU0xJQ19XQ1NfQ09NUEFSRSB8IChiYXNlYWRkcmVzcyArIGNvZGVhZGRyKSwKLQkJCQlGTFVTSCk7CisJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV0NTLAorCQkJCSAgICAgU0xJQ19XQ1NfQ09NUEFSRSB8IChiYXNlYWRkcmVzcyArCisJCQkJCQkJIGNvZGVhZGRyKSk7CiAJCQkvKiBXcml0ZSBvdXQgaW5zdHJ1Y3Rpb24gdG8gbG93IGFkZHIgKi8KLQkJCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193Y3MsIGluc3RydWN0aW9uLAotCQkJCQkgRkxVU0gpOworCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dDUywgaW5zdHJ1Y3Rpb24pOwogCQkJaW5zdHJ1Y3Rpb24gPSAqKHUzMiAqKShmdy0+ZGF0YSArIGluZGV4KTsKIAkJCWluZGV4ICs9IDQ7CiAJCQkvKiBXcml0ZSBvdXQgaW5zdHJ1Y3Rpb24gdG8gaGlnaCBhZGRyICovCi0JCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd2NzLCBpbnN0cnVjdGlvbiwKLQkJCQkJIEZMVVNIKTsKKwkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XQ1MsIGluc3RydWN0aW9uKTsKIAkJCWluc3RydWN0aW9uID0gKih1MzIgKikoZnctPmRhdGEgKyBpbmRleCk7CiAJCQlpbmRleCArPSA0OwotCiAJCX0KIAl9CiAJcmVsZWFzZV9maXJtd2FyZShmdyk7CiAJLyogRXZlcnl0aGluZyBPSywga2ljayBvZmYgdGhlIGNhcmQgKi8KIAltZGVsYXkoMTApOwotCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193Y3MsIFNMSUNfV0NTX1NUQVJULCBGTFVTSCk7CiAKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV0NTLCBTTElDX1dDU19TVEFSVCk7CisJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKIAkvKgogCSAqIHN0YWxsIGZvciAyMCBtcywgbG9uZyBlbm91Z2ggZm9yIHVjb2RlIHRvIGluaXQgY2FyZAogCSAqIGFuZCByZWFjaCBtYWlubG9vcApAQCAtNTgzLDE5ICs1NTMsMjEgQEAKIAogc3RhdGljIHZvaWQgc2xpY19pbnRhZ2dfc2V0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgdmFsdWUpCiB7Ci0Jc2xpY19yZWczMl93cml0ZSgmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2ludGFnZywgdmFsdWUsIEZMVVNIKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfSU5UQUdHLCB2YWx1ZSk7CiAJYWRhcHRlci0+Y2FyZC0+bG9hZGxldmVsX2N1cnJlbnQgPSB2YWx1ZTsKIH0KIAogc3RhdGljIHZvaWQgc2xpY19zb2Z0X3Jlc2V0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewogCWlmIChhZGFwdGVyLT5jYXJkLT5zdGF0ZSA9PSBDQVJEX1VQKSB7Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19xdWllc2NlLCAwLCBGTFVTSCk7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19RVUlFU0NFLCAwKTsKKwkJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKIAkJbWRlbGF5KDEpOwogCX0KIAotCXNsaWNfcmVnMzJfd3JpdGUoJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19yZXNldCwgU0xJQ19SRVNFVF9NQUdJQywKLQkJCSBGTFVTSCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1JFU0VULCBTTElDX1JFU0VUX01BR0lDKTsKKwlzbGljX2ZsdXNoX3dyaXRlKGFkYXB0ZXIpOworCiAJbWRlbGF5KDEpOwogfQogCkBAIC02MDMsMTcgKzU3NSwxNiBAQAogewogCXUzMiB2YWx1ZTsKIAl1MzIgdmFsdWUyOwotCV9faW9tZW0gc3RydWN0IHNsaWNfcmVncyAqc2xpY19yZWdzID0gYWRhcHRlci0+c2xpY19yZWdzOwogCiAJdmFsdWUgPSBudG9obCgqKF9fYmUzMiAqKSZhZGFwdGVyLT5jdXJybWFjYWRkclsyXSk7Ci0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3dyYWRkcmFsLCB2YWx1ZSwgRkxVU0gpOwotCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193cmFkZHJibCwgdmFsdWUsIEZMVVNIKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1JBRERSQUwsIHZhbHVlKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1JBRERSQkwsIHZhbHVlKTsKIAogCXZhbHVlMiA9ICh1MzIpKChhZGFwdGVyLT5jdXJybWFjYWRkclswXSA8PCA4IHwKIAkJCSAgICAgYWRhcHRlci0+Y3Vycm1hY2FkZHJbMV0pICYgMHhGRkZGKTsKIAotCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193cmFkZHJhaCwgdmFsdWUyLCBGTFVTSCk7Ci0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3dyYWRkcmJoLCB2YWx1ZTIsIEZMVVNIKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1JBRERSQUgsIHZhbHVlMik7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dSQUREUkJILCB2YWx1ZTIpOwogCiAJLyoKIAkgKiBXcml0ZSBvdXIgbXVsdGljYXN0IG1hc2sgb3V0IHRvIHRoZSBjYXJkLiAgVGhpcyBpcyBkb25lCkBAIC02MjYsNyArNTk3LDYgQEAKIHN0YXRpYyB2b2lkIHNsaWNfbWFjX2NvbmZpZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKIAl1MzIgdmFsdWU7Ci0JX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICpzbGljX3JlZ3MgPSBhZGFwdGVyLT5zbGljX3JlZ3M7CiAKIAkvKiBTZXR1cCBHTUFDIGdhcHMgKi8KIAlpZiAoYWRhcHRlci0+bGlua3NwZWVkID09IExJTktfMTAwME1CKSB7CkBAIC02NTAsNyArNjIwLDcgQEAKIAl9CiAKIAkvKiB3cml0ZSBtYWMgY29uZmlnICovCi0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3dtY2ZnLCB2YWx1ZSwgRkxVU0gpOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XTUNGRywgdmFsdWUpOwogCiAJLyogc2V0dXAgbWFjIGFkZHJlc3NlcyAqLwogCXNsaWNfbWFjX2FkZHJlc3NfY29uZmlnKGFkYXB0ZXIpOwpAQCAtNjYwLDcgKzYzMCw2IEBACiB7CiAJdTMyIHZhbHVlOwogCXUzMiBSY3JSZXNldDsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKIAogCWlmIChsaW5rY2hhbmdlKSB7CiAJCS8qIFNldHVwIE1BQyAqLwpAQCAtNjc3LDcgKzY0Niw3IEBACiAJCQkgR1hDUl9YTVRFTiB8CS8qIEVuYWJsZSB0cmFuc21pdCAgKi8KIAkJCSBHWENSX1BBVVNFRU4pOwkvKiBFbmFibGUgcGF1c2UgICAgICovCiAKLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3d4Y2ZnLCB2YWx1ZSwgRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1hDRkcsIHZhbHVlKTsKIAogCQkvKiBTZXR1cCByY3ZjZmcgbGFzdCAqLwogCQl2YWx1ZSA9IChSY3JSZXNldCB8CS8qIFJlc2V0LCBpZiBsaW5rY2hhbmdlICovCkBAIC02OTAsNyArNjU5LDcgQEAKIAkJdmFsdWUgPSAoR1hDUl9SRVNFVCB8CS8qIEFsd2F5cyByZXNldCAgICAgKi8KIAkJCSBHWENSX1hNVEVOKTsJLyogRW5hYmxlIHRyYW5zbWl0ICAqLwogCi0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193eGNmZywgdmFsdWUsIEZMVVNIKTsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dYQ0ZHLCB2YWx1ZSk7CiAKIAkJLyogU2V0dXAgcmN2Y2ZnIGxhc3QgKi8KIAkJdmFsdWUgPSAoUmNyUmVzZXQgfAkvKiBSZXNldCwgaWYgbGlua2NoYW5nZSAqLwpAQCAtNzA3LDcgKzY3Niw3IEBACiAJaWYgKGFkYXB0ZXItPm1hY29wdHMgJiBNQUNfUFJPTUlTQykKIAkJdmFsdWUgfD0gR1JDUl9SQ1ZBTEw7CiAKLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd3JjZmcsIHZhbHVlLCBGTFVTSCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dSQ0ZHLCB2YWx1ZSk7CiB9CiAKIC8qCkBAIC03MTcsMjQgKzY4NiwyMyBAQAogewogCXUzMiB2YWx1ZTsKIAl1MzIgcGh5X2NvbmZpZzsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKIAogCS8qIFNldHVwIHhtdGNmZyAqLwogCXZhbHVlID0gKEdYQ1JfUkVTRVQgfAkvKiBBbHdheXMgcmVzZXQgKi8KIAkJIEdYQ1JfUEFVU0VFTik7CS8qIEVuYWJsZSBwYXVzZSAqLwogCi0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3d4Y2ZnLCB2YWx1ZSwgRkxVU0gpOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XWENGRywgdmFsdWUpOwogCiAJdmFsdWUgPSAoR1JDUl9SRVNFVCB8CS8qIEFsd2F5cyByZXNldCAgICAgICovCiAJCSBHUkNSX0NUTEVOIHwJLyogRW5hYmxlIENUTCBmcmFtZXMgKi8KIAkJIEdSQ1JfQUREUkFFTiB8CS8qIEFkZHJlc3MgQSBlbmFibGUgICovCiAJCSAoR1JDUl9IQVNIU0laRSA8PCBHUkNSX0hBU0hTSVpFX1NISUZUKSk7CiAKLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd3JjZmcsIHZhbHVlLCBGTFVTSCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dSQ0ZHLCB2YWx1ZSk7CiAKIAkvKiBwb3dlciBkb3duIHBoeSAqLwogCXBoeV9jb25maWcgPSAoTUlJQ1JfUkVHX1BDUiB8IChQQ1JfUE9XRVJET1dOKSk7Ci0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3dwaHksIHBoeV9jb25maWcsIEZMVVNIKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1BIWSwgcGh5X2NvbmZpZyk7CiB9CiAKIHN0YXRpYyBib29sIHNsaWNfbWFjX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKQEAgLTgxMCwxMyArNzc4LDExIEBACiB7CiAJc3RydWN0IHNsaWNjYXJkICpjYXJkID0gKHN0cnVjdCBzbGljY2FyZCAqKWNhcmRhZGRyOwogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gY2FyZC0+bWFzdGVyOwotCXUzMiBfX2lvbWVtICppbnRhZ2c7CiAJdTMyIGxvYWQgPSBjYXJkLT5ldmVudHM7CiAJdTMyIGxldmVsID0gMDsKIAogCWlmICgoYWRhcHRlcikgJiYgKGFkYXB0ZXItPnN0YXRlID09IEFEQVBUX1VQKSAmJgogCSAgICAoY2FyZC0+c3RhdGUgPT0gQ0FSRF9VUCkgJiYgKHNsaWNfZ2xvYmFsLmR5bmFtaWNfaW50YWdnKSkgewotCQlpbnRhZ2cgPSAmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2ludGFnZzsKIAkJaWYgKGFkYXB0ZXItPmRldmlkID09IFNMSUNfMUdCX0RFVklDRV9JRCkgewogCQkJaWYgKGFkYXB0ZXItPmxpbmtzcGVlZCA9PSBMSU5LXzEwMDBNQikKIAkJCQlsZXZlbCA9IDEwMDsKQEAgLTgzNiw3ICs4MDIsNyBAQAogCQkJfQogCQkJaWYgKGNhcmQtPmxvYWRsZXZlbF9jdXJyZW50ICE9IGxldmVsKSB7CiAJCQkJY2FyZC0+bG9hZGxldmVsX2N1cnJlbnQgPSBsZXZlbDsKLQkJCQlzbGljX3JlZzMyX3dyaXRlKGludGFnZywgbGV2ZWwsIEZMVVNIKTsKKwkJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfSU5UQUdHLCBsZXZlbCk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAobG9hZCA+IFNMSUNfTE9BRF81KQpAQCAtODUzLDcgKzgxOSw3IEBACiAJCQkJbGV2ZWwgPSBTTElDX0lOVEFHR18wOwogCQkJaWYgKGNhcmQtPmxvYWRsZXZlbF9jdXJyZW50ICE9IGxldmVsKSB7CiAJCQkJY2FyZC0+bG9hZGxldmVsX2N1cnJlbnQgPSBsZXZlbDsKLQkJCQlzbGljX3JlZzMyX3dyaXRlKGludGFnZywgbGV2ZWwsIEZMVVNIKTsKKwkJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfSU5UQUdHLCBsZXZlbCk7CiAJCQl9CiAJCX0KIAl9CkBAIC04OTcsNyArODYzLDYgQEAKIHN0YXRpYyB2b2lkIHNsaWNfdXByX3N0YXJ0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBzbGljX3VwciAqdXByOwotCV9faW9tZW0gc3RydWN0IHNsaWNfcmVncyAqc2xpY19yZWdzID0gYWRhcHRlci0+c2xpY19yZWdzOwogCiAJdXByID0gYWRhcHRlci0+dXByX2xpc3Q7CiAJaWYgKCF1cHIpCkBAIC05MDksMzEgKzg3NCwyNyBAQAogCXN3aXRjaCAodXByLT51cHJfcmVxdWVzdCkgewogCWNhc2UgU0xJQ19VUFJfU1RBVFM6CiAJCWlmICh1cHItPnVwcl9kYXRhX2ggPT0gMCkgewotCQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3N0YXRzLCB1cHItPnVwcl9kYXRhLAotCQkJCQkgRkxVU0gpOworCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1JTVEFULCB1cHItPnVwcl9kYXRhKTsKIAkJfSBlbHNlIHsKLQkJCXNsaWNfcmVnNjRfd3JpdGUoYWRhcHRlciwgJnNsaWNfcmVncy0+c2xpY19zdGF0czY0LAotCQkJCQkgdXByLT51cHJfZGF0YSwKLQkJCQkJICZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwKLQkJCQkJIHVwci0+dXByX2RhdGFfaCwgRkxVU0gpOworCQkJc2xpY193cml0ZTY0KGFkYXB0ZXIsIFNMSUNfUkVHX1JTVEFUNjQsIHVwci0+dXByX2RhdGEsCisJCQkJICAgICB1cHItPnVwcl9kYXRhX2gpOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBTTElDX1VQUl9STFNSOgotCQlzbGljX3JlZzY0X3dyaXRlKGFkYXB0ZXIsICZzbGljX3JlZ3MtPnNsaWNfcmxzciwgdXByLT51cHJfZGF0YSwKLQkJCQkgJnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLCB1cHItPnVwcl9kYXRhX2gsCi0JCQkJIEZMVVNIKTsKKwkJc2xpY193cml0ZTY0KGFkYXB0ZXIsIFNMSUNfUkVHX0xTVEFULCB1cHItPnVwcl9kYXRhLAorCQkJICAgICB1cHItPnVwcl9kYXRhX2gpOwogCQlicmVhazsKIAogCWNhc2UgU0xJQ19VUFJfUkNPTkZJRzoKLQkJc2xpY19yZWc2NF93cml0ZShhZGFwdGVyLCAmc2xpY19yZWdzLT5zbGljX3Jjb25maWcsCi0JCQkJIHVwci0+dXByX2RhdGEsICZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwKLQkJCQkgdXByLT51cHJfZGF0YV9oLCBGTFVTSCk7CisJCXNsaWNfd3JpdGU2NChhZGFwdGVyLCBTTElDX1JFR19SQ09ORklHLCB1cHItPnVwcl9kYXRhLAorCQkJICAgICB1cHItPnVwcl9kYXRhX2gpOwogCQlicmVhazsKIAljYXNlIFNMSUNfVVBSX1BJTkc6Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19waW5nLCAxLCBGTFVTSCk7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19QSU5HLCAxKTsKIAkJYnJlYWs7CiAJfQorCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CiB9CiAKIHN0YXRpYyBpbnQgc2xpY191cHJfcmVxdWVzdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKQEAgLTk2MSw0MiArOTIyLDM0IEBACiAKIHN0YXRpYyB2b2lkIHNsaWNfbGlua191cHJfY29tcGxldGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBpc3IpCiB7Ci0JdTMyIGxpbmtzdGF0dXMgPSBhZGFwdGVyLT5wc2htZW0tPmxpbmtzdGF0dXM7CisJc3RydWN0IHNsaWNfc2htZW1vcnkgKnNtID0gJmFkYXB0ZXItPnNobWVtOworCXN0cnVjdCBzbGljX3NobWVtX2RhdGEgKnNtX2RhdGEgPSBzbS0+c2htZW1fZGF0YTsKKwl1MzIgbHN0ID0gc21fZGF0YS0+bG5rc3RhdHVzOwogCXVpbnQgbGlua3VwOwogCXVuc2lnbmVkIGNoYXIgbGlua3NwZWVkOwogCXVuc2lnbmVkIGNoYXIgbGlua2R1cGxleDsKIAogCWlmICgoaXNyICYgSVNSX1VQQ0VSUikgfHwgKGlzciAmIElTUl9VUENCU1kpKSB7Ci0JCXN0cnVjdCBzbGljX3NobWVtICpwc2htZW07CisJCWRtYV9hZGRyX3QgcGhhZGRyID0gc20tPmxua3N0YXR1c19waGFkZHI7CiAKLQkJcHNobWVtID0gKHN0cnVjdCBzbGljX3NobWVtICopKHVuc2lnbmVkIGxvbmcpCi0JCQkgYWRhcHRlci0+cGh5c19zaG1lbTsKLSNpZiBCSVRTX1BFUl9MT05HID09IDY0Ci0JCXNsaWNfdXByX3F1ZXVlX3JlcXVlc3QoYWRhcHRlciwKLQkJCQkgICAgICAgU0xJQ19VUFJfUkxTUiwKLQkJCQkgICAgICAgU0xJQ19HRVRfQUREUl9MT1coJnBzaG1lbS0+bGlua3N0YXR1cyksCi0JCQkJICAgICAgIFNMSUNfR0VUX0FERFJfSElHSCgmcHNobWVtLT5saW5rc3RhdHVzKSwKKwkJc2xpY191cHJfcXVldWVfcmVxdWVzdChhZGFwdGVyLCBTTElDX1VQUl9STFNSLAorCQkJCSAgICAgICBjcHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKHBoYWRkcikpLAorCQkJCSAgICAgICBjcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKHBoYWRkcikpLAogCQkJCSAgICAgICAwLCAwKTsKLSNlbHNlCi0JCXNsaWNfdXByX3F1ZXVlX3JlcXVlc3QoYWRhcHRlciwKLQkJCQkgICAgICAgU0xJQ19VUFJfUkxTUiwKLQkJCQkgICAgICAgKHUzMikmcHNobWVtLT5saW5rc3RhdHVzLAotCQkJCSAgICAgICBTTElDX0dFVF9BRERSX0hJR0gocHNobWVtKSwgMCwgMCk7Ci0jZW5kaWYKIAkJcmV0dXJuOwogCX0KIAlpZiAoYWRhcHRlci0+c3RhdGUgIT0gQURBUFRfVVApCiAJCXJldHVybjsKIAotCWxpbmt1cCA9IGxpbmtzdGF0dXMgJiBHSUdfTElOS1VQID8gTElOS19VUCA6IExJTktfRE9XTjsKLQlpZiAobGlua3N0YXR1cyAmIEdJR19TUEVFRF8xMDAwKQorCWxpbmt1cCA9IGxzdCAmIEdJR19MSU5LVVAgPyBMSU5LX1VQIDogTElOS19ET1dOOworCWlmIChsc3QgJiBHSUdfU1BFRURfMTAwMCkKIAkJbGlua3NwZWVkID0gTElOS18xMDAwTUI7Ci0JZWxzZSBpZiAobGlua3N0YXR1cyAmIEdJR19TUEVFRF8xMDApCisJZWxzZSBpZiAobHN0ICYgR0lHX1NQRUVEXzEwMCkKIAkJbGlua3NwZWVkID0gTElOS18xMDBNQjsKIAllbHNlCiAJCWxpbmtzcGVlZCA9IExJTktfMTBNQjsKIAotCWlmIChsaW5rc3RhdHVzICYgR0lHX0ZVTExEVVBMRVgpCisJaWYgKGxzdCAmIEdJR19GVUxMRFVQTEVYKQogCQlsaW5rZHVwbGV4ID0gTElOS19GVUxMRDsKIAllbHNlCiAJCWxpbmtkdXBsZXggPSBMSU5LX0hBTEZEOwpAQCAtMTAxNiw2ICs5NjksNyBAQAogCS8qIGxpbmsgaGFzIGdvbmUgZnJvbSB1cCB0byBkb3duICovCiAJaWYgKGxpbmt1cCA9PSBMSU5LX0RPV04pIHsKIAkJYWRhcHRlci0+bGlua3N0YXRlID0gTElOS19ET1dOOworCQluZXRpZl9jYXJyaWVyX29mZihhZGFwdGVyLT5uZXRkZXYpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMDI3LDcgKzk4MSw3IEBACiAJCS8qIHNldHVwIHRoZSBtYWMgKi8KIAkJc2xpY19jb25maWdfc2V0KGFkYXB0ZXIsIHRydWUpOwogCQlhZGFwdGVyLT5saW5rc3RhdGUgPSBMSU5LX1VQOwotCQluZXRpZl9zdGFydF9xdWV1ZShhZGFwdGVyLT5uZXRkZXYpOworCQluZXRpZl9jYXJyaWVyX29uKGFkYXB0ZXItPm5ldGRldik7CiAJfQogfQogCkBAIC0xMDQ3LDgxICsxMDAxLDY1IEBACiAJdXByLT5uZXh0ID0gTlVMTDsKIAlhZGFwdGVyLT51cHJfYnVzeSA9IDA7CiAJc3dpdGNoICh1cHItPnVwcl9yZXF1ZXN0KSB7Ci0JY2FzZSBTTElDX1VQUl9TVEFUUzoKLQkJewotCQkJc3RydWN0IHNsaWNfc3RhdHMgKnNsaWNzdGF0cyA9Ci0JCQkgICAgKHN0cnVjdCBzbGljX3N0YXRzICopJmFkYXB0ZXItPnBzaG1lbS0+aW5pY3N0YXRzOwotCQkJc3RydWN0IHNsaWNfc3RhdHMgKm5ld3N0YXRzID0gc2xpY3N0YXRzOwotCQkJc3RydWN0IHNsaWNfc3RhdHMgICpvbGQgPSAmYWRhcHRlci0+aW5pY3N0YXRzX3ByZXY7Ci0JCQlzdHJ1Y3Qgc2xpY25ldF9zdGF0cyAqc3RzdCA9ICZhZGFwdGVyLT5zbGljX3N0YXRzOworCWNhc2UgU0xJQ19VUFJfU1RBVFM6IHsKKwkJc3RydWN0IHNsaWNfc2htZW1vcnkgKnNtID0gJmFkYXB0ZXItPnNobWVtOworCQlzdHJ1Y3Qgc2xpY19zaG1lbV9kYXRhICpzbV9kYXRhID0gc20tPnNobWVtX2RhdGE7CisJCXN0cnVjdCBzbGljX3N0YXRzICpzdGF0cyA9ICZzbV9kYXRhLT5zdGF0czsKKwkJc3RydWN0IHNsaWNfc3RhdHMgKm9sZCA9ICZhZGFwdGVyLT5pbmljc3RhdHNfcHJldjsKKwkJc3RydWN0IHNsaWNuZXRfc3RhdHMgKnN0c3QgPSAmYWRhcHRlci0+c2xpY19zdGF0czsKIAotCQkJaWYgKGlzciAmIElTUl9VUENFUlIpIHsKLQkJCQlkZXZfZXJyKCZhZGFwdGVyLT5uZXRkZXYtPmRldiwKLQkJCQkJIlNMSUNfVVBSX1NUQVRTIGNvbW1hbmQgZmFpbGVkIGlzclsleF1cbiIsCi0JCQkJCWlzcik7Ci0KLQkJCQlicmVhazsKLQkJCX0KLQkJCVVQREFURV9TVEFUU19HQihzdHN0LT50Y3AueG1pdF90Y3Bfc2VncywKLQkJCQkJbmV3c3RhdHMtPnhtaXRfdGNwX3NlZ3NfZ2IsCi0JCQkJCW9sZC0+eG1pdF90Y3Bfc2Vnc19nYik7Ci0KLQkJCVVQREFURV9TVEFUU19HQihzdHN0LT50Y3AueG1pdF90Y3BfYnl0ZXMsCi0JCQkJCW5ld3N0YXRzLT54bWl0X3RjcF9ieXRlc19nYiwKLQkJCQkJb2xkLT54bWl0X3RjcF9ieXRlc19nYik7Ci0KLQkJCVVQREFURV9TVEFUU19HQihzdHN0LT50Y3AucmN2X3RjcF9zZWdzLAotCQkJCQluZXdzdGF0cy0+cmN2X3RjcF9zZWdzX2diLAotCQkJCQlvbGQtPnJjdl90Y3Bfc2Vnc19nYik7Ci0KLQkJCVVQREFURV9TVEFUU19HQihzdHN0LT50Y3AucmN2X3RjcF9ieXRlcywKLQkJCQkJbmV3c3RhdHMtPnJjdl90Y3BfYnl0ZXNfZ2IsCi0JCQkJCW9sZC0+cmN2X3RjcF9ieXRlc19nYik7Ci0KLQkJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS54bXRfYnl0ZXMsCi0JCQkJCW5ld3N0YXRzLT54bWl0X2J5dGVzX2diLAotCQkJCQlvbGQtPnhtaXRfYnl0ZXNfZ2IpOwotCi0JCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+aWZhY2UueG10X3VjYXN0LAotCQkJCQluZXdzdGF0cy0+eG1pdF91bmljYXN0c19nYiwKLQkJCQkJb2xkLT54bWl0X3VuaWNhc3RzX2diKTsKLQotCQkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnJjdl9ieXRlcywKLQkJCQkJbmV3c3RhdHMtPnJjdl9ieXRlc19nYiwKLQkJCQkJb2xkLT5yY3ZfYnl0ZXNfZ2IpOwotCi0JCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+aWZhY2UucmN2X3VjYXN0LAotCQkJCQluZXdzdGF0cy0+cmN2X3VuaWNhc3RzX2diLAotCQkJCQlvbGQtPnJjdl91bmljYXN0c19nYik7Ci0KLQkJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS54bXRfZXJyb3JzLAotCQkJCQluZXdzdGF0cy0+eG1pdF9jb2xsaXNpb25zX2diLAotCQkJCQlvbGQtPnhtaXRfY29sbGlzaW9uc19nYik7Ci0KLQkJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS54bXRfZXJyb3JzLAotCQkJCQluZXdzdGF0cy0+eG1pdF9leGNlc3NfY29sbGlzaW9uc19nYiwKLQkJCQkJb2xkLT54bWl0X2V4Y2Vzc19jb2xsaXNpb25zX2diKTsKLQotCQkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnhtdF9lcnJvcnMsCi0JCQkJCW5ld3N0YXRzLT54bWl0X290aGVyX2Vycm9yX2diLAotCQkJCQlvbGQtPnhtaXRfb3RoZXJfZXJyb3JfZ2IpOwotCi0JCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+aWZhY2UucmN2X2Vycm9ycywKLQkJCQkJbmV3c3RhdHMtPnJjdl9vdGhlcl9lcnJvcl9nYiwKLQkJCQkJb2xkLT5yY3Zfb3RoZXJfZXJyb3JfZ2IpOwotCi0JCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+aWZhY2UucmN2X2Rpc2NhcmRzLAotCQkJCQluZXdzdGF0cy0+cmN2X2Ryb3BzX2diLAotCQkJCQlvbGQtPnJjdl9kcm9wc19nYik7Ci0KLQkJCWlmIChuZXdzdGF0cy0+cmN2X2Ryb3BzX2diID4gb2xkLT5yY3ZfZHJvcHNfZ2IpIHsKLQkJCQlhZGFwdGVyLT5yY3ZfZHJvcHMgKz0KLQkJCQkgICAgKG5ld3N0YXRzLT5yY3ZfZHJvcHNfZ2IgLQotCQkJCSAgICAgb2xkLT5yY3ZfZHJvcHNfZ2IpOwotCQkJfQotCQkJbWVtY3B5KG9sZCwgbmV3c3RhdHMsIHNpemVvZihzdHJ1Y3Qgc2xpY19zdGF0cykpOworCQlpZiAoaXNyICYgSVNSX1VQQ0VSUikgeworCQkJZGV2X2VycigmYWRhcHRlci0+bmV0ZGV2LT5kZXYsCisJCQkJIlNMSUNfVVBSX1NUQVRTIGNvbW1hbmQgZmFpbGVkIGlzclsleF1cbiIsIGlzcik7CiAJCQlicmVhazsKIAkJfQorCisJCVVQREFURV9TVEFUU19HQihzdHN0LT50Y3AueG1pdF90Y3Bfc2Vncywgc3RhdHMtPnhtaXRfdGNwX3NlZ3MsCisJCQkJb2xkLT54bWl0X3RjcF9zZWdzKTsKKworCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+dGNwLnhtaXRfdGNwX2J5dGVzLCBzdGF0cy0+eG1pdF90Y3BfYnl0ZXMsCisJCQkJb2xkLT54bWl0X3RjcF9ieXRlcyk7CisKKwkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPnRjcC5yY3ZfdGNwX3NlZ3MsIHN0YXRzLT5yY3ZfdGNwX3NlZ3MsCisJCQkJb2xkLT5yY3ZfdGNwX3NlZ3MpOworCisJCVVQREFURV9TVEFUU19HQihzdHN0LT50Y3AucmN2X3RjcF9ieXRlcywgc3RhdHMtPnJjdl90Y3BfYnl0ZXMsCisJCQkJb2xkLT5yY3ZfdGNwX2J5dGVzKTsKKworCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+aWZhY2UueG10X2J5dGVzLCBzdGF0cy0+eG1pdF9ieXRlcywKKwkJCQlvbGQtPnhtaXRfYnl0ZXMpOworCisJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS54bXRfdWNhc3QsIHN0YXRzLT54bWl0X3VuaWNhc3RzLAorCQkJCW9sZC0+eG1pdF91bmljYXN0cyk7CisKKwkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnJjdl9ieXRlcywgc3RhdHMtPnJjdl9ieXRlcywKKwkJCQlvbGQtPnJjdl9ieXRlcyk7CisKKwkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnJjdl91Y2FzdCwgc3RhdHMtPnJjdl91bmljYXN0cywKKwkJCQlvbGQtPnJjdl91bmljYXN0cyk7CisKKwkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnhtdF9lcnJvcnMsIHN0YXRzLT54bWl0X2NvbGxpc2lvbnMsCisJCQkJb2xkLT54bWl0X2NvbGxpc2lvbnMpOworCisJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS54bXRfZXJyb3JzLAorCQkJCXN0YXRzLT54bWl0X2V4Y2Vzc19jb2xsaXNpb25zLAorCQkJCW9sZC0+eG1pdF9leGNlc3NfY29sbGlzaW9ucyk7CisKKwkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnhtdF9lcnJvcnMsIHN0YXRzLT54bWl0X290aGVyX2Vycm9yLAorCQkJCW9sZC0+eG1pdF9vdGhlcl9lcnJvcik7CisKKwkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnJjdl9lcnJvcnMsIHN0YXRzLT5yY3Zfb3RoZXJfZXJyb3IsCisJCQkJb2xkLT5yY3Zfb3RoZXJfZXJyb3IpOworCisJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS5yY3ZfZGlzY2FyZHMsIHN0YXRzLT5yY3ZfZHJvcHMsCisJCQkJb2xkLT5yY3ZfZHJvcHMpOworCisJCWlmIChzdGF0cy0+cmN2X2Ryb3BzID4gb2xkLT5yY3ZfZHJvcHMpCisJCQlhZGFwdGVyLT5yY3ZfZHJvcHMgKz0gKHN0YXRzLT5yY3ZfZHJvcHMgLQorCQkJCQkgICAgICAgb2xkLT5yY3ZfZHJvcHMpOworCQltZW1jcHlfZnJvbWlvKG9sZCwgc3RhdHMsIHNpemVvZigqc3RhdHMpKTsKKwkJYnJlYWs7CisJfQogCWNhc2UgU0xJQ19VUFJfUkxTUjoKIAkJc2xpY19saW5rX3Vwcl9jb21wbGV0ZShhZGFwdGVyLCBpc3IpOwogCQlicmVhazsKQEAgLTExODYsNyArMTEyNCw2IEBACiB7CiAJaW50IGk7CiAJc3RydWN0IHNsaWNfcnNwcXVldWUgKnJzcHEgPSAmYWRhcHRlci0+cnNwcXVldWU7Ci0JX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICpzbGljX3JlZ3MgPSBhZGFwdGVyLT5zbGljX3JlZ3M7CiAJdTMyIHBhZGRyaCA9IDA7CiAKIAltZW1zZXQocnNwcSwgMCwgc2l6ZW9mKHN0cnVjdCBzbGljX3JzcHF1ZXVlKSk7CkBAIC0xMjA1LDE0ICsxMTQyLDEyIEBACiAJCX0KIAogCQlpZiAocGFkZHJoID09IDApIHsKLQkJCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19yYmFyLAotCQkJCShyc3BxLT5wYWRkcltpXSB8IFNMSUNfUlNQUV9CVUZTSU5QQUdFKSwKLQkJCQlET05UX0ZMVVNIKTsKKwkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19SQkFSLAorCQkJCSAgICAgcnNwcS0+cGFkZHJbaV0gfCBTTElDX1JTUFFfQlVGU0lOUEFHRSk7CiAJCX0gZWxzZSB7Ci0JCQlzbGljX3JlZzY0X3dyaXRlKGFkYXB0ZXIsICZzbGljX3JlZ3MtPnNsaWNfcmJhcjY0LAotCQkJCShyc3BxLT5wYWRkcltpXSB8IFNMSUNfUlNQUV9CVUZTSU5QQUdFKSwKLQkJCQkmc2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCi0JCQkJcGFkZHJoLCBET05UX0ZMVVNIKTsKKwkJCXNsaWNfd3JpdGU2NChhZGFwdGVyLCBTTElDX1JFR19SQkFSNjQsCisJCQkJICAgICByc3BxLT5wYWRkcltpXSB8IFNMSUNfUlNQUV9CVUZTSU5QQUdFLAorCQkJCSAgICAgcGFkZHJoKTsKIAkJfQogCX0KIAlyc3BxLT5vZmZzZXQgPSAwOwpAQCAtMTIzMyw5ICsxMTY4LDkgQEAKIAlpZiAoKytyc3BxLT5vZmZzZXQgPCBTTElDX1JTUFFfQlVGU0lOUEFHRSkgewogCQlyc3BxLT5yc3BidWYrKzsKIAl9IGVsc2UgewotCQlzbGljX3JlZzY0X3dyaXRlKGFkYXB0ZXIsICZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfcmJhcjY0LAotCQkJKHJzcHEtPnBhZGRyW3JzcHEtPnBhZ2VpbmRleF0gfCBTTElDX1JTUFFfQlVGU0lOUEFHRSksCi0JCQkmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsIDAsIERPTlRfRkxVU0gpOworCQlzbGljX3dyaXRlNjQoYWRhcHRlciwgU0xJQ19SRUdfUkJBUjY0LAorCQkJICAgICByc3BxLT5wYWRkcltyc3BxLT5wYWdlaW5kZXhdIHwKKwkJCSAgICAgU0xJQ19SU1BRX0JVRlNJTlBBR0UsIDApOwogCQlyc3BxLT5wYWdlaW5kZXggPSAocnNwcS0+cGFnZWluZGV4ICsgMSkgJSByc3BxLT5udW1fcGFnZXM7CiAJCXJzcHEtPm9mZnNldCA9IDA7CiAJCXJzcHEtPnJzcGJ1ZiA9IChzdHJ1Y3Qgc2xpY19yc3BidWYgKikKQEAgLTE1NjksMTQgKzE1MDQsMTEgQEAKIAkJCX0KICNlbmRpZgogCQkJaWYgKHBhZGRyaCA9PSAwKSB7Ci0JCQkJc2xpY19yZWczMl93cml0ZSgmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2hiYXIsCi0JCQkJCQkgKHUzMilwYWRkcmwsIERPTlRfRkxVU0gpOworCQkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19IQkFSLAorCQkJCQkgICAgICh1MzIpcGFkZHJsKTsKIAkJCX0gZWxzZSB7Ci0JCQkJc2xpY19yZWc2NF93cml0ZShhZGFwdGVyLAotCQkJCQkmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2hiYXI2NCwKLQkJCQkJcGFkZHJsLAotCQkJCQkmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCi0JCQkJCXBhZGRyaCwgRE9OVF9GTFVTSCk7CisJCQkJc2xpY193cml0ZTY0KGFkYXB0ZXIsIFNMSUNfUkVHX0hCQVI2NCwgcGFkZHJsLAorCQkJCQkgICAgIHBhZGRyaCk7CiAJCQl9CiAJCQlpZiAocmN2cS0+aGVhZCkKIAkJCQlyY3ZxLT50YWlsLT5uZXh0ID0gc2tiOwpAQCAtMTY5OCwxNCArMTYzMCwxMCBAQAogCQlkZXZfZXJyKGRldiwgIiAgICAgICAgIHJjdnEtPnRhaWxbJXBdXG4iLCByY3ZxLT50YWlsKTsKIAkJZGV2X2VycihkZXYsICIgICAgICAgICByY3ZxLT5jb3VudFsleF1cbiIsIHJjdnEtPmNvdW50KTsKIAl9Ci0JaWYgKHBhZGRyaCA9PSAwKSB7Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19oYmFyLCAodTMyKXBhZGRybCwKLQkJCQkgRE9OVF9GTFVTSCk7Ci0JfSBlbHNlIHsKLQkJc2xpY19yZWc2NF93cml0ZShhZGFwdGVyLCAmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2hiYXI2NCwKLQkJCQkgcGFkZHJsLCAmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCi0JCQkJIHBhZGRyaCwgRE9OVF9GTFVTSCk7Ci0JfQorCWlmIChwYWRkcmggPT0gMCkKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0hCQVIsICh1MzIpcGFkZHJsKTsKKwllbHNlCisJCXNsaWNfd3JpdGU2NChhZGFwdGVyLCBTTElDX1JFR19IQkFSNjQsIHBhZGRybCwgcGFkZHJoKTsKIAlpZiAocmN2cS0+aGVhZCkKIAkJcmN2cS0+dGFpbC0+bmV4dCA9IHNrYjsKIAllbHNlCkBAIC0xNzI4LDI2ICsxNjU2LDE3IEBACiBzdGF0aWMgaW50IHNsaWNfbGlua19ldmVudF9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewogCWludCBzdGF0dXM7Ci0Jc3RydWN0IHNsaWNfc2htZW0gKnBzaG1lbTsKKwlzdHJ1Y3Qgc2xpY19zaG1lbW9yeSAqc20gPSAmYWRhcHRlci0+c2htZW07CisJZG1hX2FkZHJfdCBwaGFkZHIgPSBzbS0+bG5rc3RhdHVzX3BoYWRkcjsKIAogCWlmIChhZGFwdGVyLT5zdGF0ZSAhPSBBREFQVF9VUCkgewogCQkvKiBBZGFwdGVyIGlzIG5vdCBvcGVyYXRpb25hbC4gIElnbm9yZS4gICovCiAJCXJldHVybiAtRU5PREVWOwogCX0KLQotCXBzaG1lbSA9IChzdHJ1Y3Qgc2xpY19zaG1lbSAqKSh1bnNpZ25lZCBsb25nKWFkYXB0ZXItPnBoeXNfc2htZW07Ci0KLSNpZiBCSVRTX1BFUl9MT05HID09IDY0Ci0Jc3RhdHVzID0gc2xpY191cHJfcmVxdWVzdChhZGFwdGVyLAotCQkJCSAgU0xJQ19VUFJfUkxTUiwKLQkJCQkgIFNMSUNfR0VUX0FERFJfTE9XKCZwc2htZW0tPmxpbmtzdGF0dXMpLAotCQkJCSAgU0xJQ19HRVRfQUREUl9ISUdIKCZwc2htZW0tPmxpbmtzdGF0dXMpLAotCQkJCSAgMCwgMCk7Ci0jZWxzZQorCS8qIG5vIDRHQiB3cmFwIGd1YXJhbnRlZWQgKi8KIAlzdGF0dXMgPSBzbGljX3Vwcl9yZXF1ZXN0KGFkYXB0ZXIsIFNMSUNfVVBSX1JMU1IsCi0JCSh1MzIpJnBzaG1lbS0+bGlua3N0YXR1cywJLyogbm8gNEdCIHdyYXAgZ3VhcmFudGVlZCAqLwotCQkJCSAgMCwgMCwgMCk7Ci0jZW5kaWYKKwkJCQkgIGNwdV90b19sZTMyKGxvd2VyXzMyX2JpdHMocGhhZGRyKSksCisJCQkJICBjcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKHBoYWRkcikpLCAwLCAwKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNzU3LDEyICsxNjc2LDEzIEBACiAJCWFkYXB0ZXItPmludHJyZWdpc3RlcmVkID0gMDsKIAkJZnJlZV9pcnEoYWRhcHRlci0+bmV0ZGV2LT5pcnEsIGFkYXB0ZXItPm5ldGRldik7CiAJfQotCWlmIChhZGFwdGVyLT5wc2htZW0pIHsKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsCi0JCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2xpY19zaG1lbSksCi0JCQkJICAgIGFkYXB0ZXItPnBzaG1lbSwgYWRhcHRlci0+cGh5c19zaG1lbSk7Ci0JCWFkYXB0ZXItPnBzaG1lbSA9IE5VTEw7Ci0JCWFkYXB0ZXItPnBoeXNfc2htZW0gPSAoZG1hX2FkZHJfdCkodW5zaWduZWQgbG9uZylOVUxMOworCisJaWYgKGFkYXB0ZXItPnNobWVtLnNobWVtX2RhdGEpIHsKKwkJc3RydWN0IHNsaWNfc2htZW1vcnkgKnNtID0gJmFkYXB0ZXItPnNobWVtOworCQlzdHJ1Y3Qgc2xpY19zaG1lbV9kYXRhICpzbV9kYXRhID0gc20tPnNobWVtX2RhdGE7CisKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsIHNpemVvZigqc21fZGF0YSksIHNtX2RhdGEsCisJCQkJICAgIHNtLT5pc3JfcGhhZGRyKTsKIAl9CiAKIAlpZiAoYWRhcHRlci0+cGluZ3RpbWVyc2V0KSB7CkBAIC0yMTQ3LDEzICsyMDY3LDE2IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNsaWNfc2htZW1vcnkgKnNtID0gJmFkYXB0ZXItPnNobWVtOworCXN0cnVjdCBzbGljX3NobWVtX2RhdGEgKnNtX2RhdGEgPSBzbS0+c2htZW1fZGF0YTsKIAl1MzIgaXNyOwogCi0JaWYgKChhZGFwdGVyLT5wc2htZW0pICYmIChhZGFwdGVyLT5wc2htZW0tPmlzcikpIHsKLQkJc2xpY19yZWczMl93cml0ZSgmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2ljciwKLQkJCQkgSUNSX0lOVF9NQVNLLCBGTFVTSCk7Ci0JCWlzciA9IGFkYXB0ZXItPmlzcmNvcHkgPSBhZGFwdGVyLT5wc2htZW0tPmlzcjsKLQkJYWRhcHRlci0+cHNobWVtLT5pc3IgPSAwOworCWlmIChzbV9kYXRhLT5pc3IpIHsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lDUiwgSUNSX0lOVF9NQVNLKTsKKwkJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKKworCQlpc3IgPSBzbV9kYXRhLT5pc3I7CisJCXNtX2RhdGEtPmlzciA9IDA7CiAJCWFkYXB0ZXItPm51bV9pc3JzKys7CiAJCXN3aXRjaCAoYWRhcHRlci0+Y2FyZC0+c3RhdGUpIHsKIAkJY2FzZSBDQVJEX1VQOgpAQCAtMjE2OSwxMCArMjA5Miw5IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWFkYXB0ZXItPmlzcmNvcHkgPSAwOwogCQlhZGFwdGVyLT5hbGxfcmVnX3dyaXRlcyArPSAyOwogCQlhZGFwdGVyLT5pc3JfcmVnX3dyaXRlcysrOwotCQlzbGljX3JlZzMyX3dyaXRlKCZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfaXNyLCAwLCBGTFVTSCk7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19JU1IsIDApOwogCX0gZWxzZSB7CiAJCWFkYXB0ZXItPmZhbHNlX2ludGVycnVwdHMrKzsKIAl9CkBAIC0yMjI0LDEzICsyMTQ2LDExIEBACiAJfQogI2VuZGlmCiAJaWYgKGhjbWQtPnBhZGRyaCA9PSAwKSB7Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19jYmFyLAotCQkJCSAoaGNtZC0+cGFkZHJsIHwgaGNtZC0+Y21kc2l6ZSksIERPTlRfRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfQ0JBUiwgKGhjbWQtPnBhZGRybCB8CisJCQkJCQkgICAgICBoY21kLT5jbWRzaXplKSk7CiAJfSBlbHNlIHsKLQkJc2xpY19yZWc2NF93cml0ZShhZGFwdGVyLCAmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2NiYXI2NCwKLQkJCQkgKGhjbWQtPnBhZGRybCB8IGhjbWQtPmNtZHNpemUpLAotCQkJCSAmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCi0JCQkJIGhjbWQtPnBhZGRyaCwgRE9OVF9GTFVTSCk7CisJCXNsaWNfd3JpdGU2NChhZGFwdGVyLCBTTElDX1JFR19DQkFSNjQsCisJCQkgICAgIGhjbWQtPnBhZGRybCB8IGhjbWQtPmNtZHNpemUsIGhjbWQtPnBhZGRyaCk7CiAJfQogeG1pdF9kb25lOgogCXJldHVybiBORVRERVZfVFhfT0s7CkBAIC0yMjkwLDggKzIyMTAsOCBAQAogewogCXN0cnVjdCBzbGljY2FyZCAqY2FyZCA9IGFkYXB0ZXItPmNhcmQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFkYXB0ZXItPm5ldGRldjsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKLQlzdHJ1Y3Qgc2xpY19zaG1lbSAqcHNobWVtOworCXN0cnVjdCBzbGljX3NobWVtb3J5ICpzbSA9ICZhZGFwdGVyLT5zaG1lbTsKKwlzdHJ1Y3Qgc2xpY19zaG1lbV9kYXRhICpzbV9kYXRhID0gc20tPnNobWVtX2RhdGE7CiAJaW50IHJjOwogCiAJLyogYWRhcHRlciBzaG91bGQgYmUgZG93biBhdCB0aGlzIHBvaW50ICovCkBAIC0yMzM1LDI4ICsyMjU1LDIwIEBACiAJCWFkYXB0ZXItPnF1ZXVlc19pbml0aWFsaXplZCA9IDE7CiAJfQogCi0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2ljciwgSUNSX0lOVF9PRkYsIEZMVVNIKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfSUNSLCBJQ1JfSU5UX09GRik7CisJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKIAltZGVsYXkoMSk7CiAKIAlpZiAoIWFkYXB0ZXItPmlzcF9pbml0aWFsaXplZCkgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCXBzaG1lbSA9IChzdHJ1Y3Qgc2xpY19zaG1lbSAqKSh1bnNpZ25lZCBsb25nKQotCQkJIGFkYXB0ZXItPnBoeXNfc2htZW07Ci0KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmJpdDY0cmVnbG9jaywgZmxhZ3MpOwotCi0jaWYgQklUU19QRVJfTE9ORyA9PSA2NAotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwKLQkJCQkgU0xJQ19HRVRfQUREUl9ISUdIKCZwc2htZW0tPmlzciksIERPTlRfRkxVU0gpOwotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfaXNwLAotCQkJCSBTTElDX0dFVF9BRERSX0xPVygmcHNobWVtLT5pc3IpLCBGTFVTSCk7Ci0jZWxzZQotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwgMCwgRE9OVF9GTFVTSCk7Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19pc3AsICh1MzIpJnBzaG1lbS0+aXNyLAotCQkJCUZMVVNIKTsKLSNlbmRpZgorCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfQUREUl9VUFBFUiwKKwkJCSAgICAgY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhzbS0+aXNyX3BoYWRkcikpKTsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lTUCwKKwkJCSAgICAgY3B1X3RvX2xlMzIobG93ZXJfMzJfYml0cyhzbS0+aXNyX3BoYWRkcikpKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+Yml0NjRyZWdsb2NrLCBmbGFncyk7CisKIAkJYWRhcHRlci0+aXNwX2luaXRpYWxpemVkID0gMTsKIAl9CiAKQEAgLTIzODMsMTcgKzIyOTUsMjAgQEAKIAkvKgogCSAqICAgIGNsZWFyIGFueSBwZW5kaW5nIGV2ZW50cywgdGhlbiBlbmFibGUgaW50ZXJydXB0cwogCSAqLwotCWFkYXB0ZXItPmlzcmNvcHkgPSAwOwotCWFkYXB0ZXItPnBzaG1lbS0+aXNyID0gMDsKLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfaXNyLCAwLCBGTFVTSCk7Ci0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2ljciwgSUNSX0lOVF9PTiwgRkxVU0gpOworCXNtX2RhdGEtPmlzciA9IDA7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lTUiwgMCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lDUiwgSUNSX0lOVF9PTik7CiAKIAlzbGljX2xpbmtfY29uZmlnKGFkYXB0ZXIsIExJTktfQVVUT1NQRUVELCBMSU5LX0FVVE9EKTsKKwlzbGljX2ZsdXNoX3dyaXRlKGFkYXB0ZXIpOworCiAJcmMgPSBzbGljX2xpbmtfZXZlbnRfaGFuZGxlcihhZGFwdGVyKTsKIAlpZiAocmMpIHsKIAkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIHRoZW4gY2xlYXIgcGVuZGluZyBldmVudHMgKi8KLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2ljciwgSUNSX0lOVF9PRkYsIEZMVVNIKTsKLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2lzciwgMCwgRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfSUNSLCBJQ1JfSU5UX09GRik7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19JU1IsIDApOworCQlzbGljX2ZsdXNoX3dyaXRlKGFkYXB0ZXIpOworCiAJCWlmIChhZGFwdGVyLT5waW5ndGltZXJzZXQpIHsKIAkJCWRlbF90aW1lcigmYWRhcHRlci0+cGluZ3RpbWVyKTsKIAkJCWFkYXB0ZXItPnBpbmd0aW1lcnNldCA9IDA7CkBAIC0yNDE3LDcgKzIzMzIsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHN0YXR1czsKIAotCW5ldGlmX3N0b3BfcXVldWUoYWRhcHRlci0+bmV0ZGV2KTsKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLCBmbGFncyk7CiAJaWYgKCFhZGFwdGVyLT5hY3RpdmF0ZWQpIHsKQEAgLTI0NDAsNiArMjM1NSw5IEBACiAKIHNwaW5fdW5sb2NrOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShhZGFwdGVyLT5uZXRkZXYpOworCiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjQ2Myw3ICsyMzgxLDcgQEAKIAl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwogCiAJc2xpY19hZGFwdGVyX2ZyZWVyZXNvdXJjZXMoYWRhcHRlcik7Ci0Jc2xpY191bm1hcF9tbWlvX3NwYWNlKGFkYXB0ZXIpOworCWlvdW5tYXAoYWRhcHRlci0+cmVncyk7CiAKIAkvKiBmcmVlIG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KIAltbGlzdCA9IGFkYXB0ZXItPm1jYXN0YWRkcnM7CkBAIC0yNDk3LDcgKzI0MTUsNiBAQAogewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgc2xpY2NhcmQgKmNhcmQgPSBhZGFwdGVyLT5jYXJkOwotCV9faW9tZW0gc3RydWN0IHNsaWNfcmVncyAqc2xpY19yZWdzID0gYWRhcHRlci0+c2xpY19yZWdzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2xpY19nbG9iYWwuZHJpdmVyX2xvY2ssIGZsYWdzKTsKQEAgLTI1MDcsNyArMjQyNCw3IEBACiAJYWRhcHRlci0+dXByX2xpc3QgPSBOVUxMOwogCWFkYXB0ZXItPnVwcl9idXN5ID0gMDsKIAlhZGFwdGVyLT5kZXZmbGFnc19wcmV2ID0gMDsKLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfaWNyLCBJQ1JfSU5UX09GRiwgRkxVU0gpOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19JQ1IsIElDUl9JTlRfT0ZGKTsKIAlhZGFwdGVyLT5hbGxfcmVnX3dyaXRlcysrOwogCWFkYXB0ZXItPmljcl9yZWdfd3JpdGVzKys7CiAJc2xpY19jb25maWdfY2xlYXIoYWRhcHRlcik7CkBAIC0yNTE3LDggKzI0MzQsMTAgQEAKIAkJYWRhcHRlci0+YWN0aXZhdGVkID0gMDsKIAl9CiAjaWZkZWYgQVVUT01BVElDX1JFU0VUCi0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3Jlc2V0X2lmYWNlLCAwLCBGTFVTSCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1JFU0VUX0lGQUNFLCAwKTsKICNlbmRpZgorCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CisKIAkvKgogCSAqICBSZXNldCB0aGUgYWRhcHRlcidzIGNtZCBxdWV1ZXMKIAkgKi8KQEAgLTI1MzAsNiArMjQ0OSw5IEBACiAjZW5kaWYKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI2NjEsMTQgKzI1ODMsMTQgQEAKIAogc3RhdGljIGludCBzbGljX2NhcmRfaW5pdChzdHJ1Y3Qgc2xpY2NhcmQgKmNhcmQsIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewotCV9faW9tZW0gc3RydWN0IHNsaWNfcmVncyAqc2xpY19yZWdzID0gYWRhcHRlci0+c2xpY19yZWdzOworCXN0cnVjdCBzbGljX3NobWVtb3J5ICpzbSA9ICZhZGFwdGVyLT5zaG1lbTsKKwlzdHJ1Y3Qgc2xpY19zaG1lbV9kYXRhICpzbV9kYXRhID0gc20tPnNobWVtX2RhdGE7CiAJc3RydWN0IHNsaWNfZWVwcm9tICpwZWVwcm9tOwogCXN0cnVjdCBvc2xpY19lZXByb20gKnBPZWVwcm9tOwogCWRtYV9hZGRyX3QgcGh5c19jb25maWc7CiAJdTMyIHBoeXNfY29uZmlnaDsKIAl1MzIgcGh5c19jb25maWdsOwogCXUzMiBpID0gMDsKLQlzdHJ1Y3Qgc2xpY19zaG1lbSAqcHNobWVtOwogCWludCBzdGF0dXM7CiAJdWludCBtYWNhZGRycyA9IGNhcmQtPmNhcmRfc2l6ZTsKIAl1c2hvcnQgZWVjb2Rlc2l6ZTsKQEAgLTI2OTUsMjcgKzI2MTcsMjYgQEAKIAkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2xpY19lZXByb20pLAogCQkJCQkgICAgICAgJnBoeXNfY29uZmlnKTsKIAotCQlwaHlzX2NvbmZpZ2wgPSBTTElDX0dFVF9BRERSX0xPVyhwaHlzX2NvbmZpZyk7Ci0JCXBoeXNfY29uZmlnaCA9IFNMSUNfR0VUX0FERFJfSElHSChwaHlzX2NvbmZpZyk7Ci0KIAkJaWYgKCFwZWVwcm9tKSB7CiAJCQlkZXZfZXJyKCZhZGFwdGVyLT5wY2lkZXYtPmRldiwKIAkJCQkiRmFpbGVkIHRvIGFsbG9jYXRlIERNQSBtZW1vcnkgZm9yIEVFUFJPTS5cbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAorCQlwaHlzX2NvbmZpZ2wgPSBTTElDX0dFVF9BRERSX0xPVyhwaHlzX2NvbmZpZyk7CisJCXBoeXNfY29uZmlnaCA9IFNMSUNfR0VUX0FERFJfSElHSChwaHlzX2NvbmZpZyk7CisKIAkJbWVtc2V0KHBlZXByb20sIDAsIHNpemVvZihzdHJ1Y3Qgc2xpY19lZXByb20pKTsKIAotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfaWNyLCBJQ1JfSU5UX09GRiwgRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfSUNSLCBJQ1JfSU5UX09GRik7CisJCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CiAJCW1kZWxheSgxKTsKLQkJcHNobWVtID0gKHN0cnVjdCBzbGljX3NobWVtICopKHVuc2lnbmVkIGxvbmcpCi0JCQkgYWRhcHRlci0+cGh5c19zaG1lbTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+Yml0NjRyZWdsb2NrLCBmbGFncyk7Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLAotCQkJCSBTTElDX0dFVF9BRERSX0hJR0goJnBzaG1lbS0+aXNyKSwgRE9OVF9GTFVTSCk7Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19pc3AsCi0JCQkJIFNMSUNfR0VUX0FERFJfTE9XKCZwc2htZW0tPmlzciksIEZMVVNIKTsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0FERFJfVVBQRVIsCisJCQkgICAgIGNwdV90b19sZTMyKHVwcGVyXzMyX2JpdHMoc20tPmlzcl9waGFkZHIpKSk7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19JU1AsCisJCQkgICAgIGNwdV90b19sZTMyKGxvd2VyXzMyX2JpdHMoc20tPmlzcl9waGFkZHIpKSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmJpdDY0cmVnbG9jaywgZmxhZ3MpOwogCiAJCXN0YXR1cyA9IHNsaWNfY29uZmlnX2dldChhZGFwdGVyLCBwaHlzX2NvbmZpZ2wsIHBoeXNfY29uZmlnaCk7CkBAIC0yNzI2LDMzICsyNjQ3LDMxIEBACiAJCX0KIAogCQlmb3IgKDs7KSB7Ci0JCQlpZiAoYWRhcHRlci0+cHNobWVtLT5pc3IpIHsKLQkJCQlpZiAoYWRhcHRlci0+cHNobWVtLT5pc3IgJiBJU1JfVVBDKSB7Ci0JCQkJCWFkYXB0ZXItPnBzaG1lbS0+aXNyID0gMDsKLQkJCQkJc2xpY19yZWc2NF93cml0ZShhZGFwdGVyLAotCQkJCQkJJnNsaWNfcmVncy0+c2xpY19pc3AsIDAsCi0JCQkJCQkmc2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCi0JCQkJCQkwLCBGTFVTSCk7Ci0JCQkJCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19pc3IsCi0JCQkJCQkJIDAsIEZMVVNIKTsKKwkJCWlmIChzbV9kYXRhLT5pc3IpIHsKKwkJCQlpZiAoc21fZGF0YS0+aXNyICYgSVNSX1VQQykgeworCQkJCQlzbV9kYXRhLT5pc3IgPSAwOworCQkJCQlzbGljX3dyaXRlNjQoYWRhcHRlciwgU0xJQ19SRUdfSVNQLCAwLAorCQkJCQkJICAgICAwKTsKKwkJCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lTUiwgMCk7CisJCQkJCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CiAKIAkJCQkJc2xpY191cHJfcmVxdWVzdF9jb21wbGV0ZShhZGFwdGVyLCAwKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCi0JCQkJYWRhcHRlci0+cHNobWVtLT5pc3IgPSAwOwotCQkJCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19pc3IsCi0JCQkJCQkgMCwgRkxVU0gpOworCQkJCXNtX2RhdGEtPmlzciA9IDA7CisJCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lTUiwgMCk7CisJCQkJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKIAkJCX0gZWxzZSB7CiAJCQkJbWRlbGF5KDEpOwogCQkJCWkrKzsKIAkJCQlpZiAoaSA+IDUwMDApIHsKIAkJCQkJZGV2X2VycigmYWRhcHRlci0+cGNpZGV2LT5kZXYsCiAJCQkJCQkiRmV0Y2ggb2YgY29uZmlnIGRhdGEgdGltZWQgb3V0LlxuIik7Ci0JCQkJCXNsaWNfcmVnNjRfd3JpdGUoYWRhcHRlciwKLQkJCQkJCSZzbGljX3JlZ3MtPnNsaWNfaXNwLCAwLAotCQkJCQkJJnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLAotCQkJCQkJMCwgRkxVU0gpOworCQkJCQlzbGljX3dyaXRlNjQoYWRhcHRlciwgU0xJQ19SRUdfSVNQLAorCQkJCQkJICAgICAwLCAwKTsKKwkJCQkJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKKwogCQkJCQlzdGF0dXMgPSAtRUlOVkFMOwogCQkJCQlnb3RvIGNhcmRfaW5pdF9lcnI7CiAJCQkJfQpAQCAtMjc5Niw3ICsyNzE1LDYgQEAKIAkJLyogIHNlZSBpZiB0aGUgRUVQUk9NIGlzIHZhbGlkIGJ5IGNoZWNraW5nIGl0J3MgY2hlY2tzdW0gKi8KIAkJaWYgKChlZWNvZGVzaXplIDw9IE1BWF9FRUNPREVfU0laRSkgJiYKIAkJICAgIChlZWNvZGVzaXplID49IE1JTl9FRUNPREVfU0laRSkpIHsKLQogCQkJZWVfY2hrc3VtID0KIAkJCSAgICAqKHUxNiAqKSgoY2hhciAqKXBlZXByb20gKyAoZWVjb2Rlc2l6ZSAtIDIpKTsKIAkJCS8qCkBAIC0yODMwLDkgKzI3NDgsOCBAQAogCQkJCSAgICBwZWVwcm9tLCBwaHlzX2NvbmZpZyk7CiAKIAkJaWYgKCFjYXJkLT5jb25maWcuRWVwcm9tVmFsaWQpIHsKLQkJCXNsaWNfcmVnNjRfd3JpdGUoYWRhcHRlciwgJnNsaWNfcmVncy0+c2xpY19pc3AsIDAsCi0JCQkJCSAmc2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCi0JCQkJCSAwLCBGTFVTSCk7CisJCQlzbGljX3dyaXRlNjQoYWRhcHRlciwgU0xJQ19SRUdfSVNQLCAwLCAwKTsKKwkJCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CiAJCQlkZXZfZXJyKCZhZGFwdGVyLT5wY2lkZXYtPmRldiwgIkVFUFJPTSBpbnZhbGlkLlxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMjg5NiwxNCArMjgxMywxNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgc2xpY19pbml0X2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCSAgICAgIHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX3RibF9lbnRyeSwKLQkJCSAgICAgIHZvaWQgX19pb21lbSAqbWVtYWRkciwgaW50IGNoaXBfaWR4KQorc3RhdGljIGludCBzbGljX2luaXRfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX3RibF9lbnRyeSwKKwkJCSAgICAgdm9pZCBfX2lvbWVtICptZW1hZGRyLCBpbnQgY2hpcF9pZHgpCiB7CiAJdXNob3J0IGluZGV4OwogCXN0cnVjdCBzbGljX2hhbmRsZSAqcHNsaWNfaGFuZGxlOwogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3Qgc2xpY19zaG1lbW9yeSAqc20gPSAmYWRhcHRlci0+c2htZW07CisJc3RydWN0IHNsaWNfc2htZW1fZGF0YSAqc21fZGF0YTsKKwlkbWFfYWRkcl90IHBoYWRkcjsKIAogLyoJYWRhcHRlci0+cGNpZGV2ID0gcGNpZGV2OyovCiAJYWRhcHRlci0+dmVuZGlkID0gcGNpX3RibF9lbnRyeS0+dmVuZG9yOwpAQCAtMjkxMiw3ICsyODMyLDcgQEAKIAlhZGFwdGVyLT5idXNudW1iZXIgPSBwY2lkZXYtPmJ1cy0+bnVtYmVyOwogCWFkYXB0ZXItPnNsb3RudW1iZXIgPSAoKHBjaWRldi0+ZGV2Zm4gPj4gMykgJiAweDFGKTsKIAlhZGFwdGVyLT5mdW5jdGlvbm51bWJlciA9IChwY2lkZXYtPmRldmZuICYgMHg3KTsKLQlhZGFwdGVyLT5zbGljX3JlZ3MgPSBtZW1hZGRyOworCWFkYXB0ZXItPnJlZ3MgPSBtZW1hZGRyOwogCWFkYXB0ZXItPmlycSA9IHBjaWRldi0+aXJxOwogCWFkYXB0ZXItPmNoaXBpZCA9IGNoaXBfaWR4OwogCWFkYXB0ZXItPnBvcnQgPSAwOwpAQCAtMjkzMiwxOSArMjg1MiwyMyBAQAogCSAqLwogCWZvciAoaW5kZXggPSAxLCBwc2xpY19oYW5kbGUgPSAmYWRhcHRlci0+c2xpY19oYW5kbGVzWzFdOwogCSAgICAgaW5kZXggPCBTTElDX0NNRFFfTUFYQ01EUzsgaW5kZXgrKywgcHNsaWNfaGFuZGxlKyspIHsKLQogCQlwc2xpY19oYW5kbGUtPnRva2VuLmhhbmRsZV9pbmRleCA9IGluZGV4OwogCQlwc2xpY19oYW5kbGUtPnR5cGUgPSBTTElDX0hBTkRMRV9GUkVFOwogCQlwc2xpY19oYW5kbGUtPm5leHQgPSBhZGFwdGVyLT5wZnJlZV9zbGljX2hhbmRsZXM7CiAJCWFkYXB0ZXItPnBmcmVlX3NsaWNfaGFuZGxlcyA9IHBzbGljX2hhbmRsZTsKIAl9Ci0JYWRhcHRlci0+cHNobWVtID0gKHN0cnVjdCBzbGljX3NobWVtICopCi0JCQkJCXBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBzbGljX3NobWVtKSwKLQkJCQkJJmFkYXB0ZXItPgotCQkJCQlwaHlzX3NobWVtKTsKLQlpZiAoYWRhcHRlci0+cHNobWVtKQotCQltZW1zZXQoYWRhcHRlci0+cHNobWVtLCAwLCBzaXplb2Yoc3RydWN0IHNsaWNfc2htZW0pKTsKKwlzbV9kYXRhID0gcGNpX3phbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwgc2l6ZW9mKCpzbV9kYXRhKSwKKwkJCQkJJnBoYWRkcik7CisJaWYgKCFzbV9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNtLT5zaG1lbV9kYXRhID0gc21fZGF0YTsKKwlzbS0+aXNyX3BoYWRkciA9IHBoYWRkcjsKKwlzbS0+bG5rc3RhdHVzX3BoYWRkciA9IHBoYWRkciArIG9mZnNldG9mKHN0cnVjdCBzbGljX3NobWVtX2RhdGEsCisJCQkJCQkgbG5rc3RhdHVzKTsKKwlzbS0+c3RhdHNfcGhhZGRyID0gcGhhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHNsaWNfc2htZW1fZGF0YSwgc3RhdHMpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgc2xpY19uZXRkZXZfb3BzID0gewpAQCAtMjk2NCwyNyArMjg4OCw5IEBACiAJc3RydWN0IHNsaWNjYXJkICpjYXJkID0gc2xpY19nbG9iYWwuc2xpY19jYXJkOwogCXN0cnVjdCBwaHlzY2FyZCAqcGh5c2NhcmQgPSBzbGljX2dsb2JhbC5waHlzX2NhcmQ7CiAJdXNob3J0IGNhcmRfaG9zdGlkOwotCXUxNiBfX2lvbWVtICpob3N0aWRfcmVnOwogCXVpbnQgaTsKLQl1aW50IHJkaG9zdGlkX29mZnNldCA9IDA7CiAKLQlzd2l0Y2ggKGFkYXB0ZXItPmRldmlkKSB7Ci0JY2FzZSBTTElDXzJHQl9ERVZJQ0VfSUQ6Ci0JCXJkaG9zdGlkX29mZnNldCA9IFNMSUNfUkRIT1NUSURfMkdCOwotCQlicmVhazsKLQljYXNlIFNMSUNfMUdCX0RFVklDRV9JRDoKLQkJcmRob3N0aWRfb2Zmc2V0ID0gU0xJQ19SREhPU1RJRF8xR0I7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWhvc3RpZF9yZWcgPQotCSAgICAodTE2IF9faW9tZW0gKikoKCh1OCBfX2lvbWVtICopKGFkYXB0ZXItPnNsaWNfcmVncykpICsKLQkgICAgcmRob3N0aWRfb2Zmc2V0KTsKLQotCS8qIHJlYWQgdGhlIDE2IGJpdCBob3N0aWQgZnJvbSBTUkFNICovCi0JY2FyZF9ob3N0aWQgPSAodXNob3J0KXJlYWR3KGhvc3RpZF9yZWcpOworCWNhcmRfaG9zdGlkID0gc2xpY19yZWFkMzIoYWRhcHRlciwgU0xJQ19SRUdfSE9TVElEKTsKIAogCS8qIEluaXRpYWxpemUgYSBuZXcgY2FyZCBzdHJ1Y3R1cmUgaWYgbmVlZCBiZSAqLwogCWlmIChjYXJkX2hvc3RpZCA9PSBTTElDX0hPU1RJRF9ERUZBVUxUKSB7CkBAIC0zMTMwLDcgKzMwMzYsNyBAQAogCW1taW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKTsKIAltbWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpZGV2LCAwKTsKIAotCW1lbW1hcHBlZF9pb2FkZHIgPSBpb3JlbWFwKG1taW9fc3RhcnQsIG1taW9fbGVuKTsKKwltZW1tYXBwZWRfaW9hZGRyID0gaW9yZW1hcF9ub2NhY2hlKG1taW9fc3RhcnQsIG1taW9fbGVuKTsKIAlpZiAoIW1lbW1hcHBlZF9pb2FkZHIpIHsKIAkJZGV2X2VycigmcGNpZGV2LT5kZXYsICJjYW5ub3QgcmVtYXAgTU1JTyByZWdpb24gJWx4IEAgJWx4XG4iLAogCQkJbW1pb19sZW4sIG1taW9fc3RhcnQpOwpAQCAtMzE0MiwxMyArMzA0OCwxNyBAQAogCiAJc2xpY19pbml0X2RyaXZlcigpOwogCi0Jc2xpY19pbml0X2FkYXB0ZXIobmV0ZGV2LAotCQkJICBwY2lkZXYsIHBjaV90YmxfZW50cnksIG1lbW1hcHBlZF9pb2FkZHIsIGNhcmRzX2ZvdW5kKTsKKwllcnIgPSBzbGljX2luaXRfYWRhcHRlcihuZXRkZXYsIHBjaWRldiwgcGNpX3RibF9lbnRyeSwgbWVtbWFwcGVkX2lvYWRkciwKKwkJCQljYXJkc19mb3VuZCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgImZhaWxlZCB0byBpbml0IGFkYXB0ZXI6ICVpXG4iLCBlcnIpOworCQlnb3RvIGVycl9vdXRfdW5tYXA7CisJfQogCiAJZXJyID0gc2xpY19jYXJkX2xvY2F0ZShhZGFwdGVyKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBjaWRldi0+ZGV2LCAiY2Fubm90IGxvY2F0ZSBjYXJkXG4iKTsKLQkJZ290byBlcnJfb3V0X3VubWFwOworCQlnb3RvIGVycl9jbGVhbl9pbml0OwogCX0KIAogCWNhcmQgPSBhZGFwdGVyLT5jYXJkOwpAQCAtMzE2MCw3ICszMDcwLDcgQEAKIAogCWVyciA9IHNsaWNfY2FyZF9pbml0KGNhcmQsIGFkYXB0ZXIpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyX291dF91bm1hcDsKKwkJZ290byBlcnJfY2xlYW5faW5pdDsKIAogCXNsaWNfYWRhcHRlcl9zZXRfaHdhZGRyKGFkYXB0ZXIpOwogCkBAIC0zMTY4LDE3ICszMDc4LDIxIEBACiAJbmV0ZGV2LT5pcnEgPSBhZGFwdGVyLT5pcnE7CiAJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJnNsaWNfbmV0ZGV2X29wczsKIAorCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisKIAlzdHJjcHkobmV0ZGV2LT5uYW1lLCAiZXRoJWQiKTsKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBjaWRldi0+ZGV2LCAiQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsIGFib3J0aW5nLlxuIik7Ci0JCWdvdG8gZXJyX291dF91bm1hcDsKKwkJZ290byBlcnJfY2xlYW5faW5pdDsKIAl9CiAKIAljYXJkc19mb3VuZCsrOwogCiAJcmV0dXJuIDA7CiAKK2Vycl9jbGVhbl9pbml0OgorCXNsaWNfaW5pdF9jbGVhbnVwKGFkYXB0ZXIpOwogZXJyX291dF91bm1hcDoKIAlpb3VubWFwKG1lbW1hcHBlZF9pb2FkZHIpOwogZXJyX291dF9mcmVlX25ldGRldjoKQEAgLTMyMDksNyArMzEyMyw3IEBACiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzbGljX2RyaXZlcik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgc2xpY19ldGh0b29sX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgc2xpY19ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2NvYWxlc2NlID0gc2xpY19nZXRfY29hbGVzY2UsCiAJLnNldF9jb2FsZXNjZSA9IHNsaWNfc2V0X2NvYWxlc2NlCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2NoaXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9jaGlwLmMKaW5kZXggZjgwZWU3Ny4uODM5ZDY3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2NoaXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfY2hpcC5jCkBAIC02LDExICs2LDkgQEAKICNpbmNsdWRlICJkZGs3NTBfY2hpcC5oIgogI2luY2x1ZGUgImRkazc1MF9wb3dlci5oIgogCi0vKiBuIC8gZCArIDEgLyAyID0gKDJuICsgZCkgLyAyZCAqLwotI2RlZmluZSByb3VuZGVkRGl2KG51bSwgZGVub20pCSgoMiAqIChudW0pICsgKGRlbm9tKSkgLyAoMiAqIChkZW5vbSkpKQogI2RlZmluZSBNSHooeCkgKCh4KSAqIDEwMDAwMDApCiAKLWxvZ2ljYWxfY2hpcF90eXBlX3QgZ2V0Q2hpcFR5cGUodm9pZCkKK2xvZ2ljYWxfY2hpcF90eXBlX3Qgc203NTBfZ2V0X2NoaXBfdHlwZSh2b2lkKQogewogCXVuc2lnbmVkIHNob3J0IHBoeXNpY2FsSUQ7CiAJY2hhciBwaHlzaWNhbFJldjsKQEAgLTM3LDcgKzM1LDcgQEAKIAl1bnNpZ25lZCBpbnQgcGxsX3JlZzsKIAl1bnNpZ25lZCBpbnQgTSwgTiwgT0QsIFBPRDsKIAotCWlmIChnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpCisJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSA9PSBTTTc1MExFKQogCQlyZXR1cm4gTUh6KDEzMCk7CiAKIAlwbGxfcmVnID0gUEVFSzMyKE1YQ0xLX1BMTF9DVFJMKTsKQEAgLTYwLDcgKzU4LDcgQEAKIAl1bnNpZ25lZCBpbnQgdWxBY3R1YWxNeENsazsKIAogCS8qIENoZW9rXzA1MDk6IEZvciBTTTc1MExFLCB0aGUgY2hpcCBjbG9jayBpcyBmaXhlZC4gTm90aGluZyB0byBzZXQuICovCi0JaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKwlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpID09IFNNNzUwTEUpCiAJCXJldHVybjsKIAogCWlmIChmcmVxdWVuY3kpIHsKQEAgLTcxLDkgKzY5LDEwIEBACiAJCXBsbC5jbG9ja1R5cGUgPSBNWENMS19QTEw7CiAKIAkJLyoKLQkJKiBDYWxsIGNhbGNQbGxWYWx1ZSgpIHRvIGZpbGwgdXAgdGhlIG90aGVyIGZpZWxkcyBmb3IgUExMIHN0cnVjdHVyZS4KLQkJKiBTb21ldGltZSwgdGhlIGNoaXAgY2Fubm90IHNldCB1cCB0aGUgZXhhY3QgY2xvY2sgcmVxdWlyZWQgYnkgVXNlci4KLQkJKiBSZXR1cm4gdmFsdWUgZnJvbSBjYWxjUGxsVmFsdWUoKSBnaXZlcyB0aGUgYWN0dWFsIHBvc3NpYmxlIGNsb2NrLgorCQkqIENhbGwgY2FsY1BsbFZhbHVlKCkgdG8gZmlsbCB0aGUgb3RoZXIgZmllbGRzIG9mIFBMTCBzdHJ1Y3R1cmUuCisJCSogU29tZXRpbWUsIHRoZSBjaGlwIGNhbm5vdCBzZXQgdXAgdGhlIGV4YWN0IGNsb2NrCisJCSogcmVxdWlyZWQgYnkgdGhlIFVzZXIuCisJCSogUmV0dXJuIHZhbHVlIG9mIGNhbGNQbGxWYWx1ZSBnaXZlcyB0aGUgYWN0dWFsIHBvc3NpYmxlIGNsb2NrLgogCQkqLwogCQl1bEFjdHVhbE14Q2xrID0gY2FsY1BsbFZhbHVlKGZyZXF1ZW5jeSwgJnBsbCk7CiAKQEAgLTg2LDE4ICs4NSwyMiBAQAogewogCXVuc2lnbmVkIGludCByZWcsIGRpdmlzb3I7CiAKLQkvKiBDaGVva18wNTA5OiBGb3IgU003NTBMRSwgdGhlIG1lbW9yeSBjbG9jayBpcyBmaXhlZC4gTm90aGluZyB0byBzZXQuICovCi0JaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKwkvKiBDaGVva18wNTA5OiBGb3IgU003NTBMRSwgdGhlIG1lbW9yeSBjbG9jayBpcyBmaXhlZC4KKwkgKiBOb3RoaW5nIHRvIHNldC4KKwkgKi8KKwlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpID09IFNNNzUwTEUpCiAJCXJldHVybjsKIAogCWlmIChmcmVxdWVuY3kpIHsKLQkJLyogU2V0IHRoZSBmcmVxdWVuY3kgdG8gdGhlIG1heGltdW0gZnJlcXVlbmN5IHRoYXQgdGhlIEREUiBNZW1vcnkgY2FuIHRha2UKLQkJd2hpY2ggaXMgMzM2TUh6LiAqLworCQkvKgorCQkgKiBTZXQgdGhlIGZyZXF1ZW5jeSB0byB0aGUgbWF4aW11bSBmcmVxdWVuY3kKKwkJICogdGhhdCB0aGUgRERSIE1lbW9yeSBjYW4gdGFrZSB3aGljaCBpcyAzMzZNSHouCisJCSAqLwogCQlpZiAoZnJlcXVlbmN5ID4gTUh6KDMzNikpCiAJCQlmcmVxdWVuY3kgPSBNSHooMzM2KTsKIAogCQkvKiBDYWxjdWxhdGUgdGhlIGRpdmlzb3IgKi8KLQkJZGl2aXNvciA9IHJvdW5kZWREaXYoZ2V0X214Y2xrX2ZyZXEoKSwgZnJlcXVlbmN5KTsKKwkJZGl2aXNvciA9IERJVl9ST1VORF9DTE9TRVNUKGdldF9teGNsa19mcmVxKCksIGZyZXF1ZW5jeSk7CiAKIAkJLyogU2V0IHRoZSBjb3JyZXNwb25kaW5nIGRpdmlzb3IgaW4gdGhlIHJlZ2lzdGVyLiAqLwogCQlyZWcgPSBQRUVLMzIoQ1VSUkVOVF9HQVRFKSAmIH5DVVJSRU5UX0dBVEVfTTJYQ0xLX01BU0s7CkBAIC0xMzMsMTggKzEzNiwyMSBAQAogewogCXVuc2lnbmVkIGludCByZWcsIGRpdmlzb3I7CiAKLQkvKiBDaGVva18wNTA5OiBGb3IgU003NTBMRSwgdGhlIG1lbW9yeSBjbG9jayBpcyBmaXhlZC4gTm90aGluZyB0byBzZXQuICovCi0JaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKwkvKiBDaGVva18wNTA5OiBGb3IgU003NTBMRSwgdGhlIG1lbW9yeSBjbG9jayBpcyBmaXhlZC4KKwkgKiBOb3RoaW5nIHRvIHNldC4KKwkgKi8KKwlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpID09IFNNNzUwTEUpCiAJCXJldHVybjsKIAogCWlmIChmcmVxdWVuY3kpIHsKLQkJLyogU2V0IHRoZSBmcmVxdWVuY3kgdG8gdGhlIG1heGltdW0gZnJlcXVlbmN5IHRoYXQgdGhlIFNNNzUwIGVuZ2luZSBjYW4KLQkJcnVuLCB3aGljaCBpcyBhYm91dCAxOTAgTUh6LiAqLworCQkvKiBTZXQgdGhlIGZyZXF1ZW5jeSB0byB0aGUgbWF4aW11bSBmcmVxdWVuY3kKKwkJICogdGhhdCB0aGUgU003NTAgZW5naW5lIGNhbiBydW4sIHdoaWNoIGlzIGFib3V0IDE5MCBNSHouCisJCSAqLwogCQlpZiAoZnJlcXVlbmN5ID4gTUh6KDE5MCkpCiAJCQlmcmVxdWVuY3kgPSBNSHooMTkwKTsKIAogCQkvKiBDYWxjdWxhdGUgdGhlIGRpdmlzb3IgKi8KLQkJZGl2aXNvciA9IHJvdW5kZWREaXYoZ2V0X214Y2xrX2ZyZXEoKSwgZnJlcXVlbmN5KTsKKwkJZGl2aXNvciA9IERJVl9ST1VORF9DTE9TRVNUKGdldF9teGNsa19mcmVxKCksIGZyZXF1ZW5jeSk7CiAKIAkJLyogU2V0IHRoZSBjb3JyZXNwb25kaW5nIGRpdmlzb3IgaW4gdGhlIHJlZ2lzdGVyLiAqLwogCQlyZWcgPSBQRUVLMzIoQ1VSUkVOVF9HQVRFKSAmIH5DVVJSRU5UX0dBVEVfTUNMS19NQVNLOwpAQCAtMTc0LDcgKzE4MCw3IEBACiAJdW5zaWduZWQgaW50IGRhdGE7CiAKIAkvKiBzbTc1MGxlIG9ubHkgdXNlIDY0IG1iIG1lbW9yeSovCi0JaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKwlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpID09IFNNNzUwTEUpCiAJCXJldHVybiBTWl82NE07CiAKIAkvKiBmb3IgNzUwLGFsd2F5cyB1c2UgcG93ZXIgbW9kZTAqLwpAQCAtMjEzLDcgKzIxOSw3IEBACiAJcmVnIHw9IChDVVJSRU5UX0dBVEVfRElTUExBWSB8IENVUlJFTlRfR0FURV9MT0NBTE1FTSk7CiAJc2V0Q3VycmVudEdhdGUocmVnKTsKIAotCWlmIChnZXRDaGlwVHlwZSgpICE9IFNNNzUwTEUpIHsKKwlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpICE9IFNNNzUwTEUpIHsKIAkJLyoJc2V0IHBhbmVsIHBsbCBhbmQgZ3JhcGhpYyBtb2RlIHZpYSBtbWlvXzg4ICovCiAJCXJlZyA9IFBFRUszMihWR0FfQ09ORklHVVJBVElPTik7CiAJCXJlZyB8PSAoVkdBX0NPTkZJR1VSQVRJT05fUExMIHwgVkdBX0NPTkZJR1VSQVRJT05fTU9ERSk7CkBAIC0yMzYsOSArMjQyLDEwIEBACiAJc2V0TWFzdGVyQ2xvY2soTUh6KHBJbml0UGFyYW0tPm1hc3RlckNsb2NrKSk7CiAKIAotCS8qIFJlc2V0IHRoZSBtZW1vcnkgY29udHJvbGxlci4gSWYgdGhlIG1lbW9yeSBjb250cm9sbGVyIGlzIG5vdCByZXNldCBpbiBTTTc1MCwKLQkgICB0aGUgc3lzdGVtIG1pZ2h0IGhhbmcgd2hlbiBzdyBhY2Nlc3NlcyB0aGUgbWVtb3J5LgotCSAgIFRoZSBtZW1vcnkgc2hvdWxkIGJlIHJlc2V0dGVkIGFmdGVyIGNoYW5naW5nIHRoZSBNWENMSy4KKwkvKiBSZXNldCB0aGUgbWVtb3J5IGNvbnRyb2xsZXIuCisJICogSWYgdGhlIG1lbW9yeSBjb250cm9sbGVyIGlzIG5vdCByZXNldCBpbiBTTTc1MCwKKwkgKiB0aGUgc3lzdGVtIG1pZ2h0IGhhbmcgd2hlbiBzdyBhY2Nlc3NlcyB0aGUgbWVtb3J5LgorCSAqIFRoZSBtZW1vcnkgc2hvdWxkIGJlIHJlc2V0dGVkIGFmdGVyIGNoYW5naW5nIHRoZSBNWENMSy4KIAkgKi8KIAlpZiAocEluaXRQYXJhbS0+cmVzZXRNZW1vcnkgPT0gMSkgewogCQlyZWcgPSBQRUVLMzIoTUlTQ19DVFJMKTsKQEAgLTI4MiwyNCArMjg5LDI3IEBACiB9CiAKIC8qCi0JbW9uayBsaXUgQCA0LzYvMjAxMToKLQkJICAgcmUtd3JpdGUgdGhlIGNhbGN1bGF0ZVBMTCBmdW5jdGlvbiBvZiBkZGs3NTAuCi0JCSAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIGZ1bmN0aW9uIGRvZXMgbm90IHVzZSBzb21lIG1hdGhlbWF0aWNzIHRyaWNrcyBhbmQgc2hvcnRjdXQKLQkJICAgd2hlbiBpdCBkb2luZyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGJlc3QgTixNLEQgY29tYmluYXRpb24KLQkJICAgSSB0aGluayB0aGlzIHZlcnNpb24gZ2l2ZXMgYSBsaXR0bGUgdXBncmFkZSBpbiBzcGVlZAotCi0JNzUwIHBsbCBjbG9jayBmb3JtdWxhcjoKLQlSZXF1ZXN0IENsb2NrID0gKElucHV0IENsb2NrICogTSApLyhOICogWCkKLQotCUlucHV0IENsb2NrID0gMTQzMTgxODEgaHoKLQlYID0gMiBwb3dlciBECi0JRCA9ezAsMSwyLDMsNCw1LDZ9Ci0JTSA9IHsxLC4uLiwyNTV9Ci0JTiA9IHsyLC4uLiwxNX0KLSovCisgKiBtb25rIGxpdSBAIDQvNi8yMDExOgorICoJcmUtd3JpdGUgdGhlIGNhbGN1bGF0ZVBMTCBmdW5jdGlvbiBvZiBkZGs3NTAuCisgKgl0aGUgb3JpZ2luYWwgdmVyc2lvbiBmdW5jdGlvbiBkb2VzIG5vdCB1c2UKKyAqCXNvbWUgbWF0aGVtYXRpY3MgdHJpY2tzIGFuZCBzaG9ydGN1dAorICoJd2hlbiBpdCBkb2luZyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGJlc3QgTixNLEQgY29tYmluYXRpb24KKyAqCUkgdGhpbmsgdGhpcyB2ZXJzaW9uIGdpdmVzIGEgbGl0dGxlIHVwZ3JhZGUgaW4gc3BlZWQKKyAqCisgKiA3NTAgcGxsIGNsb2NrIGZvcm11bGFyOgorICogUmVxdWVzdCBDbG9jayA9IChJbnB1dCBDbG9jayAqIE0gKS8oTiAqIFgpCisgKgorICogSW5wdXQgQ2xvY2sgPSAxNDMxODE4MSBoegorICogWCA9IDIgcG93ZXIgRAorICogRCA9ezAsMSwyLDMsNCw1LDZ9CisgKiBNID0gezEsLi4uLDI1NX0KKyAqIE4gPSB7MiwuLi4sMTV9CisgKi8KIHVuc2lnbmVkIGludCBjYWxjUGxsVmFsdWUodW5zaWduZWQgaW50IHJlcXVlc3Rfb3JpZywgcGxsX3ZhbHVlX3QgKnBsbCkKIHsKLQkvKiBhcyBzbTc1MCByZWdpc3RlciBkZWZpbml0aW9uLCBOIGxvY2F0ZWQgaW4gMiwxNSBhbmQgTSBsb2NhdGVkIGluIDEsMjU1CSovCisJLyogYXMgc203NTAgcmVnaXN0ZXIgZGVmaW5pdGlvbiwKKwkgKiBOIGxvY2F0ZWQgaW4gMiwxNSBhbmQgTSBsb2NhdGVkIGluIDEsMjU1CisJICovCiAJaW50IE4sIE0sIFgsIGQ7CiAJaW50IG1pbmlfZGlmZjsKIAl1bnNpZ25lZCBpbnQgUk4sIHF1bywgcmVtLCBmbF9xdW87CkBAIC0zMDgsOSArMzE4LDExIEBACiAJY29uc3QgaW50IG1heF9PRCA9IDM7CiAJaW50IG1heF9kID0gNjsKIAotCWlmIChnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpIHsKLQkJLyogU003NTBMRSBkb24ndCBoYXZlIHByZ3JhbW1hYmxlIFBMTCBhbmQgTS9OIHZhbHVlcyB0byB3b3JrIG9uLgotCQlKdXN0IHJldHVybiB0aGUgcmVxdWVzdGVkIGNsb2NrLiAqLworCWlmIChzbTc1MF9nZXRfY2hpcF90eXBlKCkgPT0gU003NTBMRSkgeworCQkvKiBTTTc1MExFIGRvbid0IGhhdmUKKwkJICogcHJvZ3JhbW1hYmxlIFBMTCBhbmQgTS9OIHZhbHVlcyB0byB3b3JrIG9uLgorCQkgKiBKdXN0IHJldHVybiB0aGUgcmVxdWVzdGVkIGNsb2NrLgorCQkgKi8KIAkJcmV0dXJuIHJlcXVlc3Rfb3JpZzsKIAl9CiAKQEAgLTMxOSwxOSArMzMxLDIzIEBACiAJcmVxdWVzdCA9IHJlcXVlc3Rfb3JpZyAvIDEwMDA7CiAJaW5wdXQgPSBwbGwtPmlucHV0RnJlcSAvIDEwMDA7CiAKLQkvKiBmb3IgTVhDTEsgcmVnaXN0ZXIgLCBubyBQT0QgcHJvdmlkZWQsIHNvIG5lZWQgYmUgdHJlYXRlZCBkaWZmZXJlbnRseQkqLworCS8qIGZvciBNWENMSyByZWdpc3RlciwKKwkgKiBubyBQT0QgcHJvdmlkZWQsIHNvIG5lZWQgYmUgdHJlYXRlZCBkaWZmZXJlbnRseQorCSAqLwogCWlmIChwbGwtPmNsb2NrVHlwZSA9PSBNWENMS19QTEwpCiAJCW1heF9kID0gMzsKIAogCWZvciAoTiA9IDE1OyBOID4gMTsgTi0tKSB7Ci0JCS8qIFJOIHdpbGwgbm90IGV4Y2VlZCBtYXhpbXVtIGxvbmcgaWYgQHJlcXVlc3QgPD0gMjg1IE1IWiAoZm9yIDMyYml0IGNwdSkgKi8KKwkJLyogUk4gd2lsbCBub3QgZXhjZWVkIG1heGltdW0gbG9uZworCQkgKiBpZiBAcmVxdWVzdCA8PSAyODUgTUhaIChmb3IgMzJiaXQgY3B1KQorCQkgKi8KIAkJUk4gPSBOICogcmVxdWVzdDsKIAkJcXVvID0gUk4gLyBpbnB1dDsKIAkJcmVtID0gUk4gJSBpbnB1dDsvKiByZW0gYWx3YXlzIHNtYWxsIHRoYW4gMTQzMTgxODEgKi8KIAkJZmxfcXVvID0gKHJlbSAqIDEwMDAwIC8gaW5wdXQpOwogCiAJCWZvciAoZCA9IG1heF9kOyBkID49IDA7IGQtLSkgewotCQkJWCA9ICgxIDw8IGQpOworCQkJWCA9IEJJVChkKTsKIAkJCU0gPSBxdW8gKiBYOwogCQkJTSArPSBmbF9xdW8gKiBYIC8gMTAwMDA7CiAJCQkvKiByb3VuZCBzdGVwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfY2hpcC5oIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2NoaXAuaAppbmRleCAwODkxMzg0Li4xNDM1N2ZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfY2hpcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9jaGlwLmgKQEAgLTY5LDcgKzY5LDcgQEAKIH0KIGluaXRjaGlwX3BhcmFtX3Q7CiAKLWxvZ2ljYWxfY2hpcF90eXBlX3QgZ2V0Q2hpcFR5cGUodm9pZCk7Citsb2dpY2FsX2NoaXBfdHlwZV90IHNtNzUwX2dldF9jaGlwX3R5cGUodm9pZCk7CiB1bnNpZ25lZCBpbnQgY2FsY1BsbFZhbHVlKHVuc2lnbmVkIGludCByZXF1ZXN0LCBwbGxfdmFsdWVfdCAqcGxsKTsKIHVuc2lnbmVkIGludCBmb3JtYXRQbGxSZWcocGxsX3ZhbHVlX3QgKnBQTEwpOwogdm9pZCBkZGs3NTBfc2V0X21taW8odm9pZCBfX2lvbWVtICosIHVuc2lnbmVkIHNob3J0LCBjaGFyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kaXNwbGF5LmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZGlzcGxheS5jCmluZGV4IGNhNDk3M2UuLjQwMjNjNDc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kaXNwbGF5LmMKQEAgLTY4LDggKzY4LDEwIEBACiAJaWYgKCFjdHJsKSB7CiAJCS8qIHByaW1hcnkgY29udHJvbGxlciAqLwogCi0JCS8qIERvIG5vdCB3YWl0IHdoZW4gdGhlIFByaW1hcnkgUExMIGlzIG9mZiBvciBkaXNwbGF5IGNvbnRyb2wgaXMgYWxyZWFkeSBvZmYuCi0JCSAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBzb2Z0d2FyZSB0byB3YWl0IGZvcmV2ZXIuICovCisJCS8qCisJCSAqIERvIG5vdCB3YWl0IHdoZW4gdGhlIFByaW1hcnkgUExMIGlzIG9mZiBvciBkaXNwbGF5IGNvbnRyb2wgaXMKKwkJICogYWxyZWFkeSBvZmYuIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBzb2Z0d2FyZSB0byB3YWl0IGZvcmV2ZXIuCisJCSAqLwogCQlpZiAoIShQRUVLMzIoUEFORUxfUExMX0NUUkwpICYgUExMX0NUUkxfUE9XRVIpIHx8CiAJCSAgICAhKFBFRUszMihQQU5FTF9ESVNQTEFZX0NUUkwpICYgRElTUExBWV9DVFJMX1RJTUlORykpIHsKIAkJCXJldHVybjsKQEAgLTg4LDkgKzkwLDEwIEBACiAJCX0KIAogCX0gZWxzZSB7Ci0KLQkJLyogRG8gbm90IHdhaXQgd2hlbiB0aGUgUHJpbWFyeSBQTEwgaXMgb2ZmIG9yIGRpc3BsYXkgY29udHJvbCBpcyBhbHJlYWR5IG9mZi4KLQkJCSAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBzb2Z0d2FyZSB0byB3YWl0IGZvcmV2ZXIuICovCisJCS8qCisJCSAqIERvIG5vdCB3YWl0IHdoZW4gdGhlIFByaW1hcnkgUExMIGlzIG9mZiBvciBkaXNwbGF5IGNvbnRyb2wgaXMKKwkJICogYWxyZWFkeSBvZmYuIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBzb2Z0d2FyZSB0byB3YWl0IGZvcmV2ZXIuCisJCSAqLwogCQlpZiAoIShQRUVLMzIoQ1JUX1BMTF9DVFJMKSAmIFBMTF9DVFJMX1BPV0VSKSB8fAogCQkgICAgIShQRUVLMzIoQ1JUX0RJU1BMQVlfQ1RSTCkgJiBESVNQTEFZX0NUUkxfVElNSU5HKSkgewogCQkJcmV0dXJuOwpAQCAtMTM0LDcgKzEzNyw2IEBACiAJcmVnIHw9IChkaXNwID8gUEFORUxfRElTUExBWV9DVFJMX0ZQRU4gOiAwKTsKIAlQT0tFMzIoUEFORUxfRElTUExBWV9DVFJMLCByZWcpOwogCXByaW1hcnlXYWl0VmVydGljYWxTeW5jKGRlbGF5KTsKLQogfQogCiB2b2lkIGRkazc1MF9zZXRMb2dpY2FsRGlzcE91dChkaXNwX291dHB1dF90IG91dHB1dCkKQEAgLTE1OSw3ICsxNjEsNiBAQAogCQkvKnNlIGJsYW5rIG9mZiAqLwogCQlyZWcgJj0gfkNSVF9ESVNQTEFZX0NUUkxfQkxBTks7CiAJCVBPS0UzMihDUlRfRElTUExBWV9DVFJMLCByZWcpOwotCiAJfQogCiAJaWYgKG91dHB1dCAmIFBSSV9UUF9VU0FHRSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2Rpc3BsYXkuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kaXNwbGF5LmgKaW5kZXggY2EzNWFhMS4uZTNmZGU0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2Rpc3BsYXkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZGlzcGxheS5oCkBAIC0yLDEwMCArMiw5OCBAQAogI2RlZmluZSBEREs3NTBfRElTUExBWV9IX18KIAogLyogcGFuZWwgcGF0aCBzZWxlY3QKLQk4MDAwMFsyOToyOF0KLSovCisgKgk4MDAwMFsyOToyOF0KKyAqLwogCiAjZGVmaW5lIFBOTF8yX09GRlNFVCAwCiAjZGVmaW5lIFBOTF8yX01BU0sgKDMgPDwgUE5MXzJfT0ZGU0VUKQogI2RlZmluZSBQTkxfMl9VU0FHRQkoUE5MXzJfTUFTSyA8PCAxNikKLSNkZWZpbmUgUE5MXzJfUFJJCSgoMCA8PCBQTkxfMl9PRkZTRVQpfFBOTF8yX1VTQUdFKQotI2RlZmluZSBQTkxfMl9TRUMJKCgyIDw8IFBOTF8yX09GRlNFVCl8UE5MXzJfVVNBR0UpCisjZGVmaW5lIFBOTF8yX1BSSQkoKDAgPDwgUE5MXzJfT0ZGU0VUKSB8IFBOTF8yX1VTQUdFKQorI2RlZmluZSBQTkxfMl9TRUMJKCgyIDw8IFBOTF8yX09GRlNFVCkgfCBQTkxfMl9VU0FHRSkKIAogCiAvKiBwcmltYXJ5IHRpbWluZyAmIHBsYW5lIGVuYWJsZSBiaXQKLQkxOiA4MDAwMFs4XSAmIDgwMDAwWzJdIG9uCi0JMDogYm90aCBvZmYKLSovCisgKgkxOiA4MDAwMFs4XSAmIDgwMDAwWzJdIG9uCisgKgkwOiBib3RoIG9mZgorICovCiAjZGVmaW5lIFBSSV9UUF9PRkZTRVQgNAogI2RlZmluZSBQUklfVFBfTUFTSyBCSVQoUFJJX1RQX09GRlNFVCkKICNkZWZpbmUgUFJJX1RQX1VTQUdFIChQUklfVFBfTUFTSyA8PCAxNikKLSNkZWZpbmUgUFJJX1RQX09OICgoMHgxIDw8IFBSSV9UUF9PRkZTRVQpfFBSSV9UUF9VU0FHRSkKLSNkZWZpbmUgUFJJX1RQX09GRiAoKDB4MCA8PCBQUklfVFBfT0ZGU0VUKXxQUklfVFBfVVNBR0UpCisjZGVmaW5lIFBSSV9UUF9PTiAoKDB4MSA8PCBQUklfVFBfT0ZGU0VUKSB8IFBSSV9UUF9VU0FHRSkKKyNkZWZpbmUgUFJJX1RQX09GRiAoKDB4MCA8PCBQUklfVFBfT0ZGU0VUKSB8IFBSSV9UUF9VU0FHRSkKIAogCiAvKiBwYW5lbCBzZXF1ZW5jeSBzdGF0dXMKLQk4MDAwMFsyNzoyNF0KLSovCisgKgk4MDAwMFsyNzoyNF0KKyAqLwogI2RlZmluZSBQTkxfU0VRX09GRlNFVCA2CiAjZGVmaW5lIFBOTF9TRVFfTUFTSyBCSVQoUE5MX1NFUV9PRkZTRVQpCiAjZGVmaW5lIFBOTF9TRVFfVVNBR0UgKFBOTF9TRVFfTUFTSyA8PCAxNikKLSNkZWZpbmUgUE5MX1NFUV9PTiAoQklUKFBOTF9TRVFfT0ZGU0VUKXxQTkxfU0VRX1VTQUdFKQotI2RlZmluZSBQTkxfU0VRX09GRiAoKDAgPDwgUE5MX1NFUV9PRkZTRVQpfFBOTF9TRVFfVVNBR0UpCisjZGVmaW5lIFBOTF9TRVFfT04gKEJJVChQTkxfU0VRX09GRlNFVCkgfCBQTkxfU0VRX1VTQUdFKQorI2RlZmluZSBQTkxfU0VRX09GRiAoKDAgPDwgUE5MX1NFUV9PRkZTRVQpIHwgUE5MX1NFUV9VU0FHRSkKIAogLyogZHVhbCBkaWdpdGFsIG91dHB1dAotCTgwMDAwWzE5XQotKi8KKyAqCTgwMDAwWzE5XQorICovCiAjZGVmaW5lIERVQUxfVEZUX09GRlNFVCA4CiAjZGVmaW5lIERVQUxfVEZUX01BU0sgQklUKERVQUxfVEZUX09GRlNFVCkKICNkZWZpbmUgRFVBTF9URlRfVVNBR0UgKERVQUxfVEZUX01BU0sgPDwgMTYpCi0jZGVmaW5lIERVQUxfVEZUX09OIChCSVQoRFVBTF9URlRfT0ZGU0VUKXxEVUFMX1RGVF9VU0FHRSkKLSNkZWZpbmUgRFVBTF9URlRfT0ZGICgoMCA8PCBEVUFMX1RGVF9PRkZTRVQpfERVQUxfVEZUX1VTQUdFKQorI2RlZmluZSBEVUFMX1RGVF9PTiAoQklUKERVQUxfVEZUX09GRlNFVCkgfCBEVUFMX1RGVF9VU0FHRSkKKyNkZWZpbmUgRFVBTF9URlRfT0ZGICgoMCA8PCBEVUFMX1RGVF9PRkZTRVQpIHwgRFVBTF9URlRfVVNBR0UpCiAKIC8qIHNlY29uZGFyeSB0aW1pbmcgJiBwbGFuZSBlbmFibGUgYml0Ci0JMTo4MDIwMFs4XSAmIDgwMjAwWzJdIG9uCi0JMDogYm90aCBvZmYKLSovCisgKgkxOjgwMjAwWzhdICYgODAyMDBbMl0gb24KKyAqCTA6IGJvdGggb2ZmCisgKi8KICNkZWZpbmUgU0VDX1RQX09GRlNFVCA1CiAjZGVmaW5lIFNFQ19UUF9NQVNLIEJJVChTRUNfVFBfT0ZGU0VUKQogI2RlZmluZSBTRUNfVFBfVVNBR0UgKFNFQ19UUF9NQVNLIDw8IDE2KQotI2RlZmluZSBTRUNfVFBfT04gICgoMHgxIDw8IFNFQ19UUF9PRkZTRVQpfFNFQ19UUF9VU0FHRSkKLSNkZWZpbmUgU0VDX1RQX09GRiAoKDB4MCA8PCBTRUNfVFBfT0ZGU0VUKXxTRUNfVFBfVVNBR0UpCisjZGVmaW5lIFNFQ19UUF9PTiAgKCgweDEgPDwgU0VDX1RQX09GRlNFVCkgfCBTRUNfVFBfVVNBR0UpCisjZGVmaW5lIFNFQ19UUF9PRkYgKCgweDAgPDwgU0VDX1RQX09GRlNFVCkgfCBTRUNfVFBfVVNBR0UpCiAKIC8qIGNydCBwYXRoIHNlbGVjdAotCTgwMjAwWzE5OjE4XQotKi8KKyAqCTgwMjAwWzE5OjE4XQorICovCiAjZGVmaW5lIENSVF8yX09GRlNFVCAyCiAjZGVmaW5lIENSVF8yX01BU0sgKDMgPDwgQ1JUXzJfT0ZGU0VUKQogI2RlZmluZSBDUlRfMl9VU0FHRSAoQ1JUXzJfTUFTSyA8PCAxNikKLSNkZWZpbmUgQ1JUXzJfUFJJICgoMHgwIDw8IENSVF8yX09GRlNFVCl8Q1JUXzJfVVNBR0UpCi0jZGVmaW5lIENSVF8yX1NFQyAoKDB4MiA8PCBDUlRfMl9PRkZTRVQpfENSVF8yX1VTQUdFKQorI2RlZmluZSBDUlRfMl9QUkkgKCgweDAgPDwgQ1JUXzJfT0ZGU0VUKSB8IENSVF8yX1VTQUdFKQorI2RlZmluZSBDUlRfMl9TRUMgKCgweDIgPDwgQ1JUXzJfT0ZGU0VUKSB8IENSVF8yX1VTQUdFKQogCiAKIC8qIERBQyBhZmZlY3QgYm90aCBEVkkgYW5kIERTVUIKLQk0WzIwXQotKi8KKyAqCTRbMjBdCisgKi8KICNkZWZpbmUgREFDX09GRlNFVCA3CiAjZGVmaW5lIERBQ19NQVNLIEJJVChEQUNfT0ZGU0VUKQogI2RlZmluZSBEQUNfVVNBR0UgKERBQ19NQVNLIDw8IDE2KQotI2RlZmluZSBEQUNfT04gKCgweDAgPDwgREFDX09GRlNFVCl8REFDX1VTQUdFKQotI2RlZmluZSBEQUNfT0ZGICgoMHgxIDw8IERBQ19PRkZTRVQpfERBQ19VU0FHRSkKKyNkZWZpbmUgREFDX09OICgoMHgwIDw8IERBQ19PRkZTRVQpIHwgREFDX1VTQUdFKQorI2RlZmluZSBEQUNfT0ZGICgoMHgxIDw8IERBQ19PRkZTRVQpIHwgREFDX1VTQUdFKQogCiAvKiBEUE1TIG9ubHkgYWZmZWN0IEQtU1VCIGhlYWQKLQkwWzMxOjMwXQotKi8KKyAqCTBbMzE6MzBdCisgKi8KICNkZWZpbmUgRFBNU19PRkZTRVQgOQogI2RlZmluZSBEUE1TX01BU0sgKDMgPDwgRFBNU19PRkZTRVQpCiAjZGVmaW5lIERQTVNfVVNBR0UgKERQTVNfTUFTSyA8PCAxNikKLSNkZWZpbmUgRFBNU19PRkYgKCgzIDw8IERQTVNfT0ZGU0VUKXxEUE1TX1VTQUdFKQotI2RlZmluZSBEUE1TX09OICgoMCA8PCBEUE1TX09GRlNFVCl8RFBNU19VU0FHRSkKKyNkZWZpbmUgRFBNU19PRkYgKCgzIDw8IERQTVNfT0ZGU0VUKSB8IERQTVNfVVNBR0UpCisjZGVmaW5lIERQTVNfT04gKCgwIDw8IERQTVNfT0ZGU0VUKSB8IERQTVNfVVNBR0UpCiAKIAogCi0vKgotCUxDRDEgbWVhbnMgcGFuZWwgcGF0aCBURlQxICAmIHBhbmVsIHBhdGggRFZJIChzbyBlbmFibGUgREFDKQotCUNSVCBtZWFucyBjcnQgcGF0aCBEU1VCCi0qLworLyogTENEMSBtZWFucyBwYW5lbCBwYXRoIFRGVDEgICYgcGFuZWwgcGF0aCBEVkkgKHNvIGVuYWJsZSBEQUMpCisgKiBDUlQgbWVhbnMgY3J0IHBhdGggRFNVQgorICovCiB0eXBlZGVmIGVudW0gX2Rpc3Bfb3V0cHV0X3QgewotCWRvX0xDRDFfUFJJID0gUE5MXzJfUFJJfFBSSV9UUF9PTnxQTkxfU0VRX09OfERBQ19PTiwKLQlkb19MQ0QxX1NFQyA9IFBOTF8yX1NFQ3xTRUNfVFBfT058UE5MX1NFUV9PTnxEQUNfT04sCi0JZG9fTENEMl9QUkkgPSBDUlRfMl9QUkl8UFJJX1RQX09OfERVQUxfVEZUX09OLAotCWRvX0xDRDJfU0VDID0gQ1JUXzJfU0VDfFNFQ19UUF9PTnxEVUFMX1RGVF9PTiwKLQkvKgotCWRvX0RTVUJfUFJJID0gQ1JUXzJfUFJJfFBSSV9UUF9PTnxEUE1TX09OfERBQ19PTiwKLQlkb19EU1VCX1NFQyA9IENSVF8yX1NFQ3xTRUNfVFBfT058RFBNU19PTnxEQUNfT04sCi0JKi8KLQlkb19DUlRfUFJJID0gQ1JUXzJfUFJJfFBSSV9UUF9PTnxEUE1TX09OfERBQ19PTiwKLQlkb19DUlRfU0VDID0gQ1JUXzJfU0VDfFNFQ19UUF9PTnxEUE1TX09OfERBQ19PTiwKKwlkb19MQ0QxX1BSSSA9IFBOTF8yX1BSSSB8IFBSSV9UUF9PTiB8IFBOTF9TRVFfT04gfCBEQUNfT04sCisJZG9fTENEMV9TRUMgPSBQTkxfMl9TRUMgfCBTRUNfVFBfT04gfCBQTkxfU0VRX09OIHwgREFDX09OLAorCWRvX0xDRDJfUFJJID0gQ1JUXzJfUFJJIHwgUFJJX1RQX09OIHwgRFVBTF9URlRfT04sCisJZG9fTENEMl9TRUMgPSBDUlRfMl9TRUMgfCBTRUNfVFBfT04gfCBEVUFMX1RGVF9PTiwKKwkvKiBkb19EU1VCX1BSSSA9IENSVF8yX1BSSSB8IFBSSV9UUF9PTiB8IERQTVNfT058REFDX09OLAorCSAqIGRvX0RTVUJfU0VDID0gQ1JUXzJfU0VDIHwgU0VDX1RQX09OIHwgRFBNU19PTnxEQUNfT04sCisJICovCisJZG9fQ1JUX1BSSSA9IENSVF8yX1BSSSB8IFBSSV9UUF9PTiB8IERQTVNfT04gfCBEQUNfT04sCisJZG9fQ1JUX1NFQyA9IENSVF8yX1NFQyB8IFNFQ19UUF9PTiB8IERQTVNfT04gfCBEQUNfT04sCiB9CiBkaXNwX291dHB1dF90OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZHZpLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZHZpLmMKaW5kZXggYTRhMjU1MC4uODI1MmY3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2R2aS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kdmkuYwpAQCAtNiw5ICs2LDExIEBACiAjaW5jbHVkZSAiZGRrNzUwX3NpaTE2NC5oIgogCiAKLS8qIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGNvbnRhaW5zIGFsbCB0aGUgc3VwcG9ydGVkIGRyaXZlciBhbmQgaXRzIGNvcnJlc3BvbmRpbmcKLSAgIGZ1bmN0aW9uIEFQSS4gUGxlYXNlIHNldCB0aGUgZnVuY3Rpb24gcG9pbnRlciB0byBOVUxMIHdoZW5ldmVyIHRoZSBmdW5jdGlvbgotICAgaXMgbm90IHN1cHBvcnRlZC4gKi8KKy8qCisgKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBjb250YWlucyBhbGwgdGhlIHN1cHBvcnRlZCBkcml2ZXIgYW5kIGl0cyBjb3JyZXNwb25kaW5nCisgKiBmdW5jdGlvbiBBUEkuIFBsZWFzZSBzZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gTlVMTCB3aGVuZXZlciB0aGUgZnVuY3Rpb24KKyAqIGlzIG5vdCBzdXBwb3J0ZWQuCisgKi8KIHN0YXRpYyBkdmlfY3RybF9kZXZpY2VfdCBnX2RjZnRTdXBwb3J0ZWREdmlDb250cm9sbGVyW10gPSB7CiAjaWZkZWYgRFZJX0NUUkxfU0lJMTY0CiAJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2h3aTJjLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfaHdpMmMuYwppbmRleCAzOWMzZTFjLi5kMzkxYzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfaHdpMmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfaHdpMmMuYwpAQCAtMjEsNyArMjEsNyBAQAogCVBPS0UzMihHUElPX01VWCwgdmFsdWUpOwogCiAJLyogRW5hYmxlIEhhcmR3YXJlIEkyQyBwb3dlci4KLQkgVE9ETzogQ2hlY2sgaWYgd2UgbmVlZCB0byBlbmFibGUgR1BJTyBwb3dlcj8KKwkgKiBUT0RPOiBDaGVjayBpZiB3ZSBuZWVkIHRvIGVuYWJsZSBHUElPIHBvd2VyPwogCSAqLwogCWVuYWJsZUkyQygxKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX21vZGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9tb2RlLmMKaW5kZXggY2NiNGUwNi4uMDViODM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX21vZGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfbW9kZS5jCkBAIC00LDE1ICs0LDE0IEBACiAjaW5jbHVkZSAiZGRrNzUwX21vZGUuaCIKICNpbmNsdWRlICJkZGs3NTBfY2hpcC5oIgogCi0vKgotCVNNNzUwTEUgb25seToKLSAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgZXh0cmEgcmVnaXN0ZXJzIGFuZCBiaXQgZmllbGRzIHJlcXVpcmVkIHRvIHNldAotICAgIHVwIGEgbW9kZSBpbiBTTTc1MExFCi0KLQlFeHBsYW5hdGlvbiBhYm91dCBEaXNwbGF5IENvbnRyb2wgcmVnaXN0ZXI6Ci0gICAgSFcgb25seSBzdXBwb3J0cyA3IHByZWRlZmluZWQgcGl4ZWwgY2xvY2tzLCBhbmQgY2xvY2sgc2VsZWN0IGlzCi0gICAgaW4gYml0IDI5OjI3IG9mCURpc3BsYXkgQ29udHJvbCByZWdpc3Rlci4KLSovCisvKiBTTTc1MExFIG9ubHk6CisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgZXh0cmEgcmVnaXN0ZXJzIGFuZCBiaXQgZmllbGRzIHJlcXVpcmVkIHRvIHNldAorICogdXAgYSBtb2RlIGluIFNNNzUwTEUKKyAqCisgKiBFeHBsYW5hdGlvbiBhYm91dCBEaXNwbGF5IENvbnRyb2wgcmVnaXN0ZXI6CisgKiBIVyBvbmx5IHN1cHBvcnRzIDcgcHJlZGVmaW5lZCBwaXhlbCBjbG9ja3MsIGFuZCBjbG9jayBzZWxlY3QgaXMKKyAqIGluIGJpdCAyOToyNyBvZiBEaXNwbGF5IENvbnRyb2wgcmVnaXN0ZXIuCisgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRpc3BsYXlDb250cm9sQWRqdXN0X1NNNzUwTEUobW9kZV9wYXJhbWV0ZXJfdCAqcE1vZGVQYXJhbSwgdW5zaWduZWQgbG9uZyBkaXNwQ29udHJvbCkKIHsKIAl1bnNpZ25lZCBsb25nIHgsIHk7CkBAIC0yMSw5ICsyMCw5IEBACiAJeSA9IHBNb2RlUGFyYW0tPnZlcnRpY2FsX2Rpc3BsYXlfZW5kOwogCiAJLyogU003NTBMRSBoYXMgdG8gc2V0IHVwIHRoZSB0b3AtbGVmdCBhbmQgYm90dG9tLXJpZ2h0Ci0JICAgcmVnaXN0ZXJzIGFzIHdlbGwuCi0JICAgTm90ZSB0aGF0IG5vcm1hbCBTTTc1MC9TTTcxOCBvbmx5IHVzZSB0aG9zZSB0d28gcmVnaXN0ZXIgZm9yCi0JICAgYXV0by1jZW50ZXJpbmcgbW9kZS4KKwkgKiByZWdpc3RlcnMgYXMgd2VsbC4KKwkgKiBOb3RlIHRoYXQgbm9ybWFsIFNNNzUwL1NNNzE4IG9ubHkgdXNlIHRob3NlIHR3byByZWdpc3RlciBmb3IKKwkgKiBhdXRvLWNlbnRlcmluZyBtb2RlLgogCSAqLwogCVBPS0UzMihDUlRfQVVUT19DRU5URVJJTkdfVEwsIDApOwogCkBAIC0zMyw4ICszMiw4IEBACiAJCSgoeCAtIDEpICYgQ1JUX0FVVE9fQ0VOVEVSSU5HX0JSX1JJR0hUX01BU0spKTsKIAogCS8qIEFzc3VtZSBjb21tb24gZmllbGRzIGluIGRpc3BDb250cm9sIGhhdmUgYmVlbiBwcm9wZXJseSBzZXQgYmVmb3JlCi0JICAgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotCSAgIFRoaXMgZnVuY3Rpb24gb25seSBzZXRzIHRoZSBleHRyYSBmaWVsZHMgaW4gZGlzcENvbnRyb2wuCisJICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorCSAqIFRoaXMgZnVuY3Rpb24gb25seSBzZXRzIHRoZSBleHRyYSBmaWVsZHMgaW4gZGlzcENvbnRyb2wuCiAJICovCiAKIAkvKiBDbGVhciBiaXQgMjk6Mjcgb2YgZGlzcGxheSBjb250cm9sIHJlZ2lzdGVyICovCkBAIC02Myw3ICs2Miw3IEBACiAJZGlzcENvbnRyb2wgfD0gKENSVF9ESVNQTEFZX0NUUkxfQ1JUU0VMRUNUIHwgQ1JUX0RJU1BMQVlfQ1RSTF9SR0JCSVQpOwogCiAJLyogU2V0IGJpdCAxNCBvZiBkaXNwbGF5IGNvbnRyb2xsZXIgKi8KLQlkaXNwQ29udHJvbCA9IERJU1BMQVlfQ1RSTF9DTE9DS19QSEFTRTsKKwlkaXNwQ29udHJvbCB8PSBESVNQTEFZX0NUUkxfQ0xPQ0tfUEhBU0U7CiAKIAlQT0tFMzIoQ1JUX0RJU1BMQVlfQ1RSTCwgZGlzcENvbnRyb2wpOwogCkBAIC0xMTcsNyArMTE2LDcgQEAKIAkJaWYgKHBNb2RlUGFyYW0tPmhvcml6b250YWxfc3luY19wb2xhcml0eSkKIAkJCXRtcCB8PSBESVNQTEFZX0NUUkxfSFNZTkNfUEhBU0U7CiAKLQkJaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkgeworCQlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpID09IFNNNzUwTEUpIHsKIAkJCWRpc3BsYXlDb250cm9sQWRqdXN0X1NNNzUwTEUocE1vZGVQYXJhbSwgdG1wKTsKIAkJfSBlbHNlIHsKIAkJCXJlZyA9IFBFRUszMihDUlRfRElTUExBWV9DVFJMKSAmCkBAIC0yMDksNyArMjA4LDcgQEAKIAlwbGwuY2xvY2tUeXBlID0gY2xvY2s7CiAKIAl1aUFjdHVhbFBpeGVsQ2xrID0gY2FsY1BsbFZhbHVlKHBhcm0tPnBpeGVsX2Nsb2NrLCAmcGxsKTsKLQlpZiAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKSB7CisJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSA9PSBTTTc1MExFKSB7CiAJCS8qIHNldCBncmFwaGljIG1vZGUgdmlhIElPIG1ldGhvZCAqLwogCQlvdXRiX3AoMHg4OCwgMHgzZDQpOwogCQlvdXRiX3AoMHgwNiwgMHgzZDUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3Bvd2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfcG93ZXIuYwppbmRleCBiM2MzNzkxLi43Y2M2MTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfcG93ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfcG93ZXIuYwpAQCAtNiw3ICs2LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgdmFsdWU7CiAKLQlpZiAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKSB7CisJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSA9PSBTTTc1MExFKSB7CiAJCXZhbHVlID0gUEVFSzMyKENSVF9ESVNQTEFZX0NUUkwpICYgfkNSVF9ESVNQTEFZX0NUUkxfRFBNU19NQVNLOwogCQl2YWx1ZSB8PSAoc3RhdGUgPDwgQ1JUX0RJU1BMQVlfQ1RSTF9EUE1TX1NISUZUKTsKIAkJUE9LRTMyKENSVF9ESVNQTEFZX0NUUkwsIHZhbHVlKTsKQEAgLTE5LDcgKzE5LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBnZXRQb3dlck1vZGUodm9pZCkKIHsKLQlpZiAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKQorCWlmIChzbTc1MF9nZXRfY2hpcF90eXBlKCkgPT0gU003NTBMRSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIFBFRUszMihQT1dFUl9NT0RFX0NUUkwpICYgUE9XRVJfTU9ERV9DVFJMX01PREVfTUFTSzsKIH0KQEAgLTM1LDcgKzM1LDcgQEAKIAogCWNvbnRyb2xfdmFsdWUgPSBQRUVLMzIoUE9XRVJfTU9ERV9DVFJMKSAmIH5QT1dFUl9NT0RFX0NUUkxfTU9ERV9NQVNLOwogCi0JaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKwlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpID09IFNNNzUwTEUpCiAJCXJldHVybjsKIAogCXN3aXRjaCAocG93ZXJNb2RlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfc2lpMTY0LmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfc2lpMTY0LmMKaW5kZXggNjdmMzZlNy4uOTlhODY4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3NpaTE2NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zaWkxNjQuYwpAQCAtMTc0LDggKzE3NCw4IEBACiAJCWkyY1dyaXRlUmVnKFNJSTE2NF9JMkNfQUREUkVTUywgU0lJMTY0X0NPTkZJR1VSQVRJT04sIGNvbmZpZyk7CiAKIAkJLyogRGUtc2tldyBlbmFibGVkIHdpdGggZGVmYXVsdCAxMTFiIHZhbHVlLgotCQkgICBUaGlzIHdpbGwgZml4IHNvbWUgYXJ0aWZhY3RzIHByb2JsZW0gaW4gc29tZSBtb2RlIG9uIGJvYXJkIDIuMi4KLQkJICAgU29tZWhvdyB0aGlzIGZpeCBkb2VzIG5vdCBhZmZlY3QgYm9hcmQgMi4xLgorCQkgKiBUaGlzIGZpeGVzIHNvbWUgYXJ0aWZhY3RzIHByb2JsZW0gaW4gc29tZSBtb2RlIG9uIGJvYXJkIDIuMi4KKwkJICogU29tZWhvdyB0aGlzIGZpeCBkb2VzIG5vdCBhZmZlY3QgYm9hcmQgMi4xLgogCQkgKi8KIAkJaWYgKGRlc2tld0VuYWJsZSA9PSAwKQogCQkJY29uZmlnID0gU0lJMTY0X0RFU0tFV19ESVNBQkxFOwpAQCAtMzQ0LDcgKzM0NCw4IEBACiAJZGV0ZWN0UmVnID0gaTJjUmVhZFJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9ERVRFQ1QpOwogCiAJLyogRGVwZW5kaW5nIG9uIGVhY2ggRFZJIGNvbnRyb2xsZXIsIG5lZWQgdG8gZW5hYmxlIHRoZSBob3QgcGx1ZyBiYXNlZCBvbiBlYWNoCi0JICAgaW5kaXZpZHVhbCBjaGlwIGRlc2lnbi4gKi8KKwkgKiBpbmRpdmlkdWFsIGNoaXAgZGVzaWduLgorCSAqLwogCWlmIChlbmFibGVIb3RQbHVnICE9IDApCiAJCXNpaTE2NFNlbGVjdEhvdFBsdWdEZXRlY3Rpb25Nb2RlKFNJSTE2NF9IT1RQTFVHX1VTRV9NREkpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zd2kyYy5jIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3N3aTJjLmMKaW5kZXggOGQ2NDRhNy4uNzJhNDIzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3N3aTJjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3N3aTJjLmMKQEAgLTg5LDEyICs4OSwxMiBAQAogCSAqIGFsd2F5cyBiZSBub24temVybyx3aGljaCBtYWtlcyB0aGUgd2hpbGUgbG9vcAogCSAqIG5ldmVyIGZpbmlzaC4KIAkgKiB1c2Ugbm9uLXVsdGltYXRlIGZvciBsb29wIGJlbG93IGlzIHNhZmUKLQkgKiAqLworCSAqLwogCiAgICAgLyogQ2hhbmdlIHdhaXQgYWxnb3JpdGhtIHRvIHVzZSBQQ0kgYnVzIGNsb2NrLAotICAgICAgIGl0J3MgbW9yZSByZWxpYWJsZSB0aGFuIGNvdW50ZXIgbG9vcCAuLgotICAgICAgIHdyaXRlIDB4NjEgdG8gMHgzY2UgYW5kIHJlYWQgZnJvbSAweDNjZgotICAgICAgICovCisgICAgICogaXQncyBtb3JlIHJlbGlhYmxlIHRoYW4gY291bnRlciBsb29wIC4uCisgICAgICogd3JpdGUgMHg2MSB0byAweDNjZSBhbmQgcmVhZCBmcm9tIDB4M2NmCisgICAgICovCiAJaW50IGksIHRtcDsKIAogCWZvciAoaSA9IDA7IGkgPCA2MDA7IGkrKykgewpAQCAtNDAzLDcgKzQwMyw3IEBACiAJaWYgKChjbGtfZ3BpbyA+IDMxKSB8fCAoZGF0YV9ncGlvID4gMzEpKQogCQlyZXR1cm4gLTE7CiAKLQlpZiAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKQorCWlmIChzbTc1MF9nZXRfY2hpcF90eXBlKCkgPT0gU003NTBMRSkKIAkJcmV0dXJuIHNtNzUwbGVfaTJjX2luaXQoY2xrX2dwaW8sIGRhdGFfZ3Bpbyk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBHUElPIHBpbiBmb3IgdGhlIGkyYyBDbG9jayBSZWdpc3RlciAqLwpAQCAtNTAxLDggKzUwMSw4IEBACiAJc3dfaTJjX3N0YXJ0KCk7CiAKIAkvKiBTZW5kIHRoZSBkZXZpY2UgYWRkcmVzcyBhbmQgcmVhZCB0aGUgZGF0YS4gQWxsIHNob3VsZCByZXR1cm4gc3VjY2VzcwotCSAgIGluIG9yZGVyIGZvciB0aGUgd3JpdGluZyBwcm9jZXNzZWQgdG8gYmUgc3VjY2Vzc2Z1bAotCSovCisJICogaW4gb3JkZXIgZm9yIHRoZSB3cml0aW5nIHByb2Nlc3NlZCB0byBiZSBzdWNjZXNzZnVsCisJICovCiAJaWYgKChzd19pMmNfd3JpdGVfYnl0ZShhZGRyKSAhPSAwKSB8fAogCSAgICAoc3dfaTJjX3dyaXRlX2J5dGUocmVnKSAhPSAwKSB8fAogCSAgICAoc3dfaTJjX3dyaXRlX2J5dGUoZGF0YSkgIT0gMCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MC5jCmluZGV4IDZlZDAwNGUuLjdkOTBlMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTAuYwpAQCAtMTE3Niw3ICsxMTc2LDcgQEAKIAkJZWxzZSB7CiAJCQlzdHJjYXQodG1wLCBvcHQpOwogCQkJdG1wICs9IHN0cmxlbihvcHQpOwotCQkJaWYgKG9wdGlvbnMgIT0gTlVMTCkKKwkJCWlmIChvcHRpb25zKQogCQkJCSp0bXArKyA9ICc6JzsKIAkJCWVsc2UKIAkJCQkqdG1wKysgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTAuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwLmgKaW5kZXggOGU3MGNlMC4uZmYzMWM1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MC5oCkBAIC0xNDcsMTcgKzE0NywxNyBAQAogCWludCBkcG1zOwogCWludCBwYXRoczsKIAkvKiB3aGljaCBwYXRocyhzKSB0aGlzIG91dHB1dCBzdGFuZHMgZm9yLGZvciBzbTc1MDoKLQkgICBwYXRocz0xOm1lYW5zIG91dHB1dCBmb3IgcGFuZWwgcGF0aHMKLQkgICBwYXRocz0yOm1lYW5zIG91dHB1dCBmb3IgY3J0IHBhdGhzCi0JICAgcGF0aHM9MzptZWFucyBvdXRwdXQgZm9yIGJvdGggcGFuZWwgYW5kIGNydCBwYXRocwotCSovCisJICogcGF0aHM9MTptZWFucyBvdXRwdXQgZm9yIHBhbmVsIHBhdGhzCisJICogcGF0aHM9MjptZWFucyBvdXRwdXQgZm9yIGNydCBwYXRocworCSAqIHBhdGhzPTM6bWVhbnMgb3V0cHV0IGZvciBib3RoIHBhbmVsIGFuZCBjcnQgcGF0aHMKKwkgKi8KIAogCWludCAqY2hhbm5lbDsKIAkvKiB3aGljaCBjaGFubmVsIHRoZXNlIG91dHB1dHMgbGlua2VkIHdpdGgsZm9yIHNtNzUwOgotCSAgICpjaGFubmVsPTAgbWVhbnMgcHJpbWFyeSBjaGFubmVsCi0JICAgKmNoYW5uZWw9MSBtZWFucyBzZWNvbmRhcnkgY2hhbm5lbAotCSAgIG91dHB1dC0+Y2hhbm5lbCA9PT4gJmNydGMtPmNoYW5uZWwKLQkqLworCSAqICpjaGFubmVsPTAgbWVhbnMgcHJpbWFyeSBjaGFubmVsCisJICogKmNoYW5uZWw9MSBtZWFucyBzZWNvbmRhcnkgY2hhbm5lbAorCSAqIG91dHB1dC0+Y2hhbm5lbCA9PT4gJmNydGMtPmNoYW5uZWwKKwkgKi8KIAl2b2lkICpwcml2OwogCiAJaW50ICgqcHJvY19zZXRCTEFOSykoc3RydWN0IGx5bnhmYl9vdXRwdXQqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfYWNjZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2FjY2VsLmMKaW5kZXggOWFhNDA2Ni4uMzhhZGFlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfYWNjZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9hY2NlbC5jCkBAIC02Nyw3ICs2Nyw4IEBACiAKIC8qIHNldDJkZm9ybWF0IG9ubHkgYmUgY2FsbGVkIGZyb20gc2V0bW9kZSBmdW5jdGlvbnMKICAqIGJ1dCBpZiB5b3UgbmVlZCBkdWFsIGZyYW1lYnVmZmVyIGRyaXZlcixuZWVkIGNhbGwgc2V0MmRmb3JtYXQKLSAqIGV2ZXJ5IHRpbWUgeW91IHVzZSAyZCBmdW5jdGlvbiAqLworICogZXZlcnkgdGltZSB5b3UgdXNlIDJkIGZ1bmN0aW9uCisgKi8KIAogdm9pZCBod19zZXQyZGZvcm1hdChzdHJ1Y3QgbHlueF9hY2NlbCAqYWNjZWwsIGludCBmbXQpCiB7CkBAIC05MCw3ICs5MSw4IEBACiAKIAlpZiAoYWNjZWwtPmRlX3dhaXQoKSAhPSAwKSB7CiAJCS8qIGludCB0aW1lIHdhaXQgYW5kIGFsd2F5cyBidXN5LHNlZW1zIGhhcmR3YXJlCi0JCSAqIGdvdCBzb21ldGhpbmcgZXJyb3IgKi8KKwkJICogZ290IHNvbWV0aGluZyBlcnJvcgorCQkgKi8KIAkJcHJfZGVidWcoIkRlIGVuZ2luZSBhbHdheXMgYnVzeVxuIik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0xNTIsMjQgKzE1NCwyNiBAQAogCQkvKiBEZXRlcm1pbmUgZGlyZWN0aW9uIG9mIG9wZXJhdGlvbiAqLwogCQlpZiAoc3kgPCBkeSkgewogCQkJLyogKy0tLS0tLS0tLS0rCi0JCQkgICB8UyAgICAgICAgIHwKLQkJCSAgIHwgICArLS0tLS0tLS0tLSsKLQkJCSAgIHwgICB8ICAgICAgfCAgIHwKLQkJCSAgIHwgICB8ICAgICAgfCAgIHwKLQkJCSAgICstLS18LS0tLS0tKyAgIHwKLQkJCSAgIHwgICAgICAgICBEfAotCQkJICAgKy0tLS0tLS0tLS0rICovCisJCQkgKiB8UyAgICAgICAgIHwKKwkJCSAqIHwgICArLS0tLS0tLS0tLSsKKwkJCSAqIHwgICB8ICAgICAgfCAgIHwKKwkJCSAqIHwgICB8ICAgICAgfCAgIHwKKwkJCSAqICstLS18LS0tLS0tKyAgIHwKKwkJCSAqIHwgICAgICAgICBEfAorCQkJICogKy0tLS0tLS0tLS0rCisJCQkgKi8KIAogCQkJbkRpcmVjdGlvbiA9IEJPVFRPTV9UT19UT1A7CiAJCX0gZWxzZSBpZiAoc3kgPiBkeSkgewogCQkJLyogKy0tLS0tLS0tLS0rCi0JCQkgICB8RCAgICAgICAgIHwKLQkJCSAgIHwgICArLS0tLS0tLS0tLSsKLQkJCSAgIHwgICB8ICAgICAgfCAgIHwKLQkJCSAgIHwgICB8ICAgICAgfCAgIHwKLQkJCSAgICstLS18LS0tLS0tKyAgIHwKLQkJCSAgIHwgICAgICAgICBTfAotCQkJICAgKy0tLS0tLS0tLS0rICovCisJCQkgKiB8RCAgICAgICAgIHwKKwkJCSAqIHwgICArLS0tLS0tLS0tLSsKKwkJCSAqIHwgICB8ICAgICAgfCAgIHwKKwkJCSAqIHwgICB8ICAgICAgfCAgIHwKKwkJCSAqICstLS18LS0tLS0tKyAgIHwKKwkJCSAqIHwgICAgICAgICBTfAorCQkJICogKy0tLS0tLS0tLS0rCisJCQkgKi8KIAogCQkJbkRpcmVjdGlvbiA9IFRPUF9UT19CT1RUT007CiAJCX0gZWxzZSB7CkBAIC0xNzcsMjIgKzE4MSwyNCBAQAogCiAJCQlpZiAoc3ggPD0gZHgpIHsKIAkJCQkvKiArLS0tLS0tKy0tLSstLS0tLS0rCi0JCQkJICAgfFMgICAgIHwgICB8ICAgICBEfAotCQkJCSAgIHwgICAgICB8ICAgfCAgICAgIHwKLQkJCQkgICB8ICAgICAgfCAgIHwgICAgICB8Ci0JCQkJICAgfCAgICAgIHwgICB8ICAgICAgfAotCQkJCSAgICstLS0tLS0rLS0tKy0tLS0tLSsgKi8KKwkJCQkgKiB8UyAgICAgfCAgIHwgICAgIER8CisJCQkJICogfCAgICAgIHwgICB8ICAgICAgfAorCQkJCSAqIHwgICAgICB8ICAgfCAgICAgIHwKKwkJCQkgKiB8ICAgICAgfCAgIHwgICAgICB8CisJCQkJICogKy0tLS0tLSstLS0rLS0tLS0tKworCQkJCSAqLwogCiAJCQkJbkRpcmVjdGlvbiA9IFJJR0hUX1RPX0xFRlQ7CiAJCQl9IGVsc2UgewogCQkJLyogc3ggPiBkeCAqLwogCiAJCQkJLyogKy0tLS0tLSstLS0rLS0tLS0tKwotCQkJCSAgIHxEICAgICB8ICAgfCAgICAgU3wKLQkJCQkgICB8ICAgICAgfCAgIHwgICAgICB8Ci0JCQkJICAgfCAgICAgIHwgICB8ICAgICAgfAotCQkJCSAgIHwgICAgICB8ICAgfCAgICAgIHwKLQkJCQkgICArLS0tLS0tKy0tLSstLS0tLS0rICovCisJCQkJICogfEQgICAgIHwgICB8ICAgICBTfAorCQkJCSAqIHwgICAgICB8ICAgfCAgICAgIHwKKwkJCQkgKiB8ICAgICAgfCAgIHwgICAgICB8CisJCQkJICogfCAgICAgIHwgICB8ICAgICAgfAorCQkJCSAqICstLS0tLS0rLS0tKy0tLS0tLSsKKwkJCQkgKi8KIAogCQkJCW5EaXJlY3Rpb24gPSBMRUZUX1RPX1JJR0hUOwogCQkJfQpAQCAtMjA4LDMyICsyMTQsMzYgQEAKIAl9CiAKIAkvKiBOb3RlOgotCSAgIERFX0ZPUkVHUk9VTkQgYXJlIERFX0JBQ0tHUk9VTkQgYXJlIGRvbid0IGNhcmUuCi0JICBERV9DT0xPUl9DT01QQVJFIGFuZCBERV9DT0xPUl9DT01QQVJFX01BS1MgYXJlIHNldCBieSBzZXQgZGVTZXRUcmFuc3BhcmVuY3koKS4KKwkgKiBERV9GT1JFR1JPVU5EIGFyZSBERV9CQUNLR1JPVU5EIGFyZSBkb24ndCBjYXJlLgorCSAqIERFX0NPTE9SX0NPTVBBUkUgYW5kIERFX0NPTE9SX0NPTVBBUkVfTUFLUworCSAqIGFyZSBzZXQgYnkgc2V0IGRlU2V0VHJhbnNwYXJlbmN5KCkuCiAJICovCiAKIAkvKiAyRCBTb3VyY2UgQmFzZS4KLQkgSXQgaXMgYW4gYWRkcmVzcyBvZmZzZXQgKDEyOCBiaXQgYWxpZ25lZCkgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGZyYW1lIGJ1ZmZlci4KKwkgKiBJdCBpcyBhbiBhZGRyZXNzIG9mZnNldCAoMTI4IGJpdCBhbGlnbmVkKQorCSAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiBmcmFtZSBidWZmZXIuCiAJICovCiAJd3JpdGVfZHByKGFjY2VsLCBERV9XSU5ET1dfU09VUkNFX0JBU0UsIHNCYXNlKTsgLyogZHByNDAgKi8KIAogCS8qIDJEIERlc3RpbmF0aW9uIEJhc2UuCi0JIEl0IGlzIGFuIGFkZHJlc3Mgb2Zmc2V0ICgxMjggYml0IGFsaWduZWQpIGZyb20gdGhlIGJlZ2lubmluZyBvZiBmcmFtZSBidWZmZXIuCisJICogSXQgaXMgYW4gYWRkcmVzcyBvZmZzZXQgKDEyOCBiaXQgYWxpZ25lZCkKKwkgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgZnJhbWUgYnVmZmVyLgogCSAqLwogCXdyaXRlX2RwcihhY2NlbCwgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UsIGRCYXNlKTsgLyogZHByNDQgKi8KIAogICAgIC8qIFByb2dyYW0gcGl0Y2ggKGRpc3RhbmNlIGJldHdlZW4gdGhlIDFzdCBwb2ludHMgb2YgdHdvIGFkamFjZW50IGxpbmVzKS4KLSAgICAgICBOb3RlIHRoYXQgaW5wdXQgcGl0Y2ggaXMgQllURSB2YWx1ZSwgYnV0IHRoZSAyRCBQaXRjaCByZWdpc3RlciB1c2VzCi0gICAgICAgcGl4ZWwgdmFsdWVzLiBOZWVkIEJ5dGUgdG8gcGl4ZWwgY29udmVyc2lvbi4KLSAgICAqLworICAgICAqIE5vdGUgdGhhdCBpbnB1dCBwaXRjaCBpcyBCWVRFIHZhbHVlLCBidXQgdGhlIDJEIFBpdGNoIHJlZ2lzdGVyIHVzZXMKKyAgICAgKiBwaXhlbCB2YWx1ZXMuIE5lZWQgQnl0ZSB0byBwaXhlbCBjb252ZXJzaW9uLgorICAgICAqLwogCXdyaXRlX2RwcihhY2NlbCwgREVfUElUQ0gsCiAJCSAgKChkUGl0Y2ggLyBCcHAgPDwgREVfUElUQ0hfREVTVElOQVRJT05fU0hJRlQpICYKIAkJICAgREVfUElUQ0hfREVTVElOQVRJT05fTUFTSykgfAogCQkgIChzUGl0Y2ggLyBCcHAgJiBERV9QSVRDSF9TT1VSQ0VfTUFTSykpOyAvKiBkcHIxMCAqLwogCiAgICAgLyogU2NyZWVuIFdpbmRvdyB3aWR0aCBpbiBQaXhlbHMuCi0gICAgICAgMkQgZW5naW5lIHVzZXMgdGhpcyB2YWx1ZSB0byBjYWxjdWxhdGUgdGhlIGxpbmVhciBhZGRyZXNzIGluIGZyYW1lIGJ1ZmZlciBmb3IgYSBnaXZlbiBwb2ludC4KLSAgICAqLworICAgICAqIDJEIGVuZ2luZSB1c2VzIHRoaXMgdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSBsaW5lYXIgYWRkcmVzcyBpbiBmcmFtZSBidWZmZXIKKyAgICAgKiBmb3IgYSBnaXZlbiBwb2ludC4KKyAgICAgKi8KIAl3cml0ZV9kcHIoYWNjZWwsIERFX1dJTkRPV19XSURUSCwKIAkJICAoKGRQaXRjaCAvIEJwcCA8PCBERV9XSU5ET1dfV0lEVEhfRFNUX1NISUZUKSAmCiAJCSAgIERFX1dJTkRPV19XSURUSF9EU1RfTUFTSykgfApAQCAtMzA3LDMzICszMTcsMzcgQEAKIAkJcmV0dXJuIC0xOwogCiAJLyogMkQgU291cmNlIEJhc2UuCi0JIFVzZSAwIGZvciBIT1NUIEJsdC4KKwkgKiBVc2UgMCBmb3IgSE9TVCBCbHQuCiAJICovCiAJd3JpdGVfZHByKGFjY2VsLCBERV9XSU5ET1dfU09VUkNFX0JBU0UsIDApOwogCiAJLyogMkQgRGVzdGluYXRpb24gQmFzZS4KLQkgSXQgaXMgYW4gYWRkcmVzcyBvZmZzZXQgKDEyOCBiaXQgYWxpZ25lZCkgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGZyYW1lIGJ1ZmZlci4KKwkgKiBJdCBpcyBhbiBhZGRyZXNzIG9mZnNldCAoMTI4IGJpdCBhbGlnbmVkKQorCSAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiBmcmFtZSBidWZmZXIuCiAJICovCiAJd3JpdGVfZHByKGFjY2VsLCBERV9XSU5ET1dfREVTVElOQVRJT05fQkFTRSwgZEJhc2UpOwogICAgIC8qIFByb2dyYW0gcGl0Y2ggKGRpc3RhbmNlIGJldHdlZW4gdGhlIDFzdCBwb2ludHMgb2YgdHdvIGFkamFjZW50IGxpbmVzKS4KLSAgICAgICBOb3RlIHRoYXQgaW5wdXQgcGl0Y2ggaXMgQllURSB2YWx1ZSwgYnV0IHRoZSAyRCBQaXRjaCByZWdpc3RlciB1c2VzCi0gICAgICAgcGl4ZWwgdmFsdWVzLiBOZWVkIEJ5dGUgdG8gcGl4ZWwgY29udmVyc2lvbi4KLSAgICAqLworICAgICAqIE5vdGUgdGhhdCBpbnB1dCBwaXRjaCBpcyBCWVRFIHZhbHVlLCBidXQgdGhlIDJEIFBpdGNoIHJlZ2lzdGVyIHVzZXMKKyAgICAgKiBwaXhlbCB2YWx1ZXMuIE5lZWQgQnl0ZSB0byBwaXhlbCBjb252ZXJzaW9uLgorICAgICAqLwogCXdyaXRlX2RwcihhY2NlbCwgREVfUElUQ0gsCiAJCSAgKChkUGl0Y2ggLyBieXRlUGVyUGl4ZWwgPDwgREVfUElUQ0hfREVTVElOQVRJT05fU0hJRlQpICYKIAkJICAgREVfUElUQ0hfREVTVElOQVRJT05fTUFTSykgfAogCQkgIChkUGl0Y2ggLyBieXRlUGVyUGl4ZWwgJiBERV9QSVRDSF9TT1VSQ0VfTUFTSykpOyAvKiBkcHIxMCAqLwogCiAJLyogU2NyZWVuIFdpbmRvdyB3aWR0aCBpbiBQaXhlbHMuCi0JIDJEIGVuZ2luZSB1c2VzIHRoaXMgdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSBsaW5lYXIgYWRkcmVzcyBpbiBmcmFtZSBidWZmZXIgZm9yIGEgZ2l2ZW4gcG9pbnQuCisJICogMkQgZW5naW5lIHVzZXMgdGhpcyB2YWx1ZSB0byBjYWxjdWxhdGUgdGhlIGxpbmVhciBhZGRyZXNzCisJICogaW4gZnJhbWUgYnVmZmVyIGZvciBhIGdpdmVuIHBvaW50LgogCSAqLwogCXdyaXRlX2RwcihhY2NlbCwgREVfV0lORE9XX1dJRFRILAogCQkgICgoZFBpdGNoIC8gYnl0ZVBlclBpeGVsIDw8IERFX1dJTkRPV19XSURUSF9EU1RfU0hJRlQpICYKIAkJICAgREVfV0lORE9XX1dJRFRIX0RTVF9NQVNLKSB8CiAJCSAgKGRQaXRjaCAvIGJ5dGVQZXJQaXhlbCAmIERFX1dJTkRPV19XSURUSF9TUkNfTUFTSykpOwogCi0JIC8qIE5vdGU6IEZvciAyRCBTb3VyY2UgaW4gSG9zdCBXcml0ZSwgb25seSBYX0sxX01PTk8gZmllbGQgaXMgbmVlZGVkLCBhbmQgWV9LMiBmaWVsZCBpcyBub3QgdXNlZC4KLQkgICAgRm9yIG1vbm8gYml0bWFwLCB1c2Ugc3RhcnRCaXQgZm9yIFhfSzEuICovCisJIC8qIE5vdGU6IEZvciAyRCBTb3VyY2UgaW4gSG9zdCBXcml0ZSwgb25seSBYX0sxX01PTk8gZmllbGQgaXMgbmVlZGVkLAorCSAgKiBhbmQgWV9LMiBmaWVsZCBpcyBub3QgdXNlZC4KKwkgICogRm9yIG1vbm8gYml0bWFwLCB1c2Ugc3RhcnRCaXQgZm9yIFhfSzEuCisJICAqLwogCXdyaXRlX2RwcihhY2NlbCwgREVfU09VUkNFLAogCQkgIChzdGFydEJpdCA8PCBERV9TT1VSQ0VfWF9LMV9TSElGVCkgJgogCQkgIERFX1NPVVJDRV9YX0sxX01PTk9fTUFTSyk7IC8qIGRwcjAwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9ody5jIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfaHcuYwppbmRleCAyZGFlZWRkLi43ZGQyMDhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9ody5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2h3LmMKQEAgLTM1LDE3ICszNSwxNyBAQAogCXByX2luZm8oIm1taW8gcGh5QWRkciA9ICVseFxuIiwgc203NTBfZGV2LT52aWRyZWdfc3RhcnQpOwogCiAJLyogcmVzZXJ2ZSB0aGUgdmlkcmVnIHNwYWNlIG9mIHNtaSBhZGFwdG9yCi0JICogaWYgeW91IGRvIHRoaXMsIHUgbmVlZCB0byBhZGQgcmVsZWFzZSByZWdpb24gY29kZQorCSAqIGlmIHlvdSBkbyB0aGlzLCB5b3UgbmVlZCB0byBhZGQgcmVsZWFzZSByZWdpb24gY29kZQogCSAqIGluIGx5bnhmYl9yZW1vdmUsIG9yIG1lbW9yeSB3aWxsIG5vdCBiZSBtYXBwZWQgYWdhaW4KIAkgKiBzdWNjZXNzZnVsbHkKLQkgKiAqLworCSAqLwogCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCAxLCAic203NTBmYiIpOwogCWlmIChyZXQpIHsKIAkJcHJfZXJyKCJDYW4gbm90IHJlcXVlc3QgUENJIHJlZ2lvbnMuXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAotCS8qIG5vdyBtYXAgbW1pbyBhbmQgdmlkbWVtKi8KKwkvKiBub3cgbWFwIG1taW8gYW5kIHZpZG1lbSAqLwogCXNtNzUwX2Rldi0+cHZSZWcgPSBpb3JlbWFwX25vY2FjaGUoc203NTBfZGV2LT52aWRyZWdfc3RhcnQsCiAJCQkJCSAgIHNtNzUwX2Rldi0+dmlkcmVnX3NpemUpOwogCWlmICghc203NTBfZGV2LT5wdlJlZykgewpAQCAtNTYsNyArNTYsNiBAQAogCQlwcl9pbmZvKCJtbWlvIHZpcnR1YWwgYWRkciA9ICVwXG4iLCBzbTc1MF9kZXYtPnB2UmVnKTsKIAl9CiAKLQogCXNtNzUwX2Rldi0+YWNjZWwuZHByQmFzZSA9IHNtNzUwX2Rldi0+cHZSZWcgKyBERV9CQVNFX0FERFJfVFlQRTE7CiAJc203NTBfZGV2LT5hY2NlbC5kcFBvcnRCYXNlID0gc203NTBfZGV2LT5wdlJlZyArIERFX1BPUlRfQUREUl9UWVBFMTsKIApAQCAtNjQsMTAgKzYzLDEwIEBACiAKIAlzbTc1MF9kZXYtPnZpZG1lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKIAkvKiBkb24ndCB1c2UgcGRldl9yZXNvdXJjZVt4XS5lbmQgLSByZXNvdXJjZVt4XS5zdGFydCB0bwotCSAqIGNhbGN1bGF0ZSB0aGUgcmVzb3VyY2Ugc2l6ZSxpdHMgb25seSB0aGUgbWF4aW11bSBhdmFpbGFibGUKLQkgKiBzaXplIGJ1dCBub3QgdGhlIGFjdHVhbCBzaXplLHVzZQorCSAqIGNhbGN1bGF0ZSB0aGUgcmVzb3VyY2Ugc2l6ZSwgaXQncyBvbmx5IHRoZSBtYXhpbXVtIGF2YWlsYWJsZQorCSAqIHNpemUgYnV0IG5vdCB0aGUgYWN0dWFsIHNpemUsIHVzaW5nCiAJICogQGRkazc1MF9nZXRWTVNpemUgZnVuY3Rpb24gY2FuIGJlIHNhZmUuCi0JICogKi8KKwkgKi8KIAlzbTc1MF9kZXYtPnZpZG1lbV9zaXplID0gZGRrNzUwX2dldFZNU2l6ZSgpOwogCXByX2luZm8oInZpZGVvIG1lbW9yeSBwaHlBZGRyID0gJWx4LCBzaXplID0gJXUgYnl0ZXNcbiIsCiAJCXNtNzUwX2Rldi0+dmlkbWVtX3N0YXJ0LCBzbTc1MF9kZXYtPnZpZG1lbV9zaXplKTsKQEAgLTg2LDMzICs4NSwzMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLQotCiBpbnQgaHdfc203NTBfaW5pdGh3KHN0cnVjdCBzbTc1MF9kZXYgKnNtNzUwX2Rldiwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IGluaXRfc3RhdHVzICpwYXJtOwogCiAJcGFybSA9ICZzbTc1MF9kZXYtPmluaXRQYXJtOwogCWlmIChwYXJtLT5jaGlwX2NsayA9PSAwKQotCQlwYXJtLT5jaGlwX2NsayA9IChnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpID8KKwkJcGFybS0+Y2hpcF9jbGsgPSAoc203NTBfZ2V0X2NoaXBfdHlwZSgpID09IFNNNzUwTEUpID8KIAkJCQkJCURFRkFVTFRfU003NTBMRV9DSElQX0NMT0NLIDoKIAkJCQkJCURFRkFVTFRfU003NTBfQ0hJUF9DTE9DSzsKIAogCWlmIChwYXJtLT5tZW1fY2xrID09IDApCiAJCXBhcm0tPm1lbV9jbGsgPSBwYXJtLT5jaGlwX2NsazsKIAlpZiAocGFybS0+bWFzdGVyX2NsayA9PSAwKQotCQlwYXJtLT5tYXN0ZXJfY2xrID0gcGFybS0+Y2hpcF9jbGsvMzsKKwkJcGFybS0+bWFzdGVyX2NsayA9IHBhcm0tPmNoaXBfY2xrIC8gMzsKIAogCWRkazc1MF9pbml0SHcoKGluaXRjaGlwX3BhcmFtX3QgKikmc203NTBfZGV2LT5pbml0UGFybSk7Ci0JLyogZm9yIHNtNzE4LG9wZW4gcGNpIGJ1cnN0ICovCisJLyogZm9yIHNtNzE4LCBvcGVuIHBjaSBidXJzdCAqLwogCWlmIChzbTc1MF9kZXYtPmRldmlkID09IDB4NzE4KSB7CiAJCVBPS0UzMihTWVNURU1fQ1RSTCwKIAkJICAgICAgIFBFRUszMihTWVNURU1fQ1RSTCkgfCBTWVNURU1fQ1RSTF9QQ0lfQlVSU1QpOwogCX0KIAotCWlmIChnZXRDaGlwVHlwZSgpICE9IFNNNzUwTEUpIHsKKwlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpICE9IFNNNzUwTEUpIHsKIAkJdW5zaWduZWQgaW50IHZhbDsKLQkJLyogZG9lcyB1c2VyIG5lZWQgQ1JUID8qLworCQkvKiBkb2VzIHVzZXIgbmVlZCBDUlQ/ICovCiAJCWlmIChzbTc1MF9kZXYtPm5vY3J0KSB7CiAJCQlQT0tFMzIoTUlTQ19DVFJMLAogCQkJICAgICAgIFBFRUszMihNSVNDX0NUUkwpIHwgTUlTQ19DVFJMX0RBQ19QT1dFUl9PRkYpOwpAQCAtMTQ0LDE5ICsxNDEsMjEgQEAKIAkJfQogCQlQT0tFMzIoUEFORUxfRElTUExBWV9DVFJMLCB2YWwpOwogCX0gZWxzZSB7Ci0JCS8qIGZvciA3NTBMRSAsbm8gRFZJIGNoaXAgaW5pdGlhbGl6YXRpb24gbWFrZXMgTW9uaXRvciBubyBzaWduYWwgKi8KLQkJLyogU2V0IHVwIEdQSU8gZm9yIHNvZnR3YXJlIEkyQyB0byBwcm9ncmFtIERWSSBjaGlwIGluIHRoZQotCQkgICBYaWxpbnggU1A2MDUgYm9hcmQsIGluIG9yZGVyIHRvIGhhdmUgdmlkZW8gc2lnbmFsLgorCQkvKiBmb3IgNzUwTEUsIG5vIERWSSBjaGlwIGluaXRpYWxpemF0aW9uCisJCSAqIG1ha2VzIE1vbml0b3Igbm8gc2lnbmFsCisJCSAqCisJCSAqIFNldCB1cCBHUElPIGZvciBzb2Z0d2FyZSBJMkMgdG8gcHJvZ3JhbSBEVkkgY2hpcCBpbiB0aGUKKwkJICogWGlsaW54IFNQNjA1IGJvYXJkLCBpbiBvcmRlciB0byBoYXZlIHZpZGVvIHNpZ25hbC4KIAkJICovCiAJCXNtNzUwX3N3X2kyY19pbml0KDAsIDEpOwogCiAJCS8qIEN1c3RvbWVyIG1heSBOT1QgdXNlIENINzMwMSBEVkkgY2hpcCwgd2hpY2ggaGFzIHRvIGJlCi0JCWluaXRpYWxpemVkIGRpZmZlcmVudGx5LgotCQkqLworCQkgKiBpbml0aWFsaXplZCBkaWZmZXJlbnRseS4KKwkJICovCiAJCWlmIChzbTc1MF9zd19pMmNfcmVhZF9yZWcoMHhlYywgMHg0YSkgPT0gMHg5NSkgewogCQkvKiBUaGUgZm9sbG93aW5nIHJlZ2lzdGVyIHZhbHVlcyBmb3IgQ0g3MzAxIGFyZSBmcm9tCi0JCSAgIENocm9udGVsIGFwcCBub3RlIGFuZCBvdXIgZXhwZXJpbWVudC4KLQkJKi8KKwkJICogQ2hyb250ZWwgYXBwIG5vdGUgYW5kIG91ciBleHBlcmltZW50LgorCQkgKi8KIAkJCXByX2luZm8oInllcyxDSDczMDEgRFZJIGNoaXAgZm91bmRcbiIpOwogCQkJc203NTBfc3dfaTJjX3dyaXRlX3JlZygweGVjLCAweDFkLCAweDE2KTsKIAkJCXNtNzUwX3N3X2kyY193cml0ZV9yZWcoMHhlYywgMHgyMSwgMHg5KTsKQEAgLTE3Myw3ICsxNzIsOCBAQAogfQogCiBpbnQgaHdfc203NTBfb3V0cHV0X3NldE1vZGUoc3RydWN0IGx5bnhmYl9vdXRwdXQgKm91dHB1dCwKLQkJCQkJCQkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCkKKwkJCSAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJCSAgICBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCkKIHsKIAlpbnQgcmV0OwogCWRpc3Bfb3V0cHV0X3QgZGlzcFNldDsKQEAgLTE4Myw4ICsxODMsNyBAQAogCWRpc3BTZXQgPSAwOwogCWNoYW5uZWwgPSAqb3V0cHV0LT5jaGFubmVsOwogCi0KLQlpZiAoZ2V0Q2hpcFR5cGUoKSAhPSBTTTc1MExFKSB7CisJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSAhPSBTTTc1MExFKSB7CiAJCWlmIChjaGFubmVsID09IHNtNzUwX3ByaW1hcnkpIHsKIAkJCXByX2luZm8oInByaW1hcnkgY2hhbm5lbFxuIik7CiAJCQlpZiAob3V0cHV0LT5wYXRocyAmIHNtNzUwX3BhbmVsKQpAQCAtMTk4LDExICsxOTcsMTAgQEAKIAkJCQlkaXNwU2V0IHw9IGRvX0xDRDFfU0VDOwogCQkJaWYgKG91dHB1dC0+cGF0aHMgJiBzbTc1MF9jcnQpCiAJCQkJZGlzcFNldCB8PSBkb19DUlRfU0VDOwotCiAJCX0KIAkJZGRrNzUwX3NldExvZ2ljYWxEaXNwT3V0KGRpc3BTZXQpOwogCX0gZWxzZSB7Ci0JCS8qIGp1c3Qgb3BlbiBESVNQTEFZX0NPTlRST0xfNzUwTEUgcmVnaXN0ZXIgYml0IDM6MCovCisJCS8qIGp1c3Qgb3BlbiBESVNQTEFZX0NPTlRST0xfNzUwTEUgcmVnaXN0ZXIgYml0IDM6MCAqLwogCQl1MzIgcmVnOwogCiAJCXJlZyA9IFBFRUszMihESVNQTEFZX0NPTlRST0xfNzUwTEUpOwpAQCAtMjE0LDcgKzIxMiw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGh3X3NtNzUwX2NydGNfY2hlY2tNb2RlKHN0cnVjdCBseW54ZmJfY3J0YyAqY3J0Yywgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCitpbnQgaHdfc203NTBfY3J0Y19jaGVja01vZGUoc3RydWN0IGx5bnhmYl9jcnRjICpjcnRjLAorCQkJICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQogewogCXN0cnVjdCBzbTc1MF9kZXYgKnNtNzUwX2RldjsKIAlzdHJ1Y3QgbHlueGZiX3BhciAqcGFyID0gY29udGFpbmVyX29mKGNydGMsIHN0cnVjdCBseW54ZmJfcGFyLCBjcnRjKTsKQEAgLTIzMywxOSArMjMyLDE1IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwotCiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLQotLyoKLQlzZXQgdGhlIGNvbnRyb2xsZXIncyBtb2RlIGZvciBAY3J0YyBjaGFyZ2VkIHdpdGggQHZhciBhbmQgQGZpeCBwYXJhbWV0ZXJzCi0qLworLyogc2V0IHRoZSBjb250cm9sbGVyJ3MgbW9kZSBmb3IgQGNydGMgY2hhcmdlZCB3aXRoIEB2YXIgYW5kIEBmaXggcGFyYW1ldGVycyAqLwogaW50IGh3X3NtNzUwX2NydGNfc2V0TW9kZShzdHJ1Y3QgbHlueGZiX2NydGMgKmNydGMsCi0JCQkJCQkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCQkJCQkJCQlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCkKKwkJCSAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4KQogewogCWludCByZXQsIGZtdDsKIAl1MzIgcmVnOwpAQCAtMjU0LDcgKzI0OSw2IEBACiAJc3RydWN0IHNtNzUwX2RldiAqc203NTBfZGV2OwogCXN0cnVjdCBseW54ZmJfcGFyICpwYXI7CiAKLQogCXJldCA9IDA7CiAJcGFyID0gY29udGFpbmVyX29mKGNydGMsIHN0cnVjdCBseW54ZmJfcGFyLCBjcnRjKTsKIAlzbTc1MF9kZXYgPSBwYXItPmRldjsKQEAgLTI3OCwxNyArMjcyLDIyIEBACiAKIAkvKiBzZXQgdGltaW5nICovCiAJbW9kcGFybS5waXhlbF9jbG9jayA9IHBzX3RvX2h6KHZhci0+cGl4Y2xvY2spOwotCW1vZHBhcm0udmVydGljYWxfc3luY19wb2xhcml0eSA9ICh2YXItPnN5bmMgJiBGQl9TWU5DX0hPUl9ISUdIX0FDVCkgPyBQT1M6TkVHOwotCW1vZHBhcm0uaG9yaXpvbnRhbF9zeW5jX3BvbGFyaXR5ID0gKHZhci0+c3luYyAmIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCkgPyBQT1M6TkVHOwotCW1vZHBhcm0uY2xvY2tfcGhhc2VfcG9sYXJpdHkgPSAodmFyLT5zeW5jICYgRkJfU1lOQ19DT01QX0hJR0hfQUNUKSA/IFBPUzpORUc7CisJbW9kcGFybS52ZXJ0aWNhbF9zeW5jX3BvbGFyaXR5ID0gKHZhci0+c3luYyAmIEZCX1NZTkNfSE9SX0hJR0hfQUNUKQorCQkJCQkgPyBQT1MgOiBORUc7CisJbW9kcGFybS5ob3Jpem9udGFsX3N5bmNfcG9sYXJpdHkgPSAodmFyLT5zeW5jICYgRkJfU1lOQ19WRVJUX0hJR0hfQUNUKQorCQkJCQkgICA/IFBPUyA6IE5FRzsKKwltb2RwYXJtLmNsb2NrX3BoYXNlX3BvbGFyaXR5ID0gKHZhci0+c3luYyAmIEZCX1NZTkNfQ09NUF9ISUdIX0FDVCkKKwkJCQkgICAgICAgPyBQT1MgOiBORUc7CiAJbW9kcGFybS5ob3Jpem9udGFsX2Rpc3BsYXlfZW5kID0gdmFyLT54cmVzOwogCW1vZHBhcm0uaG9yaXpvbnRhbF9zeW5jX3dpZHRoID0gdmFyLT5oc3luY19sZW47CiAJbW9kcGFybS5ob3Jpem9udGFsX3N5bmNfc3RhcnQgPSB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbjsKLQltb2RwYXJtLmhvcml6b250YWxfdG90YWwgPSB2YXItPnhyZXMgKyB2YXItPmxlZnRfbWFyZ2luICsgdmFyLT5yaWdodF9tYXJnaW4gKyB2YXItPmhzeW5jX2xlbjsKKwltb2RwYXJtLmhvcml6b250YWxfdG90YWwgPSB2YXItPnhyZXMgKyB2YXItPmxlZnRfbWFyZ2luICsKKwkJCQkgICB2YXItPnJpZ2h0X21hcmdpbiArIHZhci0+aHN5bmNfbGVuOwogCW1vZHBhcm0udmVydGljYWxfZGlzcGxheV9lbmQgPSB2YXItPnlyZXM7CiAJbW9kcGFybS52ZXJ0aWNhbF9zeW5jX2hlaWdodCA9IHZhci0+dnN5bmNfbGVuOwogCW1vZHBhcm0udmVydGljYWxfc3luY19zdGFydCA9IHZhci0+eXJlcyArIHZhci0+bG93ZXJfbWFyZ2luOwotCW1vZHBhcm0udmVydGljYWxfdG90YWwgPSB2YXItPnlyZXMgKyB2YXItPnVwcGVyX21hcmdpbiArIHZhci0+bG93ZXJfbWFyZ2luICsgdmFyLT52c3luY19sZW47CisJbW9kcGFybS52ZXJ0aWNhbF90b3RhbCA9IHZhci0+eXJlcyArIHZhci0+dXBwZXJfbWFyZ2luICsKKwkJCQkgdmFyLT5sb3dlcl9tYXJnaW4gKyB2YXItPnZzeW5jX2xlbjsKIAogCS8qIGNob29zZSBwbGwgKi8KIAlpZiAoY3J0Yy0+Y2hhbm5lbCAhPSBzbTc1MF9zZWNvbmRhcnkpCkBAIC0zMDQsMTIgKzMwMywxNCBAQAogCX0KIAogCWlmIChjcnRjLT5jaGFubmVsICE9IHNtNzUwX3NlY29uZGFyeSkgewotCQkvKiBzZXQgcGl0Y2gsIG9mZnNldCAsd2lkdGgsc3RhcnQgYWRkcmVzcyAsZXRjLi4uICovCisJCS8qIHNldCBwaXRjaCwgb2Zmc2V0LCB3aWR0aCwgc3RhcnQgYWRkcmVzcywgZXRjLi4uICovCiAJCVBPS0UzMihQQU5FTF9GQl9BRERSRVNTLAogCQkgICAgICAgY3J0Yy0+b1NjcmVlbiAmIFBBTkVMX0ZCX0FERFJFU1NfQUREUkVTU19NQVNLKTsKIAogCQlyZWcgPSB2YXItPnhyZXMgKiAodmFyLT5iaXRzX3Blcl9waXhlbCA+PiAzKTsKLQkJLyogY3J0Yy0+Y2hhbm5lbCBpcyBub3QgZXF1YWwgdG8gcGFyLT5pbmRleCBvbiBudW1lcmljLGJlIGF3YXJlIG9mIHRoYXQgKi8KKwkJLyogY3J0Yy0+Y2hhbm5lbCBpcyBub3QgZXF1YWwgdG8gcGFyLT5pbmRleCBvbiBudW1lcmljLAorCQkgKiBiZSBhd2FyZSBvZiB0aGF0CisJCSAqLwogCQlyZWcgPSBBTElHTihyZWcsIGNydGMtPmxpbmVfcGFkKTsKIAkJcmVnID0gKHJlZyA8PCBQQU5FTF9GQl9XSURUSF9XSURUSF9TSElGVCkgJgogCQkgICAgICAgUEFORUxfRkJfV0lEVEhfV0lEVEhfTUFTSzsKQEAgLTMyMSw4ICszMjIsOCBAQAogCQlyZWcgfD0gKHZhci0+eG9mZnNldCAmIFBBTkVMX1dJTkRPV19XSURUSF9YX01BU0spOwogCQlQT0tFMzIoUEFORUxfV0lORE9XX1dJRFRILCByZWcpOwogCi0JCXJlZyA9ICgodmFyLT55cmVzX3ZpcnR1YWwgLSAxKSA8PAotCQkgICAgICAgUEFORUxfV0lORE9XX0hFSUdIVF9IRUlHSFRfU0hJRlQpOworCQlyZWcgPSAodmFyLT55cmVzX3ZpcnR1YWwgLSAxKSA8PAorCQkgICAgICBQQU5FTF9XSU5ET1dfSEVJR0hUX0hFSUdIVF9TSElGVDsKIAkJcmVnICY9IFBBTkVMX1dJTkRPV19IRUlHSFRfSEVJR0hUX01BU0s7CiAJCXJlZyB8PSAodmFyLT55b2Zmc2V0ICYgUEFORUxfV0lORE9XX0hFSUdIVF9ZX01BU0spOwogCQlQT0tFMzIoUEFORUxfV0lORE9XX0hFSUdIVCwgcmVnKTsKQEAgLTM0MSw3ICszNDIsOSBAQAogCQkvKiBub3QgaW1wbGVtZW50ZWQgbm93ICovCiAJCVBPS0UzMihDUlRfRkJfQUREUkVTUywgY3J0Yy0+b1NjcmVlbik7CiAJCXJlZyA9IHZhci0+eHJlcyAqICh2YXItPmJpdHNfcGVyX3BpeGVsID4+IDMpOwotCQkvKiBjcnRjLT5jaGFubmVsIGlzIG5vdCBlcXVhbCB0byBwYXItPmluZGV4IG9uIG51bWVyaWMsYmUgYXdhcmUgb2YgdGhhdCAqLworCQkvKiBjcnRjLT5jaGFubmVsIGlzIG5vdCBlcXVhbCB0byBwYXItPmluZGV4IG9uIG51bWVyaWMsCisJCSAqIGJlIGF3YXJlIG9mIHRoYXQKKwkJICovCiAJCXJlZyA9IEFMSUdOKHJlZywgY3J0Yy0+bGluZV9wYWQpIDw8IENSVF9GQl9XSURUSF9XSURUSF9TSElGVDsKIAkJcmVnICY9IENSVF9GQl9XSURUSF9XSURUSF9NQVNLOwogCQlyZWcgfD0gKGZpeC0+bGluZV9sZW5ndGggJiBDUlRfRkJfV0lEVEhfT0ZGU0VUX01BU0spOwpAQCAtMzUyLDIwICszNTUsMTkgQEAKIAkJcmVnIHw9ICgodmFyLT5iaXRzX3Blcl9waXhlbCA+PiA0KSAmCiAJCQlDUlRfRElTUExBWV9DVFJMX0ZPUk1BVF9NQVNLKTsKIAkJUE9LRTMyKENSVF9ESVNQTEFZX0NUUkwsIHJlZyk7Ci0KIAl9CiAKLQogZXhpdDoKIAlyZXR1cm4gcmV0OwogfQogCiBpbnQgaHdfc203NTBfc2V0Q29sUmVnKHN0cnVjdCBseW54ZmJfY3J0YyAqY3J0YywgdXNob3J0IGluZGV4LAotCQkJCQkJCQl1c2hvcnQgcmVkLCB1c2hvcnQgZ3JlZW4sIHVzaG9ydCBibHVlKQorCQkgICAgICAgdXNob3J0IHJlZCwgdXNob3J0IGdyZWVuLCB1c2hvcnQgYmx1ZSkKIHsKIAlzdGF0aWMgdW5zaWduZWQgaW50IGFkZFtdID0ge1BBTkVMX1BBTEVUVEVfUkFNLCBDUlRfUEFMRVRURV9SQU19OwogCi0JUE9LRTMyKGFkZFtjcnRjLT5jaGFubmVsXSArIGluZGV4KjQsIChyZWQ8PDE2KXwoZ3JlZW48PDgpfGJsdWUpOworCVBPS0UzMihhZGRbY3J0Yy0+Y2hhbm5lbF0gKyBpbmRleCAqIDQsCisJICAgICAgIChyZWQgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgYmx1ZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQxNCw3ICs0MTYsOSBAQAogewogCXVuc2lnbmVkIGludCBkcG1zLCBwcHMsIGNydGRiOwogCi0JZHBtcyA9IHBwcyA9IGNydGRiID0gMDsKKwlkcG1zID0gMDsKKwlwcHMgPSAwOworCWNydGRiID0gMDsKIAogCXN3aXRjaCAoYmxhbmspIHsKIAljYXNlIEZCX0JMQU5LX1VOQkxBTks6CkBAIC00NjEsMTQgKzQ2NSwxMyBAQAogCXJldHVybiAwOwogfQogCi0KIHZvaWQgaHdfc203NTBfaW5pdEFjY2VsKHN0cnVjdCBzbTc1MF9kZXYgKnNtNzUwX2RldikKIHsKIAl1MzIgcmVnOwogCiAJZW5hYmxlMkRFbmdpbmUoMSk7CiAKLQlpZiAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKSB7CisJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSA9PSBTTTc1MExFKSB7CiAJCXJlZyA9IFBFRUszMihERV9TVEFURTEpOwogCQlyZWcgfD0gREVfU1RBVEUxX0RFX0FCT1JUOwogCQlQT0tFMzIoREVfU1RBVEUxLCByZWcpOwpAQCAtNTA5LDcgKzUxMiw2IEBACiAJcmV0dXJuIC0xOwogfQogCi0KIGludCBod19zbTc1MF9kZVdhaXQodm9pZCkKIHsKIAlpbnQgaSA9IDB4MTAwMDAwMDA7CkBAIC01MjksMTAgKzUzMSwxMCBAQAogfQogCiBpbnQgaHdfc203NTBfcGFuX2Rpc3BsYXkoc3RydWN0IGx5bnhmYl9jcnRjICpjcnRjLAotCWNvbnN0IHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCWNvbnN0IHN0cnVjdCBmYl9pbmZvICppbmZvKQorCQkJIGNvbnN0IHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJIGNvbnN0IHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXVpbnQzMl90IHRvdGFsOworCXUzMiB0b3RhbDsKIAkvKiBjaGVjayBwYXJhbXMgKi8KIAlpZiAoKHZhci0+eG9mZnNldCArIHZhci0+eHJlcyA+IHZhci0+eHJlc192aXJ0dWFsKSB8fAogCSAgICAodmFyLT55b2Zmc2V0ICsgdmFyLT55cmVzID4gdmFyLT55cmVzX3ZpcnR1YWwpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9kZXZzeW50aC5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvZGV2c3ludGguYwppbmRleCA4NDk4OTcxLi41OGFiZDFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9kZXZzeW50aC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL2RldnN5bnRoLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAkJc3ludGhfd3JpdGUoYnVmLCBieXRlcyk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwZWFrdXBfaW5mby5zcGlubG9jaywgZmxhZ3MpOwogCX0KLQlyZXR1cm4gKHNzaXplX3QpIG5ieXRlczsKKwlyZXR1cm4gKHNzaXplX3QpbmJ5dGVzOwogfQogCiBzdGF0aWMgc3NpemVfdCBzcGVha3VwX2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZnAsIGNoYXIgX191c2VyICpidWYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9rb2JqZWN0cy5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAva29iamVjdHMuYwppbmRleCA1MjhjYmRjLi5lNzQ0YWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9rb2JqZWN0cy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL2tvYmplY3RzLmMKQEAgLTI1MSw3ICsyNTEsNyBAQAogCX0KIAljcCArPSBzcHJpbnRmKGNwLCAiMCwgJWRcbiIsIEtFWV9NQVBfVkVSKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGVha3VwX2luZm8uc3BpbmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gKGludCkoY3AtYnVmKTsKKwlyZXR1cm4gKGludCkoY3AgLSBidWYpOwogfQogCiAvKgpAQCAtMjg4LDggKzI4OCw4IEBACiAJCWNwID0gc3BrX3MydWNoYXIoY3AsIGNwMSk7CiAJCWNwMSsrOwogCX0KLQlpID0gKGludCljcDFbLTJdKzE7Ci0JaSAqPSAoaW50KWNwMVstMV0rMTsKKwlpID0gKGludCljcDFbLTJdICsgMTsKKwlpICo9IChpbnQpY3AxWy0xXSArIDE7CiAJaSArPSAyOyAvKiAwIGFuZCBsYXN0IG1hcCB2ZXIgKi8KIAlpZiAoY3AxWy0zXSAhPSBLRVlfTUFQX1ZFUiB8fCBjcDFbLTFdID4gMTAgfHwKIAkJCWkrU0hJRlRfVEJMX1NJWkUrNCA+PSBzaXplb2Yoc3BrX2tleV9idWYpKSB7CkBAIC0zNTAsOSArMzUwLDkgQEAKIAl9IGVsc2UgewogCQlzaHV0ID0gMDsKIAl9Ci0JaWYgKGNoJjQpCisJaWYgKGNoICYgNCkKIAkJc2h1dCB8PSAweDQwOwotCWlmIChjaCYxKQorCWlmIChjaCAmIDEpCiAJCXNwa19zaHV0X3VwIHw9IHNodXQ7CiAJZWxzZQogCQlzcGtfc2h1dF91cCAmPSB+c2h1dDsKQEAgLTQxMSwxMSArNDExLDEzIEBACiAJaW50IGxlbjsKIAlpbnQgYnl0ZXM7CiAJY29uc3QgY2hhciAqcHRyID0gYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIXN5bnRoKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJbGVuID0gc3RybGVuKGJ1Zik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwZWFrdXBfaW5mby5zcGlubG9jaywgZmxhZ3MpOwogCXdoaWxlIChsZW4gPiAwKSB7CiAJCWJ5dGVzID0gbWluX3Qoc2l6ZV90LCBsZW4sIDI1MCk7CiAJCXN0cm5jcHkodG1wLCBwdHIsIGJ5dGVzKTsKQEAgLTQyNSw2ICs0MjcsNyBAQAogCQlwdHIgKz0gYnl0ZXM7CiAJCWxlbiAtPSBieXRlczsKIAl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BlYWt1cF9pbmZvLnNwaW5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC05NzMsMTEgKzk3NiwxMSBAQAogICogY3JlYXRlZCBmb3IgdGhlIGF0dHJpYnV0ZXMgd2l0aCB0aGUgZGlyZWN0b3J5IGJlaW5nIHRoZSBuYW1lIG9mIHRoZQogICogYXR0cmlidXRlIGdyb3VwLgogICovCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYWluX2F0dHJfZ3JvdXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYWluX2F0dHJfZ3JvdXAgPSB7CiAJLmF0dHJzID0gbWFpbl9hdHRycywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGkxOG5fYXR0cl9ncm91cCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGkxOG5fYXR0cl9ncm91cCA9IHsKIAkuYXR0cnMgPSBpMThuX2F0dHJzLAogCS5uYW1lID0gImkxOG4iLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3N5bnRoLmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zeW50aC5jCmluZGV4IDRmNDYyYzMuLjU0YjJmMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3N5bnRoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3ludGguYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgInNlcmlhbGlvLmgiCiAKICNkZWZpbmUgTUFYU1lOVEhTICAgICAgIDE2ICAgICAgLyogTWF4IG51bWJlciBvZiBzeW50aHMgaW4gYXJyYXkuICovCi1zdGF0aWMgc3RydWN0IHNwa19zeW50aCAqc3ludGhzW01BWFNZTlRIU107CitzdGF0aWMgc3RydWN0IHNwa19zeW50aCAqc3ludGhzW01BWFNZTlRIUyArIDFdOwogc3RydWN0IHNwa19zeW50aCAqc3ludGg7CiBjaGFyIHNwa19waXRjaF9idWZmWzMyXSA9ICIiOwogc3RhdGljIGludCBtb2R1bGVfc3RhdHVzOwpAQCAtNDA3LDcgKzQwNyw3IEBACiAJaWYgKCFzcGtfcXVpZXRfYm9vdCkKIAkJc3ludGhfcHJpbnRmKCIlcyBmb3VuZFxuIiwgc3ludGgtPmxvbmdfbmFtZSk7CiAJaWYgKHN5bnRoLT5hdHRyaWJ1dGVzLm5hbWUKLQkmJiBzeXNmc19jcmVhdGVfZ3JvdXAoc3BlYWt1cF9rb2JqLCAmKHN5bnRoLT5hdHRyaWJ1dGVzKSkgPCAwKQorCSYmIHN5c2ZzX2NyZWF0ZV9ncm91cChzcGVha3VwX2tvYmosICZzeW50aC0+YXR0cmlidXRlcykgPCAwKQogCQlyZXR1cm4gLUVOT01FTTsKIAlzeW50aF9mbGFncyA9IHN5bnRoLT5mbGFnczsKIAl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZzcGVha3VwX2V2ZW50KTsKQEAgLTQyOSw3ICs0MjksNyBAQAogCWRlbF90aW1lcigmdGhyZWFkX3RpbWVyKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGVha3VwX2luZm8uc3BpbmxvY2ssIGZsYWdzKTsKIAlpZiAoc3ludGgtPmF0dHJpYnV0ZXMubmFtZSkKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKHNwZWFrdXBfa29iaiwgJihzeW50aC0+YXR0cmlidXRlcykpOworCQlzeXNmc19yZW1vdmVfZ3JvdXAoc3BlYWt1cF9rb2JqLCAmc3ludGgtPmF0dHJpYnV0ZXMpOwogCWZvciAodmFyID0gc3ludGgtPnZhcnM7IHZhci0+dmFyX2lkICE9IE1BWFZBUlM7IHZhcisrKQogCQlzcGVha3VwX3VucmVnaXN0ZXJfdmFyKHZhci0+dmFyX2lkKTsKIAlzcGtfc3RvcF9zZXJpYWxfaW50ZXJydXB0KCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC92YXJoYW5kbGVycy5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvdmFyaGFuZGxlcnMuYwppbmRleCBlMTM5M2QyLi4yMTE4NmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC92YXJoYW5kbGVycy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3ZhcmhhbmRsZXJzLmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogCXVfY2hhciAqY3A7CiAJc2hvcnQgbWFzayA9IHNwa19wdW5jX2luZm9bd2hpY2hdLm1hc2s7CiAKLQlpZiAoaG93JjEpIHsKKwlpZiAoaG93ICYgMSkgewogCQlmb3IgKGNwID0gKHVfY2hhciAqKXNwa19wdW5jX2luZm9bM10udmFsdWU7ICpjcDsgY3ArKykKIAkJCXNwa19jaGFydGFiWypjcF0gJj0gfm1hc2s7CiAJfQpAQCAtMjkwLDE0ICsyOTAsMTQgQEAKIAkJCWlmIChtYXNrIDwgUFVOQykgewogCQkJCWlmICghKHNwa19jaGFydGFiWypjcF0gJiBQVU5DKSkKIAkJCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHNwa19jaGFydGFiWypjcF0mQl9OVU0pCisJCQl9IGVsc2UgaWYgKHNwa19jaGFydGFiWypjcF0gJiBCX05VTSkKIAkJCQlicmVhazsKIAkJfQogCQlpZiAoKmNwKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWNwID0gKHVfY2hhciAqKWlucHV0OwogCX0KLQlpZiAoaG93JjIpIHsKKwlpZiAoaG93ICYgMikgewogCQlmb3IgKDsgKmNwOyBjcCsrKQogCQkJaWYgKCpjcCA+IFNQQUNFKQogCQkJCXNwa19jaGFydGFiWypjcF0gfD0gbWFzazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9jaGFubmVsLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvY2hhbm5lbC5oCmluZGV4IGRiNGU2YjIuLjI1OWVmNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9jaGFubmVsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2NoYW5uZWwuaApAQCAtNzUsMjggKzc1LDYgQEAKIAkJCQkvKiBhY2Nlc3MgY2hhbm5lbCBhbnl0aW1lICovCiB9OwogCi1zdGF0aWMgaW5saW5lIGNvbnN0IHU4ICoKLVVMVFJBX0NIQU5ORUxDTElfU1RSSU5HKHUzMiBzdGF0ZSkKLXsKLQlzd2l0Y2ggKHN0YXRlKSB7Ci0JY2FzZSBDSEFOTkVMQ0xJX0RFVEFDSEVEOgotCQlyZXR1cm4gKGNvbnN0IHU4ICopKCJERVRBQ0hFRCIpOwotCWNhc2UgQ0hBTk5FTENMSV9ESVNBQkxFRDoKLQkJcmV0dXJuIChjb25zdCB1OCAqKSgiRElTQUJMRUQiKTsKLQljYXNlIENIQU5ORUxDTElfQVRUQUNISU5HOgotCQlyZXR1cm4gKGNvbnN0IHU4ICopKCJBVFRBQ0hJTkciKTsKLQljYXNlIENIQU5ORUxDTElfQVRUQUNIRUQ6Ci0JCXJldHVybiAoY29uc3QgdTggKikoIkFUVEFDSEVEIik7Ci0JY2FzZSBDSEFOTkVMQ0xJX0JVU1k6Ci0JCXJldHVybiAoY29uc3QgdTggKikoIkJVU1kiKTsKLQljYXNlIENIQU5ORUxDTElfT1dORUQ6Ci0JCXJldHVybiAoY29uc3QgdTggKikoIk9XTkVEIik7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAoY29uc3QgdTggKikoIj8iKTsKLX0KLQogI2RlZmluZSBTUEFSX0NIQU5ORUxfU0VSVkVSX1JFQURZKGNoKSBcCiAJKHJlYWRsKCYoY2gpLT5zcnZfc3RhdGUpID09IENIQU5ORUxTUlZfUkVBRFkpCiAKQEAgLTEzMiwyMiArMTEwLDYgQEAKIC8qIHRocm90dGxpbmcgaW52YWxpZCBib290IGNoYW5uZWwgc3RhdGV0cmFuc2l0aW9uIGVycm9yIGR1ZSB0byBidXN5IGNoYW5uZWwgKi8KICNkZWZpbmUgVUxUUkFfQ0xJRVJST1JCT09UX1RIUk9UVExFTVNHX0JVU1kgICAgICAgIDB4MDQKIAotLyogVmFsdWVzIGZvciBVTFRSQV9DSEFOTkVMX1BST1RPQ09MLkNsaUVycm9yT1M6ICovCi0vKiB0aHJvdHRsaW5nIGludmFsaWQgZ3Vlc3QgT1MgY2hhbm5lbCBzdGF0ZXRyYW5zaXRpb24gZXJyb3IgZHVlIHRvCi0gKiBjbGllbnQgZGlzYWJsZWQKLSAqLwotI2RlZmluZSBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX0RJU0FCTEVEICAgICAgMHgwMQotCi0vKiB0aHJvdHRsaW5nIGludmFsaWQgZ3Vlc3QgT1MgY2hhbm5lbCBzdGF0ZXRyYW5zaXRpb24gZXJyb3IgZHVlIHRvCi0gKiBjbGllbnQgbm90IGF0dGFjaGVkCi0gKi8KLSNkZWZpbmUgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19OT1RBVFRBQ0hFRCAgIDB4MDIKLQotLyogdGhyb3R0bGluZyBpbnZhbGlkIGd1ZXN0IE9TIGNoYW5uZWwgc3RhdGV0cmFuc2l0aW9uIGVycm9yIGR1ZSB0bwotICogYnVzeSBjaGFubmVsCi0gKi8KLSNkZWZpbmUgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19CVVNZICAgICAgICAgIDB4MDQKLQogLyogVmFsdWVzIGZvciBVTFRSQV9DSEFOTkVMX1BST1RPQ09MLkZlYXR1cmVzOiBUaGlzIGRlZmluZSBleGlzdHMgc28KICAqIHRoYXQgd2luZG93cyBndWVzdCBjYW4gbG9vayBhdCB0aGUgRmVhdHVyZUZsYWdzIGluIHRoZSBpbyBjaGFubmVsLAogICogYW5kIGNvbmZpZ3VyZSB0aGUgd2luZG93cyBkcml2ZXIgdG8gdXNlIGludGVycnVwdHMgb3Igbm90IGJhc2VkIG9uCkBAIC0zNDcsMTQ4ICszMDksNiBAQAogCXJldHVybiAxOwogfQogCi0vKiBHaXZlbiBhIGZpbGUgcGF0aG5hbWUgPHM+ICh3aXRoICcvJyBvciAnXCcgc2VwYXJhdGluZyBkaXJlY3Rvcnkgbm9kZXMpLAotICogcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBhIG5vZGUgd2l0aGluIHRoYXQgcGF0aG5hbWUgc3VjaAotICogdGhhdCB0aGUgbnVtYmVyIG9mIG5vZGVzIGZyb20gdGhhdCBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyBpcwotICogTk9UIG1vcmUgdGhhbiA8bj4uICBOb3RlIHRoYXQgaWYgdGhlIHBhdGhuYW1lIGhhcyBsZXNzIHRoYW4gPG4+IG5vZGVzCi0gKiBpbiBpdCwgdGhlIHJldHVybiBwb2ludGVyIHdpbGwgYmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLgotICovCi1zdGF0aWMgaW5saW5lIHU4ICoKLXBhdGhuYW1lX2xhc3Rfbl9ub2Rlcyh1OCAqcywgdW5zaWduZWQgaW50IG4pCi17Ci0JdTggKnAgPSBzOwotCXVuc2lnbmVkIGludCBub2RlX2NvdW50ID0gMDsKLQotCXdoaWxlICgqcCAhPSAnXDAnKSB7Ci0JCWlmICgoKnAgPT0gJy8nKSB8fCAoKnAgPT0gJ1xcJykpCi0JCQlub2RlX2NvdW50Kys7Ci0JCXArKzsKLQl9Ci0JaWYgKG5vZGVfY291bnQgPD0gbikKLQkJcmV0dXJuIHM7Ci0Jd2hpbGUgKG4gPiAwKSB7Ci0JCXAtLTsKLQkJaWYgKHAgPT0gcykKLQkJCWJyZWFrOwkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuLCB1bmxlc3Mgc29tZW9uZQotCQkJCSAqIGlzIGNoYW5naW5nIHRoZSBzdHJpbmcgd2hpbGUgd2UgYXJlCi0JCQkJICogbG9va2luZyBhdCBpdCEhCi0JCQkJICovCi0JCWlmICgoKnAgPT0gJy8nKSB8fCAoKnAgPT0gJ1xcJykpCi0JCQluLS07Ci0JfQotCXJldHVybiBwICsgMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLXNwYXJfY2hhbm5lbF9jbGllbnRfYWNxdWlyZV9vcyh2b2lkIF9faW9tZW0gKmNoLCB1OCAqaWQpCi17Ci0Jc3RydWN0IGNoYW5uZWxfaGVhZGVyIF9faW9tZW0gKmhkciA9IGNoOwotCi0JaWYgKHJlYWRsKCZoZHItPmNsaV9zdGF0ZV9vcykgPT0gQ0hBTk5FTENMSV9ESVNBQkxFRCkgewotCQlpZiAoKHJlYWRiKCZoZHItPmNsaV9lcnJvcl9vcykKLQkJICAgICAmIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfRElTQUJMRUQpID09IDApIHsKLQkJCS8qIHdlIGFyZSBOT1QgdGhyb3R0bGluZyB0aGlzIG1lc3NhZ2UgKi8KLQkJCXdyaXRlYihyZWFkYigmaGRyLT5jbGlfZXJyb3Jfb3MpIHwKLQkJCSAgICAgICBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX0RJU0FCTEVELAotCQkJICAgICAgICZoZHItPmNsaV9lcnJvcl9vcyk7Ci0JCQkvKiB0aHJvdHRsZSB1bnRpbCBhY3F1aXJlIHN1Y2Nlc3NmdWwgKi8KLQotCQkJcHJfaW5mbygiJXMgQ2hhbm5lbCBTdGF0ZVRyYW5zaXRpb24gSU5WQUxJRCEgLSBhY3F1aXJlIGZhaWxlZCBiZWNhdXNlIE9TIGNsaWVudCBESVNBQkxFRFxuIiwKLQkJCQlpZCk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCWlmICgocmVhZGwoJmhkci0+Y2xpX3N0YXRlX29zKSAhPSBDSEFOTkVMQ0xJX09XTkVEKSAmJgotCSAgICAocmVhZGwoJmhkci0+Y2xpX3N0YXRlX2Jvb3QpID09IENIQU5ORUxDTElfRElTQUJMRUQpKSB7Ci0JCS8qIE91ciBjb21wZXRpdG9yIGlzIERJU0FCTEVELCBzbyB3ZSBjYW4gdHJhbnNpdGlvbiB0byBPV05FRCAqLwotCQlwcl9pbmZvKCIlcyBDaGFubmVsIFN0YXRlVHJhbnNpdGlvbiAoJXMpICVzKCVkKS0tPiVzKCVkKVxuIiwKLQkJCWlkLCAiY2xpX3N0YXRlX29zIiwKLQkJCVVMVFJBX0NIQU5ORUxDTElfU1RSSU5HKHJlYWRsKCZoZHItPmNsaV9zdGF0ZV9vcykpLAotCQkJcmVhZGwoJmhkci0+Y2xpX3N0YXRlX29zKSwKLQkJCVVMVFJBX0NIQU5ORUxDTElfU1RSSU5HKENIQU5ORUxDTElfT1dORUQpLAotCQkJQ0hBTk5FTENMSV9PV05FRCk7Ci0JCXdyaXRlbChDSEFOTkVMQ0xJX09XTkVELCAmaGRyLT5jbGlfc3RhdGVfb3MpOwotCQltYigpOyAvKiByZXF1aXJlZCBmb3IgY2hhbm5lbCBzeW5jaCAqLwotCX0KLQlpZiAocmVhZGwoJmhkci0+Y2xpX3N0YXRlX29zKSA9PSBDSEFOTkVMQ0xJX09XTkVEKSB7Ci0JCWlmIChyZWFkYigmaGRyLT5jbGlfZXJyb3Jfb3MpKSB7Ci0JCQkvKiB3ZSBhcmUgaW4gYW4gZXJyb3IgbXNnIHRocm90dGxpbmcgc3RhdGU7Ci0JCQkgKiBjb21lIG91dCBvZiBpdAotCQkJICovCi0JCQlwcl9pbmZvKCIlcyBDaGFubmVsIE9TIGNsaWVudCBhY3F1aXJlIG5vdyBzdWNjZXNzZnVsXG4iLAotCQkJCWlkKTsKLQkJCXdyaXRlYigwLCAmaGRyLT5jbGlfZXJyb3Jfb3MpOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQotCS8qIFdlIGhhdmUgdG8gZG8gaXQgdGhlICJoYXJkIHdheSIuICBXZSB0cmFuc2l0aW9uIHRvIEJVU1ksCi0JICogYW5kIGNhbiB1c2UgdGhlIGNoYW5uZWwgaWZmIG91ciBjb21wZXRpdG9yIGhhcyBub3QgYWxzbwotCSAqIHRyYW5zaXRpb25lZCB0byBCVVNZLgotCSAqLwotCWlmIChyZWFkbCgmaGRyLT5jbGlfc3RhdGVfb3MpICE9IENIQU5ORUxDTElfQVRUQUNIRUQpIHsKLQkJaWYgKChyZWFkYigmaGRyLT5jbGlfZXJyb3Jfb3MpCi0JCSAgICAgJiBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX05PVEFUVEFDSEVEKSA9PSAwKSB7Ci0JCQkvKiB3ZSBhcmUgTk9UIHRocm90dGxpbmcgdGhpcyBtZXNzYWdlICovCi0JCQl3cml0ZWIocmVhZGIoJmhkci0+Y2xpX2Vycm9yX29zKSB8Ci0JCQkgICAgICAgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19OT1RBVFRBQ0hFRCwKLQkJCSAgICAgICAmaGRyLT5jbGlfZXJyb3Jfb3MpOwotCQkJLyogdGhyb3R0bGUgdW50aWwgYWNxdWlyZSBzdWNjZXNzZnVsICovCi0JCQlwcl9pbmZvKCIlcyBDaGFubmVsIFN0YXRlVHJhbnNpdGlvbiBJTlZBTElEISAtIGFjcXVpcmUgZmFpbGVkIGJlY2F1c2UgT1MgY2xpZW50IE5PVCBBVFRBQ0hFRCAoc3RhdGU9JXMoJWQpKVxuIiwKLQkJCQlpZCwgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcoCi0JCQkJCQlyZWFkbCgmaGRyLT5jbGlfc3RhdGVfb3MpKSwKLQkJCQlyZWFkbCgmaGRyLT5jbGlfc3RhdGVfb3MpKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0Jd3JpdGVsKENIQU5ORUxDTElfQlVTWSwgJmhkci0+Y2xpX3N0YXRlX29zKTsKLQltYigpOyAvKiByZXF1aXJlZCBmb3IgY2hhbm5lbCBzeW5jaCAqLwotCWlmIChyZWFkbCgmaGRyLT5jbGlfc3RhdGVfYm9vdCkgPT0gQ0hBTk5FTENMSV9CVVNZKSB7Ci0JCWlmICgocmVhZGIoJmhkci0+Y2xpX2Vycm9yX29zKQotCQkgICAgICYgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19CVVNZKSA9PSAwKSB7Ci0JCQkvKiB3ZSBhcmUgTk9UIHRocm90dGxpbmcgdGhpcyBtZXNzYWdlICovCi0JCQl3cml0ZWIocmVhZGIoJmhkci0+Y2xpX2Vycm9yX29zKSB8Ci0JCQkgICAgICAgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19CVVNZLAotCQkJICAgICAgICZoZHItPmNsaV9lcnJvcl9vcyk7Ci0JCQkvKiB0aHJvdHRsZSB1bnRpbCBhY3F1aXJlIHN1Y2Nlc3NmdWwgKi8KLQkJCXByX2luZm8oIiVzIENoYW5uZWwgU3RhdGVUcmFuc2l0aW9uIGZhaWxlZCAtIGhvc3QgT1MgYWNxdWlyZSBmYWlsZWQgYmVjYXVzZSBib290IEJVU1lcbiIsCi0JCQkJaWQpOwotCQl9Ci0JCS8qIHJlc2V0IGJ1c3kgKi8KLQkJd3JpdGVsKENIQU5ORUxDTElfQVRUQUNIRUQsICZoZHItPmNsaV9zdGF0ZV9vcyk7Ci0JCW1iKCk7IC8qIHJlcXVpcmVkIGZvciBjaGFubmVsIHN5bmNoICovCi0JCXJldHVybiAwOwotCX0KLQlpZiAocmVhZGIoJmhkci0+Y2xpX2Vycm9yX29zKSkgewotCQkvKiB3ZSBhcmUgaW4gYW4gZXJyb3IgbXNnIHRocm90dGxpbmcgc3RhdGU7IGNvbWUgb3V0IG9mIGl0ICovCi0JCXByX2luZm8oIiVzIENoYW5uZWwgT1MgY2xpZW50IGFjcXVpcmUgbm93IHN1Y2Nlc3NmdWxcbiIsIGlkKTsKLQkJd3JpdGViKDAsICZoZHItPmNsaV9lcnJvcl9vcyk7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXNwYXJfY2hhbm5lbF9jbGllbnRfcmVsZWFzZV9vcyh2b2lkIF9faW9tZW0gKmNoLCB1OCAqaWQpCi17Ci0Jc3RydWN0IGNoYW5uZWxfaGVhZGVyIF9faW9tZW0gKmhkciA9IGNoOwotCi0JaWYgKHJlYWRiKCZoZHItPmNsaV9lcnJvcl9vcykpIHsKLQkJLyogd2UgYXJlIGluIGFuIGVycm9yIG1zZyB0aHJvdHRsaW5nIHN0YXRlOyBjb21lIG91dCBvZiBpdCAqLwotCQlwcl9pbmZvKCIlcyBDaGFubmVsIE9TIGNsaWVudCBlcnJvciBzdGF0ZSBjbGVhcmVkXG4iLCBpZCk7Ci0JCXdyaXRlYigwLCAmaGRyLT5jbGlfZXJyb3Jfb3MpOwotCX0KLQlpZiAocmVhZGwoJmhkci0+Y2xpX3N0YXRlX29zKSA9PSBDSEFOTkVMQ0xJX09XTkVEKQotCQlyZXR1cm47Ci0JaWYgKHJlYWRsKCZoZHItPmNsaV9zdGF0ZV9vcykgIT0gQ0hBTk5FTENMSV9CVVNZKSB7Ci0JCXByX2luZm8oIiVzIENoYW5uZWwgU3RhdGVUcmFuc2l0aW9uIElOVkFMSUQhIC0gcmVsZWFzZSBmYWlsZWQgYmVjYXVzZSBPUyBjbGllbnQgTk9UIEJVU1kgKHN0YXRlPSVzKCVkKSlcbiIsCi0JCQlpZCwgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcoCi0JCQkJCXJlYWRsKCZoZHItPmNsaV9zdGF0ZV9vcykpLAotCQkJcmVhZGwoJmhkci0+Y2xpX3N0YXRlX29zKSk7Ci0JCS8qIHJldHVybjsgKi8KLQl9Ci0Jd3JpdGVsKENIQU5ORUxDTElfQVRUQUNIRUQsICZoZHItPmNsaV9zdGF0ZV9vcyk7IC8qIHJlbGVhc2UgYnVzeSAqLwotfQotCiAvKgogKiBSb3V0aW5lIERlc2NyaXB0aW9uOgogKiBUcmllcyB0byBpbnNlcnQgdGhlIHByZWJ1aWx0IHNpZ25hbCBwb2ludGVkIHRvIGJ5IHBTaWduYWwgaW50byB0aGUgbnRoCkBAIC01NjksNCArMzg5LDQ1IEBACiB1bnNpZ25lZCBjaGFyIHNwYXJfc2lnbmFscXVldWVfZW1wdHkoc3RydWN0IGNoYW5uZWxfaGVhZGVyIF9faW9tZW0gKmNoLAogCQkJCSAgICAgdTMyIHF1ZXVlKTsKIAorLyoKKyAqIENIQU5ORUwgR3VpZHMKKyAqLworCisvKiB7NDE0ODE1ZWQtYzU4Yy0xMWRhLTk1YTktMDBlMDgxNjExNjVmfSAqLworI2RlZmluZSBTUEFSX1ZIQkFfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEIFwKKwkJVVVJRF9MRSgweDQxNDgxNWVkLCAweGM1OGMsIDB4MTFkYSwgXAorCQkJCTB4OTUsIDB4YTksIDB4MCwgMHhlMCwgMHg4MSwgMHg2MSwgMHgxNiwgMHg1ZikKK3N0YXRpYyBjb25zdCB1dWlkX2xlIHNwYXJfdmhiYV9jaGFubmVsX3Byb3RvY29sX3V1aWQgPQorCVNQQVJfVkhCQV9DSEFOTkVMX1BST1RPQ09MX1VVSUQ7CisjZGVmaW5lIFNQQVJfVkhCQV9DSEFOTkVMX1BST1RPQ09MX1VVSURfU1RSIFwKKwkiNDE0ODE1ZWQtYzU4Yy0xMWRhLTk1YTktMDBlMDgxNjExNjVmIgorCisvKiB7OGNkNTk5NGQtYzU4ZS0xMWRhLTk1YTktMDBlMDgxNjExNjVmfSAqLworI2RlZmluZSBTUEFSX1ZOSUNfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEIFwKKwkJVVVJRF9MRSgweDhjZDU5OTRkLCAweGM1OGUsIDB4MTFkYSwgXAorCQkJCTB4OTUsIDB4YTksIDB4MCwgMHhlMCwgMHg4MSwgMHg2MSwgMHgxNiwgMHg1ZikKK3N0YXRpYyBjb25zdCB1dWlkX2xlIHNwYXJfdm5pY19jaGFubmVsX3Byb3RvY29sX3V1aWQgPQorCVNQQVJfVk5JQ19DSEFOTkVMX1BST1RPQ09MX1VVSUQ7CisjZGVmaW5lIFNQQVJfVk5JQ19DSEFOTkVMX1BST1RPQ09MX1VVSURfU1RSIFwKKwkiOGNkNTk5NGQtYzU4ZS0xMWRhLTk1YTktMDBlMDgxNjExNjVmIgorCisvKiB7NzIxMjAwMDgtNEFBQi0xMURDLTg1MzAtNDQ0NTUzNTQ0MjAwfSAqLworI2RlZmluZSBTUEFSX1NJT1ZNX1VVSUQgXAorCQlVVUlEX0xFKDB4NzIxMjAwMDgsIDB4NEFBQiwgMHgxMURDLCBcCisJCQkJMHg4NSwgMHgzMCwgMHg0NCwgMHg0NSwgMHg1MywgMHg1NCwgMHg0MiwgMHgwMCkKK3N0YXRpYyBjb25zdCB1dWlkX2xlIHNwYXJfc2lvdm1fdXVpZCA9IFNQQVJfU0lPVk1fVVVJRDsKKworLyogezViNTJjNWFjLWU1ZjUtNGQ0Mi04ZGZmLTQyOWVhZWNkMjIxZn0gKi8KKyNkZWZpbmUgU1BBUl9DT05UUk9MRElSRUNUT1JfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEICBcCisJCVVVSURfTEUoMHg1YjUyYzVhYywgMHhlNWY1LCAweDRkNDIsIFwKKwkJCQkweDhkLCAweGZmLCAweDQyLCAweDllLCAweGFlLCAweGNkLCAweDIyLCAweDFmKQorCitzdGF0aWMgY29uc3QgdXVpZF9sZSBzcGFyX2NvbnRyb2xkaXJlY3Rvcl9jaGFubmVsX3Byb3RvY29sX3V1aWQgPQorCVNQQVJfQ09OVFJPTERJUkVDVE9SX0NIQU5ORUxfUFJPVE9DT0xfVVVJRDsKKworLyoge2I0ZTc5NjI1LWFlZGUtNGVBQS05ZTExLUQzZWRkY2Q0NTA0Y30gKi8KKyNkZWZpbmUgU1BBUl9ESUFHX1BPT0xfQ0hBTk5FTF9QUk9UT0NPTF9VVUlECQkJCVwKKwkJVVVJRF9MRSgweGI0ZTc5NjI1LCAweGFlZGUsIDB4NGVhYSwgXAorCQkJCTB4OWUsIDB4MTEsIDB4ZDMsIDB4ZWQsIDB4ZGMsIDB4ZDQsIDB4NTAsIDB4NGMpCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2NoYW5uZWxfZ3VpZC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2NoYW5uZWxfZ3VpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2NiNDk5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9jaGFubmVsX2d1aWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqLwotCi0vKgotICogQ0hBTk5FTCBHdWlkcwotICovCi0KLS8qIHs0MTQ4MTVlZC1jNThjLTExZGEtOTVhOS0wMGUwODE2MTE2NWZ9ICovCi0jZGVmaW5lIFNQQVJfVkhCQV9DSEFOTkVMX1BST1RPQ09MX1VVSUQgXAotCQlVVUlEX0xFKDB4NDE0ODE1ZWQsIDB4YzU4YywgMHgxMWRhLCBcCi0JCQkJMHg5NSwgMHhhOSwgMHgwLCAweGUwLCAweDgxLCAweDYxLCAweDE2LCAweDVmKQotc3RhdGljIGNvbnN0IHV1aWRfbGUgc3Bhcl92aGJhX2NoYW5uZWxfcHJvdG9jb2xfdXVpZCA9Ci0JU1BBUl9WSEJBX0NIQU5ORUxfUFJPVE9DT0xfVVVJRDsKLSNkZWZpbmUgU1BBUl9WSEJBX0NIQU5ORUxfUFJPVE9DT0xfVVVJRF9TVFIgXAotCSI0MTQ4MTVlZC1jNThjLTExZGEtOTVhOS0wMGUwODE2MTE2NWYiCi0KLS8qIHs4Y2Q1OTk0ZC1jNThlLTExZGEtOTVhOS0wMGUwODE2MTE2NWZ9ICovCi0jZGVmaW5lIFNQQVJfVk5JQ19DSEFOTkVMX1BST1RPQ09MX1VVSUQgXAotCQlVVUlEX0xFKDB4OGNkNTk5NGQsIDB4YzU4ZSwgMHgxMWRhLCBcCi0JCQkJMHg5NSwgMHhhOSwgMHgwLCAweGUwLCAweDgxLCAweDYxLCAweDE2LCAweDVmKQotc3RhdGljIGNvbnN0IHV1aWRfbGUgc3Bhcl92bmljX2NoYW5uZWxfcHJvdG9jb2xfdXVpZCA9Ci0JU1BBUl9WTklDX0NIQU5ORUxfUFJPVE9DT0xfVVVJRDsKLSNkZWZpbmUgU1BBUl9WTklDX0NIQU5ORUxfUFJPVE9DT0xfVVVJRF9TVFIgXAotCSI4Y2Q1OTk0ZC1jNThlLTExZGEtOTVhOS0wMGUwODE2MTE2NWYiCi0KLS8qIHs3MjEyMDAwOC00QUFCLTExREMtODUzMC00NDQ1NTM1NDQyMDB9ICovCi0jZGVmaW5lIFNQQVJfU0lPVk1fVVVJRCBcCi0JCVVVSURfTEUoMHg3MjEyMDAwOCwgMHg0QUFCLCAweDExREMsIFwKLQkJCQkweDg1LCAweDMwLCAweDQ0LCAweDQ1LCAweDUzLCAweDU0LCAweDQyLCAweDAwKQotc3RhdGljIGNvbnN0IHV1aWRfbGUgc3Bhcl9zaW92bV91dWlkID0gU1BBUl9TSU9WTV9VVUlEOwotCi0vKiB7NWI1MmM1YWMtZTVmNS00ZDQyLThkZmYtNDI5ZWFlY2QyMjFmfSAqLwotI2RlZmluZSBTUEFSX0NPTlRST0xESVJFQ1RPUl9DSEFOTkVMX1BST1RPQ09MX1VVSUQgIFwKLQkJVVVJRF9MRSgweDViNTJjNWFjLCAweGU1ZjUsIDB4NGQ0MiwgXAotCQkJCTB4OGQsIDB4ZmYsIDB4NDIsIDB4OWUsIDB4YWUsIDB4Y2QsIDB4MjIsIDB4MWYpCi0KLXN0YXRpYyBjb25zdCB1dWlkX2xlIHNwYXJfY29udHJvbGRpcmVjdG9yX2NoYW5uZWxfcHJvdG9jb2xfdXVpZCA9Ci0JU1BBUl9DT05UUk9MRElSRUNUT1JfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEOwotCi0vKiB7YjRlNzk2MjUtYWVkZS00ZUFBLTllMTEtRDNlZGRjZDQ1MDRjfSAqLwotI2RlZmluZSBTUEFSX0RJQUdfUE9PTF9DSEFOTkVMX1BST1RPQ09MX1VVSUQJCQkJXAotCQlVVUlEX0xFKDB4YjRlNzk2MjUsIDB4YWVkZSwgMHg0ZWFhLCBcCi0JCQkJMHg5ZSwgMHgxMSwgMHhkMywgMHhlZCwgMHhkYywgMHhkNCwgMHg1MCwgMHg0YykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9kaWFnY2hhbm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2RpYWdjaGFubmVsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlODEzYzcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2RpYWdjaGFubmVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfRElBR19DSEFOTkVMX0hfCi0jZGVmaW5lIF9ESUFHX0NIQU5ORUxfSF8KLQotLyogTGV2ZWxzIG9mIHNldmVyaXR5IGZvciBkaWFnbm9zdGljIGV2ZW50cywgaW4gb3JkZXIgZnJvbSBsb3dlc3Qgc2V2ZXJpdHkgdG8KLSAqIGhpZ2hlc3QgKGkuZS4gZmF0YWwgZXJyb3JzIGFyZSB0aGUgbW9zdCBzZXZlcmUsIGFuZCBzaG91bGQgYWx3YXlzIGJlIGxvZ2dlZCwKLSAqIGJ1dCBpbmZvIGV2ZW50cyByYXJlbHkgbmVlZCB0byBiZSBsb2dnZWQgZXhjZXB0IGR1cmluZyBkZWJ1Z2dpbmcpLiBUaGUKLSAqIHZhbHVlcyBESUFHX1NFVkVSSVRZX0VOVU1fQkVHSU4gYW5kIERJQUdfU0VWRVJJVFlfRU5VTV9FTkQgYXJlIG5vdCB2YWxpZAotICogc2V2ZXJpdHkgdmFsdWVzLiAgVGhleSBleGlzdCBtZXJlbHkgdG8gZGlsaW5lYXRlIHRoZSBsaXN0LCBzbyB0aGF0IGZ1dHVyZQotICogYWRkaXRpb25zIHdvbid0IHJlcXVpcmUgY2hhbmdlcyB0byB0aGUgZHJpdmVyIChpLmUuIHdoZW4gY2hlY2tpbmcgZm9yCi0gKiBvdXQtb2YtcmFuZ2Ugc2V2ZXJpdGllcyBpbiBTZXRTZXZlcml0eSkuIFRoZSB2YWx1ZXMgRElBR19TRVZFUklUWV9PVkVSUklERQotICogYW5kIERJQUdfU0VWRVJJVFlfU0hVVE9GRiBhcmUgbm90IHZhbGlkIHNldmVyaXR5IHZhbHVlcyBmb3IgbG9nZ2luZyBldmVudHMKLSAqIGJ1dCB0aGV5IGFyZSB2YWxpZCBmb3IgY29udHJvbGxpbmcgdGhlIGFtb3VudCBvZiBldmVudCBkYXRhLiBDaGFuZ2VzIG1hZGUKLSAqIHRvIHRoZSBlbnVtLCBuZWVkIHRvIGJlIHJlZmxlY3RlZCBpbiBzLVBhci4KLSAqLwotZW51bSBkaWFnX3NldmVyaXR5IHsKLQkJRElBR19TRVZFUklUWV9WRVJCT1NFID0gMCwKLQkJRElBR19TRVZFUklUWV9JTkZPID0gMSwKLQkJRElBR19TRVZFUklUWV9XQVJOSU5HID0gMiwKLQkJRElBR19TRVZFUklUWV9FUlIgPSAzLAotCQlESUFHX1NFVkVSSVRZX1BSSU5UID0gNCwKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2d1ZXN0bGludXhkZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2d1ZXN0bGludXhkZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODEyODdmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9ndWVzdGxpbnV4ZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX0dVRVNUTElOVVhERUJVR19IX18KLSNkZWZpbmUgX19HVUVTVExJTlVYREVCVUdfSF9fCi0KLS8qCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgc3VwcG9ydGluZyBpbnRlcmZhY2UgZm9yICJ2bWNhbGxpbnRlcmZhY2UuaCIsIHBhcnRpY3VsYXJseQotICogcmVnYXJkaW5nIGFkZGluZyBhZGRpdGlvbmFsIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25hbGl0eSB0byBsaW51eAotICogSVNTVUVfSU9fVk1DQUxMX1BPU1RDT0RFX1NFVkVSSVRZCi0gKi8KLQotLyoqKioqKiogSU5GTyBPTiBJU1NVRV9QT1NUQ09ERV9MSU5VWCgpIEJFTE9XICoqKioqKiovCi1lbnVtIGRyaXZlcl9wYyB7CQkvKiBQT1NUQ09ERSBkcml2ZXIgaWRlbnRpZmllciB0dXBsZXMgKi8KLQkvKiB2aXNvcmNoaXBzZXQgZHJpdmVyIGZpbGVzICovCi0JVklTT1JfQ0hJUFNFVF9QQyA9IDB4QTAsCi0JVklTT1JfQ0hJUFNFVF9QQ19jb250cm9sdm1fYyA9IDB4QTEsCi0JVklTT1JfQ0hJUFNFVF9QQ19jb250cm9sdm1fY20yID0gMHhBMiwKLQlWSVNPUl9DSElQU0VUX1BDX2NvbnRyb2x2bV9kaXJlY3RfYyA9IDB4QTMsCi0JVklTT1JfQ0hJUFNFVF9QQ19maWxlX2MgPSAweEE0LAotCVZJU09SX0NISVBTRVRfUENfcGFyc2VyX2MgPSAweEE1LAotCVZJU09SX0NISVBTRVRfUENfdGVzdGluZ19jID0gMHhBNiwKLQlWSVNPUl9DSElQU0VUX1BDX3Zpc29yY2hpcHNldF9tYWluX2MgPSAweEE3LAotCVZJU09SX0NISVBTRVRfUENfdmlzb3Jzd2l0Y2hidXNfYyA9IDB4QTgsCi0JLyogdmlzb3JidXMgZHJpdmVyIGZpbGVzICovCi0JVklTT1JfQlVTX1BDID0gMHhCMCwKLQlWSVNPUl9CVVNfUENfYnVzaW5zdF9hdHRyX2MgPSAweEIxLAotCVZJU09SX0JVU19QQ19jaGFubmVsX2F0dHJfYyA9IDB4QjIsCi0JVklTT1JfQlVTX1BDX2Rldm1ham9ybWlub3JfYXR0cl9jID0gMHhCMywKLQlWSVNPUl9CVVNfUENfdmlzb3JidXNfbWFpbl9jID0gMHhCNCwKLQkvKiB2aXNvcmNsaWVudGJ1cyBkcml2ZXIgZmlsZXMgKi8KLQlWSVNPUl9DTElFTlRfQlVTX1BDID0gMHhDMCwKLQlWSVNPUl9DTElFTlRfQlVTX1BDX3Zpc29yY2xpZW50YnVzX21haW5fYyA9IDB4QzEsCi0JLyogdmlydCBoYmEgZHJpdmVyIGZpbGVzICovCi0JVklSVF9IQkFfUEMgPSAweEMyLAotCVZJUlRfSEJBX1BDX3ZpcnRoYmFfYyA9IDB4QzMsCi0JLyogdmlydHBjaSBkcml2ZXIgZmlsZXMgKi8KLQlWSVJUX1BDSV9QQyA9IDB4QzQsCi0JVklSVF9QQ0lfUENfdmlydHBjaV9jID0gMHhDNSwKLQkvKiB2aXJ0bmljIGRyaXZlciBmaWxlcyAqLwotCVZJUlRfTklDX1BDID0gMHhDNiwKLQlWSVJUX05JQ19QX3ZpcnRuaWNfYyA9IDB4QzcsCi0JLyogdWlzbGliIGRyaXZlciBmaWxlcyAqLwotCVVJU0xJQl9QQyA9IDB4RDAsCi0JVUlTTElCX1BDX3Vpc2xpYl9jID0gMHhEMSwKLQlVSVNMSUJfUENfdWlzcXVldWVfYyA9IDB4RDIsCi0JVUlTTElCX1BDX3Vpc3RocmVhZF9jID0gMHhEMywKLQlVSVNMSUJfUENfdWlzdXRpbHNfYyA9IDB4RDQsCi19OwotCi1lbnVtIGV2ZW50X3BjIHsJCQkvKiBQT1NUQ09ERSBldmVudCBpZGVudGlmaWVyIHR1cGxlcyAqLwotCUFUVEFDSF9QT1JUX0VOVFJZX1BDID0gMHgwMDEsCi0JQVRUQUNIX1BPUlRfRkFJTFVSRV9QQyA9IDB4MDAyLAotCUFUVEFDSF9QT1JUX1NVQ0NFU1NfUEMgPSAweDAwMywKLQlCVVNfRkFJTFVSRV9QQyA9IDB4MDA0LAotCUJVU19DUkVBVEVfRU5UUllfUEMgPSAweDAwNSwKLQlCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMgPSAweDAwNiwKLQlCVVNfQ1JFQVRFX0VYSVRfUEMgPSAweDAwNywKLQlCVVNfQ09ORklHVVJFX0VOVFJZX1BDID0gMHgwMDgsCi0JQlVTX0NPTkZJR1VSRV9GQUlMVVJFX1BDID0gMHgwMDksCi0JQlVTX0NPTkZJR1VSRV9FWElUX1BDID0gMHgwMEEsCi0JQ0hJUFNFVF9JTklUX0VOVFJZX1BDID0gMHgwMEIsCi0JQ0hJUFNFVF9JTklUX1NVQ0NFU1NfUEMgPSAweDAwQywKLQlDSElQU0VUX0lOSVRfRkFJTFVSRV9QQyA9IDB4MDBELAotCUNISVBTRVRfSU5JVF9FWElUX1BDID0gMHgwMEUsCi0JQ1JFQVRFX1dPUktRVUVVRV9QQyA9IDB4MDBGLAotCUNSRUFURV9XT1JLUVVFVUVfRkFJTEVEX1BDID0gMHgwQTAsCi0JQ09OVFJPTFZNX0lOSVRfRkFJTFVSRV9QQyA9IDB4MEExLAotCURFVklDRV9DUkVBVEVfRU5UUllfUEMgPSAweDBBMiwKLQlERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMgPSAweDBBMywKLQlERVZJQ0VfQ1JFQVRFX1NVQ0NFU1NfUEMgPSAweDBBNCwKLQlERVZJQ0VfQ1JFQVRFX0VYSVRfUEMgPSAweDBBNSwKLQlERVZJQ0VfQUREX1BDID0gMHgwQTYsCi0JREVWSUNFX1JFR0lTVEVSX0ZBSUxVUkVfUEMgPSAweDBBNywKLQlERVZJQ0VfQ0hBTkdFU1RBVEVfRU5UUllfUEMgPSAweDBBOCwKLQlERVZJQ0VfQ0hBTkdFU1RBVEVfRkFJTFVSRV9QQyA9IDB4MEE5LAotCURFVklDRV9DSEFOR0VTVEFURV9FWElUX1BDID0gMHgwQUEsCi0JRFJJVkVSX0VOVFJZX1BDID0gMHgwQUIsCi0JRFJJVkVSX0VYSVRfUEMgPSAweDBBQywKLQlNQUxMT0NfRkFJTFVSRV9QQyA9IDB4MEFELAotCVFVRVVFX0RFTEFZRURfV09SS19QQyA9IDB4MEFFLAotCVVJU0xJQl9USFJFQURfRkFJTFVSRV9QQyA9IDB4MEI3LAotCVZCVVNfQ0hBTk5FTF9FTlRSWV9QQyA9IDB4MEI4LAotCVZCVVNfQ0hBTk5FTF9GQUlMVVJFX1BDID0gMHgwQjksCi0JVkJVU19DSEFOTkVMX0VYSVRfUEMgPSAweDBCQSwKLQlWSEJBX0NSRUFURV9FTlRSWV9QQyA9IDB4MEJCLAotCVZIQkFfQ1JFQVRFX0ZBSUxVUkVfUEMgPSAweDBCQywKLQlWSEJBX0NSRUFURV9FWElUX1BDID0gMHgwQkQsCi0JVkhCQV9DUkVBVEVfU1VDQ0VTU19QQyA9IDB4MEJFLAotCVZIQkFfQ09NTUFORF9IQU5ETEVSX1BDID0gMHgwQkYsCi0JVkhCQV9QUk9CRV9FTlRSWV9QQyA9IDB4MEMwLAotCVZIQkFfUFJPQkVfRkFJTFVSRV9QQyA9IDB4MEMxLAotCVZIQkFfUFJPQkVfRVhJVF9QQyA9IDB4MEMyLAotCVZOSUNfQ1JFQVRFX0VOVFJZX1BDID0gMHgwQzMsCi0JVk5JQ19DUkVBVEVfRkFJTFVSRV9QQyA9IDB4MEM0LAotCVZOSUNfQ1JFQVRFX1NVQ0NFU1NfUEMgPSAweDBDNSwKLQlWTklDX1BST0JFX0VOVFJZX1BDID0gMHgwQzYsCi0JVk5JQ19QUk9CRV9GQUlMVVJFX1BDID0gMHgwQzcsCi0JVk5JQ19QUk9CRV9FWElUX1BDID0gMHgwQzgsCi0JVlBDSV9DUkVBVEVfRU5UUllfUEMgPSAweDBDOSwKLQlWUENJX0NSRUFURV9GQUlMVVJFX1BDID0gMHgwQ0EsCi0JVlBDSV9DUkVBVEVfRVhJVF9QQyA9IDB4MENCLAotCVZQQ0lfUFJPQkVfRU5UUllfUEMgPSAweDBDQywKLQlWUENJX1BST0JFX0ZBSUxVUkVfUEMgPSAweDBDRCwKLQlWUENJX1BST0JFX0VYSVRfUEMgPSAweDBDRSwKLQlDUkFTSF9ERVZfRU5UUllfUEMgPSAweDBDRiwKLQlDUkFTSF9ERVZfRVhJVF9QQyA9IDB4MEQwLAotCUNSQVNIX0RFVl9IQUREUl9OVUxMID0gMHgwRDEsCi0JQ1JBU0hfREVWX0NPTlRST0xWTV9OVUxMID0gMHgwRDIsCi0JQ1JBU0hfREVWX1JEX0JVU19GQUlVTFJFX1BDID0gMHgwRDMsCi0JQ1JBU0hfREVWX1JEX0RFVl9GQUlVTFJFX1BDID0gMHgwRDQsCi0JQ1JBU0hfREVWX0JVU19OVUxMX0ZBSUxVUkVfUEMgPSAweDBENSwKLQlDUkFTSF9ERVZfREVWX05VTExfRkFJTFVSRV9QQyA9IDB4MEQ2LAotCUNSQVNIX0RFVl9DVFJMX1JEX0ZBSUxVUkVfUEMgPSAweDBENywKLQlDUkFTSF9ERVZfQ09VTlRfRkFJTFVSRV9QQyA9IDB4MEQ4LAotCVNBVkVfTVNHX0JVU19GQUlMVVJFX1BDID0gMHgwRDksCi0JU0FWRV9NU0dfREVWX0ZBSUxVUkVfUEMgPSAweDBEQSwKLQlDQUxMSE9NRV9JTklUX0ZBSUxVUkVfUEMgPSAweDBEQgotfTsKLQotI2lmZGVmIF9fR05VQ19fCi0KLSNkZWZpbmUgUE9TVENPREVfU0VWRVJJVFlfRVJSIERJQUdfU0VWRVJJVFlfRVJSCi0jZGVmaW5lIFBPU1RDT0RFX1NFVkVSSVRZX1dBUk5JTkcgRElBR19TRVZFUklUWV9XQVJOSU5HCi0vKiBUT0RPLT4gSW5mbyBjdXJyZW50bHkgZG9lc24ndCBzaG93LCBzbyB3ZSBzZXQgaW5mbz13YXJuaW5nICovCi0jZGVmaW5lIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8gRElBR19TRVZFUklUWV9QUklOVAotCi0vKiBleGFtcGxlIGNhbGwgb2YgUE9TVENPREVfTElOVVhfMihWSVNPUl9DSElQU0VUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwotICogUGxlYXNlIGFsc28gbm90ZSB0aGF0IHRoZSByZXN1bHRpbmcgcG9zdGNvZGUgaXMgaW4gaGV4LCBzbyBpZiB5b3UgYXJlCi0gKiBzZWFyY2hpbmcgZm9yIHRoZSBfX0xJTkVfXyBudW1iZXIsIGNvbnZlcnQgaXQgZmlyc3QgdG8gZGVjaW1hbC4gIFRoZSBsaW5lCi0gKiBudW1iZXIgY29tYmluZWQgd2l0aCBkcml2ZXIgYW5kIHR5cGUgb2YgY2FsbCwgd2lsbCBhbGxvdyB5b3UgdG8gdHJhY2sgZG93bgotICogZXhhY3RseSB3aGF0IGxpbmUgYW4gZXJyb3Igb2NjdXJyZWQgb24sIG9yIHdoZXJlIHRoZSBsYXN0IGRyaXZlcgotICogZW50ZXJlZC9leGl0ZWQgZnJvbS4KLSAqLwotCi0vKiBCQVNFIEZVTkNUSU9OUyAqLwotI2RlZmluZSBQT1NUQ09ERV9MSU5VWF9BKERSSVZFUl9QQywgRVZFTlRfUEMsIHBjMzJiaXQsIHNldmVyaXR5KQlcCi1kbyB7CQkJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgbG9uZyBwb3N0X2NvZGVfdGVtcDsJCQkJXAotCXBvc3RfY29kZV90ZW1wID0gKCgodTY0KURSSVZFUl9QQykgPDwgNTYpIHwgKCgodTY0KUVWRU5UX1BDKSA8PCA0NCkgfCBcCi0JCSgoKCh1NjQpX19MSU5FX18pICYgMHhGRkYpIDw8IDMyKSB8CQkJXAotCQkoKCh1NjQpcGMzMmJpdCkgJiAweEZGRkZGRkZGKTsJCQkJXAotCUlTU1VFX0lPX1ZNQ0FMTF9QT1NUQ09ERV9TRVZFUklUWShwb3N0X2NvZGVfdGVtcCwgc2V2ZXJpdHkpOwlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFBPU1RDT0RFX0xJTlVYX0IoRFJJVkVSX1BDLCBFVkVOVF9QQywgcGMxNmJpdDEsIHBjMTZiaXQyLCBzZXZlcml0eSkgXAotZG8gewkJCQkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIGxvbmcgcG9zdF9jb2RlX3RlbXA7CQkJCVwKLQlwb3N0X2NvZGVfdGVtcCA9ICgoKHU2NClEUklWRVJfUEMpIDw8IDU2KSB8ICgoKHU2NClFVkVOVF9QQykgPDwgNDQpIHwgXAotCQkoKCgodTY0KV9fTElORV9fKSAmIDB4RkZGKSA8PCAzMikgfAkJCVwKLQkJKCgoKHU2NClwYzE2Yml0MSkgJiAweEZGRkYpIDw8IDE2KSB8CQkJXAotCQkoKCh1NjQpcGMxNmJpdDIpICYgMHhGRkZGKTsJCQkJXAotCUlTU1VFX0lPX1ZNQ0FMTF9QT1NUQ09ERV9TRVZFUklUWShwb3N0X2NvZGVfdGVtcCwgc2V2ZXJpdHkpOwlcCi19IHdoaWxlICgwKQotCi0vKiBNT1NUIENPTU1PTiAqLwotI2RlZmluZSBQT1NUQ09ERV9MSU5VWF8yKEVWRU5UX1BDLCBzZXZlcml0eSkJCQkJXAotCVBPU1RDT0RFX0xJTlVYX0EoQ1VSUkVOVF9GSUxFX1BDLCBFVkVOVF9QQywgMHgwMDAwLCBzZXZlcml0eSkKLQotI2RlZmluZSBQT1NUQ09ERV9MSU5VWF8zKEVWRU5UX1BDLCBwYzMyYml0LCBzZXZlcml0eSkJCQlcCi0JUE9TVENPREVfTElOVVhfQShDVVJSRU5UX0ZJTEVfUEMsIEVWRU5UX1BDLCBwYzMyYml0LCBzZXZlcml0eSkKLQotI2RlZmluZSBQT1NUQ09ERV9MSU5VWF80KEVWRU5UX1BDLCBwYzE2Yml0MSwgcGMxNmJpdDIsIHNldmVyaXR5KQlcCi0JUE9TVENPREVfTElOVVhfQihDVVJSRU5UX0ZJTEVfUEMsIEVWRU5UX1BDLCBwYzE2Yml0MSwJCVwKLQkJCSBwYzE2Yml0Miwgc2V2ZXJpdHkpCi0KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvaW9jaGFubmVsLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvaW9jaGFubmVsLmgKaW5kZXggNWNjZjgxNC4uY2JhNDQzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2lvY2hhbm5lbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9pb2NoYW5uZWwuaApAQCAtMzMsNyArMzMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvZG1hLWRpcmVjdGlvbi5oPgogI2luY2x1ZGUgImNoYW5uZWwuaCIKLSNpbmNsdWRlICJjaGFubmVsX2d1aWQuaCIKIAogI2RlZmluZSBVTFRSQV9WSEJBX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFIFVMVFJBX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFCiAjZGVmaW5lIFVMVFJBX1ZOSUNfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUgVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9wZXJpb2RpY193b3JrLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvcGVyaW9kaWNfd29yay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjMzMzVhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9wZXJpb2RpY193b3JrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiBwZXJpb2RpY193b3JrLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX1BFUklPRElDX1dPUktfSF9fCi0jZGVmaW5lIF9fUEVSSU9ESUNfV09SS19IX18KLQotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0vKiBQRVJJT0RJQ19XT1JLIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUgdG8gdXNlcnMuCi0gKiBGaWVsZHMgYXJlIGRlY2xhcmVkIG9ubHkgaW4gdGhlIGltcGxlbWVudGF0aW9uIC5jIGZpbGVzLgotICovCi1zdHJ1Y3QgcGVyaW9kaWNfd29yazsKLQotc3RydWN0IHBlcmlvZGljX3dvcmsgKgotdmlzb3JfcGVyaW9kaWNfd29ya19jcmVhdGUodWxvbmcgamlmZnlfaW50ZXJ2YWwsCi0JCQkgICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlLAotCQkJICAgdm9pZCAoKndvcmtmdW5jKSh2b2lkICopLAotCQkJICAgdm9pZCAqd29ya2Z1bmNhcmcsCi0JCQkgICBjb25zdCBjaGFyICpkZXZuYW0pOwotdm9pZCB2aXNvcl9wZXJpb2RpY193b3JrX2Rlc3Ryb3koc3RydWN0IHBlcmlvZGljX3dvcmsgKnB3KTsKLWJvb2wgdmlzb3JfcGVyaW9kaWNfd29ya19uZXh0cGVyaW9kKHN0cnVjdCBwZXJpb2RpY193b3JrICpwdyk7Ci1ib29sIHZpc29yX3BlcmlvZGljX3dvcmtfc3RhcnQoc3RydWN0IHBlcmlvZGljX3dvcmsgKnB3KTsKLWJvb2wgdmlzb3JfcGVyaW9kaWNfd29ya19zdG9wKHN0cnVjdCBwZXJpb2RpY193b3JrICpwdyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3ZidXNoZWxwZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS92YnVzaGVscGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYjZhYWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3ZidXNoZWxwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIHZidXNoZWxwZXIuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fVkJVU0hFTFBFUl9IX18KLSNkZWZpbmUgX19WQlVTSEVMUEVSX0hfXwotCi0vKiBUQVJHRVRfSE9TVE5BTUUgc3BlY2lmaWVkIGFzIC1EVEFSR0VUX0hPU1ROQU1FPVwidGhlbmFtZVwiIG9uIHRoZQotICogY29tbWFuZCBsaW5lCi0gKi8KLQotI2RlZmluZSBUQVJHRVRfSE9TVE5BTUUgImxpbnV4Z3Vlc3QiCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBidXNfZGV2aWNlX2luZm9faW5pdCgKLQkJc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyAqYnVzX2RldmljZV9pbmZvX3B0ciwKLQkJY29uc3QgY2hhciAqZGV2X3R5cGUsIGNvbnN0IGNoYXIgKmRydl9uYW1lLAotCQljb25zdCBjaGFyICp2ZXIsIGNvbnN0IGNoYXIgKnZlcl90YWcpCi17Ci0JbWVtc2V0KGJ1c19kZXZpY2VfaW5mb19wdHIsIDAsIHNpemVvZihzdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvKSk7Ci0Jc25wcmludGYoYnVzX2RldmljZV9pbmZvX3B0ci0+ZGV2dHlwZSwKLQkJIHNpemVvZihidXNfZGV2aWNlX2luZm9fcHRyLT5kZXZ0eXBlKSwKLQkJICIlcyIsIChkZXZfdHlwZSkgPyBkZXZfdHlwZSA6ICJ1bmtub3duVHlwZSIpOwotCXNucHJpbnRmKGJ1c19kZXZpY2VfaW5mb19wdHItPmRydm5hbWUsCi0JCSBzaXplb2YoYnVzX2RldmljZV9pbmZvX3B0ci0+ZHJ2bmFtZSksCi0JCSAiJXMiLCAoZHJ2X25hbWUpID8gZHJ2X25hbWUgOiAidW5rbm93bkRyaXZlciIpOwotCXNucHJpbnRmKGJ1c19kZXZpY2VfaW5mb19wdHItPmluZm9zdHJzLAotCQkgc2l6ZW9mKGJ1c19kZXZpY2VfaW5mb19wdHItPmluZm9zdHJzKSwgIiVzXHQlc1x0JXMiLAotCQkgKHZlcikgPyB2ZXIgOiAidW5rbm93blZlciIsCi0JCSAodmVyX3RhZykgPyB2ZXJfdGFnIDogInVua25vd25WZXJUYWciLAotCQkgVEFSR0VUX0hPU1ROQU1FKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdmVyc2lvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3ZlcnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNkMWRhNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICovCi0KLS8qIHZlcnNpb24uaCAqLwotCi0vKiAgQ29tbW9uIHZlcnNpb24vcmVsZWFzZSBpbmZvIG5lZWRlZCBieSBhbGwgY29tcG9uZW50cyBnb2VzIGhlcmUuCi0gKiAgKFRoaXMgZmlsZSBtdXN0IGNvbXBpbGUgY2xlYW5seSBpbiBhbGwgZW52aXJvbm1lbnRzLikKLSAqICBVbHRpbWF0ZWx5LCB0aGlzIHdpbGwgYmUgY29tYmluZWQgd2l0aCBkZWZpbmVzIGdlbmVyYXRlZCBkeW5hbWljYWxseSBhcwotICogIHBhcnQgb2YgdGhlIHN5c2dlbiwgYW5kIHNvbWUgb2YgdGhlIGRlZmluZXMgYmVsb3cgbWF5IGluIGZhY3QgZW5kIHVwCi0gKiAgYmVpbmcgcmVwbGFjZWQgd2l0aCBkeW5hbWljYWxseSBnZW5lcmF0ZWQgb25lcy4KLSAqLwotI2lmbmRlZiBfX1ZFUlNJT05fSF9fCi0jZGVmaW5lIF9fVkVSU0lPTl9IX18KLQotI2RlZmluZSBTUEFSVkVSMSAiMSIKLSNkZWZpbmUgU1BBUlZFUjIgIjAiCi0jZGVmaW5lIFNQQVJWRVIzICIwIgotI2RlZmluZSBTUEFSVkVSNCAiMCIKLQotI2RlZmluZSAgVkVSU0lPTiAgICAgICAgU1BBUlZFUjEgIi4iIFNQQVJWRVIyICIuIiBTUEFSVkVSMyAiLiIgU1BBUlZFUjQKLQotLyogSGVyZSBhcmUgdmFyaW91cyB2ZXJzaW9uIGZvcm1zIG5lZWRlZCBpbiBXaW5kb3dzIGVudmlyb25tZW50cy4KLSAqLwotI2RlZmluZSBWSVNPUl9QUk9EVUNUVkVSU0lPTiAgICAgIFNQQVJWRVJDT01NQQotI2RlZmluZSBWSVNPUl9QUk9EVUNUVkVSU0lPTl9TVFIgIFNQQVJWRVIxICIuIiBTUEFSVkVSMiAiLiIgU1BBUlZFUjMgIi4iIFwKLQlTUEFSVkVSNAotI2RlZmluZSBWSVNPUl9PQkpFQ1RWRVJTSU9OX1NUUiAgIFNQQVJWRVIxICIsIiBTUEFSVkVSMiAiLCIgU1BBUlZFUjMgIiwiIFwKLQlTUEFSVkVSNAotCi0jZGVmaW5lICBDT1BZUklHSFQgICAgICAiVW5pc3lzIENvcnBvcmF0aW9uIgotI2RlZmluZSAgQ09QWVJJR0hUREFURSAgIjIwMTAgLSAyMDEzIgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS92aXNvcmJ1cy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Zpc29yYnVzLmgKaW5kZXggOWJhZjFlYy4uNjc3NjI3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Zpc29yYnVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Zpc29yYnVzLmgKQEAgLTM0LDggKzM0LDkgQEAKICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdXVpZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCi0jaW5jbHVkZSAicGVyaW9kaWNfd29yay5oIgogI2luY2x1ZGUgImNoYW5uZWwuaCIKIAogc3RydWN0IHZpc29yX2RyaXZlcjsKQEAgLTY1LDggKzY2LDYgQEAKICAqIHN0cnVjdCB2aXNvcl9kcml2ZXIgLSBJbmZvcm1hdGlvbiBwcm92aWRlZCBieSBlYWNoIHZpc29yIGRyaXZlciB3aGVuIGl0CiAgKiByZWdpc3RlcnMgd2l0aCB0aGUgdmlzb3JidXMgZHJpdmVyLgogICogQG5hbWU6CQlOYW1lIG9mIHRoZSB2aXNvciBkcml2ZXIuCi0gKiBAdmVyc2lvbjoJCVRoZSBudW1iZXJlZCB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgKHgueC54eHgpLgotICogQHZlcnRhZzoJCUEgaHVtYW4gcmVhZGFibGUgdmVyc2lvbiBzdHJpbmcuCiAgKiBAb3duZXI6CQlUaGUgbW9kdWxlIG93bmVyLgogICogQGNoYW5uZWxfdHlwZXM6CVR5cGVzIG9mIGNoYW5uZWxzIGhhbmRsZWQgYnkgdGhpcyBkcml2ZXIsIGVuZGluZyB3aXRoCiAgKgkJCWEgemVybyBHVUlELiBPdXIgc3BlY2lhbGl6ZWQgQlVTLm1hdGNoKCkgbWV0aG9kIGtub3dzCkBAIC05MywxMiArOTIsOSBAQAogICogQHJlc3VtZToJCUJlaGF2ZXMgc2ltaWxhciB0byBwYXVzZS4KICAqIEBkcml2ZXI6CQlQcml2YXRlIHJlZmVyZW5jZSB0byB0aGUgZGV2aWNlIGRyaXZlci4gRm9yIHVzZSBieSBidXMKICAqCQkJZHJpdmVyIG9ubHkuCi0gKiBAdmVyc2lvbl9hdHRyOglQcml2YXRlIHZlcnNpb24gZmllbGQuIEZvciB1c2UgYnkgYnVzIGRyaXZlciBvbmx5LgogICovCiBzdHJ1Y3Qgdmlzb3JfZHJpdmVyIHsKIAljb25zdCBjaGFyICpuYW1lOwotCWNvbnN0IGNoYXIgKnZlcnNpb247Ci0JY29uc3QgY2hhciAqdmVydGFnOwogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwogCXN0cnVjdCB2aXNvcl9jaGFubmVsdHlwZV9kZXNjcmlwdG9yICpjaGFubmVsX3R5cGVzOwogCWludCAoKnByb2JlKShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYpOwpAQCAtMTExLDcgKzEwNyw2IEBACiAKIAkvKiBUaGVzZSBmaWVsZHMgYXJlIGZvciBwcml2YXRlIHVzZSBieSB0aGUgYnVzIGRyaXZlciBvbmx5LiAqLwogCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKLQlzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZSB2ZXJzaW9uX2F0dHI7CiB9OwogCiAjZGVmaW5lIHRvX3Zpc29yX2RyaXZlcih4KSAoKHgpID8gXApAQCAtMTIwLDMzICsxMTUsMzMgQEAKIC8qKgogICogc3RydWN0IHZpc29yX2RldmljZSAtIEEgZGV2aWNlIHR5cGUgZm9yIHRoaW5ncyAicGx1Z2dlZCIgaW50byB0aGUgdmlzb3JidXMKICAqIGJ1cwotICogdmlzb3JjaGFubmVsOgkJUG9pbnRzIHRvIHRoZSBjaGFubmVsIHRoYXQgdGhlIGRldmljZSBpcworICogQHZpc29yY2hhbm5lbDoJCVBvaW50cyB0byB0aGUgY2hhbm5lbCB0aGF0IHRoZSBkZXZpY2UgaXMKICAqCQkJCWFzc29jaWF0ZWQgd2l0aC4KLSAqIGNoYW5uZWxfdHlwZV9ndWlkOgkJSWRlbnRpZmllcyB0aGUgY2hhbm5lbCB0eXBlIHRvIHRoZSBidXMgZHJpdmVyLgotICogZGV2aWNlOgkJCURldmljZSBzdHJ1Y3QgbWVhbnQgZm9yIHVzZSBieSB0aGUgYnVzIGRyaXZlcgorICogQGNoYW5uZWxfdHlwZV9ndWlkOgkJSWRlbnRpZmllcyB0aGUgY2hhbm5lbCB0eXBlIHRvIHRoZSBidXMgZHJpdmVyLgorICogQGRldmljZToJCQlEZXZpY2Ugc3RydWN0IG1lYW50IGZvciB1c2UgYnkgdGhlIGJ1cyBkcml2ZXIKICAqCQkJCW9ubHkuCi0gKiBsaXN0X2FsbDoJCQlVc2VkIGJ5IHRoZSBidXMgZHJpdmVyIHRvIGVudW1lcmF0ZSBkZXZpY2VzLgotICogcGVyaW9kaWNfd29yazoJCURldmljZSB3b3JrIHF1ZXVlLiBQcml2YXRlIHVzZSBieSBidXMgZHJpdmVyCi0gKgkJCQlvbmx5LgotICogYmVpbmdfcmVtb3ZlZDoJCUluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZCBmcm9tCisgKiBAbGlzdF9hbGw6CQkJVXNlZCBieSB0aGUgYnVzIGRyaXZlciB0byBlbnVtZXJhdGUgZGV2aWNlcy4KKyAqIEB0aW1lcjoJCSAgICAgICAgVGltZXIgZmlyZWQgcGVyaW9kaWNhbGx5IHRvIGRvIGludGVycnVwdC10eXBlCisgKgkJCQlhY3Rpdml0eS4KKyAqIEBiZWluZ19yZW1vdmVkOgkJSW5kaWNhdGVzIHRoYXQgdGhlIGRldmljZSBpcyBiZWluZyByZW1vdmVkIGZyb20KICAqCQkJCXRoZSBidXMuIFByaXZhdGUgYnVzIGRyaXZlciB1c2Ugb25seS4KLSAqIHZpc29yZHJpdmVyX2NhbGxiYWNrX2xvY2s6CVVzZWQgYnkgdGhlIGJ1cyBkcml2ZXIgdG8gbG9jayB3aGVuIGhhbmRsaW5nCisgKiBAdmlzb3Jkcml2ZXJfY2FsbGJhY2tfbG9jazoJVXNlZCBieSB0aGUgYnVzIGRyaXZlciB0byBsb2NrIHdoZW4gaGFuZGxpbmcKICAqCQkJCWNoYW5uZWwgZXZlbnRzLgotICogcGF1c2luZzoJCQlJbmRpY2F0ZXMgdGhhdCBhIGNoYW5nZSB0b3dhcmRzIGEgcGF1c2VkIHN0YXRlLgorICogQHBhdXNpbmc6CQkJSW5kaWNhdGVzIHRoYXQgYSBjaGFuZ2UgdG93YXJkcyBhIHBhdXNlZCBzdGF0ZS4KICAqCQkJCWlzIGluIHByb2dyZXNzLiBPbmx5IG1vZGlmaWVkIGJ5IHRoZSBidXMgZHJpdmVyLgotICogcmVzdW1pbmc6CQkJSW5kaWNhdGVzIHRoYXQgYSBjaGFuZ2UgdG93YXJkcyBhIHJ1bm5pbmcgc3RhdGUKKyAqIEByZXN1bWluZzoJCQlJbmRpY2F0ZXMgdGhhdCBhIGNoYW5nZSB0b3dhcmRzIGEgcnVubmluZyBzdGF0ZQogICoJCQkJaXMgaW4gcHJvZ3Jlc3MuIE9ubHkgbW9kaWZpZWQgYnkgdGhlIGJ1cyBkcml2ZXIuCi0gKiBjaGlwc2V0X2J1c19ubzoJCVByaXZhdGUgZmllbGQgdXNlZCBieSB0aGUgYnVzIGRyaXZlci4KLSAqIGNoaXBzZXRfZGV2X25vOgkJUHJpdmF0ZSBmaWVsZCB1c2VkIHRoZSBidXMgZHJpdmVyLgotICogc3RhdGU6CQkJVXNlZCB0byBpbmRpY2F0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKKyAqIEBjaGlwc2V0X2J1c19ubzoJCVByaXZhdGUgZmllbGQgdXNlZCBieSB0aGUgYnVzIGRyaXZlci4KKyAqIEBjaGlwc2V0X2Rldl9ubzoJCVByaXZhdGUgZmllbGQgdXNlZCB0aGUgYnVzIGRyaXZlci4KKyAqIEBzdGF0ZToJCQlVc2VkIHRvIGluZGljYXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZQogICoJCQkJZGV2aWNlLgotICogaW5zdDoJCQlVbmlxdWUgR1VJRCBmb3IgdGhpcyBpbnN0YW5jZSBvZiB0aGUgZGV2aWNlLgotICogbmFtZToJCQlOYW1lIG9mIHRoZSBkZXZpY2UuCi0gKiBwZW5kaW5nX21zZ19oZHI6CQlGb3IgcHJpdmF0ZSB1c2UgYnkgYnVzIGRyaXZlciB0byByZXNwb25kIHRvCisgKiBAaW5zdDoJCQlVbmlxdWUgR1VJRCBmb3IgdGhpcyBpbnN0YW5jZSBvZiB0aGUgZGV2aWNlLgorICogQG5hbWU6CQkJTmFtZSBvZiB0aGUgZGV2aWNlLgorICogQHBlbmRpbmdfbXNnX2hkcjoJCUZvciBwcml2YXRlIHVzZSBieSBidXMgZHJpdmVyIHRvIHJlc3BvbmQgdG8KICAqCQkJCWh5cGVydmlzb3IgcmVxdWVzdHMuCi0gKiB2YnVzX2hkcl9pbmZvOgkJQSBwb2ludGVyIHRvIGhlYWRlciBpbmZvLiBQcml2YXRlIHVzZSBieSBidXMKKyAqIEB2YnVzX2hkcl9pbmZvOgkJQSBwb2ludGVyIHRvIGhlYWRlciBpbmZvLiBQcml2YXRlIHVzZSBieSBidXMKICAqCQkJCWRyaXZlci4KLSAqIHBhcnRpdGlvbl91dWlkOgkJSW5kaWNhdGVzIGNsaWVudCBwYXJ0aW9uIGlkLiBUaGlzIHNob3VsZCBiZSB0aGUKKyAqIEBwYXJ0aXRpb25fdXVpZDoJCUluZGljYXRlcyBjbGllbnQgcGFydGlvbiBpZC4gVGhpcyBzaG91bGQgYmUgdGhlCiAgKgkJCQlzYW1lIGFjcm9zcyBhbGwgdmlzb3JfZGV2aWNlcyBpbiB0aGUgY3VycmVudAogICoJCQkJZ3Vlc3QuIFByaXZhdGUgdXNlIGJ5IGJ1cyBkcml2ZXIgb25seS4KICAqLwpAQCAtMTU3LDkgKzE1MiwxMCBAQAogCS8qIFRoZXNlIGZpZWxkcyBhcmUgZm9yIHByaXZhdGUgdXNlIGJ5IHRoZSBidXMgZHJpdmVyIG9ubHkuICovCiAJc3RydWN0IGRldmljZSBkZXZpY2U7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0X2FsbDsKLQlzdHJ1Y3QgcGVyaW9kaWNfd29yayAqcGVyaW9kaWNfd29yazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlib29sIHRpbWVyX2FjdGl2ZTsKIAlib29sIGJlaW5nX3JlbW92ZWQ7Ci0Jc3RydWN0IHNlbWFwaG9yZSB2aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrOworCXN0cnVjdCBtdXRleCB2aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrOwogCWJvb2wgcGF1c2luZzsKIAlib29sIHJlc3VtaW5nOwogCXUzMiBjaGlwc2V0X2J1c19ubzsKQEAgLTE3NCw3ICsxNzAsNiBAQAogCiAjZGVmaW5lIHRvX3Zpc29yX2RldmljZSh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IHZpc29yX2RldmljZSwgZGV2aWNlKQogCi0jaWZuZGVmIFNUQU5EQUxPTkVfQ0xJRU5UCiBpbnQgdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKHN0cnVjdCB2aXNvcl9kcml2ZXIgKik7CiB2b2lkIHZpc29yYnVzX3VucmVnaXN0ZXJfdmlzb3JfZHJpdmVyKHN0cnVjdCB2aXNvcl9kcml2ZXIgKik7CiBpbnQgdmlzb3JidXNfcmVhZF9jaGFubmVsKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldiwKQEAgLTE4Myw1MCArMTc4LDM0IEBACiBpbnQgdmlzb3JidXNfd3JpdGVfY2hhbm5lbChzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYsCiAJCQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgdm9pZCAqc3JjLAogCQkJICAgdW5zaWduZWQgbG9uZyBuYnl0ZXMpOwotaW50IHZpc29yYnVzX2NsZWFyX2NoYW5uZWwoc3RydWN0IHZpc29yX2RldmljZSAqZGV2LAotCQkJICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHU4IGNoLCB1bnNpZ25lZCBsb25nIG5ieXRlcyk7CiB2b2lkIHZpc29yYnVzX2VuYWJsZV9jaGFubmVsX2ludGVycnVwdHMoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KTsKIHZvaWQgdmlzb3JidXNfZGlzYWJsZV9jaGFubmVsX2ludGVycnVwdHMoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KTsKLSNlbmRpZgogCi0vKiBOb3RlIHRoYXQgZm9yIHZpc29yY2hhbm5lbF9jcmVhdGUoKQotICogPGNoYW5uZWxfYnl0ZXM+IGFuZCA8Z3VpZD4gYXJndW1lbnRzIG1heSBiZSAwIGlmIHdlIGFyZSBhIGNoYW5uZWwgQ0xJRU5ULgotICogSW4gdGhpcyBjYXNlLCB0aGUgdmFsdWVzIGNhbiBzaW1wbHkgYmUgcmVhZCBmcm9tIHRoZSBjaGFubmVsIGhlYWRlci4KKy8qIExldmVscyBvZiBzZXZlcml0eSBmb3IgZGlhZ25vc3RpYyBldmVudHMsIGluIG9yZGVyIGZyb20gbG93ZXN0IHNldmVyaXR5IHRvCisgKiBoaWdoZXN0IChpLmUuIGZhdGFsIGVycm9ycyBhcmUgdGhlIG1vc3Qgc2V2ZXJlLCBhbmQgc2hvdWxkIGFsd2F5cyBiZSBsb2dnZWQsCisgKiBidXQgaW5mbyBldmVudHMgcmFyZWx5IG5lZWQgdG8gYmUgbG9nZ2VkIGV4Y2VwdCBkdXJpbmcgZGVidWdnaW5nKS4gVGhlCisgKiB2YWx1ZXMgRElBR19TRVZFUklUWV9FTlVNX0JFR0lOIGFuZCBESUFHX1NFVkVSSVRZX0VOVU1fRU5EIGFyZSBub3QgdmFsaWQKKyAqIHNldmVyaXR5IHZhbHVlcy4gIFRoZXkgZXhpc3QgbWVyZWx5IHRvIGRpbGluZWF0ZSB0aGUgbGlzdCwgc28gdGhhdCBmdXR1cmUKKyAqIGFkZGl0aW9ucyB3b24ndCByZXF1aXJlIGNoYW5nZXMgdG8gdGhlIGRyaXZlciAoaS5lLiB3aGVuIGNoZWNraW5nIGZvcgorICogb3V0LW9mLXJhbmdlIHNldmVyaXRpZXMgaW4gU2V0U2V2ZXJpdHkpLiBUaGUgdmFsdWVzIERJQUdfU0VWRVJJVFlfT1ZFUlJJREUKKyAqIGFuZCBESUFHX1NFVkVSSVRZX1NIVVRPRkYgYXJlIG5vdCB2YWxpZCBzZXZlcml0eSB2YWx1ZXMgZm9yIGxvZ2dpbmcgZXZlbnRzCisgKiBidXQgdGhleSBhcmUgdmFsaWQgZm9yIGNvbnRyb2xsaW5nIHRoZSBhbW91bnQgb2YgZXZlbnQgZGF0YS4gQ2hhbmdlcyBtYWRlCisgKiB0byB0aGUgZW51bSwgbmVlZCB0byBiZSByZWZsZWN0ZWQgaW4gcy1QYXIuCiAgKi8KLXN0cnVjdCB2aXNvcmNoYW5uZWwgKnZpc29yY2hhbm5lbF9jcmVhdGUodTY0IHBoeXNhZGRyLAotCQkJCQkgdW5zaWduZWQgbG9uZyBjaGFubmVsX2J5dGVzLAotCQkJCQkgZ2ZwX3QgZ2ZwLCB1dWlkX2xlIGd1aWQpOwotc3RydWN0IHZpc29yY2hhbm5lbCAqdmlzb3JjaGFubmVsX2NyZWF0ZV93aXRoX2xvY2sodTY0IHBoeXNhZGRyLAotCQkJCQkJICAgdW5zaWduZWQgbG9uZyBjaGFubmVsX2J5dGVzLAotCQkJCQkJICAgZ2ZwX3QgZ2ZwLCB1dWlkX2xlIGd1aWQpOwotdm9pZCB2aXNvcmNoYW5uZWxfZGVzdHJveShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKTsKLWludCB2aXNvcmNoYW5uZWxfcmVhZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1bG9uZyBvZmZzZXQsCi0JCSAgICAgIHZvaWQgKmxvY2FsLCB1bG9uZyBuYnl0ZXMpOwotaW50IHZpc29yY2hhbm5lbF93cml0ZShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1bG9uZyBvZmZzZXQsCi0JCSAgICAgICB2b2lkICpsb2NhbCwgdWxvbmcgbmJ5dGVzKTsKLWludCB2aXNvcmNoYW5uZWxfY2xlYXIoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LAotCQkgICAgICAgdTggY2gsIHVsb25nIG5ieXRlcyk7Ci1ib29sIHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLAotCQkJICAgICAgIHZvaWQgKm1zZyk7Ci1ib29sIHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLAotCQkJICAgICAgIHZvaWQgKm1zZyk7Ci1ib29sIHZpc29yY2hhbm5lbF9zaWduYWxlbXB0eShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUpOworZW51bSBkaWFnX3NldmVyaXR5IHsKKwlESUFHX1NFVkVSSVRZX1ZFUkJPU0UgPSAwLAorCURJQUdfU0VWRVJJVFlfSU5GTyA9IDEsCisJRElBR19TRVZFUklUWV9XQVJOSU5HID0gMiwKKwlESUFHX1NFVkVSSVRZX0VSUiA9IDMsCisJRElBR19TRVZFUklUWV9QUklOVCA9IDQsCit9OwogCi1pbnQgdmlzb3JjaGFubmVsX3NpZ25hbHF1ZXVlX3Nsb3RzX2F2YWlsKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsCi0JCQkJCSB1MzIgcXVldWUpOwotaW50IHZpc29yY2hhbm5lbF9zaWduYWxxdWV1ZV9tYXhfc2xvdHMoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlKTsKLXU2NCB2aXNvcmNoYW5uZWxfZ2V0X3BoeXNhZGRyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpOwotdWxvbmcgdmlzb3JjaGFubmVsX2dldF9uYnl0ZXMoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCk7Ci1jaGFyICp2aXNvcmNoYW5uZWxfaWQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgY2hhciAqcyk7Ci1jaGFyICp2aXNvcmNoYW5uZWxfem9uZWlkKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIGNoYXIgKnMpOwotdTY0IHZpc29yY2hhbm5lbF9nZXRfY2xpZW50cGFydGl0aW9uKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpOwotaW50IHZpc29yY2hhbm5lbF9zZXRfY2xpZW50cGFydGl0aW9uKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsCi0JCQkJICAgICB1NjQgcGFydGl0aW9uX2hhbmRsZSk7CitpbnQgdmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUsCisJCQkgICAgICB2b2lkICptc2cpOworaW50IHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLAorCQkJICAgICAgdm9pZCAqbXNnKTsKK2Jvb2wgdmlzb3JjaGFubmVsX3NpZ25hbGVtcHR5KHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSk7CiB1dWlkX2xlIHZpc29yY2hhbm5lbF9nZXRfdXVpZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKTsKLWNoYXIgKnZpc29yY2hhbm5lbF91dWlkX2lkKHV1aWRfbGUgKmd1aWQsIGNoYXIgKnMpOwotdm9pZCB2aXNvcmNoYW5uZWxfZGVidWcoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgaW50IG51bV9xdWV1ZXMsCi0JCQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdTMyIG9mZik7Ci12b2lkIF9faW9tZW0gKnZpc29yY2hhbm5lbF9nZXRfaGVhZGVyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpOwogCiAjZGVmaW5lIEJVU19ST09UX0RFVklDRQkJVUlOVF9NQVgKIHN0cnVjdCB2aXNvcl9kZXZpY2UgKnZpc29yYnVzX2dldF9kZXZpY2VfYnlfaWQodTMyIGJ1c19ubywgdTMyIGRldl9ubywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL01ha2VmaWxlCmluZGV4IGZjNzkwZTcuLmYzNzMwZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9NYWtlZmlsZQpAQCAtNyw2ICs3LDUgQEAKIHZpc29yYnVzLXkgOj0gdmlzb3JidXNfbWFpbi5vCiB2aXNvcmJ1cy15ICs9IHZpc29yY2hhbm5lbC5vCiB2aXNvcmJ1cy15ICs9IHZpc29yY2hpcHNldC5vCi12aXNvcmJ1cy15ICs9IHBlcmlvZGljX3dvcmsubwogCiBjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvY29udHJvbHZtY2hhbm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9jb250cm9sdm1jaGFubmVsLmgKaW5kZXggMDNlMzZmYi4uZjBiZmM0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9jb250cm9sdm1jaGFubmVsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9jb250cm9sdm1jaGFubmVsLmgKQEAgLTQ4Miw0ICs0ODIsODAgQEAKIAl1MzIgcmVzZXJ2ZWQ7CQkvKiBOYXR1cmFsIGFsaWdubWVudCAqLwogfTsKIAorLyogR2VuZXJhbCBFcnJvcnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMC05OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORSAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9JT1JFTUFQX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfS01BTExPQ19GQUlMRUQgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX01FU1NBR0VfSURfVU5LTk9XTiAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9NRVNTQUdFX0lEX0lOVkFMSURfRk9SX0NMSUVOVCAgICAgIDUKKworLyogQ09OVFJPTFZNX0lOSVRfQ0hJUFNFVC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMTAwLTE5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0xJRU5UX1NXSVRDSENPVU5UX05PTlpFUk8gICAgICAgICAxMDAKKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfRVhQRUNURURfQ0hJUFNFVF9JTklUICAgICAgICAgICAgICAxMDEKKworLyogTWF4aW11bSBMaW1pdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMjAwLTI5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfTUFYX0JVU0VTCQkyMDEJLyogQlVTX0NSRUFURSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9NQVhfREVWSUNFUyAgICAgICAgMjAyCS8qIERFVklDRV9DUkVBVEUgKi8KKy8qIFBheWxvYWQgYW5kIFBhcmFtZXRlciBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzQwMC00OTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX1BBWUxPQURfSU5WQUxJRAk0MDAJLyogU1dJVENIX0FUVEFDSEVYVFBPUlQsCisJCQkJCQkJICogREVWSUNFX0NPTkZJR1VSRQorCQkJCQkJCSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9JTklUSUFUT1JfUEFSQU1FVEVSX0lOVkFMSUQgNDAxCS8qIE11bHRpcGxlICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX1RBUkdFVF9QQVJBTUVURVJfSU5WQUxJRCA0MDIgLyogREVWSUNFX0NPTkZJR1VSRSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DTElFTlRfUEFSQU1FVEVSX0lOVkFMSUQgNDAzIC8qIERFVklDRV9DT05GSUdVUkUgKi8KKy8qIFNwZWNpZmllZFtQYWNrZXQgU3RydWN0dXJlXSBWYWx1ZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bNTAwLTU5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0lOVkFMSUQJNTAwCS8qIFNXSVRDSF9BVFRBQ0hJTlRQT1JULAorCQkJCQkJCSAqIEJVU19DT05GSUdVUkUsCisJCQkJCQkJICogREVWSUNFX0NSRUFURSwKKwkJCQkJCQkgKiBERVZJQ0VfQ09ORklHCisJCQkJCQkJICogREVWSUNFX0RFU1RST1kKKwkJCQkJCQkgKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX0lOVkFMSUQJNTAxIC8qIFNXSVRDSF9BVFRBQ0hJTlRQT1JUICovCisJCQkJCQkgICAgLyogREVWSUNFX0NSRUFURSwKKwkJCQkJCSAgICAgKiBERVZJQ0VfQ09ORklHVVJFLAorCQkJCQkJICAgICAqIERFVklDRV9ERVNUUk9ZCisJCQkJCQkgICAgICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfSU5WQUxJRAk1MDIgLyogREVWSUNFX0NSRUFURSwKKwkJCQkJCSAgICAgKiBERVZJQ0VfQ09ORklHVVJFCisJCQkJCQkgICAgICovCisvKiBQYXJ0aXRpb24gRHJpdmVyIENhbGxiYWNrIEludGVyZmFjZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bNjAwLTY5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRSA2MDQJLyogQlVTX0NSRUFURSwKKwkJCQkJCQkgKiBCVVNfREVTVFJPWSwKKwkJCQkJCQkgKiBERVZJQ0VfQ1JFQVRFLAorCQkJCQkJCSAqIERFVklDRV9ERVNUUk9ZCisJCQkJCQkJICovCisvKiBVbmFibGUgdG8gaW52b2tlIFZJUlRQQ0kgY2FsbGJhY2sgKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfQ0FMTEJBQ0tfRVJST1IgNjA1CisJCQkJCQkJLyogQlVTX0NSRUFURSwKKwkJCQkJCQkgKiBCVVNfREVTVFJPWSwKKwkJCQkJCQkgKiBERVZJQ0VfQ1JFQVRFLAorCQkJCQkJCSAqIERFVklDRV9ERVNUUk9ZCisJCQkJCQkJICovCisvKiBWSVJUUENJIENhbGxiYWNrIHJldHVybmVkIGVycm9yICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0dFTkVSSUNfRFJJVkVSX0NBTExCQUNLX0VSUk9SIDYwNgorCQkJCQkJCS8qIFNXSVRDSF9BVFRBQ0hFWFRQT1JULAorCQkJCQkJCSAqIFNXSVRDSF9ERVRBQ0hFWFRQT1JUCisJCQkJCQkJICogREVWSUNFX0NPTkZJR1VSRQorCQkJCQkJCSAqLworCisvKiBnZW5lcmljIGRldmljZSBjYWxsYmFjayByZXR1cm5lZCBlcnJvciAqLworLyogQnVzIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bNzAwLTc5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0RFVklDRV9BVFRBQ0hFRCA3MDAJLyogQlVTX0RFU1RST1kgKi8KKy8qIENoYW5uZWwgUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzgwMC04OTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfVFlQRV9VTktOT1dOIDgwMAkvKiBHRVRfQ0hBTk5FTElORk8sCisJCQkJCQkJICogREVWSUNFX0RFU1RST1kKKwkJCQkJCQkgKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9TSVpFX1RPT19TTUFMTCA4MDEJLyogREVWSUNFX0NSRUFURSAqLworLyogQ2hpcHNldCBTaHV0ZG93biBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzEwMDAtMTA5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hJUFNFVF9TSFVURE9XTl9GQUlMRUQgICAgICAgICAgICAxMDAwCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NISVBTRVRfU0hVVERPV05fQUxSRUFEWV9BQ1RJVkUgICAgMTAwMQorCisvKiBDaGlwc2V0IFN0b3AgUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMTEwMC0xMTk5XSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSElQU0VUX1NUT1BfRkFJTEVEX0JVUyAgICAgICAgICAgIDExMDAKKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hJUFNFVF9TVE9QX0ZBSUxFRF9TV0lUQ0ggICAgICAgICAxMTAxCisKKy8qIERldmljZSBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsxNDAwLTE0OTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9VREVWX1RJTUVPVVQgICAgICAgICAgICAgICAgMTQwMAorCiAjZW5kaWYJCQkJLyogX19DT05UUk9MVk1DSEFOTkVMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9jb250cm9sdm1jb21wbGV0aW9uc3RhdHVzLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL2NvbnRyb2x2bWNvbXBsZXRpb25zdGF0dXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhZDBlYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL2NvbnRyb2x2bWNvbXBsZXRpb25zdGF0dXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKiBjb250cm9sdm1jb21wbGV0aW9uc3RhdHVzLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDE1IFVOSVNZUyBDT1JQT1JBVElPTgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqLwotCi0vKiAgRGVmaW5lcyBmb3IgYWxsIHZhbGlkIHZhbHVlcyByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgbWVzc2FnZSBoZWFkZXIKLSAqICBjb21wbGV0aW9uU3RhdHVzIGZpZWxkLiAgU2VlIGNvbnRyb2x2bWNoYW5uZWwuaCBmb3IgZGVzY3JpcHRpb24gb2YKLSAqICB0aGUgaGVhZGVyOiBfQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSLgotICovCi0KLSNpZm5kZWYgX19DT05UUk9MVk1DT01QTEVUSU9OU1RBVFVTX0hfXwotI2RlZmluZSBfX0NPTlRST0xWTUNPTVBMRVRJT05TVEFUVVNfSF9fCi0KLS8qIEdlbmVyYWwgRXJyb3JzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzAtOTldICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkUgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfSU9SRU1BUF9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0tNQUxMT0NfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9NRVNTQUdFX0lEX1VOS05PV04gICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfTUVTU0FHRV9JRF9JTlZBTElEX0ZPUl9DTElFTlQgICAgICA1Ci0KLS8qIENPTlRST0xWTV9JTklUX0NISVBTRVQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzEwMC0xOTldICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NMSUVOVF9TV0lUQ0hDT1VOVF9OT05aRVJPICAgICAgICAgMTAwCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0VYUEVDVEVEX0NISVBTRVRfSU5JVCAgICAgICAgICAgICAgMTAxCi0KLS8qIE1heGltdW0gTGltaXQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzIwMC0yOTldICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX01BWF9CVVNFUwkJMjAxCS8qIEJVU19DUkVBVEUgKi8KLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfTUFYX0RFVklDRVMgICAgICAgIDIwMgkvKiBERVZJQ0VfQ1JFQVRFICovCi0vKiBQYXlsb2FkIGFuZCBQYXJhbWV0ZXIgUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVs0MDAtNDk5XSAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9QQVlMT0FEX0lOVkFMSUQJNDAwCS8qIFNXSVRDSF9BVFRBQ0hFWFRQT1JULAotCQkJCQkJCSAqIERFVklDRV9DT05GSUdVUkUKLQkJCQkJCQkgKi8KLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfSU5JVElBVE9SX1BBUkFNRVRFUl9JTlZBTElEIDQwMQkvKiBNdWx0aXBsZSAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9UQVJHRVRfUEFSQU1FVEVSX0lOVkFMSUQgNDAyIC8qIERFVklDRV9DT05GSUdVUkUgKi8KLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0xJRU5UX1BBUkFNRVRFUl9JTlZBTElEIDQwMyAvKiBERVZJQ0VfQ09ORklHVVJFICovCi0vKiBTcGVjaWZpZWRbUGFja2V0IFN0cnVjdHVyZV0gVmFsdWUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzUwMC01OTldICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElECTUwMAkvKiBTV0lUQ0hfQVRUQUNISU5UUE9SVCwKLQkJCQkJCQkgKiBCVVNfQ09ORklHVVJFLAotCQkJCQkJCSAqIERFVklDRV9DUkVBVEUsCi0JCQkJCQkJICogREVWSUNFX0NPTkZJRwotCQkJCQkJCSAqIERFVklDRV9ERVNUUk9ZCi0JCQkJCQkJICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9JTlZBTElECTUwMSAvKiBTV0lUQ0hfQVRUQUNISU5UUE9SVCAqLwotCQkJCQkJICAgIC8qIERFVklDRV9DUkVBVEUsCi0JCQkJCQkgICAgICogREVWSUNFX0NPTkZJR1VSRSwKLQkJCQkJCSAgICAgKiBERVZJQ0VfREVTVFJPWQotCQkJCQkJICAgICAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX0lOVkFMSUQJNTAyIC8qIERFVklDRV9DUkVBVEUsCi0JCQkJCQkgICAgICogREVWSUNFX0NPTkZJR1VSRQotCQkJCQkJICAgICAqLwotLyogUGFydGl0aW9uIERyaXZlciBDYWxsYmFjayBJbnRlcmZhY2UtLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzYwMC02OTldICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0ZBSUxVUkUgNjA0CS8qIEJVU19DUkVBVEUsCi0JCQkJCQkJICogQlVTX0RFU1RST1ksCi0JCQkJCQkJICogREVWSUNFX0NSRUFURSwKLQkJCQkJCQkgKiBERVZJQ0VfREVTVFJPWQotCQkJCQkJCSAqLwotLyogVW5hYmxlIHRvIGludm9rZSBWSVJUUENJIGNhbGxiYWNrICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SIDYwNQotCQkJCQkJCS8qIEJVU19DUkVBVEUsCi0JCQkJCQkJICogQlVTX0RFU1RST1ksCi0JCQkJCQkJICogREVWSUNFX0NSRUFURSwKLQkJCQkJCQkgKiBERVZJQ0VfREVTVFJPWQotCQkJCQkJCSAqLwotLyogVklSVFBDSSBDYWxsYmFjayByZXR1cm5lZCBlcnJvciAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9HRU5FUklDX0RSSVZFUl9DQUxMQkFDS19FUlJPUiA2MDYKLQkJCQkJCQkvKiBTV0lUQ0hfQVRUQUNIRVhUUE9SVCwKLQkJCQkJCQkgKiBTV0lUQ0hfREVUQUNIRVhUUE9SVAotCQkJCQkJCSAqIERFVklDRV9DT05GSUdVUkUKLQkJCQkJCQkgKi8KLQotLyogZ2VuZXJpYyBkZXZpY2UgY2FsbGJhY2sgcmV0dXJuZWQgZXJyb3IgKi8KLS8qIEJ1cyBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzcwMC03OTldICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19ERVZJQ0VfQVRUQUNIRUQgNzAwCS8qIEJVU19ERVNUUk9ZICovCi0vKiBDaGFubmVsIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVs4MDAtODk5XSAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX1RZUEVfVU5LTk9XTiA4MDAJLyogR0VUX0NIQU5ORUxJTkZPLAotCQkJCQkJCSAqIERFVklDRV9ERVNUUk9ZCi0JCQkJCQkJICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfU0laRV9UT09fU01BTEwgODAxCS8qIERFVklDRV9DUkVBVEUgKi8KLS8qIENoaXBzZXQgU2h1dGRvd24gUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsxMDAwLTEwOTldICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NISVBTRVRfU0hVVERPV05fRkFJTEVEICAgICAgICAgICAgMTAwMAotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSElQU0VUX1NIVVRET1dOX0FMUkVBRFlfQUNUSVZFICAgIDEwMDEKLQotLyogQ2hpcHNldCBTdG9wIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzExMDAtMTE5OV0gKi8KLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hJUFNFVF9TVE9QX0ZBSUxFRF9CVVMgICAgICAgICAgICAxMTAwCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NISVBTRVRfU1RPUF9GQUlMRURfU1dJVENIICAgICAgICAgMTEwMQotCi0vKiBEZXZpY2UgUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMTQwMC0xNDk5XSAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfVURFVl9USU1FT1VUICAgICAgICAgICAgICAgIDE0MDAKLQotI2VuZGlmIC8qIF9fQ09OVFJPTFZNQ09NUExFVElPTlNUQVRVU19IX18gbm90IGRlZmluZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvaW92bWNhbGxfZ251Yy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9pb3ZtY2FsbF9nbnVjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZWE3ZjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9pb3ZtY2FsbF9nbnVjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDE1IFVOSVNZUyBDT1JQT1JBVElPTgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqLwotCi0vKiBMaW51eCBHQ0MgVmVyc2lvbiAoMzItYml0IGFuZCA2NC1iaXQpICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLV9fdW5pc3lzX3ZtY2FsbF9nbnVjKHVuc2lnbmVkIGxvbmcgdHVwbGUsIHVuc2lnbmVkIGxvbmcgcmVnX2VieCwKLQkJICAgICB1bnNpZ25lZCBsb25nIHJlZ19lY3gpCi17Ci0JdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOwotCXVuc2lnbmVkIGludCBjcHVpZF9lYXgsIGNwdWlkX2VieCwgY3B1aWRfZWN4LCBjcHVpZF9lZHg7Ci0KLQljcHVpZCgweDAwMDAwMDAxLCAmY3B1aWRfZWF4LCAmY3B1aWRfZWJ4LCAmY3B1aWRfZWN4LCAmY3B1aWRfZWR4KTsKLQlpZiAoIShjcHVpZF9lY3ggJiAweDgwMDAwMDAwKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKCIuYnl0ZSAweDAwZiwgMHgwMDEsIDB4MGMxIiA6ICI9YSIocmVzdWx0KSA6Ci0JCSJhIih0dXBsZSksICJiIihyZWdfZWJ4KSwgImMiKHJlZ19lY3gpKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLV9fdW5pc3lzX2V4dGVuZGVkX3ZtY2FsbF9nbnVjKHVuc2lnbmVkIGxvbmcgbG9uZyB0dXBsZSwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyByZWdfZWJ4LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHJlZ19lY3gsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgcmVnX2VkeCkKLXsKLQl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgaW50IGNwdWlkX2VheCwgY3B1aWRfZWJ4LCBjcHVpZF9lY3gsIGNwdWlkX2VkeDsKLQotCWNwdWlkKDB4MDAwMDAwMDEsICZjcHVpZF9lYXgsICZjcHVpZF9lYngsICZjcHVpZF9lY3gsICZjcHVpZF9lZHgpOwotCWlmICghKGNwdWlkX2VjeCAmIDB4ODAwMDAwMDApKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oIi5ieXRlIDB4MDBmLCAweDAwMSwgMHgwYzEiIDogIj1hIihyZXN1bHQpIDoKLQkJImEiKHR1cGxlKSwgImIiKHJlZ19lYngpLCAiYyIocmVnX2VjeCksICJkIihyZWdfZWR4KSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvcGVyaW9kaWNfd29yay5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9wZXJpb2RpY193b3JrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYjE1MjcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9wZXJpb2RpY193b3JrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyogcGVyaW9kaWNfd29yay5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxNSBVTklTWVMgQ09SUE9SQVRJT04KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKi8KLQotLyoKLSAqICBIZWxwZXIgZnVuY3Rpb25zIHRvIHNjaGVkdWxlIHBlcmlvZGljIHdvcmsgaW4gTGludXgga2VybmVsIG1vZGUuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0jaW5jbHVkZSAicGVyaW9kaWNfd29yay5oIgotCi0jZGVmaW5lIE1ZRFJWTkFNRSAicGVyaW9kaWNfd29yayIKLQotc3RydWN0IHBlcmlvZGljX3dvcmsgewotCXJ3bG9ja190IGxvY2s7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwotCXZvaWQgKCp3b3JrZnVuYykodm9pZCAqKTsKLQl2b2lkICp3b3JrZnVuY2FyZzsKLQlib29sIGlzX3NjaGVkdWxlZDsKLQlib29sIHdhbnRfdG9fc3RvcDsKLQl1bG9uZyBqaWZmeV9pbnRlcnZhbDsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlOwotCWNvbnN0IGNoYXIgKmRldm5hbTsKLX07Ci0KLXN0YXRpYyB2b2lkIHBlcmlvZGljX3dvcmtfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHBlcmlvZGljX3dvcmsgKnB3OwotCi0JcHcgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBlcmlvZGljX3dvcmssIHdvcmsud29yayk7Ci0JKCpwdy0+d29ya2Z1bmMpKHB3LT53b3JrZnVuY2FyZyk7Ci19Ci0KLXN0cnVjdCBwZXJpb2RpY193b3JrCi0qdmlzb3JfcGVyaW9kaWNfd29ya19jcmVhdGUodWxvbmcgamlmZnlfaW50ZXJ2YWwsCi0JCQkgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZSwKLQkJCSAgICB2b2lkICgqd29ya2Z1bmMpKHZvaWQgKiksCi0JCQkgICAgdm9pZCAqd29ya2Z1bmNhcmcsCi0JCQkgICAgY29uc3QgY2hhciAqZGV2bmFtKQotewotCXN0cnVjdCBwZXJpb2RpY193b3JrICpwdzsKLQotCXB3ID0ga3phbGxvYyhzaXplb2YoKnB3KSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOwotCWlmICghcHcpCi0JCXJldHVybiBOVUxMOwotCi0Jcndsb2NrX2luaXQoJnB3LT5sb2NrKTsKLQlwdy0+amlmZnlfaW50ZXJ2YWwgPSBqaWZmeV9pbnRlcnZhbDsKLQlwdy0+d29ya3F1ZXVlID0gd29ya3F1ZXVlOwotCXB3LT53b3JrZnVuYyA9IHdvcmtmdW5jOwotCXB3LT53b3JrZnVuY2FyZyA9IHdvcmtmdW5jYXJnOwotCXB3LT5kZXZuYW0gPSBkZXZuYW07Ci0JcmV0dXJuIHB3OwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfcGVyaW9kaWNfd29ya19jcmVhdGUpOwotCi12b2lkIHZpc29yX3BlcmlvZGljX3dvcmtfZGVzdHJveShzdHJ1Y3QgcGVyaW9kaWNfd29yayAqcHcpCi17Ci0Ja2ZyZWUocHcpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfcGVyaW9kaWNfd29ya19kZXN0cm95KTsKLQotLyoqIENhbGwgdGhpcyBmcm9tIHlvdXIgcGVyaW9kaWMgd29yayB3b3JrZXIgZnVuY3Rpb24gdG8gc2NoZWR1bGUgdGhlIG5leHQKLSAqICBjYWxsLgotICogIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlcmUgd2FzIGEgZmFpbHVyZSBhbmQgdGhlCi0gKiAgcGVyaW9kaWMgd29yayBpcyBubyBsb25nZXIgc2NoZWR1bGVkCi0gKi8KLWJvb2wgdmlzb3JfcGVyaW9kaWNfd29ya19uZXh0cGVyaW9kKHN0cnVjdCBwZXJpb2RpY193b3JrICpwdykKLXsKLQlib29sIHJjID0gZmFsc2U7Ci0KLQl3cml0ZV9sb2NrKCZwdy0+bG9jayk7Ci0JaWYgKHB3LT53YW50X3RvX3N0b3ApIHsKLQkJcHctPmlzX3NjaGVkdWxlZCA9IGZhbHNlOwotCQlwdy0+d2FudF90b19zdG9wID0gZmFsc2U7Ci0JCXJjID0gdHJ1ZTsgIC8qIHllcywgdHJ1ZTsgc2VlIHZpc29yX3BlcmlvZGljX3dvcmtfc3RvcCgpICovCi0JCWdvdG8gdW5sb2NrOwotCX0gZWxzZSBpZiAoIXF1ZXVlX2RlbGF5ZWRfd29yayhwdy0+d29ya3F1ZXVlLCAmcHctPndvcmssCi0JCQkJICAgICAgIHB3LT5qaWZmeV9pbnRlcnZhbCkpIHsKLQkJcHctPmlzX3NjaGVkdWxlZCA9IGZhbHNlOwotCQlyYyA9IGZhbHNlOwotCQlnb3RvIHVubG9jazsKLQl9Ci0JcmMgPSB0cnVlOwotdW5sb2NrOgotCXdyaXRlX3VubG9jaygmcHctPmxvY2spOwotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3BlcmlvZGljX3dvcmtfbmV4dHBlcmlvZCk7Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZmYgbmV3IHBlcmlvZGljIHdvcmsgd2FzIGFjdHVhbGx5IHN0YXJ0ZWQuCi0gKiAgSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGVuIG5vIHdvcmsgd2FzIHN0YXJ0ZWQKLSAqICAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIGFscmVhZHkgc3RhcnRlZCwgb3IgYmVjYXVzZSBvZiBhIGZhaWx1cmUpLgotICovCi1ib29sIHZpc29yX3BlcmlvZGljX3dvcmtfc3RhcnQoc3RydWN0IHBlcmlvZGljX3dvcmsgKnB3KQotewotCWJvb2wgcmMgPSBmYWxzZTsKLQotCXdyaXRlX2xvY2soJnB3LT5sb2NrKTsKLQlpZiAocHctPmlzX3NjaGVkdWxlZCkgewotCQlyYyA9IGZhbHNlOwotCQlnb3RvIHVubG9jazsKLQl9Ci0JaWYgKHB3LT53YW50X3RvX3N0b3ApIHsKLQkJcmMgPSBmYWxzZTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCUlOSVRfREVMQVlFRF9XT1JLKCZwdy0+d29yaywgJnBlcmlvZGljX3dvcmtfZnVuYyk7Ci0JaWYgKCFxdWV1ZV9kZWxheWVkX3dvcmsocHctPndvcmtxdWV1ZSwgJnB3LT53b3JrLAotCQkJCXB3LT5qaWZmeV9pbnRlcnZhbCkpIHsKLQkJcmMgPSBmYWxzZTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCXB3LT5pc19zY2hlZHVsZWQgPSB0cnVlOwotCXJjID0gdHJ1ZTsKLXVubG9jazoKLQl3cml0ZV91bmxvY2soJnB3LT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wZXJpb2RpY193b3JrX3N0YXJ0KTsKLQotLyoqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmZiB5b3VyIGNhbGwgYWN0dWFsbHkgc3RvcHBlZCB0aGUgcGVyaW9kaWMKLSAqICB3b3JrLgotICoKLSAqICAtLSBQQVkgQVRURU5USU9OLi4uIHRoaXMgaXMgaW1wb3J0YW50IC0tCi0gKgotICogIE5PIE5PICMxCi0gKgotICogICAgIERvIE5PVCBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBzb21lIGZ1bmN0aW9uIHRoYXQgaXMgcnVubmluZyBvbiB0aGUKLSAqICAgICBzYW1lIHdvcmtxdWV1ZSBhcyB0aGUgd29yayB5b3UgYXJlIHRyeWluZyB0byBzdG9wIG1pZ2h0IGJlIHJ1bm5pbmcKLSAqICAgICBvbiEgIElmIHlvdSB2aW9sYXRlIHRoaXMgcnVsZSwgdmlzb3JfcGVyaW9kaWNfd29ya19zdG9wKCkgTUlHSFQgd29yaywKLSAqICAgICBidXQgaXQgYWxzbyBNSUdIVCBnZXQgaHVuZyB1cCBpbiBhbiBpbmZpbml0ZSBsb29wIHNheWluZwotICogICAgICJ3YWl0aW5nIGZvciBkZWxheWVkIHdvcmsuLi4iLiAgVGhpcyB3aWxsIGhhcHBlbiBpZiB0aGUgZGVsYXllZCB3b3JrCi0gKiAgICAgeW91IGFyZSB0cnlpbmcgdG8gY2FuY2VsIGhhcyBiZWVuIHB1dCBpbiB0aGUgd29ya3F1ZXVlIGxpc3QsIGJ1dCBjYW4ndAotICogICAgIHJ1biB5ZXQgYmVjYXVzZSB3ZSBhcmUgcnVubmluZyB0aGF0IHNhbWUgd29ya3F1ZXVlIHRocmVhZCByaWdodCBub3cuCi0gKgotICogICAgIEJvdHRvbSBsaW5lOiBJZiB5b3UgbmVlZCB0byBjYWxsIHZpc29yX3BlcmlvZGljX3dvcmtfc3RvcCgpIGZyb20gYQotICogICAgIHdvcmtpdGVtLCBiZSBzdXJlIHRoZSB3b3JraXRlbSBpcyBvbiBhIERJRkZFUkVOVCB3b3JrcXVldWUgdGhhbiB0aGUKLSAqICAgICB3b3JraXRlbSB0aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGNhbmNlbC4KLSAqCi0gKiAgICAgSWYgSSBjb3VsZCBmaWd1cmUgb3V0IHNvbWUgd2F5IHRvIGNoZWNrIGZvciB0aGlzICJubyBubyIgY29uZGl0aW9uIGluCi0gKiAgICAgdGhlIGNvZGUsIEkgd291bGQuICBJdCB3b3VsZCBoYXZlIHNhdmVkIG1lIHRoZSB0cm91YmxlIG9mIHdyaXRpbmcgdGhpcwotICogICAgIGxvbmcgY29tbWVudC4gIEFuZCBhbHNvLCBkb24ndCB0aGluayB0aGlzIGlzIHNvbWUgInRoZW9yZXRpY2FsIiByYWNlCi0gKiAgICAgY29uZGl0aW9uLiAgSXQgaXMgUkVBTCwgYXMgSSBoYXZlIHNwZW50IHRoZSBkYXkgY2hhc2luZyBpdC4KLSAqCi0gKiAgTk8gTk8gIzIKLSAqCi0gKiAgICAgVGFrZSBjbG9zZSBub3RlIG9mIHRoZSBsb2NrcyB0aGF0IHlvdSBvd24gd2hlbiB5b3UgY2FsbCB0aGlzIGZ1bmN0aW9uLgotICogICAgIFlvdSBtdXN0IE5PVCBvd24gYW55IGxvY2tzIHRoYXQgYXJlIG5lZWRlZCBieSB0aGUgcGVyaW9kaWMgd29yawotICogICAgIGZ1bmN0aW9uIHRoYXQgaXMgY3VycmVudGx5IGluc3RhbGxlZC4gIElmIHlvdSBETywgYSBkZWFkbG9jayBtYXkgcmVzdWx0LAotICogICAgIGJlY2F1c2Ugc3RvcHBpbmcgdGhlIHBlcmlvZGljIHdvcmsgb2Z0ZW4gaW52b2x2ZXMgd2FpdGluZyBmb3IgdGhlIGxhc3QKLSAqICAgICBpdGVyYXRpb24gb2YgdGhlIHBlcmlvZGljIHdvcmsgZnVuY3Rpb24gdG8gY29tcGxldGUuICBBZ2FpbiwgaWYgeW91IGhpdAotICogICAgIHRoaXMgZGVhZGxvY2ssIHlvdSB3aWxsIGdldCBodW5nIHVwIGluIGFuIGluZmluaXRlIGxvb3Agc2F5aW5nCi0gKiAgICAgIndhaXRpbmcgZm9yIGRlbGF5ZWQgd29yay4uLiIuCi0gKi8KLWJvb2wgdmlzb3JfcGVyaW9kaWNfd29ya19zdG9wKHN0cnVjdCBwZXJpb2RpY193b3JrICpwdykKLXsKLQlib29sIHN0b3BwZWRfc29tZXRoaW5nID0gZmFsc2U7Ci0KLQl3cml0ZV9sb2NrKCZwdy0+bG9jayk7Ci0Jc3RvcHBlZF9zb21ldGhpbmcgPSBwdy0+aXNfc2NoZWR1bGVkICYmICghcHctPndhbnRfdG9fc3RvcCk7Ci0Jd2hpbGUgKHB3LT5pc19zY2hlZHVsZWQpIHsKLQkJcHctPndhbnRfdG9fc3RvcCA9IHRydWU7Ci0JCWlmIChjYW5jZWxfZGVsYXllZF93b3JrKCZwdy0+d29yaykpIHsKLQkJCS8qIFdlIGdldCBoZXJlIGlmIHRoZSBkZWxheWVkIHdvcmsgd2FzIHBlbmRpbmcgYXMKLQkJCSAqIGRlbGF5ZWQgd29yaywgYnV0IHdhcyBOT1QgcnVuLgotCQkJICovCi0JCQlXQVJOX09OKCFwdy0+aXNfc2NoZWR1bGVkKTsKLQkJCXB3LT5pc19zY2hlZHVsZWQgPSBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCS8qIElmIHdlIGdldCBoZXJlLCBlaXRoZXIgdGhlIGRlbGF5ZWQgd29yazoKLQkJCSAqIC0gd2FzIHJ1biwgT1IsCi0JCQkgKiAtIGlzIHJ1bm5pbmcgUklHSFQgTk9XIG9uIGFub3RoZXIgcHJvY2Vzc29yLCBPUiwKLQkJCSAqIC0gd2Fzbid0IGV2ZW4gc2NoZWR1bGVkICh0aGVyZSBpcyBhIG1pbmlzY3VsZQotCQkJICogICB0aW1pbmcgd2luZG93IHdoZXJlIHRoaXMgY291bGQgYmUgdGhlIGNhc2UpCi0JCQkgKiBmbHVzaF93b3JrcXVldWUoKSB3b3VsZCBtYWtlIHN1cmUgaXQgaXMgZmluaXNoZWQKLQkJCSAqIGV4ZWN1dGluZywgYnV0IHRoYXQgc3RpbGwgaXNuJ3QgdmVyeSB1c2VmdWwsIHdoaWNoCi0JCQkgKiBleHBsYWlucyB0aGUgbG9vcC4uLgotCQkJICovCi0JCX0KLQkJaWYgKHB3LT5pc19zY2hlZHVsZWQpIHsKLQkJCXdyaXRlX3VubG9jaygmcHctPmxvY2spOwotCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKLQkJCXdyaXRlX2xvY2soJnB3LT5sb2NrKTsKLQkJfSBlbHNlIHsKLQkJCXB3LT53YW50X3RvX3N0b3AgPSBmYWxzZTsKLQkJfQotCX0KLQl3cml0ZV91bmxvY2soJnB3LT5sb2NrKTsKLQlyZXR1cm4gc3RvcHBlZF9zb21ldGhpbmc7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wZXJpb2RpY193b3JrX3N0b3ApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92YnVzY2hhbm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92YnVzY2hhbm5lbC5oCmluZGV4IDkwZmExMmUuLmU5NzkxNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmJ1c2NoYW5uZWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3ZidXNjaGFubmVsLmgKQEAgLTIzLDcgKzIzLDYgQEAKICAqICB0aGUgY2xpZW50IGRldmljZXMgYW5kIGNsaWVudCBkcml2ZXJzIGZvciB0aGUgc2VydmVyIGVuZCB0byBzZWUuCiAgKi8KICNpbmNsdWRlIDxsaW51eC91dWlkLmg+Ci0jaW5jbHVkZSAidmJ1c2RldmljZWluZm8uaCIKICNpbmNsdWRlICJjaGFubmVsLmgiCiAKIC8qIHsxOTNiMzMxYi1jNThmLTExZGEtOTVhOS0wMGUwODE2MTE2NWZ9ICovCkBAIC01OCw2ICs1NywyMTYgQEAKIAkJCQkgICBhY3R1YWxfYnl0ZXMpKQogCiAjcHJhZ21hIHBhY2socHVzaCwgMSkJCS8qIGJvdGggR0NDIGFuZCBWQyBub3cgYWxsb3cgdGhpcyBwcmFnbWEgKi8KKworLyoKKyAqIEFuIGFycmF5IG9mIHRoaXMgc3RydWN0IGlzIHByZXNlbnQgaW4gdGhlIGNoYW5uZWwgYXJlYSBmb3IgZWFjaCB2YnVzLgorICogKFNlZSB2YnVzY2hhbm5lbC5oLikKKyAqIEl0IGlzIGZpbGxlZCBpbiBieSB0aGUgY2xpZW50IHNpZGUgdG8gcHJvdmlkZSBpbmZvIGFib3V0IHRoZSBkZXZpY2UKKyAqIGFuZCBkcml2ZXIgZnJvbSB0aGUgY2xpZW50J3MgcGVyc3BlY3RpdmUuCisgKi8KK3N0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8geworCXU4IGRldnR5cGVbMTZdOwkJLyogc2hvcnQgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBkZXZpY2UgdHlwZSAqLworCXU4IGRydm5hbWVbMTZdOwkJLyogZHJpdmVyIC5zeXMgZmlsZSBuYW1lICovCisJdTggaW5mb3N0cnNbOTZdOwkvKiBrZXJuZWwgdmVyc2lvbiAqLworCXU4IHJlc2VydmVkWzEyOF07CS8qIHBhZCBzaXplIHRvIDI1NiBieXRlcyAqLworfTsKKworLyoqCisgKiB2YnVzY2hhbm5lbF9zYW5pdGl6ZV9idWZmZXIoKSAtIHJlbW92ZSBub24tcHJpbnRhYmxlIGNoYXJzIGZyb20gYnVmZmVyCisgKiBAcDogZGVzdGluYXRpb24gYnVmZmVyIHdoZXJlIGNoYXJzIGFyZSB3cml0dGVuIHRvCisgKiBAcmVtYWluOiBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiBzdGFydGluZyBhdCAjcAorICogQHNyYzogcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisgKiBAc3JjbWF4OiBudW1iZXIgb2YgdmFsaWQgY2hhcmFjdGVycyBhdCAjc3JjCisgKgorICogUmVhZHMgY2hhcnMgZnJvbSB0aGUgYnVmZmVyIGF0IEBzcmMgZm9yIEBzcmNtYXggYnl0ZXMsIGFuZCB3cml0ZXMgdG8KKyAqIHRoZSBidWZmZXIgYXQgQHAsIHdoaWNoIGlzIEByZW1haW4gYnl0ZXMgbG9uZywgZW5zdXJpbmcgbmV2ZXIgdG8KKyAqIG92ZXJmbG93IHRoZSBidWZmZXIgYXQgQHAsIHVzaW5nIHRoZSBmb2xsb3dpbmcgcnVsZXM6CisgKiAtIHByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZSBzaW1wbHkgY29waWVkIGZyb20gdGhlIGJ1ZmZlciBhdCBAc3JjIHRvIHRoZQorICogICBidWZmZXIgYXQgQHAKKyAqIC0gaW50ZXJ2ZW5pbmcgc3RyZWFrcyBvZiBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gdGhlIGJ1ZmZlciBhdCBAc3JjCisgKiAgIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlIHNwYWNlIGluIHRoZSBidWZmZXIgYXQgQHAKKyAqIE5vdGUgdGhhdCB3ZSBwYXkgbm8gYXR0ZW50aW9uIHRvICdcMCctdGVybWluYXRpb24uCisgKgorICogUGFzcyBAcCA9PSBOVUxMIGFuZCBAcmVtYWluID09IDAgZm9yIHRoaXMgc3BlY2lhbCBiZWhhdmlvciAtLSBJbiB0aGlzCisgKiBjYXNlLCB3ZSBzaW1wbHkgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBXT1VMRCBIQVZFIGJlZW4gd3JpdHRlbgorICogdG8gYSBidWZmZXIgYXQgQHAsIGhhZCBpdCBiZWVuIGluZmluaXRlbHkgYmlnLgorICoKKyAqIFJldHVybjogdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIEBwIChvciBXT1VMRCBIQVZFIGJlZW4gd3JpdHRlbiB0bworICogICAgICAgICBAcCwgYXMgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit2YnVzY2hhbm5lbF9zYW5pdGl6ZV9idWZmZXIoY2hhciAqcCwgaW50IHJlbWFpbiwgY2hhciAqc3JjLCBpbnQgc3JjbWF4KQoreworCWludCBjaGFycyA9IDA7CisJaW50IG5vbnByaW50YWJsZV9zdHJlYWsgPSAwOworCisJd2hpbGUgKHNyY21heCA+IDApIHsKKwkJaWYgKCgqc3JjID49ICcgJykgJiYgKCpzcmMgPCAweDdmKSkgeworCQkJaWYgKG5vbnByaW50YWJsZV9zdHJlYWspIHsKKwkJCQlpZiAocmVtYWluID4gMCkgeworCQkJCQkqcCA9ICcgJzsKKwkJCQkJcCsrOworCQkJCQlyZW1haW4tLTsKKwkJCQkJY2hhcnMrKzsKKwkJCQl9IGVsc2UgaWYgKCFwKSB7CisJCQkJCWNoYXJzKys7CisJCQkJfQorCQkJCW5vbnByaW50YWJsZV9zdHJlYWsgPSAwOworCQkJfQorCQkJaWYgKHJlbWFpbiA+IDApIHsKKwkJCQkqcCA9ICpzcmM7CisJCQkJcCsrOworCQkJCXJlbWFpbi0tOworCQkJCWNoYXJzKys7CisJCQl9IGVsc2UgaWYgKCFwKSB7CisJCQkJY2hhcnMrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW5vbnByaW50YWJsZV9zdHJlYWsgPSAxOworCQl9CisJCXNyYysrOworCQlzcmNtYXgtLTsKKwl9CisJcmV0dXJuIGNoYXJzOworfQorCisjZGVmaW5lIFZCVVNDSEFOTkVMX0FEREFDSEFSKGNoLCBwLCByZW1haW4sIGNoYXJzKSBcCisJZG8gewkJCQkJICAgXAorCQlpZiAocmVtYWluIDw9IDApCQkgICBcCisJCQlicmVhazsJCQkgICBcCisJCSpwID0gY2g7CQkJICAgXAorCQlwKys7ICBjaGFycysrOyAgcmVtYWluLS07CSAgIFwKKwl9IHdoaWxlICgwKQorCisvKioKKyAqIHZidXNjaGFubmVsX2l0b2EoKSAtIGNvbnZlcnQgbm9uLW5lZ2F0aXZlIGludCB0byBzdHJpbmcKKyAqIEBwOiBkZXN0aW5hdGlvbiBzdHJpbmcKKyAqIEByZW1haW46IG1heCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiB0byBAcAorICogQG51bTogaW5wdXQgaW50IHRvIGNvbnZlcnQKKyAqCisgKiBDb252ZXJ0cyB0aGUgbm9uLW5lZ2F0aXZlIHZhbHVlIGF0IEBudW0gdG8gYW4gYXNjaWkgZGVjaW1hbCBzdHJpbmcKKyAqIGF0IEBwLCB3cml0aW5nIGF0IG1vc3QgQHJlbWFpbiBieXRlcy4gIE5vdGUgdGhlcmUgaXMgTk8gJ1wwJyB0ZXJtaW5hdGlvbgorICogd3JpdHRlbiB0byBAcC4KKyAqCisgKiBSZXR1cm46IG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIEBwCisgKgorICovCitzdGF0aWMgaW5saW5lIGludAordmJ1c2NoYW5uZWxfaXRvYShjaGFyICpwLCBpbnQgcmVtYWluLCBpbnQgbnVtKQoreworCWludCBkaWdpdHMgPSAwOworCWNoYXIgc1szMl07CisJaW50IGk7CisKKwlpZiAobnVtID09IDApIHsKKwkJLyogJzAnIGlzIGEgc3BlY2lhbCBjYXNlICovCisJCWlmIChyZW1haW4gPD0gMCkKKwkJCXJldHVybiAwOworCQkqcCA9ICcwJzsKKwkJcmV0dXJuIDE7CisJfQorCS8qIGZvcm0gYSBiYWNrd2FyZHMgZGVjaW1hbCBhc2NpaSBzdHJpbmcgaW4gPHM+ICovCisJd2hpbGUgKG51bSA+IDApIHsKKwkJaWYgKGRpZ2l0cyA+PSAoaW50KXNpemVvZihzKSkKKwkJCXJldHVybiAwOworCQlzW2RpZ2l0cysrXSA9IChudW0gJSAxMCkgKyAnMCc7CisJCW51bSA9IG51bSAvIDEwOworCX0KKwlpZiAocmVtYWluIDwgZGlnaXRzKSB7CisJCS8qIG5vdCBlbm91Z2ggcm9vbSBsZWZ0IGF0IDxwPiB0byBob2xkIG51bWJlciwgc28gZmlsbCB3aXRoCisJCSAqICc/JworCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IHJlbWFpbjsgaSsrLCBwKyspCisJCQkqcCA9ICc/JzsKKwkJcmV0dXJuIHJlbWFpbjsKKwl9CisJLyogcGx1ZyBpbiB0aGUgZGVjaW1hbCBhc2NpaSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIsIGJ5ICovCisJLyogcmV2ZXJzaW5nIHRoZSBzdHJpbmcgd2UganVzdCBidWlsdCBpbiA8cz4gKi8KKwlpID0gZGlnaXRzOworCXdoaWxlIChpID4gMCkgeworCQlpLS07CisJCSpwID0gc1tpXTsKKwkJcCsrOworCX0KKwlyZXR1cm4gZGlnaXRzOworfQorCisvKioKKyAqIHZidXNjaGFubmVsX2RldmluZm9fdG9fc3RyaW5nKCkgLSBmb3JtYXQgYSBzdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYSBwcmludGFibGUgc3RyaW5nCisgKiBAZGV2aW5mbzogdGhlIHN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gdG8gZm9ybWF0CisgKiBAcDogZGVzdGluYXRpb24gc3RyaW5nIGFyZWEKKyAqIEByZW1haW46IHNpemUgb2YgZGVzdGluYXRpb24gc3RyaW5nIGFyZWEgaW4gYnl0ZXMKKyAqIEBkZXZpeDogdGhlIGRldmljZSBpbmRleCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGRhdGEsIG9yIC0xIGlmIG5vCisgKiAgICAgICAgIGRldmljZSBpbmRleCBpcyB0byBiZSBpbmNsdWRlZAorICoKKyAqIFJlYWRzIEBkZXZJbmZvLCBhbmQgY29udmVydHMgaXRzIGNvbnRlbnRzIHRvIGEgcHJpbnRhYmxlIHN0cmluZyBhdCBAcCwKKyAqIHdyaXRpbmcgYXQgbW9zdCBAcmVtYWluIGJ5dGVzLiBOb3RlIHRoZXJlIGlzIE5PICdcMCcgdGVybWluYXRpb24KKyAqIHdyaXR0ZW4gdG8gQHAuCisgKgorICogUmV0dXJuOiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBAcAorICovCitzdGF0aWMgaW5saW5lIGludAordmJ1c2NoYW5uZWxfZGV2aW5mb190b19zdHJpbmcoc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyAqZGV2aW5mbywKKwkJCSAgICAgIGNoYXIgKnAsIGludCByZW1haW4sIGludCBkZXZpeCkKK3sKKwljaGFyICpwc3JjOworCWludCBuc3JjLCB4LCBpLCBwYWQ7CisJaW50IGNoYXJzID0gMDsKKworCXBzcmMgPSAmZGV2aW5mby0+ZGV2dHlwZVswXTsKKwluc3JjID0gc2l6ZW9mKGRldmluZm8tPmRldnR5cGUpOworCWlmICh2YnVzY2hhbm5lbF9zYW5pdGl6ZV9idWZmZXIoTlVMTCwgMCwgcHNyYywgbnNyYykgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBlbWl0IGRldmljZSBpbmRleCAqLworCWlmIChkZXZpeCA+PSAwKSB7CisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCdbJywgcCwgcmVtYWluLCBjaGFycyk7CisJCXggPSB2YnVzY2hhbm5lbF9pdG9hKHAsIHJlbWFpbiwgZGV2aXgpOworCQlwICs9IHg7CisJCXJlbWFpbiAtPSB4OworCQljaGFycyArPSB4OworCQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignXScsIHAsIHJlbWFpbiwgY2hhcnMpOworCX0gZWxzZSB7CisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisJfQorCisJLyogZW1pdCBkZXZpY2UgdHlwZSAqLworCXggPSB2YnVzY2hhbm5lbF9zYW5pdGl6ZV9idWZmZXIocCwgcmVtYWluLCBwc3JjLCBuc3JjKTsKKwlwICs9IHg7CisJcmVtYWluIC09IHg7CisJY2hhcnMgKz0geDsKKwlwYWQgPSAxNSAtIHg7CQkvKiBwYWQgZGV2aWNlIHR5cGUgdG8gYmUgZXhhY3RseSAxNSBjaGFycyAqLworCWZvciAoaSA9IDA7IGkgPCBwYWQ7IGkrKykKKwkJVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKKwlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOworCisJLyogZW1pdCBkcml2ZXIgbmFtZSAqLworCXBzcmMgPSAmZGV2aW5mby0+ZHJ2bmFtZVswXTsKKwluc3JjID0gc2l6ZW9mKGRldmluZm8tPmRydm5hbWUpOworCXggPSB2YnVzY2hhbm5lbF9zYW5pdGl6ZV9idWZmZXIocCwgcmVtYWluLCBwc3JjLCBuc3JjKTsKKwlwICs9IHg7CisJcmVtYWluIC09IHg7CisJY2hhcnMgKz0geDsKKwlwYWQgPSAxNSAtIHg7CQkvKiBwYWQgZHJpdmVyIG5hbWUgdG8gYmUgZXhhY3RseSAxNSBjaGFycyAqLworCWZvciAoaSA9IDA7IGkgPCBwYWQ7IGkrKykKKwkJVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKKwlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOworCisJLyogZW1pdCBzdHJpbmdzICovCisJcHNyYyA9ICZkZXZpbmZvLT5pbmZvc3Ryc1swXTsKKwluc3JjID0gc2l6ZW9mKGRldmluZm8tPmluZm9zdHJzKTsKKwl4ID0gdmJ1c2NoYW5uZWxfc2FuaXRpemVfYnVmZmVyKHAsIHJlbWFpbiwgcHNyYywgbnNyYyk7CisJcCArPSB4OworCXJlbWFpbiAtPSB4OworCWNoYXJzICs9IHg7CisJVkJVU0NIQU5ORUxfQUREQUNIQVIoJ1xuJywgcCwgcmVtYWluLCBjaGFycyk7CisKKwlyZXR1cm4gY2hhcnM7Cit9CisKIHN0cnVjdCBzcGFyX3ZidXNfaGVhZGVyaW5mbyB7CiAJdTMyIHN0cnVjdF9ieXRlczsJLyogc2l6ZSBvZiB0aGlzIHN0cnVjdCBpbiBieXRlcyAqLwogCXUzMiBkZXZpY2VfaW5mb19zdHJ1Y3RfYnl0ZXM7CS8qIHNpemVvZihVTFRSQV9WQlVTX0RFVklDRUlORk8pICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3ZidXNkZXZpY2VpbmZvLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3ZidXNkZXZpY2VpbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZGFiNGEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92YnVzZGV2aWNlaW5mby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAxMCAtIDIwMTUgVU5JU1lTIENPUlBPUkFUSU9OCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19WQlVTREVWSUNFSU5GT19IX18KLSNkZWZpbmUgX19WQlVTREVWSUNFSU5GT19IX18KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLSNwcmFnbWEgcGFjayhwdXNoLCAxKQkJLyogYm90aCBHQ0MgYW5kIFZDIG5vdyBhbGxvdyB0aGlzIHByYWdtYSAqLwotCi0vKiBBbiBhcnJheSBvZiB0aGlzIHN0cnVjdCBpcyBwcmVzZW50IGluIHRoZSBjaGFubmVsIGFyZWEgZm9yIGVhY2ggdmJ1cy4KLSAqIChTZWUgdmJ1c2NoYW5uZWwuaC4pCi0gKiBJdCBpcyBmaWxsZWQgaW4gYnkgdGhlIGNsaWVudCBzaWRlIHRvIHByb3ZpZGUgaW5mbyBhYm91dCB0aGUgZGV2aWNlCi0gKiBhbmQgZHJpdmVyIGZyb20gdGhlIGNsaWVudCdzIHBlcnNwZWN0aXZlLgotICovCi1zdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvIHsKLQl1OCBkZXZ0eXBlWzE2XTsJCS8qIHNob3J0IHN0cmluZyBpZGVudGlmeWluZyB0aGUgZGV2aWNlIHR5cGUgKi8KLQl1OCBkcnZuYW1lWzE2XTsJCS8qIGRyaXZlciAuc3lzIGZpbGUgbmFtZSAqLwotCXU4IGluZm9zdHJzWzk2XTsJLyogc2VxdWVuY2Ugb2YgdGFiLWRlbGltaXRlZCBpZCBzdHJpbmdzOiAqLwotCS8qIDxEUklWRVJfUkVWPiA8RFJJVkVSX1ZFUlRBRz4gPERSSVZFUl9DT01QSUxFVElNRT4gKi8KLQl1OCByZXNlcnZlZFsxMjhdOwkvKiBwYWQgc2l6ZSB0byAyNTYgYnl0ZXMgKi8KLX07Ci0KLSNwcmFnbWEgcGFjayhwb3ApCi0KLS8qIFJlYWRzIGNoYXJzIGZyb20gdGhlIGJ1ZmZlciBhdCA8c3JjPiBmb3IgPHNyY21heD4gYnl0ZXMsIGFuZCB3cml0ZXMgdG8KLSAqIHRoZSBidWZmZXIgYXQgPHA+LCB3aGljaCBpcyA8cmVtYWluPiBieXRlcyBsb25nLCBlbnN1cmluZyBuZXZlciB0bwotICogb3ZlcmZsb3cgdGhlIGJ1ZmZlciBhdCA8cD4sIHVzaW5nIHRoZSBmb2xsb3dpbmcgcnVsZXM6Ci0gKiAtIHByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZSBzaW1wbHkgY29waWVkIGZyb20gdGhlIGJ1ZmZlciBhdCA8c3JjPiB0byB0aGUKLSAqICAgYnVmZmVyIGF0IDxwPgotICogLSBpbnRlcnZlbmluZyBzdHJlYWtzIG9mIG5vbi1wcmludGFibGUgY2hhcmFjdGVycyBpbiB0aGUgYnVmZmVyIGF0IDxzcmM+Ci0gKiAgIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlIHNwYWNlIGluIHRoZSBidWZmZXIgYXQgPHA+Ci0gKiBOb3RlIHRoYXQgd2UgcGF5IG5vIGF0dGVudGlvbiB0byAnXDAnLXRlcm1pbmF0aW9uLgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gPHA+LgotICoKLSAqIFBhc3MgPHA+ID09IE5VTEwgYW5kIDxyZW1haW4+ID09IDAgZm9yIHRoaXMgc3BlY2lhbCBiZWhhdmlvci4gIEluIHRoaXMKLSAqIGNhc2UsIHdlIHNpbXBseSByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IFdPVUxEIEhBVkUgYmVlbiB3cml0dGVuCi0gKiB0byBhIGJ1ZmZlciBhdCA8cD4sIGhhZCBpdCBiZWVuIGluZmluaXRlbHkgYmlnLgotICovCi1zdGF0aWMgaW5saW5lIGludAotdmJ1c2NoYW5uZWxfc2FuaXRpemVfYnVmZmVyKGNoYXIgKnAsIGludCByZW1haW4sIGNoYXIgKnNyYywgaW50IHNyY21heCkKLXsKLQlpbnQgY2hhcnMgPSAwOwotCWludCBub25wcmludGFibGVfc3RyZWFrID0gMDsKLQotCXdoaWxlIChzcmNtYXggPiAwKSB7Ci0JCWlmICgoKnNyYyA+PSAnICcpICYmICgqc3JjIDwgMHg3ZikpIHsKLQkJCWlmIChub25wcmludGFibGVfc3RyZWFrKSB7Ci0JCQkJaWYgKHJlbWFpbiA+IDApIHsKLQkJCQkJKnAgPSAnICc7Ci0JCQkJCXArKzsKLQkJCQkJcmVtYWluLS07Ci0JCQkJCWNoYXJzKys7Ci0JCQkJfSBlbHNlIGlmICghcCkgewotCQkJCQljaGFycysrOwotCQkJCX0KLQkJCQlub25wcmludGFibGVfc3RyZWFrID0gMDsKLQkJCX0KLQkJCWlmIChyZW1haW4gPiAwKSB7Ci0JCQkJKnAgPSAqc3JjOwotCQkJCXArKzsKLQkJCQlyZW1haW4tLTsKLQkJCQljaGFycysrOwotCQkJfSBlbHNlIGlmICghcCkgewotCQkJCWNoYXJzKys7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlub25wcmludGFibGVfc3RyZWFrID0gMTsKLQkJfQotCQlzcmMrKzsKLQkJc3JjbWF4LS07Ci0JfQotCXJldHVybiBjaGFyczsKLX0KLQotI2RlZmluZSBWQlVTQ0hBTk5FTF9BRERBQ0hBUihjaCwgcCwgcmVtYWluLCBjaGFycykgXAotCWRvIHsJCQkJCSAgIFwKLQkJaWYgKHJlbWFpbiA8PSAwKQkJICAgXAotCQkJYnJlYWs7CQkJICAgXAotCQkqcCA9IGNoOwkJCSAgIFwKLQkJcCsrOyAgY2hhcnMrKzsgIHJlbWFpbi0tOwkgICBcCi0JfSB3aGlsZSAoMCkKLQotLyogQ29udmVydHMgdGhlIG5vbi1uZWdhdGl2ZSB2YWx1ZSBhdCA8bnVtPiB0byBhbiBhc2NpaSBkZWNpbWFsIHN0cmluZwotICogYXQgPHA+LCB3cml0aW5nIGF0IG1vc3QgPHJlbWFpbj4gYnl0ZXMuICBOb3RlIHRoZXJlIGlzIE5PICdcMCcgdGVybWluYXRpb24KLSAqIHdyaXR0ZW4gdG8gPHA+LgotICoKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIDxwPi4KLSAqCi0gKiBOb3RlIHRoYXQgd2UgY3JlYXRlIHRoaXMgZnVuY3Rpb24gYmVjYXVzZSB3ZSBuZWVkIHRvIGRvIHRoaXMgb3BlcmF0aW9uIGluCi0gKiBhbiBlbnZpcm9ubWVudC1pbmRlcGVuZGVudCB3YXkgKHNpbmNlIHdlIGFyZSBpbiBhIGNvbW1vbiBoZWFkZXIgZmlsZSkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci12YnVzY2hhbm5lbF9pdG9hKGNoYXIgKnAsIGludCByZW1haW4sIGludCBudW0pCi17Ci0JaW50IGRpZ2l0cyA9IDA7Ci0JY2hhciBzWzMyXTsKLQlpbnQgaTsKLQotCWlmIChudW0gPT0gMCkgewotCQkvKiAnMCcgaXMgYSBzcGVjaWFsIGNhc2UgKi8KLQkJaWYgKHJlbWFpbiA8PSAwKQotCQkJcmV0dXJuIDA7Ci0JCSpwID0gJzAnOwotCQlyZXR1cm4gMTsKLQl9Ci0JLyogZm9ybSBhIGJhY2t3YXJkcyBkZWNpbWFsIGFzY2lpIHN0cmluZyBpbiA8cz4gKi8KLQl3aGlsZSAobnVtID4gMCkgewotCQlpZiAoZGlnaXRzID49IChpbnQpc2l6ZW9mKHMpKQotCQkJcmV0dXJuIDA7Ci0JCXNbZGlnaXRzKytdID0gKG51bSAlIDEwKSArICcwJzsKLQkJbnVtID0gbnVtIC8gMTA7Ci0JfQotCWlmIChyZW1haW4gPCBkaWdpdHMpIHsKLQkJLyogbm90IGVub3VnaCByb29tIGxlZnQgYXQgPHA+IHRvIGhvbGQgbnVtYmVyLCBzbyBmaWxsIHdpdGgKLQkJICogJz8nCi0JCSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgcmVtYWluOyBpKyssIHArKykKLQkJCSpwID0gJz8nOwotCQlyZXR1cm4gcmVtYWluOwotCX0KLQkvKiBwbHVnIGluIHRoZSBkZWNpbWFsIGFzY2lpIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG51bWJlciwgYnkgKi8KLQkvKiByZXZlcnNpbmcgdGhlIHN0cmluZyB3ZSBqdXN0IGJ1aWx0IGluIDxzPiAqLwotCWkgPSBkaWdpdHM7Ci0Jd2hpbGUgKGkgPiAwKSB7Ci0JCWktLTsKLQkJKnAgPSBzW2ldOwotCQlwKys7Ci0JfQotCXJldHVybiBkaWdpdHM7Ci19Ci0KLS8qIFJlYWRzIDxkZXZJbmZvPiwgYW5kIGNvbnZlcnRzIGl0cyBjb250ZW50cyB0byBhIHByaW50YWJsZSBzdHJpbmcgYXQgPHA+LAotICogd3JpdGluZyBhdCBtb3N0IDxyZW1haW4+IGJ5dGVzLiAgTm90ZSB0aGVyZSBpcyBOTyAnXDAnIHRlcm1pbmF0aW9uCi0gKiB3cml0dGVuIHRvIDxwPi4KLSAqCi0gKiBQYXNzIDxkZXZpeD4gPj0gMCBpZiB5b3Ugd2FudCBhIGRldmljZSBpbmRleCBwcmVzZW50ZWQuCi0gKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gPHA+LgotICovCi1zdGF0aWMgaW5saW5lIGludAotdmJ1c2NoYW5uZWxfZGV2aW5mb190b19zdHJpbmcoc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyAqZGV2aW5mbywKLQkJCSAgICAgIGNoYXIgKnAsIGludCByZW1haW4sIGludCBkZXZpeCkKLXsKLQljaGFyICpwc3JjOwotCWludCBuc3JjLCB4LCBpLCBwYWQ7Ci0JaW50IGNoYXJzID0gMDsKLQotCXBzcmMgPSAmZGV2aW5mby0+ZGV2dHlwZVswXTsKLQluc3JjID0gc2l6ZW9mKGRldmluZm8tPmRldnR5cGUpOwotCWlmICh2YnVzY2hhbm5lbF9zYW5pdGl6ZV9idWZmZXIoTlVMTCwgMCwgcHNyYywgbnNyYykgPD0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBlbWl0IGRldmljZSBpbmRleCAqLwotCWlmIChkZXZpeCA+PSAwKSB7Ci0JCVZCVVNDSEFOTkVMX0FEREFDSEFSKCdbJywgcCwgcmVtYWluLCBjaGFycyk7Ci0JCXggPSB2YnVzY2hhbm5lbF9pdG9hKHAsIHJlbWFpbiwgZGV2aXgpOwotCQlwICs9IHg7Ci0JCXJlbWFpbiAtPSB4OwotCQljaGFycyArPSB4OwotCQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignXScsIHAsIHJlbWFpbiwgY2hhcnMpOwotCX0gZWxzZSB7Ci0JCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7Ci0JCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7Ci0JCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7Ci0JfQotCi0JLyogZW1pdCBkZXZpY2UgdHlwZSAqLwotCXggPSB2YnVzY2hhbm5lbF9zYW5pdGl6ZV9idWZmZXIocCwgcmVtYWluLCBwc3JjLCBuc3JjKTsKLQlwICs9IHg7Ci0JcmVtYWluIC09IHg7Ci0JY2hhcnMgKz0geDsKLQlwYWQgPSAxNSAtIHg7CQkvKiBwYWQgZGV2aWNlIHR5cGUgdG8gYmUgZXhhY3RseSAxNSBjaGFycyAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWQ7IGkrKykKLQkJVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKLQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOwotCi0JLyogZW1pdCBkcml2ZXIgbmFtZSAqLwotCXBzcmMgPSAmZGV2aW5mby0+ZHJ2bmFtZVswXTsKLQluc3JjID0gc2l6ZW9mKGRldmluZm8tPmRydm5hbWUpOwotCXggPSB2YnVzY2hhbm5lbF9zYW5pdGl6ZV9idWZmZXIocCwgcmVtYWluLCBwc3JjLCBuc3JjKTsKLQlwICs9IHg7Ci0JcmVtYWluIC09IHg7Ci0JY2hhcnMgKz0geDsKLQlwYWQgPSAxNSAtIHg7CQkvKiBwYWQgZHJpdmVyIG5hbWUgdG8gYmUgZXhhY3RseSAxNSBjaGFycyAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWQ7IGkrKykKLQkJVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKLQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOwotCi0JLyogZW1pdCBzdHJpbmdzICovCi0JcHNyYyA9ICZkZXZpbmZvLT5pbmZvc3Ryc1swXTsKLQluc3JjID0gc2l6ZW9mKGRldmluZm8tPmluZm9zdHJzKTsKLQl4ID0gdmJ1c2NoYW5uZWxfc2FuaXRpemVfYnVmZmVyKHAsIHJlbWFpbiwgcHNyYywgbnNyYyk7Ci0JcCArPSB4OwotCXJlbWFpbiAtPSB4OwotCWNoYXJzICs9IHg7Ci0JVkJVU0NIQU5ORUxfQUREQUNIQVIoJ1xuJywgcCwgcmVtYWluLCBjaGFycyk7Ci0KLQlyZXR1cm4gY2hhcnM7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92aXNvcmJ1c19tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yYnVzX21haW4uYwppbmRleCBkMzJiODk4Li5mZWMwYTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yYnVzX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yYnVzX21haW4uYwpAQCAtMTgsNjIgKzE4LDIyIEBACiAKICNpbmNsdWRlICJ2aXNvcmJ1cy5oIgogI2luY2x1ZGUgInZpc29yYnVzX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0jaW5jbHVkZSAicGVyaW9kaWNfd29yay5oIgotI2luY2x1ZGUgInZidXNjaGFubmVsLmgiCi0jaW5jbHVkZSAiZ3Vlc3RsaW51eGRlYnVnLmgiCiAjaW5jbHVkZSAidm1jYWxsaW50ZXJmYWNlLmgiCiAKICNkZWZpbmUgTVlEUlZOQU1FICJ2aXNvcmJ1cyIKIAogLyogbW9kdWxlIHBhcmFtZXRlcnMgKi8KLXN0YXRpYyBpbnQgdmlzb3JidXNfZGVidWc7CiBzdGF0aWMgaW50IHZpc29yYnVzX2ZvcmNlbWF0Y2g7CiBzdGF0aWMgaW50IHZpc29yYnVzX2ZvcmNlbm9tYXRjaDsKLXN0YXRpYyBpbnQgdmlzb3JidXNfZGVidWdyZWY7Ci0jZGVmaW5lIFNFUklBTExPT1BCQUNLQ0hBTkFERFIgKDEwMCAqIDEwMjQgKiAxMDI0KQogCiAvKiBEaXNwbGF5IHN0cmluZyB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgbm8gbG9uZ2VyIHRoZSA5OSBjaGFyYWN0ZXJzKi8KICNkZWZpbmUgTElORVNJWkUgOTkKIAogI2RlZmluZSBDVVJSRU5UX0ZJTEVfUEMgVklTT1JfQlVTX1BDX3Zpc29yYnVzX21haW5fYwotI2RlZmluZSBQT0xMSklGRklFU19URVNUV09SSyAgICAgICAgIDEwMAogI2RlZmluZSBQT0xMSklGRklFU19OT1JNQUxDSEFOTkVMICAgICAxMAogCiBzdGF0aWMgaW50IGJ1c3JlZ19yYyA9IC1FTk9ERVY7IC8qIHN0b3JlcyB0aGUgcmVzdWx0IGZyb20gYnVzIHJlZ2lzdHJhdGlvbiAqLwogCi1zdGF0aWMgaW50IHZpc29yYnVzX3VldmVudChzdHJ1Y3QgZGV2aWNlICp4ZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpOwotc3RhdGljIGludCB2aXNvcmJ1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICp4ZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqeGRydik7Ci1zdGF0aWMgdm9pZCBmaXhfdmJ1c19kZXZfaW5mbyhzdHJ1Y3Qgdmlzb3JfZGV2aWNlICp2aXNvcmRldik7Ci0KLS8qICBCVVMgdHlwZSBhdHRyaWJ1dGVzCi0gKgotICogIGRlZmluZSAmIGltcGxlbWVudCBkaXNwbGF5IG9mIGJ1cyBhdHRyaWJ1dGVzIHVuZGVyCi0gKiAgL3N5cy9idXMvdmlzb3JidXMuCi0gKgotICovCi0KLXN0YXRpYyBzc2l6ZV90IHZlcnNpb25fc2hvdyhzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywgY2hhciAqYnVmKQotewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBWRVJTSU9OKTsKLX0KLQotc3RhdGljIEJVU19BVFRSX1JPKHZlcnNpb24pOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdmlzb3JidXNfYnVzX2F0dHJzW10gPSB7Ci0JJmJ1c19hdHRyX3ZlcnNpb24uYXR0ciwKLQlOVUxMLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdmlzb3JidXNfYnVzX2dyb3VwID0gewotCS5hdHRycyA9IHZpc29yYnVzX2J1c19hdHRycywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICp2aXNvcmJ1c19idXNfZ3JvdXBzW10gPSB7Ci0JJnZpc29yYnVzX2J1c19ncm91cCwKLQlOVUxMLAotfTsKLQogLyoKICAqIERFVklDRSB0eXBlIGF0dHJpYnV0ZXMKICAqCkBAIC0xMDYsNjEgKzY2LDE0IEBACiAJTlVMTCwKIH07CiAKLS8qKiBUaGlzIGRlc2NyaWJlcyB0aGUgVFlQRSBvZiBidXMuCi0gKiAgKERvbid0IGNvbmZ1c2UgdGhpcyB3aXRoIGFuIElOU1RBTkNFIG9mIHRoZSBidXMuKQotICovCi1zdHJ1Y3QgYnVzX3R5cGUgdmlzb3JidXNfdHlwZSA9IHsKLQkubmFtZSA9ICJ2aXNvcmJ1cyIsCi0JLm1hdGNoID0gdmlzb3JidXNfbWF0Y2gsCi0JLnVldmVudCA9IHZpc29yYnVzX3VldmVudCwKLQkuZGV2X2dyb3VwcyA9IHZpc29yYnVzX2Rldl9ncm91cHMsCi0JLmJ1c19ncm91cHMgPSB2aXNvcmJ1c19idXNfZ3JvdXBzLAotfTsKLQotc3RhdGljIHN0cnVjdCBkZWxheWVkX3dvcmsgcGVyaW9kaWNfd29yazsKLQotLyogWUVTLCB3ZSBuZWVkIDIgd29ya3F1ZXVlcy4KLSAqIFRoZSByZWFzb24gaXMsIHdvcmtpdGVtcyBvbiB0aGUgdGVzdCBxdWV1ZSBtYXkgbmVlZCB0byBjYW5jZWwKLSAqIHdvcmtpdGVtcyBvbiB0aGUgb3RoZXIgcXVldWUuICBZb3Ugd2lsbCBiZSBpbiBmb3IgdHJvdWJsZSBpZiB5b3UgdHJ5IHRvCi0gKiBkbyB0aGlzIHdpdGggd29ya2l0ZW1zIHF1ZXVlZCBvbiB0aGUgc2FtZSB3b3JrcXVldWUuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcGVyaW9kaWNfdGVzdF93b3JrcXVldWU7Ci1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnBlcmlvZGljX2Rldl93b3JrcXVldWU7Ci1zdGF0aWMgbG9uZyBsb25nIGJ1c19jb3VudDsJLyoqIG51bWJlciBvZiBidXMgaW5zdGFuY2VzICovCi0JCQkJCS8qKiBldmVyLWluY3JlYXNpbmcgKi8KLQotc3RhdGljIHZvaWQgY2hpcHNldF9idXNfY3JlYXRlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmJ1c19pbmZvKTsKLXN0YXRpYyB2b2lkIGNoaXBzZXRfYnVzX2Rlc3Ryb3koc3RydWN0IHZpc29yX2RldmljZSAqYnVzX2luZm8pOwotc3RhdGljIHZvaWQgY2hpcHNldF9kZXZpY2VfY3JlYXRlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvKTsKLXN0YXRpYyB2b2lkIGNoaXBzZXRfZGV2aWNlX2Rlc3Ryb3koc3RydWN0IHZpc29yX2RldmljZSAqZGV2X2luZm8pOwotc3RhdGljIHZvaWQgY2hpcHNldF9kZXZpY2VfcGF1c2Uoc3RydWN0IHZpc29yX2RldmljZSAqZGV2X2luZm8pOwotc3RhdGljIHZvaWQgY2hpcHNldF9kZXZpY2VfcmVzdW1lKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvKTsKLQotLyoqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgaGVyZWluLCBhbmQgYXJlIGNhbGxlZCBieSB0aGUgY2hpcHNldAotICogIGRyaXZlciB0byBub3RpZnkgdXMgYWJvdXQgc3BlY2lmaWMgZXZlbnRzLgotICovCi1zdGF0aWMgc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfbm90aWZpZXJzIGNoaXBzZXRfbm90aWZpZXJzID0gewotCS5idXNfY3JlYXRlID0gY2hpcHNldF9idXNfY3JlYXRlLAotCS5idXNfZGVzdHJveSA9IGNoaXBzZXRfYnVzX2Rlc3Ryb3ksCi0JLmRldmljZV9jcmVhdGUgPSBjaGlwc2V0X2RldmljZV9jcmVhdGUsCi0JLmRldmljZV9kZXN0cm95ID0gY2hpcHNldF9kZXZpY2VfZGVzdHJveSwKLQkuZGV2aWNlX3BhdXNlID0gY2hpcHNldF9kZXZpY2VfcGF1c2UsCi0JLmRldmljZV9yZXN1bWUgPSBjaGlwc2V0X2RldmljZV9yZXN1bWUsCi19OwotCi0vKiogVGhlc2UgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGUgY2hpcHNldCBkcml2ZXIsIGFuZCB3ZSBjYWxsIHRoZW0KLSAqICBoZXJlaW4gd2hlbiB3ZSB3YW50IHRvIGFja25vd2xlZGdlIGEgc3BlY2lmaWMgZXZlbnQuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c2Rldl9yZXNwb25kZXJzIGNoaXBzZXRfcmVzcG9uZGVyczsKLQogLyogZmlsbGVkIGluIHdpdGggaW5mbyBhYm91dCBwYXJlbnQgY2hpcHNldCBkcml2ZXIgd2hlbiB3ZSByZWdpc3RlciB3aXRoIGl0ICovCiBzdGF0aWMgc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyBjaGlwc2V0X2RyaXZlcmluZm87CiAvKiBmaWxsZWQgaW4gd2l0aCBpbmZvIGFib3V0IHRoaXMgZHJpdmVyLCB3cnQgaXQgc2VydmljaW5nIGNsaWVudCBidXNzZXMgKi8KIHN0YXRpYyBzdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvIGNsaWVudGJ1c19kcml2ZXJpbmZvOwogCi0vKiogbGlzdCBvZiB2aXNvcl9kZXZpY2Ugc3RydWN0cywgbGlua2VkIHZpYSAubGlzdF9hbGwgKi8KKy8qIGxpc3Qgb2Ygdmlzb3JfZGV2aWNlIHN0cnVjdHMsIGxpbmtlZCB2aWEgLmxpc3RfYWxsICovCiBzdGF0aWMgTElTVF9IRUFEKGxpc3RfYWxsX2J1c19pbnN0YW5jZXMpOwotLyoqIGxpc3Qgb2Ygdmlzb3JfZGV2aWNlIHN0cnVjdHMsIGxpbmtlZCB2aWEgLmxpc3RfYWxsICovCisvKiBsaXN0IG9mIHZpc29yX2RldmljZSBzdHJ1Y3RzLCBsaW5rZWQgdmlhIC5saXN0X2FsbCAqLwogc3RhdGljIExJU1RfSEVBRChsaXN0X2FsbF9kZXZpY2VfaW5zdGFuY2VzKTsKIAogc3RhdGljIGludApAQCAtMTc3LDkgKzkwLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgdXBvbiBhZGRpbmcgYSB2aXNvcl9kZXZpY2UgKGRldmljZV9hZGQpLCBvcgotICogYWRkaW5nIGEgdmlzb3JfZHJpdmVyICh2aXNvcmJ1c19yZWdpc3Rlcl92aXNvcl9kcml2ZXIpLCBhbmQgcmV0dXJucyAxIGlmZiB0aGUKLSAqIHByb3ZpZGVkIGRyaXZlciBjYW4gY29udHJvbCB0aGUgc3BlY2lmaWVkIGRldmljZS4KKy8qKgorICogdmlzb3JidXNfbWF0Y2goKSAtIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHVwb24gYWRkaW5nIGEgdmlzb3JfZGV2aWNlCisgKiAgICAgICAgICAgICAgICAgICAgKGRldmljZV9hZGQpLCBvciBhZGRpbmcgYSB2aXNvcl9kcml2ZXIKKyAqICAgICAgICAgICAgICAgICAgICAodmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKQorICogQHhkZXY6IHN0cnVjdCBkZXZpY2UgZm9yIHRoZSBkZXZpY2UgYmVpbmcgbWF0Y2hlZAorICogQHhkcnY6IHN0cnVjdCBkZXZpY2VfZHJpdmVyIGZvciBkcml2ZXIgdG8gbWF0Y2ggZGV2aWNlIGFnYWluc3QKKyAqCisgKiBSZXR1cm46IDEgaWZmIHRoZSBwcm92aWRlZCBkcml2ZXIgY2FuIGNvbnRyb2wgdGhlIHNwZWNpZmllZCBkZXZpY2UKICAqLwogc3RhdGljIGludAogdmlzb3JidXNfbWF0Y2goc3RydWN0IGRldmljZSAqeGRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKnhkcnYpCkBAIC0yMTEsOSArMTI5LDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGRldmljZV91bnJlZ2lzdGVyKCkgaXMgY2FsbGVkIGZvciB0aGUgYnVzIGRldmljZQotICogIGluc3RhbmNlLCBhZnRlciBhbGwgb3RoZXIgdGFza3MgaW52b2x2ZWQgd2l0aCBkZXN0cm95aW5nIHRoZSBkZXZpY2UKLSAqICBhcmUgY29tcGxldGUuCisvKgorICogVGhpcyBkZXNjcmliZXMgdGhlIFRZUEUgb2YgYnVzLgorICogIChEb24ndCBjb25mdXNlIHRoaXMgd2l0aCBhbiBJTlNUQU5DRSBvZiB0aGUgYnVzLikKKyAqLworc3RydWN0IGJ1c190eXBlIHZpc29yYnVzX3R5cGUgPSB7CisJLm5hbWUgPSAidmlzb3JidXMiLAorCS5tYXRjaCA9IHZpc29yYnVzX21hdGNoLAorCS51ZXZlbnQgPSB2aXNvcmJ1c191ZXZlbnQsCisJLmRldl9ncm91cHMgPSB2aXNvcmJ1c19kZXZfZ3JvdXBzLAorfTsKKworLyoqCisgKiB2aXNvcmJ1c19yZWxlYWVfYnVzZGV2aWNlKCkgLSBjYWxsZWQgd2hlbiBkZXZpY2VfdW5yZWdpc3RlcigpIGlzIGNhbGxlZCBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBidXMgZGV2aWNlIGluc3RhbmNlLCBhZnRlciBhbGwgb3RoZXIgdGFza3MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9sdmVkIHdpdGggZGVzdHJveWluZyB0aGUgZGV2IGFyZSBjb21wbGV0ZQorICogQHhkZXY6IHN0cnVjdCBkZXZpY2UgZm9yIHRoZSBidXMgYmVpbmcgcmVsZWFzZWQKICAqLwogc3RhdGljIHZvaWQKIHZpc29yYnVzX3JlbGVhc2VfYnVzZGV2aWNlKHN0cnVjdCBkZXZpY2UgKnhkZXYpCkBAIC0yMjMsMTggKzE1NCwxNiBAQAogCWtmcmVlKGRldik7CiB9CiAKLS8qKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGRldmljZV91bnJlZ2lzdGVyKCkgaXMgY2FsbGVkIGZvciBlYWNoIGNoaWxkCi0gKiAgZGV2aWNlIGluc3RhbmNlLgorLyoqCisgKiB2aXNvcmJ1c19yZWxlYXNlX2RldmljZSgpIC0gY2FsbGVkIHdoZW4gZGV2aWNlX3VucmVnaXN0ZXIoKSBpcyBjYWxsZWQgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBjaGlsZCBkZXZpY2UgaW5zdGFuY2UKKyAqIEB4ZGV2OiBzdHJ1Y3QgZGV2aWNlIGZvciB0aGUgdmlzb3IgZGV2aWNlIGJlaW5nIHJlbGVhc2VkCiAgKi8KIHN0YXRpYyB2b2lkCiB2aXNvcmJ1c19yZWxlYXNlX2RldmljZShzdHJ1Y3QgZGV2aWNlICp4ZGV2KQogewogCXN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldiA9IHRvX3Zpc29yX2RldmljZSh4ZGV2KTsKIAotCWlmIChkZXYtPnBlcmlvZGljX3dvcmspIHsKLQkJdmlzb3JfcGVyaW9kaWNfd29ya19kZXN0cm95KGRldi0+cGVyaW9kaWNfd29yayk7Ci0JCWRldi0+cGVyaW9kaWNfd29yayA9IE5VTEw7Ci0JfQogCWlmIChkZXYtPnZpc29yY2hhbm5lbCkgewogCQl2aXNvcmNoYW5uZWxfZGVzdHJveShkZXYtPnZpc29yY2hhbm5lbCk7CiAJCWRldi0+dmlzb3JjaGFubmVsID0gTlVMTDsKQEAgLTI0Miw5ICsxNzEsMTEgQEAKIAlrZnJlZShkZXYpOwogfQogCi0vKiBiZWdpbiBpbXBsZW1lbnRhdGlvbiBvZiBzcGVjaWZpYyBjaGFubmVsIGF0dHJpYnV0ZXMgdG8gYXBwZWFyIHVuZGVyCi0qIC9zeXMvYnVzL3Zpc29yYnVzPHg+L2Rldjx5Pi9jaGFubmVsCi0qLworLyoKKyAqIGJlZ2luIGltcGxlbWVudGF0aW9uIG9mIHNwZWNpZmljIGNoYW5uZWwgYXR0cmlidXRlcyB0byBhcHBlYXIgdW5kZXIKKyAqIC9zeXMvYnVzL3Zpc29yYnVzPHg+L2Rldjx5Pi9jaGFubmVsCisgKi8KKwogc3RhdGljIHNzaXplX3QgcGh5c2FkZHJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJICAgICBjaGFyICpidWYpCiB7CkBAIC0zNDksMTUgKzI4MCwxMSBAQAogCiAvKiBlbmQgaW1wbGVtZW50YXRpb24gb2Ygc3BlY2lmaWMgY2hhbm5lbCBhdHRyaWJ1dGVzICovCiAKLS8qICBCVVMgaW5zdGFuY2UgYXR0cmlidXRlcworLyoKKyAqICBCVVMgaW5zdGFuY2UgYXR0cmlidXRlcwogICoKICAqICBkZWZpbmUgJiBpbXBsZW1lbnQgZGlzcGxheSBvZiBidXMgYXR0cmlidXRlcyB1bmRlcgotICogIC9zeXMvYnVzL3Zpc29yYnVzL2J1c3Nlcy92aXNvcmJ1czxuPi4KLSAqCi0gKiAgVGhpcyBpcyBhIGJpdCBob2FreSBiZWNhdXNlIHRoZSBrZXJuZWwgZG9lcyBub3QgeWV0IGhhdmUgdGhlIGluZnJhc3RydWN0dXJlCi0gKiAgdG8gc2VwYXJhdGUgYnVzIElOU1RBTkNFIGF0dHJpYnV0ZXMgZnJvbSBidXMgVFlQRSBhdHRyaWJ1dGVzLi4uCi0gKiAgc28gd2Ugcm9sbCBvdXIgb3duLiAgU2VlIGJ1c2luc3QuYyAvIGJ1c2luc3QuaC4KLSAqCisgKiAgL3N5cy9idXMvdmlzb3JidXMvZGV2aWNlcy92aXNvcmJ1czxuPi4KICAqLwogCiBzdGF0aWMgc3NpemVfdCBwYXJ0aXRpb25faGFuZGxlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LApAQCAtNDM0LDggKzM2MSw4IEBACiAJCWlmICh2ZGV2LT5uYW1lKQogCQkJcGFydGl0aW9uX25hbWUgPSB2ZGV2LT5uYW1lOwogCQlzaGlmdCA9IHNucHJpbnRmKHBvcywgcmVtYWluLAotCQkJCSAiQ2xpZW50IGRldmljZSAvIGNsaWVudCBkcml2ZXIgaW5mbyBmb3IgJXMgZWFydGl0aW9uICh2YnVzICMlZCk6XG4iLAotCQkJCSBwYXJ0aXRpb25fbmFtZSwgdmRldi0+Y2hpcHNldF9kZXZfbm8pOworCQkJCSAiQ2xpZW50IGRldmljZSAvIGNsaWVudCBkcml2ZXIgaW5mbyBmb3IgJXMgcGFydGl0aW9uICh2YnVzICMldSk6XG4iLAorCQkJCSBwYXJ0aXRpb25fbmFtZSwgdmRldi0+Y2hpcHNldF9idXNfbm8pOwogCQlwb3MgKz0gc2hpZnQ7CiAJCXJlbWFpbiAtPSBzaGlmdDsKIAkJc2hpZnQgPSB2aXNvcmNoYW5uZWxfcmVhZChjaGFubmVsLApAQCAtNTA4LDEwMyArNDM1LDQ4IEBACiAJCU5VTEwKIH07CiAKLS8qICBEUklWRVIgYXR0cmlidXRlcwotICoKLSAqICBkZWZpbmUgJiBpbXBsZW1lbnQgZGlzcGxheSBvZiBkcml2ZXIgYXR0cmlidXRlcyB1bmRlcgotICogIC9zeXMvYnVzL3Zpc29yYnVzL2RyaXZlcnMvPGRyaXZlcm5hbWU+LgotICoKLSAqLwotCi1zdGF0aWMgc3NpemVfdAotRFJJVkVSX0FUVFJfdmVyc2lvbihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqeGRydiwgY2hhciAqYnVmKQotewotCXN0cnVjdCB2aXNvcl9kcml2ZXIgKmRydiA9IHRvX3Zpc29yX2RyaXZlcih4ZHJ2KTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBkcnYtPnZlcnNpb24pOwotfQotCi1zdGF0aWMgaW50Ci1yZWdpc3Rlcl9kcml2ZXJfYXR0cmlidXRlcyhzdHJ1Y3Qgdmlzb3JfZHJpdmVyICpkcnYpCi17Ci0Jc3RydWN0IGRyaXZlcl9hdHRyaWJ1dGUgdmVyc2lvbiA9Ci0JICAgIF9fQVRUUih2ZXJzaW9uLCBTX0lSVUdPLCBEUklWRVJfQVRUUl92ZXJzaW9uLCBOVUxMKTsKLQlkcnYtPnZlcnNpb25fYXR0ciA9IHZlcnNpb247Ci0JcmV0dXJuIGRyaXZlcl9jcmVhdGVfZmlsZSgmZHJ2LT5kcml2ZXIsICZkcnYtPnZlcnNpb25fYXR0cik7Ci19Ci0KIHN0YXRpYyB2b2lkCi11bnJlZ2lzdGVyX2RyaXZlcl9hdHRyaWJ1dGVzKHN0cnVjdCB2aXNvcl9kcml2ZXIgKmRydikKK2Rldl9wZXJpb2RpY193b3JrKHVuc2lnbmVkIGxvbmcgX19vcGFxdWUpCiB7Ci0JZHJpdmVyX3JlbW92ZV9maWxlKCZkcnYtPmRyaXZlciwgJmRydi0+dmVyc2lvbl9hdHRyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRldl9wZXJpb2RpY193b3JrKHZvaWQgKnhkZXYpCi17Ci0Jc3RydWN0IHZpc29yX2RldmljZSAqZGV2ID0geGRldjsKKwlzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYgPSAoc3RydWN0IHZpc29yX2RldmljZSAqKV9fb3BhcXVlOwogCXN0cnVjdCB2aXNvcl9kcml2ZXIgKmRydiA9IHRvX3Zpc29yX2RyaXZlcihkZXYtPmRldmljZS5kcml2ZXIpOwogCi0JZG93bigmZGV2LT52aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrKTsKIAlpZiAoZHJ2LT5jaGFubmVsX2ludGVycnVwdCkKIAkJZHJ2LT5jaGFubmVsX2ludGVycnVwdChkZXYpOwotCXVwKCZkZXYtPnZpc29yZHJpdmVyX2NhbGxiYWNrX2xvY2spOwotCWlmICghdmlzb3JfcGVyaW9kaWNfd29ya19uZXh0cGVyaW9kKGRldi0+cGVyaW9kaWNfd29yaykpCi0JCXB1dF9kZXZpY2UoJmRldi0+ZGV2aWNlKTsKKwltb2RfdGltZXIoJmRldi0+dGltZXIsIGppZmZpZXMgKyBQT0xMSklGRklFU19OT1JNQUxDSEFOTkVMKTsKIH0KIAogc3RhdGljIHZvaWQKIGRldl9zdGFydF9wZXJpb2RpY193b3JrKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldikKIHsKLQlpZiAoZGV2LT5iZWluZ19yZW1vdmVkKQorCWlmIChkZXYtPmJlaW5nX3JlbW92ZWQgfHwgZGV2LT50aW1lcl9hY3RpdmUpCiAJCXJldHVybjsKIAkvKiBub3cgdXAgYnkgYXQgbGVhc3QgMiAqLwogCWdldF9kZXZpY2UoJmRldi0+ZGV2aWNlKTsKLQlpZiAoIXZpc29yX3BlcmlvZGljX3dvcmtfc3RhcnQoZGV2LT5wZXJpb2RpY193b3JrKSkKLQkJcHV0X2RldmljZSgmZGV2LT5kZXZpY2UpOworCWRldi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBQT0xMSklGRklFU19OT1JNQUxDSEFOTkVMOworCWFkZF90aW1lcigmZGV2LT50aW1lcik7CisJZGV2LT50aW1lcl9hY3RpdmUgPSB0cnVlOwogfQogCiBzdGF0aWMgdm9pZAogZGV2X3N0b3BfcGVyaW9kaWNfd29yayhzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYpCiB7Ci0JaWYgKHZpc29yX3BlcmlvZGljX3dvcmtfc3RvcChkZXYtPnBlcmlvZGljX3dvcmspKQotCQlwdXRfZGV2aWNlKCZkZXYtPmRldmljZSk7CisJaWYgKCFkZXYtPnRpbWVyX2FjdGl2ZSkKKwkJcmV0dXJuOworCWRlbF90aW1lcl9zeW5jKCZkZXYtPnRpbWVyKTsKKwlkZXYtPnRpbWVyX2FjdGl2ZSA9IGZhbHNlOworCXB1dF9kZXZpY2UoJmRldi0+ZGV2aWNlKTsKIH0KIAotLyoqIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgdXBvbiBhZGRpbmcgYSB2aXNvcl9kZXZpY2UgKGRldmljZV9hZGQpLCBvcgotICogIGFkZGluZyBhIHZpc29yX2RyaXZlciAodmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKSwgYnV0IG9ubHkgYWZ0ZXIKLSAqICB2aXNvcmJ1c19tYXRjaCBoYXMgcmV0dXJuZWQgMSB0byBpbmRpY2F0ZSBhIHN1Y2Nlc3NmdWwgbWF0Y2ggYmV0d2VlbgotICogIGRyaXZlciBhbmQgZGV2aWNlLgotICovCi1zdGF0aWMgaW50Ci12aXNvcmRyaXZlcl9wcm9iZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqeGRldikKLXsKLQlpbnQgcmVzOwotCXN0cnVjdCB2aXNvcl9kcml2ZXIgKmRydjsKLQlzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXY7Ci0KLQlkcnYgPSB0b192aXNvcl9kcml2ZXIoeGRldi0+ZHJpdmVyKTsKLQlkZXYgPSB0b192aXNvcl9kZXZpY2UoeGRldik7Ci0KLQlpZiAoIWRydi0+cHJvYmUpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZG93bigmZGV2LT52aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrKTsKLQlkZXYtPmJlaW5nX3JlbW92ZWQgPSBmYWxzZTsKLQotCXJlcyA9IGRydi0+cHJvYmUoZGV2KTsKLQlpZiAocmVzID49IDApIHsKLQkJLyogc3VjY2VzczogcmVmZXJlbmNlIGtlcHQgdmlhIHVubWF0Y2hlZCBnZXRfZGV2aWNlKCkgKi8KLQkJZ2V0X2RldmljZSgmZGV2LT5kZXZpY2UpOwotCQlmaXhfdmJ1c19kZXZfaW5mbyhkZXYpOwotCX0KLQotCXVwKCZkZXYtPnZpc29yZHJpdmVyX2NhbGxiYWNrX2xvY2spOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGRldmljZV91bnJlZ2lzdGVyKCkgaXMgY2FsbGVkIGZvciBlYWNoIGNoaWxkIGRldmljZQotICogIGluc3RhbmNlLCB0byBub3RpZnkgdGhlIGFwcHJvcHJpYXRlIHZpc29yYnVzX2RyaXZlciB0aGF0IHRoZSBkZXZpY2UgaXMKLSAqICBnb2luZyBhd2F5LCBhbmQgdG8gZGVjcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgZGV2aWNlLgorLyoqCisgKiB2aXNvcmRyaXZlcl9yZW1vdmVfZGV2aWNlKCkgLSBoYW5kbGUgdmlzb3IgZGV2aWNlIGdvaW5nIGF3YXkKKyAqIEB4ZGV2OiBzdHJ1Y3QgZGV2aWNlIGZvciB0aGUgdmlzb3IgZGV2aWNlIGJlaW5nIHJlbW92ZWQKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGRldmljZV91bnJlZ2lzdGVyKCkgaXMgY2FsbGVkIGZvciBlYWNoIGNoaWxkIGRldmljZQorICogaW5zdGFuY2UsIHRvIG5vdGlmeSB0aGUgYXBwcm9wcmlhdGUgdmlzb3JidXMgZnVuY3Rpb24gZHJpdmVyIHRoYXQgdGhlIGRldmljZQorICogaXMgZ29pbmcgYXdheSwgYW5kIHRvIGRlY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGRldmljZS4KKyAqCisgKiBSZXR1cm46IDAgaWZmIHN1Y2Nlc3NmdWwKICAqLwogc3RhdGljIGludAogdmlzb3Jkcml2ZXJfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZGV2aWNlICp4ZGV2KQpAQCAtNjE0LDEwNSArNDg2LDQ0IEBACiAKIAlkZXYgPSB0b192aXNvcl9kZXZpY2UoeGRldik7CiAJZHJ2ID0gdG9fdmlzb3JfZHJpdmVyKHhkZXYtPmRyaXZlcik7Ci0JZG93bigmZGV2LT52aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrKTsKKwltdXRleF9sb2NrKCZkZXYtPnZpc29yZHJpdmVyX2NhbGxiYWNrX2xvY2spOwogCWRldi0+YmVpbmdfcmVtb3ZlZCA9IHRydWU7CiAJaWYgKGRydi0+cmVtb3ZlKQogCQlkcnYtPnJlbW92ZShkZXYpOwotCXVwKCZkZXYtPnZpc29yZHJpdmVyX2NhbGxiYWNrX2xvY2spOworCW11dGV4X3VubG9jaygmZGV2LT52aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrKTsKIAlkZXZfc3RvcF9wZXJpb2RpY193b3JrKGRldik7CiAKIAlwdXRfZGV2aWNlKCZkZXYtPmRldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKLS8qKiBBIHBhcnRpY3VsYXIgdHlwZSBvZiB2aXNvciBkcml2ZXIgY2FsbHMgdGhpcyBmdW5jdGlvbiB0byByZWdpc3RlcgotICogIHRoZSBkcml2ZXIuICBUaGUgY2FsbGVyIE1VU1QgZmlsbCBpbiB0aGUgZm9sbG93aW5nIGZpZWxkcyB3aXRoaW4gdGhlCi0gKiAgI2RydiBzdHJ1Y3R1cmU6Ci0gKiAgICAgIG5hbWUsIHZlcnNpb24sIG93bmVyLCBjaGFubmVsX3R5cGVzLCBwcm9iZSwgcmVtb3ZlCisvKioKKyAqIHZpc29yYnVzX3VucmVnaXN0ZXJfdmlzb3JfZHJpdmVyKCkgLSB1bnJlZ2lzdGVycyB0aGUgcHJvdmlkZWQgZHJpdmVyCisgKiBAZHJ2OiB0aGUgZHJpdmVyIHRvIHVucmVnaXN0ZXIKICAqCi0gKiAgSGVyZSdzIGhvdyB0aGUgd2hvbGUgTGludXggYnVzIC8gZHJpdmVyIC8gZGV2aWNlIG1vZGVsIHdvcmtzLgotICoKLSAqICBBdCBzeXN0ZW0gc3RhcnQtdXAsIHRoZSB2aXNvcmJ1cyBrZXJuZWwgbW9kdWxlIGlzIGxvYWRlZCwgd2hpY2ggcmVnaXN0ZXJzCi0gKiAgdmlzb3JidXNfdHlwZSBhcyBhIGJ1cyB0eXBlLCB1c2luZyBidXNfcmVnaXN0ZXIoKS4KLSAqCi0gKiAgQWxsIGtlcm5lbCBtb2R1bGVzIHRoYXQgc3VwcG9ydCBwYXJ0aWN1bGFyIGRldmljZSB0eXBlcyBvbiBhCi0gKiAgdmlzb3JidXMgYnVzIGFyZSBsb2FkZWQuICBFYWNoIG9mIHRoZXNlIGtlcm5lbCBtb2R1bGVzIGNhbGxzCi0gKiAgdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKCkgaW4gdGhlaXIgaW5pdCBmdW5jdGlvbnMsIHBhc3NpbmcgYQotICogIHZpc29yX2RyaXZlciBzdHJ1Y3QuICB2aXNvcmJ1c19yZWdpc3Rlcl92aXNvcl9kcml2ZXIoKSBpbiB0dXJuIGNhbGxzCi0gKiAgcmVnaXN0ZXJfZHJpdmVyKCZ2aXNvcl9kcml2ZXIuZHJpdmVyKS4gIFRoaXMgLmRyaXZlciBtZW1iZXIgaXMKLSAqICBpbml0aWFsaXplZCB3aXRoIGdlbmVyaWMgbWV0aG9kcyAobGlrZSBwcm9iZSksIHdob3NlIHNvbGUgcmVzcG9uc2liaWxpdHkKLSAqICBpcyB0byBhY3QgYXMgYSBicm9rZXIgZm9yIHRoZSByZWFsIG1ldGhvZHMsIHdoaWNoIGFyZSB3aXRoaW4gdGhlCi0gKiAgdmlzb3JfZHJpdmVyIHN0cnVjdC4gIChUaGlzIGlzIHRoZSB3YXkgdGhlIHN1YmNsYXNzIGJlaGF2aW9yIGlzCi0gKiAgaW1wbGVtZW50ZWQsIHNpbmNlIHZpc29yX2RyaXZlciBpcyBlc3NlbnRpYWxseSBhIHN1YmNsYXNzIG9mIHRoZQotICogIGdlbmVyaWMgZHJpdmVyLikgIFdoZW5ldmVyIGEgZHJpdmVyX3JlZ2lzdGVyKCkgaGFwcGVucywgY29yZSBidXMgY29kZSBpbgotICogIHRoZSBrZXJuZWwgZG9lcyAoc2VlIGRldmljZV9hdHRhY2goKSBpbiBkcml2ZXJzL2Jhc2UvZGQuYyk6Ci0gKgotICogICAgICBmb3IgZWFjaCBkZXYgYXNzb2NpYXRlZCB3aXRoIHRoZSBidXMgKHRoZSBidXMgdGhhdCBkcml2ZXIgaXMgb24pIHRoYXQKLSAqICAgICAgZG9lcyBub3QgeWV0IGhhdmUgYSBkcml2ZXIKLSAqICAgICAgICAgIGlmIGJ1cy5tYXRjaChkZXYsbmV3ZHJpdmVyKSA9PSB5ZXNfbWF0Y2hlZCAgKiogLm1hdGNoIHNwZWNpZmllZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiogZHVyaW5nIGJ1c19yZWdpc3RlcigpLgotICogICAgICAgICAgICAgIG5ld2RyaXZlci5wcm9iZShkZXYpICAqKiBmb3Igdmlzb3IgZHJpdmVycywgdGhpcyB3aWxsIGNhbGwKLSAqICAgICAgICAgICAgICAgICAgICAqKiB0aGUgZ2VuZXJpYyBkcml2ZXIucHJvYmUgaW1wbGVtZW50ZWQgaW4gdmlzb3JidXMuYywKLSAqICAgICAgICAgICAgICAgICAgICAqKiB3aGljaCBpbiB0dXJuIGNhbGxzIHRoZSBwcm9iZSBzcGVjaWZpZWQgd2l0aGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICoqIHN0cnVjdCB2aXNvcl9kcml2ZXIgKHdoaWNoIHdhcyBzcGVjaWZpZWQgYnkgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgKiogYWN0dWFsIGRldmljZSBkcml2ZXIgYXMgcGFydCBvZgotICogICAgICAgICAgICAgICAgICAgICoqIHZpc29yYnVzX3JlZ2lzdGVyX3Zpc29yX2RyaXZlcigpKS4KLSAqCi0gKiAgVGhlIGFib3ZlIGRhbmNlIGFsc28gaGFwcGVucyB3aGVuIGEgbmV3IGRldmljZSBhcHBlYXJzLgotICogIFNvIHRoZSBxdWVzdGlvbiBpcywgaG93IGFyZSBkZXZpY2VzIGNyZWF0ZWQgd2l0aGluIHRoZSBzeXN0ZW0/Ci0gKiAgQmFzaWNhbGx5LCBqdXN0IGNhbGwgZGV2aWNlX2FkZChkZXYpLiAgU2VlIHBjaV9idXNfYWRkX2RldmljZXMoKS4KLSAqICBwY2lfc2Nhbl9kZXZpY2UoKSBzaG93cyBhbiBleGFtcGxlIG9mIGhvdyB0byBidWlsZCBhIGRldmljZSBzdHJ1Y3QuICBJdAotICogIHJldHVybnMgdGhlIG5ld2x5LWNyZWF0ZWQgc3RydWN0IHRvIHBjaV9zY2FuX3NpbmdsZV9kZXZpY2UoKSwgd2hvIGFkZHMgaXQKLSAqICB0byB0aGUgbGlzdCBvZiBkZXZpY2VzIGF0IFBDSUJVUy5kZXZpY2VzLiAgVGhhdCBsaXN0IG9mIGRldmljZXMgaXMgd2hhdAotICogIGlzIHRyYXZlcnNlZCBieSBwY2lfYnVzX2FkZF9kZXZpY2VzKCkuCi0gKgotICovCi1pbnQgdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKHN0cnVjdCB2aXNvcl9kcml2ZXIgKmRydikKLXsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGJ1c3JlZ19yYyA8IDApCi0JCXJldHVybiAtRU5PREVWOyAvKmNhbid0IHJlZ2lzdGVyIG9uIGEgbm9uZXhpc3RlbnQgYnVzKi8KLQotCWRydi0+ZHJpdmVyLm5hbWUgPSBkcnYtPm5hbWU7Ci0JZHJ2LT5kcml2ZXIuYnVzID0gJnZpc29yYnVzX3R5cGU7Ci0JZHJ2LT5kcml2ZXIucHJvYmUgPSB2aXNvcmRyaXZlcl9wcm9iZV9kZXZpY2U7Ci0JZHJ2LT5kcml2ZXIucmVtb3ZlID0gdmlzb3Jkcml2ZXJfcmVtb3ZlX2RldmljZTsKLQlkcnYtPmRyaXZlci5vd25lciA9IGRydi0+b3duZXI7Ci0KLQkvKiBkcml2ZXJfcmVnaXN0ZXIgZG9lcyB0aGlzOgotCSAqICAgYnVzX2FkZF9kcml2ZXIoZHJ2KQotCSAqICAgLT5pZiAoZHJ2LmJ1cykgICoqIChidXNfdHlwZSkgKioKLQkgKiAgICAgICBkcml2ZXJfYXR0YWNoKGRydikKLQkgKiAgICAgICAgIGZvciBlYWNoIGRldiB3aXRoIGJ1cyB0eXBlIG9mIGRydi5idXMKLQkgKiAgICAgICAgICAgaWYgKCFkZXYuZHJ2KSAgKiogbm8gZHJpdmVyIGFzc2lnbmVkIHlldCAqKgotCSAqICAgICAgICAgICAgIGlmIChidXMubWF0Y2goZGV2LGRydikpICBbdmlzb3JidXNfbWF0Y2hdCi0JICogICAgICAgICAgICAgICBkZXYuZHJ2ID0gZHJ2Ci0JICogICAgICAgICAgICAgICBpZiAoIWRydi5wcm9iZShkZXYpKSAgIFt2aXNvcmRyaXZlcl9wcm9iZV9kZXZpY2VdCi0JICogICAgICAgICAgICAgICAgIGRldi5kcnYgPSBOVUxMCi0JICovCi0KLQlyYyA9IGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQlyYyA9IHJlZ2lzdGVyX2RyaXZlcl9hdHRyaWJ1dGVzKGRydik7Ci0JaWYgKHJjIDwgMCkKLQkJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmJ1c19yZWdpc3Rlcl92aXNvcl9kcml2ZXIpOwotCi0vKiogQSBwYXJ0aWN1bGFyIHR5cGUgb2Ygdmlzb3IgZHJpdmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gdW5yZWdpc3RlcgotICogIHRoZSBkcml2ZXIsIGkuZS4sIHdpdGhpbiBpdHMgbW9kdWxlX2V4aXQgZnVuY3Rpb24uCisgKiBBIHZpc29yIGZ1bmN0aW9uIGRyaXZlciBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIHVucmVnaXN0ZXIgdGhlIGRyaXZlciwKKyAqIGkuZS4sIHdpdGhpbiBpdHMgbW9kdWxlX2V4aXQgZnVuY3Rpb24uCiAgKi8KIHZvaWQKIHZpc29yYnVzX3VucmVnaXN0ZXJfdmlzb3JfZHJpdmVyKHN0cnVjdCB2aXNvcl9kcml2ZXIgKmRydikKIHsKLQl1bnJlZ2lzdGVyX2RyaXZlcl9hdHRyaWJ1dGVzKGRydik7CiAJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZpc29yYnVzX3VucmVnaXN0ZXJfdmlzb3JfZHJpdmVyKTsKIAorLyoqCisgKiB2aXNvcmJ1c19yZWFkX2NoYW5uZWwoKSAtIHJlYWRzIGZyb20gdGhlIGRlc2lnbmF0ZWQgY2hhbm5lbCBpbnRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm92aWRlZCBidWZmZXIKKyAqIEBkZXY6ICAgIHRoZSBkZXZpY2Ugd2hvc2UgY2hhbm5lbCBpcyByZWFkIGZyb20KKyAqIEBvZmZzZXQ6IHRoZSBvZmZzZXQgaW50byB0aGUgY2hhbm5lbCBhdCB3aGljaCByZWFkaW5nIHN0YXJ0cworICogQGRlc3Q6ICAgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciB0aGF0IGlzIHdyaXR0ZW4gaW50byBmcm9tIHRoZSBjaGFubmVsCisgKiBAbmJ5dGVzOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgY2hhbm5lbAorICoKKyAqIElmIHJlY2VpdmluZyBhIG1lc3NhZ2UsIHVzZSB0aGUgdmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZSgpCisgKiBmdW5jdGlvbiBpbnN0ZWFkLgorICoKKyAqIFJldHVybjogaW50ZWdlciBpbmRpY2F0aW5nIHN1Y2Nlc3MgKHplcm8pIG9yIGZhaWx1cmUgKG5vbi16ZXJvKQorICovCiBpbnQKIHZpc29yYnVzX3JlYWRfY2hhbm5lbChzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogCQkgICAgICB2b2lkICpkZXN0LCB1bnNpZ25lZCBsb25nIG5ieXRlcykKQEAgLTcyMSw2ICs1MzIsMTkgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZpc29yYnVzX3JlYWRfY2hhbm5lbCk7CiAKKy8qKgorICogdmlzb3JidXNfd3JpdGVfY2hhbm5lbCgpIC0gd3JpdGVzIHRoZSBwcm92aWRlZCBidWZmZXIgaW50byB0aGUgZGVzaWduYXRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbAorICogQGRldjogICAgdGhlIGRldmljZSB3aG9zZSBjaGFubmVsIGlzIHdyaXR0ZW4gdG8KKyAqIEBvZmZzZXQ6IHRoZSBvZmZzZXQgaW50byB0aGUgY2hhbm5lbCBhdCB3aGljaCB3cml0aW5nIHN0YXJ0cworICogQHNyYzogICAgdGhlIHNvdXJjZSBidWZmZXIgdGhhdCBpcyB3cml0dGVuIGludG8gdGhlIGNoYW5uZWwKKyAqIEBuYnl0ZXM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgaW50byB0aGUgY2hhbm5lbAorICoKKyAqIElmIHNlbmRpbmcgYSBtZXNzYWdlLCB1c2UgdGhlIHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoKQorICogZnVuY3Rpb24gaW5zdGVhZC4KKyAqCisgKiBSZXR1cm46IGludGVnZXIgaW5kaWNhdGluZyBzdWNjZXNzICh6ZXJvKSBvciBmYWlsdXJlIChub24temVybykKKyAqLwogaW50CiB2aXNvcmJ1c193cml0ZV9jaGFubmVsKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCiAJCSAgICAgICB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgbmJ5dGVzKQpAQCAtNzI5LDE2ICs1NTMsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZpc29yYnVzX3dyaXRlX2NoYW5uZWwpOwogCi1pbnQKLXZpc29yYnVzX2NsZWFyX2NoYW5uZWwoc3RydWN0IHZpc29yX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdTggY2gsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIG5ieXRlcykKLXsKLQlyZXR1cm4gdmlzb3JjaGFubmVsX2NsZWFyKGRldi0+dmlzb3JjaGFubmVsLCBvZmZzZXQsIGNoLCBuYnl0ZXMpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JidXNfY2xlYXJfY2hhbm5lbCk7Ci0KLS8qKiBXZSBkb24ndCByZWFsbHkgaGF2ZSBhIHJlYWwgaW50ZXJydXB0LCBzbyBmb3Igbm93IHdlIGp1c3QgY2FsbCB0aGUKLSAqICBpbnRlcnJ1cHQgZnVuY3Rpb24gcGVyaW9kaWNhbGx5Li4uCisvKioKKyAqIHZpc29yYnVzX2VuYWJsZV9jaGFubmVsX2ludGVycnVwdHMoKSAtIGVuYWJsZXMgaW50ZXJydXB0cyBvbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbmF0ZWQgZGV2aWNlCisgKiBAZGV2OiB0aGUgZGV2aWNlIG9uIHdoaWNoIHRvIGVuYWJsZSBpbnRlcnJ1cHRzCisgKgorICogQ3VycmVudGx5IHdlIGRvbid0IHlldCBoYXZlIGEgcmVhbCBpbnRlcnJ1cHQsIHNvIGZvciBub3cgd2UganVzdCBjYWxsIHRoZQorICogaW50ZXJydXB0IGZ1bmN0aW9uIHBlcmlvZGljYWxseSB2aWEgYSB0aW1lci4KICAqLwogdm9pZAogdmlzb3JidXNfZW5hYmxlX2NoYW5uZWxfaW50ZXJydXB0cyhzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYpCkBAIC03NDcsNiArNTY4LDExIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmJ1c19lbmFibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKTsKIAorLyoqCisgKiB2aXNvcmJ1c19kaXNhYmxlX2NoYW5uZWxfaW50ZXJydXB0cygpIC0gZGlzYWJsZXMgaW50ZXJydXB0cyBvbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ25hdGVkIGRldmljZQorICogQGRldjogdGhlIGRldmljZSBvbiB3aGljaCB0byBkaXNhYmxlIGludGVycnVwdHMKKyAqLwogdm9pZAogdmlzb3JidXNfZGlzYWJsZV9jaGFubmVsX2ludGVycnVwdHMoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KQogewpAQCAtNzU0LDE5ICs1ODAsMjggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZpc29yYnVzX2Rpc2FibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKTsKIAotLyoqIFRoaXMgaXMgaG93IGV2ZXJ5dGhpbmcgc3RhcnRzIGZyb20gdGhlIGRldmljZSBlbmQuCi0gKiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIGNoYW5uZWwgZmlyc3QgYXBwZWFycyB2aWEgYSBDb250cm9sVk0KLSAqICBtZXNzYWdlLiAgSW4gcmVzcG9uc2UsIHRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgdmlzb3JfZGV2aWNlIHRvCi0gKiAgY29ycmVzcG9uZCB0byB0aGUgbmV3IGNoYW5uZWwsIGFuZCBhdHRlbXB0cyB0byBjb25uZWN0IGl0IHRoZSBhcHByb3ByaWF0ZQotICogIGRyaXZlci4gIElmIHRoZSBhcHByb3ByaWF0ZSBkcml2ZXIgaXMgZm91bmQsIHRoZSB2aXNvcl9kcml2ZXIucHJvYmUoKQotICogIGZ1bmN0aW9uIGZvciB0aGF0IGRyaXZlciB3aWxsIGJlIGNhbGxlZCwgYW5kIHdpbGwgYmUgcGFzc2VkIHRoZSBuZXcKLSAqICB2aXNvcl9kZXZpY2UgdGhhdCB3ZSBqdXN0IGNyZWF0ZWQuCisvKioKKyAqIGNyZWF0ZV92aXNvcl9kZXZpY2UoKSAtIGNyZWF0ZSB2aXNvciBkZXZpY2UgYXMgYSByZXN1bHQgb2YgcmVjZWl2aW5nIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHZtIGRldmljZV9jcmVhdGUgbWVzc2FnZSBmb3IgYSBuZXcgZGV2aWNlCisgKiBAZGV2OiBhIGZyZXNobHktemVyb2VkIHN0cnVjdCB2aXNvcl9kZXZpY2UsIGNvbnRhaW5pbmcgb25seSBmaWxsZWQtaW4gdmFsdWVzCisgKiAgICAgICBmb3IgY2hpcHNldF9idXNfbm8gYW5kIGNoaXBzZXRfZGV2X25vLCB0aGF0IHdpbGwgYmUgaW5pdGlhbGl6ZWQKICAqCi0gKiAgSXQncyBvayBpZiB0aGUgYXBwcm9wcmlhdGUgZHJpdmVyIGlzIG5vdCB5ZXQgbG9hZGVkLCBiZWNhdXNlIGluIHRoYXQgY2FzZQotICogIHRoZSBuZXcgZGV2aWNlIHN0cnVjdCB3aWxsIGp1c3Qgc3RpY2sgYXJvdW5kIGluIHRoZSBidXMnIGxpc3Qgb2YgZGV2aWNlcy4KLSAqICBXaGVuIHRoZSBhcHByb3ByaWF0ZSBkcml2ZXIgY2FsbHMgdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKCksIHRoZQotICogIHZpc29yX2RyaXZlci5wcm9iZSgpIGZvciB0aGUgbmV3IGRyaXZlciB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcKLSAqICBkZXZpY2UuCisgKiBUaGlzIGlzIGhvdyBldmVyeXRoaW5nIHN0YXJ0cyBmcm9tIHRoZSBkZXZpY2UgZW5kLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIGNoYW5uZWwgZmlyc3QgYXBwZWFycyB2aWEgYSBDb250cm9sVk0KKyAqIG1lc3NhZ2UuICBJbiByZXNwb25zZSwgdGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSB2aXNvcl9kZXZpY2UgdG8KKyAqIGNvcnJlc3BvbmQgdG8gdGhlIG5ldyBjaGFubmVsLCBhbmQgYXR0ZW1wdHMgdG8gY29ubmVjdCBpdCB0aGUgYXBwcm9wcmlhdGUKKyAqIGRyaXZlci4gIElmIHRoZSBhcHByb3ByaWF0ZSBkcml2ZXIgaXMgZm91bmQsIHRoZSB2aXNvcl9kcml2ZXIucHJvYmUoKQorICogZnVuY3Rpb24gZm9yIHRoYXQgZHJpdmVyIHdpbGwgYmUgY2FsbGVkLCBhbmQgd2lsbCBiZSBwYXNzZWQgdGhlIG5ldworICogdmlzb3JfZGV2aWNlIHRoYXQgd2UganVzdCBjcmVhdGVkLgorICoKKyAqIEl0J3Mgb2sgaWYgdGhlIGFwcHJvcHJpYXRlIGRyaXZlciBpcyBub3QgeWV0IGxvYWRlZCwgYmVjYXVzZSBpbiB0aGF0IGNhc2UKKyAqIHRoZSBuZXcgZGV2aWNlIHN0cnVjdCB3aWxsIGp1c3Qgc3RpY2sgYXJvdW5kIGluIHRoZSBidXMnIGxpc3Qgb2YgZGV2aWNlcy4KKyAqIFdoZW4gdGhlIGFwcHJvcHJpYXRlIGRyaXZlciBjYWxscyB2aXNvcmJ1c19yZWdpc3Rlcl92aXNvcl9kcml2ZXIoKSwgdGhlCisgKiB2aXNvcl9kcml2ZXIucHJvYmUoKSBmb3IgdGhlIG5ldyBkcml2ZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3CisgKiBkZXZpY2UuCisgKgorICogUmV0dXJuOiAwIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSB0aGUgbmVnYXRpdmUgdmFsdWUgcmV0dXJuZWQgYnkKKyAqICAgICAgICAgZGV2aWNlX2FkZCgpIGluZGljYXRpbmcgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZQogICovCiBzdGF0aWMgaW50CiBjcmVhdGVfdmlzb3JfZGV2aWNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldikKQEAgLTc3OCwzMyArNjEzLDI3IEBACiAJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0VOVFJZX1BDLCBjaGlwc2V0X2Rldl9ubywgY2hpcHNldF9idXNfbm8sCiAJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKLQlzZW1hX2luaXQoJmRldi0+dmlzb3Jkcml2ZXJfY2FsbGJhY2tfbG9jaywgMSk7CS8qIHVubG9ja2VkICovCisJbXV0ZXhfaW5pdCgmZGV2LT52aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrKTsKIAlkZXYtPmRldmljZS5idXMgPSAmdmlzb3JidXNfdHlwZTsKIAlkZXYtPmRldmljZS5ncm91cHMgPSB2aXNvcmJ1c19jaGFubmVsX2dyb3VwczsKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmZGV2LT5kZXZpY2UpOwogCWRldi0+ZGV2aWNlLnJlbGVhc2UgPSB2aXNvcmJ1c19yZWxlYXNlX2RldmljZTsKIAkvKiBrZWVwIGEgcmVmZXJlbmNlIGp1c3QgZm9yIHVzIChub3cgMikgKi8KIAlnZXRfZGV2aWNlKCZkZXYtPmRldmljZSk7Ci0JZGV2LT5wZXJpb2RpY193b3JrID0KLQkJdmlzb3JfcGVyaW9kaWNfd29ya19jcmVhdGUoUE9MTEpJRkZJRVNfTk9STUFMQ0hBTk5FTCwKLQkJCQkJICAgcGVyaW9kaWNfZGV2X3dvcmtxdWV1ZSwKLQkJCQkJICAgZGV2X3BlcmlvZGljX3dvcmssCi0JCQkJCSAgIGRldiwgZGV2X25hbWUoJmRldi0+ZGV2aWNlKSk7Ci0JaWYgKCFkZXYtPnBlcmlvZGljX3dvcmspIHsKLQkJUE9TVENPREVfTElOVVhfMyhERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGNoaXBzZXRfZGV2X25vLAotCQkJCSBESUFHX1NFVkVSSVRZX0VSUik7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3B1dDsKLQl9CisJaW5pdF90aW1lcigmZGV2LT50aW1lcik7CisJZGV2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpKGRldik7CisJZGV2LT50aW1lci5mdW5jdGlvbiA9IGRldl9wZXJpb2RpY193b3JrOwogCi0JLyogYnVzX2lkIG11c3QgYmUgYSB1bmlxdWUgbmFtZSB3aXRoIHJlc3BlY3QgdG8gdGhpcyBidXMgVFlQRQorCS8qCisJICogYnVzX2lkIG11c3QgYmUgYSB1bmlxdWUgbmFtZSB3aXRoIHJlc3BlY3QgdG8gdGhpcyBidXMgVFlQRQogCSAqIChOT1QgYnVzIGluc3RhbmNlKS4gIFRoYXQncyB3aHkgd2UgbmVlZCB0byBpbmNsdWRlIHRoZSBidXMKIAkgKiBudW1iZXIgd2l0aGluIHRoZSBuYW1lLgogCSAqLwogCWRldl9zZXRfbmFtZSgmZGV2LT5kZXZpY2UsICJ2YnVzJXU6ZGV2JXUiLAogCQkgICAgIGNoaXBzZXRfYnVzX25vLCBjaGlwc2V0X2Rldl9ubyk7CiAKLQkvKiAgZGV2aWNlX2FkZCBkb2VzIHRoaXM6CisJLyoKKwkgKiBkZXZpY2VfYWRkIGRvZXMgdGhpczoKIAkgKiAgICBidXNfYWRkX2RldmljZShkZXYpCiAJICogICAgLT5kZXZpY2VfYXR0YWNoKGRldikKIAkgKiAgICAgIC0+Zm9yIGVhY2ggZHJpdmVyIGRydiByZWdpc3RlcmVkIG9uIHRoZSBidXMgdGhhdCBkZXYgaXMgb24KQEAgLTg2NCwxMSArNjkzLDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFdyaXRlIHRoZSBjb250ZW50cyBvZiA8aW5mbz4gdG8gdGhlIHN0cnVjdAotICogc3Bhcl92YnVzX2NoYW5uZWxfcHJvdG9jb2wuY2hwX2luZm8uCisvKioKKyAqIHdyaXRlX3ZidXNfY2hwX2luZm8oKSAtIHdyaXRlIHRoZSBjb250ZW50cyBvZiA8aW5mbz4gdG8gdGhlIHN0cnVjdAorICogICAgICAgICAgICAgICAgICAgICAgICAgc3Bhcl92YnVzX2NoYW5uZWxfcHJvdG9jb2wuY2hwX2luZm8KKyAqIEBjaGFuOiAgICAgaW5kZW50aWZpZXMgdGhlIHMtUGFyIGNoYW5uZWwgdGhhdCB3aWxsIGJlIHVwZGF0ZWQKKyAqIEBoZHJfaW5mbzogdXNlZCB0byBmaW5kIGFwcHJvcHJpYXRlIGNoYW5uZWwgb2Zmc2V0IHRvIHdyaXRlIGRhdGEKKyAqIEBpbmZvOiAgICAgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHRvIHdyaXRlCisgKgorICogV3JpdGVzIGNoaXBzZXQgaW5mbyBpbnRvIHRoZSBjaGFubmVsIG1lbW9yeSB0byBiZSB1c2VkIGZvciBkaWFnbm9zdGljCisgKiBwdXJwb3Nlcy4KKyAqCisgKiBSZXR1cm5zIG5vIHZhbHVlIHNpbmNlIHRoaXMgaXMgZGVidWcgaW5mb3JtYXRpb24gYW5kIG5vdCBuZWVkZWQgZm9yCisgKiBkZXZpY2UgZnVuY3Rpb25hbGl0eS4KICAqLwotCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogd3JpdGVfdmJ1c19jaHBfaW5mbyhzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFuLAogCQkgICAgc3RydWN0IHNwYXJfdmJ1c19oZWFkZXJpbmZvICpoZHJfaW5mbywKIAkJICAgIHN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmluZm8pCkBAIC04NzYsMTggKzcxNCwyNSBAQAogCWludCBvZmYgPSBzaXplb2Yoc3RydWN0IGNoYW5uZWxfaGVhZGVyKSArIGhkcl9pbmZvLT5jaHBfaW5mb19vZmZzZXQ7CiAKIAlpZiAoaGRyX2luZm8tPmNocF9pbmZvX29mZnNldCA9PSAwKQotCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuOwogCi0JaWYgKHZpc29yY2hhbm5lbF93cml0ZShjaGFuLCBvZmYsIGluZm8sIHNpemVvZigqaW5mbykpIDwgMCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuIDA7CisJdmlzb3JjaGFubmVsX3dyaXRlKGNoYW4sIG9mZiwgaW5mbywgc2l6ZW9mKCppbmZvKSk7CiB9CiAKLS8qIFdyaXRlIHRoZSBjb250ZW50cyBvZiA8aW5mbz4gdG8gdGhlIHN0cnVjdAotICogc3Bhcl92YnVzX2NoYW5uZWxfcHJvdG9jb2wuYnVzX2luZm8uCisvKioKKyAqIHdyaXRlX3ZidXNfYnVzX2luZm8oKSAtIHdyaXRlIHRoZSBjb250ZW50cyBvZiA8aW5mbz4gdG8gdGhlIHN0cnVjdAorICogICAgICAgICAgICAgICAgICAgICAgICAgc3Bhcl92YnVzX2NoYW5uZWxfcHJvdG9jb2wuYnVzX2luZm8KKyAqIEBjaGFuOiAgICAgaW5kZW50aWZpZXMgdGhlIHMtUGFyIGNoYW5uZWwgdGhhdCB3aWxsIGJlIHVwZGF0ZWQKKyAqIEBoZHJfaW5mbzogdXNlZCB0byBmaW5kIGFwcHJvcHJpYXRlIGNoYW5uZWwgb2Zmc2V0IHRvIHdyaXRlIGRhdGEKKyAqIEBpbmZvOiAgICAgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHRvIHdyaXRlCisgKgorICogV3JpdGVzIGJ1cyBpbmZvIGludG8gdGhlIGNoYW5uZWwgbWVtb3J5IHRvIGJlIHVzZWQgZm9yIGRpYWdub3N0aWMKKyAqIHB1cnBvc2VzLgorICoKKyAqIFJldHVybnMgbm8gdmFsdWUgc2luY2UgdGhpcyBpcyBkZWJ1ZyBpbmZvcm1hdGlvbiBhbmQgbm90IG5lZWRlZCBmb3IKKyAqIGRldmljZSBmdW5jdGlvbmFsaXR5LgogICovCi0KLXN0YXRpYyBpbnQKK3N0YXRpYyB2b2lkCiB3cml0ZV92YnVzX2J1c19pbmZvKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW4sCiAJCSAgICBzdHJ1Y3Qgc3Bhcl92YnVzX2hlYWRlcmluZm8gKmhkcl9pbmZvLAogCQkgICAgc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyAqaW5mbykKQEAgLTg5NSwzNyArNzQwLDQ2IEBACiAJaW50IG9mZiA9IHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9oZWFkZXIpICsgaGRyX2luZm8tPmJ1c19pbmZvX29mZnNldDsKIAogCWlmIChoZHJfaW5mby0+YnVzX2luZm9fb2Zmc2V0ID09IDApCi0JCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm47CiAKLQlpZiAodmlzb3JjaGFubmVsX3dyaXRlKGNoYW4sIG9mZiwgaW5mbywgc2l6ZW9mKCppbmZvKSkgPCAwKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKKwl2aXNvcmNoYW5uZWxfd3JpdGUoY2hhbiwgb2ZmLCBpbmZvLCBzaXplb2YoKmluZm8pKTsKIH0KIAotLyogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIDxpbmZvPiB0byB0aGUKLSAqIHN0cnVjdCBzcGFyX3ZidXNfY2hhbm5lbF9wcm90b2NvbC5kZXZfaW5mb1s8ZGV2aXg+XS4KKy8qKgorICogd3JpdGVfdmJ1c19kZXZfaW5mbygpIC0gd3JpdGUgdGhlIGNvbnRlbnRzIG9mIDxpbmZvPiB0byB0aGUgc3RydWN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBzcGFyX3ZidXNfY2hhbm5lbF9wcm90b2NvbC5kZXZfaW5mb1s8ZGV2aXg+XQorICogQGNoYW46ICAgICBpbmRlbnRpZmllcyB0aGUgcy1QYXIgY2hhbm5lbCB0aGF0IHdpbGwgYmUgdXBkYXRlZAorICogQGhkcl9pbmZvOiB1c2VkIHRvIGZpbmQgYXBwcm9wcmlhdGUgY2hhbm5lbCBvZmZzZXQgdG8gd3JpdGUgZGF0YQorICogQGluZm86ICAgICBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gdG8gd3JpdGUKKyAqIEBkZXZpeDogICAgdGhlIHJlbGF0aXZlIGRldmljZSBudW1iZXIgKDAuLm4tMSkgb2YgdGhlIGRldmljZSBvbiB0aGUgYnVzCisgKgorICogV3JpdGVzIGRldmljZSBpbmZvIGludG8gdGhlIGNoYW5uZWwgbWVtb3J5IHRvIGJlIHVzZWQgZm9yIGRpYWdub3N0aWMKKyAqIHB1cnBvc2VzLgorICoKKyAqIFJldHVybnMgbm8gdmFsdWUgc2luY2UgdGhpcyBpcyBkZWJ1ZyBpbmZvcm1hdGlvbiBhbmQgbm90IG5lZWRlZCBmb3IKKyAqIGRldmljZSBmdW5jdGlvbmFsaXR5LgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogd3JpdGVfdmJ1c19kZXZfaW5mbyhzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFuLAogCQkgICAgc3RydWN0IHNwYXJfdmJ1c19oZWFkZXJpbmZvICpoZHJfaW5mbywKLQkJICAgIHN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmluZm8sIGludCBkZXZpeCkKKwkJICAgIHN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmluZm8sIHVuc2lnbmVkIGludCBkZXZpeCkKIHsKIAlpbnQgb2ZmID0KIAkgICAgKHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9oZWFkZXIpICsgaGRyX2luZm8tPmRldl9pbmZvX29mZnNldCkgKwogCSAgICAoaGRyX2luZm8tPmRldmljZV9pbmZvX3N0cnVjdF9ieXRlcyAqIGRldml4KTsKIAogCWlmIChoZHJfaW5mby0+ZGV2X2luZm9fb2Zmc2V0ID09IDApCi0JCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm47CiAKLQlpZiAodmlzb3JjaGFubmVsX3dyaXRlKGNoYW4sIG9mZiwgaW5mbywgc2l6ZW9mKCppbmZvKSkgPCAwKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKKwl2aXNvcmNoYW5uZWxfd3JpdGUoY2hhbiwgb2ZmLCBpbmZvLCBzaXplb2YoKmluZm8pKTsKIH0KIAotLyogRm9yIGEgY2hpbGQgZGV2aWNlIGp1c3QgY3JlYXRlZCBvbiBhIGNsaWVudCBidXMsIGZpbGwgaW4KLSAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkcml2ZXIgdGhhdCBpcyBjb250cm9sbGluZyB0aGlzIGRldmljZSBpbnRvCi0gKiB0aGUgdGhlIGFwcHJvcHJpYXRlIHNsb3Qgd2l0aGluIHRoZSB2YnVzIGNoYW5uZWwgb2YgdGhlIGJ1cwotICogaW5zdGFuY2UuCisvKioKKyAqIGZpeF92YnVzX2Rldl9pbmZvKCkgLSBmb3IgYSBjaGlsZCBkZXZpY2UganVzdCBjcmVhdGVkIG9uIGEgY2xpZW50IGJ1cywgZmlsbAorICogICAgICAgICAgICAgICAgICAgICAgIGluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkcml2ZXIgdGhhdCBpcyBjb250cm9sbGluZworICogICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZGV2aWNlIGludG8gdGhlIHRoZSBhcHByb3ByaWF0ZSBzbG90IHdpdGhpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICB2YnVzIGNoYW5uZWwgb2YgdGhlIGJ1cyBpbnN0YW5jZQorICogQHZpc29yZGV2OiBzdHJ1Y3Qgdmlzb3JfZGV2aWNlIGZvciB0aGUgZGVzaXJlZCBkZXZpY2UKICAqLwogc3RhdGljIHZvaWQKIGZpeF92YnVzX2Rldl9pbmZvKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnZpc29yZGV2KQpAQCAtOTMzLDggKzc4Nyw4IEBACiAJaW50IGk7CiAJc3RydWN0IHZpc29yX2RldmljZSAqYmRldjsKIAlzdHJ1Y3Qgdmlzb3JfZHJpdmVyICp2aXNvcmRydjsKLQlpbnQgYnVzX25vID0gdmlzb3JkZXYtPmNoaXBzZXRfYnVzX25vOwotCWludCBkZXZfbm8gPSB2aXNvcmRldi0+Y2hpcHNldF9kZXZfbm87CisJdTMyIGJ1c19ubyA9IHZpc29yZGV2LT5jaGlwc2V0X2J1c19ubzsKKwl1MzIgZGV2X25vID0gdmlzb3JkZXYtPmNoaXBzZXRfZGV2X25vOwogCXN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gZGV2X2luZm87CiAJY29uc3QgY2hhciAqY2hhbl90eXBlX25hbWUgPSBOVUxMOwogCXN0cnVjdCBzcGFyX3ZidXNfaGVhZGVyaW5mbyAqaGRyX2luZm87CkBAIC05NDIsMTcgKzc5NiwxNiBAQAogCWlmICghdmlzb3JkZXYtPmRldmljZS5kcml2ZXIpCiAJCXJldHVybjsKIAotCWhkcl9pbmZvID0gKHN0cnVjdCBzcGFyX3ZidXNfaGVhZGVyaW5mbyAqKXZpc29yZGV2LT52YnVzX2hkcl9pbmZvOwotCWlmICghaGRyX2luZm8pCi0JCXJldHVybjsKLQogCWJkZXYgPSB2aXNvcmJ1c19nZXRfZGV2aWNlX2J5X2lkKGJ1c19ubywgQlVTX1JPT1RfREVWSUNFLCBOVUxMKTsKIAlpZiAoIWJkZXYpCiAJCXJldHVybjsKLQorCWhkcl9pbmZvID0gKHN0cnVjdCBzcGFyX3ZidXNfaGVhZGVyaW5mbyAqKWJkZXYtPnZidXNfaGRyX2luZm87CisJaWYgKCFoZHJfaW5mbykKKwkJcmV0dXJuOwogCXZpc29yZHJ2ID0gdG9fdmlzb3JfZHJpdmVyKHZpc29yZGV2LT5kZXZpY2UuZHJpdmVyKTsKIAotCS8qIFdpdGhpbiB0aGUgbGlzdCBvZiBkZXZpY2UgdHlwZXMgKGJ5IEdVSUQpIHRoYXQgdGhlIGRyaXZlcgorCS8qCisJICogV2l0aGluIHRoZSBsaXN0IG9mIGRldmljZSB0eXBlcyAoYnkgR1VJRCkgdGhhdCB0aGUgZHJpdmVyCiAJICogc2F5cyBpdCBzdXBwb3J0cywgZmluZCBvdXQgd2hpY2ggb25lIG9mIHRob3NlIHR5cGVzIG1hdGNoZXMKIAkgKiB0aGUgdHlwZSBvZiB0aGlzIGRldmljZSwgc28gdGhhdCB3ZSBjYW4gaW5jbHVkZSB0aGUgZGV2aWNlCiAJICogdHlwZSBuYW1lCkBAIC05NjYsMjAgKzgxOSwxNDggQEAKIAkJfQogCX0KIAotCWJ1c19kZXZpY2VfaW5mb19pbml0KCZkZXZfaW5mbywgY2hhbl90eXBlX25hbWUsCi0JCQkgICAgIHZpc29yZHJ2LT5uYW1lLCB2aXNvcmRydi0+dmVyc2lvbiwKLQkJCSAgICAgdmlzb3JkcnYtPnZlcnRhZyk7CisJYnVzX2RldmljZV9pbmZvX2luaXQoJmRldl9pbmZvLCBjaGFuX3R5cGVfbmFtZSwgdmlzb3JkcnYtPm5hbWUpOwogCXdyaXRlX3ZidXNfZGV2X2luZm8oYmRldi0+dmlzb3JjaGFubmVsLCBoZHJfaW5mbywgJmRldl9pbmZvLCBkZXZfbm8pOwogCi0JLyogUmUtd3JpdGUgYnVzK2NoaXBzZXQgaW5mbywgYmVjYXVzZSBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoaXMKLQkqIHdhcyBwcmV2aW91c2x5IHdyaXR0ZW4gYnkgb3VyIGV2aWwgY291bnRlcnBhcnQsIHZpcnRwY2kuCi0JKi8KKwkvKgorCSAqIFJlLXdyaXRlIGJ1cytjaGlwc2V0IGluZm8sIGJlY2F1c2UgaXQgaXMgcG9zc2libGUgdGhhdCB0aGlzCisJICogd2FzIHByZXZpb3VzbHkgd3JpdHRlbiBieSBvdXIgZXZpbCBjb3VudGVycGFydCwgdmlydHBjaS4KKwkgKi8KIAl3cml0ZV92YnVzX2NocF9pbmZvKGJkZXYtPnZpc29yY2hhbm5lbCwgaGRyX2luZm8sICZjaGlwc2V0X2RyaXZlcmluZm8pOwogCXdyaXRlX3ZidXNfYnVzX2luZm8oYmRldi0+dmlzb3JjaGFubmVsLCBoZHJfaW5mbywKIAkJCSAgICAmY2xpZW50YnVzX2RyaXZlcmluZm8pOwogfQogCi0vKiogQ3JlYXRlIGEgZGV2aWNlIGluc3RhbmNlIGZvciB0aGUgdmlzb3IgYnVzIGl0c2VsZi4KKy8qKgorICogdmlzb3Jkcml2ZXJfcHJvYmVfZGV2aWNlKCkgLSBoYW5kbGUgbmV3IHZpc29yIGRldmljZSBjb21pbmcgb25saW5lCisgKiBAeGRldjogc3RydWN0IGRldmljZSBmb3IgdGhlIHZpc29yIGRldmljZSBiZWluZyBwcm9iZWQKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHVwb24gYWRkaW5nIGEgdmlzb3JfZGV2aWNlIChkZXZpY2VfYWRkKSwgb3IKKyAqIGFkZGluZyBhIHZpc29yX2RyaXZlciAodmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKSwgYnV0IG9ubHkgYWZ0ZXIKKyAqIHZpc29yYnVzX21hdGNoKCkgaGFzIHJldHVybmVkIDEgdG8gaW5kaWNhdGUgYSBzdWNjZXNzZnVsIG1hdGNoIGJldHdlZW4KKyAqIGRyaXZlciBhbmQgZGV2aWNlLgorICoKKyAqIElmIHN1Y2Nlc3NmdWwsIGEgcmVmZXJlbmNlIHRvIHRoZSBkZXZpY2Ugd2lsbCBiZSBoZWxkIG9udG8gdmlhIGdldF9kZXZpY2UoKS4KKyAqCisgKiBSZXR1cm46IDAgaWYgc3VjY2Vzc2Z1bCwgbWVhbmluZyB0aGUgZnVuY3Rpb24gZHJpdmVyJ3MgcHJvYmUoKSBmdW5jdGlvbgorICogICAgICAgICB3YXMgc3VjY2Vzc2Z1bCB3aXRoIHRoaXMgZGV2aWNlLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJubworICogICAgICAgICB2YWx1ZSBpbmRpY2F0aW5nIGZhaWx1cmUgcmVhc29uCisgKi8KK3N0YXRpYyBpbnQKK3Zpc29yZHJpdmVyX3Byb2JlX2RldmljZShzdHJ1Y3QgZGV2aWNlICp4ZGV2KQoreworCWludCByZXM7CisJc3RydWN0IHZpc29yX2RyaXZlciAqZHJ2OworCXN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldjsKKworCWRydiA9IHRvX3Zpc29yX2RyaXZlcih4ZGV2LT5kcml2ZXIpOworCWRldiA9IHRvX3Zpc29yX2RldmljZSh4ZGV2KTsKKworCWlmICghZHJ2LT5wcm9iZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltdXRleF9sb2NrKCZkZXYtPnZpc29yZHJpdmVyX2NhbGxiYWNrX2xvY2spOworCWRldi0+YmVpbmdfcmVtb3ZlZCA9IGZhbHNlOworCisJcmVzID0gZHJ2LT5wcm9iZShkZXYpOworCWlmIChyZXMgPj0gMCkgeworCQkvKiBzdWNjZXNzOiByZWZlcmVuY2Uga2VwdCB2aWEgdW5tYXRjaGVkIGdldF9kZXZpY2UoKSAqLworCQlnZXRfZGV2aWNlKCZkZXYtPmRldmljZSk7CisJCWZpeF92YnVzX2Rldl9pbmZvKGRldik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkZXYtPnZpc29yZHJpdmVyX2NhbGxiYWNrX2xvY2spOworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKCkgLSByZWdpc3RlcnMgdGhlIHByb3ZpZGVkIHZpc29yIGRyaXZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaGFuZGxpbmcgb25lIG9yIG1vcmUgdmlzb3IgZGV2aWNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzIChjaGFubmVsX3R5cGVzKQorICogQGRydjogdGhlIGRyaXZlciB0byByZWdpc3RlcgorICoKKyAqIEEgdmlzb3IgZnVuY3Rpb24gZHJpdmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gcmVnaXN0ZXIKKyAqIHRoZSBkcml2ZXIuICBUaGUgY2FsbGVyIE1VU1QgZmlsbCBpbiB0aGUgZm9sbG93aW5nIGZpZWxkcyB3aXRoaW4gdGhlCisgKiAjZHJ2IHN0cnVjdHVyZToKKyAqICAgICBuYW1lLCB2ZXJzaW9uLCBvd25lciwgY2hhbm5lbF90eXBlcywgcHJvYmUsIHJlbW92ZQorICoKKyAqIEhlcmUncyBob3cgdGhlIHdob2xlIExpbnV4IGJ1cyAvIGRyaXZlciAvIGRldmljZSBtb2RlbCB3b3Jrcy4KKyAqCisgKiBBdCBzeXN0ZW0gc3RhcnQtdXAsIHRoZSB2aXNvcmJ1cyBrZXJuZWwgbW9kdWxlIGlzIGxvYWRlZCwgd2hpY2ggcmVnaXN0ZXJzCisgKiB2aXNvcmJ1c190eXBlIGFzIGEgYnVzIHR5cGUsIHVzaW5nIGJ1c19yZWdpc3RlcigpLgorICoKKyAqIEFsbCBrZXJuZWwgbW9kdWxlcyB0aGF0IHN1cHBvcnQgcGFydGljdWxhciBkZXZpY2UgdHlwZXMgb24gYQorICogdmlzb3JidXMgYnVzIGFyZSBsb2FkZWQuICBFYWNoIG9mIHRoZXNlIGtlcm5lbCBtb2R1bGVzIGNhbGxzCisgKiB2aXNvcmJ1c19yZWdpc3Rlcl92aXNvcl9kcml2ZXIoKSBpbiB0aGVpciBpbml0IGZ1bmN0aW9ucywgcGFzc2luZyBhCisgKiB2aXNvcl9kcml2ZXIgc3RydWN0LiAgdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKCkgaW4gdHVybiBjYWxscworICogcmVnaXN0ZXJfZHJpdmVyKCZ2aXNvcl9kcml2ZXIuZHJpdmVyKS4gIFRoaXMgLmRyaXZlciBtZW1iZXIgaXMKKyAqIGluaXRpYWxpemVkIHdpdGggZ2VuZXJpYyBtZXRob2RzIChsaWtlIHByb2JlKSwgd2hvc2Ugc29sZSByZXNwb25zaWJpbGl0eQorICogaXMgdG8gYWN0IGFzIGEgYnJva2VyIGZvciB0aGUgcmVhbCBtZXRob2RzLCB3aGljaCBhcmUgd2l0aGluIHRoZQorICogdmlzb3JfZHJpdmVyIHN0cnVjdC4gIChUaGlzIGlzIHRoZSB3YXkgdGhlIHN1YmNsYXNzIGJlaGF2aW9yIGlzCisgKiBpbXBsZW1lbnRlZCwgc2luY2Ugdmlzb3JfZHJpdmVyIGlzIGVzc2VudGlhbGx5IGEgc3ViY2xhc3Mgb2YgdGhlCisgKiBnZW5lcmljIGRyaXZlci4pICBXaGVuZXZlciBhIGRyaXZlcl9yZWdpc3RlcigpIGhhcHBlbnMsIGNvcmUgYnVzIGNvZGUgaW4KKyAqIHRoZSBrZXJuZWwgZG9lcyAoc2VlIGRldmljZV9hdHRhY2goKSBpbiBkcml2ZXJzL2Jhc2UvZGQuYyk6CisgKgorICogICAgIGZvciBlYWNoIGRldiBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1cyAodGhlIGJ1cyB0aGF0IGRyaXZlciBpcyBvbikgdGhhdAorICogICAgIGRvZXMgbm90IHlldCBoYXZlIGEgZHJpdmVyCisgKiAgICAgICAgIGlmIGJ1cy5tYXRjaChkZXYsbmV3ZHJpdmVyKSA9PSB5ZXNfbWF0Y2hlZCAgKiogLm1hdGNoIHNwZWNpZmllZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiBkdXJpbmcgYnVzX3JlZ2lzdGVyKCkuCisgKiAgICAgICAgICAgICBuZXdkcml2ZXIucHJvYmUoZGV2KSAgKiogZm9yIHZpc29yIGRyaXZlcnMsIHRoaXMgd2lsbCBjYWxsCisgKiAgICAgICAgICAgICAgICAgICAqKiB0aGUgZ2VuZXJpYyBkcml2ZXIucHJvYmUgaW1wbGVtZW50ZWQgaW4gdmlzb3JidXMuYywKKyAqICAgICAgICAgICAgICAgICAgICoqIHdoaWNoIGluIHR1cm4gY2FsbHMgdGhlIHByb2JlIHNwZWNpZmllZCB3aXRoaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAqKiBzdHJ1Y3Qgdmlzb3JfZHJpdmVyICh3aGljaCB3YXMgc3BlY2lmaWVkIGJ5IHRoZQorICogICAgICAgICAgICAgICAgICAgKiogYWN0dWFsIGRldmljZSBkcml2ZXIgYXMgcGFydCBvZgorICogICAgICAgICAgICAgICAgICAgKiogdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKCkpLgorICoKKyAqIFRoZSBhYm92ZSBkYW5jZSBhbHNvIGhhcHBlbnMgd2hlbiBhIG5ldyBkZXZpY2UgYXBwZWFycy4KKyAqIFNvIHRoZSBxdWVzdGlvbiBpcywgaG93IGFyZSBkZXZpY2VzIGNyZWF0ZWQgd2l0aGluIHRoZSBzeXN0ZW0/CisgKiBCYXNpY2FsbHksIGp1c3QgY2FsbCBkZXZpY2VfYWRkKGRldikuICBTZWUgcGNpX2J1c19hZGRfZGV2aWNlcygpLgorICogcGNpX3NjYW5fZGV2aWNlKCkgc2hvd3MgYW4gZXhhbXBsZSBvZiBob3cgdG8gYnVpbGQgYSBkZXZpY2Ugc3RydWN0LiAgSXQKKyAqIHJldHVybnMgdGhlIG5ld2x5LWNyZWF0ZWQgc3RydWN0IHRvIHBjaV9zY2FuX3NpbmdsZV9kZXZpY2UoKSwgd2hvIGFkZHMgaXQKKyAqIHRvIHRoZSBsaXN0IG9mIGRldmljZXMgYXQgUENJQlVTLmRldmljZXMuICBUaGF0IGxpc3Qgb2YgZGV2aWNlcyBpcyB3aGF0CisgKiBpcyB0cmF2ZXJzZWQgYnkgcGNpX2J1c19hZGRfZGV2aWNlcygpLgorICoKKyAqIFJldHVybjogaW50ZWdlciBpbmRpY2F0aW5nIHN1Y2Nlc3MgKHplcm8pIG9yIGZhaWx1cmUgKG5vbi16ZXJvKQorICovCitpbnQgdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKHN0cnVjdCB2aXNvcl9kcml2ZXIgKmRydikKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKGJ1c3JlZ19yYyA8IDApCisJCXJldHVybiAtRU5PREVWOyAvKmNhbid0IHJlZ2lzdGVyIG9uIGEgbm9uZXhpc3RlbnQgYnVzKi8KKworCWRydi0+ZHJpdmVyLm5hbWUgPSBkcnYtPm5hbWU7CisJZHJ2LT5kcml2ZXIuYnVzID0gJnZpc29yYnVzX3R5cGU7CisJZHJ2LT5kcml2ZXIucHJvYmUgPSB2aXNvcmRyaXZlcl9wcm9iZV9kZXZpY2U7CisJZHJ2LT5kcml2ZXIucmVtb3ZlID0gdmlzb3Jkcml2ZXJfcmVtb3ZlX2RldmljZTsKKwlkcnYtPmRyaXZlci5vd25lciA9IGRydi0+b3duZXI7CisKKwkvKgorCSAqIGRyaXZlcl9yZWdpc3RlciBkb2VzIHRoaXM6CisJICogICBidXNfYWRkX2RyaXZlcihkcnYpCisJICogICAtPmlmIChkcnYuYnVzKSAgKiogKGJ1c190eXBlKSAqKgorCSAqICAgICAgIGRyaXZlcl9hdHRhY2goZHJ2KQorCSAqICAgICAgICAgZm9yIGVhY2ggZGV2IHdpdGggYnVzIHR5cGUgb2YgZHJ2LmJ1cworCSAqICAgICAgICAgICBpZiAoIWRldi5kcnYpICAqKiBubyBkcml2ZXIgYXNzaWduZWQgeWV0ICoqCisJICogICAgICAgICAgICAgaWYgKGJ1cy5tYXRjaChkZXYsZHJ2KSkgIFt2aXNvcmJ1c19tYXRjaF0KKwkgKiAgICAgICAgICAgICAgIGRldi5kcnYgPSBkcnYKKwkgKiAgICAgICAgICAgICAgIGlmICghZHJ2LnByb2JlKGRldikpICAgW3Zpc29yZHJpdmVyX3Byb2JlX2RldmljZV0KKwkgKiAgICAgICAgICAgICAgICAgZGV2LmRydiA9IE5VTEwKKwkgKi8KKworCXJjID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CisJaWYgKHJjIDwgMCkKKwkJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmJ1c19yZWdpc3Rlcl92aXNvcl9kcml2ZXIpOworCisvKioKKyAqIGNyZWF0ZV9idXNfaW5zdGFuY2UoKSAtIGNyZWF0ZSBhIGRldmljZSBpbnN0YW5jZSBmb3IgdGhlIHZpc29yIGJ1cyBpdHNlbGYKKyAqIEBkZXY6IHN0cnVjdCB2aXNvcl9kZXZpY2UgaW5kaWNhdGluZyB0aGUgYnVzIGluc3RhbmNlCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBvdGhlcndpc2UgbmVnYXRpdmUgZXJybm8gdmFsdWUgaW5kaWNhdGluZyByZWFzb24gZm9yCisgKiAgICAgICAgIGZhaWx1cmUKICAqLwogc3RhdGljIGludAogY3JlYXRlX2J1c19pbnN0YW5jZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYpCkBAIC0xMDE0LDI1ICs5OTUsMjYgQEAKIAl9IGVsc2UgewogCQlrZnJlZShoZHJfaW5mbyk7CiAJfQotCWJ1c19jb3VudCsrOwogCWxpc3RfYWRkX3RhaWwoJmRldi0+bGlzdF9hbGwsICZsaXN0X2FsbF9idXNfaW5zdGFuY2VzKTsKIAlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2aWNlLCBkZXYpOwogCXJldHVybiAwOwogfQogCi0vKiogUmVtb3ZlIGEgZGV2aWNlIGluc3RhbmNlIGZvciB0aGUgdmlzb3IgYnVzIGl0c2VsZi4KKy8qKgorICogcmVtb3ZlX2J1c19pbnN0YW5jZSgpIC0gcmVtb3ZlIGEgZGV2aWNlIGluc3RhbmNlIGZvciB0aGUgdmlzb3IgYnVzIGl0c2VsZgorICogQGRldjogc3RydWN0IHZpc29yX2RldmljZSBpbmRlbnRpZnlpbmcgdGhlIGJ1cyB0byByZW1vdmUKICAqLwogc3RhdGljIHZvaWQKIHJlbW92ZV9idXNfaW5zdGFuY2Uoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KQogewotCS8qIE5vdGUgdGhhdCB0aGlzIHdpbGwgcmVzdWx0IGluIHRoZSByZWxlYXNlIG1ldGhvZCBmb3IKKwkvKgorCSAqIE5vdGUgdGhhdCB0aGlzIHdpbGwgcmVzdWx0IGluIHRoZSByZWxlYXNlIG1ldGhvZCBmb3IKIAkgKiBkZXYtPmRldiBiZWluZyBjYWxsZWQsIHdoaWNoIHdpbGwgY2FsbAogCSAqIHZpc29yYnVzX3JlbGVhc2VfYnVzZGV2aWNlKCkuICBUaGlzIGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aAogCSAqIHRoZSBwdXRfZGV2aWNlKCkgZG9uZSBpbiBkZXZpY2VfdW5yZWdpc3RlcigpLCBidXQgSSBoYXZlIG5ldmVyCiAJICogc3VjY2Vzc2Z1bGx5IGJlZW4gYWJsZSB0byB0cmFjZSB0aHJ1IHRoZSBjb2RlIHRvIHNlZSB3aGVyZS9ob3cKIAkgKiByZWxlYXNlKCkgZ2V0cyBjYWxsZWQuICBCdXQgSSBrbm93IGl0IGRvZXMuCiAJICovCi0JYnVzX2NvdW50LS07CiAJaWYgKGRldi0+dmlzb3JjaGFubmVsKSB7CiAJCXZpc29yY2hhbm5lbF9kZXN0cm95KGRldi0+dmlzb3JjaGFubmVsKTsKIAkJZGV2LT52aXNvcmNoYW5uZWwgPSBOVUxMOwpAQCAtMTA0Miw4ICsxMDI0LDExIEBACiAJZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+ZGV2aWNlKTsKIH0KIAotLyoqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgdGhlIG9uZS1hbmQtb25seSBvbmUgaW5zdGFuY2Ugb2YKLSAqICB0aGUgdmlzb3IgYnVzIHR5cGUgKHZpc29yYnVzX3R5cGUpLgorLyoqCisgKiBjcmVhdGVfYnVzX3R5cGUoKSAtIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgdGhlIG9uZS1hbmQtb25seSBvbmUgaW5zdGFuY2Ugb2YKKyAqICAgICAgICAgICAgICAgICAgICAgdGhlIHZpc29yIGJ1cyB0eXBlICh2aXNvcmJ1c190eXBlKQorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBvdGhlcndpc2UgbmVnYXRpdmUgZXJybm8gdmFsdWUgcmV0dXJuZWQgYnkKKyAqICAgICAgICAgYnVzX3JlZ2lzdGVyKCkgaW5kaWNhdGluZyB0aGUgcmVhc29uIGZvciBmYWlsdXJlCiAgKi8KIHN0YXRpYyBpbnQKIGNyZWF0ZV9idXNfdHlwZSh2b2lkKQpAQCAtMTA1Miw3ICsxMDM3LDkgQEAKIAlyZXR1cm4gYnVzcmVnX3JjOwogfQogCi0vKiogUmVtb3ZlIHRoZSBvbmUtYW5kLW9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSB2aXNvciBidXMgdHlwZSAodmlzb3JidXNfdHlwZSkuCisvKioKKyAqIHJlbW92ZV9idXNfdHlwZSgpIC0gcmVtb3ZlIHRoZSBvbmUtYW5kLW9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSB2aXNvciBidXMKKyAqICAgICAgICAgICAgICAgICAgICAgdHlwZSAodmlzb3JidXNfdHlwZSkKICAqLwogc3RhdGljIHZvaWQKIHJlbW92ZV9idXNfdHlwZSh2b2lkKQpAQCAtMTA2MCw3ICsxMDQ3LDggQEAKIAlidXNfdW5yZWdpc3Rlcigmdmlzb3JidXNfdHlwZSk7CiB9CiAKLS8qKiBSZW1vdmUgYWxsIGNoaWxkIHZpc29yIGJ1cyBkZXZpY2UgaW5zdGFuY2VzLgorLyoqCisgKiByZW1vdmVfYWxsX3Zpc29yX2RldmljZXMoKSAtIHJlbW92ZSBhbGwgY2hpbGQgdmlzb3IgYnVzIGRldmljZSBpbnN0YW5jZXMKICAqLwogc3RhdGljIHZvaWQKIHJlbW92ZV9hbGxfdmlzb3JfZGV2aWNlcyh2b2lkKQpAQCAtMTA3NSw3ICsxMDYzLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCit2b2lkCiBjaGlwc2V0X2J1c19jcmVhdGUoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KQogewogCWludCByYzsKQEAgLTEwOTIsMTkgKzEwODAsMTcgQEAKIAkJUE9TVENPREVfTElOVVhfMyhDSElQU0VUX0lOSVRfU1VDQ0VTU19QQywgYnVzX25vLAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKIAotCWlmIChjaGlwc2V0X3Jlc3BvbmRlcnMuYnVzX2NyZWF0ZSkKLQkJKCpjaGlwc2V0X3Jlc3BvbmRlcnMuYnVzX2NyZWF0ZSkgKGRldiwgcmMpOworCWJ1c19jcmVhdGVfcmVzcG9uc2UoZGV2LCByYyk7CiB9CiAKLXN0YXRpYyB2b2lkCit2b2lkCiBjaGlwc2V0X2J1c19kZXN0cm95KHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldikKIHsKIAlyZW1vdmVfYnVzX2luc3RhbmNlKGRldik7Ci0JaWYgKGNoaXBzZXRfcmVzcG9uZGVycy5idXNfZGVzdHJveSkKLQkJKCpjaGlwc2V0X3Jlc3BvbmRlcnMuYnVzX2Rlc3Ryb3kpKGRldiwgMCk7CisJYnVzX2Rlc3Ryb3lfcmVzcG9uc2UoZGV2LCAwKTsKIH0KIAotc3RhdGljIHZvaWQKK3ZvaWQKIGNoaXBzZXRfZGV2aWNlX2NyZWF0ZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXZfaW5mbykKIHsKIAlpbnQgcmM7CkBAIC0xMTE1LDggKzExMDEsNyBAQAogCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogCiAJcmMgPSBjcmVhdGVfdmlzb3JfZGV2aWNlKGRldl9pbmZvKTsKLQlpZiAoY2hpcHNldF9yZXNwb25kZXJzLmRldmljZV9jcmVhdGUpCi0JCWNoaXBzZXRfcmVzcG9uZGVycy5kZXZpY2VfY3JlYXRlKGRldl9pbmZvLCByYyk7CisJZGV2aWNlX2NyZWF0ZV9yZXNwb25zZShkZXZfaW5mbywgcmMpOwogCiAJaWYgKHJjIDwgMCkKIAkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldl9ubywgYnVzX25vLApAQCAtMTEyNiwxOCArMTExMSwyMiBAQAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKIH0KIAotc3RhdGljIHZvaWQKK3ZvaWQKIGNoaXBzZXRfZGV2aWNlX2Rlc3Ryb3koc3RydWN0IHZpc29yX2RldmljZSAqZGV2X2luZm8pCiB7CiAJcmVtb3ZlX3Zpc29yX2RldmljZShkZXZfaW5mbyk7CiAKLQlpZiAoY2hpcHNldF9yZXNwb25kZXJzLmRldmljZV9kZXN0cm95KQotCQkoKmNoaXBzZXRfcmVzcG9uZGVycy5kZXZpY2VfZGVzdHJveSkgKGRldl9pbmZvLCAwKTsKKwlkZXZpY2VfZGVzdHJveV9yZXNwb25zZShkZXZfaW5mbywgMCk7CiB9CiAKLS8qIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHNwZWNpZmllZCBmb3IgYSBmdW5jdGlvbiBkcml2ZXIsIHRvCi0gKiBiZSBjYWxsZWQgd2hlbiBhIHBlbmRpbmcgInBhdXNlIGRldmljZSIgb3BlcmF0aW9uIGhhcyBiZWVuCi0gKiBjb21wbGV0ZWQuCisvKioKKyAqIHBhdXNlX3N0YXRlX2NoYW5nZV9jb21wbGV0ZSgpIC0gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBieSBhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc29yYnVzIGZ1bmN0aW9uIGRyaXZlciB3aGVuIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZyAicGF1c2UgZGV2aWNlIiBvcGVyYXRpb24gaGFzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZAorICogQGRldjogc3RydWN0IHZpc29yX2RldmljZSBpZGVudGlmeWluZyB0aGUgcGF1c2VkIGRldmljZQorICogQHN0YXR1czogMCBpZmYgdGhlIHBhdXNlIHN0YXRlIGNoYW5nZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UKKyAqICAgICAgICAgIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgaW5kaWNhdGluZyB0aGUgcmVhc29uIGZvciBmYWlsdXJlCiAgKi8KIHN0YXRpYyB2b2lkCiBwYXVzZV9zdGF0ZV9jaGFuZ2VfY29tcGxldGUoc3RydWN0IHZpc29yX2RldmljZSAqZGV2LCBpbnQgc3RhdHVzKQpAQCAtMTE0NiwxOSArMTEzNSwxOCBAQAogCQlyZXR1cm47CiAKIAlkZXYtPnBhdXNpbmcgPSBmYWxzZTsKLQlpZiAoIWNoaXBzZXRfcmVzcG9uZGVycy5kZXZpY2VfcGF1c2UpIC8qIHRoaXMgY2FuIG5ldmVyIGhhcHBlbiEgKi8KLQkJcmV0dXJuOwogCi0JLyogTm90aWZ5IHRoZSBjaGlwc2V0IGRyaXZlciB0aGF0IHRoZSBwYXVzZSBpcyBjb21wbGV0ZSwgd2hpY2gKLQkgKiB3aWxsIHByZXN1bWFibHkgd2FudCB0byBzZW5kIHNvbWUgc29ydCBvZiByZXNwb25zZSB0byB0aGUKLQkgKiBpbml0aWF0b3IuCi0JICovCi0JKCpjaGlwc2V0X3Jlc3BvbmRlcnMuZGV2aWNlX3BhdXNlKSAoZGV2LCBzdGF0dXMpOworCWRldmljZV9wYXVzZV9yZXNwb25zZShkZXYsIHN0YXR1cyk7CiB9CiAKLS8qIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHNwZWNpZmllZCBmb3IgYSBmdW5jdGlvbiBkcml2ZXIsIHRvCi0gKiBiZSBjYWxsZWQgd2hlbiBhIHBlbmRpbmcgInJlc3VtZSBkZXZpY2UiIG9wZXJhdGlvbiBoYXMgYmVlbgotICogY29tcGxldGVkLgorLyoqCisgKiByZXN1bWVfc3RhdGVfY2hhbmdlX2NvbXBsZXRlKCkgLSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc29yYnVzIGZ1bmN0aW9uIGRyaXZlciB3aGVuIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgInJlc3VtZSBkZXZpY2UiIG9wZXJhdGlvbiBoYXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZAorICogQGRldjogc3RydWN0IHZpc29yX2RldmljZSBpZGVudGlmeWluZyB0aGUgcmVzdW1lZCBkZXZpY2UKKyAqIEBzdGF0dXM6IDAgaWZmIHRoZSByZXN1bWUgc3RhdGUgY2hhbmdlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZQorICogICAgICAgICAgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBpbmRpY2F0aW5nIHRoZSByZWFzb24gZm9yIGZhaWx1cmUKICAqLwogc3RhdGljIHZvaWQKIHJlc3VtZV9zdGF0ZV9jaGFuZ2VfY29tcGxldGUoc3RydWN0IHZpc29yX2RldmljZSAqZGV2LCBpbnQgc3RhdHVzKQpAQCAtMTE2NywxOSArMTE1NSwyNSBAQAogCQlyZXR1cm47CiAKIAlkZXYtPnJlc3VtaW5nID0gZmFsc2U7Ci0JaWYgKCFjaGlwc2V0X3Jlc3BvbmRlcnMuZGV2aWNlX3Jlc3VtZSkgLyogdGhpcyBjYW4gbmV2ZXIgaGFwcGVuISAqLwotCQlyZXR1cm47CiAKLQkvKiBOb3RpZnkgdGhlIGNoaXBzZXQgZHJpdmVyIHRoYXQgdGhlIHJlc3VtZSBpcyBjb21wbGV0ZSwKKwkvKgorCSAqIE5vdGlmeSB0aGUgY2hpcHNldCBkcml2ZXIgdGhhdCB0aGUgcmVzdW1lIGlzIGNvbXBsZXRlLAogCSAqIHdoaWNoIHdpbGwgcHJlc3VtYWJseSB3YW50IHRvIHNlbmQgc29tZSBzb3J0IG9mIHJlc3BvbnNlIHRvCiAJICogdGhlIGluaXRpYXRvci4KIAkgKi8KLQkoKmNoaXBzZXRfcmVzcG9uZGVycy5kZXZpY2VfcmVzdW1lKSAoZGV2LCBzdGF0dXMpOworCWRldmljZV9yZXN1bWVfcmVzcG9uc2UoZGV2LCBzdGF0dXMpOwogfQogCi0vKiBUZWxsIHRoZSBzdWJvcmRpbmF0ZSBmdW5jdGlvbiBkcml2ZXIgZm9yIGEgc3BlY2lmaWMgZGV2aWNlIHRvIHBhdXNlCi0gKiBvciByZXN1bWUgdGhhdCBkZXZpY2UuICBSZXN1bHQgaXMgcmV0dXJuZWQgYXN5bmNocm9ub3VzbHkgdmlhIGEKLSAqIGNhbGxiYWNrIGZ1bmN0aW9uLgorLyoqCisgKiBpbml0aWF0ZV9jaGlwc2V0X2RldmljZV9wYXVzZV9yZXN1bWUoKSAtIHN0YXJ0IGEgcGF1c2Ugb3IgcmVzdW1lIG9wZXJhdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYSB2aXNvciBkZXZpY2UKKyAqIEBkZXY6IHN0cnVjdCB2aXNvcl9kZXZpY2UgaWRlbnRpZnlpbmcgdGhlIGRldmljZSBiZWluZyBwYXVzZWQgb3IgcmVzdW1lZAorICogQGlzX3BhdXNlOiB0cnVlIHRvIGluZGljYXRlIHBhdXNlIG9wZXJhdGlvbiwgZmFsc2UgdG8gaW5kaWNhdGUgcmVzdW1lCisgKgorICogVGVsbCB0aGUgc3Vib3JkaW5hdGUgZnVuY3Rpb24gZHJpdmVyIGZvciBhIHNwZWNpZmljIGRldmljZSB0byBwYXVzZQorICogb3IgcmVzdW1lIHRoYXQgZGV2aWNlLiAgU3VjY2Vzcy9mYWlsdXJlIHJlc3VsdCBpcyByZXR1cm5lZCBhc3luY2hyb25vdXNseQorICogdmlhIGEgY2FsbGJhY2sgZnVuY3Rpb247IHNlZSBwYXVzZV9zdGF0ZV9jaGFuZ2VfY29tcGxldGUoKSBhbmQKKyAqIHJlc3VtZV9zdGF0ZV9jaGFuZ2VfY29tcGxldGUoKS4KICAqLwogc3RhdGljIHZvaWQKIGluaXRpYXRlX2NoaXBzZXRfZGV2aWNlX3BhdXNlX3Jlc3VtZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYsIGJvb2wgaXNfcGF1c2UpCkBAIC0xMTg5LDkgKzExODMsOSBAQAogCXZvaWQgKCpub3RpZnlfZnVuYykoc3RydWN0IHZpc29yX2RldmljZSAqZGV2LCBpbnQgcmVzcG9uc2UpID0gTlVMTDsKIAogCWlmIChpc19wYXVzZSkKLQkJbm90aWZ5X2Z1bmMgPSBjaGlwc2V0X3Jlc3BvbmRlcnMuZGV2aWNlX3BhdXNlOworCQlub3RpZnlfZnVuYyA9IGRldmljZV9wYXVzZV9yZXNwb25zZTsKIAllbHNlCi0JCW5vdGlmeV9mdW5jID0gY2hpcHNldF9yZXNwb25kZXJzLmRldmljZV9yZXN1bWU7CisJCW5vdGlmeV9mdW5jID0gZGV2aWNlX3Jlc3VtZV9yZXNwb25zZTsKIAlpZiAoIW5vdGlmeV9mdW5jKQogCQlyZXR1cm47CiAKQEAgLTEyMDYsNyArMTIwMCw4IEBACiAJCXJldHVybjsKIAl9CiAKLQkvKiBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggYm90aCBkcnYtPnBhdXNlKCkgYW5kIGRydi0+cmVzdW1lCisJLyoKKwkgKiBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggYm90aCBkcnYtPnBhdXNlKCkgYW5kIGRydi0+cmVzdW1lCiAJICogc3BlY2lmeSBhIGNhbGxiYWNrIGZ1bmN0aW9uLCBpdCBpcyBOT1QgbmVjZXNzYXJ5IGZvciB1cyB0bwogCSAqIGluY3JlbWVudCBvdXIgbG9jYWwgbW9kdWxlIHVzYWdlIGNvdW50LiAgUmVhc29uIGlzLCB0aGVyZQogCSAqIGlzIGFscmVhZHkgYSBsaW5rYWdlIGRlcGVuZGVuY3kgYmV0d2VlbiBjaGlsZCBmdW5jdGlvbgpAQCAtMTI0NiwzMyArMTI0MSw0MSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQKKy8qKgorICogY2hpcHNldF9kZXZpY2VfcGF1c2UoKSAtIHN0YXJ0IGEgcGF1c2Ugb3BlcmF0aW9uIGZvciBhIHZpc29yIGRldmljZQorICogQGRldl9pbmZvOiBzdHJ1Y3Qgdmlzb3JfZGV2aWNlIGlkZW50aWZ5aW5nIHRoZSBkZXZpY2UgYmVpbmcgcGF1c2VkCisgKgorICogVGVsbCB0aGUgc3Vib3JkaW5hdGUgZnVuY3Rpb24gZHJpdmVyIGZvciBhIHNwZWNpZmljIGRldmljZSB0byBwYXVzZQorICogdGhhdCBkZXZpY2UuICBTdWNjZXNzL2ZhaWx1cmUgcmVzdWx0IGlzIHJldHVybmVkIGFzeW5jaHJvbm91c2x5CisgKiB2aWEgYSBjYWxsYmFjayBmdW5jdGlvbjsgc2VlIHBhdXNlX3N0YXRlX2NoYW5nZV9jb21wbGV0ZSgpLgorICovCit2b2lkCiBjaGlwc2V0X2RldmljZV9wYXVzZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXZfaW5mbykKIHsKIAlpbml0aWF0ZV9jaGlwc2V0X2RldmljZV9wYXVzZV9yZXN1bWUoZGV2X2luZm8sIHRydWUpOwogfQogCi1zdGF0aWMgdm9pZAorLyoqCisgKiBjaGlwc2V0X2RldmljZV9yZXN1bWUoKSAtIHN0YXJ0IGEgcmVzdW1lIG9wZXJhdGlvbiBmb3IgYSB2aXNvciBkZXZpY2UKKyAqIEBkZXZfaW5mbzogc3RydWN0IHZpc29yX2RldmljZSBpZGVudGlmeWluZyB0aGUgZGV2aWNlIGJlaW5nIHJlc3VtZWQKKyAqCisgKiBUZWxsIHRoZSBzdWJvcmRpbmF0ZSBmdW5jdGlvbiBkcml2ZXIgZm9yIGEgc3BlY2lmaWMgZGV2aWNlIHRvIHJlc3VtZQorICogdGhhdCBkZXZpY2UuICBTdWNjZXNzL2ZhaWx1cmUgcmVzdWx0IGlzIHJldHVybmVkIGFzeW5jaHJvbm91c2x5CisgKiB2aWEgYSBjYWxsYmFjayBmdW5jdGlvbjsgc2VlIHJlc3VtZV9zdGF0ZV9jaGFuZ2VfY29tcGxldGUoKS4KKyAqLwordm9pZAogY2hpcHNldF9kZXZpY2VfcmVzdW1lKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvKQogewogCWluaXRpYXRlX2NoaXBzZXRfZGV2aWNlX3BhdXNlX3Jlc3VtZShkZXZfaW5mbywgZmFsc2UpOwogfQogCi1zdHJ1Y3QgY2hhbm5lbF9zaXplX2luZm8gewotCXV1aWRfbGUgZ3VpZDsKLQl1bnNpZ25lZCBsb25nIG1pbl9zaXplOwotCXVuc2lnbmVkIGxvbmcgbWF4X3NpemU7Ci19OwotCiBpbnQKIHZpc29yYnVzX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyOwogCiAJUE9TVENPREVfTElOVVhfMyhEUklWRVJfRU5UUllfUEMsIDAsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwotCWJ1c19kZXZpY2VfaW5mb19pbml0KCZjbGllbnRidXNfZHJpdmVyaW5mbywKLQkJCSAgICAgImNsaWVudGJ1cyIsICJ2aXNvcmJ1cyIsCi0JCQkgICAgIFZFUlNJT04sIE5VTEwpOworCWJ1c19kZXZpY2VfaW5mb19pbml0KCZjbGllbnRidXNfZHJpdmVyaW5mbywgImNsaWVudGJ1cyIsICJ2aXNvcmJ1cyIpOwogCiAJZXJyID0gY3JlYXRlX2J1c190eXBlKCk7CiAJaWYgKGVyciA8IDApIHsKQEAgLTEyODAsMTkgKzEyODMsNyBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCXBlcmlvZGljX2Rldl93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgidmlzb3JidXNfZGV2Iik7Ci0JaWYgKCFwZXJpb2RpY19kZXZfd29ya3F1ZXVlKSB7Ci0JCVBPU1RDT0RFX0xJTlVYXzIoQ1JFQVRFX1dPUktRVUVVRV9QQywgRElBR19TRVZFUklUWV9FUlIpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yOwotCX0KLQotCS8qIFRoaXMgZW5hYmxlcyB1cyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgd2hlbiBkZXZpY2VzIGFwcGVhciBmb3IKLQkgKiB3aGljaCB0aGlzIHNlcnZpY2UgcGFydGl0aW9uIGlzIHRvIGJlIGEgc2VydmVyIGZvci4KLQkgKi8KLQl2aXNvcmNoaXBzZXRfcmVnaXN0ZXJfYnVzZGV2KCZjaGlwc2V0X25vdGlmaWVycywKLQkJCQkgICAgICZjaGlwc2V0X3Jlc3BvbmRlcnMsCi0JCQkJICAgICAmY2hpcHNldF9kcml2ZXJpbmZvKTsKKwlidXNfZGV2aWNlX2luZm9faW5pdCgmY2hpcHNldF9kcml2ZXJpbmZvLCAiY2hpcHNldCIsICJ2aXNvcmNoaXBzZXQiKTsKIAogCXJldHVybiAwOwogCkBAIC0xMzA2LDIwICsxMjk3LDggQEAKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ZW50cnksICpsaXN0dG1wOwogCi0Jdmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2RldihOVUxMLCBOVUxMLCBOVUxMKTsKIAlyZW1vdmVfYWxsX3Zpc29yX2RldmljZXMoKTsKIAotCWZsdXNoX3dvcmtxdWV1ZShwZXJpb2RpY19kZXZfd29ya3F1ZXVlKTsgLyogYmV0dGVyIG5vdCBiZSBhbnkgd29yayEgKi8KLQlkZXN0cm95X3dvcmtxdWV1ZShwZXJpb2RpY19kZXZfd29ya3F1ZXVlKTsKLQlwZXJpb2RpY19kZXZfd29ya3F1ZXVlID0gTlVMTDsKLQotCWlmIChwZXJpb2RpY190ZXN0X3dvcmtxdWV1ZSkgewotCQljYW5jZWxfZGVsYXllZF93b3JrKCZwZXJpb2RpY193b3JrKTsKLQkJZmx1c2hfd29ya3F1ZXVlKHBlcmlvZGljX3Rlc3Rfd29ya3F1ZXVlKTsKLQkJZGVzdHJveV93b3JrcXVldWUocGVyaW9kaWNfdGVzdF93b3JrcXVldWUpOwotCQlwZXJpb2RpY190ZXN0X3dvcmtxdWV1ZSA9IE5VTEw7Ci0JfQotCiAJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3RlbnRyeSwgbGlzdHRtcCwgJmxpc3RfYWxsX2J1c19pbnN0YW5jZXMpIHsKIAkJc3RydWN0IHZpc29yX2RldmljZSAqZGV2ID0gbGlzdF9lbnRyeShsaXN0ZW50cnksCiAJCQkJCQkgICAgICBzdHJ1Y3Qgdmlzb3JfZGV2aWNlLApAQCAtMTMyOSw5ICsxMzA4LDYgQEAKIAlyZW1vdmVfYnVzX3R5cGUoKTsKIH0KIAotbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCB2aXNvcmJ1c19kZWJ1ZywgaW50LCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0Modmlzb3JidXNfZGVidWcsICIxIHRvIGRlYnVnIik7Ci0KIG1vZHVsZV9wYXJhbV9uYW1lZChmb3JjZW1hdGNoLCB2aXNvcmJ1c19mb3JjZW1hdGNoLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyh2aXNvcmJ1c19mb3JjZW1hdGNoLAogCQkgIjEgdG8gZm9yY2UgYSBzdWNjZXNzZnVsIGRldiA8LS0+IGRydiBtYXRjaCIpOwpAQCAtMTMzOSw2ICsxMzE1LDMgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChmb3JjZW5vbWF0Y2gsIHZpc29yYnVzX2ZvcmNlbm9tYXRjaCwgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0Modmlzb3JidXNfZm9yY2Vub21hdGNoLAogCQkgIjEgdG8gZm9yY2UgYW4gVU5zdWNjZXNzZnVsIGRldiA8LS0+IGRydiBtYXRjaCIpOwotCi1tb2R1bGVfcGFyYW1fbmFtZWQoZGVidWdyZWYsIHZpc29yYnVzX2RlYnVncmVmLCBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyh2aXNvcmJ1c19kZWJ1Z3JlZiwgIjEgdG8gZGVidWcgcmVmZXJlbmNlIGNvdW50aW5nIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yYnVzX3ByaXZhdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmlzb3JidXNfcHJpdmF0ZS5oCmluZGV4IDM5ZWRkMjAuLjE1NDAzZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmlzb3JidXNfcHJpdmF0ZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmlzb3JidXNfcHJpdmF0ZS5oCkBAIC0xLDQgKzEsNCBAQAotLyogdmlzb3JjaGlwc2V0LmgKKy8qIHZpc29yYnVzX3ByaXZhdGUuaAogICoKICAqIENvcHlyaWdodCAoQykgMjAxMCAtIDIwMTUgVU5JU1lTIENPUlBPUkFUSU9OCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgpAQCAtMTQsNTUgKzE0LDcyIEBACiAgKiBkZXRhaWxzLgogICovCiAKLSNpZm5kZWYgX19WSVNPUkNISVBTRVRfSF9fCi0jZGVmaW5lIF9fVklTT1JDSElQU0VUX0hfXworI2lmbmRlZiBfX1ZJU09SQlVTX1BSSVZBVEVfSF9fCisjZGVmaW5lIF9fVklTT1JCVVNfUFJJVkFURV9IX18KIAogI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAKICNpbmNsdWRlICJjb250cm9sdm1jaGFubmVsLmgiCi0jaW5jbHVkZSAidmJ1c2RldmljZWluZm8uaCIKLSNpbmNsdWRlICJ2YnVzaGVscGVyLmgiCisjaW5jbHVkZSAidmJ1c2NoYW5uZWwuaCIKIAotLyogIFRoZXNlIGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB2aXNvcmNoaXBzZXQgd2hlbiBjZXJ0YWluCi0gKiAgZXZlbnRzIGhhcHBlbi4gIChUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgZnVuY3Rpb25zIGlzIG91dHNpZGUgb2YKLSAqICB2aXNvcmNoaXBzZXQuKQorLyogVEFSR0VUX0hPU1ROQU1FIHNwZWNpZmllZCBhcyAtRFRBUkdFVF9IT1NUTkFNRT1cInRoZW5hbWVcIiBvbiB0aGUKKyAqIGNvbW1hbmQgbGluZQogICovCi1zdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c2Rldl9ub3RpZmllcnMgewotCXZvaWQgKCpidXNfY3JlYXRlKShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpidXNfaW5mbyk7Ci0Jdm9pZCAoKmJ1c19kZXN0cm95KShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpidXNfaW5mbyk7Ci0Jdm9pZCAoKmRldmljZV9jcmVhdGUpKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmJ1c19pbmZvKTsKLQl2b2lkICgqZGV2aWNlX2Rlc3Ryb3kpKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmJ1c19pbmZvKTsKLQl2b2lkICgqZGV2aWNlX3BhdXNlKShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpidXNfaW5mbyk7Ci0Jdm9pZCAoKmRldmljZV9yZXN1bWUpKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmJ1c19pbmZvKTsKLX07CiAKLS8qICBUaGVzZSBmdW5jdGlvbnMgbGl2ZSBpbnNpZGUgdmlzb3JjaGlwc2V0LCBhbmQgd2lsbCBiZSBjYWxsZWQgdG8gaW5kaWNhdGUKLSAqICByZXNwb25zZXMgdG8gc3BlY2lmaWMgZXZlbnRzIChieSBjb2RlIG91dHNpZGUgb2Ygdmlzb3JjaGlwc2V0KS4KLSAqICBGb3Igbm93LCB0aGUgdmFsdWUgZm9yIGVhY2ggcmVzcG9uc2UgaXMgc2ltcGx5IGVpdGhlcjoKLSAqICAgICAgIDAgPSBpdCB3b3JrZWQKLSAqICAgICAgLTEgPSBpdCBmYWlsZWQKLSAqLwotc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfcmVzcG9uZGVycyB7Ci0Jdm9pZCAoKmJ1c19jcmVhdGUpKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnAsIGludCByZXNwb25zZSk7Ci0Jdm9pZCAoKmJ1c19kZXN0cm95KShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwotCXZvaWQgKCpkZXZpY2VfY3JlYXRlKShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwotCXZvaWQgKCpkZXZpY2VfZGVzdHJveSkoc3RydWN0IHZpc29yX2RldmljZSAqcCwgaW50IHJlc3BvbnNlKTsKLQl2b2lkICgqZGV2aWNlX3BhdXNlKShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwotCXZvaWQgKCpkZXZpY2VfcmVzdW1lKShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwotfTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBidXNfZGV2aWNlX2luZm9faW5pdCgKKwkJc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyAqYnVzX2RldmljZV9pbmZvX3B0ciwKKwkJY29uc3QgY2hhciAqZGV2X3R5cGUsIGNvbnN0IGNoYXIgKmRydl9uYW1lKQoreworCW1lbXNldChidXNfZGV2aWNlX2luZm9fcHRyLCAwLCBzaXplb2Yoc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbykpOworCXNucHJpbnRmKGJ1c19kZXZpY2VfaW5mb19wdHItPmRldnR5cGUsCisJCSBzaXplb2YoYnVzX2RldmljZV9pbmZvX3B0ci0+ZGV2dHlwZSksCisJCSAiJXMiLCAoZGV2X3R5cGUpID8gZGV2X3R5cGUgOiAidW5rbm93blR5cGUiKTsKKwlzbnByaW50ZihidXNfZGV2aWNlX2luZm9fcHRyLT5kcnZuYW1lLAorCQkgc2l6ZW9mKGJ1c19kZXZpY2VfaW5mb19wdHItPmRydm5hbWUpLAorCQkgIiVzIiwgKGRydl9uYW1lKSA/IGRydl9uYW1lIDogInVua25vd25Ecml2ZXIiKTsKKwlzbnByaW50ZihidXNfZGV2aWNlX2luZm9fcHRyLT5pbmZvc3RycywKKwkJIHNpemVvZihidXNfZGV2aWNlX2luZm9fcHRyLT5pbmZvc3RycyksICJrZXJuZWwgdmVyLiAlcyIsCisJCSB1dHNuYW1lKCktPnJlbGVhc2UpOworfQogCi0vKiogUmVnaXN0ZXIgZnVuY3Rpb25zIChpbiB0aGUgYnVzIGRyaXZlcikgdG8gZ2V0IGNhbGxlZCBieSB2aXNvcmNoaXBzZXQKLSAqICB3aGVuZXZlciBhIGJ1cyBvciBkZXZpY2UgYXBwZWFycyBmb3Igd2hpY2ggdGhpcyBndWVzdCBpcyB0byBiZSB0aGUKLSAqICBjbGllbnQgZm9yLiAgdmlzb3JjaGlwc2V0IHdpbGwgZmlsbCBpbiA8cmVzcG9uZGVycz4sIHRvIGluZGljYXRlCi0gKiAgZnVuY3Rpb25zIHRoZSBidXMgZHJpdmVyIHNob3VsZCBjYWxsIHRvIGluZGljYXRlIG1lc3NhZ2UgcmVzcG9uc2VzLgotICovCi12b2lkCi12aXNvcmNoaXBzZXRfcmVnaXN0ZXJfYnVzZGV2KAotCQkJc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfbm90aWZpZXJzICpub3RpZmllcnMsCi0JCQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c2Rldl9yZXNwb25kZXJzICpyZXNwb25kZXJzLAotCQkJc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyAqZHJpdmVyX2luZm8pOwordm9pZCBjaGlwc2V0X2J1c19jcmVhdGUoc3RydWN0IHZpc29yX2RldmljZSAqYnVzX2luZm8pOwordm9pZCBjaGlwc2V0X2J1c19kZXN0cm95KHN0cnVjdCB2aXNvcl9kZXZpY2UgKmJ1c19pbmZvKTsKK3ZvaWQgY2hpcHNldF9kZXZpY2VfY3JlYXRlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvKTsKK3ZvaWQgY2hpcHNldF9kZXZpY2VfZGVzdHJveShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXZfaW5mbyk7Cit2b2lkIGNoaXBzZXRfZGV2aWNlX3BhdXNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvKTsKK3ZvaWQgY2hpcHNldF9kZXZpY2VfcmVzdW1lKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvKTsKIAotLyogdmlzb3JidXMgaW5pdCBhbmQgZXhpdCBmdW5jdGlvbnMgKi8KK3ZvaWQgYnVzX2NyZWF0ZV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwordm9pZCBidXNfZGVzdHJveV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwordm9pZCBkZXZpY2VfY3JlYXRlX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnAsIGludCByZXNwb25zZSk7Cit2b2lkIGRldmljZV9kZXN0cm95X3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnAsIGludCByZXNwb25zZSk7Cit2b2lkIGRldmljZV9yZXN1bWVfcmVzcG9uc2Uoc3RydWN0IHZpc29yX2RldmljZSAqcCwgaW50IHJlc3BvbnNlKTsKK3ZvaWQgZGV2aWNlX3BhdXNlX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnAsIGludCByZXNwb25zZSk7CisKIGludCB2aXNvcmJ1c19pbml0KHZvaWQpOwogdm9pZCB2aXNvcmJ1c19leGl0KHZvaWQpOworCisvKiB2aXNvcmNoYW5uZWwgYWNjZXNzIGZ1bmN0aW9ucyAqLworCitzdHJ1Y3Qgdmlzb3JjaGFubmVsICp2aXNvcmNoYW5uZWxfY3JlYXRlKHU2NCBwaHlzYWRkciwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgY2hhbm5lbF9ieXRlcywKKwkJCQkJIGdmcF90IGdmcCwgdXVpZF9sZSBndWlkKTsKK3N0cnVjdCB2aXNvcmNoYW5uZWwgKnZpc29yY2hhbm5lbF9jcmVhdGVfd2l0aF9sb2NrKHU2NCBwaHlzYWRkciwKKwkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgY2hhbm5lbF9ieXRlcywKKwkJCQkJCSAgIGdmcF90IGdmcCwgdXVpZF9sZSBndWlkKTsKK3ZvaWQgdmlzb3JjaGFubmVsX2Rlc3Ryb3koc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCk7CitpbnQgdmlzb3JjaGFubmVsX3JlYWQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LAorCQkgICAgICB2b2lkICpsb2NhbCwgdWxvbmcgbmJ5dGVzKTsKK2ludCB2aXNvcmNoYW5uZWxfd3JpdGUoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LAorCQkgICAgICAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcyk7Cit1NjQgdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKTsKK3Vsb25nIHZpc29yY2hhbm5lbF9nZXRfbmJ5dGVzKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpOworY2hhciAqdmlzb3JjaGFubmVsX2lkKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIGNoYXIgKnMpOworY2hhciAqdmlzb3JjaGFubmVsX3pvbmVpZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCBjaGFyICpzKTsKK3U2NCB2aXNvcmNoYW5uZWxfZ2V0X2NsaWVudHBhcnRpdGlvbihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKTsKK2ludCB2aXNvcmNoYW5uZWxfc2V0X2NsaWVudHBhcnRpdGlvbihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLAorCQkJCSAgICAgdTY0IHBhcnRpdGlvbl9oYW5kbGUpOworY2hhciAqdmlzb3JjaGFubmVsX3V1aWRfaWQodXVpZF9sZSAqZ3VpZCwgY2hhciAqcyk7Cit2b2lkIF9faW9tZW0gKnZpc29yY2hhbm5lbF9nZXRfaGVhZGVyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yY2hhbm5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92aXNvcmNoYW5uZWwuYwppbmRleCA0MzM3MzU4Li4zMDBhNjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yY2hhbm5lbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmlzb3JjaGFubmVsLmMKQEAgLTE1LDE0ICsxNSwxMyBAQAogICovCiAKIC8qCi0gKiAgVGhpcyBwcm92aWRlcyBTdXBlcnZpc29yIGNoYW5uZWwgY29tbXVuaWNhdGlvbiBwcmltaXRpdmVzLCB3aGljaCBhcmUKKyAqICBUaGlzIHByb3ZpZGVzIHMtUGFyIGNoYW5uZWwgY29tbXVuaWNhdGlvbiBwcmltaXRpdmVzLCB3aGljaCBhcmUKICAqICBpbmRlcGVuZGVudCBvZiB0aGUgbWVjaGFuaXNtIHVzZWQgdG8gYWNjZXNzIHRoZSBjaGFubmVsIGRhdGEuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSAidmVyc2lvbi5oIgogI2luY2x1ZGUgInZpc29yYnVzLmgiCiAjaW5jbHVkZSAiY29udHJvbHZtY2hhbm5lbC5oIgogCkBAIC01NSwxMyArNTQsMzQyIEBACiAJdXVpZF9sZSBpbnN0OwogfTsKIAotLyogQ3JlYXRlcyB0aGUgc3RydWN0IHZpc29yY2hhbm5lbCBhYnN0cmFjdGlvbiBmb3IgYSBkYXRhIGFyZWEgaW4gbWVtb3J5LAotICogYnV0IGRvZXMgTk9UIG1vZGlmeSB0aGlzIGRhdGEgYXJlYS4KK3ZvaWQKK3Zpc29yY2hhbm5lbF9kZXN0cm95KHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpCit7CisJaWYgKCFjaGFubmVsKQorCQlyZXR1cm47CisJaWYgKGNoYW5uZWwtPm1hcHBlZCkgeworCQltZW11bm1hcChjaGFubmVsLT5tYXBwZWQpOworCQlpZiAoY2hhbm5lbC0+cmVxdWVzdGVkKQorCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGNoYW5uZWwtPnBoeXNhZGRyLCBjaGFubmVsLT5uYnl0ZXMpOworCX0KKwlrZnJlZShjaGFubmVsKTsKK30KKwordTY0Cit2aXNvcmNoYW5uZWxfZ2V0X3BoeXNhZGRyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpCit7CisJcmV0dXJuIGNoYW5uZWwtPnBoeXNhZGRyOworfQorCit1bG9uZwordmlzb3JjaGFubmVsX2dldF9uYnl0ZXMoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlyZXR1cm4gY2hhbm5lbC0+bmJ5dGVzOworfQorCitjaGFyICoKK3Zpc29yY2hhbm5lbF91dWlkX2lkKHV1aWRfbGUgKmd1aWQsIGNoYXIgKnMpCit7CisJc3ByaW50ZihzLCAiJXBVTCIsIGd1aWQpOworCXJldHVybiBzOworfQorCitjaGFyICoKK3Zpc29yY2hhbm5lbF9pZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCBjaGFyICpzKQoreworCXJldHVybiB2aXNvcmNoYW5uZWxfdXVpZF9pZCgmY2hhbm5lbC0+Z3VpZCwgcyk7Cit9CisKK2NoYXIgKgordmlzb3JjaGFubmVsX3pvbmVpZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCBjaGFyICpzKQoreworCXJldHVybiB2aXNvcmNoYW5uZWxfdXVpZF9pZCgmY2hhbm5lbC0+Y2hhbl9oZHIuem9uZV91dWlkLCBzKTsKK30KKwordTY0Cit2aXNvcmNoYW5uZWxfZ2V0X2NsaWVudHBhcnRpdGlvbihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQoreworCXJldHVybiBjaGFubmVsLT5jaGFuX2hkci5wYXJ0aXRpb25faGFuZGxlOworfQorCitpbnQKK3Zpc29yY2hhbm5lbF9zZXRfY2xpZW50cGFydGl0aW9uKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsCisJCQkJIHU2NCBwYXJ0aXRpb25faGFuZGxlKQoreworCWNoYW5uZWwtPmNoYW5faGRyLnBhcnRpdGlvbl9oYW5kbGUgPSBwYXJ0aXRpb25faGFuZGxlOworCXJldHVybiAwOworfQorCisvKioKKyAqIHZpc29yY2hhbm5lbF9nZXRfdXVpZCgpIC0gcXVlcmllcyB0aGUgVVVJRCBvZiB0aGUgZGVzaWduYXRlZCBjaGFubmVsCisgKiBAY2hhbm5lbDogdGhlIGNoYW5uZWwgdG8gcXVlcnkKKyAqCisgKiBSZXR1cm46IHRoZSBVVUlEIG9mIHRoZSBwcm92aWRlZCBjaGFubmVsCisgKi8KK3V1aWRfbGUKK3Zpc29yY2hhbm5lbF9nZXRfdXVpZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQoreworCXJldHVybiBjaGFubmVsLT5ndWlkOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF91dWlkKTsKKworaW50Cit2aXNvcmNoYW5uZWxfcmVhZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1bG9uZyBvZmZzZXQsCisJCSAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcykKK3sKKwlpZiAob2Zmc2V0ICsgbmJ5dGVzID4gY2hhbm5lbC0+bmJ5dGVzKQorCQlyZXR1cm4gLUVJTzsKKworCW1lbWNweShsb2NhbCwgY2hhbm5lbC0+bWFwcGVkICsgb2Zmc2V0LCBuYnl0ZXMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAordmlzb3JjaGFubmVsX3dyaXRlKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwKKwkJICAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcykKK3sKKwlzaXplX3QgY2hkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcik7CisJc2l6ZV90IGNvcHlfc2l6ZTsKKworCWlmIChvZmZzZXQgKyBuYnl0ZXMgPiBjaGFubmVsLT5uYnl0ZXMpCisJCXJldHVybiAtRUlPOworCisJaWYgKG9mZnNldCA8IGNoZHJfc2l6ZSkgeworCQljb3B5X3NpemUgPSBtaW4oY2hkcl9zaXplIC0gb2Zmc2V0LCBuYnl0ZXMpOworCQltZW1jcHkoKChjaGFyICopKCZjaGFubmVsLT5jaGFuX2hkcikpICsgb2Zmc2V0LAorCQkgICAgICAgbG9jYWwsIGNvcHlfc2l6ZSk7CisJfQorCisJbWVtY3B5KGNoYW5uZWwtPm1hcHBlZCArIG9mZnNldCwgbG9jYWwsIG5ieXRlcyk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2lvbWVtICAqCit2aXNvcmNoYW5uZWxfZ2V0X2hlYWRlcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQoreworCXJldHVybiAodm9pZCBfX2lvbWVtICopJmNoYW5uZWwtPmNoYW5faGRyOworfQorCisvKgorICogUmV0dXJuIG9mZnNldCBvZiBhIHNwZWNpZmljIFNJR05BTF9RVUVVRV9IRUFERVIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGEKKyAqIGNoYW5uZWwgaGVhZGVyCisgKi8KKyNkZWZpbmUgU0lHX1FVRVVFX09GRlNFVChjaGFuX2hkciwgcSkgXAorCSgoY2hhbl9oZHIpLT5jaF9zcGFjZV9vZmZzZXQgKyBcCisJICgocSkgKiBzaXplb2Yoc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIpKSkKKworLyoKKyAqIFJldHVybiBvZmZzZXQgb2YgYSBzcGVjaWZpYyBxdWV1ZSBlbnRyeSAoZGF0YSkgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGEKKyAqIGNoYW5uZWwgaGVhZGVyCisgKi8KKyNkZWZpbmUgU0lHX0RBVEFfT0ZGU0VUKGNoYW5faGRyLCBxLCBzaWdfaGRyLCBzbG90KSBcCisJKFNJR19RVUVVRV9PRkZTRVQoY2hhbl9oZHIsIHEpICsgKHNpZ19oZHIpLT5zaWdfYmFzZV9vZmZzZXQgKyBcCisJICAgICgoc2xvdCkgKiAoc2lnX2hkciktPnNpZ25hbF9zaXplKSkKKworLyoKKyAqIFdyaXRlIHRoZSBjb250ZW50cyBvZiBhIHNwZWNpZmljIGZpZWxkIHdpdGhpbiBhIFNJR05BTF9RVUVVRV9IRUFERVIgYmFjaworICogaW50byBob3N0IG1lbW9yeQorICovCisjZGVmaW5lIFNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgc2lnX2hkciwgRklFTEQpCQkJIFwKKwl2aXNvcmNoYW5uZWxfd3JpdGUoY2hhbm5lbCwJCQkJCSBcCisJCQkgICBTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUpICtcCisJCQkgICBvZmZzZXRvZihzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciwgRklFTEQpLCBcCisJCQkgICAmKChzaWdfaGRyKS0+RklFTEQpLAkJCSBcCisJCQkgICBzaXplb2YoKHNpZ19oZHIpLT5GSUVMRCkpCisKK3N0YXRpYyBpbnQKK3NpZ19yZWFkX2hlYWRlcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUsCisJCXN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyICpzaWdfaGRyKQoreworCWlmIChjaGFubmVsLT5jaGFuX2hkci5jaF9zcGFjZV9vZmZzZXQgPCBzaXplb2Yoc3RydWN0IGNoYW5uZWxfaGVhZGVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBSZWFkIHRoZSBhcHByb3ByaWF0ZSBTSUdOQUxfUVVFVUVfSEVBREVSIGludG8gbG9jYWwgbWVtb3J5LiAqLworCXJldHVybiB2aXNvcmNoYW5uZWxfcmVhZChjaGFubmVsLAorCQkJCSBTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUpLAorCQkJCSBzaWdfaGRyLCBzaXplb2Yoc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3NpZ19yZWFkX2RhdGEoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLAorCSAgICAgIHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyICpzaWdfaGRyLCB1MzIgc2xvdCwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgc2lnbmFsX2RhdGFfb2Zmc2V0ID0gU0lHX0RBVEFfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUsCisJCQkJCQkgc2lnX2hkciwgc2xvdCk7CisKKwlyZXR1cm4gdmlzb3JjaGFubmVsX3JlYWQoY2hhbm5lbCwgc2lnbmFsX2RhdGFfb2Zmc2V0LAorCQkJCSBkYXRhLCBzaWdfaGRyLT5zaWduYWxfc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitzaWdfd3JpdGVfZGF0YShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUsCisJICAgICAgIHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyICpzaWdfaGRyLCB1MzIgc2xvdCwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgc2lnbmFsX2RhdGFfb2Zmc2V0ID0gU0lHX0RBVEFfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUsCisJCQkJCQkgc2lnX2hkciwgc2xvdCk7CisKKwlyZXR1cm4gdmlzb3JjaGFubmVsX3dyaXRlKGNoYW5uZWwsIHNpZ25hbF9kYXRhX29mZnNldCwKKwkJCQkgIGRhdGEsIHNpZ19oZHItPnNpZ25hbF9zaXplKTsKK30KKworc3RhdGljIGludAorc2lnbmFscmVtb3ZlX2lubmVyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSwgdm9pZCAqbXNnKQoreworCXN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyIHNpZ19oZHI7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWlmIChzaWdfaGRyLmhlYWQgPT0gc2lnX2hkci50YWlsKQorCQlyZXR1cm4gLUVJTzsJLyogbm8gc2lnbmFscyB0byByZW1vdmUgKi8KKworCXNpZ19oZHIudGFpbCA9IChzaWdfaGRyLnRhaWwgKyAxKSAlIHNpZ19oZHIubWF4X3Nsb3RzOworCisJZXJyb3IgPSBzaWdfcmVhZF9kYXRhKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgc2lnX2hkci50YWlsLCBtc2cpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJc2lnX2hkci5udW1fcmVjZWl2ZWQrKzsKKworCS8qCisJICogRm9yIGVhY2ggZGF0YSBmaWVsZCBpbiBTSUdOQUxfUVVFVUVfSEVBREVSIHRoYXQgd2FzIG1vZGlmaWVkLAorCSAqIHVwZGF0ZSBob3N0IG1lbW9yeS4KKwkgKi8KKwltYigpOyAvKiByZXF1aXJlZCBmb3IgY2hhbm5lbCBzeW5jaCAqLworCisJZXJyb3IgPSBTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCB0YWlsKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwllcnJvciA9IFNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIG51bV9yZWNlaXZlZCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKCkgLSByZW1vdmVzIGEgbWVzc2FnZSBmcm9tIHRoZSBkZXNpZ25hdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsL3F1ZXVlCisgKiBAY2hhbm5lbDogdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSByZW1vdmVkIGZyb20KKyAqIEBxdWV1ZTogICB0aGUgcXVldWUgdGhlIG1lc3NhZ2Ugd2lsbCBiZSByZW1vdmVkIGZyb20KKyAqIEBtc2c6ICAgICB0aGUgbWVzc2FnZSB0byByZW1vdmUKKyAqCisgKiBSZXR1cm46IGludGVnZXIgZXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoZSBzdGF0dXMgb2YgdGhlIHJlbW92YWwKKyAqLworaW50Cit2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSwgdm9pZCAqbXNnKQoreworCWludCByYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGNoYW5uZWwtPm5lZWRzX2xvY2spIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW5uZWwtPnJlbW92ZV9sb2NrLCBmbGFncyk7CisJCXJjID0gc2lnbmFscmVtb3ZlX2lubmVyKGNoYW5uZWwsIHF1ZXVlLCBtc2cpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5yZW1vdmVfbG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCXJjID0gc2lnbmFscmVtb3ZlX2lubmVyKGNoYW5uZWwsIHF1ZXVlLCBtc2cpOworCX0KKworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUpOworCisvKioKKyAqIHZpc29yY2hhbm5lbF9zaWduYWxlbXB0eSgpIC0gY2hlY2tzIGlmIHRoZSBkZXNpZ25hdGVkIGNoYW5uZWwvcXVldWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgYW55IG1lc3NhZ2VzCisgKiBAY2hhbm5lbDogdGhlIGNoYW5uZWwgdG8gcXVlcnkKKyAqIEBxdWV1ZTogICB0aGUgcXVldWUgaW4gdGhlIGNoYW5uZWwgdG8gcXVlcnkKKyAqCisgKiBSZXR1cm46IGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFueSBtZXNzYWdlcyBpbiB0aGUgZGVzaWduYXRlZAorICogICAgICAgICBjaGFubmVsL3F1ZXVlIGFyZSBwcmVzZW50CisgKi8KK2Jvb2wKK3Zpc29yY2hhbm5lbF9zaWduYWxlbXB0eShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIgc2lnX2hkcjsKKwlib29sIHJjID0gZmFsc2U7CisKKwlpZiAoY2hhbm5lbC0+bmVlZHNfbG9jaykKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW5uZWwtPnJlbW92ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoc2lnX3JlYWRfaGVhZGVyKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkcikpCisJCXJjID0gdHJ1ZTsKKwlpZiAoc2lnX2hkci5oZWFkID09IHNpZ19oZHIudGFpbCkKKwkJcmMgPSB0cnVlOworCWlmIChjaGFubmVsLT5uZWVkc19sb2NrKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5yZW1vdmVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX3NpZ25hbGVtcHR5KTsKKworc3RhdGljIGludAorc2lnbmFsaW5zZXJ0X2lubmVyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSwgdm9pZCAqbXNnKQoreworCXN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyIHNpZ19oZHI7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXNpZ19oZHIuaGVhZCA9IChzaWdfaGRyLmhlYWQgKyAxKSAlIHNpZ19oZHIubWF4X3Nsb3RzOworCWlmIChzaWdfaGRyLmhlYWQgPT0gc2lnX2hkci50YWlsKSB7CisJCXNpZ19oZHIubnVtX292ZXJmbG93cysrOworCQl2aXNvcmNoYW5uZWxfd3JpdGUoY2hhbm5lbCwKKwkJCQkgICBTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUpICsKKwkJCQkgICBvZmZzZXRvZihzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciwKKwkJCQkJICAgIG51bV9vdmVyZmxvd3MpLAorCQkJCSAgICZzaWdfaGRyLm51bV9vdmVyZmxvd3MsCisJCQkJICAgc2l6ZW9mKHNpZ19oZHIubnVtX292ZXJmbG93cykpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwllcnJvciA9IHNpZ193cml0ZV9kYXRhKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgc2lnX2hkci5oZWFkLCBtc2cpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJc2lnX2hkci5udW1fc2VudCsrOworCisJLyoKKwkgKiBGb3IgZWFjaCBkYXRhIGZpZWxkIGluIFNJR05BTF9RVUVVRV9IRUFERVIgdGhhdCB3YXMgbW9kaWZpZWQsCisJICogdXBkYXRlIGhvc3QgbWVtb3J5LgorCSAqLworCW1iKCk7IC8qIHJlcXVpcmVkIGZvciBjaGFubmVsIHN5bmNoICovCisKKwllcnJvciA9IFNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIGhlYWQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWVycm9yID0gU0lHX1dSSVRFX0ZJRUxEKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgbnVtX3NlbnQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdmlzb3JjaGFubmVsX2NyZWF0ZV9ndXRzKCkgLSBjcmVhdGVzIHRoZSBzdHJ1Y3Qgdmlzb3JjaGFubmVsIGFic3RyYWN0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhIGRhdGEgYXJlYSBpbiBtZW1vcnksIGJ1dCBkb2VzIE5PVCBtb2RpZnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBkYXRhIGFyZWEKKyAqIEBwaHlzYWRkcjogICAgICBwaHlzaWNhbCBhZGRyZXNzIG9mIHN0YXJ0IG9mIGNoYW5uZWwKKyAqIEBjaGFubmVsX2J5dGVzOiBzaXplIG9mIHRoZSBjaGFubmVsIGluIGJ5dGVzOyB0aGlzIG1heSAwIGlmIHRoZSBjaGFubmVsIGhhcworICogICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCBpbiBtZW1vcnkgKHdoaWNoIGlzIHRydWUgZm9yIGFsbAorICogICAgICAgICAgICAgICAgIGNoYW5uZWxzIHByb3ZpZGVkIHRvIGd1ZXN0IGVudmlyb25tZW50cyBieSB0aGUgcy1QYXIKKyAqICAgICAgICAgICAgICAgICBiYWNrLWVuZCksIGluIHdoaWNoIGNhc2UgdGhlIGFjdHVhbCBjaGFubmVsIHNpemUgd2lsbCBiZQorICogICAgICAgICAgICAgICAgIHJlYWQgZnJvbSB0aGUgY2hhbm5lbCBoZWFkZXIgaW4gbWVtb3J5CisgKiBAZ2ZwOiAgICAgICAgICAgZ2ZwX3QgdG8gdXNlIHdoZW4gYWxsb2NhdGluZyBtZW1vcnkgZm9yIHRoZSBkYXRhIHN0cnVjdAorICogQGd1aWQ6ICAgICAgICAgIHV1aWQgdGhhdCBpZGVudGlmaWVzIGNoYW5uZWwgdHlwZTsgdGhpcyBtYXkgMCBpZiB0aGUgY2hhbm5lbAorICogICAgICAgICAgICAgICAgIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgaW4gbWVtb3J5ICh3aGljaCBpcyB0cnVlIGZvciBhbGwKKyAqICAgICAgICAgICAgICAgICBjaGFubmVscyBwcm92aWRlZCB0byBndWVzdCBlbnZpcm9ubWVudHMgYnkgdGhlIHMtUGFyCisgKiAgICAgICAgICAgICAgICAgYmFjay1lbmQpLCBpbiB3aGljaCBjYXNlIHRoZSBhY3R1YWwgY2hhbm5lbCBndWlkIHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICByZWFkIGZyb20gdGhlIGNoYW5uZWwgaGVhZGVyIGluIG1lbW9yeQorICogQG5lZWRzX2xvY2s6ICAgIG11c3Qgc3BlY2lmeSB0cnVlIGlmIHlvdSBoYXZlIG11bHRpcGxlIHRocmVhZHMgb2YgZXhlY3V0aW9uCisgKiAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGNhbGxpbmcgdmlzb3JjaGFubmVsIG1ldGhvZHMgb2YgdGhpcworICogICAgICAgICAgICAgICAgIHZpc29yY2hhbm5lbCBhdCB0aGUgc2FtZSB0aW1lCisgKgorICogUmV0dXJuOiBwb2ludGVyIHRvIHZpc29yY2hhbm5lbCB0aGF0IHdhcyBjcmVhdGVkIGlmIHN1Y2Nlc3NmdWwsCisgKiAgICAgICAgIG90aGVyd2lzZSBOVUxMCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgdmlzb3JjaGFubmVsICoKIHZpc29yY2hhbm5lbF9jcmVhdGVfZ3V0cyh1NjQgcGh5c2FkZHIsIHVuc2lnbmVkIGxvbmcgY2hhbm5lbF9ieXRlcywKLQkJCSBnZnBfdCBnZnAsIHVuc2lnbmVkIGxvbmcgb2ZmLAotCQkJIHV1aWRfbGUgZ3VpZCwgYm9vbCBuZWVkc19sb2NrKQorCQkJIGdmcF90IGdmcCwgdXVpZF9sZSBndWlkLCBib29sIG5lZWRzX2xvY2spCiB7CiAJc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbDsKIAlpbnQgZXJyOwpAQCAtNzgsNyArNDA2LDggQEAKIAlzcGluX2xvY2tfaW5pdCgmY2hhbm5lbC0+aW5zZXJ0X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZjaGFubmVsLT5yZW1vdmVfbG9jayk7CiAKLQkvKiBWaWRlbyBkcml2ZXIgY29uc3RhaW5zIHRoZSBlZmkgZnJhbWVidWZmZXIgc28gaXQgd2lsbCBnZXQgYQorCS8qCisJICogVmlkZW8gZHJpdmVyIGNvbnN0YWlucyB0aGUgZWZpIGZyYW1lYnVmZmVyIHNvIGl0IHdpbGwgZ2V0IGEKIAkgKiBjb25mbGljdCByZXNvdXJjZSB3aGVuIHJlcXVlc3RpbmcgaXRzIGZ1bGwgbWVtIHJlZ2lvbi4gU2luY2UKIAkgKiB3ZSBhcmUgb25seSB1c2luZyB0aGUgZWZpIGZyYW1lYnVmZmVyIGZvciB2aWRlbyB3ZSBjYW4gaWdub3JlCiAJICogdGhpcy4gUmVtZW1iZXIgdGhhdCB3ZSBoYXZlbid0IHJlcXVlc3RlZCBpdCBzbyB3ZSBkb24ndCB0cnkgdG8KQEAgLTE0NSwzNTIgKzQ3NCwzMSBAQAogdmlzb3JjaGFubmVsX2NyZWF0ZSh1NjQgcGh5c2FkZHIsIHVuc2lnbmVkIGxvbmcgY2hhbm5lbF9ieXRlcywKIAkJICAgIGdmcF90IGdmcCwgdXVpZF9sZSBndWlkKQogewotCXJldHVybiB2aXNvcmNoYW5uZWxfY3JlYXRlX2d1dHMocGh5c2FkZHIsIGNoYW5uZWxfYnl0ZXMsIGdmcCwgMCwgZ3VpZCwKKwlyZXR1cm4gdmlzb3JjaGFubmVsX2NyZWF0ZV9ndXRzKHBoeXNhZGRyLCBjaGFubmVsX2J5dGVzLCBnZnAsIGd1aWQsCiAJCQkJCWZhbHNlKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9jcmVhdGUpOwogCiBzdHJ1Y3Qgdmlzb3JjaGFubmVsICoKIHZpc29yY2hhbm5lbF9jcmVhdGVfd2l0aF9sb2NrKHU2NCBwaHlzYWRkciwgdW5zaWduZWQgbG9uZyBjaGFubmVsX2J5dGVzLAogCQkJICAgICAgZ2ZwX3QgZ2ZwLCB1dWlkX2xlIGd1aWQpCiB7Ci0JcmV0dXJuIHZpc29yY2hhbm5lbF9jcmVhdGVfZ3V0cyhwaHlzYWRkciwgY2hhbm5lbF9ieXRlcywgZ2ZwLCAwLCBndWlkLAorCXJldHVybiB2aXNvcmNoYW5uZWxfY3JlYXRlX2d1dHMocGh5c2FkZHIsIGNoYW5uZWxfYnl0ZXMsIGdmcCwgZ3VpZCwKIAkJCQkJdHJ1ZSk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfY3JlYXRlX3dpdGhfbG9jayk7CiAKLXZvaWQKLXZpc29yY2hhbm5lbF9kZXN0cm95KHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpCi17Ci0JaWYgKCFjaGFubmVsKQotCQlyZXR1cm47Ci0JaWYgKGNoYW5uZWwtPm1hcHBlZCkgewotCQltZW11bm1hcChjaGFubmVsLT5tYXBwZWQpOwotCQlpZiAoY2hhbm5lbC0+cmVxdWVzdGVkKQotCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGNoYW5uZWwtPnBoeXNhZGRyLCBjaGFubmVsLT5uYnl0ZXMpOwotCX0KLQlrZnJlZShjaGFubmVsKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9kZXN0cm95KTsKLQotdTY0Ci12aXNvcmNoYW5uZWxfZ2V0X3BoeXNhZGRyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpCi17Ci0JcmV0dXJuIGNoYW5uZWwtPnBoeXNhZGRyOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF9waHlzYWRkcik7Ci0KLXVsb25nCi12aXNvcmNoYW5uZWxfZ2V0X25ieXRlcyhzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQotewotCXJldHVybiBjaGFubmVsLT5uYnl0ZXM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfZ2V0X25ieXRlcyk7Ci0KLWNoYXIgKgotdmlzb3JjaGFubmVsX3V1aWRfaWQodXVpZF9sZSAqZ3VpZCwgY2hhciAqcykKLXsKLQlzcHJpbnRmKHMsICIlcFVMIiwgZ3VpZCk7Ci0JcmV0dXJuIHM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfdXVpZF9pZCk7Ci0KLWNoYXIgKgotdmlzb3JjaGFubmVsX2lkKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIGNoYXIgKnMpCi17Ci0JcmV0dXJuIHZpc29yY2hhbm5lbF91dWlkX2lkKCZjaGFubmVsLT5ndWlkLCBzKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9pZCk7Ci0KLWNoYXIgKgotdmlzb3JjaGFubmVsX3pvbmVpZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCBjaGFyICpzKQotewotCXJldHVybiB2aXNvcmNoYW5uZWxfdXVpZF9pZCgmY2hhbm5lbC0+Y2hhbl9oZHIuem9uZV91dWlkLCBzKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF96b25laWQpOwotCi11NjQKLXZpc29yY2hhbm5lbF9nZXRfY2xpZW50cGFydGl0aW9uKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpCi17Ci0JcmV0dXJuIGNoYW5uZWwtPmNoYW5faGRyLnBhcnRpdGlvbl9oYW5kbGU7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfZ2V0X2NsaWVudHBhcnRpdGlvbik7Ci0KLWludAotdmlzb3JjaGFubmVsX3NldF9jbGllbnRwYXJ0aXRpb24oc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwKLQkJCQkgdTY0IHBhcnRpdGlvbl9oYW5kbGUpCi17Ci0JY2hhbm5lbC0+Y2hhbl9oZHIucGFydGl0aW9uX2hhbmRsZSA9IHBhcnRpdGlvbl9oYW5kbGU7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2V0X2NsaWVudHBhcnRpdGlvbik7Ci0KLXV1aWRfbGUKLXZpc29yY2hhbm5lbF9nZXRfdXVpZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQotewotCXJldHVybiBjaGFubmVsLT5ndWlkOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF91dWlkKTsKLQotaW50Ci12aXNvcmNoYW5uZWxfcmVhZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1bG9uZyBvZmZzZXQsCi0JCSAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcykKLXsKLQlpZiAob2Zmc2V0ICsgbmJ5dGVzID4gY2hhbm5lbC0+bmJ5dGVzKQotCQlyZXR1cm4gLUVJTzsKLQotCW1lbWNweShsb2NhbCwgY2hhbm5lbC0+bWFwcGVkICsgb2Zmc2V0LCBuYnl0ZXMpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfcmVhZCk7Ci0KLWludAotdmlzb3JjaGFubmVsX3dyaXRlKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwKLQkJICAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcykKLXsKLQlzaXplX3QgY2hkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcik7Ci0Jc2l6ZV90IGNvcHlfc2l6ZTsKLQotCWlmIChvZmZzZXQgKyBuYnl0ZXMgPiBjaGFubmVsLT5uYnl0ZXMpCi0JCXJldHVybiAtRUlPOwotCi0JaWYgKG9mZnNldCA8IGNoZHJfc2l6ZSkgewotCQljb3B5X3NpemUgPSBtaW4oY2hkcl9zaXplIC0gb2Zmc2V0LCBuYnl0ZXMpOwotCQltZW1jcHkoKChjaGFyICopKCZjaGFubmVsLT5jaGFuX2hkcikpICsgb2Zmc2V0LAotCQkgICAgICAgbG9jYWwsIGNvcHlfc2l6ZSk7Ci0JfQotCi0JbWVtY3B5KGNoYW5uZWwtPm1hcHBlZCArIG9mZnNldCwgbG9jYWwsIG5ieXRlcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF93cml0ZSk7Ci0KLWludAotdmlzb3JjaGFubmVsX2NsZWFyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwgdTggY2gsCi0JCSAgIHVsb25nIG5ieXRlcykKLXsKLQlpbnQgZXJyOwotCWludCBidWZzaXplID0gUEFHRV9TSVpFOwotCWludCB3cml0dGVuID0gMDsKLQl1OCAqYnVmOwotCi0JYnVmID0gKHU4ICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1lbXNldChidWYsIGNoLCBidWZzaXplKTsKLQotCXdoaWxlIChuYnl0ZXMgPiAwKSB7Ci0JCWludCB0aGlzYnl0ZXMgPSBidWZzaXplOwotCi0JCWlmIChuYnl0ZXMgPCB0aGlzYnl0ZXMpCi0JCQl0aGlzYnl0ZXMgPSBuYnl0ZXM7Ci0JCWVyciA9IHZpc29yY2hhbm5lbF93cml0ZShjaGFubmVsLCBvZmZzZXQgKyB3cml0dGVuLAotCQkJCQkgYnVmLCB0aGlzYnl0ZXMpOwotCQlpZiAoZXJyKQotCQkJZ290byBvdXRfZnJlZV9wYWdlOwotCi0JCXdyaXR0ZW4gKz0gdGhpc2J5dGVzOwotCQluYnl0ZXMgLT0gdGhpc2J5dGVzOwotCX0KLQllcnIgPSAwOwotCi1vdXRfZnJlZV9wYWdlOgotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWYpOwotCXJldHVybiBlcnI7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfY2xlYXIpOwotCi12b2lkIF9faW9tZW0gICoKLXZpc29yY2hhbm5lbF9nZXRfaGVhZGVyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpCi17Ci0JcmV0dXJuICh2b2lkIF9faW9tZW0gKikmY2hhbm5lbC0+Y2hhbl9oZHI7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfZ2V0X2hlYWRlcik7Ci0KLS8qKiBSZXR1cm4gb2Zmc2V0IG9mIGEgc3BlY2lmaWMgU0lHTkFMX1FVRVVFX0hFQURFUiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYQotICogIGNoYW5uZWwgaGVhZGVyCisvKioKKyAqIHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoKSAtIGluc2VydHMgYSBtZXNzYWdlIGludG8gdGhlIGRlc2lnbmF0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwvcXVldWUKKyAqIEBjaGFubmVsOiB0aGUgY2hhbm5lbCB0aGUgbWVzc2FnZSB3aWxsIGJlIGFkZGVkIHRvCisgKiBAcXVldWU6ICAgdGhlIHF1ZXVlIHRoZSBtZXNzYWdlIHdpbGwgYmUgYWRkZWQgdG8KKyAqIEBtc2c6ICAgICB0aGUgbWVzc2FnZSB0byBpbnNlcnQKKyAqCisgKiBSZXR1cm46IGludGVnZXIgZXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoZSBzdGF0dXMgb2YgdGhlIGluc2VydGlvbgogICovCi0jZGVmaW5lIFNJR19RVUVVRV9PRkZTRVQoY2hhbl9oZHIsIHEpIFwKLQkoKGNoYW5faGRyKS0+Y2hfc3BhY2Vfb2Zmc2V0ICsgXAotCSAoKHEpICogc2l6ZW9mKHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyKSkpCi0KLS8qKiBSZXR1cm4gb2Zmc2V0IG9mIGEgc3BlY2lmaWMgcXVldWUgZW50cnkgKGRhdGEpIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhCi0gKiAgY2hhbm5lbCBoZWFkZXIKLSAqLwotI2RlZmluZSBTSUdfREFUQV9PRkZTRVQoY2hhbl9oZHIsIHEsIHNpZ19oZHIsIHNsb3QpIFwKLQkoU0lHX1FVRVVFX09GRlNFVChjaGFuX2hkciwgcSkgKyAoc2lnX2hkciktPnNpZ19iYXNlX29mZnNldCArIFwKLQkgICAgKChzbG90KSAqIChzaWdfaGRyKS0+c2lnbmFsX3NpemUpKQotCi0vKiogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIGEgc3BlY2lmaWMgZmllbGQgd2l0aGluIGEgU0lHTkFMX1FVRVVFX0hFQURFUiBiYWNrCi0gKiAgaW50byBob3N0IG1lbW9yeQotICovCi0jZGVmaW5lIFNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgc2lnX2hkciwgRklFTEQpCQkJIFwKLQkodmlzb3JjaGFubmVsX3dyaXRlKGNoYW5uZWwsCQkJCQkgXAotCQkJICAgIFNJR19RVUVVRV9PRkZTRVQoJmNoYW5uZWwtPmNoYW5faGRyLCBxdWV1ZSkgK1wKLQkJCSAgICBvZmZzZXRvZihzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciwgRklFTEQpLCBcCi0JCQkgICAgJigoc2lnX2hkciktPkZJRUxEKSwJCQkgXAotCQkJICAgIHNpemVvZigoc2lnX2hkciktPkZJRUxEKSkgPj0gMCkKLQotc3RhdGljIGJvb2wKLXNpZ19yZWFkX2hlYWRlcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUsCi0JCXN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyICpzaWdfaGRyKQotewotCWludCBlcnI7Ci0KLQlpZiAoY2hhbm5lbC0+Y2hhbl9oZHIuY2hfc3BhY2Vfb2Zmc2V0IDwgc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcikpCi0JCXJldHVybiBmYWxzZTsKLQotCS8qIFJlYWQgdGhlIGFwcHJvcHJpYXRlIFNJR05BTF9RVUVVRV9IRUFERVIgaW50byBsb2NhbCBtZW1vcnkuICovCi0JZXJyID0gdmlzb3JjaGFubmVsX3JlYWQoY2hhbm5lbCwKLQkJCQlTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUpLAotCQkJCXNpZ19oZHIsIHNpemVvZihzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlcikpOwotCWlmIChlcnIpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wKLXNpZ19yZWFkX2RhdGEoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLAotCSAgICAgIHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyICpzaWdfaGRyLCB1MzIgc2xvdCwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgZXJyOwotCWludCBzaWduYWxfZGF0YV9vZmZzZXQgPSBTSUdfREFUQV9PRkZTRVQoJmNoYW5uZWwtPmNoYW5faGRyLCBxdWV1ZSwKLQkJCQkJCSBzaWdfaGRyLCBzbG90KTsKLQotCWVyciA9IHZpc29yY2hhbm5lbF9yZWFkKGNoYW5uZWwsIHNpZ25hbF9kYXRhX29mZnNldCwKLQkJCQlkYXRhLCBzaWdfaGRyLT5zaWduYWxfc2l6ZSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotc2lnX3dyaXRlX2RhdGEoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLAotCSAgICAgICBzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciAqc2lnX2hkciwgdTMyIHNsb3QsIHZvaWQgKmRhdGEpCi17Ci0JaW50IGVycjsKLQlpbnQgc2lnbmFsX2RhdGFfb2Zmc2V0ID0gU0lHX0RBVEFfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUsCi0JCQkJCQkgc2lnX2hkciwgc2xvdCk7Ci0KLQllcnIgPSB2aXNvcmNoYW5uZWxfd3JpdGUoY2hhbm5lbCwgc2lnbmFsX2RhdGFfb2Zmc2V0LAotCQkJCSBkYXRhLCBzaWdfaGRyLT5zaWduYWxfc2l6ZSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sCi1zaWduYWxyZW1vdmVfaW5uZXIoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLCB2b2lkICptc2cpCi17Ci0Jc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIgc2lnX2hkcjsKLQotCWlmICghc2lnX3JlYWRfaGVhZGVyKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkcikpCi0JCXJldHVybiBmYWxzZTsKLQlpZiAoc2lnX2hkci5oZWFkID09IHNpZ19oZHIudGFpbCkKLQkJcmV0dXJuIGZhbHNlOwkvKiBubyBzaWduYWxzIHRvIHJlbW92ZSAqLwotCi0Jc2lnX2hkci50YWlsID0gKHNpZ19oZHIudGFpbCArIDEpICUgc2lnX2hkci5tYXhfc2xvdHM7Ci0JaWYgKCFzaWdfcmVhZF9kYXRhKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgc2lnX2hkci50YWlsLCBtc2cpKQotCQlyZXR1cm4gZmFsc2U7Ci0Jc2lnX2hkci5udW1fcmVjZWl2ZWQrKzsKLQotCS8qIEZvciBlYWNoIGRhdGEgZmllbGQgaW4gU0lHTkFMX1FVRVVFX0hFQURFUiB0aGF0IHdhcyBtb2RpZmllZCwKLQkgKiB1cGRhdGUgaG9zdCBtZW1vcnkuCi0JICovCi0JbWIoKTsgLyogcmVxdWlyZWQgZm9yIGNoYW5uZWwgc3luY2ggKi8KLQlpZiAoIVNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIHRhaWwpKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBudW1fcmVjZWl2ZWQpKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wKLXZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLCB2b2lkICptc2cpCi17Ci0JYm9vbCByYzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGNoYW5uZWwtPm5lZWRzX2xvY2spIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW5uZWwtPnJlbW92ZV9sb2NrLCBmbGFncyk7Ci0JCXJjID0gc2lnbmFscmVtb3ZlX2lubmVyKGNoYW5uZWwsIHF1ZXVlLCBtc2cpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5yZW1vdmVfbG9jaywgZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCXJjID0gc2lnbmFscmVtb3ZlX2lubmVyKGNoYW5uZWwsIHF1ZXVlLCBtc2cpOwotCX0KLQotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUpOwotCi1ib29sCi12aXNvcmNoYW5uZWxfc2lnbmFsZW1wdHkoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCXN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyIHNpZ19oZHI7Ci0JYm9vbCByYyA9IGZhbHNlOwotCi0JaWYgKGNoYW5uZWwtPm5lZWRzX2xvY2spCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFubmVsLT5yZW1vdmVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKSkKLQkJcmMgPSB0cnVlOwotCWlmIChzaWdfaGRyLmhlYWQgPT0gc2lnX2hkci50YWlsKQotCQlyYyA9IHRydWU7Ci0JaWYgKGNoYW5uZWwtPm5lZWRzX2xvY2spCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW5uZWwtPnJlbW92ZV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2lnbmFsZW1wdHkpOwotCi1zdGF0aWMgYm9vbAotc2lnbmFsaW5zZXJ0X2lubmVyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSwgdm9pZCAqbXNnKQotewotCXN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyIHNpZ19oZHI7Ci0KLQlpZiAoIXNpZ19yZWFkX2hlYWRlcihjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlzaWdfaGRyLmhlYWQgPSAoc2lnX2hkci5oZWFkICsgMSkgJSBzaWdfaGRyLm1heF9zbG90czsKLQlpZiAoc2lnX2hkci5oZWFkID09IHNpZ19oZHIudGFpbCkgewotCQlzaWdfaGRyLm51bV9vdmVyZmxvd3MrKzsKLQkJdmlzb3JjaGFubmVsX3dyaXRlKGNoYW5uZWwsCi0JCQkJICAgU0lHX1FVRVVFX09GRlNFVCgmY2hhbm5lbC0+Y2hhbl9oZHIsIHF1ZXVlKSArCi0JCQkJICAgb2Zmc2V0b2Yoc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIsCi0JCQkJCSAgICBudW1fb3ZlcmZsb3dzKSwKLQkJCQkgICAmc2lnX2hkci5udW1fb3ZlcmZsb3dzLAotCQkJCSAgIHNpemVvZihzaWdfaGRyLm51bV9vdmVyZmxvd3MpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCWlmICghc2lnX3dyaXRlX2RhdGEoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBzaWdfaGRyLmhlYWQsIG1zZykpCi0JCXJldHVybiBmYWxzZTsKLQotCXNpZ19oZHIubnVtX3NlbnQrKzsKLQotCS8qIEZvciBlYWNoIGRhdGEgZmllbGQgaW4gU0lHTkFMX1FVRVVFX0hFQURFUiB0aGF0IHdhcyBtb2RpZmllZCwKLQkgKiB1cGRhdGUgaG9zdCBtZW1vcnkuCi0JICovCi0JbWIoKTsgLyogcmVxdWlyZWQgZm9yIGNoYW5uZWwgc3luY2ggKi8KLQlpZiAoIVNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIGhlYWQpKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBudW1fc2VudCkpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVlOwotfQotCi1ib29sCitpbnQKIHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLCB2b2lkICptc2cpCiB7Ci0JYm9vbCByYzsKKwlpbnQgcmM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChjaGFubmVsLT5uZWVkc19sb2NrKSB7CkBAIC01MDQsMTMyICs1MTIsMyBAQAogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQpOwotCi1pbnQKLXZpc29yY2hhbm5lbF9zaWduYWxxdWV1ZV9zbG90c19hdmFpbChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUpCi17Ci0Jc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIgc2lnX2hkcjsKLQl1MzIgc2xvdHNfYXZhaWwsIHNsb3RzX3VzZWQ7Ci0JdTMyIGhlYWQsIHRhaWw7Ci0KLQlpZiAoIXNpZ19yZWFkX2hlYWRlcihjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIpKQotCQlyZXR1cm4gMDsKLQloZWFkID0gc2lnX2hkci5oZWFkOwotCXRhaWwgPSBzaWdfaGRyLnRhaWw7Ci0JaWYgKGhlYWQgPCB0YWlsKQotCQloZWFkID0gaGVhZCArIHNpZ19oZHIubWF4X3Nsb3RzOwotCXNsb3RzX3VzZWQgPSBoZWFkIC0gdGFpbDsKLQlzbG90c19hdmFpbCA9IHNpZ19oZHIubWF4X3NpZ25hbHMgLSBzbG90c191c2VkOwotCXJldHVybiAoaW50KXNsb3RzX2F2YWlsOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX3NpZ25hbHF1ZXVlX3Nsb3RzX2F2YWlsKTsKLQotaW50Ci12aXNvcmNoYW5uZWxfc2lnbmFscXVldWVfbWF4X3Nsb3RzKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSkKLXsKLQlzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciBzaWdfaGRyOwotCi0JaWYgKCFzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIChpbnQpc2lnX2hkci5tYXhfc2lnbmFsczsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9zaWduYWxxdWV1ZV9tYXhfc2xvdHMpOwotCi1zdGF0aWMgdm9pZAotc2lncXVldWVfZGVidWcoc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIgKnEsIGludCB3aGljaCwgc3RydWN0IHNlcV9maWxlICpzZXEpCi17Ci0Jc2VxX3ByaW50ZihzZXEsICJTaWduYWwgUXVldWUgIyVkXG4iLCB3aGljaCk7Ci0Jc2VxX3ByaW50ZihzZXEsICIgICBWZXJzaW9uSWQgICAgICAgICAgPSAlbHVcbiIsICh1bG9uZylxLT52ZXJzaW9uKTsKLQlzZXFfcHJpbnRmKHNlcSwgIiAgIFR5cGUgICAgICAgICAgICAgICA9ICVsdVxuIiwgKHVsb25nKXEtPmNodHlwZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICIgICBvU2lnbmFsQmFzZSAgICAgICAgPSAlbGx1XG4iLAotCQkgICAobG9uZyBsb25nKXEtPnNpZ19iYXNlX29mZnNldCk7Ci0Jc2VxX3ByaW50ZihzZXEsICIgICBTaWduYWxTaXplICAgICAgICAgPSAlbHVcbiIsICh1bG9uZylxLT5zaWduYWxfc2l6ZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICIgICBNYXhTaWduYWxTbG90cyAgICAgPSAlbHVcbiIsCi0JCSAgICh1bG9uZylxLT5tYXhfc2xvdHMpOwotCXNlcV9wcmludGYoc2VxLCAiICAgTWF4U2lnbmFscyAgICAgICAgID0gJWx1XG4iLCAodWxvbmcpcS0+bWF4X3NpZ25hbHMpOwotCXNlcV9wcmludGYoc2VxLCAiICAgRmVhdHVyZUZsYWdzICAgICAgID0gJS0xNi4xNkx4XG4iLAotCQkgICAobG9uZyBsb25nKXEtPmZlYXR1cmVzKTsKLQlzZXFfcHJpbnRmKHNlcSwgIiAgIE51bVNpZ25hbHNTZW50ICAgICA9ICVsbHVcbiIsCi0JCSAgIChsb25nIGxvbmcpcS0+bnVtX3NlbnQpOwotCXNlcV9wcmludGYoc2VxLCAiICAgTnVtU2lnbmFsc1JlY2VpdmVkID0gJWxsdVxuIiwKLQkJICAgKGxvbmcgbG9uZylxLT5udW1fcmVjZWl2ZWQpOwotCXNlcV9wcmludGYoc2VxLCAiICAgTnVtT3ZlcmZsb3dzICAgICAgID0gJWxsdVxuIiwKLQkJICAgKGxvbmcgbG9uZylxLT5udW1fb3ZlcmZsb3dzKTsKLQlzZXFfcHJpbnRmKHNlcSwgIiAgIEhlYWQgICAgICAgICAgICAgICA9ICVsdVxuIiwgKHVsb25nKXEtPmhlYWQpOwotCXNlcV9wcmludGYoc2VxLCAiICAgVGFpbCAgICAgICAgICAgICAgID0gJWx1XG4iLCAodWxvbmcpcS0+dGFpbCk7Ci19Ci0KLXZvaWQKLXZpc29yY2hhbm5lbF9kZWJ1ZyhzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCBpbnQgbnVtX3F1ZXVlcywKLQkJICAgc3RydWN0IHNlcV9maWxlICpzZXEsIHUzMiBvZmYpCi17Ci0JdTY0IGFkZHIgPSAwOwotCXVsb25nIG5ieXRlcyA9IDAsIG5ieXRlc19yZWdpb24gPSAwOwotCXN0cnVjdCBjaGFubmVsX2hlYWRlciBoZHI7Ci0Jc3RydWN0IGNoYW5uZWxfaGVhZGVyICpwaGRyID0gJmhkcjsKLQlpbnQgaSA9IDA7Ci0JaW50IGVycmNvZGUgPSAwOwotCi0JaWYgKCFjaGFubmVsKQotCQlyZXR1cm47Ci0KLQlhZGRyID0gdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcihjaGFubmVsKTsKLQluYnl0ZXNfcmVnaW9uID0gdmlzb3JjaGFubmVsX2dldF9uYnl0ZXMoY2hhbm5lbCk7Ci0JZXJyY29kZSA9IHZpc29yY2hhbm5lbF9yZWFkKGNoYW5uZWwsIG9mZiwKLQkJCQkgICAgcGhkciwgc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcikpOwotCWlmIChlcnJjb2RlIDwgMCkgewotCQlzZXFfcHJpbnRmKHNlcSwKLQkJCSAgICJSZWFkIG9mIGNoYW5uZWwgaGVhZGVyIGZhaWxlZCB3aXRoIGVycmNvZGU9JWQpXG4iLAotCQkJICAgZXJyY29kZSk7Ci0JCWlmIChvZmYgPT0gMCkgewotCQkJcGhkciA9ICZjaGFubmVsLT5jaGFuX2hkcjsKLQkJCXNlcV9wdXRzKHNlcSwgIihmb2xsb3dpbmcgZGF0YSBtYXkgYmUgc3RhbGUpXG4iKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQluYnl0ZXMgPSAodWxvbmcpKHBoZHItPnNpemUpOwotCXNlcV9wcmludGYoc2VxLCAiLS0tIEJlZ2luIGNoYW5uZWwgQDB4JS0xNi4xNkx4IGZvciAweCVseCBieXRlcyAocmVnaW9uPTB4JWx4IGJ5dGVzKSAtLS1cbiIsCi0JCSAgIGFkZHIgKyBvZmYsIG5ieXRlcywgbmJ5dGVzX3JlZ2lvbik7Ci0Jc2VxX3ByaW50ZihzZXEsICJUeXBlICAgICAgICAgICAgPSAlcFVMXG4iLCAmcGhkci0+Y2h0eXBlKTsKLQlzZXFfcHJpbnRmKHNlcSwgIlpvbmVHdWlkICAgICAgICA9ICVwVUxcbiIsICZwaGRyLT56b25lX3V1aWQpOwotCXNlcV9wcmludGYoc2VxLCAiU2lnbmF0dXJlICAgICAgID0gMHglLTE2LjE2THhcbiIsCi0JCSAgIChsb25nIGxvbmcpcGhkci0+c2lnbmF0dXJlKTsKLQlzZXFfcHJpbnRmKHNlcSwgIkxlZ2FjeVN0YXRlICAgICA9ICVsdVxuIiwgKHVsb25nKXBoZHItPmxlZ2FjeV9zdGF0ZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICJTcnZTdGF0ZSAgICAgICAgPSAlbHVcbiIsICh1bG9uZylwaGRyLT5zcnZfc3RhdGUpOwotCXNlcV9wcmludGYoc2VxLCAiQ2xpU3RhdGVCb290ICAgID0gJWx1XG4iLCAodWxvbmcpcGhkci0+Y2xpX3N0YXRlX2Jvb3QpOwotCXNlcV9wcmludGYoc2VxLCAiQ2xpU3RhdGVPUyAgICAgID0gJWx1XG4iLCAodWxvbmcpcGhkci0+Y2xpX3N0YXRlX29zKTsKLQlzZXFfcHJpbnRmKHNlcSwgIkhlYWRlclNpemUgICAgICA9ICVsdVxuIiwgKHVsb25nKXBoZHItPmhlYWRlcl9zaXplKTsKLQlzZXFfcHJpbnRmKHNlcSwgIlNpemUgICAgICAgICAgICA9ICVsbHVcbiIsIChsb25nIGxvbmcpcGhkci0+c2l6ZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICJGZWF0dXJlcyAgICAgICAgPSAweCUtMTYuMTZsbHhcbiIsCi0JCSAgIChsb25nIGxvbmcpcGhkci0+ZmVhdHVyZXMpOwotCXNlcV9wcmludGYoc2VxLCAiUGFydGl0aW9uSGFuZGxlID0gMHglLTE2LjE2bGx4XG4iLAotCQkgICAobG9uZyBsb25nKXBoZHItPnBhcnRpdGlvbl9oYW5kbGUpOwotCXNlcV9wcmludGYoc2VxLCAiSGFuZGxlICAgICAgICAgID0gMHglLTE2LjE2bGx4XG4iLAotCQkgICAobG9uZyBsb25nKXBoZHItPmhhbmRsZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICJWZXJzaW9uSWQgICAgICAgPSAlbHVcbiIsICh1bG9uZylwaGRyLT52ZXJzaW9uX2lkKTsKLQlzZXFfcHJpbnRmKHNlcSwgIm9DaGFubmVsU3BhY2UgICA9ICVsbHVcbiIsCi0JCSAgIChsb25nIGxvbmcpcGhkci0+Y2hfc3BhY2Vfb2Zmc2V0KTsKLQlpZiAoKHBoZHItPmNoX3NwYWNlX29mZnNldCA9PSAwKSB8fCAoZXJyY29kZSA8IDApKQotCQk7Ci0JZWxzZQotCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3F1ZXVlczsgaSsrKSB7Ci0JCQlzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciBxOwotCi0JCQllcnJjb2RlID0gdmlzb3JjaGFubmVsX3JlYWQoY2hhbm5lbCwKLQkJCQkJCSAgICBvZmYgKwotCQkJCQkJICAgIHBoZHItPmNoX3NwYWNlX29mZnNldCArCi0JCQkJCQkgICAgKGkgKiBzaXplb2YocSkpLAotCQkJCQkJICAgICZxLCBzaXplb2YocSkpOwotCQkJaWYgKGVycmNvZGUgPCAwKSB7Ci0JCQkJc2VxX3ByaW50ZihzZXEsCi0JCQkJCSAgICJmYWlsZWQgdG8gcmVhZCBzaWduYWwgcXVldWUgIyVkIGZyb20gY2hhbm5lbCBAMHglLTE2LjE2THggZXJyY29kZT0lZFxuIiwKLQkJCQkJICAgaSwgYWRkciwgZXJyY29kZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlzaWdxdWV1ZV9kZWJ1ZygmcSwgaSwgc2VxKTsKLQkJfQotCXNlcV9wcmludGYoc2VxLCAiLS0tIEVuZCAgIGNoYW5uZWwgQDB4JS0xNi4xNkx4IGZvciAweCVseCBieXRlcyAtLS1cbiIsCi0JCSAgIGFkZHIgKyBvZmYsIG5ieXRlcyk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfZGVidWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92aXNvcmNoaXBzZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmlzb3JjaGlwc2V0LmMKaW5kZXggZDI0OGM5NC4uNTk4NzE0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92aXNvcmNoaXBzZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yY2hpcHNldC5jCkBAIC0yNSwyMSArMjUsMTIgQEAKICNpbmNsdWRlIDxsaW51eC91dWlkLmg+CiAjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgogCi0jaW5jbHVkZSAiY2hhbm5lbF9ndWlkLmgiCi0jaW5jbHVkZSAiY29udHJvbHZtY2hhbm5lbC5oIgotI2luY2x1ZGUgImNvbnRyb2x2bWNvbXBsZXRpb25zdGF0dXMuaCIKLSNpbmNsdWRlICJndWVzdGxpbnV4ZGVidWcuaCIKLSNpbmNsdWRlICJwZXJpb2RpY193b3JrLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgogI2luY2x1ZGUgInZpc29yYnVzLmgiCiAjaW5jbHVkZSAidmlzb3JidXNfcHJpdmF0ZS5oIgogI2luY2x1ZGUgInZtY2FsbGludGVyZmFjZS5oIgogCiAjZGVmaW5lIENVUlJFTlRfRklMRV9QQyBWSVNPUl9DSElQU0VUX1BDX3Zpc29yY2hpcHNldF9tYWluX2MKIAotI2RlZmluZSBNQVhfTkFNRV9TSVpFIDEyOAotI2RlZmluZSBNQVhfSVBfU0laRSAgIDUwCi0jZGVmaW5lIE1BWE9VVFNUQU5ESU5HQ0hBTk5FTENPTU1BTkQgMjU2CiAjZGVmaW5lIFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVCAgIDEKICNkZWZpbmUgUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9TTE9XIDEwMAogCkBAIC01OCw5ICs0OSw2IEBACiAgKiBNb2R1bGUgcGFyYW1ldGVycwogICovCiBzdGF0aWMgaW50IHZpc29yY2hpcHNldF9tYWpvcjsKLXN0YXRpYyBpbnQgdmlzb3JjaGlwc2V0X3Zpc29yYnVzcmVnd2FpdCA9IDE7CS8qIGRlZmF1bHQgaXMgb24gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNvbnRyb2x2bV9wYXlsb2FkX2J5dGVzX2J1ZmZlcmVkOwotc3RhdGljIHUzMiBkdW1wX3ZoYmFfYnVzOwogCiBzdGF0aWMgaW50CiB2aXNvcmNoaXBzZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTc5LDE1ICs2NywxNSBAQAogCXJldHVybiAwOwogfQogCi0vKiBXaGVuIHRoZSBjb250cm9sdm0gY2hhbm5lbCBpcyBpZGxlIGZvciBhdCBsZWFzdCBNSU5fSURMRV9TRUNPTkRTLAotKiB3ZSBzd2l0Y2ggdG8gc2xvdyBwb2xsaW5nIG1vZGUuICBBcyBzb29uIGFzIHdlIGdldCBhIGNvbnRyb2x2bQotKiBtZXNzYWdlLCB3ZSBzd2l0Y2ggYmFjayB0byBmYXN0IHBvbGxpbmcgbW9kZS4KLSovCisvKgorICogV2hlbiB0aGUgY29udHJvbHZtIGNoYW5uZWwgaXMgaWRsZSBmb3IgYXQgbGVhc3QgTUlOX0lETEVfU0VDT05EUywKKyAqIHdlIHN3aXRjaCB0byBzbG93IHBvbGxpbmcgbW9kZS4gQXMgc29vbiBhcyB3ZSBnZXQgYSBjb250cm9sdm0KKyAqIG1lc3NhZ2UsIHdlIHN3aXRjaCBiYWNrIHRvIGZhc3QgcG9sbGluZyBtb2RlLgorICovCiAjZGVmaW5lIE1JTl9JRExFX1NFQ09ORFMgMTAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVDsKIC8qIHdoZW4gd2UgZ290IG91ciBsYXN0IGNvbnRyb2x2bSBtZXNzYWdlICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBtb3N0X3JlY2VudF9tZXNzYWdlX2ppZmZpZXM7Ci1zdGF0aWMgaW50IHZpc29yYnVzcmVnaXN0ZXJlZDsKIAogc3RydWN0IHBhcnNlcl9jb250ZXh0IHsKIAl1bnNpZ25lZCBsb25nIGFsbG9jYnl0ZXM7CkBAIC05OSw1MSArODcsMzYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZGVsYXllZF93b3JrIHBlcmlvZGljX2NvbnRyb2x2bV93b3JrOwotc3RhdGljIERFRklORV9TRU1BUEhPUkUobm90aWZpZXJfbG9jayk7CiAKIHN0YXRpYyBzdHJ1Y3QgY2RldiBmaWxlX2NkZXY7CiBzdGF0aWMgc3RydWN0IHZpc29yY2hhbm5lbCAqKmZpbGVfY29udHJvbHZtX2NoYW5uZWw7Ci1zdGF0aWMgc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX3BhY2tldCBnX2RldmljZWNoYW5nZXN0YXRlX3BhY2tldDsKLQotc3RhdGljIExJU1RfSEVBRChidXNfaW5mb19saXN0KTsKLXN0YXRpYyBMSVNUX0hFQUQoZGV2X2luZm9fbGlzdCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjb250cm9sdm1fY2hhbm5lbDsKIAogLyogTWFuYWdlcyB0aGUgcmVxdWVzdCBwYXlsb2FkIGluIHRoZSBjb250cm9sdm0gY2hhbm5lbCAqLwogc3RydWN0IHZpc29yX2NvbnRyb2x2bV9wYXlsb2FkX2luZm8gewogCXU4ICpwdHI7CQkvKiBwb2ludGVyIHRvIGJhc2UgYWRkcmVzcyBvZiBwYXlsb2FkIHBvb2wgKi8KLQl1NjQgb2Zmc2V0OwkJLyogb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIGNvbnRyb2x2bQorCXU2NCBvZmZzZXQ7CQkvKgorCQkJCSAqIG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBjb250cm9sdm0KIAkJCQkgKiBjaGFubmVsIHRvIGJlZ2lubmluZyBvZiBwYXlsb2FkICogcG9vbAogCQkJCSAqLwogCXUzMiBieXRlczsJCS8qIG51bWJlciBvZiBieXRlcyBpbiBwYXlsb2FkIHBvb2wgKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgdmlzb3JfY29udHJvbHZtX3BheWxvYWRfaW5mbyBjb250cm9sdm1fcGF5bG9hZF9pbmZvOworc3RhdGljIHVuc2lnbmVkIGxvbmcgY29udHJvbHZtX3BheWxvYWRfYnl0ZXNfYnVmZmVyZWQ7CiAKLS8qIFRoZSBmb2xsb3dpbmcgZ2xvYmFscyBhcmUgdXNlZCB0byBoYW5kbGUgdGhlIHNjZW5hcmlvIHdoZXJlIHdlIGFyZSB1bmFibGUgdG8KLSAqIG9mZmxvYWQgdGhlIHBheWxvYWQgZnJvbSBhIGNvbnRyb2x2bSBtZXNzYWdlIGR1ZSB0byBtZW1vcnkgcmVxdWlyZW1lbnRzLiAgSW4KKy8qCisgKiBUaGUgZm9sbG93aW5nIGdsb2JhbHMgYXJlIHVzZWQgdG8gaGFuZGxlIHRoZSBzY2VuYXJpbyB3aGVyZSB3ZSBhcmUgdW5hYmxlIHRvCisgKiBvZmZsb2FkIHRoZSBwYXlsb2FkIGZyb20gYSBjb250cm9sdm0gbWVzc2FnZSBkdWUgdG8gbWVtb3J5IHJlcXVpcmVtZW50cy4gSW4KICAqIHRoaXMgc2NlbmFyaW8sIHdlIHNpbXBseSBzdGFzaCB0aGUgY29udHJvbHZtIG1lc3NhZ2UsIHRoZW4gYXR0ZW1wdCB0bwogICogcHJvY2VzcyBpdCBhZ2FpbiB0aGUgbmV4dCB0aW1lIGNvbnRyb2x2bV9wZXJpb2RpY193b3JrKCkgcnVucy4KICAqLwogc3RhdGljIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBjb250cm9sdm1fcGVuZGluZ19tc2c7CiBzdGF0aWMgYm9vbCBjb250cm9sdm1fcGVuZGluZ19tc2dfdmFsaWQ7CiAKLS8qIFRoaXMgaWRlbnRpZmllcyBhIGRhdGEgYnVmZmVyIHRoYXQgaGFzIGJlZW4gcmVjZWl2ZWQgdmlhIGEgY29udHJvbHZtIG1lc3NhZ2VzCi0gKiBpbiBhIHJlbW90ZSAtLT4gbG9jYWwgQ09OVFJPTFZNX1RSQU5TTUlUX0ZJTEUgY29udmVyc2F0aW9uLgotICovCi1zdHJ1Y3QgcHV0ZmlsZV9idWZmZXJfZW50cnkgewotCXN0cnVjdCBsaXN0X2hlYWQgbmV4dDsJLyogcHV0ZmlsZV9idWZmZXJfZW50cnkgbGlzdCAqLwotCXN0cnVjdCBwYXJzZXJfY29udGV4dCAqcGFyc2VyX2N0eDsgLyogcG9pbnRzIHRvIGlucHV0IGRhdGEgYnVmZmVyICovCi19OwotCi0vKiBMaXN0IG9mIHN0cnVjdCBwdXRmaWxlX3JlcXVlc3QgKiwgdmlhIG5leHRfcHV0ZmlsZV9yZXF1ZXN0IG1lbWJlci4KLSAqIEVhY2ggZW50cnkgaW4gdGhpcyBsaXN0IGlkZW50aWZpZXMgYW4gb3V0c3RhbmRpbmcgVFJBTlNNSVRfRklMRQotICogY29udmVyc2F0aW9uLgotICovCi1zdGF0aWMgTElTVF9IRUFEKHB1dGZpbGVfcmVxdWVzdF9saXN0KTsKLQotLyogVGhpcyBkZXNjcmliZXMgYSBidWZmZXIgYW5kIGl0cyBjdXJyZW50IHN0YXRlIG9mIHRyYW5zZmVyIChlLmcuLCBob3cgbWFueQorLyoKKyAqIFRoaXMgZGVzY3JpYmVzIGEgYnVmZmVyIGFuZCBpdHMgY3VycmVudCBzdGF0ZSBvZiB0cmFuc2ZlciAoZS5nLiwgaG93IG1hbnkKICAqIGJ5dGVzIGhhdmUgYWxyZWFkeSBiZWVuIHN1cHBsaWVkIGFzIHB1dGZpbGUgZGF0YSwgYW5kIGhvdyBtYW55IGJ5dGVzIGFyZQogICogcmVtYWluaW5nKSBmb3IgYSBwdXRmaWxlX3JlcXVlc3QuCiAgKi8KQEAgLTE1NSw4ICsxMjgsOSBAQAogfTsKIAogI2RlZmluZSBQVVRGSUxFX1JFUVVFU1RfU0lHIDB4MDkwNjEwMTMwMjI4MTIxMQotLyogVGhpcyBpZGVudGlmaWVzIGEgc2luZ2xlIHJlbW90ZSAtLT4gbG9jYWwgQ09OVFJPTFZNX1RSQU5TTUlUX0ZJTEUKLSAqIGNvbnZlcnNhdGlvbi4gIFN0cnVjdHMgb2YgdGhpcyB0eXBlIGFyZSBkeW5hbWljYWxseSBsaW5rZWQgaW50bworLyoKKyAqIFRoaXMgaWRlbnRpZmllcyBhIHNpbmdsZSByZW1vdGUgLS0+IGxvY2FsIENPTlRST0xWTV9UUkFOU01JVF9GSUxFCisgKiBjb252ZXJzYXRpb24uIFN0cnVjdHMgb2YgdGhpcyB0eXBlIGFyZSBkeW5hbWljYWxseSBsaW5rZWQgaW50bwogICogPFB1dGZpbGVfcmVxdWVzdF9saXN0Pi4KICAqLwogc3RydWN0IHB1dGZpbGVfcmVxdWVzdCB7CkBAIC0xNjgsNyArMTQyLDggQEAKIAkvKiBsaW5rIHRvIG5leHQgc3RydWN0IHB1dGZpbGVfcmVxdWVzdCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbmV4dF9wdXRmaWxlX3JlcXVlc3Q7CiAKLQkvKiBoZWFkIG9mIHB1dGZpbGVfYnVmZmVyX2VudHJ5IGxpc3QsIHdoaWNoIGRlc2NyaWJlcyB0aGUgZGF0YSB0byBiZQorCS8qCisJICogaGVhZCBvZiBwdXRmaWxlX2J1ZmZlcl9lbnRyeSBsaXN0LCB3aGljaCBkZXNjcmliZXMgdGhlIGRhdGEgdG8gYmUKIAkgKiBzdXBwbGllZCBhcyBwdXRmaWxlIGRhdGE7CiAJICogLSB0aGlzIGxpc3QgaXMgYWRkZWQgdG8gd2hlbiBjb250cm9sdm0gbWVzc2FnZXMgY29tZSBpbiB0aGF0IHN1cHBseQogCSAqIGZpbGUgZGF0YQpAQCAtMTg0LDExICsxNTksMTMgQEAKIAkvKiBkYXRhIG5vdCB5ZXQgcmVhZCB3aXRoaW4gY3VycmVudCBwdXRmaWxlX2J1ZmZlcl9lbnRyeSAqLwogCXN0cnVjdCBwdXRmaWxlX2FjdGl2ZV9idWZmZXIgYWN0aXZlX2J1ZjsKIAotCS8qIDwwID0gZmFpbGVkLCAwID0gaW4tcHJvZ3Jlc3MsID4wID0gc3VjY2Vzc2Z1bDsgKi8KLQkvKiBub3RlIHRoYXQgdGhpcyBtdXN0IGJlIHNldCB3aXRoIHJlcV9saXN0X2xvY2ssIGFuZCBpZiB5b3Ugc2V0IDwwLCAqLwotCS8qIGl0IGlzIHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gYWxzbyBmcmVlIHVwIGFsbCBvZiB0aGUgb3RoZXIgb2JqZWN0cyAqLwotCS8qIGluIHRoaXMgc3RydWN0IChsaWtlIGlucHV0X2J1ZmZlcl9saXN0LCBhY3RpdmVfYnVmLnBhcnNlcl9jdHgpICovCi0JLyogYmVmb3JlIHJlbGVhc2luZyB0aGUgbG9jayAqLworCS8qCisJICogPDAgPSBmYWlsZWQsIDAgPSBpbi1wcm9ncmVzcywgPjAgPSBzdWNjZXNzZnVsOworCSAqIG5vdGUgdGhhdCB0aGlzIG11c3QgYmUgc2V0IHdpdGggcmVxX2xpc3RfbG9jaywgYW5kIGlmIHlvdSBzZXQgPDAsCisJICogaXQgaXMgeW91ciByZXNwb25zaWJpbGl0eSB0byBhbHNvIGZyZWUgdXAgYWxsIG9mIHRoZSBvdGhlciBvYmplY3RzCisJICogaW4gdGhpcyBzdHJ1Y3QgKGxpa2UgaW5wdXRfYnVmZmVyX2xpc3QsIGFjdGl2ZV9idWYucGFyc2VyX2N0eCkKKwkgKiBiZWZvcmUgcmVsZWFzaW5nIHRoZSBsb2NrCisJICovCiAJaW50IGNvbXBsZXRpb25fc3RhdHVzOwogfTsKIApAQCAtMTk5LDE5MyArMTc2LDE3OSBAQAogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBtc2c7CiB9OwogCi1zdGF0aWMgTElTVF9IRUFEKHBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsJLyogbG9jayBmb3IgYWJvdmUgKi8KLXN0YXRpYyB2b2lkIHBhcmFob3RwbHVnX3Byb2Nlc3NfbGlzdCh2b2lkKTsKLQotLyogTWFuYWdlcyB0aGUgaW5mbyBmb3IgYSBDT05UUk9MVk1fRFVNUF9DQVBUVVJFU1RBVEUgLwotICogQ09OVFJPTFZNX1JFUE9SVEVWRU5ULgotICovCi1zdGF0aWMgc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfbm90aWZpZXJzIGJ1c2Rldl9ub3RpZmllcnM7Ci0KLXN0YXRpYyB2b2lkIGJ1c19jcmVhdGVfcmVzcG9uc2Uoc3RydWN0IHZpc29yX2RldmljZSAqcCwgaW50IHJlc3BvbnNlKTsKLXN0YXRpYyB2b2lkIGJ1c19kZXN0cm95X3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnAsIGludCByZXNwb25zZSk7Ci1zdGF0aWMgdm9pZCBkZXZpY2VfY3JlYXRlX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnAsIGludCByZXNwb25zZSk7Ci1zdGF0aWMgdm9pZCBkZXZpY2VfZGVzdHJveV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwotc3RhdGljIHZvaWQgZGV2aWNlX3Jlc3VtZV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwotCi1zdGF0aWMgdm9pZCB2aXNvcmNoaXBzZXRfZGV2aWNlX3BhdXNlX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnAsCi0JCQkJCSAgICAgICBpbnQgcmVzcG9uc2UpOwotCi1zdGF0aWMgc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfcmVzcG9uZGVycyBidXNkZXZfcmVzcG9uZGVycyA9IHsKLQkuYnVzX2NyZWF0ZSA9IGJ1c19jcmVhdGVfcmVzcG9uc2UsCi0JLmJ1c19kZXN0cm95ID0gYnVzX2Rlc3Ryb3lfcmVzcG9uc2UsCi0JLmRldmljZV9jcmVhdGUgPSBkZXZpY2VfY3JlYXRlX3Jlc3BvbnNlLAotCS5kZXZpY2VfZGVzdHJveSA9IGRldmljZV9kZXN0cm95X3Jlc3BvbnNlLAotCS5kZXZpY2VfcGF1c2UgPSB2aXNvcmNoaXBzZXRfZGV2aWNlX3BhdXNlX3Jlc3BvbnNlLAotCS5kZXZpY2VfcmVzdW1lID0gZGV2aWNlX3Jlc3VtZV9yZXNwb25zZSwKLX07Ci0KIC8qIGluZm8gZm9yIC9kZXYvdmlzb3JjaGlwc2V0ICovCi1zdGF0aWMgZGV2X3QgbWFqb3JfZGV2ID0gLTE7IC8qKjwgaW5kaWNhdGVzIG1ham9yIG51bSBmb3IgZGV2aWNlICovCitzdGF0aWMgZGV2X3QgbWFqb3JfZGV2ID0gLTE7IC8qPCBpbmRpY2F0ZXMgbWFqb3IgbnVtIGZvciBkZXZpY2UgKi8KIAogLyogcHJvdG90eXBlcyBmb3IgYXR0cmlidXRlcyAqLwogc3RhdGljIHNzaXplX3QgdG9vbGFjdGlvbl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjaGFyICpidWYpCit7CisJdTggdG9vbF9hY3Rpb24gPSAwOworCisJdmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAorCQkJCSAgIHRvb2xfYWN0aW9uKSwgJnRvb2xfYWN0aW9uLCBzaXplb2YodTgpKTsKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHRvb2xfYWN0aW9uKTsKK30KKwogc3RhdGljIHNzaXplX3QgdG9vbGFjdGlvbl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXU4IHRvb2xfYWN0aW9uOworCWludCByZXQ7CisKKwlpZiAoa3N0cnRvdTgoYnVmLCAxMCwgJnRvb2xfYWN0aW9uKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUKKwkJKGNvbnRyb2x2bV9jaGFubmVsLAorCQkgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCisJCQkgIHRvb2xfYWN0aW9uKSwKKwkJICZ0b29sX2FjdGlvbiwgc2l6ZW9mKHU4KSk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBjb3VudDsKK30KIHN0YXRpYyBERVZJQ0VfQVRUUl9SVyh0b29sYWN0aW9uKTsKIAogc3RhdGljIHNzaXplX3QgYm9vdHRvdG9vbF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGVmaV9zcGFyX2luZGljYXRpb24gZWZpX3NwYXJfaW5kaWNhdGlvbjsKKworCXZpc29yY2hhbm5lbF9yZWFkKGNvbnRyb2x2bV9jaGFubmVsLAorCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKKwkJCQkgICBlZmlfc3Bhcl9pbmQpLCAmZWZpX3NwYXJfaW5kaWNhdGlvbiwKKwkJCSAgc2l6ZW9mKHN0cnVjdCBlZmlfc3Bhcl9pbmRpY2F0aW9uKSk7CisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLAorCQkJIGVmaV9zcGFyX2luZGljYXRpb24uYm9vdF90b190b29sKTsKK30KKwogc3RhdGljIHNzaXplX3QgYm9vdHRvdG9vbF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQpOworCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCB2YWwsIHJldDsKKwlzdHJ1Y3QgZWZpX3NwYXJfaW5kaWNhdGlvbiBlZmlfc3Bhcl9pbmRpY2F0aW9uOworCisJaWYgKGtzdHJ0b2ludChidWYsIDEwLCAmdmFsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllZmlfc3Bhcl9pbmRpY2F0aW9uLmJvb3RfdG9fdG9vbCA9IHZhbDsKKwlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUKKwkJKGNvbnRyb2x2bV9jaGFubmVsLAorCQkgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCisJCQkgIGVmaV9zcGFyX2luZCksICYoZWZpX3NwYXJfaW5kaWNhdGlvbiksCisJCSBzaXplb2Yoc3RydWN0IGVmaV9zcGFyX2luZGljYXRpb24pKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGNvdW50OworfQogc3RhdGljIERFVklDRV9BVFRSX1JXKGJvb3R0b3Rvb2wpOwogCiBzdGF0aWMgc3NpemVfdCBlcnJvcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgIGNoYXIgKmJ1Zik7CisJCQkgIGNoYXIgKmJ1ZikKK3sKKwl1MzIgZXJyb3IgPSAwOworCisJdmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAorCQkJCSAgIGluc3RhbGxhdGlvbl9lcnJvciksCisJCQkgICZlcnJvciwgc2l6ZW9mKHUzMikpOworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlaVxuIiwgZXJyb3IpOworfQorCiBzdGF0aWMgc3NpemVfdCBlcnJvcl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdTMyIGVycm9yOworCWludCByZXQ7CisKKwlpZiAoa3N0cnRvdTMyKGJ1ZiwgMTAsICZlcnJvcikpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlCisJCShjb250cm9sdm1fY2hhbm5lbCwKKwkJIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAorCQkJICBpbnN0YWxsYXRpb25fZXJyb3IpLAorCQkgJmVycm9yLCBzaXplb2YodTMyKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gY291bnQ7Cit9CiBzdGF0aWMgREVWSUNFX0FUVFJfUlcoZXJyb3IpOwogCiBzdGF0aWMgc3NpemVfdCB0ZXh0aWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgY2hhciAqYnVmKTsKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwl1MzIgdGV4dF9pZCA9IDA7CisKKwl2aXNvcmNoYW5uZWxfcmVhZAorCQkoY29udHJvbHZtX2NoYW5uZWwsCisJCSBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKKwkJCSAgaW5zdGFsbGF0aW9uX3RleHRfaWQpLAorCQkgJnRleHRfaWQsIHNpemVvZih1MzIpKTsKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWlcbiIsIHRleHRfaWQpOworfQorCiBzdGF0aWMgc3NpemVfdCB0ZXh0aWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdTMyIHRleHRfaWQ7CisJaW50IHJldDsKKworCWlmIChrc3RydG91MzIoYnVmLCAxMCwgJnRleHRfaWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHZpc29yY2hhbm5lbF93cml0ZQorCQkoY29udHJvbHZtX2NoYW5uZWwsCisJCSBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKKwkJCSAgaW5zdGFsbGF0aW9uX3RleHRfaWQpLAorCQkgJnRleHRfaWQsIHNpemVvZih1MzIpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBjb3VudDsKK30KIHN0YXRpYyBERVZJQ0VfQVRUUl9SVyh0ZXh0aWQpOwogCiBzdGF0aWMgc3NpemVfdCByZW1haW5pbmdfc3RlcHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOworCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXUxNiByZW1haW5pbmdfc3RlcHMgPSAwOworCisJdmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAorCQkJCSAgIGluc3RhbGxhdGlvbl9yZW1haW5pbmdfc3RlcHMpLAorCQkJICAmcmVtYWluaW5nX3N0ZXBzLCBzaXplb2YodTE2KSk7CisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVodVxuIiwgcmVtYWluaW5nX3N0ZXBzKTsKK30KKwogc3RhdGljIHNzaXplX3QgcmVtYWluaW5nX3N0ZXBzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdTE2IHJlbWFpbmluZ19zdGVwczsKKwlpbnQgcmV0OworCisJaWYgKGtzdHJ0b3UxNihidWYsIDEwLCAmcmVtYWluaW5nX3N0ZXBzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUKKwkJKGNvbnRyb2x2bV9jaGFubmVsLAorCQkgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCisJCQkgIGluc3RhbGxhdGlvbl9yZW1haW5pbmdfc3RlcHMpLAorCQkgJnJlbWFpbmluZ19zdGVwcywgc2l6ZW9mKHUxNikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGNvdW50OworfQogc3RhdGljIERFVklDRV9BVFRSX1JXKHJlbWFpbmluZ19zdGVwcyk7CiAKLXN0YXRpYyBzc2l6ZV90IGRldmljZWRpc2FibGVkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKLXN0YXRpYyBERVZJQ0VfQVRUUl9XTyhkZXZpY2VkaXNhYmxlZCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGRldmljZWVuYWJsZWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKLXN0YXRpYyBERVZJQ0VfQVRUUl9XTyhkZXZpY2VlbmFibGVkKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnZpc29yY2hpcHNldF9pbnN0YWxsX2F0dHJzW10gPSB7Ci0JJmRldl9hdHRyX3Rvb2xhY3Rpb24uYXR0ciwKLQkmZGV2X2F0dHJfYm9vdHRvdG9vbC5hdHRyLAotCSZkZXZfYXR0cl9lcnJvci5hdHRyLAotCSZkZXZfYXR0cl90ZXh0aWQuYXR0ciwKLQkmZGV2X2F0dHJfcmVtYWluaW5nX3N0ZXBzLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdmlzb3JjaGlwc2V0X2luc3RhbGxfZ3JvdXAgPSB7Ci0JLm5hbWUgPSAiaW5zdGFsbCIsCi0JLmF0dHJzID0gdmlzb3JjaGlwc2V0X2luc3RhbGxfYXR0cnMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp2aXNvcmNoaXBzZXRfcGFyYWhvdHBsdWdfYXR0cnNbXSA9IHsKLQkmZGV2X2F0dHJfZGV2aWNlZGlzYWJsZWQuYXR0ciwKLQkmZGV2X2F0dHJfZGV2aWNlZW5hYmxlZC5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHZpc29yY2hpcHNldF9wYXJhaG90cGx1Z19ncm91cCA9IHsKLQkubmFtZSA9ICJwYXJhaG90cGx1ZyIsCi0JLmF0dHJzID0gdmlzb3JjaGlwc2V0X3BhcmFob3RwbHVnX2F0dHJzCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqdmlzb3JjaGlwc2V0X2Rldl9ncm91cHNbXSA9IHsKLQkmdmlzb3JjaGlwc2V0X2luc3RhbGxfZ3JvdXAsCi0JJnZpc29yY2hpcHNldF9wYXJhaG90cGx1Z19ncm91cCwKLQlOVUxMCi19OwotCi1zdGF0aWMgdm9pZCB2aXNvcmNoaXBzZXRfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotfQotCi0vKiAvc3lzL2RldmljZXMvcGxhdGZvcm0vdmlzb3JjaGlwc2V0ICovCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB2aXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlID0gewotCS5uYW1lID0gInZpc29yY2hpcHNldCIsCi0JLmlkID0gLTEsCi0JLmRldi5ncm91cHMgPSB2aXNvcmNoaXBzZXRfZGV2X2dyb3VwcywKLQkuZGV2LnJlbGVhc2UgPSB2aXNvcmNoaXBzZXRfZGV2X3JlbGVhc2UsCi19OwotCi0vKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCi1zdGF0aWMgdm9pZCBjb250cm9sdm1fcmVzcG9uZChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLAotCQkJICAgICAgaW50IHJlc3BvbnNlKTsKLXN0YXRpYyB2b2lkIGNvbnRyb2x2bV9yZXNwb25kX2NoaXBzZXRfaW5pdCgKLQkJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnX2hkciwgaW50IHJlc3BvbnNlLAotCQllbnVtIHVsdHJhX2NoaXBzZXRfZmVhdHVyZSBmZWF0dXJlcyk7Ci1zdGF0aWMgdm9pZCBjb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlKAotCQlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLCBpbnQgcmVzcG9uc2UsCi0JCXN0cnVjdCBzcGFyX3NlZ21lbnRfc3RhdGUgc3RhdGUpOwotCi1zdGF0aWMgdm9pZCBwYXJzZXJfZG9uZShzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKmN0eCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKgotcGFyc2VyX2luaXRfYnl0ZV9zdHJlYW0odTY0IGFkZHIsIHUzMiBieXRlcywgYm9vbCBsb2NhbCwgYm9vbCAqcmV0cnkpCi17Ci0JaW50IGFsbG9jYnl0ZXMgPSBzaXplb2Yoc3RydWN0IHBhcnNlcl9jb250ZXh0KSArIGJ5dGVzOwotCXN0cnVjdCBwYXJzZXJfY29udGV4dCAqY3R4OwotCi0JaWYgKHJldHJ5KQotCQkqcmV0cnkgPSBmYWxzZTsKLQotCS8qCi0JICogYWxsb2MgYW4gMCBleHRyYSBieXRlIHRvIGVuc3VyZSBwYXlsb2FkIGlzCi0JICogJ1wwJy10ZXJtaW5hdGVkCi0JICovCi0JYWxsb2NieXRlcysrOwotCWlmICgoY29udHJvbHZtX3BheWxvYWRfYnl0ZXNfYnVmZmVyZWQgKyBieXRlcykKLQkgICAgPiBNQVhfQ09OVFJPTFZNX1BBWUxPQURfQllURVMpIHsKLQkJaWYgKHJldHJ5KQotCQkJKnJldHJ5ID0gdHJ1ZTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWN0eCA9IGt6YWxsb2MoYWxsb2NieXRlcywgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOwotCWlmICghY3R4KSB7Ci0JCWlmIChyZXRyeSkKLQkJCSpyZXRyeSA9IHRydWU7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWN0eC0+YWxsb2NieXRlcyA9IGFsbG9jYnl0ZXM7Ci0JY3R4LT5wYXJhbV9ieXRlcyA9IGJ5dGVzOwotCWN0eC0+Y3VyciA9IE5VTEw7Ci0JY3R4LT5ieXRlc19yZW1haW5pbmcgPSAwOwotCWN0eC0+Ynl0ZV9zdHJlYW0gPSBmYWxzZTsKLQlpZiAobG9jYWwpIHsKLQkJdm9pZCAqcDsKLQotCQlpZiAoYWRkciA+IHZpcnRfdG9fcGh5cyhoaWdoX21lbW9yeSAtIDEpKQotCQkJZ290byBlcnJfZmluaXNoX2N0eDsKLQkJcCA9IF9fdmEoKHVuc2lnbmVkIGxvbmcpKGFkZHIpKTsKLQkJbWVtY3B5KGN0eC0+ZGF0YSwgcCwgYnl0ZXMpOwotCX0gZWxzZSB7Ci0JCXZvaWQgKm1hcHBpbmcgPSBtZW1yZW1hcChhZGRyLCBieXRlcywgTUVNUkVNQVBfV0IpOwotCi0JCWlmICghbWFwcGluZykKLQkJCWdvdG8gZXJyX2ZpbmlzaF9jdHg7Ci0JCW1lbWNweShjdHgtPmRhdGEsIG1hcHBpbmcsIGJ5dGVzKTsKLQkJbWVtdW5tYXAobWFwcGluZyk7Ci0JfQotCi0JY3R4LT5ieXRlX3N0cmVhbSA9IHRydWU7Ci0JY29udHJvbHZtX3BheWxvYWRfYnl0ZXNfYnVmZmVyZWQgKz0gY3R4LT5wYXJhbV9ieXRlczsKLQotCXJldHVybiBjdHg7Ci0KLWVycl9maW5pc2hfY3R4OgotCXBhcnNlcl9kb25lKGN0eCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KIHN0YXRpYyB1dWlkX2xlCiBwYXJzZXJfaWRfZ2V0KHN0cnVjdCBwYXJzZXJfY29udGV4dCAqY3R4KQogewpAQCAtMzk3LDggKzM2MCw5IEBACiAJcmV0dXJuIHBoZHItPmlkOwogfQogCi0vKiogRGVzY3JpYmVzIHRoZSBzdGF0ZSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB3aGljaCBjb250cm9sdm0gbWVzc2FnZXMgaGF2ZQotICogIGJlZW4gcmVjZWl2ZWQgZm9yIGEgYnVzIG9yIGRldmljZS4KKy8qCisgKiBEZXNjcmliZXMgdGhlIHN0YXRlIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHdoaWNoIGNvbnRyb2x2bSBtZXNzYWdlcyBoYXZlCisgKiBiZWVuIHJlY2VpdmVkIGZvciBhIGJ1cyBvciBkZXZpY2UuCiAgKi8KIAogZW51bSBQQVJTRVJfV0hJQ0hfU1RSSU5HIHsKQEAgLTQ4MSwxNzAgKzQ0NSw2IEBACiAJcmV0dXJuIHZhbHVlOwogfQogCi1zdGF0aWMgc3NpemVfdCB0b29sYWN0aW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgIGNoYXIgKmJ1ZikKLXsKLQl1OCB0b29sX2FjdGlvbiA9IDA7Ci0KLQl2aXNvcmNoYW5uZWxfcmVhZChjb250cm9sdm1fY2hhbm5lbCwKLQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCi0JCQkJICAgdG9vbF9hY3Rpb24pLCAmdG9vbF9hY3Rpb24sIHNpemVvZih1OCkpOwotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgdG9vbF9hY3Rpb24pOwotfQotCi1zdGF0aWMgc3NpemVfdCB0b29sYWN0aW9uX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQl1OCB0b29sX2FjdGlvbjsKLQlpbnQgcmV0OwotCi0JaWYgKGtzdHJ0b3U4KGJ1ZiwgMTAsICZ0b29sX2FjdGlvbikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlCi0JCShjb250cm9sdm1fY2hhbm5lbCwKLQkJIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAotCQkJICB0b29sX2FjdGlvbiksCi0JCSAmdG9vbF9hY3Rpb24sIHNpemVvZih1OCkpOwotCi0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJvb3R0b3Rvb2xfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgICAgY2hhciAqYnVmKQotewotCXN0cnVjdCBlZmlfc3Bhcl9pbmRpY2F0aW9uIGVmaV9zcGFyX2luZGljYXRpb247Ci0KLQl2aXNvcmNoYW5uZWxfcmVhZChjb250cm9sdm1fY2hhbm5lbCwKLQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCi0JCQkJICAgZWZpX3NwYXJfaW5kKSwgJmVmaV9zcGFyX2luZGljYXRpb24sCi0JCQkgIHNpemVvZihzdHJ1Y3QgZWZpX3NwYXJfaW5kaWNhdGlvbikpOwotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwKLQkJCSBlZmlfc3Bhcl9pbmRpY2F0aW9uLmJvb3RfdG9fdG9vbCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJvb3R0b3Rvb2xfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCWludCB2YWwsIHJldDsKLQlzdHJ1Y3QgZWZpX3NwYXJfaW5kaWNhdGlvbiBlZmlfc3Bhcl9pbmRpY2F0aW9uOwotCi0JaWYgKGtzdHJ0b2ludChidWYsIDEwLCAmdmFsKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQllZmlfc3Bhcl9pbmRpY2F0aW9uLmJvb3RfdG9fdG9vbCA9IHZhbDsKLQlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUKLQkJKGNvbnRyb2x2bV9jaGFubmVsLAotCQkgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCi0JCQkgIGVmaV9zcGFyX2luZCksICYoZWZpX3NwYXJfaW5kaWNhdGlvbiksCi0JCSBzaXplb2Yoc3RydWN0IGVmaV9zcGFyX2luZGljYXRpb24pKTsKLQotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBlcnJvcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgIGNoYXIgKmJ1ZikKLXsKLQl1MzIgZXJyb3IgPSAwOwotCi0Jdmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCi0JCQkgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAotCQkJCSAgIGluc3RhbGxhdGlvbl9lcnJvciksCi0JCQkgICZlcnJvciwgc2l6ZW9mKHUzMikpOwotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlaVxuIiwgZXJyb3IpOwotfQotCi1zdGF0aWMgc3NpemVfdCBlcnJvcl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JdTMyIGVycm9yOwotCWludCByZXQ7Ci0KLQlpZiAoa3N0cnRvdTMyKGJ1ZiwgMTAsICZlcnJvcikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlCi0JCShjb250cm9sdm1fY2hhbm5lbCwKLQkJIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAotCQkJICBpbnN0YWxsYXRpb25fZXJyb3IpLAotCQkgJmVycm9yLCBzaXplb2YodTMyKSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHRleHRpZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICBjaGFyICpidWYpCi17Ci0JdTMyIHRleHRfaWQgPSAwOwotCi0Jdmlzb3JjaGFubmVsX3JlYWQKLQkJKGNvbnRyb2x2bV9jaGFubmVsLAotCQkgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCi0JCQkgIGluc3RhbGxhdGlvbl90ZXh0X2lkKSwKLQkJICZ0ZXh0X2lkLCBzaXplb2YodTMyKSk7Ci0JcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVpXG4iLCB0ZXh0X2lkKTsKLX0KLQotc3RhdGljIHNzaXplX3QgdGV4dGlkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JdTMyIHRleHRfaWQ7Ci0JaW50IHJldDsKLQotCWlmIChrc3RydG91MzIoYnVmLCAxMCwgJnRleHRfaWQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IHZpc29yY2hhbm5lbF93cml0ZQotCQkoY29udHJvbHZtX2NoYW5uZWwsCi0JCSBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKLQkJCSAgaW5zdGFsbGF0aW9uX3RleHRfaWQpLAotCQkgJnRleHRfaWQsIHNpemVvZih1MzIpKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgcmVtYWluaW5nX3N0ZXBzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXUxNiByZW1haW5pbmdfc3RlcHMgPSAwOwotCi0Jdmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCi0JCQkgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAotCQkJCSAgIGluc3RhbGxhdGlvbl9yZW1haW5pbmdfc3RlcHMpLAotCQkJICAmcmVtYWluaW5nX3N0ZXBzLCBzaXplb2YodTE2KSk7Ci0JcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVodVxuIiwgcmVtYWluaW5nX3N0ZXBzKTsKLX0KLQotc3RhdGljIHNzaXplX3QgcmVtYWluaW5nX3N0ZXBzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JdTE2IHJlbWFpbmluZ19zdGVwczsKLQlpbnQgcmV0OwotCi0JaWYgKGtzdHJ0b3UxNihidWYsIDEwLCAmcmVtYWluaW5nX3N0ZXBzKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUKLQkJKGNvbnRyb2x2bV9jaGFubmVsLAotCQkgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCi0JCQkgIGluc3RhbGxhdGlvbl9yZW1haW5pbmdfc3RlcHMpLAotCQkgJnJlbWFpbmluZ19zdGVwcywgc2l6ZW9mKHUxNikpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIGNvdW50OwotfQotCiBzdHJ1Y3Qgdmlzb3JfYnVzZGV2IHsKIAl1MzIgYnVzX25vOwogCXUzMiBkZXZfbm87CkBAIC02ODMsNjQgKzQ4Myw2IEBACiAJCXZkZXYgPSB0b192aXNvcl9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gdmRldjsKIH0KLUVYUE9SVF9TWU1CT0wodmlzb3JidXNfZ2V0X2RldmljZV9ieV9pZCk7Ci0KLXZvaWQKLXZpc29yY2hpcHNldF9yZWdpc3Rlcl9idXNkZXYoCi0JCQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c2Rldl9ub3RpZmllcnMgKm5vdGlmaWVycywKLQkJCXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzZGV2X3Jlc3BvbmRlcnMgKnJlc3BvbmRlcnMsCi0JCQlzdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvICpkcml2ZXJfaW5mbykKLXsKLQlkb3duKCZub3RpZmllcl9sb2NrKTsKLQlpZiAoIW5vdGlmaWVycykgewotCQltZW1zZXQoJmJ1c2Rldl9ub3RpZmllcnMsIDAsCi0JCSAgICAgICBzaXplb2YoYnVzZGV2X25vdGlmaWVycykpOwotCQl2aXNvcmJ1c3JlZ2lzdGVyZWQgPSAwOwkvKiBjbGVhciBmbGFnICovCi0JfSBlbHNlIHsKLQkJYnVzZGV2X25vdGlmaWVycyA9ICpub3RpZmllcnM7Ci0JCXZpc29yYnVzcmVnaXN0ZXJlZCA9IDE7CS8qIHNldCBmbGFnICovCi0JfQotCWlmIChyZXNwb25kZXJzKQotCQkqcmVzcG9uZGVycyA9IGJ1c2Rldl9yZXNwb25kZXJzOwotCWlmIChkcml2ZXJfaW5mbykKLQkJYnVzX2RldmljZV9pbmZvX2luaXQoZHJpdmVyX2luZm8sICJjaGlwc2V0IiwgInZpc29yY2hpcHNldCIsCi0JCQkJICAgICBWRVJTSU9OLCBOVUxMKTsKLQotCXVwKCZub3RpZmllcl9sb2NrKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hpcHNldF9yZWdpc3Rlcl9idXNkZXYpOwotCi1zdGF0aWMgdm9pZAotY2hpcHNldF9pbml0KHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqaW5tc2cpCi17Ci0Jc3RhdGljIGludCBjaGlwc2V0X2luaXRlZDsKLQllbnVtIHVsdHJhX2NoaXBzZXRfZmVhdHVyZSBmZWF0dXJlcyA9IDA7Ci0JaW50IHJjID0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKLQotCVBPU1RDT0RFX0xJTlVYXzIoQ0hJUFNFVF9JTklUX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKLQlpZiAoY2hpcHNldF9pbml0ZWQpIHsKLQkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOwotCQlnb3RvIG91dF9yZXNwb25kOwotCX0KLQljaGlwc2V0X2luaXRlZCA9IDE7Ci0JUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7Ci0KLQkvKiBTZXQgZmVhdHVyZXMgdG8gaW5kaWNhdGUgd2Ugc3VwcG9ydCBwYXJhaG90cGx1ZyAoaWYgQ29tbWFuZAotCSAqIGFsc28gc3VwcG9ydHMgaXQpLgotCSAqLwotCWZlYXR1cmVzID0KLQkgICAgaW5tc2ctPmNtZC5pbml0X2NoaXBzZXQuCi0JICAgIGZlYXR1cmVzICYgVUxUUkFfQ0hJUFNFVF9GRUFUVVJFX1BBUkFfSE9UUExVRzsKLQotCS8qIFNldCB0aGUgInJlcGx5IiBiaXQgc28gQ29tbWFuZCBrbm93cyB0aGlzIGlzIGEKLQkgKiBmZWF0dXJlcy1hd2FyZSBkcml2ZXIuCi0JICovCi0JZmVhdHVyZXMgfD0gVUxUUkFfQ0hJUFNFVF9GRUFUVVJFX1JFUExZOwotCi1vdXRfcmVzcG9uZDoKLQlpZiAoaW5tc2ctPmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCkKLQkJY29udHJvbHZtX3Jlc3BvbmRfY2hpcHNldF9pbml0KCZpbm1zZy0+aGRyLCByYywgZmVhdHVyZXMpOwotfQogCiBzdGF0aWMgdm9pZAogY29udHJvbHZtX2luaXRfcmVzcG9uc2Uoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlICptc2csCkBAIC03NTgsMjEgKzUwMCw2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1jb250cm9sdm1fcmVzcG9uZChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLCBpbnQgcmVzcG9uc2UpCi17Ci0Jc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIG91dG1zZzsKLQotCWNvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKCZvdXRtc2csIG1zZ19oZHIsIHJlc3BvbnNlKTsKLQlpZiAob3V0bXNnLmhkci5mbGFncy50ZXN0X21lc3NhZ2UgPT0gMSkKLQkJcmV0dXJuOwotCi0JaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGNvbnRyb2x2bV9jaGFubmVsLAotCQkJCSAgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpIHsKLQkJcmV0dXJuOwotCX0KLX0KLQotc3RhdGljIHZvaWQKIGNvbnRyb2x2bV9yZXNwb25kX2NoaXBzZXRfaW5pdChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLAogCQkJICAgICAgIGludCByZXNwb25zZSwKIAkJCSAgICAgICBlbnVtIHVsdHJhX2NoaXBzZXRfZmVhdHVyZSBmZWF0dXJlcykKQEAgLTc4MSw4ICs1MDgsNTcgQEAKIAogCWNvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKCZvdXRtc2csIG1zZ19oZHIsIHJlc3BvbnNlKTsKIAlvdXRtc2cuY21kLmluaXRfY2hpcHNldC5mZWF0dXJlcyA9IGZlYXR1cmVzOwotCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKLQkJCQkgICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKSB7CisJaWYgKHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkJICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKSB7CisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjaGlwc2V0X2luaXQoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlICppbm1zZykKK3sKKwlzdGF0aWMgaW50IGNoaXBzZXRfaW5pdGVkOworCWVudW0gdWx0cmFfY2hpcHNldF9mZWF0dXJlIGZlYXR1cmVzID0gMDsKKwlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworCisJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCWlmIChjaGlwc2V0X2luaXRlZCkgeworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7CisJCWdvdG8gb3V0X3Jlc3BvbmQ7CisJfQorCWNoaXBzZXRfaW5pdGVkID0gMTsKKwlQT1NUQ09ERV9MSU5VWF8yKENISVBTRVRfSU5JVF9FWElUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCS8qCisJICogU2V0IGZlYXR1cmVzIHRvIGluZGljYXRlIHdlIHN1cHBvcnQgcGFyYWhvdHBsdWcgKGlmIENvbW1hbmQKKwkgKiBhbHNvIHN1cHBvcnRzIGl0KS4KKwkgKi8KKwlmZWF0dXJlcyA9CisJICAgIGlubXNnLT5jbWQuaW5pdF9jaGlwc2V0LgorCSAgICBmZWF0dXJlcyAmIFVMVFJBX0NISVBTRVRfRkVBVFVSRV9QQVJBX0hPVFBMVUc7CisKKwkvKgorCSAqIFNldCB0aGUgInJlcGx5IiBiaXQgc28gQ29tbWFuZCBrbm93cyB0aGlzIGlzIGEKKwkgKiBmZWF0dXJlcy1hd2FyZSBkcml2ZXIuCisJICovCisJZmVhdHVyZXMgfD0gVUxUUkFfQ0hJUFNFVF9GRUFUVVJFX1JFUExZOworCitvdXRfcmVzcG9uZDoKKwlpZiAoaW5tc2ctPmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCkKKwkJY29udHJvbHZtX3Jlc3BvbmRfY2hpcHNldF9pbml0KCZpbm1zZy0+aGRyLCByYywgZmVhdHVyZXMpOworfQorCitzdGF0aWMgdm9pZAorY29udHJvbHZtX3Jlc3BvbmQoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnX2hkciwgaW50IHJlc3BvbnNlKQoreworCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBvdXRtc2c7CisKKwljb250cm9sdm1faW5pdF9yZXNwb25zZSgmb3V0bXNnLCBtc2dfaGRyLCByZXNwb25zZSk7CisJaWYgKG91dG1zZy5oZHIuZmxhZ3MudGVzdF9tZXNzYWdlID09IDEpCisJCXJldHVybjsKKworCWlmICh2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGNvbnRyb2x2bV9jaGFubmVsLAorCQkJCSAgICAgIENPTlRST0xWTV9RVUVVRV9SRVFVRVNULCAmb3V0bXNnKSkgewogCQlyZXR1cm47CiAJfQogfQpAQCAtNzk2LDggKzU3Miw4IEBACiAJY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJm91dG1zZywgbXNnX2hkciwgcmVzcG9uc2UpOwogCW91dG1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSA9IHN0YXRlOwogCW91dG1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5mbGFncy5waHlzX2RldmljZSA9IDE7Ci0JaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGNvbnRyb2x2bV9jaGFubmVsLAotCQkJCSAgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpIHsKKwlpZiAodmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKKwkJCQkgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpIHsKIAkJcmV0dXJuOwogCX0KIH0KQEAgLTg5NCw4ICs2NzAsOCBAQAogCW91dG1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5kZXZfbm8gPSBkZXZfbm87CiAJb3V0bXNnLmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlID0gcmVzcG9uc2Vfc3RhdGU7CiAKLQlpZiAoIXZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoY29udHJvbHZtX2NoYW5uZWwsCi0JCQkJICAgICAgIENPTlRST0xWTV9RVUVVRV9SRVFVRVNULCAmb3V0bXNnKSkKKwlpZiAodmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKKwkJCQkgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpCiAJCXJldHVybjsKIH0KIApAQCAtOTIwLDIwICs2OTYsMjAgQEAKIHsKIAlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICpwbXNnX2hkciA9IE5VTEw7CiAKLQlkb3duKCZub3RpZmllcl9sb2NrKTsKLQogCWlmICghYnVzX2luZm8pIHsKLQkJLyogcmVseWluZyBvbiBhIHZhbGlkIHBhc3NlZCBpbiByZXNwb25zZSBjb2RlICovCi0JCS8qIGJlIGxhenkgYW5kIHJlLXVzZSBtc2dfaGRyIGZvciB0aGlzIGZhaWx1cmUsIGlzIHRoaXMgb2s/PyAqLworCQkvKgorCQkgKiByZWx5aW5nIG9uIGEgdmFsaWQgcGFzc2VkIGluIHJlc3BvbnNlIGNvZGUKKwkJICogYmUgbGF6eSBhbmQgcmUtdXNlIG1zZ19oZHIgZm9yIHRoaXMgZmFpbHVyZSwgaXMgdGhpcyBvaz8/CisJCSAqLwogCQlwbXNnX2hkciA9IG1zZ19oZHI7Ci0JCWdvdG8gb3V0X3Jlc3BvbmRfYW5kX3VubG9jazsKKwkJZ290byBvdXRfcmVzcG9uZDsKIAl9CiAKIAlpZiAoYnVzX2luZm8tPnBlbmRpbmdfbXNnX2hkcikgewogCQkvKiBvbmx5IG5vbi1OVUxMIGlmIGRldiBpcyBzdGlsbCB3YWl0aW5nIG9uIGEgcmVzcG9uc2UgKi8KIAkJcmVzcG9uc2UgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfTUVTU0FHRV9JRF9JTlZBTElEX0ZPUl9DTElFTlQ7CiAJCXBtc2dfaGRyID0gYnVzX2luZm8tPnBlbmRpbmdfbXNnX2hkcjsKLQkJZ290byBvdXRfcmVzcG9uZF9hbmRfdW5sb2NrOworCQlnb3RvIG91dF9yZXNwb25kOwogCX0KIAogCWlmIChuZWVkX3Jlc3BvbnNlKSB7CkBAIC05NDIsNyArNzE4LDcgQEAKIAkJCVBPU1RDT0RFX0xJTlVYXzQoTUFMTE9DX0ZBSUxVUkVfUEMsIGNtZCwKIAkJCQkJIGJ1c19pbmZvLT5jaGlwc2V0X2J1c19ubywKIAkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7Ci0JCQlnb3RvIG91dF91bmxvY2s7CisJCQlyZXR1cm47CiAJCX0KIAogCQltZW1jcHkocG1zZ19oZHIsIG1zZ19oZHIsCkBAIC05NTMsMjUgKzcyOSwxNiBAQAogCWlmIChyZXNwb25zZSA9PSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CiAJCXN3aXRjaCAoY21kKSB7CiAJCWNhc2UgQ09OVFJPTFZNX0JVU19DUkVBVEU6Ci0JCQlpZiAoYnVzZGV2X25vdGlmaWVycy5idXNfY3JlYXRlKSB7Ci0JCQkJKCpidXNkZXZfbm90aWZpZXJzLmJ1c19jcmVhdGUpIChidXNfaW5mbyk7Ci0JCQkJZ290byBvdXRfdW5sb2NrOwotCQkJfQorCQkJY2hpcHNldF9idXNfY3JlYXRlKGJ1c19pbmZvKTsKIAkJCWJyZWFrOwogCQljYXNlIENPTlRST0xWTV9CVVNfREVTVFJPWToKLQkJCWlmIChidXNkZXZfbm90aWZpZXJzLmJ1c19kZXN0cm95KSB7Ci0JCQkJKCpidXNkZXZfbm90aWZpZXJzLmJ1c19kZXN0cm95KSAoYnVzX2luZm8pOwotCQkJCWdvdG8gb3V0X3VubG9jazsKLQkJCX0KKwkJCWNoaXBzZXRfYnVzX2Rlc3Ryb3koYnVzX2luZm8pOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAKLW91dF9yZXNwb25kX2FuZF91bmxvY2s6CitvdXRfcmVzcG9uZDoKIAlidXNfcmVzcG9uZGVyKGNtZCwgcG1zZ19oZHIsIHJlc3BvbnNlKTsKLQotb3V0X3VubG9jazoKLQl1cCgmbm90aWZpZXJfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC05ODAsMzEgKzc0NywyOSBAQAogCSAgICAgIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ19oZHIsIGludCByZXNwb25zZSwKIAkgICAgICBib29sIG5lZWRfcmVzcG9uc2UsIGJvb2wgZm9yX3Zpc29yYnVzKQogewotCXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzZGV2X25vdGlmaWVycyAqbm90aWZpZXJzOwogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKnBtc2dfaGRyID0gTlVMTDsKIAotCW5vdGlmaWVycyA9ICZidXNkZXZfbm90aWZpZXJzOwotCi0JZG93bigmbm90aWZpZXJfbG9jayk7CiAJaWYgKCFkZXZfaW5mbykgewotCQkvKiByZWx5aW5nIG9uIGEgdmFsaWQgcGFzc2VkIGluIHJlc3BvbnNlIGNvZGUgKi8KLQkJLyogYmUgbGF6eSBhbmQgcmUtdXNlIG1zZ19oZHIgZm9yIHRoaXMgZmFpbHVyZSwgaXMgdGhpcyBvaz8/ICovCisJCS8qCisJCSAqIHJlbHlpbmcgb24gYSB2YWxpZCBwYXNzZWQgaW4gcmVzcG9uc2UgY29kZQorCQkgKiBiZSBsYXp5IGFuZCByZS11c2UgbXNnX2hkciBmb3IgdGhpcyBmYWlsdXJlLCBpcyB0aGlzIG9rPz8KKwkJICovCiAJCXBtc2dfaGRyID0gbXNnX2hkcjsKLQkJZ290byBvdXRfcmVzcG9uZF9hbmRfdW5sb2NrOworCQlnb3RvIG91dF9yZXNwb25kOwogCX0KIAogCWlmIChkZXZfaW5mby0+cGVuZGluZ19tc2dfaGRyKSB7CiAJCS8qIG9ubHkgbm9uLU5VTEwgaWYgZGV2IGlzIHN0aWxsIHdhaXRpbmcgb24gYSByZXNwb25zZSAqLwogCQlyZXNwb25zZSA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9NRVNTQUdFX0lEX0lOVkFMSURfRk9SX0NMSUVOVDsKIAkJcG1zZ19oZHIgPSBkZXZfaW5mby0+cGVuZGluZ19tc2dfaGRyOwotCQlnb3RvIG91dF9yZXNwb25kX2FuZF91bmxvY2s7CisJCWdvdG8gb3V0X3Jlc3BvbmQ7CiAJfQogCiAJaWYgKG5lZWRfcmVzcG9uc2UpIHsKIAkJcG1zZ19oZHIgPSBremFsbG9jKHNpemVvZigqcG1zZ19oZHIpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFwbXNnX2hkcikgewogCQkJcmVzcG9uc2UgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfS01BTExPQ19GQUlMRUQ7Ci0JCQlnb3RvIG91dF9yZXNwb25kX2FuZF91bmxvY2s7CisJCQlnb3RvIG91dF9yZXNwb25kOwogCQl9CiAKIAkJbWVtY3B5KHBtc2dfaGRyLCBtc2dfaGRyLApAQCAtMTAxNSw0OCArNzgwLDM0IEBACiAJaWYgKHJlc3BvbnNlID49IDApIHsKIAkJc3dpdGNoIChjbWQpIHsKIAkJY2FzZSBDT05UUk9MVk1fREVWSUNFX0NSRUFURToKLQkJCWlmIChub3RpZmllcnMtPmRldmljZV9jcmVhdGUpIHsKLQkJCQkoKm5vdGlmaWVycy0+ZGV2aWNlX2NyZWF0ZSkgKGRldl9pbmZvKTsKLQkJCQlnb3RvIG91dF91bmxvY2s7Ci0JCQl9CisJCQljaGlwc2V0X2RldmljZV9jcmVhdGUoZGV2X2luZm8pOwogCQkJYnJlYWs7CiAJCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURToKIAkJCS8qIFNlcnZlclJlYWR5IC8gU2VydmVyUnVubmluZyAvIFNlZ21lbnRTdGF0ZVJ1bm5pbmcgKi8KIAkJCWlmIChzdGF0ZS5hbGl2ZSA9PSBzZWdtZW50X3N0YXRlX3J1bm5pbmcuYWxpdmUgJiYKIAkJCSAgICBzdGF0ZS5vcGVyYXRpbmcgPT0KIAkJCQlzZWdtZW50X3N0YXRlX3J1bm5pbmcub3BlcmF0aW5nKSB7Ci0JCQkJaWYgKG5vdGlmaWVycy0+ZGV2aWNlX3Jlc3VtZSkgewotCQkJCQkoKm5vdGlmaWVycy0+ZGV2aWNlX3Jlc3VtZSkgKGRldl9pbmZvKTsKLQkJCQkJZ290byBvdXRfdW5sb2NrOwotCQkJCX0KKwkJCQljaGlwc2V0X2RldmljZV9yZXN1bWUoZGV2X2luZm8pOwogCQkJfQogCQkJLyogU2VydmVyTm90UmVhZHkgLyBTZXJ2ZXJMb3N0IC8gU2VnbWVudFN0YXRlU3RhbmRieSAqLwogCQkJZWxzZSBpZiAoc3RhdGUuYWxpdmUgPT0gc2VnbWVudF9zdGF0ZV9zdGFuZGJ5LmFsaXZlICYmCiAJCQkJIHN0YXRlLm9wZXJhdGluZyA9PQogCQkJCSBzZWdtZW50X3N0YXRlX3N0YW5kYnkub3BlcmF0aW5nKSB7Ci0JCQkJLyogdGVjaG5pY2FsbHkgdGhpcyBpcyBzdGFuZGJ5IGNhc2UKKwkJCQkvKgorCQkJCSAqIHRlY2huaWNhbGx5IHRoaXMgaXMgc3RhbmRieSBjYXNlCiAJCQkJICogd2hlcmUgc2VydmVyIGlzIGxvc3QKIAkJCQkgKi8KLQkJCQlpZiAobm90aWZpZXJzLT5kZXZpY2VfcGF1c2UpIHsKLQkJCQkJKCpub3RpZmllcnMtPmRldmljZV9wYXVzZSkgKGRldl9pbmZvKTsKLQkJCQkJZ290byBvdXRfdW5sb2NrOwotCQkJCX0KKwkJCQljaGlwc2V0X2RldmljZV9wYXVzZShkZXZfaW5mbyk7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBDT05UUk9MVk1fREVWSUNFX0RFU1RST1k6Ci0JCQlpZiAobm90aWZpZXJzLT5kZXZpY2VfZGVzdHJveSkgewotCQkJCSgqbm90aWZpZXJzLT5kZXZpY2VfZGVzdHJveSkgKGRldl9pbmZvKTsKLQkJCQlnb3RvIG91dF91bmxvY2s7Ci0JCQl9CisJCQljaGlwc2V0X2RldmljZV9kZXN0cm95KGRldl9pbmZvKTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi1vdXRfcmVzcG9uZF9hbmRfdW5sb2NrOgorb3V0X3Jlc3BvbmQ6CiAJZGV2aWNlX3Jlc3BvbmRlcihjbWQsIHBtc2dfaGRyLCByZXNwb25zZSk7Ci0KLW91dF91bmxvY2s6Ci0JdXAoJm5vdGlmaWVyX2xvY2spOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTEwMywxMCArODU0LDggQEAKIAkJZ290byBvdXRfYnVzX2VwaWxvZzsKIAl9CiAJYnVzX2luZm8tPnZpc29yY2hhbm5lbCA9IHZpc29yY2hhbm5lbDsKLQlpZiAodXVpZF9sZV9jbXAoY21kLT5jcmVhdGVfYnVzLmJ1c19pbnN0X3V1aWQsIHNwYXJfc2lvdm1fdXVpZCkgPT0gMCkgewotCQlkdW1wX3ZoYmFfYnVzID0gYnVzX25vOworCWlmICh1dWlkX2xlX2NtcChjbWQtPmNyZWF0ZV9idXMuYnVzX2luc3RfdXVpZCwgc3Bhcl9zaW92bV91dWlkKSA9PSAwKQogCQlzYXZlX2NyYXNoX21lc3NhZ2UoaW5tc2csIENSQVNIX0JVUyk7Ci0JfQogCiAJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0VYSVRfUEMsIGJ1c19ubywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKQEAgLTEzMDMsMTEgKzEwNTIsMTkgQEAKIAkJCSAgICAgIGlubXNnLT5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQgPT0gMSwgMSk7CiB9CiAKLS8qIFdoZW4gcHJvdmlkZWQgd2l0aCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY29udHJvbHZtIGNoYW5uZWwKKy8qKgorICogaW5pdGlhbGl6ZV9jb250cm9sdm1fcGF5bG9hZF9pbmZvKCkgLSBpbml0IGNvbnRyb2x2bV9wYXlsb2FkX2luZm8gc3RydWN0CisgKiBAcGh5c19hZGRyOiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBjb250cm9sdm0gY2hhbm5lbAorICogQG9mZnNldDogICAgdGhlIG9mZnNldCB0byBwYXlsb2FkCisgKiBAYnl0ZXM6ICAgICB0aGUgc2l6ZSBvZiB0aGUgcGF5bG9hZCBpbiBieXRlcworICogQGluZm86ICAgICAgdGhlIHJldHVybmluZyB2YWxpZCBzdHJ1Y3QKKyAqCisgKiBXaGVuIHByb3ZpZGVkIHdpdGggdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2x2bSBjaGFubmVsCiAgKiAocGh5c19hZGRyKSwgdGhlIG9mZnNldCB0byB0aGUgcGF5bG9hZCBhcmVhIHdlIG5lZWQgdG8gbWFuYWdlCiAgKiAob2Zmc2V0KSwgYW5kIHRoZSBzaXplIG9mIHRoaXMgcGF5bG9hZCBhcmVhIChieXRlcyksIGZpbGxzIGluIHRoZQotICogY29udHJvbHZtX3BheWxvYWRfaW5mbyBzdHJ1Y3QuICBSZXR1cm5zIHRydWUgZm9yIHN1Y2Nlc3Mgb3IgZmFsc2UKLSAqIGZvciBmYWlsdXJlLgorICogY29udHJvbHZtX3BheWxvYWRfaW5mbyBzdHJ1Y3QuCisgKgorICogUmV0dXJuOiBDT05UUk9MVk1fUkVTUF9TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZm9yIGZhaWx1cmUKICAqLwogc3RhdGljIGludAogaW5pdGlhbGl6ZV9jb250cm9sdm1fcGF5bG9hZF9pbmZvKHU2NCBwaHlzX2FkZHIsIHU2NCBvZmZzZXQsIHUzMiBieXRlcywKQEAgLTEzNzEsOCArMTEyOCwzMTUgQEAKIAkJCQkJICAmY29udHJvbHZtX3BheWxvYWRfaW5mbyk7CiB9CiAKLS8qICBTZW5kIEFDVElPTj1vbmxpbmUgZm9yIERFVlBBVEg9L3N5cy9kZXZpY2VzL3BsYXRmb3JtL3Zpc29yY2hpcHNldC4KLSAqICBSZXR1cm5zIENPTlRST0xWTV9SRVNQX3h4eCBjb2RlLgorLyoKKyAqIFRoZSBnZW5lcmFsIHBhcmFob3RwbHVnIGZsb3cgd29ya3MgYXMgZm9sbG93cy4gVGhlIHZpc29yY2hpcHNldAorICogZHJpdmVyIHJlY2VpdmVzIGEgREVWSUNFX0NIQU5HRVNUQVRFIG1lc3NhZ2UgZnJvbSBDb21tYW5kCisgKiBzcGVjaWZ5aW5nIGEgcGh5c2ljYWwgZGV2aWNlIHRvIGVuYWJsZSBvciBkaXNhYmxlLiBUaGUgQ09OVFJPTFZNCisgKiBtZXNzYWdlIGhhbmRsZXIgY2FsbHMgcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlLCB3aGljaCB0aGVuIGFkZHMKKyAqIHRoZSBtZXNzYWdlIHRvIGEgZ2xvYmFsIGxpc3QgYW5kIGtpY2tzIG9mZiBhIHVkZXYgZXZlbnQgd2hpY2gKKyAqIGNhdXNlcyBhIHVzZXIgbGV2ZWwgc2NyaXB0IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzcGVjaWZpZWQKKyAqIGRldmljZS4gVGhlIHVkZXYgc2NyaXB0IHRoZW4gd3JpdGVzIHRvCisgKiAvcHJvYy92aXNvcmNoaXBzZXQvcGFyYWhvdHBsdWcsIHdoaWNoIGNhdXNlcyBwYXJhaG90cGx1Z19wcm9jX3dyaXRlCisgKiB0byBnZXQgY2FsbGVkLCBhdCB3aGljaCBwb2ludCB0aGUgYXBwcm9wcmlhdGUgQ09OVFJPTFZNIG1lc3NhZ2UgaXMKKyAqIHJldHJpZXZlZCBmcm9tIHRoZSBsaXN0IGFuZCByZXNwb25kZWQgdG8uCisgKi8KKworI2RlZmluZSBQQVJBSE9UUExVR19USU1FT1VUX01TIDIwMDAKKworLyoqCisgKiBwYXJhaG90cGx1Z19uZXh0X2lkKCkgLSBnZW5lcmF0ZSB1bmlxdWUgaW50IHRvIG1hdGNoIGFuIG91dHN0YW5kaW5nIENPTlRST0xWTQorICogICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSB3aXRoIGEgdWRldiBzY3JpcHQgL3Byb2MgcmVzcG9uc2UKKyAqCisgKiBSZXR1cm46IGEgdW5pcXVlIGludGVnZXIgdmFsdWUKKyAqLworc3RhdGljIGludAorcGFyYWhvdHBsdWdfbmV4dF9pZCh2b2lkKQoreworCXN0YXRpYyBhdG9taWNfdCBpZCA9IEFUT01JQ19JTklUKDApOworCisJcmV0dXJuIGF0b21pY19pbmNfcmV0dXJuKCZpZCk7Cit9CisKKy8qKgorICogcGFyYWhvdHBsdWdfbmV4dF9leHBpcmF0aW9uKCkgLSByZXR1cm5zIHRoZSB0aW1lIChpbiBqaWZmaWVzKSB3aGVuIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVFJPTFZNIG1lc3NhZ2Ugb24gdGhlIGxpc3Qgc2hvdWxkIGV4cGlyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBQQVJBSE9UUExVR19USU1FT1VUX01TIGluIHRoZSBmdXR1cmUKKyAqCisgKiBSZXR1cm46IGV4cGVjdGVkIGV4cGlyYXRpb24gdGltZSAoaW4gamlmZmllcykKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK3BhcmFob3RwbHVnX25leHRfZXhwaXJhdGlvbih2b2lkKQoreworCXJldHVybiBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhQQVJBSE9UUExVR19USU1FT1VUX01TKTsKK30KKworLyoqCisgKiBwYXJhaG90cGx1Z19yZXF1ZXN0X2NyZWF0ZSgpIC0gY3JlYXRlIGEgcGFyYWhvdHBsdWdfcmVxdWVzdCwgd2hpY2ggaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY2FsbHkgYSB3cmFwcGVyIGZvciBhIENPTlRST0xWTV9NRVNTQUdFCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3ZSBjYW4gc3RpY2sgb24gYSBsaXN0CisgKiBAbXNnOiB0aGUgbWVzc2FnZSB0byBpbnNlcnQgaW4gdGhlIHJlcXVlc3QKKyAqCisgKiBSZXR1cm46IHRoZSByZXF1ZXN0IGNvbnRhaW5pbmcgdGhlIHByb3ZpZGVkIG1lc3NhZ2UKKyAqLworc3RhdGljIHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICoKK3BhcmFob3RwbHVnX3JlcXVlc3RfY3JlYXRlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXE7CisKKwlyZXEgPSBrbWFsbG9jKHNpemVvZigqcmVxKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOworCWlmICghcmVxKQorCQlyZXR1cm4gTlVMTDsKKworCXJlcS0+aWQgPSBwYXJhaG90cGx1Z19uZXh0X2lkKCk7CisJcmVxLT5leHBpcmF0aW9uID0gcGFyYWhvdHBsdWdfbmV4dF9leHBpcmF0aW9uKCk7CisJcmVxLT5tc2cgPSAqbXNnOworCisJcmV0dXJuIHJlcTsKK30KKworLyoqCisgKiBwYXJhaG90cGx1Z19yZXF1ZXN0X2Rlc3Ryb3koKSAtIGZyZWUgYSBwYXJhaG90cGx1Z19yZXF1ZXN0CisgKiBAcmVxOiB0aGUgcmVxdWVzdCB0byBkZWFsbG9jYXRlCisgKi8KK3N0YXRpYyB2b2lkCitwYXJhaG90cGx1Z19yZXF1ZXN0X2Rlc3Ryb3koc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QgKnJlcSkKK3sKKwlrZnJlZShyZXEpOworfQorCitzdGF0aWMgTElTVF9IRUFEKHBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsJLyogbG9jayBmb3IgYWJvdmUgKi8KKworLyoqCisgKiBwYXJhaG90cGx1Z19yZXF1ZXN0X2NvbXBsZXRlKCkgLSBtYXJrIHJlcXVlc3QgYXMgY29tcGxldGUKKyAqIEBpZDogICAgIHRoZSBpZCBvZiB0aGUgcmVxdWVzdAorICogQGFjdGl2ZTogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlcXVlc3QgaXMgYXNzaWduZWQgdG8gYWN0aXZlIHBhcnRpdGlvbgorICoKKyAqIENhbGxlZCBmcm9tIHRoZSAvcHJvYyBoYW5kbGVyLCB3aGljaCBtZWFucyB0aGUgdXNlciBzY3JpcHQgaGFzCisgKiBmaW5pc2hlZCB0aGUgZW5hYmxlL2Rpc2FibGUuIEZpbmQgdGhlIG1hdGNoaW5nIGlkZW50aWZpZXIsIGFuZAorICogcmVzcG9uZCB0byB0aGUgQ09OVFJPTFZNIG1lc3NhZ2Ugd2l0aCBzdWNjZXNzLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzIG9yIC1FSU5WQUwgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50CitwYXJhaG90cGx1Z19yZXF1ZXN0X2NvbXBsZXRlKGludCBpZCwgdTE2IGFjdGl2ZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCisJc3Bpbl9sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisKKwkvKiBMb29rIGZvciBhIHJlcXVlc3QgbWF0Y2hpbmcgImlkIi4gKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0bXAsICZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3QpIHsKKwkJc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QgKnJlcSA9CisJCSAgICBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QsIGxpc3QpOworCQlpZiAocmVxLT5pZCA9PSBpZCkgeworCQkJLyoKKwkJCSAqIEZvdW5kIGEgbWF0Y2guIFJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IGFuZAorCQkJICogcmVzcG9uZC4KKwkJCSAqLworCQkJbGlzdF9kZWwocG9zKTsKKwkJCXNwaW5fdW5sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisJCQlyZXEtPm1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZS5hY3RpdmUgPSBhY3RpdmU7CisJCQlpZiAocmVxLT5tc2cuaGRyLmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkKQorCQkJCWNvbnRyb2x2bV9yZXNwb25kX3BoeXNkZXZfY2hhbmdlc3RhdGUoCisJCQkJCSZyZXEtPm1zZy5oZHIsIENPTlRST0xWTV9SRVNQX1NVQ0NFU1MsCisJCQkJCXJlcS0+bXNnLmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlKTsKKwkJCXBhcmFob3RwbHVnX3JlcXVlc3RfZGVzdHJveShyZXEpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIGRldmljZWRpc2FibGVkX3N0b3JlKCkgLSBkaXNhYmxlcyB0aGUgaG90cGx1ZyBkZXZpY2UKKyAqIEBkZXY6ICAgc3lzZnMgaW50ZXJmYWNlIHZhcmlhYmxlIG5vdCB1dGlsaXplZCBpbiB0aGlzIGZ1bmN0aW9uCisgKiBAYXR0cjogIHN5c2ZzIGludGVyZmFjZSB2YXJpYWJsZSBub3QgdXRpbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbgorICogQGJ1ZjogICBidWZmZXIgY29udGFpbmluZyB0aGUgZGV2aWNlIGlkCisgKiBAY291bnQ6IHRoZSBzaXplIG9mIHRoZSBidWZmZXIKKyAqCisgKiBUaGUgcGFyYWhvdHBsdWcvZGV2aWNlZGlzYWJsZWQgaW50ZXJmYWNlIGdldHMgY2FsbGVkIGJ5IG91ciBzdXBwb3J0IHNjcmlwdAorICogd2hlbiBhbiBTUi1JT1YgZGV2aWNlIGhhcyBiZWVuIHNodXQgZG93bi4gVGhlIElEIGlzIHBhc3NlZCB0byB0aGUgc2NyaXB0CisgKiBhbmQgdGhlbiBwYXNzZWQgYmFjayB3aGVuIHRoZSBkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZC4KKyAqCisgKiBSZXR1cm46IHRoZSBzaXplIG9mIHRoZSBidWZmZXIgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZm9yIGVycm9yCisgKi8KK3N0YXRpYyBzc2l6ZV90IGRldmljZWRpc2FibGVkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGludCBpZDsKKwlpbnQgZXJyOworCisJaWYgKGtzdHJ0b3VpbnQoYnVmLCAxMCwgJmlkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBwYXJhaG90cGx1Z19yZXF1ZXN0X2NvbXBsZXRlKGlkLCAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfV08oZGV2aWNlZGlzYWJsZWQpOworCisvKioKKyAqIGRldmljZWVuYWJsZWRfc3RvcmUoKSAtIGVuYWJsZXMgdGhlIGhvdHBsdWcgZGV2aWNlCisgKiBAZGV2OiAgIHN5c2ZzIGludGVyZmFjZSB2YXJpYWJsZSBub3QgdXRpbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbgorICogQGF0dHI6ICBzeXNmcyBpbnRlcmZhY2UgdmFyaWFibGUgbm90IHV0aWxpemVkIGluIHRoaXMgZnVuY3Rpb24KKyAqIEBidWY6ICAgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRldmljZSBpZAorICogQGNvdW50OiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyCisgKgorICogVGhlIHBhcmFob3RwbHVnL2RldmljZWVuYWJsZWQgaW50ZXJmYWNlIGdldHMgY2FsbGVkIGJ5IG91ciBzdXBwb3J0IHNjcmlwdAorICogd2hlbiBhbiBTUi1JT1YgZGV2aWNlIGhhcyBiZWVuIHJlY292ZXJlZC4gVGhlIElEIGlzIHBhc3NlZCB0byB0aGUgc2NyaXB0CisgKiBhbmQgdGhlbiBwYXNzZWQgYmFjayB3aGVuIHRoZSBkZXZpY2UgaGFzIGJlZW4gYnJvdWdodCBiYWNrIHVwLgorICoKKyAqIFJldHVybjogdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBmb3IgZXJyb3IKKyAqLworc3RhdGljIHNzaXplX3QgZGV2aWNlZW5hYmxlZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgaW50IGlkOworCisJaWYgKGtzdHJ0b3VpbnQoYnVmLCAxMCwgJmlkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwYXJhaG90cGx1Z19yZXF1ZXN0X2NvbXBsZXRlKGlkLCAxKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfV08oZGV2aWNlZW5hYmxlZCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp2aXNvcmNoaXBzZXRfaW5zdGFsbF9hdHRyc1tdID0geworCSZkZXZfYXR0cl90b29sYWN0aW9uLmF0dHIsCisJJmRldl9hdHRyX2Jvb3R0b3Rvb2wuYXR0ciwKKwkmZGV2X2F0dHJfZXJyb3IuYXR0ciwKKwkmZGV2X2F0dHJfdGV4dGlkLmF0dHIsCisJJmRldl9hdHRyX3JlbWFpbmluZ19zdGVwcy5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHZpc29yY2hpcHNldF9pbnN0YWxsX2dyb3VwID0geworCS5uYW1lID0gImluc3RhbGwiLAorCS5hdHRycyA9IHZpc29yY2hpcHNldF9pbnN0YWxsX2F0dHJzCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdmlzb3JjaGlwc2V0X3BhcmFob3RwbHVnX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2RldmljZWRpc2FibGVkLmF0dHIsCisJJmRldl9hdHRyX2RldmljZWVuYWJsZWQuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB2aXNvcmNoaXBzZXRfcGFyYWhvdHBsdWdfZ3JvdXAgPSB7CisJLm5hbWUgPSAicGFyYWhvdHBsdWciLAorCS5hdHRycyA9IHZpc29yY2hpcHNldF9wYXJhaG90cGx1Z19hdHRycworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKnZpc29yY2hpcHNldF9kZXZfZ3JvdXBzW10gPSB7CisJJnZpc29yY2hpcHNldF9pbnN0YWxsX2dyb3VwLAorCSZ2aXNvcmNoaXBzZXRfcGFyYWhvdHBsdWdfZ3JvdXAsCisJTlVMTAorfTsKKworc3RhdGljIHZvaWQgdmlzb3JjaGlwc2V0X2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKK30KKworLyogL3N5cy9kZXZpY2VzL3BsYXRmb3JtL3Zpc29yY2hpcHNldCAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugdmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZSA9IHsKKwkubmFtZSA9ICJ2aXNvcmNoaXBzZXQiLAorCS5pZCA9IC0xLAorCS5kZXYuZ3JvdXBzID0gdmlzb3JjaGlwc2V0X2Rldl9ncm91cHMsCisJLmRldi5yZWxlYXNlID0gdmlzb3JjaGlwc2V0X2Rldl9yZWxlYXNlLAorfTsKKworLyoqCisgKiBwYXJhaG90cGx1Z19yZXF1ZXN0X2tpY2tvZmYoKSAtIGluaXRpYXRlIHBhcmFob3RwbHVnIHJlcXVlc3QKKyAqIEByZXE6IHRoZSByZXF1ZXN0IHRvIGluaXRpYXRlCisgKgorICogQ2F1c2UgdWV2ZW50IHRvIHJ1biB0aGUgdXNlciBsZXZlbCBzY3JpcHQgdG8gZG8gdGhlIGRpc2FibGUvZW5hYmxlIHNwZWNpZmllZAorICogaW4gdGhlIHBhcmFob3RwbHVnX3JlcXVlc3QuCisgKi8KK3N0YXRpYyB2b2lkCitwYXJhaG90cGx1Z19yZXF1ZXN0X2tpY2tvZmYoc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfcGFja2V0ICpjbWQgPSAmcmVxLT5tc2cuY21kOworCWNoYXIgZW52X2NtZFs0MF0sIGVudl9pZFs0MF0sIGVudl9zdGF0ZVs0MF0sIGVudl9idXNbNDBdLCBlbnZfZGV2WzQwXSwKKwkgICAgZW52X2Z1bmNbNDBdOworCWNoYXIgKmVudnBbXSA9IHsKKwkJZW52X2NtZCwgZW52X2lkLCBlbnZfc3RhdGUsIGVudl9idXMsIGVudl9kZXYsIGVudl9mdW5jLCBOVUxMCisJfTsKKworCXNwcmludGYoZW52X2NtZCwgIlNQQVJfUEFSQUhPVFBMVUc9MSIpOworCXNwcmludGYoZW52X2lkLCAiU1BBUl9QQVJBSE9UUExVR19JRD0lZCIsIHJlcS0+aWQpOworCXNwcmludGYoZW52X3N0YXRlLCAiU1BBUl9QQVJBSE9UUExVR19TVEFURT0lZCIsCisJCWNtZC0+ZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZS5hY3RpdmUpOworCXNwcmludGYoZW52X2J1cywgIlNQQVJfUEFSQUhPVFBMVUdfQlVTPSVkIiwKKwkJY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmJ1c19ubyk7CisJc3ByaW50ZihlbnZfZGV2LCAiU1BBUl9QQVJBSE9UUExVR19ERVZJQ0U9JWQiLAorCQljbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vID4+IDMpOworCXNwcmludGYoZW52X2Z1bmMsICJTUEFSX1BBUkFIT1RQTFVHX0ZVTkNUSU9OPSVkIiwKKwkJY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmRldl9ubyAmIDB4Nyk7CisKKwlrb2JqZWN0X3VldmVudF9lbnYoJnZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UuZGV2LmtvYmosIEtPQkpfQ0hBTkdFLAorCQkJICAgZW52cCk7Cit9CisKKy8qKgorICogcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlKCkgLSBlbmFibGVzIG9yIGRpc2FibGVzIGEgUENJIGRldmljZSBieSBraWNraW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiBhIHVkZXYgc2NyaXB0CisgKiBAaW5tc2c6IHRoZSBtZXNzYWdlIGluZGljYXRpbmcgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZQorICovCitzdGF0aWMgdm9pZAorcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqaW5tc2cpCit7CisJc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QgKnJlcTsKKworCXJlcSA9IHBhcmFob3RwbHVnX3JlcXVlc3RfY3JlYXRlKGlubXNnKTsKKworCWlmICghcmVxKQorCQlyZXR1cm47CisKKwlpZiAoaW5tc2ctPmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlLmFjdGl2ZSkgeworCQkvKgorCQkgKiBGb3IgZW5hYmxlIG1lc3NhZ2VzLCBqdXN0IHJlc3BvbmQgd2l0aCBzdWNjZXNzCisJCSAqIHJpZ2h0IGF3YXkuIFRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrLCBidXQgdGhlcmUgYXJlCisJCSAqIGlzc3VlcyB3aXRoIHRoZSBlYXJseSBlbmFibGUgbWVzc2FnZXMgd2UgZ2V0ICh3aXRoCisJCSAqIGVpdGhlciB0aGUgdWRldiBzY3JpcHQgbm90IGRldGVjdGluZyB0aGF0IHRoZSBkZXZpY2UKKwkJICogaXMgdXAsIG9yIG5vdCBnZXR0aW5nIGNhbGxlZCBhdCBhbGwpLiBGb3J0dW5hdGVseQorCQkgKiB0aGUgbWVzc2FnZXMgdGhhdCBnZXQgbG9zdCBkb24ndCBtYXR0ZXIgYW55d2F5LCBhcworCQkgKgorCQkgKiBkZXZpY2VzIGFyZSBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgYXQKKwkJICogaW5pdGlhbGl6YXRpb24uCisJCSovCisJCXBhcmFob3RwbHVnX3JlcXVlc3Rfa2lja29mZihyZXEpOworCQljb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlCisJCQkoJmlubXNnLT5oZHIsCisJCQkgQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUywKKwkJCSBpbm1zZy0+Y21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUpOworCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2Rlc3Ryb3kocmVxKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBGb3IgZGlzYWJsZSBtZXNzYWdlcywgYWRkIHRoZSByZXF1ZXN0IHRvIHRoZQorCQkgKiByZXF1ZXN0IGxpc3QgYmVmb3JlIGtpY2tpbmcgb2ZmIHRoZSB1ZGV2IHNjcmlwdC4gSXQKKwkJICogd29uJ3QgZ2V0IHJlc3BvbmRlZCB0byB1bnRpbCB0aGUgc2NyaXB0IGhhcworCQkgKiBpbmRpY2F0ZWQgaXQncyBkb25lLgorCQkgKi8KKwkJc3Bpbl9sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisJCWxpc3RfYWRkX3RhaWwoJnJlcS0+bGlzdCwgJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCk7CisJCXNwaW5fdW5sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisKKwkJcGFyYWhvdHBsdWdfcmVxdWVzdF9raWNrb2ZmKHJlcSk7CisJfQorfQorCisvKioKKyAqIHZpc29yY2hpcHNldF9jaGlwc2V0X3JlYWR5KCkgLSBzZW5kcyBjaGlwc2V0X3JlYWR5IGFjdGlvbgorICoKKyAqIFNlbmQgQUNUSU9OPW9ubGluZSBmb3IgREVWUEFUSD0vc3lzL2RldmljZXMvcGxhdGZvcm0vdmlzb3JjaGlwc2V0LgorICoKKyAqIFJldHVybjogQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUwogICovCiBzdGF0aWMgaW50CiB2aXNvcmNoaXBzZXRfY2hpcHNldF9yZWFkeSh2b2lkKQpAQCAtMTM5Myw4ICsxNDU3LDEyIEBACiAJcmV0dXJuIENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CiB9CiAKLS8qICBTZW5kIEFDVElPTj1vZmZsaW5lIGZvciBERVZQQVRIPS9zeXMvZGV2aWNlcy9wbGF0Zm9ybS92aXNvcmNoaXBzZXQuCi0gKiAgUmV0dXJucyBDT05UUk9MVk1fUkVTUF94eHggY29kZS4KKy8qKgorICogdmlzb3JjaGlwc2V0X2NoaXBzZXRfbm90cmVhZHkoKSAtIHNlbmRzIGNoaXBzZXRfbm90cmVhZHkgYWN0aW9uCisgKgorICogU2VuZCBBQ1RJT049b2ZmbGluZSBmb3IgREVWUEFUSD0vc3lzL2RldmljZXMvcGxhdGZvcm0vdmlzb3JjaGlwc2V0LgorICoKKyAqIFJldHVybjogQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUwogICovCiBzdGF0aWMgaW50CiB2aXNvcmNoaXBzZXRfY2hpcHNldF9ub3RyZWFkeSh2b2lkKQpAQCAtMTQzNiwzMzggKzE1MDQsNiBAQAogCQljb250cm9sdm1fcmVzcG9uZChtc2dfaGRyLCByYyk7CiB9CiAKLS8qIFRoaXMgaXMgeW91ciAib25lLXN0b3AiIHNob3AgZm9yIGdyYWJiaW5nIHRoZSBuZXh0IG1lc3NhZ2UgZnJvbSB0aGUKLSAqIENPTlRST0xWTV9RVUVVRV9FVkVOVCBxdWV1ZSBpbiB0aGUgY29udHJvbHZtIGNoYW5uZWwuCi0gKi8KLXN0YXRpYyBib29sCi1yZWFkX2NvbnRyb2x2bV9ldmVudChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgKm1zZykKLXsKLQlpZiAodmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShjb250cm9sdm1fY2hhbm5lbCwKLQkJCQkgICAgICBDT05UUk9MVk1fUVVFVUVfRVZFTlQsIG1zZykpIHsKLQkJLyogZ290IGEgbWVzc2FnZSAqLwotCQlpZiAobXNnLT5oZHIuZmxhZ3MudGVzdF9tZXNzYWdlID09IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qCi0gKiBUaGUgZ2VuZXJhbCBwYXJhaG90cGx1ZyBmbG93IHdvcmtzIGFzIGZvbGxvd3MuICBUaGUgdmlzb3JjaGlwc2V0Ci0gKiBkcml2ZXIgcmVjZWl2ZXMgYSBERVZJQ0VfQ0hBTkdFU1RBVEUgbWVzc2FnZSBmcm9tIENvbW1hbmQKLSAqIHNwZWNpZnlpbmcgYSBwaHlzaWNhbCBkZXZpY2UgdG8gZW5hYmxlIG9yIGRpc2FibGUuICBUaGUgQ09OVFJPTFZNCi0gKiBtZXNzYWdlIGhhbmRsZXIgY2FsbHMgcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlLCB3aGljaCB0aGVuIGFkZHMKLSAqIHRoZSBtZXNzYWdlIHRvIGEgZ2xvYmFsIGxpc3QgYW5kIGtpY2tzIG9mZiBhIHVkZXYgZXZlbnQgd2hpY2gKLSAqIGNhdXNlcyBhIHVzZXIgbGV2ZWwgc2NyaXB0IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzcGVjaWZpZWQKLSAqIGRldmljZS4gIFRoZSB1ZGV2IHNjcmlwdCB0aGVuIHdyaXRlcyB0bwotICogL3Byb2Mvdmlzb3JjaGlwc2V0L3BhcmFob3RwbHVnLCB3aGljaCBjYXVzZXMgcGFyYWhvdHBsdWdfcHJvY193cml0ZQotICogdG8gZ2V0IGNhbGxlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIGFwcHJvcHJpYXRlIENPTlRST0xWTSBtZXNzYWdlIGlzCi0gKiByZXRyaWV2ZWQgZnJvbSB0aGUgbGlzdCBhbmQgcmVzcG9uZGVkIHRvLgotICovCi0KLSNkZWZpbmUgUEFSQUhPVFBMVUdfVElNRU9VVF9NUyAyMDAwCi0KLS8qCi0gKiBHZW5lcmF0ZSB1bmlxdWUgaW50IHRvIG1hdGNoIGFuIG91dHN0YW5kaW5nIENPTlRST0xWTSBtZXNzYWdlIHdpdGggYQotICogdWRldiBzY3JpcHQgL3Byb2MgcmVzcG9uc2UKLSAqLwotc3RhdGljIGludAotcGFyYWhvdHBsdWdfbmV4dF9pZCh2b2lkKQotewotCXN0YXRpYyBhdG9taWNfdCBpZCA9IEFUT01JQ19JTklUKDApOwotCi0JcmV0dXJuIGF0b21pY19pbmNfcmV0dXJuKCZpZCk7Ci19Ci0KLS8qCi0gKiBSZXR1cm5zIHRoZSB0aW1lIChpbiBqaWZmaWVzKSB3aGVuIGEgQ09OVFJPTFZNIG1lc3NhZ2Ugb24gdGhlIGxpc3QKLSAqIHNob3VsZCBleHBpcmUgLS0gUEFSQUhPVFBMVUdfVElNRU9VVF9NUyBpbiB0aGUgZnV0dXJlCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1wYXJhaG90cGx1Z19uZXh0X2V4cGlyYXRpb24odm9pZCkKLXsKLQlyZXR1cm4gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoUEFSQUhPVFBMVUdfVElNRU9VVF9NUyk7Ci19Ci0KLS8qCi0gKiBDcmVhdGUgYSBwYXJhaG90cGx1Z19yZXF1ZXN0LCB3aGljaCBpcyBiYXNpY2FsbHkgYSB3cmFwcGVyIGZvciBhCi0gKiBDT05UUk9MVk1fTUVTU0FHRSB0aGF0IHdlIGNhbiBzdGljayBvbiBhIGxpc3QKLSAqLwotc3RhdGljIHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICoKLXBhcmFob3RwbHVnX3JlcXVlc3RfY3JlYXRlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqbXNnKQotewotCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXE7Ci0KLQlyZXEgPSBrbWFsbG9jKHNpemVvZigqcmVxKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOwotCWlmICghcmVxKQotCQlyZXR1cm4gTlVMTDsKLQotCXJlcS0+aWQgPSBwYXJhaG90cGx1Z19uZXh0X2lkKCk7Ci0JcmVxLT5leHBpcmF0aW9uID0gcGFyYWhvdHBsdWdfbmV4dF9leHBpcmF0aW9uKCk7Ci0JcmVxLT5tc2cgPSAqbXNnOwotCi0JcmV0dXJuIHJlcTsKLX0KLQotLyoKLSAqIEZyZWUgYSBwYXJhaG90cGx1Z19yZXF1ZXN0LgotICovCi1zdGF0aWMgdm9pZAotcGFyYWhvdHBsdWdfcmVxdWVzdF9kZXN0cm95KHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEpCi17Ci0Ja2ZyZWUocmVxKTsKLX0KLQotLyoKLSAqIENhdXNlIHVldmVudCB0byBydW4gdGhlIHVzZXIgbGV2ZWwgc2NyaXB0IHRvIGRvIHRoZSBkaXNhYmxlL2VuYWJsZQotICogc3BlY2lmaWVkIGluICh0aGUgQ09OVFJPTFZNIG1lc3NhZ2UgaW4pIHRoZSBzcGVjaWZpZWQKLSAqIHBhcmFob3RwbHVnX3JlcXVlc3QKLSAqLwotc3RhdGljIHZvaWQKLXBhcmFob3RwbHVnX3JlcXVlc3Rfa2lja29mZihzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxKQotewotCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9wYWNrZXQgKmNtZCA9ICZyZXEtPm1zZy5jbWQ7Ci0JY2hhciBlbnZfY21kWzQwXSwgZW52X2lkWzQwXSwgZW52X3N0YXRlWzQwXSwgZW52X2J1c1s0MF0sIGVudl9kZXZbNDBdLAotCSAgICBlbnZfZnVuY1s0MF07Ci0JY2hhciAqZW52cFtdID0gewotCQllbnZfY21kLCBlbnZfaWQsIGVudl9zdGF0ZSwgZW52X2J1cywgZW52X2RldiwgZW52X2Z1bmMsIE5VTEwKLQl9OwotCi0Jc3ByaW50ZihlbnZfY21kLCAiU1BBUl9QQVJBSE9UUExVRz0xIik7Ci0Jc3ByaW50ZihlbnZfaWQsICJTUEFSX1BBUkFIT1RQTFVHX0lEPSVkIiwgcmVxLT5pZCk7Ci0Jc3ByaW50ZihlbnZfc3RhdGUsICJTUEFSX1BBUkFIT1RQTFVHX1NUQVRFPSVkIiwKLQkJY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlLmFjdGl2ZSk7Ci0Jc3ByaW50ZihlbnZfYnVzLCAiU1BBUl9QQVJBSE9UUExVR19CVVM9JWQiLAotCQljbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuYnVzX25vKTsKLQlzcHJpbnRmKGVudl9kZXYsICJTUEFSX1BBUkFIT1RQTFVHX0RFVklDRT0lZCIsCi0JCWNtZC0+ZGV2aWNlX2NoYW5nZV9zdGF0ZS5kZXZfbm8gPj4gMyk7Ci0Jc3ByaW50ZihlbnZfZnVuYywgIlNQQVJfUEFSQUhPVFBMVUdfRlVOQ1RJT049JWQiLAotCQljbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vICYgMHg3KTsKLQotCWtvYmplY3RfdWV2ZW50X2Vudigmdmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZS5kZXYua29iaiwgS09CSl9DSEFOR0UsCi0JCQkgICBlbnZwKTsKLX0KLQotLyoKLSAqIFJlbW92ZSBhbnkgcmVxdWVzdCBmcm9tIHRoZSBsaXN0IHRoYXQncyBiZWVuIG9uIHRoZXJlIHRvbyBsb25nIGFuZAotICogcmVzcG9uZCB3aXRoIGFuIGVycm9yLgotICovCi1zdGF0aWMgdm9pZAotcGFyYWhvdHBsdWdfcHJvY2Vzc19saXN0KHZvaWQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKLQotCXNwaW5fbG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0KSB7Ci0JCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEgPQotCQkgICAgbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0LCBsaXN0KTsKLQotCQlpZiAoIXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcmVxLT5leHBpcmF0aW9uKSkKLQkJCWNvbnRpbnVlOwotCi0JCWxpc3RfZGVsKHBvcyk7Ci0JCWlmIChyZXEtPm1zZy5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCi0JCQljb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlKAotCQkJCSZyZXEtPm1zZy5oZHIsCi0JCQkJQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX1VERVZfVElNRU9VVCwKLQkJCQlyZXEtPm1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSk7Ci0JCXBhcmFob3RwbHVnX3JlcXVlc3RfZGVzdHJveShyZXEpOwotCX0KLQotCXNwaW5fdW5sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7Ci19Ci0KLS8qCi0gKiBDYWxsZWQgZnJvbSB0aGUgL3Byb2MgaGFuZGxlciwgd2hpY2ggbWVhbnMgdGhlIHVzZXIgc2NyaXB0IGhhcwotICogZmluaXNoZWQgdGhlIGVuYWJsZS9kaXNhYmxlLiAgRmluZCB0aGUgbWF0Y2hpbmcgaWRlbnRpZmllciwgYW5kCi0gKiByZXNwb25kIHRvIHRoZSBDT05UUk9MVk0gbWVzc2FnZSB3aXRoIHN1Y2Nlc3MuCi0gKi8KLXN0YXRpYyBpbnQKLXBhcmFob3RwbHVnX3JlcXVlc3RfY29tcGxldGUoaW50IGlkLCB1MTYgYWN0aXZlKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7Ci0KLQlzcGluX2xvY2soJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKLQotCS8qIExvb2sgZm9yIGEgcmVxdWVzdCBtYXRjaGluZyAiaWQiLiAqLwotCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcCwgJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCkgewotCQlzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxID0KLQkJICAgIGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCwgbGlzdCk7Ci0JCWlmIChyZXEtPmlkID09IGlkKSB7Ci0JCQkvKiBGb3VuZCBhIG1hdGNoLiAgUmVtb3ZlIGl0IGZyb20gdGhlIGxpc3QgYW5kCi0JCQkgKiByZXNwb25kLgotCQkJICovCi0JCQlsaXN0X2RlbChwb3MpOwotCQkJc3Bpbl91bmxvY2soJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKLQkJCXJlcS0+bXNnLmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlLmFjdGl2ZSA9IGFjdGl2ZTsKLQkJCWlmIChyZXEtPm1zZy5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCi0JCQkJY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZSgKLQkJCQkJJnJlcS0+bXNnLmhkciwgQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUywKLQkJCQkJcmVxLT5tc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUpOwotCQkJcGFyYWhvdHBsdWdfcmVxdWVzdF9kZXN0cm95KHJlcSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qCi0gKiBFbmFibGVzIG9yIGRpc2FibGVzIGEgUENJIGRldmljZSBieSBraWNraW5nIG9mZiBhIHVkZXYgc2NyaXB0Ci0gKi8KLXN0YXRpYyB2b2lkCi1wYXJhaG90cGx1Z19wcm9jZXNzX21lc3NhZ2Uoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlICppbm1zZykKLXsKLQlzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxOwotCi0JcmVxID0gcGFyYWhvdHBsdWdfcmVxdWVzdF9jcmVhdGUoaW5tc2cpOwotCi0JaWYgKCFyZXEpCi0JCXJldHVybjsKLQotCWlmIChpbm1zZy0+Y21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUuYWN0aXZlKSB7Ci0JCS8qIEZvciBlbmFibGUgbWVzc2FnZXMsIGp1c3QgcmVzcG9uZCB3aXRoIHN1Y2Nlc3MKLQkJKiByaWdodCBhd2F5LiAgVGhpcyBpcyBhIGJpdCBvZiBhIGhhY2ssIGJ1dCB0aGVyZSBhcmUKLQkJKiBpc3N1ZXMgd2l0aCB0aGUgZWFybHkgZW5hYmxlIG1lc3NhZ2VzIHdlIGdldCAod2l0aAotCQkqIGVpdGhlciB0aGUgdWRldiBzY3JpcHQgbm90IGRldGVjdGluZyB0aGF0IHRoZSBkZXZpY2UKLQkJKiBpcyB1cCwgb3Igbm90IGdldHRpbmcgY2FsbGVkIGF0IGFsbCkuICBGb3J0dW5hdGVseQotCQkqIHRoZSBtZXNzYWdlcyB0aGF0IGdldCBsb3N0IGRvbid0IG1hdHRlciBhbnl3YXksIGFzCi0JCSogZGV2aWNlcyBhcmUgYXV0b21hdGljYWxseSBlbmFibGVkIGF0Ci0JCSogaW5pdGlhbGl6YXRpb24uCi0JCSovCi0JCXBhcmFob3RwbHVnX3JlcXVlc3Rfa2lja29mZihyZXEpOwotCQljb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlCi0JCQkoJmlubXNnLT5oZHIsCi0JCQkgQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUywKLQkJCSBpbm1zZy0+Y21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUpOwotCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2Rlc3Ryb3kocmVxKTsKLQl9IGVsc2UgewotCQkvKiBGb3IgZGlzYWJsZSBtZXNzYWdlcywgYWRkIHRoZSByZXF1ZXN0IHRvIHRoZQotCQkqIHJlcXVlc3QgbGlzdCBiZWZvcmUga2lja2luZyBvZmYgdGhlIHVkZXYgc2NyaXB0LiAgSXQKLQkJKiB3b24ndCBnZXQgcmVzcG9uZGVkIHRvIHVudGlsIHRoZSBzY3JpcHQgaGFzCi0JCSogaW5kaWNhdGVkIGl0J3MgZG9uZS4KLQkJKi8KLQkJc3Bpbl9sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7Ci0JCWxpc3RfYWRkX3RhaWwoJnJlcS0+bGlzdCwgJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCk7Ci0JCXNwaW5fdW5sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7Ci0KLQkJcGFyYWhvdHBsdWdfcmVxdWVzdF9raWNrb2ZmKHJlcSk7Ci0JfQotfQotCi0vKiBQcm9jZXNzIGEgY29udHJvbHZtIG1lc3NhZ2UuCi0gKiBSZXR1cm4gcmVzdWx0OgotICogICAgZmFsc2UgLSB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIG9ubHkgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlCi0gKiAgICAgICAgICAgIGNvbnRyb2x2bSBtZXNzYWdlIHdhcyBOT1QgcHJvY2Vzc2VkLCBidXQgcHJvY2Vzc2luZyBtdXN0IGJlCi0gKiAgICAgICAgICAgIHJldHJpZWQgYmVmb3JlIHJlYWRpbmcgdGhlIG5leHQgY29udHJvbHZtIG1lc3NhZ2U7IGEKLSAqICAgICAgICAgICAgc2NlbmFyaW8gd2hlcmUgdGhpcyBjYW4gb2NjdXIgaXMgd2hlbiB3ZSBuZWVkIHRvIHRocm90dGxlCi0gKiAgICAgICAgICAgIHRoZSBhbGxvY2F0aW9uIG9mIG1lbW9yeSBpbiB3aGljaCB0byBjb3B5IG91dCBjb250cm9sdm0KLSAqICAgICAgICAgICAgcGF5bG9hZCBkYXRhCi0gKiAgICB0cnVlICAtIHByb2Nlc3Npbmcgb2YgdGhlIGNvbnRyb2x2bSBtZXNzYWdlIGNvbXBsZXRlZCwKLSAqICAgICAgICAgICAgZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGFuIGVycm9yLgotICovCi1zdGF0aWMgYm9vbAotaGFuZGxlX2NvbW1hbmQoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIGlubXNnLCB1NjQgY2hhbm5lbF9hZGRyKQotewotCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9wYWNrZXQgKmNtZCA9ICZpbm1zZy5jbWQ7Ci0JdTY0IHBhcm1fYWRkcjsKLQl1MzIgcGFybV9ieXRlczsKLQlzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKnBhcnNlcl9jdHggPSBOVUxMOwotCWJvb2wgbG9jYWxfYWRkcjsKLQlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgYWNrbXNnOwotCi0JLyogY3JlYXRlIHBhcnNpbmcgY29udGV4dCBpZiBuZWNlc3NhcnkgKi8KLQlsb2NhbF9hZGRyID0gKGlubXNnLmhkci5mbGFncy50ZXN0X21lc3NhZ2UgPT0gMSk7Ci0JaWYgKGNoYW5uZWxfYWRkciA9PSAwKQotCQlyZXR1cm4gdHJ1ZTsKLQlwYXJtX2FkZHIgPSBjaGFubmVsX2FkZHIgKyBpbm1zZy5oZHIucGF5bG9hZF92bV9vZmZzZXQ7Ci0JcGFybV9ieXRlcyA9IGlubXNnLmhkci5wYXlsb2FkX2J5dGVzOwotCi0JLyogUGFyYW1ldGVyIGFuZCBjaGFubmVsIGFkZHJlc3NlcyB3aXRoaW4gdGVzdCBtZXNzYWdlcyBhY3R1YWxseSBsaWUKLQkgKiB3aXRoaW4gb3VyIE9TLWNvbnRyb2xsZWQgbWVtb3J5LiAgV2UgbmVlZCB0byBrbm93IHRoYXQsIGJlY2F1c2UgaXQKLQkgKiBtYWtlcyBhIGRpZmZlcmVuY2UgaW4gaG93IHdlIGNvbXB1dGUgdGhlIHZpcnR1YWwgYWRkcmVzcy4KLQkgKi8KLQlpZiAocGFybV9hZGRyICYmIHBhcm1fYnl0ZXMpIHsKLQkJYm9vbCByZXRyeSA9IGZhbHNlOwotCi0JCXBhcnNlcl9jdHggPQotCQkgICAgcGFyc2VyX2luaXRfYnl0ZV9zdHJlYW0ocGFybV9hZGRyLCBwYXJtX2J5dGVzLAotCQkJCQkgICAgbG9jYWxfYWRkciwgJnJldHJ5KTsKLQkJaWYgKCFwYXJzZXJfY3R4ICYmIHJldHJ5KQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCWlmICghbG9jYWxfYWRkcikgewotCQljb250cm9sdm1faW5pdF9yZXNwb25zZSgmYWNrbXNnLCAmaW5tc2cuaGRyLAotCQkJCQlDT05UUk9MVk1fUkVTUF9TVUNDRVNTKTsKLQkJaWYgKGNvbnRyb2x2bV9jaGFubmVsKQotCQkJdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKLQkJCQkJCSAgQ09OVFJPTFZNX1FVRVVFX0FDSywKLQkJCQkJCSAgJmFja21zZyk7Ci0JfQotCXN3aXRjaCAoaW5tc2cuaGRyLmlkKSB7Ci0JY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9JTklUOgotCQljaGlwc2V0X2luaXQoJmlubXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBDT05UUk9MVk1fQlVTX0NSRUFURToKLQkJYnVzX2NyZWF0ZSgmaW5tc2cpOwotCQlicmVhazsKLQljYXNlIENPTlRST0xWTV9CVVNfREVTVFJPWToKLQkJYnVzX2Rlc3Ryb3koJmlubXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBDT05UUk9MVk1fQlVTX0NPTkZJR1VSRToKLQkJYnVzX2NvbmZpZ3VyZSgmaW5tc2csIHBhcnNlcl9jdHgpOwotCQlicmVhazsKLQljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFOgotCQlteV9kZXZpY2VfY3JlYXRlKCZpbm1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURToKLQkJaWYgKGNtZC0+ZGV2aWNlX2NoYW5nZV9zdGF0ZS5mbGFncy5waHlzX2RldmljZSkgewotCQkJcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlKCZpbm1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBzYXZlIHRoZSBoZHIgYW5kIGNtZCBzdHJ1Y3R1cmVzIGZvciBsYXRlciB1c2UgKi8KLQkJCS8qIHdoZW4gc2VuZGluZyBiYWNrIHRoZSByZXNwb25zZSB0byBDb21tYW5kICovCi0JCQlteV9kZXZpY2VfY2hhbmdlc3RhdGUoJmlubXNnKTsKLQkJCWdfZGV2aWNlY2hhbmdlc3RhdGVfcGFja2V0ID0gaW5tc2cuY21kOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDT05UUk9MVk1fREVWSUNFX0RFU1RST1k6Ci0JCW15X2RldmljZV9kZXN0cm95KCZpbm1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9DT05GSUdVUkU6Ci0JCS8qIG5vIG9wIGZvciBub3csIGp1c3Qgc2VuZCBhIHJlc3BvbmQgdGhhdCB3ZSBwYXNzZWQgKi8KLQkJaWYgKGlubXNnLmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCkKLQkJCWNvbnRyb2x2bV9yZXNwb25kKCZpbm1zZy5oZHIsIENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpOwotCQlicmVhazsKLQljYXNlIENPTlRST0xWTV9DSElQU0VUX1JFQURZOgotCQljaGlwc2V0X3JlYWR5KCZpbm1zZy5oZHIpOwotCQlicmVhazsKLQljYXNlIENPTlRST0xWTV9DSElQU0VUX1NFTEZURVNUOgotCQljaGlwc2V0X3NlbGZ0ZXN0KCZpbm1zZy5oZHIpOwotCQlicmVhazsKLQljYXNlIENPTlRST0xWTV9DSElQU0VUX1NUT1A6Ci0JCWNoaXBzZXRfbm90cmVhZHkoJmlubXNnLmhkcik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWlmIChpbm1zZy5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCi0JCQljb250cm9sdm1fcmVzcG9uZAotCQkJCSgmaW5tc2cuaGRyLAotCQkJCSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfTUVTU0FHRV9JRF9VTktOT1dOKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHBhcnNlcl9jdHgpIHsKLQkJcGFyc2VyX2RvbmUocGFyc2VyX2N0eCk7Ci0JCXBhcnNlcl9jdHggPSBOVUxMOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKIGlzc3VlX3ZtY2FsbF9pb19jb250cm9sdm1fYWRkcih1NjQgKmNvbnRyb2xfYWRkciwgdTMyICpjb250cm9sX2J5dGVzKQogewpAQCAtMTc5Niw3NiArMTUzMiw2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1jb250cm9sdm1fcGVyaW9kaWNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIGlubXNnOwotCWJvb2wgZ290X2NvbW1hbmQgPSBmYWxzZTsKLQlib29sIGhhbmRsZV9jb21tYW5kX2ZhaWxlZCA9IGZhbHNlOwotCi0JLyogbWFrZSBzdXJlIHZpc29yYnVzIHNlcnZlciBpcyByZWdpc3RlcmVkIGZvciBjb250cm9sdm0gY2FsbGJhY2tzICovCi0JaWYgKHZpc29yY2hpcHNldF92aXNvcmJ1c3JlZ3dhaXQgJiYgIXZpc29yYnVzcmVnaXN0ZXJlZCkKLQkJZ290byBjbGVhbnVwOwotCi0Jd2hpbGUgKHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoY29udHJvbHZtX2NoYW5uZWwsCi0JCQkJCSBDT05UUk9MVk1fUVVFVUVfUkVTUE9OU0UsCi0JCQkJCSAmaW5tc2cpKQotCQk7Ci0JaWYgKCFnb3RfY29tbWFuZCkgewotCQlpZiAoY29udHJvbHZtX3BlbmRpbmdfbXNnX3ZhbGlkKSB7Ci0JCQkvKiB3ZSB0aHJvdHRsZWQgcHJvY2Vzc2luZyBvZiBhIHByaW9yCi0JCQkqIG1zZywgc28gdHJ5IHRvIHByb2Nlc3MgaXQgYWdhaW4KLQkJCSogcmF0aGVyIHRoYW4gcmVhZGluZyBhIG5ldyBvbmUKLQkJCSovCi0JCQlpbm1zZyA9IGNvbnRyb2x2bV9wZW5kaW5nX21zZzsKLQkJCWNvbnRyb2x2bV9wZW5kaW5nX21zZ192YWxpZCA9IGZhbHNlOwotCQkJZ290X2NvbW1hbmQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJZ290X2NvbW1hbmQgPSByZWFkX2NvbnRyb2x2bV9ldmVudCgmaW5tc2cpOwotCQl9Ci0JfQotCi0JaGFuZGxlX2NvbW1hbmRfZmFpbGVkID0gZmFsc2U7Ci0Jd2hpbGUgKGdvdF9jb21tYW5kICYmICghaGFuZGxlX2NvbW1hbmRfZmFpbGVkKSkgewotCQltb3N0X3JlY2VudF9tZXNzYWdlX2ppZmZpZXMgPSBqaWZmaWVzOwotCQlpZiAoaGFuZGxlX2NvbW1hbmQoaW5tc2csCi0JCQkJICAgdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcgotCQkJCSAgIChjb250cm9sdm1fY2hhbm5lbCkpKQotCQkJZ290X2NvbW1hbmQgPSByZWFkX2NvbnRyb2x2bV9ldmVudCgmaW5tc2cpOwotCQllbHNlIHsKLQkJCS8qIHRoaXMgaXMgYSBzY2VuYXJpbyB3aGVyZSB0aHJvdHRsaW5nCi0JCQkqIGlzIHJlcXVpcmVkLCBidXQgcHJvYmFibHkgTk9UIGFuCi0JCQkqIGVycm9yLi4uOyB3ZSBzdGFzaCB0aGUgY3VycmVudAotCQkJKiBjb250cm9sdm0gbXNnIHNvIHdlIHdpbGwgYXR0ZW1wdCB0bwotCQkJKiByZXByb2Nlc3MgaXQgb24gb3VyIG5leHQgbG9vcAotCQkJKi8KLQkJCWhhbmRsZV9jb21tYW5kX2ZhaWxlZCA9IHRydWU7Ci0JCQljb250cm9sdm1fcGVuZGluZ19tc2cgPSBpbm1zZzsKLQkJCWNvbnRyb2x2bV9wZW5kaW5nX21zZ192YWxpZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKiBwYXJhaG90cGx1Z193b3JrZXIgKi8KLQlwYXJhaG90cGx1Z19wcm9jZXNzX2xpc3QoKTsKLQotY2xlYW51cDoKLQotCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsCi0JCSAgICAgICBtb3N0X3JlY2VudF9tZXNzYWdlX2ppZmZpZXMgKyAoSFogKiBNSU5fSURMRV9TRUNPTkRTKSkpIHsKLQkJLyogaXQncyBiZWVuIGxvbmdlciB0aGFuIE1JTl9JRExFX1NFQ09ORFMgc2luY2Ugd2UKLQkJKiBwcm9jZXNzZWQgb3VyIGxhc3QgY29udHJvbHZtIG1lc3NhZ2U7IHNsb3cgZG93biB0aGUKLQkJKiBwb2xsaW5nCi0JCSovCi0JCWlmIChwb2xsX2ppZmZpZXMgIT0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9TTE9XKQotCQkJcG9sbF9qaWZmaWVzID0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9TTE9XOwotCX0gZWxzZSB7Ci0JCWlmIChwb2xsX2ppZmZpZXMgIT0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9GQVNUKQotCQkJcG9sbF9qaWZmaWVzID0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9GQVNUOwotCX0KLQotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcGVyaW9kaWNfY29udHJvbHZtX3dvcmssIHBvbGxfamlmZmllcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCiBzZXR1cF9jcmFzaF9kZXZpY2VzX3dvcmtfcXVldWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBsb2NhbF9jcmFzaF9idXNfbXNnOwpAQCAtMTg3NCwxMyArMTU0MCw2IEBACiAJdTMyIGxvY2FsX2NyYXNoX21zZ19vZmZzZXQ7CiAJdTE2IGxvY2FsX2NyYXNoX21zZ19jb3VudDsKIAotCS8qIG1ha2Ugc3VyZSB2aXNvcmJ1cyBpcyByZWdpc3RlcmVkIGZvciBjb250cm9sdm0gY2FsbGJhY2tzICovCi0JaWYgKHZpc29yY2hpcHNldF92aXNvcmJ1c3JlZ3dhaXQgJiYgIXZpc29yYnVzcmVnaXN0ZXJlZCkgewotCQlwb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX1NMT1c7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcGVyaW9kaWNfY29udHJvbHZtX3dvcmssIHBvbGxfamlmZmllcyk7Ci0JCXJldHVybjsKLQl9Ci0KIAlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKIAkvKiBzZW5kIGluaXQgY2hpcHNldCBtc2cgKi8KQEAgLTE5NTgsNyArMTYxNyw3IEBACiAJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiB9CiAKLXN0YXRpYyB2b2lkCit2b2lkCiBidXNfY3JlYXRlX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmJ1c19pbmZvLCBpbnQgcmVzcG9uc2UpCiB7CiAJaWYgKHJlc3BvbnNlID49IDApCkBAIC0xOTcxLDcgKzE2MzAsNyBAQAogCWJ1c19pbmZvLT5wZW5kaW5nX21zZ19oZHIgPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZAordm9pZAogYnVzX2Rlc3Ryb3lfcmVzcG9uc2Uoc3RydWN0IHZpc29yX2RldmljZSAqYnVzX2luZm8sIGludCByZXNwb25zZSkKIHsKIAlidXNfcmVzcG9uZGVyKENPTlRST0xWTV9CVVNfREVTVFJPWSwgYnVzX2luZm8tPnBlbmRpbmdfbXNnX2hkciwKQEAgLTE5ODEsNyArMTY0MCw3IEBACiAJYnVzX2luZm8tPnBlbmRpbmdfbXNnX2hkciA9IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkCit2b2lkCiBkZXZpY2VfY3JlYXRlX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvLCBpbnQgcmVzcG9uc2UpCiB7CiAJaWYgKHJlc3BvbnNlID49IDApCkBAIC0xOTk0LDcgKzE2NTMsNyBAQAogCWRldl9pbmZvLT5wZW5kaW5nX21zZ19oZHIgPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZAordm9pZAogZGV2aWNlX2Rlc3Ryb3lfcmVzcG9uc2Uoc3RydWN0IHZpc29yX2RldmljZSAqZGV2X2luZm8sIGludCByZXNwb25zZSkKIHsKIAlkZXZpY2VfcmVzcG9uZGVyKENPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSwgZGV2X2luZm8tPnBlbmRpbmdfbXNnX2hkciwKQEAgLTIwMDQsOSArMTY2Myw5IEBACiAJZGV2X2luZm8tPnBlbmRpbmdfbXNnX2hkciA9IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkCi12aXNvcmNoaXBzZXRfZGV2aWNlX3BhdXNlX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvLAotCQkJCSAgIGludCByZXNwb25zZSkKK3ZvaWQKK2RldmljZV9wYXVzZV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXZfaW5mbywKKwkJICAgICAgaW50IHJlc3BvbnNlKQogewogCWRldmljZV9jaGFuZ2VzdGF0ZV9yZXNwb25kZXIoQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSwKIAkJCQkgICAgIGRldl9pbmZvLCByZXNwb25zZSwKQEAgLTIwMTYsNyArMTY3NSw3IEBACiAJZGV2X2luZm8tPnBlbmRpbmdfbXNnX2hkciA9IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkCit2b2lkCiBkZXZpY2VfcmVzdW1lX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvLCBpbnQgcmVzcG9uc2UpCiB7CiAJZGV2aWNlX2NoYW5nZXN0YXRlX3Jlc3BvbmRlcihDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFLApAQCAtMjAyNyw0MCArMTY4Niw2IEBACiAJZGV2X2luZm8tPnBlbmRpbmdfbXNnX2hkciA9IE5VTEw7CiB9CiAKLS8qIFRoZSBwYXJhaG90cGx1Zy9kZXZpY2VkaXNhYmxlZCBpbnRlcmZhY2UgZ2V0cyBjYWxsZWQgYnkgb3VyIHN1cHBvcnQgc2NyaXB0Ci0gKiB3aGVuIGFuIFNSLUlPViBkZXZpY2UgaGFzIGJlZW4gc2h1dCBkb3duLiBUaGUgSUQgaXMgcGFzc2VkIHRvIHRoZSBzY3JpcHQKLSAqIGFuZCB0aGVuIHBhc3NlZCBiYWNrIHdoZW4gdGhlIGRldmljZSBoYXMgYmVlbiByZW1vdmVkLgotICovCi1zdGF0aWMgc3NpemVfdCBkZXZpY2VkaXNhYmxlZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQl1bnNpZ25lZCBpbnQgaWQ7Ci0KLQlpZiAoa3N0cnRvdWludChidWYsIDEwLCAmaWQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBhcmFob3RwbHVnX3JlcXVlc3RfY29tcGxldGUoaWQsIDApOwotCXJldHVybiBjb3VudDsKLX0KLQotLyogVGhlIHBhcmFob3RwbHVnL2RldmljZWVuYWJsZWQgaW50ZXJmYWNlIGdldHMgY2FsbGVkIGJ5IG91ciBzdXBwb3J0IHNjcmlwdAotICogd2hlbiBhbiBTUi1JT1YgZGV2aWNlIGhhcyBiZWVuIHJlY292ZXJlZC4gVGhlIElEIGlzIHBhc3NlZCB0byB0aGUgc2NyaXB0Ci0gKiBhbmQgdGhlbiBwYXNzZWQgYmFjayB3aGVuIHRoZSBkZXZpY2UgaGFzIGJlZW4gYnJvdWdodCBiYWNrIHVwLgotICovCi1zdGF0aWMgc3NpemVfdCBkZXZpY2VlbmFibGVkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQl1bnNpZ25lZCBpbnQgaWQ7Ci0KLQlpZiAoa3N0cnRvdWludChidWYsIDEwLCAmaWQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBhcmFob3RwbHVnX3JlcXVlc3RfY29tcGxldGUoaWQsIDEpOwotCXJldHVybiBjb3VudDsKLX0KLQogc3RhdGljIGludAogdmlzb3JjaGlwc2V0X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewpAQCAtMjE5MSw2ICsxODE2LDI5OCBAQAogCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihtYWpvcl9kZXYsIDEpOwogfQogCitzdGF0aWMgc3RydWN0IHBhcnNlcl9jb250ZXh0ICoKK3BhcnNlcl9pbml0X2J5dGVfc3RyZWFtKHU2NCBhZGRyLCB1MzIgYnl0ZXMsIGJvb2wgbG9jYWwsIGJvb2wgKnJldHJ5KQoreworCWludCBhbGxvY2J5dGVzID0gc2l6ZW9mKHN0cnVjdCBwYXJzZXJfY29udGV4dCkgKyBieXRlczsKKwlzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKmN0eDsKKworCWlmIChyZXRyeSkKKwkJKnJldHJ5ID0gZmFsc2U7CisKKwkvKgorCSAqIGFsbG9jIGFuIDAgZXh0cmEgYnl0ZSB0byBlbnN1cmUgcGF5bG9hZCBpcworCSAqICdcMCctdGVybWluYXRlZAorCSAqLworCWFsbG9jYnl0ZXMrKzsKKwlpZiAoKGNvbnRyb2x2bV9wYXlsb2FkX2J5dGVzX2J1ZmZlcmVkICsgYnl0ZXMpCisJICAgID4gTUFYX0NPTlRST0xWTV9QQVlMT0FEX0JZVEVTKSB7CisJCWlmIChyZXRyeSkKKwkJCSpyZXRyeSA9IHRydWU7CisJCXJldHVybiBOVUxMOworCX0KKwljdHggPSBremFsbG9jKGFsbG9jYnl0ZXMsIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAoIWN0eCkgeworCQlpZiAocmV0cnkpCisJCQkqcmV0cnkgPSB0cnVlOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljdHgtPmFsbG9jYnl0ZXMgPSBhbGxvY2J5dGVzOworCWN0eC0+cGFyYW1fYnl0ZXMgPSBieXRlczsKKwljdHgtPmN1cnIgPSBOVUxMOworCWN0eC0+Ynl0ZXNfcmVtYWluaW5nID0gMDsKKwljdHgtPmJ5dGVfc3RyZWFtID0gZmFsc2U7CisJaWYgKGxvY2FsKSB7CisJCXZvaWQgKnA7CisKKwkJaWYgKGFkZHIgPiB2aXJ0X3RvX3BoeXMoaGlnaF9tZW1vcnkgLSAxKSkKKwkJCWdvdG8gZXJyX2ZpbmlzaF9jdHg7CisJCXAgPSBfX3ZhKCh1bnNpZ25lZCBsb25nKShhZGRyKSk7CisJCW1lbWNweShjdHgtPmRhdGEsIHAsIGJ5dGVzKTsKKwl9IGVsc2UgeworCQl2b2lkICptYXBwaW5nID0gbWVtcmVtYXAoYWRkciwgYnl0ZXMsIE1FTVJFTUFQX1dCKTsKKworCQlpZiAoIW1hcHBpbmcpCisJCQlnb3RvIGVycl9maW5pc2hfY3R4OworCQltZW1jcHkoY3R4LT5kYXRhLCBtYXBwaW5nLCBieXRlcyk7CisJCW1lbXVubWFwKG1hcHBpbmcpOworCX0KKworCWN0eC0+Ynl0ZV9zdHJlYW0gPSB0cnVlOworCWNvbnRyb2x2bV9wYXlsb2FkX2J5dGVzX2J1ZmZlcmVkICs9IGN0eC0+cGFyYW1fYnl0ZXM7CisKKwlyZXR1cm4gY3R4OworCitlcnJfZmluaXNoX2N0eDoKKwlwYXJzZXJfZG9uZShjdHgpOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIGhhbmRsZV9jb21tYW5kKCkgLSBwcm9jZXNzIGEgY29udHJvbHZtIG1lc3NhZ2UKKyAqIEBpbm1zZzogICAgICAgIHRoZSBtZXNzYWdlIHRvIHByb2Nlc3MKKyAqIEBjaGFubmVsX2FkZHI6IGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2x2bSBjaGFubmVsCisgKgorICogUmV0dXJuOgorICogICAgZmFsc2UgLSB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIG9ubHkgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlCisgKiAgICAgICAgICAgIGNvbnRyb2x2bSBtZXNzYWdlIHdhcyBOT1QgcHJvY2Vzc2VkLCBidXQgcHJvY2Vzc2luZyBtdXN0IGJlCisgKiAgICAgICAgICAgIHJldHJpZWQgYmVmb3JlIHJlYWRpbmcgdGhlIG5leHQgY29udHJvbHZtIG1lc3NhZ2U7IGEKKyAqICAgICAgICAgICAgc2NlbmFyaW8gd2hlcmUgdGhpcyBjYW4gb2NjdXIgaXMgd2hlbiB3ZSBuZWVkIHRvIHRocm90dGxlCisgKiAgICAgICAgICAgIHRoZSBhbGxvY2F0aW9uIG9mIG1lbW9yeSBpbiB3aGljaCB0byBjb3B5IG91dCBjb250cm9sdm0KKyAqICAgICAgICAgICAgcGF5bG9hZCBkYXRhCisgKiAgICB0cnVlICAtIHByb2Nlc3Npbmcgb2YgdGhlIGNvbnRyb2x2bSBtZXNzYWdlIGNvbXBsZXRlZCwKKyAqICAgICAgICAgICAgZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGFuIGVycm9yCisgKi8KK3N0YXRpYyBib29sCitoYW5kbGVfY29tbWFuZChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgaW5tc2csIHU2NCBjaGFubmVsX2FkZHIpCit7CisJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX3BhY2tldCAqY21kID0gJmlubXNnLmNtZDsKKwl1NjQgcGFybV9hZGRyOworCXUzMiBwYXJtX2J5dGVzOworCXN0cnVjdCBwYXJzZXJfY29udGV4dCAqcGFyc2VyX2N0eCA9IE5VTEw7CisJYm9vbCBsb2NhbF9hZGRyOworCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBhY2ttc2c7CisKKwkvKiBjcmVhdGUgcGFyc2luZyBjb250ZXh0IGlmIG5lY2Vzc2FyeSAqLworCWxvY2FsX2FkZHIgPSAoaW5tc2cuaGRyLmZsYWdzLnRlc3RfbWVzc2FnZSA9PSAxKTsKKwlpZiAoY2hhbm5lbF9hZGRyID09IDApCisJCXJldHVybiB0cnVlOworCXBhcm1fYWRkciA9IGNoYW5uZWxfYWRkciArIGlubXNnLmhkci5wYXlsb2FkX3ZtX29mZnNldDsKKwlwYXJtX2J5dGVzID0gaW5tc2cuaGRyLnBheWxvYWRfYnl0ZXM7CisKKwkvKgorCSAqIFBhcmFtZXRlciBhbmQgY2hhbm5lbCBhZGRyZXNzZXMgd2l0aGluIHRlc3QgbWVzc2FnZXMgYWN0dWFsbHkgbGllCisJICogd2l0aGluIG91ciBPUy1jb250cm9sbGVkIG1lbW9yeS4gV2UgbmVlZCB0byBrbm93IHRoYXQsIGJlY2F1c2UgaXQKKwkgKiBtYWtlcyBhIGRpZmZlcmVuY2UgaW4gaG93IHdlIGNvbXB1dGUgdGhlIHZpcnR1YWwgYWRkcmVzcy4KKwkgKi8KKwlpZiAocGFybV9hZGRyICYmIHBhcm1fYnl0ZXMpIHsKKwkJYm9vbCByZXRyeSA9IGZhbHNlOworCisJCXBhcnNlcl9jdHggPQorCQkgICAgcGFyc2VyX2luaXRfYnl0ZV9zdHJlYW0ocGFybV9hZGRyLCBwYXJtX2J5dGVzLAorCQkJCQkgICAgbG9jYWxfYWRkciwgJnJldHJ5KTsKKwkJaWYgKCFwYXJzZXJfY3R4ICYmIHJldHJ5KQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICghbG9jYWxfYWRkcikgeworCQljb250cm9sdm1faW5pdF9yZXNwb25zZSgmYWNrbXNnLCAmaW5tc2cuaGRyLAorCQkJCQlDT05UUk9MVk1fUkVTUF9TVUNDRVNTKTsKKwkJaWYgKGNvbnRyb2x2bV9jaGFubmVsKQorCQkJdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKKwkJCQkJCSAgQ09OVFJPTFZNX1FVRVVFX0FDSywKKwkJCQkJCSAgJmFja21zZyk7CisJfQorCXN3aXRjaCAoaW5tc2cuaGRyLmlkKSB7CisJY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9JTklUOgorCQljaGlwc2V0X2luaXQoJmlubXNnKTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fQlVTX0NSRUFURToKKwkJYnVzX2NyZWF0ZSgmaW5tc2cpOworCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9CVVNfREVTVFJPWToKKwkJYnVzX2Rlc3Ryb3koJmlubXNnKTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fQlVTX0NPTkZJR1VSRToKKwkJYnVzX2NvbmZpZ3VyZSgmaW5tc2csIHBhcnNlcl9jdHgpOworCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFOgorCQlteV9kZXZpY2VfY3JlYXRlKCZpbm1zZyk7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURToKKwkJaWYgKGNtZC0+ZGV2aWNlX2NoYW5nZV9zdGF0ZS5mbGFncy5waHlzX2RldmljZSkgeworCQkJcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlKCZpbm1zZyk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogc2F2ZSB0aGUgaGRyIGFuZCBjbWQgc3RydWN0dXJlcyBmb3IgbGF0ZXIgdXNlCisJCQkgKiB3aGVuIHNlbmRpbmcgYmFjayB0aGUgcmVzcG9uc2UgdG8gQ29tbWFuZAorCQkJICovCisJCQlteV9kZXZpY2VfY2hhbmdlc3RhdGUoJmlubXNnKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZOgorCQlteV9kZXZpY2VfZGVzdHJveSgmaW5tc2cpOworCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ09ORklHVVJFOgorCQkvKiBubyBvcCBmb3Igbm93LCBqdXN0IHNlbmQgYSByZXNwb25kIHRoYXQgd2UgcGFzc2VkICovCisJCWlmIChpbm1zZy5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCisJCQljb250cm9sdm1fcmVzcG9uZCgmaW5tc2cuaGRyLCBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9SRUFEWToKKwkJY2hpcHNldF9yZWFkeSgmaW5tc2cuaGRyKTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9TRUxGVEVTVDoKKwkJY2hpcHNldF9zZWxmdGVzdCgmaW5tc2cuaGRyKTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9TVE9QOgorCQljaGlwc2V0X25vdHJlYWR5KCZpbm1zZy5oZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoaW5tc2cuaGRyLmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkKQorCQkJY29udHJvbHZtX3Jlc3BvbmQKKwkJCQkoJmlubXNnLmhkciwKKwkJCQkgLUNPTlRST0xWTV9SRVNQX0VSUk9SX01FU1NBR0VfSURfVU5LTk9XTik7CisJCWJyZWFrOworCX0KKworCWlmIChwYXJzZXJfY3R4KSB7CisJCXBhcnNlcl9kb25lKHBhcnNlcl9jdHgpOworCQlwYXJzZXJfY3R4ID0gTlVMTDsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogcmVhZF9jb250cm9sdm1fZXZlbnQoKSAtIHJldHJlaXZlcyB0aGUgbmV4dCBtZXNzYWdlIGZyb20gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVFJPTFZNX1FVRVVFX0VWRU5UIHF1ZXVlIGluIHRoZSBjb250cm9sdm0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsCisgKiBAbXNnOiBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgbWVzc2FnZQorICoKKyAqIFJldHVybjogdHJ1ZSBpZiBhIHZhbGlkIG1lc3NhZ2Ugd2FzIHJldHJpZXZlZCBvciBmYWxzZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGJvb2wKK3JlYWRfY29udHJvbHZtX2V2ZW50KHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqbXNnKQoreworCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShjb250cm9sdm1fY2hhbm5lbCwKKwkJCQkgICAgICAgQ09OVFJPTFZNX1FVRVVFX0VWRU5ULCBtc2cpKSB7CisJCS8qIGdvdCBhIG1lc3NhZ2UgKi8KKwkJaWYgKG1zZy0+aGRyLmZsYWdzLnRlc3RfbWVzc2FnZSA9PSAxKQorCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIHBhcmFob3RwbHVnX3Byb2Nlc3NfbGlzdCgpIC0gcmVtb3ZlIGFueSByZXF1ZXN0IGZyb20gdGhlIGxpc3QgdGhhdCdzIGJlZW4gb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgdG9vIGxvbmcgYW5kIHJlc3BvbmQgd2l0aCBhbiBlcnJvcgorICovCitzdGF0aWMgdm9pZAorcGFyYWhvdHBsdWdfcHJvY2Vzc19saXN0KHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKworCXNwaW5fbG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0KSB7CisJCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEgPQorCQkgICAgbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0LCBsaXN0KTsKKworCQlpZiAoIXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcmVxLT5leHBpcmF0aW9uKSkKKwkJCWNvbnRpbnVlOworCisJCWxpc3RfZGVsKHBvcyk7CisJCWlmIChyZXEtPm1zZy5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCisJCQljb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlKAorCQkJCSZyZXEtPm1zZy5oZHIsCisJCQkJQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX1VERVZfVElNRU9VVCwKKwkJCQlyZXEtPm1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSk7CisJCXBhcmFob3RwbHVnX3JlcXVlc3RfZGVzdHJveShyZXEpOworCX0KKworCXNwaW5fdW5sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitjb250cm9sdm1fcGVyaW9kaWNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIGlubXNnOworCWJvb2wgZ290X2NvbW1hbmQgPSBmYWxzZTsKKwlib29sIGhhbmRsZV9jb21tYW5kX2ZhaWxlZCA9IGZhbHNlOworCisJd2hpbGUgKCF2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKGNvbnRyb2x2bV9jaGFubmVsLAorCQkJCQkgIENPTlRST0xWTV9RVUVVRV9SRVNQT05TRSwKKwkJCQkJICAmaW5tc2cpKQorCQk7CisJaWYgKCFnb3RfY29tbWFuZCkgeworCQlpZiAoY29udHJvbHZtX3BlbmRpbmdfbXNnX3ZhbGlkKSB7CisJCQkvKgorCQkJICogd2UgdGhyb3R0bGVkIHByb2Nlc3Npbmcgb2YgYSBwcmlvcgorCQkJICogbXNnLCBzbyB0cnkgdG8gcHJvY2VzcyBpdCBhZ2FpbgorCQkJICogcmF0aGVyIHRoYW4gcmVhZGluZyBhIG5ldyBvbmUKKwkJCSAqLworCQkJaW5tc2cgPSBjb250cm9sdm1fcGVuZGluZ19tc2c7CisJCQljb250cm9sdm1fcGVuZGluZ19tc2dfdmFsaWQgPSBmYWxzZTsKKwkJCWdvdF9jb21tYW5kID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCWdvdF9jb21tYW5kID0gcmVhZF9jb250cm9sdm1fZXZlbnQoJmlubXNnKTsKKwkJfQorCX0KKworCWhhbmRsZV9jb21tYW5kX2ZhaWxlZCA9IGZhbHNlOworCXdoaWxlIChnb3RfY29tbWFuZCAmJiAoIWhhbmRsZV9jb21tYW5kX2ZhaWxlZCkpIHsKKwkJbW9zdF9yZWNlbnRfbWVzc2FnZV9qaWZmaWVzID0gamlmZmllczsKKwkJaWYgKGhhbmRsZV9jb21tYW5kKGlubXNnLAorCQkJCSAgIHZpc29yY2hhbm5lbF9nZXRfcGh5c2FkZHIKKwkJCQkgICAoY29udHJvbHZtX2NoYW5uZWwpKSkKKwkJCWdvdF9jb21tYW5kID0gcmVhZF9jb250cm9sdm1fZXZlbnQoJmlubXNnKTsKKwkJZWxzZSB7CisJCQkvKgorCQkJICogdGhpcyBpcyBhIHNjZW5hcmlvIHdoZXJlIHRocm90dGxpbmcKKwkJCSAqIGlzIHJlcXVpcmVkLCBidXQgcHJvYmFibHkgTk9UIGFuCisJCQkgKiBlcnJvci4uLjsgd2Ugc3Rhc2ggdGhlIGN1cnJlbnQKKwkJCSAqIGNvbnRyb2x2bSBtc2cgc28gd2Ugd2lsbCBhdHRlbXB0IHRvCisJCQkgKiByZXByb2Nlc3MgaXQgb24gb3VyIG5leHQgbG9vcAorCQkJICovCisJCQloYW5kbGVfY29tbWFuZF9mYWlsZWQgPSB0cnVlOworCQkJY29udHJvbHZtX3BlbmRpbmdfbXNnID0gaW5tc2c7CisJCQljb250cm9sdm1fcGVuZGluZ19tc2dfdmFsaWQgPSB0cnVlOworCQl9CisJfQorCisJLyogcGFyYWhvdHBsdWdfd29ya2VyICovCisJcGFyYWhvdHBsdWdfcHJvY2Vzc19saXN0KCk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLAorCQkgICAgICAgbW9zdF9yZWNlbnRfbWVzc2FnZV9qaWZmaWVzICsgKEhaICogTUlOX0lETEVfU0VDT05EUykpKSB7CisJCS8qCisJCSAqIGl0J3MgYmVlbiBsb25nZXIgdGhhbiBNSU5fSURMRV9TRUNPTkRTIHNpbmNlIHdlCisJCSAqIHByb2Nlc3NlZCBvdXIgbGFzdCBjb250cm9sdm0gbWVzc2FnZTsgc2xvdyBkb3duIHRoZQorCQkgKiBwb2xsaW5nCisJCSAqLworCQlpZiAocG9sbF9qaWZmaWVzICE9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfU0xPVykKKwkJCXBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfU0xPVzsKKwl9IGVsc2UgeworCQlpZiAocG9sbF9qaWZmaWVzICE9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVCkKKwkJCXBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVDsKKwl9CisKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBlcmlvZGljX2NvbnRyb2x2bV93b3JrLCBwb2xsX2ppZmZpZXMpOworfQorCiBzdGF0aWMgaW50CiB2aXNvcmNoaXBzZXRfaW5pdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2aWNlKQogewpAQCAtMjIwMiw3ICsyMTE5LDYgQEAKIAlpZiAoIWFkZHIpCiAJCWdvdG8gZXJyb3I7CiAKLQltZW1zZXQoJmJ1c2Rldl9ub3RpZmllcnMsIDAsIHNpemVvZihidXNkZXZfbm90aWZpZXJzKSk7CiAJbWVtc2V0KCZjb250cm9sdm1fcGF5bG9hZF9pbmZvLCAwLCBzaXplb2YoY29udHJvbHZtX3BheWxvYWRfaW5mbykpOwogCiAJY29udHJvbHZtX2NoYW5uZWwgPSB2aXNvcmNoYW5uZWxfY3JlYXRlX3dpdGhfbG9jayhhZGRyLCAwLApAQCAtMjM0MSwxNSArMjI1NywxMCBAQAogbW9kdWxlX3BhcmFtX25hbWVkKG1ham9yLCB2aXNvcmNoaXBzZXRfbWFqb3IsIGludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKHZpc29yY2hpcHNldF9tYWpvciwKIAkJICJtYWpvciBkZXZpY2UgbnVtYmVyIHRvIHVzZSBmb3IgdGhlIGRldmljZSBub2RlIik7Ci1tb2R1bGVfcGFyYW1fbmFtZWQodmlzb3JidXNyZWd3YWl0LCB2aXNvcmNoaXBzZXRfdmlzb3JidXNyZWd3YWl0LCBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyh2aXNvcmNoaXBzZXRfdmlzb3JidXNyZWd3YWl0LAotCQkgIjEgdG8gaGF2ZSB0aGUgbW9kdWxlIHdhaXQgZm9yIHRoZSB2aXNvciBidXMgdG8gcmVnaXN0ZXIiKTsKIAogbW9kdWxlX2luaXQoaW5pdF91bmlzeXMpOwogbW9kdWxlX2V4aXQoZXhpdF91bmlzeXMpOwogCiBNT0RVTEVfQVVUSE9SKCJVbmlzeXMiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU3VwZXJ2aXNvciBjaGlwc2V0IGRyaXZlciBmb3Igc2VydmljZSBwYXJ0aXRpb246IHZlciAiCi0JCSAgIFZFUlNJT04pOwotTU9EVUxFX1ZFUlNJT04oVkVSU0lPTik7CitNT0RVTEVfREVTQ1JJUFRJT04oInMtUGFyIHZpc29yYnVzIGRyaXZlciBmb3IgdmlydHVhbCBkZXZpY2UgYnVzZXMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdm1jYWxsaW50ZXJmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3ZtY2FsbGludGVyZmFjZS5oCmluZGV4IGMwNDNmYTQuLjg2ZTY5NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdm1jYWxsaW50ZXJmYWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92bWNhbGxpbnRlcmZhY2UuaApAQCAtMjAsMTEgKzIwLDM5IEBACiAqIFZpcnR1YWxpemF0aW9uLiAgVGhlIFZNQ0FMTHMgYXJlIHByb3ZpZGVkIGJ5IE1vbml0b3IgYW5kIHVzZWQgYnkgSU8gY29kZQogKiBydW5uaW5nIG9uIElPIFBhcnRpdGlvbnMuCiAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitfX3VuaXN5c192bWNhbGxfZ251Yyh1bnNpZ25lZCBsb25nIHR1cGxlLCB1bnNpZ25lZCBsb25nIHJlZ19lYngsCisJCSAgICAgdW5zaWduZWQgbG9uZyByZWdfZWN4KQoreworCXVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpbnQgY3B1aWRfZWF4LCBjcHVpZF9lYngsIGNwdWlkX2VjeCwgY3B1aWRfZWR4OwogCi0jaWZkZWYgX19HTlVDX18KLSNpbmNsdWRlICJpb3ZtY2FsbF9nbnVjLmgiCi0jZW5kaWYJLyogICovCi0jaW5jbHVkZSAiZGlhZ2NoYW5uZWwuaCIKKwljcHVpZCgweDAwMDAwMDAxLCAmY3B1aWRfZWF4LCAmY3B1aWRfZWJ4LCAmY3B1aWRfZWN4LCAmY3B1aWRfZWR4KTsKKwlpZiAoIShjcHVpZF9lY3ggJiAweDgwMDAwMDAwKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCIuYnl0ZSAweDAwZiwgMHgwMDEsIDB4MGMxIiA6ICI9YSIocmVzdWx0KSA6CisJCSJhIih0dXBsZSksICJiIihyZWdfZWJ4KSwgImMiKHJlZ19lY3gpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK19fdW5pc3lzX2V4dGVuZGVkX3ZtY2FsbF9nbnVjKHVuc2lnbmVkIGxvbmcgbG9uZyB0dXBsZSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyByZWdfZWJ4LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHJlZ19lY3gsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgcmVnX2VkeCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IGNwdWlkX2VheCwgY3B1aWRfZWJ4LCBjcHVpZF9lY3gsIGNwdWlkX2VkeDsKKworCWNwdWlkKDB4MDAwMDAwMDEsICZjcHVpZF9lYXgsICZjcHVpZF9lYngsICZjcHVpZF9lY3gsICZjcHVpZF9lZHgpOworCWlmICghKGNwdWlkX2VjeCAmIDB4ODAwMDAwMDApKQorCQlyZXR1cm4gLUVQRVJNOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIi5ieXRlIDB4MDBmLCAweDAwMSwgMHgwYzEiIDogIj1hIihyZXN1bHQpIDoKKwkJImEiKHR1cGxlKSwgImIiKHJlZ19lYngpLCAiYyIocmVnX2VjeCksICJkIihyZWdfZWR4KSk7CisJcmV0dXJuIHJlc3VsdDsKK30KIAogI2lmZGVmIFZNQ0FMTF9JT19DT05UUk9MVk1fQUREUgogI3VuZGVmIFZNQ0FMTF9JT19DT05UUk9MVk1fQUREUgpAQCAtNTcsNyArODUsNiBAQAogI2RlZmluZSBWTUNBTExfU1VDQ0VTUyAwCiAjZGVmaW5lIFZNQ0FMTF9TVUNDRVNTRlVMKHJlc3VsdCkJKHJlc3VsdCA9PSAwKQogCi0jaWZkZWYgX19HTlVDX18KICNkZWZpbmUgdW5pc3lzX3ZtY2FsbCh0dXBsZSwgcmVnX2VieCwgcmVnX2VjeCkgXAogCV9fdW5pc3lzX3ZtY2FsbF9nbnVjKHR1cGxlLCByZWdfZWJ4LCByZWdfZWN4KQogI2RlZmluZSB1bmlzeXNfZXh0ZW5kZWRfdm1jYWxsKHR1cGxlLCByZWdfZWJ4LCByZWdfZWN4LCByZWdfZWR4KSBcCkBAIC03NCw3ICsxMDEsNiBAQAogI2RlZmluZSBJU1NVRV9JT19WTUNBTExfUE9TVENPREVfU0VWRVJJVFkocG9zdGNvZGUsIHNldmVyaXR5KQkJXAogCUlTU1VFX0lPX0VYVEVOREVEX1ZNQ0FMTChWTUNBTExfUE9TVF9DT0RFX0xPR0VWRU5ULCBzZXZlcml0eSwJXAogCQkJCSBNRFNfQVBQT1MsIHBvc3Rjb2RlKQotI2VuZGlmCiAKIC8qIFN0cnVjdHVyZXMgZm9yIElPIFZNQ0FMTHMgKi8KIApAQCAtODksNCArMTE1LDE1NiBAQAogCXU4IHVudXNlZFs0XTsJCS8qIFVudXNlZCBCeXRlcyBpbiB0aGUgNjQtQml0IEFsaWduZWQgU3RydWN0ICovCiB9IF9fcGFja2VkOwogCisvKioqKioqKiBJTkZPIE9OIElTU1VFX1BPU1RDT0RFX0xJTlVYKCkgQkVMT1cgKioqKioqKi8KK2VudW0gZHJpdmVyX3BjIHsJCS8qIFBPU1RDT0RFIGRyaXZlciBpZGVudGlmaWVyIHR1cGxlcyAqLworCS8qIHZpc29yY2hpcHNldCBkcml2ZXIgZmlsZXMgKi8KKwlWSVNPUl9DSElQU0VUX1BDID0gMHhBMCwKKwlWSVNPUl9DSElQU0VUX1BDX2NvbnRyb2x2bV9jID0gMHhBMSwKKwlWSVNPUl9DSElQU0VUX1BDX2NvbnRyb2x2bV9jbTIgPSAweEEyLAorCVZJU09SX0NISVBTRVRfUENfY29udHJvbHZtX2RpcmVjdF9jID0gMHhBMywKKwlWSVNPUl9DSElQU0VUX1BDX2ZpbGVfYyA9IDB4QTQsCisJVklTT1JfQ0hJUFNFVF9QQ19wYXJzZXJfYyA9IDB4QTUsCisJVklTT1JfQ0hJUFNFVF9QQ190ZXN0aW5nX2MgPSAweEE2LAorCVZJU09SX0NISVBTRVRfUENfdmlzb3JjaGlwc2V0X21haW5fYyA9IDB4QTcsCisJVklTT1JfQ0hJUFNFVF9QQ192aXNvcnN3aXRjaGJ1c19jID0gMHhBOCwKKwkvKiB2aXNvcmJ1cyBkcml2ZXIgZmlsZXMgKi8KKwlWSVNPUl9CVVNfUEMgPSAweEIwLAorCVZJU09SX0JVU19QQ19idXNpbnN0X2F0dHJfYyA9IDB4QjEsCisJVklTT1JfQlVTX1BDX2NoYW5uZWxfYXR0cl9jID0gMHhCMiwKKwlWSVNPUl9CVVNfUENfZGV2bWFqb3JtaW5vcl9hdHRyX2MgPSAweEIzLAorCVZJU09SX0JVU19QQ192aXNvcmJ1c19tYWluX2MgPSAweEI0LAorCS8qIHZpc29yY2xpZW50YnVzIGRyaXZlciBmaWxlcyAqLworCVZJU09SX0NMSUVOVF9CVVNfUEMgPSAweEMwLAorCVZJU09SX0NMSUVOVF9CVVNfUENfdmlzb3JjbGllbnRidXNfbWFpbl9jID0gMHhDMSwKKwkvKiB2aXJ0IGhiYSBkcml2ZXIgZmlsZXMgKi8KKwlWSVJUX0hCQV9QQyA9IDB4QzIsCisJVklSVF9IQkFfUENfdmlydGhiYV9jID0gMHhDMywKKwkvKiB2aXJ0cGNpIGRyaXZlciBmaWxlcyAqLworCVZJUlRfUENJX1BDID0gMHhDNCwKKwlWSVJUX1BDSV9QQ192aXJ0cGNpX2MgPSAweEM1LAorCS8qIHZpcnRuaWMgZHJpdmVyIGZpbGVzICovCisJVklSVF9OSUNfUEMgPSAweEM2LAorCVZJUlRfTklDX1BfdmlydG5pY19jID0gMHhDNywKKwkvKiB1aXNsaWIgZHJpdmVyIGZpbGVzICovCisJVUlTTElCX1BDID0gMHhEMCwKKwlVSVNMSUJfUENfdWlzbGliX2MgPSAweEQxLAorCVVJU0xJQl9QQ191aXNxdWV1ZV9jID0gMHhEMiwKKwkvKiAweEQzIFJFU0VSVkVEICovCisJVUlTTElCX1BDX3Vpc3V0aWxzX2MgPSAweEQ0LAorfTsKKworZW51bSBldmVudF9wYyB7CQkJLyogUE9TVENPREUgZXZlbnQgaWRlbnRpZmllciB0dXBsZXMgKi8KKwlBVFRBQ0hfUE9SVF9FTlRSWV9QQyA9IDB4MDAxLAorCUFUVEFDSF9QT1JUX0ZBSUxVUkVfUEMgPSAweDAwMiwKKwlBVFRBQ0hfUE9SVF9TVUNDRVNTX1BDID0gMHgwMDMsCisJQlVTX0ZBSUxVUkVfUEMgPSAweDAwNCwKKwlCVVNfQ1JFQVRFX0VOVFJZX1BDID0gMHgwMDUsCisJQlVTX0NSRUFURV9GQUlMVVJFX1BDID0gMHgwMDYsCisJQlVTX0NSRUFURV9FWElUX1BDID0gMHgwMDcsCisJQlVTX0NPTkZJR1VSRV9FTlRSWV9QQyA9IDB4MDA4LAorCUJVU19DT05GSUdVUkVfRkFJTFVSRV9QQyA9IDB4MDA5LAorCUJVU19DT05GSUdVUkVfRVhJVF9QQyA9IDB4MDBBLAorCUNISVBTRVRfSU5JVF9FTlRSWV9QQyA9IDB4MDBCLAorCUNISVBTRVRfSU5JVF9TVUNDRVNTX1BDID0gMHgwMEMsCisJQ0hJUFNFVF9JTklUX0ZBSUxVUkVfUEMgPSAweDAwRCwKKwlDSElQU0VUX0lOSVRfRVhJVF9QQyA9IDB4MDBFLAorCUNSRUFURV9XT1JLUVVFVUVfUEMgPSAweDAwRiwKKwlDUkVBVEVfV09SS1FVRVVFX0ZBSUxFRF9QQyA9IDB4MEEwLAorCUNPTlRST0xWTV9JTklUX0ZBSUxVUkVfUEMgPSAweDBBMSwKKwlERVZJQ0VfQ1JFQVRFX0VOVFJZX1BDID0gMHgwQTIsCisJREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDID0gMHgwQTMsCisJREVWSUNFX0NSRUFURV9TVUNDRVNTX1BDID0gMHgwQTQsCisJREVWSUNFX0NSRUFURV9FWElUX1BDID0gMHgwQTUsCisJREVWSUNFX0FERF9QQyA9IDB4MEE2LAorCURFVklDRV9SRUdJU1RFUl9GQUlMVVJFX1BDID0gMHgwQTcsCisJREVWSUNFX0NIQU5HRVNUQVRFX0VOVFJZX1BDID0gMHgwQTgsCisJREVWSUNFX0NIQU5HRVNUQVRFX0ZBSUxVUkVfUEMgPSAweDBBOSwKKwlERVZJQ0VfQ0hBTkdFU1RBVEVfRVhJVF9QQyA9IDB4MEFBLAorCURSSVZFUl9FTlRSWV9QQyA9IDB4MEFCLAorCURSSVZFUl9FWElUX1BDID0gMHgwQUMsCisJTUFMTE9DX0ZBSUxVUkVfUEMgPSAweDBBRCwKKwlRVUVVRV9ERUxBWUVEX1dPUktfUEMgPSAweDBBRSwKKwkvKiAweDBCNyBSRVNFUlZFRCAqLworCVZCVVNfQ0hBTk5FTF9FTlRSWV9QQyA9IDB4MEI4LAorCVZCVVNfQ0hBTk5FTF9GQUlMVVJFX1BDID0gMHgwQjksCisJVkJVU19DSEFOTkVMX0VYSVRfUEMgPSAweDBCQSwKKwlWSEJBX0NSRUFURV9FTlRSWV9QQyA9IDB4MEJCLAorCVZIQkFfQ1JFQVRFX0ZBSUxVUkVfUEMgPSAweDBCQywKKwlWSEJBX0NSRUFURV9FWElUX1BDID0gMHgwQkQsCisJVkhCQV9DUkVBVEVfU1VDQ0VTU19QQyA9IDB4MEJFLAorCVZIQkFfQ09NTUFORF9IQU5ETEVSX1BDID0gMHgwQkYsCisJVkhCQV9QUk9CRV9FTlRSWV9QQyA9IDB4MEMwLAorCVZIQkFfUFJPQkVfRkFJTFVSRV9QQyA9IDB4MEMxLAorCVZIQkFfUFJPQkVfRVhJVF9QQyA9IDB4MEMyLAorCVZOSUNfQ1JFQVRFX0VOVFJZX1BDID0gMHgwQzMsCisJVk5JQ19DUkVBVEVfRkFJTFVSRV9QQyA9IDB4MEM0LAorCVZOSUNfQ1JFQVRFX1NVQ0NFU1NfUEMgPSAweDBDNSwKKwlWTklDX1BST0JFX0VOVFJZX1BDID0gMHgwQzYsCisJVk5JQ19QUk9CRV9GQUlMVVJFX1BDID0gMHgwQzcsCisJVk5JQ19QUk9CRV9FWElUX1BDID0gMHgwQzgsCisJVlBDSV9DUkVBVEVfRU5UUllfUEMgPSAweDBDOSwKKwlWUENJX0NSRUFURV9GQUlMVVJFX1BDID0gMHgwQ0EsCisJVlBDSV9DUkVBVEVfRVhJVF9QQyA9IDB4MENCLAorCVZQQ0lfUFJPQkVfRU5UUllfUEMgPSAweDBDQywKKwlWUENJX1BST0JFX0ZBSUxVUkVfUEMgPSAweDBDRCwKKwlWUENJX1BST0JFX0VYSVRfUEMgPSAweDBDRSwKKwlDUkFTSF9ERVZfRU5UUllfUEMgPSAweDBDRiwKKwlDUkFTSF9ERVZfRVhJVF9QQyA9IDB4MEQwLAorCUNSQVNIX0RFVl9IQUREUl9OVUxMID0gMHgwRDEsCisJQ1JBU0hfREVWX0NPTlRST0xWTV9OVUxMID0gMHgwRDIsCisJQ1JBU0hfREVWX1JEX0JVU19GQUlVTFJFX1BDID0gMHgwRDMsCisJQ1JBU0hfREVWX1JEX0RFVl9GQUlVTFJFX1BDID0gMHgwRDQsCisJQ1JBU0hfREVWX0JVU19OVUxMX0ZBSUxVUkVfUEMgPSAweDBENSwKKwlDUkFTSF9ERVZfREVWX05VTExfRkFJTFVSRV9QQyA9IDB4MEQ2LAorCUNSQVNIX0RFVl9DVFJMX1JEX0ZBSUxVUkVfUEMgPSAweDBENywKKwlDUkFTSF9ERVZfQ09VTlRfRkFJTFVSRV9QQyA9IDB4MEQ4LAorCVNBVkVfTVNHX0JVU19GQUlMVVJFX1BDID0gMHgwRDksCisJU0FWRV9NU0dfREVWX0ZBSUxVUkVfUEMgPSAweDBEQSwKKwlDQUxMSE9NRV9JTklUX0ZBSUxVUkVfUEMgPSAweDBEQgorfTsKKworI2RlZmluZSBQT1NUQ09ERV9TRVZFUklUWV9FUlIgRElBR19TRVZFUklUWV9FUlIKKyNkZWZpbmUgUE9TVENPREVfU0VWRVJJVFlfV0FSTklORyBESUFHX1NFVkVSSVRZX1dBUk5JTkcKKy8qIFRPRE8tPiBJbmZvIGN1cnJlbnRseSBkb2Vzbid0IHNob3csIHNvIHdlIHNldCBpbmZvPXdhcm5pbmcgKi8KKyNkZWZpbmUgUE9TVENPREVfU0VWRVJJVFlfSU5GTyBESUFHX1NFVkVSSVRZX1BSSU5UCisKKy8qIGV4YW1wbGUgY2FsbCBvZiBQT1NUQ09ERV9MSU5VWF8yKFZJU09SX0NISVBTRVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisgKiBQbGVhc2UgYWxzbyBub3RlIHRoYXQgdGhlIHJlc3VsdGluZyBwb3N0Y29kZSBpcyBpbiBoZXgsIHNvIGlmIHlvdSBhcmUKKyAqIHNlYXJjaGluZyBmb3IgdGhlIF9fTElORV9fIG51bWJlciwgY29udmVydCBpdCBmaXJzdCB0byBkZWNpbWFsLiAgVGhlIGxpbmUKKyAqIG51bWJlciBjb21iaW5lZCB3aXRoIGRyaXZlciBhbmQgdHlwZSBvZiBjYWxsLCB3aWxsIGFsbG93IHlvdSB0byB0cmFjayBkb3duCisgKiBleGFjdGx5IHdoYXQgbGluZSBhbiBlcnJvciBvY2N1cnJlZCBvbiwgb3Igd2hlcmUgdGhlIGxhc3QgZHJpdmVyCisgKiBlbnRlcmVkL2V4aXRlZCBmcm9tLgorICovCisKKy8qIEJBU0UgRlVOQ1RJT05TICovCisjZGVmaW5lIFBPU1RDT0RFX0xJTlVYX0EoRFJJVkVSX1BDLCBFVkVOVF9QQywgcGMzMmJpdCwgc2V2ZXJpdHkpCVwKK2RvIHsJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBsb25nIHBvc3RfY29kZV90ZW1wOwkJCQlcCisJcG9zdF9jb2RlX3RlbXAgPSAoKCh1NjQpRFJJVkVSX1BDKSA8PCA1NikgfCAoKCh1NjQpRVZFTlRfUEMpIDw8IDQ0KSB8IFwKKwkJKCgoKHU2NClfX0xJTkVfXykgJiAweEZGRikgPDwgMzIpIHwJCQlcCisJCSgoKHU2NClwYzMyYml0KSAmIDB4RkZGRkZGRkYpOwkJCQlcCisJSVNTVUVfSU9fVk1DQUxMX1BPU1RDT0RFX1NFVkVSSVRZKHBvc3RfY29kZV90ZW1wLCBzZXZlcml0eSk7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUE9TVENPREVfTElOVVhfQihEUklWRVJfUEMsIEVWRU5UX1BDLCBwYzE2Yml0MSwgcGMxNmJpdDIsIHNldmVyaXR5KSBcCitkbyB7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgbG9uZyBwb3N0X2NvZGVfdGVtcDsJCQkJXAorCXBvc3RfY29kZV90ZW1wID0gKCgodTY0KURSSVZFUl9QQykgPDwgNTYpIHwgKCgodTY0KUVWRU5UX1BDKSA8PCA0NCkgfCBcCisJCSgoKCh1NjQpX19MSU5FX18pICYgMHhGRkYpIDw8IDMyKSB8CQkJXAorCQkoKCgodTY0KXBjMTZiaXQxKSAmIDB4RkZGRikgPDwgMTYpIHwJCQlcCisJCSgoKHU2NClwYzE2Yml0MikgJiAweEZGRkYpOwkJCQlcCisJSVNTVUVfSU9fVk1DQUxMX1BPU1RDT0RFX1NFVkVSSVRZKHBvc3RfY29kZV90ZW1wLCBzZXZlcml0eSk7CVwKK30gd2hpbGUgKDApCisKKy8qIE1PU1QgQ09NTU9OICovCisjZGVmaW5lIFBPU1RDT0RFX0xJTlVYXzIoRVZFTlRfUEMsIHNldmVyaXR5KQkJCQlcCisJUE9TVENPREVfTElOVVhfQShDVVJSRU5UX0ZJTEVfUEMsIEVWRU5UX1BDLCAweDAwMDAsIHNldmVyaXR5KQorCisjZGVmaW5lIFBPU1RDT0RFX0xJTlVYXzMoRVZFTlRfUEMsIHBjMzJiaXQsIHNldmVyaXR5KQkJCVwKKwlQT1NUQ09ERV9MSU5VWF9BKENVUlJFTlRfRklMRV9QQywgRVZFTlRfUEMsIHBjMzJiaXQsIHNldmVyaXR5KQorCisjZGVmaW5lIFBPU1RDT0RFX0xJTlVYXzQoRVZFTlRfUEMsIHBjMTZiaXQxLCBwYzE2Yml0Miwgc2V2ZXJpdHkpCVwKKwlQT1NUQ09ERV9MSU5VWF9CKENVUlJFTlRfRklMRV9QQywgRVZFTlRfUEMsIHBjMTZiaXQxLAkJXAorCQkJIHBjMTZiaXQyLCBzZXZlcml0eSkKKwogI2VuZGlmIC8qIF9fSU9NT05JTlRGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmhiYS92aXNvcmhiYV9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yaGJhL3Zpc29yaGJhX21haW4uYwppbmRleCAxMjBiYTIwLi41YTdhODdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yaGJhL3Zpc29yaGJhX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yaGJhL3Zpc29yaGJhX21haW4uYwpAQCAtMzYsMjEgKzM2LDYgQEAKICNkZWZpbmUgTUFYX1BFTkRJTkdfUkVRVUVTVFMJKE1JTl9OVU1TSUdOQUxTICogMikKICNkZWZpbmUgVklTT1JIQkFfRVJST1JfQ09VTlQJMzAKIAotc3RhdGljIGludCB2aXNvcmhiYV9xdWV1ZV9jb21tYW5kX2xjayhzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kLAotCQkJCSAgICAgIHZvaWQgKCp2aXNvcmhiYV9jbW5kX2RvbmUpCi0JCQkJCSAgICAoc3RydWN0IHNjc2lfY21uZCAqKSk7Ci0jaWZkZWYgREVGX1NDU0lfUUNNRAotc3RhdGljIERFRl9TQ1NJX1FDTUQodmlzb3JoYmFfcXVldWVfY29tbWFuZCkKLSNlbHNlCi0jZGVmaW5lIHZpc29yaGJhX3F1ZXVlX2NvbW1hbmQgdmlzb3JoYmFfcXVldWVfY29tbWFuZF9sY2sKLSNlbmRpZgotc3RhdGljIGludCB2aXNvcmhiYV9wcm9iZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgdmlzb3JoYmFfcmVtb3ZlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldik7Ci1zdGF0aWMgaW50IHZpc29yaGJhX3BhdXNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldiwKLQkJCSAgdmlzb3JidXNfc3RhdGVfY29tcGxldGVfZnVuYyBjb21wbGV0ZV9mdW5jKTsKLXN0YXRpYyBpbnQgdmlzb3JoYmFfcmVzdW1lKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldiwKLQkJCSAgIHZpc29yYnVzX3N0YXRlX2NvbXBsZXRlX2Z1bmMgY29tcGxldGVfZnVuYyk7Ci0KIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp2aXNvcmhiYV9kZWJ1Z2ZzX2RpcjsKIAogLyogR1VJRFMgZm9yIEhCQSBjaGFubmVsIHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyICovCkBAIC02MiwyMCArNDcsNiBAQAogCXsgTlVMTF9VVUlEX0xFLCBOVUxMIH0KIH07CiAKLS8qIFRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSB2aXNvciBidXMgZHJpdmVyIHdoaWNoIHR5cGVzIG9mIHZpc29yIGRldmljZXMKLSAqIHdlIHN1cHBvcnQsIGFuZCB3aGF0IGZ1bmN0aW9ucyB0byBjYWxsIHdoZW4gYSB2aXNvciBkZXZpY2UgdGhhdCB3ZSBzdXBwb3J0Ci0gKiBpcyBhdHRhY2hlZCBvciByZW1vdmVkLgotICovCi1zdGF0aWMgc3RydWN0IHZpc29yX2RyaXZlciB2aXNvcmhiYV9kcml2ZXIgPSB7Ci0JLm5hbWUgPSAidmlzb3JoYmEiLAotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5jaGFubmVsX3R5cGVzID0gdmlzb3JoYmFfY2hhbm5lbF90eXBlcywKLQkucHJvYmUgPSB2aXNvcmhiYV9wcm9iZSwKLQkucmVtb3ZlID0gdmlzb3JoYmFfcmVtb3ZlLAotCS5wYXVzZSA9IHZpc29yaGJhX3BhdXNlLAotCS5yZXN1bWUgPSB2aXNvcmhiYV9yZXN1bWUsCi0JLmNoYW5uZWxfaW50ZXJydXB0ID0gTlVMTCwKLX07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHZpc29yYnVzLCB2aXNvcmhiYV9jaGFubmVsX3R5cGVzKTsKIE1PRFVMRV9BTElBUygidmlzb3JidXM6IiBTUEFSX1ZIQkFfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEX1NUUik7CiAKQEAgLTM2NCw5ICszMzUsOSBAQAogCiAJZGV2X2RiZygmc2NzaWRldi0+c2Rldl9nZW5kZXYsCiAJCSJ2aXNvcmhiYTogaW5pdGlhdGluZyB0eXBlPSVkIHRhc2ttZ210IGNvbW1hbmRcbiIsIHRhc2t0eXBlKTsKLQlpZiAoIXZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoZGV2ZGF0YS0+ZGV2LT52aXNvcmNoYW5uZWwsCi0JCQkJICAgICAgIElPQ0hBTl9UT19JT1BBUlQsCi0JCQkJICAgICAgIGNtZHJzcCkpCisJaWYgKHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoZGV2ZGF0YS0+ZGV2LT52aXNvcmNoYW5uZWwsCisJCQkJICAgICAgSU9DSEFOX1RPX0lPUEFSVCwKKwkJCQkgICAgICBjbWRyc3ApKQogCQlnb3RvIGVycl9kZWxfc2NzaXBlbmRpbmdfZW50OwogCiAJLyogSXQgY2FuIHRha2UgdGhlIFNlcnZpY2UgUGFydGl0aW9uIHVwIHRvIDM1IHNlY29uZHMgdG8gY29tcGxldGUKQEAgLTU2Nyw5ICs1MzgsOSBAQAogCX0KIAljbWRyc3AtPnNjc2kuZ3Vlc3RfcGh5c19lbnRyaWVzID0gc2NzaV9zZ19jb3VudChzY3NpY21kKTsKIAotCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChkZXZkYXRhLT5kZXYtPnZpc29yY2hhbm5lbCwKLQkJCQkgICAgICAgSU9DSEFOX1RPX0lPUEFSVCwKLQkJCQkgICAgICAgY21kcnNwKSkKKwlpZiAodmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChkZXZkYXRhLT5kZXYtPnZpc29yY2hhbm5lbCwKKwkJCQkgICAgICBJT0NIQU5fVE9fSU9QQVJULAorCQkJCSAgICAgIGNtZHJzcCkpCiAJCS8qIHF1ZXVlIG11c3QgYmUgZnVsbCBhbmQgd2UgYXJlbid0IGdvaW5nIHRvIHdhaXQgKi8KIAkJZ290byBlcnJfZGVsX3Njc2lwZW5kaW5nX2VudDsKIApAQCAtNTgwLDYgKzU1MSwxMiBAQAogCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CiB9CiAKKyNpZmRlZiBERUZfU0NTSV9RQ01ECitzdGF0aWMgREVGX1NDU0lfUUNNRCh2aXNvcmhiYV9xdWV1ZV9jb21tYW5kKQorI2Vsc2UKKyNkZWZpbmUgdmlzb3JoYmFfcXVldWVfY29tbWFuZCB2aXNvcmhiYV9xdWV1ZV9jb21tYW5kX2xjaworI2VuZGlmCisKIC8qKgogICoJdmlzb3JoYmFfc2xhdmVfYWxsb2MgLSBjYWxsZWQgd2hlbiBuZXcgZGlzayBpcyBkaXNjb3ZlcmVkCiAgKglAc2NzaWRldjogTmV3IGRpc2sKQEAgLTk1MCw5ICs5MjcsOSBAQAogCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQ7CiAKIAl3aGlsZSAoMSkgewotCQlpZiAoIXZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoZGV2ZGF0YS0+ZGV2LT52aXNvcmNoYW5uZWwsCi0JCQkJCSAgICAgICBJT0NIQU5fRlJPTV9JT1BBUlQsCi0JCQkJCSAgICAgICBjbWRyc3ApKQorCQlpZiAodmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShkZXZkYXRhLT5kZXYtPnZpc29yY2hhbm5lbCwKKwkJCQkJICAgICAgSU9DSEFOX0ZST01fSU9QQVJULAorCQkJCQkgICAgICBjbWRyc3ApKQogCQkJYnJlYWs7IC8qIHF1ZXVlIGVtcHR5ICovCiAKIAkJaWYgKGNtZHJzcC0+Y21kdHlwZSA9PSBDTURfU0NTSV9UWVBFKSB7CkBAIC0xMTg2LDYgKzExNjMsMjEgQEAKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGV2ZGF0YS0+ZGVidWdmc19kaXIpOwogfQogCisvKiBUaGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgdmlzb3IgYnVzIGRyaXZlciB3aGljaCB0eXBlcyBvZiB2aXNvciBkZXZpY2VzCisgKiB3ZSBzdXBwb3J0LCBhbmQgd2hhdCBmdW5jdGlvbnMgdG8gY2FsbCB3aGVuIGEgdmlzb3IgZGV2aWNlIHRoYXQgd2Ugc3VwcG9ydAorICogaXMgYXR0YWNoZWQgb3IgcmVtb3ZlZC4KKyAqLworc3RhdGljIHN0cnVjdCB2aXNvcl9kcml2ZXIgdmlzb3JoYmFfZHJpdmVyID0geworCS5uYW1lID0gInZpc29yaGJhIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuY2hhbm5lbF90eXBlcyA9IHZpc29yaGJhX2NoYW5uZWxfdHlwZXMsCisJLnByb2JlID0gdmlzb3JoYmFfcHJvYmUsCisJLnJlbW92ZSA9IHZpc29yaGJhX3JlbW92ZSwKKwkucGF1c2UgPSB2aXNvcmhiYV9wYXVzZSwKKwkucmVzdW1lID0gdmlzb3JoYmFfcmVzdW1lLAorCS5jaGFubmVsX2ludGVycnVwdCA9IE5VTEwsCit9OworCiAvKioKICAqCXZpc29yaGJhX2luaXQJCS0gZHJpdmVyIGluaXQgcm91dGluZQogICoKQEAgLTEyMjgsNCArMTIyMCw0IEBACiAKIE1PRFVMRV9BVVRIT1IoIlVuaXN5cyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJzLVBhciBoYmEgZHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oInMtUGFyIEhCQSBkcml2ZXIgZm9yIHZpcnR1YWwgU0NTSSBob3N0IGJ1c3NlcyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmlucHV0L3VsdHJhaW5wdXRyZXBvcnQuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JpbnB1dC91bHRyYWlucHV0cmVwb3J0LmgKaW5kZXggMWJjM2QyMC4uNTNkZGU3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmlucHV0L3VsdHJhaW5wdXRyZXBvcnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yaW5wdXQvdWx0cmFpbnB1dHJlcG9ydC5oCkBAIC0xNyw4ICsxNyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi0jaW5jbHVkZSAidWx0cmFpbnB1dHJlcG9ydC5oIgotCiAvKiBJZGVudGlmaWVzIG1vdXNlIGFuZCBrZXlib2FyZCBhY3Rpdml0eSB3aGljaCBpcyBzcGVjaWZpZWQgYnkgdGhlIGZpcm13YXJlIHRvCiAgKiAgdGhlIGhvc3QgdXNpbmcgdGhlIGNtc2ltcGxlaW5wdXQgcHJvdG9jb2wuICBAaW5ncm91cCBjb3JldHlwZXMKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmlucHV0L3Zpc29yaW5wdXQuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JpbnB1dC92aXNvcmlucHV0LmMKaW5kZXggZDY3Y2Q3NjMuLjZmOTRiNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JpbnB1dC92aXNvcmlucHV0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmlucHV0L3Zpc29yaW5wdXQuYwpAQCAtMjksOSArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KIAotI2luY2x1ZGUgInZlcnNpb24uaCIKICNpbmNsdWRlICJ2aXNvcmJ1cy5oIgotI2luY2x1ZGUgImNoYW5uZWwuaCIKICNpbmNsdWRlICJ1bHRyYWlucHV0cmVwb3J0LmgiCiAKIC8qIEtleWJvYXJkIGNoYW5uZWwge2M3MzQxNmQwLWIwYjgtNDRhZi1iMzA0LTlkMmFlOTlmMWIzZH0gKi8KQEAgLTYzLDkgKzYxLDEwIEBACiAgKi8KIHN0cnVjdCB2aXNvcmlucHV0X2RldmRhdGEgewogCXN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgcndfc2VtYXBob3JlIGxvY2tfdmlzb3JfZGV2OyAvKiBsb2NrIGZvciBkZXYgKi8KKwlzdHJ1Y3QgbXV0ZXggbG9ja192aXNvcl9kZXY7IC8qIGxvY2sgZm9yIGRldiAqLwogCXN0cnVjdCBpbnB1dF9kZXYgKnZpc29yaW5wdXRfZGV2OwogCWJvb2wgcGF1c2VkOworCWJvb2wgaW50ZXJydXB0c19lbmFibGVkOwogCXVuc2lnbmVkIGludCBrZXljb2RlX3RhYmxlX2J5dGVzOyAvKiBzaXplIG9mIGZvbGxvd2luZyBhcnJheSAqLwogCS8qIGZvciBrZXlib2FyZCBkZXZpY2VzOiB2aXNvcmtiZF9rZXljb2RlW10gKyB2aXNvcmtiZF9leHRfa2V5Y29kZVtdICovCiAJdW5zaWduZWQgY2hhciBrZXljb2RlX3RhYmxlWzBdOwpAQCAtMjI4LDcgKzIyNywyMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJZGV2X2RiZygmdmlzb3JpbnB1dF9kZXYtPmRldiwgIiVzIG9wZW5lZFxuIiwgX19mdW5jX18pOworCisJLyoKKwkgKiBJZiB3ZSdyZSBub3QgcGF1c2VkLCByZWFsbHkgZW5hYmxlIGludGVycnVwdHMuCisJICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlIGFyZSBwYXVzZWQsIHNldCBhIGZsYWcgaW5kaWNhdGluZworCSAqIGludGVycnVwdHMgc2hvdWxkIGJlIGVuYWJsZWQgc28gd2hlbiB3ZSByZXN1bWUsIGludGVycnVwdHMKKwkgKiB3aWxsIHJlYWxseSBiZSBlbmFibGVkLgorCSAqLworCW11dGV4X2xvY2soJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKKwlkZXZkYXRhLT5pbnRlcnJ1cHRzX2VuYWJsZWQgPSB0cnVlOworCWlmIChkZXZkYXRhLT5wYXVzZWQpCisJCWdvdG8gb3V0X3VubG9jazsKIAl2aXNvcmJ1c19lbmFibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKGRldmRhdGEtPmRldik7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0MywyMCArMjU2LDM1IEBACiAJCXJldHVybjsKIAl9CiAJZGV2X2RiZygmdmlzb3JpbnB1dF9kZXYtPmRldiwgIiVzIGNsb3NlZFxuIiwgX19mdW5jX18pOworCisJLyoKKwkgKiBJZiB3ZSdyZSBub3QgcGF1c2VkLCByZWFsbHkgZGlzYWJsZSBpbnRlcnJ1cHRzLgorCSAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSBhcmUgcGF1c2VkLCBzZXQgYSBmbGFnIGluZGljYXRpbmcKKwkgKiBpbnRlcnJ1cHRzIHNob3VsZCBiZSBkaXNhYmxlZCBzbyB3aGVuIHdlIHJlc3VtZSB3ZSB3aWxsCisJICogbm90IHJlLWVuYWJsZSB0aGVtLgorCSAqLworCisJbXV0ZXhfbG9jaygmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOworCWRldmRhdGEtPmludGVycnVwdHNfZW5hYmxlZCA9IGZhbHNlOworCWlmIChkZXZkYXRhLT5wYXVzZWQpCisJCWdvdG8gb3V0X3VubG9jazsKIAl2aXNvcmJ1c19kaXNhYmxlX2NoYW5uZWxfaW50ZXJydXB0cyhkZXZkYXRhLT5kZXYpOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOwogfQogCiAvKgotICogcmVnaXN0ZXJfY2xpZW50X2tleWJvYXJkKCkgaW5pdGlhbGl6ZXMgYW5kIHJldHVybnMgYSBMaW51eCBpbnB1dCBub2RlIHRoYXQKKyAqIHNldHVwX2NsaWVudF9rZXlib2FyZCgpIGluaXRpYWxpemVzIGFuZCByZXR1cm5zIGEgTGludXggaW5wdXQgbm9kZSB0aGF0CiAgKiB3ZSBjYW4gdXNlIHRvIGRlbGl2ZXIga2V5Ym9hcmQgaW5wdXRzIHRvIExpbnV4LiAgV2Ugb2YgY291cnNlIGRvIHRoaXMgd2hlbgogICogd2Ugc2VlIGtleWJvYXJkIGlucHV0cyBjb21pbmcgaW4gb24gYSBrZXlib2FyZCBjaGFubmVsLgogICovCiBzdGF0aWMgc3RydWN0IGlucHV0X2RldiAqCi1yZWdpc3Rlcl9jbGllbnRfa2V5Ym9hcmQodm9pZCAqZGV2ZGF0YSwgIC8qIG9wYXF1ZSBvbiBwdXJwb3NlICovCi0JCQkgdW5zaWduZWQgY2hhciAqa2V5Y29kZV90YWJsZSkKK3NldHVwX2NsaWVudF9rZXlib2FyZCh2b2lkICpkZXZkYXRhLCAgLyogb3BhcXVlIG9uIHB1cnBvc2UgKi8KKwkJICAgICAgdW5zaWduZWQgY2hhciAqa2V5Y29kZV90YWJsZSkKIAogewotCWludCBpLCBlcnJvcjsKKwlpbnQgaTsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICp2aXNvcmlucHV0X2RldjsKIAogCXZpc29yaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CkBAIC0yOTAsMTggKzMxOCwxMiBAQAogCXZpc29yaW5wdXRfZGV2LT5jbG9zZSA9IHZpc29yaW5wdXRfY2xvc2U7CiAJaW5wdXRfc2V0X2RydmRhdGEodmlzb3JpbnB1dF9kZXYsIGRldmRhdGEpOyAvKiBwcmUgaW5wdXRfcmVnaXN0ZXIhICovCiAKLQllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZSh2aXNvcmlucHV0X2Rldik7Ci0JaWYgKGVycm9yKSB7Ci0JCWlucHV0X2ZyZWVfZGV2aWNlKHZpc29yaW5wdXRfZGV2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQogCXJldHVybiB2aXNvcmlucHV0X2RldjsKIH0KIAogc3RhdGljIHN0cnVjdCBpbnB1dF9kZXYgKgotcmVnaXN0ZXJfY2xpZW50X21vdXNlKHZvaWQgKmRldmRhdGEgLyogb3BhcXVlIG9uIHB1cnBvc2UgKi8pCitzZXR1cF9jbGllbnRfbW91c2Uodm9pZCAqZGV2ZGF0YSAvKiBvcGFxdWUgb24gcHVycG9zZSAqLykKIHsKLQlpbnQgZXJyb3I7CiAJc3RydWN0IGlucHV0X2RldiAqdmlzb3JpbnB1dF9kZXYgPSBOVUxMOwogCWludCB4cmVzLCB5cmVzOwogCXN0cnVjdCBmYl9pbmZvICpmYjA7CkBAIC0zMzYsMTMgKzM1OCw2IEBACiAJdmlzb3JpbnB1dF9kZXYtPm9wZW4gPSB2aXNvcmlucHV0X29wZW47CiAJdmlzb3JpbnB1dF9kZXYtPmNsb3NlID0gdmlzb3JpbnB1dF9jbG9zZTsKIAlpbnB1dF9zZXRfZHJ2ZGF0YSh2aXNvcmlucHV0X2RldiwgZGV2ZGF0YSk7IC8qIHByZSBpbnB1dF9yZWdpc3RlciEgKi8KLQotCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHZpc29yaW5wdXRfZGV2KTsKLQlpZiAoZXJyb3IpIHsKLQkJaW5wdXRfZnJlZV9kZXZpY2Uodmlzb3JpbnB1dF9kZXYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KIAlpbnB1dF9zZXRfY2FwYWJpbGl0eSh2aXNvcmlucHV0X2RldiwgRVZfUkVMLCBSRUxfV0hFRUwpOwogCiAJcmV0dXJuIHZpc29yaW5wdXRfZGV2OwpAQCAtMzYwLDkgKzM3NSwxOSBAQAogCWRldmRhdGEgPSBremFsbG9jKHNpemVvZigqZGV2ZGF0YSkgKyBleHRyYV9ieXRlcywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXZkYXRhKQogCQlyZXR1cm4gTlVMTDsKKwltdXRleF9pbml0KCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CisJbXV0ZXhfbG9jaygmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOwogCWRldmRhdGEtPmRldiA9IGRldjsKIAogCS8qCisJICogdmlzb3JpbnB1dF9vcGVuKCkgY2FuIGJlIGNhbGxlZCBhcyBzb29uIGFzIGlucHV0X3JlZ2lzdGVyX2RldmljZSgpCisJICogaGFwcGVucywgYW5kIHRoYXQgd2lsbCBlbmFibGUgY2hhbm5lbCBpbnRlcnJ1cHRzLiAgU2V0dGluZyBwYXVzZWQKKwkgKiBwcmV2ZW50cyB1cyBmcm9tIGdldHRpbmcgaW50byB2aXNvcmlucHV0X2NoYW5uZWxfaW50ZXJydXB0KCkgcHJpb3IKKwkgKiB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZSBiZWluZyB0b3RhbGx5IGluaXRpYWxpemVkLgorCSAqLworCWRldmRhdGEtPnBhdXNlZCA9IHRydWU7CisKKwkvKgogCSAqIFRoaXMgaXMgYW4gaW5wdXQgZGV2aWNlIGluIGEgY2xpZW50IGd1ZXN0IHBhcnRpdGlvbiwKIAkgKiBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB3aGF0ZXZlciBpbnB1dCBub2RlcyBhcmUgbmVjZXNzYXJ5IHRvCiAJICogZGVsaXZlciBvdXIgaW5wdXRzIHRvIHRoZSBndWVzdCBPUy4KQEAgLTM3NCwyMyArMzk5LDQ5IEBACiAJCSAgICAgICBLRVlDT0RFX1RBQkxFX0JZVEVTKTsKIAkJbWVtY3B5KGRldmRhdGEtPmtleWNvZGVfdGFibGUgKyBLRVlDT0RFX1RBQkxFX0JZVEVTLAogCQkgICAgICAgdmlzb3JrYmRfZXh0X2tleWNvZGUsIEtFWUNPREVfVEFCTEVfQllURVMpOwotCQlkZXZkYXRhLT52aXNvcmlucHV0X2RldiA9IHJlZ2lzdGVyX2NsaWVudF9rZXlib2FyZAorCQlkZXZkYXRhLT52aXNvcmlucHV0X2RldiA9IHNldHVwX2NsaWVudF9rZXlib2FyZAogCQkJKGRldmRhdGEsIGRldmRhdGEtPmtleWNvZGVfdGFibGUpOwogCQlpZiAoIWRldmRhdGEtPnZpc29yaW5wdXRfZGV2KQogCQkJZ290byBjbGVhbnVwc19yZWdpc3RlcjsKIAkJYnJlYWs7CiAJY2FzZSB2aXNvcmlucHV0X21vdXNlOgotCQlkZXZkYXRhLT52aXNvcmlucHV0X2RldiA9IHJlZ2lzdGVyX2NsaWVudF9tb3VzZShkZXZkYXRhKTsKKwkJZGV2ZGF0YS0+dmlzb3JpbnB1dF9kZXYgPSBzZXR1cF9jbGllbnRfbW91c2UoZGV2ZGF0YSk7CiAJCWlmICghZGV2ZGF0YS0+dmlzb3JpbnB1dF9kZXYpCiAJCQlnb3RvIGNsZWFudXBzX3JlZ2lzdGVyOwogCQlicmVhazsKIAl9CiAKLQlpbml0X3J3c2VtKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CisJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldmljZSwgZGV2ZGF0YSk7CisJbXV0ZXhfdW5sb2NrKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CisKKwkvKgorCSAqIERldmljZSBzdHJ1Y3QgaXMgY29tcGxldGVseSBzZXQgdXAgbm93LCB3aXRoIHRoZSBleGNlcHRpb24gb2YKKwkgKiB2aXNvcmlucHV0X2RldiBiZWluZyByZWdpc3RlcmVkLgorCSAqIFdlIG5lZWQgdG8gdW5sb2NrIGJlZm9yZSB3ZSByZWdpc3RlciB0aGUgZGV2aWNlLCBiZWNhdXNlIHRoaXMKKwkgKiBjYW4gY2F1c2UgYW4gb24tc3RhY2sgY2FsbCBvZiB2aXNvcmlucHV0X29wZW4oKSwgd2hpY2ggd291bGQKKwkgKiBkZWFkbG9jayBpZiB3ZSBoYWQgdGhlIGxvY2suCisJICovCisJaWYgKGlucHV0X3JlZ2lzdGVyX2RldmljZShkZXZkYXRhLT52aXNvcmlucHV0X2RldikpIHsKKwkJaW5wdXRfZnJlZV9kZXZpY2UoZGV2ZGF0YS0+dmlzb3JpbnB1dF9kZXYpOworCQlnb3RvIGVycl9rZnJlZV9kZXZkYXRhOworCX0KKworCW11dGV4X2xvY2soJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKKwkvKgorCSAqIEVzdGFibGlzaCBjYWxscyB0byB2aXNvcmlucHV0X2NoYW5uZWxfaW50ZXJydXB0KCkgaWYgdGhhdCBpcworCSAqIHRoZSBkZXNpcmVkIHN0YXRlIHRoYXQgd2UndmUga2VwdCB0cmFjayBvZiBpbiBpbnRlcnJ1cHRzX2VuYWJsZWQKKwkgKiB3aGlsZSB0aGUgZGV2aWNlIHdhcyBiZWluZyBjcmVhdGVkLgorCSAqLworCWRldmRhdGEtPnBhdXNlZCA9IGZhbHNlOworCWlmIChkZXZkYXRhLT5pbnRlcnJ1cHRzX2VuYWJsZWQpCisJCXZpc29yYnVzX2VuYWJsZV9jaGFubmVsX2ludGVycnVwdHMoZGV2KTsKKwltdXRleF91bmxvY2soJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKIAogCXJldHVybiBkZXZkYXRhOwogCiBjbGVhbnVwc19yZWdpc3RlcjoKKwltdXRleF91bmxvY2soJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKK2Vycl9rZnJlZV9kZXZkYXRhOgogCWtmcmVlKGRldmRhdGEpOwogCXJldHVybiBOVUxMOwogfQpAQCAtMzk4LDcgKzQ0OSw2IEBACiBzdGF0aWMgaW50CiB2aXNvcmlucHV0X3Byb2JlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgdmlzb3JpbnB1dF9kZXZkYXRhICpkZXZkYXRhID0gTlVMTDsKIAl1dWlkX2xlIGd1aWQ7CiAJZW51bSB2aXNvcmlucHV0X2RldmljZV90eXBlIGRldnR5cGU7CiAKQEAgLTQwOSwxMCArNDU5LDkgQEAKIAkJZGV2dHlwZSA9IHZpc29yaW5wdXRfa2V5Ym9hcmQ7CiAJZWxzZQogCQlyZXR1cm4gLUVOT0RFVjsKLQlkZXZkYXRhID0gZGV2ZGF0YV9jcmVhdGUoZGV2LCBkZXZ0eXBlKTsKLQlpZiAoIWRldmRhdGEpCisJdmlzb3JidXNfZGlzYWJsZV9jaGFubmVsX2ludGVycnVwdHMoZGV2KTsKKwlpZiAoIWRldmRhdGFfY3JlYXRlKGRldiwgZGV2dHlwZSkpCiAJCXJldHVybiAtRU5PTUVNOwotCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXZpY2UsIGRldmRhdGEpOwogCXJldHVybiAwOwogfQogCkBAIC00MzEsNiArNDgwLDcgQEAKIAlpZiAoIWRldmRhdGEpCiAJCXJldHVybjsKIAorCW11dGV4X2xvY2soJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKIAl2aXNvcmJ1c19kaXNhYmxlX2NoYW5uZWxfaW50ZXJydXB0cyhkZXYpOwogCiAJLyoKQEAgLTQzOCwxMCArNDg4LDEwIEBACiAJICogaW4gdmlzb3JpbnB1dF9jaGFubmVsX2ludGVycnVwdCgpCiAJICovCiAKLQlkb3duX3dyaXRlKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CiAJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldmljZSwgTlVMTCk7CisJbXV0ZXhfdW5sb2NrKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CisKIAl1bnJlZ2lzdGVyX2NsaWVudF9pbnB1dChkZXZkYXRhLT52aXNvcmlucHV0X2Rldik7Ci0JdXBfd3JpdGUoJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKIAlrZnJlZShkZXZkYXRhKTsKIH0KIApAQCAtNTI5LDE1ICs1NzksOSBAQAogCWlmICghZGV2ZGF0YSkKIAkJcmV0dXJuOwogCi0JZG93bl93cml0ZSgmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOwotCWlmIChkZXZkYXRhLT5wYXVzZWQpIC8qIGRvbid0IHRvdWNoIGRldmljZS9jaGFubmVsIHdoZW4gcGF1c2VkICovCi0JCWdvdG8gb3V0X2xvY2tlZDsKLQogCXZpc29yaW5wdXRfZGV2ID0gZGV2ZGF0YS0+dmlzb3JpbnB1dF9kZXY7Ci0JaWYgKCF2aXNvcmlucHV0X2RldikKLQkJZ290byBvdXRfbG9ja2VkOwogCi0Jd2hpbGUgKHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoZGV2LT52aXNvcmNoYW5uZWwsIDAsICZyKSkgeworCXdoaWxlICghdmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShkZXYtPnZpc29yY2hhbm5lbCwgMCwgJnIpKSB7CiAJCXNjYW5jb2RlID0gci5hY3Rpdml0eS5hcmcxOwogCQlrZXljb2RlID0gc2NhbmNvZGVfdG9fa2V5Y29kZShzY2FuY29kZSk7CiAJCXN3aXRjaCAoci5hY3Rpdml0eS5hY3Rpb24pIHsKQEAgLTYxMSw4ICs2NTUsNiBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci1vdXRfbG9ja2VkOgotCXVwX3dyaXRlKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTYyNywxNiArNjY5LDI0IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWRvd25fd3JpdGUoJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKKwltdXRleF9sb2NrKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CiAJaWYgKGRldmRhdGEtPnBhdXNlZCkgewogCQlyYyA9IC1FQlVTWTsKIAkJZ290byBvdXRfbG9ja2VkOwogCX0KKwlpZiAoZGV2ZGF0YS0+aW50ZXJydXB0c19lbmFibGVkKQorCQl2aXNvcmJ1c19kaXNhYmxlX2NoYW5uZWxfaW50ZXJydXB0cyhkZXYpOworCisJLyoKKwkgKiBkdWUgdG8gYWJvdmUsIGF0IHRoaXMgdGltZSBubyB0aHJlYWQgb2YgZXhlY3V0aW9uIHdpbGwgYmUKKwkgKiBpbiB2aXNvcmlucHV0X2NoYW5uZWxfaW50ZXJydXB0KCkKKwkgKi8KKwogCWRldmRhdGEtPnBhdXNlZCA9IHRydWU7CiAJY29tcGxldGVfZnVuYyhkZXYsIDApOwogCXJjID0gMDsKIG91dF9sb2NrZWQ6Ci0JdXBfd3JpdGUoJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKKwltdXRleF91bmxvY2soJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKIG91dDoKIAlyZXR1cm4gcmM7CiB9CkBAIC02NTIsMTYgKzcwMiwyNSBAQAogCQlyYyA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0OwogCX0KLQlkb3duX3dyaXRlKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CisJbXV0ZXhfbG9jaygmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOwogCWlmICghZGV2ZGF0YS0+cGF1c2VkKSB7CiAJCXJjID0gLUVCVVNZOwogCQlnb3RvIG91dF9sb2NrZWQ7CiAJfQogCWRldmRhdGEtPnBhdXNlZCA9IGZhbHNlOwogCWNvbXBsZXRlX2Z1bmMoZGV2LCAwKTsKKworCS8qCisJICogUmUtZXN0YWJsaXNoIGNhbGxzIHRvIHZpc29yaW5wdXRfY2hhbm5lbF9pbnRlcnJ1cHQoKSBpZiB0aGF0IGlzCisJICogdGhlIGRlc2lyZWQgc3RhdGUgdGhhdCB3ZSd2ZSBrZXB0IHRyYWNrIG9mIGluIGludGVycnVwdHNfZW5hYmxlZAorCSAqIHdoaWxlIHRoZSBkZXZpY2Ugd2FzIHBhdXNlZC4KKwkgKi8KKwlpZiAoZGV2ZGF0YS0+aW50ZXJydXB0c19lbmFibGVkKQorCQl2aXNvcmJ1c19lbmFibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKGRldik7CisKIAlyYyA9IDA7CiBvdXRfbG9ja2VkOgotCXVwX3dyaXRlKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CisJbXV0ZXhfdW5sb2NrKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CiBvdXQ6CiAJcmV0dXJuIHJjOwogfQpAQCAtNjc1LDcgKzczNCw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgdmlzb3JfZHJpdmVyIHZpc29yaW5wdXRfZHJpdmVyID0gewogCS5uYW1lID0gInZpc29yaW5wdXQiLAotCS52ZXJ0YWcgPSBOVUxMLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5jaGFubmVsX3R5cGVzID0gdmlzb3JpbnB1dF9jaGFubmVsX3R5cGVzLAogCS5wcm9iZSA9IHZpc29yaW5wdXRfcHJvYmUsCkBAIC03MDQsOCArNzYyLDcgQEAKIAogTU9EVUxFX0FVVEhPUigiVW5pc3lzIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oInMtUGFyIGh1bWFuIGlucHV0IGRyaXZlciBmb3IgZ3Vlc3QgTGludXgiKTsKLU1PRFVMRV9WRVJTSU9OKFZFUlNJT04pOworTU9EVUxFX0RFU0NSSVBUSU9OKCJzLVBhciBodW1hbiBpbnB1dCBkcml2ZXIgZm9yIHZpcnR1YWwga2V5Ym9hcmQvbW91c2UiKTsKIAogTU9EVUxFX0FMSUFTKCJ2aXNvcmJ1czoiIFNQQVJfTU9VU0VfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEX1NUUik7CiBNT0RVTEVfQUxJQVMoInZpc29yYnVzOiIgU1BBUl9LRVlCT0FSRF9DSEFOTkVMX1BST1RPQ09MX1VVSURfU1RSKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JuaWMvdmlzb3JuaWNfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcm5pYy92aXNvcm5pY19tYWluLmMKaW5kZXggYTI4Mzg4ZC4uMTM2NzAwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcm5pYy92aXNvcm5pY19tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcm5pYy92aXNvcm5pY19tYWluLmMKQEAgLTI5LDggKzI5LDYgQEAKICNpbmNsdWRlICJpb2NoYW5uZWwuaCIKIAogI2RlZmluZSBWSVNPUk5JQ19JTkZJTklURV9SU1BfV0FJVCAwCi0jZGVmaW5lIFZJU09STklDU09QRU5NQVggMzIKLSNkZWZpbmUgTUFYREVWSUNFUyAgICAgMTYzODQKIAogLyogTUFYX0JVRiA9IDY0IGxpbmVzIHggMzIgTUFYVk5JQyB4IDgwIGNoYXJhY3RlcnMKICAqICAgICAgICAgPSAxNjM4NDAgYnl0ZXMKQEAgLTM4LDI3ICszNiw2IEBACiAjZGVmaW5lIE1BWF9CVUYgMTYzODQwCiAjZGVmaW5lIE5BUElfV0VJR0hUIDY0CiAKLXN0YXRpYyBpbnQgdmlzb3JuaWNfcHJvYmUoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIHZpc29ybmljX3JlbW92ZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYpOwotc3RhdGljIGludCB2aXNvcm5pY19wYXVzZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYsCi0JCQkgIHZpc29yYnVzX3N0YXRlX2NvbXBsZXRlX2Z1bmMgY29tcGxldGVfZnVuYyk7Ci1zdGF0aWMgaW50IHZpc29ybmljX3Jlc3VtZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYsCi0JCQkgICB2aXNvcmJ1c19zdGF0ZV9jb21wbGV0ZV9mdW5jIGNvbXBsZXRlX2Z1bmMpOwotCi0vKiBERUJVR0ZTIGRlY2xhcmF0aW9ucyAqLwotc3RhdGljIHNzaXplX3QgaW5mb19kZWJ1Z2ZzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkJIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KTsKLXN0YXRpYyBzc2l6ZV90IGVuYWJsZV9pbnRzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCSBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpOwotc3RhdGljIHN0cnVjdCBkZW50cnkgKnZpc29ybmljX2RlYnVnZnNfZGlyOwotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdmc19pbmZvX2ZvcHMgPSB7Ci0JLnJlYWQgPSBpbmZvX2RlYnVnZnNfcmVhZCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnZnNfZW5hYmxlX2ludHNfZm9wcyA9IHsKLQkud3JpdGUgPSBlbmFibGVfaW50c193cml0ZSwKLX07Ci0KIC8qIEdVSURTIGZvciBkaXJlY3RvciBjaGFubmVsIHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgdmlzb3JfY2hhbm5lbHR5cGVfZGVzY3JpcHRvciB2aXNvcm5pY19jaGFubmVsX3R5cGVzW10gPSB7CiAJLyogTm90ZSB0aGF0IHRoZSBvbmx5IGNoYW5uZWwgdHlwZSB3ZSBleHBlY3QgdG8gYmUgcmVwb3J0ZWQgYnkgdGhlCkBAIC03NywyMyArNTQsNiBAQAogICovCiBNT0RVTEVfQUxJQVMoInZpc29yYnVzOiIgU1BBUl9WTklDX0NIQU5ORUxfUFJPVE9DT0xfVVVJRF9TVFIpOwogCi0vKiBUaGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgdmlzb3IgYnVzIGRyaXZlciB3aGljaCB0eXBlcyBvZiB2aXNvciBkZXZpY2VzCi0gKiB3ZSBzdXBwb3J0LCBhbmQgd2hhdCBmdW5jdGlvbnMgdG8gY2FsbCB3aGVuIGEgdmlzb3IgZGV2aWNlIHRoYXQgd2Ugc3VwcG9ydAotICogaXMgYXR0YWNoZWQgb3IgcmVtb3ZlZC4KLSAqLwotc3RhdGljIHN0cnVjdCB2aXNvcl9kcml2ZXIgdmlzb3JuaWNfZHJpdmVyID0gewotCS5uYW1lID0gInZpc29ybmljIiwKLQkudmVyc2lvbiA9ICIxLjAuMC4wIiwKLQkudmVydGFnID0gTlVMTCwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkuY2hhbm5lbF90eXBlcyA9IHZpc29ybmljX2NoYW5uZWxfdHlwZXMsCi0JLnByb2JlID0gdmlzb3JuaWNfcHJvYmUsCi0JLnJlbW92ZSA9IHZpc29ybmljX3JlbW92ZSwKLQkucGF1c2UgPSB2aXNvcm5pY19wYXVzZSwKLQkucmVzdW1lID0gdmlzb3JuaWNfcmVzdW1lLAotCS5jaGFubmVsX2ludGVycnVwdCA9IE5VTEwsCi19OwotCiBzdHJ1Y3QgY2hhbnN0YXQgewogCXVuc2lnbmVkIGxvbmcgZ290X3JjdjsKIAl1bnNpZ25lZCBsb25nIGdvdF9lbmJkaXNhY2s7CkBAIC0xODEsOSArMTQxLDYgQEAKIAlzdHJ1Y3QgdWlzY21kcnNwIGNtZHJzcFtTSVpFT0ZfQ01EUlNQXTsKIH07CiAKLXN0YXRpYyBpbnQgdmlzb3JuaWNfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpOwotc3RhdGljIHZvaWQgcG9sbF9mb3JfaXJxKHVuc2lnbmVkIGxvbmcgdik7Ci0KIC8qKgogICoJdmlzb3JfY29weV9mcmFnc2luZm9fZnJvbV9za2IoCiAgKglAc2tiX2luOiBza2J1ZmYgdGhhdCB3ZSBhcmUgcHVsbGluZyB0aGUgZnJhZ3MgZnJvbQpAQCAtMjg5LDYgKzI0NiwxMCBAQAogCXJldHVybiBjb3VudDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdmc19lbmFibGVfaW50c19mb3BzID0geworCS53cml0ZSA9IGVuYWJsZV9pbnRzX3dyaXRlLAorfTsKKwogLyoqCiAgKgl2aXNvcm5pY19zZXJ2ZXJkb3duX2NvbXBsZXRlIC0gSU9QQVJUIHdlbnQgZG93biwgcGF1c2UgZGV2aWNlCiAgKglAd29yazogV29yayBxdWV1ZSBpdCB3YXMgc2NoZWR1bGVkIG9uCkBAIC00MjUsOSArMzg2LDkgQEAKIAlpZiAoKGNtZHJzcC0+bmV0LnJjdnBvc3QuZnJhZy5waV9vZmYgKyBza2ItPmxlbikgPD0gUElfUEFHRV9TSVpFKSB7CiAJCWNtZHJzcC0+bmV0LnR5cGUgPSBORVRfUkNWX1BPU1Q7CiAJCWNtZHJzcC0+Y21kdHlwZSA9IENNRF9ORVRfVFlQRTsKLQkJaWYgKHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoZGV2ZGF0YS0+ZGV2LT52aXNvcmNoYW5uZWwsCi0JCQkJCSAgICAgIElPQ0hBTl9UT19JT1BBUlQsCi0JCQkJCSAgICAgIGNtZHJzcCkpIHsKKwkJaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAorCQkJCQkgICAgICAgSU9DSEFOX1RPX0lPUEFSVCwKKwkJCQkJICAgICAgIGNtZHJzcCkpIHsKIAkJCWF0b21pY19pbmMoJmRldmRhdGEtPm51bV9yY3ZidWZfaW5faW92bSk7CiAJCQlkZXZkYXRhLT5jaHN0YXQuc2VudF9wb3N0Kys7CiAJCX0gZWxzZSB7CkBAIC00NTQsOSArNDE1LDkgQEAKIAlkZXZkYXRhLT5jbWRyc3BfcmN2LT5uZXQuZW5iZGlzLmNvbnRleHQgPSBuZXRkZXY7CiAJZGV2ZGF0YS0+Y21kcnNwX3Jjdi0+bmV0LnR5cGUgPSBORVRfUkNWX0VOQkRJUzsKIAlkZXZkYXRhLT5jbWRyc3BfcmN2LT5jbWR0eXBlID0gQ01EX05FVF9UWVBFOwotCWlmICh2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAotCQkJCSAgICAgIElPQ0hBTl9UT19JT1BBUlQsCi0JCQkJICAgICAgZGV2ZGF0YS0+Y21kcnNwX3JjdikpCisJaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAorCQkJCSAgICAgICBJT0NIQU5fVE9fSU9QQVJULAorCQkJCSAgICAgICBkZXZkYXRhLT5jbWRyc3BfcmN2KSkKIAkJZGV2ZGF0YS0+Y2hzdGF0LnNlbnRfZW5iZGlzKys7CiB9CiAKQEAgLTkyMCw4ICs4ODEsOCBAQAogCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCX0KIAotCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChkZXZkYXRhLT5kZXYtPnZpc29yY2hhbm5lbCwKLQkJCQkgICAgICAgSU9DSEFOX1RPX0lPUEFSVCwgY21kcnNwKSkgeworCWlmICh2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAorCQkJCSAgICAgIElPQ0hBTl9UT19JT1BBUlQsIGNtZHJzcCkpIHsKIAkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZkYXRhLT5wcml2X2xvY2ssIGZsYWdzKTsKIAkJZGV2ZGF0YS0+YnVzeV9jbnQrKzsKQEAgLTE1MjIsNiArMTQ4MywxMSBAQAogCXJldHVybiBieXRlc19yZWFkOwogfQogCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqdmlzb3JuaWNfZGVidWdmc19kaXI7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z2ZzX2luZm9fZm9wcyA9IHsKKwkucmVhZCA9IGluZm9fZGVidWdmc19yZWFkLAorfTsKKwogLyoqCiAgKglzZW5kX3Jjdl9wb3N0c19pZl9uZWVkZWQKICAqCUBkZXZkYXRhOiB2aXNvcm5pYyBkZXZpY2UKQEAgLTE1NzMsOSArMTUzOSw5IEBACiBzdGF0aWMgdm9pZAogZHJhaW5fcmVzcF9xdWV1ZShzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3AsIHN0cnVjdCB2aXNvcm5pY19kZXZkYXRhICpkZXZkYXRhKQogewotCXdoaWxlICh2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAotCQkJCQkgSU9DSEFOX0ZST01fSU9QQVJULAotCQkJCQkgY21kcnNwKSkKKwl3aGlsZSAoIXZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoZGV2ZGF0YS0+ZGV2LT52aXNvcmNoYW5uZWwsCisJCQkJCSAgSU9DSEFOX0ZST01fSU9QQVJULAorCQkJCQkgIGNtZHJzcCkpCiAJCTsKIH0KIApAQCAtMTU4Niw3ICsxNTUyLDcgQEAKICAqCiAgKglEcmFpbiB0aGUgcmVzcG9uZXMgcXVldWUgb2YgYW55IHJlc3BvbnNlcyBmcm9tIHRoZSBJTyBwYXJ0aXRpb24uCiAgKglQcm9jZXNzIHRoZSByZXNwb25zZXMgYXMgd2UgZ2V0IHRoZW0uCi0gKglSZXR1cm5zIHdoZW4gcmVzcG9uc2UgcXVldWUgaXMgZW1wdHkgb3Igd2hlbiB0aGUgdGhyZWFkZCBzdG9wcy4KKyAqCVJldHVybnMgd2hlbiByZXNwb25zZSBxdWV1ZSBpcyBlbXB0eSBvciB3aGVuIHRoZSB0aHJlYWQgc3RvcHMuCiAgKi8KIHN0YXRpYyB2b2lkCiBzZXJ2aWNlX3Jlc3BfcXVldWUoc3RydWN0IHVpc2NtZHJzcCAqY21kcnNwLCBzdHJ1Y3Qgdmlzb3JuaWNfZGV2ZGF0YSAqZGV2ZGF0YSwKQEAgLTE1OTksOSArMTU2NSw5IEBACiAJLyogVE9ETzogQ0xJRU5UIEFDUVVJUkUgLS0gRG9uJ3QgcmVhbGx5IG5lZWQgdGhpcyBhdCB0aGUKIAkgKiBtb21lbnQKIAkgKi8KLQkJaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAotCQkJCQkgICAgICAgSU9DSEFOX0ZST01fSU9QQVJULAotCQkJCQkgICAgICAgY21kcnNwKSkKKwkJaWYgKHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoZGV2ZGF0YS0+ZGV2LT52aXNvcmNoYW5uZWwsCisJCQkJCSAgICAgIElPQ0hBTl9GUk9NX0lPUEFSVCwKKwkJCQkJICAgICAgY21kcnNwKSkKIAkJCWJyZWFrOyAvKiBxdWV1ZSBlbXB0eSAqLwogCiAJCXN3aXRjaCAoY21kcnNwLT5uZXQudHlwZSkgewpAQCAtMjA2MSw2ICsyMDI3LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIFRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSB2aXNvciBidXMgZHJpdmVyIHdoaWNoIHR5cGVzIG9mIHZpc29yIGRldmljZXMKKyAqIHdlIHN1cHBvcnQsIGFuZCB3aGF0IGZ1bmN0aW9ucyB0byBjYWxsIHdoZW4gYSB2aXNvciBkZXZpY2UgdGhhdCB3ZSBzdXBwb3J0CisgKiBpcyBhdHRhY2hlZCBvciByZW1vdmVkLgorICovCitzdGF0aWMgc3RydWN0IHZpc29yX2RyaXZlciB2aXNvcm5pY19kcml2ZXIgPSB7CisJLm5hbWUgPSAidmlzb3JuaWMiLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5jaGFubmVsX3R5cGVzID0gdmlzb3JuaWNfY2hhbm5lbF90eXBlcywKKwkucHJvYmUgPSB2aXNvcm5pY19wcm9iZSwKKwkucmVtb3ZlID0gdmlzb3JuaWNfcmVtb3ZlLAorCS5wYXVzZSA9IHZpc29ybmljX3BhdXNlLAorCS5yZXN1bWUgPSB2aXNvcm5pY19yZXN1bWUsCisJLmNoYW5uZWxfaW50ZXJydXB0ID0gTlVMTCwKK307CisKIC8qKgogICoJdmlzb3JuaWNfaW5pdAktIEluaXQgZnVuY3Rpb24KICAqCkBAIC0yMTE1LDUgKzIwOTYsNCBAQAogCiBNT0RVTEVfQVVUSE9SKCJVbmlzeXMiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTigic1BBUiBuaWMgZHJpdmVyIGZvciBzcGFybGludXg6IHZlciAxLjAuMC4wIik7Ci1NT0RVTEVfVkVSU0lPTigiMS4wLjAuMCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJzLVBhciBOSUMgZHJpdmVyIGZvciB2aXJ0dWFsIG5ldHdvcmsgZGV2aWNlcyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3NmZiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL0tjb25maWcKQEAgLTAsMCArMSw5IEBACitjb25maWcgQkNNMjcwOF9WQ0hJUQorCXRyaXN0YXRlICJWaWRlb2NvcmUgVkNISVEiCisJZGVwZW5kcyBvbiBSQVNQQkVSUllQSV9GSVJNV0FSRSAmJiBCUk9LRU4KKwlkZWZhdWx0IHkKKwloZWxwCisJCUtlcm5lbCB0byBWaWRlb0NvcmUgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UgZm9yIHRoZQorCQlCQ00yNzA4IGZhbWlseSBvZiBwcm9kdWN0cy4KKwkJRGVmYXVsdHMgdG8gWSB3aGVuIHRoZSBCcm9hZGNvbSBWaWRlb2NvcmUgc2VydmljZXMKKwkJYXJlIGluY2x1ZGVkIGluIHRoZSBidWlsZCwgTiBvdGhlcndpc2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYWI0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9NYWtlZmlsZQpAQCAtMCwwICsxLDE0IEBACitvYmotJChDT05GSUdfQkNNMjcwOF9WQ0hJUSkJKz0gdmNoaXEubworCit2Y2hpcS1vYmpzIDo9IFwKKyAgIGludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfY29yZS5vICBcCisgICBpbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2FybS5vIFwKKyAgIGludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfa2Vybl9saWIubyBcCisgICBpbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxXzI4MzVfYXJtLm8gXAorICAgaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9kZWJ1Z2ZzLm8gXAorICAgaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9zaGltLm8gXAorICAgaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV91dGlsLm8gXAorICAgaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jb25uZWN0ZWQubyBcCisKK2NjZmxhZ3MteSArPSAtRFZDT1NfVkVSSUZZX0JLUFRTPTEgLUlkcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcyAtRFVTRV9WQ0hJUV9BUk0gLURfX1ZDQ09SRVZFUl9fPTB4MDQwMDAwMDAKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvY29ubmVjdGlvbnMvY29ubmVjdGlvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvY29ubmVjdGlvbnMvY29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZjZhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaS9jb25uZWN0aW9ucy9jb25uZWN0aW9uLmgKQEAgLTAsMCArMSwzMjggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQ09OTkVDVElPTl9IXworI2RlZmluZSBDT05ORUNUSU9OX0hfCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlL3ZjaGkvdmNoaV9jZmdfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UvdmNoaS92Y2hpX2NvbW1vbi5oIgorI2luY2x1ZGUgImludGVyZmFjZS92Y2hpL21lc3NhZ2VfZHJpdmVycy9tZXNzYWdlLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBHbG9iYWwgZGVmcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBPcGFxdWUgaGFuZGxlIGZvciBhIGNvbm5lY3Rpb24gLyBzZXJ2aWNlIHBhaXIKK3R5cGVkZWYgc3RydWN0IG9wYXF1ZV92Y2hpX2Nvbm5lY3Rpb25fY29ubmVjdGVkX3NlcnZpY2VfaGFuZGxlX3QgKlZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UOworCisvLyBvcGFxdWUgaGFuZGxlIHRvIHRoZSBjb25uZWN0aW9uIHN0YXRlIGluZm9ybWF0aW9uCit0eXBlZGVmIHN0cnVjdCBvcGFxdWVfdmNoaV9jb25uZWN0aW9uX2luZm9fdCBWQ0hJX0NPTk5FQ1RJT05fU1RBVEVfVDsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaV9jb25uZWN0aW9uX3QgVkNISV9DT05ORUNUSU9OX1Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBSb3V0aW5lIHRvIGluaXQgYSBjb25uZWN0aW9uIHdpdGggYSBwYXJ0aWN1bGFyIGxvdyBsZXZlbCBkcml2ZXIKK3R5cGVkZWYgVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKiAoKlZDSElfQ09OTkVDVElPTl9JTklUX1QpKCBzdHJ1Y3QgdmNoaV9jb25uZWN0aW9uX3QgKiBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZDSElfTUVTU0FHRV9EUklWRVJfVCAqIGRyaXZlciApOworCisvLyBSb3V0aW5lIHRvIGNvbnRyb2wgQ1JDIGVuYWJsaW5nIGF0IGEgY29ubmVjdGlvbiBsZXZlbAordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX0NSQ19DT05UUk9MX1QpKCBWQ0hJX0NPTk5FQ1RJT05fU1RBVEVfVCAqc3RhdGVfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0NSQ19DT05UUk9MX1QgY29udHJvbCApOworCisvLyBSb3V0aW5lIHRvIGNyZWF0ZSBhIHNlcnZpY2UKK3R5cGVkZWYgaW50MzJfdCAoKlZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0NPTk5FQ1RfVCkoIFZDSElfQ09OTkVDVElPTl9TVEFURV9UICpzdGF0ZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcnZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByeF9maWZvX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0eF9maWZvX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9DQUxMQkFDS19UIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2FsbGJhY2tfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdhbnRfY3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3YW50X3VuYWxpZ25lZF9idWxrX3J4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3YW50X3VuYWxpZ25lZF9idWxrX3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1QgKnNlcnZpY2VfaGFuZGxlICk7CisKKy8vIFJvdXRpbmUgdG8gY2xvc2UgYSBzZXJ2aWNlCit0eXBlZGVmIGludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9ESVNDT05ORUNUX1QpKCBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlX2hhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIHF1ZXVlIGEgbWVzc2FnZQordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfUVVFVUVfTUVTU0FHRV9UKSggVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnX2hhbmRsZSApOworCisvLyBzY2F0dGVyLWdhdGhlciAodmVjdG9yKSBtZXNzYWdlIHF1ZXVlaW5nCit0eXBlZGVmIGludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9RVUVVRV9NRVNTQUdFVl9UKSggVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9NU0dfVkVDVE9SX1QgKnZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnX2hhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIGRlcXVldWUgYSBtZXNzYWdlCit0eXBlZGVmIGludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9ERVFVRVVFX01FU1NBR0VfVCkoIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhfZGF0YV9zaXplX3RvX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICphY3R1YWxfbXNnX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncyApOworCisvLyBSb3V0aW5lIHRvIHBlZWsgYXQgYSBtZXNzYWdlCit0eXBlZGVmIGludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9QRUVLX01FU1NBR0VfVCkoIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm1zZ19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MgKTsKKworLy8gUm91dGluZSB0byBob2xkIGEgbWVzc2FnZQordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSE9MRF9NRVNTQUdFX1QpKCBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICptc2dfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqbWVzc2FnZV9oYW5kbGUgKTsKKworLy8gUm91dGluZSB0byBpbml0aWFsaXNlIGEgcmVjZWl2ZWQgbWVzc2FnZSBpdGVyYXRvcgordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfTE9PS0FIRUFEX01FU1NBR0VfVCkoIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfTVNHX0lURVJfVCAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MgKTsKKworLy8gUm91dGluZSB0byByZWxlYXNlIGEgaGVsZCBtZXNzYWdlCit0eXBlZGVmIGludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fSEVMRF9NU0dfUkVMRUFTRV9UKSggVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbWVzc2FnZV9oYW5kbGUgKTsKKworLy8gUm91dGluZSB0byBnZXQgaW5mbyBvbiBhIGhlbGQgbWVzc2FnZQordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX0hFTERfTVNHX0lORk9fVCkoIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1lc3NhZ2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKm1zZ19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp0eF90aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJ4X3RpbWVzdGFtcCApOworCisvLyBSb3V0aW5lIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGl0ZXJhdG9yIGhhcyBhIG5leHQgbWVzc2FnZQordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX01TR19JVEVSX0hBU19ORVhUX1QpKCBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZDSElfTVNHX0lURVJfVCAqaXRlciApOworCisvLyBSb3V0aW5lIHRvIGFkdmFuY2UgdGhlIGl0ZXJhdG9yCit0eXBlZGVmIGludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fTVNHX0lURVJfTkVYVF9UKSggVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX01TR19JVEVSX1QgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm1zZ19zaXplICk7CisKKy8vIFJvdXRpbmUgdG8gcmVtb3ZlIHRoZSBsYXN0IG1lc3NhZ2UgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCit0eXBlZGVmIGludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fTVNHX0lURVJfUkVNT1ZFX1QpKCBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9NU0dfSVRFUl9UICppdGVyICk7CisKKy8vIFJvdXRpbmUgdG8gaG9sZCB0aGUgbGFzdCBtZXNzYWdlIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX01TR19JVEVSX0hPTERfVCkoIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9NU0dfSVRFUl9UICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiptc2dfaGFuZGxlICk7CisKKy8vIFJvdXRpbmUgdG8gdHJhbnNtaXQgYnVsayBkYXRhCit0eXBlZGVmIGludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fQlVMS19RVUVVRV9UUkFOU01JVF9UKSggVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YV9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWxrX2hhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIHJlY2VpdmUgZGF0YQordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX0JVTEtfUVVFVUVfUkVDRUlWRV9UKSggVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhX2RzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1bGtfaGFuZGxlICk7CisKKy8vIFJvdXRpbmUgdG8gcmVwb3J0IGlmIGEgc2VydmVyIGlzIGF2YWlsYWJsZQordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX1NFUlZFUl9QUkVTRU5UKSggVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlLCBpbnQzMl90IHNlcnZpY2VfaWQsIGludDMyX3QgcGVlcl9mbGFncyApOworCisvLyBSb3V0aW5lIHRvIHJlcG9ydCB0aGUgbnVtYmVyIG9mIFJYIHNsb3RzIGF2YWlsYWJsZQordHlwZWRlZiBpbnQgKCpWQ0hJX0NPTk5FQ1RJT05fUlhfU0xPVFNfQVZBSUxBQkxFKSggY29uc3QgVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlICk7CisKKy8vIFJvdXRpbmUgdG8gcmVwb3J0IHRoZSBSWCBzbG90IHNpemUKK3R5cGVkZWYgdWludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fUlhfU0xPVF9TSVpFKSggY29uc3QgVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlICk7CisKKy8vIENhbGxiYWNrIHRvIGluZGljYXRlIHRoYXQgdGhlIG90aGVyIHNpZGUgaGFzIGFkZGVkIGEgYnVmZmVyIHRvIHRoZSByeCBidWxrIERNQSBGSUZPCit0eXBlZGVmIHZvaWQgKCpWQ0hJX0NPTk5FQ1RJT05fUlhfQlVMS19CVUZGRVJfQURERUQpKFZDSElfQ09OTkVDVElPTl9TVEFURV9UICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FU1NBR0VfVFhfQ0hBTk5FTF9UIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxfcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9vZmZzZXQpOworCisvLyBDYWxsYmFjayB0byBpbmZvcm0gYSBzZXJ2aWNlIHRoYXQgYSBYb24gb3IgWG9mZiBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkCit0eXBlZGVmIHZvaWQgKCpWQ0hJX0NPTk5FQ1RJT05fRkxPV19DT05UUk9MKShWQ0hJX0NPTk5FQ1RJT05fU1RBVEVfVCAqc3RhdGUsIGludDMyX3Qgc2VydmljZV9pZCwgaW50MzJfdCB4b2ZmKTsKKworLy8gQ2FsbGJhY2sgdG8gaW5mb3JtIGEgc2VydmljZSB0aGF0IGEgc2VydmVyIGF2YWlsYWJsZSByZXBseSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkCit0eXBlZGVmIHZvaWQgKCpWQ0hJX0NPTk5FQ1RJT05fU0VSVkVSX0FWQUlMQUJMRV9SRVBMWSkoVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlLCBpbnQzMl90IHNlcnZpY2VfaWQsIHVpbnQzMl90IGZsYWdzKTsKKworLy8gQ2FsbGJhY2sgdG8gaW5kaWNhdGUgdGhhdCBidWxrIGF1eGlsaWFyeSBtZXNzYWdlcyBoYXZlIGFycml2ZWQKK3R5cGVkZWYgdm9pZCAoKlZDSElfQ09OTkVDVElPTl9CVUxLX0FVWF9SRUNFSVZFRCkoVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlKTsKKworLy8gQ2FsbGJhY2sgdG8gaW5kaWNhdGUgdGhhdCBidWxrIGF1eGlsaWFyeSBtZXNzYWdlcyBoYXZlIGFycml2ZWQKK3R5cGVkZWYgdm9pZCAoKlZDSElfQ09OTkVDVElPTl9CVUxLX0FVWF9UUkFOU01JVFRFRCkoVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlLCB2b2lkICpoYW5kbGUpOworCisvLyBDYWxsYmFjayB3aXRoIGFsbCB0aGUgY29ubmVjdGlvbiBpbmZvIHlvdSByZXF1aXJlCit0eXBlZGVmIHZvaWQgKCpWQ0hJX0NPTk5FQ1RJT05fSU5GTykoVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlLCB1aW50MzJfdCBwcm90b2NvbF92ZXJzaW9uLCB1aW50MzJfdCBzbG90X3NpemUsIHVpbnQzMl90IG51bV9zbG90cywgdWludDMyX3QgbWluX2J1bGtfc2l6ZSk7CisKKy8vIENhbGxiYWNrIHRvIGluZm9ybSBvZiBhIGRpc2Nvbm5lY3QKK3R5cGVkZWYgdm9pZCAoKlZDSElfQ09OTkVDVElPTl9ESVNDT05ORUNUKShWQ0hJX0NPTk5FQ1RJT05fU1RBVEVfVCAqc3RhdGUsIHVpbnQzMl90IGZsYWdzKTsKKworLy8gQ2FsbGJhY2sgdG8gaW5mb3JtIG9mIGEgcG93ZXIgY29udHJvbCByZXF1ZXN0Cit0eXBlZGVmIHZvaWQgKCpWQ0hJX0NPTk5FQ1RJT05fUE9XRVJfQ09OVFJPTCkoVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlLCBNRVNTQUdFX1RYX0NIQU5ORUxfVCBjaGFubmVsLCBpbnQzMl90IGVuYWJsZSk7CisKKy8vIGFsbG9jYXRlIG1lbW9yeSBzdWl0YWJseSBhbGlnbmVkIGZvciB0aGlzIGNvbm5lY3Rpb24KK3R5cGVkZWYgdm9pZCAqICgqVkNISV9CVUZGRVJfQUxMT0NBVEUpKFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfaGFuZGxlLCB1aW50MzJfdCAqIGxlbmd0aCk7CisKKy8vIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSBidWZmZXJfYWxsb2NhdGUKK3R5cGVkZWYgdm9pZCAgICgqVkNISV9CVUZGRVJfRlJFRSkoVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZV9oYW5kbGUsIHZvaWQgKiBhZGRyZXNzKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgU3lzdGVtIGRyaXZlciBzdHJ1Y3QKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IG9wYXF1ZV92Y2hpX2Nvbm5lY3Rpb25fYXBpX3QKK3sKKyAgIC8vIFJvdXRpbmUgdG8gaW5pdCB0aGUgY29ubmVjdGlvbgorICAgVkNISV9DT05ORUNUSU9OX0lOSVRfVCAgICAgICAgICAgICAgICAgICAgICBpbml0OworCisgICAvLyBDb25uZWN0aW9uLWxldmVsIENSQyBjb250cm9sCisgICBWQ0hJX0NPTk5FQ1RJT05fQ1JDX0NPTlRST0xfVCAgICAgICAgICAgICAgIGNyY19jb250cm9sOworCisgICAvLyBSb3V0aW5lIHRvIGNvbm5lY3QgdG8gb3IgY3JlYXRlIHNlcnZpY2UKKyAgIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0NPTk5FQ1RfVCAgICAgICAgICAgc2VydmljZV9jb25uZWN0OworCisgICAvLyBSb3V0aW5lIHRvIGRpc2Nvbm5lY3QgZnJvbSBhIHNlcnZpY2UKKyAgIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0RJU0NPTk5FQ1RfVCAgICAgICAgc2VydmljZV9kaXNjb25uZWN0OworCisgICAvLyBSb3V0aW5lIHRvIHF1ZXVlIGEgbWVzc2FnZQorICAgVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfUVVFVUVfTUVTU0FHRV9UICAgICBzZXJ2aWNlX3F1ZXVlX21zZzsKKworICAgLy8gc2NhdHRlci1nYXRoZXIgKHZlY3RvcikgbWVzc2FnZSBxdWV1ZQorICAgVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfUVVFVUVfTUVTU0FHRVZfVCAgICBzZXJ2aWNlX3F1ZXVlX21zZ3Y7CisKKyAgIC8vIFJvdXRpbmUgdG8gZGVxdWV1ZSBhIG1lc3NhZ2UKKyAgIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0RFUVVFVUVfTUVTU0FHRV9UICAgc2VydmljZV9kZXF1ZXVlX21zZzsKKworICAgLy8gUm91dGluZSB0byBwZWVrIGF0IGEgbWVzc2FnZQorICAgVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfUEVFS19NRVNTQUdFX1QgICAgICBzZXJ2aWNlX3BlZWtfbXNnOworCisgICAvLyBSb3V0aW5lIHRvIGhvbGQgYSBtZXNzYWdlCisgICBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9IT0xEX01FU1NBR0VfVCAgICAgIHNlcnZpY2VfaG9sZF9tc2c7CisKKyAgIC8vIFJvdXRpbmUgdG8gaW5pdGlhbGlzZSBhIHJlY2VpdmVkIG1lc3NhZ2UgaXRlcmF0b3IKKyAgIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0xPT0tBSEVBRF9NRVNTQUdFX1Qgc2VydmljZV9sb29rX2FoZWFkX21zZzsKKworICAgLy8gUm91dGluZSB0byByZWxlYXNlIGEgbWVzc2FnZQorICAgVkNISV9DT05ORUNUSU9OX0hFTERfTVNHX1JFTEVBU0VfVCAgICAgICAgICBoZWxkX21zZ19yZWxlYXNlOworCisgICAvLyBSb3V0aW5lIHRvIGdldCBpbmZvcm1hdGlvbiBvbiBhIGhlbGQgbWVzc2FnZQorICAgVkNISV9DT05ORUNUSU9OX0hFTERfTVNHX0lORk9fVCAgICAgICAgICAgICBoZWxkX21zZ19pbmZvOworCisgICAvLyBSb3V0aW5lIHRvIGNoZWNrIGZvciBuZXh0IG1lc3NhZ2Ugb24gaXRlcmF0b3IKKyAgIFZDSElfQ09OTkVDVElPTl9NU0dfSVRFUl9IQVNfTkVYVF9UICAgICAgICAgbXNnX2l0ZXJfaGFzX25leHQ7CisKKyAgIC8vIFJvdXRpbmUgdG8gZ2V0IG5leHQgbWVzc2FnZSBvbiBpdGVyYXRvcgorICAgVkNISV9DT05ORUNUSU9OX01TR19JVEVSX05FWFRfVCAgICAgICAgICAgICBtc2dfaXRlcl9uZXh0OworCisgICAvLyBSb3V0aW5lIHRvIHJlbW92ZSB0aGUgbGFzdCBtZXNzYWdlIHJldHVybmVkIGJ5IGl0ZXJhdG9yCisgICBWQ0hJX0NPTk5FQ1RJT05fTVNHX0lURVJfUkVNT1ZFX1QgICAgICAgICAgIG1zZ19pdGVyX3JlbW92ZTsKKworICAgLy8gUm91dGluZSB0byBob2xkIHRoZSBsYXN0IG1lc3NhZ2UgcmV0dXJuZWQgYnkgaXRlcmF0b3IKKyAgIFZDSElfQ09OTkVDVElPTl9NU0dfSVRFUl9IT0xEX1QgICAgICAgICAgICAgbXNnX2l0ZXJfaG9sZDsKKworICAgLy8gUm91dGluZSB0byB0cmFuc21pdCBidWxrIGRhdGEKKyAgIFZDSElfQ09OTkVDVElPTl9CVUxLX1FVRVVFX1RSQU5TTUlUX1QgICAgICAgYnVsa19xdWV1ZV90cmFuc21pdDsKKworICAgLy8gUm91dGluZSB0byByZWNlaXZlIGRhdGEKKyAgIFZDSElfQ09OTkVDVElPTl9CVUxLX1FVRVVFX1JFQ0VJVkVfVCAgICAgICAgYnVsa19xdWV1ZV9yZWNlaXZlOworCisgICAvLyBSb3V0aW5lIHRvIHJlcG9ydCB0aGUgYXZhaWxhYmxlIHNlcnZlcnMKKyAgIFZDSElfQ09OTkVDVElPTl9TRVJWRVJfUFJFU0VOVCAgICAgICAgICAgICAgc2VydmVyX3ByZXNlbnQ7CisKKyAgIC8vIFJvdXRpbmUgdG8gcmVwb3J0IHRoZSBudW1iZXIgb2YgUlggc2xvdHMgYXZhaWxhYmxlCisgICBWQ0hJX0NPTk5FQ1RJT05fUlhfU0xPVFNfQVZBSUxBQkxFICAgICAgICAgIGNvbm5lY3Rpb25fcnhfc2xvdHNfYXZhaWxhYmxlOworCisgICAvLyBSb3V0aW5lIHRvIHJlcG9ydCB0aGUgUlggc2xvdCBzaXplCisgICBWQ0hJX0NPTk5FQ1RJT05fUlhfU0xPVF9TSVpFICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25fcnhfc2xvdF9zaXplOworCisgICAvLyBDYWxsYmFjayB0byBpbmRpY2F0ZSB0aGF0IHRoZSBvdGhlciBzaWRlIGhhcyBhZGRlZCBhIGJ1ZmZlciB0byB0aGUgcnggYnVsayBETUEgRklGTworICAgVkNISV9DT05ORUNUSU9OX1JYX0JVTEtfQlVGRkVSX0FEREVEICAgICAgICByeF9idWxrX2J1ZmZlcl9hZGRlZDsKKworICAgLy8gQ2FsbGJhY2sgdG8gaW5mb3JtIGEgc2VydmljZSB0aGF0IGEgWG9uIG9yIFhvZmYgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZAorICAgVkNISV9DT05ORUNUSU9OX0ZMT1dfQ09OVFJPTCAgICAgICAgICAgICAgICBmbG93X2NvbnRyb2w7CisKKyAgIC8vIENhbGxiYWNrIHRvIGluZm9ybSBhIHNlcnZpY2UgdGhhdCBhIHNlcnZlciBhdmFpbGFibGUgcmVwbHkgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZAorICAgVkNISV9DT05ORUNUSU9OX1NFUlZFUl9BVkFJTEFCTEVfUkVQTFkgICAgICBzZXJ2ZXJfYXZhaWxhYmxlX3JlcGx5OworCisgICAvLyBDYWxsYmFjayB0byBpbmRpY2F0ZSB0aGF0IGJ1bGsgYXV4aWxpYXJ5IG1lc3NhZ2VzIGhhdmUgYXJyaXZlZAorICAgVkNISV9DT05ORUNUSU9OX0JVTEtfQVVYX1JFQ0VJVkVEICAgICAgICAgICBidWxrX2F1eF9yZWNlaXZlZDsKKworICAgLy8gQ2FsbGJhY2sgdG8gaW5kaWNhdGUgdGhhdCBhIGJ1bGsgYXV4aWxpYXJ5IG1lc3NhZ2UgaGFzIGJlZW4gdHJhbnNtaXR0ZWQKKyAgIFZDSElfQ09OTkVDVElPTl9CVUxLX0FVWF9UUkFOU01JVFRFRCAgICAgICAgYnVsa19hdXhfdHJhbnNtaXR0ZWQ7CisKKyAgIC8vIENhbGxiYWNrIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbm5lY3Rpb24KKyAgIFZDSElfQ09OTkVDVElPTl9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbl9pbmZvOworCisgICAvLyBDYWxsYmFjayB0byBub3RpZnkgdGhhdCBwZWVyIGhhcyByZXF1ZXN0ZWQgZGlzY29ubmVjdAorICAgVkNISV9DT05ORUNUSU9OX0RJU0NPTk5FQ1QgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0OworCisgICAvLyBDYWxsYmFjayB0byBub3RpZnkgdGhhdCBwZWVyIGhhcyByZXF1ZXN0ZWQgcG93ZXIgY2hhbmdlCisgICBWQ0hJX0NPTk5FQ1RJT05fUE9XRVJfQ09OVFJPTCAgICAgICAgICAgICAgIHBvd2VyX2NvbnRyb2w7CisKKyAgIC8vIGFsbG9jYXRlIG1lbW9yeSBzdWl0YWJseSBhbGlnbmVkIGZvciB0aGlzIGNvbm5lY3Rpb24KKyAgIFZDSElfQlVGRkVSX0FMTE9DQVRFICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2FsbG9jYXRlOworCisgICAvLyBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgYnVmZmVyX2FsbG9jYXRlCisgICBWQ0hJX0JVRkZFUl9GUkVFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9mcmVlOworCit9OworCitzdHJ1Y3QgdmNoaV9jb25uZWN0aW9uX3QgeworICAgY29uc3QgVkNISV9DT05ORUNUSU9OX0FQSV9UICphcGk7CisgICBWQ0hJX0NPTk5FQ1RJT05fU1RBVEVfVCAgICAgKnN0YXRlOworI2lmZGVmIFZDSElfQ09BUlNFX0xPQ0tJTkcKKyAgIHN0cnVjdCBzZW1hcGhvcmUgICAgICAgICAgICAgc2VtOworI2VuZGlmCit9OworCisKKyNlbmRpZiAvKiBDT05ORUNUSU9OX0hfICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRW5kIG9mIGZpbGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL21lc3NhZ2VfZHJpdmVycy9tZXNzYWdlLmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaS9tZXNzYWdlX2RyaXZlcnMvbWVzc2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiM2Y3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaS9tZXNzYWdlX2RyaXZlcnMvbWVzc2FnZS5oCkBAIC0wLDAgKzEsMjA0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9WQ0hJX01FU1NBR0VfSF8KKyNkZWZpbmUgX1ZDSElfTUVTU0FHRV9IXworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS92Y2hpL3ZjaGlfY2ZnX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlL3ZjaGkvdmNoaV9jb21tb24uaCIKKworCit0eXBlZGVmIGVudW0gbWVzc2FnZV9ldmVudF90eXBlIHsKKyAgIE1FU1NBR0VfRVZFTlRfTk9ORSwKKyAgIE1FU1NBR0VfRVZFTlRfTk9QLAorICAgTUVTU0FHRV9FVkVOVF9NRVNTQUdFLAorICAgTUVTU0FHRV9FVkVOVF9TTE9UX0NPTVBMRVRFLAorICAgTUVTU0FHRV9FVkVOVF9SWF9CVUxLX1BBVVNFRCwKKyAgIE1FU1NBR0VfRVZFTlRfUlhfQlVMS19DT01QTEVURSwKKyAgIE1FU1NBR0VfRVZFTlRfVFhfQ09NUExFVEUsCisgICBNRVNTQUdFX0VWRU5UX01TR19ESVNDQVJERUQKK30gTUVTU0FHRV9FVkVOVF9UWVBFX1Q7CisKK3R5cGVkZWYgZW51bSB2Y2hpX21zZ19mbGFncworeworICAgVkNISV9NU0dfRkxBR1NfTk9ORSAgICAgICAgICAgICAgICAgID0gMHgwLAorICAgVkNISV9NU0dfRkxBR1NfVEVSTUlOQVRFX0RNQSAgICAgICAgID0gMHgxCit9IFZDSElfTVNHX0ZMQUdTX1Q7CisKK3R5cGVkZWYgZW51bSBtZXNzYWdlX3R4X2NoYW5uZWwKK3sKKyAgIE1FU1NBR0VfVFhfQ0hBTk5FTF9NRVNTQUdFICAgICAgICAgICA9IDAsCisgICBNRVNTQUdFX1RYX0NIQU5ORUxfQlVMSyAgICAgICAgICAgICAgPSAxIC8vIGRyaXZlcnMgbWF5IHByb3ZpZGUgbXVsdGlwbGUgYnVsayBjaGFubmVscywgZnJvbSAxIHVwd2FyZHMKK30gTUVTU0FHRV9UWF9DSEFOTkVMX1Q7CisKKy8vIE1hY3JvcyB1c2VkIGZvciBjeWNsaW5nIHRocm91Z2ggYnVsayBjaGFubmVscworI2RlZmluZSBNRVNTQUdFX1RYX0NIQU5ORUxfQlVMS19QUkVWKGMpIChNRVNTQUdFX1RYX0NIQU5ORUxfQlVMSysoKGMpLU1FU1NBR0VfVFhfQ0hBTk5FTF9CVUxLK1ZDSElfTUFYX0JVTEtfVFhfQ0hBTk5FTFNfUEVSX0NPTk5FQ1RJT04tMSklVkNISV9NQVhfQlVMS19UWF9DSEFOTkVMU19QRVJfQ09OTkVDVElPTikKKyNkZWZpbmUgTUVTU0FHRV9UWF9DSEFOTkVMX0JVTEtfTkVYVChjKSAoTUVTU0FHRV9UWF9DSEFOTkVMX0JVTEsrKChjKS1NRVNTQUdFX1RYX0NIQU5ORUxfQlVMSysxKSVWQ0hJX01BWF9CVUxLX1RYX0NIQU5ORUxTX1BFUl9DT05ORUNUSU9OKQorCit0eXBlZGVmIGVudW0gbWVzc2FnZV9yeF9jaGFubmVsCit7CisgICBNRVNTQUdFX1JYX0NIQU5ORUxfTUVTU0FHRSAgICAgICAgICAgPSAwLAorICAgTUVTU0FHRV9SWF9DSEFOTkVMX0JVTEsgICAgICAgICAgICAgID0gMSAvLyBkcml2ZXJzIG1heSBwcm92aWRlIG11bHRpcGxlIGJ1bGsgY2hhbm5lbHMsIGZyb20gMSB1cHdhcmRzCit9IE1FU1NBR0VfUlhfQ0hBTk5FTF9UOworCisvLyBNZXNzYWdlIHJlY2VpdmUgc2xvdCBpbmZvcm1hdGlvbgordHlwZWRlZiBzdHJ1Y3QgcnhfbXNnX3Nsb3RfaW5mbyB7CisKKyAgIHN0cnVjdCByeF9tc2dfc2xvdF9pbmZvICpuZXh0OworICAgLy9zdHJ1Y3Qgc2xvdF9pbmZvICpwcmV2OworI2lmICFkZWZpbmVkIFZDSElfQ09BUlNFX0xPQ0tJTkcKKyAgIHN0cnVjdCBzZW1hcGhvcmUgICBzZW07CisjZW5kaWYKKworICAgdWludDhfdCAgICAgICAgICAgKmFkZHI7ICAgICAgICAgICAgICAgLy8gYmFzZSBhZGRyZXNzIG9mIHNsb3QKKyAgIHVpbnQzMl90ICAgICAgICAgICBsZW47ICAgICAgICAgICAgICAgIC8vIGxlbmd0aCBvZiBzbG90IGluIGJ5dGVzCisKKyAgIHVpbnQzMl90ICAgICAgICAgICB3cml0ZV9wdHI7ICAgICAgICAgIC8vIGhhcmR3YXJlIGNhdXNlcyB0aGlzIHRvIGFkdmFuY2UKKyAgIHVpbnQzMl90ICAgICAgICAgICByZWFkX3B0cjsgICAgICAgICAgIC8vIHRoaXMgbW9kdWxlIGRvZXMgdGhlIHJlYWRpbmcKKyAgIGludCAgICAgICAgICAgICAgICBhY3RpdmU7ICAgICAgICAgICAgIC8vIGlzIHRoaXMgc2xvdCBpbiB0aGUgaGFyZHdhcmUgZG1hIGZpZm8/CisgICB1aW50MzJfdCAgICAgICAgICAgbXNnc19wYXJzZWQ7ICAgICAgICAvLyBjb3VudCBob3cgbWFueSBtZXNzYWdlcyBhcmUgaW4gdGhpcyBzbG90CisgICB1aW50MzJfdCAgICAgICAgICAgbXNnc19yZWxlYXNlZDsgICAgICAvLyBob3cgbWFueSBtZXNzYWdlcyBoYXZlIGJlZW4gcmVsZWFzZWQKKyAgIHZvaWQgICAgICAgICAgICAgICpzdGF0ZTsgICAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gc3RhdGUgaW5mb3JtYXRpb24KKyAgIHVpbnQ4X3QgICAgICAgICAgICByZWZfY291bnRbVkNISV9NQVhfU0VSVklDRVNfUEVSX0NPTk5FQ1RJT05dOyAgICAgICAgICAvLyByZWZlcmVuY2UgY291bnQgZm9yIHNsb3RzIGhlbGQgYnkgc2VydmljZXMKK30gUlhfTVNHX1NMT1RJTkZPX1Q7CisKKy8vIFRoZSBtZXNzYWdlIGRyaXZlciBubyBsb25nZXIgbmVlZHMgdG8ga25vdyBhYm91dCB0aGUgZmllbGRzIG9mIFJYX0JVTEtfU0xPVElORk9fVCAtIHNvcnQgdGhpcyBvdXQuCisvLyBJbiBwYXJ0aWN1bGFyLCBpdCBtdXN0bid0IHVzZSBhZGRyIGFuZCBsZW4gLSB0aGV5J3JlIHRoZSBjbGllbnQgYnVmZmVyLCBidXQgdGhlIG1lc3NhZ2UKKy8vIGRyaXZlciB3aWxsIGJlIHRhc2tlZCB3aXRoIHNlbmRpbmcgdGhlIGFsaWduZWQgY29yZSBzZWN0aW9uLgordHlwZWRlZiBzdHJ1Y3QgcnhfYnVsa19zbG90aW5mb190IHsKKyAgIHN0cnVjdCByeF9idWxrX3Nsb3RpbmZvX3QgKm5leHQ7CisKKyAgIHN0cnVjdCBzZW1hcGhvcmUgKmJsb2NraW5nOworCisgICAvLyBuZWVkZWQgYnkgRE1BCisgICB2b2lkICAgICAgICAqYWRkcjsKKyAgIHVpbnQzMl90ICAgICBsZW47CisKKyAgIC8vIG5lZWRlZCBmb3IgdGhlIGNhbGxiYWNrCisgICB2b2lkICAgICAgICAqc2VydmljZTsKKyAgIHZvaWQgICAgICAgICpoYW5kbGU7CisgICBWQ0hJX0ZMQUdTX1QgZmxhZ3M7Cit9IFJYX0JVTEtfU0xPVElORk9fVDsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBlYWNoIGNvbm5lY3Rpb24gZHJpdmVyIHdpbGwgaGF2ZSBhIHBvb2wgb2YgdGhlIGZvbGxvd2luZyBzdHJ1Y3QuCisgKgorICogdGhlIHBvb2wgd2lsbCBiZSBtYW5hZ2VkIGJ5IHZjaGlfcW1hbl8qCisgKiB0aGlzIG1lYW5zIHRoZXJlIHdpbGwgYmUgbXVsdGlwbGUgcXVldWVzIChzaW5nbGUgbGlua2VkIGxpc3RzKQorICogYSBnaXZlbiBzdHJ1Y3QgbWVzc2FnZV9pbmZvIHdpbGwgYmUgb24gZXhhY3RseSBvbmUgb2YgdGhlc2UgcXVldWVzCisgKiBhdCBhbnkgb25lIHRpbWUKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit0eXBlZGVmIHN0cnVjdCByeF9tZXNzYWdlX2luZm8geworCisgICBzdHJ1Y3QgbWVzc2FnZV9pbmZvICpuZXh0OworICAgLy9zdHJ1Y3QgbWVzc2FnZV9pbmZvICpwcmV2OworCisgICB1aW50OF90ICAgICphZGRyOworICAgdWludDMyX3QgICBsZW47CisgICBSWF9NU0dfU0xPVElORk9fVCAqc2xvdDsgLy8gcG9pbnRzIHRvIHdoaWNoZXZlciBzbG90IGNvbnRhaW5zIHRoaXMgbWVzc2FnZQorICAgdWludDMyX3QgICB0eF90aW1lc3RhbXA7CisgICB1aW50MzJfdCAgIHJ4X3RpbWVzdGFtcDsKKworfSBSWF9NRVNTQUdFX0lORk9fVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgTUVTU0FHRV9FVkVOVF9UWVBFX1QgdHlwZTsKKworICAgc3RydWN0IHsKKyAgICAgIC8vIGZvciBtZXNzYWdlcworICAgICAgdm9pZCAgICAqYWRkcjsgICAgICAgICAgIC8vIGFkZHJlc3Mgb2YgbWVzc2FnZQorICAgICAgdWludDE2X3Qgc2xvdF9kZWx0YTsgICAgIC8vIHdoZXRoZXIgdGhpcyBtZXNzYWdlIGluZGljYXRlZCBzbG90IGRlbHRhCisgICAgICB1aW50MzJfdCBsZW47ICAgICAgICAgICAgLy8gbGVuZ3RoIG9mIG1lc3NhZ2UKKyAgICAgIFJYX01TR19TTE9USU5GT19UICpzbG90OyAvLyBzbG90IHRoaXMgbWVzc2FnZSBpcyBpbgorICAgICAgaW50MzJfdCAgc2VydmljZTsgICAvLyBzZXJ2aWNlIGlkIHRoaXMgbWVzc2FnZSBpcyBkZXN0aW5lZCBmb3IKKyAgICAgIHVpbnQzMl90IHR4X3RpbWVzdGFtcDsgICAvLyB0aW1lc3RhbXAgZnJvbSB0aGUgaGVhZGVyCisgICAgICB1aW50MzJfdCByeF90aW1lc3RhbXA7ICAgLy8gdGltZXN0YW1wIHdoZW4gd2UgcGFyc2VkIGl0CisgICB9IG1lc3NhZ2U7CisKKyAgIC8vIEZJWE1FOiBjbGVhbnVwIHNsb3QgcmVwb3J0aW5nLi4uCisgICBSWF9NU0dfU0xPVElORk9fVCAqcnhfbXNnOworICAgUlhfQlVMS19TTE9USU5GT19UICpyeF9idWxrOworICAgdm9pZCAqdHhfaGFuZGxlOworICAgTUVTU0FHRV9UWF9DSEFOTkVMX1QgdHhfY2hhbm5lbDsKKworfSBNRVNTQUdFX0VWRU5UX1Q7CisKKworLy8gY2FsbGJhY2tzCit0eXBlZGVmIHZvaWQgVkNISV9NRVNTQUdFX0RSSVZFUl9FVkVOVF9DQUxMQkFDS19UKCB2b2lkICpzdGF0ZSApOworCit0eXBlZGVmIHN0cnVjdCB7CisgICBWQ0hJX01FU1NBR0VfRFJJVkVSX0VWRU5UX0NBTExCQUNLX1QgKmV2ZW50X2NhbGxiYWNrOworfSBWQ0hJX01FU1NBR0VfRFJJVkVSX09QRU5fVDsKKworCisvLyBoYW5kbGUgdG8gdGhpcyBpbnN0YW5jZSBvZiBtZXNzYWdlIGRyaXZlciAoYXMgcmV0dXJuZWQgYnkgLT5vcGVuKQordHlwZWRlZiBzdHJ1Y3Qgb3BhcXVlX21oYW5kbGVfdCAqVkNISV9NRFJJVkVSX0hBTkRMRV9UOworCitzdHJ1Y3Qgb3BhcXVlX3ZjaGlfbWVzc2FnZV9kcml2ZXJfdCB7CisgICBWQ0hJX01EUklWRVJfSEFORExFX1QgKigqb3BlbikoIFZDSElfTUVTU0FHRV9EUklWRVJfT1BFTl9UICpwYXJhbXMsIHZvaWQgKnN0YXRlICk7CisgICBpbnQzMl90ICgqc3VzcGVuZGluZykoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlICk7CisgICBpbnQzMl90ICgqcmVzdW1lZCkoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlICk7CisgICBpbnQzMl90ICgqcG93ZXJfY29udHJvbCkoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCBNRVNTQUdFX1RYX0NIQU5ORUxfVCwgaW50MzJfdCBlbmFibGUgKTsKKyAgIGludDMyX3QgKCphZGRfbXNnX3J4X3Nsb3QpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgUlhfTVNHX1NMT1RJTkZPX1QgKnNsb3QgKTsgICAgICAvLyByeCBtZXNzYWdlCisgICBpbnQzMl90ICgqYWRkX2J1bGtfcngpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuLCBSWF9CVUxLX1NMT1RJTkZPX1QgKnNsb3QgKTsgIC8vIHJ4IGRhdGEgKGJ1bGspCisgICBpbnQzMl90ICgqc2VuZCkoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCBNRVNTQUdFX1RYX0NIQU5ORUxfVCBjaGFubmVsLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4sIFZDSElfTVNHX0ZMQUdTX1QgZmxhZ3MsIHZvaWQgKnNlbmRfaGFuZGxlICk7ICAgICAgLy8gdHggKG1lc3NhZ2UgJiBidWxrKQorICAgdm9pZCAgICAoKm5leHRfZXZlbnQpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgTUVTU0FHRV9FVkVOVF9UICpldmVudCApOyAgICAgLy8gZ2V0IHRoZSBuZXh0IGV2ZW50IGZyb20gbWVzc2FnZV9kcml2ZXIKKyAgIGludDMyX3QgKCplbmFibGUpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSApOworICAgaW50MzJfdCAoKmZvcm1fbWVzc2FnZSkoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCBpbnQzMl90IHNlcnZpY2VfaWQsIFZDSElfTVNHX1ZFQ1RPUl9UICp2ZWN0b3IsIHVpbnQzMl90IGNvdW50LCB2b2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFkZHJlc3MsIHVpbnQzMl90IGxlbmd0aF9hdmFpbCwgdWludDMyX3QgbWF4X3RvdGFsX2xlbmd0aCwgaW50MzJfdCBwYWRfdG9fZmlsbCwgaW50MzJfdCBhbGxvd19wYXJ0aWFsICk7CisKKyAgIGludDMyX3QgKCp1cGRhdGVfbWVzc2FnZSkoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCB2b2lkICpkZXN0LCBpbnQxNl90ICpzbG90X2NvdW50ICk7CisgICBpbnQzMl90ICgqYnVmZmVyX2FsaWduZWQpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgaW50IHR4LCBpbnQgdW5jYWNoZWQsIGNvbnN0IHZvaWQgKmFkZHJlc3MsIGNvbnN0IHVpbnQzMl90IGxlbmd0aCApOworICAgdm9pZCAqICAoKmFsbG9jYXRlX2J1ZmZlcikoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCB1aW50MzJfdCAqbGVuZ3RoICk7CisgICB2b2lkICAgICgqZnJlZV9idWZmZXIpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgdm9pZCAqYWRkcmVzcyApOworICAgaW50ICAgICAoKnJ4X3Nsb3Rfc2l6ZSkoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCBpbnQgbXNnX3NpemUgKTsKKyAgIGludCAgICAgKCp0eF9zbG90X3NpemUpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgaW50IG1zZ19zaXplICk7CisKKyAgIGludDMyX3QgICgqdHhfc3VwcG9ydHNfdGVybWluYXRlKSggY29uc3QgVkNISV9NRFJJVkVSX0hBTkRMRV9UICpoYW5kbGUsIE1FU1NBR0VfVFhfQ0hBTk5FTF9UIGNoYW5uZWwgKTsKKyAgIHVpbnQzMl90ICgqdHhfYnVsa19jaHVua19zaXplKSggY29uc3QgVkNISV9NRFJJVkVSX0hBTkRMRV9UICpoYW5kbGUsIE1FU1NBR0VfVFhfQ0hBTk5FTF9UIGNoYW5uZWwgKTsKKyAgIGludCAgICAgKCp0eF9hbGlnbm1lbnQpKCBjb25zdCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgTUVTU0FHRV9UWF9DSEFOTkVMX1QgY2hhbm5lbCApOworICAgaW50ICAgICAoKnJ4X2FsaWdubWVudCkoIGNvbnN0IFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCBNRVNTQUdFX1JYX0NIQU5ORUxfVCBjaGFubmVsICk7CisgICB2b2lkICAgICgqZm9ybV9idWxrX2F1eCkoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCBNRVNTQUdFX1RYX0NIQU5ORUxfVCBjaGFubmVsLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4sIHVpbnQzMl90IGNodW5rX3NpemUsIGNvbnN0IHZvaWQgKiphdXhfZGF0YSwgaW50MzJfdCAqYXV4X2xlbiApOworICAgdm9pZCAgICAoKmRlYnVnKSggVkNISV9NRFJJVkVSX0hBTkRMRV9UICpoYW5kbGUgKTsKK307CisKKworI2VuZGlmIC8vIF9WQ0hJX01FU1NBR0VfSF8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgZmlsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGkuaCBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjE3ZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvdmNoaS5oCkBAIC0wLDAgKzEsMzc4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElfSF8KKyNkZWZpbmUgVkNISV9IXworCisjaW5jbHVkZSAiaW50ZXJmYWNlL3ZjaGkvdmNoaV9jZmcuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UvdmNoaS92Y2hpX2NvbW1vbi5oIgorI2luY2x1ZGUgImludGVyZmFjZS92Y2hpL2Nvbm5lY3Rpb25zL2Nvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJ2Y2hpX21oLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEdsb2JhbCBkZWZzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVkNISV9CVUxLX1JPVU5EX1VQKHgpICAgICAoKCgodW5zaWduZWQgbG9uZykoeCkpK1ZDSElfQlVMS19BTElHTi0xKSAmIH4oVkNISV9CVUxLX0FMSUdOLTEpKQorI2RlZmluZSBWQ0hJX0JVTEtfUk9VTkRfRE9XTih4KSAgICgoKHVuc2lnbmVkIGxvbmcpKHgpKSAmIH4oVkNISV9CVUxLX0FMSUdOLTEpKQorI2RlZmluZSBWQ0hJX0JVTEtfQUxJR05fTkJZVEVTKHgpIChWQ0hJX0JVTEtfQUxJR05FRCh4KSA/IDAgOiAoVkNISV9CVUxLX0FMSUdOIC0gKCh1bnNpZ25lZCBsb25nKSh4KSAmIChWQ0hJX0JVTEtfQUxJR04tMSkpKSkKKworI2lmZGVmIFVTRV9WQ0hJUV9BUk0KKyNkZWZpbmUgVkNISV9CVUxLX0FMSUdORUQoeCkgICAgICAxCisjZWxzZQorI2RlZmluZSBWQ0hJX0JVTEtfQUxJR05FRCh4KSAgICAgICgoKHVuc2lnbmVkIGxvbmcpKHgpICYgKFZDSElfQlVMS19BTElHTi0xKSkgPT0gMCkKKyNlbmRpZgorCitzdHJ1Y3QgdmNoaV92ZXJzaW9uIHsKKwl1aW50MzJfdCB2ZXJzaW9uOworCXVpbnQzMl90IHZlcnNpb25fbWluOworfTsKKyNkZWZpbmUgVkNISV9WRVJTSU9OKHZfKSB7IHZfLCB2XyB9CisjZGVmaW5lIFZDSElfVkVSU0lPTl9FWCh2XywgbV8pIHsgdl8sIG1fIH0KKwordHlwZWRlZiBlbnVtCit7CisgICBWQ0hJX1ZFQ19QT0lOVEVSLAorICAgVkNISV9WRUNfSEFORExFLAorICAgVkNISV9WRUNfTElTVAorfSBWQ0hJX01TR19WRUNUT1JfVFlQRV9UOworCit0eXBlZGVmIHN0cnVjdCB2Y2hpX21zZ192ZWN0b3JfZXggeworCisgICBWQ0hJX01TR19WRUNUT1JfVFlQRV9UIHR5cGU7CisgICB1bmlvbgorICAgeworICAgICAgLy8gYSBtZW1vcnkgaGFuZGxlCisgICAgICBzdHJ1Y3QKKyAgICAgIHsKKyAgICAgICAgIFZDSElfTUVNX0hBTkRMRV9UIGhhbmRsZTsKKyAgICAgICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICAgICAgIGludDMyX3QgdmVjX2xlbjsKKyAgICAgIH0gaGFuZGxlOworCisgICAgICAvLyBhbiBvcmRpbmFyeSBkYXRhIHBvaW50ZXIKKyAgICAgIHN0cnVjdAorICAgICAgeworICAgICAgICAgY29uc3Qgdm9pZCAqdmVjX2Jhc2U7CisgICAgICAgICBpbnQzMl90IHZlY19sZW47CisgICAgICB9IHB0cjsKKworICAgICAgLy8gYSBuZXN0ZWQgdmVjdG9yIGxpc3QKKyAgICAgIHN0cnVjdAorICAgICAgeworICAgICAgICAgc3RydWN0IHZjaGlfbXNnX3ZlY3Rvcl9leCAqdmVjOworICAgICAgICAgdWludDMyX3QgdmVjX2xlbjsKKyAgICAgIH0gbGlzdDsKKyAgIH0gdTsKK30gVkNISV9NU0dfVkVDVE9SX0VYX1Q7CisKKworLy8gQ29uc3RydWN0IGFuIGVudHJ5IGluIGEgbXNnIHZlY3RvciBmb3IgYSBwb2ludGVyIChwKSBvZiBsZW5ndGggKGwpCisjZGVmaW5lIFZDSElfVkVDX1BPSU5URVIocCxsKSAgVkNISV9WRUNfUE9JTlRFUiwgeyB7IChWQ0hJX01FTV9IQU5ETEVfVCkocCksIChsKSB9IH0KKworLy8gQ29uc3RydWN0IGFuIGVudHJ5IGluIGEgbXNnIHZlY3RvciBmb3IgYSBtZXNzYWdlIGhhbmRsZSAoaCksIHN0YXJ0aW5nIGF0IG9mZnNldCAobykgb2YgbGVuZ3RoIChsKQorI2RlZmluZSBWQ0hJX1ZFQ19IQU5ETEUoaCxvLGwpIFZDSElfVkVDX0hBTkRMRSwgIHsgeyAoaCksIChvKSwgKGwpIH0gfQorCisvLyBNYWNyb3MgdG8gbWFuaXB1bGF0ZSAnRk9VUkNDJyB2YWx1ZXMKKyNkZWZpbmUgTUFLRV9GT1VSQ0MoeCkgKChpbnQzMl90KSggKHhbMF0gPDwgMjQpIHwgKHhbMV0gPDwgMTYpIHwgKHhbMl0gPDwgOCkgfCB4WzNdICkpCisjZGVmaW5lIEZPVVJDQ19UT19DSEFSKHgpICh4ID4+IDI0KSAmIDB4RkYsKHggPj4gMTYpICYgMHhGRiwoeCA+PiA4KSAmIDB4RkYsIHggJiAweEZGCisKKworLy8gT3BhcXVlIHNlcnZpY2UgaW5mb3JtYXRpb24KK3N0cnVjdCBvcGFxdWVfdmNoaV9zZXJ2aWNlX3Q7CisKKy8vIERlc2NyaXB0b3IgZm9yIGEgaGVsZCBtZXNzYWdlLiBBbGxvY2F0ZWQgYnkgY2xpZW50LCBpbml0aWFsaXNlZCBieSB2Y2hpX21zZ19ob2xkLAorLy8gdmNoaV9tc2dfaXRlcl9ob2xkIG9yIHZjaGlfbXNnX2l0ZXJfaG9sZF9uZXh0LiBGaWVsZHMgYXJlIGZvciBpbnRlcm5hbCBWQ0hJIHVzZSBvbmx5LgordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHN0cnVjdCBvcGFxdWVfdmNoaV9zZXJ2aWNlX3QgKnNlcnZpY2U7CisgICB2b2lkICptZXNzYWdlOworfSBWQ0hJX0hFTERfTVNHX1Q7CisKKworCisvLyBzdHJ1Y3R1cmUgdXNlZCB0byBwcm92aWRlIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gb3BlbiBhIHNlcnZlciBvciBhIGNsaWVudAordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCB2Y2hpX3ZlcnNpb24gdmVyc2lvbjsKKwlpbnQzMl90IHNlcnZpY2VfaWQ7CisJVkNISV9DT05ORUNUSU9OX1QgKmNvbm5lY3Rpb247CisJdWludDMyX3QgcnhfZmlmb19zaXplOworCXVpbnQzMl90IHR4X2ZpZm9fc2l6ZTsKKwlWQ0hJX0NBTExCQUNLX1QgY2FsbGJhY2s7CisJdm9pZCAqY2FsbGJhY2tfcGFyYW07CisJLyogY2xpZW50IGludGVuZHMgdG8gcmVjZWl2ZSBidWxrIHRyYW5zZmVycyBvZgorCQlvZGQgbGVuZ3RocyBvciBpbnRvIHVuYWxpZ25lZCBidWZmZXJzICovCisJaW50MzJfdCB3YW50X3VuYWxpZ25lZF9idWxrX3J4OworCS8qIGNsaWVudCBpbnRlbmRzIHRvIHRyYW5zbWl0IGJ1bGsgdHJhbnNmZXJzIG9mCisJCW9kZCBsZW5ndGhzIG9yIG91dCBvZiB1bmFsaWduZWQgYnVmZmVycyAqLworCWludDMyX3Qgd2FudF91bmFsaWduZWRfYnVsa190eDsKKwkvKiBjbGllbnQgd2FudHMgdG8gY2hlY2sgQ1JDcyBvbiAoYnVsaykgeGZlcnMuCisJCU9ubHkgbmVlZHMgdG8gYmUgc2V0IGF0IDEgZW5kIC0gd2lsbCBkbyBib3RoIGRpcmVjdGlvbnMuICovCisJaW50MzJfdCB3YW50X2NyYzsKK30gU0VSVklDRV9DUkVBVElPTl9UOworCisvLyBPcGFxdWUgaGFuZGxlIGZvciBhIFZDSEkgaW5zdGFuY2UKK3R5cGVkZWYgc3RydWN0IG9wYXF1ZV92Y2hpX2luc3RhbmNlX2hhbmRsZV90ICpWQ0hJX0lOU1RBTkNFX1Q7CisKKy8vIE9wYXF1ZSBoYW5kbGUgZm9yIGEgc2VydmVyIG9yIGNsaWVudAordHlwZWRlZiBzdHJ1Y3Qgb3BhcXVlX3ZjaGlfc2VydmljZV9oYW5kbGVfdCAqVkNISV9TRVJWSUNFX0hBTkRMRV9UOworCisvLyBTZXJ2aWNlIHJlZ2lzdHJhdGlvbiAmIHN0YXJ0dXAKK3R5cGVkZWYgdm9pZCAoKlZDSElfU0VSVklDRV9JTklUKShWQ0hJX0lOU1RBTkNFX1QgaW5pdGlhbGlzZV9pbnN0YW5jZSwgVkNISV9DT05ORUNUSU9OX1QgKipjb25uZWN0aW9ucywgdWludDMyX3QgbnVtX2Nvbm5lY3Rpb25zKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc2VydmljZV9pbmZvX3RhZyB7CisgICBjb25zdCBjaGFyICogY29uc3QgdmxsX2ZpbGVuYW1lOyAvKiBWTEwgdG8gbG9hZCB0byBzdGFydCB0aGlzIHNlcnZpY2UuIFRoaXMgaXMgYW4gZW1wdHkgc3RyaW5nIGlmIFZMTCBpcyAic3RhdGljIiAqLworICAgVkNISV9TRVJWSUNFX0lOSVQgaW5pdDsgICAgICAgICAgLyogU2VydmljZSBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiAqLworICAgdm9pZCAqdmxsX2hhbmRsZTsgICAgICAgICAgICAgICAgLyogVkxMIGhhbmRsZTsgTlVMTCB3aGVuIHVubG9hZGVkIG9yIGEgInN0YXRpYyBWTEwiIGluIGJ1aWxkICovCit9IFNFUlZJQ0VfSU5GT19UOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgR2xvYmFsIGZ1bmNzIC0gaW1wbGVtZW50YXRpb24gaXMgc3BlY2lmaWMgdG8gd2hpY2ggc2lkZSB5b3UgYXJlIG9uIChsb2NhbCAvIHJlbW90ZSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gLypAb2JzZXJ2ZXJAKi8gVkNISV9DT05ORUNUSU9OX1QgKiB2Y2hpX2NyZWF0ZV9jb25uZWN0aW9uKCBjb25zdCBWQ0hJX0NPTk5FQ1RJT05fQVBJX1QgKiBmdW5jdGlvbl90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZDSElfTUVTU0FHRV9EUklWRVJfVCAqIGxvd19sZXZlbCk7CisKKworLy8gUm91dGluZSB1c2VkIHRvIGluaXRpYWxpc2UgdGhlIHZjaGkgb24gYm90aCBsb2NhbCArIHJlbW90ZSBjb25uZWN0aW9ucworZXh0ZXJuIGludDMyX3QgdmNoaV9pbml0aWFsaXNlKCBWQ0hJX0lOU1RBTkNFX1QgKmluc3RhbmNlX2hhbmRsZSApOworCitleHRlcm4gaW50MzJfdCB2Y2hpX2V4aXQoIHZvaWQgKTsKKworZXh0ZXJuIGludDMyX3QgdmNoaV9jb25uZWN0KCBWQ0hJX0NPTk5FQ1RJT05fVCAqKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBudW1fY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfSU5TVEFOQ0VfVCBpbnN0YW5jZV9oYW5kbGUgKTsKKworLy9XaGVuIHRoaXMgaXMgY2FsbGVkLCBlbnN1cmUgdGhhdCBhbGwgc2VydmljZXMgaGF2ZSBubyBkYXRhIHBlbmRpbmcuCisvL0J1bGsgdHJhbnNmZXJzIGNhbiByZW1haW4gJ3F1ZXVlZCcKK2V4dGVybiBpbnQzMl90IHZjaGlfZGlzY29ubmVjdCggVkNISV9JTlNUQU5DRV9UIGluc3RhbmNlX2hhbmRsZSApOworCisvLyBHbG9iYWwgY29udHJvbCBvdmVyIGJ1bGsgQ1JDIGNoZWNraW5nCitleHRlcm4gaW50MzJfdCB2Y2hpX2NyY19jb250cm9sKCBWQ0hJX0NPTk5FQ1RJT05fVCAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfQ1JDX0NPTlRST0xfVCBjb250cm9sICk7CisKKy8vIGhlbHBlciBmdW5jdGlvbnMKK2V4dGVybiB2b2lkICogdmNoaV9hbGxvY2F0ZV9idWZmZXIoVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwgdWludDMyX3QgKmxlbmd0aCk7CitleHRlcm4gdm9pZCB2Y2hpX2ZyZWVfYnVmZmVyKFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsIHZvaWQgKmFkZHJlc3MpOworZXh0ZXJuIHVpbnQzMl90IHZjaGlfY3VycmVudF90aW1lKFZDSElfSU5TVEFOQ0VfVCBpbnN0YW5jZV9oYW5kbGUpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBHbG9iYWwgc2VydmljZSBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIFJvdXRpbmUgdG8gY3JlYXRlIGEgbmFtZWQgc2VydmljZQorZXh0ZXJuIGludDMyX3QgdmNoaV9zZXJ2aWNlX2NyZWF0ZSggVkNISV9JTlNUQU5DRV9UIGluc3RhbmNlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFUlZJQ0VfQ1JFQVRJT05fVCAqc2V0dXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgKmhhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIGRlc3RvcnkgYSBzZXJ2aWNlCitleHRlcm4gaW50MzJfdCB2Y2hpX3NlcnZpY2VfZGVzdHJveSggY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIG9wZW4gYSBuYW1lZCBzZXJ2aWNlCitleHRlcm4gaW50MzJfdCB2Y2hpX3NlcnZpY2Vfb3BlbiggVkNISV9JTlNUQU5DRV9UIGluc3RhbmNlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJWSUNFX0NSRUFUSU9OX1QgKnNldHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfU0VSVklDRV9IQU5ETEVfVCAqaGFuZGxlKTsKKworZXh0ZXJuIGludDMyX3QgdmNoaV9nZXRfcGVlcl92ZXJzaW9uKCBjb25zdCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqcGVlcl92ZXJzaW9uICk7CisKKy8vIFJvdXRpbmUgdG8gY2xvc2UgYSBuYW1lZCBzZXJ2aWNlCitleHRlcm4gaW50MzJfdCB2Y2hpX3NlcnZpY2VfY2xvc2UoIGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUgKTsKKworLy8gUm91dGluZSB0byBpbmNyZW1lbnQgcmVmIGNvdW50IG9uIGEgbmFtZWQgc2VydmljZQorZXh0ZXJuIGludDMyX3QgdmNoaV9zZXJ2aWNlX3VzZSggY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIGRlY3JlbWVudCByZWYgY291bnQgb24gYSBuYW1lZCBzZXJ2aWNlCitleHRlcm4gaW50MzJfdCB2Y2hpX3NlcnZpY2VfcmVsZWFzZSggY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIHNldCBhIGNvbnRyb2wgb3B0aW9uIGZvciBhIG5hbWVkIHNlcnZpY2UKK2V4dGVybiBpbnQzMl90IHZjaGlfc2VydmljZV9zZXRfb3B0aW9uKCBjb25zdCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorCQkJCQlWQ0hJX1NFUlZJQ0VfT1BUSU9OX1Qgb3B0aW9uLAorCQkJCQlpbnQgdmFsdWUpOworCisvLyBSb3V0aW5lIHRvIHNlbmQgYSBtZXNzYWdlIGFjcm9zcyBhIHNlcnZpY2UKK2V4dGVybiBpbnQzMl90IHZjaGlfbXNnX3F1ZXVlKCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2dfaGFuZGxlICk7CisKKy8vIHNjYXR0ZXItZ2F0aGVyICh2ZWN0b3IpIGFuZCBzZW5kIG1lc3NhZ2UKK2ludDMyX3QgdmNoaV9tc2dfcXVldWV2X2V4KCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfTVNHX1ZFQ1RPUl9FWF9UICp2ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZ19oYW5kbGUgKTsKKworLy8gbGVnYWN5IHNjYXR0ZXItZ2F0aGVyICh2ZWN0b3IpIGFuZCBzZW5kIG1lc3NhZ2UsIG9ubHkgaGFuZGxlcyBwb2ludGVycworaW50MzJfdCB2Y2hpX21zZ19xdWV1ZXYoIFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9NU0dfVkVDVE9SX1QgKnZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnX2hhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIHJlY2VpdmUgYSBtc2cgZnJvbSBhIHNlcnZpY2UKKy8vIERlcXVldWUgaXMgZXF1aXZhbGVudCB0byBob2xkLCBjb3B5IGludG8gY2xpZW50IGJ1ZmZlciwgcmVsZWFzZQorZXh0ZXJuIGludDMyX3QgdmNoaV9tc2dfZGVxdWV1ZSggVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhfZGF0YV9zaXplX3RvX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqYWN0dWFsX21zZ19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzICk7CisKKy8vIFJvdXRpbmUgdG8gbG9vayBhdCBhIG1lc3NhZ2UgaW4gcGxhY2UuCisvLyBUaGUgbWVzc2FnZSBpcyBub3QgZGVxdWV1ZWQsIHNvIGEgc3Vic2VxdWVudCBjYWxsIHRvIHBlZWsgb3IgZGVxdWV1ZQorLy8gd2lsbCByZXR1cm4gdGhlIHNhbWUgbWVzc2FnZS4KK2V4dGVybiBpbnQzMl90IHZjaGlfbXNnX3BlZWsoIFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICptc2dfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncyApOworCisvLyBSb3V0aW5lIHRvIHJlbW92ZSBhIG1lc3NhZ2UgYWZ0ZXIgaXQgaGFzIGJlZW4gcmVhZCBpbiBwbGFjZSB3aXRoIHBlZWsKKy8vIFRoZSBmaXJzdCBtZXNzYWdlIG9uIHRoZSBxdWV1ZSBpcyBkZXF1ZXVlZC4KK2V4dGVybiBpbnQzMl90IHZjaGlfbXNnX3JlbW92ZSggVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIGxvb2sgYXQgYSBtZXNzYWdlIGluIHBsYWNlLgorLy8gVGhlIG1lc3NhZ2UgaXMgZGVxdWV1ZWQsIHNvIHRoZSBjYWxsZXIgaXMgbGVmdCBob2xkaW5nIGl0OyB0aGUgZGVzY3JpcHRvciBpcworLy8gZmlsbGVkIGluIGFuZCBtdXN0IGJlIHJlbGVhc2VkIHdoZW4gdGhlIHVzZXIgaGFzIGZpbmlzaGVkIHdpdGggdGhlIG1lc3NhZ2UuCitleHRlcm4gaW50MzJfdCB2Y2hpX21zZ19ob2xkKCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGEsICAgICAgICAvLyB9IG1heSBiZSBOVUxMLCBhcyBpbmZvIGNhbiBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm1zZ19zaXplLCAvLyB9IG9idGFpbmVkIGZyb20gSEVMRF9NU0dfVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9IRUxEX01TR19UICptZXNzYWdlX2Rlc2NyaXB0b3IgKTsKKworLy8gSW5pdGlhbGlzZSBhbiBpdGVyYXRvciB0byBsb29rIHRocm91Z2ggbWVzc2FnZXMgaW4gcGxhY2UKK2V4dGVybiBpbnQzMl90IHZjaGlfbXNnX2xvb2tfYWhlYWQoIFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX01TR19JVEVSX1QgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEdsb2JhbCBzZXJ2aWNlIHN1cHBvcnQgQVBJIC0gb3BlcmF0aW9ucyBvbiBoZWxkIG1lc3NhZ2VzIGFuZCBtZXNzYWdlIGl0ZXJhdG9ycworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBSb3V0aW5lIHRvIGdldCB0aGUgYWRkcmVzcyBvZiBhIGhlbGQgbWVzc2FnZQorZXh0ZXJuIHZvaWQgKnZjaGlfaGVsZF9tc2dfcHRyKCBjb25zdCBWQ0hJX0hFTERfTVNHX1QgKm1lc3NhZ2UgKTsKKworLy8gUm91dGluZSB0byBnZXQgdGhlIHNpemUgb2YgYSBoZWxkIG1lc3NhZ2UKK2V4dGVybiBpbnQzMl90IHZjaGlfaGVsZF9tc2dfc2l6ZSggY29uc3QgVkNISV9IRUxEX01TR19UICptZXNzYWdlICk7CisKKy8vIFJvdXRpbmUgdG8gZ2V0IHRoZSB0cmFuc21pdCB0aW1lc3RhbXAgYXMgd3JpdHRlbiBpbnRvIHRoZSBoZWFkZXIgYnkgdGhlIHBlZXIKK2V4dGVybiB1aW50MzJfdCB2Y2hpX2hlbGRfbXNnX3R4X3RpbWVzdGFtcCggY29uc3QgVkNISV9IRUxEX01TR19UICptZXNzYWdlICk7CisKKy8vIFJvdXRpbmUgdG8gZ2V0IHRoZSByZWNlcHRpb24gdGltZXN0YW1wLCB3cml0dGVuIGFzIHdlIHBhcnNlZCB0aGUgaGVhZGVyCitleHRlcm4gdWludDMyX3QgdmNoaV9oZWxkX21zZ19yeF90aW1lc3RhbXAoIGNvbnN0IFZDSElfSEVMRF9NU0dfVCAqbWVzc2FnZSApOworCisvLyBSb3V0aW5lIHRvIHJlbGVhc2UgYSBoZWxkIG1lc3NhZ2UgYWZ0ZXIgaXQgaGFzIGJlZW4gcHJvY2Vzc2VkCitleHRlcm4gaW50MzJfdCB2Y2hpX2hlbGRfbXNnX3JlbGVhc2UoIFZDSElfSEVMRF9NU0dfVCAqbWVzc2FnZSApOworCisvLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaXRlcmF0b3IgaGFzIGEgbmV4dCBtZXNzYWdlLgorZXh0ZXJuIGludDMyX3QgdmNoaV9tc2dfaXRlcl9oYXNfbmV4dCggY29uc3QgVkNISV9NU0dfSVRFUl9UICppdGVyICk7CisKKy8vIFJldHVybiB0aGUgcG9pbnRlciBhbmQgbGVuZ3RoIGZvciB0aGUgbmV4dCBtZXNzYWdlIGFuZCBhZHZhbmNlIHRoZSBpdGVyYXRvci4KK2V4dGVybiBpbnQzMl90IHZjaGlfbXNnX2l0ZXJfbmV4dCggVkNISV9NU0dfSVRFUl9UICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm1zZ19zaXplICk7CisKKy8vIFJlbW92ZSB0aGUgbGFzdCBtZXNzYWdlIHJldHVybmVkIGJ5IHZjaGlfbXNnX2l0ZXJfbmV4dC4KKy8vIENhbiBvbmx5IGJlIGNhbGxlZCBvbmNlIGFmdGVyIGVhY2ggY2FsbCB0byB2Y2hpX21zZ19pdGVyX25leHQuCitleHRlcm4gaW50MzJfdCB2Y2hpX21zZ19pdGVyX3JlbW92ZSggVkNISV9NU0dfSVRFUl9UICppdGVyICk7CisKKy8vIEhvbGQgdGhlIGxhc3QgbWVzc2FnZSByZXR1cm5lZCBieSB2Y2hpX21zZ19pdGVyX25leHQuCisvLyBDYW4gb25seSBiZSBjYWxsZWQgb25jZSBhZnRlciBlYWNoIGNhbGwgdG8gdmNoaV9tc2dfaXRlcl9uZXh0LgorZXh0ZXJuIGludDMyX3QgdmNoaV9tc2dfaXRlcl9ob2xkKCBWQ0hJX01TR19JVEVSX1QgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfSEVMRF9NU0dfVCAqbWVzc2FnZSApOworCisvLyBSZXR1cm4gaW5mb3JtYXRpb24gZm9yIHRoZSBuZXh0IG1lc3NhZ2UsIGFuZCBob2xkIGl0LCBhZHZhbmNpbmcgdGhlIGl0ZXJhdG9yLgorZXh0ZXJuIGludDMyX3QgdmNoaV9tc2dfaXRlcl9ob2xkX25leHQoIFZDSElfTVNHX0lURVJfVCAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YSwgICAgICAgIC8vIH0gbWF5IGJlIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbXNnX3NpemUsIC8vIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0hFTERfTVNHX1QgKm1lc3NhZ2UgKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgR2xvYmFsIGJ1bGsgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIFJvdXRpbmUgdG8gcHJlcGFyZSBpbnRlcmZhY2UgZm9yIGEgdHJhbnNmZXIgZnJvbSB0aGUgb3RoZXIgc2lkZQorZXh0ZXJuIGludDMyX3QgdmNoaV9idWxrX3F1ZXVlX3JlY2VpdmUoIFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YV9kc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp0cmFuc2Zlcl9oYW5kbGUgKTsKKworCisvLyBQcmVwYXJlIGludGVyZmFjZSBmb3IgYSB0cmFuc2ZlciBmcm9tIHRoZSBvdGhlciBzaWRlIGludG8gcmVsb2NhdGFibGUgbWVtb3J5LgoraW50MzJfdCB2Y2hpX2J1bGtfcXVldWVfcmVjZWl2ZV9yZWxvYyggY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfTUVNX0hBTkRMRV9UIGhfZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVkNISV9GTEFHU19UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGNvbnN0IGJ1bGtfaGFuZGxlICk7CisKKy8vIFJvdXRpbmUgdG8gcXVldWUgdXAgZGF0YSByZWFkeSBmb3IgdHJhbnNmZXIgdG8gdGhlIG90aGVyIChvbmNlIHRoZXkgaGF2ZSBzaWduYWxsZWQgdGhleSBhcmUgcmVhZHkpCitleHRlcm4gaW50MzJfdCB2Y2hpX2J1bGtfcXVldWVfdHJhbnNtaXQoIFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGFfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdHJhbnNmZXJfaGFuZGxlICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIENvbmZpZ3VyYXRpb24gcGx1bWJpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gZnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgdGhlIGRpZmZlcmVudCBtaWQgbGF5ZXJzICh0aGUgc3RhdGUgaW5mbyBnaXZlcyB0aGUgZGlmZmVyZW50IHBoeXNpY2FsIGNvbm5lY3Rpb25zKQorZXh0ZXJuIGNvbnN0IFZDSElfQ09OTkVDVElPTl9BUElfVCAqc2luZ2xlX2dldF9mdW5jX3RhYmxlKCB2b2lkICk7CisvL2V4dGVybiBjb25zdCBWQ0hJX0NPTk5FQ1RJT05fQVBJX1QgKmxvY2FsX3NlcnZlcl9nZXRfZnVuY190YWJsZSggdm9pZCApOworLy9leHRlcm4gY29uc3QgVkNISV9DT05ORUNUSU9OX0FQSV9UICpsb2NhbF9jbGllbnRfZ2V0X2Z1bmNfdGFibGUoIHZvaWQgKTsKKworLy8gZGVjbGFyZSBhbGwgbWVzc2FnZSBkcml2ZXJzIGhlcmUKK2NvbnN0IFZDSElfTUVTU0FHRV9EUklWRVJfVCAqdmNoaV9tcGhpX21lc3NhZ2VfZHJpdmVyX2Z1bmNfdGFibGUoIHZvaWQgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworZXh0ZXJuIGludDMyX3QgdmNoaV9idWxrX3F1ZXVlX3RyYW5zbWl0X3JlbG9jKCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX01FTV9IQU5ETEVfVCBoX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdHJhbnNmZXJfaGFuZGxlICk7CisjZW5kaWYgLyogVkNISV9IXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBmaWxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaS92Y2hpX2NmZy5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvdmNoaV9jZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmJjMmQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvdmNoaV9jZmcuaApAQCAtMCwwICsxLDIyNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWQ0hJX0NGR19IXworI2RlZmluZSBWQ0hJX0NGR19IXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVmaW5lcyBpbiB0aGlzIGZpcnN0IHNlY3Rpb24gYXJlIHBhcnQgb2YgdGhlIFZDSEkgQVBJIGFuZCBtYXkgYmUgZXhhbWluZWQgYnkgVkNISQorICogc2VydmljZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSZXF1aXJlZCBhbGlnbm1lbnQgb2YgYmFzZSBhZGRyZXNzZXMgZm9yIGJ1bGsgdHJhbnNmZXIsIGlmIHVuYWxpZ25lZCB0cmFuc2ZlcnMgYXJlIG5vdCBlbmFibGVkICovCisvKiBSZWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgbWVzc2FnZSBkcml2ZXIsIGFuZCBzaG91bGQgYmUgYXZhaWxhYmxlIGZyb20gYSBydW4tdGltZSBjYWxsLiAqLworI2lmbmRlZiBWQ0hJX0JVTEtfQUxJR04KKyMgICBpZiBfX1ZDQ09SRVZFUl9fID49IDB4MDQwMDAwMDAKKyMgICAgICAgZGVmaW5lIFZDSElfQlVMS19BTElHTiAzMiAvLyBBbGxvd3MgZm9yIHRoZSBuZWVkIHRvIGRvIGNhY2hlIGNsZWFucworIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIFZDSElfQlVMS19BTElHTiAxNgorIyAgIGVuZGlmCisjZW5kaWYKKworLyogUmVxdWlyZWQgbGVuZ3RoIG11bHRpcGxlIGZvciBidWxrIHRyYW5zZmVycywgaWYgdW5hbGlnbmVkIHRyYW5zZmVycyBhcmUgbm90IGVuYWJsZWQgKi8KKy8qIE1heSBiZSBsZXNzIHRoYW4gb3IgZ3JlYXRlciB0aGFuIFZDSElfQlVMS19BTElHTiAqLworLyogUmVhbGx5IGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2UgZHJpdmVyLCBhbmQgc2hvdWxkIGJlIGF2YWlsYWJsZSBmcm9tIGEgcnVuLXRpbWUgY2FsbC4gKi8KKyNpZm5kZWYgVkNISV9CVUxLX0dSQU5VTEFSSVRZCisjICAgaWYgX19WQ0NPUkVWRVJfXyA+PSAweDA0MDAwMDAwCisjICAgICAgIGRlZmluZSBWQ0hJX0JVTEtfR1JBTlVMQVJJVFkgMzIgLy8gQWxsb3dzIGZvciB0aGUgbmVlZCB0byBkbyBjYWNoZSBjbGVhbnMKKyMgICBlbHNlCisjICAgICAgIGRlZmluZSBWQ0hJX0JVTEtfR1JBTlVMQVJJVFkgMTYKKyMgICBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBsYXJnZXN0IHBvc3NpYmxlIG1lc3NhZ2UgdG8gYmUgcXVldWVkIHdpdGggdmNoaV9tc2dfcXVldWUuICovCisjaWZuZGVmIFZDSElfTUFYX01TR19TSVpFCisjICAgaWYgZGVmaW5lZCBWQ0hJX0xPQ0FMX0hPU1RfUE9SVAorIyAgICAgICBkZWZpbmUgVkNISV9NQVhfTVNHX1NJWkUgICAgIDE2Mzg0ICAgICAgICAgLy8gbWFrZXMgZmlsZSB0cmFuc2ZlcnMgZmFzdCwgYnV0IHNob3VsZCB0aGV5IGJlIHVzaW5nIGJ1bGs/CisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgVkNISV9NQVhfTVNHX1NJWkUgICAgICA0MDk2IC8vIE5PVEU6IFRISVMgTVVTVCBCRSBMQVJHRVIgVEhBTiBPUiBFUVVBTCBUTyBUSEUgU0laRSBPRiBUSEUgS0hST05PUyBNRVJHRSBCVUZGRVIhIQorIyAgIGVuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVmaW5lcyBiZWxvdyBhcmUgc3lzdGVtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBWQ0hJIHNlcnZpY2VzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBIb3cgbWFueSBjb25uZWN0aW9ucyBjYW4gd2Ugc3VwcG9ydD8gQSBsb2NhbGhvc3QgaW1wbGVtZW50YXRpb24gdXNlcyAyIGNvbm5lY3Rpb25zLAorICogMSBmb3IgaG9zdC1hcHAsIDEgZm9yIFZNQ1MsIGFuZCB0aGVzZSBhcmUgaG9va2VkIHRvZ2V0aGVyIGJ5IGEgbG9vcGJhY2sgTVBISSBWQ0ZXCisgKiBkcml2ZXIuICovCisjaWZuZGVmIFZDSElfTUFYX05VTV9DT05ORUNUSU9OUworIyAgIGRlZmluZSBWQ0hJX01BWF9OVU1fQ09OTkVDVElPTlMgMworI2VuZGlmCisKKy8qIEhvdyBtYW55IHNlcnZpY2VzIGNhbiB3ZSBvcGVuIHBlciBjb25uZWN0aW9uPyBFeHRlbmRpbmcgdGhpcyBkb2Vzbid0IGNvc3QgcHJvY2Vzc2luZyB0aW1lLCBqdXN0IGEgc21hbGwKKyAqIGFtb3VudCBvZiBzdGF0aWMgbWVtb3J5LiAqLworI2lmbmRlZiBWQ0hJX01BWF9TRVJWSUNFU19QRVJfQ09OTkVDVElPTgorIyAgZGVmaW5lIFZDSElfTUFYX1NFUlZJQ0VTX1BFUl9DT05ORUNUSU9OIDM2CisjZW5kaWYKKworLyogQWRqdXN0IGlmIHVzaW5nIGEgbWVzc2FnZSBkcml2ZXIgdGhhdCBzdXBwb3J0cyBtb3JlIGxvZ2ljYWwgVFggY2hhbm5lbHMgKi8KKyNpZm5kZWYgVkNISV9NQVhfQlVMS19UWF9DSEFOTkVMU19QRVJfQ09OTkVDVElPTgorIyAgIGRlZmluZSBWQ0hJX01BWF9CVUxLX1RYX0NIQU5ORUxTX1BFUl9DT05ORUNUSU9OIDkgLy8gMSBNUEhJICsgOCBDQ1AyIGxvZ2ljYWwgY2hhbm5lbHMKKyNlbmRpZgorCisvKiBBZGp1c3QgaWYgdXNpbmcgYSBtZXNzYWdlIGRyaXZlciB0aGF0IHN1cHBvcnRzIG1vcmUgbG9naWNhbCBSWCBjaGFubmVscyAqLworI2lmbmRlZiBWQ0hJX01BWF9CVUxLX1JYX0NIQU5ORUxTX1BFUl9DT05ORUNUSU9OCisjICAgZGVmaW5lIFZDSElfTUFYX0JVTEtfUlhfQ0hBTk5FTFNfUEVSX0NPTk5FQ1RJT04gMSAvLyAxIE1QSEkKKyNlbmRpZgorCisvKiBIb3cgbWFueSByZWNlaXZlIHNsb3RzIGRvIHdlIHVzZS4gVGhpcyB0aW1lcyBWQ0hJX01BWF9NU0dfU0laRSBnaXZlcyB0aGUgZWZmZWN0aXZlCisgKiByZWNlaXZlIHF1ZXVlIHNwYWNlLCBsZXNzIG1lc3NhZ2UgaGVhZGVycy4gKi8KKyNpZm5kZWYgVkNISV9OVU1fUkVBRF9TTE9UUworIyAgaWYgZGVmaW5lZChWQ0hJX0xPQ0FMX0hPU1RfUE9SVCkKKyMgICAgIGRlZmluZSBWQ0hJX05VTV9SRUFEX1NMT1RTIDQKKyMgIGVsc2UKKyMgICAgIGRlZmluZSBWQ0hJX05VTV9SRUFEX1NMT1RTIDQ4CisjICBlbmRpZgorI2VuZGlmCisKKy8qIERvIHdlIHV0aWxpc2Ugb3ZlcnJ1biBmYWNpbGl0eSBmb3IgcmVjZWl2ZSBtZXNzYWdlIHNsb3RzPyBDYW4gYWlkIHBlZXIgdHJhbnNtaXQKKyAqIHBlcmZvcm1hbmNlLiBPbmx5IGRlZmluZSBvbiBWaWRlb0NvcmUgZW5kLCB0YWxraW5nIHRvIGhvc3QuCisgKi8KKy8vI2RlZmluZSBWQ0hJX01TR19SWF9PVkVSUlVOCisKKy8qIEhvdyBtYW55IHRyYW5zbWl0IHNsb3RzIGRvIHdlIHVzZS4gR2VuZXJhbGx5IGRvbid0IG5lZWQgbWFueSwgYXMgdGhlIGhhcmR3YXJlIGRyaXZlcgorICogdW5kZXJuZWF0aCBWQ0hJIHdpbGwgdXN1YWxseSBoYXZlIGl0cyBvd24gYnVmZmVyaW5nLiAqLworI2lmbmRlZiBWQ0hJX05VTV9XUklURV9TTE9UUworIyAgZGVmaW5lIFZDSElfTlVNX1dSSVRFX1NMT1RTIDQKKyNlbmRpZgorCisvKiBJZiBhIHNlcnZpY2UgaGFzIGhlbGQgb3IgcXVldWVkIHJlY2VpdmVkIG1lc3NhZ2VzIGluIFZDSElfWE9GRl9USFJFU0hPTEQgb3IgbW9yZSBzbG90cywKKyAqIHRoZW4gaXQncyB0YWtpbmcgdXAgdG9vIG11Y2ggYnVmZmVyIHNwYWNlLCBhbmQgdGhlIHBlZXIgc2VydmljZSB3aWxsIGJlIHRvbGQgdG8gc3RvcAorICogdHJhbnNtaXR0aW5nIHdpdGggYW4gWE9GRiBtZXNzYWdlLiBGb3IgdGhpcyB0byBiZSBlZmZlY3RpdmUsIHRoZSBWQ0hJX05VTV9SRUFEX1NMT1RTCisgKiBuZWVkcyB0byBiZSBjb25zaWRlcmFibHkgYmlnZ2VyIHRoYW4gVkNISV9OVU1fV1JJVEVfU0xPVFMsIG9yIHRoZSB0cmFuc21pdCBsYXRlbmN5CisgKiBpcyB0b28gaGlnaC4gKi8KKyNpZm5kZWYgVkNISV9YT0ZGX1RIUkVTSE9MRAorIyAgZGVmaW5lIFZDSElfWE9GRl9USFJFU0hPTEQgKFZDSElfTlVNX1JFQURfU0xPVFMgLyAyKQorI2VuZGlmCisKKy8qIEFmdGVyIHdlJ3ZlIHNlbnQgYW4gWE9GRiwgdGhlIHBlZXIgd2lsbCBiZSB0b2xkIHRvIHJlc3VtZSB0cmFuc21pc3Npb24gb25jZSB0aGUgbG9jYWwKKyAqIHNlcnZpY2UgaGFzIGRlcXVldWVkL3JlbGVhc2VkIGVub3VnaCBtZXNzYWdlcyB0aGF0IGl0J3Mgbm93IG9jY3VweWluZworICogVkNISV9YT05fVEhSRVNIT0xEIHNsb3RzIG9yIGZld2VyLiAqLworI2lmbmRlZiBWQ0hJX1hPTl9USFJFU0hPTEQKKyMgIGRlZmluZSBWQ0hJX1hPTl9USFJFU0hPTEQgKFZDSElfTlVNX1JFQURfU0xPVFMgLyA0KQorI2VuZGlmCisKKy8qIEEgc2l6ZSBiZWxvdyB3aGljaCBhIGJ1bGsgdHJhbnNmZXIgb21pdHMgdGhlIGhhbmRzaGFrZSBjb21wbGV0ZWx5IGFuZCBhbHdheXMgZ29lcworICogdmlhIHRoZSBtZXNzYWdlIGNoYW5uZWwsIGlmIGJ1bGsgYXV4aWxpYXJ5IGlzIGJlaW5nIHNlbnQgb24gdGhhdCBzZXJ2aWNlLiAoVGhlIHVzZXIKKyAqIGNhbiBndWFyYW50ZWUgdGhpcyBieSBlbmFibGluZyB1bmFsaWduZWQgdHJhbnNtaXRzKS4KKyAqIE5vdCBBUEkuICovCisjaWZuZGVmIFZDSElfTUlOX0JVTEtfU0laRQorIyAgZGVmaW5lIFZDSElfTUlOX0JVTEtfU0laRSAgICAoIFZDSElfTUFYX01TR19TSVpFIC8gMiA8IDQwOTYgPyBWQ0hJX01BWF9NU0dfU0laRSAvIDIgOiA0MDk2ICkKKyNlbmRpZgorCisvKiBNYXhpbXVtIHNpemUgb2YgYnVsayB0cmFuc21pc3Npb24gY2h1bmtzLCBmb3IgZWFjaCBpbnRlcmZhY2UgdHlwZS4gQSB0cmFkZS1vZmYgYmV0d2VlbgorICogc3BlZWQgYW5kIGxhdGVuY3k7IHRoZSBzbWFsbGVyIHRoZSBjaHVuayBzaXplIHRoZSBiZXR0ZXIgY2hhbmdlIG9mIG1lc3NhZ2VzIGFuZCBvdGhlcgorICogYnVsayB0cmFuc21pc3Npb25zIGdldHRpbmcgaW4gd2hlbiBiaWcgYnVsayB0cmFuc2ZlcnMgYXJlIGhhcHBlbmluZy4gU2V0IHRvIDAgdG8gbm90CisgKiBicmVhayB0cmFuc21pc3Npb25zIGludG8gY2h1bmtzLgorICovCisjaWZuZGVmIFZDSElfTUFYX0JVTEtfQ0hVTktfU0laRV9NUEhJCisjICBkZWZpbmUgVkNISV9NQVhfQlVMS19DSFVOS19TSVpFX01QSEkgKDE2ICogMTAyNCkKKyNlbmRpZgorCisvKiBOQiBDaHVua2VkIENDUDIgdHJhbnNtaXNzaW9ucyB2aW9sYXRlIHRoZSBsZXR0ZXIgb2YgdGhlIENDUDIgc3BlYyBieSB1c2luZyAiSlBFRzgiIG1vZGUKKyAqIHdpdGggbXVsdGlwbGUtbGluZSBmcmFtZXMuIE9ubHkgdXNlIGlmIHRoZSByZWNlaXZlciBjYW4gY29wZS4gKi8KKyNpZm5kZWYgVkNISV9NQVhfQlVMS19DSFVOS19TSVpFX0NDUDIKKyMgIGRlZmluZSBWQ0hJX01BWF9CVUxLX0NIVU5LX1NJWkVfQ0NQMiAwCisjZW5kaWYKKworLyogSG93IG1hbnkgVFggbWVzc2FnZXMgY2FuIHdlIGhhdmUgcGVuZGluZyBpbiBvdXIgdHJhbnNtaXQgc2xvdHMuIE9uY2UgZXhoYXVzdGVkLAorICogdmNoaV9tc2dfcXVldWUgd2lsbCBiZSBibG9ja2VkLiAqLworI2lmbmRlZiBWQ0hJX1RYX01TR19RVUVVRV9TSVpFCisjICBkZWZpbmUgVkNISV9UWF9NU0dfUVVFVUVfU0laRSAgICAgICAgICAgMjU2CisjZW5kaWYKKworLyogSG93IG1hbnkgUlggbWVzc2FnZXMgY2FuIHdlIGhhdmUgcGFyc2VkIGluIHRoZSByZWNlaXZlIHNsb3RzLiBPbmNlIGV4aGF1c3RlZCwgcGFyc2luZworICogd2lsbCBiZSBzdXNwZW5kZWQgdW50aWwgb2xkZXIgbWVzc2FnZXMgYXJlIGRlcXVldWVkL3JlbGVhc2VkLiAqLworI2lmbmRlZiBWQ0hJX1JYX01TR19RVUVVRV9TSVpFCisjICBkZWZpbmUgVkNISV9SWF9NU0dfUVVFVUVfU0laRSAgICAgICAgICAgMjU2CisjZW5kaWYKKworLyogUmVhbGx5IHNob3VsZCBiZSBhYmxlIHRvIGNvcGUgaWYgd2UgcnVuIG91dCBvZiByZWNlaXZlZCBtZXNzYWdlIGRlc2NyaXB0b3JzLCBieQorICogc3VzcGVuZGluZyBwYXJzaW5nIGFzIHRoZSBjb21tZW50IGFib3ZlIHNheXMsIGJ1dCB3ZSBkb24ndC4gVGhpcyBzd2VlcHMgdGhlIGlzc3VlCisgKiB1bmRlciB0aGUgY2FycGV0LiAqLworI2lmIFZDSElfUlhfTVNHX1FVRVVFX1NJWkUgPCAoVkNISV9NQVhfTVNHX1NJWkUvMTYgKyAxKSAqIFZDSElfTlVNX1JFQURfU0xPVFMKKyMgIHVuZGVmIFZDSElfUlhfTVNHX1FVRVVFX1NJWkUKKyMgIGRlZmluZSBWQ0hJX1JYX01TR19RVUVVRV9TSVpFIChWQ0hJX01BWF9NU0dfU0laRS8xNiArIDEpICogVkNISV9OVU1fUkVBRF9TTE9UUworI2VuZGlmCisKKy8qIEhvdyBtYW55IGJ1bGsgdHJhbnNtaXRzIGNhbiB3ZSBoYXZlIHBlbmRpbmcuIE9uY2UgZXhoYXVzdGVkLCB2Y2hpX2J1bGtfcXVldWVfdHJhbnNtaXQKKyAqIHdpbGwgYmUgYmxvY2tlZC4gKi8KKyNpZm5kZWYgVkNISV9UWF9CVUxLX1FVRVVFX1NJWkUKKyMgIGRlZmluZSBWQ0hJX1RYX0JVTEtfUVVFVUVfU0laRSAgICAgICAgICAgNjQKKyNlbmRpZgorCisvKiBIb3cgbWFueSBidWxrIHJlY2VpdmVzIGNhbiB3ZSBoYXZlIHBlbmRpbmcuIE9uY2UgZXhoYXVzdGVkLCB2Y2hpX2J1bGtfcXVldWVfcmVjZWl2ZQorICogd2lsbCBiZSBibG9ja2VkLiAqLworI2lmbmRlZiBWQ0hJX1JYX0JVTEtfUVVFVUVfU0laRQorIyAgZGVmaW5lIFZDSElfUlhfQlVMS19RVUVVRV9TSVpFICAgICAgICAgICA2NAorI2VuZGlmCisKKy8qIEEgbGltaXQgb24gaG93IG1hbnkgb3V0c3RhbmRpbmcgYnVsayByZXF1ZXN0cyB3ZSBleHBlY3QgdGhlIHBlZXIgdG8gZ2l2ZSB1cy4gSWYKKyAqIHRoZSBwZWVyIGFza3MgZm9yIG1vcmUgdGhhbiB0aGlzLCBWQ0hJIHdpbGwgZmFpbCBhbmQgYXNzZXJ0LiBUaGUgbnVtYmVyIGlzIGRldGVybWluZWQKKyAqIGJ5IHRoZSBwZWVyJ3MgaGFyZHdhcmUgLSBpdCdzIHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgcmVxdWVzdHMgdGhhdCBjYW4gYmUgcXVldWVkCisgKiBvbiBhbGwgYnVsayBjaGFubmVscy4gVkMzJ3MgTVBISSBwZXJpcGhlcmFsIGFsbG93cyAxNi4gKi8KKyNpZm5kZWYgVkNISV9NQVhfUEVFUl9CVUxLX1JFUVVFU1RTCisjICBkZWZpbmUgVkNISV9NQVhfUEVFUl9CVUxLX1JFUVVFU1RTICAgICAgIDMyCisjZW5kaWYKKworLyogRGVmaW5lIFZDSElfQ0NQMlRYX01BTlVBTF9QT1dFUiBpZiB0aGUgaG9zdCB0ZWxscyB1cyB3aGVuIHRvIHR1cm4gdGhlIENDUDIKKyAqIHRyYW5zbWl0dGVyIG9uIGFuZCBvZmYuCisgKi8KKy8qI2RlZmluZSBWQ0hJX0NDUDJUWF9NQU5VQUxfUE9XRVIqLworCisjaWZuZGVmIFZDSElfQ0NQMlRYX01BTlVBTF9QT1dFUgorCisvKiBUaW1lb3V0IChpbiBtaWxsaXNlY29uZHMpIGZvciBwdXR0aW5nIHRoZSBDQ1AyVFggaW50ZXJmYWNlIGludG8gSURMRSBzdGF0ZS4gU2V0CisgKiBuZWdhdGl2ZSBmb3Igbm8gSURMRS4KKyAqLworIyAgaWZuZGVmIFZDSElfQ0NQMlRYX0lETEVfVElNRU9VVAorIyAgICBkZWZpbmUgVkNISV9DQ1AyVFhfSURMRV9USU1FT1VUICAgICAgICA1CisjICBlbmRpZgorCisvKiBUaW1lb3V0IChpbiBtaWxsaXNlY29uZHMpIGZvciBwdXR0aW5nIHRoZSBDQ1AyVFggaW50ZXJmYWNlIGludG8gT0ZGIHN0YXRlLiBTZXQKKyAqIG5lZ2F0aXZlIGZvciBubyBPRkYuCisgKi8KKyMgIGlmbmRlZiBWQ0hJX0NDUDJUWF9PRkZfVElNRU9VVAorIyAgICBkZWZpbmUgVkNISV9DQ1AyVFhfT0ZGX1RJTUVPVVQgICAgICAgICAxMDAwCisjICBlbmRpZgorCisjZW5kaWYgLyogVkNISV9DQ1AyVFhfTUFOVUFMX1BPV0VSICovCisKKyNlbmRpZiAvKiBWQ0hJX0NGR19IXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBmaWxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaS92Y2hpX2NmZ19pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvdmNoaV9jZmdfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWRjYmE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvdmNoaV9jZmdfaW50ZXJuYWwuaApAQCAtMCwwICsxLDcxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElfQ0ZHX0lOVEVSTkFMX0hfCisjZGVmaW5lIFZDSElfQ0ZHX0lOVEVSTkFMX0hfCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb250cm9sIG9wdGltaXNhdGlvbiBhdHRlbXB0cy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIERvbid0IHVzZSBsb3RzIG9mIHNob3J0LXRlcm0gbG9ja3MgLSB1c2UgZ3JlYXQgbG9uZyBvbmVzLCByZWR1Y2luZyB0aGUgb3ZlcmFsbCBsb2Nrcy1wZXItc2Vjb25kCisjZGVmaW5lIFZDSElfQ09BUlNFX0xPQ0tJTkcKKworLy8gQXZvaWQgbG9jayB0aGVuIHVubG9jayBvbiBleGl0IGZyb20gYmxvY2tpbmcgcXVldWUgb3BlcmF0aW9ucyAobXNnIHR4LCBidWxrIHJ4L3R4KQorLy8gKG9ubHkgcmVsZXZhbnQgaWYgVkNISV9DT0FSU0VfTE9DS0lORykKKyNkZWZpbmUgVkNISV9FTElERV9CTE9DS19FWElUX0xPQ0sKKworLy8gQXZvaWQgbG9jayBvbiBub24tYmxvY2tpbmcgcGVlaworLy8gKG9ubHkgcmVsZXZhbnQgaWYgVkNISV9DT0FSU0VfTE9DS0lORykKKyNkZWZpbmUgVkNISV9BVk9JRF9QRUVLX0xPQ0sKKworLy8gVXNlIG9uZSBzbG90LWhhbmRsZXIgdGhyZWFkIHBlciBjb25uZWN0aW9uLCByYXRoZXIgdGhhbiAxIHRocmVhZCBkZWFsaW5nIHdpdGggYWxsIGNvbm5lY3Rpb25zIGluIHJvdGF0aW9uLgorI2RlZmluZSBWQ0hJX01VTFRJUExFX0hBTkRMRVJfVEhSRUFEUworCisvLyBQdXQgZnJlZSBkZXNjcmlwdG9ycyBvbnRvIHRoZSBoZWFkIG9mIHRoZSBmcmVlIHF1ZXVlLCByYXRoZXIgdGhhbiB0aGUgdGFpbCwgc28gdGhhdCB3ZSBkb24ndCB0aHJhc2gKKy8vIG91ciB3YXkgdGhyb3VnaCB0aGUgcG9vbCBvZiBkZXNjcmlwdG9ycy4KKyNkZWZpbmUgVkNISV9QVVNIX0ZSRUVfREVTQ1JJUFRPUlNfT05UT19IRUFECisKKy8vIERvbid0IGlzc3VlIGEgTVNHX0FWQUlMQUJMRSBjYWxsYmFjayBmb3IgZXZlcnkgc2luZ2xlIG1lc3NhZ2UuIFBvc3NpYmx5IG9ubHkgc2FmZSBpZiBWQ0hJX0NPQVJTRV9MT0NLSU5HLgorI2RlZmluZSBWQ0hJX0ZFV0VSX01TR19BVkFJTEFCTEVfQ0FMTEJBQ0tTCisKKy8vIERvbid0IHVzZSBtZXNzYWdlIGRlc2NyaXB0b3JzIGZvciBUWCBtZXNzYWdlcyB0aGF0IGRvbid0IG5lZWQgdGhlbQorI2RlZmluZSBWQ0hJX01JTklNSVNFX1RYX01TR19ERVNDUklQVE9SUworCisvLyBOYW5vLWxvY2tzIGZvciBtdWx0aXF1ZXVlCisvLyNkZWZpbmUgVkNISV9NUVVFVUVfTkFOT0xPQ0tTCisKKy8vIExvY2stZnJlZShlcikgZGVxdWV1aW5nCisvLyNkZWZpbmUgVkNISV9SWF9OQU5PTE9DS1MKKworI2VuZGlmIC8qVkNISV9DRkdfSU5URVJOQUxfSF8qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvdmNoaV9jb21tb24uaCBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGlfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzNWE3MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGlfY29tbW9uLmgKQEAgLTAsMCArMSwxNzUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVkNISV9DT01NT05fSF8KKyNkZWZpbmUgVkNISV9DT01NT05fSF8KKworCisvL2ZsYWdzIHVzZWQgd2hlbiBzZW5kaW5nIG1lc3NhZ2VzIChtdXN0IGJlIGJpdG1hcHBlZCkKK3R5cGVkZWYgZW51bQoreworICAgVkNISV9GTEFHU19OT05FICAgICAgICAgICAgICAgICAgICAgID0gMHgwLAorICAgVkNISV9GTEFHU19CTE9DS19VTlRJTF9PUF9DT01QTEVURSAgID0gMHgxLCAgIC8vIHdhaXRzIGZvciBtZXNzYWdlIHRvIGJlIHJlY2VpdmVkLCBvciBzZW50IChOQi4gbm90IHRoZSBzYW1lIGFzIGJlaW5nIHNlZW4gb24gb3RoZXIgc2lkZSkKKyAgIFZDSElfRkxBR1NfQ0FMTEJBQ0tfV0hFTl9PUF9DT01QTEVURSA9IDB4MiwgICAvLyBydW4gYSBjYWxsYmFjayB3aGVuIG1lc3NhZ2Ugc2VudAorICAgVkNISV9GTEFHU19CTE9DS19VTlRJTF9RVUVVRUQgICAgICAgID0gMHg0LCAgIC8vIHJldHVybiBvbmNlIHRoZSB0cmFuc2ZlciBpcyBpbiBhIHF1ZXVlIHJlYWR5IHRvIGdvCisgICBWQ0hJX0ZMQUdTX0FMTE9XX1BBUlRJQUwgICAgICAgICAgICAgPSAweDgsCisgICBWQ0hJX0ZMQUdTX0JMT0NLX1VOVElMX0RBVEFfUkVBRCAgICAgPSAweDEwLAorICAgVkNISV9GTEFHU19DQUxMQkFDS19XSEVOX0RBVEFfUkVBRCAgID0gMHgyMCwKKworICAgVkNISV9GTEFHU19BTElHTl9TTE9UICAgICAgICAgICAgPSAweDAwMDA4MCwgIC8vIGludGVybmFsIHVzZSBvbmx5CisgICBWQ0hJX0ZMQUdTX0JVTEtfQVVYX1FVRVVFRCAgICAgICA9IDB4MDEwMDAwLCAgLy8gaW50ZXJuYWwgdXNlIG9ubHkKKyAgIFZDSElfRkxBR1NfQlVMS19BVVhfQ09NUExFVEUgICAgID0gMHgwMjAwMDAsICAvLyBpbnRlcm5hbCB1c2Ugb25seQorICAgVkNISV9GTEFHU19CVUxLX0RBVEFfUVVFVUVEICAgICAgPSAweDA0MDAwMCwgIC8vIGludGVybmFsIHVzZSBvbmx5CisgICBWQ0hJX0ZMQUdTX0JVTEtfREFUQV9DT01QTEVURSAgICA9IDB4MDgwMDAwLCAgLy8gaW50ZXJuYWwgdXNlIG9ubHkKKyAgIFZDSElfRkxBR1NfSU5URVJOQUwgICAgICAgICAgICAgID0gMHhGRjAwMDAKK30gVkNISV9GTEFHU19UOworCisvLyBjb25zdGFudHMgZm9yIHZjaGlfY3JjX2NvbnRyb2woKQordHlwZWRlZiBlbnVtIHsKKyAgIFZDSElfQ1JDX05PVEhJTkcgPSAtMSwKKyAgIFZDSElfQ1JDX1BFUl9TRVJWSUNFID0gMCwKKyAgIFZDSElfQ1JDX0VWRVJZVEhJTkcgPSAxLAorfSBWQ0hJX0NSQ19DT05UUk9MX1Q7CisKKy8vY2FsbGJhY2sgcmVhc29ucyB3aGVuIGFuIGV2ZW50IG9jY3VycyBvbiBhIHNlcnZpY2UKK3R5cGVkZWYgZW51bQoreworICAgVkNISV9DQUxMQkFDS19SRUFTT05fTUlOLAorCisgICAvL1RoaXMgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgZGF0YSBhdmFpbGFibGUKKyAgIC8vaGFuZGxlIGlzIHRoZSBtc2cgaWQgdGhhdCB3YXMgdHJhbnNtaXR0ZWQgd2l0aCB0aGUgZGF0YQorICAgLy8gICAgV2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgYW5kIHRoZXJlIHdhcyBubyBGVUxMIG1lc3NhZ2UgYXZhaWxhYmxlIHByZXZpb3VzbHksIHNlbmQgY2FsbGJhY2sKKyAgIC8vICAgIFRhc2tzIGdldCBraWNrZWQgYnkgdGhlIGNhbGxiYWNrLCByZXNldCB0aGVpciBldmVudCBhbmQgdHJ5IGFuZCByZWFkIGZyb20gdGhlIGZpZm8gdW50aWwgaXQgZmFpbHMKKyAgIFZDSElfQ0FMTEJBQ0tfTVNHX0FWQUlMQUJMRSwKKyAgIFZDSElfQ0FMTEJBQ0tfTVNHX1NFTlQsCisgICBWQ0hJX0NBTExCQUNLX01TR19TUEFDRV9BVkFJTEFCTEUsIC8vIFhYWCBub3QgeWV0IGltcGxlbWVudGVkCisKKyAgIC8vIFRoaXMgaW5kaWNhdGVzIHRoYXQgYSB0cmFuc2ZlciBmcm9tIHRoZSBvdGhlciBzaWRlIGhhcyBjb21wbGV0ZWQKKyAgIFZDSElfQ0FMTEJBQ0tfQlVMS19SRUNFSVZFRCwKKyAgIC8vVGhpcyBpbmRpY2F0ZXMgdGhhdCBkYXRhIHF1ZXVlZCB1cCB0byBiZSBzZW50IGhhcyBub3cgZ29uZQorICAgLy9oYW5kbGUgaXMgdGhlIG1zZyBpZCB0aGF0IHdhcyB1c2VkIHdoZW4gc2VuZGluZyB0aGUgZGF0YQorICAgVkNISV9DQUxMQkFDS19CVUxLX1NFTlQsCisgICBWQ0hJX0NBTExCQUNLX0JVTEtfUlhfU1BBQ0VfQVZBSUxBQkxFLCAvLyBYWFggbm90IHlldCBpbXBsZW1lbnRlZAorICAgVkNISV9DQUxMQkFDS19CVUxLX1RYX1NQQUNFX0FWQUlMQUJMRSwgLy8gWFhYIG5vdCB5ZXQgaW1wbGVtZW50ZWQKKworICAgVkNISV9DQUxMQkFDS19TRVJWSUNFX0NMT1NFRCwKKworICAgLy8gdGhpcyBzaWRlIGhhcyBzZW50IFhPRkYgdG8gcGVlciBkdWUgdG8gbGFjayBvZiBkYXRhIGNvbnN1bXB0aW9uIGJ5IHNlcnZpY2UKKyAgIC8vIChzdWdnZXN0cyB0aGUgc2VydmljZSBtYXkgbmVlZCB0byB0YWtlIHNvbWUgcmVjb3ZlcnkgYWN0aW9uIGlmIGl0IGhhcworICAgLy8gYmVlbiBkZWxpYmVyYXRlbHkgaG9sZGluZyBvZmYgY29uc3VtaW5nIGRhdGEpCisgICBWQ0hJX0NBTExCQUNLX1NFTlRfWE9GRiwKKyAgIFZDSElfQ0FMTEJBQ0tfU0VOVF9YT04sCisKKyAgIC8vIGluZGljYXRlcyB0aGF0IGEgYnVsayB0cmFuc2ZlciBoYXMgZmluaXNoZWQgcmVhZGluZyB0aGUgc291cmNlIGJ1ZmZlcgorICAgVkNISV9DQUxMQkFDS19CVUxLX0RBVEFfUkVBRCwKKworICAgLy8gcG93ZXIgbm90aWZpY2F0aW9uIGV2ZW50cyAoY3VycmVudGx5IGhvc3Qgc2lkZSBvbmx5KQorICAgVkNISV9DQUxMQkFDS19QRUVSX09GRiwKKyAgIFZDSElfQ0FMTEJBQ0tfUEVFUl9TVVNQRU5ERUQsCisgICBWQ0hJX0NBTExCQUNLX1BFRVJfT04sCisgICBWQ0hJX0NBTExCQUNLX1BFRVJfUkVTVU1FRCwKKyAgIFZDSElfQ0FMTEJBQ0tfRk9SQ0VEX1BPV0VSX09GRiwKKworI2lmZGVmIFVTRV9WQ0hJUV9BUk0KKyAgIC8vIHNvbWUgZXh0cmEgbm90aWZpY2F0aW9ucyBwcm92aWRlZCBieSB2Y2hpcV9hcm0KKyAgIFZDSElfQ0FMTEJBQ0tfU0VSVklDRV9PUEVORUQsCisgICBWQ0hJX0NBTExCQUNLX0JVTEtfUkVDRUlWRV9BQk9SVEVELAorICAgVkNISV9DQUxMQkFDS19CVUxLX1RSQU5TTUlUX0FCT1JURUQsCisjZW5kaWYKKworICAgVkNISV9DQUxMQkFDS19SRUFTT05fTUFYCit9IFZDSElfQ0FMTEJBQ0tfUkVBU09OX1Q7CisKKy8vIHNlcnZpY2UgY29udHJvbCBvcHRpb25zCit0eXBlZGVmIGVudW0KK3sKKyAgIFZDSElfU0VSVklDRV9PUFRJT05fTUlOLAorCisgICBWQ0hJX1NFUlZJQ0VfT1BUSU9OX1RSQUNFLAorICAgVkNISV9TRVJWSUNFX09QVElPTl9TWU5DSFJPTk9VUywKKworICAgVkNISV9TRVJWSUNFX09QVElPTl9NQVgKK30gVkNISV9TRVJWSUNFX09QVElPTl9UOworCisKKy8vQ2FsbGJhY2sgdXNlZCBieSBhbGwgc2VydmljZXMgLyBidWxrIHRyYW5zZmVycwordHlwZWRlZiB2b2lkICgqVkNISV9DQUxMQkFDS19UKSggdm9pZCAqY2FsbGJhY2tfcGFyYW0sIC8vbXkgc2VydmljZSBsb2NhbCBwYXJhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9DQUxMQkFDS19SRUFTT05fVCByZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpoYW5kbGUgKTsgLy9mb3IgdHJhbnNtaXR0aW5nIG1zZydzIG9ubHkKKworCisKKy8qCisgKiBEZWZpbmUgdmVjdG9yIHN0cnVjdCBmb3Igc2NhdHRlci1nYXRoZXIgKHZlY3Rvcikgb3BlcmF0aW9ucworICogVmVjdG9ycyBjYW4gYmUgbmVzdGVkIC0gaWYgYSB2ZWN0b3IgZWxlbWVudCBoYXMgbmVnYXRpdmUgbGVuZ3RoLCB0aGVuCisgKiB0aGUgZGF0YSBwb2ludGVyIGlzIHRyZWF0ZWQgYXMgcG9pbnRpbmcgdG8gYW5vdGhlciB2ZWN0b3IgYXJyYXksIHdpdGgKKyAqICctdmVjX2xlbicgZWxlbWVudHMuIFRodXMgdG8gYXBwZW5kIGEgaGVhZGVyIG9udG8gYW4gZXhpc3RpbmcgdmVjdG9yLAorICogeW91IGNhbiBkbyB0aGlzOgorICoKKyAqIHZvaWQgZm9vKGNvbnN0IFZDSElfTVNHX1ZFQ1RPUl9UICp2LCBpbnQgbikKKyAqIHsKKyAqICAgIFZDSElfTVNHX1ZFQ1RPUl9UIG52WzJdOworICogICAgbnZbMF0udmVjX2Jhc2UgPSBteV9oZWFkZXI7CisgKiAgICBudlswXS52ZWNfbGVuID0gc2l6ZW9mIG15X2hlYWRlcjsKKyAqICAgIG52WzFdLnZlY19iYXNlID0gdjsKKyAqICAgIG52WzFdLnZlY19sZW4gPSAtbjsKKyAqICAgIC4uLgorICoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgdmNoaV9tc2dfdmVjdG9yIHsKKyAgIGNvbnN0IHZvaWQgKnZlY19iYXNlOworICAgaW50MzJfdCB2ZWNfbGVuOworfSBWQ0hJX01TR19WRUNUT1JfVDsKKworLy8gT3BhcXVlIHR5cGUgZm9yIGEgY29ubmVjdGlvbiBBUEkKK3R5cGVkZWYgc3RydWN0IG9wYXF1ZV92Y2hpX2Nvbm5lY3Rpb25fYXBpX3QgVkNISV9DT05ORUNUSU9OX0FQSV9UOworCisvLyBPcGFxdWUgdHlwZSBmb3IgYSBtZXNzYWdlIGRyaXZlcgordHlwZWRlZiBzdHJ1Y3Qgb3BhcXVlX3ZjaGlfbWVzc2FnZV9kcml2ZXJfdCBWQ0hJX01FU1NBR0VfRFJJVkVSX1Q7CisKKworLy8gSXRlcmF0b3Igc3RydWN0dXJlIGZvciByZWFkaW5nIGFoZWFkIHRocm91Z2ggcmVjZWl2ZWQgbWVzc2FnZSBxdWV1ZS4gQWxsb2NhdGVkIGJ5IGNsaWVudCwKKy8vIGluaXRpYWxpc2VkIGJ5IHZjaGlfbXNnX2xvb2tfYWhlYWQuIEZpZWxkcyBhcmUgZm9yIGludGVybmFsIFZDSEkgdXNlIG9ubHkuCisvLyBJdGVyYXRlcyBvdmVyIG1lc3NhZ2VzIGluIHF1ZXVlIGF0IHRoZSBpbnN0YW50IG9mIHRoZSBjYWxsIHRvIHZjaGlfbXNnX2xvb2thaGVhZCAtCisvLyB3aWxsIG5vdCBwcm9jZWVkIHRvIG1lc3NhZ2VzIHJlY2VpdmVkIHNpbmNlLiBCZWhhdmlvdXIgaXMgdW5kZWZpbmVkIGlmIGFuIGl0ZXJhdG9yCisvLyBpcyB1c2VkIGFnYWluIGFmdGVyIG1lc3NhZ2VzIGZvciB0aGF0IHNlcnZpY2UgYXJlIHJlbW92ZWQvZGVxdWV1ZWQgYnkgYW55CisvLyBtZWFucyBvdGhlciB0aGFuIHZjaGlfbXNnX2l0ZXJfLi4uIGNhbGxzIG9uIHRoZSBpdGVyYXRvciBpdHNlbGYuCit0eXBlZGVmIHN0cnVjdCB7CisgICBzdHJ1Y3Qgb3BhcXVlX3ZjaGlfc2VydmljZV90ICpzZXJ2aWNlOworICAgdm9pZCAqbGFzdDsKKyAgIHZvaWQgKm5leHQ7CisgICB2b2lkICpyZW1vdmU7Cit9IFZDSElfTVNHX0lURVJfVDsKKworCisjZW5kaWYgLy8gVkNISV9DT01NT05fSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGlfbWguaCBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGlfbWguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOThiZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvdmNoaV9taC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVkNISV9NSF9IXworI2RlZmluZSBWQ0hJX01IX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCit0eXBlZGVmIGludDMyX3QgVkNISV9NRU1fSEFORExFX1Q7CisjZGVmaW5lIFZDSElfTUVNX0hBTkRMRV9JTlZBTElEIDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxLmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQzOThiYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXEuaApAQCAtMCwwICsxLDQwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElRX1ZDSElRX0gKKyNkZWZpbmUgVkNISVFfVkNISVFfSAorCisjaW5jbHVkZSAidmNoaXFfaWYuaCIKKyNpbmNsdWRlICJ2Y2hpcV91dGlsLmgiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV8yODM1LmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxXzI4MzUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWE1YzY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV8yODM1LmgKQEAgLTAsMCArMSw0MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWQ0hJUV8yODM1X0gKKyNkZWZpbmUgVkNISVFfMjgzNV9ICisKKyNpbmNsdWRlICJ2Y2hpcV9wYWdlbGlzdC5oIgorCisjZGVmaW5lIFZDSElRX1BMQVRGT1JNX0ZSQUdNRU5UU19PRkZTRVRfSURYIDAKKyNkZWZpbmUgVkNISVFfUExBVEZPUk1fRlJBR01FTlRTX0NPVU5UX0lEWCAgMQorCisjZW5kaWYgLyogVkNISVFfMjgzNV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxXzI4MzVfYXJtLmMgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxXzI4MzVfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI5MDQwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfMjgzNV9hcm0uYwpAQCAtMCwwICsxLDU4NiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPHNvYy9iY20yODM1L3Jhc3BiZXJyeXBpLWZpcm13YXJlLmg+CisKKyNkZWZpbmUgZG1hY19tYXBfYXJlYQkJCV9fZ2x1ZShfQ0FDSEUsX2RtYV9tYXBfYXJlYSkKKyNkZWZpbmUgZG1hY191bm1hcF9hcmVhIAkJX19nbHVlKF9DQUNIRSxfZG1hX3VubWFwX2FyZWEpCisKK2V4dGVybiB2b2lkIGRtYWNfbWFwX2FyZWEoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7CitleHRlcm4gdm9pZCBkbWFjX3VubWFwX2FyZWEoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7CisKKyNkZWZpbmUgVE9UQUxfU0xPVFMgKFZDSElRX1NMT1RfWkVST19TTE9UUyArIDIgKiAzMikKKworI2RlZmluZSBWQ0hJUV9BUk1fQUREUkVTUyh4KSAoKHZvaWQgKikoKGNoYXIgKil4ICsgZ192aXJ0X3RvX2J1c19vZmZzZXQpKQorCisjaW5jbHVkZSAidmNoaXFfYXJtLmgiCisjaW5jbHVkZSAidmNoaXFfMjgzNS5oIgorI2luY2x1ZGUgInZjaGlxX2Nvbm5lY3RlZC5oIgorI2luY2x1ZGUgInZjaGlxX2tpbGxhYmxlLmgiCisKKyNkZWZpbmUgTUFYX0ZSQUdNRU5UUyAoVkNISVFfTlVNX0NVUlJFTlRfQlVMS1MgKiAyKQorCisjZGVmaW5lIEJFTEwwCTB4MDAKKyNkZWZpbmUgQkVMTDIJMHgwOAorCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV8yODM1X3N0YXRlX3N0cnVjdCB7CisgICBpbnQgaW5pdGVkOworICAgVkNISVFfQVJNX1NUQVRFX1QgYXJtX3N0YXRlOworfSBWQ0hJUV8yODM1X0FSTV9TVEFURV9UOworCitzdGF0aWMgdm9pZCBfX2lvbWVtICpnX3JlZ3M7CitzdGF0aWMgdW5zaWduZWQgaW50IGdfY2FjaGVfbGluZV9zaXplID0gc2l6ZW9mKENBQ0hFX0xJTkVfU0laRSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGdfZnJhZ21lbnRzX3NpemU7CitzdGF0aWMgY2hhciAqZ19mcmFnbWVudHNfYmFzZTsKK3N0YXRpYyBjaGFyICpnX2ZyZWVfZnJhZ21lbnRzOworc3RhdGljIHN0cnVjdCBzZW1hcGhvcmUgZ19mcmVlX2ZyYWdtZW50c19zZW1hOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ192aXJ0X3RvX2J1c19vZmZzZXQ7CisKK2V4dGVybiBpbnQgdmNoaXFfYXJtX2xvZ19sZXZlbDsKKworc3RhdGljIERFRklORV9TRU1BUEhPUkUoZ19mcmVlX2ZyYWdtZW50c19tdXRleCk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdAordmNoaXFfZG9vcmJlbGxfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CisKK3N0YXRpYyBpbnQKK2NyZWF0ZV9wYWdlbGlzdChjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIHVuc2lnbmVkIHNob3J0IHR5cGUsCisgICAgICAgICAgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBQQUdFTElTVF9UICoqIHBwYWdlbGlzdCk7CisKK3N0YXRpYyB2b2lkCitmcmVlX3BhZ2VsaXN0KFBBR0VMSVNUX1QgKnBhZ2VsaXN0LCBpbnQgYWN0dWFsKTsKKworaW50IHZjaGlxX3BsYXRmb3JtX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgcnBpX2Zpcm13YXJlICpmdyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCVZDSElRX1NMT1RfWkVST19UICp2Y2hpcV9zbG90X3plcm87CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdm9pZCAqc2xvdF9tZW07CisJZG1hX2FkZHJfdCBzbG90X3BoeXM7CisJdTMyIGNoYW5uZWxiYXNlOworCWludCBzbG90X21lbV9zaXplLCBmcmFnX21lbV9zaXplOworCWludCBlcnIsIGlycSwgaTsKKworCWdfdmlydF90b19idXNfb2Zmc2V0ID0gdmlydF90b19kbWEoZGV2LCAodm9pZCAqKTApOworCisJKHZvaWQpb2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCAiY2FjaGUtbGluZS1zaXplIiwKKwkJCQkgICAmZ19jYWNoZV9saW5lX3NpemUpOworCWdfZnJhZ21lbnRzX3NpemUgPSAyICogZ19jYWNoZV9saW5lX3NpemU7CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGNoYW5uZWxzIGluIGNvaGVyZW50IG1lbW9yeSAqLworCXNsb3RfbWVtX3NpemUgPSBQQUdFX0FMSUdOKFRPVEFMX1NMT1RTICogVkNISVFfU0xPVF9TSVpFKTsKKwlmcmFnX21lbV9zaXplID0gUEFHRV9BTElHTihnX2ZyYWdtZW50c19zaXplICogTUFYX0ZSQUdNRU5UUyk7CisKKwlzbG90X21lbSA9IGRtYW1fYWxsb2NfY29oZXJlbnQoZGV2LCBzbG90X21lbV9zaXplICsgZnJhZ19tZW1fc2l6ZSwKKwkJCQkgICAgICAgJnNsb3RfcGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbG90X21lbSkgeworCQlkZXZfZXJyKGRldiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBETUEgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJV0FSTl9PTigoKGludClzbG90X21lbSAmIChQQUdFX1NJWkUgLSAxKSkgIT0gMCk7CisKKwl2Y2hpcV9zbG90X3plcm8gPSB2Y2hpcV9pbml0X3Nsb3RzKHNsb3RfbWVtLCBzbG90X21lbV9zaXplKTsKKwlpZiAoIXZjaGlxX3Nsb3RfemVybykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2Y2hpcV9zbG90X3plcm8tPnBsYXRmb3JtX2RhdGFbVkNISVFfUExBVEZPUk1fRlJBR01FTlRTX09GRlNFVF9JRFhdID0KKwkJKGludClzbG90X3BoeXMgKyBzbG90X21lbV9zaXplOworCXZjaGlxX3Nsb3RfemVyby0+cGxhdGZvcm1fZGF0YVtWQ0hJUV9QTEFURk9STV9GUkFHTUVOVFNfQ09VTlRfSURYXSA9CisJCU1BWF9GUkFHTUVOVFM7CisKKwlnX2ZyYWdtZW50c19iYXNlID0gKGNoYXIgKilzbG90X21lbSArIHNsb3RfbWVtX3NpemU7CisJc2xvdF9tZW1fc2l6ZSArPSBmcmFnX21lbV9zaXplOworCisJZ19mcmVlX2ZyYWdtZW50cyA9IGdfZnJhZ21lbnRzX2Jhc2U7CisJZm9yIChpID0gMDsgaSA8IChNQVhfRlJBR01FTlRTIC0gMSk7IGkrKykgeworCQkqKGNoYXIgKiopJmdfZnJhZ21lbnRzX2Jhc2VbaSpnX2ZyYWdtZW50c19zaXplXSA9CisJCQkmZ19mcmFnbWVudHNfYmFzZVsoaSArIDEpKmdfZnJhZ21lbnRzX3NpemVdOworCX0KKwkqKGNoYXIgKiopJmdfZnJhZ21lbnRzX2Jhc2VbaSAqIGdfZnJhZ21lbnRzX3NpemVdID0gTlVMTDsKKwlzZW1hX2luaXQoJmdfZnJlZV9mcmFnbWVudHNfc2VtYSwgTUFYX0ZSQUdNRU5UUyk7CisKKwlpZiAodmNoaXFfaW5pdF9zdGF0ZShzdGF0ZSwgdmNoaXFfc2xvdF96ZXJvLCAwKSAhPSBWQ0hJUV9TVUNDRVNTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJZ19yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihnX3JlZ3MpKQorCQlyZXR1cm4gUFRSX0VSUihnX3JlZ3MpOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDw9IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IElSUVxuIik7CisJCXJldHVybiBpcnE7CisJfQorCisJZXJyID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIGlycSwgdmNoaXFfZG9vcmJlbGxfaXJxLCBJUlFGX0lSUVBPTEwsCisJCQkgICAgICAgIlZDSElRIGRvb3JiZWxsIiwgc3RhdGUpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgaXJxPSVkXG4iLCBpcnEpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIFNlbmQgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgc2xvdHMgdG8gVmlkZW9Db3JlICovCisJY2hhbm5lbGJhc2UgPSBzbG90X3BoeXM7CisJZXJyID0gcnBpX2Zpcm13YXJlX3Byb3BlcnR5KGZ3LCBSUElfRklSTVdBUkVfVkNISVFfSU5JVCwKKwkJCQkgICAgJmNoYW5uZWxiYXNlLCBzaXplb2YoY2hhbm5lbGJhc2UpKTsKKwlpZiAoZXJyIHx8IGNoYW5uZWxiYXNlKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHNldCBjaGFubmVsYmFzZVxuIik7CisJCXJldHVybiBlcnIgPyA6IC1FTlhJTzsKKwl9CisKKwl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkidmNoaXFfaW5pdCAtIGRvbmUgKHNsb3RzICV4LCBwaHlzICVwYWQpIiwKKwkJKHVuc2lnbmVkIGludCl2Y2hpcV9zbG90X3plcm8sICZzbG90X3BoeXMpOworCisJdmNoaXFfY2FsbF9jb25uZWN0ZWRfY2FsbGJhY2tzKCk7CisKKyAgIHJldHVybiAwOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfcGxhdGZvcm1faW5pdF9zdGF0ZShWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKyAgIFZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisgICBzdGF0ZS0+cGxhdGZvcm1fc3RhdGUgPSBremFsbG9jKHNpemVvZihWQ0hJUV8yODM1X0FSTV9TVEFURV9UKSwgR0ZQX0tFUk5FTCk7CisgICAoKFZDSElRXzI4MzVfQVJNX1NUQVRFX1QqKXN0YXRlLT5wbGF0Zm9ybV9zdGF0ZSktPmluaXRlZCA9IDE7CisgICBzdGF0dXMgPSB2Y2hpcV9hcm1faW5pdF9zdGF0ZShzdGF0ZSwgJigoVkNISVFfMjgzNV9BUk1fU1RBVEVfVCopc3RhdGUtPnBsYXRmb3JtX3N0YXRlKS0+YXJtX3N0YXRlKTsKKyAgIGlmKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKQorICAgeworICAgICAgKChWQ0hJUV8yODM1X0FSTV9TVEFURV9UKilzdGF0ZS0+cGxhdGZvcm1fc3RhdGUpLT5pbml0ZWQgPSAwOworICAgfQorICAgcmV0dXJuIHN0YXR1czsKK30KKworVkNISVFfQVJNX1NUQVRFX1QqCit2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworICAgaWYoISgoVkNISVFfMjgzNV9BUk1fU1RBVEVfVCopc3RhdGUtPnBsYXRmb3JtX3N0YXRlKS0+aW5pdGVkKQorICAgeworICAgICAgQlVHKCk7CisgICB9CisgICByZXR1cm4gJigoVkNISVFfMjgzNV9BUk1fU1RBVEVfVCopc3RhdGUtPnBsYXRmb3JtX3N0YXRlKS0+YXJtX3N0YXRlOworfQorCit2b2lkCityZW1vdGVfZXZlbnRfc2lnbmFsKFJFTU9URV9FVkVOVF9UICpldmVudCkKK3sKKwl3bWIoKTsKKworCWV2ZW50LT5maXJlZCA9IDE7CisKKwlkc2IoKTsgICAgICAgICAvKiBkYXRhIGJhcnJpZXIgb3BlcmF0aW9uICovCisKKwlpZiAoZXZlbnQtPmFybWVkKQorCQl3cml0ZWwoMCwgZ19yZWdzICsgQkVMTDIpOyAvKiB0cmlnZ2VyIHZjIGludGVycnVwdCAqLworfQorCitpbnQKK3ZjaGlxX2NvcHlfZnJvbV91c2VyKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBpbnQgc2l6ZSkKK3sKKwlpZiAoKHVpbnQzMl90KXNyYyA8IFRBU0tfU0laRSkgeworCQlyZXR1cm4gY29weV9mcm9tX3VzZXIoZHN0LCBzcmMsIHNpemUpOworCX0gZWxzZSB7CisJCW1lbWNweShkc3QsIHNyYywgc2l6ZSk7CisJCXJldHVybiAwOworCX0KK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3ByZXBhcmVfYnVsa19kYXRhKFZDSElRX0JVTEtfVCAqYnVsaywgVkNISV9NRU1fSEFORExFX1QgbWVtaGFuZGxlLAorCXZvaWQgKm9mZnNldCwgaW50IHNpemUsIGludCBkaXIpCit7CisJUEFHRUxJU1RfVCAqcGFnZWxpc3Q7CisJaW50IHJldDsKKworCVdBUk5fT04obWVtaGFuZGxlICE9IFZDSElfTUVNX0hBTkRMRV9JTlZBTElEKTsKKworCXJldCA9IGNyZWF0ZV9wYWdlbGlzdCgoY2hhciBfX3VzZXIgKilvZmZzZXQsIHNpemUsCisJCQkoZGlyID09IFZDSElRX0JVTEtfUkVDRUlWRSkKKwkJCT8gUEFHRUxJU1RfUkVBRAorCQkJOiBQQUdFTElTVF9XUklURSwKKwkJCWN1cnJlbnQsCisJCQkmcGFnZWxpc3QpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCisJYnVsay0+aGFuZGxlID0gbWVtaGFuZGxlOworCWJ1bGstPmRhdGEgPSBWQ0hJUV9BUk1fQUREUkVTUyhwYWdlbGlzdCk7CisKKwkvKiBTdG9yZSB0aGUgcGFnZWxpc3QgYWRkcmVzcyBpbiByZW1vdGVfZGF0YSwgd2hpY2ggaXNuJ3QgdXNlZCBieSB0aGUKKwkgICBzbGF2ZS4gKi8KKwlidWxrLT5yZW1vdGVfZGF0YSA9IHBhZ2VsaXN0OworCisJcmV0dXJuIFZDSElRX1NVQ0NFU1M7Cit9CisKK3ZvaWQKK3ZjaGlxX2NvbXBsZXRlX2J1bGsoVkNISVFfQlVMS19UICpidWxrKQoreworCWlmIChidWxrICYmIGJ1bGstPnJlbW90ZV9kYXRhICYmIGJ1bGstPmFjdHVhbCkKKwkJZnJlZV9wYWdlbGlzdCgoUEFHRUxJU1RfVCAqKWJ1bGstPnJlbW90ZV9kYXRhLCBidWxrLT5hY3R1YWwpOworfQorCit2b2lkCit2Y2hpcV90cmFuc2Zlcl9idWxrKFZDSElRX0JVTEtfVCAqYnVsaykKK3sKKwkvKgorCSAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIHRoZSBtYXN0ZXIgKFZpZGVvQ29yZSkgc2lkZSwgYnV0CisJICogcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiB0byBhdm9pZCB0aGUgbmVlZCBmb3IgaWZkZWZlcnkuCisJICovCisJQlVHKCk7Cit9CisKK3ZvaWQKK3ZjaGlxX2R1bXBfcGxhdGZvcm1fc3RhdGUodm9pZCAqZHVtcF9jb250ZXh0KQoreworCWNoYXIgYnVmWzgwXTsKKwlpbnQgbGVuOworCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCSIgIFBsYXRmb3JtOiAyODM1IChWQyBtYXN0ZXIpIik7CisJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9wbGF0Zm9ybV9zdXNwZW5kKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworICAgcmV0dXJuIFZDSElRX0VSUk9SOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfcGxhdGZvcm1fcmVzdW1lKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworICAgcmV0dXJuIFZDSElRX1NVQ0NFU1M7Cit9CisKK3ZvaWQKK3ZjaGlxX3BsYXRmb3JtX3BhdXNlZChWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKK30KKwordm9pZAordmNoaXFfcGxhdGZvcm1fcmVzdW1lZChWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKK30KKworaW50Cit2Y2hpcV9wbGF0Zm9ybV92aWRlb2NvcmVfd2FudGVkKFZDSElRX1NUQVRFX1QqIHN0YXRlKQoreworICAgcmV0dXJuIDE7IC8vIGF1dG9zdXNwZW5kIG5vdCBzdXBwb3J0ZWQgLSB2aWRlb2NvcmUgYWx3YXlzIHdhbnRlZAorfQorCitpbnQKK3ZjaGlxX3BsYXRmb3JtX3VzZV9zdXNwZW5kX3RpbWVyKHZvaWQpCit7CisgICByZXR1cm4gMDsKK30KK3ZvaWQKK3ZjaGlxX2R1bXBfcGxhdGZvcm1fdXNlX3N0YXRlKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsICJTdXNwZW5kIHRpbWVyIG5vdCBpbiB1c2UiKTsKK30KK3ZvaWQKK3ZjaGlxX3BsYXRmb3JtX2hhbmRsZV90aW1lb3V0KFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCSh2b2lkKXN0YXRlOworfQorLyoKKyAqIExvY2FsIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdAordmNoaXFfZG9vcmJlbGxfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IGRldl9pZDsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJLyogUmVhZCAoYW5kIGNsZWFyKSB0aGUgZG9vcmJlbGwgKi8KKwlzdGF0dXMgPSByZWFkbChnX3JlZ3MgKyBCRUxMMCk7CisKKwlpZiAoc3RhdHVzICYgMHg0KSB7ICAvKiBXYXMgdGhlIGRvb3JiZWxsIHJ1bmc/ICovCisJCXJlbW90ZV9ldmVudF9wb2xsYWxsKHN0YXRlKTsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogVGhlcmUgaXMgYSBwb3RlbnRpYWwgcHJvYmxlbSB3aXRoIHBhcnRpYWwgY2FjaGUgbGluZXMgKHBhZ2VzPykKKyoqIGF0IHRoZSBlbmRzIG9mIHRoZSBibG9jayB3aGVuIHJlYWRpbmcuIElmIHRoZSBDUFUgYWNjZXNzZWQgYW55dGhpbmcgaW4KKyoqIHRoZSBzYW1lIGxpbmUgKHBhZ2U/KSB0aGVuIGl0IG1heSBoYXZlIHB1bGxlZCBvbGQgZGF0YSBpbnRvIHRoZSBjYWNoZSwKKyoqIG9ic2N1cmluZyB0aGUgbmV3IGRhdGEgdW5kZXJuZWF0aC4gV2UgY2FuIHNvbHZlIHRoaXMgYnkgdHJhbnNmZXJyaW5nIHRoZQorKiogcGFydGlhbCBjYWNoZSBsaW5lcyBzZXBhcmF0ZWx5LCBhbmQgYWxsb3dpbmcgdGhlIEFSTSB0byBjb3B5IGludG8gdGhlCisqKiBjYWNoZWQgYXJlYS4KKworKiogTi5CLiBUaGlzIGltcGxlbWVudGF0aW9uIHBsYXlzIHNsaWdodGx5IGZhc3QgYW5kIGxvb3NlIHdpdGggdGhlIExpbnV4CisqKiBkcml2ZXIgcHJvZ3JhbW1pbmcgcnVsZXMsIGUuZy4gaXRzIHVzZSBvZiBkbWFjX21hcF9hcmVhIGluc3RlYWQgb2YKKyoqIGRtYV9tYXBfc2luZ2xlLCBidXQgaXQgaXNuJ3QgYSBtdWx0aS1wbGF0Zm9ybSBkcml2ZXIgYW5kIGl0IGJlbmVmaXRzCisqKiBmcm9tIGluY3JlYXNlZCBzcGVlZCBhcyBhIHJlc3VsdC4KKyovCisKK3N0YXRpYyBpbnQKK2NyZWF0ZV9wYWdlbGlzdChjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIHVuc2lnbmVkIHNob3J0IHR5cGUsCisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBQQUdFTElTVF9UICoqIHBwYWdlbGlzdCkKK3sKKwlQQUdFTElTVF9UICpwYWdlbGlzdDsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOworCXVuc2lnbmVkIGxvbmcgKmFkZHJzOworCXVuc2lnbmVkIGludCBudW1fcGFnZXMsIG9mZnNldCwgaTsKKwljaGFyICphZGRyLCAqYmFzZV9hZGRyLCAqbmV4dF9hZGRyOworCWludCBydW4sIGFkZHJpZHgsIGFjdHVhbF9wYWdlczsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAqbmVlZF9yZWxlYXNlOworCisJb2Zmc2V0ID0gKHVuc2lnbmVkIGludClidWYgJiAoUEFHRV9TSVpFIC0gMSk7CisJbnVtX3BhZ2VzID0gKGNvdW50ICsgb2Zmc2V0ICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisKKwkqcHBhZ2VsaXN0ID0gTlVMTDsKKworCS8qIEFsbG9jYXRlIGVub3VnaCBzdG9yYWdlIHRvIGhvbGQgdGhlIHBhZ2UgcG9pbnRlcnMgYW5kIHRoZSBwYWdlCisJKiogbGlzdAorCSovCisJcGFnZWxpc3QgPSBrbWFsbG9jKHNpemVvZihQQUdFTElTVF9UKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVtX3BhZ2VzICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodW5zaWduZWQgbG9uZykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bV9wYWdlcyAqIHNpemVvZihwYWdlc1swXSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJImNyZWF0ZV9wYWdlbGlzdCAtICV4IiwgKHVuc2lnbmVkIGludClwYWdlbGlzdCk7CisJaWYgKCFwYWdlbGlzdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhZGRycyA9IHBhZ2VsaXN0LT5hZGRyczsKKyAgICAgICAgbmVlZF9yZWxlYXNlID0gKHVuc2lnbmVkIGxvbmcgKikoYWRkcnMgKyBudW1fcGFnZXMpOworCXBhZ2VzID0gKHN0cnVjdCBwYWdlICoqKShhZGRycyArIG51bV9wYWdlcyArIDEpOworCisJaWYgKGlzX3ZtYWxsb2NfYWRkcihidWYpKSB7CisJCWludCBkaXIgPSAodHlwZSA9PSBQQUdFTElTVF9XUklURSkgPworCQkJRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRTsKKwkJdW5zaWduZWQgbG9uZyBsZW5ndGggPSBjb3VudDsKKwkJdW5zaWduZWQgaW50IG9mZiA9IG9mZnNldDsKKworCQlmb3IgKGFjdHVhbF9wYWdlcyA9IDA7IGFjdHVhbF9wYWdlcyA8IG51bV9wYWdlczsKKwkJICAgICBhY3R1YWxfcGFnZXMrKykgeworCQkJc3RydWN0IHBhZ2UgKnBnID0gdm1hbGxvY190b19wYWdlKGJ1ZiArIChhY3R1YWxfcGFnZXMgKgorCQkJCQkJCQkgUEFHRV9TSVpFKSk7CisJCQlzaXplX3QgYnl0ZXMgPSBQQUdFX1NJWkUgLSBvZmY7CisKKwkJCWlmIChieXRlcyA+IGxlbmd0aCkKKwkJCQlieXRlcyA9IGxlbmd0aDsKKwkJCXBhZ2VzW2FjdHVhbF9wYWdlc10gPSBwZzsKKwkJCWRtYWNfbWFwX2FyZWEocGFnZV9hZGRyZXNzKHBnKSArIG9mZiwgYnl0ZXMsIGRpcik7CisJCQlsZW5ndGggLT0gYnl0ZXM7CisJCQlvZmYgPSAwOworCQl9CisJCSpuZWVkX3JlbGVhc2UgPSAwOyAvKiBkbyBub3QgdHJ5IGFuZCByZWxlYXNlIHZtYWxsb2MgcGFnZXMgKi8KKwl9IGVsc2UgeworCQlkb3duX3JlYWQoJnRhc2stPm1tLT5tbWFwX3NlbSk7CisJCWFjdHVhbF9wYWdlcyA9IGdldF91c2VyX3BhZ2VzKHRhc2ssIHRhc2stPm1tLAorCQkJCSAgICAgICAgICAodW5zaWduZWQgbG9uZylidWYgJiB+KFBBR0VfU0laRSAtIDEpLAorCQkJCQkgIG51bV9wYWdlcywKKwkJCQkJICAodHlwZSA9PSBQQUdFTElTVF9SRUFEKSAvKldyaXRlICovICwKKwkJCQkJICAwIC8qRm9yY2UgKi8gLAorCQkJCQkgIHBhZ2VzLAorCQkJCQkgIE5VTEwgLyp2bWFzICovKTsKKwkJdXBfcmVhZCgmdGFzay0+bW0tPm1tYXBfc2VtKTsKKworCQlpZiAoYWN0dWFsX3BhZ2VzICE9IG51bV9wYWdlcykgeworCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkgICAgICAgImNyZWF0ZV9wYWdlbGlzdCAtIG9ubHkgJWQvJWQgcGFnZXMgbG9ja2VkIiwKKwkJCQkgICAgICAgYWN0dWFsX3BhZ2VzLAorCQkJCSAgICAgICBudW1fcGFnZXMpOworCisJCQkvKiBUaGlzIGlzIHByb2JhYmx5IGR1ZSB0byB0aGUgcHJvY2VzcyBiZWluZyBraWxsZWQgKi8KKwkJCXdoaWxlIChhY3R1YWxfcGFnZXMgPiAwKQorCQkJeworCQkJCWFjdHVhbF9wYWdlcy0tOworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlc1thY3R1YWxfcGFnZXNdKTsKKwkJCX0KKwkJCWtmcmVlKHBhZ2VsaXN0KTsKKwkJCWlmIChhY3R1YWxfcGFnZXMgPT0gMCkKKwkJCQlhY3R1YWxfcGFnZXMgPSAtRU5PTUVNOworCQkJcmV0dXJuIGFjdHVhbF9wYWdlczsKKwkJfQorCQkqbmVlZF9yZWxlYXNlID0gMTsgLyogcmVsZWFzZSB1c2VyIHBhZ2VzICovCisJfQorCisJcGFnZWxpc3QtPmxlbmd0aCA9IGNvdW50OworCXBhZ2VsaXN0LT50eXBlID0gdHlwZTsKKwlwYWdlbGlzdC0+b2Zmc2V0ID0gb2Zmc2V0OworCisJLyogR3JvdXAgdGhlIHBhZ2VzIGludG8gcnVucyBvZiBjb250aWd1b3VzIHBhZ2VzICovCisKKwliYXNlX2FkZHIgPSBWQ0hJUV9BUk1fQUREUkVTUyhwYWdlX2FkZHJlc3MocGFnZXNbMF0pKTsKKwluZXh0X2FkZHIgPSBiYXNlX2FkZHIgKyBQQUdFX1NJWkU7CisJYWRkcmlkeCA9IDA7CisJcnVuID0gMDsKKworCWZvciAoaSA9IDE7IGkgPCBudW1fcGFnZXM7IGkrKykgeworCQlhZGRyID0gVkNISVFfQVJNX0FERFJFU1MocGFnZV9hZGRyZXNzKHBhZ2VzW2ldKSk7CisJCWlmICgoYWRkciA9PSBuZXh0X2FkZHIpICYmIChydW4gPCAoUEFHRV9TSVpFIC0gMSkpKSB7CisJCQluZXh0X2FkZHIgKz0gUEFHRV9TSVpFOworCQkJcnVuKys7CisJCX0gZWxzZSB7CisJCQlhZGRyc1thZGRyaWR4XSA9ICh1bnNpZ25lZCBsb25nKWJhc2VfYWRkciArIHJ1bjsKKwkJCWFkZHJpZHgrKzsKKwkJCWJhc2VfYWRkciA9IGFkZHI7CisJCQluZXh0X2FkZHIgPSBhZGRyICsgUEFHRV9TSVpFOworCQkJcnVuID0gMDsKKwkJfQorCX0KKworCWFkZHJzW2FkZHJpZHhdID0gKHVuc2lnbmVkIGxvbmcpYmFzZV9hZGRyICsgcnVuOworCWFkZHJpZHgrKzsKKworCS8qIFBhcnRpYWwgY2FjaGUgbGluZXMgKGZyYWdtZW50cykgcmVxdWlyZSBzcGVjaWFsIG1lYXN1cmVzICovCisJaWYgKCh0eXBlID09IFBBR0VMSVNUX1JFQUQpICYmCisJCSgocGFnZWxpc3QtPm9mZnNldCAmIChnX2NhY2hlX2xpbmVfc2l6ZSAtIDEpKSB8fAorCQkoKHBhZ2VsaXN0LT5vZmZzZXQgKyBwYWdlbGlzdC0+bGVuZ3RoKSAmCisJCShnX2NhY2hlX2xpbmVfc2l6ZSAtIDEpKSkpIHsKKwkJY2hhciAqZnJhZ21lbnRzOworCisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmdfZnJlZV9mcmFnbWVudHNfc2VtYSkgIT0gMCkgeworCQkJa2ZyZWUocGFnZWxpc3QpOworCQkJcmV0dXJuIC1FSU5UUjsKKwkJfQorCisJCVdBUk5fT04oZ19mcmVlX2ZyYWdtZW50cyA9PSBOVUxMKTsKKworCQlkb3duKCZnX2ZyZWVfZnJhZ21lbnRzX211dGV4KTsKKwkJZnJhZ21lbnRzID0gZ19mcmVlX2ZyYWdtZW50czsKKwkJV0FSTl9PTihmcmFnbWVudHMgPT0gTlVMTCk7CisJCWdfZnJlZV9mcmFnbWVudHMgPSAqKGNoYXIgKiopIGdfZnJlZV9mcmFnbWVudHM7CisJCXVwKCZnX2ZyZWVfZnJhZ21lbnRzX211dGV4KTsKKwkJcGFnZWxpc3QtPnR5cGUgPSBQQUdFTElTVF9SRUFEX1dJVEhfRlJBR01FTlRTICsKKwkJCShmcmFnbWVudHMgLSBnX2ZyYWdtZW50c19iYXNlKSAvIGdfZnJhZ21lbnRzX3NpemU7CisJfQorCisJZG1hY19mbHVzaF9yYW5nZShwYWdlbGlzdCwgYWRkcnMgKyBudW1fcGFnZXMpOworCisJKnBwYWdlbGlzdCA9IHBhZ2VsaXN0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX3BhZ2VsaXN0KFBBR0VMSVNUX1QgKnBhZ2VsaXN0LCBpbnQgYWN0dWFsKQoreworICAgICAgICB1bnNpZ25lZCBsb25nICpuZWVkX3JlbGVhc2U7CisJc3RydWN0IHBhZ2UgKipwYWdlczsKKwl1bnNpZ25lZCBpbnQgbnVtX3BhZ2VzLCBpOworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCSJmcmVlX3BhZ2VsaXN0IC0gJXgsICVkIiwgKHVuc2lnbmVkIGludClwYWdlbGlzdCwgYWN0dWFsKTsKKworCW51bV9wYWdlcyA9CisJCShwYWdlbGlzdC0+bGVuZ3RoICsgcGFnZWxpc3QtPm9mZnNldCArIFBBR0VfU0laRSAtIDEpIC8KKwkJUEFHRV9TSVpFOworCisgICAgICAgIG5lZWRfcmVsZWFzZSA9ICh1bnNpZ25lZCBsb25nICopKHBhZ2VsaXN0LT5hZGRycyArIG51bV9wYWdlcyk7CisJcGFnZXMgPSAoc3RydWN0IHBhZ2UgKiopKHBhZ2VsaXN0LT5hZGRycyArIG51bV9wYWdlcyArIDEpOworCisJLyogRGVhbCB3aXRoIGFueSBwYXJ0aWFsIGNhY2hlIGxpbmVzIChmcmFnbWVudHMpICovCisJaWYgKHBhZ2VsaXN0LT50eXBlID49IFBBR0VMSVNUX1JFQURfV0lUSF9GUkFHTUVOVFMpIHsKKwkJY2hhciAqZnJhZ21lbnRzID0gZ19mcmFnbWVudHNfYmFzZSArCisJCQkocGFnZWxpc3QtPnR5cGUgLSBQQUdFTElTVF9SRUFEX1dJVEhfRlJBR01FTlRTKSAqCisJCQlnX2ZyYWdtZW50c19zaXplOworCQlpbnQgaGVhZF9ieXRlcywgdGFpbF9ieXRlczsKKwkJaGVhZF9ieXRlcyA9IChnX2NhY2hlX2xpbmVfc2l6ZSAtIHBhZ2VsaXN0LT5vZmZzZXQpICYKKwkJCShnX2NhY2hlX2xpbmVfc2l6ZSAtIDEpOworCQl0YWlsX2J5dGVzID0gKHBhZ2VsaXN0LT5vZmZzZXQgKyBhY3R1YWwpICYKKwkJCShnX2NhY2hlX2xpbmVfc2l6ZSAtIDEpOworCisJCWlmICgoYWN0dWFsID49IDApICYmIChoZWFkX2J5dGVzICE9IDApKSB7CisJCQlpZiAoaGVhZF9ieXRlcyA+IGFjdHVhbCkKKwkJCQloZWFkX2J5dGVzID0gYWN0dWFsOworCisJCQltZW1jcHkoKGNoYXIgKilwYWdlX2FkZHJlc3MocGFnZXNbMF0pICsKKwkJCQlwYWdlbGlzdC0+b2Zmc2V0LAorCQkJCWZyYWdtZW50cywKKwkJCQloZWFkX2J5dGVzKTsKKwkJfQorCQlpZiAoKGFjdHVhbCA+PSAwKSAmJiAoaGVhZF9ieXRlcyA8IGFjdHVhbCkgJiYKKwkJCSh0YWlsX2J5dGVzICE9IDApKSB7CisJCQltZW1jcHkoKGNoYXIgKilwYWdlX2FkZHJlc3MocGFnZXNbbnVtX3BhZ2VzIC0gMV0pICsKKwkJCQkoKHBhZ2VsaXN0LT5vZmZzZXQgKyBhY3R1YWwpICYKKwkJCQkoUEFHRV9TSVpFIC0gMSkgJiB+KGdfY2FjaGVfbGluZV9zaXplIC0gMSkpLAorCQkJCWZyYWdtZW50cyArIGdfY2FjaGVfbGluZV9zaXplLAorCQkJCXRhaWxfYnl0ZXMpOworCQl9CisKKwkJZG93bigmZ19mcmVlX2ZyYWdtZW50c19tdXRleCk7CisJCSooY2hhciAqKilmcmFnbWVudHMgPSBnX2ZyZWVfZnJhZ21lbnRzOworCQlnX2ZyZWVfZnJhZ21lbnRzID0gZnJhZ21lbnRzOworCQl1cCgmZ19mcmVlX2ZyYWdtZW50c19tdXRleCk7CisJCXVwKCZnX2ZyZWVfZnJhZ21lbnRzX3NlbWEpOworCX0KKworCWlmICgqbmVlZF9yZWxlYXNlKSB7CisJCXVuc2lnbmVkIGludCBsZW5ndGggPSBwYWdlbGlzdC0+bGVuZ3RoOworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gcGFnZWxpc3QtPm9mZnNldDsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKKwkJCXN0cnVjdCBwYWdlICpwZyA9IHBhZ2VzW2ldOworCisJCQlpZiAocGFnZWxpc3QtPnR5cGUgIT0gUEFHRUxJU1RfV1JJVEUpIHsKKwkJCQl1bnNpZ25lZCBpbnQgYnl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7CisKKwkJCQlpZiAoYnl0ZXMgPiBsZW5ndGgpCisJCQkJCWJ5dGVzID0gbGVuZ3RoOworCQkJCWRtYWNfdW5tYXBfYXJlYShwYWdlX2FkZHJlc3MocGcpICsgb2Zmc2V0LAorCQkJCQkJYnl0ZXMsIERNQV9GUk9NX0RFVklDRSk7CisJCQkJbGVuZ3RoIC09IGJ5dGVzOworCQkJCW9mZnNldCA9IDA7CisJCQkJc2V0X3BhZ2VfZGlydHkocGcpOworCQkJfQorCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBnKTsKKwkJfQorCX0KKworCWtmcmVlKHBhZ2VsaXN0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfYXJtLmMgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMWMwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2FybS5jCkBAIC0wLDAgKzEsMjkwMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgUmFzcGJlcnJ5IFBpIChUcmFkaW5nKSBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8c29jL2JjbTI4MzUvcmFzcGJlcnJ5cGktZmlybXdhcmUuaD4KKworI2luY2x1ZGUgInZjaGlxX2NvcmUuaCIKKyNpbmNsdWRlICJ2Y2hpcV9pb2N0bC5oIgorI2luY2x1ZGUgInZjaGlxX2FybS5oIgorI2luY2x1ZGUgInZjaGlxX2RlYnVnZnMuaCIKKyNpbmNsdWRlICJ2Y2hpcV9raWxsYWJsZS5oIgorCisjZGVmaW5lIERFVklDRV9OQU1FICJ2Y2hpcSIKKworLyogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgcHJlZml4LCB3aGljaCB3b3VsZCBiZSB2Y2hpcV9hcm0gKGZyb20gdGhlIGZpbGVuYW1lKSAqLworI3VuZGVmIE1PRFVMRV9QQVJBTV9QUkVGSVgKKyNkZWZpbmUgTU9EVUxFX1BBUkFNX1BSRUZJWCBERVZJQ0VfTkFNRSAiLiIKKworI2RlZmluZSBWQ0hJUV9NSU5PUiAwCisKKy8qIFNvbWUgcGVyLWluc3RhbmNlIGNvbnN0YW50cyAqLworI2RlZmluZSBNQVhfQ09NUExFVElPTlMgMTYKKyNkZWZpbmUgTUFYX1NFUlZJQ0VTIDY0CisjZGVmaW5lIE1BWF9FTEVNRU5UUyA4CisjZGVmaW5lIE1TR19RVUVVRV9TSVpFIDY0CisKKyNkZWZpbmUgS0VFUEFMSVZFX1ZFUiAxCisjZGVmaW5lIEtFRVBBTElWRV9WRVJfTUlOIEtFRVBBTElWRV9WRVIKKworLyogUnVuIHRpbWUgY29udHJvbCBvZiBsb2cgbGV2ZWwsIGJhc2VkIG9uIEtFUk5fWFhYIGxldmVsLiAqLworaW50IHZjaGlxX2FybV9sb2dfbGV2ZWwgPSBWQ0hJUV9MT0dfREVGQVVMVDsKK2ludCB2Y2hpcV9zdXNwX2xvZ19sZXZlbCA9IFZDSElRX0xPR19FUlJPUjsKKworI2RlZmluZSBTVVNQRU5EX1RJTUVSX1RJTUVPVVRfTVMgMTAwCisjZGVmaW5lIFNVU1BFTkRfUkVUUllfVElNRVJfVElNRU9VVF9NUyAxMDAwCisKKyNkZWZpbmUgVkNfU1VTUEVORF9OVU1fT0ZGU0VUIDMgLyogbnVtYmVyIG9mIHZhbHVlcyBiZWZvcmUgaWRsZSB3aGljaCBhcmUgLXZlICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3VzcGVuZF9zdGF0ZV9uYW1lc1tdID0geworCSJWQ19TVVNQRU5EX0ZPUkNFX0NBTkNFTEVEIiwKKwkiVkNfU1VTUEVORF9SRUpFQ1RFRCIsCisJIlZDX1NVU1BFTkRfRkFJTEVEIiwKKwkiVkNfU1VTUEVORF9JRExFIiwKKwkiVkNfU1VTUEVORF9SRVFVRVNURUQiLAorCSJWQ19TVVNQRU5EX0lOX1BST0dSRVNTIiwKKwkiVkNfU1VTUEVORF9TVVNQRU5ERUQiCit9OworI2RlZmluZSBWQ19SRVNVTUVfTlVNX09GRlNFVCAxIC8qIG51bWJlciBvZiB2YWx1ZXMgYmVmb3JlIGlkbGUgd2hpY2ggYXJlIC12ZSAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHJlc3VtZV9zdGF0ZV9uYW1lc1tdID0geworCSJWQ19SRVNVTUVfRkFJTEVEIiwKKwkiVkNfUkVTVU1FX0lETEUiLAorCSJWQ19SRVNVTUVfUkVRVUVTVEVEIiwKKwkiVkNfUkVTVU1FX0lOX1BST0dSRVNTIiwKKwkiVkNfUkVTVU1FX1JFU1VNRUQiCit9OworLyogVGhlIG51bWJlciBvZiB0aW1lcyB3ZSBhbGxvdyBmb3JjZSBzdXNwZW5kIHRvIHRpbWVvdXQgYmVmb3JlIGFjdHVhbGx5CisqKiBfZm9yY2luZ18gc3VzcGVuZC4gIFRoaXMgaXMgdG8gY2F0ZXIgZm9yIFNXIHdoaWNoIGZhaWxzIHRvIHJlbGVhc2UgdmNoaXEKKyoqIGNvcnJlY3RseSAtIHdlIGRvbid0IHdhbnQgdG8gcHJldmVudCBBUk0gc3VzcGVuZCBpbmRlZmluaXRlbHkgaW4gdGhpcyBjYXNlLgorKi8KKyNkZWZpbmUgRk9SQ0VfU1VTUEVORF9GQUlMX01BWCA4CisKKy8qIFRoZSB0aW1lIGluIG1zIGFsbG93ZWQgZm9yIHZpZGVvY29yZSB0byBnbyBpZGxlIHdoZW4gZm9yY2Ugc3VzcGVuZCBoYXMgYmVlbgorICogcmVxdWVzdGVkICovCisjZGVmaW5lIEZPUkNFX1NVU1BFTkRfVElNRU9VVF9NUyAyMDAKKworCitzdGF0aWMgdm9pZCBzdXNwZW5kX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgY29udGV4dCk7CisKKwordHlwZWRlZiBzdHJ1Y3QgdXNlcl9zZXJ2aWNlX3N0cnVjdCB7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlOworCXZvaWQgKnVzZXJkYXRhOworCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2U7CisJY2hhciBpc192Y2hpOworCWNoYXIgZGVxdWV1ZV9wZW5kaW5nOworCWNoYXIgY2xvc2VfcGVuZGluZzsKKwlpbnQgbWVzc2FnZV9hdmFpbGFibGVfcG9zOworCWludCBtc2dfaW5zZXJ0OworCWludCBtc2dfcmVtb3ZlOworCXN0cnVjdCBzZW1hcGhvcmUgaW5zZXJ0X2V2ZW50OworCXN0cnVjdCBzZW1hcGhvcmUgcmVtb3ZlX2V2ZW50OworCXN0cnVjdCBzZW1hcGhvcmUgY2xvc2VfZXZlbnQ7CisJVkNISVFfSEVBREVSX1QgKiBtc2dfcXVldWVbTVNHX1FVRVVFX1NJWkVdOworfSBVU0VSX1NFUlZJQ0VfVDsKKworc3RydWN0IGJ1bGtfd2FpdGVyX25vZGUgeworCXN0cnVjdCBidWxrX3dhaXRlciBidWxrX3dhaXRlcjsKKwlpbnQgcGlkOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCB2Y2hpcV9pbnN0YW5jZV9zdHJ1Y3QgeworCVZDSElRX1NUQVRFX1QgKnN0YXRlOworCVZDSElRX0NPTVBMRVRJT05fREFUQV9UIGNvbXBsZXRpb25zW01BWF9DT01QTEVUSU9OU107CisJaW50IGNvbXBsZXRpb25faW5zZXJ0OworCWludCBjb21wbGV0aW9uX3JlbW92ZTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGluc2VydF9ldmVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHJlbW92ZV9ldmVudDsKKwlzdHJ1Y3QgbXV0ZXggY29tcGxldGlvbl9tdXRleDsKKworCWludCBjb25uZWN0ZWQ7CisJaW50IGNsb3Npbmc7CisJaW50IHBpZDsKKwlpbnQgbWFyazsKKwlpbnQgdXNlX2Nsb3NlX2RlbGl2ZXJlZDsKKwlpbnQgdHJhY2U7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJ1bGtfd2FpdGVyX2xpc3Q7CisJc3RydWN0IG11dGV4IGJ1bGtfd2FpdGVyX2xpc3RfbXV0ZXg7CisKKwlWQ0hJUV9ERUJVR0ZTX05PREVfVCBkZWJ1Z2ZzX25vZGU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBkdW1wX2NvbnRleHRfc3RydWN0IHsKKwljaGFyIF9fdXNlciAqYnVmOworCXNpemVfdCBhY3R1YWw7CisJc2l6ZV90IHNwYWNlOworCWxvZmZfdCBvZmZzZXQ7Cit9IERVTVBfQ09OVEVYVF9UOworCitzdGF0aWMgc3RydWN0IGNkZXYgICAgdmNoaXFfY2RldjsKK3N0YXRpYyBkZXZfdCAgICAgICAgICB2Y2hpcV9kZXZpZDsKK3N0YXRpYyBWQ0hJUV9TVEFURV9UIGdfc3RhdGU7CitzdGF0aWMgc3RydWN0IGNsYXNzICAqdmNoaXFfY2xhc3M7CitzdGF0aWMgc3RydWN0IGRldmljZSAqdmNoaXFfZGV2Oworc3RhdGljIERFRklORV9TUElOTE9DSyhtc2dfcXVldWVfc3BpbmxvY2spOworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgaW9jdGxfbmFtZXNbXSA9IHsKKwkiQ09OTkVDVCIsCisJIlNIVVRET1dOIiwKKwkiQ1JFQVRFX1NFUlZJQ0UiLAorCSJSRU1PVkVfU0VSVklDRSIsCisJIlFVRVVFX01FU1NBR0UiLAorCSJRVUVVRV9CVUxLX1RSQU5TTUlUIiwKKwkiUVVFVUVfQlVMS19SRUNFSVZFIiwKKwkiQVdBSVRfQ09NUExFVElPTiIsCisJIkRFUVVFVUVfTUVTU0FHRSIsCisJIkdFVF9DTElFTlRfSUQiLAorCSJHRVRfQ09ORklHIiwKKwkiQ0xPU0VfU0VSVklDRSIsCisJIlVTRV9TRVJWSUNFIiwKKwkiUkVMRUFTRV9TRVJWSUNFIiwKKwkiU0VUX1NFUlZJQ0VfT1BUSU9OIiwKKwkiRFVNUF9QSFlTX01FTSIsCisJIkxJQl9WRVJTSU9OIiwKKwkiQ0xPU0VfREVMSVZFUkVEIgorfTsKKwordmNoaXFfc3RhdGljX2Fzc2VydCgoc2l6ZW9mKGlvY3RsX25hbWVzKS9zaXplb2YoaW9jdGxfbmFtZXNbMF0pKSA9PQorCShWQ0hJUV9JT0NfTUFYICsgMSkpOworCitzdGF0aWMgdm9pZAorZHVtcF9waHlzX21lbSh2b2lkICp2aXJ0X2FkZHIsIHVpbnQzMl90IG51bV9ieXRlcyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgYWRkX2NvbXBsZXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIFZDSElRX1NUQVRVU19UCithZGRfY29tcGxldGlvbihWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlLCBWQ0hJUV9SRUFTT05fVCByZWFzb24sCisJVkNISVFfSEVBREVSX1QgKmhlYWRlciwgVVNFUl9TRVJWSUNFX1QgKnVzZXJfc2VydmljZSwKKwl2b2lkICpidWxrX3VzZXJkYXRhKQoreworCVZDSElRX0NPTVBMRVRJT05fREFUQV9UICpjb21wbGV0aW9uOworCURFQlVHX0lOSVRJQUxJU0UoZ19zdGF0ZS5sb2NhbCkKKworCXdoaWxlIChpbnN0YW5jZS0+Y29tcGxldGlvbl9pbnNlcnQgPT0KKwkJKGluc3RhbmNlLT5jb21wbGV0aW9uX3JlbW92ZSArIE1BWF9DT01QTEVUSU9OUykpIHsKKwkJLyogT3V0IG9mIHNwYWNlIC0gd2FpdCBmb3IgdGhlIGNsaWVudCAqLworCQlERUJVR19UUkFDRShTRVJWSUNFX0NBTExCQUNLX0xJTkUpOworCQl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCSJhZGRfY29tcGxldGlvbiAtIGNvbXBsZXRpb24gcXVldWUgZnVsbCIpOworCQlERUJVR19DT1VOVChDT01QTEVUSU9OX1FVRVVFX0ZVTExfQ09VTlQpOworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpbnN0YW5jZS0+cmVtb3ZlX2V2ZW50KSAhPSAwKSB7CisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCSJzZXJ2aWNlX2NhbGxiYWNrIGludGVycnVwdGVkIik7CisJCQlyZXR1cm4gVkNISVFfUkVUUlk7CisJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmNsb3NpbmcpIHsKKwkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJInNlcnZpY2VfY2FsbGJhY2sgY2xvc2luZyIpOworCQkJcmV0dXJuIFZDSElRX0VSUk9SOworCQl9CisJCURFQlVHX1RSQUNFKFNFUlZJQ0VfQ0FMTEJBQ0tfTElORSk7CisJfQorCisJY29tcGxldGlvbiA9CisJCSAmaW5zdGFuY2UtPmNvbXBsZXRpb25zW2luc3RhbmNlLT5jb21wbGV0aW9uX2luc2VydCAmCisJCSAoTUFYX0NPTVBMRVRJT05TIC0gMSldOworCisJY29tcGxldGlvbi0+aGVhZGVyID0gaGVhZGVyOworCWNvbXBsZXRpb24tPnJlYXNvbiA9IHJlYXNvbjsKKwkvKiBOLkIuIHNlcnZpY2VfdXNlcmRhdGEgaXMgdXBkYXRlZCB3aGlsZSBwcm9jZXNzaW5nIEFXQUlUX0NPTVBMRVRJT04gKi8KKwljb21wbGV0aW9uLT5zZXJ2aWNlX3VzZXJkYXRhID0gdXNlcl9zZXJ2aWNlLT5zZXJ2aWNlOworCWNvbXBsZXRpb24tPmJ1bGtfdXNlcmRhdGEgPSBidWxrX3VzZXJkYXRhOworCisJaWYgKHJlYXNvbiA9PSBWQ0hJUV9TRVJWSUNFX0NMT1NFRCkgeworCQkvKiBUYWtlIGFuIGV4dHJhIHJlZmVyZW5jZSwgdG8gYmUgaGVsZCB1bnRpbAorCQkgICB0aGlzIENMT1NFRCBub3RpZmljYXRpb24gaXMgZGVsaXZlcmVkLiAqLworCQlsb2NrX3NlcnZpY2UodXNlcl9zZXJ2aWNlLT5zZXJ2aWNlKTsKKwkJaWYgKGluc3RhbmNlLT51c2VfY2xvc2VfZGVsaXZlcmVkKQorCQkJdXNlcl9zZXJ2aWNlLT5jbG9zZV9wZW5kaW5nID0gMTsKKwl9CisKKwkvKiBBIHdyaXRlIGJhcnJpZXIgaXMgbmVlZGVkIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIGVudGlyZSBjb21wbGV0aW9uCisJCXJlY29yZCBpcyB3cml0dGVuIG91dCBiZWZvcmUgdGhlIGluc2VydCBwb2ludC4gKi8KKwl3bWIoKTsKKworCWlmIChyZWFzb24gPT0gVkNISVFfTUVTU0FHRV9BVkFJTEFCTEUpCisJCXVzZXJfc2VydmljZS0+bWVzc2FnZV9hdmFpbGFibGVfcG9zID0KKwkJCWluc3RhbmNlLT5jb21wbGV0aW9uX2luc2VydDsKKwlpbnN0YW5jZS0+Y29tcGxldGlvbl9pbnNlcnQrKzsKKworCXVwKCZpbnN0YW5jZS0+aW5zZXJ0X2V2ZW50KTsKKworCXJldHVybiBWQ0hJUV9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHNlcnZpY2VfY2FsbGJhY2sKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIFZDSElRX1NUQVRVU19UCitzZXJ2aWNlX2NhbGxiYWNrKFZDSElRX1JFQVNPTl9UIHJlYXNvbiwgVkNISVFfSEVBREVSX1QgKmhlYWRlciwKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwgdm9pZCAqYnVsa191c2VyZGF0YSkKK3sKKwkvKiBIb3cgZG8gd2UgZW5zdXJlIHRoZSBjYWxsYmFjayBnb2VzIHRvIHRoZSByaWdodCBjbGllbnQ/CisJKiogVGhlIHNlcnZpY2VfdXNlciBkYXRhIHBvaW50cyB0byBhIFVTRVJfU0VSVklDRV9UIHJlY29yZCBjb250YWluaW5nCisJKiogdGhlIG9yaWdpbmFsIGNhbGxiYWNrIGFuZCB0aGUgdXNlciBzdGF0ZSBzdHJ1Y3R1cmUsIHdoaWNoIGNvbnRhaW5zIGEKKwkqKiBjaXJjdWxhciBidWZmZXIgZm9yIGNvbXBsZXRpb24gcmVjb3Jkcy4KKwkqLworCVVTRVJfU0VSVklDRV9UICp1c2VyX3NlcnZpY2U7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlOworCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2U7CisJREVCVUdfSU5JVElBTElTRShnX3N0YXRlLmxvY2FsKQorCisJREVCVUdfVFJBQ0UoU0VSVklDRV9DQUxMQkFDS19MSU5FKTsKKworCXNlcnZpY2UgPSBoYW5kbGVfdG9fc2VydmljZShoYW5kbGUpOworCUJVR19PTighc2VydmljZSk7CisJdXNlcl9zZXJ2aWNlID0gKFVTRVJfU0VSVklDRV9UICopc2VydmljZS0+YmFzZS51c2VyZGF0YTsKKwlpbnN0YW5jZSA9IHVzZXJfc2VydmljZS0+aW5zdGFuY2U7CisKKwlpZiAoIWluc3RhbmNlIHx8IGluc3RhbmNlLT5jbG9zaW5nKQorCQlyZXR1cm4gVkNISVFfU1VDQ0VTUzsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkic2VydmljZV9jYWxsYmFjayAtIHNlcnZpY2UgJWx4KCVkLCVwKSwgcmVhc29uICVkLCBoZWFkZXIgJWx4LCAiCisJCSJpbnN0YW5jZSAlbHgsIGJ1bGtfdXNlcmRhdGEgJWx4IiwKKwkJKHVuc2lnbmVkIGxvbmcpdXNlcl9zZXJ2aWNlLAorCQlzZXJ2aWNlLT5sb2NhbHBvcnQsIHVzZXJfc2VydmljZS0+dXNlcmRhdGEsCisJCXJlYXNvbiwgKHVuc2lnbmVkIGxvbmcpaGVhZGVyLAorCQkodW5zaWduZWQgbG9uZylpbnN0YW5jZSwgKHVuc2lnbmVkIGxvbmcpYnVsa191c2VyZGF0YSk7CisKKwlpZiAoaGVhZGVyICYmIHVzZXJfc2VydmljZS0+aXNfdmNoaSkgeworCQlzcGluX2xvY2soJm1zZ19xdWV1ZV9zcGlubG9jayk7CisJCXdoaWxlICh1c2VyX3NlcnZpY2UtPm1zZ19pbnNlcnQgPT0KKwkJCSh1c2VyX3NlcnZpY2UtPm1zZ19yZW1vdmUgKyBNU0dfUVVFVUVfU0laRSkpIHsKKwkJCXNwaW5fdW5sb2NrKCZtc2dfcXVldWVfc3BpbmxvY2spOworCQkJREVCVUdfVFJBQ0UoU0VSVklDRV9DQUxMQkFDS19MSU5FKTsKKwkJCURFQlVHX0NPVU5UKE1TR19RVUVVRV9GVUxMX0NPVU5UKTsKKwkJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCSJzZXJ2aWNlX2NhbGxiYWNrIC0gbXNnIHF1ZXVlIGZ1bGwiKTsKKwkJCS8qIElmIHRoZXJlIGlzIG5vIE1FU1NBR0VfQVZBSUxBQkxFIGluIHRoZSBjb21wbGV0aW9uCisJCQkqKiBxdWV1ZSwgYWRkIG9uZQorCQkJKi8KKwkJCWlmICgodXNlcl9zZXJ2aWNlLT5tZXNzYWdlX2F2YWlsYWJsZV9wb3MgLQorCQkJCWluc3RhbmNlLT5jb21wbGV0aW9uX3JlbW92ZSkgPCAwKSB7CisJCQkJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCQkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJCSJJbnNlcnRpbmcgZXh0cmEgTUVTU0FHRV9BVkFJTEFCTEUiKTsKKwkJCQlERUJVR19UUkFDRShTRVJWSUNFX0NBTExCQUNLX0xJTkUpOworCQkJCXN0YXR1cyA9IGFkZF9jb21wbGV0aW9uKGluc3RhbmNlLCByZWFzb24sCisJCQkJCU5VTEwsIHVzZXJfc2VydmljZSwgYnVsa191c2VyZGF0YSk7CisJCQkJaWYgKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKSB7CisJCQkJCURFQlVHX1RSQUNFKFNFUlZJQ0VfQ0FMTEJBQ0tfTElORSk7CisJCQkJCXJldHVybiBzdGF0dXM7CisJCQkJfQorCQkJfQorCisJCQlERUJVR19UUkFDRShTRVJWSUNFX0NBTExCQUNLX0xJTkUpOworCQkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdXNlcl9zZXJ2aWNlLT5yZW1vdmVfZXZlbnQpCisJCQkJIT0gMCkgeworCQkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJCSJzZXJ2aWNlX2NhbGxiYWNrIGludGVycnVwdGVkIik7CisJCQkJREVCVUdfVFJBQ0UoU0VSVklDRV9DQUxMQkFDS19MSU5FKTsKKwkJCQlyZXR1cm4gVkNISVFfUkVUUlk7CisJCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5jbG9zaW5nKSB7CisJCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkJInNlcnZpY2VfY2FsbGJhY2sgY2xvc2luZyIpOworCQkJCURFQlVHX1RSQUNFKFNFUlZJQ0VfQ0FMTEJBQ0tfTElORSk7CisJCQkJcmV0dXJuIFZDSElRX0VSUk9SOworCQkJfQorCQkJREVCVUdfVFJBQ0UoU0VSVklDRV9DQUxMQkFDS19MSU5FKTsKKwkJCXNwaW5fbG9jaygmbXNnX3F1ZXVlX3NwaW5sb2NrKTsKKwkJfQorCisJCXVzZXJfc2VydmljZS0+bXNnX3F1ZXVlW3VzZXJfc2VydmljZS0+bXNnX2luc2VydCAmCisJCQkoTVNHX1FVRVVFX1NJWkUgLSAxKV0gPSBoZWFkZXI7CisJCXVzZXJfc2VydmljZS0+bXNnX2luc2VydCsrOworCQlzcGluX3VubG9jaygmbXNnX3F1ZXVlX3NwaW5sb2NrKTsKKworCQl1cCgmdXNlcl9zZXJ2aWNlLT5pbnNlcnRfZXZlbnQpOworCisJCS8qIElmIHRoZXJlIGlzIGEgdGhyZWFkIHdhaXRpbmcgaW4gREVRVUVVRV9NRVNTQUdFLCBvciBpZgorCQkqKiB0aGVyZSBpcyBhIE1FU1NBR0VfQVZBSUxBQkxFIGluIHRoZSBjb21wbGV0aW9uIHF1ZXVlIHRoZW4KKwkJKiogYnlwYXNzIHRoZSBjb21wbGV0aW9uIHF1ZXVlLgorCQkqLworCQlpZiAoKCh1c2VyX3NlcnZpY2UtPm1lc3NhZ2VfYXZhaWxhYmxlX3BvcyAtCisJCQlpbnN0YW5jZS0+Y29tcGxldGlvbl9yZW1vdmUpID49IDApIHx8CisJCQl1c2VyX3NlcnZpY2UtPmRlcXVldWVfcGVuZGluZykgeworCQkJREVCVUdfVFJBQ0UoU0VSVklDRV9DQUxMQkFDS19MSU5FKTsKKwkJCXVzZXJfc2VydmljZS0+ZGVxdWV1ZV9wZW5kaW5nID0gMDsKKwkJCXJldHVybiBWQ0hJUV9TVUNDRVNTOworCQl9CisKKwkJaGVhZGVyID0gTlVMTDsKKwl9CisJREVCVUdfVFJBQ0UoU0VSVklDRV9DQUxMQkFDS19MSU5FKTsKKworCXJldHVybiBhZGRfY29tcGxldGlvbihpbnN0YW5jZSwgcmVhc29uLCBoZWFkZXIsIHVzZXJfc2VydmljZSwKKwkJYnVsa191c2VyZGF0YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgdXNlcl9zZXJ2aWNlX2ZyZWUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit1c2VyX3NlcnZpY2VfZnJlZSh2b2lkICp1c2VyZGF0YSkKK3sKKwlrZnJlZSh1c2VyZGF0YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgY2xvc2VfZGVsaXZlcmVkCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBjbG9zZV9kZWxpdmVyZWQoVVNFUl9TRVJWSUNFX1QgKnVzZXJfc2VydmljZSkKK3sKKwl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkiY2xvc2VfZGVsaXZlcmVkKGhhbmRsZT0leCkiLAorCQl1c2VyX3NlcnZpY2UtPnNlcnZpY2UtPmhhbmRsZSk7CisKKwlpZiAodXNlcl9zZXJ2aWNlLT5jbG9zZV9wZW5kaW5nKSB7CisJCS8qIEFsbG93IHRoZSB1bmRlcmx5aW5nIHNlcnZpY2UgdG8gYmUgY3VsbGVkICovCisJCXVubG9ja19zZXJ2aWNlKHVzZXJfc2VydmljZS0+c2VydmljZSk7CisKKwkJLyogV2FrZSB0aGUgdXNlci10aHJlYWQgYmxvY2tlZCBpbiBjbG9zZV8gb3IgcmVtb3ZlX3NlcnZpY2UgKi8KKwkJdXAoJnVzZXJfc2VydmljZS0+Y2xvc2VfZXZlbnQpOworCisJCXVzZXJfc2VydmljZS0+Y2xvc2VfcGVuZGluZyA9IDA7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHZjaGlxX2lvY3RsCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgbG9uZwordmNoaXFfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBOVUxMOworCWxvbmcgcmV0ID0gMDsKKwlpbnQgaSwgcmM7CisJREVCVUdfSU5JVElBTElTRShnX3N0YXRlLmxvY2FsKQorCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCSAidmNoaXFfaW9jdGwgLSBpbnN0YW5jZSAleCwgY21kICVzLCBhcmcgJWx4IiwKKwkJKHVuc2lnbmVkIGludClpbnN0YW5jZSwKKwkJKChfSU9DX1RZUEUoY21kKSA9PSBWQ0hJUV9JT0NfTUFHSUMpICYmCisJCShfSU9DX05SKGNtZCkgPD0gVkNISVFfSU9DX01BWCkpID8KKwkJaW9jdGxfbmFtZXNbX0lPQ19OUihjbWQpXSA6ICI8aW52YWxpZD4iLCBhcmcpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZDSElRX0lPQ19TSFVURE9XTjoKKwkJaWYgKCFpbnN0YW5jZS0+Y29ubmVjdGVkKQorCQkJYnJlYWs7CisKKwkJLyogUmVtb3ZlIGFsbCBzZXJ2aWNlcyAqLworCQlpID0gMDsKKwkJd2hpbGUgKChzZXJ2aWNlID0gbmV4dF9zZXJ2aWNlX2J5X2luc3RhbmNlKGluc3RhbmNlLT5zdGF0ZSwKKwkJCWluc3RhbmNlLCAmaSkpICE9IE5VTEwpIHsKKwkJCXN0YXR1cyA9IHZjaGlxX3JlbW92ZV9zZXJ2aWNlKHNlcnZpY2UtPmhhbmRsZSk7CisJCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwkJCWlmIChzdGF0dXMgIT0gVkNISVFfU1VDQ0VTUykKKwkJCQlicmVhazsKKwkJfQorCQlzZXJ2aWNlID0gTlVMTDsKKworCQlpZiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpIHsKKwkJCS8qIFdha2UgdGhlIGNvbXBsZXRpb24gdGhyZWFkIGFuZCBhc2sgaXQgdG8gZXhpdCAqLworCQkJaW5zdGFuY2UtPmNsb3NpbmcgPSAxOworCQkJdXAoJmluc3RhbmNlLT5pbnNlcnRfZXZlbnQpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFZDSElRX0lPQ19DT05ORUNUOgorCQlpZiAoaW5zdGFuY2UtPmNvbm5lY3RlZCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZpbnN0YW5jZS0+c3RhdGUtPm11dGV4KTsKKwkJaWYgKHJjICE9IDApIHsKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCSJ2Y2hpcTogY29ubmVjdDogY291bGQgbm90IGxvY2sgbXV0ZXggZm9yICIKKwkJCQkic3RhdGUgJWQ6ICVkIiwKKwkJCQlpbnN0YW5jZS0+c3RhdGUtPmlkLCByYyk7CisJCQlyZXQgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCQlzdGF0dXMgPSB2Y2hpcV9jb25uZWN0X2ludGVybmFsKGluc3RhbmNlLT5zdGF0ZSwgaW5zdGFuY2UpOworCQltdXRleF91bmxvY2soJmluc3RhbmNlLT5zdGF0ZS0+bXV0ZXgpOworCisJCWlmIChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykKKwkJCWluc3RhbmNlLT5jb25uZWN0ZWQgPSAxOworCQllbHNlCisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkidmNoaXE6IGNvdWxkIG5vdCBjb25uZWN0OiAlZCIsIHN0YXR1cyk7CisJCWJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfQ1JFQVRFX1NFUlZJQ0U6IHsKKwkJVkNISVFfQ1JFQVRFX1NFUlZJQ0VfVCBhcmdzOworCQlVU0VSX1NFUlZJQ0VfVCAqdXNlcl9zZXJ2aWNlID0gTlVMTDsKKwkJdm9pZCAqdXNlcmRhdGE7CisJCWludCBzcnZzdGF0ZTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAoJmFyZ3MsIChjb25zdCB2b2lkIF9fdXNlciAqKWFyZywKKwkJCSAgc2l6ZW9mKGFyZ3MpKSAhPSAwKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQl1c2VyX3NlcnZpY2UgPSBrbWFsbG9jKHNpemVvZihVU0VSX1NFUlZJQ0VfVCksIEdGUF9LRVJORUwpOworCQlpZiAoIXVzZXJfc2VydmljZSkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGFyZ3MuaXNfb3BlbikgeworCQkJaWYgKCFpbnN0YW5jZS0+Y29ubmVjdGVkKSB7CisJCQkJcmV0ID0gLUVOT1RDT05OOworCQkJCWtmcmVlKHVzZXJfc2VydmljZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzcnZzdGF0ZSA9IFZDSElRX1NSVlNUQVRFX09QRU5JTkc7CisJCX0gZWxzZSB7CisJCQlzcnZzdGF0ZSA9CisJCQkJIGluc3RhbmNlLT5jb25uZWN0ZWQgPworCQkJCSBWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcgOgorCQkJCSBWQ0hJUV9TUlZTVEFURV9ISURERU47CisJCX0KKworCQl1c2VyZGF0YSA9IGFyZ3MucGFyYW1zLnVzZXJkYXRhOworCQlhcmdzLnBhcmFtcy5jYWxsYmFjayA9IHNlcnZpY2VfY2FsbGJhY2s7CisJCWFyZ3MucGFyYW1zLnVzZXJkYXRhID0gdXNlcl9zZXJ2aWNlOworCQlzZXJ2aWNlID0gdmNoaXFfYWRkX3NlcnZpY2VfaW50ZXJuYWwoCisJCQkJaW5zdGFuY2UtPnN0YXRlLAorCQkJCSZhcmdzLnBhcmFtcywgc3J2c3RhdGUsCisJCQkJaW5zdGFuY2UsIHVzZXJfc2VydmljZV9mcmVlKTsKKworCQlpZiAoc2VydmljZSAhPSBOVUxMKSB7CisJCQl1c2VyX3NlcnZpY2UtPnNlcnZpY2UgPSBzZXJ2aWNlOworCQkJdXNlcl9zZXJ2aWNlLT51c2VyZGF0YSA9IHVzZXJkYXRhOworCQkJdXNlcl9zZXJ2aWNlLT5pbnN0YW5jZSA9IGluc3RhbmNlOworCQkJdXNlcl9zZXJ2aWNlLT5pc192Y2hpID0gKGFyZ3MuaXNfdmNoaSAhPSAwKTsKKwkJCXVzZXJfc2VydmljZS0+ZGVxdWV1ZV9wZW5kaW5nID0gMDsKKwkJCXVzZXJfc2VydmljZS0+Y2xvc2VfcGVuZGluZyA9IDA7CisJCQl1c2VyX3NlcnZpY2UtPm1lc3NhZ2VfYXZhaWxhYmxlX3BvcyA9CisJCQkJaW5zdGFuY2UtPmNvbXBsZXRpb25fcmVtb3ZlIC0gMTsKKwkJCXVzZXJfc2VydmljZS0+bXNnX2luc2VydCA9IDA7CisJCQl1c2VyX3NlcnZpY2UtPm1zZ19yZW1vdmUgPSAwOworCQkJc2VtYV9pbml0KCZ1c2VyX3NlcnZpY2UtPmluc2VydF9ldmVudCwgMCk7CisJCQlzZW1hX2luaXQoJnVzZXJfc2VydmljZS0+cmVtb3ZlX2V2ZW50LCAwKTsKKwkJCXNlbWFfaW5pdCgmdXNlcl9zZXJ2aWNlLT5jbG9zZV9ldmVudCwgMCk7CisKKwkJCWlmIChhcmdzLmlzX29wZW4pIHsKKwkJCQlzdGF0dXMgPSB2Y2hpcV9vcGVuX3NlcnZpY2VfaW50ZXJuYWwKKwkJCQkJKHNlcnZpY2UsIGluc3RhbmNlLT5waWQpOworCQkJCWlmIChzdGF0dXMgIT0gVkNISVFfU1VDQ0VTUykgeworCQkJCQl2Y2hpcV9yZW1vdmVfc2VydmljZShzZXJ2aWNlLT5oYW5kbGUpOworCQkJCQlzZXJ2aWNlID0gTlVMTDsKKwkJCQkJcmV0ID0gKHN0YXR1cyA9PSBWQ0hJUV9SRVRSWSkgPworCQkJCQkJLUVJTlRSIDogLUVJTzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKQorCQkJCSYoKChWQ0hJUV9DUkVBVEVfU0VSVklDRV9UIF9fdXNlciAqKQorCQkJCQlhcmcpLT5oYW5kbGUpLAorCQkJCShjb25zdCB2b2lkICopJnNlcnZpY2UtPmhhbmRsZSwKKwkJCQlzaXplb2Yoc2VydmljZS0+aGFuZGxlKSkgIT0gMCkgeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJdmNoaXFfcmVtb3ZlX3NlcnZpY2Uoc2VydmljZS0+aGFuZGxlKTsKKwkJCX0KKworCQkJc2VydmljZSA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlyZXQgPSAtRUVYSVNUOworCQkJa2ZyZWUodXNlcl9zZXJ2aWNlKTsKKwkJfQorCX0gYnJlYWs7CisKKwljYXNlIFZDSElRX0lPQ19DTE9TRV9TRVJWSUNFOiB7CisJCVZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlID0gKFZDSElRX1NFUlZJQ0VfSEFORExFX1QpYXJnOworCisJCXNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfZm9yX2luc3RhbmNlKGluc3RhbmNlLCBoYW5kbGUpOworCQlpZiAoc2VydmljZSAhPSBOVUxMKSB7CisJCQlVU0VSX1NFUlZJQ0VfVCAqdXNlcl9zZXJ2aWNlID0KKwkJCQkoVVNFUl9TRVJWSUNFX1QgKilzZXJ2aWNlLT5iYXNlLnVzZXJkYXRhOworCQkJLyogY2xvc2VfcGVuZGluZyBpcyBmYWxzZSBvbiBmaXJzdCBlbnRyeSwgYW5kIHdoZW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0IGluIHZjaGlxX2Nsb3NlX3NlcnZpY2UgaGFzIGJlZW4gaW50ZXJydXB0ZWQuICovCisJCQlpZiAoIXVzZXJfc2VydmljZS0+Y2xvc2VfcGVuZGluZykgeworCQkJCXN0YXR1cyA9IHZjaGlxX2Nsb3NlX3NlcnZpY2Uoc2VydmljZS0+aGFuZGxlKTsKKwkJCQlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBjbG9zZV9wZW5kaW5nIGlzIHRydWUgb25jZSB0aGUgdW5kZXJseWluZyBzZXJ2aWNlCisJCQkgICBoYXMgYmVlbiBjbG9zZWQgdW50aWwgdGhlIGNsaWVudCBsaWJyYXJ5IGNhbGxzIHRoZQorCQkJICAgQ0xPU0VfREVMSVZFUkVEIGlvY3RsLCBzaWduYWxsaW5nIGNsb3NlX2V2ZW50LiAqLworCQkJaWYgKHVzZXJfc2VydmljZS0+Y2xvc2VfcGVuZGluZyAmJgorCQkJCWRvd25faW50ZXJydXB0aWJsZSgmdXNlcl9zZXJ2aWNlLT5jbG9zZV9ldmVudCkpCisJCQkJc3RhdHVzID0gVkNISVFfUkVUUlk7CisJCX0KKwkJZWxzZQorCQkJcmV0ID0gLUVJTlZBTDsKKwl9IGJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfUkVNT1ZFX1NFUlZJQ0U6IHsKKwkJVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUgPSAoVkNISVFfU0VSVklDRV9IQU5ETEVfVClhcmc7CisKKwkJc2VydmljZSA9IGZpbmRfc2VydmljZV9mb3JfaW5zdGFuY2UoaW5zdGFuY2UsIGhhbmRsZSk7CisJCWlmIChzZXJ2aWNlICE9IE5VTEwpIHsKKwkJCVVTRVJfU0VSVklDRV9UICp1c2VyX3NlcnZpY2UgPQorCQkJCShVU0VSX1NFUlZJQ0VfVCAqKXNlcnZpY2UtPmJhc2UudXNlcmRhdGE7CisJCQkvKiBjbG9zZV9wZW5kaW5nIGlzIGZhbHNlIG9uIGZpcnN0IGVudHJ5LCBhbmQgd2hlbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQgaW4gdmNoaXFfY2xvc2Vfc2VydmljZSBoYXMgYmVlbiBpbnRlcnJ1cHRlZC4gKi8KKwkJCWlmICghdXNlcl9zZXJ2aWNlLT5jbG9zZV9wZW5kaW5nKSB7CisJCQkJc3RhdHVzID0gdmNoaXFfcmVtb3ZlX3NlcnZpY2Uoc2VydmljZS0+aGFuZGxlKTsKKwkJCQlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBjbG9zZV9wZW5kaW5nIGlzIHRydWUgb25jZSB0aGUgdW5kZXJseWluZyBzZXJ2aWNlCisJCQkgICBoYXMgYmVlbiBjbG9zZWQgdW50aWwgdGhlIGNsaWVudCBsaWJyYXJ5IGNhbGxzIHRoZQorCQkJICAgQ0xPU0VfREVMSVZFUkVEIGlvY3RsLCBzaWduYWxsaW5nIGNsb3NlX2V2ZW50LiAqLworCQkJaWYgKHVzZXJfc2VydmljZS0+Y2xvc2VfcGVuZGluZyAmJgorCQkJCWRvd25faW50ZXJydXB0aWJsZSgmdXNlcl9zZXJ2aWNlLT5jbG9zZV9ldmVudCkpCisJCQkJc3RhdHVzID0gVkNISVFfUkVUUlk7CisJCX0KKwkJZWxzZQorCQkJcmV0ID0gLUVJTlZBTDsKKwl9IGJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfVVNFX1NFUlZJQ0U6CisJY2FzZSBWQ0hJUV9JT0NfUkVMRUFTRV9TRVJWSUNFOgl7CisJCVZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlID0gKFZDSElRX1NFUlZJQ0VfSEFORExFX1QpYXJnOworCisJCXNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfZm9yX2luc3RhbmNlKGluc3RhbmNlLCBoYW5kbGUpOworCQlpZiAoc2VydmljZSAhPSBOVUxMKSB7CisJCQlzdGF0dXMgPSAoY21kID09IFZDSElRX0lPQ19VU0VfU0VSVklDRSkJPworCQkJCXZjaGlxX3VzZV9zZXJ2aWNlX2ludGVybmFsKHNlcnZpY2UpIDoKKwkJCQl2Y2hpcV9yZWxlYXNlX3NlcnZpY2VfaW50ZXJuYWwoc2VydmljZSk7CisJCQlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpIHsKKwkJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkJCSIlczogY21kICVzIHJldHVybmVkIGVycm9yICVkIGZvciAiCisJCQkJCSJzZXJ2aWNlICVjJWMlYyVjOiUwM2QiLAorCQkJCQlfX2Z1bmNfXywKKwkJCQkJKGNtZCA9PSBWQ0hJUV9JT0NfVVNFX1NFUlZJQ0UpID8KKwkJCQkJCSJWQ0hJUV9JT0NfVVNFX1NFUlZJQ0UiIDoKKwkJCQkJCSJWQ0hJUV9JT0NfUkVMRUFTRV9TRVJWSUNFIiwKKwkJCQkJc3RhdHVzLAorCQkJCQlWQ0hJUV9GT1VSQ0NfQVNfNENIQVJTKAorCQkJCQkJc2VydmljZS0+YmFzZS5mb3VyY2MpLAorCQkJCQlzZXJ2aWNlLT5jbGllbnRfaWQpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQl9CisJCX0gZWxzZQorCQkJcmV0ID0gLUVJTlZBTDsKKwl9IGJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfUVVFVUVfTUVTU0FHRTogeworCQlWQ0hJUV9RVUVVRV9NRVNTQUdFX1QgYXJnczsKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkgKCZhcmdzLCAoY29uc3Qgdm9pZCBfX3VzZXIgKilhcmcsCisJCQkgIHNpemVvZihhcmdzKSkgIT0gMCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJc2VydmljZSA9IGZpbmRfc2VydmljZV9mb3JfaW5zdGFuY2UoaW5zdGFuY2UsIGFyZ3MuaGFuZGxlKTsKKworCQlpZiAoKHNlcnZpY2UgIT0gTlVMTCkgJiYgKGFyZ3MuY291bnQgPD0gTUFYX0VMRU1FTlRTKSkgeworCQkJLyogQ29weSBlbGVtZW50cyBpbnRvIGtlcm5lbCBzcGFjZSAqLworCQkJVkNISVFfRUxFTUVOVF9UIGVsZW1lbnRzW01BWF9FTEVNRU5UU107CisJCQlpZiAoY29weV9mcm9tX3VzZXIoZWxlbWVudHMsIGFyZ3MuZWxlbWVudHMsCisJCQkJYXJncy5jb3VudCAqIHNpemVvZihWQ0hJUV9FTEVNRU5UX1QpKSA9PSAwKQorCQkJCXN0YXR1cyA9IHZjaGlxX3F1ZXVlX21lc3NhZ2UKKwkJCQkJKGFyZ3MuaGFuZGxlLAorCQkJCQllbGVtZW50cywgYXJncy5jb3VudCk7CisJCQllbHNlCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwl9IGJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfUVVFVUVfQlVMS19UUkFOU01JVDoKKwljYXNlIFZDSElRX0lPQ19RVUVVRV9CVUxLX1JFQ0VJVkU6IHsKKwkJVkNISVFfUVVFVUVfQlVMS19UUkFOU0ZFUl9UIGFyZ3M7CisJCXN0cnVjdCBidWxrX3dhaXRlcl9ub2RlICp3YWl0ZXIgPSBOVUxMOworCQlWQ0hJUV9CVUxLX0RJUl9UIGRpciA9CisJCQkoY21kID09IFZDSElRX0lPQ19RVUVVRV9CVUxLX1RSQU5TTUlUKSA/CisJCQlWQ0hJUV9CVUxLX1RSQU5TTUlUIDogVkNISVFfQlVMS19SRUNFSVZFOworCisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJKCZhcmdzLCAoY29uc3Qgdm9pZCBfX3VzZXIgKilhcmcsCisJCQlzaXplb2YoYXJncykpICE9IDApIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCXNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfZm9yX2luc3RhbmNlKGluc3RhbmNlLCBhcmdzLmhhbmRsZSk7CisJCWlmICghc2VydmljZSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGFyZ3MubW9kZSA9PSBWQ0hJUV9CVUxLX01PREVfQkxPQ0tJTkcpIHsKKwkJCXdhaXRlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidWxrX3dhaXRlcl9ub2RlKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghd2FpdGVyKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWFyZ3MudXNlcmRhdGEgPSAmd2FpdGVyLT5idWxrX3dhaXRlcjsKKwkJfSBlbHNlIGlmIChhcmdzLm1vZGUgPT0gVkNISVFfQlVMS19NT0RFX1dBSVRJTkcpIHsKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwkJCW11dGV4X2xvY2soJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0X211dGV4KTsKKwkJCWxpc3RfZm9yX2VhY2gocG9zLCAmaW5zdGFuY2UtPmJ1bGtfd2FpdGVyX2xpc3QpIHsKKwkJCQlpZiAobGlzdF9lbnRyeShwb3MsIHN0cnVjdCBidWxrX3dhaXRlcl9ub2RlLAorCQkJCQlsaXN0KS0+cGlkID09IGN1cnJlbnQtPnBpZCkgeworCQkJCQl3YWl0ZXIgPSBsaXN0X2VudHJ5KHBvcywKKwkJCQkJCXN0cnVjdCBidWxrX3dhaXRlcl9ub2RlLAorCQkJCQkJbGlzdCk7CisJCQkJCWxpc3RfZGVsKHBvcyk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfQorCQkJbXV0ZXhfdW5sb2NrKCZpbnN0YW5jZS0+YnVsa193YWl0ZXJfbGlzdF9tdXRleCk7CisJCQlpZiAoIXdhaXRlcikgeworCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCQkibm8gYnVsa193YWl0ZXIgZm91bmQgZm9yIHBpZCAlZCIsCisJCQkJCWN1cnJlbnQtPnBpZCk7CisJCQkJcmV0ID0gLUVTUkNIOworCQkJCWJyZWFrOworCQkJfQorCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkiZm91bmQgYnVsa193YWl0ZXIgJXggZm9yIHBpZCAlZCIsCisJCQkJKHVuc2lnbmVkIGludCl3YWl0ZXIsIGN1cnJlbnQtPnBpZCk7CisJCQlhcmdzLnVzZXJkYXRhID0gJndhaXRlci0+YnVsa193YWl0ZXI7CisJCX0KKwkJc3RhdHVzID0gdmNoaXFfYnVsa190cmFuc2ZlcgorCQkJKGFyZ3MuaGFuZGxlLAorCQkJIFZDSElfTUVNX0hBTkRMRV9JTlZBTElELAorCQkJIGFyZ3MuZGF0YSwgYXJncy5zaXplLAorCQkJIGFyZ3MudXNlcmRhdGEsIGFyZ3MubW9kZSwKKwkJCSBkaXIpOworCQlpZiAoIXdhaXRlcikKKwkJCWJyZWFrOworCQlpZiAoKHN0YXR1cyAhPSBWQ0hJUV9SRVRSWSkgfHwgZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgfHwKKwkJCSF3YWl0ZXItPmJ1bGtfd2FpdGVyLmJ1bGspIHsKKwkJCWlmICh3YWl0ZXItPmJ1bGtfd2FpdGVyLmJ1bGspIHsKKwkJCQkvKiBDYW5jZWwgdGhlIHNpZ25hbCB3aGVuIHRoZSB0cmFuc2ZlcgorCQkJCSoqIGNvbXBsZXRlcy4gKi8KKwkJCQlzcGluX2xvY2soJmJ1bGtfd2FpdGVyX3NwaW5sb2NrKTsKKwkJCQl3YWl0ZXItPmJ1bGtfd2FpdGVyLmJ1bGstPnVzZXJkYXRhID0gTlVMTDsKKwkJCQlzcGluX3VubG9jaygmYnVsa193YWl0ZXJfc3BpbmxvY2spOworCQkJfQorCQkJa2ZyZWUod2FpdGVyKTsKKwkJfSBlbHNlIHsKKwkJCWNvbnN0IFZDSElRX0JVTEtfTU9ERV9UIG1vZGVfd2FpdGluZyA9CisJCQkJVkNISVFfQlVMS19NT0RFX1dBSVRJTkc7CisJCQl3YWl0ZXItPnBpZCA9IGN1cnJlbnQtPnBpZDsKKwkJCW11dGV4X2xvY2soJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0X211dGV4KTsKKwkJCWxpc3RfYWRkKCZ3YWl0ZXItPmxpc3QsICZpbnN0YW5jZS0+YnVsa193YWl0ZXJfbGlzdCk7CisJCQltdXRleF91bmxvY2soJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0X211dGV4KTsKKwkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJInNhdmVkIGJ1bGtfd2FpdGVyICV4IGZvciBwaWQgJWQiLAorCQkJCSh1bnNpZ25lZCBpbnQpd2FpdGVyLCBjdXJyZW50LT5waWQpOworCisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKQorCQkJCSYoKChWQ0hJUV9RVUVVRV9CVUxLX1RSQU5TRkVSX1QgX191c2VyICopCisJCQkJCWFyZyktPm1vZGUpLAorCQkJCShjb25zdCB2b2lkICopJm1vZGVfd2FpdGluZywKKwkJCQlzaXplb2YobW9kZV93YWl0aW5nKSkgIT0gMCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQl9CisJfSBicmVhazsKKworCWNhc2UgVkNISVFfSU9DX0FXQUlUX0NPTVBMRVRJT046IHsKKwkJVkNISVFfQVdBSVRfQ09NUExFVElPTl9UIGFyZ3M7CisKKwkJREVCVUdfVFJBQ0UoQVdBSVRfQ09NUExFVElPTl9MSU5FKTsKKwkJaWYgKCFpbnN0YW5jZS0+Y29ubmVjdGVkKSB7CisJCQlyZXQgPSAtRU5PVENPTk47CisJCQlicmVhazsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcigmYXJncywgKGNvbnN0IHZvaWQgX191c2VyICopYXJnLAorCQkJc2l6ZW9mKGFyZ3MpKSAhPSAwKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQltdXRleF9sb2NrKCZpbnN0YW5jZS0+Y29tcGxldGlvbl9tdXRleCk7CisKKwkJREVCVUdfVFJBQ0UoQVdBSVRfQ09NUExFVElPTl9MSU5FKTsKKwkJd2hpbGUgKChpbnN0YW5jZS0+Y29tcGxldGlvbl9yZW1vdmUgPT0KKwkJCWluc3RhbmNlLT5jb21wbGV0aW9uX2luc2VydCkKKwkJCSYmICFpbnN0YW5jZS0+Y2xvc2luZykgeworCQkJaW50IHJjOworCQkJREVCVUdfVFJBQ0UoQVdBSVRfQ09NUExFVElPTl9MSU5FKTsKKwkJCW11dGV4X3VubG9jaygmaW5zdGFuY2UtPmNvbXBsZXRpb25fbXV0ZXgpOworCQkJcmMgPSBkb3duX2ludGVycnVwdGlibGUoJmluc3RhbmNlLT5pbnNlcnRfZXZlbnQpOworCQkJbXV0ZXhfbG9jaygmaW5zdGFuY2UtPmNvbXBsZXRpb25fbXV0ZXgpOworCQkJaWYgKHJjICE9IDApIHsKKwkJCQlERUJVR19UUkFDRShBV0FJVF9DT01QTEVUSU9OX0xJTkUpOworCQkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJCSJBV0FJVF9DT01QTEVUSU9OIGludGVycnVwdGVkIik7CisJCQkJcmV0ID0gLUVJTlRSOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCURFQlVHX1RSQUNFKEFXQUlUX0NPTVBMRVRJT05fTElORSk7CisKKwkJLyogQSByZWFkIG1lbW9yeSBiYXJyaWVyIGlzIG5lZWRlZCB0byBzdG9wIHByZWZldGNoIG9mIGEgc3RhbGUKKwkJKiogY29tcGxldGlvbiByZWNvcmQKKwkJKi8KKwkJcm1iKCk7CisKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlpbnQgbXNnYnVmY291bnQgPSBhcmdzLm1zZ2J1ZmNvdW50OworCQkJZm9yIChyZXQgPSAwOyByZXQgPCBhcmdzLmNvdW50OyByZXQrKykgeworCQkJCVZDSElRX0NPTVBMRVRJT05fREFUQV9UICpjb21wbGV0aW9uOworCQkJCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKwkJCQlVU0VSX1NFUlZJQ0VfVCAqdXNlcl9zZXJ2aWNlOworCQkJCVZDSElRX0hFQURFUl9UICpoZWFkZXI7CisJCQkJaWYgKGluc3RhbmNlLT5jb21wbGV0aW9uX3JlbW92ZSA9PQorCQkJCQlpbnN0YW5jZS0+Y29tcGxldGlvbl9pbnNlcnQpCisJCQkJCWJyZWFrOworCQkJCWNvbXBsZXRpb24gPSAmaW5zdGFuY2UtPmNvbXBsZXRpb25zWworCQkJCQlpbnN0YW5jZS0+Y29tcGxldGlvbl9yZW1vdmUgJgorCQkJCQkoTUFYX0NPTVBMRVRJT05TIC0gMSldOworCisJCQkJc2VydmljZSA9IGNvbXBsZXRpb24tPnNlcnZpY2VfdXNlcmRhdGE7CisJCQkJdXNlcl9zZXJ2aWNlID0gc2VydmljZS0+YmFzZS51c2VyZGF0YTsKKwkJCQljb21wbGV0aW9uLT5zZXJ2aWNlX3VzZXJkYXRhID0KKwkJCQkJdXNlcl9zZXJ2aWNlLT51c2VyZGF0YTsKKworCQkJCWhlYWRlciA9IGNvbXBsZXRpb24tPmhlYWRlcjsKKwkJCQlpZiAoaGVhZGVyKSB7CisJCQkJCXZvaWQgX191c2VyICptc2didWY7CisJCQkJCWludCBtc2dsZW47CisKKwkJCQkJbXNnbGVuID0gaGVhZGVyLT5zaXplICsKKwkJCQkJCXNpemVvZihWQ0hJUV9IRUFERVJfVCk7CisJCQkJCS8qIFRoaXMgbXVzdCBiZSBhIFZDSElRLXN0eWxlIHNlcnZpY2UgKi8KKwkJCQkJaWYgKGFyZ3MubXNnYnVmc2l6ZSA8IG1zZ2xlbikgeworCQkJCQkJdmNoaXFfbG9nX2Vycm9yKAorCQkJCQkJCXZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJCQkJImhlYWRlciAleDogbXNnYnVmc2l6ZSIKKwkJCQkJCQkiICV4IDwgbXNnbGVuICV4IiwKKwkJCQkJCQkodW5zaWduZWQgaW50KWhlYWRlciwKKwkJCQkJCQlhcmdzLm1zZ2J1ZnNpemUsCisJCQkJCQkJbXNnbGVuKTsKKwkJCQkJCVdBUk4oMSwgImludmFsaWQgbWVzc2FnZSAiCisJCQkJCQkJInNpemVcbiIpOworCQkJCQkJaWYgKHJldCA9PSAwKQorCQkJCQkJCXJldCA9IC1FTVNHU0laRTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChtc2didWZjb3VudCA8PSAwKQorCQkJCQkJLyogU3RhbGwgaGVyZSBmb3IgbGFjayBvZiBhCisJCQkJCQkqKiBidWZmZXIgZm9yIHRoZSBtZXNzYWdlLiAqLworCQkJCQkJYnJlYWs7CisJCQkJCS8qIEdldCB0aGUgcG9pbnRlciBmcm9tIHVzZXIgc3BhY2UgKi8KKwkJCQkJbXNnYnVmY291bnQtLTsKKwkJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZtc2didWYsCisJCQkJCQkoY29uc3Qgdm9pZCBfX3VzZXIgKikKKwkJCQkJCSZhcmdzLm1zZ2J1ZnNbbXNnYnVmY291bnRdLAorCQkJCQkJc2l6ZW9mKG1zZ2J1ZikpICE9IDApIHsKKwkJCQkJCWlmIChyZXQgPT0gMCkKKwkJCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvKiBDb3B5IHRoZSBtZXNzYWdlIHRvIHVzZXIgc3BhY2UgKi8KKwkJCQkJaWYgKGNvcHlfdG9fdXNlcihtc2didWYsIGhlYWRlciwKKwkJCQkJCW1zZ2xlbikgIT0gMCkgeworCQkJCQkJaWYgKHJldCA9PSAwKQorCQkJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8qIE5vdyBpdCBoYXMgYmVlbiBjb3BpZWQsIHRoZSBtZXNzYWdlCisJCQkJCSoqIGNhbiBiZSByZWxlYXNlZC4gKi8KKwkJCQkJdmNoaXFfcmVsZWFzZV9tZXNzYWdlKHNlcnZpY2UtPmhhbmRsZSwKKwkJCQkJCWhlYWRlcik7CisKKwkJCQkJLyogVGhlIGNvbXBsZXRpb24gbXVzdCBwb2ludCB0byB0aGUKKwkJCQkJKiogbXNnYnVmLiAqLworCQkJCQljb21wbGV0aW9uLT5oZWFkZXIgPSBtc2didWY7CisJCQkJfQorCisJCQkJaWYgKChjb21wbGV0aW9uLT5yZWFzb24gPT0KKwkJCQkJVkNISVFfU0VSVklDRV9DTE9TRUQpICYmCisJCQkJCSFpbnN0YW5jZS0+dXNlX2Nsb3NlX2RlbGl2ZXJlZCkKKwkJCQkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisKKwkJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSgKKwkJCQkJKHNpemVfdClhcmdzLmJ1ZiArCisJCQkJCXJldCAqIHNpemVvZihWQ0hJUV9DT01QTEVUSU9OX0RBVEFfVCkpLAorCQkJCQljb21wbGV0aW9uLAorCQkJCQlzaXplb2YoVkNISVFfQ09NUExFVElPTl9EQVRBX1QpKSAhPSAwKSB7CisJCQkJCQlpZiAocmV0ID09IDApCisJCQkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaW5zdGFuY2UtPmNvbXBsZXRpb25fcmVtb3ZlKys7CisJCQl9CisKKwkJCWlmIChtc2didWZjb3VudCAhPSBhcmdzLm1zZ2J1ZmNvdW50KSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikKKwkJCQkJJigoVkNISVFfQVdBSVRfQ09NUExFVElPTl9UICopYXJnKS0+CisJCQkJCQltc2didWZjb3VudCwKKwkJCQkJJm1zZ2J1ZmNvdW50LAorCQkJCQlzaXplb2YobXNnYnVmY291bnQpKSAhPSAwKSB7CisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHJldCAhPSAwKQorCQkJdXAoJmluc3RhbmNlLT5yZW1vdmVfZXZlbnQpOworCQltdXRleF91bmxvY2soJmluc3RhbmNlLT5jb21wbGV0aW9uX211dGV4KTsKKwkJREVCVUdfVFJBQ0UoQVdBSVRfQ09NUExFVElPTl9MSU5FKTsKKwl9IGJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfREVRVUVVRV9NRVNTQUdFOiB7CisJCVZDSElRX0RFUVVFVUVfTUVTU0FHRV9UIGFyZ3M7CisJCVVTRVJfU0VSVklDRV9UICp1c2VyX3NlcnZpY2U7CisJCVZDSElRX0hFQURFUl9UICpoZWFkZXI7CisKKwkJREVCVUdfVFJBQ0UoREVRVUVVRV9NRVNTQUdFX0xJTkUpOworCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAoJmFyZ3MsIChjb25zdCB2b2lkIF9fdXNlciAqKWFyZywKKwkJCSAgc2l6ZW9mKGFyZ3MpKSAhPSAwKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJc2VydmljZSA9IGZpbmRfc2VydmljZV9mb3JfaW5zdGFuY2UoaW5zdGFuY2UsIGFyZ3MuaGFuZGxlKTsKKwkJaWYgKCFzZXJ2aWNlKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJdXNlcl9zZXJ2aWNlID0gKFVTRVJfU0VSVklDRV9UICopc2VydmljZS0+YmFzZS51c2VyZGF0YTsKKwkJaWYgKHVzZXJfc2VydmljZS0+aXNfdmNoaSA9PSAwKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlzcGluX2xvY2soJm1zZ19xdWV1ZV9zcGlubG9jayk7CisJCWlmICh1c2VyX3NlcnZpY2UtPm1zZ19yZW1vdmUgPT0gdXNlcl9zZXJ2aWNlLT5tc2dfaW5zZXJ0KSB7CisJCQlpZiAoIWFyZ3MuYmxvY2tpbmcpIHsKKwkJCQlzcGluX3VubG9jaygmbXNnX3F1ZXVlX3NwaW5sb2NrKTsKKwkJCQlERUJVR19UUkFDRShERVFVRVVFX01FU1NBR0VfTElORSk7CisJCQkJcmV0ID0gLUVXT1VMREJMT0NLOworCQkJCWJyZWFrOworCQkJfQorCQkJdXNlcl9zZXJ2aWNlLT5kZXF1ZXVlX3BlbmRpbmcgPSAxOworCQkJZG8geworCQkJCXNwaW5fdW5sb2NrKCZtc2dfcXVldWVfc3BpbmxvY2spOworCQkJCURFQlVHX1RSQUNFKERFUVVFVUVfTUVTU0FHRV9MSU5FKTsKKwkJCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKAorCQkJCQkmdXNlcl9zZXJ2aWNlLT5pbnNlcnRfZXZlbnQpICE9IDApIHsKKwkJCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkJCSJERVFVRVVFX01FU1NBR0UgaW50ZXJydXB0ZWQiKTsKKwkJCQkJcmV0ID0gLUVJTlRSOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJc3Bpbl9sb2NrKCZtc2dfcXVldWVfc3BpbmxvY2spOworCQkJfSB3aGlsZSAodXNlcl9zZXJ2aWNlLT5tc2dfcmVtb3ZlID09CisJCQkJdXNlcl9zZXJ2aWNlLT5tc2dfaW5zZXJ0KTsKKworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJfQorCisJCUJVR19PTigoaW50KSh1c2VyX3NlcnZpY2UtPm1zZ19pbnNlcnQgLQorCQkJdXNlcl9zZXJ2aWNlLT5tc2dfcmVtb3ZlKSA8IDApOworCisJCWhlYWRlciA9IHVzZXJfc2VydmljZS0+bXNnX3F1ZXVlW3VzZXJfc2VydmljZS0+bXNnX3JlbW92ZSAmCisJCQkoTVNHX1FVRVVFX1NJWkUgLSAxKV07CisJCXVzZXJfc2VydmljZS0+bXNnX3JlbW92ZSsrOworCQlzcGluX3VubG9jaygmbXNnX3F1ZXVlX3NwaW5sb2NrKTsKKworCQl1cCgmdXNlcl9zZXJ2aWNlLT5yZW1vdmVfZXZlbnQpOworCQlpZiAoaGVhZGVyID09IE5VTEwpCisJCQlyZXQgPSAtRU5PVENPTk47CisJCWVsc2UgaWYgKGhlYWRlci0+c2l6ZSA8PSBhcmdzLmJ1ZnNpemUpIHsKKwkJCS8qIENvcHkgdG8gdXNlciBzcGFjZSBpZiBtc2didWYgaXMgbm90IE5VTEwgKi8KKwkJCWlmICgoYXJncy5idWYgPT0gTlVMTCkgfHwKKwkJCQkoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZ3MuYnVmLAorCQkJCWhlYWRlci0+ZGF0YSwKKwkJCQloZWFkZXItPnNpemUpID09IDApKSB7CisJCQkJcmV0ID0gaGVhZGVyLT5zaXplOworCQkJCXZjaGlxX3JlbGVhc2VfbWVzc2FnZSgKKwkJCQkJc2VydmljZS0+aGFuZGxlLAorCQkJCQloZWFkZXIpOworCQkJfSBlbHNlCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCSJoZWFkZXIgJXg6IGJ1ZnNpemUgJXggPCBzaXplICV4IiwKKwkJCQkodW5zaWduZWQgaW50KWhlYWRlciwgYXJncy5idWZzaXplLAorCQkJCWhlYWRlci0+c2l6ZSk7CisJCQlXQVJOKDEsICJpbnZhbGlkIHNpemVcbiIpOworCQkJcmV0ID0gLUVNU0dTSVpFOworCQl9CisJCURFQlVHX1RSQUNFKERFUVVFVUVfTUVTU0FHRV9MSU5FKTsKKwl9IGJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfR0VUX0NMSUVOVF9JRDogeworCQlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSA9IChWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UKWFyZzsKKworCQlyZXQgPSB2Y2hpcV9nZXRfY2xpZW50X2lkKGhhbmRsZSk7CisJfSBicmVhazsKKworCWNhc2UgVkNISVFfSU9DX0dFVF9DT05GSUc6IHsKKwkJVkNISVFfR0VUX0NPTkZJR19UIGFyZ3M7CisJCVZDSElRX0NPTkZJR19UIGNvbmZpZzsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmFyZ3MsIChjb25zdCB2b2lkIF9fdXNlciAqKWFyZywKKwkJCXNpemVvZihhcmdzKSkgIT0gMCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChhcmdzLmNvbmZpZ19zaXplID4gc2l6ZW9mKGNvbmZpZykpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlzdGF0dXMgPSB2Y2hpcV9nZXRfY29uZmlnKGluc3RhbmNlLCBhcmdzLmNvbmZpZ19zaXplLCAmY29uZmlnKTsKKwkJaWYgKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKSB7CisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZ3MucGNvbmZpZywKKwkJCQkgICAgJmNvbmZpZywgYXJncy5jb25maWdfc2l6ZSkgIT0gMCkgeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfU0VUX1NFUlZJQ0VfT1BUSU9OOiB7CisJCVZDSElRX1NFVF9TRVJWSUNFX09QVElPTl9UIGFyZ3M7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKAorCQkJJmFyZ3MsIChjb25zdCB2b2lkIF9fdXNlciAqKWFyZywKKwkJCXNpemVvZihhcmdzKSkgIT0gMCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJc2VydmljZSA9IGZpbmRfc2VydmljZV9mb3JfaW5zdGFuY2UoaW5zdGFuY2UsIGFyZ3MuaGFuZGxlKTsKKwkJaWYgKCFzZXJ2aWNlKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlzdGF0dXMgPSB2Y2hpcV9zZXRfc2VydmljZV9vcHRpb24oCisJCQkJYXJncy5oYW5kbGUsIGFyZ3Mub3B0aW9uLCBhcmdzLnZhbHVlKTsKKwl9IGJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfRFVNUF9QSFlTX01FTTogeworCQlWQ0hJUV9EVU1QX01FTV9UICBhcmdzOworCisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICgmYXJncywgKGNvbnN0IHZvaWQgX191c2VyICopYXJnLAorCQkJICBzaXplb2YoYXJncykpICE9IDApIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlkdW1wX3BoeXNfbWVtKGFyZ3MudmlydF9hZGRyLCBhcmdzLm51bV9ieXRlcyk7CisJfSBicmVhazsKKworCWNhc2UgVkNISVFfSU9DX0xJQl9WRVJTSU9OOiB7CisJCXVuc2lnbmVkIGludCBsaWJfdmVyc2lvbiA9ICh1bnNpZ25lZCBpbnQpYXJnOworCisJCWlmIChsaWJfdmVyc2lvbiA8IFZDSElRX1ZFUlNJT05fTUlOKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJZWxzZSBpZiAobGliX3ZlcnNpb24gPj0gVkNISVFfVkVSU0lPTl9DTE9TRV9ERUxJVkVSRUQpCisJCQlpbnN0YW5jZS0+dXNlX2Nsb3NlX2RlbGl2ZXJlZCA9IDE7CisJfSBicmVhazsKKworCWNhc2UgVkNISVFfSU9DX0NMT1NFX0RFTElWRVJFRDogeworCQlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSA9IChWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UKWFyZzsKKworCQlzZXJ2aWNlID0gZmluZF9jbG9zZWRfc2VydmljZV9mb3JfaW5zdGFuY2UoaW5zdGFuY2UsIGhhbmRsZSk7CisJCWlmIChzZXJ2aWNlICE9IE5VTEwpIHsKKwkJCVVTRVJfU0VSVklDRV9UICp1c2VyX3NlcnZpY2UgPQorCQkJCShVU0VSX1NFUlZJQ0VfVCAqKXNlcnZpY2UtPmJhc2UudXNlcmRhdGE7CisJCQljbG9zZV9kZWxpdmVyZWQodXNlcl9zZXJ2aWNlKTsKKwkJfQorCQllbHNlCisJCQlyZXQgPSAtRUlOVkFMOworCX0gYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PVFRZOworCQlicmVhazsKKwl9CisKKwlpZiAoc2VydmljZSkKKwkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisKKwlpZiAocmV0ID09IDApIHsKKwkJaWYgKHN0YXR1cyA9PSBWQ0hJUV9FUlJPUikKKwkJCXJldCA9IC1FSU87CisJCWVsc2UgaWYgKHN0YXR1cyA9PSBWQ0hJUV9SRVRSWSkKKwkJCXJldCA9IC1FSU5UUjsKKwl9CisKKwlpZiAoKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKSAmJiAocmV0IDwgMCkgJiYgKHJldCAhPSAtRUlOVFIpICYmCisJCShyZXQgIT0gLUVXT1VMREJMT0NLKSkKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCSIgIGlvY3RsIGluc3RhbmNlICVseCwgY21kICVzIC0+IHN0YXR1cyAlZCwgJWxkIiwKKwkJCSh1bnNpZ25lZCBsb25nKWluc3RhbmNlLAorCQkJKF9JT0NfTlIoY21kKSA8PSBWQ0hJUV9JT0NfTUFYKSA/CisJCQkJaW9jdGxfbmFtZXNbX0lPQ19OUihjbWQpXSA6CisJCQkJIjxpbnZhbGlkPiIsCisJCQlzdGF0dXMsIHJldCk7CisJZWxzZQorCQl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCSIgIGlvY3RsIGluc3RhbmNlICVseCwgY21kICVzIC0+IHN0YXR1cyAlZCwgJWxkIiwKKwkJCSh1bnNpZ25lZCBsb25nKWluc3RhbmNlLAorCQkJKF9JT0NfTlIoY21kKSA8PSBWQ0hJUV9JT0NfTUFYKSA/CisJCQkJaW9jdGxfbmFtZXNbX0lPQ19OUihjbWQpXSA6CisJCQkJIjxpbnZhbGlkPiIsCisJCQlzdGF0dXMsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHZjaGlxX29wZW4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAordmNoaXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgZGV2ID0gaW1pbm9yKGlub2RlKSAmIDB4MGY7CisJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwgInZjaGlxX29wZW4iKTsKKwlzd2l0Y2ggKGRldikgeworCWNhc2UgVkNISVFfTUlOT1I6IHsKKwkJaW50IHJldDsKKwkJVkNISVFfU1RBVEVfVCAqc3RhdGUgPSB2Y2hpcV9nZXRfc3RhdGUoKTsKKwkJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZTsKKworCQlpZiAoIXN0YXRlKSB7CisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkidmNoaXEgaGFzIG5vIGNvbm5lY3Rpb24gdG8gVmlkZW9Db3JlIik7CisJCQlyZXR1cm4gLUVOT1RDT05OOworCQl9CisKKwkJaW5zdGFuY2UgPSBremFsbG9jKHNpemVvZigqaW5zdGFuY2UpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFpbnN0YW5jZSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWluc3RhbmNlLT5zdGF0ZSA9IHN0YXRlOworCQlpbnN0YW5jZS0+cGlkID0gY3VycmVudC0+dGdpZDsKKworCQlyZXQgPSB2Y2hpcV9kZWJ1Z2ZzX2FkZF9pbnN0YW5jZShpbnN0YW5jZSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJa2ZyZWUoaW5zdGFuY2UpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXNlbWFfaW5pdCgmaW5zdGFuY2UtPmluc2VydF9ldmVudCwgMCk7CisJCXNlbWFfaW5pdCgmaW5zdGFuY2UtPnJlbW92ZV9ldmVudCwgMCk7CisJCW11dGV4X2luaXQoJmluc3RhbmNlLT5jb21wbGV0aW9uX211dGV4KTsKKwkJbXV0ZXhfaW5pdCgmaW5zdGFuY2UtPmJ1bGtfd2FpdGVyX2xpc3RfbXV0ZXgpOworCQlJTklUX0xJU1RfSEVBRCgmaW5zdGFuY2UtPmJ1bGtfd2FpdGVyX2xpc3QpOworCisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGluc3RhbmNlOworCX0gYnJlYWs7CisKKwlkZWZhdWx0OgorCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCSJVbmtub3duIG1pbm9yIGRldmljZTogJWQiLCBkZXYpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHZjaGlxX3JlbGVhc2UKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAordmNoaXFfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgZGV2ID0gaW1pbm9yKGlub2RlKSAmIDB4MGY7CisJaW50IHJldCA9IDA7CisJc3dpdGNoIChkZXYpIHsKKwljYXNlIFZDSElRX01JTk9SOiB7CisJCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gdmNoaXFfZ2V0X3N0YXRlKCk7CisJCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKwkJaW50IGk7CisKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCSJ2Y2hpcV9yZWxlYXNlOiBpbnN0YW5jZT0lbHgiLAorCQkJKHVuc2lnbmVkIGxvbmcpaW5zdGFuY2UpOworCisJCWlmICghc3RhdGUpIHsKKwkJCXJldCA9IC1FUEVSTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogRW5zdXJlIHZpZGVvY29yZSBpcyBhd2FrZSB0byBhbGxvdyB0ZXJtaW5hdGlvbi4gKi8KKwkJdmNoaXFfdXNlX2ludGVybmFsKGluc3RhbmNlLT5zdGF0ZSwgTlVMTCwKKwkJCQlVU0VfVFlQRV9WQ0hJUSk7CisKKwkJbXV0ZXhfbG9jaygmaW5zdGFuY2UtPmNvbXBsZXRpb25fbXV0ZXgpOworCisJCS8qIFdha2UgdGhlIGNvbXBsZXRpb24gdGhyZWFkIGFuZCBhc2sgaXQgdG8gZXhpdCAqLworCQlpbnN0YW5jZS0+Y2xvc2luZyA9IDE7CisJCXVwKCZpbnN0YW5jZS0+aW5zZXJ0X2V2ZW50KTsKKworCQltdXRleF91bmxvY2soJmluc3RhbmNlLT5jb21wbGV0aW9uX211dGV4KTsKKworCQkvKiBXYWtlIHRoZSBzbG90IGhhbmRsZXIgaWYgdGhlIGNvbXBsZXRpb24gcXVldWUgaXMgZnVsbC4gKi8KKwkJdXAoJmluc3RhbmNlLT5yZW1vdmVfZXZlbnQpOworCisJCS8qIE1hcmsgYWxsIHNlcnZpY2VzIGZvciB0ZXJtaW5hdGlvbi4uLiAqLworCQlpID0gMDsKKwkJd2hpbGUgKChzZXJ2aWNlID0gbmV4dF9zZXJ2aWNlX2J5X2luc3RhbmNlKHN0YXRlLCBpbnN0YW5jZSwKKwkJCSZpKSkgIT0JTlVMTCkgeworCQkJVVNFUl9TRVJWSUNFX1QgKnVzZXJfc2VydmljZSA9IHNlcnZpY2UtPmJhc2UudXNlcmRhdGE7CisKKwkJCS8qIFdha2UgdGhlIHNsb3QgaGFuZGxlciBpZiB0aGUgbXNnIHF1ZXVlIGlzIGZ1bGwuICovCisJCQl1cCgmdXNlcl9zZXJ2aWNlLT5yZW1vdmVfZXZlbnQpOworCisJCQl2Y2hpcV90ZXJtaW5hdGVfc2VydmljZV9pbnRlcm5hbChzZXJ2aWNlKTsKKwkJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQl9CisKKwkJLyogLi4uYW5kIHdhaXQgZm9yIHRoZW0gdG8gZGllICovCisJCWkgPSAwOworCQl3aGlsZSAoKHNlcnZpY2UgPSBuZXh0X3NlcnZpY2VfYnlfaW5zdGFuY2Uoc3RhdGUsIGluc3RhbmNlLCAmaSkpCisJCQkhPSBOVUxMKSB7CisJCQlVU0VSX1NFUlZJQ0VfVCAqdXNlcl9zZXJ2aWNlID0gc2VydmljZS0+YmFzZS51c2VyZGF0YTsKKworCQkJZG93bigmc2VydmljZS0+cmVtb3ZlX2V2ZW50KTsKKworCQkJQlVHX09OKHNlcnZpY2UtPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX0ZSRUUpOworCisJCQlzcGluX2xvY2soJm1zZ19xdWV1ZV9zcGlubG9jayk7CisKKwkJCXdoaWxlICh1c2VyX3NlcnZpY2UtPm1zZ19yZW1vdmUgIT0KKwkJCQl1c2VyX3NlcnZpY2UtPm1zZ19pbnNlcnQpIHsKKwkJCQlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyID0gdXNlcl9zZXJ2aWNlLT4KKwkJCQkJbXNnX3F1ZXVlW3VzZXJfc2VydmljZS0+bXNnX3JlbW92ZSAmCisJCQkJCQkoTVNHX1FVRVVFX1NJWkUgLSAxKV07CisJCQkJdXNlcl9zZXJ2aWNlLT5tc2dfcmVtb3ZlKys7CisJCQkJc3Bpbl91bmxvY2soJm1zZ19xdWV1ZV9zcGlubG9jayk7CisKKwkJCQlpZiAoaGVhZGVyKQorCQkJCQl2Y2hpcV9yZWxlYXNlX21lc3NhZ2UoCisJCQkJCQlzZXJ2aWNlLT5oYW5kbGUsCisJCQkJCQloZWFkZXIpOworCQkJCXNwaW5fbG9jaygmbXNnX3F1ZXVlX3NwaW5sb2NrKTsKKwkJCX0KKworCQkJc3Bpbl91bmxvY2soJm1zZ19xdWV1ZV9zcGlubG9jayk7CisKKwkJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQl9CisKKwkJLyogUmVsZWFzZSBhbnkgY2xvc2VkIHNlcnZpY2VzICovCisJCXdoaWxlIChpbnN0YW5jZS0+Y29tcGxldGlvbl9yZW1vdmUgIT0KKwkJCWluc3RhbmNlLT5jb21wbGV0aW9uX2luc2VydCkgeworCQkJVkNISVFfQ09NUExFVElPTl9EQVRBX1QgKmNvbXBsZXRpb247CisJCQlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2U7CisJCQljb21wbGV0aW9uID0gJmluc3RhbmNlLT5jb21wbGV0aW9uc1sKKwkJCQlpbnN0YW5jZS0+Y29tcGxldGlvbl9yZW1vdmUgJgorCQkJCShNQVhfQ09NUExFVElPTlMgLSAxKV07CisJCQlzZXJ2aWNlID0gY29tcGxldGlvbi0+c2VydmljZV91c2VyZGF0YTsKKwkJCWlmIChjb21wbGV0aW9uLT5yZWFzb24gPT0gVkNISVFfU0VSVklDRV9DTE9TRUQpCisJCQl7CisJCQkJVVNFUl9TRVJWSUNFX1QgKnVzZXJfc2VydmljZSA9CisJCQkJCXNlcnZpY2UtPmJhc2UudXNlcmRhdGE7CisKKwkJCQkvKiBXYWtlIGFueSBibG9ja2VkIHVzZXItdGhyZWFkICovCisJCQkJaWYgKGluc3RhbmNlLT51c2VfY2xvc2VfZGVsaXZlcmVkKQorCQkJCQl1cCgmdXNlcl9zZXJ2aWNlLT5jbG9zZV9ldmVudCk7CisJCQkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisJCQl9CisJCQlpbnN0YW5jZS0+Y29tcGxldGlvbl9yZW1vdmUrKzsKKwkJfQorCisJCS8qIFJlbGVhc2UgdGhlIFBFRVIgc2VydmljZSBjb3VudC4gKi8KKwkJdmNoaXFfcmVsZWFzZV9pbnRlcm5hbChpbnN0YW5jZS0+c3RhdGUsIE5VTEwpOworCisJCXsKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKm5leHQ7CisJCQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuZXh0LAorCQkJCSZpbnN0YW5jZS0+YnVsa193YWl0ZXJfbGlzdCkgeworCQkJCXN0cnVjdCBidWxrX3dhaXRlcl9ub2RlICp3YWl0ZXI7CisJCQkJd2FpdGVyID0gbGlzdF9lbnRyeShwb3MsCisJCQkJCXN0cnVjdCBidWxrX3dhaXRlcl9ub2RlLAorCQkJCQlsaXN0KTsKKwkJCQlsaXN0X2RlbChwb3MpOworCQkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJCSJidWxrX3dhaXRlciAtIGNsZWFuZWQgdXAgJXggIgorCQkJCQkiZm9yIHBpZCAlZCIsCisJCQkJCSh1bnNpZ25lZCBpbnQpd2FpdGVyLCB3YWl0ZXItPnBpZCk7CisJCQkJa2ZyZWUod2FpdGVyKTsKKwkJCX0KKwkJfQorCisJCXZjaGlxX2RlYnVnZnNfcmVtb3ZlX2luc3RhbmNlKGluc3RhbmNlKTsKKworCQlrZnJlZShpbnN0YW5jZSk7CisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJfSBicmVhazsKKworCWRlZmF1bHQ6CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJIlVua25vd24gbWlub3IgZGV2aWNlOiAlZCIsIGRldik7CisJCXJldCA9IC1FTlhJTzsKKwl9CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHZjaGlxX2R1bXAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAordmNoaXFfZHVtcCh2b2lkICpkdW1wX2NvbnRleHQsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbikKK3sKKwlEVU1QX0NPTlRFWFRfVCAqY29udGV4dCA9IChEVU1QX0NPTlRFWFRfVCAqKWR1bXBfY29udGV4dDsKKworCWlmIChjb250ZXh0LT5hY3R1YWwgPCBjb250ZXh0LT5zcGFjZSkgeworCQlpbnQgY29weV9ieXRlczsKKwkJaWYgKGNvbnRleHQtPm9mZnNldCA+IDApIHsKKwkJCWludCBza2lwX2J5dGVzID0gbWluKGxlbiwgKGludCljb250ZXh0LT5vZmZzZXQpOworCQkJc3RyICs9IHNraXBfYnl0ZXM7CisJCQlsZW4gLT0gc2tpcF9ieXRlczsKKwkJCWNvbnRleHQtPm9mZnNldCAtPSBza2lwX2J5dGVzOworCQkJaWYgKGNvbnRleHQtPm9mZnNldCA+IDApCisJCQkJcmV0dXJuOworCQl9CisJCWNvcHlfYnl0ZXMgPSBtaW4obGVuLCAoaW50KShjb250ZXh0LT5zcGFjZSAtIGNvbnRleHQtPmFjdHVhbCkpOworCQlpZiAoY29weV9ieXRlcyA9PSAwKQorCQkJcmV0dXJuOworCQlpZiAoY29weV90b191c2VyKGNvbnRleHQtPmJ1ZiArIGNvbnRleHQtPmFjdHVhbCwgc3RyLAorCQkJY29weV9ieXRlcykpCisJCQljb250ZXh0LT5hY3R1YWwgPSAtRUZBVUxUOworCQljb250ZXh0LT5hY3R1YWwgKz0gY29weV9ieXRlczsKKwkJbGVuIC09IGNvcHlfYnl0ZXM7CisKKwkJLyogSWYgdG5lIHRlcm1pbmF0aW5nIE5VTCBpcyBpbmNsdWRlZCBpbiB0aGUgbGVuZ3RoLCB0aGVuIGl0CisJCSoqIG1hcmtzIHRoZSBlbmQgb2YgYSBsaW5lIGFuZCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBhCisJCSoqIGNhcnJpYWdlIHJldHVybi4gKi8KKwkJaWYgKChsZW4gPT0gMCkgJiYgKHN0cltjb3B5X2J5dGVzIC0gMV0gPT0gJ1wwJykpIHsKKwkJCWNoYXIgY3IgPSAnXG4nOworCQkJaWYgKGNvcHlfdG9fdXNlcihjb250ZXh0LT5idWYgKyBjb250ZXh0LT5hY3R1YWwgLSAxLAorCQkJCSZjciwgMSkpCisJCQkJY29udGV4dC0+YWN0dWFsID0gLUVGQVVMVDsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICB2Y2hpcV9kdW1wX3BsYXRmb3JtX2luc3RhbmNlX3N0YXRlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK3ZjaGlxX2R1bXBfcGxhdGZvcm1faW5zdGFuY2VzKHZvaWQgKmR1bXBfY29udGV4dCkKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IHZjaGlxX2dldF9zdGF0ZSgpOworCWNoYXIgYnVmWzgwXTsKKwlpbnQgbGVuOworCWludCBpOworCisJLyogVGhlcmUgaXMgbm8gbGlzdCBvZiBpbnN0YW5jZXMsIHNvIGluc3RlYWQgc2NhbiBhbGwgc2VydmljZXMsCisJCW1hcmtpbmcgdGhvc2UgdGhhdCBoYXZlIGJlZW4gZHVtcGVkLiAqLworCisJZm9yIChpID0gMDsgaSA8IHN0YXRlLT51bnVzZWRfc2VydmljZTsgaSsrKSB7CisJCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IHN0YXRlLT5zZXJ2aWNlc1tpXTsKKwkJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZTsKKworCQlpZiAoc2VydmljZSAmJiAoc2VydmljZS0+YmFzZS5jYWxsYmFjayA9PSBzZXJ2aWNlX2NhbGxiYWNrKSkgeworCQkJaW5zdGFuY2UgPSBzZXJ2aWNlLT5pbnN0YW5jZTsKKwkJCWlmIChpbnN0YW5jZSkKKwkJCQlpbnN0YW5jZS0+bWFyayA9IDA7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPnVudXNlZF9zZXJ2aWNlOyBpKyspIHsKKwkJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gc3RhdGUtPnNlcnZpY2VzW2ldOworCQlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlOworCisJCWlmIChzZXJ2aWNlICYmIChzZXJ2aWNlLT5iYXNlLmNhbGxiYWNrID09IHNlcnZpY2VfY2FsbGJhY2spKSB7CisJCQlpbnN0YW5jZSA9IHNlcnZpY2UtPmluc3RhbmNlOworCQkJaWYgKGluc3RhbmNlICYmICFpbnN0YW5jZS0+bWFyaykgeworCQkJCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkJCSJJbnN0YW5jZSAleDogcGlkICVkLCVzIGNvbXBsZXRpb25zICIKKwkJCQkJCSIlZC8lZCIsCisJCQkJCSh1bnNpZ25lZCBpbnQpaW5zdGFuY2UsIGluc3RhbmNlLT5waWQsCisJCQkJCWluc3RhbmNlLT5jb25uZWN0ZWQgPyAiIGNvbm5lY3RlZCwgIiA6CisJCQkJCQkiIiwKKwkJCQkJaW5zdGFuY2UtPmNvbXBsZXRpb25faW5zZXJ0IC0KKwkJCQkJCWluc3RhbmNlLT5jb21wbGV0aW9uX3JlbW92ZSwKKwkJCQkJTUFYX0NPTVBMRVRJT05TKTsKKworCQkJCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworCisJCQkJaW5zdGFuY2UtPm1hcmsgPSAxOworCQkJfQorCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHZjaGlxX2R1bXBfcGxhdGZvcm1fc2VydmljZV9zdGF0ZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCit2Y2hpcV9kdW1wX3BsYXRmb3JtX3NlcnZpY2Vfc3RhdGUodm9pZCAqZHVtcF9jb250ZXh0LCBWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpCit7CisJVVNFUl9TRVJWSUNFX1QgKnVzZXJfc2VydmljZSA9IChVU0VSX1NFUlZJQ0VfVCAqKXNlcnZpY2UtPmJhc2UudXNlcmRhdGE7CisJY2hhciBidWZbODBdOworCWludCBsZW47CisKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiICBpbnN0YW5jZSAleCIsCisJCSh1bnNpZ25lZCBpbnQpc2VydmljZS0+aW5zdGFuY2UpOworCisJaWYgKChzZXJ2aWNlLT5iYXNlLmNhbGxiYWNrID09IHNlcnZpY2VfY2FsbGJhY2spICYmCisJCXVzZXJfc2VydmljZS0+aXNfdmNoaSkgeworCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKKwkJCSIsICVkLyVkIG1lc3NhZ2VzIiwKKwkJCXVzZXJfc2VydmljZS0+bXNnX2luc2VydCAtIHVzZXJfc2VydmljZS0+bXNnX3JlbW92ZSwKKwkJCU1TR19RVUVVRV9TSVpFKTsKKworCQlpZiAodXNlcl9zZXJ2aWNlLT5kZXF1ZXVlX3BlbmRpbmcpCisJCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKKwkJCQkiIChkZXF1ZXVlIHBlbmRpbmcpIik7CisJfQorCisJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgZHVtcF91c2VyX21lbQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorZHVtcF9waHlzX21lbSh2b2lkICp2aXJ0X2FkZHIsIHVpbnQzMl90IG51bV9ieXRlcykKK3sKKwlpbnQgICAgICAgICAgICByYzsKKwl1aW50OF90ICAgICAgICplbmRfdmlydF9hZGRyID0gdmlydF9hZGRyICsgbnVtX2J5dGVzOworCWludCAgICAgICAgICAgIG51bV9wYWdlczsKKwlpbnQgICAgICAgICAgICBvZmZzZXQ7CisJaW50ICAgICAgICAgICAgZW5kX29mZnNldDsKKwlpbnQgICAgICAgICAgICBwYWdlX2lkeDsKKwlpbnQgICAgICAgICAgICBwcmV2X2lkeDsKKwlzdHJ1Y3QgcGFnZSAgICpwYWdlOworCXN0cnVjdCBwYWdlICAqKnBhZ2VzOworCXVpbnQ4X3QgICAgICAgKmttYXBwZWRfdmlydF9wdHI7CisKKwkvKiBBbGlnbiB2aXJ0QWRkciBhbmQgZW5kVmlydEFkZHIgdG8gMTYgYnl0ZSBib3VuZGFyaWVzLiAqLworCisJdmlydF9hZGRyID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdmlydF9hZGRyICYgfjB4MGZ1TCk7CisJZW5kX3ZpcnRfYWRkciA9ICh2b2lkICopKCgodW5zaWduZWQgbG9uZyllbmRfdmlydF9hZGRyICsgMTV1TCkgJgorCQl+MHgwZnVMKTsKKworCW9mZnNldCA9IChpbnQpKGxvbmcpdmlydF9hZGRyICYgKFBBR0VfU0laRSAtIDEpOworCWVuZF9vZmZzZXQgPSAoaW50KShsb25nKWVuZF92aXJ0X2FkZHIgJiAoUEFHRV9TSVpFIC0gMSk7CisKKwludW1fcGFnZXMgPSAob2Zmc2V0ICsgbnVtX2J5dGVzICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisKKwlwYWdlcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopICogbnVtX3BhZ2VzLCBHRlBfS0VSTkVMKTsKKwlpZiAocGFnZXMgPT0gTlVMTCkgeworCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCSJVbmFibGUgdG8gYWxsb2NhdGlvbiBtZW1vcnkgZm9yICVkIHBhZ2VzXG4iLAorCQkJbnVtX3BhZ2VzKTsKKwkJcmV0dXJuOworCX0KKworCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlyYyA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsICAgICAgLyogdGFzayAqLworCQljdXJyZW50LT5tbSwgICAgICAgICAgICAgIC8qIG1tICovCisJCSh1bnNpZ25lZCBsb25nKXZpcnRfYWRkciwgLyogc3RhcnQgKi8KKwkJbnVtX3BhZ2VzLCAgICAgICAgICAgICAgICAvKiBsZW4gKi8KKwkJMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlICovCisJCXBhZ2VzLCAgICAgICAgICAgICAgICAgICAgLyogcGFnZXMgKGFycmF5IG9mIHBhZ2UgcG9pbnRlcnMpICovCisJCU5VTEwpOyAgICAgICAgICAgICAgICAgICAgLyogdm1hcyAqLworCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKwlwcmV2X2lkeCA9IC0xOworCXBhZ2UgPSBOVUxMOworCisJd2hpbGUgKG9mZnNldCA8IGVuZF9vZmZzZXQpIHsKKworCQlpbnQgcGFnZV9vZmZzZXQgPSBvZmZzZXQgJSBQQUdFX1NJWkU7CisJCXBhZ2VfaWR4ID0gb2Zmc2V0IC8gUEFHRV9TSVpFOworCisJCWlmIChwYWdlX2lkeCAhPSBwcmV2X2lkeCkgeworCisJCQlpZiAocGFnZSAhPSBOVUxMKQorCQkJCWt1bm1hcChwYWdlKTsKKwkJCXBhZ2UgPSBwYWdlc1twYWdlX2lkeF07CisJCQlrbWFwcGVkX3ZpcnRfcHRyID0ga21hcChwYWdlKTsKKworCQkJcHJldl9pZHggPSBwYWdlX2lkeDsKKwkJfQorCisJCWlmICh2Y2hpcV9hcm1fbG9nX2xldmVsID49IFZDSElRX0xPR19UUkFDRSkKKwkJCXZjaGlxX2xvZ19kdW1wX21lbSgicGgiLAorCQkJCSh1aW50MzJfdCkodW5zaWduZWQgbG9uZykma21hcHBlZF92aXJ0X3B0clsKKwkJCQkJcGFnZV9vZmZzZXRdLAorCQkJCSZrbWFwcGVkX3ZpcnRfcHRyW3BhZ2Vfb2Zmc2V0XSwgMTYpOworCisJCW9mZnNldCArPSAxNjsKKwl9CisJaWYgKHBhZ2UgIT0gTlVMTCkKKwkJa3VubWFwKHBhZ2UpOworCisJZm9yIChwYWdlX2lkeCA9IDA7IHBhZ2VfaWR4IDwgbnVtX3BhZ2VzOyBwYWdlX2lkeCsrKQorCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZXNbcGFnZV9pZHhdKTsKKworCWtmcmVlKHBhZ2VzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICB2Y2hpcV9yZWFkCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzc2l6ZV90Cit2Y2hpcV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCURVTVBfQ09OVEVYVF9UIGNvbnRleHQ7CisJY29udGV4dC5idWYgPSBidWY7CisJY29udGV4dC5hY3R1YWwgPSAwOworCWNvbnRleHQuc3BhY2UgPSBjb3VudDsKKwljb250ZXh0Lm9mZnNldCA9ICpwcG9zOworCisJdmNoaXFfZHVtcF9zdGF0ZSgmY29udGV4dCwgJmdfc3RhdGUpOworCisJKnBwb3MgKz0gY29udGV4dC5hY3R1YWw7CisKKwlyZXR1cm4gY29udGV4dC5hY3R1YWw7Cit9CisKK1ZDSElRX1NUQVRFX1QgKgordmNoaXFfZ2V0X3N0YXRlKHZvaWQpCit7CisKKwlpZiAoZ19zdGF0ZS5yZW1vdGUgPT0gTlVMTCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZ19zdGF0ZS5yZW1vdGUgPT0gTlVMTFxuIiwgX19mdW5jX18pOworCWVsc2UgaWYgKGdfc3RhdGUucmVtb3RlLT5pbml0aWFsaXNlZCAhPSAxKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBnX3N0YXRlLnJlbW90ZS0+aW5pdGlhbGlzZWQgIT0gMSAoJWQpXG4iLAorCQkJX19mdW5jX18sIGdfc3RhdGUucmVtb3RlLT5pbml0aWFsaXNlZCk7CisKKwlyZXR1cm4gKChnX3N0YXRlLnJlbW90ZSAhPSBOVUxMKSAmJgorCQkoZ19zdGF0ZS5yZW1vdGUtPmluaXRpYWxpc2VkID09IDEpKSA/ICZnX3N0YXRlIDogTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMKK3ZjaGlxX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnVubG9ja2VkX2lvY3RsID0gdmNoaXFfaW9jdGwsCisJLm9wZW4gPSB2Y2hpcV9vcGVuLAorCS5yZWxlYXNlID0gdmNoaXFfcmVsZWFzZSwKKwkucmVhZCA9IHZjaGlxX3JlYWQKK307CisKKy8qCisgKiBBdXRvc3VzcGVuZCByZWxhdGVkIGZ1bmN0aW9uYWxpdHkKKyAqLworCitpbnQKK3ZjaGlxX3ZpZGVvY29yZV93YW50ZWQoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCWlmICghYXJtX3N0YXRlKQorCQkvKiBhdXRvc3VzcGVuZCBub3Qgc3VwcG9ydGVkIC0gYWx3YXlzIHJldHVybiB3YW50ZWQgKi8KKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAoYXJtX3N0YXRlLT5ibG9ja2VkX2NvdW50KQorCQlyZXR1cm4gMTsKKwllbHNlIGlmICghYXJtX3N0YXRlLT52aWRlb2NvcmVfdXNlX2NvdW50KQorCQkvKiB1c2FnZSBjb3VudCB6ZXJvIC0gY2hlY2sgZm9yIG92ZXJyaWRlIHVubGVzcyB3ZSdyZSBmb3JjaW5nICovCisJCWlmIChhcm1fc3RhdGUtPnJlc3VtZV9ibG9ja2VkKQorCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXJldHVybiB2Y2hpcV9wbGF0Zm9ybV92aWRlb2NvcmVfd2FudGVkKHN0YXRlKTsKKwllbHNlCisJCS8qIG5vbi16ZXJvIHVzYWdlIGNvdW50IC0gdmlkZW9jb3JlIHN0aWxsIHJlcXVpcmVkICovCisJCXJldHVybiAxOworfQorCitzdGF0aWMgVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2tlZXBhbGl2ZV92Y2hpcV9jYWxsYmFjayhWQ0hJUV9SRUFTT05fVCByZWFzb24sCisJVkNISVFfSEVBREVSX1QgKmhlYWRlciwKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfdXNlciwKKwl2b2lkICpidWxrX3VzZXIpCit7CisJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkiJXMgY2FsbGJhY2sgcmVhc29uICVkIiwgX19mdW5jX18sIHJlYXNvbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3ZjaGlxX2tlZXBhbGl2ZV90aHJlYWRfZnVuYyh2b2lkICp2KQoreworCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gKFZDSElRX1NUQVRFX1QgKikgdjsKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXM7CisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZTsKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGthX2hhbmRsZTsKKworCVZDSElRX1NFUlZJQ0VfUEFSQU1TX1QgcGFyYW1zID0geworCQkuZm91cmNjICAgICAgPSBWQ0hJUV9NQUtFX0ZPVVJDQygnSycsICdFJywgJ0UnLCAnUCcpLAorCQkuY2FsbGJhY2sgICAgPSB2Y2hpcV9rZWVwYWxpdmVfdmNoaXFfY2FsbGJhY2ssCisJCS52ZXJzaW9uICAgICA9IEtFRVBBTElWRV9WRVIsCisJCS52ZXJzaW9uX21pbiA9IEtFRVBBTElWRV9WRVJfTUlOCisJfTsKKworCXN0YXR1cyA9IHZjaGlxX2luaXRpYWxpc2UoJmluc3RhbmNlKTsKKwlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpIHsKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJIiVzIHZjaGlxX2luaXRpYWxpc2UgZmFpbGVkICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlzdGF0dXMgPSB2Y2hpcV9jb25uZWN0KGluc3RhbmNlKTsKKwlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpIHsKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJIiVzIHZjaGlxX2Nvbm5lY3QgZmFpbGVkICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisJCWdvdG8gc2h1dGRvd247CisJfQorCisJc3RhdHVzID0gdmNoaXFfYWRkX3NlcnZpY2UoaW5zdGFuY2UsICZwYXJhbXMsICZrYV9oYW5kbGUpOworCWlmIChzdGF0dXMgIT0gVkNISVFfU1VDQ0VTUykgeworCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkiJXMgdmNoaXFfb3Blbl9zZXJ2aWNlIGZhaWxlZCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworCQlnb3RvIHNodXRkb3duOworCX0KKworCXdoaWxlICgxKSB7CisJCWxvbmcgcmMgPSAwLCB1YyA9IDA7CisJCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmFybV9zdGF0ZS0+a2FfZXZ0KQorCQkJCSE9IDApIHsKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCQkiJXMgaW50ZXJydXB0ZWQiLCBfX2Z1bmNfXyk7CisJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiByZWFkIGFuZCBjbGVhciBjb3VudGVycy4gIERvIHJlbGVhc2VfY291bnQgdGhlbiB1c2VfY291bnQgdG8KKwkJICogcHJldmVudCBnZXR0aW5nIG1vcmUgcmVsZWFzZXMgdGhhbiB1c2VzICovCisJCXJjID0gYXRvbWljX3hjaGcoJmFybV9zdGF0ZS0+a2FfcmVsZWFzZV9jb3VudCwgMCk7CisJCXVjID0gYXRvbWljX3hjaGcoJmFybV9zdGF0ZS0+a2FfdXNlX2NvdW50LCAwKTsKKworCQkvKiBDYWxsIHVzZS9yZWxlYXNlIHNlcnZpY2UgdGhlIHJlcXVpc2l0ZSBudW1iZXIgb2YgdGltZXMuCisJCSAqIFByb2Nlc3MgdXNlIGJlZm9yZSByZWxlYXNlIHNvIHVzZSBjb3VudHMgZG9uJ3QgZ28gbmVnYXRpdmUgKi8KKwkJd2hpbGUgKHVjLS0pIHsKKwkJCWF0b21pY19pbmMoJmFybV9zdGF0ZS0+a2FfdXNlX2Fja19jb3VudCk7CisJCQlzdGF0dXMgPSB2Y2hpcV91c2Vfc2VydmljZShrYV9oYW5kbGUpOworCQkJaWYgKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKSB7CisJCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJCQkiJXMgdmNoaXFfdXNlX3NlcnZpY2UgZXJyb3IgJWQiLAorCQkJCQlfX2Z1bmNfXywgc3RhdHVzKTsKKwkJCX0KKwkJfQorCQl3aGlsZSAocmMtLSkgeworCQkJc3RhdHVzID0gdmNoaXFfcmVsZWFzZV9zZXJ2aWNlKGthX2hhbmRsZSk7CisJCQlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpIHsKKwkJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkJCSIlcyB2Y2hpcV9yZWxlYXNlX3NlcnZpY2UgZXJyb3IgJWQiLAorCQkJCQlfX2Z1bmNfXywgc3RhdHVzKTsKKwkJCX0KKwkJfQorCX0KKworc2h1dGRvd246CisJdmNoaXFfc2h1dGRvd24oaW5zdGFuY2UpOworZXhpdDoKKwlyZXR1cm4gMDsKK30KKworCisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9hcm1faW5pdF9zdGF0ZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCisJaWYgKGFybV9zdGF0ZSkgeworCQlyd2xvY2tfaW5pdCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKworCQlpbml0X2NvbXBsZXRpb24oJmFybV9zdGF0ZS0+a2FfZXZ0KTsKKwkJYXRvbWljX3NldCgmYXJtX3N0YXRlLT5rYV91c2VfY291bnQsIDApOworCQlhdG9taWNfc2V0KCZhcm1fc3RhdGUtPmthX3VzZV9hY2tfY291bnQsIDApOworCQlhdG9taWNfc2V0KCZhcm1fc3RhdGUtPmthX3JlbGVhc2VfY291bnQsIDApOworCisJCWluaXRfY29tcGxldGlvbigmYXJtX3N0YXRlLT52Y19zdXNwZW5kX2NvbXBsZXRlKTsKKworCQlpbml0X2NvbXBsZXRpb24oJmFybV9zdGF0ZS0+dmNfcmVzdW1lX2NvbXBsZXRlKTsKKwkJLyogSW5pdGlhbGlzZSB0byAnZG9uZScgc3RhdGUuICBXZSBvbmx5IHdhbnQgdG8gYmxvY2sgb24gcmVzdW1lCisJCSAqIGNvbXBsZXRpb24gd2hpbGUgdmlkZW9jb3JlIGlzIHN1c3BlbmRlZC4gKi8KKwkJc2V0X3Jlc3VtZV9zdGF0ZShhcm1fc3RhdGUsIFZDX1JFU1VNRV9SRVNVTUVEKTsKKworCQlpbml0X2NvbXBsZXRpb24oJmFybV9zdGF0ZS0+cmVzdW1lX2Jsb2NrZXIpOworCQkvKiBJbml0aWFsaXNlIHRvICdkb25lJyBzdGF0ZS4gIFdlIG9ubHkgd2FudCB0byBibG9jayBvbiB0aGlzCisJCSAqIGNvbXBsZXRpb24gd2hpbGUgcmVzdW1lIGlzIGJsb2NrZWQgKi8KKwkJY29tcGxldGVfYWxsKCZhcm1fc3RhdGUtPnJlc3VtZV9ibG9ja2VyKTsKKworCQlpbml0X2NvbXBsZXRpb24oJmFybV9zdGF0ZS0+YmxvY2tlZF9ibG9ja2VyKTsKKwkJLyogSW5pdGlhbGlzZSB0byAnZG9uZScgc3RhdGUuICBXZSBvbmx5IHdhbnQgdG8gYmxvY2sgb24gdGhpcworCQkgKiBjb21wbGV0aW9uIHdoaWxlIHRoaW5ncyBhcmUgd2FpdGluZyBvbiB0aGUgcmVzdW1lIGJsb2NrZXIgKi8KKwkJY29tcGxldGVfYWxsKCZhcm1fc3RhdGUtPmJsb2NrZWRfYmxvY2tlcik7CisKKwkJYXJtX3N0YXRlLT5zdXNwZW5kX3RpbWVyX3RpbWVvdXQgPSBTVVNQRU5EX1RJTUVSX1RJTUVPVVRfTVM7CisJCWFybV9zdGF0ZS0+c3VzcGVuZF90aW1lcl9ydW5uaW5nID0gMDsKKwkJaW5pdF90aW1lcigmYXJtX3N0YXRlLT5zdXNwZW5kX3RpbWVyKTsKKwkJYXJtX3N0YXRlLT5zdXNwZW5kX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykoc3RhdGUpOworCQlhcm1fc3RhdGUtPnN1c3BlbmRfdGltZXIuZnVuY3Rpb24gPSBzdXNwZW5kX3RpbWVyX2NhbGxiYWNrOworCisJCWFybV9zdGF0ZS0+Zmlyc3RfY29ubmVjdCA9IDA7CisKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyoqIEZ1bmN0aW9ucyB0byBtb2RpZnkgdGhlIHN0YXRlIHZhcmlhYmxlczsKKyoqCXNldF9zdXNwZW5kX3N0YXRlCisqKglzZXRfcmVzdW1lX3N0YXRlCisqKgorKiogVGhlcmUgYXJlIG1vcmUgc3RhdGUgdmFyaWFibGVzIHRoYW4gd2UgbWlnaHQgbGlrZSwgc28gZW5zdXJlIHRoZXkgcmVtYWluIGluCisqKiBzdGVwLiAgU3VzcGVuZCBhbmQgcmVzdW1lIHN0YXRlIGFyZSBtYWludGFpbmVkIHNlcGFyYXRlbHksIHNpbmNlIG1vc3Qgb2YKKyoqIHRoZXNlIHN0YXRlIG1hY2hpbmVzIGNhbiBvcGVyYXRlIGluZGVwZW5kZW50bHkuICBIb3dldmVyLCB0aGVyZSBhcmUgYSBmZXcKKyoqIHN0YXRlcyB3aGVyZSBzdGF0ZSB0cmFuc2l0aW9ucyBpbiBvbmUgc3RhdGUgbWFjaGluZSBjYXVzZSBhIHJlc2V0IHRvIHRoZQorKiogb3RoZXIgc3RhdGUgbWFjaGluZS4gIEluIGFkZGl0aW9uLCB0aGVyZSBhcmUgc29tZSBjb21wbGV0aW9uIGV2ZW50cyB3aGljaAorKiogbmVlZCB0byBvY2N1ciBvbiBzdGF0ZSBtYWNoaW5lIHJlc2V0IGFuZCBlbmQtc3RhdGUocyksIHNvIHRoZXNlIGFyZSBhbHNvCisqKiBkZWFsdCB3aXRoIGluIHRoZXNlIGZ1bmN0aW9ucy4KKyoqCisqKiBJbiBhbGwgc3RhdGVzIHdlIHNldCB0aGUgc3RhdGUgdmFyaWFibGUgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCwgYnV0IGluIHNvbWUKKyoqIGNhc2VzIHdlIHBlcmZvcm0gYWRkaXRpb25hbCBzdGVwcyBvdXRsaW5lZCBiZWxvdzsKKyoqCisqKiBWQ19TVVNQRU5EX0lETEUgLSBJbml0aWFsaXNlIHRoZSBzdXNwZW5kIGNvbXBsZXRpb24gYXQgdGhlIHNhbWUgdGltZS4KKyoqCQkJVGhlIHN1c3BlbmQgY29tcGxldGlvbiBpcyBjb21wbGV0ZWQgYWZ0ZXIgYW55IHN1c3BlbmQKKyoqCQkJYXR0ZW1wdC4gIFdoZW4gd2UgcmVzZXQgdGhlIHN0YXRlIG1hY2hpbmUgd2UgYWxzbyByZXNldAorKioJCQl0aGUgY29tcGxldGlvbi4gIFRoaXMgcmVzZXQgb2NjdXJzIHdoZW4gdmlkZW9jb3JlIGlzCisqKgkJCXJlc3VtZWQsIGFuZCBhbHNvIGlmIHdlIGluaXRpYXRlIHN1c3BlbmQgYWZ0ZXIgYSBzdXNwZW5kCisqKgkJCWZhaWx1cmUuCisqKgorKiogVkNfU1VTUEVORF9JTl9QUk9HUkVTUyAtIFRoaXMgc3RhdGUgaXMgY29uc2lkZXJlZCB0aGUgcG9pbnQgb2Ygbm8gcmV0dXJuIGZvcgorKioJCQlzdXNwZW5kIC0gaWUgZnJvbSB0aGlzIHBvaW50IG9uIHdlIG11c3QgdHJ5IHRvIHN1c3BlbmQKKyoqCQkJYmVmb3JlIHJlc3VtaW5nIGNhbiBvY2N1ci4gIFdlIHRoZXJlZm9yZSBhbHNvIHJlc2V0IHRoZQorKioJCQlyZXN1bWUgc3RhdGUgbWFjaGluZSB0byBWQ19SRVNVTUVfSURMRSBpbiB0aGlzIHN0YXRlLgorKioKKyoqIFZDX1NVU1BFTkRfU1VTUEVOREVEIC0gU3VzcGVuZCBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4gQWxzbyBjYWxsCisqKgkJCWNvbXBsZXRlX2FsbCBvbiB0aGUgc3VzcGVuZCBjb21wbGV0aW9uIHRvIG5vdGlmeQorKioJCQlhbnl0aGluZyB3YWl0aW5nIGZvciBzdXNwZW5kIHRvIGhhcHBlbi4KKyoqCisqKiBWQ19TVVNQRU5EX1JFSkVDVEVEIC0gVmlkZW9jb3JlIHJlamVjdGVkIHN1c3BlbmQuIFZpZGVvY29yZSB3aWxsIGFsc28KKyoqCQkJaW5pdGlhdGUgcmVzdW1lLCBzbyBubyBuZWVkIHRvIGFsdGVyIHJlc3VtZSBzdGF0ZS4KKyoqCQkJV2UgY2FsbCBjb21wbGV0ZV9hbGwgb24gdGhlIHN1c3BlbmQgY29tcGxldGlvbiB0byBub3RpZnkKKyoqCQkJb2Ygc3VzcGVuZCByZWplY3Rpb24uCisqKgorKiogVkNfU1VTUEVORF9GQUlMRUQgLSBXZSBmYWlsZWQgdG8gaW5pdGlhdGUgdmlkZW9jb3JlIHN1c3BlbmQuICBXZSBub3RpZnkgdGhlCisqKgkJCXN1c3BlbmQgY29tcGxldGlvbiBhbmQgcmVzZXQgdGhlIHJlc3VtZSBzdGF0ZSBtYWNoaW5lLgorKioKKyoqIFZDX1JFU1VNRV9JRExFIC0gSW5pdGlhbGlzZSB0aGUgcmVzdW1lIGNvbXBsZXRpb24gYXQgdGhlIHNhbWUgdGltZS4gIFRoZQorKioJCQlyZXN1bWUgY29tcGxldGlvbiBpcyBpbiBpdCdzICdkb25lJyBzdGF0ZSB3aGVuZXZlcgorKioJCQl2aWRlY29yZSBpcyBydW5uaW5nLiAgVGhlcmZvcmUsIHRoZSBWQ19SRVNVTUVfSURMRSBzdGF0ZQorKioJCQlpbXBsaWVzIHRoYXQgdmlkZW9jb3JlIGlzIHN1c3BlbmRlZC4KKyoqCQkJSGVuY2UsIGFueSB0aHJlYWQgd2hpY2ggbmVlZHMgdG8gd2FpdCB1bnRpbCB2aWRlb2NvcmUgaXMKKyoqCQkJcnVubmluZyBjYW4gd2FpdCBvbiB0aGlzIGNvbXBsZXRpb24gLSBpdCB3aWxsIG9ubHkgYmxvY2sKKyoqCQkJaWYgdmlkZW9jb3JlIGlzIHN1c3BlbmRlZC4KKyoqCisqKiBWQ19SRVNVTUVfUkVTVU1FRCAtIFJlc3VtZSBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4gIFZpZGVvY29yZSBpcyBydW5uaW5nLgorKioJCQlDYWxsIGNvbXBsZXRlX2FsbCBvbiB0aGUgcmVzdW1lIGNvbXBsZXRpb24gdG8gdW5ibG9jaworKioJCQlhbnkgdGhyZWFkcyB3YWl0aW5nIGZvciByZXN1bWUuCSBBbHNvIHJlc2V0IHRoZSBzdXNwZW5kCisqKgkJCXN0YXRlIG1hY2hpbmUgdG8gaXQncyBpZGxlIHN0YXRlLgorKioKKyoqIFZDX1JFU1VNRV9GQUlMRUQgLSBDdXJyZW50bHkgdW51c2VkIC0gbm8gbWVjaGFuaXNtIHRvIGZhaWwgcmVzdW1lIGV4aXN0cy4KKyovCisKK3ZvaWQKK3NldF9zdXNwZW5kX3N0YXRlKFZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUsCisJZW51bSB2Y19zdXNwZW5kX3N0YXR1cyBuZXdfc3RhdGUpCit7CisJLyogc2V0IHRoZSBzdGF0ZSBpbiBhbGwgY2FzZXMgKi8KKwlhcm1fc3RhdGUtPnZjX3N1c3BlbmRfc3RhdGUgPSBuZXdfc3RhdGU7CisKKwkvKiBzdGF0ZSBzcGVjaWZpYyBhZGRpdGlvbmFsIGFjdGlvbnMgKi8KKwlzd2l0Y2ggKG5ld19zdGF0ZSkgeworCWNhc2UgVkNfU1VTUEVORF9GT1JDRV9DQU5DRUxFRDoKKwkJY29tcGxldGVfYWxsKCZhcm1fc3RhdGUtPnZjX3N1c3BlbmRfY29tcGxldGUpOworCQlicmVhazsKKwljYXNlIFZDX1NVU1BFTkRfUkVKRUNURUQ6CisJCWNvbXBsZXRlX2FsbCgmYXJtX3N0YXRlLT52Y19zdXNwZW5kX2NvbXBsZXRlKTsKKwkJYnJlYWs7CisJY2FzZSBWQ19TVVNQRU5EX0ZBSUxFRDoKKwkJY29tcGxldGVfYWxsKCZhcm1fc3RhdGUtPnZjX3N1c3BlbmRfY29tcGxldGUpOworCQlhcm1fc3RhdGUtPnZjX3Jlc3VtZV9zdGF0ZSA9IFZDX1JFU1VNRV9SRVNVTUVEOworCQljb21wbGV0ZV9hbGwoJmFybV9zdGF0ZS0+dmNfcmVzdW1lX2NvbXBsZXRlKTsKKwkJYnJlYWs7CisJY2FzZSBWQ19TVVNQRU5EX0lETEU6CisJCXJlaW5pdF9jb21wbGV0aW9uKCZhcm1fc3RhdGUtPnZjX3N1c3BlbmRfY29tcGxldGUpOworCQlicmVhazsKKwljYXNlIFZDX1NVU1BFTkRfUkVRVUVTVEVEOgorCQlicmVhazsKKwljYXNlIFZDX1NVU1BFTkRfSU5fUFJPR1JFU1M6CisJCXNldF9yZXN1bWVfc3RhdGUoYXJtX3N0YXRlLCBWQ19SRVNVTUVfSURMRSk7CisJCWJyZWFrOworCWNhc2UgVkNfU1VTUEVORF9TVVNQRU5ERUQ6CisJCWNvbXBsZXRlX2FsbCgmYXJtX3N0YXRlLT52Y19zdXNwZW5kX2NvbXBsZXRlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KK30KKwordm9pZAorc2V0X3Jlc3VtZV9zdGF0ZShWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlLAorCWVudW0gdmNfcmVzdW1lX3N0YXR1cyBuZXdfc3RhdGUpCit7CisJLyogc2V0IHRoZSBzdGF0ZSBpbiBhbGwgY2FzZXMgKi8KKwlhcm1fc3RhdGUtPnZjX3Jlc3VtZV9zdGF0ZSA9IG5ld19zdGF0ZTsKKworCS8qIHN0YXRlIHNwZWNpZmljIGFkZGl0aW9uYWwgYWN0aW9ucyAqLworCXN3aXRjaCAobmV3X3N0YXRlKSB7CisJY2FzZSBWQ19SRVNVTUVfRkFJTEVEOgorCQlicmVhazsKKwljYXNlIFZDX1JFU1VNRV9JRExFOgorCQlyZWluaXRfY29tcGxldGlvbigmYXJtX3N0YXRlLT52Y19yZXN1bWVfY29tcGxldGUpOworCQlicmVhazsKKwljYXNlIFZDX1JFU1VNRV9SRVFVRVNURUQ6CisJCWJyZWFrOworCWNhc2UgVkNfUkVTVU1FX0lOX1BST0dSRVNTOgorCQlicmVhazsKKwljYXNlIFZDX1JFU1VNRV9SRVNVTUVEOgorCQljb21wbGV0ZV9hbGwoJmFybV9zdGF0ZS0+dmNfcmVzdW1lX2NvbXBsZXRlKTsKKwkJc2V0X3N1c3BlbmRfc3RhdGUoYXJtX3N0YXRlLCBWQ19TVVNQRU5EX0lETEUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorfQorCisKKy8qIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgd3JpdGUgbG9jayBoZWxkICovCitpbmxpbmUgdm9pZAorc3RhcnRfc3VzcGVuZF90aW1lcihWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlKQoreworCWRlbF90aW1lcigmYXJtX3N0YXRlLT5zdXNwZW5kX3RpbWVyKTsKKwlhcm1fc3RhdGUtPnN1c3BlbmRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKworCQltc2Vjc190b19qaWZmaWVzKGFybV9zdGF0ZS0+CisJCQlzdXNwZW5kX3RpbWVyX3RpbWVvdXQpOworCWFkZF90aW1lcigmYXJtX3N0YXRlLT5zdXNwZW5kX3RpbWVyKTsKKwlhcm1fc3RhdGUtPnN1c3BlbmRfdGltZXJfcnVubmluZyA9IDE7Cit9CisKKy8qIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgd3JpdGUgbG9jayBoZWxkICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3N0b3Bfc3VzcGVuZF90aW1lcihWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlKQoreworCWlmIChhcm1fc3RhdGUtPnN1c3BlbmRfdGltZXJfcnVubmluZykgeworCQlkZWxfdGltZXIoJmFybV9zdGF0ZS0+c3VzcGVuZF90aW1lcik7CisJCWFybV9zdGF0ZS0+c3VzcGVuZF90aW1lcl9ydW5uaW5nID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZWVkX3Jlc3VtZShWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisJcmV0dXJuIChhcm1fc3RhdGUtPnZjX3N1c3BlbmRfc3RhdGUgPiBWQ19TVVNQRU5EX0lETEUpICYmCisJCQkoYXJtX3N0YXRlLT52Y19yZXN1bWVfc3RhdGUgPCBWQ19SRVNVTUVfUkVRVUVTVEVEKSAmJgorCQkJdmNoaXFfdmlkZW9jb3JlX3dhbnRlZChzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2Jsb2NrX3Jlc3VtZShWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlKQoreworCWludCBzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgdGltZW91dF92YWwgPQorCQkJCW1zZWNzX3RvX2ppZmZpZXMoRk9SQ0VfU1VTUEVORF9USU1FT1VUX01TKTsKKwlpbnQgcmVzdW1lX2NvdW50ID0gMDsKKworCS8qIEFsbG93IGFueSB0aHJlYWRzIHdoaWNoIHdlcmUgYmxvY2tlZCBieSB0aGUgbGFzdCBmb3JjZSBzdXNwZW5kIHRvCisJICogY29tcGxldGUgaWYgdGhleSBoYXZlbid0IGFscmVhZHkuICBPbmx5IGdpdmUgdGhpcyBvbmUgc2hvdDsgaWYKKwkgKiBibG9ja2VkX2NvdW50IGlzIGluY3JlbWVudGVkIGFmdGVyIGJsb2NrZWRfYmxvY2tlciBpcyBjb21wbGV0ZWQKKwkgKiAod2hpY2ggb25seSBoYXBwZW5zIHdoZW4gYmxvY2tlZF9jb3VudCBoaXRzIDApIHRoZW4gdGhvc2UgdGhyZWFkcworCSAqIHdpbGwgaGF2ZSB0byB3YWl0IHVudGlsIG5leHQgdGltZSBhcm91bmQgKi8KKwlpZiAoYXJtX3N0YXRlLT5ibG9ja2VkX2NvdW50KSB7CisJCXJlaW5pdF9jb21wbGV0aW9uKCZhcm1fc3RhdGUtPmJsb2NrZWRfYmxvY2tlcik7CisJCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyB3YWl0IGZvciBwcmV2aW91c2x5ICIKKwkJCSJibG9ja2VkIGNsaWVudHMiLCBfX2Z1bmNfXyk7CisJCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKwkJCQkmYXJtX3N0YXRlLT5ibG9ja2VkX2Jsb2NrZXIsIHRpbWVvdXRfdmFsKQorCQkJCQk8PSAwKSB7CisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyB3YWl0IGZvciAiCisJCQkJInByZXZpb3VzbHkgYmxvY2tlZCBjbGllbnRzIGZhaWxlZCIgLCBfX2Z1bmNfXyk7CisJCQlzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKwkJCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJCQlnb3RvIG91dDsKKwkJfQorCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIHByZXZpb3VzbHkgYmxvY2tlZCAiCisJCQkiY2xpZW50cyByZXN1bWVkIiwgX19mdW5jX18pOworCQl3cml0ZV9sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCX0KKworCS8qIFdlIG5lZWQgdG8gd2FpdCBmb3IgcmVzdW1lIHRvIGNvbXBsZXRlIGlmIGl0J3MgaW4gcHJvY2VzcyAqLworCXdoaWxlIChhcm1fc3RhdGUtPnZjX3Jlc3VtZV9zdGF0ZSAhPSBWQ19SRVNVTUVfUkVTVU1FRCAmJgorCQkJYXJtX3N0YXRlLT52Y19yZXN1bWVfc3RhdGUgPiBWQ19SRVNVTUVfSURMRSkgeworCQlpZiAocmVzdW1lX2NvdW50ID4gMSkgeworCQkJc3RhdHVzID0gVkNISVFfRVJST1I7CisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyB3YWl0ZWQgdG9vICIKKwkJCQkibWFueSB0aW1lcyBmb3IgcmVzdW1lIiAsIF9fZnVuY19fKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyB3YWl0IGZvciByZXN1bWUiLAorCQkJX19mdW5jX18pOworCQlpZiAod2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisJCQkJJmFybV9zdGF0ZS0+dmNfcmVzdW1lX2NvbXBsZXRlLCB0aW1lb3V0X3ZhbCkKKwkJCQkJPD0gMCkgeworCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgd2FpdCBmb3IgIgorCQkJCSJyZXN1bWUgZmFpbGVkICglcykiLCBfX2Z1bmNfXywKKwkJCQlyZXN1bWVfc3RhdGVfbmFtZXNbYXJtX3N0YXRlLT52Y19yZXN1bWVfc3RhdGUgKworCQkJCQkJCVZDX1JFU1VNRV9OVU1fT0ZGU0VUXSk7CisJCQlzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKwkJCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJCQlnb3RvIG91dDsKKwkJfQorCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIHJlc3VtZWQiLCBfX2Z1bmNfXyk7CisJCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJCXJlc3VtZV9jb3VudCsrOworCX0KKwlyZWluaXRfY29tcGxldGlvbigmYXJtX3N0YXRlLT5yZXN1bWVfYmxvY2tlcik7CisJYXJtX3N0YXRlLT5yZXN1bWVfYmxvY2tlZCA9IDE7CisKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3VuYmxvY2tfcmVzdW1lKFZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUpCit7CisJY29tcGxldGVfYWxsKCZhcm1fc3RhdGUtPnJlc3VtZV9ibG9ja2VyKTsKKwlhcm1fc3RhdGUtPnJlc3VtZV9ibG9ja2VkID0gMDsKK30KKworLyogSW5pdGlhdGUgc3VzcGVuZCB2aWEgc2xvdCBoYW5kbGVyLiBTaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIHdyaXRlIGxvY2sKKyAqIGhlbGQgKi8KK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9hcm1fdmNzdXNwZW5kKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX0VSUk9SOworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKworCWlmICghYXJtX3N0YXRlKQorCQlnb3RvIG91dDsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIiwgX19mdW5jX18pOworCXN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisKKworCXN3aXRjaCAoYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlKSB7CisJY2FzZSBWQ19TVVNQRU5EX1JFUVVFU1RFRDoKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlczogc3VzcGVuZCBhbHJlYWR5ICIKKwkJCSJyZXF1ZXN0ZWQiLCBfX2Z1bmNfXyk7CisJCWJyZWFrOworCWNhc2UgVkNfU1VTUEVORF9JTl9QUk9HUkVTUzoKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlczogc3VzcGVuZCBhbHJlYWR5IGluICIKKwkJCSJwcm9ncmVzcyIsIF9fZnVuY19fKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBXZSBkb24ndCBleHBlY3QgdG8gYmUgaW4gb3RoZXIgc3RhdGVzLCBzbyBsb2cgYnV0IGNvbnRpbnVlCisJCSAqIGFueXdheSAqLworCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkiJXMgdW5leHBlY3RlZCBzdXNwZW5kIHN0YXRlICVzIiwgX19mdW5jX18sCisJCQlzdXNwZW5kX3N0YXRlX25hbWVzW2FybV9zdGF0ZS0+dmNfc3VzcGVuZF9zdGF0ZSArCisJCQkJCQlWQ19TVVNQRU5EX05VTV9PRkZTRVRdKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBWQ19TVVNQRU5EX1JFSkVDVEVEOgorCWNhc2UgVkNfU1VTUEVORF9GQUlMRUQ6CisJCS8qIEVuc3VyZSBhbnkgaWRsZSBzdGF0ZSBhY3Rpb25zIGhhdmUgYmVlbiBydW4gKi8KKwkJc2V0X3N1c3BlbmRfc3RhdGUoYXJtX3N0YXRlLCBWQ19TVVNQRU5EX0lETEUpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFZDX1NVU1BFTkRfSURMRToKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkiJXM6IHN1c3BlbmRpbmciLCBfX2Z1bmNfXyk7CisJCXNldF9zdXNwZW5kX3N0YXRlKGFybV9zdGF0ZSwgVkNfU1VTUEVORF9SRVFVRVNURUQpOworCQkvKiBraWNrIHRoZSBzbG90IGhhbmRsZXIgdGhyZWFkIHRvIGluaXRpYXRlIHN1c3BlbmQgKi8KKwkJcmVxdWVzdF9wb2xsKHN0YXRlLCBOVUxMLCAwKTsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgZXhpdCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQKK3ZjaGlxX3BsYXRmb3JtX2NoZWNrX3N1c3BlbmQoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCWludCBzdXNwID0gMDsKKworCWlmICghYXJtX3N0YXRlKQorCQlnb3RvIG91dDsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIiwgX19mdW5jX18pOworCisJd3JpdGVfbG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwlpZiAoYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlID09IFZDX1NVU1BFTkRfUkVRVUVTVEVEICYmCisJCQlhcm1fc3RhdGUtPnZjX3Jlc3VtZV9zdGF0ZSA9PSBWQ19SRVNVTUVfUkVTVU1FRCkgeworCQlzZXRfc3VzcGVuZF9zdGF0ZShhcm1fc3RhdGUsIFZDX1NVU1BFTkRfSU5fUFJPR1JFU1MpOworCQlzdXNwID0gMTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCisJaWYgKHN1c3ApCisJCXZjaGlxX3BsYXRmb3JtX3N1c3BlbmQoc3RhdGUpOworCitvdXQ6CisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgZXhpdCIsIF9fZnVuY19fKTsKKwlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQKK291dHB1dF90aW1lb3V0X2Vycm9yKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKwljaGFyIHNlcnZpY2VfZXJyWzUwXSA9ICIiOworCWludCB2Y191c2VfY291bnQgPSBhcm1fc3RhdGUtPnZpZGVvY29yZV91c2VfY291bnQ7CisJaW50IGFjdGl2ZV9zZXJ2aWNlcyA9IHN0YXRlLT51bnVzZWRfc2VydmljZTsKKwlpbnQgaTsKKworCWlmICghYXJtX3N0YXRlLT52aWRlb2NvcmVfdXNlX2NvdW50KSB7CisJCXNucHJpbnRmKHNlcnZpY2VfZXJyLCA1MCwgIiBWaWRlb2NvcmUgdXNlY291bnQgaXMgMCIpOworCQlnb3RvIG91dHB1dF9tc2c7CisJfQorCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfc2VydmljZXM7IGkrKykgeworCQlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2VfcHRyID0gc3RhdGUtPnNlcnZpY2VzW2ldOworCQlpZiAoc2VydmljZV9wdHIgJiYgc2VydmljZV9wdHItPnNlcnZpY2VfdXNlX2NvdW50ICYmCisJCQkoc2VydmljZV9wdHItPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX0ZSRUUpKSB7CisJCQlzbnByaW50ZihzZXJ2aWNlX2VyciwgNTAsICIgJWMlYyVjJWMoJWQpIHNlcnZpY2UgaGFzICIKKwkJCQkidXNlIGNvdW50ICVkJXMiLCBWQ0hJUV9GT1VSQ0NfQVNfNENIQVJTKAorCQkJCQlzZXJ2aWNlX3B0ci0+YmFzZS5mb3VyY2MpLAorCQkJCSBzZXJ2aWNlX3B0ci0+Y2xpZW50X2lkLAorCQkJCSBzZXJ2aWNlX3B0ci0+c2VydmljZV91c2VfY291bnQsCisJCQkJIHNlcnZpY2VfcHRyLT5zZXJ2aWNlX3VzZV9jb3VudCA9PQorCQkJCQkgdmNfdXNlX2NvdW50ID8gIiIgOiAiICgrIG1vcmUpIik7CisJCQlicmVhazsKKwkJfQorCX0KKworb3V0cHV0X21zZzoKKwl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCSJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgdmMgc3VzcGVuZCAoJWQpLiVzIiwKKwkJIGFybV9zdGF0ZS0+YXV0b3N1c3BlbmRfb3ZlcnJpZGUsIHNlcnZpY2VfZXJyKTsKKworfQorCisvKiBUcnkgdG8gZ2V0IHZpZGVvY29yZSBpbnRvIHN1c3BlbmRlZCBzdGF0ZSwgcmVnYXJkbGVzcyBvZiBhdXRvc3VzcGVuZCBzdGF0ZS4KKyoqIFdlIGRvbid0IGFjdHVhbGx5IGZvcmNlIHN1c3BlbmQsIHNpbmNlIHZpZGVvY29yZSBtYXkgZ2V0IGludG8gYSBiYWQgc3RhdGUKKyoqIGlmIHdlIGZvcmNlIHN1c3BlbmQgYXQgYSBiYWQgdGltZS4gIEluc3RlYWQsIHdlIHdhaXQgZm9yIGF1dG9zdXNwZW5kIHRvCisqKiBkZXRlcm1pbmUgYSBnb29kIHBvaW50IHRvIHN1c3BlbmQuICBJZiB0aGlzIGRvZXNuJ3QgaGFwcGVuIHdpdGhpbiAxMDBtcyB3ZQorKiogcmVwb3J0IGZhaWx1cmUuCisqKgorKiogUmV0dXJucyBWQ0hJUV9TVUNDRVNTIGlmIHZpZGVvY29yZSBzdXNwZW5kZWQgc3VjY2Vzc2Z1bGx5LCBWQ0hJUV9SRVRSWSBpZgorKiogdmlkZW9jb3JlIGZhaWxlZCB0byBzdXNwZW5kIGluIHRpbWUgb3IgVkNISVFfRVJST1IgaWYgaW50ZXJydXB0ZWQuCisqLworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2FybV9mb3JjZV9zdXNwZW5kKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKwlsb25nIHJjID0gMDsKKwlpbnQgcmVwZWF0ID0gLTE7CisKKwlpZiAoIWFybV9zdGF0ZSkKKwkJZ290byBvdXQ7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyIsIF9fZnVuY19fKTsKKworCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisKKwlzdGF0dXMgPSBibG9ja19yZXN1bWUoYXJtX3N0YXRlKTsKKwlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpCisJCWdvdG8gdW5sb2NrOworCWlmIChhcm1fc3RhdGUtPnZjX3N1c3BlbmRfc3RhdGUgPT0gVkNfU1VTUEVORF9TVVNQRU5ERUQpIHsKKwkJLyogQWxyZWFkeSBzdXNwZW5kZWQgLSBqdXN0IGJsb2NrIHJlc3VtZSBhbmQgZXhpdCAqLworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIGFscmVhZHkgc3VzcGVuZGVkIiwKKwkJCV9fZnVuY19fKTsKKwkJc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKwkJZ290byB1bmxvY2s7CisJfSBlbHNlIGlmIChhcm1fc3RhdGUtPnZjX3N1c3BlbmRfc3RhdGUgPD0gVkNfU1VTUEVORF9JRExFKSB7CisJCS8qIGluaXRpYXRlIHN1c3BlbmQgaW1tZWRpYXRlbHkgaW4gdGhlIGNhc2UgdGhhdCB3ZSdyZSB3YWl0aW5nCisJCSAqIGZvciB0aGUgdGltZW91dCAqLworCQlzdG9wX3N1c3BlbmRfdGltZXIoYXJtX3N0YXRlKTsKKwkJaWYgKCF2Y2hpcV92aWRlb2NvcmVfd2FudGVkKHN0YXRlKSkgeworCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyB2aWRlb2NvcmUgIgorCQkJCSJpZGxlLCBpbml0aWF0aW5nIHN1c3BlbmQiLCBfX2Z1bmNfXyk7CisJCQlzdGF0dXMgPSB2Y2hpcV9hcm1fdmNzdXNwZW5kKHN0YXRlKTsKKwkJfSBlbHNlIGlmIChhcm1fc3RhdGUtPmF1dG9zdXNwZW5kX292ZXJyaWRlIDwKKwkJCQkJCUZPUkNFX1NVU1BFTkRfRkFJTF9NQVgpIHsKKwkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgbGV0dGluZyAiCisJCQkJInZpZGVvY29yZSBnbyBpZGxlIiwgX19mdW5jX18pOworCQkJc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCXZjaGlxX2xvZ193YXJuaW5nKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgZmFpbGVkIHRvbyAiCisJCQkJIm1hbnkgdGltZXMgLSBhdHRlbXB0aW5nIHN1c3BlbmQiLCBfX2Z1bmNfXyk7CisJCQlzdGF0dXMgPSB2Y2hpcV9hcm1fdmNzdXNwZW5kKHN0YXRlKTsKKwkJfQorCX0gZWxzZSB7CisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgdmlkZW9jb3JlIHN1c3BlbmQgIgorCQkJImluIHByb2dyZXNzIC0gd2FpdCBmb3IgY29tcGxldGlvbiIsIF9fZnVuY19fKTsKKwkJc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKwl9CisKKwkvKiBXYWl0IGZvciBzdXNwZW5kIHRvIGhhcHBlbiBkdWUgdG8gc3lzdGVtIGlkbGUgKG5vdCBmb3JjZWQuLikgKi8KKwlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpCisJCWdvdG8gdW5ibG9ja19yZXN1bWU7CisKKwlkbyB7CisJCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKworCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQkJCSZhcm1fc3RhdGUtPnZjX3N1c3BlbmRfY29tcGxldGUsCisJCQkJbXNlY3NfdG9famlmZmllcyhGT1JDRV9TVVNQRU5EX1RJTUVPVVRfTVMpKTsKKworCQl3cml0ZV9sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCQlpZiAocmMgPCAwKSB7CisJCQl2Y2hpcV9sb2dfd2FybmluZyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzICIKKwkJCQkiaW50ZXJydXB0ZWQgd2FpdGluZyBmb3Igc3VzcGVuZCIsIF9fZnVuY19fKTsKKwkJCXN0YXR1cyA9IFZDSElRX0VSUk9SOworCQkJZ290byB1bmJsb2NrX3Jlc3VtZTsKKwkJfSBlbHNlIGlmIChyYyA9PSAwKSB7CisJCQlpZiAoYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlID4gVkNfU1VTUEVORF9JRExFKSB7CisJCQkJLyogUmVwZWF0IHRpbWVvdXQgb25jZSBpZiBpbiBwcm9ncmVzcyAqLworCQkJCWlmIChyZXBlYXQgPCAwKSB7CisJCQkJCXJlcGVhdCA9IDE7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCWFybV9zdGF0ZS0+YXV0b3N1c3BlbmRfb3ZlcnJpZGUrKzsKKwkJCW91dHB1dF90aW1lb3V0X2Vycm9yKHN0YXRlKTsKKworCQkJc3RhdHVzID0gVkNISVFfUkVUUlk7CisJCQlnb3RvIHVuYmxvY2tfcmVzdW1lOworCQl9CisJfSB3aGlsZSAoMCA8IChyZXBlYXQtLSkpOworCisJLyogQ2hlY2sgYW5kIHJlcG9ydCBzdGF0ZSBpbiBjYXNlIHdlIG5lZWQgdG8gYWJvcnQgQVJNIHN1c3BlbmQgKi8KKwlpZiAoYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlICE9IFZDX1NVU1BFTkRfU1VTUEVOREVEKSB7CisJCXN0YXR1cyA9IFZDSElRX1JFVFJZOworCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkiJXMgdmlkZW9jb3JlIHN1c3BlbmQgZmFpbGVkIChzdGF0ZSAlcykiLCBfX2Z1bmNfXywKKwkJCXN1c3BlbmRfc3RhdGVfbmFtZXNbYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlICsKKwkJCQkJCVZDX1NVU1BFTkRfTlVNX09GRlNFVF0pOworCQkvKiBSZXNldCB0aGUgc3RhdGUgb25seSBpZiBpdCdzIHN0aWxsIGluIGFuIGVycm9yIHN0YXRlLgorCQkgKiBTb21ldGhpbmcgY291bGQgaGF2ZSBhbHJlYWR5IGluaXRpYXRlZCBhbm90aGVyIHN1c3BlbmQuICovCisJCWlmIChhcm1fc3RhdGUtPnZjX3N1c3BlbmRfc3RhdGUgPCBWQ19TVVNQRU5EX0lETEUpCisJCQlzZXRfc3VzcGVuZF9zdGF0ZShhcm1fc3RhdGUsIFZDX1NVU1BFTkRfSURMRSk7CisKKwkJZ290byB1bmJsb2NrX3Jlc3VtZTsKKwl9CisKKwkvKiBzdWNjZXNzZnVsbHkgc3VzcGVuZGVkIC0gdW5sb2NrIGFuZCBleGl0ICovCisJZ290byB1bmxvY2s7CisKK3VuYmxvY2tfcmVzdW1lOgorCS8qIGFsbCBlcnJvciBzdGF0ZXMgbmVlZCB0byB1bmJsb2NrIHJlc3VtZSBiZWZvcmUgZXhpdCAqLworCXVuYmxvY2tfcmVzdW1lKGFybV9zdGF0ZSk7CisKK3VubG9jazoKKwl3cml0ZV91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisKK291dDoKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyBleGl0ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKwordm9pZAordmNoaXFfY2hlY2tfc3VzcGVuZChWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisKKwlpZiAoIWFybV9zdGF0ZSkKKwkJZ290byBvdXQ7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyIsIF9fZnVuY19fKTsKKworCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJaWYgKGFybV9zdGF0ZS0+dmNfc3VzcGVuZF9zdGF0ZSAhPSBWQ19TVVNQRU5EX1NVU1BFTkRFRCAmJgorCQkJYXJtX3N0YXRlLT5maXJzdF9jb25uZWN0ICYmCisJCQkhdmNoaXFfdmlkZW9jb3JlX3dhbnRlZChzdGF0ZSkpIHsKKwkJdmNoaXFfYXJtX3Zjc3VzcGVuZChzdGF0ZSk7CisJfQorCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKworb3V0OgorCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIGV4aXQiLCBfX2Z1bmNfXyk7CisJcmV0dXJuOworfQorCisKK2ludAordmNoaXFfYXJtX2FsbG93X3Jlc3VtZShWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisJaW50IHJlc3VtZSA9IDA7CisJaW50IHJldCA9IC0xOworCisJaWYgKCFhcm1fc3RhdGUpCisJCWdvdG8gb3V0OworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMiLCBfX2Z1bmNfXyk7CisKKwl3cml0ZV9sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCXVuYmxvY2tfcmVzdW1lKGFybV9zdGF0ZSk7CisJcmVzdW1lID0gdmNoaXFfY2hlY2tfcmVzdW1lKHN0YXRlKTsKKwl3cml0ZV91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisKKwlpZiAocmVzdW1lKSB7CisJCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoCisJCQkmYXJtX3N0YXRlLT52Y19yZXN1bWVfY29tcGxldGUpIDwgMCkgeworCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJCSIlcyBpbnRlcnJ1cHRlZCIsIF9fZnVuY19fKTsKKwkJCS8qIGZhaWxlZCwgY2Fubm90IGFjY3VyYXRlbHkgZGVyaXZlIHN1c3BlbmQKKwkJCSAqIHN0YXRlLCBzbyBleGl0IGVhcmx5LiAqLworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlyZWFkX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJaWYgKGFybV9zdGF0ZS0+dmNfc3VzcGVuZF9zdGF0ZSA9PSBWQ19TVVNQRU5EX1NVU1BFTkRFRCkgeworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCQkiJXM6IFZpZGVvY29yZSByZW1haW5zIHN1c3BlbmRlZCIsIF9fZnVuY19fKTsKKwl9IGVsc2UgeworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCQkiJXM6IFZpZGVvY29yZSByZXN1bWVkIiwgX19mdW5jX18pOworCQlyZXQgPSAwOworCX0KKwlyZWFkX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKK291dDoKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyBleGl0ICVkIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIHdyaXRlIGxvY2sgaGVsZCAqLworaW50Cit2Y2hpcV9jaGVja19yZXN1bWUoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCWludCByZXN1bWUgPSAwOworCisJaWYgKCFhcm1fc3RhdGUpCisJCWdvdG8gb3V0OworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMiLCBfX2Z1bmNfXyk7CisKKwlpZiAobmVlZF9yZXN1bWUoc3RhdGUpKSB7CisJCXNldF9yZXN1bWVfc3RhdGUoYXJtX3N0YXRlLCBWQ19SRVNVTUVfUkVRVUVTVEVEKTsKKwkJcmVxdWVzdF9wb2xsKHN0YXRlLCBOVUxMLCAwKTsKKwkJcmVzdW1lID0gMTsKKwl9CisKK291dDoKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyBleGl0IiwgX19mdW5jX18pOworCXJldHVybiByZXN1bWU7Cit9CisKK3ZvaWQKK3ZjaGlxX3BsYXRmb3JtX2NoZWNrX3Jlc3VtZShWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisJaW50IHJlcyA9IDA7CisKKwlpZiAoIWFybV9zdGF0ZSkKKwkJZ290byBvdXQ7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyIsIF9fZnVuY19fKTsKKworCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJaWYgKGFybV9zdGF0ZS0+d2FrZV9hZGRyZXNzID09IDApIHsKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkJCSIlczogYWxyZWFkeSBhd2FrZSIsIF9fZnVuY19fKTsKKwkJZ290byB1bmxvY2s7CisJfQorCWlmIChhcm1fc3RhdGUtPnZjX3Jlc3VtZV9zdGF0ZSA9PSBWQ19SRVNVTUVfSU5fUFJPR1JFU1MpIHsKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkJCSIlczogYWxyZWFkeSByZXN1bWluZyIsIF9fZnVuY19fKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJaWYgKGFybV9zdGF0ZS0+dmNfcmVzdW1lX3N0YXRlID09IFZDX1JFU1VNRV9SRVFVRVNURUQpIHsKKwkJc2V0X3Jlc3VtZV9zdGF0ZShhcm1fc3RhdGUsIFZDX1JFU1VNRV9JTl9QUk9HUkVTUyk7CisJCXJlcyA9IDE7CisJfSBlbHNlCisJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCQkiJXM6IG5vdCByZXN1bWluZyAocmVzdW1lIHN0YXRlICVzKSIsIF9fZnVuY19fLAorCQkJCXJlc3VtZV9zdGF0ZV9uYW1lc1thcm1fc3RhdGUtPnZjX3Jlc3VtZV9zdGF0ZSArCisJCQkJCQkJVkNfUkVTVU1FX05VTV9PRkZTRVRdKTsKKwordW5sb2NrOgorCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKworCWlmIChyZXMpCisJCXZjaGlxX3BsYXRmb3JtX3Jlc3VtZShzdGF0ZSk7CisKK291dDoKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyBleGl0IiwgX19mdW5jX18pOworCXJldHVybjsKKworfQorCisKKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3VzZV9pbnRlcm5hbChWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLAorCQllbnVtIFVTRV9UWVBFX0UgdXNlX3R5cGUpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCVZDSElRX1NUQVRVU19UIHJldCA9IFZDSElRX1NVQ0NFU1M7CisJY2hhciBlbnRpdHlbMTZdOworCWludCAqZW50aXR5X3VjOworCWludCBsb2NhbF91YywgbG9jYWxfZW50aXR5X3VjOworCisJaWYgKCFhcm1fc3RhdGUpCisJCWdvdG8gb3V0OworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMiLCBfX2Z1bmNfXyk7CisKKwlpZiAodXNlX3R5cGUgPT0gVVNFX1RZUEVfVkNISVEpIHsKKwkJc3ByaW50ZihlbnRpdHksICJWQ0hJUTogICAiKTsKKwkJZW50aXR5X3VjID0gJmFybV9zdGF0ZS0+cGVlcl91c2VfY291bnQ7CisJfSBlbHNlIGlmIChzZXJ2aWNlKSB7CisJCXNwcmludGYoZW50aXR5LCAiJWMlYyVjJWM6JTAzZCIsCisJCQlWQ0hJUV9GT1VSQ0NfQVNfNENIQVJTKHNlcnZpY2UtPmJhc2UuZm91cmNjKSwKKwkJCXNlcnZpY2UtPmNsaWVudF9pZCk7CisJCWVudGl0eV91YyA9ICZzZXJ2aWNlLT5zZXJ2aWNlX3VzZV9jb3VudDsKKwl9IGVsc2UgeworCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyBudWxsIHNlcnZpY2UgIgorCQkJCSJwdHIiLCBfX2Z1bmNfXyk7CisJCXJldCA9IFZDSElRX0VSUk9SOworCQlnb3RvIG91dDsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCXdoaWxlIChhcm1fc3RhdGUtPnJlc3VtZV9ibG9ja2VkKSB7CisJCS8qIElmIHdlIGNhbGwgJ3VzZScgd2hpbGUgZm9yY2Ugc3VzcGVuZCBpcyB3YWl0aW5nIGZvciBzdXNwZW5kLAorCQkgKiB0aGVuIHdlJ3JlIGFib3V0IHRvIGJsb2NrIHRoZSB0aHJlYWQgd2hpY2ggdGhlIGZvcmNlIGlzCisJCSAqIHdhaXRpbmcgdG8gY29tcGxldGUsIHNvIHdlJ3JlIGJvdW5kIHRvIGp1c3QgdGltZSBvdXQuIEluIHRoaXMKKwkJICogY2FzZSwgc2V0IHRoZSBzdXNwZW5kIHN0YXRlIHN1Y2ggdGhhdCB0aGUgd2FpdCB3aWxsIGJlCisJCSAqIGNhbmNlbGVkLCBzbyB3ZSBjYW4gY29tcGxldGUgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4gKi8KKwkJaWYgKGFybV9zdGF0ZS0+cmVzdW1lX2Jsb2NrZWQgJiYgYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlID09CisJCQkJVkNfU1VTUEVORF9JRExFKSB7CisJCQlzZXRfc3VzcGVuZF9zdGF0ZShhcm1fc3RhdGUsIFZDX1NVU1BFTkRfRk9SQ0VfQ0FOQ0VMRUQpOworCQkJYnJlYWs7CisJCX0KKwkJLyogSWYgc3VzcGVuZCBpcyBhbHJlYWR5IGluIHByb2dyZXNzIHRoZW4gd2UgbmVlZCB0byBibG9jayAqLworCQlpZiAoIXRyeV93YWl0X2Zvcl9jb21wbGV0aW9uKCZhcm1fc3RhdGUtPnJlc3VtZV9ibG9ja2VyKSkgeworCQkJLyogSW5kaWNhdGUgdGhhdCB0aGVyZSBhcmUgdGhyZWFkcyB3YWl0aW5nIG9uIHRoZSByZXN1bWUKKwkJCSAqIGJsb2NrZXIuICBUaGVzZSBuZWVkIHRvIGJlIGFsbG93ZWQgdG8gY29tcGxldGUgYmVmb3JlCisJCQkgKiBhIF9zZWNvbmRfIGNhbGwgdG8gZm9yY2Ugc3VzcGVuZCBjYW4gY29tcGxldGUsCisJCQkgKiBvdGhlcndpc2UgbG93IHByaW9yaXR5IHRocmVhZHMgbWlnaHQgbmV2ZXIgYWN0dWFsbHkKKwkJCSAqIGNvbnRpbnVlICovCisJCQlhcm1fc3RhdGUtPmJsb2NrZWRfY291bnQrKzsKKwkJCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgJXMgcmVzdW1lICIKKwkJCQkiYmxvY2tlZCAtIHdhaXRpbmcuLi4iLCBfX2Z1bmNfXywgZW50aXR5KTsKKwkJCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX2tpbGxhYmxlKAorCQkJCQkmYXJtX3N0YXRlLT5yZXN1bWVfYmxvY2tlcikgIT0gMCkgeworCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzICVzICIKKwkJCQkJIndhaXQgZm9yIHJlc3VtZSBibG9ja2VyIGludGVycnVwdGVkIiwKKwkJCQkJX19mdW5jX18sIGVudGl0eSk7CisJCQkJcmV0ID0gVkNISVFfRVJST1I7CisJCQkJd3JpdGVfbG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwkJCQlhcm1fc3RhdGUtPmJsb2NrZWRfY291bnQtLTsKKwkJCQl3cml0ZV91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzICVzIHJlc3VtZSAiCisJCQkJInVuYmxvY2tlZCIsIF9fZnVuY19fLCBlbnRpdHkpOworCQkJd3JpdGVfbG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwkJCWlmICgtLWFybV9zdGF0ZS0+YmxvY2tlZF9jb3VudCA9PSAwKQorCQkJCWNvbXBsZXRlX2FsbCgmYXJtX3N0YXRlLT5ibG9ja2VkX2Jsb2NrZXIpOworCQl9CisJfQorCisJc3RvcF9zdXNwZW5kX3RpbWVyKGFybV9zdGF0ZSk7CisKKwlsb2NhbF91YyA9ICsrYXJtX3N0YXRlLT52aWRlb2NvcmVfdXNlX2NvdW50OworCWxvY2FsX2VudGl0eV91YyA9ICsrKCplbnRpdHlfdWMpOworCisJLyogSWYgdGhlcmUncyBhIHBlbmRpbmcgcmVxdWVzdCB3aGljaCBoYXNuJ3QgeWV0IGJlZW4gc2VydmljZWQgdGhlbgorCSAqIGp1c3QgY2xlYXIgaXQuICBJZiB3ZSdyZSBwYXN0IFZDX1NVU1BFTkRfUkVRVUVTVEVEIHN0YXRlIHRoZW4KKwkgKiB2Y19yZXN1bWVfY29tcGxldGUgd2lsbCBibG9jayB1bnRpbCB3ZSBlaXRoZXIgcmVzdW1lIG9yIGZhaWwgdG8KKwkgKiBzdXNwZW5kICovCisJaWYgKGFybV9zdGF0ZS0+dmNfc3VzcGVuZF9zdGF0ZSA8PSBWQ19TVVNQRU5EX1JFUVVFU1RFRCkKKwkJc2V0X3N1c3BlbmRfc3RhdGUoYXJtX3N0YXRlLCBWQ19TVVNQRU5EX0lETEUpOworCisJaWYgKCh1c2VfdHlwZSAhPSBVU0VfVFlQRV9TRVJWSUNFX05PX1JFU1VNRSkgJiYgbmVlZF9yZXN1bWUoc3RhdGUpKSB7CisJCXNldF9yZXN1bWVfc3RhdGUoYXJtX3N0YXRlLCBWQ19SRVNVTUVfUkVRVUVTVEVEKTsKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkiJXMgJXMgY291bnQgJWQsIHN0YXRlIGNvdW50ICVkIiwKKwkJCV9fZnVuY19fLCBlbnRpdHksIGxvY2FsX2VudGl0eV91YywgbG9jYWxfdWMpOworCQlyZXF1ZXN0X3BvbGwoc3RhdGUsIE5VTEwsIDApOworCX0gZWxzZQorCQl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkiJXMgJXMgY291bnQgJWQsIHN0YXRlIGNvdW50ICVkIiwKKwkJCV9fZnVuY19fLCBlbnRpdHksICplbnRpdHlfdWMsIGxvY2FsX3VjKTsKKworCisJd3JpdGVfdW5sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCisJLyogQ29tcGxldGlvbiBpcyBpbiBhIGRvbmUgc3RhdGUgd2hlbiB3ZSdyZSBub3Qgc3VzcGVuZGVkLCBzbyB0aGlzIHdvbid0CisJICogYmxvY2sgZm9yIHRoZSBub24tc3VzcGVuZGVkIGNhc2UuICovCisJaWYgKCF0cnlfd2FpdF9mb3JfY29tcGxldGlvbigmYXJtX3N0YXRlLT52Y19yZXN1bWVfY29tcGxldGUpKSB7CisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgJXMgd2FpdCBmb3IgcmVzdW1lIiwKKwkJCV9fZnVuY19fLCBlbnRpdHkpOworCQlpZiAod2FpdF9mb3JfY29tcGxldGlvbl9raWxsYWJsZSgKKwkJCQkmYXJtX3N0YXRlLT52Y19yZXN1bWVfY29tcGxldGUpICE9IDApIHsKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzICVzIHdhaXQgZm9yICIKKwkJCQkicmVzdW1lIGludGVycnVwdGVkIiwgX19mdW5jX18sIGVudGl0eSk7CisJCQlyZXQgPSBWQ0hJUV9FUlJPUjsKKwkJCWdvdG8gb3V0OworCQl9CisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgJXMgcmVzdW1lZCIsIF9fZnVuY19fLAorCQkJZW50aXR5KTsKKwl9CisKKwlpZiAocmV0ID09IFZDSElRX1NVQ0NFU1MpIHsKKwkJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKwkJbG9uZyBhY2tfY250ID0gYXRvbWljX3hjaGcoJmFybV9zdGF0ZS0+a2FfdXNlX2Fja19jb3VudCwgMCk7CisJCXdoaWxlIChhY2tfY250ICYmIChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykpIHsKKwkJCS8qIFNlbmQgdGhlIHVzZSBub3RpZnkgdG8gdmlkZW9jb3JlICovCisJCQlzdGF0dXMgPSB2Y2hpcV9zZW5kX3JlbW90ZV91c2VfYWN0aXZlKHN0YXRlKTsKKwkJCWlmIChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykKKwkJCQlhY2tfY250LS07CisJCQllbHNlCisJCQkJYXRvbWljX2FkZChhY2tfY250LAorCQkJCQkmYXJtX3N0YXRlLT5rYV91c2VfYWNrX2NvdW50KTsKKwkJfQorCX0KKworb3V0OgorCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIGV4aXQgJWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfcmVsZWFzZV9pbnRlcm5hbChWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKQoreworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKwlWQ0hJUV9TVEFUVVNfVCByZXQgPSBWQ0hJUV9TVUNDRVNTOworCWNoYXIgZW50aXR5WzE2XTsKKwlpbnQgKmVudGl0eV91YzsKKwlpbnQgbG9jYWxfdWMsIGxvY2FsX2VudGl0eV91YzsKKworCWlmICghYXJtX3N0YXRlKQorCQlnb3RvIG91dDsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIiwgX19mdW5jX18pOworCisJaWYgKHNlcnZpY2UpIHsKKwkJc3ByaW50ZihlbnRpdHksICIlYyVjJWMlYzolMDNkIiwKKwkJCVZDSElRX0ZPVVJDQ19BU180Q0hBUlMoc2VydmljZS0+YmFzZS5mb3VyY2MpLAorCQkJc2VydmljZS0+Y2xpZW50X2lkKTsKKwkJZW50aXR5X3VjID0gJnNlcnZpY2UtPnNlcnZpY2VfdXNlX2NvdW50OworCX0gZWxzZSB7CisJCXNwcmludGYoZW50aXR5LCAiUEVFUjogICAiKTsKKwkJZW50aXR5X3VjID0gJmFybV9zdGF0ZS0+cGVlcl91c2VfY291bnQ7CisJfQorCisJd3JpdGVfbG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwlpZiAoIWFybV9zdGF0ZS0+dmlkZW9jb3JlX3VzZV9jb3VudCB8fCAhKCplbnRpdHlfdWMpKSB7CisJCS8qIERvbid0IHVzZSBCVUdfT04gLSBkb24ndCBhbGxvdyB1c2VyIHRocmVhZCB0byBjcmFzaCBrZXJuZWwgKi8KKwkJV0FSTl9PTighYXJtX3N0YXRlLT52aWRlb2NvcmVfdXNlX2NvdW50KTsKKwkJV0FSTl9PTighKCplbnRpdHlfdWMpKTsKKwkJcmV0ID0gVkNISVFfRVJST1I7CisJCWdvdG8gdW5sb2NrOworCX0KKwlsb2NhbF91YyA9IC0tYXJtX3N0YXRlLT52aWRlb2NvcmVfdXNlX2NvdW50OworCWxvY2FsX2VudGl0eV91YyA9IC0tKCplbnRpdHlfdWMpOworCisJaWYgKCF2Y2hpcV92aWRlb2NvcmVfd2FudGVkKHN0YXRlKSkgeworCQlpZiAodmNoaXFfcGxhdGZvcm1fdXNlX3N1c3BlbmRfdGltZXIoKSAmJgorCQkJCSFhcm1fc3RhdGUtPnJlc3VtZV9ibG9ja2VkKSB7CisJCQkvKiBPbmx5IHVzZSB0aGUgdGltZXIgaWYgd2UncmUgbm90IHRyeWluZyB0byBmb3JjZQorCQkJICogc3VzcGVuZCAoPT4gcmVzdW1lX2Jsb2NrZWQpICovCisJCQlzdGFydF9zdXNwZW5kX3RpbWVyKGFybV9zdGF0ZSk7CisJCX0gZWxzZSB7CisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCQkiJXMgJXMgY291bnQgJWQsIHN0YXRlIGNvdW50ICVkIC0gc3VzcGVuZGluZyIsCisJCQkJX19mdW5jX18sIGVudGl0eSwgKmVudGl0eV91YywKKwkJCQlhcm1fc3RhdGUtPnZpZGVvY29yZV91c2VfY291bnQpOworCQkJdmNoaXFfYXJtX3Zjc3VzcGVuZChzdGF0ZSk7CisJCX0KKwl9IGVsc2UKKwkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJIiVzICVzIGNvdW50ICVkLCBzdGF0ZSBjb3VudCAlZCIsCisJCQlfX2Z1bmNfXywgZW50aXR5LCAqZW50aXR5X3VjLAorCQkJYXJtX3N0YXRlLT52aWRlb2NvcmVfdXNlX2NvdW50KTsKKwordW5sb2NrOgorCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKworb3V0OgorCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIGV4aXQgJWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCit2Y2hpcV9vbl9yZW1vdGVfdXNlKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyIsIF9fZnVuY19fKTsKKwlhdG9taWNfaW5jKCZhcm1fc3RhdGUtPmthX3VzZV9jb3VudCk7CisJY29tcGxldGUoJmFybV9zdGF0ZS0+a2FfZXZ0KTsKK30KKwordm9pZAordmNoaXFfb25fcmVtb3RlX3JlbGVhc2UoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIiwgX19mdW5jX18pOworCWF0b21pY19pbmMoJmFybV9zdGF0ZS0+a2FfcmVsZWFzZV9jb3VudCk7CisJY29tcGxldGUoJmFybV9zdGF0ZS0+a2FfZXZ0KTsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3VzZV9zZXJ2aWNlX2ludGVybmFsKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSkKK3sKKwlyZXR1cm4gdmNoaXFfdXNlX2ludGVybmFsKHNlcnZpY2UtPnN0YXRlLCBzZXJ2aWNlLCBVU0VfVFlQRV9TRVJWSUNFKTsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3JlbGVhc2Vfc2VydmljZV9pbnRlcm5hbChWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpCit7CisJcmV0dXJuIHZjaGlxX3JlbGVhc2VfaW50ZXJuYWwoc2VydmljZS0+c3RhdGUsIHNlcnZpY2UpOworfQorCitWQ0hJUV9ERUJVR0ZTX05PREVfVCAqCit2Y2hpcV9pbnN0YW5jZV9nZXRfZGVidWdmc19ub2RlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpCit7CisJcmV0dXJuICZpbnN0YW5jZS0+ZGVidWdmc19ub2RlOworfQorCitpbnQKK3ZjaGlxX2luc3RhbmNlX2dldF91c2VfY291bnQoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSkKK3sKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2U7CisJaW50IHVzZV9jb3VudCA9IDAsIGk7CisJaSA9IDA7CisJd2hpbGUgKChzZXJ2aWNlID0gbmV4dF9zZXJ2aWNlX2J5X2luc3RhbmNlKGluc3RhbmNlLT5zdGF0ZSwKKwkJaW5zdGFuY2UsICZpKSkgIT0gTlVMTCkgeworCQl1c2VfY291bnQgKz0gc2VydmljZS0+c2VydmljZV91c2VfY291bnQ7CisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCX0KKwlyZXR1cm4gdXNlX2NvdW50OworfQorCitpbnQKK3ZjaGlxX2luc3RhbmNlX2dldF9waWQoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSkKK3sKKwlyZXR1cm4gaW5zdGFuY2UtPnBpZDsKK30KKworaW50Cit2Y2hpcV9pbnN0YW5jZV9nZXRfdHJhY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSkKK3sKKwlyZXR1cm4gaW5zdGFuY2UtPnRyYWNlOworfQorCit2b2lkCit2Y2hpcV9pbnN0YW5jZV9zZXRfdHJhY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwgaW50IHRyYWNlKQoreworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKwlpbnQgaTsKKwlpID0gMDsKKwl3aGlsZSAoKHNlcnZpY2UgPSBuZXh0X3NlcnZpY2VfYnlfaW5zdGFuY2UoaW5zdGFuY2UtPnN0YXRlLAorCQlpbnN0YW5jZSwgJmkpKSAhPSBOVUxMKSB7CisJCXNlcnZpY2UtPnRyYWNlID0gdHJhY2U7CisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCX0KKwlpbnN0YW5jZS0+dHJhY2UgPSAodHJhY2UgIT0gMCk7Cit9CisKK3N0YXRpYyB2b2lkIHN1c3BlbmRfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gKFZDSElRX1NUQVRFX1QgKiljb250ZXh0OworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKwlpZiAoIWFybV9zdGF0ZSkKKwkJZ290byBvdXQ7CisJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCSIlcyAtIHN1c3BlbmQgdGltZXIgZXhwaXJlZCAtIGNoZWNrIHN1c3BlbmQiLCBfX2Z1bmNfXyk7CisJdmNoaXFfY2hlY2tfc3VzcGVuZChzdGF0ZSk7CitvdXQ6CisJcmV0dXJuOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfdXNlX3NlcnZpY2Vfbm9fcmVzdW1lKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKQoreworCVZDSElRX1NUQVRVU19UIHJldCA9IFZDSElRX0VSUk9SOworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9oYW5kbGUoaGFuZGxlKTsKKwlpZiAoc2VydmljZSkgeworCQlyZXQgPSB2Y2hpcV91c2VfaW50ZXJuYWwoc2VydmljZS0+c3RhdGUsIHNlcnZpY2UsCisJCQkJVVNFX1RZUEVfU0VSVklDRV9OT19SRVNVTUUpOworCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3VzZV9zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKQoreworCVZDSElRX1NUQVRVU19UIHJldCA9IFZDSElRX0VSUk9SOworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9oYW5kbGUoaGFuZGxlKTsKKwlpZiAoc2VydmljZSkgeworCQlyZXQgPSB2Y2hpcV91c2VfaW50ZXJuYWwoc2VydmljZS0+c3RhdGUsIHNlcnZpY2UsCisJCQkJVVNFX1RZUEVfU0VSVklDRSk7CisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfcmVsZWFzZV9zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKQoreworCVZDSElRX1NUQVRVU19UIHJldCA9IFZDSElRX0VSUk9SOworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9oYW5kbGUoaGFuZGxlKTsKKwlpZiAoc2VydmljZSkgeworCQlyZXQgPSB2Y2hpcV9yZWxlYXNlX2ludGVybmFsKHNlcnZpY2UtPnN0YXRlLCBzZXJ2aWNlKTsKKwkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK3ZjaGlxX2R1bXBfc2VydmljZV91c2Vfc3RhdGUoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCWludCBpLCBqID0gMDsKKwkvKiBPbmx5IGR1bXAgNjQgc2VydmljZXMgKi8KKwlzdGF0aWMgY29uc3QgaW50IGxvY2FsX21heF9zZXJ2aWNlcyA9IDY0OworCS8qIElmIHRoZXJlJ3MgbW9yZSB0aGFuIDY0IHNlcnZpY2VzLCBvbmx5IGR1bXAgb25lcyB3aXRoCisJICogbm9uLXplcm8gY291bnRzICovCisJaW50IG9ubHlfbm9uemVybyA9IDA7CisJc3RhdGljIGNvbnN0IGNoYXIgKm56ID0gIjwtLSBwcmV2ZW50aW5nIHN1c3BlbmQiOworCisJZW51bSB2Y19zdXNwZW5kX3N0YXR1cyB2Y19zdXNwZW5kX3N0YXRlOworCWVudW0gdmNfcmVzdW1lX3N0YXR1cyAgdmNfcmVzdW1lX3N0YXRlOworCWludCBwZWVyX2NvdW50OworCWludCB2Y191c2VfY291bnQ7CisJaW50IGFjdGl2ZV9zZXJ2aWNlczsKKwlzdHJ1Y3Qgc2VydmljZV9kYXRhX3N0cnVjdCB7CisJCWludCBmb3VyY2M7CisJCWludCBjbGllbnRpZDsKKwkJaW50IHVzZV9jb3VudDsKKwl9IHNlcnZpY2VfZGF0YVtsb2NhbF9tYXhfc2VydmljZXNdOworCisJaWYgKCFhcm1fc3RhdGUpCisJCXJldHVybjsKKworCXJlYWRfbG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwl2Y19zdXNwZW5kX3N0YXRlID0gYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlOworCXZjX3Jlc3VtZV9zdGF0ZSAgPSBhcm1fc3RhdGUtPnZjX3Jlc3VtZV9zdGF0ZTsKKwlwZWVyX2NvdW50ID0gYXJtX3N0YXRlLT5wZWVyX3VzZV9jb3VudDsKKwl2Y191c2VfY291bnQgPSBhcm1fc3RhdGUtPnZpZGVvY29yZV91c2VfY291bnQ7CisJYWN0aXZlX3NlcnZpY2VzID0gc3RhdGUtPnVudXNlZF9zZXJ2aWNlOworCWlmIChhY3RpdmVfc2VydmljZXMgPiBsb2NhbF9tYXhfc2VydmljZXMpCisJCW9ubHlfbm9uemVybyA9IDE7CisKKwlmb3IgKGkgPSAwOyAoaSA8IGFjdGl2ZV9zZXJ2aWNlcykgJiYgKGogPCBsb2NhbF9tYXhfc2VydmljZXMpOyBpKyspIHsKKwkJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlX3B0ciA9IHN0YXRlLT5zZXJ2aWNlc1tpXTsKKwkJaWYgKCFzZXJ2aWNlX3B0cikKKwkJCWNvbnRpbnVlOworCisJCWlmIChvbmx5X25vbnplcm8gJiYgIXNlcnZpY2VfcHRyLT5zZXJ2aWNlX3VzZV9jb3VudCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzZXJ2aWNlX3B0ci0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfRlJFRSkgeworCQkJc2VydmljZV9kYXRhW2pdLmZvdXJjYyA9IHNlcnZpY2VfcHRyLT5iYXNlLmZvdXJjYzsKKwkJCXNlcnZpY2VfZGF0YVtqXS5jbGllbnRpZCA9IHNlcnZpY2VfcHRyLT5jbGllbnRfaWQ7CisJCQlzZXJ2aWNlX2RhdGFbaisrXS51c2VfY291bnQgPSBzZXJ2aWNlX3B0ci0+CisJCQkJCQkJc2VydmljZV91c2VfY291bnQ7CisJCX0KKwl9CisKKwlyZWFkX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKworCXZjaGlxX2xvZ193YXJuaW5nKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkiLS0gVmlkZWNvcmUgc3VzcGVuZCBzdGF0ZTogJXMgLS0iLAorCQlzdXNwZW5kX3N0YXRlX25hbWVzW3ZjX3N1c3BlbmRfc3RhdGUgKyBWQ19TVVNQRU5EX05VTV9PRkZTRVRdKTsKKwl2Y2hpcV9sb2dfd2FybmluZyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJIi0tIFZpZGVjb3JlIHJlc3VtZSBzdGF0ZTogJXMgLS0iLAorCQlyZXN1bWVfc3RhdGVfbmFtZXNbdmNfcmVzdW1lX3N0YXRlICsgVkNfUkVTVU1FX05VTV9PRkZTRVRdKTsKKworCWlmIChvbmx5X25vbnplcm8pCisJCXZjaGlxX2xvZ193YXJuaW5nKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiVG9vIG1hbnkgYWN0aXZlICIKKwkJCSJzZXJ2aWNlcyAoJWQpLiAgT25seSBkdW1waW5nIHVwIHRvIGZpcnN0ICVkIHNlcnZpY2VzICIKKwkJCSJ3aXRoIG5vbi16ZXJvIHVzZS1jb3VudCIsIGFjdGl2ZV9zZXJ2aWNlcywKKwkJCWxvY2FsX21heF9zZXJ2aWNlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisJCXZjaGlxX2xvZ193YXJuaW5nKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJIi0tLS0tICVjJWMlYyVjOiVkIHNlcnZpY2UgY291bnQgJWQgJXMiLAorCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUyhzZXJ2aWNlX2RhdGFbaV0uZm91cmNjKSwKKwkJCXNlcnZpY2VfZGF0YVtpXS5jbGllbnRpZCwKKwkJCXNlcnZpY2VfZGF0YVtpXS51c2VfY291bnQsCisJCQlzZXJ2aWNlX2RhdGFbaV0udXNlX2NvdW50ID8gbnogOiAiIik7CisJfQorCXZjaGlxX2xvZ193YXJuaW5nKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkiLS0tLS0gVkNISVEgdXNlIGNvdW50IGNvdW50ICVkIiwgcGVlcl9jb3VudCk7CisJdmNoaXFfbG9nX3dhcm5pbmcodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCSItLS0gT3ZlcmFsbCB2Y2hpcSBpbnN0YW5jZSB1c2UgY291bnQgJWQiLCB2Y191c2VfY291bnQpOworCisJdmNoaXFfZHVtcF9wbGF0Zm9ybV91c2Vfc3RhdGUoc3RhdGUpOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfY2hlY2tfc2VydmljZShWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZTsKKwlWQ0hJUV9TVEFUVVNfVCByZXQgPSBWQ0hJUV9FUlJPUjsKKworCWlmICghc2VydmljZSB8fCAhc2VydmljZS0+c3RhdGUpCisJCWdvdG8gb3V0OworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMiLCBfX2Z1bmNfXyk7CisKKwlhcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHNlcnZpY2UtPnN0YXRlKTsKKworCXJlYWRfbG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwlpZiAoc2VydmljZS0+c2VydmljZV91c2VfY291bnQpCisJCXJldCA9IFZDSElRX1NVQ0NFU1M7CisJcmVhZF91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisKKwlpZiAocmV0ID09IFZDSElRX0VSUk9SKSB7CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCSIlcyBFUlJPUiAtICVjJWMlYyVjOiVkIHNlcnZpY2UgY291bnQgJWQsICIKKwkJCSJzdGF0ZSBjb3VudCAlZCwgdmlkZW9jb3JlIHN1c3BlbmQgc3RhdGUgJXMiLCBfX2Z1bmNfXywKKwkJCVZDSElRX0ZPVVJDQ19BU180Q0hBUlMoc2VydmljZS0+YmFzZS5mb3VyY2MpLAorCQkJc2VydmljZS0+Y2xpZW50X2lkLCBzZXJ2aWNlLT5zZXJ2aWNlX3VzZV9jb3VudCwKKwkJCWFybV9zdGF0ZS0+dmlkZW9jb3JlX3VzZV9jb3VudCwKKwkJCXN1c3BlbmRfc3RhdGVfbmFtZXNbYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlICsKKwkJCQkJCVZDX1NVU1BFTkRfTlVNX09GRlNFVF0pOworCQl2Y2hpcV9kdW1wX3NlcnZpY2VfdXNlX3N0YXRlKHNlcnZpY2UtPnN0YXRlKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogc3R1YiBmdW5jdGlvbnMgKi8KK3ZvaWQgdmNoaXFfb25fcmVtb3RlX3VzZV9hY3RpdmUoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJKHZvaWQpc3RhdGU7Cit9CisKK3ZvaWQgdmNoaXFfcGxhdGZvcm1fY29ubl9zdGF0ZV9jaGFuZ2VkKFZDSElRX1NUQVRFX1QgKnN0YXRlLAorCVZDSElRX0NPTk5TVEFURV9UIG9sZHN0YXRlLCBWQ0hJUV9DT05OU1RBVEVfVCBuZXdzdGF0ZSkKK3sKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlZDogJXMtPiVzIiwgc3RhdGUtPmlkLAorCQlnZXRfY29ubl9zdGF0ZV9uYW1lKG9sZHN0YXRlKSwgZ2V0X2Nvbm5fc3RhdGVfbmFtZShuZXdzdGF0ZSkpOworCWlmIChzdGF0ZS0+Y29ubl9zdGF0ZSA9PSBWQ0hJUV9DT05OU1RBVEVfQ09OTkVDVEVEKSB7CisJCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJCWlmICghYXJtX3N0YXRlLT5maXJzdF9jb25uZWN0KSB7CisJCQljaGFyIHRocmVhZG5hbWVbMTBdOworCQkJYXJtX3N0YXRlLT5maXJzdF9jb25uZWN0ID0gMTsKKwkJCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwkJCXNucHJpbnRmKHRocmVhZG5hbWUsIHNpemVvZih0aHJlYWRuYW1lKSwgIlZDSElRa2EtJWQiLAorCQkJCXN0YXRlLT5pZCk7CisJCQlhcm1fc3RhdGUtPmthX3RocmVhZCA9IGt0aHJlYWRfY3JlYXRlKAorCQkJCSZ2Y2hpcV9rZWVwYWxpdmVfdGhyZWFkX2Z1bmMsCisJCQkJKHZvaWQgKilzdGF0ZSwKKwkJCQl0aHJlYWRuYW1lKTsKKwkJCWlmIChhcm1fc3RhdGUtPmthX3RocmVhZCA9PSBOVUxMKSB7CisJCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJCQkidmNoaXE6IEZBVEFMOiBjb3VsZG4ndCBjcmVhdGUgdGhyZWFkICVzIiwKKwkJCQkJdGhyZWFkbmFtZSk7CisJCQl9IGVsc2UgeworCQkJCXdha2VfdXBfcHJvY2Vzcyhhcm1fc3RhdGUtPmthX3RocmVhZCk7CisJCQl9CisJCX0gZWxzZQorCQkJd3JpdGVfdW5sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCX0KK30KKworc3RhdGljIGludCB2Y2hpcV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZndfbm9kZTsKKwlzdHJ1Y3QgcnBpX2Zpcm13YXJlICpmdzsKKwlpbnQgZXJyOworCXZvaWQgKnB0cl9lcnI7CisKKwlmd19ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwgImZpcm13YXJlIiwgMCk7CisvKiBSZW1vdmUgY29tbWVudCB3aGVuIGJvb3Rpbmcgd2l0aG91dCBEZXZpY2UgVHJlZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkCisJaWYgKCFmd19ub2RlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pc3NpbmcgZmlybXdhcmUgbm9kZVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKyovCisJZncgPSBycGlfZmlybXdhcmVfZ2V0KGZ3X25vZGUpOworCWlmICghZncpCisJCXJldHVybiAtRVBST0JFX0RFRkVSOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZncpOworCisJLyogY3JlYXRlIGRlYnVnZnMgZW50cmllcyAqLworCWVyciA9IHZjaGlxX2RlYnVnZnNfaW5pdCgpOworCWlmIChlcnIgIT0gMCkKKwkJZ290byBmYWlsZWRfZGVidWdmc19pbml0OworCisJZXJyID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmdmNoaXFfZGV2aWQsIFZDSElRX01JTk9SLCAxLCBERVZJQ0VfTkFNRSk7CisJaWYgKGVyciAhPSAwKSB7CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBkZXZpY2UgbnVtYmVyIik7CisJCWdvdG8gZmFpbGVkX2FsbG9jX2NocmRldjsKKwl9CisJY2Rldl9pbml0KCZ2Y2hpcV9jZGV2LCAmdmNoaXFfZm9wcyk7CisJdmNoaXFfY2Rldi5vd25lciA9IFRISVNfTU9EVUxFOworCWVyciA9IGNkZXZfYWRkKCZ2Y2hpcV9jZGV2LCB2Y2hpcV9kZXZpZCwgMSk7CisJaWYgKGVyciAhPSAwKSB7CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJIlVuYWJsZSB0byByZWdpc3RlciBkZXZpY2UiKTsKKwkJZ290byBmYWlsZWRfY2Rldl9hZGQ7CisJfQorCisJLyogY3JlYXRlIHN5c2ZzIGVudHJpZXMgKi8KKwl2Y2hpcV9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgREVWSUNFX05BTUUpOworCXB0cl9lcnIgPSB2Y2hpcV9jbGFzczsKKwlpZiAoSVNfRVJSKHB0cl9lcnIpKQorCQlnb3RvIGZhaWxlZF9jbGFzc19jcmVhdGU7CisKKwl2Y2hpcV9kZXYgPSBkZXZpY2VfY3JlYXRlKHZjaGlxX2NsYXNzLCBOVUxMLAorCQl2Y2hpcV9kZXZpZCwgTlVMTCwgInZjaGlxIik7CisJcHRyX2VyciA9IHZjaGlxX2RldjsKKwlpZiAoSVNfRVJSKHB0cl9lcnIpKQorCQlnb3RvIGZhaWxlZF9kZXZpY2VfY3JlYXRlOworCisJZXJyID0gdmNoaXFfcGxhdGZvcm1faW5pdChwZGV2LCAmZ19zdGF0ZSk7CisJaWYgKGVyciAhPSAwKQorCQlnb3RvIGZhaWxlZF9wbGF0Zm9ybV9pbml0OworCisJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJInZjaGlxOiBpbml0aWFsaXNlZCAtIHZlcnNpb24gJWQgKG1pbiAlZCksIGRldmljZSAlZC4lZCIsCisJCVZDSElRX1ZFUlNJT04sIFZDSElRX1ZFUlNJT05fTUlOLAorCQlNQUpPUih2Y2hpcV9kZXZpZCksIE1JTk9SKHZjaGlxX2RldmlkKSk7CisKKwlyZXR1cm4gMDsKKworZmFpbGVkX3BsYXRmb3JtX2luaXQ6CisJZGV2aWNlX2Rlc3Ryb3kodmNoaXFfY2xhc3MsIHZjaGlxX2RldmlkKTsKK2ZhaWxlZF9kZXZpY2VfY3JlYXRlOgorCWNsYXNzX2Rlc3Ryb3kodmNoaXFfY2xhc3MpOworZmFpbGVkX2NsYXNzX2NyZWF0ZToKKwljZGV2X2RlbCgmdmNoaXFfY2Rldik7CisJZXJyID0gUFRSX0VSUihwdHJfZXJyKTsKK2ZhaWxlZF9jZGV2X2FkZDoKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24odmNoaXFfZGV2aWQsIDEpOworZmFpbGVkX2FsbG9jX2NocmRldjoKKwl2Y2hpcV9kZWJ1Z2ZzX2RlaW5pdCgpOworZmFpbGVkX2RlYnVnZnNfaW5pdDoKKwl2Y2hpcV9sb2dfd2FybmluZyh2Y2hpcV9hcm1fbG9nX2xldmVsLCAiY291bGQgbm90IGxvYWQgdmNoaXEiKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZjaGlxX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWRldmljZV9kZXN0cm95KHZjaGlxX2NsYXNzLCB2Y2hpcV9kZXZpZCk7CisJY2xhc3NfZGVzdHJveSh2Y2hpcV9jbGFzcyk7CisJY2Rldl9kZWwoJnZjaGlxX2NkZXYpOworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbih2Y2hpcV9kZXZpZCwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdmNoaXFfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImJyY20sYmNtMjgzNS12Y2hpcSIsIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdmNoaXFfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB2Y2hpcV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYmNtMjgzNV92Y2hpcSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB2Y2hpcV9vZl9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IHZjaGlxX3Byb2JlLAorCS5yZW1vdmUgPSB2Y2hpcV9yZW1vdmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih2Y2hpcV9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJCcm9hZGNvbSBDb3Jwb3JhdGlvbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9hcm0uaCBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfYXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0MGUxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfYXJtLmgKQEAgLTAsMCArMSwyMjAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFJhc3BiZXJyeSBQaSAoVHJhZGluZykgTHRkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVkNISVFfQVJNX0gKKyNkZWZpbmUgVkNISVFfQVJNX0gKKworI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSAidmNoaXFfY29yZS5oIgorI2luY2x1ZGUgInZjaGlxX2RlYnVnZnMuaCIKKworCitlbnVtIHZjX3N1c3BlbmRfc3RhdHVzIHsKKwlWQ19TVVNQRU5EX0ZPUkNFX0NBTkNFTEVEID0gLTMsIC8qIEZvcmNlIHN1c3BlbmQgY2FuY2VsZWQsIHRvbyBidXN5ICovCisJVkNfU1VTUEVORF9SRUpFQ1RFRCA9IC0yLCAgLyogVmlkZW9jb3JlIHJlamVjdGVkIHN1c3BlbmQgcmVxdWVzdCAqLworCVZDX1NVU1BFTkRfRkFJTEVEID0gLTEsICAgIC8qIFZpZGVvY29yZSBzdXNwZW5kIGZhaWxlZCAqLworCVZDX1NVU1BFTkRfSURMRSA9IDAsICAgICAgIC8qIFZDIGFjdGl2ZSwgbm8gc3VzcGVuZCBhY3Rpb25zICovCisJVkNfU1VTUEVORF9SRVFVRVNURUQsICAgICAgLyogVXNlciBoYXMgcmVxdWVzdGVkIHN1c3BlbmQgKi8KKwlWQ19TVVNQRU5EX0lOX1BST0dSRVNTLCAgICAvKiBTbG90IGhhbmRsZXIgaGFzIHJlY3ZkIHN1c3BlbmQgcmVxdWVzdCAqLworCVZDX1NVU1BFTkRfU1VTUEVOREVEICAgICAgIC8qIFZpZGVvY29yZSBzdXNwZW5kIHN1Y2NlZWRlZCAqLworfTsKKworZW51bSB2Y19yZXN1bWVfc3RhdHVzIHsKKwlWQ19SRVNVTUVfRkFJTEVEID0gLTEsIC8qIFZpZGVvY29yZSByZXN1bWUgZmFpbGVkICovCisJVkNfUkVTVU1FX0lETEUgPSAwLCAgICAvKiBWQyBzdXNwZW5kZWQsIG5vIHJlc3VtZSBhY3Rpb25zICovCisJVkNfUkVTVU1FX1JFUVVFU1RFRCwgICAvKiBVc2VyIGhhcyByZXF1ZXN0ZWQgcmVzdW1lICovCisJVkNfUkVTVU1FX0lOX1BST0dSRVNTLCAvKiBTbG90IGhhbmRsZXIgaGFzIHJlY2VpdmVkIHJlc3VtZSByZXF1ZXN0ICovCisJVkNfUkVTVU1FX1JFU1VNRUQgICAgICAvKiBWaWRlb2NvcmUgcmVzdW1lZCBzdWNjZXNzZnVsbHkgKGFjdGl2ZSkgKi8KK307CisKKworZW51bSBVU0VfVFlQRV9FIHsKKwlVU0VfVFlQRV9TRVJWSUNFLAorCVVTRV9UWVBFX1NFUlZJQ0VfTk9fUkVTVU1FLAorCVVTRV9UWVBFX1ZDSElRCit9OworCisKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfYXJtX3N0YXRlX3N0cnVjdCB7CisJLyogS2VlcGFsaXZlLXJlbGF0ZWQgZGF0YSAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqa2FfdGhyZWFkOworCXN0cnVjdCBjb21wbGV0aW9uIGthX2V2dDsKKwlhdG9taWNfdCBrYV91c2VfY291bnQ7CisJYXRvbWljX3Qga2FfdXNlX2Fja19jb3VudDsKKwlhdG9taWNfdCBrYV9yZWxlYXNlX2NvdW50OworCisJc3RydWN0IGNvbXBsZXRpb24gdmNfc3VzcGVuZF9jb21wbGV0ZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiB2Y19yZXN1bWVfY29tcGxldGU7CisKKwlyd2xvY2tfdCBzdXNwX3Jlc19sb2NrOworCWVudW0gdmNfc3VzcGVuZF9zdGF0dXMgdmNfc3VzcGVuZF9zdGF0ZTsKKwllbnVtIHZjX3Jlc3VtZV9zdGF0dXMgdmNfcmVzdW1lX3N0YXRlOworCisJdW5zaWduZWQgaW50IHdha2VfYWRkcmVzczsKKworCXN0cnVjdCB0aW1lcl9saXN0IHN1c3BlbmRfdGltZXI7CisJaW50IHN1c3BlbmRfdGltZXJfdGltZW91dDsKKwlpbnQgc3VzcGVuZF90aW1lcl9ydW5uaW5nOworCisJLyogR2xvYmFsIHVzZSBjb3VudCBmb3IgdmlkZW9jb3JlLgorCSoqIFRoaXMgaXMgZXF1YWwgdG8gdGhlIHN1bSBvZiB0aGUgdXNlIGNvdW50cyBmb3IgYWxsIHNlcnZpY2VzLiAgV2hlbgorCSoqIHRoaXMgaGl0cyB6ZXJvIHRoZSB2aWRlb2NvcmUgc3VzcGVuZCBwcm9jZWR1cmUgd2lsbCBiZSBpbml0aWF0ZWQuCisJKi8KKwlpbnQgdmlkZW9jb3JlX3VzZV9jb3VudDsKKworCS8qIFVzZSBjb3VudCB0byB0cmFjayByZXF1ZXN0cyBmcm9tIHZpZGVvY29yZSBwZWVyLgorCSoqIFRoaXMgdXNlIGNvdW50IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBzZXJ2aWNlLCBzbyBuZWVkcyB0byBiZQorCSoqIHRyYWNrZWQgc2VwYXJhdGVseSB3aXRoIHRoZSBzdGF0ZS4KKwkqLworCWludCBwZWVyX3VzZV9jb3VudDsKKworCS8qIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciByZXN1bWUgaXMgYmxvY2tlZC4gIFRoaXMgaGFwcGVucyB3aGVuIHRoZQorCSoqIEFSTSBpcyBzdXNwZW5kaW5nCisJKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiByZXN1bWVfYmxvY2tlcjsKKwlpbnQgcmVzdW1lX2Jsb2NrZWQ7CisJc3RydWN0IGNvbXBsZXRpb24gYmxvY2tlZF9ibG9ja2VyOworCWludCBibG9ja2VkX2NvdW50OworCisJaW50IGF1dG9zdXNwZW5kX292ZXJyaWRlOworCisJLyogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmaXJzdCB2Y2hpcSBjb25uZWN0IGhhcyBtYWRlIGl0IHRocm91Z2guCisJKiogVGhpcyBtZWFucyB0aGF0IGJvdGggc2lkZXMgc2hvdWxkIGJlIGZ1bGx5IHJlYWR5LCBhbmQgd2Ugc2hvdWxkCisJKiogYmUgYWJsZSB0byBzdXNwZW5kIGFmdGVyIHRoaXMgcG9pbnQuCisJKi8KKwlpbnQgZmlyc3RfY29ubmVjdDsKKworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdXNwZW5kX3N0YXJ0X3RpbWU7CisJdW5zaWduZWQgbG9uZyBsb25nIHNsZWVwX3N0YXJ0X3RpbWU7CisJdW5zaWduZWQgbG9uZyBsb25nIHJlc3VtZV9zdGFydF90aW1lOworCXVuc2lnbmVkIGxvbmcgbG9uZyBsYXN0X3dha2VfdGltZTsKKworfSBWQ0hJUV9BUk1fU1RBVEVfVDsKKworZXh0ZXJuIGludCB2Y2hpcV9hcm1fbG9nX2xldmVsOworZXh0ZXJuIGludCB2Y2hpcV9zdXNwX2xvZ19sZXZlbDsKKworaW50IHZjaGlxX3BsYXRmb3JtX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfU1RBVEVfVCAqCit2Y2hpcV9nZXRfc3RhdGUodm9pZCk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfYXJtX3Zjc3VzcGVuZChWQ0hJUV9TVEFURV9UICpzdGF0ZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfYXJtX2ZvcmNlX3N1c3BlbmQoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gaW50Cit2Y2hpcV9hcm1fYWxsb3dfcmVzdW1lKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9hcm1fdmNyZXN1bWUoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2FybV9pbml0X3N0YXRlKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlKTsKKworZXh0ZXJuIGludAordmNoaXFfY2hlY2tfcmVzdW1lKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX2NoZWNrX3N1c3BlbmQoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworIFZDSElRX1NUQVRVU19UCit2Y2hpcV91c2Vfc2VydmljZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfcmVsZWFzZV9zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9jaGVja19zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfcGxhdGZvcm1fc3VzcGVuZChWQ0hJUV9TVEFURV9UICpzdGF0ZSk7CisKK2V4dGVybiBpbnQKK3ZjaGlxX3BsYXRmb3JtX3ZpZGVvY29yZV93YW50ZWQoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gaW50Cit2Y2hpcV9wbGF0Zm9ybV91c2Vfc3VzcGVuZF90aW1lcih2b2lkKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX2R1bXBfcGxhdGZvcm1fdXNlX3N0YXRlKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX2R1bXBfc2VydmljZV91c2Vfc3RhdGUoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfQVJNX1NUQVRFX1QqCit2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIGludAordmNoaXFfdmlkZW9jb3JlX3dhbnRlZChWQ0hJUV9TVEFURV9UICpzdGF0ZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfdXNlX2ludGVybmFsKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsCisJCWVudW0gVVNFX1RZUEVfRSB1c2VfdHlwZSk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3JlbGVhc2VfaW50ZXJuYWwoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSk7CisKK2V4dGVybiBWQ0hJUV9ERUJVR0ZTX05PREVfVCAqCit2Y2hpcV9pbnN0YW5jZV9nZXRfZGVidWdmc19ub2RlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpOworCitleHRlcm4gaW50Cit2Y2hpcV9pbnN0YW5jZV9nZXRfdXNlX2NvdW50KFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpOworCitleHRlcm4gaW50Cit2Y2hpcV9pbnN0YW5jZV9nZXRfcGlkKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpOworCitleHRlcm4gaW50Cit2Y2hpcV9pbnN0YW5jZV9nZXRfdHJhY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9pbnN0YW5jZV9zZXRfdHJhY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwgaW50IHRyYWNlKTsKKworZXh0ZXJuIHZvaWQKK3NldF9zdXNwZW5kX3N0YXRlKFZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUsCisJZW51bSB2Y19zdXNwZW5kX3N0YXR1cyBuZXdfc3RhdGUpOworCitleHRlcm4gdm9pZAorc2V0X3Jlc3VtZV9zdGF0ZShWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlLAorCWVudW0gdmNfcmVzdW1lX3N0YXR1cyBuZXdfc3RhdGUpOworCitleHRlcm4gdm9pZAorc3RhcnRfc3VzcGVuZF90aW1lcihWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlKTsKKworCisjZW5kaWYgLyogVkNISVFfQVJNX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfYnVpbGRfaW5mby5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9idWlsZF9pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY2NDU4MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfYnVpbGRfaW5mby5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2NvbnN0IGNoYXIgKnZjaGlxX2dldF9idWlsZF9ob3N0bmFtZSh2b2lkKTsKK2NvbnN0IGNoYXIgKnZjaGlxX2dldF9idWlsZF92ZXJzaW9uKHZvaWQpOworY29uc3QgY2hhciAqdmNoaXFfZ2V0X2J1aWxkX3RpbWUodm9pZCk7Citjb25zdCBjaGFyICp2Y2hpcV9nZXRfYnVpbGRfZGF0ZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfY2ZnLmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2NmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNzk3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2NmZy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTQgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVkNISVFfQ0ZHX0gKKyNkZWZpbmUgVkNISVFfQ0ZHX0gKKworI2RlZmluZSBWQ0hJUV9NQUdJQyAgICAgICAgICAgICAgVkNISVFfTUFLRV9GT1VSQ0MoJ1YnLCAnQycsICdIJywgJ0knKQorLyogVGhlIHZlcnNpb24gb2YgVkNISVEgLSBjaGFuZ2Ugd2l0aCBhbnkgbm9uLXRyaXZpYWwgY2hhbmdlICovCisjZGVmaW5lIFZDSElRX1ZFUlNJT04gICAgICAgICAgICA4CisvKiBUaGUgbWluaW11bSBjb21wYXRpYmxlIHZlcnNpb24gLSB1cGRhdGUgdG8gbWF0Y2ggVkNISVFfVkVSU0lPTiB3aXRoIGFueQorKiogaW5jb21wYXRpYmxlIGNoYW5nZSAqLworI2RlZmluZSBWQ0hJUV9WRVJTSU9OX01JTiAgICAgICAgMworCisvKiBUaGUgdmVyc2lvbiB0aGF0IGludHJvZHVjZWQgdGhlIFZDSElRX0lPQ19MSUJfVkVSU0lPTiBpb2N0bCAqLworI2RlZmluZSBWQ0hJUV9WRVJTSU9OX0xJQl9WRVJTSU9OIDcKKworLyogVGhlIHZlcnNpb24gdGhhdCBpbnRyb2R1Y2VkIHRoZSBWQ0hJUV9JT0NfQ0xPU0VfREVMSVZFUkVEIGlvY3RsICovCisjZGVmaW5lIFZDSElRX1ZFUlNJT05fQ0xPU0VfREVMSVZFUkVEIDcKKworLyogVGhlIHZlcnNpb24gdGhhdCBtYWRlIGl0IHNhZmUgdG8gdXNlIFNZTkNIUk9OT1VTIG1vZGUgKi8KKyNkZWZpbmUgVkNISVFfVkVSU0lPTl9TWU5DSFJPTk9VU19NT0RFIDgKKworI2RlZmluZSBWQ0hJUV9NQVhfU1RBVEVTICAgICAgICAgMQorI2RlZmluZSBWQ0hJUV9NQVhfU0VSVklDRVMgICAgICAgNDA5NgorI2RlZmluZSBWQ0hJUV9NQVhfU0xPVFMgICAgICAgICAgMTI4CisjZGVmaW5lIFZDSElRX01BWF9TTE9UU19QRVJfU0lERSA2NAorCisjZGVmaW5lIFZDSElRX05VTV9DVVJSRU5UX0JVTEtTICAgICAgICAzMgorI2RlZmluZSBWQ0hJUV9OVU1fU0VSVklDRV9CVUxLUyAgICAgICAgNAorCisjaWZuZGVmIFZDSElRX0VOQUJMRV9ERUJVRworI2RlZmluZSBWQ0hJUV9FTkFCTEVfREVCVUcgICAgICAgICAgICAgMQorI2VuZGlmCisKKyNpZm5kZWYgVkNISVFfRU5BQkxFX1NUQVRTCisjZGVmaW5lIFZDSElRX0VOQUJMRV9TVEFUUyAgICAgICAgICAgICAxCisjZW5kaWYKKworI2VuZGlmIC8qIFZDSElRX0NGR19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2Nvbm5lY3RlZC5jIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jb25uZWN0ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZjNjJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jb25uZWN0ZWQuYwpAQCAtMCwwICsxLDEyMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgInZjaGlxX2Nvbm5lY3RlZC5oIgorI2luY2x1ZGUgInZjaGlxX2NvcmUuaCIKKyNpbmNsdWRlICJ2Y2hpcV9raWxsYWJsZS5oIgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKKyNkZWZpbmUgIE1BWF9DQUxMQkFDS1MgIDEwCisKK3N0YXRpYyAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGdfY29ubmVjdGVkOworc3RhdGljICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgZ19udW1fZGVmZXJyZWRfY2FsbGJhY2tzOworc3RhdGljICAgVkNISVFfQ09OTkVDVEVEX0NBTExCQUNLX1QgZ19kZWZlcnJlZF9jYWxsYmFja1tNQVhfQ0FMTEJBQ0tTXTsKK3N0YXRpYyAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGdfb25jZV9pbml0Oworc3RhdGljICAgc3RydWN0IG11dGV4ICAgICAgICAgICAgICAgZ19jb25uZWN0ZWRfbXV0ZXg7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uIHRvIGluaXRpYWxpemUgb3VyIGxvY2suCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGNvbm5lY3RlZF9pbml0KHZvaWQpCit7CisJaWYgKCFnX29uY2VfaW5pdCkgeworCQltdXRleF9pbml0KCZnX2Nvbm5lY3RlZF9tdXRleCk7CisJCWdfb25jZV9pbml0ID0gMTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBkZWZlciBpbml0aWFsaXphdGlvbiB1bnRpbCB0aGUgdmNoaXEgc3RhY2sgaXMKKyogaW5pdGlhbGl6ZWQuIElmIHRoZSBzdGFjayBpcyBhbHJlYWR5IGluaXRpYWxpemVkLCB0aGVuIHRoZSBjYWxsYmFjayB3aWxsCisqIGJlIG1hZGUgaW1tZWRpYXRlbHksIG90aGVyd2lzZSBpdCB3aWxsIGJlIGRlZmVycmVkIHVudGlsCisqIHZjaGlxX2NhbGxfY29ubmVjdGVkX2NhbGxiYWNrcyBpcyBjYWxsZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgdmNoaXFfYWRkX2Nvbm5lY3RlZF9jYWxsYmFjayhWQ0hJUV9DT05ORUNURURfQ0FMTEJBQ0tfVCBjYWxsYmFjaykKK3sKKwljb25uZWN0ZWRfaW5pdCgpOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZ19jb25uZWN0ZWRfbXV0ZXgpICE9IDApCisJCXJldHVybjsKKworCWlmIChnX2Nvbm5lY3RlZCkKKwkJLyogV2UncmUgYWxyZWFkeSBjb25uZWN0ZWQuIENhbGwgdGhlIGNhbGxiYWNrIGltbWVkaWF0ZWx5LiAqLworCisJCWNhbGxiYWNrKCk7CisJZWxzZSB7CisJCWlmIChnX251bV9kZWZlcnJlZF9jYWxsYmFja3MgPj0gTUFYX0NBTExCQUNLUykKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiVGhlcmUgYWxyZWFkeSAlZCBjYWxsYmFjayByZWdpc3RlcmVkIC0gIgorCQkJCSJwbGVhc2UgaW5jcmVhc2UgTUFYX0NBTExCQUNLUyIsCisJCQkJZ19udW1fZGVmZXJyZWRfY2FsbGJhY2tzKTsKKwkJZWxzZSB7CisJCQlnX2RlZmVycmVkX2NhbGxiYWNrW2dfbnVtX2RlZmVycmVkX2NhbGxiYWNrc10gPQorCQkJCWNhbGxiYWNrOworCQkJZ19udW1fZGVmZXJyZWRfY2FsbGJhY2tzKys7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZnX2Nvbm5lY3RlZF9tdXRleCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSB2Y2hpcSBzdGFjayBvbmNlIGl0IGhhcyBiZWVuIGNvbm5lY3RlZCB0bworKiB0aGUgdmlkZW9jb3JlIGFuZCBjbGllbnRzIGNhbiBzdGFydCB0byB1c2UgdGhlIHN0YWNrLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHZjaGlxX2NhbGxfY29ubmVjdGVkX2NhbGxiYWNrcyh2b2lkKQoreworCWludCBpOworCisJY29ubmVjdGVkX2luaXQoKTsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmdfY29ubmVjdGVkX211dGV4KSAhPSAwKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgIGdfbnVtX2RlZmVycmVkX2NhbGxiYWNrczsgaSsrKQorCQlnX2RlZmVycmVkX2NhbGxiYWNrW2ldKCk7CisKKwlnX251bV9kZWZlcnJlZF9jYWxsYmFja3MgPSAwOworCWdfY29ubmVjdGVkID0gMTsKKwltdXRleF91bmxvY2soJmdfY29ubmVjdGVkX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0wodmNoaXFfYWRkX2Nvbm5lY3RlZF9jYWxsYmFjayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2Nvbm5lY3RlZC5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jb25uZWN0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjNiM2UzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jb25uZWN0ZWQuaApAQCAtMCwwICsxLDUwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElRX0NPTk5FQ1RFRF9ICisjZGVmaW5lIFZDSElRX0NPTk5FQ1RFRF9ICisKKy8qIC0tLS0gSW5jbHVkZSBGaWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tIENvbnN0YW50cyBhbmQgVHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0eXBlZGVmIHZvaWQgKCpWQ0hJUV9DT05ORUNURURfQ0FMTEJBQ0tfVCkodm9pZCk7CisKKy8qIC0tLS0gVmFyaWFibGUgRXh0ZXJucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgdmNoaXFfYWRkX2Nvbm5lY3RlZF9jYWxsYmFjayhWQ0hJUV9DT05ORUNURURfQ0FMTEJBQ0tfVCBjYWxsYmFjayk7Cit2b2lkIHZjaGlxX2NhbGxfY29ubmVjdGVkX2NhbGxiYWNrcyh2b2lkKTsKKworI2VuZGlmIC8qIFZDSElRX0NPTk5FQ1RFRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOThkYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2NvcmUuYwpAQCAtMCwwICsxLDM5MzQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJ2Y2hpcV9jb3JlLmgiCisjaW5jbHVkZSAidmNoaXFfa2lsbGFibGUuaCIKKworI2RlZmluZSBWQ0hJUV9TTE9UX0hBTkRMRVJfU1RBQ0sgODE5MgorCisjZGVmaW5lIEhBTkRMRV9TVEFURV9TSElGVCAxMgorCisjZGVmaW5lIFNMT1RfSU5GT19GUk9NX0lOREVYKHN0YXRlLCBpbmRleCkgKHN0YXRlLT5zbG90X2luZm8gKyAoaW5kZXgpKQorI2RlZmluZSBTTE9UX0RBVEFfRlJPTV9JTkRFWChzdGF0ZSwgaW5kZXgpIChzdGF0ZS0+c2xvdF9kYXRhICsgKGluZGV4KSkKKyNkZWZpbmUgU0xPVF9JTkRFWF9GUk9NX0RBVEEoc3RhdGUsIGRhdGEpIFwKKwkoKCh1bnNpZ25lZCBpbnQpKChjaGFyICopZGF0YSAtIChjaGFyICopc3RhdGUtPnNsb3RfZGF0YSkpIC8gXAorCVZDSElRX1NMT1RfU0laRSkKKyNkZWZpbmUgU0xPVF9JTkRFWF9GUk9NX0lORk8oc3RhdGUsIGluZm8pIFwKKwkoKHVuc2lnbmVkIGludCkoaW5mbyAtIHN0YXRlLT5zbG90X2luZm8pKQorI2RlZmluZSBTTE9UX1FVRVVFX0lOREVYX0ZST01fUE9TKHBvcykgXAorCSgoaW50KSgodW5zaWduZWQgaW50KShwb3MpIC8gVkNISVFfU0xPVF9TSVpFKSkKKworI2RlZmluZSBCVUxLX0lOREVYKHgpICh4ICYgKFZDSElRX05VTV9TRVJWSUNFX0JVTEtTIC0gMSkpCisKKyNkZWZpbmUgU1JWVFJBQ0VfTEVWRUwoc3J2KSBcCisJKCgoc3J2KSAmJiAoc3J2KS0+dHJhY2UpID8gVkNISVFfTE9HX1RSQUNFIDogdmNoaXFfY29yZV9tc2dfbG9nX2xldmVsKQorI2RlZmluZSBTUlZUUkFDRV9FTkFCTEVEKHNydiwgbGV2KSBcCisJKCgoc3J2KSAmJiAoc3J2KS0+dHJhY2UpIHx8ICh2Y2hpcV9jb3JlX21zZ19sb2dfbGV2ZWwgPj0gKGxldikpKQorCitzdHJ1Y3QgdmNoaXFfb3Blbl9wYXlsb2FkIHsKKwlpbnQgZm91cmNjOworCWludCBjbGllbnRfaWQ7CisJc2hvcnQgdmVyc2lvbjsKKwlzaG9ydCB2ZXJzaW9uX21pbjsKK307CisKK3N0cnVjdCB2Y2hpcV9vcGVuYWNrX3BheWxvYWQgeworCXNob3J0IHZlcnNpb247Cit9OworCitlbnVtCit7CisJUU1GTEFHU19JU19CTE9DS0lORyAgICAgPSAoMSA8PCAwKSwKKwlRTUZMQUdTX05PX01VVEVYX0xPQ0sgICA9ICgxIDw8IDEpLAorCVFNRkxBR1NfTk9fTVVURVhfVU5MT0NLID0gKDEgPDwgMikKK307CisKKy8qIHdlIHJlcXVpcmUgdGhpcyBmb3IgY29uc2lzdGVuY3kgYmV0d2VlbiBlbmRwb2ludHMgKi8KK3ZjaGlxX3N0YXRpY19hc3NlcnQoc2l6ZW9mKFZDSElRX0hFQURFUl9UKSA9PSA4KTsKK3ZjaGlxX3N0YXRpY19hc3NlcnQoSVNfUE9XMihzaXplb2YoVkNISVFfSEVBREVSX1QpKSk7Cit2Y2hpcV9zdGF0aWNfYXNzZXJ0KElTX1BPVzIoVkNISVFfTlVNX0NVUlJFTlRfQlVMS1MpKTsKK3ZjaGlxX3N0YXRpY19hc3NlcnQoSVNfUE9XMihWQ0hJUV9OVU1fU0VSVklDRV9CVUxLUykpOwordmNoaXFfc3RhdGljX2Fzc2VydChJU19QT1cyKFZDSElRX01BWF9TRVJWSUNFUykpOwordmNoaXFfc3RhdGljX2Fzc2VydChWQ0hJUV9WRVJTSU9OID49IFZDSElRX1ZFUlNJT05fTUlOKTsKKworLyogUnVuIHRpbWUgY29udHJvbCBvZiBsb2cgbGV2ZWwsIGJhc2VkIG9uIEtFUk5fWFhYIGxldmVsLiAqLworaW50IHZjaGlxX2NvcmVfbG9nX2xldmVsID0gVkNISVFfTE9HX0RFRkFVTFQ7CitpbnQgdmNoaXFfY29yZV9tc2dfbG9nX2xldmVsID0gVkNISVFfTE9HX0RFRkFVTFQ7CitpbnQgdmNoaXFfc3luY19sb2dfbGV2ZWwgPSBWQ0hJUV9MT0dfREVGQVVMVDsKKworc3RhdGljIGF0b21pY190IHBhdXNlX2J1bGtzX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2VydmljZV9zcGlubG9jayk7CitERUZJTkVfU1BJTkxPQ0soYnVsa193YWl0ZXJfc3BpbmxvY2spOworREVGSU5FX1NQSU5MT0NLKHF1b3RhX3NwaW5sb2NrKTsKKworVkNISVFfU1RBVEVfVCAqdmNoaXFfc3RhdGVzW1ZDSElRX01BWF9TVEFURVNdOworc3RhdGljIHVuc2lnbmVkIGludCBoYW5kbGVfc2VxOworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3J2c3RhdGVfbmFtZXNbXSA9IHsKKwkiRlJFRSIsCisJIkhJRERFTiIsCisJIkxJU1RFTklORyIsCisJIk9QRU5JTkciLAorCSJPUEVOIiwKKwkiT1BFTlNZTkMiLAorCSJDTE9TRVNFTlQiLAorCSJDTE9TRVJFQ1ZEIiwKKwkiQ0xPU0VXQUlUIiwKKwkiQ0xPU0VEIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHJlYXNvbl9uYW1lc1tdID0geworCSJTRVJWSUNFX09QRU5FRCIsCisJIlNFUlZJQ0VfQ0xPU0VEIiwKKwkiTUVTU0FHRV9BVkFJTEFCTEUiLAorCSJCVUxLX1RSQU5TTUlUX0RPTkUiLAorCSJCVUxLX1JFQ0VJVkVfRE9ORSIsCisJIkJVTEtfVFJBTlNNSVRfQUJPUlRFRCIsCisJIkJVTEtfUkVDRUlWRV9BQk9SVEVEIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbm5fc3RhdGVfbmFtZXNbXSA9IHsKKwkiRElTQ09OTkVDVEVEIiwKKwkiQ09OTkVDVElORyIsCisJIkNPTk5FQ1RFRCIsCisJIlBBVVNJTkciLAorCSJQQVVTRV9TRU5UIiwKKwkiUEFVU0VEIiwKKwkiUkVTVU1JTkciLAorCSJQQVVTRV9USU1FT1VUIiwKKwkiUkVTVU1FX1RJTUVPVVQiCit9OworCisKK3N0YXRpYyB2b2lkCityZWxlYXNlX21lc3NhZ2Vfc3luYyhWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfSEVBREVSX1QgKmhlYWRlcik7CisKK3N0YXRpYyBjb25zdCBjaGFyICptc2dfdHlwZV9zdHIodW5zaWduZWQgaW50IG1zZ190eXBlKQoreworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIFZDSElRX01TR19QQURESU5HOiAgICAgICByZXR1cm4gIlBBRERJTkciOworCWNhc2UgVkNISVFfTVNHX0NPTk5FQ1Q6ICAgICAgIHJldHVybiAiQ09OTkVDVCI7CisJY2FzZSBWQ0hJUV9NU0dfT1BFTjogICAgICAgICAgcmV0dXJuICJPUEVOIjsKKwljYXNlIFZDSElRX01TR19PUEVOQUNLOiAgICAgICByZXR1cm4gIk9QRU5BQ0siOworCWNhc2UgVkNISVFfTVNHX0NMT1NFOiAgICAgICAgIHJldHVybiAiQ0xPU0UiOworCWNhc2UgVkNISVFfTVNHX0RBVEE6ICAgICAgICAgIHJldHVybiAiREFUQSI7CisJY2FzZSBWQ0hJUV9NU0dfQlVMS19SWDogICAgICAgcmV0dXJuICJCVUxLX1JYIjsKKwljYXNlIFZDSElRX01TR19CVUxLX1RYOiAgICAgICByZXR1cm4gIkJVTEtfVFgiOworCWNhc2UgVkNISVFfTVNHX0JVTEtfUlhfRE9ORTogIHJldHVybiAiQlVMS19SWF9ET05FIjsKKwljYXNlIFZDSElRX01TR19CVUxLX1RYX0RPTkU6ICByZXR1cm4gIkJVTEtfVFhfRE9ORSI7CisJY2FzZSBWQ0hJUV9NU0dfUEFVU0U6ICAgICAgICAgcmV0dXJuICJQQVVTRSI7CisJY2FzZSBWQ0hJUV9NU0dfUkVTVU1FOiAgICAgICAgcmV0dXJuICJSRVNVTUUiOworCWNhc2UgVkNISVFfTVNHX1JFTU9URV9VU0U6ICAgIHJldHVybiAiUkVNT1RFX1VTRSI7CisJY2FzZSBWQ0hJUV9NU0dfUkVNT1RFX1JFTEVBU0U6ICAgICAgcmV0dXJuICJSRU1PVEVfUkVMRUFTRSI7CisJY2FzZSBWQ0hJUV9NU0dfUkVNT1RFX1VTRV9BQ1RJVkU6ICAgcmV0dXJuICJSRU1PVEVfVVNFX0FDVElWRSI7CisJfQorCXJldHVybiAiPz8/IjsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit2Y2hpcV9zZXRfc2VydmljZV9zdGF0ZShWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIGludCBuZXdzdGF0ZSkKK3sKKwl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwgIiVkOiBzcnY6JWQgJXMtPiVzIiwKKwkJc2VydmljZS0+c3RhdGUtPmlkLCBzZXJ2aWNlLT5sb2NhbHBvcnQsCisJCXNydnN0YXRlX25hbWVzW3NlcnZpY2UtPnNydnN0YXRlXSwKKwkJc3J2c3RhdGVfbmFtZXNbbmV3c3RhdGVdKTsKKwlzZXJ2aWNlLT5zcnZzdGF0ZSA9IG5ld3N0YXRlOworfQorCitWQ0hJUV9TRVJWSUNFX1QgKgorZmluZF9zZXJ2aWNlX2J5X2hhbmRsZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSkKK3sKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2U7CisKKwlzcGluX2xvY2soJnNlcnZpY2Vfc3BpbmxvY2spOworCXNlcnZpY2UgPSBoYW5kbGVfdG9fc2VydmljZShoYW5kbGUpOworCWlmIChzZXJ2aWNlICYmIChzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9GUkVFKSAmJgorCQkoc2VydmljZS0+aGFuZGxlID09IGhhbmRsZSkpIHsKKwkJQlVHX09OKHNlcnZpY2UtPnJlZl9jb3VudCA9PSAwKTsKKwkJc2VydmljZS0+cmVmX2NvdW50Kys7CisJfSBlbHNlCisJCXNlcnZpY2UgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZzZXJ2aWNlX3NwaW5sb2NrKTsKKworCWlmICghc2VydmljZSkKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiSW52YWxpZCBzZXJ2aWNlIGhhbmRsZSAweCV4IiwgaGFuZGxlKTsKKworCXJldHVybiBzZXJ2aWNlOworfQorCitWQ0hJUV9TRVJWSUNFX1QgKgorZmluZF9zZXJ2aWNlX2J5X3BvcnQoVkNISVFfU1RBVEVfVCAqc3RhdGUsIGludCBsb2NhbHBvcnQpCit7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gTlVMTDsKKwlpZiAoKHVuc2lnbmVkIGludClsb2NhbHBvcnQgPD0gVkNISVFfUE9SVF9NQVgpIHsKKwkJc3Bpbl9sb2NrKCZzZXJ2aWNlX3NwaW5sb2NrKTsKKwkJc2VydmljZSA9IHN0YXRlLT5zZXJ2aWNlc1tsb2NhbHBvcnRdOworCQlpZiAoc2VydmljZSAmJiAoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfRlJFRSkpIHsKKwkJCUJVR19PTihzZXJ2aWNlLT5yZWZfY291bnQgPT0gMCk7CisJCQlzZXJ2aWNlLT5yZWZfY291bnQrKzsKKwkJfSBlbHNlCisJCQlzZXJ2aWNlID0gTlVMTDsKKwkJc3Bpbl91bmxvY2soJnNlcnZpY2Vfc3BpbmxvY2spOworCX0KKworCWlmICghc2VydmljZSkKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiSW52YWxpZCBwb3J0ICVkIiwgbG9jYWxwb3J0KTsKKworCXJldHVybiBzZXJ2aWNlOworfQorCitWQ0hJUV9TRVJWSUNFX1QgKgorZmluZF9zZXJ2aWNlX2Zvcl9pbnN0YW5jZShWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlLAorCVZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKSB7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlOworCisJc3Bpbl9sb2NrKCZzZXJ2aWNlX3NwaW5sb2NrKTsKKwlzZXJ2aWNlID0gaGFuZGxlX3RvX3NlcnZpY2UoaGFuZGxlKTsKKwlpZiAoc2VydmljZSAmJiAoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfRlJFRSkgJiYKKwkJKHNlcnZpY2UtPmhhbmRsZSA9PSBoYW5kbGUpICYmCisJCShzZXJ2aWNlLT5pbnN0YW5jZSA9PSBpbnN0YW5jZSkpIHsKKwkJQlVHX09OKHNlcnZpY2UtPnJlZl9jb3VudCA9PSAwKTsKKwkJc2VydmljZS0+cmVmX2NvdW50Kys7CisJfSBlbHNlCisJCXNlcnZpY2UgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZzZXJ2aWNlX3NwaW5sb2NrKTsKKworCWlmICghc2VydmljZSkKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiSW52YWxpZCBzZXJ2aWNlIGhhbmRsZSAweCV4IiwgaGFuZGxlKTsKKworCXJldHVybiBzZXJ2aWNlOworfQorCitWQ0hJUV9TRVJWSUNFX1QgKgorZmluZF9jbG9zZWRfc2VydmljZV9mb3JfaW5zdGFuY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSkgeworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKworCXNwaW5fbG9jaygmc2VydmljZV9zcGlubG9jayk7CisJc2VydmljZSA9IGhhbmRsZV90b19zZXJ2aWNlKGhhbmRsZSk7CisJaWYgKHNlcnZpY2UgJiYKKwkJKChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9GUkVFKSB8fAorCQkgKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0NMT1NFRCkpICYmCisJCShzZXJ2aWNlLT5oYW5kbGUgPT0gaGFuZGxlKSAmJgorCQkoc2VydmljZS0+aW5zdGFuY2UgPT0gaW5zdGFuY2UpKSB7CisJCUJVR19PTihzZXJ2aWNlLT5yZWZfY291bnQgPT0gMCk7CisJCXNlcnZpY2UtPnJlZl9jb3VudCsrOworCX0gZWxzZQorCQlzZXJ2aWNlID0gTlVMTDsKKwlzcGluX3VubG9jaygmc2VydmljZV9zcGlubG9jayk7CisKKwlpZiAoIXNlcnZpY2UpCisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJIkludmFsaWQgc2VydmljZSBoYW5kbGUgMHgleCIsIGhhbmRsZSk7CisKKwlyZXR1cm4gc2VydmljZTsKK30KKworVkNISVFfU0VSVklDRV9UICoKK25leHRfc2VydmljZV9ieV9pbnN0YW5jZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwKKwlpbnQgKnBpZHgpCit7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gTlVMTDsKKwlpbnQgaWR4ID0gKnBpZHg7CisKKwlzcGluX2xvY2soJnNlcnZpY2Vfc3BpbmxvY2spOworCXdoaWxlIChpZHggPCBzdGF0ZS0+dW51c2VkX3NlcnZpY2UpIHsKKwkJVkNISVFfU0VSVklDRV9UICpzcnYgPSBzdGF0ZS0+c2VydmljZXNbaWR4KytdOworCQlpZiAoc3J2ICYmIChzcnYtPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX0ZSRUUpICYmCisJCQkoc3J2LT5pbnN0YW5jZSA9PSBpbnN0YW5jZSkpIHsKKwkJCXNlcnZpY2UgPSBzcnY7CisJCQlCVUdfT04oc2VydmljZS0+cmVmX2NvdW50ID09IDApOworCQkJc2VydmljZS0+cmVmX2NvdW50Kys7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmc2VydmljZV9zcGlubG9jayk7CisKKwkqcGlkeCA9IGlkeDsKKworCXJldHVybiBzZXJ2aWNlOworfQorCit2b2lkCitsb2NrX3NlcnZpY2UoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKQoreworCXNwaW5fbG9jaygmc2VydmljZV9zcGlubG9jayk7CisJQlVHX09OKCFzZXJ2aWNlIHx8IChzZXJ2aWNlLT5yZWZfY291bnQgPT0gMCkpOworCWlmIChzZXJ2aWNlKQorCQlzZXJ2aWNlLT5yZWZfY291bnQrKzsKKwlzcGluX3VubG9jaygmc2VydmljZV9zcGlubG9jayk7Cit9CisKK3ZvaWQKK3VubG9ja19zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSkKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IHNlcnZpY2UtPnN0YXRlOworCXNwaW5fbG9jaygmc2VydmljZV9zcGlubG9jayk7CisJQlVHX09OKCFzZXJ2aWNlIHx8IChzZXJ2aWNlLT5yZWZfY291bnQgPT0gMCkpOworCWlmIChzZXJ2aWNlICYmIHNlcnZpY2UtPnJlZl9jb3VudCkgeworCQlzZXJ2aWNlLT5yZWZfY291bnQtLTsKKwkJaWYgKCFzZXJ2aWNlLT5yZWZfY291bnQpIHsKKwkJCUJVR19PTihzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9GUkVFKTsKKwkJCXN0YXRlLT5zZXJ2aWNlc1tzZXJ2aWNlLT5sb2NhbHBvcnRdID0gTlVMTDsKKwkJfSBlbHNlCisJCQlzZXJ2aWNlID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2soJnNlcnZpY2Vfc3BpbmxvY2spOworCisJaWYgKHNlcnZpY2UgJiYgc2VydmljZS0+dXNlcmRhdGFfdGVybSkKKwkJc2VydmljZS0+dXNlcmRhdGFfdGVybShzZXJ2aWNlLT5iYXNlLnVzZXJkYXRhKTsKKworCWtmcmVlKHNlcnZpY2UpOworfQorCitpbnQKK3ZjaGlxX2dldF9jbGllbnRfaWQoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpCit7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gZmluZF9zZXJ2aWNlX2J5X2hhbmRsZShoYW5kbGUpOworCWludCBpZDsKKworCWlkID0gc2VydmljZSA/IHNlcnZpY2UtPmNsaWVudF9pZCA6IDA7CisJaWYgKHNlcnZpY2UpCisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCisJcmV0dXJuIGlkOworfQorCit2b2lkICoKK3ZjaGlxX2dldF9zZXJ2aWNlX3VzZXJkYXRhKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKQoreworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGhhbmRsZV90b19zZXJ2aWNlKGhhbmRsZSk7CisKKwlyZXR1cm4gc2VydmljZSA/IHNlcnZpY2UtPmJhc2UudXNlcmRhdGEgOiBOVUxMOworfQorCitpbnQKK3ZjaGlxX2dldF9zZXJ2aWNlX2ZvdXJjYyhWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSkKK3sKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBoYW5kbGVfdG9fc2VydmljZShoYW5kbGUpOworCisJcmV0dXJuIHNlcnZpY2UgPyBzZXJ2aWNlLT5iYXNlLmZvdXJjYyA6IDA7Cit9CisKK3N0YXRpYyB2b2lkCittYXJrX3NlcnZpY2VfY2xvc2luZ19pbnRlcm5hbChWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIGludCBzaF90aHJlYWQpCit7CisJVkNISVFfU1RBVEVfVCAqc3RhdGUgPSBzZXJ2aWNlLT5zdGF0ZTsKKwlWQ0hJUV9TRVJWSUNFX1FVT1RBX1QgKnNlcnZpY2VfcXVvdGE7CisKKwlzZXJ2aWNlLT5jbG9zaW5nID0gMTsKKworCS8qIFN5bmNocm9uaXNlIHdpdGggb3RoZXIgdGhyZWFkcy4gKi8KKwltdXRleF9sb2NrKCZzdGF0ZS0+cmVjeWNsZV9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+cmVjeWNsZV9tdXRleCk7CisJaWYgKCFzaF90aHJlYWQgfHwgKHN0YXRlLT5jb25uX3N0YXRlICE9IFZDSElRX0NPTk5TVEFURV9QQVVTRV9TRU5UKSkgeworCQkvKiBJZiB3ZSdyZSBwYXVzaW5nIHRoZW4gdGhlIHNsb3RfbXV0ZXggaXMgaGVsZCB1bnRpbCByZXN1bWUKKwkJICogYnkgdGhlIHNsb3QgaGFuZGxlci4gIFRoZXJlZm9yZSBkb24ndCB0cnkgdG8gYWNxdWlyZSB0aGlzCisJCSAqIG11dGV4IGlmIHdlJ3JlIHRoZSBzbG90IGhhbmRsZXIgYW5kIGluIHRoZSBwYXVzZSBzZW50IHN0YXRlLgorCQkgKiBXZSBkb24ndCBuZWVkIHRvIGluIHRoaXMgY2FzZSBhbnl3YXkuICovCisJCW11dGV4X2xvY2soJnN0YXRlLT5zbG90X211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2xvdF9tdXRleCk7CisJfQorCisJLyogVW5ibG9jayBhbnkgc2VuZGluZyB0aHJlYWQuICovCisJc2VydmljZV9xdW90YSA9ICZzdGF0ZS0+c2VydmljZV9xdW90YXNbc2VydmljZS0+bG9jYWxwb3J0XTsKKwl1cCgmc2VydmljZV9xdW90YS0+cXVvdGFfZXZlbnQpOworfQorCitzdGF0aWMgdm9pZAorbWFya19zZXJ2aWNlX2Nsb3NpbmcoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKQoreworCW1hcmtfc2VydmljZV9jbG9zaW5nX2ludGVybmFsKHNlcnZpY2UsIDApOworfQorCitzdGF0aWMgaW5saW5lIFZDSElRX1NUQVRVU19UCittYWtlX3NlcnZpY2VfY2FsbGJhY2soVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLCBWQ0hJUV9SRUFTT05fVCByZWFzb24sCisJVkNISVFfSEVBREVSX1QgKmhlYWRlciwgdm9pZCAqYnVsa191c2VyZGF0YSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXM7CisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLCAiJWQ6IGNhbGxiYWNrOiVkICglcywgJXgsICV4KSIsCisJCXNlcnZpY2UtPnN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0LCByZWFzb25fbmFtZXNbcmVhc29uXSwKKwkJKHVuc2lnbmVkIGludCloZWFkZXIsICh1bnNpZ25lZCBpbnQpYnVsa191c2VyZGF0YSk7CisJc3RhdHVzID0gc2VydmljZS0+YmFzZS5jYWxsYmFjayhyZWFzb24sIGhlYWRlciwgc2VydmljZS0+aGFuZGxlLAorCQlidWxrX3VzZXJkYXRhKTsKKwlpZiAoc3RhdHVzID09IFZDSElRX0VSUk9SKSB7CisJCXZjaGlxX2xvZ193YXJuaW5nKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJIiVkOiBpZ25vcmluZyBFUlJPUiBmcm9tIGNhbGxiYWNrIHRvIHNlcnZpY2UgJXgiLAorCQkJc2VydmljZS0+c3RhdGUtPmlkLCBzZXJ2aWNlLT5oYW5kbGUpOworCQlzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitpbmxpbmUgdm9pZAordmNoaXFfc2V0X2Nvbm5fc3RhdGUoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX0NPTk5TVEFURV9UIG5ld3N0YXRlKQoreworCVZDSElRX0NPTk5TVEFURV9UIG9sZHN0YXRlID0gc3RhdGUtPmNvbm5fc3RhdGU7CisJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsICIlZDogJXMtPiVzIiwgc3RhdGUtPmlkLAorCQljb25uX3N0YXRlX25hbWVzW29sZHN0YXRlXSwKKwkJY29ubl9zdGF0ZV9uYW1lc1tuZXdzdGF0ZV0pOworCXN0YXRlLT5jb25uX3N0YXRlID0gbmV3c3RhdGU7CisJdmNoaXFfcGxhdGZvcm1fY29ubl9zdGF0ZV9jaGFuZ2VkKHN0YXRlLCBvbGRzdGF0ZSwgbmV3c3RhdGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3JlbW90ZV9ldmVudF9jcmVhdGUoUkVNT1RFX0VWRU5UX1QgKmV2ZW50KQoreworCWV2ZW50LT5hcm1lZCA9IDA7CisJLyogRG9uJ3QgY2xlYXIgdGhlICdmaXJlZCcgZmxhZyBiZWNhdXNlIGl0IG1heSBhbHJlYWR5IGhhdmUgYmVlbiBzZXQKKwkqKiBieSB0aGUgb3RoZXIgc2lkZS4gKi8KKwlzZW1hX2luaXQoZXZlbnQtPmV2ZW50LCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCityZW1vdGVfZXZlbnRfZGVzdHJveShSRU1PVEVfRVZFTlRfVCAqZXZlbnQpCit7CisJKHZvaWQpZXZlbnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CityZW1vdGVfZXZlbnRfd2FpdChSRU1PVEVfRVZFTlRfVCAqZXZlbnQpCit7CisJaWYgKCFldmVudC0+ZmlyZWQpIHsKKwkJZXZlbnQtPmFybWVkID0gMTsKKwkJZHNiKCk7CisJCWlmICghZXZlbnQtPmZpcmVkKSB7CisJCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKGV2ZW50LT5ldmVudCkgIT0gMCkgeworCQkJCWV2ZW50LT5hcm1lZCA9IDA7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJZXZlbnQtPmFybWVkID0gMDsKKwkJd21iKCk7CisJfQorCisJZXZlbnQtPmZpcmVkID0gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCityZW1vdGVfZXZlbnRfc2lnbmFsX2xvY2FsKFJFTU9URV9FVkVOVF9UICpldmVudCkKK3sKKwlldmVudC0+YXJtZWQgPSAwOworCXVwKGV2ZW50LT5ldmVudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcmVtb3RlX2V2ZW50X3BvbGwoUkVNT1RFX0VWRU5UX1QgKmV2ZW50KQoreworCWlmIChldmVudC0+ZmlyZWQgJiYgZXZlbnQtPmFybWVkKQorCQlyZW1vdGVfZXZlbnRfc2lnbmFsX2xvY2FsKGV2ZW50KTsKK30KKwordm9pZAorcmVtb3RlX2V2ZW50X3BvbGxhbGwoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJcmVtb3RlX2V2ZW50X3BvbGwoJnN0YXRlLT5sb2NhbC0+c3luY190cmlnZ2VyKTsKKwlyZW1vdGVfZXZlbnRfcG9sbCgmc3RhdGUtPmxvY2FsLT5zeW5jX3JlbGVhc2UpOworCXJlbW90ZV9ldmVudF9wb2xsKCZzdGF0ZS0+bG9jYWwtPnRyaWdnZXIpOworCXJlbW90ZV9ldmVudF9wb2xsKCZzdGF0ZS0+bG9jYWwtPnJlY3ljbGUpOworfQorCisvKiBSb3VuZCB1cCBtZXNzYWdlIHNpemVzIHNvIHRoYXQgYW55IHNwYWNlIGF0IHRoZSBlbmQgb2YgYSBzbG90IGlzIGFsd2F5cyBiaWcKKyoqIGVub3VnaCBmb3IgYSBoZWFkZXIuIFRoaXMgcmVsaWVzIG9uIGhlYWRlciBzaXplIGJlaW5nIGEgcG93ZXIgb2YgdHdvLCB3aGljaAorKiogaGFzIGJlZW4gdmVyaWZpZWQgZWFybGllciBieSBhIHN0YXRpYyBhc3NlcnRpb24uICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitjYWxjX3N0cmlkZSh1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwkvKiBBbGxvdyByb29tIGZvciB0aGUgaGVhZGVyICovCisJc2l6ZSArPSBzaXplb2YoVkNISVFfSEVBREVSX1QpOworCisJLyogUm91bmQgdXAgKi8KKwlyZXR1cm4gKHNpemUgKyBzaXplb2YoVkNISVFfSEVBREVSX1QpIC0gMSkgJiB+KHNpemVvZihWQ0hJUV9IRUFERVJfVCkKKwkJLSAxKTsKK30KKworLyogQ2FsbGVkIGJ5IHRoZSBzbG90IGhhbmRsZXIgdGhyZWFkICovCitzdGF0aWMgVkNISVFfU0VSVklDRV9UICoKK2dldF9saXN0ZW5pbmdfc2VydmljZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgaW50IGZvdXJjYykKK3sKKwlpbnQgaTsKKworCVdBUk5fT04oZm91cmNjID09IFZDSElRX0ZPVVJDQ19JTlZBTElEKTsKKworCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+dW51c2VkX3NlcnZpY2U7IGkrKykgeworCQlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBzdGF0ZS0+c2VydmljZXNbaV07CisJCWlmIChzZXJ2aWNlICYmCisJCQkoc2VydmljZS0+cHVibGljX2ZvdXJjYyA9PSBmb3VyY2MpICYmCisJCQkoKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0xJU1RFTklORykgfHwKKwkJCSgoc2VydmljZS0+c3J2c3RhdGUgPT0gVkNISVFfU1JWU1RBVEVfT1BFTikgJiYKKwkJCShzZXJ2aWNlLT5yZW1vdGVwb3J0ID09IFZDSElRX1BPUlRfRlJFRSkpKSkgeworCQkJbG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQkJcmV0dXJuIHNlcnZpY2U7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogQ2FsbGVkIGJ5IHRoZSBzbG90IGhhbmRsZXIgdGhyZWFkICovCitzdGF0aWMgVkNISVFfU0VSVklDRV9UICoKK2dldF9jb25uZWN0ZWRfc2VydmljZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgdW5zaWduZWQgaW50IHBvcnQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHN0YXRlLT51bnVzZWRfc2VydmljZTsgaSsrKSB7CisJCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IHN0YXRlLT5zZXJ2aWNlc1tpXTsKKwkJaWYgKHNlcnZpY2UgJiYgKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX09QRU4pCisJCQkmJiAoc2VydmljZS0+cmVtb3RlcG9ydCA9PSBwb3J0KSkgeworCQkJbG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQkJcmV0dXJuIHNlcnZpY2U7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK2lubGluZSB2b2lkCityZXF1ZXN0X3BvbGwoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSwgaW50IHBvbGxfdHlwZSkKK3sKKwl1aW50MzJfdCB2YWx1ZTsKKworCWlmIChzZXJ2aWNlKSB7CisJCWRvIHsKKwkJCXZhbHVlID0gYXRvbWljX3JlYWQoJnNlcnZpY2UtPnBvbGxfZmxhZ3MpOworCQl9IHdoaWxlIChhdG9taWNfY21weGNoZygmc2VydmljZS0+cG9sbF9mbGFncywgdmFsdWUsCisJCQl2YWx1ZSB8ICgxIDw8IHBvbGxfdHlwZSkpICE9IHZhbHVlKTsKKworCQlkbyB7CisJCQl2YWx1ZSA9IGF0b21pY19yZWFkKCZzdGF0ZS0+cG9sbF9zZXJ2aWNlc1sKKwkJCQlzZXJ2aWNlLT5sb2NhbHBvcnQ+PjVdKTsKKwkJfSB3aGlsZSAoYXRvbWljX2NtcHhjaGcoCisJCQkmc3RhdGUtPnBvbGxfc2VydmljZXNbc2VydmljZS0+bG9jYWxwb3J0Pj41XSwKKwkJCXZhbHVlLCB2YWx1ZSB8ICgxIDw8IChzZXJ2aWNlLT5sb2NhbHBvcnQgJiAweDFmKSkpCisJCQkhPSB2YWx1ZSk7CisJfQorCisJc3RhdGUtPnBvbGxfbmVlZGVkID0gMTsKKwl3bWIoKTsKKworCS8qIC4uLiBhbmQgZW5zdXJlIHRoZSBzbG90IGhhbmRsZXIgcnVucy4gKi8KKwlyZW1vdGVfZXZlbnRfc2lnbmFsX2xvY2FsKCZzdGF0ZS0+bG9jYWwtPnRyaWdnZXIpOworfQorCisvKiBDYWxsZWQgZnJvbSBxdWV1ZV9tZXNzYWdlLCBieSB0aGUgc2xvdCBoYW5kbGVyIGFuZCBhcHBsaWNhdGlvbiB0aHJlYWRzLAorKiogd2l0aCBzbG90X211dGV4IGhlbGQgKi8KK3N0YXRpYyBWQ0hJUV9IRUFERVJfVCAqCityZXNlcnZlX3NwYWNlKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBpbnQgc3BhY2UsIGludCBpc19ibG9ja2luZykKK3sKKwlWQ0hJUV9TSEFSRURfU1RBVEVfVCAqbG9jYWwgPSBzdGF0ZS0+bG9jYWw7CisJaW50IHR4X3BvcyA9IHN0YXRlLT5sb2NhbF90eF9wb3M7CisJaW50IHNsb3Rfc3BhY2UgPSBWQ0hJUV9TTE9UX1NJWkUgLSAodHhfcG9zICYgVkNISVFfU0xPVF9NQVNLKTsKKworCWlmIChzcGFjZSA+IHNsb3Rfc3BhY2UpIHsKKwkJVkNISVFfSEVBREVSX1QgKmhlYWRlcjsKKwkJLyogRmlsbCB0aGUgcmVtYWluaW5nIHNwYWNlIHdpdGggcGFkZGluZyAqLworCQlXQVJOX09OKHN0YXRlLT50eF9kYXRhID09IE5VTEwpOworCQloZWFkZXIgPSAoVkNISVFfSEVBREVSX1QgKikKKwkJCShzdGF0ZS0+dHhfZGF0YSArICh0eF9wb3MgJiBWQ0hJUV9TTE9UX01BU0spKTsKKwkJaGVhZGVyLT5tc2dpZCA9IFZDSElRX01TR0lEX1BBRERJTkc7CisJCWhlYWRlci0+c2l6ZSA9IHNsb3Rfc3BhY2UgLSBzaXplb2YoVkNISVFfSEVBREVSX1QpOworCisJCXR4X3BvcyArPSBzbG90X3NwYWNlOworCX0KKworCS8qIElmIG5lY2Vzc2FyeSwgZ2V0IHRoZSBuZXh0IHNsb3QuICovCisJaWYgKCh0eF9wb3MgJiBWQ0hJUV9TTE9UX01BU0spID09IDApIHsKKwkJaW50IHNsb3RfaW5kZXg7CisKKwkJLyogSWYgdGhlcmUgaXMgbm8gZnJlZSBzbG90Li4uICovCisKKwkJaWYgKGRvd25fdHJ5bG9jaygmc3RhdGUtPnNsb3RfYXZhaWxhYmxlX2V2ZW50KSAhPSAwKSB7CisJCQkvKiAuLi53YWl0IGZvciBvbmUuICovCisKKwkJCVZDSElRX1NUQVRTX0lOQyhzdGF0ZSwgc2xvdF9zdGFsbHMpOworCisJCQkvKiBCdXQgZmlyc3QsIGZsdXNoIHRocm91Z2ggdGhlIGxhc3Qgc2xvdC4gKi8KKwkJCXN0YXRlLT5sb2NhbF90eF9wb3MgPSB0eF9wb3M7CisJCQlsb2NhbC0+dHhfcG9zID0gdHhfcG9zOworCQkJcmVtb3RlX2V2ZW50X3NpZ25hbCgmc3RhdGUtPnJlbW90ZS0+dHJpZ2dlcik7CisKKwkJCWlmICghaXNfYmxvY2tpbmcgfHwKKwkJCQkoZG93bl9pbnRlcnJ1cHRpYmxlKAorCQkJCSZzdGF0ZS0+c2xvdF9hdmFpbGFibGVfZXZlbnQpICE9IDApKQorCQkJCXJldHVybiBOVUxMOyAvKiBObyBzcGFjZSBhdmFpbGFibGUgKi8KKwkJfQorCisJCUJVR19PTih0eF9wb3MgPT0KKwkJCShzdGF0ZS0+c2xvdF9xdWV1ZV9hdmFpbGFibGUgKiBWQ0hJUV9TTE9UX1NJWkUpKTsKKworCQlzbG90X2luZGV4ID0gbG9jYWwtPnNsb3RfcXVldWVbCisJCQlTTE9UX1FVRVVFX0lOREVYX0ZST01fUE9TKHR4X3BvcykgJgorCQkJVkNISVFfU0xPVF9RVUVVRV9NQVNLXTsKKwkJc3RhdGUtPnR4X2RhdGEgPQorCQkJKGNoYXIgKilTTE9UX0RBVEFfRlJPTV9JTkRFWChzdGF0ZSwgc2xvdF9pbmRleCk7CisJfQorCisJc3RhdGUtPmxvY2FsX3R4X3BvcyA9IHR4X3BvcyArIHNwYWNlOworCisJcmV0dXJuIChWQ0hJUV9IRUFERVJfVCAqKShzdGF0ZS0+dHhfZGF0YSArICh0eF9wb3MgJiBWQ0hJUV9TTE9UX01BU0spKTsKK30KKworLyogQ2FsbGVkIGJ5IHRoZSByZWN5Y2xlIHRocmVhZC4gKi8KK3N0YXRpYyB2b2lkCitwcm9jZXNzX2ZyZWVfcXVldWUoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfU0hBUkVEX1NUQVRFX1QgKmxvY2FsID0gc3RhdGUtPmxvY2FsOworCUJJVFNFVF9UIHNlcnZpY2VfZm91bmRbQklUU0VUX1NJWkUoVkNISVFfTUFYX1NFUlZJQ0VTKV07CisJaW50IHNsb3RfcXVldWVfYXZhaWxhYmxlOworCisJLyogVXNlIGEgcmVhZCBtZW1vcnkgYmFycmllciB0byBlbnN1cmUgdGhhdCBhbnkgc3RhdGUgdGhhdCBtYXkgaGF2ZQorCSoqIGJlZW4gbW9kaWZpZWQgYnkgYW5vdGhlciB0aHJlYWQgaXMgbm90IG1hc2tlZCBieSBzdGFsZSBwcmVmZXRjaGVkCisJKiogdmFsdWVzLiAqLworCXJtYigpOworCisJLyogRmluZCBzbG90cyB3aGljaCBoYXZlIGJlZW4gZnJlZWQgYnkgdGhlIG90aGVyIHNpZGUsIGFuZCByZXR1cm4gdGhlbQorCSoqIHRvIHRoZSBhdmFpbGFibGUgcXVldWUuICovCisJc2xvdF9xdWV1ZV9hdmFpbGFibGUgPSBzdGF0ZS0+c2xvdF9xdWV1ZV9hdmFpbGFibGU7CisKKwl3aGlsZSAoc2xvdF9xdWV1ZV9hdmFpbGFibGUgIT0gbG9jYWwtPnNsb3RfcXVldWVfcmVjeWNsZSkgeworCQl1bnNpZ25lZCBpbnQgcG9zOworCQlpbnQgc2xvdF9pbmRleCA9IGxvY2FsLT5zbG90X3F1ZXVlW3Nsb3RfcXVldWVfYXZhaWxhYmxlKysgJgorCQkJVkNISVFfU0xPVF9RVUVVRV9NQVNLXTsKKwkJY2hhciAqZGF0YSA9IChjaGFyICopU0xPVF9EQVRBX0ZST01fSU5ERVgoc3RhdGUsIHNsb3RfaW5kZXgpOworCQlpbnQgZGF0YV9mb3VuZCA9IDA7CisKKwkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLCAiJWQ6IHBmcSAlZD0leCAleCAleCIsCisJCQlzdGF0ZS0+aWQsIHNsb3RfaW5kZXgsICh1bnNpZ25lZCBpbnQpZGF0YSwKKwkJCWxvY2FsLT5zbG90X3F1ZXVlX3JlY3ljbGUsIHNsb3RfcXVldWVfYXZhaWxhYmxlKTsKKworCQkvKiBJbml0aWFsaXNlIHRoZSBiaXRtYXNrIGZvciBzZXJ2aWNlcyB3aGljaCBoYXZlIHVzZWQgdGhpcworCQkqKiBzbG90ICovCisJCUJJVFNFVF9aRVJPKHNlcnZpY2VfZm91bmQpOworCisJCXBvcyA9IDA7CisKKwkJd2hpbGUgKHBvcyA8IFZDSElRX1NMT1RfU0laRSkgeworCQkJVkNISVFfSEVBREVSX1QgKmhlYWRlciA9CisJCQkJKFZDSElRX0hFQURFUl9UICopKGRhdGEgKyBwb3MpOworCQkJaW50IG1zZ2lkID0gaGVhZGVyLT5tc2dpZDsKKwkJCWlmIChWQ0hJUV9NU0dfVFlQRShtc2dpZCkgPT0gVkNISVFfTVNHX0RBVEEpIHsKKwkJCQlpbnQgcG9ydCA9IFZDSElRX01TR19TUkNQT1JUKG1zZ2lkKTsKKwkJCQlWQ0hJUV9TRVJWSUNFX1FVT1RBX1QgKnNlcnZpY2VfcXVvdGEgPQorCQkJCQkmc3RhdGUtPnNlcnZpY2VfcXVvdGFzW3BvcnRdOworCQkJCWludCBjb3VudDsKKwkJCQlzcGluX2xvY2soJnF1b3RhX3NwaW5sb2NrKTsKKwkJCQljb3VudCA9IHNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfdXNlX2NvdW50OworCQkJCWlmIChjb3VudCA+IDApCisJCQkJCXNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfdXNlX2NvdW50ID0KKwkJCQkJCWNvdW50IC0gMTsKKwkJCQlzcGluX3VubG9jaygmcXVvdGFfc3BpbmxvY2spOworCisJCQkJaWYgKGNvdW50ID09IHNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfcXVvdGEpCisJCQkJCS8qIFNpZ25hbCB0aGUgc2VydmljZSB0aGF0IGl0CisJCQkJCSoqIGhhcyBkcm9wcGVkIGJlbG93IGl0cyBxdW90YQorCQkJCQkqLworCQkJCQl1cCgmc2VydmljZV9xdW90YS0+cXVvdGFfZXZlbnQpOworCQkJCWVsc2UgaWYgKGNvdW50ID09IDApIHsKKwkJCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkJInNlcnZpY2UgJWQgIgorCQkJCQkJIm1lc3NhZ2VfdXNlX2NvdW50PSVkICIKKwkJCQkJCSIoaGVhZGVyICV4LCBtc2dpZCAleCwgIgorCQkJCQkJImhlYWRlci0+bXNnaWQgJXgsICIKKwkJCQkJCSJoZWFkZXItPnNpemUgJXgpIiwKKwkJCQkJCXBvcnQsCisJCQkJCQlzZXJ2aWNlX3F1b3RhLT4KKwkJCQkJCQltZXNzYWdlX3VzZV9jb3VudCwKKwkJCQkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyLCBtc2dpZCwKKwkJCQkJCWhlYWRlci0+bXNnaWQsCisJCQkJCQloZWFkZXItPnNpemUpOworCQkJCQlXQVJOKDEsICJpbnZhbGlkIG1lc3NhZ2UgdXNlIGNvdW50XG4iKTsKKwkJCQl9CisJCQkJaWYgKCFCSVRTRVRfSVNfU0VUKHNlcnZpY2VfZm91bmQsIHBvcnQpKSB7CisJCQkJCS8qIFNldCB0aGUgZm91bmQgYml0IGZvciB0aGlzIHNlcnZpY2UgKi8KKwkJCQkJQklUU0VUX1NFVChzZXJ2aWNlX2ZvdW5kLCBwb3J0KTsKKworCQkJCQlzcGluX2xvY2soJnF1b3RhX3NwaW5sb2NrKTsKKwkJCQkJY291bnQgPSBzZXJ2aWNlX3F1b3RhLT5zbG90X3VzZV9jb3VudDsKKwkJCQkJaWYgKGNvdW50ID4gMCkKKwkJCQkJCXNlcnZpY2VfcXVvdGEtPnNsb3RfdXNlX2NvdW50ID0KKwkJCQkJCQljb3VudCAtIDE7CisJCQkJCXNwaW5fdW5sb2NrKCZxdW90YV9zcGlubG9jayk7CisKKwkJCQkJaWYgKGNvdW50ID4gMCkgeworCQkJCQkJLyogU2lnbmFsIHRoZSBzZXJ2aWNlIGluIGNhc2UKKwkJCQkJCSoqIGl0IGhhcyBkcm9wcGVkIGJlbG93IGl0cworCQkJCQkJKiogcXVvdGEgKi8KKwkJCQkJCXVwKCZzZXJ2aWNlX3F1b3RhLT5xdW90YV9ldmVudCk7CisJCQkJCQl2Y2hpcV9sb2dfdHJhY2UoCisJCQkJCQkJdmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCQkJIiVkOiBwZnE6JWQgJXhAJXggLSAiCisJCQkJCQkJInNsb3RfdXNlLT4lZCIsCisJCQkJCQkJc3RhdGUtPmlkLCBwb3J0LAorCQkJCQkJCWhlYWRlci0+c2l6ZSwKKwkJCQkJCQkodW5zaWduZWQgaW50KWhlYWRlciwKKwkJCQkJCQljb3VudCAtIDEpOworCQkJCQl9IGVsc2UgeworCQkJCQkJdmNoaXFfbG9nX2Vycm9yKAorCQkJCQkJCXZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkJCQkic2VydmljZSAlZCAiCisJCQkJCQkJCSJzbG90X3VzZV9jb3VudCIKKwkJCQkJCQkJIj0lZCAoaGVhZGVyICV4IgorCQkJCQkJCQkiLCBtc2dpZCAleCwgIgorCQkJCQkJCQkiaGVhZGVyLT5tc2dpZCIKKwkJCQkJCQkJIiAleCwgaGVhZGVyLT4iCisJCQkJCQkJCSJzaXplICV4KSIsCisJCQkJCQkJcG9ydCwgY291bnQsCisJCQkJCQkJKHVuc2lnbmVkIGludCloZWFkZXIsCisJCQkJCQkJbXNnaWQsCisJCQkJCQkJaGVhZGVyLT5tc2dpZCwKKwkJCQkJCQloZWFkZXItPnNpemUpOworCQkJCQkJV0FSTigxLCAiYmFkIHNsb3QgdXNlIGNvdW50XG4iKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWRhdGFfZm91bmQgPSAxOworCQkJfQorCisJCQlwb3MgKz0gY2FsY19zdHJpZGUoaGVhZGVyLT5zaXplKTsKKwkJCWlmIChwb3MgPiBWQ0hJUV9TTE9UX1NJWkUpIHsKKwkJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCSJwZnEgLSBwb3MgJXg6IGhlYWRlciAleCwgbXNnaWQgJXgsICIKKwkJCQkJImhlYWRlci0+bXNnaWQgJXgsIGhlYWRlci0+c2l6ZSAleCIsCisJCQkJCXBvcywgKHVuc2lnbmVkIGludCloZWFkZXIsIG1zZ2lkLAorCQkJCQloZWFkZXItPm1zZ2lkLCBoZWFkZXItPnNpemUpOworCQkJCVdBUk4oMSwgImludmFsaWQgc2xvdCBwb3NpdGlvblxuIik7CisJCQl9CisJCX0KKworCQlpZiAoZGF0YV9mb3VuZCkgeworCQkJaW50IGNvdW50OworCQkJc3Bpbl9sb2NrKCZxdW90YV9zcGlubG9jayk7CisJCQljb3VudCA9IHN0YXRlLT5kYXRhX3VzZV9jb3VudDsKKwkJCWlmIChjb3VudCA+IDApCisJCQkJc3RhdGUtPmRhdGFfdXNlX2NvdW50ID0KKwkJCQkJY291bnQgLSAxOworCQkJc3Bpbl91bmxvY2soJnF1b3RhX3NwaW5sb2NrKTsKKwkJCWlmIChjb3VudCA9PSBzdGF0ZS0+ZGF0YV9xdW90YSkKKwkJCQl1cCgmc3RhdGUtPmRhdGFfcXVvdGFfZXZlbnQpOworCQl9CisKKwkJc3RhdGUtPnNsb3RfcXVldWVfYXZhaWxhYmxlID0gc2xvdF9xdWV1ZV9hdmFpbGFibGU7CisJCXVwKCZzdGF0ZS0+c2xvdF9hdmFpbGFibGVfZXZlbnQpOworCX0KK30KKworLyogQ2FsbGVkIGJ5IHRoZSBzbG90IGhhbmRsZXIgYW5kIGFwcGxpY2F0aW9uIHRocmVhZHMgKi8KK3N0YXRpYyBWQ0hJUV9TVEFUVVNfVAorcXVldWVfbWVzc2FnZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLAorCWludCBtc2dpZCwgY29uc3QgVkNISVFfRUxFTUVOVF9UICplbGVtZW50cywKKwlpbnQgY291bnQsIGludCBzaXplLCBpbnQgZmxhZ3MpCit7CisJVkNISVFfU0hBUkVEX1NUQVRFX1QgKmxvY2FsOworCVZDSElRX1NFUlZJQ0VfUVVPVEFfVCAqc2VydmljZV9xdW90YSA9IE5VTEw7CisJVkNISVFfSEVBREVSX1QgKmhlYWRlcjsKKwlpbnQgdHlwZSA9IFZDSElRX01TR19UWVBFKG1zZ2lkKTsKKworCXVuc2lnbmVkIGludCBzdHJpZGU7CisKKwlsb2NhbCA9IHN0YXRlLT5sb2NhbDsKKworCXN0cmlkZSA9IGNhbGNfc3RyaWRlKHNpemUpOworCisJV0FSTl9PTighKHN0cmlkZSA8PSBWQ0hJUV9TTE9UX1NJWkUpKTsKKworCWlmICghKGZsYWdzICYgUU1GTEFHU19OT19NVVRFWF9MT0NLKSAmJgorCQkobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+c2xvdF9tdXRleCkgIT0gMCkpCisJCXJldHVybiBWQ0hJUV9SRVRSWTsKKworCWlmICh0eXBlID09IFZDSElRX01TR19EQVRBKSB7CisJCWludCB0eF9lbmRfaW5kZXg7CisKKwkJQlVHX09OKCFzZXJ2aWNlKTsKKwkJQlVHX09OKChmbGFncyAmIChRTUZMQUdTX05PX01VVEVYX0xPQ0sgfAorCQkJCSBRTUZMQUdTX05PX01VVEVYX1VOTE9DSykpICE9IDApOworCisJCWlmIChzZXJ2aWNlLT5jbG9zaW5nKSB7CisJCQkvKiBUaGUgc2VydmljZSBoYXMgYmVlbiBjbG9zZWQgKi8KKwkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCQkJcmV0dXJuIFZDSElRX0VSUk9SOworCQl9CisKKwkJc2VydmljZV9xdW90YSA9ICZzdGF0ZS0+c2VydmljZV9xdW90YXNbc2VydmljZS0+bG9jYWxwb3J0XTsKKworCQlzcGluX2xvY2soJnF1b3RhX3NwaW5sb2NrKTsKKworCQkvKiBFbnN1cmUgdGhpcyBzZXJ2aWNlIGRvZXNuJ3QgdXNlIG1vcmUgdGhhbiBpdHMgcXVvdGEgb2YKKwkJKiogbWVzc2FnZXMgb3Igc2xvdHMgKi8KKwkJdHhfZW5kX2luZGV4ID0gU0xPVF9RVUVVRV9JTkRFWF9GUk9NX1BPUygKKwkJCXN0YXRlLT5sb2NhbF90eF9wb3MgKyBzdHJpZGUgLSAxKTsKKworCQkvKiBFbnN1cmUgZGF0YSBtZXNzYWdlcyBkb24ndCB1c2UgbW9yZSB0aGFuIHRoZWlyIHF1b3RhIG9mCisJCSoqIHNsb3RzICovCisJCXdoaWxlICgodHhfZW5kX2luZGV4ICE9IHN0YXRlLT5wcmV2aW91c19kYXRhX2luZGV4KSAmJgorCQkJKHN0YXRlLT5kYXRhX3VzZV9jb3VudCA9PSBzdGF0ZS0+ZGF0YV9xdW90YSkpIHsKKwkJCVZDSElRX1NUQVRTX0lOQyhzdGF0ZSwgZGF0YV9zdGFsbHMpOworCQkJc3Bpbl91bmxvY2soJnF1b3RhX3NwaW5sb2NrKTsKKwkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCisJCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+ZGF0YV9xdW90YV9ldmVudCkKKwkJCQkhPSAwKQorCQkJCXJldHVybiBWQ0hJUV9SRVRSWTsKKworCQkJbXV0ZXhfbG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCQkJc3Bpbl9sb2NrKCZxdW90YV9zcGlubG9jayk7CisJCQl0eF9lbmRfaW5kZXggPSBTTE9UX1FVRVVFX0lOREVYX0ZST01fUE9TKAorCQkJCXN0YXRlLT5sb2NhbF90eF9wb3MgKyBzdHJpZGUgLSAxKTsKKwkJCWlmICgodHhfZW5kX2luZGV4ID09IHN0YXRlLT5wcmV2aW91c19kYXRhX2luZGV4KSB8fAorCQkJCShzdGF0ZS0+ZGF0YV91c2VfY291bnQgPCBzdGF0ZS0+ZGF0YV9xdW90YSkpIHsKKwkJCQkvKiBQYXNzIHRoZSBzaWduYWwgb24gdG8gb3RoZXIgd2FpdGVycyAqLworCQkJCXVwKCZzdGF0ZS0+ZGF0YV9xdW90YV9ldmVudCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQl3aGlsZSAoKHNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfdXNlX2NvdW50ID09CisJCQkJc2VydmljZV9xdW90YS0+bWVzc2FnZV9xdW90YSkgfHwKKwkJCSgodHhfZW5kX2luZGV4ICE9IHNlcnZpY2VfcXVvdGEtPnByZXZpb3VzX3R4X2luZGV4KSAmJgorCQkJKHNlcnZpY2VfcXVvdGEtPnNsb3RfdXNlX2NvdW50ID09CisJCQkJc2VydmljZV9xdW90YS0+c2xvdF9xdW90YSkpKSB7CisJCQlzcGluX3VubG9jaygmcXVvdGFfc3BpbmxvY2spOworCQkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCSIlZDogcW06JWQgJXMsJXggLSBxdW90YSBzdGFsbCAiCisJCQkJIihtc2cgJWQsIHNsb3QgJWQpIiwKKwkJCQlzdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCQltc2dfdHlwZV9zdHIodHlwZSksIHNpemUsCisJCQkJc2VydmljZV9xdW90YS0+bWVzc2FnZV91c2VfY291bnQsCisJCQkJc2VydmljZV9xdW90YS0+c2xvdF91c2VfY291bnQpOworCQkJVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwgcXVvdGFfc3RhbGxzKTsKKwkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCQkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc2VydmljZV9xdW90YS0+cXVvdGFfZXZlbnQpCisJCQkJIT0gMCkKKwkJCQlyZXR1cm4gVkNISVFfUkVUUlk7CisJCQlpZiAoc2VydmljZS0+Y2xvc2luZykKKwkJCQlyZXR1cm4gVkNISVFfRVJST1I7CisJCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+c2xvdF9tdXRleCkgIT0gMCkKKwkJCQlyZXR1cm4gVkNISVFfUkVUUlk7CisJCQlpZiAoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfT1BFTikgeworCQkJCS8qIFRoZSBzZXJ2aWNlIGhhcyBiZWVuIGNsb3NlZCAqLworCQkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCQkJCXJldHVybiBWQ0hJUV9FUlJPUjsKKwkJCX0KKwkJCXNwaW5fbG9jaygmcXVvdGFfc3BpbmxvY2spOworCQkJdHhfZW5kX2luZGV4ID0gU0xPVF9RVUVVRV9JTkRFWF9GUk9NX1BPUygKKwkJCQlzdGF0ZS0+bG9jYWxfdHhfcG9zICsgc3RyaWRlIC0gMSk7CisJCX0KKworCQlzcGluX3VubG9jaygmcXVvdGFfc3BpbmxvY2spOworCX0KKworCWhlYWRlciA9IHJlc2VydmVfc3BhY2Uoc3RhdGUsIHN0cmlkZSwgZmxhZ3MgJiBRTUZMQUdTX0lTX0JMT0NLSU5HKTsKKworCWlmICghaGVhZGVyKSB7CisJCWlmIChzZXJ2aWNlKQorCQkJVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwgc2xvdF9zdGFsbHMpOworCQkvKiBJbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlLCByZXR1cm4gdGhlIG11dGV4IHRvIHRoZQorCQkgICBzdGF0ZSBpdCB3YXMgaW4gKi8KKwkJaWYgKCEoZmxhZ3MgJiBRTUZMQUdTX05PX01VVEVYX0xPQ0spKQorCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2xvdF9tdXRleCk7CisJCXJldHVybiBWQ0hJUV9SRVRSWTsKKwl9CisKKwlpZiAodHlwZSA9PSBWQ0hJUV9NU0dfREFUQSkgeworCQlpbnQgaSwgcG9zOworCQlpbnQgdHhfZW5kX2luZGV4OworCQlpbnQgc2xvdF91c2VfY291bnQ7CisKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiJWQ6IHFtICVzQCV4LCV4ICglZC0+JWQpIiwKKwkJCXN0YXRlLT5pZCwKKwkJCW1zZ190eXBlX3N0cihWQ0hJUV9NU0dfVFlQRShtc2dpZCkpLAorCQkJKHVuc2lnbmVkIGludCloZWFkZXIsIHNpemUsCisJCQlWQ0hJUV9NU0dfU1JDUE9SVChtc2dpZCksCisJCQlWQ0hJUV9NU0dfRFNUUE9SVChtc2dpZCkpOworCisJCUJVR19PTighc2VydmljZSk7CisJCUJVR19PTigoZmxhZ3MgJiAoUU1GTEFHU19OT19NVVRFWF9MT0NLIHwKKwkJCQkgUU1GTEFHU19OT19NVVRFWF9VTkxPQ0spKSAhPSAwKTsKKworCQlmb3IgKGkgPSAwLCBwb3MgPSAwOyBpIDwgKHVuc2lnbmVkIGludCljb3VudDsKKwkJCXBvcyArPSBlbGVtZW50c1tpKytdLnNpemUpCisJCQlpZiAoZWxlbWVudHNbaV0uc2l6ZSkgeworCQkJCWlmICh2Y2hpcV9jb3B5X2Zyb21fdXNlcgorCQkJCQkoaGVhZGVyLT5kYXRhICsgcG9zLCBlbGVtZW50c1tpXS5kYXRhLAorCQkJCQkoc2l6ZV90KSBlbGVtZW50c1tpXS5zaXplKSAhPQorCQkJCQlWQ0hJUV9TVUNDRVNTKSB7CisJCQkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCQkJCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLAorCQkJCQkJZXJyb3JfY291bnQpOworCQkJCQlyZXR1cm4gVkNISVFfRVJST1I7CisJCQkJfQorCQkJCWlmIChpID09IDApIHsKKwkJCQkJaWYgKFNSVlRSQUNFX0VOQUJMRUQoc2VydmljZSwKKwkJCQkJCQlWQ0hJUV9MT0dfSU5GTykpCisJCQkJCQl2Y2hpcV9sb2dfZHVtcF9tZW0oIlNlbnQiLCAwLAorCQkJCQkJCWhlYWRlci0+ZGF0YSArIHBvcywKKwkJCQkJCQltaW4oNjR1LAorCQkJCQkJCWVsZW1lbnRzWzBdLnNpemUpKTsKKwkJCQl9CisJCQl9CisKKwkJc3Bpbl9sb2NrKCZxdW90YV9zcGlubG9jayk7CisJCXNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfdXNlX2NvdW50Kys7CisKKwkJdHhfZW5kX2luZGV4ID0KKwkJCVNMT1RfUVVFVUVfSU5ERVhfRlJPTV9QT1Moc3RhdGUtPmxvY2FsX3R4X3BvcyAtIDEpOworCisJCS8qIElmIHRoaXMgdHJhbnNtaXNzaW9uIGNhbid0IGZpdCBpbiB0aGUgbGFzdCBzbG90IHVzZWQgYnkgYW55CisJCSoqIHNlcnZpY2UsIHRoZSBkYXRhX3VzZV9jb3VudCBtdXN0IGJlIGluY3JlYXNlZC4gKi8KKwkJaWYgKHR4X2VuZF9pbmRleCAhPSBzdGF0ZS0+cHJldmlvdXNfZGF0YV9pbmRleCkgeworCQkJc3RhdGUtPnByZXZpb3VzX2RhdGFfaW5kZXggPSB0eF9lbmRfaW5kZXg7CisJCQlzdGF0ZS0+ZGF0YV91c2VfY291bnQrKzsKKwkJfQorCisJCS8qIElmIHRoaXMgaXNuJ3QgdGhlIHNhbWUgc2xvdCBsYXN0IHVzZWQgYnkgdGhpcyBzZXJ2aWNlLAorCQkqKiB0aGUgc2VydmljZSdzIHNsb3RfdXNlX2NvdW50IG11c3QgYmUgaW5jcmVhc2VkLiAqLworCQlpZiAodHhfZW5kX2luZGV4ICE9IHNlcnZpY2VfcXVvdGEtPnByZXZpb3VzX3R4X2luZGV4KSB7CisJCQlzZXJ2aWNlX3F1b3RhLT5wcmV2aW91c190eF9pbmRleCA9IHR4X2VuZF9pbmRleDsKKwkJCXNsb3RfdXNlX2NvdW50ID0gKytzZXJ2aWNlX3F1b3RhLT5zbG90X3VzZV9jb3VudDsKKwkJfSBlbHNlIHsKKwkJCXNsb3RfdXNlX2NvdW50ID0gMDsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZxdW90YV9zcGlubG9jayk7CisKKwkJaWYgKHNsb3RfdXNlX2NvdW50KQorCQkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCSIlZDogcW06JWQgJXMsJXggLSBzbG90X3VzZS0+JWQgKGhkciAlcCkiLAorCQkJCXN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0LAorCQkJCW1zZ190eXBlX3N0cihWQ0hJUV9NU0dfVFlQRShtc2dpZCkpLCBzaXplLAorCQkJCXNsb3RfdXNlX2NvdW50LCBoZWFkZXIpOworCisJCVZDSElRX1NFUlZJQ0VfU1RBVFNfSU5DKHNlcnZpY2UsIGN0cmxfdHhfY291bnQpOworCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0FERChzZXJ2aWNlLCBjdHJsX3R4X2J5dGVzLCBzaXplKTsKKwl9IGVsc2UgeworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlZDogcW0gJXNAJXgsJXggKCVkLT4lZCkiLCBzdGF0ZS0+aWQsCisJCQltc2dfdHlwZV9zdHIoVkNISVFfTVNHX1RZUEUobXNnaWQpKSwKKwkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyLCBzaXplLAorCQkJVkNISVFfTVNHX1NSQ1BPUlQobXNnaWQpLAorCQkJVkNISVFfTVNHX0RTVFBPUlQobXNnaWQpKTsKKwkJaWYgKHNpemUgIT0gMCkgeworCQkJV0FSTl9PTighKChjb3VudCA9PSAxKSAmJiAoc2l6ZSA9PSBlbGVtZW50c1swXS5zaXplKSkpOworCQkJbWVtY3B5KGhlYWRlci0+ZGF0YSwgZWxlbWVudHNbMF0uZGF0YSwKKwkJCQllbGVtZW50c1swXS5zaXplKTsKKwkJfQorCQlWQ0hJUV9TVEFUU19JTkMoc3RhdGUsIGN0cmxfdHhfY291bnQpOworCX0KKworCWhlYWRlci0+bXNnaWQgPSBtc2dpZDsKKwloZWFkZXItPnNpemUgPSBzaXplOworCisJeworCQlpbnQgc3ZjX2ZvdXJjYzsKKworCQlzdmNfZm91cmNjID0gc2VydmljZQorCQkJPyBzZXJ2aWNlLT5iYXNlLmZvdXJjYworCQkJOiBWQ0hJUV9NQUtFX0ZPVVJDQygnPycsICc/JywgJz8nLCAnPycpOworCisJCXZjaGlxX2xvZ19pbmZvKFNSVlRSQUNFX0xFVkVMKHNlcnZpY2UpLAorCQkJIlNlbnQgTXNnICVzKCV1KSB0byAlYyVjJWMlYyBzOiV1IGQ6JWQgbGVuOiVkIiwKKwkJCW1zZ190eXBlX3N0cihWQ0hJUV9NU0dfVFlQRShtc2dpZCkpLAorCQkJVkNISVFfTVNHX1RZUEUobXNnaWQpLAorCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUyhzdmNfZm91cmNjKSwKKwkJCVZDSElRX01TR19TUkNQT1JUKG1zZ2lkKSwKKwkJCVZDSElRX01TR19EU1RQT1JUKG1zZ2lkKSwKKwkJCXNpemUpOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgbmV3IGhlYWRlciBpcyB2aXNpYmxlIHRvIHRoZSBwZWVyLiAqLworCXdtYigpOworCisJLyogTWFrZSB0aGUgbmV3IHR4X3BvcyB2aXNpYmxlIHRvIHRoZSBwZWVyLiAqLworCWxvY2FsLT50eF9wb3MgPSBzdGF0ZS0+bG9jYWxfdHhfcG9zOworCXdtYigpOworCisJaWYgKHNlcnZpY2UgJiYgKHR5cGUgPT0gVkNISVFfTVNHX0NMT1NFKSkKKwkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwgVkNISVFfU1JWU1RBVEVfQ0xPU0VTRU5UKTsKKworCWlmICghKGZsYWdzICYgUU1GTEFHU19OT19NVVRFWF9VTkxPQ0spKQorCQltdXRleF91bmxvY2soJnN0YXRlLT5zbG90X211dGV4KTsKKworCXJlbW90ZV9ldmVudF9zaWduYWwoJnN0YXRlLT5yZW1vdGUtPnRyaWdnZXIpOworCisJcmV0dXJuIFZDSElRX1NVQ0NFU1M7Cit9CisKKy8qIENhbGxlZCBieSB0aGUgc2xvdCBoYW5kbGVyIGFuZCBhcHBsaWNhdGlvbiB0aHJlYWRzICovCitzdGF0aWMgVkNISVFfU1RBVFVTX1QKK3F1ZXVlX21lc3NhZ2Vfc3luYyhWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLAorCWludCBtc2dpZCwgY29uc3QgVkNISVFfRUxFTUVOVF9UICplbGVtZW50cywKKwlpbnQgY291bnQsIGludCBzaXplLCBpbnQgaXNfYmxvY2tpbmcpCit7CisJVkNISVFfU0hBUkVEX1NUQVRFX1QgKmxvY2FsOworCVZDSElRX0hFQURFUl9UICpoZWFkZXI7CisKKwlsb2NhbCA9IHN0YXRlLT5sb2NhbDsKKworCWlmICgoVkNISVFfTVNHX1RZUEUobXNnaWQpICE9IFZDSElRX01TR19SRVNVTUUpICYmCisJCShtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnN0YXRlLT5zeW5jX211dGV4KSAhPSAwKSkKKwkJcmV0dXJuIFZDSElRX1JFVFJZOworCisJcmVtb3RlX2V2ZW50X3dhaXQoJmxvY2FsLT5zeW5jX3JlbGVhc2UpOworCisJcm1iKCk7CisKKwloZWFkZXIgPSAoVkNISVFfSEVBREVSX1QgKilTTE9UX0RBVEFfRlJPTV9JTkRFWChzdGF0ZSwKKwkJbG9jYWwtPnNsb3Rfc3luYyk7CisKKwl7CisJCWludCBvbGRtc2dpZCA9IGhlYWRlci0+bXNnaWQ7CisJCWlmIChvbGRtc2dpZCAhPSBWQ0hJUV9NU0dJRF9QQURESU5HKQorCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCSIlZDogcW1zIC0gbXNnaWQgJXgsIG5vdCBQQURESU5HIiwKKwkJCQlzdGF0ZS0+aWQsIG9sZG1zZ2lkKTsKKwl9CisKKwlpZiAoc2VydmljZSkgeworCQlpbnQgaSwgcG9zOworCisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N5bmNfbG9nX2xldmVsLAorCQkJIiVkOiBxbXMgJXNAJXgsJXggKCVkLT4lZCkiLCBzdGF0ZS0+aWQsCisJCQltc2dfdHlwZV9zdHIoVkNISVFfTVNHX1RZUEUobXNnaWQpKSwKKwkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyLCBzaXplLAorCQkJVkNISVFfTVNHX1NSQ1BPUlQobXNnaWQpLAorCQkJVkNISVFfTVNHX0RTVFBPUlQobXNnaWQpKTsKKworCQlmb3IgKGkgPSAwLCBwb3MgPSAwOyBpIDwgKHVuc2lnbmVkIGludCljb3VudDsKKwkJCXBvcyArPSBlbGVtZW50c1tpKytdLnNpemUpCisJCQlpZiAoZWxlbWVudHNbaV0uc2l6ZSkgeworCQkJCWlmICh2Y2hpcV9jb3B5X2Zyb21fdXNlcgorCQkJCQkoaGVhZGVyLT5kYXRhICsgcG9zLCBlbGVtZW50c1tpXS5kYXRhLAorCQkJCQkoc2l6ZV90KSBlbGVtZW50c1tpXS5zaXplKSAhPQorCQkJCQlWQ0hJUV9TVUNDRVNTKSB7CisJCQkJCW11dGV4X3VubG9jaygmc3RhdGUtPnN5bmNfbXV0ZXgpOworCQkJCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLAorCQkJCQkJZXJyb3JfY291bnQpOworCQkJCQlyZXR1cm4gVkNISVFfRVJST1I7CisJCQkJfQorCQkJCWlmIChpID09IDApIHsKKwkJCQkJaWYgKHZjaGlxX3N5bmNfbG9nX2xldmVsID49CisJCQkJCQlWQ0hJUV9MT0dfVFJBQ0UpCisJCQkJCQl2Y2hpcV9sb2dfZHVtcF9tZW0oIlNlbnQgU3luYyIsCisJCQkJCQkJMCwgaGVhZGVyLT5kYXRhICsgcG9zLAorCQkJCQkJCW1pbig2NHUsCisJCQkJCQkJZWxlbWVudHNbMF0uc2l6ZSkpOworCQkJCX0KKwkJCX0KKworCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLCBjdHJsX3R4X2NvdW50KTsKKwkJVkNISVFfU0VSVklDRV9TVEFUU19BREQoc2VydmljZSwgY3RybF90eF9ieXRlcywgc2l6ZSk7CisJfSBlbHNlIHsKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3luY19sb2dfbGV2ZWwsCisJCQkiJWQ6IHFtcyAlc0AleCwleCAoJWQtPiVkKSIsIHN0YXRlLT5pZCwKKwkJCW1zZ190eXBlX3N0cihWQ0hJUV9NU0dfVFlQRShtc2dpZCkpLAorCQkJKHVuc2lnbmVkIGludCloZWFkZXIsIHNpemUsCisJCQlWQ0hJUV9NU0dfU1JDUE9SVChtc2dpZCksCisJCQlWQ0hJUV9NU0dfRFNUUE9SVChtc2dpZCkpOworCQlpZiAoc2l6ZSAhPSAwKSB7CisJCQlXQVJOX09OKCEoKGNvdW50ID09IDEpICYmIChzaXplID09IGVsZW1lbnRzWzBdLnNpemUpKSk7CisJCQltZW1jcHkoaGVhZGVyLT5kYXRhLCBlbGVtZW50c1swXS5kYXRhLAorCQkJCWVsZW1lbnRzWzBdLnNpemUpOworCQl9CisJCVZDSElRX1NUQVRTX0lOQyhzdGF0ZSwgY3RybF90eF9jb3VudCk7CisJfQorCisJaGVhZGVyLT5zaXplID0gc2l6ZTsKKwloZWFkZXItPm1zZ2lkID0gbXNnaWQ7CisKKwlpZiAodmNoaXFfc3luY19sb2dfbGV2ZWwgPj0gVkNISVFfTE9HX1RSQUNFKSB7CisJCWludCBzdmNfZm91cmNjOworCisJCXN2Y19mb3VyY2MgPSBzZXJ2aWNlCisJCQk/IHNlcnZpY2UtPmJhc2UuZm91cmNjCisJCQk6IFZDSElRX01BS0VfRk9VUkNDKCc/JywgJz8nLCAnPycsICc/Jyk7CisKKwkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N5bmNfbG9nX2xldmVsLAorCQkJIlNlbnQgU3luYyBNc2cgJXMoJXUpIHRvICVjJWMlYyVjIHM6JXUgZDolZCBsZW46JWQiLAorCQkJbXNnX3R5cGVfc3RyKFZDSElRX01TR19UWVBFKG1zZ2lkKSksCisJCQlWQ0hJUV9NU0dfVFlQRShtc2dpZCksCisJCQlWQ0hJUV9GT1VSQ0NfQVNfNENIQVJTKHN2Y19mb3VyY2MpLAorCQkJVkNISVFfTVNHX1NSQ1BPUlQobXNnaWQpLAorCQkJVkNISVFfTVNHX0RTVFBPUlQobXNnaWQpLAorCQkJc2l6ZSk7CisJfQorCisJLyogTWFrZSBzdXJlIHRoZSBuZXcgaGVhZGVyIGlzIHZpc2libGUgdG8gdGhlIHBlZXIuICovCisJd21iKCk7CisKKwlyZW1vdGVfZXZlbnRfc2lnbmFsKCZzdGF0ZS0+cmVtb3RlLT5zeW5jX3RyaWdnZXIpOworCisJaWYgKFZDSElRX01TR19UWVBFKG1zZ2lkKSAhPSBWQ0hJUV9NU0dfUEFVU0UpCisJCW11dGV4X3VubG9jaygmc3RhdGUtPnN5bmNfbXV0ZXgpOworCisJcmV0dXJuIFZDSElRX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY2xhaW1fc2xvdChWQ0hJUV9TTE9UX0lORk9fVCAqc2xvdCkKK3sKKwlzbG90LT51c2VfY291bnQrKzsKK30KKworc3RhdGljIHZvaWQKK3JlbGVhc2Vfc2xvdChWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfU0xPVF9JTkZPX1QgKnNsb3RfaW5mbywKKwlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyLCBWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpCit7CisJaW50IHJlbGVhc2VfY291bnQ7CisKKwltdXRleF9sb2NrKCZzdGF0ZS0+cmVjeWNsZV9tdXRleCk7CisKKwlpZiAoaGVhZGVyKSB7CisJCWludCBtc2dpZCA9IGhlYWRlci0+bXNnaWQ7CisJCWlmICgoKG1zZ2lkICYgVkNISVFfTVNHSURfQ0xBSU1FRCkgPT0gMCkgfHwKKwkJCShzZXJ2aWNlICYmIHNlcnZpY2UtPmNsb3NpbmcpKSB7CisJCQltdXRleF91bmxvY2soJnN0YXRlLT5yZWN5Y2xlX211dGV4KTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIFJld3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIHRvIHByZXZlbnQgYSBkb3VibGUKKwkJKiogcmVsZWFzZSAqLworCQloZWFkZXItPm1zZ2lkID0gbXNnaWQgJiB+VkNISVFfTVNHSURfQ0xBSU1FRDsKKwl9CisKKwlyZWxlYXNlX2NvdW50ID0gc2xvdF9pbmZvLT5yZWxlYXNlX2NvdW50OworCXNsb3RfaW5mby0+cmVsZWFzZV9jb3VudCA9ICsrcmVsZWFzZV9jb3VudDsKKworCWlmIChyZWxlYXNlX2NvdW50ID09IHNsb3RfaW5mby0+dXNlX2NvdW50KSB7CisJCWludCBzbG90X3F1ZXVlX3JlY3ljbGU7CisJCS8qIEFkZCB0byB0aGUgZnJlZWQgcXVldWUgKi8KKworCQkvKiBBIHJlYWQgYmFycmllciBpcyBuZWNlc3NhcnkgaGVyZSB0byBwcmV2ZW50IHNwZWN1bGF0aXZlCisJCSoqIGZldGNoZXMgb2YgcmVtb3RlLT5zbG90X3F1ZXVlX3JlY3ljbGUgZnJvbSBvdmVydGFraW5nIHRoZQorCQkqKiBtdXRleC4gKi8KKwkJcm1iKCk7CisKKwkJc2xvdF9xdWV1ZV9yZWN5Y2xlID0gc3RhdGUtPnJlbW90ZS0+c2xvdF9xdWV1ZV9yZWN5Y2xlOworCQlzdGF0ZS0+cmVtb3RlLT5zbG90X3F1ZXVlW3Nsb3RfcXVldWVfcmVjeWNsZSAmCisJCQlWQ0hJUV9TTE9UX1FVRVVFX01BU0tdID0KKwkJCVNMT1RfSU5ERVhfRlJPTV9JTkZPKHN0YXRlLCBzbG90X2luZm8pOworCQlzdGF0ZS0+cmVtb3RlLT5zbG90X3F1ZXVlX3JlY3ljbGUgPSBzbG90X3F1ZXVlX3JlY3ljbGUgKyAxOworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlZDogcmVsZWFzZV9zbG90ICVkIC0gcmVjeWNsZS0+JXgiLAorCQkJc3RhdGUtPmlkLCBTTE9UX0lOREVYX0ZST01fSU5GTyhzdGF0ZSwgc2xvdF9pbmZvKSwKKwkJCXN0YXRlLT5yZW1vdGUtPnNsb3RfcXVldWVfcmVjeWNsZSk7CisKKwkJLyogQSB3cml0ZSBiYXJyaWVyIGlzIG5lY2Vzc2FyeSwgYnV0IHJlbW90ZV9ldmVudF9zaWduYWwKKwkJKiogY29udGFpbnMgb25lLiAqLworCQlyZW1vdGVfZXZlbnRfc2lnbmFsKCZzdGF0ZS0+cmVtb3RlLT5yZWN5Y2xlKTsKKwl9CisKKwltdXRleF91bmxvY2soJnN0YXRlLT5yZWN5Y2xlX211dGV4KTsKK30KKworLyogQ2FsbGVkIGJ5IHRoZSBzbG90IGhhbmRsZXIgLSBkb24ndCBob2xkIHRoZSBidWxrIG11dGV4ICovCitzdGF0aWMgVkNISVFfU1RBVFVTX1QKK25vdGlmeV9idWxrcyhWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIFZDSElRX0JVTEtfUVVFVUVfVCAqcXVldWUsCisJaW50IHJldHJ5X3BvbGwpCit7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVkOiBuYjolZCAlY3ggLSBwPSV4IHJuPSV4IHI9JXgiLAorCQlzZXJ2aWNlLT5zdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwKKwkJKHF1ZXVlID09ICZzZXJ2aWNlLT5idWxrX3R4KSA/ICd0JyA6ICdyJywKKwkJcXVldWUtPnByb2Nlc3MsIHF1ZXVlLT5yZW1vdGVfbm90aWZ5LCBxdWV1ZS0+cmVtb3ZlKTsKKworCWlmIChzZXJ2aWNlLT5zdGF0ZS0+aXNfbWFzdGVyKSB7CisJCXdoaWxlIChxdWV1ZS0+cmVtb3RlX25vdGlmeSAhPSBxdWV1ZS0+cHJvY2VzcykgeworCQkJVkNISVFfQlVMS19UICpidWxrID0KKwkJCQkmcXVldWUtPmJ1bGtzW0JVTEtfSU5ERVgocXVldWUtPnJlbW90ZV9ub3RpZnkpXTsKKwkJCWludCBtc2d0eXBlID0gKGJ1bGstPmRpciA9PSBWQ0hJUV9CVUxLX1RSQU5TTUlUKSA/CisJCQkJVkNISVFfTVNHX0JVTEtfUlhfRE9ORSA6IFZDSElRX01TR19CVUxLX1RYX0RPTkU7CisJCQlpbnQgbXNnaWQgPSBWQ0hJUV9NQUtFX01TRyhtc2d0eXBlLCBzZXJ2aWNlLT5sb2NhbHBvcnQsCisJCQkJc2VydmljZS0+cmVtb3RlcG9ydCk7CisJCQlWQ0hJUV9FTEVNRU5UX1QgZWxlbWVudCA9IHsgJmJ1bGstPmFjdHVhbCwgNCB9OworCQkJLyogT25seSByZXBseSB0byBub24tZHVtbXkgYnVsayByZXF1ZXN0cyAqLworCQkJaWYgKGJ1bGstPnJlbW90ZV9kYXRhKSB7CisJCQkJc3RhdHVzID0gcXVldWVfbWVzc2FnZShzZXJ2aWNlLT5zdGF0ZSwgTlVMTCwKKwkJCQkJbXNnaWQsICZlbGVtZW50LCAxLCA0LCAwKTsKKwkJCQlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpCisJCQkJCWJyZWFrOworCQkJfQorCQkJcXVldWUtPnJlbW90ZV9ub3RpZnkrKzsKKwkJfQorCX0gZWxzZSB7CisJCXF1ZXVlLT5yZW1vdGVfbm90aWZ5ID0gcXVldWUtPnByb2Nlc3M7CisJfQorCisJaWYgKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKSB7CisJCXdoaWxlIChxdWV1ZS0+cmVtb3ZlICE9IHF1ZXVlLT5yZW1vdGVfbm90aWZ5KSB7CisJCQlWQ0hJUV9CVUxLX1QgKmJ1bGsgPQorCQkJCSZxdWV1ZS0+YnVsa3NbQlVMS19JTkRFWChxdWV1ZS0+cmVtb3ZlKV07CisKKwkJCS8qIE9ubHkgZ2VuZXJhdGUgY2FsbGJhY2tzIGZvciBub24tZHVtbXkgYnVsaworCQkJKiogcmVxdWVzdHMsIGFuZCBub24tdGVybWluYXRlZCBzZXJ2aWNlcyAqLworCQkJaWYgKGJ1bGstPmRhdGEgJiYgc2VydmljZS0+aW5zdGFuY2UpIHsKKwkJCQlpZiAoYnVsay0+YWN0dWFsICE9IFZDSElRX0JVTEtfQUNUVUFMX0FCT1JURUQpIHsKKwkJCQkJaWYgKGJ1bGstPmRpciA9PSBWQ0hJUV9CVUxLX1RSQU5TTUlUKSB7CisJCQkJCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLAorCQkJCQkJCWJ1bGtfdHhfY291bnQpOworCQkJCQkJVkNISVFfU0VSVklDRV9TVEFUU19BREQoc2VydmljZSwKKwkJCQkJCQlidWxrX3R4X2J5dGVzLAorCQkJCQkJCWJ1bGstPmFjdHVhbCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLAorCQkJCQkJCWJ1bGtfcnhfY291bnQpOworCQkJCQkJVkNISVFfU0VSVklDRV9TVEFUU19BREQoc2VydmljZSwKKwkJCQkJCQlidWxrX3J4X2J5dGVzLAorCQkJCQkJCWJ1bGstPmFjdHVhbCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLAorCQkJCQkJYnVsa19hYm9ydGVkX2NvdW50KTsKKwkJCQl9CisJCQkJaWYgKGJ1bGstPm1vZGUgPT0gVkNISVFfQlVMS19NT0RFX0JMT0NLSU5HKSB7CisJCQkJCXN0cnVjdCBidWxrX3dhaXRlciAqd2FpdGVyOworCQkJCQlzcGluX2xvY2soJmJ1bGtfd2FpdGVyX3NwaW5sb2NrKTsKKwkJCQkJd2FpdGVyID0gYnVsay0+dXNlcmRhdGE7CisJCQkJCWlmICh3YWl0ZXIpIHsKKwkJCQkJCXdhaXRlci0+YWN0dWFsID0gYnVsay0+YWN0dWFsOworCQkJCQkJdXAoJndhaXRlci0+ZXZlbnQpOworCQkJCQl9CisJCQkJCXNwaW5fdW5sb2NrKCZidWxrX3dhaXRlcl9zcGlubG9jayk7CisJCQkJfSBlbHNlIGlmIChidWxrLT5tb2RlID09CisJCQkJCVZDSElRX0JVTEtfTU9ERV9DQUxMQkFDSykgeworCQkJCQlWQ0hJUV9SRUFTT05fVCByZWFzb24gPSAoYnVsay0+ZGlyID09CisJCQkJCQlWQ0hJUV9CVUxLX1RSQU5TTUlUKSA/CisJCQkJCQkoKGJ1bGstPmFjdHVhbCA9PQorCQkJCQkJVkNISVFfQlVMS19BQ1RVQUxfQUJPUlRFRCkgPworCQkJCQkJVkNISVFfQlVMS19UUkFOU01JVF9BQk9SVEVEIDoKKwkJCQkJCVZDSElRX0JVTEtfVFJBTlNNSVRfRE9ORSkgOgorCQkJCQkJKChidWxrLT5hY3R1YWwgPT0KKwkJCQkJCVZDSElRX0JVTEtfQUNUVUFMX0FCT1JURUQpID8KKwkJCQkJCVZDSElRX0JVTEtfUkVDRUlWRV9BQk9SVEVEIDoKKwkJCQkJCVZDSElRX0JVTEtfUkVDRUlWRV9ET05FKTsKKwkJCQkJc3RhdHVzID0gbWFrZV9zZXJ2aWNlX2NhbGxiYWNrKHNlcnZpY2UsCisJCQkJCQlyZWFzb24sCU5VTEwsIGJ1bGstPnVzZXJkYXRhKTsKKwkJCQkJaWYgKHN0YXR1cyA9PSBWQ0hJUV9SRVRSWSkKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJcXVldWUtPnJlbW92ZSsrOworCQkJdXAoJnNlcnZpY2UtPmJ1bGtfcmVtb3ZlX2V2ZW50KTsKKwkJfQorCQlpZiAoIXJldHJ5X3BvbGwpCisJCQlzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCX0KKworCWlmIChzdGF0dXMgPT0gVkNISVFfUkVUUlkpCisJCXJlcXVlc3RfcG9sbChzZXJ2aWNlLT5zdGF0ZSwgc2VydmljZSwKKwkJCShxdWV1ZSA9PSAmc2VydmljZS0+YnVsa190eCkgPworCQkJVkNISVFfUE9MTF9UWE5PVElGWSA6IFZDSElRX1BPTExfUlhOT1RJRlkpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogQ2FsbGVkIGJ5IHRoZSBzbG90IGhhbmRsZXIgdGhyZWFkICovCitzdGF0aWMgdm9pZAorcG9sbF9zZXJ2aWNlcyhWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlpbnQgZ3JvdXAsIGk7CisKKwlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBCSVRTRVRfU0laRShzdGF0ZS0+dW51c2VkX3NlcnZpY2UpOyBncm91cCsrKSB7CisJCXVpbnQzMl90IGZsYWdzOworCQlmbGFncyA9IGF0b21pY194Y2hnKCZzdGF0ZS0+cG9sbF9zZXJ2aWNlc1tncm91cF0sIDApOworCQlmb3IgKGkgPSAwOyBmbGFnczsgaSsrKSB7CisJCQlpZiAoZmxhZ3MgJiAoMSA8PCBpKSkgeworCQkJCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9CisJCQkJCWZpbmRfc2VydmljZV9ieV9wb3J0KHN0YXRlLAorCQkJCQkJKGdyb3VwPDw1KSArIGkpOworCQkJCXVpbnQzMl90IHNlcnZpY2VfZmxhZ3M7CisJCQkJZmxhZ3MgJj0gfigxIDw8IGkpOworCQkJCWlmICghc2VydmljZSkKKwkJCQkJY29udGludWU7CisJCQkJc2VydmljZV9mbGFncyA9CisJCQkJCWF0b21pY194Y2hnKCZzZXJ2aWNlLT5wb2xsX2ZsYWdzLCAwKTsKKwkJCQlpZiAoc2VydmljZV9mbGFncyAmCisJCQkJCSgxIDw8IFZDSElRX1BPTExfUkVNT1ZFKSkgeworCQkJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJCSIlZDogcHMgLSByZW1vdmUgJWQ8LT4lZCIsCisJCQkJCQlzdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCQkJCXNlcnZpY2UtPnJlbW90ZXBvcnQpOworCisJCQkJCS8qIE1ha2UgaXQgbG9vayBsaWtlIGEgY2xpZW50LCBiZWNhdXNlCisJCQkJCSAgIGl0IG11c3QgYmUgcmVtb3ZlZCBhbmQgbm90IGxlZnQgaW4KKwkJCQkJICAgdGhlIExJU1RFTklORyBzdGF0ZS4gKi8KKwkJCQkJc2VydmljZS0+cHVibGljX2ZvdXJjYyA9CisJCQkJCQlWQ0hJUV9GT1VSQ0NfSU5WQUxJRDsKKworCQkJCQlpZiAodmNoaXFfY2xvc2Vfc2VydmljZV9pbnRlcm5hbCgKKwkJCQkJCXNlcnZpY2UsIDAvKiFjbG9zZV9yZWN2ZCovKSAhPQorCQkJCQkJVkNISVFfU1VDQ0VTUykKKwkJCQkJCXJlcXVlc3RfcG9sbChzdGF0ZSwgc2VydmljZSwKKwkJCQkJCQlWQ0hJUV9QT0xMX1JFTU9WRSk7CisJCQkJfSBlbHNlIGlmIChzZXJ2aWNlX2ZsYWdzICYKKwkJCQkJKDEgPDwgVkNISVFfUE9MTF9URVJNSU5BVEUpKSB7CisJCQkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkJIiVkOiBwcyAtIHRlcm1pbmF0ZSAlZDwtPiVkIiwKKwkJCQkJCXN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0LAorCQkJCQkJc2VydmljZS0+cmVtb3RlcG9ydCk7CisJCQkJCWlmICh2Y2hpcV9jbG9zZV9zZXJ2aWNlX2ludGVybmFsKAorCQkJCQkJc2VydmljZSwgMC8qIWNsb3NlX3JlY3ZkKi8pICE9CisJCQkJCQlWQ0hJUV9TVUNDRVNTKQorCQkJCQkJcmVxdWVzdF9wb2xsKHN0YXRlLCBzZXJ2aWNlLAorCQkJCQkJCVZDSElRX1BPTExfVEVSTUlOQVRFKTsKKwkJCQl9CisJCQkJaWYgKHNlcnZpY2VfZmxhZ3MgJiAoMSA8PCBWQ0hJUV9QT0xMX1RYTk9USUZZKSkKKwkJCQkJbm90aWZ5X2J1bGtzKHNlcnZpY2UsCisJCQkJCQkmc2VydmljZS0+YnVsa190eCwKKwkJCQkJCTEvKnJldHJ5X3BvbGwqLyk7CisJCQkJaWYgKHNlcnZpY2VfZmxhZ3MgJiAoMSA8PCBWQ0hJUV9QT0xMX1JYTk9USUZZKSkKKwkJCQkJbm90aWZ5X2J1bGtzKHNlcnZpY2UsCisJCQkJCQkmc2VydmljZS0+YnVsa19yeCwKKwkJCQkJCTEvKnJldHJ5X3BvbGwqLyk7CisJCQkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIENhbGxlZCBieSB0aGUgc2xvdCBoYW5kbGVyIG9yIGFwcGxpY2F0aW9uIHRocmVhZHMsIGhvbGRpbmcgdGhlIGJ1bGsgbXV0ZXguICovCitzdGF0aWMgaW50CityZXNvbHZlX2J1bGtzKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSwgVkNISVFfQlVMS19RVUVVRV9UICpxdWV1ZSkKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IHNlcnZpY2UtPnN0YXRlOworCWludCByZXNvbHZlZCA9IDA7CisJaW50IHJjOworCisJd2hpbGUgKChxdWV1ZS0+cHJvY2VzcyAhPSBxdWV1ZS0+bG9jYWxfaW5zZXJ0KSAmJgorCQkocXVldWUtPnByb2Nlc3MgIT0gcXVldWUtPnJlbW90ZV9pbnNlcnQpKSB7CisJCVZDSElRX0JVTEtfVCAqYnVsayA9ICZxdWV1ZS0+YnVsa3NbQlVMS19JTkRFWChxdWV1ZS0+cHJvY2VzcyldOworCisJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlZDogcmI6JWQgJWN4IC0gbGk9JXggcmk9JXggcD0leCIsCisJCQlzdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCShxdWV1ZSA9PSAmc2VydmljZS0+YnVsa190eCkgPyAndCcgOiAncicsCisJCQlxdWV1ZS0+bG9jYWxfaW5zZXJ0LCBxdWV1ZS0+cmVtb3RlX2luc2VydCwKKwkJCXF1ZXVlLT5wcm9jZXNzKTsKKworCQlXQVJOX09OKCEoKGludCkocXVldWUtPmxvY2FsX2luc2VydCAtIHF1ZXVlLT5wcm9jZXNzKSA+IDApKTsKKwkJV0FSTl9PTighKChpbnQpKHF1ZXVlLT5yZW1vdGVfaW5zZXJ0IC0gcXVldWUtPnByb2Nlc3MpID4gMCkpOworCisJCXJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+YnVsa190cmFuc2Zlcl9tdXRleCk7CisJCWlmIChyYyAhPSAwKQorCQkJYnJlYWs7CisKKwkJdmNoaXFfdHJhbnNmZXJfYnVsayhidWxrKTsKKwkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+YnVsa190cmFuc2Zlcl9tdXRleCk7CisKKwkJaWYgKFNSVlRSQUNFX0VOQUJMRUQoc2VydmljZSwgVkNISVFfTE9HX0lORk8pKSB7CisJCQljb25zdCBjaGFyICpoZWFkZXIgPSAocXVldWUgPT0gJnNlcnZpY2UtPmJ1bGtfdHgpID8KKwkJCQkiU2VuZCBCdWxrIHRvIiA6ICJSZWN2IEJ1bGsgZnJvbSI7CisJCQlpZiAoYnVsay0+YWN0dWFsICE9IFZDSElRX0JVTEtfQUNUVUFMX0FCT1JURUQpCisJCQkJdmNoaXFfbG9nX2luZm8oU1JWVFJBQ0VfTEVWRUwoc2VydmljZSksCisJCQkJCSIlcyAlYyVjJWMlYyBkOiVkIGxlbjolZCAleDwtPiV4IiwKKwkJCQkJaGVhZGVyLAorCQkJCQlWQ0hJUV9GT1VSQ0NfQVNfNENIQVJTKAorCQkJCQkJc2VydmljZS0+YmFzZS5mb3VyY2MpLAorCQkJCQlzZXJ2aWNlLT5yZW1vdGVwb3J0LAorCQkJCQlidWxrLT5zaXplLAorCQkJCQkodW5zaWduZWQgaW50KWJ1bGstPmRhdGEsCisJCQkJCSh1bnNpZ25lZCBpbnQpYnVsay0+cmVtb3RlX2RhdGEpOworCQkJZWxzZQorCQkJCXZjaGlxX2xvZ19pbmZvKFNSVlRSQUNFX0xFVkVMKHNlcnZpY2UpLAorCQkJCQkiJXMgJWMlYyVjJWMgZDolZCBBQk9SVEVEIC0gdHggbGVuOiVkLCIKKwkJCQkJIiByeCBsZW46JWQgJXg8LT4leCIsCisJCQkJCWhlYWRlciwKKwkJCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUygKKwkJCQkJCXNlcnZpY2UtPmJhc2UuZm91cmNjKSwKKwkJCQkJc2VydmljZS0+cmVtb3RlcG9ydCwKKwkJCQkJYnVsay0+c2l6ZSwKKwkJCQkJYnVsay0+cmVtb3RlX3NpemUsCisJCQkJCSh1bnNpZ25lZCBpbnQpYnVsay0+ZGF0YSwKKwkJCQkJKHVuc2lnbmVkIGludClidWxrLT5yZW1vdGVfZGF0YSk7CisJCX0KKworCQl2Y2hpcV9jb21wbGV0ZV9idWxrKGJ1bGspOworCQlxdWV1ZS0+cHJvY2VzcysrOworCQlyZXNvbHZlZCsrOworCX0KKwlyZXR1cm4gcmVzb2x2ZWQ7Cit9CisKKy8qIENhbGxlZCB3aXRoIHRoZSBidWxrX211dGV4IGhlbGQgKi8KK3N0YXRpYyB2b2lkCithYm9ydF9vdXRzdGFuZGluZ19idWxrcyhWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIFZDSElRX0JVTEtfUVVFVUVfVCAqcXVldWUpCit7CisJaW50IGlzX3R4ID0gKHF1ZXVlID09ICZzZXJ2aWNlLT5idWxrX3R4KTsKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSIlZDogYW9iOiVkICVjeCAtIGxpPSV4IHJpPSV4IHA9JXgiLAorCQlzZXJ2aWNlLT5zdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwgaXNfdHggPyAndCcgOiAncicsCisJCXF1ZXVlLT5sb2NhbF9pbnNlcnQsIHF1ZXVlLT5yZW1vdGVfaW5zZXJ0LCBxdWV1ZS0+cHJvY2Vzcyk7CisKKwlXQVJOX09OKCEoKGludCkocXVldWUtPmxvY2FsX2luc2VydCAtIHF1ZXVlLT5wcm9jZXNzKSA+PSAwKSk7CisJV0FSTl9PTighKChpbnQpKHF1ZXVlLT5yZW1vdGVfaW5zZXJ0IC0gcXVldWUtPnByb2Nlc3MpID49IDApKTsKKworCXdoaWxlICgocXVldWUtPnByb2Nlc3MgIT0gcXVldWUtPmxvY2FsX2luc2VydCkgfHwKKwkJKHF1ZXVlLT5wcm9jZXNzICE9IHF1ZXVlLT5yZW1vdGVfaW5zZXJ0KSkgeworCQlWQ0hJUV9CVUxLX1QgKmJ1bGsgPSAmcXVldWUtPmJ1bGtzW0JVTEtfSU5ERVgocXVldWUtPnByb2Nlc3MpXTsKKworCQlpZiAocXVldWUtPnByb2Nlc3MgPT0gcXVldWUtPnJlbW90ZV9pbnNlcnQpIHsKKwkJCS8qIGZhYnJpY2F0ZSBhIG1hdGNoaW5nIGR1bW15IGJ1bGsgKi8KKwkJCWJ1bGstPnJlbW90ZV9kYXRhID0gTlVMTDsKKwkJCWJ1bGstPnJlbW90ZV9zaXplID0gMDsKKwkJCXF1ZXVlLT5yZW1vdGVfaW5zZXJ0Kys7CisJCX0KKworCQlpZiAocXVldWUtPnByb2Nlc3MgIT0gcXVldWUtPmxvY2FsX2luc2VydCkgeworCQkJdmNoaXFfY29tcGxldGVfYnVsayhidWxrKTsKKworCQkJdmNoaXFfbG9nX2luZm8oU1JWVFJBQ0VfTEVWRUwoc2VydmljZSksCisJCQkJIiVzICVjJWMlYyVjIGQ6JWQgQUJPUlRFRCAtIHR4IGxlbjolZCwgIgorCQkJCSJyeCBsZW46JWQiLAorCQkJCWlzX3R4ID8gIlNlbmQgQnVsayB0byIgOiAiUmVjdiBCdWxrIGZyb20iLAorCQkJCVZDSElRX0ZPVVJDQ19BU180Q0hBUlMoc2VydmljZS0+YmFzZS5mb3VyY2MpLAorCQkJCXNlcnZpY2UtPnJlbW90ZXBvcnQsCisJCQkJYnVsay0+c2l6ZSwKKwkJCQlidWxrLT5yZW1vdGVfc2l6ZSk7CisJCX0gZWxzZSB7CisJCQkvKiBmYWJyaWNhdGUgYSBtYXRjaGluZyBkdW1teSBidWxrICovCisJCQlidWxrLT5kYXRhID0gTlVMTDsKKwkJCWJ1bGstPnNpemUgPSAwOworCQkJYnVsay0+YWN0dWFsID0gVkNISVFfQlVMS19BQ1RVQUxfQUJPUlRFRDsKKwkJCWJ1bGstPmRpciA9IGlzX3R4ID8gVkNISVFfQlVMS19UUkFOU01JVCA6CisJCQkJVkNISVFfQlVMS19SRUNFSVZFOworCQkJcXVldWUtPmxvY2FsX2luc2VydCsrOworCQl9CisKKwkJcXVldWUtPnByb2Nlc3MrKzsKKwl9Cit9CisKKy8qIENhbGxlZCBmcm9tIHRoZSBzbG90IGhhbmRsZXIgdGhyZWFkICovCitzdGF0aWMgdm9pZAorcGF1c2VfYnVsa3MoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJaWYgKHVubGlrZWx5KGF0b21pY19pbmNfcmV0dXJuKCZwYXVzZV9idWxrc19jb3VudCkgIT0gMSkpIHsKKwkJV0FSTl9PTl9PTkNFKDEpOworCQlhdG9taWNfc2V0KCZwYXVzZV9idWxrc19jb3VudCwgMSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBCbG9jayBidWxrIHRyYW5zZmVycyBmcm9tIGFsbCBzZXJ2aWNlcyAqLworCW11dGV4X2xvY2soJnN0YXRlLT5idWxrX3RyYW5zZmVyX211dGV4KTsKK30KKworLyogQ2FsbGVkIGZyb20gdGhlIHNsb3QgaGFuZGxlciB0aHJlYWQgKi8KK3N0YXRpYyB2b2lkCityZXN1bWVfYnVsa3MoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJaW50IGk7CisJaWYgKHVubGlrZWx5KGF0b21pY19kZWNfcmV0dXJuKCZwYXVzZV9idWxrc19jb3VudCkgIT0gMCkpIHsKKwkJV0FSTl9PTl9PTkNFKDEpOworCQlhdG9taWNfc2V0KCZwYXVzZV9idWxrc19jb3VudCwgMCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBBbGxvdyBidWxrIHRyYW5zZmVycyBmcm9tIGFsbCBzZXJ2aWNlcyAqLworCW11dGV4X3VubG9jaygmc3RhdGUtPmJ1bGtfdHJhbnNmZXJfbXV0ZXgpOworCisJaWYgKHN0YXRlLT5kZWZlcnJlZF9idWxrcyA9PSAwKQorCQlyZXR1cm47CisKKwkvKiBEZWFsIHdpdGggYW55IGJ1bGtzIHdoaWNoIGhhZCB0byBiZSBkZWZlcnJlZCBkdWUgdG8gYmVpbmcgaW4KKwkgKiBwYXVzZWQgc3RhdGUuICBEb24ndCB0cnkgdG8gbWF0Y2ggdXAgdG8gbnVtYmVyIG9mIGRlZmVycmVkIGJ1bGtzCisJICogaW4gY2FzZSB3ZSd2ZSBoYWQgc29tZXRoaW5nIGNvbWUgYW5kIGNsb3NlIHRoZSBzZXJ2aWNlIGluIHRoZQorCSAqIGludGVyaW0gLSBqdXN0IHByb2Nlc3MgYWxsIGJ1bGsgcXVldWVzIGZvciBhbGwgc2VydmljZXMgKi8KKwl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwgIiVzOiBwcm9jZXNzaW5nICVkIGRlZmVycmVkIGJ1bGtzIiwKKwkJX19mdW5jX18sIHN0YXRlLT5kZWZlcnJlZF9idWxrcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPnVudXNlZF9zZXJ2aWNlOyBpKyspIHsKKwkJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gc3RhdGUtPnNlcnZpY2VzW2ldOworCQlpbnQgcmVzb2x2ZWRfcnggPSAwOworCQlpbnQgcmVzb2x2ZWRfdHggPSAwOworCQlpZiAoIXNlcnZpY2UgfHwgKHNlcnZpY2UtPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX09QRU4pKQorCQkJY29udGludWU7CisKKwkJbXV0ZXhfbG9jaygmc2VydmljZS0+YnVsa19tdXRleCk7CisJCXJlc29sdmVkX3J4ID0gcmVzb2x2ZV9idWxrcyhzZXJ2aWNlLCAmc2VydmljZS0+YnVsa19yeCk7CisJCXJlc29sdmVkX3R4ID0gcmVzb2x2ZV9idWxrcyhzZXJ2aWNlLCAmc2VydmljZS0+YnVsa190eCk7CisJCW11dGV4X3VubG9jaygmc2VydmljZS0+YnVsa19tdXRleCk7CisJCWlmIChyZXNvbHZlZF9yeCkKKwkJCW5vdGlmeV9idWxrcyhzZXJ2aWNlLCAmc2VydmljZS0+YnVsa19yeCwgMSk7CisJCWlmIChyZXNvbHZlZF90eCkKKwkJCW5vdGlmeV9idWxrcyhzZXJ2aWNlLCAmc2VydmljZS0+YnVsa190eCwgMSk7CisJfQorCXN0YXRlLT5kZWZlcnJlZF9idWxrcyA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX29wZW4oVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX0hFQURFUl9UICpoZWFkZXIpCit7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gTlVMTDsKKwlpbnQgbXNnaWQsIHNpemU7CisJaW50IHR5cGU7CisJdW5zaWduZWQgaW50IGxvY2FscG9ydCwgcmVtb3RlcG9ydDsKKworCW1zZ2lkID0gaGVhZGVyLT5tc2dpZDsKKwlzaXplID0gaGVhZGVyLT5zaXplOworCXR5cGUgPSBWQ0hJUV9NU0dfVFlQRShtc2dpZCk7CisJbG9jYWxwb3J0ID0gVkNISVFfTVNHX0RTVFBPUlQobXNnaWQpOworCXJlbW90ZXBvcnQgPSBWQ0hJUV9NU0dfU1JDUE9SVChtc2dpZCk7CisJaWYgKHNpemUgPj0gc2l6ZW9mKHN0cnVjdCB2Y2hpcV9vcGVuX3BheWxvYWQpKSB7CisJCWNvbnN0IHN0cnVjdCB2Y2hpcV9vcGVuX3BheWxvYWQgKnBheWxvYWQgPQorCQkJKHN0cnVjdCB2Y2hpcV9vcGVuX3BheWxvYWQgKiloZWFkZXItPmRhdGE7CisJCXVuc2lnbmVkIGludCBmb3VyY2M7CisKKwkJZm91cmNjID0gcGF5bG9hZC0+Zm91cmNjOworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlZDogcHJzIE9QRU5AJXggKCVkLT4nJWMlYyVjJWMnKSIsCisJCQlzdGF0ZS0+aWQsICh1bnNpZ25lZCBpbnQpaGVhZGVyLAorCQkJbG9jYWxwb3J0LAorCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUyhmb3VyY2MpKTsKKworCQlzZXJ2aWNlID0gZ2V0X2xpc3RlbmluZ19zZXJ2aWNlKHN0YXRlLCBmb3VyY2MpOworCisJCWlmIChzZXJ2aWNlKSB7CisJCQkvKiBBIG1hdGNoaW5nIHNlcnZpY2UgZXhpc3RzICovCisJCQlzaG9ydCB2ZXJzaW9uID0gcGF5bG9hZC0+dmVyc2lvbjsKKwkJCXNob3J0IHZlcnNpb25fbWluID0gcGF5bG9hZC0+dmVyc2lvbl9taW47CisJCQlpZiAoKHNlcnZpY2UtPnZlcnNpb24gPCB2ZXJzaW9uX21pbikgfHwKKwkJCQkodmVyc2lvbiA8IHNlcnZpY2UtPnZlcnNpb25fbWluKSkgeworCQkJCS8qIFZlcnNpb24gbWlzbWF0Y2ggKi8KKwkJCQl2Y2hpcV9sb3VkX2Vycm9yX2hlYWRlcigpOworCQkJCXZjaGlxX2xvdWRfZXJyb3IoIiVkOiBzZXJ2aWNlICVkICglYyVjJWMlYykgIgorCQkJCQkidmVyc2lvbiBtaXNtYXRjaCAtIGxvY2FsICglZCwgbWluICVkKSIKKwkJCQkJIiB2cy4gcmVtb3RlICglZCwgbWluICVkKSIsCisJCQkJCXN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0LAorCQkJCQlWQ0hJUV9GT1VSQ0NfQVNfNENIQVJTKGZvdXJjYyksCisJCQkJCXNlcnZpY2UtPnZlcnNpb24sIHNlcnZpY2UtPnZlcnNpb25fbWluLAorCQkJCQl2ZXJzaW9uLCB2ZXJzaW9uX21pbik7CisJCQkJdmNoaXFfbG91ZF9lcnJvcl9mb290ZXIoKTsKKwkJCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwkJCQlzZXJ2aWNlID0gTlVMTDsKKwkJCQlnb3RvIGZhaWxfb3BlbjsKKwkJCX0KKwkJCXNlcnZpY2UtPnBlZXJfdmVyc2lvbiA9IHZlcnNpb247CisKKwkJCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcpIHsKKwkJCQlzdHJ1Y3QgdmNoaXFfb3BlbmFja19wYXlsb2FkIGFja19wYXlsb2FkID0geworCQkJCQlzZXJ2aWNlLT52ZXJzaW9uCisJCQkJfTsKKwkJCQlWQ0hJUV9FTEVNRU5UX1QgYm9keSA9IHsKKwkJCQkJJmFja19wYXlsb2FkLAorCQkJCQlzaXplb2YoYWNrX3BheWxvYWQpCisJCQkJfTsKKworCQkJCWlmIChzdGF0ZS0+dmVyc2lvbl9jb21tb24gPAorCQkJCSAgICBWQ0hJUV9WRVJTSU9OX1NZTkNIUk9OT1VTX01PREUpCisJCQkJCXNlcnZpY2UtPnN5bmMgPSAwOworCisJCQkJLyogQWNrbm93bGVkZ2UgdGhlIE9QRU4gKi8KKwkJCQlpZiAoc2VydmljZS0+c3luYyAmJgorCQkJCSAgICAoc3RhdGUtPnZlcnNpb25fY29tbW9uID49CisJCQkJICAgICBWQ0hJUV9WRVJTSU9OX1NZTkNIUk9OT1VTX01PREUpKSB7CisJCQkJCWlmIChxdWV1ZV9tZXNzYWdlX3N5bmMoc3RhdGUsIE5VTEwsCisJCQkJCQlWQ0hJUV9NQUtFX01TRygKKwkJCQkJCQlWQ0hJUV9NU0dfT1BFTkFDSywKKwkJCQkJCQlzZXJ2aWNlLT5sb2NhbHBvcnQsCisJCQkJCQkJcmVtb3RlcG9ydCksCisJCQkJCQkmYm9keSwgMSwgc2l6ZW9mKGFja19wYXlsb2FkKSwKKwkJCQkJCTApID09IFZDSElRX1JFVFJZKQorCQkJCQkJZ290byBiYWlsX25vdF9yZWFkeTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAocXVldWVfbWVzc2FnZShzdGF0ZSwgTlVMTCwKKwkJCQkJCVZDSElRX01BS0VfTVNHKAorCQkJCQkJCVZDSElRX01TR19PUEVOQUNLLAorCQkJCQkJCXNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCQkJCQlyZW1vdGVwb3J0KSwKKwkJCQkJCSZib2R5LCAxLCBzaXplb2YoYWNrX3BheWxvYWQpLAorCQkJCQkJMCkgPT0gVkNISVFfUkVUUlkpCisJCQkJCQlnb3RvIGJhaWxfbm90X3JlYWR5OworCQkJCX0KKworCQkJCS8qIFRoZSBzZXJ2aWNlIGlzIG5vdyBvcGVuICovCisJCQkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwKKwkJCQkJc2VydmljZS0+c3luYyA/IFZDSElRX1NSVlNUQVRFX09QRU5TWU5DCisJCQkJCTogVkNISVFfU1JWU1RBVEVfT1BFTik7CisJCQl9CisKKwkJCXNlcnZpY2UtPnJlbW90ZXBvcnQgPSByZW1vdGVwb3J0OworCQkJc2VydmljZS0+Y2xpZW50X2lkID0gKChpbnQgKiloZWFkZXItPmRhdGEpWzFdOworCQkJaWYgKG1ha2Vfc2VydmljZV9jYWxsYmFjayhzZXJ2aWNlLCBWQ0hJUV9TRVJWSUNFX09QRU5FRCwKKwkJCQlOVUxMLCBOVUxMKSA9PSBWQ0hJUV9SRVRSWSkgeworCQkJCS8qIEJhaWwgb3V0IGlmIG5vdCByZWFkeSAqLworCQkJCXNlcnZpY2UtPnJlbW90ZXBvcnQgPSBWQ0hJUV9QT1JUX0ZSRUU7CisJCQkJZ290byBiYWlsX25vdF9yZWFkeTsKKwkJCX0KKworCQkJLyogU3VjY2VzcyAtIHRoZSBtZXNzYWdlIGhhcyBiZWVuIGRlYWx0IHdpdGggKi8KKwkJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKK2ZhaWxfb3BlbjoKKwkvKiBObyBhdmFpbGFibGUgc2VydmljZSwgb3IgYW4gaW52YWxpZCByZXF1ZXN0IC0gc2VuZCBhIENMT1NFICovCisJaWYgKHF1ZXVlX21lc3NhZ2Uoc3RhdGUsIE5VTEwsCisJCVZDSElRX01BS0VfTVNHKFZDSElRX01TR19DTE9TRSwgMCwgVkNISVFfTVNHX1NSQ1BPUlQobXNnaWQpKSwKKwkJTlVMTCwgMCwgMCwgMCkgPT0gVkNISVFfUkVUUlkpCisJCWdvdG8gYmFpbF9ub3RfcmVhZHk7CisKKwlyZXR1cm4gMTsKKworYmFpbF9ub3RfcmVhZHk6CisJaWYgKHNlcnZpY2UpCisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCBieSB0aGUgc2xvdCBoYW5kbGVyIHRocmVhZCAqLworc3RhdGljIHZvaWQKK3BhcnNlX3J4X3Nsb3RzKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX1NIQVJFRF9TVEFURV9UICpyZW1vdGUgPSBzdGF0ZS0+cmVtb3RlOworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IE5VTEw7CisJaW50IHR4X3BvczsKKwlERUJVR19JTklUSUFMSVNFKHN0YXRlLT5sb2NhbCkKKworCXR4X3BvcyA9IHJlbW90ZS0+dHhfcG9zOworCisJd2hpbGUgKHN0YXRlLT5yeF9wb3MgIT0gdHhfcG9zKSB7CisJCVZDSElRX0hFQURFUl9UICpoZWFkZXI7CisJCWludCBtc2dpZCwgc2l6ZTsKKwkJaW50IHR5cGU7CisJCXVuc2lnbmVkIGludCBsb2NhbHBvcnQsIHJlbW90ZXBvcnQ7CisKKwkJREVCVUdfVFJBQ0UoUEFSU0VfTElORSk7CisJCWlmICghc3RhdGUtPnJ4X2RhdGEpIHsKKwkJCWludCByeF9pbmRleDsKKwkJCVdBUk5fT04oISgoc3RhdGUtPnJ4X3BvcyAmIFZDSElRX1NMT1RfTUFTSykgPT0gMCkpOworCQkJcnhfaW5kZXggPSByZW1vdGUtPnNsb3RfcXVldWVbCisJCQkJU0xPVF9RVUVVRV9JTkRFWF9GUk9NX1BPUyhzdGF0ZS0+cnhfcG9zKSAmCisJCQkJVkNISVFfU0xPVF9RVUVVRV9NQVNLXTsKKwkJCXN0YXRlLT5yeF9kYXRhID0gKGNoYXIgKilTTE9UX0RBVEFfRlJPTV9JTkRFWChzdGF0ZSwKKwkJCQlyeF9pbmRleCk7CisJCQlzdGF0ZS0+cnhfaW5mbyA9IFNMT1RfSU5GT19GUk9NX0lOREVYKHN0YXRlLCByeF9pbmRleCk7CisKKwkJCS8qIEluaXRpYWxpc2UgdXNlX2NvdW50IHRvIG9uZSwgYW5kIGluY3JlbWVudAorCQkJKiogcmVsZWFzZV9jb3VudCBhdCB0aGUgZW5kIG9mIHRoZSBzbG90IHRvIGF2b2lkCisJCQkqKiByZWxlYXNpbmcgdGhlIHNsb3QgcHJlbWF0dXJlbHkuICovCisJCQlzdGF0ZS0+cnhfaW5mby0+dXNlX2NvdW50ID0gMTsKKwkJCXN0YXRlLT5yeF9pbmZvLT5yZWxlYXNlX2NvdW50ID0gMDsKKwkJfQorCisJCWhlYWRlciA9IChWQ0hJUV9IRUFERVJfVCAqKShzdGF0ZS0+cnhfZGF0YSArCisJCQkoc3RhdGUtPnJ4X3BvcyAmIFZDSElRX1NMT1RfTUFTSykpOworCQlERUJVR19WQUxVRShQQVJTRV9IRUFERVIsIChpbnQpaGVhZGVyKTsKKwkJbXNnaWQgPSBoZWFkZXItPm1zZ2lkOworCQlERUJVR19WQUxVRShQQVJTRV9NU0dJRCwgbXNnaWQpOworCQlzaXplID0gaGVhZGVyLT5zaXplOworCQl0eXBlID0gVkNISVFfTVNHX1RZUEUobXNnaWQpOworCQlsb2NhbHBvcnQgPSBWQ0hJUV9NU0dfRFNUUE9SVChtc2dpZCk7CisJCXJlbW90ZXBvcnQgPSBWQ0hJUV9NU0dfU1JDUE9SVChtc2dpZCk7CisKKwkJaWYgKHR5cGUgIT0gVkNISVFfTVNHX0RBVEEpCisJCQlWQ0hJUV9TVEFUU19JTkMoc3RhdGUsIGN0cmxfcnhfY291bnQpOworCisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFZDSElRX01TR19PUEVOQUNLOgorCQljYXNlIFZDSElRX01TR19DTE9TRToKKwkJY2FzZSBWQ0hJUV9NU0dfREFUQToKKwkJY2FzZSBWQ0hJUV9NU0dfQlVMS19SWDoKKwkJY2FzZSBWQ0hJUV9NU0dfQlVMS19UWDoKKwkJY2FzZSBWQ0hJUV9NU0dfQlVMS19SWF9ET05FOgorCQljYXNlIFZDSElRX01TR19CVUxLX1RYX0RPTkU6CisJCQlzZXJ2aWNlID0gZmluZF9zZXJ2aWNlX2J5X3BvcnQoc3RhdGUsIGxvY2FscG9ydCk7CisJCQlpZiAoKCFzZXJ2aWNlIHx8CisJCQkgICAgICgoc2VydmljZS0+cmVtb3RlcG9ydCAhPSByZW1vdGVwb3J0KSAmJgorCQkJICAgICAgKHNlcnZpY2UtPnJlbW90ZXBvcnQgIT0gVkNISVFfUE9SVF9GUkVFKSkpICYmCisJCQkgICAgKGxvY2FscG9ydCA9PSAwKSAmJgorCQkJICAgICh0eXBlID09IFZDSElRX01TR19DTE9TRSkpIHsKKwkJCQkvKiBUaGlzIGNvdWxkIGJlIGEgQ0xPU0UgZnJvbSBhIGNsaWVudCB3aGljaAorCQkJCSAgIGhhZG4ndCB5ZXQgcmVjZWl2ZWQgdGhlIE9QRU5BQ0sgLSBsb29rIGZvcgorCQkJCSAgIHRoZSBjb25uZWN0ZWQgc2VydmljZSAqLworCQkJCWlmIChzZXJ2aWNlKQorCQkJCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwkJCQlzZXJ2aWNlID0gZ2V0X2Nvbm5lY3RlZF9zZXJ2aWNlKHN0YXRlLAorCQkJCQlyZW1vdGVwb3J0KTsKKwkJCQlpZiAoc2VydmljZSkKKwkJCQkJdmNoaXFfbG9nX3dhcm5pbmcodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCQkiJWQ6IHBycyAlc0AleCAoJWQtPiVkKSAtICIKKwkJCQkJCSJmb3VuZCBjb25uZWN0ZWQgc2VydmljZSAlZCIsCisJCQkJCQlzdGF0ZS0+aWQsIG1zZ190eXBlX3N0cih0eXBlKSwKKwkJCQkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyLAorCQkJCQkJcmVtb3RlcG9ydCwgbG9jYWxwb3J0LAorCQkJCQkJc2VydmljZS0+bG9jYWxwb3J0KTsKKwkJCX0KKworCQkJaWYgKCFzZXJ2aWNlKSB7CisJCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkiJWQ6IHBycyAlc0AleCAoJWQtPiVkKSAtICIKKwkJCQkJImludmFsaWQvY2xvc2VkIHNlcnZpY2UgJWQiLAorCQkJCQlzdGF0ZS0+aWQsIG1zZ190eXBlX3N0cih0eXBlKSwKKwkJCQkJKHVuc2lnbmVkIGludCloZWFkZXIsCisJCQkJCXJlbW90ZXBvcnQsIGxvY2FscG9ydCwgbG9jYWxwb3J0KTsKKwkJCQlnb3RvIHNraXBfbWVzc2FnZTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoU1JWVFJBQ0VfRU5BQkxFRChzZXJ2aWNlLCBWQ0hJUV9MT0dfSU5GTykpIHsKKwkJCWludCBzdmNfZm91cmNjOworCisJCQlzdmNfZm91cmNjID0gc2VydmljZQorCQkJCT8gc2VydmljZS0+YmFzZS5mb3VyY2MKKwkJCQk6IFZDSElRX01BS0VfRk9VUkNDKCc/JywgJz8nLCAnPycsICc/Jyk7CisJCQl2Y2hpcV9sb2dfaW5mbyhTUlZUUkFDRV9MRVZFTChzZXJ2aWNlKSwKKwkJCQkiUmN2ZCBNc2cgJXMoJXUpIGZyb20gJWMlYyVjJWMgczolZCBkOiVkICIKKwkJCQkibGVuOiVkIiwKKwkJCQltc2dfdHlwZV9zdHIodHlwZSksIHR5cGUsCisJCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUyhzdmNfZm91cmNjKSwKKwkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQsIHNpemUpOworCQkJaWYgKHNpemUgPiAwKQorCQkJCXZjaGlxX2xvZ19kdW1wX21lbSgiUmN2ZCIsIDAsIGhlYWRlci0+ZGF0YSwKKwkJCQkJbWluKDY0LCBzaXplKSk7CisJCX0KKworCQlpZiAoKCh1bnNpZ25lZCBpbnQpaGVhZGVyICYgVkNISVFfU0xPVF9NQVNLKSArIGNhbGNfc3RyaWRlKHNpemUpCisJCQk+IFZDSElRX1NMT1RfU0laRSkgeworCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCSJoZWFkZXIgJXggKG1zZ2lkICV4KSAtIHNpemUgJXggdG9vIGJpZyBmb3IgIgorCQkJCSJzbG90IiwKKwkJCQkodW5zaWduZWQgaW50KWhlYWRlciwgKHVuc2lnbmVkIGludCltc2dpZCwKKwkJCQkodW5zaWduZWQgaW50KXNpemUpOworCQkJV0FSTigxLCAib3ZlcnNpemVkIGZvciBzbG90XG4iKTsKKwkJfQorCisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFZDSElRX01TR19PUEVOOgorCQkJV0FSTl9PTighKFZDSElRX01TR19EU1RQT1JUKG1zZ2lkKSA9PSAwKSk7CisJCQlpZiAoIXBhcnNlX29wZW4oc3RhdGUsIGhlYWRlcikpCisJCQkJZ290byBiYWlsX25vdF9yZWFkeTsKKwkJCWJyZWFrOworCQljYXNlIFZDSElRX01TR19PUEVOQUNLOgorCQkJaWYgKHNpemUgPj0gc2l6ZW9mKHN0cnVjdCB2Y2hpcV9vcGVuYWNrX3BheWxvYWQpKSB7CisJCQkJY29uc3Qgc3RydWN0IHZjaGlxX29wZW5hY2tfcGF5bG9hZCAqcGF5bG9hZCA9CisJCQkJCShzdHJ1Y3QgdmNoaXFfb3BlbmFja19wYXlsb2FkICopCisJCQkJCWhlYWRlci0+ZGF0YTsKKwkJCQlzZXJ2aWNlLT5wZWVyX3ZlcnNpb24gPSBwYXlsb2FkLT52ZXJzaW9uOworCQkJfQorCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJIiVkOiBwcnMgT1BFTkFDS0AleCwleCAoJWQtPiVkKSB2OiVkIiwKKwkJCQlzdGF0ZS0+aWQsICh1bnNpZ25lZCBpbnQpaGVhZGVyLCBzaXplLAorCQkJCXJlbW90ZXBvcnQsIGxvY2FscG9ydCwgc2VydmljZS0+cGVlcl92ZXJzaW9uKTsKKwkJCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSA9PQorCQkJCVZDSElRX1NSVlNUQVRFX09QRU5JTkcpIHsKKwkJCQlzZXJ2aWNlLT5yZW1vdGVwb3J0ID0gcmVtb3RlcG9ydDsKKwkJCQl2Y2hpcV9zZXRfc2VydmljZV9zdGF0ZShzZXJ2aWNlLAorCQkJCQlWQ0hJUV9TUlZTVEFURV9PUEVOKTsKKwkJCQl1cCgmc2VydmljZS0+cmVtb3ZlX2V2ZW50KTsKKwkJCX0gZWxzZQorCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJIk9QRU5BQ0sgcmVjZWl2ZWQgaW4gc3RhdGUgJXMiLAorCQkJCQlzcnZzdGF0ZV9uYW1lc1tzZXJ2aWNlLT5zcnZzdGF0ZV0pOworCQkJYnJlYWs7CisJCWNhc2UgVkNISVFfTVNHX0NMT1NFOgorCQkJV0FSTl9PTihzaXplICE9IDApOyAvKiBUaGVyZSBzaG91bGQgYmUgbm8gZGF0YSAqLworCisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiJWQ6IHBycyBDTE9TRUAleCAoJWQtPiVkKSIsCisJCQkJc3RhdGUtPmlkLCAodW5zaWduZWQgaW50KWhlYWRlciwKKwkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQpOworCisJCQltYXJrX3NlcnZpY2VfY2xvc2luZ19pbnRlcm5hbChzZXJ2aWNlLCAxKTsKKworCQkJaWYgKHZjaGlxX2Nsb3NlX3NlcnZpY2VfaW50ZXJuYWwoc2VydmljZSwKKwkJCQkxLypjbG9zZV9yZWN2ZCovKSA9PSBWQ0hJUV9SRVRSWSkKKwkJCQlnb3RvIGJhaWxfbm90X3JlYWR5OworCisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiQ2xvc2UgU2VydmljZSAlYyVjJWMlYyBzOiV1IGQ6JWQiLAorCQkJCVZDSElRX0ZPVVJDQ19BU180Q0hBUlMoc2VydmljZS0+YmFzZS5mb3VyY2MpLAorCQkJCXNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCQlzZXJ2aWNlLT5yZW1vdGVwb3J0KTsKKwkJCWJyZWFrOworCQljYXNlIFZDSElRX01TR19EQVRBOgorCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJIiVkOiBwcnMgREFUQUAleCwleCAoJWQtPiVkKSIsCisJCQkJc3RhdGUtPmlkLCAodW5zaWduZWQgaW50KWhlYWRlciwgc2l6ZSwKKwkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQpOworCisJCQlpZiAoKHNlcnZpY2UtPnJlbW90ZXBvcnQgPT0gcmVtb3RlcG9ydCkKKwkJCQkmJiAoc2VydmljZS0+c3J2c3RhdGUgPT0KKwkJCQlWQ0hJUV9TUlZTVEFURV9PUEVOKSkgeworCQkJCWhlYWRlci0+bXNnaWQgPSBtc2dpZCB8IFZDSElRX01TR0lEX0NMQUlNRUQ7CisJCQkJY2xhaW1fc2xvdChzdGF0ZS0+cnhfaW5mbyk7CisJCQkJREVCVUdfVFJBQ0UoUEFSU0VfTElORSk7CisJCQkJaWYgKG1ha2Vfc2VydmljZV9jYWxsYmFjayhzZXJ2aWNlLAorCQkJCQlWQ0hJUV9NRVNTQUdFX0FWQUlMQUJMRSwgaGVhZGVyLAorCQkJCQlOVUxMKSA9PSBWQ0hJUV9SRVRSWSkgeworCQkJCQlERUJVR19UUkFDRShQQVJTRV9MSU5FKTsKKwkJCQkJZ290byBiYWlsX25vdF9yZWFkeTsKKwkJCQl9CisJCQkJVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwgY3RybF9yeF9jb3VudCk7CisJCQkJVkNISVFfU0VSVklDRV9TVEFUU19BREQoc2VydmljZSwgY3RybF9yeF9ieXRlcywKKwkJCQkJc2l6ZSk7CisJCQl9IGVsc2UgeworCQkJCVZDSElRX1NUQVRTX0lOQyhzdGF0ZSwgZXJyb3JfY291bnQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVkNISVFfTVNHX0NPTk5FQ1Q6CisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiJWQ6IHBycyBDT05ORUNUQCV4IiwKKwkJCQlzdGF0ZS0+aWQsICh1bnNpZ25lZCBpbnQpaGVhZGVyKTsKKwkJCXN0YXRlLT52ZXJzaW9uX2NvbW1vbiA9ICgoVkNISVFfU0xPVF9aRVJPX1QgKikKKwkJCQkJCSBzdGF0ZS0+c2xvdF9kYXRhKS0+dmVyc2lvbjsKKwkJCXVwKCZzdGF0ZS0+Y29ubmVjdCk7CisJCQlicmVhazsKKwkJY2FzZSBWQ0hJUV9NU0dfQlVMS19SWDoKKwkJY2FzZSBWQ0hJUV9NU0dfQlVMS19UWDogeworCQkJVkNISVFfQlVMS19RVUVVRV9UICpxdWV1ZTsKKwkJCVdBUk5fT04oIXN0YXRlLT5pc19tYXN0ZXIpOworCQkJcXVldWUgPSAodHlwZSA9PSBWQ0hJUV9NU0dfQlVMS19SWCkgPworCQkJCSZzZXJ2aWNlLT5idWxrX3R4IDogJnNlcnZpY2UtPmJ1bGtfcng7CisJCQlpZiAoKHNlcnZpY2UtPnJlbW90ZXBvcnQgPT0gcmVtb3RlcG9ydCkKKwkJCQkmJiAoc2VydmljZS0+c3J2c3RhdGUgPT0KKwkJCQlWQ0hJUV9TUlZTVEFURV9PUEVOKSkgeworCQkJCVZDSElRX0JVTEtfVCAqYnVsazsKKwkJCQlpbnQgcmVzb2x2ZWQgPSAwOworCisJCQkJREVCVUdfVFJBQ0UoUEFSU0VfTElORSk7CisJCQkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgKKwkJCQkJJnNlcnZpY2UtPmJ1bGtfbXV0ZXgpICE9IDApIHsKKwkJCQkJREVCVUdfVFJBQ0UoUEFSU0VfTElORSk7CisJCQkJCWdvdG8gYmFpbF9ub3RfcmVhZHk7CisJCQkJfQorCisJCQkJV0FSTl9PTighKHF1ZXVlLT5yZW1vdGVfaW5zZXJ0IDwgcXVldWUtPnJlbW92ZSArCisJCQkJCVZDSElRX05VTV9TRVJWSUNFX0JVTEtTKSk7CisJCQkJYnVsayA9ICZxdWV1ZS0+YnVsa3NbCisJCQkJCUJVTEtfSU5ERVgocXVldWUtPnJlbW90ZV9pbnNlcnQpXTsKKwkJCQlidWxrLT5yZW1vdGVfZGF0YSA9CisJCQkJCSh2b2lkICopKChpbnQgKiloZWFkZXItPmRhdGEpWzBdOworCQkJCWJ1bGstPnJlbW90ZV9zaXplID0gKChpbnQgKiloZWFkZXItPmRhdGEpWzFdOworCQkJCXdtYigpOworCisJCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCSIlZDogcHJzICVzQCV4ICglZC0+JWQpICV4QCV4IiwKKwkJCQkJc3RhdGUtPmlkLCBtc2dfdHlwZV9zdHIodHlwZSksCisJCQkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyLAorCQkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQsCisJCQkJCWJ1bGstPnJlbW90ZV9zaXplLAorCQkJCQkodW5zaWduZWQgaW50KWJ1bGstPnJlbW90ZV9kYXRhKTsKKworCQkJCXF1ZXVlLT5yZW1vdGVfaW5zZXJ0Kys7CisKKwkJCQlpZiAoYXRvbWljX3JlYWQoJnBhdXNlX2J1bGtzX2NvdW50KSkgeworCQkJCQlzdGF0ZS0+ZGVmZXJyZWRfYnVsa3MrKzsKKwkJCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCQkiJXM6IGRlZmVycmluZyBidWxrICglZCkiLAorCQkJCQkJX19mdW5jX18sCisJCQkJCQlzdGF0ZS0+ZGVmZXJyZWRfYnVsa3MpOworCQkJCQlpZiAoc3RhdGUtPmNvbm5fc3RhdGUgIT0KKwkJCQkJCVZDSElRX0NPTk5TVEFURV9QQVVTRV9TRU5UKQorCQkJCQkJdmNoaXFfbG9nX2Vycm9yKAorCQkJCQkJCXZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkJCSIlczogYnVsa3MgcGF1c2VkIGluICIKKwkJCQkJCQkidW5leHBlY3RlZCBzdGF0ZSAlcyIsCisJCQkJCQkJX19mdW5jX18sCisJCQkJCQkJY29ubl9zdGF0ZV9uYW1lc1sKKwkJCQkJCQlzdGF0ZS0+Y29ubl9zdGF0ZV0pOworCQkJCX0gZWxzZSBpZiAoc3RhdGUtPmNvbm5fc3RhdGUgPT0KKwkJCQkJVkNISVFfQ09OTlNUQVRFX0NPTk5FQ1RFRCkgeworCQkJCQlERUJVR19UUkFDRShQQVJTRV9MSU5FKTsKKwkJCQkJcmVzb2x2ZWQgPSByZXNvbHZlX2J1bGtzKHNlcnZpY2UsCisJCQkJCQlxdWV1ZSk7CisJCQkJfQorCisJCQkJbXV0ZXhfdW5sb2NrKCZzZXJ2aWNlLT5idWxrX211dGV4KTsKKwkJCQlpZiAocmVzb2x2ZWQpCisJCQkJCW5vdGlmeV9idWxrcyhzZXJ2aWNlLCBxdWV1ZSwKKwkJCQkJCTEvKnJldHJ5X3BvbGwqLyk7CisJCQl9CisJCX0gYnJlYWs7CisJCWNhc2UgVkNISVFfTVNHX0JVTEtfUlhfRE9ORToKKwkJY2FzZSBWQ0hJUV9NU0dfQlVMS19UWF9ET05FOgorCQkJV0FSTl9PTihzdGF0ZS0+aXNfbWFzdGVyKTsKKwkJCWlmICgoc2VydmljZS0+cmVtb3RlcG9ydCA9PSByZW1vdGVwb3J0KQorCQkJCSYmIChzZXJ2aWNlLT5zcnZzdGF0ZSAhPQorCQkJCVZDSElRX1NSVlNUQVRFX0ZSRUUpKSB7CisJCQkJVkNISVFfQlVMS19RVUVVRV9UICpxdWV1ZTsKKwkJCQlWQ0hJUV9CVUxLX1QgKmJ1bGs7CisKKwkJCQlxdWV1ZSA9ICh0eXBlID09IFZDSElRX01TR19CVUxLX1JYX0RPTkUpID8KKwkJCQkJJnNlcnZpY2UtPmJ1bGtfcnggOiAmc2VydmljZS0+YnVsa190eDsKKworCQkJCURFQlVHX1RSQUNFKFBBUlNFX0xJTkUpOworCQkJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoCisJCQkJCSZzZXJ2aWNlLT5idWxrX211dGV4KSAhPSAwKSB7CisJCQkJCURFQlVHX1RSQUNFKFBBUlNFX0xJTkUpOworCQkJCQlnb3RvIGJhaWxfbm90X3JlYWR5OworCQkJCX0KKwkJCQlpZiAoKGludCkocXVldWUtPnJlbW90ZV9pbnNlcnQgLQorCQkJCQlxdWV1ZS0+bG9jYWxfaW5zZXJ0KSA+PSAwKSB7CisJCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJCSIlZDogcHJzICVzQCV4ICglZC0+JWQpICIKKwkJCQkJCSJ1bmV4cGVjdGVkIChyaT0lZCxsaT0lZCkiLAorCQkJCQkJc3RhdGUtPmlkLCBtc2dfdHlwZV9zdHIodHlwZSksCisJCQkJCQkodW5zaWduZWQgaW50KWhlYWRlciwKKwkJCQkJCXJlbW90ZXBvcnQsIGxvY2FscG9ydCwKKwkJCQkJCXF1ZXVlLT5yZW1vdGVfaW5zZXJ0LAorCQkJCQkJcXVldWUtPmxvY2FsX2luc2VydCk7CisJCQkJCW11dGV4X3VubG9jaygmc2VydmljZS0+YnVsa19tdXRleCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCUJVR19PTihxdWV1ZS0+cHJvY2VzcyA9PSBxdWV1ZS0+bG9jYWxfaW5zZXJ0KTsKKwkJCQlCVUdfT04ocXVldWUtPnByb2Nlc3MgIT0gcXVldWUtPnJlbW90ZV9pbnNlcnQpOworCisJCQkJYnVsayA9ICZxdWV1ZS0+YnVsa3NbCisJCQkJCUJVTEtfSU5ERVgocXVldWUtPnJlbW90ZV9pbnNlcnQpXTsKKwkJCQlidWxrLT5hY3R1YWwgPSAqKGludCAqKWhlYWRlci0+ZGF0YTsKKwkJCQlxdWV1ZS0+cmVtb3RlX2luc2VydCsrOworCisJCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCSIlZDogcHJzICVzQCV4ICglZC0+JWQpICV4QCV4IiwKKwkJCQkJc3RhdGUtPmlkLCBtc2dfdHlwZV9zdHIodHlwZSksCisJCQkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyLAorCQkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQsCisJCQkJCWJ1bGstPmFjdHVhbCwgKHVuc2lnbmVkIGludClidWxrLT5kYXRhKTsKKworCQkJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJIiVkOiBwcnM6JWQgJWN4IGxpPSV4IHJpPSV4IHA9JXgiLAorCQkJCQlzdGF0ZS0+aWQsIGxvY2FscG9ydCwKKwkJCQkJKHR5cGUgPT0gVkNISVFfTVNHX0JVTEtfUlhfRE9ORSkgPworCQkJCQkJJ3InIDogJ3QnLAorCQkJCQlxdWV1ZS0+bG9jYWxfaW5zZXJ0LAorCQkJCQlxdWV1ZS0+cmVtb3RlX2luc2VydCwgcXVldWUtPnByb2Nlc3MpOworCisJCQkJREVCVUdfVFJBQ0UoUEFSU0VfTElORSk7CisJCQkJV0FSTl9PTihxdWV1ZS0+cHJvY2VzcyA9PSBxdWV1ZS0+bG9jYWxfaW5zZXJ0KTsKKwkJCQl2Y2hpcV9jb21wbGV0ZV9idWxrKGJ1bGspOworCQkJCXF1ZXVlLT5wcm9jZXNzKys7CisJCQkJbXV0ZXhfdW5sb2NrKCZzZXJ2aWNlLT5idWxrX211dGV4KTsKKwkJCQlERUJVR19UUkFDRShQQVJTRV9MSU5FKTsKKwkJCQlub3RpZnlfYnVsa3Moc2VydmljZSwgcXVldWUsIDEvKnJldHJ5X3BvbGwqLyk7CisJCQkJREVCVUdfVFJBQ0UoUEFSU0VfTElORSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBWQ0hJUV9NU0dfUEFERElORzoKKwkJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiJWQ6IHBycyBQQURESU5HQCV4LCV4IiwKKwkJCQlzdGF0ZS0+aWQsICh1bnNpZ25lZCBpbnQpaGVhZGVyLCBzaXplKTsKKwkJCWJyZWFrOworCQljYXNlIFZDSElRX01TR19QQVVTRToKKwkJCS8qIElmIGluaXRpYXRlZCwgc2lnbmFsIHRoZSBhcHBsaWNhdGlvbiB0aHJlYWQgKi8KKwkJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiJWQ6IHBycyBQQVVTRUAleCwleCIsCisJCQkJc3RhdGUtPmlkLCAodW5zaWduZWQgaW50KWhlYWRlciwgc2l6ZSk7CisJCQlpZiAoc3RhdGUtPmNvbm5fc3RhdGUgPT0gVkNISVFfQ09OTlNUQVRFX1BBVVNFRCkgeworCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJIiVkOiBQQVVTRSByZWNlaXZlZCBpbiBzdGF0ZSBQQVVTRUQiLAorCQkJCQlzdGF0ZS0+aWQpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHN0YXRlLT5jb25uX3N0YXRlICE9IFZDSElRX0NPTk5TVEFURV9QQVVTRV9TRU5UKSB7CisJCQkJLyogU2VuZCBhIFBBVVNFIGluIHJlc3BvbnNlICovCisJCQkJaWYgKHF1ZXVlX21lc3NhZ2Uoc3RhdGUsIE5VTEwsCisJCQkJCVZDSElRX01BS0VfTVNHKFZDSElRX01TR19QQVVTRSwgMCwgMCksCisJCQkJCU5VTEwsIDAsIDAsIFFNRkxBR1NfTk9fTVVURVhfVU5MT0NLKQorCQkJCSAgICA9PSBWQ0hJUV9SRVRSWSkKKwkJCQkJZ290byBiYWlsX25vdF9yZWFkeTsKKwkJCQlpZiAoc3RhdGUtPmlzX21hc3RlcikKKwkJCQkJcGF1c2VfYnVsa3Moc3RhdGUpOworCQkJfQorCQkJLyogQXQgdGhpcyBwb2ludCBzbG90X211dGV4IGlzIGhlbGQgKi8KKwkJCXZjaGlxX3NldF9jb25uX3N0YXRlKHN0YXRlLCBWQ0hJUV9DT05OU1RBVEVfUEFVU0VEKTsKKwkJCXZjaGlxX3BsYXRmb3JtX3BhdXNlZChzdGF0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBWQ0hJUV9NU0dfUkVTVU1FOgorCQkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCSIlZDogcHJzIFJFU1VNRUAleCwleCIsCisJCQkJc3RhdGUtPmlkLCAodW5zaWduZWQgaW50KWhlYWRlciwgc2l6ZSk7CisJCQkvKiBSZWxlYXNlIHRoZSBzbG90IG11dGV4ICovCisJCQltdXRleF91bmxvY2soJnN0YXRlLT5zbG90X211dGV4KTsKKwkJCWlmIChzdGF0ZS0+aXNfbWFzdGVyKQorCQkJCXJlc3VtZV9idWxrcyhzdGF0ZSk7CisJCQl2Y2hpcV9zZXRfY29ubl9zdGF0ZShzdGF0ZSwgVkNISVFfQ09OTlNUQVRFX0NPTk5FQ1RFRCk7CisJCQl2Y2hpcV9wbGF0Zm9ybV9yZXN1bWVkKHN0YXRlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVkNISVFfTVNHX1JFTU9URV9VU0U6CisJCQl2Y2hpcV9vbl9yZW1vdGVfdXNlKHN0YXRlKTsKKwkJCWJyZWFrOworCQljYXNlIFZDSElRX01TR19SRU1PVEVfUkVMRUFTRToKKwkJCXZjaGlxX29uX3JlbW90ZV9yZWxlYXNlKHN0YXRlKTsKKwkJCWJyZWFrOworCQljYXNlIFZDSElRX01TR19SRU1PVEVfVVNFX0FDVElWRToKKwkJCXZjaGlxX29uX3JlbW90ZV91c2VfYWN0aXZlKHN0YXRlKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJIiVkOiBwcnMgaW52YWxpZCBtc2dpZCAleEAleCwleCIsCisJCQkJc3RhdGUtPmlkLCBtc2dpZCwgKHVuc2lnbmVkIGludCloZWFkZXIsIHNpemUpOworCQkJV0FSTigxLCAiaW52YWxpZCBtZXNzYWdlXG4iKTsKKwkJCWJyZWFrOworCQl9CisKK3NraXBfbWVzc2FnZToKKwkJaWYgKHNlcnZpY2UpIHsKKwkJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQkJc2VydmljZSA9IE5VTEw7CisJCX0KKworCQlzdGF0ZS0+cnhfcG9zICs9IGNhbGNfc3RyaWRlKHNpemUpOworCisJCURFQlVHX1RSQUNFKFBBUlNFX0xJTkUpOworCQkvKiBQZXJmb3JtIHNvbWUgaG91c2VrZWVwaW5nIHdoZW4gdGhlIGVuZCBvZiB0aGUgc2xvdCBpcworCQkqKiByZWFjaGVkLiAqLworCQlpZiAoKHN0YXRlLT5yeF9wb3MgJiBWQ0hJUV9TTE9UX01BU0spID09IDApIHsKKwkJCS8qIFJlbW92ZSB0aGUgZXh0cmEgcmVmZXJlbmNlIGNvdW50LiAqLworCQkJcmVsZWFzZV9zbG90KHN0YXRlLCBzdGF0ZS0+cnhfaW5mbywgTlVMTCwgTlVMTCk7CisJCQlzdGF0ZS0+cnhfZGF0YSA9IE5VTEw7CisJCX0KKwl9CisKK2JhaWxfbm90X3JlYWR5OgorCWlmIChzZXJ2aWNlKQorCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKK30KKworLyogQ2FsbGVkIGJ5IHRoZSBzbG90IGhhbmRsZXIgdGhyZWFkICovCitzdGF0aWMgaW50CitzbG90X2hhbmRsZXJfZnVuYyh2b2lkICp2KQoreworCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gKFZDSElRX1NUQVRFX1QgKikgdjsKKwlWQ0hJUV9TSEFSRURfU1RBVEVfVCAqbG9jYWwgPSBzdGF0ZS0+bG9jYWw7CisJREVCVUdfSU5JVElBTElTRShsb2NhbCkKKworCXdoaWxlICgxKSB7CisJCURFQlVHX0NPVU5UKFNMT1RfSEFORExFUl9DT1VOVCk7CisJCURFQlVHX1RSQUNFKFNMT1RfSEFORExFUl9MSU5FKTsKKwkJcmVtb3RlX2V2ZW50X3dhaXQoJmxvY2FsLT50cmlnZ2VyKTsKKworCQlybWIoKTsKKworCQlERUJVR19UUkFDRShTTE9UX0hBTkRMRVJfTElORSk7CisJCWlmIChzdGF0ZS0+cG9sbF9uZWVkZWQpIHsKKwkJCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gc3VzcGVuZCAtIG1heSBjaGFuZ2Ugb3VyCisJCQkgKiBjb25uX3N0YXRlICovCisJCQl2Y2hpcV9wbGF0Zm9ybV9jaGVja19zdXNwZW5kKHN0YXRlKTsKKworCQkJc3RhdGUtPnBvbGxfbmVlZGVkID0gMDsKKworCQkJLyogSGFuZGxlIHNlcnZpY2UgcG9sbGluZyBhbmQgb3RoZXIgcmFyZSBjb25kaXRpb25zIGhlcmUKKwkJCSoqIG91dCBvZiB0aGUgbWFpbmxpbmUgY29kZSAqLworCQkJc3dpdGNoIChzdGF0ZS0+Y29ubl9zdGF0ZSkgeworCQkJY2FzZSBWQ0hJUV9DT05OU1RBVEVfQ09OTkVDVEVEOgorCQkJCS8qIFBvbGwgdGhlIHNlcnZpY2VzIGFzIHJlcXVlc3RlZCAqLworCQkJCXBvbGxfc2VydmljZXMoc3RhdGUpOworCQkJCWJyZWFrOworCisJCQljYXNlIFZDSElRX0NPTk5TVEFURV9QQVVTSU5HOgorCQkJCWlmIChzdGF0ZS0+aXNfbWFzdGVyKQorCQkJCQlwYXVzZV9idWxrcyhzdGF0ZSk7CisJCQkJaWYgKHF1ZXVlX21lc3NhZ2Uoc3RhdGUsIE5VTEwsCisJCQkJCVZDSElRX01BS0VfTVNHKFZDSElRX01TR19QQVVTRSwgMCwgMCksCisJCQkJCU5VTEwsIDAsIDAsCisJCQkJCVFNRkxBR1NfTk9fTVVURVhfVU5MT0NLKQorCQkJCSAgICAhPSBWQ0hJUV9SRVRSWSkgeworCQkJCQl2Y2hpcV9zZXRfY29ubl9zdGF0ZShzdGF0ZSwKKwkJCQkJCVZDSElRX0NPTk5TVEFURV9QQVVTRV9TRU5UKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoc3RhdGUtPmlzX21hc3RlcikKKwkJCQkJCXJlc3VtZV9idWxrcyhzdGF0ZSk7CisJCQkJCS8qIFJldHJ5IGxhdGVyICovCisJCQkJCXN0YXRlLT5wb2xsX25lZWRlZCA9IDE7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFZDSElRX0NPTk5TVEFURV9QQVVTRUQ6CisJCQkJdmNoaXFfcGxhdGZvcm1fcmVzdW1lKHN0YXRlKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBWQ0hJUV9DT05OU1RBVEVfUkVTVU1JTkc6CisJCQkJaWYgKHF1ZXVlX21lc3NhZ2Uoc3RhdGUsIE5VTEwsCisJCQkJCVZDSElRX01BS0VfTVNHKFZDSElRX01TR19SRVNVTUUsIDAsIDApLAorCQkJCQlOVUxMLCAwLCAwLCBRTUZMQUdTX05PX01VVEVYX0xPQ0spCisJCQkJCSE9IFZDSElRX1JFVFJZKSB7CisJCQkJCWlmIChzdGF0ZS0+aXNfbWFzdGVyKQorCQkJCQkJcmVzdW1lX2J1bGtzKHN0YXRlKTsKKwkJCQkJdmNoaXFfc2V0X2Nvbm5fc3RhdGUoc3RhdGUsCisJCQkJCQlWQ0hJUV9DT05OU1RBVEVfQ09OTkVDVEVEKTsKKwkJCQkJdmNoaXFfcGxhdGZvcm1fcmVzdW1lZChzdGF0ZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogVGhpcyBzaG91bGQgcmVhbGx5IGJlIGltcG9zc2libGUsCisJCQkJCSoqIHNpbmNlIHRoZSBQQVVTRSBzaG91bGQgaGF2ZSBmbHVzaGVkCisJCQkJCSoqIHRocm91Z2ggb3V0c3RhbmRpbmcgbWVzc2FnZXMuICovCisJCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJCSJGYWlsZWQgdG8gc2VuZCBSRVNVTUUgIgorCQkJCQkJIm1lc3NhZ2UiKTsKKwkJCQkJQlVHKCk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFZDSElRX0NPTk5TVEFURV9QQVVTRV9USU1FT1VUOgorCQkJY2FzZSBWQ0hJUV9DT05OU1RBVEVfUkVTVU1FX1RJTUVPVVQ6CisJCQkJdmNoaXFfcGxhdGZvcm1faGFuZGxlX3RpbWVvdXQoc3RhdGUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKworCisJCX0KKworCQlERUJVR19UUkFDRShTTE9UX0hBTkRMRVJfTElORSk7CisJCXBhcnNlX3J4X3Nsb3RzKHN0YXRlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogQ2FsbGVkIGJ5IHRoZSByZWN5Y2xlIHRocmVhZCAqLworc3RhdGljIGludAorcmVjeWNsZV9mdW5jKHZvaWQgKnYpCit7CisJVkNISVFfU1RBVEVfVCAqc3RhdGUgPSAoVkNISVFfU1RBVEVfVCAqKSB2OworCVZDSElRX1NIQVJFRF9TVEFURV9UICpsb2NhbCA9IHN0YXRlLT5sb2NhbDsKKworCXdoaWxlICgxKSB7CisJCXJlbW90ZV9ldmVudF93YWl0KCZsb2NhbC0+cmVjeWNsZSk7CisKKwkJcHJvY2Vzc19mcmVlX3F1ZXVlKHN0YXRlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogQ2FsbGVkIGJ5IHRoZSBzeW5jIHRocmVhZCAqLworc3RhdGljIGludAorc3luY19mdW5jKHZvaWQgKnYpCit7CisJVkNISVFfU1RBVEVfVCAqc3RhdGUgPSAoVkNISVFfU1RBVEVfVCAqKSB2OworCVZDSElRX1NIQVJFRF9TVEFURV9UICpsb2NhbCA9IHN0YXRlLT5sb2NhbDsKKwlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyID0gKFZDSElRX0hFQURFUl9UICopU0xPVF9EQVRBX0ZST01fSU5ERVgoc3RhdGUsCisJCXN0YXRlLT5yZW1vdGUtPnNsb3Rfc3luYyk7CisKKwl3aGlsZSAoMSkgeworCQlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2U7CisJCWludCBtc2dpZCwgc2l6ZTsKKwkJaW50IHR5cGU7CisJCXVuc2lnbmVkIGludCBsb2NhbHBvcnQsIHJlbW90ZXBvcnQ7CisKKwkJcmVtb3RlX2V2ZW50X3dhaXQoJmxvY2FsLT5zeW5jX3RyaWdnZXIpOworCisJCXJtYigpOworCisJCW1zZ2lkID0gaGVhZGVyLT5tc2dpZDsKKwkJc2l6ZSA9IGhlYWRlci0+c2l6ZTsKKwkJdHlwZSA9IFZDSElRX01TR19UWVBFKG1zZ2lkKTsKKwkJbG9jYWxwb3J0ID0gVkNISVFfTVNHX0RTVFBPUlQobXNnaWQpOworCQlyZW1vdGVwb3J0ID0gVkNISVFfTVNHX1NSQ1BPUlQobXNnaWQpOworCisJCXNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfYnlfcG9ydChzdGF0ZSwgbG9jYWxwb3J0KTsKKworCQlpZiAoIXNlcnZpY2UpIHsKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9zeW5jX2xvZ19sZXZlbCwKKwkJCQkiJWQ6IHNmICVzQCV4ICglZC0+JWQpIC0gIgorCQkJCSJpbnZhbGlkL2Nsb3NlZCBzZXJ2aWNlICVkIiwKKwkJCQlzdGF0ZS0+aWQsIG1zZ190eXBlX3N0cih0eXBlKSwKKwkJCQkodW5zaWduZWQgaW50KWhlYWRlciwKKwkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQsIGxvY2FscG9ydCk7CisJCQlyZWxlYXNlX21lc3NhZ2Vfc3luYyhzdGF0ZSwgaGVhZGVyKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZjaGlxX3N5bmNfbG9nX2xldmVsID49IFZDSElRX0xPR19UUkFDRSkgeworCQkJaW50IHN2Y19mb3VyY2M7CisKKwkJCXN2Y19mb3VyY2MgPSBzZXJ2aWNlCisJCQkJPyBzZXJ2aWNlLT5iYXNlLmZvdXJjYworCQkJCTogVkNISVFfTUFLRV9GT1VSQ0MoJz8nLCAnPycsICc/JywgJz8nKTsKKwkJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zeW5jX2xvZ19sZXZlbCwKKwkJCQkiUmN2ZCBNc2cgJXMgZnJvbSAlYyVjJWMlYyBzOiVkIGQ6JWQgbGVuOiVkIiwKKwkJCQltc2dfdHlwZV9zdHIodHlwZSksCisJCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUyhzdmNfZm91cmNjKSwKKwkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQsIHNpemUpOworCQkJaWYgKHNpemUgPiAwKQorCQkJCXZjaGlxX2xvZ19kdW1wX21lbSgiUmN2ZCIsIDAsIGhlYWRlci0+ZGF0YSwKKwkJCQkJbWluKDY0LCBzaXplKSk7CisJCX0KKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBWQ0hJUV9NU0dfT1BFTkFDSzoKKwkJCWlmIChzaXplID49IHNpemVvZihzdHJ1Y3QgdmNoaXFfb3BlbmFja19wYXlsb2FkKSkgeworCQkJCWNvbnN0IHN0cnVjdCB2Y2hpcV9vcGVuYWNrX3BheWxvYWQgKnBheWxvYWQgPQorCQkJCQkoc3RydWN0IHZjaGlxX29wZW5hY2tfcGF5bG9hZCAqKQorCQkJCQloZWFkZXItPmRhdGE7CisJCQkJc2VydmljZS0+cGVlcl92ZXJzaW9uID0gcGF5bG9hZC0+dmVyc2lvbjsKKwkJCX0KKwkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N5bmNfbG9nX2xldmVsLAorCQkJCSIlZDogc2YgT1BFTkFDS0AleCwleCAoJWQtPiVkKSB2OiVkIiwKKwkJCQlzdGF0ZS0+aWQsICh1bnNpZ25lZCBpbnQpaGVhZGVyLCBzaXplLAorCQkJCXJlbW90ZXBvcnQsIGxvY2FscG9ydCwgc2VydmljZS0+cGVlcl92ZXJzaW9uKTsKKwkJCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9PUEVOSU5HKSB7CisJCQkJc2VydmljZS0+cmVtb3RlcG9ydCA9IHJlbW90ZXBvcnQ7CisJCQkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwKKwkJCQkJVkNISVFfU1JWU1RBVEVfT1BFTlNZTkMpOworCQkJCXNlcnZpY2UtPnN5bmMgPSAxOworCQkJCXVwKCZzZXJ2aWNlLT5yZW1vdmVfZXZlbnQpOworCQkJfQorCQkJcmVsZWFzZV9tZXNzYWdlX3N5bmMoc3RhdGUsIGhlYWRlcik7CisJCQlicmVhazsKKworCQljYXNlIFZDSElRX01TR19EQVRBOgorCQkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N5bmNfbG9nX2xldmVsLAorCQkJCSIlZDogc2YgREFUQUAleCwleCAoJWQtPiVkKSIsCisJCQkJc3RhdGUtPmlkLCAodW5zaWduZWQgaW50KWhlYWRlciwgc2l6ZSwKKwkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQpOworCisJCQlpZiAoKHNlcnZpY2UtPnJlbW90ZXBvcnQgPT0gcmVtb3RlcG9ydCkgJiYKKwkJCQkoc2VydmljZS0+c3J2c3RhdGUgPT0KKwkJCQlWQ0hJUV9TUlZTVEFURV9PUEVOU1lOQykpIHsKKwkJCQlpZiAobWFrZV9zZXJ2aWNlX2NhbGxiYWNrKHNlcnZpY2UsCisJCQkJCVZDSElRX01FU1NBR0VfQVZBSUxBQkxFLCBoZWFkZXIsCisJCQkJCU5VTEwpID09IFZDSElRX1JFVFJZKQorCQkJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3luY19sb2dfbGV2ZWwsCisJCQkJCQkic3luY2hyb25vdXMgY2FsbGJhY2sgdG8gIgorCQkJCQkJInNlcnZpY2UgJWQgcmV0dXJucyAiCisJCQkJCQkiVkNISVFfUkVUUlkiLAorCQkJCQkJbG9jYWxwb3J0KTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3luY19sb2dfbGV2ZWwsCisJCQkJIiVkOiBzZiB1bmV4cGVjdGVkIG1zZ2lkICV4QCV4LCV4IiwKKwkJCQlzdGF0ZS0+aWQsIG1zZ2lkLCAodW5zaWduZWQgaW50KWhlYWRlciwgc2l6ZSk7CisJCQlyZWxlYXNlX21lc3NhZ2Vfc3luYyhzdGF0ZSwgaGVhZGVyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQKK2luaXRfYnVsa19xdWV1ZShWQ0hJUV9CVUxLX1FVRVVFX1QgKnF1ZXVlKQoreworCXF1ZXVlLT5sb2NhbF9pbnNlcnQgPSAwOworCXF1ZXVlLT5yZW1vdGVfaW5zZXJ0ID0gMDsKKwlxdWV1ZS0+cHJvY2VzcyA9IDA7CisJcXVldWUtPnJlbW90ZV9ub3RpZnkgPSAwOworCXF1ZXVlLT5yZW1vdmUgPSAwOworfQorCisKK2lubGluZSBjb25zdCBjaGFyICoKK2dldF9jb25uX3N0YXRlX25hbWUoVkNISVFfQ09OTlNUQVRFX1QgY29ubl9zdGF0ZSkKK3sKKwlyZXR1cm4gY29ubl9zdGF0ZV9uYW1lc1tjb25uX3N0YXRlXTsKK30KKworCitWQ0hJUV9TTE9UX1pFUk9fVCAqCit2Y2hpcV9pbml0X3Nsb3RzKHZvaWQgKm1lbV9iYXNlLCBpbnQgbWVtX3NpemUpCit7CisJaW50IG1lbV9hbGlnbiA9IChWQ0hJUV9TTE9UX1NJWkUgLSAoaW50KW1lbV9iYXNlKSAmIFZDSElRX1NMT1RfTUFTSzsKKwlWQ0hJUV9TTE9UX1pFUk9fVCAqc2xvdF96ZXJvID0KKwkJKFZDSElRX1NMT1RfWkVST19UICopKChjaGFyICopbWVtX2Jhc2UgKyBtZW1fYWxpZ24pOworCWludCBudW1fc2xvdHMgPSAobWVtX3NpemUgLSBtZW1fYWxpZ24pL1ZDSElRX1NMT1RfU0laRTsKKwlpbnQgZmlyc3RfZGF0YV9zbG90ID0gVkNISVFfU0xPVF9aRVJPX1NMT1RTOworCisJLyogRW5zdXJlIHRoZXJlIGlzIGVub3VnaCBtZW1vcnkgdG8gcnVuIGFuIGFic29sdXRlbHkgbWluaW11bSBzeXN0ZW0gKi8KKwludW1fc2xvdHMgLT0gZmlyc3RfZGF0YV9zbG90OworCisJaWYgKG51bV9zbG90cyA8IDQpIHsKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJInZjaGlxX2luaXRfc2xvdHMgLSBpbnN1ZmZpY2llbnQgbWVtb3J5ICV4IGJ5dGVzIiwKKwkJCW1lbV9zaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHNsb3RfemVybywgMCwgc2l6ZW9mKFZDSElRX1NMT1RfWkVST19UKSk7CisKKwlzbG90X3plcm8tPm1hZ2ljID0gVkNISVFfTUFHSUM7CisJc2xvdF96ZXJvLT52ZXJzaW9uID0gVkNISVFfVkVSU0lPTjsKKwlzbG90X3plcm8tPnZlcnNpb25fbWluID0gVkNISVFfVkVSU0lPTl9NSU47CisJc2xvdF96ZXJvLT5zbG90X3plcm9fc2l6ZSA9IHNpemVvZihWQ0hJUV9TTE9UX1pFUk9fVCk7CisJc2xvdF96ZXJvLT5zbG90X3NpemUgPSBWQ0hJUV9TTE9UX1NJWkU7CisJc2xvdF96ZXJvLT5tYXhfc2xvdHMgPSBWQ0hJUV9NQVhfU0xPVFM7CisJc2xvdF96ZXJvLT5tYXhfc2xvdHNfcGVyX3NpZGUgPSBWQ0hJUV9NQVhfU0xPVFNfUEVSX1NJREU7CisKKwlzbG90X3plcm8tPm1hc3Rlci5zbG90X3N5bmMgPSBmaXJzdF9kYXRhX3Nsb3Q7CisJc2xvdF96ZXJvLT5tYXN0ZXIuc2xvdF9maXJzdCA9IGZpcnN0X2RhdGFfc2xvdCArIDE7CisJc2xvdF96ZXJvLT5tYXN0ZXIuc2xvdF9sYXN0ID0gZmlyc3RfZGF0YV9zbG90ICsgKG51bV9zbG90cy8yKSAtIDE7CisJc2xvdF96ZXJvLT5zbGF2ZS5zbG90X3N5bmMgPSBmaXJzdF9kYXRhX3Nsb3QgKyAobnVtX3Nsb3RzLzIpOworCXNsb3RfemVyby0+c2xhdmUuc2xvdF9maXJzdCA9IGZpcnN0X2RhdGFfc2xvdCArIChudW1fc2xvdHMvMikgKyAxOworCXNsb3RfemVyby0+c2xhdmUuc2xvdF9sYXN0ID0gZmlyc3RfZGF0YV9zbG90ICsgbnVtX3Nsb3RzIC0gMTsKKworCXJldHVybiBzbG90X3plcm87Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9pbml0X3N0YXRlKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9TTE9UX1pFUk9fVCAqc2xvdF96ZXJvLAorCQkgaW50IGlzX21hc3RlcikKK3sKKwlWQ0hJUV9TSEFSRURfU1RBVEVfVCAqbG9jYWw7CisJVkNISVFfU0hBUkVEX1NUQVRFX1QgKnJlbW90ZTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXM7CisJY2hhciB0aHJlYWRuYW1lWzEwXTsKKwlzdGF0aWMgaW50IGlkOworCWludCBpOworCisJdmNoaXFfbG9nX3dhcm5pbmcodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSIlczogc2xvdF96ZXJvID0gMHglMDhseCwgaXNfbWFzdGVyID0gJWQiLAorCQlfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcpc2xvdF96ZXJvLCBpc19tYXN0ZXIpOworCisJLyogQ2hlY2sgdGhlIGlucHV0IGNvbmZpZ3VyYXRpb24gKi8KKworCWlmIChzbG90X3plcm8tPm1hZ2ljICE9IFZDSElRX01BR0lDKSB7CisJCXZjaGlxX2xvdWRfZXJyb3JfaGVhZGVyKCk7CisJCXZjaGlxX2xvdWRfZXJyb3IoIkludmFsaWQgVkNISVEgbWFnaWMgdmFsdWUgZm91bmQuIik7CisJCXZjaGlxX2xvdWRfZXJyb3IoInNsb3RfemVybz0leDogbWFnaWM9JXggKGV4cGVjdGVkICV4KSIsCisJCQkodW5zaWduZWQgaW50KXNsb3RfemVybywgc2xvdF96ZXJvLT5tYWdpYywgVkNISVFfTUFHSUMpOworCQl2Y2hpcV9sb3VkX2Vycm9yX2Zvb3RlcigpOworCQlyZXR1cm4gVkNISVFfRVJST1I7CisJfQorCisJaWYgKHNsb3RfemVyby0+dmVyc2lvbiA8IFZDSElRX1ZFUlNJT05fTUlOKSB7CisJCXZjaGlxX2xvdWRfZXJyb3JfaGVhZGVyKCk7CisJCXZjaGlxX2xvdWRfZXJyb3IoIkluY29tcGF0aWJsZSBWQ0hJUSB2ZXJzaW9ucyBmb3VuZC4iKTsKKwkJdmNoaXFfbG91ZF9lcnJvcigic2xvdF96ZXJvPSV4OiBWaWRlb0NvcmUgdmVyc2lvbj0lZCAiCisJCQkiKG1pbmltdW0gJWQpIiwKKwkJCSh1bnNpZ25lZCBpbnQpc2xvdF96ZXJvLCBzbG90X3plcm8tPnZlcnNpb24sCisJCQlWQ0hJUV9WRVJTSU9OX01JTik7CisJCXZjaGlxX2xvdWRfZXJyb3IoIlJlc3RhcnQgd2l0aCBhIG5ld2VyIFZpZGVvQ29yZSBpbWFnZS4iKTsKKwkJdmNoaXFfbG91ZF9lcnJvcl9mb290ZXIoKTsKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCX0KKworCWlmIChWQ0hJUV9WRVJTSU9OIDwgc2xvdF96ZXJvLT52ZXJzaW9uX21pbikgeworCQl2Y2hpcV9sb3VkX2Vycm9yX2hlYWRlcigpOworCQl2Y2hpcV9sb3VkX2Vycm9yKCJJbmNvbXBhdGlibGUgVkNISVEgdmVyc2lvbnMgZm91bmQuIik7CisJCXZjaGlxX2xvdWRfZXJyb3IoInNsb3RfemVybz0leDogdmVyc2lvbj0lZCAoVmlkZW9Db3JlICIKKwkJCSJtaW5pbXVtICVkKSIsCisJCQkodW5zaWduZWQgaW50KXNsb3RfemVybywgVkNISVFfVkVSU0lPTiwKKwkJCXNsb3RfemVyby0+dmVyc2lvbl9taW4pOworCQl2Y2hpcV9sb3VkX2Vycm9yKCJSZXN0YXJ0IHdpdGggYSBuZXdlciBrZXJuZWwuIik7CisJCXZjaGlxX2xvdWRfZXJyb3JfZm9vdGVyKCk7CisJCXJldHVybiBWQ0hJUV9FUlJPUjsKKwl9CisKKwlpZiAoKHNsb3RfemVyby0+c2xvdF96ZXJvX3NpemUgIT0gc2l6ZW9mKFZDSElRX1NMT1RfWkVST19UKSkgfHwKKwkJIChzbG90X3plcm8tPnNsb3Rfc2l6ZSAhPSBWQ0hJUV9TTE9UX1NJWkUpIHx8CisJCSAoc2xvdF96ZXJvLT5tYXhfc2xvdHMgIT0gVkNISVFfTUFYX1NMT1RTKSB8fAorCQkgKHNsb3RfemVyby0+bWF4X3Nsb3RzX3Blcl9zaWRlICE9IFZDSElRX01BWF9TTE9UU19QRVJfU0lERSkpIHsKKwkJdmNoaXFfbG91ZF9lcnJvcl9oZWFkZXIoKTsKKwkJaWYgKHNsb3RfemVyby0+c2xvdF96ZXJvX3NpemUgIT0gc2l6ZW9mKFZDSElRX1NMT1RfWkVST19UKSkKKwkJCXZjaGlxX2xvdWRfZXJyb3IoInNsb3RfemVybz0leDogc2xvdF96ZXJvX3NpemU9JXggIgorCQkJCSIoZXhwZWN0ZWQgJXgpIiwKKwkJCQkodW5zaWduZWQgaW50KXNsb3RfemVybywKKwkJCQlzbG90X3plcm8tPnNsb3RfemVyb19zaXplLAorCQkJCXNpemVvZihWQ0hJUV9TTE9UX1pFUk9fVCkpOworCQlpZiAoc2xvdF96ZXJvLT5zbG90X3NpemUgIT0gVkNISVFfU0xPVF9TSVpFKQorCQkJdmNoaXFfbG91ZF9lcnJvcigic2xvdF96ZXJvPSV4OiBzbG90X3NpemU9JWQgIgorCQkJCSIoZXhwZWN0ZWQgJWQiLAorCQkJCSh1bnNpZ25lZCBpbnQpc2xvdF96ZXJvLCBzbG90X3plcm8tPnNsb3Rfc2l6ZSwKKwkJCQlWQ0hJUV9TTE9UX1NJWkUpOworCQlpZiAoc2xvdF96ZXJvLT5tYXhfc2xvdHMgIT0gVkNISVFfTUFYX1NMT1RTKQorCQkJdmNoaXFfbG91ZF9lcnJvcigic2xvdF96ZXJvPSV4OiBtYXhfc2xvdHM9JWQgIgorCQkJCSIoZXhwZWN0ZWQgJWQpIiwKKwkJCQkodW5zaWduZWQgaW50KXNsb3RfemVybywgc2xvdF96ZXJvLT5tYXhfc2xvdHMsCisJCQkJVkNISVFfTUFYX1NMT1RTKTsKKwkJaWYgKHNsb3RfemVyby0+bWF4X3Nsb3RzX3Blcl9zaWRlICE9IFZDSElRX01BWF9TTE9UU19QRVJfU0lERSkKKwkJCXZjaGlxX2xvdWRfZXJyb3IoInNsb3RfemVybz0leDogbWF4X3Nsb3RzX3Blcl9zaWRlPSVkICIKKwkJCQkiKGV4cGVjdGVkICVkKSIsCisJCQkJKHVuc2lnbmVkIGludClzbG90X3plcm8sCisJCQkJc2xvdF96ZXJvLT5tYXhfc2xvdHNfcGVyX3NpZGUsCisJCQkJVkNISVFfTUFYX1NMT1RTX1BFUl9TSURFKTsKKwkJdmNoaXFfbG91ZF9lcnJvcl9mb290ZXIoKTsKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCX0KKworCWlmIChWQ0hJUV9WRVJTSU9OIDwgc2xvdF96ZXJvLT52ZXJzaW9uKQorCQlzbG90X3plcm8tPnZlcnNpb24gPSBWQ0hJUV9WRVJTSU9OOworCisJaWYgKGlzX21hc3RlcikgeworCQlsb2NhbCA9ICZzbG90X3plcm8tPm1hc3RlcjsKKwkJcmVtb3RlID0gJnNsb3RfemVyby0+c2xhdmU7CisJfSBlbHNlIHsKKwkJbG9jYWwgPSAmc2xvdF96ZXJvLT5zbGF2ZTsKKwkJcmVtb3RlID0gJnNsb3RfemVyby0+bWFzdGVyOworCX0KKworCWlmIChsb2NhbC0+aW5pdGlhbGlzZWQpIHsKKwkJdmNoaXFfbG91ZF9lcnJvcl9oZWFkZXIoKTsKKwkJaWYgKHJlbW90ZS0+aW5pdGlhbGlzZWQpCisJCQl2Y2hpcV9sb3VkX2Vycm9yKCJsb2NhbCBzdGF0ZSBoYXMgYWxyZWFkeSBiZWVuICIKKwkJCQkiaW5pdGlhbGlzZWQiKTsKKwkJZWxzZQorCQkJdmNoaXFfbG91ZF9lcnJvcigibWFzdGVyL3NsYXZlIG1pc21hdGNoIC0gdHdvICVzcyIsCisJCQkJaXNfbWFzdGVyID8gIm1hc3RlciIgOiAic2xhdmUiKTsKKwkJdmNoaXFfbG91ZF9lcnJvcl9mb290ZXIoKTsKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCX0KKworCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKFZDSElRX1NUQVRFX1QpKTsKKworCXN0YXRlLT5pZCA9IGlkKys7CisJc3RhdGUtPmlzX21hc3RlciA9IGlzX21hc3RlcjsKKworCS8qCisJCWluaXRpYWxpemUgc2hhcmVkIHN0YXRlIHBvaW50ZXJzCisJICovCisKKwlzdGF0ZS0+bG9jYWwgPSBsb2NhbDsKKwlzdGF0ZS0+cmVtb3RlID0gcmVtb3RlOworCXN0YXRlLT5zbG90X2RhdGEgPSAoVkNISVFfU0xPVF9UICopc2xvdF96ZXJvOworCisJLyoKKwkJaW5pdGlhbGl6ZSBldmVudHMgYW5kIG11dGV4ZXMKKwkgKi8KKworCXNlbWFfaW5pdCgmc3RhdGUtPmNvbm5lY3QsIDApOworCW11dGV4X2luaXQoJnN0YXRlLT5tdXRleCk7CisJc2VtYV9pbml0KCZzdGF0ZS0+dHJpZ2dlcl9ldmVudCwgMCk7CisJc2VtYV9pbml0KCZzdGF0ZS0+cmVjeWNsZV9ldmVudCwgMCk7CisJc2VtYV9pbml0KCZzdGF0ZS0+c3luY190cmlnZ2VyX2V2ZW50LCAwKTsKKwlzZW1hX2luaXQoJnN0YXRlLT5zeW5jX3JlbGVhc2VfZXZlbnQsIDApOworCisJbXV0ZXhfaW5pdCgmc3RhdGUtPnNsb3RfbXV0ZXgpOworCW11dGV4X2luaXQoJnN0YXRlLT5yZWN5Y2xlX211dGV4KTsKKwltdXRleF9pbml0KCZzdGF0ZS0+c3luY19tdXRleCk7CisJbXV0ZXhfaW5pdCgmc3RhdGUtPmJ1bGtfdHJhbnNmZXJfbXV0ZXgpOworCisJc2VtYV9pbml0KCZzdGF0ZS0+c2xvdF9hdmFpbGFibGVfZXZlbnQsIDApOworCXNlbWFfaW5pdCgmc3RhdGUtPnNsb3RfcmVtb3ZlX2V2ZW50LCAwKTsKKwlzZW1hX2luaXQoJnN0YXRlLT5kYXRhX3F1b3RhX2V2ZW50LCAwKTsKKworCXN0YXRlLT5zbG90X3F1ZXVlX2F2YWlsYWJsZSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgVkNISVFfTUFYX1NFUlZJQ0VTOyBpKyspIHsKKwkJVkNISVFfU0VSVklDRV9RVU9UQV9UICpzZXJ2aWNlX3F1b3RhID0KKwkJCSZzdGF0ZS0+c2VydmljZV9xdW90YXNbaV07CisJCXNlbWFfaW5pdCgmc2VydmljZV9xdW90YS0+cXVvdGFfZXZlbnQsIDApOworCX0KKworCWZvciAoaSA9IGxvY2FsLT5zbG90X2ZpcnN0OyBpIDw9IGxvY2FsLT5zbG90X2xhc3Q7IGkrKykgeworCQlsb2NhbC0+c2xvdF9xdWV1ZVtzdGF0ZS0+c2xvdF9xdWV1ZV9hdmFpbGFibGUrK10gPSBpOworCQl1cCgmc3RhdGUtPnNsb3RfYXZhaWxhYmxlX2V2ZW50KTsKKwl9CisKKwlzdGF0ZS0+ZGVmYXVsdF9zbG90X3F1b3RhID0gc3RhdGUtPnNsb3RfcXVldWVfYXZhaWxhYmxlLzI7CisJc3RhdGUtPmRlZmF1bHRfbWVzc2FnZV9xdW90YSA9CisJCW1pbigodW5zaWduZWQgc2hvcnQpKHN0YXRlLT5kZWZhdWx0X3Nsb3RfcXVvdGEgKiAyNTYpLAorCQkodW5zaWduZWQgc2hvcnQpfjApOworCisJc3RhdGUtPnByZXZpb3VzX2RhdGFfaW5kZXggPSAtMTsKKwlzdGF0ZS0+ZGF0YV91c2VfY291bnQgPSAwOworCXN0YXRlLT5kYXRhX3F1b3RhID0gc3RhdGUtPnNsb3RfcXVldWVfYXZhaWxhYmxlIC0gMTsKKworCWxvY2FsLT50cmlnZ2VyLmV2ZW50ID0gJnN0YXRlLT50cmlnZ2VyX2V2ZW50OworCXJlbW90ZV9ldmVudF9jcmVhdGUoJmxvY2FsLT50cmlnZ2VyKTsKKwlsb2NhbC0+dHhfcG9zID0gMDsKKworCWxvY2FsLT5yZWN5Y2xlLmV2ZW50ID0gJnN0YXRlLT5yZWN5Y2xlX2V2ZW50OworCXJlbW90ZV9ldmVudF9jcmVhdGUoJmxvY2FsLT5yZWN5Y2xlKTsKKwlsb2NhbC0+c2xvdF9xdWV1ZV9yZWN5Y2xlID0gc3RhdGUtPnNsb3RfcXVldWVfYXZhaWxhYmxlOworCisJbG9jYWwtPnN5bmNfdHJpZ2dlci5ldmVudCA9ICZzdGF0ZS0+c3luY190cmlnZ2VyX2V2ZW50OworCXJlbW90ZV9ldmVudF9jcmVhdGUoJmxvY2FsLT5zeW5jX3RyaWdnZXIpOworCisJbG9jYWwtPnN5bmNfcmVsZWFzZS5ldmVudCA9ICZzdGF0ZS0+c3luY19yZWxlYXNlX2V2ZW50OworCXJlbW90ZV9ldmVudF9jcmVhdGUoJmxvY2FsLT5zeW5jX3JlbGVhc2UpOworCisJLyogQXQgc3RhcnQtb2YtZGF5LCB0aGUgc2xvdCBpcyBlbXB0eSBhbmQgYXZhaWxhYmxlICovCisJKChWQ0hJUV9IRUFERVJfVCAqKVNMT1RfREFUQV9GUk9NX0lOREVYKHN0YXRlLCBsb2NhbC0+c2xvdF9zeW5jKSktPm1zZ2lkCisJCT0gVkNISVFfTVNHSURfUEFERElORzsKKwlyZW1vdGVfZXZlbnRfc2lnbmFsX2xvY2FsKCZsb2NhbC0+c3luY19yZWxlYXNlKTsKKworCWxvY2FsLT5kZWJ1Z1tERUJVR19FTlRSSUVTXSA9IERFQlVHX01BWDsKKworCXN0YXR1cyA9IHZjaGlxX3BsYXRmb3JtX2luaXRfc3RhdGUoc3RhdGUpOworCisJLyoKKwkJYnJpbmcgdXAgc2xvdCBoYW5kbGVyIHRocmVhZAorCSAqLworCXNucHJpbnRmKHRocmVhZG5hbWUsIHNpemVvZih0aHJlYWRuYW1lKSwgIlZDSElRLSVkIiwgc3RhdGUtPmlkKTsKKwlzdGF0ZS0+c2xvdF9oYW5kbGVyX3RocmVhZCA9IGt0aHJlYWRfY3JlYXRlKCZzbG90X2hhbmRsZXJfZnVuYywKKwkJKHZvaWQgKilzdGF0ZSwKKwkJdGhyZWFkbmFtZSk7CisKKwlpZiAoc3RhdGUtPnNsb3RfaGFuZGxlcl90aHJlYWQgPT0gTlVMTCkgeworCQl2Y2hpcV9sb3VkX2Vycm9yX2hlYWRlcigpOworCQl2Y2hpcV9sb3VkX2Vycm9yKCJjb3VsZG4ndCBjcmVhdGUgdGhyZWFkICVzIiwgdGhyZWFkbmFtZSk7CisJCXZjaGlxX2xvdWRfZXJyb3JfZm9vdGVyKCk7CisJCXJldHVybiBWQ0hJUV9FUlJPUjsKKwl9CisJc2V0X3VzZXJfbmljZShzdGF0ZS0+c2xvdF9oYW5kbGVyX3RocmVhZCwgLTE5KTsKKwl3YWtlX3VwX3Byb2Nlc3Moc3RhdGUtPnNsb3RfaGFuZGxlcl90aHJlYWQpOworCisJc25wcmludGYodGhyZWFkbmFtZSwgc2l6ZW9mKHRocmVhZG5hbWUpLCAiVkNISVFyLSVkIiwgc3RhdGUtPmlkKTsKKwlzdGF0ZS0+cmVjeWNsZV90aHJlYWQgPSBrdGhyZWFkX2NyZWF0ZSgmcmVjeWNsZV9mdW5jLAorCQkodm9pZCAqKXN0YXRlLAorCQl0aHJlYWRuYW1lKTsKKwlpZiAoc3RhdGUtPnJlY3ljbGVfdGhyZWFkID09IE5VTEwpIHsKKwkJdmNoaXFfbG91ZF9lcnJvcl9oZWFkZXIoKTsKKwkJdmNoaXFfbG91ZF9lcnJvcigiY291bGRuJ3QgY3JlYXRlIHRocmVhZCAlcyIsIHRocmVhZG5hbWUpOworCQl2Y2hpcV9sb3VkX2Vycm9yX2Zvb3RlcigpOworCQlyZXR1cm4gVkNISVFfRVJST1I7CisJfQorCXNldF91c2VyX25pY2Uoc3RhdGUtPnJlY3ljbGVfdGhyZWFkLCAtMTkpOworCXdha2VfdXBfcHJvY2VzcyhzdGF0ZS0+cmVjeWNsZV90aHJlYWQpOworCisJc25wcmludGYodGhyZWFkbmFtZSwgc2l6ZW9mKHRocmVhZG5hbWUpLCAiVkNISVFzLSVkIiwgc3RhdGUtPmlkKTsKKwlzdGF0ZS0+c3luY190aHJlYWQgPSBrdGhyZWFkX2NyZWF0ZSgmc3luY19mdW5jLAorCQkodm9pZCAqKXN0YXRlLAorCQl0aHJlYWRuYW1lKTsKKwlpZiAoc3RhdGUtPnN5bmNfdGhyZWFkID09IE5VTEwpIHsKKwkJdmNoaXFfbG91ZF9lcnJvcl9oZWFkZXIoKTsKKwkJdmNoaXFfbG91ZF9lcnJvcigiY291bGRuJ3QgY3JlYXRlIHRocmVhZCAlcyIsIHRocmVhZG5hbWUpOworCQl2Y2hpcV9sb3VkX2Vycm9yX2Zvb3RlcigpOworCQlyZXR1cm4gVkNISVFfRVJST1I7CisJfQorCXNldF91c2VyX25pY2Uoc3RhdGUtPnN5bmNfdGhyZWFkLCAtMjApOworCXdha2VfdXBfcHJvY2VzcyhzdGF0ZS0+c3luY190aHJlYWQpOworCisJQlVHX09OKHN0YXRlLT5pZCA+PSBWQ0hJUV9NQVhfU1RBVEVTKTsKKwl2Y2hpcV9zdGF0ZXNbc3RhdGUtPmlkXSA9IHN0YXRlOworCisJLyogSW5kaWNhdGUgcmVhZGluZXNzIHRvIHRoZSBvdGhlciBzaWRlICovCisJbG9jYWwtPmluaXRpYWxpc2VkID0gMTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIENhbGxlZCBmcm9tIGFwcGxpY2F0aW9uIHRocmVhZCB3aGVuIGEgY2xpZW50IG9yIHNlcnZlciBzZXJ2aWNlIGlzIGNyZWF0ZWQuICovCitWQ0hJUV9TRVJWSUNFX1QgKgordmNoaXFfYWRkX3NlcnZpY2VfaW50ZXJuYWwoVkNISVFfU1RBVEVfVCAqc3RhdGUsCisJY29uc3QgVkNISVFfU0VSVklDRV9QQVJBTVNfVCAqcGFyYW1zLCBpbnQgc3J2c3RhdGUsCisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwgVkNISVFfVVNFUkRBVEFfVEVSTV9UIHVzZXJkYXRhX3Rlcm0pCit7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlOworCisJc2VydmljZSA9IGttYWxsb2Moc2l6ZW9mKFZDSElRX1NFUlZJQ0VfVCksIEdGUF9LRVJORUwpOworCWlmIChzZXJ2aWNlKSB7CisJCXNlcnZpY2UtPmJhc2UuZm91cmNjICAgPSBwYXJhbXMtPmZvdXJjYzsKKwkJc2VydmljZS0+YmFzZS5jYWxsYmFjayA9IHBhcmFtcy0+Y2FsbGJhY2s7CisJCXNlcnZpY2UtPmJhc2UudXNlcmRhdGEgPSBwYXJhbXMtPnVzZXJkYXRhOworCQlzZXJ2aWNlLT5oYW5kbGUgICAgICAgID0gVkNISVFfU0VSVklDRV9IQU5ETEVfSU5WQUxJRDsKKwkJc2VydmljZS0+cmVmX2NvdW50ICAgICA9IDE7CisJCXNlcnZpY2UtPnNydnN0YXRlICAgICAgPSBWQ0hJUV9TUlZTVEFURV9GUkVFOworCQlzZXJ2aWNlLT51c2VyZGF0YV90ZXJtID0gdXNlcmRhdGFfdGVybTsKKwkJc2VydmljZS0+bG9jYWxwb3J0ICAgICA9IFZDSElRX1BPUlRfRlJFRTsKKwkJc2VydmljZS0+cmVtb3RlcG9ydCAgICA9IFZDSElRX1BPUlRfRlJFRTsKKworCQlzZXJ2aWNlLT5wdWJsaWNfZm91cmNjID0gKHNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX09QRU5JTkcpID8KKwkJCVZDSElRX0ZPVVJDQ19JTlZBTElEIDogcGFyYW1zLT5mb3VyY2M7CisJCXNlcnZpY2UtPmNsaWVudF9pZCAgICAgPSAwOworCQlzZXJ2aWNlLT5hdXRvX2Nsb3NlICAgID0gMTsKKwkJc2VydmljZS0+c3luYyAgICAgICAgICA9IDA7CisJCXNlcnZpY2UtPmNsb3NpbmcgICAgICAgPSAwOworCQlzZXJ2aWNlLT50cmFjZSAgICAgICAgID0gMDsKKwkJYXRvbWljX3NldCgmc2VydmljZS0+cG9sbF9mbGFncywgMCk7CisJCXNlcnZpY2UtPnZlcnNpb24gICAgICAgPSBwYXJhbXMtPnZlcnNpb247CisJCXNlcnZpY2UtPnZlcnNpb25fbWluICAgPSBwYXJhbXMtPnZlcnNpb25fbWluOworCQlzZXJ2aWNlLT5zdGF0ZSAgICAgICAgID0gc3RhdGU7CisJCXNlcnZpY2UtPmluc3RhbmNlICAgICAgPSBpbnN0YW5jZTsKKwkJc2VydmljZS0+c2VydmljZV91c2VfY291bnQgPSAwOworCQlpbml0X2J1bGtfcXVldWUoJnNlcnZpY2UtPmJ1bGtfdHgpOworCQlpbml0X2J1bGtfcXVldWUoJnNlcnZpY2UtPmJ1bGtfcngpOworCQlzZW1hX2luaXQoJnNlcnZpY2UtPnJlbW92ZV9ldmVudCwgMCk7CisJCXNlbWFfaW5pdCgmc2VydmljZS0+YnVsa19yZW1vdmVfZXZlbnQsIDApOworCQltdXRleF9pbml0KCZzZXJ2aWNlLT5idWxrX211dGV4KTsKKwkJbWVtc2V0KCZzZXJ2aWNlLT5zdGF0cywgMCwgc2l6ZW9mKHNlcnZpY2UtPnN0YXRzKSk7CisJfSBlbHNlIHsKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJIk91dCBvZiBtZW1vcnkiKTsKKwl9CisKKwlpZiAoc2VydmljZSkgeworCQlWQ0hJUV9TRVJWSUNFX1QgKipwc2VydmljZSA9IE5VTEw7CisJCWludCBpOworCisJCS8qIEFsdGhvdWdoIGl0IGlzIHBlcmZlY3RseSBwb3NzaWJsZSB0byB1c2Ugc2VydmljZV9zcGlubG9jaworCQkqKiB0byBwcm90ZWN0IHRoZSBjcmVhdGlvbiBvZiBzZXJ2aWNlcywgaXQgaXMgb3ZlcmtpbGwgYXMgaXQKKwkJKiogZGlzYWJsZXMgaW50ZXJydXB0cyB3aGlsZSB0aGUgYXJyYXkgaXMgc2VhcmNoZWQuCisJCSoqIFRoZSBvbmx5IGRhbmdlciBpcyBvZiBhbm90aGVyIHRocmVhZCB0cnlpbmcgdG8gY3JlYXRlIGEKKwkJKiogc2VydmljZSAtIHNlcnZpY2UgZGVsZXRpb24gaXMgc2FmZS4KKwkJKiogVGhlcmVmb3JlIGl0IGlzIHByZWZlcmFibGUgdG8gdXNlIHN0YXRlLT5tdXRleCB3aGljaCwKKwkJKiogYWx0aG91Z2ggc2xvd2VyIHRvIGNsYWltLCBkb2Vzbid0IGJsb2NrIGludGVycnVwdHMgd2hpbGUKKwkJKiogaXQgaXMgaGVsZC4KKwkJKi8KKworCQltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOworCisJCS8qIFByZXBhcmUgdG8gdXNlIGEgcHJldmlvdXNseSB1bnVzZWQgc2VydmljZSAqLworCQlpZiAoc3RhdGUtPnVudXNlZF9zZXJ2aWNlIDwgVkNISVFfTUFYX1NFUlZJQ0VTKQorCQkJcHNlcnZpY2UgPSAmc3RhdGUtPnNlcnZpY2VzW3N0YXRlLT51bnVzZWRfc2VydmljZV07CisKKwkJaWYgKHNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX09QRU5JTkcpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+dW51c2VkX3NlcnZpY2U7IGkrKykgeworCQkJCVZDSElRX1NFUlZJQ0VfVCAqc3J2ID0gc3RhdGUtPnNlcnZpY2VzW2ldOworCQkJCWlmICghc3J2KSB7CisJCQkJCXBzZXJ2aWNlID0gJnN0YXRlLT5zZXJ2aWNlc1tpXTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJZm9yIChpID0gKHN0YXRlLT51bnVzZWRfc2VydmljZSAtIDEpOyBpID49IDA7IGktLSkgeworCQkJCVZDSElRX1NFUlZJQ0VfVCAqc3J2ID0gc3RhdGUtPnNlcnZpY2VzW2ldOworCQkJCWlmICghc3J2KQorCQkJCQlwc2VydmljZSA9ICZzdGF0ZS0+c2VydmljZXNbaV07CisJCQkJZWxzZSBpZiAoKHNydi0+cHVibGljX2ZvdXJjYyA9PSBwYXJhbXMtPmZvdXJjYykKKwkJCQkJJiYgKChzcnYtPmluc3RhbmNlICE9IGluc3RhbmNlKSB8fAorCQkJCQkoc3J2LT5iYXNlLmNhbGxiYWNrICE9CisJCQkJCXBhcmFtcy0+Y2FsbGJhY2spKSkgeworCQkJCQkvKiBUaGVyZSBpcyBhbm90aGVyIHNlcnZlciB1c2luZyB0aGlzCisJCQkJCSoqIGZvdXJjYyB3aGljaCBkb2Vzbid0IG1hdGNoLiAqLworCQkJCQlwc2VydmljZSA9IE5VTEw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChwc2VydmljZSkgeworCQkJc2VydmljZS0+bG9jYWxwb3J0ID0gKHBzZXJ2aWNlIC0gc3RhdGUtPnNlcnZpY2VzKTsKKwkJCWlmICghaGFuZGxlX3NlcSkKKwkJCQloYW5kbGVfc2VxID0gVkNISVFfTUFYX1NUQVRFUyAqCisJCQkJCSBWQ0hJUV9NQVhfU0VSVklDRVM7CisJCQlzZXJ2aWNlLT5oYW5kbGUgPSBoYW5kbGVfc2VxIHwKKwkJCQkoc3RhdGUtPmlkICogVkNISVFfTUFYX1NFUlZJQ0VTKSB8CisJCQkJc2VydmljZS0+bG9jYWxwb3J0OworCQkJaGFuZGxlX3NlcSArPSBWQ0hJUV9NQVhfU1RBVEVTICogVkNISVFfTUFYX1NFUlZJQ0VTOworCQkJKnBzZXJ2aWNlID0gc2VydmljZTsKKwkJCWlmIChwc2VydmljZSA9PSAmc3RhdGUtPnNlcnZpY2VzW3N0YXRlLT51bnVzZWRfc2VydmljZV0pCisJCQkJc3RhdGUtPnVudXNlZF9zZXJ2aWNlKys7CisJCX0KKworCQltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CisKKwkJaWYgKCFwc2VydmljZSkgeworCQkJa2ZyZWUoc2VydmljZSk7CisJCQlzZXJ2aWNlID0gTlVMTDsKKwkJfQorCX0KKworCWlmIChzZXJ2aWNlKSB7CisJCVZDSElRX1NFUlZJQ0VfUVVPVEFfVCAqc2VydmljZV9xdW90YSA9CisJCQkmc3RhdGUtPnNlcnZpY2VfcXVvdGFzW3NlcnZpY2UtPmxvY2FscG9ydF07CisJCXNlcnZpY2VfcXVvdGEtPnNsb3RfcXVvdGEgPSBzdGF0ZS0+ZGVmYXVsdF9zbG90X3F1b3RhOworCQlzZXJ2aWNlX3F1b3RhLT5tZXNzYWdlX3F1b3RhID0gc3RhdGUtPmRlZmF1bHRfbWVzc2FnZV9xdW90YTsKKwkJaWYgKHNlcnZpY2VfcXVvdGEtPnNsb3RfdXNlX2NvdW50ID09IDApCisJCQlzZXJ2aWNlX3F1b3RhLT5wcmV2aW91c190eF9pbmRleCA9CisJCQkJU0xPVF9RVUVVRV9JTkRFWF9GUk9NX1BPUyhzdGF0ZS0+bG9jYWxfdHhfcG9zKQorCQkJCS0gMTsKKworCQkvKiBCcmluZyB0aGlzIHNlcnZpY2Ugb25saW5lICovCisJCXZjaGlxX3NldF9zZXJ2aWNlX3N0YXRlKHNlcnZpY2UsIHNydnN0YXRlKTsKKworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX21zZ19sb2dfbGV2ZWwsCisJCQkiJXMgU2VydmljZSAlYyVjJWMlYyBTcmNQb3J0OiVkIiwKKwkJCShzcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9PUEVOSU5HKQorCQkJPyAiT3BlbiIgOiAiQWRkIiwKKwkJCVZDSElRX0ZPVVJDQ19BU180Q0hBUlMocGFyYW1zLT5mb3VyY2MpLAorCQkJc2VydmljZS0+bG9jYWxwb3J0KTsKKwl9CisKKwkvKiBEb24ndCB1bmxvY2sgdGhlIHNlcnZpY2UgLSBsZWF2ZSBpdCB3aXRoIGEgcmVmX2NvdW50IG9mIDEuICovCisKKwlyZXR1cm4gc2VydmljZTsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX29wZW5fc2VydmljZV9pbnRlcm5hbChWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIGludCBjbGllbnRfaWQpCit7CisJc3RydWN0IHZjaGlxX29wZW5fcGF5bG9hZCBwYXlsb2FkID0geworCQlzZXJ2aWNlLT5iYXNlLmZvdXJjYywKKwkJY2xpZW50X2lkLAorCQlzZXJ2aWNlLT52ZXJzaW9uLAorCQlzZXJ2aWNlLT52ZXJzaW9uX21pbgorCX07CisJVkNISVFfRUxFTUVOVF9UIGJvZHkgPSB7ICZwYXlsb2FkLCBzaXplb2YocGF5bG9hZCkgfTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCisJc2VydmljZS0+Y2xpZW50X2lkID0gY2xpZW50X2lkOworCXZjaGlxX3VzZV9zZXJ2aWNlX2ludGVybmFsKHNlcnZpY2UpOworCXN0YXR1cyA9IHF1ZXVlX21lc3NhZ2Uoc2VydmljZS0+c3RhdGUsIE5VTEwsCisJCVZDSElRX01BS0VfTVNHKFZDSElRX01TR19PUEVOLCBzZXJ2aWNlLT5sb2NhbHBvcnQsIDApLAorCQkmYm9keSwgMSwgc2l6ZW9mKHBheWxvYWQpLCBRTUZMQUdTX0lTX0JMT0NLSU5HKTsKKwlpZiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpIHsKKwkJLyogV2FpdCBmb3IgdGhlIEFDSy9OQUsgKi8KKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc2VydmljZS0+cmVtb3ZlX2V2ZW50KSAhPSAwKSB7CisJCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJCXZjaGlxX3JlbGVhc2Vfc2VydmljZV9pbnRlcm5hbChzZXJ2aWNlKTsKKwkJfSBlbHNlIGlmICgoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfT1BFTikgJiYKKwkJCShzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9PUEVOU1lOQykpIHsKKwkJCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9DTE9TRVdBSVQpCisJCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkiJWQ6IG9zaSAtIHNydnN0YXRlID0gJXMgKHJlZiAlZCkiLAorCQkJCQlzZXJ2aWNlLT5zdGF0ZS0+aWQsCisJCQkJCXNydnN0YXRlX25hbWVzW3NlcnZpY2UtPnNydnN0YXRlXSwKKwkJCQkJc2VydmljZS0+cmVmX2NvdW50KTsKKwkJCXN0YXR1cyA9IFZDSElRX0VSUk9SOworCQkJVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwgZXJyb3JfY291bnQpOworCQkJdmNoaXFfcmVsZWFzZV9zZXJ2aWNlX2ludGVybmFsKHNlcnZpY2UpOworCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkCityZWxlYXNlX3NlcnZpY2VfbWVzc2FnZXMoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKQoreworCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gc2VydmljZS0+c3RhdGU7CisJaW50IHNsb3RfbGFzdCA9IHN0YXRlLT5yZW1vdGUtPnNsb3RfbGFzdDsKKwlpbnQgaTsKKworCS8qIFJlbGVhc2UgYW55IGNsYWltZWQgbWVzc2FnZXMgYWltZWQgYXQgdGhpcyBzZXJ2aWNlICovCisKKwlpZiAoc2VydmljZS0+c3luYykgeworCQlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyID0KKwkJCShWQ0hJUV9IRUFERVJfVCAqKVNMT1RfREFUQV9GUk9NX0lOREVYKHN0YXRlLAorCQkJCQkJc3RhdGUtPnJlbW90ZS0+c2xvdF9zeW5jKTsKKwkJaWYgKFZDSElRX01TR19EU1RQT1JUKGhlYWRlci0+bXNnaWQpID09IHNlcnZpY2UtPmxvY2FscG9ydCkKKwkJCXJlbGVhc2VfbWVzc2FnZV9zeW5jKHN0YXRlLCBoZWFkZXIpOworCisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSBzdGF0ZS0+cmVtb3RlLT5zbG90X2ZpcnN0OyBpIDw9IHNsb3RfbGFzdDsgaSsrKSB7CisJCVZDSElRX1NMT1RfSU5GT19UICpzbG90X2luZm8gPQorCQkJU0xPVF9JTkZPX0ZST01fSU5ERVgoc3RhdGUsIGkpOworCQlpZiAoc2xvdF9pbmZvLT5yZWxlYXNlX2NvdW50ICE9IHNsb3RfaW5mby0+dXNlX2NvdW50KSB7CisJCQljaGFyICpkYXRhID0KKwkJCQkoY2hhciAqKVNMT1RfREFUQV9GUk9NX0lOREVYKHN0YXRlLCBpKTsKKwkJCXVuc2lnbmVkIGludCBwb3MsIGVuZDsKKworCQkJZW5kID0gVkNISVFfU0xPVF9TSVpFOworCQkJaWYgKGRhdGEgPT0gc3RhdGUtPnJ4X2RhdGEpCisJCQkJLyogVGhpcyBidWZmZXIgaXMgc3RpbGwgYmVpbmcgcmVhZCBmcm9tIC0gc3RvcAorCQkJCSoqIGF0IHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gKi8KKwkJCQllbmQgPSBzdGF0ZS0+cnhfcG9zICYgVkNISVFfU0xPVF9NQVNLOworCisJCQlwb3MgPSAwOworCisJCQl3aGlsZSAocG9zIDwgZW5kKSB7CisJCQkJVkNISVFfSEVBREVSX1QgKmhlYWRlciA9CisJCQkJCShWQ0hJUV9IRUFERVJfVCAqKShkYXRhICsgcG9zKTsKKwkJCQlpbnQgbXNnaWQgPSBoZWFkZXItPm1zZ2lkOworCQkJCWludCBwb3J0ID0gVkNISVFfTVNHX0RTVFBPUlQobXNnaWQpOworCQkJCWlmICgocG9ydCA9PSBzZXJ2aWNlLT5sb2NhbHBvcnQpICYmCisJCQkJCShtc2dpZCAmIFZDSElRX01TR0lEX0NMQUlNRUQpKSB7CisJCQkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkJIiAgZnNpIC0gaGRyICV4IiwKKwkJCQkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyKTsKKwkJCQkJcmVsZWFzZV9zbG90KHN0YXRlLCBzbG90X2luZm8sIGhlYWRlciwKKwkJCQkJCU5VTEwpOworCQkJCX0KKwkJCQlwb3MgKz0gY2FsY19zdHJpZGUoaGVhZGVyLT5zaXplKTsKKwkJCQlpZiAocG9zID4gVkNISVFfU0xPVF9TSVpFKSB7CisJCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJCSJmc2kgLSBwb3MgJXg6IGhlYWRlciAleCwgIgorCQkJCQkJIm1zZ2lkICV4LCBoZWFkZXItPm1zZ2lkICV4LCAiCisJCQkJCQkiaGVhZGVyLT5zaXplICV4IiwKKwkJCQkJCXBvcywgKHVuc2lnbmVkIGludCloZWFkZXIsCisJCQkJCQltc2dpZCwgaGVhZGVyLT5tc2dpZCwKKwkJCQkJCWhlYWRlci0+c2l6ZSk7CisJCQkJCVdBUk4oMSwgImludmFsaWQgc2xvdCBwb3NpdGlvblxuIik7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50Citkb19hYm9ydF9idWxrcyhWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpCit7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCisJLyogQWJvcnQgYW55IG91dHN0YW5kaW5nIGJ1bGsgdHJhbnNmZXJzICovCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc2VydmljZS0+YnVsa19tdXRleCkgIT0gMCkKKwkJcmV0dXJuIDA7CisJYWJvcnRfb3V0c3RhbmRpbmdfYnVsa3Moc2VydmljZSwgJnNlcnZpY2UtPmJ1bGtfdHgpOworCWFib3J0X291dHN0YW5kaW5nX2J1bGtzKHNlcnZpY2UsICZzZXJ2aWNlLT5idWxrX3J4KTsKKwltdXRleF91bmxvY2soJnNlcnZpY2UtPmJ1bGtfbXV0ZXgpOworCisJc3RhdHVzID0gbm90aWZ5X2J1bGtzKHNlcnZpY2UsICZzZXJ2aWNlLT5idWxrX3R4LCAwLyohcmV0cnlfcG9sbCovKTsKKwlpZiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpCisJCXN0YXR1cyA9IG5vdGlmeV9idWxrcyhzZXJ2aWNlLCAmc2VydmljZS0+YnVsa19yeCwKKwkJCTAvKiFyZXRyeV9wb2xsKi8pOworCXJldHVybiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpOworfQorCitzdGF0aWMgVkNISVFfU1RBVFVTX1QKK2Nsb3NlX3NlcnZpY2VfY29tcGxldGUoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLCBpbnQgZmFpbHN0YXRlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKwlpbnQgaXNfc2VydmVyID0gKHNlcnZpY2UtPnB1YmxpY19mb3VyY2MgIT0gVkNISVFfRk9VUkNDX0lOVkFMSUQpOworCWludCBuZXdzdGF0ZTsKKworCXN3aXRjaCAoc2VydmljZS0+c3J2c3RhdGUpIHsKKwljYXNlIFZDSElRX1NSVlNUQVRFX09QRU46CisJY2FzZSBWQ0hJUV9TUlZTVEFURV9DTE9TRVNFTlQ6CisJY2FzZSBWQ0hJUV9TUlZTVEFURV9DTE9TRVJFQ1ZEOgorCQlpZiAoaXNfc2VydmVyKSB7CisJCQlpZiAoc2VydmljZS0+YXV0b19jbG9zZSkgeworCQkJCXNlcnZpY2UtPmNsaWVudF9pZCA9IDA7CisJCQkJc2VydmljZS0+cmVtb3RlcG9ydCA9IFZDSElRX1BPUlRfRlJFRTsKKwkJCQluZXdzdGF0ZSA9IFZDSElRX1NSVlNUQVRFX0xJU1RFTklORzsKKwkJCX0gZWxzZQorCQkJCW5ld3N0YXRlID0gVkNISVFfU1JWU1RBVEVfQ0xPU0VXQUlUOworCQl9IGVsc2UKKwkJCW5ld3N0YXRlID0gVkNISVFfU1JWU1RBVEVfQ0xPU0VEOworCQl2Y2hpcV9zZXRfc2VydmljZV9zdGF0ZShzZXJ2aWNlLCBuZXdzdGF0ZSk7CisJCWJyZWFrOworCWNhc2UgVkNISVFfU1JWU1RBVEVfTElTVEVOSU5HOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiY2xvc2Vfc2VydmljZV9jb21wbGV0ZSgleCkgY2FsbGVkIGluIHN0YXRlICVzIiwKKwkJCXNlcnZpY2UtPmhhbmRsZSwgc3J2c3RhdGVfbmFtZXNbc2VydmljZS0+c3J2c3RhdGVdKTsKKwkJV0FSTigxLCAiY2xvc2Vfc2VydmljZV9jb21wbGV0ZSBpbiB1bmV4cGVjdGVkIHN0YXRlXG4iKTsKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCX0KKworCXN0YXR1cyA9IG1ha2Vfc2VydmljZV9jYWxsYmFjayhzZXJ2aWNlLAorCQlWQ0hJUV9TRVJWSUNFX0NMT1NFRCwgTlVMTCwgTlVMTCk7CisKKwlpZiAoc3RhdHVzICE9IFZDSElRX1JFVFJZKSB7CisJCWludCB1YyA9IHNlcnZpY2UtPnNlcnZpY2VfdXNlX2NvdW50OworCQlpbnQgaTsKKwkJLyogQ29tcGxldGUgdGhlIGNsb3NlIHByb2Nlc3MgKi8KKwkJZm9yIChpID0gMDsgaSA8IHVjOyBpKyspCisJCQkvKiBjYXRlciBmb3IgY2FzZXMgd2hlcmUgY2xvc2UgaXMgZm9yY2VkIGFuZCB0aGUKKwkJCSoqIGNsaWVudCBtYXkgbm90IGNsb3NlIGFsbCBpdCdzIGhhbmRsZXMgKi8KKwkJCXZjaGlxX3JlbGVhc2Vfc2VydmljZV9pbnRlcm5hbChzZXJ2aWNlKTsKKworCQlzZXJ2aWNlLT5jbGllbnRfaWQgPSAwOworCQlzZXJ2aWNlLT5yZW1vdGVwb3J0ID0gVkNISVFfUE9SVF9GUkVFOworCisJCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9DTE9TRUQpCisJCQl2Y2hpcV9mcmVlX3NlcnZpY2VfaW50ZXJuYWwoc2VydmljZSk7CisJCWVsc2UgaWYgKHNlcnZpY2UtPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX0NMT1NFV0FJVCkgeworCQkJaWYgKGlzX3NlcnZlcikKKwkJCQlzZXJ2aWNlLT5jbG9zaW5nID0gMDsKKworCQkJdXAoJnNlcnZpY2UtPnJlbW92ZV9ldmVudCk7CisJCX0KKwl9IGVsc2UKKwkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwgZmFpbHN0YXRlKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIENhbGxlZCBieSB0aGUgc2xvdCBoYW5kbGVyICovCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfY2xvc2Vfc2VydmljZV9pbnRlcm5hbChWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIGludCBjbG9zZV9yZWN2ZCkKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IHNlcnZpY2UtPnN0YXRlOworCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisJaW50IGlzX3NlcnZlciA9IChzZXJ2aWNlLT5wdWJsaWNfZm91cmNjICE9IFZDSElRX0ZPVVJDQ19JTlZBTElEKTsKKworCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLCAiJWQ6IGNzaTolZCwlZCAoJXMpIiwKKwkJc2VydmljZS0+c3RhdGUtPmlkLCBzZXJ2aWNlLT5sb2NhbHBvcnQsIGNsb3NlX3JlY3ZkLAorCQlzcnZzdGF0ZV9uYW1lc1tzZXJ2aWNlLT5zcnZzdGF0ZV0pOworCisJc3dpdGNoIChzZXJ2aWNlLT5zcnZzdGF0ZSkgeworCWNhc2UgVkNISVFfU1JWU1RBVEVfQ0xPU0VEOgorCWNhc2UgVkNISVFfU1JWU1RBVEVfSElEREVOOgorCWNhc2UgVkNISVFfU1JWU1RBVEVfTElTVEVOSU5HOgorCWNhc2UgVkNISVFfU1JWU1RBVEVfQ0xPU0VXQUlUOgorCQlpZiAoY2xvc2VfcmVjdmQpCisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJInZjaGlxX2Nsb3NlX3NlcnZpY2VfaW50ZXJuYWwoMSkgY2FsbGVkICIKKwkJCQkiaW4gc3RhdGUgJXMiLAorCQkJCXNydnN0YXRlX25hbWVzW3NlcnZpY2UtPnNydnN0YXRlXSk7CisJCWVsc2UgaWYgKGlzX3NlcnZlcikgeworCQkJaWYgKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0xJU1RFTklORykgeworCQkJCXN0YXR1cyA9IFZDSElRX0VSUk9SOworCQkJfSBlbHNlIHsKKwkJCQlzZXJ2aWNlLT5jbGllbnRfaWQgPSAwOworCQkJCXNlcnZpY2UtPnJlbW90ZXBvcnQgPSBWQ0hJUV9QT1JUX0ZSRUU7CisJCQkJaWYgKHNlcnZpY2UtPnNydnN0YXRlID09CisJCQkJCVZDSElRX1NSVlNUQVRFX0NMT1NFV0FJVCkKKwkJCQkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwKKwkJCQkJCVZDSElRX1NSVlNUQVRFX0xJU1RFTklORyk7CisJCQl9CisJCQl1cCgmc2VydmljZS0+cmVtb3ZlX2V2ZW50KTsKKwkJfSBlbHNlCisJCQl2Y2hpcV9mcmVlX3NlcnZpY2VfaW50ZXJuYWwoc2VydmljZSk7CisJCWJyZWFrOworCWNhc2UgVkNISVFfU1JWU1RBVEVfT1BFTklORzoKKwkJaWYgKGNsb3NlX3JlY3ZkKSB7CisJCQkvKiBUaGUgb3BlbiB3YXMgcmVqZWN0ZWQgLSB0ZWxsIHRoZSB1c2VyICovCisJCQl2Y2hpcV9zZXRfc2VydmljZV9zdGF0ZShzZXJ2aWNlLAorCQkJCVZDSElRX1NSVlNUQVRFX0NMT1NFV0FJVCk7CisJCQl1cCgmc2VydmljZS0+cmVtb3ZlX2V2ZW50KTsKKwkJfSBlbHNlIHsKKwkJCS8qIFNodXRkb3duIG1pZC1vcGVuIC0gbGV0IHRoZSBvdGhlciBzaWRlIGtub3cgKi8KKwkJCXN0YXR1cyA9IHF1ZXVlX21lc3NhZ2Uoc3RhdGUsIHNlcnZpY2UsCisJCQkJVkNISVFfTUFLRV9NU0cKKwkJCQkoVkNISVFfTVNHX0NMT1NFLAorCQkJCXNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCQlWQ0hJUV9NU0dfRFNUUE9SVChzZXJ2aWNlLT5yZW1vdGVwb3J0KSksCisJCQkJTlVMTCwgMCwgMCwgMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFZDSElRX1NSVlNUQVRFX09QRU5TWU5DOgorCQltdXRleF9sb2NrKCZzdGF0ZS0+c3luY19tdXRleCk7CisJCS8qIERyb3AgdGhyb3VnaCAqLworCisJY2FzZSBWQ0hJUV9TUlZTVEFURV9PUEVOOgorCQlpZiAoc3RhdGUtPmlzX21hc3RlciB8fCBjbG9zZV9yZWN2ZCkgeworCQkJaWYgKCFkb19hYm9ydF9idWxrcyhzZXJ2aWNlKSkKKwkJCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJfQorCisJCXJlbGVhc2Vfc2VydmljZV9tZXNzYWdlcyhzZXJ2aWNlKTsKKworCQlpZiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpCisJCQlzdGF0dXMgPSBxdWV1ZV9tZXNzYWdlKHN0YXRlLCBzZXJ2aWNlLAorCQkJCVZDSElRX01BS0VfTVNHCisJCQkJKFZDSElRX01TR19DTE9TRSwKKwkJCQlzZXJ2aWNlLT5sb2NhbHBvcnQsCisJCQkJVkNISVFfTVNHX0RTVFBPUlQoc2VydmljZS0+cmVtb3RlcG9ydCkpLAorCQkJCU5VTEwsIDAsIDAsIFFNRkxBR1NfTk9fTVVURVhfVU5MT0NLKTsKKworCQlpZiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpIHsKKwkJCWlmICghY2xvc2VfcmVjdmQpIHsKKwkJCQkvKiBDaGFuZ2UgdGhlIHN0YXRlIHdoaWxlIHRoZSBtdXRleCBpcworCQkJCSAgIHN0aWxsIGhlbGQgKi8KKwkJCQl2Y2hpcV9zZXRfc2VydmljZV9zdGF0ZShzZXJ2aWNlLAorCQkJCQkJCVZDSElRX1NSVlNUQVRFX0NMT1NFU0VOVCk7CisJCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2xvdF9tdXRleCk7CisJCQkJaWYgKHNlcnZpY2UtPnN5bmMpCisJCQkJCW11dGV4X3VubG9jaygmc3RhdGUtPnN5bmNfbXV0ZXgpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX09QRU5TWU5DKSB7CisJCQltdXRleF91bmxvY2soJnN0YXRlLT5zeW5jX211dGV4KTsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCWJyZWFrOworCisJCS8qIENoYW5nZSB0aGUgc3RhdGUgd2hpbGUgdGhlIG11dGV4IGlzIHN0aWxsIGhlbGQgKi8KKwkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwgVkNISVFfU1JWU1RBVEVfQ0xPU0VSRUNWRCk7CisJCW11dGV4X3VubG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCQlpZiAoc2VydmljZS0+c3luYykKKwkJCW11dGV4X3VubG9jaygmc3RhdGUtPnN5bmNfbXV0ZXgpOworCisJCXN0YXR1cyA9IGNsb3NlX3NlcnZpY2VfY29tcGxldGUoc2VydmljZSwKKwkJCQlWQ0hJUV9TUlZTVEFURV9DTE9TRVJFQ1ZEKTsKKwkJYnJlYWs7CisKKwljYXNlIFZDSElRX1NSVlNUQVRFX0NMT1NFU0VOVDoKKwkJaWYgKCFjbG9zZV9yZWN2ZCkKKwkJCS8qIFRoaXMgaGFwcGVucyB3aGVuIGEgcHJvY2VzcyBpcyBraWxsZWQgbWlkLWNsb3NlICovCisJCQlicmVhazsKKworCQlpZiAoIXN0YXRlLT5pc19tYXN0ZXIpIHsKKwkJCWlmICghZG9fYWJvcnRfYnVsa3Moc2VydmljZSkpIHsKKwkJCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykKKwkJCXN0YXR1cyA9IGNsb3NlX3NlcnZpY2VfY29tcGxldGUoc2VydmljZSwKKwkJCQlWQ0hJUV9TUlZTVEFURV9DTE9TRVJFQ1ZEKTsKKwkJYnJlYWs7CisKKwljYXNlIFZDSElRX1NSVlNUQVRFX0NMT1NFUkVDVkQ6CisJCWlmICghY2xvc2VfcmVjdmQgJiYgaXNfc2VydmVyKQorCQkJLyogRm9yY2UgaW50byBMSVNURU5JTkcgbW9kZSAqLworCQkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwKKwkJCQlWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcpOworCQlzdGF0dXMgPSBjbG9zZV9zZXJ2aWNlX2NvbXBsZXRlKHNlcnZpY2UsCisJCQlWQ0hJUV9TUlZTVEFURV9DTE9TRVJFQ1ZEKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkidmNoaXFfY2xvc2Vfc2VydmljZV9pbnRlcm5hbCglZCkgY2FsbGVkIGluIHN0YXRlICVzIiwKKwkJCWNsb3NlX3JlY3ZkLCBzcnZzdGF0ZV9uYW1lc1tzZXJ2aWNlLT5zcnZzdGF0ZV0pOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBDYWxsZWQgZnJvbSB0aGUgYXBwbGljYXRpb24gcHJvY2VzcyB1cG9uIHByb2Nlc3MgZGVhdGggKi8KK3ZvaWQKK3ZjaGlxX3Rlcm1pbmF0ZV9zZXJ2aWNlX2ludGVybmFsKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSkKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IHNlcnZpY2UtPnN0YXRlOworCisJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsICIlZDogdHNpIC0gKCVkPC0+JWQpIiwKKwkJc3RhdGUtPmlkLCBzZXJ2aWNlLT5sb2NhbHBvcnQsIHNlcnZpY2UtPnJlbW90ZXBvcnQpOworCisJbWFya19zZXJ2aWNlX2Nsb3Npbmcoc2VydmljZSk7CisKKwkvKiBNYXJrIHRoZSBzZXJ2aWNlIGZvciByZW1vdmFsIGJ5IHRoZSBzbG90IGhhbmRsZXIgKi8KKwlyZXF1ZXN0X3BvbGwoc3RhdGUsIHNlcnZpY2UsIFZDSElRX1BPTExfUkVNT1ZFKTsKK30KKworLyogQ2FsbGVkIGZyb20gdGhlIHNsb3QgaGFuZGxlciAqLwordm9pZAordmNoaXFfZnJlZV9zZXJ2aWNlX2ludGVybmFsKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSkKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IHNlcnZpY2UtPnN0YXRlOworCisJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsICIlZDogZnNpIC0gKCVkKSIsCisJCXN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0KTsKKworCXN3aXRjaCAoc2VydmljZS0+c3J2c3RhdGUpIHsKKwljYXNlIFZDSElRX1NSVlNUQVRFX09QRU5JTkc6CisJY2FzZSBWQ0hJUV9TUlZTVEFURV9DTE9TRUQ6CisJY2FzZSBWQ0hJUV9TUlZTVEFURV9ISURERU46CisJY2FzZSBWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkc6CisJY2FzZSBWQ0hJUV9TUlZTVEFURV9DTE9TRVdBSVQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlZDogZnNpIC0gKCVkKSBpbiBzdGF0ZSAlcyIsCisJCQlzdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCXNydnN0YXRlX25hbWVzW3NlcnZpY2UtPnNydnN0YXRlXSk7CisJCXJldHVybjsKKwl9CisKKwl2Y2hpcV9zZXRfc2VydmljZV9zdGF0ZShzZXJ2aWNlLCBWQ0hJUV9TUlZTVEFURV9GUkVFKTsKKworCXVwKCZzZXJ2aWNlLT5yZW1vdmVfZXZlbnQpOworCisJLyogUmVsZWFzZSB0aGUgaW5pdGlhbCBsb2NrICovCisJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9jb25uZWN0X2ludGVybmFsKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKQoreworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKwlpbnQgaTsKKworCS8qIEZpbmQgYWxsIHNlcnZpY2VzIHJlZ2lzdGVyZWQgdG8gdGhpcyBjbGllbnQgYW5kIGVuYWJsZSB0aGVtLiAqLworCWkgPSAwOworCXdoaWxlICgoc2VydmljZSA9IG5leHRfc2VydmljZV9ieV9pbnN0YW5jZShzdGF0ZSwgaW5zdGFuY2UsCisJCSZpKSkgIT0JTlVMTCkgeworCQlpZiAoc2VydmljZS0+c3J2c3RhdGUgPT0gVkNISVFfU1JWU1RBVEVfSElEREVOKQorCQkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwKKwkJCQlWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcpOworCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwl9CisKKwlpZiAoc3RhdGUtPmNvbm5fc3RhdGUgPT0gVkNISVFfQ09OTlNUQVRFX0RJU0NPTk5FQ1RFRCkgeworCQlpZiAocXVldWVfbWVzc2FnZShzdGF0ZSwgTlVMTCwKKwkJCVZDSElRX01BS0VfTVNHKFZDSElRX01TR19DT05ORUNULCAwLCAwKSwgTlVMTCwgMCwKKwkJCTAsIFFNRkxBR1NfSVNfQkxPQ0tJTkcpID09IFZDSElRX1JFVFJZKQorCQkJcmV0dXJuIFZDSElRX1JFVFJZOworCisJCXZjaGlxX3NldF9jb25uX3N0YXRlKHN0YXRlLCBWQ0hJUV9DT05OU1RBVEVfQ09OTkVDVElORyk7CisJfQorCisJaWYgKHN0YXRlLT5jb25uX3N0YXRlID09IFZDSElRX0NPTk5TVEFURV9DT05ORUNUSU5HKSB7CisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJnN0YXRlLT5jb25uZWN0KSAhPSAwKQorCQkJcmV0dXJuIFZDSElRX1JFVFJZOworCisJCXZjaGlxX3NldF9jb25uX3N0YXRlKHN0YXRlLCBWQ0hJUV9DT05OU1RBVEVfQ09OTkVDVEVEKTsKKwkJdXAoJnN0YXRlLT5jb25uZWN0KTsKKwl9CisKKwlyZXR1cm4gVkNISVFfU1VDQ0VTUzsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3NodXRkb3duX2ludGVybmFsKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKQoreworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKwlpbnQgaTsKKworCS8qIEZpbmQgYWxsIHNlcnZpY2VzIHJlZ2lzdGVyZWQgdG8gdGhpcyBjbGllbnQgYW5kIGVuYWJsZSB0aGVtLiAqLworCWkgPSAwOworCXdoaWxlICgoc2VydmljZSA9IG5leHRfc2VydmljZV9ieV9pbnN0YW5jZShzdGF0ZSwgaW5zdGFuY2UsCisJCSZpKSkgIT0JTlVMTCkgeworCQkodm9pZCl2Y2hpcV9yZW1vdmVfc2VydmljZShzZXJ2aWNlLT5oYW5kbGUpOworCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwl9CisKKwlyZXR1cm4gVkNISVFfU1VDQ0VTUzsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3BhdXNlX2ludGVybmFsKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisKKwlzd2l0Y2ggKHN0YXRlLT5jb25uX3N0YXRlKSB7CisJY2FzZSBWQ0hJUV9DT05OU1RBVEVfQ09OTkVDVEVEOgorCQkvKiBSZXF1ZXN0IGEgcGF1c2UgKi8KKwkJdmNoaXFfc2V0X2Nvbm5fc3RhdGUoc3RhdGUsIFZDSElRX0NPTk5TVEFURV9QQVVTSU5HKTsKKwkJcmVxdWVzdF9wb2xsKHN0YXRlLCBOVUxMLCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJInZjaGlxX3BhdXNlX2ludGVybmFsIGluIHN0YXRlICVzXG4iLAorCQkJY29ubl9zdGF0ZV9uYW1lc1tzdGF0ZS0+Y29ubl9zdGF0ZV0pOworCQlzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKwkJVkNISVFfU1RBVFNfSU5DKHN0YXRlLCBlcnJvcl9jb3VudCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9yZXN1bWVfaW50ZXJuYWwoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKworCWlmIChzdGF0ZS0+Y29ubl9zdGF0ZSA9PSBWQ0hJUV9DT05OU1RBVEVfUEFVU0VEKSB7CisJCXZjaGlxX3NldF9jb25uX3N0YXRlKHN0YXRlLCBWQ0hJUV9DT05OU1RBVEVfUkVTVU1JTkcpOworCQlyZXF1ZXN0X3BvbGwoc3RhdGUsIE5VTEwsIDApOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IFZDSElRX0VSUk9SOworCQlWQ0hJUV9TVEFUU19JTkMoc3RhdGUsIGVycm9yX2NvdW50KTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfY2xvc2Vfc2VydmljZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSkKK3sKKwkvKiBVbnJlZ2lzdGVyIHRoZSBzZXJ2aWNlICovCisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gZmluZF9zZXJ2aWNlX2J5X2hhbmRsZShoYW5kbGUpOworCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisKKwlpZiAoIXNlcnZpY2UpCisJCXJldHVybiBWQ0hJUV9FUlJPUjsKKworCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkiJWQ6IGNsb3NlX3NlcnZpY2U6JWQiLAorCQlzZXJ2aWNlLT5zdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCk7CisKKwlpZiAoKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0ZSRUUpIHx8CisJCShzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcpIHx8CisJCShzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9ISURERU4pKSB7CisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQlyZXR1cm4gVkNISVFfRVJST1I7CisJfQorCisJbWFya19zZXJ2aWNlX2Nsb3Npbmcoc2VydmljZSk7CisKKwlpZiAoY3VycmVudCA9PSBzZXJ2aWNlLT5zdGF0ZS0+c2xvdF9oYW5kbGVyX3RocmVhZCkgeworCQlzdGF0dXMgPSB2Y2hpcV9jbG9zZV9zZXJ2aWNlX2ludGVybmFsKHNlcnZpY2UsCisJCQkwLyohY2xvc2VfcmVjdmQqLyk7CisJCUJVR19PTihzdGF0dXMgPT0gVkNISVFfUkVUUlkpOworCX0gZWxzZSB7CisJLyogTWFyayB0aGUgc2VydmljZSBmb3IgdGVybWluYXRpb24gYnkgdGhlIHNsb3QgaGFuZGxlciAqLworCQlyZXF1ZXN0X3BvbGwoc2VydmljZS0+c3RhdGUsIHNlcnZpY2UsIFZDSElRX1BPTExfVEVSTUlOQVRFKTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzZXJ2aWNlLT5yZW1vdmVfZXZlbnQpICE9IDApIHsKKwkJCXN0YXR1cyA9IFZDSElRX1JFVFJZOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0ZSRUUpIHx8CisJCQkoc2VydmljZS0+c3J2c3RhdGUgPT0gVkNISVFfU1JWU1RBVEVfTElTVEVOSU5HKSB8fAorCQkJKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX09QRU4pKQorCQkJYnJlYWs7CisKKwkJdmNoaXFfbG9nX3dhcm5pbmcodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiJWQ6IGNsb3NlX3NlcnZpY2U6JWQgLSB3YWl0aW5nIGluIHN0YXRlICVzIiwKKwkJCXNlcnZpY2UtPnN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0LAorCQkJc3J2c3RhdGVfbmFtZXNbc2VydmljZS0+c3J2c3RhdGVdKTsKKwl9CisKKwlpZiAoKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKSAmJgorCQkoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfRlJFRSkgJiYKKwkJKHNlcnZpY2UtPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX0xJU1RFTklORykpCisJCXN0YXR1cyA9IFZDSElRX0VSUk9SOworCisJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfcmVtb3ZlX3NlcnZpY2UoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpCit7CisJLyogVW5yZWdpc3RlciB0aGUgc2VydmljZSAqLworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9oYW5kbGUoaGFuZGxlKTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCisJaWYgKCFzZXJ2aWNlKQorCQlyZXR1cm4gVkNISVFfRVJST1I7CisKKwl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVkOiByZW1vdmVfc2VydmljZTolZCIsCisJCXNlcnZpY2UtPnN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0KTsKKworCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9GUkVFKSB7CisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQlyZXR1cm4gVkNISVFfRVJST1I7CisJfQorCisJbWFya19zZXJ2aWNlX2Nsb3Npbmcoc2VydmljZSk7CisKKwlpZiAoKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0hJRERFTikgfHwKKwkJKGN1cnJlbnQgPT0gc2VydmljZS0+c3RhdGUtPnNsb3RfaGFuZGxlcl90aHJlYWQpKSB7CisJCS8qIE1ha2UgaXQgbG9vayBsaWtlIGEgY2xpZW50LCBiZWNhdXNlIGl0IG11c3QgYmUgcmVtb3ZlZCBhbmQKKwkJICAgbm90IGxlZnQgaW4gdGhlIExJU1RFTklORyBzdGF0ZS4gKi8KKwkJc2VydmljZS0+cHVibGljX2ZvdXJjYyA9IFZDSElRX0ZPVVJDQ19JTlZBTElEOworCisJCXN0YXR1cyA9IHZjaGlxX2Nsb3NlX3NlcnZpY2VfaW50ZXJuYWwoc2VydmljZSwKKwkJCTAvKiFjbG9zZV9yZWN2ZCovKTsKKwkJQlVHX09OKHN0YXR1cyA9PSBWQ0hJUV9SRVRSWSk7CisJfSBlbHNlIHsKKwkJLyogTWFyayB0aGUgc2VydmljZSBmb3IgcmVtb3ZhbCBieSB0aGUgc2xvdCBoYW5kbGVyICovCisJCXJlcXVlc3RfcG9sbChzZXJ2aWNlLT5zdGF0ZSwgc2VydmljZSwgVkNISVFfUE9MTF9SRU1PVkUpOworCX0KKwl3aGlsZSAoMSkgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzZXJ2aWNlLT5yZW1vdmVfZXZlbnQpICE9IDApIHsKKwkJCXN0YXR1cyA9IFZDSElRX1JFVFJZOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0ZSRUUpIHx8CisJCQkoc2VydmljZS0+c3J2c3RhdGUgPT0gVkNISVFfU1JWU1RBVEVfT1BFTikpCisJCQlicmVhazsKKworCQl2Y2hpcV9sb2dfd2FybmluZyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlZDogcmVtb3ZlX3NlcnZpY2U6JWQgLSB3YWl0aW5nIGluIHN0YXRlICVzIiwKKwkJCXNlcnZpY2UtPnN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0LAorCQkJc3J2c3RhdGVfbmFtZXNbc2VydmljZS0+c3J2c3RhdGVdKTsKKwl9CisKKwlpZiAoKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKSAmJgorCQkoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfRlJFRSkpCisJCXN0YXR1cyA9IFZDSElRX0VSUk9SOworCisJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBieSBrZXJuZWwgdGhyZWFkcyBvciB1c2VyIHRocmVhZHMuCisgKiBVc2VyIHRocmVhZHMgbWF5IHJlY2VpdmUgVkNISVFfUkVUUlkgdG8gaW5kaWNhdGUgdGhhdCBhIHNpZ25hbCBoYXMgYmVlbgorICogcmVjZWl2ZWQgYW5kIHRoZSBjYWxsIHNob3VsZCBiZSByZXRyaWVkIGFmdGVyIGJlaW5nIHJldHVybmVkIHRvIHVzZXIKKyAqIGNvbnRleHQuCisgKiBXaGVuIGNhbGxlZCBpbiBibG9ja2luZyBtb2RlLCB0aGUgdXNlcmRhdGEgZmllbGQgcG9pbnRzIHRvIGEgYnVsa193YWl0ZXIKKyAqIHN0cnVjdHVyZS4KKyAqLworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2J1bGtfdHJhbnNmZXIoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisJVkNISV9NRU1fSEFORExFX1QgbWVtaGFuZGxlLCB2b2lkICpvZmZzZXQsIGludCBzaXplLCB2b2lkICp1c2VyZGF0YSwKKwlWQ0hJUV9CVUxLX01PREVfVCBtb2RlLCBWQ0hJUV9CVUxLX0RJUl9UIGRpcikKK3sKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfYnlfaGFuZGxlKGhhbmRsZSk7CisJVkNISVFfQlVMS19RVUVVRV9UICpxdWV1ZTsKKwlWQ0hJUV9CVUxLX1QgKmJ1bGs7CisJVkNISVFfU1RBVEVfVCAqc3RhdGU7CisJc3RydWN0IGJ1bGtfd2FpdGVyICpidWxrX3dhaXRlciA9IE5VTEw7CisJY29uc3QgY2hhciBkaXJfY2hhciA9IChkaXIgPT0gVkNISVFfQlVMS19UUkFOU01JVCkgPyAndCcgOiAncic7CisJY29uc3QgaW50IGRpcl9tc2d0eXBlID0gKGRpciA9PSBWQ0hJUV9CVUxLX1RSQU5TTUlUKSA/CisJCVZDSElRX01TR19CVUxLX1RYIDogVkNISVFfTVNHX0JVTEtfUlg7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfRVJST1I7CisKKwlpZiAoIXNlcnZpY2UgfHwKKwkJIChzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9PUEVOKSB8fAorCQkgKChtZW1oYW5kbGUgPT0gVkNISV9NRU1fSEFORExFX0lOVkFMSUQpICYmIChvZmZzZXQgPT0gTlVMTCkpIHx8CisJCSAodmNoaXFfY2hlY2tfc2VydmljZShzZXJ2aWNlKSAhPSBWQ0hJUV9TVUNDRVNTKSkKKwkJZ290byBlcnJvcl9leGl0OworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBWQ0hJUV9CVUxLX01PREVfTk9DQUxMQkFDSzoKKwljYXNlIFZDSElRX0JVTEtfTU9ERV9DQUxMQkFDSzoKKwkJYnJlYWs7CisJY2FzZSBWQ0hJUV9CVUxLX01PREVfQkxPQ0tJTkc6CisJCWJ1bGtfd2FpdGVyID0gKHN0cnVjdCBidWxrX3dhaXRlciAqKXVzZXJkYXRhOworCQlzZW1hX2luaXQoJmJ1bGtfd2FpdGVyLT5ldmVudCwgMCk7CisJCWJ1bGtfd2FpdGVyLT5hY3R1YWwgPSAwOworCQlidWxrX3dhaXRlci0+YnVsayA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgVkNISVFfQlVMS19NT0RFX1dBSVRJTkc6CisJCWJ1bGtfd2FpdGVyID0gKHN0cnVjdCBidWxrX3dhaXRlciAqKXVzZXJkYXRhOworCQlidWxrID0gYnVsa193YWl0ZXItPmJ1bGs7CisJCWdvdG8gd2FpdGluZzsKKwlkZWZhdWx0OgorCQlnb3RvIGVycm9yX2V4aXQ7CisJfQorCisJc3RhdGUgPSBzZXJ2aWNlLT5zdGF0ZTsKKworCXF1ZXVlID0gKGRpciA9PSBWQ0hJUV9CVUxLX1RSQU5TTUlUKSA/CisJCSZzZXJ2aWNlLT5idWxrX3R4IDogJnNlcnZpY2UtPmJ1bGtfcng7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzZXJ2aWNlLT5idWxrX211dGV4KSAhPSAwKSB7CisJCXN0YXR1cyA9IFZDSElRX1JFVFJZOworCQlnb3RvIGVycm9yX2V4aXQ7CisJfQorCisJaWYgKHF1ZXVlLT5sb2NhbF9pbnNlcnQgPT0gcXVldWUtPnJlbW92ZSArIFZDSElRX05VTV9TRVJWSUNFX0JVTEtTKSB7CisJCVZDSElRX1NFUlZJQ0VfU1RBVFNfSU5DKHNlcnZpY2UsIGJ1bGtfc3RhbGxzKTsKKwkJZG8geworCQkJbXV0ZXhfdW5sb2NrKCZzZXJ2aWNlLT5idWxrX211dGV4KTsKKwkJCWlmIChkb3duX2ludGVycnVwdGlibGUoJnNlcnZpY2UtPmJ1bGtfcmVtb3ZlX2V2ZW50KQorCQkJCSE9IDApIHsKKwkJCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJCQlnb3RvIGVycm9yX2V4aXQ7CisJCQl9CisJCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzZXJ2aWNlLT5idWxrX211dGV4KQorCQkJCSE9IDApIHsKKwkJCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJCQlnb3RvIGVycm9yX2V4aXQ7CisJCQl9CisJCX0gd2hpbGUgKHF1ZXVlLT5sb2NhbF9pbnNlcnQgPT0gcXVldWUtPnJlbW92ZSArCisJCQkJVkNISVFfTlVNX1NFUlZJQ0VfQlVMS1MpOworCX0KKworCWJ1bGsgPSAmcXVldWUtPmJ1bGtzW0JVTEtfSU5ERVgocXVldWUtPmxvY2FsX2luc2VydCldOworCisJYnVsay0+bW9kZSA9IG1vZGU7CisJYnVsay0+ZGlyID0gZGlyOworCWJ1bGstPnVzZXJkYXRhID0gdXNlcmRhdGE7CisJYnVsay0+c2l6ZSA9IHNpemU7CisJYnVsay0+YWN0dWFsID0gVkNISVFfQlVMS19BQ1RVQUxfQUJPUlRFRDsKKworCWlmICh2Y2hpcV9wcmVwYXJlX2J1bGtfZGF0YShidWxrLCBtZW1oYW5kbGUsIG9mZnNldCwgc2l6ZSwgZGlyKSAhPQorCQlWQ0hJUV9TVUNDRVNTKQorCQlnb3RvIHVubG9ja19lcnJvcl9leGl0OworCisJd21iKCk7CisKKwl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVkOiBidCAoJWQtPiVkKSAlY3ggJXhAJXggJXgiLAorCQlzdGF0ZS0+aWQsCisJCXNlcnZpY2UtPmxvY2FscG9ydCwgc2VydmljZS0+cmVtb3RlcG9ydCwgZGlyX2NoYXIsCisJCXNpemUsICh1bnNpZ25lZCBpbnQpYnVsay0+ZGF0YSwgKHVuc2lnbmVkIGludCl1c2VyZGF0YSk7CisKKwkvKiBUaGUgc2xvdCBtdXRleCBtdXN0IGJlIGhlbGQgd2hlbiB0aGUgc2VydmljZSBpcyBiZWluZyBjbG9zZWQsIHNvCisJICAgY2xhaW0gaXQgaGVyZSB0byBlbnN1cmUgdGhhdCBpc24ndCBoYXBwZW5pbmcgKi8KKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+c2xvdF9tdXRleCkgIT0gMCkgeworCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJZ290byBjYW5jZWxfYnVsa19lcnJvcl9leGl0OworCX0KKworCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9PUEVOKQorCQlnb3RvIHVubG9ja19ib3RoX2Vycm9yX2V4aXQ7CisKKwlpZiAoc3RhdGUtPmlzX21hc3RlcikgeworCQlxdWV1ZS0+bG9jYWxfaW5zZXJ0Kys7CisJCWlmIChyZXNvbHZlX2J1bGtzKHNlcnZpY2UsIHF1ZXVlKSkKKwkJCXJlcXVlc3RfcG9sbChzdGF0ZSwgc2VydmljZSwKKwkJCQkoZGlyID09IFZDSElRX0JVTEtfVFJBTlNNSVQpID8KKwkJCQlWQ0hJUV9QT0xMX1RYTk9USUZZIDogVkNISVFfUE9MTF9SWE5PVElGWSk7CisJfSBlbHNlIHsKKwkJaW50IHBheWxvYWRbMl0gPSB7IChpbnQpYnVsay0+ZGF0YSwgYnVsay0+c2l6ZSB9OworCQlWQ0hJUV9FTEVNRU5UX1QgZWxlbWVudCA9IHsgcGF5bG9hZCwgc2l6ZW9mKHBheWxvYWQpIH07CisKKwkJc3RhdHVzID0gcXVldWVfbWVzc2FnZShzdGF0ZSwgTlVMTCwKKwkJCVZDSElRX01BS0VfTVNHKGRpcl9tc2d0eXBlLAorCQkJCXNlcnZpY2UtPmxvY2FscG9ydCwgc2VydmljZS0+cmVtb3RlcG9ydCksCisJCQkmZWxlbWVudCwgMSwgc2l6ZW9mKHBheWxvYWQpLAorCQkJUU1GTEFHU19JU19CTE9DS0lORyB8CisJCQlRTUZMQUdTX05PX01VVEVYX0xPQ0sgfAorCQkJUU1GTEFHU19OT19NVVRFWF9VTkxPQ0spOworCQlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpIHsKKwkJCWdvdG8gdW5sb2NrX2JvdGhfZXJyb3JfZXhpdDsKKwkJfQorCQlxdWV1ZS0+bG9jYWxfaW5zZXJ0Kys7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2xvdF9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZzZXJ2aWNlLT5idWxrX211dGV4KTsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVkOiBidDolZCAlY3ggbGk9JXggcmk9JXggcD0leCIsCisJCXN0YXRlLT5pZCwKKwkJc2VydmljZS0+bG9jYWxwb3J0LCBkaXJfY2hhciwKKwkJcXVldWUtPmxvY2FsX2luc2VydCwgcXVldWUtPnJlbW90ZV9pbnNlcnQsIHF1ZXVlLT5wcm9jZXNzKTsKKword2FpdGluZzoKKwl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKworCXN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisKKwlpZiAoYnVsa193YWl0ZXIpIHsKKwkJYnVsa193YWl0ZXItPmJ1bGsgPSBidWxrOworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZidWxrX3dhaXRlci0+ZXZlbnQpICE9IDApCisJCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJZWxzZSBpZiAoYnVsa193YWl0ZXItPmFjdHVhbCA9PSBWQ0hJUV9CVUxLX0FDVFVBTF9BQk9SVEVEKQorCQkJc3RhdHVzID0gVkNISVFfRVJST1I7CisJfQorCisJcmV0dXJuIHN0YXR1czsKKwordW5sb2NrX2JvdGhfZXJyb3JfZXhpdDoKKwltdXRleF91bmxvY2soJnN0YXRlLT5zbG90X211dGV4KTsKK2NhbmNlbF9idWxrX2Vycm9yX2V4aXQ6CisJdmNoaXFfY29tcGxldGVfYnVsayhidWxrKTsKK3VubG9ja19lcnJvcl9leGl0OgorCW11dGV4X3VubG9jaygmc2VydmljZS0+YnVsa19tdXRleCk7CisKK2Vycm9yX2V4aXQ6CisJaWYgKHNlcnZpY2UpCisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCXJldHVybiBzdGF0dXM7Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9xdWV1ZV9tZXNzYWdlKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorCWNvbnN0IFZDSElRX0VMRU1FTlRfVCAqZWxlbWVudHMsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfYnlfaGFuZGxlKGhhbmRsZSk7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfRVJST1I7CisKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoIXNlcnZpY2UgfHwKKwkJKHZjaGlxX2NoZWNrX3NlcnZpY2Uoc2VydmljZSkgIT0gVkNISVFfU1VDQ0VTUykpCisJCWdvdG8gZXJyb3JfZXhpdDsKKworCWZvciAoaSA9IDA7IGkgPCAodW5zaWduZWQgaW50KWNvdW50OyBpKyspIHsKKwkJaWYgKGVsZW1lbnRzW2ldLnNpemUpIHsKKwkJCWlmIChlbGVtZW50c1tpXS5kYXRhID09IE5VTEwpIHsKKwkJCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLCBlcnJvcl9jb3VudCk7CisJCQkJZ290byBlcnJvcl9leGl0OworCQkJfQorCQkJc2l6ZSArPSBlbGVtZW50c1tpXS5zaXplOworCQl9CisJfQorCisJaWYgKHNpemUgPiBWQ0hJUV9NQVhfTVNHX1NJWkUpIHsKKwkJVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwgZXJyb3JfY291bnQpOworCQlnb3RvIGVycm9yX2V4aXQ7CisJfQorCisJc3dpdGNoIChzZXJ2aWNlLT5zcnZzdGF0ZSkgeworCWNhc2UgVkNISVFfU1JWU1RBVEVfT1BFTjoKKwkJc3RhdHVzID0gcXVldWVfbWVzc2FnZShzZXJ2aWNlLT5zdGF0ZSwgc2VydmljZSwKKwkJCQlWQ0hJUV9NQUtFX01TRyhWQ0hJUV9NU0dfREFUQSwKKwkJCQkJc2VydmljZS0+bG9jYWxwb3J0LAorCQkJCQlzZXJ2aWNlLT5yZW1vdGVwb3J0KSwKKwkJCQllbGVtZW50cywgY291bnQsIHNpemUsIDEpOworCQlicmVhazsKKwljYXNlIFZDSElRX1NSVlNUQVRFX09QRU5TWU5DOgorCQlzdGF0dXMgPSBxdWV1ZV9tZXNzYWdlX3N5bmMoc2VydmljZS0+c3RhdGUsIHNlcnZpY2UsCisJCQkJVkNISVFfTUFLRV9NU0coVkNISVFfTVNHX0RBVEEsCisJCQkJCXNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCQkJc2VydmljZS0+cmVtb3RlcG9ydCksCisJCQkJZWxlbWVudHMsIGNvdW50LCBzaXplLCAxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RhdHVzID0gVkNISVFfRVJST1I7CisJCWJyZWFrOworCX0KKworZXJyb3JfZXhpdDoKKwlpZiAoc2VydmljZSkKKwkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkCit2Y2hpcV9yZWxlYXNlX21lc3NhZ2UoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsIFZDSElRX0hFQURFUl9UICpoZWFkZXIpCit7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gZmluZF9zZXJ2aWNlX2J5X2hhbmRsZShoYW5kbGUpOworCVZDSElRX1NIQVJFRF9TVEFURV9UICpyZW1vdGU7CisJVkNISVFfU1RBVEVfVCAqc3RhdGU7CisJaW50IHNsb3RfaW5kZXg7CisKKwlpZiAoIXNlcnZpY2UpCisJCXJldHVybjsKKworCXN0YXRlID0gc2VydmljZS0+c3RhdGU7CisJcmVtb3RlID0gc3RhdGUtPnJlbW90ZTsKKworCXNsb3RfaW5kZXggPSBTTE9UX0lOREVYX0ZST01fREFUQShzdGF0ZSwgKHZvaWQgKiloZWFkZXIpOworCisJaWYgKChzbG90X2luZGV4ID49IHJlbW90ZS0+c2xvdF9maXJzdCkgJiYKKwkJKHNsb3RfaW5kZXggPD0gcmVtb3RlLT5zbG90X2xhc3QpKSB7CisJCWludCBtc2dpZCA9IGhlYWRlci0+bXNnaWQ7CisJCWlmIChtc2dpZCAmIFZDSElRX01TR0lEX0NMQUlNRUQpIHsKKwkJCVZDSElRX1NMT1RfSU5GT19UICpzbG90X2luZm8gPQorCQkJCVNMT1RfSU5GT19GUk9NX0lOREVYKHN0YXRlLCBzbG90X2luZGV4KTsKKworCQkJcmVsZWFzZV9zbG90KHN0YXRlLCBzbG90X2luZm8sIGhlYWRlciwgc2VydmljZSk7CisJCX0KKwl9IGVsc2UgaWYgKHNsb3RfaW5kZXggPT0gcmVtb3RlLT5zbG90X3N5bmMpCisJCXJlbGVhc2VfbWVzc2FnZV9zeW5jKHN0YXRlLCBoZWFkZXIpOworCisJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7Cit9CisKK3N0YXRpYyB2b2lkCityZWxlYXNlX21lc3NhZ2Vfc3luYyhWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfSEVBREVSX1QgKmhlYWRlcikKK3sKKwloZWFkZXItPm1zZ2lkID0gVkNISVFfTVNHSURfUEFERElORzsKKwl3bWIoKTsKKwlyZW1vdGVfZXZlbnRfc2lnbmFsKCZzdGF0ZS0+cmVtb3RlLT5zeW5jX3JlbGVhc2UpOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfZ2V0X3BlZXJfdmVyc2lvbihWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwgc2hvcnQgKnBlZXJfdmVyc2lvbikKK3sKKyAgIFZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX0VSUk9SOworICAgVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gZmluZF9zZXJ2aWNlX2J5X2hhbmRsZShoYW5kbGUpOworCisgICBpZiAoIXNlcnZpY2UgfHwKKyAgICAgICh2Y2hpcV9jaGVja19zZXJ2aWNlKHNlcnZpY2UpICE9IFZDSElRX1NVQ0NFU1MpIHx8CisgICAgICAhcGVlcl92ZXJzaW9uKQorICAgICAgZ290byBleGl0OworICAgKnBlZXJfdmVyc2lvbiA9IHNlcnZpY2UtPnBlZXJfdmVyc2lvbjsKKyAgIHN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisKK2V4aXQ6CisgICBpZiAoc2VydmljZSkKKyAgICAgIHVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworICAgcmV0dXJuIHN0YXR1czsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2dldF9jb25maWcoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwKKwlpbnQgY29uZmlnX3NpemUsIFZDSElRX0NPTkZJR19UICpwY29uZmlnKQoreworCVZDSElRX0NPTkZJR19UIGNvbmZpZzsKKworCSh2b2lkKWluc3RhbmNlOworCisJY29uZmlnLm1heF9tc2dfc2l6ZSAgICAgICAgICAgPSBWQ0hJUV9NQVhfTVNHX1NJWkU7CisJY29uZmlnLmJ1bGtfdGhyZXNob2xkICAgICAgICAgPSBWQ0hJUV9NQVhfTVNHX1NJWkU7CisJY29uZmlnLm1heF9vdXRzdGFuZGluZ19idWxrcyAgPSBWQ0hJUV9OVU1fU0VSVklDRV9CVUxLUzsKKwljb25maWcubWF4X3NlcnZpY2VzICAgICAgICAgICA9IFZDSElRX01BWF9TRVJWSUNFUzsKKwljb25maWcudmVyc2lvbiAgICAgICAgICAgICAgICA9IFZDSElRX1ZFUlNJT047CisJY29uZmlnLnZlcnNpb25fbWluICAgICAgICAgICAgPSBWQ0hJUV9WRVJTSU9OX01JTjsKKworCWlmIChjb25maWdfc2l6ZSA+IHNpemVvZihWQ0hJUV9DT05GSUdfVCkpCisJCXJldHVybiBWQ0hJUV9FUlJPUjsKKworCW1lbWNweShwY29uZmlnLCAmY29uZmlnLAorCQltaW4oY29uZmlnX3NpemUsIChpbnQpKHNpemVvZihWQ0hJUV9DT05GSUdfVCkpKSk7CisKKwlyZXR1cm4gVkNISVFfU1VDQ0VTUzsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3NldF9zZXJ2aWNlX29wdGlvbihWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKwlWQ0hJUV9TRVJWSUNFX09QVElPTl9UIG9wdGlvbiwgaW50IHZhbHVlKQoreworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9oYW5kbGUoaGFuZGxlKTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKworCWlmIChzZXJ2aWNlKSB7CisJCXN3aXRjaCAob3B0aW9uKSB7CisJCWNhc2UgVkNISVFfU0VSVklDRV9PUFRJT05fQVVUT0NMT1NFOgorCQkJc2VydmljZS0+YXV0b19jbG9zZSA9IHZhbHVlOworCQkJc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKwkJCWJyZWFrOworCisJCWNhc2UgVkNISVFfU0VSVklDRV9PUFRJT05fU0xPVF9RVU9UQTogeworCQkJVkNISVFfU0VSVklDRV9RVU9UQV9UICpzZXJ2aWNlX3F1b3RhID0KKwkJCQkmc2VydmljZS0+c3RhdGUtPnNlcnZpY2VfcXVvdGFzWworCQkJCQlzZXJ2aWNlLT5sb2NhbHBvcnRdOworCQkJaWYgKHZhbHVlID09IDApCisJCQkJdmFsdWUgPSBzZXJ2aWNlLT5zdGF0ZS0+ZGVmYXVsdF9zbG90X3F1b3RhOworCQkJaWYgKCh2YWx1ZSA+PSBzZXJ2aWNlX3F1b3RhLT5zbG90X3VzZV9jb3VudCkgJiYKKwkJCQkgKHZhbHVlIDwgKHVuc2lnbmVkIHNob3J0KX4wKSkgeworCQkJCXNlcnZpY2VfcXVvdGEtPnNsb3RfcXVvdGEgPSB2YWx1ZTsKKwkJCQlpZiAoKHZhbHVlID49IHNlcnZpY2VfcXVvdGEtPnNsb3RfdXNlX2NvdW50KSAmJgorCQkJCQkoc2VydmljZV9xdW90YS0+bWVzc2FnZV9xdW90YSA+PQorCQkJCQkgc2VydmljZV9xdW90YS0+bWVzc2FnZV91c2VfY291bnQpKSB7CisJCQkJCS8qIFNpZ25hbCB0aGUgc2VydmljZSB0aGF0IGl0IG1heSBoYXZlCisJCQkJCSoqIGRyb3BwZWQgYmVsb3cgaXRzIHF1b3RhICovCisJCQkJCXVwKCZzZXJ2aWNlX3F1b3RhLT5xdW90YV9ldmVudCk7CisJCQkJfQorCQkJCXN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisJCQl9CisJCX0gYnJlYWs7CisKKwkJY2FzZSBWQ0hJUV9TRVJWSUNFX09QVElPTl9NRVNTQUdFX1FVT1RBOiB7CisJCQlWQ0hJUV9TRVJWSUNFX1FVT1RBX1QgKnNlcnZpY2VfcXVvdGEgPQorCQkJCSZzZXJ2aWNlLT5zdGF0ZS0+c2VydmljZV9xdW90YXNbCisJCQkJCXNlcnZpY2UtPmxvY2FscG9ydF07CisJCQlpZiAodmFsdWUgPT0gMCkKKwkJCQl2YWx1ZSA9IHNlcnZpY2UtPnN0YXRlLT5kZWZhdWx0X21lc3NhZ2VfcXVvdGE7CisJCQlpZiAoKHZhbHVlID49IHNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfdXNlX2NvdW50KSAmJgorCQkJCSAodmFsdWUgPCAodW5zaWduZWQgc2hvcnQpfjApKSB7CisJCQkJc2VydmljZV9xdW90YS0+bWVzc2FnZV9xdW90YSA9IHZhbHVlOworCQkJCWlmICgodmFsdWUgPj0KKwkJCQkJc2VydmljZV9xdW90YS0+bWVzc2FnZV91c2VfY291bnQpICYmCisJCQkJCShzZXJ2aWNlX3F1b3RhLT5zbG90X3F1b3RhID49CisJCQkJCXNlcnZpY2VfcXVvdGEtPnNsb3RfdXNlX2NvdW50KSkKKwkJCQkJLyogU2lnbmFsIHRoZSBzZXJ2aWNlIHRoYXQgaXQgbWF5IGhhdmUKKwkJCQkJKiogZHJvcHBlZCBiZWxvdyBpdHMgcXVvdGEgKi8KKwkJCQkJdXAoJnNlcnZpY2VfcXVvdGEtPnF1b3RhX2V2ZW50KTsKKwkJCQlzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCQkJfQorCQl9IGJyZWFrOworCisJCWNhc2UgVkNISVFfU0VSVklDRV9PUFRJT05fU1lOQ0hST05PVVM6CisJCQlpZiAoKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0hJRERFTikgfHwKKwkJCQkoc2VydmljZS0+c3J2c3RhdGUgPT0KKwkJCQlWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcpKSB7CisJCQkJc2VydmljZS0+c3luYyA9IHZhbHVlOworCQkJCXN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFZDSElRX1NFUlZJQ0VfT1BUSU9OX1RSQUNFOgorCQkJc2VydmljZS0+dHJhY2UgPSB2YWx1ZTsKKwkJCXN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKwordm9pZAordmNoaXFfZHVtcF9zaGFyZWRfc3RhdGUodm9pZCAqZHVtcF9jb250ZXh0LCBWQ0hJUV9TVEFURV9UICpzdGF0ZSwKKwlWQ0hJUV9TSEFSRURfU1RBVEVfVCAqc2hhcmVkLCBjb25zdCBjaGFyICpsYWJlbCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZGVidWdfbmFtZXNbXSA9IHsKKwkJIjxlbnRyaWVzPiIsCisJCSJTTE9UX0hBTkRMRVJfQ09VTlQiLAorCQkiU0xPVF9IQU5ETEVSX0xJTkUiLAorCQkiUEFSU0VfTElORSIsCisJCSJQQVJTRV9IRUFERVIiLAorCQkiUEFSU0VfTVNHSUQiLAorCQkiQVdBSVRfQ09NUExFVElPTl9MSU5FIiwKKwkJIkRFUVVFVUVfTUVTU0FHRV9MSU5FIiwKKwkJIlNFUlZJQ0VfQ0FMTEJBQ0tfTElORSIsCisJCSJNU0dfUVVFVUVfRlVMTF9DT1VOVCIsCisJCSJDT01QTEVUSU9OX1FVRVVFX0ZVTExfQ09VTlQiCisJfTsKKwlpbnQgaTsKKworCWNoYXIgYnVmWzgwXTsKKwlpbnQgbGVuOworCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCSIgICVzOiBzbG90cyAlZC0lZCB0eF9wb3M9JXggcmVjeWNsZT0leCIsCisJCWxhYmVsLCBzaGFyZWQtPnNsb3RfZmlyc3QsIHNoYXJlZC0+c2xvdF9sYXN0LAorCQlzaGFyZWQtPnR4X3Bvcywgc2hhcmVkLT5zbG90X3F1ZXVlX3JlY3ljbGUpOworCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworCisJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJIiAgICBTbG90cyBjbGFpbWVkOiIpOworCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworCisJZm9yIChpID0gc2hhcmVkLT5zbG90X2ZpcnN0OyBpIDw9IHNoYXJlZC0+c2xvdF9sYXN0OyBpKyspIHsKKwkJVkNISVFfU0xPVF9JTkZPX1Qgc2xvdF9pbmZvID0gKlNMT1RfSU5GT19GUk9NX0lOREVYKHN0YXRlLCBpKTsKKwkJaWYgKHNsb3RfaW5mby51c2VfY291bnQgIT0gc2xvdF9pbmZvLnJlbGVhc2VfY291bnQpIHsKKwkJCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkJIiAgICAgICVkOiAlZC8lZCIsIGksIHNsb3RfaW5mby51c2VfY291bnQsCisJCQkJc2xvdF9pbmZvLnJlbGVhc2VfY291bnQpOworCQkJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAxOyBpIDwgc2hhcmVkLT5kZWJ1Z1tERUJVR19FTlRSSUVTXTsgaSsrKSB7CisJCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIgICAgREVCVUc6ICVzID0gJWQoJXgpIiwKKwkJCWRlYnVnX25hbWVzW2ldLCBzaGFyZWQtPmRlYnVnW2ldLCBzaGFyZWQtPmRlYnVnW2ldKTsKKwkJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisJfQorfQorCit2b2lkCit2Y2hpcV9kdW1wX3N0YXRlKHZvaWQgKmR1bXBfY29udGV4dCwgVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJY2hhciBidWZbODBdOworCWludCBsZW47CisJaW50IGk7CisKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiU3RhdGUgJWQ6ICVzIiwgc3RhdGUtPmlkLAorCQljb25uX3N0YXRlX25hbWVzW3N0YXRlLT5jb25uX3N0YXRlXSk7CisJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkiICB0eF9wb3M9JXgoQCV4KSwgcnhfcG9zPSV4KEAleCkiLAorCQlzdGF0ZS0+bG9jYWwtPnR4X3BvcywKKwkJKHVpbnQzMl90KXN0YXRlLT50eF9kYXRhICsKKwkJCShzdGF0ZS0+bG9jYWxfdHhfcG9zICYgVkNISVFfU0xPVF9NQVNLKSwKKwkJc3RhdGUtPnJ4X3BvcywKKwkJKHVpbnQzMl90KXN0YXRlLT5yeF9kYXRhICsKKwkJCShzdGF0ZS0+cnhfcG9zICYgVkNISVFfU0xPVF9NQVNLKSk7CisJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkiICBWZXJzaW9uOiAlZCAobWluICVkKSIsCisJCVZDSElRX1ZFUlNJT04sIFZDSElRX1ZFUlNJT05fTUlOKTsKKwl2Y2hpcV9kdW1wKGR1bXBfY29udGV4dCwgYnVmLCBsZW4gKyAxKTsKKworCWlmIChWQ0hJUV9FTkFCTEVfU1RBVFMpIHsKKwkJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJCSIgIFN0YXRzOiBjdHJsX3R4X2NvdW50PSVkLCBjdHJsX3J4X2NvdW50PSVkLCAiCisJCQkiZXJyb3JfY291bnQ9JWQiLAorCQkJc3RhdGUtPnN0YXRzLmN0cmxfdHhfY291bnQsIHN0YXRlLT5zdGF0cy5jdHJsX3J4X2NvdW50LAorCQkJc3RhdGUtPnN0YXRzLmVycm9yX2NvdW50KTsKKwkJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisJfQorCisJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJIiAgU2xvdHM6ICVkIGF2YWlsYWJsZSAoJWQgZGF0YSksICVkIHJlY3ljbGFibGUsICVkIHN0YWxscyAiCisJCSIoJWQgZGF0YSkiLAorCQkoKHN0YXRlLT5zbG90X3F1ZXVlX2F2YWlsYWJsZSAqIFZDSElRX1NMT1RfU0laRSkgLQorCQkJc3RhdGUtPmxvY2FsX3R4X3BvcykgLyBWQ0hJUV9TTE9UX1NJWkUsCisJCXN0YXRlLT5kYXRhX3F1b3RhIC0gc3RhdGUtPmRhdGFfdXNlX2NvdW50LAorCQlzdGF0ZS0+bG9jYWwtPnNsb3RfcXVldWVfcmVjeWNsZSAtIHN0YXRlLT5zbG90X3F1ZXVlX2F2YWlsYWJsZSwKKwkJc3RhdGUtPnN0YXRzLnNsb3Rfc3RhbGxzLCBzdGF0ZS0+c3RhdHMuZGF0YV9zdGFsbHMpOworCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworCisJdmNoaXFfZHVtcF9wbGF0Zm9ybV9zdGF0ZShkdW1wX2NvbnRleHQpOworCisJdmNoaXFfZHVtcF9zaGFyZWRfc3RhdGUoZHVtcF9jb250ZXh0LCBzdGF0ZSwgc3RhdGUtPmxvY2FsLCAiTG9jYWwiKTsKKwl2Y2hpcV9kdW1wX3NoYXJlZF9zdGF0ZShkdW1wX2NvbnRleHQsIHN0YXRlLCBzdGF0ZS0+cmVtb3RlLCAiUmVtb3RlIik7CisKKwl2Y2hpcV9kdW1wX3BsYXRmb3JtX2luc3RhbmNlcyhkdW1wX2NvbnRleHQpOworCisJZm9yIChpID0gMDsgaSA8IHN0YXRlLT51bnVzZWRfc2VydmljZTsgaSsrKSB7CisJCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9wb3J0KHN0YXRlLCBpKTsKKworCQlpZiAoc2VydmljZSkgeworCQkJdmNoaXFfZHVtcF9zZXJ2aWNlX3N0YXRlKGR1bXBfY29udGV4dCwgc2VydmljZSk7CisJCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwkJfQorCX0KK30KKwordm9pZAordmNoaXFfZHVtcF9zZXJ2aWNlX3N0YXRlKHZvaWQgKmR1bXBfY29udGV4dCwgVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKQoreworCWNoYXIgYnVmWzgwXTsKKwlpbnQgbGVuOworCisJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlNlcnZpY2UgJWQ6ICVzIChyZWYgJXUpIiwKKwkJc2VydmljZS0+bG9jYWxwb3J0LCBzcnZzdGF0ZV9uYW1lc1tzZXJ2aWNlLT5zcnZzdGF0ZV0sCisJCXNlcnZpY2UtPnJlZl9jb3VudCAtIDEpOyAvKkRvbid0IGluY2x1ZGUgdGhlIGxvY2sganVzdCB0YWtlbiovCisKKwlpZiAoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfRlJFRSkgeworCQljaGFyIHJlbW90ZXBvcnRbMzBdOworCQlWQ0hJUV9TRVJWSUNFX1FVT1RBX1QgKnNlcnZpY2VfcXVvdGEgPQorCQkJJnNlcnZpY2UtPnN0YXRlLT5zZXJ2aWNlX3F1b3Rhc1tzZXJ2aWNlLT5sb2NhbHBvcnRdOworCQlpbnQgZm91cmNjID0gc2VydmljZS0+YmFzZS5mb3VyY2M7CisJCWludCB0eF9wZW5kaW5nLCByeF9wZW5kaW5nOworCQlpZiAoc2VydmljZS0+cmVtb3RlcG9ydCAhPSBWQ0hJUV9QT1JUX0ZSRUUpIHsKKwkJCWludCBsZW4yID0gc25wcmludGYocmVtb3RlcG9ydCwgc2l6ZW9mKHJlbW90ZXBvcnQpLAorCQkJCSIlZCIsIHNlcnZpY2UtPnJlbW90ZXBvcnQpOworCQkJaWYgKHNlcnZpY2UtPnB1YmxpY19mb3VyY2MgIT0gVkNISVFfRk9VUkNDX0lOVkFMSUQpCisJCQkJc25wcmludGYocmVtb3RlcG9ydCArIGxlbjIsCisJCQkJCXNpemVvZihyZW1vdGVwb3J0KSAtIGxlbjIsCisJCQkJCSIgKGNsaWVudCAleCkiLCBzZXJ2aWNlLT5jbGllbnRfaWQpOworCQl9IGVsc2UKKwkJCXN0cmNweShyZW1vdGVwb3J0LCAibi9hIik7CisKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCisJCQkiICclYyVjJWMlYycgcmVtb3RlICVzIChtc2cgdXNlICVkLyVkLCBzbG90IHVzZSAlZC8lZCkiLAorCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUyhmb3VyY2MpLAorCQkJcmVtb3RlcG9ydCwKKwkJCXNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfdXNlX2NvdW50LAorCQkJc2VydmljZV9xdW90YS0+bWVzc2FnZV9xdW90YSwKKwkJCXNlcnZpY2VfcXVvdGEtPnNsb3RfdXNlX2NvdW50LAorCQkJc2VydmljZV9xdW90YS0+c2xvdF9xdW90YSk7CisKKwkJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisKKwkJdHhfcGVuZGluZyA9IHNlcnZpY2UtPmJ1bGtfdHgubG9jYWxfaW5zZXJ0IC0KKwkJCXNlcnZpY2UtPmJ1bGtfdHgucmVtb3RlX2luc2VydDsKKworCQlyeF9wZW5kaW5nID0gc2VydmljZS0+YnVsa19yeC5sb2NhbF9pbnNlcnQgLQorCQkJc2VydmljZS0+YnVsa19yeC5yZW1vdGVfaW5zZXJ0OworCisJCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkiICBCdWxrOiB0eF9wZW5kaW5nPSVkIChzaXplICVkKSwiCisJCQkiIHJ4X3BlbmRpbmc9JWQgKHNpemUgJWQpIiwKKwkJCXR4X3BlbmRpbmcsCisJCQl0eF9wZW5kaW5nID8gc2VydmljZS0+YnVsa190eC5idWxrc1sKKwkJCUJVTEtfSU5ERVgoc2VydmljZS0+YnVsa190eC5yZW1vdmUpXS5zaXplIDogMCwKKwkJCXJ4X3BlbmRpbmcsCisJCQlyeF9wZW5kaW5nID8gc2VydmljZS0+YnVsa19yeC5idWxrc1sKKwkJCUJVTEtfSU5ERVgoc2VydmljZS0+YnVsa19yeC5yZW1vdmUpXS5zaXplIDogMCk7CisKKwkJaWYgKFZDSElRX0VOQUJMRV9TVEFUUykgeworCQkJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisKKwkJCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkJIiAgQ3RybDogdHhfY291bnQ9JWQsIHR4X2J5dGVzPSVsbHUsICIKKwkJCQkicnhfY291bnQ9JWQsIHJ4X2J5dGVzPSVsbHUiLAorCQkJCXNlcnZpY2UtPnN0YXRzLmN0cmxfdHhfY291bnQsCisJCQkJc2VydmljZS0+c3RhdHMuY3RybF90eF9ieXRlcywKKwkJCQlzZXJ2aWNlLT5zdGF0cy5jdHJsX3J4X2NvdW50LAorCQkJCXNlcnZpY2UtPnN0YXRzLmN0cmxfcnhfYnl0ZXMpOworCQkJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisKKwkJCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkJIiAgQnVsazogdHhfY291bnQ9JWQsIHR4X2J5dGVzPSVsbHUsICIKKwkJCQkicnhfY291bnQ9JWQsIHJ4X2J5dGVzPSVsbHUiLAorCQkJCXNlcnZpY2UtPnN0YXRzLmJ1bGtfdHhfY291bnQsCisJCQkJc2VydmljZS0+c3RhdHMuYnVsa190eF9ieXRlcywKKwkJCQlzZXJ2aWNlLT5zdGF0cy5idWxrX3J4X2NvdW50LAorCQkJCXNlcnZpY2UtPnN0YXRzLmJ1bGtfcnhfYnl0ZXMpOworCQkJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisKKwkJCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkJIiAgJWQgcXVvdGEgc3RhbGxzLCAlZCBzbG90IHN0YWxscywgIgorCQkJCSIlZCBidWxrIHN0YWxscywgJWQgYWJvcnRlZCwgJWQgZXJyb3JzIiwKKwkJCQlzZXJ2aWNlLT5zdGF0cy5xdW90YV9zdGFsbHMsCisJCQkJc2VydmljZS0+c3RhdHMuc2xvdF9zdGFsbHMsCisJCQkJc2VydmljZS0+c3RhdHMuYnVsa19zdGFsbHMsCisJCQkJc2VydmljZS0+c3RhdHMuYnVsa19hYm9ydGVkX2NvdW50LAorCQkJCXNlcnZpY2UtPnN0YXRzLmVycm9yX2NvdW50KTsKKwkJIH0KKwl9CisKKwl2Y2hpcV9kdW1wKGR1bXBfY29udGV4dCwgYnVmLCBsZW4gKyAxKTsKKworCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9GUkVFKQorCQl2Y2hpcV9kdW1wX3BsYXRmb3JtX3NlcnZpY2Vfc3RhdGUoZHVtcF9jb250ZXh0LCBzZXJ2aWNlKTsKK30KKworCit2b2lkCit2Y2hpcV9sb3VkX2Vycm9yX2hlYWRlcih2b2lkKQoreworCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKwkJIj09PT09PT09PT09PT09PT0iKTsKKwl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisJCSI9PT09PT09PT09PT09PT09Iik7CisJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLCAiPT09PT0iKTsKK30KKwordm9pZAordmNoaXFfbG91ZF9lcnJvcl9mb290ZXIodm9pZCkKK3sKKwl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsICI9PT09PSIpOworCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKwkJIj09PT09PT09PT09PT09PT0iKTsKKwl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisJCSI9PT09PT09PT09PT09PT09Iik7Cit9CisKKworVkNISVFfU1RBVFVTX1QgdmNoaXFfc2VuZF9yZW1vdGVfdXNlKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX1JFVFJZOworCWlmIChzdGF0ZS0+Y29ubl9zdGF0ZSAhPSBWQ0hJUV9DT05OU1RBVEVfRElTQ09OTkVDVEVEKQorCQlzdGF0dXMgPSBxdWV1ZV9tZXNzYWdlKHN0YXRlLCBOVUxMLAorCQkJVkNISVFfTUFLRV9NU0coVkNISVFfTVNHX1JFTU9URV9VU0UsIDAsIDApLAorCQkJTlVMTCwgMCwgMCwgMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworVkNISVFfU1RBVFVTX1QgdmNoaXFfc2VuZF9yZW1vdGVfcmVsZWFzZShWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwlpZiAoc3RhdGUtPmNvbm5fc3RhdGUgIT0gVkNISVFfQ09OTlNUQVRFX0RJU0NPTk5FQ1RFRCkKKwkJc3RhdHVzID0gcXVldWVfbWVzc2FnZShzdGF0ZSwgTlVMTCwKKwkJCVZDSElRX01BS0VfTVNHKFZDSElRX01TR19SRU1PVEVfUkVMRUFTRSwgMCwgMCksCisJCQlOVUxMLCAwLCAwLCAwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9zZW5kX3JlbW90ZV91c2VfYWN0aXZlKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX1JFVFJZOworCWlmIChzdGF0ZS0+Y29ubl9zdGF0ZSAhPSBWQ0hJUV9DT05OU1RBVEVfRElTQ09OTkVDVEVEKQorCQlzdGF0dXMgPSBxdWV1ZV9tZXNzYWdlKHN0YXRlLCBOVUxMLAorCQkJVkNISVFfTUFLRV9NU0coVkNISVFfTVNHX1JFTU9URV9VU0VfQUNUSVZFLCAwLCAwKSwKKwkJCU5VTEwsIDAsIDAsIDApOworCXJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgdmNoaXFfbG9nX2R1bXBfbWVtKGNvbnN0IGNoYXIgKmxhYmVsLCB1aW50MzJfdCBhZGRyLCBjb25zdCB2b2lkICp2b2lkTWVtLAorCXNpemVfdCBudW1CeXRlcykKK3sKKwljb25zdCB1aW50OF90ICAqbWVtID0gKGNvbnN0IHVpbnQ4X3QgKil2b2lkTWVtOworCXNpemVfdCAgICAgICAgICBvZmZzZXQ7CisJY2hhciAgICAgICAgICAgIGxpbmVCdWZbMTAwXTsKKwljaGFyICAgICAgICAgICAqczsKKworCXdoaWxlIChudW1CeXRlcyA+IDApIHsKKwkJcyA9IGxpbmVCdWY7CisKKwkJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCAxNjsgb2Zmc2V0KyspIHsKKwkJCWlmIChvZmZzZXQgPCBudW1CeXRlcykKKwkJCQlzICs9IHNucHJpbnRmKHMsIDQsICIlMDJ4ICIsIG1lbVtvZmZzZXRdKTsKKwkJCWVsc2UKKwkJCQlzICs9IHNucHJpbnRmKHMsIDQsICIgICAiKTsKKwkJfQorCisJCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgMTY7IG9mZnNldCsrKSB7CisJCQlpZiAob2Zmc2V0IDwgbnVtQnl0ZXMpIHsKKwkJCQl1aW50OF90IGNoID0gbWVtW29mZnNldF07CisKKwkJCQlpZiAoKGNoIDwgJyAnKSB8fCAoY2ggPiAnficpKQorCQkJCQljaCA9ICcuJzsKKwkJCQkqcysrID0gKGNoYXIpY2g7CisJCQl9CisJCX0KKwkJKnMrKyA9ICdcMCc7CisKKwkJaWYgKChsYWJlbCAhPSBOVUxMKSAmJiAoKmxhYmVsICE9ICdcMCcpKQorCQkJdmNoaXFfbG9nX3RyYWNlKFZDSElRX0xPR19UUkFDRSwKKwkJCQkiJXM6ICUwOHg6ICVzIiwgbGFiZWwsIGFkZHIsIGxpbmVCdWYpOworCQllbHNlCisJCQl2Y2hpcV9sb2dfdHJhY2UoVkNISVFfTE9HX1RSQUNFLAorCQkJCSIlMDh4OiAlcyIsIGFkZHIsIGxpbmVCdWYpOworCisJCWFkZHIgKz0gMTY7CisJCW1lbSArPSAxNjsKKwkJaWYgKG51bUJ5dGVzID4gMTYpCisJCQludW1CeXRlcyAtPSAxNjsKKwkJZWxzZQorCQkJbnVtQnl0ZXMgPSAwOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfY29yZS5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlNDg0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfY29yZS5oCkBAIC0wLDAgKzEsNzEyIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElRX0NPUkVfSAorI2RlZmluZSBWQ0hJUV9DT1JFX0gKKworI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorCisjaW5jbHVkZSAidmNoaXFfY2ZnLmgiCisKKyNpbmNsdWRlICJ2Y2hpcS5oIgorCisvKiBSdW4gdGltZSBjb250cm9sIG9mIGxvZyBsZXZlbCwgYmFzZWQgb24gS0VSTl9YWFggbGV2ZWwuICovCisjZGVmaW5lIFZDSElRX0xPR19ERUZBVUxUICA0CisjZGVmaW5lIFZDSElRX0xPR19FUlJPUiAgICAzCisjZGVmaW5lIFZDSElRX0xPR19XQVJOSU5HICA0CisjZGVmaW5lIFZDSElRX0xPR19JTkZPICAgICA2CisjZGVmaW5lIFZDSElRX0xPR19UUkFDRSAgICA3CisKKyNkZWZpbmUgVkNISVFfTE9HX1BSRUZJWCAgIEtFUk5fSU5GTyAidmNoaXE6ICIKKworI2lmbmRlZiB2Y2hpcV9sb2dfZXJyb3IKKyNkZWZpbmUgdmNoaXFfbG9nX2Vycm9yKGNhdCwgZm10LCAuLi4pIFwKKwlkbyB7IGlmIChjYXQgPj0gVkNISVFfTE9HX0VSUk9SKSBcCisJCXByaW50ayhWQ0hJUV9MT0dfUFJFRklYIGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKTsgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2lmbmRlZiB2Y2hpcV9sb2dfd2FybmluZworI2RlZmluZSB2Y2hpcV9sb2dfd2FybmluZyhjYXQsIGZtdCwgLi4uKSBcCisJZG8geyBpZiAoY2F0ID49IFZDSElRX0xPR19XQVJOSU5HKSBcCisJCSBwcmludGsoVkNISVFfTE9HX1BSRUZJWCBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZm5kZWYgdmNoaXFfbG9nX2luZm8KKyNkZWZpbmUgdmNoaXFfbG9nX2luZm8oY2F0LCBmbXQsIC4uLikgXAorCWRvIHsgaWYgKGNhdCA+PSBWQ0hJUV9MT0dfSU5GTykgXAorCQlwcmludGsoVkNISVFfTE9HX1BSRUZJWCBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZm5kZWYgdmNoaXFfbG9nX3RyYWNlCisjZGVmaW5lIHZjaGlxX2xvZ190cmFjZShjYXQsIGZtdCwgLi4uKSBcCisJZG8geyBpZiAoY2F0ID49IFZDSElRX0xPR19UUkFDRSkgXAorCQlwcmludGsoVkNISVFfTE9HX1BSRUZJWCBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSB2Y2hpcV9sb3VkX2Vycm9yKC4uLikgXAorCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwgIj09PT09ICIgX19WQV9BUkdTX18pCisKKyNpZm5kZWYgdmNoaXFfc3RhdGljX2Fzc2VydAorI2RlZmluZSB2Y2hpcV9zdGF0aWNfYXNzZXJ0KGNvbmQpIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIFwKKwlleHRlcm4gaW50IHZjaGlxX3N0YXRpY19hc3NlcnRbKGNvbmQpID8gMSA6IC0xXQorI2VuZGlmCisKKyNkZWZpbmUgSVNfUE9XMih4KSAoeCAmJiAoKHggJiAoeCAtIDEpKSA9PSAwKSkKKworLyogRW5zdXJlIHRoYXQgdGhlIHNsb3Qgc2l6ZSBhbmQgbWF4aW11bSBudW1iZXIgb2Ygc2xvdHMgYXJlIHBvd2VycyBvZiAyICovCit2Y2hpcV9zdGF0aWNfYXNzZXJ0KElTX1BPVzIoVkNISVFfU0xPVF9TSVpFKSk7Cit2Y2hpcV9zdGF0aWNfYXNzZXJ0KElTX1BPVzIoVkNISVFfTUFYX1NMT1RTKSk7Cit2Y2hpcV9zdGF0aWNfYXNzZXJ0KElTX1BPVzIoVkNISVFfTUFYX1NMT1RTX1BFUl9TSURFKSk7CisKKyNkZWZpbmUgVkNISVFfU0xPVF9NQVNLICAgICAgICAoVkNISVFfU0xPVF9TSVpFIC0gMSkKKyNkZWZpbmUgVkNISVFfU0xPVF9RVUVVRV9NQVNLICAoVkNISVFfTUFYX1NMT1RTX1BFUl9TSURFIC0gMSkKKyNkZWZpbmUgVkNISVFfU0xPVF9aRVJPX1NMT1RTICAoKHNpemVvZihWQ0hJUV9TTE9UX1pFUk9fVCkgKyBcCisJVkNISVFfU0xPVF9TSVpFIC0gMSkgLyBWQ0hJUV9TTE9UX1NJWkUpCisKKyNkZWZpbmUgVkNISVFfTVNHX1BBRERJTkcgICAgICAgICAgICAwICAvKiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX0NPTk5FQ1QgICAgICAgICAgICAxICAvKiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX09QRU4gICAgICAgICAgICAgICAyICAvKiArIChzcmNwb3J0LCAtKSwgZm91cmNjLCBjbGllbnRfaWQgKi8KKyNkZWZpbmUgVkNISVFfTVNHX09QRU5BQ0sgICAgICAgICAgICAzICAvKiArIChzcmNwb3J0LCBkc3Rwb3J0KSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX0NMT1NFICAgICAgICAgICAgICA0ICAvKiArIChzcmNwb3J0LCBkc3Rwb3J0KSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX0RBVEEgICAgICAgICAgICAgICA1ICAvKiArIChzcmNwb3J0LCBkc3Rwb3J0KSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX0JVTEtfUlggICAgICAgICAgICA2ICAvKiArIChzcmNwb3J0LCBkc3Rwb3J0KSwgZGF0YSwgc2l6ZSAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX0JVTEtfVFggICAgICAgICAgICA3ICAvKiArIChzcmNwb3J0LCBkc3Rwb3J0KSwgZGF0YSwgc2l6ZSAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX0JVTEtfUlhfRE9ORSAgICAgICA4ICAvKiArIChzcmNwb3J0LCBkc3Rwb3J0KSwgYWN0dWFsICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX0JVTEtfVFhfRE9ORSAgICAgICA5ICAvKiArIChzcmNwb3J0LCBkc3Rwb3J0KSwgYWN0dWFsICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX1BBVVNFICAgICAgICAgICAgIDEwICAvKiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX1JFU1VNRSAgICAgICAgICAgIDExICAvKiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX1JFTU9URV9VU0UgICAgICAgIDEyICAvKiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX1JFTU9URV9SRUxFQVNFICAgIDEzICAvKiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX1JFTU9URV9VU0VfQUNUSVZFIDE0ICAvKiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBWQ0hJUV9QT1JUX01BWCAgICAgICAgICAgICAgICAgKFZDSElRX01BWF9TRVJWSUNFUyAtIDEpCisjZGVmaW5lIFZDSElRX1BPUlRfRlJFRSAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgVkNISVFfUE9SVF9JU19WQUxJRChwb3J0KSAgICAgIChwb3J0IDwgVkNISVFfUE9SVF9GUkVFKQorI2RlZmluZSBWQ0hJUV9NQUtFX01TRyh0eXBlLCBzcmNwb3J0LCBkc3Rwb3J0KSBcCisJKCh0eXBlPDwyNCkgfCAoc3JjcG9ydDw8MTIpIHwgKGRzdHBvcnQ8PDApKQorI2RlZmluZSBWQ0hJUV9NU0dfVFlQRShtc2dpZCkgICAgICAgICAgKCh1bnNpZ25lZCBpbnQpbXNnaWQgPj4gMjQpCisjZGVmaW5lIFZDSElRX01TR19TUkNQT1JUKG1zZ2lkKSBcCisJKHVuc2lnbmVkIHNob3J0KSgoKHVuc2lnbmVkIGludCltc2dpZCA+PiAxMikgJiAweGZmZikKKyNkZWZpbmUgVkNISVFfTVNHX0RTVFBPUlQobXNnaWQpIFwKKwkoKHVuc2lnbmVkIHNob3J0KW1zZ2lkICYgMHhmZmYpCisKKyNkZWZpbmUgVkNISVFfRk9VUkNDX0FTXzRDSEFSUyhmb3VyY2MpCVwKKwkoKGZvdXJjYykgPj4gMjQpICYgMHhmZiwgXAorCSgoZm91cmNjKSA+PiAxNikgJiAweGZmLCBcCisJKChmb3VyY2MpID4+ICA4KSAmIDB4ZmYsIFwKKwkoZm91cmNjKSAmIDB4ZmYKKworLyogRW5zdXJlIHRoZSBmaWVsZHMgYXJlIHdpZGUgZW5vdWdoICovCit2Y2hpcV9zdGF0aWNfYXNzZXJ0KFZDSElRX01TR19TUkNQT1JUKFZDSElRX01BS0VfTVNHKDAsIDAsIFZDSElRX1BPUlRfTUFYKSkKKwk9PSAwKTsKK3ZjaGlxX3N0YXRpY19hc3NlcnQoVkNISVFfTVNHX1RZUEUoVkNISVFfTUFLRV9NU0coMCwgVkNISVFfUE9SVF9NQVgsIDApKSA9PSAwKTsKK3ZjaGlxX3N0YXRpY19hc3NlcnQoKHVuc2lnbmVkIGludClWQ0hJUV9QT1JUX01BWCA8CisJKHVuc2lnbmVkIGludClWQ0hJUV9QT1JUX0ZSRUUpOworCisjZGVmaW5lIFZDSElRX01TR0lEX1BBRERJTkcgICAgICAgICAgICBWQ0hJUV9NQUtFX01TRyhWQ0hJUV9NU0dfUEFERElORywgMCwgMCkKKyNkZWZpbmUgVkNISVFfTVNHSURfQ0xBSU1FRCAgICAgICAgICAgIDB4NDAwMDAwMDAKKworI2RlZmluZSBWQ0hJUV9GT1VSQ0NfSU5WQUxJRCAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBWQ0hJUV9GT1VSQ0NfSVNfTEVHQUwoZm91cmNjKSAgKGZvdXJjYyAhPSBWQ0hJUV9GT1VSQ0NfSU5WQUxJRCkKKworI2RlZmluZSBWQ0hJUV9CVUxLX0FDVFVBTF9BQk9SVEVEIC0xCisKK3R5cGVkZWYgdWludDMyX3QgQklUU0VUX1Q7CisKK3ZjaGlxX3N0YXRpY19hc3NlcnQoKHNpemVvZihCSVRTRVRfVCkgKiA4KSA9PSAzMik7CisKKyNkZWZpbmUgQklUU0VUX1NJWkUoYikgICAgICAgICgoYiArIDMxKSA+PiA1KQorI2RlZmluZSBCSVRTRVRfV09SRChiKSAgICAgICAgKGIgPj4gNSkKKyNkZWZpbmUgQklUU0VUX0JJVChiKSAgICAgICAgICgxIDw8IChiICYgMzEpKQorI2RlZmluZSBCSVRTRVRfWkVSTyhicykgICAgICAgbWVtc2V0KGJzLCAwLCBzaXplb2YoYnMpKQorI2RlZmluZSBCSVRTRVRfSVNfU0VUKGJzLCBiKSAgKGJzW0JJVFNFVF9XT1JEKGIpXSAmIEJJVFNFVF9CSVQoYikpCisjZGVmaW5lIEJJVFNFVF9TRVQoYnMsIGIpICAgICAoYnNbQklUU0VUX1dPUkQoYildIHw9IEJJVFNFVF9CSVQoYikpCisjZGVmaW5lIEJJVFNFVF9DTFIoYnMsIGIpICAgICAoYnNbQklUU0VUX1dPUkQoYildICY9IH5CSVRTRVRfQklUKGIpKQorCisjaWYgVkNISVFfRU5BQkxFX1NUQVRTCisjZGVmaW5lIFZDSElRX1NUQVRTX0lOQyhzdGF0ZSwgc3RhdCkgKHN0YXRlLT5zdGF0cy4gc3RhdCsrKQorI2RlZmluZSBWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLCBzdGF0KSAoc2VydmljZS0+c3RhdHMuIHN0YXQrKykKKyNkZWZpbmUgVkNISVFfU0VSVklDRV9TVEFUU19BREQoc2VydmljZSwgc3RhdCwgYWRkZW5kKSBcCisJKHNlcnZpY2UtPnN0YXRzLiBzdGF0ICs9IGFkZGVuZCkKKyNlbHNlCisjZGVmaW5lIFZDSElRX1NUQVRTX0lOQyhzdGF0ZSwgc3RhdCkgKCh2b2lkKTApCisjZGVmaW5lIFZDSElRX1NFUlZJQ0VfU1RBVFNfSU5DKHNlcnZpY2UsIHN0YXQpICgodm9pZCkwKQorI2RlZmluZSBWQ0hJUV9TRVJWSUNFX1NUQVRTX0FERChzZXJ2aWNlLCBzdGF0LCBhZGRlbmQpICgodm9pZCkwKQorI2VuZGlmCisKK2VudW0geworCURFQlVHX0VOVFJJRVMsCisjaWYgVkNISVFfRU5BQkxFX0RFQlVHCisJREVCVUdfU0xPVF9IQU5ETEVSX0NPVU5ULAorCURFQlVHX1NMT1RfSEFORExFUl9MSU5FLAorCURFQlVHX1BBUlNFX0xJTkUsCisJREVCVUdfUEFSU0VfSEVBREVSLAorCURFQlVHX1BBUlNFX01TR0lELAorCURFQlVHX0FXQUlUX0NPTVBMRVRJT05fTElORSwKKwlERUJVR19ERVFVRVVFX01FU1NBR0VfTElORSwKKwlERUJVR19TRVJWSUNFX0NBTExCQUNLX0xJTkUsCisJREVCVUdfTVNHX1FVRVVFX0ZVTExfQ09VTlQsCisJREVCVUdfQ09NUExFVElPTl9RVUVVRV9GVUxMX0NPVU5ULAorI2VuZGlmCisJREVCVUdfTUFYCit9OworCisjaWYgVkNISVFfRU5BQkxFX0RFQlVHCisKKyNkZWZpbmUgREVCVUdfSU5JVElBTElTRShsb2NhbCkgaW50ICpkZWJ1Z19wdHIgPSAobG9jYWwpLT5kZWJ1ZzsKKyNkZWZpbmUgREVCVUdfVFJBQ0UoZCkgXAorCWRvIHsgZGVidWdfcHRyW0RFQlVHXyAjIyBkXSA9IF9fTElORV9fOyBkc2IoKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgREVCVUdfVkFMVUUoZCwgdikgXAorCWRvIHsgZGVidWdfcHRyW0RFQlVHXyAjIyBkXSA9ICh2KTsgZHNiKCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIERFQlVHX0NPVU5UKGQpIFwKKwlkbyB7IGRlYnVnX3B0cltERUJVR18gIyMgZF0rKzsgZHNiKCk7IH0gd2hpbGUgKDApCisKKyNlbHNlIC8qIFZDSElRX0VOQUJMRV9ERUJVRyAqLworCisjZGVmaW5lIERFQlVHX0lOSVRJQUxJU0UobG9jYWwpCisjZGVmaW5lIERFQlVHX1RSQUNFKGQpCisjZGVmaW5lIERFQlVHX1ZBTFVFKGQsIHYpCisjZGVmaW5lIERFQlVHX0NPVU5UKGQpCisKKyNlbmRpZiAvKiBWQ0hJUV9FTkFCTEVfREVCVUcgKi8KKwordHlwZWRlZiBlbnVtIHsKKwlWQ0hJUV9DT05OU1RBVEVfRElTQ09OTkVDVEVELAorCVZDSElRX0NPTk5TVEFURV9DT05ORUNUSU5HLAorCVZDSElRX0NPTk5TVEFURV9DT05ORUNURUQsCisJVkNISVFfQ09OTlNUQVRFX1BBVVNJTkcsCisJVkNISVFfQ09OTlNUQVRFX1BBVVNFX1NFTlQsCisJVkNISVFfQ09OTlNUQVRFX1BBVVNFRCwKKwlWQ0hJUV9DT05OU1RBVEVfUkVTVU1JTkcsCisJVkNISVFfQ09OTlNUQVRFX1BBVVNFX1RJTUVPVVQsCisJVkNISVFfQ09OTlNUQVRFX1JFU1VNRV9USU1FT1VUCit9IFZDSElRX0NPTk5TVEFURV9UOworCitlbnVtIHsKKwlWQ0hJUV9TUlZTVEFURV9GUkVFLAorCVZDSElRX1NSVlNUQVRFX0hJRERFTiwKKwlWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcsCisJVkNISVFfU1JWU1RBVEVfT1BFTklORywKKwlWQ0hJUV9TUlZTVEFURV9PUEVOLAorCVZDSElRX1NSVlNUQVRFX09QRU5TWU5DLAorCVZDSElRX1NSVlNUQVRFX0NMT1NFU0VOVCwKKwlWQ0hJUV9TUlZTVEFURV9DTE9TRVJFQ1ZELAorCVZDSElRX1NSVlNUQVRFX0NMT1NFV0FJVCwKKwlWQ0hJUV9TUlZTVEFURV9DTE9TRUQKK307CisKK2VudW0geworCVZDSElRX1BPTExfVEVSTUlOQVRFLAorCVZDSElRX1BPTExfUkVNT1ZFLAorCVZDSElRX1BPTExfVFhOT1RJRlksCisJVkNISVFfUE9MTF9SWE5PVElGWSwKKwlWQ0hJUV9QT0xMX0NPVU5UCit9OworCit0eXBlZGVmIGVudW0geworCVZDSElRX0JVTEtfVFJBTlNNSVQsCisJVkNISVFfQlVMS19SRUNFSVZFCit9IFZDSElRX0JVTEtfRElSX1Q7CisKK3R5cGVkZWYgdm9pZCAoKlZDSElRX1VTRVJEQVRBX1RFUk1fVCkodm9pZCAqdXNlcmRhdGEpOworCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV9idWxrX3N0cnVjdCB7CisJc2hvcnQgbW9kZTsKKwlzaG9ydCBkaXI7CisJdm9pZCAqdXNlcmRhdGE7CisJVkNISV9NRU1fSEFORExFX1QgaGFuZGxlOworCXZvaWQgKmRhdGE7CisJaW50IHNpemU7CisJdm9pZCAqcmVtb3RlX2RhdGE7CisJaW50IHJlbW90ZV9zaXplOworCWludCBhY3R1YWw7Cit9IFZDSElRX0JVTEtfVDsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfYnVsa19xdWV1ZV9zdHJ1Y3QgeworCWludCBsb2NhbF9pbnNlcnQ7ICAvKiBXaGVyZSB0byBpbnNlcnQgdGhlIG5leHQgbG9jYWwgYnVsayAqLworCWludCByZW1vdGVfaW5zZXJ0OyAvKiBXaGVyZSB0byBpbnNlcnQgdGhlIG5leHQgcmVtb3RlIGJ1bGsgKG1hc3RlcikgKi8KKwlpbnQgcHJvY2VzczsgICAgICAgLyogQnVsayB0byB0cmFuc2ZlciBuZXh0ICovCisJaW50IHJlbW90ZV9ub3RpZnk7IC8qIEJ1bGsgdG8gbm90aWZ5IHRoZSByZW1vdGUgY2xpZW50IG9mIG5leHQgKG1zdHIpICovCisJaW50IHJlbW92ZTsgICAgICAgIC8qIEJ1bGsgdG8gbm90aWZ5IHRoZSBsb2NhbCBjbGllbnQgb2YsIGFuZCByZW1vdmUsCisJCQkgICAqKiBuZXh0ICovCisJVkNISVFfQlVMS19UIGJ1bGtzW1ZDSElRX05VTV9TRVJWSUNFX0JVTEtTXTsKK30gVkNISVFfQlVMS19RVUVVRV9UOworCit0eXBlZGVmIHN0cnVjdCByZW1vdGVfZXZlbnRfc3RydWN0IHsKKwlpbnQgYXJtZWQ7CisJaW50IGZpcmVkOworCXN0cnVjdCBzZW1hcGhvcmUgKmV2ZW50OworfSBSRU1PVEVfRVZFTlRfVDsKKwordHlwZWRlZiBzdHJ1Y3Qgb3BhcXVlX3BsYXRmb3JtX3N0YXRlX3QgKlZDSElRX1BMQVRGT1JNX1NUQVRFX1Q7CisKK3R5cGVkZWYgc3RydWN0IHZjaGlxX3N0YXRlX3N0cnVjdCBWQ0hJUV9TVEFURV9UOworCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV9zbG90X3N0cnVjdCB7CisJY2hhciBkYXRhW1ZDSElRX1NMT1RfU0laRV07Cit9IFZDSElRX1NMT1RfVDsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfc2xvdF9pbmZvX3N0cnVjdCB7CisJLyogVXNlIHR3byBjb3VudGVycyByYXRoZXIgdGhhbiBvbmUgdG8gYXZvaWQgdGhlIG5lZWQgZm9yIGEgbXV0ZXguICovCisJc2hvcnQgdXNlX2NvdW50OworCXNob3J0IHJlbGVhc2VfY291bnQ7Cit9IFZDSElRX1NMT1RfSU5GT19UOworCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV9zZXJ2aWNlX3N0cnVjdCB7CisJVkNISVFfU0VSVklDRV9CQVNFX1QgYmFzZTsKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZTsKKwl1bnNpZ25lZCBpbnQgcmVmX2NvdW50OworCWludCBzcnZzdGF0ZTsKKwlWQ0hJUV9VU0VSREFUQV9URVJNX1QgdXNlcmRhdGFfdGVybTsKKwl1bnNpZ25lZCBpbnQgbG9jYWxwb3J0OworCXVuc2lnbmVkIGludCByZW1vdGVwb3J0OworCWludCBwdWJsaWNfZm91cmNjOworCWludCBjbGllbnRfaWQ7CisJY2hhciBhdXRvX2Nsb3NlOworCWNoYXIgc3luYzsKKwljaGFyIGNsb3Npbmc7CisJY2hhciB0cmFjZTsKKwlhdG9taWNfdCBwb2xsX2ZsYWdzOworCXNob3J0IHZlcnNpb247CisJc2hvcnQgdmVyc2lvbl9taW47CisJc2hvcnQgcGVlcl92ZXJzaW9uOworCisJVkNISVFfU1RBVEVfVCAqc3RhdGU7CisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZTsKKworCWludCBzZXJ2aWNlX3VzZV9jb3VudDsKKworCVZDSElRX0JVTEtfUVVFVUVfVCBidWxrX3R4OworCVZDSElRX0JVTEtfUVVFVUVfVCBidWxrX3J4OworCisJc3RydWN0IHNlbWFwaG9yZSByZW1vdmVfZXZlbnQ7CisJc3RydWN0IHNlbWFwaG9yZSBidWxrX3JlbW92ZV9ldmVudDsKKwlzdHJ1Y3QgbXV0ZXggYnVsa19tdXRleDsKKworCXN0cnVjdCBzZXJ2aWNlX3N0YXRzX3N0cnVjdCB7CisJCWludCBxdW90YV9zdGFsbHM7CisJCWludCBzbG90X3N0YWxsczsKKwkJaW50IGJ1bGtfc3RhbGxzOworCQlpbnQgZXJyb3JfY291bnQ7CisJCWludCBjdHJsX3R4X2NvdW50OworCQlpbnQgY3RybF9yeF9jb3VudDsKKwkJaW50IGJ1bGtfdHhfY291bnQ7CisJCWludCBidWxrX3J4X2NvdW50OworCQlpbnQgYnVsa19hYm9ydGVkX2NvdW50OworCQl1aW50NjRfdCBjdHJsX3R4X2J5dGVzOworCQl1aW50NjRfdCBjdHJsX3J4X2J5dGVzOworCQl1aW50NjRfdCBidWxrX3R4X2J5dGVzOworCQl1aW50NjRfdCBidWxrX3J4X2J5dGVzOworCX0gc3RhdHM7Cit9IFZDSElRX1NFUlZJQ0VfVDsKKworLyogVGhlIHF1b3RhIGluZm9ybWF0aW9uIGlzIG91dHNpZGUgVkNISVFfU0VSVklDRV9UIHNvIHRoYXQgaXQgY2FuIGJlCisJc3RhdGljYWxseSBhbGxvY2F0ZWQsIHNpbmNlIGZvciBhY2NvdW50aW5nIHJlYXNvbnMgYSBzZXJ2aWNlJ3Mgc2xvdAorCXVzYWdlIGlzIGNhcnJpZWQgb3ZlciBiZXR3ZWVuIHVzZXJzIG9mIHRoZSBzYW1lIHBvcnQgbnVtYmVyLgorICovCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV9zZXJ2aWNlX3F1b3RhX3N0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgc2xvdF9xdW90YTsKKwl1bnNpZ25lZCBzaG9ydCBzbG90X3VzZV9jb3VudDsKKwl1bnNpZ25lZCBzaG9ydCBtZXNzYWdlX3F1b3RhOworCXVuc2lnbmVkIHNob3J0IG1lc3NhZ2VfdXNlX2NvdW50OworCXN0cnVjdCBzZW1hcGhvcmUgcXVvdGFfZXZlbnQ7CisJaW50IHByZXZpb3VzX3R4X2luZGV4OworfSBWQ0hJUV9TRVJWSUNFX1FVT1RBX1Q7CisKK3R5cGVkZWYgc3RydWN0IHZjaGlxX3NoYXJlZF9zdGF0ZV9zdHJ1Y3QgeworCisJLyogQSBub24temVybyB2YWx1ZSBoZXJlIGluZGljYXRlcyB0aGF0IHRoZSBjb250ZW50IGlzIHZhbGlkLiAqLworCWludCBpbml0aWFsaXNlZDsKKworCS8qIFRoZSBmaXJzdCBhbmQgbGFzdCAoaW5jbHVzaXZlKSBzbG90cyBhbGxvY2F0ZWQgdG8gdGhlIG93bmVyLiAqLworCWludCBzbG90X2ZpcnN0OworCWludCBzbG90X2xhc3Q7CisKKwkvKiBUaGUgc2xvdCBhbGxvY2F0ZWQgdG8gc3luY2hyb25vdXMgbWVzc2FnZXMgZnJvbSB0aGUgb3duZXIuICovCisJaW50IHNsb3Rfc3luYzsKKworCS8qIFNpZ25hbGxpbmcgdGhpcyBldmVudCBpbmRpY2F0ZXMgdGhhdCBvd25lcidzIHNsb3QgaGFuZGxlciB0aHJlYWQKKwkqKiBzaG91bGQgcnVuLiAqLworCVJFTU9URV9FVkVOVF9UIHRyaWdnZXI7CisKKwkvKiBJbmRpY2F0ZXMgdGhlIGJ5dGUgcG9zaXRpb24gd2l0aGluIHRoZSBzdHJlYW0gd2hlcmUgdGhlIG5leHQgbWVzc2FnZQorCSoqIHdpbGwgYmUgd3JpdHRlbi4gVGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgYXJlIGFuIGluZGV4IGludG8gdGhlCisJKiogc2xvdC4gVGhlIG5leHQgYml0cyBhcmUgdGhlIGluZGV4IG9mIHRoZSBzbG90IGluIHNsb3RfcXVldWUuICovCisJaW50IHR4X3BvczsKKworCS8qIFRoaXMgZXZlbnQgc2hvdWxkIGJlIHNpZ25hbGxlZCB3aGVuIGEgc2xvdCBpcyByZWN5Y2xlZC4gKi8KKwlSRU1PVEVfRVZFTlRfVCByZWN5Y2xlOworCisJLyogVGhlIHNsb3RfcXVldWUgaW5kZXggd2hlcmUgdGhlIG5leHQgcmVjeWNsZWQgc2xvdCB3aWxsIGJlIHdyaXR0ZW4uICovCisJaW50IHNsb3RfcXVldWVfcmVjeWNsZTsKKworCS8qIFRoaXMgZXZlbnQgc2hvdWxkIGJlIHNpZ25hbGxlZCB3aGVuIGEgc3luY2hyb25vdXMgbWVzc2FnZSBpcyBzZW50LiAqLworCVJFTU9URV9FVkVOVF9UIHN5bmNfdHJpZ2dlcjsKKworCS8qIFRoaXMgZXZlbnQgc2hvdWxkIGJlIHNpZ25hbGxlZCB3aGVuIGEgc3luY2hyb25vdXMgbWVzc2FnZSBoYXMgYmVlbgorCSoqIHJlbGVhc2VkLiAqLworCVJFTU9URV9FVkVOVF9UIHN5bmNfcmVsZWFzZTsKKworCS8qIEEgY2lyY3VsYXIgYnVmZmVyIG9mIHNsb3QgaW5kZXhlcy4gKi8KKwlpbnQgc2xvdF9xdWV1ZVtWQ0hJUV9NQVhfU0xPVFNfUEVSX1NJREVdOworCisJLyogRGVidWdnaW5nIHN0YXRlICovCisJaW50IGRlYnVnW0RFQlVHX01BWF07Cit9IFZDSElRX1NIQVJFRF9TVEFURV9UOworCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV9zbG90X3plcm9fc3RydWN0IHsKKwlpbnQgbWFnaWM7CisJc2hvcnQgdmVyc2lvbjsKKwlzaG9ydCB2ZXJzaW9uX21pbjsKKwlpbnQgc2xvdF96ZXJvX3NpemU7CisJaW50IHNsb3Rfc2l6ZTsKKwlpbnQgbWF4X3Nsb3RzOworCWludCBtYXhfc2xvdHNfcGVyX3NpZGU7CisJaW50IHBsYXRmb3JtX2RhdGFbMl07CisJVkNISVFfU0hBUkVEX1NUQVRFX1QgbWFzdGVyOworCVZDSElRX1NIQVJFRF9TVEFURV9UIHNsYXZlOworCVZDSElRX1NMT1RfSU5GT19UIHNsb3RzW1ZDSElRX01BWF9TTE9UU107Cit9IFZDSElRX1NMT1RfWkVST19UOworCitzdHJ1Y3QgdmNoaXFfc3RhdGVfc3RydWN0IHsKKwlpbnQgaWQ7CisJaW50IGluaXRpYWxpc2VkOworCVZDSElRX0NPTk5TVEFURV9UIGNvbm5fc3RhdGU7CisJaW50IGlzX21hc3RlcjsKKwlzaG9ydCB2ZXJzaW9uX2NvbW1vbjsKKworCVZDSElRX1NIQVJFRF9TVEFURV9UICpsb2NhbDsKKwlWQ0hJUV9TSEFSRURfU1RBVEVfVCAqcmVtb3RlOworCVZDSElRX1NMT1RfVCAqc2xvdF9kYXRhOworCisJdW5zaWduZWQgc2hvcnQgZGVmYXVsdF9zbG90X3F1b3RhOworCXVuc2lnbmVkIHNob3J0IGRlZmF1bHRfbWVzc2FnZV9xdW90YTsKKworCS8qIEV2ZW50IGluZGljYXRpbmcgY29ubmVjdCBtZXNzYWdlIHJlY2VpdmVkICovCisJc3RydWN0IHNlbWFwaG9yZSBjb25uZWN0OworCisJLyogTXV0ZXggcHJvdGVjdGluZyBzZXJ2aWNlcyAqLworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlWQ0hJUV9JTlNUQU5DRV9UICppbnN0YW5jZTsKKworCS8qIFByb2Nlc3NlcyBpbmNvbWluZyBtZXNzYWdlcyAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqc2xvdF9oYW5kbGVyX3RocmVhZDsKKworCS8qIFByb2Nlc3NlcyByZWN5Y2xlZCBzbG90cyAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcmVjeWNsZV90aHJlYWQ7CisKKwkvKiBQcm9jZXNzZXMgc3luY2hyb25vdXMgbWVzc2FnZXMgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnN5bmNfdGhyZWFkOworCisJLyogTG9jYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRyaWdnZXIgcmVtb3RlIGV2ZW50ICovCisJc3RydWN0IHNlbWFwaG9yZSB0cmlnZ2VyX2V2ZW50OworCisJLyogTG9jYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlY3ljbGUgcmVtb3RlIGV2ZW50ICovCisJc3RydWN0IHNlbWFwaG9yZSByZWN5Y2xlX2V2ZW50OworCisJLyogTG9jYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN5bmMgdHJpZ2dlciByZW1vdGUgZXZlbnQgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIHN5bmNfdHJpZ2dlcl9ldmVudDsKKworCS8qIExvY2FsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzeW5jIHJlbGVhc2UgcmVtb3RlIGV2ZW50ICovCisJc3RydWN0IHNlbWFwaG9yZSBzeW5jX3JlbGVhc2VfZXZlbnQ7CisKKwljaGFyICp0eF9kYXRhOworCWNoYXIgKnJ4X2RhdGE7CisJVkNISVFfU0xPVF9JTkZPX1QgKnJ4X2luZm87CisKKwlzdHJ1Y3QgbXV0ZXggc2xvdF9tdXRleDsKKworCXN0cnVjdCBtdXRleCByZWN5Y2xlX211dGV4OworCisJc3RydWN0IG11dGV4IHN5bmNfbXV0ZXg7CisKKwlzdHJ1Y3QgbXV0ZXggYnVsa190cmFuc2Zlcl9tdXRleDsKKworCS8qIEluZGljYXRlcyB0aGUgYnl0ZSBwb3NpdGlvbiB3aXRoaW4gdGhlIHN0cmVhbSBmcm9tIHdoZXJlIHRoZSBuZXh0CisJKiogbWVzc2FnZSB3aWxsIGJlIHJlYWQuIFRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGFyZSBhbiBpbmRleCBpbnRvCisJKiogdGhlIHNsb3QuVGhlIG5leHQgYml0cyBhcmUgdGhlIGluZGV4IG9mIHRoZSBzbG90IGluCisJKiogcmVtb3RlLT5zbG90X3F1ZXVlLiAqLworCWludCByeF9wb3M7CisKKwkvKiBBIGNhY2hlZCBjb3B5IG9mIGxvY2FsLT50eF9wb3MuIE9ubHkgd3JpdGUgdG8gbG9jYWwtPnR4X3BvcywgYW5kIHJlYWQKKwkJZnJvbSByZW1vdGUtPnR4X3Bvcy4gKi8KKwlpbnQgbG9jYWxfdHhfcG9zOworCisJLyogVGhlIHNsb3RfcXVldWUgaW5kZXggb2YgdGhlIHNsb3QgdG8gYmVjb21lIGF2YWlsYWJsZSBuZXh0LiAqLworCWludCBzbG90X3F1ZXVlX2F2YWlsYWJsZTsKKworCS8qIEEgZmxhZyB0byBpbmRpY2F0ZSBpZiBhbnkgcG9sbCBoYXMgYmVlbiByZXF1ZXN0ZWQgKi8KKwlpbnQgcG9sbF9uZWVkZWQ7CisKKwkvKiBUaHMgaW5kZXggb2YgdGhlIHByZXZpb3VzIHNsb3QgdXNlZCBmb3IgZGF0YSBtZXNzYWdlcy4gKi8KKwlpbnQgcHJldmlvdXNfZGF0YV9pbmRleDsKKworCS8qIFRoZSBudW1iZXIgb2Ygc2xvdHMgb2NjdXBpZWQgYnkgZGF0YSBtZXNzYWdlcy4gKi8KKwl1bnNpZ25lZCBzaG9ydCBkYXRhX3VzZV9jb3VudDsKKworCS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzbG90cyB0byBiZSBvY2N1cGllZCBieSBkYXRhIG1lc3NhZ2VzLiAqLworCXVuc2lnbmVkIHNob3J0IGRhdGFfcXVvdGE7CisKKwkvKiBBbiBhcnJheSBvZiBiaXQgc2V0cyBpbmRpY2F0aW5nIHdoaWNoIHNlcnZpY2VzIG11c3QgYmUgcG9sbGVkLiAqLworCWF0b21pY190IHBvbGxfc2VydmljZXNbQklUU0VUX1NJWkUoVkNISVFfTUFYX1NFUlZJQ0VTKV07CisKKwkvKiBUaGUgbnVtYmVyIG9mIHRoZSBmaXJzdCB1bnVzZWQgc2VydmljZSAqLworCWludCB1bnVzZWRfc2VydmljZTsKKworCS8qIFNpZ25hbGxlZCB3aGVuIGEgZnJlZSBzbG90IGJlY29tZXMgYXZhaWxhYmxlLiAqLworCXN0cnVjdCBzZW1hcGhvcmUgc2xvdF9hdmFpbGFibGVfZXZlbnQ7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNsb3RfcmVtb3ZlX2V2ZW50OworCisJLyogU2lnbmFsbGVkIHdoZW4gYSBmcmVlIGRhdGEgc2xvdCBiZWNvbWVzIGF2YWlsYWJsZS4gKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIGRhdGFfcXVvdGFfZXZlbnQ7CisKKwkvKiBJbmNyZW1lbnRlZCB3aGVuIHRoZXJlIGFyZSBidWxrIHRyYW5zZmVycyB3aGljaCBjYW5ub3QgYmUgcHJvY2Vzc2VkCisJICogd2hpbHN0IHBhdXNlZCBhbmQgbXVzdCBiZSBwcm9jZXNzZWQgb24gcmVzdW1lICovCisJaW50IGRlZmVycmVkX2J1bGtzOworCisJc3RydWN0IHN0YXRlX3N0YXRzX3N0cnVjdCB7CisJCWludCBzbG90X3N0YWxsczsKKwkJaW50IGRhdGFfc3RhbGxzOworCQlpbnQgY3RybF90eF9jb3VudDsKKwkJaW50IGN0cmxfcnhfY291bnQ7CisJCWludCBlcnJvcl9jb3VudDsKKwl9IHN0YXRzOworCisJVkNISVFfU0VSVklDRV9UICogc2VydmljZXNbVkNISVFfTUFYX1NFUlZJQ0VTXTsKKwlWQ0hJUV9TRVJWSUNFX1FVT1RBX1Qgc2VydmljZV9xdW90YXNbVkNISVFfTUFYX1NFUlZJQ0VTXTsKKwlWQ0hJUV9TTE9UX0lORk9fVCBzbG90X2luZm9bVkNISVFfTUFYX1NMT1RTXTsKKworCVZDSElRX1BMQVRGT1JNX1NUQVRFX1QgcGxhdGZvcm1fc3RhdGU7Cit9OworCitzdHJ1Y3QgYnVsa193YWl0ZXIgeworCVZDSElRX0JVTEtfVCAqYnVsazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGV2ZW50OworCWludCBhY3R1YWw7Cit9OworCitleHRlcm4gc3BpbmxvY2tfdCBidWxrX3dhaXRlcl9zcGlubG9jazsKKworZXh0ZXJuIGludCB2Y2hpcV9jb3JlX2xvZ19sZXZlbDsKK2V4dGVybiBpbnQgdmNoaXFfY29yZV9tc2dfbG9nX2xldmVsOworZXh0ZXJuIGludCB2Y2hpcV9zeW5jX2xvZ19sZXZlbDsKKworZXh0ZXJuIFZDSElRX1NUQVRFX1QgKnZjaGlxX3N0YXRlc1tWQ0hJUV9NQVhfU1RBVEVTXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKgorZ2V0X2Nvbm5fc3RhdGVfbmFtZShWQ0hJUV9DT05OU1RBVEVfVCBjb25uX3N0YXRlKTsKKworZXh0ZXJuIFZDSElRX1NMT1RfWkVST19UICoKK3ZjaGlxX2luaXRfc2xvdHModm9pZCAqbWVtX2Jhc2UsIGludCBtZW1fc2l6ZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfaW5pdF9zdGF0ZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfU0xPVF9aRVJPX1QgKnNsb3RfemVybywKKwlpbnQgaXNfbWFzdGVyKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9jb25uZWN0X2ludGVybmFsKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKTsKKworZXh0ZXJuIFZDSElRX1NFUlZJQ0VfVCAqCit2Y2hpcV9hZGRfc2VydmljZV9pbnRlcm5hbChWQ0hJUV9TVEFURV9UICpzdGF0ZSwKKwljb25zdCBWQ0hJUV9TRVJWSUNFX1BBUkFNU19UICpwYXJhbXMsIGludCBzcnZzdGF0ZSwKKwlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlLCBWQ0hJUV9VU0VSREFUQV9URVJNX1QgdXNlcmRhdGFfdGVybSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfb3Blbl9zZXJ2aWNlX2ludGVybmFsKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSwgaW50IGNsaWVudF9pZCk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfY2xvc2Vfc2VydmljZV9pbnRlcm5hbChWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIGludCBjbG9zZV9yZWN2ZCk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV90ZXJtaW5hdGVfc2VydmljZV9pbnRlcm5hbChWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpOworCitleHRlcm4gdm9pZAordmNoaXFfZnJlZV9zZXJ2aWNlX2ludGVybmFsKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfc2h1dGRvd25faW50ZXJuYWwoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3BhdXNlX2ludGVybmFsKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9yZXN1bWVfaW50ZXJuYWwoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gdm9pZAorcmVtb3RlX2V2ZW50X3BvbGxhbGwoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2J1bGtfdHJhbnNmZXIoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisJVkNISV9NRU1fSEFORExFX1QgbWVtaGFuZGxlLCB2b2lkICpvZmZzZXQsIGludCBzaXplLCB2b2lkICp1c2VyZGF0YSwKKwlWQ0hJUV9CVUxLX01PREVfVCBtb2RlLCBWQ0hJUV9CVUxLX0RJUl9UIGRpcik7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9kdW1wX3N0YXRlKHZvaWQgKmR1bXBfY29udGV4dCwgVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gdm9pZAordmNoaXFfZHVtcF9zZXJ2aWNlX3N0YXRlKHZvaWQgKmR1bXBfY29udGV4dCwgVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX2xvdWRfZXJyb3JfaGVhZGVyKHZvaWQpOworCitleHRlcm4gdm9pZAordmNoaXFfbG91ZF9lcnJvcl9mb290ZXIodm9pZCk7CisKK2V4dGVybiB2b2lkCityZXF1ZXN0X3BvbGwoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSwgaW50IHBvbGxfdHlwZSk7CisKK3N0YXRpYyBpbmxpbmUgVkNISVFfU0VSVklDRV9UICoKK2hhbmRsZV90b19zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKQoreworCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gdmNoaXFfc3RhdGVzWyhoYW5kbGUgLyBWQ0hJUV9NQVhfU0VSVklDRVMpICYKKwkJKFZDSElRX01BWF9TVEFURVMgLSAxKV07CisJaWYgKCFzdGF0ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gc3RhdGUtPnNlcnZpY2VzW2hhbmRsZSAmIChWQ0hJUV9NQVhfU0VSVklDRVMgLSAxKV07Cit9CisKK2V4dGVybiBWQ0hJUV9TRVJWSUNFX1QgKgorZmluZF9zZXJ2aWNlX2J5X2hhbmRsZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSk7CisKK2V4dGVybiBWQ0hJUV9TRVJWSUNFX1QgKgorZmluZF9zZXJ2aWNlX2J5X3BvcnQoVkNISVFfU1RBVEVfVCAqc3RhdGUsIGludCBsb2NhbHBvcnQpOworCitleHRlcm4gVkNISVFfU0VSVklDRV9UICoKK2ZpbmRfc2VydmljZV9mb3JfaW5zdGFuY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSk7CisKK2V4dGVybiBWQ0hJUV9TRVJWSUNFX1QgKgorZmluZF9jbG9zZWRfc2VydmljZV9mb3JfaW5zdGFuY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSk7CisKK2V4dGVybiBWQ0hJUV9TRVJWSUNFX1QgKgorbmV4dF9zZXJ2aWNlX2J5X2luc3RhbmNlKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlLAorCWludCAqcGlkeCk7CisKK2V4dGVybiB2b2lkCitsb2NrX3NlcnZpY2UoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKTsKKworZXh0ZXJuIHZvaWQKK3VubG9ja19zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSk7CisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBjYWxsZWQgZnJvbSB2Y2hpcV9jb3JlLCBhbmQgZXh0ZXJuYWwKKyoqIGltcGxlbWVudGF0aW9ucyBtdXN0IGJlIHByb3ZpZGVkLiAqLworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3ByZXBhcmVfYnVsa19kYXRhKFZDSElRX0JVTEtfVCAqYnVsaywKKwlWQ0hJX01FTV9IQU5ETEVfVCBtZW1oYW5kbGUsIHZvaWQgKm9mZnNldCwgaW50IHNpemUsIGludCBkaXIpOworCitleHRlcm4gdm9pZAordmNoaXFfdHJhbnNmZXJfYnVsayhWQ0hJUV9CVUxLX1QgKmJ1bGspOworCitleHRlcm4gdm9pZAordmNoaXFfY29tcGxldGVfYnVsayhWQ0hJUV9CVUxLX1QgKmJ1bGspOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2NvcHlfZnJvbV91c2VyKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBpbnQgc2l6ZSk7CisKK2V4dGVybiB2b2lkCityZW1vdGVfZXZlbnRfc2lnbmFsKFJFTU9URV9FVkVOVF9UICpldmVudCk7CisKK3ZvaWQKK3ZjaGlxX3BsYXRmb3JtX2NoZWNrX3N1c3BlbmQoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gdm9pZAordmNoaXFfcGxhdGZvcm1fcGF1c2VkKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9wbGF0Zm9ybV9yZXN1bWUoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gdm9pZAordmNoaXFfcGxhdGZvcm1fcmVzdW1lZChWQ0hJUV9TVEFURV9UICpzdGF0ZSk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9kdW1wKHZvaWQgKmR1bXBfY29udGV4dCwgY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX2R1bXBfcGxhdGZvcm1fc3RhdGUodm9pZCAqZHVtcF9jb250ZXh0KTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX2R1bXBfcGxhdGZvcm1faW5zdGFuY2VzKHZvaWQgKmR1bXBfY29udGV4dCk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9kdW1wX3BsYXRmb3JtX3NlcnZpY2Vfc3RhdGUodm9pZCAqZHVtcF9jb250ZXh0LAorCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfdXNlX3NlcnZpY2VfaW50ZXJuYWwoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9yZWxlYXNlX3NlcnZpY2VfaW50ZXJuYWwoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX29uX3JlbW90ZV91c2UoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gdm9pZAordmNoaXFfb25fcmVtb3RlX3JlbGVhc2UoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3BsYXRmb3JtX2luaXRfc3RhdGUoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2NoZWNrX3NlcnZpY2UoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX29uX3JlbW90ZV91c2VfYWN0aXZlKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9zZW5kX3JlbW90ZV91c2UoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3NlbmRfcmVtb3RlX3JlbGVhc2UoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3NlbmRfcmVtb3RlX3VzZV9hY3RpdmUoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gdm9pZAordmNoaXFfcGxhdGZvcm1fY29ubl9zdGF0ZV9jaGFuZ2VkKFZDSElRX1NUQVRFX1QgKnN0YXRlLAorCVZDSElRX0NPTk5TVEFURV9UIG9sZHN0YXRlLCBWQ0hJUV9DT05OU1RBVEVfVCBuZXdzdGF0ZSk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9wbGF0Zm9ybV9oYW5kbGVfdGltZW91dChWQ0hJUV9TVEFURV9UICpzdGF0ZSk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9zZXRfY29ubl9zdGF0ZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfQ09OTlNUQVRFX1QgbmV3c3RhdGUpOworCisKK2V4dGVybiB2b2lkCit2Y2hpcV9sb2dfZHVtcF9tZW0oY29uc3QgY2hhciAqbGFiZWwsIHVpbnQzMl90IGFkZHIsIGNvbnN0IHZvaWQgKnZvaWRNZW0sCisJc2l6ZV90IG51bUJ5dGVzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2RlYnVnZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfZGVidWdmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMDMyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2RlYnVnZnMuYwpAQCAtMCwwICsxLDM4MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgUmFzcGJlcnJ5IFBpIChUcmFkaW5nKSBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgInZjaGlxX2NvcmUuaCIKKyNpbmNsdWRlICJ2Y2hpcV9hcm0uaCIKKyNpbmNsdWRlICJ2Y2hpcV9kZWJ1Z2ZzLmgiCisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBsb2cgY2F0ZWdvcnkgZW50cmllcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBERUJVR0ZTX1dSSVRFX0JVRl9TSVpFIDI1NgorCisjZGVmaW5lIFZDSElRX0xPR19FUlJPUl9TVFIgICAiZXJyb3IiCisjZGVmaW5lIFZDSElRX0xPR19XQVJOSU5HX1NUUiAid2FybmluZyIKKyNkZWZpbmUgVkNISVFfTE9HX0lORk9fU1RSICAgICJpbmZvIgorI2RlZmluZSBWQ0hJUV9MT0dfVFJBQ0VfU1RSICAgInRyYWNlIgorCisKKy8qIFRvcC1sZXZlbCBkZWJ1ZyBpbmZvICovCitzdHJ1Y3QgdmNoaXFfZGVidWdmc19pbmZvIHsKKwkvKiBHbG9iYWwgJ3ZjaGlxJyBkZWJ1Z2ZzIGVudHJ5IHVzZWQgYnkgYWxsIGluc3RhbmNlcyAqLworCXN0cnVjdCBkZW50cnkgKnZjaGlxX2NmZ19kaXI7CisKKwkvKiBvbmUgZW50cnkgcGVyIGNsaWVudCBwcm9jZXNzICovCisJc3RydWN0IGRlbnRyeSAqY2xpZW50czsKKworCS8qIGxvZyBjYXRlZ29yaWVzICovCisJc3RydWN0IGRlbnRyeSAqbG9nX2NhdGVnb3JpZXM7Cit9OworCitzdGF0aWMgc3RydWN0IHZjaGlxX2RlYnVnZnNfaW5mbyBkZWJ1Z2ZzX2luZm87CisKKy8qIExvZyBjYXRlZ29yeSBkZWJ1Z2ZzIGVudHJpZXMgKi8KK3N0cnVjdCB2Y2hpcV9kZWJ1Z2ZzX2xvZ19lbnRyeSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKnBsZXZlbDsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXI7Cit9OworCitzdGF0aWMgc3RydWN0IHZjaGlxX2RlYnVnZnNfbG9nX2VudHJ5IHZjaGlxX2RlYnVnZnNfbG9nX2VudHJpZXNbXSA9IHsKKwl7ICJjb3JlIiwgJnZjaGlxX2NvcmVfbG9nX2xldmVsIH0sCisJeyAibXNnIiwgICZ2Y2hpcV9jb3JlX21zZ19sb2dfbGV2ZWwgfSwKKwl7ICJzeW5jIiwgJnZjaGlxX3N5bmNfbG9nX2xldmVsIH0sCisJeyAic3VzcCIsICZ2Y2hpcV9zdXNwX2xvZ19sZXZlbCB9LAorCXsgImFybSIsICAmdmNoaXFfYXJtX2xvZ19sZXZlbCB9LAorfTsKK3N0YXRpYyBpbnQgbl9sb2dfZW50cmllcyA9CisJc2l6ZW9mKHZjaGlxX2RlYnVnZnNfbG9nX2VudHJpZXMpL3NpemVvZih2Y2hpcV9kZWJ1Z2ZzX2xvZ19lbnRyaWVzWzBdKTsKKworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqdmNoaXFfY2xpZW50c190b3Aodm9pZCk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqdmNoaXFfZGVidWdmc190b3Aodm9pZCk7CisKK3N0YXRpYyBpbnQgZGVidWdmc19sb2dfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKm9mZnNldCkKK3sKKwlpbnQgKmxldnAgPSBmLT5wcml2YXRlOworCWNoYXIgKmxvZ192YWx1ZSA9IE5VTEw7CisKKwlzd2l0Y2ggKCpsZXZwKSB7CisJY2FzZSBWQ0hJUV9MT0dfRVJST1I6CisJCWxvZ192YWx1ZSA9IFZDSElRX0xPR19FUlJPUl9TVFI7CisJCWJyZWFrOworCWNhc2UgVkNISVFfTE9HX1dBUk5JTkc6CisJCWxvZ192YWx1ZSA9IFZDSElRX0xPR19XQVJOSU5HX1NUUjsKKwkJYnJlYWs7CisJY2FzZSBWQ0hJUV9MT0dfSU5GTzoKKwkJbG9nX3ZhbHVlID0gVkNISVFfTE9HX0lORk9fU1RSOworCQlicmVhazsKKwljYXNlIFZDSElRX0xPR19UUkFDRToKKwkJbG9nX3ZhbHVlID0gVkNISVFfTE9HX1RSQUNFX1NUUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJc2VxX3ByaW50ZihmLCAiJXNcbiIsIGxvZ192YWx1ZSA/IGxvZ192YWx1ZSA6ICIobnVsbCkiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlYnVnZnNfbG9nX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGRlYnVnZnNfbG9nX3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgaW50IGRlYnVnZnNfbG9nX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCWNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHNlcV9maWxlICpmID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgKmxldnAgPSBmLT5wcml2YXRlOworCWNoYXIga2J1ZltERUJVR0ZTX1dSSVRFX0JVRl9TSVpFICsgMV07CisKKwltZW1zZXQoa2J1ZiwgMCwgREVCVUdGU19XUklURV9CVUZfU0laRSArIDEpOworCWlmIChjb3VudCA+PSBERUJVR0ZTX1dSSVRFX0JVRl9TSVpFKQorCQljb3VudCA9IERFQlVHRlNfV1JJVEVfQlVGX1NJWkU7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoa2J1ZiwgYnVmZmVyLCBjb3VudCkgIT0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJa2J1Zltjb3VudCAtIDFdID0gMDsKKworCWlmIChzdHJuY21wKCJlcnJvciIsIGtidWYsIHN0cmxlbigiZXJyb3IiKSkgPT0gMCkKKwkJKmxldnAgPSBWQ0hJUV9MT0dfRVJST1I7CisJZWxzZSBpZiAoc3RybmNtcCgid2FybmluZyIsIGtidWYsIHN0cmxlbigid2FybmluZyIpKSA9PSAwKQorCQkqbGV2cCA9IFZDSElRX0xPR19XQVJOSU5HOworCWVsc2UgaWYgKHN0cm5jbXAoImluZm8iLCBrYnVmLCBzdHJsZW4oImluZm8iKSkgPT0gMCkKKwkJKmxldnAgPSBWQ0hJUV9MT0dfSU5GTzsKKwllbHNlIGlmIChzdHJuY21wKCJ0cmFjZSIsIGtidWYsIHN0cmxlbigidHJhY2UiKSkgPT0gMCkKKwkJKmxldnAgPSBWQ0hJUV9MT0dfVFJBQ0U7CisJZWxzZQorCQkqbGV2cCA9IFZDSElRX0xPR19ERUZBVUxUOworCisJKnBwb3MgKz0gY291bnQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnZnNfbG9nX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGRlYnVnZnNfbG9nX29wZW4sCisJLndyaXRlCQk9IGRlYnVnZnNfbG9nX3dyaXRlLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCisvKiBjcmVhdGUgYW4gZW50cnkgdW5kZXIgPGRlYnVnZnM+L3ZjaGlxL2xvZyBmb3IgZWFjaCBsb2cgY2F0ZWdvcnkgKi8KK3N0YXRpYyBpbnQgdmNoaXFfZGVidWdmc19jcmVhdGVfbG9nX2VudHJpZXMoc3RydWN0IGRlbnRyeSAqdG9wKQoreworCXN0cnVjdCBkZW50cnkgKmRpcjsKKwlzaXplX3QgaTsKKwlpbnQgcmV0ID0gMDsKKwlkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImxvZyIsIHZjaGlxX2RlYnVnZnNfdG9wKCkpOworCWlmICghZGlyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkZWJ1Z2ZzX2luZm8ubG9nX2NhdGVnb3JpZXMgPSBkaXI7CisKKwlmb3IgKGkgPSAwOyBpIDwgbl9sb2dfZW50cmllczsgaSsrKSB7CisJCXZvaWQgKmxldnAgPSAodm9pZCAqKXZjaGlxX2RlYnVnZnNfbG9nX2VudHJpZXNbaV0ucGxldmVsOworCQlkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKHZjaGlxX2RlYnVnZnNfbG9nX2VudHJpZXNbaV0ubmFtZSwKKwkJCQkJICAwNjQ0LAorCQkJCQkgIGRlYnVnZnNfaW5mby5sb2dfY2F0ZWdvcmllcywKKwkJCQkJICBsZXZwLAorCQkJCQkgICZkZWJ1Z2ZzX2xvZ19mb3BzKTsKKwkJaWYgKCFkaXIpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCisJCXZjaGlxX2RlYnVnZnNfbG9nX2VudHJpZXNbaV0uZGlyID0gZGlyOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRlYnVnZnNfdXNlY291bnRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKm9mZnNldCkKK3sKKwlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlID0gZi0+cHJpdmF0ZTsKKwlpbnQgdXNlX2NvdW50OworCisJdXNlX2NvdW50ID0gdmNoaXFfaW5zdGFuY2VfZ2V0X3VzZV9jb3VudChpbnN0YW5jZSk7CisJc2VxX3ByaW50ZihmLCAiJWRcbiIsIHVzZV9jb3VudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWJ1Z2ZzX3VzZWNvdW50X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGRlYnVnZnNfdXNlY291bnRfc2hvdywgaW5vZGUtPmlfcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnZnNfdXNlY291bnRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gZGVidWdmc191c2Vjb3VudF9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IGRlYnVnZnNfdHJhY2Vfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKm9mZnNldCkKK3sKKwlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlID0gZi0+cHJpdmF0ZTsKKwlpbnQgdHJhY2U7CisKKwl0cmFjZSA9IHZjaGlxX2luc3RhbmNlX2dldF90cmFjZShpbnN0YW5jZSk7CisJc2VxX3ByaW50ZihmLCAiJXNcbiIsIHRyYWNlID8gIlkiIDogIk4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlYnVnZnNfdHJhY2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZGVidWdmc190cmFjZV9zaG93LCBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIGludCBkZWJ1Z2ZzX3RyYWNlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCWNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHNlcV9maWxlICpmID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlID0gZi0+cHJpdmF0ZTsKKwljaGFyIGZpcnN0Y2hhcjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZmlyc3RjaGFyLCBidWZmZXIsIDEpICE9IDApCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoIChmaXJzdGNoYXIpIHsKKwljYXNlICdZJzoKKwljYXNlICd5JzoKKwljYXNlICcxJzoKKwkJdmNoaXFfaW5zdGFuY2Vfc2V0X3RyYWNlKGluc3RhbmNlLCAxKTsKKwkJYnJlYWs7CisJY2FzZSAnTic6CisJY2FzZSAnbic6CisJY2FzZSAnMCc6CisJCXZjaGlxX2luc3RhbmNlX3NldF90cmFjZShpbnN0YW5jZSwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCSpwcG9zICs9IGNvdW50OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z2ZzX3RyYWNlX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGRlYnVnZnNfdHJhY2Vfb3BlbiwKKwkud3JpdGUJCT0gZGVidWdmc190cmFjZV93cml0ZSwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworLyogYWRkIGFuIGluc3RhbmNlIChwcm9jZXNzKSB0byB0aGUgZGVidWdmcyBlbnRyaWVzICovCitpbnQgdmNoaXFfZGVidWdmc19hZGRfaW5zdGFuY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSkKK3sKKwljaGFyIHBpZHN0clsxNl07CisJc3RydWN0IGRlbnRyeSAqdG9wLCAqdXNlX2NvdW50LCAqdHJhY2U7CisJc3RydWN0IGRlbnRyeSAqY2xpZW50cyA9IHZjaGlxX2NsaWVudHNfdG9wKCk7CisKKwlzbnByaW50ZihwaWRzdHIsIHNpemVvZihwaWRzdHIpLCAiJWQiLAorCQkgdmNoaXFfaW5zdGFuY2VfZ2V0X3BpZChpbnN0YW5jZSkpOworCisJdG9wID0gZGVidWdmc19jcmVhdGVfZGlyKHBpZHN0ciwgY2xpZW50cyk7CisJaWYgKCF0b3ApCisJCWdvdG8gZmFpbF90b3A7CisKKwl1c2VfY291bnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ1c2VfY291bnQiLAorCQkJCQkwNDQ0LCB0b3AsCisJCQkJCWluc3RhbmNlLAorCQkJCQkmZGVidWdmc191c2Vjb3VudF9mb3BzKTsKKwlpZiAoIXVzZV9jb3VudCkKKwkJZ290byBmYWlsX3VzZV9jb3VudDsKKworCXRyYWNlID0gZGVidWdmc19jcmVhdGVfZmlsZSgidHJhY2UiLAorCQkJCSAgICAwNjQ0LCB0b3AsCisJCQkJICAgIGluc3RhbmNlLAorCQkJCSAgICAmZGVidWdmc190cmFjZV9mb3BzKTsKKwlpZiAoIXRyYWNlKQorCQlnb3RvIGZhaWxfdHJhY2U7CisKKwl2Y2hpcV9pbnN0YW5jZV9nZXRfZGVidWdmc19ub2RlKGluc3RhbmNlKS0+ZGVudHJ5ID0gdG9wOworCisJcmV0dXJuIDA7CisKK2ZhaWxfdHJhY2U6CisJZGVidWdmc19yZW1vdmUodXNlX2NvdW50KTsKK2ZhaWxfdXNlX2NvdW50OgorCWRlYnVnZnNfcmVtb3ZlKHRvcCk7CitmYWlsX3RvcDoKKwlyZXR1cm4gLUVOT01FTTsKK30KKwordm9pZCB2Y2hpcV9kZWJ1Z2ZzX3JlbW92ZV9pbnN0YW5jZShWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKQoreworCVZDSElRX0RFQlVHRlNfTk9ERV9UICpub2RlID0gdmNoaXFfaW5zdGFuY2VfZ2V0X2RlYnVnZnNfbm9kZShpbnN0YW5jZSk7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKG5vZGUtPmRlbnRyeSk7Cit9CisKKworaW50IHZjaGlxX2RlYnVnZnNfaW5pdCh2b2lkKQoreworCUJVR19PTihkZWJ1Z2ZzX2luZm8udmNoaXFfY2ZnX2RpciAhPSBOVUxMKTsKKworCWRlYnVnZnNfaW5mby52Y2hpcV9jZmdfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJ2Y2hpcSIsIE5VTEwpOworCWlmIChkZWJ1Z2ZzX2luZm8udmNoaXFfY2ZnX2RpciA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisKKwlkZWJ1Z2ZzX2luZm8uY2xpZW50cyA9IGRlYnVnZnNfY3JlYXRlX2RpcigiY2xpZW50cyIsCisJCQkJdmNoaXFfZGVidWdmc190b3AoKSk7CisJaWYgKCFkZWJ1Z2ZzX2luZm8uY2xpZW50cykKKwkJZ290byBmYWlsOworCisJaWYgKHZjaGlxX2RlYnVnZnNfY3JlYXRlX2xvZ19lbnRyaWVzKHZjaGlxX2RlYnVnZnNfdG9wKCkpICE9IDApCisJCWdvdG8gZmFpbDsKKworCXJldHVybiAwOworCitmYWlsOgorCXZjaGlxX2RlYnVnZnNfZGVpbml0KCk7CisJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCSIlczogZmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGRpcmVjdG9yeSIsCisJCV9fZnVuY19fKTsKKworCXJldHVybiAtRU5PTUVNOworfQorCisvKiByZW1vdmUgYWxsIHRoZSBkZWJ1Z2ZzIGVudHJpZXMgKi8KK3ZvaWQgdmNoaXFfZGVidWdmc19kZWluaXQodm9pZCkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUodmNoaXFfZGVidWdmc190b3AoKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp2Y2hpcV9jbGllbnRzX3RvcCh2b2lkKQoreworCXJldHVybiBkZWJ1Z2ZzX2luZm8uY2xpZW50czsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKnZjaGlxX2RlYnVnZnNfdG9wKHZvaWQpCit7CisJQlVHX09OKGRlYnVnZnNfaW5mby52Y2hpcV9jZmdfZGlyID09IE5VTEwpOworCXJldHVybiBkZWJ1Z2ZzX2luZm8udmNoaXFfY2ZnX2RpcjsKK30KKworI2Vsc2UgLyogQ09ORklHX0RFQlVHX0ZTICovCisKK2ludCB2Y2hpcV9kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCB2Y2hpcV9kZWJ1Z2ZzX2RlaW5pdCh2b2lkKQoreworfQorCitpbnQgdmNoaXFfZGVidWdmc19hZGRfaW5zdGFuY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCB2Y2hpcV9kZWJ1Z2ZzX3JlbW92ZV9pbnN0YW5jZShWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0RFQlVHX0ZTICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2RlYnVnZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfZGVidWdmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNmEzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2RlYnVnZnMuaApAQCAtMCwwICsxLDUyIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCBSYXNwYmVycnkgUGkgKFRyYWRpbmcpIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWQ0hJUV9ERUJVR0ZTX0gKKyNkZWZpbmUgVkNISVFfREVCVUdGU19ICisKKyNpbmNsdWRlICJ2Y2hpcV9jb3JlLmgiCisKK3R5cGVkZWYgc3RydWN0IHZjaGlxX2RlYnVnZnNfbm9kZV9zdHJ1Y3QKK3sKKyAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7Cit9IFZDSElRX0RFQlVHRlNfTk9ERV9UOworCitpbnQgdmNoaXFfZGVidWdmc19pbml0KHZvaWQpOworCit2b2lkIHZjaGlxX2RlYnVnZnNfZGVpbml0KHZvaWQpOworCitpbnQgdmNoaXFfZGVidWdmc19hZGRfaW5zdGFuY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSk7CisKK3ZvaWQgdmNoaXFfZGVidWdmc19yZW1vdmVfaW5zdGFuY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSk7CisKKyNlbmRpZiAvKiBWQ0hJUV9ERUJVR0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfZ2VudmVyc2lvbiBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfZ2VudmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjViNjM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9nZW52ZXJzaW9uCkBAIC0wLDAgKzEsODcgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCit1c2Ugc3RyaWN0OworCisjCisjIEdlbmVyYXRlIGEgdmVyc2lvbiBmcm9tIGF2YWlsYWJsZSBpbmZvcm1hdGlvbgorIworCitteSAkcHJlZml4ID0gc2hpZnQgQEFSR1Y7CitteSAkcm9vdCA9IHNoaWZ0IEBBUkdWOworCisKK2lmICggbm90IGRlZmluZWQgJHJvb3QgKSB7CisJZGllICJ1c2FnZTogJDAgcHJlZml4IHJvb3QtZGlyXG4iOworfQorCitpZiAoICEgLWQgJHJvb3QgKSB7CisJZGllICJyb290IGRpcmVjdG9yeSAkcm9vdCBub3QgZm91bmRcbiI7Cit9CisKK215ICR2ZXJzaW9uID0gInVua25vd24iOworbXkgJHRhaW50ZWQgPSAiIjsKKworaWYgKCAtZCAiJHJvb3QvLmdpdCIgKSB7CisJIyBhdHRlbXB0IHRvIHdvcmsgb3V0IGdpdCB2ZXJzaW9uLiBvbmx5IGRvIHNvCisJIyBvbiBhIGxpbnV4IGJ1aWxkIGhvc3QsIGFzIGN5Z3dpbiBidWlsZHMgYXJlCisJIyBhbHJlYWR5IHNsb3cgZW5vdWdoCisKKwlpZiAoIC1mICIvdXNyL2Jpbi9naXQiIHx8IC1mICIvdXNyL2xvY2FsL2Jpbi9naXQiICkgeworCQlpZiAobm90IG9wZW4oRiwgImdpdCAtLWdpdC1kaXIgJHJvb3QvLmdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRHwiKSkgeworCQkJJHZlcnNpb24gPSAibm8gZ2l0IHZlcnNpb24iOworCQl9CisJCWVsc2UgeworCQkJJHZlcnNpb24gPSA8Rj47CisJCQkkdmVyc2lvbiA9fiBzL1sgXHJcbl0qJC8vOyAgICAgIyBjaG9tcCBtYXkgbm90IGJlIGVub3VnaCAoY3lnd2luKS4KKwkJCSR2ZXJzaW9uID1+IHMvXlsgXHJcbl0qLy87ICAgICAjIGNob21wIG1heSBub3QgYmUgZW5vdWdoIChjeWd3aW4pLgorCQl9CisKKwkJaWYgKG9wZW4oRywgImdpdCAtLWdpdC1kaXIgJHJvb3QvLmdpdCBzdGF0dXMgLS1wb3JjZWxhaW58IikpIHsKKwkJCSR0YWludGVkID0gPEc+OworCQkJJHRhaW50ZWQgPX4gcy9bIFxyXG5dKiQvLzsgICAgICMgY2hvbXAgbWF5IG5vdCBiZSBlbm91Z2ggKGN5Z3dpbikuCisJCQkkdGFpbnRlZCA9fiBzL15bIFxyXG5dKi8vOyAgICAgIyBjaG9tcCBtYXkgbm90IGJlIGVub3VnaCAoY3lnd2luKS4KKwkJCWlmIChsZW5ndGggJHRhaW50ZWQpIHsKKwkJCSR2ZXJzaW9uID0gam9pbiAnICcsICR2ZXJzaW9uLCAiKHRhaW50ZWQpIjsKKwkJfQorCQllbHNlIHsKKwkJCSR2ZXJzaW9uID0gam9pbiAnICcsICR2ZXJzaW9uLCAiKGNsZWFuKSI7CisgICAgICAgICB9CisJCX0KKwl9Cit9CisKK215ICRob3N0bmFtZSA9IGBob3N0bmFtZWA7CiskaG9zdG5hbWUgPX4gcy9bIFxyXG5dKiQvLzsgICAgICMgY2hvbXAgbWF5IG5vdCBiZSBlbm91Z2ggKGN5Z3dpbikuCiskaG9zdG5hbWUgPX4gcy9eWyBcclxuXSovLzsgICAgICMgY2hvbXAgbWF5IG5vdCBiZSBlbm91Z2ggKGN5Z3dpbikuCisKKworcHJpbnQgU1RERVJSICJWZXJzaW9uICR2ZXJzaW9uXG4iOworcHJpbnQgPDxFT0Y7CisjaW5jbHVkZSAiJHtwcmVmaXh9X2J1aWxkX2luZm8uaCIKKyNpbmNsdWRlIDxsaW51eC9icm9hZGNvbS92Y19kZWJ1Z19zeW0uaD4KKworVkNfREVCVUdfREVDTEFSRV9TVFJJTkdfVkFSKCAke3ByZWZpeH1fYnVpbGRfaG9zdG5hbWUsICIkaG9zdG5hbWUiICk7CitWQ19ERUJVR19ERUNMQVJFX1NUUklOR19WQVIoICR7cHJlZml4fV9idWlsZF92ZXJzaW9uLCAiJHZlcnNpb24iICk7CitWQ19ERUJVR19ERUNMQVJFX1NUUklOR19WQVIoICR7cHJlZml4fV9idWlsZF90aW1lLCAgICBfX1RJTUVfXyApOworVkNfREVCVUdfREVDTEFSRV9TVFJJTkdfVkFSKCAke3ByZWZpeH1fYnVpbGRfZGF0ZSwgICAgX19EQVRFX18gKTsKKworY29uc3QgY2hhciAqdmNoaXFfZ2V0X2J1aWxkX2hvc3RuYW1lKCB2b2lkICkKK3sKKyAgIHJldHVybiB2Y2hpcV9idWlsZF9ob3N0bmFtZTsKK30KKworY29uc3QgY2hhciAqdmNoaXFfZ2V0X2J1aWxkX3ZlcnNpb24oIHZvaWQgKQoreworICAgcmV0dXJuIHZjaGlxX2J1aWxkX3ZlcnNpb247Cit9CisKK2NvbnN0IGNoYXIgKnZjaGlxX2dldF9idWlsZF9kYXRlKCB2b2lkICkKK3sKKyAgIHJldHVybiB2Y2hpcV9idWlsZF9kYXRlOworfQorCitjb25zdCBjaGFyICp2Y2hpcV9nZXRfYnVpbGRfdGltZSggdm9pZCApCit7CisgICByZXR1cm4gdmNoaXFfYnVpbGRfdGltZTsKK30KK0VPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9pZi5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNjdiYmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2lmLmgKQEAgLTAsMCArMSwxODkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVkNISVFfSUZfSAorI2RlZmluZSBWQ0hJUV9JRl9ICisKKyNpbmNsdWRlICJpbnRlcmZhY2UvdmNoaS92Y2hpX21oLmgiCisKKyNkZWZpbmUgVkNISVFfU0VSVklDRV9IQU5ETEVfSU5WQUxJRCAwCisKKyNkZWZpbmUgVkNISVFfU0xPVF9TSVpFICAgICA0MDk2CisjZGVmaW5lIFZDSElRX01BWF9NU0dfU0laRSAgKFZDSElRX1NMT1RfU0laRSAtIHNpemVvZihWQ0hJUV9IRUFERVJfVCkpCisjZGVmaW5lIFZDSElRX0NIQU5ORUxfU0laRSAgVkNISVFfTUFYX01TR19TSVpFIC8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworCisjZGVmaW5lIFZDSElRX01BS0VfRk9VUkNDKHgwLCB4MSwgeDIsIHgzKSBcCisJCQkoKCh4MCkgPDwgMjQpIHwgKCh4MSkgPDwgMTYpIHwgKCh4MikgPDwgOCkgfCAoeDMpKQorI2RlZmluZSBWQ0hJUV9HRVRfU0VSVklDRV9VU0VSREFUQShzZXJ2aWNlKSB2Y2hpcV9nZXRfc2VydmljZV91c2VyZGF0YShzZXJ2aWNlKQorI2RlZmluZSBWQ0hJUV9HRVRfU0VSVklDRV9GT1VSQ0Moc2VydmljZSkgICB2Y2hpcV9nZXRfc2VydmljZV9mb3VyY2Moc2VydmljZSkKKwordHlwZWRlZiBlbnVtIHsKKwlWQ0hJUV9TRVJWSUNFX09QRU5FRCwgICAgICAgICAvKiBzZXJ2aWNlLCAtLCAtICAgICAgICAgICAgICovCisJVkNISVFfU0VSVklDRV9DTE9TRUQsICAgICAgICAgLyogc2VydmljZSwgLSwgLSAgICAgICAgICAgICAqLworCVZDSElRX01FU1NBR0VfQVZBSUxBQkxFLCAgICAgIC8qIHNlcnZpY2UsIGhlYWRlciwgLSAgICAgICAgKi8KKwlWQ0hJUV9CVUxLX1RSQU5TTUlUX0RPTkUsICAgICAvKiBzZXJ2aWNlLCAtLCBidWxrX3VzZXJkYXRhICovCisJVkNISVFfQlVMS19SRUNFSVZFX0RPTkUsICAgICAgLyogc2VydmljZSwgLSwgYnVsa191c2VyZGF0YSAqLworCVZDSElRX0JVTEtfVFJBTlNNSVRfQUJPUlRFRCwgIC8qIHNlcnZpY2UsIC0sIGJ1bGtfdXNlcmRhdGEgKi8KKwlWQ0hJUV9CVUxLX1JFQ0VJVkVfQUJPUlRFRCAgICAvKiBzZXJ2aWNlLCAtLCBidWxrX3VzZXJkYXRhICovCit9IFZDSElRX1JFQVNPTl9UOworCit0eXBlZGVmIGVudW0geworCVZDSElRX0VSUk9SICAgPSAtMSwKKwlWQ0hJUV9TVUNDRVNTID0gMCwKKwlWQ0hJUV9SRVRSWSAgID0gMQorfSBWQ0hJUV9TVEFUVVNfVDsKKwordHlwZWRlZiBlbnVtIHsKKwlWQ0hJUV9CVUxLX01PREVfQ0FMTEJBQ0ssCisJVkNISVFfQlVMS19NT0RFX0JMT0NLSU5HLAorCVZDSElRX0JVTEtfTU9ERV9OT0NBTExCQUNLLAorCVZDSElRX0JVTEtfTU9ERV9XQUlUSU5HCQkvKiBSZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlICovCit9IFZDSElRX0JVTEtfTU9ERV9UOworCit0eXBlZGVmIGVudW0geworCVZDSElRX1NFUlZJQ0VfT1BUSU9OX0FVVE9DTE9TRSwKKwlWQ0hJUV9TRVJWSUNFX09QVElPTl9TTE9UX1FVT1RBLAorCVZDSElRX1NFUlZJQ0VfT1BUSU9OX01FU1NBR0VfUVVPVEEsCisJVkNISVFfU0VSVklDRV9PUFRJT05fU1lOQ0hST05PVVMsCisJVkNISVFfU0VSVklDRV9PUFRJT05fVFJBQ0UKK30gVkNISVFfU0VSVklDRV9PUFRJT05fVDsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfaGVhZGVyX3N0cnVjdCB7CisJLyogVGhlIG1lc3NhZ2UgaWRlbnRpZmllciAtIG9wYXF1ZSB0byBhcHBsaWNhdGlvbnMuICovCisJaW50IG1zZ2lkOworCisJLyogU2l6ZSBvZiBtZXNzYWdlIGRhdGEuICovCisJdW5zaWduZWQgaW50IHNpemU7CisKKwljaGFyIGRhdGFbMF07ICAgICAgICAgICAvKiBtZXNzYWdlICovCit9IFZDSElRX0hFQURFUl9UOworCit0eXBlZGVmIHN0cnVjdCB7CisJY29uc3Qgdm9pZCAqZGF0YTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKK30gVkNISVFfRUxFTUVOVF9UOworCit0eXBlZGVmIHVuc2lnbmVkIGludCBWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UOworCit0eXBlZGVmIFZDSElRX1NUQVRVU19UICgqVkNISVFfQ0FMTEJBQ0tfVCkoVkNISVFfUkVBU09OX1QsIFZDSElRX0hFQURFUl9UICosCisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCwgdm9pZCAqKTsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfc2VydmljZV9iYXNlX3N0cnVjdCB7CisJaW50IGZvdXJjYzsKKwlWQ0hJUV9DQUxMQkFDS19UIGNhbGxiYWNrOworCXZvaWQgKnVzZXJkYXRhOworfSBWQ0hJUV9TRVJWSUNFX0JBU0VfVDsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfc2VydmljZV9wYXJhbXNfc3RydWN0IHsKKwlpbnQgZm91cmNjOworCVZDSElRX0NBTExCQUNLX1QgY2FsbGJhY2s7CisJdm9pZCAqdXNlcmRhdGE7CisJc2hvcnQgdmVyc2lvbjsgICAgICAgLyogSW5jcmVtZW50IGZvciBub24tdHJpdmlhbCBjaGFuZ2VzICovCisJc2hvcnQgdmVyc2lvbl9taW47ICAgLyogVXBkYXRlIGZvciBpbmNvbXBhdGlibGUgY2hhbmdlcyAqLworfSBWQ0hJUV9TRVJWSUNFX1BBUkFNU19UOworCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV9jb25maWdfc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbWF4X21zZ19zaXplOworCXVuc2lnbmVkIGludCBidWxrX3RocmVzaG9sZDsgLyogVGhlIG1lc3NhZ2Ugc2l6ZSBhYm92ZSB3aGljaCBpdAorCQkJCQlpcyBiZXR0ZXIgdG8gdXNlIGEgYnVsayB0cmFuc2ZlcgorCQkJCQkoPD0gbWF4X21zZ19zaXplKSAqLworCXVuc2lnbmVkIGludCBtYXhfb3V0c3RhbmRpbmdfYnVsa3M7CisJdW5zaWduZWQgaW50IG1heF9zZXJ2aWNlczsKKwlzaG9ydCB2ZXJzaW9uOyAgICAgIC8qIFRoZSB2ZXJzaW9uIG9mIFZDSElRICovCisJc2hvcnQgdmVyc2lvbl9taW47ICAvKiBUaGUgbWluaW11bSBjb21wYXRpYmxlIHZlcnNpb24gb2YgVkNISVEgKi8KK30gVkNISVFfQ09ORklHX1Q7CisKK3R5cGVkZWYgc3RydWN0IHZjaGlxX2luc3RhbmNlX3N0cnVjdCAqVkNISVFfSU5TVEFOQ0VfVDsKK3R5cGVkZWYgdm9pZCAoKlZDSElRX1JFTU9URV9VU0VfQ0FMTEJBQ0tfVCkodm9pZCAqY2JfYXJnKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX2luaXRpYWxpc2UoVkNISVFfSU5TVEFOQ0VfVCAqcGluc3RhbmNlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9zaHV0ZG93bihWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9jb25uZWN0KFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpOworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX2FkZF9zZXJ2aWNlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UsCisJY29uc3QgVkNISVFfU0VSVklDRV9QQVJBTVNfVCAqcGFyYW1zLAorCVZDSElRX1NFUlZJQ0VfSEFORExFX1QgKnBzZXJ2aWNlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9vcGVuX3NlcnZpY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwKKwljb25zdCBWQ0hJUV9TRVJWSUNFX1BBUkFNU19UICpwYXJhbXMsCisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCAqcHNlcnZpY2UpOworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX2Nsb3NlX3NlcnZpY2UoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9yZW1vdmVfc2VydmljZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UpOworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX3VzZV9zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfdXNlX3NlcnZpY2Vfbm9fcmVzdW1lKAorCVZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfcmVsZWFzZV9zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9xdWV1ZV9tZXNzYWdlKFZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSwKKwljb25zdCBWQ0hJUV9FTEVNRU5UX1QgKmVsZW1lbnRzLCB1bnNpZ25lZCBpbnQgY291bnQpOworZXh0ZXJuIHZvaWQgICAgICAgICAgIHZjaGlxX3JlbGVhc2VfbWVzc2FnZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UsCisJVkNISVFfSEVBREVSX1QgKmhlYWRlcik7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfcXVldWVfYnVsa190cmFuc21pdChWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UsCisJY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKnVzZXJkYXRhKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9xdWV1ZV9idWxrX3JlY2VpdmUoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorCXZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCB2b2lkICp1c2VyZGF0YSk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfcXVldWVfYnVsa190cmFuc21pdF9oYW5kbGUoCisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLCBWQ0hJX01FTV9IQU5ETEVfVCBoYW5kbGUsCisJY29uc3Qgdm9pZCAqb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdm9pZCAqdXNlcmRhdGEpOworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX3F1ZXVlX2J1bGtfcmVjZWl2ZV9oYW5kbGUoCisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLCBWQ0hJX01FTV9IQU5ETEVfVCBoYW5kbGUsCisJdm9pZCAqb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdm9pZCAqdXNlcmRhdGEpOworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX2J1bGtfdHJhbnNtaXQoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorCWNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCB2b2lkICp1c2VyZGF0YSwKKwlWQ0hJUV9CVUxLX01PREVfVCBtb2RlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9idWxrX3JlY2VpdmUoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorCXZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCB2b2lkICp1c2VyZGF0YSwKKwlWQ0hJUV9CVUxLX01PREVfVCBtb2RlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9idWxrX3RyYW5zbWl0X2hhbmRsZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UsCisJVkNISV9NRU1fSEFORExFX1QgaGFuZGxlLCBjb25zdCB2b2lkICpvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLAorCXZvaWQgKnVzZXJkYXRhLAlWQ0hJUV9CVUxLX01PREVfVCBtb2RlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9idWxrX3JlY2VpdmVfaGFuZGxlKFZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSwKKwlWQ0hJX01FTV9IQU5ETEVfVCBoYW5kbGUsIHZvaWQgKm9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsCisJdm9pZCAqdXNlcmRhdGEsIFZDSElRX0JVTEtfTU9ERV9UIG1vZGUpOworZXh0ZXJuIGludCAgIHZjaGlxX2dldF9jbGllbnRfaWQoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlKTsKK2V4dGVybiB2b2lkICp2Y2hpcV9nZXRfc2VydmljZV91c2VyZGF0YShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UpOworZXh0ZXJuIGludCAgIHZjaGlxX2dldF9zZXJ2aWNlX2ZvdXJjYyhWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UpOworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX2dldF9jb25maWcoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwKKwlpbnQgY29uZmlnX3NpemUsIFZDSElRX0NPTkZJR19UICpwY29uZmlnKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9zZXRfc2VydmljZV9vcHRpb24oVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorCVZDSElRX1NFUlZJQ0VfT1BUSU9OX1Qgb3B0aW9uLCBpbnQgdmFsdWUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfcmVtb3RlX3VzZShWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlLAorCVZDSElRX1JFTU9URV9VU0VfQ0FMTEJBQ0tfVCBjYWxsYmFjaywgdm9pZCAqY2JfYXJnKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9yZW1vdGVfcmVsZWFzZShWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX2R1bXBfcGh5c19tZW0oVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorCXZvaWQgKnB0ciwgc2l6ZV90IG51bV9ieXRlcyk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9nZXRfcGVlcl92ZXJzaW9uKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICAgICAgc2hvcnQgKnBlZXJfdmVyc2lvbik7CisKKyNlbmRpZiAvKiBWQ0hJUV9JRl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2lvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzN2FlOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfaW9jdGwuaApAQCAtMCwwICsxLDEzMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWQ0hJUV9JT0NUTFNfSAorI2RlZmluZSBWQ0hJUV9JT0NUTFNfSAorCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlICJ2Y2hpcV9pZi5oIgorCisjZGVmaW5lIFZDSElRX0lPQ19NQUdJQyAweGM0CisjZGVmaW5lIFZDSElRX0lOVkFMSURfSEFORExFICh+MCkKKwordHlwZWRlZiBzdHJ1Y3QgeworCVZDSElRX1NFUlZJQ0VfUEFSQU1TX1QgcGFyYW1zOworCWludCBpc19vcGVuOworCWludCBpc192Y2hpOworCXVuc2lnbmVkIGludCBoYW5kbGU7ICAgICAgIC8qIE9VVCAqLworfSBWQ0hJUV9DUkVBVEVfU0VSVklDRV9UOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGhhbmRsZTsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJY29uc3QgVkNISVFfRUxFTUVOVF9UICplbGVtZW50czsKK30gVkNISVFfUVVFVUVfTUVTU0FHRV9UOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGhhbmRsZTsKKwl2b2lkICpkYXRhOworCXVuc2lnbmVkIGludCBzaXplOworCXZvaWQgKnVzZXJkYXRhOworCVZDSElRX0JVTEtfTU9ERV9UIG1vZGU7Cit9IFZDSElRX1FVRVVFX0JVTEtfVFJBTlNGRVJfVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVZDSElRX1JFQVNPTl9UIHJlYXNvbjsKKwlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyOworCXZvaWQgKnNlcnZpY2VfdXNlcmRhdGE7CisJdm9pZCAqYnVsa191c2VyZGF0YTsKK30gVkNISVFfQ09NUExFVElPTl9EQVRBX1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJVkNISVFfQ09NUExFVElPTl9EQVRBX1QgKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgbXNnYnVmc2l6ZTsKKwl1bnNpZ25lZCBpbnQgbXNnYnVmY291bnQ7IC8qIElOL09VVCAqLworCXZvaWQgKiptc2didWZzOworfSBWQ0hJUV9BV0FJVF9DT01QTEVUSU9OX1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlOworCWludCBibG9ja2luZzsKKwl1bnNpZ25lZCBpbnQgYnVmc2l6ZTsKKwl2b2lkICpidWY7Cit9IFZDSElRX0RFUVVFVUVfTUVTU0FHRV9UOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGNvbmZpZ19zaXplOworCVZDSElRX0NPTkZJR19UICpwY29uZmlnOworfSBWQ0hJUV9HRVRfQ09ORklHX1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlOworCVZDSElRX1NFUlZJQ0VfT1BUSU9OX1Qgb3B0aW9uOworCWludCB2YWx1ZTsKK30gVkNISVFfU0VUX1NFUlZJQ0VfT1BUSU9OX1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2lkICAgICAqdmlydF9hZGRyOworCXNpemVfdCAgICBudW1fYnl0ZXM7Cit9IFZDSElRX0RVTVBfTUVNX1Q7CisKKyNkZWZpbmUgVkNISVFfSU9DX0NPTk5FQ1QgICAgICAgICAgICAgIF9JTyhWQ0hJUV9JT0NfTUFHSUMsICAgMCkKKyNkZWZpbmUgVkNISVFfSU9DX1NIVVRET1dOICAgICAgICAgICAgIF9JTyhWQ0hJUV9JT0NfTUFHSUMsICAgMSkKKyNkZWZpbmUgVkNISVFfSU9DX0NSRUFURV9TRVJWSUNFIFwKKwlfSU9XUihWQ0hJUV9JT0NfTUFHSUMsIDIsIFZDSElRX0NSRUFURV9TRVJWSUNFX1QpCisjZGVmaW5lIFZDSElRX0lPQ19SRU1PVkVfU0VSVklDRSAgICAgICBfSU8oVkNISVFfSU9DX01BR0lDLCAgIDMpCisjZGVmaW5lIFZDSElRX0lPQ19RVUVVRV9NRVNTQUdFIFwKKwlfSU9XKFZDSElRX0lPQ19NQUdJQywgIDQsIFZDSElRX1FVRVVFX01FU1NBR0VfVCkKKyNkZWZpbmUgVkNISVFfSU9DX1FVRVVFX0JVTEtfVFJBTlNNSVQgXAorCV9JT1dSKFZDSElRX0lPQ19NQUdJQywgNSwgVkNISVFfUVVFVUVfQlVMS19UUkFOU0ZFUl9UKQorI2RlZmluZSBWQ0hJUV9JT0NfUVVFVUVfQlVMS19SRUNFSVZFIFwKKwlfSU9XUihWQ0hJUV9JT0NfTUFHSUMsIDYsIFZDSElRX1FVRVVFX0JVTEtfVFJBTlNGRVJfVCkKKyNkZWZpbmUgVkNISVFfSU9DX0FXQUlUX0NPTVBMRVRJT04gXAorCV9JT1dSKFZDSElRX0lPQ19NQUdJQywgNywgVkNISVFfQVdBSVRfQ09NUExFVElPTl9UKQorI2RlZmluZSBWQ0hJUV9JT0NfREVRVUVVRV9NRVNTQUdFIFwKKwlfSU9XUihWQ0hJUV9JT0NfTUFHSUMsIDgsIFZDSElRX0RFUVVFVUVfTUVTU0FHRV9UKQorI2RlZmluZSBWQ0hJUV9JT0NfR0VUX0NMSUVOVF9JRCAgICAgICAgX0lPKFZDSElRX0lPQ19NQUdJQywgICA5KQorI2RlZmluZSBWQ0hJUV9JT0NfR0VUX0NPTkZJRyBcCisJX0lPV1IoVkNISVFfSU9DX01BR0lDLCAxMCwgVkNISVFfR0VUX0NPTkZJR19UKQorI2RlZmluZSBWQ0hJUV9JT0NfQ0xPU0VfU0VSVklDRSAgICAgICAgX0lPKFZDSElRX0lPQ19NQUdJQywgICAxMSkKKyNkZWZpbmUgVkNISVFfSU9DX1VTRV9TRVJWSUNFICAgICAgICAgIF9JTyhWQ0hJUV9JT0NfTUFHSUMsICAgMTIpCisjZGVmaW5lIFZDSElRX0lPQ19SRUxFQVNFX1NFUlZJQ0UgICAgICBfSU8oVkNISVFfSU9DX01BR0lDLCAgIDEzKQorI2RlZmluZSBWQ0hJUV9JT0NfU0VUX1NFUlZJQ0VfT1BUSU9OIFwKKwlfSU9XKFZDSElRX0lPQ19NQUdJQywgIDE0LCBWQ0hJUV9TRVRfU0VSVklDRV9PUFRJT05fVCkKKyNkZWZpbmUgVkNISVFfSU9DX0RVTVBfUEhZU19NRU0gXAorCV9JT1coVkNISVFfSU9DX01BR0lDLCAgMTUsIFZDSElRX0RVTVBfTUVNX1QpCisjZGVmaW5lIFZDSElRX0lPQ19MSUJfVkVSU0lPTiAgICAgICAgICBfSU8oVkNISVFfSU9DX01BR0lDLCAgIDE2KQorI2RlZmluZSBWQ0hJUV9JT0NfQ0xPU0VfREVMSVZFUkVEICAgICAgX0lPKFZDSElRX0lPQ19NQUdJQywgICAxNykKKyNkZWZpbmUgVkNISVFfSU9DX01BWCAgICAgICAgICAgICAgICAgIDE3CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9rZXJuX2xpYi5jIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9rZXJuX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZTcwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2tlcm5fbGliLmMKQEAgLTAsMCArMSw0NTggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qIC0tLS0gSW5jbHVkZSBGaWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorCisjaW5jbHVkZSAidmNoaXFfY29yZS5oIgorI2luY2x1ZGUgInZjaGlxX2FybS5oIgorI2luY2x1ZGUgInZjaGlxX2tpbGxhYmxlLmgiCisKKy8qIC0tLS0gUHVibGljIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0gUHJpdmF0ZSBDb25zdGFudHMgYW5kIFR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBidWxrX3dhaXRlcl9ub2RlIHsKKwlzdHJ1Y3QgYnVsa193YWl0ZXIgYnVsa193YWl0ZXI7CisJaW50IHBpZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgdmNoaXFfaW5zdGFuY2Vfc3RydWN0IHsKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZTsKKworCWludCBjb25uZWN0ZWQ7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJ1bGtfd2FpdGVyX2xpc3Q7CisJc3RydWN0IG11dGV4IGJ1bGtfd2FpdGVyX2xpc3RfbXV0ZXg7Cit9OworCitzdGF0aWMgVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2Jsb2NraW5nX2J1bGtfdHJhbnNmZXIoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsIHZvaWQgKmRhdGEsCisJdW5zaWduZWQgaW50IHNpemUsIFZDSElRX0JVTEtfRElSX1QgZGlyKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICB2Y2hpcV9pbml0aWFsaXNlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFZDSElRX0lOSVRfUkVUUklFUyAxMAorVkNISVFfU1RBVFVTX1QgdmNoaXFfaW5pdGlhbGlzZShWQ0hJUV9JTlNUQU5DRV9UICppbnN0YW5jZU91dCkKK3sKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZTsKKwlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlID0gTlVMTDsKKyAgICAgICAgaW50IGk7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfY29yZV9sb2dfbGV2ZWwsICIlcyBjYWxsZWQiLCBfX2Z1bmNfXyk7CisKKyAgICAgICAgLyogVmlkZW9Db3JlIG1heSBub3QgYmUgcmVhZHkgZHVlIHRvIGJvb3QgdXAgdGltaW5nLgorICAgICAgICAgICBJdCBtYXkgbmV2ZXIgYmUgcmVhZHkgaWYga2VybmVsIGFuZCBmaXJtd2FyZSBhcmUgbWlzbWF0Y2hlZCwgc28gZG9uJ3QgYmxvY2sgZm9yZXZlci4gKi8KKyAgICAgICAgZm9yIChpPTA7IGk8VkNISVFfSU5JVF9SRVRSSUVTOyBpKyspIHsKKwkJc3RhdGUgPSB2Y2hpcV9nZXRfc3RhdGUoKTsKKwkJaWYgKHN0YXRlKQorCQkJYnJlYWs7CisJCXVkZWxheSg1MDApOworCX0KKwlpZiAoaT09VkNISVFfSU5JVF9SRVRSSUVTKSB7CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlczogdmlkZW9jb3JlIG5vdCBpbml0aWFsaXplZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGZhaWxlZDsKKwl9IGVsc2UgaWYgKGk+MCkgeworCQl2Y2hpcV9sb2dfd2FybmluZyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlczogdmlkZW9jb3JlIGluaXRpYWxpemVkIGFmdGVyICVkIHJldHJpZXNcbiIsIF9fZnVuY19fLCBpKTsKKwl9CisKKwlpbnN0YW5jZSA9IGt6YWxsb2Moc2l6ZW9mKCppbnN0YW5jZSksIEdGUF9LRVJORUwpOworCWlmICghaW5zdGFuY2UpIHsKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJIiVzOiBlcnJvciBhbGxvY2F0aW5nIHZjaGlxIGluc3RhbmNlXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWluc3RhbmNlLT5jb25uZWN0ZWQgPSAwOworCWluc3RhbmNlLT5zdGF0ZSA9IHN0YXRlOworCW11dGV4X2luaXQoJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0X211dGV4KTsKKwlJTklUX0xJU1RfSEVBRCgmaW5zdGFuY2UtPmJ1bGtfd2FpdGVyX2xpc3QpOworCisJKmluc3RhbmNlT3V0ID0gaW5zdGFuY2U7CisKKwlzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCitmYWlsZWQ6CisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkiJXMoJXApOiByZXR1cm5pbmcgJWQiLCBfX2Z1bmNfXywgaW5zdGFuY2UsIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpcV9pbml0aWFsaXNlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICB2Y2hpcV9zaHV0ZG93bgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9zaHV0ZG93bihWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IGluc3RhbmNlLT5zdGF0ZTsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVzKCVwKSBjYWxsZWQiLCBfX2Z1bmNfXywgaW5zdGFuY2UpOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPm11dGV4KSAhPSAwKQorCQlyZXR1cm4gVkNISVFfUkVUUlk7CisKKwkvKiBSZW1vdmUgYWxsIHNlcnZpY2VzICovCisJc3RhdHVzID0gdmNoaXFfc2h1dGRvd25faW50ZXJuYWwoc3RhdGUsIGluc3RhbmNlKTsKKworCW11dGV4X3VubG9jaygmc3RhdGUtPm11dGV4KTsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVzKCVwKTogcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIGluc3RhbmNlLCBzdGF0dXMpOworCisJaWYgKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKm5leHQ7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG5leHQsCisJCQkJJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0KSB7CisJCQlzdHJ1Y3QgYnVsa193YWl0ZXJfbm9kZSAqd2FpdGVyOworCQkJd2FpdGVyID0gbGlzdF9lbnRyeShwb3MsCisJCQkJCXN0cnVjdCBidWxrX3dhaXRlcl9ub2RlLAorCQkJCQlsaXN0KTsKKwkJCWxpc3RfZGVsKHBvcyk7CisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCQkiYnVsa193YWl0ZXIgLSBjbGVhbmVkIHVwICV4ICIKKwkJCQkJImZvciBwaWQgJWQiLAorCQkJCQkodW5zaWduZWQgaW50KXdhaXRlciwgd2FpdGVyLT5waWQpOworCQkJa2ZyZWUod2FpdGVyKTsKKwkJfQorCQlrZnJlZShpbnN0YW5jZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0wodmNoaXFfc2h1dGRvd24pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHZjaGlxX2lzX2Nvbm5lY3RlZAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgdmNoaXFfaXNfY29ubmVjdGVkKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpCit7CisJcmV0dXJuIGluc3RhbmNlLT5jb25uZWN0ZWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgdmNoaXFfY29ubmVjdAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9jb25uZWN0KFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpCit7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gaW5zdGFuY2UtPnN0YXRlOworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkiJXMoJXApIGNhbGxlZCIsIF9fZnVuY19fLCBpbnN0YW5jZSk7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+bXV0ZXgpICE9IDApIHsKKwkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJIiVzOiBjYWxsIHRvIG11dGV4X2xvY2sgZmFpbGVkIiwgX19mdW5jX18pOworCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJZ290byBmYWlsZWQ7CisJfQorCXN0YXR1cyA9IHZjaGlxX2Nvbm5lY3RfaW50ZXJuYWwoc3RhdGUsIGluc3RhbmNlKTsKKworCWlmIChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykKKwkJaW5zdGFuY2UtPmNvbm5lY3RlZCA9IDE7CisKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CisKK2ZhaWxlZDoKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSIlcyglcCk6IHJldHVybmluZyAlZCIsIF9fZnVuY19fLCBpbnN0YW5jZSwgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlxX2Nvbm5lY3QpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHZjaGlxX2FkZF9zZXJ2aWNlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1ZDSElRX1NUQVRVU19UIHZjaGlxX2FkZF9zZXJ2aWNlKAorCVZDSElRX0lOU1RBTkNFX1QgICAgICAgICAgICAgIGluc3RhbmNlLAorCWNvbnN0IFZDSElRX1NFUlZJQ0VfUEFSQU1TX1QgKnBhcmFtcywKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UICAgICAgICpwaGFuZGxlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IGluc3RhbmNlLT5zdGF0ZTsKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBOVUxMOworCWludCBzcnZzdGF0ZTsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVzKCVwKSBjYWxsZWQiLCBfX2Z1bmNfXywgaW5zdGFuY2UpOworCisJKnBoYW5kbGUgPSBWQ0hJUV9TRVJWSUNFX0hBTkRMRV9JTlZBTElEOworCisJc3J2c3RhdGUgPSB2Y2hpcV9pc19jb25uZWN0ZWQoaW5zdGFuY2UpCisJCT8gVkNISVFfU1JWU1RBVEVfTElTVEVOSU5HCisJCTogVkNISVFfU1JWU1RBVEVfSElEREVOOworCisJc2VydmljZSA9IHZjaGlxX2FkZF9zZXJ2aWNlX2ludGVybmFsKAorCQlzdGF0ZSwKKwkJcGFyYW1zLAorCQlzcnZzdGF0ZSwKKwkJaW5zdGFuY2UsCisJCU5VTEwpOworCisJaWYgKHNlcnZpY2UpIHsKKwkJKnBoYW5kbGUgPSBzZXJ2aWNlLT5oYW5kbGU7CisJCXN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisJfSBlbHNlCisJCXN0YXR1cyA9IFZDSElRX0VSUk9SOworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkiJXMoJXApOiByZXR1cm5pbmcgJWQiLCBfX2Z1bmNfXywgaW5zdGFuY2UsIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpcV9hZGRfc2VydmljZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgdmNoaXFfb3Blbl9zZXJ2aWNlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1ZDSElRX1NUQVRVU19UIHZjaGlxX29wZW5fc2VydmljZSgKKwlWQ0hJUV9JTlNUQU5DRV9UICAgICAgICAgICAgICBpbnN0YW5jZSwKKwljb25zdCBWQ0hJUV9TRVJWSUNFX1BBUkFNU19UICpwYXJhbXMsCisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCAgICAgICAqcGhhbmRsZSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCAgIHN0YXR1cyA9IFZDSElRX0VSUk9SOworCVZDSElRX1NUQVRFX1QgICAqc3RhdGUgPSBpbnN0YW5jZS0+c3RhdGU7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gTlVMTDsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVzKCVwKSBjYWxsZWQiLCBfX2Z1bmNfXywgaW5zdGFuY2UpOworCisJKnBoYW5kbGUgPSBWQ0hJUV9TRVJWSUNFX0hBTkRMRV9JTlZBTElEOworCisJaWYgKCF2Y2hpcV9pc19jb25uZWN0ZWQoaW5zdGFuY2UpKQorCQlnb3RvIGZhaWxlZDsKKworCXNlcnZpY2UgPSB2Y2hpcV9hZGRfc2VydmljZV9pbnRlcm5hbChzdGF0ZSwKKwkJcGFyYW1zLAorCQlWQ0hJUV9TUlZTVEFURV9PUEVOSU5HLAorCQlpbnN0YW5jZSwKKwkJTlVMTCk7CisKKwlpZiAoc2VydmljZSkgeworCQkqcGhhbmRsZSA9IHNlcnZpY2UtPmhhbmRsZTsKKwkJc3RhdHVzID0gdmNoaXFfb3Blbl9zZXJ2aWNlX2ludGVybmFsKHNlcnZpY2UsIGN1cnJlbnQtPnBpZCk7CisJCWlmIChzdGF0dXMgIT0gVkNISVFfU1VDQ0VTUykgeworCQkJdmNoaXFfcmVtb3ZlX3NlcnZpY2Uoc2VydmljZS0+aGFuZGxlKTsKKwkJCSpwaGFuZGxlID0gVkNISVFfU0VSVklDRV9IQU5ETEVfSU5WQUxJRDsKKwkJfQorCX0KKworZmFpbGVkOgorCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVzKCVwKTogcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIGluc3RhbmNlLCBzdGF0dXMpOworCisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0wodmNoaXFfb3Blbl9zZXJ2aWNlKTsKKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3F1ZXVlX2J1bGtfdHJhbnNtaXQoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisJY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKnVzZXJkYXRhKQoreworCXJldHVybiB2Y2hpcV9idWxrX3RyYW5zZmVyKGhhbmRsZSwKKwkJVkNISV9NRU1fSEFORExFX0lOVkFMSUQsICh2b2lkICopZGF0YSwgc2l6ZSwgdXNlcmRhdGEsCisJCVZDSElRX0JVTEtfTU9ERV9DQUxMQkFDSywgVkNISVFfQlVMS19UUkFOU01JVCk7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlxX3F1ZXVlX2J1bGtfdHJhbnNtaXQpOworCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfcXVldWVfYnVsa19yZWNlaXZlKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLCB2b2lkICpkYXRhLAorCXVuc2lnbmVkIGludCBzaXplLCB2b2lkICp1c2VyZGF0YSkKK3sKKwlyZXR1cm4gdmNoaXFfYnVsa190cmFuc2ZlcihoYW5kbGUsCisJCVZDSElfTUVNX0hBTkRMRV9JTlZBTElELCBkYXRhLCBzaXplLCB1c2VyZGF0YSwKKwkJVkNISVFfQlVMS19NT0RFX0NBTExCQUNLLCBWQ0hJUV9CVUxLX1JFQ0VJVkUpOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpcV9xdWV1ZV9idWxrX3JlY2VpdmUpOworCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfYnVsa190cmFuc21pdChWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwgY29uc3Qgdm9pZCAqZGF0YSwKKwl1bnNpZ25lZCBpbnQgc2l6ZSwgdm9pZCAqdXNlcmRhdGEsIFZDSElRX0JVTEtfTU9ERV9UIG1vZGUpCit7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBWQ0hJUV9CVUxLX01PREVfTk9DQUxMQkFDSzoKKwljYXNlIFZDSElRX0JVTEtfTU9ERV9DQUxMQkFDSzoKKwkJc3RhdHVzID0gdmNoaXFfYnVsa190cmFuc2ZlcihoYW5kbGUsCisJCQlWQ0hJX01FTV9IQU5ETEVfSU5WQUxJRCwgKHZvaWQgKilkYXRhLCBzaXplLCB1c2VyZGF0YSwKKwkJCW1vZGUsIFZDSElRX0JVTEtfVFJBTlNNSVQpOworCQlicmVhazsKKwljYXNlIFZDSElRX0JVTEtfTU9ERV9CTE9DS0lORzoKKwkJc3RhdHVzID0gdmNoaXFfYmxvY2tpbmdfYnVsa190cmFuc2ZlcihoYW5kbGUsCisJCQkodm9pZCAqKWRhdGEsIHNpemUsIFZDSElRX0JVTEtfVFJBTlNNSVQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gVkNISVFfRVJST1I7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0wodmNoaXFfYnVsa190cmFuc21pdCk7CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9idWxrX3JlY2VpdmUoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsIHZvaWQgKmRhdGEsCisJdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKnVzZXJkYXRhLCBWQ0hJUV9CVUxLX01PREVfVCBtb2RlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgVkNISVFfQlVMS19NT0RFX05PQ0FMTEJBQ0s6CisJY2FzZSBWQ0hJUV9CVUxLX01PREVfQ0FMTEJBQ0s6CisJCXN0YXR1cyA9IHZjaGlxX2J1bGtfdHJhbnNmZXIoaGFuZGxlLAorCQkJVkNISV9NRU1fSEFORExFX0lOVkFMSUQsIGRhdGEsIHNpemUsIHVzZXJkYXRhLAorCQkJbW9kZSwgVkNISVFfQlVMS19SRUNFSVZFKTsKKwkJYnJlYWs7CisJY2FzZSBWQ0hJUV9CVUxLX01PREVfQkxPQ0tJTkc6CisJCXN0YXR1cyA9IHZjaGlxX2Jsb2NraW5nX2J1bGtfdHJhbnNmZXIoaGFuZGxlLAorCQkJKHZvaWQgKilkYXRhLCBzaXplLCBWQ0hJUV9CVUxLX1JFQ0VJVkUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gVkNISVFfRVJST1I7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0wodmNoaXFfYnVsa19yZWNlaXZlKTsKKworc3RhdGljIFZDSElRX1NUQVRVU19UCit2Y2hpcV9ibG9ja2luZ19idWxrX3RyYW5zZmVyKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLCB2b2lkICpkYXRhLAorCXVuc2lnbmVkIGludCBzaXplLCBWQ0hJUV9CVUxLX0RJUl9UIGRpcikKK3sKKwlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlOworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXM7CisJc3RydWN0IGJ1bGtfd2FpdGVyX25vZGUgKndhaXRlciA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCisJc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9oYW5kbGUoaGFuZGxlKTsKKwlpZiAoIXNlcnZpY2UpCisJCXJldHVybiBWQ0hJUV9FUlJPUjsKKworCWluc3RhbmNlID0gc2VydmljZS0+aW5zdGFuY2U7CisKKwl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKworCW11dGV4X2xvY2soJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0KSB7CisJCWlmIChsaXN0X2VudHJ5KHBvcywgc3RydWN0IGJ1bGtfd2FpdGVyX25vZGUsCisJCQkJbGlzdCktPnBpZCA9PSBjdXJyZW50LT5waWQpIHsKKwkJCXdhaXRlciA9IGxpc3RfZW50cnkocG9zLAorCQkJCXN0cnVjdCBidWxrX3dhaXRlcl9ub2RlLAorCQkJCWxpc3QpOworCQkJbGlzdF9kZWwocG9zKTsKKwkJCWJyZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmaW5zdGFuY2UtPmJ1bGtfd2FpdGVyX2xpc3RfbXV0ZXgpOworCisJaWYgKHdhaXRlcikgeworCQlWQ0hJUV9CVUxLX1QgKmJ1bGsgPSB3YWl0ZXItPmJ1bGtfd2FpdGVyLmJ1bGs7CisJCWlmIChidWxrKSB7CisJCQkvKiBUaGlzIHRocmVhZCBoYXMgYW4gb3V0c3RhbmRpbmcgYnVsayB0cmFuc2Zlci4gKi8KKwkJCWlmICgoYnVsay0+ZGF0YSAhPSBkYXRhKSB8fAorCQkJCShidWxrLT5zaXplICE9IHNpemUpKSB7CisJCQkJLyogVGhpcyBpcyBub3QgYSByZXRyeSBvZiB0aGUgcHJldmlvdXMgb25lLgorCQkJCSoqIENhbmNlbCB0aGUgc2lnbmFsIHdoZW4gdGhlIHRyYW5zZmVyCisJCQkJKiogY29tcGxldGVzLiAqLworCQkJCXNwaW5fbG9jaygmYnVsa193YWl0ZXJfc3BpbmxvY2spOworCQkJCWJ1bGstPnVzZXJkYXRhID0gTlVMTDsKKwkJCQlzcGluX3VubG9jaygmYnVsa193YWl0ZXJfc3BpbmxvY2spOworCQkJfQorCQl9CisJfQorCisJaWYgKCF3YWl0ZXIpIHsKKwkJd2FpdGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ1bGtfd2FpdGVyX25vZGUpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF3YWl0ZXIpIHsKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiJXMgLSBvdXQgb2YgbWVtb3J5IiwgX19mdW5jX18pOworCQkJcmV0dXJuIFZDSElRX0VSUk9SOworCQl9CisJfQorCisJc3RhdHVzID0gdmNoaXFfYnVsa190cmFuc2ZlcihoYW5kbGUsIFZDSElfTUVNX0hBTkRMRV9JTlZBTElELAorCQlkYXRhLCBzaXplLCAmd2FpdGVyLT5idWxrX3dhaXRlciwgVkNISVFfQlVMS19NT0RFX0JMT0NLSU5HLAorCQlkaXIpOworCWlmICgoc3RhdHVzICE9IFZDSElRX1JFVFJZKSB8fCBmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSB8fAorCQkhd2FpdGVyLT5idWxrX3dhaXRlci5idWxrKSB7CisJCVZDSElRX0JVTEtfVCAqYnVsayA9IHdhaXRlci0+YnVsa193YWl0ZXIuYnVsazsKKwkJaWYgKGJ1bGspIHsKKwkJCS8qIENhbmNlbCB0aGUgc2lnbmFsIHdoZW4gdGhlIHRyYW5zZmVyCisJCQkgKiogY29tcGxldGVzLiAqLworCQkJc3Bpbl9sb2NrKCZidWxrX3dhaXRlcl9zcGlubG9jayk7CisJCQlidWxrLT51c2VyZGF0YSA9IE5VTEw7CisJCQlzcGluX3VubG9jaygmYnVsa193YWl0ZXJfc3BpbmxvY2spOworCQl9CisJCWtmcmVlKHdhaXRlcik7CisJfSBlbHNlIHsKKwkJd2FpdGVyLT5waWQgPSBjdXJyZW50LT5waWQ7CisJCW11dGV4X2xvY2soJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0X211dGV4KTsKKwkJbGlzdF9hZGQoJndhaXRlci0+bGlzdCwgJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0KTsKKwkJbXV0ZXhfdW5sb2NrKCZpbnN0YW5jZS0+YnVsa193YWl0ZXJfbGlzdF9tdXRleCk7CisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJInNhdmVkIGJ1bGtfd2FpdGVyICV4IGZvciBwaWQgJWQiLAorCQkJCSh1bnNpZ25lZCBpbnQpd2FpdGVyLCBjdXJyZW50LT5waWQpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2tpbGxhYmxlLmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2tpbGxhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1NDQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfa2lsbGFibGUuaApAQCAtMCwwICsxLDY5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElRX0tJTExBQkxFX0gKKyNkZWZpbmUgVkNISVFfS0lMTEFCTEVfSAorCisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKworI2RlZmluZSBTSFVURE9XTl9TSUdTICAgKHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR0lOVCkgfCBzaWdtYXNrKFNJR1FVSVQpIHwgc2lnbWFzayhTSUdUUkFQKSB8IHNpZ21hc2soU0lHU1RPUCkgfCBzaWdtYXNrKFNJR0NPTlQpKQorCitzdGF0aWMgaW5saW5lIGludCBfX211c3RfY2hlY2sgZG93bl9pbnRlcnJ1cHRpYmxlX2tpbGxhYmxlKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKK3sKKwkvKiBBbGxvdyBpbnRlcmNlcHRpb24gb2Yga2lsbGFibGUgc2lnbmFscyBvbmx5LiBXZSBkb24ndCB3YW50IHRvIGJlIGludGVycnVwdGVkIGJ5IGhhcm1sZXNzIHNpZ25hbHMgbGlrZSBTSUdBTFJNICovCisJaW50IHJldDsKKwlzaWdzZXRfdCBibG9ja2VkLCBvbGRzZXQ7CisJc2lnaW5pdHNldGludigmYmxvY2tlZCwgU0hVVERPV05fU0lHUyk7CisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZibG9ja2VkLCAmb2xkc2V0KTsKKwlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoc2VtKTsKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9sZHNldCwgTlVMTCk7CisJcmV0dXJuIHJldDsKK30KKyNkZWZpbmUgZG93bl9pbnRlcnJ1cHRpYmxlIGRvd25faW50ZXJydXB0aWJsZV9raWxsYWJsZQorCisKK3N0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBtdXRleF9sb2NrX2ludGVycnVwdGlibGVfa2lsbGFibGUoc3RydWN0IG11dGV4ICpsb2NrKQoreworCS8qIEFsbG93IGludGVyY2VwdGlvbiBvZiBraWxsYWJsZSBzaWduYWxzIG9ubHkuIFdlIGRvbid0IHdhbnQgdG8gYmUgaW50ZXJydXB0ZWQgYnkgaGFybWxlc3Mgc2lnbmFscyBsaWtlIFNJR0FMUk0gKi8KKwlpbnQgcmV0OworCXNpZ3NldF90IGJsb2NrZWQsIG9sZHNldDsKKwlzaWdpbml0c2V0aW52KCZibG9ja2VkLCBTSFVURE9XTl9TSUdTKTsKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmJsb2NrZWQsICZvbGRzZXQpOworCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZShsb2NrKTsKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9sZHNldCwgTlVMTCk7CisJcmV0dXJuIHJldDsKK30KKyNkZWZpbmUgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlIG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZV9raWxsYWJsZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfbWVtZHJ2LmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX21lbWRydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMmU3NzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX21lbWRydi5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVkNISVFfTUVNRFJWX0gKKyNkZWZpbmUgVkNISVFfTUVNRFJWX0gKKworLyogLS0tLSBJbmNsdWRlIEZpbGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlICJ2Y2hpcV9pZi5oIgorCisvKiAtLS0tIENvbnN0YW50cyBhbmQgVHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJIHZvaWQgICAgICAgICAgICAgICAgICAgKmFybVNoYXJlZE1lbVZpcnQ7CisJIGRtYV9hZGRyX3QgICAgICAgICAgICAgIGFybVNoYXJlZE1lbVBoeXM7CisJIHNpemVfdCAgICAgICAgICAgICAgICAgIGFybVNoYXJlZE1lbVNpemU7CisKKwkgdm9pZCAgICAgICAgICAgICAgICAgICAqdmNTaGFyZWRNZW1WaXJ0OworCSBkbWFfYWRkcl90ICAgICAgICAgICAgICB2Y1NoYXJlZE1lbVBoeXM7CisJIHNpemVfdCAgICAgICAgICAgICAgICAgIHZjU2hhcmVkTWVtU2l6ZTsKK30gVkNISVFfU0hBUkVEX01FTV9JTkZPX1Q7CisKKy8qIC0tLS0gVmFyaWFibGUgRXh0ZXJucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgdmNoaXFfZ2V0X3NoYXJlZF9tZW1faW5mbyhWQ0hJUV9TSEFSRURfTUVNX0lORk9fVCAqaW5mbyk7CisKK1ZDSElRX1NUQVRVU19UIHZjaGlxX21lbWRydl9pbml0aWFsaXNlKHZvaWQpOworCitWQ0hJUV9TVEFUVVNfVCB2Y2hpcV91c2VyZHJ2X2NyZWF0ZV9pbnN0YW5jZSgKKwljb25zdCBWQ0hJUV9QTEFURk9STV9EQVRBX1QgKiBwbGF0Zm9ybV9kYXRhKTsKKworVkNISVFfU1RBVFVTX1QgdmNoaXFfdXNlcmRydl9zdXNwZW5kKAorCWNvbnN0IFZDSElRX1BMQVRGT1JNX0RBVEFfVCAqIHBsYXRmb3JtX2RhdGEpOworCitWQ0hJUV9TVEFUVVNfVCB2Y2hpcV91c2VyZHJ2X3Jlc3VtZSgKKwljb25zdCBWQ0hJUV9QTEFURk9STV9EQVRBX1QgKiBwbGF0Zm9ybV9kYXRhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX3BhZ2VsaXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX3BhZ2VsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhM2VjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfcGFnZWxpc3QuaApAQCAtMCwwICsxLDU4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElRX1BBR0VMSVNUX0gKKyNkZWZpbmUgVkNISVFfUEFHRUxJU1RfSAorCisjaWZuZGVmIFBBR0VfU0laRQorI2RlZmluZSBQQUdFX1NJWkUgNDA5NgorI2VuZGlmCisjZGVmaW5lIENBQ0hFX0xJTkVfU0laRSAzMgorI2RlZmluZSBQQUdFTElTVF9XUklURSAwCisjZGVmaW5lIFBBR0VMSVNUX1JFQUQgMQorI2RlZmluZSBQQUdFTElTVF9SRUFEX1dJVEhfRlJBR01FTlRTIDIKKwordHlwZWRlZiBzdHJ1Y3QgcGFnZWxpc3Rfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGxlbmd0aDsKKwl1bnNpZ25lZCBzaG9ydCB0eXBlOworCXVuc2lnbmVkIHNob3J0IG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIGFkZHJzWzFdOwkvKiBOLkIuIDEyIExTQnMgaG9sZCB0aGUgbnVtYmVyIG9mIGZvbGxvd2luZworCQkJCSAgIHBhZ2VzIGF0IGNvbnNlY3V0aXZlIGFkZHJlc3Nlcy4gKi8KK30gUEFHRUxJU1RfVDsKKwordHlwZWRlZiBzdHJ1Y3QgZnJhZ21lbnRzX3N0cnVjdCB7CisJY2hhciBoZWFkYnVmW0NBQ0hFX0xJTkVfU0laRV07CisJY2hhciB0YWlsYnVmW0NBQ0hFX0xJTkVfU0laRV07Cit9IEZSQUdNRU5UU19UOworCisjZW5kaWYgLyogVkNISVFfUEFHRUxJU1RfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9zaGltLmMgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX3NoaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDcyZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9zaGltLmMKQEAgLTAsMCArMSw4NjAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS92Y2hpL3ZjaGkuaCIKKyNpbmNsdWRlICJ2Y2hpcS5oIgorI2luY2x1ZGUgInZjaGlxX2NvcmUuaCIKKworI2luY2x1ZGUgInZjaGlxX3V0aWwuaCIKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjZGVmaW5lIHZjaGlxX3N0YXR1c190b192Y2hpKHN0YXR1cykgKChpbnQzMl90KXN0YXR1cykKKwordHlwZWRlZiBzdHJ1Y3QgeworCVZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlOworCisJVkNISVVfUVVFVUVfVCBxdWV1ZTsKKworCVZDSElfQ0FMTEJBQ0tfVCBjYWxsYmFjazsKKwl2b2lkICpjYWxsYmFja19wYXJhbTsKK30gU0hJTV9TRVJWSUNFX1Q7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJldHVybiBwb2ludGVyIHRvIHRoZSBtcGhpIG1lc3NhZ2UgZHJpdmVyIGZ1bmN0aW9uIHRhYmxlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworY29uc3QgVkNISV9NRVNTQUdFX0RSSVZFUl9UICoKK3ZjaGlfbXBoaV9tZXNzYWdlX2RyaXZlcl9mdW5jX3RhYmxlKHZvaWQpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlICdzaW5nbGUnIGNvbm5lY3Rpb24gZHJpdmVyIGZvcHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitjb25zdCBWQ0hJX0NPTk5FQ1RJT05fQVBJX1QgKgorc2luZ2xlX2dldF9mdW5jX3RhYmxlKHZvaWQpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK1ZDSElfQ09OTkVDVElPTl9UICp2Y2hpX2NyZWF0ZV9jb25uZWN0aW9uKAorCWNvbnN0IFZDSElfQ09OTkVDVElPTl9BUElfVCAqZnVuY3Rpb25fdGFibGUsCisJY29uc3QgVkNISV9NRVNTQUdFX0RSSVZFUl9UICpsb3dfbGV2ZWwpCit7CisJKHZvaWQpZnVuY3Rpb25fdGFibGU7CisJKHZvaWQpbG93X2xldmVsOworCXJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfbXNnX3BlZWsKKyAqCisgKiBBcmd1bWVudHM6ICBjb25zdCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICogICAgICAgICAgICAgdm9pZCAqKmRhdGEsCisgKiAgICAgICAgICAgICB1aW50MzJfdCAqbXNnX3NpemUsCisKKworICogICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzCisgKgorICogRGVzY3JpcHRpb246IFJvdXRpbmUgdG8gcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBtZXNzYWdlICh0byBhbGxvdyBpbgorICogICAgICAgICAgICAgIHBsYWNlIHByb2Nlc3NpbmcpLiBUaGUgbWVzc2FnZSBjYW4gYmUgcmVtb3ZlZCB1c2luZworICogICAgICAgICAgICAgIHZjaGlfbXNnX3JlbW92ZSB3aGVuIHlvdSdyZSBmaW5pc2hlZAorICoKKyAqIFJldHVybnM6IGludDMyX3QgLSBzdWNjZXNzID09IDAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IHZjaGlfbXNnX3BlZWsoVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKwl2b2lkICoqZGF0YSwKKwl1aW50MzJfdCAqbXNnX3NpemUsCisJVkNISV9GTEFHU19UIGZsYWdzKQoreworCVNISU1fU0VSVklDRV9UICpzZXJ2aWNlID0gKFNISU1fU0VSVklDRV9UICopaGFuZGxlOworCVZDSElRX0hFQURFUl9UICpoZWFkZXI7CisKKwlXQVJOX09OKChmbGFncyAhPSBWQ0hJX0ZMQUdTX05PTkUpICYmCisJCShmbGFncyAhPSBWQ0hJX0ZMQUdTX0JMT0NLX1VOVElMX09QX0NPTVBMRVRFKSk7CisKKwlpZiAoZmxhZ3MgPT0gVkNISV9GTEFHU19OT05FKQorCQlpZiAodmNoaXVfcXVldWVfaXNfZW1wdHkoJnNlcnZpY2UtPnF1ZXVlKSkKKwkJCXJldHVybiAtMTsKKworCWhlYWRlciA9IHZjaGl1X3F1ZXVlX3BlZWsoJnNlcnZpY2UtPnF1ZXVlKTsKKworCSpkYXRhID0gaGVhZGVyLT5kYXRhOworCSptc2dfc2l6ZSA9IGhlYWRlci0+c2l6ZTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX21zZ19wZWVrKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOYW1lOiB2Y2hpX21zZ19yZW1vdmUKKyAqCisgKiBBcmd1bWVudHM6ICBjb25zdCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICoKKyAqIERlc2NyaXB0aW9uOiBSb3V0aW5lIHRvIHJlbW92ZSBhIG1lc3NhZ2UgKGFmdGVyIGl0IGhhcyBiZWVuIHJlYWQgd2l0aAorICogICAgICAgICAgICAgIHZjaGlfbXNnX3BlZWspCisgKgorICogUmV0dXJuczogaW50MzJfdCAtIHN1Y2Nlc3MgPT0gMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgdmNoaV9tc2dfcmVtb3ZlKFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpCit7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSAoU0hJTV9TRVJWSUNFX1QgKiloYW5kbGU7CisJVkNISVFfSEVBREVSX1QgKmhlYWRlcjsKKworCWhlYWRlciA9IHZjaGl1X3F1ZXVlX3BvcCgmc2VydmljZS0+cXVldWUpOworCisJdmNoaXFfcmVsZWFzZV9tZXNzYWdlKHNlcnZpY2UtPmhhbmRsZSwgaGVhZGVyKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX21zZ19yZW1vdmUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfbXNnX3F1ZXVlCisgKgorICogQXJndW1lbnRzOiAgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKyAqICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgKiAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX3NpemUsCisgKiAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgKiAgICAgICAgICAgICB2b2lkICptc2dfaGFuZGxlLAorICoKKyAqIERlc2NyaXB0aW9uOiBUaGluIHdyYXBwZXIgdG8gcXVldWUgYSBtZXNzYWdlIG9udG8gYSBjb25uZWN0aW9uCisgKgorICogUmV0dXJuczogaW50MzJfdCAtIHN1Y2Nlc3MgPT0gMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgdmNoaV9tc2dfcXVldWUoVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKwljb25zdCB2b2lkICpkYXRhLAorCXVpbnQzMl90IGRhdGFfc2l6ZSwKKwlWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisJdm9pZCAqbXNnX2hhbmRsZSkKK3sKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IChTSElNX1NFUlZJQ0VfVCAqKWhhbmRsZTsKKwlWQ0hJUV9FTEVNRU5UX1QgZWxlbWVudCA9IHtkYXRhLCBkYXRhX3NpemV9OworCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKworCSh2b2lkKW1zZ19oYW5kbGU7CisKKwlXQVJOX09OKGZsYWdzICE9IFZDSElfRkxBR1NfQkxPQ0tfVU5USUxfUVVFVUVEKTsKKworCXN0YXR1cyA9IHZjaGlxX3F1ZXVlX21lc3NhZ2Uoc2VydmljZS0+aGFuZGxlLCAmZWxlbWVudCwgMSk7CisKKwkvKiB2Y2hpcV9xdWV1ZV9tZXNzYWdlKCkgbWF5IHJldHVybiBWQ0hJUV9SRVRSWSwgc28gd2UgbmVlZCB0bworCSoqIGltcGxlbWVudCBhIHJldHJ5IG1lY2hhbmlzbSBzaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkCisJKiogdG8gYmxvY2sgdW50aWwgcXVldWVkCisJKi8KKwl3aGlsZSAoc3RhdHVzID09IFZDSElRX1JFVFJZKSB7CisJCW1zbGVlcCgxKTsKKwkJc3RhdHVzID0gdmNoaXFfcXVldWVfbWVzc2FnZShzZXJ2aWNlLT5oYW5kbGUsICZlbGVtZW50LCAxKTsKKwl9CisKKwlyZXR1cm4gdmNoaXFfc3RhdHVzX3RvX3ZjaGkoc3RhdHVzKTsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9tc2dfcXVldWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfYnVsa19xdWV1ZV9yZWNlaXZlCisgKgorICogQXJndW1lbnRzOiAgVkNISV9CVUxLX0hBTkRMRV9UIGhhbmRsZSwKKyAqICAgICAgICAgICAgIHZvaWQgKmRhdGFfZHN0LAorICogICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZGF0YV9zaXplLAorICogICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzCisgKiAgICAgICAgICAgICB2b2lkICpidWxrX2hhbmRsZQorICoKKyAqIERlc2NyaXB0aW9uOiBSb3V0aW5lIHRvIHNldHVwIGEgcmN2IGJ1ZmZlcgorICoKKyAqIFJldHVybnM6IGludDMyX3QgLSBzdWNjZXNzID09IDAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IHZjaGlfYnVsa19xdWV1ZV9yZWNlaXZlKFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisJdm9pZCAqZGF0YV9kc3QsCisJdWludDMyX3QgZGF0YV9zaXplLAorCVZDSElfRkxBR1NfVCBmbGFncywKKwl2b2lkICpidWxrX2hhbmRsZSkKK3sKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IChTSElNX1NFUlZJQ0VfVCAqKWhhbmRsZTsKKwlWQ0hJUV9CVUxLX01PREVfVCBtb2RlOworCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKworCXN3aXRjaCAoKGludClmbGFncykgeworCWNhc2UgVkNISV9GTEFHU19DQUxMQkFDS19XSEVOX09QX0NPTVBMRVRFCisJCXwgVkNISV9GTEFHU19CTE9DS19VTlRJTF9RVUVVRUQ6CisJCVdBUk5fT04oIXNlcnZpY2UtPmNhbGxiYWNrKTsKKwkJbW9kZSA9IFZDSElRX0JVTEtfTU9ERV9DQUxMQkFDSzsKKwkJYnJlYWs7CisJY2FzZSBWQ0hJX0ZMQUdTX0JMT0NLX1VOVElMX09QX0NPTVBMRVRFOgorCQltb2RlID0gVkNISVFfQlVMS19NT0RFX0JMT0NLSU5HOworCQlicmVhazsKKwljYXNlIFZDSElfRkxBR1NfQkxPQ0tfVU5USUxfUVVFVUVEOgorCWNhc2UgVkNISV9GTEFHU19OT05FOgorCQltb2RlID0gVkNISVFfQlVMS19NT0RFX05PQ0FMTEJBQ0s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk4oMSwgInVuc3VwcG9ydGVkIG1lc3NhZ2VcbiIpOworCQlyZXR1cm4gdmNoaXFfc3RhdHVzX3RvX3ZjaGkoVkNISVFfRVJST1IpOworCX0KKworCXN0YXR1cyA9IHZjaGlxX2J1bGtfcmVjZWl2ZShzZXJ2aWNlLT5oYW5kbGUsIGRhdGFfZHN0LCBkYXRhX3NpemUsCisJCWJ1bGtfaGFuZGxlLCBtb2RlKTsKKworCS8qIHZjaGlxX2J1bGtfcmVjZWl2ZSgpIG1heSByZXR1cm4gVkNISVFfUkVUUlksIHNvIHdlIG5lZWQgdG8KKwkqKiBpbXBsZW1lbnQgYSByZXRyeSBtZWNoYW5pc20gc2luY2UgdGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZAorCSoqIHRvIGJsb2NrIHVudGlsIHF1ZXVlZAorCSovCisJd2hpbGUgKHN0YXR1cyA9PSBWQ0hJUV9SRVRSWSkgeworCQltc2xlZXAoMSk7CisJCXN0YXR1cyA9IHZjaGlxX2J1bGtfcmVjZWl2ZShzZXJ2aWNlLT5oYW5kbGUsIGRhdGFfZHN0LAorCQkJZGF0YV9zaXplLCBidWxrX2hhbmRsZSwgbW9kZSk7CisJfQorCisJcmV0dXJuIHZjaGlxX3N0YXR1c190b192Y2hpKHN0YXR1cyk7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlfYnVsa19xdWV1ZV9yZWNlaXZlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOYW1lOiB2Y2hpX2J1bGtfcXVldWVfdHJhbnNtaXQKKyAqCisgKiBBcmd1bWVudHM6ICBWQ0hJX0JVTEtfSEFORExFX1QgaGFuZGxlLAorICogICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YV9zcmMsCisgKiAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX3NpemUsCisgKiAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgKiAgICAgICAgICAgICB2b2lkICpidWxrX2hhbmRsZQorICoKKyAqIERlc2NyaXB0aW9uOiBSb3V0aW5lIHRvIHRyYW5zbWl0IHNvbWUgZGF0YQorICoKKyAqIFJldHVybnM6IGludDMyX3QgLSBzdWNjZXNzID09IDAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IHZjaGlfYnVsa19xdWV1ZV90cmFuc21pdChWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorCWNvbnN0IHZvaWQgKmRhdGFfc3JjLAorCXVpbnQzMl90IGRhdGFfc2l6ZSwKKwlWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisJdm9pZCAqYnVsa19oYW5kbGUpCit7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSAoU0hJTV9TRVJWSUNFX1QgKiloYW5kbGU7CisJVkNISVFfQlVMS19NT0RFX1QgbW9kZTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXM7CisKKwlzd2l0Y2ggKChpbnQpZmxhZ3MpIHsKKwljYXNlIFZDSElfRkxBR1NfQ0FMTEJBQ0tfV0hFTl9PUF9DT01QTEVURQorCQl8IFZDSElfRkxBR1NfQkxPQ0tfVU5USUxfUVVFVUVEOgorCQlXQVJOX09OKCFzZXJ2aWNlLT5jYWxsYmFjayk7CisJCW1vZGUgPSBWQ0hJUV9CVUxLX01PREVfQ0FMTEJBQ0s7CisJCWJyZWFrOworCWNhc2UgVkNISV9GTEFHU19CTE9DS19VTlRJTF9EQVRBX1JFQUQ6CisJY2FzZSBWQ0hJX0ZMQUdTX0JMT0NLX1VOVElMX09QX0NPTVBMRVRFOgorCQltb2RlID0gVkNISVFfQlVMS19NT0RFX0JMT0NLSU5HOworCQlicmVhazsKKwljYXNlIFZDSElfRkxBR1NfQkxPQ0tfVU5USUxfUVVFVUVEOgorCWNhc2UgVkNISV9GTEFHU19OT05FOgorCQltb2RlID0gVkNISVFfQlVMS19NT0RFX05PQ0FMTEJBQ0s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk4oMSwgInVuc3VwcG9ydGVkIG1lc3NhZ2VcbiIpOworCQlyZXR1cm4gdmNoaXFfc3RhdHVzX3RvX3ZjaGkoVkNISVFfRVJST1IpOworCX0KKworCXN0YXR1cyA9IHZjaGlxX2J1bGtfdHJhbnNtaXQoc2VydmljZS0+aGFuZGxlLCBkYXRhX3NyYywgZGF0YV9zaXplLAorCQlidWxrX2hhbmRsZSwgbW9kZSk7CisKKwkvKiB2Y2hpcV9idWxrX3RyYW5zbWl0KCkgbWF5IHJldHVybiBWQ0hJUV9SRVRSWSwgc28gd2UgbmVlZCB0bworCSoqIGltcGxlbWVudCBhIHJldHJ5IG1lY2hhbmlzbSBzaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkCisJKiogdG8gYmxvY2sgdW50aWwgcXVldWVkCisJKi8KKwl3aGlsZSAoc3RhdHVzID09IFZDSElRX1JFVFJZKSB7CisJCW1zbGVlcCgxKTsKKwkJc3RhdHVzID0gdmNoaXFfYnVsa190cmFuc21pdChzZXJ2aWNlLT5oYW5kbGUsIGRhdGFfc3JjLAorCQkJZGF0YV9zaXplLCBidWxrX2hhbmRsZSwgbW9kZSk7CisJfQorCisJcmV0dXJuIHZjaGlxX3N0YXR1c190b192Y2hpKHN0YXR1cyk7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlfYnVsa19xdWV1ZV90cmFuc21pdCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTmFtZTogdmNoaV9tc2dfZGVxdWV1ZQorICoKKyAqIEFyZ3VtZW50czogIFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisgKiAgICAgICAgICAgICB2b2lkICpkYXRhLAorICogICAgICAgICAgICAgdWludDMyX3QgbWF4X2RhdGFfc2l6ZV90b19yZWFkLAorICogICAgICAgICAgICAgdWludDMyX3QgKmFjdHVhbF9tc2dfc2l6ZQorICogICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzCisgKgorICogRGVzY3JpcHRpb246IFJvdXRpbmUgdG8gZGVxdWV1ZSBhIG1lc3NhZ2UgaW50byB0aGUgc3VwcGxpZWQgYnVmZmVyCisgKgorICogUmV0dXJuczogaW50MzJfdCAtIHN1Y2Nlc3MgPT0gMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgdmNoaV9tc2dfZGVxdWV1ZShWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorCXZvaWQgKmRhdGEsCisJdWludDMyX3QgbWF4X2RhdGFfc2l6ZV90b19yZWFkLAorCXVpbnQzMl90ICphY3R1YWxfbXNnX3NpemUsCisJVkNISV9GTEFHU19UIGZsYWdzKQoreworCVNISU1fU0VSVklDRV9UICpzZXJ2aWNlID0gKFNISU1fU0VSVklDRV9UICopaGFuZGxlOworCVZDSElRX0hFQURFUl9UICpoZWFkZXI7CisKKwlXQVJOX09OKChmbGFncyAhPSBWQ0hJX0ZMQUdTX05PTkUpICYmCisJCShmbGFncyAhPSBWQ0hJX0ZMQUdTX0JMT0NLX1VOVElMX09QX0NPTVBMRVRFKSk7CisKKwlpZiAoZmxhZ3MgPT0gVkNISV9GTEFHU19OT05FKQorCQlpZiAodmNoaXVfcXVldWVfaXNfZW1wdHkoJnNlcnZpY2UtPnF1ZXVlKSkKKwkJCXJldHVybiAtMTsKKworCWhlYWRlciA9IHZjaGl1X3F1ZXVlX3BvcCgmc2VydmljZS0+cXVldWUpOworCisJbWVtY3B5KGRhdGEsIGhlYWRlci0+ZGF0YSwgaGVhZGVyLT5zaXplIDwgbWF4X2RhdGFfc2l6ZV90b19yZWFkID8KKwkJaGVhZGVyLT5zaXplIDogbWF4X2RhdGFfc2l6ZV90b19yZWFkKTsKKworCSphY3R1YWxfbXNnX3NpemUgPSBoZWFkZXItPnNpemU7CisKKwl2Y2hpcV9yZWxlYXNlX21lc3NhZ2Uoc2VydmljZS0+aGFuZGxlLCBoZWFkZXIpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlfbXNnX2RlcXVldWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfbXNnX3F1ZXVldgorICoKKyAqIEFyZ3VtZW50czogIFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisgKiAgICAgICAgICAgICBWQ0hJX01TR19WRUNUT1JfVCAqdmVjdG9yLAorICogICAgICAgICAgICAgdWludDMyX3QgY291bnQsCisgKiAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgKiAgICAgICAgICAgICB2b2lkICptc2dfaGFuZGxlCisgKgorICogRGVzY3JpcHRpb246IFRoaW4gd3JhcHBlciB0byBxdWV1ZSBhIG1lc3NhZ2Ugb250byBhIGNvbm5lY3Rpb24KKyAqCisgKiBSZXR1cm5zOiBpbnQzMl90IC0gc3VjY2VzcyA9PSAwCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2Y2hpcV9zdGF0aWNfYXNzZXJ0KHNpemVvZihWQ0hJX01TR19WRUNUT1JfVCkgPT0gc2l6ZW9mKFZDSElRX0VMRU1FTlRfVCkpOwordmNoaXFfc3RhdGljX2Fzc2VydChvZmZzZXRvZihWQ0hJX01TR19WRUNUT1JfVCwgdmVjX2Jhc2UpID09CisJb2Zmc2V0b2YoVkNISVFfRUxFTUVOVF9ULCBkYXRhKSk7Cit2Y2hpcV9zdGF0aWNfYXNzZXJ0KG9mZnNldG9mKFZDSElfTVNHX1ZFQ1RPUl9ULCB2ZWNfbGVuKSA9PQorCW9mZnNldG9mKFZDSElRX0VMRU1FTlRfVCwgc2l6ZSkpOworCitpbnQzMl90IHZjaGlfbXNnX3F1ZXVldihWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorCVZDSElfTVNHX1ZFQ1RPUl9UICp2ZWN0b3IsCisJdWludDMyX3QgY291bnQsCisJVkNISV9GTEFHU19UIGZsYWdzLAorCXZvaWQgKm1zZ19oYW5kbGUpCit7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSAoU0hJTV9TRVJWSUNFX1QgKiloYW5kbGU7CisKKwkodm9pZCltc2dfaGFuZGxlOworCisJV0FSTl9PTihmbGFncyAhPSBWQ0hJX0ZMQUdTX0JMT0NLX1VOVElMX1FVRVVFRCk7CisKKwlyZXR1cm4gdmNoaXFfc3RhdHVzX3RvX3ZjaGkodmNoaXFfcXVldWVfbWVzc2FnZShzZXJ2aWNlLT5oYW5kbGUsCisJCShjb25zdCBWQ0hJUV9FTEVNRU5UX1QgKil2ZWN0b3IsIGNvdW50KSk7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlfbXNnX3F1ZXVldik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTmFtZTogdmNoaV9oZWxkX21zZ19yZWxlYXNlCisgKgorICogQXJndW1lbnRzOiAgVkNISV9IRUxEX01TR19UICptZXNzYWdlCisgKgorICogRGVzY3JpcHRpb246IFJvdXRpbmUgdG8gcmVsZWFzZSBhIGhlbGQgbWVzc2FnZSAoYWZ0ZXIgaXQgaGFzIGJlZW4gcmVhZCB3aXRoCisgKiAgICAgICAgICAgICAgdmNoaV9tc2dfaG9sZCkKKyAqCisgKiBSZXR1cm5zOiBpbnQzMl90IC0gc3VjY2VzcyA9PSAwCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCB2Y2hpX2hlbGRfbXNnX3JlbGVhc2UoVkNISV9IRUxEX01TR19UICptZXNzYWdlKQoreworCXZjaGlxX3JlbGVhc2VfbWVzc2FnZSgoVkNISVFfU0VSVklDRV9IQU5ETEVfVCltZXNzYWdlLT5zZXJ2aWNlLAorCQkoVkNISVFfSEVBREVSX1QgKiltZXNzYWdlLT5tZXNzYWdlKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX2hlbGRfbXNnX3JlbGVhc2UpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfbXNnX2hvbGQKKyAqCisgKiBBcmd1bWVudHM6ICBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICogICAgICAgICAgICAgdm9pZCAqKmRhdGEsCisgKiAgICAgICAgICAgICB1aW50MzJfdCAqbXNnX3NpemUsCisgKiAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgKiAgICAgICAgICAgICBWQ0hJX0hFTERfTVNHX1QgKm1lc3NhZ2VfaGFuZGxlCisgKgorICogRGVzY3JpcHRpb246IFJvdXRpbmUgdG8gcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBtZXNzYWdlICh0byBhbGxvdworICogICAgICAgICAgICAgIGluIHBsYWNlIHByb2Nlc3NpbmcpLiBUaGUgbWVzc2FnZSBpcyBkZXF1ZXVlZCAtIGRvbid0IGZvcmdldAorICogICAgICAgICAgICAgIHRvIHJlbGVhc2UgdGhlIG1lc3NhZ2UgdXNpbmcgdmNoaV9oZWxkX21zZ19yZWxlYXNlIHdoZW4geW91J3JlCisgKiAgICAgICAgICAgICAgZmluaXNoZWQuCisgKgorICogUmV0dXJuczogaW50MzJfdCAtIHN1Y2Nlc3MgPT0gMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgdmNoaV9tc2dfaG9sZChWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorCXZvaWQgKipkYXRhLAorCXVpbnQzMl90ICptc2dfc2l6ZSwKKwlWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisJVkNISV9IRUxEX01TR19UICptZXNzYWdlX2hhbmRsZSkKK3sKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IChTSElNX1NFUlZJQ0VfVCAqKWhhbmRsZTsKKwlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyOworCisJV0FSTl9PTigoZmxhZ3MgIT0gVkNISV9GTEFHU19OT05FKSAmJgorCQkoZmxhZ3MgIT0gVkNISV9GTEFHU19CTE9DS19VTlRJTF9PUF9DT01QTEVURSkpOworCisJaWYgKGZsYWdzID09IFZDSElfRkxBR1NfTk9ORSkKKwkJaWYgKHZjaGl1X3F1ZXVlX2lzX2VtcHR5KCZzZXJ2aWNlLT5xdWV1ZSkpCisJCQlyZXR1cm4gLTE7CisKKwloZWFkZXIgPSB2Y2hpdV9xdWV1ZV9wb3AoJnNlcnZpY2UtPnF1ZXVlKTsKKworCSpkYXRhID0gaGVhZGVyLT5kYXRhOworCSptc2dfc2l6ZSA9IGhlYWRlci0+c2l6ZTsKKworCW1lc3NhZ2VfaGFuZGxlLT5zZXJ2aWNlID0KKwkJKHN0cnVjdCBvcGFxdWVfdmNoaV9zZXJ2aWNlX3QgKilzZXJ2aWNlLT5oYW5kbGU7CisJbWVzc2FnZV9oYW5kbGUtPm1lc3NhZ2UgPSBoZWFkZXI7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9tc2dfaG9sZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTmFtZTogdmNoaV9pbml0aWFsaXNlCisgKgorICogQXJndW1lbnRzOiBWQ0hJX0lOU1RBTkNFX1QgKmluc3RhbmNlX2hhbmRsZQorICoKKyAqIERlc2NyaXB0aW9uOiBJbml0aWFsaXNlcyB0aGUgaGFyZHdhcmUgYnV0IGRvZXMgbm90IHRyYW5zbWl0IGFueXRoaW5nCisgKiAgICAgICAgICAgICAgV2hlbiBydW4gYXMgYSBIb3N0IEFwcCB0aGlzIHdpbGwgYmUgY2FsbGVkIHR3aWNlIGhlbmNlIHRoZSBuZWVkCisgKiAgICAgICAgICAgICAgdG8gbWFsbG9jIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbgorICoKKyAqIFJldHVybnM6IDAgaWYgc3VjY2Vzc2Z1bCwgZmFpbHVyZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludDMyX3QgdmNoaV9pbml0aWFsaXNlKFZDSElfSU5TVEFOQ0VfVCAqaW5zdGFuY2VfaGFuZGxlKQoreworCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2U7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCisJc3RhdHVzID0gdmNoaXFfaW5pdGlhbGlzZSgmaW5zdGFuY2UpOworCisJKmluc3RhbmNlX2hhbmRsZSA9IChWQ0hJX0lOU1RBTkNFX1QpaW5zdGFuY2U7CisKKwlyZXR1cm4gdmNoaXFfc3RhdHVzX3RvX3ZjaGkoc3RhdHVzKTsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9pbml0aWFsaXNlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOYW1lOiB2Y2hpX2Nvbm5lY3QKKyAqCisgKiBBcmd1bWVudHM6IFZDSElfQ09OTkVDVElPTl9UICoqY29ubmVjdGlvbnMKKyAqICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbnVtX2Nvbm5lY3Rpb25zCisgKiAgICAgICAgICAgIFZDSElfSU5TVEFOQ0VfVCBpbnN0YW5jZV9oYW5kbGUpCisgKgorICogRGVzY3JpcHRpb246IFN0YXJ0cyB0aGUgY29tbWFuZCBzZXJ2aWNlIG9uIGVhY2ggY29ubmVjdGlvbiwKKyAqICAgICAgICAgICAgICBjYXVzaW5nIElOSVQgbWVzc2FnZXMgdG8gYmUgcGluZ2VkIGJhY2sgYW5kIGZvcnRoCisgKgorICogUmV0dXJuczogMCBpZiBzdWNjZXNzZnVsLCBmYWlsdXJlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgdmNoaV9jb25uZWN0KFZDSElfQ09OTkVDVElPTl9UICoqY29ubmVjdGlvbnMsCisJY29uc3QgdWludDMyX3QgbnVtX2Nvbm5lY3Rpb25zLAorCVZDSElfSU5TVEFOQ0VfVCBpbnN0YW5jZV9oYW5kbGUpCit7CisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSA9IChWQ0hJUV9JTlNUQU5DRV9UKWluc3RhbmNlX2hhbmRsZTsKKworCSh2b2lkKWNvbm5lY3Rpb25zOworCSh2b2lkKW51bV9jb25uZWN0aW9uczsKKworCXJldHVybiB2Y2hpcV9jb25uZWN0KGluc3RhbmNlKTsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9jb25uZWN0KTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfZGlzY29ubmVjdAorICoKKyAqIEFyZ3VtZW50czogVkNISV9JTlNUQU5DRV9UIGluc3RhbmNlX2hhbmRsZQorICoKKyAqIERlc2NyaXB0aW9uOiBTdG9wcyB0aGUgY29tbWFuZCBzZXJ2aWNlIG9uIGVhY2ggY29ubmVjdGlvbiwKKyAqICAgICAgICAgICAgICBjYXVzaW5nIERFLUlOSVQgbWVzc2FnZXMgdG8gYmUgcGluZ2VkIGJhY2sgYW5kIGZvcnRoCisgKgorICogUmV0dXJuczogMCBpZiBzdWNjZXNzZnVsLCBmYWlsdXJlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgdmNoaV9kaXNjb25uZWN0KFZDSElfSU5TVEFOQ0VfVCBpbnN0YW5jZV9oYW5kbGUpCit7CisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSA9IChWQ0hJUV9JTlNUQU5DRV9UKWluc3RhbmNlX2hhbmRsZTsKKwlyZXR1cm4gdmNoaXFfc3RhdHVzX3RvX3ZjaGkodmNoaXFfc2h1dGRvd24oaW5zdGFuY2UpKTsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9kaXNjb25uZWN0KTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfc2VydmljZV9vcGVuCisgKiBOYW1lOiB2Y2hpX3NlcnZpY2VfY3JlYXRlCisgKgorICogQXJndW1lbnRzOiBWQ0hJX0lOU1RBTkNFX1QgKmluc3RhbmNlX2hhbmRsZQorICogICAgICAgICAgICBTRVJWSUNFX0NSRUFUSU9OX1QgKnNldHVwLAorICogICAgICAgICAgICBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgKmhhbmRsZQorICoKKyAqIERlc2NyaXB0aW9uOiBSb3V0aW5lIHRvIG9wZW4gYSBzZXJ2aWNlCisgKgorICogUmV0dXJuczogaW50MzJfdCAtIHN1Y2Nlc3MgPT0gMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIFZDSElRX1NUQVRVU19UIHNoaW1fY2FsbGJhY2soVkNISVFfUkVBU09OX1QgcmVhc29uLAorCVZDSElRX0hFQURFUl9UICpoZWFkZXIsIFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLCB2b2lkICpidWxrX3VzZXIpCit7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPQorCQkoU0hJTV9TRVJWSUNFX1QgKilWQ0hJUV9HRVRfU0VSVklDRV9VU0VSREFUQShoYW5kbGUpOworCisgICAgICAgIGlmICghc2VydmljZS0+Y2FsbGJhY2spCisJCWdvdG8gcmVsZWFzZTsKKworCXN3aXRjaCAocmVhc29uKSB7CisJY2FzZSBWQ0hJUV9NRVNTQUdFX0FWQUlMQUJMRToKKwkJdmNoaXVfcXVldWVfcHVzaCgmc2VydmljZS0+cXVldWUsIGhlYWRlcik7CisKKwkJc2VydmljZS0+Y2FsbGJhY2soc2VydmljZS0+Y2FsbGJhY2tfcGFyYW0sCisJCQkJICBWQ0hJX0NBTExCQUNLX01TR19BVkFJTEFCTEUsIE5VTEwpOworCisJCWdvdG8gZG9uZTsKKwkJYnJlYWs7CisKKwljYXNlIFZDSElRX0JVTEtfVFJBTlNNSVRfRE9ORToKKwkJc2VydmljZS0+Y2FsbGJhY2soc2VydmljZS0+Y2FsbGJhY2tfcGFyYW0sCisJCQkJICBWQ0hJX0NBTExCQUNLX0JVTEtfU0VOVCwgYnVsa191c2VyKTsKKwkJYnJlYWs7CisKKwljYXNlIFZDSElRX0JVTEtfUkVDRUlWRV9ET05FOgorCQlzZXJ2aWNlLT5jYWxsYmFjayhzZXJ2aWNlLT5jYWxsYmFja19wYXJhbSwKKwkJCQkgIFZDSElfQ0FMTEJBQ0tfQlVMS19SRUNFSVZFRCwgYnVsa191c2VyKTsKKwkJYnJlYWs7CisKKwljYXNlIFZDSElRX1NFUlZJQ0VfQ0xPU0VEOgorCQlzZXJ2aWNlLT5jYWxsYmFjayhzZXJ2aWNlLT5jYWxsYmFja19wYXJhbSwKKwkJCQkgIFZDSElfQ0FMTEJBQ0tfU0VSVklDRV9DTE9TRUQsIE5VTEwpOworCQlicmVhazsKKworCWNhc2UgVkNISVFfU0VSVklDRV9PUEVORUQ6CisJCS8qIE5vIGVxdWl2YWxlbnQgVkNISSByZWFzb24gKi8KKwkJYnJlYWs7CisKKwljYXNlIFZDSElRX0JVTEtfVFJBTlNNSVRfQUJPUlRFRDoKKwkJc2VydmljZS0+Y2FsbGJhY2soc2VydmljZS0+Y2FsbGJhY2tfcGFyYW0sCisJCQkJICBWQ0hJX0NBTExCQUNLX0JVTEtfVFJBTlNNSVRfQUJPUlRFRCwKKwkJCQkgIGJ1bGtfdXNlcik7CisJCWJyZWFrOworCisJY2FzZSBWQ0hJUV9CVUxLX1JFQ0VJVkVfQUJPUlRFRDoKKwkJc2VydmljZS0+Y2FsbGJhY2soc2VydmljZS0+Y2FsbGJhY2tfcGFyYW0sCisJCQkJICBWQ0hJX0NBTExCQUNLX0JVTEtfUkVDRUlWRV9BQk9SVEVELAorCQkJCSAgYnVsa191c2VyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlXQVJOKDEsICJub3Qgc3VwcG9ydGVkXG4iKTsKKwkJYnJlYWs7CisJfQorCityZWxlYXNlOgorICAgICAgICB2Y2hpcV9yZWxlYXNlX21lc3NhZ2Uoc2VydmljZS0+aGFuZGxlLCBoZWFkZXIpOworZG9uZToKKwlyZXR1cm4gVkNISVFfU1VDQ0VTUzsKK30KKworc3RhdGljIFNISU1fU0VSVklDRV9UICpzZXJ2aWNlX2FsbG9jKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UsCisJU0VSVklDRV9DUkVBVElPTl9UICpzZXR1cCkKK3sKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IGt6YWxsb2Moc2l6ZW9mKFNISU1fU0VSVklDRV9UKSwgR0ZQX0tFUk5FTCk7CisKKwkodm9pZClpbnN0YW5jZTsKKworCWlmIChzZXJ2aWNlKSB7CisJCWlmICh2Y2hpdV9xdWV1ZV9pbml0KCZzZXJ2aWNlLT5xdWV1ZSwgNjQpKSB7CisJCQlzZXJ2aWNlLT5jYWxsYmFjayA9IHNldHVwLT5jYWxsYmFjazsKKwkJCXNlcnZpY2UtPmNhbGxiYWNrX3BhcmFtID0gc2V0dXAtPmNhbGxiYWNrX3BhcmFtOworCQl9IGVsc2UgeworCQkJa2ZyZWUoc2VydmljZSk7CisJCQlzZXJ2aWNlID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiBzZXJ2aWNlOworfQorCitzdGF0aWMgdm9pZCBzZXJ2aWNlX2ZyZWUoU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UpCit7CisJaWYgKHNlcnZpY2UpIHsKKwkJdmNoaXVfcXVldWVfZGVsZXRlKCZzZXJ2aWNlLT5xdWV1ZSk7CisJCWtmcmVlKHNlcnZpY2UpOworCX0KK30KKworaW50MzJfdCB2Y2hpX3NlcnZpY2Vfb3BlbihWQ0hJX0lOU1RBTkNFX1QgaW5zdGFuY2VfaGFuZGxlLAorCVNFUlZJQ0VfQ1JFQVRJT05fVCAqc2V0dXAsCisJVkNISV9TRVJWSUNFX0hBTkRMRV9UICpoYW5kbGUpCit7CisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSA9IChWQ0hJUV9JTlNUQU5DRV9UKWluc3RhbmNlX2hhbmRsZTsKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IHNlcnZpY2VfYWxsb2MoaW5zdGFuY2UsIHNldHVwKTsKKworCSpoYW5kbGUgPSAoVkNISV9TRVJWSUNFX0hBTkRMRV9UKXNlcnZpY2U7CisKKwlpZiAoc2VydmljZSkgeworCQlWQ0hJUV9TRVJWSUNFX1BBUkFNU19UIHBhcmFtczsKKwkJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCisJCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CisJCXBhcmFtcy5mb3VyY2MgPSBzZXR1cC0+c2VydmljZV9pZDsKKwkJcGFyYW1zLmNhbGxiYWNrID0gc2hpbV9jYWxsYmFjazsKKwkJcGFyYW1zLnVzZXJkYXRhID0gc2VydmljZTsKKwkJcGFyYW1zLnZlcnNpb24gPSBzZXR1cC0+dmVyc2lvbi52ZXJzaW9uOworCQlwYXJhbXMudmVyc2lvbl9taW4gPSBzZXR1cC0+dmVyc2lvbi52ZXJzaW9uX21pbjsKKworCQlzdGF0dXMgPSB2Y2hpcV9vcGVuX3NlcnZpY2UoaW5zdGFuY2UsICZwYXJhbXMsCisJCQkmc2VydmljZS0+aGFuZGxlKTsKKwkJaWYgKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKSB7CisJCQlzZXJ2aWNlX2ZyZWUoc2VydmljZSk7CisJCQlzZXJ2aWNlID0gTlVMTDsKKwkJCSpoYW5kbGUgPSBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIChzZXJ2aWNlICE9IE5VTEwpID8gMCA6IC0xOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX3NlcnZpY2Vfb3Blbik7CisKK2ludDMyX3QgdmNoaV9zZXJ2aWNlX2NyZWF0ZShWQ0hJX0lOU1RBTkNFX1QgaW5zdGFuY2VfaGFuZGxlLAorCVNFUlZJQ0VfQ1JFQVRJT05fVCAqc2V0dXAsCisJVkNISV9TRVJWSUNFX0hBTkRMRV9UICpoYW5kbGUpCit7CisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSA9IChWQ0hJUV9JTlNUQU5DRV9UKWluc3RhbmNlX2hhbmRsZTsKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IHNlcnZpY2VfYWxsb2MoaW5zdGFuY2UsIHNldHVwKTsKKworCSpoYW5kbGUgPSAoVkNISV9TRVJWSUNFX0hBTkRMRV9UKXNlcnZpY2U7CisKKwlpZiAoc2VydmljZSkgeworCQlWQ0hJUV9TRVJWSUNFX1BBUkFNU19UIHBhcmFtczsKKwkJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCisJCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CisJCXBhcmFtcy5mb3VyY2MgPSBzZXR1cC0+c2VydmljZV9pZDsKKwkJcGFyYW1zLmNhbGxiYWNrID0gc2hpbV9jYWxsYmFjazsKKwkJcGFyYW1zLnVzZXJkYXRhID0gc2VydmljZTsKKwkJcGFyYW1zLnZlcnNpb24gPSBzZXR1cC0+dmVyc2lvbi52ZXJzaW9uOworCQlwYXJhbXMudmVyc2lvbl9taW4gPSBzZXR1cC0+dmVyc2lvbi52ZXJzaW9uX21pbjsKKwkJc3RhdHVzID0gdmNoaXFfYWRkX3NlcnZpY2UoaW5zdGFuY2UsICZwYXJhbXMsICZzZXJ2aWNlLT5oYW5kbGUpOworCisJCWlmIChzdGF0dXMgIT0gVkNISVFfU1VDQ0VTUykgeworCQkJc2VydmljZV9mcmVlKHNlcnZpY2UpOworCQkJc2VydmljZSA9IE5VTEw7CisJCQkqaGFuZGxlID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiAoc2VydmljZSAhPSBOVUxMKSA/IDAgOiAtMTsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9zZXJ2aWNlX2NyZWF0ZSk7CisKK2ludDMyX3QgdmNoaV9zZXJ2aWNlX2Nsb3NlKGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpCit7CisJaW50MzJfdCByZXQgPSAtMTsKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IChTSElNX1NFUlZJQ0VfVCAqKWhhbmRsZTsKKwlpZiAoc2VydmljZSkgeworCQlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSB2Y2hpcV9jbG9zZV9zZXJ2aWNlKHNlcnZpY2UtPmhhbmRsZSk7CisJCWlmIChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykgeworCQkJc2VydmljZV9mcmVlKHNlcnZpY2UpOworCQkJc2VydmljZSA9IE5VTEw7CisJCX0KKworCQlyZXQgPSB2Y2hpcV9zdGF0dXNfdG9fdmNoaShzdGF0dXMpOworCX0KKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX3NlcnZpY2VfY2xvc2UpOworCitpbnQzMl90IHZjaGlfc2VydmljZV9kZXN0cm95KGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpCit7CisJaW50MzJfdCByZXQgPSAtMTsKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IChTSElNX1NFUlZJQ0VfVCAqKWhhbmRsZTsKKwlpZiAoc2VydmljZSkgeworCQlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSB2Y2hpcV9yZW1vdmVfc2VydmljZShzZXJ2aWNlLT5oYW5kbGUpOworCQlpZiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpIHsKKwkJCXNlcnZpY2VfZnJlZShzZXJ2aWNlKTsKKwkJCXNlcnZpY2UgPSBOVUxMOworCQl9CisKKwkJcmV0ID0gdmNoaXFfc3RhdHVzX3RvX3ZjaGkoc3RhdHVzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9zZXJ2aWNlX2Rlc3Ryb3kpOworCitpbnQzMl90IHZjaGlfc2VydmljZV9zZXRfb3B0aW9uKGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisJCQkJVkNISV9TRVJWSUNFX09QVElPTl9UIG9wdGlvbiwKKwkJCQlpbnQgdmFsdWUpCit7CisJaW50MzJfdCByZXQgPSAtMTsKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IChTSElNX1NFUlZJQ0VfVCAqKWhhbmRsZTsKKwlWQ0hJUV9TRVJWSUNFX09QVElPTl9UIHZjaGlxX29wdGlvbjsKKwlzd2l0Y2ggKG9wdGlvbikgeworCWNhc2UgVkNISV9TRVJWSUNFX09QVElPTl9UUkFDRToKKwkJdmNoaXFfb3B0aW9uID0gVkNISVFfU0VSVklDRV9PUFRJT05fVFJBQ0U7CisJCWJyZWFrOworCWNhc2UgVkNISV9TRVJWSUNFX09QVElPTl9TWU5DSFJPTk9VUzoKKwkJdmNoaXFfb3B0aW9uID0gVkNISVFfU0VSVklDRV9PUFRJT05fU1lOQ0hST05PVVM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNlcnZpY2UgPSBOVUxMOworCQlicmVhazsKKwl9CisJaWYgKHNlcnZpY2UpIHsKKwkJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0KKwkJCXZjaGlxX3NldF9zZXJ2aWNlX29wdGlvbihzZXJ2aWNlLT5oYW5kbGUsCisJCQkJCQl2Y2hpcV9vcHRpb24sCisJCQkJCQl2YWx1ZSk7CisKKwkJcmV0ID0gdmNoaXFfc3RhdHVzX3RvX3ZjaGkoc3RhdHVzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9zZXJ2aWNlX3NldF9vcHRpb24pOworCitpbnQzMl90IHZjaGlfZ2V0X3BlZXJfdmVyc2lvbiggY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwgc2hvcnQgKnBlZXJfdmVyc2lvbiApCit7CisgICBpbnQzMl90IHJldCA9IC0xOworICAgU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSAoU0hJTV9TRVJWSUNFX1QgKiloYW5kbGU7CisgICBpZihzZXJ2aWNlKQorICAgeworICAgICAgVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gdmNoaXFfZ2V0X3BlZXJfdmVyc2lvbihzZXJ2aWNlLT5oYW5kbGUsIHBlZXJfdmVyc2lvbik7CisgICAgICByZXQgPSB2Y2hpcV9zdGF0dXNfdG9fdmNoaSggc3RhdHVzICk7CisgICB9CisgICByZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX2dldF9wZWVyX3ZlcnNpb24pOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByZWFkIGEgdWludDMyX3QgZnJvbSBidWZmZXIuCisgKiBuZXR3b3JrIGZvcm1hdCBpcyBkZWZpbmVkIHRvIGJlIGxpdHRsZSBlbmRpYW4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit1aW50MzJfdAordmNoaV9yZWFkYnVmX3VpbnQzMihjb25zdCB2b2lkICpfcHRyKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0ciA9IF9wdHI7CisJcmV0dXJuIHB0clswXSB8IChwdHJbMV0gPDwgOCkgfCAocHRyWzJdIDw8IDE2KSB8IChwdHJbM10gPDwgMjQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB3cml0ZSBhIHVpbnQzMl90IHRvIGJ1ZmZlci4KKyAqIG5ldHdvcmsgZm9ybWF0IGlzIGRlZmluZWQgdG8gYmUgbGl0dGxlIGVuZGlhbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQKK3ZjaGlfd3JpdGVidWZfdWludDMyKHZvaWQgKl9wdHIsIHVpbnQzMl90IHZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgKnB0ciA9IF9wdHI7CisJcHRyWzBdID0gKHVuc2lnbmVkIGNoYXIpKCh2YWx1ZSA+PiAwKSAgJiAweEZGKTsKKwlwdHJbMV0gPSAodW5zaWduZWQgY2hhcikoKHZhbHVlID4+IDgpICAmIDB4RkYpOworCXB0clsyXSA9ICh1bnNpZ25lZCBjaGFyKSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisJcHRyWzNdID0gKHVuc2lnbmVkIGNoYXIpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcmVhZCBhIHVpbnQxNl90IGZyb20gYnVmZmVyLgorICogbmV0d29yayBmb3JtYXQgaXMgZGVmaW5lZCB0byBiZSBsaXR0bGUgZW5kaWFuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordWludDE2X3QKK3ZjaGlfcmVhZGJ1Zl91aW50MTYoY29uc3Qgdm9pZCAqX3B0cikKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwdHIgPSBfcHRyOworCXJldHVybiBwdHJbMF0gfCAocHRyWzFdIDw8IDgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB3cml0ZSBhIHVpbnQxNl90IGludG8gdGhlIGJ1ZmZlci4KKyAqIG5ldHdvcmsgZm9ybWF0IGlzIGRlZmluZWQgdG8gYmUgbGl0dGxlIGVuZGlhbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQKK3ZjaGlfd3JpdGVidWZfdWludDE2KHZvaWQgKl9wdHIsIHVpbnQxNl90IHZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgKnB0ciA9IF9wdHI7CisJcHRyWzBdID0gKHZhbHVlID4+IDApICAmIDB4RkY7CisJcHRyWzFdID0gKHZhbHVlID4+IDgpICAmIDB4RkY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTmFtZTogdmNoaV9zZXJ2aWNlX3VzZQorICoKKyAqIEFyZ3VtZW50czogY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZQorICoKKyAqIERlc2NyaXB0aW9uOiBSb3V0aW5lIHRvIGluY3JlbWVudCByZWZjb3VudCBvbiBhIHNlcnZpY2UKKyAqCisgKiBSZXR1cm5zOiB2b2lkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCB2Y2hpX3NlcnZpY2VfdXNlKGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpCit7CisJaW50MzJfdCByZXQgPSAtMTsKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IChTSElNX1NFUlZJQ0VfVCAqKWhhbmRsZTsKKwlpZiAoc2VydmljZSkKKwkJcmV0ID0gdmNoaXFfc3RhdHVzX3RvX3ZjaGkodmNoaXFfdXNlX3NlcnZpY2Uoc2VydmljZS0+aGFuZGxlKSk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9zZXJ2aWNlX3VzZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTmFtZTogdmNoaV9zZXJ2aWNlX3JlbGVhc2UKKyAqCisgKiBBcmd1bWVudHM6IGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUKKyAqCisgKiBEZXNjcmlwdGlvbjogUm91dGluZSB0byBkZWNyZW1lbnQgcmVmY291bnQgb24gYSBzZXJ2aWNlCisgKgorICogUmV0dXJuczogdm9pZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgdmNoaV9zZXJ2aWNlX3JlbGVhc2UoY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSkKK3sKKwlpbnQzMl90IHJldCA9IC0xOworCVNISU1fU0VSVklDRV9UICpzZXJ2aWNlID0gKFNISU1fU0VSVklDRV9UICopaGFuZGxlOworCWlmIChzZXJ2aWNlKQorCQlyZXQgPSB2Y2hpcV9zdGF0dXNfdG9fdmNoaSgKKwkJCXZjaGlxX3JlbGVhc2Vfc2VydmljZShzZXJ2aWNlLT5oYW5kbGUpKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX3NlcnZpY2VfcmVsZWFzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX3V0aWwuYyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NGFjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX3V0aWwuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgInZjaGlxX3V0aWwuaCIKKyNpbmNsdWRlICJ2Y2hpcV9raWxsYWJsZS5oIgorCitzdGF0aWMgaW5saW5lIGludCBpc19wb3cyKGludCBpKQoreworCXJldHVybiBpICYmICEoaSAmIChpIC0gMSkpOworfQorCitpbnQgdmNoaXVfcXVldWVfaW5pdChWQ0hJVV9RVUVVRV9UICpxdWV1ZSwgaW50IHNpemUpCit7CisJV0FSTl9PTighaXNfcG93MihzaXplKSk7CisKKwlxdWV1ZS0+c2l6ZSA9IHNpemU7CisJcXVldWUtPnJlYWQgPSAwOworCXF1ZXVlLT53cml0ZSA9IDA7CisJcXVldWUtPmluaXRpYWxpemVkID0gMTsKKworCXNlbWFfaW5pdCgmcXVldWUtPnBvcCwgMCk7CisJc2VtYV9pbml0KCZxdWV1ZS0+cHVzaCwgMCk7CisKKwlxdWV1ZS0+c3RvcmFnZSA9IGt6YWxsb2Moc2l6ZSAqIHNpemVvZihWQ0hJUV9IRUFERVJfVCAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHF1ZXVlLT5zdG9yYWdlID09IE5VTEwpIHsKKwkJdmNoaXVfcXVldWVfZGVsZXRlKHF1ZXVlKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCit2b2lkIHZjaGl1X3F1ZXVlX2RlbGV0ZShWQ0hJVV9RVUVVRV9UICpxdWV1ZSkKK3sKKwlpZiAocXVldWUtPnN0b3JhZ2UgIT0gTlVMTCkKKwkJa2ZyZWUocXVldWUtPnN0b3JhZ2UpOworfQorCitpbnQgdmNoaXVfcXVldWVfaXNfZW1wdHkoVkNISVVfUVVFVUVfVCAqcXVldWUpCit7CisJcmV0dXJuIHF1ZXVlLT5yZWFkID09IHF1ZXVlLT53cml0ZTsKK30KKworaW50IHZjaGl1X3F1ZXVlX2lzX2Z1bGwoVkNISVVfUVVFVUVfVCAqcXVldWUpCit7CisJcmV0dXJuIHF1ZXVlLT53cml0ZSA9PSBxdWV1ZS0+cmVhZCArIHF1ZXVlLT5zaXplOworfQorCit2b2lkIHZjaGl1X3F1ZXVlX3B1c2goVkNISVVfUVVFVUVfVCAqcXVldWUsIFZDSElRX0hFQURFUl9UICpoZWFkZXIpCit7CisJaWYgKCFxdWV1ZS0+aW5pdGlhbGl6ZWQpCisJCXJldHVybjsKKworCXdoaWxlIChxdWV1ZS0+d3JpdGUgPT0gcXVldWUtPnJlYWQgKyBxdWV1ZS0+c2l6ZSkgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZxdWV1ZS0+cG9wKSAhPSAwKSB7CisJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCQl9CisJfQorCisJLyoKKwkgKiBXcml0ZSB0byBxdWV1ZS0+c3RvcmFnZSBtdXN0IGJlIHZpc2libGUgYWZ0ZXIgcmVhZCBmcm9tCisJICogcXVldWUtPnJlYWQKKwkgKi8KKwlzbXBfbWIoKTsKKworCXF1ZXVlLT5zdG9yYWdlW3F1ZXVlLT53cml0ZSAmIChxdWV1ZS0+c2l6ZSAtIDEpXSA9IGhlYWRlcjsKKworCS8qCisJICogV3JpdGUgdG8gcXVldWUtPnN0b3JhZ2UgbXVzdCBiZSB2aXNpYmxlIGJlZm9yZSB3cml0ZSB0bworCSAqIHF1ZXVlLT53cml0ZQorCSAqLworCXNtcF93bWIoKTsKKworCXF1ZXVlLT53cml0ZSsrOworCisJdXAoJnF1ZXVlLT5wdXNoKTsKK30KKworVkNISVFfSEVBREVSX1QgKnZjaGl1X3F1ZXVlX3BlZWsoVkNISVVfUVVFVUVfVCAqcXVldWUpCit7CisJd2hpbGUgKHF1ZXVlLT53cml0ZSA9PSBxdWV1ZS0+cmVhZCkgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZxdWV1ZS0+cHVzaCkgIT0gMCkgeworCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKKwkJfQorCX0KKworCXVwKCZxdWV1ZS0+cHVzaCk7IC8vIFdlIGhhdmVuJ3QgcmVtb3ZlZCBhbnl0aGluZyBmcm9tIHRoZSBxdWV1ZS4KKworCS8qCisJICogUmVhZCBmcm9tIHF1ZXVlLT5zdG9yYWdlIG11c3QgYmUgdmlzaWJsZSBhZnRlciByZWFkIGZyb20KKwkgKiBxdWV1ZS0+d3JpdGUKKwkgKi8KKwlzbXBfcm1iKCk7CisKKwlyZXR1cm4gcXVldWUtPnN0b3JhZ2VbcXVldWUtPnJlYWQgJiAocXVldWUtPnNpemUgLSAxKV07Cit9CisKK1ZDSElRX0hFQURFUl9UICp2Y2hpdV9xdWV1ZV9wb3AoVkNISVVfUVVFVUVfVCAqcXVldWUpCit7CisJVkNISVFfSEVBREVSX1QgKmhlYWRlcjsKKworCXdoaWxlIChxdWV1ZS0+d3JpdGUgPT0gcXVldWUtPnJlYWQpIHsKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmcXVldWUtPnB1c2gpICE9IDApIHsKKwkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFJlYWQgZnJvbSBxdWV1ZS0+c3RvcmFnZSBtdXN0IGJlIHZpc2libGUgYWZ0ZXIgcmVhZCBmcm9tCisJICogcXVldWUtPndyaXRlCisJICovCisJc21wX3JtYigpOworCisJaGVhZGVyID0gcXVldWUtPnN0b3JhZ2VbcXVldWUtPnJlYWQgJiAocXVldWUtPnNpemUgLSAxKV07CisKKwkvKgorCSAqIFJlYWQgZnJvbSBxdWV1ZS0+c3RvcmFnZSBtdXN0IGJlIHZpc2libGUgYmVmb3JlIHdyaXRlIHRvCisJICogcXVldWUtPnJlYWQKKwkgKi8KKwlzbXBfbWIoKTsKKworCXF1ZXVlLT5yZWFkKys7CisKKwl1cCgmcXVldWUtPnBvcCk7CisKKwlyZXR1cm4gaGVhZGVyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV91dGlsLmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDU1ZDRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV91dGlsLmgKQEAgLTAsMCArMSw4MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWQ0hJUV9VVElMX0gKKyNkZWZpbmUgVkNISVFfVVRJTF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4gIC8qIGZvciB0aW1lX3QgKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSAidmNoaXFfaWYuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBzaXplOworCWludCByZWFkOworCWludCB3cml0ZTsKKwlpbnQgaW5pdGlhbGl6ZWQ7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHBvcDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHB1c2g7CisKKwlWQ0hJUV9IRUFERVJfVCAqKnN0b3JhZ2U7Cit9IFZDSElVX1FVRVVFX1Q7CisKK2V4dGVybiBpbnQgIHZjaGl1X3F1ZXVlX2luaXQoVkNISVVfUVVFVUVfVCAqcXVldWUsIGludCBzaXplKTsKK2V4dGVybiB2b2lkIHZjaGl1X3F1ZXVlX2RlbGV0ZShWQ0hJVV9RVUVVRV9UICpxdWV1ZSk7CisKK2V4dGVybiBpbnQgdmNoaXVfcXVldWVfaXNfZW1wdHkoVkNISVVfUVVFVUVfVCAqcXVldWUpOworZXh0ZXJuIGludCB2Y2hpdV9xdWV1ZV9pc19mdWxsKFZDSElVX1FVRVVFX1QgKnF1ZXVlKTsKKworZXh0ZXJuIHZvaWQgdmNoaXVfcXVldWVfcHVzaChWQ0hJVV9RVUVVRV9UICpxdWV1ZSwgVkNISVFfSEVBREVSX1QgKmhlYWRlcik7CisKK2V4dGVybiBWQ0hJUV9IRUFERVJfVCAqdmNoaXVfcXVldWVfcGVlayhWQ0hJVV9RVUVVRV9UICpxdWV1ZSk7CitleHRlcm4gVkNISVFfSEVBREVSX1QgKnZjaGl1X3F1ZXVlX3BvcChWQ0hJVV9RVUVVRV9UICpxdWV1ZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV92ZXJzaW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX3ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmJmYTIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV92ZXJzaW9uLmMKQEAgLTAsMCArMSw1OSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpbmNsdWRlICJ2Y2hpcV9idWlsZF9pbmZvLmgiCisjaW5jbHVkZSA8bGludXgvYnJvYWRjb20vdmNfZGVidWdfc3ltLmg+CisKK1ZDX0RFQlVHX0RFQ0xBUkVfU1RSSU5HX1ZBUiggdmNoaXFfYnVpbGRfaG9zdG5hbWUsICJkYzQtYXJtLTAxIiApOworVkNfREVCVUdfREVDTEFSRV9TVFJJTkdfVkFSKCB2Y2hpcV9idWlsZF92ZXJzaW9uLCAiOTI0NWI0YzM1Yjk5YjM4NzBlMWY3ZGM1OThjNTY5MmIzYzY2YTZmMCAodGFpbnRlZCkiICk7CitWQ19ERUJVR19ERUNMQVJFX1NUUklOR19WQVIoIHZjaGlxX2J1aWxkX3RpbWUsICAgIF9fVElNRV9fICk7CitWQ19ERUJVR19ERUNMQVJFX1NUUklOR19WQVIoIHZjaGlxX2J1aWxkX2RhdGUsICAgIF9fREFURV9fICk7CisKK2NvbnN0IGNoYXIgKnZjaGlxX2dldF9idWlsZF9ob3N0bmFtZSggdm9pZCApCit7CisgICByZXR1cm4gdmNoaXFfYnVpbGRfaG9zdG5hbWU7Cit9CisKK2NvbnN0IGNoYXIgKnZjaGlxX2dldF9idWlsZF92ZXJzaW9uKCB2b2lkICkKK3sKKyAgIHJldHVybiB2Y2hpcV9idWlsZF92ZXJzaW9uOworfQorCitjb25zdCBjaGFyICp2Y2hpcV9nZXRfYnVpbGRfZGF0ZSggdm9pZCApCit7CisgICByZXR1cm4gdmNoaXFfYnVpbGRfZGF0ZTsKK30KKworY29uc3QgY2hhciAqdmNoaXFfZ2V0X2J1aWxkX3RpbWUoIHZvaWQgKQoreworICAgcmV0dXJuIHZjaGlxX2J1aWxkX3RpbWU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3BpbzJfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV9waW8yX2NvcmUuYwppbmRleCAyOGE0NTY4Li44ZTY2YTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3BpbzJfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfcGlvMl9jb3JlLmMKQEAgLTQ2NiwyMyArNDY2LDIzIEBACiAKIC8qIFRoZXNlIGFyZSByZXF1aXJlZCBmb3IgZWFjaCBib2FyZCAqLwogTU9EVUxFX1BBUk1fREVTQyhidXMsICJFbnVtZXJhdGlvbiBvZiBWTUVidXMgdG8gd2hpY2ggdGhlIGJvYXJkIGlzIGNvbm5lY3RlZCIpOwotbW9kdWxlX3BhcmFtX2FycmF5KGJ1cywgaW50LCAmYnVzX251bSwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW1fYXJyYXkoYnVzLCBpbnQsICZidXNfbnVtLCAwNDQ0KTsKIAogTU9EVUxFX1BBUk1fREVTQyhiYXNlLCAiQmFzZSBWTUUgYWRkcmVzcyBmb3IgUElPMiBSZWdpc3RlcnMiKTsKLW1vZHVsZV9wYXJhbV9hcnJheShiYXNlLCBsb25nLCAmYmFzZV9udW0sIFNfSVJVR08pOworbW9kdWxlX3BhcmFtX2FycmF5KGJhc2UsIGxvbmcsICZiYXNlX251bSwgMDQ0NCk7CiAKIE1PRFVMRV9QQVJNX0RFU0ModmVjdG9yLCAiVk1FIElSUSBWZWN0b3IgKExvd2VyIDQgYml0cyBtYXNrZWQpIik7Ci1tb2R1bGVfcGFyYW1fYXJyYXkodmVjdG9yLCBpbnQsICZ2ZWN0b3JfbnVtLCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbV9hcnJheSh2ZWN0b3IsIGludCwgJnZlY3Rvcl9udW0sIDA0NDQpOwogCiBNT0RVTEVfUEFSTV9ERVNDKGxldmVsLCAiVk1FIElSUSBMZXZlbCIpOwotbW9kdWxlX3BhcmFtX2FycmF5KGxldmVsLCBpbnQsICZsZXZlbF9udW0sIFNfSVJVR08pOworbW9kdWxlX3BhcmFtX2FycmF5KGxldmVsLCBpbnQsICZsZXZlbF9udW0sIDA0NDQpOwogCiBNT0RVTEVfUEFSTV9ERVNDKHZhcmlhbnQsICJMYXN0IDQgY2hhcmFjdGVycyBvZiBQSU8yIGJvYXJkIHZhcmlhbnQiKTsKLW1vZHVsZV9wYXJhbV9hcnJheSh2YXJpYW50LCBjaGFycCwgJnZhcmlhbnRfbnVtLCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbV9hcnJheSh2YXJpYW50LCBjaGFycCwgJnZhcmlhbnRfbnVtLCAwNDQ0KTsKIAogLyogVGhpcyBpcyBmb3IgZGVidWdnaW5nICovCiBNT0RVTEVfUEFSTV9ERVNDKGxvb3BiYWNrLCAiRW5hYmxlIGxvb3BiYWNrIG1vZGUgb24gYWxsIGNhcmRzIik7Ci1tb2R1bGVfcGFyYW0obG9vcGJhY2ssIGJvb2wsIFNfSVJVR08pOworbW9kdWxlX3BhcmFtKGxvb3BiYWNrLCBib29sLCAwNDQ0KTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJHRSBQSU8yIDZVIFZNRSBJL08gRHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJNYXJ0eW4gV2VsY2ggPG1hcnR5bi53ZWxjaEBnZS5jb20iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5jIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMKaW5kZXggYjk1ODgzYi4uNWRkNDMwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMKQEAgLTc3Myw3ICs3NzMsNyBAQAogfQogCiBNT0RVTEVfUEFSTV9ERVNDKGJ1cywgIkVudW1lcmF0aW9uIG9mIFZNRWJ1cyB0byB3aGljaCB0aGUgZHJpdmVyIGlzIGNvbm5lY3RlZCIpOwotbW9kdWxlX3BhcmFtX2FycmF5KGJ1cywgaW50LCAmYnVzX251bSwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoYnVzLCBpbnQsICZidXNfbnVtLCAwMDAwKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJWTUUgVXNlciBTcGFjZSBBY2Nlc3MgRHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJNYXJ0eW4gV2VsY2ggPG1hcnR5bi53ZWxjaEBnZS5jb20iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYmFzZWJhbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYmFzZWJhbmQuYwppbmRleCA2NTRkMDcyLi5kZTUwM2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Jhc2ViYW5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9iYXNlYmFuZC5jCkBAIC0xNzI5LDcgKzE3MjksNyBAQAogCXVuc2lnbmVkIGludCB1RnJhbWVUaW1lOwogCXVuc2lnbmVkIGludCB1UHJlYW1ibGU7CiAJdW5zaWduZWQgaW50IHVUbXA7Ci0JdW5zaWduZWQgaW50IHVSYXRlSWR4ID0gKHVuc2lnbmVkIGludCkgd1JhdGU7CisJdW5zaWduZWQgaW50IHVSYXRlSWR4ID0gKHVuc2lnbmVkIGludCl3UmF0ZTsKIAl1bnNpZ25lZCBpbnQgdVJhdGUgPSAwOwogCiAJaWYgKHVSYXRlSWR4ID4gUkFURV81NE0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2NhcmQuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2FyZC5jCmluZGV4IGFmYjFlOGIuLmRiY2VhNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2FyZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2FyZC5jCkBAIC02MTksNyArNjE5LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBDQVJEd0dldENDS0NvbnRyb2xSYXRlKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwKIAkJCQkJICAgICB1bnNpZ25lZCBzaG9ydCB3UmF0ZUlkeCkKIHsKLQl1bnNpZ25lZCBpbnQgdWkgPSAodW5zaWduZWQgaW50KSB3UmF0ZUlkeDsKKwl1bnNpZ25lZCBpbnQgdWkgPSAodW5zaWduZWQgaW50KXdSYXRlSWR4OwogCiAJd2hpbGUgKHVpID4gUkFURV8xTSkgewogCQlpZiAocHJpdi0+YmFzaWNfcmF0ZXMgJiAoKHUzMikweDEgPDwgdWkpKQpAQCAtNjQ1LDcgKzY0NSw3IEBACiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgQ0FSRHdHZXRPRkRNQ29udHJvbFJhdGUoc3RydWN0IHZudF9wcml2YXRlICpwcml2LAogCQkJCQkgICAgICB1bnNpZ25lZCBzaG9ydCB3UmF0ZUlkeCkKIHsKLQl1bnNpZ25lZCBpbnQgdWkgPSAodW5zaWduZWQgaW50KSB3UmF0ZUlkeDsKKwl1bnNpZ25lZCBpbnQgdWkgPSAodW5zaWduZWQgaW50KXdSYXRlSWR4OwogCiAJcHJfZGVidWcoIkJBU0lDIFJBVEU6ICVYXG4iLCBwcml2LT5iYXNpY19yYXRlcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2hhbm5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9jaGFubmVsLmMKaW5kZXggYjdkNDNhNS4uMDI5YThkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9jaGFubmVsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9jaGFubmVsLmMKQEAgLTE5Myw3ICsxOTMsOCBAQAogCU1BQ3ZSZWdCaXRzT24ocHJpdi0+UG9ydE9mZnNldCwgTUFDX1JFR19NQUNDUiwgTUFDQ1JfQ0xSTkFWKTsKIAogCS8qIFRYX1BFIHdpbGwgcmVzZXJ2ZSAzIHVzIGZvciBNQVgyODI5IEEgbW9kZSBvbmx5LAotCSAgIGl0IGlzIGZvciBiZXR0ZXIgVFggdGhyb3VnaHB1dCAqLworCSAqIGl0IGlzIGZvciBiZXR0ZXIgVFggdGhyb3VnaHB1dAorCSAqLwogCiAJaWYgKHByaXYtPmJ5UkZUeXBlID09IFJGX0FJUk9IQTcyMzApCiAJCVJGYkFMNzIzMFNlbGVjdENoYW5uZWxQb3N0UHJvY2Vzcyhwcml2LCBwcml2LT5ieUN1cnJlbnRDaCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYwppbmRleCA0OTQxNjQwLi5mMTA5ZWVhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXZpY2VfbWFpbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYwpAQCAtMTEzLDEwICsxMTMsMTAgQEAKIERFVklDRV9QQVJBTShMb25nUmV0cnlMaW1pdCwgImxvbmcgZnJhbWUgcmV0cnkgbGltaXRzIik7CiAKIC8qIEJhc2ViYW5kVHlwZVtdIGJhc2ViYW5kIHR5cGUgc2VsZWN0ZWQKLSAgIDA6IGluZGljYXRlIDgwMi4xMWEgdHlwZQotICAgMTogaW5kaWNhdGUgODAyLjExYiB0eXBlCi0gICAyOiBpbmRpY2F0ZSA4MDIuMTFnIHR5cGUKLSovCisgKiAwOiBpbmRpY2F0ZSA4MDIuMTFhIHR5cGUKKyAqIDE6IGluZGljYXRlIDgwMi4xMWIgdHlwZQorICogMjogaW5kaWNhdGUgODAyLjExZyB0eXBlCisgKi8KICNkZWZpbmUgQkJQX1RZUEVfTUlOICAgICAwCiAjZGVmaW5lIEJCUF9UWVBFX01BWCAgICAgMgogI2RlZmluZSBCQlBfVFlQRV9ERUYgICAgIDIKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCQkJCQkgICAgIENCX01BWF9CVUZfU0laRSwKIAkJCQkJICAgICAmcHJpdi0+dHhfYnVmc19kbWEwLAogCQkJCQkgICAgIEdGUF9BVE9NSUMpOwotCWlmIChwcml2LT50eDBfYnVmcyA9PSBOVUxMKSB7CisJaWYgKCFwcml2LT50eDBfYnVmcykgewogCQlkZXZfZXJyKCZwcml2LT5wY2lkLT5kZXYsICJhbGxvY2F0ZSBidWYgZG1hIG1lbW9yeSBmYWlsZWRcbiIpOwogCiAJCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wY2lkLT5kZXYsCkBAIC03MzUsNyArNzM1LDcgQEAKIAlzdHJ1Y3Qgdm50X3JkX2luZm8gKnJkX2luZm8gPSByZC0+cmRfaW5mbzsKIAogCXJkX2luZm8tPnNrYiA9IGRldl9hbGxvY19za2IoKGludClwcml2LT5yeF9idWZfc3opOwotCWlmIChyZF9pbmZvLT5za2IgPT0gTlVMTCkKKwlpZiAoIXJkX2luZm8tPnNrYikKIAkJcmV0dXJuIGZhbHNlOwogCiAJcmRfaW5mby0+c2tiX2RtYSA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2tleS5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuYwppbmRleCBmZmNhZjI1Li5lMTYxZDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2tleS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmMKQEAgLTMxLDE2ICszMSw2IEBACiAjaW5jbHVkZSAia2V5LmgiCiAjaW5jbHVkZSAibWFjLmgiCiAKLWludCB2bnRfa2V5X2luaXRfdGFibGUoc3RydWN0IHZudF9wcml2YXRlICpwcml2KQotewotCXUzMiBpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9LRVlfVEFCTEU7IGkrKykKLQkJTUFDdkRpc2FibGVLZXlFbnRyeShwcml2LCBpKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHZudF9zZXRfa2V5bW9kZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKm1hY19hZGRyLAogCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSwgdTMyIGtleV90eXBlLCB1MzIgbW9kZSwKIAlib29sIG9uZmx5X2xhdGNoKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmgKaW5kZXggMjYxZjgxOC4uZDcyNzE5NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuaApAQCAtNjEsOCArNjEsNiBAQAogCiBzdHJ1Y3Qgdm50X3ByaXZhdGU7CiAKLWludCB2bnRfa2V5X2luaXRfdGFibGUoc3RydWN0IHZudF9wcml2YXRlICopOwotCiBpbnQgdm50X3NldF9rZXlzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAogCQkgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9wb3dlci5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9wb3dlci5jCmluZGV4IGJjOGNhOTguLjdkNmU3NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcG93ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3Bvd2VyLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotLyorCisvKgogICoKICAqIFJvdXRpbmUgRGVzY3JpcHRpb246CiAgKiBFbmFibGUgaHcgcG93ZXIgc2F2aW5nIGZ1bmN0aW9ucwpAQCAtNjAsNyArNjAsNyBAQAogICogUmV0dXJuIFZhbHVlOgogICogICAgTm9uZS4KICAqCi0gLSovCisgKi8KIAogdm9pZAogUFN2RW5hYmxlUG93ZXJTYXZpbmcoCkBAIC0xMDQsNyArMTA0LDcgQEAKIAlwcl9kZWJ1ZygiUFM6UG93ZXIgU2F2aW5nIE1vZGUgRW5hYmxlLi4uXG4iKTsKIH0KIAotLyorCisvKgogICoKICAqIFJvdXRpbmUgRGVzY3JpcHRpb246CiAgKiBEaXNhYmxlIGh3IHBvd2VyIHNhdmluZyBmdW5jdGlvbnMKQEAgLTExMiw3ICsxMTIsNyBAQAogICogUmV0dXJuIFZhbHVlOgogICogICAgTm9uZS4KICAqCi0gLSovCisgKi8KIAogdm9pZAogUFN2RGlzYWJsZVBvd2VyU2F2aW5nKApAQCAtMTM0LDcgKzEzNCw3IEBACiB9CiAKIAotLyorCisvKgogICoKICAqIFJvdXRpbmUgRGVzY3JpcHRpb246CiAgKiBDaGVjayBpZiBOZXh0IFRCVFQgbXVzdCB3YWtlIHVwCkBAIC0xNDIsNyArMTQyLDcgQEAKICAqIFJldHVybiBWYWx1ZToKICAqICAgIE5vbmUuCiAgKgotIC0qLworICovCiAKIGJvb2wKIFBTYklzTmV4dFRCVFRXYWtlVXAoCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3JmLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3JmLmMKaW5kZXggYWUxMGRhMi4uNDQ3ODgyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yZi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcmYuYwpAQCAtMTY5LDcgKzE2OSw4IEBACiB9OwogCiAvKiA0ME1IeiByZWZlcmVuY2UgZnJlcXVlbmN5Ci0gKiBOZWVkIHRvIFB1bGwgUExMT04oUEUzKSBsb3cgd2hlbiB3cml0aW5nIGNoYW5uZWwgcmVnaXN0ZXJzIHRocm91Z2ggMy13aXJlLiovCisgKiBOZWVkIHRvIFB1bGwgUExMT04oUEUzKSBsb3cgd2hlbiB3cml0aW5nIGNoYW5uZWwgcmVnaXN0ZXJzIHRocm91Z2ggMy13aXJlLgorICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBkd0FMNzIzMEluaXRUYWJsZVtDQl9BTDcyMzBfSU5JVF9TRVFdID0gewogCTB4MDAzNzkwMDArKEJZX0FMNzIzMF9SRUdfTEVOPDwzKStJRlJFR0NUTF9SRUdXLCAvKiBDaGFubmVsMSAvLyBOZWVkIG1vZGlmeSBmb3IgMTFhICovCiAJMHgxMzMzMzEwMCsoQllfQUw3MjMwX1JFR19MRU48PDMpK0lGUkVHQ1RMX1JFR1csIC8qIENoYW5uZWwxIC8vIE5lZWQgbW9kaWZ5IGZvciAxMWEgKi8KQEAgLTQ2Myw3ICs0NjQsOCBAQAogfQogCiAvKiBOZWVkIHRvIFB1bGwgUExMT04gbG93IHdoZW4gd3JpdGluZyBjaGFubmVsIHJlZ2lzdGVycyB0aHJvdWdoCi0gKiAzLXdpcmUgaW50ZXJmYWNlICovCisgKiAzLXdpcmUgaW50ZXJmYWNlCisgKi8KIHN0YXRpYyBib29sIHNfYkFMNzIzMFNlbGVjdENoYW5uZWwoc3RydWN0IHZudF9wcml2YXRlICpwcml2LCB1bnNpZ25lZCBjaGFyIGJ5Q2hhbm5lbCkKIHsKIAl2b2lkIF9faW9tZW0gKmR3SW9CYXNlID0gcHJpdi0+UG9ydE9mZnNldDsKQEAgLTg3Myw3ICs4NzUsOCBAQAogCiAJY2FzZSBSRl9BSVJPSEE3MjMwOgogCQkvKiAweDA4MEYxQjAwIGZvciAzIHdpcmUgY29udHJvbCBUeEdhaW4oRDEwKQotCQkgKiBhbmQgMHgzMSBhcyBUWCBHYWluIHZhbHVlICovCisJCSAqIGFuZCAweDMxIGFzIFRYIEdhaW4gdmFsdWUKKwkJICovCiAJCWR3TWF4NzIzMFB3ciA9IDB4MDgwQzBCMDAgfCAoKGJ5UHdyKSA8PCAxMikgfAogCQkJKEJZX0FMNzIzMF9SRUdfTEVOIDw8IDMpICB8IElGUkVHQ1RMX1JFR1c7CiAKQEAgLTg4Niw3ICs4ODksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qKworLyoKICAqCiAgKiBSb3V0aW5lIERlc2NyaXB0aW9uOgogICogICAgIFRyYW5zbGF0ZSBSU1NJIHRvIGRCbQpAQCAtOTAwLDcgKzkwMyw3IEBACiAgKgogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgotIC0qLworICovCiB2b2lkCiBSRnZSU1NJVG9kQm0oCiAJc3RydWN0IHZudF9wcml2YXRlICpwcml2LApAQCAtOTI3LDcgKzkzMCw4IEBACiB9CiAKIC8qIFBvc3QgcHJvY2Vzc2luZyBmb3IgdGhlIDExYi9nIGFuZCAxMWEuCi0gKiBmb3Igc2F2ZSB0aW1lIG9uIGNoYW5naW5nIFJlZzIsMyw1LDcsMTAsMTIsMTUgKi8KKyAqIGZvciBzYXZlIHRpbWUgb24gY2hhbmdpbmcgUmVnMiwzLDUsNywxMCwxMiwxNQorICovCiBib29sIFJGYkFMNzIzMFNlbGVjdENoYW5uZWxQb3N0UHJvY2VzcyhzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsCiAJCQkJICAgICAgIHUxNiBieU9sZENoYW5uZWwsCiAJCQkJICAgICAgIHUxNiBieU5ld0NoYW5uZWwpCkBAIC05MzgsNyArOTQyLDggQEAKIAogCS8qIGlmIGNoYW5nZSBiZXR3ZWVuIDExIGIvZyBhbmQgMTFhIG5lZWQgdG8gdXBkYXRlIHRoZSBmb2xsb3dpbmcKIAkgKiByZWdpc3RlcgotCSAqIENoYW5uZWwgSW5kZXggMX4xNCAqLworCSAqIENoYW5uZWwgSW5kZXggMX4xNAorCSAqLwogCWlmICgoYnlPbGRDaGFubmVsIDw9IENCX01BWF9DSEFOTkVMXzI0RykgJiYgKGJ5TmV3Q2hhbm5lbCA+IENCX01BWF9DSEFOTkVMXzI0RykpIHsKIAkJLyogQ2hhbmdlIGZyb20gMi40RyB0byA1RyBbUmVnXSAqLwogCQlyZXQgJj0gSUZSRmJXcml0ZUVtYmVkZGVkKHByaXYsIGR3QUw3MjMwSW5pdFRhYmxlQU1vZGVbMl0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yeHR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYwppbmRleCBlNGMzMTY1Li43ZTY5YmM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYwpAQCAtNjQsOCArNjQsMTAgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgRGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIENSSVRJQ0FMX1BBQ0tFVF9MRU4gICAgICAyNTYgICAgLyogaWYgcGFja2V0IHNpemUgPCAyNTYgLT4gaW4tZGlyZWN0IHNlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0IHNpemUgPj0gMjU2IC0+IGRpcmVjdCBzZW5kICovCisvKiBpZiBwYWNrZXQgc2l6ZSA8IDI1NiAtPiBpbi1kaXJlY3Qgc2VuZAorICogdnBhY2tldCBzaXplID49IDI1NiAtPiBkaXJlY3Qgc2VuZAorICovCisjZGVmaW5lIENSSVRJQ0FMX1BBQ0tFVF9MRU4gICAgICAyNTYKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHdUaW1lU3RhbXBPZmZbMl1bTUFYX1JBVEVdID0gewogCXszODQsIDI4OCwgMjI2LCAyMDksIDU0LCA0MywgMzcsIDMxLCAyOCwgMjUsIDI0LCAyM30sIC8qIExvbmcgUHJlYW1ibGUgKi8KQEAgLTE1OCwxMSArMTYwLDExIEBACiAJCQkJCQkJW3JhdGUgJSBNQVhfUkFURV0pOwogfQogCi0vKmJ5UGt0VHlwZSA6IFBLX1RZUEVfMTFBICAgICAwCi0gIFBLX1RZUEVfMTFCICAgICAxCi0gIFBLX1RZUEVfMTFHQiAgICAyCi0gIFBLX1RZUEVfMTFHQSAgICAzCi0qLworLyogYnlQa3RUeXBlIDogUEtfVFlQRV8xMUEgICAgIDAKKyAqIFBLX1RZUEVfMTFCICAgICAxCisgKiBQS19UWVBFXzExR0IgICAgMgorICogUEtfVFlQRV8xMUdBICAgIDMKKyAqLwogc3RhdGljCiB1bnNpZ25lZCBpbnQKIHNfdUdldFR4UnN2VGltZSgKQEAgLTUwMiw3ICs1MDQsNyBAQAogKQogewogCi0JaWYgKHBUeERhdGFIZWFkID09IE5VTEwpCisJaWYgKCFwVHhEYXRhSGVhZCkKIAkJcmV0dXJuIDA7CiAKIApAQCAtNjQ2LDE3ICs2NDgsMjAgQEAKIHsKIAl1bnNpZ25lZCBpbnQgdVJUU0ZyYW1lTGVuID0gMjA7CiAKLQlpZiAocHZSVFMgPT0gTlVMTCkKKwlpZiAoIXB2UlRTKQogCQlyZXR1cm47CiAKIAlpZiAoYkRpc0NSQykgewotCQkvKiBXaGVuIENSQ0RJUyBiaXQgaXMgb24sIEgvVyBmb3Jnb3QgdG8gZ2VuZXJhdGUgRkNTIGZvciBSVFMgZnJhbWUsCi0JCSBpbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBkZWNyZWFzZSBpdHMgbGVuZ3RoIGJ5IDQuICovCisJCS8qIFdoZW4gQ1JDRElTIGJpdCBpcyBvbiwgSC9XIGZvcmdvdCB0byBnZW5lcmF0ZSBGQ1MgZm9yCisJCSAqIFJUUyBmcmFtZSwgaW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gZGVjcmVhc2UgaXRzIGxlbmd0aCBieSA0LgorCQkgKi8KIAkJdVJUU0ZyYW1lTGVuIC09IDQ7CiAJfQogCi0JLyogTm90ZTogU28gZmFyIFJUU0hlYWQgZG9lc24ndCBhcHBlYXIgaW4gQVRJTSAmIEJlYWNvbSBETUEsIHNvIHdlIGRvbid0IG5lZWQgdG8gdGFrZSB0aGVtIGludG8gYWNjb3VudC4KLQkgICAgICAgT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIG1vZGlmeSBjb2RlcyBmb3IgdGhlbS4gKi8KKwkvKiBOb3RlOiBTbyBmYXIgUlRTSGVhZCBkb2Vzbid0IGFwcGVhciBpbiBBVElNICYgQmVhY29tIERNQSwKKwkgKiBzbyB3ZSBkb24ndCBuZWVkIHRvIHRha2UgdGhlbSBpbnRvIGFjY291bnQuCisJICogT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIG1vZGlmeSBjb2RlcyBmb3IgdGhlbS4KKwkgKi8KIAlpZiAoYnlQa3RUeXBlID09IFBLX1RZUEVfMTFHQiB8fCBieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdBKSB7CiAJCWlmIChieUZCT3B0aW9uID09IEFVVE9fRkJfTk9ORSkgewogCQkJc3RydWN0IHZudF9ydHNfZyAqYnVmID0gcHZSVFM7CkBAIC04MzgsMTIgKzg0MywxMyBAQAogewogCXVuc2lnbmVkIGludCB1Q1RTRnJhbWVMZW4gPSAxNDsKIAotCWlmIChwdkNUUyA9PSBOVUxMKQorCWlmICghcHZDVFMpCiAJCXJldHVybjsKIAogCWlmIChiRGlzQ1JDKSB7Ci0JCS8qIFdoZW4gQ1JDRElTIGJpdCBpcyBvbiwgSC9XIGZvcmdvdCB0byBnZW5lcmF0ZSBGQ1MgZm9yIENUUyBmcmFtZSwKLQkJIGluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGRlY3JlYXNlIGl0cyBsZW5ndGggYnkgNC4gKi8KKwkJLyogV2hlbiBDUkNESVMgYml0IGlzIG9uLCBIL1cgZm9yZ290IHRvIGdlbmVyYXRlIEZDUyBmb3IKKwkJICogQ1RTIGZyYW1lLCBpbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBkZWNyZWFzZSBpdHMgbGVuZ3RoIGJ5IDQuCisJCSAqLwogCQl1Q1RTRnJhbWVMZW4gLT0gNDsKIAl9CiAKQEAgLTkxNSw3ICs5MjEsNyBAQAogCX0KIH0KIAotLyorCisvKgogICoKICAqIERlc2NyaXB0aW9uOgogICogICAgICBHZW5lcmF0ZSBGSUZPIGNvbnRyb2wgZm9yIE1BQyAmIEJhc2ViYW5kIGNvbnRyb2xsZXIKQEAgLTkzNyw3ICs5NDMsOCBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogIC0KLSAqIHVuc2lnbmVkIGludCBjYkZyYW1lU2l6ZSwgSGRyK1BheWxvYWQrRkNTICovCisgKiB1bnNpZ25lZCBpbnQgY2JGcmFtZVNpemUsIEhkcitQYXlsb2FkK0ZDUworICovCiBzdGF0aWMKIHZvaWQKIHNfdkdlbmVyYXRlVHhQYXJhbWV0ZXIoCkBAIC05NzIsOCArOTc5LDggQEAKIAkJcmV0dXJuOwogCiAJaWYgKGJ5UGt0VHlwZSA9PSBQS19UWVBFXzExR0IgfHwgYnlQa3RUeXBlID09IFBLX1RZUEVfMTFHQSkgewotCQlpZiAocHZSVFMgIT0gTlVMTCkgeyAvKiBSVFNfbmVlZAotCQkJIEZpbGwgUnN2VGltZSAqLworCQlpZiAocHZSVFMgIT0gTlVMTCkgeyAvKiBSVFNfbmVlZCAqLworCQkJLyogRmlsbCBSc3ZUaW1lICovCiAJCQlzdHJ1Y3Qgdm50X3Jydl90aW1lX3J0cyAqYnVmID0gcHZScnZUaW1lOwogCiAJCQlidWYtPnJ0c19ycnZfdGltZV9hYSA9IHNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMiwgYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlKTsKQEAgLTEwMDIsNyArMTAwOSw3IEBACiAKIAkJCS8qIEZpbGwgUlRTICovCiAJCQlzX3ZGaWxsUlRTSGVhZChwRGV2aWNlLCBieVBrdFR5cGUsIHB2UlRTLCBjYkZyYW1lU2l6ZSwgYk5lZWRBQ0ssIGJEaXNDUkMsIHBzRXRoSGVhZGVyLCB3Q3VycmVudFJhdGUsIGJ5RkJPcHRpb24pOwotCQl9IGVsc2UgaWYgKHB2UlRTID09IE5VTEwpIHsvKiBSVFNfbmVlZGxlc3MsIG5vbiBQQ0YgbW9kZSAqLworCQl9IGVsc2UgaWYgKCFwdlJUUykgey8qIFJUU19uZWVkbGVzcywgbm9uIFBDRiBtb2RlICovCiAJCQlzdHJ1Y3Qgdm50X3Jydl90aW1lX2FiICpidWYgPSBwdlJydlRpbWU7CiAKIAkJCWJ1Zi0+cnJ2X3RpbWUgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwgUEtfVFlQRV8xMUEsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUsIGJOZWVkQUNLKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYmFzZWJhbmQuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYmFzZWJhbmQuaAppbmRleCA4MDdhNTgwLi43Y2MxMzg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jhc2ViYW5kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9iYXNlYmFuZC5oCkBAIC04NCwxMCArODQsMTAgQEAKIH0gX19wYWNrZWQ7CiAKIHVuc2lnbmVkIGludCB2bnRfZ2V0X2ZyYW1lX3RpbWUodTggcHJlYW1ibGVfdHlwZSwgdTggcGt0X3R5cGUsCi0JdW5zaWduZWQgaW50IGZyYW1lX2xlbmd0aCwgdTE2IHR4X3JhdGUpOworCQkJCXVuc2lnbmVkIGludCBmcmFtZV9sZW5ndGgsIHUxNiB0eF9yYXRlKTsKIAogdm9pZCB2bnRfZ2V0X3BoeV9maWVsZChzdHJ1Y3Qgdm50X3ByaXZhdGUgKiwgdTMyIGZyYW1lX2xlbmd0aCwKLQl1MTYgdHhfcmF0ZSwgdTggcGt0X3R5cGUsIHN0cnVjdCB2bnRfcGh5X2ZpZWxkICopOworCQkgICAgICAgdTE2IHR4X3JhdGUsIHU4IHBrdF90eXBlLCBzdHJ1Y3Qgdm50X3BoeV9maWVsZCAqKTsKIAogdm9pZCB2bnRfc2V0X3Nob3J0X3Nsb3RfdGltZShzdHJ1Y3Qgdm50X3ByaXZhdGUgKik7CiB2b2lkIHZudF9zZXRfdmdhX2dhaW5fb2Zmc2V0KHN0cnVjdCB2bnRfcHJpdmF0ZSAqLCB1OCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NhcmQuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5jCmluZGV4IGEzODJmYzYuLjUzYjQ2OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5jCkBAIC00NiwxMCArNDYsMTEgQEAKICNpbmNsdWRlICJrZXkuaCIKICNpbmNsdWRlICJ1c2JwaXBlLmgiCiAKLS8qIGNvbnN0IHUxNiBjd1JYQkNOVFNGT2ZmW01BWF9SQVRFXSA9Ci0gICB7MTcsIDM0LCA5NiwgMTkyLCAzNCwgMjMsIDE3LCAxMSwgOCwgNSwgNCwgM307ICovCisvKiBjb25zdCB1MTYgY3dfcnhiY250c2Zfb2ZmW01BWF9SQVRFXSA9CisgKiAgIHsxNywgMzQsIDk2LCAxOTIsIDM0LCAyMywgMTcsIDExLCA4LCA1LCA0LCAzfTsKKyAqLwogCi1zdGF0aWMgY29uc3QgdTE2IGN3UlhCQ05UU0ZPZmZbTUFYX1JBVEVdID0geworc3RhdGljIGNvbnN0IHUxNiBjd19yeGJjbnRzZl9vZmZbTUFYX1JBVEVdID0gewogCTE5MiwgOTYsIDM0LCAxNywgMzQsIDIzLCAxNywgMTEsIDgsIDUsIDQsIDMKIH07CiAKQEAgLTY1LDcgKzY2LDYgQEAKICAqLwogdm9pZCB2bnRfc2V0X2NoYW5uZWwoc3RydWN0IHZudF9wcml2YXRlICpwcml2LCB1MzIgY29ubmVjdGlvbl9jaGFubmVsKQogewotCiAJaWYgKGNvbm5lY3Rpb25fY2hhbm5lbCA+IENCX01BWF9DSEFOTkVMIHx8ICFjb25uZWN0aW9uX2NoYW5uZWwpCiAJCXJldHVybjsKIApAQCAtNzYsMTAgKzc2LDEwIEBACiAJdm50X21hY19yZWdfYml0c19vZmYocHJpdiwgTUFDX1JFR19DSEFOTkVMLCAweGIwKTsKIAogCXZudF9jb250cm9sX291dChwcml2LCBNRVNTQUdFX1RZUEVfU0VMRUNUX0NIQU5ORUwsCi0JCQkJCWNvbm5lY3Rpb25fY2hhbm5lbCwgMCwgMCwgTlVMTCk7CisJCQljb25uZWN0aW9uX2NoYW5uZWwsIDAsIDAsIE5VTEwpOwogCiAJdm50X2NvbnRyb2xfb3V0X3U4KHByaXYsIE1FU1NBR0VfUkVRVUVTVF9NQUNSRUcsIE1BQ19SRUdfQ0hBTk5FTCwKLQkJKHU4KShjb25uZWN0aW9uX2NoYW5uZWwgfCAweDgwKSk7CisJCQkgICAodTgpKGNvbm5lY3Rpb25fY2hhbm5lbCB8IDB4ODApKTsKIH0KIAogLyoKQEAgLTEyNiwxMSArMTI2LDExIEBACiAJdTE2IHVpID0gcmF0ZV9pZHg7CiAKIAlkZXZfZGJnKCZwcml2LT51c2ItPmRldiwgIiVzIGJhc2ljIHJhdGU6ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgIHByaXYtPmJhc2ljX3JhdGVzKTsKKwkJX19mdW5jX18sICBwcml2LT5iYXNpY19yYXRlcyk7CiAKIAlpZiAoIXZudF9vZmRtX21pbl9yYXRlKHByaXYpKSB7CiAJCWRldl9kYmcoJnByaXYtPnVzYi0+ZGV2LCAiJXMgKE5PIE9GRE0pICVkXG4iLAotCQkJCQkJX19mdW5jX18sIHJhdGVfaWR4KTsKKwkJCV9fZnVuY19fLCByYXRlX2lkeCk7CiAJCWlmIChyYXRlX2lkeCA+IFJBVEVfMjRNKQogCQkJcmF0ZV9pZHggPSBSQVRFXzI0TTsKIAkJcmV0dXJuIHJhdGVfaWR4OwpAQCAtMTM5LDcgKzEzOSw3IEBACiAJd2hpbGUgKHVpID4gUkFURV8xMU0pIHsKIAkJaWYgKHByaXYtPmJhc2ljX3JhdGVzICYgKDEgPDwgdWkpKSB7CiAJCQlkZXZfZGJnKCZwcml2LT51c2ItPmRldiwgIiVzIHJhdGU6ICVkXG4iLAotCQkJCQkJCV9fZnVuY19fLCB1aSk7CisJCQkJX19mdW5jX18sIHVpKTsKIAkJCXJldHVybiB1aTsKIAkJfQogCQl1aS0tOwpAQCAtMTY1LDkgKzE2NSw4IEBACiAgKgogICovCiBzdGF0aWMgdm9pZCB2bnRfY2FsY3VsYXRlX29mZG1fcmF0ZSh1MTYgcmF0ZSwgdTggYmJfdHlwZSwKLQkJCQkJdTggKnR4X3JhdGUsIHU4ICpyc3ZfdGltZSkKKwkJCQkgICAgdTggKnR4X3JhdGUsIHU4ICpyc3ZfdGltZSkKIHsKLQogCXN3aXRjaCAocmF0ZSkgewogCWNhc2UgUkFURV82TToKIAkJaWYgKGJiX3R5cGUgPT0gQkJfVFlQRV8xMUEpIHsKQEAgLTI2NywyMCArMjY2LDIwIEBACiAJaW50IGk7CiAKIAkvKlJTUElORl9iXzEqLwotCXZudF9nZXRfcGh5X2ZpZWxkKHByaXYsIDE0LAotCQl2bnRfZ2V0X2Nja19yYXRlKHByaXYsIFJBVEVfMU0pLCBQS19UWVBFXzExQiwgJnBoeVswXSk7CisJdm50X2dldF9waHlfZmllbGQocHJpdiwgMTQsIHZudF9nZXRfY2NrX3JhdGUocHJpdiwgUkFURV8xTSksCisJCQkgIFBLX1RZUEVfMTFCLCAmcGh5WzBdKTsKIAogCS8qUlNQSU5GX2JfMiovCi0Jdm50X2dldF9waHlfZmllbGQocHJpdiwgMTQsCi0JCXZudF9nZXRfY2NrX3JhdGUocHJpdiwgUkFURV8yTSksIFBLX1RZUEVfMTFCLCAmcGh5WzFdKTsKKwl2bnRfZ2V0X3BoeV9maWVsZChwcml2LCAxNCwgdm50X2dldF9jY2tfcmF0ZShwcml2LCBSQVRFXzJNKSwKKwkJCSAgUEtfVFlQRV8xMUIsICZwaHlbMV0pOwogCiAJLypSU1BJTkZfYl81Ki8KLQl2bnRfZ2V0X3BoeV9maWVsZChwcml2LCAxNCwKLQkJdm50X2dldF9jY2tfcmF0ZShwcml2LCBSQVRFXzVNKSwgUEtfVFlQRV8xMUIsICZwaHlbMl0pOworCXZudF9nZXRfcGh5X2ZpZWxkKHByaXYsIDE0LCB2bnRfZ2V0X2Nja19yYXRlKHByaXYsIFJBVEVfNU0pLAorCQkJICBQS19UWVBFXzExQiwgJnBoeVsyXSk7CiAKIAkvKlJTUElORl9iXzExKi8KLQl2bnRfZ2V0X3BoeV9maWVsZChwcml2LCAxNCwKLQkJdm50X2dldF9jY2tfcmF0ZShwcml2LCBSQVRFXzExTSksIFBLX1RZUEVfMTFCLCAmcGh5WzNdKTsKKwl2bnRfZ2V0X3BoeV9maWVsZChwcml2LCAxNCwgdm50X2dldF9jY2tfcmF0ZShwcml2LCBSQVRFXzExTSksCisJCQkgIFBLX1RZUEVfMTFCLCAmcGh5WzNdKTsKIAogCS8qUlNQSU5GX2FfNiovCiAJdm50X2NhbGN1bGF0ZV9vZmRtX3JhdGUoUkFURV82TSwgYmJfdHlwZSwgJnR4X3JhdGVbMF0sICZyc3ZfdGltZVswXSk7CkBAIC0yOTksMTkgKzI5OCwxOSBAQAogCiAJLypSU1BJTkZfYV8zNiovCiAJdm50X2NhbGN1bGF0ZV9vZmRtX3JhdGUodm50X2dldF9vZmRtX3JhdGUocHJpdiwgUkFURV8zNk0pLAotCQkJCQliYl90eXBlLCAmdHhfcmF0ZVs1XSwgJnJzdl90aW1lWzVdKTsKKwkJCQliYl90eXBlLCAmdHhfcmF0ZVs1XSwgJnJzdl90aW1lWzVdKTsKIAogCS8qUlNQSU5GX2FfNDgqLwogCXZudF9jYWxjdWxhdGVfb2ZkbV9yYXRlKHZudF9nZXRfb2ZkbV9yYXRlKHByaXYsIFJBVEVfNDhNKSwKLQkJCQkJYmJfdHlwZSwgJnR4X3JhdGVbNl0sICZyc3ZfdGltZVs2XSk7CisJCQkJYmJfdHlwZSwgJnR4X3JhdGVbNl0sICZyc3ZfdGltZVs2XSk7CiAKIAkvKlJTUElORl9hXzU0Ki8KIAl2bnRfY2FsY3VsYXRlX29mZG1fcmF0ZSh2bnRfZ2V0X29mZG1fcmF0ZShwcml2LCBSQVRFXzU0TSksCi0JCQkJCWJiX3R5cGUsICZ0eF9yYXRlWzddLCAmcnN2X3RpbWVbN10pOworCQkJCWJiX3R5cGUsICZ0eF9yYXRlWzddLCAmcnN2X3RpbWVbN10pOwogCiAJLypSU1BJTkZfYV83MiovCiAJdm50X2NhbGN1bGF0ZV9vZmRtX3JhdGUodm50X2dldF9vZmRtX3JhdGUocHJpdiwgUkFURV81NE0pLAotCQkJCQliYl90eXBlLCAmdHhfcmF0ZVs4XSwgJnJzdl90aW1lWzhdKTsKKwkJCQliYl90eXBlLCAmdHhfcmF0ZVs4XSwgJnJzdl90aW1lWzhdKTsKIAogCXB1dF91bmFsaWduZWQocGh5WzBdLmxlbiwgKHUxNiAqKSZkYXRhWzBdKTsKIAlkYXRhWzJdID0gcGh5WzBdLnNpZ25hbDsKQEAgLTMzNCw4ICszMzMsOCBAQAogCQlkYXRhWzE2ICsgaSAqIDIgKyAxXSA9IHJzdl90aW1lW2ldOwogCX0KIAotCXZudF9jb250cm9sX291dChwcml2LCBNRVNTQUdFX1RZUEVfV1JJVEUsCi0JCU1BQ19SRUdfUlNQSU5GX0JfMSwgTUVTU0FHRV9SRVFVRVNUX01BQ1JFRywgMzQsICZkYXRhWzBdKTsKKwl2bnRfY29udHJvbF9vdXQocHJpdiwgTUVTU0FHRV9UWVBFX1dSSVRFLCBNQUNfUkVHX1JTUElORl9CXzEsCisJCQlNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLCAzNCwgJmRhdGFbMF0pOwogfQogCiAvKgpAQCAtNDI5LDEyICs0MjgsMTIgQEAKIAlkYXRhWzNdID0gKHU4KXByaXYtPnNsb3Q7CiAKIAl2bnRfY29udHJvbF9vdXQocHJpdiwgTUVTU0FHRV9UWVBFX1dSSVRFLCBNQUNfUkVHX1NJRlMsCi0JCU1FU1NBR0VfUkVRVUVTVF9NQUNSRUcsIDQsICZkYXRhWzBdKTsKKwkJCU1FU1NBR0VfUkVRVUVTVF9NQUNSRUcsIDQsICZkYXRhWzBdKTsKIAogCW1heF9taW4gfD0gMHhhMDsKIAogCXZudF9jb250cm9sX291dChwcml2LCBNRVNTQUdFX1RZUEVfV1JJVEUsIE1BQ19SRUdfQ1dNQVhNSU4wLAotCQlNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLCAxLCAmbWF4X21pbik7CisJCQlNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLCAxLCAmbWF4X21pbik7CiB9CiAKIHZvaWQgdm50X3VwZGF0ZV90b3BfcmF0ZXMoc3RydWN0IHZudF9wcml2YXRlICpwcml2KQpAQCAtNDc4LDcgKzQ3Nyw2IEBACiAKIHU4IHZudF9nZXRfcGt0X3R5cGUoc3RydWN0IHZudF9wcml2YXRlICpwcml2KQogewotCiAJaWYgKHByaXYtPmJiX3R5cGUgPT0gQkJfVFlQRV8xMUEgfHwgcHJpdi0+YmJfdHlwZSA9PSBCQl9UWVBFXzExQikKIAkJcmV0dXJuICh1OClwcml2LT5iYl90eXBlOwogCWVsc2UgaWYgKHZudF9vZmRtX21pbl9yYXRlKHByaXYpKQpAQCAtNTA2LDcgKzUwNCw3IEBACiAJdTY0IHRzZl9vZmZzZXQgPSAwOwogCXUxNiByeF9iY25fb2Zmc2V0OwogCi0JcnhfYmNuX29mZnNldCA9IGN3UlhCQ05UU0ZPZmZbcnhfcmF0ZSAlIE1BWF9SQVRFXTsKKwlyeF9iY25fb2Zmc2V0ID0gY3dfcnhiY250c2Zfb2ZmW3J4X3JhdGUgJSBNQVhfUkFURV07CiAKIAl0c2YyICs9ICh1NjQpcnhfYmNuX29mZnNldDsKIApAQCAtNTMxLDcgKzUyOSw3IEBACiAgKgogICovCiB2b2lkIHZudF9hZGp1c3RfdHNmKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwgdTggcnhfcmF0ZSwKLQkJdTY0IHRpbWVfc3RhbXAsIHU2NCBsb2NhbF90c2YpCisJCSAgICB1NjQgdGltZV9zdGFtcCwgdTY0IGxvY2FsX3RzZikKIHsKIAl1NjQgdHNmX29mZnNldCA9IDA7CiAJdTggZGF0YVs4XTsKQEAgLTU0OCw4ICs1NDYsOSBAQAogCWRhdGFbN10gPSAodTgpKHRzZl9vZmZzZXQgPj4gNTYpOwogCiAJdm50X2NvbnRyb2xfb3V0KHByaXYsIE1FU1NBR0VfVFlQRV9TRVRfVFNGVEJUVCwKLQkJTUVTU0FHRV9SRVFVRVNUX1RTRiwgMCwgOCwgZGF0YSk7CisJCQlNRVNTQUdFX1JFUVVFU1RfVFNGLCAwLCA4LCBkYXRhKTsKIH0KKwogLyoKICAqIERlc2NyaXB0aW9uOiBSZWFkIE5JQyBUU0YgY291bnRlcgogICogICAgICAgICAgICAgIEdldCBsb2NhbCBUU0YgY291bnRlcgpAQCAtNTY1LDcgKzU2NCw2IEBACiAgKi8KIGJvb2wgdm50X2dldF9jdXJyZW50X3RzZihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsIHU2NCAqY3VycmVudF90c2YpCiB7Ci0KIAkqY3VycmVudF90c2YgPSBwcml2LT5jdXJyZW50X3RzZjsKIAogCXJldHVybiB0cnVlOwpAQCAtNTg0LDcgKzU4Miw2IEBACiAgKi8KIGJvb2wgdm50X2NsZWFyX2N1cnJlbnRfdHNmKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdikKIHsKLQogCXZudF9tYWNfcmVnX2JpdHNfb24ocHJpdiwgTUFDX1JFR19URlRDVEwsIFRGVENUTF9UU0ZDTlRSU1QpOwogCiAJcHJpdi0+Y3VycmVudF90c2YgPSAwOwpAQCAtNjU3LDcgKzY1NCw3IEBACiAJZGF0YVs3XSA9ICh1OCkobmV4dF90YnR0ID4+IDU2KTsKIAogCXZudF9jb250cm9sX291dChwcml2LCBNRVNTQUdFX1RZUEVfU0VUX1RTRlRCVFQsCi0JCU1FU1NBR0VfUkVRVUVTVF9UQlRULCAwLCA4LCBkYXRhKTsKKwkJCU1FU1NBR0VfUkVRVUVTVF9UQlRULCAwLCA4LCBkYXRhKTsKIH0KIAogLyoKQEAgLTY3Niw3ICs2NzMsNyBAQAogICoKICAqLwogdm9pZCB2bnRfdXBkYXRlX25leHRfdGJ0dChzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsIHU2NCB0c2YsCi0JCQl1MTYgYmVhY29uX2ludGVydmFsKQorCQkJICB1MTYgYmVhY29uX2ludGVydmFsKQogewogCXU4IGRhdGFbOF07CiAKQEAgLTcyMSw3ICs3MTgsNyBAQAogCWNhc2UgUkZfVlQzMjI2RDA6CiAJY2FzZSBSRl9WVDMzNDJBMDoKIAkJdm50X21hY19yZWdfYml0c19vZmYocHJpdiwgTUFDX1JFR19TT0ZUUFdSQ1RMLAotCQkJCShTT0ZUUFdSQ1RMX1NXUEUyIHwgU09GVFBXUkNUTF9TV1BFMykpOworCQkJCSAgICAgKFNPRlRQV1JDVExfU1dQRTIgfCBTT0ZUUFdSQ1RMX1NXUEUzKSk7CiAJCWJyZWFrOwogCX0KIApAQCAtNzYyLDcgKzc1OSw3IEBACiAJY2FzZSBSRl9WVDMyMjZEMDoKIAljYXNlIFJGX1ZUMzM0MkEwOgogCQl2bnRfbWFjX3JlZ19iaXRzX29uKHByaXYsIE1BQ19SRUdfU09GVFBXUkNUTCwKLQkJCShTT0ZUUFdSQ1RMX1NXUEUyIHwgU09GVFBXUkNUTF9TV1BFMykpOworCQkJCSAgICAoU09GVFBXUkNUTF9TV1BFMiB8IFNPRlRQV1JDVExfU1dQRTMpKTsKIAkJYnJlYWs7CiAJfQogCkBAIC03OTUsNyArNzkyLDcgQEAKIAkJCXByaXYtPmJiX3ZnYVswXSA9IDB4MjA7CiAKIAkJCXZudF9jb250cm9sX291dF91OChwcml2LCBNRVNTQUdFX1JFUVVFU1RfQkJSRUcsCi0JCQkJCQkweGU3LCBwcml2LT5iYl92Z2FbMF0pOworCQkJCQkgICAweGU3LCBwcml2LT5iYl92Z2FbMF0pOwogCQl9CiAKIAkJcHJpdi0+YmJfdmdhWzJdID0gMHgxMDsKQEAgLTgwNSw3ICs4MDIsNyBAQAogCQkJcHJpdi0+YmJfdmdhWzBdID0gMHgxYzsKIAogCQkJdm50X2NvbnRyb2xfb3V0X3U4KHByaXYsIE1FU1NBR0VfUkVRVUVTVF9CQlJFRywKLQkJCQkJCTB4ZTcsIHByaXYtPmJiX3ZnYVswXSk7CisJCQkJCSAgIDB4ZTcsIHByaXYtPmJiX3ZnYVswXSk7CiAJCX0KIAogCQlwcml2LT5iYl92Z2FbMl0gPSAweDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuYwppbmRleCA2MDE5YWFjLi42NTVmMDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZHBjLmMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlICJyZi5oIgogCiBpbnQgdm50X3J4X2RhdGEoc3RydWN0IHZudF9wcml2YXRlICpwcml2LCBzdHJ1Y3Qgdm50X3JjYiAqcHRyX3JjYiwKLQl1bnNpZ25lZCBsb25nIGJ5dGVzX3JlY2VpdmVkKQorCQl1bnNpZ25lZCBsb25nIGJ5dGVzX3JlY2VpdmVkKQogewogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcHJpdi0+aHc7CiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CkBAIC00Niw3ICs0Niw3IEBACiAJX19sZTY0ICp0c2ZfdGltZTsKIAl1MzIgZnJhbWVfc2l6ZTsKIAlpbnQgaWksIHI7Ci0JdTggKnJ4X3N0cywgKnJ4X3JhdGUsICpzcSwgKnNxXzM7CisJdTggKnJ4X3JhdGUsICpzcSwgKnNxXzM7CiAJdTMyIHdia19zdGF0dXM7CiAJdTggKnNrYl9kYXRhOwogCXUxNiAqcGF5X2xvYWRfbGVuOwpAQCAtNzUsMjIgKzc1LDIxIEBACiAKIAlza2JfZGF0YSA9ICh1OCAqKXNrYi0+ZGF0YTsKIAotCXJ4X3N0cyA9IHNrYl9kYXRhKzQ7Ci0JcnhfcmF0ZSA9IHNrYl9kYXRhKzU7CisJcnhfcmF0ZSA9IHNrYl9kYXRhICsgNTsKIAogCS8qIHJlYWwgRnJhbWUgU2l6ZSA9IFVTQmZyYW1lX3NpemUgLTRXYmtTdGF0dXMgLSA0UnhTdGF0dXMgKi8KIAkvKiAtOFRTRiAtIDRSU1IgLSA0U1EzIC0gP1BhZGRpbmcgKi8KIAogCS8qIGlmIFNRMyB0aGUgcmFuZ2UgaXMgMjR+MjcsIGlmIG5vIFNRMyB0aGUgcmFuZ2UgaXMgMjB+MjMgKi8KIAotCXBheV9sb2FkX2xlbiA9ICh1MTYgKikgKHNrYl9kYXRhICsgNik7CisJcGF5X2xvYWRfbGVuID0gKHUxNiAqKShza2JfZGF0YSArIDYpOwogCiAJLypGaXggaGFyZHdhcmUgYnVnID0+IFBMQ1BfTGVuZ3RoIGVycm9yICovCiAJaWYgKCgoYnl0ZXNfcmVjZWl2ZWQgLSAoKnBheV9sb2FkX2xlbikpID4gMjcpIHx8Ci0JCSgoYnl0ZXNfcmVjZWl2ZWQgLSAoKnBheV9sb2FkX2xlbikpIDwgMjQpIHx8Ci0JCQkoYnl0ZXNfcmVjZWl2ZWQgPCAoKnBheV9sb2FkX2xlbikpKSB7CisJICAgICgoYnl0ZXNfcmVjZWl2ZWQgLSAoKnBheV9sb2FkX2xlbikpIDwgMjQpIHx8CisJICAgIChieXRlc19yZWNlaXZlZCA8ICgqcGF5X2xvYWRfbGVuKSkpIHsKIAkJZGV2X2RiZygmcHJpdi0+dXNiLT5kZXYsICJXcm9uZyBQTENQIExlbmd0aCAleFxuIiwKLQkJCQkJCQkqcGF5X2xvYWRfbGVuKTsKKwkJCSpwYXlfbG9hZF9sZW4pOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuaAppbmRleCA1YTkyYmQ4Li5mZjE4NTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZHBjLmgKQEAgLTI5LDYgKzI5LDYgQEAKICNpbmNsdWRlICJkZXZpY2UuaCIKIAogaW50IHZudF9yeF9kYXRhKHN0cnVjdCB2bnRfcHJpdmF0ZSAqLCBzdHJ1Y3Qgdm50X3JjYiAqLAotCXVuc2lnbmVkIGxvbmcgYnl0ZXNfcmVjZWl2ZWQpOworCQl1bnNpZ25lZCBsb25nIGJ5dGVzX3JlY2VpdmVkKTsKIAogI2VuZGlmIC8qIF9fUlhUWF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYwppbmRleCBhYzRmZWNiLi4wNTk0ODI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWluX3VzYi5jCkBAIC00NDAsMTAgKzQ0MCw4IEBACiAKIAkJLyogYWxsb2NhdGUgVVJCcyAqLwogCQl0eF9jb250ZXh0LT51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQlpZiAoIXR4X2NvbnRleHQtPnVyYikgewotCQkJZGV2X2VycigmcHJpdi0+dXNiLT5kZXYsICJhbGxvYyB0eCB1cmIgZmFpbGVkXG4iKTsKKwkJaWYgKCF0eF9jb250ZXh0LT51cmIpCiAJCQlnb3RvIGZyZWVfdHg7Ci0JCX0KIAogCQl0eF9jb250ZXh0LT5pbl91c2UgPSBmYWxzZTsKIAl9CkBAIC00NjIsMTAgKzQ2MCw4IEBACiAKIAkJLyogYWxsb2NhdGUgVVJCcyAqLwogCQlyY2ItPnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcmNiLT51cmIpIHsKLQkJCWRldl9lcnIoJnByaXYtPnVzYi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jIHJ4IHVyYlxuIik7CisJCWlmICghcmNiLT51cmIpCiAJCQlnb3RvIGZyZWVfcnhfdHg7Ci0JCX0KIAogCQlyY2ItPnNrYiA9IGRldl9hbGxvY19za2IocHJpdi0+cnhfYnVmX3N6KTsKIAkJaWYgKCFyY2ItPnNrYikKQEAgLTQ3OSwxMCArNDc1LDggQEAKIAl9CiAKIAlwcml2LT5pbnRlcnJ1cHRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYtPmludGVycnVwdF91cmIpIHsKLQkJZGV2X2VycigmcHJpdi0+dXNiLT5kZXYsICJGYWlsZWQgdG8gYWxsb2MgaW50IHVyYlxuIik7CisJaWYgKCFwcml2LT5pbnRlcnJ1cHRfdXJiKQogCQlnb3RvIGZyZWVfcnhfdHg7Ci0JfQogCiAJcHJpdi0+aW50X2J1Zi5kYXRhX2J1ZiA9IGttYWxsb2MoTUFYX0lOVEVSUlVQVF9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXYtPmludF9idWYuZGF0YV9idWYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvdXNicGlwZS5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni91c2JwaXBlLmMKaW5kZXggZjU0NjU1My4uZTliNmIyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni91c2JwaXBlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni91c2JwaXBlLmMKQEAgLTI4LDggKzI4LDkgQEAKICAqCXZudF9jb250cm9sX2luX3U4IC0gUmVhZCBvbmUgYnl0ZSBmcm9tIE1FTS9CQi9NQUMvRUVQUk9NCiAgKgogICogUmV2aXNpb24gSGlzdG9yeToKLSAqICAgICAgMDQtMDUtMjAwNCBKZXJyeSBDaGVuOiAgSW5pdGlhbCByZWxlYXNlCi0gKiAgICAgIDExLTI0LTIwMDQgV2FycmVuIEhzdTogQWRkIENvbnRyb2x2V3JpdGVCeXRlLENvbnRyb2x2UmVhZEJ5dGUsQ29udHJvbHZNYXNrQnl0ZQorICogICAgICAwNC0wNS0yMDA0IEplcnJ5IENoZW46IEluaXRpYWwgcmVsZWFzZQorICogICAgICAxMS0yNC0yMDA0IFdhcnJlbiBIc3U6IEFkZCBDb250cm9sdldyaXRlQnl0ZSxDb250cm9sdlJlYWRCeXRlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2x2TWFza0J5dGUKICAqCiAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvVE9ETwppbmRleCBlYzkzYjJlLi5hZTYxYjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvVE9ETwpAQCAtMyw3ICszLDYgQEAKIC0gcmVtb3ZlIE9TIHdyYXBwZXIgZnVuY3Rpb25zCiAtIHJlbW92ZSBjdXN0b20gZGVidWcgYW5kIHRyYWNpbmcgZnVuY3Rpb25zCiAtIHJld29yayBjb21tZW50cyBhbmQgZnVuY3Rpb24gaGVhZGVycyhhbHNvIGNvZGluZyBzdHlsZSkKLS0gcmVwbGFjZSBhbGwgc2VtYXBob3JlcyB3aXRoIG11dGV4ZXMgb3IgY29tcGxldGlvbnMKIC0gTW92ZSBoYW5kbGluZyBmb3IgZWFjaCBpbmRpdmlkdWFsIG1lbWJlcnMgb2YgJ3VuaW9uIG1lc3NhZ2VfYm9keScgb3V0CiAgIGludG8gYSBzZXBhcmF0ZSAnc3RydWN0IHdvcmtfc3RydWN0JyBhbmQgY29tcGxldGVseSByZW1vdmUgdGhlIG11bHRpcGxleGVyCiAgIHRoYXQgaXMgY3VycmVudGx5IHBhcnQgb2YgaG9zdF9pZl93b3JrKCksIGFsbG93aW5nIG1vdmVtZW50IG9mIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL2NvcmVjb25maWd1cmF0b3IuaCBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC9jb3JlY29uZmlndXJhdG9yLmgKaW5kZXggMDc2ZTA2YS4uY2ZmMTY5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL2NvcmVjb25maWd1cmF0b3IuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvY29yZWNvbmZpZ3VyYXRvci5oCkBAIC03MCwxMSArNzAsMTEgQEAKIAlDT05ORUNUX1NUU19GT1JDRV8xNl9CSVQgPSAweEZGRkYKIH07CiAKLXR5cGVkZWYgc3RydWN0IHsKK3N0cnVjdCB0c3RyUlNTSSB7CiAJdTggdThGdWxsOwogCXU4IHU4SW5kZXg7CiAJczggYXM4UlNTSVtOVU1fUlNTSV07Ci19IHRzdHJSU1NJOworfTsKIAogc3RydWN0IG5ldHdvcmtfaW5mbyB7CiAJczggcnNzaTsKQEAgLTkzLDcgKzkzLDcgQEAKIAl1OCAqaWVzOwogCXUxNiBpZXNfbGVuOwogCXZvaWQgKmpvaW5fcGFyYW1zOwotCXRzdHJSU1NJIHN0cl9yc3NpOworCXN0cnVjdCB0c3RyUlNTSSBzdHJfcnNzaTsKIAl1NjQgdHNmX2hpOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL2hvc3RfaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvaG9zdF9pbnRlcmZhY2UuYwppbmRleCAwYjE3NjBjLi43OGY1NjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvaG9zdF9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvaG9zdF9pbnRlcmZhY2UuYwpAQCAtMzI3OSw3ICszMjc5LDYgQEAKIGludCB3aWxjX2hpZl9zZXRfY2ZnKHN0cnVjdCB3aWxjX3ZpZiAqdmlmLAogCQkgICAgIHN0cnVjdCBjZmdfcGFyYW1fYXR0ciAqY2ZnX3BhcmFtKQogewotCWludCByZXN1bHQgPSAwOwogCXN0cnVjdCBob3N0X2lmX21zZyBtc2c7CiAJc3RydWN0IGhvc3RfaWZfZHJ2ICpoaWZfZHJ2ID0gdmlmLT5oaWZfZHJ2OwogCkBAIC0zMjkzLDkgKzMyOTIsNyBAQAogCW1zZy5ib2R5LmNmZ19pbmZvID0gKmNmZ19wYXJhbTsKIAltc2cudmlmID0gdmlmOwogCi0JcmVzdWx0ID0gd2lsY19lbnF1ZXVlX2NtZCgmbXNnKTsKLQotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIHdpbGNfZW5xdWV1ZV9jbWQoJm1zZyk7CiB9CiAKIHN0YXRpYyB2b2lkIEdldFBlcmlvZGljUlNTSSh1bnNpZ25lZCBsb25nIGFyZykKQEAgLTMzMjksNyArMzMyNiw3IEBACiAKIAlpbml0X2NvbXBsZXRpb24oJmhpZl93YWl0X3Jlc3BvbnNlKTsKIAotCWhpZl9kcnYgID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhvc3RfaWZfZHJ2KSwgR0ZQX0tFUk5FTCk7CisJaGlmX2RydiAgPSBremFsbG9jKHNpemVvZigqaGlmX2RydiksIEdGUF9LRVJORUwpOwogCWlmICghaGlmX2RydikgewogCQlyZXN1bHQgPSAtRU5PTUVNOwogCQlnb3RvIF9mYWlsXzsKQEAgLTMzNjMsNyArMzM2MCw3IEBACiAJCWlmICghaGlmX3dvcmtxdWV1ZSkgewogCQkJbmV0ZGV2X2Vycih2aWYtPm5kZXYsICJGYWlsZWQgdG8gY3JlYXRlIHdvcmtxdWV1ZVxuIik7CiAJCQlyZXN1bHQgPSAtRU5PTUVNOwotCQkJZ290byBfZmFpbF9tcV87CisJCQlnb3RvIF9mYWlsXzsKIAkJfQogCiAJCXNldHVwX3RpbWVyKCZwZXJpb2RpY19yc3NpLCBHZXRQZXJpb2RpY1JTU0ksCkBAIC0zMzkxLDcgKzMzODgsNiBAQAogCiAJY2xpZW50c19jb3VudCsrOwogCi1fZmFpbF9tcV86CiAJZGVzdHJveV93b3JrcXVldWUoaGlmX3dvcmtxdWV1ZSk7CiBfZmFpbF86CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTM4NzksNyArMzg3NSw3IEBACiAJcHU4SUVzID0gcHRzdHJOZXR3b3JrSW5mby0+aWVzOwogCXUxNklFc0xlbiA9IHB0c3RyTmV0d29ya0luZm8tPmllc19sZW47CiAKLQlwTmV3Sm9pbkJzc1BhcmFtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGpvaW5fYnNzX3BhcmFtKSwgR0ZQX0tFUk5FTCk7CisJcE5ld0pvaW5Cc3NQYXJhbSA9IGt6YWxsb2Moc2l6ZW9mKCpwTmV3Sm9pbkJzc1BhcmFtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHBOZXdKb2luQnNzUGFyYW0pIHsKIAkJcE5ld0pvaW5Cc3NQYXJhbS0+ZHRpbV9wZXJpb2QgPSBwdHN0ck5ldHdvcmtJbmZvLT5kdGltX3BlcmlvZDsKIAkJcE5ld0pvaW5Cc3NQYXJhbS0+YmVhY29uX3BlcmlvZCA9IHB0c3RyTmV0d29ya0luZm8tPmJlYWNvbl9wZXJpb2Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvbGludXhfd2xhbi5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL2xpbnV4X3dsYW4uYwppbmRleCAzYTY2MjU1Li42MzcwYTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvbGludXhfd2xhbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC9saW51eF93bGFuLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KIAogc3RhdGljIGludCBkZXZfc3RhdGVfZXZfaGFuZGxlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCkBAIC02NDgsNyArNjQ3LDcgQEAKIAkJCW11dGV4X3VubG9jaygmd2wtPmhpZl9jcyk7CiAJCX0KIAkJaWYgKCZ3bC0+dHhxX2V2ZW50KQotCQkJd2FpdF9mb3JfY29tcGxldGlvbigmd2wtPnR4cV9ldmVudCk7CisJCQljb21wbGV0ZSgmd2wtPnR4cV9ldmVudCk7CiAKIAkJd2xhbl9kZWluaXRpYWxpemVfdGhyZWFkcyhkZXYpOwogCQlkZWluaXRfaXJxKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY19kZWJ1Z2ZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY19kZWJ1Z2ZzLmMKaW5kZXggZmNiYzk1ZC4uODAyYmIxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX2RlYnVnZnMuYwpAQCAtMjksNyArMjksNyBAQAogI2RlZmluZSBFUlIgICAgICAgICAgICAgQklUKDMpCiAKICNkZWZpbmUgREJHX0xFVkVMX0FMTAkoREVCVUcgfCBJTkZPIHwgV1JOIHwgRVJSKQotYXRvbWljX3QgV0lMQ19ERUJVR19MRVZFTCA9IEFUT01JQ19JTklUKEVSUik7CitzdGF0aWMgYXRvbWljX3QgV0lMQ19ERUJVR19MRVZFTCA9IEFUT01JQ19JTklUKEVSUik7CiBFWFBPUlRfU1lNQk9MX0dQTChXSUxDX0RFQlVHX0xFVkVMKTsKIAogLyoKQEAgLTEwMiwzNSArMTAyLDE2IEBACiBzdGF0aWMgaW50IF9faW5pdCB3aWxjX2RlYnVnZnNfaW5pdCh2b2lkKQogewogCWludCBpOwotCi0Jc3RydWN0IGRlbnRyeSAqZGVidWdmc19maWxlczsKIAlzdHJ1Y3Qgd2lsY19kZWJ1Z2ZzX2luZm9fdCAqaW5mbzsKIAogCXdpbGNfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJ3aWxjX3dpZmkiLCBOVUxMKTsKLQlpZiAod2lsY19kaXIgPT0gIEVSUl9QVFIoLUVOT0RFVikpIHsKLQkJLyogaXQncyBub3QgZXJyb3IuIHRoZSBkZWJ1Z2ZzIGlzIGp1c3Qgbm90IGJlaW5nIGVuYWJsZWQuICovCi0JCXByaW50aygiRVJSLCBrZXJuZWwgaGFzIGJ1aWx0IHdpdGhvdXQgZGVidWdmcyBzdXBwb3J0XG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCF3aWxjX2RpcikgewotCQlwcmludGsoIkVSUiwgZGVidWdmcyBjcmVhdGUgZGlyXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRlYnVnZnNfaW5mbyk7IGkrKykgewogCQlpbmZvID0gJmRlYnVnZnNfaW5mb1tpXTsKLQkJZGVidWdmc19maWxlcyA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoaW5mby0+bmFtZSwKLQkJCQkJCSAgICBpbmZvLT5wZXJtLAotCQkJCQkJICAgIHdpbGNfZGlyLAotCQkJCQkJICAgICZpbmZvLT5kYXRhLAotCQkJCQkJICAgICZpbmZvLT5mb3BzKTsKLQotCQlpZiAoIWRlYnVnZnNfZmlsZXMpIHsKLQkJCXByaW50aygiRVJSIGZhaWwgdG8gY3JlYXRlIHRoZSBkZWJ1Z2ZzIGZpbGUsICVzXG4iLCBpbmZvLT5uYW1lKTsKLQkJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZSh3aWxjX2Rpcik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KKwkJZGVidWdmc19jcmVhdGVfZmlsZShpbmZvLT5uYW1lLAorCQkJCSAgICBpbmZvLT5wZXJtLAorCQkJCSAgICB3aWxjX2RpciwKKwkJCQkgICAgJmluZm8tPmRhdGEsCisJCQkJICAgICZpbmZvLT5mb3BzKTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY19zcGkuYyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3NwaS5jCmluZGV4IDIyY2Y0YjcuLmYwOGNmNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3NwaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3NwaS5jCkBAIC00MTAsOCArNDEwLDcgQEAKIAlpZiAobGVuMiA+IEFSUkFZX1NJWkUod2IpKSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LCAic3BpIGJ1ZmZlciBzaXplIHRvbyBzbWFsbCAoJWQpICglenUpXG4iLAogCQkJIGxlbjIsIEFSUkFZX1NJWkUod2IpKTsKLQkJcmVzdWx0ID0gTl9GQUlMOwotCQlyZXR1cm4gcmVzdWx0OworCQlyZXR1cm4gTl9GQUlMOwogCX0KIAkvKiB6ZXJvIHNwaSB3cml0ZSBidWZmZXJzLiAqLwogCWZvciAod2l4ID0gbGVuOyB3aXggPCBsZW4yOyB3aXgrKykKQEAgLTQyMCw4ICs0MTksNyBAQAogCiAJaWYgKHdpbGNfc3BpX3R4X3J4KHdpbGMsIHdiLCByYiwgbGVuMikpIHsKIAkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgY21kIHdyaXRlLCBidXMgZXJyb3IuLi5cbiIpOwotCQlyZXN1bHQgPSBOX0ZBSUw7Ci0JCXJldHVybiByZXN1bHQ7CisJCXJldHVybiBOX0ZBSUw7CiAJfQogCiAJLyoqCkBAIC00NDIsOCArNDQwLDcgQEAKIAkJZGV2X2Vycigmc3BpLT5kZXYsCiAJCQkiRmFpbGVkIGNtZCByZXNwb25zZSwgY21kICglMDJ4KSwgcmVzcCAoJTAyeClcbiIsCiAJCQljbWQsIHJzcCk7Ci0JCXJlc3VsdCA9IE5fRkFJTDsKLQkJcmV0dXJuIHJlc3VsdDsKKwkJcmV0dXJuIE5fRkFJTDsKIAl9CiAKIAkvKioKQEAgLTQ1Myw4ICs0NTAsNyBAQAogCWlmIChyc3AgIT0gMHgwMCkgewogCQlkZXZfZXJyKCZzcGktPmRldiwgIkZhaWxlZCBjbWQgc3RhdGUgcmVzcG9uc2Ugc3RhdGUgKCUwMngpXG4iLAogCQkJcnNwKTsKLQkJcmVzdWx0ID0gTl9GQUlMOwotCQlyZXR1cm4gcmVzdWx0OworCQlyZXR1cm4gTl9GQUlMOwogCX0KIAogCWlmICgoY21kID09IENNRF9JTlRFUk5BTF9SRUFEKSB8fCAoY21kID09IENNRF9TSU5HTEVfUkVBRCkKQEAgLTQ4MSw4ICs0NzcsNyBAQAogCQlpZiAocmV0cnkgPD0gMCkgewogCQkJZGV2X2Vycigmc3BpLT5kZXYsCiAJCQkJIkVycm9yLCBkYXRhIHJlYWQgcmVzcG9uc2UgKCUwMngpXG4iLCByc3ApOwotCQkJcmVzdWx0ID0gTl9SRVNFVDsKLQkJCXJldHVybiByZXN1bHQ7CisJCQlyZXR1cm4gTl9SRVNFVDsKIAkJfQogCiAJCWlmICgoY21kID09IENNRF9JTlRFUk5BTF9SRUFEKSB8fCAoY21kID09IENNRF9TSU5HTEVfUkVBRCkpIHsKQEAgLTQ5Nyw4ICs0OTIsNyBAQAogCQkJfSBlbHNlIHsKIAkJCQlkZXZfZXJyKCZzcGktPmRldiwKIAkJCQkJImJ1ZmZlciBvdmVycnVuIHdoZW4gcmVhZGluZyBkYXRhLlxuIik7Ci0JCQkJcmVzdWx0ID0gTl9GQUlMOwotCQkJCXJldHVybiByZXN1bHQ7CisJCQkJcmV0dXJuIE5fRkFJTDsKIAkJCX0KIAogCQkJaWYgKCFnX3NwaS5jcmNfb2ZmKSB7CkBAIC01MTAsOCArNTA0LDcgQEAKIAkJCQkJY3JjWzFdID0gcmJbcml4KytdOwogCQkJCX0gZWxzZSB7CiAJCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiYnVmZmVyIG92ZXJydW4gd2hlbiByZWFkaW5nIGNyYy5cbiIpOwotCQkJCQlyZXN1bHQgPSBOX0ZBSUw7Ci0JCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCXJldHVybiBOX0ZBSUw7CiAJCQkJfQogCQkJfQogCQl9IGVsc2UgaWYgKChjbWQgPT0gQ01EX0RNQV9SRUFEKSB8fCAoY21kID09IENNRF9ETUFfRVhUX1JFQUQpKSB7CkBAIC01NTEsNyArNTQ0LDYgQEAKIAkJCQkJfQogCQkJCX0KIAotCiAJCQkJaXggKz0gbmJ5dGVzOwogCQkJCXN6IC09IG5ieXRlczsKIAkJCX0KQEAgLTU4Nyw3ICs1NzksNiBAQAogCQkJCWlmIChyZXN1bHQgPT0gTl9GQUlMKQogCQkJCQlicmVhazsKIAotCiAJCQkJLyoqCiAJCQkJICogUmVhZCBieXRlcwogCQkJCSAqKi8KQEAgLTY4Nyw3ICs2NzgsNiBAQAogCQlzeiAtPSBuYnl0ZXM7CiAJfSB3aGlsZSAoc3opOwogCi0KIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC04NTAsNyArODQwLDYgQEAKIAlzdGF0aWMgaW50IGlzaW5pdDsKIAogCWlmIChpc2luaXQpIHsKLQogCQlpZiAoIXdpbGNfc3BpX3JlYWRfcmVnKHdpbGMsIDB4MTAwMCwgJmNoaXBpZCkpIHsKIAkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiRmFpbCBjbWQgcmVhZCBjaGlwIGlkLi4uXG4iKTsKIAkJCXJldHVybiAwOwpAQCAtODcxLDcgKzg2MCw3IEBACiAJCS8qIFJlYWQgZmFpbGVkLiBUcnkgd2l0aCBDUkMgb2ZmLiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIG1vZHVsZQogCQkgKiBpcyByZW1vdmVkIGJ1dCBjaGlwIGlzbid0IHJlc2V0Ki8KIAkJZ19zcGkuY3JjX29mZiA9IDE7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiRmFpbGVkIGludGVybmFsIHJlYWQgcHJvdG9jb2wgd2l0aCBDUkMgb24sIHJldHlyaW5nIHdpdGggQ1JDIG9mZi4uLlxuIik7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiRmFpbGVkIGludGVybmFsIHJlYWQgcHJvdG9jb2wgd2l0aCBDUkMgb24sIHJldHJ5aW5nIHdpdGggQ1JDIG9mZi4uLlxuIik7CiAJCWlmICghc3BpX2ludGVybmFsX3JlYWQod2lsYywgV0lMQ19TUElfUFJPVE9DT0xfT0ZGU0VULCAmcmVnKSkgewogCQkJLyogUmVhYWQgZmFpbGVkIHdpdGggYm90aCBDUkMgb24gYW5kIG9mZiwgc29tZXRoaW5nIHdlbnQgYmFkICovCiAJCQlkZXZfZXJyKCZzcGktPmRldiwKQEAgLTg5MCw3ICs4NzksNiBAQAogCQlnX3NwaS5jcmNfb2ZmID0gMTsKIAl9CiAKLQogCS8qKgogCSAqICAgICAgbWFrZSBzdXJlIGNhbiByZWFkIGJhY2sgY2hpcCBpZCBjb3JyZWN0bHkKIAkgKiovCkBAIC05MzEsMTQgKzkxOSwxMCBAQAogCQkqc2l6ZSA9IHRtcDsKIAl9CiAKLQotCiBfZmFpbF86CiAJcmV0dXJuIHJldDsKIH0KIAotCi0KIHN0YXRpYyBpbnQgd2lsY19zcGlfcmVhZF9pbnQoc3RydWN0IHdpbGMgKndpbGMsIHUzMiAqaW50X3N0YXR1cykKIHsKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZSh3aWxjLT5kZXYpOwpAQCAtOTkzLDcgKzk3Nyw2IEBACiAJCX0KIAogCQkqaW50X3N0YXR1cyA9IHRtcDsKLQogCX0KIAogX2ZhaWxfOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2ZpX2NmZ29wZXJhdGlvbnMuYyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3dmaV9jZmdvcGVyYXRpb25zLmMKaW5kZXggOTA5MjYwMC4uNjBkOGIwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2ZpX2NmZ29wZXJhdGlvbnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193ZmlfY2Znb3BlcmF0aW9ucy5jCkBAIC0xMTkxLDcgKzExOTEsNyBAQAogCXN0cnVjdCB3aWxjX3ByaXYgKnByaXY7CiAJc3RydWN0IHdpbGNfdmlmICp2aWY7CiAJdTMyIGkgPSAwOwotCXUzMiBhc3NvY2lhdGVkc3RhID0gMDsKKwl1MzIgYXNzb2NpYXRlZHN0YSA9IH4wOwogCXUzMiBpbmFjdGl2ZV90aW1lID0gMDsKIAlwcml2ID0gd2lwaHlfcHJpdih3aXBoeSk7CiAJdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTEyMDQsNyArMTIwNCw3IEBACiAJCQl9CiAJCX0KIAotCQlpZiAoYXNzb2NpYXRlZHN0YSA9PSAtMSkgeworCQlpZiAoYXNzb2NpYXRlZHN0YSA9PSB+MCkgewogCQkJbmV0ZGV2X2VycihkZXYsICJzdGEgcmVxdWlyZWQgaXMgbm90IGFzc29jaWF0ZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KQEAgLTIyMDAsNyArMjIwMCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBjZmc4MDIxMV9vcHMgd2lsY19jZmc4MDIxMV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGNmZzgwMjExX29wcyB3aWxjX2NmZzgwMjExX29wcyA9IHsKIAkuc2V0X21vbml0b3JfY2hhbm5lbCA9IHNldF9jaGFubmVsLAogCS5zY2FuID0gc2NhbiwKIAkuY29ubmVjdCA9IGNvbm5lY3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193ZmlfbmV0ZGV2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193ZmlfbmV0ZGV2aWNlLmgKaW5kZXggNWNjNmE4Mi4uZWM2YjE2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2ZpX25ldGRldmljZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3dmaV9uZXRkZXZpY2UuaApAQCAtMTMxLDcgKzEzMSw3IEBACiAJc3RydWN0IHdpbGNfd2ZpX2tleSAqd2lsY19ndGtbTUFYX05VTV9TVEFdOwogCXN0cnVjdCB3aWxjX3dmaV9rZXkgKndpbGNfcHRrW01BWF9OVU1fU1RBXTsKIAl1OCB3aWxjX2dyb3Vwa2V5OwotCS8qIHNlbWFwaG9yZXMgKi8KKwkvKiBtdXRleGVzICovCiAJc3RydWN0IG11dGV4IHNjYW5fcmVxX2xvY2s7CiAJLyogICovCiAJYm9vbCBnYkF1dG9SYXRlQWRqdXN0ZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193bGFuLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193bGFuLmMKaW5kZXggMTlhNTgwOS4uYmM1YWQyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2xhbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3dsYW4uYwpAQCAtNjIxLDkgKzYyMSw5IEBACiAJCQlpZiAoIXJldCkKIAkJCQlicmVhazsKIAotCQkJaWYgKChyZWcgJiAweDEpID09IDApIHsKKwkJCWlmICgocmVnICYgMHgxKSA9PSAwKQogCQkJCWJyZWFrOwotCQkJfQorCiAJCQljb3VudGVyKys7CiAJCQlpZiAoY291bnRlciA+IDIwMCkgewogCQkJCWNvdW50ZXIgPSAwOwpAQCAtMTAwMSw4ICsxMDAxLDcgQEAKIAlyZXQgPSB3aWxjLT5oaWZfZnVuYy0+aGlmX3dyaXRlX3JlZyh3aWxjLCBXSUxDX1ZNTV9DT1JFX0NGRywgcmVnKTsKIAlpZiAoIXJldCkgewogCQlyZWxlYXNlX2J1cyh3aWxjLCBSRUxFQVNFX09OTFkpOwotCQlyZXQgPSAtRUlPOwotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gLUVJTzsKIAl9CiAJcmVnID0gMDsKIAlpZiAod2lsYy0+aW9fdHlwZSA9PSBISUZfU0RJTyAmJiB3aWxjLT5kZXZfaXJxX251bSkKQEAgLTEwMzQsOCArMTAzMyw3IEBACiAJcmV0ID0gd2lsYy0+aGlmX2Z1bmMtPmhpZl93cml0ZV9yZWcod2lsYywgV0lMQ19HUF9SRUdfMSwgcmVnKTsKIAlpZiAoIXJldCkgewogCQlyZWxlYXNlX2J1cyh3aWxjLCBSRUxFQVNFX09OTFkpOwotCQlyZXQgPSAtRUlPOwotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAl3aWxjLT5oaWZfZnVuYy0+aGlmX3N5bmNfZXh0KHdpbGMsIE5VTV9JTlRfRVhUKTsKQEAgLTEwNDMsOCArMTA0MSw3IEBACiAJcmV0ID0gd2lsYy0+aGlmX2Z1bmMtPmhpZl9yZWFkX3JlZyh3aWxjLCAweDEwMDAsICZjaGlwaWQpOwogCWlmICghcmV0KSB7CiAJCXJlbGVhc2VfYnVzKHdpbGMsIFJFTEVBU0VfT05MWSk7Ci0JCXJldCA9IC1FSU87Ci0JCXJldHVybiByZXQ7CisJCXJldHVybiAtRUlPOwogCX0KIAogCXdpbGMtPmhpZl9mdW5jLT5oaWZfcmVhZF9yZWcod2lsYywgV0lMQ19HTEJfUkVTRVRfMCwgJnJlZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193bGFuLmggYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193bGFuLmgKaW5kZXggMzBlNTMxMi4uZGU2YzRkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2xhbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3dsYW4uaApAQCAtMTkyLDcgKzE5Miw3IEBACiAKICNkZWZpbmUgRU5BQkxFX1JYX1ZNTQkJKFNFTF9WTU1fVEJMMSB8IEVOX1ZNTSkKICNkZWZpbmUgRU5BQkxFX1RYX1ZNTQkJKFNFTF9WTU1fVEJMMCB8IEVOX1ZNTSkKLS8qdGltZSBmb3IgZXhwaXJpbmcgdGhlIHNlbWFwaG9yZXMgb2YgY2ZnIHBhY2tldHMqLworLyp0aW1lIGZvciBleHBpcmluZyB0aGUgY29tcGxldGlvbiBvZiBjZmcgcGFja2V0cyovCiAjZGVmaW5lIENGR19QS1RTX1RJTUVPVVQJMjAwMAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2xhbl9pZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2xhbl9pZi5oCmluZGV4IDQxMGJmYzAuLjQzOWFjNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3dsYW5faWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193bGFuX2lmLmgKQEAgLTEwLDcgKzEwLDYgQEAKICNpZm5kZWYgV0lMQ19XTEFOX0lGX0gKICNkZWZpbmUgV0lMQ19XTEFOX0lGX0gKIAotI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2NmZzgwMjExLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9jZmc4MDIxMS5jCmluZGV4IGY0NmRmZTYuLjE4MmIyZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2NmZzgwMjExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvY2ZnODAyMTEuYwpAQCAtMzUsNyArMzUsNyBAQAogCiAvKiBwcmlzbTIgZGV2aWNlIHByaXZhdGUgZGF0YSAqLwogc3RydWN0IHByaXNtMl93aXBoeV9wcml2YXRlIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXY7CiAKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kIGJhbmQ7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIGNoYW5uZWxzW0FSUkFZX1NJWkUocHJpc20yX2NoYW5uZWxzKV07CkBAIC02OSwxMSArNjksMTEgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHByaXNtMl9kb21pYnNldF91aW50MzIod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MzIgZGlkLCB1MzIgZGF0YSkKK3N0YXRpYyBpbnQgcHJpc20yX2RvbWlic2V0X3VpbnQzMihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTMyIGRpZCwgdTMyIGRhdGEpCiB7CiAJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgbXNnOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgKm1pYml0ZW0gPQotCQkJKHA4MDIxMWl0ZW1fdWludDMyX3QgKikmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiAqbWliaXRlbSA9CisJCQkoc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyICopJm1zZy5taWJhdHRyaWJ1dGUuZGF0YTsKIAogCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYnNldDsKIAltaWJpdGVtLT5kaWQgPSBkaWQ7CkBAIC04MiwxMiArODIsMTIgQEAKIAlyZXR1cm4gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTggKikmbXNnKTsKIH0KIAotc3RhdGljIGludCBwcmlzbTJfZG9taWJzZXRfcHN0cjMyKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKK3N0YXRpYyBpbnQgcHJpc20yX2RvbWlic2V0X3BzdHIzMihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKIAkJCQkgIHUzMiBkaWQsIHU4IGxlbiwgY29uc3QgdTggKmRhdGEpCiB7CiAJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgbXNnOwotCXA4MDIxMWl0ZW1fcHN0cjMyX3QgKm1pYml0ZW0gPQotCQkJKHA4MDIxMWl0ZW1fcHN0cjMyX3QgKikmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhOworCXN0cnVjdCBwODAyMTFpdGVtX3BzdHIzMiAqbWliaXRlbSA9CisJCQkoc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjMyICopJm1zZy5taWJhdHRyaWJ1dGUuZGF0YTsKIAogCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYnNldDsKIAltaWJpdGVtLT5kaWQgPSBkaWQ7CkBAIC0xMDMsNyArMTAzLDcgQEAKIAkJCQkgICAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsIHUzMiAqZmxhZ3MsCiAJCQkJICAgICAgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CiAJdTMyIGRhdGE7CiAJaW50IHJlc3VsdDsKIAlpbnQgZXJyID0gMDsKQEAgLTE0NCwxMiArMTQ0LDE1IEBACiAJCQkgIHU4IGtleV9pbmRleCwgYm9vbCBwYWlyd2lzZSwgY29uc3QgdTggKm1hY19hZGRyLAogCQkJICBzdHJ1Y3Qga2V5X3BhcmFtcyAqcGFyYW1zKQogewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKIAl1MzIgZGlkOwogCiAJaW50IGVyciA9IDA7CiAJaW50IHJlc3VsdCA9IDA7CiAKKwlpZiAoa2V5X2luZGV4ID49IE5VTV9XRVBLRVlTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXN3aXRjaCAocGFyYW1zLT5jaXBoZXIpIHsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgogCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgpAQCAtMTYwLDI3ICsxNjMsNyBAQAogCQkJZ290byBleGl0OwogCiAJCS8qIHNlbmQga2V5IHRvIGRyaXZlciAqLwotCQlzd2l0Y2ggKGtleV9pbmRleCkgewotCQljYXNlIDA6Ci0JCQlkaWQgPSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTA7Ci0JCQlicmVhazsKLQotCQljYXNlIDE6Ci0JCQlkaWQgPSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTE7Ci0JCQlicmVhazsKLQotCQljYXNlIDI6Ci0JCQlkaWQgPSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTI7Ci0JCQlicmVhazsKLQotCQljYXNlIDM6Ci0JCQlkaWQgPSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTM7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQorCQlkaWQgPSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2tleShrZXlfaW5kZXggKyAxKTsKIAogCQlyZXN1bHQgPSBwcmlzbTJfZG9taWJzZXRfcHN0cjMyKHdsYW5kZXYsIGRpZCwKIAkJCQkJCXBhcmFtcy0+a2V5X2xlbiwgcGFyYW1zLT5rZXkpOwpAQCAtMjA1LDcgKzE4OCw3IEBACiAJCQkgIGNvbnN0IHU4ICptYWNfYWRkciwgdm9pZCAqY29va2llLAogCQkJICB2b2lkICgqY2FsbGJhY2spKHZvaWQgKmNvb2tpZSwgc3RydWN0IGtleV9wYXJhbXMqKSkKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CiAJc3RydWN0IGtleV9wYXJhbXMgcGFyYW1zOwogCWludCBsZW47CiAKQEAgLTIzMyw3ICsyMTYsNyBAQAogc3RhdGljIGludCBwcmlzbTJfZGVsX2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICB1OCBrZXlfaW5kZXgsIGJvb2wgcGFpcndpc2UsIGNvbnN0IHU4ICptYWNfYWRkcikKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CiAJdTMyIGRpZDsKIAlpbnQgZXJyID0gMDsKIAlpbnQgcmVzdWx0ID0gMDsKQEAgLTI0MiwzNiArMjI1LDEzIEBACiAJICogYSBrZXksIHNvIHdlIHdpbGwgY2hlYXQgYnkgc2V0dGluZyB0aGUga2V5IHRvIGEgYm9ndXMgdmFsdWUKIAkgKi8KIAorCWlmIChrZXlfaW5kZXggPj0gTlVNX1dFUEtFWVMpCisJCXJldHVybiAtRUlOVkFMOworCiAJLyogc2VuZCBrZXkgdG8gZHJpdmVyICovCi0Jc3dpdGNoIChrZXlfaW5kZXgpIHsKLQljYXNlIDA6Ci0JCWRpZCA9Ci0JCSAgICBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTA7Ci0JCWJyZWFrOwotCi0JY2FzZSAxOgotCQlkaWQgPQotCQkgICAgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkxOwotCQlicmVhazsKLQotCWNhc2UgMjoKLQkJZGlkID0KLQkJICAgIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MjsKLQkJYnJlYWs7Ci0KLQljYXNlIDM6Ci0JCWRpZCA9Ci0JCSAgICBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTM7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KLQorCWRpZCA9IERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfa2V5KGtleV9pbmRleCArIDEpOwogCXJlc3VsdCA9IHByaXNtMl9kb21pYnNldF9wc3RyMzIod2xhbmRldiwgZGlkLCAxMywgIjAwMDAwMDAwMDAwMDAiKTsKIAotZXhpdDoKIAlpZiAocmVzdWx0KQogCQllcnIgPSAtRUZBVUxUOwogCkBAIC0yODEsNyArMjQxLDcgQEAKIHN0YXRpYyBpbnQgcHJpc20yX3NldF9kZWZhdWx0X2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgdTgga2V5X2luZGV4LCBib29sIHVuaWNhc3QsIGJvb2wgbXVsdGljYXN0KQogewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKIAogCWludCBlcnIgPSAwOwogCWludCByZXN1bHQgPSAwOwpAQCAtMjk5LDEzICsyNTksMTMgQEAKIHN0YXRpYyBpbnQgcHJpc20yX2dldF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgICBjb25zdCB1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CiAJc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfY29tbXNxdWFsaXR5IHF1YWxpdHk7CiAJaW50IHJlc3VsdDsKIAogCW1lbXNldChzaW5mbywgMCwgc2l6ZW9mKCpzaW5mbykpOwogCi0JaWYgKCh3bGFuZGV2ID09IE5VTEwpIHx8ICh3bGFuZGV2LT5tc2RzdGF0ZSAhPSBXTEFOX01TRF9SVU5OSU5HKSkKKwlpZiAoIXdsYW5kZXYgfHwgKHdsYW5kZXYtPm1zZHN0YXRlICE9IFdMQU5fTVNEX1JVTk5JTkcpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAkvKiBidWlsZCByZXF1ZXN0IG1lc3NhZ2UgKi8KQEAgLTMxNCw3ICsyNzQsNyBAQAogCXF1YWxpdHkuZGJtLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKIAogCS8qIHNlbmQgbWVzc2FnZSB0byBuc2QgKi8KLQlpZiAod2xhbmRldi0+bWxtZXJlcXVlc3QgPT0gTlVMTCkKKwlpZiAoIXdsYW5kZXYtPm1sbWVyZXF1ZXN0KQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlyZXN1bHQgPSB3bGFuZGV2LT5tbG1lcmVxdWVzdCh3bGFuZGV2LCAoc3RydWN0IHA4MDIxMW1zZyAqKSZxdWFsaXR5KTsKQEAgLTMzNCw3ICsyOTQsNyBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IHByaXNtMl93aXBoeV9wcml2YXRlICpwcml2ID0gd2lwaHlfcHJpdih3aXBoeSk7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2OwogCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfc2NhbiBtc2cxOwogCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfc2Nhbl9yZXN1bHRzIG1zZzI7CiAJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOwpAQCAtMzc0LDcgKzMzNCw3IEBACiAJCW1zZzEuc2NhbnR5cGUuZGF0YSA9IFA4MDIxMUVOVU1fc2NhbnR5cGVfYWN0aXZlOwogCQltc2cxLnNzaWQuZGF0YS5sZW4gPSByZXF1ZXN0LT5zc2lkcy0+c3NpZF9sZW47CiAJCW1lbWNweShtc2cxLnNzaWQuZGF0YS5kYXRhLAotCQkJcmVxdWVzdC0+c3NpZHMtPnNzaWQsIHJlcXVlc3QtPnNzaWRzLT5zc2lkX2xlbik7CisJCSAgICAgICByZXF1ZXN0LT5zc2lkcy0+c3NpZCwgcmVxdWVzdC0+c3NpZHMtPnNzaWRfbGVuKTsKIAl9IGVsc2UgewogCQltc2cxLnNjYW50eXBlLmRhdGEgPSAwOwogCX0KQEAgLTQ1MSw3ICs0MTEsNyBAQAogc3RhdGljIGludCBwcmlzbTJfc2V0X3dpcGh5X3BhcmFtcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCB1MzIgY2hhbmdlZCkKIHsKIAlzdHJ1Y3QgcHJpc20yX3dpcGh5X3ByaXZhdGUgKnByaXYgPSB3aXBoeV9wcml2KHdpcGh5KTsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBwcml2LT53bGFuZGV2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gcHJpdi0+d2xhbmRldjsKIAl1MzIgZGF0YTsKIAlpbnQgcmVzdWx0OwogCWludCBlcnIgPSAwOwpAQCAtNDkzLDcgKzQ1Myw3IEBACiBzdGF0aWMgaW50IHByaXNtMl9jb25uZWN0KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgIHN0cnVjdCBjZmc4MDIxMV9jb25uZWN0X3BhcmFtcyAqc21lKQogewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPSBzbWUtPmNoYW5uZWw7CiAJc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfYXV0b2pvaW4gbXNnX2pvaW47CiAJdTMyIGRpZDsKQEAgLTUxNiwxMSArNDc2LDExIEBACiAKIAkvKiBTZXQgdGhlIGF1dGhvcml6YXRpb24gKi8KIAlpZiAoKHNtZS0+YXV0aF90eXBlID09IE5MODAyMTFfQVVUSFRZUEVfT1BFTl9TWVNURU0pIHx8Ci0JCSgoc21lLT5hdXRoX3R5cGUgPT0gTkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUMpICYmICFpc193ZXApKQotCQkJbXNnX2pvaW4uYXV0aHR5cGUuZGF0YSA9IFA4MDIxMUVOVU1fYXV0aGFsZ19vcGVuc3lzdGVtOworCSAgICAoKHNtZS0+YXV0aF90eXBlID09IE5MODAyMTFfQVVUSFRZUEVfQVVUT01BVElDKSAmJiAhaXNfd2VwKSkKKwkJbXNnX2pvaW4uYXV0aHR5cGUuZGF0YSA9IFA4MDIxMUVOVU1fYXV0aGFsZ19vcGVuc3lzdGVtOwogCWVsc2UgaWYgKChzbWUtPmF1dGhfdHlwZSA9PSBOTDgwMjExX0FVVEhUWVBFX1NIQVJFRF9LRVkpIHx8Ci0JCSgoc21lLT5hdXRoX3R5cGUgPT0gTkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUMpICYmIGlzX3dlcCkpCi0JCQltc2dfam9pbi5hdXRodHlwZS5kYXRhID0gUDgwMjExRU5VTV9hdXRoYWxnX3NoYXJlZGtleTsKKwkJICgoc21lLT5hdXRoX3R5cGUgPT0gTkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUMpICYmIGlzX3dlcCkpCisJCW1zZ19qb2luLmF1dGh0eXBlLmRhdGEgPSBQODAyMTFFTlVNX2F1dGhhbGdfc2hhcmVka2V5OwogCWVsc2UKIAkJbmV0ZGV2X3dhcm4oZGV2LAogCQkJIlVuaGFuZGxlZCBhdXRob3Jpc2F0aW9uIHR5cGUgZm9yIGNvbm5lY3QgKCVkKVxuIiwKQEAgLTUyOSw2ICs0ODksMTEgQEAKIAkvKiBTZXQgdGhlIGVuY3J5cHRpb24gLSB3ZSBvbmx5IHN1cHBvcnQgd2VwICovCiAJaWYgKGlzX3dlcCkgewogCQlpZiAoc21lLT5rZXkpIHsKKwkJCWlmIChzbWUtPmtleV9pZHggPj0gTlVNX1dFUEtFWVMpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwogCQkJcmVzdWx0ID0gcHJpc20yX2RvbWlic2V0X3VpbnQzMih3bGFuZGV2LAogCQkJCURJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXlJRCwKIAkJCQlzbWUtPmtleV9pZHgpOwpAQCAtNTM2LDI4ICs1MDEsOCBAQAogCQkJCWdvdG8gZXhpdDsKIAogCQkJLyogc2VuZCBrZXkgdG8gZHJpdmVyICovCi0JCQlzd2l0Y2ggKHNtZS0+a2V5X2lkeCkgewotCQkJY2FzZSAwOgotCQkJCWRpZCA9IERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAxOgotCQkJCWRpZCA9IERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAyOgotCQkJCWRpZCA9IERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MjsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAzOgotCQkJCWRpZCA9IERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MzsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQllcnIgPSAtRUlOVkFMOwotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQorCQkJZGlkID0gRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9rZXkoCisJCQkJCXNtZS0+a2V5X2lkeCArIDEpOwogCQkJcmVzdWx0ID0gcHJpc20yX2RvbWlic2V0X3BzdHIzMih3bGFuZGV2LAogCQkJCQkJCWRpZCwgc21lLT5rZXlfbGVuLAogCQkJCQkJCSh1OCAqKXNtZS0+a2V5KTsKQEAgLTYxOCw3ICs1NjMsNyBAQAogc3RhdGljIGludCBwcmlzbTJfZGlzY29ubmVjdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICB1MTYgcmVhc29uX2NvZGUpCiB7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwogCXN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2F1dG9qb2luIG1zZ19qb2luOwogCWludCByZXN1bHQ7CiAJaW50IGVyciA9IDA7CkBAIC02NTIsNyArNTk3LDcgQEAKIAkJCSAgICAgICBlbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyB0eXBlLCBpbnQgbWJtKQogewogCXN0cnVjdCBwcmlzbTJfd2lwaHlfcHJpdmF0ZSAqcHJpdiA9IHdpcGh5X3ByaXYod2lwaHkpOwotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IHByaXYtPndsYW5kZXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBwcml2LT53bGFuZGV2OwogCXUzMiBkYXRhOwogCWludCByZXN1bHQ7CiAJaW50IGVyciA9IDA7CkBAIC02NzksMTMgKzYyNCwxMyBAQAogCQkJICAgICAgIGludCAqZGJtKQogewogCXN0cnVjdCBwcmlzbTJfd2lwaHlfcHJpdmF0ZSAqcHJpdiA9IHdpcGh5X3ByaXYod2lwaHkpOwotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IHByaXYtPndsYW5kZXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBwcml2LT53bGFuZGV2OwogCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWliZ2V0IG1zZzsKLQlwODAyMTFpdGVtX3VpbnQzMl90ICptaWJpdGVtOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiAqbWliaXRlbTsKIAlpbnQgcmVzdWx0OwogCWludCBlcnIgPSAwOwogCi0JbWliaXRlbSA9IChwODAyMTFpdGVtX3VpbnQzMl90ICopJm1zZy5taWJhdHRyaWJ1dGUuZGF0YTsKKwltaWJpdGVtID0gKHN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiAqKSZtc2cubWliYXR0cmlidXRlLmRhdGE7CiAJbXNnLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfbWliZ2V0OwogCW1pYml0ZW0tPmRpZCA9CiAJICAgIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMUN1cnJlbnRUeFBvd2VyTGV2ZWw7CkBAIC03MDQsNyArNjQ5LDcgQEAKIH0KIAogLyogSW50ZXJmYWNlIGNhbGxiYWNrIGZ1bmN0aW9ucywgcGFzc2luZyBkYXRhIGJhY2sgdXAgdG8gdGhlIGNmZzgwMjExIGxheWVyICovCi12b2lkIHByaXNtMl9jb25uZWN0X3Jlc3VsdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4IGZhaWxlZCkKK3ZvaWQgcHJpc20yX2Nvbm5lY3RfcmVzdWx0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1OCBmYWlsZWQpCiB7CiAJdTE2IHN0YXR1cyA9IGZhaWxlZCA/CiAJCSAgICAgV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRSA6IFdMQU5fU1RBVFVTX1NVQ0NFU1M7CkBAIC03MTMsMTMgKzY1OCwxMyBAQAogCQkJCU5VTEwsIDAsIE5VTEwsIDAsIHN0YXR1cywgR0ZQX0tFUk5FTCk7CiB9CiAKLXZvaWQgcHJpc20yX2Rpc2Nvbm5lY3RlZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCit2b2lkIHByaXNtMl9kaXNjb25uZWN0ZWQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJY2ZnODAyMTFfZGlzY29ubmVjdGVkKHdsYW5kZXYtPm5ldGRldiwgMCwgTlVMTCwKLQkJMCwgZmFsc2UsIEdGUF9LRVJORUwpOworCQkJICAgICAgMCwgZmFsc2UsIEdGUF9LRVJORUwpOwogfQogCi12b2lkIHByaXNtMl9yb2FtZWQod2xhbmRldmljZV90ICp3bGFuZGV2KQordm9pZCBwcmlzbTJfcm9hbWVkKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KQogewogCWNmZzgwMjExX3JvYW1lZCh3bGFuZGV2LT5uZXRkZXYsIE5VTEwsIHdsYW5kZXYtPmJzc2lkLAogCQlOVUxMLCAwLCBOVUxMLCAwLCBHRlBfS0VSTkVMKTsKQEAgLTc0NCw3ICs2ODksNyBAQAogfTsKIAogLyogRnVuY3Rpb25zIHRvIGNyZWF0ZS9mcmVlIHdpcGh5IGludGVyZmFjZSAqLwotc3RhdGljIHN0cnVjdCB3aXBoeSAqd2xhbl9jcmVhdGVfd2lwaHkoc3RydWN0IGRldmljZSAqZGV2LCB3bGFuZGV2aWNlX3QgKndsYW5kZXYpCitzdGF0aWMgc3RydWN0IHdpcGh5ICp3bGFuX2NyZWF0ZV93aXBoeShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KQogewogCXN0cnVjdCB3aXBoeSAqd2lwaHk7CiAJc3RydWN0IHByaXNtMl93aXBoeV9wcml2YXRlICpwcml2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oCmluZGV4IGNlYzZkMGIuLjQzYzI5OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmgKQEAgLTEsNTcgKzEsNTcgQEAKIC8qIGhmYTM4NHguaAotKgotKiBEZWZpbmVzIHRoZSBjb25zdGFudHMgYW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIGhmYTM4NHgKLSoKLSogQ29weXJpZ2h0IChDKSAxOTk5IEFic29sdXRlVmFsdWUgU3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogbGludXgtd2xhbgotKgotKiAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljCi0qICAgTGljZW5zZSBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KLSoKLSogICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKLSogICBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQotKiAgIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpLCBpbiB3aGljaAotKiAgIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQotKiAgIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCi0qICAgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UKLSogICB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24KLSogICBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQotKiAgIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZQotKiAgIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzCi0qICAgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBJbnF1aXJpZXMgcmVnYXJkaW5nIHRoZSBsaW51eC13bGFuIE9wZW4gU291cmNlIHByb2plY3QgY2FuIGJlCi0qIG1hZGUgZGlyZWN0bHkgdG86Ci0qCi0qIEFic29sdXRlVmFsdWUgU3lzdGVtcyBJbmMuCi0qIGluZm9AbGludXgtd2xhbi5jb20KLSogaHR0cDovL3d3dy5saW51eC13bGFuLmNvbQotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBQb3J0aW9ucyBvZiB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIGZ1bmRlZCBieQotKiBJbnRlcnNpbCBDb3Jwb3JhdGlvbiBhcyBwYXJ0IG9mIFBSSVNNKFIpIGNoaXBzZXQgcHJvZHVjdCBkZXZlbG9wbWVudC4KLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogICBbSW1wbGVtZW50YXRpb24gYW5kIHVzYWdlIG5vdGVzXQotKgotKiAgIFtSZWZlcmVuY2VzXQotKglDVzEwIFByb2dyYW1tZXIncyBNYW51YWwgdjEuNQotKglJRUVFIDgwMi4xMSBEMTAuMAotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KKyAqCisgKiBEZWZpbmVzIHRoZSBjb25zdGFudHMgYW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIGhmYTM4NHgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBsaW51eC13bGFuCisgKgorICogICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYworICogICBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisgKgorICogICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKKyAqICAgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisgKiAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogICB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4gd2hpY2gKKyAqICAgY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCisgKiAgIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgKiAgIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlCisgKiAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbgorICogICBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQorICogICBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUKKyAqICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMKKyAqICAgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSW5xdWlyaWVzIHJlZ2FyZGluZyB0aGUgbGludXgtd2xhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IGNhbiBiZQorICogbWFkZSBkaXJlY3RseSB0bzoKKyAqCisgKiBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMgSW5jLgorICogaW5mb0BsaW51eC13bGFuLmNvbQorICogaHR0cDovL3d3dy5saW51eC13bGFuLmNvbQorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogUG9ydGlvbnMgb2YgdGhlIGRldmVsb3BtZW50IG9mIHRoaXMgc29mdHdhcmUgd2VyZSBmdW5kZWQgYnkKKyAqIEludGVyc2lsIENvcnBvcmF0aW9uIGFzIHBhcnQgb2YgUFJJU00oUikgY2hpcHNldCBwcm9kdWN0IGRldmVsb3BtZW50LgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBbSW1wbGVtZW50YXRpb24gYW5kIHVzYWdlIG5vdGVzXQorICoKKyAqICAgW1JlZmVyZW5jZXNdCisgKglDVzEwIFByb2dyYW1tZXIncyBNYW51YWwgdjEuNQorICoJSUVFRSA4MDIuMTEgRDEwLjAKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAKICNpZm5kZWYgX0hGQTM4NHhfSAogI2RlZmluZSBfSEZBMzg0eF9ICkBAIC02Myw3ICs2Myw3IEBACiAKIC8qLS0tIE1pbnMgJiBNYXhzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUJSEZBMzg0eF9QT1JUSURfTUFYCQkoKHUxNik3KQotI2RlZmluZQlIRkEzODR4X05VTVBPUlRTX01BWAkJKCh1MTYpKEhGQTM4NHhfUE9SVElEX01BWCsxKSkKKyNkZWZpbmUJSEZBMzg0eF9OVU1QT1JUU19NQVgJCSgodTE2KShIRkEzODR4X1BPUlRJRF9NQVggKyAxKSkKICNkZWZpbmUJSEZBMzg0eF9QRFJfTEVOX01BWAkJKCh1MTYpNTEyKSAvKiBpbiBieXRlcywgZnJvbSBFSyAqLwogI2RlZmluZQlIRkEzODR4X1BEQV9SRUNTX01BWAkJKCh1MTYpMjAwKSAvKiBhIGd1ZXNzICovCiAjZGVmaW5lCUhGQTM4NHhfUERBX0xFTl9NQVgJCSgodTE2KTEwMjQpIC8qIGluIGJ5dGVzLCBmcm9tIEVLKi8KQEAgLTExMCwyMCArMTEwLDIxIEBACiAjZGVmaW5lCQlIRkEzODR4X0FERFJfRkxBVF9DTURfT0ZGX01BU0sJKDB4MDAwMGZmZmYpCiAKIC8qIE1hc2sgYml0cyBmb3IgZGlzY2FyZGluZyB1bndhbnRlZCBwaWVjZXMgaW4gQVVYIGZvcm1hdAotICAgMTYtYml0IGFkZHJlc3MgcGFydHMgKi8KKyAqIDE2LWJpdCBhZGRyZXNzIHBhcnRzCisgKi8KICNkZWZpbmUJCUhGQTM4NHhfQUREUl9BVVhfUEFHRV9NQVNLCSgweGZmZmYpCiAjZGVmaW5lCQlIRkEzODR4X0FERFJfQVVYX09GRl9NQVNLCSgweDAwN2YpCiAKIC8qIE1ha2UgYSAzMi1iaXQgZmxhdCBhZGRyZXNzIGZyb20gQVVYIGZvcm1hdCAxNi1iaXQgcGFnZSBhbmQgb2Zmc2V0ICovCiAjZGVmaW5lCQlIRkEzODR4X0FERFJfQVVYX01LRkxBVChwLCBvKQlcCi0JCSgoKCh1MzIpKCgodTE2KShwKSkmSEZBMzg0eF9BRERSX0FVWF9QQUdFX01BU0spKSA8PCA3KSB8IFwKLQkJKCh1MzIpKCgodTE2KShvKSkmSEZBMzg0eF9BRERSX0FVWF9PRkZfTUFTSykpKQorCQkoKCgodTMyKSgoKHUxNikocCkpICYgSEZBMzg0eF9BRERSX0FVWF9QQUdFX01BU0spKSA8PCA3KSB8IFwKKwkJKCh1MzIpKCgodTE2KShvKSkgJiBIRkEzODR4X0FERFJfQVVYX09GRl9NQVNLKSkpCiAKIC8qIE1ha2UgQ01EIGZvcm1hdCBvZmZzZXQgYW5kIHBhZ2UgZnJvbSBhIDMyLWJpdCBmbGF0IGFkZHJlc3MgKi8KICNkZWZpbmUJCUhGQTM4NHhfQUREUl9DTURfTUtQQUdFKGYpIFwKLQkJKCh1MTYpKCgoKHUzMikoZikpJkhGQTM4NHhfQUREUl9GTEFUX0NNRF9QQUdFX01BU0spPj4xNikpCisJCSgodTE2KSgoKCh1MzIpKGYpKSAmIEhGQTM4NHhfQUREUl9GTEFUX0NNRF9QQUdFX01BU0spID4+IDE2KSkKICNkZWZpbmUJCUhGQTM4NHhfQUREUl9DTURfTUtPRkYoZikgXAotCQkoKHUxNikoKCh1MzIpKGYpKSZIRkEzODR4X0FERFJfRkxBVF9DTURfT0ZGX01BU0spKQorCQkoKHUxNikoKCh1MzIpKGYpKSAmIEhGQTM4NHhfQUREUl9GTEFUX0NNRF9PRkZfTUFTSykpCiAKIC8qLS0tIENvbnRyb2xsZXIgTWVtb3J5IGFkZHJlc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUJCUhGQTM4NDJfUERBX0JBU0UJKDB4MDA3ZjAwMDBVTCkKQEAgLTE3MywxMSArMTc0LDEyIEBACiAjZGVmaW5lCQlIRkEzODR4X0NNRF9FUlIJCQkoKHUxNikoMHg3RikpCiAKIC8qLS0tIFByb2dyYW1taW5nIE1vZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JTU9ERSAwOiBEaXNhYmxlIHByb2dyYW1taW5nCi0JTU9ERSAxOiBFbmFibGUgdm9sYXRpbGUgbWVtb3J5IHByb2dyYW1taW5nCi0JTU9ERSAyOiBFbmFibGUgbm9uLXZvbGF0aWxlIG1lbW9yeSBwcm9ncmFtbWluZwotCU1PREUgMzogUHJvZ3JhbSBub24tdm9sYXRpbGUgbWVtb3J5IHNlY3Rpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqCU1PREUgMDogRGlzYWJsZSBwcm9ncmFtbWluZworICoJTU9ERSAxOiBFbmFibGUgdm9sYXRpbGUgbWVtb3J5IHByb2dyYW1taW5nCisgKglNT0RFIDI6IEVuYWJsZSBub24tdm9sYXRpbGUgbWVtb3J5IHByb2dyYW1taW5nCisgKglNT0RFIDM6IFByb2dyYW0gbm9uLXZvbGF0aWxlIG1lbW9yeSBzZWN0aW9uCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZQkJSEZBMzg0eF9QUk9HTU9ERV9ESVNBQkxFCSgodTE2KTB4MDApCiAjZGVmaW5lCQlIRkEzODR4X1BST0dNT0RFX1JBTQkJKCh1MTYpMHgwMSkKICNkZWZpbmUJCUhGQTM4NHhfUFJPR01PREVfTlYJCSgodTE2KTB4MDIpCkBAIC0xODUsOCArMTg3LDkgQEAKIAogLyotLS0gUmVjb3JkIElEIENvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db25maWd1cmF0aW9uIFJJRHM6IE5ldHdvcmsgUGFyYW1ldGVycywgU3RhdGljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIENvbmZpZ3VyYXRpb24gUklEczogTmV0d29yayBQYXJhbWV0ZXJzLCBTdGF0aWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQT1JUVFlQRQkJKCh1MTYpMHhGQzAwKQogI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOTUFDQUREUgkoKHUxNikweEZDMDEpCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRAkoKHUxNikweEZDMDIpCkBAIC0xOTUsMTcgKzE5OCwxOSBAQAogI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYREFUQUxFTgkoKHUxNikweEZDMDcpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvbmZpZ3VyYXRpb24gUklEIGxlbmd0aHM6IE5ldHdvcmsgUGFyYW1zLCBTdGF0aWMgQ29uZmlnIEVudGl0aWVzCi0gIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QKLSAgaW5jbHVkZSB0aGUgbGVuIG9yIGNvZGUgZmllbGRzKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogQ29uZmlndXJhdGlvbiBSSUQgbGVuZ3RoczogTmV0d29yayBQYXJhbXMsIFN0YXRpYyBDb25maWcgRW50aXRpZXMKKyAqIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QKKyAqIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOTUFDQUREUl9MRU4JKCh1MTYpNikKICNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lEX0xFTgkoKHUxNikzNCkKICNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTlNTSURfTEVOCSgodTE2KTM0KQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db25maWd1cmF0aW9uIFJJRHM6IE5ldHdvcmsgUGFyYW1ldGVycywgRHluYW1pYyBDb25maWd1cmF0aW9uIEVudGl0aWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBDb25maWd1cmF0aW9uIFJJRHM6IE5ldHdvcmsgUGFyYW1ldGVycywgRHluYW1pYyBDb25maWd1cmF0aW9uIEVudGl0aWVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KICNkZWZpbmUJCUhGQTM4NHhfUklEX0NSRUFURUlCU1MJCSgodTE2KTB4RkM4MSkKICNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gJCSgodTE2KTB4RkM4MikKICNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSAkJKCh1MTYpMHhGQzgzKQpAQCAtMjEzLDggKzIxOCw5IEBACiAjZGVmaW5lCQlIRkEzODR4X1JJRF9QUk9NSVNDTU9ERQkJKCh1MTYpMHhGQzg1KQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUluZm9ybWF0aW9uIFJJRHM6IE5JQyBJbmZvcm1hdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogSW5mb3JtYXRpb24gUklEczogTklDIEluZm9ybWF0aW9uCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYTE9BRFRJTUUJCSgodTE2KTB4RkQwMCkKICNkZWZpbmUJCUhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSCSgodTE2KTB4RkQwMSkKICNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSUlERU5USVRZCQkoKHUxNikweEZEMDIpCkBAIC0yMzAsMTUgKzIzNiwxNyBAQAogI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBX0NGSUFDVFJBTkdFUwkoKHUxNikweEZEMjMpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotSW5mb3JtYXRpb24gUklEIExlbmd0aHM6IE5JQyBJbmZvcm1hdGlvbgotICBUaGlzIGlzIHRoZSBsZW5ndGggb2YgSlVTVCB0aGUgREFUQSBwYXJ0IG9mIHRoZSBSSUQgKGRvZXMgbm90Ci0gIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIEluZm9ybWF0aW9uIFJJRCBMZW5ndGhzOiBOSUMgSW5mb3JtYXRpb24KKyAqIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QKKyAqIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KICNkZWZpbmUJCUhGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUl9MRU4JCSgodTE2KTEyKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1JbmZvcm1hdGlvbiBSSURzOiAgTUFDIEluZm9ybWF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBJbmZvcm1hdGlvbiBSSURzOiAgTUFDIEluZm9ybWF0aW9uCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KICNkZWZpbmUJCUhGQTM4NHhfUklEX1BPUlRTVEFUVVMJCSgodTE2KTB4RkQ0MCkKICNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRTU0lECQkoKHUxNikweEZENDEpCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQlNTSUQJKCh1MTYpMHhGRDQyKQpAQCAtMjUwLDIzICsyNTgsMjYgQEAKICNkZWZpbmUJCUhGQTM4NHhfUklEX0RCTUNPTU1TUVVBTElUWQkoKHUxNikweEZENTEpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUluZm9ybWF0aW9uIFJJRCBMZW5ndGhzOiAgTUFDIEluZm9ybWF0aW9uCi0gIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QKLSAgaW5jbHVkZSB0aGUgbGVuIG9yIGNvZGUgZmllbGRzKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogSW5mb3JtYXRpb24gUklEIExlbmd0aHM6ICBNQUMgSW5mb3JtYXRpb24KKyAqIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QKKyAqIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZQkJSEZBMzg0eF9SSURfREJNQ09NTVNRVUFMSVRZX0xFTgkgXAotCSgodTE2KSBzaXplb2YoaGZhMzg0eF9kYm1jb21tc3F1YWxpdHlfdCkpCisJKCh1MTYpc2l6ZW9mKHN0cnVjdCBoZmEzODR4X2RibWNvbW1zcXVhbGl0eSkpCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9KT0lOUkVRVUVTVF9MRU4gXAotCSgodTE2KXNpemVvZihoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGFfdCkpCisJKCh1MTYpc2l6ZW9mKHN0cnVjdCBoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGEpKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1JbmZvcm1hdGlvbiBSSURzOiAgTW9kZW0gSW5mb3JtYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIEluZm9ybWF0aW9uIFJJRHM6ICBNb2RlbSBJbmZvcm1hdGlvbgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQ0hBTk5FTAkoKHUxNikweEZEQzEpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFQSSBFTkhBTkNFTUVOVFMgKE5PVCBBTFJFQURZIElNUExFTUVOVEVEKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogQVBJIEVOSEFOQ0VNRU5UUyAoTk9UIEFMUkVBRFkgSU1QTEVNRU5URUQpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KICNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVlJRAkoKHUxNikweEZDMjMpCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMAkoKHUxNikweEZDMjQpCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMQkoKHUxNikweEZDMjUpCkBAIC0yOTAsOCArMzAxLDkgQEAKICNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUDEyOERFRkFVTFRLRVlfTEVOCSgodTE2KTE0KQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1QRCBSZWNvcmQgY29kZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIFBEIFJlY29yZCBjb2RlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAjZGVmaW5lIEhGQTM4NHhfUERSX1BDQl9QQVJUTlVNCQkoKHUxNikweDAwMDEpCiAjZGVmaW5lIEhGQTM4NHhfUERSX1BEQVZFUgkJKCh1MTYpMHgwMDAyKQogI2RlZmluZSBIRkEzODR4X1BEUl9OSUNfU0VSSUFMCQkoKHUxNikweDAwMDMpCkBAIC0zNTUsMzEgKzM2NywzMiBAQAogCXU4IGRhdGFbMF07CiB9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X2J5dGVzdHIzMiB7CitzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyMzIgewogCXUxNiBsZW47CiAJdTggZGF0YVszMl07Ci19IF9fcGFja2VkIGhmYTM4NHhfYnl0ZXN0cjMyX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db25maWd1cmF0aW9uIFJlY29yZCBTdHJ1Y3R1cmVzOgotCU5ldHdvcmsgUGFyYW1ldGVycywgU3RhdGljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIENvbmZpZ3VyYXRpb24gUmVjb3JkIFN0cnVjdHVyZXM6CisgKglOZXR3b3JrIFBhcmFtZXRlcnMsIFN0YXRpYyBDb25maWd1cmF0aW9uIEVudGl0aWVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAogLyotLSBIYXJkd2FyZS9GaXJtd2FyZSBDb21wb25lbnQgSW5mb3JtYXRpb24gLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NvbXBpZGVudCB7CitzdHJ1Y3QgaGZhMzg0eF9jb21waWRlbnQgewogCXUxNiBpZDsKIAl1MTYgdmFyaWFudDsKIAl1MTYgbWFqb3I7CiAJdTE2IG1pbm9yOwotfSBfX3BhY2tlZCBoZmEzODR4X2NvbXBpZGVudF90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbCB7CitzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbCB7CiAJdTE2IHJvbGU7CiAJdTE2IGlkOwogCXUxNiB2YXJpYW50OwogCXUxNiBib3R0b207CiAJdTE2IHRvcDsKLX0gX19wYWNrZWQgaGZhMzg0eF9jYXBsZXZlbF90OworfSBfX3BhY2tlZDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mQXV0aGVudGljYXRpb24gLS0qLwogI2RlZmluZSBIRkEzODR4X0NORkFVVEhFTlRJQ0FUSU9OX09QRU5TWVNURU0JMHgwMDAxCkBAIC0zODcsNzcgKzQwMCw4MSBAQAogI2RlZmluZSBIRkEzODR4X0NORkFVVEhFTlRJQ0FUSU9OX0xFQVAJCTB4MDAwNAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db25maWd1cmF0aW9uIFJlY29yZCBTdHJ1Y3R1cmVzOgotCU5ldHdvcmsgUGFyYW1ldGVycywgRHluYW1pYyBDb25maWd1cmF0aW9uIEVudGl0aWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBDb25maWd1cmF0aW9uIFJlY29yZCBTdHJ1Y3R1cmVzOgorICoJTmV0d29yayBQYXJhbWV0ZXJzLCBEeW5hbWljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCiAjZGVmaW5lIEhGQTM4NHhfQ1JFQVRFSUJTU19KT0lOQ1JFQVRFSUJTUyAgICAgICAgICAwCiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IEhvc3RTY2FuUmVxdWVzdCAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfSG9zdFNjYW5SZXF1ZXN0X2RhdGEgeworc3RydWN0IGhmYTM4NHhfSG9zdFNjYW5SZXF1ZXN0X2RhdGEgewogCXUxNiBjaGFubmVsTGlzdDsKIAl1MTYgdHhSYXRlOwotCWhmYTM4NHhfYnl0ZXN0cjMyX3Qgc3NpZDsKLX0gX19wYWNrZWQgaGZhMzg0eF9Ib3N0U2NhblJlcXVlc3RfZGF0YV90OworCXN0cnVjdCBoZmEzODR4X2J5dGVzdHIzMiBzc2lkOworfSBfX3BhY2tlZDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogSm9pblJlcXVlc3QgKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGEgeworc3RydWN0IGhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YSB7CiAJdTggYnNzaWRbV0xBTl9CU1NJRF9MRU5dOwogCXUxNiBjaGFubmVsOwotfSBfX3BhY2tlZCBoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGFfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGF1dGhlbnRpY2F0ZVN0YXRpb24gKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X2F1dGhlbnRpY2F0ZVN0YXRpb25fZGF0YSB7CitzdHJ1Y3QgaGZhMzg0eF9hdXRoZW50aWNhdGVTdGF0aW9uX2RhdGEgewogCXU4IGFkZHJlc3NbRVRIX0FMRU5dOwogCXUxNiBzdGF0dXM7CiAJdTE2IGFsZ29yaXRobTsKLX0gX19wYWNrZWQgaGZhMzg0eF9hdXRoZW50aWNhdGVTdGF0aW9uX2RhdGFfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IFdQQURhdGEgICAgICAgKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X1dQQURhdGEgeworc3RydWN0IGhmYTM4NHhfV1BBRGF0YSB7CiAJdTE2IGRhdGFsZW47CiAJdTggZGF0YVswXTsJCS8qIG1heCA4MCAqLwotfSBfX3BhY2tlZCBoZmEzODR4X1dQQURhdGFfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUluZm9ybWF0aW9uIFJlY29yZCBTdHJ1Y3R1cmVzOiBOSUMgSW5mb3JtYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIEluZm9ybWF0aW9uIFJlY29yZCBTdHJ1Y3R1cmVzOiBOSUMgSW5mb3JtYXRpb24KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogRG93bkxvYWRCdWZmZXIgLS0qLwogLyogTk9URTogVGhlIHBhZ2UgYW5kIG9mZnNldCBhcmUgaW4gQVVYIGZvcm1hdCAqLwotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9kb3dubG9hZGJ1ZmZlciB7CitzdHJ1Y3QgaGZhMzg0eF9kb3dubG9hZGJ1ZmZlciB7CiAJdTE2IHBhZ2U7CiAJdTE2IG9mZnNldDsKIAl1MTYgbGVuOwotfSBfX3BhY2tlZCBoZmEzODR4X2Rvd25sb2FkYnVmZmVyX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1JbmZvcm1hdGlvbiBSZWNvcmQgU3RydWN0dXJlczogTklDIEluZm9ybWF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBJbmZvcm1hdGlvbiBSZWNvcmQgU3RydWN0dXJlczogTklDIEluZm9ybWF0aW9uCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAogI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfQ09OTl9JQlNTCSgodTE2KTMpCiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBjb21tc3F1YWxpdHkgLS0qLwotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jb21tc3F1YWxpdHkgeworc3RydWN0IGhmYTM4NHhfY29tbXNxdWFsaXR5IHsKIAl1MTYgQ1FfY3VyckJTUzsKIAl1MTYgQVNMX2N1cnJCU1M7CiAJdTE2IEFOTF9jdXJyRkM7Ci19IF9fcGFja2VkIGhmYTM4NHhfY29tbXNxdWFsaXR5X3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogZG1iY29tbXNxdWFsaXR5IC0tKi8KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfZGJtY29tbXNxdWFsaXR5IHsKK3N0cnVjdCBoZmEzODR4X2RibWNvbW1zcXVhbGl0eSB7CiAJdTE2IENRZGJtX2N1cnJCU1M7CiAJdTE2IEFTTGRibV9jdXJyQlNTOwogCXUxNiBBTkxkYm1fY3VyckZDOwotfSBfX3BhY2tlZCBoZmEzODR4X2RibWNvbW1zcXVhbGl0eV90OworfSBfX3BhY2tlZDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRlJBTUUgU1RSVUNUVVJFUzogQ29tbXVuaWNhdGlvbiBGcmFtZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvbW11bmljYXRpb24gRnJhbWVzOiBUcmFuc21pdCBGcmFtZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIEZSQU1FIFNUUlVDVFVSRVM6IENvbW11bmljYXRpb24gRnJhbWVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb21tdW5pY2F0aW9uIEZyYW1lczogVHJhbnNtaXQgRnJhbWVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIC8qLS0gQ29tbXVuaWNhdGlvbiBGcmFtZTogVHJhbnNtaXQgRnJhbWUgU3RydWN0dXJlIC0tKi8KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdHhfZnJhbWUgeworc3RydWN0IGhmYTM4NHhfdHhfZnJhbWUgewogCXUxNiBzdGF0dXM7CiAJdTE2IHJlc2VydmVkMTsKIAl1MTYgcmVzZXJ2ZWQyOwpAQCAtNDgyLDEwICs0OTksMTEgQEAKIAl1OCBkZXN0X2FkZHJbNl07CiAJdTggc3JjX2FkZHJbNl07CiAJdTE2IGRhdGFfbGVuZ3RoOwkvKiBiaWcgZW5kaWFuIGZvcm1hdCAqLwotfSBfX3BhY2tlZCBoZmEzODR4X3R4X2ZyYW1lX3Q7Cit9IF9fcGFja2VkOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29tbXVuaWNhdGlvbiBGcmFtZXM6IEZpZWxkIE1hc2tzIGZvciBUcmFuc21pdCBGcmFtZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIENvbW11bmljYXRpb24gRnJhbWVzOiBGaWVsZCBNYXNrcyBmb3IgVHJhbnNtaXQgRnJhbWVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIC8qLS0gU3RhdHVzIEZpZWxkIC0tKi8KICNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfQUNLRVJSCQkJKCh1MTYpQklUKDUpKQogI2RlZmluZQkJSEZBMzg0eF9UWFNUQVRVU19GT1JNRVJSCQkoKHUxNilCSVQoMykpCkBAIC00OTksMTYgKzUxNywxNyBAQAogI2RlZmluZQkJSEZBMzg0eF9UWF9UWEVYCQkJCSgodTE2KUJJVCgyKSkKICNkZWZpbmUJCUhGQTM4NHhfVFhfVFhPSwkJCQkoKHUxNilCSVQoMSkpCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db21tdW5pY2F0aW9uIEZyYW1lczogVGVzdC9HZXQvU2V0IEZpZWxkIFZhbHVlcyBmb3IgVHJhbnNtaXQgRnJhbWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBDb21tdW5pY2F0aW9uIEZyYW1lczogVGVzdC9HZXQvU2V0IEZpZWxkIFZhbHVlcyBmb3IgVHJhbnNtaXQgRnJhbWVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIC8qLS0gU3RhdHVzIEZpZWxkIC0tKi8KICNkZWZpbmUgSEZBMzg0eF9UWFNUQVRVU19JU0VSUk9SKHYpCVwKLQkoKCh1MTYpKHYpKSZcCi0JKEhGQTM4NHhfVFhTVEFUVVNfQUNLRVJSfEhGQTM4NHhfVFhTVEFUVVNfRk9STUVSUnxcCi0JSEZBMzg0eF9UWFNUQVRVU19ESVNDT058SEZBMzg0eF9UWFNUQVRVU19BR0VERVJSfFwKKwkoKCh1MTYpKHYpKSAmIFwKKwkoSEZBMzg0eF9UWFNUQVRVU19BQ0tFUlIgfCBIRkEzODR4X1RYU1RBVFVTX0ZPUk1FUlIgfCBcCisJSEZBMzg0eF9UWFNUQVRVU19ESVNDT04gfCBIRkEzODR4X1RYU1RBVFVTX0FHRURFUlIgfCBcCiAJSEZBMzg0eF9UWFNUQVRVU19SRVRSWUVSUikpCiAKLSNkZWZpbmUJSEZBMzg0eF9UWF9TRVQodiwgbSwgcykJCSgoKCh1MTYpKHYpKTw8KCh1MTYpKHMpKSkmKCh1MTYpKG0pKSkKKyNkZWZpbmUJSEZBMzg0eF9UWF9TRVQodiwgbSwgcykJCSgoKCh1MTYpKHYpKSA8PCAoKHUxNikocykpKSAmICgodTE2KShtKSkpCiAKICNkZWZpbmUJSEZBMzg0eF9UWF9NQUNQT1JUX1NFVCh2KQlIRkEzODR4X1RYX1NFVCh2LCBIRkEzODR4X1RYX01BQ1BPUlQsIDgpCiAjZGVmaW5lCUhGQTM4NHhfVFhfU1RSVUNUWVBFX1NFVCh2KQlIRkEzODR4X1RYX1NFVCh2LCBcCkBAIC01MTYsMTAgKzUzNSwxMSBAQAogI2RlZmluZQlIRkEzODR4X1RYX1RYRVhfU0VUKHYpCQlIRkEzODR4X1RYX1NFVCh2LCBIRkEzODR4X1RYX1RYRVgsIDIpCiAjZGVmaW5lCUhGQTM4NHhfVFhfVFhPS19TRVQodikJCUhGQTM4NHhfVFhfU0VUKHYsIEhGQTM4NHhfVFhfVFhPSywgMSkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvbW11bmljYXRpb24gRnJhbWVzOiBSZWNlaXZlIEZyYW1lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogQ29tbXVuaWNhdGlvbiBGcmFtZXM6IFJlY2VpdmUgRnJhbWVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIC8qLS0gQ29tbXVuaWNhdGlvbiBGcmFtZTogUmVjZWl2ZSBGcmFtZSBTdHJ1Y3R1cmUgLS0qLwotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9yeF9mcmFtZSB7CitzdHJ1Y3QgaGZhMzg0eF9yeF9mcmFtZSB7CiAJLyotLSBNQUMgcnggZGVzY3JpcHRvciAoaGZhMzg0eCBieXRlIG9yZGVyKSAtLSovCiAJdTE2IHN0YXR1czsKIAl1MzIgdGltZTsKQEAgLTU0NCwxMCArNTY0LDExIEBACiAJdTggZGVzdF9hZGRyWzZdOwogCXU4IHNyY19hZGRyWzZdOwogCXUxNiBkYXRhX2xlbmd0aDsJLyogSUVFRT8gKGJpZyBlbmRpYW4pIGZvcm1hdCAqLwotfSBfX3BhY2tlZCBoZmEzODR4X3J4X2ZyYW1lX3Q7Cit9IF9fcGFja2VkOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29tbXVuaWNhdGlvbiBGcmFtZXM6IEZpZWxkIE1hc2tzIGZvciBSZWNlaXZlIEZyYW1lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogQ29tbXVuaWNhdGlvbiBGcmFtZXM6IEZpZWxkIE1hc2tzIGZvciBSZWNlaXZlIEZyYW1lcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAKIC8qLS0gU3RhdHVzIEZpZWxkcyAtLSovCiAjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlQJCSgodTE2KShCSVQoMTApIHwgXApAQCAtNTU1LDE3ICs1NzYsMTkgQEAKIAkJCQkJCQkJQklUKDgpKSkKICNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfRkNTRVJSCQkJKCh1MTYpQklUKDApKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29tbXVuaWNhdGlvbiBGcmFtZXM6IFRlc3QvR2V0L1NldCBGaWVsZCBWYWx1ZXMgZm9yIFJlY2VpdmUgRnJhbWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBDb21tdW5pY2F0aW9uIEZyYW1lczogVGVzdC9HZXQvU2V0IEZpZWxkIFZhbHVlcyBmb3IgUmVjZWl2ZSBGcmFtZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NQUNQT1JUX0dFVCh2YWx1ZSkJKCh1MTYpKCgoKHUxNikodmFsdWUpKSBcCiAJCQkJCSAgICAmIEhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVCkgPj4gOCkpCiAjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX0lTRkNTRVJSKHZhbHVlKQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgXAogCQkJCQkJICAmIEhGQTM4NHhfUlhTVEFUVVNfRkNTRVJSKSkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGUkFNRSBTVFJVQ1RVUkVTOiBJbmZvcm1hdGlvbiBUeXBlcyBhbmQgSW5mb3JtYXRpb24gRnJhbWUgU3RydWN0dXJlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotSW5mb3JtYXRpb24gVHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIEZSQU1FIFNUUlVDVFVSRVM6IEluZm9ybWF0aW9uIFR5cGVzIGFuZCBJbmZvcm1hdGlvbiBGcmFtZSBTdHJ1Y3R1cmVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmZvcm1hdGlvbiBUeXBlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAjZGVmaW5lCQlIRkEzODR4X0lUX0hBTkRPVkVSQUREUgkJCSgodTE2KTB4RjAwMFVMKQogI2RlZmluZQkJSEZBMzg0eF9JVF9DT01NVEFMTElFUwkJCSgodTE2KTB4RjEwMFVMKQogI2RlZmluZQkJSEZBMzg0eF9JVF9TQ0FOUkVTVUxUUwkJCSgodTE2KTB4RjEwMVVMKQpAQCAtNTgwLDEzICs2MDMsMTQgQEAKICNkZWZpbmUJCUhGQTM4NHhfSVRfTUlDRkFJTFVSRQkJCSgodTE2KTB4RjIwNlVMKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1JbmZvcm1hdGlvbiBGcmFtZXMgU3RydWN0dXJlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotSW5mb3JtYXRpb24gRnJhbWVzOiBOb3RpZmljYXRpb24gRnJhbWUgU3RydWN0dXJlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogSW5mb3JtYXRpb24gRnJhbWVzIFN0cnVjdHVyZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluZm9ybWF0aW9uIEZyYW1lczogTm90aWZpY2F0aW9uIEZyYW1lIFN0cnVjdHVyZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCiAvKi0tICBJbnF1aXJ5IEZyYW1lLCBEaWFnbm9zZTogQ29tbXVuaWNhdGlvbiBUYWxsaWVzIC0tKi8KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ29tbVRhbGxpZXMxNiB7CitzdHJ1Y3QgaGZhMzg0eF9Db21tVGFsbGllczE2IHsKIAl1MTYgdHh1bmljYXN0ZnJhbWVzOwogCXUxNiB0eG11bHRpY2FzdGZyYW1lczsKIAl1MTYgdHhmcmFnbWVudHM7CkBAIC02MDgsOSArNjMyLDkgQEAKIAl1MTYgcnhkaXNjYXJkc3dlcHVuZGVjcjsKIAl1MTYgcnhtc2dpbm1zZ2ZyYWc7CiAJdTE2IHJ4bXNnaW5iYWRtc2dmcmFnOwotfSBfX3BhY2tlZCBoZmEzODR4X0NvbW1UYWxsaWVzMTZfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ29tbVRhbGxpZXMzMiB7CitzdHJ1Y3QgaGZhMzg0eF9Db21tVGFsbGllczMyIHsKIAl1MzIgdHh1bmljYXN0ZnJhbWVzOwogCXUzMiB0eG11bHRpY2FzdGZyYW1lczsKIAl1MzIgdHhmcmFnbWVudHM7CkBAIC02MzIsNjIgKzY1Niw2MiBAQAogCXUzMiByeGRpc2NhcmRzd2VwdW5kZWNyOwogCXUzMiByeG1zZ2lubXNnZnJhZzsKIAl1MzIgcnhtc2dpbmJhZG1zZ2ZyYWc7Ci19IF9fcGFja2VkIGhmYTM4NHhfQ29tbVRhbGxpZXMzMl90OworfSBfX3BhY2tlZDsKIAogLyotLSAgSW5xdWlyeSBGcmFtZSwgRGlhZ25vc2U6IFNjYW4gUmVzdWx0cyAmIFN1YmZpZWxkcy0tKi8KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfU2NhblJlc3VsdFN1YiB7CitzdHJ1Y3QgaGZhMzg0eF9TY2FuUmVzdWx0U3ViIHsKIAl1MTYgY2hpZDsKIAl1MTYgYW5sOwogCXUxNiBzbDsKIAl1OCBic3NpZFtXTEFOX0JTU0lEX0xFTl07CiAJdTE2IGJjbmludDsKIAl1MTYgY2FwaW5mbzsKLQloZmEzODR4X2J5dGVzdHIzMl90IHNzaWQ7CisJc3RydWN0IGhmYTM4NHhfYnl0ZXN0cjMyIHNzaWQ7CiAJdTggc3VwcHJhdGVzWzEwXTsJLyogODAyLjExIGluZm8gZWxlbWVudCAqLwogCXUxNiBwcm9iZXJlc3BfcmF0ZTsKLX0gX19wYWNrZWQgaGZhMzg0eF9TY2FuUmVzdWx0U3ViX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X1NjYW5SZXN1bHQgeworc3RydWN0IGhmYTM4NHhfU2NhblJlc3VsdCB7CiAJdTE2IHJzdmQ7CiAJdTE2IHNjYW5yZWFzb247Ci0JaGZhMzg0eF9TY2FuUmVzdWx0U3ViX3QgcmVzdWx0W0hGQTM4NHhfU0NBTlJFU1VMVF9NQVhdOwotfSBfX3BhY2tlZCBoZmEzODR4X1NjYW5SZXN1bHRfdDsKKwlzdHJ1Y3QgaGZhMzg0eF9TY2FuUmVzdWx0U3ViIHJlc3VsdFtIRkEzODR4X1NDQU5SRVNVTFRfTUFYXTsKK30gX19wYWNrZWQ7CiAKIC8qLS0gIElucXVpcnkgRnJhbWUsIERpYWdub3NlOiBDaEluZm8gUmVzdWx0cyAmIFN1YmZpZWxkcy0tKi8KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ2hJbmZvUmVzdWx0U3ViIHsKK3N0cnVjdCBoZmEzODR4X0NoSW5mb1Jlc3VsdFN1YiB7CiAJdTE2IGNoaWQ7CiAJdTE2IGFubDsKIAl1MTYgcG5sOwogCXUxNiBhY3RpdmU7Ci19IF9fcGFja2VkIGhmYTM4NHhfQ2hJbmZvUmVzdWx0U3ViX3Q7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhGQTM4NHhfQ0hJTkZPUkVTVUxUX0JTU0FDVElWRQlCSVQoMCkKICNkZWZpbmUgSEZBMzg0eF9DSElORk9SRVNVTFRfUENGQUNUSVZFCUJJVCgxKQogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NoSW5mb1Jlc3VsdCB7CitzdHJ1Y3QgaGZhMzg0eF9DaEluZm9SZXN1bHQgewogCXUxNiBzY2FuY2hhbm5lbHM7Ci0JaGZhMzg0eF9DaEluZm9SZXN1bHRTdWJfdCByZXN1bHRbSEZBMzg0eF9DSElORk9SRVNVTFRfTUFYXTsKLX0gX19wYWNrZWQgaGZhMzg0eF9DaEluZm9SZXN1bHRfdDsKKwlzdHJ1Y3QgaGZhMzg0eF9DaEluZm9SZXN1bHRTdWIgcmVzdWx0W0hGQTM4NHhfQ0hJTkZPUkVTVUxUX01BWF07Cit9IF9fcGFja2VkOwogCiAvKi0tICBJbnF1aXJ5IEZyYW1lLCBEaWFnbm9zZTogSG9zdCBTY2FuIFJlc3VsdHMgJiBTdWJmaWVsZHMtLSovCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0hTY2FuUmVzdWx0U3ViIHsKK3N0cnVjdCBoZmEzODR4X0hTY2FuUmVzdWx0U3ViIHsKIAl1MTYgY2hpZDsKIAl1MTYgYW5sOwogCXUxNiBzbDsKIAl1OCBic3NpZFtXTEFOX0JTU0lEX0xFTl07CiAJdTE2IGJjbmludDsKIAl1MTYgY2FwaW5mbzsKLQloZmEzODR4X2J5dGVzdHIzMl90IHNzaWQ7CisJc3RydWN0IGhmYTM4NHhfYnl0ZXN0cjMyIHNzaWQ7CiAJdTggc3VwcHJhdGVzWzEwXTsJLyogODAyLjExIGluZm8gZWxlbWVudCAqLwogCXUxNiBwcm9iZXJlc3BfcmF0ZTsKIAl1MTYgYXRpbTsKLX0gX19wYWNrZWQgaGZhMzg0eF9IU2NhblJlc3VsdFN1Yl90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9IU2NhblJlc3VsdCB7CitzdHJ1Y3QgaGZhMzg0eF9IU2NhblJlc3VsdCB7CiAJdTE2IG5yZXN1bHQ7CiAJdTE2IHJzdmQ7Ci0JaGZhMzg0eF9IU2NhblJlc3VsdFN1Yl90IHJlc3VsdFtIRkEzODR4X0hTQ0FOUkVTVUxUX01BWF07Ci19IF9fcGFja2VkIGhmYTM4NHhfSFNjYW5SZXN1bHRfdDsKKwlzdHJ1Y3QgaGZhMzg0eF9IU2NhblJlc3VsdFN1YiByZXN1bHRbSEZBMzg0eF9IU0NBTlJFU1VMVF9NQVhdOworfSBfX3BhY2tlZDsKIAogLyotLSAgVW5zb2xpY2l0ZWQgRnJhbWUsIE1BQyBNZ210OiBMaW5rU3RhdHVzIC0tKi8KIApAQCAtNjk5LDkgKzcyMyw5IEBACiAjZGVmaW5lIEhGQTM4NHhfTElOS19BUF9JTlJBTkdFCQkoKHUxNik1KQogI2RlZmluZSBIRkEzODR4X0xJTktfQVNTT0NGQUlMCQkoKHUxNik2KQogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0xpbmtTdGF0dXMgeworc3RydWN0IGhmYTM4NHhfTGlua1N0YXR1cyB7CiAJdTE2IGxpbmtzdGF0dXM7Ci19IF9fcGFja2VkIGhmYTM4NHhfTGlua1N0YXR1c190OworfSBfX3BhY2tlZDsKIAogLyotLSAgVW5zb2xpY2l0ZWQgRnJhbWUsIE1BQyBNZ210OiBBc3NvY2lhdGlvblN0YXR1cyAoLS0qLwogCkBAIC03MDksNTYgKzczMyw1NyBAQAogI2RlZmluZSBIRkEzODR4X0FTU09DU1RBVFVTX1JFQVNTT0MJKCh1MTYpMikKICNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19BVVRIRkFJTAkoKHUxNik1KQogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0Fzc29jU3RhdHVzIHsKK3N0cnVjdCBoZmEzODR4X0Fzc29jU3RhdHVzIHsKIAl1MTYgYXNzb2NzdGF0dXM7CiAJdTggc3RhX2FkZHJbRVRIX0FMRU5dOwogCS8qIG9sZF9hcF9hZGRyIGlzIG9ubHkgdmFsaWQgaWYgYXNzb2NzdGF0dXMgPT0gMiAqLwogCXU4IG9sZF9hcF9hZGRyW0VUSF9BTEVOXTsKIAl1MTYgcmVhc29uOwogCXUxNiByZXNlcnZlZDsKLX0gX19wYWNrZWQgaGZhMzg0eF9Bc3NvY1N0YXR1c190OworfSBfX3BhY2tlZDsKIAogLyotLSAgVW5zb2xpY2l0ZWQgRnJhbWUsIE1BQyBNZ210OiBBdXRoUmVxdWVzdCAoQVAgT25seSkgLS0qLwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0F1dGhSZXF1ZXN0IHsKK3N0cnVjdCBoZmEzODR4X0F1dGhSZXF1ZXN0IHsKIAl1OCBzdGFfYWRkcltFVEhfQUxFTl07CiAJdTE2IGFsZ29yaXRobTsKLX0gX19wYWNrZWQgaGZhMzg0eF9BdXRoUmVxX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tICBVbnNvbGljaXRlZCBGcmFtZSwgTUFDIE1nbXQ6IFBTVXNlckNvdW50IChBUCBPbmx5KSAtLSovCiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUFNVc2VyQ291bnQgeworc3RydWN0IGhmYTM4NHhfUFNVc2VyQ291bnQgewogCXUxNiB1c2VyY250OwotfSBfX3BhY2tlZCBoZmEzODR4X1BTVXNlckNvdW50X3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0tleUlEQ2hhbmdlZCB7CitzdHJ1Y3QgaGZhMzg0eF9LZXlJRENoYW5nZWQgewogCXU4IHN0YV9hZGRyW0VUSF9BTEVOXTsKIAl1MTYga2V5aWQ7Ci19IF9fcGFja2VkIGhmYTM4NHhfS2V5SURDaGFuZ2VkX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tICBDb2xsZWN0aW9uIG9mIGFsbCBJbmYgZnJhbWVzIC0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHVuaW9uIGhmYTM4NHhfaW5mb2RhdGEgewotCWhmYTM4NHhfQ29tbVRhbGxpZXMxNl90IGNvbW10YWxsaWVzMTY7Ci0JaGZhMzg0eF9Db21tVGFsbGllczMyX3QgY29tbXRhbGxpZXMzMjsKLQloZmEzODR4X1NjYW5SZXN1bHRfdCBzY2FucmVzdWx0OwotCWhmYTM4NHhfQ2hJbmZvUmVzdWx0X3QgY2hpbmZvcmVzdWx0OwotCWhmYTM4NHhfSFNjYW5SZXN1bHRfdCBoc2NhbnJlc3VsdDsKLQloZmEzODR4X0xpbmtTdGF0dXNfdCBsaW5rc3RhdHVzOwotCWhmYTM4NHhfQXNzb2NTdGF0dXNfdCBhc3NvY3N0YXR1czsKLQloZmEzODR4X0F1dGhSZXFfdCBhdXRocmVxOwotCWhmYTM4NHhfUFNVc2VyQ291bnRfdCBwc3VzZXJjbnQ7Ci0JaGZhMzg0eF9LZXlJRENoYW5nZWRfdCBrZXlpZGNoYW5nZWQ7Ci19IF9fcGFja2VkIGhmYTM4NHhfaW5mb2RhdGFfdDsKK3VuaW9uIGhmYTM4NHhfaW5mb2RhdGEgeworCXN0cnVjdCBoZmEzODR4X0NvbW1UYWxsaWVzMTYgY29tbXRhbGxpZXMxNjsKKwlzdHJ1Y3QgaGZhMzg0eF9Db21tVGFsbGllczMyIGNvbW10YWxsaWVzMzI7CisJc3RydWN0IGhmYTM4NHhfU2NhblJlc3VsdCBzY2FucmVzdWx0OworCXN0cnVjdCBoZmEzODR4X0NoSW5mb1Jlc3VsdCBjaGluZm9yZXN1bHQ7CisJc3RydWN0IGhmYTM4NHhfSFNjYW5SZXN1bHQgaHNjYW5yZXN1bHQ7CisJc3RydWN0IGhmYTM4NHhfTGlua1N0YXR1cyBsaW5rc3RhdHVzOworCXN0cnVjdCBoZmEzODR4X0Fzc29jU3RhdHVzIGFzc29jc3RhdHVzOworCXN0cnVjdCBoZmEzODR4X0F1dGhSZXF1ZXN0IGF1dGhyZXE7CisJc3RydWN0IGhmYTM4NHhfUFNVc2VyQ291bnQgcHN1c2VyY250OworCXN0cnVjdCBoZmEzODR4X0tleUlEQ2hhbmdlZCBrZXlpZGNoYW5nZWQ7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0luZkZyYW1lIHsKK3N0cnVjdCBoZmEzODR4X0luZkZyYW1lIHsKIAl1MTYgZnJhbWVsZW47CiAJdTE2IGluZm90eXBlOwotCWhmYTM4NHhfaW5mb2RhdGFfdCBpbmZvOwotfSBfX3BhY2tlZCBoZmEzODR4X0luZkZyYW1lX3Q7CisJdW5pb24gaGZhMzg0eF9pbmZvZGF0YSBpbmZvOworfSBfX3BhY2tlZDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVVNCIFBhY2tldCBzdHJ1Y3R1cmVzIGFuZCBjb25zdGFudHMuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBVU0IgUGFja2V0IHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cy4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCiAvKiBTaG91bGQgYmUgc2VudCB0byB0aGUgYnVsa291dCBlbmRwb2ludCAqLwogI2RlZmluZSBIRkEzODR4X1VTQl9UWEZSTQkwCkBAIC03ODMsMTQzICs4MDgsMTQwIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBSZXF1ZXN0IChidWxrIE9VVCkgcGFja2V0IGNvbnRlbnRzICovCiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3R4ZnJtIHsKLQloZmEzODR4X3R4X2ZyYW1lX3QgZGVzYzsKK3N0cnVjdCBoZmEzODR4X3VzYl90eGZybSB7CisJc3RydWN0IGhmYTM4NHhfdHhfZnJhbWUgZGVzYzsKIAl1OCBkYXRhW1dMQU5fREFUQV9NQVhMRU5dOwotfSBfX3BhY2tlZCBoZmEzODR4X3VzYl90eGZybV90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfY21kcmVxIHsKK3N0cnVjdCBoZmEzODR4X3VzYl9jbWRyZXEgewogCXUxNiB0eXBlOwogCXUxNiBjbWQ7CiAJdTE2IHBhcm0wOwogCXUxNiBwYXJtMTsKIAl1MTYgcGFybTI7CiAJdTggcGFkWzU0XTsKLX0gX19wYWNrZWQgaGZhMzg0eF91c2JfY21kcmVxX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl93cmlkcmVxIHsKK3N0cnVjdCBoZmEzODR4X3VzYl93cmlkcmVxIHsKIAl1MTYgdHlwZTsKIAl1MTYgZnJtbGVuOwogCXUxNiByaWQ7CiAJdTggZGF0YVtIRkEzODR4X1JJRERBVEFfTUFYTEVOXTsKLX0gX19wYWNrZWQgaGZhMzg0eF91c2Jfd3JpZHJlcV90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfcnJpZHJlcSB7CitzdHJ1Y3QgaGZhMzg0eF91c2JfcnJpZHJlcSB7CiAJdTE2IHR5cGU7CiAJdTE2IGZybWxlbjsKIAl1MTYgcmlkOwogCXU4IHBhZFs1OF07Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNiX3JyaWRyZXFfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3dtZW1yZXEgeworc3RydWN0IGhmYTM4NHhfdXNiX3dtZW1yZXEgewogCXUxNiB0eXBlOwogCXUxNiBmcm1sZW47CiAJdTE2IG9mZnNldDsKIAl1MTYgcGFnZTsKIAl1OCBkYXRhW0hGQTM4NHhfVVNCX1JXTUVNX01BWExFTl07Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNiX3dtZW1yZXFfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3JtZW1yZXEgeworc3RydWN0IGhmYTM4NHhfdXNiX3JtZW1yZXEgewogCXUxNiB0eXBlOwogCXUxNiBmcm1sZW47CiAJdTE2IG9mZnNldDsKIAl1MTYgcGFnZTsKIAl1OCBwYWRbNTZdOwotfSBfX3BhY2tlZCBoZmEzODR4X3VzYl9ybWVtcmVxX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBSZXNwb25zZSAoYnVsayBJTikgcGFja2V0IGNvbnRlbnRzICovCiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3J4ZnJtIHsKLQloZmEzODR4X3J4X2ZyYW1lX3QgZGVzYzsKK3N0cnVjdCBoZmEzODR4X3VzYl9yeGZybSB7CisJc3RydWN0IGhmYTM4NHhfcnhfZnJhbWUgZGVzYzsKIAl1OCBkYXRhW1dMQU5fREFUQV9NQVhMRU5dOwotfSBfX3BhY2tlZCBoZmEzODR4X3VzYl9yeGZybV90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfaW5mb2ZybSB7CitzdHJ1Y3QgaGZhMzg0eF91c2JfaW5mb2ZybSB7CiAJdTE2IHR5cGU7Ci0JaGZhMzg0eF9JbmZGcmFtZV90IGluZm87Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNiX2luZm9mcm1fdDsKKwlzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSBpbmZvOworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2Jfc3RhdHVzcmVzcCB7CitzdHJ1Y3QgaGZhMzg0eF91c2Jfc3RhdHVzcmVzcCB7CiAJdTE2IHR5cGU7CiAJdTE2IHN0YXR1czsKIAl1MTYgcmVzcDA7CiAJdTE2IHJlc3AxOwogCXUxNiByZXNwMjsKLX0gX19wYWNrZWQgaGZhMzg0eF91c2JfY21kcmVzcF90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBoZmEzODR4X3VzYl9jbWRyZXNwX3QgaGZhMzg0eF91c2Jfd3JpZHJlc3BfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfcnJpZHJlc3Ageworc3RydWN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwIHsKIAl1MTYgdHlwZTsKIAl1MTYgZnJtbGVuOwogCXUxNiByaWQ7CiAJdTggZGF0YVtIRkEzODR4X1JJRERBVEFfTUFYTEVOXTsKLX0gX19wYWNrZWQgaGZhMzg0eF91c2JfcnJpZHJlc3BfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgaGZhMzg0eF91c2JfY21kcmVzcF90IGhmYTM4NHhfdXNiX3dtZW1yZXNwX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3JtZW1yZXNwIHsKK3N0cnVjdCBoZmEzODR4X3VzYl9ybWVtcmVzcCB7CiAJdTE2IHR5cGU7CiAJdTE2IGZybWxlbjsKIAl1OCBkYXRhW0hGQTM4NHhfVVNCX1JXTUVNX01BWExFTl07Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNiX3JtZW1yZXNwX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9idWZhdmFpbCB7CitzdHJ1Y3QgaGZhMzg0eF91c2JfYnVmYXZhaWwgewogCXUxNiB0eXBlOwogCXUxNiBmcm1sZW47Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNiX2J1ZmF2YWlsX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9lcnJvciB7CitzdHJ1Y3QgaGZhMzg0eF91c2JfZXJyb3IgewogCXUxNiB0eXBlOwogCXUxNiBlcnJvcnR5cGU7Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNiX2Vycm9yX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogVW5pb25zIGZvciBwYWNrYWdpbmcgYWxsIHRoZSBrbm93biBwYWNrZXQgdHlwZXMgdG9nZXRoZXIgKi8KIAotdHlwZWRlZiB1bmlvbiBoZmEzODR4X3VzYm91dCB7Cit1bmlvbiBoZmEzODR4X3VzYm91dCB7CiAJX19sZTE2IHR5cGU7Ci0JaGZhMzg0eF91c2JfdHhmcm1fdCB0eGZybTsKLQloZmEzODR4X3VzYl9jbWRyZXFfdCBjbWRyZXE7Ci0JaGZhMzg0eF91c2Jfd3JpZHJlcV90IHdyaWRyZXE7Ci0JaGZhMzg0eF91c2JfcnJpZHJlcV90IHJyaWRyZXE7Ci0JaGZhMzg0eF91c2Jfd21lbXJlcV90IHdtZW1yZXE7Ci0JaGZhMzg0eF91c2Jfcm1lbXJlcV90IHJtZW1yZXE7Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNib3V0X3Q7CisJc3RydWN0IGhmYTM4NHhfdXNiX3R4ZnJtIHR4ZnJtOworCXN0cnVjdCBoZmEzODR4X3VzYl9jbWRyZXEgY21kcmVxOworCXN0cnVjdCBoZmEzODR4X3VzYl93cmlkcmVxIHdyaWRyZXE7CisJc3RydWN0IGhmYTM4NHhfdXNiX3JyaWRyZXEgcnJpZHJlcTsKKwlzdHJ1Y3QgaGZhMzg0eF91c2Jfd21lbXJlcSB3bWVtcmVxOworCXN0cnVjdCBoZmEzODR4X3VzYl9ybWVtcmVxIHJtZW1yZXE7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHVuaW9uIGhmYTM4NHhfdXNiaW4gewordW5pb24gaGZhMzg0eF91c2JpbiB7CiAJX19sZTE2IHR5cGU7Ci0JaGZhMzg0eF91c2Jfcnhmcm1fdCByeGZybTsKLQloZmEzODR4X3VzYl90eGZybV90IHR4ZnJtOwotCWhmYTM4NHhfdXNiX2luZm9mcm1fdCBpbmZvZnJtOwotCWhmYTM4NHhfdXNiX2NtZHJlc3BfdCBjbWRyZXNwOwotCWhmYTM4NHhfdXNiX3dyaWRyZXNwX3Qgd3JpZHJlc3A7Ci0JaGZhMzg0eF91c2JfcnJpZHJlc3BfdCBycmlkcmVzcDsKLQloZmEzODR4X3VzYl93bWVtcmVzcF90IHdtZW1yZXNwOwotCWhmYTM4NHhfdXNiX3JtZW1yZXNwX3Qgcm1lbXJlc3A7Ci0JaGZhMzg0eF91c2JfYnVmYXZhaWxfdCBidWZhdmFpbDsKLQloZmEzODR4X3VzYl9lcnJvcl90IHVzYmVycm9yOworCXN0cnVjdCBoZmEzODR4X3VzYl9yeGZybSByeGZybTsKKwlzdHJ1Y3QgaGZhMzg0eF91c2JfdHhmcm0gdHhmcm07CisJc3RydWN0IGhmYTM4NHhfdXNiX2luZm9mcm0gaW5mb2ZybTsKKwlzdHJ1Y3QgaGZhMzg0eF91c2Jfc3RhdHVzcmVzcCBjbWRyZXNwOworCXN0cnVjdCBoZmEzODR4X3VzYl9zdGF0dXNyZXNwIHdyaWRyZXNwOworCXN0cnVjdCBoZmEzODR4X3VzYl9ycmlkcmVzcCBycmlkcmVzcDsKKwlzdHJ1Y3QgaGZhMzg0eF91c2Jfc3RhdHVzcmVzcCB3bWVtcmVzcDsKKwlzdHJ1Y3QgaGZhMzg0eF91c2Jfcm1lbXJlc3Agcm1lbXJlc3A7CisJc3RydWN0IGhmYTM4NHhfdXNiX2J1ZmF2YWlsIGJ1ZmF2YWlsOworCXN0cnVjdCBoZmEzODR4X3VzYl9lcnJvciB1c2JlcnJvcjsKIAl1OCBib2d1c3BhZFszMDAwXTsKLX0gX19wYWNrZWQgaGZhMzg0eF91c2Jpbl90OworfSBfX3BhY2tlZDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotUEQgcmVjb3JkIHN0cnVjdHVyZXMuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBQRCByZWNvcmQgc3RydWN0dXJlcy4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9wY2JfcGFydG51bSB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfcGNiX3BhcnRudW0gewogCXU4IG51bVs4XTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfcGNiX3BhcnRudW1fdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3BjYl90cmFjZW51bSB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfcGNiX3RyYWNlbnVtIHsKIAl1OCBudW1bOF07Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX3BjYl90cmFjZW51bV90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbmljX3NlcmlhbCB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfbmljX3NlcmlhbCB7CiAJdTggbnVtWzEyXTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfbmljX3NlcmlhbF90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbWtrX21lYXN1cmVtZW50cyB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfbWtrX21lYXN1cmVtZW50cyB7CiAJZG91YmxlIGNhcnJpZXJfZnJlcTsKIAlkb3VibGUgb2NjdXBpZWRfYmFuZDsKIAlkb3VibGUgcG93ZXJfZGVuc2l0eTsKQEAgLTkzNSwxOTIgKzk1NywxOTMgQEAKIAlkb3VibGUgcnhfc3B1cl9mMjsKIAlkb3VibGUgcnhfc3B1cl9sMTsKIAlkb3VibGUgcnhfc3B1cl9sMjsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfbWtrX21lYXN1cmVtZW50c190OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbmljX3JhbXNpemUgeworc3RydWN0IGhmYTM4NHhfcGRyX25pY19yYW1zaXplIHsKIAl1OCBzaXplWzEyXTsJCS8qIHVuaXRzIG9mIEtCICovCi19IF9fcGFja2VkIGhmYTM4NHhfcGRyX25pY19yYW1zaXplX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9tZmlzdXByYW5nZSB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfbWZpc3VwcmFuZ2UgewogCXUxNiBpZDsKIAl1MTYgdmFyaWFudDsKIAl1MTYgYm90dG9tOwogCXUxNiB0b3A7Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX21maXN1cHJhbmdlX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9jZmlzdXByYW5nZSB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfY2Zpc3VwcmFuZ2UgewogCXUxNiBpZDsKIAl1MTYgdmFyaWFudDsKIAl1MTYgYm90dG9tOwogCXUxNiB0b3A7Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX2NmaXN1cHJhbmdlX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9uaWNpZCB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfbmljaWQgewogCXUxNiBpZDsKIAl1MTYgdmFyaWFudDsKIAl1MTYgbWFqb3I7CiAJdTE2IG1pbm9yOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9uaWNpZF90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcmVmZGFjX21lYXN1cmVtZW50cyB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfcmVmZGFjX21lYXN1cmVtZW50cyB7CiAJdTE2IHZhbHVlWzBdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9yZWZkYWNfbWVhc3VyZW1lbnRzX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl92Z2RhY19tZWFzdXJlbWVudHMgeworc3RydWN0IGhmYTM4NHhfcGRyX3ZnZGFjX21lYXN1cmVtZW50cyB7CiAJdTE2IHZhbHVlWzBdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl92Z2RhY19tZWFzdXJlbWVudHNfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2xldmVsX2NvbXBfbWVhc3VyZW1lbnRzIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9sZXZlbF9jb21wX21lYXN1cmVtZW50cyB7CiAJdTE2IHZhbHVlWzBdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9sZXZlbF9jb21wY19tZWFzdXJlbWVudHNfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX21hY19hZGRyZXNzIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9tYWNfYWRkcmVzcyB7CiAJdTggYWRkcls2XTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfbWFjX2FkZHJlc3NfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX21ra19jYWxsbmFtZSB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfbWtrX2NhbGxuYW1lIHsKIAl1OCBjYWxsbmFtZVs4XTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfbWtrX2NhbGxuYW1lX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9yZWdkb21haW4geworc3RydWN0IGhmYTM4NHhfcGRyX3JlZ2RvbWFpbiB7CiAJdTE2IG51bWRvbWFpbnM7CiAJdTE2IGRvbWFpbls1XTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfcmVnZG9tYWluX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9hbGxvd2VkX2NoYW5uZWwgeworc3RydWN0IGhmYTM4NHhfcGRyX2FsbG93ZWRfY2hhbm5lbCB7CiAJdTE2IGNoX2JpdG1hcDsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfYWxsb3dlZF9jaGFubmVsX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9kZWZhdWx0X2NoYW5uZWwgeworc3RydWN0IGhmYTM4NHhfcGRyX2RlZmF1bHRfY2hhbm5lbCB7CiAJdTE2IGNoYW5uZWw7Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX2RlZmF1bHRfY2hhbm5lbF90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcHJpdmFjeV9vcHRpb24geworc3RydWN0IGhmYTM4NHhfcGRyX3ByaXZhY3lfb3B0aW9uIHsKIAl1MTYgYXZhaWxhYmxlOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9wcml2YWN5X29wdGlvbl90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfdGVtcHR5cGUgeworc3RydWN0IGhmYTM4NHhfcGRyX3RlbXB0eXBlIHsKIAl1MTYgdHlwZTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfdGVtcHR5cGVfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3JlZmRhY19zZXR1cCB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfcmVmZGFjX3NldHVwIHsKIAl1MTYgY2hfdmFsdWVbMTRdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9yZWZkYWNfc2V0dXBfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3ZnZGFjX3NldHVwIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl92Z2RhY19zZXR1cCB7CiAJdTE2IGNoX3ZhbHVlWzE0XTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfdmdkYWNfc2V0dXBfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2xldmVsX2NvbXBfc2V0dXAgeworc3RydWN0IGhmYTM4NHhfcGRyX2xldmVsX2NvbXBfc2V0dXAgewogCXUxNiBjaF92YWx1ZVsxNF07Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX2xldmVsX2NvbXBfc2V0dXBfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3RyaW1kYWNfc2V0dXAgeworc3RydWN0IGhmYTM4NHhfcGRyX3RyaW1kYWNfc2V0dXAgewogCXUxNiB0cmltaWRhYzsKIAl1MTYgdHJpbXFkYWM7Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX3RyaW1kYWNfc2V0dXBfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2lmcl9zZXR0aW5nIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9pZnJfc2V0dGluZyB7CiAJdTE2IHZhbHVlWzNdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9pZnJfc2V0dGluZ190OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcmZyX3NldHRpbmcgeworc3RydWN0IGhmYTM4NHhfcGRyX3Jmcl9zZXR0aW5nIHsKIAl1MTYgdmFsdWVbM107Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX3Jmcl9zZXR0aW5nX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2Jhc2VsaW5lIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2Jhc2VsaW5lIHsKIAl1MTYgdmFsdWVbNTBdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9oZmEzODYxX2Jhc2VsaW5lX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX3NoYWRvdyB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9zaGFkb3cgewogCXUzMiB2YWx1ZVszMl07Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX2hmYTM4NjFfc2hhZG93X3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2lmcmYgeworc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfaWZyZiB7CiAJdTMyIHZhbHVlWzIwXTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfaGZhMzg2MV9pZnJmX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2NoY2Fsc3Ageworc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxzcCB7CiAJdTE2IHZhbHVlWzE0XTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfaGZhMzg2MV9jaGNhbHNwX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2NoY2FsaSB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9jaGNhbGkgewogCXUxNiB2YWx1ZVsxN107Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxpX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX25pY19jb25maWcgeworc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfbmljX2NvbmZpZyB7CiAJdTE2IGNvbmZpZ19iaXRtYXA7Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX25pY19jb25maWdfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2hmb19kZWxheSB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZvX2RlbGF5IHsKIAl1OCBoZm9fZGVsYXk7Ci19IF9fcGFja2VkIGhmYTM4NHhfaGZvX2RlbGF5X3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdHNwIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdHNwIHsKIAl1MTYgdmFsdWVbMzBdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdHNwX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdGkgeworc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfbWFuZl90ZXN0aSB7CiAJdTE2IHZhbHVlWzMwXTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RpX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X2VuZF9vZl9wZGEgeworc3RydWN0IGhmYTM4NHhfcGRyX2VuZF9vZl9wZGEgewogCXUxNiBjcmM7Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX2VuZF9vZl9wZGFfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyZWMgeworc3RydWN0IGhmYTM4NHhfcGRyZWMgewogCXUxNiBsZW47CQkvKiBpbiB3b3JkcyAqLwogCXUxNiBjb2RlOwogCXVuaW9uIHBkciB7Ci0JCWhmYTM4NHhfcGRyX3BjYl9wYXJ0bnVtX3QgcGNiX3BhcnRudW07Ci0JCWhmYTM4NHhfcGRyX3BjYl90cmFjZW51bV90IHBjYl90cmFjZW51bTsKLQkJaGZhMzg0eF9wZHJfbmljX3NlcmlhbF90IG5pY19zZXJpYWw7Ci0JCWhmYTM4NHhfcGRyX21ra19tZWFzdXJlbWVudHNfdCBta2tfbWVhc3VyZW1lbnRzOwotCQloZmEzODR4X3Bkcl9uaWNfcmFtc2l6ZV90IG5pY19yYW1zaXplOwotCQloZmEzODR4X3Bkcl9tZmlzdXByYW5nZV90IG1maXN1cHJhbmdlOwotCQloZmEzODR4X3Bkcl9jZmlzdXByYW5nZV90IGNmaXN1cHJhbmdlOwotCQloZmEzODR4X3Bkcl9uaWNpZF90IG5pY2lkOwotCQloZmEzODR4X3Bkcl9yZWZkYWNfbWVhc3VyZW1lbnRzX3QgcmVmZGFjX21lYXN1cmVtZW50czsKLQkJaGZhMzg0eF9wZHJfdmdkYWNfbWVhc3VyZW1lbnRzX3QgdmdkYWNfbWVhc3VyZW1lbnRzOwotCQloZmEzODR4X3Bkcl9sZXZlbF9jb21wY19tZWFzdXJlbWVudHNfdCBsZXZlbF9jb21wY19tZWFzdXJlbWVudHM7Ci0JCWhmYTM4NHhfcGRyX21hY19hZGRyZXNzX3QgbWFjX2FkZHJlc3M7Ci0JCWhmYTM4NHhfcGRyX21ra19jYWxsbmFtZV90IG1ra19jYWxsbmFtZTsKLQkJaGZhMzg0eF9wZHJfcmVnZG9tYWluX3QgcmVnZG9tYWluOwotCQloZmEzODR4X3Bkcl9hbGxvd2VkX2NoYW5uZWxfdCBhbGxvd2VkX2NoYW5uZWw7Ci0JCWhmYTM4NHhfcGRyX2RlZmF1bHRfY2hhbm5lbF90IGRlZmF1bHRfY2hhbm5lbDsKLQkJaGZhMzg0eF9wZHJfcHJpdmFjeV9vcHRpb25fdCBwcml2YWN5X29wdGlvbjsKLQkJaGZhMzg0eF9wZHJfdGVtcHR5cGVfdCB0ZW1wdHlwZTsKLQkJaGZhMzg0eF9wZHJfcmVmZGFjX3NldHVwX3QgcmVmZGFjX3NldHVwOwotCQloZmEzODR4X3Bkcl92Z2RhY19zZXR1cF90IHZnZGFjX3NldHVwOwotCQloZmEzODR4X3Bkcl9sZXZlbF9jb21wX3NldHVwX3QgbGV2ZWxfY29tcF9zZXR1cDsKLQkJaGZhMzg0eF9wZHJfdHJpbWRhY19zZXR1cF90IHRyaW1kYWNfc2V0dXA7Ci0JCWhmYTM4NHhfcGRyX2lmcl9zZXR0aW5nX3QgaWZyX3NldHRpbmc7Ci0JCWhmYTM4NHhfcGRyX3Jmcl9zZXR0aW5nX3QgcmZyX3NldHRpbmc7Ci0JCWhmYTM4NHhfcGRyX2hmYTM4NjFfYmFzZWxpbmVfdCBoZmEzODYxX2Jhc2VsaW5lOwotCQloZmEzODR4X3Bkcl9oZmEzODYxX3NoYWRvd190IGhmYTM4NjFfc2hhZG93OwotCQloZmEzODR4X3Bkcl9oZmEzODYxX2lmcmZfdCBoZmEzODYxX2lmcmY7Ci0JCWhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxzcF90IGhmYTM4NjFfY2hjYWxzcDsKLQkJaGZhMzg0eF9wZHJfaGZhMzg2MV9jaGNhbGlfdCBoZmEzODYxX2NoY2FsaTsKLQkJaGZhMzg0eF9wZHJfbmljX2NvbmZpZ190IG5pY19jb25maWc7Ci0JCWhmYTM4NHhfaGZvX2RlbGF5X3QgaGZvX2RlbGF5OwotCQloZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdHNwX3QgaGZhMzg2MV9tYW5mX3Rlc3RzcDsKLQkJaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RpX3QgaGZhMzg2MV9tYW5mX3Rlc3RpOwotCQloZmEzODR4X3Bkcl9lbmRfb2ZfcGRhX3QgZW5kX29mX3BkYTsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX3BjYl9wYXJ0bnVtIHBjYl9wYXJ0bnVtOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfcGNiX3RyYWNlbnVtIHBjYl90cmFjZW51bTsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX25pY19zZXJpYWwgbmljX3NlcmlhbDsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX21ra19tZWFzdXJlbWVudHMgbWtrX21lYXN1cmVtZW50czsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX25pY19yYW1zaXplIG5pY19yYW1zaXplOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfbWZpc3VwcmFuZ2UgbWZpc3VwcmFuZ2U7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9jZmlzdXByYW5nZSBjZmlzdXByYW5nZTsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX25pY2lkIG5pY2lkOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfcmVmZGFjX21lYXN1cmVtZW50cyByZWZkYWNfbWVhc3VyZW1lbnRzOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfdmdkYWNfbWVhc3VyZW1lbnRzIHZnZGFjX21lYXN1cmVtZW50czsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX2xldmVsX2NvbXBfbWVhc3VyZW1lbnRzIGxldmVsX2NvbXBjX21lYXN1cmVtZW50czsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX21hY19hZGRyZXNzIG1hY19hZGRyZXNzOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfbWtrX2NhbGxuYW1lIG1ra19jYWxsbmFtZTsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX3JlZ2RvbWFpbiByZWdkb21haW47CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9hbGxvd2VkX2NoYW5uZWwgYWxsb3dlZF9jaGFubmVsOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfZGVmYXVsdF9jaGFubmVsIGRlZmF1bHRfY2hhbm5lbDsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX3ByaXZhY3lfb3B0aW9uIHByaXZhY3lfb3B0aW9uOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfdGVtcHR5cGUgdGVtcHR5cGU7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9yZWZkYWNfc2V0dXAgcmVmZGFjX3NldHVwOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfdmdkYWNfc2V0dXAgdmdkYWNfc2V0dXA7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9sZXZlbF9jb21wX3NldHVwIGxldmVsX2NvbXBfc2V0dXA7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl90cmltZGFjX3NldHVwIHRyaW1kYWNfc2V0dXA7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9pZnJfc2V0dGluZyBpZnJfc2V0dGluZzsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX3Jmcl9zZXR0aW5nIHJmcl9zZXR0aW5nOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9iYXNlbGluZSBoZmEzODYxX2Jhc2VsaW5lOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9zaGFkb3cgaGZhMzg2MV9zaGFkb3c7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2lmcmYgaGZhMzg2MV9pZnJmOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9jaGNhbHNwIGhmYTM4NjFfY2hjYWxzcDsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxpIGhmYTM4NjFfY2hjYWxpOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9uaWNfY29uZmlnIG5pY19jb25maWc7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9oZm9fZGVsYXkgaGZvX2RlbGF5OworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RzcCBoZmEzODYxX21hbmZfdGVzdHNwOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RpIGhmYTM4NjFfbWFuZl90ZXN0aTsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX2VuZF9vZl9wZGEgZW5kX29mX3BkYTsKIAogCX0gZGF0YTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJlY190OworfSBfX3BhY2tlZDsKIAogI2lmZGVmIF9fS0VSTkVMX18KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0tLSAgTUFDIHN0YXRlIHN0cnVjdHVyZSwgYXJndW1lbnQgdG8gYWxsIGZ1bmN0aW9ucyAtLQotLS0tICBBbHNvLCBhIGNvbGxlY3Rpb24gb2Ygc3VwcG9ydCB0eXBlcyAtLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9zdGF0dXNyZXN1bHQgeworICogLS0tICBNQUMgc3RhdGUgc3RydWN0dXJlLCBhcmd1bWVudCB0byBhbGwgZnVuY3Rpb25zIC0tCisgKiAtLS0gIEFsc28sIGEgY29sbGVjdGlvbiBvZiBzdXBwb3J0IHR5cGVzIC0tCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0cnVjdCBoZmEzODR4X2NtZHJlc3VsdCB7CiAJdTE2IHN0YXR1czsKIAl1MTYgcmVzcDA7CiAJdTE2IHJlc3AxOwogCXUxNiByZXNwMjsKLX0gaGZhMzg0eF9jbWRyZXN1bHRfdDsKK307CiAKIC8qIFVTQiBDb250cm9sIEV4Y2hhbmdlIChDVExYKToKICAqICBBIHF1ZXVlIG9mIHRoZSBzdHJ1Y3R1cmUgYmVsb3cgaXMgbWFpbnRhaW5lZCBmb3IgYWxsIG9mIHRoZQpAQCAtMTEyOSwxMSArMTE1MiwxMSBAQAogLyogVGhlIGZvbGxvd2luZyBoZmEzODR4Xyogc3RydWN0dXJlcyBhcmUgYXJndW1lbnRzIHRvCiAgKiB0aGUgdXNlcmNiKCkgZm9yIHRoZSBkaWZmZXJlbnQgQ1RMWCB0eXBlcy4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9ycmlkcmVzdWx0IHsKK3N0cnVjdCBoZmEzODR4X3JyaWRyZXN1bHQgewogCXUxNiByaWQ7CiAJY29uc3Qgdm9pZCAqcmlkZGF0YTsKIAl1bnNpZ25lZCBpbnQgcmlkZGF0YV9sZW47Ci19IGhmYTM4NHhfcnJpZHJlc3VsdF90OworfTsKIAogZW51bSBjdGx4X3N0YXRlIHsKIAlDVExYX1NUQVJUID0gMCwJCS8qIFN0YXJ0IHN0YXRlLCBub3QgcXVldWVkICovCkBAIC0xMTU2LDEyICsxMTc5LDEyIEBACiB0eXBlZGVmIHZvaWQgKCpjdGx4X3VzZXJjYl90KSAoc3RydWN0IGhmYTM4NHggKmh3LAogCQkJICAgICAgIHZvaWQgKmN0bHhyZXN1bHQsIHZvaWQgKnVzZXJjYl9kYXRhKTsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4IHsKK3N0cnVjdCBoZmEzODR4X3VzYmN0bHggewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAogCXNpemVfdCBvdXRidWZzaXplOwotCWhmYTM4NHhfdXNib3V0X3Qgb3V0YnVmOwkvKiBwa3QgYnVmIGZvciBPVVQgKi8KLQloZmEzODR4X3VzYmluX3QgaW5idWY7CS8qIHBrdCBidWYgZm9yIElOKGEgY29weSkgKi8KKwl1bmlvbiBoZmEzODR4X3VzYm91dCBvdXRidWY7CS8qIHBrdCBidWYgZm9yIE9VVCAqLworCXVuaW9uIGhmYTM4NHhfdXNiaW4gaW5idWY7CS8qIHBrdCBidWYgZm9yIElOKGEgY29weSkgKi8KIAogCUNUTFhfU1RBVEUgc3RhdGU7CS8qIFRyYWNrcyBydW5uaW5nIHN0YXRlICovCiAKQEAgLTExNzMsMjUgKzExOTYsMjUgQEAKIAl2b2lkICp1c2VyY2JfZGF0YTsJLyogIGF0IENUTFggY29tcGxldGlvbiAgKi8KIAogCWludCB2YXJpYW50OwkJLyogSWRlbnRpZmllcyBjbWQgdmFyaWFudCAqLwotfSBoZmEzODR4X3VzYmN0bHhfdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiY3RseHEgeworc3RydWN0IGhmYTM4NHhfdXNiY3RseHEgewogCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBlbmRpbmc7CiAJc3RydWN0IGxpc3RfaGVhZCBhY3RpdmU7CiAJc3RydWN0IGxpc3RfaGVhZCBjb21wbGV0aW5nOwogCXN0cnVjdCBsaXN0X2hlYWQgcmVhcGFibGU7Ci19IGhmYTM4NHhfdXNiY3RseHFfdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IGhmYTQ4NHhfbWV0YWNtZCB7CitzdHJ1Y3QgaGZhMzg0eF9tZXRhY21kIHsKIAl1MTYgY21kOwogCiAJdTE2IHBhcm0wOwogCXUxNiBwYXJtMTsKIAl1MTYgcGFybTI7CiAKLQloZmEzODR4X2NtZHJlc3VsdF90IHJlc3VsdDsKLX0gaGZhMzg0eF9tZXRhY21kX3Q7CisJc3RydWN0IGhmYTM4NHhfY21kcmVzdWx0IHJlc3VsdDsKK307CiAKICNkZWZpbmUJTUFYX0dSUF9BRERSCQkzMgogI2RlZmluZSBXTEFOX0NPTU1FTlRfTUFYCTgwICAvKiBNYXguIGxlbmd0aCBvZiB1c2VyIGNvbW1lbnQgc3RyaW5nLiAqLwpAQCAtMTIxOCwxNSArMTI0MSwxNSBAQAogCXU4IGFkZHIxW1dMQU5fQUNDRVNTX01BWF1bRVRIX0FMRU5dOwogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eCB7CitzdHJ1Y3QgaGZhMzg0eCB7CiAJLyogVVNCIHN1cHBvcnQgZGF0YSAqLwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2I7CiAJc3RydWN0IHVyYiByeF91cmI7CiAJc3RydWN0IHNrX2J1ZmYgKnJ4X3VyYl9za2I7CiAJc3RydWN0IHVyYiB0eF91cmI7CiAJc3RydWN0IHVyYiBjdGx4X3VyYjsKLQloZmEzODR4X3VzYm91dF90IHR4YnVmZjsKLQloZmEzODR4X3VzYmN0bHhxX3QgY3RseHE7CisJdW5pb24gaGZhMzg0eF91c2JvdXQgdHhidWZmOworCXN0cnVjdCBoZmEzODR4X3VzYmN0bHhxIGN0bHhxOwogCXN0cnVjdCB0aW1lcl9saXN0IHJlcXRpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0IHJlc3B0aW1lcjsKIApAQCAtMTI2NSwyMCArMTI4OCwyMCBAQAogCiAJLyogRG93bmxvYWQgc3VwcG9ydCAqLwogCXVuc2lnbmVkIGludCBkbHN0YXRlOwotCWhmYTM4NHhfZG93bmxvYWRidWZmZXJfdCBidWZpbmZvOworCXN0cnVjdCBoZmEzODR4X2Rvd25sb2FkYnVmZmVyIGJ1ZmluZm87CiAJdTE2IGRsdGltZW91dDsKIAogCWludCBzY2FuZmxhZzsJCS8qIHRvIHNpZ25hbCBzY2FuIGNvbXBsZXRlICovCiAJaW50IGpvaW5fYXA7CQkvKiBhcmUgd2Ugam9pbmVkIHRvIGEgc3BlY2lmaWMgYXAgKi8KIAlpbnQgam9pbl9yZXRyaWVzOwkvKiBudW1iZXIgb2Ygam9pbiByZXRyaWVzIHRpbGwgd2UgZmFpbCAqLwotCWhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YV90IGpvaW5yZXE7CS8qIGpvaW4gcmVxdWVzdCBzYXZlZCBkYXRhICovCisJc3RydWN0IGhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YSBqb2lucmVxOwkvKiBqb2luIHJlcXVlc3Qgc2F2ZWQgZGF0YSAqLwogCi0Jd2xhbmRldmljZV90ICp3bGFuZGV2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2OwogCS8qIFRpbWVyIHRvIGFsbG93IGZvciB0aGUgZGVmZXJyZWQgcHJvY2Vzc2luZyBvZiBsaW5rc3RhdHVzIG1lc3NhZ2VzICovCiAJc3RydWN0IHdvcmtfc3RydWN0IGxpbmtfYmg7CiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY29tbXNxdWFsX2JoOwotCWhmYTM4NHhfY29tbXNxdWFsaXR5X3QgcXVhbDsKKwlzdHJ1Y3QgaGZhMzg0eF9jb21tc3F1YWxpdHkgcXVhbDsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBjb21tc3F1YWxfdGltZXI7CiAKIAl1MTYgbGlua19zdGF0dXM7CkBAIC0xMjk3LDkyICsxMzIwLDkzIEBACiAJaW50IGRibWFkanVzdDsKIAogCS8qIEdyb3VwIEFkZHJlc3NlcyAtIHJpZ2h0IG5vdywgdGhlcmUgYXJlIHVwIHRvIGEgdG90YWwKLQkgICBvZiBNQVhfR1JQX0FERFIgZ3JvdXAgYWRkcmVzc2VzICovCisJICogb2YgTUFYX0dSUF9BRERSIGdyb3VwIGFkZHJlc3NlcworCSAqLwogCXU4IGRvdDExX2dycF9hZGRyW01BWF9HUlBfQUREUl1bRVRIX0FMRU5dOwogCXVuc2lnbmVkIGludCBkb3QxMV9ncnBjbnQ7CiAKIAkvKiBDb21wb25lbnQgSWRlbnRpdGllcyAqLwotCWhmYTM4NHhfY29tcGlkZW50X3QgaWRlbnRfbmljOwotCWhmYTM4NHhfY29tcGlkZW50X3QgaWRlbnRfcHJpX2Z3OwotCWhmYTM4NHhfY29tcGlkZW50X3QgaWRlbnRfc3RhX2Z3OwotCWhmYTM4NHhfY29tcGlkZW50X3QgaWRlbnRfYXBfZnc7CisJc3RydWN0IGhmYTM4NHhfY29tcGlkZW50IGlkZW50X25pYzsKKwlzdHJ1Y3QgaGZhMzg0eF9jb21waWRlbnQgaWRlbnRfcHJpX2Z3OworCXN0cnVjdCBoZmEzODR4X2NvbXBpZGVudCBpZGVudF9zdGFfZnc7CisJc3RydWN0IGhmYTM4NHhfY29tcGlkZW50IGlkZW50X2FwX2Z3OwogCXUxNiBtbV9tb2RzOwogCiAJLyogU3VwcGxpZXIgY29tcGF0aWJpbGl0eSByYW5nZXMgKi8KLQloZmEzODR4X2NhcGxldmVsX3QgY2FwX3N1cF9tZmk7Ci0JaGZhMzg0eF9jYXBsZXZlbF90IGNhcF9zdXBfY2ZpOwotCWhmYTM4NHhfY2FwbGV2ZWxfdCBjYXBfc3VwX3ByaTsKLQloZmEzODR4X2NhcGxldmVsX3QgY2FwX3N1cF9zdGE7Ci0JaGZhMzg0eF9jYXBsZXZlbF90IGNhcF9zdXBfYXA7CisJc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgY2FwX3N1cF9tZmk7CisJc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgY2FwX3N1cF9jZmk7CisJc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgY2FwX3N1cF9wcmk7CisJc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgY2FwX3N1cF9zdGE7CisJc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgY2FwX3N1cF9hcDsKIAogCS8qIEFjdG9yIGNvbXBhdGliaWxpdHkgcmFuZ2VzICovCi0JaGZhMzg0eF9jYXBsZXZlbF90IGNhcF9hY3RfcHJpX2NmaTsJLyoKLQkJCQkJCSAqIHByaSBmL3cgdG8gY29udHJvbGxlcgotCQkJCQkJICogaW50ZXJmYWNlCi0JCQkJCQkgKi8KKwlzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbCBjYXBfYWN0X3ByaV9jZmk7IC8qCisJCQkJCQkgICogcHJpIGYvdyB0byBjb250cm9sbGVyCisJCQkJCQkgICogaW50ZXJmYWNlCisJCQkJCQkgICovCiAKLQloZmEzODR4X2NhcGxldmVsX3QgY2FwX2FjdF9zdGFfY2ZpOwkvKgotCQkJCQkJICogc3RhIGYvdyB0byBjb250cm9sbGVyCi0JCQkJCQkgKiBpbnRlcmZhY2UKLQkJCQkJCSAqLworCXN0cnVjdCBoZmEzODR4X2NhcGxldmVsIGNhcF9hY3Rfc3RhX2NmaTsgLyoKKwkJCQkJCSAgKiBzdGEgZi93IHRvIGNvbnRyb2xsZXIKKwkJCQkJCSAgKiBpbnRlcmZhY2UKKwkJCQkJCSAgKi8KIAotCWhmYTM4NHhfY2FwbGV2ZWxfdCBjYXBfYWN0X3N0YV9tZmk7CS8qIHN0YSBmL3cgdG8gbW9kZW0gaW50ZXJmYWNlICovCisJc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgY2FwX2FjdF9zdGFfbWZpOyAvKiBzdGEgZi93IHRvIG1vZGVtIGludGVyZmFjZSAqLwogCi0JaGZhMzg0eF9jYXBsZXZlbF90IGNhcF9hY3RfYXBfY2ZpOwkvKgorCXN0cnVjdCBoZmEzODR4X2NhcGxldmVsIGNhcF9hY3RfYXBfY2ZpOwkvKgogCQkJCQkJICogYXAgZi93IHRvIGNvbnRyb2xsZXIKIAkJCQkJCSAqIGludGVyZmFjZQogCQkJCQkJICovCiAKLQloZmEzODR4X2NhcGxldmVsX3QgY2FwX2FjdF9hcF9tZmk7CS8qIGFwIGYvdyB0byBtb2RlbSBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbCBjYXBfYWN0X2FwX21maTsJLyogYXAgZi93IHRvIG1vZGVtIGludGVyZmFjZSAqLwogCiAJdTMyIHBzdXNlcmNvdW50OwkvKiBQb3dlciBzYXZlIHVzZXIgY291bnQuICovCi0JaGZhMzg0eF9Db21tVGFsbGllczMyX3QgdGFsbGllczsJLyogQ29tbXVuaWNhdGlvbiB0YWxsaWVzLiAqLworCXN0cnVjdCBoZmEzODR4X0NvbW1UYWxsaWVzMzIgdGFsbGllczsJLyogQ29tbXVuaWNhdGlvbiB0YWxsaWVzLiAqLwogCXU4IGNvbW1lbnRbV0xBTl9DT01NRU5UX01BWCArIDFdOwkvKiBVc2VyIGNvbW1lbnQgKi8KIAogCS8qIENoYW5uZWwgSW5mbyByZXF1ZXN0IHJlc3VsdHMgKEFQIG9ubHkpICovCiAJc3RydWN0IHsKIAkJYXRvbWljX3QgZG9uZTsKIAkJdTggY291bnQ7Ci0JCWhmYTM4NHhfQ2hJbmZvUmVzdWx0X3QgcmVzdWx0czsKKwkJc3RydWN0IGhmYTM4NHhfQ2hJbmZvUmVzdWx0IHJlc3VsdHM7CiAJfSBjaGFubmVsX2luZm87CiAKLQloZmEzODR4X0luZkZyYW1lX3QgKnNjYW5yZXN1bHRzOworCXN0cnVjdCBoZmEzODR4X0luZkZyYW1lICpzY2FucmVzdWx0czsKIAogCXN0cnVjdCBwcmlzbTJzdGFfYXV0aGxpc3QgYXV0aGxpc3Q7CS8qIEF1dGhlbnRpY2F0ZWQgc3RhdGlvbiBsaXN0LiAqLwogCXVuc2lnbmVkIGludCBhY2Nlc3Ntb2RlOwkJLyogQWNjZXNzIG1vZGUuICovCiAJc3RydWN0IHByaXNtMnN0YV9hY2Nlc3NsaXN0IGFsbG93OwkvKiBBbGxvd2VkIHN0YXRpb24gbGlzdC4gKi8KIAlzdHJ1Y3QgcHJpc20yc3RhX2FjY2Vzc2xpc3QgZGVueTsJLyogRGVuaWVkIHN0YXRpb24gbGlzdC4gKi8KIAotfSBoZmEzODR4X3Q7Cit9OwogCi12b2lkIGhmYTM4NHhfY3JlYXRlKGhmYTM4NHhfdCAqaHcsIHN0cnVjdCB1c2JfZGV2aWNlICp1c2IpOwotdm9pZCBoZmEzODR4X2Rlc3Ryb3koaGZhMzg0eF90ICpodyk7Cit2b2lkIGhmYTM4NHhfY3JlYXRlKHN0cnVjdCBoZmEzODR4ICpodywgc3RydWN0IHVzYl9kZXZpY2UgKnVzYik7Cit2b2lkIGhmYTM4NHhfZGVzdHJveShzdHJ1Y3QgaGZhMzg0eCAqaHcpOwogCiBpbnQKLWhmYTM4NHhfY29yZXJlc2V0KGhmYTM4NHhfdCAqaHcsIGludCBob2xkdGltZSwgaW50IHNldHRsZXRpbWUsIGludCBnZW5lc2lzKTsKLWludCBoZmEzODR4X2RydnJfZGlzYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCk7Ci1pbnQgaGZhMzg0eF9kcnZyX2VuYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCk7Ci1pbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcpOwotaW50IGhmYTM4NHhfZHJ2cl9mbGFzaGRsX2Rpc2FibGUoaGZhMzg0eF90ICpodyk7Ci1pbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfd3JpdGUoaGZhMzg0eF90ICpodywgdTMyIGRhZGRyLCB2b2lkICpidWYsIHUzMiBsZW4pOwotaW50IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqYnVmLCB1MTYgbGVuKTsKLWludCBoZmEzODR4X2RydnJfcmFtZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIHUzMiBleGVhZGRyKTsKLWludCBoZmEzODR4X2RydnJfcmFtZGxfZGlzYWJsZShoZmEzODR4X3QgKmh3KTsKLWludCBoZmEzODR4X2RydnJfcmFtZGxfd3JpdGUoaGZhMzg0eF90ICpodywgdTMyIGRhZGRyLCB2b2lkICpidWYsIHUzMiBsZW4pOwotaW50IGhmYTM4NHhfZHJ2cl9yZWFkcGRhKGhmYTM4NHhfdCAqaHcsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbik7Ci1pbnQgaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB2b2lkICpidWYsIHUxNiBsZW4pOworaGZhMzg0eF9jb3JlcmVzZXQoc3RydWN0IGhmYTM4NHggKmh3LCBpbnQgaG9sZHRpbWUsIGludCBzZXR0bGV0aW1lLCBpbnQgZ2VuZXNpcyk7CitpbnQgaGZhMzg0eF9kcnZyX2Rpc2FibGUoc3RydWN0IGhmYTM4NHggKmh3LCB1MTYgbWFjcG9ydCk7CitpbnQgaGZhMzg0eF9kcnZyX2VuYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiBtYWNwb3J0KTsKK2ludCBoZmEzODR4X2RydnJfZmxhc2hkbF9lbmFibGUoc3RydWN0IGhmYTM4NHggKmh3KTsKK2ludCBoZmEzODR4X2RydnJfZmxhc2hkbF9kaXNhYmxlKHN0cnVjdCBoZmEzODR4ICpodyk7CitpbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfd3JpdGUoc3RydWN0IGhmYTM4NHggKmh3LCB1MzIgZGFkZHIsIHZvaWQgKmJ1ZiwgdTMyIGxlbik7CitpbnQgaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiByaWQsIHZvaWQgKmJ1ZiwgdTE2IGxlbik7CitpbnQgaGZhMzg0eF9kcnZyX3JhbWRsX2VuYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUzMiBleGVhZGRyKTsKK2ludCBoZmEzODR4X2RydnJfcmFtZGxfZGlzYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcpOworaW50IGhmYTM4NHhfZHJ2cl9yYW1kbF93cml0ZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUzMiBkYWRkciwgdm9pZCAqYnVmLCB1MzIgbGVuKTsKK2ludCBoZmEzODR4X2RydnJfcmVhZHBkYShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbik7CitpbnQgaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiByaWQsIHZvaWQgKmJ1ZiwgdTE2IGxlbik7CiAKLXN0YXRpYyBpbmxpbmUgaW50IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcxNihoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB2b2lkICp2YWwpCitzdGF0aWMgaW5saW5lIGludCBoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoc3RydWN0IGhmYTM4NHggKmh3LCB1MTYgcmlkLCB2b2lkICp2YWwpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAKIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCByaWQsIHZhbCwgc2l6ZW9mKHUxNikpOwogCWlmIChyZXN1bHQgPT0gMCkKLQkJKigodTE2ICopIHZhbCkgPSBsZTE2X3RvX2NwdSgqKCh1MTYgKikgdmFsKSk7CisJCSooKHUxNiAqKXZhbCkgPSBsZTE2X3RvX2NwdSgqKCh1MTYgKil2YWwpKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdTE2IHZhbCkKK3N0YXRpYyBpbmxpbmUgaW50IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiByaWQsIHUxNiB2YWwpCiB7CiAJdTE2IHZhbHVlID0gY3B1X3RvX2xlMTYodmFsKTsKIApAQCAtMTM5MCwxMyArMTQxNCwxMyBAQAogfQogCiBpbnQKLWhmYTM4NHhfZHJ2cl9zZXRjb25maWdfYXN5bmMoaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWdfYXN5bmMoc3RydWN0IGhmYTM4NHggKmh3LAogCQkJICAgICB1MTYgcmlkLAogCQkJICAgICB2b2lkICpidWYsCiAJCQkgICAgIHUxNiBsZW4sIGN0bHhfdXNlcmNiX3QgdXNlcmNiLCB2b2lkICp1c2VyY2JfZGF0YSk7CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RydnJfc2V0Y29uZmlnMTZfYXN5bmMoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdTE2IHZhbCkKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWcxNl9hc3luYyhzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiByaWQsIHUxNiB2YWwpCiB7CiAJdTE2IHZhbHVlID0gY3B1X3RvX2xlMTYodmFsKTsKIApAQCAtMTQwNCwyMSArMTQyOCwyMSBAQAogCQkJCQkgICAgTlVMTCwgTlVMTCk7CiB9CiAKLWludCBoZmEzODR4X2RydnJfc3RhcnQoaGZhMzg0eF90ICpodyk7Ci1pbnQgaGZhMzg0eF9kcnZyX3N0b3AoaGZhMzg0eF90ICpodyk7CitpbnQgaGZhMzg0eF9kcnZyX3N0YXJ0KHN0cnVjdCBoZmEzODR4ICpodyk7CitpbnQgaGZhMzg0eF9kcnZyX3N0b3Aoc3RydWN0IGhmYTM4NHggKmh3KTsKIGludAotaGZhMzg0eF9kcnZyX3R4ZnJhbWUoaGZhMzg0eF90ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK2hmYTM4NHhfZHJ2cl90eGZyYW1lKHN0cnVjdCBoZmEzODR4ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICB1bmlvbiBwODAyMTFfaGRyICpwODAyMTFfaGRyLAogCQkgICAgIHN0cnVjdCBwODAyMTFfbWV0YXdlcCAqcDgwMjExX3dlcCk7Ci12b2lkIGhmYTM4NHhfdHhfdGltZW91dCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwordm9pZCBoZmEzODR4X3R4X3RpbWVvdXQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOwogCi1pbnQgaGZhMzg0eF9jbWRfaW5pdGlhbGl6ZShoZmEzODR4X3QgKmh3KTsKLWludCBoZmEzODR4X2NtZF9lbmFibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpOwotaW50IGhmYTM4NHhfY21kX2Rpc2FibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpOwotaW50IGhmYTM4NHhfY21kX2FsbG9jYXRlKGhmYTM4NHhfdCAqaHcsIHUxNiBsZW4pOwotaW50IGhmYTM4NHhfY21kX21vbml0b3IoaGZhMzg0eF90ICpodywgdTE2IGVuYWJsZSk7CitpbnQgaGZhMzg0eF9jbWRfaW5pdGlhbGl6ZShzdHJ1Y3QgaGZhMzg0eCAqaHcpOworaW50IGhmYTM4NHhfY21kX2VuYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiBtYWNwb3J0KTsKK2ludCBoZmEzODR4X2NtZF9kaXNhYmxlKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IG1hY3BvcnQpOworaW50IGhmYTM4NHhfY21kX2FsbG9jYXRlKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IGxlbik7CitpbnQgaGZhMzg0eF9jbWRfbW9uaXRvcihzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiBlbmFibGUpOwogaW50Ci1oZmEzODR4X2NtZF9kb3dubG9hZChoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9jbWRfZG93bmxvYWQoc3RydWN0IGhmYTM4NHggKmh3LAogCQkgICAgIHUxNiBtb2RlLCB1MTYgbG93YWRkciwgdTE2IGhpZ2hhZGRyLCB1MTYgY29kZWxlbik7CiAKICNlbmRpZiAvKl9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHhfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4X3VzYi5jCmluZGV4IDMzNzgxMDcuLjZhMTA3ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHhfdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eF91c2IuYwpAQCAtMTU0LDEzICsxNTQsMTMgQEAKICNlbmRpZgogCiBzdGF0aWMgdm9pZAotaGZhMzg0eF9pbnRfcnhtb25pdG9yKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaGZhMzg0eF91c2Jfcnhmcm1fdCAqcnhmcm0pOworaGZhMzg0eF9pbnRfcnhtb25pdG9yKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3QgaGZhMzg0eF91c2Jfcnhmcm0gKnJ4ZnJtKTsKIAogc3RhdGljIHZvaWQgaGZhMzg0eF91c2JfZGVmZXIoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKTsKIAotc3RhdGljIGludCBzdWJtaXRfcnhfdXJiKGhmYTM4NHhfdCAqaHcsIGdmcF90IGZsYWdzKTsKK3N0YXRpYyBpbnQgc3VibWl0X3J4X3VyYihzdHJ1Y3QgaGZhMzg0eCAqaHcsIGdmcF90IGZsYWdzKTsKIAotc3RhdGljIGludCBzdWJtaXRfdHhfdXJiKGhmYTM4NHhfdCAqaHcsIHN0cnVjdCB1cmIgKnR4X3VyYiwgZ2ZwX3QgZmxhZ3MpOworc3RhdGljIGludCBzdWJtaXRfdHhfdXJiKHN0cnVjdCBoZmEzODR4ICpodywgc3RydWN0IHVyYiAqdHhfdXJiLCBnZnBfdCBmbGFncyk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIENhbGxiYWNrcyAqLwpAQCAtMTY5LDE5ICsxNjksMTkgQEAKIHN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKTsKIAogc3RhdGljIHZvaWQKLWhmYTM4NHhfdXNiaW5fdHhjb21wbCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGhmYTM4NHhfdXNiaW5fdCAqdXNiaW4pOworaGZhMzg0eF91c2Jpbl90eGNvbXBsKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1bmlvbiBoZmEzODR4X3VzYmluICp1c2Jpbik7CiAKLXN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fcngod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fcngoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBza19idWZmICpza2IpOwogCi1zdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX2luZm8od2xhbmRldmljZV90ICp3bGFuZGV2LCBoZmEzODR4X3VzYmluX3QgKnVzYmluKTsKK3N0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5faW5mbyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdW5pb24gaGZhMzg0eF91c2JpbiAqdXNiaW4pOwogCi1zdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX2N0bHgoaGZhMzg0eF90ICpodywgaGZhMzg0eF91c2Jpbl90ICp1c2JpbiwKK3N0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fY3RseChzdHJ1Y3QgaGZhMzg0eCAqaHcsIHVuaW9uIGhmYTM4NHhfdXNiaW4gKnVzYmluLAogCQkJICAgICAgIGludCB1cmJfc3RhdHVzKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRnVuY3Rpb25zIHRvIHN1cHBvcnQgdGhlIHByaXNtMiB1c2IgY29tbWFuZCBxdWV1ZSAqLwogCi1zdGF0aWMgdm9pZCBoZmEzODR4X3VzYmN0bHhxX3J1bihoZmEzODR4X3QgKmh3KTsKK3N0YXRpYyB2b2lkIGhmYTM4NHhfdXNiY3RseHFfcnVuKHN0cnVjdCBoZmEzODR4ICpodyk7CiAKIHN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiY3RseF9yZXF0aW1lcmZuKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKQEAgLTE5Myw0MiArMTkzLDQyIEBACiAKIHN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiY3RseF9yZWFwZXJfdGFzayh1bnNpZ25lZCBsb25nIGRhdGEpOwogCi1zdGF0aWMgaW50IGhmYTM4NHhfdXNiY3RseF9zdWJtaXQoaGZhMzg0eF90ICpodywgaGZhMzg0eF91c2JjdGx4X3QgKmN0bHgpOworc3RhdGljIGludCBoZmEzODR4X3VzYmN0bHhfc3VibWl0KHN0cnVjdCBoZmEzODR4ICpodywgc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseCk7CiAKLXN0YXRpYyB2b2lkIHVubG9ja2VkX3VzYmN0bHhfY29tcGxldGUoaGZhMzg0eF90ICpodywgaGZhMzg0eF91c2JjdGx4X3QgKmN0bHgpOworc3RhdGljIHZvaWQgdW5sb2NrZWRfdXNiY3RseF9jb21wbGV0ZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHgpOwogCiBzdHJ1Y3QgdXNiY3RseF9jb21wbGV0b3IgewogCWludCAoKmNvbXBsZXRlKShzdHJ1Y3QgdXNiY3RseF9jb21wbGV0b3IgKik7CiB9OwogCiBzdGF0aWMgaW50Ci1oZmEzODR4X3VzYmN0bHhfY29tcGxldGVfc3luYyhoZmEzODR4X3QgKmh3LAotCQkJICAgICAgaGZhMzg0eF91c2JjdGx4X3QgKmN0bHgsCitoZmEzODR4X3VzYmN0bHhfY29tcGxldGVfc3luYyhzdHJ1Y3QgaGZhMzg0eCAqaHcsCisJCQkgICAgICBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4LAogCQkJICAgICAgc3RydWN0IHVzYmN0bHhfY29tcGxldG9yICpjb21wbGV0b3IpOwogCiBzdGF0aWMgaW50Ci11bmxvY2tlZF91c2JjdGx4X2NhbmNlbF9hc3luYyhoZmEzODR4X3QgKmh3LCBoZmEzODR4X3VzYmN0bHhfdCAqY3RseCk7Cit1bmxvY2tlZF91c2JjdGx4X2NhbmNlbF9hc3luYyhzdHJ1Y3QgaGZhMzg0eCAqaHcsIHN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHgpOwogCi1zdGF0aWMgdm9pZCBoZmEzODR4X2NiX3N0YXR1cyhoZmEzODR4X3QgKmh3LCBjb25zdCBoZmEzODR4X3VzYmN0bHhfdCAqY3RseCk7CitzdGF0aWMgdm9pZCBoZmEzODR4X2NiX3N0YXR1cyhzdHJ1Y3QgaGZhMzg0eCAqaHcsIGNvbnN0IHN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHgpOwogCiBzdGF0aWMgaW50Ci11c2JjdGx4X2dldF9zdGF0dXMoY29uc3QgaGZhMzg0eF91c2JfY21kcmVzcF90ICpjbWRyZXNwLAotCQkgICBoZmEzODR4X2NtZHJlc3VsdF90ICpyZXN1bHQpOwordXNiY3RseF9nZXRfc3RhdHVzKGNvbnN0IHN0cnVjdCBoZmEzODR4X3VzYl9zdGF0dXNyZXNwICpjbWRyZXNwLAorCQkgICBzdHJ1Y3QgaGZhMzg0eF9jbWRyZXN1bHQgKnJlc3VsdCk7CiAKIHN0YXRpYyB2b2lkCi11c2JjdGx4X2dldF9ycmlkcmVzdWx0KGNvbnN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwX3QgKnJyaWRyZXNwLAotCQkgICAgICAgaGZhMzg0eF9ycmlkcmVzdWx0X3QgKnJlc3VsdCk7Cit1c2JjdGx4X2dldF9ycmlkcmVzdWx0KGNvbnN0IHN0cnVjdCBoZmEzODR4X3VzYl9ycmlkcmVzcCAqcnJpZHJlc3AsCisJCSAgICAgICBzdHJ1Y3QgaGZhMzg0eF9ycmlkcmVzdWx0ICpyZXN1bHQpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBMb3cgbGV2ZWwgcmVxL3Jlc3AgQ1RMWCBmb3JtYXR0ZXJzIGFuZCBzdWJtaXR0ZXJzICovCiBzdGF0aWMgaW50Ci1oZmEzODR4X2RvY21kKGhmYTM4NHhfdCAqaHcsCitoZmEzODR4X2RvY21kKHN0cnVjdCBoZmEzODR4ICpodywKIAkgICAgICBlbnVtIGNtZF9tb2RlIG1vZGUsCi0JICAgICAgaGZhMzg0eF9tZXRhY21kX3QgKmNtZCwKKwkgICAgICBzdHJ1Y3QgaGZhMzg0eF9tZXRhY21kICpjbWQsCiAJICAgICAgY3RseF9jbWRjYl90IGNtZGNiLCBjdGx4X3VzZXJjYl90IHVzZXJjYiwgdm9pZCAqdXNlcmNiX2RhdGEpOwogCiBzdGF0aWMgaW50Ci1oZmEzODR4X2RvcnJpZChoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb3JyaWQoc3RydWN0IGhmYTM4NHggKmh3LAogCSAgICAgICBlbnVtIGNtZF9tb2RlIG1vZGUsCiAJICAgICAgIHUxNiByaWQsCiAJICAgICAgIHZvaWQgKnJpZGRhdGEsCkBAIC0yMzYsNyArMjM2LDcgQEAKIAkgICAgICAgY3RseF9jbWRjYl90IGNtZGNiLCBjdGx4X3VzZXJjYl90IHVzZXJjYiwgdm9pZCAqdXNlcmNiX2RhdGEpOwogCiBzdGF0aWMgaW50Ci1oZmEzODR4X2Rvd3JpZChoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb3dyaWQoc3RydWN0IGhmYTM4NHggKmh3LAogCSAgICAgICBlbnVtIGNtZF9tb2RlIG1vZGUsCiAJICAgICAgIHUxNiByaWQsCiAJICAgICAgIHZvaWQgKnJpZGRhdGEsCkBAIC0yNDQsNyArMjQ0LDcgQEAKIAkgICAgICAgY3RseF9jbWRjYl90IGNtZGNiLCBjdGx4X3VzZXJjYl90IHVzZXJjYiwgdm9pZCAqdXNlcmNiX2RhdGEpOwogCiBzdGF0aWMgaW50Ci1oZmEzODR4X2Rvcm1lbShoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb3JtZW0oc3RydWN0IGhmYTM4NHggKmh3LAogCSAgICAgICBlbnVtIGNtZF9tb2RlIG1vZGUsCiAJICAgICAgIHUxNiBwYWdlLAogCSAgICAgICB1MTYgb2Zmc2V0LApAQCAtMjUzLDcgKzI1Myw3IEBACiAJICAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwgY3RseF91c2VyY2JfdCB1c2VyY2IsIHZvaWQgKnVzZXJjYl9kYXRhKTsKIAogc3RhdGljIGludAotaGZhMzg0eF9kb3dtZW0oaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZG93bWVtKHN0cnVjdCBoZmEzODR4ICpodywKIAkgICAgICAgZW51bSBjbWRfbW9kZSBtb2RlLAogCSAgICAgICB1MTYgcGFnZSwKIAkgICAgICAgdTE2IG9mZnNldCwKQEAgLTI3OCw5ICsyNzgsOSBAQAogCXJldHVybiBjdGx4X3N0cltzXTsKIH07CiAKLXN0YXRpYyBpbmxpbmUgaGZhMzg0eF91c2JjdGx4X3QgKmdldF9hY3RpdmVfY3RseChoZmEzODR4X3QgKmh3KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpnZXRfYWN0aXZlX2N0bHgoc3RydWN0IGhmYTM4NHggKmh3KQogewotCXJldHVybiBsaXN0X2VudHJ5KGh3LT5jdGx4cS5hY3RpdmUubmV4dCwgaGZhMzg0eF91c2JjdGx4X3QsIGxpc3QpOworCXJldHVybiBsaXN0X2VudHJ5KGh3LT5jdGx4cS5hY3RpdmUubmV4dCwgc3RydWN0IGhmYTM4NHhfdXNiY3RseCwgbGlzdCk7CiB9CiAKICNpZmRlZiBERUJVR19VU0IKQEAgLTMyMiwxMiArMzIyLDEyIEBACiAqIENhbGwgY29udGV4dDoKICoJQW55CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgc3VibWl0X3J4X3VyYihoZmEzODR4X3QgKmh3LCBnZnBfdCBtZW1mbGFncykKK3N0YXRpYyBpbnQgc3VibWl0X3J4X3VyYihzdHJ1Y3QgaGZhMzg0eCAqaHcsIGdmcF90IG1lbWZsYWdzKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IHJlc3VsdDsKIAotCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKGhmYTM4NHhfdXNiaW5fdCkpOworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHVuaW9uIGhmYTM4NHhfdXNiaW4pKTsKIAlpZiAoIXNrYikgewogCQlyZXN1bHQgPSAtRU5PTUVNOwogCQlnb3RvIGRvbmU7CkBAIC0zMzYsNyArMzM2LDcgQEAKIAkvKiBQb3N0IHRoZSBJTiB1cmIgKi8KIAl1c2JfZmlsbF9idWxrX3VyYigmaHctPnJ4X3VyYiwgaHctPnVzYiwKIAkJCSAgaHctPmVuZHBfaW4sCi0JCQkgIHNrYi0+ZGF0YSwgc2l6ZW9mKGhmYTM4NHhfdXNiaW5fdCksCisJCQkgIHNrYi0+ZGF0YSwgc2l6ZW9mKHVuaW9uIGhmYTM4NHhfdXNiaW4pLAogCQkJICBoZmEzODR4X3VzYmluX2NhbGxiYWNrLCBody0+d2xhbmRldik7CiAKIAlody0+cnhfdXJiX3NrYiA9IHNrYjsKQEAgLTM4NCw3ICszODQsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCUFueQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHN1Ym1pdF90eF91cmIoaGZhMzg0eF90ICpodywgc3RydWN0IHVyYiAqdHhfdXJiLCBnZnBfdCBtZW1mbGFncykKK3N0YXRpYyBpbnQgc3VibWl0X3R4X3VyYihzdHJ1Y3QgaGZhMzg0eCAqaHcsIHN0cnVjdCB1cmIgKnR4X3VyYiwgZ2ZwX3QgbWVtZmxhZ3MpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGh3LT53bGFuZGV2LT5uZXRkZXY7CiAJaW50IHJlc3VsdDsKQEAgLTQyOSw3ICs0MjksNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgdm9pZCBoZmEzODR4X3VzYl9kZWZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCiB7Ci0JaGZhMzg0eF90ICpodyA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaGZhMzg0eCwgdXNiX3dvcmspOworCXN0cnVjdCBoZmEzODR4ICpodyA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaGZhMzg0eCwgdXNiX3dvcmspOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBody0+d2xhbmRldi0+bmV0ZGV2OwogCiAJLyogRG9uJ3QgYm90aGVyIHRyeWluZyB0byByZXNldCBhbnl0aGluZyBpZiB0aGUgcGx1ZwpAQCAtNTAzLDcgKzUwMyw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogaGZhMzg0eF9jcmVhdGUKICoKLSogU2V0cyB1cCB0aGUgaGZhMzg0eF90IGRhdGEgc3RydWN0dXJlIGZvciB1c2UuICBOb3RlIHRoaXMKKyogU2V0cyB1cCB0aGUgc3RydWN0IGhmYTM4NHggZGF0YSBzdHJ1Y3R1cmUgZm9yIHVzZS4gIE5vdGUgdGhpcwogKiBkb2VzIF9ub3RfIGluaXRpYWxpemUgdGhlIGFjdHVhbCBoYXJkd2FyZSwganVzdCB0aGUgZGF0YSBzdHJ1Y3R1cmVzCiAqIHdlIHVzZSB0byBrZWVwIHRyYWNrIG9mIGl0cyBzdGF0ZS4KICoKQEAgLTUyMSw5ICs1MjEsOSBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBoZmEzODR4X2NyZWF0ZShoZmEzODR4X3QgKmh3LCBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiKQordm9pZCBoZmEzODR4X2NyZWF0ZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHN0cnVjdCB1c2JfZGV2aWNlICp1c2IpCiB7Ci0JbWVtc2V0KGh3LCAwLCBzaXplb2YoaGZhMzg0eF90KSk7CisJbWVtc2V0KGh3LCAwLCBzaXplb2Yoc3RydWN0IGhmYTM4NHgpKTsKIAlody0+dXNiID0gdXNiOwogCiAJLyogc2V0IHVwIHRoZSBlbmRwb2ludHMgKi8KQEAgLTU5Miw3ICs1OTIsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBoZmEzODR4X2Rlc3Ryb3koaGZhMzg0eF90ICpodykKK3ZvaWQgaGZhMzg0eF9kZXN0cm95KHN0cnVjdCBoZmEzODR4ICpodykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCkBAIC02MDgsOSArNjA4LDkgQEAKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogfQogCi1zdGF0aWMgaGZhMzg0eF91c2JjdGx4X3QgKnVzYmN0bHhfYWxsb2Modm9pZCkKK3N0YXRpYyBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICp1c2JjdGx4X2FsbG9jKHZvaWQpCiB7Ci0JaGZhMzg0eF91c2JjdGx4X3QgKmN0bHg7CisJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseDsKIAogCWN0bHggPSBremFsbG9jKHNpemVvZigqY3RseCksCiAJCSAgICAgICBpbl9pbnRlcnJ1cHQoKSA/IEdGUF9BVE9NSUMgOiBHRlBfS0VSTkVMKTsKQEAgLTYyMSw4ICs2MjEsOCBAQAogfQogCiBzdGF0aWMgaW50Ci11c2JjdGx4X2dldF9zdGF0dXMoY29uc3QgaGZhMzg0eF91c2JfY21kcmVzcF90ICpjbWRyZXNwLAotCQkgICBoZmEzODR4X2NtZHJlc3VsdF90ICpyZXN1bHQpCit1c2JjdGx4X2dldF9zdGF0dXMoY29uc3Qgc3RydWN0IGhmYTM4NHhfdXNiX3N0YXR1c3Jlc3AgKmNtZHJlc3AsCisJCSAgIHN0cnVjdCBoZmEzODR4X2NtZHJlc3VsdCAqcmVzdWx0KQogewogCXJlc3VsdC0+c3RhdHVzID0gbGUxNl90b19jcHUoY21kcmVzcC0+c3RhdHVzKTsKIAlyZXN1bHQtPnJlc3AwID0gbGUxNl90b19jcHUoY21kcmVzcC0+cmVzcDApOwpAQCAtNjM2LDggKzYzNiw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi11c2JjdGx4X2dldF9ycmlkcmVzdWx0KGNvbnN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwX3QgKnJyaWRyZXNwLAotCQkgICAgICAgaGZhMzg0eF9ycmlkcmVzdWx0X3QgKnJlc3VsdCkKK3VzYmN0bHhfZ2V0X3JyaWRyZXN1bHQoY29uc3Qgc3RydWN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwICpycmlkcmVzcCwKKwkJICAgICAgIHN0cnVjdCBoZmEzODR4X3JyaWRyZXN1bHQgKnJlc3VsdCkKIHsKIAlyZXN1bHQtPnJpZCA9IGxlMTZfdG9fY3B1KHJyaWRyZXNwLT5yaWQpOwogCXJlc3VsdC0+cmlkZGF0YSA9IHJyaWRyZXNwLT5kYXRhOwpAQCAtNjQ3LDEzICs2NDcsMTMgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBDb21wbGV0b3Igb2JqZWN0OgogKiBUaGlzIGNvbXBsZXRvciBtdXN0IGJlIHBhc3NlZCB0byBoZmEzODR4X3VzYmN0bHhfY29tcGxldGVfc3luYygpCi0qIHdoZW4gcHJvY2Vzc2luZyBhIENUTFggdGhhdCByZXR1cm5zIGEgaGZhMzg0eF9jbWRyZXN1bHRfdCBzdHJ1Y3R1cmUuCisqIHdoZW4gcHJvY2Vzc2luZyBhIENUTFggdGhhdCByZXR1cm5zIGEgc3RydWN0IGhmYTM4NHhfY21kcmVzdWx0IHN0cnVjdHVyZS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RydWN0IHVzYmN0bHhfY21kX2NvbXBsZXRvciB7CiAJc3RydWN0IHVzYmN0bHhfY29tcGxldG9yIGhlYWQ7CiAKLQljb25zdCBoZmEzODR4X3VzYl9jbWRyZXNwX3QgKmNtZHJlc3A7Ci0JaGZhMzg0eF9jbWRyZXN1bHRfdCAqcmVzdWx0OworCWNvbnN0IHN0cnVjdCBoZmEzODR4X3VzYl9zdGF0dXNyZXNwICpjbWRyZXNwOworCXN0cnVjdCBoZmEzODR4X2NtZHJlc3VsdCAqcmVzdWx0OwogfTsKIAogc3RhdGljIGlubGluZSBpbnQgdXNiY3RseF9jbWRfY29tcGxldG9yX2ZuKHN0cnVjdCB1c2JjdGx4X2NvbXBsZXRvciAqaGVhZCkKQEAgLTY2Nyw5ICs2NjcsOSBAQAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiY3RseF9jb21wbGV0b3IgKmluaXRfY21kX2NvbXBsZXRvcigKIAkJCQkJCXN0cnVjdCB1c2JjdGx4X2NtZF9jb21wbGV0b3IKIAkJCQkJCQkqY29tcGxldG9yLAotCQkJCQkJY29uc3QgaGZhMzg0eF91c2JfY21kcmVzcF90CisJCQkJCQljb25zdCBzdHJ1Y3QgaGZhMzg0eF91c2Jfc3RhdHVzcmVzcAogCQkJCQkJCSpjbWRyZXNwLAotCQkJCQkJaGZhMzg0eF9jbWRyZXN1bHRfdCAqcmVzdWx0KQorCQkJCQkJc3RydWN0IGhmYTM4NHhfY21kcmVzdWx0ICpyZXN1bHQpCiB7CiAJY29tcGxldG9yLT5oZWFkLmNvbXBsZXRlID0gdXNiY3RseF9jbWRfY29tcGxldG9yX2ZuOwogCWNvbXBsZXRvci0+Y21kcmVzcCA9IGNtZHJlc3A7CkBAIC02ODUsNyArNjg1LDcgQEAKIHN0cnVjdCB1c2JjdGx4X3JyaWRfY29tcGxldG9yIHsKIAlzdHJ1Y3QgdXNiY3RseF9jb21wbGV0b3IgaGVhZDsKIAotCWNvbnN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwX3QgKnJyaWRyZXNwOworCWNvbnN0IHN0cnVjdCBoZmEzODR4X3VzYl9ycmlkcmVzcCAqcnJpZHJlc3A7CiAJdm9pZCAqcmlkZGF0YTsKIAl1bnNpZ25lZCBpbnQgcmlkZGF0YWxlbjsKIH07CkBAIC02OTMsNyArNjkzLDcgQEAKIHN0YXRpYyBpbnQgdXNiY3RseF9ycmlkX2NvbXBsZXRvcl9mbihzdHJ1Y3QgdXNiY3RseF9jb21wbGV0b3IgKmhlYWQpCiB7CiAJc3RydWN0IHVzYmN0bHhfcnJpZF9jb21wbGV0b3IgKmNvbXBsZXRlOwotCWhmYTM4NHhfcnJpZHJlc3VsdF90IHJyaWRyZXN1bHQ7CisJc3RydWN0IGhmYTM4NHhfcnJpZHJlc3VsdCBycmlkcmVzdWx0OwogCiAJY29tcGxldGUgPSAoc3RydWN0IHVzYmN0bHhfcnJpZF9jb21wbGV0b3IgKiloZWFkOwogCXVzYmN0bHhfZ2V0X3JyaWRyZXN1bHQoY29tcGxldGUtPnJyaWRyZXNwLCAmcnJpZHJlc3VsdCk7CkBAIC03MTMsNyArNzEzLDcgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHVzYmN0bHhfY29tcGxldG9yICppbml0X3JyaWRfY29tcGxldG9yKAogCQkJCQkJc3RydWN0IHVzYmN0bHhfcnJpZF9jb21wbGV0b3IKIAkJCQkJCQkqY29tcGxldG9yLAotCQkJCQkJY29uc3QgaGZhMzg0eF91c2JfcnJpZHJlc3BfdAorCQkJCQkJY29uc3Qgc3RydWN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwCiAJCQkJCQkJKnJyaWRyZXNwLAogCQkJCQkJdm9pZCAqcmlkZGF0YSwKIAkJCQkJCXVuc2lnbmVkIGludCByaWRkYXRhbGVuKQpAQCAtNzQ0LDcgKzc0NCw3IEBACiBzdHJ1Y3QgdXNiY3RseF9ybWVtX2NvbXBsZXRvciB7CiAJc3RydWN0IHVzYmN0bHhfY29tcGxldG9yIGhlYWQ7CiAKLQljb25zdCBoZmEzODR4X3VzYl9ybWVtcmVzcF90ICpybWVtcmVzcDsKKwljb25zdCBzdHJ1Y3QgaGZhMzg0eF91c2Jfcm1lbXJlc3AgKnJtZW1yZXNwOwogCXZvaWQgKmRhdGE7CiAJdW5zaWduZWQgaW50IGxlbjsKIH07CkBAIC03NjIsNyArNzYyLDcgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHVzYmN0bHhfY29tcGxldG9yICppbml0X3JtZW1fY29tcGxldG9yKAogCQkJCQkJc3RydWN0IHVzYmN0bHhfcm1lbV9jb21wbGV0b3IKIAkJCQkJCQkqY29tcGxldG9yLAotCQkJCQkJaGZhMzg0eF91c2Jfcm1lbXJlc3BfdAorCQkJCQkJc3RydWN0IGhmYTM4NHhfdXNiX3JtZW1yZXNwCiAJCQkJCQkJKnJtZW1yZXNwLAogCQkJCQkJdm9pZCAqZGF0YSwKIAkJCQkJCXVuc2lnbmVkIGludCBsZW4pCkBAIC03OTUsMTAgKzc5NSwxMCBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZmEzODR4X2NiX3N0YXR1cyhoZmEzODR4X3QgKmh3LCBjb25zdCBoZmEzODR4X3VzYmN0bHhfdCAqY3RseCkKK3N0YXRpYyB2b2lkIGhmYTM4NHhfY2Jfc3RhdHVzKHN0cnVjdCBoZmEzODR4ICpodywgY29uc3Qgc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseCkKIHsKIAlpZiAoY3RseC0+dXNlcmNiKSB7Ci0JCWhmYTM4NHhfY21kcmVzdWx0X3QgY21kcmVzdWx0OworCQlzdHJ1Y3QgaGZhMzg0eF9jbWRyZXN1bHQgY21kcmVzdWx0OwogCiAJCWlmIChjdGx4LT5zdGF0ZSAhPSBDVExYX0NPTVBMRVRFKSB7CiAJCQltZW1zZXQoJmNtZHJlc3VsdCwgMCwgc2l6ZW9mKGNtZHJlc3VsdCkpOwpAQCAtODEyLDIxICs4MTIsMjEgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGhmYTM4NHhfZG9jbWRfd2FpdChoZmEzODR4X3QgKmh3LCBoZmEzODR4X21ldGFjbWRfdCAqY21kKQorc3RhdGljIGlubGluZSBpbnQgaGZhMzg0eF9kb2NtZF93YWl0KHN0cnVjdCBoZmEzODR4ICpodywgc3RydWN0IGhmYTM4NHhfbWV0YWNtZCAqY21kKQogewogCXJldHVybiBoZmEzODR4X2RvY21kKGh3LCBET1dBSVQsIGNtZCwgTlVMTCwgTlVMTCwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RvY21kX2FzeW5jKGhmYTM4NHhfdCAqaHcsCi0JCSAgICBoZmEzODR4X21ldGFjbWRfdCAqY21kLAoraGZhMzg0eF9kb2NtZF9hc3luYyhzdHJ1Y3QgaGZhMzg0eCAqaHcsCisJCSAgICBzdHJ1Y3QgaGZhMzg0eF9tZXRhY21kICpjbWQsCiAJCSAgICBjdGx4X2NtZGNiX3QgY21kY2IsIGN0bHhfdXNlcmNiX3QgdXNlcmNiLCB2b2lkICp1c2VyY2JfZGF0YSkKIHsKIAlyZXR1cm4gaGZhMzg0eF9kb2NtZChodywgRE9BU1lOQywgY21kLCBjbWRjYiwgdXNlcmNiLCB1c2VyY2JfZGF0YSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RvcnJpZF93YWl0KGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHZvaWQgKnJpZGRhdGEsCitoZmEzODR4X2RvcnJpZF93YWl0KHN0cnVjdCBoZmEzODR4ICpodywgdTE2IHJpZCwgdm9pZCAqcmlkZGF0YSwKIAkJICAgIHVuc2lnbmVkIGludCByaWRkYXRhbGVuKQogewogCXJldHVybiBoZmEzODR4X2RvcnJpZChodywgRE9XQUlULApAQCAtODM0LDcgKzgzNCw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RvcnJpZF9hc3luYyhoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb3JyaWRfYXN5bmMoc3RydWN0IGhmYTM4NHggKmh3LAogCQkgICAgIHUxNiByaWQsIHZvaWQgKnJpZGRhdGEsIHVuc2lnbmVkIGludCByaWRkYXRhbGVuLAogCQkgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwKIAkJICAgICBjdGx4X3VzZXJjYl90IHVzZXJjYiwgdm9pZCAqdXNlcmNiX2RhdGEpCkBAIC04NDUsNyArODQ1LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWhmYTM4NHhfZG93cmlkX3dhaXQoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqcmlkZGF0YSwKK2hmYTM4NHhfZG93cmlkX3dhaXQoc3RydWN0IGhmYTM4NHggKmh3LCB1MTYgcmlkLCB2b2lkICpyaWRkYXRhLAogCQkgICAgdW5zaWduZWQgaW50IHJpZGRhdGFsZW4pCiB7CiAJcmV0dXJuIGhmYTM4NHhfZG93cmlkKGh3LCBET1dBSVQsCkBAIC04NTMsNyArODUzLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWhmYTM4NHhfZG93cmlkX2FzeW5jKGhmYTM4NHhfdCAqaHcsCitoZmEzODR4X2Rvd3JpZF9hc3luYyhzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCSAgICAgdTE2IHJpZCwgdm9pZCAqcmlkZGF0YSwgdW5zaWduZWQgaW50IHJpZGRhdGFsZW4sCiAJCSAgICAgY3RseF9jbWRjYl90IGNtZGNiLAogCQkgICAgIGN0bHhfdXNlcmNiX3QgdXNlcmNiLCB2b2lkICp1c2VyY2JfZGF0YSkKQEAgLTg2NCw3ICs4NjQsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kb3JtZW1fd2FpdChoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb3JtZW1fd2FpdChzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCSAgICB1MTYgcGFnZSwgdTE2IG9mZnNldCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKIHsKIAlyZXR1cm4gaGZhMzg0eF9kb3JtZW0oaHcsIERPV0FJVCwKQEAgLTg3Miw3ICs4NzIsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kb3JtZW1fYXN5bmMoaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZG9ybWVtX2FzeW5jKHN0cnVjdCBoZmEzODR4ICpodywKIAkJICAgICB1MTYgcGFnZSwgdTE2IG9mZnNldCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbiwKIAkJICAgICBjdGx4X2NtZGNiX3QgY21kY2IsCiAJCSAgICAgY3RseF91c2VyY2JfdCB1c2VyY2IsIHZvaWQgKnVzZXJjYl9kYXRhKQpAQCAtODgzLDcgKzg4Myw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2Rvd21lbV93YWl0KGhmYTM4NHhfdCAqaHcsCitoZmEzODR4X2Rvd21lbV93YWl0KHN0cnVjdCBoZmEzODR4ICpodywKIAkJICAgIHUxNiBwYWdlLCB1MTYgb2Zmc2V0LCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXJldHVybiBoZmEzODR4X2Rvd21lbShodywgRE9XQUlULApAQCAtODkxLDcgKzg5MSw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2Rvd21lbV9hc3luYyhoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb3dtZW1fYXN5bmMoc3RydWN0IGhmYTM4NHggKmh3LAogCQkgICAgIHUxNiBwYWdlLAogCQkgICAgIHUxNiBvZmZzZXQsCiAJCSAgICAgdm9pZCAqZGF0YSwKQEAgLTkyMywxMSArOTIzLDExIEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfaW5pdGlhbGl6ZShoZmEzODR4X3QgKmh3KQoraW50IGhmYTM4NHhfY21kX2luaXRpYWxpemUoc3RydWN0IGhmYTM4NHggKmh3KQogewogCWludCByZXN1bHQgPSAwOwogCWludCBpOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKKwlzdHJ1Y3QgaGZhMzg0eF9tZXRhY21kIGNtZDsKIAogCWNtZC5jbWQgPSBIRkEzODR4X0NNRENPREVfSU5JVDsKIAljbWQucGFybTAgPSAwOwpAQCAtOTY5LDkgKzk2OSw5IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfZGlzYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCkKK2ludCBoZmEzODR4X2NtZF9kaXNhYmxlKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IG1hY3BvcnQpCiB7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOworCXN0cnVjdCBoZmEzODR4X21ldGFjbWQgY21kOwogCiAJY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9ESVNBQkxFKSB8CiAJICAgIEhGQTM4NHhfQ01EX01BQ1BPUlRfU0VUKG1hY3BvcnQpOwpAQCAtMTAwMiw5ICsxMDAyLDkgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9lbmFibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpCitpbnQgaGZhMzg0eF9jbWRfZW5hYmxlKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IG1hY3BvcnQpCiB7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOworCXN0cnVjdCBoZmEzODR4X21ldGFjbWQgY21kOwogCiAJY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9FTkFCTEUpIHwKIAkgICAgSEZBMzg0eF9DTURfTUFDUE9SVF9TRVQobWFjcG9ydCk7CkBAIC0xMDQ0LDkgKzEwNDQsOSBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX21vbml0b3IoaGZhMzg0eF90ICpodywgdTE2IGVuYWJsZSkKK2ludCBoZmEzODR4X2NtZF9tb25pdG9yKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IGVuYWJsZSkKIHsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7CisJc3RydWN0IGhmYTM4NHhfbWV0YWNtZCBjbWQ7CiAKIAljbWQuY21kID0gSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQoSEZBMzg0eF9DTURDT0RFX01PTklUT1IpIHwKIAkgICAgSEZBMzg0eF9DTURfQUlORk9fU0VUKGVuYWJsZSk7CkBAIC0xMDk1LDEwICsxMDk1LDEwIEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfZG93bmxvYWQoaGZhMzg0eF90ICpodywgdTE2IG1vZGUsIHUxNiBsb3dhZGRyLAoraW50IGhmYTM4NHhfY21kX2Rvd25sb2FkKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IG1vZGUsIHUxNiBsb3dhZGRyLAogCQkJIHUxNiBoaWdoYWRkciwgdTE2IGNvZGVsZW4pCiB7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOworCXN0cnVjdCBoZmEzODR4X21ldGFjbWQgY21kOwogCiAJcHJfZGVidWcoIm1vZGU9JWQsIGxvd2FkZHI9MHglMDR4LCBoaWdoYWRkcj0weCUwNHgsIGNvZGVsZW49JWRcbiIsCiAJCSBtb2RlLCBsb3dhZGRyLCBoaWdoYWRkciwgY29kZWxlbik7CkBAIC0xMTM2LDcgKzExMzYsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY29yZXJlc2V0KGhmYTM4NHhfdCAqaHcsIGludCBob2xkdGltZSwgaW50IHNldHRsZXRpbWUsIGludCBnZW5lc2lzKQoraW50IGhmYTM4NHhfY29yZXJlc2V0KHN0cnVjdCBoZmEzODR4ICpodywgaW50IGhvbGR0aW1lLCBpbnQgc2V0dGxldGltZSwgaW50IGdlbmVzaXMpCiB7CiAJaW50IHJlc3VsdDsKIApAQCAtMTE3Myw4ICsxMTczLDggQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgaGZhMzg0eF91c2JjdGx4X2NvbXBsZXRlX3N5bmMoaGZhMzg0eF90ICpodywKLQkJCQkJIGhmYTM4NHhfdXNiY3RseF90ICpjdGx4LAorc3RhdGljIGludCBoZmEzODR4X3VzYmN0bHhfY29tcGxldGVfc3luYyhzdHJ1Y3QgaGZhMzg0eCAqaHcsCisJCQkJCSBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4LAogCQkJCQkgc3RydWN0IHVzYmN0bHhfY29tcGxldG9yICpjb21wbGV0b3IpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTEyODksMTMgKzEyODksMTMgQEAKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgaW50Ci1oZmEzODR4X2RvY21kKGhmYTM4NHhfdCAqaHcsCitoZmEzODR4X2RvY21kKHN0cnVjdCBoZmEzODR4ICpodywKIAkgICAgICBlbnVtIGNtZF9tb2RlIG1vZGUsCi0JICAgICAgaGZhMzg0eF9tZXRhY21kX3QgKmNtZCwKKwkgICAgICBzdHJ1Y3QgaGZhMzg0eF9tZXRhY21kICpjbWQsCiAJICAgICAgY3RseF9jbWRjYl90IGNtZGNiLCBjdGx4X3VzZXJjYl90IHVzZXJjYiwgdm9pZCAqdXNlcmNiX2RhdGEpCiB7CiAJaW50IHJlc3VsdDsKLQloZmEzODR4X3VzYmN0bHhfdCAqY3RseDsKKwlzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4OwogCiAJY3RseCA9IHVzYmN0bHhfYWxsb2MoKTsKIAlpZiAoIWN0bHgpIHsKQEAgLTEzNzcsNyArMTM3Nyw3IEBACiAqCXByb2Nlc3MgKERPV0FJVCBvciBET0FTWU5DKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgaW50Ci1oZmEzODR4X2RvcnJpZChoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb3JyaWQoc3RydWN0IGhmYTM4NHggKmh3LAogCSAgICAgICBlbnVtIGNtZF9tb2RlIG1vZGUsCiAJICAgICAgIHUxNiByaWQsCiAJICAgICAgIHZvaWQgKnJpZGRhdGEsCkBAIC0xMzg1LDcgKzEzODUsNyBAQAogCSAgICAgICBjdGx4X2NtZGNiX3QgY21kY2IsIGN0bHhfdXNlcmNiX3QgdXNlcmNiLCB2b2lkICp1c2VyY2JfZGF0YSkKIHsKIAlpbnQgcmVzdWx0OwotCWhmYTM4NHhfdXNiY3RseF90ICpjdGx4OworCXN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHg7CiAKIAljdGx4ID0gdXNiY3RseF9hbGxvYygpOwogCWlmICghY3RseCkgewpAQCAtMTQ1OCw3ICsxNDU4LDcgQEAKICoJcHJvY2VzcyAoRE9XQUlUIG9yIERPQVNZTkMpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyBpbnQKLWhmYTM4NHhfZG93cmlkKGhmYTM4NHhfdCAqaHcsCitoZmEzODR4X2Rvd3JpZChzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJICAgICAgIGVudW0gY21kX21vZGUgbW9kZSwKIAkgICAgICAgdTE2IHJpZCwKIAkgICAgICAgdm9pZCAqcmlkZGF0YSwKQEAgLTE0NjYsNyArMTQ2Niw3IEBACiAJICAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwgY3RseF91c2VyY2JfdCB1c2VyY2IsIHZvaWQgKnVzZXJjYl9kYXRhKQogewogCWludCByZXN1bHQ7Ci0JaGZhMzg0eF91c2JjdGx4X3QgKmN0bHg7CisJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseDsKIAogCWN0bHggPSB1c2JjdGx4X2FsbG9jKCk7CiAJaWYgKCFjdGx4KSB7CkBAIC0xNDk3LDcgKzE0OTcsNyBAQAogCQlrZnJlZShjdGx4KTsKIAl9IGVsc2UgaWYgKG1vZGUgPT0gRE9XQUlUKSB7CiAJCXN0cnVjdCB1c2JjdGx4X2NtZF9jb21wbGV0b3IgY29tcGxldG9yOwotCQloZmEzODR4X2NtZHJlc3VsdF90IHdyaWRyZXN1bHQ7CisJCXN0cnVjdCBoZmEzODR4X2NtZHJlc3VsdCB3cmlkcmVzdWx0OwogCiAJCXJlc3VsdCA9IGhmYTM4NHhfdXNiY3RseF9jb21wbGV0ZV9zeW5jKGh3LAogCQkJCQkJICAgICAgIGN0bHgsCkBAIC0xNTQ1LDcgKzE1NDUsNyBAQAogKglwcm9jZXNzIChET1dBSVQgb3IgRE9BU1lOQykKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIGludAotaGZhMzg0eF9kb3JtZW0oaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZG9ybWVtKHN0cnVjdCBoZmEzODR4ICpodywKIAkgICAgICAgZW51bSBjbWRfbW9kZSBtb2RlLAogCSAgICAgICB1MTYgcGFnZSwKIAkgICAgICAgdTE2IG9mZnNldCwKQEAgLTE1NTQsNyArMTU1NCw3IEBACiAJICAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwgY3RseF91c2VyY2JfdCB1c2VyY2IsIHZvaWQgKnVzZXJjYl9kYXRhKQogewogCWludCByZXN1bHQ7Ci0JaGZhMzg0eF91c2JjdGx4X3QgKmN0bHg7CisJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseDsKIAogCWN0bHggPSB1c2JjdGx4X2FsbG9jKCk7CiAJaWYgKCFjdGx4KSB7CkBAIC0xNjM2LDcgKzE2MzYsNyBAQAogKglwcm9jZXNzIChET1dBSVQgb3IgRE9BU1lOQykKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIGludAotaGZhMzg0eF9kb3dtZW0oaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZG93bWVtKHN0cnVjdCBoZmEzODR4ICpodywKIAkgICAgICAgZW51bSBjbWRfbW9kZSBtb2RlLAogCSAgICAgICB1MTYgcGFnZSwKIAkgICAgICAgdTE2IG9mZnNldCwKQEAgLTE2NDUsNyArMTY0NSw3IEBACiAJICAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwgY3RseF91c2VyY2JfdCB1c2VyY2IsIHZvaWQgKnVzZXJjYl9kYXRhKQogewogCWludCByZXN1bHQ7Ci0JaGZhMzg0eF91c2JjdGx4X3QgKmN0bHg7CisJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseDsKIAogCXByX2RlYnVnKCJwYWdlPTB4JTA0eCBvZmZzZXQ9MHglMDR4IGxlbj0lZFxuIiwgcGFnZSwgb2Zmc2V0LCBsZW4pOwogCkBAIC0xNjc5LDcgKzE2NzksNyBAQAogCQlrZnJlZShjdGx4KTsKIAl9IGVsc2UgaWYgKG1vZGUgPT0gRE9XQUlUKSB7CiAJCXN0cnVjdCB1c2JjdGx4X2NtZF9jb21wbGV0b3IgY29tcGxldG9yOwotCQloZmEzODR4X2NtZHJlc3VsdF90IHdtZW1yZXN1bHQ7CisJCXN0cnVjdCBoZmEzODR4X2NtZHJlc3VsdCB3bWVtcmVzdWx0OwogCiAJCXJlc3VsdCA9IGhmYTM4NHhfdXNiY3RseF9jb21wbGV0ZV9zeW5jKGh3LAogCQkJCQkJICAgICAgIGN0bHgsCkBAIC0xNzE1LDcgKzE3MTUsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KQoraW50IGhmYTM4NHhfZHJ2cl9kaXNhYmxlKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IG1hY3BvcnQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAKQEAgLTE3NTMsNyArMTc1Myw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2VuYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCkKK2ludCBoZmEzODR4X2RydnJfZW5hYmxlKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IG1hY3BvcnQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAKQEAgLTE3OTAsNyArMTc5MCw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcpCitpbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZW5hYmxlKHN0cnVjdCBoZmEzODR4ICpodykKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlpbnQgaTsKQEAgLTE4NDksNyArMTg0OSw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZGlzYWJsZShoZmEzODR4X3QgKmh3KQoraW50IGhmYTM4NHhfZHJ2cl9mbGFzaGRsX2Rpc2FibGUoc3RydWN0IGhmYTM4NHggKmh3KQogewogCS8qIENoZWNrIHRoYXQgd2UncmUgYWxyZWFkeSBpbiB0aGUgZG93bmxvYWQgc3RhdGUgKi8KIAlpZiAoaHctPmRsc3RhdGUgIT0gSEZBMzg0eF9ETFNUQVRFX0ZMQVNIRU5BQkxFRCkKQEAgLTE4OTQsNyArMTg5NCw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfd3JpdGUoaGZhMzg0eF90ICpodywgdTMyIGRhZGRyLCB2b2lkICpidWYsIHUzMiBsZW4pCitpbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfd3JpdGUoc3RydWN0IGhmYTM4NHggKmh3LCB1MzIgZGFkZHIsIHZvaWQgKmJ1ZiwgdTMyIGxlbikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAl1MzIgZGxidWZhZGRyOwpAQCAtMjAzMiw3ICsyMDMyLDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHZvaWQgKmJ1ZiwgdTE2IGxlbikKK2ludCBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IHJpZCwgdm9pZCAqYnVmLCB1MTYgbGVuKQogewogCXJldHVybiBoZmEzODR4X2RvcnJpZF93YWl0KGh3LCByaWQsIGJ1ZiwgbGVuKTsKIH0KQEAgLTIwNjEsNyArMjA2MSw3IEBACiAgKiAgICAgICBwcm9jZXNzCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpbnQKLWhmYTM4NHhfZHJ2cl9zZXRjb25maWdfYXN5bmMoaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWdfYXN5bmMoc3RydWN0IGhmYTM4NHggKmh3LAogCQkJICAgICB1MTYgcmlkLAogCQkJICAgICB2b2lkICpidWYsCiAJCQkgICAgIHUxNiBsZW4sIGN0bHhfdXNlcmNiX3QgdXNlcmNiLCB2b2lkICp1c2VyY2JfZGF0YSkKQEAgLTIwODgsNyArMjA4OCw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3JhbWRsX2Rpc2FibGUoaGZhMzg0eF90ICpodykKK2ludCBoZmEzODR4X2RydnJfcmFtZGxfZGlzYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcpCiB7CiAJLyogQ2hlY2sgdGhhdCB3ZSdyZSBhbHJlYWR5IGluIHRoZSBkb3dubG9hZCBzdGF0ZSAqLwogCWlmIChody0+ZGxzdGF0ZSAhPSBIRkEzODR4X0RMU1RBVEVfUkFNRU5BQkxFRCkKQEAgLTIxMjgsNyArMjEyOCw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3JhbWRsX2VuYWJsZShoZmEzODR4X3QgKmh3LCB1MzIgZXhlYWRkcikKK2ludCBoZmEzODR4X2RydnJfcmFtZGxfZW5hYmxlKHN0cnVjdCBoZmEzODR4ICpodywgdTMyIGV4ZWFkZHIpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJdTE2IGxvd2FkZHI7CkBAIC0yMTk2LDcgKzIxOTYsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9yYW1kbF93cml0ZShoZmEzODR4X3QgKmh3LCB1MzIgZGFkZHIsIHZvaWQgKmJ1ZiwgdTMyIGxlbikKK2ludCBoZmEzODR4X2RydnJfcmFtZGxfd3JpdGUoc3RydWN0IGhmYTM4NHggKmh3LCB1MzIgZGFkZHIsIHZvaWQgKmJ1ZiwgdTMyIGxlbikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlpbnQgbndyaXRlczsKQEAgLTIyNzYsNyArMjI3Niw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcyBvciBub24tY2FyZCBpbnRlcnJ1cHQuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfcmVhZHBkYShoZmEzODR4X3QgKmh3LCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCitpbnQgaGZhMzg0eF9kcnZyX3JlYWRwZGEoc3RydWN0IGhmYTM4NHggKmh3LCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJdTE2ICpwZGEgPSBidWY7CkBAIC0yMzg2LDcgKzIzODYsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqYnVmLCB1MTYgbGVuKQoraW50IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoc3RydWN0IGhmYTM4NHggKmh3LCB1MTYgcmlkLCB2b2lkICpidWYsIHUxNiBsZW4pCiB7CiAJcmV0dXJuIGhmYTM4NHhfZG93cmlkX3dhaXQoaHcsIHJpZCwgYnVmLCBsZW4pOwogfQpAQCAtMjQxMSw3ICsyNDExLDcgQEAKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLWludCBoZmEzODR4X2RydnJfc3RhcnQoaGZhMzg0eF90ICpodykKK2ludCBoZmEzODR4X2RydnJfc3RhcnQoc3RydWN0IGhmYTM4NHggKmh3KQogewogCWludCByZXN1bHQsIHJlc3VsdDEsIHJlc3VsdDI7CiAJdTE2IHN0YXR1czsKQEAgLTI1MTIsNyArMjUxMiw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3N0b3AoaGZhMzg0eF90ICpodykKK2ludCBoZmEzODR4X2RydnJfc3RvcChzdHJ1Y3QgaGZhMzg0eCAqaHcpCiB7CiAJaW50IGk7CiAKQEAgLTI1NjIsMTEgKzI1NjIsMTEgQEAKICogQ2FsbCBjb250ZXh0OgogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl90eGZyYW1lKGhmYTM4NHhfdCAqaHcsIHN0cnVjdCBza19idWZmICpza2IsCitpbnQgaGZhMzg0eF9kcnZyX3R4ZnJhbWUoc3RydWN0IGhmYTM4NHggKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJIHVuaW9uIHA4MDIxMV9oZHIgKnA4MDIxMV9oZHIsCiAJCQkgc3RydWN0IHA4MDIxMV9tZXRhd2VwICpwODAyMTFfd2VwKQogewotCWludCB1c2Jwa3RsZW4gPSBzaXplb2YoaGZhMzg0eF90eF9mcmFtZV90KTsKKwlpbnQgdXNicGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBoZmEzODR4X3R4X2ZyYW1lKTsKIAlpbnQgcmVzdWx0OwogCWludCByZXQ7CiAJY2hhciAqcHRyOwpAQCAtMjY1Niw5ICsyNjU2LDkgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi12b2lkIGhmYTM4NHhfdHhfdGltZW91dCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCit2b2lkIGhmYTM4NHhfdHhfdGltZW91dChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldikKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmN0bHhxLmxvY2ssIGZsYWdzKTsKQEAgLTI2ODEsNyArMjY4MSw3IEBACiAqIFRhc2tsZXQgdG8gZGVsZXRlIGRlYWQgQ1RMWCBvYmplY3RzCiAqCiAqIEFyZ3VtZW50czoKLSoJZGF0YQlwdHIgdG8gYSBoZmEzODR4X3QKKyoJZGF0YQlwdHIgdG8gYSBzdHJ1Y3QgaGZhMzg0eAogKgogKiBSZXR1cm5zOgogKgpAQCAtMjY5MCw4ICsyNjkwLDggQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHZvaWQgaGZhMzg0eF91c2JjdGx4X3JlYXBlcl90YXNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQloZmEzODR4X3QgKmh3ID0gKGhmYTM4NHhfdCAqKWRhdGE7Ci0JaGZhMzg0eF91c2JjdGx4X3QgKmN0bHgsICp0ZW1wOworCXN0cnVjdCBoZmEzODR4ICpodyA9IChzdHJ1Y3QgaGZhMzg0eCAqKWRhdGE7CisJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseCwgKnRlbXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZody0+Y3RseHEubG9jaywgZmxhZ3MpOwpAQCAtMjcxMyw3ICsyNzEzLDcgQEAKICogVGFza2xldCB0byBjYWxsIGNvbXBsZXRpb24gaGFuZGxlcnMgZm9yIHJldHVybmVkIENUTFhzCiAqCiAqIEFyZ3VtZW50czoKLSoJZGF0YQlwdHIgdG8gaGZhMzg0eF90CisqCWRhdGEJcHRyIHRvIHN0cnVjdCBoZmEzODR4CiAqCiAqIFJldHVybnM6CiAqCU5vdGhpbmcKQEAgLTI3MjMsOCArMjcyMyw4IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiY3RseF9jb21wbGV0aW9uX3Rhc2sodW5zaWduZWQgbG9uZyBkYXRhKQogewotCWhmYTM4NHhfdCAqaHcgPSAoaGZhMzg0eF90ICopZGF0YTsKLQloZmEzODR4X3VzYmN0bHhfdCAqY3RseCwgKnRlbXA7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gKHN0cnVjdCBoZmEzODR4ICopZGF0YTsKKwlzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4LCAqdGVtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaW50IHJlYXAgPSAwOwpAQCAtMjc4Nyw3ICsyNzg3LDcgQEAKICogbmV4dCBjb21tYW5kIG9uIHRoZSBxdWV1ZSBpcyBydW4gYWZ0ZXJ3YXJkcy4KICoKICogQXJndW1lbnRzOgotKglodwlwdHIgdG8gdGhlIGhmYTM4NHhfdCBzdHJ1Y3R1cmUKKyoJaHcJcHRyIHRvIHRoZSBzdHJ1Y3QgaGZhMzg0eCBzdHJ1Y3R1cmUKICoJY3RseAlwdHIgdG8gYSBDVExYIHN0cnVjdHVyZQogKgogKiBSZXR1cm5zOgpAQCAtMjc5Nyw4ICsyNzk3LDggQEAKICogQ2FsbCBjb250ZXh0OgogKglFaXRoZXIgcHJvY2VzcyBvciBpbnRlcnJ1cHQsIGJ1dCBwcmVzdW1hYmx5IGludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHVubG9ja2VkX3VzYmN0bHhfY2FuY2VsX2FzeW5jKGhmYTM4NHhfdCAqaHcsCi0JCQkJCSBoZmEzODR4X3VzYmN0bHhfdCAqY3RseCkKK3N0YXRpYyBpbnQgdW5sb2NrZWRfdXNiY3RseF9jYW5jZWxfYXN5bmMoc3RydWN0IGhmYTM4NHggKmh3LAorCQkJCQkgc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseCkKIHsKIAlpbnQgcmV0OwogCkBAIC0yODM2LDcgKzI4MzYsNyBAQAogKiB0YXNrbGV0IGlzIHNjaGVkdWxlZC4KICoKICogQXJndW1lbnRzOgotKglodwkJcHRyIHRvIGEgaGZhMzg0eF90IHN0cnVjdHVyZQorKglodwkJcHRyIHRvIGEgc3RydWN0IGhmYTM4NHggc3RydWN0dXJlCiAqCWN0bHgJCXB0ciB0byBhIGN0bHggc3RydWN0dXJlCiAqCiAqIFJldHVybnM6CkBAIC0yODQ3LDcgKzI4NDcsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCUVpdGhlciwgYXNzdW1lIGludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCB1bmxvY2tlZF91c2JjdGx4X2NvbXBsZXRlKGhmYTM4NHhfdCAqaHcsIGhmYTM4NHhfdXNiY3RseF90ICpjdGx4KQorc3RhdGljIHZvaWQgdW5sb2NrZWRfdXNiY3RseF9jb21wbGV0ZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHgpCiB7CiAJLyogVGltZXJzIGhhdmUgYmVlbiBzdG9wcGVkLCBhbmQgY3RseCBzaG91bGQgYmUgaW4KIAkgKiBhIHRlcm1pbmFsIHN0YXRlLiBSZXRpcmUgaXQgZnJvbSB0aGUgImFjdGl2ZSIKQEAgLTI4NzYsNyArMjg3Niw3IEBACiAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGhlYWQgaXRlbSBpcyBydW5uaW5nLiAgSWYgbm90LCBzdGFydHMgaXQuCiAqCiAqIEFyZ3VtZW50czoKLSoJaHcJcHRyIHRvIGhmYTM4NHhfdAorKglodwlwdHIgdG8gc3RydWN0IGhmYTM4NHgKICoKICogUmV0dXJuczoKICoJbm90aGluZwpAQCAtMjg4Niw3ICsyODg2LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglhbnkKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgaGZhMzg0eF91c2JjdGx4cV9ydW4oaGZhMzg0eF90ICpodykKK3N0YXRpYyB2b2lkIGhmYTM4NHhfdXNiY3RseHFfcnVuKHN0cnVjdCBoZmEzODR4ICpodykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yOTA1LDEyICsyOTA1LDEyIEBACiAJCWdvdG8gdW5sb2NrOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZody0+Y3RseHEucGVuZGluZykpIHsKLQkJaGZhMzg0eF91c2JjdGx4X3QgKmhlYWQ7CisJCXN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmhlYWQ7CiAJCWludCByZXN1bHQ7CiAKIAkJLyogVGhpcyBpcyB0aGUgZmlyc3QgcGVuZGluZyBjb21tYW5kICovCiAJCWhlYWQgPSBsaXN0X2VudHJ5KGh3LT5jdGx4cS5wZW5kaW5nLm5leHQsCi0JCQkJICBoZmEzODR4X3VzYmN0bHhfdCwgbGlzdCk7CisJCQkJICBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4LCBsaXN0KTsKIAogCQkvKiBXZSBuZWVkIHRvIHNwbGl0IHRoaXMgb2ZmIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gKi8KIAkJbGlzdF9tb3ZlX3RhaWwoJmhlYWQtPmxpc3QsICZody0+Y3RseHEuYWN0aXZlKTsKQEAgLTI5ODgsOSArMjk4OCw5IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IHVyYi0+Y29udGV4dDsKLQloZmEzODR4X3QgKmh3OwotCWhmYTM4NHhfdXNiaW5fdCAqdXNiaW4gPSAoaGZhMzg0eF91c2Jpbl90ICopdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IGhmYTM4NHggKmh3OworCXVuaW9uIGhmYTM4NHhfdXNiaW4gKnVzYmluID0gKHVuaW9uIGhmYTM4NHhfdXNiaW4gKil1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAlpbnQgcmVzdWx0OwogCWludCB1cmJfc3RhdHVzOwpAQCAtMzE1NCw3ICszMTU0LDcgQEAKICogcXVldWUgYW5kIG91ciBzdGF0ZSB1cGRhdGVkIGFjY29yZGluZ2x5LgogKgogKiBBcmd1bWVudHM6Ci0qCWh3CQlwdHIgdG8gaGZhMzg0eF90CisqCWh3CQlwdHIgdG8gc3RydWN0IGhmYTM4NHgKICoJdXNiaW4JCXB0ciB0byBVU0IgSU4gcGFja2V0CiAqCXVyYl9zdGF0dXMJc3RhdHVzIG9mIHRoaXMgQnVsay1JbiBVUkIKICoKQEAgLTMxNjYsMTAgKzMxNjYsMTAgQEAKICogQ2FsbCBjb250ZXh0OgogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgaGZhMzg0eF91c2Jpbl9jdGx4KGhmYTM4NHhfdCAqaHcsIGhmYTM4NHhfdXNiaW5fdCAqdXNiaW4sCitzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX2N0bHgoc3RydWN0IGhmYTM4NHggKmh3LCB1bmlvbiBoZmEzODR4X3VzYmluICp1c2JpbiwKIAkJCSAgICAgICBpbnQgdXJiX3N0YXR1cykKIHsKLQloZmEzODR4X3VzYmN0bHhfdCAqY3RseDsKKwlzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4OwogCWludCBydW5fcXVldWUgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTMyODUsOCArMzI4NSw4IEBACiAqIENhbGwgY29udGV4dDoKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fdHhjb21wbCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICBoZmEzODR4X3VzYmluX3QgKnVzYmluKQorc3RhdGljIHZvaWQgaGZhMzg0eF91c2Jpbl90eGNvbXBsKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgdW5pb24gaGZhMzg0eF91c2JpbiAqdXNiaW4pCiB7CiAJdTE2IHN0YXR1czsKIApAQCAtMzMxNiwxMCArMzMxNiwxMCBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX3J4KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fcngoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaGZhMzg0eF91c2Jpbl90ICp1c2JpbiA9IChoZmEzODR4X3VzYmluX3QgKilza2ItPmRhdGE7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJdW5pb24gaGZhMzg0eF91c2JpbiAqdXNiaW4gPSAodW5pb24gaGZhMzg0eF91c2JpbiAqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCWludCBoZHJsZW47CiAJc3RydWN0IHA4MDIxMV9yeG1ldGEgKnJ4bWV0YTsKIAl1MTYgZGF0YV9sZW47CkBAIC0zMzQ2LDcgKzMzNDYsNyBAQAogCQloZHJsZW4gPSBwODAyMTFfaGVhZGVybGVuKGZjKTsKIAogCQkvKiBQdWxsIG9mZiB0aGUgZGVzY3JpcHRvciAqLwotCQlza2JfcHVsbChza2IsIHNpemVvZihoZmEzODR4X3J4X2ZyYW1lX3QpKTsKKwkJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGhmYTM4NHhfcnhfZnJhbWUpKTsKIAogCQkvKiBOb3cgc2h1bnQgdGhlIGhlYWRlciBibG9jayB1cCBhZ2FpbnN0IHRoZSBkYXRhIGJsb2NrCiAJCSAqIHdpdGggYW4gIm92ZXJsYXBwaW5nIiBjb3B5CkBAIC0zNDE2LDE3ICszNDE2LDE3IEBACiAqIENhbGwgY29udGV4dDoKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfaW50X3J4bW9uaXRvcih3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICBoZmEzODR4X3VzYl9yeGZybV90ICpyeGZybSkKK3N0YXRpYyB2b2lkIGhmYTM4NHhfaW50X3J4bW9uaXRvcihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgIHN0cnVjdCBoZmEzODR4X3VzYl9yeGZybSAqcnhmcm0pCiB7Ci0JaGZhMzg0eF9yeF9mcmFtZV90ICpyeGRlc2MgPSAmKHJ4ZnJtLT5kZXNjKTsKKwlzdHJ1Y3QgaGZhMzg0eF9yeF9mcmFtZSAqcnhkZXNjID0gJihyeGZybS0+ZGVzYyk7CiAJdW5zaWduZWQgaW50IGhkcmxlbiA9IDA7CiAJdW5zaWduZWQgaW50IGRhdGFsZW4gPSAwOwogCXVuc2lnbmVkIGludCBza2JsZW4gPSAwOwogCXU4ICpkYXRhcDsKIAl1MTYgZmM7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCiAJLyogUmVtZW1iZXIgdGhlIHN0YXR1cywgdGltZSwgYW5kIGRhdGFfbGVuIGZpZWxkcyBhcmUgaW4gaG9zdCBvcmRlciAqLwogCS8qIEZpZ3VyZSBvdXQgaG93IGJpZyB0aGUgZnJhbWUgaXMgKi8KQEAgLTM1MTcsNyArMzUxNyw4IEBACiAqIENhbGwgY29udGV4dDoKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5faW5mbyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGhmYTM4NHhfdXNiaW5fdCAqdXNiaW4pCitzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX2luZm8oc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkgICAgICAgdW5pb24gaGZhMzg0eF91c2JpbiAqdXNiaW4pCiB7CiAJdXNiaW4tPmluZm9mcm0uaW5mby5mcmFtZWxlbiA9CiAJICAgIGxlMTZfdG9fY3B1KHVzYmluLT5pbmZvZnJtLmluZm8uZnJhbWVsZW4pOwpAQCAtMzU0Miw3ICszNTQzLDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHZvaWQgaGZhMzg0eF91c2JvdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IHVyYi0+Y29udGV4dDsKIAogI2lmZGVmIERFQlVHX1VTQgogCWRicHJpbnRfdXJiKHVyYik7CkBAIC0zNTU2LDcgKzM1NTcsNyBAQAogCiAJCWNhc2UgLUVQSVBFOgogCQkJewotCQkJCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCQkJCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAKIAkJCQluZXRkZXZfd2Fybihody0+d2xhbmRldi0+bmV0ZGV2LAogCQkJCQkgICAgIiVzIHR4IHBpcGUgc3RhbGxlZDogcmVxdWVzdGluZyByZXNldFxuIiwKQEAgLTM1NzIsNyArMzU3Myw3IEBACiAJCWNhc2UgLUVUSU1FRE9VVDoKIAkJY2FzZSAtRUlMU0VROgogCQkJewotCQkJCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCQkJCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAKIAkJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQKIAkJCQkgICAgKFRIUk9UVExFX1RYLCAmaHctPnVzYl9mbGFncykgJiYKQEAgLTM2MTcsMTEgKzM2MTgsMTEgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHZvaWQgaGZhMzg0eF9jdGx4b3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQloZmEzODR4X3QgKmh3ID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHVyYi0+Y29udGV4dDsKIAlpbnQgZGVsZXRlX3Jlc3B0aW1lciA9IDA7CiAJaW50IHRpbWVyX29rID0gMTsKIAlpbnQgcnVuX3F1ZXVlID0gMDsKLQloZmEzODR4X3VzYmN0bHhfdCAqY3RseDsKKwlzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlwcl9kZWJ1ZygidXJiLT5zdGF0dXM9JWRcbiIsIHVyYi0+c3RhdHVzKTsKQEAgLTM3MzYsNyArMzczNyw3IEBACiAqIFVSQiBjb250YWluaW5nIGEgUHJpc20yLnggWFhYX1JlcXVlc3Qgd2FzIG5ldmVyIGNhbGxlZC4KICoKICogQXJndW1lbnRzOgotKglkYXRhCQlhIHB0ciB0byB0aGUgaGZhMzg0eF90CisqCWRhdGEJCWEgcHRyIHRvIHRoZSBzdHJ1Y3QgaGZhMzg0eAogKgogKiBSZXR1cm5zOgogKglub3RoaW5nCkBAIC0zNzQ4LDcgKzM3NDksNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmN0bHhfcmVxdGltZXJmbih1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JaGZhMzg0eF90ICpodyA9IChoZmEzODR4X3QgKilkYXRhOworCXN0cnVjdCBoZmEzODR4ICpodyA9IChzdHJ1Y3QgaGZhMzg0eCAqKWRhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZody0+Y3RseHEubG9jaywgZmxhZ3MpOwpAQCAtMzc2NSw3ICszNzY2LDcgQEAKIAkJICovCiAJCWh3LT5jdGx4X3VyYi50cmFuc2Zlcl9mbGFncyB8PSBVUkJfQVNZTkNfVU5MSU5LOwogCQlpZiAodXNiX3VubGlua191cmIoJmh3LT5jdGx4X3VyYikgPT0gLUVJTlBST0dSRVNTKSB7Ci0JCQloZmEzODR4X3VzYmN0bHhfdCAqY3RseCA9IGdldF9hY3RpdmVfY3RseChodyk7CisJCQlzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4ID0gZ2V0X2FjdGl2ZV9jdGx4KGh3KTsKIAogCQkJY3RseC0+c3RhdGUgPSBDVExYX1JFUV9GQUlMRUQ7CiAKQEAgLTM3OTQsNyArMzc5NSw3IEBACiAqIFVSQiBjb250YWluaW5nIGEgUHJpc20yLnggWFhYX1Jlc3BvbnNlIHdhcyBuZXZlciBjYWxsZWQuCiAqCiAqIEFyZ3VtZW50czoKLSoJZGF0YQkJYSBwdHIgdG8gdGhlIGhmYTM4NHhfdAorKglkYXRhCQlhIHB0ciB0byB0aGUgc3RydWN0IGhmYTM4NHgKICoKICogUmV0dXJuczoKICoJbm90aGluZwpAQCAtMzgwNiw3ICszODA3LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHZvaWQgaGZhMzg0eF91c2JjdGx4X3Jlc3B0aW1lcmZuKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQloZmEzODR4X3QgKmh3ID0gKGhmYTM4NHhfdCAqKWRhdGE7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gKHN0cnVjdCBoZmEzODR4ICopZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5jdGx4cS5sb2NrLCBmbGFncyk7CkBAIC0zODE3LDcgKzM4MTgsNyBAQAogCSAqIGFkYXB0ZXIgaGFzIGJlZW4gdW5wbHVnZ2VkIC4uLgogCSAqLwogCWlmICghbGlzdF9lbXB0eSgmaHctPmN0bHhxLmFjdGl2ZSkpIHsKLQkJaGZhMzg0eF91c2JjdGx4X3QgKmN0bHggPSBnZXRfYWN0aXZlX2N0bHgoaHcpOworCQlzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4ID0gZ2V0X2FjdGl2ZV9jdGx4KGh3KTsKIAogCQlpZiAodW5sb2NrZWRfdXNiY3RseF9jYW5jZWxfYXN5bmMoaHcsIGN0bHgpID09IDApIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5jdGx4cS5sb2NrLCBmbGFncyk7CkBAIC0zODQ1LDcgKzM4NDYsNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgdm9pZCBoZmEzODR4X3VzYl90aHJvdHRsZWZuKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQloZmEzODR4X3QgKmh3ID0gKGhmYTM4NHhfdCAqKWRhdGE7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gKHN0cnVjdCBoZmEzODR4ICopZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5jdGx4cS5sb2NrLCBmbGFncyk7CkBAIC0zODg1LDcgKzM4ODYsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3Mgb3IgaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgaGZhMzg0eF91c2JjdGx4X3N1Ym1pdChoZmEzODR4X3QgKmh3LCBoZmEzODR4X3VzYmN0bHhfdCAqY3RseCkKK3N0YXRpYyBpbnQgaGZhMzg0eF91c2JjdGx4X3N1Ym1pdChzdHJ1Y3QgaGZhMzg0eCAqaHcsIHN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHgpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5jCmluZGV4IDYzNTQwMzYuLjAyNDdjYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogKglNYXkgYmUgY2FsbGVkIGluIGludGVycnVwdCBvciBub24taW50ZXJydXB0IGNvbnRleHQKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwotaW50IHNrYl9ldGhlcl90b19wODAyMTEod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MzIgZXRoY29udiwKK2ludCBza2JfZXRoZXJfdG9fcDgwMjExKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1MzIgZXRoY29udiwKIAkJCXN0cnVjdCBza19idWZmICpza2IsIHVuaW9uIHA4MDIxMV9oZHIgKnA4MDIxMV9oZHIsCiAJCQlzdHJ1Y3QgcDgwMjExX21ldGF3ZXAgKnA4MDIxMV93ZXApCiB7CkBAIC0yMzIsNyArMjMyLDcgQEAKIH0KIAogLyogamtyaWVnbDogZnJvbSBvcmlub2NvLCBtb2RpZmllZCAqLwotc3RhdGljIHZvaWQgb3Jpbm9jb19zcHlfZ2F0aGVyKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgY2hhciAqbWFjLAorc3RhdGljIHZvaWQgb3Jpbm9jb19zcHlfZ2F0aGVyKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBjaGFyICptYWMsCiAJCQkgICAgICAgc3RydWN0IHA4MDIxMV9yeG1ldGEgKnJ4bWV0YSkKIHsKIAlpbnQgaTsKQEAgLTI3NCwxMCArMjc0LDEwIEBACiAqCU1heSBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IG9yIG5vbi1pbnRlcnJ1cHQgY29udGV4dAogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCi1pbnQgc2tiX3A4MDIxMV90b19ldGhlcih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUzMiBldGhjb252LAoraW50IHNrYl9wODAyMTFfdG9fZXRoZXIoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHUzMiBldGhjb252LAogCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQluZXRkZXZpY2VfdCAqbmV0ZGV2ID0gd2xhbmRldi0+bmV0ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSB3bGFuZGV2LT5uZXRkZXY7CiAJdTE2IGZjOwogCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbmd0aDsKIAl1bnNpZ25lZCBpbnQgcGF5bG9hZF9vZmZzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhZGVmLmgKaW5kZXggMGNjZmJhMS4uYjBkMzU2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YWRlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFkZWYuaApAQCAtMTU1LDIyICsxNTUsOSBAQAogI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNCkpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MGMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MGMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MGMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MGMwMDAwMDApCisjZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfa2V5KF9pKSBcCisJCQkoRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZSB8IFwKKwkJCVA4MDIxMURJRF9NS0lURU0oX2kpIHwgMHgwYzAwMDAwMCkKICNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNikpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhc3RydWN0LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhc3RydWN0LmgKaW5kZXggYzUwMTE2Mi4uODUwZDg5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YXN0cnVjdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFzdHJ1Y3QuaApAQCAtNTEsMjIxICs1MSwyMjEgQEAKIAl1MzIgbXNnY29kZTsKIAl1MzIgbXNnbGVuOwogCXU4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07Ci0JcDgwMjExaXRlbV91bmszOTJfdCBtaWJhdHRyaWJ1dGU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCByZXN1bHRjb2RlOworCXN0cnVjdCBwODAyMTFpdGVtX3VuazM5MiBtaWJhdHRyaWJ1dGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHJlc3VsdGNvZGU7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCB7CiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotCXA4MDIxMWl0ZW1fdW5rMzkyX3QgbWliYXR0cmlidXRlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91bmszOTIgbWliYXR0cmlidXRlOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiByZXN1bHRjb2RlOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuIHsKIAl1MzIgbXNnY29kZTsKIAl1MzIgbXNnbGVuOwogCXU4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07Ci0JcDgwMjExaXRlbV91aW50MzJfdCBic3N0eXBlOwotCXA4MDIxMWl0ZW1fcHN0cjZfdCBic3NpZDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYnNzdHlwZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyNiBic3NpZDsKIAl1OCBwYWRfMENbMV07Ci0JcDgwMjExaXRlbV9wc3RyMzJfdCBzc2lkOworCXN0cnVjdCBwODAyMTFpdGVtX3BzdHIzMiBzc2lkOwogCXU4IHBhZF8xRFszXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHNjYW50eXBlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcHJvYmVkZWxheTsKLQlwODAyMTFpdGVtX3BzdHIxNF90IGNoYW5uZWxsaXN0OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBzY2FudHlwZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcHJvYmVkZWxheTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyMTQgY2hhbm5lbGxpc3Q7CiAJdTggcGFkXzJDWzFdOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgbWluY2hhbm5lbHRpbWU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBtYXhjaGFubmVsdGltZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBudW1ic3M7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBhcHBlbmQ7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIG1pbmNoYW5uZWx0aW1lOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBtYXhjaGFubmVsdGltZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgbnVtYnNzOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBhcHBlbmQ7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3NjYW5fcmVzdWx0cyB7CiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYnNzaW5kZXg7Ci0JcDgwMjExaXRlbV91aW50MzJfdCByZXN1bHRjb2RlOwotCXA4MDIxMWl0ZW1fdWludDMyX3Qgc2lnbmFsOwotCXA4MDIxMWl0ZW1fdWludDMyX3Qgbm9pc2U7Ci0JcDgwMjExaXRlbV9wc3RyNl90IGJzc2lkOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBic3NpbmRleDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgc2lnbmFsOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBub2lzZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyNiBic3NpZDsKIAl1OCBwYWRfM0NbMV07Ci0JcDgwMjExaXRlbV9wc3RyMzJfdCBzc2lkOworCXN0cnVjdCBwODAyMTFpdGVtX3BzdHIzMiBzc2lkOwogCXU4IHBhZF80RFszXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJzc3R5cGU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiZWFjb25wZXJpb2Q7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBkdGltcGVyaW9kOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgdGltZXN0YW1wOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgbG9jYWx0aW1lOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgZmhkd2VsbHRpbWU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBmaGhvcHNldDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGZoaG9wcGF0dGVybjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGZoaG9waW5kZXg7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBkc2NoYW5uZWw7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBjZnBjb3VudDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGNmcHBlcmlvZDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGNmcG1heGR1cmF0aW9uOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgY2ZwZHVycmVtYWluaW5nOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgaWJzc2F0aW13aW5kb3c7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBjZnBvbGxhYmxlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgY2Zwb2xscmVxOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcHJpdmFjeTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGNhcGluZm87Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiYXNpY3JhdGUxOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlMjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJhc2ljcmF0ZTM7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiYXNpY3JhdGU0OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlNTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJhc2ljcmF0ZTY7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiYXNpY3JhdGU3OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlODsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHN1cHByYXRlMTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHN1cHByYXRlMjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHN1cHByYXRlMzsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHN1cHByYXRlNDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHN1cHByYXRlNTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHN1cHByYXRlNjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHN1cHByYXRlNzsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHN1cHByYXRlODsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYnNzdHlwZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmVhY29ucGVyaW9kOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBkdGltcGVyaW9kOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiB0aW1lc3RhbXA7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGxvY2FsdGltZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgZmhkd2VsbHRpbWU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGZoaG9wc2V0OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBmaGhvcHBhdHRlcm47CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGZoaG9waW5kZXg7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGRzY2hhbm5lbDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgY2ZwY291bnQ7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGNmcHBlcmlvZDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgY2ZwbWF4ZHVyYXRpb247CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGNmcGR1cnJlbWFpbmluZzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgaWJzc2F0aW13aW5kb3c7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGNmcG9sbGFibGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGNmcG9sbHJlcTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcHJpdmFjeTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgY2FwaW5mbzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlMTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlMjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlMzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlNDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlNTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlNjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlNzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlODsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgc3VwcHJhdGUxOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBzdXBwcmF0ZTI7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHN1cHByYXRlMzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgc3VwcHJhdGU0OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBzdXBwcmF0ZTU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHN1cHByYXRlNjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgc3VwcHJhdGU3OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBzdXBwcmF0ZTg7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3N0YXJ0IHsKIAl1MzIgbXNnY29kZTsKIAl1MzIgbXNnbGVuOwogCXU4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07Ci0JcDgwMjExaXRlbV9wc3RyMzJfdCBzc2lkOworCXN0cnVjdCBwODAyMTFpdGVtX3BzdHIzMiBzc2lkOwogCXU4IHBhZF8xMkRbM107Ci0JcDgwMjExaXRlbV91aW50MzJfdCBic3N0eXBlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmVhY29ucGVyaW9kOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgZHRpbXBlcmlvZDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGNmcHBlcmlvZDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGNmcG1heGR1cmF0aW9uOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgZmhkd2VsbHRpbWU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBmaGhvcHNldDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGZoaG9wcGF0dGVybjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGRzY2hhbm5lbDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGlic3NhdGltd2luZG93OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcHJvYmVkZWxheTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGNmcG9sbGFibGU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBjZnBvbGxyZXE7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiYXNpY3JhdGUxOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlMjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJhc2ljcmF0ZTM7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiYXNpY3JhdGU0OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlNTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJhc2ljcmF0ZTY7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiYXNpY3JhdGU3OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlODsKLQlwODAyMTFpdGVtX3VpbnQzMl90IG9wZXJhdGlvbmFscmF0ZTE7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBvcGVyYXRpb25hbHJhdGUyOwotCXA4MDIxMWl0ZW1fdWludDMyX3Qgb3BlcmF0aW9uYWxyYXRlMzsKLQlwODAyMTFpdGVtX3VpbnQzMl90IG9wZXJhdGlvbmFscmF0ZTQ7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBvcGVyYXRpb25hbHJhdGU1OwotCXA4MDIxMWl0ZW1fdWludDMyX3Qgb3BlcmF0aW9uYWxyYXRlNjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IG9wZXJhdGlvbmFscmF0ZTc7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBvcGVyYXRpb25hbHJhdGU4OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYnNzdHlwZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmVhY29ucGVyaW9kOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBkdGltcGVyaW9kOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBjZnBwZXJpb2Q7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGNmcG1heGR1cmF0aW9uOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBmaGR3ZWxsdGltZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgZmhob3BzZXQ7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGZoaG9wcGF0dGVybjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgZHNjaGFubmVsOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBpYnNzYXRpbXdpbmRvdzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcHJvYmVkZWxheTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgY2Zwb2xsYWJsZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgY2Zwb2xscmVxOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBiYXNpY3JhdGUxOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBiYXNpY3JhdGUyOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBiYXNpY3JhdGUzOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBiYXNpY3JhdGU0OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBiYXNpY3JhdGU1OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBiYXNpY3JhdGU2OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBiYXNpY3JhdGU3OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBiYXNpY3JhdGU4OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBvcGVyYXRpb25hbHJhdGUxOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBvcGVyYXRpb25hbHJhdGUyOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBvcGVyYXRpb25hbHJhdGUzOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBvcGVyYXRpb25hbHJhdGU0OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBvcGVyYXRpb25hbHJhdGU1OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBvcGVyYXRpb25hbHJhdGU2OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBvcGVyYXRpb25hbHJhdGU3OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBvcGVyYXRpb25hbHJhdGU4OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiByZXN1bHRjb2RlOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaWZzdGF0ZSB7CiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgaWZzdGF0ZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGlmc3RhdGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHJlc3VsdGNvZGU7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV93bGFuc25pZmYgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGVuYWJsZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGNoYW5uZWw7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBwcmlzbWhlYWRlcjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHdsYW5oZWFkZXI7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBrZWVwd2VwZmxhZ3M7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBzdHJpcGZjczsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHBhY2tldF90cnVuYzsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGVuYWJsZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgY2hhbm5lbDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcHJpc21oZWFkZXI7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHdsYW5oZWFkZXI7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGtlZXB3ZXBmbGFnczsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgc3RyaXBmY3M7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHBhY2tldF90cnVuYzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2hvc3R3ZXAgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBkZWNyeXB0OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgZW5jcnlwdDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgZGVjcnlwdDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgZW5jcnlwdDsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2NvbW1zcXVhbGl0eSB7CiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcmVzdWx0Y29kZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGRibTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGxpbms7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBsZXZlbDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IG5vaXNlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgdHhyYXRlOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiByZXN1bHRjb2RlOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBkYm07CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGxpbms7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGxldmVsOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBub2lzZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgdHhyYXRlOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfYXV0b2pvaW4gewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3BzdHIzMl90IHNzaWQ7CisJc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjMyIHNzaWQ7CiAJdTggcGFkXzE5RFszXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGF1dGh0eXBlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYXV0aHR5cGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHJlc3VsdGNvZGU7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JlYWRwZGEgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3VuazEwMjRfdCBwZGE7Ci0JcDgwMjExaXRlbV91aW50MzJfdCByZXN1bHRjb2RlOworCXN0cnVjdCBwODAyMTFpdGVtX3VuazEwMjQgcGRhOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiByZXN1bHRjb2RlOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9yYW1kbF9zdGF0ZSB7CiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgZW5hYmxlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgZXhlYWRkcjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGVuYWJsZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgZXhlYWRkcjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfcmFtZGxfd3JpdGUgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGFkZHI7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBsZW47Ci0JcDgwMjExaXRlbV91bms0MDk2X3QgZGF0YTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGFkZHI7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGxlbjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91bms0MDk2IGRhdGE7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHJlc3VsdGNvZGU7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2ZsYXNoZGxfc3RhdGUgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGVuYWJsZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGVuYWJsZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfZmxhc2hkbF93cml0ZSB7CiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYWRkcjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGxlbjsKLQlwODAyMTFpdGVtX3VuazQwOTZfdCBkYXRhOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYWRkcjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgbGVuOworCXN0cnVjdCBwODAyMTFpdGVtX3VuazQwOTYgZGF0YTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKIH0gX19wYWNrZWQ7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYwppbmRleCA5MGNjOGNkLi44MjVhNjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYwpAQCAtOTEsMTcgKzkxLDE3IEBACiAjaW5jbHVkZSAiY2ZnODAyMTEuYyIKIAogLyogbmV0ZGV2aWNlIG1ldGhvZCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgcDgwMjExa25ldGRldl9pbml0KG5ldGRldmljZV90ICpuZXRkZXYpOwotc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X29wZW4obmV0ZGV2aWNlX3QgKm5ldGRldik7Ci1zdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfc3RvcChuZXRkZXZpY2VfdCAqbmV0ZGV2KTsKK3N0YXRpYyBpbnQgcDgwMjExa25ldGRldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIHN0YXRpYyBpbnQgcDgwMjExa25ldGRldl9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJIG5ldGRldmljZV90ICpuZXRkZXYpOwotc3RhdGljIHZvaWQgcDgwMjExa25ldGRldl9zZXRfbXVsdGljYXN0X2xpc3QobmV0ZGV2aWNlX3QgKmRldik7Ci1zdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfZG9faW9jdGwobmV0ZGV2aWNlX3QgKmRldiwgc3RydWN0IGlmcmVxICppZnIsCisJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3N0YXRpYyB2b2lkIHA4MDIxMWtuZXRkZXZfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X2RvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLAogCQkJCSAgaW50IGNtZCk7Ci1zdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfc2V0X21hY19hZGRyZXNzKG5ldGRldmljZV90ICpkZXYsIHZvaWQgKmFkZHIpOwotc3RhdGljIHZvaWQgcDgwMjExa25ldGRldl90eF90aW1lb3V0KG5ldGRldmljZV90ICpuZXRkZXYpOwotc3RhdGljIGludCBwODAyMTFfcnhfdHlwZWRyb3Aod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MTYgZmMpOworc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKTsKK3N0YXRpYyB2b2lkIHA4MDIxMWtuZXRkZXZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3N0YXRpYyBpbnQgcDgwMjExX3J4X3R5cGVkcm9wKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1MTYgZmMpOwogCiBpbnQgd2xhbl93YXRjaGRvZyA9IDUwMDA7CiBtb2R1bGVfcGFyYW0od2xhbl93YXRjaGRvZywgaW50LCAwNjQ0KTsKQEAgLTEyMyw3ICsxMjMsNyBAQAogKiBSZXR1cm5zOgogKglub3RoaW5nCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgcDgwMjExa25ldGRldl9pbml0KG5ldGRldmljZV90ICpuZXRkZXYpCitzdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCS8qIENhbGxlZCBpbiByZXNwb25zZSB0byByZWdpc3Rlcl9uZXRkZXYgKi8KIAkvKiBUaGlzIGlzIHVzdWFsbHkgdGhlIHByb2JlIGZ1bmN0aW9uLCBidXQgdGhlIHByb2JlIGhhcyAqLwpAQCAtMTQ2LDEwICsxNDYsMTAgQEAKICogUmV0dXJuczoKICoJemVybyBvbiBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X29wZW4obmV0ZGV2aWNlX3QgKm5ldGRldikKK3N0YXRpYyBpbnQgcDgwMjExa25ldGRldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJaW50IHJlc3VsdCA9IDA7CQkvKiBzdWNjZXNzICovCi0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gbmV0ZGV2LT5tbF9wcml2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gbmV0ZGV2LT5tbF9wcml2OwogCiAJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBNU0QgaXMgcnVubmluZyAqLwogCWlmICh3bGFuZGV2LT5tc2RzdGF0ZSAhPSBXTEFOX01TRF9SVU5OSU5HKQpAQCAtMTgxLDEwICsxODEsMTAgQEAKICogUmV0dXJuczoKICoJemVybyBvbiBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X3N0b3AobmV0ZGV2aWNlX3QgKm5ldGRldikKK3N0YXRpYyBpbnQgcDgwMjExa25ldGRldl9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gbmV0ZGV2LT5tbF9wcml2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gbmV0ZGV2LT5tbF9wcml2OwogCiAJaWYgKHdsYW5kZXYtPmNsb3NlKQogCQlyZXN1bHQgPSB3bGFuZGV2LT5jbG9zZSh3bGFuZGV2KTsKQEAgLTIwOCw3ICsyMDgsNyBAQAogKiBTaWRlIGVmZmVjdHM6CiAqCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcDgwMjExbmV0ZGV2X3J4KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3ZvaWQgcDgwMjExbmV0ZGV2X3J4KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCS8qIEVucXVldWUgZm9yIHBvc3QtaXJxIHByb2Nlc3NpbmcgKi8KIAlza2JfcXVldWVfdGFpbCgmd2xhbmRldi0+bnNkX3J4cSwgc2tiKTsKQEAgLTIyNywxMSArMjI3LDExIEBACiAgKgkgICAgQ09OVl9UT19FVEhFUl9GQUlMRUQgaWYgY29udmVyc2lvbiBmYWlsZWQKICAqCSAgICBDT05WX1RPX0VUSEVSX1NLSVBQRUQgaWYgZnJhbWUgaXMgaWdub3JlZAogICovCi1zdGF0aWMgaW50IHA4MDIxMV9jb252ZXJ0X3RvX2V0aGVyKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgcDgwMjExX2NvbnZlcnRfdG9fZXRoZXIoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHA4MDIxMV9oZHJfYTMgKmhkcjsKIAotCWhkciA9IChzdHJ1Y3QgcDgwMjExX2hkcl9hMyAqKSBza2ItPmRhdGE7CisJaGRyID0gKHN0cnVjdCBwODAyMTFfaGRyX2EzICopc2tiLT5kYXRhOwogCWlmIChwODAyMTFfcnhfdHlwZWRyb3Aod2xhbmRldiwgaGRyLT5mYykpCiAJCXJldHVybiBDT05WX1RPX0VUSEVSX1NLSVBQRUQ7CiAKQEAgLTI2NSw5ICsyNjUsOSBAQAogICovCiBzdGF0aWMgdm9pZCBwODAyMTFuZXRkZXZfcnhfYmgodW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCAqKSBhcmc7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSAoc3RydWN0IHdsYW5kZXZpY2UgKilhcmc7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7Ci0JbmV0ZGV2aWNlX3QgKmRldiA9IHdsYW5kZXYtPm5ldGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2xhbmRldi0+bmV0ZGV2OwogCiAJLyogTGV0J3MgZW1wdHkgb3VyIG91ciBxdWV1ZSAqLwogCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJndsYW5kZXYtPm5zZF9yeHEpKSkgewpAQCAtMzE4LDExICszMTgsMTEgQEAKICoJemVybyBvbiBzdWNjZXNzLCBub24temVybyBvbiBmYWlsdXJlLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSBuZXRkZXZpY2VfdCAqbmV0ZGV2KQorCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlpbnQgdHhyZXN1bHQgPSAtMTsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBuZXRkZXYtPm1sX3ByaXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBuZXRkZXYtPm1sX3ByaXY7CiAJdW5pb24gcDgwMjExX2hkciBwODAyMTFfaGRyOwogCXN0cnVjdCBwODAyMTFfbWV0YXdlcCBwODAyMTFfd2VwOwogCkBAIC00NDYsOSArNDQ2LDkgQEAKICogUmV0dXJuczoKICoJbm90aGluZwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBwODAyMTFrbmV0ZGV2X3NldF9tdWx0aWNhc3RfbGlzdChuZXRkZXZpY2VfdCAqZGV2KQorc3RhdGljIHZvaWQgcDgwMjExa25ldGRldl9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CiAKIAkvKiBUT0RPOiAgcmVhbCBtdWx0aWNhc3Qgc3VwcG9ydCBhcyB3ZWxsICovCiAKQEAgLTQ1OSw3ICs0NTksNyBAQAogCiAjaWZkZWYgU0lPQ0VUSFRPT0wKIAotc3RhdGljIGludCBwODAyMTFuZXRkZXZfZXRodG9vbCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgX191c2VyICp1c2VyYWRkcikKK3N0YXRpYyBpbnQgcDgwMjExbmV0ZGV2X2V0aHRvb2woc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgX191c2VyICp1c2VyYWRkcikKIHsKIAl1MzIgZXRoY21kOwogCXN0cnVjdCBldGh0b29sX2RydmluZm8gaW5mbzsKQEAgLTUzMSwxMSArNTMxLDExIEBACiAqCVByb2Nlc3MgdGhyZWFkIChpb2N0bCBjYWxsZXIpLiAgVE9ETzogU01QIHN1cHBvcnQgbWF5IHJlcXVpcmUKICoJbG9ja3MuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgcDgwMjExa25ldGRldl9kb19pb2N0bChuZXRkZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3N0YXRpYyBpbnQgcDgwMjExa25ldGRldl9kb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgcDgwMjExaW9jdGxfcmVxICpyZXEgPSAoc3RydWN0IHA4MDIxMWlvY3RsX3JlcSAqKSBpZnI7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBwODAyMTFpb2N0bF9yZXEgKnJlcSA9IChzdHJ1Y3QgcDgwMjExaW9jdGxfcmVxICopaWZyOworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwogCXU4ICptc2didWY7CiAKIAluZXRkZXZfZGJnKGRldiwgInJ4J2QgaW9jdGwsIGNtZD0lZCwgbGVuPSVkXG4iLCBjbWQsIHJlcS0+bGVuKTsKQEAgLTYxMCwxMyArNjEwLDEzIEBACiAqCiAqIGJ5OiBDb2xsaW4gUi4gTXVsbGluZXIgPGNvbGxpbkBtdWxsaW5lci5vcmc+CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgcDgwMjExa25ldGRldl9zZXRfbWFjX2FkZHJlc3MobmV0ZGV2aWNlX3QgKmRldiwgdm9pZCAqYWRkcikKK3N0YXRpYyBpbnQgcDgwMjExa25ldGRldl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKIHsKIAlzdHJ1Y3Qgc29ja2FkZHIgKm5ld19hZGRyID0gYWRkcjsKIAlzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCBkb3QxMXJlcTsKLQlwODAyMTFpdGVtX3VuazM5Ml90ICptaWJhdHRyOwotCXA4MDIxMWl0ZW1fcHN0cjZfdCAqbWFjYWRkcjsKLQlwODAyMTFpdGVtX3VpbnQzMl90ICpyZXN1bHRjb2RlOworCXN0cnVjdCBwODAyMTFpdGVtX3VuazM5MiAqbWliYXR0cjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyNiAqbWFjYWRkcjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgKnJlc3VsdGNvZGU7CiAJaW50IHJlc3VsdDsKIAogCS8qIElmIHdlJ3JlIHJ1bm5pbmcsIHdlIGRvbid0IGFsbG93IE1BQyBhZGRyZXNzIGNoYW5nZXMgKi8KQEAgLTYyNSw3ICs2MjUsNyBAQAogCiAJLyogU2V0IHVwIHNvbWUgY29udmVuaWVuY2UgcG9pbnRlcnMuICovCiAJbWliYXR0ciA9ICZkb3QxMXJlcS5taWJhdHRyaWJ1dGU7Ci0JbWFjYWRkciA9IChwODAyMTFpdGVtX3BzdHI2X3QgKikgJm1pYmF0dHItPmRhdGE7CisJbWFjYWRkciA9IChzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyNiAqKSZtaWJhdHRyLT5kYXRhOwogCXJlc3VsdGNvZGUgPSAmZG90MTFyZXEucmVzdWx0Y29kZTsKIAogCS8qIFNldCB1cCBhIGRvdDExcmVxX21pYnNldCAqLwpAQCAtNjMzLDcgKzYzMyw3IEBACiAJZG90MTFyZXEubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJzZXQ7CiAJZG90MTFyZXEubXNnbGVuID0gc2l6ZW9mKHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0KTsKIAltZW1jcHkoZG90MTFyZXEuZGV2bmFtZSwKLQkgICAgICAgKCh3bGFuZGV2aWNlX3QgKikgZGV2LT5tbF9wcml2KS0+bmFtZSwgV0xBTl9ERVZOQU1FTEVOX01BWCAtIDEpOworCSAgICAgICAoKHN0cnVjdCB3bGFuZGV2aWNlICopZGV2LT5tbF9wcml2KS0+bmFtZSwgV0xBTl9ERVZOQU1FTEVOX01BWCAtIDEpOwogCiAJLyogU2V0IHVwIHRoZSBtaWJhdHRyaWJ1dGUgYXJndW1lbnQgKi8KIAltaWJhdHRyLT5kaWQgPSBESURtc2dfZG90MTFyZXFfbWlic2V0X21pYmF0dHJpYnV0ZTsKQEAgLTY1Myw3ICs2NTMsNyBAQAogCXJlc3VsdGNvZGUtPmRhdGEgPSAwOwogCiAJLyogbm93IGZpcmUgdGhlIHJlcXVlc3QgKi8KLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KGRldi0+bWxfcHJpdiwgKHU4ICopICZkb3QxMXJlcSk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdChkZXYtPm1sX3ByaXYsICh1OCAqKSZkb3QxMXJlcSk7CiAKIAkvKiBJZiB0aGUgcmVxdWVzdCB3YXNuJ3Qgc3VjY2Vzc2Z1bCwgcmVwb3J0IGFuIGVycm9yIGFuZCBkb24ndAogCSAqIGNoYW5nZSB0aGUgbmV0ZGV2IGFkZHJlc3MKQEAgLTY2OSw3ICs2NjksNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgd2xhbl9jaGFuZ2VfbXR1KG5ldGRldmljZV90ICpkZXYsIGludCBuZXdfbXR1KQorc3RhdGljIGludCB3bGFuX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCiB7CiAJLyogMjMxMiBpcyBtYXggODAyLjExIHBheWxvYWQsIDIwIGlzIG92ZXJoZWFkLCAoZXRoZXIgKyBsbGMgK3NuYXApCiAJICAgYW5kIGFub3RoZXIgOCBmb3Igd2VwLiAqLwpAQCAtNzE3LDEwICs3MTcsMTAgQEAKICoJY29tcGlsZWQgZHJpdmVycywgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBpbiB0aGUKICoJY29udGV4dCBvZiB0aGUga2VybmVsIHN0YXJ0dXAgY29kZS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHdsYW5fc2V0dXAod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3QgZGV2aWNlICpwaHlzZGV2KQoraW50IHdsYW5fc2V0dXAoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBkZXZpY2UgKnBoeXNkZXYpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JbmV0ZGV2aWNlX3QgKm5ldGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCXN0cnVjdCB3aXBoeSAqd2lwaHk7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldjsKIApAQCAtNzgzLDcgKzc4Myw3IEBACiAqCWNvbXBpbGVkIGRyaXZlcnMsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaW4gdGhlCiAqCWNvbnRleHQgb2YgdGhlIGtlcm5lbCBzdGFydHVwIGNvZGUuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgd2xhbl91bnNldHVwKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3ZvaWQgd2xhbl91bnNldHVwKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7CiAKQEAgLTgxNyw3ICs4MTcsNyBAQAogKiBDYWxsIENvbnRleHQ6CiAqCUNhbiBiZSBlaXRoZXIgaW50ZXJydXB0IG9yIG5vdC4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldmljZV90ICp3bGFuZGV2KQoraW50IHJlZ2lzdGVyX3dsYW5kZXYoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJcmV0dXJuIHJlZ2lzdGVyX25ldGRldih3bGFuZGV2LT5uZXRkZXYpOwogfQpAQCAtODM5LDcgKzgzOSw3IEBACiAqIENhbGwgQ29udGV4dDoKICoJQ2FuIGJlIGVpdGhlciBpbnRlcnJ1cHQgb3Igbm90LgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK2ludCB1bnJlZ2lzdGVyX3dsYW5kZXYoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIApAQCAtODgyLDcgKzg4Miw3IEBACiAqIENhbGwgY29udGV4dDoKICoJVXN1YWxseSBpbnRlcnJ1cHQuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcDgwMjExbmV0ZGV2X2h3cmVtb3ZlZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCit2b2lkIHA4MDIxMW5ldGRldl9od3JlbW92ZWQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJd2xhbmRldi0+aHdyZW1vdmVkID0gMTsKIAlpZiAod2xhbmRldi0+c3RhdGUgPT0gV0xBTl9ERVZJQ0VfT1BFTikKQEAgLTkxMiw3ICs5MTIsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHA4MDIxMV9yeF90eXBlZHJvcCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUxNiBmYykKK3N0YXRpYyBpbnQgcDgwMjExX3J4X3R5cGVkcm9wKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1MTYgZmMpCiB7CiAJdTE2IGZ0eXBlOwogCXUxNiBmc3R5cGU7CkBAIC0xMDcxLDkgKzEwNzEsOSBAQAogCXJldHVybiBkcm9wOwogfQogCi1zdGF0aWMgdm9pZCBwODAyMTFrbmV0ZGV2X3R4X3RpbWVvdXQobmV0ZGV2aWNlX3QgKm5ldGRldikKK3N0YXRpYyB2b2lkIHA4MDIxMWtuZXRkZXZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IG5ldGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IG5ldGRldi0+bWxfcHJpdjsKIAogCWlmICh3bGFuZGV2LT50eF90aW1lb3V0KSB7CiAJCXdsYW5kZXYtPnR4X3RpbWVvdXQod2xhbmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5oCmluZGV4IDgyMGEwZTIuLjFlNmE3NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5oCkBAIC01Nyw5ICs1Nyw2IEBACiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KIAotI3VuZGVmIG5ldGRldmljZV90Ci10eXBlZGVmIHN0cnVjdCBuZXRfZGV2aWNlIG5ldGRldmljZV90OwotCiAjZGVmaW5lIFdMQU5fUkVMRUFTRQkiMC4zLjAtc3RhZ2luZyIKIAogI2RlZmluZSBXTEFOX0RFVklDRV9DTE9TRUQJMApAQCAtMTAxLDcgKzk4LDcgQEAKICNkZWZpbmUgUDgwMjExX05TRENBUF9OT1NDQU4gICAgICAgICAgICAgICAgMHgyMDAgLyogbnNkIGNhbiBzY2FuICovCiAKIC8qIFJlY2VpdmVkIGZyYW1lIHN0YXRpc3RpY3MgKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMV9mcm1yeF90IHsKK3N0cnVjdCBwODAyMTFfZnJtcnggewogCXUzMiBtZ210OwogCXUzMiBhc3NvY3JlcTsKIAl1MzIgYXNzb2NyZXNwOwpAQCAtMTM1LDEwICsxMzIsMTAgQEAKIAl1MzIgZGF0YV91bmtub3duOwogCXUzMiBkZWNyeXB0OwogCXUzMiBkZWNyeXB0X2VycjsKLX0gcDgwMjExX2ZybXJ4X3Q7Cit9OwogCiAvKiBjYWxsZWQgYnkgL3Byb2MvbmV0L3dpcmVsZXNzICovCi1zdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcDgwMjExd2V4dF9nZXRfd2lyZWxlc3Nfc3RhdHMobmV0ZGV2aWNlX3QgKmRldik7CitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcDgwMjExd2V4dF9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAvKiB3aXJlbGVzcyBleHRlbnNpb25zJyBpb2N0bHMgKi8KIGV4dGVybiBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcDgwMjExd2V4dF9oYW5kbGVyX2RlZjsKIApAQCAtMTU3LDcgKzE1NCw3IEBACiBleHRlcm4gaW50IHdsYW5fd2V4dF93cml0ZTsKIAogLyogV0xBTiBkZXZpY2UgdHlwZSAqLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbmRldmljZSB7CitzdHJ1Y3Qgd2xhbmRldmljZSB7CiAJdm9pZCAqcHJpdjsJCS8qIHByaXZhdGUgZGF0YSBmb3IgTVNEICovCiAKIAkvKiBTdWJzeXN0ZW0gU3RhdGUgKi8KQEAgLTE4NiwxMiArMTgzLDEyIEBACiAJCQlzdHJ1Y3QgcDgwMjExX21ldGF3ZXAgKnA4MDIxMV93ZXApOwogCWludCAoKm1sbWVyZXF1ZXN0KShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IHA4MDIxMW1zZyAqbXNnKTsKIAlpbnQgKCpzZXRfbXVsdGljYXN0X2xpc3QpKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAotCQkJCSAgIG5ldGRldmljZV90ICpkZXYpOworCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCXZvaWQgKCp0eF90aW1lb3V0KShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7CiAKIAkvKiA4MDIuMTEgU3RhdGUgKi8KIAl1OCBic3NpZFtXTEFOX0JTU0lEX0xFTl07Ci0JcDgwMjExcHN0cjMyX3Qgc3NpZDsKKwlzdHJ1Y3QgcDgwMjExcHN0cjMyIHNzaWQ7CiAJdTMyIG1hY21vZGU7CiAJaW50IGxpbmtzdGF0dXM7CiAKQEAgLTIwNiw3ICsyMDMsNyBAQAogCS8qIG5ldGxpbmsgc29ja2V0ICovCiAJLyogcXVldWUgZm9yIGluZGljYXRpb25zIHdhaXRpbmcgZm9yIGNtZCBjb21wbGV0aW9uICovCiAJLyogTGludXggbmV0ZGV2aWNlIGFuZCBzdXBwb3J0ICovCi0JbmV0ZGV2aWNlX3QgKm5ldGRldjsJLyogcHRyIHRvIGxpbnV4IG5ldGRldmljZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CS8qIHB0ciB0byBsaW51eCBuZXRkZXZpY2UgKi8KIAogCS8qIFJ4IGJvdHRvbSBoYWxmICovCiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IHJ4X2JoOwpAQCAtMjE0LDcgKzIxMSw3IEBACiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBuc2RfcnhxOwogCiAJLyogODAyLjExIGRldmljZSBzdGF0aXN0aWNzICovCi0Jc3RydWN0IHA4MDIxMV9mcm1yeF90IHJ4OworCXN0cnVjdCBwODAyMTFfZnJtcnggcng7CiAKIAlzdHJ1Y3QgaXdfc3RhdGlzdGljcyB3c3RhdHM7CiAKQEAgLTIyMiwxOSArMjE5LDE5IEBACiAJdTggc3B5X251bWJlcjsKIAljaGFyIHNweV9hZGRyZXNzW0lXX01BWF9TUFldW0VUSF9BTEVOXTsKIAlzdHJ1Y3QgaXdfcXVhbGl0eSBzcHlfc3RhdFtJV19NQVhfU1BZXTsKLX0gd2xhbmRldmljZV90OworfTsKIAogLyogV0VQIHN0dWZmICovCi1pbnQgd2VwX2NoYW5nZV9rZXkod2xhbmRldmljZV90ICp3bGFuZGV2LCBpbnQga2V5bnVtLCB1OCAqa2V5LCBpbnQga2V5bGVuKTsKLWludCB3ZXBfZGVjcnlwdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4ICpidWYsIHUzMiBsZW4sIGludCBrZXlfb3ZlcnJpZGUsCitpbnQgd2VwX2NoYW5nZV9rZXkoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIGludCBrZXludW0sIHU4ICprZXksIGludCBrZXlsZW4pOworaW50IHdlcF9kZWNyeXB0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1OCAqYnVmLCB1MzIgbGVuLCBpbnQga2V5X292ZXJyaWRlLAogCQl1OCAqaXYsIHU4ICppY3YpOwotaW50IHdlcF9lbmNyeXB0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTggKmJ1ZiwgdTggKmRzdCwgdTMyIGxlbiwgaW50IGtleW51bSwKLQkJdTggKml2LCB1OCAqaWN2KTsKK2ludCB3ZXBfZW5jcnlwdChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTggKmJ1ZiwgdTggKmRzdCwgdTMyIGxlbiwKKwkJaW50IGtleW51bSwgdTggKml2LCB1OCAqaWN2KTsKIAotaW50IHdsYW5fc2V0dXAod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3QgZGV2aWNlICpwaHlzZGV2KTsKLXZvaWQgd2xhbl91bnNldHVwKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci1pbnQgcmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotaW50IHVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotdm9pZCBwODAyMTFuZXRkZXZfcngod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXZvaWQgcDgwMjExbmV0ZGV2X2h3cmVtb3ZlZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOworaW50IHdsYW5fc2V0dXAoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBkZXZpY2UgKnBoeXNkZXYpOwordm9pZCB3bGFuX3Vuc2V0dXAoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOworaW50IHJlZ2lzdGVyX3dsYW5kZXYoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOworaW50IHVucmVnaXN0ZXJfd2xhbmRldihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7Cit2b2lkIHA4MDIxMW5ldGRldl9yeChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Cit2b2lkIHA4MDIxMW5ldGRldl9od3JlbW92ZWQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXJlcS5jCmluZGV4IDRiODRiNTYuLmQ0M2U4NWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuYwpAQCAtNzIsMTEgKzcyLDI2IEBACiAjaW5jbHVkZSAicDgwMjExbWV0YXN0cnVjdC5oIgogI2luY2x1ZGUgInA4MDIxMXJlcS5oIgogCi1zdGF0aWMgdm9pZCBwODAyMTFyZXFfaGFuZGxlbXNnKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHA4MDIxMW1zZyAqbXNnKTsKLXN0YXRpYyB2b2lkIHA4MDIxMXJlcV9taWJzZXRfbWliZ2V0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKK3N0YXRpYyB2b2lkIHA4MDIxMXJlcV9oYW5kbGVtc2coc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBwODAyMTFtc2cgKm1zZyk7CitzdGF0aWMgdm9pZCBwODAyMTFyZXFfbWlic2V0X21pYmdldChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKIAkJCQkgICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYmdldCAqbWliX21zZywKIAkJCQkgICBpbnQgaXNnZXQpOwogCitzdGF0aWMgdm9pZCBwODAyMTFyZXFfaGFuZGxlX2FjdGlvbihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTMyICpkYXRhLAorCQkJCSAgICBpbnQgaXNnZXQsIHUzMiBmbGFnKQoreworCWlmIChpc2dldCkgeworCQlpZiAod2xhbmRldi0+aG9zdHdlcCAmIGZsYWcpCisJCQkqZGF0YSA9IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZTsKKwkJZWxzZQorCQkJKmRhdGEgPSBQODAyMTFFTlVNX3RydXRoX2ZhbHNlOworCX0gZWxzZSB7CisJCXdsYW5kZXYtPmhvc3R3ZXAgJj0gfmZsYWc7CisJCWlmICgqZGF0YSA9PSBQODAyMTFFTlVNX3RydXRoX3RydWUpCisJCQl3bGFuZGV2LT5ob3N0d2VwIHw9IGZsYWc7CisJfQorfQorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcDgwMjExcmVxX2RvcmVxdWVzdAogKgpAQCAtOTMsOSArMTA4LDkgQEAKICoJUG90ZW50aWFsbHkgYmxvY2tzIHRoZSBjYWxsZXIsIHNvIGl0J3MgYSBnb29kIGlkZWEgdG8KICoJbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIGFuIGludGVycnVwdCBjb250ZXh0LgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4ICptc2didWYpCitpbnQgcDgwMjExcmVxX2RvcmVxdWVzdChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTggKm1zZ2J1ZikKIHsKLQlzdHJ1Y3QgcDgwMjExbXNnICptc2cgPSAoc3RydWN0IHA4MDIxMW1zZyAqKSBtc2didWY7CisJc3RydWN0IHA4MDIxMW1zZyAqbXNnID0gKHN0cnVjdCBwODAyMTFtc2cgKiltc2didWY7CiAKIAkvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIE1TRCBpcyBydW5uaW5nICovCiAJaWYgKCEoKHdsYW5kZXYtPm1zZHN0YXRlID09IFdMQU5fTVNEX0hXUFJFU0VOVCAmJgpAQCAtMTQ5LDEzICsxNjQsMTMgQEAKICogQ2FsbCBjb250ZXh0OgogKglQcm9jZXNzIHRocmVhZAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBwODAyMTFyZXFfaGFuZGxlbXNnKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHA4MDIxMW1zZyAqbXNnKQorc3RhdGljIHZvaWQgcDgwMjExcmVxX2hhbmRsZW1zZyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IHA4MDIxMW1zZyAqbXNnKQogewogCXN3aXRjaCAobXNnLT5tc2djb2RlKSB7CiAKIAljYXNlIERJRG1zZ19sbnhyZXFfaG9zdHdlcDp7CiAJCXN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2hvc3R3ZXAgKnJlcSA9Ci0JCQkoc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaG9zdHdlcCAqKSBtc2c7CisJCQkoc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaG9zdHdlcCAqKW1zZzsKIAkJd2xhbmRldi0+aG9zdHdlcCAmPQogCQkJCX4oSE9TVFdFUF9ERUNSWVBUIHwgSE9TVFdFUF9FTkNSWVBUKTsKIAkJaWYgKHJlcS0+ZGVjcnlwdC5kYXRhID09IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSkKQEAgLTE2OSw0NCArMTg0LDM0IEBACiAJY2FzZSBESURtc2dfZG90MTFyZXFfbWlic2V0OnsKIAkJaW50IGlzZ2V0ID0gKG1zZy0+bXNnY29kZSA9PSBESURtc2dfZG90MTFyZXFfbWliZ2V0KTsKIAkJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJnZXQgKm1pYl9tc2cgPQotCQkJKHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWliZ2V0ICopIG1zZzsKKwkJCShzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYmdldCAqKW1zZzsKIAkJcDgwMjExcmVxX21pYnNldF9taWJnZXQod2xhbmRldiwgbWliX21zZywgaXNnZXQpOwogCWJyZWFrOwogCX0KIAl9CQkJLyogc3dpdGNoIG1zZy0+bXNnY29kZSAqLwogfQogCi1zdGF0aWMgdm9pZCBwODAyMTFyZXFfbWlic2V0X21pYmdldCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCitzdGF0aWMgdm9pZCBwODAyMTFyZXFfbWlic2V0X21pYmdldChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKIAkJCQkgICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYmdldCAqbWliX21zZywKIAkJCQkgICBpbnQgaXNnZXQpCiB7Ci0JcDgwMjExaXRlbWRfdCAqbWliaXRlbSA9IChwODAyMTFpdGVtZF90ICopIG1pYl9tc2ctPm1pYmF0dHJpYnV0ZS5kYXRhOwotCXA4MDIxMXBzdHJkX3QgKnBzdHIgPSAocDgwMjExcHN0cmRfdCAqKSBtaWJpdGVtLT5kYXRhOwotCXU4ICprZXkgPSBtaWJpdGVtLT5kYXRhICsgc2l6ZW9mKHA4MDIxMXBzdHJkX3QpOworCXN0cnVjdCBwODAyMTFpdGVtZCAqbWliaXRlbSA9IChzdHJ1Y3QgcDgwMjExaXRlbWQgKiltaWJfbXNnLT5taWJhdHRyaWJ1dGUuZGF0YTsKKwlzdHJ1Y3QgcDgwMjExcHN0cmQgKnBzdHIgPSAoc3RydWN0IHA4MDIxMXBzdHJkICopbWliaXRlbS0+ZGF0YTsKKwl1OCAqa2V5ID0gbWliaXRlbS0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgcDgwMjExcHN0cmQpOwogCiAJc3dpdGNoIChtaWJpdGVtLT5kaWQpIHsKLQljYXNlIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MDp7CisJY2FzZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2tleSgxKToKKwljYXNlIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfa2V5KDIpOgorCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9rZXkoMyk6CisJY2FzZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2tleSg0KToKIAkJaWYgKCFpc2dldCkKLQkJCXdlcF9jaGFuZ2Vfa2V5KHdsYW5kZXYsIDAsIGtleSwgcHN0ci0+bGVuKTsKLQlicmVhazsKLQl9Ci0JY2FzZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTE6ewotCQlpZiAoIWlzZ2V0KQotCQkJd2VwX2NoYW5nZV9rZXkod2xhbmRldiwgMSwga2V5LCBwc3RyLT5sZW4pOwotCWJyZWFrOwotCX0KLQljYXNlIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5Mjp7Ci0JCWlmICghaXNnZXQpCi0JCQl3ZXBfY2hhbmdlX2tleSh3bGFuZGV2LCAyLCBrZXksIHBzdHItPmxlbik7Ci0JYnJlYWs7Ci0JfQotCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkzOnsKLQkJaWYgKCFpc2dldCkKLQkJCXdlcF9jaGFuZ2Vfa2V5KHdsYW5kZXYsIDMsIGtleSwgcHN0ci0+bGVuKTsKLQlicmVhazsKLQl9CisJCQl3ZXBfY2hhbmdlX2tleSh3bGFuZGV2LAorCQkJCSAgICAgICBQODAyMTFESURfSVRFTShtaWJpdGVtLT5kaWQpIC0gMSwKKwkJCQkgICAgICAga2V5LCBwc3RyLT5sZW4pOworCQlicmVhazsKKwogCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQRGVmYXVsdEtleUlEOnsKLQkJdTMyICpkYXRhID0gKHUzMiAqKSBtaWJpdGVtLT5kYXRhOworCQl1MzIgKmRhdGEgPSAodTMyICopbWliaXRlbS0+ZGF0YTsKIAogCQlpZiAoaXNnZXQpIHsKIAkJCSpkYXRhID0gd2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfREVGQVVMVEtFWV9NQVNLOwpAQCAtMjE3LDMzICsyMjIsMTcgQEAKIAlicmVhazsKIAl9CiAJY2FzZSBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFQcml2YWN5SW52b2tlZDp7Ci0JCXUzMiAqZGF0YSA9ICh1MzIgKikgbWliaXRlbS0+ZGF0YTsKKwkJdTMyICpkYXRhID0gKHUzMiAqKW1pYml0ZW0tPmRhdGE7CiAKLQkJaWYgKGlzZ2V0KSB7Ci0JCQlpZiAod2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfUFJJVkFDWUlOVk9LRUQpCi0JCQkJKmRhdGEgPSBQODAyMTFFTlVNX3RydXRoX3RydWU7Ci0JCQllbHNlCi0JCQkJKmRhdGEgPSBQODAyMTFFTlVNX3RydXRoX2ZhbHNlOwotCQl9IGVsc2UgewotCQkJd2xhbmRldi0+aG9zdHdlcCAmPSB+KEhPU1RXRVBfUFJJVkFDWUlOVk9LRUQpOwotCQkJaWYgKCpkYXRhID09IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSkKLQkJCQl3bGFuZGV2LT5ob3N0d2VwIHw9IEhPU1RXRVBfUFJJVkFDWUlOVk9LRUQ7Ci0JCX0KKwkJcDgwMjExcmVxX2hhbmRsZV9hY3Rpb24od2xhbmRldiwgZGF0YSwgaXNnZXQsCisJCQkJCUhPU1RXRVBfUFJJVkFDWUlOVk9LRUQpOwogCWJyZWFrOwogCX0KIAljYXNlIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMUV4Y2x1ZGVVbmVuY3J5cHRlZDp7Ci0JCXUzMiAqZGF0YSA9ICh1MzIgKikgbWliaXRlbS0+ZGF0YTsKKwkJdTMyICpkYXRhID0gKHUzMiAqKW1pYml0ZW0tPmRhdGE7CiAKLQkJaWYgKGlzZ2V0KSB7Ci0JCQlpZiAod2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfRVhDTFVERVVORU5DUllQVEVEKQotCQkJCSpkYXRhID0gUDgwMjExRU5VTV90cnV0aF90cnVlOwotCQkJZWxzZQotCQkJCSpkYXRhID0gUDgwMjExRU5VTV90cnV0aF9mYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXdsYW5kZXYtPmhvc3R3ZXAgJj0gfihIT1NUV0VQX0VYQ0xVREVVTkVOQ1JZUFRFRCk7Ci0JCQlpZiAoKmRhdGEgPT0gUDgwMjExRU5VTV90cnV0aF90cnVlKQotCQkJCXdsYW5kZXYtPmhvc3R3ZXAgfD0gSE9TVFdFUF9FWENMVURFVU5FTkNSWVBURUQ7Ci0JCX0KKwkJcDgwMjExcmVxX2hhbmRsZV9hY3Rpb24od2xhbmRldiwgZGF0YSwgaXNnZXQsCisJCQkJCUhPU1RXRVBfRVhDTFVERVVORU5DUllQVEVEKTsKIAlicmVhazsKIAl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuaAppbmRleCBhOTVhNDVhLi44ZDMwNTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuaApAQCAtNDgsNiArNDgsNiBAQAogI2lmbmRlZiBfTElOVVhfUDgwMjExUkVRX0gKICNkZWZpbmUgX0xJTlVYX1A4MDIxMVJFUV9ICiAKLWludCBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTggKm1zZ2J1Zik7CitpbnQgcDgwMjExcmVxX2RvcmVxdWVzdChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTggKm1zZ2J1Zik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXR5cGVzLmgKaW5kZXggOGNiNGZjNi4uMjYzZWYyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExdHlwZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF0eXBlcy5oCkBAIC0xLDU4ICsxLDU5IEBACi0vKiBwODAyMTF0eXBlcy5oCi0qCi0qIE1hY3JvcywgY29uc3RhbnRzLCB0eXBlcywgYW5kIGZ1bmNzIGZvciBwODAyMTEgZGF0YSB0eXBlcwotKgotKiBDb3B5cmlnaHQgKEMpIDE5OTkgQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBsaW51eC13bGFuCi0qCi0qICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKLSogICBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwotKgotKiAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUwotKiAgIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCi0qICAgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluIHdoaWNoCi0qICAgY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCi0qICAgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKLSogICBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQotKiAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbgotKiAgIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCi0qICAgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlCi0qICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMKLSogICBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIElucXVpcmllcyByZWdhcmRpbmcgdGhlIGxpbnV4LXdsYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBjYW4gYmUKLSogbWFkZSBkaXJlY3RseSB0bzoKLSoKLSogQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zIEluYy4KLSogaW5mb0BsaW51eC13bGFuLmNvbQotKiBodHRwOi8vd3d3LmxpbnV4LXdsYW4uY29tCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIFBvcnRpb25zIG9mIHRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgZnVuZGVkIGJ5Ci0qIEludGVyc2lsIENvcnBvcmF0aW9uIGFzIHBhcnQgb2YgUFJJU00oUikgY2hpcHNldCBwcm9kdWN0IGRldmVsb3BtZW50LgotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBUaGlzIGZpbGUgZGVjbGFyZXMgc29tZSBvZiB0aGUgY29uc3RhbnRzIGFuZCB0eXBlcyB1c2VkIGluIHZhcmlvdXMKLSogcGFydHMgb2YgdGhlIGxpbnV4LXdsYW4gc3lzdGVtLgotKgotKiBOb3RlczoKLSogICAtIENvbnN0YW50IHZhbHVlcyBhcmUgYWx3YXlzIGluIEhPU1QgYnl0ZSBvcmRlci4KLSoKLSogQWxsIGZ1bmN0aW9ucyBhbmQgc3RhdGljcyBkZWNsYXJlZCBoZXJlIGFyZSBpbXBsZW1lbnRlZCBpbiBwODAyMTF0eXBlcy5jCi0qICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCisvKgorICogcDgwMjExdHlwZXMuaAorICoKKyAqIE1hY3JvcywgY29uc3RhbnRzLCB0eXBlcywgYW5kIGZ1bmNzIGZvciBwODAyMTEgZGF0YSB0eXBlcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGxpbnV4LXdsYW4KKyAqCisgKiAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljCisgKiAgIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKyAqCisgKiAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUworICogICBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgKiAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworICogICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqICAgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluIHdoaWNoCisgKiAgIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQorICogICBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICogICBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQorICogICB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24KKyAqICAgYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKKyAqICAgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlCisgKiAgIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzCisgKiAgIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIElucXVpcmllcyByZWdhcmRpbmcgdGhlIGxpbnV4LXdsYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBjYW4gYmUKKyAqIG1hZGUgZGlyZWN0bHkgdG86CisgKgorICogQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zIEluYy4KKyAqIGluZm9AbGludXgtd2xhbi5jb20KKyAqIGh0dHA6Ly93d3cubGludXgtd2xhbi5jb20KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFBvcnRpb25zIG9mIHRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgZnVuZGVkIGJ5CisgKiBJbnRlcnNpbCBDb3Jwb3JhdGlvbiBhcyBwYXJ0IG9mIFBSSVNNKFIpIGNoaXBzZXQgcHJvZHVjdCBkZXZlbG9wbWVudC4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgZmlsZSBkZWNsYXJlcyBzb21lIG9mIHRoZSBjb25zdGFudHMgYW5kIHR5cGVzIHVzZWQgaW4gdmFyaW91cworICogcGFydHMgb2YgdGhlIGxpbnV4LXdsYW4gc3lzdGVtLgorICoKKyAqIE5vdGVzOgorICogICAtIENvbnN0YW50IHZhbHVlcyBhcmUgYWx3YXlzIGluIEhPU1QgYnl0ZSBvcmRlci4KKyAqCisgKiBBbGwgZnVuY3Rpb25zIGFuZCBzdGF0aWNzIGRlY2xhcmVkIGhlcmUgYXJlIGltcGxlbWVudGVkIGluIHA4MDIxMXR5cGVzLmMKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCiAjaWZuZGVmIF9QODAyMTFUWVBFU19ICiAjZGVmaW5lIF9QODAyMTFUWVBFU19ICkBAIC0xMjMsMTggKzEyNCwxOCBAQAogI2RlZmluZSBNS0VOVU1OQU1FKG5hbWUpIHA4MDIxMWVudW1fICMjIG5hbWUKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFuZCBtYWNyb3MgYXJlIHVzZWQgdG8gY29uc3RydWN0IGFuZAotKiBkZWNvbnN0cnVjdCB0aGUgRGF0YSBJRCBjb2Rlcy4gIFRoZSBjb2RpbmcgaXMgYXMgZm9sbG93czoKLSoKLSogICAgIC4uLnJ3dG5ubm5ubm5uaWlpaWlpZ2dnZ2dnc3Nzc3NzICAgICAgcyAtIFNlY3Rpb24KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyAtIEdyb3VwCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgLSBJdGVtCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gLSBJbmRleAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0IC0gVGFibGUgZmxhZwotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3IC0gV3JpdGUgZmxhZwotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIC0gUmVhZCBmbGFnCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gLSBVbnVzZWQKLSovCisgKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhbmQgbWFjcm9zIGFyZSB1c2VkIHRvIGNvbnN0cnVjdCBhbmQKKyAqIGRlY29uc3RydWN0IHRoZSBEYXRhIElEIGNvZGVzLiAgVGhlIGNvZGluZyBpcyBhcyBmb2xsb3dzOgorICoKKyAqICAgICAuLi5yd3Rubm5ubm5ubmlpaWlpaWdnZ2dnZ3Nzc3NzcyAgICAgIHMgLSBTZWN0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnIC0gR3JvdXAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgLSBJdGVtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuIC0gSW5kZXgKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgLSBUYWJsZSBmbGFnCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3IC0gV3JpdGUgZmxhZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAtIFJlYWQgZmxhZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAtIFVudXNlZAorICovCiAKICNkZWZpbmUgUDgwMjExRElEX0xTQl9TRUNUSU9OCQkoMCkKICNkZWZpbmUgUDgwMjExRElEX0xTQl9HUk9VUAkJKDYpCkBAIC0yMDAsMTM4ICsyMDEsMTM4IEBACiAvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSB0eXBlcyBhcmUgdXNlZCBmb3IgdGhlIHJlcHJlc2VudGF0aW9uICovCiAvKiAgb2YgRU5VTWludCB0eXBlIG1ldGFkYXRhLiAqLwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFlbnVtcGFpciB7CitzdHJ1Y3QgcDgwMjExZW51bXBhaXIgewogCXUzMiB2YWw7CiAJY2hhciAqbmFtZTsKLX0gcDgwMjExZW51bXBhaXJfdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMWVudW0geworc3RydWN0IHA4MDIxMWVudW0gewogCWludCBuaXRlbXM7Ci0JcDgwMjExZW51bXBhaXJfdCAqbGlzdDsKLX0gcDgwMjExZW51bV90OworCXN0cnVjdCBwODAyMTFlbnVtcGFpciAqbGlzdDsKK307CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSB0eXBlcyBhcmUgdXNlZCB0byBzdG9yZSBkYXRhIGl0ZW1zIGluICovCiAvKiAgbWVzc2FnZXMuICovCiAKIC8qIFRlbXBsYXRlIHBhc2NhbCBzdHJpbmcgKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMXBzdHIgeworc3RydWN0IHA4MDIxMXBzdHIgewogCXU4IGxlbjsKLX0gX19wYWNrZWQgcDgwMjExcHN0cl90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExcHN0cmQgeworc3RydWN0IHA4MDIxMXBzdHJkIHsKIAl1OCBsZW47CiAJdTggZGF0YVswXTsKLX0gX19wYWNrZWQgcDgwMjExcHN0cmRfdDsKK30gX19wYWNrZWQ7CiAKIC8qIE1heGltdW0gcGFzY2FsIHN0cmluZyAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExcHN0cjI1NSB7CitzdHJ1Y3QgcDgwMjExcHN0cjI1NSB7CiAJdTggbGVuOwogCXU4IGRhdGFbTUFYTEVOX1BTVFIyNTVdOwotfSBfX3BhY2tlZCBwODAyMTFwc3RyMjU1X3Q7Cit9IF9fcGFja2VkOwogCiAvKiBwYXNjYWwgc3RyaW5nIGZvciBtYWNhZGRyZXNzIGFuZCBic3NpZCAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExcHN0cjYgeworc3RydWN0IHA4MDIxMXBzdHI2IHsKIAl1OCBsZW47CiAJdTggZGF0YVtNQVhMRU5fUFNUUjZdOwotfSBfX3BhY2tlZCBwODAyMTFwc3RyNl90OworfSBfX3BhY2tlZDsKIAogLyogcGFzY2FsIHN0cmluZyBmb3IgY2hhbm5lbCBsaXN0ICovCi10eXBlZGVmIHN0cnVjdCBwODAyMTFwc3RyMTQgeworc3RydWN0IHA4MDIxMXBzdHIxNCB7CiAJdTggbGVuOwogCXU4IGRhdGFbTUFYTEVOX1BTVFIxNF07Ci19IF9fcGFja2VkIHA4MDIxMXBzdHIxNF90OworfSBfX3BhY2tlZDsKIAogLyogcGFzY2FsIHN0cmluZyBmb3Igc3NpZCAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExcHN0cjMyIHsKK3N0cnVjdCBwODAyMTFwc3RyMzIgewogCXU4IGxlbjsKIAl1OCBkYXRhW01BWExFTl9QU1RSMzJdOwotfSBfX3BhY2tlZCBwODAyMTFwc3RyMzJfdDsKK30gX19wYWNrZWQ7CiAKIC8qIE1BQyBhZGRyZXNzIGFycmF5ICovCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtYWNhcnJheSB7CitzdHJ1Y3QgcDgwMjExbWFjYXJyYXkgewogCXUzMiBjbnQ7CiAJdTggZGF0YVsxXVtNQVhMRU5fUFNUUjZdOwotfSBfX3BhY2tlZCBwODAyMTFtYWNhcnJheV90OworfSBfX3BhY2tlZDsKIAogLyogcHJvdG90eXBlIHRlbXBsYXRlICovCi10eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtIHsKK3N0cnVjdCBwODAyMTFpdGVtIHsKIAl1MzIgZGlkOwogCXUxNiBzdGF0dXM7CiAJdTE2IGxlbjsKLX0gX19wYWNrZWQgcDgwMjExaXRlbV90OworfSBfX3BhY2tlZDsKIAogLyogcHJvdG90eXBlIHRlbXBsYXRlIHcvIGRhdGEgaXRlbSAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbWQgeworc3RydWN0IHA4MDIxMWl0ZW1kIHsKIAl1MzIgZGlkOwogCXUxNiBzdGF0dXM7CiAJdTE2IGxlbjsKIAl1OCBkYXRhWzBdOwotfSBfX3BhY2tlZCBwODAyMTFpdGVtZF90OworfSBfX3BhY2tlZDsKIAogLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIGludCwgQk9VTkRFRElOVCwgRU5VTUlOVCAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgeworc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHsKIAl1MzIgZGlkOwogCXUxNiBzdGF0dXM7CiAJdTE2IGxlbjsKIAl1MzIgZGF0YTsKLX0gX19wYWNrZWQgcDgwMjExaXRlbV91aW50MzJfdDsKK30gX19wYWNrZWQ7CiAKIC8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBPQ1RFVFNUUiwgRElTUExBWVNUUiAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyNiB7CitzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyNiB7CiAJdTMyIGRpZDsKIAl1MTYgc3RhdHVzOwogCXUxNiBsZW47Ci0JcDgwMjExcHN0cjZfdCBkYXRhOwotfSBfX3BhY2tlZCBwODAyMTFpdGVtX3BzdHI2X3Q7CisJc3RydWN0IHA4MDIxMXBzdHI2IGRhdGE7Cit9IF9fcGFja2VkOwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgT0NURVRTVFIsIERJU1BMQVlTVFIgKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjE0IHsKK3N0cnVjdCBwODAyMTFpdGVtX3BzdHIxNCB7CiAJdTMyIGRpZDsKIAl1MTYgc3RhdHVzOwogCXUxNiBsZW47Ci0JcDgwMjExcHN0cjE0X3QgZGF0YTsKLX0gX19wYWNrZWQgcDgwMjExaXRlbV9wc3RyMTRfdDsKKwlzdHJ1Y3QgcDgwMjExcHN0cjE0IGRhdGE7Cit9IF9fcGFja2VkOwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgT0NURVRTVFIsIERJU1BMQVlTVFIgKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjMyIHsKK3N0cnVjdCBwODAyMTFpdGVtX3BzdHIzMiB7CiAJdTMyIGRpZDsKIAl1MTYgc3RhdHVzOwogCXUxNiBsZW47Ci0JcDgwMjExcHN0cjMyX3QgZGF0YTsKLX0gX19wYWNrZWQgcDgwMjExaXRlbV9wc3RyMzJfdDsKKwlzdHJ1Y3QgcDgwMjExcHN0cjMyIGRhdGE7Cit9IF9fcGFja2VkOwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgT0NURVRTVFIsIERJU1BMQVlTVFIgKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjI1NSB7CitzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyMjU1IHsKIAl1MzIgZGlkOwogCXUxNiBzdGF0dXM7CiAJdTE2IGxlbjsKLQlwODAyMTFwc3RyMjU1X3QgZGF0YTsKLX0gX19wYWNrZWQgcDgwMjExaXRlbV9wc3RyMjU1X3Q7CisJc3RydWN0IHA4MDIxMXBzdHIyNTUgZGF0YTsKK30gX19wYWNrZWQ7CiAKIC8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBVTksgMzkyLCBuYW1lbHkgbWliIGl0ZW1zICovCi10eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtX3VuazM5MiB7CitzdHJ1Y3QgcDgwMjExaXRlbV91bmszOTIgewogCXUzMiBkaWQ7CiAJdTE2IHN0YXR1czsKIAl1MTYgbGVuOwogCXU4IGRhdGFbTUFYTEVOX01JQkFUVFJJQlVURV07Ci19IF9fcGFja2VkIHA4MDIxMWl0ZW1fdW5rMzkyX3Q7Cit9IF9fcGFja2VkOwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgVU5LIDEwMjUsIG5hbWVseSBwMiBwZGFzICovCi10eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtX3VuazEwMjQgeworc3RydWN0IHA4MDIxMWl0ZW1fdW5rMTAyNCB7CiAJdTMyIGRpZDsKIAl1MTYgc3RhdHVzOwogCXUxNiBsZW47CiAJdTggZGF0YVsxMDI0XTsKLX0gX19wYWNrZWQgcDgwMjExaXRlbV91bmsxMDI0X3Q7Cit9IF9fcGFja2VkOwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgVU5LIDQwOTYsIG5hbWVseSBwMiBkb3dubG9hZCBjaHVua3MgKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1fdW5rNDA5NiB7CitzdHJ1Y3QgcDgwMjExaXRlbV91bms0MDk2IHsKIAl1MzIgZGlkOwogCXUxNiBzdGF0dXM7CiAJdTE2IGxlbjsKIAl1OCBkYXRhWzQwOTZdOwotfSBfX3BhY2tlZCBwODAyMTFpdGVtX3VuazQwOTZfdDsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjYXRsaXN0aXRlbTsKIApAQCAtMzUxLDI1ICszNTIsMjUgQEAKIC8qICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgZXh0ZXJuYWwgZGVjbGFyYXRpb25zICovCiAvKiAgZm9yIGFsbCBlbnVtZXJhdGlvbnMgICovCiAKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRSh0cnV0aCk7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUoaWZzdGF0ZSk7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUocG93ZXJtZ210KTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShic3N0eXBlKTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShhdXRoYWxnKTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShwaHl0eXBlKTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRSh0ZW1wdHlwZSk7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUocmVnZG9tYWluKTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShjY2Ftb2RlKTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShkaXZlcnNpdHkpOwotZXh0ZXJuIHA4MDIxMWVudW1fdCBNS0VOVU1OQU1FKHNjYW50eXBlKTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShyZXN1bHRjb2RlKTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShyZWFzb24pOwotZXh0ZXJuIHA4MDIxMWVudW1fdCBNS0VOVU1OQU1FKHN0YXR1cyk7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUobXNnY29kZSk7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUobXNnaXRlbV9zdGF0dXMpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUodHJ1dGgpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUoaWZzdGF0ZSk7CitleHRlcm4gc3RydWN0IHA4MDIxMWVudW0gTUtFTlVNTkFNRShwb3dlcm1nbXQpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUoYnNzdHlwZSk7CitleHRlcm4gc3RydWN0IHA4MDIxMWVudW0gTUtFTlVNTkFNRShhdXRoYWxnKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKHBoeXR5cGUpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUodGVtcHR5cGUpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUocmVnZG9tYWluKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKGNjYW1vZGUpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUoZGl2ZXJzaXR5KTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKHNjYW50eXBlKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKHJlc3VsdGNvZGUpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUocmVhc29uKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKHN0YXR1cyk7CitleHRlcm4gc3RydWN0IHA4MDIxMWVudW0gTUtFTlVNTkFNRShtc2djb2RlKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKG1zZ2l0ZW1fc3RhdHVzKTsKIAotZXh0ZXJuIHA4MDIxMWVudW1fdCBNS0VOVU1OQU1FKGxueHJvYW1fcmVhc29uKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKGxueHJvYW1fcmVhc29uKTsKIAotZXh0ZXJuIHA4MDIxMWVudW1fdCBNS0VOVU1OQU1FKHAycHJlYW1ibGUpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUocDJwcmVhbWJsZSk7CiAKICNlbmRpZiAvKiBfUDgwMjExVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF3ZXAuYwppbmRleCAyMmM3OTcwLi4yM2IxODM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF3ZXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF3ZXAuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAKIC8qIGtleWxlbiBpbiBieXRlcyEgKi8KIAotaW50IHdlcF9jaGFuZ2Vfa2V5KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaW50IGtleW51bSwgdTggKmtleSwgaW50IGtleWxlbikKK2ludCB3ZXBfY2hhbmdlX2tleShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgaW50IGtleW51bSwgdTggKmtleSwgaW50IGtleWxlbikKIHsKIAlpZiAoa2V5bGVuIDwgMCkKIAkJcmV0dXJuIC0xOwpAQCAtMTQzLDcgKzE0Myw3IEBACiAgKiA0LWJ5dGUgSVYgYXQgc3RhcnQgb2YgYnVmZmVyLCA0LWJ5dGUgSUNWIGF0IGVuZCBvZiBidWZmZXIuCiAgKiBpZiBzdWNjZXNzZnVsLCBidWYgc3RhcnQgaXMgcGF5bG9hZCBiZWdpbiwgbGVuZ3RoIC09IDg7CiAgKi8KLWludCB3ZXBfZGVjcnlwdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4ICpidWYsIHUzMiBsZW4sIGludCBrZXlfb3ZlcnJpZGUsCitpbnQgd2VwX2RlY3J5cHQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHU4ICpidWYsIHUzMiBsZW4sIGludCBrZXlfb3ZlcnJpZGUsCiAJCXU4ICppdiwgdTggKmljdikKIHsKIAl1MzIgaSwgaiwgaywgY3JjLCBrZXlsZW47CkBAIC0yMTcsNyArMjE3LDcgQEAKIH0KIAogLyogZW5jcnlwdHMgaW4tcGxhY2UuICovCi1pbnQgd2VwX2VuY3J5cHQod2xhbmRldmljZV90ICp3bGFuZGV2LCB1OCAqYnVmLCB1OCAqZHN0LCB1MzIgbGVuLCBpbnQga2V5bnVtLAoraW50IHdlcF9lbmNyeXB0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1OCAqYnVmLCB1OCAqZHN0LCB1MzIgbGVuLCBpbnQga2V5bnVtLAogCQl1OCAqaXYsIHU4ICppY3YpCiB7CiAJdTMyIGksIGosIGssIGNyYywga2V5bGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yZncuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMmZ3LmMKaW5kZXggNTZiZmZkOS4uOTZhYTIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yZncuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJmdy5jCkBAIC05NiwxNiArOTYsMTYgQEAKIAl1MTYgbGVuOwogCXUxNiB0eXBlOwogCXVuaW9uIHsKLQkJaGZhMzg0eF9jb21waWRlbnRfdCB2ZXJzaW9uOwotCQloZmEzODR4X2NhcGxldmVsX3QgY29tcGF0OworCQlzdHJ1Y3QgaGZhMzg0eF9jb21waWRlbnQgdmVyc2lvbjsKKwkJc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgY29tcGF0OwogCQl1MTYgYnVpbGRzZXE7Ci0JCWhmYTM4NHhfY29tcGlkZW50X3QgcGxhdGZvcm07CisJCXN0cnVjdCBoZmEzODR4X2NvbXBpZGVudCBwbGF0Zm9ybTsKIAl9IGluZm87CiB9OwogCiBzdHJ1Y3QgcGRhIHsKIAl1OCBidWZbSEZBMzg0eF9QREFfTEVOX01BWF07Ci0JaGZhMzg0eF9wZHJlY190ICpyZWNbSEZBMzg0eF9QREFfUkVDU19NQVhdOworCXN0cnVjdCBoZmEzODR4X3BkcmVjICpyZWNbSEZBMzg0eF9QREFfUkVDU19NQVhdOwogCXVuc2lnbmVkIGludCBucmVjOwogfTsKIApAQCAtMTUyLDIyICsxNTIsMjIgQEAKIC8qIFBEQSwgYnVpbHQgZnJvbSBbY2FyZHxuZXdmaWxlXStbYWRkZmlsZTErYWRkZmlsZTIuLi5dICovCiAKIHN0YXRpYyBzdHJ1Y3QgcGRhIHBkYTsKLXN0YXRpYyBoZmEzODR4X2NvbXBpZGVudF90IG5pY2lkOwotc3RhdGljIGhmYTM4NHhfY2FwbGV2ZWxfdCByZmlkOwotc3RhdGljIGhmYTM4NHhfY2FwbGV2ZWxfdCBtYWNpZDsKLXN0YXRpYyBoZmEzODR4X2NhcGxldmVsX3QgcHJpaWQ7CitzdGF0aWMgc3RydWN0IGhmYTM4NHhfY29tcGlkZW50IG5pY2lkOworc3RhdGljIHN0cnVjdCBoZmEzODR4X2NhcGxldmVsIHJmaWQ7CitzdGF0aWMgc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgbWFjaWQ7CitzdGF0aWMgc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgcHJpaWQ7CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBMb2NhbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKi8KIAogc3RhdGljIGludCBwcmlzbTJfZndhcHBseShjb25zdCBzdHJ1Y3QgaWhleF9iaW5yZWMgKnJmcHRyLAotd2xhbmRldmljZV90ICp3bGFuZGV2KTsKK3N0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKIAogc3RhdGljIGludCByZWFkX2Z3ZmlsZShjb25zdCBzdHJ1Y3QgaWhleF9iaW5yZWMgKnJmcHRyKTsKIAogc3RhdGljIGludCBta2ltYWdlKHN0cnVjdCBpbWdjaHVuayAqY2xpc3QsIHVuc2lnbmVkIGludCAqY2NudCk7CiAKLXN0YXRpYyBpbnQgcmVhZF9jYXJkcGRhKHN0cnVjdCBwZGEgKnBkYSwgd2xhbmRldmljZV90ICp3bGFuZGV2KTsKK3N0YXRpYyBpbnQgcmVhZF9jYXJkcGRhKHN0cnVjdCBwZGEgKnBkYSwgc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOwogCiBzdGF0aWMgaW50IG1rcGRybGlzdChzdHJ1Y3QgcGRhICpwZGEpOwogCkBAIC0xNzcsNyArMTc3LDcgQEAKIHN0YXRpYyBpbnQgY3JjaW1hZ2Uoc3RydWN0IGltZ2NodW5rICpmY2h1bmssIHVuc2lnbmVkIGludCBuZmNodW5rcywKIAkgICAgIHN0cnVjdCBzM2NyY3JlYyAqczNjcmMsIHVuc2lnbmVkIGludCBuczNjcmMpOwogCi1zdGF0aWMgaW50IHdyaXRlaW1hZ2Uod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3QgaW1nY2h1bmsgKmZjaHVuaywKK3N0YXRpYyBpbnQgd3JpdGVpbWFnZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IGltZ2NodW5rICpmY2h1bmssCiAJICAgICAgIHVuc2lnbmVkIGludCBuZmNodW5rcyk7CiBzdGF0aWMgdm9pZCBmcmVlX2NodW5rcyhzdHJ1Y3QgaW1nY2h1bmsgKmZjaHVuaywgdW5zaWduZWQgaW50ICpuZmNodW5rcyk7CiAKQEAgLTIwMSw3ICsyMDEsNyBAQAogKgkwCS0gc3VjY2VzcwogKgl+MAktIGZhaWx1cmUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBwcmlzbTJfZnd0cnkoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3N0YXRpYyBpbnQgcHJpc20yX2Z3dHJ5KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldikKIHsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5ID0gTlVMTDsKIApAQCAtMjM5LDExICsyMzksMTEgQEAKICoJfjAJLSBmYWlsdXJlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyBpbnQgcHJpc20yX2Z3YXBwbHkoY29uc3Qgc3RydWN0IGloZXhfYmlucmVjICpyZnB0ciwKLQkJCSAgd2xhbmRldmljZV90ICp3bGFuZGV2KQorCQkJICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldikKIHsKIAlzaWduZWQgaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJnZXQgZ2V0bXNnOwotCXA4MDIxMWl0ZW1kX3QgKml0ZW07CisJc3RydWN0IHA4MDIxMWl0ZW1kICppdGVtOwogCXUzMiAqZGF0YTsKIAogCS8qIEluaXRpYWxpemUgdGhlIGRhdGEgc3RydWN0dXJlcyAqLwpAQCAtMjY2LDcgKzI2Niw3IEBACiAKIAkvKiBjbGVhciB0aGUgcGRhIGFuZCBhZGQgYW4gaW5pdGlhbCBFTkQgcmVjb3JkICovCiAJbWVtc2V0KCZwZGEsIDAsIHNpemVvZihwZGEpKTsKLQlwZGEucmVjWzBdID0gKGhmYTM4NHhfcGRyZWNfdCAqKSBwZGEuYnVmOworCXBkYS5yZWNbMF0gPSAoc3RydWN0IGhmYTM4NHhfcGRyZWMgKilwZGEuYnVmOwogCXBkYS5yZWNbMF0tPmxlbiA9IGNwdV90b19sZTE2KDIpOwkvKiBsZW4gaW4gd29yZHMgKi8KIAlwZGEucmVjWzBdLT5jb2RlID0gY3B1X3RvX2xlMTYoSEZBMzg0eF9QRFJfRU5EX09GX1BEQSk7CiAJcGRhLm5yZWMgPSAxOwpAQCAtMjkzLDExICsyOTMsMTEgQEAKIAlnZXRtc2cucmVzdWx0Y29kZS5kaWQgPSBESURtc2dfZG90MTFyZXFfbWliZ2V0X3Jlc3VsdGNvZGU7CiAJZ2V0bXNnLnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZTsKIAotCWl0ZW0gPSAocDgwMjExaXRlbWRfdCAqKSBnZXRtc2cubWliYXR0cmlidXRlLmRhdGE7CisJaXRlbSA9IChzdHJ1Y3QgcDgwMjExaXRlbWQgKilnZXRtc2cubWliYXR0cmlidXRlLmRhdGE7CiAJaXRlbS0+ZGlkID0gRElEbWliX3AyX3AyTklDX3AyUFJJU3VwUmFuZ2U7CiAJaXRlbS0+c3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZTsKIAotCWRhdGEgPSAodTMyICopIGl0ZW0tPmRhdGE7CisJZGF0YSA9ICh1MzIgKilpdGVtLT5kYXRhOwogCiAJLyogRElEbXNnX2RvdDExcmVxX21pYmdldCAqLwogCXByaXNtMm1nbXRfbWlic2V0X21pYmdldCh3bGFuZGV2LCAmZ2V0bXNnKTsKQEAgLTU5MiwxNCArNTkyLDE0IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyBpbnQgbWtwZHJsaXN0KHN0cnVjdCBwZGEgKnBkYSkKIHsKLQl1MTYgKnBkYTE2ID0gKHUxNiAqKSBwZGEtPmJ1ZjsKKwl1MTYgKnBkYTE2ID0gKHUxNiAqKXBkYS0+YnVmOwogCWludCBjdXJyb2ZmOwkJLyogaW4gJ3dvcmRzJyAqLwogCiAJcGRhLT5ucmVjID0gMDsKIAljdXJyb2ZmID0gMDsKIAl3aGlsZSAoY3Vycm9mZiA8IChIRkEzODR4X1BEQV9MRU5fTUFYIC8gMiAtIDEpICYmCiAJICAgICAgIGxlMTZfdG9fY3B1KHBkYTE2W2N1cnJvZmYgKyAxXSkgIT0gSEZBMzg0eF9QRFJfRU5EX09GX1BEQSkgewotCQlwZGEtPnJlY1twZGEtPm5yZWNdID0gKGhmYTM4NHhfcGRyZWNfdCAqKSAmKHBkYTE2W2N1cnJvZmZdKTsKKwkJcGRhLT5yZWNbcGRhLT5ucmVjXSA9IChzdHJ1Y3QgaGZhMzg0eF9wZHJlYyAqKSYocGRhMTZbY3Vycm9mZl0pOwogCiAJCWlmIChsZTE2X3RvX2NwdShwZGEtPnJlY1twZGEtPm5yZWNdLT5jb2RlKSA9PQogCQkgICAgSEZBMzg0eF9QRFJfTklDSUQpIHsKQEAgLTYzOCw3ICs2MzgsNyBAQAogCQkgICAgICAgY3Vycm9mZiwgcGRhLT5ucmVjKTsKIAkJcmV0dXJuIDE7CiAJfQotCXBkYS0+cmVjW3BkYS0+bnJlY10gPSAoaGZhMzg0eF9wZHJlY190ICopICYocGRhMTZbY3Vycm9mZl0pOworCXBkYS0+cmVjW3BkYS0+bnJlY10gPSAoc3RydWN0IGhmYTM4NHhfcGRyZWMgKikmKHBkYTE2W2N1cnJvZmZdKTsKIAkocGRhLT5ucmVjKSsrOwogCXJldHVybiAwOwogfQpAQCAtNzY2LDcgKzc2Niw3IEBACiAqCTAJLSBzdWNjZXNzCiAqCX4wCS0gZmFpbHVyZSAocHJvYmFibHkgYW4gZXJybm8pCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgcmVhZF9jYXJkcGRhKHN0cnVjdCBwZGEgKnBkYSwgd2xhbmRldmljZV90ICp3bGFuZGV2KQorc3RhdGljIGludCByZWFkX2NhcmRwZGEoc3RydWN0IHBkYSAqcGRhLCBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JlYWRwZGEgKm1zZzsKQEAgLTg3OSw4ICs4NzksOCBAQAogCQlhZGRyID0gYmUzMl90b19jcHUocmVjb3JkLT5hZGRyKTsKIAogCQkvKiBQb2ludCBpbnRvIGRhdGEgZm9yIGRpZmZlcmVudCB3b3JkIGxlbmd0aHMgKi8KLQkJcHRyMzIgPSAodTMyICopIHJlY29yZC0+ZGF0YTsKLQkJcHRyMTYgPSAodTE2ICopIHJlY29yZC0+ZGF0YTsKKwkJcHRyMzIgPSAodTMyICopcmVjb3JkLT5kYXRhOworCQlwdHIxNiA9ICh1MTYgKilyZWNvcmQtPmRhdGE7CiAKIAkJLyogcGFyc2Ugd2hhdCB3YXMgYW4gUzMgc3JlYyBhbmQgcHV0IGl0IGluIHRoZSByaWdodCBhcnJheSAqLwogCQlzd2l0Y2ggKGFkZHIpIHsKQEAgLTk1NCw3ICs5NTQsNyBAQAogCQlkZWZhdWx0OgkvKiBEYXRhIHJlY29yZCAqLwogCQkJczNkYXRhW25zM2RhdGFdLmFkZHIgPSBhZGRyOwogCQkJczNkYXRhW25zM2RhdGFdLmxlbiA9IGxlbjsKLQkJCXMzZGF0YVtuczNkYXRhXS5kYXRhID0gKHVpbnQ4X3QgKikgcmVjb3JkLT5kYXRhOworCQkJczNkYXRhW25zM2RhdGFdLmRhdGEgPSAodWludDhfdCAqKXJlY29yZC0+ZGF0YTsKIAkJCW5zM2RhdGErKzsKIAkJCWlmIChuczNkYXRhID09IFMzREFUQV9NQVgpIHsKIAkJCQlwcl9lcnIoIlMzIGRhdGFyZWMgbGltaXQgcmVhY2hlZCAtIGFib3J0aW5nXG4iKTsKQEAgLTk4Miw3ICs5ODIsNyBAQAogKgkwCXN1Y2Nlc3MKICoJfjAJZmFpbHVyZQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHdyaXRlaW1hZ2Uod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3QgaW1nY2h1bmsgKmZjaHVuaywKK3N0YXRpYyBpbnQgd3JpdGVpbWFnZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IGltZ2NodW5rICpmY2h1bmssCiAJICAgICAgIHVuc2lnbmVkIGludCBuZmNodW5rcykKIHsKIAlpbnQgcmVzdWx0ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuYwppbmRleCBkOGVkOWEwLi4xNzBkZTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5jCkBAIC0xMTMsMTYgKzExMywxNiBAQAogKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9zY2FuKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKK2ludCBwcmlzbTJtZ210X3NjYW4oc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3NjYW4gKm1zZyA9IG1zZ3A7CiAJdTE2IHJvYW1pbmdtb2RlLCB3b3JkOwogCWludCBpLCB0aW1lb3V0OwogCWludCBpc3RtcGVuYWJsZSA9IDA7CiAKLQloZmEzODR4X0hvc3RTY2FuUmVxdWVzdF9kYXRhX3Qgc2NhbnJlcTsKKwlzdHJ1Y3QgaGZhMzg0eF9Ib3N0U2NhblJlcXVlc3RfZGF0YSBzY2FucmVxOwogCiAJLyogZ2F0ZWtlZXBlciBjaGVjayAqLwogCWlmIChIRkEzODR4X0ZJUk1XQVJFX1ZFUlNJT04oaHctPmlkZW50X3N0YV9mdy5tYWpvciwKQEAgLTI5Miw3ICsyOTIsNyBAQAogCiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywKIAkJCQkJSEZBMzg0eF9SSURfSE9TVFNDQU4sICZzY2FucmVxLAotCQkJCQlzaXplb2YoaGZhMzg0eF9Ib3N0U2NhblJlcXVlc3RfZGF0YV90KSk7CisJCQkJCXNpemVvZihzdHJ1Y3QgaGZhMzg0eF9Ib3N0U2NhblJlcXVlc3RfZGF0YSkpOwogCWlmIChyZXN1bHQpIHsKIAkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsCiAJCQkgICAic2V0Y29uZmlnKFNDQU5SRVFVRVNUKSBmYWlsZWQuIHJlc3VsdD0lZFxuIiwKQEAgLTM2NiwxMiArMzY2LDEyIEBACiAqCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X3NjYW5fcmVzdWx0cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCitpbnQgcHJpc20ybWdtdF9zY2FuX3Jlc3VsdHMoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuX3Jlc3VsdHMgKnJlcTsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKLQloZmEzODR4X0hTY2FuUmVzdWx0U3ViX3QgKml0ZW0gPSBOVUxMOworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHhfSFNjYW5SZXN1bHRTdWIgKml0ZW0gPSBOVUxMOwogCiAJaW50IGNvdW50OwogCkBAIC01MjUsMTUgKzUyNSwxNSBAQAogKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9zdGFydCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCitpbnQgcHJpc20ybWdtdF9zdGFydChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfc3RhcnQgKm1zZyA9IG1zZ3A7CiAKLQlwODAyMTFwc3RyZF90ICpwc3RyOworCXN0cnVjdCBwODAyMTFwc3RyZCAqcHN0cjsKIAl1OCBieXRlYnVmWzgwXTsKLQlzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICpwMmJ5dGVzdHIgPSAoc3RydWN0IGhmYTM4NHhfYnl0ZXN0ciAqKSBieXRlYnVmOworCXN0cnVjdCBoZmEzODR4X2J5dGVzdHIgKnAyYnl0ZXN0ciA9IChzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICopYnl0ZWJ1ZjsKIAl1MTYgd29yZDsKIAogCXdsYW5kZXYtPm1hY21vZGUgPSBXTEFOX01BQ01PREVfTk9ORTsKQEAgLTU1OCw3ICs1NTgsNyBAQAogCS8qKiogU1RBVElPTiAqKiovCiAJLyogU2V0IHRoZSBSRVFVSVJFRCBjb25maWcgaXRlbXMgKi8KIAkvKiBTU0lEICovCi0JcHN0ciA9IChwODAyMTFwc3RyZF90ICopICYobXNnLT5zc2lkLmRhdGEpOworCXBzdHIgPSAoc3RydWN0IHA4MDIxMXBzdHJkICopJihtc2ctPnNzaWQuZGF0YSk7CiAJcHJpc20ybWdtdF9wc3RyMmJ5dGVzdHIocDJieXRlc3RyLCBwc3RyKTsKIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9DTkZPV05TU0lELAogCQkJCQlieXRlYnVmLCBIRkEzODR4X1JJRF9DTkZPV05TU0lEX0xFTik7CkBAIC02ODUsOSArNjg1LDcgQEAKIAltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbnZhbGlkX3BhcmFtZXRlcnM7CiAKIGRvbmU6Ci0JcmVzdWx0ID0gMDsKLQotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzA4LDkgKzcwNiw5IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9yZWFkcGRhKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKK2ludCBwcmlzbTJtZ210X3JlYWRwZGEoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCiB7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JlYWRwZGEgKm1zZyA9IG1zZ3A7CiAJaW50IHJlc3VsdDsKIApAQCAtNzc0LDkgKzc3Miw5IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9yYW1kbF9zdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCitpbnQgcHJpc20ybWdtdF9yYW1kbF9zdGF0ZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCkKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCXN0cnVjdCBwODAyMTFtc2dfcDJyZXFfcmFtZGxfc3RhdGUgKm1zZyA9IG1zZ3A7CiAKIAlpZiAod2xhbmRldi0+bXNkc3RhdGUgIT0gV0xBTl9NU0RfRldMT0FEKSB7CkBAIC04MjksOSArODI3LDkgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X3JhbWRsX3dyaXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKK2ludCBwcmlzbTJtZ210X3JhbWRsX3dyaXRlKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9yYW1kbF93cml0ZSAqbXNnID0gbXNncDsKIAl1MzIgYWRkcjsKIAl1MzIgbGVuOwpAQCAtODkwLDEwICs4ODgsMTAgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2ZsYXNoZGxfc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQoraW50IHByaXNtMm1nbXRfZmxhc2hkbF9zdGF0ZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCXN0cnVjdCBwODAyMTFtc2dfcDJyZXFfZmxhc2hkbF9zdGF0ZSAqbXNnID0gbXNncDsKIAogCWlmICh3bGFuZGV2LT5tc2RzdGF0ZSAhPSBXTEFOX01TRF9GV0xPQUQpIHsKQEAgLTk2MSw5ICs5NTksOSBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfZmxhc2hkbF93cml0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCitpbnQgcHJpc20ybWdtdF9mbGFzaGRsX3dyaXRlKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9mbGFzaGRsX3dyaXRlICptc2cgPSBtc2dwOwogCXUzMiBhZGRyOwogCXUzMiBsZW47CkBAIC0xMDIxLDE2ICsxMDE5LDE2IEBACiAqCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2F1dG9qb2luKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKK2ludCBwcmlzbTJtZ210X2F1dG9qb2luKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJaW50IHJlc3VsdCA9IDA7CiAJdTE2IHJlZzsKIAl1MTYgcG9ydF90eXBlOwogCXN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2F1dG9qb2luICptc2cgPSBtc2dwOwotCXA4MDIxMXBzdHJkX3QgKnBzdHI7CisJc3RydWN0IHA4MDIxMXBzdHJkICpwc3RyOwogCXU4IGJ5dGVidWZbMjU2XTsKLQlzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICpwMmJ5dGVzdHIgPSAoc3RydWN0IGhmYTM4NHhfYnl0ZXN0ciAqKSBieXRlYnVmOworCXN0cnVjdCBoZmEzODR4X2J5dGVzdHIgKnAyYnl0ZXN0ciA9IChzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICopYnl0ZWJ1ZjsKIAogCXdsYW5kZXYtPm1hY21vZGUgPSBXTEFOX01BQ01PREVfTk9ORTsKIApAQCAtMTA1NCw3ICsxMDUyLDcgQEAKIAogCS8qIFNldCB0aGUgc3NpZCAqLwogCW1lbXNldChieXRlYnVmLCAwLCAyNTYpOwotCXBzdHIgPSAocDgwMjExcHN0cmRfdCAqKSAmKG1zZy0+c3NpZC5kYXRhKTsKKwlwc3RyID0gKHN0cnVjdCBwODAyMTFwc3RyZCAqKSYobXNnLT5zc2lkLmRhdGEpOwogCXByaXNtMm1nbXRfcHN0cjJieXRlc3RyKHAyYnl0ZXN0ciwgcHN0cik7CiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSUQsCiAJCQkJCWJ5dGVidWYsCkBAIC0xMDkyLDEyICsxMDkwLDEyIEBACiAqCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X3dsYW5zbmlmZih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCitpbnQgcHJpc20ybWdtdF93bGFuc25pZmYoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfd2xhbnNuaWZmICptc2cgPSBtc2dwOwogCi0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAl1MTYgd29yZDsKIAogCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmgKaW5kZXggZTY0NzIwMy4uY2MxYWM3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuaApAQCAtNjMsNDMgKzYzLDQ0IEBACiBleHRlcm4gaW50IHByaXNtMl9yZXNldF9ob2xkdGltZTsKIGV4dGVybiBpbnQgcHJpc20yX3Jlc2V0X3NldHRsZXRpbWU7CiAKLXUzMiBwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUzMiBpZnN0YXRlKTsKK3UzMiBwcmlzbTJzdGFfaWZzdGF0ZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTMyIGlmc3RhdGUpOwogCi12b2lkIHByaXNtMnN0YV9ldl9pbmZvKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpOwotdm9pZCBwcmlzbTJzdGFfZXZfdHhleGMod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MTYgc3RhdHVzKTsKLXZvaWQgcHJpc20yc3RhX2V2X3R4KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTE2IHN0YXR1cyk7Ci12b2lkIHByaXNtMnN0YV9ldl9hbGxvYyh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwordm9pZCBwcmlzbTJzdGFfZXZfaW5mbyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZik7Cit2b2lkIHByaXNtMnN0YV9ldl90eGV4YyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTE2IHN0YXR1cyk7Cit2b2lkIHByaXNtMnN0YV9ldl90eChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTE2IHN0YXR1cyk7Cit2b2lkIHByaXNtMnN0YV9ldl9hbGxvYyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7CiAKLWludCBwcmlzbTJtZ210X21pYnNldF9taWJnZXQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3NjYW4od2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3NjYW5fcmVzdWx0cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfc3RhcnQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3dsYW5zbmlmZih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfcmVhZHBkYSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfcmFtZGxfc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3JhbWRsX3dyaXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9mbGFzaGRsX3N0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9mbGFzaGRsX3dyaXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9hdXRvam9pbih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOworaW50IHByaXNtMm1nbXRfbWlic2V0X21pYmdldChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCk7CitpbnQgcHJpc20ybWdtdF9zY2FuKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKTsKK2ludCBwcmlzbTJtZ210X3NjYW5fcmVzdWx0cyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCk7CitpbnQgcHJpc20ybWdtdF9zdGFydChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCk7CitpbnQgcHJpc20ybWdtdF93bGFuc25pZmYoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOworaW50IHByaXNtMm1nbXRfcmVhZHBkYShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCk7CitpbnQgcHJpc20ybWdtdF9yYW1kbF9zdGF0ZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCk7CitpbnQgcHJpc20ybWdtdF9yYW1kbF93cml0ZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCk7CitpbnQgcHJpc20ybWdtdF9mbGFzaGRsX3N0YXRlKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKTsKK2ludCBwcmlzbTJtZ210X2ZsYXNoZGxfd3JpdGUoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOworaW50IHByaXNtMm1nbXRfYXV0b2pvaW4oc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBjb252ZXJzaW9uIGZ1bmN0aW9ucyBnb2luZyBiZXR3ZWVuIHdsYW4gbWVzc2FnZSBkYXRhIHR5cGVzIGFuZAogKiBQcmlzbTIgZGF0YSB0eXBlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIGJ5dGUgYXJlYSBjb252ZXJzaW9uIGZ1bmN0aW9ucyovCi12b2lkIHByaXNtMm1nbXRfYnl0ZWFyZWEycHN0cih1OCAqYnl0ZWFyZWEsIHA4MDIxMXBzdHJkX3QgKnBzdHIsIGludCBsZW4pOwordm9pZCBwcmlzbTJtZ210X2J5dGVhcmVhMnBzdHIodTggKmJ5dGVhcmVhLCBzdHJ1Y3QgcDgwMjExcHN0cmQgKnBzdHIsIGludCBsZW4pOwogCiAvKiBieXRlIHN0cmluZyBjb252ZXJzaW9uIGZ1bmN0aW9ucyovCiB2b2lkIHByaXNtMm1nbXRfcHN0cjJieXRlc3RyKHN0cnVjdCBoZmEzODR4X2J5dGVzdHIgKmJ5dGVzdHIsCi0JCQkgICAgIHA4MDIxMXBzdHJkX3QgKnBzdHIpOworCQkJICAgICBzdHJ1Y3QgcDgwMjExcHN0cmQgKnBzdHIpOwogdm9pZCBwcmlzbTJtZ210X2J5dGVzdHIycHN0cihzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICpieXRlc3RyLAotCQkJICAgICBwODAyMTFwc3RyZF90ICpwc3RyKTsKKwkJCSAgICAgc3RydWN0IHA4MDIxMXBzdHJkICpwc3RyKTsKIAogLyogZnVuY3Rpb25zIHRvIGNvbnZlcnQgR3JvdXAgQWRkcmVzc2VzICovCi12b2lkIHByaXNtMm1nbXRfZ2V0X2dycGFkZHIodTMyIGRpZCwgcDgwMjExcHN0cmRfdCAqcHN0ciwgaGZhMzg0eF90ICpwcml2KTsKK3ZvaWQgcHJpc20ybWdtdF9nZXRfZ3JwYWRkcih1MzIgZGlkLCBzdHJ1Y3QgcDgwMjExcHN0cmQgKnBzdHIsCisJCQkgICAgc3RydWN0IGhmYTM4NHggKnByaXYpOwogaW50IHByaXNtMm1nbXRfc2V0X2dycGFkZHIodTMyIGRpZCwKLQkJCSAgIHU4ICpwcmlzbTJidWYsIHA4MDIxMXBzdHJkX3QgKnBzdHIsCi0JCQkgICBoZmEzODR4X3QgKnByaXYpOworCQkJICAgdTggKnByaXNtMmJ1Ziwgc3RydWN0IHA4MDIxMXBzdHJkICpwc3RyLAorCQkJICAgc3RydWN0IGhmYTM4NHggKnByaXYpOwogaW50IHByaXNtMm1nbXRfZ2V0X2dycGFkZHJfaW5kZXgodTMyIGRpZCk7CiAKIHZvaWQgcHJpc20yc3RhX3Byb2Nlc3NpbmdfZGVmZXIoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKTsKQEAgLTEwOCw4ICsxMDksOCBAQAogdm9pZCBwcmlzbTJzdGFfY29tbXNxdWFsX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKIC8qIEludGVyZmFjZSBjYWxsYmFjayBmdW5jdGlvbnMsIHBhc3NpbmcgZGF0YSBiYWNrIHVwIHRvIHRoZSBjZmc4MDIxMSBsYXllciAqLwotdm9pZCBwcmlzbTJfY29ubmVjdF9yZXN1bHQod2xhbmRldmljZV90ICp3bGFuZGV2LCB1OCBmYWlsZWQpOwotdm9pZCBwcmlzbTJfZGlzY29ubmVjdGVkKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci12b2lkIHByaXNtMl9yb2FtZWQod2xhbmRldmljZV90ICp3bGFuZGV2KTsKK3ZvaWQgcHJpc20yX2Nvbm5lY3RfcmVzdWx0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1OCBmYWlsZWQpOwordm9pZCBwcmlzbTJfZGlzY29ubmVjdGVkKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKK3ZvaWQgcHJpc20yX3JvYW1lZChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWliLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtaWIuYwppbmRleCBmZTkxNGIxLi42M2FiNmJjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWliLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWliLmMKQEAgLTg3LDgwICs4Nyw4MCBAQAogCXUxNiBwYXJtMzsKIAlpbnQgKCpmdW5jKShzdHJ1Y3QgbWlicmVjICptaWIsCiAJCSAgICAgaW50IGlzZ2V0LAotCQkgICAgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJICAgICBoZmEzODR4X3QgKmh3LAorCQkgICAgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkgICAgIHN0cnVjdCBoZmEzODR4ICpodywKIAkJICAgICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLCB2b2lkICpkYXRhKTsKIH07CiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX2J5dGVhcmVhMnBzdHIoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJCSAgIGludCBpc2dldCwKLQkJCQkgICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgaGZhMzg0eF90ICpodywKKwkJCQkgICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICBzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCQkJICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywKIAkJCQkgICB2b2lkICpkYXRhKTsKIAogc3RhdGljIGludCBwcmlzbTJtaWJfdWludDMyKHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCSAgICBpbnQgaXNnZXQsCi0JCQkgICAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJICAgIGhmYTM4NHhfdCAqaHcsCisJCQkgICAgc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkgICAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJICAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csIHZvaWQgKmRhdGEpOwogCiBzdGF0aWMgaW50IHByaXNtMm1pYl9mbGFnKHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCSAgaW50IGlzZ2V0LAotCQkJICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkgIGhmYTM4NHhfdCAqaHcsCisJCQkgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJICBzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCQkgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csIHZvaWQgKmRhdGEpOwogCiBzdGF0aWMgaW50IHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5KHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCQkgICBpbnQgaXNnZXQsCi0JCQkJICAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgIGhmYTM4NHhfdCAqaHcsCisJCQkJICAgc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJCSAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJICAgdm9pZCAqZGF0YSk7CiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX3ByaXZhY3lpbnZva2VkKHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCQkgICAgaW50IGlzZ2V0LAotCQkJCSAgICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgIGhmYTM4NHhfdCAqaHcsCisJCQkJICAgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgICBzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCQkJICAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJICAgIHZvaWQgKmRhdGEpOwogCiBzdGF0aWMgaW50IHByaXNtMm1pYl9leGNsdWRldW5lbmNyeXB0ZWQoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJCQlpbnQgaXNnZXQsCi0JCQkJCXdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkJaGZhMzg0eF90ICpodywKKwkJCQkJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJCXN0cnVjdCBoZmEzODR4ICpodywKIAkJCQkJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywKIAkJCQkJdm9pZCAqZGF0YSk7CiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJCQkgICAgaW50IGlzZ2V0LAotCQkJCQkgICAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCQkgICAgaGZhMzg0eF90ICpodywKKwkJCQkJICAgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCQkgICAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJCQkgICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywKIAkJCQkJICAgIHZvaWQgKmRhdGEpOwogCiBzdGF0aWMgaW50IHByaXNtMm1pYl9wcml2KHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCSAgaW50IGlzZ2V0LAotCQkJICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkgIGhmYTM4NHhfdCAqaHcsCisJCQkgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJICBzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCQkgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csIHZvaWQgKmRhdGEpOwogCiBzdGF0aWMgc3RydWN0IG1pYnJlYyBtaWJ0YWJbXSA9IHsKIAogCS8qIGRvdDExc210IE1JQidzICovCi0Je0RJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MCwKKwl7RElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9rZXkoMSksCiAJIEZfU1RBIHwgRl9XUklURSwKIAkgSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTAsIDAsIDAsCiAJIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5fSwKLQl7RElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkxLAorCXtESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2tleSgyKSwKIAkgRl9TVEEgfCBGX1dSSVRFLAogCSBIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMSwgMCwgMCwKIAkgcHJpc20ybWliX3dlcGRlZmF1bHRrZXl9LAotCXtESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTIsCisJe0RJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfa2V5KDMpLAogCSBGX1NUQSB8IEZfV1JJVEUsCiAJIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkyLCAwLCAwLAogCSBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleX0sCi0Je0RJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MywKKwl7RElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9rZXkoNCksCiAJIEZfU1RBIHwgRl9XUklURSwKIAkgSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTMsIDAsIDAsCiAJIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5fSwKQEAgLTIzNywzNiArMjM3LDM2IEBACiAJezAsIDAsIDAsIDAsIDAsIE5VTEx9CiB9OwogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9taWJzZXRfbWliZ2V0Ci0qCi0qIFNldCB0aGUgdmFsdWUgb2YgYSBtaWIgaXRlbS4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBwcmlzbTJtZ210X21pYnNldF9taWJnZXQKKyAqCisgKiBTZXQgdGhlIHZhbHVlIG9mIGEgbWliIGl0ZW0uCisgKgorICogQXJndW1lbnRzOgorICoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCisgKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgorICoKKyAqIFJldHVybnM6CisgKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKKyAqCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgorICoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCisgKiBTaWRlIGVmZmVjdHM6CisgKgorICogQ2FsbCBjb250ZXh0OgorICoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQorICoJaW50ZXJydXB0CisgKi8KIAotaW50IHByaXNtMm1nbXRfbWlic2V0X21pYmdldCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCitpbnQgcHJpc20ybWdtdF9taWJzZXRfbWliZ2V0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJaW50IHJlc3VsdCwgaXNnZXQ7CiAJc3RydWN0IG1pYnJlYyAqbWliOwogCiAJdTE2IHdoaWNoOwogCiAJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZyA9IG1zZ3A7Ci0JcDgwMjExaXRlbWRfdCAqbWliaXRlbTsKKwlzdHJ1Y3QgcDgwMjExaXRlbWQgKm1pYml0ZW07CiAKIAltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwogCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7CkBAIC0yODQsNyArMjg0LDcgQEAKIAkgKiogTUlCIHRhYmxlLgogCSAqLwogCi0JbWliaXRlbSA9IChwODAyMTFpdGVtZF90ICopIG1zZy0+bWliYXR0cmlidXRlLmRhdGE7CisJbWliaXRlbSA9IChzdHJ1Y3QgcDgwMjExaXRlbWQgKiltc2ctPm1pYmF0dHJpYnV0ZS5kYXRhOwogCiAJZm9yIChtaWIgPSBtaWJ0YWI7IG1pYi0+ZGlkICE9IDA7IG1pYisrKQogCQlpZiAobWliLT5kaWQgPT0gbWliaXRlbS0+ZGlkICYmIChtaWItPmZsYWcgJiB3aGljaCkpCkBAIC0zNDYsNDAgKzM0Niw0MCBAQAogCXJldHVybiAwOwogfQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX2J5dGVhcmVhMnBzdHIKLSoKLSogR2V0L3NldCBwc3RyIGRhdGEgdG8vZnJvbSBhIGJ5dGUgYXJlYS4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgotKiAgICAgICBwYXJtMiAgICBOdW1iZXIgb2YgYnl0ZXMgb2YgUklEIGRhdGEuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyCisgKgorICogR2V0L3NldCBwc3RyIGRhdGEgdG8vZnJvbSBhIGJ5dGUgYXJlYS4KKyAqCisgKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6CisgKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgorICogICAgICAgcGFybTIgICAgTnVtYmVyIG9mIGJ5dGVzIG9mIFJJRCBkYXRhLgorICogICAgICAgcGFybTMgICAgTm90IHVzZWQuCisgKgorICogQXJndW1lbnRzOgorICogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KKyAqICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KKyAqICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KKyAqICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KKyAqICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgorICogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgIDAgICAtIFN1Y2Nlc3MuCisgKiAgICAgICB+MCAgLSBFcnJvci4KKyAqCisgKi8KIAogc3RhdGljIGludCBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0cihzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkJICAgaW50IGlzZ2V0LAotCQkJCSAgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkgICBoZmEzODR4X3QgKmh3LAorCQkJCSAgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgIHN0cnVjdCBoZmEzODR4ICpodywKIAkJCQkgICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLAogCQkJCSAgIHZvaWQgKmRhdGEpCiB7CiAJaW50IHJlc3VsdDsKLQlwODAyMTFwc3RyZF90ICpwc3RyID0gZGF0YTsKKwlzdHJ1Y3QgcDgwMjExcHN0cmQgKnBzdHIgPSBkYXRhOwogCXU4IGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwogCiAJaWYgKGlzZ2V0KSB7CkBAIC0zOTYsNDEgKzM5Niw0MSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfdWludDMyCi0qCi0qIEdldC9zZXQgdWludDMyIGRhdGEuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KLSogICAgICAgcGFybTIgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHByaXNtMm1pYl91aW50MzIKKyAqCisgKiBHZXQvc2V0IHVpbnQzMiBkYXRhLgorICoKKyAqIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKKyAqICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCisgKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KKyAqICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgorICoKKyAqIEFyZ3VtZW50czoKKyAqICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCisgKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCisgKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgorICogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KKyAqICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAwICAgLSBTdWNjZXNzLgorICogICAgICAgfjAgIC0gRXJyb3IuCisgKgorICovCiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX3VpbnQzMihzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkgICAgaW50IGlzZ2V0LAotCQkJICAgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCSAgICBoZmEzODR4X3QgKmh3LAorCQkJICAgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJICAgIHN0cnVjdCBoZmEzODR4ICpodywKIAkJCSAgICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLCB2b2lkICpkYXRhKQogewogCWludCByZXN1bHQ7CiAJdTMyICp1aW50MzIgPSBkYXRhOwogCXU4IGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCXUxNiAqd29yZGJ1ZiA9ICh1MTYgKikgYnl0ZWJ1ZjsKKwl1MTYgKndvcmRidWYgPSAodTE2ICopYnl0ZWJ1ZjsKIAogCWlmIChpc2dldCkgewogCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoaHcsIG1pYi0+cGFybTEsIHdvcmRidWYpOwpAQCAtNDQzLDQxICs0NDMsNDEgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX2ZsYWcKLSoKLSogR2V0L3NldCBhIGZsYWcuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KLSogICAgICAgcGFybTIgICAgQml0IHRvIGdldC9zZXQuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHByaXNtMm1pYl9mbGFnCisgKgorICogR2V0L3NldCBhIGZsYWcuCisgKgorICogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgorICogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KKyAqICAgICAgIHBhcm0yICAgIEJpdCB0byBnZXQvc2V0LgorICogICAgICAgcGFybTMgICAgTm90IHVzZWQuCisgKgorICogQXJndW1lbnRzOgorICogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KKyAqICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KKyAqICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KKyAqICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KKyAqICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgorICogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgIDAgICAtIFN1Y2Nlc3MuCisgKiAgICAgICB+MCAgLSBFcnJvci4KKyAqCisgKi8KIAogc3RhdGljIGludCBwcmlzbTJtaWJfZmxhZyhzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkgIGludCBpc2dldCwKLQkJCSAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJICBoZmEzODR4X3QgKmh3LAorCQkJICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCSAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLCB2b2lkICpkYXRhKQogewogCWludCByZXN1bHQ7CiAJdTMyICp1aW50MzIgPSBkYXRhOwogCXU4IGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCXUxNiAqd29yZGJ1ZiA9ICh1MTYgKikgYnl0ZWJ1ZjsKKwl1MTYgKndvcmRidWYgPSAodTE2ICopYnl0ZWJ1ZjsKIAl1MzIgZmxhZ3M7CiAKIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoaHcsIG1pYi0+cGFybTEsIHdvcmRidWYpOwpAQCAtNTAwLDQwICs1MDAsNDAgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3dlcGRlZmF1bHRrZXkKLSoKLSogR2V0L3NldCBXRVAgZGVmYXVsdCBrZXlzLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIE51bWJlciBvZiBieXRlcyBvZiBSSUQgZGF0YS4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogcHJpc20ybWliX3dlcGRlZmF1bHRrZXkKKyAqCisgKiBHZXQvc2V0IFdFUCBkZWZhdWx0IGtleXMuCisgKgorICogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgorICogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KKyAqICAgICAgIHBhcm0yICAgIE51bWJlciBvZiBieXRlcyBvZiBSSUQgZGF0YS4KKyAqICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgorICoKKyAqIEFyZ3VtZW50czoKKyAqICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCisgKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCisgKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgorICogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KKyAqICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAwICAgLSBTdWNjZXNzLgorICogICAgICAgfjAgIC0gRXJyb3IuCisgKgorICovCiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX3dlcGRlZmF1bHRrZXkoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJCSAgIGludCBpc2dldCwKLQkJCQkgICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgaGZhMzg0eF90ICpodywKKwkJCQkgICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICBzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCQkJICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywKIAkJCQkgICB2b2lkICpkYXRhKQogewogCWludCByZXN1bHQ7Ci0JcDgwMjExcHN0cmRfdCAqcHN0ciA9IGRhdGE7CisJc3RydWN0IHA4MDIxMXBzdHJkICpwc3RyID0gZGF0YTsKIAl1OCBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKIAl1MTYgbGVuOwogCkBAIC01NTAsMzUgKzU1MCwzNSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfcHJpdmFjeWludm9rZWQKLSoKLSogR2V0L3NldCB0aGUgZG90MTFQcml2YWN5SW52b2tlZCB2YWx1ZS4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgotKiAgICAgICBwYXJtMiAgICBCaXQgdmFsdWUgZm9yIFByaXZhY3lJbnZva2VkIGZsYWcuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHByaXNtMm1pYl9wcml2YWN5aW52b2tlZAorICoKKyAqIEdldC9zZXQgdGhlIGRvdDExUHJpdmFjeUludm9rZWQgdmFsdWUuCisgKgorICogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgorICogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KKyAqICAgICAgIHBhcm0yICAgIEJpdCB2YWx1ZSBmb3IgUHJpdmFjeUludm9rZWQgZmxhZy4KKyAqICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgorICoKKyAqIEFyZ3VtZW50czoKKyAqICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCisgKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCisgKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgorICogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KKyAqICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAwICAgLSBTdWNjZXNzLgorICogICAgICAgfjAgIC0gRXJyb3IuCisgKgorICovCiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX3ByaXZhY3lpbnZva2VkKHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCQkgICAgaW50IGlzZ2V0LAotCQkJCSAgICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgIGhmYTM4NHhfdCAqaHcsCisJCQkJICAgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgICBzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCQkJICAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJICAgIHZvaWQgKmRhdGEpCiB7CkBAIC01OTIsMzUgKzU5MiwzNSBAQAogCXJldHVybiBwcmlzbTJtaWJfZmxhZyhtaWIsIGlzZ2V0LCB3bGFuZGV2LCBodywgbXNnLCBkYXRhKTsKIH0KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9leGNsdWRldW5lbmNyeXB0ZWQKLSoKLSogR2V0L3NldCB0aGUgZG90MTFFeGNsdWRlVW5lbmNyeXB0ZWQgdmFsdWUuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KLSogICAgICAgcGFybTIgICAgQml0IHZhbHVlIGZvciBFeGNsdWRlVW5lbmNyeXB0ZWQgZmxhZy4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogcHJpc20ybWliX2V4Y2x1ZGV1bmVuY3J5cHRlZAorICoKKyAqIEdldC9zZXQgdGhlIGRvdDExRXhjbHVkZVVuZW5jcnlwdGVkIHZhbHVlLgorICoKKyAqIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKKyAqICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCisgKiAgICAgICBwYXJtMiAgICBCaXQgdmFsdWUgZm9yIEV4Y2x1ZGVVbmVuY3J5cHRlZCBmbGFnLgorICogICAgICAgcGFybTMgICAgTm90IHVzZWQuCisgKgorICogQXJndW1lbnRzOgorICogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KKyAqICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KKyAqICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KKyAqICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KKyAqICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgorICogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgIDAgICAtIFN1Y2Nlc3MuCisgKiAgICAgICB+MCAgLSBFcnJvci4KKyAqCisgKi8KIAogc3RhdGljIGludCBwcmlzbTJtaWJfZXhjbHVkZXVuZW5jcnlwdGVkKHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCQkJaW50IGlzZ2V0LAotCQkJCQl3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJCWhmYTM4NHhfdCAqaHcsCisJCQkJCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCQlzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCQkJCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJCXZvaWQgKmRhdGEpCiB7CkBAIC02MjgsMzUgKzYyOCwzNSBAQAogCXJldHVybiBwcmlzbTJtaWJfZmxhZyhtaWIsIGlzZ2V0LCB3bGFuZGV2LCBodywgbXNnLCBkYXRhKTsKIH0KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkCi0qCi0qIEdldC9zZXQgdGhlIGZyYWdtZW50YXRpb24gdGhyZXNob2xkLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBwcmlzbTJtaWJfZnJhZ21lbnRhdGlvbnRocmVzaG9sZAorICoKKyAqIEdldC9zZXQgdGhlIGZyYWdtZW50YXRpb24gdGhyZXNob2xkLgorICoKKyAqIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKKyAqICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCisgKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KKyAqICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgorICoKKyAqIEFyZ3VtZW50czoKKyAqICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCisgKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCisgKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgorICogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KKyAqICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAwICAgLSBTdWNjZXNzLgorICogICAgICAgfjAgIC0gRXJyb3IuCisgKgorICovCiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJCQkgICAgaW50IGlzZ2V0LAotCQkJCQkgICAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCQkgICAgaGZhMzg0eF90ICpodywKKwkJCQkJICAgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCQkgICAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJCQkgICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywKIAkJCQkJICAgIHZvaWQgKmRhdGEpCiB7CkBAIC02NzQsNDcgKzY3NCw0NyBAQAogCXJldHVybiBwcmlzbTJtaWJfdWludDMyKG1pYiwgaXNnZXQsIHdsYW5kZXYsIGh3LCBtc2csIGRhdGEpOwogfQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3ByaXYKLSoKLSogR2V0L3NldCB2YWx1ZXMgaW4gdGhlICJwcml2IiBkYXRhIHN0cnVjdHVyZS4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBOb3QgdXNlZC4KLSogICAgICAgcGFybTIgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHByaXNtMm1pYl9wcml2CisgKgorICogR2V0L3NldCB2YWx1ZXMgaW4gdGhlICJwcml2IiBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6CisgKiAgICAgICBwYXJtMSAgICBOb3QgdXNlZC4KKyAqICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgorICogICAgICAgcGFybTMgICAgTm90IHVzZWQuCisgKgorICogQXJndW1lbnRzOgorICogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KKyAqICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KKyAqICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KKyAqICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KKyAqICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgorICogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgIDAgICAtIFN1Y2Nlc3MuCisgKiAgICAgICB+MCAgLSBFcnJvci4KKyAqCisgKi8KIAogc3RhdGljIGludCBwcmlzbTJtaWJfcHJpdihzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkgIGludCBpc2dldCwKLQkJCSAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJICBoZmEzODR4X3QgKmh3LAorCQkJICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCSAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLCB2b2lkICpkYXRhKQogewotCXA4MDIxMXBzdHJkX3QgKnBzdHIgPSBkYXRhOworCXN0cnVjdCBwODAyMTFwc3RyZCAqcHN0ciA9IGRhdGE7CiAKIAlzd2l0Y2ggKG1pYi0+ZGlkKSB7CiAJY2FzZSBESURtaWJfbG54X2xueENvbmZpZ1RhYmxlX2xueFJTTkFJRTp7Ci0JCQloZmEzODR4X1dQQURhdGFfdCB3cGE7CisJCQlzdHJ1Y3QgaGZhMzg0eF9XUEFEYXRhIHdwYTsKIAogCQkJaWYgKGlzZ2V0KSB7CiAJCQkJaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywKIAkJCQkJCSAgICAgICBIRkEzODR4X1JJRF9DTkZXUEFEQVRBLAotCQkJCQkJICAgICAgICh1OCAqKSAmd3BhLAorCQkJCQkJICAgICAgICh1OCAqKSZ3cGEsCiAJCQkJCQkgICAgICAgc2l6ZW9mKHdwYSkpOwogCQkJCXBzdHItPmxlbiA9IGxlMTZfdG9fY3B1KHdwYS5kYXRhbGVuKTsKIAkJCQltZW1jcHkocHN0ci0+ZGF0YSwgd3BhLmRhdGEsIHBzdHItPmxlbik7CkBAIC03MjQsNyArNzI0LDcgQEAKIAogCQkJCWhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsCiAJCQkJCQkgICAgICAgSEZBMzg0eF9SSURfQ05GV1BBREFUQSwKLQkJCQkJCSAgICAgICAodTggKikgJndwYSwKKwkJCQkJCSAgICAgICAodTggKikmd3BhLAogCQkJCQkJICAgICAgIHNpemVvZih3cGEpKTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtNzM2LDY3ICs3MzYsNjcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfcHN0cjJieXRlc3RyCi0qCi0qIENvbnZlcnQgdGhlIHBzdHIgZGF0YSBpbiB0aGUgV0xBTiBtZXNzYWdlIHN0cnVjdHVyZSBpbnRvIGFuIGhmYTM4NHgKLSogYnl0ZSBzdHJpbmcgZm9ybWF0LgotKgotKiBBcmd1bWVudHM6Ci0qCWJ5dGVzdHIJCWhmYTM4NHggYnl0ZSBzdHJpbmcgZGF0YSB0eXBlCi0qCXBzdHIJCXdsYW4gbWVzc2FnZSBkYXRhCi0qCi0qIFJldHVybnM6Ci0qCU5vdGhpbmcKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHByaXNtMm1nbXRfcHN0cjJieXRlc3RyCisgKgorICogQ29udmVydCB0aGUgcHN0ciBkYXRhIGluIHRoZSBXTEFOIG1lc3NhZ2Ugc3RydWN0dXJlIGludG8gYW4gaGZhMzg0eAorICogYnl0ZSBzdHJpbmcgZm9ybWF0LgorICoKKyAqIEFyZ3VtZW50czoKKyAqCWJ5dGVzdHIJCWhmYTM4NHggYnl0ZSBzdHJpbmcgZGF0YSB0eXBlCisgKglwc3RyCQl3bGFuIG1lc3NhZ2UgZGF0YQorICoKKyAqIFJldHVybnM6CisgKiAJTm90aGluZworICoKKyAqLwogCiB2b2lkIHByaXNtMm1nbXRfcHN0cjJieXRlc3RyKHN0cnVjdCBoZmEzODR4X2J5dGVzdHIgKmJ5dGVzdHIsCi0JCQkgICAgIHA4MDIxMXBzdHJkX3QgKnBzdHIpCisJCQkgICAgIHN0cnVjdCBwODAyMTFwc3RyZCAqcHN0cikKIHsKLQlieXRlc3RyLT5sZW4gPSBjcHVfdG9fbGUxNigodTE2KSAocHN0ci0+bGVuKSk7CisJYnl0ZXN0ci0+bGVuID0gY3B1X3RvX2xlMTYoKHUxNikocHN0ci0+bGVuKSk7CiAJbWVtY3B5KGJ5dGVzdHItPmRhdGEsIHBzdHItPmRhdGEsIHBzdHItPmxlbik7CiB9CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2J5dGVzdHIycHN0cgotKgotKiBDb252ZXJ0IHRoZSBkYXRhIGluIGFuIGhmYTM4NHggYnl0ZSBzdHJpbmcgZm9ybWF0IGludG8gYQotKiBwc3RyIGluIHRoZSBXTEFOIG1lc3NhZ2UuCi0qCi0qIEFyZ3VtZW50czoKLSoJYnl0ZXN0cgkJaGZhMzg0eCBieXRlIHN0cmluZyBkYXRhIHR5cGUKLSoJbXNnCQl3bGFuIG1lc3NhZ2UKLSoKLSogUmV0dXJuczoKLSoJTm90aGluZwotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogcHJpc20ybWdtdF9ieXRlc3RyMnBzdHIKKyAqCisgKiBDb252ZXJ0IHRoZSBkYXRhIGluIGFuIGhmYTM4NHggYnl0ZSBzdHJpbmcgZm9ybWF0IGludG8gYQorICogcHN0ciBpbiB0aGUgV0xBTiBtZXNzYWdlLgorICoKKyAqIEFyZ3VtZW50czoKKyAqCWJ5dGVzdHIJCWhmYTM4NHggYnl0ZSBzdHJpbmcgZGF0YSB0eXBlCisgKgltc2cJCXdsYW4gbWVzc2FnZQorICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKgorICovCiAKIHZvaWQgcHJpc20ybWdtdF9ieXRlc3RyMnBzdHIoc3RydWN0IGhmYTM4NHhfYnl0ZXN0ciAqYnl0ZXN0ciwKLQkJCSAgICAgcDgwMjExcHN0cmRfdCAqcHN0cikKKwkJCSAgICAgc3RydWN0IHA4MDIxMXBzdHJkICpwc3RyKQogewotCXBzdHItPmxlbiA9ICh1OCkgKGxlMTZfdG9fY3B1KCh1MTYpIChieXRlc3RyLT5sZW4pKSk7CisJcHN0ci0+bGVuID0gKHU4KShsZTE2X3RvX2NwdSgodTE2KShieXRlc3RyLT5sZW4pKSk7CiAJbWVtY3B5KHBzdHItPmRhdGEsIGJ5dGVzdHItPmRhdGEsIHBzdHItPmxlbik7CiB9CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2J5dGVhcmVhMnBzdHIKLSoKLSogQ29udmVydCB0aGUgZGF0YSBpbiBhbiBoZmEzODR4IGJ5dGUgYXJlYSBmb3JtYXQgaW50byBhIHBzdHIKLSogaW4gdGhlIFdMQU4gbWVzc2FnZS4KLSoKLSogQXJndW1lbnRzOgotKglieXRlYXJlYQloZmEzODR4IGJ5dGUgYXJlYSBkYXRhIHR5cGUKLSoJbXNnCQl3bGFuIG1lc3NhZ2UKLSoKLSogUmV0dXJuczoKLSoJTm90aGluZwotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogcHJpc20ybWdtdF9ieXRlYXJlYTJwc3RyCisgKgorICogQ29udmVydCB0aGUgZGF0YSBpbiBhbiBoZmEzODR4IGJ5dGUgYXJlYSBmb3JtYXQgaW50byBhIHBzdHIKKyAqIGluIHRoZSBXTEFOIG1lc3NhZ2UuCisgKgorICogQXJndW1lbnRzOgorICoJYnl0ZWFyZWEJaGZhMzg0eCBieXRlIGFyZWEgZGF0YSB0eXBlCisgKgltc2cJCXdsYW4gbWVzc2FnZQorICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKgorICovCiAKLXZvaWQgcHJpc20ybWdtdF9ieXRlYXJlYTJwc3RyKHU4ICpieXRlYXJlYSwgcDgwMjExcHN0cmRfdCAqcHN0ciwgaW50IGxlbikKK3ZvaWQgcHJpc20ybWdtdF9ieXRlYXJlYTJwc3RyKHU4ICpieXRlYXJlYSwgc3RydWN0IHA4MDIxMXBzdHJkICpwc3RyLCBpbnQgbGVuKQogewotCXBzdHItPmxlbiA9ICh1OCkgbGVuOworCXBzdHItPmxlbiA9ICh1OClsZW47CiAJbWVtY3B5KHBzdHItPmRhdGEsIGJ5dGVhcmVhLCBsZW4pOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJzdGEuYwppbmRleCA2NGY5MDcyLi5lMWI0YTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJzdGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJzdGEuYwpAQCAtODEsNyArODEsNyBAQAogI2luY2x1ZGUgInByaXNtMm1nbXQuaCIKIAogc3RhdGljIGNoYXIgKmRldl9pbmZvID0gInByaXNtMl91c2IiOwotc3RhdGljIHdsYW5kZXZpY2VfdCAqY3JlYXRlX3dsYW4odm9pZCk7CitzdGF0aWMgc3RydWN0IHdsYW5kZXZpY2UgKmNyZWF0ZV93bGFuKHZvaWQpOwogCiBpbnQgcHJpc20yX3Jlc2V0X2hvbGR0aW1lID0gMzA7CS8qIFJlc2V0IGhvbGQgdGltZSBpbiBtcyAqLwogaW50IHByaXNtMl9yZXNldF9zZXR0bGV0aW1lID0gMTAwOwkvKiBSZXNldCBzZXR0bGUgdGltZSBpbiBtcyAqLwpAQCAtOTgsMzcgKzk4LDM4IEBACiAKIE1PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKIAotc3RhdGljIGludCBwcmlzbTJzdGFfb3Blbih3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotc3RhdGljIGludCBwcmlzbTJzdGFfY2xvc2Uod2xhbmRldmljZV90ICp3bGFuZGV2KTsKLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9yZXNldCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotc3RhdGljIGludCBwcmlzbTJzdGFfdHhmcmFtZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHN0cnVjdCBza19idWZmICpza2IsCitzdGF0aWMgaW50IHByaXNtMnN0YV9vcGVuKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKK3N0YXRpYyBpbnQgcHJpc20yc3RhX2Nsb3NlKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9yZXNldChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7CitzdGF0aWMgaW50IHByaXNtMnN0YV90eGZyYW1lKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICB1bmlvbiBwODAyMTFfaGRyICpwODAyMTFfaGRyLAogCQkJICAgICBzdHJ1Y3QgcDgwMjExX21ldGF3ZXAgKnA4MDIxMV93ZXApOwotc3RhdGljIGludCBwcmlzbTJzdGFfbWxtZXJlcXVlc3Qod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3QgcDgwMjExbXNnICptc2cpOwotc3RhdGljIGludCBwcmlzbTJzdGFfZ2V0Y2FyZGluZm8od2xhbmRldmljZV90ICp3bGFuZGV2KTsKLXN0YXRpYyBpbnQgcHJpc20yc3RhX2dsb2JhbHNldHVwKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci1zdGF0aWMgaW50IHByaXNtMnN0YV9zZXRtdWx0aWNhc3Qod2xhbmRldmljZV90ICp3bGFuZGV2LCBuZXRkZXZpY2VfdCAqZGV2KTsKK3N0YXRpYyBpbnQgcHJpc20yc3RhX21sbWVyZXF1ZXN0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3QgcDgwMjExbXNnICptc2cpOworc3RhdGljIGludCBwcmlzbTJzdGFfZ2V0Y2FyZGluZm8oc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOworc3RhdGljIGludCBwcmlzbTJzdGFfZ2xvYmFsc2V0dXAoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOworc3RhdGljIGludCBwcmlzbTJzdGFfc2V0bXVsdGljYXN0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfaGFuZG92ZXIod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKTsKLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfdGFsbGllcyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICBoZmEzODR4X0luZkZyYW1lX3QgKmluZik7Ci1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2hvc3RzY2FucmVzdWx0cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJCSAgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpOwotc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9zY2FucmVzdWx0cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgICAgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpOwotc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9jaGluZm9yZXN1bHRzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkJaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpOwotc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9saW5rc3RhdHVzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkgICAgIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKTsKLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfYXNzb2NzdGF0dXMod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgICAgIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKTsKLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfYXV0aHJlcSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICBoZmEzODR4X0luZkZyYW1lX3QgKmluZik7Ci1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2F1dGhyZXFfZGVmZXIod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCQloZmEzODR4X0luZkZyYW1lX3QgKmluZik7Ci1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX3BzdXNlcmNudCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKTsKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfaGFuZG92ZXIoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZik7CitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX3RhbGxpZXMoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKTsKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfaG9zdHNjYW5yZXN1bHRzKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCQkgIHN0cnVjdCBoZmEzODR4X0luZkZyYW1lICppbmYpOworc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9zY2FucmVzdWx0cyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKTsKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfY2hpbmZvcmVzdWx0cyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkJc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZik7CitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2xpbmtzdGF0dXMoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICAgICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKTsKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfYXNzb2NzdGF0dXMoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICAgICAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZik7CitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2F1dGhyZXEoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKTsKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfYXV0aHJlcV9kZWZlcihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkJc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZik7CitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX3BzdXNlcmNudChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZik7CiAKIC8qCiAgKiBwcmlzbTJzdGFfb3BlbgpAQCAtMTUxLDcgKzE1Miw3IEBACiAgKiBDYWxsIGNvbnRleHQ6CiAgKglwcm9jZXNzIHRocmVhZAogICovCi1zdGF0aWMgaW50IHByaXNtMnN0YV9vcGVuKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3N0YXRpYyBpbnQgcHJpc20yc3RhX29wZW4oc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJLyogV2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgdG8gZG8gYW55dGhpbmcgZWxzZS4KIAkgKiBUaGUgc2V0dXAgb2YgdGhlIE1BQyBzaG91bGQgYmUgc3Vic2VxdWVudGx5IGNvbXBsZXRlZCB2aWEKQEAgLTE4NSw3ICsxODYsNyBAQAogICogQ2FsbCBjb250ZXh0OgogICoJcHJvY2VzcyB0aHJlYWQKICAqLwotc3RhdGljIGludCBwcmlzbTJzdGFfY2xvc2Uod2xhbmRldmljZV90ICp3bGFuZGV2KQorc3RhdGljIGludCBwcmlzbTJzdGFfY2xvc2Uoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJLyogV2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgdG8gZG8gYW55dGhpbmcgZWxzZS4KIAkgKiBIaWdoZXIgbGF5ZXJzIGtub3cgd2UncmUgbm90IHJlYWR5IGZyb20gZGV2LT5zdGFydD09MCBhbmQKQEAgLTIxMyw3ICsyMTQsNyBAQAogICogQ2FsbCBjb250ZXh0OgogICoJcHJvY2VzcyB0aHJlYWQKICAqLwotc3RhdGljIHZvaWQgcHJpc20yc3RhX3Jlc2V0KHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9yZXNldChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldikKIHsKIH0KIApAQCAtMjM4LDExICsyMzksMTEgQEAKICAqIENhbGwgY29udGV4dDoKICAqCXByb2Nlc3MgdGhyZWFkCiAgKi8KLXN0YXRpYyBpbnQgcHJpc20yc3RhX3R4ZnJhbWUod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorc3RhdGljIGludCBwcmlzbTJzdGFfdHhmcmFtZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgdW5pb24gcDgwMjExX2hkciAqcDgwMjExX2hkciwKIAkJCSAgICAgc3RydWN0IHA4MDIxMV9tZXRhd2VwICpwODAyMTFfd2VwKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAKIAkvKiBJZiBuZWNlc3NhcnksIHNldCB0aGUgODAyLjExIFdFUCBiaXQgKi8KIAlpZiAoKHdsYW5kZXYtPmhvc3R3ZXAgJiAoSE9TVFdFUF9QUklWQUNZSU5WT0tFRCB8IEhPU1RXRVBfRU5DUllQVCkpID09CkBAIC0yNzcsOSArMjc4LDkgQEAKICAqIENhbGwgY29udGV4dDoKICAqCXByb2Nlc3MgdGhyZWFkCiAgKi8KLXN0YXRpYyBpbnQgcHJpc20yc3RhX21sbWVyZXF1ZXN0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHA4MDIxMW1zZyAqbXNnKQorc3RhdGljIGludCBwcmlzbTJzdGFfbWxtZXJlcXVlc3Qoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBwODAyMTFtc2cgKm1zZykKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCiAJaW50IHJlc3VsdCA9IDA7CiAKQEAgLTMzNyw3ICszMzgsNyBAQAogCQkJc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaWZzdGF0ZSAqaWZzdGF0ZW1zZzsKIAogCQkJcHJfZGVidWcoIlJlY2VpdmVkIG1sbWUgaWZzdGF0ZSByZXF1ZXN0XG4iKTsKLQkJCWlmc3RhdGVtc2cgPSAoc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaWZzdGF0ZSAqKSBtc2c7CisJCQlpZnN0YXRlbXNnID0gKHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2lmc3RhdGUgKiltc2c7CiAJCQlyZXN1bHQgPQogCQkJICAgIHByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXYsCiAJCQkJCSAgICAgIGlmc3RhdGVtc2ctPmlmc3RhdGUuZGF0YSk7CkBAIC0zNjAsNyArMzYxLDcgQEAKIAogCQkJcHJfZGVidWcoIlJlY2VpdmVkIGNvbW1zcXVhbGl0eSByZXF1ZXN0XG4iKTsKIAotCQkJcXVhbG1zZyA9IChzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV9jb21tc3F1YWxpdHkgKikgbXNnOworCQkJcXVhbG1zZyA9IChzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV9jb21tc3F1YWxpdHkgKiltc2c7CiAKIAkJCXF1YWxtc2ctPmxpbmsuc3RhdHVzID0KIAkJCSAgICBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7CkBAIC00MDcsOSArNDA4LDkgQEAKICAqCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKICAqCWludGVycnVwdAogICovCi11MzIgcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MzIgaWZzdGF0ZSkKK3UzMiBwcmlzbTJzdGFfaWZzdGF0ZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTMyIGlmc3RhdGUpCiB7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAl1MzIgcmVzdWx0OwogCiAJcmVzdWx0ID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX2ltcGxlbWVudGF0aW9uX2ZhaWx1cmU7CkBAIC01ODAsMTAgKzU4MSwxMCBAQAogICogQ2FsbCBjb250ZXh0OgogICoJRWl0aGVyLgogICovCi1zdGF0aWMgaW50IHByaXNtMnN0YV9nZXRjYXJkaW5mbyh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCitzdGF0aWMgaW50IHByaXNtMnN0YV9nZXRjYXJkaW5mbyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCXUxNiB0ZW1wOwogCXU4IHNudW1bSEZBMzg0eF9SSURfTklDU0VSSUFMTlVNQkVSX0xFTl07CiAKQEAgLTU5Miw3ICs1OTMsNyBAQAogCS8qIE5JQyBpZGVudGl0eSAqLwogCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX05JQ0lERU5USVRZLAogCQkJCQkmaHctPmlkZW50X25pYywKLQkJCQkJc2l6ZW9mKGhmYTM4NHhfY29tcGlkZW50X3QpKTsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBoZmEzODR4X2NvbXBpZGVudCkpOwogCWlmIChyZXN1bHQpIHsKIAkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgTklDSURFTlRJVFlcbiIpOwogCQlnb3RvIGZhaWxlZDsKQEAgLTYxMSw3ICs2MTIsNyBAQAogCS8qIFByaW1hcnkgZi93IGlkZW50aXR5ICovCiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfUFJJSURFTlRJVFksCiAJCQkJCSZody0+aWRlbnRfcHJpX2Z3LAotCQkJCQlzaXplb2YoaGZhMzg0eF9jb21waWRlbnRfdCkpOworCQkJCQlzaXplb2Yoc3RydWN0IGhmYTM4NHhfY29tcGlkZW50KSk7CiAJaWYgKHJlc3VsdCkgewogCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBQUklJREVOVElUWVxuIik7CiAJCWdvdG8gZmFpbGVkOwpAQCAtNjMwLDcgKzYzMSw3IEBACiAJLyogU3RhdGlvbiAoU2Vjb25kYXJ5PykgZi93IGlkZW50aXR5ICovCiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfU1RBSURFTlRJVFksCiAJCQkJCSZody0+aWRlbnRfc3RhX2Z3LAotCQkJCQlzaXplb2YoaGZhMzg0eF9jb21waWRlbnRfdCkpOworCQkJCQlzaXplb2Yoc3RydWN0IGhmYTM4NHhfY29tcGlkZW50KSk7CiAJaWYgKHJlc3VsdCkgewogCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBTVEFJREVOVElUWVxuIik7CiAJCWdvdG8gZmFpbGVkOwpAQCAtNjUxLDcgKzY1Miw3IEBACiAKIAkvKiBzdHJpcCBvdXQgdGhlICdzcGVjaWFsJyB2YXJpYW50IGJpdHMgKi8KIAlody0+bW1fbW9kcyA9IGh3LT5pZGVudF9zdGFfZncudmFyaWFudCAmIChCSVQoMTQpIHwgQklUKDE1KSk7Ci0JaHctPmlkZW50X3N0YV9mdy52YXJpYW50ICY9IH4oKHUxNikgKEJJVCgxNCkgfCBCSVQoMTUpKSk7CisJaHctPmlkZW50X3N0YV9mdy52YXJpYW50ICY9IH4oKHUxNikoQklUKDE0KSB8IEJJVCgxNSkpKTsKIAogCWlmIChody0+aWRlbnRfc3RhX2Z3LmlkID09IDB4MWYpIHsKIAkJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LApAQCAtNjcwLDcgKzY3MSw3IEBACiAJLyogQ29tcGF0aWJpbGl0eSByYW5nZSwgTW9kZW0gc3VwcGxpZXIgKi8KIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9NRklTVVBSQU5HRSwKIAkJCQkJJmh3LT5jYXBfc3VwX21maSwKLQkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOworCQkJCQlzaXplb2Yoc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwpKTsKIAlpZiAocmVzdWx0KSB7CiAJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIE1GSVNVUFJBTkdFXG4iKTsKIAkJZ290byBmYWlsZWQ7CkBAIC02OTQsNyArNjk1LDcgQEAKIAkvKiBDb21wYXRpYmlsaXR5IHJhbmdlLCBDb250cm9sbGVyIHN1cHBsaWVyICovCiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfQ0ZJU1VQUkFOR0UsCiAJCQkJCSZody0+Y2FwX3N1cF9jZmksCi0JCQkJCXNpemVvZihoZmEzODR4X2NhcGxldmVsX3QpKTsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBoZmEzODR4X2NhcGxldmVsKSk7CiAJaWYgKHJlc3VsdCkgewogCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBDRklTVVBSQU5HRVxuIik7CiAJCWdvdG8gZmFpbGVkOwpAQCAtNzE4LDcgKzcxOSw3IEBACiAJLyogQ29tcGF0aWJpbGl0eSByYW5nZSwgUHJpbWFyeSBmL3cgc3VwcGxpZXIgKi8KIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9QUklTVVBSQU5HRSwKIAkJCQkJJmh3LT5jYXBfc3VwX3ByaSwKLQkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOworCQkJCQlzaXplb2Yoc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwpKTsKIAlpZiAocmVzdWx0KSB7CiAJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIFBSSVNVUFJBTkdFXG4iKTsKIAkJZ290byBmYWlsZWQ7CkBAIC03NDIsNyArNzQzLDcgQEAKIAkvKiBDb21wYXRpYmlsaXR5IHJhbmdlLCBTdGF0aW9uIGYvdyBzdXBwbGllciAqLwogCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX1NUQVNVUFJBTkdFLAogCQkJCQkmaHctPmNhcF9zdXBfc3RhLAotCQkJCQlzaXplb2YoaGZhMzg0eF9jYXBsZXZlbF90KSk7CisJCQkJCXNpemVvZihzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbCkpOwogCWlmIChyZXN1bHQpIHsKIAkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgU1RBU1VQUkFOR0VcbiIpOwogCQlnb3RvIGZhaWxlZDsKQEAgLTc3NCw3ICs3NzUsNyBAQAogCS8qIENvbXBhdGliaWxpdHkgcmFuZ2UsIHByaW1hcnkgZi93IGFjdG9yLCBDRkkgc3VwcGxpZXIgKi8KIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9QUklfQ0ZJQUNUUkFOR0VTLAogCQkJCQkmaHctPmNhcF9hY3RfcHJpX2NmaSwKLQkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOworCQkJCQlzaXplb2Yoc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwpKTsKIAlpZiAocmVzdWx0KSB7CiAJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIFBSSV9DRklBQ1RSQU5HRVNcbiIpOwogCQlnb3RvIGZhaWxlZDsKQEAgLTc5OCw3ICs3OTksNyBAQAogCS8qIENvbXBhdGliaWxpdHkgcmFuZ2UsIHN0YSBmL3cgYWN0b3IsIENGSSBzdXBwbGllciAqLwogCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX1NUQV9DRklBQ1RSQU5HRVMsCiAJCQkJCSZody0+Y2FwX2FjdF9zdGFfY2ZpLAotCQkJCQlzaXplb2YoaGZhMzg0eF9jYXBsZXZlbF90KSk7CisJCQkJCXNpemVvZihzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbCkpOwogCWlmIChyZXN1bHQpIHsKIAkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgU1RBX0NGSUFDVFJBTkdFU1xuIik7CiAJCWdvdG8gZmFpbGVkOwpAQCAtODIyLDcgKzgyMyw3IEBACiAJLyogQ29tcGF0aWJpbGl0eSByYW5nZSwgc3RhIGYvdyBhY3RvciwgTUZJIHN1cHBsaWVyICovCiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfU1RBX01GSUFDVFJBTkdFUywKIAkJCQkJJmh3LT5jYXBfYWN0X3N0YV9tZmksCi0JCQkJCXNpemVvZihoZmEzODR4X2NhcGxldmVsX3QpKTsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBoZmEzODR4X2NhcGxldmVsKSk7CiAJaWYgKHJlc3VsdCkgewogCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBTVEFfTUZJQUNUUkFOR0VTXG4iKTsKIAkJZ290byBmYWlsZWQ7CkBAIC05MDksMTkgKzkxMCwyMCBAQAogICogQ2FsbCBjb250ZXh0OgogICoJcHJvY2VzcyB0aHJlYWQKICAqLwotc3RhdGljIGludCBwcmlzbTJzdGFfZ2xvYmFsc2V0dXAod2xhbmRldmljZV90ICp3bGFuZGV2KQorc3RhdGljIGludCBwcmlzbTJzdGFfZ2xvYmFsc2V0dXAoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAogCS8qIFNldCB0aGUgbWF4aW11bSBmcmFtZSBzaXplICovCiAJcmV0dXJuIGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GTUFYREFUQUxFTiwKIAkJCQkJV0xBTl9EQVRBX01BWExFTik7CiB9CiAKLXN0YXRpYyBpbnQgcHJpc20yc3RhX3NldG11bHRpY2FzdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIG5ldGRldmljZV90ICpkZXYpCitzdGF0aWMgaW50IHByaXNtMnN0YV9zZXRtdWx0aWNhc3Qoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAogCXUxNiBwcm9taXNjOwogCkBAIC05NTksOCArOTYxLDggQEAKICAqIENhbGwgY29udGV4dDoKICAqCWludGVycnVwdAogICovCi1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2hhbmRvdmVyKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkgICBoZmEzODR4X0luZkZyYW1lX3QgKmluZikKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfaGFuZG92ZXIoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZikKIHsKIAlwcl9kZWJ1ZygicmVjZWl2ZWQgaW5mb2ZyYW1lOkhBTkRPVkVSICh1bmhhbmRsZWQpXG4iKTsKIH0KQEAgLTk4MiwxMCArOTg0LDEwIEBACiAgKiBDYWxsIGNvbnRleHQ6CiAgKglpbnRlcnJ1cHQKICAqLwotc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl90YWxsaWVzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkgIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKQorc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl90YWxsaWVzKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZikKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCXUxNiAqc3JjMTY7CiAJdTMyICpkc3Q7CiAJdTMyICpzcmMzMjsKQEAgLTk5NywxNSArOTk5LDE1IEBACiAJICogcmVjb3JkIGxlbmd0aCBvZiB0aGUgaW5mbyByZWNvcmQuCiAJICovCiAKLQljbnQgPSBzaXplb2YoaGZhMzg0eF9Db21tVGFsbGllczMyX3QpIC8gc2l6ZW9mKHUzMik7CisJY250ID0gc2l6ZW9mKHN0cnVjdCBoZmEzODR4X0NvbW1UYWxsaWVzMzIpIC8gc2l6ZW9mKHUzMik7CiAJaWYgKGluZi0+ZnJhbWVsZW4gPiAyMikgewotCQlkc3QgPSAodTMyICopICZody0+dGFsbGllczsKLQkJc3JjMzIgPSAodTMyICopICZpbmYtPmluZm8uY29tbXRhbGxpZXMzMjsKKwkJZHN0ID0gKHUzMiAqKSZody0+dGFsbGllczsKKwkJc3JjMzIgPSAodTMyICopJmluZi0+aW5mby5jb21tdGFsbGllczMyOwogCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyssIGRzdCsrLCBzcmMzMisrKQogCQkJKmRzdCArPSBsZTMyX3RvX2NwdSgqc3JjMzIpOwogCX0gZWxzZSB7Ci0JCWRzdCA9ICh1MzIgKikgJmh3LT50YWxsaWVzOwotCQlzcmMxNiA9ICh1MTYgKikgJmluZi0+aW5mby5jb21tdGFsbGllczE2OworCQlkc3QgPSAodTMyICopJmh3LT50YWxsaWVzOworCQlzcmMxNiA9ICh1MTYgKikmaW5mLT5pbmZvLmNvbW10YWxsaWVzMTY7CiAJCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKywgZHN0KyssIHNyYzE2KyspCiAJCQkqZHN0ICs9IGxlMTZfdG9fY3B1KCpzcmMxNik7CiAJfQpAQCAtMTAyOCwyMSArMTAzMCwyMCBAQAogICogQ2FsbCBjb250ZXh0OgogICoJaW50ZXJydXB0CiAgKi8KLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfc2NhbnJlc3VsdHMod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgICAgIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKQorc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9zY2FucmVzdWx0cyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKQogewotCi0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlpbnQgbmJzczsKLQloZmEzODR4X1NjYW5SZXN1bHRfdCAqc3IgPSAmKGluZi0+aW5mby5zY2FucmVzdWx0KTsKKwlzdHJ1Y3QgaGZhMzg0eF9TY2FuUmVzdWx0ICpzciA9ICYoaW5mLT5pbmZvLnNjYW5yZXN1bHQpOwogCWludCBpOwotCWhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YV90IGpvaW5yZXE7CisJc3RydWN0IGhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YSBqb2lucmVxOwogCWludCByZXN1bHQ7CiAKIAkvKiBHZXQgdGhlIG51bWJlciBvZiByZXN1bHRzLCBmaXJzdCBpbiBieXRlcywgdGhlbiBpbiByZXN1bHRzICovCiAJbmJzcyA9IChpbmYtPmZyYW1lbGVuICogc2l6ZW9mKHUxNikpIC0KIAkgICAgc2l6ZW9mKGluZi0+aW5mb3R5cGUpIC0gc2l6ZW9mKGluZi0+aW5mby5zY2FucmVzdWx0LnNjYW5yZWFzb24pOwotCW5ic3MgLz0gc2l6ZW9mKGhmYTM4NHhfU2NhblJlc3VsdFN1Yl90KTsKKwluYnNzIC89IHNpemVvZihzdHJ1Y3QgaGZhMzg0eF9TY2FuUmVzdWx0U3ViKTsKIAogCS8qIFByaW50IGVtICovCiAJcHJfZGVidWcoInJ4IHNjYW5yZXN1bHRzLCByZWFzb249JWQsIG5ic3M9JWQ6XG4iLApAQCAtMTA4NCwxMCArMTA4NSwxMCBAQAogICogQ2FsbCBjb250ZXh0OgogICoJaW50ZXJydXB0CiAgKi8KLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfaG9zdHNjYW5yZXN1bHRzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkJICBoZmEzODR4X0luZkZyYW1lX3QgKmluZikKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfaG9zdHNjYW5yZXN1bHRzKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCQkgIHN0cnVjdCBoZmEzODR4X0luZkZyYW1lICppbmYpCiB7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlpbnQgbmJzczsKIAogCW5ic3MgPSAoaW5mLT5mcmFtZWxlbiAtIDMpIC8gMzI7CkBAIC0xMDk4LDcgKzEwOTksNyBAQAogCiAJa2ZyZWUoaHctPnNjYW5yZXN1bHRzKTsKIAotCWh3LT5zY2FucmVzdWx0cyA9IGttZW1kdXAoaW5mLCBzaXplb2YoaGZhMzg0eF9JbmZGcmFtZV90KSwgR0ZQX0FUT01JQyk7CisJaHctPnNjYW5yZXN1bHRzID0ga21lbWR1cChpbmYsIHNpemVvZihzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSksIEdGUF9BVE9NSUMpOwogCiAJaWYgKG5ic3MgPT0gMCkKIAkJbmJzcyA9IC0xOwpAQCAtMTEyNSwxOCArMTEyNiwxOCBAQAogICogQ2FsbCBjb250ZXh0OgogICoJaW50ZXJydXB0CiAgKi8KLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfY2hpbmZvcmVzdWx0cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJCWhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKQorc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9jaGluZm9yZXN1bHRzKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCQlzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJdW5zaWduZWQgaW50IGksIG47CiAKIAlody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMuc2NhbmNoYW5uZWxzID0KIAkgICAgbGUxNl90b19jcHUoaW5mLT5pbmZvLmNoaW5mb3Jlc3VsdC5zY2FuY2hhbm5lbHMpOwogCiAJZm9yIChpID0gMCwgbiA9IDA7IGkgPCBIRkEzODR4X0NISU5GT1JFU1VMVF9NQVg7IGkrKykgewotCQloZmEzODR4X0NoSW5mb1Jlc3VsdFN1Yl90ICpyZXN1bHQ7Ci0JCWhmYTM4NHhfQ2hJbmZvUmVzdWx0U3ViX3QgKmNoaW5mb3Jlc3VsdDsKKwkJc3RydWN0IGhmYTM4NHhfQ2hJbmZvUmVzdWx0U3ViICpyZXN1bHQ7CisJCXN0cnVjdCBoZmEzODR4X0NoSW5mb1Jlc3VsdFN1YiAqY2hpbmZvcmVzdWx0OwogCQlpbnQgY2hhbjsKIAogCQlpZiAoIShody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMuc2NhbmNoYW5uZWxzICYgKDEgPDwgaSkpKQpAQCAtMTE3MCwxOCArMTE3MSwxOCBAQAogCiB2b2lkIHByaXNtMnN0YV9wcm9jZXNzaW5nX2RlZmVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKIHsKLQloZmEzODR4X3QgKmh3ID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBoZmEzODR4LCBsaW5rX2JoKTsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBody0+d2xhbmRldjsKLQloZmEzODR4X2J5dGVzdHIzMl90IHNzaWQ7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBoZmEzODR4LCBsaW5rX2JoKTsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IGh3LT53bGFuZGV2OworCXN0cnVjdCBoZmEzODR4X2J5dGVzdHIzMiBzc2lkOwogCWludCByZXN1bHQ7CiAKIAkvKiBGaXJzdCBsZXQncyBwcm9jZXNzIHRoZSBhdXRoIGZyYW1lcyAqLwogCXsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkJaGZhMzg0eF9JbmZGcmFtZV90ICppbmY7CisJCXN0cnVjdCBoZmEzODR4X0luZkZyYW1lICppbmY7CiAKIAkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmaHctPmF1dGhxKSkpIHsKLQkJCWluZiA9IChoZmEzODR4X0luZkZyYW1lX3QgKikgc2tiLT5kYXRhOworCQkJaW5mID0gKHN0cnVjdCBoZmEzODR4X0luZkZyYW1lICopc2tiLT5kYXRhOwogCQkJcHJpc20yc3RhX2luZl9hdXRocmVxX2RlZmVyKHdsYW5kZXYsIGluZik7CiAJCX0KIApAQCAtMTI1Niw4ICsxMjU3LDggQEAKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQlwcmlzbTJtZ210X2J5dGVzdHIycHN0cigKLQkJCQkJKHN0cnVjdCBoZmEzODR4X2J5dGVzdHIgKikgJnNzaWQsCi0JCQkJCShwODAyMTFwc3RyZF90ICopICZ3bGFuZGV2LT5zc2lkKTsKKwkJCQkJKHN0cnVjdCBoZmEzODR4X2J5dGVzdHIgKikmc3NpZCwKKwkJCQkJKHN0cnVjdCBwODAyMTFwc3RyZCAqKSZ3bGFuZGV2LT5zc2lkKTsKIAogCQkJLyogQ29sbGVjdCB0aGUgcG9ydCBzdGF0dXMgKi8KIAkJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcxNihodywKQEAgLTEzMzcsOCArMTMzOCw4IEBACiAJCQkJIEhGQTM4NHhfUklEX0NVUlJFTlRTU0lELCByZXN1bHQpOwogCQkJcmV0dXJuOwogCQl9Ci0JCXByaXNtMm1nbXRfYnl0ZXN0cjJwc3RyKChzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICopICZzc2lkLAotCQkJCQkocDgwMjExcHN0cmRfdCAqKSAmd2xhbmRldi0+c3NpZCk7CisJCXByaXNtMm1nbXRfYnl0ZXN0cjJwc3RyKChzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICopJnNzaWQsCisJCQkJCShzdHJ1Y3QgcDgwMjExcHN0cmQgKikmd2xhbmRldi0+c3NpZCk7CiAKIAkJaHctPmxpbmtfc3RhdHVzID0gSEZBMzg0eF9MSU5LX0NPTk5FQ1RFRDsKIAkJbmV0aWZfY2Fycmllcl9vbih3bGFuZGV2LT5uZXRkZXYpOwpAQCAtMTM5MCw3ICsxMzkxLDcgQEAKIAkJICogRGlzYWJsZSBUcmFuc21pdHMsIElnbm9yZSByZWNlaXZlcyBvZiBkYXRhIGZyYW1lcwogCQkgKi8KIAkJaWYgKGh3LT5qb2luX2FwICYmIC0taHctPmpvaW5fcmV0cmllcyA+IDApIHsKLQkJCWhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YV90IGpvaW5yZXE7CisJCQlzdHJ1Y3QgaGZhMzg0eF9Kb2luUmVxdWVzdF9kYXRhIGpvaW5yZXE7CiAKIAkJCWpvaW5yZXEgPSBody0+am9pbnJlcTsKIAkJCS8qIFNlbmQgdGhlIGpvaW4gcmVxdWVzdCAqLwpAQCAtMTQzOCwxMCArMTQzOSwxMCBAQAogICogQ2FsbCBjb250ZXh0OgogICoJaW50ZXJydXB0CiAgKi8KLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfbGlua3N0YXR1cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgICBoZmEzODR4X0luZkZyYW1lX3QgKmluZikKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfbGlua3N0YXR1cyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICAgIHN0cnVjdCBoZmEzODR4X0luZkZyYW1lICppbmYpCiB7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAogCWh3LT5saW5rX3N0YXR1c19uZXcgPSBsZTE2X3RvX2NwdShpbmYtPmluZm8ubGlua3N0YXR1cy5saW5rc3RhdHVzKTsKIApAQCAtMTQ2NiwxMSArMTQ2NywxMSBAQAogICogQ2FsbCBjb250ZXh0OgogICoJaW50ZXJydXB0CiAgKi8KLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfYXNzb2NzdGF0dXMod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgICAgIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKQorc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9hc3NvY3N0YXR1cyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OwotCWhmYTM4NHhfQXNzb2NTdGF0dXNfdCByZWM7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eF9Bc3NvY1N0YXR1cyByZWM7CiAJaW50IGk7CiAKIAltZW1jcHkoJnJlYywgJmluZi0+aW5mby5hc3NvY3N0YXR1cywgc2l6ZW9mKHJlYykpOwpAQCAtMTUyNywxMCArMTUyOCwxMCBAQAogICoJaW50ZXJydXB0CiAgKgogICovCi1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2F1dGhyZXEod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpCitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2F1dGhyZXEoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKCppbmYpKTsKQEAgLTE1NDIsMTEgKzE1NDMsMTEgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfYXV0aHJlcV9kZWZlcih3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJCWhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKQorc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9hdXRocmVxX2RlZmVyKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCQlzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OwotCWhmYTM4NHhfYXV0aGVudGljYXRlU3RhdGlvbl9kYXRhX3QgcmVjOworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHhfYXV0aGVudGljYXRlU3RhdGlvbl9kYXRhIHJlYzsKIAogCWludCBpLCBhZGRlZCwgcmVzdWx0LCBjbnQ7CiAJdTggKmFkZHI7CkBAIC0xNzE2LDEwICsxNzE3LDEwIEBACiAgKiBDYWxsIGNvbnRleHQ6CiAgKglpbnRlcnJ1cHQKICAqLwotc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9wc3VzZXJjbnQod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgICBoZmEzODR4X0luZkZyYW1lX3QgKmluZikKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfcHN1c2VyY250KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAKIAlody0+cHN1c2VyY291bnQgPSBsZTE2X3RvX2NwdShpbmYtPmluZm8ucHN1c2VyY250LnVzZXJjbnQpOwogfQpAQCAtMTc0MSw3ICsxNzQyLDcgQEAKICAqIENhbGwgY29udGV4dDoKICAqCWludGVycnVwdAogICovCi12b2lkIHByaXNtMnN0YV9ldl9pbmZvKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpCit2b2lkIHByaXNtMnN0YV9ldl9pbmZvKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKQogewogCWluZi0+aW5mb3R5cGUgPSBsZTE2X3RvX2NwdShpbmYtPmluZm90eXBlKTsKIAkvKiBEaXNwYXRjaCAqLwpAQCAtMTgwOCw3ICsxODA5LDcgQEAKICAqIENhbGwgY29udGV4dDoKICAqCWludGVycnVwdAogICovCi12b2lkIHByaXNtMnN0YV9ldl90eGV4Yyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUxNiBzdGF0dXMpCit2b2lkIHByaXNtMnN0YV9ldl90eGV4YyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTE2IHN0YXR1cykKIHsKIAlwcl9kZWJ1ZygiVHhFeGMgc3RhdHVzPTB4JXguXG4iLCBzdGF0dXMpOwogfQpAQCAtMTgyOSw3ICsxODMwLDcgQEAKICAqIENhbGwgY29udGV4dDoKICAqCWludGVycnVwdAogICovCi12b2lkIHByaXNtMnN0YV9ldl90eCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUxNiBzdGF0dXMpCit2b2lkIHByaXNtMnN0YV9ldl90eChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTE2IHN0YXR1cykKIHsKIAlwcl9kZWJ1ZygiVHggQ29tcGxldGUsIHN0YXR1cz0weCUwNHhcbiIsIHN0YXR1cyk7CiAJLyogdXBkYXRlIGxpbnV4IG5ldHdvcmsgc3RhdHMgKi8KQEAgLTE4NTIsNyArMTg1Myw3IEBACiAgKiBDYWxsIGNvbnRleHQ6CiAgKglpbnRlcnJ1cHQKICAqLwotdm9pZCBwcmlzbTJzdGFfZXZfYWxsb2Mod2xhbmRldmljZV90ICp3bGFuZGV2KQordm9pZCBwcmlzbTJzdGFfZXZfYWxsb2Moc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJbmV0aWZfd2FrZV9xdWV1ZSh3bGFuZGV2LT5uZXRkZXYpOwogfQpAQCAtMTg2MCwxNCArMTg2MSwxNCBAQAogLyoKICogY3JlYXRlX3dsYW4KICoKLSogQ2FsbGVkIGF0IG1vZHVsZSBpbml0IHRpbWUuICBUaGlzIGNyZWF0ZXMgdGhlIHdsYW5kZXZpY2VfdCBzdHJ1Y3R1cmUKKyogQ2FsbGVkIGF0IG1vZHVsZSBpbml0IHRpbWUuICBUaGlzIGNyZWF0ZXMgdGhlIHN0cnVjdCB3bGFuZGV2aWNlIHN0cnVjdHVyZQogKiBhbmQgaW5pdGlhbGl6ZXMgaXQgd2l0aCByZWxldmFudCBiaXRzLgogKgogKiBBcmd1bWVudHM6CiAqCW5vbmUKICoKICogUmV0dXJuczoKLSoJdGhlIGNyZWF0ZWQgd2xhbmRldmljZV90IHN0cnVjdHVyZS4KKyoJdGhlIGNyZWF0ZWQgc3RydWN0IHdsYW5kZXZpY2Ugc3RydWN0dXJlLgogKgogKiBTaWRlIGVmZmVjdHM6CiAqCWFsc28gYWxsb2NhdGVzIHRoZSBwcml2L2h3IHN0cnVjdHVyZXMuCkBAIC0xODc2LDE0ICsxODc3LDE0IEBACiAqCXByb2Nlc3MgdGhyZWFkCiAqCiAqLwotc3RhdGljIHdsYW5kZXZpY2VfdCAqY3JlYXRlX3dsYW4odm9pZCkKK3N0YXRpYyBzdHJ1Y3Qgd2xhbmRldmljZSAqY3JlYXRlX3dsYW4odm9pZCkKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBOVUxMOwotCWhmYTM4NHhfdCAqaHcgPSBOVUxMOworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSBOVUxMOwogCiAJLyogQWxsb2Mgb3VyIHN0cnVjdHVyZXMgKi8KLQl3bGFuZGV2ID0ga3phbGxvYyhzaXplb2Yod2xhbmRldmljZV90KSwgR0ZQX0tFUk5FTCk7Ci0JaHcgPSBremFsbG9jKHNpemVvZihoZmEzODR4X3QpLCBHRlBfS0VSTkVMKTsKKwl3bGFuZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdsYW5kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlodyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoZmEzODR4KSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIXdsYW5kZXYgfHwgIWh3KSB7CiAJCWtmcmVlKHdsYW5kZXYpOwpAQCAtMTkxMywxMSArMTkxNCwxMSBAQAogCiB2b2lkIHByaXNtMnN0YV9jb21tc3F1YWxfZGVmZXIoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQogewotCWhmYTM4NHhfdCAqaHcgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGhmYTM4NHgsIGNvbW1zcXVhbF9iaCk7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gaHctPndsYW5kZXY7Ci0JaGZhMzg0eF9ieXRlc3RyMzJfdCBzc2lkOworCXN0cnVjdCBoZmEzODR4ICpodyA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaGZhMzg0eCwgY29tbXNxdWFsX2JoKTsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IGh3LT53bGFuZGV2OworCXN0cnVjdCBoZmEzODR4X2J5dGVzdHIzMiBzc2lkOwogCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWliZ2V0IG1zZzsKLQlwODAyMTFpdGVtX3VpbnQzMl90ICptaWJpdGVtID0gKHA4MDIxMWl0ZW1fdWludDMyX3QgKikKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgKm1pYml0ZW0gPSAoc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyICopCiAJCQkJCQkmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhOwogCWludCByZXN1bHQgPSAwOwogCkBAIC0xOTUwLDcgKzE5NTEsNyBAQAogCS8qIEdldCB0aGUgc2lnbmFsIHJhdGUgKi8KIAltc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJnZXQ7CiAJbWliaXRlbS0+ZGlkID0gRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCAqKSAmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCAqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkgewogCQlwcl9kZWJ1ZygiZ2V0IHNpZ25hbCByYXRlIGZhaWxlZCwgcmVzdWx0ID0gJWRcbiIsCkBAIC0xOTkzLDggKzE5OTQsOCBAQAogCQkJIEhGQTM4NHhfUklEX0NVUlJFTlRTU0lELCByZXN1bHQpOwogCQlyZXR1cm47CiAJfQotCXByaXNtMm1nbXRfYnl0ZXN0cjJwc3RyKChzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICopICZzc2lkLAotCQkJCShwODAyMTFwc3RyZF90ICopICZ3bGFuZGV2LT5zc2lkKTsKKwlwcmlzbTJtZ210X2J5dGVzdHIycHN0cigoc3RydWN0IGhmYTM4NHhfYnl0ZXN0ciAqKSZzc2lkLAorCQkJCShzdHJ1Y3QgcDgwMjExcHN0cmQgKikmd2xhbmRldi0+c3NpZCk7CiAKIAkvKiBSZXNjaGVkdWxlIHRpbWVyICovCiAJbW9kX3RpbWVyKCZody0+Y29tbXNxdWFsX3RpbWVyLCBqaWZmaWVzICsgSFopOwpAQCAtMjAwMiw3ICsyMDAzLDcgQEAKIAogdm9pZCBwcmlzbTJzdGFfY29tbXNxdWFsX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQloZmEzODR4X3QgKmh3ID0gKGhmYTM4NHhfdCAqKSBkYXRhOworCXN0cnVjdCBoZmEzODR4ICpodyA9IChzdHJ1Y3QgaGZhMzg0eCAqKWRhdGE7CiAKIAlzY2hlZHVsZV93b3JrKCZody0+Y29tbXNxdWFsX2JoKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnVzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ydXNiLmMKaW5kZXggYjI2ZDA5Zi4uYmZiNmIwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ydXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ydXNiLmMKQEAgLTQ3LDExICs0NywxMSBAQAogCVBSSVNNX0RFVigweDBiYjIsIDB4MDMwMiwgIkFtYml0IE1pY3Jvc3lzdGVtcyBDb3JwLiIpLAogCVBSSVNNX0RFVigweDkwMTYsIDB4MTgyZCwgIlNpdGVjb20gV0wtMDIyIDgwMi4xMWIgVVNCIEFkYXB0ZXIiKSwKIAlQUklTTV9ERVYoMHgwNTQzLCAweDBmMDEsCi0JCSJWaWV3U29uaWMgQWlyc3luYyBVU0IgQWRhcHRlciAxMU1icHMgKFByaXNtMi41KSIpLAorCQkgICJWaWV3U29uaWMgQWlyc3luYyBVU0IgQWRhcHRlciAxMU1icHMgKFByaXNtMi41KSIpLAogCVBSSVNNX0RFVigweDA2N2MsIDB4MTAyMiwKLQkJIlNpZW1lbnMgU3BlZWRTdHJlYW0gMTAyMiAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpLAorCQkgICJTaWVtZW5zIFNwZWVkU3RyZWFtIDEwMjIgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKSwKIAlQUklTTV9ERVYoMHgwNDlmLCAweDAwMzMsCi0JCSJDb21wYXEvSW50ZWwgVzEwMCBQUk8vV2lyZWxlc3MgMTFNYnBzIG11bHRpcG9ydCBXTEFOIEFkYXB0ZXIiKSwKKwkJICAiQ29tcGFxL0ludGVsIFcxMDAgUFJPL1dpcmVsZXNzIDExTWJwcyBtdWx0aXBvcnQgV0xBTiBBZGFwdGVyIiksCiAJeyB9IC8qIHRlcm1pbmF0b3IgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgdXNiX3ByaXNtX3RibCk7CkBAIC02MSw4ICs2MSw4IEBACiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKIAotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IE5VTEw7Ci0JaGZhMzg0eF90ICpodyA9IE5VTEw7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBOVUxMOworCXN0cnVjdCBoZmEzODR4ICpodyA9IE5VTEw7CiAJaW50IHJlc3VsdCA9IDA7CiAKIAlkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CkBAIC03NCw3ICs3NCw3IEBACiAJfQogCWh3ID0gd2xhbmRldi0+cHJpdjsKIAotCWlmICh3bGFuX3NldHVwKHdsYW5kZXYsICYoaW50ZXJmYWNlLT5kZXYpKSAhPSAwKSB7CisJaWYgKHdsYW5fc2V0dXAod2xhbmRldiwgJmludGVyZmFjZS0+ZGV2KSAhPSAwKSB7CiAJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAid2xhbl9zZXR1cCgpIGZhaWxlZC5cbiIpOwogCQlyZXN1bHQgPSAtRUlPOwogCQlnb3RvIGZhaWxlZDsKQEAgLTg3LDcgKzg3LDcgQEAKIAkvKiBSZWdpc3RlciB0aGUgd2xhbmRldiwgdGhpcyBnZXRzIHVzIGEgbmFtZSBhbmQgcmVnaXN0ZXJzIHRoZQogCSAqIGxpbnV4IG5ldGRldmljZS4KIAkgKi8KLQlTRVRfTkVUREVWX0RFVih3bGFuZGV2LT5uZXRkZXYsICYoaW50ZXJmYWNlLT5kZXYpKTsKKwlTRVRfTkVUREVWX0RFVih3bGFuZGV2LT5uZXRkZXYsICZpbnRlcmZhY2UtPmRldik7CiAKIAkvKiBEbyBhIGNoaXAtbGV2ZWwgcmVzZXQgb24gdGhlIE1BQyAqLwogCWlmIChwcmlzbTJfZG9yZXNldCkgewpAQCAtMTM0LDE1ICsxMzQsMTUgQEAKIAogc3RhdGljIHZvaWQgcHJpc20yc3RhX2Rpc2Nvbm5lY3RfdXNiKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCiB7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2OwogCi0Jd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QgKil1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7Ci0JaWYgKHdsYW5kZXYgIT0gTlVMTCkgeworCXdsYW5kZXYgPSAoc3RydWN0IHdsYW5kZXZpY2UgKil1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJaWYgKHdsYW5kZXYpIHsKIAkJTElTVF9IRUFEKGNsZWFubGlzdCk7Ci0JCWhmYTM4NHhfdXNiY3RseF90ICpjdGx4LCAqdGVtcDsKKwkJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseCwgKnRlbXA7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkJaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAKIAkJaWYgKCFodykKIAkJCWdvdG8gZXhpdDsKQEAgLTIxNiwxMiArMjE2LDEyIEBACiAKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgcHJpc20yc3RhX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKLQkJCQlwbV9tZXNzYWdlX3QgbWVzc2FnZSkKKwkJCSAgICAgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCiB7Ci0JaGZhMzg0eF90ICpodyA9IE5VTEw7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IE5VTEw7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXY7CiAKLQl3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCAqKXVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKwl3bGFuZGV2ID0gKHN0cnVjdCB3bGFuZGV2aWNlICopdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwogCWlmICghd2xhbmRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTI0MSwxMCArMjQxLDEwIEBACiBzdGF0aWMgaW50IHByaXNtMnN0YV9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQloZmEzODR4X3QgKmh3ID0gTlVMTDsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gTlVMTDsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldjsKIAotCXdsYW5kZXYgPSAod2xhbmRldmljZV90ICopdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCXdsYW5kZXYgPSAoc3RydWN0IHdsYW5kZXZpY2UgKil1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CiAJaWYgKCF3bGFuZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYwppbmRleCBkNTZlZjE0Li4wYzc4NDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYwpAQCAtNjIsNyArNjIsNiBAQAogCXVuc2lnbmVkIHNob3J0IE1vZGVObyA9IG1vZGVubzsKIAl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCA9IDAsIENsb2NrSW5kZXggPSAwOwogCXVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCA9IDA7Ci0JaW50IENsb2NrOwogCiAJSW5pdFRvMzMwUG9pbnRlcihId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlLCBYR0lfUHIpOwogCkBAIC03Myw5ICs3Miw3IEBACiAKIAlDbG9ja0luZGV4ID0gWEdJMzMwX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVFZDTEs7CiAKLQlDbG9jayA9IFhHSV9WQ0xLRGF0YVtDbG9ja0luZGV4XS5DTE9DSyAqIDEwMDA7Ci0KLQlyZXR1cm4gQ2xvY2s7CisJcmV0dXJuIFhHSV9WQ0xLRGF0YVtDbG9ja0luZGV4XS5DTE9DSyAqIDEwMDA7CiB9CiAKIHN0YXRpYyBpbnQgWEdJZmJfbW9kZV9yYXRlX3RvX2RkYXRhKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqWEdJX1ByLApAQCAtMTIyNyw3ICsxMjI0LDcgQEAKIAl1bnNpZ25lZCBpbnQgdnRvdGFsID0gMDsKIAl1bnNpZ25lZCBpbnQgZHJhdGUgPSAwLCBocmF0ZSA9IDA7CiAJaW50IGZvdW5kX21vZGUgPSAwOwotCWludCByZWZyZXNoX3JhdGUsIHNlYXJjaF9pZHg7CisJaW50IHNlYXJjaF9pZHg7CiAKIAlpZiAoKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9NQVNLKSA9PSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEKSB7CiAJCXZ0b3RhbCA9IHZhci0+dXBwZXJfbWFyZ2luICsgdmFyLT55cmVzICsgdmFyLT5sb3dlcl9tYXJnaW4KQEAgLTEyNjMsMTAgKzEyNjAsNiBAQAogCQl4Z2lmYl9pbmZvLT5yZWZyZXNoX3JhdGUgPSA2MDsKIAl9CiAKLQkvKiBDYWxjdWxhdGlvbiB3cm9uZyBmb3IgMTAyNHg2MDAgLSBmb3JjZSBpdCB0byA2MEh6ICovCi0JaWYgKCh2YXItPnhyZXMgPT0gMTAyNCkgJiYgKHZhci0+eXJlcyA9PSA2MDApKQotCQlyZWZyZXNoX3JhdGUgPSA2MDsKLQogCXNlYXJjaF9pZHggPSAwOwogCXdoaWxlICgoWEdJYmlvc19tb2RlW3NlYXJjaF9pZHhdLm1vZGVfbm8gIT0gMCkgJiYKIAkJKFhHSWJpb3NfbW9kZVtzZWFyY2hfaWR4XS54cmVzIDw9IHZhci0+eHJlcykpIHsKQEAgLTIwODUsNyArMjA3OCw3IEBACiB7CiAJY2hhciAqb3B0aW9uID0gTlVMTDsKIAotCWlmIChmb3JjZWNydDJ0eXBlICE9IE5VTEwpCisJaWYgKGZvcmNlY3J0MnR5cGUpCiAJCVhHSWZiX3NlYXJjaF9jcnQydHlwZShmb3JjZWNydDJ0eXBlKTsKIAlpZiAoZmJfZ2V0X29wdGlvbnMoInhnaWZiIiwgJm9wdGlvbikpCiAJCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3NldG1vZGUuYyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9zZXRtb2RlLmMKaW5kZXggNTBjOGVhNC4uZDgwMTBjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3NldG1vZGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfc2V0bW9kZS5jCkBAIC0yMTQsNyArMjE0LDcgQEAKIAkJaWYgKCEocFZCSW5mby0+VkJJbmZvICYgVFZTZXRQQUwpICYmCiAJCSAgICAobW9kZWZsYWcgJiBOb1N1cHBvcnRTaW11VFYpICYmCiAJCSAgICAocFZCSW5mby0+VkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpICYmCi0JCSAgICAoIShwVkJJbmZvLT5WQkluZm8gJiBTZXROb3RTaW11TW9kZSkpKQorCQkgICAgIShwVkJJbmZvLT5WQkluZm8gJiBTZXROb3RTaW11TW9kZSkpCiAJCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE2NDcsNyArMTY0Nyw2IEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciBYR0lfR2V0VkNMS1B0cih1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCiAJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0KIAl1bnNpZ25lZCBzaG9ydCBpbmRleCwgbW9kZWZsYWc7CiAJdW5zaWduZWQgY2hhciB0ZW1wYWw7CiAKQEAgLTE2NTUsNyArMTY1NCw3IEBACiAJbW9kZWZsYWcgPSBYR0kzMzBfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7CiAKIAlpZiAoKHBWQkluZm8tPlNldEZsYWcgJiBQcm9ncmFtbWluZ0NSVDIpICYmCi0JICAgICghKHBWQkluZm8tPkxDREluZm8gJiBFbmFibGVTY2FsaW5nTENEKSkpIHsgLyoge0xDREEvTENEQn0gKi8KKwkgICAgIShwVkJJbmZvLT5MQ0RJbmZvICYgRW5hYmxlU2NhbGluZ0xDRCkpIHsgLyoge0xDREEvTENEQn0gKi8KIAkJaW5kZXggPSBYR0lfR2V0TENEQ2FwUHRyKHBWQkluZm8pOwogCQl0ZW1wYWwgPSBwVkJJbmZvLT5MQ0RDYXBMaXN0W2luZGV4XS5MQ0RfVkNMSzsKIApAQCAtMTY3OCw3ICsxNjc3LDYgQEAKIAkJCQkJaWYgKCEobW9kZWZsYWcgJiBDaGFyeDhEb3QpKQogCQkJCQkJdGVtcGFsID0gVFZDTEtCQVNFXzMxNSArCiAJCQkJCQkJCUhpVFZUZXh0VkNMSzsKLQogCQkJCX0KIAkJCQlyZXR1cm4gdGVtcGFsOwogCQkJfQpAQCAtMTcxNiw3ICsxNzE0LDcgQEAKIHsKIAlpZiAocFZCSW5mby0+VkJUeXBlICYgKFZCX1NJUzMwMSB8IFZCX1NJUzMwMUIgfCBWQl9TSVMzMDJCCiAJCQl8IFZCX1NJUzMwMUxWIHwgVkJfU0lTMzAyTFYgfCBWQl9YR0kzMDFDKSkgewotCQlpZiAoKCEocFZCSW5mby0+VkJJbmZvICYgWEdJX1NldENSVDJUb0xDREEpKSAmJgorCQlpZiAoIShwVkJJbmZvLT5WQkluZm8gJiBYR0lfU2V0Q1JUMlRvTENEQSkgJiYKIAkJICAgIChwVkJJbmZvLT5TZXRGbGFnICYgUHJvZ3JhbW1pbmdDUlQyKSkgewogCQkJKmRpXzAgPSBYR0lfVkJWQ0xLRGF0YVt0ZW1wYWxdLlBhcnQ0X0E7CiAJCQkqZGlfMSA9IFhHSV9WQlZDTEtEYXRhW3RlbXBhbF0uUGFydDRfQjsKQEAgLTE3NDEsOCArMTczOSw4IEBACiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzZDQsIDB4MzEsIH4weDMwLAogCQkJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTAgKiBpKSk7Ci0JCWlmICgoIShwVkJJbmZvLT5WQkluZm8gJiBYR0lfU2V0Q1JUMlRvTENEQSkpCi0JCQkJJiYgKCEocFZCSW5mby0+VkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSkgeworCQlpZiAoIShwVkJJbmZvLT5WQkluZm8gJiBYR0lfU2V0Q1JUMlRvTENEQSkgJiYKKwkJICAgICEocFZCSW5mby0+VkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSB7CiAJCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MmUsIGRpXzApOwogCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDJmLCBkaV8xKTsKIAkJfSBlbHNlIHsKQEAgLTE5MTUsNyArMTkxMyw3IEBACiAJCX0KIAl9CiAKLQlpZiAocFZCSW5mby0+VkJUeXBlICYgKFZCX1NJUzMwMUxWfFZCX1NJUzMwMkxWfFZCX1hHSTMwMUMpKSB7CisJaWYgKHBWQkluZm8tPlZCVHlwZSAmIChWQl9TSVMzMDFMViB8IFZCX1NJUzMwMkxWIHwgVkJfWEdJMzAxQykpIHsKIAkJaWYgKHRlbXAgJiBTZXRZUGJQcikgewogCQkJLyogc2hhbXBvbyBhZGQgZm9yIG5ldyBzY3JhdGNoICovCiAJCQl0ZW1wID0geGdpZmJfcmVnX2dldChwVkJJbmZvLT5QM2Q0LCAweDM1KTsKQEAgLTE5ODYsNyArMTk4NCw3IEBACiAJfQogCiAJaWYgKCEodGVtcGJ4ICYgRGlzYWJsZUNSVDJEaXNwbGF5KSkgewotCQlpZiAoKCEodGVtcGJ4ICYgRHJpdmVyTW9kZSkpIHx8ICghKG1vZGVmbGFnICYgQ1JUMk1vZGUpKSkgeworCQlpZiAoISh0ZW1wYnggJiBEcml2ZXJNb2RlKSB8fCAhKG1vZGVmbGFnICYgQ1JUMk1vZGUpKSB7CiAJCQlpZiAoISh0ZW1wYnggJiBYR0lfU2V0Q1JUMlRvTENEQSkpCiAJCQkJdGVtcGJ4IHw9IChTZXRJblNsYXZlTW9kZSB8IFNldFNpbXVTY2FuTW9kZSk7CiAJCX0KQEAgLTIxMzIsNyArMjEzMCw3IEBACiAKIAlpZiAoKHBWQkluZm8tPkxDRFJlc0luZm8gPT0gUGFuZWxfMTQwMHgxMDUwKSAmJgogCSAgICAocFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvTENEKSAmJiAocmVzaW5mbyA9PSA5KSAmJgotCSAgICAoISh0ZW1wYnggJiBFbmFibGVTY2FsaW5nTENEKSkpCisJICAgICEodGVtcGJ4ICYgRW5hYmxlU2NhbGluZ0xDRCkpCiAJCS8qCiAJCSAqIHNldCB0byBjZW50ZXIgaW4gMTI4MHgxMDI0IExDREIKIAkJICogZm9yIFBhbmVsXzE0MDB4MTA1MApAQCAtMjI0NSw3ICsyMjQzLDYgQEAKIAogCQkvKiBDUiBCNFsxXSAqLwogCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzZDQsIDB4QjQsIH4weDAyLCB0ZW1wKTsKLQogCX0KIAogCXRlbXAgPSB4Z2lmYl9yZWdfZ2V0KHBWQkluZm8tPlAzZDQsIDB4NDgpOwpAQCAtMjI3NCw3ICsyMjcxLDYgQEAKIAogCQkvKiBDUiBCNFsxXSAqLwogCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzZDQsIDB4QjQsIH4weDAyLCB0ZW1wKTsKLQogCX0KIAl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzZDQsIDB4QjQsIH50ZW1wYmgwLCB0ZW1wYmwwKTsKIApAQCAtMjI5MSw3ICsyMjg3LDYgQEAKIAkJc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqcFhHSUhXREUsCiAJCXN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLQogCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UDNjNCwgMHgwMSwgMHhERiwgMHgwMCk7CiAJaWYgKHBYR0lIV0RFLT5qQ2hpcFR5cGUgPT0gWEcyMSkgewogCQlpZiAocFZCSW5mby0+SUZfREVGX0xWRFMgPT0gMSkgewpAQCAtMjMxMCw3ICsyMzA1LDYgQEAKIAkJCS8qIERWTy9EVkkgc2lnbmFsIG9uICovCiAJCQlYR0lfWEcyMUJMU2lnbmFsVkREKDB4MjAsIDB4MjAsIHBWQkluZm8pOwogCQl9Ci0KIAl9CiAKIAlpZiAocFhHSUhXREUtPmpDaGlwVHlwZSA9PSBYRzI3KSB7CkBAIC0yMzMwLDcgKzIzMjQsNiBAQAogCQkJLyogRFZPL0RWSSBzaWduYWwgb24gKi8KIAkJCVhHSV9YRzI3QkxTaWduYWxWREQoMHgyMCwgMHgyMCwgcFZCSW5mbyk7CiAJCX0KLQogCX0KIH0KIApAQCAtMjMzOCw3ICsyMzMxLDYgQEAKIAkJc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqcFhHSUhXREUsCiAJCXN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLQogCWlmIChwWEdJSFdERS0+akNoaXBUeXBlID09IFhHMjEpIHsKIAkJaWYgKHBWQkluZm8tPklGX0RFRl9MVkRTID09IDEpIHsKIAkJCS8qIExWRFMgYmFja2xpZ2h0IG9mZiAqLwpAQCAtMjQ1NSw3ICsyNDQ3LDYgQEAKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJX0lzTENERHVhbExpbmsoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotCiAJaWYgKChwVkJJbmZvLT5WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgWEdJX1NldENSVDJUb0xDREEpKSAmJgogCQkJKHBWQkluZm8tPkxDREluZm8gJiBTZXRMQ0REdWFsTGluaykpIC8qIHNoYW1wb28wMTI5ICovCiAJCXJldHVybiAxOwpAQCAtMzkyMiw3ICszOTEzLDcgQEAKIAkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MlBvcnQsIGksIFRhcDRUaW1pbmdQdHItPlJlZ1tqXSk7CiAKIAlpZiAoKHBWQkluZm8tPlZCSW5mbyAmIFNldENSVDJUb1RWKSAmJgotCSAgICAoIShwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikpKSB7CisJICAgICEocFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pKSB7CiAJCS8qIFNldCBWZXJ0aWNhbCBTY2FsaW5nICovCiAJCVRhcDRUaW1pbmdQdHIgPSBYR0lfR2V0VGFwNFB0cigxLCBwVkJJbmZvKTsKIAkJZm9yIChpID0gMHhDMCwgaiA9IDA7IGkgPCAweEZGOyBpKyssIGorKykKQEAgLTM5MzIsNyArMzkyMyw3IEBACiAJfQogCiAJaWYgKChwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9UVikgJiYKLQkgICAgKCEocFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pKSkKKwkgICAgIShwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikpCiAJCS8qIEVuYWJsZSBWLlNjYWxpbmcgKi8KIAkJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4NEUsIH4weDE0LCAweDA0KTsKIAllbHNlCkBAIC00MTMyLDcgKzQxMjMsNiBAQAogCQlpZiAocFZCSW5mby0+VkJJbmZvICYgKFNldENSVDJUb1RWIHwgU2V0Q1JUMlRvSGlWaXNpb24pKSB7CiAJCQlpZiAocFZCSW5mby0+VkdBSERFID4gODAwKQogCQkJCXhnaWZiX3JlZ19vcihwVkJJbmZvLT5QYXJ0NFBvcnQsIDB4MUUsIDB4MDgpOwotCiAJCX0KIAkJdGVtcCA9IDB4MDAzNjsKIApAQCAtNDE0MSw5ICs0MTMxLDkgQEAKIAkJCQkJfCBUVlNldFlQYlByNTI1cCB8IFRWU2V0WVBiUHI3NTBwCiAJCQkJCXwgVFZTZXRIaVZpc2lvbikpKSB7CiAJCQkJdGVtcCB8PSAweDAwMDE7Ci0JCQkJaWYgKChwVkJJbmZvLT5WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkKLQkJCQkJCSYmICghKHBWQkluZm8tPlRWSW5mbwotCQkJCQkJCQkmIFRWU2ltdU1vZGUpKSkKKwkJCQlpZiAoKHBWQkluZm8tPlZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSAmJgorCQkJCQkJIShwVkJJbmZvLT5UVkluZm8KKwkJCQkJCQkJJiBUVlNpbXVNb2RlKSkKIAkJCQkJdGVtcCAmPSAofjB4MDAwMSk7CiAJCQl9CiAJCX0KQEAgLTQzODksNyArNDM3OSw2IEBACiAJCQkJCSh2YWx1ZSA8PCAyKSAmIDB4N0MpOwogCiAJZm9yICh0ZW1wID0gMCwgdmFsdWUgPSAwOyB0ZW1wIDwgMzsgdGVtcCsrKSB7Ci0KIAkJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2M0LCAweDMxLCB+MHgzMCwgdmFsdWUpOwogCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsCiAJCQkgICAgICAweDJCLCB4Z2lmYl9pbmZvLT5sdmRzX2RhdGEuVkNMS0RhdGExKTsKQEAgLTQ0MDksNyArNDM5OCw2IEBACiAKIAkJaW5iKHBWQkluZm8tPlAzZGEpOyAvKiByZXNldCAzZGEgKi8KIAl9Ci0KIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC00NDc2LDcgKzQ0NjQsNyBAQAogCiAJCWlmICgocFZCSW5mby0+VkJJbmZvICYKIAkJCShEaXNhYmxlQ1JUMkRpc3BsYXkgfCBTZXRTaW11U2Nhbk1vZGUpKSB8fAotCQkgICAgKCghKHBWQkluZm8tPlZCSW5mbyAmIFhHSV9TZXRDUlQyVG9MQ0RBKSkgJiYKKwkJICAgICghKHBWQkluZm8tPlZCSW5mbyAmIFhHSV9TZXRDUlQyVG9MQ0RBKSAmJgogCQkgICAgKHBWQkluZm8tPlZCSW5mbyAmCiAJCQkoU2V0Q1JUMlRvUkFNREFDIHwgU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvVFYpKSkpCiAJCQl4Z2lmYl9yZWdfb3IocFZCSW5mby0+UGFydDFQb3J0LCAweDAwLCAweDgwKTsKQEAgLTQ1ODcsNyArNDU3NSw3IEBACiAKIAlpZiAocFZCSW5mby0+VkJUeXBlICYgKFZCX1NJUzMwMUIgfCBWQl9TSVMzMDJCIHwgVkJfU0lTMzAxTFYKIAkJCXwgVkJfU0lTMzAyTFYgfCBWQl9YR0kzMDFDKSkgewotCQlpZiAoKCEocFZCSW5mby0+VkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSB8fCAocFZCSW5mby0+VFZJbmZvCisJCWlmICghKHBWQkluZm8tPlZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB8fCAocFZCSW5mby0+VFZJbmZvCiAJCQkJJiBUVlNpbXVNb2RlKSkgewogCQkJKnRlbXBieCArPSA4OwogCQkJKnRlbXBjbCArPSAxOwpAQCAtNDk4OCw4ICs0OTc2LDggQEAKIAlpZiAocFZCSW5mby0+VkJJbmZvICYgKFNldENSVDJUb1JBTURBQyB8IFNldENSVDJUb1RWIHwgU2V0Q1JUMlRvTENECiAJCQl8IFhHSV9TZXRDUlQyVG9MQ0RBKSkgewogCQl0ZW1wYWggJj0gKH4weDA4KTsKLQkJaWYgKChwVkJJbmZvLT5Nb2RlVHlwZSA9PSBNb2RlVkdBKSAmJiAoIShwVkJJbmZvLT5WQkluZm8KLQkJCQkmIFNldEluU2xhdmVNb2RlKSkpIHsKKwkJaWYgKChwVkJJbmZvLT5Nb2RlVHlwZSA9PSBNb2RlVkdBKSAmJiAhKHBWQkluZm8tPlZCSW5mbworCQkJCSYgU2V0SW5TbGF2ZU1vZGUpKSB7CiAJCQl0ZW1wYWggfD0gMHgwMTA7CiAJCX0KIAkJdGVtcGFoIHw9IDB4MDgwOwpAQCAtNTQxNiw3ICs1NDA0LDYgQEAKIAlpZiAoSHdEZXZpY2VFeHRlbnNpb24tPmpDaGlwVHlwZSA+PSBYRzIxKSB7CiAJCXRlbXAgPSB4Z2lmYl9yZWdfZ2V0KHBWQkluZm8tPlAzZDQsIDB4MzgpOwogCQlpZiAodGVtcCAmIDB4QTApIHsKLQogCQkJaWYgKEh3RGV2aWNlRXh0ZW5zaW9uLT5qQ2hpcFR5cGUgPT0gWEcyNykKIAkJCQlYR0lfU2V0WEcyN0NSVEMoUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBwVkJJbmZvKTsKIAkJCWVsc2UKQEAgLTU0ODYsNyArNTQ3Myw3IEBACiAJCVhHSV9EaXNhYmxlQnJpZGdlKHhnaWZiX2luZm8sIEh3RGV2aWNlRXh0ZW5zaW9uLCBwVkJJbmZvKTsKIAogCQlpZiAocFZCSW5mby0+VkJJbmZvICYgKFNldFNpbXVTY2FuTW9kZSB8IFhHSV9TZXRDUlQyVG9MQ0RBKSB8fAotCQkJKCEocFZCSW5mby0+VkJJbmZvICYgU3dpdGNoQ1JUMikpKSB7CisJCQkhKHBWQkluZm8tPlZCSW5mbyAmIFN3aXRjaENSVDIpKSB7CiAJCQlYR0lfU2V0Q1JUMUdyb3VwKHhnaWZiX2luZm8sIEh3RGV2aWNlRXh0ZW5zaW9uLCBNb2RlTm8sCiAJCQkJCU1vZGVJZEluZGV4LCBwVkJJbmZvKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvaXNjc2kvY3hnYml0L2N4Z2JpdF9jbS5jIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvY3hnYml0L2N4Z2JpdF9jbS5jCmluZGV4IDBhZTBiMTMuLjJmYjFiZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2N4Z2JpdC9jeGdiaXRfY20uYworKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9jeGdiaXQvY3hnYml0X2NtLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CiAKKyNpbmNsdWRlIDxsaWJjeGdiX2NtLmg+CiAjaW5jbHVkZSAiY3hnYml0LmgiCiAjaW5jbHVkZSAiY2xpcF90YmwuaCIKIApAQCAtNzIsMTUgKzczLDYgQEAKIAlyZXR1cm4gd3Jfd2FpdHAtPnJldDsKIH0KIAotLyogUmV0dXJucyB3aGV0aGVyIGEgQ1BMIHN0YXR1cyBjb252ZXlzIG5lZ2F0aXZlIGFkdmljZS4KLSAqLwotc3RhdGljIGludCBjeGdiaXRfaXNfbmVnX2Fkdih1bnNpZ25lZCBpbnQgc3RhdHVzKQotewotCXJldHVybiBzdGF0dXMgPT0gQ1BMX0VSUl9SVFhfTkVHX0FEVklDRSB8fAotCQlzdGF0dXMgPT0gQ1BMX0VSUl9QRVJTSVNUX05FR19BRFZJQ0UgfHwKLQkJc3RhdHVzID09IENQTF9FUlJfS0VFUEFMVl9ORUdfQURWSUNFOwotfQotCiBzdGF0aWMgaW50IGN4Z2JpdF9ucF9oYXNoZm4oY29uc3Qgc3RydWN0IGN4Z2JpdF9ucCAqY25wKQogewogCXJldHVybiAoKHVuc2lnbmVkIGxvbmcpY25wID4+IDEwKSAmIChOUF9JTkZPX0hBU0hfU0laRSAtIDEpOwpAQCAtNjIzLDIxICs2MTUsMTQgQEAKIHN0YXRpYyB2b2lkIGN4Z2JpdF9zZW5kX2hhbGZjbG9zZShzdHJ1Y3QgY3hnYml0X3NvY2sgKmNzaykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBjcGxfY2xvc2VfY29uX3JlcSAqcmVxOwotCXVuc2lnbmVkIGludCBsZW4gPSByb3VuZHVwKHNpemVvZihzdHJ1Y3QgY3BsX2Nsb3NlX2Nvbl9yZXEpLCAxNik7CisJdTMyIGxlbiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCBjcGxfY2xvc2VfY29uX3JlcSksIDE2KTsKIAogCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOwogCWlmICghc2tiKQogCQlyZXR1cm47CiAKLQlyZXEgPSAoc3RydWN0IGNwbF9jbG9zZV9jb25fcmVxICopX19za2JfcHV0KHNrYiwgbGVuKTsKLQltZW1zZXQocmVxLCAwLCBsZW4pOwotCi0Jc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9EQVRBLCBjc2stPnR4cV9pZHgpOwotCUlOSVRfVFBfV1IocmVxLCBjc2stPnRpZCk7Ci0JT1BDT0RFX1RJRChyZXEpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfQ0xPU0VfQ09OX1JFUSwKLQkJCQkJCSAgICBjc2stPnRpZCkpOwotCXJlcS0+cnN2ZCA9IDA7CisJY3hnYl9ta19jbG9zZV9jb25fcmVxKHNrYiwgbGVuLCBjc2stPnRpZCwgY3NrLT50eHFfaWR4LAorCQkJICAgICAgTlVMTCwgTlVMTCk7CiAKIAljeGdiaXRfc2tjYl9mbGFncyhza2IpIHw9IFNLQ0JGX1RYX0ZMQUdfQ09NUEw7CiAJX19za2JfcXVldWVfdGFpbCgmY3NrLT50eHEsIHNrYik7CkBAIC02NjIsOSArNjQ3LDggQEAKIAogc3RhdGljIGludCBjeGdiaXRfc2VuZF9hYm9ydF9yZXEoc3RydWN0IGN4Z2JpdF9zb2NrICpjc2spCiB7Ci0Jc3RydWN0IGNwbF9hYm9ydF9yZXEgKnJlcTsKLQl1bnNpZ25lZCBpbnQgbGVuID0gcm91bmR1cChzaXplb2YoKnJlcSksIDE2KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUzMiBsZW4gPSByb3VuZHVwKHNpemVvZihzdHJ1Y3QgY3BsX2Fib3J0X3JlcSksIDE2KTsKIAogCXByX2RlYnVnKCIlczogY3NrICVwIHRpZCAldTsgc3RhdGUgJWRcbiIsCiAJCSBfX2Z1bmNfXywgY3NrLCBjc2stPnRpZCwgY3NrLT5jb20uc3RhdGUpOwpAQCAtNjc1LDE1ICs2NTksOSBAQAogCQljeGdiaXRfc2VuZF90eF9mbG93Y193cihjc2spOwogCiAJc2tiID0gX19za2JfZGVxdWV1ZSgmY3NrLT5za2JxKTsKLQlyZXEgPSAoc3RydWN0IGNwbF9hYm9ydF9yZXEgKilfX3NrYl9wdXQoc2tiLCBsZW4pOwotCW1lbXNldChyZXEsIDAsIGxlbik7CisJY3hnYl9ta19hYm9ydF9yZXEoc2tiLCBsZW4sIGNzay0+dGlkLCBjc2stPnR4cV9pZHgsCisJCQkgIGNzay0+Y29tLmNkZXYsIGN4Z2JpdF9hYm9ydF9hcnBfZmFpbHVyZSk7CiAKLQlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0RBVEEsIGNzay0+dHhxX2lkeCk7Ci0JdDRfc2V0X2FycF9lcnJfaGFuZGxlcihza2IsIGNzay0+Y29tLmNkZXYsIGN4Z2JpdF9hYm9ydF9hcnBfZmFpbHVyZSk7Ci0JSU5JVF9UUF9XUihyZXEsIGNzay0+dGlkKTsKLQlPUENPREVfVElEKHJlcSkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9BQk9SVF9SRVEsCi0JCQkJCQkgICAgY3NrLT50aWQpKTsKLQlyZXEtPmNtZCA9IENQTF9BQk9SVF9TRU5EX1JTVDsKIAlyZXR1cm4gY3hnYml0X2wydF9zZW5kKGNzay0+Y29tLmNkZXYsIHNrYiwgY3NrLT5sMnQpOwogfQogCkBAIC03ODksMTA5ICs3NjcsNiBAQAogCWtmcmVlKGNzayk7CiB9CiAKLXN0YXRpYyB2b2lkCi1jeGdiaXRfZ2V0X3R1cGxlX2luZm8oc3RydWN0IGNwbF9wYXNzX2FjY2VwdF9yZXEgKnJlcSwgaW50ICppcHR5cGUsCi0JCSAgICAgIF9fdTggKmxvY2FsX2lwLCBfX3U4ICpwZWVyX2lwLCBfX2JlMTYgKmxvY2FsX3BvcnQsCi0JCSAgICAgIF9fYmUxNiAqcGVlcl9wb3J0KQotewotCXUzMiBldGhfbGVuID0gRVRIX0hEUl9MRU5fRyhiZTMyX3RvX2NwdShyZXEtPmhkcl9sZW4pKTsKLQl1MzIgaXBfbGVuID0gSVBfSERSX0xFTl9HKGJlMzJfdG9fY3B1KHJlcS0+aGRyX2xlbikpOwotCXN0cnVjdCBpcGhkciAqaXAgPSAoc3RydWN0IGlwaGRyICopKCh1OCAqKShyZXEgKyAxKSArIGV0aF9sZW4pOwotCXN0cnVjdCBpcHY2aGRyICppcDYgPSAoc3RydWN0IGlwdjZoZHIgKikoKHU4ICopKHJlcSArIDEpICsgZXRoX2xlbik7Ci0Jc3RydWN0IHRjcGhkciAqdGNwID0gKHN0cnVjdCB0Y3BoZHIgKikKLQkJCSAgICAgICgodTggKikocmVxICsgMSkgKyBldGhfbGVuICsgaXBfbGVuKTsKLQotCWlmIChpcC0+dmVyc2lvbiA9PSA0KSB7Ci0JCXByX2RlYnVnKCIlcyBzYWRkciAweCV4IGRhZGRyIDB4JXggc3BvcnQgJXUgZHBvcnQgJXVcbiIsCi0JCQkgX19mdW5jX18sCi0JCQkgbnRvaGwoaXAtPnNhZGRyKSwgbnRvaGwoaXAtPmRhZGRyKSwKLQkJCSBudG9ocyh0Y3AtPnNvdXJjZSksCi0JCQkgbnRvaHModGNwLT5kZXN0KSk7Ci0JCSppcHR5cGUgPSA0OwotCQltZW1jcHkocGVlcl9pcCwgJmlwLT5zYWRkciwgNCk7Ci0JCW1lbWNweShsb2NhbF9pcCwgJmlwLT5kYWRkciwgNCk7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzIHNhZGRyICVwSTYgZGFkZHIgJXBJNiBzcG9ydCAldSBkcG9ydCAldVxuIiwKLQkJCSBfX2Z1bmNfXywKLQkJCSBpcDYtPnNhZGRyLnM2X2FkZHIsIGlwNi0+ZGFkZHIuczZfYWRkciwKLQkJCSBudG9ocyh0Y3AtPnNvdXJjZSksCi0JCQkgbnRvaHModGNwLT5kZXN0KSk7Ci0JCSppcHR5cGUgPSA2OwotCQltZW1jcHkocGVlcl9pcCwgaXA2LT5zYWRkci5zNl9hZGRyLCAxNik7Ci0JCW1lbWNweShsb2NhbF9pcCwgaXA2LT5kYWRkci5zNl9hZGRyLCAxNik7Ci0JfQotCi0JKnBlZXJfcG9ydCA9IHRjcC0+c291cmNlOwotCSpsb2NhbF9wb3J0ID0gdGNwLT5kZXN0OwotfQotCi1zdGF0aWMgaW50Ci1jeGdiaXRfb3VyX2ludGVyZmFjZShzdHJ1Y3QgY3hnYml0X2RldmljZSAqY2Rldiwgc3RydWN0IG5ldF9kZXZpY2UgKmVncmVzc19kZXYpCi17Ci0JdTggaTsKLQotCWVncmVzc19kZXYgPSBjeGdiaXRfZ2V0X3JlYWxfZGV2KGVncmVzc19kZXYpOwotCWZvciAoaSA9IDA7IGkgPCBjZGV2LT5sbGRpLm5wb3J0czsgaSsrKQotCQlpZiAoY2Rldi0+bGxkaS5wb3J0c1tpXSA9PSBlZ3Jlc3NfZGV2KQotCQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICoKLWN4Z2JpdF9maW5kX3JvdXRlNihzdHJ1Y3QgY3hnYml0X2RldmljZSAqY2RldiwgX191OCAqbG9jYWxfaXAsIF9fdTggKnBlZXJfaXAsCi0JCSAgIF9fYmUxNiBsb2NhbF9wb3J0LCBfX2JlMTYgcGVlcl9wb3J0LCB1OCB0b3MsCi0JCSAgIF9fdTMyIHNpbjZfc2NvcGVfaWQpCi17Ci0Jc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gTlVMTDsKLQotCWlmIChJU19FTkFCTEVEKENPTkZJR19JUFY2KSkgewotCQlzdHJ1Y3QgZmxvd2k2IGZsNjsKLQotCQltZW1zZXQoJmZsNiwgMCwgc2l6ZW9mKGZsNikpOwotCQltZW1jcHkoJmZsNi5kYWRkciwgcGVlcl9pcCwgMTYpOwotCQltZW1jcHkoJmZsNi5zYWRkciwgbG9jYWxfaXAsIDE2KTsKLQkJaWYgKGlwdjZfYWRkcl90eXBlKCZmbDYuZGFkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkKLQkJCWZsNi5mbG93aTZfb2lmID0gc2luNl9zY29wZV9pZDsKLQkJZHN0ID0gaXA2X3JvdXRlX291dHB1dCgmaW5pdF9uZXQsIE5VTEwsICZmbDYpOwotCQlpZiAoIWRzdCkKLQkJCWdvdG8gb3V0OwotCQlpZiAoIWN4Z2JpdF9vdXJfaW50ZXJmYWNlKGNkZXYsIGlwNl9kc3RfaWRldihkc3QpLT5kZXYpICYmCi0JCSAgICAhKGlwNl9kc3RfaWRldihkc3QpLT5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSkgewotCQkJZHN0X3JlbGVhc2UoZHN0KTsKLQkJCWRzdCA9IE5VTEw7Ci0JCX0KLQl9Ci1vdXQ6Ci0JcmV0dXJuIGRzdDsKLX0KLQotc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgKgotY3hnYml0X2ZpbmRfcm91dGUoc3RydWN0IGN4Z2JpdF9kZXZpY2UgKmNkZXYsIF9fYmUzMiBsb2NhbF9pcCwgX19iZTMyIHBlZXJfaXAsCi0JCSAgX19iZTE2IGxvY2FsX3BvcnQsIF9fYmUxNiBwZWVyX3BvcnQsIHU4IHRvcykKLXsKLQlzdHJ1Y3QgcnRhYmxlICpydDsKLQlzdHJ1Y3QgZmxvd2k0IGZsNDsKLQlzdHJ1Y3QgbmVpZ2hib3VyICpuOwotCi0JcnQgPSBpcF9yb3V0ZV9vdXRwdXRfcG9ydHMoJmluaXRfbmV0LCAmZmw0LCBOVUxMLCBwZWVyX2lwLAotCQkJCSAgIGxvY2FsX2lwLAotCQkJCSAgIHBlZXJfcG9ydCwgbG9jYWxfcG9ydCwgSVBQUk9UT19UQ1AsCi0JCQkJICAgdG9zLCAwKTsKLQlpZiAoSVNfRVJSKHJ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JbiA9IGRzdF9uZWlnaF9sb29rdXAoJnJ0LT5kc3QsICZwZWVyX2lwKTsKLQlpZiAoIW4pCi0JCXJldHVybiBOVUxMOwotCWlmICghY3hnYml0X291cl9pbnRlcmZhY2UoY2Rldiwgbi0+ZGV2KSAmJgotCSAgICAhKG4tPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKSB7Ci0JCW5laWdoX3JlbGVhc2Uobik7Ci0JCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW5laWdoX3JlbGVhc2Uobik7Ci0JcmV0dXJuICZydC0+ZHN0OwotfQotCiBzdGF0aWMgdm9pZCBjeGdiaXRfc2V0X3RjcF93aW5kb3coc3RydWN0IGN4Z2JpdF9zb2NrICpjc2ssIHN0cnVjdCBwb3J0X2luZm8gKnBpKQogewogCXVuc2lnbmVkIGludCBsaW5rc3BlZWQ7CkBAIC0xMDcyLDIxICs5NDcsMTQgQEAKIAogc3RhdGljIHZvaWQgY3hnYml0X3JlbGVhc2VfdGlkKHN0cnVjdCBjeGdiaXRfZGV2aWNlICpjZGV2LCB1MzIgdGlkKQogewotCXN0cnVjdCBjcGxfdGlkX3JlbGVhc2UgKnJlcTsKLQl1bnNpZ25lZCBpbnQgbGVuID0gcm91bmR1cChzaXplb2YoKnJlcSksIDE2KTsKKwl1MzIgbGVuID0gcm91bmR1cChzaXplb2Yoc3RydWN0IGNwbF90aWRfcmVsZWFzZSksIDE2KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKCFza2IpCiAJCXJldHVybjsKIAotCXJlcSA9IChzdHJ1Y3QgY3BsX3RpZF9yZWxlYXNlICopX19za2JfcHV0KHNrYiwgbGVuKTsKLQltZW1zZXQocmVxLCAwLCBsZW4pOwotCi0JSU5JVF9UUF9XUihyZXEsIHRpZCk7Ci0JT1BDT0RFX1RJRChyZXEpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRCgKLQkJICAgQ1BMX1RJRF9SRUxFQVNFLCB0aWQpKTsKLQlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX1NFVFVQLCAwKTsKKwljeGdiX21rX3RpZF9yZWxlYXNlKHNrYiwgbGVuLCB0aWQsIDApOwogCWN4Z2JpdF9vZmxkX3NlbmQoY2Rldiwgc2tiKTsKIH0KIApAQCAtMTEwOCwyMCArOTc2LDYgQEAKIAlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1jeGdiaXRfYmVzdF9tdHUoY29uc3QgdW5zaWduZWQgc2hvcnQgKm10dXMsIHVuc2lnbmVkIHNob3J0IG10dSwKLQkJdW5zaWduZWQgaW50ICppZHgsIGludCB1c2VfdHMsIGludCBpcHY2KQotewotCXVuc2lnbmVkIHNob3J0IGhkcl9zaXplID0gKGlwdjYgPyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpIDoKLQkJCQkgICBzaXplb2Yoc3RydWN0IGlwaGRyKSkgKwotCQkJCSAgIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSArCi0JCQkJICAgKHVzZV90cyA/IHJvdW5kX3VwKFRDUE9MRU5fVElNRVNUQU1QLAotCQkJCSAgICA0KSA6IDApOwotCXVuc2lnbmVkIHNob3J0IGRhdGFfc2l6ZSA9IG10dSAtIGhkcl9zaXplOwotCi0JY3hnYjRfYmVzdF9hbGlnbmVkX210dShtdHVzLCBoZHJfc2l6ZSwgZGF0YV9zaXplLCA4LCBpZHgpOwotfQotCiBzdGF0aWMgdm9pZCBjeGdiaXRfc2VuZF9yeF9jcmVkaXRzKHN0cnVjdCBjeGdiaXRfc29jayAqY3NrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWlmIChjc2stPmNvbS5zdGF0ZSAhPSBDU0tfU1RBVEVfRVNUQUJMSVNIRUQpIHsKQEAgLTExNDAsMjIgKzk5NCwxOCBAQAogaW50IGN4Z2JpdF9yeF9kYXRhX2FjayhzdHJ1Y3QgY3hnYml0X3NvY2sgKmNzaykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBjcGxfcnhfZGF0YV9hY2sgKnJlcTsKLQl1bnNpZ25lZCBpbnQgbGVuID0gcm91bmR1cChzaXplb2YoKnJlcSksIDE2KTsKKwl1MzIgbGVuID0gcm91bmR1cChzaXplb2Yoc3RydWN0IGNwbF9yeF9kYXRhX2FjayksIDE2KTsKKwl1MzIgY3JlZGl0X2RhY2s7CiAKIAlza2IgPSBhbGxvY19za2IobGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNrYikKIAkJcmV0dXJuIC0xOwogCi0JcmVxID0gKHN0cnVjdCBjcGxfcnhfZGF0YV9hY2sgKilfX3NrYl9wdXQoc2tiLCBsZW4pOwotCW1lbXNldChyZXEsIDAsIGxlbik7CisJY3JlZGl0X2RhY2sgPSBSWF9EQUNLX0NIQU5HRV9GIHwgUlhfREFDS19NT0RFX1YoMSkgfAorCQkgICAgICBSWF9DUkVESVRTX1YoY3NrLT5yeF9jcmVkaXRzKTsKIAotCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfQUNLLCBjc2stPmN0cmxxX2lkeCk7Ci0JSU5JVF9UUF9XUihyZXEsIGNzay0+dGlkKTsKLQlPUENPREVfVElEKHJlcSkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9SWF9EQVRBX0FDSywKLQkJCQkJCSAgICBjc2stPnRpZCkpOwotCXJlcS0+Y3JlZGl0X2RhY2sgPSBjcHVfdG9fYmUzMihSWF9EQUNLX0NIQU5HRV9GIHwgUlhfREFDS19NT0RFX1YoMSkgfAotCQkJCSAgICAgICBSWF9DUkVESVRTX1YoY3NrLT5yeF9jcmVkaXRzKSk7CisJY3hnYl9ta19yeF9kYXRhX2Fjayhza2IsIGxlbiwgY3NrLT50aWQsIGNzay0+Y3RybHFfaWR4LAorCQkJICAgIGNyZWRpdF9kYWNrKTsKIAogCWNzay0+cnhfY3JlZGl0cyA9IDA7CiAKQEAgLTEyMTAsMTUgKzEwNjAsNiBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCi1zdGF0aWMgdTMyIGN4Z2JpdF9jb21wdXRlX3dzY2FsZSh1MzIgd2luKQotewotCXUzMiB3c2NhbGUgPSAwOwotCi0Jd2hpbGUgKHdzY2FsZSA8IDE0ICYmICg2NTUzNSA8PCB3c2NhbGUpIDwgd2luKQotCQl3c2NhbGUrKzsKLQlyZXR1cm4gd3NjYWxlOwotfQotCiBzdGF0aWMgdm9pZAogY3hnYml0X3Bhc3NfYWNjZXB0X3JwbChzdHJ1Y3QgY3hnYml0X3NvY2sgKmNzaywgc3RydWN0IGNwbF9wYXNzX2FjY2VwdF9yZXEgKnJlcSkKIHsKQEAgLTEyNDYsMTAgKzEwODcsMTAgQEAKIAlJTklUX1RQX1dSKHJwbDUsIGNzay0+dGlkKTsKIAlPUENPREVfVElEKHJwbDUpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfUEFTU19BQ0NFUFRfUlBMLAogCQkJCQkJICAgICBjc2stPnRpZCkpOwotCWN4Z2JpdF9iZXN0X210dShjc2stPmNvbS5jZGV2LT5sbGRpLm10dXMsIGNzay0+bXR1LCAmbXR1X2lkeCwKLQkJCXJlcS0+dGNwb3B0LnRzdGFtcCwKLQkJCShjc2stPmNvbS5yZW1vdGVfYWRkci5zc19mYW1pbHkgPT0gQUZfSU5FVCkgPyAwIDogMSk7Ci0Jd3NjYWxlID0gY3hnYml0X2NvbXB1dGVfd3NjYWxlKGNzay0+cmN2X3dpbik7CisJY3hnYl9iZXN0X210dShjc2stPmNvbS5jZGV2LT5sbGRpLm10dXMsIGNzay0+bXR1LCAmbXR1X2lkeCwKKwkJICAgICAgcmVxLT50Y3BvcHQudHN0YW1wLAorCQkgICAgICAoY3NrLT5jb20ucmVtb3RlX2FkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQpID8gMCA6IDEpOworCXdzY2FsZSA9IGN4Z2JfY29tcHV0ZV93c2NhbGUoY3NrLT5yY3Zfd2luKTsKIAkvKgogCSAqIFNwZWNpZnkgdGhlIGxhcmdlc3Qgd2luZG93IHRoYXQgd2lsbCBmaXQgaW4gb3B0MC4gVGhlCiAJICogcmVtYWluZGVyIHdpbGwgYmUgc3BlY2lmaWVkIGluIHRoZSByeF9kYXRhX2Fjay4KQEAgLTEzNDAsOCArMTE4MSw4IEBACiAJCWdvdG8gcmVsX3NrYjsKIAl9CiAKLQljeGdiaXRfZ2V0X3R1cGxlX2luZm8ocmVxLCAmaXB0eXBlLCBsb2NhbF9pcCwgcGVlcl9pcCwKLQkJCSAgICAgICZsb2NhbF9wb3J0LCAmcGVlcl9wb3J0KTsKKwljeGdiX2dldF80dHVwbGUocmVxLCBjZGV2LT5sbGRpLmFkYXB0ZXJfdHlwZSwgJmlwdHlwZSwgbG9jYWxfaXAsCisJCQlwZWVyX2lwLCAmbG9jYWxfcG9ydCwgJnBlZXJfcG9ydCk7CiAKIAkvKiBGaW5kIG91dHB1dCByb3V0ZSAqLwogCWlmIChpcHR5cGUgPT0gNCkgIHsKQEAgLTEzNTAsMjEgKzExOTEsMjMgQEAKIAkJCSAsIF9fZnVuY19fLCBjbnAsIHRpZCwKIAkJCSBsb2NhbF9pcCwgcGVlcl9pcCwgbnRvaHMobG9jYWxfcG9ydCksCiAJCQkgbnRvaHMocGVlcl9wb3J0KSwgcGVlcl9tc3MpOwotCQlkc3QgPSBjeGdiaXRfZmluZF9yb3V0ZShjZGV2LCAqKF9fYmUzMiAqKWxvY2FsX2lwLAotCQkJCQkqKF9fYmUzMiAqKXBlZXJfaXAsCi0JCQkJCWxvY2FsX3BvcnQsIHBlZXJfcG9ydCwKLQkJCQkJUEFTU19PUEVOX1RPU19HKG50b2hsKHJlcS0+dG9zX3N0aWQpKSk7CisJCWRzdCA9IGN4Z2JfZmluZF9yb3V0ZSgmY2Rldi0+bGxkaSwgY3hnYml0X2dldF9yZWFsX2RldiwKKwkJCQkgICAgICAqKF9fYmUzMiAqKWxvY2FsX2lwLAorCQkJCSAgICAgICooX19iZTMyICopcGVlcl9pcCwKKwkJCQkgICAgICBsb2NhbF9wb3J0LCBwZWVyX3BvcnQsCisJCQkJICAgICAgUEFTU19PUEVOX1RPU19HKG50b2hsKHJlcS0+dG9zX3N0aWQpKSk7CiAJfSBlbHNlIHsKIAkJcHJfZGVidWcoIiVzIHBhcmVudCBzb2NrICVwIHRpZCAldSBsYWRkciAlcEk2IHJhZGRyICVwSTYgIgogCQkJICJscG9ydCAlZCBycG9ydCAlZCBwZWVyX21zcyAlZFxuIgogCQkJICwgX19mdW5jX18sIGNucCwgdGlkLAogCQkJIGxvY2FsX2lwLCBwZWVyX2lwLCBudG9ocyhsb2NhbF9wb3J0KSwKIAkJCSBudG9ocyhwZWVyX3BvcnQpLCBwZWVyX21zcyk7Ci0JCWRzdCA9IGN4Z2JpdF9maW5kX3JvdXRlNihjZGV2LCBsb2NhbF9pcCwgcGVlcl9pcCwKLQkJCQkJIGxvY2FsX3BvcnQsIHBlZXJfcG9ydCwKLQkJCQkJIFBBU1NfT1BFTl9UT1NfRyhudG9obChyZXEtPnRvc19zdGlkKSksCi0JCQkJCSAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikKLQkJCQkJICZjbnAtPmNvbS5sb2NhbF9hZGRyKS0+c2luNl9zY29wZV9pZCk7CisJCWRzdCA9IGN4Z2JfZmluZF9yb3V0ZTYoJmNkZXYtPmxsZGksIGN4Z2JpdF9nZXRfcmVhbF9kZXYsCisJCQkJICAgICAgIGxvY2FsX2lwLCBwZWVyX2lwLAorCQkJCSAgICAgICBsb2NhbF9wb3J0LCBwZWVyX3BvcnQsCisJCQkJICAgICAgIFBBU1NfT1BFTl9UT1NfRyhudG9obChyZXEtPnRvc19zdGlkKSksCisJCQkJICAgICAgICgoc3RydWN0IHNvY2thZGRyX2luNiAqKQorCQkJCQkmY25wLT5jb20ubG9jYWxfYWRkciktPnNpbjZfc2NvcGVfaWQpOwogCX0KIAlpZiAoIWRzdCkgewogCQlwcl9lcnIoIiVzIC0gZmFpbGVkIHRvIGZpbmQgZHN0IGVudHJ5IVxuIiwKQEAgLTE3OTUsMTYgKzE2MzgsMTUgQEAKIHsKIAlzdHJ1Y3QgY3BsX2Fib3J0X3JlcV9yc3MgKmhkciA9IGNwbGhkcihza2IpOwogCXVuc2lnbmVkIGludCB0aWQgPSBHRVRfVElEKGhkcik7Ci0Jc3RydWN0IGNwbF9hYm9ydF9ycGwgKnJwbDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcnBsX3NrYjsKIAlib29sIHJlbGVhc2UgPSBmYWxzZTsKIAlib29sIHdha2V1cF90aHJlYWQgPSBmYWxzZTsKLQl1bnNpZ25lZCBpbnQgbGVuID0gcm91bmR1cChzaXplb2YoKnJwbCksIDE2KTsKKwl1MzIgbGVuID0gcm91bmR1cChzaXplb2Yoc3RydWN0IGNwbF9hYm9ydF9ycGwpLCAxNik7CiAKIAlwcl9kZWJ1ZygiJXM6IGNzayAlcDsgdGlkICV1OyBzdGF0ZSAlZFxuIiwKIAkJIF9fZnVuY19fLCBjc2ssIHRpZCwgY3NrLT5jb20uc3RhdGUpOwogCi0JaWYgKGN4Z2JpdF9pc19uZWdfYWR2KGhkci0+c3RhdHVzKSkgeworCWlmIChjeGdiX2lzX25lZ19hZHYoaGRyLT5zdGF0dXMpKSB7CiAJCXByX2VycigiJXM6IGdvdCBuZWcgYWR2aXNlICVkIG9uIHRpZCAldVxuIiwKIAkJICAgICAgIF9fZnVuY19fLCBoZHItPnN0YXR1cywgdGlkKTsKIAkJZ290byByZWxfc2tiOwpAQCAtMTgzOSwxNCArMTY4MSw4IEBACiAJCWN4Z2JpdF9zZW5kX3R4X2Zsb3djX3dyKGNzayk7CiAKIAlycGxfc2tiID0gX19za2JfZGVxdWV1ZSgmY3NrLT5za2JxKTsKLQlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0RBVEEsIGNzay0+dHhxX2lkeCk7CiAKLQlycGwgPSAoc3RydWN0IGNwbF9hYm9ydF9ycGwgKilfX3NrYl9wdXQocnBsX3NrYiwgbGVuKTsKLQltZW1zZXQocnBsLCAwLCBsZW4pOwotCi0JSU5JVF9UUF9XUihycGwsIGNzay0+dGlkKTsKLQlPUENPREVfVElEKHJwbCkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9BQk9SVF9SUEwsIHRpZCkpOwotCXJwbC0+Y21kID0gQ1BMX0FCT1JUX05PX1JTVDsKKwljeGdiX21rX2Fib3J0X3JwbChycGxfc2tiLCBsZW4sIGNzay0+dGlkLCBjc2stPnR4cV9pZHgpOwogCWN4Z2JpdF9vZmxkX3NlbmQoY3NrLT5jb20uY2RldiwgcnBsX3NrYik7CiAKIAlpZiAod2FrZXVwX3RocmVhZCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvaXNjc2kvY3hnYml0L2N4Z2JpdF9tYWluLmMgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9jeGdiaXQvY3hnYml0X21haW4uYwppbmRleCAyN2RkMTFhLi5hZDI2YjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9jeGdiaXQvY3hnYml0X21haW4uYworKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9jeGdiaXQvY3hnYml0X21haW4uYwpAQCAtNjUyLDYgKzY1Miw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY3hnYjRfdWxkX2luZm8gY3hnYml0X3VsZF9pbmZvID0gewogCS5uYW1lCQk9IERSVl9OQU1FLAorCS5ucnhxCQk9IE1BWF9VTERfUVNFVFMsCisJLnJ4cV9zaXplCT0gMTAyNCwKKwkubHJvCQk9IHRydWUsCiAJLmFkZAkJPSBjeGdiaXRfdWxkX2FkZCwKIAkuc3RhdGVfY2hhbmdlCT0gY3hnYml0X3VsZF9zdGF0ZV9jaGFuZ2UsCiAJLmxyb19yeF9oYW5kbGVyID0gY3hnYml0X3VsZF9scm9fcnhfaGFuZGxlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC9jcHVfY29vbGluZy5jIGIvZHJpdmVycy90aGVybWFsL2NwdV9jb29saW5nLmMKaW5kZXggMzc4OGVkNy4uYTMyYjQxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy90aGVybWFsL2NwdV9jb29saW5nLmMKKysrIGIvZHJpdmVycy90aGVybWFsL2NwdV9jb29saW5nLmMKQEAgLTc0MCwxMiArNzQwLDIyIEBACiB9CiAKIC8qIEJpbmQgY3B1ZnJlcSBjYWxsYmFja3MgdG8gdGhlcm1hbCBjb29saW5nIGRldmljZSBvcHMgKi8KKwogc3RhdGljIHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX29wcyBjcHVmcmVxX2Nvb2xpbmdfb3BzID0gewogCS5nZXRfbWF4X3N0YXRlID0gY3B1ZnJlcV9nZXRfbWF4X3N0YXRlLAogCS5nZXRfY3VyX3N0YXRlID0gY3B1ZnJlcV9nZXRfY3VyX3N0YXRlLAogCS5zZXRfY3VyX3N0YXRlID0gY3B1ZnJlcV9zZXRfY3VyX3N0YXRlLAogfTsKIAorc3RhdGljIHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX29wcyBjcHVmcmVxX3Bvd2VyX2Nvb2xpbmdfb3BzID0geworCS5nZXRfbWF4X3N0YXRlCQk9IGNwdWZyZXFfZ2V0X21heF9zdGF0ZSwKKwkuZ2V0X2N1cl9zdGF0ZQkJPSBjcHVmcmVxX2dldF9jdXJfc3RhdGUsCisJLnNldF9jdXJfc3RhdGUJCT0gY3B1ZnJlcV9zZXRfY3VyX3N0YXRlLAorCS5nZXRfcmVxdWVzdGVkX3Bvd2VyCT0gY3B1ZnJlcV9nZXRfcmVxdWVzdGVkX3Bvd2VyLAorCS5zdGF0ZTJwb3dlcgkJPSBjcHVmcmVxX3N0YXRlMnBvd2VyLAorCS5wb3dlcjJzdGF0ZQkJPSBjcHVmcmVxX3Bvd2VyMnN0YXRlLAorfTsKKwogLyogTm90aWZpZXIgZm9yIGNwdWZyZXEgcG9saWN5IGNoYW5nZSAqLwogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB0aGVybWFsX2NwdWZyZXFfbm90aWZpZXJfYmxvY2sgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBjcHVmcmVxX3RoZXJtYWxfbm90aWZpZXIsCkBAIC03OTUsNiArODA1LDcgQEAKIAlzdHJ1Y3QgY3B1bWFzayB0ZW1wX21hc2s7CiAJdW5zaWduZWQgaW50IGZyZXEsIGksIG51bV9jcHVzOwogCWludCByZXQ7CisJc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzICpjb29saW5nX29wczsKIAogCWNwdW1hc2tfYW5kKCZ0ZW1wX21hc2ssIGNsaXBfY3B1cywgY3B1X29ubGluZV9tYXNrKTsKIAlwb2xpY3kgPSBjcHVmcmVxX2NwdV9nZXQoY3B1bWFza19maXJzdCgmdGVtcF9tYXNrKSk7CkBAIC04NTAsMTAgKzg2MSw2IEBACiAJY3B1bWFza19jb3B5KCZjcHVmcmVxX2Rldi0+YWxsb3dlZF9jcHVzLCBjbGlwX2NwdXMpOwogCiAJaWYgKGNhcGFjaXRhbmNlKSB7Ci0JCWNwdWZyZXFfY29vbGluZ19vcHMuZ2V0X3JlcXVlc3RlZF9wb3dlciA9Ci0JCQljcHVmcmVxX2dldF9yZXF1ZXN0ZWRfcG93ZXI7Ci0JCWNwdWZyZXFfY29vbGluZ19vcHMuc3RhdGUycG93ZXIgPSBjcHVmcmVxX3N0YXRlMnBvd2VyOwotCQljcHVmcmVxX2Nvb2xpbmdfb3BzLnBvd2VyMnN0YXRlID0gY3B1ZnJlcV9wb3dlcjJzdGF0ZTsKIAkJY3B1ZnJlcV9kZXYtPnBsYXRfZ2V0X3N0YXRpY19wb3dlciA9IHBsYXRfc3RhdGljX2Z1bmM7CiAKIAkJcmV0ID0gYnVpbGRfZHluX3Bvd2VyX3RhYmxlKGNwdWZyZXFfZGV2LCBjYXBhY2l0YW5jZSk7CkBAIC04NjEsNiArODY4LDEwIEBACiAJCQljb29sX2RldiA9IEVSUl9QVFIocmV0KTsKIAkJCWdvdG8gZnJlZV90YWJsZTsKIAkJfQorCisJCWNvb2xpbmdfb3BzID0gJmNwdWZyZXFfcG93ZXJfY29vbGluZ19vcHM7CisJfSBlbHNlIHsKKwkJY29vbGluZ19vcHMgPSAmY3B1ZnJlcV9jb29saW5nX29wczsKIAl9CiAKIAlyZXQgPSBnZXRfaWRyKCZjcHVmcmVxX2lkciwgJmNwdWZyZXFfZGV2LT5pZCk7CkBAIC04ODUsNyArODk2LDcgQEAKIAkJIGNwdWZyZXFfZGV2LT5pZCk7CiAKIAljb29sX2RldiA9IHRoZXJtYWxfb2ZfY29vbGluZ19kZXZpY2VfcmVnaXN0ZXIobnAsIGRldl9uYW1lLCBjcHVmcmVxX2RldiwKLQkJCQkJCSAgICAgICZjcHVmcmVxX2Nvb2xpbmdfb3BzKTsKKwkJCQkJCSAgICAgIGNvb2xpbmdfb3BzKTsKIAlpZiAoSVNfRVJSKGNvb2xfZGV2KSkKIAkJZ290byByZW1vdmVfaWRyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RoZXJtYWwvaW14X3RoZXJtYWwuYyBiL2RyaXZlcnMvdGhlcm1hbC9pbXhfdGhlcm1hbC5jCmluZGV4IGM1NTQ3YmQuLmU0NzM1NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGhlcm1hbC9pbXhfdGhlcm1hbC5jCisrKyBiL2RyaXZlcnMvdGhlcm1hbC9pbXhfdGhlcm1hbC5jCkBAIC00NzEsOCArNDcxLDYgQEAKIAogc3RhdGljIGludCBpbXhfdGhlcm1hbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkID0KLQkJb2ZfbWF0Y2hfZGV2aWNlKG9mX2lteF90aGVybWFsX21hdGNoLCAmcGRldi0+ZGV2KTsKIAlzdHJ1Y3QgaW14X3RoZXJtYWxfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgcmVnbWFwICptYXA7CiAJaW50IG1lYXN1cmVfZnJlcTsKQEAgLTQ5MCw3ICs0ODgsNyBAQAogCX0KIAlkYXRhLT50ZW1wbW9uID0gbWFwOwogCi0JZGF0YS0+c29jZGF0YSA9IG9mX2lkLT5kYXRhOworCWRhdGEtPnNvY2RhdGEgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoJnBkZXYtPmRldik7CiAKIAkvKiBtYWtlIHN1cmUgdGhlIElSUSBmbGFnIGlzIGNsZWFyIGJlZm9yZSBlbmFibGluZyBpcnEgb24gaS5NWDZTWCAqLwogCWlmIChkYXRhLT5zb2NkYXRhLT52ZXJzaW9uID09IFRFTVBNT05fSU1YNlNYKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RoZXJtYWwvaW50MzQweF90aGVybWFsL2ludDM0MDZfdGhlcm1hbC5jIGIvZHJpdmVycy90aGVybWFsL2ludDM0MHhfdGhlcm1hbC9pbnQzNDA2X3RoZXJtYWwuYwppbmRleCBhNTc4Y2QyLi4xODkxZjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RoZXJtYWwvaW50MzQweF90aGVybWFsL2ludDM0MDZfdGhlcm1hbC5jCisrKyBiL2RyaXZlcnMvdGhlcm1hbC9pbnQzNDB4X3RoZXJtYWwvaW50MzQwNl90aGVybWFsLmMKQEAgLTIyNSw3ICsyMjUsNiBAQAogCS5yZW1vdmUgPSBpbnQzNDA2X3RoZXJtYWxfcmVtb3ZlLAogCS5kcml2ZXIgPSB7CiAJCSAgIC5uYW1lID0gImludDM0MDYgdGhlcm1hbCIsCi0JCSAgIC5vd25lciA9IFRISVNfTU9EVUxFLAogCQkgICAuYWNwaV9tYXRjaF90YWJsZSA9IGludDM0MDZfdGhlcm1hbF9tYXRjaCwKIAkJICAgfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RoZXJtYWwvcmNhcl90aGVybWFsLmMgYi9kcml2ZXJzL3RoZXJtYWwvcmNhcl90aGVybWFsLmMKaW5kZXggNzFhMzM5Mi4uNWY4MTc5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy90aGVybWFsL3JjYXJfdGhlcm1hbC5jCisrKyBiL2RyaXZlcnMvdGhlcm1hbC9yY2FyX3RoZXJtYWwuYwpAQCAtNTA0LDYgKzUwNCw3IEBACiAJCWlmIChJU19FUlIocHJpdi0+em9uZSkpIHsKIAkJCWRldl9lcnIoZGV2LCAiY2FuJ3QgcmVnaXN0ZXIgdGhlcm1hbCB6b25lXG4iKTsKIAkJCXJldCA9IFBUUl9FUlIocHJpdi0+em9uZSk7CisJCQlwcml2LT56b25lID0gTlVMTDsKIAkJCWdvdG8gZXJyb3JfdW5yZWdpc3RlcjsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RodW5kZXJib2x0L25oaS5jIGIvZHJpdmVycy90aHVuZGVyYm9sdC9uaGkuYwppbmRleCA5YzE1MzQ0Li5hOGMyMDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RodW5kZXJib2x0L25oaS5jCisrKyBiL2RyaXZlcnMvdGh1bmRlcmJvbHQvbmhpLmMKQEAgLTY1MSw2ICs2NTEsMTIgQEAKIAl7CiAJCS5jbGFzcyA9IFBDSV9DTEFTU19TWVNURU1fT1RIRVIgPDwgOCwgLmNsYXNzX21hc2sgPSB+MCwKIAkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCisJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX0lOVEVMX0ZBTENPTl9SSURHRV8yQ19OSEksCisJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELCAuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKwl9LAorCXsKKwkJLmNsYXNzID0gUENJX0NMQVNTX1NZU1RFTV9PVEhFUiA8PCA4LCAuY2xhc3NfbWFzayA9IH4wLAorCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKIAkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfSU5URUxfRkFMQ09OX1JJREdFXzRDX05ISSwKIAkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsIC5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RodW5kZXJib2x0L3N3aXRjaC5jIGIvZHJpdmVycy90aHVuZGVyYm9sdC9zd2l0Y2guYwppbmRleCAxZTExNmY1Li45ODQwZmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RodW5kZXJib2x0L3N3aXRjaC5jCisrKyBiL2RyaXZlcnMvdGh1bmRlcmJvbHQvc3dpdGNoLmMKQEAgLTM3Miw3ICszNzIsOSBAQAogCiAJaWYgKHN3LT5jb25maWcuZGV2aWNlX2lkICE9IFBDSV9ERVZJQ0VfSURfSU5URUxfTElHSFRfUklER0UgJiYKIAkgICAgc3ctPmNvbmZpZy5kZXZpY2VfaWQgIT0gUENJX0RFVklDRV9JRF9JTlRFTF9DQUNUVVNfUklER0VfNEMgJiYKLQkgICAgc3ctPmNvbmZpZy5kZXZpY2VfaWQgIT0gUENJX0RFVklDRV9JRF9JTlRFTF9QT1JUX1JJREdFKQorCSAgICBzdy0+Y29uZmlnLmRldmljZV9pZCAhPSBQQ0lfREVWSUNFX0lEX0lOVEVMX1BPUlRfUklER0UgJiYKKwkgICAgc3ctPmNvbmZpZy5kZXZpY2VfaWQgIT0gUENJX0RFVklDRV9JRF9JTlRFTF9GQUxDT05fUklER0VfMkNfQlJJREdFICYmCisJICAgIHN3LT5jb25maWcuZGV2aWNlX2lkICE9IFBDSV9ERVZJQ0VfSURfSU5URUxfRkFMQ09OX1JJREdFXzRDX0JSSURHRSkKIAkJdGJfc3dfd2FybihzdywgInVuc3VwcG9ydGVkIHN3aXRjaCBkZXZpY2UgaWQgJSN4XG4iLAogCQkJICAgc3ctPmNvbmZpZy5kZXZpY2VfaWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9wdHkuYyBiL2RyaXZlcnMvdHR5L3B0eS5jCmluZGV4IDUxZTBkMzIuLmEyM2ZhNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3B0eS5jCisrKyBiL2RyaXZlcnMvdHR5L3B0eS5jCkBAIC04MDAsNyArODAwLDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwdG14X2ZvcHM7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwdG14X2ZvcHMgX19yb19hZnRlcl9pbml0OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgdW5peDk4X3B0eV9pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwLmggYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwLmgKaW5kZXggMTIyZTBlNC4uYTY5N2E4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MC5oCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTAuaApAQCAtMTUsOCArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KIAotI2luY2x1ZGUgIi4uL3NlcmlhbF9tY3RybF9ncGlvLmgiCi0KIHN0cnVjdCB1YXJ0XzgyNTBfZG1hIHsKIAlpbnQgKCp0eF9kbWEpKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqcCk7CiAJaW50ICgqcnhfZG1hKShzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnApOwpAQCAtMzMsNiArMzEsMTEgQEAKIAlzdHJ1Y3QgZG1hX2NoYW4JCSpyeGNoYW47CiAJc3RydWN0IGRtYV9jaGFuCQkqdHhjaGFuOwogCisJLyogRGV2aWNlIGFkZHJlc3MgYmFzZSBmb3IgRE1BIG9wZXJhdGlvbnMgKi8KKwlwaHlzX2FkZHJfdAkJcnhfZG1hX2FkZHI7CisJcGh5c19hZGRyX3QJCXR4X2RtYV9hZGRyOworCisJLyogRE1BIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBpbiBtZW1vcnkgKi8KIAlkbWFfYWRkcl90CQlyeF9hZGRyOwogCWRtYV9hZGRyX3QJCXR4X2FkZHI7CiAKQEAgLTEzMyw0MyArMTM2LDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXJpYWw4MjUwX291dF9NQ1Ioc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cCwgaW50IHZhbHVlKQogewotCWludCBtY3RybF9ncGlvID0gMDsKLQogCXNlcmlhbF9vdXQodXAsIFVBUlRfTUNSLCB2YWx1ZSk7Ci0KLQlpZiAodmFsdWUgJiBVQVJUX01DUl9SVFMpCi0JCW1jdHJsX2dwaW8gfD0gVElPQ01fUlRTOwotCWlmICh2YWx1ZSAmIFVBUlRfTUNSX0RUUikKLQkJbWN0cmxfZ3BpbyB8PSBUSU9DTV9EVFI7Ci0KLQltY3RybF9ncGlvX3NldCh1cC0+Z3Bpb3MsIG1jdHJsX2dwaW8pOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBzZXJpYWw4MjUwX2luX01DUihzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwKQogewotCWludCBtY3RybCwgbWN0cmxfZ3BpbyA9IDA7Ci0KLQltY3RybCA9IHNlcmlhbF9pbih1cCwgVUFSVF9NQ1IpOwotCi0JLyogc2F2ZSBjdXJyZW50IE1DUiB2YWx1ZXMgKi8KLQlpZiAobWN0cmwgJiBVQVJUX01DUl9SVFMpCi0JCW1jdHJsX2dwaW8gfD0gVElPQ01fUlRTOwotCWlmIChtY3RybCAmIFVBUlRfTUNSX0RUUikKLQkJbWN0cmxfZ3BpbyB8PSBUSU9DTV9EVFI7Ci0KLQltY3RybF9ncGlvID0gbWN0cmxfZ3Bpb19nZXRfb3V0cHV0cyh1cC0+Z3Bpb3MsICZtY3RybF9ncGlvKTsKLQotCWlmIChtY3RybF9ncGlvICYgVElPQ01fUlRTKQotCQltY3RybCB8PSBVQVJUX01DUl9SVFM7Ci0JZWxzZQotCQltY3RybCAmPSB+VUFSVF9NQ1JfUlRTOwotCi0JaWYgKG1jdHJsX2dwaW8gJiBUSU9DTV9EVFIpCi0JCW1jdHJsIHw9IFVBUlRfTUNSX0RUUjsKLQllbHNlCi0JCW1jdHJsICY9IH5VQVJUX01DUl9EVFI7Ci0KLQlyZXR1cm4gbWN0cmw7CisJcmV0dXJuIHNlcmlhbF9pbih1cCwgVUFSVF9NQ1IpOwogfQogCiAjaWYgZGVmaW5lZChfX2FscGhhX18pICYmICFkZWZpbmVkKENPTkZJR19QQ0kpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2NvcmUuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfY29yZS5jCmluZGV4IDEzYWQ1YzMuLjI0MGEzNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfY29yZS5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfY29yZS5jCkBAIC02MzksNyArNjM5LDcgQEAKIHsKIAljaGFyIG1hdGNoW10gPSAidWFydCI7CS8qIDgyNTAtc3BlY2lmaWMgZWFybHljb24gbmFtZSAqLwogCXVuc2lnbmVkIGNoYXIgaW90eXBlOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlyZXNvdXJjZV9zaXplX3QgYWRkcjsKIAlpbnQgaTsKIAogCWlmIChzdHJuY21wKG5hbWUsIG1hdGNoLCA0KSAhPSAwKQpAQCAtOTc0LDggKzk3NCw2IEBACiAKIAl1YXJ0ID0gc2VyaWFsODI1MF9maW5kX21hdGNoX29yX3VudXNlZCgmdXAtPnBvcnQpOwogCWlmICh1YXJ0ICYmIHVhcnQtPnBvcnQudHlwZSAhPSBQT1JUXzgyNTBfQ0lSKSB7Ci0JCXN0cnVjdCBtY3RybF9ncGlvcyAqZ3Bpb3M7Ci0KIAkJaWYgKHVhcnQtPnBvcnQuZGV2KQogCQkJdWFydF9yZW1vdmVfb25lX3BvcnQoJnNlcmlhbDgyNTBfcmVnLCAmdWFydC0+cG9ydCk7CiAKQEAgLTEwMTMsMTMgKzEwMTEsNiBAQAogCQlpZiAodXAtPnBvcnQuZmxhZ3MgJiBVUEZfRklYRURfVFlQRSkKIAkJCXVhcnQtPnBvcnQudHlwZSA9IHVwLT5wb3J0LnR5cGU7CiAKLQkJZ3Bpb3MgPSBtY3RybF9ncGlvX2luaXQoJnVhcnQtPnBvcnQsIDApOwotCQlpZiAoSVNfRVJSKGdwaW9zKSkgewotCQkJaWYgKFBUUl9FUlIoZ3Bpb3MpICE9IC1FTk9TWVMpCi0JCQkJcmV0dXJuIFBUUl9FUlIoZ3Bpb3MpOwotCQl9IGVsc2UKLQkJCXVhcnQtPmdwaW9zID0gZ3Bpb3M7Ci0KIAkJc2VyaWFsODI1MF9zZXRfZGVmYXVsdHModWFydCk7CiAKIAkJLyogUG9zc2libHkgb3ZlcnJpZGUgZGVmYXVsdCBJL08gZnVuY3Rpb25zLiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfZG1hLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2RtYS5jCmluZGV4IDM1OTBkMDEuLmZkYmRkYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfZG1hLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9kbWEuYwpAQCAtMTQyLDcgKzE0Miw3IEBACiAJaWYgKGRtYS0+cnhfcnVubmluZykgewogCQlkbWFlbmdpbmVfcGF1c2UoZG1hLT5yeGNoYW4pOwogCQlfX2RtYV9yeF9jb21wbGV0ZShwKTsKLQkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoZG1hLT5yeGNoYW4pOworCQlkbWFlbmdpbmVfdGVybWluYXRlX2FzeW5jKGRtYS0+cnhjaGFuKTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzZXJpYWw4MjUwX3J4X2RtYV9mbHVzaCk7CkBAIC0xNTAsNiArMTUwLDEwIEBACiBpbnQgc2VyaWFsODI1MF9yZXF1ZXN0X2RtYShzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnApCiB7CiAJc3RydWN0IHVhcnRfODI1MF9kbWEJKmRtYSA9IHAtPmRtYTsKKwlwaHlzX2FkZHJfdCByeF9kbWFfYWRkciA9IGRtYS0+cnhfZG1hX2FkZHIgPworCQkJCSAgZG1hLT5yeF9kbWFfYWRkciA6IHAtPnBvcnQubWFwYmFzZTsKKwlwaHlzX2FkZHJfdCB0eF9kbWFfYWRkciA9IGRtYS0+dHhfZG1hX2FkZHIgPworCQkJCSAgZG1hLT50eF9kbWFfYWRkciA6IHAtPnBvcnQubWFwYmFzZTsKIAlkbWFfY2FwX21hc2tfdAkJbWFzazsKIAlzdHJ1Y3QgZG1hX3NsYXZlX2NhcHMJY2FwczsKIAlpbnQJCQlyZXQ7CkBAIC0xNTcsMTEgKzE2MSwxMSBAQAogCS8qIERlZmF1bHQgc2xhdmUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCiAJZG1hLT5yeGNvbmYuZGlyZWN0aW9uCQk9IERNQV9ERVZfVE9fTUVNOwogCWRtYS0+cnhjb25mLnNyY19hZGRyX3dpZHRoCT0gRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURTsKLQlkbWEtPnJ4Y29uZi5zcmNfYWRkcgkJPSBwLT5wb3J0Lm1hcGJhc2UgKyBVQVJUX1JYOworCWRtYS0+cnhjb25mLnNyY19hZGRyCQk9IHJ4X2RtYV9hZGRyICsgVUFSVF9SWDsKIAogCWRtYS0+dHhjb25mLmRpcmVjdGlvbgkJPSBETUFfTUVNX1RPX0RFVjsKIAlkbWEtPnR4Y29uZi5kc3RfYWRkcl93aWR0aAk9IERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU7Ci0JZG1hLT50eGNvbmYuZHN0X2FkZHIJCT0gcC0+cG9ydC5tYXBiYXNlICsgVUFSVF9UWDsKKwlkbWEtPnR4Y29uZi5kc3RfYWRkcgkJPSB0eF9kbWFfYWRkciArIFVBUlRfVFg7CiAKIAlkbWFfY2FwX3plcm8obWFzayk7CiAJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBtYXNrKTsKQEAgLTI0NywxNCArMjUxLDE0IEBACiAJCXJldHVybjsKIAogCS8qIFJlbGVhc2UgUlggcmVzb3VyY2VzICovCi0JZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoZG1hLT5yeGNoYW4pOworCWRtYWVuZ2luZV90ZXJtaW5hdGVfc3luYyhkbWEtPnJ4Y2hhbik7CiAJZG1hX2ZyZWVfY29oZXJlbnQoZG1hLT5yeGNoYW4tPmRldmljZS0+ZGV2LCBkbWEtPnJ4X3NpemUsIGRtYS0+cnhfYnVmLAogCQkJICBkbWEtPnJ4X2FkZHIpOwogCWRtYV9yZWxlYXNlX2NoYW5uZWwoZG1hLT5yeGNoYW4pOwogCWRtYS0+cnhjaGFuID0gTlVMTDsKIAogCS8qIFJlbGVhc2UgVFggcmVzb3VyY2VzICovCi0JZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoZG1hLT50eGNoYW4pOworCWRtYWVuZ2luZV90ZXJtaW5hdGVfc3luYyhkbWEtPnR4Y2hhbik7CiAJZG1hX3VubWFwX3NpbmdsZShkbWEtPnR4Y2hhbi0+ZGV2aWNlLT5kZXYsIGRtYS0+dHhfYWRkciwKIAkJCSBVQVJUX1hNSVRfU0laRSwgRE1BX1RPX0RFVklDRSk7CiAJZG1hX3JlbGVhc2VfY2hhbm5lbChkbWEtPnR4Y2hhbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2R3LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2R3LmMKaW5kZXggZTE5OTY5Ni4uNDU5ZDcyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9kdy5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfZHcuYwpAQCAtMjk4LDEyICsyOTgsMTcgQEAKIAkJCXAtPnNlcmlhbF9vdXQgPSBkdzgyNTBfc2VyaWFsX291dDMyYmU7CiAJCX0KIAl9IGVsc2UgaWYgKGhhc19hY3BpX2NvbXBhbmlvbihwLT5kZXYpKSB7Ci0JCXAtPmlvdHlwZSA9IFVQSU9fTUVNMzI7Ci0JCXAtPnJlZ3NoaWZ0ID0gMjsKLQkJcC0+c2VyaWFsX2luID0gZHc4MjUwX3NlcmlhbF9pbjMyOworCQljb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKmlkOworCisJCWlkID0gYWNwaV9tYXRjaF9kZXZpY2UocC0+ZGV2LT5kcml2ZXItPmFjcGlfbWF0Y2hfdGFibGUsCisJCQkJICAgICAgIHAtPmRldik7CisJCWlmIChpZCAmJiAhc3RyY21wKGlkLT5pZCwgIkFQTUMwRDA4IikpIHsKKwkJCXAtPmlvdHlwZSA9IFVQSU9fTUVNMzI7CisJCQlwLT5yZWdzaGlmdCA9IDI7CisJCQlwLT5zZXJpYWxfaW4gPSBkdzgyNTBfc2VyaWFsX2luMzI7CisJCQlkYXRhLT51YXJ0XzE2NTUwX2NvbXBhdGlibGUgPSB0cnVlOworCQl9CiAJCXAtPnNldF90ZXJtaW9zID0gZHc4MjUwX3NldF90ZXJtaW9zOwotCQkvKiBTbyBmYXIgbm9uZSBvZiB0aGVyZSBpbXBsZW1lbnQgdGhlIEJ1c3kgRnVuY3Rpb25hbGl0eSAqLwotCQlkYXRhLT51YXJ0XzE2NTUwX2NvbXBhdGlibGUgPSB0cnVlOwogCX0KIAogCS8qIFBsYXRmb3JtcyB3aXRoIGlETUEgKi8KQEAgLTM2MCwxOCArMzY1LDE5IEBACiAJc3RydWN0IHJlc291cmNlICpyZWdzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpbnQgaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwID0gJnVhcnQucG9ydDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwogCXN0cnVjdCBkdzgyNTBfZGF0YSAqZGF0YTsKIAlpbnQgZXJyOwogCXUzMiB2YWw7CiAKIAlpZiAoIXJlZ3MpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gcmVnaXN0ZXJzIGRlZmluZWRcbiIpOworCQlkZXZfZXJyKGRldiwgIm5vIHJlZ2lzdGVycyBkZWZpbmVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGlycSA8IDApIHsKIAkJaWYgKGlycSAhPSAtRVBST0JFX0RFRkVSKQotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGdldCBpcnFcbiIpOworCQkJZGV2X2VycihkZXYsICJjYW5ub3QgZ2V0IGlycVxuIik7CiAJCXJldHVybiBpcnE7CiAJfQogCkBAIC0zODIsMTYgKzM4OCwxNiBAQAogCXAtPnBtCQk9IGR3ODI1MF9kb19wbTsKIAlwLT50eXBlCQk9IFBPUlRfODI1MDsKIAlwLT5mbGFncwk9IFVQRl9TSEFSRV9JUlEgfCBVUEZfRklYRURfUE9SVDsKLQlwLT5kZXYJCT0gJnBkZXYtPmRldjsKKwlwLT5kZXYJCT0gZGV2OwogCXAtPmlvdHlwZQk9IFVQSU9fTUVNOwogCXAtPnNlcmlhbF9pbgk9IGR3ODI1MF9zZXJpYWxfaW47CiAJcC0+c2VyaWFsX291dAk9IGR3ODI1MF9zZXJpYWxfb3V0OwogCi0JcC0+bWVtYmFzZSA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByZWdzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZWdzKSk7CisJcC0+bWVtYmFzZSA9IGRldm1faW9yZW1hcChkZXYsIHJlZ3MtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlZ3MpKTsKIAlpZiAoIXAtPm1lbWJhc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMzk5LDU3ICs0MDUsNTcgQEAKIAlkYXRhLT51c3JfcmVnID0gRFdfVUFSVF9VU1I7CiAJcC0+cHJpdmF0ZV9kYXRhID0gZGF0YTsKIAotCWRhdGEtPnVhcnRfMTY1NTBfY29tcGF0aWJsZSA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2wocC0+ZGV2LAorCWRhdGEtPnVhcnRfMTY1NTBfY29tcGF0aWJsZSA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LAogCQkJCQkJInNucHMsdWFydC0xNjU1MC1jb21wYXRpYmxlIik7CiAKLQllcnIgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIocC0+ZGV2LCAicmVnLXNoaWZ0IiwgJnZhbCk7CisJZXJyID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGRldiwgInJlZy1zaGlmdCIsICZ2YWwpOwogCWlmICghZXJyKQogCQlwLT5yZWdzaGlmdCA9IHZhbDsKIAotCWVyciA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihwLT5kZXYsICJyZWctaW8td2lkdGgiLCAmdmFsKTsKKwllcnIgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoZGV2LCAicmVnLWlvLXdpZHRoIiwgJnZhbCk7CiAJaWYgKCFlcnIgJiYgdmFsID09IDQpIHsKIAkJcC0+aW90eXBlID0gVVBJT19NRU0zMjsKIAkJcC0+c2VyaWFsX2luID0gZHc4MjUwX3NlcmlhbF9pbjMyOwogCQlwLT5zZXJpYWxfb3V0ID0gZHc4MjUwX3NlcmlhbF9vdXQzMjsKIAl9CiAKLQlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChwLT5kZXYsICJkY2Qtb3ZlcnJpZGUiKSkgeworCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgImRjZC1vdmVycmlkZSIpKSB7CiAJCS8qIEFsd2F5cyByZXBvcnQgRENEIGFzIGFjdGl2ZSAqLwogCQlkYXRhLT5tc3JfbWFza19vbiB8PSBVQVJUX01TUl9EQ0Q7CiAJCWRhdGEtPm1zcl9tYXNrX29mZiB8PSBVQVJUX01TUl9ERENEOwogCX0KIAotCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKHAtPmRldiwgImRzci1vdmVycmlkZSIpKSB7CisJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAiZHNyLW92ZXJyaWRlIikpIHsKIAkJLyogQWx3YXlzIHJlcG9ydCBEU1IgYXMgYWN0aXZlICovCiAJCWRhdGEtPm1zcl9tYXNrX29uIHw9IFVBUlRfTVNSX0RTUjsKIAkJZGF0YS0+bXNyX21hc2tfb2ZmIHw9IFVBUlRfTVNSX0REU1I7CiAJfQogCi0JaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2wocC0+ZGV2LCAiY3RzLW92ZXJyaWRlIikpIHsKKwlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJjdHMtb3ZlcnJpZGUiKSkgewogCQkvKiBBbHdheXMgcmVwb3J0IENUUyBhcyBhY3RpdmUgKi8KIAkJZGF0YS0+bXNyX21hc2tfb24gfD0gVUFSVF9NU1JfQ1RTOwogCQlkYXRhLT5tc3JfbWFza19vZmYgfD0gVUFSVF9NU1JfRENUUzsKIAl9CiAKLQlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChwLT5kZXYsICJyaS1vdmVycmlkZSIpKSB7CisJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAicmktb3ZlcnJpZGUiKSkgewogCQkvKiBBbHdheXMgcmVwb3J0IFJpbmcgaW5kaWNhdG9yIGFzIGluYWN0aXZlICovCiAJCWRhdGEtPm1zcl9tYXNrX29mZiB8PSBVQVJUX01TUl9SSTsKIAkJZGF0YS0+bXNyX21hc2tfb2ZmIHw9IFVBUlRfTVNSX1RFUkk7CiAJfQogCiAJLyogQWx3YXlzIGFzayBmb3IgZml4ZWQgY2xvY2sgcmF0ZSBmcm9tIGEgcHJvcGVydHkuICovCi0JZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKHAtPmRldiwgImNsb2NrLWZyZXF1ZW5jeSIsICZwLT51YXJ0Y2xrKTsKKwlkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoZGV2LCAiY2xvY2stZnJlcXVlbmN5IiwgJnAtPnVhcnRjbGspOwogCiAJLyogSWYgdGhlcmUgaXMgc2VwYXJhdGUgYmF1ZGNsaywgZ2V0IHRoZSByYXRlIGZyb20gaXQuICovCi0JZGF0YS0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJiYXVkY2xrIik7CisJZGF0YS0+Y2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImJhdWRjbGsiKTsKIAlpZiAoSVNfRVJSKGRhdGEtPmNsaykgJiYgUFRSX0VSUihkYXRhLT5jbGspICE9IC1FUFJPQkVfREVGRVIpCi0JCWRhdGEtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKwkJZGF0YS0+Y2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgTlVMTCk7CiAJaWYgKElTX0VSUihkYXRhLT5jbGspICYmIFBUUl9FUlIoZGF0YS0+Y2xrKSA9PSAtRVBST0JFX0RFRkVSKQogCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKIAlpZiAoIUlTX0VSUl9PUl9OVUxMKGRhdGEtPmNsaykpIHsKIAkJZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRhdGEtPmNsayk7CiAJCWlmIChlcnIpCi0JCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiY291bGQgbm90IGVuYWJsZSBvcHRpb25hbCBiYXVkY2xrOiAlZFxuIiwKKwkJCWRldl93YXJuKGRldiwgImNvdWxkIG5vdCBlbmFibGUgb3B0aW9uYWwgYmF1ZGNsazogJWRcbiIsCiAJCQkJIGVycik7CiAJCWVsc2UKIAkJCXAtPnVhcnRjbGsgPSBjbGtfZ2V0X3JhdGUoZGF0YS0+Y2xrKTsKQEAgLTQ1NywyNCArNDYzLDI0IEBACiAKIAkvKiBJZiBubyBjbG9jayByYXRlIGlzIGRlZmluZWQsIGZhaWwuICovCiAJaWYgKCFwLT51YXJ0Y2xrKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNsb2NrIHJhdGUgbm90IGRlZmluZWRcbiIpOworCQlkZXZfZXJyKGRldiwgImNsb2NrIHJhdGUgbm90IGRlZmluZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlkYXRhLT5wY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJhcGJfcGNsayIpOwotCWlmIChJU19FUlIoZGF0YS0+Y2xrKSAmJiBQVFJfRVJSKGRhdGEtPmNsaykgPT0gLUVQUk9CRV9ERUZFUikgeworCWRhdGEtPnBjbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAiYXBiX3BjbGsiKTsKKwlpZiAoSVNfRVJSKGRhdGEtPnBjbGspICYmIFBUUl9FUlIoZGF0YS0+cGNsaykgPT0gLUVQUk9CRV9ERUZFUikgewogCQllcnIgPSAtRVBST0JFX0RFRkVSOwogCQlnb3RvIGVycl9jbGs7CiAJfQogCWlmICghSVNfRVJSKGRhdGEtPnBjbGspKSB7CiAJCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZShkYXRhLT5wY2xrKTsKIAkJaWYgKGVycikgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGVuYWJsZSBhcGJfcGNsa1xuIik7CisJCQlkZXZfZXJyKGRldiwgImNvdWxkIG5vdCBlbmFibGUgYXBiX3BjbGtcbiIpOwogCQkJZ290byBlcnJfY2xrOwogCQl9CiAJfQogCi0JZGF0YS0+cnN0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldF9vcHRpb25hbCgmcGRldi0+ZGV2LCBOVUxMKTsKKwlkYXRhLT5yc3QgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0X29wdGlvbmFsKGRldiwgTlVMTCk7CiAJaWYgKElTX0VSUihkYXRhLT5yc3QpICYmIFBUUl9FUlIoZGF0YS0+cnN0KSA9PSAtRVBST0JFX0RFRkVSKSB7CiAJCWVyciA9IC1FUFJPQkVfREVGRVI7CiAJCWdvdG8gZXJyX3BjbGs7CkBAIC01MDYsOCArNTEyLDggQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRhdGEpOwogCi0JcG1fcnVudGltZV9zZXRfYWN0aXZlKCZwZGV2LT5kZXYpOwotCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShkZXYpOworCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CiAKIAlyZXR1cm4gMDsKIApAQCAtNjE5LDYgKzYyNSw3IEBACiAJeyAiQVBNQzBEMDgiLCAwfSwKIAl7ICJBTUQwMDIwIiwgMCB9LAogCXsgIkFNREkwMDIwIiwgMCB9LAorCXsgIkhJU0kwMDMxIiwgMCB9LAogCXsgfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIGR3ODI1MF9hY3BpX21hdGNoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfZmludGVrLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2ZpbnRlay5jCmluZGV4IDczN2I0YjMuLjBmYWNjNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfZmludGVrLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9maW50ZWsuYwpAQCAtMzEsNyArMzEsNyBAQAogI2RlZmluZSBJT19BRERSMiAweDYwCiAjZGVmaW5lIExETiAweDcKIAotI2RlZmluZSBJUlFfTU9ERQkweDcwCisjZGVmaW5lIEZJTlRFS19JUlFfTU9ERQkweDcwCiAjZGVmaW5lIElSUV9TSEFSRQlCSVQoNCkKICNkZWZpbmUgSVJRX01PREVfTUFTSwkoQklUKDYpIHwgQklUKDUpKQogI2RlZmluZSBJUlFfTEVWRUxfTE9XCTAKQEAgLTE5NSw3ICsxOTUsNyBAQAogCW91dGIoTEROLCBwZGF0YS0+YmFzZV9wb3J0ICsgQUREUl9QT1JUKTsKIAlvdXRiKHBkYXRhLT5pbmRleCwgcGRhdGEtPmJhc2VfcG9ydCArIERBVEFfUE9SVCk7CiAKLQlvdXRiKElSUV9NT0RFLCBwZGF0YS0+YmFzZV9wb3J0ICsgQUREUl9QT1JUKTsKKwlvdXRiKEZJTlRFS19JUlFfTU9ERSwgcGRhdGEtPmJhc2VfcG9ydCArIEFERFJfUE9SVCk7CiAJdG1wID0gaW5iKHBkYXRhLT5iYXNlX3BvcnQgKyBEQVRBX1BPUlQpOwogCiAJdG1wICY9IH5JUlFfTU9ERV9NQVNLOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9scHNzLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2xwc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODZmY2YzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9scHNzLmMKQEAgLTAsMCArMSwzNzggQEAKKy8qCisgKiA4MjUwX2xwc3MuYyAtIERyaXZlciBmb3IgVUFSVCBvbiBJbnRlbCBCcmFzd2VsbCBhbmQgdmFyaW91cyBvdGhlciBJbnRlbCBTb0NzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEludGVsIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEFuZHkgU2hldmNoZW5rbyA8YW5kcml5LnNoZXZjaGVua29AbGludXguaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGlvbmFsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEvZHcuaD4KKworI2luY2x1ZGUgIjgyNTAuaCIKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1FSS19VQVJUeAkweDA5MzYKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JZVF9VQVJUMQkweDBmMGEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9CWVRfVUFSVDIJMHgwZjBjCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9CU1dfVUFSVDEJMHgyMjhhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfQlNXX1VBUlQyCTB4MjI4YworCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfQkRXX1VBUlQxCTB4OWNlMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JEV19VQVJUMgkweDljZTQKKworLyogSW50ZWwgTFBTUyBzcGVjaWZpYyByZWdpc3RlcnMgKi8KKworI2RlZmluZSBCWVRfUFJWX0NMSwkJCTB4ODAwCisjZGVmaW5lIEJZVF9QUlZfQ0xLX0VOCQkJQklUKDApCisjZGVmaW5lIEJZVF9QUlZfQ0xLX01fVkFMX1NISUZUCQkxCisjZGVmaW5lIEJZVF9QUlZfQ0xLX05fVkFMX1NISUZUCQkxNgorI2RlZmluZSBCWVRfUFJWX0NMS19VUERBVEUJCUJJVCgzMSkKKworI2RlZmluZSBCWVRfVFhfT1ZGX0lOVAkJCTB4ODIwCisjZGVmaW5lIEJZVF9UWF9PVkZfSU5UX01BU0sJCUJJVCgxKQorCitzdHJ1Y3QgbHBzczgyNTA7CisKK3N0cnVjdCBscHNzODI1MF9ib2FyZCB7CisJdW5zaWduZWQgbG9uZyBmcmVxOworCXVuc2lnbmVkIGludCBiYXNlX2JhdWQ7CisJaW50ICgqc2V0dXApKHN0cnVjdCBscHNzODI1MCAqLCBzdHJ1Y3QgdWFydF9wb3J0ICpwKTsKKwl2b2lkICgqZXhpdCkoc3RydWN0IGxwc3M4MjUwICopOworfTsKKworc3RydWN0IGxwc3M4MjUwIHsKKwlpbnQgbGluZTsKKwlzdHJ1Y3QgbHBzczgyNTBfYm9hcmQgKmJvYXJkOworCisJLyogRE1BIHBhcmFtZXRlcnMgKi8KKwlzdHJ1Y3QgdWFydF84MjUwX2RtYSBkbWE7CisJc3RydWN0IGR3X2RtYV9jaGlwIGRtYV9jaGlwOworCXN0cnVjdCBkd19kbWFfc2xhdmUgZG1hX3BhcmFtOworCXU4IGRtYV9tYXhidXJzdDsKK307CisKK3N0YXRpYyB2b2lkIGJ5dF9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwLCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCisJCQkgICAgc3RydWN0IGt0ZXJtaW9zICpvbGQpCit7CisJdW5zaWduZWQgaW50IGJhdWQgPSB0dHlfdGVybWlvc19iYXVkX3JhdGUodGVybWlvcyk7CisJc3RydWN0IGxwc3M4MjUwICpscHNzID0gcC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZnJlZiA9IGxwc3MtPmJvYXJkLT5mcmVxLCBmdWFydCA9IGJhdWQgKiAxNjsKKwl1bnNpZ25lZCBsb25nIHcgPSBCSVQoMTUpIC0gMTsKKwl1bnNpZ25lZCBsb25nIG0sIG47CisJdTMyIHJlZzsKKworCS8qIEdyYWNlZnVsbHkgaGFuZGxlIHRoZSBCMCBjYXNlOiBmYWxsIGJhY2sgdG8gQjk2MDAgKi8KKwlmdWFydCA9IGZ1YXJ0ID8gZnVhcnQgOiA5NjAwICogMTY7CisKKwkvKiBHZXQgRnVhcnQgY2xvc2VyIHRvIEZyZWYgKi8KKwlmdWFydCAqPSByb3VuZGRvd25fcG93X29mX3R3byhmcmVmIC8gZnVhcnQpOworCisJLyoKKwkgKiBGb3IgYmF1ZCByYXRlcyAwLjVNLCAxTSwgMS41TSwgMk0sIDIuNU0sIDNNLCAzLjVNIGFuZCA0TSB0aGUKKwkgKiBkaXZpZGVycyBtdXN0IGJlIGFkanVzdGVkLgorCSAqCisJICogdWFydGNsayA9IChtIC8gbikgKiAxMDAgTUh6LCB3aGVyZSBtIDw9IG4KKwkgKi8KKwlyYXRpb25hbF9iZXN0X2FwcHJveGltYXRpb24oZnVhcnQsIGZyZWYsIHcsIHcsICZtLCAmbik7CisJcC0+dWFydGNsayA9IGZ1YXJ0OworCisJLyogUmVzZXQgdGhlIGNsb2NrICovCisJcmVnID0gKG0gPDwgQllUX1BSVl9DTEtfTV9WQUxfU0hJRlQpIHwgKG4gPDwgQllUX1BSVl9DTEtfTl9WQUxfU0hJRlQpOworCXdyaXRlbChyZWcsIHAtPm1lbWJhc2UgKyBCWVRfUFJWX0NMSyk7CisJcmVnIHw9IEJZVF9QUlZfQ0xLX0VOIHwgQllUX1BSVl9DTEtfVVBEQVRFOworCXdyaXRlbChyZWcsIHAtPm1lbWJhc2UgKyBCWVRfUFJWX0NMSyk7CisKKwlwLT5zdGF0dXMgJj0gflVQU1RBVF9BVVRPQ1RTOworCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykKKwkJcC0+c3RhdHVzIHw9IFVQU1RBVF9BVVRPQ1RTOworCisJc2VyaWFsODI1MF9kb19zZXRfdGVybWlvcyhwLCB0ZXJtaW9zLCBvbGQpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGJ5dF9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwl1bnNpZ25lZCBpbnQgcmV0ID0gc2VyaWFsODI1MF9kb19nZXRfbWN0cmwocG9ydCk7CisKKwkvKiBGb3JjZSBEQ0QgYW5kIERTUiBzaWduYWxzIHRvIHBlcm1hbmVudGx5IGJlIHJlcG9ydGVkIGFzIGFjdGl2ZSAqLworCXJldCB8PSBUSU9DTV9DQVIgfCBUSU9DTV9EU1I7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJ5dF9zZXJpYWxfc2V0dXAoc3RydWN0IGxwc3M4MjUwICpscHNzLCBzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBkd19kbWFfc2xhdmUgKnBhcmFtID0gJmxwc3MtPmRtYV9wYXJhbTsKKwlzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwID0gdXBfdG9fdTgyNTBwKHBvcnQpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihwb3J0LT5kZXYpOworCXVuc2lnbmVkIGludCBkbWFfZGV2Zm4gPSBQQ0lfREVWRk4oUENJX1NMT1QocGRldi0+ZGV2Zm4pLCAwKTsKKwlzdHJ1Y3QgcGNpX2RldiAqZG1hX2RldiA9IHBjaV9nZXRfc2xvdChwZGV2LT5idXMsIGRtYV9kZXZmbik7CisKKwlzd2l0Y2ggKHBkZXYtPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9CWVRfVUFSVDE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JTV19VQVJUMToKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfQkRXX1VBUlQxOgorCQlwYXJhbS0+c3JjX2lkID0gMzsKKwkJcGFyYW0tPmRzdF9pZCA9IDI7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9CWVRfVUFSVDI6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JTV19VQVJUMjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfQkRXX1VBUlQyOgorCQlwYXJhbS0+c3JjX2lkID0gNTsKKwkJcGFyYW0tPmRzdF9pZCA9IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBhcmFtLT5kbWFfZGV2ID0gJmRtYV9kZXYtPmRldjsKKwlwYXJhbS0+bV9tYXN0ZXIgPSAwOworCXBhcmFtLT5wX21hc3RlciA9IDE7CisKKwkvKiBUT0RPOiBEZXRlY3QgRklGTyBzaXplIGF1dG9tYXRpY2FseSBmb3IgRGVzaWduV2FyZSA4MjUwICovCisJcG9ydC0+Zmlmb3NpemUgPSA2NDsKKwl1cC0+dHhfbG9hZHN6ID0gNjQ7CisKKwlscHNzLT5kbWFfbWF4YnVyc3QgPSAxNjsKKworCXBvcnQtPnNldF90ZXJtaW9zID0gYnl0X3NldF90ZXJtaW9zOworCXBvcnQtPmdldF9tY3RybCA9IGJ5dF9nZXRfbWN0cmw7CisKKwkvKiBEaXNhYmxlIFRYIGNvdW50ZXIgaW50ZXJydXB0cyAqLworCXdyaXRlbChCWVRfVFhfT1ZGX0lOVF9NQVNLLCBwb3J0LT5tZW1iYXNlICsgQllUX1RYX09WRl9JTlQpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTBfRE1BCitzdGF0aWMgY29uc3Qgc3RydWN0IGR3X2RtYV9wbGF0Zm9ybV9kYXRhIHFya19zZXJpYWxfZG1hX3BkYXRhID0geworCS5ucl9jaGFubmVscyA9IDIsCisJLmlzX3ByaXZhdGUgPSB0cnVlLAorCS5pc19ub2xscCA9IHRydWUsCisJLmNoYW5fYWxsb2NhdGlvbl9vcmRlciA9IENIQU5fQUxMT0NBVElPTl9BU0NFTkRJTkcsCisJLmNoYW5fcHJpb3JpdHkgPSBDSEFOX1BSSU9SSVRZX0FTQ0VORElORywKKwkuYmxvY2tfc2l6ZSA9IDQwOTUsCisJLm5yX21hc3RlcnMgPSAxLAorCS5kYXRhX3dpZHRoID0gezR9LAorfTsKKworc3RhdGljIHZvaWQgcXJrX3NlcmlhbF9zZXR1cF9kbWEoc3RydWN0IGxwc3M4MjUwICpscHNzLCBzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB1YXJ0XzgyNTBfZG1hICpkbWEgPSAmbHBzcy0+ZG1hOworCXN0cnVjdCBkd19kbWFfY2hpcCAqY2hpcCA9ICZscHNzLT5kbWFfY2hpcDsKKwlzdHJ1Y3QgZHdfZG1hX3NsYXZlICpwYXJhbSA9ICZscHNzLT5kbWFfcGFyYW07CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KHBvcnQtPmRldik7CisJaW50IHJldDsKKworCWNoaXAtPmRldiA9ICZwZGV2LT5kZXY7CisJY2hpcC0+aXJxID0gcGRldi0+aXJxOworCWNoaXAtPnJlZ3MgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgMSk7CisJY2hpcC0+cGRhdGEgPSAmcXJrX3NlcmlhbF9kbWFfcGRhdGE7CisKKwkvKiBGYWxsaW5nIGJhY2sgdG8gUElPIG1vZGUgaWYgRE1BIHByb2JpbmcgZmFpbHMgKi8KKwlyZXQgPSBkd19kbWFfcHJvYmUoY2hpcCk7CisJaWYgKHJldCkKKwkJcmV0dXJuOworCisJLyogU3BlY2lhbCBETUEgYWRkcmVzcyBmb3IgVUFSVCAqLworCWRtYS0+cnhfZG1hX2FkZHIgPSAweGZmZmZmMDAwOworCWRtYS0+dHhfZG1hX2FkZHIgPSAweGZmZmZmMDAwOworCisJcGFyYW0tPmRtYV9kZXYgPSAmcGRldi0+ZGV2OworCXBhcmFtLT5zcmNfaWQgPSAwOworCXBhcmFtLT5kc3RfaWQgPSAxOworCXBhcmFtLT5oc19wb2xhcml0eSA9IHRydWU7CisKKwlscHNzLT5kbWFfbWF4YnVyc3QgPSA4OworfQorCitzdGF0aWMgdm9pZCBxcmtfc2VyaWFsX2V4aXRfZG1hKHN0cnVjdCBscHNzODI1MCAqbHBzcykKK3sKKwlzdHJ1Y3QgZHdfZG1hX3NsYXZlICpwYXJhbSA9ICZscHNzLT5kbWFfcGFyYW07CisKKwlpZiAoIXBhcmFtLT5kbWFfZGV2KQorCQlyZXR1cm47CisJZHdfZG1hX3JlbW92ZSgmbHBzcy0+ZG1hX2NoaXApOworfQorI2Vsc2UJLyogQ09ORklHX1NFUklBTF84MjUwX0RNQSAqLworc3RhdGljIHZvaWQgcXJrX3NlcmlhbF9zZXR1cF9kbWEoc3RydWN0IGxwc3M4MjUwICpscHNzLCBzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KSB7fQorc3RhdGljIHZvaWQgcXJrX3NlcmlhbF9leGl0X2RtYShzdHJ1Y3QgbHBzczgyNTAgKmxwc3MpIHt9CisjZW5kaWYJLyogIUNPTkZJR19TRVJJQUxfODI1MF9ETUEgKi8KKworc3RhdGljIGludCBxcmtfc2VyaWFsX3NldHVwKHN0cnVjdCBscHNzODI1MCAqbHBzcywgc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYocG9ydC0+ZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gcGNpX2FsbG9jX2lycV92ZWN0b3JzKHBkZXYsIDEsIDEsIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcG9ydC0+aXJxID0gcGNpX2lycV92ZWN0b3IocGRldiwgMCk7CisKKwlxcmtfc2VyaWFsX3NldHVwX2RtYShscHNzLCBwb3J0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcXJrX3NlcmlhbF9leGl0KHN0cnVjdCBscHNzODI1MCAqbHBzcykKK3sKKwlxcmtfc2VyaWFsX2V4aXRfZG1hKGxwc3MpOworfQorCitzdGF0aWMgYm9vbCBscHNzODI1MF9kbWFfZmlsdGVyKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IGR3X2RtYV9zbGF2ZSAqZHdzID0gcGFyYW07CisKKwlpZiAoZHdzLT5kbWFfZGV2ICE9IGNoYW4tPmRldmljZS0+ZGV2KQorCQlyZXR1cm4gZmFsc2U7CisKKwljaGFuLT5wcml2YXRlID0gZHdzOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGxwc3M4MjUwX2RtYV9zZXR1cChzdHJ1Y3QgbHBzczgyNTAgKmxwc3MsIHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgdWFydF84MjUwX2RtYSAqZG1hID0gJmxwc3MtPmRtYTsKKwlzdHJ1Y3QgZHdfZG1hX3NsYXZlICpyeF9wYXJhbSwgKnR4X3BhcmFtOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBvcnQtPnBvcnQuZGV2OworCisJaWYgKCFscHNzLT5kbWFfcGFyYW0uZG1hX2RldikKKwkJcmV0dXJuIDA7CisKKwlyeF9wYXJhbSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcnhfcGFyYW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJ4X3BhcmFtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXR4X3BhcmFtID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCp0eF9wYXJhbSksIEdGUF9LRVJORUwpOworCWlmICghdHhfcGFyYW0pCisJCXJldHVybiAtRU5PTUVNOworCisJKnJ4X3BhcmFtID0gbHBzcy0+ZG1hX3BhcmFtOworCWRtYS0+cnhjb25mLnNyY19tYXhidXJzdCA9IGxwc3MtPmRtYV9tYXhidXJzdDsKKworCSp0eF9wYXJhbSA9IGxwc3MtPmRtYV9wYXJhbTsKKwlkbWEtPnR4Y29uZi5kc3RfbWF4YnVyc3QgPSBscHNzLT5kbWFfbWF4YnVyc3Q7CisKKwlkbWEtPmZuID0gbHBzczgyNTBfZG1hX2ZpbHRlcjsKKwlkbWEtPnJ4X3BhcmFtID0gcnhfcGFyYW07CisJZG1hLT50eF9wYXJhbSA9IHR4X3BhcmFtOworCisJcG9ydC0+ZG1hID0gZG1hOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxwc3M4MjUwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVhcnRfODI1MF9wb3J0IHVhcnQ7CisJc3RydWN0IGxwc3M4MjUwICpscHNzOworCWludCByZXQ7CisKKwlyZXQgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJbHBzcyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmxwc3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxwc3MpCisJCXJldHVybiAtRU5PTUVNOworCisJbHBzcy0+Ym9hcmQgPSAoc3RydWN0IGxwc3M4MjUwX2JvYXJkICopaWQtPmRyaXZlcl9kYXRhOworCisJbWVtc2V0KCZ1YXJ0LCAwLCBzaXplb2Yoc3RydWN0IHVhcnRfODI1MF9wb3J0KSk7CisKKwl1YXJ0LnBvcnQuZGV2ID0gJnBkZXYtPmRldjsKKwl1YXJ0LnBvcnQuaXJxID0gcGRldi0+aXJxOworCXVhcnQucG9ydC5wcml2YXRlX2RhdGEgPSBscHNzOworCXVhcnQucG9ydC50eXBlID0gUE9SVF8xNjU1MEE7CisJdWFydC5wb3J0LmlvdHlwZSA9IFVQSU9fTUVNOworCXVhcnQucG9ydC5yZWdzaGlmdCA9IDI7CisJdWFydC5wb3J0LnVhcnRjbGsgPSBscHNzLT5ib2FyZC0+YmFzZV9iYXVkICogMTY7CisJdWFydC5wb3J0LmZsYWdzID0gVVBGX1NIQVJFX0lSUSB8IFVQRl9GSVhFRF9QT1JUIHwgVVBGX0ZJWEVEX1RZUEU7CisJdWFydC5jYXBhYmlsaXRpZXMgPSBVQVJUX0NBUF9GSUZPIHwgVUFSVF9DQVBfQUZFOworCXVhcnQucG9ydC5tYXBiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCXVhcnQucG9ydC5tZW1iYXNlID0gcGNpbV9pb21hcChwZGV2LCAwLCAwKTsKKwlpZiAoIXVhcnQucG9ydC5tZW1iYXNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGxwc3MtPmJvYXJkLT5zZXR1cChscHNzLCAmdWFydC5wb3J0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbHBzczgyNTBfZG1hX3NldHVwKGxwc3MsICZ1YXJ0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9leGl0OworCisJcmV0ID0gc2VyaWFsODI1MF9yZWdpc3Rlcl84MjUwX3BvcnQoJnVhcnQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9leGl0OworCisJbHBzcy0+bGluZSA9IHJldDsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBscHNzKTsKKwlyZXR1cm4gMDsKKworZXJyX2V4aXQ6CisJaWYgKGxwc3MtPmJvYXJkLT5leGl0KQorCQlscHNzLT5ib2FyZC0+ZXhpdChscHNzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBscHNzODI1MF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGxwc3M4MjUwICpscHNzID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGxwc3MtPmJvYXJkLT5leGl0KQorCQlscHNzLT5ib2FyZC0+ZXhpdChscHNzKTsKKworCXNlcmlhbDgyNTBfdW5yZWdpc3Rlcl9wb3J0KGxwc3MtPmxpbmUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGxwc3M4MjUwX2JvYXJkIGJ5dF9ib2FyZCA9IHsKKwkuZnJlcSA9IDEwMDAwMDAwMCwKKwkuYmFzZV9iYXVkID0gMjc2NDgwMCwKKwkuc2V0dXAgPSBieXRfc2VyaWFsX3NldHVwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBscHNzODI1MF9ib2FyZCBxcmtfYm9hcmQgPSB7CisJLmZyZXEgPSA0NDIzNjgwMCwKKwkuYmFzZV9iYXVkID0gMjc2NDgwMCwKKwkuc2V0dXAgPSBxcmtfc2VyaWFsX3NldHVwLAorCS5leGl0ID0gcXJrX3NlcmlhbF9leGl0LAorfTsKKworI2RlZmluZSBMUFNTX0RFVklDRShpZCwgYm9hcmQpIHsgUENJX1ZERVZJQ0UoSU5URUwsIGlkKSwgKGtlcm5lbF91bG9uZ190KSZib2FyZCB9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfaWRzW10gPSB7CisJTFBTU19ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9RUktfVUFSVHgsIHFya19ib2FyZCksCisJTFBTU19ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9CWVRfVUFSVDEsIGJ5dF9ib2FyZCksCisJTFBTU19ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9CWVRfVUFSVDIsIGJ5dF9ib2FyZCksCisJTFBTU19ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9CU1dfVUFSVDEsIGJ5dF9ib2FyZCksCisJTFBTU19ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9CU1dfVUFSVDIsIGJ5dF9ib2FyZCksCisJTFBTU19ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9CRFdfVUFSVDEsIGJ5dF9ib2FyZCksCisJTFBTU19ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9CRFdfVUFSVDIsIGJ5dF9ib2FyZCksCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwY2lfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGxwc3M4MjUwX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgICAgID0gIjgyNTBfbHBzcyIsCisJLmlkX3RhYmxlICAgICAgID0gcGNpX2lkcywKKwkucHJvYmUgICAgICAgICAgPSBscHNzODI1MF9wcm9iZSwKKwkucmVtb3ZlICAgICAgICAgPSBscHNzODI1MF9yZW1vdmUsCit9OworCittb2R1bGVfcGNpX2RyaXZlcihscHNzODI1MF9wY2lfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSW50ZWwgQ29ycG9yYXRpb24iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgTFBTUyBVQVJUIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9taWQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfbWlkLmMKaW5kZXggMzM5ZGU5Yy4uMzljMjMyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9taWQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX21pZC5jCkBAIC05OSwyNyArOTksMjcgQEAKIAlzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwID0gdXBfdG9fdTgyNTBwKHApOwogCXVuc2lnbmVkIGludCBmaXNyID0gc2VyaWFsX3BvcnRfaW4ocCwgSU5URUxfTUlEX1VBUlRfRE5WX0ZJU1IpOwogCXUzMiBzdGF0dXM7Ci0JaW50IHJldCA9IElSUV9OT05FOworCWludCByZXQgPSAwOwogCWludCBlcnI7CiAKIAlpZiAoZmlzciAmIEJJVCgyKSkgewogCQllcnIgPSBoc3VfZG1hX2dldF9zdGF0dXMoJm1pZC0+ZG1hX2NoaXAsIDEsICZzdGF0dXMpOwogCQlpZiAoZXJyID4gMCkgewogCQkJc2VyaWFsODI1MF9yeF9kbWFfZmx1c2godXApOwotCQkJcmV0IHw9IElSUV9IQU5ETEVEOworCQkJcmV0IHw9IDE7CiAJCX0gZWxzZSBpZiAoZXJyID09IDApCiAJCQlyZXQgfD0gaHN1X2RtYV9kb19pcnEoJm1pZC0+ZG1hX2NoaXAsIDEsIHN0YXR1cyk7CiAJfQogCWlmIChmaXNyICYgQklUKDEpKSB7CiAJCWVyciA9IGhzdV9kbWFfZ2V0X3N0YXR1cygmbWlkLT5kbWFfY2hpcCwgMCwgJnN0YXR1cyk7CiAJCWlmIChlcnIgPiAwKQotCQkJcmV0IHw9IElSUV9IQU5ETEVEOworCQkJcmV0IHw9IDE7CiAJCWVsc2UgaWYgKGVyciA9PSAwKQogCQkJcmV0IHw9IGhzdV9kbWFfZG9faXJxKCZtaWQtPmRtYV9jaGlwLCAwLCBzdGF0dXMpOwogCX0KIAlpZiAoZmlzciAmIEJJVCgwKSkKIAkJcmV0IHw9IHNlcmlhbDgyNTBfaGFuZGxlX2lycShwLCBzZXJpYWxfcG9ydF9pbihwLCBVQVJUX0lJUikpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIElSUV9SRVRWQUwocmV0KTsKIH0KIAogI2RlZmluZSBETlZfRE1BX0NIQU5fT0ZGU0VUIDB4ODAKQEAgLTE2OCw2ICsxNjgsOSBAQAogCXVuc2lnbmVkIGxvbmcgdyA9IEJJVCgyNCkgLSAxOwogCXVuc2lnbmVkIGxvbmcgbXVsLCBkaXY7CiAKKwkvKiBHcmFjZWZ1bGx5IGhhbmRsZSB0aGUgQjAgY2FzZTogZmFsbCBiYWNrIHRvIEI5NjAwICovCisJZnVhcnQgPSBmdWFydCA/IGZ1YXJ0IDogOTYwMCAqIDE2OworCiAJaWYgKG1pZC0+Ym9hcmQtPmZyZXEgPCBmdWFydCkgewogCQkvKiBGaW5kIHByZXNjYWxlciB2YWx1ZSB0aGF0IHNhdGlzZmllcyBGdWFydCA8IEZyZWYgKi8KIAkJaWYgKG1pZC0+Ym9hcmQtPmZyZXEgPiBiYXVkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9tdGsuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfbXRrLmMKaW5kZXggMzYxMWVjOS4uY2UwY2M0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9tdGsuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX210ay5jCkBAIC02Miw3ICs2Miw3IEBACiAJICovCiAJYmF1ZCA9IHVhcnRfZ2V0X2JhdWRfcmF0ZShwb3J0LCB0ZXJtaW9zLCBvbGQsCiAJCQkJICBwb3J0LT51YXJ0Y2xrIC8gMTYgLyAweGZmZmYsCi0JCQkJICBwb3J0LT51YXJ0Y2xrIC8gMTYpOworCQkJCSAgcG9ydC0+dWFydGNsayk7CiAKIAlpZiAoYmF1ZCA8PSAxMTUyMDApIHsKIAkJc2VyaWFsX3BvcnRfb3V0KHBvcnQsIFVBUlRfTVRLX0hJR0hTLCAweDApOwpAQCAtNzYsMTAgKzc2LDYgQEAKIAkJcXVvdCA9IERJVl9ST1VORF9VUChwb3J0LT51YXJ0Y2xrLCA0ICogYmF1ZCk7CiAJfSBlbHNlIHsKIAkJc2VyaWFsX3BvcnRfb3V0KHBvcnQsIFVBUlRfTVRLX0hJR0hTLCAweDMpOwotCi0JCS8qIFNldCB0byBoaWdoZXN0IGJhdWRyYXRlIHN1cHBvcnRlZCAqLwotCQlpZiAoYmF1ZCA+PSAxMTUyMDAwKQotCQkJYmF1ZCA9IDkyMTYwMDsKIAkJcXVvdCA9IERJVl9ST1VORF9VUChwb3J0LT51YXJ0Y2xrLCAyNTYgKiBiYXVkKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfb2YuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfb2YuYwppbmRleCAzODk2M2Q3Li43YThiNWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX29mLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9vZi5jCkBAIC0xOTUsNiArMTk1LDcgQEAKIAlzd2l0Y2ggKHBvcnRfdHlwZSkgewogCWNhc2UgUE9SVF84MjUwIC4uLiBQT1JUX01BWF84MjUwOgogCXsKKwkJdTMyIHR4X3RocmVzaG9sZDsKIAkJc3RydWN0IHVhcnRfODI1MF9wb3J0IHBvcnQ4MjUwOwogCQltZW1zZXQoJnBvcnQ4MjUwLCAwLCBzaXplb2YocG9ydDgyNTApKTsKIAkJcG9ydDgyNTAucG9ydCA9IHBvcnQ7CkBAIC0yMDIsNiArMjAzLDEyIEBACiAJCWlmIChwb3J0LmZpZm9zaXplKQogCQkJcG9ydDgyNTAuY2FwYWJpbGl0aWVzID0gVUFSVF9DQVBfRklGTzsKIAorCQkvKiBDaGVjayBmb3IgVFggRklGTyB0aHJlc2hvbGQgJiBzZXQgdHhfbG9hZHN6ICovCisJCWlmICgob2ZfcHJvcGVydHlfcmVhZF91MzIob2ZkZXYtPmRldi5vZl9ub2RlLCAidHgtdGhyZXNob2xkIiwKKwkJCQkJICAmdHhfdGhyZXNob2xkKSA9PSAwKSAmJgorCQkgICAgKHR4X3RocmVzaG9sZCA8IHBvcnQuZmlmb3NpemUpKQorCQkJcG9ydDgyNTAudHhfbG9hZHN6ID0gcG9ydC5maWZvc2l6ZSAtIHR4X3RocmVzaG9sZDsKKwogCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG9mZGV2LT5kZXYub2Zfbm9kZSwKIAkJCQkJICAiYXV0by1mbG93LWNvbnRyb2wiKSkKIAkJCXBvcnQ4MjUwLmNhcGFiaWxpdGllcyB8PSBVQVJUX0NBUF9BRkU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX29tYXAuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfb21hcC5jCmluZGV4IGUxNDk4MmYuLjYxYWQ2YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfb21hcC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfb21hcC5jCkBAIC0xMzQsMjEgKzEzNCwxOCBAQAogCiAJc2VyaWFsODI1MF9kb19zZXRfbWN0cmwocG9ydCwgbWN0cmwpOwogCi0JaWYgKElTX0VSUl9PUl9OVUxMKG1jdHJsX2dwaW9fdG9fZ3Bpb2QodXAtPmdwaW9zLAotCQkJCQkJVUFSVF9HUElPX1JUUykpKSB7Ci0JCS8qCi0JCSAqIFR1cm4gb2ZmIGF1dG9SVFMgaWYgUlRTIGlzIGxvd2VyZWQgYW5kIHJlc3RvcmUgYXV0b1JUUwotCQkgKiBzZXR0aW5nIGlmIFJUUyBpcyByYWlzZWQKLQkJICovCi0JCWxjciA9IHNlcmlhbF9pbih1cCwgVUFSVF9MQ1IpOwotCQlzZXJpYWxfb3V0KHVwLCBVQVJUX0xDUiwgVUFSVF9MQ1JfQ09ORl9NT0RFX0IpOwotCQlpZiAoKG1jdHJsICYgVElPQ01fUlRTKSAmJiAocG9ydC0+c3RhdHVzICYgVVBTVEFUX0FVVE9SVFMpKQotCQkJcHJpdi0+ZWZyIHw9IFVBUlRfRUZSX1JUUzsKLQkJZWxzZQotCQkJcHJpdi0+ZWZyICY9IH5VQVJUX0VGUl9SVFM7Ci0JCXNlcmlhbF9vdXQodXAsIFVBUlRfRUZSLCBwcml2LT5lZnIpOwotCQlzZXJpYWxfb3V0KHVwLCBVQVJUX0xDUiwgbGNyKTsKLQl9CisJLyoKKwkgKiBUdXJuIG9mZiBhdXRvUlRTIGlmIFJUUyBpcyBsb3dlcmVkIGFuZCByZXN0b3JlIGF1dG9SVFMgc2V0dGluZworCSAqIGlmIFJUUyBpcyByYWlzZWQKKwkgKi8KKwlsY3IgPSBzZXJpYWxfaW4odXAsIFVBUlRfTENSKTsKKwlzZXJpYWxfb3V0KHVwLCBVQVJUX0xDUiwgVUFSVF9MQ1JfQ09ORl9NT0RFX0IpOworCWlmICgobWN0cmwgJiBUSU9DTV9SVFMpICYmIChwb3J0LT5zdGF0dXMgJiBVUFNUQVRfQVVUT1JUUykpCisJCXByaXYtPmVmciB8PSBVQVJUX0VGUl9SVFM7CisJZWxzZQorCQlwcml2LT5lZnIgJj0gflVBUlRfRUZSX1JUUzsKKwlzZXJpYWxfb3V0KHVwLCBVQVJUX0VGUiwgcHJpdi0+ZWZyKTsKKwlzZXJpYWxfb3V0KHVwLCBVQVJUX0xDUiwgbGNyKTsKIH0KIAogLyoKQEAgLTQ0OSw5ICs0NDYsNyBAQAogCXByaXYtPmVmciA9IDA7CiAJdXAtPnBvcnQuc3RhdHVzICY9IH4oVVBTVEFUX0FVVE9DVFMgfCBVUFNUQVRfQVVUT1JUUyB8IFVQU1RBVF9BVVRPWE9GRik7CiAKLQlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMgJiYgdXAtPnBvcnQuZmxhZ3MgJiBVUEZfSEFSRF9GTE9XCi0JCSYmIElTX0VSUl9PUl9OVUxMKG1jdHJsX2dwaW9fdG9fZ3Bpb2QodXAtPmdwaW9zLAotCQkJCQkJCVVBUlRfR1BJT19SVFMpKSkgeworCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUyAmJiB1cC0+cG9ydC5mbGFncyAmIFVQRl9IQVJEX0ZMT1cpIHsKIAkJLyogRW5hYmxlIEFVVE9DVFMgKGF1dG9SVFMgaXMgZW5hYmxlZCB3aGVuIFJUUyBpcyByYWlzZWQpICovCiAJCXVwLT5wb3J0LnN0YXR1cyB8PSBVUFNUQVRfQVVUT0NUUyB8IFVQU1RBVF9BVVRPUlRTOwogCQlwcml2LT5lZnIgfD0gVUFSVF9FRlJfQ1RTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9wY2kuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfcGNpLmMKaW5kZXggMjBlYmFlYS4uYjk4YzE1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9wY2kuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX3BjaS5jCkBAIC0yMSwxNCArMjEsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4LzgyNTBfcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvcmF0aW9uYWwuaD4KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvZG1hLWR3Lmg+Ci0KICNpbmNsdWRlICI4MjUwLmgiCiAKIC8qCkBAIC0xMzQ5LDE2MCArMTM0NSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JZVF9VQVJUMQkweDBmMGEKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9CWVRfVUFSVDIJMHgwZjBjCi0KLSNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9CU1dfVUFSVDEJMHgyMjhhCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfQlNXX1VBUlQyCTB4MjI4YwotCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfQkRXX1VBUlQxCTB4OWNlMwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JEV19VQVJUMgkweDljZTQKLQotI2RlZmluZSBCWVRfUFJWX0NMSwkJCTB4ODAwCi0jZGVmaW5lIEJZVF9QUlZfQ0xLX0VOCQkJKDEgPDwgMCkKLSNkZWZpbmUgQllUX1BSVl9DTEtfTV9WQUxfU0hJRlQJCTEKLSNkZWZpbmUgQllUX1BSVl9DTEtfTl9WQUxfU0hJRlQJCTE2Ci0jZGVmaW5lIEJZVF9QUlZfQ0xLX1VQREFURQkJKDEgPDwgMzEpCi0KLSNkZWZpbmUgQllUX1RYX09WRl9JTlQJCQkweDgyMAotI2RlZmluZSBCWVRfVFhfT1ZGX0lOVF9NQVNLCQkoMSA8PCAxKQotCi1zdGF0aWMgdm9pZAotYnl0X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnAsIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKLQkJc3RydWN0IGt0ZXJtaW9zICpvbGQpCi17Ci0JdW5zaWduZWQgaW50IGJhdWQgPSB0dHlfdGVybWlvc19iYXVkX3JhdGUodGVybWlvcyk7Ci0JdW5zaWduZWQgbG9uZyBmcmVmID0gMTAwMDAwMDAwLCBmdWFydCA9IGJhdWQgKiAxNjsKLQl1bnNpZ25lZCBsb25nIHcgPSBCSVQoMTUpIC0gMTsKLQl1bnNpZ25lZCBsb25nIG0sIG47Ci0JdTMyIHJlZzsKLQotCS8qIEdyYWNlZnVsbHkgaGFuZGxlIHRoZSBCMCBjYXNlOiBmYWxsIGJhY2sgdG8gQjk2MDAgKi8KLQlmdWFydCA9IGZ1YXJ0ID8gZnVhcnQgOiA5NjAwICogMTY7Ci0KLQkvKiBHZXQgRnVhcnQgY2xvc2VyIHRvIEZyZWYgKi8KLQlmdWFydCAqPSByb3VuZGRvd25fcG93X29mX3R3byhmcmVmIC8gZnVhcnQpOwotCi0JLyoKLQkgKiBGb3IgYmF1ZCByYXRlcyAwLjVNLCAxTSwgMS41TSwgMk0sIDIuNU0sIDNNLCAzLjVNIGFuZCA0TSB0aGUKLQkgKiBkaXZpZGVycyBtdXN0IGJlIGFkanVzdGVkLgotCSAqCi0JICogdWFydGNsayA9IChtIC8gbikgKiAxMDAgTUh6LCB3aGVyZSBtIDw9IG4KLQkgKi8KLQlyYXRpb25hbF9iZXN0X2FwcHJveGltYXRpb24oZnVhcnQsIGZyZWYsIHcsIHcsICZtLCAmbik7Ci0JcC0+dWFydGNsayA9IGZ1YXJ0OwotCi0JLyogUmVzZXQgdGhlIGNsb2NrICovCi0JcmVnID0gKG0gPDwgQllUX1BSVl9DTEtfTV9WQUxfU0hJRlQpIHwgKG4gPDwgQllUX1BSVl9DTEtfTl9WQUxfU0hJRlQpOwotCXdyaXRlbChyZWcsIHAtPm1lbWJhc2UgKyBCWVRfUFJWX0NMSyk7Ci0JcmVnIHw9IEJZVF9QUlZfQ0xLX0VOIHwgQllUX1BSVl9DTEtfVVBEQVRFOwotCXdyaXRlbChyZWcsIHAtPm1lbWJhc2UgKyBCWVRfUFJWX0NMSyk7Ci0KLQlwLT5zdGF0dXMgJj0gflVQU1RBVF9BVVRPQ1RTOwotCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykKLQkJcC0+c3RhdHVzIHw9IFVQU1RBVF9BVVRPQ1RTOwotCi0Jc2VyaWFsODI1MF9kb19zZXRfdGVybWlvcyhwLCB0ZXJtaW9zLCBvbGQpOwotfQotCi1zdGF0aWMgYm9vbCBieXRfZG1hX2ZpbHRlcihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKnBhcmFtKQotewotCXN0cnVjdCBkd19kbWFfc2xhdmUgKmR3cyA9IHBhcmFtOwotCi0JaWYgKGR3cy0+ZG1hX2RldiAhPSBjaGFuLT5kZXZpY2UtPmRldikKLQkJcmV0dXJuIGZhbHNlOwotCi0JY2hhbi0+cHJpdmF0ZSA9IGR3czsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotYnl0X2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXVuc2lnbmVkIGludCByZXQgPSBzZXJpYWw4MjUwX2RvX2dldF9tY3RybChwb3J0KTsKLQotCS8qIEZvcmNlIERDRCBhbmQgRFNSIHNpZ25hbHMgdG8gcGVybWFuZW50bHkgYmUgcmVwb3J0ZWQgYXMgYWN0aXZlLiAqLwotCXJldCB8PSBUSU9DTV9DQVIgfCBUSU9DTV9EU1I7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50Ci1ieXRfc2VyaWFsX3NldHVwKHN0cnVjdCBzZXJpYWxfcHJpdmF0ZSAqcHJpdiwKLQkJIGNvbnN0IHN0cnVjdCBwY2lzZXJpYWxfYm9hcmQgKmJvYXJkLAotCQkgc3RydWN0IHVhcnRfODI1MF9wb3J0ICpwb3J0LCBpbnQgaWR4KQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcHJpdi0+ZGV2OwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBvcnQtPnBvcnQuZGV2OwotCXN0cnVjdCB1YXJ0XzgyNTBfZG1hICpkbWE7Ci0Jc3RydWN0IGR3X2RtYV9zbGF2ZSAqdHhfcGFyYW0sICpyeF9wYXJhbTsKLQlzdHJ1Y3QgcGNpX2RldiAqZG1hX2RldjsKLQlpbnQgcmV0OwotCi0JZG1hID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkbWEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRtYSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQl0eF9wYXJhbSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqdHhfcGFyYW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXR4X3BhcmFtKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJ4X3BhcmFtID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpyeF9wYXJhbSksIEdGUF9LRVJORUwpOwotCWlmICghcnhfcGFyYW0pCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsKLQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfQllUX1VBUlQxOgotCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9CU1dfVUFSVDE6Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JEV19VQVJUMToKLQkJcnhfcGFyYW0tPnNyY19pZCA9IDM7Ci0JCXR4X3BhcmFtLT5kc3RfaWQgPSAyOwotCQlicmVhazsKLQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfQllUX1VBUlQyOgotCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9CU1dfVUFSVDI6Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JEV19VQVJUMjoKLQkJcnhfcGFyYW0tPnNyY19pZCA9IDU7Ci0JCXR4X3BhcmFtLT5kc3RfaWQgPSA0OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyeF9wYXJhbS0+bV9tYXN0ZXIgPSAwOwotCXJ4X3BhcmFtLT5wX21hc3RlciA9IDE7Ci0KLQlkbWEtPnJ4Y29uZi5zcmNfbWF4YnVyc3QgPSAxNjsKLQotCXR4X3BhcmFtLT5tX21hc3RlciA9IDA7Ci0JdHhfcGFyYW0tPnBfbWFzdGVyID0gMTsKLQotCWRtYS0+dHhjb25mLmRzdF9tYXhidXJzdCA9IDE2OwotCi0JZG1hX2RldiA9IHBjaV9nZXRfc2xvdChwZGV2LT5idXMsIFBDSV9ERVZGTihQQ0lfU0xPVChwZGV2LT5kZXZmbiksIDApKTsKLQlyeF9wYXJhbS0+ZG1hX2RldiA9ICZkbWFfZGV2LT5kZXY7Ci0JdHhfcGFyYW0tPmRtYV9kZXYgPSAmZG1hX2Rldi0+ZGV2OwotCi0JZG1hLT5mbiA9IGJ5dF9kbWFfZmlsdGVyOwotCWRtYS0+cnhfcGFyYW0gPSByeF9wYXJhbTsKLQlkbWEtPnR4X3BhcmFtID0gdHhfcGFyYW07Ci0KLQlyZXQgPSBwY2lfZGVmYXVsdF9zZXR1cChwcml2LCBib2FyZCwgcG9ydCwgaWR4KTsKLQlwb3J0LT5wb3J0LmlvdHlwZSA9IFVQSU9fTUVNOwotCXBvcnQtPnBvcnQudHlwZSA9IFBPUlRfMTY1NTBBOwotCXBvcnQtPnBvcnQuZmxhZ3MgPSAocG9ydC0+cG9ydC5mbGFncyB8IFVQRl9GSVhFRF9QT1JUIHwgVVBGX0ZJWEVEX1RZUEUpOwotCXBvcnQtPnBvcnQuc2V0X3Rlcm1pb3MgPSBieXRfc2V0X3Rlcm1pb3M7Ci0JcG9ydC0+cG9ydC5nZXRfbWN0cmwgPSBieXRfZ2V0X21jdHJsOwotCXBvcnQtPnBvcnQuZmlmb3NpemUgPSA2NDsKLQlwb3J0LT50eF9sb2Fkc3ogPSA2NDsKLQlwb3J0LT5kbWEgPSBkbWE7Ci0JcG9ydC0+Y2FwYWJpbGl0aWVzID0gVUFSVF9DQVBfRklGTyB8IFVBUlRfQ0FQX0FGRTsKLQotCS8qIERpc2FibGUgVHggY291bnRlciBpbnRlcnJ1cHRzICovCi0Jd3JpdGVsKEJZVF9UWF9PVkZfSU5UX01BU0ssIHBvcnQtPnBvcnQubWVtYmFzZSArIEJZVF9UWF9PVkZfSU5UKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBpbnQKIHBjaV9vbWVnYXBjaV9zZXR1cChzdHJ1Y3Qgc2VyaWFsX3ByaXZhdGUgKnByaXYsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lzZXJpYWxfYm9hcmQgKmJvYXJkLApAQCAtMTc0MSw2ICsxNTgzLDE5IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRVhBUl9YUjE3VjQzNTgJMHg0MzU4CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRVhBUl9YUjE3VjgzNTgJMHg4MzU4CiAKKyNkZWZpbmUgVUFSVF9FWEFSX01QSU9JTlRfN18wCTB4OGYJLyogTVBJT0lOVFs3OjBdICovCisjZGVmaW5lIFVBUlRfRVhBUl9NUElPTFZMXzdfMAkweDkwCS8qIE1QSU9MVkxbNzowXSAqLworI2RlZmluZSBVQVJUX0VYQVJfTVBJTzNUXzdfMAkweDkxCS8qIE1QSU8zVFs3OjBdICovCisjZGVmaW5lIFVBUlRfRVhBUl9NUElPSU5WXzdfMAkweDkyCS8qIE1QSU9JTlZbNzowXSAqLworI2RlZmluZSBVQVJUX0VYQVJfTVBJT1NFTF83XzAJMHg5MwkvKiBNUElPU0VMWzc6MF0gKi8KKyNkZWZpbmUgVUFSVF9FWEFSX01QSU9PRF83XzAJMHg5NAkvKiBNUElPT0RbNzowXSAqLworI2RlZmluZSBVQVJUX0VYQVJfTVBJT0lOVF8xNV84CTB4OTUJLyogTVBJT0lOVFsxNTo4XSAqLworI2RlZmluZSBVQVJUX0VYQVJfTVBJT0xWTF8xNV84CTB4OTYJLyogTVBJT0xWTFsxNTo4XSAqLworI2RlZmluZSBVQVJUX0VYQVJfTVBJTzNUXzE1XzgJMHg5NwkvKiBNUElPM1RbMTU6OF0gKi8KKyNkZWZpbmUgVUFSVF9FWEFSX01QSU9JTlZfMTVfOAkweDk4CS8qIE1QSU9JTlZbMTU6OF0gKi8KKyNkZWZpbmUgVUFSVF9FWEFSX01QSU9TRUxfMTVfOAkweDk5CS8qIE1QSU9TRUxbMTU6OF0gKi8KKyNkZWZpbmUgVUFSVF9FWEFSX01QSU9PRF8xNV84CTB4OWEJLyogTVBJT09EWzE1OjhdICovCisKIHN0YXRpYyBpbnQKIHBjaV94cjE3YzE1NF9zZXR1cChzdHJ1Y3Qgc2VyaWFsX3ByaXZhdGUgKnByaXYsCiAJCSAgY29uc3Qgc3RydWN0IHBjaXNlcmlhbF9ib2FyZCAqYm9hcmQsCkBAIC0xNzgzLDE4ICsxNjM4LDE4IEBACiAJICogU2V0dXAgTXVsdGlwdXJwb3NlIElucHV0L091dHB1dCBwaW5zLgogCSAqLwogCWlmIChpZHggPT0gMCkgewotCQl3cml0ZWIoMHgwMCwgcCArIDB4OGYpOyAvKk1QSU9JTlRbNzowXSovCi0JCXdyaXRlYigweDAwLCBwICsgMHg5MCk7IC8qTVBJT0xWTFs3OjBdKi8KLQkJd3JpdGViKDB4MDAsIHAgKyAweDkxKTsgLypNUElPM1RbNzowXSovCi0JCXdyaXRlYigweDAwLCBwICsgMHg5Mik7IC8qTVBJT0lOVls3OjBdKi8KLQkJd3JpdGViKDB4MDAsIHAgKyAweDkzKTsgLypNUElPU0VMWzc6MF0qLwotCQl3cml0ZWIoMHgwMCwgcCArIDB4OTQpOyAvKk1QSU9PRFs3OjBdKi8KLQkJd3JpdGViKDB4MDAsIHAgKyAweDk1KTsgLypNUElPSU5UWzE1OjhdKi8KLQkJd3JpdGViKDB4MDAsIHAgKyAweDk2KTsgLypNUElPTFZMWzE1OjhdKi8KLQkJd3JpdGViKDB4MDAsIHAgKyAweDk3KTsgLypNUElPM1RbMTU6OF0qLwotCQl3cml0ZWIoMHgwMCwgcCArIDB4OTgpOyAvKk1QSU9JTlZbMTU6OF0qLwotCQl3cml0ZWIoMHgwMCwgcCArIDB4OTkpOyAvKk1QSU9TRUxbMTU6OF0qLwotCQl3cml0ZWIoMHgwMCwgcCArIDB4OWEpOyAvKk1QSU9PRFsxNTo4XSovCisJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU9JTlRfN18wKTsKKwkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJT0xWTF83XzApOworCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPM1RfN18wKTsKKwkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJT0lOVl83XzApOworCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPU0VMXzdfMCk7CisJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU9PRF83XzApOworCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPSU5UXzE1XzgpOworCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPTFZMXzE1XzgpOworCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPM1RfMTVfOCk7CisJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU9JTlZfMTVfOCk7CisJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU9TRUxfMTVfOCk7CisJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU9PRF8xNV84KTsKIAl9CiAJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfOFhNT0RFKTsKIAl3cml0ZWIoVUFSVF9GQ1RSX0VYQVJfVFJHRCwgcCArIFVBUlRfRVhBUl9GQ1RSKTsKQEAgLTE4MzAsMjAgKzE2ODUsMjAgQEAKIAkJc3dpdGNoIChwcml2LT5kZXYtPmRldmljZSkgewogCQljYXNlIFBDSV9ERVZJQ0VfSURfQ09NTVRFQ0hfNDIyMlBDSTMzNToKIAkJY2FzZSBQQ0lfREVWSUNFX0lEX0NPTU1URUNIXzQyMjRQQ0kzMzU6Ci0JCQl3cml0ZWIoMHg3OCwgcCArIDB4OTApOyAvKiBNUElPTFZMWzc6MF0gKi8KLQkJCXdyaXRlYigweDAwLCBwICsgMHg5Mik7IC8qIE1QSU9JTlZbNzowXSAqLwotCQkJd3JpdGViKDB4MDAsIHAgKyAweDkzKTsgLyogTVBJT1NFTFs3OjBdICovCisJCQl3cml0ZWIoMHg3OCwgcCArIFVBUlRfRVhBUl9NUElPTFZMXzdfMCk7CisJCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPSU5WXzdfMCk7CisJCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPU0VMXzdfMCk7CiAJCQlicmVhazsKIAkJY2FzZSBQQ0lfREVWSUNFX0lEX0NPTU1URUNIXzIzMjRQQ0kzMzU6CiAJCWNhc2UgUENJX0RFVklDRV9JRF9DT01NVEVDSF8yMzI4UENJMzM1OgotCQkJd3JpdGViKDB4MDAsIHAgKyAweDkwKTsgLyogTVBJT0xWTFs3OjBdICovCi0JCQl3cml0ZWIoMHhjMCwgcCArIDB4OTIpOyAvKiBNUElPSU5WWzc6MF0gKi8KLQkJCXdyaXRlYigweGMwLCBwICsgMHg5Myk7IC8qIE1QSU9TRUxbNzowXSAqLworCQkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJT0xWTF83XzApOworCQkJd3JpdGViKDB4YzAsIHAgKyBVQVJUX0VYQVJfTVBJT0lOVl83XzApOworCQkJd3JpdGViKDB4YzAsIHAgKyBVQVJUX0VYQVJfTVBJT1NFTF83XzApOwogCQkJYnJlYWs7CiAJCX0KLQkJd3JpdGViKDB4MDAsIHAgKyAweDhmKTsgLyogTVBJT0lOVFs3OjBdICovCi0JCXdyaXRlYigweDAwLCBwICsgMHg5MSk7IC8qIE1QSU8zVFs3OjBdICovCi0JCXdyaXRlYigweDAwLCBwICsgMHg5NCk7IC8qIE1QSU9PRFs3OjBdICovCisJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU9JTlRfN18wKTsKKwkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJTzNUXzdfMCk7CisJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU9PRF83XzApOwogCX0KIAl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl84WE1PREUpOwogCXdyaXRlYihVQVJUX0ZDVFJfRVhBUl9UUkdELCBwICsgVUFSVF9FWEFSX0ZDVFIpOwpAQCAtMTkzNCw3ICsxNzg5LDYgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01NVEVDSF80MjIyUENJRQkweDAwMjIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9CUk9BRENPTV9UUlVNQU5BR0UgMHgxNjBhCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1DQ19BRERJREFUQV9BUENJNzgwMCAweDgxOGUKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9RUktfVUFSVAkweDA5MzYKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NVTklYCQkweDFmZDQKICNkZWZpbmUgUENJX0RFVklDRV9JRF9TVU5JWF8xOTk5CTB4MTk5OQpAQCAtMTk1MCw2ICsxODA0LDQzIEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEVSSUNPTV9QSTdDOVg3OTU0CTB4Nzk1NAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BFUklDT01fUEk3QzlYNzk1OAkweDc5NTgKIAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FDQ0VTSU8JCQkweDQ5NGYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NXzJTREIJMHgxMDUxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9DT01fMlMJMHgxMDUzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTV80U0RCCTB4MTA1QworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfQ09NXzRTCTB4MTA1RQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT00yMzJfMkRCCTB4MTA5MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfQ09NMjMyXzIJMHgxMDkzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTTIzMl80REIJMHgxMDk5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9DT00yMzJfNAkweDEwOUIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NXzJTTURCCTB4MTBEMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfQ09NXzJTTQkweDEwRDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NXzRTTURCCTB4MTBEQQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfQ09NXzRTTQkweDEwREMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0lDTTQ4NV8xCTB4MTEwOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfSUNNNDIyXzIJMHgxMTEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9JQ000ODVfMgkweDExMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0lDTTQyMl80CTB4MTExOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfSUNNNDg1XzQJMHgxMTE5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0lDTV8yUwkweDExNTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfSUNNXzRTCTB4MTE1QQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9JQ00yMzJfMgkweDExOTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0lDTTIzMl8yCTB4MTE5MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9JQ00yMzJfNAkweDExOTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0lDTTIzMl80CTB4MTE5OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9JQ01fMlNNCTB4MTFEMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT000MjJfNAkweDEwNUEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NNDg1XzQJMHgxMDVCCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTTQyMl84CTB4MTA2QQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT000ODVfOAkweDEwNkIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NMjMyXzQJMHgxMDk4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTTIzMl84CTB4MTBBOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT01fNFNNCTB4MTBEOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT01fOFNNCTB4MTBFOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9JQ01fNFNNCTB4MTFEOAorCisKKwogLyogVW5rbm93biB2ZW5kb3JzL2NhcmRzIC0gdGhpcyBzaG91bGQgbm90IGJlIGluIGxpbnV4L3BjaV9pZHMuaCAqLwogI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX1VOS05PV05fMHgxNTg0CTB4MTU4NAogI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX1VOS05PV05fMHgxNTg4CTB4MTU4OApAQCAtMjA0MSw0OCArMTkzMiw2IEBACiAJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAogCQkuc2V0dXAJCT0ga3Rfc2VyaWFsX3NldHVwLAogCX0sCi0JewotCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9JTlRFTF9CWVRfVUFSVDEsCi0JCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAotCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKLQkJLnNldHVwCQk9IGJ5dF9zZXJpYWxfc2V0dXAsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JZVF9VQVJUMiwKLQkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCi0JCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAotCQkuc2V0dXAJCT0gYnl0X3NlcmlhbF9zZXR1cCwKLQl9LAotCXsKLQkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfSU5URUxfQlNXX1VBUlQxLAotCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKLQkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCi0JCS5zZXR1cAkJPSBieXRfc2VyaWFsX3NldHVwLAotCX0sCi0JewotCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9JTlRFTF9CU1dfVUFSVDIsCi0JCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAotCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKLQkJLnNldHVwCQk9IGJ5dF9zZXJpYWxfc2V0dXAsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JEV19VQVJUMSwKLQkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCi0JCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAotCQkuc2V0dXAJCT0gYnl0X3NlcmlhbF9zZXR1cCwKLQl9LAotCXsKLQkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfSU5URUxfQkRXX1VBUlQyLAotCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKLQkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCi0JCS5zZXR1cAkJPSBieXRfc2VyaWFsX3NldHVwLAotCX0sCiAJLyoKIAkgKiBJVEUKIAkgKi8KQEAgLTI5NTUsOCArMjgwNCw2IEBACiAJcGJuX0FERElEQVRBX1BDSWVfNF8zOTA2MjUwLAogCXBibl9BRERJREFUQV9QQ0llXzhfMzkwNjI1MCwKIAlwYm5fY2U0MTAwXzFfMTE1MjAwLAotCXBibl9ieXQsCi0JcGJuX3FyaywKIAlwYm5fb21lZ2FwY2ksCiAJcGJuX05FVE1PUzk5MDBfMnNfMTE1MjAwLAogCXBibl9icmNtX3RydW1hbmFnZSwKQEAgLTM3MzIsMTggKzM1NzksNiBAQAogCQkuYmFzZV9iYXVkCT0gOTIxNjAwLAogCQkucmVnX3NoaWZ0ICAgICAgPSAyLAogCX0sCi0JW3Bibl9ieXRdID0gewotCQkuZmxhZ3MJCT0gRkxfQkFTRTAsCi0JCS5udW1fcG9ydHMJPSAxLAotCQkuYmFzZV9iYXVkCT0gMjc2NDgwMCwKLQkJLnJlZ19zaGlmdCAgICAgID0gMiwKLQl9LAotCVtwYm5fcXJrXSA9IHsKLQkJLmZsYWdzCQk9IEZMX0JBU0UwLAotCQkubnVtX3BvcnRzCT0gMSwKLQkJLmJhc2VfYmF1ZAk9IDI3NjQ4MDAsCi0JCS5yZWdfc2hpZnQJPSAyLAotCX0sCiAJW3Bibl9vbWVnYXBjaV0gPSB7CiAJCS5mbGFncwkJPSBGTF9CQVNFMCwKIAkJLm51bV9wb3J0cwk9IDgsCkBAIC0zODU1LDYgKzM2OTAsMTUgQEAKIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDA4MWQpLCB9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MTE5MSksIH0sCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxOWQ4KSwgfSwKKworCS8qIEludGVsIHBsYXRmb3JtcyB3aXRoIERlc2lnbldhcmUgVUFSVCAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MDkzNiksIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgwZjBhKSwgfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDBmMGMpLCB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjI4YSksIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyMjhjKSwgfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDljZTMpLCB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4OWNlNCksIH0sCiB9OwogCiAvKgpAQCAtNTExMyw2ICs0OTU3LDEwOCBAQAogCQkwLAogCQkwLCBwYm5fcGVyaWNvbV9QSTdDOVg3OTU4IH0sCiAJLyoKKwkgKiBBQ0NFUyBJL08gUHJvZHVjdHMgcXVhZAorCSAqLworCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT01fMlNEQiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfQ09NXzJTLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTV80U0RCLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9DT01fNFMsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NMjMyXzJEQiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfQ09NMjMyXzIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NMjMyXzREQiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfQ09NMjMyXzQsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NXzJTTURCLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9DT01fMlNNLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTV80U01EQiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfQ09NXzRTTSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfSUNNNDg1XzEsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0lDTTQyMl8yLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9JQ000ODVfMiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfSUNNNDIyXzQsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0lDTTQ4NV80LAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0lDTV8yUywKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9JQ01fNFMsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfSUNNMjMyXzIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0lDTTIzMl8yLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0lDTTIzMl80LAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9JQ00yMzJfNCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9JQ01fMlNNLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTTQyMl80LAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU4IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTTQ4NV80LAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU4IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTTQyMl84LAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU4IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTTQ4NV84LAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU4IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTTIzMl80LAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU4IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTTIzMl84LAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU4IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTV80U00sCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTggfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NXzhTTSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1OCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9JQ01fNFNNLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU4IH0sCisJLyoKIAkgKiBUb3BpYyBUUDU2MCBEYXRhL0ZheC9Wb2ljZSA1NmsgbW9kZW0gKHJlcG9ydGVkIGJ5IEV2YW4gQ2xhcmtlKQogCSAqLwogCXsJUENJX1ZFTkRPUl9JRF9UT1BJQywgUENJX0RFVklDRV9JRF9UT1BJQ19UUDU2MCwKQEAgLTU1MjAsNDAgKzU0NjYsNyBAQAogCXsJUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9DRTQxMDBfVUFSVCwKIAkJUENJX0FOWV9JRCwgIFBDSV9BTllfSUQsIDAsIDAsCiAJCXBibl9jZTQxMDBfMV8xMTUyMDAgfSwKLQkvKiBJbnRlbCBCYXlUcmFpbCAqLwotCXsJUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9CWVRfVUFSVDEsCi0JCVBDSV9BTllfSUQsICBQQ0lfQU5ZX0lELAotCQlQQ0lfQ0xBU1NfQ09NTVVOSUNBVElPTl9TRVJJQUwgPDwgOCwgMHhmZjAwMDAsCi0JCXBibl9ieXQgfSwKLQl7CVBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfQllUX1VBUlQyLAotCQlQQ0lfQU5ZX0lELCAgUENJX0FOWV9JRCwKLQkJUENJX0NMQVNTX0NPTU1VTklDQVRJT05fU0VSSUFMIDw8IDgsIDB4ZmYwMDAwLAotCQlwYm5fYnl0IH0sCi0JewlQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0JTV19VQVJUMSwKLQkJUENJX0FOWV9JRCwgIFBDSV9BTllfSUQsCi0JCVBDSV9DTEFTU19DT01NVU5JQ0FUSU9OX1NFUklBTCA8PCA4LCAweGZmMDAwMCwKLQkJcGJuX2J5dCB9LAotCXsJUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9CU1dfVUFSVDIsCi0JCVBDSV9BTllfSUQsICBQQ0lfQU5ZX0lELAotCQlQQ0lfQ0xBU1NfQ09NTVVOSUNBVElPTl9TRVJJQUwgPDwgOCwgMHhmZjAwMDAsCi0JCXBibl9ieXQgfSwKIAotCS8qIEludGVsIEJyb2Fkd2VsbCAqLwotCXsJUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9CRFdfVUFSVDEsCi0JCVBDSV9BTllfSUQsICBQQ0lfQU5ZX0lELAotCQlQQ0lfQ0xBU1NfQ09NTVVOSUNBVElPTl9TRVJJQUwgPDwgOCwgMHhmZjAwMDAsCi0JCXBibl9ieXQgfSwKLQl7CVBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfQkRXX1VBUlQyLAotCQlQQ0lfQU5ZX0lELCAgUENJX0FOWV9JRCwKLQkJUENJX0NMQVNTX0NPTU1VTklDQVRJT05fU0VSSUFMIDw8IDgsIDB4ZmYwMDAwLAotCQlwYm5fYnl0IH0sCi0KLQkvKgotCSAqIEludGVsIFF1YXJrIHgxMDAwCi0JICovCi0JewlQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX1FSS19VQVJULAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAotCQlwYm5fcXJrIH0sCiAJLyoKIAkgKiBDcm9ueXggT21lZ2EgUENJCiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX3BvcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfcG9ydC5jCmluZGV4IDc0ODFiOTUuLjFiZmI2ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfcG9ydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfcG9ydC5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIAkJLmZpZm9fc2l6ZQk9IDE2LAogCQkudHhfbG9hZHN6CT0gMTYsCiAJCS5mY3IJCT0gVUFSVF9GQ1JfRU5BQkxFX0ZJRk8gfCBVQVJUX0ZDUl9SX1RSSUdfMDAsCi0JCS5mbGFncwkJPSBVQVJUX0NBUF9GSUZPIHwgVUFSVF9DQVBfQUZFLAorCQkuZmxhZ3MJCT0gVUFSVF9DQVBfRklGTyAvKiB8IFVBUlRfQ0FQX0FGRSAqLywKIAl9LAogCVtQT1JUX1U2XzE2NTUwQV0gPSB7CiAJCS5uYW1lCQk9ICJVNl8xNjU1MEEiLApAQCAtNTg1LDExICs1ODUsMTEgQEAKICAqLwogaW50IHNlcmlhbDgyNTBfZW00ODVfaW5pdChzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnApCiB7Ci0JaWYgKHAtPmVtNDg1ICE9IE5VTEwpCisJaWYgKHAtPmVtNDg1KQogCQlyZXR1cm4gMDsKIAogCXAtPmVtNDg1ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVhcnRfODI1MF9lbTQ4NSksIEdGUF9BVE9NSUMpOwotCWlmIChwLT5lbTQ4NSA9PSBOVUxMKQorCWlmICghcC0+ZW00ODUpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJc2V0dXBfdGltZXIoJnAtPmVtNDg1LT5zdG9wX3R4X3RpbWVyLApAQCAtNjE5LDcgKzYxOSw3IEBACiAgKi8KIHZvaWQgc2VyaWFsODI1MF9lbTQ4NV9kZXN0cm95KHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqcCkKIHsKLQlpZiAocC0+ZW00ODUgPT0gTlVMTCkKKwlpZiAoIXAtPmVtNDg1KQogCQlyZXR1cm47CiAKIAlkZWxfdGltZXIoJnAtPmVtNDg1LT5zdGFydF90eF90aW1lcik7CkBAIC0xNDAyLDEwICsxNDAyLDggQEAKIAogc3RhdGljIHZvaWQgX19kb19zdG9wX3R4X3JzNDg1KHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqcCkKIHsKLQlpZiAoIXAtPmVtNDg1KQotCQlyZXR1cm47Ci0KIAlzZXJpYWw4MjUwX2VtNDg1X3J0c19hZnRlcl9zZW5kKHApOworCiAJLyoKIAkgKiBFbXB0eSB0aGUgUlggRklGTywgd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIGFueXRoaW5nCiAJICogcmVjZWl2ZWQgZHVyaW5nIHRoZSBoYWxmLWR1cGxleCB0cmFuc21pc3Npb24uCkBAIC0xNDE0LDEyICsxNDEyLDggQEAKIAlpZiAoIShwLT5wb3J0LnJzNDg1LmZsYWdzICYgU0VSX1JTNDg1X1JYX0RVUklOR19UWCkpIHsKIAkJc2VyaWFsODI1MF9jbGVhcl9maWZvcyhwKTsKIAotCQlzZXJpYWw4MjUwX3JwbV9nZXQocCk7Ci0KIAkJcC0+aWVyIHw9IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREk7CiAJCXNlcmlhbF9wb3J0X291dCgmcC0+cG9ydCwgVUFSVF9JRVIsIHAtPmllcik7Ci0KLQkJc2VyaWFsODI1MF9ycG1fcHV0KHApOwogCX0KIH0KIApAQCAtMTQyOSw2ICsxNDIzLDcgQEAKIAlzdHJ1Y3QgdWFydF84MjUwX2VtNDg1ICplbTQ4NSA9IHAtPmVtNDg1OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlzZXJpYWw4MjUwX3JwbV9nZXQocCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnAtPnBvcnQubG9jaywgZmxhZ3MpOwogCWlmIChlbTQ4NSAmJgogCSAgICBlbTQ4NS0+YWN0aXZlX3RpbWVyID09ICZlbTQ4NS0+c3RvcF90eF90aW1lcikgewpAQCAtMTQzNiwxNSArMTQzMSwxMyBAQAogCQllbTQ4NS0+YWN0aXZlX3RpbWVyID0gTlVMTDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+cG9ydC5sb2NrLCBmbGFncyk7CisJc2VyaWFsODI1MF9ycG1fcHV0KHApOwogfQogCiBzdGF0aWMgdm9pZCBfX3N0b3BfdHhfcnM0ODUoc3RydWN0IHVhcnRfODI1MF9wb3J0ICpwKQogewogCXN0cnVjdCB1YXJ0XzgyNTBfZW00ODUgKmVtNDg1ID0gcC0+ZW00ODU7CiAKLQlpZiAoIWVtNDg1KQotCQlyZXR1cm47Ci0KIAkvKgogCSAqIF9fZG9fc3RvcF90eF9yczQ4NSBpcyBnb2luZyB0byBzZXQgUlRTIGFjY29yZGluZyB0byBjb25maWcKIAkgKiBBTkQgZmx1c2ggUlggRklGTyBpZiByZXF1aXJlZC4KQEAgLTE0NzUsNyArMTQ2OCw3IEBACiAJCXVuc2lnbmVkIGNoYXIgbHNyID0gc2VyaWFsX2luKHAsIFVBUlRfTFNSKTsKIAkJLyoKIAkJICogVG8gcHJvdmlkZSByZXF1aXJlZCB0aW1laW5nIGFuZCBhbGxvdyBGSUZPIHRyYW5zZmVyLAotCQkgKiBfX3N0b3BfdHhfcnM0ODUgbXVzdCBiZSBjYWxsZWQgb25seSB3aGVuIGJvdGggRklGTyBhbmQKKwkJICogX19zdG9wX3R4X3JzNDg1KCkgbXVzdCBiZSBjYWxsZWQgb25seSB3aGVuIGJvdGggRklGTyBhbmQKIAkJICogc2hpZnQgcmVnaXN0ZXIgYXJlIGVtcHR5LiBJdCBpcyBmb3IgZGV2aWNlIGRyaXZlciB0byBlbmFibGUKIAkJICogaW50ZXJydXB0IG9uIFRFTVQuCiAJCSAqLwpAQCAtMTQ4NCw5ICsxNDc3LDEwIEBACiAKIAkJZGVsX3RpbWVyKCZlbTQ4NS0+c3RhcnRfdHhfdGltZXIpOwogCQllbTQ4NS0+YWN0aXZlX3RpbWVyID0gTlVMTDsKKworCQlfX3N0b3BfdHhfcnM0ODUocCk7CiAJfQogCV9fZG9fc3RvcF90eChwKTsKLQlfX3N0b3BfdHhfcnM0ODUocCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNlcmlhbDgyNTBfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQpAQCAtMTYxOCw4ICsxNjEyLDYgQEAKIAlpZiAodXAtPmJ1Z3MgJiBVQVJUX0JVR19OT01TUikKIAkJcmV0dXJuOwogCi0JbWN0cmxfZ3Bpb19kaXNhYmxlX21zKHVwLT5ncGlvcyk7Ci0KIAl1cC0+aWVyICY9IH5VQVJUX0lFUl9NU0k7CiAJc2VyaWFsX3BvcnRfb3V0KHBvcnQsIFVBUlRfSUVSLCB1cC0+aWVyKTsKIH0KQEAgLTE2MzIsOCArMTYyNCw2IEBACiAJaWYgKHVwLT5idWdzICYgVUFSVF9CVUdfTk9NU1IpCiAJCXJldHVybjsKIAotCW1jdHJsX2dwaW9fZW5hYmxlX21zKHVwLT5ncGlvcyk7Ci0KIAl1cC0+aWVyIHw9IFVBUlRfSUVSX01TSTsKIAogCXNlcmlhbDgyNTBfcnBtX2dldCh1cCk7CkBAIC0xODgwLDYgKzE4NzAsMzAgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKgorICogTmV3ZXIgMTY1NTAgY29tcGF0aWJsZSBwYXJ0cyBzdWNoIGFzIHRoZSBTQzE2QzY1MCAmIEFsdGVyYSAxNjU1MCBTb2Z0IElQCisgKiBoYXZlIGEgcHJvZ3JhbW1hYmxlIFRYIHRocmVzaG9sZCB0aGF0IHRyaWdnZXJzIHRoZSBUSFJFIGludGVycnVwdCBpbgorICogdGhlIElJUiByZWdpc3Rlci4gSW4gdGhpcyBjYXNlLCB0aGUgVEhSRSBpbnRlcnJ1cHQgaW5kaWNhdGVzIHRoZSBGSUZPCisgKiBoYXMgc3BhY2UgYXZhaWxhYmxlLiBMb2FkIGl0IHVwIHdpdGggdHhfbG9hZHN6IGJ5dGVzLgorICovCitzdGF0aWMgaW50IHNlcmlhbDgyNTBfdHhfdGhyZXNob2xkX2hhbmRsZV9pcnEoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpaXIgPSBzZXJpYWxfcG9ydF9pbihwb3J0LCBVQVJUX0lJUik7CisKKwkvKiBUWCBUaHJlc2hvbGQgSVJRIHRyaWdnZXJlZCBzbyBsb2FkIHVwIEZJRk8gKi8KKwlpZiAoKGlpciAmIFVBUlRfSUlSX0lEKSA9PSBVQVJUX0lJUl9USFJJKSB7CisJCXN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXAgPSB1cF90b191ODI1MHAocG9ydCk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwkJc2VyaWFsODI1MF90eF9jaGFycyh1cCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlpaXIgPSBzZXJpYWxfcG9ydF9pbihwb3J0LCBVQVJUX0lJUik7CisJcmV0dXJuIHNlcmlhbDgyNTBfaGFuZGxlX2lycShwb3J0LCBpaXIpOworfQorCiBzdGF0aWMgdW5zaWduZWQgaW50IHNlcmlhbDgyNTBfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwID0gdXBfdG9fdTgyNTBwKHBvcnQpOwpAQCAtMTkxNyw4ICsxOTMxLDcgQEAKIAkJcmV0IHw9IFRJT0NNX0RTUjsKIAlpZiAoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKQogCQlyZXQgfD0gVElPQ01fQ1RTOwotCi0JcmV0dXJuIG1jdHJsX2dwaW9fZ2V0KHVwLT5ncGlvcywgJnJldCk7CisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNlcmlhbDgyNTBfZG9fZ2V0X21jdHJsKTsKIApAQCAtMTk5Myw2ICsyMDA2LDcgQEAKIAkJaWYgKC0tdG1vdXQgPT0gMCkKIAkJCWJyZWFrOwogCQl1ZGVsYXkoMSk7CisJCXRvdWNoX25taV93YXRjaGRvZygpOwogCX0KIAogCS8qIFdhaXQgdXAgdG8gMXMgZm9yIGZsb3cgY29udHJvbCBpZiBuZWNlc3NhcnkgKi8KQEAgLTIxNjksNiArMjE4MywyNSBAQAogCQlzZXJpYWxfcG9ydF9vdXQocG9ydCwgVUFSVF9MQ1IsIDApOwogCX0KIAorCS8qCisJICogRm9yIHRoZSBBbHRlcmEgMTY1NTAgdmFyaWFudHMsIHNldCBUWCB0aHJlc2hvbGQgdHJpZ2dlciBsZXZlbC4KKwkgKi8KKwlpZiAoKChwb3J0LT50eXBlID09IFBPUlRfQUxUUl8xNjU1MF9GMzIpIHx8CisJICAgICAocG9ydC0+dHlwZSA9PSBQT1JUX0FMVFJfMTY1NTBfRjY0KSB8fAorCSAgICAgKHBvcnQtPnR5cGUgPT0gUE9SVF9BTFRSXzE2NTUwX0YxMjgpKSAmJiAocG9ydC0+Zmlmb3NpemUgPiAxKSkgeworCQkvKiBCb3VuZHMgY2hlY2tpbmcgb2YgVFggdGhyZXNob2xkICh2YWxpZCAwIHRvIGZpZm9zaXplLTIpICovCisJCWlmICgodXAtPnR4X2xvYWRzeiA8IDIpIHx8ICh1cC0+dHhfbG9hZHN6ID4gcG9ydC0+Zmlmb3NpemUpKSB7CisJCQlwcl9lcnIoInR0eVMlZCBUWCBGSUZPIFRocmVzaG9sZCBlcnJvcnMsIHNraXBwaW5nXG4iLAorCQkJICAgICAgIHNlcmlhbF9pbmRleChwb3J0KSk7CisJCX0gZWxzZSB7CisJCQlzZXJpYWxfcG9ydF9vdXQocG9ydCwgVUFSVF9BTFRSX0FGUiwKKwkJCQkJVUFSVF9BTFRSX0VOX1RYRklGT19MVyk7CisJCQlzZXJpYWxfcG9ydF9vdXQocG9ydCwgVUFSVF9BTFRSX1RYX0xPVywKKwkJCQkJcG9ydC0+Zmlmb3NpemUgLSB1cC0+dHhfbG9hZHN6KTsKKwkJCXBvcnQtPmhhbmRsZV9pcnEgPSBzZXJpYWw4MjUwX3R4X3RocmVzaG9sZF9oYW5kbGVfaXJxOworCQl9CisJfQorCiAJaWYgKHBvcnQtPmlycSkgewogCQl1bnNpZ25lZCBjaGFyIGlpcjE7CiAJCS8qCkBAIC0yNTA0LDggKzI1MzcsNiBAQAogCQkJCQkgICAgIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKIAkJCQkJICAgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKIHsKLQl1bnNpZ25lZCBpbnQgdG9sZXJhbmNlID0gcG9ydC0+dWFydGNsayAvIDEwMDsKLQogCS8qCiAJICogQXNrIHRoZSBjb3JlIHRvIGNhbGN1bGF0ZSB0aGUgZGl2aXNvciBmb3IgdXMuCiAJICogQWxsb3cgMSUgdG9sZXJhbmNlIGF0IHRoZSB1cHBlciBsaW1pdCBzbyB1YXJ0IGNsa3MgbWFyZ2luYWxseQpAQCAtMjUxNCw3ICsyNTQ1LDcgQEAKIAkgKi8KIAlyZXR1cm4gdWFydF9nZXRfYmF1ZF9yYXRlKHBvcnQsIHRlcm1pb3MsIG9sZCwKIAkJCQkgIHBvcnQtPnVhcnRjbGsgLyAxNiAvIDB4ZmZmZiwKLQkJCQkgIChwb3J0LT51YXJ0Y2xrICsgdG9sZXJhbmNlKSAvIDE2KTsKKwkJCQkgIHBvcnQtPnVhcnRjbGspOwogfQogCiB2b2lkCkBAIC0yNTUxLDEyICsyNTgyLDkgQEAKIAkvKgogCSAqIE1DUi1iYXNlZCBhdXRvIGZsb3cgY29udHJvbC4gIFdoZW4gQUZFIGlzIGVuYWJsZWQsIFJUUyB3aWxsIGJlCiAJICogZGVhc3NlcnRlZCB3aGVuIHRoZSByZWNlaXZlIEZJRk8gY29udGFpbnMgbW9yZSBjaGFyYWN0ZXJzIHRoYW4KLQkgKiB0aGUgdHJpZ2dlciwgb3IgdGhlIE1DUiBSVFMgYml0IGlzIGNsZWFyZWQuICBJbiB0aGUgY2FzZSB3aGVyZQotCSAqIHRoZSByZW1vdGUgVUFSVCBpcyBub3QgdXNpbmcgQ1RTIGF1dG8gZmxvdyBjb250cm9sLCB3ZSBtdXN0Ci0JICogaGF2ZSBzdWZmaWNpZW50IEZJRk8gZW50cmllcyBmb3IgdGhlIGxhdGVuY3kgb2YgdGhlIHJlbW90ZQotCSAqIFVBUlQgdG8gcmVzcG9uZC4gIElPVywgYXQgbGVhc3QgMzIgYnl0ZXMgb2YgRklGTy4KKwkgKiB0aGUgdHJpZ2dlciwgb3IgdGhlIE1DUiBSVFMgYml0IGlzIGNsZWFyZWQuCiAJICovCi0JaWYgKHVwLT5jYXBhYmlsaXRpZXMgJiBVQVJUX0NBUF9BRkUgJiYgcG9ydC0+Zmlmb3NpemUgPj0gMzIpIHsKKwlpZiAodXAtPmNhcGFiaWxpdGllcyAmIFVBUlRfQ0FQX0FGRSkgewogCQl1cC0+bWNyICY9IH5VQVJUX01DUl9BRkU7CiAJCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykKIAkJCXVwLT5tY3IgfD0gVUFSVF9NQ1JfQUZFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvS2NvbmZpZyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwL0tjb25maWcKaW5kZXggYzllYzgzOS4uODk5ODM0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvS2NvbmZpZworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC9LY29uZmlnCkBAIC02LDcgKzYsNiBAQAogY29uZmlnIFNFUklBTF84MjUwCiAJdHJpc3RhdGUgIjgyNTAvMTY1NTAgYW5kIGNvbXBhdGlibGUgc2VyaWFsIHN1cHBvcnQiCiAJc2VsZWN0IFNFUklBTF9DT1JFCi0Jc2VsZWN0IFNFUklBTF9NQ1RSTF9HUElPIGlmIEdQSU9MSUIKIAktLS1oZWxwLS0tCiAJICBUaGlzIHNlbGVjdHMgd2hldGhlciB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBkcml2ZXIgZm9yIHRoZSBzdGFuZGFyZAogCSAgc2VyaWFsIHBvcnRzLiAgVGhlIHN0YW5kYXJkIGFuc3dlciBpcyBZLiAgUGVvcGxlIHdobyBtaWdodCBzYXkgTgpAQCAtMTIxLDcgKzEyMCw2IEBACiAJdHJpc3RhdGUgIjgyNTAvMTY1NTAgUENJIGRldmljZSBzdXBwb3J0IiBpZiBFWFBFUlQKIAlkZXBlbmRzIG9uIFNFUklBTF84MjUwICYmIFBDSQogCWRlZmF1bHQgU0VSSUFMXzgyNTAKLQlzZWxlY3QgUkFUSU9OQUwKIAloZWxwCiAJICBUaGlzIGJ1aWxkcyBzdGFuZGFyZCBQQ0kgc2VyaWFsIHN1cHBvcnQuIFlvdSBtYXkgYmUgYWJsZSB0bwogCSAgZGlzYWJsZSB0aGlzIGZlYXR1cmUgaWYgeW91IG9ubHkgbmVlZCBsZWdhY3kgc2VyaWFsIHN1cHBvcnQuCkBAIC00MDMsNiArNDAxLDIxIEBACiAJICBJZiB5b3UgaGF2ZSBhIHN5c3RlbSB1c2luZyBhbiBJbmdlbmljIFNvQyBhbmQgd2lzaCB0byBtYWtlIHVzZSBvZgogCSAgaXRzIFVBUlRzLCBzYXkgWSB0byB0aGlzIG9wdGlvbi4gSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIFNFUklBTF84MjUwX0xQU1MKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3Igc2VyaWFsIHBvcnRzIG9uIEludGVsIExQU1MgcGxhdGZvcm1zIiBpZiBFWFBFUlQKKwlkZWZhdWx0IFNFUklBTF84MjUwCisJZGVwZW5kcyBvbiBTRVJJQUxfODI1MCAmJiBQQ0kKKwlkZXBlbmRzIG9uIFg4NiB8fCBDT01QSUxFX1RFU1QKKwlzZWxlY3QgRFdfRE1BQ19DT1JFIGlmIFNFUklBTF84MjUwX0RNQQorCXNlbGVjdCBEV19ETUFDX1BDSSBpZiAoU0VSSUFMXzgyNTBfRE1BICYmIFg4Nl9JTlRFTF9MUFNTKQorCXNlbGVjdCBSQVRJT05BTAorCWhlbHAKKwkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIGVuYWJsZSBoYW5kbGluZyBvZiB0aGUgZXh0cmEgZmVhdHVyZXMKKwkgIHByZXNlbnQgb24gdGhlIFVBUlQgZm91bmQgb24gdmFyaW91cyBJbnRlbCBwbGF0Zm9ybXMgc3VjaCBhczoKKwkgICAgLSBJbnRlbCBCYXl0cmFpbCBTb0MKKwkgICAgLSBJbnRlbCBCcmFzd2VsbCBTb0MKKwkgICAgLSBJbnRlbCBRdWFyayBYMTAwMCBTb0MKKwogY29uZmlnIFNFUklBTF84MjUwX01JRAogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBzZXJpYWwgcG9ydHMgb24gSW50ZWwgTUlEIHBsYXRmb3JtcyIgaWYgRVhQRVJUCiAJZGVmYXVsdCBTRVJJQUxfODI1MApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvTWFrZWZpbGUgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC9NYWtlZmlsZQppbmRleCAzNjdkNDAzLi4yNzZjNmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC9NYWtlZmlsZQpAQCAtMjgsNiArMjgsNyBAQAogb2JqLSQoQ09ORklHX1NFUklBTF84MjUwX01UNjU3NykJKz0gODI1MF9tdGsubwogb2JqLSQoQ09ORklHX1NFUklBTF84MjUwX1VOSVBISUVSKQkrPSA4MjUwX3VuaXBoaWVyLm8KIG9iai0kKENPTkZJR19TRVJJQUxfODI1MF9JTkdFTklDKQkrPSA4MjUwX2luZ2VuaWMubworb2JqLSQoQ09ORklHX1NFUklBTF84MjUwX0xQU1MpCQkrPSA4MjUwX2xwc3Mubwogb2JqLSQoQ09ORklHX1NFUklBTF84MjUwX01JRCkJCSs9IDgyNTBfbWlkLm8KIG9iai0kKENPTkZJR19TRVJJQUxfODI1MF9NT1hBKQkJKz0gODI1MF9tb3hhLm8KIG9iai0kKENPTkZJR19TRVJJQUxfT0ZfUExBVEZPUk0pCSs9IDgyNTBfb2YubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL0tjb25maWcgYi9kcml2ZXJzL3R0eS9zZXJpYWwvS2NvbmZpZwppbmRleCA1MThkYjI0YS4uYzc4MzE0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL0tjb25maWcKQEAgLTEzODAsNyArMTM4MCw3IEBACiAKIGNvbmZpZyBTRVJJQUxfUENIX1VBUlQKIAl0cmlzdGF0ZSAiSW50ZWwgRUcyMFQgUENIL0xBUElTIFNlbWljb24gSU9IKE1MNzIxMy9NTDcyMjMvTUw3ODMxKSBVQVJUIgotCWRlcGVuZHMgb24gUENJICYmIChYODZfMzIgfHwgQ09NUElMRV9URVNUKQorCWRlcGVuZHMgb24gUENJICYmIChYODZfMzIgfHwgTUlQUyB8fCAgQ09NUElMRV9URVNUKQogCXNlbGVjdCBTRVJJQUxfQ09SRQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGlzIGZvciBQQ0goUGxhdGZvcm0gY29udHJvbGxlciBIdWIpIFVBUlQgb2YgSW50ZWwgRUcyMFQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hbHRlcmFfanRhZ3VhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hbHRlcmFfanRhZ3VhcnQuYwppbmRleCAzMmRmMmEwLi5lNDA5ZDdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvYWx0ZXJhX2p0YWd1YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2FsdGVyYV9qdGFndWFydC5jCkBAIC0yODAsNyArMjgwLDcgQEAKIC8qCiAgKglEZWZpbmUgdGhlIGJhc2ljIHNlcmlhbCBmdW5jdGlvbnMgd2Ugc3VwcG9ydC4KICAqLwotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBhbHRlcmFfanRhZ3VhcnRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBhbHRlcmFfanRhZ3VhcnRfb3BzID0gewogCS50eF9lbXB0eQk9IGFsdGVyYV9qdGFndWFydF90eF9lbXB0eSwKIAkuZ2V0X21jdHJsCT0gYWx0ZXJhX2p0YWd1YXJ0X2dldF9tY3RybCwKIAkuc2V0X21jdHJsCT0gYWx0ZXJhX2p0YWd1YXJ0X3NldF9tY3RybCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hbHRlcmFfdWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2FsdGVyYV91YXJ0LmMKaW5kZXggNjFiNjA3Zi4uODIwYTc0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2FsdGVyYV91YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2FsdGVyYV91YXJ0LmMKQEAgLTQwNCw3ICs0MDQsNyBAQAogLyoKICAqCURlZmluZSB0aGUgYmFzaWMgc2VyaWFsIGZ1bmN0aW9ucyB3ZSBzdXBwb3J0LgogICovCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIGFsdGVyYV91YXJ0X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgYWx0ZXJhX3VhcnRfb3BzID0gewogCS50eF9lbXB0eQk9IGFsdGVyYV91YXJ0X3R4X2VtcHR5LAogCS5nZXRfbWN0cmwJPSBhbHRlcmFfdWFydF9nZXRfbWN0cmwsCiAJLnNldF9tY3RybAk9IGFsdGVyYV91YXJ0X3NldF9tY3RybCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hbWJhLXBsMDExLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYW1iYS1wbDAxMS5jCmluZGV4IDhhOWUyMTMuLmUyYzMzYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hbWJhLXBsMDExLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2FtYmEtcGwwMTEuYwpAQCAtOTMsNiArOTMsMTAgQEAKIHN0cnVjdCB2ZW5kb3JfZGF0YSB7CiAJY29uc3QgdTE2CQkqcmVnX29mZnNldDsKIAl1bnNpZ25lZCBpbnQJCWlmbHM7CisJdW5zaWduZWQgaW50CQlmcl9idXN5OworCXVuc2lnbmVkIGludAkJZnJfZHNyOworCXVuc2lnbmVkIGludAkJZnJfY3RzOworCXVuc2lnbmVkIGludAkJZnJfcmk7CiAJYm9vbAkJCWFjY2Vzc18zMmI7CiAJYm9vbAkJCW92ZXJzYW1wbGluZzsKIAlib29sCQkJZG1hX3RocmVzaG9sZDsKQEAgLTExMSw2ICsxMTUsMTAgQEAKIHN0YXRpYyBzdHJ1Y3QgdmVuZG9yX2RhdGEgdmVuZG9yX2FybSA9IHsKIAkucmVnX29mZnNldAkJPSBwbDAxMV9zdGRfb2Zmc2V0cywKIAkuaWZscwkJCT0gVUFSVDAxMV9JRkxTX1JYNF84fFVBUlQwMTFfSUZMU19UWDRfOCwKKwkuZnJfYnVzeQkJPSBVQVJUMDF4X0ZSX0JVU1ksCisJLmZyX2RzcgkJCT0gVUFSVDAxeF9GUl9EU1IsCisJLmZyX2N0cwkJCT0gVUFSVDAxeF9GUl9DVFMsCisJLmZyX3JpCQkJPSBVQVJUMDExX0ZSX1JJLAogCS5vdmVyc2FtcGxpbmcJCT0gZmFsc2UsCiAJLmRtYV90aHJlc2hvbGQJCT0gZmFsc2UsCiAJLmN0c19ldmVudF93b3JrYXJvdW5kCT0gZmFsc2UsCkBAIC0xMjEsNiArMTI5LDEwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgdmVuZG9yX2RhdGEgdmVuZG9yX3Nic2EgPSB7CiAJLnJlZ19vZmZzZXQJCT0gcGwwMTFfc3RkX29mZnNldHMsCisJLmZyX2J1c3kJCT0gVUFSVDAxeF9GUl9CVVNZLAorCS5mcl9kc3IJCQk9IFVBUlQwMXhfRlJfRFNSLAorCS5mcl9jdHMJCQk9IFVBUlQwMXhfRlJfQ1RTLAorCS5mcl9yaQkJCT0gVUFSVDAxMV9GUl9SSSwKIAkuYWNjZXNzXzMyYgkJPSB0cnVlLAogCS5vdmVyc2FtcGxpbmcJCT0gZmFsc2UsCiAJLmRtYV90aHJlc2hvbGQJCT0gZmFsc2UsCkBAIC0xNjQsNiArMTc2LDEwIEBACiBzdGF0aWMgc3RydWN0IHZlbmRvcl9kYXRhIHZlbmRvcl9zdCA9IHsKIAkucmVnX29mZnNldAkJPSBwbDAxMV9zdF9vZmZzZXRzLAogCS5pZmxzCQkJPSBVQVJUMDExX0lGTFNfUlhfSEFMRnxVQVJUMDExX0lGTFNfVFhfSEFMRiwKKwkuZnJfYnVzeQkJPSBVQVJUMDF4X0ZSX0JVU1ksCisJLmZyX2RzcgkJCT0gVUFSVDAxeF9GUl9EU1IsCisJLmZyX2N0cwkJCT0gVUFSVDAxeF9GUl9DVFMsCisJLmZyX3JpCQkJPSBVQVJUMDExX0ZSX1JJLAogCS5vdmVyc2FtcGxpbmcJCT0gdHJ1ZSwKIAkuZG1hX3RocmVzaG9sZAkJPSB0cnVlLAogCS5jdHNfZXZlbnRfd29ya2Fyb3VuZAk9IHRydWUsCkBAIC0xODgsMTEgKzIwNCwyMCBAQAogCVtSRUdfRE1BQ1JdID0gWlhfVUFSVDAxMV9ETUFDUiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdmVuZG9yX2RhdGEgdmVuZG9yX3p0ZSBfX21heWJlX3VudXNlZCA9IHsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2ZpZm9zaXplX3p0ZShzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMTY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmVuZG9yX2RhdGEgdmVuZG9yX3p0ZSA9IHsKIAkucmVnX29mZnNldAkJPSBwbDAxMV96dGVfb2Zmc2V0cywKIAkuYWNjZXNzXzMyYgkJPSB0cnVlLAogCS5pZmxzCQkJPSBVQVJUMDExX0lGTFNfUlg0Xzh8VUFSVDAxMV9JRkxTX1RYNF84LAotCS5nZXRfZmlmb3NpemUJCT0gZ2V0X2ZpZm9zaXplX2FybSwKKwkuZnJfYnVzeQkJPSBaWF9VQVJUMDF4X0ZSX0JVU1ksCisJLmZyX2RzcgkJCT0gWlhfVUFSVDAxeF9GUl9EU1IsCisJLmZyX2N0cwkJCT0gWlhfVUFSVDAxeF9GUl9DVFMsCisJLmZyX3JpCQkJPSBaWF9VQVJUMDExX0ZSX1JJLAorCS5nZXRfZmlmb3NpemUJCT0gZ2V0X2ZpZm9zaXplX3p0ZSwKIH07CiAKIC8qIERlYWxzIHdpdGggRE1BIHRyYW5zYWN0aW9ucyAqLwpAQCAtMTE2Nyw3ICsxMTkyLDcgQEAKIAkJcmV0dXJuOwogCiAJLyogRGlzYWJsZSBSWCBhbmQgVFggRE1BICovCi0Jd2hpbGUgKHBsMDExX3JlYWQodWFwLCBSRUdfRlIpICYgVUFSVDAxeF9GUl9CVVNZKQorCXdoaWxlIChwbDAxMV9yZWFkKHVhcCwgUkVHX0ZSKSAmIHVhcC0+dmVuZG9yLT5mcl9idXN5KQogCQljcHVfcmVsYXgoKTsKIAogCXNwaW5fbG9ja19pcnEoJnVhcC0+cG9ydC5sb2NrKTsKQEAgLTE0MTYsMTEgKzE0NDEsMTIgQEAKIAlpZiAoZGVsdGEgJiBVQVJUMDF4X0ZSX0RDRCkKIAkJdWFydF9oYW5kbGVfZGNkX2NoYW5nZSgmdWFwLT5wb3J0LCBzdGF0dXMgJiBVQVJUMDF4X0ZSX0RDRCk7CiAKLQlpZiAoZGVsdGEgJiBVQVJUMDF4X0ZSX0RTUikKKwlpZiAoZGVsdGEgJiB1YXAtPnZlbmRvci0+ZnJfZHNyKQogCQl1YXAtPnBvcnQuaWNvdW50LmRzcisrOwogCi0JaWYgKGRlbHRhICYgVUFSVDAxeF9GUl9DVFMpCi0JCXVhcnRfaGFuZGxlX2N0c19jaGFuZ2UoJnVhcC0+cG9ydCwgc3RhdHVzICYgVUFSVDAxeF9GUl9DVFMpOworCWlmIChkZWx0YSAmIHVhcC0+dmVuZG9yLT5mcl9jdHMpCisJCXVhcnRfaGFuZGxlX2N0c19jaGFuZ2UoJnVhcC0+cG9ydCwKKwkJCQkgICAgICAgc3RhdHVzICYgdWFwLT52ZW5kb3ItPmZyX2N0cyk7CiAKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJnVhcC0+cG9ydC5zdGF0ZS0+cG9ydC5kZWx0YV9tc3Jfd2FpdCk7CiB9CkBAIC0xNDkzLDcgKzE1MTksOCBAQAogCXN0cnVjdCB1YXJ0X2FtYmFfcG9ydCAqdWFwID0KIAkgICAgY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCB1YXJ0X2FtYmFfcG9ydCwgcG9ydCk7CiAJdW5zaWduZWQgaW50IHN0YXR1cyA9IHBsMDExX3JlYWQodWFwLCBSRUdfRlIpOwotCXJldHVybiBzdGF0dXMgJiAoVUFSVDAxeF9GUl9CVVNZfFVBUlQwMXhfRlJfVFhGRikgPyAwIDogVElPQ1NFUl9URU1UOworCXJldHVybiBzdGF0dXMgJiAodWFwLT52ZW5kb3ItPmZyX2J1c3kgfCBVQVJUMDF4X0ZSX1RYRkYpID8KKwkJCQkJCQkwIDogVElPQ1NFUl9URU1UOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IHBsMDExX2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQpAQCAtMTUwOCw5ICsxNTM1LDkgQEAKIAkJcmVzdWx0IHw9IHRpb2NtYml0CiAKIAlUSU9DTUJJVChVQVJUMDF4X0ZSX0RDRCwgVElPQ01fQ0FSKTsKLQlUSU9DTUJJVChVQVJUMDF4X0ZSX0RTUiwgVElPQ01fRFNSKTsKLQlUSU9DTUJJVChVQVJUMDF4X0ZSX0NUUywgVElPQ01fQ1RTKTsKLQlUSU9DTUJJVChVQVJUMDExX0ZSX1JJLCBUSU9DTV9STkcpOworCVRJT0NNQklUKHVhcC0+dmVuZG9yLT5mcl9kc3IsIFRJT0NNX0RTUik7CisJVElPQ01CSVQodWFwLT52ZW5kb3ItPmZyX2N0cywgVElPQ01fQ1RTKTsKKwlUSU9DTUJJVCh1YXAtPnZlbmRvci0+ZnJfcmksIFRJT0NNX1JORyk7CiAjdW5kZWYgVElPQ01CSVQKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMjE5MSw3ICsyMjE4LDcgQEAKIAkgKglGaW5hbGx5LCB3YWl0IGZvciB0cmFuc21pdHRlciB0byBiZWNvbWUgZW1wdHkKIAkgKglhbmQgcmVzdG9yZSB0aGUgVENSCiAJICovCi0Jd2hpbGUgKHBsMDExX3JlYWQodWFwLCBSRUdfRlIpICYgVUFSVDAxeF9GUl9CVVNZKQorCXdoaWxlIChwbDAxMV9yZWFkKHVhcCwgUkVHX0ZSKSAmIHVhcC0+dmVuZG9yLT5mcl9idXN5KQogCQljcHVfcmVsYXgoKTsKIAlpZiAoIXVhcC0+dmVuZG9yLT5hbHdheXNfZW5hYmxlZCkKIAkJcGwwMTFfd3JpdGUob2xkX2NyLCB1YXAsIFJFR19DUik7CkBAIC0yNTU1LDcgKzI1ODIsOCBAQAogCiAJcmV0ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3Qgb2J0YWluIGlycVxuIik7CisJCWlmIChyZXQgIT0gLUVQUk9CRV9ERUZFUikKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBvYnRhaW4gaXJxXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJdWFwLT5wb3J0LmlycQk9IHJldDsKQEAgLTI2MjIsNiArMjY1MCwxMSBAQAogCQkubWFzawk9IDB4MDBmZmZmZmYsCiAJCS5kYXRhCT0gJnZlbmRvcl9zdCwKIAl9LAorCXsKKwkJLmlkCT0gQU1CQV9MSU5VWF9JRCgweDAwLCAweDEsIDB4ZmZlKSwKKwkJLm1hc2sJPSAweDAwZmZmZmZmLAorCQkuZGF0YQk9ICZ2ZW5kb3JfenRlLAorCX0sCiAJeyAwLCAwIH0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvYXJjX3VhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hcmNfdWFydC5jCmluZGV4IDNhMWRlNWMuLjVhYzA2ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hcmNfdWFydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hcmNfdWFydC5jCkBAIC00NjQsNyArNDY0LDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIGFyY19zZXJpYWxfcG9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgYXJjX3NlcmlhbF9wb3BzID0gewogCS50eF9lbXB0eQk9IGFyY19zZXJpYWxfdHhfZW1wdHksCiAJLnNldF9tY3RybAk9IGFyY19zZXJpYWxfc2V0X21jdHJsLAogCS5nZXRfbWN0cmwJPSBhcmNfc2VyaWFsX2dldF9tY3RybCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hdG1lbF9zZXJpYWwuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hdG1lbF9zZXJpYWwuYwppbmRleCAyZWFhMThkLi5mZDhhYTFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCkBAIC0xNjYsNiArMTY2LDcgQEAKIAl1MzIJCQlydHNfbG93OwogCWJvb2wJCQltc19pcnFfZW5hYmxlZDsKIAl1MzIJCQlydG9yOwkvKiBhZGRyZXNzIG9mIHJlY2VpdmVyIHRpbWVvdXQgcmVnaXN0ZXIgaWYgaXQgZXhpc3RzICovCisJYm9vbAkJCWhhc19mcmFjX2JhdWRyYXRlOwogCWJvb2wJCQloYXNfaHdfdGltZXI7CiAJc3RydWN0IHRpbWVyX2xpc3QJdWFydF90aW1lcjsKIApAQCAtMTYzNCw4ICsxNjM1LDggQEAKIAogCWlmIChucCkgewogCQkvKiBETUEvUERDIHVzYWdlIHNwZWNpZmljYXRpb24gKi8KLQkJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImF0bWVsLHVzZS1kbWEtcngiLCBOVUxMKSkgewotCQkJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImRtYXMiLCBOVUxMKSkgeworCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYXRtZWwsdXNlLWRtYS1yeCIpKSB7CisJCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiZG1hcyIpKSB7CiAJCQkJYXRtZWxfcG9ydC0+dXNlX2RtYV9yeCAgPSB0cnVlOwogCQkJCWF0bWVsX3BvcnQtPnVzZV9wZGNfcnggID0gZmFsc2U7CiAJCQl9IGVsc2UgewpAQCAtMTY0Nyw4ICsxNjQ4LDggQEAKIAkJCWF0bWVsX3BvcnQtPnVzZV9wZGNfcnggID0gZmFsc2U7CiAJCX0KIAotCQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAiYXRtZWwsdXNlLWRtYS10eCIsIE5VTEwpKSB7Ci0JCQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZG1hcyIsIE5VTEwpKSB7CisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJhdG1lbCx1c2UtZG1hLXR4IikpIHsKKwkJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJkbWFzIikpIHsKIAkJCQlhdG1lbF9wb3J0LT51c2VfZG1hX3R4ICA9IHRydWU7CiAJCQkJYXRtZWxfcG9ydC0+dXNlX3BkY190eCAgPSBmYWxzZTsKIAkJCX0gZWxzZSB7CkBAIC0xNzQ1LDYgKzE3NDYsMTEgQEAKIAlkYmd1X3VhcnQgPSAweDQ0NDI0NzU1OwkvKiBEQkdVICovCiAJbmV3X3VhcnQgPSAweDU1NDE1MjU0OwkvKiBVQVJUICovCiAKKwkvKgorCSAqIE9ubHkgVVNBUlQgZGV2aWNlcyBmcm9tIGF0OTFzYW05MjYwIFNPQyBpbXBsZW1lbnQgZnJhY3Rpb25hbAorCSAqIGJhdWRyYXRlLgorCSAqLworCWF0bWVsX3BvcnQtPmhhc19mcmFjX2JhdWRyYXRlID0gZmFsc2U7CiAJYXRtZWxfcG9ydC0+aGFzX2h3X3RpbWVyID0gZmFsc2U7CiAKIAlpZiAobmFtZSA9PSBuZXdfdWFydCkgewpAQCAtMTc1Myw2ICsxNzU5LDcgQEAKIAkJYXRtZWxfcG9ydC0+cnRvciA9IEFUTUVMX1VBX1JUT1I7CiAJfSBlbHNlIGlmIChuYW1lID09IHVzYXJ0KSB7CiAJCWRldl9kYmcocG9ydC0+ZGV2LCAiVXNhcnRcbiIpOworCQlhdG1lbF9wb3J0LT5oYXNfZnJhY19iYXVkcmF0ZSA9IHRydWU7CiAJCWF0bWVsX3BvcnQtPmhhc19od190aW1lciA9IHRydWU7CiAJCWF0bWVsX3BvcnQtPnJ0b3IgPSBBVE1FTF9VU19SVE9SOwogCX0gZWxzZSBpZiAobmFtZSA9PSBkYmd1X3VhcnQpIHsKQEAgLTE3NjQsNiArMTc3MSw3IEBACiAJCWNhc2UgMHgzMDI6CiAJCWNhc2UgMHgxMDIxMzoKIAkJCWRldl9kYmcocG9ydC0+ZGV2LCAiVGhpcyB2ZXJzaW9uIGlzIHVzYXJ0XG4iKTsKKwkJCWF0bWVsX3BvcnQtPmhhc19mcmFjX2JhdWRyYXRlID0gdHJ1ZTsKIAkJCWF0bWVsX3BvcnQtPmhhc19od190aW1lciA9IHRydWU7CiAJCQlhdG1lbF9wb3J0LT5ydG9yID0gQVRNRUxfVVNfUlRPUjsKIAkJCWJyZWFrOwpAQCAtMTkyOSw2ICsxOTM3LDkgQEAKIHsKIAlzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICphdG1lbF9wb3J0ID0gdG9fYXRtZWxfdWFydF9wb3J0KHBvcnQpOwogCisJLyogRGlzYWJsZSBtb2RlbSBjb250cm9sIGxpbmVzIGludGVycnVwdHMgKi8KKwlhdG1lbF9kaXNhYmxlX21zKHBvcnQpOworCiAJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGF0IGRldmljZSBsZXZlbCAqLwogCWF0bWVsX3VhcnRfd3JpdGVsKHBvcnQsIEFUTUVMX1VTX0lEUiwgLTEpOwogCkBAIC0xOTc5LDggKzE5OTAsNiBAQAogCSAqLwogCWZyZWVfaXJxKHBvcnQtPmlycSwgcG9ydCk7CiAKLQlhdG1lbF9wb3J0LT5tc19pcnFfZW5hYmxlZCA9IGZhbHNlOwotCiAJYXRtZWxfZmx1c2hfYnVmZmVyKHBvcnQpOwogfQogCkBAIC0yMDI1LDggKzIwMzQsOSBAQAogc3RhdGljIHZvaWQgYXRtZWxfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLAogCQkJICAgICAgc3RydWN0IGt0ZXJtaW9zICpvbGQpCiB7CisJc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqYXRtZWxfcG9ydCA9IHRvX2F0bWVsX3VhcnRfcG9ydChwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBvbGRfbW9kZSwgbW9kZSwgaW1yLCBxdW90LCBiYXVkOworCXVuc2lnbmVkIGludCBvbGRfbW9kZSwgbW9kZSwgaW1yLCBxdW90LCBiYXVkLCBkaXYsIGNkLCBmcCA9IDA7CiAKIAkvKiBzYXZlIHRoZSBjdXJyZW50IG1vZGUgcmVnaXN0ZXIgKi8KIAltb2RlID0gb2xkX21vZGUgPSBhdG1lbF91YXJ0X3JlYWRsKHBvcnQsIEFUTUVMX1VTX01SKTsKQEAgLTIwMzYsMTIgKzIwNDYsNiBAQAogCQkgIEFUTUVMX1VTX1BBUiB8IEFUTUVMX1VTX1VTTU9ERSk7CiAKIAliYXVkID0gdWFydF9nZXRfYmF1ZF9yYXRlKHBvcnQsIHRlcm1pb3MsIG9sZCwgMCwgcG9ydC0+dWFydGNsayAvIDE2KTsKLQlxdW90ID0gdWFydF9nZXRfZGl2aXNvcihwb3J0LCBiYXVkKTsKLQotCWlmIChxdW90ID4gNjU1MzUpIHsJLyogQlJHUiBpcyAxNi1iaXQsIHNvIHN3aXRjaCB0byBzbG93ZXIgY2xvY2sgKi8KLQkJcXVvdCAvPSA4OwotCQltb2RlIHw9IEFUTUVMX1VTX1VTQ0xLU19NQ0tfRElWODsKLQl9CiAKIAkvKiBieXRlIHNpemUgKi8KIAlzd2l0Y2ggKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkgewpAQCAtMjE2MCw3ICsyMTY0LDMxIEBACiAJCWF0bWVsX3VhcnRfd3JpdGVsKHBvcnQsIEFUTUVMX1VTX0NSLCBydHNfc3RhdGUpOwogCX0KIAotCS8qIHNldCB0aGUgYmF1ZCByYXRlICovCisJLyoKKwkgKiBTZXQgdGhlIGJhdWQgcmF0ZToKKwkgKiBGcmFjdGlvbmFsIGJhdWRyYXRlIGFsbG93cyB0byBzZXR1cCBvdXRwdXQgZnJlcXVlbmN5IG1vcmUKKwkgKiBhY2N1cmF0ZWx5LiBUaGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBvbmx5IHdoZW4gdXNpbmcgbm9ybWFsIG1vZGUuCisJICogYmF1ZHJhdGUgPSBzZWxlY3RlZCBjbG9jayAvICg4ICogKDIgLSBPVkVSKSAqIChDRCArIEZQIC8gOCkpCisJICogQ3VycmVudGx5LCBPVkVSIGlzIGFsd2F5cyBzZXQgdG8gMCBzbyB3ZSBnZXQKKwkgKiBiYXVkcmF0ZSA9IHNlbGVjdGVkIGNsb2NrIC8gKDE2ICogKENEICsgRlAgLyA4KSkKKwkgKiB0aGVuCisJICogOCBDRCArIEZQID0gc2VsZWN0ZWQgY2xvY2sgLyAoMiAqIGJhdWRyYXRlKQorCSAqLworCWlmIChhdG1lbF9wb3J0LT5oYXNfZnJhY19iYXVkcmF0ZSAmJgorCSAgICAobW9kZSAmIEFUTUVMX1VTX1VTTU9ERSkgPT0gQVRNRUxfVVNfVVNNT0RFX05PUk1BTCkgeworCQlkaXYgPSBESVZfUk9VTkRfQ0xPU0VTVChwb3J0LT51YXJ0Y2xrLCBiYXVkICogMik7CisJCWNkID0gZGl2ID4+IDM7CisJCWZwID0gZGl2ICYgQVRNRUxfVVNfRlBfTUFTSzsKKwl9IGVsc2UgeworCQljZCA9IHVhcnRfZ2V0X2Rpdmlzb3IocG9ydCwgYmF1ZCk7CisJfQorCisJaWYgKGNkID4gNjU1MzUpIHsJLyogQlJHUiBpcyAxNi1iaXQsIHNvIHN3aXRjaCB0byBzbG93ZXIgY2xvY2sgKi8KKwkJY2QgLz0gODsKKwkJbW9kZSB8PSBBVE1FTF9VU19VU0NMS1NfTUNLX0RJVjg7CisJfQorCXF1b3QgPSBjZCB8IGZwIDw8IEFUTUVMX1VTX0ZQX09GRlNFVDsKKwogCWF0bWVsX3VhcnRfd3JpdGVsKHBvcnQsIEFUTUVMX1VTX0JSR1IsIHF1b3QpOwogCWF0bWVsX3VhcnRfd3JpdGVsKHBvcnQsIEFUTUVMX1VTX0NSLCBBVE1FTF9VU19SU1RTVEEgfCBBVE1FTF9VU19SU1RSWCk7CiAJYXRtZWxfdWFydF93cml0ZWwocG9ydCwgQVRNRUxfVVNfQ1IsIEFUTUVMX1VTX1RYRU4gfCBBVE1FTF9VU19SWEVOKTsKQEAgLTIyOTIsNyArMjMyMCw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBhdG1lbF9wb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBhdG1lbF9wb3BzID0gewogCS50eF9lbXB0eQk9IGF0bWVsX3R4X2VtcHR5LAogCS5zZXRfbWN0cmwJPSBhdG1lbF9zZXRfbWN0cmwsCiAJLmdldF9tY3RybAk9IGF0bWVsX2dldF9tY3RybCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9iY202M3h4X3VhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9iY202M3h4X3VhcnQuYwppbmRleCA1MTA4ZmFiLi41ODNjOWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvYmNtNjN4eF91YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2JjbTYzeHhfdWFydC5jCkBAIC02MzEsNyArNjMxLDcgQEAKIH0KIAogLyogc2VyaWFsIGNvcmUgY2FsbGJhY2tzICovCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIGJjbV91YXJ0X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgYmNtX3VhcnRfb3BzID0gewogCS50eF9lbXB0eQk9IGJjbV91YXJ0X3R4X2VtcHR5LAogCS5nZXRfbWN0cmwJPSBiY21fdWFydF9nZXRfbWN0cmwsCiAJLnNldF9tY3RybAk9IGJjbV91YXJ0X3NldF9tY3RybCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9lYXJseWNvbi1hcm0tc2VtaWhvc3QuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9lYXJseWNvbi1hcm0tc2VtaWhvc3QuYwppbmRleCAzODNkYjEwLi42YmJlYjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvZWFybHljb24tYXJtLXNlbWlob3N0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2Vhcmx5Y29uLWFybS1zZW1paG9zdC5jCkBAIC01Myw3ICs1Myw4IEBACiAJdWFydF9jb25zb2xlX3dyaXRlKCZkZXYtPnBvcnQsIHMsIG4sIHNtaF9wdXRjKTsKIH0KIAotaW50IF9faW5pdCBlYXJseV9zbWhfc2V0dXAoc3RydWN0IGVhcmx5Y29uX2RldmljZSAqZGV2aWNlLCBjb25zdCBjaGFyICpvcHQpCitzdGF0aWMgaW50CitfX2luaXQgZWFybHlfc21oX3NldHVwKHN0cnVjdCBlYXJseWNvbl9kZXZpY2UgKmRldmljZSwgY29uc3QgY2hhciAqb3B0KQogewogCWRldmljZS0+Y29uLT53cml0ZSA9IHNtaF93cml0ZTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9lYXJseWNvbi5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2Vhcmx5Y29uLmMKaW5kZXggMDY3NzgzZi4uYzM2NTE1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2Vhcmx5Y29uLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2Vhcmx5Y29uLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zaXplcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogCiAjaWZkZWYgQ09ORklHX0ZJWF9FQVJMWUNPTl9NRU0KICNpbmNsdWRlIDxhc20vZml4bWFwLmg+CkBAIC0zOCw3ICszOSw3IEBACiAJLmNvbiA9ICZlYXJseV9jb24sCiB9OwogCi1zdGF0aWMgdm9pZCBfX2lvbWVtICogX19pbml0IGVhcmx5Y29uX21hcCh1bnNpZ25lZCBsb25nIHBhZGRyLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyB2b2lkIF9faW9tZW0gKiBfX2luaXQgZWFybHljb25fbWFwKHJlc291cmNlX3NpemVfdCBwYWRkciwgc2l6ZV90IHNpemUpCiB7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogI2lmZGVmIENPTkZJR19GSVhfRUFSTFlDT05fTUVNCkBAIC00OSw4ICs1MCw3IEBACiAJYmFzZSA9IGlvcmVtYXAocGFkZHIsIHNpemUpOwogI2VuZGlmCiAJaWYgKCFiYXNlKQotCQlwcl9lcnIoIiVzOiBDb3VsZG4ndCBtYXAgMHglbGx4XG4iLCBfX2Z1bmNfXywKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGFkZHIpOworCQlwcl9lcnIoIiVzOiBDb3VsZG4ndCBtYXAgJXBhXG4iLCBfX2Z1bmNfXywgJnBhZGRyKTsKIAogCXJldHVybiBiYXNlOwogfQpAQCAtOTIsNyArOTIsNyBAQAogewogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAmZGV2aWNlLT5wb3J0OwogCWludCBsZW5ndGg7Ci0JdW5zaWduZWQgbG9uZyBhZGRyOworCXJlc291cmNlX3NpemVfdCBhZGRyOwogCiAJaWYgKHVhcnRfcGFyc2VfZWFybHljb24ob3B0aW9ucywgJnBvcnQtPmlvdHlwZSwgJmFkZHIsICZvcHRpb25zKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xOTksNiArMTk5LDE0IEBACiAJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKKy8qCisgKiBXaGVuIENPTkZJR19BQ1BJX1NQQ1JfVEFCTEUgaXMgZGVmaW5lZCwgImVhcmx5Y29uIiB3aXRob3V0IHBhcmFtZXRlcnMgaW4KKyAqIGNvbW1hbmQgbGluZSBkb2VzIG5vdCBzdGFydCBEVCBlYXJseWNvbiBpbW1lZGlhdGVseSwgaW5zdGVhZCBpdCBkZWZlcnMKKyAqIHN0YXJ0aW5nIGl0IHVudGlsIERUL0FDUEkgZGVjaXNpb24gaXMgbWFkZS4gIEF0IHRoYXQgdGltZSBpZiBBQ1BJIGlzIGVuYWJsZWQKKyAqIGNhbGwgcGFyc2Vfc3BjcigpLCBlbHNlIGNhbGwgZWFybHlfaW5pdF9kdF9zY2FuX2Nob3Nlbl9zdGRvdXQoKQorICovCitib29sIGVhcmx5Y29uX2luaXRfaXNfZGVmZXJyZWQgX19pbml0ZGF0YTsKKwogLyogZWFybHlfcGFyYW0gd3JhcHBlciBmb3Igc2V0dXBfZWFybHljb24oKSAqLwogc3RhdGljIGludCBfX2luaXQgcGFyYW1fc2V0dXBfZWFybHljb24oY2hhciAqYnVmKQogewpAQCAtMjA4LDggKzIxNiwxNCBAQAogCSAqIEp1c3QgJ2Vhcmx5Y29uJyBpcyBhIHZhbGlkIHBhcmFtIGZvciBkZXZpY2V0cmVlIGVhcmx5Y29uczsKIAkgKiBkb24ndCBnZW5lcmF0ZSBhIHdhcm5pbmcgZnJvbSBwYXJzZV9lYXJseV9wYXJhbXMoKSBpbiB0aGF0IGNhc2UKIAkgKi8KLQlpZiAoIWJ1ZiB8fCAhYnVmWzBdKQotCQlyZXR1cm4gMDsKKwlpZiAoIWJ1ZiB8fCAhYnVmWzBdKSB7CisJCWlmIChJU19FTkFCTEVEKENPTkZJR19BQ1BJX1NQQ1JfVEFCTEUpKSB7CisJCQllYXJseWNvbl9pbml0X2lzX2RlZmVycmVkID0gdHJ1ZTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGVhcmx5X2luaXRfZHRfc2Nhbl9jaG9zZW5fc3Rkb3V0KCk7CisJCX0KKwl9CiAKIAllcnIgPSBzZXR1cF9lYXJseWNvbihidWYpOwogCWlmIChlcnIgPT0gLUVOT0VOVCB8fCBlcnIgPT0gLUVBTFJFQURZKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2ZzbF9scHVhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9mc2xfbHB1YXJ0LmMKaW5kZXggN2Y5NWY3OC4uZGU5ZDUxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2ZzbF9scHVhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvZnNsX2xwdWFydC5jCkBAIC0yMjQsNyArMjI0LDggQEAKICNkZWZpbmUgVUFSVFdBVEVSX1RYV0FURVJfT0ZGCTAKICNkZWZpbmUgVUFSVFdBVEVSX1JYV0FURVJfT0ZGCTE2CiAKLSNkZWZpbmUgRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFCTY0CisvKiBSeCBETUEgdGltZW91dCBpbiBtcywgd2hpY2ggaXMgdXNlZCB0byBjYWxjdWxhdGUgUnggcmluZyBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBETUFfUlhfVElNRU9VVAkJKDEwKQogCiAjZGVmaW5lIERSSVZFUl9OQU1FCSJmc2wtbHB1YXJ0IgogI2RlZmluZSBERVZfTkFNRQkidHR5TFAiCkBAIC0yNDMsMTggKzI0NCwxOCBAQAogCXN0cnVjdCBkbWFfY2hhbgkJKmRtYV9yeF9jaGFuOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAgKmRtYV90eF9kZXNjOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAgKmRtYV9yeF9kZXNjOwotCWRtYV9hZGRyX3QJCWRtYV90eF9idWZfYnVzOwotCWRtYV9hZGRyX3QJCWRtYV9yeF9idWZfYnVzOwogCWRtYV9jb29raWVfdAkJZG1hX3R4X2Nvb2tpZTsKIAlkbWFfY29va2llX3QJCWRtYV9yeF9jb29raWU7Ci0JdW5zaWduZWQgY2hhcgkJKmRtYV90eF9idWZfdmlydDsKLQl1bnNpZ25lZCBjaGFyCQkqZG1hX3J4X2J1Zl92aXJ0OwogCXVuc2lnbmVkIGludAkJZG1hX3R4X2J5dGVzOwogCXVuc2lnbmVkIGludAkJZG1hX3J4X2J5dGVzOwotCWludAkJCWRtYV90eF9pbl9wcm9ncmVzczsKLQlpbnQJCQlkbWFfcnhfaW5fcHJvZ3Jlc3M7CisJYm9vbAkJCWRtYV90eF9pbl9wcm9ncmVzczsKIAl1bnNpZ25lZCBpbnQJCWRtYV9yeF90aW1lb3V0OwogCXN0cnVjdCB0aW1lcl9saXN0CWxwdWFydF90aW1lcjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJcnhfc2dsLCB0eF9zZ2xbMl07CisJc3RydWN0IGNpcmNfYnVmCQlyeF9yaW5nOworCWludAkJCXJ4X2RtYV9ybmdfYnVmX2xlbjsKKwl1bnNpZ25lZCBpbnQJCWRtYV90eF9uZW50czsKKwl3YWl0X3F1ZXVlX2hlYWRfdAlkbWFfd2FpdDsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGxwdWFydF9kdF9pZHNbXSA9IHsKQEAgLTI3MCw3ICsyNzEsNiBAQAogCiAvKiBGb3J3YXJkIGRlY2xhcmUgdGhpcyBmb3IgdGhlIGRtYSBjYWxsYmFja3MqLwogc3RhdGljIHZvaWQgbHB1YXJ0X2RtYV90eF9jb21wbGV0ZSh2b2lkICphcmcpOwotc3RhdGljIHZvaWQgbHB1YXJ0X2RtYV9yeF9jb21wbGV0ZSh2b2lkICphcmcpOwogCiBzdGF0aWMgdTMyIGxwdWFydDMyX3JlYWQodm9pZCBfX2lvbWVtICphZGRyKQogewpAQCAtMzE2LDIxNyArMzE2LDEyMSBAQAogCWxwdWFydDMyX3dyaXRlKHRlbXAgJiB+VUFSVENUUkxfUkUsIHBvcnQtPm1lbWJhc2UgKyBVQVJUQ1RSTCk7CiB9CiAKLXN0YXRpYyB2b2lkIGxwdWFydF9jb3B5X3J4X3RvX3R0eShzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0LAotCQlzdHJ1Y3QgdHR5X3BvcnQgKnR0eSwgaW50IGNvdW50KQorc3RhdGljIHZvaWQgbHB1YXJ0X2RtYV90eChzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0KQogewotCWludCBjb3BpZWQ7CisJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnNwb3J0LT5wb3J0LnN0YXRlLT54bWl0OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsID0gc3BvcnQtPnR4X3NnbDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBzcG9ydC0+cG9ydC5kZXY7CisJaW50IHJldDsKIAotCXNwb3J0LT5wb3J0Lmljb3VudC5yeCArPSBjb3VudDsKKwlpZiAoc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcykKKwkJcmV0dXJuOwogCi0JaWYgKCF0dHkpIHsKLQkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJObyB0dHkgcG9ydFxuIik7CisJc3BvcnQtPmRtYV90eF9ieXRlcyA9IHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKHhtaXQpOworCisJaWYgKHhtaXQtPnRhaWwgPCB4bWl0LT5oZWFkKSB7CisJCXNwb3J0LT5kbWFfdHhfbmVudHMgPSAxOworCQlzZ19pbml0X29uZShzZ2wsIHhtaXQtPmJ1ZiArIHhtaXQtPnRhaWwsIHNwb3J0LT5kbWFfdHhfYnl0ZXMpOworCX0gZWxzZSB7CisJCXNwb3J0LT5kbWFfdHhfbmVudHMgPSAyOworCQlzZ19pbml0X3RhYmxlKHNnbCwgMik7CisJCXNnX3NldF9idWYoc2dsLCB4bWl0LT5idWYgKyB4bWl0LT50YWlsLAorCQkJCVVBUlRfWE1JVF9TSVpFIC0geG1pdC0+dGFpbCk7CisJCXNnX3NldF9idWYoc2dsICsgMSwgeG1pdC0+YnVmLCB4bWl0LT5oZWFkKTsKKwl9CisKKwlyZXQgPSBkbWFfbWFwX3NnKGRldiwgc2dsLCBzcG9ydC0+ZG1hX3R4X25lbnRzLCBETUFfVE9fREVWSUNFKTsKKwlpZiAoIXJldCkgeworCQlkZXZfZXJyKGRldiwgIkRNQSBtYXBwaW5nIGVycm9yIGZvciBUWC5cbiIpOwogCQlyZXR1cm47CiAJfQogCi0JZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3BvcnQtPnBvcnQuZGV2LCBzcG9ydC0+ZG1hX3J4X2J1Zl9idXMsCi0JCQlGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7Ci0JY29waWVkID0gdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksCi0JCQkoKHVuc2lnbmVkIGNoYXIgKikoc3BvcnQtPmRtYV9yeF9idWZfdmlydCkpLCBjb3VudCk7Ci0KLQlpZiAoY29waWVkICE9IGNvdW50KSB7Ci0JCVdBUk5fT04oMSk7Ci0JCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiUnhEYXRhIGNvcHkgdG8gdHR5IGxheWVyIGZhaWxlZFxuIik7Ci0JfQotCi0JZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3BvcnQtPnBvcnQuZGV2LCBzcG9ydC0+ZG1hX3J4X2J1Zl9idXMsCi0JCQlGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUsIERNQV9UT19ERVZJQ0UpOwotfQotCi1zdGF0aWMgdm9pZCBscHVhcnRfcGlvX3R4KHN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQpCi17Ci0Jc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnNwb3J0LT5wb3J0LnN0YXRlLT54bWl0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKCF1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgJiYKLQkJcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRUQ0ZJRk8pIDwgc3BvcnQtPnR4Zmlmb19zaXplKSB7Ci0JCXdyaXRlYih4bWl0LT5idWZbeG1pdC0+dGFpbF0sIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJURFIpOwotCQl4bWl0LT50YWlsID0gKHhtaXQtPnRhaWwgKyAxKSAmIChVQVJUX1hNSVRfU0laRSAtIDEpOwotCQlzcG9ydC0+cG9ydC5pY291bnQudHgrKzsKLQl9Ci0KLQlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBXQUtFVVBfQ0hBUlMpCi0JCXVhcnRfd3JpdGVfd2FrZXVwKCZzcG9ydC0+cG9ydCk7Ci0KLQlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKQotCQl3cml0ZWIocmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpIHwgVUFSVENSNV9URE1BUywKLQkJCXNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBscHVhcnRfZG1hX3R4KHN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQsIHVuc2lnbmVkIGxvbmcgY291bnQpCi17Ci0Jc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnNwb3J0LT5wb3J0LnN0YXRlLT54bWl0OwotCWRtYV9hZGRyX3QgdHhfYnVzX2FkZHI7Ci0KLQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzcG9ydC0+cG9ydC5kZXYsIHNwb3J0LT5kbWFfdHhfYnVmX2J1cywKLQkJCQlVQVJUX1hNSVRfU0laRSwgRE1BX1RPX0RFVklDRSk7Ci0Jc3BvcnQtPmRtYV90eF9ieXRlcyA9IGNvdW50ICYgfihzcG9ydC0+dHhmaWZvX3NpemUgLSAxKTsKLQl0eF9idXNfYWRkciA9IHNwb3J0LT5kbWFfdHhfYnVmX2J1cyArIHhtaXQtPnRhaWw7Ci0Jc3BvcnQtPmRtYV90eF9kZXNjID0gZG1hZW5naW5lX3ByZXBfc2xhdmVfc2luZ2xlKHNwb3J0LT5kbWFfdHhfY2hhbiwKLQkJCQkJdHhfYnVzX2FkZHIsIHNwb3J0LT5kbWFfdHhfYnl0ZXMsCisJc3BvcnQtPmRtYV90eF9kZXNjID0gZG1hZW5naW5lX3ByZXBfc2xhdmVfc2coc3BvcnQtPmRtYV90eF9jaGFuLCBzZ2wsCisJCQkJCXNwb3J0LT5kbWFfdHhfbmVudHMsCiAJCQkJCURNQV9NRU1fVE9fREVWLCBETUFfUFJFUF9JTlRFUlJVUFQpOwotCiAJaWYgKCFzcG9ydC0+ZG1hX3R4X2Rlc2MpIHsKLQkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJOb3QgYWJsZSB0byBnZXQgZGVzYyBmb3IgdHhcbiIpOwotCQlyZXR1cm4gLUVJTzsKKwkJZG1hX3VubWFwX3NnKGRldiwgc2dsLCBzcG9ydC0+ZG1hX3R4X25lbnRzLCBETUFfVE9fREVWSUNFKTsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgcHJlcGFyZSBUWCBzbGF2ZSBETUEhXG4iKTsKKwkJcmV0dXJuOwogCX0KIAogCXNwb3J0LT5kbWFfdHhfZGVzYy0+Y2FsbGJhY2sgPSBscHVhcnRfZG1hX3R4X2NvbXBsZXRlOwogCXNwb3J0LT5kbWFfdHhfZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBzcG9ydDsKLQlzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzID0gMTsKKwlzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzID0gdHJ1ZTsKIAlzcG9ydC0+ZG1hX3R4X2Nvb2tpZSA9IGRtYWVuZ2luZV9zdWJtaXQoc3BvcnQtPmRtYV90eF9kZXNjKTsKIAlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhzcG9ydC0+ZG1hX3R4X2NoYW4pOwogCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGxwdWFydF9wcmVwYXJlX3R4KHN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQpCi17Ci0Jc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnNwb3J0LT5wb3J0LnN0YXRlLT54bWl0OwotCXVuc2lnbmVkIGxvbmcgY291bnQgPSAgQ0lSQ19DTlRfVE9fRU5EKHhtaXQtPmhlYWQsCi0JCQkJCXhtaXQtPnRhaWwsIFVBUlRfWE1JVF9TSVpFKTsKLQotCWlmICghY291bnQpCi0JCXJldHVybjsKLQotCWlmIChjb3VudCA8IHNwb3J0LT50eGZpZm9fc2l6ZSkKLQkJd3JpdGViKHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KSAmIH5VQVJUQ1I1X1RETUFTLAotCQkJCXNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKLQllbHNlIHsKLQkJd3JpdGViKHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KSB8IFVBUlRDUjVfVERNQVMsCi0JCQkJc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpOwotCQlscHVhcnRfZG1hX3R4KHNwb3J0LCBjb3VudCk7Ci0JfQogfQogCiBzdGF0aWMgdm9pZCBscHVhcnRfZG1hX3R4X2NvbXBsZXRlKHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gYXJnOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsID0gJnNwb3J0LT50eF9zZ2xbMF07CiAJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnNwb3J0LT5wb3J0LnN0YXRlLT54bWl0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlhc3luY190eF9hY2soc3BvcnQtPmRtYV90eF9kZXNjKTsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CiAKKwlkbWFfdW5tYXBfc2coc3BvcnQtPnBvcnQuZGV2LCBzZ2wsIHNwb3J0LT5kbWFfdHhfbmVudHMsIERNQV9UT19ERVZJQ0UpOworCiAJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgc3BvcnQtPmRtYV90eF9ieXRlcykgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKLQlzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzID0gMDsKKworCXNwb3J0LT5wb3J0Lmljb3VudC50eCArPSBzcG9ydC0+ZG1hX3R4X2J5dGVzOworCXNwb3J0LT5kbWFfdHhfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CiAKIAlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBXQUtFVVBfQ0hBUlMpCiAJCXVhcnRfd3JpdGVfd2FrZXVwKCZzcG9ydC0+cG9ydCk7CiAKLQlscHVhcnRfcHJlcGFyZV90eChzcG9ydCk7CisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnNwb3J0LT5kbWFfd2FpdCkpIHsKKwkJd2FrZV91cCgmc3BvcnQtPmRtYV93YWl0KTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CisKKwlpZiAoIXVhcnRfY2lyY19lbXB0eSh4bWl0KSAmJiAhdWFydF90eF9zdG9wcGVkKCZzcG9ydC0+cG9ydCkpCisJCWxwdWFydF9kbWFfdHgoc3BvcnQpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgaW50IGxwdWFydF9kbWFfcngoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCkKK3N0YXRpYyBpbnQgbHB1YXJ0X2RtYV90eF9yZXF1ZXN0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0JZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3BvcnQtPnBvcnQuZGV2LCBzcG9ydC0+ZG1hX3J4X2J1Zl9idXMsCi0JCQlGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUsIERNQV9UT19ERVZJQ0UpOwotCXNwb3J0LT5kbWFfcnhfZGVzYyA9IGRtYWVuZ2luZV9wcmVwX3NsYXZlX3NpbmdsZShzcG9ydC0+ZG1hX3J4X2NoYW4sCi0JCQlzcG9ydC0+ZG1hX3J4X2J1Zl9idXMsIEZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSwKLQkJCURNQV9ERVZfVE9fTUVNLCBETUFfUFJFUF9JTlRFUlJVUFQpOworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKKwkJCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKKwlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBkbWFfdHhfc2NvbmZpZyA9IHt9OworCWludCByZXQ7CiAKLQlpZiAoIXNwb3J0LT5kbWFfcnhfZGVzYykgewotCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgIk5vdCBhYmxlIHRvIGdldCBkZXNjIGZvciByeFxuIik7Ci0JCXJldHVybiAtRUlPOworCWRtYV90eF9zY29uZmlnLmRzdF9hZGRyID0gc3BvcnQtPnBvcnQubWFwYmFzZSArIFVBUlREUjsKKwlkbWFfdHhfc2NvbmZpZy5kc3RfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU7CisJZG1hX3R4X3Njb25maWcuZHN0X21heGJ1cnN0ID0gMTsKKwlkbWFfdHhfc2NvbmZpZy5kaXJlY3Rpb24gPSBETUFfTUVNX1RPX0RFVjsKKwlyZXQgPSBkbWFlbmdpbmVfc2xhdmVfY29uZmlnKHNwb3J0LT5kbWFfdHhfY2hhbiwgJmRtYV90eF9zY29uZmlnKTsKKworCWlmIChyZXQpIHsKKwkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsCisJCQkJIkRNQSBzbGF2ZSBjb25maWcgZmFpbGVkLCBlcnIgPSAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKLQlzcG9ydC0+ZG1hX3J4X2Rlc2MtPmNhbGxiYWNrID0gbHB1YXJ0X2RtYV9yeF9jb21wbGV0ZTsKLQlzcG9ydC0+ZG1hX3J4X2Rlc2MtPmNhbGxiYWNrX3BhcmFtID0gc3BvcnQ7Ci0Jc3BvcnQtPmRtYV9yeF9pbl9wcm9ncmVzcyA9IDE7Ci0Jc3BvcnQtPmRtYV9yeF9jb29raWUgPSBkbWFlbmdpbmVfc3VibWl0KHNwb3J0LT5kbWFfcnhfZGVzYyk7Ci0JZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoc3BvcnQtPmRtYV9yeF9jaGFuKTsKLQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBscHVhcnRfZmx1c2hfYnVmZmVyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOworCiAJaWYgKHNwb3J0LT5scHVhcnRfZG1hX3R4X3VzZSkgeworCQlpZiAoc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcykgeworCQkJZG1hX3VubWFwX3NnKHNwb3J0LT5wb3J0LmRldiwgJnNwb3J0LT50eF9zZ2xbMF0sCisJCQkJc3BvcnQtPmRtYV90eF9uZW50cywgRE1BX1RPX0RFVklDRSk7CisJCQlzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzID0gZmFsc2U7CisJCX0KIAkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc3BvcnQtPmRtYV90eF9jaGFuKTsKLQkJc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcyA9IDA7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBscHVhcnRfZG1hX3J4X2NvbXBsZXRlKHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gYXJnOwotCXN0cnVjdCB0dHlfcG9ydCAqcG9ydCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+cG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JYXN5bmNfdHhfYWNrKHNwb3J0LT5kbWFfcnhfZGVzYyk7Ci0JbW9kX3RpbWVyKCZzcG9ydC0+bHB1YXJ0X3RpbWVyLCBqaWZmaWVzICsgc3BvcnQtPmRtYV9yeF90aW1lb3V0KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0KLQlzcG9ydC0+ZG1hX3J4X2luX3Byb2dyZXNzID0gMDsKLQlscHVhcnRfY29weV9yeF90b190dHkoc3BvcnQsIHBvcnQsIEZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSk7Ci0JdHR5X2ZsaXBfYnVmZmVyX3B1c2gocG9ydCk7Ci0JbHB1YXJ0X2RtYV9yeChzcG9ydCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxwdWFydF90aW1lcl9mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gKHN0cnVjdCBscHVhcnRfcG9ydCAqKWRhdGE7Ci0Jc3RydWN0IHR0eV9wb3J0ICpwb3J0ID0gJnNwb3J0LT5wb3J0LnN0YXRlLT5wb3J0OwotCXN0cnVjdCBkbWFfdHhfc3RhdGUgc3RhdGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBjaGFyIHRlbXA7Ci0JaW50IGNvdW50OwotCi0JZGVsX3RpbWVyKCZzcG9ydC0+bHB1YXJ0X3RpbWVyKTsKLQlkbWFlbmdpbmVfcGF1c2Uoc3BvcnQtPmRtYV9yeF9jaGFuKTsKLQlkbWFlbmdpbmVfdHhfc3RhdHVzKHNwb3J0LT5kbWFfcnhfY2hhbiwgc3BvcnQtPmRtYV9yeF9jb29raWUsICZzdGF0ZSk7Ci0JZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc3BvcnQtPmRtYV9yeF9jaGFuKTsKLQljb3VudCA9IEZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSAtIHN0YXRlLnJlc2lkdWU7Ci0JYXN5bmNfdHhfYWNrKHNwb3J0LT5kbWFfcnhfZGVzYyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwotCi0Jc3BvcnQtPmRtYV9yeF9pbl9wcm9ncmVzcyA9IDA7Ci0JbHB1YXJ0X2NvcHlfcnhfdG9fdHR5KHNwb3J0LCBwb3J0LCBjb3VudCk7Ci0JdHR5X2ZsaXBfYnVmZmVyX3B1c2gocG9ydCk7Ci0JdGVtcCA9IHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKLQl3cml0ZWIodGVtcCAmIH5VQVJUQ1I1X1JETUFTLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBscHVhcnRfcHJlcGFyZV9yeChzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgY2hhciB0ZW1wOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLQotCXNwb3J0LT5scHVhcnRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBzcG9ydC0+ZG1hX3J4X3RpbWVvdXQ7Ci0JYWRkX3RpbWVyKCZzcG9ydC0+bHB1YXJ0X3RpbWVyKTsKLQotCWxwdWFydF9kbWFfcngoc3BvcnQpOwotCXRlbXAgPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7Ci0Jd3JpdGViKHRlbXAgfCBVQVJUQ1I1X1JETUFTLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBscHVhcnRfdHJhbnNtaXRfYnVmZmVyKHN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQpCiB7CiAJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnNwb3J0LT5wb3J0LnN0YXRlLT54bWl0OwpAQCAtNTgwLDggKzQ4NCw4IEBACiAJd3JpdGViKHRlbXAgfCBVQVJUQ1IyX1RJRSwgcG9ydC0+bWVtYmFzZSArIFVBUlRDUjIpOwogCiAJaWYgKHNwb3J0LT5scHVhcnRfZG1hX3R4X3VzZSkgewotCQlpZiAoIXVhcnRfY2lyY19lbXB0eSh4bWl0KSAmJiAhc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcykKLQkJCWxwdWFydF9wcmVwYXJlX3R4KHNwb3J0KTsKKwkJaWYgKCF1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgJiYgIXVhcnRfdHhfc3RvcHBlZChwb3J0KSkKKwkJCWxwdWFydF9kbWFfdHgoc3BvcnQpOwogCX0gZWxzZSB7CiAJCWlmIChyZWFkYihwb3J0LT5tZW1iYXNlICsgVUFSVFNSMSkgJiBVQVJUU1IxX1REUkUpCiAJCQlscHVhcnRfdHJhbnNtaXRfYnVmZmVyKHNwb3J0KTsKQEAgLTYwMCw2ICs1MDQsMjkgQEAKIAkJbHB1YXJ0MzJfdHJhbnNtaXRfYnVmZmVyKHNwb3J0KTsKIH0KIAorLyogcmV0dXJuIFRJT0NTRVJfVEVNVCB3aGVuIHRyYW5zbWl0dGVyIGlzIG5vdCBidXN5ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGxwdWFydF90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKKwkJCXN0cnVjdCBscHVhcnRfcG9ydCwgcG9ydCk7CisJdW5zaWduZWQgY2hhciBzcjEgPSByZWFkYihwb3J0LT5tZW1iYXNlICsgVUFSVFNSMSk7CisJdW5zaWduZWQgY2hhciBzZmlmbyA9IHJlYWRiKHBvcnQtPm1lbWJhc2UgKyBVQVJUU0ZJRk8pOworCisJaWYgKHNwb3J0LT5kbWFfdHhfaW5fcHJvZ3Jlc3MpCisJCXJldHVybiAwOworCisJaWYgKHNyMSAmIFVBUlRTUjFfVEMgJiYgc2ZpZm8gJiBVQVJUU0ZJRk9fVFhFTVBUKQorCQlyZXR1cm4gVElPQ1NFUl9URU1UOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbHB1YXJ0MzJfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gKGxwdWFydDMyX3JlYWQocG9ydC0+bWVtYmFzZSArIFVBUlRTVEFUKSAmIFVBUlRTVEFUX1RDKSA/CisJCVRJT0NTRVJfVEVNVCA6IDA7Cit9CisKIHN0YXRpYyBpcnFyZXR1cm5fdCBscHVhcnRfdHhpbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBkZXZfaWQ7CkBAIC03NjYsMjMgKzY5MywxNSBAQAogc3RhdGljIGlycXJldHVybl90IGxwdWFydF9pbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBkZXZfaWQ7Ci0JdW5zaWduZWQgY2hhciBzdHMsIGNyZG1hOworCXVuc2lnbmVkIGNoYXIgc3RzOwogCiAJc3RzID0gcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRTUjEpOwotCWNyZG1hID0gcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpOwogCi0JaWYgKHN0cyAmIFVBUlRTUjFfUkRSRiAmJiAhKGNyZG1hICYgVUFSVENSNV9SRE1BUykpIHsKLQkJaWYgKHNwb3J0LT5scHVhcnRfZG1hX3J4X3VzZSkKLQkJCWxwdWFydF9wcmVwYXJlX3J4KHNwb3J0KTsKLQkJZWxzZQotCQkJbHB1YXJ0X3J4aW50KGlycSwgZGV2X2lkKTsKLQl9Ci0JaWYgKHN0cyAmIFVBUlRTUjFfVERSRSAmJiAhKGNyZG1hICYgVUFSVENSNV9URE1BUykpIHsKLQkJaWYgKHNwb3J0LT5scHVhcnRfZG1hX3R4X3VzZSkKLQkJCWxwdWFydF9waW9fdHgoc3BvcnQpOwotCQllbHNlCi0JCQlscHVhcnRfdHhpbnQoaXJxLCBkZXZfaWQpOwotCX0KKwlpZiAoc3RzICYgVUFSVFNSMV9SRFJGKQorCQlscHVhcnRfcnhpbnQoaXJxLCBkZXZfaWQpOworCisJaWYgKHN0cyAmIFVBUlRTUjFfVERSRSkKKwkJbHB1YXJ0X3R4aW50KGlycSwgZGV2X2lkKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTgwNywxNyArNzI2LDI0MSBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotLyogcmV0dXJuIFRJT0NTRVJfVEVNVCB3aGVuIHRyYW5zbWl0dGVyIGlzIG5vdCBidXN5ICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGxwdWFydF90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQorc3RhdGljIHZvaWQgbHB1YXJ0X2NvcHlfcnhfdG9fdHR5KHN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQpCiB7Ci0JcmV0dXJuIChyZWFkYihwb3J0LT5tZW1iYXNlICsgVUFSVFNSMSkgJiBVQVJUU1IxX1RDKSA/Ci0JCVRJT0NTRVJfVEVNVCA6IDA7CisJc3RydWN0IHR0eV9wb3J0ICpwb3J0ID0gJnNwb3J0LT5wb3J0LnN0YXRlLT5wb3J0OworCXN0cnVjdCBkbWFfdHhfc3RhdGUgc3RhdGU7CisJZW51bSBkbWFfc3RhdHVzIGRtYXN0YXQ7CisJc3RydWN0IGNpcmNfYnVmICpyaW5nID0gJnNwb3J0LT5yeF9yaW5nOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50ID0gMDsKKwl1bnNpZ25lZCBjaGFyIHNyOworCisJc3IgPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFNSMSk7CisKKwlpZiAoc3IgJiAoVUFSVFNSMV9QRSB8IFVBUlRTUjFfRkUpKSB7CisJCS8qIFJlYWQgRFIgdG8gY2xlYXIgdGhlIGVycm9yIGZsYWdzICovCisJCXJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJURFIpOworCisJCWlmIChzciAmIFVBUlRTUjFfUEUpCisJCSAgICBzcG9ydC0+cG9ydC5pY291bnQucGFyaXR5Kys7CisJCWVsc2UgaWYgKHNyICYgVUFSVFNSMV9GRSkKKwkJICAgIHNwb3J0LT5wb3J0Lmljb3VudC5mcmFtZSsrOworCX0KKworCWFzeW5jX3R4X2FjayhzcG9ydC0+ZG1hX3J4X2Rlc2MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKKworCWRtYXN0YXQgPSBkbWFlbmdpbmVfdHhfc3RhdHVzKHNwb3J0LT5kbWFfcnhfY2hhbiwKKwkJCQlzcG9ydC0+ZG1hX3J4X2Nvb2tpZSwKKwkJCQkmc3RhdGUpOworCisJaWYgKGRtYXN0YXQgPT0gRE1BX0VSUk9SKSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiUnggRE1BIHRyYW5zZmVyIGZhaWxlZCFcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDUFUgY2xhaW1zIG93bmVyc2hpcCBvZiBSWCBETUEgYnVmZmVyICovCisJZG1hX3N5bmNfc2dfZm9yX2NwdShzcG9ydC0+cG9ydC5kZXYsICZzcG9ydC0+cnhfc2dsLCAxLCBETUFfRlJPTV9ERVZJQ0UpOworCisJLyoKKwkgKiByaW5nLT5oZWFkIHBvaW50cyB0byB0aGUgZW5kIG9mIGRhdGEgYWxyZWFkeSB3cml0dGVuIGJ5IHRoZSBETUEuCisJICogcmluZy0+dGFpbCBwb2ludHMgdG8gdGhlIGJlZ2lubmluZyBvZiBkYXRhIHRvIGJlIHJlYWQgYnkgdGhlCisJICogZnJhbWV3b3JrLgorCSAqIFRoZSBjdXJyZW50IHRyYW5zZmVyIHNpemUgc2hvdWxkIG5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgZG1hIGJ1ZmZlcgorCSAqIGxlbmd0aC4KKwkgKi8KKwlyaW5nLT5oZWFkID0gc3BvcnQtPnJ4X3NnbC5sZW5ndGggLSBzdGF0ZS5yZXNpZHVlOworCUJVR19PTihyaW5nLT5oZWFkID4gc3BvcnQtPnJ4X3NnbC5sZW5ndGgpOworCS8qCisJICogQXQgdGhpcyBwb2ludCByaW5nLT5oZWFkIG1heSBwb2ludCB0byB0aGUgZmlyc3QgYnl0ZSByaWdodCBhZnRlciB0aGUKKwkgKiBsYXN0IGJ5dGUgb2YgdGhlIGRtYSBidWZmZXI6CisJICogMCA8PSByaW5nLT5oZWFkIDw9IHNwb3J0LT5yeF9zZ2wubGVuZ3RoCisJICoKKwkgKiBIb3dldmVyIHJpbmctPnRhaWwgbXVzdCBhbHdheXMgcG9pbnRzIGluc2lkZSB0aGUgZG1hIGJ1ZmZlcjoKKwkgKiAwIDw9IHJpbmctPnRhaWwgPD0gc3BvcnQtPnJ4X3NnbC5sZW5ndGggLSAxCisJICoKKwkgKiBTaW5jZSB3ZSB1c2UgYSByaW5nIGJ1ZmZlciwgd2UgaGF2ZSB0byBoYW5kbGUgdGhlIGNhc2UKKwkgKiB3aGVyZSBoZWFkIGlzIGxvd2VyIHRoYW4gdGFpbC4gSW4gc3VjaCBhIGNhc2UsIHdlIGZpcnN0IHJlYWQgZnJvbQorCSAqIHRhaWwgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHRoZW4gcmVzZXQgdGFpbC4KKwkgKi8KKwlpZiAocmluZy0+aGVhZCA8IHJpbmctPnRhaWwpIHsKKwkJY291bnQgPSBzcG9ydC0+cnhfc2dsLmxlbmd0aCAtIHJpbmctPnRhaWw7CisKKwkJdHR5X2luc2VydF9mbGlwX3N0cmluZyhwb3J0LCByaW5nLT5idWYgKyByaW5nLT50YWlsLCBjb3VudCk7CisJCXJpbmctPnRhaWwgPSAwOworCQlzcG9ydC0+cG9ydC5pY291bnQucnggKz0gY291bnQ7CisJfQorCisJLyogRmluYWxseSB3ZSByZWFkIGRhdGEgZnJvbSB0YWlsIHRvIGhlYWQgKi8KKwlpZiAocmluZy0+dGFpbCA8IHJpbmctPmhlYWQpIHsKKwkJY291bnQgPSByaW5nLT5oZWFkIC0gcmluZy0+dGFpbDsKKwkJdHR5X2luc2VydF9mbGlwX3N0cmluZyhwb3J0LCByaW5nLT5idWYgKyByaW5nLT50YWlsLCBjb3VudCk7CisJCS8qIFdyYXAgcmluZy0+aGVhZCBpZiBuZWVkZWQgKi8KKwkJaWYgKHJpbmctPmhlYWQgPj0gc3BvcnQtPnJ4X3NnbC5sZW5ndGgpCisJCQlyaW5nLT5oZWFkID0gMDsKKwkJcmluZy0+dGFpbCA9IHJpbmctPmhlYWQ7CisJCXNwb3J0LT5wb3J0Lmljb3VudC5yeCArPSBjb3VudDsKKwl9CisKKwlkbWFfc3luY19zZ19mb3JfZGV2aWNlKHNwb3J0LT5wb3J0LmRldiwgJnNwb3J0LT5yeF9zZ2wsIDEsCisJCQkgICAgICAgRE1BX0ZST01fREVWSUNFKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKKworCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHBvcnQpOworCW1vZF90aW1lcigmc3BvcnQtPmxwdWFydF90aW1lciwgamlmZmllcyArIHNwb3J0LT5kbWFfcnhfdGltZW91dCk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbHB1YXJ0MzJfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIGxwdWFydF9kbWFfcnhfY29tcGxldGUodm9pZCAqYXJnKQogewotCXJldHVybiAobHB1YXJ0MzJfcmVhZChwb3J0LT5tZW1iYXNlICsgVUFSVFNUQVQpICYgVUFSVFNUQVRfVEMpID8KLQkJVElPQ1NFUl9URU1UIDogMDsKKwlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gYXJnOworCisJbHB1YXJ0X2NvcHlfcnhfdG9fdHR5KHNwb3J0KTsKK30KKworc3RhdGljIHZvaWQgbHB1YXJ0X3RpbWVyX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSAoc3RydWN0IGxwdWFydF9wb3J0ICopZGF0YTsKKworCWxwdWFydF9jb3B5X3J4X3RvX3R0eShzcG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxwdWFydF9zdGFydF9yeF9kbWEoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCkKK3sKKwlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBkbWFfcnhfc2NvbmZpZyA9IHt9OworCXN0cnVjdCBjaXJjX2J1ZiAqcmluZyA9ICZzcG9ydC0+cnhfcmluZzsKKwlpbnQgcmV0LCBuZW50OworCWludCBiaXRzLCBiYXVkOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZzcG9ydC0+cG9ydC5zdGF0ZS0+cG9ydCk7CisJc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zID0gJnR0eS0+dGVybWlvczsKKworCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZSh0dHkpOworCisJYml0cyA9ICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NJWkUpID09IENTNyA/IDkgOiAxMDsKKwlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUkVOQikKKwkJYml0cysrOworCisJLyoKKwkgKiBDYWxjdWxhdGUgbGVuZ3RoIG9mIG9uZSBETUEgYnVmZmVyIHNpemUgdG8ga2VlcCBsYXRlbmN5IGJlbG93CisJICogMTBtcyBhdCBhbnkgYmF1ZCByYXRlLgorCSAqLworCXNwb3J0LT5yeF9kbWFfcm5nX2J1Zl9sZW4gPSAoRE1BX1JYX1RJTUVPVVQgKiBiYXVkIC8gIGJpdHMgLyAxMDAwKSAqIDI7CisJc3BvcnQtPnJ4X2RtYV9ybmdfYnVmX2xlbiA9ICgxIDw8IChmbHMoc3BvcnQtPnJ4X2RtYV9ybmdfYnVmX2xlbikgLSAxKSk7CisJaWYgKHNwb3J0LT5yeF9kbWFfcm5nX2J1Zl9sZW4gPCAxNikKKwkJc3BvcnQtPnJ4X2RtYV9ybmdfYnVmX2xlbiA9IDE2OworCisJcmluZy0+YnVmID0ga21hbGxvYyhzcG9ydC0+cnhfZG1hX3JuZ19idWZfbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXJpbmctPmJ1ZikgeworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgIlJpbmcgYnVmIGFsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNnX2luaXRfb25lKCZzcG9ydC0+cnhfc2dsLCByaW5nLT5idWYsIHNwb3J0LT5yeF9kbWFfcm5nX2J1Zl9sZW4pOworCXNnX3NldF9idWYoJnNwb3J0LT5yeF9zZ2wsIHJpbmctPmJ1Ziwgc3BvcnQtPnJ4X2RtYV9ybmdfYnVmX2xlbik7CisJbmVudCA9IGRtYV9tYXBfc2coc3BvcnQtPnBvcnQuZGV2LCAmc3BvcnQtPnJ4X3NnbCwgMSwgRE1BX0ZST01fREVWSUNFKTsKKworCWlmICghbmVudCkgeworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgIkRNQSBSeCBtYXBwaW5nIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZG1hX3J4X3Njb25maWcuc3JjX2FkZHIgPSBzcG9ydC0+cG9ydC5tYXBiYXNlICsgVUFSVERSOworCWRtYV9yeF9zY29uZmlnLnNyY19hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURTsKKwlkbWFfcnhfc2NvbmZpZy5zcmNfbWF4YnVyc3QgPSAxOworCWRtYV9yeF9zY29uZmlnLmRpcmVjdGlvbiA9IERNQV9ERVZfVE9fTUVNOworCXJldCA9IGRtYWVuZ2luZV9zbGF2ZV9jb25maWcoc3BvcnQtPmRtYV9yeF9jaGFuLCAmZG1hX3J4X3Njb25maWcpOworCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsCisJCQkJIkRNQSBSeCBzbGF2ZSBjb25maWcgZmFpbGVkLCBlcnIgPSAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzcG9ydC0+ZG1hX3J4X2Rlc2MgPSBkbWFlbmdpbmVfcHJlcF9kbWFfY3ljbGljKHNwb3J0LT5kbWFfcnhfY2hhbiwKKwkJCQkgc2dfZG1hX2FkZHJlc3MoJnNwb3J0LT5yeF9zZ2wpLAorCQkJCSBzcG9ydC0+cnhfc2dsLmxlbmd0aCwKKwkJCQkgc3BvcnQtPnJ4X3NnbC5sZW5ndGggLyAyLAorCQkJCSBETUFfREVWX1RPX01FTSwKKwkJCQkgRE1BX1BSRVBfSU5URVJSVVBUKTsKKwlpZiAoIXNwb3J0LT5kbWFfcnhfZGVzYykgeworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgIkNhbm5vdCBwcmVwYXJlIGN5Y2xpYyBETUFcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlzcG9ydC0+ZG1hX3J4X2Rlc2MtPmNhbGxiYWNrID0gbHB1YXJ0X2RtYV9yeF9jb21wbGV0ZTsKKwlzcG9ydC0+ZG1hX3J4X2Rlc2MtPmNhbGxiYWNrX3BhcmFtID0gc3BvcnQ7CisJc3BvcnQtPmRtYV9yeF9jb29raWUgPSBkbWFlbmdpbmVfc3VibWl0KHNwb3J0LT5kbWFfcnhfZGVzYyk7CisJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoc3BvcnQtPmRtYV9yeF9jaGFuKTsKKworCXdyaXRlYihyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSkgfCBVQVJUQ1I1X1JETUFTLAorCQkJCXNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBscHVhcnRfZG1hX3J4X2ZyZWUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gY29udGFpbmVyX29mKHBvcnQsCisJCQkJCXN0cnVjdCBscHVhcnRfcG9ydCwgcG9ydCk7CisKKwlpZiAoc3BvcnQtPmRtYV9yeF9jaGFuKQorCQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChzcG9ydC0+ZG1hX3J4X2NoYW4pOworCisJZG1hX3VubWFwX3NnKHNwb3J0LT5wb3J0LmRldiwgJnNwb3J0LT5yeF9zZ2wsIDEsIERNQV9GUk9NX0RFVklDRSk7CisJa2ZyZWUoc3BvcnQtPnJ4X3JpbmcuYnVmKTsKKwlzcG9ydC0+cnhfcmluZy50YWlsID0gMDsKKwlzcG9ydC0+cnhfcmluZy5oZWFkID0gMDsKKwlzcG9ydC0+ZG1hX3J4X2Rlc2MgPSBOVUxMOworCXNwb3J0LT5kbWFfcnhfY29va2llID0gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBscHVhcnRfY29uZmlnX3JzNDg1KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCisJCQlzdHJ1Y3Qgc2VyaWFsX3JzNDg1ICpyczQ4NSkKK3sKKwlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gY29udGFpbmVyX29mKHBvcnQsCisJCQlzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOworCisJdTggbW9kZW0gPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVE1PREVNKSAmCisJCX4oVUFSVE1PREVNX1RYUlRTUE9MIHwgVUFSVE1PREVNX1RYUlRTRSk7CisJd3JpdGViKG1vZGVtLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVE1PREVNKTsKKworCWlmIChyczQ4NS0+ZmxhZ3MgJiBTRVJfUlM0ODVfRU5BQkxFRCkgeworCQkvKiBFbmFibGUgYXV0byBSUy00ODUgUlRTIG1vZGUgKi8KKwkJbW9kZW0gfD0gVUFSVE1PREVNX1RYUlRTRTsKKworCQkvKgorCQkgKiBSVFMgbmVlZHMgdG8gYmUgbG9naWMgSElHSCBlaXRoZXIgZHVyaW5nIHRyYW5zZXIgX29yXyBhZnRlcgorCQkgKiB0cmFuc2Zlciwgb3RoZXIgdmFyaWFudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlLgorCQkgKi8KKworCQlpZiAoIShyczQ4NS0+ZmxhZ3MgJiAoU0VSX1JTNDg1X1JUU19PTl9TRU5EIHwKKwkJCQlTRVJfUlM0ODVfUlRTX0FGVEVSX1NFTkQpKSkKKwkJCXJzNDg1LT5mbGFncyB8PSBTRVJfUlM0ODVfUlRTX09OX1NFTkQ7CisKKwkJaWYgKHJzNDg1LT5mbGFncyAmIFNFUl9SUzQ4NV9SVFNfT05fU0VORCAmJgorCQkJCXJzNDg1LT5mbGFncyAmIFNFUl9SUzQ4NV9SVFNfQUZURVJfU0VORCkKKwkJCXJzNDg1LT5mbGFncyAmPSB+U0VSX1JTNDg1X1JUU19BRlRFUl9TRU5EOworCisJCS8qCisJCSAqIFRoZSBoYXJkd2FyZSBkZWZhdWx0cyB0byBSVFMgbG9naWMgSElHSCB3aGlsZSB0cmFuc2Zlci4KKwkJICogU3dpdGNoIHBvbGFyaXR5IGluIGNhc2UgUlRTIHNoYWxsIGJlIGxvZ2ljIEhJR0gKKwkJICogYWZ0ZXIgdHJhbnNmZXIuCisJCSAqIE5vdGU6IFVBUlQgaXMgYXNzdW1lZCB0byBiZSBhY3RpdmUgaGlnaC4KKwkJICovCisJCWlmIChyczQ4NS0+ZmxhZ3MgJiBTRVJfUlM0ODVfUlRTX09OX1NFTkQpCisJCQltb2RlbSAmPSB+VUFSVE1PREVNX1RYUlRTUE9MOworCQllbHNlIGlmIChyczQ4NS0+ZmxhZ3MgJiBTRVJfUlM0ODVfUlRTX0FGVEVSX1NFTkQpCisJCQltb2RlbSB8PSBVQVJUTU9ERU1fVFhSVFNQT0w7CisJfQorCisJLyogU3RvcmUgdGhlIG5ldyBjb25maWd1cmF0aW9uICovCisJc3BvcnQtPnBvcnQucnM0ODUgPSAqcnM0ODU7CisKKwl3cml0ZWIobW9kZW0sIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUTU9ERU0pOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGxwdWFydF9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKQEAgLTg1MywxNyArOTk2LDIyIEBACiBzdGF0aWMgdm9pZCBscHVhcnRfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBtY3RybCkKIHsKIAl1bnNpZ25lZCBjaGFyIHRlbXA7CisJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LAorCQkJCXN0cnVjdCBscHVhcnRfcG9ydCwgcG9ydCk7CiAKLQl0ZW1wID0gcmVhZGIocG9ydC0+bWVtYmFzZSArIFVBUlRNT0RFTSkgJgorCS8qIE1ha2Ugc3VyZSBSWFJUU0UgYml0IGlzIG5vdCBzZXQgd2hlbiBSUzQ4NSBpcyBlbmFibGVkICovCisJaWYgKCEoc3BvcnQtPnBvcnQucnM0ODUuZmxhZ3MgJiBTRVJfUlM0ODVfRU5BQkxFRCkpIHsKKwkJdGVtcCA9IHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUTU9ERU0pICYKIAkJCX4oVUFSVE1PREVNX1JYUlRTRSB8IFVBUlRNT0RFTV9UWENUU0UpOwogCi0JaWYgKG1jdHJsICYgVElPQ01fUlRTKQotCQl0ZW1wIHw9IFVBUlRNT0RFTV9SWFJUU0U7CisJCWlmIChtY3RybCAmIFRJT0NNX1JUUykKKwkJCXRlbXAgfD0gVUFSVE1PREVNX1JYUlRTRTsKIAotCWlmIChtY3RybCAmIFRJT0NNX0NUUykKLQkJdGVtcCB8PSBVQVJUTU9ERU1fVFhDVFNFOworCQlpZiAobWN0cmwgJiBUSU9DTV9DVFMpCisJCQl0ZW1wIHw9IFVBUlRNT0RFTV9UWENUU0U7CiAKLQl3cml0ZWIodGVtcCwgcG9ydC0+bWVtYmFzZSArIFVBUlRNT0RFTSk7CisJCXdyaXRlYih0ZW1wLCBwb3J0LT5tZW1iYXNlICsgVUFSVE1PREVNKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGxwdWFydDMyX3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgbWN0cmwpCkBAIC05MjEsMTMgKzEwNjksMTYgQEAKIAl3cml0ZWIodmFsIHwgVUFSVFBGSUZPX1RYRkUgfCBVQVJUUEZJRk9fUlhGRSwKIAkJCXNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUUEZJRk8pOwogCi0JLyogZXhwbGljaXRseSBjbGVhciBSRFJGICovCi0JcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRTUjEpOwotCiAJLyogZmx1c2ggVHggYW5kIFJ4IEZJRk8gKi8KIAl3cml0ZWIoVUFSVENGSUZPX1RYRkxVU0ggfCBVQVJUQ0ZJRk9fUlhGTFVTSCwKIAkJCXNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ0ZJRk8pOwogCisJLyogZXhwbGljaXRseSBjbGVhciBSRFJGICovCisJaWYgKHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUU1IxKSAmIFVBUlRTUjFfUkRSRikgeworCQlyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVERSKTsKKwkJd3JpdGViKFVBUlRTRklGT19SWFVGLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFNGSUZPKTsKKwl9CisKIAl3cml0ZWIoMCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRUV0ZJRk8pOwogCXdyaXRlYigxLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFJXRklGTyk7CiAKQEAgLTk2MCwxMTAgKzExMTEsMTIgQEAKIAlscHVhcnQzMl93cml0ZShjdHJsX3NhdmVkLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENUUkwpOwogfQogCi1zdGF0aWMgaW50IGxwdWFydF9kbWFfdHhfcmVxdWVzdChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQorc3RhdGljIHZvaWQgcnhfZG1hX3RpbWVyX2luaXQoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCkKIHsKLQlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gY29udGFpbmVyX29mKHBvcnQsCi0JCQkJCXN0cnVjdCBscHVhcnRfcG9ydCwgcG9ydCk7Ci0Jc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgZG1hX3R4X3Njb25maWc7Ci0JZG1hX2FkZHJfdCBkbWFfYnVzOwotCXVuc2lnbmVkIGNoYXIgKmRtYV9idWY7Ci0JaW50IHJldDsKLQotCWRtYV9idXMgPSBkbWFfbWFwX3NpbmdsZShzcG9ydC0+ZG1hX3R4X2NoYW4tPmRldmljZS0+ZGV2LAotCQkJCXNwb3J0LT5wb3J0LnN0YXRlLT54bWl0LmJ1ZiwKLQkJCQlVQVJUX1hNSVRfU0laRSwgRE1BX1RPX0RFVklDRSk7Ci0KLQlpZiAoZG1hX21hcHBpbmdfZXJyb3Ioc3BvcnQtPmRtYV90eF9jaGFuLT5kZXZpY2UtPmRldiwgZG1hX2J1cykpIHsKLQkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJkbWFfbWFwX3NpbmdsZSB0eCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlkbWFfYnVmID0gc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQuYnVmOwotCWRtYV90eF9zY29uZmlnLmRzdF9hZGRyID0gc3BvcnQtPnBvcnQubWFwYmFzZSArIFVBUlREUjsKLQlkbWFfdHhfc2NvbmZpZy5kc3RfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU7Ci0JZG1hX3R4X3Njb25maWcuZHN0X21heGJ1cnN0ID0gc3BvcnQtPnR4Zmlmb19zaXplOwotCWRtYV90eF9zY29uZmlnLmRpcmVjdGlvbiA9IERNQV9NRU1fVE9fREVWOwotCXJldCA9IGRtYWVuZ2luZV9zbGF2ZV9jb25maWcoc3BvcnQtPmRtYV90eF9jaGFuLCAmZG1hX3R4X3Njb25maWcpOwotCi0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsCi0JCQkJIkRtYSBzbGF2ZSBjb25maWcgZmFpbGVkLCBlcnIgPSAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlzcG9ydC0+ZG1hX3R4X2J1Zl92aXJ0ID0gZG1hX2J1ZjsKLQlzcG9ydC0+ZG1hX3R4X2J1Zl9idXMgPSBkbWFfYnVzOwotCXNwb3J0LT5kbWFfdHhfaW5fcHJvZ3Jlc3MgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbHB1YXJ0X2RtYV9yeF9yZXF1ZXN0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LAotCQkJCQlzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOwotCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGRtYV9yeF9zY29uZmlnOwotCWRtYV9hZGRyX3QgZG1hX2J1czsKLQl1bnNpZ25lZCBjaGFyICpkbWFfYnVmOwotCWludCByZXQ7Ci0KLQlkbWFfYnVmID0gZGV2bV9remFsbG9jKHNwb3J0LT5wb3J0LmRldiwKLQkJCQlGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOwotCi0JaWYgKCFkbWFfYnVmKSB7Ci0JCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiRG1hIHJ4IGFsbG9jIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWRtYV9idXMgPSBkbWFfbWFwX3NpbmdsZShzcG9ydC0+ZG1hX3J4X2NoYW4tPmRldmljZS0+ZGV2LCBkbWFfYnVmLAotCQkJCUZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKLQotCWlmIChkbWFfbWFwcGluZ19lcnJvcihzcG9ydC0+ZG1hX3J4X2NoYW4tPmRldmljZS0+ZGV2LCBkbWFfYnVzKSkgewotCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgImRtYV9tYXBfc2luZ2xlIHJ4IGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWRtYV9yeF9zY29uZmlnLnNyY19hZGRyID0gc3BvcnQtPnBvcnQubWFwYmFzZSArIFVBUlREUjsKLQlkbWFfcnhfc2NvbmZpZy5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU7Ci0JZG1hX3J4X3Njb25maWcuc3JjX21heGJ1cnN0ID0gMTsKLQlkbWFfcnhfc2NvbmZpZy5kaXJlY3Rpb24gPSBETUFfREVWX1RPX01FTTsKLQlyZXQgPSBkbWFlbmdpbmVfc2xhdmVfY29uZmlnKHNwb3J0LT5kbWFfcnhfY2hhbiwgJmRtYV9yeF9zY29uZmlnKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LAotCQkJCSJEbWEgc2xhdmUgY29uZmlnIGZhaWxlZCwgZXJyID0gJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0Jc3BvcnQtPmRtYV9yeF9idWZfdmlydCA9IGRtYV9idWY7Ci0Jc3BvcnQtPmRtYV9yeF9idWZfYnVzID0gZG1hX2J1czsKLQlzcG9ydC0+ZG1hX3J4X2luX3Byb2dyZXNzID0gMDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBscHVhcnRfZG1hX3R4X2ZyZWUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gY29udGFpbmVyX29mKHBvcnQsCi0JCQkJCXN0cnVjdCBscHVhcnRfcG9ydCwgcG9ydCk7Ci0KLQlkbWFfdW5tYXBfc2luZ2xlKHNwb3J0LT5wb3J0LmRldiwgc3BvcnQtPmRtYV90eF9idWZfYnVzLAotCQkJVUFSVF9YTUlUX1NJWkUsIERNQV9UT19ERVZJQ0UpOwotCi0Jc3BvcnQtPmRtYV90eF9idWZfYnVzID0gMDsKLQlzcG9ydC0+ZG1hX3R4X2J1Zl92aXJ0ID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgbHB1YXJ0X2RtYV9yeF9mcmVlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LAotCQkJCQlzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOwotCi0JZG1hX3VubWFwX3NpbmdsZShzcG9ydC0+cG9ydC5kZXYsIHNwb3J0LT5kbWFfcnhfYnVmX2J1cywKLQkJCUZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKLQotCXNwb3J0LT5kbWFfcnhfYnVmX2J1cyA9IDA7Ci0Jc3BvcnQtPmRtYV9yeF9idWZfdmlydCA9IE5VTEw7CisJCXNldHVwX3RpbWVyKCZzcG9ydC0+bHB1YXJ0X3RpbWVyLCBscHVhcnRfdGltZXJfZnVuYywKKwkJCQkodW5zaWduZWQgbG9uZylzcG9ydCk7CisJCXNwb3J0LT5scHVhcnRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBzcG9ydC0+ZG1hX3J4X3RpbWVvdXQ7CisJCWFkZF90aW1lcigmc3BvcnQtPmxwdWFydF90aW1lcik7CiB9CiAKIHN0YXRpYyBpbnQgbHB1YXJ0X3N0YXJ0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKQEAgLTEwODQsMjIgKzExMzcsNiBAQAogCXNwb3J0LT5yeGZpZm9fc2l6ZSA9IDB4MSA8PCAoKCh0ZW1wID4+IFVBUlRQRklGT19SWFNJWkVfT0ZGKSAmCiAJCVVBUlRQRklGT19GSUZPU0laRV9NQVNLKSArIDEpOwogCi0JaWYgKHNwb3J0LT5kbWFfcnhfY2hhbiAmJiAhbHB1YXJ0X2RtYV9yeF9yZXF1ZXN0KHBvcnQpKSB7Ci0JCXNwb3J0LT5scHVhcnRfZG1hX3J4X3VzZSA9IHRydWU7Ci0JCXNldHVwX3RpbWVyKCZzcG9ydC0+bHB1YXJ0X3RpbWVyLCBscHVhcnRfdGltZXJfZnVuYywKLQkJCSAgICAodW5zaWduZWQgbG9uZylzcG9ydCk7Ci0JfSBlbHNlCi0JCXNwb3J0LT5scHVhcnRfZG1hX3J4X3VzZSA9IGZhbHNlOwotCi0KLQlpZiAoc3BvcnQtPmRtYV90eF9jaGFuICYmICFscHVhcnRfZG1hX3R4X3JlcXVlc3QocG9ydCkpIHsKLQkJc3BvcnQtPmxwdWFydF9kbWFfdHhfdXNlID0gdHJ1ZTsKLQkJdGVtcCA9IHJlYWRiKHBvcnQtPm1lbWJhc2UgKyBVQVJUQ1I1KTsKLQkJdGVtcCAmPSB+VUFSVENSNV9SRE1BUzsKLQkJd3JpdGViKHRlbXAgfCBVQVJUQ1I1X1RETUFTLCBwb3J0LT5tZW1iYXNlICsgVUFSVENSNSk7Ci0JfSBlbHNlCi0JCXNwb3J0LT5scHVhcnRfZG1hX3R4X3VzZSA9IGZhbHNlOwotCiAJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShwb3J0LT5kZXYsIHBvcnQtPmlycSwgbHB1YXJ0X2ludCwgMCwKIAkJCQlEUklWRVJfTkFNRSwgc3BvcnQpOwogCWlmIChyZXQpCkBAIC0xMTEzLDcgKzExNTAsMjkgQEAKIAl0ZW1wIHw9IChVQVJUQ1IyX1JJRSB8IFVBUlRDUjJfVElFIHwgVUFSVENSMl9SRSB8IFVBUlRDUjJfVEUpOwogCXdyaXRlYih0ZW1wLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSMik7CiAKKwlpZiAoc3BvcnQtPmRtYV9yeF9jaGFuICYmICFscHVhcnRfc3RhcnRfcnhfZG1hKHNwb3J0KSkgeworCQkvKiBzZXQgUnggRE1BIHRpbWVvdXQgKi8KKwkJc3BvcnQtPmRtYV9yeF90aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhETUFfUlhfVElNRU9VVCk7CisJCWlmICghc3BvcnQtPmRtYV9yeF90aW1lb3V0KQorCQkgICAgIHNwb3J0LT5kbWFfcnhfdGltZW91dCA9IDE7CisKKwkJc3BvcnQtPmxwdWFydF9kbWFfcnhfdXNlID0gdHJ1ZTsKKwkJcnhfZG1hX3RpbWVyX2luaXQoc3BvcnQpOworCX0gZWxzZSB7CisJCXNwb3J0LT5scHVhcnRfZG1hX3J4X3VzZSA9IGZhbHNlOworCX0KKworCWlmIChzcG9ydC0+ZG1hX3R4X2NoYW4gJiYgIWxwdWFydF9kbWFfdHhfcmVxdWVzdChwb3J0KSkgeworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzcG9ydC0+ZG1hX3dhaXQpOworCQlzcG9ydC0+bHB1YXJ0X2RtYV90eF91c2UgPSB0cnVlOworCQl0ZW1wID0gcmVhZGIocG9ydC0+bWVtYmFzZSArIFVBUlRDUjUpOworCQl3cml0ZWIodGVtcCB8IFVBUlRDUjVfVERNQVMsIHBvcnQtPm1lbWJhc2UgKyBVQVJUQ1I1KTsKKwl9IGVsc2UgeworCQlzcG9ydC0+bHB1YXJ0X2RtYV90eF91c2UgPSBmYWxzZTsKKwl9CisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE3MCwxMiArMTIyOSwxOSBAQAogCWRldm1fZnJlZV9pcnEocG9ydC0+ZGV2LCBwb3J0LT5pcnEsIHNwb3J0KTsKIAogCWlmIChzcG9ydC0+bHB1YXJ0X2RtYV9yeF91c2UpIHsKLQkJbHB1YXJ0X2RtYV9yeF9mcmVlKCZzcG9ydC0+cG9ydCk7CiAJCWRlbF90aW1lcl9zeW5jKCZzcG9ydC0+bHB1YXJ0X3RpbWVyKTsKKwkJbHB1YXJ0X2RtYV9yeF9mcmVlKCZzcG9ydC0+cG9ydCk7CiAJfQogCi0JaWYgKHNwb3J0LT5scHVhcnRfZG1hX3R4X3VzZSkKLQkJbHB1YXJ0X2RtYV90eF9mcmVlKCZzcG9ydC0+cG9ydCk7CisJaWYgKHNwb3J0LT5scHVhcnRfZG1hX3R4X3VzZSkgeworCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNwb3J0LT5kbWFfd2FpdCwKKwkJCSFzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzKSAhPSBmYWxzZSkgeworCQkJc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcyA9IGZhbHNlOworCQkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc3BvcnQtPmRtYV90eF9jaGFuKTsKKwkJfQorCisJCWxwdWFydF9zdG9wX3R4KHBvcnQpOworCX0KIH0KIAogc3RhdGljIHZvaWQgbHB1YXJ0MzJfc2h1dGRvd24oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKQEAgLTEyMDMsMTMgKzEyNjksMTQgQEAKIHsKIAlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBscHVhcnRfcG9ydCwgcG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBjaGFyIGNyMSwgb2xkX2NyMSwgb2xkX2NyMiwgY3I0LCBiZGgsIG1vZGVtOworCXVuc2lnbmVkIGNoYXIgY3IxLCBvbGRfY3IxLCBvbGRfY3IyLCBjcjMsIGNyNCwgYmRoLCBtb2RlbTsKIAl1bnNpZ25lZCBpbnQgIGJhdWQ7CiAJdW5zaWduZWQgaW50IG9sZF9jc2l6ZSA9IG9sZCA/IG9sZC0+Y19jZmxhZyAmIENTSVpFIDogQ1M4OwogCXVuc2lnbmVkIGludCBzYnIsIGJyZmE7CiAKIAljcjEgPSBvbGRfY3IxID0gcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjEpOwogCW9sZF9jcjIgPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSMik7CisJY3IzID0gcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjMpOwogCWNyNCA9IHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I0KTsKIAliZGggPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVEJESCk7CiAJbW9kZW0gPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVE1PREVNKTsKQEAgLTEyNDAsNiArMTMwNywxMyBAQAogCQljcjEgfD0gVUFSVENSMV9NOwogCX0KIAorCS8qCisJICogV2hlbiBhdXRvIFJTLTQ4NSBSVFMgbW9kZSBpcyBlbmFibGVkLAorCSAqIGhhcmR3YXJlIGZsb3cgY29udHJvbCBuZWVkIHRvIGJlIGRpc2FibGVkLgorCSAqLworCWlmIChzcG9ydC0+cG9ydC5yczQ4NS5mbGFncyAmIFNFUl9SUzQ4NV9FTkFCTEVEKQorCQl0ZXJtaW9zLT5jX2NmbGFnICY9IH5DUlRTQ1RTOworCiAJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CiAJCW1vZGVtIHw9IChVQVJUTU9ERU1fUlhSVFNFIHwgVUFSVE1PREVNX1RYQ1RTRSk7CiAJfSBlbHNlIHsKQEAgLTEyNTcsNyArMTMzMSwxMCBAQAogCWlmICgodGVybWlvcy0+Y19jZmxhZyAmIFBBUkVOQikpIHsKIAkJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDTVNQQVIpIHsKIAkJCWNyMSAmPSB+VUFSVENSMV9QRTsKLQkJCWNyMSB8PSBVQVJUQ1IxX007CisJCQlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUk9ERCkKKwkJCQljcjMgfD0gVUFSVENSM19UODsKKwkJCWVsc2UKKwkJCQljcjMgJj0gflVBUlRDUjNfVDg7CiAJCX0gZWxzZSB7CiAJCQljcjEgfD0gVUFSVENSMV9QRTsKIAkJCWlmICgodGVybWlvcy0+Y19jZmxhZyAmIENTSVpFKSA9PSBDUzgpCkBAIC0xMjk3LDE3ICsxMzc0LDYgQEAKIAkvKiB1cGRhdGUgdGhlIHBlci1wb3J0IHRpbWVvdXQgKi8KIAl1YXJ0X3VwZGF0ZV90aW1lb3V0KHBvcnQsIHRlcm1pb3MtPmNfY2ZsYWcsIGJhdWQpOwogCi0JaWYgKHNwb3J0LT5scHVhcnRfZG1hX3J4X3VzZSkgewotCQkvKiBDYWxjdWxhdGUgZGVsYXkgZm9yIDEuNSBETUEgYnVmZmVycyAqLwotCQlzcG9ydC0+ZG1hX3J4X3RpbWVvdXQgPSAoc3BvcnQtPnBvcnQudGltZW91dCAtIEhaIC8gNTApICoKLQkJCQkJRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFICogMyAvCi0JCQkJCXNwb3J0LT5yeGZpZm9fc2l6ZSAvIDI7Ci0JCWRldl9kYmcocG9ydC0+ZGV2LCAiRE1BIFJ4IHQtb3V0ICV1bXMsIHR0eSB0LW91dCAldSBqaWZmaWVzXG4iLAotCQkJc3BvcnQtPmRtYV9yeF90aW1lb3V0ICogMTAwMCAvIEhaLCBzcG9ydC0+cG9ydC50aW1lb3V0KTsKLQkJaWYgKHNwb3J0LT5kbWFfcnhfdGltZW91dCA8IG1zZWNzX3RvX2ppZmZpZXMoMjApKQotCQkJc3BvcnQtPmRtYV9yeF90aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcygyMCk7Ci0JfQotCiAJLyogd2FpdCB0cmFuc21pdCBlbmdpbiBjb21wbGV0ZSAqLwogCXdoaWxlICghKHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUU1IxKSAmIFVBUlRTUjFfVEMpKQogCQliYXJyaWVyKCk7CkBAIC0xMzI1LDEyICsxMzkxLDMxIEBACiAJd3JpdGViKGNyNCB8IGJyZmEsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I0KTsKIAl3cml0ZWIoYmRoLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVEJESCk7CiAJd3JpdGViKHNiciAmIDB4RkYsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQkRMKTsKKwl3cml0ZWIoY3IzLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSMyk7CiAJd3JpdGViKGNyMSwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjEpOwogCXdyaXRlYihtb2RlbSwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRNT0RFTSk7CiAKIAkvKiByZXN0b3JlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KIAl3cml0ZWIob2xkX2NyMiwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjIpOwogCisJLyoKKwkgKiBJZiBuZXcgYmF1ZCByYXRlIGlzIHNldCwgd2Ugd2lsbCBhbHNvIG5lZWQgdG8gdXBkYXRlIHRoZSBSaW5nIGJ1ZmZlcgorCSAqIGxlbmd0aCBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIGJhdWQgcmF0ZSBhbmQgcmVzdGFydCBSeCBETUEgcGF0aC4KKwkgKi8KKwlpZiAob2xkKSB7CisJCWlmIChzcG9ydC0+bHB1YXJ0X2RtYV9yeF91c2UpIHsKKwkJCWRlbF90aW1lcl9zeW5jKCZzcG9ydC0+bHB1YXJ0X3RpbWVyKTsKKwkJCWxwdWFydF9kbWFfcnhfZnJlZSgmc3BvcnQtPnBvcnQpOworCQl9CisKKwkJaWYgKHNwb3J0LT5kbWFfcnhfY2hhbiAmJiAhbHB1YXJ0X3N0YXJ0X3J4X2RtYShzcG9ydCkpIHsKKwkJCXNwb3J0LT5scHVhcnRfZG1hX3J4X3VzZSA9IHRydWU7CisJCQlyeF9kbWFfdGltZXJfaW5pdChzcG9ydCk7CisJCX0gZWxzZSB7CisJCQlzcG9ydC0+bHB1YXJ0X2RtYV9yeF91c2UgPSBmYWxzZTsKKwkJfQorCX0KKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtMTQ5NCw3ICsxNTc5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIGxwdWFydF9wb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBscHVhcnRfcG9wcyA9IHsKIAkudHhfZW1wdHkJPSBscHVhcnRfdHhfZW1wdHksCiAJLnNldF9tY3RybAk9IGxwdWFydF9zZXRfbWN0cmwsCiAJLmdldF9tY3RybAk9IGxwdWFydF9nZXRfbWN0cmwsCkBAIC0xNTEzLDcgKzE1OTgsNyBAQAogCS5mbHVzaF9idWZmZXIJPSBscHVhcnRfZmx1c2hfYnVmZmVyLAogfTsKIAotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBscHVhcnQzMl9wb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBscHVhcnQzMl9wb3BzID0gewogCS50eF9lbXB0eQk9IGxwdWFydDMyX3R4X2VtcHR5LAogCS5zZXRfbWN0cmwJPSBscHVhcnQzMl9zZXRfbWN0cmwsCiAJLmdldF9tY3RybAk9IGxwdWFydDMyX2dldF9tY3RybCwKQEAgLTE4NDMsNiArMTkyOCw4IEBACiAJCXNwb3J0LT5wb3J0Lm9wcyA9ICZscHVhcnRfcG9wczsKIAlzcG9ydC0+cG9ydC5mbGFncyA9IFVQRl9CT09UX0FVVE9DT05GOwogCisJc3BvcnQtPnBvcnQucnM0ODVfY29uZmlnID0gbHB1YXJ0X2NvbmZpZ19yczQ4NTsKKwogCXNwb3J0LT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImlwZyIpOwogCWlmIChJU19FUlIoc3BvcnQtPmNsaykpIHsKIAkJcmV0ID0gUFRSX0VSUihzcG9ydC0+Y2xrKTsKQEAgLTE4ODMsNiArMTk3MCwxMiBAQAogCQlkZXZfaW5mbyhzcG9ydC0+cG9ydC5kZXYsICJETUEgcnggY2hhbm5lbCByZXF1ZXN0IGZhaWxlZCwgIgogCQkJCSJvcGVyYXRpbmcgd2l0aG91dCByeCBETUFcbiIpOwogCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImxpbnV4LHJzNDg1LWVuYWJsZWQtYXQtYm9vdC10aW1lIikpIHsKKwkJc3BvcnQtPnBvcnQucnM0ODUuZmxhZ3MgfD0gU0VSX1JTNDg1X0VOQUJMRUQ7CisJCXNwb3J0LT5wb3J0LnJzNDg1LmZsYWdzIHw9IFNFUl9SUzQ4NV9SVFNfT05fU0VORDsKKwkJd3JpdGViKFVBUlRNT0RFTV9UWFJUU0UsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUTU9ERU0pOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xOTIzLDYgKzIwMTYsMzIgQEAKIAogCXVhcnRfc3VzcGVuZF9wb3J0KCZscHVhcnRfcmVnLCAmc3BvcnQtPnBvcnQpOwogCisJaWYgKHNwb3J0LT5scHVhcnRfZG1hX3J4X3VzZSkgeworCQkvKgorCQkgKiBFRE1BIGRyaXZlciBkdXJpbmcgc3VzcGVuZCB3aWxsIGZvcmNlZnVsbHkgcmVsZWFzZSBhbnkKKwkJICogbm9uLWlkbGUgRE1BIGNoYW5uZWxzLiBJZiBwb3J0IHdha2V1cCBpcyBlbmFibGVkIG9yIGlmIHBvcnQKKwkJICogaXMgY29uc29sZSBwb3J0IG9yICdub19jb25zb2xlX3N1c3BlbmQnIGlzIHNldCB0aGUgUnggRE1BCisJCSAqIGNhbm5vdCByZXN1bWUgYXMgYXMgZXhwZWN0ZWQsIGhlbmNlIGdyYWNlZnVsbHkgcmVsZWFzZSB0aGUKKwkJICogUnggRE1BIHBhdGggYmVmb3JlIHN1c3BlbmQgYW5kIHN0YXJ0IFJ4IERNQSBwYXRoIG9uIHJlc3VtZS4KKwkJICovCisJCWlmIChzcG9ydC0+cG9ydC5pcnFfd2FrZSkgeworCQkJZGVsX3RpbWVyX3N5bmMoJnNwb3J0LT5scHVhcnRfdGltZXIpOworCQkJbHB1YXJ0X2RtYV9yeF9mcmVlKCZzcG9ydC0+cG9ydCk7CisJCX0KKworCQkvKiBEaXNhYmxlIFJ4IERNQSB0byB1c2UgVUFSVCBwb3J0IGFzIHdha2V1cCBzb3VyY2UgKi8KKwkJd3JpdGViKHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KSAmIH5VQVJUQ1I1X1JETUFTLAorCQkJCQlzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7CisJfQorCisJaWYgKHNwb3J0LT5scHVhcnRfZG1hX3R4X3VzZSkgeworCQlzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzID0gZmFsc2U7CisJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHNwb3J0LT5kbWFfdHhfY2hhbik7CisJfQorCisJaWYgKHNwb3J0LT5wb3J0LnN1c3BlbmRlZCAmJiAhc3BvcnQtPnBvcnQuaXJxX3dha2UpCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShzcG9ydC0+Y2xrKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xOTMxLDYgKzIwNTAsOSBAQAogCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAl1bnNpZ25lZCBsb25nIHRlbXA7CiAKKwlpZiAoc3BvcnQtPnBvcnQuc3VzcGVuZGVkICYmICFzcG9ydC0+cG9ydC5pcnFfd2FrZSkKKwkJY2xrX3ByZXBhcmVfZW5hYmxlKHNwb3J0LT5jbGspOworCiAJaWYgKHNwb3J0LT5scHVhcnQzMikgewogCQlscHVhcnQzMl9zZXR1cF93YXRlcm1hcmsoc3BvcnQpOwogCQl0ZW1wID0gbHB1YXJ0MzJfcmVhZChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENUUkwpOwpAQCAtMTk0NCw2ICsyMDY2LDI2IEBACiAJCXdyaXRlYih0ZW1wLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSMik7CiAJfQogCisJaWYgKHNwb3J0LT5scHVhcnRfZG1hX3J4X3VzZSkgeworCQlpZiAoc3BvcnQtPnBvcnQuaXJxX3dha2UpIHsKKwkJCWlmICghbHB1YXJ0X3N0YXJ0X3J4X2RtYShzcG9ydCkpIHsKKwkJCQlzcG9ydC0+bHB1YXJ0X2RtYV9yeF91c2UgPSB0cnVlOworCQkJCXJ4X2RtYV90aW1lcl9pbml0KHNwb3J0KTsKKwkJCX0gZWxzZSB7CisJCQkJc3BvcnQtPmxwdWFydF9kbWFfcnhfdXNlID0gZmFsc2U7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoc3BvcnQtPmRtYV90eF9jaGFuICYmICFscHVhcnRfZG1hX3R4X3JlcXVlc3QoJnNwb3J0LT5wb3J0KSkgeworCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmc3BvcnQtPmRtYV93YWl0KTsKKwkJCXNwb3J0LT5scHVhcnRfZG1hX3R4X3VzZSA9IHRydWU7CisJCQl3cml0ZWIocmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpIHwKKwkJCQlVQVJUQ1I1X1RETUFTLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7CisJfSBlbHNlIHsKKwkJc3BvcnQtPmxwdWFydF9kbWFfdHhfdXNlID0gZmFsc2U7CisJfQorCiAJdWFydF9yZXN1bWVfcG9ydCgmbHB1YXJ0X3JlZywgJnNwb3J0LT5wb3J0KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jCmluZGV4IDBkZjJiMWMuLmE3MDM1NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9pbXguYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvaW14LmMKQEAgLTE5MCw2ICsxOTAsNyBAQAogZW51bSBpbXhfdWFydF90eXBlIHsKIAlJTVgxX1VBUlQsCiAJSU1YMjFfVUFSVCwKKwlJTVg1M19VQVJULAogCUlNWDZRX1VBUlQsCiB9OwogCkBAIC0yMjIsNiArMjIzLDkgQEAKIAlzdHJ1Y3QgZG1hX2NoYW4JCSpkbWFfY2hhbl9yeCwgKmRtYV9jaGFuX3R4OwogCXN0cnVjdCBzY2F0dGVybGlzdAlyeF9zZ2wsIHR4X3NnbFsyXTsKIAl2b2lkCQkJKnJ4X2J1ZjsKKwlzdHJ1Y3QgY2lyY19idWYJCXJ4X3Jpbmc7CisJdW5zaWduZWQgaW50CQlyeF9wZXJpb2RzOworCWRtYV9jb29raWVfdAkJcnhfY29va2llOwogCXVuc2lnbmVkIGludAkJdHhfYnl0ZXM7CiAJdW5zaWduZWQgaW50CQlkbWFfdHhfbmVudHM7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJZG1hX3dhaXQ7CkBAIC0yNDQsNiArMjQ4LDEwIEBACiAJCS51dHNfcmVnID0gSU1YMjFfVVRTLAogCQkuZGV2dHlwZSA9IElNWDIxX1VBUlQsCiAJfSwKKwlbSU1YNTNfVUFSVF0gPSB7CisJCS51dHNfcmVnID0gSU1YMjFfVVRTLAorCQkuZGV2dHlwZSA9IElNWDUzX1VBUlQsCisJfSwKIAlbSU1YNlFfVUFSVF0gPSB7CiAJCS51dHNfcmVnID0gSU1YMjFfVVRTLAogCQkuZGV2dHlwZSA9IElNWDZRX1VBUlQsCkBAIC0yNTgsNiArMjY2LDkgQEAKIAkJLm5hbWUgPSAiaW14MjEtdWFydCIsCiAJCS5kcml2ZXJfZGF0YSA9IChrZXJuZWxfdWxvbmdfdCkgJmlteF91YXJ0X2RldmRhdGFbSU1YMjFfVUFSVF0sCiAJfSwgeworCQkubmFtZSA9ICJpbXg1My11YXJ0IiwKKwkJLmRyaXZlcl9kYXRhID0gKGtlcm5lbF91bG9uZ190KSAmaW14X3VhcnRfZGV2ZGF0YVtJTVg1M19VQVJUXSwKKwl9LCB7CiAJCS5uYW1lID0gImlteDZxLXVhcnQiLAogCQkuZHJpdmVyX2RhdGEgPSAoa2VybmVsX3Vsb25nX3QpICZpbXhfdWFydF9kZXZkYXRhW0lNWDZRX1VBUlRdLAogCX0sIHsKQEAgLTI2OCw2ICsyNzksNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBpbXhfdWFydF9kdF9pZHNbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2cS11YXJ0IiwgLmRhdGEgPSAmaW14X3VhcnRfZGV2ZGF0YVtJTVg2UV9VQVJUXSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg1My11YXJ0IiwgLmRhdGEgPSAmaW14X3VhcnRfZGV2ZGF0YVtJTVg1M19VQVJUXSwgfSwKIAl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgxLXVhcnQiLCAuZGF0YSA9ICZpbXhfdWFydF9kZXZkYXRhW0lNWDFfVUFSVF0sIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14MjEtdWFydCIsIC5kYXRhID0gJmlteF91YXJ0X2RldmRhdGFbSU1YMjFfVUFSVF0sIH0sCiAJeyAvKiBzZW50aW5lbCAqLyB9CkBAIC0yODksNiArMzAxLDExIEBACiAJcmV0dXJuIHNwb3J0LT5kZXZkYXRhLT5kZXZ0eXBlID09IElNWDIxX1VBUlQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2lteDUzX3VhcnQoc3RydWN0IGlteF9wb3J0ICpzcG9ydCkKK3sKKwlyZXR1cm4gc3BvcnQtPmRldmRhdGEtPmRldnR5cGUgPT0gSU1YNTNfVUFSVDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgaXNfaW14NnFfdWFydChzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0KQogewogCXJldHVybiBzcG9ydC0+ZGV2ZGF0YS0+ZGV2dHlwZSA9PSBJTVg2UV9VQVJUOwpAQCAtNzAxLDYgKzcxOCw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgdm9pZCBjbGVhcl9yeF9lcnJvcnMoc3RydWN0IGlteF9wb3J0ICpzcG9ydCk7CiBzdGF0aWMgaW50IHN0YXJ0X3J4X2RtYShzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0KTsKIC8qCiAgKiBJZiB0aGUgUlhGSUZPIGlzIGZpbGxlZCB3aXRoIHNvbWUgZGF0YSwgYW5kIHRoZW4gd2UKQEAgLTcyNiw2ICs3NDQsMTEgQEAKIAkJdGVtcCAmPSB+KFVDUjJfQVRFTik7CiAJCXdyaXRlbCh0ZW1wLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMik7CiAKKwkJLyogZGlzYWJsZSB0aGUgcnggZXJyb3JzIGludGVycnVwdHMgKi8KKwkJdGVtcCA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1I0KTsKKwkJdGVtcCAmPSB+VUNSNF9PUkVOOworCQl3cml0ZWwodGVtcCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjQpOworCiAJCS8qIHRlbGwgdGhlIERNQSB0byByZWNlaXZlIHRoZSBkYXRhLiAqLwogCQlzdGFydF9yeF9kbWEoc3BvcnQpOwogCX0KQEAgLTc0MCwxMiArNzYzLDEzIEBACiB7CiAJdW5zaWduZWQgaW50IHRtcCA9IFRJT0NNX0RTUjsKIAl1bnNpZ25lZCB1c3IxID0gcmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVTUjEpOworCXVuc2lnbmVkIHVzcjIgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVVNSMik7CiAKIAlpZiAodXNyMSAmIFVTUjFfUlRTUykKIAkJdG1wIHw9IFRJT0NNX0NUUzsKIAogCS8qIGluIERDRSBtb2RlIERDRElOIGlzIGFsd2F5cyAwICovCi0JaWYgKCEodXNyMSAmIFVTUjJfRENESU4pKQorCWlmICghKHVzcjIgJiBVU1IyX0RDRElOKSkKIAkJdG1wIHw9IFRJT0NNX0NBUjsKIAogCWlmIChzcG9ydC0+ZHRlX21vZGUpCkBAIC05MzIsMzAgKzk1Niw2IEBACiB9CiAKICNkZWZpbmUgUlhfQlVGX1NJWkUJKFBBR0VfU0laRSkKLXN0YXRpYyB2b2lkIGlteF9yeF9kbWFfZG9uZShzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0KQotewotCXVuc2lnbmVkIGxvbmcgdGVtcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLQotCS8qIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIHRvIGdldCBub3RpZmllZCB3aGVuIG5ldyBzeW1ib2xzIGFyZSBpbmNvbWluZyAqLwotCXRlbXAgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMSk7Ci0JdGVtcCB8PSBVQ1IxX1JSRFlFTjsKLQl3cml0ZWwodGVtcCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjEpOwotCi0JdGVtcCA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IyKTsKLQl0ZW1wIHw9IFVDUjJfQVRFTjsKLQl3cml0ZWwodGVtcCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjIpOwotCi0Jc3BvcnQtPmRtYV9pc19yeGluZyA9IDA7Ci0KLQkvKiBJcyB0aGUgc2h1dGRvd24gd2FpdGluZyBmb3IgdXM/ICovCi0JaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnNwb3J0LT5kbWFfd2FpdCkpCi0JCXdha2VfdXAoJnNwb3J0LT5kbWFfd2FpdCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7Ci19CiAKIC8qCiAgKiBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIFJYIERNQSBpbnRlcnJ1cHRzKHN1Y2ggYXMgaW4gdGhlIE1YNlEpOgpAQCAtOTcyLDQzICs5NzIsNzYgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCA9ICZzcG9ydC0+cnhfc2dsOwogCXN0cnVjdCB0dHlfcG9ydCAqcG9ydCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+cG9ydDsKIAlzdHJ1Y3QgZG1hX3R4X3N0YXRlIHN0YXRlOworCXN0cnVjdCBjaXJjX2J1ZiAqcnhfcmluZyA9ICZzcG9ydC0+cnhfcmluZzsKIAllbnVtIGRtYV9zdGF0dXMgc3RhdHVzOwotCXVuc2lnbmVkIGludCBjb3VudDsKLQotCS8qIHVubWFwIGl0IGZpcnN0ICovCi0JZG1hX3VubWFwX3NnKHNwb3J0LT5wb3J0LmRldiwgc2dsLCAxLCBETUFfRlJPTV9ERVZJQ0UpOworCXVuc2lnbmVkIGludCB3X2J5dGVzID0gMDsKKwl1bnNpZ25lZCBpbnQgcl9ieXRlczsKKwl1bnNpZ25lZCBpbnQgYmRfc2l6ZTsKIAogCXN0YXR1cyA9IGRtYWVuZ2luZV90eF9zdGF0dXMoY2hhbiwgKGRtYV9jb29raWVfdCkwLCAmc3RhdGUpOwotCWNvdW50ID0gUlhfQlVGX1NJWkUgLSBzdGF0ZS5yZXNpZHVlOwogCi0JZGV2X2RiZyhzcG9ydC0+cG9ydC5kZXYsICJXZSBnZXQgJWQgYnl0ZXMuXG4iLCBjb3VudCk7Ci0KLQlpZiAoY291bnQpIHsKLQkJaWYgKCEoc3BvcnQtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrICYgVVJYRF9EVU1NWV9SRUFEKSkgewotCQkJaW50IGJ5dGVzID0gdHR5X2luc2VydF9mbGlwX3N0cmluZyhwb3J0LCBzcG9ydC0+cnhfYnVmLAotCQkJCQljb3VudCk7Ci0KLQkJCWlmIChieXRlcyAhPSBjb3VudCkKLQkJCQlzcG9ydC0+cG9ydC5pY291bnQuYnVmX292ZXJydW4rKzsKLQkJfQotCQl0dHlfZmxpcF9idWZmZXJfcHVzaChwb3J0KTsKLQkJc3BvcnQtPnBvcnQuaWNvdW50LnJ4ICs9IGNvdW50OworCWlmIChzdGF0dXMgPT0gRE1BX0VSUk9SKSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiRE1BIHRyYW5zYWN0aW9uIGVycm9yLlxuIik7CisJCWNsZWFyX3J4X2Vycm9ycyhzcG9ydCk7CisJCXJldHVybjsKIAl9CiAKLQkvKgotCSAqIFJlc3RhcnQgUlggRE1BIGRpcmVjdGx5IGlmIG1vcmUgZGF0YSBpcyBhdmFpbGFibGUgaW4gb3JkZXIgdG8gc2tpcAotCSAqIHRoZSByb3VuZHRyaXAgdGhyb3VnaCB0aGUgSVJRIGhhbmRsZXIuIElmIHRoZXJlIGlzIHNvbWUgZGF0YSBhbHJlYWR5Ci0JICogaW4gdGhlIEZJRk8sIERNQSBuZWVkcyB0byBiZSByZXN0YXJ0ZWQgc29vbiBhbnl3YXlzLgotCSAqCi0JICogT3RoZXJ3aXNlIHN0b3AgdGhlIERNQSBhbmQgcmVhY3RpdmF0ZSBGSUZPIElSUXMgdG8gcmVzdGFydCBETUEgb25jZQotCSAqIGRhdGEgc3RhcnRzIHRvIGFycml2ZSBhZ2Fpbi4KLQkgKi8KLQlpZiAocmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVTUjIpICYgVVNSMl9SRFIpCi0JCXN0YXJ0X3J4X2RtYShzcG9ydCk7Ci0JZWxzZQotCQlpbXhfcnhfZG1hX2RvbmUoc3BvcnQpOworCWlmICghKHNwb3J0LT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzayAmIFVSWERfRFVNTVlfUkVBRCkpIHsKKworCQkvKgorCQkgKiBUaGUgc3RhdGUtcmVzaWR1ZSB2YXJpYWJsZSByZXByZXNlbnRzIHRoZSBlbXB0eSBzcGFjZQorCQkgKiByZWxhdGl2ZSB0byB0aGUgZW50aXJlIGJ1ZmZlci4gVGFraW5nIHRoaXMgaW4gY29uc2lkZXJhdGlvbgorCQkgKiB0aGUgaGVhZCBpcyBhbHdheXMgY2FsY3VsYXRlZCBiYXNlIG9uIHRoZSBidWZmZXIgdG90YWwKKwkJICogbGVuZ3RoIC0gRE1BIHRyYW5zYWN0aW9uIHJlc2lkdWUuIFRoZSBVQVJUIHNjcmlwdCBmcm9tIHRoZQorCQkgKiBTRE1BIGZpcm13YXJlIHdpbGwganVtcCB0byB0aGUgbmV4dCBidWZmZXIgZGVzY3JpcHRvciwKKwkJICogb25jZSBhIERNQSB0cmFuc2FjdGlvbiBpZiBmaW5hbGl6ZWQgKElNWDUzIFJNIC0gQS40LjEuMi40KS4KKwkJICogVGFraW5nIHRoaXMgaW4gY29uc2lkZXJhdGlvbiB0aGUgdGFpbCBpcyBhbHdheXMgYXQgdGhlCisJCSAqIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGRlc2NyaXB0b3IgdGhhdCBjb250YWlucyB0aGUgaGVhZC4KKwkJICovCisKKwkJLyogQ2FsY3VsYXRlIHRoZSBoZWFkICovCisJCXJ4X3JpbmctPmhlYWQgPSBzZ19kbWFfbGVuKHNnbCkgLSBzdGF0ZS5yZXNpZHVlOworCisJCS8qIENhbGN1bGF0ZSB0aGUgdGFpbC4gKi8KKwkJYmRfc2l6ZSA9IHNnX2RtYV9sZW4oc2dsKSAvIHNwb3J0LT5yeF9wZXJpb2RzOworCQlyeF9yaW5nLT50YWlsID0gKChyeF9yaW5nLT5oZWFkLTEpIC8gYmRfc2l6ZSkgKiBiZF9zaXplOworCisJCWlmIChyeF9yaW5nLT5oZWFkIDw9IHNnX2RtYV9sZW4oc2dsKSAmJgorCQkgICAgcnhfcmluZy0+aGVhZCA+IHJ4X3JpbmctPnRhaWwpIHsKKworCQkJLyogTW92ZSBkYXRhIGZyb20gdGFpbCB0byBoZWFkICovCisJCQlyX2J5dGVzID0gcnhfcmluZy0+aGVhZCAtIHJ4X3JpbmctPnRhaWw7CisKKwkJCS8qIENQVSBjbGFpbXMgb3duZXJzaGlwIG9mIFJYIERNQSBidWZmZXIgKi8KKwkJCWRtYV9zeW5jX3NnX2Zvcl9jcHUoc3BvcnQtPnBvcnQuZGV2LCBzZ2wsIDEsCisJCQkJRE1BX0ZST01fREVWSUNFKTsKKworCQkJd19ieXRlcyA9IHR0eV9pbnNlcnRfZmxpcF9zdHJpbmcocG9ydCwKKwkJCQlzcG9ydC0+cnhfYnVmICsgcnhfcmluZy0+dGFpbCwgcl9ieXRlcyk7CisKKwkJCS8qIFVBUlQgcmV0cmlldmVzIG93bmVyc2hpcCBvZiBSWCBETUEgYnVmZmVyICovCisJCQlkbWFfc3luY19zZ19mb3JfZGV2aWNlKHNwb3J0LT5wb3J0LmRldiwgc2dsLCAxLAorCQkJCURNQV9GUk9NX0RFVklDRSk7CisKKwkJCWlmICh3X2J5dGVzICE9IHJfYnl0ZXMpCisJCQkJc3BvcnQtPnBvcnQuaWNvdW50LmJ1Zl9vdmVycnVuKys7CisKKwkJCXNwb3J0LT5wb3J0Lmljb3VudC5yeCArPSB3X2J5dGVzOworCQl9IGVsc2UJeworCQkJV0FSTl9PTihyeF9yaW5nLT5oZWFkID4gc2dfZG1hX2xlbihzZ2wpKTsKKwkJCVdBUk5fT04ocnhfcmluZy0+aGVhZCA8PSByeF9yaW5nLT50YWlsKTsKKwkJfQorCX0KKworCWlmICh3X2J5dGVzKSB7CisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHBvcnQpOworCQlkZXZfZGJnKHNwb3J0LT5wb3J0LmRldiwgIldlIGdldCAlZCBieXRlcy5cbiIsIHdfYnl0ZXMpOworCX0KIH0KIAorLyogUlggRE1BIGJ1ZmZlciBwZXJpb2RzICovCisjZGVmaW5lIFJYX0RNQV9QRVJJT0RTIDQKKwogc3RhdGljIGludCBzdGFydF9yeF9kbWEoc3RydWN0IGlteF9wb3J0ICpzcG9ydCkKIHsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCA9ICZzcG9ydC0+cnhfc2dsOwpAQCAtMTAxNywxNCArMTA1MCwyMSBAQAogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYzsKIAlpbnQgcmV0OwogCisJc3BvcnQtPnJ4X3JpbmcuaGVhZCA9IDA7CisJc3BvcnQtPnJ4X3JpbmcudGFpbCA9IDA7CisJc3BvcnQtPnJ4X3BlcmlvZHMgPSBSWF9ETUFfUEVSSU9EUzsKKwogCXNnX2luaXRfb25lKHNnbCwgc3BvcnQtPnJ4X2J1ZiwgUlhfQlVGX1NJWkUpOwogCXJldCA9IGRtYV9tYXBfc2coZGV2LCBzZ2wsIDEsIERNQV9GUk9NX0RFVklDRSk7CiAJaWYgKHJldCA9PSAwKSB7CiAJCWRldl9lcnIoZGV2LCAiRE1BIG1hcHBpbmcgZXJyb3IgZm9yIFJYLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlkZXNjID0gZG1hZW5naW5lX3ByZXBfc2xhdmVfc2coY2hhbiwgc2dsLCAxLCBETUFfREVWX1RPX01FTSwKLQkJCQkJRE1BX1BSRVBfSU5URVJSVVBUKTsKKworCWRlc2MgPSBkbWFlbmdpbmVfcHJlcF9kbWFfY3ljbGljKGNoYW4sIHNnX2RtYV9hZGRyZXNzKHNnbCksCisJCXNnX2RtYV9sZW4oc2dsKSwgc2dfZG1hX2xlbihzZ2wpIC8gc3BvcnQtPnJ4X3BlcmlvZHMsCisJCURNQV9ERVZfVE9fTUVNLCBETUFfUFJFUF9JTlRFUlJVUFQpOworCiAJaWYgKCFkZXNjKSB7CiAJCWRtYV91bm1hcF9zZyhkZXYsIHNnbCwgMSwgRE1BX0ZST01fREVWSUNFKTsKIAkJZGV2X2VycihkZXYsICJXZSBjYW5ub3QgcHJlcGFyZSBmb3IgdGhlIFJYIHNsYXZlIGRtYSFcbiIpOwpAQCAtMTAzNCwxMSArMTA3NCwzNiBAQAogCWRlc2MtPmNhbGxiYWNrX3BhcmFtID0gc3BvcnQ7CiAKIAlkZXZfZGJnKGRldiwgIlJYOiBwcmVwYXJlIGZvciB0aGUgRE1BLlxuIik7Ci0JZG1hZW5naW5lX3N1Ym1pdChkZXNjKTsKKwlzcG9ydC0+cnhfY29va2llID0gZG1hZW5naW5lX3N1Ym1pdChkZXNjKTsKIAlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhjaGFuKTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgY2xlYXJfcnhfZXJyb3JzKHN0cnVjdCBpbXhfcG9ydCAqc3BvcnQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1c191c3IxLCBzdGF0dXNfdXNyMjsKKworCXN0YXR1c191c3IxID0gcmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVTUjEpOworCXN0YXR1c191c3IyID0gcmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVTUjIpOworCisJaWYgKHN0YXR1c191c3IyICYgVVNSMl9CUkNEKSB7CisJCXNwb3J0LT5wb3J0Lmljb3VudC5icmsrKzsKKwkJd3JpdGVsKFVTUjJfQlJDRCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVTUjIpOworCX0gZWxzZSBpZiAoc3RhdHVzX3VzcjEgJiBVU1IxX0ZSQU1FUlIpIHsKKwkJc3BvcnQtPnBvcnQuaWNvdW50LmZyYW1lKys7CisJCXdyaXRlbChVU1IxX0ZSQU1FUlIsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVU1IxKTsKKwl9IGVsc2UgaWYgKHN0YXR1c191c3IxICYgVVNSMV9QQVJJVFlFUlIpIHsKKwkJc3BvcnQtPnBvcnQuaWNvdW50LnBhcml0eSsrOworCQl3cml0ZWwoVVNSMV9QQVJJVFlFUlIsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVU1IxKTsKKwl9CisKKwlpZiAoc3RhdHVzX3VzcjIgJiBVU1IyX09SRSkgeworCQlzcG9ydC0+cG9ydC5pY291bnQub3ZlcnJ1bisrOworCQl3cml0ZWwoVVNSMl9PUkUsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVU1IyKTsKKwl9CisKK30KKwogI2RlZmluZSBUWFRMX0RFRkFVTFQgMiAvKiByZXNldCBkZWZhdWx0ICovCiAjZGVmaW5lIFJYVExfREVGQVVMVCAxIC8qIHJlc2V0IGRlZmF1bHQgKi8KICNkZWZpbmUgVFhUTF9ETUEgOCAvKiBETUEgYnVyc3Qgc2V0dGluZyAqLwpAQCAtMTA1OCwxNCArMTEyMywxNiBAQAogc3RhdGljIHZvaWQgaW14X3VhcnRfZG1hX2V4aXQoc3RydWN0IGlteF9wb3J0ICpzcG9ydCkKIHsKIAlpZiAoc3BvcnQtPmRtYV9jaGFuX3J4KSB7CisJCWRtYWVuZ2luZV90ZXJtaW5hdGVfc3luYyhzcG9ydC0+ZG1hX2NoYW5fcngpOwogCQlkbWFfcmVsZWFzZV9jaGFubmVsKHNwb3J0LT5kbWFfY2hhbl9yeCk7CiAJCXNwb3J0LT5kbWFfY2hhbl9yeCA9IE5VTEw7Ci0KKwkJc3BvcnQtPnJ4X2Nvb2tpZSA9IC1FSU5WQUw7CiAJCWtmcmVlKHNwb3J0LT5yeF9idWYpOwogCQlzcG9ydC0+cnhfYnVmID0gTlVMTDsKIAl9CiAKIAlpZiAoc3BvcnQtPmRtYV9jaGFuX3R4KSB7CisJCWRtYWVuZ2luZV90ZXJtaW5hdGVfc3luYyhzcG9ydC0+ZG1hX2NoYW5fdHgpOwogCQlkbWFfcmVsZWFzZV9jaGFubmVsKHNwb3J0LT5kbWFfY2hhbl90eCk7CiAJCXNwb3J0LT5kbWFfY2hhbl90eCA9IE5VTEw7CiAJfQpAQCAtMTEwMyw2ICsxMTcwLDcgQEAKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnI7CiAJfQorCXNwb3J0LT5yeF9yaW5nLmJ1ZiA9IHNwb3J0LT5yeF9idWY7CiAKIAkvKiBQcmVwYXJlIGZvciBUWCA6ICovCiAJc3BvcnQtPmRtYV9jaGFuX3R4ID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hhbm5lbChkZXYsICJ0eCIpOwpAQCAtMTIwMSw4ICsxMjY5LDcgQEAKIAl3cml0ZWwodGVtcCAmIH5VQ1I0X0RSRU4sIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1I0KTsKIAogCS8qIENhbiB3ZSBlbmFibGUgdGhlIERNQSBzdXBwb3J0PyAqLwotCWlmIChpc19pbXg2cV91YXJ0KHNwb3J0KSAmJiAhdWFydF9jb25zb2xlKHBvcnQpICYmCi0JICAgICFzcG9ydC0+ZG1hX2lzX2luaXRlZCkKKwlpZiAoIXVhcnRfY29uc29sZShwb3J0KSAmJiAhc3BvcnQtPmRtYV9pc19pbml0ZWQpCiAJCWlteF91YXJ0X2RtYV9pbml0KHNwb3J0KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CkBAIC0xMjgzLDE3ICsxMzUwLDExIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChzcG9ydC0+ZG1hX2lzX2VuYWJsZWQpIHsKLQkJaW50IHJldDsKKwkJc3BvcnQtPmRtYV9pc19yeGluZyA9IDA7CisJCXNwb3J0LT5kbWFfaXNfdHhpbmcgPSAwOworCQlkbWFlbmdpbmVfdGVybWluYXRlX3N5bmMoc3BvcnQtPmRtYV9jaGFuX3R4KTsKKwkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9zeW5jKHNwb3J0LT5kbWFfY2hhbl9yeCk7CiAKLQkJLyogV2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgRE1BIHRvIGZpbmlzaC4gKi8KLQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNwb3J0LT5kbWFfd2FpdCwKLQkJCSFzcG9ydC0+ZG1hX2lzX3J4aW5nICYmICFzcG9ydC0+ZG1hX2lzX3R4aW5nKTsKLQkJaWYgKHJldCAhPSAwKSB7Ci0JCQlzcG9ydC0+ZG1hX2lzX3J4aW5nID0gMDsKLQkJCXNwb3J0LT5kbWFfaXNfdHhpbmcgPSAwOwotCQkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc3BvcnQtPmRtYV9jaGFuX3R4KTsKLQkJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHNwb3J0LT5kbWFfY2hhbl9yeCk7Ci0JCX0KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKIAkJaW14X3N0b3BfdHgocG9ydCk7CiAJCWlteF9zdG9wX3J4KHBvcnQpOwpAQCAtMTY5MCw3ICsxNzUxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBpbXhfcG9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgaW14X3BvcHMgPSB7CiAJLnR4X2VtcHR5CT0gaW14X3R4X2VtcHR5LAogCS5zZXRfbWN0cmwJPSBpbXhfc2V0X21jdHJsLAogCS5nZXRfbWN0cmwJPSBpbXhfZ2V0X21jdHJsLApAQCAtMjA3Nyw4ICsyMTM4LDEwIEBACiAKIAkvKiBGb3IgcmVnaXN0ZXIgYWNjZXNzLCB3ZSBvbmx5IG5lZWQgdG8gZW5hYmxlIHRoZSBpcGcgY2xvY2suICovCiAJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHNwb3J0LT5jbGtfaXBnKTsKLQlpZiAocmV0KQorCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBwZXIgY2xrOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKKwl9CiAKIAkvKiBEaXNhYmxlIGludGVycnVwdHMgYmVmb3JlIHJlcXVlc3RpbmcgdGhlbSAqLwogCXJlZyA9IHJlYWRsX3JlbGF4ZWQoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjEpOwpAQCAtMjA5NSwxOCArMjE1OCwyNiBAQAogCWlmICh0eGlycSA+IDApIHsKIAkJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCByeGlycSwgaW14X3J4aW50LCAwLAogCQkJCSAgICAgICBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgc3BvcnQpOwotCQlpZiAocmV0KQorCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCByeCBpcnE6ICVkXG4iLAorCQkJCXJldCk7CiAJCQlyZXR1cm4gcmV0OworCQl9CiAKIAkJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCB0eGlycSwgaW14X3R4aW50LCAwLAogCQkJCSAgICAgICBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgc3BvcnQpOwotCQlpZiAocmV0KQorCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCB0eCBpcnE6ICVkXG4iLAorCQkJCXJldCk7CiAJCQlyZXR1cm4gcmV0OworCQl9CiAJfSBlbHNlIHsKIAkJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCByeGlycSwgaW14X2ludCwgMCwKIAkJCQkgICAgICAgZGV2X25hbWUoJnBkZXYtPmRldiksIHNwb3J0KTsKLQkJaWYgKHJldCkKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgaXJxOiAlZFxuIiwgcmV0KTsKIAkJCXJldHVybiByZXQ7CisJCX0KIAl9CiAKIAlpbXhfcG9ydHNbc3BvcnQtPnBvcnQubGluZV0gPSBzcG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9qc20vanNtX3R0eS5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2pzbS9qc21fdHR5LmMKaW5kZXggYzVkZGZlNS4uZWM3ZDgzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2pzbS9qc21fdHR5LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2pzbS9qc21fdHR5LmMKQEAgLTM0Niw3ICszNDYsNyBAQAogCXBvcnQtPnR5cGUgPSBQT1JUX0pTTTsKIH0KIAotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBqc21fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBqc21fb3BzID0gewogCS50eF9lbXB0eQk9IGpzbV90dHlfdHhfZW1wdHksCiAJLnNldF9tY3RybAk9IGpzbV90dHlfc2V0X21jdHJsLAogCS5nZXRfbWN0cmwJPSBqc21fdHR5X2dldF9tY3RybCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTAwLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEwMC5jCmluZGV4IDVjNGMyODAuLmFjZTgyNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTAwLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMDAuYwpAQCAtNzEyLDcgKzcxMiw3IEBACiAJZGV2X2RiZygmcy0+c3BpLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogfQogCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIG1heDMxMDBfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBtYXgzMTAwX29wcyA9IHsKIAkudHhfZW1wdHkJPSBtYXgzMTAwX3R4X2VtcHR5LAogCS5zZXRfbWN0cmwJPSBtYXgzMTAwX3NldF9tY3RybCwKIAkuZ2V0X21jdHJsCT0gbWF4MzEwMF9nZXRfbWN0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEweC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMHguYwppbmRleCA5MzYwODAxLi44YTNlOTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEweC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTB4LmMKQEAgLTEzMjksOSArMTMyOSw5IEBACiAJCWNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkICppZF9lbnRyeSA9IHNwaV9nZXRfZGV2aWNlX2lkKHNwaSk7CiAKIAkJZGV2dHlwZSA9IChzdHJ1Y3QgbWF4MzEweF9kZXZ0eXBlICopaWRfZW50cnktPmRyaXZlcl9kYXRhOwotCQlmbGFncyA9IElSUUZfVFJJR0dFUl9GQUxMSU5HOwogCX0KIAorCWZsYWdzID0gSVJRRl9UUklHR0VSX0ZBTExJTkc7CiAJcmVnY2ZnLm1heF9yZWdpc3RlciA9IGRldnR5cGUtPm5yICogMHgyMCAtIDE7CiAJcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9zcGkoc3BpLCAmcmVnY2ZnKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL21lbl96MTM1X3VhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tZW5fejEzNV91YXJ0LmMKaW5kZXggYTQ0MjkwZS4uZTcyZWE2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL21lbl96MTM1X3VhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbWVuX3oxMzVfdWFydC5jCkBAIC03NzUsNyArNzc1LDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBtZW5fejEzNV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIG1lbl96MTM1X29wcyA9IHsKIAkudHhfZW1wdHkgPSBtZW5fejEzNV90eF9lbXB0eSwKIAkuc2V0X21jdHJsID0gbWVuX3oxMzVfc2V0X21jdHJsLAogCS5nZXRfbWN0cmwgPSBtZW5fejEzNV9nZXRfbWN0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvbXhzLWF1YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbXhzLWF1YXJ0LmMKaW5kZXggZWI1NGU1Yy4uNzcwNDU0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL214cy1hdWFydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9teHMtYXVhcnQuYwpAQCAtMTMxNyw3ICsxMzE3LDcgQEAKIAkJbXhzX2NscihBVUFSVF9MSU5FQ1RSTF9CUkssIHMsIFJFR19MSU5FQ1RSTCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgbXhzX2F1YXJ0X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgbXhzX2F1YXJ0X29wcyA9IHsKIAkudHhfZW1wdHkgICAgICAgPSBteHNfYXVhcnRfdHhfZW1wdHksCiAJLnN0YXJ0X3R4ICAgICAgID0gbXhzX2F1YXJ0X3N0YXJ0X3R4LAogCS5zdG9wX3R4CT0gbXhzX2F1YXJ0X3N0b3BfdHgsCkBAIC0xNTEwLDEwICsxNTEwLDcgQEAKIAogCWlmICghaXNfYXNtOTI2MF9hdWFydChzKSkgewogCQlzLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7Ci0JCWlmIChJU19FUlIocy0+Y2xrKSkKLQkJCXJldHVybiBQVFJfRVJSKHMtPmNsayk7Ci0KLQkJcmV0dXJuIDA7CisJCXJldHVybiBQVFJfRVJSX09SX1pFUk8ocy0+Y2xrKTsKIAl9CiAKIAlzLT5jbGsgPSBkZXZtX2Nsa19nZXQocy0+ZGV2LCAibW9kIik7CkBAIC0xNTM3LDE2ICsxNTM0LDIwIEBACiAJZXJyID0gY2xrX3NldF9yYXRlKHMtPmNsaywgY2xrX2dldF9yYXRlKHMtPmNsa19haGIpKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIocy0+ZGV2LCAiRmFpbGVkIHRvIHNldCByYXRlIVxuIik7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gZGlzYWJsZV9jbGtfYWhiOwogCX0KIAogCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZShzLT5jbGspOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycihzLT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIGNsayFcbiIpOwotCQlyZXR1cm4gZXJyOworCQlnb3RvIGRpc2FibGVfY2xrX2FoYjsKIAl9CiAKIAlyZXR1cm4gMDsKKworZGlzYWJsZV9jbGtfYWhiOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShzLT5jbGtfYWhiKTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3BjaF91YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvcGNoX3VhcnQuYwppbmRleCBlYTRmZmMyLi5kMzkxNjUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvcGNoX3VhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvcGNoX3VhcnQuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L25taS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KQEAgLTE2MDMsNyArMTYwNCw3IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX0NPTlNPTEVfUE9MTCAqLwogCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIHBjaF91YXJ0X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgcGNoX3VhcnRfb3BzID0gewogCS50eF9lbXB0eSA9IHBjaF91YXJ0X3R4X2VtcHR5LAogCS5zZXRfbWN0cmwgPSBwY2hfdWFydF9zZXRfbWN0cmwsCiAJLmdldF9tY3RybCA9IHBjaF91YXJ0X2dldF9tY3RybCwKQEAgLTE4MjYsNiArMTgyNywxMCBAQAogCXByaXYtPnRyaWdnZXJfbGV2ZWwgPSAxOwogCXByaXYtPmZjciA9IDA7CiAKKwlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCisJCW9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAiY2xvY2stZnJlcXVlbmN5IgorCQkJCQkgLCAmdXNlcl91YXJ0Y2xrKTsKKwogI2lmZGVmIENPTkZJR19TRVJJQUxfUENIX1VBUlRfQ09OU09MRQogCXBjaF91YXJ0X3BvcnRzW2JvYXJkLT5saW5lX25vXSA9IHByaXY7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zYW1zdW5nLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5jCmluZGV4IGFlMjA5NWEuLmY0NDYxNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zYW1zdW5nLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3NhbXN1bmcuYwpAQCAtMTU3Nyw3ICsxNTc3LDcgQEAKIH0KIAogCi0jaWZkZWYgQ09ORklHX0NQVV9GUkVRCisjaWZkZWYgQ09ORklHX0FSTV9TM0MyNFhYX0NQVUZSRVEKIAogc3RhdGljIGludCBzM2MyNHh4X3NlcmlhbF9jcHVmcmVxX3RyYW5zaXRpb24oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKIAkJCQkJICAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zYW1zdW5nLmggYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5oCmluZGV4IDJhZTRmY2UuLmEwNGFjZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zYW1zdW5nLmgKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3NhbXN1bmcuaApAQCAtMTAyLDcgKzEwMiw3IEBACiAKIAlzdHJ1Y3QgczNjMjR4eF91YXJ0X2RtYQkJKmRtYTsKIAotI2lmZGVmIENPTkZJR19DUFVfRlJFUQorI2lmZGVmIENPTkZJR19BUk1fUzNDMjRYWF9DUFVGUkVRCiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrCQlmcmVxX3RyYW5zaXRpb247CiAjZW5kaWYKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2MxNmlzN3h4LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2MxNmlzN3h4LmMKaW5kZXggZjM2ZTZkZi4uYTlkOTRmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3NjMTZpczd4eC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zYzE2aXM3eHguYwpAQCAtMTIwNSw2ICsxMjA1LDEwIEBACiAJfQogI2VuZGlmCiAKKwkvKiByZXNldCBkZXZpY2UsIHB1cmdpbmcgYW55IHBlbmRpbmcgaXJxIC8gZGF0YSAqLworCXJlZ21hcF93cml0ZShzLT5yZWdtYXAsIFNDMTZJUzdYWF9JT0NPTlRST0xfUkVHIDw8IFNDMTZJUzdYWF9SRUdfU0hJRlQsCisJCQlTQzE2SVM3WFhfSU9DT05UUk9MX1NSRVNFVF9CSVQpOworCiAJZm9yIChpID0gMDsgaSA8IGRldnR5cGUtPm5yX3VhcnQ7ICsraSkgewogCQlzLT5wW2ldLmxpbmUJCT0gaTsKIAkJLyogSW5pdGlhbGl6ZSBwb3J0IGRhdGEgKi8KQEAgLTEyMzQsNiArMTIzOCwyMiBAQAogCQlpbml0X2t0aHJlYWRfd29yaygmcy0+cFtpXS5yZWdfd29yaywgc2MxNmlzN3h4X3JlZ19wcm9jKTsKIAkJLyogUmVnaXN0ZXIgcG9ydCAqLwogCQl1YXJ0X2FkZF9vbmVfcG9ydCgmc2MxNmlzN3h4X3VhcnQsICZzLT5wW2ldLnBvcnQpOworCisJCS8qIEVuYWJsZSBFRlIgKi8KKwkJc2MxNmlzN3h4X3BvcnRfd3JpdGUoJnMtPnBbaV0ucG9ydCwgU0MxNklTN1hYX0xDUl9SRUcsCisJCQkJICAgICBTQzE2SVM3WFhfTENSX0NPTkZfTU9ERV9CKTsKKworCQlyZWdjYWNoZV9jYWNoZV9ieXBhc3Mocy0+cmVnbWFwLCB0cnVlKTsKKworCQkvKiBFbmFibGUgd3JpdGUgYWNjZXNzIHRvIGVuaGFuY2VkIGZlYXR1cmVzICovCisJCXNjMTZpczd4eF9wb3J0X3dyaXRlKCZzLT5wW2ldLnBvcnQsIFNDMTZJUzdYWF9FRlJfUkVHLAorCQkJCSAgICAgU0MxNklTN1hYX0VGUl9FTkFCTEVfQklUKTsKKworCQlyZWdjYWNoZV9jYWNoZV9ieXBhc3Mocy0+cmVnbWFwLCBmYWxzZSk7CisKKwkJLyogUmVzdG9yZSBhY2Nlc3MgdG8gZ2VuZXJhbCByZWdpc3RlcnMgKi8KKwkJc2MxNmlzN3h4X3BvcnRfd3JpdGUoJnMtPnBbaV0ucG9ydCwgU0MxNklTN1hYX0xDUl9SRUcsIDB4MDApOworCiAJCS8qIEdvIHRvIHN1c3BlbmQgbW9kZSAqLwogCQlzYzE2aXM3eHhfcG93ZXIoJnMtPnBbaV0ucG9ydCwgMCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3NlcmlhbF9jb3JlLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2VyaWFsX2NvcmUuYwppbmRleCA5ZmMxNTMzLi42ZTRmNjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2VyaWFsX2NvcmUuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2VyaWFsX2NvcmUuYwpAQCAtMjM1LDE4ICsyMzUsOSBAQAogCWlmICh0dHlfcG9ydF9pbml0aWFsaXplZChwb3J0KSkKIAkJcmV0dXJuIDA7CiAKLQkvKgotCSAqIFNldCB0aGUgVFRZIElPIGVycm9yIG1hcmtlciAtIHdlIHdpbGwgb25seSBjbGVhciB0aGlzCi0JICogb25jZSB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBvcGVuZWQgdGhlIHBvcnQuCi0JICovCi0Jc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKLQogCXJldHZhbCA9IHVhcnRfcG9ydF9zdGFydHVwKHR0eSwgc3RhdGUsIGluaXRfaHcpOwotCWlmICghcmV0dmFsKSB7Ci0JCXR0eV9wb3J0X3NldF9pbml0aWFsaXplZChwb3J0LCAxKTsKLQkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwotCX0gZWxzZSBpZiAocmV0dmFsID4gMCkKLQkJcmV0dmFsID0gMDsKKwlpZiAocmV0dmFsKQorCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTk3Miw4ICs5NjMsMTEgQEAKIAkJCX0KIAkJCXVhcnRfY2hhbmdlX3NwZWVkKHR0eSwgc3RhdGUsIE5VTEwpOwogCQl9Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJcmV0dmFsID0gdWFydF9zdGFydHVwKHR0eSwgc3RhdGUsIDEpOworCQlpZiAocmV0dmFsID4gMCkKKwkJCXJldHZhbCA9IDA7CisJfQogIGV4aXQ6CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTExMzksNiArMTEzMyw4IEBACiAJCXVwb3J0LT5vcHMtPmNvbmZpZ19wb3J0KHVwb3J0LCBmbGFncyk7CiAKIAkJcmV0ID0gdWFydF9zdGFydHVwKHR0eSwgc3RhdGUsIDEpOworCQlpZiAocmV0ID4gMCkKKwkJCXJldCA9IDA7CiAJfQogb3V0OgogCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOwpAQCAtMTQ2NSw3ICsxNDYxLDYgQEAKIHsKIAlzdHJ1Y3QgdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCB0dHlfcG9ydCAqcG9ydDsKLQlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydDsKIAogCWlmICghc3RhdGUpIHsKIAkJc3RydWN0IHVhcnRfZHJpdmVyICpkcnYgPSB0dHktPmRyaXZlci0+ZHJpdmVyX3N0YXRlOwpAQCAtMTQ4MSw1NiArMTQ3NiwzNiBAQAogCXBvcnQgPSAmc3RhdGUtPnBvcnQ7CiAJcHJfZGVidWcoInVhcnRfY2xvc2UoJWQpIGNhbGxlZFxuIiwgdHR5LT5pbmRleCk7CiAKLQlpZiAodHR5X3BvcnRfY2xvc2Vfc3RhcnQocG9ydCwgdHR5LCBmaWxwKSA9PSAwKQotCQlyZXR1cm47CisJdHR5X3BvcnRfY2xvc2UodHR5LT5wb3J0LCB0dHksIGZpbHApOworfQogCi0JbXV0ZXhfbG9jaygmcG9ydC0+bXV0ZXgpOwotCXVwb3J0ID0gdWFydF9wb3J0X2NoZWNrKHN0YXRlKTsKK3N0YXRpYyB2b2lkIHVhcnRfdHR5X3BvcnRfc2h1dGRvd24oc3RydWN0IHR0eV9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB1YXJ0X3N0YXRlICpzdGF0ZSA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgdWFydF9zdGF0ZSwgcG9ydCk7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSB1YXJ0X3BvcnRfY2hlY2soc3RhdGUpOwogCiAJLyoKIAkgKiBBdCB0aGlzIHBvaW50LCB3ZSBzdG9wIGFjY2VwdGluZyBpbnB1dC4gIFRvIGRvIHRoaXMsIHdlCiAJICogZGlzYWJsZSB0aGUgcmVjZWl2ZSBsaW5lIHN0YXR1cyBpbnRlcnJ1cHRzLgogCSAqLwotCWlmICh0dHlfcG9ydF9pbml0aWFsaXplZChwb3J0KSAmJgotCSAgICAhV0FSTighdXBvcnQsICJkZXRhY2hlZCBwb3J0IHN0aWxsIGluaXRpYWxpemVkIVxuIikpIHsKLQkJc3Bpbl9sb2NrX2lycSgmdXBvcnQtPmxvY2spOwotCQl1cG9ydC0+b3BzLT5zdG9wX3J4KHVwb3J0KTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZ1cG9ydC0+bG9jayk7Ci0JCS8qCi0JCSAqIEJlZm9yZSB3ZSBkcm9wIERUUiwgbWFrZSBzdXJlIHRoZSBVQVJUIHRyYW5zbWl0dGVyCi0JCSAqIGhhcyBjb21wbGV0ZWx5IGRyYWluZWQ7IHRoaXMgaXMgZXNwZWNpYWxseQotCQkgKiBpbXBvcnRhbnQgaWYgdGhlcmUgaXMgYSB0cmFuc21pdCBGSUZPIQotCQkgKi8KLQkJdWFydF93YWl0X3VudGlsX3NlbnQodHR5LCB1cG9ydC0+dGltZW91dCk7Ci0JfQorCWlmIChXQVJOKCF1cG9ydCwgImRldGFjaGVkIHBvcnQgc3RpbGwgaW5pdGlhbGl6ZWQhXG4iKSkKKwkJcmV0dXJuOwogCi0JdWFydF9zaHV0ZG93bih0dHksIHN0YXRlKTsKLQl0dHlfcG9ydF90dHlfc2V0KHBvcnQsIE5VTEwpOworCXNwaW5fbG9ja19pcnEoJnVwb3J0LT5sb2NrKTsKKwl1cG9ydC0+b3BzLT5zdG9wX3J4KHVwb3J0KTsKKwlzcGluX3VubG9ja19pcnEoJnVwb3J0LT5sb2NrKTsKIAotCXNwaW5fbG9ja19pcnEoJnBvcnQtPmxvY2spOwotCi0JaWYgKHBvcnQtPmJsb2NrZWRfb3BlbikgewotCQlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOwotCQlpZiAocG9ydC0+Y2xvc2VfZGVsYXkpCi0JCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKHBvcnQtPmNsb3NlX2RlbGF5KSk7Ci0JCXNwaW5fbG9ja19pcnEoJnBvcnQtPmxvY2spOwotCX0gZWxzZSBpZiAodXBvcnQgJiYgIXVhcnRfY29uc29sZSh1cG9ydCkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQkJdWFydF9jaGFuZ2VfcG0oc3RhdGUsIFVBUlRfUE1fU1RBVEVfT0ZGKTsKLQkJc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0JdHR5X3BvcnRfc2V0X2FjdGl2ZShwb3J0LCAwKTsKKwl1YXJ0X3BvcnRfc2h1dGRvd24ocG9ydCk7CiAKIAkvKgotCSAqIFdha2UgdXAgYW55b25lIHRyeWluZyB0byBvcGVuIHRoaXMgcG9ydC4KKwkgKiBJdCdzIHBvc3NpYmxlIGZvciBzaHV0ZG93biB0byBiZSBjYWxsZWQgYWZ0ZXIgc3VzcGVuZCBpZiB3ZSBnZXQKKwkgKiBhIERDRCBkcm9wIChoYW5ndXApIGF0IGp1c3QgdGhlIHJpZ2h0IHRpbWUuICBDbGVhciBzdXNwZW5kZWQgYml0IHNvCisJICogd2UgZG9uJ3QgdHJ5IHRvIHJlc3VtZSBhIHBvcnQgdGhhdCBoYXMgYmVlbiBzaHV0ZG93bi4KIAkgKi8KLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPm9wZW5fd2FpdCk7CisJdHR5X3BvcnRfc2V0X3N1c3BlbmRlZChwb3J0LCAwKTsKIAotCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOworCXVhcnRfY2hhbmdlX3BtKHN0YXRlLCBVQVJUX1BNX1NUQVRFX09GRik7CiAKLQl0dHlfbGRpc2NfZmx1c2godHR5KTsKLQl0dHktPmNsb3NpbmcgPSAwOwogfQogCiBzdGF0aWMgdm9pZCB1YXJ0X3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKQEAgLTE3MTEsNTIgKzE2ODYsMzEgQEAKIAlzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiA9IHR0eS0+ZHJpdmVyLT5kcml2ZXJfc3RhdGU7CiAJaW50IHJldHZhbCwgbGluZSA9IHR0eS0+aW5kZXg7CiAJc3RydWN0IHVhcnRfc3RhdGUgKnN0YXRlID0gZHJ2LT5zdGF0ZSArIGxpbmU7Ci0Jc3RydWN0IHR0eV9wb3J0ICpwb3J0ID0gJnN0YXRlLT5wb3J0OwotCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0OwotCi0JcHJfZGVidWcoInVhcnRfb3BlbiglZCkgY2FsbGVkXG4iLCBsaW5lKTsKLQotCXNwaW5fbG9ja19pcnEoJnBvcnQtPmxvY2spOwotCSsrcG9ydC0+Y291bnQ7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQotCS8qCi0JICogV2UgdGFrZSB0aGUgc2VtYXBob3JlIGhlcmUgdG8gZ3VhcmFudGVlIHRoYXQgd2Ugd29uJ3QgYmUgcmUtZW50ZXJlZAotCSAqIHdoaWxlIGFsbG9jYXRpbmcgdGhlIHN0YXRlIHN0cnVjdHVyZSwgb3Igd2hpbGUgd2UgcmVxdWVzdCBhbnkgSVJRcwotCSAqIHRoYXQgdGhlIGRyaXZlciBtYXkgbmVlZC4gIFRoaXMgYWxzbyBoYXMgdGhlIG5pY2Ugc2lkZS1lZmZlY3QgdGhhdAotCSAqIGl0IGRlbGF5cyB0aGUgYWN0aW9uIG9mIHVhcnRfaGFuZ3VwLCBzbyB3ZSBjYW4gZ3VhcmFudGVlIHRoYXQKLQkgKiBzdGF0ZS0+cG9ydC50dHkgd2lsbCBhbHdheXMgY29udGFpbiBzb21ldGhpbmcgcmVhc29uYWJsZS4KLQkgKi8KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwb3J0LT5tdXRleCkpIHsKLQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQl1cG9ydCA9IHVhcnRfcG9ydF9jaGVjayhzdGF0ZSk7Ci0JaWYgKCF1cG9ydCB8fCB1cG9ydC0+ZmxhZ3MgJiBVUEZfREVBRCkgewotCQlyZXR2YWwgPSAtRU5YSU87Ci0JCWdvdG8gZXJyX3VubG9jazsKLQl9CiAKIAl0dHktPmRyaXZlcl9kYXRhID0gc3RhdGU7Ci0JdXBvcnQtPnN0YXRlID0gc3RhdGU7CisKKwlyZXR2YWwgPSB0dHlfcG9ydF9vcGVuKCZzdGF0ZS0+cG9ydCwgdHR5LCBmaWxwKTsKKwlpZiAocmV0dmFsID4gMCkKKwkJcmV0dmFsID0gMDsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgdWFydF9wb3J0X2FjdGl2YXRlKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdWFydF9zdGF0ZSAqc3RhdGUgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IHVhcnRfc3RhdGUsIHBvcnQpOworCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0OworCisJdXBvcnQgPSB1YXJ0X3BvcnRfY2hlY2soc3RhdGUpOworCWlmICghdXBvcnQgfHwgdXBvcnQtPmZsYWdzICYgVVBGX0RFQUQpCisJCXJldHVybiAtRU5YSU87CisKIAlwb3J0LT5sb3dfbGF0ZW5jeSA9ICh1cG9ydC0+ZmxhZ3MgJiBVUEZfTE9XX0xBVEVOQ1kpID8gMSA6IDA7Ci0JdHR5X3BvcnRfdHR5X3NldChwb3J0LCB0dHkpOwogCiAJLyoKIAkgKiBTdGFydCB1cCB0aGUgc2VyaWFsIHBvcnQuCiAJICovCi0JcmV0dmFsID0gdWFydF9zdGFydHVwKHR0eSwgc3RhdGUsIDApOwotCi0JLyoKLQkgKiBJZiB3ZSBzdWNjZWVkZWQsIHdhaXQgdW50aWwgdGhlIHBvcnQgaXMgcmVhZHkuCi0JICovCi1lcnJfdW5sb2NrOgotCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOwotCWlmIChyZXR2YWwgPT0gMCkKLQkJcmV0dmFsID0gdHR5X3BvcnRfYmxvY2tfdGlsX3JlYWR5KHBvcnQsIHR0eSwgZmlscCk7Ci1lbmQ6Ci0JcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gdWFydF9zdGFydHVwKHR0eSwgc3RhdGUsIDApOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqdWFydF90eXBlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCkBAIC0xOTQwLDcgKzE4OTQsNyBAQAogICoKICAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FSU5WQUwgb24gZmFpbHVyZQogICovCi1pbnQgdWFydF9wYXJzZV9lYXJseWNvbihjaGFyICpwLCB1bnNpZ25lZCBjaGFyICppb3R5cGUsIHVuc2lnbmVkIGxvbmcgKmFkZHIsCitpbnQgdWFydF9wYXJzZV9lYXJseWNvbihjaGFyICpwLCB1bnNpZ25lZCBjaGFyICppb3R5cGUsIHJlc291cmNlX3NpemVfdCAqYWRkciwKIAkJCWNoYXIgKipvcHRpb25zKQogewogCWlmIChzdHJuY21wKHAsICJtbWlvLCIsIDUpID09IDApIHsKQEAgLTE5NjgsNyArMTkyMiwxMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQkqYWRkciA9IHNpbXBsZV9zdHJ0b3VsKHAsIE5VTEwsIDApOworCS8qCisJICogQmVmb3JlIHlvdSByZXBsYWNlIGl0IHdpdGgga3N0cnRvdWxsKCksIHRoaW5rIGFib3V0IG9wdGlvbnMgc2VwYXJhdG9yCisJICogKCcsJykgaXQgd2lsbCBub3QgdG9sZXJhdGUKKwkgKi8KKwkqYWRkciA9IHNpbXBsZV9zdHJ0b3VsbChwLCBOVUxMLCAwKTsKIAlwID0gc3RyY2hyKHAsICcsJyk7CiAJaWYgKHApCiAJCXArKzsKQEAgLTI0NzAsNiArMjQyOCw4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9wb3J0X29wZXJhdGlvbnMgdWFydF9wb3J0X29wcyA9IHsKIAkuY2Fycmllcl9yYWlzZWQgPSB1YXJ0X2NhcnJpZXJfcmFpc2VkLAogCS5kdHJfcnRzCT0gdWFydF9kdHJfcnRzLAorCS5hY3RpdmF0ZQk9IHVhcnRfcG9ydF9hY3RpdmF0ZSwKKwkuc2h1dGRvd24JPSB1YXJ0X3R0eV9wb3J0X3NodXRkb3duLAogfTsKIAogLyoqCkBAIC0yNzg2LDYgKzI3NDYsOCBAQAogCXVwb3J0LT5jb25zID0gZHJ2LT5jb25zOwogCXVwb3J0LT5taW5vciA9IGRydi0+dHR5X2RyaXZlci0+bWlub3Jfc3RhcnQgKyB1cG9ydC0+bGluZTsKIAorCXBvcnQtPmNvbnNvbGUgPSB1YXJ0X2NvbnNvbGUodXBvcnQpOworCiAJLyoKIAkgKiBJZiB0aGlzIHBvcnQgaXMgYSBjb25zb2xlLCB0aGVuIHRoZSBzcGlubG9jayBpcyBhbHJlYWR5CiAJICogaW5pdGlhbGlzZWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2gtc2NpLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2gtc2NpLmMKaW5kZXggZDg2ZWVlMy4uNGIyNjI1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3NoLXNjaS5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zaC1zY2kuYwpAQCAtMjUzMyw3ICsyNTMzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBzY2lfdWFydF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIHNjaV91YXJ0X29wcyA9IHsKIAkudHhfZW1wdHkJPSBzY2lfdHhfZW1wdHksCiAJLnNldF9tY3RybAk9IHNjaV9zZXRfbWN0cmwsCiAJLmdldF9tY3RybAk9IHNjaV9nZXRfbWN0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvc3QtYXNjLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc3QtYXNjLmMKaW5kZXggMmQ3OGNiMy4uMzc5ZTViZCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3N0LWFzYy5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zdC1hc2MuYwpAQCAtNjM5LDcgKzYzOSw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBhc2NfdWFydF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIGFzY191YXJ0X29wcyA9IHsKIAkudHhfZW1wdHkJPSBhc2NfdHhfZW1wdHksCiAJLnNldF9tY3RybAk9IGFzY19zZXRfbWN0cmwsCiAJLmdldF9tY3RybAk9IGFzY19nZXRfbWN0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvc3RtMzItdXNhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zdG0zMi11c2FydC5jCmluZGV4IGY4OWQxZjcuLjAzMzg1NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zdG0zMi11c2FydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zdG0zMi11c2FydC5jCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgTWF4aW1lIENvcXVlbGluIDIwMTUKLSAqIEF1dGhvcjogIE1heGltZSBDb3F1ZWxpbiA8bWNvcXVlbGluLnN0bTMyQGdtYWlsLmNvbT4KKyAqIEF1dGhvcnM6ICBNYXhpbWUgQ29xdWVsaW4gPG1jb3F1ZWxpbi5zdG0zMkBnbWFpbC5jb20+CisgKgkgICAgIEdlcmFsZCBCYWV6YSA8Z2VyYWxkLmJhZXphQHN0LmNvbT4KICAqIExpY2Vuc2UgdGVybXM6ICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgdmVyc2lvbiAyCiAgKgogICogSW5zcGlyZWQgYnkgc3QtYXNjLmMgZnJvbSBTVE1pY3JvZWxlY3Ryb25pY3MgKGMpCkBAIC0xMCwxMjAgKzExLDMxIEBACiAjZGVmaW5lIFNVUFBPUlRfU1lTUlEKICNlbmRpZgogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC90dHkuaD4KLSNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLWRpcmVjdGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAKLSNkZWZpbmUgRFJJVkVSX05BTUUgInN0bTMyLXVzYXJ0IgotCi0vKiBSZWdpc3RlciBvZmZzZXRzICovCi0jZGVmaW5lIFVTQVJUX1NSCQkweDAwCi0jZGVmaW5lIFVTQVJUX0RSCQkweDA0Ci0jZGVmaW5lIFVTQVJUX0JSUgkJMHgwOAotI2RlZmluZSBVU0FSVF9DUjEJCTB4MGMKLSNkZWZpbmUgVVNBUlRfQ1IyCQkweDEwCi0jZGVmaW5lIFVTQVJUX0NSMwkJMHgxNAotI2RlZmluZSBVU0FSVF9HVFBSCQkweDE4Ci0KLS8qIFVTQVJUX1NSICovCi0jZGVmaW5lIFVTQVJUX1NSX1BFCQlCSVQoMCkKLSNkZWZpbmUgVVNBUlRfU1JfRkUJCUJJVCgxKQotI2RlZmluZSBVU0FSVF9TUl9ORgkJQklUKDIpCi0jZGVmaW5lIFVTQVJUX1NSX09SRQkJQklUKDMpCi0jZGVmaW5lIFVTQVJUX1NSX0lETEUJCUJJVCg0KQotI2RlZmluZSBVU0FSVF9TUl9SWE5FCQlCSVQoNSkKLSNkZWZpbmUgVVNBUlRfU1JfVEMJCUJJVCg2KQotI2RlZmluZSBVU0FSVF9TUl9UWEUJCUJJVCg3KQotI2RlZmluZSBVU0FSVF9TUl9MQkQJCUJJVCg4KQotI2RlZmluZSBVU0FSVF9TUl9DVFMJCUJJVCg5KQotI2RlZmluZSBVU0FSVF9TUl9FUlJfTUFTSwkoVVNBUlRfU1JfTEJEIHwgVVNBUlRfU1JfT1JFIHwgXAotCQkJCSBVU0FSVF9TUl9GRSB8IFVTQVJUX1NSX1BFKQotLyogRHVtbXkgYml0cyAqLwotI2RlZmluZSBVU0FSVF9TUl9EVU1NWV9SWAlCSVQoMTYpCi0KLS8qIFVTQVJUX0RSICovCi0jZGVmaW5lIFVTQVJUX0RSX01BU0sJCUdFTk1BU0soOCwgMCkKLQotLyogVVNBUlRfQlJSICovCi0jZGVmaW5lIFVTQVJUX0JSUl9ESVZfRl9NQVNLCUdFTk1BU0soMywgMCkKLSNkZWZpbmUgVVNBUlRfQlJSX0RJVl9NX01BU0sJR0VOTUFTSygxNSwgNCkKLSNkZWZpbmUgVVNBUlRfQlJSX0RJVl9NX1NISUZUCTQKLQotLyogVVNBUlRfQ1IxICovCi0jZGVmaW5lIFVTQVJUX0NSMV9TQksJCUJJVCgwKQotI2RlZmluZSBVU0FSVF9DUjFfUldVCQlCSVQoMSkKLSNkZWZpbmUgVVNBUlRfQ1IxX1JFCQlCSVQoMikKLSNkZWZpbmUgVVNBUlRfQ1IxX1RFCQlCSVQoMykKLSNkZWZpbmUgVVNBUlRfQ1IxX0lETEVJRQlCSVQoNCkKLSNkZWZpbmUgVVNBUlRfQ1IxX1JYTkVJRQlCSVQoNSkKLSNkZWZpbmUgVVNBUlRfQ1IxX1RDSUUJCUJJVCg2KQotI2RlZmluZSBVU0FSVF9DUjFfVFhFSUUJCUJJVCg3KQotI2RlZmluZSBVU0FSVF9DUjFfUEVJRQkJQklUKDgpCi0jZGVmaW5lIFVTQVJUX0NSMV9QUwkJQklUKDkpCi0jZGVmaW5lIFVTQVJUX0NSMV9QQ0UJCUJJVCgxMCkKLSNkZWZpbmUgVVNBUlRfQ1IxX1dBS0UJCUJJVCgxMSkKLSNkZWZpbmUgVVNBUlRfQ1IxX00JCUJJVCgxMikKLSNkZWZpbmUgVVNBUlRfQ1IxX1VFCQlCSVQoMTMpCi0jZGVmaW5lIFVTQVJUX0NSMV9PVkVSOAkJQklUKDE1KQotI2RlZmluZSBVU0FSVF9DUjFfSUVfTUFTSwlHRU5NQVNLKDgsIDQpCi0KLS8qIFVTQVJUX0NSMiAqLwotI2RlZmluZSBVU0FSVF9DUjJfQUREX01BU0sJR0VOTUFTSygzLCAwKQotI2RlZmluZSBVU0FSVF9DUjJfTEJETAkJQklUKDUpCi0jZGVmaW5lIFVTQVJUX0NSMl9MQkRJRQkJQklUKDYpCi0jZGVmaW5lIFVTQVJUX0NSMl9MQkNMCQlCSVQoOCkKLSNkZWZpbmUgVVNBUlRfQ1IyX0NQSEEJCUJJVCg5KQotI2RlZmluZSBVU0FSVF9DUjJfQ1BPTAkJQklUKDEwKQotI2RlZmluZSBVU0FSVF9DUjJfQ0xLRU4JCUJJVCgxMSkKLSNkZWZpbmUgVVNBUlRfQ1IyX1NUT1BfMkIJQklUKDEzKQotI2RlZmluZSBVU0FSVF9DUjJfU1RPUF9NQVNLCUdFTk1BU0soMTMsIDEyKQotI2RlZmluZSBVU0FSVF9DUjJfTElORU4JCUJJVCgxNCkKLQotLyogVVNBUlRfQ1IzICovCi0jZGVmaW5lIFVTQVJUX0NSM19FSUUJCUJJVCgwKQotI2RlZmluZSBVU0FSVF9DUjNfSVJFTgkJQklUKDEpCi0jZGVmaW5lIFVTQVJUX0NSM19JUkxQCQlCSVQoMikKLSNkZWZpbmUgVVNBUlRfQ1IzX0hEU0VMCQlCSVQoMykKLSNkZWZpbmUgVVNBUlRfQ1IzX05BQ0sJCUJJVCg0KQotI2RlZmluZSBVU0FSVF9DUjNfU0NFTgkJQklUKDUpCi0jZGVmaW5lIFVTQVJUX0NSM19ETUFSCQlCSVQoNikKLSNkZWZpbmUgVVNBUlRfQ1IzX0RNQVQJCUJJVCg3KQotI2RlZmluZSBVU0FSVF9DUjNfUlRTRQkJQklUKDgpCi0jZGVmaW5lIFVTQVJUX0NSM19DVFNFCQlCSVQoOSkKLSNkZWZpbmUgVVNBUlRfQ1IzX0NUU0lFCQlCSVQoMTApCi0jZGVmaW5lIFVTQVJUX0NSM19PTkVCSVQJQklUKDExKQotCi0vKiBVU0FSVF9HVFBSICovCi0jZGVmaW5lIFVTQVJUX0dUUFJfUFNDX01BU0sJR0VOTUFTSyg3LCAwKQotI2RlZmluZSBVU0FSVF9HVFBSX0dUX01BU0sJR0VOTUFTSygxNSwgOCkKLQotI2RlZmluZSBEUklWRVJfTkFNRSAic3RtMzItdXNhcnQiCi0jZGVmaW5lIFNUTTMyX1NFUklBTF9OQU1FICJ0dHlTIgotI2RlZmluZSBTVE0zMl9NQVhfUE9SVFMgNgotCi1zdHJ1Y3Qgc3RtMzJfcG9ydCB7Ci0Jc3RydWN0IHVhcnRfcG9ydCBwb3J0OwotCXN0cnVjdCBjbGsgKmNsazsKLQlib29sIGh3X2Zsb3dfY29udHJvbDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3RtMzJfcG9ydCBzdG0zMl9wb3J0c1tTVE0zMl9NQVhfUE9SVFNdOwotc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBzdG0zMl91c2FydF9kcml2ZXI7CisjaW5jbHVkZSAic3RtMzItdXNhcnQuaCIKIAogc3RhdGljIHZvaWQgc3RtMzJfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIHN0bTMyX3RyYW5zbWl0X2NoYXJzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzdG0zMl9wb3J0ICp0b19zdG0zMl9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CkBAIC0xNDgsMTkgKzYwLDY0IEBACiAJd3JpdGVsX3JlbGF4ZWQodmFsLCBwb3J0LT5tZW1iYXNlICsgcmVnKTsKIH0KIAotc3RhdGljIHZvaWQgc3RtMzJfcmVjZWl2ZV9jaGFycyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQorc3RhdGljIGludCBzdG0zMl9wZW5kaW5nX3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHUzMiAqc3IsIGludCAqbGFzdF9yZXMsCisJCQkgICAgYm9vbCB0aHJlYWRlZCkKK3sKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CisJZW51bSBkbWFfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgZG1hX3R4X3N0YXRlIHN0YXRlOworCisJKnNyID0gcmVhZGxfcmVsYXhlZChwb3J0LT5tZW1iYXNlICsgb2ZzLT5pc3IpOworCisJaWYgKHRocmVhZGVkICYmIHN0bTMyX3BvcnQtPnJ4X2NoKSB7CisJCXN0YXR1cyA9IGRtYWVuZ2luZV90eF9zdGF0dXMoc3RtMzJfcG9ydC0+cnhfY2gsCisJCQkJCSAgICAgc3RtMzJfcG9ydC0+cnhfY2gtPmNvb2tpZSwKKwkJCQkJICAgICAmc3RhdGUpOworCQlpZiAoKHN0YXR1cyA9PSBETUFfSU5fUFJPR1JFU1MpICYmCisJCSAgICAoKmxhc3RfcmVzICE9IHN0YXRlLnJlc2lkdWUpKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0gZWxzZSBpZiAoKnNyICYgVVNBUlRfU1JfUlhORSkgeworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitzdG0zMl9nZXRfY2hhcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1MzIgKnNyLCBpbnQgKmxhc3RfcmVzKQoreworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKKwl1bnNpZ25lZCBsb25nIGM7CisKKwlpZiAoc3RtMzJfcG9ydC0+cnhfY2gpIHsKKwkJYyA9IHN0bTMyX3BvcnQtPnJ4X2J1ZltSWF9CVUZfTCAtICgqbGFzdF9yZXMpLS1dOworCQlpZiAoKCpsYXN0X3JlcykgPT0gMCkKKwkJCSpsYXN0X3JlcyA9IFJYX0JVRl9MOworCQlyZXR1cm4gYzsKKwl9IGVsc2UgeworCQlyZXR1cm4gcmVhZGxfcmVsYXhlZChwb3J0LT5tZW1iYXNlICsgb2ZzLT5yZHIpOworCX0KK30KKworc3RhdGljIHZvaWQgc3RtMzJfcmVjZWl2ZV9jaGFycyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBib29sIHRocmVhZGVkKQogewogCXN0cnVjdCB0dHlfcG9ydCAqdHBvcnQgPSAmcG9ydC0+c3RhdGUtPnBvcnQ7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOwogCXVuc2lnbmVkIGxvbmcgYzsKIAl1MzIgc3I7CiAJY2hhciBmbGFnOworCXN0YXRpYyBpbnQgbGFzdF9yZXMgPSBSWF9CVUZfTDsKIAogCWlmIChwb3J0LT5pcnFfd2FrZSkKIAkJcG1fd2FrZXVwX2V2ZW50KHRwb3J0LT50dHktPmRldiwgMCk7CiAKLQl3aGlsZSAoKHNyID0gcmVhZGxfcmVsYXhlZChwb3J0LT5tZW1iYXNlICsgVVNBUlRfU1IpKSAmIFVTQVJUX1NSX1JYTkUpIHsKKwl3aGlsZSAoc3RtMzJfcGVuZGluZ19yeChwb3J0LCAmc3IsICZsYXN0X3JlcywgdGhyZWFkZWQpKSB7CiAJCXNyIHw9IFVTQVJUX1NSX0RVTU1ZX1JYOwotCQljID0gcmVhZGxfcmVsYXhlZChwb3J0LT5tZW1iYXNlICsgVVNBUlRfRFIpOworCQljID0gc3RtMzJfZ2V0X2NoYXIocG9ydCwgJnNyLCAmbGFzdF9yZXMpOwogCQlmbGFnID0gVFRZX05PUk1BTDsKIAkJcG9ydC0+aWNvdW50LnJ4Kys7CiAKQEAgLTE3MCw2ICsxMjcsMTAgQEAKIAkJCQlpZiAodWFydF9oYW5kbGVfYnJlYWsocG9ydCkpCiAJCQkJCWNvbnRpbnVlOwogCQkJfSBlbHNlIGlmIChzciAmIFVTQVJUX1NSX09SRSkgeworCQkJCWlmIChvZnMtPmljciAhPSBVTkRFRl9SRUcpCisJCQkJCXdyaXRlbF9yZWxheGVkKFVTQVJUX0lDUl9PUkVDRiwKKwkJCQkJCSAgICAgICBwb3J0LT5tZW1iYXNlICsKKwkJCQkJCSAgICAgICBvZnMtPmljcik7CiAJCQkJcG9ydC0+aWNvdW50Lm92ZXJydW4rKzsKIAkJCX0gZWxzZSBpZiAoc3IgJiBVU0FSVF9TUl9QRSkgewogCQkJCXBvcnQtPmljb3VudC5wYXJpdHkrKzsKQEAgLTE5NywxNCArMTU4LDEzOCBAQAogCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CiB9CiAKK3N0YXRpYyB2b2lkIHN0bTMyX3R4X2RtYV9jb21wbGV0ZSh2b2lkICphcmcpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IGFyZzsKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJwb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMycG9ydC0+aW5mby0+b2ZzOworCXVuc2lnbmVkIGludCBpc3I7CisJaW50IHJldDsKKworCXJldCA9IHJlYWRsX3JlbGF4ZWRfcG9sbF90aW1lb3V0X2F0b21pYyhwb3J0LT5tZW1iYXNlICsgb2ZzLT5pc3IsCisJCQkJCQlpc3IsCisJCQkJCQkoaXNyICYgVVNBUlRfU1JfVEMpLAorCQkJCQkJMTAsIDEwMDAwMCk7CisKKwlpZiAocmV0KQorCQlkZXZfZXJyKHBvcnQtPmRldiwgInRlcm1pbmFsIGNvdW50IG5vdCBzZXRcbiIpOworCisJaWYgKG9mcy0+aWNyID09IFVOREVGX1JFRykKKwkJc3RtMzJfY2xyX2JpdHMocG9ydCwgb2ZzLT5pc3IsIFVTQVJUX1NSX1RDKTsKKwllbHNlCisJCXN0bTMyX3NldF9iaXRzKHBvcnQsIG9mcy0+aWNyLCBVU0FSVF9DUl9UQyk7CisKKwlzdG0zMl9jbHJfYml0cyhwb3J0LCBvZnMtPmNyMywgVVNBUlRfQ1IzX0RNQVQpOworCXN0bTMycG9ydC0+dHhfZG1hX2J1c3kgPSBmYWxzZTsKKworCS8qIExldCdzIHNlZSBpZiB3ZSBoYXZlIHBlbmRpbmcgZGF0YSB0byBzZW5kICovCisJc3RtMzJfdHJhbnNtaXRfY2hhcnMocG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0bTMyX3RyYW5zbWl0X2NoYXJzX3BpbyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKKwlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmcG9ydC0+c3RhdGUtPnhtaXQ7CisJdW5zaWduZWQgaW50IGlzcjsKKwlpbnQgcmV0OworCisJaWYgKHN0bTMyX3BvcnQtPnR4X2RtYV9idXN5KSB7CisJCXN0bTMyX2Nscl9iaXRzKHBvcnQsIG9mcy0+Y3IzLCBVU0FSVF9DUjNfRE1BVCk7CisJCXN0bTMyX3BvcnQtPnR4X2RtYV9idXN5ID0gZmFsc2U7CisJfQorCisJcmV0ID0gcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXRfYXRvbWljKHBvcnQtPm1lbWJhc2UgKyBvZnMtPmlzciwKKwkJCQkJCWlzciwKKwkJCQkJCShpc3IgJiBVU0FSVF9TUl9UWEUpLAorCQkJCQkJMTAsIDEwMCk7CisKKwlpZiAocmV0KQorCQlkZXZfZXJyKHBvcnQtPmRldiwgInR4IGVtcHR5IG5vdCBzZXRcbiIpOworCisJc3RtMzJfc2V0X2JpdHMocG9ydCwgb2ZzLT5jcjEsIFVTQVJUX0NSMV9UWEVJRSk7CisKKwl3cml0ZWxfcmVsYXhlZCh4bWl0LT5idWZbeG1pdC0+dGFpbF0sIHBvcnQtPm1lbWJhc2UgKyBvZnMtPnRkcik7CisJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgMSkgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKKwlwb3J0LT5pY291bnQudHgrKzsKK30KKworc3RhdGljIHZvaWQgc3RtMzJfdHJhbnNtaXRfY2hhcnNfZG1hKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMycG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMnBvcnQtPmluZm8tPm9mczsKKwlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmcG9ydC0+c3RhdGUtPnhtaXQ7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjID0gTlVMTDsKKwlkbWFfY29va2llX3QgY29va2llOworCXVuc2lnbmVkIGludCBjb3VudCwgaTsKKworCWlmIChzdG0zMnBvcnQtPnR4X2RtYV9idXN5KQorCQlyZXR1cm47CisKKwlzdG0zMnBvcnQtPnR4X2RtYV9idXN5ID0gdHJ1ZTsKKworCWNvdW50ID0gdWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCk7CisKKwlpZiAoY291bnQgPiBUWF9CVUZfTCkKKwkJY291bnQgPSBUWF9CVUZfTDsKKworCWlmICh4bWl0LT50YWlsIDwgeG1pdC0+aGVhZCkgeworCQltZW1jcHkoJnN0bTMycG9ydC0+dHhfYnVmWzBdLCAmeG1pdC0+YnVmW3htaXQtPnRhaWxdLCBjb3VudCk7CisJfSBlbHNlIHsKKwkJc2l6ZV90IG9uZSA9IFVBUlRfWE1JVF9TSVpFIC0geG1pdC0+dGFpbDsKKwkJc2l6ZV90IHR3bzsKKworCQlpZiAob25lID4gY291bnQpCisJCQlvbmUgPSBjb3VudDsKKwkJdHdvID0gY291bnQgLSBvbmU7CisKKwkJbWVtY3B5KCZzdG0zMnBvcnQtPnR4X2J1ZlswXSwgJnhtaXQtPmJ1Zlt4bWl0LT50YWlsXSwgb25lKTsKKwkJaWYgKHR3bykKKwkJCW1lbWNweSgmc3RtMzJwb3J0LT50eF9idWZbb25lXSwgJnhtaXQtPmJ1ZlswXSwgdHdvKTsKKwl9CisKKwlkZXNjID0gZG1hZW5naW5lX3ByZXBfc2xhdmVfc2luZ2xlKHN0bTMycG9ydC0+dHhfY2gsCisJCQkJCSAgIHN0bTMycG9ydC0+dHhfZG1hX2J1ZiwKKwkJCQkJICAgY291bnQsCisJCQkJCSAgIERNQV9NRU1fVE9fREVWLAorCQkJCQkgICBETUFfUFJFUF9JTlRFUlJVUFQpOworCisJaWYgKCFkZXNjKSB7CisJCWZvciAoaSA9IGNvdW50OyBpID4gMDsgaS0tKQorCQkJc3RtMzJfdHJhbnNtaXRfY2hhcnNfcGlvKHBvcnQpOworCQlyZXR1cm47CisJfQorCisJZGVzYy0+Y2FsbGJhY2sgPSBzdG0zMl90eF9kbWFfY29tcGxldGU7CisJZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBwb3J0OworCisJLyogUHVzaCBjdXJyZW50IERNQSBUWCB0cmFuc2FjdGlvbiBpbiB0aGUgcGVuZGluZyBxdWV1ZSAqLworCWNvb2tpZSA9IGRtYWVuZ2luZV9zdWJtaXQoZGVzYyk7CisKKwkvKiBJc3N1ZSBwZW5kaW5nIERNQSBUWCByZXF1ZXN0cyAqLworCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKHN0bTMycG9ydC0+dHhfY2gpOworCisJc3RtMzJfY2xyX2JpdHMocG9ydCwgb2ZzLT5pc3IsIFVTQVJUX1NSX1RDKTsKKwlzdG0zMl9zZXRfYml0cyhwb3J0LCBvZnMtPmNyMywgVVNBUlRfQ1IzX0RNQVQpOworCisJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgY291bnQpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7CisJcG9ydC0+aWNvdW50LnR4ICs9IGNvdW50OworfQorCiBzdGF0aWMgdm9pZCBzdG0zMl90cmFuc21pdF9jaGFycyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogeworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKIAlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmcG9ydC0+c3RhdGUtPnhtaXQ7CiAKIAlpZiAocG9ydC0+eF9jaGFyKSB7Ci0JCXdyaXRlbF9yZWxheGVkKHBvcnQtPnhfY2hhciwgcG9ydC0+bWVtYmFzZSArIFVTQVJUX0RSKTsKKwkJaWYgKHN0bTMyX3BvcnQtPnR4X2RtYV9idXN5KQorCQkJc3RtMzJfY2xyX2JpdHMocG9ydCwgb2ZzLT5jcjMsIFVTQVJUX0NSM19ETUFUKTsKKwkJd3JpdGVsX3JlbGF4ZWQocG9ydC0+eF9jaGFyLCBwb3J0LT5tZW1iYXNlICsgb2ZzLT50ZHIpOwogCQlwb3J0LT54X2NoYXIgPSAwOwogCQlwb3J0LT5pY291bnQudHgrKzsKKwkJaWYgKHN0bTMyX3BvcnQtPnR4X2RtYV9idXN5KQorCQkJc3RtMzJfc2V0X2JpdHMocG9ydCwgb2ZzLT5jcjMsIFVTQVJUX0NSM19ETUFUKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjE4LDkgKzMwMywxMCBAQAogCQlyZXR1cm47CiAJfQogCi0Jd3JpdGVsX3JlbGF4ZWQoeG1pdC0+YnVmW3htaXQtPnRhaWxdLCBwb3J0LT5tZW1iYXNlICsgVVNBUlRfRFIpOwotCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIDEpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7Ci0JcG9ydC0+aWNvdW50LnR4Kys7CisJaWYgKHN0bTMyX3BvcnQtPnR4X2NoKQorCQlzdG0zMl90cmFuc21pdF9jaGFyc19kbWEocG9ydCk7CisJZWxzZQorCQlzdG0zMl90cmFuc21pdF9jaGFyc19waW8ocG9ydCk7CiAKIAlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBXQUtFVVBfQ0hBUlMpCiAJCXVhcnRfd3JpdGVfd2FrZXVwKHBvcnQpOwpAQCAtMjMyLDM0ICszMTgsNjAgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzdG0zMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqcHRyKQogewogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSBwdHI7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOwogCXUzMiBzcjsKIAogCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CiAKLQlzciA9IHJlYWRsX3JlbGF4ZWQocG9ydC0+bWVtYmFzZSArIFVTQVJUX1NSKTsKKwlzciA9IHJlYWRsX3JlbGF4ZWQocG9ydC0+bWVtYmFzZSArIG9mcy0+aXNyKTsKIAotCWlmIChzciAmIFVTQVJUX1NSX1JYTkUpCi0JCXN0bTMyX3JlY2VpdmVfY2hhcnMocG9ydCk7CisJaWYgKChzciAmIFVTQVJUX1NSX1JYTkUpICYmICEoc3RtMzJfcG9ydC0+cnhfY2gpKQorCQlzdG0zMl9yZWNlaXZlX2NoYXJzKHBvcnQsIGZhbHNlKTsKIAotCWlmIChzciAmIFVTQVJUX1NSX1RYRSkKKwlpZiAoKHNyICYgVVNBUlRfU1JfVFhFKSAmJiAhKHN0bTMyX3BvcnQtPnR4X2NoKSkKIAkJc3RtMzJfdHJhbnNtaXRfY2hhcnMocG9ydCk7CiAKIAlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CiAKKwlpZiAoc3RtMzJfcG9ydC0+cnhfY2gpCisJCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7CisJZWxzZQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzdG0zMl90aHJlYWRlZF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqcHRyKQoreworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSBwdHI7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCisJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKKworCWlmIChzdG0zMl9wb3J0LT5yeF9jaCkKKwkJc3RtMzJfcmVjZWl2ZV9jaGFycyhwb3J0LCB0cnVlKTsKKworCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKKwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBzdG0zMl90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewotCXJldHVybiByZWFkbF9yZWxheGVkKHBvcnQtPm1lbWJhc2UgKyBVU0FSVF9TUikgJiBVU0FSVF9TUl9UWEU7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOworCisJcmV0dXJuIHJlYWRsX3JlbGF4ZWQocG9ydC0+bWVtYmFzZSArIG9mcy0+aXNyKSAmIFVTQVJUX1NSX1RYRTsKIH0KIAogc3RhdGljIHZvaWQgc3RtMzJfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBtY3RybCkKIHsKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CisKIAlpZiAoKG1jdHJsICYgVElPQ01fUlRTKSAmJiAocG9ydC0+c3RhdHVzICYgVVBTVEFUX0FVVE9SVFMpKQotCQlzdG0zMl9zZXRfYml0cyhwb3J0LCBVU0FSVF9DUjMsIFVTQVJUX0NSM19SVFNFKTsKKwkJc3RtMzJfc2V0X2JpdHMocG9ydCwgb2ZzLT5jcjMsIFVTQVJUX0NSM19SVFNFKTsKIAllbHNlCi0JCXN0bTMyX2Nscl9iaXRzKHBvcnQsIFVTQVJUX0NSMywgVVNBUlRfQ1IzX1JUU0UpOworCQlzdG0zMl9jbHJfYml0cyhwb3J0LCBvZnMtPmNyMywgVVNBUlRfQ1IzX1JUU0UpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IHN0bTMyX2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQpAQCAtMjcxLDcgKzM4MywxMCBAQAogLyogVHJhbnNtaXQgc3RvcCAqLwogc3RhdGljIHZvaWQgc3RtMzJfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewotCXN0bTMyX2Nscl9iaXRzKHBvcnQsIFVTQVJUX0NSMSwgVVNBUlRfQ1IxX1RYRUlFKTsKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CisKKwlzdG0zMl9jbHJfYml0cyhwb3J0LCBvZnMtPmNyMSwgVVNBUlRfQ1IxX1RYRUlFKTsKIH0KIAogLyogVGhlcmUgYXJlIHByb2JhYmx5IGNoYXJhY3RlcnMgd2FpdGluZyB0byBiZSB0cmFuc21pdHRlZC4gKi8KQEAgLTI4MiwzMyArMzk3LDQwIEBACiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkKIAkJcmV0dXJuOwogCi0Jc3RtMzJfc2V0X2JpdHMocG9ydCwgVVNBUlRfQ1IxLCBVU0FSVF9DUjFfVFhFSUUgfCBVU0FSVF9DUjFfVEUpOworCXN0bTMyX3RyYW5zbWl0X2NoYXJzKHBvcnQpOwogfQogCiAvKiBUaHJvdHRsZSB0aGUgcmVtb3RlIHdoZW4gaW5wdXQgYnVmZmVyIGlzIGFib3V0IHRvIG92ZXJmbG93LiAqLwogc3RhdGljIHZvaWQgc3RtMzJfdGhyb3R0bGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0Jc3RtMzJfY2xyX2JpdHMocG9ydCwgVVNBUlRfQ1IxLCBVU0FSVF9DUjFfUlhORUlFKTsKKwlzdG0zMl9jbHJfYml0cyhwb3J0LCBvZnMtPmNyMSwgVVNBUlRfQ1IxX1JYTkVJRSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogfQogCiAvKiBVbnRocm90dGxlIHRoZSByZW1vdGUsIHRoZSBpbnB1dCBidWZmZXIgY2FuIG5vdyBhY2NlcHQgZGF0YS4gKi8KIHN0YXRpYyB2b2lkIHN0bTMyX3VudGhyb3R0bGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0Jc3RtMzJfc2V0X2JpdHMocG9ydCwgVVNBUlRfQ1IxLCBVU0FSVF9DUjFfUlhORUlFKTsKKwlzdG0zMl9zZXRfYml0cyhwb3J0LCBvZnMtPmNyMSwgVVNBUlRfQ1IxX1JYTkVJRSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogfQogCiAvKiBSZWNlaXZlIHN0b3AgKi8KIHN0YXRpYyB2b2lkIHN0bTMyX3N0b3Bfcngoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlzdG0zMl9jbHJfYml0cyhwb3J0LCBVU0FSVF9DUjEsIFVTQVJUX0NSMV9SWE5FSUUpOworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKKworCXN0bTMyX2Nscl9iaXRzKHBvcnQsIG9mcy0+Y3IxLCBVU0FSVF9DUjFfUlhORUlFKTsKIH0KIAogLyogSGFuZGxlIGJyZWFrcyAtIGlnbm9yZWQgYnkgdXMgKi8KQEAgLTMxOCwyNiArNDQwLDM0IEBACiAKIHN0YXRpYyBpbnQgc3RtMzJfc3RhcnR1cChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogeworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKIAljb25zdCBjaGFyICpuYW1lID0gdG9fcGxhdGZvcm1fZGV2aWNlKHBvcnQtPmRldiktPm5hbWU7CiAJdTMyIHZhbDsKIAlpbnQgcmV0OwogCi0JcmV0ID0gcmVxdWVzdF9pcnEocG9ydC0+aXJxLCBzdG0zMl9pbnRlcnJ1cHQsIDAsIG5hbWUsIHBvcnQpOworCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHBvcnQtPmlycSwgc3RtMzJfaW50ZXJydXB0LAorCQkJCSAgIHN0bTMyX3RocmVhZGVkX2ludGVycnVwdCwKKwkJCQkgICBJUlFGX05PX1NVU1BFTkQsIG5hbWUsIHBvcnQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAl2YWwgPSBVU0FSVF9DUjFfUlhORUlFIHwgVVNBUlRfQ1IxX1RFIHwgVVNBUlRfQ1IxX1JFOwotCXN0bTMyX3NldF9iaXRzKHBvcnQsIFVTQVJUX0NSMSwgdmFsKTsKKwlzdG0zMl9zZXRfYml0cyhwb3J0LCBvZnMtPmNyMSwgdmFsKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzdG0zMl9zaHV0ZG93bihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogeworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfY29uZmlnICpjZmcgPSAmc3RtMzJfcG9ydC0+aW5mby0+Y2ZnOwogCXUzMiB2YWw7CiAKIAl2YWwgPSBVU0FSVF9DUjFfVFhFSUUgfCBVU0FSVF9DUjFfUlhORUlFIHwgVVNBUlRfQ1IxX1RFIHwgVVNBUlRfQ1IxX1JFOwotCXN0bTMyX3NldF9iaXRzKHBvcnQsIFVTQVJUX0NSMSwgdmFsKTsKKwl2YWwgfD0gQklUKGNmZy0+dWFydF9lbmFibGVfYml0KTsKKwlzdG0zMl9jbHJfYml0cyhwb3J0LCBvZnMtPmNyMSwgdmFsKTsKIAogCWZyZWVfaXJxKHBvcnQtPmlycSwgcG9ydCk7CiB9CkBAIC0zNDYsNiArNDc2LDggQEAKIAkJCSAgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKIHsKIAlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CisJc3RydWN0IHN0bTMyX3VzYXJ0X2NvbmZpZyAqY2ZnID0gJnN0bTMyX3BvcnQtPmluZm8tPmNmZzsKIAl1bnNpZ25lZCBpbnQgYmF1ZDsKIAl1MzIgdXNhcnRkaXYsIG1hbnRpc3NhLCBmcmFjdGlvbiwgb3ZlcnNhbXBsaW5nOwogCXRjZmxhZ190IGNmbGFnID0gdGVybWlvcy0+Y19jZmxhZzsKQEAgLTM2MCw5ICs0OTIsMTAgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCiAJLyogU3RvcCBzZXJpYWwgcG9ydCBhbmQgcmVzZXQgdmFsdWUgKi8KLQl3cml0ZWxfcmVsYXhlZCgwLCBwb3J0LT5tZW1iYXNlICsgVVNBUlRfQ1IxKTsKKwl3cml0ZWxfcmVsYXhlZCgwLCBwb3J0LT5tZW1iYXNlICsgb2ZzLT5jcjEpOwogCi0JY3IxID0gVVNBUlRfQ1IxX1RFIHwgVVNBUlRfQ1IxX1JFIHwgVVNBUlRfQ1IxX1VFIHwgVVNBUlRfQ1IxX1JYTkVJRTsKKwljcjEgPSBVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUgfCBVU0FSVF9DUjFfUlhORUlFOworCWNyMSB8PSBCSVQoY2ZnLT51YXJ0X2VuYWJsZV9iaXQpOwogCWNyMiA9IDA7CiAJY3IzID0gMDsKIApAQCAtMzcxLDggKzUwNCwxMiBAQAogCiAJaWYgKGNmbGFnICYgUEFSRU5CKSB7CiAJCWNyMSB8PSBVU0FSVF9DUjFfUENFOwotCQlpZiAoKGNmbGFnICYgQ1NJWkUpID09IENTOCkKLQkJCWNyMSB8PSBVU0FSVF9DUjFfTTsKKwkJaWYgKChjZmxhZyAmIENTSVpFKSA9PSBDUzgpIHsKKwkJCWlmIChjZmctPmhhc183Yml0c19kYXRhKQorCQkJCWNyMSB8PSBVU0FSVF9DUjFfTTA7CisJCQllbHNlCisJCQkJY3IxIHw9IFVTQVJUX0NSMV9NOworCQl9CiAJfQogCiAJaWYgKGNmbGFnICYgUEFST0REKQpAQCAtMzk0LDE1ICs1MzEsMTUgQEAKIAkgKi8KIAlpZiAodXNhcnRkaXYgPCAxNikgewogCQlvdmVyc2FtcGxpbmcgPSA4OwotCQlzdG0zMl9zZXRfYml0cyhwb3J0LCBVU0FSVF9DUjEsIFVTQVJUX0NSMV9PVkVSOCk7CisJCXN0bTMyX3NldF9iaXRzKHBvcnQsIG9mcy0+Y3IxLCBVU0FSVF9DUjFfT1ZFUjgpOwogCX0gZWxzZSB7CiAJCW92ZXJzYW1wbGluZyA9IDE2OwotCQlzdG0zMl9jbHJfYml0cyhwb3J0LCBVU0FSVF9DUjEsIFVTQVJUX0NSMV9PVkVSOCk7CisJCXN0bTMyX2Nscl9iaXRzKHBvcnQsIG9mcy0+Y3IxLCBVU0FSVF9DUjFfT1ZFUjgpOwogCX0KIAogCW1hbnRpc3NhID0gKHVzYXJ0ZGl2IC8gb3ZlcnNhbXBsaW5nKSA8PCBVU0FSVF9CUlJfRElWX01fU0hJRlQ7CiAJZnJhY3Rpb24gPSB1c2FydGRpdiAlIG92ZXJzYW1wbGluZzsKLQl3cml0ZWxfcmVsYXhlZChtYW50aXNzYSB8IGZyYWN0aW9uLCBwb3J0LT5tZW1iYXNlICsgVVNBUlRfQlJSKTsKKwl3cml0ZWxfcmVsYXhlZChtYW50aXNzYSB8IGZyYWN0aW9uLCBwb3J0LT5tZW1iYXNlICsgb2ZzLT5icnIpOwogCiAJdWFydF91cGRhdGVfdGltZW91dChwb3J0LCBjZmxhZywgYmF1ZCk7CiAKQEAgLTQzMCw5ICs1NjcsMTIgQEAKIAlpZiAoKHRlcm1pb3MtPmNfY2ZsYWcgJiBDUkVBRCkgPT0gMCkKIAkJcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVTQVJUX1NSX0RVTU1ZX1JYOwogCi0Jd3JpdGVsX3JlbGF4ZWQoY3IzLCBwb3J0LT5tZW1iYXNlICsgVVNBUlRfQ1IzKTsKLQl3cml0ZWxfcmVsYXhlZChjcjIsIHBvcnQtPm1lbWJhc2UgKyBVU0FSVF9DUjIpOwotCXdyaXRlbF9yZWxheGVkKGNyMSwgcG9ydC0+bWVtYmFzZSArIFVTQVJUX0NSMSk7CisJaWYgKHN0bTMyX3BvcnQtPnJ4X2NoKQorCQljcjMgfD0gVVNBUlRfQ1IzX0RNQVI7CisKKwl3cml0ZWxfcmVsYXhlZChjcjMsIHBvcnQtPm1lbWJhc2UgKyBvZnMtPmNyMyk7CisJd3JpdGVsX3JlbGF4ZWQoY3IyLCBwb3J0LT5tZW1iYXNlICsgb2ZzLT5jcjIpOworCXdyaXRlbF9yZWxheGVkKGNyMSwgcG9ydC0+bWVtYmFzZSArIG9mcy0+Y3IxKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIH0KQEAgLTQ2OSw2ICs2MDksOCBAQAogewogCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMnBvcnQgPSBjb250YWluZXJfb2YocG9ydCwKIAkJCXN0cnVjdCBzdG0zMl9wb3J0LCBwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMycG9ydC0+aW5mby0+b2ZzOworCXN0cnVjdCBzdG0zMl91c2FydF9jb25maWcgKmNmZyA9ICZzdG0zMnBvcnQtPmluZm8tPmNmZzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAogCXN3aXRjaCAoc3RhdGUpIHsKQEAgLTQ3Nyw3ICs2MTksNyBAQAogCQlicmVhazsKIAljYXNlIFVBUlRfUE1fU1RBVEVfT0ZGOgogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCQlzdG0zMl9jbHJfYml0cyhwb3J0LCBVU0FSVF9DUjEsIFVTQVJUX0NSMV9VRSk7CisJCXN0bTMyX2Nscl9iaXRzKHBvcnQsIG9mcy0+Y3IxLCBCSVQoY2ZnLT51YXJ0X2VuYWJsZV9iaXQpKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCQljbGtfZGlzYWJsZV91bnByZXBhcmUoc3RtMzJwb3J0LT5jbGspOwogCQlicmVhazsKQEAgLTUzOSw4ICs2ODEsNiBAQAogCWlmICghc3RtMzJwb3J0LT5wb3J0LnVhcnRjbGspCiAJCXJldCA9IC1FSU5WQUw7CiAKLQljbGtfZGlzYWJsZV91bnByZXBhcmUoc3RtMzJwb3J0LT5jbGspOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTYwLDMwICs3MDAsMTYyIEBACiAJCXJldHVybiBOVUxMOwogCiAJc3RtMzJfcG9ydHNbaWRdLmh3X2Zsb3dfY29udHJvbCA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwKLQkJCQkJCQkiYXV0by1mbG93LWNvbnRyb2wiKTsKKwkJCQkJCQkic3QsaHctZmxvdy1jdHJsIik7CiAJc3RtMzJfcG9ydHNbaWRdLnBvcnQubGluZSA9IGlkOwogCXJldHVybiAmc3RtMzJfcG9ydHNbaWRdOwogfQogCiAjaWZkZWYgQ09ORklHX09GCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdG0zMl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RtMzItdXNhcnQiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RtMzItdWFydCIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJzdCxzdG0zMi11c2FydCIsIC5kYXRhID0gJnN0bTMyZjRfaW5mb30sCisJeyAuY29tcGF0aWJsZSA9ICJzdCxzdG0zMi11YXJ0IiwgLmRhdGEgPSAmc3RtMzJmNF9pbmZvfSwKKwl7IC5jb21wYXRpYmxlID0gInN0LHN0bTMyZjctdXNhcnQiLCAuZGF0YSA9ICZzdG0zMmY3X2luZm99LAorCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RtMzJmNy11YXJ0IiwgLmRhdGEgPSAmc3RtMzJmN19pbmZvfSwKIAl7fSwKIH07CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN0bTMyX21hdGNoKTsKICNlbmRpZgogCitzdGF0aWMgaW50IHN0bTMyX29mX2RtYV9yeF9wcm9iZShzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJwb3J0LAorCQkJCSBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJwb3J0LT5pbmZvLT5vZnM7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZzdG0zMnBvcnQtPnBvcnQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBjb25maWc7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjID0gTlVMTDsKKwlkbWFfY29va2llX3QgY29va2llOworCWludCByZXQ7CisKKwkvKiBSZXF1ZXN0IERNQSBSWCBjaGFubmVsICovCisJc3RtMzJwb3J0LT5yeF9jaCA9IGRtYV9yZXF1ZXN0X3NsYXZlX2NoYW5uZWwoZGV2LCAicngiKTsKKwlpZiAoIXN0bTMycG9ydC0+cnhfY2gpIHsKKwkJZGV2X2luZm8oZGV2LCAicnggZG1hIGFsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlzdG0zMnBvcnQtPnJ4X2J1ZiA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LCBSWF9CVUZfTCwKKwkJCQkJCSAmc3RtMzJwb3J0LT5yeF9kbWFfYnVmLAorCQkJCQkJIEdGUF9LRVJORUwpOworCWlmICghc3RtMzJwb3J0LT5yeF9idWYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBhbGxvY19lcnI7CisJfQorCisJLyogQ29uZmlndXJlIERNQSBjaGFubmVsICovCisJbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKKwljb25maWcuc3JjX2FkZHIgPSBwb3J0LT5tYXBiYXNlICsgb2ZzLT5yZHI7CisJY29uZmlnLnNyY19hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURTsKKworCXJldCA9IGRtYWVuZ2luZV9zbGF2ZV9jb25maWcoc3RtMzJwb3J0LT5yeF9jaCwgJmNvbmZpZyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJyeCBkbWEgY2hhbm5lbCBjb25maWcgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBjb25maWdfZXJyOworCX0KKworCS8qIFByZXBhcmUgYSBETUEgY3ljbGljIHRyYW5zYWN0aW9uICovCisJZGVzYyA9IGRtYWVuZ2luZV9wcmVwX2RtYV9jeWNsaWMoc3RtMzJwb3J0LT5yeF9jaCwKKwkJCQkJIHN0bTMycG9ydC0+cnhfZG1hX2J1ZiwKKwkJCQkJIFJYX0JVRl9MLCBSWF9CVUZfUCwgRE1BX0RFVl9UT19NRU0sCisJCQkJCSBETUFfUFJFUF9JTlRFUlJVUFQpOworCWlmICghZGVzYykgeworCQlkZXZfZXJyKGRldiwgInJ4IGRtYSBwcmVwIGN5Y2xpYyBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGNvbmZpZ19lcnI7CisJfQorCisJLyogTm8gY2FsbGJhY2sgYXMgZG1hIGJ1ZmZlciBpcyBkcmFpbmVkIG9uIHVzYXJ0IGludGVycnVwdCAqLworCWRlc2MtPmNhbGxiYWNrID0gTlVMTDsKKwlkZXNjLT5jYWxsYmFja19wYXJhbSA9IE5VTEw7CisKKwkvKiBQdXNoIGN1cnJlbnQgRE1BIHRyYW5zYWN0aW9uIGluIHRoZSBwZW5kaW5nIHF1ZXVlICovCisJY29va2llID0gZG1hZW5naW5lX3N1Ym1pdChkZXNjKTsKKworCS8qIElzc3VlIHBlbmRpbmcgRE1BIHJlcXVlc3RzICovCisJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoc3RtMzJwb3J0LT5yeF9jaCk7CisKKwlyZXR1cm4gMDsKKworY29uZmlnX2VycjoKKwlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LAorCQkJICBSWF9CVUZfTCwgc3RtMzJwb3J0LT5yeF9idWYsCisJCQkgIHN0bTMycG9ydC0+cnhfZG1hX2J1Zik7CisKK2FsbG9jX2VycjoKKwlkbWFfcmVsZWFzZV9jaGFubmVsKHN0bTMycG9ydC0+cnhfY2gpOworCXN0bTMycG9ydC0+cnhfY2ggPSBOVUxMOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzdG0zMl9vZl9kbWFfdHhfcHJvYmUoc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMycG9ydCwKKwkJCQkgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMycG9ydC0+aW5mby0+b2ZzOworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAmc3RtMzJwb3J0LT5wb3J0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgY29uZmlnOworCWludCByZXQ7CisKKwlzdG0zMnBvcnQtPnR4X2RtYV9idXN5ID0gZmFsc2U7CisKKwkvKiBSZXF1ZXN0IERNQSBUWCBjaGFubmVsICovCisJc3RtMzJwb3J0LT50eF9jaCA9IGRtYV9yZXF1ZXN0X3NsYXZlX2NoYW5uZWwoZGV2LCAidHgiKTsKKwlpZiAoIXN0bTMycG9ydC0+dHhfY2gpIHsKKwkJZGV2X2luZm8oZGV2LCAidHggZG1hIGFsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlzdG0zMnBvcnQtPnR4X2J1ZiA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LCBUWF9CVUZfTCwKKwkJCQkJCSAmc3RtMzJwb3J0LT50eF9kbWFfYnVmLAorCQkJCQkJIEdGUF9LRVJORUwpOworCWlmICghc3RtMzJwb3J0LT50eF9idWYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBhbGxvY19lcnI7CisJfQorCisJLyogQ29uZmlndXJlIERNQSBjaGFubmVsICovCisJbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKKwljb25maWcuZHN0X2FkZHIgPSBwb3J0LT5tYXBiYXNlICsgb2ZzLT50ZHI7CisJY29uZmlnLmRzdF9hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURTsKKworCXJldCA9IGRtYWVuZ2luZV9zbGF2ZV9jb25maWcoc3RtMzJwb3J0LT50eF9jaCwgJmNvbmZpZyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJ0eCBkbWEgY2hhbm5lbCBjb25maWcgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBjb25maWdfZXJyOworCX0KKworCXJldHVybiAwOworCitjb25maWdfZXJyOgorCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsCisJCQkgIFRYX0JVRl9MLCBzdG0zMnBvcnQtPnR4X2J1ZiwKKwkJCSAgc3RtMzJwb3J0LT50eF9kbWFfYnVmKTsKKworYWxsb2NfZXJyOgorCWRtYV9yZWxlYXNlX2NoYW5uZWwoc3RtMzJwb3J0LT50eF9jaCk7CisJc3RtMzJwb3J0LT50eF9jaCA9IE5VTEw7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IHN0bTMyX3NlcmlhbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCWludCByZXQ7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CiAJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMycG9ydDsKKwlpbnQgcmV0OwogCiAJc3RtMzJwb3J0ID0gc3RtMzJfb2ZfZ2V0X3N0bTMyX3BvcnQocGRldik7CiAJaWYgKCFzdG0zMnBvcnQpCiAJCXJldHVybiAtRU5PREVWOwogCisJbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2Uoc3RtMzJfbWF0Y2gsICZwZGV2LT5kZXYpOworCWlmIChtYXRjaCAmJiBtYXRjaC0+ZGF0YSkKKwkJc3RtMzJwb3J0LT5pbmZvID0gKHN0cnVjdCBzdG0zMl91c2FydF9pbmZvICopbWF0Y2gtPmRhdGE7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXJldCA9IHN0bTMyX2luaXRfcG9ydChzdG0zMnBvcnQsIHBkZXYpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC01OTIsNiArODY0LDE0IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCXJldCA9IHN0bTMyX29mX2RtYV9yeF9wcm9iZShzdG0zMnBvcnQsIHBkZXYpOworCWlmIChyZXQpCisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJpbnRlcnJ1cHQgbW9kZSB1c2VkIGZvciByeCAobm8gZG1hKVxuIik7CisKKwlyZXQgPSBzdG0zMl9vZl9kbWFfdHhfcHJvYmUoc3RtMzJwb3J0LCBwZGV2KTsKKwlpZiAocmV0KQorCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiaW50ZXJydXB0IG1vZGUgdXNlZCBmb3IgdHggKG5vIGRtYSlcbiIpOworCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJnN0bTMycG9ydC0+cG9ydCk7CiAKIAlyZXR1cm4gMDsKQEAgLTYwMCw2ICs4ODAsMzAgQEAKIHN0YXRpYyBpbnQgc3RtMzJfc2VyaWFsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CisKKwlzdG0zMl9jbHJfYml0cyhwb3J0LCBvZnMtPmNyMywgVVNBUlRfQ1IzX0RNQVIpOworCisJaWYgKHN0bTMyX3BvcnQtPnJ4X2NoKQorCQlkbWFfcmVsZWFzZV9jaGFubmVsKHN0bTMyX3BvcnQtPnJ4X2NoKTsKKworCWlmIChzdG0zMl9wb3J0LT5yeF9kbWFfYnVmKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LAorCQkJCSAgUlhfQlVGX0wsIHN0bTMyX3BvcnQtPnJ4X2J1ZiwKKwkJCQkgIHN0bTMyX3BvcnQtPnJ4X2RtYV9idWYpOworCisJc3RtMzJfY2xyX2JpdHMocG9ydCwgb2ZzLT5jcjMsIFVTQVJUX0NSM19ETUFUKTsKKworCWlmIChzdG0zMl9wb3J0LT50eF9jaCkKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbChzdG0zMl9wb3J0LT50eF9jaCk7CisKKwlpZiAoc3RtMzJfcG9ydC0+dHhfZG1hX2J1ZikKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwKKwkJCQkgIFRYX0JVRl9MLCBzdG0zMl9wb3J0LT50eF9idWYsCisJCQkJICBzdG0zMl9wb3J0LT50eF9kbWFfYnVmKTsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShzdG0zMl9wb3J0LT5jbGspOwogCiAJcmV0dXJuIHVhcnRfcmVtb3ZlX29uZV9wb3J0KCZzdG0zMl91c2FydF9kcml2ZXIsIHBvcnQpOwogfQpAQCAtNjA4LDE1ICs5MTIsMjEgQEAKICNpZmRlZiBDT05GSUdfU0VSSUFMX1NUTTMyX0NPTlNPTEUKIHN0YXRpYyB2b2lkIHN0bTMyX2NvbnNvbGVfcHV0Y2hhcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgY2gpCiB7Ci0Jd2hpbGUgKCEocmVhZGxfcmVsYXhlZChwb3J0LT5tZW1iYXNlICsgVVNBUlRfU1IpICYgVVNBUlRfU1JfVFhFKSkKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CisKKwl3aGlsZSAoIShyZWFkbF9yZWxheGVkKHBvcnQtPm1lbWJhc2UgKyBvZnMtPmlzcikgJiBVU0FSVF9TUl9UWEUpKQogCQljcHVfcmVsYXgoKTsKIAotCXdyaXRlbF9yZWxheGVkKGNoLCBwb3J0LT5tZW1iYXNlICsgVVNBUlRfRFIpOworCXdyaXRlbF9yZWxheGVkKGNoLCBwb3J0LT5tZW1iYXNlICsgb2ZzLT50ZHIpOwogfQogCiBzdGF0aWMgdm9pZCBzdG0zMl9jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqcywgdW5zaWduZWQgY250KQogewogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAmc3RtMzJfcG9ydHNbY28tPmluZGV4XS5wb3J0OworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfY29uZmlnICpjZmcgPSAmc3RtMzJfcG9ydC0+aW5mby0+Y2ZnOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIG9sZF9jcjEsIG5ld19jcjE7CiAJaW50IGxvY2tlZCA9IDE7CkBAIC02MjksMTUgKzkzOSwxNiBAQAogCWVsc2UKIAkJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKIAotCS8qIFNhdmUgYW5kIGRpc2FibGUgaW50ZXJydXB0cyAqLwotCW9sZF9jcjEgPSByZWFkbF9yZWxheGVkKHBvcnQtPm1lbWJhc2UgKyBVU0FSVF9DUjEpOworCS8qIFNhdmUgYW5kIGRpc2FibGUgaW50ZXJydXB0cywgZW5hYmxlIHRoZSB0cmFuc21pdHRlciAqLworCW9sZF9jcjEgPSByZWFkbF9yZWxheGVkKHBvcnQtPm1lbWJhc2UgKyBvZnMtPmNyMSk7CiAJbmV3X2NyMSA9IG9sZF9jcjEgJiB+VVNBUlRfQ1IxX0lFX01BU0s7Ci0Jd3JpdGVsX3JlbGF4ZWQobmV3X2NyMSwgcG9ydC0+bWVtYmFzZSArIFVTQVJUX0NSMSk7CisJbmV3X2NyMSB8PSAgVVNBUlRfQ1IxX1RFIHwgQklUKGNmZy0+dWFydF9lbmFibGVfYml0KTsKKwl3cml0ZWxfcmVsYXhlZChuZXdfY3IxLCBwb3J0LT5tZW1iYXNlICsgb2ZzLT5jcjEpOwogCiAJdWFydF9jb25zb2xlX3dyaXRlKHBvcnQsIHMsIGNudCwgc3RtMzJfY29uc29sZV9wdXRjaGFyKTsKIAogCS8qIFJlc3RvcmUgaW50ZXJydXB0IHN0YXRlICovCi0Jd3JpdGVsX3JlbGF4ZWQob2xkX2NyMSwgcG9ydC0+bWVtYmFzZSArIFVTQVJUX0NSMSk7CisJd3JpdGVsX3JlbGF4ZWQob2xkX2NyMSwgcG9ydC0+bWVtYmFzZSArIG9mcy0+Y3IxKTsKIAogCWlmIChsb2NrZWQpCiAJCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zdG0zMi11c2FydC5oIGIvZHJpdmVycy90dHkvc2VyaWFsL3N0bTMyLXVzYXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFkOTc0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zdG0zMi11c2FydC5oCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSBNYXhpbWUgQ29xdWVsaW4gMjAxNQorICogQXV0aG9yczogIE1heGltZSBDb3F1ZWxpbiA8bWNvcXVlbGluLnN0bTMyQGdtYWlsLmNvbT4KKyAqCSAgICAgR2VyYWxkIEJhZXphIDxnZXJhbGRfYmFlemFAeWFob28uZnI+CisgKiBMaWNlbnNlIHRlcm1zOiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIHZlcnNpb24gMgorICovCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgInN0bTMyLXVzYXJ0IgorCitzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyB7CisJdTggY3IxOworCXU4IGNyMjsKKwl1OCBjcjM7CisJdTggYnJyOworCXU4IGd0cHI7CisJdTggcnRvcjsKKwl1OCBycXI7CisJdTggaXNyOworCXU4IGljcjsKKwl1OCByZHI7CisJdTggdGRyOworfTsKKworc3RydWN0IHN0bTMyX3VzYXJ0X2NvbmZpZyB7CisJdTggdWFydF9lbmFibGVfYml0OyAvKiBVU0FSVF9DUjFfVUUgKi8KKwlib29sIGhhc183Yml0c19kYXRhOworfTsKKworc3RydWN0IHN0bTMyX3VzYXJ0X2luZm8geworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzIG9mczsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfY29uZmlnIGNmZzsKK307CisKKyNkZWZpbmUgVU5ERUZfUkVHIH4wCisKKy8qIFJlZ2lzdGVyIG9mZnNldHMgKi8KK3N0cnVjdCBzdG0zMl91c2FydF9pbmZvIHN0bTMyZjRfaW5mbyA9IHsKKwkub2ZzID0geworCQkuaXNyCT0gMHgwMCwKKwkJLnJkcgk9IDB4MDQsCisJCS50ZHIJPSAweDA0LAorCQkuYnJyCT0gMHgwOCwKKwkJLmNyMQk9IDB4MGMsCisJCS5jcjIJPSAweDEwLAorCQkuY3IzCT0gMHgxNCwKKwkJLmd0cHIJPSAweDE4LAorCQkucnRvcgk9IFVOREVGX1JFRywKKwkJLnJxcgk9IFVOREVGX1JFRywKKwkJLmljcgk9IFVOREVGX1JFRywKKwl9LAorCS5jZmcgPSB7CisJCS51YXJ0X2VuYWJsZV9iaXQgPSAxMywKKwkJLmhhc183Yml0c19kYXRhID0gZmFsc2UsCisJfQorfTsKKworc3RydWN0IHN0bTMyX3VzYXJ0X2luZm8gc3RtMzJmN19pbmZvID0geworCS5vZnMgPSB7CisJCS5jcjEJPSAweDAwLAorCQkuY3IyCT0gMHgwNCwKKwkJLmNyMwk9IDB4MDgsCisJCS5icnIJPSAweDBjLAorCQkuZ3Rwcgk9IDB4MTAsCisJCS5ydG9yCT0gMHgxNCwKKwkJLnJxcgk9IDB4MTgsCisJCS5pc3IJPSAweDFjLAorCQkuaWNyCT0gMHgyMCwKKwkJLnJkcgk9IDB4MjQsCisJCS50ZHIJPSAweDI4LAorCX0sCisJLmNmZyA9IHsKKwkJLnVhcnRfZW5hYmxlX2JpdCA9IDAsCisJCS5oYXNfN2JpdHNfZGF0YSA9IHRydWUsCisJfQorfTsKKworLyogVVNBUlRfU1IgKEY0KSAvIFVTQVJUX0lTUiAoRjcpICovCisjZGVmaW5lIFVTQVJUX1NSX1BFCQlCSVQoMCkKKyNkZWZpbmUgVVNBUlRfU1JfRkUJCUJJVCgxKQorI2RlZmluZSBVU0FSVF9TUl9ORgkJQklUKDIpCisjZGVmaW5lIFVTQVJUX1NSX09SRQkJQklUKDMpCisjZGVmaW5lIFVTQVJUX1NSX0lETEUJCUJJVCg0KQorI2RlZmluZSBVU0FSVF9TUl9SWE5FCQlCSVQoNSkKKyNkZWZpbmUgVVNBUlRfU1JfVEMJCUJJVCg2KQorI2RlZmluZSBVU0FSVF9TUl9UWEUJCUJJVCg3KQorI2RlZmluZSBVU0FSVF9TUl9MQkQJCUJJVCg4KQorI2RlZmluZSBVU0FSVF9TUl9DVFNJRgkJQklUKDkpCisjZGVmaW5lIFVTQVJUX1NSX0NUUwkJQklUKDEwKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfU1JfUlRPRgkJQklUKDExKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfU1JfRU9CRgkJQklUKDEyKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfU1JfQUJSRQkJQklUKDE0KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfU1JfQUJSRgkJQklUKDE1KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfU1JfQlVTWQkJQklUKDE2KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfU1JfQ01GCQlCSVQoMTcpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9TUl9TQktGCQlCSVQoMTgpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9TUl9URUFDSwkJQklUKDIxKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfU1JfRVJSX01BU0sJKFVTQVJUX1NSX0xCRCB8IFVTQVJUX1NSX09SRSB8IFwKKwkJCQkgVVNBUlRfU1JfRkUgfCBVU0FSVF9TUl9QRSkKKy8qIER1bW15IGJpdHMgKi8KKyNkZWZpbmUgVVNBUlRfU1JfRFVNTVlfUlgJQklUKDE2KQorCisvKiBVU0FSVF9JQ1IgKEY3KSAqLworI2RlZmluZSBVU0FSVF9DUl9UQwkJQklUKDYpCisKKy8qIFVTQVJUX0RSICovCisjZGVmaW5lIFVTQVJUX0RSX01BU0sJCUdFTk1BU0soOCwgMCkKKworLyogVVNBUlRfQlJSICovCisjZGVmaW5lIFVTQVJUX0JSUl9ESVZfRl9NQVNLCUdFTk1BU0soMywgMCkKKyNkZWZpbmUgVVNBUlRfQlJSX0RJVl9NX01BU0sJR0VOTUFTSygxNSwgNCkKKyNkZWZpbmUgVVNBUlRfQlJSX0RJVl9NX1NISUZUCTQKKworLyogVVNBUlRfQ1IxICovCisjZGVmaW5lIFVTQVJUX0NSMV9TQksJCUJJVCgwKQorI2RlZmluZSBVU0FSVF9DUjFfUldVCQlCSVQoMSkJCS8qIEY0ICovCisjZGVmaW5lIFVTQVJUX0NSMV9SRQkJQklUKDIpCisjZGVmaW5lIFVTQVJUX0NSMV9URQkJQklUKDMpCisjZGVmaW5lIFVTQVJUX0NSMV9JRExFSUUJQklUKDQpCisjZGVmaW5lIFVTQVJUX0NSMV9SWE5FSUUJQklUKDUpCisjZGVmaW5lIFVTQVJUX0NSMV9UQ0lFCQlCSVQoNikKKyNkZWZpbmUgVVNBUlRfQ1IxX1RYRUlFCQlCSVQoNykKKyNkZWZpbmUgVVNBUlRfQ1IxX1BFSUUJCUJJVCg4KQorI2RlZmluZSBVU0FSVF9DUjFfUFMJCUJJVCg5KQorI2RlZmluZSBVU0FSVF9DUjFfUENFCQlCSVQoMTApCisjZGVmaW5lIFVTQVJUX0NSMV9XQUtFCQlCSVQoMTEpCisjZGVmaW5lIFVTQVJUX0NSMV9NCQlCSVQoMTIpCisjZGVmaW5lIFVTQVJUX0NSMV9NMAkJQklUKDEyKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IxX01NRQkJQklUKDEzKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IxX0NNSUUJCUJJVCgxNCkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSMV9PVkVSOAkJQklUKDE1KQorI2RlZmluZSBVU0FSVF9DUjFfREVEVF9NQVNLCUdFTk1BU0soMjAsIDE2KQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjFfREVBVF9NQVNLCUdFTk1BU0soMjUsIDIxKQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjFfUlRPSUUJCUJJVCgyNikJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSMV9FT0JJRQkJQklUKDI3KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IxX00xCQlCSVQoMjgpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjFfSUVfTUFTSwkoR0VOTUFTSyg4LCA0KSB8IEJJVCgxNCkgfCBCSVQoMjYpIHwgQklUKDI3KSkKKworLyogVVNBUlRfQ1IyICovCisjZGVmaW5lIFVTQVJUX0NSMl9BRERfTUFTSwlHRU5NQVNLKDMsIDApCS8qIEY0ICovCisjZGVmaW5lIFVTQVJUX0NSMl9BRERNNwkJQklUKDQpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjJfTEJETAkJQklUKDUpCisjZGVmaW5lIFVTQVJUX0NSMl9MQkRJRQkJQklUKDYpCisjZGVmaW5lIFVTQVJUX0NSMl9MQkNMCQlCSVQoOCkKKyNkZWZpbmUgVVNBUlRfQ1IyX0NQSEEJCUJJVCg5KQorI2RlZmluZSBVU0FSVF9DUjJfQ1BPTAkJQklUKDEwKQorI2RlZmluZSBVU0FSVF9DUjJfQ0xLRU4JCUJJVCgxMSkKKyNkZWZpbmUgVVNBUlRfQ1IyX1NUT1BfMkIJQklUKDEzKQorI2RlZmluZSBVU0FSVF9DUjJfU1RPUF9NQVNLCUdFTk1BU0soMTMsIDEyKQorI2RlZmluZSBVU0FSVF9DUjJfTElORU4JCUJJVCgxNCkKKyNkZWZpbmUgVVNBUlRfQ1IyX1NXQVAJCUJJVCgxNSkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSMl9SWElOVgkJQklUKDE2KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IyX1RYSU5WCQlCSVQoMTcpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjJfREFUQUlOVglCSVQoMTgpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjJfTVNCRklSU1QJQklUKDE5KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IyX0FCUkVOCQlCSVQoMjApCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjJfQUJSTU9EX01BU0sJR0VOTUFTSygyMiwgMjEpCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSMl9SVE9FTgkJQklUKDIzKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IyX0FERF9GN19NQVNLCUdFTk1BU0soMzEsIDI0KQkvKiBGNyAqLworCisvKiBVU0FSVF9DUjMgKi8KKyNkZWZpbmUgVVNBUlRfQ1IzX0VJRQkJQklUKDApCisjZGVmaW5lIFVTQVJUX0NSM19JUkVOCQlCSVQoMSkKKyNkZWZpbmUgVVNBUlRfQ1IzX0lSTFAJCUJJVCgyKQorI2RlZmluZSBVU0FSVF9DUjNfSERTRUwJCUJJVCgzKQorI2RlZmluZSBVU0FSVF9DUjNfTkFDSwkJQklUKDQpCisjZGVmaW5lIFVTQVJUX0NSM19TQ0VOCQlCSVQoNSkKKyNkZWZpbmUgVVNBUlRfQ1IzX0RNQVIJCUJJVCg2KQorI2RlZmluZSBVU0FSVF9DUjNfRE1BVAkJQklUKDcpCisjZGVmaW5lIFVTQVJUX0NSM19SVFNFCQlCSVQoOCkKKyNkZWZpbmUgVVNBUlRfQ1IzX0NUU0UJCUJJVCg5KQorI2RlZmluZSBVU0FSVF9DUjNfQ1RTSUUJCUJJVCgxMCkKKyNkZWZpbmUgVVNBUlRfQ1IzX09ORUJJVAlCSVQoMTEpCisjZGVmaW5lIFVTQVJUX0NSM19PVlJESVMJQklUKDEyKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IzX0REUkUJCUJJVCgxMykJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSM19ERU0JCUJJVCgxNCkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSM19ERVAJCUJJVCgxNSkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSM19TQ0FSQ05UX01BU0sJR0VOTUFTSygxOSwgMTcpCS8qIEY3ICovCisKKy8qIFVTQVJUX0dUUFIgKi8KKyNkZWZpbmUgVVNBUlRfR1RQUl9QU0NfTUFTSwlHRU5NQVNLKDcsIDApCisjZGVmaW5lIFVTQVJUX0dUUFJfR1RfTUFTSwlHRU5NQVNLKDE1LCA4KQorCisvKiBVU0FSVF9SVE9SICovCisjZGVmaW5lIFVTQVJUX1JUT1JfUlRPX01BU0sJR0VOTUFTSygyMywgMCkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfUlRPUl9CTEVOX01BU0sJR0VOTUFTSygzMSwgMjQpCS8qIEY3ICovCisKKy8qIFVTQVJUX1JRUiAqLworI2RlZmluZSBVU0FSVF9SUVJfQUJSUlEJCUJJVCgwKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfUlFSX1NCS1JRCQlCSVQoMSkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX1JRUl9NTVJRCQlCSVQoMikJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX1JRUl9SWEZSUQkJQklUKDMpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9SUVJfVFhGUlEJCUJJVCg0KQkJLyogRjcgKi8KKworLyogVVNBUlRfSUNSICovCisjZGVmaW5lIFVTQVJUX0lDUl9QRUNGCQlCSVQoMCkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0lDUl9GRkVDRgkJQklUKDEpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9JQ1JfTkNGCQlCSVQoMikJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0lDUl9PUkVDRgkJQklUKDMpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9JQ1JfSURMRUNGCUJJVCg0KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfSUNSX1RDQ0YJCUJJVCg2KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfSUNSX0xCRENGCQlCSVQoOCkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0lDUl9DVFNDRgkJQklUKDkpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9JQ1JfUlRPQ0YJCUJJVCgxMSkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0lDUl9FT0JDRgkJQklUKDEyKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfSUNSX0NNQ0YJCUJJVCgxNykJCS8qIEY3ICovCisKKyNkZWZpbmUgU1RNMzJfU0VSSUFMX05BTUUgInR0eVMiCisjZGVmaW5lIFNUTTMyX01BWF9QT1JUUyA2CisKKyNkZWZpbmUgUlhfQlVGX0wgMjAwCQkgLyogZG1hIHJ4IGJ1ZmZlciBsZW5ndGggICAgICovCisjZGVmaW5lIFJYX0JVRl9QIFJYX0JVRl9MCSAvKiBkbWEgcnggYnVmZmVyIHBlcmlvZCAgICAgKi8KKyNkZWZpbmUgVFhfQlVGX0wgMjAwCQkgLyogZG1hIHR4IGJ1ZmZlciBsZW5ndGggICAgICovCisKK3N0cnVjdCBzdG0zMl9wb3J0IHsKKwlzdHJ1Y3QgdWFydF9wb3J0IHBvcnQ7CisJc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBzdG0zMl91c2FydF9pbmZvICppbmZvOworCXN0cnVjdCBkbWFfY2hhbiAqcnhfY2g7ICAvKiBkbWEgcnggY2hhbm5lbCAgICAgICAgICAgICovCisJZG1hX2FkZHJfdCByeF9kbWFfYnVmOyAgIC8qIGRtYSByeCBidWZmZXIgYnVzIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBjaGFyICpyeF9idWY7ICAgLyogZG1hIHJ4IGJ1ZmZlciBjcHUgYWRkcmVzcyAqLworCXN0cnVjdCBkbWFfY2hhbiAqdHhfY2g7ICAvKiBkbWEgdHggY2hhbm5lbCAgICAgICAgICAgICovCisJZG1hX2FkZHJfdCB0eF9kbWFfYnVmOyAgIC8qIGRtYSB0eCBidWZmZXIgYnVzIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBjaGFyICp0eF9idWY7ICAgLyogZG1hIHR4IGJ1ZmZlciBjcHUgYWRkcmVzcyAqLworCWJvb2wgdHhfZG1hX2J1c3k7CSAvKiBkbWEgdHggYnVzeSAgICAgICAgICAgICAgICovCisJYm9vbCBod19mbG93X2NvbnRyb2w7Cit9OworCitzdGF0aWMgc3RydWN0IHN0bTMyX3BvcnQgc3RtMzJfcG9ydHNbU1RNMzJfTUFYX1BPUlRTXTsKK3N0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgc3RtMzJfdXNhcnRfZHJpdmVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3RpbWJ1YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvdGltYnVhcnQuYwppbmRleCA1MTJjMTYyLi41ZGE3ZmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvdGltYnVhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvdGltYnVhcnQuYwpAQCAtMzk0LDcgKzM5NCw3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgdGltYnVhcnRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyB0aW1idWFydF9vcHMgPSB7CiAJLnR4X2VtcHR5ID0gdGltYnVhcnRfdHhfZW1wdHksCiAJLnNldF9tY3RybCA9IHRpbWJ1YXJ0X3NldF9tY3RybCwKIAkuZ2V0X21jdHJsID0gdGltYnVhcnRfZ2V0X21jdHJsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3VhcnRsaXRlLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvdWFydGxpdGUuYwppbmRleCAwNTA4OWI2Li44MTdiYjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvdWFydGxpdGUuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvdWFydGxpdGUuYwpAQCAtMzg3LDcgKzM4Nyw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyB1bGl0ZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIHVsaXRlX29wcyA9IHsKIAkudHhfZW1wdHkJPSB1bGl0ZV90eF9lbXB0eSwKIAkuc2V0X21jdHJsCT0gdWxpdGVfc2V0X21jdHJsLAogCS5nZXRfbWN0cmwJPSB1bGl0ZV9nZXRfbWN0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvdnQ4NTAwX3NlcmlhbC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3Z0ODUwMF9zZXJpYWwuYwppbmRleCAyM2NmYzVlLi42Yjg1YWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvdnQ4NTAwX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC92dDg1MDBfc2VyaWFsLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogICogaGF2ZSBiZWVuIGFsbG9jYXRlZCBhcyB3ZSBjYW4ndCB1c2UgcGRldi0+aWQgaW4KICAqIGRldmljZXRyZWUKICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgdnQ4NTAwX3BvcnRzX2luX3VzZTsKK3N0YXRpYyBERUNMQVJFX0JJVE1BUCh2dDg1MDBfcG9ydHNfaW5fdXNlLCBWVDg1MDBfTUFYX1BPUlRTKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHZ0ODUwMF93cml0ZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdmFsLAogCQkJICAgICB1bnNpZ25lZCBpbnQgb2ZmKQpAQCAtNjYzLDE1ICs2NjMsMTUgQEAKIAogCWlmIChwb3J0IDwgMCkgewogCQkvKiBjYWxjdWxhdGUgdGhlIHBvcnQgaWQgKi8KLQkJcG9ydCA9IGZpbmRfZmlyc3RfemVyb19iaXQoJnZ0ODUwMF9wb3J0c19pbl91c2UsCi0JCQkJCXNpemVvZih2dDg1MDBfcG9ydHNfaW5fdXNlKSk7CisJCXBvcnQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KHZ0ODUwMF9wb3J0c19pbl91c2UsCisJCQkJCSAgIFZUODUwMF9NQVhfUE9SVFMpOwogCX0KIAogCWlmIChwb3J0ID49IFZUODUwMF9NQVhfUE9SVFMpCiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogcmVzZXJ2ZSB0aGUgcG9ydCBpZCAqLwotCWlmICh0ZXN0X2FuZF9zZXRfYml0KHBvcnQsICZ2dDg1MDBfcG9ydHNfaW5fdXNlKSkgeworCWlmICh0ZXN0X2FuZF9zZXRfYml0KHBvcnQsIHZ0ODUwMF9wb3J0c19pbl91c2UpKSB7CiAJCS8qIHBvcnQgYWxyZWFkeSBpbiB1c2UgLSBzaG91bGRuJ3QgcmVhbGx5IGhhcHBlbiAqLwogCQlyZXR1cm4gLUVCVVNZOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC94aWxpbnhfdWFydHBzLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwveGlsaW54X3VhcnRwcy5jCmluZGV4IDljYTFhNGQuLmYzN2VkYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC94aWxpbnhfdWFydHBzLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3hpbGlueF91YXJ0cHMuYwpAQCAtNTcsNyArNTcsNyBAQAogI2RlZmluZSBDRE5TX1VBUlRfSU1SCQkweDEwICAvKiBJbnRlcnJ1cHQgTWFzayAqLwogI2RlZmluZSBDRE5TX1VBUlRfSVNSCQkweDE0ICAvKiBJbnRlcnJ1cHQgU3RhdHVzICovCiAjZGVmaW5lIENETlNfVUFSVF9CQVVER0VOCTB4MTggIC8qIEJhdWQgUmF0ZSBHZW5lcmF0b3IgKi8KLSNkZWZpbmUgQ0ROU19VQVJUX1JYVE9VVAkJMHgxQyAgLyogUlggVGltZW91dCAqLworI2RlZmluZSBDRE5TX1VBUlRfUlhUT1VUCTB4MUMgIC8qIFJYIFRpbWVvdXQgKi8KICNkZWZpbmUgQ0ROU19VQVJUX1JYV00JCTB4MjAgIC8qIFJYIEZJRk8gVHJpZ2dlciBMZXZlbCAqLwogI2RlZmluZSBDRE5TX1VBUlRfTU9ERU1DUgkweDI0ICAvKiBNb2RlbSBDb250cm9sICovCiAjZGVmaW5lIENETlNfVUFSVF9NT0RFTVNSCTB4MjggIC8qIE1vZGVtIFN0YXR1cyAqLwpAQCAtNjgsNiArNjgsNyBAQAogI2RlZmluZSBDRE5TX1VBUlRfSVJSWF9QV0lEVEgJMHgzQyAgLyogSVIgTWluIFJlY2VpdmVkIFB1bHNlIFdpZHRoICovCiAjZGVmaW5lIENETlNfVUFSVF9JUlRYX1BXSURUSAkweDQwICAvKiBJUiBUcmFuc21pdHRlZCBwdWxzZSBXaWR0aCAqLwogI2RlZmluZSBDRE5TX1VBUlRfVFhXTQkJMHg0NCAgLyogVFggRklGTyBUcmlnZ2VyIExldmVsICovCisjZGVmaW5lIENETlNfVUFSVF9SWEJTCQkweDQ4ICAvKiBSWCBGSUZPIGJ5dGUgc3RhdHVzIHJlZ2lzdGVyICovCiAKIC8qIENvbnRyb2wgUmVnaXN0ZXIgQml0IERlZmluaXRpb25zICovCiAjZGVmaW5lIENETlNfVUFSVF9DUl9TVE9QQlJLCTB4MDAwMDAxMDAgIC8qIFN0b3AgVFggYnJlYWsgKi8KQEAgLTc5LDYgKzgwLDkgQEAKICNkZWZpbmUgQ0ROU19VQVJUX0NSX1RYUlNUCTB4MDAwMDAwMDIgIC8qIFRYIGxvZ2ljIHJlc2V0ICovCiAjZGVmaW5lIENETlNfVUFSVF9DUl9SWFJTVAkweDAwMDAwMDAxICAvKiBSWCBsb2dpYyByZXNldCAqLwogI2RlZmluZSBDRE5TX1VBUlRfQ1JfUlNUX1RPCTB4MDAwMDAwNDAgIC8qIFJlc3RhcnQgVGltZW91dCBDb3VudGVyICovCisjZGVmaW5lIENETlNfVUFSVF9SWEJTX1BBUklUWSAgICAweDAwMDAwMDAxIC8qIFBhcml0eSBlcnJvciBzdGF0dXMgKi8KKyNkZWZpbmUgQ0ROU19VQVJUX1JYQlNfRlJBTUlORyAgIDB4MDAwMDAwMDIgLyogRnJhbWluZyBlcnJvciBzdGF0dXMgKi8KKyNkZWZpbmUgQ0ROU19VQVJUX1JYQlNfQlJLICAgICAgIDB4MDAwMDAwMDQgLyogT3ZlcnJ1biBlcnJvciBzdGF0dXMgKi8KIAogLyoKICAqIE1vZGUgUmVnaXN0ZXI6CkBAIC0xMjYsMTMgKzEzMCwyNyBAQAogI2RlZmluZSBDRE5TX1VBUlRfSVhSX1JYRU1QVFkJMHgwMDAwMDAwMiAvKiBSWCBGSUZPIGVtcHR5IGludGVycnVwdC4gKi8KICNkZWZpbmUgQ0ROU19VQVJUX0lYUl9NQVNLCTB4MDAwMDFGRkYgLyogVmFsaWQgYml0IG1hc2sgKi8KIAotI2RlZmluZSBDRE5TX1VBUlRfUlhfSVJRUwkoQ0ROU19VQVJUX0lYUl9QQVJJVFkgfCBDRE5TX1VBUlRfSVhSX0ZSQU1JTkcgfCBcCi0JCQkJIENETlNfVUFSVF9JWFJfT1ZFUlJVTiB8IENETlNfVUFSVF9JWFJfUlhUUklHIHwgXAorCS8qCisJICogRG8gbm90IGVuYWJsZSBwYXJpdHkgZXJyb3IgaW50ZXJydXB0IGZvciB0aGUgZm9sbG93aW5nCisJICogcmVhc29uOiBXaGVuIHBhcml0eSBlcnJvciBpbnRlcnJ1cHQgaXMgZW5hYmxlZCwgZWFjaCBSeAorCSAqIHBhcml0eSBlcnJvciBhbHdheXMgcmVzdWx0cyBpbiAyIGV2ZW50cy4gVGhlIGZpcnN0IG9uZQorCSAqIGJlaW5nIHBhcml0eSBlcnJvciBpbnRlcnJ1cHQgYW5kIHRoZSBzZWNvbmQgb25lIHdpdGggYQorCSAqIHByb3BlciBSeCBpbnRlcnJ1cHQgd2l0aCB0aGUgaW5jb21pbmcgZGF0YS4gIERpc2FibGluZworCSAqIHBhcml0eSBlcnJvciBpbnRlcnJ1cHQgZW5zdXJlcyBiZXR0ZXIgaGFuZGxpbmcgb2YgcGFyaXR5CisJICogZXJyb3IgZXZlbnRzLiBXaXRoIHRoaXMgY2hhbmdlLCBmb3IgYSBwYXJpdHkgZXJyb3IgY2FzZSwgd2UKKwkgKiBnZXQgYSBSeCBpbnRlcnJ1cHQgd2l0aCBwYXJpdHkgZXJyb3Igc2V0IGluIElTUiByZWdpc3RlcgorCSAqIGFuZCB3ZSBzdGlsbCBoYW5kbGUgcGFyaXR5IGVycm9ycyBpbiB0aGUgZGVzaXJlZCB3YXkuCisJICovCisKKyNkZWZpbmUgQ0ROU19VQVJUX1JYX0lSUVMJKENETlNfVUFSVF9JWFJfRlJBTUlORyB8IFwKKwkJCQkgQ0ROU19VQVJUX0lYUl9PVkVSUlVOIHwgXAorCQkJCSBDRE5TX1VBUlRfSVhSX1JYVFJJRyB8CSBcCiAJCQkJIENETlNfVUFSVF9JWFJfVE9VVCkKIAogLyogR29lcyBpbiByZWFkX3N0YXR1c19tYXNrIGZvciBicmVhayBkZXRlY3Rpb24gYXMgdGhlIEhXIGRvZXNuJ3QgZG8gaXQqLwotI2RlZmluZSBDRE5TX1VBUlRfSVhSX0JSSwkweDgwMDAwMDAwCisjZGVmaW5lIENETlNfVUFSVF9JWFJfQlJLCTB4MDAwMDIwMDAKIAorI2RlZmluZSBDRE5TX1VBUlRfUlhCU19TVVBQT1JUIEJJVCgxKQogLyoKICAqIE1vZGVtIENvbnRyb2wgcmVnaXN0ZXI6CiAgKiBUaGUgcmVhZC93cml0ZSBNb2RlbSBDb250cm9sIHJlZ2lzdGVyIGNvbnRyb2xzIHRoZSBpbnRlcmZhY2Ugd2l0aCB0aGUgbW9kZW0KQEAgLTE3Miw0NiArMTkwLDY2IEBACiAJc3RydWN0IGNsawkJKnBjbGs7CiAJdW5zaWduZWQgaW50CQliYXVkOwogCXN0cnVjdCBub3RpZmllcl9ibG9jawljbGtfcmF0ZV9jaGFuZ2VfbmI7CisJdTMyCQkJcXVpcmtzOworfTsKK3N0cnVjdCBjZG5zX3BsYXRmb3JtX2RhdGEgeworCXUzMiBxdWlya3M7CiB9OwogI2RlZmluZSB0b19jZG5zX3VhcnQoX25iKSBjb250YWluZXJfb2YoX25iLCBzdHJ1Y3QgY2Ruc191YXJ0LCBcCiAJCWNsa19yYXRlX2NoYW5nZV9uYik7CiAKLXN0YXRpYyB2b2lkIGNkbnNfdWFydF9oYW5kbGVfcngoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGlzcnN0YXR1cykKKy8qKgorICogY2Ruc191YXJ0X2hhbmRsZV9yeCAtIEhhbmRsZSB0aGUgcmVjZWl2ZWQgYnl0ZXMgYWxvbmcgd2l0aCBSeCBlcnJvcnMuCisgKiBAZGV2X2lkOiBJZCBvZiB0aGUgVUFSVCBwb3J0CisgKiBAaXNyc3RhdHVzOiBUaGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciB2YWx1ZSBhcyByZWFkCisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgY2Ruc191YXJ0X2hhbmRsZV9yeCh2b2lkICpkZXZfaWQsIHVuc2lnbmVkIGludCBpc3JzdGF0dXMpCiB7Ci0JLyoKLQkgKiBUaGVyZSBpcyBubyBoYXJkd2FyZSBicmVhayBkZXRlY3Rpb24sIHNvIHdlIGludGVycHJldCBmcmFtaW5nCi0JICogZXJyb3Igd2l0aCBhbGwtemVyb3MgZGF0YSBhcyBhIGJyZWFrIHNlcXVlbmNlLiBNb3N0IG9mIHRoZSB0aW1lLAotCSAqIHRoZXJlJ3MgYW5vdGhlciBub24temVybyBieXRlIGF0IHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLgotCSAqLwotCWlmIChpc3JzdGF0dXMgJiBDRE5TX1VBUlRfSVhSX0ZSQU1JTkcpIHsKLQkJd2hpbGUgKCEocmVhZGwocG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9TUikgJgotCQkJCQlDRE5TX1VBUlRfU1JfUlhFTVBUWSkpIHsKLQkJCWlmICghcmVhZGwocG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9GSUZPKSkgeworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAoc3RydWN0IHVhcnRfcG9ydCAqKWRldl9pZDsKKwlzdHJ1Y3QgY2Ruc191YXJ0ICpjZG5zX3VhcnQgPSBwb3J0LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IGRhdGE7CisJdW5zaWduZWQgaW50IHJ4YnNfc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzX21hc2s7CisJdW5zaWduZWQgaW50IGZyYW1lcnJwcm9jZXNzZWQgPSAwOworCWNoYXIgc3RhdHVzID0gVFRZX05PUk1BTDsKKwlib29sIGlzX3J4YnNfc3VwcG9ydDsKKworCWlzX3J4YnNfc3VwcG9ydCA9IGNkbnNfdWFydC0+cXVpcmtzICYgQ0ROU19VQVJUX1JYQlNfU1VQUE9SVDsKKworCXdoaWxlICgocmVhZGwocG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9TUikgJgorCQlDRE5TX1VBUlRfU1JfUlhFTVBUWSkgIT0gQ0ROU19VQVJUX1NSX1JYRU1QVFkpIHsKKwkJaWYgKGlzX3J4YnNfc3VwcG9ydCkKKwkJCXJ4YnNfc3RhdHVzID0gcmVhZGwocG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9SWEJTKTsKKwkJZGF0YSA9IHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfRklGTyk7CisJCXBvcnQtPmljb3VudC5yeCsrOworCQkvKgorCQkgKiBUaGVyZSBpcyBubyBoYXJkd2FyZSBicmVhayBkZXRlY3Rpb24gaW4gWnlucSwgc28gd2UgaW50ZXJwcmV0CisJCSAqIGZyYW1pbmcgZXJyb3Igd2l0aCBhbGwtemVyb3MgZGF0YSBhcyBhIGJyZWFrIHNlcXVlbmNlLgorCQkgKiBNb3N0IG9mIHRoZSB0aW1lLCB0aGVyZSdzIGFub3RoZXIgbm9uLXplcm8gYnl0ZSBhdCB0aGUKKwkJICogZW5kIG9mIHRoZSBzZXF1ZW5jZS4KKwkJICovCisJCWlmICghaXNfcnhic19zdXBwb3J0ICYmIChpc3JzdGF0dXMgJiBDRE5TX1VBUlRfSVhSX0ZSQU1JTkcpKSB7CisJCQlpZiAoIWRhdGEpIHsKIAkJCQlwb3J0LT5yZWFkX3N0YXR1c19tYXNrIHw9IENETlNfVUFSVF9JWFJfQlJLOwotCQkJCWlzcnN0YXR1cyAmPSB+Q0ROU19VQVJUX0lYUl9GUkFNSU5HOworCQkJCWZyYW1lcnJwcm9jZXNzZWQgPSAxOworCQkJCWNvbnRpbnVlOwogCQkJfQogCQl9Ci0JCXdyaXRlbChDRE5TX1VBUlRfSVhSX0ZSQU1JTkcsIHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfSVNSKTsKLQl9CisJCWlmIChpc19yeGJzX3N1cHBvcnQgJiYgKHJ4YnNfc3RhdHVzICYgQ0ROU19VQVJUX1JYQlNfQlJLKSkgeworCQkJcG9ydC0+aWNvdW50LmJyaysrOworCQkJc3RhdHVzID0gVFRZX0JSRUFLOworCQkJaWYgKHVhcnRfaGFuZGxlX2JyZWFrKHBvcnQpKQorCQkJCWNvbnRpbnVlOworCQl9CiAKLQkvKiBkcm9wIGJ5dGUgd2l0aCBwYXJpdHkgZXJyb3IgaWYgSUdOUEFSIHNwZWNpZmllZCAqLwotCWlmIChpc3JzdGF0dXMgJiBwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgJiBDRE5TX1VBUlRfSVhSX1BBUklUWSkKLQkJaXNyc3RhdHVzICY9IH4oQ0ROU19VQVJUX0lYUl9SWFRSSUcgfCBDRE5TX1VBUlRfSVhSX1RPVVQpOworCQlpc3JzdGF0dXMgJj0gcG9ydC0+cmVhZF9zdGF0dXNfbWFzazsKKwkJaXNyc3RhdHVzICY9IH5wb3J0LT5pZ25vcmVfc3RhdHVzX21hc2s7CisJCXN0YXR1c19tYXNrID0gcG9ydC0+cmVhZF9zdGF0dXNfbWFzazsKKwkJc3RhdHVzX21hc2sgJj0gfnBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzazsKIAotCWlzcnN0YXR1cyAmPSBwb3J0LT5yZWFkX3N0YXR1c19tYXNrOwotCWlzcnN0YXR1cyAmPSB+cG9ydC0+aWdub3JlX3N0YXR1c19tYXNrOwotCi0JaWYgKCEoaXNyc3RhdHVzICYgKENETlNfVUFSVF9JWFJfVE9VVCB8IENETlNfVUFSVF9JWFJfUlhUUklHKSkpCi0JCXJldHVybjsKLQotCXdoaWxlICghKHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfU1IpICYgQ0ROU19VQVJUX1NSX1JYRU1QVFkpKSB7Ci0JCXUzMiBkYXRhOwotCQljaGFyIHN0YXR1cyA9IFRUWV9OT1JNQUw7Ci0KLQkJZGF0YSA9IHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfRklGTyk7Ci0KLQkJLyogTm9uLU5VTEwgYnl0ZSBhZnRlciBCUkVBSyBpcyBnYXJiYWdlICg5OSUpICovCi0JCWlmIChkYXRhICYmIChwb3J0LT5yZWFkX3N0YXR1c19tYXNrICYgQ0ROU19VQVJUX0lYUl9CUkspKSB7CisJCWlmIChkYXRhICYmCisJCSAgICAocG9ydC0+cmVhZF9zdGF0dXNfbWFzayAmIENETlNfVUFSVF9JWFJfQlJLKSkgewogCQkJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayAmPSB+Q0ROU19VQVJUX0lYUl9CUks7CiAJCQlwb3J0LT5pY291bnQuYnJrKys7CiAJCQlpZiAodWFydF9oYW5kbGVfYnJlYWsocG9ydCkpCkBAIC0yMjEsNTcgKzI1OSw4MyBAQAogCQlpZiAodWFydF9oYW5kbGVfc3lzcnFfY2hhcihwb3J0LCBkYXRhKSkKIAkJCWNvbnRpbnVlOwogCi0JCXBvcnQtPmljb3VudC5yeCsrOwotCi0JCWlmIChpc3JzdGF0dXMgJiBDRE5TX1VBUlRfSVhSX1BBUklUWSkgewotCQkJcG9ydC0+aWNvdW50LnBhcml0eSsrOwotCQkJc3RhdHVzID0gVFRZX1BBUklUWTsKLQkJfSBlbHNlIGlmIChpc3JzdGF0dXMgJiBDRE5TX1VBUlRfSVhSX0ZSQU1JTkcpIHsKLQkJCXBvcnQtPmljb3VudC5mcmFtZSsrOwotCQkJc3RhdHVzID0gVFRZX0ZSQU1FOwotCQl9IGVsc2UgaWYgKGlzcnN0YXR1cyAmIENETlNfVUFSVF9JWFJfT1ZFUlJVTikgewotCQkJcG9ydC0+aWNvdW50Lm92ZXJydW4rKzsKKwkJaWYgKGlzX3J4YnNfc3VwcG9ydCkgeworCQkJaWYgKChyeGJzX3N0YXR1cyAmIENETlNfVUFSVF9SWEJTX1BBUklUWSkKKwkJCSAgICAmJiAoc3RhdHVzX21hc2sgJiBDRE5TX1VBUlRfSVhSX1BBUklUWSkpIHsKKwkJCQlwb3J0LT5pY291bnQucGFyaXR5Kys7CisJCQkJc3RhdHVzID0gVFRZX1BBUklUWTsKKwkJCX0KKwkJCWlmICgocnhic19zdGF0dXMgJiBDRE5TX1VBUlRfUlhCU19GUkFNSU5HKQorCQkJICAgICYmIChzdGF0dXNfbWFzayAmIENETlNfVUFSVF9JWFJfUEFSSVRZKSkgeworCQkJCXBvcnQtPmljb3VudC5mcmFtZSsrOworCQkJCXN0YXR1cyA9IFRUWV9GUkFNRTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChpc3JzdGF0dXMgJiBDRE5TX1VBUlRfSVhSX1BBUklUWSkgeworCQkJCXBvcnQtPmljb3VudC5wYXJpdHkrKzsKKwkJCQlzdGF0dXMgPSBUVFlfUEFSSVRZOworCQkJfQorCQkJaWYgKChpc3JzdGF0dXMgJiBDRE5TX1VBUlRfSVhSX0ZSQU1JTkcpICYmCisJCQkgICAgIWZyYW1lcnJwcm9jZXNzZWQpIHsKKwkJCQlwb3J0LT5pY291bnQuZnJhbWUrKzsKKwkJCQlzdGF0dXMgPSBUVFlfRlJBTUU7CisJCQl9CiAJCX0KLQotCQl1YXJ0X2luc2VydF9jaGFyKHBvcnQsIGlzcnN0YXR1cywgQ0ROU19VQVJUX0lYUl9PVkVSUlVOLAotCQkJCSBkYXRhLCBzdGF0dXMpOworCQlpZiAoaXNyc3RhdHVzICYgQ0ROU19VQVJUX0lYUl9PVkVSUlVOKSB7CisJCQlwb3J0LT5pY291bnQub3ZlcnJ1bisrOworCQkJdHR5X2luc2VydF9mbGlwX2NoYXIoJnBvcnQtPnN0YXRlLT5wb3J0LCAwLAorCQkJCQkgICAgIFRUWV9PVkVSUlVOKTsKKwkJfQorCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcigmcG9ydC0+c3RhdGUtPnBvcnQsIGRhdGEsIHN0YXR1cyk7CisJCWlzcnN0YXR1cyA9IDA7CiAJfQorCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKIAl0dHlfZmxpcF9idWZmZXJfcHVzaCgmcG9ydC0+c3RhdGUtPnBvcnQpOworCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIGNkbnNfdWFydF9oYW5kbGVfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKKy8qKgorICogY2Ruc191YXJ0X2hhbmRsZV90eCAtIEhhbmRsZSB0aGUgYnl0ZXMgdG8gYmUgVHhlZC4KKyAqIEBkZXZfaWQ6IElkIG9mIHRoZSBVQVJUIHBvcnQKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBjZG5zX3VhcnRfaGFuZGxlX3R4KHZvaWQgKmRldl9pZCkKIHsKKwlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1YXJ0X3BvcnQgKilkZXZfaWQ7CiAJdW5zaWduZWQgaW50IG51bWJ5dGVzOwogCiAJaWYgKHVhcnRfY2lyY19lbXB0eSgmcG9ydC0+c3RhdGUtPnhtaXQpKSB7CiAJCXdyaXRlbChDRE5TX1VBUlRfSVhSX1RYRU1QVFksIHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfSURSKTsKLQkJcmV0dXJuOworCX0gZWxzZSB7CisJCW51bWJ5dGVzID0gcG9ydC0+Zmlmb3NpemU7CisJCXdoaWxlIChudW1ieXRlcyAmJiAhdWFydF9jaXJjX2VtcHR5KCZwb3J0LT5zdGF0ZS0+eG1pdCkgJiYKKwkJICAgICAgICEocmVhZGwocG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9TUikgJiBDRE5TX1VBUlRfU1JfVFhGVUxMKSkgeworCQkJLyoKKwkJCSAqIEdldCB0aGUgZGF0YSBmcm9tIHRoZSBVQVJUIGNpcmN1bGFyIGJ1ZmZlcgorCQkJICogYW5kIHdyaXRlIGl0IHRvIHRoZSBjZG5zX3VhcnQncyBUWF9GSUZPCisJCQkgKiByZWdpc3Rlci4KKwkJCSAqLworCQkJd3JpdGVsKAorCQkJCXBvcnQtPnN0YXRlLT54bWl0LmJ1Zltwb3J0LT5zdGF0ZS0+eG1pdC4KKwkJCQl0YWlsXSwgcG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9GSUZPKTsKKworCQkJcG9ydC0+aWNvdW50LnR4Kys7CisKKwkJCS8qCisJCQkgKiBBZGp1c3QgdGhlIHRhaWwgb2YgdGhlIFVBUlQgYnVmZmVyIGFuZCB3cmFwCisJCQkgKiB0aGUgYnVmZmVyIGlmIGl0IHJlYWNoZXMgbGltaXQuCisJCQkgKi8KKwkJCXBvcnQtPnN0YXRlLT54bWl0LnRhaWwgPQorCQkJCShwb3J0LT5zdGF0ZS0+eG1pdC50YWlsICsgMSkgJgorCQkJCQkoVUFSVF9YTUlUX1NJWkUgLSAxKTsKKworCQkJbnVtYnl0ZXMtLTsKKwkJfQorCisJCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZygKKwkJCQkmcG9ydC0+c3RhdGUtPnhtaXQpIDwgV0FLRVVQX0NIQVJTKQorCQkJdWFydF93cml0ZV93YWtldXAocG9ydCk7CiAJfQotCi0JbnVtYnl0ZXMgPSBwb3J0LT5maWZvc2l6ZTsKLQl3aGlsZSAobnVtYnl0ZXMgJiYgIXVhcnRfY2lyY19lbXB0eSgmcG9ydC0+c3RhdGUtPnhtaXQpICYmCi0JICAgICAgICEocmVhZGwocG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9TUikgJiBDRE5TX1VBUlRfU1JfVFhGVUxMKSkgewotCQkvKgotCQkgKiBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgVUFSVCBjaXJjdWxhciBidWZmZXIKLQkJICogYW5kIHdyaXRlIGl0IHRvIHRoZSBjZG5zX3VhcnQncyBUWF9GSUZPCi0JCSAqIHJlZ2lzdGVyLgotCQkgKi8KLQkJd3JpdGVsKHBvcnQtPnN0YXRlLT54bWl0LmJ1Zltwb3J0LT5zdGF0ZS0+eG1pdC50YWlsXSwKLQkJCXBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfRklGTyk7Ci0JCXBvcnQtPmljb3VudC50eCsrOwotCi0JCS8qCi0JCSAqIEFkanVzdCB0aGUgdGFpbCBvZiB0aGUgVUFSVCBidWZmZXIgYW5kIHdyYXAKLQkJICogdGhlIGJ1ZmZlciBpZiBpdCByZWFjaGVzIGxpbWl0LgotCQkgKi8KLQkJcG9ydC0+c3RhdGUtPnhtaXQudGFpbCA9Ci0JCQkocG9ydC0+c3RhdGUtPnhtaXQudGFpbCArIDEpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7Ci0KLQkJbnVtYnl0ZXMtLTsKLQl9Ci0KLQlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoJnBvcnQtPnN0YXRlLT54bWl0KSA8IFdBS0VVUF9DSEFSUykKLQkJdWFydF93cml0ZV93YWtldXAocG9ydCk7CiB9CiAKIC8qKgpAQCAtMjg0LDI3ICszNDgsMjQgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBjZG5zX3VhcnRfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1YXJ0X3BvcnQgKilkZXZfaWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgaXNyc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJnBvcnQtPmxvY2spOwogCiAJLyogUmVhZCB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciB0byBkZXRlcm1pbmUgd2hpY2gKLQkgKiBpbnRlcnJ1cHQocykgaXMvYXJlIGFjdGl2ZS4KKwkgKiBpbnRlcnJ1cHQocykgaXMvYXJlIGFjdGl2ZSBhbmQgY2xlYXIgdGhlbS4KIAkgKi8KIAlpc3JzdGF0dXMgPSByZWFkbChwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0lTUik7Ci0KLQlpZiAoaXNyc3RhdHVzICYgQ0ROU19VQVJUX1JYX0lSUVMpCi0JCWNkbnNfdWFydF9oYW5kbGVfcngocG9ydCwgaXNyc3RhdHVzKTsKLQotCWlmICgoaXNyc3RhdHVzICYgQ0ROU19VQVJUX0lYUl9UWEVNUFRZKSA9PSBDRE5TX1VBUlRfSVhSX1RYRU1QVFkpCi0JCWNkbnNfdWFydF9oYW5kbGVfdHgocG9ydCk7Ci0KIAl3cml0ZWwoaXNyc3RhdHVzLCBwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0lTUik7CiAKLQkvKiBiZSBzdXJlIHRvIHJlbGVhc2UgdGhlIGxvY2sgYW5kIHR0eSBiZWZvcmUgbGVhdmluZyAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlpZiAoaXNyc3RhdHVzICYgQ0ROU19VQVJUX0lYUl9UWEVNUFRZKSB7CisJCWNkbnNfdWFydF9oYW5kbGVfdHgoZGV2X2lkKTsKKwkJaXNyc3RhdHVzICY9IH5DRE5TX1VBUlRfSVhSX1RYRU1QVFk7CisJfQorCWlmIChpc3JzdGF0dXMgJiBDRE5TX1VBUlRfSVhSX01BU0spCisJCWNkbnNfdWFydF9oYW5kbGVfcngoZGV2X2lkLCBpc3JzdGF0dXMpOwogCisJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtNjUzLDYgKzcxNCwxMCBAQAogCWN0cmxfcmVnIHw9IENETlNfVUFSVF9DUl9UWFJTVCB8IENETlNfVUFSVF9DUl9SWFJTVDsKIAl3cml0ZWwoY3RybF9yZWcsIHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfQ1IpOwogCisJd2hpbGUgKHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfQ1IpICYKKwkJKENETlNfVUFSVF9DUl9UWFJTVCB8IENETlNfVUFSVF9DUl9SWFJTVCkpCisJCWNwdV9yZWxheCgpOworCiAJLyoKIAkgKiBDbGVhciB0aGUgUlggZGlzYWJsZSBhbmQgVFggZGlzYWJsZSBiaXRzIGFuZCB0aGVuIHNldCB0aGUgVFggZW5hYmxlCiAJICogYml0IGFuZCBSWCBlbmFibGUgYml0IHRvIGVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyLgpAQCAtNzM2LDEwICs4MDEsMTQgQEAKICAqLwogc3RhdGljIGludCBjZG5zX3VhcnRfc3RhcnR1cChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogeworCXN0cnVjdCBjZG5zX3VhcnQgKmNkbnNfdWFydCA9IHBvcnQtPnByaXZhdGVfZGF0YTsKKwlib29sIGlzX2Jya19zdXBwb3J0OwogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzID0gMDsKIAorCWlzX2Jya19zdXBwb3J0ID0gY2Ruc191YXJ0LT5xdWlya3MgJiBDRE5TX1VBUlRfUlhCU19TVVBQT1JUOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAogCS8qIERpc2FibGUgdGhlIFRYIGFuZCBSWCAqLwpAQCAtNzUyLDYgKzgyMSwxMCBAQAogCXdyaXRlbChDRE5TX1VBUlRfQ1JfVFhSU1QgfCBDRE5TX1VBUlRfQ1JfUlhSU1QsCiAJCQlwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0NSKTsKIAorCXdoaWxlIChyZWFkbChwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0NSKSAmCisJCShDRE5TX1VBUlRfQ1JfVFhSU1QgfCBDRE5TX1VBUlRfQ1JfUlhSU1QpKQorCQljcHVfcmVsYXgoKTsKKwogCS8qCiAJICogQ2xlYXIgdGhlIFJYIGRpc2FibGUgYml0IGFuZCB0aGVuIHNldCB0aGUgUlggZW5hYmxlIGJpdCB0byBlbmFibGUKIAkgKiB0aGUgcmVjZWl2ZXIuCkBAIC03OTQsNyArODY3LDExIEBACiAJfQogCiAJLyogU2V0IHRoZSBJbnRlcnJ1cHQgUmVnaXN0ZXJzIHdpdGggZGVzaXJlZCBpbnRlcnJ1cHRzICovCi0Jd3JpdGVsKENETlNfVUFSVF9SWF9JUlFTLCBwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0lFUik7CisJaWYgKGlzX2Jya19zdXBwb3J0KQorCQl3cml0ZWwoQ0ROU19VQVJUX1JYX0lSUVMgfCBDRE5TX1VBUlRfSVhSX0JSSywKKwkJCQkJcG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9JRVIpOworCWVsc2UKKwkJd3JpdGVsKENETlNfVUFSVF9SWF9JUlFTLCBwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0lFUik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTk5Myw3ICsxMDcwLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgY2Ruc191YXJ0X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgY2Ruc191YXJ0X29wcyA9IHsKIAkuc2V0X21jdHJsCT0gY2Ruc191YXJ0X3NldF9tY3RybCwKIAkuZ2V0X21jdHJsCT0gY2Ruc191YXJ0X2dldF9tY3RybCwKIAkuc3RhcnRfdHgJPSBjZG5zX3VhcnRfc3RhcnRfdHgsCkBAIC0xMDg4LDkgKzExNjUsMzQgQEAKIHN0YXRpYyBpbnQgX19pbml0IGNkbnNfZWFybHlfY29uc29sZV9zZXR1cChzdHJ1Y3QgZWFybHljb25fZGV2aWNlICpkZXZpY2UsCiAJCQkJCSAgIGNvbnN0IGNoYXIgKm9wdCkKIHsKLQlpZiAoIWRldmljZS0+cG9ydC5tZW1iYXNlKQorCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAmZGV2aWNlLT5wb3J0OworCisJaWYgKCFwb3J0LT5tZW1iYXNlKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCS8qIGluaXRpYWxpc2UgY29udHJvbCByZWdpc3RlciAqLworCXdyaXRlbChDRE5TX1VBUlRfQ1JfVFhfRU58Q0ROU19VQVJUX0NSX1RYUlNUfENETlNfVUFSVF9DUl9SWFJTVCwKKwkgICAgICAgcG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9DUik7CisKKwkvKiBvbmx5IHNldCBiYXVkIGlmIHNwZWNpZmllZCBvbiBjb21tYW5kIGxpbmUgLSBvdGhlcndpc2UKKwkgKiBhc3N1bWUgaXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYnkgYSBib290IGxvYWRlci4KKwkgKi8KKwlpZiAoZGV2aWNlLT5iYXVkKSB7CisJCXUzMiBjZCA9IDAsIGJkaXYgPSAwOworCQl1MzIgbXI7CisJCWludCBkaXY4OworCisJCWNkbnNfdWFydF9jYWxjX2JhdWRfZGl2cyhwb3J0LT51YXJ0Y2xrLCBkZXZpY2UtPmJhdWQsCisJCQkJCSAmYmRpdiwgJmNkLCAmZGl2OCk7CisJCW1yID0gQ0ROU19VQVJUX01SX1BBUklUWV9OT05FOworCQlpZiAoZGl2OCkKKwkJCW1yIHw9IENETlNfVUFSVF9NUl9DTEtTRUw7CisKKwkJd3JpdGVsKG1yLCAgIHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfTVIpOworCQl3cml0ZWwoY2QsICAgcG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9CQVVER0VOKTsKKwkJd3JpdGVsKGJkaXYsIHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfQkFVRERJVik7CisJfQorCiAJZGV2aWNlLT5jb24tPndyaXRlID0gY2Ruc19lYXJseV93cml0ZTsKIAogCXJldHVybiAwOwpAQCAtMTMyOCw2ICsxNDMwLDE4IEBACiBzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoY2Ruc191YXJ0X2Rldl9wbV9vcHMsIGNkbnNfdWFydF9zdXNwZW5kLAogCQljZG5zX3VhcnRfcmVzdW1lKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBjZG5zX3BsYXRmb3JtX2RhdGEgenlucW1wX3VhcnRfZGVmID0geworCQkJCS5xdWlya3MgPSBDRE5TX1VBUlRfUlhCU19TVVBQT1JULCB9OworCisvKiBNYXRjaCB0YWJsZSBmb3Igb2ZfcGxhdGZvcm0gYmluZGluZyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY2Ruc191YXJ0X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ4bG54LHh1YXJ0cHMiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiY2Rucyx1YXJ0LXIxcDgiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiY2Rucyx1YXJ0LXIxcDEyIiwgLmRhdGEgPSAmenlucW1wX3VhcnRfZGVmIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBjZG5zX3VhcnRfb2ZfbWF0Y2gpOworCiAvKioKICAqIGNkbnNfdWFydF9wcm9iZSAtIFBsYXRmb3JtIGRyaXZlciBwcm9iZQogICogQHBkZXY6IFBvaW50ZXIgdG8gdGhlIHBsYXRmb3JtIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTEzNDAsMTIgKzE0NTQsMjAgQEAKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0OwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBjZG5zX3VhcnQgKmNkbnNfdWFydF9kYXRhOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCiAJY2Ruc191YXJ0X2RhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjZG5zX3VhcnRfZGF0YSksCiAJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIWNkbnNfdWFydF9kYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShjZG5zX3VhcnRfb2ZfbWF0Y2gsIHBkZXYtPmRldi5vZl9ub2RlKTsKKwlpZiAobWF0Y2ggJiYgbWF0Y2gtPmRhdGEpIHsKKwkJY29uc3Qgc3RydWN0IGNkbnNfcGxhdGZvcm1fZGF0YSAqZGF0YSA9IG1hdGNoLT5kYXRhOworCisJCWNkbnNfdWFydF9kYXRhLT5xdWlya3MgPSBkYXRhLT5xdWlya3M7CisJfQorCiAJY2Ruc191YXJ0X2RhdGEtPnBjbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInBjbGsiKTsKIAlpZiAoSVNfRVJSKGNkbnNfdWFydF9kYXRhLT5wY2xrKSkgewogCQljZG5zX3VhcnRfZGF0YS0+cGNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiYXBlcl9jbGsiKTsKQEAgLTE0NzEsMTQgKzE1OTMsNiBAQAogCXJldHVybiByYzsKIH0KIAotLyogTWF0Y2ggdGFibGUgZm9yIG9mX3BsYXRmb3JtIGJpbmRpbmcgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNkbnNfdWFydF9vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAieGxueCx4dWFydHBzIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImNkbnMsdWFydC1yMXA4IiwgfSwKLQl7fQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGNkbnNfdWFydF9vZl9tYXRjaCk7Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNkbnNfdWFydF9wbGF0Zm9ybV9kcml2ZXIgPSB7CiAJLnByb2JlICAgPSBjZG5zX3VhcnRfcHJvYmUsCiAJLnJlbW92ZSAgPSBjZG5zX3VhcnRfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvdnQvdnQuYyBiL2RyaXZlcnMvdHR5L3Z0L3Z0LmMKaW5kZXggMjcwNWNhOS4uZTg0MWE0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvdnQvdnQuYworKysgYi9kcml2ZXJzL3R0eS92dC92dC5jCkBAIC0xMzEyLDEyICsxMzEyLDEyIEBACiAJaWYgKGkgPiB2Yy0+dmNfbnBhcikKIAkJcmV0dXJuIGk7CiAKLQlpZiAodmMtPnZjX3BhcltpXSA9PSA1ICYmIGkgPCB2Yy0+dmNfbnBhcikgewotCQkvKiAyNTYgY29sb3VycyAtLSB1YmlxdWl0b3VzICovCisJaWYgKHZjLT52Y19wYXJbaV0gPT0gNSAmJiBpICsgMSA8PSB2Yy0+dmNfbnBhcikgeworCQkvKiAyNTYgY29sb3VycyAqLwogCQlpKys7CiAJCXJnYl9mcm9tXzI1Nih2Yy0+dmNfcGFyW2ldLCAmYyk7Ci0JfSBlbHNlIGlmICh2Yy0+dmNfcGFyW2ldID09IDIgJiYgaSA8PSB2Yy0+dmNfbnBhciArIDMpIHsKLQkJLyogMjQgYml0IC0tIGV4dHJlbWVseSByYXJlICovCisJfSBlbHNlIGlmICh2Yy0+dmNfcGFyW2ldID09IDIgJiYgaSArIDMgPD0gdmMtPnZjX25wYXIpIHsKKwkJLyogMjQgYml0ICovCiAJCWMuciA9IHZjLT52Y19wYXJbaSArIDFdOwogCQljLmcgPSB2Yy0+dmNfcGFyW2kgKyAyXTsKIAkJYy5iID0gdmMtPnZjX3BhcltpICsgM107CkBAIC0xNDE1LDYgKzE0MTUsMTEgQEAKIAkJCQkodmMtPnZjX2NvbG9yICYgMHgwZik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKKwkJCWlmICh2Yy0+dmNfcGFyW2ldID49IDkwICYmIHZjLT52Y19wYXJbaV0gPD0gMTA3KSB7CisJCQkJaWYgKHZjLT52Y19wYXJbaV0gPCAxMDApCisJCQkJCXZjLT52Y19pbnRlbnNpdHkgPSAyOworCQkJCXZjLT52Y19wYXJbaV0gLT0gNjA7CisJCQl9CiAJCQlpZiAodmMtPnZjX3BhcltpXSA+PSAzMCAmJiB2Yy0+dmNfcGFyW2ldIDw9IDM3KQogCQkJCXZjLT52Y19jb2xvciA9IGNvbG9yX3RhYmxlW3ZjLT52Y19wYXJbaV0gLSAzMF0KIAkJCQkJfCAodmMtPnZjX2NvbG9yICYgMHhmMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Vpby91aW9fZG1lbV9nZW5pcnEuYyBiL2RyaXZlcnMvdWlvL3Vpb19kbWVtX2dlbmlycS5jCmluZGV4IDkxNWZhY2IuLmUxMTM0YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdWlvL3Vpb19kbWVtX2dlbmlycS5jCisrKyBiL2RyaXZlcnMvdWlvL3Vpb19kbWVtX2dlbmlycS5jCkBAIC0yMjksNyArMjI5LDcgQEAKIAkJKyt1aW9tZW07CiAJfQogCi0JcHJpdi0+ZG1lbV9yZWdpb25fc3RhcnQgPSBpOworCXByaXYtPmRtZW1fcmVnaW9uX3N0YXJ0ID0gdWlvbWVtIC0gJnVpb2luZm8tPm1lbVswXTsKIAlwcml2LT5udW1fZG1lbV9yZWdpb25zID0gcGRhdGEtPm51bV9keW5hbWljX3JlZ2lvbnM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9keW5hbWljX3JlZ2lvbnM7ICsraSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL0tjb25maWcKaW5kZXggODY4OWRjYi4uNjQ0ZTk3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9LY29uZmlnCkBAIC0xNTIsNyArMTUyLDggQEAKIAogY29uZmlnIFVTQl9MRURfVFJJRwogCWJvb2wgIlVTQiBMRUQgVHJpZ2dlcnMiCi0JZGVwZW5kcyBvbiBMRURTX0NMQVNTICYmIFVTQl9DT01NT04gJiYgTEVEU19UUklHR0VSUworCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBMRURTX1RSSUdHRVJTCisJc2VsZWN0IFVTQl9DT01NT04KIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhZGRzIExFRCB0cmlnZ2VycyBmb3IgVVNCIGhvc3QgYW5kL29yIGdhZGdldCBhY3Rpdml0eS4KIApAQCAtMTYwLDQgKzE2MSwyNSBAQAogCSAgTEVEcyBhbmQgeW91IHdhbnQgdG8gdXNlIHRoZW0gYXMgYWN0aXZpdHkgaW5kaWNhdG9ycyBmb3IgVVNCIGhvc3Qgb3IKIAkgIGdhZGdldC4KIAorY29uZmlnIFVTQl9VTFBJX0JVUworCXRyaXN0YXRlICJVU0IgVUxQSSBQSFkgaW50ZXJmYWNlIHN1cHBvcnQiCisJc2VsZWN0IFVTQl9DT01NT04KKwloZWxwCisJICBVVE1JKyBMb3cgUGluIEludGVyZmFjZSAoVUxQSSkgaXMgc3BlY2lmaWNhdGlvbiBmb3IgYSBjb21tb25seSB1c2VkCisJICBVU0IgMi4wIFBIWSBpbnRlcmZhY2UuIFRoZSBVTFBJIHNwZWNpZmljYXRpb24gZGVmaW5lcyBhIHN0YW5kYXJkIHNldAorCSAgb2YgcmVnaXN0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IHRoZSB2ZW5kb3IgYW5kIHByb2R1Y3Qgd2hpY2gKKwkgIGFsbG93cyBVTFBJIHRvIGJlIGhhbmRsZWQgYXMgYSBidXMuIFRoaXMgbW9kdWxlIGlzIHRoZSBkcml2ZXIgZm9yIHRoYXQKKwkgIGJ1cy4KKworCSAgVGhlIFVMUEkgaW50ZXJmYWNlcyAodGhlIGJ1c2VzKSBhcmUgcmVnaXN0ZXJlZCBieSB0aGUgZHJpdmVycyBmb3IgVVNCCisJICBjb250cm9sbGVycyB3aGljaCBzdXBwb3J0IFVMUEkgcmVnaXN0ZXIgYWNjZXNzIGFuZCBoYXZlIFVMUEkgUEhZCisJICBhdHRhY2hlZCB0byB0aGVtLiBUaGUgVUxQSSBQSFkgZHJpdmVycyB0aGVtc2VsdmVzIGFyZSBub3JtYWwgUEhZCisJICBkcml2ZXJzLgorCisJICBVTFBJIFBIWXMgcHJvdmlkZSBvZnRlbiBmdW5jdGlvbnMgc3VjaCBhcyBBRFAgc2Vuc2luZy9wcm9iaW5nIChPVEcKKwkgIHByb3RvY29sKSBhbmQgVVNCIGNoYXJnZXIgZGV0ZWN0aW9uLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCB1bHBpLgorCiBlbmRpZiAjIFVTQl9TVVBQT1JUCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vY3hhY3J1LmMgYi9kcml2ZXJzL3VzYi9hdG0vY3hhY3J1LmMKaW5kZXggMGE4NjZlOS4uZjlmZTg2YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYworKysgYi9kcml2ZXJzL3VzYi9hdG0vY3hhY3J1LmMKQEAgLTExMzksMTAgKzExMzksOCBAQAogCiAJLyogaW5zdGFuY2UgaW5pdCAqLwogCWluc3RhbmNlID0ga3phbGxvYyhzaXplb2YoKmluc3RhbmNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbnN0YW5jZSkgewotCQl1c2JfZGJnKHVzYmF0bV9pbnN0YW5jZSwgImN4YWNydV9iaW5kOiBubyBtZW1vcnkgZm9yIGluc3RhbmNlIGRhdGFcbiIpOworCWlmICghaW5zdGFuY2UpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWluc3RhbmNlLT51c2JhdG0gPSB1c2JhdG1faW5zdGFuY2U7CiAJaW5zdGFuY2UtPm1vZGVtX3R5cGUgPSAoc3RydWN0IGN4YWNydV9tb2RlbV90eXBlICopIGlkLT5kcml2ZXJfaW5mbzsKQEAgLTExNjgsMTMgKzExNjYsMTEgQEAKIAl9CiAJaW5zdGFuY2UtPnJjdl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCWlmICghaW5zdGFuY2UtPnJjdl91cmIpIHsKLQkJdXNiX2RiZyh1c2JhdG1faW5zdGFuY2UsICJjeGFjcnVfYmluZDogbm8gbWVtb3J5IGZvciByY3ZfdXJiXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmYWlsOwogCX0KIAlpbnN0YW5jZS0+c25kX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbnN0YW5jZS0+c25kX3VyYikgewotCQl1c2JfZGJnKHVzYmF0bV9pbnN0YW5jZSwgImN4YWNydV9iaW5kOiBubyBtZW1vcnkgZm9yIHNuZF91cmJcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMgYi9kcml2ZXJzL3VzYi9hdG0vc3BlZWR0Y2guYwppbmRleCAwMjcwZDEzLi41MDgzZWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vc3BlZWR0Y2guYworKysgYi9kcml2ZXJzL3VzYi9hdG0vc3BlZWR0Y2guYwpAQCAtODE3LDcgKzgxNyw2IEBACiAJaW5zdGFuY2UgPSBremFsbG9jKHNpemVvZigqaW5zdGFuY2UpLCBHRlBfS0VSTkVMKTsKIAogCWlmICghaW5zdGFuY2UpIHsKLQkJdXNiX2Vycih1c2JhdG0sICIlczogbm8gbWVtb3J5IGZvciBpbnN0YW5jZSBkYXRhIVxuIiwgX19mdW5jX18pOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWxfcmVsZWFzZTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jIGIvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYwppbmRleCA0MzMzZGM1Li5kZjY3ODE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCisrKyBiL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKQEAgLTIxOTYsMTcgKzIxOTYsMTIgQEAKIAkJbG9hZF9YSUxJTlhfZmlybXdhcmUoc2MpOwogCiAJaW50ciA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbnRyKSB7Ci0JCXVlYV9lcnIoSU5TX1RPX1VTQkRFVihzYyksCi0JCSAgICAgICAiY2Fubm90IGFsbG9jYXRlIGludGVycnVwdCBwYWNrYWdlXG4iKTsKKwlpZiAoIWludHIpCiAJCWdvdG8gZXJyMDsKLQl9CiAKIAlzYy0+dXJiX2ludCA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzYy0+dXJiX2ludCkgewotCQl1ZWFfZXJyKElOU19UT19VU0JERVYoc2MpLCAiY2Fubm90IGFsbG9jYXRlIGludGVycnVwdCBVUkJcbiIpOworCWlmICghc2MtPnVyYl9pbnQpCiAJCWdvdG8gZXJyMTsKLQl9CiAKIAl1c2JfZmlsbF9pbnRfdXJiKHNjLT51cmJfaW50LCBzYy0+dXNiX2RldiwKIAkJCSB1c2JfcmN2aW50cGlwZShzYy0+dXNiX2RldiwgVUVBX0lOVFJfUElQRSksCkBAIC0yNTYxLDEwICsyNTU2LDggQEAKIAl9CiAKIAlzYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1ZWFfc29mdGMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNjKSB7Ci0JCXVlYV9lcnIodXNiLCAidWVhX2luaXQ6IG5vdCBlbm91Z2ggbWVtb3J5ICFcbiIpOworCWlmICghc2MpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXNjLT51c2JfZGV2ID0gdXNiOwogCXVzYmF0bS0+ZHJpdmVyX2RhdGEgPSBzYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYyBiL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYwppbmRleCBkYjMyMmQ5Li40ZGVjOWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jCkBAIC04MTksNyArODE5LDYgQEAKIAogCW5ldyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JhdG1fdmNjX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ldykgewotCQlhdG1fZXJyKGluc3RhbmNlLCAiJXM6IG5vIG1lbW9yeSBmb3IgdmNjX2RhdGEhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC0xMDMyLDEwICsxMDMxLDggQEAKIAogCS8qIGluc3RhbmNlIGluaXQgKi8KIAlpbnN0YW5jZSA9IGt6YWxsb2Moc2l6ZW9mKCppbnN0YW5jZSkgKyBzaXplb2Yoc3RydWN0IHVyYiAqKSAqIChudW1fcmN2X3VyYnMgKyBudW1fc25kX3VyYnMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWluc3RhbmNlKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IG5vIG1lbW9yeSBmb3IgaW5zdGFuY2UgZGF0YSFcbiIsIF9fZnVuY19fKTsKKwlpZiAoIWluc3RhbmNlKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAkvKiBwdWJsaWMgZmllbGRzICovCiAKQEAgLTExNDEsNyArMTEzOCw2IEBACiAKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihpc29fcGFja2V0cywgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7Ci0JCQlkZXZfZXJyKGRldiwgIiVzOiBubyBtZW1vcnkgZm9yIHVyYiAlZCFcbiIsIF9fZnVuY19fLCBpKTsKIAkJCWVycm9yID0gLUVOT01FTTsKIAkJCWdvdG8gZmFpbF91bmJpbmQ7CiAJCX0KQEAgLTExNTEsNyArMTE0Nyw2IEBACiAJCS8qIHplcm8gdGhlIHR4IHBhZGRpbmcgdG8gYXZvaWQgbGVha2luZyBpbmZvcm1hdGlvbiAqLwogCQlidWZmZXIgPSBremFsbG9jKGNoYW5uZWwtPmJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFidWZmZXIpIHsKLQkJCWRldl9lcnIoZGV2LCAiJXM6IG5vIG1lbW9yeSBmb3IgYnVmZmVyICVkIVxuIiwgX19mdW5jX18sIGkpOwogCQkJZXJyb3IgPSAtRU5PTUVNOwogCQkJZ290byBmYWlsX3VuYmluZDsKIAkJfQpAQCAtMTE4Miw3ICsxMTc3LDYgQEAKIAlpbnN0YW5jZS0+Y2VsbF9idWYgPSBrbWFsbG9jKGluc3RhbmNlLT5yeF9jaGFubmVsLnN0cmlkZSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIWluc3RhbmNlLT5jZWxsX2J1ZikgewotCQlkZXZfZXJyKGRldiwgIiVzOiBubyBtZW1vcnkgZm9yIGNlbGwgYnVmZmVyIVxuIiwgX19mdW5jX18pOwogCQllcnJvciA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbF91bmJpbmQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY19pbXguYyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfaW14LmMKaW5kZXggZGVkYzMzZS4uMDk5MTc5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY19pbXguYworKysgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX2lteC5jCkBAIC0xNDAsNiArMTQwLDkgQEAKIAlpZiAob2ZfZmluZF9wcm9wZXJ0eShucCwgImRpc2FibGUtb3Zlci1jdXJyZW50IiwgTlVMTCkpCiAJCWRhdGEtPmRpc2FibGVfb2MgPSAxOwogCisJaWYgKG9mX2ZpbmRfcHJvcGVydHkobnAsICJvdmVyLWN1cnJlbnQtYWN0aXZlLWhpZ2giLCBOVUxMKSkKKwkJZGF0YS0+b2NfcG9sYXJpdHkgPSAxOworCiAJaWYgKG9mX2ZpbmRfcHJvcGVydHkobnAsICJleHRlcm5hbC12YnVzLWRpdmlkZXIiLCBOVUxMKSkKIAkJZGF0YS0+ZXZkbyA9IDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfaW14LmggYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX2lteC5oCmluZGV4IDYzNTcxN2UuLjQwOWFhNWNhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY19pbXguaAorKysgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX2lteC5oCkBAIC0xNyw2ICsxNyw3IEBACiAJaW50IGluZGV4OwogCiAJdW5zaWduZWQgaW50IGRpc2FibGVfb2M6MTsgLyogb3ZlciBjdXJyZW50IGRldGVjdCBkaXNhYmxlZCAqLworCXVuc2lnbmVkIGludCBvY19wb2xhcml0eToxOyAvKiBvdmVyIGN1cnJlbnQgcG9sYXJpdHkgaWYgb2MgZW5hYmxlZCAqLwogCXVuc2lnbmVkIGludCBldmRvOjE7IC8qIHNldCBleHRlcm5hbCB2YnVzIGRpdmlkZXIgb3B0aW9uICovCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9ob3N0LmMgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9ob3N0LmMKaW5kZXggMDUzYmFjOS4uOTZhZTY5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2hpcGlkZWEvaG9zdC5jCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2hvc3QuYwpAQCAtODEsMTIgKzgxLDE1IEBACiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gaGNkLT5zZWxmLmNvbnRyb2xsZXI7CiAJc3RydWN0IGNpX2hkcmMgKmNpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGVoY2lfaGNkICplaGNpID0gaGNkX3RvX2VoY2koaGNkKTsKIAlpbnQgcmV0OwogCiAJcmV0ID0gZWhjaV9zZXR1cChoY2QpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwllaGNpLT5uZWVkX2lvX3dhdGNoZG9nID0gMDsKKwogCWNpX3BsYXRmb3JtX2NvbmZpZ3VyZShjaSk7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2hpcGlkZWEvdWRjLmMgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS91ZGMuYwppbmRleCAwNjVmNWQ5Li42NjFmNDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS91ZGMuYwpAQCAtNTksNyArNTksNyBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBod19lcF9iaXQoaW50IG51bSwgaW50IGRpcikKIHsKLQlyZXR1cm4gbnVtICsgKGRpciA/IDE2IDogMCk7CisJcmV0dXJuIG51bSArICgoZGlyID09IFRYKSA/IDE2IDogMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGVwX3RvX2JpdChzdHJ1Y3QgY2lfaGRyYyAqY2ksIGludCBuKQpAQCAtMTIxLDkgKzEyMSw4IEBACiAgKi8KIHN0YXRpYyBpbnQgaHdfZXBfZGlzYWJsZShzdHJ1Y3QgY2lfaGRyYyAqY2ksIGludCBudW0sIGludCBkaXIpCiB7Ci0JaHdfZXBfZmx1c2goY2ksIG51bSwgZGlyKTsKIAlod193cml0ZShjaSwgT1BfRU5EUFRDVFJMICsgbnVtLAotCQkgZGlyID8gRU5EUFRDVFJMX1RYRSA6IEVORFBUQ1RSTF9SWEUsIDApOworCQkgKGRpciA9PSBUWCkgPyBFTkRQVENUUkxfVFhFIDogRU5EUFRDVFJMX1JYRSwgMCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzOSw3ICsxMzgsNyBAQAogewogCXUzMiBtYXNrLCBkYXRhOwogCi0JaWYgKGRpcikgeworCWlmIChkaXIgPT0gVFgpIHsKIAkJbWFzayAgPSBFTkRQVENUUkxfVFhUOyAgLyogdHlwZSAgICAqLwogCQlkYXRhICA9IHR5cGUgPDwgX19mZnMobWFzayk7CiAKQEAgLTE3MSw3ICsxNzAsNyBAQAogICovCiBzdGF0aWMgaW50IGh3X2VwX2dldF9oYWx0KHN0cnVjdCBjaV9oZHJjICpjaSwgaW50IG51bSwgaW50IGRpcikKIHsKLQl1MzIgbWFzayA9IGRpciA/IEVORFBUQ1RSTF9UWFMgOiBFTkRQVENUUkxfUlhTOworCXUzMiBtYXNrID0gKGRpciA9PSBUWCkgPyBFTkRQVENUUkxfVFhTIDogRU5EUFRDVFJMX1JYUzsKIAogCXJldHVybiBod19yZWFkKGNpLCBPUF9FTkRQVENUUkwgKyBudW0sIG1hc2spID8gMSA6IDA7CiB9CkBAIC0xODgsNiArMTg3LDkgQEAKIHsKIAlpbnQgbiA9IGh3X2VwX2JpdChudW0sIGRpcik7CiAKKwkvKiBTeW5jaHJvbml6ZSBiZWZvcmUgZXAgcHJpbWUgKi8KKwl3bWIoKTsKKwogCWlmIChpc19jdHJsICYmIGRpciA9PSBSWCAmJiBod19yZWFkKGNpLCBPUF9FTkRQVFNFVFVQU1RBVCwgQklUKG51bSkpKQogCQlyZXR1cm4gLUVBR0FJTjsKIApAQCAtMjE4LDggKzIyMCw4IEBACiAKIAlkbyB7CiAJCWVudW0gY2lfaHdfcmVncyByZWcgPSBPUF9FTkRQVENUUkwgKyBudW07Ci0JCXUzMiBtYXNrX3hzID0gZGlyID8gRU5EUFRDVFJMX1RYUyA6IEVORFBUQ1RSTF9SWFM7Ci0JCXUzMiBtYXNrX3hyID0gZGlyID8gRU5EUFRDVFJMX1RYUiA6IEVORFBUQ1RSTF9SWFI7CisJCXUzMiBtYXNrX3hzID0gKGRpciA9PSBUWCkgPyBFTkRQVENUUkxfVFhTIDogRU5EUFRDVFJMX1JYUzsKKwkJdTMyIG1hc2tfeHIgPSAoZGlyID09IFRYKSA/IEVORFBUQ1RSTF9UWFIgOiBFTkRQVENUUkxfUlhSOwogCiAJCS8qIGRhdGEgdG9nZ2xlIC0gcmVzZXJ2ZWQgZm9yIEVQMCBidXQgaXQncyBpbiBFU1MgKi8KIAkJaHdfd3JpdGUoY2ksIHJlZywgbWFza194c3xtYXNrX3hyLApAQCAtMzQ4LDggKzM1MCw3IEBACiAJaWYgKG5vZGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlub2RlLT5wdHIgPSBkbWFfcG9vbF96YWxsb2MoaHdlcC0+dGRfcG9vbCwgR0ZQX0FUT01JQywKLQkJCQkgICAmbm9kZS0+ZG1hKTsKKwlub2RlLT5wdHIgPSBkbWFfcG9vbF96YWxsb2MoaHdlcC0+dGRfcG9vbCwgR0ZQX0FUT01JQywgJm5vZGUtPmRtYSk7CiAJaWYgKG5vZGUtPnB0ciA9PSBOVUxMKSB7CiAJCWtmcmVlKG5vZGUpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTUwNiw4ICs1MDcsNiBAQAogCQlod2VwLT5xaC5wdHItPmNhcCB8PSBtdWwgPDwgX19mZnMoUUhfTVVMVCk7CiAJfQogCi0Jd21iKCk7ICAgLyogc3luY2hyb25pemUgYmVmb3JlIGVwIHByaW1lICovCi0KIAlyZXQgPSBod19lcF9wcmltZShjaSwgaHdlcC0+bnVtLCBod2VwLT5kaXIsCiAJCQkgICBod2VwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpOwogZG9uZToKQEAgLTUzNCw5ICs1MzMsNiBAQAogCWh3ZXAtPnFoLnB0ci0+dGQudG9rZW4gJj0KIAkJY3B1X3RvX2xlMzIofihURF9TVEFUVVNfSEFMVEVEIHwgVERfU1RBVFVTX0FDVElWRSkpOwogCi0JLyogU3luY2hyb25pemUgYmVmb3JlIGVwIHByaW1lICovCi0Jd21iKCk7Ci0KIAlyZXR1cm4gaHdfZXBfcHJpbWUoY2ksIGh3ZXAtPm51bSwgaHdlcC0+ZGlyLAogCQkJCWh3ZXAtPnR5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCk7CiB9CkBAIC01OTAsNyArNTg2LDcgQEAKIAkJfQogCiAJCWlmIChyZW1haW5pbmdfbGVuZ3RoKSB7Ci0JCQlpZiAoaHdlcC0+ZGlyKSB7CisJCQlpZiAoaHdlcC0+ZGlyID09IFRYKSB7CiAJCQkJaHdyZXEtPnJlcS5zdGF0dXMgPSAtRVBST1RPOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtOTQ5LDYgKzk0NSwxNSBAQAogCWludCByZXR2YWw7CiAJc3RydWN0IGNpX2h3X2VwICpod2VwOwogCisJLyoKKwkgKiBVbmV4cGVjdGVkIFVTQiBjb250cm9sbGVyIGJlaGF2aW9yLCBjYXVzZWQgYnkgYmFkIHNpZ25hbCBpbnRlZ3JpdHkKKwkgKiBvciBncm91bmQgcmVmZXJlbmNlIHByb2JsZW1zLCBjYW4gbGVhZCB0byBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlCisJICogYmVpbmcgY2FsbGVkIHdpdGggY2ktPnN0YXR1cyBlcXVhbCB0byBOVUxMLgorCSAqIElmIHRoaXMgc2l0dWF0aW9uIG9jY3VycywgeW91IHNob3VsZCByZXZpZXcgeW91ciBVU0IgaGFyZHdhcmUgZGVzaWduLgorCSAqLworCWlmIChXQVJOX09OX09OQ0UoIWNpLT5zdGF0dXMpKQorCQlyZXR1cm4gLUVQSVBFOworCiAJaHdlcCA9IChjaS0+ZXAwX2RpciA9PSBUWCkgPyBjaS0+ZXAwb3V0IDogY2ktPmVwMGluOwogCWNpLT5zdGF0dXMtPmNvbnRleHQgPSBjaTsKIAljaS0+c3RhdHVzLT5jb21wbGV0ZSA9IGlzcl9zZXR1cF9zdGF0dXNfY29tcGxldGU7CkBAIC0xMDQyLDkgKzEwNDcsOSBAQAogCQkJaWYgKHJlcS53TGVuZ3RoICE9IDApCiAJCQkJYnJlYWs7CiAJCQludW0gID0gbGUxNl90b19jcHUocmVxLndJbmRleCk7Ci0JCQlkaXIgPSBudW0gJiBVU0JfRU5EUE9JTlRfRElSX01BU0s7CisJCQlkaXIgPSAobnVtICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA/IFRYIDogUlg7CiAJCQludW0gJj0gVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOwotCQkJaWYgKGRpcikgLyogVFggKi8KKwkJCWlmIChkaXIgPT0gVFgpCiAJCQkJbnVtICs9IGNpLT5od19lcF9tYXggLyAyOwogCQkJaWYgKCFjaS0+Y2lfaHdfZXBbbnVtXS53ZWRnZSkgewogCQkJCXNwaW5fdW5sb2NrKCZjaS0+bG9jayk7CkBAIC0xMDk0LDkgKzEwOTksOSBAQAogCQkJaWYgKHJlcS53TGVuZ3RoICE9IDApCiAJCQkJYnJlYWs7CiAJCQludW0gID0gbGUxNl90b19jcHUocmVxLndJbmRleCk7Ci0JCQlkaXIgPSBudW0gJiBVU0JfRU5EUE9JTlRfRElSX01BU0s7CisJCQlkaXIgPSAobnVtICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA/IFRYIDogUlg7CiAJCQludW0gJj0gVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOwotCQkJaWYgKGRpcikgLyogVFggKi8KKwkJCWlmIChkaXIgPT0gVFgpCiAJCQkJbnVtICs9IGNpLT5od19lcF9tYXggLyAyOwogCiAJCQlzcGluX3VubG9jaygmY2ktPmxvY2spOwpAQCAtMTU5Niw4ICsxNjAxLDExIEBACiB7CiAJc3RydWN0IGNpX2hkcmMgKmNpID0gY29udGFpbmVyX29mKF9nYWRnZXQsIHN0cnVjdCBjaV9oZHJjLCBnYWRnZXQpOwogCi0JLyogRGF0YSsgcHVsbHVwIGNvbnRyb2xsZWQgYnkgT1RHIHN0YXRlIG1hY2hpbmUgaW4gT1RHIGZzbSBtb2RlICovCi0JaWYgKGNpX290Z19pc19mc21fbW9kZShjaSkpCisJLyoKKwkgKiBEYXRhKyBwdWxsdXAgY29udHJvbGxlZCBieSBPVEcgc3RhdGUgbWFjaGluZSBpbiBPVEcgZnNtIG1vZGU7CisJICogYW5kIGRvbid0IHRvdWNoIERhdGErIGluIGhvc3QgbW9kZSBmb3IgZHVhbCByb2xlIGNvbmZpZy4KKwkgKi8KKwlpZiAoY2lfb3RnX2lzX2ZzbV9tb2RlKGNpKSB8fCBjaS0+cm9sZSA9PSBDSV9ST0xFX0hPU1QpCiAJCXJldHVybiAwOwogCiAJcG1fcnVudGltZV9nZXRfc3luYygmY2ktPmdhZGdldC5kZXYpOwpAQCAtMTY2OCwxMiArMTY3NiwxMCBAQAogCQkJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQoJmh3ZXAtPmVwLCAodW5zaWduZWQgc2hvcnQpfjApOwogCiAJCQlJTklUX0xJU1RfSEVBRCgmaHdlcC0+cWgucXVldWUpOwotCQkJaHdlcC0+cWgucHRyID0gZG1hX3Bvb2xfYWxsb2MoY2ktPnFoX3Bvb2wsIEdGUF9LRVJORUwsCi0JCQkJCQkgICAgICZod2VwLT5xaC5kbWEpOworCQkJaHdlcC0+cWgucHRyID0gZG1hX3Bvb2xfemFsbG9jKGNpLT5xaF9wb29sLCBHRlBfS0VSTkVMLAorCQkJCQkJICAgICAgICZod2VwLT5xaC5kbWEpOwogCQkJaWYgKGh3ZXAtPnFoLnB0ciA9PSBOVUxMKQogCQkJCXJldHZhbCA9IC1FTk9NRU07Ci0JCQllbHNlCi0JCQkJbWVtc2V0KGh3ZXAtPnFoLnB0ciwgMCwgc2l6ZW9mKCpod2VwLT5xaC5wdHIpKTsKIAogCQkJLyoKIAkJCSAqIHNldCB1cCBzaG9ydGhhbmRzIGZvciBlcDAgb3V0IGFuZCBpbiBlbmRwb2ludHMsCkBAIC0xOTg3LDcgKzE5OTMsNyBAQAogCWlmICghaHdfcmVhZChjaSwgQ0FQX0RDQ1BBUkFNUywgRENDUEFSQU1TX0RDKSkKIAkJcmV0dXJuIC1FTlhJTzsKIAotCXJkcnYgPSBkZXZtX2t6YWxsb2MoY2ktPmRldiwgc2l6ZW9mKHN0cnVjdCBjaV9yb2xlX2RyaXZlciksIEdGUF9LRVJORUwpOworCXJkcnYgPSBkZXZtX2t6YWxsb2MoY2ktPmRldiwgc2l6ZW9mKCpyZHJ2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyZHJ2KQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2hpcGlkZWEvdXNibWlzY19pbXguYyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL3VzYm1pc2NfaW14LmMKaW5kZXggYWI4YjAyNy4uMjBkMDJhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2hpcGlkZWEvdXNibWlzY19pbXguYworKysgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS91c2JtaXNjX2lteC5jCkBAIC01Niw2ICs1Niw3IEBACiAKICNkZWZpbmUgTVg2X0JNX05PTl9CVVJTVF9TRVRUSU5HCUJJVCgxKQogI2RlZmluZSBNWDZfQk1fT1ZFUl9DVVJfRElTCQlCSVQoNykKKyNkZWZpbmUgTVg2X0JNX09WRVJfQ1VSX1BPTEFSSVRZCUJJVCg4KQogI2RlZmluZSBNWDZfQk1fV0FLRVVQX0VOQUJMRQkJQklUKDEwKQogI2RlZmluZSBNWDZfQk1fSURfV0FLRVVQCQlCSVQoMTYpCiAjZGVmaW5lIE1YNl9CTV9WQlVTX1dBS0VVUAkJQklUKDE3KQpAQCAtMjY2LDExICsyNjcsMTQgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2JtaXNjLT5sb2NrLCBmbGFncyk7CiAKKwlyZWcgPSByZWFkbCh1c2JtaXNjLT5iYXNlICsgZGF0YS0+aW5kZXggKiA0KTsKIAlpZiAoZGF0YS0+ZGlzYWJsZV9vYykgewotCQlyZWcgPSByZWFkbCh1c2JtaXNjLT5iYXNlICsgZGF0YS0+aW5kZXggKiA0KTsKLQkJd3JpdGVsKHJlZyB8IE1YNl9CTV9PVkVSX0NVUl9ESVMsCi0JCQl1c2JtaXNjLT5iYXNlICsgZGF0YS0+aW5kZXggKiA0KTsKKwkJcmVnIHw9IE1YNl9CTV9PVkVSX0NVUl9ESVM7CisJfSBlbHNlIGlmIChkYXRhLT5vY19wb2xhcml0eSA9PSAxKSB7CisJCS8qIEhpZ2ggYWN0aXZlICovCisJCXJlZyAmPSB+KE1YNl9CTV9PVkVSX0NVUl9ESVMgfCBNWDZfQk1fT1ZFUl9DVVJfUE9MQVJJVFkpOwogCX0KKwl3cml0ZWwocmVnLCB1c2JtaXNjLT5iYXNlICsgZGF0YS0+aW5kZXggKiA0KTsKIAogCS8qIFNvQyBub24tYnVyc3Qgc2V0dGluZyAqLwogCXJlZyA9IHJlYWRsKHVzYm1pc2MtPmJhc2UgKyBkYXRhLT5pbmRleCAqIDQpOwpAQCAtMzY1LDEwICszNjksMTQgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdXNibWlzYy0+bG9jaywgZmxhZ3MpOworCXJlZyA9IHJlYWRsKHVzYm1pc2MtPmJhc2UpOwogCWlmIChkYXRhLT5kaXNhYmxlX29jKSB7Ci0JCXJlZyA9IHJlYWRsKHVzYm1pc2MtPmJhc2UpOwotCQl3cml0ZWwocmVnIHwgTVg2X0JNX09WRVJfQ1VSX0RJUywgdXNibWlzYy0+YmFzZSk7CisJCXJlZyB8PSBNWDZfQk1fT1ZFUl9DVVJfRElTOworCX0gZWxzZSBpZiAoZGF0YS0+b2NfcG9sYXJpdHkgPT0gMSkgeworCQkvKiBIaWdoIGFjdGl2ZSAqLworCQlyZWcgJj0gfihNWDZfQk1fT1ZFUl9DVVJfRElTIHwgTVg2X0JNX09WRVJfQ1VSX1BPTEFSSVRZKTsKIAl9CisJd3JpdGVsKHJlZywgdXNibWlzYy0+YmFzZSk7CiAKIAlyZWcgPSByZWFkbCh1c2JtaXNjLT5iYXNlICsgTVg3RF9VU0JOQ19VU0JfQ1RSTDIpOwogCXJlZyAmPSB+TVg3RF9VU0JfVkJVU19XQUtFVVBfU09VUkNFX01BU0s7CkBAIC00OTIsNiArNTAwLDEwIEBACiAJCS5jb21wYXRpYmxlID0gImZzbCxpbXg2dWwtdXNibWlzYyIsCiAJCS5kYXRhID0gJmlteDZzeF91c2JtaXNjX29wcywKIAl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAiZnNsLGlteDdkLXVzYm1pc2MiLAorCQkuZGF0YSA9ICZpbXg3ZF91c2JtaXNjX29wcywKKwl9LAogCXsgLyogc2VudGluZWwgKi8gfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHVzYm1pc2NfaW14X2R0X2lkcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKaW5kZXggNzE5MTIzMC4uNzhmMGY4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCisrKyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYwpAQCAtMzY4LDE3ICszNjgsMTcgQEAKIAlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChpbmRleCwgJmFjbS0+cmVhZF91cmJzX2ZyZWUpKQogCQlyZXR1cm4gMDsKIAotCWRldl92ZGJnKCZhY20tPmRhdGEtPmRldiwgIiVzIC0gdXJiICVkXG4iLCBfX2Z1bmNfXywgaW5kZXgpOwotCiAJcmVzID0gdXNiX3N1Ym1pdF91cmIoYWNtLT5yZWFkX3VyYnNbaW5kZXhdLCBtZW1fZmxhZ3MpOwogCWlmIChyZXMpIHsKIAkJaWYgKHJlcyAhPSAtRVBFUk0pIHsKIAkJCWRldl9lcnIoJmFjbS0+ZGF0YS0+ZGV2LAotCQkJCQkiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQ6ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmVzKTsKKwkJCQkJInVyYiAlZCBmYWlsZWQgc3VibWlzc2lvbiB3aXRoICVkXG4iLAorCQkJCQlpbmRleCwgcmVzKTsKIAkJfQogCQlzZXRfYml0KGluZGV4LCAmYWNtLT5yZWFkX3VyYnNfZnJlZSk7CiAJCXJldHVybiByZXM7CisJfSBlbHNlIHsKKwkJZGV2X3ZkYmcoJmFjbS0+ZGF0YS0+ZGV2LCAic3VibWl0dGVkIHVyYiAlZFxuIiwgaW5kZXgpOwogCX0KIAogCXJldHVybiAwOwpAQCAtNDE1LDggKzQxNSw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkZXZfdmRiZygmYWNtLT5kYXRhLT5kZXYsICIlcyAtIHVyYiAlZCwgbGVuICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkJcmItPmluZGV4LCB1cmItPmFjdHVhbF9sZW5ndGgpOworCWRldl92ZGJnKCZhY20tPmRhdGEtPmRldiwgImdvdCB1cmIgJWQsIGxlbiAlZCwgc3RhdHVzICVkXG4iLAorCQkJCQlyYi0+aW5kZXgsIHVyYi0+YWN0dWFsX2xlbmd0aCwKKwkJCQkJc3RhdHVzKTsKIAogCWlmICghYWNtLT5kZXYpIHsKIAkJc2V0X2JpdChyYi0+aW5kZXgsICZhY20tPnJlYWRfdXJic19mcmVlKTsKQEAgLTQyNiw4ICs0MjcsNiBAQAogCiAJaWYgKHN0YXR1cykgewogCQlzZXRfYml0KHJiLT5pbmRleCwgJmFjbS0+cmVhZF91cmJzX2ZyZWUpOwotCQlkZXZfZGJnKCZhY20tPmRhdGEtPmRldiwgIiVzIC0gbm9uLXplcm8gdXJiIHN0YXR1czogJWRcbiIsCi0JCQkJCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCWlmICgoc3RhdHVzICE9IC1FTk9FTlQpIHx8ICh1cmItPmFjdHVhbF9sZW5ndGggPT0gMCkpCiAJCQlyZXR1cm47CiAJfQpAQCAtNDYyLDggKzQ2MSw3IEBACiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCiAJaWYgKHN0YXR1cyB8fCAodXJiLT5hY3R1YWxfbGVuZ3RoICE9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCkpCi0JCWRldl92ZGJnKCZhY20tPmRhdGEtPmRldiwgIiVzIC0gbGVuICVkLyVkLCBzdGF0dXMgJWRcbiIsCi0JCQlfX2Z1bmNfXywKKwkJZGV2X3ZkYmcoJmFjbS0+ZGF0YS0+ZGV2LCAid3JvdGUgbGVuICVkLyVkLCBzdGF0dXMgJWRcbiIsCiAJCQl1cmItPmFjdHVhbF9sZW5ndGgsCiAJCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCiAJCQlzdGF0dXMpOwpAQCAtNDc4LDggKzQ3Niw2IEBACiB7CiAJc3RydWN0IGFjbSAqYWNtID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhY20sIHdvcmspOwogCi0JZGV2X3ZkYmcoJmFjbS0+ZGF0YS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQogCXR0eV9wb3J0X3R0eV93YWtldXAoJmFjbS0+cG9ydCk7CiB9CiAKQEAgLTQ5Miw4ICs0ODgsNiBAQAogCXN0cnVjdCBhY20gKmFjbTsKIAlpbnQgcmV0dmFsOwogCi0JZGV2X2RiZyh0dHktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KIAlhY20gPSBhY21fZ2V0X2J5X21pbm9yKHR0eS0+aW5kZXgpOwogCWlmICghYWNtKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTUxNSw4ICs1MDksNiBAQAogewogCXN0cnVjdCBhY20gKmFjbSA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKLQlkZXZfZGJnKHR0eS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQogCXJldHVybiB0dHlfcG9ydF9vcGVuKCZhY20tPnBvcnQsIHR0eSwgZmlscCk7CiB9CiAKQEAgLTU0NSw4ICs1MzcsNiBAQAogCWludCByZXR2YWwgPSAtRU5PREVWOwogCWludCBpOwogCi0JZGV2X2RiZygmYWNtLT5jb250cm9sLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCiAJbXV0ZXhfbG9jaygmYWNtLT5tdXRleCk7CiAJaWYgKGFjbS0+ZGlzY29ubmVjdGVkKQogCQlnb3RvIGRpc2Nvbm5lY3RlZDsKQEAgLTYwNyw4ICs1OTcsNiBAQAogewogCXN0cnVjdCBhY20gKmFjbSA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgYWNtLCBwb3J0KTsKIAotCWRldl9kYmcoJmFjbS0+Y29udHJvbC0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQogCWFjbV9yZWxlYXNlX21pbm9yKGFjbSk7CiAJdXNiX3B1dF9pbnRmKGFjbS0+Y29udHJvbCk7CiAJa2ZyZWUoYWNtLT5jb3VudHJ5X2NvZGVzKTsKQEAgLTYyMiw4ICs2MTAsNiBAQAogCXN0cnVjdCBhY21fd2IgKndiOwogCWludCBpOwogCi0JZGV2X2RiZygmYWNtLT5jb250cm9sLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCiAJLyoKIAkgKiBOZWVkIHRvIGdyYWIgd3JpdGVfbG9jayB0byBwcmV2ZW50IHJhY2Ugd2l0aCByZXN1bWUsIGJ1dCBubyBuZWVkIHRvCiAJICogaG9sZCBpdCBkdWUgdG8gdGhlIHR0eS1wb3J0IGluaXRpYWxpc2VkIGZsYWcuCkBAIC02NTQsMjEgKzY0MCwyMSBAQAogc3RhdGljIHZvaWQgYWNtX3R0eV9jbGVhbnVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJc3RydWN0IGFjbSAqYWNtID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlkZXZfZGJnKCZhY20tPmNvbnRyb2wtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKIAl0dHlfcG9ydF9wdXQoJmFjbS0+cG9ydCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFjbV90dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJc3RydWN0IGFjbSAqYWNtID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlkZXZfZGJnKCZhY20tPmNvbnRyb2wtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKIAl0dHlfcG9ydF9oYW5ndXAoJmFjbS0+cG9ydCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFjbV90dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJc3RydWN0IGFjbSAqYWNtID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlkZXZfZGJnKCZhY20tPmNvbnRyb2wtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKIAl0dHlfcG9ydF9jbG9zZSgmYWNtLT5wb3J0LCB0dHksIGZpbHApOwogfQogCkBAIC02ODQsNyArNjcwLDcgQEAKIAlpZiAoIWNvdW50KQogCQlyZXR1cm4gMDsKIAotCWRldl92ZGJnKCZhY20tPmRhdGEtPmRldiwgIiVzIC0gY291bnQgJWRcbiIsIF9fZnVuY19fLCBjb3VudCk7CisJZGV2X3ZkYmcoJmFjbS0+ZGF0YS0+ZGV2LCAiJWQgYnl0ZXMgZnJvbSB0dHkgbGF5ZXJcbiIsIGNvdW50KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZhY20tPndyaXRlX2xvY2ssIGZsYWdzKTsKIAl3Ym4gPSBhY21fd2JfYWxsb2MoYWNtKTsKQEAgLTcwMSw3ICs2ODcsNyBAQAogCX0KIAogCWNvdW50ID0gKGNvdW50ID4gYWNtLT53cml0ZXNpemUpID8gYWNtLT53cml0ZXNpemUgOiBjb3VudDsKLQlkZXZfdmRiZygmYWNtLT5kYXRhLT5kZXYsICIlcyAtIHdyaXRlICVkXG4iLCBfX2Z1bmNfXywgY291bnQpOworCWRldl92ZGJnKCZhY20tPmRhdGEtPmRldiwgIndyaXRpbmcgJWQgYnl0ZXNcbiIsIGNvdW50KTsKIAltZW1jcHkod2ItPmJ1ZiwgYnVmLCBjb3VudCk7CiAJd2ItPmxlbiA9IGNvdW50OwogCkBAIC0xMTkzLDYgKzExNzksOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoIWludGYtPmN1cl9hbHRzZXR0aW5nKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmICghYnVmbGVuKSB7CiAJCWlmIChpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZW5kcG9pbnQgJiYKIAkJCQlpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZW5kcG9pbnQtPmV4dHJhbGVuICYmCkBAIC0xMjQ2LDYgKzEyMzUsOCBAQAogCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJubyBpbnRlcmZhY2VzXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCWlmICghZGF0YV9pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nIHx8ICFjb250cm9sX2ludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmcpCisJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKGRhdGFfaW50Zl9udW0gIT0gY2FsbF9pbnRmX251bSkKIAkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiU2VwYXJhdGUgY2FsbCBjb250cm9sIGludGVyZmFjZS4gVGhhdCBpcyBub3QgZnVsbHkgc3VwcG9ydGVkLlxuIik7CkBAIC0xMzU0LDcgKzEzNDUsNiBAQAogCXNwaW5fbG9ja19pbml0KCZhY20tPndyaXRlX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZhY20tPnJlYWRfbG9jayk7CiAJbXV0ZXhfaW5pdCgmYWNtLT5tdXRleCk7Ci0JYWNtLT5yeF9lbmRwb2ludCA9IHVzYl9yY3ZidWxrcGlwZSh1c2JfZGV2LCBlcHJlYWQtPmJFbmRwb2ludEFkZHJlc3MpOwogCWFjbS0+aXNfaW50X2VwID0gdXNiX2VuZHBvaW50X3hmZXJfaW50KGVwcmVhZCk7CiAJaWYgKGFjbS0+aXNfaW50X2VwKQogCQlhY20tPmJJbnRlcnZhbCA9IGVwcmVhZC0+YkludGVydmFsOwpAQCAtMTM5NCwxNCArMTM4NCwxNCBAQAogCQl1cmItPnRyYW5zZmVyX2RtYSA9IHJiLT5kbWE7CiAJCWlmIChhY20tPmlzX2ludF9lcCkgewogCQkJdXNiX2ZpbGxfaW50X3VyYih1cmIsIGFjbS0+ZGV2LAotCQkJCQkgYWNtLT5yeF9lbmRwb2ludCwKKwkJCQkJIHVzYl9yY3ZpbnRwaXBlKHVzYl9kZXYsIGVwcmVhZC0+YkVuZHBvaW50QWRkcmVzcyksCiAJCQkJCSByYi0+YmFzZSwKIAkJCQkJIGFjbS0+cmVhZHNpemUsCiAJCQkJCSBhY21fcmVhZF9idWxrX2NhbGxiYWNrLCByYiwKIAkJCQkJIGFjbS0+YkludGVydmFsKTsKIAkJfSBlbHNlIHsKIAkJCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgYWNtLT5kZXYsCi0JCQkJCSAgYWNtLT5yeF9lbmRwb2ludCwKKwkJCQkJICB1c2JfcmN2YnVsa3BpcGUodXNiX2RldiwgZXByZWFkLT5iRW5kcG9pbnRBZGRyZXNzKSwKIAkJCQkJICByYi0+YmFzZSwKIAkJCQkJICBhY20tPnJlYWRzaXplLAogCQkJCQkgIGFjbV9yZWFkX2J1bGtfY2FsbGJhY2ssIHJiKTsKQEAgLTE1MzQsOCArMTUyNCw2IEBACiB7CiAJaW50IGk7CiAKLQlkZXZfZGJnKCZhY20tPmNvbnRyb2wtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KIAl1c2Jfa2lsbF91cmIoYWNtLT5jdHJsdXJiKTsKIAlmb3IgKGkgPSAwOyBpIDwgQUNNX05XOyBpKyspCiAJCXVzYl9raWxsX3VyYihhY20tPndiW2ldLnVyYik7CkBAIC0xNTUyLDggKzE1NDAsNiBAQAogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IGk7CiAKLQlkZXZfZGJnKCZpbnRmLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCiAJLyogc2libGluZyBpbnRlcmZhY2UgaXMgYWxyZWFkeSBjbGVhbmluZyB1cCAqLwogCWlmICghYWNtKQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmggYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmgKaW5kZXggMDVjZTMwOC4uMWYxZWFiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5oCisrKyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uaApAQCAtOTYsNyArOTYsNiBAQAogCXN0cnVjdCBhY21fcmIgcmVhZF9idWZmZXJzW0FDTV9OUl07CiAJc3RydWN0IGFjbV93YiAqcHV0YnVmZmVyOwkJCS8qIGZvciBhY21fdHR5X3B1dF9jaGFyKCkgKi8KIAlpbnQgcnhfYnVmbGltaXQ7Ci0JaW50IHJ4X2VuZHBvaW50OwogCXNwaW5sb2NrX3QgcmVhZF9sb2NrOwogCWludCB3cml0ZV91c2VkOwkJCQkJLyogbnVtYmVyIG9mIG5vbi1lbXB0eSB3cml0ZSBidWZmZXJzICovCiAJaW50IHRyYW5zbWl0dGluZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy13ZG0uYyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy13ZG0uYwppbmRleCAzMzc5NDhjLi4wYTYzNjk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtd2RtLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLXdkbS5jCkBAIC01OCw2ICs1OCw3IEBACiAjZGVmaW5lIFdETV9TVVNQRU5ESU5HCQk4CiAjZGVmaW5lIFdETV9SRVNFVFRJTkcJCTkKICNkZWZpbmUgV0RNX09WRVJGTE9XCQkxMAorI2RlZmluZSBXRE1fRFJBSU5fT05fT1BFTgkxMQogCiAjZGVmaW5lIFdETV9NQVgJCQkxNgogCkBAIC0xNTQsNiArMTU1LDkgQEAKIAl3YWtlX3VwKCZkZXNjLT53YWl0KTsKIH0KIAorLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIGludCBzZXJ2aWNlX291dHN0YW5kaW5nX2ludGVycnVwdChzdHJ1Y3Qgd2RtX2RldmljZSAqZGVzYyk7CisKIHN0YXRpYyB2b2lkIHdkbV9pbl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IHdkbV9kZXZpY2UgKmRlc2MgPSB1cmItPmNvbnRleHQ7CkBAIC0xNjcsMTggKzE3MSwxOCBAQAogCQlzd2l0Y2ggKHN0YXR1cykgewogCQljYXNlIC1FTk9FTlQ6CiAJCQlkZXZfZGJnKCZkZXNjLT5pbnRmLT5kZXYsCi0JCQkJIm5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogLUVOT0VOVCIpOworCQkJCSJub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6IC1FTk9FTlRcbiIpOwogCQkJZ290byBza2lwX2Vycm9yOwogCQljYXNlIC1FQ09OTlJFU0VUOgogCQkJZGV2X2RiZygmZGVzYy0+aW50Zi0+ZGV2LAotCQkJCSJub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6IC1FQ09OTlJFU0VUIik7CisJCQkJIm5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogLUVDT05OUkVTRVRcbiIpOwogCQkJZ290byBza2lwX2Vycm9yOwogCQljYXNlIC1FU0hVVERPV046CiAJCQlkZXZfZGJnKCZkZXNjLT5pbnRmLT5kZXYsCi0JCQkJIm5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogLUVTSFVURE9XTiIpOworCQkJCSJub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6IC1FU0hVVERPV05cbiIpOwogCQkJZ290byBza2lwX2Vycm9yOwogCQljYXNlIC1FUElQRToKLQkJCWRldl9lcnIoJmRlc2MtPmludGYtPmRldiwKKwkJCWRldl9kYmcoJmRlc2MtPmludGYtPmRldiwKIAkJCQkibm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAtRVBJUEVcbiIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CkBAIC0xODgsNyArMTkyLDEzIEBACiAJCX0KIAl9CiAKLQlkZXNjLT5yZXJyID0gc3RhdHVzOworCS8qCisJICogb25seSBzZXQgYSBuZXcgZXJyb3IgaWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgZXJyb3IuCisJICogRXJyb3JzIGFyZSBvbmx5IGNsZWFyZWQgZHVyaW5nIHJlYWQvb3BlbgorCSAqLworCWlmIChkZXNjLT5yZXJyICA9PSAwKQorCQlkZXNjLT5yZXJyID0gc3RhdHVzOworCiAJaWYgKGxlbmd0aCArIGRlc2MtPmxlbmd0aCA+IGRlc2MtPndNYXhDb21tYW5kKSB7CiAJCS8qIFRoZSBidWZmZXIgd291bGQgb3ZlcmZsb3cgKi8KIAkJc2V0X2JpdChXRE1fT1ZFUkZMT1csICZkZXNjLT5mbGFncyk7CkBAIC0yMDAsMTAgKzIxMCw0MCBAQAogCQkJZGVzYy0+cmVzbGVuZ3RoID0gbGVuZ3RoOwogCQl9CiAJfQorCisJLyoKKwkgKiBIYW5kbGluZyBkZXZpY2VzIHdpdGggdGhlIFdETV9EUkFJTl9PTl9PUEVOIGZsYWcgc2V0OgorCSAqIElmIGRlc2MtPnJlc3BfY291bnQgaXMgdW5zZXQsIHRoZW4gdGhlIHVyYiB3YXMgc3VibWl0dGVkCisJICogd2l0aG91dCBhIHByaW9yIG5vdGlmaWNhdGlvbi4gIElmIHRoZSBkZXZpY2UgcmV0dXJuZWQgYW55CisJICogZGF0YSwgdGhlbiB0aGlzIGltcGxpZXMgdGhhdCBpdCBoYWQgbWVzc2FnZXMgcXVldWVkIHdpdGhvdXQKKwkgKiBub3RpZnlpbmcgdXMuICBDb250aW51ZSByZWFkaW5nIHVudGlsIHRoYXQgcXVldWUgaXMgZmx1c2hlZC4KKwkgKi8KKwlpZiAoIWRlc2MtPnJlc3BfY291bnQpIHsKKwkJaWYgKCFsZW5ndGgpIHsKKwkJCS8qIGRvIG5vdCBwcm9wYWdhdGUgdGhlIGV4cGVjdGVkIC1FUElQRSAqLworCQkJZGVzYy0+cmVyciA9IDA7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCQlkZXZfZGJnKCZkZXNjLT5pbnRmLT5kZXYsICJnb3QgJWQgYnl0ZXMgd2l0aG91dCBub3RpZmljYXRpb25cbiIsIGxlbmd0aCk7CisJCXNldF9iaXQoV0RNX1JFU1BPTkRJTkcsICZkZXNjLT5mbGFncyk7CisJCXVzYl9zdWJtaXRfdXJiKGRlc2MtPnJlc3BvbnNlLCBHRlBfQVRPTUlDKTsKKwl9CisKIHNraXBfZXJyb3I6CisJc2V0X2JpdChXRE1fUkVBRCwgJmRlc2MtPmZsYWdzKTsKIAl3YWtlX3VwKCZkZXNjLT53YWl0KTsKIAotCXNldF9iaXQoV0RNX1JFQUQsICZkZXNjLT5mbGFncyk7CisJaWYgKGRlc2MtPnJlcnIpIHsKKwkJLyoKKwkJICogU2luY2UgdGhlcmUgd2FzIGFuIGVycm9yLCB1c2Vyc3BhY2UgbWF5IGRlY2lkZSB0byBub3QgcmVhZAorCQkgKiBhbnkgZGF0YSBhZnRlciBwb2xsJ2luZy4KKwkJICogV2Ugc2hvdWxkIHJlc3BvbmQgdG8gZnVydGhlciBhdHRlbXB0cyBmcm9tIHRoZSBkZXZpY2UgdG8gc2VuZAorCQkgKiBkYXRhLCBzbyB0aGF0IHdlIGNhbiBnZXQgdW5zdHVjay4KKwkJICovCisJCXNlcnZpY2Vfb3V0c3RhbmRpbmdfaW50ZXJydXB0KGRlc2MpOworCX0KKwordW5sb2NrOgogCXNwaW5fdW5sb2NrKCZkZXNjLT5pdXNwaW4pOwogfQogCkBAIC0yNDQsMTggKzI4NCwxOCBAQAogCXN3aXRjaCAoZHItPmJOb3RpZmljYXRpb25UeXBlKSB7CiAJY2FzZSBVU0JfQ0RDX05PVElGWV9SRVNQT05TRV9BVkFJTEFCTEU6CiAJCWRldl9kYmcoJmRlc2MtPmludGYtPmRldiwKLQkJCSJOT1RJRllfUkVTUE9OU0VfQVZBSUxBQkxFIHJlY2VpdmVkOiBpbmRleCAlZCBsZW4gJWQiLAorCQkJIk5PVElGWV9SRVNQT05TRV9BVkFJTEFCTEUgcmVjZWl2ZWQ6IGluZGV4ICVkIGxlbiAlZFxuIiwKIAkJCWxlMTZfdG9fY3B1KGRyLT53SW5kZXgpLCBsZTE2X3RvX2NwdShkci0+d0xlbmd0aCkpOwogCQlicmVhazsKIAogCWNhc2UgVVNCX0NEQ19OT1RJRllfTkVUV09SS19DT05ORUNUSU9OOgogCiAJCWRldl9kYmcoJmRlc2MtPmludGYtPmRldiwKLQkJCSJOT1RJRllfTkVUV09SS19DT05ORUNUSU9OICVzIG5ldHdvcmsiLAorCQkJIk5PVElGWV9ORVRXT1JLX0NPTk5FQ1RJT04gJXMgbmV0d29ya1xuIiwKIAkJCWRyLT53VmFsdWUgPyAiY29ubmVjdGVkIHRvIiA6ICJkaXNjb25uZWN0ZWQgZnJvbSIpOwogCQlnb3RvIGV4aXQ7CiAJY2FzZSBVU0JfQ0RDX05PVElGWV9TUEVFRF9DSEFOR0U6Ci0JCWRldl9kYmcoJmRlc2MtPmludGYtPmRldiwgIlNQRUVEX0NIQU5HRSByZWNlaXZlZCAobGVuICV1KSIsCisJCWRldl9kYmcoJmRlc2MtPmludGYtPmRldiwgIlNQRUVEX0NIQU5HRSByZWNlaXZlZCAobGVuICV1KVxuIiwKIAkJCXVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCWdvdG8gZXhpdDsKIAlkZWZhdWx0OgpAQCAtMjc0LDggKzMxNCw3IEBACiAJCSYmICF0ZXN0X2JpdChXRE1fRElTQ09OTkVDVElORywgJmRlc2MtPmZsYWdzKQogCQkmJiAhdGVzdF9iaXQoV0RNX1NVU1BFTkRJTkcsICZkZXNjLT5mbGFncykpIHsKIAkJcnYgPSB1c2Jfc3VibWl0X3VyYihkZXNjLT5yZXNwb25zZSwgR0ZQX0FUT01JQyk7Ci0JCWRldl9kYmcoJmRlc2MtPmludGYtPmRldiwgIiVzOiB1c2Jfc3VibWl0X3VyYiAlZCIsCi0JCQlfX2Z1bmNfXywgcnYpOworCQlkZXZfZGJnKCZkZXNjLT5pbnRmLT5kZXYsICJzdWJtaXQgcmVzcG9uc2UgVVJCICVkXG4iLCBydik7CiAJfQogCXNwaW5fdW5sb2NrKCZkZXNjLT5pdXNwaW4pOwogCWlmIChydiA8IDApIHsKQEAgLTQxNyw3ICs0NTYsNyBAQAogCQlydiA9IHVzYl90cmFuc2xhdGVfZXJyb3JzKHJ2KTsKIAkJZ290byBvdXRfZnJlZV9tZW1fcG07CiAJfSBlbHNlIHsKLQkJZGV2X2RiZygmZGVzYy0+aW50Zi0+ZGV2LCAiVHggVVJCIGhhcyBiZWVuIHN1Ym1pdHRlZCBpbmRleD0lZCIsCisJCWRldl9kYmcoJmRlc2MtPmludGYtPmRldiwgIlR4IFVSQiBoYXMgYmVlbiBzdWJtaXR0ZWQgaW5kZXg9JWRcbiIsCiAJCQlsZTE2X3RvX2NwdShyZXEtPndJbmRleCkpOwogCX0KIApAQCAtNDM2LDE3ICs0NzUsMTQgQEAKIH0KIAogLyoKLSAqIGNsZWFyIFdETV9SRUFEIGZsYWcgYW5kIHBvc3NpYmx5IHN1Ym1pdCB0aGUgcmVhZCB1cmIgaWYgcmVzcF9jb3VudAotICogaXMgbm9uLXplcm8uCisgKiBTdWJtaXQgdGhlIHJlYWQgdXJiIGlmIHJlc3BfY291bnQgaXMgbm9uLXplcm8uCiAgKgogICogQ2FsbGVkIHdpdGggZGVzYy0+aXVzcGluIGxvY2tlZAogICovCi1zdGF0aWMgaW50IGNsZWFyX3dkbV9yZWFkX2ZsYWcoc3RydWN0IHdkbV9kZXZpY2UgKmRlc2MpCitzdGF0aWMgaW50IHNlcnZpY2Vfb3V0c3RhbmRpbmdfaW50ZXJydXB0KHN0cnVjdCB3ZG1fZGV2aWNlICpkZXNjKQogewogCWludCBydiA9IDA7CiAKLQljbGVhcl9iaXQoV0RNX1JFQUQsICZkZXNjLT5mbGFncyk7Ci0KIAkvKiBzdWJtaXQgcmVhZCB1cmIgb25seSBpZiB0aGUgZGV2aWNlIGlzIHdhaXRpbmcgZm9yIGl0ICovCiAJaWYgKCFkZXNjLT5yZXNwX2NvdW50IHx8ICEtLWRlc2MtPnJlc3BfY291bnQpCiAJCWdvdG8gb3V0OwpAQCAtNTM3LDggKzU3Myw5IEBACiAJCX0KIAogCQlpZiAoIWRlc2MtPnJlc2xlbmd0aCkgeyAvKiB6ZXJvIGxlbmd0aCByZWFkICovCi0JCQlkZXZfZGJnKCZkZXNjLT5pbnRmLT5kZXYsICIlczogemVybyBsZW5ndGggLSBjbGVhcmluZyBXRE1fUkVBRFxuIiwgX19mdW5jX18pOwotCQkJcnYgPSBjbGVhcl93ZG1fcmVhZF9mbGFnKGRlc2MpOworCQkJZGV2X2RiZygmZGVzYy0+aW50Zi0+ZGV2LCAiemVybyBsZW5ndGggLSBjbGVhcmluZyBXRE1fUkVBRFxuIik7CisJCQljbGVhcl9iaXQoV0RNX1JFQUQsICZkZXNjLT5mbGFncyk7CisJCQlydiA9IHNlcnZpY2Vfb3V0c3RhbmRpbmdfaW50ZXJydXB0KGRlc2MpOwogCQkJc3Bpbl91bmxvY2tfaXJxKCZkZXNjLT5pdXNwaW4pOwogCQkJaWYgKHJ2IDwgMCkKIAkJCQlnb3RvIGVycjsKQEAgLTU2Myw4ICs2MDAsMTAgQEAKIAogCWRlc2MtPmxlbmd0aCAtPSBjbnRyOwogCS8qIGluIGNhc2Ugd2UgaGFkIG91dHN0YW5kaW5nIGRhdGEgKi8KLQlpZiAoIWRlc2MtPmxlbmd0aCkKLQkJY2xlYXJfd2RtX3JlYWRfZmxhZyhkZXNjKTsKKwlpZiAoIWRlc2MtPmxlbmd0aCkgeworCQljbGVhcl9iaXQoV0RNX1JFQUQsICZkZXNjLT5mbGFncyk7CisJCXNlcnZpY2Vfb3V0c3RhbmRpbmdfaW50ZXJydXB0KGRlc2MpOworCX0KIAlzcGluX3VubG9ja19pcnEoJmRlc2MtPml1c3Bpbik7CiAJcnYgPSBjbnRyOwogCkBAIC02NDcsNiArNjg2LDE3IEBACiAJCQlkZXZfZXJyKCZkZXNjLT5pbnRmLT5kZXYsCiAJCQkJIkVycm9yIHN1Ym1pdHRpbmcgaW50IHVyYiAtICVkXG4iLCBydik7CiAJCQlydiA9IHVzYl90cmFuc2xhdGVfZXJyb3JzKHJ2KTsKKwkJfSBlbHNlIGlmICh0ZXN0X2JpdChXRE1fRFJBSU5fT05fT1BFTiwgJmRlc2MtPmZsYWdzKSkgeworCQkJLyoKKwkJCSAqIFNvbWUgZGV2aWNlcyBrZWVwIHBlbmRpbmcgbWVzc2FnZXMgcXVldWVkCisJCQkgKiB3aXRob3V0IHJlc2VuZGluZyBub3RpZmljYXRpb25zLiAgV2UgbXVzdAorCQkJICogZmx1c2ggdGhlIG1lc3NhZ2UgcXVldWUgYmVmb3JlIHdlIGNhbgorCQkJICogYXNzdW1lIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbgorCQkJICogbm90aWZpY2F0aW9ucyBhbmQgbWVzc2FnZXMgaW4gdGhlIHF1ZXVlCisJCQkgKi8KKwkJCWRldl9kYmcoJmRlc2MtPmludGYtPmRldiwgImRyYWluaW5nIHF1ZXVlZCBkYXRhXG4iKTsKKwkJCXNldF9iaXQoV0RNX1JFU1BPTkRJTkcsICZkZXNjLT5mbGFncyk7CisJCQlydiA9IHVzYl9zdWJtaXRfdXJiKGRlc2MtPnJlc3BvbnNlLCBHRlBfS0VSTkVMKTsKIAkJfQogCX0gZWxzZSB7CiAJCXJ2ID0gMDsKQEAgLTY3Myw3ICs3MjMsNyBAQAogCiAJaWYgKCFkZXNjLT5jb3VudCkgewogCQlpZiAoIXRlc3RfYml0KFdETV9ESVNDT05ORUNUSU5HLCAmZGVzYy0+ZmxhZ3MpKSB7Ci0JCQlkZXZfZGJnKCZkZXNjLT5pbnRmLT5kZXYsICJ3ZG1fcmVsZWFzZTogY2xlYW51cCIpOworCQkJZGV2X2RiZygmZGVzYy0+aW50Zi0+ZGV2LCAid2RtX3JlbGVhc2U6IGNsZWFudXBcbiIpOwogCQkJa2lsbF91cmJzKGRlc2MpOwogCQkJc3Bpbl9sb2NrX2lycSgmZGVzYy0+aXVzcGluKTsKIAkJCWRlc2MtPnJlc3BfY291bnQgPSAwOwpAQCAtNzUzLDcgKzgwMyw4IEBACiAvKiAtLS0gaG90cGx1ZyAtLS0gKi8KIAogc3RhdGljIGludCB3ZG1fY3JlYXRlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwLAotCQl1MTYgYnVmc2l6ZSwgaW50ICgqbWFuYWdlX3Bvd2VyKShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqLCBpbnQpKQorCQl1MTYgYnVmc2l6ZSwgaW50ICgqbWFuYWdlX3Bvd2VyKShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqLCBpbnQpLAorCQlib29sIGRyYWluX29uX29wZW4pCiB7CiAJaW50IHJ2ID0gLUVOT01FTTsKIAlzdHJ1Y3Qgd2RtX2RldmljZSAqZGVzYzsKQEAgLTg0MCw2ICs4OTEsNjggQEAKIAogCWRlc2MtPm1hbmFnZV9wb3dlciA9IG1hbmFnZV9wb3dlcjsKIAorCS8qCisJICogImRyYWluX29uX29wZW4iIGVuYWJsZXMgYSBoYWNrIHRvIHdvcmsgYXJvdW5kIGEgZmlybXdhcmUKKwkgKiBpc3N1ZSBvYnNlcnZlZCBvbiBuZXR3b3JrIGZ1bmN0aW9ucywgaW4gcGFydGljdWxhciBNQklNCisJICogZnVuY3Rpb25zLgorCSAqCisJICogUXVvdGluZyBzZWN0aW9uIDcgb2YgdGhlIENEQy1XTUMgcjEuMSBzcGVjaWZpY2F0aW9uOgorCSAqCisJICogICJUaGUgZmlybXdhcmUgc2hhbGwgaW50ZXJwcmV0IEdldEVuY2Fwc3VsYXRlZFJlc3BvbnNlIGFzIGEKKwkgKiAgIHJlcXVlc3QgdG8gcmVhZCByZXNwb25zZSBieXRlcy4gVGhlIGZpcm13YXJlIHNoYWxsIHNlbmQKKwkgKiAgIHRoZSBuZXh0IHdMZW5ndGggYnl0ZXMgZnJvbSB0aGUgcmVzcG9uc2UuIFRoZSBmaXJtd2FyZQorCSAqICAgc2hhbGwgYWxsb3cgdGhlIGhvc3QgdG8gcmV0cmlldmUgZGF0YSB1c2luZyBhbnkgbnVtYmVyIG9mCisJICogICBHZXRFbmNhcHN1bGF0ZWRSZXNwb25zZSByZXF1ZXN0cy4gVGhlIGZpcm13YXJlIHNoYWxsCisJICogICByZXR1cm4gYSB6ZXJvLSBsZW5ndGggcmVwbHkgaWYgdGhlcmUgYXJlIG5vIGRhdGEgYnl0ZXMKKwkgKiAgIGF2YWlsYWJsZS4KKwkgKgorCSAqICAgVGhlIGZpcm13YXJlIHNoYWxsIHNlbmQgUmVzcG9uc2VBdmFpbGFibGUgbm90aWZpY2F0aW9ucworCSAqICAgcGVyaW9kaWNhbGx5LCB1c2luZyBhbnkgYXBwcm9wcmlhdGUgYWxnb3JpdGhtLCB0byBpbmZvcm0KKwkgKiAgIHRoZSBob3N0IHRoYXQgdGhlcmUgaXMgZGF0YSBhdmFpbGFibGUgaW4gdGhlIHJlcGx5CisJICogICBidWZmZXIuIFRoZSBmaXJtd2FyZSBpcyBhbGxvd2VkIHRvIHNlbmQgUmVzcG9uc2VBdmFpbGFibGUKKwkgKiAgIG5vdGlmaWNhdGlvbnMgZXZlbiBpZiB0aGVyZSBpcyBubyBkYXRhIGF2YWlsYWJsZSwgYnV0CisJICogICB0aGlzIHdpbGwgb2J2aW91c2x5IHJlZHVjZSBvdmVyYWxsIHBlcmZvcm1hbmNlLiIKKwkgKgorCSAqIFRoZXNlIHJlcXVpcmVtZW50cywgYWx0aG91Z2ggdGhleSBtYWtlIGVxdWFsbHkgc2Vuc2UsIGFyZQorCSAqIG9mdGVuIG5vdCBpbXBsZW1lbnRlZCBieSBuZXR3b3JrIGZ1bmN0aW9ucy4gU29tZSBmaXJtd2FyZXMKKwkgKiB3aWxsIHF1ZXVlIGRhdGEgaW5kZWZpbml0ZWx5LCB3aXRob3V0IGV2ZXIgcmVzZW5kaW5nIGEKKwkgKiBub3RpZmljYXRpb24uIFRoZSByZXN1bHQgaXMgdGhhdCB0aGUgZHJpdmVyIGFuZCBmaXJtd2FyZQorCSAqIGxvc2VzICJzeW5jcm9uaXphdGlvbiIgaWYgdGhlIGRyaXZlciBldmVyIGZhaWxzIHRvIHJlc3BvbmQKKwkgKiB0byBhIHNpbmdsZSBub3RpZmljYXRpb24sIHNvbWV0aGluZyB3aGljaCBlYXNpbHkgY2FuIGhhcHBlbgorCSAqIG9uIHJlbGVhc2UoKS4gV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBkcml2ZXIgd2lsbCBhcHBlYXIgdG8KKwkgKiBuZXZlciByZWNlaXZlIG5vdGlmaWNhdGlvbnMgZm9yIHRoZSBtb3N0IGN1cnJlbnQgZGF0YS4gRWFjaAorCSAqIG5vdGlmaWNhdGlvbiB3aWxsIG9ubHkgY2F1c2UgYSBzaW5nbGUgcmVhZCwgd2hpY2ggcmV0dXJucworCSAqIHRoZSBvbGRlc3QgZGF0YSBpbiB0aGUgZmlybXdhcmUncyBxdWV1ZS4KKwkgKgorCSAqIFRoZSAiZHJhaW5fb25fb3BlbiIgaGFjayByZXNvbHZlcyB0aGUgc2l0dWF0aW9uIGJ5IGRyYWluaW5nCisJICogZGF0YSBmcm9tIHRoZSBmaXJtd2FyZSB1bnRpbCBub25lIGlzIHJldHVybmVkLCB3aXRob3V0IGEKKwkgKiBwcmlvciBub3RpZmljYXRpb24uCisJICoKKwkgKiBUaGlzIHdpbGwgaW5ldml0YWJseSByYWNlIHdpdGggdGhlIGZpcm13YXJlLCByaXNraW5nIHRoYXQKKwkgKiB3ZSByZWFkIGRhdGEgZnJvbSB0aGUgZGV2aWNlIGJlZm9yZSBoYW5kbGluZyB0aGUgYXNzb2NpYXRlZAorCSAqIG5vdGlmaWNhdGlvbi4gVG8gbWFrZSB0aGluZ3Mgd29yc2UsIHNvbWUgb2YgdGhlIGRldmljZXMKKwkgKiBuZWVkaW5nIHRoZSBoYWNrIGRvIG5vdCBpbXBsZW1lbnQgdGhlICJyZXR1cm4gemVybyBpZiBubworCSAqIGRhdGEgaXMgYXZhaWxhYmxlIiByZXF1aXJlbWVudCBlaXRoZXIuIEluc3RlYWQgdGhleSByZXR1cm4KKwkgKiBhbiBlcnJvciBvbiB0aGUgc3Vic2VxdWVudCByZWFkIGluIHRoaXMgY2FzZS4gIFRoaXMgbWVhbnMKKwkgKiB0aGF0ICJ3aW5uaW5nIiB0aGUgcmFjZSBjYW4gY2F1c2UgYW4gdW5leHBlY3RlZCBFSU8gdG8KKwkgKiB1c2Vyc3BhY2UuCisJICoKKwkgKiAid2lubmluZyIgdGhlIHJhY2UgaXMgbW9yZSBsaWtlbHkgb24gcmVzdW1lKCkgdGhhbiBvbgorCSAqIG9wZW4oKSwgYW5kIHRoZSB1bmV4cGVjdGVkIGVycm9yIGlzIG1vcmUgaGFybWZ1bCBpbiB0aGUKKwkgKiBtaWRkbGUgb2YgYW4gb3BlbiBzZXNzaW9uLiBUaGUgaGFjayBpcyB0aGVyZWZvcmUgb25seQorCSAqIGFwcGxpZWQgb24gb3BlbigpLCBhbmQgbm90IG9uIHJlc3VtZSgpIHdoZXJlIGl0IGxvZ2ljYWxseQorCSAqIHdvdWxkIGJlIGVxdWFsbHkgbmVjZXNzYXJ5LiBTbyB3ZSBkZWZpbmUgb3BlbigpIGFzIHRoZSBvbmx5CisJICogZHJpdmVyIDwtPiBkZXZpY2UgInN5bmNyb25pemF0aW9uIHBvaW50Ii4gIFNob3VsZCB3ZSBoYXBwZW4KKwkgKiB0byBsb3NlIGEgbm90aWZpY2F0aW9uIGFmdGVyIG9wZW4oKSwgdGhlbiBzeW5jcm9uaXphdGlvbgorCSAqIHdpbGwgYmUgbG9zdCB1bnRpbCByZWxlYXNlKCkKKwkgKgorCSAqIFRoZSBoYWNrIHNob3VsZCBub3QgYmUgZW5hYmxlZCBmb3IgQ0RDIFdETSBkZXZpY2VzCisJICogY29uZm9ybWluZyB0byB0aGUgQ0RDLVdNQyByMS4xIHNwZWNpZmljYXRpb24uICBUaGlzIGlzCisJICogZW5zdXJlZCBieSBzZXR0aW5nIGRyYWluX29uX29wZW4gdG8gZmFsc2UgaW4gd2RtX3Byb2JlKCkuCisJICovCisJaWYgKGRyYWluX29uX29wZW4pCisJCXNldF9iaXQoV0RNX0RSQUlOX09OX09QRU4sICZkZXNjLT5mbGFncyk7CisKIAlzcGluX2xvY2soJndkbV9kZXZpY2VfbGlzdF9sb2NrKTsKIAlsaXN0X2FkZCgmZGVzYy0+ZGV2aWNlX2xpc3QsICZ3ZG1fZGV2aWNlX2xpc3QpOwogCXNwaW5fdW5sb2NrKCZ3ZG1fZGV2aWNlX2xpc3RfbG9jayk7CkBAIC04OTMsNyArMTAwNiw3IEBACiAJCWdvdG8gZXJyOwogCWVwID0gJmlmYWNlLT5lbmRwb2ludFswXS5kZXNjOwogCi0JcnYgPSB3ZG1fY3JlYXRlKGludGYsIGVwLCBtYXhjb20sICZ3ZG1fbWFuYWdlX3Bvd2VyKTsKKwlydiA9IHdkbV9jcmVhdGUoaW50ZiwgZXAsIG1heGNvbSwgJndkbV9tYW5hZ2VfcG93ZXIsIGZhbHNlKTsKIAogZXJyOgogCXJldHVybiBydjsKQEAgLTkyNSw3ICsxMDM4LDcgQEAKIHsKIAlpbnQgcnYgPSAtRUlOVkFMOwogCi0JcnYgPSB3ZG1fY3JlYXRlKGludGYsIGVwLCBidWZzaXplLCBtYW5hZ2VfcG93ZXIpOworCXJ2ID0gd2RtX2NyZWF0ZShpbnRmLCBlcCwgYnVmc2l6ZSwgbWFuYWdlX3Bvd2VyLCB0cnVlKTsKIAlpZiAocnYgPCAwKQogCQlnb3RvIGVycjsKIApAQCAtOTY3LDcgKzEwODAsNyBAQAogCWlmICghZGVzYy0+Y291bnQpCiAJCWNsZWFudXAoZGVzYyk7CiAJZWxzZQotCQlkZXZfZGJnKCZpbnRmLT5kZXYsICIlczogJWQgb3BlbiBmaWxlcyAtIHBvc3Rwb25pbmcgY2xlYW51cFxuIiwgX19mdW5jX18sIGRlc2MtPmNvdW50KTsKKwkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiJWQgb3BlbiBmaWxlcyAtIHBvc3Rwb25pbmcgY2xlYW51cFxuIiwgZGVzYy0+Y291bnQpOwogCW11dGV4X3VubG9jaygmd2RtX211dGV4KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvdXNidG1jLmMgYi9kcml2ZXJzL3VzYi9jbGFzcy91c2J0bWMuYwppbmRleCA5MTdhNTVjLi5hNmMxZmFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy91c2J0bWMuYworKysgYi9kcml2ZXJzL3VzYi9jbGFzcy91c2J0bWMuYwpAQCAtMTQxLDYgKzE0MSw3IEBACiAJc3RydWN0IHVzYnRtY19kZXZpY2VfZGF0YSAqZGF0YSA9IHRvX3VzYnRtY19kYXRhKGtyZWYpOwogCiAJdXNiX3B1dF9kZXYoZGF0YS0+dXNiX2Rldik7CisJa2ZyZWUoZGF0YSk7CiB9CiAKIHN0YXRpYyBpbnQgdXNidG1jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCkBAIC0xMzc5LDcgKzEzODAsNyBAQAogCiAJZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CiAKLQlkYXRhID0gZGV2bV9remFsbG9jKCZpbnRmLT5kZXYsIHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTE0NjcsMTAgKzE0NjgsOCBAQAogCWlmIChkYXRhLT5paW5fZXBfcHJlc2VudCkgewogCQkvKiBhbGxvY2F0ZSBpbnQgdXJiICovCiAJCWRhdGEtPmlpbl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQlpZiAoIWRhdGEtPmlpbl91cmIpIHsKLQkJCWRldl9lcnIoJmludGYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBpbnQgdXJiXG4iKTsKKwkJaWYgKCFkYXRhLT5paW5fdXJiKQogCQkJZ290byBlcnJvcl9yZWdpc3RlcjsKLQkJfQogCiAJCS8qIHdpbGwgcmVmZXJlbmNlIGRhdGEgaW4gaW50IHVyYiAqLwogCQlrcmVmX2dldCgmZGF0YS0+a3JlZik7CkBAIC0xNDc4LDEwICsxNDc3LDggQEAKIAkJLyogYWxsb2NhdGUgYnVmZmVyIGZvciBpbnRlcnJ1cHQgaW4gKi8KIAkJZGF0YS0+aWluX2J1ZmZlciA9IGttYWxsb2MoZGF0YS0+aWluX3dNYXhQYWNrZXRTaXplLAogCQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCFkYXRhLT5paW5fYnVmZmVyKSB7Ci0JCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgaW50IGJ1ZlxuIik7CisJCWlmICghZGF0YS0+aWluX2J1ZmZlcikKIAkJCWdvdG8gZXJyb3JfcmVnaXN0ZXI7Ci0JCX0KIAogCQkvKiBmaWxsIGludGVycnVwdCB1cmIgKi8KIAkJdXNiX2ZpbGxfaW50X3VyYihkYXRhLT5paW5fdXJiLCBkYXRhLT51c2JfZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29tbW9uL3VscGkuYyBiL2RyaXZlcnMvdXNiL2NvbW1vbi91bHBpLmMKaW5kZXggMDFjMGMwNC4uOGIzMTc3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29tbW9uL3VscGkuYworKysgYi9kcml2ZXJzL3VzYi9jb21tb24vdWxwaS5jCkBAIC0yMSwxMyArMjEsMTMgQEAKIAogaW50IHVscGlfcmVhZChzdHJ1Y3QgdWxwaSAqdWxwaSwgdTggYWRkcikKIHsKLQlyZXR1cm4gdWxwaS0+b3BzLT5yZWFkKHVscGktPm9wcywgYWRkcik7CisJcmV0dXJuIHVscGktPm9wcy0+cmVhZCh1bHBpLT5kZXYucGFyZW50LCBhZGRyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVscGlfcmVhZCk7CiAKIGludCB1bHBpX3dyaXRlKHN0cnVjdCB1bHBpICp1bHBpLCB1OCBhZGRyLCB1OCB2YWwpCiB7Ci0JcmV0dXJuIHVscGktPm9wcy0+d3JpdGUodWxwaS0+b3BzLCBhZGRyLCB2YWwpOworCXJldHVybiB1bHBpLT5vcHMtPndyaXRlKHVscGktPmRldi5wYXJlbnQsIGFkZHIsIHZhbCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1bHBpX3dyaXRlKTsKIApAQCAtMTI3LDE2ICsxMjcsMTcgQEAKICAqCiAgKiBSZWdpc3RlcnMgYSBkcml2ZXIgd2l0aCB0aGUgVUxQSSBidXMuCiAgKi8KLWludCB1bHBpX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdWxwaV9kcml2ZXIgKmRydikKK2ludCBfX3VscGlfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1bHBpX2RyaXZlciAqZHJ2LCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUpCiB7CiAJaWYgKCFkcnYtPnByb2JlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWRydi0+ZHJpdmVyLm93bmVyID0gbW9kdWxlOwogCWRydi0+ZHJpdmVyLmJ1cyA9ICZ1bHBpX2J1czsKIAogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHVscGlfcmVnaXN0ZXJfZHJpdmVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKF9fdWxwaV9yZWdpc3Rlcl9kcml2ZXIpOwogCiAvKioKICAqIHVscGlfdW5yZWdpc3Rlcl9kcml2ZXIgLSB1bnJlZ2lzdGVyIGEgZHJpdmVyIHdpdGggdGhlIFVMUEkgYnVzCkBAIC0xNTYsNiArMTU3LDggQEAKIHsKIAlpbnQgcmV0OwogCisJdWxwaS0+ZGV2LnBhcmVudCA9IGRldjsgLyogbmVlZGVkIGVhcmx5IGZvciBvcHMgKi8KKwogCS8qIFRlc3QgdGhlIGludGVyZmFjZSAqLwogCXJldCA9IHVscGlfd3JpdGUodWxwaSwgVUxQSV9TQ1JBVENILCAweGFhKTsKIAlpZiAocmV0IDwgMCkKQEAgLTE3NCw3ICsxNzcsNiBAQAogCXVscGktPmlkLnByb2R1Y3QgPSB1bHBpX3JlYWQodWxwaSwgVUxQSV9QUk9EVUNUX0lEX0xPVyk7CiAJdWxwaS0+aWQucHJvZHVjdCB8PSB1bHBpX3JlYWQodWxwaSwgVUxQSV9QUk9EVUNUX0lEX0hJR0gpIDw8IDg7CiAKLQl1bHBpLT5kZXYucGFyZW50ID0gZGV2OwogCXVscGktPmRldi5idXMgPSAmdWxwaV9idXM7CiAJdWxwaS0+ZGV2LnR5cGUgPSAmdWxwaV9kZXZfdHlwZTsKIAlkZXZfc2V0X25hbWUoJnVscGktPmRldiwgIiVzLnVscGkiLCBkZXZfbmFtZShkZXYpKTsKQEAgLTIwMSw3ICsyMDMsOCBAQAogICogQWxsb2NhdGVzIGFuZCByZWdpc3RlcnMgYSBVTFBJIGRldmljZSBhbmQgYW4gaW50ZXJmYWNlIGZvciBpdC4gQ2FsbGVkIGZyb20KICAqIHRoZSBVU0IgY29udHJvbGxlciB0aGF0IHByb3ZpZGVzIHRoZSBVTFBJIGludGVyZmFjZS4KICAqLwotc3RydWN0IHVscGkgKnVscGlfcmVnaXN0ZXJfaW50ZXJmYWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHVscGlfb3BzICpvcHMpCitzdHJ1Y3QgdWxwaSAqdWxwaV9yZWdpc3Rlcl9pbnRlcmZhY2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHVscGlfb3BzICpvcHMpCiB7CiAJc3RydWN0IHVscGkgKnVscGk7CiAJaW50IHJldDsKQEAgLTIxMSw3ICsyMTQsNiBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCXVscGktPm9wcyA9IG9wczsKLQlvcHMtPmRldiA9IGRldjsKIAogCXJldCA9IHVscGlfcmVnaXN0ZXIoZGV2LCB1bHBpKTsKIAlpZiAocmV0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL0tjb25maWcgYi9kcml2ZXJzL3VzYi9jb3JlL0tjb25maWcKaW5kZXggZGQyODAxMC4uMGU1YTg4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvS2NvbmZpZwpAQCAtODMsMjMgKzgzLDEwIEBACiAJICBJbXBsZW1lbnRzIE9URyBGaW5pdGUgU3RhdGUgTWFjaGluZSBhcyBzcGVjaWZpZWQgaW4gT24tVGhlLUdvCiAJICBhbmQgRW1iZWRkZWQgSG9zdCBTdXBwbGVtZW50IHRvIHRoZSBVU0IgUmV2aXNpb24gMi4wIFNwZWNpZmljYXRpb24uCiAKLWNvbmZpZyBVU0JfVUxQSV9CVVMKLQl0cmlzdGF0ZSAiVVNCIFVMUEkgUEhZIGludGVyZmFjZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gVVNCX1NVUFBPUlQKK2NvbmZpZyBVU0JfTEVEU19UUklHR0VSX1VTQlBPUlQKKwl0cmlzdGF0ZSAiVVNCIHBvcnQgTEVEIHRyaWdnZXIiCisJZGVwZW5kcyBvbiBVU0IgJiYgTEVEU19UUklHR0VSUwogCWhlbHAKLQkgIFVUTUkrIExvdyBQaW4gSW50ZXJmYWNlIChVTFBJKSBpcyBzcGVjaWZpY2F0aW9uIGZvciBhIGNvbW1vbmx5IHVzZWQKLQkgIFVTQiAyLjAgUEhZIGludGVyZmFjZS4gVGhlIFVMUEkgc3BlY2lmaWNhdGlvbiBkZWZpbmVzIGEgc3RhbmRhcmQgc2V0Ci0JICBvZiByZWdpc3RlcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlY3QgdGhlIHZlbmRvciBhbmQgcHJvZHVjdCB3aGljaAotCSAgYWxsb3dzIFVMUEkgdG8gYmUgaGFuZGxlZCBhcyBhIGJ1cy4gVGhpcyBtb2R1bGUgaXMgdGhlIGRyaXZlciBmb3IgdGhhdAotCSAgYnVzLgotCi0JICBUaGUgVUxQSSBpbnRlcmZhY2VzICh0aGUgYnVzZXMpIGFyZSByZWdpc3RlcmVkIGJ5IHRoZSBkcml2ZXJzIGZvciBVU0IKLQkgIGNvbnRyb2xsZXJzIHdoaWNoIHN1cHBvcnQgVUxQSSByZWdpc3RlciBhY2Nlc3MgYW5kIGhhdmUgVUxQSSBQSFkKLQkgIGF0dGFjaGVkIHRvIHRoZW0uIFRoZSBVTFBJIFBIWSBkcml2ZXJzIHRoZW1zZWx2ZXMgYXJlIG5vcm1hbCBQSFkKLQkgIGRyaXZlcnMuCi0KLQkgIFVMUEkgUEhZcyBwcm92aWRlIG9mdGVuIGZ1bmN0aW9ucyBzdWNoIGFzIEFEUCBzZW5zaW5nL3Byb2JpbmcgKE9URwotCSAgcHJvdG9jb2wpIGFuZCBVU0IgY2hhcmdlciBkZXRlY3Rpb24uCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIHVscGkuCisJICBUaGlzIGRyaXZlciBhbGxvd3MgTEVEcyB0byBiZSBjb250cm9sbGVkIGJ5IFVTQiBldmVudHMuIEVuYWJsaW5nIHRoaXMKKwkgIHRyaWdnZXIgYWxsb3dzIHNwZWNpZnlpbmcgbGlzdCBvZiBVU0IgcG9ydHMgdGhhdCBzaG91bGQgdHVybiBvbiBMRUQKKwkgIHdoZW4gc29tZSBVU0IgZGV2aWNlIGdldHMgY29ubmVjdGVkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2NvcmUvTWFrZWZpbGUKaW5kZXggOTc4MDg3Ny4uYjk5Yjg3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9jb3JlL01ha2VmaWxlCkBAIC01LDkgKzUsMTIgQEAKIHVzYmNvcmUteSA6PSB1c2IubyBodWIubyBoY2QubyB1cmIubyBtZXNzYWdlLm8gZHJpdmVyLm8KIHVzYmNvcmUteSArPSBjb25maWcubyBmaWxlLm8gYnVmZmVyLm8gc3lzZnMubyBlbmRwb2ludC5vCiB1c2Jjb3JlLXkgKz0gZGV2aW8ubyBub3RpZnkubyBnZW5lcmljLm8gcXVpcmtzLm8gZGV2aWNlcy5vCi11c2Jjb3JlLXkgKz0gcG9ydC5vIG9mLm8KK3VzYmNvcmUteSArPSBwb3J0Lm8KIAordXNiY29yZS0kKENPTkZJR19PRikJCSs9IG9mLm8KIHVzYmNvcmUtJChDT05GSUdfUENJKQkJKz0gaGNkLXBjaS5vCiB1c2Jjb3JlLSQoQ09ORklHX0FDUEkpCQkrPSB1c2ItYWNwaS5vCiAKIG9iai0kKENPTkZJR19VU0IpCQkrPSB1c2Jjb3JlLm8KKworb2JqLSQoQ09ORklHX1VTQl9MRURTX1RSSUdHRVJfVVNCUE9SVCkJKz0gbGVkdHJpZy11c2Jwb3J0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvY29uZmlnLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2NvbmZpZy5jCmluZGV4IDMxY2NkY2MuLmEyZDkwYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvY29uZmlnLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9jb25maWcuYwpAQCAtMTcxLDYgKzE3MSwzMSBAQAogCQkJCQkJCWVwLCBidWZmZXIsIHNpemUpOwogfQogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbG93X3NwZWVkX21heHBhY2tldF9tYXhlc1s0XSA9IHsKKwlbVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTF0gPSA4LAorCVtVU0JfRU5EUE9JTlRfWEZFUl9JU09DXSA9IDAsCisJW1VTQl9FTkRQT0lOVF9YRkVSX0JVTEtdID0gMCwKKwlbVVNCX0VORFBPSU5UX1hGRVJfSU5UXSA9IDgsCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGZ1bGxfc3BlZWRfbWF4cGFja2V0X21heGVzWzRdID0geworCVtVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MXSA9IDY0LAorCVtVU0JfRU5EUE9JTlRfWEZFUl9JU09DXSA9IDEwMjMsCisJW1VTQl9FTkRQT0lOVF9YRkVSX0JVTEtdID0gNjQsCisJW1VTQl9FTkRQT0lOVF9YRkVSX0lOVF0gPSA2NCwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgaGlnaF9zcGVlZF9tYXhwYWNrZXRfbWF4ZXNbNF0gPSB7CisJW1VTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0xdID0gNjQsCisJW1VTQl9FTkRQT0lOVF9YRkVSX0lTT0NdID0gMTAyNCwKKwlbVVNCX0VORFBPSU5UX1hGRVJfQlVMS10gPSA1MTIsCisJW1VTQl9FTkRQT0lOVF9YRkVSX0lOVF0gPSAxMDI0LAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBzdXBlcl9zcGVlZF9tYXhwYWNrZXRfbWF4ZXNbNF0gPSB7CisJW1VTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0xdID0gNTEyLAorCVtVU0JfRU5EUE9JTlRfWEZFUl9JU09DXSA9IDEwMjQsCisJW1VTQl9FTkRQT0lOVF9YRkVSX0JVTEtdID0gMTAyNCwKKwlbVVNCX0VORFBPSU5UX1hGRVJfSU5UXSA9IDEwMjQsCit9OworCiBzdGF0aWMgaW50IHVzYl9wYXJzZV9lbmRwb2ludChzdHJ1Y3QgZGV2aWNlICpkZGV2LCBpbnQgY2Znbm8sIGludCBpbnVtLAogICAgIGludCBhc251bSwgc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZwLCBpbnQgbnVtX2VwLAogICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpCkBAIC0xNzksNiArMjA0LDggQEAKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmQ7CiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplbmRwb2ludDsKIAlpbnQgbiwgaSwgaiwgcmV0dmFsOworCXVuc2lnbmVkIGludCBtYXhwOworCWNvbnN0IHVuc2lnbmVkIHNob3J0ICptYXhwYWNrZXRfbWF4ZXM7CiAKIAlkID0gKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqKSBidWZmZXI7CiAJYnVmZmVyICs9IGQtPmJMZW5ndGg7CkBAIC0yMTMsOCArMjQwLDEwIEBACiAJbWVtY3B5KCZlbmRwb2ludC0+ZGVzYywgZCwgbik7CiAJSU5JVF9MSVNUX0hFQUQoJmVuZHBvaW50LT51cmJfbGlzdCk7CiAKLQkvKiBGaXggdXAgYkludGVydmFsIHZhbHVlcyBvdXRzaWRlIHRoZSBsZWdhbCByYW5nZS4gVXNlIDMyIG1zIGlmIG5vCi0JICogcHJvcGVyIHZhbHVlIGNhbiBiZSBndWVzc2VkLiAqLworCS8qCisJICogRml4IHVwIGJJbnRlcnZhbCB2YWx1ZXMgb3V0c2lkZSB0aGUgbGVnYWwgcmFuZ2UuCisJICogVXNlIDEwIG9yIDggbXMgaWYgbm8gcHJvcGVyIHZhbHVlIGNhbiBiZSBndWVzc2VkLgorCSAqLwogCWkgPSAwOwkJLyogaSA9IG1pbiwgaiA9IG1heCwgbiA9IGRlZmF1bHQgKi8KIAlqID0gMjU1OwogCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZCkpIHsKQEAgLTIyMywxMyArMjUyLDE1IEBACiAJCWNhc2UgVVNCX1NQRUVEX1NVUEVSX1BMVVM6CiAJCWNhc2UgVVNCX1NQRUVEX1NVUEVSOgogCQljYXNlIFVTQl9TUEVFRF9ISUdIOgotCQkJLyogTWFueSBkZXZpY2UgbWFudWZhY3R1cmVycyBhcmUgdXNpbmcgZnVsbC1zcGVlZAorCQkJLyoKKwkJCSAqIE1hbnkgZGV2aWNlIG1hbnVmYWN0dXJlcnMgYXJlIHVzaW5nIGZ1bGwtc3BlZWQKIAkJCSAqIGJJbnRlcnZhbCB2YWx1ZXMgaW4gaGlnaC1zcGVlZCBpbnRlcnJ1cHQgZW5kcG9pbnQKLQkJCSAqIGRlc2NyaXB0b3JzLiBUcnkgdG8gZml4IHRob3NlIGFuZCBmYWxsIGJhY2sgdG8gYQotCQkJICogMzIgbXMgZGVmYXVsdCB2YWx1ZSBvdGhlcndpc2UuICovCisJCQkgKiBkZXNjcmlwdG9ycy4gVHJ5IHRvIGZpeCB0aG9zZSBhbmQgZmFsbCBiYWNrIHRvIGFuCisJCQkgKiA4LW1zIGRlZmF1bHQgdmFsdWUgb3RoZXJ3aXNlLgorCQkJICovCiAJCQluID0gZmxzKGQtPmJJbnRlcnZhbCo4KTsKIAkJCWlmIChuID09IDApCi0JCQkJbiA9IDk7CS8qIDMyIG1zID0gMl4oOS0xKSB1ZnJhbWVzICovCisJCQkJbiA9IDc7CS8qIDggbXMgPSAyXig3LTEpIHVmcmFtZXMgKi8KIAkJCWogPSAxNjsKIAogCQkJLyoKQEAgLTI0NCwxMCArMjc1LDEyIEBACiAJCQl9CiAJCQlicmVhazsKIAkJZGVmYXVsdDoJCS8qIFVTQl9TUEVFRF9GVUxMIG9yIF9MT1cgKi8KLQkJCS8qIEZvciBsb3ctc3BlZWQsIDEwIG1zIGlzIHRoZSBvZmZpY2lhbCBtaW5pbXVtLgorCQkJLyoKKwkJCSAqIEZvciBsb3ctc3BlZWQsIDEwIG1zIGlzIHRoZSBvZmZpY2lhbCBtaW5pbXVtLgogCQkJICogQnV0IHNvbWUgIm92ZXJjbG9ja2VkIiBkZXZpY2VzIG1pZ2h0IHdhbnQgZmFzdGVyCi0JCQkgKiBwb2xsaW5nIHNvIHdlJ2xsIGFsbG93IGl0LiAqLwotCQkJbiA9IDMyOworCQkJICogcG9sbGluZyBzbyB3ZSdsbCBhbGxvdyBpdC4KKwkJCSAqLworCQkJbiA9IDEwOwogCQkJYnJlYWs7CiAJCX0KIAl9IGVsc2UgaWYgKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZCkpIHsKQEAgLTI1NSwxMCArMjg4LDEwIEBACiAJCWogPSAxNjsKIAkJc3dpdGNoICh0b191c2JfZGV2aWNlKGRkZXYpLT5zcGVlZCkgewogCQljYXNlIFVTQl9TUEVFRF9ISUdIOgotCQkJbiA9IDk7CQkvKiAzMiBtcyA9IDJeKDktMSkgdWZyYW1lcyAqLworCQkJbiA9IDc7CQkvKiA4IG1zID0gMl4oNy0xKSB1ZnJhbWVzICovCiAJCQlicmVhazsKIAkJZGVmYXVsdDoJCS8qIFVTQl9TUEVFRF9GVUxMICovCi0JCQluID0gNjsJCS8qIDMyIG1zID0gMl4oNi0xKSBmcmFtZXMgKi8KKwkJCW4gPSA0OwkJLyogOCBtcyA9IDJeKDQtMSkgZnJhbWVzICovCiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTI4Niw2ICszMTksNDIgQEAKIAkJCWVuZHBvaW50LT5kZXNjLndNYXhQYWNrZXRTaXplID0gY3B1X3RvX2xlMTYoOCk7CiAJfQogCisJLyogVmFsaWRhdGUgdGhlIHdNYXhQYWNrZXRTaXplIGZpZWxkICovCisJbWF4cCA9IHVzYl9lbmRwb2ludF9tYXhwKCZlbmRwb2ludC0+ZGVzYyk7CisKKwkvKiBGaW5kIHRoZSBoaWdoZXN0IGxlZ2FsIG1heHBhY2tldCBzaXplIGZvciB0aGlzIGVuZHBvaW50ICovCisJaSA9IDA7CQkvKiBhZGRpdGlvbmFsIHRyYW5zYWN0aW9ucyBwZXIgbWljcm9mcmFtZSAqLworCXN3aXRjaCAodG9fdXNiX2RldmljZShkZGV2KS0+c3BlZWQpIHsKKwljYXNlIFVTQl9TUEVFRF9MT1c6CisJCW1heHBhY2tldF9tYXhlcyA9IGxvd19zcGVlZF9tYXhwYWNrZXRfbWF4ZXM7CisJCWJyZWFrOworCWNhc2UgVVNCX1NQRUVEX0ZVTEw6CisJCW1heHBhY2tldF9tYXhlcyA9IGZ1bGxfc3BlZWRfbWF4cGFja2V0X21heGVzOworCQlicmVhazsKKwljYXNlIFVTQl9TUEVFRF9ISUdIOgorCQkvKiBCaXRzIDEyLi4xMSBhcmUgYWxsb3dlZCBvbmx5IGZvciBIUyBwZXJpb2RpYyBlbmRwb2ludHMgKi8KKwkJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2ludChkKSB8fCB1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGQpKSB7CisJCQlpID0gbWF4cCAmIChCSVQoMTIpIHwgQklUKDExKSk7CisJCQltYXhwICY9IH5pOworCQl9CisJCS8qIGZhbGx0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJbWF4cGFja2V0X21heGVzID0gaGlnaF9zcGVlZF9tYXhwYWNrZXRfbWF4ZXM7CisJCWJyZWFrOworCWNhc2UgVVNCX1NQRUVEX1NVUEVSOgorCWNhc2UgVVNCX1NQRUVEX1NVUEVSX1BMVVM6CisJCW1heHBhY2tldF9tYXhlcyA9IHN1cGVyX3NwZWVkX21heHBhY2tldF9tYXhlczsKKwkJYnJlYWs7CisJfQorCWogPSBtYXhwYWNrZXRfbWF4ZXNbdXNiX2VuZHBvaW50X3R5cGUoJmVuZHBvaW50LT5kZXNjKV07CisKKwlpZiAobWF4cCA+IGopIHsKKwkJZGV2X3dhcm4oZGRldiwgImNvbmZpZyAlZCBpbnRlcmZhY2UgJWQgYWx0c2V0dGluZyAlZCBlbmRwb2ludCAweCVYIGhhcyBpbnZhbGlkIG1heHBhY2tldCAlZCwgc2V0dGluZyB0byAlZFxuIiwKKwkJICAgIGNmZ25vLCBpbnVtLCBhc251bSwgZC0+YkVuZHBvaW50QWRkcmVzcywgbWF4cCwgaik7CisJCW1heHAgPSBqOworCQllbmRwb2ludC0+ZGVzYy53TWF4UGFja2V0U2l6ZSA9IGNwdV90b19sZTE2KGkgfCBtYXhwKTsKKwl9CisKIAkvKgogCSAqIFNvbWUgYnVnZ3kgaGlnaCBzcGVlZCBkZXZpY2VzIGhhdmUgYnVsayBlbmRwb2ludHMgdXNpbmcKIAkgKiBtYXhwYWNrZXQgc2l6ZXMgb3RoZXIgdGhhbiA1MTIuICBIaWdoIHNwZWVkIEhDRHMgbWF5IG5vdApAQCAtMjkzLDkgKzM2Miw2IEBACiAJICovCiAJaWYgKHRvX3VzYl9kZXZpY2UoZGRldiktPnNwZWVkID09IFVTQl9TUEVFRF9ISUdICiAJCQkmJiB1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGQpKSB7Ci0JCXVuc2lnbmVkIG1heHA7Ci0KLQkJbWF4cCA9IHVzYl9lbmRwb2ludF9tYXhwKCZlbmRwb2ludC0+ZGVzYykgJiAweDA3ZmY7CiAJCWlmIChtYXhwICE9IDUxMikKIAkJCWRldl93YXJuKGRkZXYsICJjb25maWcgJWQgaW50ZXJmYWNlICVkIGFsdHNldHRpbmcgJWQgIgogCQkJCSJidWxrIGVuZHBvaW50IDB4JVggaGFzIGludmFsaWQgbWF4cGFja2V0ICVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9kZXZpby5jIGIvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCmluZGV4IGU5ZjUwNDMuLjA5YzhkOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKQEAgLTI0MSw3ICsyNDEsOCBAQAogCQlnb3RvIGVycm9yX2RlY3JlYXNlX21lbTsKIAl9CiAKLQltZW0gPSB1c2JfYWxsb2NfY29oZXJlbnQocHMtPmRldiwgc2l6ZSwgR0ZQX1VTRVIsICZkbWFfaGFuZGxlKTsKKwltZW0gPSB1c2JfYWxsb2NfY29oZXJlbnQocHMtPmRldiwgc2l6ZSwgR0ZQX1VTRVIgfCBfX0dGUF9OT1dBUk4sCisJCQkmZG1hX2hhbmRsZSk7CiAJaWYgKCFtZW0pIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9mcmVlX3VzYm07CkBAIC0xNzA4LDExICsxNzA5LDE3IEBACiAJYXMtPnVyYi0+c3RhcnRfZnJhbWUgPSB1dXJiLT5zdGFydF9mcmFtZTsKIAlhcy0+dXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IG51bWJlcl9vZl9wYWNrZXRzOwogCWFzLT51cmItPnN0cmVhbV9pZCA9IHN0cmVhbV9pZDsKLQlpZiAodXVyYi0+dHlwZSA9PSBVU0JERVZGU19VUkJfVFlQRV9JU08gfHwKLQkJCXBzLT5kZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQotCQlhcy0+dXJiLT5pbnRlcnZhbCA9IDEgPDwgbWluKDE1LCBlcC0+ZGVzYy5iSW50ZXJ2YWwgLSAxKTsKLQllbHNlCi0JCWFzLT51cmItPmludGVydmFsID0gZXAtPmRlc2MuYkludGVydmFsOworCisJaWYgKGVwLT5kZXNjLmJJbnRlcnZhbCkgeworCQlpZiAodXVyYi0+dHlwZSA9PSBVU0JERVZGU19VUkJfVFlQRV9JU08gfHwKKwkJCQlwcy0+ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCB8fAorCQkJCXBzLT5kZXYtPnNwZWVkID49IFVTQl9TUEVFRF9TVVBFUikKKwkJCWFzLT51cmItPmludGVydmFsID0gMSA8PAorCQkJCQltaW4oMTUsIGVwLT5kZXNjLmJJbnRlcnZhbCAtIDEpOworCQllbHNlCisJCQlhcy0+dXJiLT5pbnRlcnZhbCA9IGVwLT5kZXNjLmJJbnRlcnZhbDsKKwl9CisKIAlhcy0+dXJiLT5jb250ZXh0ID0gYXM7CiAJYXMtPnVyYi0+Y29tcGxldGUgPSBhc3luY19jb21wbGV0ZWQ7CiAJZm9yICh0b3RsZW4gPSB1ID0gMDsgdSA8IG51bWJlcl9vZl9wYWNrZXRzOyB1KyspIHsKQEAgLTI1ODIsNyArMjU4OSw5IEBACiAJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFICYmICFsaXN0X2VtcHR5KCZwcy0+YXN5bmNfY29tcGxldGVkKSkKIAkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKIAlpZiAoIWNvbm5lY3RlZChwcykpCi0JCW1hc2sgfD0gUE9MTEVSUiB8IFBPTExIVVA7CisJCW1hc2sgfD0gUE9MTEhVUDsKKwlpZiAobGlzdF9lbXB0eSgmcHMtPmxpc3QpKQorCQltYXNrIHw9IFBPTExFUlI7CiAJcmV0dXJuIG1hc2s7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCmluZGV4IGQyZTNmNjUuLjQ3OWUyMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9oY2QuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgogCiAjaW5jbHVkZSAidXNiLmgiCiAKQEAgLTI1MTcsMTAgKzI1MTgsOCBAQAogCXN0cnVjdCB1c2JfaGNkICpoY2Q7CiAKIAloY2QgPSBremFsbG9jKHNpemVvZigqaGNkKSArIGRyaXZlci0+aGNkX3ByaXZfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFoY2QpIHsKLQkJZGV2X2RiZyAoZGV2LCAiaGNkIGFsbG9jIGZhaWxlZFxuIik7CisJaWYgKCFoY2QpCiAJCXJldHVybiBOVUxMOwotCX0KIAlpZiAocHJpbWFyeV9oY2QgPT0gTlVMTCkgewogCQloY2QtPmFkZHJlc3MwX211dGV4ID0ga21hbGxvYyhzaXplb2YoKmhjZC0+YWRkcmVzczBfbXV0ZXgpLAogCQkJCUdGUF9LRVJORUwpOwpAQCAtMzAzMyw3ICszMDMyLDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NT04pIHx8IGRlZmluZWQoQ09ORklHX1VTQl9NT05fTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1VTQl9NT04pCiAKIGNvbnN0IHN0cnVjdCB1c2JfbW9uX29wZXJhdGlvbnMgKm1vbl9vcHM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCmluZGV4IGJlZTEzNTEuLmNiYjE0NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwpAQCAtMTA1MiwxNCArMTA1MiwxMSBAQAogCiAJLyogQ29udGludWUgYSBwYXJ0aWFsIGluaXRpYWxpemF0aW9uICovCiAJaWYgKHR5cGUgPT0gSFVCX0lOSVQyIHx8IHR5cGUgPT0gSFVCX0lOSVQzKSB7Ci0JCWRldmljZV9sb2NrKGh1Yi0+aW50ZmRldik7CisJCWRldmljZV9sb2NrKCZoZGV2LT5kZXYpOwogCiAJCS8qIFdhcyB0aGUgaHViIGRpc2Nvbm5lY3RlZCB3aGlsZSB3ZSB3ZXJlIHdhaXRpbmc/ICovCi0JCWlmIChodWItPmRpc2Nvbm5lY3RlZCkgewotCQkJZGV2aWNlX3VubG9jayhodWItPmludGZkZXYpOwotCQkJa3JlZl9wdXQoJmh1Yi0+a3JlZiwgaHViX3JlbGVhc2UpOwotCQkJcmV0dXJuOwotCQl9CisJCWlmIChodWItPmRpc2Nvbm5lY3RlZCkKKwkJCWdvdG8gZGlzY29ubmVjdGVkOwogCQlpZiAodHlwZSA9PSBIVUJfSU5JVDIpCiAJCQlnb3RvIGluaXQyOwogCQlnb3RvIGluaXQzOwpAQCAtMTI2Miw3ICsxMjU5LDcgQEAKIAkJCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLAogCQkJCQkmaHViLT5pbml0X3dvcmssCiAJCQkJCW1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpKTsKLQkJCWRldmljZV91bmxvY2soaHViLT5pbnRmZGV2KTsKKwkJCWRldmljZV91bmxvY2soJmhkZXYtPmRldik7CiAJCQlyZXR1cm47CQkvKiBDb250aW51ZXMgYXQgaW5pdDM6IGJlbG93ICovCiAJCX0gZWxzZSB7CiAJCQltc2xlZXAoZGVsYXkpOwpAQCAtMTI4MSwxMiArMTI3OCwxMiBAQAogCS8qIFNjYW4gYWxsIHBvcnRzIHRoYXQgbmVlZCBhdHRlbnRpb24gKi8KIAlraWNrX2h1Yl93cShodWIpOwogCi0JLyogQWxsb3cgYXV0b3N1c3BlbmQgaWYgaXQgd2FzIHN1cHByZXNzZWQgKi8KLQlpZiAodHlwZSA8PSBIVUJfSU5JVDMpCisJaWYgKHR5cGUgPT0gSFVCX0lOSVQyIHx8IHR5cGUgPT0gSFVCX0lOSVQzKSB7CisJCS8qIEFsbG93IGF1dG9zdXNwZW5kIGlmIGl0IHdhcyBzdXBwcmVzc2VkICovCisgZGlzY29ubmVjdGVkOgogCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2VfYXN5bmModG9fdXNiX2ludGVyZmFjZShodWItPmludGZkZXYpKTsKLQotCWlmICh0eXBlID09IEhVQl9JTklUMiB8fCB0eXBlID09IEhVQl9JTklUMykKLQkJZGV2aWNlX3VubG9jayhodWItPmludGZkZXYpOworCQlkZXZpY2VfdW5sb2NrKCZoZGV2LT5kZXYpOworCX0KIAogCWtyZWZfcHV0KCZodWItPmtyZWYsIGh1Yl9yZWxlYXNlKTsKIH0KQEAgLTEzMTUsOCArMTMxMiw2IEBACiAJc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYgPSBodWItPmhkZXY7CiAJaW50IGk7CiAKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmh1Yi0+aW5pdF93b3JrKTsKLQogCS8qIGh1Yl93cSBhbmQgcmVsYXRlZCBhY3Rpdml0eSB3b24ndCByZS10cmlnZ2VyICovCiAJaHViLT5xdWllc2NpbmcgPSAxOwogCkBAIC0xODI4LDEwICsxODIzLDggQEAKIAlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiVVNCIGh1YiBmb3VuZFxuIik7CiAKIAlodWIgPSBremFsbG9jKHNpemVvZigqaHViKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFodWIpIHsKLQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiY291bGRuJ3Qga21hbGxvYyBodWIgc3RydWN0XG4iKTsKKwlpZiAoIWh1YikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJa3JlZl9pbml0KCZodWItPmtyZWYpOwogCWh1Yi0+aW50ZmRldiA9ICZpbnRmLT5kZXY7CkBAIC0zMTExLDcgKzMxMDQsNyBAQAogCQkJCVVTQl9DVFJMX1NFVF9USU1FT1VUKTsKIAllbHNlCiAJCXJldHVybiB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAotCQkJCVVTQl9SRVFfQ0xFQVJfRkVBVFVSRSwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJCQlVU0JfUkVRX1NFVF9GRUFUVVJFLCBVU0JfUkVDSVBfSU5URVJGQUNFLAogCQkJCVVTQl9JTlRSRl9GVU5DX1NVU1BFTkQsCTAsIE5VTEwsIDAsCiAJCQkJVVNCX0NUUkxfU0VUX1RJTUVPVVQpOwogfQpAQCAtNTM0MiwxMSArNTMzNSwxMCBAQAogCX0KIAogCWJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfTk9JTyk7Ci0JaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnVkZXYtPmRldiwgIm5vIG1lbSB0byByZS1yZWFkIGNvbmZpZ3MgYWZ0ZXIgcmVzZXRcbiIpOworCWlmICghYnVmKQogCQkvKiBhc3N1bWUgdGhlIHdvcnN0ICovCiAJCXJldHVybiAxOwotCX0KKwogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHVkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zOyBpbmRleCsrKSB7CiAJCW9sZF9sZW5ndGggPSBsZTE2X3RvX2NwdSh1ZGV2LT5jb25maWdbaW5kZXhdLmRlc2Mud1RvdGFsTGVuZ3RoKTsKIAkJbGVuZ3RoID0gdXNiX2dldF9kZXNjcmlwdG9yKHVkZXYsIFVTQl9EVF9DT05GSUcsIGluZGV4LCBidWYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2xlZHRyaWctdXNicG9ydC5jIGIvZHJpdmVycy91c2IvY29yZS9sZWR0cmlnLXVzYnBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWQ1MTYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvY29yZS9sZWR0cmlnLXVzYnBvcnQuYwpAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIFVTQiBwb3J0IExFRCB0cmlnZ2VyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFJhZmHFgiBNacWCZWNraSA8cmFmYWxAbWlsZWNraS5wbD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCitzdHJ1Y3QgdXNicG9ydF90cmlnX2RhdGEgeworCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgcG9ydHM7CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5iOworCWludCBjb3VudDsgLyogQW1vdW50IG9mIGNvbm5lY3RlZCBtYXRjaGluZyBkZXZpY2VzICovCit9OworCitzdHJ1Y3QgdXNicG9ydF90cmlnX3BvcnQgeworCXN0cnVjdCB1c2Jwb3J0X3RyaWdfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqaHViOworCWludCBwb3J0bnVtOworCWNoYXIgKnBvcnRfbmFtZTsKKwlib29sIG9ic2VydmVkOworCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGF0dHI7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSGVscGVycworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiB1c2Jwb3J0X3RyaWdfdXNiX2Rldl9vYnNlcnZlZCAtIENoZWNrIGlmIGRldiBpcyBjb25uZWN0ZWQgdG8gb2JzZXJ2ZWQgcG9ydAorICovCitzdGF0aWMgYm9vbCB1c2Jwb3J0X3RyaWdfdXNiX2Rldl9vYnNlcnZlZChzdHJ1Y3QgdXNicG9ydF90cmlnX2RhdGEgKnVzYnBvcnRfZGF0YSwKKwkJCQkJICBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldikKK3sKKwlzdHJ1Y3QgdXNicG9ydF90cmlnX3BvcnQgKnBvcnQ7CisKKwlpZiAoIXVzYl9kZXYtPnBhcmVudCkKKwkJcmV0dXJuIGZhbHNlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmdXNicG9ydF9kYXRhLT5wb3J0cywgbGlzdCkgeworCQlpZiAodXNiX2Rldi0+cGFyZW50ID09IHBvcnQtPmh1YiAmJgorCQkgICAgdXNiX2Rldi0+cG9ydG51bSA9PSBwb3J0LT5wb3J0bnVtKQorCQkJcmV0dXJuIHBvcnQtPm9ic2VydmVkOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCB1c2Jwb3J0X3RyaWdfdXNiX2Rldl9jaGVjayhzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2Rldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdXNicG9ydF90cmlnX2RhdGEgKnVzYnBvcnRfZGF0YSA9IGRhdGE7CisKKwlpZiAodXNicG9ydF90cmlnX3VzYl9kZXZfb2JzZXJ2ZWQodXNicG9ydF9kYXRhLCB1c2JfZGV2KSkKKwkJdXNicG9ydF9kYXRhLT5jb3VudCsrOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdXNicG9ydF90cmlnX3VwZGF0ZV9jb3VudCAtIFJlY2FsY3VsYXRlIGFtb3VudCBvZiBjb25uZWN0ZWQgbWF0Y2hpbmcgZGV2aWNlcworICovCitzdGF0aWMgdm9pZCB1c2Jwb3J0X3RyaWdfdXBkYXRlX2NvdW50KHN0cnVjdCB1c2Jwb3J0X3RyaWdfZGF0YSAqdXNicG9ydF9kYXRhKQoreworCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2ID0gdXNicG9ydF9kYXRhLT5sZWRfY2RldjsKKworCXVzYnBvcnRfZGF0YS0+Y291bnQgPSAwOworCXVzYl9mb3JfZWFjaF9kZXYodXNicG9ydF9kYXRhLCB1c2Jwb3J0X3RyaWdfdXNiX2Rldl9jaGVjayk7CisJbGVkX2NkZXYtPmJyaWdodG5lc3Nfc2V0KGxlZF9jZGV2LAorCQkJCSB1c2Jwb3J0X2RhdGEtPmNvdW50ID8gTEVEX0ZVTEwgOiBMRURfT0ZGKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGV2aWNlIGF0dHIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzc2l6ZV90IHVzYnBvcnRfdHJpZ19wb3J0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHVzYnBvcnRfdHJpZ19wb3J0ICpwb3J0ID0gY29udGFpbmVyX29mKGF0dHIsCisJCQkJCQkgICAgICBzdHJ1Y3QgdXNicG9ydF90cmlnX3BvcnQsCisJCQkJCQkgICAgICBhdHRyKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwb3J0LT5vYnNlcnZlZCkgKyAxOworfQorCitzdGF0aWMgc3NpemVfdCB1c2Jwb3J0X3RyaWdfcG9ydF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCB1c2Jwb3J0X3RyaWdfcG9ydCAqcG9ydCA9IGNvbnRhaW5lcl9vZihhdHRyLAorCQkJCQkJICAgICAgc3RydWN0IHVzYnBvcnRfdHJpZ19wb3J0LAorCQkJCQkJICAgICAgYXR0cik7CisKKwlpZiAoIXN0cmNtcChidWYsICIwIikgfHwgIXN0cmNtcChidWYsICIwXG4iKSkKKwkJcG9ydC0+b2JzZXJ2ZWQgPSAwOworCWVsc2UgaWYgKCFzdHJjbXAoYnVmLCAiMSIpIHx8ICFzdHJjbXAoYnVmLCAiMVxuIikpCisJCXBvcnQtPm9ic2VydmVkID0gMTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJdXNicG9ydF90cmlnX3VwZGF0ZV9jb3VudChwb3J0LT5kYXRhKTsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcG9ydHNfYXR0cnNbXSA9IHsKKwlOVUxMLAorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHBvcnRzX2dyb3VwID0geworCS5uYW1lID0gInBvcnRzIiwKKwkuYXR0cnMgPSBwb3J0c19hdHRycywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFkZGluZyAmIHJlbW92aW5nIHBvcnRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHVzYnBvcnRfdHJpZ19hZGRfcG9ydChzdHJ1Y3QgdXNicG9ydF90cmlnX2RhdGEgKnVzYnBvcnRfZGF0YSwKKwkJCQkgc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsCisJCQkJIGNvbnN0IGNoYXIgKmh1Yl9uYW1lLCBpbnQgcG9ydG51bSkKK3sKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiA9IHVzYnBvcnRfZGF0YS0+bGVkX2NkZXY7CisJc3RydWN0IHVzYnBvcnRfdHJpZ19wb3J0ICpwb3J0OworCXNpemVfdCBsZW47CisJaW50IGVycjsKKworCXBvcnQgPSBremFsbG9jKHNpemVvZigqcG9ydCksIEdGUF9LRVJORUwpOworCWlmICghcG9ydCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcG9ydC0+ZGF0YSA9IHVzYnBvcnRfZGF0YTsKKwlwb3J0LT5odWIgPSB1c2JfZGV2OworCXBvcnQtPnBvcnRudW0gPSBwb3J0bnVtOworCisJbGVuID0gc3RybGVuKGh1Yl9uYW1lKSArIDg7CisJcG9ydC0+cG9ydF9uYW1lID0ga3phbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghcG9ydC0+cG9ydF9uYW1lKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWVfcG9ydDsKKwl9CisJc25wcmludGYocG9ydC0+cG9ydF9uYW1lLCBsZW4sICIlcy1wb3J0JWQiLCBodWJfbmFtZSwgcG9ydG51bSk7CisKKwlwb3J0LT5hdHRyLmF0dHIubmFtZSA9IHBvcnQtPnBvcnRfbmFtZTsKKwlwb3J0LT5hdHRyLmF0dHIubW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSOworCXBvcnQtPmF0dHIuc2hvdyA9IHVzYnBvcnRfdHJpZ19wb3J0X3Nob3c7CisJcG9ydC0+YXR0ci5zdG9yZSA9IHVzYnBvcnRfdHJpZ19wb3J0X3N0b3JlOworCisJZXJyID0gc3lzZnNfYWRkX2ZpbGVfdG9fZ3JvdXAoJmxlZF9jZGV2LT5kZXYtPmtvYmosICZwb3J0LT5hdHRyLmF0dHIsCisJCQkJICAgICAgcG9ydHNfZ3JvdXAubmFtZSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9wb3J0X25hbWU7CisKKwlsaXN0X2FkZF90YWlsKCZwb3J0LT5saXN0LCAmdXNicG9ydF9kYXRhLT5wb3J0cyk7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfcG9ydF9uYW1lOgorCWtmcmVlKHBvcnQtPnBvcnRfbmFtZSk7CitlcnJfZnJlZV9wb3J0OgorCWtmcmVlKHBvcnQpOworZXJyX291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHVzYnBvcnRfdHJpZ19hZGRfdXNiX2Rldl9wb3J0cyhzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKKwkJCQkJICB2b2lkICpkYXRhKQoreworCXN0cnVjdCB1c2Jwb3J0X3RyaWdfZGF0YSAqdXNicG9ydF9kYXRhID0gZGF0YTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPD0gdXNiX2Rldi0+bWF4Y2hpbGQ7IGkrKykKKwkJdXNicG9ydF90cmlnX2FkZF9wb3J0KHVzYnBvcnRfZGF0YSwgdXNiX2RldiwKKwkJCQkgICAgICBkZXZfbmFtZSgmdXNiX2Rldi0+ZGV2KSwgaSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdXNicG9ydF90cmlnX3JlbW92ZV9wb3J0KHN0cnVjdCB1c2Jwb3J0X3RyaWdfZGF0YSAqdXNicG9ydF9kYXRhLAorCQkJCSAgICAgc3RydWN0IHVzYnBvcnRfdHJpZ19wb3J0ICpwb3J0KQoreworCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2ID0gdXNicG9ydF9kYXRhLT5sZWRfY2RldjsKKworCWxpc3RfZGVsKCZwb3J0LT5saXN0KTsKKwlzeXNmc19yZW1vdmVfZmlsZV9mcm9tX2dyb3VwKCZsZWRfY2Rldi0+ZGV2LT5rb2JqLCAmcG9ydC0+YXR0ci5hdHRyLAorCQkJCSAgICAgcG9ydHNfZ3JvdXAubmFtZSk7CisJa2ZyZWUocG9ydC0+cG9ydF9uYW1lKTsKKwlrZnJlZShwb3J0KTsKK30KKworc3RhdGljIHZvaWQgdXNicG9ydF90cmlnX3JlbW92ZV91c2JfZGV2X3BvcnRzKHN0cnVjdCB1c2Jwb3J0X3RyaWdfZGF0YSAqdXNicG9ydF9kYXRhLAorCQkJCQkgICAgICBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldikKK3sKKwlzdHJ1Y3QgdXNicG9ydF90cmlnX3BvcnQgKnBvcnQsICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9ydCwgdG1wLCAmdXNicG9ydF9kYXRhLT5wb3J0cywgbGlzdCkgeworCQlpZiAocG9ydC0+aHViID09IHVzYl9kZXYpCisJCQl1c2Jwb3J0X3RyaWdfcmVtb3ZlX3BvcnQodXNicG9ydF9kYXRhLCBwb3J0KTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluaXQsIGV4aXQsIGV0Yy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgdXNicG9ydF90cmlnX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKKwkJCSAgICAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCB1c2Jwb3J0X3RyaWdfZGF0YSAqdXNicG9ydF9kYXRhID0KKwkJY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgdXNicG9ydF90cmlnX2RhdGEsIG5iKTsKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiA9IHVzYnBvcnRfZGF0YS0+bGVkX2NkZXY7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBkYXRhOworCWJvb2wgb2JzZXJ2ZWQ7CisKKwlvYnNlcnZlZCA9IHVzYnBvcnRfdHJpZ191c2JfZGV2X29ic2VydmVkKHVzYnBvcnRfZGF0YSwgdXNiX2Rldik7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgVVNCX0RFVklDRV9BREQ6CisJCXVzYnBvcnRfdHJpZ19hZGRfdXNiX2Rldl9wb3J0cyh1c2JfZGV2LCB1c2Jwb3J0X2RhdGEpOworCQlpZiAob2JzZXJ2ZWQgJiYgdXNicG9ydF9kYXRhLT5jb3VudCsrID09IDApCisJCQlsZWRfY2Rldi0+YnJpZ2h0bmVzc19zZXQobGVkX2NkZXYsIExFRF9GVUxMKTsKKwkJcmV0dXJuIE5PVElGWV9PSzsKKwljYXNlIFVTQl9ERVZJQ0VfUkVNT1ZFOgorCQl1c2Jwb3J0X3RyaWdfcmVtb3ZlX3VzYl9kZXZfcG9ydHModXNicG9ydF9kYXRhLCB1c2JfZGV2KTsKKwkJaWYgKG9ic2VydmVkICYmIC0tdXNicG9ydF9kYXRhLT5jb3VudCA9PSAwKQorCQkJbGVkX2NkZXYtPmJyaWdodG5lc3Nfc2V0KGxlZF9jZGV2LCBMRURfT0ZGKTsKKwkJcmV0dXJuIE5PVElGWV9PSzsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyB2b2lkIHVzYnBvcnRfdHJpZ19hY3RpdmF0ZShzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldikKK3sKKwlzdHJ1Y3QgdXNicG9ydF90cmlnX2RhdGEgKnVzYnBvcnRfZGF0YTsKKwlpbnQgZXJyOworCisJdXNicG9ydF9kYXRhID0ga3phbGxvYyhzaXplb2YoKnVzYnBvcnRfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghdXNicG9ydF9kYXRhKQorCQlyZXR1cm47CisJdXNicG9ydF9kYXRhLT5sZWRfY2RldiA9IGxlZF9jZGV2OworCisJLyogTGlzdCBvZiBwb3J0cyAqLworCUlOSVRfTElTVF9IRUFEKCZ1c2Jwb3J0X2RhdGEtPnBvcnRzKTsKKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmxlZF9jZGV2LT5kZXYtPmtvYmosICZwb3J0c19ncm91cCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZTsKKwl1c2JfZm9yX2VhY2hfZGV2KHVzYnBvcnRfZGF0YSwgdXNicG9ydF90cmlnX2FkZF91c2JfZGV2X3BvcnRzKTsKKworCS8qIE5vdGlmaWNhdGlvbnMgKi8KKwl1c2Jwb3J0X2RhdGEtPm5iLm5vdGlmaWVyX2NhbGwgPSB1c2Jwb3J0X3RyaWdfbm90aWZ5LAorCWxlZF9jZGV2LT50cmlnZ2VyX2RhdGEgPSB1c2Jwb3J0X2RhdGE7CisJdXNiX3JlZ2lzdGVyX25vdGlmeSgmdXNicG9ydF9kYXRhLT5uYik7CisKKwlsZWRfY2Rldi0+YWN0aXZhdGVkID0gdHJ1ZTsKKwlyZXR1cm47CisKK2Vycl9mcmVlOgorCWtmcmVlKHVzYnBvcnRfZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHVzYnBvcnRfdHJpZ19kZWFjdGl2YXRlKHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQoreworCXN0cnVjdCB1c2Jwb3J0X3RyaWdfZGF0YSAqdXNicG9ydF9kYXRhID0gbGVkX2NkZXYtPnRyaWdnZXJfZGF0YTsKKwlzdHJ1Y3QgdXNicG9ydF90cmlnX3BvcnQgKnBvcnQsICp0bXA7CisKKwlpZiAoIWxlZF9jZGV2LT5hY3RpdmF0ZWQpCisJCXJldHVybjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3J0LCB0bXAsICZ1c2Jwb3J0X2RhdGEtPnBvcnRzLCBsaXN0KSB7CisJCXVzYnBvcnRfdHJpZ19yZW1vdmVfcG9ydCh1c2Jwb3J0X2RhdGEsIHBvcnQpOworCX0KKworCXVzYl91bnJlZ2lzdGVyX25vdGlmeSgmdXNicG9ydF9kYXRhLT5uYik7CisKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmxlZF9jZGV2LT5kZXYtPmtvYmosICZwb3J0c19ncm91cCk7CisKKwlrZnJlZSh1c2Jwb3J0X2RhdGEpOworCisJbGVkX2NkZXYtPmFjdGl2YXRlZCA9IGZhbHNlOworfQorCitzdGF0aWMgc3RydWN0IGxlZF90cmlnZ2VyIHVzYnBvcnRfbGVkX3RyaWdnZXIgPSB7CisJLm5hbWUgICAgID0gInVzYnBvcnQiLAorCS5hY3RpdmF0ZSA9IHVzYnBvcnRfdHJpZ19hY3RpdmF0ZSwKKwkuZGVhY3RpdmF0ZSA9IHVzYnBvcnRfdHJpZ19kZWFjdGl2YXRlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdXNicG9ydF90cmlnX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbGVkX3RyaWdnZXJfcmVnaXN0ZXIoJnVzYnBvcnRfbGVkX3RyaWdnZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdXNicG9ydF90cmlnX2V4aXQodm9pZCkKK3sKKwlsZWRfdHJpZ2dlcl91bnJlZ2lzdGVyKCZ1c2Jwb3J0X2xlZF90cmlnZ2VyKTsKK30KKworbW9kdWxlX2luaXQodXNicG9ydF90cmlnX2luaXQpOworbW9kdWxlX2V4aXQodXNicG9ydF90cmlnX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSYWZhxYIgTWnFgmVja2kgPHJhZmFsQG1pbGVja2kucGw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlVTQiBwb3J0IHRyaWdnZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jIGIvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKaW5kZXggMDQwNmE1OS4uM2E0NzA3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKQEAgLTE3NjAsMTcgKzE3NjAsMTQgQEAKIAkJbmludGYgPSBjcC0+ZGVzYy5iTnVtSW50ZXJmYWNlczsKIAkJbmV3X2ludGVyZmFjZXMgPSBrbWFsbG9jKG5pbnRmICogc2l6ZW9mKCpuZXdfaW50ZXJmYWNlcyksCiAJCQkJR0ZQX05PSU8pOwotCQlpZiAoIW5ld19pbnRlcmZhY2VzKSB7Ci0JCQlkZXZfZXJyKCZkZXYtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCQlpZiAoIW5ld19pbnRlcmZhY2VzKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KIAogCQlmb3IgKDsgbiA8IG5pbnRmOyArK24pIHsKIAkJCW5ld19pbnRlcmZhY2VzW25dID0ga3phbGxvYygKIAkJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfaW50ZXJmYWNlKSwKIAkJCQkJR0ZQX05PSU8pOwogCQkJaWYgKCFuZXdfaW50ZXJmYWNlc1tuXSkgewotCQkJCWRldl9lcnIoJmRldi0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CiAJCQkJcmV0ID0gLUVOT01FTTsKIGZyZWVfaW50ZXJmYWNlczoKIAkJCQl3aGlsZSAoLS1uID49IDApCkBAIC0xODYyLDcgKzE4NTksMTIgQEAKIAkJaW50Zi0+ZGV2LmJ1cyA9ICZ1c2JfYnVzX3R5cGU7CiAJCWludGYtPmRldi50eXBlID0gJnVzYl9pZl9kZXZpY2VfdHlwZTsKIAkJaW50Zi0+ZGV2Lmdyb3VwcyA9IHVzYl9pbnRlcmZhY2VfZ3JvdXBzOworCQkvKgorCQkgKiBQbGVhc2UgcmVmZXIgdG8gdXNiX2FsbG9jX2RldigpIHRvIHNlZSB3aHkgd2Ugc2V0CisJCSAqIGRtYV9tYXNrIGFuZCBkbWFfcGZuX29mZnNldC4KKwkJICovCiAJCWludGYtPmRldi5kbWFfbWFzayA9IGRldi0+ZGV2LmRtYV9tYXNrOworCQlpbnRmLT5kZXYuZG1hX3Bmbl9vZmZzZXQgPSBkZXYtPmRldi5kbWFfcGZuX29mZnNldDsKIAkJSU5JVF9XT1JLKCZpbnRmLT5yZXNldF93cywgX191c2JfcXVldWVfcmVzZXRfZGV2aWNlKTsKIAkJaW50Zi0+bWlub3IgPSAtMTsKIAkJZGV2aWNlX2luaXRpYWxpemUoJmludGYtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL29mLmMgYi9kcml2ZXJzL3VzYi9jb3JlL29mLmMKaW5kZXggMjI4OTcwMC4uM2RlNGY4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9vZi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvb2YuYwpAQCAtMTgsNiArMTgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9vZi5oPgogCiAvKioKICAqIHVzYl9vZl9nZXRfY2hpbGRfbm9kZSAtIEZpbmQgdGhlIGRldmljZSBub2RlIG1hdGNoIHBvcnQgbnVtYmVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL290Z193aGl0ZWxpc3QuaCBiL2RyaXZlcnMvdXNiL2NvcmUvb3RnX3doaXRlbGlzdC5oCmluZGV4IGE5NWIwYzkuLjA4NTA0OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvb3RnX3doaXRlbGlzdC5oCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvb3RnX3doaXRlbGlzdC5oCkBAIC0zOCw3ICszOCw3IEBACiB7IFVTQl9ERVZJQ0UoMHgwNTI1LCAweGE0YTIpLCB9LAogI2VuZGlmCiAKLSNpZglkZWZpbmVkKENPTkZJR19VU0JfVEVTVCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX1RFU1RfTU9EVUxFKQorI2lmCUlTX0VOQUJMRUQoQ09ORklHX1VTQl9URVNUKQogLyogZ2FkZ2V0IHplcm8sIGZvciB0ZXN0aW5nICovCiB7IFVTQl9ERVZJQ0UoMHgwNTI1LCAweGE0YTApLCB9LAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jIGIvZHJpdmVycy91c2IvY29yZS91cmIuYwppbmRleCBjNjAxZTI1Li5hOTAzOTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMKQEAgLTY4LDEwICs2OCw4IEBACiAJdXJiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVyYikgKwogCQlpc29fcGFja2V0cyAqIHNpemVvZihzdHJ1Y3QgdXNiX2lzb19wYWNrZXRfZGVzY3JpcHRvciksCiAJCW1lbV9mbGFncyk7Ci0JaWYgKCF1cmIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhbGxvY191cmI6IGttYWxsb2MgZmFpbGVkXG4iKTsKKwlpZiAoIXVyYikKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCXVzYl9pbml0X3VyYih1cmIpOwogCXJldHVybiB1cmI7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jIGIvZHJpdmVycy91c2IvY29yZS91c2IuYwppbmRleCA1ZTgwNjk3Li41OTIxNTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKQEAgLTQ0MCw3ICs0NDAsMTggQEAKIAlkZXYtPmRldi5idXMgPSAmdXNiX2J1c190eXBlOwogCWRldi0+ZGV2LnR5cGUgPSAmdXNiX2RldmljZV90eXBlOwogCWRldi0+ZGV2Lmdyb3VwcyA9IHVzYl9kZXZpY2VfZ3JvdXBzOworCS8qCisJICogRmFrZSBhIGRtYV9tYXNrL29mZnNldCBmb3IgdGhlIFVTQiBkZXZpY2U6CisJICogV2UgY2Fubm90IHJlYWxseSB1c2UgdGhlIGRtYS1tYXBwaW5nIEFQSSAoZG1hX2FsbG9jXyogYW5kCisJICogZG1hX21hcF8qKSBmb3IgVVNCIGRldmljZXMgYnV0IGluc3RlYWQgbmVlZCB0byB1c2UKKwkgKiB1c2JfYWxsb2NfY29oZXJlbnQgYW5kIHBhc3MgZGF0YSBpbiAndXJiJ3MsIGJ1dCBzb21lIHN1YnN5c3RlbXMKKwkgKiBtYW51YWxseSBsb29rIGludG8gdGhlIG1hc2svb2Zmc2V0IHBhaXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKKwkgKiB0aGV5IG5lZWQgYm91bmNlIGJ1ZmZlcnMuCisJICogTm90ZTogY2FsbGluZyBkbWFfc2V0X21hc2soKSBvbiBhIFVTQiBkZXZpY2Ugd291bGQgc2V0IHRoZQorCSAqIG1hc2sgZm9yIHRoZSBlbnRpcmUgSENELCBzbyBkb24ndCBkbyB0aGF0LgorCSAqLwogCWRldi0+ZGV2LmRtYV9tYXNrID0gYnVzLT5jb250cm9sbGVyLT5kbWFfbWFzazsKKwlkZXYtPmRldi5kbWFfcGZuX29mZnNldCA9IGJ1cy0+Y29udHJvbGxlci0+ZG1hX3Bmbl9vZmZzZXQ7CiAJc2V0X2Rldl9ub2RlKCZkZXYtPmRldiwgZGV2X3RvX25vZGUoYnVzLT5jb250cm9sbGVyKSk7CiAJZGV2LT5zdGF0ZSA9IFVTQl9TVEFURV9BVFRBQ0hFRDsKIAlkZXYtPmxwbV9kaXNhYmxlX2NvdW50ID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzIvY29yZS5jIGIvZHJpdmVycy91c2IvZHdjMi9jb3JlLmMKaW5kZXggNDEzNWE1Zi4uZmE5YjI2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMi9jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvZHdjMi9jb3JlLmMKQEAgLTIzOCw2ICsyMzgsNzcgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqIGR3YzJfd2FpdF9mb3JfbW9kZSgpIC0gV2FpdHMgZm9yIHRoZSBjb250cm9sbGVyIG1vZGUuCisgKiBAaHNvdGc6CVByb2dyYW1taW5nIHZpZXcgb2YgdGhlIERXQ19vdGcgY29udHJvbGxlci4KKyAqIEBob3N0X21vZGU6CUlmIHRydWUsIHdhaXRzIGZvciBob3N0IG1vZGUsIG90aGVyd2lzZSBkZXZpY2UgbW9kZS4KKyAqLworc3RhdGljIHZvaWQgZHdjMl93YWl0X2Zvcl9tb2RlKHN0cnVjdCBkd2MyX2hzb3RnICpoc290ZywKKwkJCSAgICAgICBib29sIGhvc3RfbW9kZSkKK3sKKwlrdGltZV90IHN0YXJ0OworCWt0aW1lX3QgZW5kOworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMTEwOworCisJZGV2X3ZkYmcoaHNvdGctPmRldiwgIldhaXRpbmcgZm9yICVzIG1vZGVcbiIsCisJCSBob3N0X21vZGUgPyAiaG9zdCIgOiAiZGV2aWNlIik7CisKKwlzdGFydCA9IGt0aW1lX2dldCgpOworCisJd2hpbGUgKDEpIHsKKwkJczY0IG1zOworCisJCWlmIChkd2MyX2lzX2hvc3RfbW9kZShoc290ZykgPT0gaG9zdF9tb2RlKSB7CisJCQlkZXZfdmRiZyhoc290Zy0+ZGV2LCAiJXMgbW9kZSBzZXRcbiIsCisJCQkJIGhvc3RfbW9kZSA/ICJIb3N0IiA6ICJEZXZpY2UiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZW5kID0ga3RpbWVfZ2V0KCk7CisJCW1zID0ga3RpbWVfdG9fbXMoa3RpbWVfc3ViKGVuZCwgc3RhcnQpKTsKKworCQlpZiAobXMgPj0gKHM2NCl0aW1lb3V0KSB7CisJCQlkZXZfd2Fybihoc290Zy0+ZGV2LCAiJXM6IENvdWxkbid0IHNldCAlcyBtb2RlXG4iLAorCQkJCSBfX2Z1bmNfXywgaG9zdF9tb2RlID8gImhvc3QiIDogImRldmljZSIpOworCQkJYnJlYWs7CisJCX0KKworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisJfQorfQorCisvKioKKyAqIGR3YzJfaWRkaWdfZmlsdGVyX2VuYWJsZWQoKSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgSURESUcgZGVib3VuY2UKKyAqIGZpbHRlciBpcyBlbmFibGVkLgorICovCitzdGF0aWMgYm9vbCBkd2MyX2lkZGlnX2ZpbHRlcl9lbmFibGVkKHN0cnVjdCBkd2MyX2hzb3RnICpoc290ZykKK3sKKwl1MzIgZ3NucHNpZDsKKwl1MzIgZ2h3Y2ZnNDsKKworCWlmICghZHdjMl9od19pc19vdGcoaHNvdGcpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBDaGVjayBpZiBjb3JlIGNvbmZpZ3VyYXRpb24gaW5jbHVkZXMgdGhlIElERElHIGZpbHRlci4gKi8KKwlnaHdjZmc0ID0gZHdjMl9yZWFkbChoc290Zy0+cmVncyArIEdIV0NGRzQpOworCWlmICghKGdod2NmZzQgJiBHSFdDRkc0X0lERElHX0ZJTFRfRU4pKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBJRERJRyBkZWJvdW5jZSBmaWx0ZXIgaXMgYnlwYXNzZWQuIEF2YWlsYWJsZQorCSAqIGluIGNvcmUgdmVyc2lvbiA+PSAzLjEwYS4KKwkgKi8KKwlnc25wc2lkID0gZHdjMl9yZWFkbChoc290Zy0+cmVncyArIEdTTlBTSUQpOworCWlmIChnc25wc2lkID49IERXQzJfQ09SRV9SRVZfM18xMGEpIHsKKwkJdTMyIGdvdGdjdGwgPSBkd2MyX3JlYWRsKGhzb3RnLT5yZWdzICsgR09UR0NUTCk7CisKKwkJaWYgKGdvdGdjdGwgJiBHT1RHQ1RMX0RCTkNFX0ZMVFJfQllQQVNTKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCiAvKgogICogRG8gY29yZSBhIHNvZnQgcmVzZXQgb2YgdGhlIGNvcmUuICBCZSBjYXJlZnVsIHdpdGggdGhpcyBiZWNhdXNlIGl0CiAgKiByZXNldHMgYWxsIHRoZSBpbnRlcm5hbCBzdGF0ZSBtYWNoaW5lcyBvZiB0aGUgY29yZS4KQEAgLTI0Niw5ICszMTcsMzAgQEAKIHsKIAl1MzIgZ3Jlc2V0OwogCWludCBjb3VudCA9IDA7CisJYm9vbCB3YWl0X2Zvcl9ob3N0X21vZGUgPSBmYWxzZTsKIAogCWRldl92ZGJnKGhzb3RnLT5kZXYsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKKwkvKgorCSAqIElmIHRoZSBjdXJyZW50IG1vZGUgaXMgaG9zdCwgZWl0aGVyIGR1ZSB0byB0aGUgZm9yY2UgbW9kZQorCSAqIGJpdCBiZWluZyBzZXQgKHdoaWNoIHBlcnNpc3RzIGFmdGVyIGNvcmUgcmVzZXQpIG9yIHRoZQorCSAqIGNvbm5lY3RvciBpZCBwaW4sIGEgY29yZSBzb2Z0IHJlc2V0IHdpbGwgdGVtcG9yYXJpbHkgcmVzZXQKKwkgKiB0aGUgbW9kZSB0byBkZXZpY2UuIEEgZGVsYXkgZnJvbSB0aGUgSURESUcgZGVib3VuY2UgZmlsdGVyCisJICogd2lsbCBvY2N1ciBiZWZvcmUgZ29pbmcgYmFjayB0byBob3N0IG1vZGUuCisJICoKKwkgKiBEZXRlcm1pbmUgd2hldGhlciB3ZSB3aWxsIGdvIGJhY2sgaW50byBob3N0IG1vZGUgYWZ0ZXIgYQorCSAqIHJlc2V0IGFuZCBhY2NvdW50IGZvciB0aGlzIGRlbGF5IGFmdGVyIHRoZSByZXNldC4KKwkgKi8KKwlpZiAoZHdjMl9pZGRpZ19maWx0ZXJfZW5hYmxlZChoc290ZykpIHsKKwkJdTMyIGdvdGdjdGwgPSBkd2MyX3JlYWRsKGhzb3RnLT5yZWdzICsgR09UR0NUTCk7CisJCXUzMiBndXNiY2ZnID0gZHdjMl9yZWFkbChoc290Zy0+cmVncyArIEdVU0JDRkcpOworCisJCWlmICghKGdvdGdjdGwgJiBHT1RHQ1RMX0NPTklEX0IpIHx8CisJCSAgICAoZ3VzYmNmZyAmIEdVU0JDRkdfRk9SQ0VIT1NUTU9ERSkpIHsKKwkJCXdhaXRfZm9yX2hvc3RfbW9kZSA9IHRydWU7CisJCX0KKwl9CisKIAkvKiBDb3JlIFNvZnQgUmVzZXQgKi8KIAlncmVzZXQgPSBkd2MyX3JlYWRsKGhzb3RnLT5yZWdzICsgR1JTVENUTCk7CiAJZ3Jlc2V0IHw9IEdSU1RDVExfQ1NGVFJTVDsKQEAgLTI3Nyw2ICszNjksOSBAQAogCQl9CiAJfSB3aGlsZSAoIShncmVzZXQgJiBHUlNUQ1RMX0FIQklETEUpKTsKIAorCWlmICh3YWl0X2Zvcl9ob3N0X21vZGUpCisJCWR3YzJfd2FpdF9mb3JfbW9kZShoc290ZywgdHJ1ZSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzAwLDkgKzM5NSw5IEBACiAgKiBDaGVja3MgYXJlIGRvbmUgaW4gdGhpcyBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciBkb2luZyBhIGZvcmNlCiAgKiB3b3VsZCBiZSB2YWxpZCBvciBub3QuCiAgKgotICogSWYgYSBmb3JjZSBpcyBkb25lLCBpdCByZXF1aXJlcyBhIDI1bXMgZGVsYXkgdG8gdGFrZSBlZmZlY3QuCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBtb2RlIHdhcyBmb3JjZWQuCisgKiBJZiBhIGZvcmNlIGlzIGRvbmUsIGl0IHJlcXVpcmVzIGEgSURESUcgZGVib3VuY2UgZmlsdGVyIGRlbGF5IGlmCisgKiB0aGUgZmlsdGVyIGlzIGNvbmZpZ3VyZWQgYW5kIGVuYWJsZWQuIFdlIHBvbGwgdGhlIGN1cnJlbnQgbW9kZSBvZgorICogdGhlIGNvbnRyb2xsZXIgdG8gYWNjb3VudCBmb3IgdGhpcyBkZWxheS4KICAqLwogc3RhdGljIGJvb2wgZHdjMl9mb3JjZV9tb2RlKHN0cnVjdCBkd2MyX2hzb3RnICpoc290ZywgYm9vbCBob3N0KQogewpAQCAtMzM3LDEyICs0MzIsMTggQEAKIAlndXNiY2ZnIHw9IHNldDsKIAlkd2MyX3dyaXRlbChndXNiY2ZnLCBoc290Zy0+cmVncyArIEdVU0JDRkcpOwogCi0JbXNsZWVwKDI1KTsKKwlkd2MyX3dhaXRfZm9yX21vZGUoaHNvdGcsIGhvc3QpOwogCXJldHVybiB0cnVlOwogfQogCi0vKgotICogQ2xlYXJzIHRoZSBmb3JjZSBtb2RlIGJpdHMuCisvKioKKyAqIGR3YzJfY2xlYXJfZm9yY2VfbW9kZSgpIC0gQ2xlYXJzIHRoZSBmb3JjZSBtb2RlIGJpdHMuCisgKgorICogQWZ0ZXIgY2xlYXJpbmcgdGhlIGJpdHMsIHdhaXQgdXAgdG8gMTAwIG1zIHRvIGFjY291bnQgZm9yIGFueQorICogcG90ZW50aWFsIElERElHIGZpbHRlciBkZWxheS4gV2UgY2FuJ3Qga25vdyBpZiB3ZSBleHBlY3QgdGhpcyBkZWxheQorICogb3Igbm90IGJlY2F1c2UgdGhlIHZhbHVlIG9mIHRoZSBjb25uZWN0b3IgSUQgc3RhdHVzIGlzIGFmZmVjdGVkIGJ5CisgKiB0aGUgZm9yY2UgbW9kZS4gV2Ugb25seSBuZWVkIHRvIGNhbGwgdGhpcyBvbmNlIGR1cmluZyBwcm9iZSBpZgorICogZHJfbW9kZSA9PSBPVEcuCiAgKi8KIHN0YXRpYyB2b2lkIGR3YzJfY2xlYXJfZm9yY2VfbW9kZShzdHJ1Y3QgZHdjMl9oc290ZyAqaHNvdGcpCiB7CkBAIC0zNTMsMTEgKzQ1NCw4IEBACiAJZ3VzYmNmZyAmPSB+R1VTQkNGR19GT1JDRURFVk1PREU7CiAJZHdjMl93cml0ZWwoZ3VzYmNmZywgaHNvdGctPnJlZ3MgKyBHVVNCQ0ZHKTsKIAotCS8qCi0JICogTk9URTogVGhpcyBsb25nIHNsZWVwIGlzIF92ZXJ5XyBpbXBvcnRhbnQsIG90aGVyd2lzZSB0aGUgY29yZSB3aWxsCi0JICogbm90IHN0YXkgaW4gaG9zdCBtb2RlIGFmdGVyIGEgY29ubmVjdG9yIElEIGNoYW5nZSEKLQkgKi8KLQltc2xlZXAoMjUpOworCWlmIChkd2MyX2lkZGlnX2ZpbHRlcl9lbmFibGVkKGhzb3RnKSkKKwkJdXNsZWVwX3JhbmdlKDEwMDAwMCwgMTEwMDAwKTsKIH0KIAogLyoKQEAgLTM4MCwxMiArNDc4LDYgQEAKIAkJCSBfX2Z1bmNfXywgaHNvdGctPmRyX21vZGUpOwogCQlicmVhazsKIAl9Ci0KLQkvKgotCSAqIE5PVEU6IFRoaXMgaXMgcmVxdWlyZWQgZm9yIHNvbWUgcm9ja2NoaXAgc29jIGJhc2VkCi0JICogcGxhdGZvcm1zLgotCSAqLwotCW1zbGVlcCg1MCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MyL2NvcmUuaCBiL2RyaXZlcnMvdXNiL2R3YzIvY29yZS5oCmluZGV4IDlmYWUwMjkuLmFhZDQxMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzIvY29yZS5oCisrKyBiL2RyaXZlcnMvdXNiL2R3YzIvY29yZS5oCkBAIC0yNTksMTMgKzI1OSw2IEBACiAJRFdDMl9MMywJLyogT2ZmIHN0YXRlICovCiB9OwogCi0vKgotICogR2FkZ2V0IHBlcmlvZGljIHR4IGZpZm8gc2l6ZXMgYXMgdXNlZCBieSBsZWdhY3kgZHJpdmVyCi0gKiBFUDAgaXMgbm90IGluY2x1ZGVkCi0gKi8KLSNkZWZpbmUgRFdDMl9HX1BfTEVHQUNZX1RYX0ZJRk9fU0laRSB7MjU2LCAyNTYsIDI1NiwgMjU2LCA3NjgsIDc2OCwgNzY4LCBcCi0JCQkJCSAgIDc2OCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KLQogLyogR2FkZ2V0IGVwMCBzdGF0ZXMgKi8KIGVudW0gZHdjMl9lcDBfc3RhdGUgewogCURXQzJfRVAwX1NFVFVQLApAQCAtODY4LDYgKzg2MSw3IEBACiAJdm9pZCAqcHJpdjsKIAlpbnQgICAgIGlycTsKIAlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wgKnJlc2V0OwogCiAJdW5zaWduZWQgaW50IHF1ZXVpbmdfaGlnaF9iYW5kd2lkdGg6MTsKIAl1bnNpZ25lZCBpbnQgc3JwX3N1Y2Nlc3M6MTsKQEAgLTg4OSw2ICs4ODMsNyBAQAogI2RlZmluZSBEV0MyX0NPUkVfUkVWXzJfOTJhCTB4NGY1NDI5MmEKICNkZWZpbmUgRFdDMl9DT1JFX1JFVl8yXzk0YQkweDRmNTQyOTRhCiAjZGVmaW5lIERXQzJfQ09SRV9SRVZfM18wMGEJMHg0ZjU0MzAwYQorI2RlZmluZSBEV0MyX0NPUkVfUkVWXzNfMTBhCTB4NGY1NDMxMGEKIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX1VTQl9EV0MyX0hPU1QpIHx8IElTX0VOQUJMRUQoQ09ORklHX1VTQl9EV0MyX0RVQUxfUk9MRSkKIAl1bmlvbiBkd2MyX2hjZF9pbnRlcm5hbF9mbGFncyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MyL2dhZGdldC5jIGIvZHJpdmVycy91c2IvZHdjMi9nYWRnZXQuYwppbmRleCBhZjQ2YWRmLi40Y2Q2NDAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MyL2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzIvZ2FkZ2V0LmMKQEAgLTE4Niw5ICsxODYsMTAgQEAKICAqLwogc3RhdGljIHZvaWQgZHdjMl9oc290Z19pbml0X2ZpZm8oc3RydWN0IGR3YzJfaHNvdGcgKmhzb3RnKQogewotCXVuc2lnbmVkIGludCBlcDsKKwl1bnNpZ25lZCBpbnQgZmlmbzsKIAl1bnNpZ25lZCBpbnQgYWRkcjsKIAlpbnQgdGltZW91dDsKKwl1MzIgZHB0eGZzaXpuOwogCXUzMiB2YWw7CiAKIAkvKiBSZXNldCBmaWZvIG1hcCBpZiBub3QgY29ycmVjdGx5IGNsZWFyZWQgZHVyaW5nIHByZXZpb3VzIHNlc3Npb24gKi8KQEAgLTIxNiwxNiArMjE3LDE2IEBACiAJICogdGhlbSB0byBlbmRwb2ludHMgZHluYW1pY2FsbHkgYWNjb3JkaW5nIHRvIG1heHBhY2tldCBzaXplIHZhbHVlIG9mCiAJICogZ2l2ZW4gZW5kcG9pbnQuCiAJICovCi0JZm9yIChlcCA9IDE7IGVwIDwgTUFYX0VQU19DSEFOTkVMUzsgZXArKykgewotCQlpZiAoIWhzb3RnLT5nX3R4X2ZpZm9fc3pbZXBdKQotCQkJY29udGludWU7Ci0JCXZhbCA9IGFkZHI7Ci0JCXZhbCB8PSBoc290Zy0+Z190eF9maWZvX3N6W2VwXSA8PCBGSUZPU0laRV9ERVBUSF9TSElGVDsKLQkJV0FSTl9PTkNFKGFkZHIgKyBoc290Zy0+Z190eF9maWZvX3N6W2VwXSA+IGhzb3RnLT5maWZvX21lbSwKLQkJCSAgImluc3VmZmljaWVudCBmaWZvIG1lbW9yeSIpOwotCQlhZGRyICs9IGhzb3RnLT5nX3R4X2ZpZm9fc3pbZXBdOworCWZvciAoZmlmbyA9IDE7IGZpZm8gPCBNQVhfRVBTX0NIQU5ORUxTOyBmaWZvKyspIHsKKwkJZHB0eGZzaXpuID0gZHdjMl9yZWFkbChoc290Zy0+cmVncyArIERQVFhGU0laTihmaWZvKSk7CiAKLQkJZHdjMl93cml0ZWwodmFsLCBoc290Zy0+cmVncyArIERQVFhGU0laTihlcCkpOworCQl2YWwgPSAoZHB0eGZzaXpuICYgRklGT1NJWkVfREVQVEhfTUFTSykgfCBhZGRyOworCQlhZGRyICs9IGRwdHhmc2l6biA+PiBGSUZPU0laRV9ERVBUSF9TSElGVDsKKworCQlpZiAoYWRkciA+IGhzb3RnLT5maWZvX21lbSkKKwkJCWJyZWFrOworCisJCWR3YzJfd3JpdGVsKHZhbCwgaHNvdGctPnJlZ3MgKyBEUFRYRlNJWk4oZmlmbykpOwogCX0KIAogCS8qCkBAIC0zODgsNyArMzg5LDggQEAKIAkJCXJldHVybiAtRU5PU1BDOwogCQl9CiAJfSBlbHNlIGlmIChoc290Zy0+ZGVkaWNhdGVkX2ZpZm9zICYmIGhzX2VwLT5pbmRleCAhPSAwKSB7Ci0JCWNhbl93cml0ZSA9IGR3YzJfcmVhZGwoaHNvdGctPnJlZ3MgKyBEVFhGU1RTKGhzX2VwLT5pbmRleCkpOworCQljYW5fd3JpdGUgPSBkd2MyX3JlYWRsKGhzb3RnLT5yZWdzICsKKwkJCQlEVFhGU1RTKGhzX2VwLT5maWZvX2luZGV4KSk7CiAKIAkJY2FuX3dyaXRlICY9IDB4ZmZmZjsKIAkJY2FuX3dyaXRlICo9IDQ7CkBAIC0yNDMyLDcgKzI0MzQsNyBAQAogCiAJaWYgKCFoc290Zy0+ZGVkaWNhdGVkX2ZpZm9zKQogCQlyZXR1cm47Ci0Jc2l6ZSA9IChkd2MyX3JlYWRsKGhzb3RnLT5yZWdzICsgRFRYRlNUUyhlcC0+aW5kZXgpKSAmIDB4ZmZmZikgKiA0OworCXNpemUgPSAoZHdjMl9yZWFkbChoc290Zy0+cmVncyArIERUWEZTVFMoZXAtPmZpZm9faW5kZXgpKSAmIDB4ZmZmZikgKiA0OwogCWlmIChzaXplIDwgZXAtPmZpZm9fc2l6ZSkKIAkJZHdjMl9oc290Z190eGZpZm9fZmx1c2goaHNvdGcsIGVwLT5maWZvX2luZGV4KTsKIH0KQEAgLTMwNDEsMjIgKzMwNDMsMTEgQEAKIAkJYnJlYWs7CiAJfQogCi0JLyogSWYgZmlmbyBpcyBhbHJlYWR5IGFsbG9jYXRlZCBmb3IgdGhpcyBlcCAqLwotCWlmIChoc19lcC0+Zmlmb19pbmRleCkgewotCQlzaXplID0gIGhzX2VwLT5lcC5tYXhwYWNrZXQgKiBoc19lcC0+bWM7Ci0JCS8qIElmIGJpZ2dlciBmaWZvIGlzIHJlcXVpcmVkIGRlYWxsb2NhdGUgY3VycmVudCBvbmUgKi8KLQkJaWYgKHNpemUgPiBoc19lcC0+Zmlmb19zaXplKSB7Ci0JCQloc290Zy0+Zmlmb19tYXAgJj0gfigxIDw8IGhzX2VwLT5maWZvX2luZGV4KTsKLQkJCWhzX2VwLT5maWZvX2luZGV4ID0gMDsKLQkJCWhzX2VwLT5maWZvX3NpemUgPSAwOwotCQl9Ci0JfQotCiAJLyoKIAkgKiBpZiB0aGUgaGFyZHdhcmUgaGFzIGRlZGljYXRlZCBmaWZvcywgd2UgbXVzdCBnaXZlIGVhY2ggSU4gRVAKIAkgKiBhIHVuaXF1ZSB0eC1maWZvIGV2ZW4gaWYgaXQgaXMgbm9uLXBlcmlvZGljLgogCSAqLwotCWlmIChkaXJfaW4gJiYgaHNvdGctPmRlZGljYXRlZF9maWZvcyAmJiAhaHNfZXAtPmZpZm9faW5kZXgpIHsKKwlpZiAoZGlyX2luICYmIGhzb3RnLT5kZWRpY2F0ZWRfZmlmb3MpIHsKIAkJdTMyIGZpZm9faW5kZXggPSAwOwogCQl1MzIgZmlmb19zaXplID0gVUlOVF9NQVg7CiAJCXNpemUgPSBoc19lcC0+ZXAubWF4cGFja2V0KmhzX2VwLT5tYzsKQEAgLTMxMjksMTAgKzMxMjAsNiBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhzb3RnLT5sb2NrLCBmbGFncyk7CiAKLQloc290Zy0+Zmlmb19tYXAgJj0gfigxPDxoc19lcC0+Zmlmb19pbmRleCk7Ci0JaHNfZXAtPmZpZm9faW5kZXggPSAwOwotCWhzX2VwLT5maWZvX3NpemUgPSAwOwotCiAJY3RybCA9IGR3YzJfcmVhZGwoaHNvdGctPnJlZ3MgKyBlcGN0cmxfcmVnKTsKIAljdHJsICY9IH5EWEVQQ1RMX0VQRU5BOwogCWN0cmwgJj0gfkRYRVBDVExfVVNCQUNURVA7CkBAIC0zMTQ3LDYgKzMxMzQsMTAgQEAKIAkvKiB0ZXJtaW5hdGUgYWxsIHJlcXVlc3RzIHdpdGggc2h1dGRvd24gKi8KIAlraWxsX2FsbF9yZXF1ZXN0cyhoc290ZywgaHNfZXAsIC1FU0hVVERPV04pOwogCisJaHNvdGctPmZpZm9fbWFwICY9IH4oMSA8PCBoc19lcC0+Zmlmb19pbmRleCk7CisJaHNfZXAtPmZpZm9faW5kZXggPSAwOworCWhzX2VwLT5maWZvX3NpemUgPSAwOworCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHNvdGctPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTM0NzUsOCArMzQ2NiwxMSBAQAogCQlvdGdfc2V0X3BlcmlwaGVyYWwoaHNvdGctPnVwaHktPm90ZywgJmhzb3RnLT5nYWRnZXQpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhzb3RnLT5sb2NrLCBmbGFncyk7Ci0JZHdjMl9oc290Z19pbml0KGhzb3RnKTsKLQlkd2MyX2hzb3RnX2NvcmVfaW5pdF9kaXNjb25uZWN0ZWQoaHNvdGcsIGZhbHNlKTsKKwlpZiAoZHdjMl9od19pc19kZXZpY2UoaHNvdGcpKSB7CisJCWR3YzJfaHNvdGdfaW5pdChoc290Zyk7CisJCWR3YzJfaHNvdGdfY29yZV9pbml0X2Rpc2Nvbm5lY3RlZChoc290ZywgZmFsc2UpOworCX0KKwogCWhzb3RnLT5lbmFibGVkID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoc290Zy0+bG9jaywgZmxhZ3MpOwogCkBAIC0zODEzLDM2ICszODA3LDEwIEBACiBzdGF0aWMgdm9pZCBkd2MyX2hzb3RnX29mX3Byb2JlKHN0cnVjdCBkd2MyX2hzb3RnICpoc290ZykKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gaHNvdGctPmRldi0+b2Zfbm9kZTsKLQl1MzIgbGVuID0gMDsKLQl1MzIgaSA9IDA7CiAKIAkvKiBFbmFibGUgZG1hIGlmIHJlcXVlc3RlZCBpbiBkZXZpY2UgdHJlZSAqLwogCWhzb3RnLT5nX3VzaW5nX2RtYSA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImctdXNlLWRtYSIpOwogCi0JLyoKLQkqIFJlZ2lzdGVyIFRYIHBlcmlvZGljIGZpZm8gc2l6ZSBwZXIgZW5kcG9pbnQuCi0JKiBFUDAgaXMgZXhjbHVkZWQgc2luY2UgaXQgaGFzIG5vIGZpZm8gY29uZmlndXJhdGlvbi4KLQkqLwotCWlmICghb2ZfZmluZF9wcm9wZXJ0eShucCwgImctdHgtZmlmby1zaXplIiwgJmxlbikpCi0JCWdvdG8gcnhfZmlmbzsKLQotCWxlbiAvPSBzaXplb2YodTMyKTsKLQotCS8qIFJlYWQgdHggZmlmbyBzaXplcyBvdGhlciB0aGFuIGVwMCAqLwotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShucCwgImctdHgtZmlmby1zaXplIiwKLQkJCQkJCSZoc290Zy0+Z190eF9maWZvX3N6WzFdLCBsZW4pKQotCQlnb3RvIHJ4X2ZpZm87Ci0KLQkvKiBBZGQgZXAwICovCi0JbGVuKys7Ci0KLQkvKiBNYWtlIHJlbWFpbmluZyBUWCBmaWZvcyB1bmF2YWlsYWJsZSAqLwotCWlmIChsZW4gPCBNQVhfRVBTX0NIQU5ORUxTKSB7Ci0JCWZvciAoaSA9IGxlbjsgaSA8IE1BWF9FUFNfQ0hBTk5FTFM7IGkrKykKLQkJCWhzb3RnLT5nX3R4X2ZpZm9fc3pbaV0gPSAwOwotCX0KLQotcnhfZmlmbzoKIAkvKiBSZWdpc3RlciBSWCBmaWZvIHNpemUgKi8KIAlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImctcngtZmlmby1zaXplIiwgJmhzb3RnLT5nX3J4X2ZpZm9fc3opOwogCkBAIC0zODY0LDEzICszODMyLDEwIEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gaHNvdGctPmRldjsKIAlpbnQgZXBudW07CiAJaW50IHJldDsKLQlpbnQgaTsKLQl1MzIgcF90eF9maWZvW10gPSBEV0MyX0dfUF9MRUdBQ1lfVFhfRklGT19TSVpFOwogCiAJLyogSW5pdGlhbGl6ZSB0byBsZWdhY3kgZmlmbyBjb25maWd1cmF0aW9uIHZhbHVlcyAqLwogCWhzb3RnLT5nX3J4X2ZpZm9fc3ogPSAyMDQ4OwogCWhzb3RnLT5nX25wX2dfdHhfZmlmb19zeiA9IDEwMjQ7Ci0JbWVtY3B5KCZoc290Zy0+Z190eF9maWZvX3N6WzFdLCBwX3R4X2ZpZm8sIHNpemVvZihwX3R4X2ZpZm8pKTsKIAkvKiBEZXZpY2UgdHJlZSBzcGVjaWZpYyBwcm9iZSAqLwogCWR3YzJfaHNvdGdfb2ZfcHJvYmUoaHNvdGcpOwogCkBAIC0zODg4LDkgKzM4NTMsNiBAQAogCWRldl9kYmcoZGV2LCAiTm9uUGVyaW9kaWMgVFhGSUZPIHNpemU6ICVkXG4iLAogCQkJCQkJaHNvdGctPmdfbnBfZ190eF9maWZvX3N6KTsKIAlkZXZfZGJnKGRldiwgIlJYRklGTyBzaXplOiAlZFxuIiwgaHNvdGctPmdfcnhfZmlmb19zeik7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9FUFNfQ0hBTk5FTFM7IGkrKykKLQkJZGV2X2RiZyhkZXYsICJQZXJpb2RpYyBUWEZJRk8lMmQgc2l6ZTogJWRcbiIsIGksCi0JCQkJCQloc290Zy0+Z190eF9maWZvX3N6W2ldKTsKIAogCWhzb3RnLT5nYWRnZXQubWF4X3NwZWVkID0gVVNCX1NQRUVEX0hJR0g7CiAJaHNvdGctPmdhZGdldC5vcHMgPSAmZHdjMl9oc290Z19nYWRnZXRfb3BzOwpAQCAtMzkwOCwxNyArMzg3MCwxMyBAQAogCiAJaHNvdGctPmN0cmxfYnVmZiA9IGRldm1fa3phbGxvYyhoc290Zy0+ZGV2LAogCQkJRFdDMl9DVFJMX0JVRkZfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFoc290Zy0+Y3RybF9idWZmKSB7Ci0JCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGN0cmwgcmVxdWVzdCBidWZmXG4iKTsKKwlpZiAoIWhzb3RnLT5jdHJsX2J1ZmYpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWhzb3RnLT5lcDBfYnVmZiA9IGRldm1fa3phbGxvYyhoc290Zy0+ZGV2LAogCQkJRFdDMl9DVFJMX0JVRkZfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFoc290Zy0+ZXAwX2J1ZmYpIHsKLQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgY3RybCByZXBseSBidWZmXG4iKTsKKwlpZiAoIWhzb3RnLT5lcDBfYnVmZikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShoc290Zy0+ZGV2LCBpcnEsIGR3YzJfaHNvdGdfaXJxLCBJUlFGX1NIQVJFRCwKIAkJCQlkZXZfbmFtZShoc290Zy0+ZGV2KSwgaHNvdGcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMi9oY2QuYyBiL2RyaXZlcnMvdXNiL2R3YzIvaGNkLmMKaW5kZXggMmRmM2QwNC4uZGY1YTA2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMi9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9kd2MyL2hjZC5jCkBAIC01MDQwLDcgKzUwNDAsNyBAQAogCiAJLyogQ3JlYXRlIG5ldyB3b3JrcXVldWUgYW5kIGluaXQgd29yayAqLwogCXJldHZhbCA9IC1FTk9NRU07Ci0JaHNvdGctPndxX290ZyA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJkd2MyIik7CisJaHNvdGctPndxX290ZyA9IGFsbG9jX29yZGVyZWRfd29ya3F1ZXVlKCJkd2MyIiwgMCk7CiAJaWYgKCFoc290Zy0+d3Ffb3RnKSB7CiAJCWRldl9lcnIoaHNvdGctPmRldiwgIkZhaWxlZCB0byBjcmVhdGUgd29ya3F1ZXVlXG4iKTsKIAkJZ290byBlcnJvcjI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MyL2h3LmggYi9kcml2ZXJzL3VzYi9kd2MyL2h3LmgKaW5kZXggZWZjM2JjZC4uOTEwNTg0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMi9ody5oCisrKyBiL2RyaXZlcnMvdXNiL2R3YzIvaHcuaApAQCAtNDgsNiArNDgsNyBAQAogI2RlZmluZSBHT1RHQ1RMX0FTRVNWTEQJCQkoMSA8PCAxOCkKICNkZWZpbmUgR09UR0NUTF9EQk5DX1NIT1JUCQkoMSA8PCAxNykKICNkZWZpbmUgR09UR0NUTF9DT05JRF9CCQkJKDEgPDwgMTYpCisjZGVmaW5lIEdPVEdDVExfREJOQ0VfRkxUUl9CWVBBU1MJKDEgPDwgMTUpCiAjZGVmaW5lIEdPVEdDVExfREVWSE5QRU4JCSgxIDw8IDExKQogI2RlZmluZSBHT1RHQ1RMX0hTVFNFVEhOUEVOCQkoMSA8PCAxMCkKICNkZWZpbmUgR09UR0NUTF9ITlBSRVEJCQkoMSA8PCA5KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMi9wbGF0Zm9ybS5jIGIvZHJpdmVycy91c2IvZHdjMi9wbGF0Zm9ybS5jCmluZGV4IGZjNmY1MjUuLjUzMDk1OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzIvcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL3VzYi9kd2MyL3BsYXRmb3JtLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9zM2MtaHNvdGcuaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNldC5oPgogCiAjaW5jbHVkZSA8bGludXgvdXNiL29mLmg+CiAKQEAgLTMzNyw2ICszMzgsMjQgQEAKIHsKIAlpbnQgaSwgcmV0OwogCisJaHNvdGctPnJlc2V0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldF9vcHRpb25hbChoc290Zy0+ZGV2LCAiZHdjMiIpOworCWlmIChJU19FUlIoaHNvdGctPnJlc2V0KSkgeworCQlyZXQgPSBQVFJfRVJSKGhzb3RnLT5yZXNldCk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgLUVOT0VOVDoKKwkJY2FzZSAtRU5PVFNVUFA6CisJCQloc290Zy0+cmVzZXQgPSBOVUxMOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKGhzb3RnLT5kZXYsICJlcnJvciBnZXR0aW5nIHJlc2V0IGNvbnRyb2wgJWRcbiIsCisJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlpZiAoaHNvdGctPnJlc2V0KQorCQlyZXNldF9jb250cm9sX2RlYXNzZXJ0KGhzb3RnLT5yZXNldCk7CisKIAkvKiBTZXQgZGVmYXVsdCBVVE1JIHdpZHRoICovCiAJaHNvdGctPnBoeWlmID0gR1VTQkNGR19QSFlJRjE2OwogCkBAIC00MzQsNiArNDUzLDkgQEAKIAlpZiAoaHNvdGctPmxsX2h3X2VuYWJsZWQpCiAJCWR3YzJfbG93bGV2ZWxfaHdfZGlzYWJsZShoc290Zyk7CiAKKwlpZiAoaHNvdGctPnJlc2V0KQorCQlyZXNldF9jb250cm9sX2Fzc2VydChoc290Zy0+cmVzZXQpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2R3YzMvS2NvbmZpZwppbmRleCBhNjRjZTFjLi5iOTdjZGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvZHdjMy9LY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogY29uZmlnIFVTQl9EV0MzCiAJdHJpc3RhdGUgIkRlc2lnbldhcmUgVVNCMyBEUkQgQ29yZSBTdXBwb3J0IgogCWRlcGVuZHMgb24gKFVTQiB8fCBVU0JfR0FER0VUKSAmJiBIQVNfRE1BCi0Jc2VsZWN0IFVTQl9YSENJX1BMQVRGT1JNIGlmIFVTQl9TVVBQT1JUICYmIFVTQl9YSENJX0hDRAorCXNlbGVjdCBVU0JfWEhDSV9QTEFURk9STSBpZiBVU0JfWEhDSV9IQ0QKIAloZWxwCiAJICBTYXkgWSBvciBNIGhlcmUgaWYgeW91ciBzeXN0ZW0gaGFzIGEgRHVhbCBSb2xlIFN1cGVyU3BlZWQKIAkgIFVTQiBjb250cm9sbGVyIGJhc2VkIG9uIHRoZSBEZXNpZ25XYXJlIFVTQjMgSVAgQ29yZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5jIGIvZHJpdmVycy91c2IvZHdjMy9jb3JlLmMKaW5kZXggOTQ2NjQzMS4uNzI4N2E3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy9jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvZHdjMy9jb3JlLmMKQEAgLTQ5LDYgKzQ5LDU3IEBACiAKICNkZWZpbmUgRFdDM19ERUZBVUxUX0FVVE9TVVNQRU5EX0RFTEFZCTUwMDAgLyogbXMgKi8KIAorLyoqCisgKiBkd2MzX2dldF9kcl9tb2RlIC0gVmFsaWRhdGVzIGFuZCBzZXRzIGRyX21vZGUKKyAqIEBkd2M6IHBvaW50ZXIgdG8gb3VyIGNvbnRleHQgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbnQgZHdjM19nZXRfZHJfbW9kZShzdHJ1Y3QgZHdjMyAqZHdjKQoreworCWVudW0gdXNiX2RyX21vZGUgbW9kZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkd2MtPmRldjsKKwl1bnNpZ25lZCBpbnQgaHdfbW9kZTsKKworCWlmIChkd2MtPmRyX21vZGUgPT0gVVNCX0RSX01PREVfVU5LTk9XTikKKwkJZHdjLT5kcl9tb2RlID0gVVNCX0RSX01PREVfT1RHOworCisJbW9kZSA9IGR3Yy0+ZHJfbW9kZTsKKwlod19tb2RlID0gRFdDM19HSFdQQVJBTVMwX01PREUoZHdjLT5od3BhcmFtcy5od3BhcmFtczApOworCisJc3dpdGNoIChod19tb2RlKSB7CisJY2FzZSBEV0MzX0dIV1BBUkFNUzBfTU9ERV9HQURHRVQ6CisJCWlmIChJU19FTkFCTEVEKENPTkZJR19VU0JfRFdDM19IT1NUKSkgeworCQkJZGV2X2VycihkZXYsCisJCQkJIkNvbnRyb2xsZXIgZG9lcyBub3Qgc3VwcG9ydCBob3N0IG1vZGUuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW1vZGUgPSBVU0JfRFJfTU9ERV9QRVJJUEhFUkFMOworCQlicmVhazsKKwljYXNlIERXQzNfR0hXUEFSQU1TMF9NT0RFX0hPU1Q6CisJCWlmIChJU19FTkFCTEVEKENPTkZJR19VU0JfRFdDM19HQURHRVQpKSB7CisJCQlkZXZfZXJyKGRldiwKKwkJCQkiQ29udHJvbGxlciBkb2VzIG5vdCBzdXBwb3J0IGRldmljZSBtb2RlLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQltb2RlID0gVVNCX0RSX01PREVfSE9TVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKElTX0VOQUJMRUQoQ09ORklHX1VTQl9EV0MzX0hPU1QpKQorCQkJbW9kZSA9IFVTQl9EUl9NT0RFX0hPU1Q7CisJCWVsc2UgaWYgKElTX0VOQUJMRUQoQ09ORklHX1VTQl9EV0MzX0dBREdFVCkpCisJCQltb2RlID0gVVNCX0RSX01PREVfUEVSSVBIRVJBTDsKKwl9CisKKwlpZiAobW9kZSAhPSBkd2MtPmRyX21vZGUpIHsKKwkJZGV2X3dhcm4oZGV2LAorCQkJICJDb25maWd1cmF0aW9uIG1pc21hdGNoLiBkcl9tb2RlIGZvcmNlZCB0byAlc1xuIiwKKwkJCSBtb2RlID09IFVTQl9EUl9NT0RFX0hPU1QgPyAiaG9zdCIgOiAiZ2FkZ2V0Iik7CisKKwkJZHdjLT5kcl9tb2RlID0gbW9kZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogdm9pZCBkd2MzX3NldF9tb2RlKHN0cnVjdCBkd2MzICpkd2MsIHUzMiBtb2RlKQogewogCXUzMiByZWc7CkBAIC00NDgsNiArNDk5LDkgQEAKIAlpZiAoZHdjLT5kaXNfdTNfc3VzcGh5X3F1aXJrKQogCQlyZWcgJj0gfkRXQzNfR1VTQjNQSVBFQ1RMX1NVU1BIWTsKIAorCWlmIChkd2MtPmRpc19kZWxfcGh5X3Bvd2VyX2NoZ19xdWlyaykKKwkJcmVnICY9IH5EV0MzX0dVU0IzUElQRUNUTF9ERVBPQ0hBTkdFOworCiAJZHdjM193cml0ZWwoZHdjLT5yZWdzLCBEV0MzX0dVU0IzUElQRUNUTCgwKSwgcmVnKTsKIAogCXJlZyA9IGR3YzNfcmVhZGwoZHdjLT5yZWdzLCBEV0MzX0dVU0IyUEhZQ0ZHKDApKTsKQEAgLTQ4NSw2ICs1MzksMjMgQEAKIAkJYnJlYWs7CiAJfQogCisJc3dpdGNoIChkd2MtPmhzcGh5X21vZGUpIHsKKwljYXNlIFVTQlBIWV9JTlRFUkZBQ0VfTU9ERV9VVE1JOgorCQlyZWcgJj0gfihEV0MzX0dVU0IyUEhZQ0ZHX1BIWUlGX01BU0sgfAorCQkgICAgICAgRFdDM19HVVNCMlBIWUNGR19VU0JUUkRUSU1fTUFTSyk7CisJCXJlZyB8PSBEV0MzX0dVU0IyUEhZQ0ZHX1BIWUlGKFVUTUlfUEhZSUZfOF9CSVQpIHwKKwkJICAgICAgIERXQzNfR1VTQjJQSFlDRkdfVVNCVFJEVElNKFVTQlRSRFRJTV9VVE1JXzhfQklUKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JQSFlfSU5URVJGQUNFX01PREVfVVRNSVc6CisJCXJlZyAmPSB+KERXQzNfR1VTQjJQSFlDRkdfUEhZSUZfTUFTSyB8CisJCSAgICAgICBEV0MzX0dVU0IyUEhZQ0ZHX1VTQlRSRFRJTV9NQVNLKTsKKwkJcmVnIHw9IERXQzNfR1VTQjJQSFlDRkdfUEhZSUYoVVRNSV9QSFlJRl8xNl9CSVQpIHwKKwkJICAgICAgIERXQzNfR1VTQjJQSFlDRkdfVVNCVFJEVElNKFVTQlRSRFRJTV9VVE1JXzE2X0JJVCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwogCS8qCiAJICogQWJvdmUgMS45NGEsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHNldCBEV0MzX0dVU0IyUEhZQ0ZHX1NVU1BIWSB0bwogCSAqICcwJyBkdXJpbmcgY29yZUNvbnN1bHRhbnQgY29uZmlndXJhdGlvbi4gU28gZGVmYXVsdCB2YWx1ZSB3aWxsCkBAIC01MDAsNiArNTcxLDkgQEAKIAlpZiAoZHdjLT5kaXNfZW5ibHNscG1fcXVpcmspCiAJCXJlZyAmPSB+RFdDM19HVVNCMlBIWUNGR19FTkJMU0xQTTsKIAorCWlmIChkd2MtPmRpc191Ml9mcmVlY2xrX2V4aXN0c19xdWlyaykKKwkJcmVnICY9IH5EV0MzX0dVU0IyUEhZQ0ZHX1UyX0ZSRUVDTEtfRVhJU1RTOworCiAJZHdjM193cml0ZWwoZHdjLT5yZWdzLCBEV0MzX0dVU0IyUEhZQ0ZHKDApLCByZWcpOwogCiAJcmV0dXJuIDA7CkBAIC02NjYsNiArNzQwLDMyIEBACiAJCWdvdG8gZXJyNDsKIAl9CiAKKwlzd2l0Y2ggKGR3Yy0+ZHJfbW9kZSkgeworCWNhc2UgVVNCX0RSX01PREVfUEVSSVBIRVJBTDoKKwkJZHdjM19zZXRfbW9kZShkd2MsIERXQzNfR0NUTF9QUlRDQVBfREVWSUNFKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRFJfTU9ERV9IT1NUOgorCQlkd2MzX3NldF9tb2RlKGR3YywgRFdDM19HQ1RMX1BSVENBUF9IT1NUKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRFJfTU9ERV9PVEc6CisJCWR3YzNfc2V0X21vZGUoZHdjLCBEV0MzX0dDVExfUFJUQ0FQX09URyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl93YXJuKGR3Yy0+ZGV2LCAiVW5zdXBwb3J0ZWQgbW9kZSAlZFxuIiwgZHdjLT5kcl9tb2RlKTsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBFTkRYRkVSIHBvbGxpbmcgaXMgYXZhaWxhYmxlIG9uIHZlcnNpb24gMy4xMGEgYW5kIGxhdGVyIG9mCisJICogdGhlIERXQ191c2IzIGNvbnRyb2xsZXIuIEl0IGlzIE5PVCBhdmFpbGFibGUgaW4gdGhlCisJICogRFdDX3VzYjMxIGNvbnRyb2xsZXIuCisJICovCisJaWYgKCFkd2MzX2lzX3VzYjMxKGR3YykgJiYgZHdjLT5yZXZpc2lvbiA+PSBEV0MzX1JFVklTSU9OXzMxMEEpIHsKKwkJcmVnID0gZHdjM19yZWFkbChkd2MtPnJlZ3MsIERXQzNfR1VDVEwyKTsKKwkJcmVnIHw9IERXQzNfR1VDVEwyX1JTVF9BQ1RCSVRMQVRFUjsKKwkJZHdjM193cml0ZWwoZHdjLT5yZWdzLCBEV0MzX0dVQ1RMMiwgcmVnKTsKKwl9CisKIAlyZXR1cm4gMDsKIAogZXJyNDoKQEAgLTc2Myw3ICs4NjMsNiBAQAogCiAJc3dpdGNoIChkd2MtPmRyX21vZGUpIHsKIAljYXNlIFVTQl9EUl9NT0RFX1BFUklQSEVSQUw6Ci0JCWR3YzNfc2V0X21vZGUoZHdjLCBEV0MzX0dDVExfUFJUQ0FQX0RFVklDRSk7CiAJCXJldCA9IGR3YzNfZ2FkZ2V0X2luaXQoZHdjKTsKIAkJaWYgKHJldCkgewogCQkJaWYgKHJldCAhPSAtRVBST0JFX0RFRkVSKQpAQCAtNzcyLDcgKzg3MSw2IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBVU0JfRFJfTU9ERV9IT1NUOgotCQlkd2MzX3NldF9tb2RlKGR3YywgRFdDM19HQ1RMX1BSVENBUF9IT1NUKTsKIAkJcmV0ID0gZHdjM19ob3N0X2luaXQoZHdjKTsKIAkJaWYgKHJldCkgewogCQkJaWYgKHJldCAhPSAtRVBST0JFX0RFRkVSKQpAQCAtNzgxLDcgKzg3OSw2IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBVU0JfRFJfTU9ERV9PVEc6Ci0JCWR3YzNfc2V0X21vZGUoZHdjLCBEV0MzX0dDVExfUFJUQ0FQX09URyk7CiAJCXJldCA9IGR3YzNfaG9zdF9pbml0KGR3Yyk7CiAJCWlmIChyZXQpIHsKIAkJCWlmIChyZXQgIT0gLUVQUk9CRV9ERUZFUikKQEAgLTg4OCw2ICs5ODUsNyBAQAogCiAJZHdjLT5tYXhpbXVtX3NwZWVkID0gdXNiX2dldF9tYXhpbXVtX3NwZWVkKGRldik7CiAJZHdjLT5kcl9tb2RlID0gdXNiX2dldF9kcl9tb2RlKGRldik7CisJZHdjLT5oc3BoeV9tb2RlID0gb2ZfdXNiX2dldF9waHlfbW9kZShkZXYtPm9mX25vZGUpOwogCiAJZHdjLT5oYXNfbHBtX2VycmF0dW0gPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwKIAkJCQkic25wcyxoYXMtbHBtLWVycmF0dW0iKTsKQEAgLTkyNCw2ICsxMDIyLDEwIEBACiAJCQkJInNucHMsZGlzX2VuYmxzbHBtX3F1aXJrIik7CiAJZHdjLT5kaXNfcnhkZXRfaW5wM19xdWlyayA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LAogCQkJCSJzbnBzLGRpc19yeGRldF9pbnAzX3F1aXJrIik7CisJZHdjLT5kaXNfdTJfZnJlZWNsa19leGlzdHNfcXVpcmsgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwKKwkJCQkic25wcyxkaXMtdTItZnJlZWNsay1leGlzdHMtcXVpcmsiKTsKKwlkd2MtPmRpc19kZWxfcGh5X3Bvd2VyX2NoZ19xdWlyayA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LAorCQkJCSJzbnBzLGRpcy1kZWwtcGh5LXBvd2VyLWNoZy1xdWlyayIpOwogCiAJZHdjLT50eF9kZV9lbXBoYXNpc19xdWlyayA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LAogCQkJCSJzbnBzLHR4X2RlX2VtcGhhc2lzX3F1aXJrIik7CkBAIC05NzIsMTcgKzEwNzQsOSBAQAogCQlnb3RvIGVycjI7CiAJfQogCi0JaWYgKElTX0VOQUJMRUQoQ09ORklHX1VTQl9EV0MzX0hPU1QpICYmCi0JCQkoZHdjLT5kcl9tb2RlID09IFVTQl9EUl9NT0RFX09URyB8fAotCQkJCQlkd2MtPmRyX21vZGUgPT0gVVNCX0RSX01PREVfVU5LTk9XTikpCi0JCWR3Yy0+ZHJfbW9kZSA9IFVTQl9EUl9NT0RFX0hPU1Q7Ci0JZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfVVNCX0RXQzNfR0FER0VUKSAmJgotCQkJKGR3Yy0+ZHJfbW9kZSA9PSBVU0JfRFJfTU9ERV9PVEcgfHwKLQkJCQkJZHdjLT5kcl9tb2RlID09IFVTQl9EUl9NT0RFX1VOS05PV04pKQotCQlkd2MtPmRyX21vZGUgPSBVU0JfRFJfTU9ERV9QRVJJUEhFUkFMOwotCi0JaWYgKGR3Yy0+ZHJfbW9kZSA9PSBVU0JfRFJfTU9ERV9VTktOT1dOKQotCQlkd2MtPmRyX21vZGUgPSBVU0JfRFJfTU9ERV9PVEc7CisJcmV0ID0gZHdjM19nZXRfZHJfbW9kZShkd2MpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMzsKIAogCXJldCA9IGR3YzNfYWxsb2Nfc2NyYXRjaF9idWZmZXJzKGR3Yyk7CiAJaWYgKHJldCkKQEAgLTExOTIsNiArMTI4Niw3IEBACiAJfQogCiAJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShkZXYpOworCXBtX3J1bnRpbWVfcHV0KGRldik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5oIGIvZHJpdmVycy91c2IvZHdjMy9jb3JlLmgKaW5kZXggNDVkNmRlNS4uNmI2MGU0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy9jb3JlLmgKKysrIGIvZHJpdmVycy91c2IvZHdjMy9jb3JlLmgKQEAgLTEwOSw2ICsxMDksNyBAQAogI2RlZmluZSBEV0MzX0dQUlRCSU1BUF9IUzEJMHhjMTg0CiAjZGVmaW5lIERXQzNfR1BSVEJJTUFQX0ZTMAkweGMxODgKICNkZWZpbmUgRFdDM19HUFJUQklNQVBfRlMxCTB4YzE4YworI2RlZmluZSBEV0MzX0dVQ1RMMgkJMHhjMTljCiAKICNkZWZpbmUgRFdDM19WRVJfTlVNQkVSCQkweGMxYTAKICNkZWZpbmUgRFdDM19WRVJfVFlQRQkJMHhjMWE0CkBAIC0xOTksOSArMjAwLDE4IEBACiAKIC8qIEdsb2JhbCBVU0IyIFBIWSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCiAjZGVmaW5lIERXQzNfR1VTQjJQSFlDRkdfUEhZU09GVFJTVAkoMSA8PCAzMSkKKyNkZWZpbmUgRFdDM19HVVNCMlBIWUNGR19VMl9GUkVFQ0xLX0VYSVNUUwkoMSA8PCAzMCkKICNkZWZpbmUgRFdDM19HVVNCMlBIWUNGR19TVVNQSFkJCSgxIDw8IDYpCiAjZGVmaW5lIERXQzNfR1VTQjJQSFlDRkdfVUxQSV9VVE1JCSgxIDw8IDQpCiAjZGVmaW5lIERXQzNfR1VTQjJQSFlDRkdfRU5CTFNMUE0JKDEgPDwgOCkKKyNkZWZpbmUgRFdDM19HVVNCMlBIWUNGR19QSFlJRihuKQkobiA8PCAzKQorI2RlZmluZSBEV0MzX0dVU0IyUEhZQ0ZHX1BIWUlGX01BU0sJRFdDM19HVVNCMlBIWUNGR19QSFlJRigxKQorI2RlZmluZSBEV0MzX0dVU0IyUEhZQ0ZHX1VTQlRSRFRJTShuKQkobiA8PCAxMCkKKyNkZWZpbmUgRFdDM19HVVNCMlBIWUNGR19VU0JUUkRUSU1fTUFTSwlEV0MzX0dVU0IyUEhZQ0ZHX1VTQlRSRFRJTSgweGYpCisjZGVmaW5lIFVTQlRSRFRJTV9VVE1JXzhfQklUCQk5CisjZGVmaW5lIFVTQlRSRFRJTV9VVE1JXzE2X0JJVAkJNQorI2RlZmluZSBVVE1JX1BIWUlGXzE2X0JJVAkJMQorI2RlZmluZSBVVE1JX1BIWUlGXzhfQklUCQkwCiAKIC8qIEdsb2JhbCBVU0IyIFBIWSBWZW5kb3IgQ29udHJvbCBSZWdpc3RlciAqLwogI2RlZmluZSBEV0MzX0dVU0IyUEhZQUNDX05FV1JFR1JFUQkoMSA8PCAyNSkKQEAgLTIzNSw3ICsyNDUsMTAgQEAKICNkZWZpbmUgRFdDM19HRVZOVFNJWl9TSVpFKG4pCQkoKG4pICYgMHhmZmZmKQogCiAvKiBHbG9iYWwgSFdQQVJBTVMwIFJlZ2lzdGVyICovCi0jZGVmaW5lIERXQzNfR0hXUEFSQU1TMF9VU0IzX01PREUobikJKChuKSAmIDB4MykKKyNkZWZpbmUgRFdDM19HSFdQQVJBTVMwX01PREUobikJCSgobikgJiAweDMpCisjZGVmaW5lIERXQzNfR0hXUEFSQU1TMF9NT0RFX0dBREdFVAkwCisjZGVmaW5lIERXQzNfR0hXUEFSQU1TMF9NT0RFX0hPU1QJMQorI2RlZmluZSBEV0MzX0dIV1BBUkFNUzBfTU9ERV9EUkQJMgogI2RlZmluZSBEV0MzX0dIV1BBUkFNUzBfTUJVU19UWVBFKG4pCSgoKG4pID4+IDMpICYgMHg3KQogI2RlZmluZSBEV0MzX0dIV1BBUkFNUzBfU0JVU19UWVBFKG4pCSgoKG4pID4+IDYpICYgMHgzKQogI2RlZmluZSBEV0MzX0dIV1BBUkFNUzBfTURXSURUSChuKQkoKChuKSA+PiA4KSAmIDB4ZmYpCkBAIC0yNzksNiArMjkyLDkgQEAKICNkZWZpbmUgRFdDM19HRkxBREpfMzBNSFpfU0RCTkRfU0VMCQkoMSA8PCA3KQogI2RlZmluZSBEV0MzX0dGTEFESl8zME1IWl9NQVNLCQkJMHgzZgogCisvKiBHbG9iYWwgVXNlciBDb250cm9sIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgRFdDM19HVUNUTDJfUlNUX0FDVEJJVExBVEVSCQkoMSA8PCAxNCkKKwogLyogRGV2aWNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KICNkZWZpbmUgRFdDM19EQ0ZHX0RFVkFERFIoYWRkcikJKChhZGRyKSA8PCAzKQogI2RlZmluZSBEV0MzX0RDRkdfREVWQUREUl9NQVNLCURXQzNfRENGR19ERVZBRERSKDB4N2YpCkBAIC02ODUsNiArNzAxLDggQEAKICAqIEByZXF1ZXN0OiBzdHJ1Y3QgdXNiX3JlcXVlc3QgdG8gYmUgdHJhbnNmZXJyZWQKICAqIEBsaXN0OiBhIGxpc3RfaGVhZCB1c2VkIGZvciByZXF1ZXN0IHF1ZXVlaW5nCiAgKiBAZGVwOiBzdHJ1Y3QgZHdjM19lcCBvd25pbmcgdGhpcyByZXF1ZXN0CisgKiBAc2c6IHBvaW50ZXIgdG8gZmlyc3QgaW5jb21wbGV0ZSBzZworICogQG51bV9wZW5kaW5nX3NnczogY291bnRlciB0byBwZW5kaW5nIHNncwogICogQGZpcnN0X3RyYl9pbmRleDogaW5kZXggdG8gZmlyc3QgdHJiIHVzZWQgYnkgdGhpcyByZXF1ZXN0CiAgKiBAZXBudW06IGVuZHBvaW50IG51bWJlciB0byB3aGljaCB0aGlzIHJlcXVlc3QgcmVmZXJzCiAgKiBAdHJiOiBwb2ludGVyIHRvIHN0cnVjdCBkd2MzX3RyYgpAQCAtNjk3LDcgKzcxNSw5IEBACiAJc3RydWN0IHVzYl9yZXF1ZXN0CXJlcXVlc3Q7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogCXN0cnVjdCBkd2MzX2VwCQkqZGVwOworCXN0cnVjdCBzY2F0dGVybGlzdAkqc2c7CiAKKwl1bnNpZ25lZAkJbnVtX3BlbmRpbmdfc2dzOwogCXU4CQkJZmlyc3RfdHJiX2luZGV4OwogCXU4CQkJZXBudW07CiAJc3RydWN0IGR3YzNfdHJiCQkqdHJiOwpAQCAtNzQzLDYgKzc2Myw5IEBACiAgKiBAbWF4aW11bV9zcGVlZDogbWF4aW11bSBzcGVlZCByZXF1ZXN0ZWQgKG1haW5seSBmb3IgdGVzdGluZyBwdXJwb3NlcykKICAqIEByZXZpc2lvbjogcmV2aXNpb24gcmVnaXN0ZXIgY29udGVudHMKICAqIEBkcl9tb2RlOiByZXF1ZXN0ZWQgbW9kZSBvZiBvcGVyYXRpb24KKyAqIEBoc3BoeV9tb2RlOiBVVE1JIHBoeSBtb2RlLCBvbmUgb2YgZm9sbG93aW5nOgorICoJCS0gVVNCUEhZX0lOVEVSRkFDRV9NT0RFX1VUTUkKKyAqCQktIFVTQlBIWV9JTlRFUkZBQ0VfTU9ERV9VVE1JVwogICogQHVzYjJfcGh5OiBwb2ludGVyIHRvIFVTQjIgUEhZCiAgKiBAdXNiM19waHk6IHBvaW50ZXIgdG8gVVNCMyBQSFkKICAqIEB1c2IyX2dlbmVyaWNfcGh5OiBwb2ludGVyIHRvIFVTQjIgUEhZCkBAIC03OTksNiArODIyLDExIEBACiAgKiBAZGlzX3UyX3N1c3BoeV9xdWlyazogc2V0IGlmIHdlIGRpc2FibGUgdXNiMiBzdXNwZW5kIHBoeQogICogQGRpc19lbmJsc2xwbV9xdWlyazogc2V0IGlmIHdlIGNsZWFyIGVuYmxzbHBtIGluIEdVU0IyUEhZQ0ZHLAogICogICAgICAgICAgICAgICAgICAgICAgZGlzYWJsaW5nIHRoZSBzdXNwZW5kIHNpZ25hbCB0byB0aGUgUEhZLgorICogQGRpc191Ml9mcmVlY2xrX2V4aXN0c19xdWlyayA6IHNldCBpZiB3ZSBjbGVhciB1Ml9mcmVlY2xrX2V4aXN0cworICoJCQlpbiBHVVNCMlBIWUNGRywgc3BlY2lmeSB0aGF0IFVTQjIgUEhZIGRvZXNuJ3QKKyAqCQkJcHJvdmlkZSBhIGZyZWUtcnVubmluZyBQSFkgY2xvY2suCisgKiBAZGlzX2RlbF9waHlfcG93ZXJfY2hnX3F1aXJrOiBzZXQgaWYgd2UgZGlzYWJsZSBkZWxheSBwaHkgcG93ZXIKKyAqCQkJY2hhbmdlIHF1aXJrLgogICogQHR4X2RlX2VtcGhhc2lzX3F1aXJrOiBzZXQgaWYgd2UgZW5hYmxlIFR4IGRlLWVtcGhhc2lzIHF1aXJrCiAgKiBAdHhfZGVfZW1waGFzaXM6IFR4IGRlLWVtcGhhc2lzIHZhbHVlCiAgKiAJMAktIC02ZEIgZGUtZW1waGFzaXMKQEAgLTg0NSw2ICs4NzMsNyBAQAogCXNpemVfdAkJCXJlZ3Nfc2l6ZTsKIAogCWVudW0gdXNiX2RyX21vZGUJZHJfbW9kZTsKKwllbnVtIHVzYl9waHlfaW50ZXJmYWNlCWhzcGh5X21vZGU7CiAKIAl1MzIJCQlmbGFkajsKIAl1MzIJCQlpcnFfZ2FkZ2V0OwpAQCAtODgwLDYgKzkwOSw4IEBACiAjZGVmaW5lIERXQzNfUkVWSVNJT05fMjYwQQkweDU1MzMyNjBhCiAjZGVmaW5lIERXQzNfUkVWSVNJT05fMjcwQQkweDU1MzMyNzBhCiAjZGVmaW5lIERXQzNfUkVWSVNJT05fMjgwQQkweDU1MzMyODBhCisjZGVmaW5lIERXQzNfUkVWSVNJT05fMzAwQQkweDU1MzMzMDBhCisjZGVmaW5lIERXQzNfUkVWSVNJT05fMzEwQQkweDU1MzMzMTBhCiAKIC8qCiAgKiBOT1RJQ0U6IHdlJ3JlIHVzaW5nIGJpdCAzMSBhcyBhICJpcyB1c2IgMy4xIiBmbGFnLiBUaGlzIGlzIHJlYWxseQpAQCAtOTQyLDYgKzk3Myw4IEBACiAJdW5zaWduZWQJCWRpc191Ml9zdXNwaHlfcXVpcms6MTsKIAl1bnNpZ25lZAkJZGlzX2VuYmxzbHBtX3F1aXJrOjE7CiAJdW5zaWduZWQJCWRpc19yeGRldF9pbnAzX3F1aXJrOjE7CisJdW5zaWduZWQJCWRpc191Ml9mcmVlY2xrX2V4aXN0c19xdWlyazoxOworCXVuc2lnbmVkCQlkaXNfZGVsX3BoeV9wb3dlcl9jaGdfcXVpcms6MTsKIAogCXVuc2lnbmVkCQl0eF9kZV9lbXBoYXNpc19xdWlyazoxOwogCXVuc2lnbmVkCQl0eF9kZV9lbXBoYXNpczoyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9kZWJ1Zy5oIGIvZHJpdmVycy91c2IvZHdjMy9kZWJ1Zy5oCmluZGV4IDIyZGZjM2QuLjMzYWIyYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvZGVidWcuaAorKysgYi9kcml2ZXJzL3VzYi9kd2MzL2RlYnVnLmgKQEAgLTE5Miw3ICsxOTIsNyBAQAogCWludCByZXQ7CiAKIAlyZXQgPSBzcHJpbnRmKHN0ciwgImVwJWQlczogIiwgZXBudW0gPj4gMSwKLQkJCShlcG51bSAmIDEpID8gImluIiA6ICJpbiIpOworCQkJKGVwbnVtICYgMSkgPyAiaW4iIDogIm91dCIpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gIlVOS05PV04iOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtb2Ytc2ltcGxlLmMgYi9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtb2Ytc2ltcGxlLmMKaW5kZXggOTc0MzM1My4uZmU0MTRlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy9kd2MzLW9mLXNpbXBsZS5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1vZi1zaW1wbGUuYwpAQCAtMzYsMzUgKzM2LDI1IEBACiAJaW50CQkJbnVtX2Nsb2NrczsKIH07CiAKLXN0YXRpYyBpbnQgZHdjM19vZl9zaW1wbGVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgZHdjM19vZl9zaW1wbGVfY2xrX2luaXQoc3RydWN0IGR3YzNfb2Zfc2ltcGxlICpzaW1wbGUsIGludCBjb3VudCkKIHsKLQlzdHJ1Y3QgZHdjM19vZl9zaW1wbGUJKnNpbXBsZTsKLQlzdHJ1Y3QgZGV2aWNlCQkqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2ID0gc2ltcGxlLT5kZXY7CiAJc3RydWN0IGRldmljZV9ub2RlCSpucCA9IGRldi0+b2Zfbm9kZTsKLQotCXVuc2lnbmVkIGludAkJY291bnQ7Ci0JaW50CQkJcmV0OwogCWludAkJCWk7CiAKLQlzaW1wbGUgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnNpbXBsZSksIEdGUF9LRVJORUwpOwotCWlmICghc2ltcGxlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNvdW50ID0gb2ZfY2xrX2dldF9wYXJlbnRfY291bnQobnApOwotCWlmICghY291bnQpCi0JCXJldHVybiAtRU5PRU5UOwotCiAJc2ltcGxlLT5udW1fY2xvY2tzID0gY291bnQ7CiAKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gMDsKKwogCXNpbXBsZS0+Y2xrcyA9IGRldm1fa2NhbGxvYyhkZXYsIHNpbXBsZS0+bnVtX2Nsb2NrcywKIAkJCXNpemVvZihzdHJ1Y3QgY2xrICopLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNpbXBsZS0+Y2xrcykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzaW1wbGUtPmRldiA9IGRldjsKLQogCWZvciAoaSA9IDA7IGkgPCBzaW1wbGUtPm51bV9jbG9ja3M7IGkrKykgewogCQlzdHJ1Y3QgY2xrCSpjbGs7CisJCWludAkJcmV0OwogCiAJCWNsayA9IG9mX2Nsa19nZXQobnAsIGkpOwogCQlpZiAoSVNfRVJSKGNsaykpIHsKQEAgLTg3LDYgKzc3LDI5IEBACiAJCXNpbXBsZS0+Y2xrc1tpXSA9IGNsazsKIAl9CiAKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkd2MzX29mX3NpbXBsZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkd2MzX29mX3NpbXBsZQkqc2ltcGxlOworCXN0cnVjdCBkZXZpY2UJCSpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZQkqbnAgPSBkZXYtPm9mX25vZGU7CisKKwlpbnQJCQlyZXQ7CisJaW50CQkJaTsKKworCXNpbXBsZSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqc2ltcGxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzaW1wbGUpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgc2ltcGxlKTsKKwlzaW1wbGUtPmRldiA9IGRldjsKKworCXJldCA9IGR3YzNfb2Zfc2ltcGxlX2Nsa19pbml0KHNpbXBsZSwgb2ZfY2xrX2dldF9wYXJlbnRfY291bnQobnApKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJcmV0ID0gb2ZfcGxhdGZvcm1fcG9wdWxhdGUobnAsIE5VTEwsIE5VTEwsIGRldik7CiAJaWYgKHJldCkgewogCQlmb3IgKGkgPSAwOyBpIDwgc2ltcGxlLT5udW1fY2xvY2tzOyBpKyspIHsKQEAgLTExMSw3ICsxMjQsNyBAQAogCWludAkJCWk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2ltcGxlLT5udW1fY2xvY2tzOyBpKyspIHsKLQkJY2xrX3VucHJlcGFyZShzaW1wbGUtPmNsa3NbaV0pOworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoc2ltcGxlLT5jbGtzW2ldKTsKIAkJY2xrX3B1dChzaW1wbGUtPmNsa3NbaV0pOwogCX0KIApAQCAtMTYxLDcgKzE3NCw5IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2R3YzNfc2ltcGxlX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLGR3YzMiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktZHdjMyIgfSwKIAl7IC5jb21wYXRpYmxlID0gInhsbngsenlucW1wLWR3YzMiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJjYXZpdW0sb2N0ZW9uLTcxMzAtdXNiLXVjdGwiIH0sCiAJeyAvKiBTZW50aW5lbCAqLyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb2ZfZHdjM19zaW1wbGVfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9kd2MzLXBjaS5jIGIvZHJpdmVycy91c2IvZHdjMy9kd2MzLXBjaS5jCmluZGV4IDQ1ZjVhMjMuLjZkZjBmNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1wY2kuYworKysgYi9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtcGNpLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9CWFQJCQkweDBhYWEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9CWFRfTQkJMHgxYWFhCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfQVBMCQkJMHg1YWFhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfS0JQCQkJMHhhMmIwCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9ncGlvX3BhcmFtcyByZXNldF9ncGlvcyA9IHsgMCwgMCwgZmFsc2UgfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9ncGlvX3BhcmFtcyBjc19ncGlvcyA9IHsgMSwgMCwgZmFsc2UgfTsKQEAgLTIyNyw2ICsyMjgsNyBAQAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0JYVCksIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfQlhUX00pLCB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0FQTCksIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfS0JQKSwgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX05MX1VTQiksIH0sCiAJeyAgfQkvKiBUZXJtaW5hdGluZyBFbnRyeSAqLwogfTsKQEAgLTI0MSw2ICsyNDMsMTUgQEAKIAlyZXR1cm4gLUVCVVNZOwogfQogCitzdGF0aWMgaW50IGR3YzNfcGNpX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkd2MzID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gcG1fcnVudGltZV9nZXQoJmR3YzMtPmRldik7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIHN0YXRpYyBpbnQgZHdjM19wY2lfcG1fZHVtbXkoc3RydWN0IGRldmljZSAqZGV2KQogewogCS8qCkBAIC0yNTMsMTEgKzI2NCwxMSBAQAogCSAqLwogCXJldHVybiAwOwogfQotI2VuZGlmIC8qIENPTkZJR19QTSAqLworI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLwogCiBzdGF0aWMgc3RydWN0IGRldl9wbV9vcHMgZHdjM19wY2lfZGV2X3BtX29wcyA9IHsKIAlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhkd2MzX3BjaV9wbV9kdW1teSwgZHdjM19wY2lfcG1fZHVtbXkpCi0JU0VUX1JVTlRJTUVfUE1fT1BTKGR3YzNfcGNpX3J1bnRpbWVfc3VzcGVuZCwgZHdjM19wY2lfcG1fZHVtbXksCisJU0VUX1JVTlRJTUVfUE1fT1BTKGR3YzNfcGNpX3J1bnRpbWVfc3VzcGVuZCwgZHdjM19wY2lfcnVudGltZV9yZXN1bWUsCiAJCU5VTEwpCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL2dhZGdldC5jIGIvZHJpdmVycy91c2IvZHdjMy9nYWRnZXQuYwppbmRleCA4ZjhjMjE1Li4wN2NjODkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzMvZ2FkZ2V0LmMKQEAgLTE3NCwxNSArMTc0LDggQEAKIAkJaW50IHN0YXR1cykKIHsKIAlzdHJ1Y3QgZHdjMwkJCSpkd2MgPSBkZXAtPmR3YzsKLQlpbnQJCQkJaTsKIAotCWlmIChyZXEtPnN0YXJ0ZWQpIHsKLQkJaSA9IDA7Ci0JCWRvIHsKLQkJCWR3YzNfZXBfaW5jX2RlcShkZXApOwotCQl9IHdoaWxlKCsraSA8IHJlcS0+cmVxdWVzdC5udW1fbWFwcGVkX3Nncyk7Ci0JCXJlcS0+c3RhcnRlZCA9IGZhbHNlOwotCX0KKwlyZXEtPnN0YXJ0ZWQgPSBmYWxzZTsKIAlsaXN0X2RlbCgmcmVxLT5saXN0KTsKIAlyZXEtPnRyYiA9IE5VTEw7CiAKQEAgLTM0OCw3ICszNDEsOCBAQAogCSAqIElOIHRyYW5zZmVycyBkdWUgdG8gYSBtaXNoYW5kbGVkIGVycm9yIGNvbmRpdGlvbi4gU3lub3BzeXMKIAkgKiBTVEFSIDkwMDA2MTQyNTIuCiAJICovCi0JaWYgKGRlcC0+ZGlyZWN0aW9uICYmIChkd2MtPnJldmlzaW9uID49IERXQzNfUkVWSVNJT05fMjYwQSkpCisJaWYgKGRlcC0+ZGlyZWN0aW9uICYmIChkd2MtPnJldmlzaW9uID49IERXQzNfUkVWSVNJT05fMjYwQSkgJiYKKwkgICAgKGR3Yy0+Z2FkZ2V0LnNwZWVkID49IFVTQl9TUEVFRF9TVVBFUikpCiAJCWNtZCB8PSBEV0MzX0RFUENNRF9DTEVBUlBFTkRJTjsKIAogCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CkBAIC00OTAsNyArNDg0LDggQEAKIAkJcGFyYW1zLnBhcmFtMCB8PSBEV0MzX0RFUENGR19BQ1RJT05fSU5JVDsKIAl9CiAKLQlwYXJhbXMucGFyYW0xID0gRFdDM19ERVBDRkdfWEZFUl9DT01QTEVURV9FTjsKKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChkZXNjKSkKKwkJcGFyYW1zLnBhcmFtMSA9IERXQzNfREVQQ0ZHX1hGRVJfQ09NUExFVEVfRU47CiAKIAlpZiAoZGVwLT5udW1iZXIgPD0gMSB8fCB1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGRlc2MpKQogCQlwYXJhbXMucGFyYW0xIHw9IERXQzNfREVQQ0ZHX1hGRVJfTk9UX1JFQURZX0VOOwpAQCAtNzY0LDYgKzc1OSw4IEBACiAJa2ZyZWUocmVxKTsKIH0KIAorc3RhdGljIHUzMiBkd2MzX2NhbGNfdHJic19sZWZ0KHN0cnVjdCBkd2MzX2VwICpkZXApOworCiAvKioKICAqIGR3YzNfcHJlcGFyZV9vbmVfdHJiIC0gc2V0dXAgb25lIFRSQiBmcm9tIG9uZSByZXF1ZXN0CiAgKiBAZGVwOiBlbmRwb2ludCBmb3Igd2hpY2ggdGhpcyByZXF1ZXN0IGlzIHByZXBhcmVkCkBAIC03NzEsMTUgKzc2OCwxMyBAQAogICovCiBzdGF0aWMgdm9pZCBkd2MzX3ByZXBhcmVfb25lX3RyYihzdHJ1Y3QgZHdjM19lcCAqZGVwLAogCQlzdHJ1Y3QgZHdjM19yZXF1ZXN0ICpyZXEsIGRtYV9hZGRyX3QgZG1hLAotCQl1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIGxhc3QsIHVuc2lnbmVkIGNoYWluLCB1bnNpZ25lZCBub2RlKQorCQl1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIGNoYWluLCB1bnNpZ25lZCBub2RlKQogewogCXN0cnVjdCBkd2MzX3RyYgkJKnRyYjsKIAotCWR3YzNfdHJhY2UodHJhY2VfZHdjM19nYWRnZXQsICIlczogcmVxICVwIGRtYSAlMDhsbHggbGVuZ3RoICVkJXMlcyIsCisJZHdjM190cmFjZSh0cmFjZV9kd2MzX2dhZGdldCwgIiVzOiByZXEgJXAgZG1hICUwOGxseCBsZW5ndGggJWQlcyIsCiAJCQlkZXAtPm5hbWUsIHJlcSwgKHVuc2lnbmVkIGxvbmcgbG9uZykgZG1hLAotCQkJbGVuZ3RoLCBsYXN0ID8gIiBsYXN0IiA6ICIiLAotCQkJY2hhaW4gPyAiIGNoYWluIiA6ICIiKTsKLQorCQkJbGVuZ3RoLCBjaGFpbiA/ICIgY2hhaW4iIDogIiIpOwogCiAJdHJiID0gJmRlcC0+dHJiX3Bvb2xbZGVwLT50cmJfZW5xdWV1ZV07CiAKQEAgLTgyNiwxMiArODIxLDEwIEBACiAJLyogYWx3YXlzIGVuYWJsZSBDb250aW51ZSBvbiBTaG9ydCBQYWNrZXQgKi8KIAl0cmItPmN0cmwgfD0gRFdDM19UUkJfQ1RSTF9DU1A7CiAKLQlpZiAoIXJlcS0+cmVxdWVzdC5ub19pbnRlcnJ1cHQgJiYgIWNoYWluKQorCWlmICgoIXJlcS0+cmVxdWVzdC5ub19pbnRlcnJ1cHQgJiYgIWNoYWluKSB8fAorCQkJKGR3YzNfY2FsY190cmJzX2xlZnQoZGVwKSA9PSAwKSkKIAkJdHJiLT5jdHJsIHw9IERXQzNfVFJCX0NUUkxfSU9DIHwgRFdDM19UUkJfQ1RSTF9JU1BfSU1JOwogCi0JaWYgKGxhc3QpCi0JCXRyYi0+Y3RybCB8PSBEV0MzX1RSQl9DVFJMX0xTVDsKLQogCWlmIChjaGFpbikKIAkJdHJiLT5jdHJsIHw9IERXQzNfVFJCX0NUUkxfQ0hOOwogCkBAIC04NTYsMTIgKzg0OSwxMiBAQAogICovCiBzdGF0aWMgc3RydWN0IGR3YzNfdHJiICpkd2MzX2VwX3ByZXZfdHJiKHN0cnVjdCBkd2MzX2VwICpkZXAsIHU4IGluZGV4KQogewotCWlmICghaW5kZXgpCi0JCWluZGV4ID0gRFdDM19UUkJfTlVNIC0gMjsKLQllbHNlCi0JCWluZGV4ID0gZGVwLT50cmJfZW5xdWV1ZSAtIDE7CisJdTggdG1wID0gaW5kZXg7CiAKLQlyZXR1cm4gJmRlcC0+dHJiX3Bvb2xbaW5kZXhdOworCWlmICghdG1wKQorCQl0bXAgPSBEV0MzX1RSQl9OVU0gLSAxOworCisJcmV0dXJuICZkZXAtPnRyYl9wb29sW3RtcCAtIDFdOwogfQogCiBzdGF0aWMgdTMyIGR3YzNfY2FsY190cmJzX2xlZnQoc3RydWN0IGR3YzNfZXAgKmRlcCkKQEAgLTg5NCw2NSArODg3LDQyIEBACiB9CiAKIHN0YXRpYyB2b2lkIGR3YzNfcHJlcGFyZV9vbmVfdHJiX3NnKHN0cnVjdCBkd2MzX2VwICpkZXAsCi0JCXN0cnVjdCBkd2MzX3JlcXVlc3QgKnJlcSwgdW5zaWduZWQgaW50IHRyYnNfbGVmdCwKLQkJdW5zaWduZWQgaW50IG1vcmVfY29taW5nKQorCQlzdHJ1Y3QgZHdjM19yZXF1ZXN0ICpyZXEpCiB7Ci0Jc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXF1ZXN0ID0gJnJlcS0+cmVxdWVzdDsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gcmVxdWVzdC0+c2c7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHJlcS0+c2c7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzOwotCXVuc2lnbmVkIGludAlsYXN0ID0gZmFsc2U7CiAJdW5zaWduZWQgaW50CWxlbmd0aDsKIAlkbWFfYWRkcl90CWRtYTsKIAlpbnQJCWk7CiAKLQlmb3JfZWFjaF9zZyhzZywgcywgcmVxdWVzdC0+bnVtX21hcHBlZF9zZ3MsIGkpIHsKKwlmb3JfZWFjaF9zZyhzZywgcywgcmVxLT5udW1fcGVuZGluZ19zZ3MsIGkpIHsKIAkJdW5zaWduZWQgY2hhaW4gPSB0cnVlOwogCiAJCWxlbmd0aCA9IHNnX2RtYV9sZW4ocyk7CiAJCWRtYSA9IHNnX2RtYV9hZGRyZXNzKHMpOwogCi0JCWlmIChzZ19pc19sYXN0KHMpKSB7Ci0JCQlpZiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGRlcC0+ZW5kcG9pbnQuZGVzYykgfHwKLQkJCQkhbW9yZV9jb21pbmcpCi0JCQkJbGFzdCA9IHRydWU7Ci0KLQkJCWNoYWluID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAoIXRyYnNfbGVmdC0tKQotCQkJbGFzdCA9IHRydWU7Ci0KLQkJaWYgKGxhc3QpCisJCWlmIChzZ19pc19sYXN0KHMpKQogCQkJY2hhaW4gPSBmYWxzZTsKIAogCQlkd2MzX3ByZXBhcmVfb25lX3RyYihkZXAsIHJlcSwgZG1hLCBsZW5ndGgsCi0JCQkJbGFzdCwgY2hhaW4sIGkpOworCQkJCWNoYWluLCBpKTsKIAotCQlpZiAobGFzdCkKKwkJaWYgKCFkd2MzX2NhbGNfdHJic19sZWZ0KGRlcCkpCiAJCQlicmVhazsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGR3YzNfcHJlcGFyZV9vbmVfdHJiX2xpbmVhcihzdHJ1Y3QgZHdjM19lcCAqZGVwLAotCQlzdHJ1Y3QgZHdjM19yZXF1ZXN0ICpyZXEsIHVuc2lnbmVkIGludCB0cmJzX2xlZnQsCi0JCXVuc2lnbmVkIGludCBtb3JlX2NvbWluZykKKwkJc3RydWN0IGR3YzNfcmVxdWVzdCAqcmVxKQogewotCXVuc2lnbmVkIGludAlsYXN0ID0gZmFsc2U7CiAJdW5zaWduZWQgaW50CWxlbmd0aDsKIAlkbWFfYWRkcl90CWRtYTsKIAogCWRtYSA9IHJlcS0+cmVxdWVzdC5kbWE7CiAJbGVuZ3RoID0gcmVxLT5yZXF1ZXN0Lmxlbmd0aDsKIAotCWlmICghdHJic19sZWZ0KQotCQlsYXN0ID0gdHJ1ZTsKLQotCS8qIElzIHRoaXMgdGhlIGxhc3QgcmVxdWVzdD8gKi8KLQlpZiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGRlcC0+ZW5kcG9pbnQuZGVzYykgfHwgIW1vcmVfY29taW5nKQotCQlsYXN0ID0gdHJ1ZTsKLQogCWR3YzNfcHJlcGFyZV9vbmVfdHJiKGRlcCwgcmVxLCBkbWEsIGxlbmd0aCwKLQkJCWxhc3QsIGZhbHNlLCAwKTsKKwkJCWZhbHNlLCAwKTsKIH0KIAogLyoKQEAgLTk2NiwyNiArOTM2LDE5IEBACiBzdGF0aWMgdm9pZCBkd2MzX3ByZXBhcmVfdHJicyhzdHJ1Y3QgZHdjM19lcCAqZGVwKQogewogCXN0cnVjdCBkd2MzX3JlcXVlc3QJKnJlcSwgKm47Ci0JdW5zaWduZWQgaW50CQltb3JlX2NvbWluZzsKLQl1MzIJCQl0cmJzX2xlZnQ7CiAKIAlCVUlMRF9CVUdfT05fTk9UX1BPV0VSX09GXzIoRFdDM19UUkJfTlVNKTsKIAotCXRyYnNfbGVmdCA9IGR3YzNfY2FsY190cmJzX2xlZnQoZGVwKTsKLQlpZiAoIXRyYnNfbGVmdCkKKwlpZiAoIWR3YzNfY2FsY190cmJzX2xlZnQoZGVwKSkKIAkJcmV0dXJuOwogCi0JbW9yZV9jb21pbmcgPSBkZXAtPmFsbG9jYXRlZF9yZXF1ZXN0cyAtIGRlcC0+cXVldWVkX3JlcXVlc3RzOwotCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgbiwgJmRlcC0+cGVuZGluZ19saXN0LCBsaXN0KSB7Ci0JCWlmIChyZXEtPnJlcXVlc3QubnVtX21hcHBlZF9zZ3MgPiAwKQotCQkJZHdjM19wcmVwYXJlX29uZV90cmJfc2coZGVwLCByZXEsIHRyYnNfbGVmdC0tLAotCQkJCQltb3JlX2NvbWluZyk7CisJCWlmIChyZXEtPm51bV9wZW5kaW5nX3NncyA+IDApCisJCQlkd2MzX3ByZXBhcmVfb25lX3RyYl9zZyhkZXAsIHJlcSk7CiAJCWVsc2UKLQkJCWR3YzNfcHJlcGFyZV9vbmVfdHJiX2xpbmVhcihkZXAsIHJlcSwgdHJic19sZWZ0LS0sCi0JCQkJCW1vcmVfY29taW5nKTsKKwkJCWR3YzNfcHJlcGFyZV9vbmVfdHJiX2xpbmVhcihkZXAsIHJlcSk7CiAKLQkJaWYgKCF0cmJzX2xlZnQpCisJCWlmICghZHdjM19jYWxjX3RyYnNfbGVmdChkZXApKQogCQkJcmV0dXJuOwogCX0KIH0KQEAgLTExMDEsOTMgKzEwNjQsMjkgQEAKIAogCXRyYWNlX2R3YzNfZXBfcXVldWUocmVxKTsKIAotCS8qCi0JICogV2Ugb25seSBhZGQgdG8gb3VyIGxpc3Qgb2YgcmVxdWVzdHMgbm93IGFuZAotCSAqIHN0YXJ0IGNvbnN1bWluZyB0aGUgbGlzdCBvbmNlIHdlIGdldCBYZmVyTm90UmVhZHkKLQkgKiBJUlEuCi0JICoKLQkgKiBUaGF0IHdheSwgd2UgYXZvaWQgZG9pbmcgYW55dGhpbmcgdGhhdCB3ZSBkb24ndCBuZWVkCi0JICogdG8gZG8gbm93IGFuZCBkZWZlciBpdCB1bnRpbCB0aGUgcG9pbnQgd2UgcmVjZWl2ZSBhCi0JICogcGFydGljdWxhciB0b2tlbiBmcm9tIHRoZSBIb3N0IHNpZGUuCi0JICoKLQkgKiBUaGlzIHdpbGwgYWxzbyBhdm9pZCBIb3N0IGNhbmNlbGxpbmcgVVJCcyBkdWUgdG8gdG9vCi0JICogbWFueSBOQUtzLgotCSAqLwogCXJldCA9IHVzYl9nYWRnZXRfbWFwX3JlcXVlc3QoJmR3Yy0+Z2FkZ2V0LCAmcmVxLT5yZXF1ZXN0LAogCQkJZGVwLT5kaXJlY3Rpb24pOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwlyZXEtPnNnCQkJPSByZXEtPnJlcXVlc3Quc2c7CisJcmVxLT5udW1fcGVuZGluZ19zZ3MJPSByZXEtPnJlcXVlc3QubnVtX21hcHBlZF9zZ3M7CisKIAlsaXN0X2FkZF90YWlsKCZyZXEtPmxpc3QsICZkZXAtPnBlbmRpbmdfbGlzdCk7CiAKLQkvKgotCSAqIElmIHRoZXJlIGFyZSBubyBwZW5kaW5nIHJlcXVlc3RzIGFuZCB0aGUgZW5kcG9pbnQgaXNuJ3QgYWxyZWFkeQotCSAqIGJ1c3ksIHdlIHdpbGwganVzdCBzdGFydCB0aGUgcmVxdWVzdCBzdHJhaWdodCBhd2F5LgotCSAqCi0JICogVGhpcyB3aWxsIHNhdmUgb25lIElSUSAoWEZFUl9OT1RfUkVBRFkpIGFuZCBwb3NzaWJseSBtYWtlIGl0IGEKLQkgKiBsaXR0bGUgYml0IGZhc3Rlci4KLQkgKi8KLQlpZiAoIXVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZGVwLT5lbmRwb2ludC5kZXNjKSAmJgotCQkJIXVzYl9lbmRwb2ludF94ZmVyX2ludChkZXAtPmVuZHBvaW50LmRlc2MpKSB7Ci0JCXJldCA9IF9fZHdjM19nYWRnZXRfa2lja190cmFuc2ZlcihkZXAsIDApOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKgotCSAqIFRoZXJlIGFyZSBhIGZldyBzcGVjaWFsIGNhc2VzOgotCSAqCi0JICogMS4gWGZlck5vdFJlYWR5IHdpdGggZW1wdHkgbGlzdCBvZiByZXF1ZXN0cy4gV2UgbmVlZCB0byBraWNrIHRoZQotCSAqICAgIHRyYW5zZmVyIGhlcmUgaW4gdGhhdCBzaXR1YXRpb24sIG90aGVyd2lzZSB3ZSB3aWxsIGJlIE5BS2luZwotCSAqICAgIGZvcmV2ZXIuIElmIHdlIGdldCBYZmVyTm90UmVhZHkgYmVmb3JlIGdhZGdldCBkcml2ZXIgaGFzIGEKLQkgKiAgICBjaGFuY2UgdG8gcXVldWUgYSByZXF1ZXN0LCB3ZSB3aWxsIEFDSyB0aGUgSVJRIGJ1dCB3b24ndCBiZQotCSAqICAgIGFibGUgdG8gcmVjZWl2ZSB0aGUgZGF0YSB1bnRpbCB0aGUgbmV4dCByZXF1ZXN0IGlzIHF1ZXVlZC4KLQkgKiAgICBUaGUgZm9sbG93aW5nIGNvZGUgaXMgaGFuZGxpbmcgZXhhY3RseSB0aGF0LgotCSAqCi0JICovCi0JaWYgKGRlcC0+ZmxhZ3MgJiBEV0MzX0VQX1BFTkRJTkdfUkVRVUVTVCkgewotCQkvKgotCQkgKiBJZiB4ZmVybm90cmVhZHkgaXMgYWxyZWFkeSBlbGFwc2VkIGFuZCBpdCBpcyBhIGNhc2UKLQkJICogb2YgaXNvYyB0cmFuc2ZlciwgdGhlbiBpc3N1ZSBFTkQgVFJBTlNGRVIsIHNvIHRoYXQKLQkJICogeW91IGNhbiByZWNlaXZlIHhmZXJub3RyZWFkeSBhZ2FpbiBhbmQgY2FuIGhhdmUKLQkJICogbm90aW9uIG9mIGN1cnJlbnQgbWljcm9mcmFtZS4KLQkJICovCi0JCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGRlcC0+ZW5kcG9pbnQuZGVzYykpIHsKLQkJCWlmIChsaXN0X2VtcHR5KCZkZXAtPnN0YXJ0ZWRfbGlzdCkpIHsKLQkJCQlkd2MzX3N0b3BfYWN0aXZlX3RyYW5zZmVyKGR3YywgZGVwLT5udW1iZXIsIHRydWUpOwotCQkJCWRlcC0+ZmxhZ3MgPSBEV0MzX0VQX0VOQUJMRUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXJldCA9IF9fZHdjM19nYWRnZXRfa2lja190cmFuc2ZlcihkZXAsIDApOwotCQlpZiAoIXJldCkKLQkJCWRlcC0+ZmxhZ3MgJj0gfkRXQzNfRVBfUEVORElOR19SRVFVRVNUOwotCi0JCWdvdG8gb3V0OwotCX0KLQotCS8qCi0JICogMi4gWGZlckluUHJvZ3Jlc3Mgb24gSXNvYyBFUCB3aXRoIGFuIGFjdGl2ZSB0cmFuc2Zlci4gV2UgbmVlZCB0bwotCSAqICAgIGtpY2sgdGhlIHRyYW5zZmVyIGhlcmUgYWZ0ZXIgcXVldWluZyBhIHJlcXVlc3QsIG90aGVyd2lzZSB0aGUKLQkgKiAgICBjb3JlIG1heSBub3Qgc2VlIHRoZSBtb2RpZmllZCBUUkIocykuCi0JICovCiAJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZGVwLT5lbmRwb2ludC5kZXNjKSAmJgotCQkJKGRlcC0+ZmxhZ3MgJiBEV0MzX0VQX0JVU1kpICYmCi0JCQkhKGRlcC0+ZmxhZ3MgJiBEV0MzX0VQX01JU1NFRF9JU09DKSkgewotCQlXQVJOX09OX09OQ0UoIWRlcC0+cmVzb3VyY2VfaW5kZXgpOwotCQlyZXQgPSBfX2R3YzNfZ2FkZ2V0X2tpY2tfdHJhbnNmZXIoZGVwLCBkZXAtPnJlc291cmNlX2luZGV4KTsKLQkJZ290byBvdXQ7CisJCQlkZXAtPmZsYWdzICYgRFdDM19FUF9QRU5ESU5HX1JFUVVFU1QpIHsKKwkJaWYgKGxpc3RfZW1wdHkoJmRlcC0+c3RhcnRlZF9saXN0KSkgeworCQkJZHdjM19zdG9wX2FjdGl2ZV90cmFuc2Zlcihkd2MsIGRlcC0+bnVtYmVyLCB0cnVlKTsKKwkJCWRlcC0+ZmxhZ3MgPSBEV0MzX0VQX0VOQUJMRUQ7CisJCX0KKwkJcmV0dXJuIDA7CiAJfQogCi0JLyoKLQkgKiA0LiBTdHJlYW0gQ2FwYWJsZSBCdWxrIEVuZHBvaW50cy4gV2UgbmVlZCB0byBzdGFydCB0aGUgdHJhbnNmZXIKLQkgKiByaWdodCBhd2F5LCBvdGhlcndpc2UgaG9zdCB3aWxsIG5vdCBrbm93IHdlIGhhdmUgc3RyZWFtcyB0byBiZQotCSAqIGhhbmRsZWQuCi0JICovCi0JaWYgKGRlcC0+c3RyZWFtX2NhcGFibGUpCi0JCXJldCA9IF9fZHdjM19nYWRnZXRfa2lja190cmFuc2ZlcihkZXAsIDApOworCWlmICghZHdjM19jYWxjX3RyYnNfbGVmdChkZXApKQorCQlyZXR1cm4gMDsKIAotb3V0OgorCXJldCA9IF9fZHdjM19nYWRnZXRfa2lja190cmFuc2ZlcihkZXAsIDApOwogCWlmIChyZXQgJiYgcmV0ICE9IC1FQlVTWSkKIAkJZHdjM190cmFjZSh0cmFjZV9kd2MzX2dhZGdldCwKIAkJCQkiJXM6IGZhaWxlZCB0byBraWNrIHRyYW5zZmVycyIsCkBAIC0xNDMzLDcgKzEzMzIsNyBAQAogCiBzdGF0aWMgaW50IF9fZHdjM19nYWRnZXRfd2FrZXVwKHN0cnVjdCBkd2MzICpkd2MpCiB7Ci0JdW5zaWduZWQgbG9uZwkJdGltZW91dDsKKwlpbnQJCQlyZXRyaWVzOwogCiAJaW50CQkJcmV0OwogCXUzMgkJCXJlZzsKQEAgLTE0ODQsOSArMTM4Myw5IEBACiAJfQogCiAJLyogcG9sbCB1bnRpbCBMaW5rIFN0YXRlIGNoYW5nZXMgdG8gT04gKi8KLQl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKwlyZXRyaWVzID0gMjAwMDA7CiAKLQl3aGlsZSAoIXRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwl3aGlsZSAocmV0cmllcy0tKSB7CiAJCXJlZyA9IGR3YzNfcmVhZGwoZHdjLT5yZWdzLCBEV0MzX0RTVFMpOwogCiAJCS8qIGluIEhTLCBtZWFucyBPTiAqLwpAQCAtMTk1NSwyNyArMTg1NCwzNSBAQAogCiBzdGF0aWMgaW50IF9fZHdjM19jbGVhbnVwX2RvbmVfdHJicyhzdHJ1Y3QgZHdjMyAqZHdjLCBzdHJ1Y3QgZHdjM19lcCAqZGVwLAogCQlzdHJ1Y3QgZHdjM19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBkd2MzX3RyYiAqdHJiLAotCQljb25zdCBzdHJ1Y3QgZHdjM19ldmVudF9kZXBldnQgKmV2ZW50LCBpbnQgc3RhdHVzKQorCQljb25zdCBzdHJ1Y3QgZHdjM19ldmVudF9kZXBldnQgKmV2ZW50LCBpbnQgc3RhdHVzLAorCQlpbnQgY2hhaW4pCiB7CiAJdW5zaWduZWQgaW50CQljb3VudDsKIAl1bnNpZ25lZCBpbnQJCXNfcGt0ID0gMDsKIAl1bnNpZ25lZCBpbnQJCXRyYl9zdGF0dXM7CiAKIAlkZXAtPnF1ZXVlZF9yZXF1ZXN0cy0tOworCWR3YzNfZXBfaW5jX2RlcShkZXApOwogCXRyYWNlX2R3YzNfY29tcGxldGVfdHJiKGRlcCwgdHJiKTsKIAorCS8qCisJICogSWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBzZXJpZXMgb2YgY2hhaW5lZCBUUkJzIGFuZCB3ZQorCSAqIHJlY2VpdmUgYSBzaG9ydCB0cmFuc2ZlciBhbG9uZyB0aGUgd2F5LCBEV0MzIHdpbGwgc2tpcAorCSAqIHRocm91Z2ggYWxsIFRSQnMgaW5jbHVkaW5nIHRoZSBsYXN0IFRSQiBpbiB0aGUgY2hhaW4gKHRoZQorCSAqIHdoZXJlIENITiBiaXQgaXMgemVyby4gRFdDMyB3aWxsIGFsc28gYXZvaWQgY2xlYXJpbmcgSFdPCisJICogYml0IGFuZCBTVyBoYXMgdG8gZG8gaXQgbWFudWFsbHkuCisJICoKKwkgKiBXZSdyZSBnb2luZyB0byBkbyB0aGF0IGhlcmUgdG8gYXZvaWQgcHJvYmxlbXMgb2YgSFcgdHJ5aW5nCisJICogdG8gdXNlIGJvZ3VzIFRSQnMgZm9yIHRyYW5zZmVycy4KKwkgKi8KKwlpZiAoY2hhaW4gJiYgKHRyYi0+Y3RybCAmIERXQzNfVFJCX0NUUkxfSFdPKSkKKwkJdHJiLT5jdHJsICY9IH5EV0MzX1RSQl9DVFJMX0hXTzsKKwogCWlmICgodHJiLT5jdHJsICYgRFdDM19UUkJfQ1RSTF9IV08pICYmIHN0YXR1cyAhPSAtRVNIVVRET1dOKQotCQkvKgotCQkgKiBXZSBjb250aW51ZSBkZXNwaXRlIHRoZSBlcnJvci4gVGhlcmUgaXMgbm90IG11Y2ggd2UKLQkJICogY2FuIGRvLiBJZiB3ZSBkb24ndCBjbGVhbiBpdCB1cCB3ZSBsb29wIGZvcmV2ZXIuIElmCi0JCSAqIHdlIHNraXAgdGhlIFRSQiB0aGVuIGl0IGdldHMgb3ZlcndyaXR0ZW4gYWZ0ZXIgYQotCQkgKiB3aGlsZSBzaW5jZSB3ZSB1c2UgdGhlbSBpbiBhIHJpbmcgYnVmZmVyLiBBIEJVRygpCi0JCSAqIHdvdWxkIGhlbHAuIExldHMgaG9wZSB0aGF0IGlmIHRoaXMgb2NjdXJzLCBzb21lb25lCi0JCSAqIGZpeGVzIHRoZSByb290IGNhdXNlIGluc3RlYWQgb2YgbG9va2luZyBhd2F5IDopCi0JCSAqLwotCQlkZXZfZXJyKGR3Yy0+ZGV2LCAiJXMncyBUUkIgKCVwKSBzdGlsbCBvd25lZCBieSBIV1xuIiwKLQkJCQlkZXAtPm5hbWUsIHRyYik7CisJCXJldHVybiAxOworCiAJY291bnQgPSB0cmItPnNpemUgJiBEV0MzX1RSQl9TSVpFX01BU0s7CisJcmVxLT5yZXF1ZXN0LmFjdHVhbCArPSBjb3VudDsKIAogCWlmIChkZXAtPmRpcmVjdGlvbikgewogCQlpZiAoY291bnQpIHsKQEAgLTIwMTMsNTkgKzE5MjAsNzYgQEAKIAkJCXNfcGt0ID0gMTsKIAl9CiAKLQkvKgotCSAqIFdlIGFzc3VtZSBoZXJlIHdlIHdpbGwgYWx3YXlzIHJlY2VpdmUgdGhlIGVudGlyZSBkYXRhIGJsb2NrCi0JICogd2hpY2ggd2Ugc2hvdWxkIHJlY2VpdmUuIE1lYW5pbmcsIGlmIHdlIHByb2dyYW0gUlggdG8KLQkgKiByZWNlaXZlIDRLIGJ1dCB3ZSByZWNlaXZlIG9ubHkgMkssIHdlIGFzc3VtZSB0aGF0J3MgYWxsIHdlCi0JICogc2hvdWxkIHJlY2VpdmUgYW5kIHdlIHNpbXBseSBib3VuY2UgdGhlIHJlcXVlc3QgYmFjayB0byB0aGUKLQkgKiBnYWRnZXQgZHJpdmVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCi0JICovCi0JcmVxLT5yZXF1ZXN0LmFjdHVhbCArPSByZXEtPnJlcXVlc3QubGVuZ3RoIC0gY291bnQ7Ci0JaWYgKHNfcGt0KQorCWlmIChzX3BrdCAmJiAhY2hhaW4pCiAJCXJldHVybiAxOwotCWlmICgoZXZlbnQtPnN0YXR1cyAmIERFUEVWVF9TVEFUVVNfTFNUKSAmJgotCQkJKHRyYi0+Y3RybCAmIChEV0MzX1RSQl9DVFJMX0xTVCB8Ci0JCQkJRFdDM19UUkJfQ1RSTF9IV08pKSkKLQkJcmV0dXJuIDE7CisKIAlpZiAoKGV2ZW50LT5zdGF0dXMgJiBERVBFVlRfU1RBVFVTX0lPQykgJiYKIAkJCSh0cmItPmN0cmwgJiBEV0MzX1RSQl9DVFJMX0lPQykpCiAJCXJldHVybiAxOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZHdjM19jbGVhbnVwX2RvbmVfcmVxcyhzdHJ1Y3QgZHdjMyAqZHdjLCBzdHJ1Y3QgZHdjM19lcCAqZGVwLAogCQljb25zdCBzdHJ1Y3QgZHdjM19ldmVudF9kZXBldnQgKmV2ZW50LCBpbnQgc3RhdHVzKQogewotCXN0cnVjdCBkd2MzX3JlcXVlc3QJKnJlcTsKKwlzdHJ1Y3QgZHdjM19yZXF1ZXN0CSpyZXEsICpuOwogCXN0cnVjdCBkd2MzX3RyYgkJKnRyYjsKLQl1bnNpZ25lZCBpbnQJCXNsb3Q7Ci0JdW5zaWduZWQgaW50CQlpOworCWJvb2wJCQlpb2MgPSBmYWxzZTsKIAlpbnQJCQlyZXQ7CiAKLQlkbyB7Ci0JCXJlcSA9IG5leHRfcmVxdWVzdCgmZGVwLT5zdGFydGVkX2xpc3QpOwotCQlpZiAoV0FSTl9PTl9PTkNFKCFyZXEpKQotCQkJcmV0dXJuIDE7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgbiwgJmRlcC0+c3RhcnRlZF9saXN0LCBsaXN0KSB7CisJCXVuc2lnbmVkIGxlbmd0aDsKKwkJdW5zaWduZWQgYWN0dWFsOworCQlpbnQgY2hhaW47CiAKLQkJaSA9IDA7Ci0JCWRvIHsKLQkJCXNsb3QgPSByZXEtPmZpcnN0X3RyYl9pbmRleCArIGk7Ci0JCQlpZiAoc2xvdCA9PSBEV0MzX1RSQl9OVU0gLSAxKQotCQkJCXNsb3QrKzsKLQkJCXNsb3QgJT0gRFdDM19UUkJfTlVNOwotCQkJdHJiID0gJmRlcC0+dHJiX3Bvb2xbc2xvdF07CisJCWxlbmd0aCA9IHJlcS0+cmVxdWVzdC5sZW5ndGg7CisJCWNoYWluID0gcmVxLT5udW1fcGVuZGluZ19zZ3MgPiAwOworCQlpZiAoY2hhaW4pIHsKKwkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSByZXEtPnNnOworCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzOworCQkJdW5zaWduZWQgaW50IHBlbmRpbmcgPSByZXEtPm51bV9wZW5kaW5nX3NnczsKKwkJCXVuc2lnbmVkIGludCBpOwogCisJCQlmb3JfZWFjaF9zZyhzZywgcywgcGVuZGluZywgaSkgeworCQkJCXRyYiA9ICZkZXAtPnRyYl9wb29sW2RlcC0+dHJiX2RlcXVldWVdOworCisJCQkJcmVxLT5zZyA9IHNnX25leHQocyk7CisJCQkJcmVxLT5udW1fcGVuZGluZ19zZ3MtLTsKKworCQkJCXJldCA9IF9fZHdjM19jbGVhbnVwX2RvbmVfdHJicyhkd2MsIGRlcCwgcmVxLCB0cmIsCisJCQkJCQlldmVudCwgc3RhdHVzLCBjaGFpbik7CisJCQkJaWYgKHJldCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0cmIgPSAmZGVwLT50cmJfcG9vbFtkZXAtPnRyYl9kZXF1ZXVlXTsKIAkJCXJldCA9IF9fZHdjM19jbGVhbnVwX2RvbmVfdHJicyhkd2MsIGRlcCwgcmVxLCB0cmIsCi0JCQkJCWV2ZW50LCBzdGF0dXMpOwotCQkJaWYgKHJldCkKLQkJCQlicmVhazsKLQkJfSB3aGlsZSAoKytpIDwgcmVxLT5yZXF1ZXN0Lm51bV9tYXBwZWRfc2dzKTsKKwkJCQkJZXZlbnQsIHN0YXR1cywgY2hhaW4pOworCQl9CisKKwkJLyoKKwkJICogV2UgYXNzdW1lIGhlcmUgd2Ugd2lsbCBhbHdheXMgcmVjZWl2ZSB0aGUgZW50aXJlIGRhdGEgYmxvY2sKKwkJICogd2hpY2ggd2Ugc2hvdWxkIHJlY2VpdmUuIE1lYW5pbmcsIGlmIHdlIHByb2dyYW0gUlggdG8KKwkJICogcmVjZWl2ZSA0SyBidXQgd2UgcmVjZWl2ZSBvbmx5IDJLLCB3ZSBhc3N1bWUgdGhhdCdzIGFsbCB3ZQorCQkgKiBzaG91bGQgcmVjZWl2ZSBhbmQgd2Ugc2ltcGx5IGJvdW5jZSB0aGUgcmVxdWVzdCBiYWNrIHRvIHRoZQorCQkgKiBnYWRnZXQgZHJpdmVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCisJCSAqLworCQlhY3R1YWwgPSBsZW5ndGggLSByZXEtPnJlcXVlc3QuYWN0dWFsOworCQlyZXEtPnJlcXVlc3QuYWN0dWFsID0gYWN0dWFsOworCisJCWlmIChyZXQgJiYgY2hhaW4gJiYgKGFjdHVhbCA8IGxlbmd0aCkgJiYgcmVxLT5udW1fcGVuZGluZ19zZ3MpCisJCQlyZXR1cm4gX19kd2MzX2dhZGdldF9raWNrX3RyYW5zZmVyKGRlcCwgMCk7CiAKIAkJZHdjM19nYWRnZXRfZ2l2ZWJhY2soZGVwLCByZXEsIHN0YXR1cyk7CiAKLQkJaWYgKHJldCkKKwkJaWYgKHJldCkgeworCQkJaWYgKChldmVudC0+c3RhdHVzICYgREVQRVZUX1NUQVRVU19JT0MpICYmCisJCQkgICAgKHRyYi0+Y3RybCAmIERXQzNfVFJCX0NUUkxfSU9DKSkKKwkJCQlpb2MgPSB0cnVlOwogCQkJYnJlYWs7Ci0JfSB3aGlsZSAoMSk7CisJCX0KKwl9CiAKIAkvKgogCSAqIE91ciBlbmRwb2ludCBtaWdodCBnZXQgZGlzYWJsZWQgYnkgYW5vdGhlciB0aHJlYWQgZHVyaW5nCkBAIC0yMDkyLDEwICsyMDE2LDkgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JaWYgKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZGVwLT5lbmRwb2ludC5kZXNjKSkKLQkJaWYgKChldmVudC0+c3RhdHVzICYgREVQRVZUX1NUQVRVU19JT0MpICYmCi0JCQkJKHRyYi0+Y3RybCAmIERXQzNfVFJCX0NUUkxfSU9DKSkKLQkJCXJldHVybiAwOworCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGRlcC0+ZW5kcG9pbnQuZGVzYykgJiYgaW9jKQorCQlyZXR1cm4gMDsKKwogCXJldHVybiAxOwogfQogCkBAIC0yMzExLDYgKzIyMzQsMTggQEAKIAkgKgogCSAqIC0gSXNzdWUgRW5kVHJhbnNmZXIgV0lUSCBDTURJT0MgYml0IHNldAogCSAqIC0gV2FpdCAxMDB1cworCSAqCisJICogQXMgb2YgSVAgdmVyc2lvbiAzLjEwYSBvZiB0aGUgRFdDX3VzYjMgSVAsIHRoZSBjb250cm9sbGVyCisJICogc3VwcG9ydHMgYSBtb2RlIHRvIHdvcmsgYXJvdW5kIHRoZSBhYm92ZSBsaW1pdGF0aW9uLiBUaGUKKwkgKiBzb2Z0d2FyZSBjYW4gcG9sbCB0aGUgQ01EQUNUIGJpdCBpbiB0aGUgREVQQ01EIHJlZ2lzdGVyCisJICogYWZ0ZXIgaXNzdWluZyBhIEVuZFRyYW5zZmVyIGNvbW1hbmQuIFRoaXMgbW9kZSBpcyBlbmFibGVkCisJICogYnkgd3JpdGluZyBHVUNUTDJbMTRdLiBUaGlzIHBvbGxpbmcgaXMgYWxyZWFkeSBkb25lIGluIHRoZQorCSAqIGR3YzNfc2VuZF9nYWRnZXRfZXBfY21kKCkgZnVuY3Rpb24gc28gaWYgdGhlIG1vZGUgaXMKKwkgKiBlbmFibGVkLCB0aGUgRW5kVHJhbnNmZXIgY29tbWFuZCB3aWxsIGhhdmUgY29tcGxldGVkIHVwb24KKwkgKiByZXR1cm5pbmcgZnJvbSB0aGlzIGZ1bmN0aW9uIGFuZCB3ZSBkb24ndCBuZWVkIHRvIGRlbGF5IGZvcgorCSAqIDEwMHVzLgorCSAqCisJICogVGhpcyBtb2RlIGlzIE5PVCBhdmFpbGFibGUgb24gdGhlIERXQ191c2IzMSBJUC4KIAkgKi8KIAogCWNtZCA9IERXQzNfREVQQ01EX0VORFRSQU5TRkVSOwpAQCAtMjMyMiw3ICsyMjU3LDkgQEAKIAlXQVJOX09OX09OQ0UocmV0KTsKIAlkZXAtPnJlc291cmNlX2luZGV4ID0gMDsKIAlkZXAtPmZsYWdzICY9IH5EV0MzX0VQX0JVU1k7Ci0JdWRlbGF5KDEwMCk7CisKKwlpZiAoZHdjM19pc191c2IzMShkd2MpIHx8IGR3Yy0+cmV2aXNpb24gPCBEV0MzX1JFVklTSU9OXzMxMEEpCisJCXVkZWxheSgxMDApOwogfQogCiBzdGF0aWMgdm9pZCBkd2MzX3N0b3BfYWN0aXZlX3RyYW5zZmVycyhzdHJ1Y3QgZHdjMyAqZHdjKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy91bHBpLmMgYi9kcml2ZXJzL3VzYi9kd2MzL3VscGkuYwppbmRleCBlYzAwNGM2Li5iZDg2Zjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL3VscGkuYworKysgYi9kcml2ZXJzL3VzYi9kd2MzL3VscGkuYwpAQCAtMzUsOSArMzUsOSBAQAogCXJldHVybiAtRVRJTUVET1VUOwogfQogCi1zdGF0aWMgaW50IGR3YzNfdWxwaV9yZWFkKHN0cnVjdCB1bHBpX29wcyAqb3BzLCB1OCBhZGRyKQorc3RhdGljIGludCBkd2MzX3VscGlfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IGFkZHIpCiB7Ci0Jc3RydWN0IGR3YzMgKmR3YyA9IGRldl9nZXRfZHJ2ZGF0YShvcHMtPmRldik7CisJc3RydWN0IGR3YzMgKmR3YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXUzMiByZWc7CiAJaW50IHJldDsKIApAQCAtNTMsOSArNTMsOSBAQAogCXJldHVybiBEV0MzX0dVU0IyUEhZQUNDX0RBVEEocmVnKTsKIH0KIAotc3RhdGljIGludCBkd2MzX3VscGlfd3JpdGUoc3RydWN0IHVscGlfb3BzICpvcHMsIHU4IGFkZHIsIHU4IHZhbCkKK3N0YXRpYyBpbnQgZHdjM191bHBpX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggYWRkciwgdTggdmFsKQogewotCXN0cnVjdCBkd2MzICpkd2MgPSBkZXZfZ2V0X2RydmRhdGEob3BzLT5kZXYpOworCXN0cnVjdCBkd2MzICpkd2MgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAl1MzIgcmVnOwogCiAJcmVnID0gRFdDM19HVVNCMlBIWUFDQ19ORVdSRUdSRVEgfCBEV0MzX1VMUElfQUREUihhZGRyKTsKQEAgLTY1LDcgKzY1LDcgQEAKIAlyZXR1cm4gZHdjM191bHBpX2J1c3lsb29wKGR3Yyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdWxwaV9vcHMgZHdjM191bHBpX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWxwaV9vcHMgZHdjM191bHBpX29wcyA9IHsKIAkucmVhZCA9IGR3YzNfdWxwaV9yZWFkLAogCS53cml0ZSA9IGR3YzNfdWxwaV93cml0ZSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCmluZGV4IDNjM2YzMWMuLjhhZDIwMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCkBAIC0yMDksMjUgKzIwOSw2IEBACiBjb25maWcgVVNCX0ZfVENNCiAJdHJpc3RhdGUKIAotY2hvaWNlCi0JdHJpc3RhdGUgIlVTQiBHYWRnZXQgRHJpdmVycyIKLQlkZWZhdWx0IFVTQl9FVEgKLQloZWxwCi0JICBBIExpbnV4ICJHYWRnZXQgRHJpdmVyIiB0YWxrcyB0byB0aGUgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlcgotCSAgZHJpdmVyIHRocm91Z2ggdGhlIGFic3RyYWN0ICJnYWRnZXQiIEFQSS4gIFNvbWUgb3RoZXIgb3BlcmF0aW5nCi0JICBzeXN0ZW1zIGNhbGwgdGhlc2UgImNsaWVudCIgZHJpdmVycywgb2Ygd2hpY2ggImNsYXNzIGRyaXZlcnMiCi0JICBhcmUgYSBzdWJzZXQgKGltcGxlbWVudGluZyBhIFVTQiBkZXZpY2UgY2xhc3Mgc3BlY2lmaWNhdGlvbikuCi0JICBBIGdhZGdldCBkcml2ZXIgaW1wbGVtZW50cyBvbmUgb3IgbW9yZSBVU0IgZnVuY3Rpb25zIHVzaW5nCi0JICB0aGUgcGVyaXBoZXJhbCBoYXJkd2FyZS4KLQotCSAgR2FkZ2V0IGRyaXZlcnMgYXJlIGhhcmR3YXJlLW5ldXRyYWwsIG9yICJwbGF0Zm9ybSBpbmRlcGVuZGVudCIsCi0JICBleGNlcHQgdGhhdCB0aGV5IHNvbWV0aW1lcyBtdXN0IHVuZGVyc3RhbmQgcXVpcmtzIG9yIGxpbWl0YXRpb25zCi0JICBvZiB0aGUgcGFydGljdWxhciBjb250cm9sbGVycyB0aGV5IHdvcmsgd2l0aC4gIEZvciBleGFtcGxlLCB3aGVuCi0JICBhIGNvbnRyb2xsZXIgZG9lc24ndCBzdXBwb3J0IGFsdGVybmF0ZSBjb25maWd1cmF0aW9ucyBvciBwcm92aWRlCi0JICBlbm91Z2ggb2YgdGhlIHJpZ2h0IHR5cGVzIG9mIGVuZHBvaW50cywgdGhlIGdhZGdldCBkcml2ZXIgbWlnaHQKLQkgIG5vdCBiZSBhYmxlIHdvcmsgd2l0aCB0aGF0IGNvbnRyb2xsZXIsIG9yIG1pZ2h0IG5lZWQgdG8gaW1wbGVtZW50Ci0JICBhIGxlc3MgY29tbW9uIHZhcmlhbnQgb2YgYSBkZXZpY2UgY2xhc3MgcHJvdG9jb2wuCi0KICMgdGhpcyBmaXJzdCBzZXQgb2YgZHJpdmVycyBhbGwgZGVwZW5kIG9uIGJ1bGstY2FwYWJsZSBoYXJkd2FyZS4KIAogY29uZmlnIFVTQl9DT05GSUdGUwpAQCAtNDM5LDYgKzQyMCw3IEBACiBjb25maWcgVVNCX0NPTkZJR0ZTX0ZfVVZDCiAJYm9vbCAiVVNCIFdlYmNhbSBmdW5jdGlvbiIKIAlkZXBlbmRzIG9uIFVTQl9DT05GSUdGUworCWRlcGVuZHMgb24gVklERU9fVjRMMgogCWRlcGVuZHMgb24gVklERU9fREVWCiAJc2VsZWN0IFZJREVPQlVGMl9WTUFMTE9DCiAJc2VsZWN0IFVTQl9GX1VWQwpAQCAtNDc1LDYgKzQ1NywyNSBAQAogCSAgQm90aCBwcm90b2NvbHMgY2FuIHdvcmsgb24gVVNCMi4wIGFuZCBVU0IzLjAuCiAJICBVQVMgdXRpbGl6ZXMgdGhlIFVTQiAzLjAgZmVhdHVyZSBjYWxsZWQgc3RyZWFtcyBzdXBwb3J0LgogCitjaG9pY2UKKwl0cmlzdGF0ZSAiVVNCIEdhZGdldCBEcml2ZXJzIgorCWRlZmF1bHQgVVNCX0VUSAorCWhlbHAKKwkgIEEgTGludXggIkdhZGdldCBEcml2ZXIiIHRhbGtzIHRvIHRoZSBVU0IgUGVyaXBoZXJhbCBDb250cm9sbGVyCisJICBkcml2ZXIgdGhyb3VnaCB0aGUgYWJzdHJhY3QgImdhZGdldCIgQVBJLiAgU29tZSBvdGhlciBvcGVyYXRpbmcKKwkgIHN5c3RlbXMgY2FsbCB0aGVzZSAiY2xpZW50IiBkcml2ZXJzLCBvZiB3aGljaCAiY2xhc3MgZHJpdmVycyIKKwkgIGFyZSBhIHN1YnNldCAoaW1wbGVtZW50aW5nIGEgVVNCIGRldmljZSBjbGFzcyBzcGVjaWZpY2F0aW9uKS4KKwkgIEEgZ2FkZ2V0IGRyaXZlciBpbXBsZW1lbnRzIG9uZSBvciBtb3JlIFVTQiBmdW5jdGlvbnMgdXNpbmcKKwkgIHRoZSBwZXJpcGhlcmFsIGhhcmR3YXJlLgorCisJICBHYWRnZXQgZHJpdmVycyBhcmUgaGFyZHdhcmUtbmV1dHJhbCwgb3IgInBsYXRmb3JtIGluZGVwZW5kZW50IiwKKwkgIGV4Y2VwdCB0aGF0IHRoZXkgc29tZXRpbWVzIG11c3QgdW5kZXJzdGFuZCBxdWlya3Mgb3IgbGltaXRhdGlvbnMKKwkgIG9mIHRoZSBwYXJ0aWN1bGFyIGNvbnRyb2xsZXJzIHRoZXkgd29yayB3aXRoLiAgRm9yIGV4YW1wbGUsIHdoZW4KKwkgIGEgY29udHJvbGxlciBkb2Vzbid0IHN1cHBvcnQgYWx0ZXJuYXRlIGNvbmZpZ3VyYXRpb25zIG9yIHByb3ZpZGUKKwkgIGVub3VnaCBvZiB0aGUgcmlnaHQgdHlwZXMgb2YgZW5kcG9pbnRzLCB0aGUgZ2FkZ2V0IGRyaXZlciBtaWdodAorCSAgbm90IGJlIGFibGUgd29yayB3aXRoIHRoYXQgY29udHJvbGxlciwgb3IgbWlnaHQgbmVlZCB0byBpbXBsZW1lbnQKKwkgIGEgbGVzcyBjb21tb24gdmFyaWFudCBvZiBhIGRldmljZSBjbGFzcyBwcm90b2NvbC4KKwogc291cmNlICJkcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L0tjb25maWciCiAKIGVuZGNob2ljZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jCmluZGV4IGViNjQ4NDguLjMyMTc2ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY29tcG9zaXRlLmMKQEAgLTE4OTMsMTcgKzE4OTMsMjEgQEAKIAkJLyogZnVuY3Rpb25zIGFsd2F5cyBoYW5kbGUgdGhlaXIgaW50ZXJmYWNlcyBhbmQgZW5kcG9pbnRzLi4uCiAJCSAqIHB1bnQgb3RoZXIgcmVjaXBpZW50cyAob3RoZXIsIFdVU0IsIC4uLikgdG8gdGhlIGN1cnJlbnQKIAkJICogY29uZmlndXJhdGlvbiBjb2RlLgotCQkgKgotCQkgKiBSRVZJU0lUIGl0IGNvdWxkIG1ha2Ugc2Vuc2UgdG8gbGV0IHRoZSBjb21wb3NpdGUgZGV2aWNlCi0JCSAqIHRha2Ugc3VjaCByZXF1ZXN0cyB0b28sIGlmIHRoYXQncyBldmVyIG5lZWRlZDogIHRvIHdvcmsKLQkJICogaW4gY29uZmlnIDAsIGV0Yy4KIAkJICovCiAJCWlmIChjZGV2LT5jb25maWcpIHsKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZiwgJmNkZXYtPmNvbmZpZy0+ZnVuY3Rpb25zLCBsaXN0KQotCQkJCWlmIChmLT5yZXFfbWF0Y2ggJiYgZi0+cmVxX21hdGNoKGYsIGN0cmwpKQorCQkJCWlmIChmLT5yZXFfbWF0Y2ggJiYKKwkJCQkgICAgZi0+cmVxX21hdGNoKGYsIGN0cmwsIGZhbHNlKSkKIAkJCQkJZ290byB0cnlfZnVuX3NldHVwOwotCQkJZiA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb24gKmM7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZjZGV2LT5jb25maWdzLCBsaXN0KQorCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZiwgJmMtPmZ1bmN0aW9ucywgbGlzdCkKKwkJCQkJaWYgKGYtPnJlcV9tYXRjaCAmJgorCQkJCQkgICAgZi0+cmVxX21hdGNoKGYsIGN0cmwsIHRydWUpKQorCQkJCQkJZ290byB0cnlfZnVuX3NldHVwOwogCQl9CisJCWYgPSBOVUxMOwogCiAJCXN3aXRjaCAoY3RybC0+YlJlcXVlc3RUeXBlICYgVVNCX1JFQ0lQX01BU0spIHsKIAkJY2FzZSBVU0JfUkVDSVBfSU5URVJGQUNFOgpAQCAtMTkxMyw2ICsxOTE3LDggQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgVVNCX1JFQ0lQX0VORFBPSU5UOgorCQkJaWYgKCFjZGV2LT5jb25maWcpCisJCQkJYnJlYWs7CiAJCQllbmRwID0gKCh3X2luZGV4ICYgMHg4MCkgPj4gMykgfCAod19pbmRleCAmIDB4MGYpOwogCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShmLCAmY2Rldi0+Y29uZmlnLT5mdW5jdGlvbnMsIGxpc3QpIHsKIAkJCQlpZiAodGVzdF9iaXQoZW5kcCwgZi0+ZW5kcG9pbnRzKSkKQEAgLTIxMjQsMTQgKzIxMzAsMTQgQEAKIAogCWNkZXYtPm9zX2Rlc2NfcmVxID0gdXNiX2VwX2FsbG9jX3JlcXVlc3QoZXAwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNkZXYtPm9zX2Rlc2NfcmVxKSB7Ci0JCXJldCA9IFBUUl9FUlIoY2Rldi0+b3NfZGVzY19yZXEpOworCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVuZDsKIAl9CiAKIAkvKiBPUyBmZWF0dXJlIGRlc2NyaXB0b3IgbGVuZ3RoIDw9IDRrQiAqLwogCWNkZXYtPm9zX2Rlc2NfcmVxLT5idWYgPSBrbWFsbG9jKDQwOTYsIEdGUF9LRVJORUwpOwogCWlmICghY2Rldi0+b3NfZGVzY19yZXEtPmJ1ZikgewotCQlyZXQgPSBQVFJfRVJSKGNkZXYtPm9zX2Rlc2NfcmVxLT5idWYpOworCQlyZXQgPSAtRU5PTUVNOwogCQlrZnJlZShjZGV2LT5vc19kZXNjX3JlcSk7CiAJCWdvdG8gZW5kOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9jb25maWdmcy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbmZpZ2ZzLmMKaW5kZXggNzBjZjM0Ny4uMzk4NDc4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbmZpZ2ZzLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbmZpZ2ZzLmMKQEAgLTEyMTEsOCArMTIxMSw5IEBACiAKIAkJCWxpc3RfbW92ZV90YWlsKCZmLT5saXN0LCAmY2ZnLT5mdW5jX2xpc3QpOwogCQkJaWYgKGYtPnVuYmluZCkgewotCQkJCWRldl9lcnIoJmdpLT5jZGV2LmdhZGdldC0+ZGV2LCAidW5iaW5kIGZ1bmN0aW9uIgotCQkJCQkJIiAnJXMnLyVwXG4iLCBmLT5uYW1lLCBmKTsKKwkJCQlkZXZfZGJnKCZnaS0+Y2Rldi5nYWRnZXQtPmRldiwKKwkJCQkgICAgICAgICAidW5iaW5kIGZ1bmN0aW9uICclcycvJXBcbiIsCisJCQkJICAgICAgICAgZi0+bmFtZSwgZik7CiAJCQkJZi0+dW5iaW5kKGMsIGYpOwogCQkJfQogCQl9CkBAIC0xNDkwLDcgKzE0OTEsOSBAQAogewogCXN0cnVjdCBnYWRnZXRfaW5mbyAqZ2kgPSB0b19nYWRnZXRfaW5mbyhpdGVtKTsKIAorCW11dGV4X2xvY2soJmdpLT5sb2NrKTsKIAl1bnJlZ2lzdGVyX2dhZGdldChnaSk7CisJbXV0ZXhfdW5sb2NrKCZnaS0+bG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1bnJlZ2lzdGVyX2dhZGdldF9pdGVtKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfZWVtLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9lZW0uYwppbmRleCBkNThiZmMzLi4wMDdlYzZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9lZW0uYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9lZW0uYwpAQCAtMzQxLDExICszNDEsMTUgQEAKIHsKIAlzdHJ1Y3Qgc2tfYnVmZgkqc2tiMiA9IE5VTEw7CiAJc3RydWN0IHVzYl9lcAkqaW4gPSBwb3J0LT5pbl9lcDsKLQlpbnQJCXBhZGxlbiA9IDA7Ci0JdTE2CQlsZW4gPSBza2ItPmxlbjsKKwlpbnQJCWhlYWRyb29tLCB0YWlscm9vbSwgcGFkbGVuID0gMDsKKwl1MTYJCWxlbjsKIAotCWludCBoZWFkcm9vbSA9IHNrYl9oZWFkcm9vbShza2IpOwotCWludCB0YWlscm9vbSA9IHNrYl90YWlscm9vbShza2IpOworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWxlbiA9IHNrYi0+bGVuOworCWhlYWRyb29tID0gc2tiX2hlYWRyb29tKHNrYik7CisJdGFpbHJvb20gPSBza2JfdGFpbHJvb20oc2tiKTsKIAogCS8qIFdoZW4gKGxlbiArIEVFTV9ITEVOICsgRVRIX0ZDU19MRU4pICUgaW4tPm1heHBhY2tldCkgaXMgMCwKIAkgKiBzdGljayB0d28gYnl0ZXMgb2YgemVyby1sZW5ndGggRUVNIHBhY2tldCBvbiB0aGUgZW5kLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfZnMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2ZzLmMKaW5kZXggNWM4NDI5Zi4uMGFlZWQ4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfZnMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9mcy5jCkBAIC05OCw2ICs5OCw5IEBACiBzdGF0aWMgdm9pZCBmZnNfZnVuY19kaXNhYmxlKHN0cnVjdCB1c2JfZnVuY3Rpb24gKik7CiBzdGF0aWMgaW50IGZmc19mdW5jX3NldHVwKHN0cnVjdCB1c2JfZnVuY3Rpb24gKiwKIAkJCSAgY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKTsKK3N0YXRpYyBib29sIGZmc19mdW5jX3JlcV9tYXRjaChzdHJ1Y3QgdXNiX2Z1bmN0aW9uICosCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqLAorCQkJICAgICAgIGJvb2wgY29uZmlnMCk7CiBzdGF0aWMgdm9pZCBmZnNfZnVuY19zdXNwZW5kKHN0cnVjdCB1c2JfZnVuY3Rpb24gKik7CiBzdGF0aWMgdm9pZCBmZnNfZnVuY19yZXN1bWUoc3RydWN0IHVzYl9mdW5jdGlvbiAqKTsKIApAQCAtMjI0Myw3ICsyMjQ2LDkgQEAKIAkJCSAgICAgIEZVTkNUSU9ORlNfSEFTX1NTX0RFU0MgfAogCQkJICAgICAgRlVOQ1RJT05GU19IQVNfTVNfT1NfREVTQyB8CiAJCQkgICAgICBGVU5DVElPTkZTX1ZJUlRVQUxfQUREUiB8Ci0JCQkgICAgICBGVU5DVElPTkZTX0VWRU5URkQpKSB7CisJCQkgICAgICBGVU5DVElPTkZTX0VWRU5URkQgfAorCQkJICAgICAgRlVOQ1RJT05GU19BTExfQ1RSTF9SRUNJUCB8CisJCQkgICAgICBGVU5DVElPTkZTX0NPTkZJRzBfU0VUVVApKSB7CiAJCQlyZXQgPSAtRU5PU1lTOwogCQkJZ290byBlcnJvcjsKIAkJfQpAQCAtMzA5NCw4ICszMDk5LDkgQEAKIAkgKiBoYW5kbGUgdGhlbS4gIEFsbCBvdGhlciBlaXRoZXIgaGFuZGxlZCBieSBjb21wb3NpdGUgb3IKIAkgKiBwYXNzZWQgdG8gdXNiX2NvbmZpZ3VyYXRpb24tPnNldHVwKCkgKGlmIG9uZSBpcyBzZXQpLiAgTm8KIAkgKiBtYXR0ZXIsIHdlIHdpbGwgaGFuZGxlIHJlcXVlc3RzIGRpcmVjdGVkIHRvIGVuZHBvaW50IGhlcmUKLQkgKiBhcyB3ZWxsIChhcyBpdCdzIHN0cmFpZ2h0Zm9yd2FyZCkgYnV0IHdoYXQgdG8gZG8gd2l0aCBhbnkKLQkgKiBvdGhlciByZXF1ZXN0PworCSAqIGFzIHdlbGwgKGFzIGl0J3Mgc3RyYWlnaHRmb3J3YXJkKS4gIE90aGVyIHJlcXVlc3QgcmVjaXBpZW50CisJICogdHlwZXMgYXJlIG9ubHkgaGFuZGxlZCB3aGVuIHRoZSB1c2VyIGZsYWcgRlVOQ1RJT05GU19BTExfQ1RSTF9SRUNJUAorCSAqIGlzIGJlaW5nIHVzZWQuCiAJICovCiAJaWYgKGZmcy0+c3RhdGUgIT0gRkZTX0FDVElWRSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0zMTE2LDcgKzMxMjIsMTAgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWlmIChmdW5jLT5mZnMtPnVzZXJfZmxhZ3MgJiBGVU5DVElPTkZTX0FMTF9DVFJMX1JFQ0lQKQorCQkJcmV0ID0gbGUxNl90b19jcHUoY3JlcS0+d0luZGV4KTsKKwkJZWxzZQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZmZnMtPmV2LndhaXRxLmxvY2ssIGZsYWdzKTsKQEAgLTMxMjgsNiArMzEzNywyOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgYm9vbCBmZnNfZnVuY19yZXFfbWF0Y2goc3RydWN0IHVzYl9mdW5jdGlvbiAqZiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjcmVxLAorCQkJICAgICAgIGJvb2wgY29uZmlnMCkKK3sKKwlzdHJ1Y3QgZmZzX2Z1bmN0aW9uICpmdW5jID0gZmZzX2Z1bmNfZnJvbV91c2IoZik7CisKKwlpZiAoY29uZmlnMCAmJiAhKGZ1bmMtPmZmcy0+dXNlcl9mbGFncyAmIEZVTkNUSU9ORlNfQ09ORklHMF9TRVRVUCkpCisJCXJldHVybiBmYWxzZTsKKworCXN3aXRjaCAoY3JlcS0+YlJlcXVlc3RUeXBlICYgVVNCX1JFQ0lQX01BU0spIHsKKwljYXNlIFVTQl9SRUNJUF9JTlRFUkZBQ0U6CisJCXJldHVybiBmZnNfZnVuY19yZXZtYXBfaW50ZihmdW5jLAorCQkJCQkgICAgbGUxNl90b19jcHUoY3JlcS0+d0luZGV4KSA+PSAwKTsKKwljYXNlIFVTQl9SRUNJUF9FTkRQT0lOVDoKKwkJcmV0dXJuIGZmc19mdW5jX3Jldm1hcF9lcChmdW5jLAorCQkJCQkgIGxlMTZfdG9fY3B1KGNyZXEtPndJbmRleCkgPj0gMCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIChib29sKSAoZnVuYy0+ZmZzLT51c2VyX2ZsYWdzICYKKwkJCSAgICAgICBGVU5DVElPTkZTX0FMTF9DVFJMX1JFQ0lQKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGZmc19mdW5jX3N1c3BlbmQoc3RydWN0IHVzYl9mdW5jdGlvbiAqZikKIHsKIAlFTlRFUigpOwpAQCAtMzM3OCw2ICszNDA5LDcgQEAKIAlmdW5jLT5mdW5jdGlvbi5zZXRfYWx0ID0gZmZzX2Z1bmNfc2V0X2FsdDsKIAlmdW5jLT5mdW5jdGlvbi5kaXNhYmxlID0gZmZzX2Z1bmNfZGlzYWJsZTsKIAlmdW5jLT5mdW5jdGlvbi5zZXR1cCAgID0gZmZzX2Z1bmNfc2V0dXA7CisJZnVuYy0+ZnVuY3Rpb24ucmVxX21hdGNoID0gZmZzX2Z1bmNfcmVxX21hdGNoOwogCWZ1bmMtPmZ1bmN0aW9uLnN1c3BlbmQgPSBmZnNfZnVuY19zdXNwZW5kOwogCWZ1bmMtPmZ1bmN0aW9uLnJlc3VtZSAgPSBmZnNfZnVuY19yZXN1bWU7CiAJZnVuYy0+ZnVuY3Rpb24uZnJlZV9mdW5jID0gZmZzX2ZyZWU7CkBAIC0zNDcwLDYgKzM1MDIsMTEgQEAKIAlsaXN0X2RlbCgmZGV2LT5lbnRyeSk7CiAJaWYgKGRldi0+bmFtZV9hbGxvY2F0ZWQpCiAJCWtmcmVlKGRldi0+bmFtZSk7CisKKwkvKiBDbGVhciB0aGUgcHJpdmF0ZV9kYXRhIHBvaW50ZXIgdG8gc3RvcCBpbmNvcnJlY3QgZGV2IGFjY2VzcyAqLworCWlmIChkZXYtPmZmc19kYXRhKQorCQlkZXYtPmZmc19kYXRhLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCiAJa2ZyZWUoZGV2KTsKIAlpZiAobGlzdF9lbXB0eSgmZmZzX2RldmljZXMpKQogCQlmdW5jdGlvbmZzX2NsZWFudXAoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2hpZC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfaGlkLmMKaW5kZXggNTE5ODBjNS4uZTI5NjZmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfaGlkLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfaGlkLmMKQEAgLTM2NSw3ICszNjUsNyBAQAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX3JlcXVlc3QgKmhpZGdfYWxsb2NfZXBfcmVxKHN0cnVjdCB1c2JfZXAgKmVwLAogCQkJCQkJICAgIHVuc2lnbmVkIGxlbmd0aCkKIHsKLQlyZXR1cm4gYWxsb2NfZXBfcmVxKGVwLCBsZW5ndGgsIGxlbmd0aCk7CisJcmV0dXJuIGFsbG9jX2VwX3JlcShlcCwgbGVuZ3RoKTsKIH0KIAogc3RhdGljIHZvaWQgaGlkZ19zZXRfcmVwb3J0X2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKQEAgLTYxNywxNCArNjE3LDEwIEBACiAKIAkvKiBwcmVhbGxvY2F0ZSByZXF1ZXN0IGFuZCBidWZmZXIgKi8KIAlzdGF0dXMgPSAtRU5PTUVNOwotCWhpZGctPnJlcSA9IHVzYl9lcF9hbGxvY19yZXF1ZXN0KGhpZGctPmluX2VwLCBHRlBfS0VSTkVMKTsKKwloaWRnLT5yZXEgPSBhbGxvY19lcF9yZXEoaGlkZy0+aW5fZXAsIGhpZGctPnJlcG9ydF9sZW5ndGgpOwogCWlmICghaGlkZy0+cmVxKQogCQlnb3RvIGZhaWw7CiAKLQloaWRnLT5yZXEtPmJ1ZiA9IGttYWxsb2MoaGlkZy0+cmVwb3J0X2xlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFoaWRnLT5yZXEtPmJ1ZikKLQkJZ290byBmYWlsOwotCiAJLyogc2V0IGRlc2NyaXB0b3IgZHluYW1pYyB2YWx1ZXMgKi8KIAloaWRnX2ludGVyZmFjZV9kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcyA9IGhpZGctPmJJbnRlcmZhY2VTdWJDbGFzczsKIAloaWRnX2ludGVyZmFjZV9kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9IGhpZGctPmJJbnRlcmZhY2VQcm90b2NvbDsKQEAgLTY3NywxMSArNjczLDggQEAKIAl1c2JfZnJlZV9hbGxfZGVzY3JpcHRvcnMoZik7CiBmYWlsOgogCUVSUk9SKGYtPmNvbmZpZy0+Y2RldiwgImhpZGdfYmluZCBGQUlMRURcbiIpOwotCWlmIChoaWRnLT5yZXEgIT0gTlVMTCkgewotCQlrZnJlZShoaWRnLT5yZXEtPmJ1Zik7Ci0JCWlmIChoaWRnLT5pbl9lcCAhPSBOVUxMKQotCQkJdXNiX2VwX2ZyZWVfcmVxdWVzdChoaWRnLT5pbl9lcCwgaGlkZy0+cmVxKTsKLQl9CisJaWYgKGhpZGctPnJlcSAhPSBOVUxMKQorCQlmcmVlX2VwX3JlcShoaWRnLT5pbl9lcCwgaGlkZy0+cmVxKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC04MDksMTEgKzgwMiwyMSBAQAogCiBDT05GSUdGU19BVFRSKGZfaGlkX29wdHNfLCByZXBvcnRfZGVzYyk7CiAKK3N0YXRpYyBzc2l6ZV90IGZfaGlkX29wdHNfZGV2X3Nob3coc3RydWN0IGNvbmZpZ19pdGVtICppdGVtLCBjaGFyICpwYWdlKQoreworCXN0cnVjdCBmX2hpZF9vcHRzICpvcHRzID0gdG9fZl9oaWRfb3B0cyhpdGVtKTsKKworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZDolZFxuIiwgbWFqb3IsIG9wdHMtPm1pbm9yKTsKK30KKworQ09ORklHRlNfQVRUUl9STyhmX2hpZF9vcHRzXywgZGV2KTsKKwogc3RhdGljIHN0cnVjdCBjb25maWdmc19hdHRyaWJ1dGUgKmhpZF9hdHRyc1tdID0gewogCSZmX2hpZF9vcHRzX2F0dHJfc3ViY2xhc3MsCiAJJmZfaGlkX29wdHNfYXR0cl9wcm90b2NvbCwKIAkmZl9oaWRfb3B0c19hdHRyX3JlcG9ydF9sZW5ndGgsCiAJJmZfaGlkX29wdHNfYXR0cl9yZXBvcnRfZGVzYywKKwkmZl9oaWRfb3B0c19hdHRyX2RldiwKIAlOVUxMLAogfTsKIApAQCAtOTEwLDggKzkxMyw3IEBACiAKIAkvKiBkaXNhYmxlL2ZyZWUgcmVxdWVzdCBhbmQgZW5kIHBvaW50ICovCiAJdXNiX2VwX2Rpc2FibGUoaGlkZy0+aW5fZXApOwotCWtmcmVlKGhpZGctPnJlcS0+YnVmKTsKLQl1c2JfZXBfZnJlZV9yZXF1ZXN0KGhpZGctPmluX2VwLCBoaWRnLT5yZXEpOworCWZyZWVfZXBfcmVxKGhpZGctPmluX2VwLCBoaWRnLT5yZXEpOwogCiAJdXNiX2ZyZWVfYWxsX2Rlc2NyaXB0b3JzKGYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbG9vcGJhY2suYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2xvb3BiYWNrLmMKaW5kZXggM2E5ZjhmOS4uZTcwMDkzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbG9vcGJhY2suYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9sb29wYmFjay5jCkBAIC0zMDgsOSArMzA4LDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX3JlcXVlc3QgKmxiX2FsbG9jX2VwX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwgaW50IGxlbikKIHsKLQlzdHJ1Y3QgZl9sb29wYmFjawkqbG9vcCA9IGVwLT5kcml2ZXJfZGF0YTsKLQotCXJldHVybiBhbGxvY19lcF9yZXEoZXAsIGxlbiwgbG9vcC0+YnVmbGVuKTsKKwlyZXR1cm4gYWxsb2NfZXBfcmVxKGVwLCBsZW4pOwogfQogCiBzdGF0aWMgaW50IGFsbG9jX3JlcXVlc3RzKHN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldiwKQEAgLTMzMyw3ICszMzEsNyBAQAogCQlpZiAoIWluX3JlcSkKIAkJCWdvdG8gZmFpbDsKIAotCQlvdXRfcmVxID0gbGJfYWxsb2NfZXBfcmVxKGxvb3AtPm91dF9lcCwgMCk7CisJCW91dF9yZXEgPSBsYl9hbGxvY19lcF9yZXEobG9vcC0+b3V0X2VwLCBsb29wLT5idWZsZW4pOwogCQlpZiAoIW91dF9yZXEpCiAJCQlnb3RvIGZhaWxfaW47CiAKQEAgLTU5MywxMyArNTkxLDkgQEAKIAogaW50IF9faW5pdCBsYl9tb2Rpbml0KHZvaWQpCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IHVzYl9mdW5jdGlvbl9yZWdpc3RlcigmTG9vcGJhY2t1c2JfZnVuYyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gcmV0OworCXJldHVybiB1c2JfZnVuY3Rpb25fcmVnaXN0ZXIoJkxvb3BiYWNrdXNiX2Z1bmMpOwogfQorCiB2b2lkIF9fZXhpdCBsYl9tb2RleGl0KHZvaWQpCiB7CiAJdXNiX2Z1bmN0aW9uX3VucmVnaXN0ZXIoJkxvb3BiYWNrdXNiX2Z1bmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbWFzc19zdG9yYWdlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9tYXNzX3N0b3JhZ2UuYwppbmRleCAyNTA1MTE3Li44ZjM2NTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9tYXNzX3N0b3JhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9tYXNzX3N0b3JhZ2UuYwpAQCAtMzExLDExICszMTEsNyBAQAogCS8qIEdhZGdldCdzIHByaXZhdGUgZGF0YS4gKi8KIAl2b2lkCQkJKnByaXZhdGVfZGF0YTsKIAotCS8qCi0JICogVmVuZG9yICg4IGNoYXJzKSwgcHJvZHVjdCAoMTYgY2hhcnMpLCByZWxlYXNlICg0Ci0JICogaGV4YWRlY2ltYWwgZGlnaXRzKSBhbmQgTlVMIGJ5dGUKLQkgKi8KLQljaGFyIGlucXVpcnlfc3RyaW5nWzggKyAxNiArIDQgKyAxXTsKKwljaGFyIGlucXVpcnlfc3RyaW5nW0lOUVVJUllfU1RSSU5HX0xFTl07CiAKIAlzdHJ1Y3Qga3JlZgkJcmVmOwogfTsKQEAgLTExMDcsNyArMTEwMywxMiBAQAogCWJ1Zls1XSA9IDA7CQkvKiBObyBzcGVjaWFsIG9wdGlvbnMgKi8KIAlidWZbNl0gPSAwOwogCWJ1Zls3XSA9IDA7Ci0JbWVtY3B5KGJ1ZiArIDgsIGNvbW1vbi0+aW5xdWlyeV9zdHJpbmcsIHNpemVvZiBjb21tb24tPmlucXVpcnlfc3RyaW5nKTsKKwlpZiAoY3VybHVuLT5pbnF1aXJ5X3N0cmluZ1swXSkKKwkJbWVtY3B5KGJ1ZiArIDgsIGN1cmx1bi0+aW5xdWlyeV9zdHJpbmcsCisJCSAgICAgICBzaXplb2YoY3VybHVuLT5pbnF1aXJ5X3N0cmluZykpOworCWVsc2UKKwkJbWVtY3B5KGJ1ZiArIDgsIGNvbW1vbi0+aW5xdWlyeV9zdHJpbmcsCisJCSAgICAgICBzaXplb2YoY29tbW9uLT5pbnF1aXJ5X3N0cmluZykpOwogCXJldHVybiAzNjsKIH0KIApAQCAtMzIwOSwxMiArMzIxMCwyNyBAQAogCiBDT05GSUdGU19BVFRSKGZzZ19sdW5fb3B0c18sIG5vZnVhKTsKIAorc3RhdGljIHNzaXplX3QgZnNnX2x1bl9vcHRzX2lucXVpcnlfc3RyaW5nX3Nob3coc3RydWN0IGNvbmZpZ19pdGVtICppdGVtLAorCQkJCQkJY2hhciAqcGFnZSkKK3sKKwlyZXR1cm4gZnNnX3Nob3dfaW5xdWlyeV9zdHJpbmcodG9fZnNnX2x1bl9vcHRzKGl0ZW0pLT5sdW4sIHBhZ2UpOworfQorCitzdGF0aWMgc3NpemVfdCBmc2dfbHVuX29wdHNfaW5xdWlyeV9zdHJpbmdfc3RvcmUoc3RydWN0IGNvbmZpZ19pdGVtICppdGVtLAorCQkJCQkJIGNvbnN0IGNoYXIgKnBhZ2UsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIGZzZ19zdG9yZV9pbnF1aXJ5X3N0cmluZyh0b19mc2dfbHVuX29wdHMoaXRlbSktPmx1biwgcGFnZSwgbGVuKTsKK30KKworQ09ORklHRlNfQVRUUihmc2dfbHVuX29wdHNfLCBpbnF1aXJ5X3N0cmluZyk7CisKIHN0YXRpYyBzdHJ1Y3QgY29uZmlnZnNfYXR0cmlidXRlICpmc2dfbHVuX2F0dHJzW10gPSB7CiAJJmZzZ19sdW5fb3B0c19hdHRyX2ZpbGUsCiAJJmZzZ19sdW5fb3B0c19hdHRyX3JvLAogCSZmc2dfbHVuX29wdHNfYXR0cl9yZW1vdmFibGUsCiAJJmZzZ19sdW5fb3B0c19hdHRyX2Nkcm9tLAogCSZmc2dfbHVuX29wdHNfYXR0cl9ub2Z1YSwKKwkmZnNnX2x1bl9vcHRzX2F0dHJfaW5xdWlyeV9zdHJpbmcsCiAJTlVMTCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX21hc3Nfc3RvcmFnZS5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbWFzc19zdG9yYWdlLmgKaW5kZXggYjZhOTkxOGVhLi5kMzkwMjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9tYXNzX3N0b3JhZ2UuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9tYXNzX3N0b3JhZ2UuaApAQCAtMTAwLDYgKzEwMCw3IEBACiAJY2hhciByZW1vdmFibGU7CiAJY2hhciBjZHJvbTsKIAljaGFyIG5vZnVhOworCWNoYXIgaW5xdWlyeV9zdHJpbmdbSU5RVUlSWV9TVFJJTkdfTEVOXTsKIH07CiAKIHN0cnVjdCBmc2dfY29uZmlnIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX21pZGkuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX21pZGkuYwppbmRleCA1OGZjMTk5Li5hNTcxOWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9taWRpLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbWlkaS5jCkBAIC01MSw2ICs1MSwxOSBAQAogICovCiAjZGVmaW5lIE1BWF9QT1JUUyAxNgogCisvKiBNSURJIG1lc3NhZ2Ugc3RhdGVzICovCitlbnVtIHsKKwlTVEFURV9JTklUSUFMID0gMCwJLyogcHNldWRvIHN0YXRlICovCisJU1RBVEVfMVBBUkFNLAorCVNUQVRFXzJQQVJBTV8xLAorCVNUQVRFXzJQQVJBTV8yLAorCVNUQVRFX1NZU0VYXzAsCisJU1RBVEVfU1lTRVhfMSwKKwlTVEFURV9TWVNFWF8yLAorCVNUQVRFX1JFQUxfVElNRSwKKwlTVEFURV9GSU5JU0hFRCwJCS8qIHBzZXVkbyBzdGF0ZSAqLworfTsKKwogLyoKICAqIFRoaXMgaXMgYSBnYWRnZXQsIGFuZCB0aGUgSU4vT1VUIG5hbWluZyBpcyBmcm9tIHRoZSBob3N0J3MgcGVyc3BlY3RpdmUuCiAgKiBVU0IgLT4gT1VUIGVuZHBvaW50IC0+IHJhd21pZGkKQEAgLTYxLDEzICs3NCw2IEBACiAJaW50IGFjdGl2ZTsKIAl1aW50OF90IGNhYmxlOwogCXVpbnQ4X3Qgc3RhdGU7Ci0jZGVmaW5lIFNUQVRFX1VOS05PV04JMAotI2RlZmluZSBTVEFURV8xUEFSQU0JMQotI2RlZmluZSBTVEFURV8yUEFSQU1fMQkyCi0jZGVmaW5lIFNUQVRFXzJQQVJBTV8yCTMKLSNkZWZpbmUgU1RBVEVfU1lTRVhfMAk0Ci0jZGVmaW5lIFNUQVRFX1NZU0VYXzEJNQotI2RlZmluZSBTVEFURV9TWVNFWF8yCTYKIAl1aW50OF90IGRhdGFbMl07CiB9OwogCkBAIC0yMDUsNyArMjExLDcgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHVzYl9yZXF1ZXN0ICptaWRpX2FsbG9jX2VwX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwKIAkJCQkJCSAgICB1bnNpZ25lZCBsZW5ndGgpCiB7Ci0JcmV0dXJuIGFsbG9jX2VwX3JlcShlcCwgbGVuZ3RoLCBsZW5ndGgpOworCXJldHVybiBhbGxvY19lcF9yZXEoZXAsIGxlbmd0aCk7CiB9CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IGZfbWlkaV9jaW5fbGVuZ3RoW10gPSB7CkBAIC0yOTksNiArMzA1LDE5IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBmX21pZGlfZHJvcF9vdXRfc3Vic3RyZWFtcyhzdHJ1Y3QgZl9taWRpICptaWRpKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IG1pZGktPmluX3BvcnRzOyBpKyspIHsKKwkJc3RydWN0IGdtaWRpX2luX3BvcnQgKnBvcnQgPSBtaWRpLT5pbl9wb3J0c19hcnJheSArIGk7CisJCXN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHBvcnQtPnN1YnN0cmVhbTsKKworCQlpZiAocG9ydC0+YWN0aXZlICYmIHN1YnN0cmVhbSkKKwkJCXNuZF9yYXdtaWRpX2Ryb3Bfb3V0cHV0KHN1YnN0cmVhbSk7CisJfQorfQorCiBzdGF0aWMgaW50IGZfbWlkaV9zdGFydF9lcChzdHJ1Y3QgZl9taWRpICptaWRpLAogCQkJICAgc3RydWN0IHVzYl9mdW5jdGlvbiAqZiwKIAkJCSAgIHN0cnVjdCB1c2JfZXAgKmVwKQpAQCAtMzYwLDkgKzM3OSw4IEBACiAJLyogYWxsb2NhdGUgYSBidW5jaCBvZiByZWFkIGJ1ZmZlcnMgYW5kIHF1ZXVlIHRoZW0gYWxsIGF0IG9uY2UuICovCiAJZm9yIChpID0gMDsgaSA8IG1pZGktPnFsZW4gJiYgZXJyID09IDA7IGkrKykgewogCQlzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSA9Ci0JCQltaWRpX2FsbG9jX2VwX3JlcShtaWRpLT5vdXRfZXAsCi0JCQkJbWF4X3QodW5zaWduZWQsIG1pZGktPmJ1ZmxlbiwKLQkJCQkJYnVsa19vdXRfZGVzYy53TWF4UGFja2V0U2l6ZSkpOworCQkJbWlkaV9hbGxvY19lcF9yZXEobWlkaS0+b3V0X2VwLCBtaWRpLT5idWZsZW4pOworCiAJCWlmIChyZXEgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwogCkBAIC0zOTcsNiArNDE1LDggQEAKIAkvKiByZWxlYXNlIElOIHJlcXVlc3RzICovCiAJd2hpbGUgKGtmaWZvX2dldCgmbWlkaS0+aW5fcmVxX2ZpZm8sICZyZXEpKQogCQlmcmVlX2VwX3JlcShtaWRpLT5pbl9lcCwgcmVxKTsKKworCWZfbWlkaV9kcm9wX291dF9zdWJzdHJlYW1zKG1pZGkpOwogfQogCiBzdGF0aWMgaW50IGZfbWlkaV9zbmRfZnJlZShzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQpAQCAtNDA0LDEzMCArNDI0LDE2NiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBmX21pZGlfdHJhbnNtaXRfcGFja2V0KHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxLCB1aW50OF90IHAwLAotCQkJCQl1aW50OF90IHAxLCB1aW50OF90IHAyLCB1aW50OF90IHAzKQotewotCXVuc2lnbmVkIGxlbmd0aCA9IHJlcS0+bGVuZ3RoOwotCXU4ICpidWYgPSAodTggKilyZXEtPmJ1ZiArIGxlbmd0aDsKLQotCWJ1ZlswXSA9IHAwOwotCWJ1ZlsxXSA9IHAxOwotCWJ1ZlsyXSA9IHAyOwotCWJ1ZlszXSA9IHAzOwotCXJlcS0+bGVuZ3RoID0gbGVuZ3RoICsgNDsKLX0KLQogLyoKICAqIENvbnZlcnRzIE1JREkgY29tbWFuZHMgdG8gVVNCIE1JREkgcGFja2V0cy4KICAqLwogc3RhdGljIHZvaWQgZl9taWRpX3RyYW5zbWl0X2J5dGUoc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEsCiAJCQkJIHN0cnVjdCBnbWlkaV9pbl9wb3J0ICpwb3J0LCB1aW50OF90IGIpCiB7Ci0JdWludDhfdCBwMCA9IHBvcnQtPmNhYmxlIDw8IDQ7CisJdWludDhfdCBwWzRdID0geyBwb3J0LT5jYWJsZSA8PCA0LCAwLCAwLCAwIH07CisJdWludDhfdCBuZXh0X3N0YXRlID0gU1RBVEVfSU5JVElBTDsKIAotCWlmIChiID49IDB4ZjgpIHsKLQkJZl9taWRpX3RyYW5zbWl0X3BhY2tldChyZXEsIHAwIHwgMHgwZiwgYiwgMCwgMCk7Ci0JfSBlbHNlIGlmIChiID49IDB4ZjApIHsKKwlzd2l0Y2ggKGIpIHsKKwljYXNlIDB4ZjggLi4uIDB4ZmY6CisJCS8qIFN5c3RlbSBSZWFsLVRpbWUgTWVzc2FnZXMgKi8KKwkJcFswXSB8PSAweDBmOworCQlwWzFdID0gYjsKKwkJbmV4dF9zdGF0ZSA9IHBvcnQtPnN0YXRlOworCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX1JFQUxfVElNRTsKKwkJYnJlYWs7CisKKwljYXNlIDB4Zjc6CisJCS8qIEVuZCBvZiBTeXNFeCAqLworCQlzd2l0Y2ggKHBvcnQtPnN0YXRlKSB7CisJCWNhc2UgU1RBVEVfU1lTRVhfMDoKKwkJCXBbMF0gfD0gMHgwNTsKKwkJCXBbMV0gPSAweGY3OworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFX0ZJTklTSEVEOworCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfU1lTRVhfMToKKwkJCXBbMF0gfD0gMHgwNjsKKwkJCXBbMV0gPSBwb3J0LT5kYXRhWzBdOworCQkJcFsyXSA9IDB4Zjc7CisJCQluZXh0X3N0YXRlID0gU1RBVEVfRklOSVNIRUQ7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9TWVNFWF8yOgorCQkJcFswXSB8PSAweDA3OworCQkJcFsxXSA9IHBvcnQtPmRhdGFbMF07CisJCQlwWzJdID0gcG9ydC0+ZGF0YVsxXTsKKwkJCXBbM10gPSAweGY3OworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFX0ZJTklTSEVEOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBJZ25vcmUgYnl0ZSAqLworCQkJbmV4dF9zdGF0ZSA9IHBvcnQtPnN0YXRlOworCQkJcG9ydC0+c3RhdGUgPSBTVEFURV9JTklUSUFMOworCQl9CisJCWJyZWFrOworCisJY2FzZSAweGYwIC4uLiAweGY2OgorCQkvKiBTeXN0ZW0gQ29tbW9uIE1lc3NhZ2VzICovCisJCXBvcnQtPmRhdGFbMF0gPSBwb3J0LT5kYXRhWzFdID0gMDsKKwkJcG9ydC0+c3RhdGUgPSBTVEFURV9JTklUSUFMOwogCQlzd2l0Y2ggKGIpIHsKIAkJY2FzZSAweGYwOgogCQkJcG9ydC0+ZGF0YVswXSA9IGI7Ci0JCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX1NZU0VYXzE7CisJCQlwb3J0LT5kYXRhWzFdID0gMDsKKwkJCW5leHRfc3RhdGUgPSBTVEFURV9TWVNFWF8xOwogCQkJYnJlYWs7CiAJCWNhc2UgMHhmMToKIAkJY2FzZSAweGYzOgogCQkJcG9ydC0+ZGF0YVswXSA9IGI7Ci0JCQlwb3J0LT5zdGF0ZSA9IFNUQVRFXzFQQVJBTTsKKwkJCW5leHRfc3RhdGUgPSBTVEFURV8xUEFSQU07CiAJCQlicmVhazsKIAkJY2FzZSAweGYyOgogCQkJcG9ydC0+ZGF0YVswXSA9IGI7Ci0JCQlwb3J0LT5zdGF0ZSA9IFNUQVRFXzJQQVJBTV8xOworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFXzJQQVJBTV8xOwogCQkJYnJlYWs7CiAJCWNhc2UgMHhmNDoKIAkJY2FzZSAweGY1OgotCQkJcG9ydC0+c3RhdGUgPSBTVEFURV9VTktOT1dOOworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFX0lOSVRJQUw7CiAJCQlicmVhazsKIAkJY2FzZSAweGY2OgotCQkJZl9taWRpX3RyYW5zbWl0X3BhY2tldChyZXEsIHAwIHwgMHgwNSwgMHhmNiwgMCwgMCk7Ci0JCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX1VOS05PV047Ci0JCQlicmVhazsKLQkJY2FzZSAweGY3OgotCQkJc3dpdGNoIChwb3J0LT5zdGF0ZSkgewotCQkJY2FzZSBTVEFURV9TWVNFWF8wOgotCQkJCWZfbWlkaV90cmFuc21pdF9wYWNrZXQocmVxLAotCQkJCQlwMCB8IDB4MDUsIDB4ZjcsIDAsIDApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9TWVNFWF8xOgotCQkJCWZfbWlkaV90cmFuc21pdF9wYWNrZXQocmVxLAotCQkJCQlwMCB8IDB4MDYsIHBvcnQtPmRhdGFbMF0sIDB4ZjcsIDApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9TWVNFWF8yOgotCQkJCWZfbWlkaV90cmFuc21pdF9wYWNrZXQocmVxLAotCQkJCQlwMCB8IDB4MDcsIHBvcnQtPmRhdGFbMF0sCi0JCQkJCXBvcnQtPmRhdGFbMV0sIDB4ZjcpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcG9ydC0+c3RhdGUgPSBTVEFURV9VTktOT1dOOworCQkJcFswXSB8PSAweDA1OworCQkJcFsxXSA9IDB4ZjY7CisJCQluZXh0X3N0YXRlID0gU1RBVEVfRklOSVNIRUQ7CiAJCQlicmVhazsKIAkJfQotCX0gZWxzZSBpZiAoYiA+PSAweDgwKSB7CisJCWJyZWFrOworCisJY2FzZSAweDgwIC4uLiAweGVmOgorCQkvKgorCQkgKiBDaGFubmVsIFZvaWNlIE1lc3NhZ2VzLCBDaGFubmVsIE1vZGUgTWVzc2FnZXMKKwkJICogYW5kIENvbnRyb2wgQ2hhbmdlIE1lc3NhZ2VzLgorCQkgKi8KIAkJcG9ydC0+ZGF0YVswXSA9IGI7CisJCXBvcnQtPmRhdGFbMV0gPSAwOworCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX0lOSVRJQUw7CiAJCWlmIChiID49IDB4YzAgJiYgYiA8PSAweGRmKQotCQkJcG9ydC0+c3RhdGUgPSBTVEFURV8xUEFSQU07CisJCQluZXh0X3N0YXRlID0gU1RBVEVfMVBBUkFNOwogCQllbHNlCi0JCQlwb3J0LT5zdGF0ZSA9IFNUQVRFXzJQQVJBTV8xOwotCX0gZWxzZSB7IC8qIGIgPCAweDgwICovCisJCQluZXh0X3N0YXRlID0gU1RBVEVfMlBBUkFNXzE7CisJCWJyZWFrOworCisJY2FzZSAweDAwIC4uLiAweDdmOgorCQkvKiBNZXNzYWdlIHBhcmFtZXRlcnMgKi8KIAkJc3dpdGNoIChwb3J0LT5zdGF0ZSkgewogCQljYXNlIFNUQVRFXzFQQVJBTToKLQkJCWlmIChwb3J0LT5kYXRhWzBdIDwgMHhmMCkgewotCQkJCXAwIHw9IHBvcnQtPmRhdGFbMF0gPj4gNDsKLQkJCX0gZWxzZSB7Ci0JCQkJcDAgfD0gMHgwMjsKLQkJCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX1VOS05PV047Ci0JCQl9Ci0JCQlmX21pZGlfdHJhbnNtaXRfcGFja2V0KHJlcSwgcDAsIHBvcnQtPmRhdGFbMF0sIGIsIDApOworCQkJaWYgKHBvcnQtPmRhdGFbMF0gPCAweGYwKQorCQkJCXBbMF0gfD0gcG9ydC0+ZGF0YVswXSA+PiA0OworCQkJZWxzZQorCQkJCXBbMF0gfD0gMHgwMjsKKworCQkJcFsxXSA9IHBvcnQtPmRhdGFbMF07CisJCQlwWzJdID0gYjsKKwkJCS8qIFRoaXMgaXMgdG8gYWxsb3cgUnVubmluZyBTdGF0ZSBNZXNzYWdlcyAqLworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFXzFQQVJBTTsKIAkJCWJyZWFrOwogCQljYXNlIFNUQVRFXzJQQVJBTV8xOgogCQkJcG9ydC0+ZGF0YVsxXSA9IGI7Ci0JCQlwb3J0LT5zdGF0ZSA9IFNUQVRFXzJQQVJBTV8yOworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFXzJQQVJBTV8yOwogCQkJYnJlYWs7CiAJCWNhc2UgU1RBVEVfMlBBUkFNXzI6Ci0JCQlpZiAocG9ydC0+ZGF0YVswXSA8IDB4ZjApIHsKLQkJCQlwMCB8PSBwb3J0LT5kYXRhWzBdID4+IDQ7Ci0JCQkJcG9ydC0+c3RhdGUgPSBTVEFURV8yUEFSQU1fMTsKLQkJCX0gZWxzZSB7Ci0JCQkJcDAgfD0gMHgwMzsKLQkJCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX1VOS05PV047Ci0JCQl9Ci0JCQlmX21pZGlfdHJhbnNtaXRfcGFja2V0KHJlcSwKLQkJCQlwMCwgcG9ydC0+ZGF0YVswXSwgcG9ydC0+ZGF0YVsxXSwgYik7CisJCQlpZiAocG9ydC0+ZGF0YVswXSA8IDB4ZjApCisJCQkJcFswXSB8PSBwb3J0LT5kYXRhWzBdID4+IDQ7CisJCQllbHNlCisJCQkJcFswXSB8PSAweDAzOworCisJCQlwWzFdID0gcG9ydC0+ZGF0YVswXTsKKwkJCXBbMl0gPSBwb3J0LT5kYXRhWzFdOworCQkJcFszXSA9IGI7CisJCQkvKiBUaGlzIGlzIHRvIGFsbG93IFJ1bm5pbmcgU3RhdGUgTWVzc2FnZXMgKi8KKwkJCW5leHRfc3RhdGUgPSBTVEFURV8yUEFSQU1fMTsKIAkJCWJyZWFrOwogCQljYXNlIFNUQVRFX1NZU0VYXzA6CiAJCQlwb3J0LT5kYXRhWzBdID0gYjsKLQkJCXBvcnQtPnN0YXRlID0gU1RBVEVfU1lTRVhfMTsKKwkJCW5leHRfc3RhdGUgPSBTVEFURV9TWVNFWF8xOwogCQkJYnJlYWs7CiAJCWNhc2UgU1RBVEVfU1lTRVhfMToKIAkJCXBvcnQtPmRhdGFbMV0gPSBiOwotCQkJcG9ydC0+c3RhdGUgPSBTVEFURV9TWVNFWF8yOworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFX1NZU0VYXzI7CiAJCQlicmVhazsKIAkJY2FzZSBTVEFURV9TWVNFWF8yOgotCQkJZl9taWRpX3RyYW5zbWl0X3BhY2tldChyZXEsCi0JCQkJcDAgfCAweDA0LCBwb3J0LT5kYXRhWzBdLCBwb3J0LT5kYXRhWzFdLCBiKTsKLQkJCXBvcnQtPnN0YXRlID0gU1RBVEVfU1lTRVhfMDsKKwkJCXBbMF0gfD0gMHgwNDsKKwkJCXBbMV0gPSBwb3J0LT5kYXRhWzBdOworCQkJcFsyXSA9IHBvcnQtPmRhdGFbMV07CisJCQlwWzNdID0gYjsKKwkJCW5leHRfc3RhdGUgPSBTVEFURV9TWVNFWF8wOwogCQkJYnJlYWs7CiAJCX0KKwkJYnJlYWs7CiAJfQotfQogCi1zdGF0aWMgdm9pZCBmX21pZGlfZHJvcF9vdXRfc3Vic3RyZWFtcyhzdHJ1Y3QgZl9taWRpICptaWRpKQotewotCXVuc2lnbmVkIGludCBpOworCS8qIFN0YXRlcyB3aGVyZSB3ZSBoYXZlIHRvIHdyaXRlIGludG8gdGhlIFVTQiByZXF1ZXN0ICovCisJaWYgKG5leHRfc3RhdGUgPT0gU1RBVEVfRklOSVNIRUQgfHwKKwkgICAgcG9ydC0+c3RhdGUgPT0gU1RBVEVfU1lTRVhfMiB8fAorCSAgICBwb3J0LT5zdGF0ZSA9PSBTVEFURV8xUEFSQU0gfHwKKwkgICAgcG9ydC0+c3RhdGUgPT0gU1RBVEVfMlBBUkFNXzIgfHwKKwkgICAgcG9ydC0+c3RhdGUgPT0gU1RBVEVfUkVBTF9USU1FKSB7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbWlkaS0+aW5fcG9ydHM7IGkrKykgewotCQlzdHJ1Y3QgZ21pZGlfaW5fcG9ydCAqcG9ydCA9IG1pZGktPmluX3BvcnRzX2FycmF5ICsgaTsKLQkJc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gcG9ydC0+c3Vic3RyZWFtOwotCQlpZiAocG9ydC0+YWN0aXZlICYmIHN1YnN0cmVhbSkKLQkJCXNuZF9yYXdtaWRpX2Ryb3Bfb3V0cHV0KHN1YnN0cmVhbSk7CisJCXVuc2lnbmVkIGludCBsZW5ndGggPSByZXEtPmxlbmd0aDsKKwkJdTggKmJ1ZiA9ICh1OCAqKXJlcS0+YnVmICsgbGVuZ3RoOworCisJCW1lbWNweShidWYsIHAsIHNpemVvZihwKSk7CisJCXJlcS0+bGVuZ3RoID0gbGVuZ3RoICsgc2l6ZW9mKHApOworCisJCWlmIChuZXh0X3N0YXRlID09IFNUQVRFX0ZJTklTSEVEKSB7CisJCQluZXh0X3N0YXRlID0gU1RBVEVfSU5JVElBTDsKKwkJCXBvcnQtPmRhdGFbMF0gPSBwb3J0LT5kYXRhWzFdID0gMDsKKwkJfQogCX0KKworCXBvcnQtPnN0YXRlID0gbmV4dF9zdGF0ZTsKIH0KIAogc3RhdGljIGludCBmX21pZGlfZG9fdHJhbnNtaXQoc3RydWN0IGZfbWlkaSAqbWlkaSwgc3RydWN0IHVzYl9lcCAqZXApCkBAIC02NDIsNyArNjk4LDcgQEAKIAlWREJHKG1pZGksICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAJcG9ydCA9IG1pZGktPmluX3BvcnRzX2FycmF5ICsgc3Vic3RyZWFtLT5udW1iZXI7CiAJcG9ydC0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwotCXBvcnQtPnN0YXRlID0gU1RBVEVfVU5LTk9XTjsKKwlwb3J0LT5zdGF0ZSA9IFNUQVRFX0lOSVRJQUw7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExMjMsNyArMTE3OSw3IEBACiAJb3B0cy0+ZnVuY19pbnN0LmZyZWVfZnVuY19pbnN0ID0gZl9taWRpX2ZyZWVfaW5zdDsKIAlvcHRzLT5pbmRleCA9IFNORFJWX0RFRkFVTFRfSURYMTsKIAlvcHRzLT5pZCA9IFNORFJWX0RFRkFVTFRfU1RSMTsKLQlvcHRzLT5idWZsZW4gPSAyNTY7CisJb3B0cy0+YnVmbGVuID0gNTEyOwogCW9wdHMtPnFsZW4gPSAzMjsKIAlvcHRzLT5pbl9wb3J0cyA9IDE7CiAJb3B0cy0+b3V0X3BvcnRzID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX25jbS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbmNtLmMKaW5kZXggOTdmMGE5Yi4uNjM5NjAzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbmNtLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbmNtLmMKQEAgLTkwLDcgKzkwLDkgQEAKIC8qIHBlYWsgKHRoZW9yZXRpY2FsKSBidWxrIHRyYW5zZmVyIHJhdGUgaW4gYml0cy1wZXItc2Vjb25kICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIG5jbV9iaXRyYXRlKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnKQogewotCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGcpICYmIGctPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCWlmIChnYWRnZXRfaXNfc3VwZXJzcGVlZChnKSAmJiBnLT5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIpCisJCXJldHVybiAxMyAqIDEwMjQgKiA4ICogMTAwMCAqIDg7CisJZWxzZSBpZiAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChnKSAmJiBnLT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKIAkJcmV0dXJuIDEzICogNTEyICogOCAqIDEwMDAgKiA4OwogCWVsc2UKIAkJcmV0dXJuIDE5ICogIDY0ICogMSAqIDEwMDAgKiA4OwpAQCAtMzMzLDYgKzMzNSw3NiBAQAogCU5VTEwsCiB9OwogCisKKy8qIHN1cGVyIHNwZWVkIHN1cHBvcnQ6ICovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Igc3NfbmNtX25vdGlmeV9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisKKwkuYkVuZHBvaW50QWRkcmVzcyA9CVVTQl9ESVJfSU4sCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisJLndNYXhQYWNrZXRTaXplID0JY3B1X3RvX2xlMTYoTkNNX1NUQVRVU19CWVRFQ09VTlQpLAorCS5iSW50ZXJ2YWwgPQkJVVNCX01TX1RPX0hTX0lOVEVSVkFMKE5DTV9TVEFUVVNfSU5URVJWQUxfTVMpCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3Igc3NfbmNtX25vdGlmeV9jb21wX2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJc2l6ZW9mKHNzX25jbV9ub3RpZnlfY29tcF9kZXNjKSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAsCisKKwkvKiB0aGUgZm9sbG93aW5nIDMgdmFsdWVzIGNhbiBiZSB0d2Vha2VkIGlmIG5lY2Vzc2FyeSAqLworCS8qIC5iTWF4QnVyc3QgPQkJMCwgKi8KKwkvKiAuYm1BdHRyaWJ1dGVzID0JMCwgKi8KKwkud0J5dGVzUGVySW50ZXJ2YWwgPQljcHVfdG9fbGUxNihOQ01fU1RBVFVTX0JZVEVDT1VOVCksCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIHNzX25jbV9pbl9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisKKwkuYkVuZHBvaW50QWRkcmVzcyA9CVVTQl9ESVJfSU4sCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCS53TWF4UGFja2V0U2l6ZSA9CWNwdV90b19sZTE2KDEwMjQpLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBzc19uY21fb3V0X2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKworCS5iRW5kcG9pbnRBZGRyZXNzID0JVVNCX0RJUl9PVVQsCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCS53TWF4UGFja2V0U2l6ZSA9CWNwdV90b19sZTE2KDEwMjQpLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNzX25jbV9idWxrX2NvbXBfZGVzYyA9IHsKKwkuYkxlbmd0aCA9CQlzaXplb2Yoc3NfbmNtX2J1bGtfY29tcF9kZXNjKSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAsCisKKwkvKiB0aGUgZm9sbG93aW5nIDIgdmFsdWVzIGNhbiBiZSB0d2Vha2VkIGlmIG5lY2Vzc2FyeSAqLworCS8qIC5iTWF4QnVyc3QgPQkJMCwgKi8KKwkvKiAuYm1BdHRyaWJ1dGVzID0JMCwgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICpuY21fc3NfZnVuY3Rpb25bXSA9IHsKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmbmNtX2lhZF9kZXNjLAorCS8qIENEQyBOQ00gY29udHJvbCBkZXNjcmlwdG9ycyAqLworCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZuY21fY29udHJvbF9pbnRmLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZuY21faGVhZGVyX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJm5jbV91bmlvbl9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZlY21fZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmbmNtX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX25jbV9ub3RpZnlfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3NfbmNtX25vdGlmeV9jb21wX2Rlc2MsCisJLyogZGF0YSBpbnRlcmZhY2UsIGFsdHNldHRpbmdzIDAgYW5kIDEgKi8KKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmbmNtX2RhdGFfbm9wX2ludGYsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJm5jbV9kYXRhX2ludGYsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX25jbV9pbl9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19uY21fYnVsa19jb21wX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX25jbV9vdXRfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3NfbmNtX2J1bGtfY29tcF9kZXNjLAorCU5VTEwsCit9OworCiAvKiBzdHJpbmcgZGVzY3JpcHRvcnM6ICovCiAKICNkZWZpbmUgU1RSSU5HX0NUUkxfSURYCTAKQEAgLTg1Miw2ICs5MjQsOCBAQAogCQkJICovCiAJCQluY20tPnBvcnQuaXNfemxwX29rID0KIAkJCQlnYWRnZXRfaXNfemxwX3N1cHBvcnRlZChjZGV2LT5nYWRnZXQpOworCQkJbmNtLT5wb3J0Lm5vX3NrYl9yZXNlcnZlID0KKwkJCQlnYWRnZXRfYXZvaWRzX3NrYl9yZXNlcnZlKGNkZXYtPmdhZGdldCk7CiAJCQluY20tPnBvcnQuY2RjX2ZpbHRlciA9IERFRkFVTFRfRklMVEVSOwogCQkJREJHKGNkZXYsICJhY3RpdmF0ZSBuY21cbiIpOwogCQkJbmV0ID0gZ2V0aGVyX2Nvbm5lY3QoJm5jbS0+cG9ydCk7CkBAIC0xNDMxLDggKzE1MDUsMTMgQEAKIAloc19uY21fbm90aWZ5X2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9CiAJCWZzX25jbV9ub3RpZnlfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwogCisJc3NfbmNtX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9IGZzX25jbV9pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3M7CisJc3NfbmNtX291dF9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPSBmc19uY21fb3V0X2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKKwlzc19uY21fbm90aWZ5X2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9CisJCWZzX25jbV9ub3RpZnlfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCiAJc3RhdHVzID0gdXNiX2Fzc2lnbl9kZXNjcmlwdG9ycyhmLCBuY21fZnNfZnVuY3Rpb24sIG5jbV9oc19mdW5jdGlvbiwKLQkJCU5VTEwsIE5VTEwpOworCQkJbmNtX3NzX2Z1bmN0aW9uLCBOVUxMKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGZhaWw7CiAKQEAgLTE0NTAsNiArMTUyOSw3IEBACiAJbmNtLT50YXNrX3RpbWVyLmZ1bmN0aW9uID0gbmNtX3R4X3RpbWVvdXQ7CiAKIAlEQkcoY2RldiwgIkNEQyBOZXR3b3JrOiAlcyBzcGVlZCBJTi8lcyBPVVQvJXMgTk9USUZZLyVzXG4iLAorCQkJZ2FkZ2V0X2lzX3N1cGVyc3BlZWQoYy0+Y2Rldi0+Z2FkZ2V0KSA/ICJzdXBlciIgOgogCQkJZ2FkZ2V0X2lzX2R1YWxzcGVlZChjLT5jZGV2LT5nYWRnZXQpID8gImR1YWwiIDogImZ1bGwiLAogCQkJbmNtLT5wb3J0LmluX2VwLT5uYW1lLCBuY20tPnBvcnQub3V0X2VwLT5uYW1lLAogCQkJbmNtLT5ub3RpZnktPm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfcHJpbnRlci5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfcHJpbnRlci5jCmluZGV4IDY0NzA2YTcuLjBkZTM2Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3ByaW50ZXIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9wcmludGVyLmMKQEAgLTg4OSwxMyArODg5LDE3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdGF0aWMgYm9vbCBncHJpbnRlcl9yZXFfbWF0Y2goc3RydWN0IHVzYl9mdW5jdGlvbiAqZiwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJsKQorCQkJICAgICAgIGNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwsCisJCQkgICAgICAgYm9vbCBjb25maWcwKQogewogCXN0cnVjdCBwcmludGVyX2RldgkqZGV2ID0gZnVuY190b19wcmludGVyKGYpOwogCXUxNgkJCXdfaW5kZXggPSBsZTE2X3RvX2NwdShjdHJsLT53SW5kZXgpOwogCXUxNgkJCXdfdmFsdWUgPSBsZTE2X3RvX2NwdShjdHJsLT53VmFsdWUpOwogCXUxNgkJCXdfbGVuZ3RoID0gbGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCk7CiAKKwlpZiAoY29uZmlnMCkKKwkJcmV0dXJuIGZhbHNlOworCiAJaWYgKChjdHJsLT5iUmVxdWVzdFR5cGUgJiBVU0JfUkVDSVBfTUFTSykgIT0gVVNCX1JFQ0lQX0lOVEVSRkFDRSB8fAogCSAgICAoY3RybC0+YlJlcXVlc3RUeXBlICYgVVNCX1RZUEVfTUFTSykgIT0gVVNCX1RZUEVfQ0xBU1MpCiAJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3JuZGlzLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9ybmRpcy5jCmluZGV4IGM4MDA1ODIuLjE2NTYyZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3JuZGlzLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2Zfcm5kaXMuYwpAQCAtMzc0LDYgKzM3NCw5IEBACiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CiAKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKIAlza2IyID0gc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBzaXplb2Yoc3RydWN0IHJuZGlzX3BhY2tldF9tc2dfdHlwZSkpOwogCXJuZGlzX2FkZF9oZHIoc2tiMik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3NvdXJjZXNpbmsuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3NvdXJjZXNpbmsuYwppbmRleCBkZjAxODlkLi44Nzg0ZmExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9zb3VyY2VzaW5rLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2Zfc291cmNlc2luay5jCkBAIC0yOTMsOSArMjkzLDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnNzX2FsbG9jX2VwX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwgaW50IGxlbikKIHsKLQlzdHJ1Y3QgZl9zb3VyY2VzaW5rCQkqc3MgPSBlcC0+ZHJpdmVyX2RhdGE7Ci0KLQlyZXR1cm4gYWxsb2NfZXBfcmVxKGVwLCBsZW4sIHNzLT5idWZsZW4pOworCXJldHVybiBhbGxvY19lcF9yZXEoZXAsIGxlbik7CiB9CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfZXAoc3RydWN0IHVzYl9jb21wb3NpdGVfZGV2ICpjZGV2LCBzdHJ1Y3QgdXNiX2VwICplcCkKQEAgLTYwNiw3ICs2MDQsNyBAQAogCX0gZWxzZSB7CiAJCWVwID0gaXNfaW4gPyBzcy0+aW5fZXAgOiBzcy0+b3V0X2VwOwogCQlxbGVuID0gc3MtPmJ1bGtfcWxlbjsKLQkJc2l6ZSA9IDA7CisJCXNpemUgPSBzcy0+YnVmbGVuOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBxbGVuOyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3V2Yy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfdXZjLmMKaW5kZXggMjliNDFiNS4uMjdlZDUxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfdXZjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfdXZjLmMKQEAgLTI1OCw2ICsyNTgsMTMgQEAKIAltZW1jcHkoJnV2Y19ldmVudC0+cmVxLCBjdHJsLCBzaXplb2YodXZjX2V2ZW50LT5yZXEpKTsKIAl2NGwyX2V2ZW50X3F1ZXVlKCZ1dmMtPnZkZXYsICZ2NGwyX2V2ZW50KTsKIAorCS8qIFBhc3MgYWRkaXRpb25hbCBzZXR1cCBkYXRhIHRvIHVzZXJzcGFjZSAqLworCWlmICh1dmMtPmV2ZW50X3NldHVwX291dCAmJiB1dmMtPmV2ZW50X2xlbmd0aCkgeworCQl1dmMtPmNvbnRyb2xfcmVxLT5sZW5ndGggPSB1dmMtPmV2ZW50X2xlbmd0aDsKKwkJcmV0dXJuIHVzYl9lcF9xdWV1ZSh1dmMtPmZ1bmMuY29uZmlnLT5jZGV2LT5nYWRnZXQtPmVwMCwKKwkJCXV2Yy0+Y29udHJvbF9yZXEsIEdGUF9BVE9NSUMpOworCX0KKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vcm5kaXMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9ybmRpcy5jCmluZGV4IDk0M2MyMWEuLmFiNmFjMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9ybmRpcy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9ybmRpcy5jCkBAIC02ODAsNiArNjgwLDEyIEBACiB7CiAJcm5kaXNfcmVzZXRfY21wbHRfdHlwZSAqcmVzcDsKIAlybmRpc19yZXNwX3QgKnI7CisJdTggKnhidWY7CisJdTMyIGxlbmd0aDsKKworCS8qIGRyYWluIHRoZSByZXNwb25zZSBxdWV1ZSAqLworCXdoaWxlICgoeGJ1ZiA9IHJuZGlzX2dldF9uZXh0X3Jlc3BvbnNlKHBhcmFtcywgJmxlbmd0aCkpKQorCQlybmRpc19mcmVlX3Jlc3BvbnNlKHBhcmFtcywgeGJ1Zik7CiAKIAlyID0gcm5kaXNfYWRkX3Jlc3BvbnNlKHBhcmFtcywgc2l6ZW9mKHJuZGlzX3Jlc2V0X2NtcGx0X3R5cGUpKTsKIAlpZiAoIXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vc3RvcmFnZV9jb21tb24uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9zdG9yYWdlX2NvbW1vbi5jCmluZGV4IDk5MGRmMjIuLjhmYmY2ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9zdG9yYWdlX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9zdG9yYWdlX2NvbW1vbi5jCkBAIC0zNjksNiArMzY5LDEyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChmc2dfc2hvd19yZW1vdmFibGUpOwogCitzc2l6ZV90IGZzZ19zaG93X2lucXVpcnlfc3RyaW5nKHN0cnVjdCBmc2dfbHVuICpjdXJsdW4sIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY3VybHVuLT5pbnF1aXJ5X3N0cmluZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2dfc2hvd19pbnF1aXJ5X3N0cmluZyk7CisKIC8qCiAgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBmc2ctPmZpbGVzZW0gZm9yIHJlYWRpbmcgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCiAgKi8KQEAgLTQ5OSw0ICs1MDUsMjIgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGZzZ19zdG9yZV9yZW1vdmFibGUpOwogCitzc2l6ZV90IGZzZ19zdG9yZV9pbnF1aXJ5X3N0cmluZyhzdHJ1Y3QgZnNnX2x1biAqY3VybHVuLCBjb25zdCBjaGFyICpidWYsCisJCQkJIHNpemVfdCBjb3VudCkKK3sKKwljb25zdCBzaXplX3QgbGVuID0gbWluKGNvdW50LCBzaXplb2YoY3VybHVuLT5pbnF1aXJ5X3N0cmluZykpOworCisJaWYgKGxlbiA9PSAwIHx8IGJ1ZlswXSA9PSAnXG4nKSB7CisJCWN1cmx1bi0+aW5xdWlyeV9zdHJpbmdbMF0gPSAwOworCX0gZWxzZSB7CisJCXNucHJpbnRmKGN1cmx1bi0+aW5xdWlyeV9zdHJpbmcsCisJCQkgc2l6ZW9mKGN1cmx1bi0+aW5xdWlyeV9zdHJpbmcpLCAiJS0yOHMiLCBidWYpOworCQlpZiAoY3VybHVuLT5pbnF1aXJ5X3N0cmluZ1tsZW4tMV0gPT0gJ1xuJykKKwkJCWN1cmx1bi0+aW5xdWlyeV9zdHJpbmdbbGVuLTFdID0gJyAnOworCX0KKworCXJldHVybiBjb3VudDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzZ19zdG9yZV9pbnF1aXJ5X3N0cmluZyk7CisKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9zdG9yYWdlX2NvbW1vbi5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3N0b3JhZ2VfY29tbW9uLmgKaW5kZXggYzM1NDRlNi4uZTY5ODQ4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3N0b3JhZ2VfY29tbW9uLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3N0b3JhZ2VfY29tbW9uLmgKQEAgLTg4LDYgKzg4LDEyIEBACiAjZGVmaW5lIEFTQyh4KQkJKCh1OCkgKCh4KSA+PiA4KSkKICNkZWZpbmUgQVNDUSh4KQkJKCh1OCkgKHgpKQogCisvKgorICogVmVuZG9yICg4IGNoYXJzKSwgcHJvZHVjdCAoMTYgY2hhcnMpLCByZWxlYXNlICg0IGhleGFkZWNpbWFsIGRpZ2l0cykgYW5kIE5VTAorICogYnl0ZQorICovCisjZGVmaW5lIElOUVVJUllfU1RSSU5HX0xFTiAoKHNpemVfdCkgKDggKyAxNiArIDQgKyAxKSkKKwogc3RydWN0IGZzZ19sdW4gewogCXN0cnVjdCBmaWxlCSpmaWxwOwogCWxvZmZfdAkJZmlsZV9sZW5ndGg7CkBAIC0xMTIsNiArMTE4LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlCWRldjsKIAljb25zdCBjaGFyCSpuYW1lOwkJLyogImx1bi5uYW1lIiAqLwogCWNvbnN0IGNoYXIJKipuYW1lX3BmeDsJLyogImZ1bmN0aW9uLm5hbWUiICovCisJY2hhcgkJaW5xdWlyeV9zdHJpbmdbSU5RVUlSWV9TVFJJTkdfTEVOXTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBmc2dfbHVuX2lzX29wZW4oc3RydWN0IGZzZ19sdW4gKmN1cmx1bikKQEAgLTIxMCw2ICsyMTcsNyBAQAogc3NpemVfdCBmc2dfc2hvd19ub2Z1YShzdHJ1Y3QgZnNnX2x1biAqY3VybHVuLCBjaGFyICpidWYpOwogc3NpemVfdCBmc2dfc2hvd19maWxlKHN0cnVjdCBmc2dfbHVuICpjdXJsdW4sIHN0cnVjdCByd19zZW1hcGhvcmUgKmZpbGVzZW0sCiAJCSAgICAgIGNoYXIgKmJ1Zik7Citzc2l6ZV90IGZzZ19zaG93X2lucXVpcnlfc3RyaW5nKHN0cnVjdCBmc2dfbHVuICpjdXJsdW4sIGNoYXIgKmJ1Zik7CiBzc2l6ZV90IGZzZ19zaG93X2Nkcm9tKHN0cnVjdCBmc2dfbHVuICpjdXJsdW4sIGNoYXIgKmJ1Zik7CiBzc2l6ZV90IGZzZ19zaG93X3JlbW92YWJsZShzdHJ1Y3QgZnNnX2x1biAqY3VybHVuLCBjaGFyICpidWYpOwogc3NpemVfdCBmc2dfc3RvcmVfcm8oc3RydWN0IGZzZ19sdW4gKmN1cmx1biwgc3RydWN0IHJ3X3NlbWFwaG9yZSAqZmlsZXNlbSwKQEAgLTIyMSw1ICsyMjksNyBAQAogCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwogc3NpemVfdCBmc2dfc3RvcmVfcmVtb3ZhYmxlKHN0cnVjdCBmc2dfbHVuICpjdXJsdW4sIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJCSAgICBzaXplX3QgY291bnQpOworc3NpemVfdCBmc2dfc3RvcmVfaW5xdWlyeV9zdHJpbmcoc3RydWN0IGZzZ19sdW4gKmN1cmx1biwgY29uc3QgY2hhciAqYnVmLAorCQkJCSBzaXplX3QgY291bnQpOwogCiAjZW5kaWYgLyogVVNCX1NUT1JBR0VfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi91X2V0aGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdV9ldGhlci5jCmluZGV4IGEzZjdlN2MuLjljOGM5ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi91X2V0aGVyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3VfZXRoZXIuYwpAQCAtODIsNiArODIsNyBAQAogI2RlZmluZQlXT1JLX1JYX01FTU9SWQkJMAogCiAJYm9vbAkJCXpscDsKKwlib29sCQkJbm9fc2tiX3Jlc2VydmU7CiAJdTgJCQlob3N0X21hY1tFVEhfQUxFTl07CiAJdTgJCQlkZXZfbWFjW0VUSF9BTEVOXTsKIH07CkBAIC0yMzMsNyArMjM0LDggQEAKIAkgKiBidXQgb24gYXQgbGVhc3Qgb25lLCBjaGVja3N1bW1pbmcgZmFpbHMgb3RoZXJ3aXNlLiAgTm90ZToKIAkgKiBSTkRJUyBoZWFkZXJzIGludm9sdmUgdmFyaWFibGUgbnVtYmVycyBvZiBMRTMyIHZhbHVlcy4KIAkgKi8KLQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisJaWYgKGxpa2VseSghZGV2LT5ub19za2JfcmVzZXJ2ZSkpCisJCXNrYl9yZXNlcnZlKHNrYiwgTkVUX0lQX0FMSUdOKTsKIAogCXJlcS0+YnVmID0gc2tiLT5kYXRhOwogCXJlcS0+bGVuZ3RoID0gc2l6ZTsKQEAgLTU1Niw3ICs1NTgsOCBAQAogCQkJLyogTXVsdGkgZnJhbWUgQ0RDIHByb3RvY29scyBtYXkgc3RvcmUgdGhlIGZyYW1lIGZvcgogCQkJICogbGF0ZXIgd2hpY2ggaXMgbm90IGEgZHJvcHBlZCBmcmFtZS4KIAkJCSAqLwotCQkJaWYgKGRldi0+cG9ydF91c2ItPnN1cHBvcnRzX211bHRpX2ZyYW1lKQorCQkJaWYgKGRldi0+cG9ydF91c2IgJiYKKwkJCQkJZGV2LT5wb3J0X3VzYi0+c3VwcG9ydHNfbXVsdGlfZnJhbWUpCiAJCQkJZ290byBtdWx0aWZyYW1lOwogCQkJZ290byBkcm9wOwogCQl9CkBAIC01NjgsNyArNTcxLDggQEAKIAlyZXEtPmNvbXBsZXRlID0gdHhfY29tcGxldGU7CiAKIAkvKiBOQ00gcmVxdWlyZXMgbm8gemxwIGlmIHRyYW5zZmVyIGlzIGR3TnRiSW5NYXhTaXplICovCi0JaWYgKGRldi0+cG9ydF91c2ItPmlzX2ZpeGVkICYmCisJaWYgKGRldi0+cG9ydF91c2IgJiYKKwkgICAgZGV2LT5wb3J0X3VzYi0+aXNfZml4ZWQgJiYKIAkgICAgbGVuZ3RoID09IGRldi0+cG9ydF91c2ItPmZpeGVkX2luX2xlbiAmJgogCSAgICAobGVuZ3RoICUgaW4tPm1heHBhY2tldCkgPT0gMCkKIAkJcmVxLT56ZXJvID0gMDsKQEAgLTEwNjIsNiArMTA2Niw3IEBACiAKIAlpZiAocmVzdWx0ID09IDApIHsKIAkJZGV2LT56bHAgPSBsaW5rLT5pc196bHBfb2s7CisJCWRldi0+bm9fc2tiX3Jlc2VydmUgPSBsaW5rLT5ub19za2JfcmVzZXJ2ZTsKIAkJREJHKGRldiwgInFsZW4gJWRcbiIsIHFsZW4oZGV2LT5nYWRnZXQsIGRldi0+cW11bHQpKTsKIAogCQlkZXYtPmhlYWRlcl9sZW4gPSBsaW5rLT5oZWFkZXJfbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3VfZXRoZXIuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi91X2V0aGVyLmgKaW5kZXggYzc3MTQ1Yi4uODFkOTRhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3VfZXRoZXIuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdV9ldGhlci5oCkBAIC02NCw2ICs2NCw3IEBACiAJc3RydWN0IHVzYl9lcAkJCSpvdXRfZXA7CiAKIAlib29sCQkJCWlzX3pscF9vazsKKwlib29sCQkJCW5vX3NrYl9yZXNlcnZlOwogCiAJdTE2CQkJCWNkY19maWx0ZXI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi91X3NlcmlhbC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3Vfc2VyaWFsLmMKaW5kZXggNmRlZDYzNC4uZTBjZDFlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3Vfc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3Vfc2VyaWFsLmMKQEAgLTM3NSwxMCArMzc1LDE1IEBACiAqLwogewogCXN0cnVjdCBsaXN0X2hlYWQJKnBvb2wgPSAmcG9ydC0+d3JpdGVfcG9vbDsKLQlzdHJ1Y3QgdXNiX2VwCQkqaW4gPSBwb3J0LT5wb3J0X3VzYi0+aW47CisJc3RydWN0IHVzYl9lcAkJKmluOwogCWludAkJCXN0YXR1cyA9IDA7CiAJYm9vbAkJCWRvX3R0eV93YWtlID0gZmFsc2U7CiAKKwlpZiAoIXBvcnQtPnBvcnRfdXNiKQorCQlyZXR1cm4gc3RhdHVzOworCisJaW4gPSBwb3J0LT5wb3J0X3VzYi0+aW47CisKIAl3aGlsZSAoIXBvcnQtPndyaXRlX2J1c3kgJiYgIWxpc3RfZW1wdHkocG9vbCkpIHsKIAkJc3RydWN0IHVzYl9yZXF1ZXN0CSpyZXE7CiAJCWludAkJCWxlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi91dmNfY29uZmlnZnMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi91dmNfY29uZmlnZnMuYwppbmRleCA2Njc1M2JhLi4zMTEyNWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdXZjX2NvbmZpZ2ZzLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3V2Y19jb25maWdmcy5jCkBAIC0yMDIzLDcgKzIwMjMsNyBAQAogCWlmICghZGF0YSkgewogCQlrZnJlZSgqY2xhc3NfYXJyYXkpOwogCQkqY2xhc3NfYXJyYXkgPSBOVUxMOwotCQlyZXQgPSBQVFJfRVJSKGRhdGEpOworCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIHVubG9jazsKIAl9CiAJY2xfYXJyID0gKmNsYXNzX2FycmF5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2xlZ2FjeS9nbWlkaS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2xlZ2FjeS9nbWlkaS5jCmluZGV4IGZjMmFjMTUuLjBiZjM5YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9sZWdhY3kvZ21pZGkuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L2dtaWRpLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIG1vZHVsZV9wYXJhbShpZCwgY2hhcnAsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgdGhlIFVTQiBNSURJIEdhZGdldCBhZGFwdGVyLiIpOwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGJ1ZmxlbiA9IDI1NjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnVmbGVuID0gNTEyOwogbW9kdWxlX3BhcmFtKGJ1ZmxlbiwgdWludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKGJ1ZmxlbiwgIk1JREkgYnVmZmVyIGxlbmd0aCIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L2lub2RlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L2lub2RlLmMKaW5kZXggYWEzNzA3Yi4uMTYxMDRiNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9sZWdhY3kvaW5vZGUuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L2lub2RlLmMKQEAgLTU0Miw3ICs1NDIsNyBAQAogCSAqLwogCXNwaW5fbG9ja19pcnEoJmVwZGF0YS0+ZGV2LT5sb2NrKTsKIAl2YWx1ZSA9IC1FTk9ERVY7Ci0JaWYgKHVubGlrZWx5KGVwZGF0YS0+ZXApKQorCWlmICh1bmxpa2VseShlcGRhdGEtPmVwID09IE5VTEwpKQogCQlnb3RvIGZhaWw7CiAKIAlyZXEgPSB1c2JfZXBfYWxsb2NfcmVxdWVzdChlcGRhdGEtPmVwLCBHRlBfQVRPTUlDKTsKQEAgLTYwNiw3ICs2MDYsNyBAQAogCX0KIAlpZiAoaXNfc3luY19raW9jYihpb2NiKSkgewogCQl2YWx1ZSA9IGVwX2lvKGVwZGF0YSwgYnVmLCBsZW4pOwotCQlpZiAodmFsdWUgPj0gMCAmJiBjb3B5X3RvX2l0ZXIoYnVmLCB2YWx1ZSwgdG8pKQorCQlpZiAodmFsdWUgPj0gMCAmJiAoY29weV90b19pdGVyKGJ1ZiwgdmFsdWUsIHRvKSAhPSB2YWx1ZSkpCiAJCQl2YWx1ZSA9IC1FRkFVTFQ7CiAJfSBlbHNlIHsKIAkJc3RydWN0IGtpb2NiX3ByaXYgKnByaXYgPSBremFsbG9jKHNpemVvZiAqcHJpdiwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9mLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9mLmMKaW5kZXggNGJjN2VlYS4uMTg4Mzk3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZi5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91X2YuYwpAQCAtMTIsMTQgKzEyLDE2IEBACiAgKi8KIAogI2luY2x1ZGUgInVfZi5oIgorI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KIAotc3RydWN0IHVzYl9yZXF1ZXN0ICphbGxvY19lcF9yZXEoc3RydWN0IHVzYl9lcCAqZXAsIGludCBsZW4sIGludCBkZWZhdWx0X2xlbikKK3N0cnVjdCB1c2JfcmVxdWVzdCAqYWxsb2NfZXBfcmVxKHN0cnVjdCB1c2JfZXAgKmVwLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCB1c2JfcmVxdWVzdCAgICAgICpyZXE7CiAKIAlyZXEgPSB1c2JfZXBfYWxsb2NfcmVxdWVzdChlcCwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlcSkgewotCQlyZXEtPmxlbmd0aCA9IGxlbiA/OiBkZWZhdWx0X2xlbjsKKwkJcmVxLT5sZW5ndGggPSB1c2JfZW5kcG9pbnRfZGlyX291dChlcC0+ZGVzYykgPworCQkJdXNiX2VwX2FsaWduKGVwLCBsZW4pIDogbGVuOwogCQlyZXEtPmJ1ZiA9IGttYWxsb2MocmVxLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwogCQlpZiAoIXJlcS0+YnVmKSB7CiAJCQl1c2JfZXBfZnJlZV9yZXF1ZXN0KGVwLCByZXEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZi5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZi5oCmluZGV4IDQyNDdjYzAuLjdkNTNhNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91X2YuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9mLmgKQEAgLTQ3LDggKzQ3LDIxIEBACiBzdHJ1Y3QgdXNiX2VwOwogc3RydWN0IHVzYl9yZXF1ZXN0OwogCi0vKiBSZXF1ZXN0cyBhbGxvY2F0ZWQgdmlhIGFsbG9jX2VwX3JlcSgpIG11c3QgYmUgZnJlZWQgYnkgZnJlZV9lcF9yZXEoKS4gKi8KLXN0cnVjdCB1c2JfcmVxdWVzdCAqYWxsb2NfZXBfcmVxKHN0cnVjdCB1c2JfZXAgKmVwLCBpbnQgbGVuLCBpbnQgZGVmYXVsdF9sZW4pOworLyoqCisgKiBhbGxvY19lcF9yZXEgLSByZXR1cm5zIGEgdXNiX3JlcXVlc3QgYWxsb2NhdGVkIGJ5IHRoZSBnYWRnZXQgZHJpdmVyIGFuZAorICogYWxsb2NhdGVzIHRoZSByZXF1ZXN0J3MgYnVmZmVyLgorICoKKyAqIEBlcDogdGhlIGVuZHBvaW50IHRvIGFsbG9jYXRlIGEgdXNiX3JlcXVlc3QKKyAqIEBsZW46IHVzYl9yZXF1ZXN0cydzIGJ1ZmZlciBzdWdnZXN0ZWQgc2l6ZQorICoKKyAqIEluIGNhc2UgQGVwIGRpcmVjdGlvbiBpcyBPVVQsIHRoZSBAbGVuIHdpbGwgYmUgYWxpZ25lZCB0byBlcCdzCisgKiB3TWF4UGFja2V0U2l6ZS4gSW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGxlYWtzIG9yIGRyb3BzLCAqYWx3YXlzKiB1c2UKKyAqIHVzYl9yZXF1ZXN0cydzIGxlbmd0aCAocmVxLT5sZW5ndGgpIHRvIHJlZmVyIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIHNpemUuCisgKiBSZXF1ZXN0cyBhbGxvY2F0ZWQgdmlhIGFsbG9jX2VwX3JlcSgpICptdXN0KiBiZSBmcmVlZCBieSBmcmVlX2VwX3JlcSgpLgorICovCitzdHJ1Y3QgdXNiX3JlcXVlc3QgKmFsbG9jX2VwX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwgc2l6ZV90IGxlbik7CisKKy8qIEZyZWVzIGEgdXNiX3JlcXVlc3QgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnkgYWxsb2NfZXBfcmVxKCkgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2VwX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCiB7CiAJa2ZyZWUocmVxLT5idWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9jb3JlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2NvcmUuYwppbmRleCBmZjg2ODVlLi45NDgzNDg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2NvcmUuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2NvcmUuYwpAQCAtMTA3LDEwICsxMDcsOCBAQAogCQlnb3RvIG91dDsKIAogCXJldCA9IGVwLT5vcHMtPmVuYWJsZShlcCwgZXAtPmRlc2MpOwotCWlmIChyZXQpIHsKLQkJcmV0ID0gcmV0OworCWlmIChyZXQpCiAJCWdvdG8gb3V0OwotCX0KIAogCWVwLT5lbmFibGVkID0gdHJ1ZTsKIApAQCAtODI3LDcgKzgyNSw3IEBACiAJCXJldHVybjsKIAogCWlmIChyZXEtPm51bV9tYXBwZWRfc2dzKSB7Ci0JCWRtYV91bm1hcF9zZyhkZXYsIHJlcS0+c2csIHJlcS0+bnVtX21hcHBlZF9zZ3MsCisJCWRtYV91bm1hcF9zZyhkZXYsIHJlcS0+c2csIHJlcS0+bnVtX3NncywKIAkJCQlpc19pbiA/IERNQV9UT19ERVZJQ0UgOiBETUFfRlJPTV9ERVZJQ0UpOwogCiAJCXJlcS0+bnVtX21hcHBlZF9zZ3MgPSAwOwpAQCAtMTE0NSw3ICsxMTQzLDcgQEAKIAkJCWlmIChyZXQgIT0gLUVQUk9CRV9ERUZFUikKIAkJCQlsaXN0X2RlbCgmZHJpdmVyLT5wZW5kaW5nKTsKIAkJCWlmIChyZXQpCi0JCQkJZ290byBlcnI0OworCQkJCWdvdG8gZXJyNTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTE1NCw2ICsxMTUyLDkgQEAKIAogCXJldHVybiAwOwogCitlcnI1OgorCWRldmljZV9kZWwoJnVkYy0+ZGV2KTsKKwogZXJyNDoKIAlsaXN0X2RlbCgmdWRjLT5saXN0KTsKIAltdXRleF91bmxvY2soJnVkY19sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvZnNsX3FlX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9mc2xfcWVfdWRjLmMKaW5kZXggOTNkMjhjYi4uNGZmZjUxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9mc2xfcWVfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9mc2xfcWVfdWRjLmMKQEAgLTQyMSwxMCArNDIxLDggQEAKIAliZCA9IGVwLT5yeGJhc2U7CiAKIAllcC0+cnhmcmFtZSA9IGttYWxsb2Moc2l6ZW9mKCplcC0+cnhmcmFtZSksIEdGUF9BVE9NSUMpOwotCWlmIChlcC0+cnhmcmFtZSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZXAtPnVkYy0+ZGV2LCAibWFsbG9jIHJ4ZnJhbWUgZmFpbGVkXG4iKTsKKwlpZiAoIWVwLT5yeGZyYW1lKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlxZV9mcmFtZV9pbml0KGVwLT5yeGZyYW1lKTsKIApAQCAtNDM1LDkgKzQzMyw3IEBACiAKIAlzaXplID0gKGVwLT5lcC5tYXhwYWNrZXQgKyBVU0JfQ1JDX1NJWkUgKyAyKSAqIChiZHJpbmdfbGVuICsgMSk7CiAJZXAtPnJ4YnVmZmVyID0ga3phbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKLQlpZiAoZXAtPnJ4YnVmZmVyID09IE5VTEwpIHsKLQkJZGV2X2VycihlcC0+dWRjLT5kZXYsICJtYWxsb2MgcnhidWZmZXIgZmFpbGVkLHNpemU9JWRcbiIsCi0JCQkJc2l6ZSk7CisJaWYgKCFlcC0+cnhidWZmZXIpIHsKIAkJa2ZyZWUoZXAtPnJ4ZnJhbWUpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC02NjgsMTAgKzY2NCw4IEBACiAKIAlpZiAoKGVwLT50bSA9PSBVU0JQX1RNX0NUTCkgfHwgKGVwLT5kaXIgPT0gVVNCX0RJUl9JTikpIHsKIAkJZXAtPnR4ZnJhbWUgPSBrbWFsbG9jKHNpemVvZigqZXAtPnR4ZnJhbWUpLCBHRlBfQVRPTUlDKTsKLQkJaWYgKGVwLT50eGZyYW1lID09IE5VTEwpIHsKLQkJCWRldl9lcnIodWRjLT5kZXYsICJtYWxsb2MgdHhmcmFtZSBmYWlsZWRcbiIpOworCQlpZiAoIWVwLT50eGZyYW1lKQogCQkJZ290byBlbl9kb25lMjsKLQkJfQogCQlxZV9mcmFtZV9pbml0KGVwLT50eGZyYW1lKTsKIAl9CiAKQEAgLTE4NzgsMTEgKzE4NzIsOCBAQAogCiAJdG1wID0gaW5fYmUxNigmdWRjLT51c2JfcGFyYW0tPmZyYW1lX24pOwogCWlmICh0bXAgJiAweDgwMDApCi0JCXRtcCA9IHRtcCAmIDB4MDdmZjsKLQllbHNlCi0JCXRtcCA9IC1FSU5WQUw7Ci0KLQlyZXR1cm4gKGludCl0bXA7CisJCXJldHVybiB0bXAgJiAweDA3ZmY7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIHN0YXRpYyBpbnQgZnNsX3FlX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsCkBAIC0yMDUzLDcgKzIwNDQsNyBAQAogCQkJc3RydWN0IHFlX2VwICplcDsKIAogCQkJaWYgKHdWYWx1ZSAhPSAwIHx8IHdMZW5ndGggIT0gMAotCQkJCXx8IHBpcGUgPiBVU0JfTUFYX0VORFBPSU5UUykKKwkJCQl8fCBwaXBlID49IFVTQl9NQVhfRU5EUE9JTlRTKQogCQkJCWJyZWFrOwogCQkJZXAgPSAmdWRjLT5lcHNbcGlwZV07CiAKQEAgLTIzNDcsMTAgKzIzMzgsOCBAQAogCXUzMiBvZmZzZXQ7CiAKIAl1ZGMgPSBremFsbG9jKHNpemVvZigqdWRjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHVkYyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJm9mZGV2LT5kZXYsICJtYWxsb2MgdWRjIGZhaWxlZFxuIik7CisJaWYgKCF1ZGMpCiAJCWdvdG8gY2xlYW51cDsKLQl9CiAKIAl1ZGMtPmRldiA9ICZvZmRldi0+ZGV2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2dva3VfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2dva3VfdWRjLmMKaW5kZXggZDIyMDVkOS4uNTEwNzk4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9nb2t1X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvZ29rdV91ZGMuYwpAQCAtMTc2Nyw4ICsxNzY3LDcgQEAKIAogCS8qIGFsbG9jLCBhbmQgc3RhcnQgaW5pdCAqLwogCWRldiA9IGt6YWxsb2MgKHNpemVvZiAqZGV2LCBHRlBfS0VSTkVMKTsKLQlpZiAoZGV2ID09IE5VTEwpewotCQlwcl9kZWJ1ZygiZW5vbWVtICVzXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJaWYgKCFkZXYpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKIAkJZ290byBlcnI7CiAJfQpAQCAtMTgzOSw2ICsxODM4LDggQEAKIGVycjoKIAlpZiAoZGV2KQogCQlnb2t1X3JlbW92ZSAocGRldik7CisJLyogZ2FkZ2V0X3JlbGVhc2UgaXMgbm90IHJlZ2lzdGVyZWQgeWV0LCBrZnJlZSBleHBsaWNpdGx5ICovCisJa2ZyZWUoZGV2KTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL25ldDIyODAuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvbmV0MjI4MC5jCmluZGV4IDYxNGFiOTUxLi42MWM5MzhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL25ldDIyODAuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL25ldDIyODAuYwpAQCAtNTg5LDcgKzU4OSw3IEBACiAKIAllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBuZXQyMjgwX2VwLCBlcCk7CiAJaWYgKCFfZXAgfHwgIV9yZXEpIHsKLQkJZGV2X2VycigmZXAtPmRldi0+cGRldi0+ZGV2LCAiJXM6IEluYXZsaWQgZXA9JXAgb3IgcmVxPSVwXG4iLAorCQlkZXZfZXJyKCZlcC0+ZGV2LT5wZGV2LT5kZXYsICIlczogSW52YWxpZCBlcD0lcCBvciByZXE9JXBcbiIsCiAJCQkJCQkJX19mdW5jX18sIF9lcCwgX3JlcSk7CiAJCXJldHVybjsKIAl9CkBAIC0xMTM3LDggKzExMzcsMTAgQEAKIAlkb25lKGVwLCByZXEsIHN0YXR1cyk7CiB9CiAKLXN0YXRpYyB2b2lkIHNjYW5fZG1hX2NvbXBsZXRpb25zKHN0cnVjdCBuZXQyMjgwX2VwICplcCkKK3N0YXRpYyBpbnQgc2Nhbl9kbWFfY29tcGxldGlvbnMoc3RydWN0IG5ldDIyODBfZXAgKmVwKQogeworCWludCBudW1fY29tcGxldGVkID0gMDsKKwogCS8qIG9ubHkgbG9vayBhdCBkZXNjcmlwdG9ycyB0aGF0IHdlcmUgIm5hdHVyYWxseSIgcmV0aXJlZCwKIAkgKiBzbyBmaWZvIGFuZCBsaXN0IGhlYWQgc3RhdGUgd29uJ3QgbWF0dGVyCiAJICovCkBAIC0xMTY2LDYgKzExNjgsNyBAQAogCQkJCWJyZWFrOwogCQkJLyogc2luZ2xlIHRyYW5zZmVyIG1vZGUgKi8KIAkJCWRtYV9kb25lKGVwLCByZXEsIHRtcCwgMCk7CisJCQludW1fY29tcGxldGVkKys7CiAJCQlicmVhazsKIAkJfSBlbHNlIGlmICghZXAtPmlzX2luICYmCiAJCQkgICAocmVxLT5yZXEubGVuZ3RoICUgZXAtPmVwLm1heHBhY2tldCkgJiYKQEAgLTExOTQsNyArMTE5NywxMCBAQAogCQkJfQogCQl9CiAJCWRtYV9kb25lKGVwLCByZXEsIHRtcCwgMCk7CisJCW51bV9jb21wbGV0ZWQrKzsKIAl9CisKKwlyZXR1cm4gbnVtX2NvbXBsZXRlZDsKIH0KIAogc3RhdGljIHZvaWQgcmVzdGFydF9kbWEoc3RydWN0IG5ldDIyODBfZXAgKmVwKQpAQCAtMTU2Nyw2ICsxNTczLDQ0IEBACiAJCQlyZXR1cm4gZXA7CiAJfQogCisJLyogVVNCMzM4MDogT25seSBmaXJzdCBmb3VyIGVuZHBvaW50cyBoYXZlIERNQSBjaGFubmVscy4gQWxsb2NhdGUKKwkgKiBzbG93ZXIgaW50ZXJydXB0IGVuZHBvaW50cyBmcm9tIFBJTyBodyBlbmRwb2ludHMsIHRvIGFsbG93IGJ1bGsvaXNvYworCSAqIGVuZHBvaW50cyB1c2UgRE1BIGh3IGVuZHBvaW50cy4KKwkgKi8KKwlpZiAodXNiX2VuZHBvaW50X3R5cGUoZGVzYykgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UICYmCisJICAgIHVzYl9lbmRwb2ludF9kaXJfaW4oZGVzYykpIHsKKwkJZXAgPSBnYWRnZXRfZmluZF9lcF9ieV9uYW1lKF9nYWRnZXQsICJlcDJpbiIpOworCQlpZiAoZXAgJiYgdXNiX2dhZGdldF9lcF9tYXRjaF9kZXNjKF9nYWRnZXQsIGVwLCBkZXNjLCBlcF9jb21wKSkKKwkJCXJldHVybiBlcDsKKwkJZXAgPSBnYWRnZXRfZmluZF9lcF9ieV9uYW1lKF9nYWRnZXQsICJlcDRpbiIpOworCQlpZiAoZXAgJiYgdXNiX2dhZGdldF9lcF9tYXRjaF9kZXNjKF9nYWRnZXQsIGVwLCBkZXNjLCBlcF9jb21wKSkKKwkJCXJldHVybiBlcDsKKwl9IGVsc2UgaWYgKHVzYl9lbmRwb2ludF90eXBlKGRlc2MpID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCAmJgorCQkgICAhdXNiX2VuZHBvaW50X2Rpcl9pbihkZXNjKSkgeworCQllcCA9IGdhZGdldF9maW5kX2VwX2J5X25hbWUoX2dhZGdldCwgImVwMW91dCIpOworCQlpZiAoZXAgJiYgdXNiX2dhZGdldF9lcF9tYXRjaF9kZXNjKF9nYWRnZXQsIGVwLCBkZXNjLCBlcF9jb21wKSkKKwkJCXJldHVybiBlcDsKKwkJZXAgPSBnYWRnZXRfZmluZF9lcF9ieV9uYW1lKF9nYWRnZXQsICJlcDNvdXQiKTsKKwkJaWYgKGVwICYmIHVzYl9nYWRnZXRfZXBfbWF0Y2hfZGVzYyhfZ2FkZ2V0LCBlcCwgZGVzYywgZXBfY29tcCkpCisJCQlyZXR1cm4gZXA7CisJfSBlbHNlIGlmICh1c2JfZW5kcG9pbnRfdHlwZShkZXNjKSAhPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLICYmCisJCSAgIHVzYl9lbmRwb2ludF9kaXJfaW4oZGVzYykpIHsKKwkJZXAgPSBnYWRnZXRfZmluZF9lcF9ieV9uYW1lKF9nYWRnZXQsICJlcDFpbiIpOworCQlpZiAoZXAgJiYgdXNiX2dhZGdldF9lcF9tYXRjaF9kZXNjKF9nYWRnZXQsIGVwLCBkZXNjLCBlcF9jb21wKSkKKwkJCXJldHVybiBlcDsKKwkJZXAgPSBnYWRnZXRfZmluZF9lcF9ieV9uYW1lKF9nYWRnZXQsICJlcDNpbiIpOworCQlpZiAoZXAgJiYgdXNiX2dhZGdldF9lcF9tYXRjaF9kZXNjKF9nYWRnZXQsIGVwLCBkZXNjLCBlcF9jb21wKSkKKwkJCXJldHVybiBlcDsKKwl9IGVsc2UgaWYgKHVzYl9lbmRwb2ludF90eXBlKGRlc2MpICE9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsgJiYKKwkJICAgIXVzYl9lbmRwb2ludF9kaXJfaW4oZGVzYykpIHsKKwkJZXAgPSBnYWRnZXRfZmluZF9lcF9ieV9uYW1lKF9nYWRnZXQsICJlcDJvdXQiKTsKKwkJaWYgKGVwICYmIHVzYl9nYWRnZXRfZXBfbWF0Y2hfZGVzYyhfZ2FkZ2V0LCBlcCwgZGVzYywgZXBfY29tcCkpCisJCQlyZXR1cm4gZXA7CisJCWVwID0gZ2FkZ2V0X2ZpbmRfZXBfYnlfbmFtZShfZ2FkZ2V0LCAiZXA0b3V0Iik7CisJCWlmIChlcCAmJiB1c2JfZ2FkZ2V0X2VwX21hdGNoX2Rlc2MoX2dhZGdldCwgZXAsIGRlc2MsIGVwX2NvbXApKQorCQkJcmV0dXJuIGVwOworCX0KKwogCS8qIFVTQjMzODA6IHVzZSBzYW1lIGFkZHJlc3MgZm9yIHVzYiBhbmQgaGFyZHdhcmUgZW5kcG9pbnRzICovCiAJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiZXAlZCVzIiwgdXNiX2VuZHBvaW50X251bShkZXNjKSwKIAkJCXVzYl9lbmRwb2ludF9kaXJfaW4oZGVzYykgPyAiaW4iIDogIm91dCIpOwpAQCAtMjU0Nyw4ICsyNTkxLDExIEBACiAJLyogbWFudWFsIERNQSBxdWV1ZSBhZHZhbmNlIGFmdGVyIHNob3J0IE9VVCAqLwogCWlmIChsaWtlbHkoZXAtPmRtYSkpIHsKIAkJaWYgKHQgJiBCSVQoU0hPUlRfUEFDS0VUX1RSQU5TRkVSUkVEX0lOVEVSUlVQVCkpIHsKLQkJCXUzMgljb3VudDsKKwkJCXN0cnVjdCBuZXQyMjgwX3JlcXVlc3QgKnN0dWNrX3JlcSA9IE5VTEw7CiAJCQlpbnQJc3RvcHBlZCA9IGVwLT5zdG9wcGVkOworCQkJaW50CW51bV9jb21wbGV0ZWQ7CisJCQlpbnQJc3R1Y2sgPSAwOworCQkJdTMyCWNvdW50OwogCiAJCQkvKiBUUkFOU0ZFUlJFRCB3b3JrcyBhcm91bmQgT1VUX0RPTkUgZXJyYXR1bSAwMTEyLgogCQkJICogd2UgZXhwZWN0IChOIDw9IG1heHBhY2tldCkgYnl0ZXM7IGhvc3Qgd3JvdGUgTS4KQEAgLTI1NjAsNyArMjYwNyw3IEBACiAJCQkJLyogYW55IHByZWNlZGluZyBkbWEgdHJhbnNmZXJzIG11c3QgZmluaXNoLgogCQkJCSAqIGRtYSBoYW5kbGVzIChNID49IE4pLCBtYXkgZW1wdHkgdGhlIHF1ZXVlCiAJCQkJICovCi0JCQkJc2Nhbl9kbWFfY29tcGxldGlvbnMoZXApOworCQkJCW51bV9jb21wbGV0ZWQgPSBzY2FuX2RtYV9jb21wbGV0aW9ucyhlcCk7CiAJCQkJaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkgfHwKIAkJCQkJCWVwLT5vdXRfb3ZlcmZsb3cpKSB7CiAJCQkJCXJlcSA9IE5VTEw7CkBAIC0yNTgwLDYgKzI2MjcsMzEgQEAKIAkJCQkJCXJlcSA9IE5VTEw7CiAJCQkJCWJyZWFrOwogCQkJCX0KKworCQkJCS8qIEVzY2FwZSBsb29wIGlmIG5vIGRtYSB0cmFuc2ZlcnMgY29tcGxldGVkCisJCQkJICogYWZ0ZXIgZmV3IHJldHJpZXMuCisJCQkJICovCisJCQkJaWYgKG51bV9jb21wbGV0ZWQgPT0gMCkgeworCQkJCQlpZiAoc3R1Y2tfcmVxID09IHJlcSAmJgorCQkJCQkgICAgcmVhZGwoJmVwLT5kbWEtPmRtYWRlc2MpICE9CisJCQkJCQkgIHJlcS0+dGRfZG1hICYmIHN0dWNrKysgPiA1KSB7CisJCQkJCQljb3VudCA9IHJlYWRsKAorCQkJCQkJCSZlcC0+ZG1hLT5kbWFjb3VudCk7CisJCQkJCQljb3VudCAmPSBETUFfQllURV9DT1VOVF9NQVNLOworCQkJCQkJcmVxID0gTlVMTDsKKwkJCQkJCWVwX2RiZyhlcC0+ZGV2LCAiJXMgZXNjYXBlIHN0dWNrICVkLCBjb3VudCAldVxuIiwKKwkJCQkJCQllcC0+ZXAubmFtZSwgc3R1Y2ssCisJCQkJCQkJY291bnQpOworCQkJCQkJYnJlYWs7CisJCQkJCX0gZWxzZSBpZiAoc3R1Y2tfcmVxICE9IHJlcSkgeworCQkJCQkJc3R1Y2tfcmVxID0gcmVxOworCQkJCQkJc3R1Y2sgPSAwOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJc3R1Y2tfcmVxID0gTlVMTDsKKwkJCQkJc3R1Y2sgPSAwOworCQkJCX0KKwogCQkJCXVkZWxheSgxKTsKIAkJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9vbWFwX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9vbWFwX3VkYy5jCmluZGV4IDliN2QzOTQuLmE4NzA5ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvb21hcF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL29tYXBfdWRjLmMKQEAgLTI4NzUsNyArMjg3NSw3IEBACiAJeGNlaXYgPSBOVUxMOwogCS8qICJ1ZGMiIGlzIG5vdyB2YWxpZCAqLwogCXB1bGx1cF9kaXNhYmxlKHVkYyk7Ci0jaWYJZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQorI2lmCUlTX0VOQUJMRUQoQ09ORklHX1VTQl9PSENJX0hDRCkKIAl1ZGMtPmdhZGdldC5pc19vdGcgPSAoY29uZmlnLT5vdGcgIT0gMCk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9weGEyN3hfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3B4YTI3eF91ZGMuYwppbmRleCBhZDE0MGFhLi43ZmE2MGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3B4YTI3eF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3B4YTI3eF91ZGMuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL3BoeS5oPgogCiAjaW5jbHVkZSAicHhhMjd4X3VkYy5oIgogCkBAIC0xNjU1LDYgKzE2NTYsMzcgQEAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKKy8qKgorICogcHhhX3VkY19waHlfZXZlbnQgLSBDYWxsZWQgYnkgcGh5IHVwb24gVkJ1cyBldmVudAorICogQG5iOiBub3RpZmllciBibG9jaworICogQGFjdGlvbjogcGh5IGFjdGlvbiwgaXMgdmJ1cyBjb25uZWN0IG9yIGRpc2Nvbm5lY3QKKyAqIEBkYXRhOiB0aGUgdXNiX2dhZGdldCBzdHJ1Y3R1cmUgaW4gcHhhX3VkYworICoKKyAqIENhbGxlZCBieSB0aGUgVVNCIFBoeSB3aGVuIGEgY2FibGUgY29ubmVjdCBvciBkaXNjb25uZWN0IGlzIHNlbnNlZC4KKyAqCisgKiBSZXR1cm5zIDAKKyAqLworc3RhdGljIGludCBweGFfdWRjX3BoeV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKKwkJCSAgICAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0ID0gZGF0YTsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBVU0JfRVZFTlRfVkJVUzoKKwkJdXNiX2dhZGdldF92YnVzX2Nvbm5lY3QoZ2FkZ2V0KTsKKwkJcmV0dXJuIE5PVElGWV9PSzsKKwljYXNlIFVTQl9FVkVOVF9OT05FOgorCQl1c2JfZ2FkZ2V0X3ZidXNfZGlzY29ubmVjdChnYWRnZXQpOworCQlyZXR1cm4gTk9USUZZX09LOworCWRlZmF1bHQ6CisJCXJldHVybiBOT1RJRllfRE9ORTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcHhhMjd4X3VkY19waHkgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBweGFfdWRjX3BoeV9ldmVudCwKK307CisKIHN0YXRpYyBpbnQgcHhhMjd4X3VkY19zdGFydChzdHJ1Y3QgdXNiX2dhZGdldCAqZywKIAkJc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpOwogc3RhdGljIGludCBweGEyN3hfdWRjX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXQgKmcpOwpAQCAtMjQzMiw3ICsyNDY0LDE0IEBACiAJCXJldHVybiB1ZGMtPmlycTsKIAogCXVkYy0+ZGV2ID0gJnBkZXYtPmRldjsKLQl1ZGMtPnRyYW5zY2VpdmVyID0gdXNiX2dldF9waHkoVVNCX1BIWV9UWVBFX1VTQjIpOworCWlmIChvZl9oYXZlX3BvcHVsYXRlZF9kdCgpKSB7CisJCXVkYy0+dHJhbnNjZWl2ZXIgPQorCQkJZGV2bV91c2JfZ2V0X3BoeV9ieV9waGFuZGxlKHVkYy0+ZGV2LCAicGh5cyIsIDApOworCQlpZiAoSVNfRVJSKHVkYy0+dHJhbnNjZWl2ZXIpKQorCQkJcmV0dXJuIFBUUl9FUlIodWRjLT50cmFuc2NlaXZlcik7CisJfSBlbHNlIHsKKwkJdWRjLT50cmFuc2NlaXZlciA9IHVzYl9nZXRfcGh5KFVTQl9QSFlfVFlQRV9VU0IyKTsKKwl9CiAKIAlpZiAoSVNfRVJSKHVkYy0+Z3Bpb2QpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkbid0IGZpbmQgb3IgcmVxdWVzdCBEKyBncGlvIDogJWxkXG4iLApAQCAtMjQ2NSwxNCArMjUwNCwyMCBAQAogCQlnb3RvIGVycjsKIAl9CiAKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHVkYy0+dHJhbnNjZWl2ZXIpKQorCQl1c2JfcmVnaXN0ZXJfbm90aWZpZXIodWRjLT50cmFuc2NlaXZlciwgJnB4YTI3eF91ZGNfcGh5KTsKIAlyZXR2YWwgPSB1c2JfYWRkX2dhZGdldF91ZGMoJnBkZXYtPmRldiwgJnVkYy0+Z2FkZ2V0KTsKIAlpZiAocmV0dmFsKQotCQlnb3RvIGVycjsKKwkJZ290byBlcnJfYWRkX2dhZGdldDsKIAogCXB4YV9pbml0X2RlYnVnZnModWRjKTsKIAlpZiAoc2hvdWxkX2VuYWJsZV91ZGModWRjKSkKIAkJdWRjX2VuYWJsZSh1ZGMpOwogCXJldHVybiAwOworCitlcnJfYWRkX2dhZGdldDoKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHVkYy0+dHJhbnNjZWl2ZXIpKQorCQl1c2JfdW5yZWdpc3Rlcl9ub3RpZmllcih1ZGMtPnRyYW5zY2VpdmVyLCAmcHhhMjd4X3VkY19waHkpOwogZXJyOgogCWNsa191bnByZXBhcmUodWRjLT5jbGspOwogCXJldHVybiByZXR2YWw7CkBAIC0yNDg5LDYgKzI1MzQsOCBAQAogCXVzYl9kZWxfZ2FkZ2V0X3VkYygmdWRjLT5nYWRnZXQpOwogCXB4YV9jbGVhbnVwX2RlYnVnZnModWRjKTsKIAorCWlmICghSVNfRVJSX09SX05VTEwodWRjLT50cmFuc2NlaXZlcikpCisJCXVzYl91bnJlZ2lzdGVyX25vdGlmaWVyKHVkYy0+dHJhbnNjZWl2ZXIsICZweGEyN3hfdWRjX3BoeSk7CiAJdXNiX3B1dF9waHkodWRjLT50cmFuc2NlaXZlcik7CiAKIAl1ZGMtPnRyYW5zY2VpdmVyID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvcmVuZXNhc191c2IzLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3JlbmVzYXNfdXNiMy5jCmluZGV4IDkzYTNiZWMuLmZiOGZjMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvcmVuZXNhc191c2IzLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9yZW5lc2FzX3VzYjMuYwpAQCAtMTA2LDYgKzEwNiw3IEBACiAKIC8qIERSRF9DT04gKi8KICNkZWZpbmUgRFJEX0NPTl9QRVJJX0NPTglCSVQoMjQpCisjZGVmaW5lIERSRF9DT05fVkJPVVQJCUJJVCgwKQogCiAvKiBVU0JfSU5UX0VOQV8xIGFuZCBVU0JfSU5UX1NUQV8xICovCiAjZGVmaW5lIFVTQl9JTlRfMV9CM19QTExXS1VQCUJJVCgzMSkKQEAgLTM2Myw2ICszNjQsNyBAQAogewogCS8qIEZJWE1FOiBIb3cgdG8gY2hhbmdlIGhvc3QgLyBwZXJpcGhlcmFsIG1vZGUgYXMgd2VsbD8gKi8KIAl1c2IzX3NldF9iaXQodXNiMywgRFJEX0NPTl9QRVJJX0NPTiwgVVNCM19EUkRfQ09OKTsKKwl1c2IzX2NsZWFyX2JpdCh1c2IzLCBEUkRfQ09OX1ZCT1VULCBVU0IzX0RSRF9DT04pOwogCiAJdXNiM193cml0ZSh1c2IzLCB+MCwgVVNCM19VU0JfSU5UX1NUQV8xKTsKIAl1c2IzX2VuYWJsZV9pcnFfMSh1c2IzLCBVU0JfSU5UXzFfVkJVU19DTkcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy91ZGMteGlsaW54LmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3VkYy14aWxpbnguYwppbmRleCBmOGJmMjkwLi41ODhlMjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3VkYy14aWxpbnguYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3VkYy14aWxpbnguYwpAQCAtOTczLDEwICs5NzMsOCBAQAogCiAJdWRjID0gZXAtPnVkYzsKIAlyZXEgPSBremFsbG9jKHNpemVvZigqcmVxKSwgZ2ZwX2ZsYWdzKTsKLQlpZiAoIXJlcSkgewotCQlkZXZfZXJyKHVkYy0+ZGV2LCAiJXM6bm90IGVub3VnaCBtZW1vcnkiLCBfX2Z1bmNfXyk7CisJaWYgKCFyZXEpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXJlcS0+ZXAgPSBlcDsKIAlJTklUX0xJU1RfSEVBRCgmcmVxLT5xdWV1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKaW5kZXggMmU3MTBhNC4uMGI4MGNlZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKQEAgLTQ3Miw3ICs0NzIsNyBAQAogCiBjb25maWcgVVNCX09IQ0lfSENEX09NQVAzCiAJdHJpc3RhdGUgIk9IQ0kgc3VwcG9ydCBmb3IgT01BUDMgYW5kIGxhdGVyIGNoaXBzIgotCWRlcGVuZHMgb24gKEFSQ0hfT01BUDMgfHwgQVJDSF9PTUFQNCkKKwlkZXBlbmRzIG9uIChBUkNIX09NQVAzIHx8IEFSQ0hfT01BUDQgfHwgU09DX09NQVA1KQogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIG9uLWNoaXAgT0hDSSBjb250cm9sbGVyIG9uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2JjbWEtaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2JjbWEtaGNkLmMKaW5kZXggMTcyZWYxNy4uNWY0MjVjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9iY21hLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvYmNtYS1oY2QuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9laGNpX3Bkcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC91c2Ivb2hjaV9wZHJpdmVyLmg+CiAKQEAgLTM0LDYgKzM1LDkgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiQ29tbW9uIFVTQiBkcml2ZXIgZm9yIEJDTUEgQnVzIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKKy8qIFNlZSBCQ01BX0NMS0NUTFNUX0VYVFJFU1JFUSBhbmQgQkNNQV9DTEtDVExTVF9FWFRSRVNTVCAqLworI2RlZmluZSBVU0JfQkNNQV9DTEtDVExTVF9VU0JfQ0xLX1JFUQkJCTB4MDAwMDAxMDAKKwogc3RydWN0IGJjbWFfaGNkX2RldmljZSB7CiAJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmVoY2lfZGV2OwpAQCAtMTY1LDQ0ICsxNjksODAgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGJjbWFfaGNkX2luaXRfY2hpcF9hcm1fcGh5KHN0cnVjdCBiY21hX2RldmljZSAqZGV2KQorLyoqCisgKiBiY21hX2hjZF91c2IyMF9vbGRfYXJtX2luaXQgLSBJbml0aWFsaXplIG9sZCBVU0IgMi4wIGNvbnRyb2xsZXIgb24gQVJNCisgKgorICogT2xkIFVTQiAyLjAgY29yZSBpcyBpZGVudGlmaWVkIGFzIEJDTUFfQ09SRV9VU0IyMF9IT1NUIGFuZCB3YXMgaW50cm9kdWNlZAorICogbG9uZyBiZWZvcmUgTm9ydGhzdGFyIGRldmljZXMuIEl0IHNlZW1zIHNvbWUgY2hlYXBlciBjaGlwc2V0cyBsaWtlIEJDTTUzNTczCisgKiBzdGlsbCB1c2UgaXQuCisgKiBJbml0aWFsaXphdGlvbiBvZiB0aGlzIG9sZCBjb3JlIGRpZmZlcnMgYmV0d2VlbiBNSVBTIGFuZCBBUk0uCisgKi8KK3N0YXRpYyBpbnQgYmNtYV9oY2RfdXNiMjBfb2xkX2FybV9pbml0KHN0cnVjdCBiY21hX2hjZF9kZXZpY2UgKnVzYl9kZXYpCiB7Ci0Jc3RydWN0IGJjbWFfZGV2aWNlICphcm1fY29yZTsKLQl2b2lkIF9faW9tZW0gKmRtdTsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUgPSB1c2JfZGV2LT5jb3JlOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjb3JlLT5kZXY7CisJc3RydWN0IGJjbWFfZGV2aWNlICpwbXVfY29yZTsKIAotCWFybV9jb3JlID0gYmNtYV9maW5kX2NvcmUoZGV2LT5idXMsIEJDTUFfQ09SRV9BUk1DQTkpOwotCWlmICghYXJtX2NvcmUpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJjYW4gbm90IGZpbmQgQVJNIENvcnRleCBBOSBpaG9zdCBjb3JlXG4iKTsKLQkJcmV0dXJuOworCXVzbGVlcF9yYW5nZSgxMDAwMCwgMjAwMDApOworCWlmIChjb3JlLT5pZC5yZXYgPCA1KQorCQlyZXR1cm4gMDsKKworCXBtdV9jb3JlID0gYmNtYV9maW5kX2NvcmUoY29yZS0+YnVzLCBCQ01BX0NPUkVfUE1VKTsKKwlpZiAoIXBtdV9jb3JlKSB7CisJCWRldl9lcnIoZGV2LCAiQ291bGQgbm90IGZpbmQgUE1VIGNvcmVcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlkbXUgPSBpb3JlbWFwX25vY2FjaGUoYXJtX2NvcmUtPmFkZHJfc1swXSwgMHgxMDAwKTsKLQlpZiAoIWRtdSkgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgImNhbiBub3QgbWFwIEFSTSBDb3J0ZXggQTkgaWhvc3QgY29yZVxuIik7Ci0JCXJldHVybjsKLQl9CisJLyogVGFrZSBVU0IgY29yZSBvdXQgb2YgcmVzZXQgKi8KKwliY21hX2F3cml0ZTMyKGNvcmUsIEJDTUFfSU9DVEwsIEJDTUFfSU9DVExfQ0xLIHwgQkNNQV9JT0NUTF9GR0MpOworCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7CisJYmNtYV9hd3JpdGUzMihjb3JlLCBCQ01BX1JFU0VUX0NUTCwgQkNNQV9SRVNFVF9DVExfUkVTRVQpOworCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7CisJYmNtYV9hd3JpdGUzMihjb3JlLCBCQ01BX1JFU0VUX0NUTCwgMCk7CisJdXNsZWVwX3JhbmdlKDEwMCwgMjAwKTsKKwliY21hX2F3cml0ZTMyKGNvcmUsIEJDTUFfSU9DVEwsIEJDTUFfSU9DVExfQ0xLKTsKKwl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOwogCi0JLyogVW5sb2NrIERNVSBQTEwgc2V0dGluZ3MgKi8KLQlpb3dyaXRlMzIoMHgwMDAwZWE2OCwgZG11ICsgMHgxODApOworCS8qIEVuYWJsZSBNaXNjIFBMTCAqLworCWJjbWFfd3JpdGUzMihjb3JlLCBCQ01BX0NMS0NUTFNULCBCQ01BX0NMS0NUTFNUX0ZPUkNFSFQgfAorCQkJCQkgIEJDTUFfQ0xLQ1RMU1RfSFFDTEtSRVEgfAorCQkJCQkgIFVTQl9CQ01BX0NMS0NUTFNUX1VTQl9DTEtfUkVRKTsKKwl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOwogCi0JLyogV3JpdGUgVVNCIDIuMCBQTEwgY29udHJvbCBzZXR0aW5nICovCi0JaW93cml0ZTMyKDB4MDBkZDEwYzMsIGRtdSArIDB4MTY0KTsKKwliY21hX3dyaXRlMzIoY29yZSwgMHg1MTAsIDB4YzdmODUwMDApOworCWJjbWFfd3JpdGUzMihjb3JlLCAweDUxMCwgMHhjN2Y4NTAwMyk7CisJdXNsZWVwX3JhbmdlKDMwMCwgNjAwKTsKIAotCS8qIExvY2sgRE1VIFBMTCBzZXR0aW5ncyAqLwotCWlvd3JpdGUzMigweDAwMDAwMDAwLCBkbXUgKyAweDE4MCk7CisJLyogUHJvZ3JhbSBVU0IgUEhZIFBMTCBwYXJhbWV0ZXJzICovCisJYmNtYV93cml0ZTMyKHBtdV9jb3JlLCBCQ01BX0NDX1BNVV9QTExDVExfQUREUiwgMHg2KTsKKwliY21hX3dyaXRlMzIocG11X2NvcmUsIEJDTUFfQ0NfUE1VX1BMTENUTF9EQVRBLCAweDAwNTM2MGMxKTsKKwl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOworCWJjbWFfd3JpdGUzMihwbXVfY29yZSwgQkNNQV9DQ19QTVVfUExMQ1RMX0FERFIsIDB4Nyk7CisJYmNtYV93cml0ZTMyKHBtdV9jb3JlLCBCQ01BX0NDX1BNVV9QTExDVExfREFUQSwgMHgwKTsKKwl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOworCWJjbWFfc2V0MzIocG11X2NvcmUsIEJDTUFfQ0NfUE1VX0NUTCwgQkNNQV9DQ19QTVVfQ1RMX1BMTF9VUEQpOworCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7CiAKLQlpb3VubWFwKGRtdSk7CisJYmNtYV93cml0ZTMyKGNvcmUsIDB4NTEwLCAweDdmOGQwMDcpOworCXVkZWxheSgxMDAwKTsKKworCS8qIFRha2UgY29udHJvbGxlciBvdXQgb2YgcmVzZXQgKi8KKwliY21hX3dyaXRlMzIoY29yZSwgMHgyMDAsIDB4NGZmKTsKKwl1c2xlZXBfcmFuZ2UoMjUsIDUwKTsKKwliY21hX3dyaXRlMzIoY29yZSwgMHgyMDAsIDB4NmZmKTsKKwl1c2xlZXBfcmFuZ2UoMjUsIDUwKTsKKwliY21hX3dyaXRlMzIoY29yZSwgMHgyMDAsIDB4N2ZmKTsKKwl1c2xlZXBfcmFuZ2UoMjUsIDUwKTsKKworCW9mX3BsYXRmb3JtX2RlZmF1bHRfcG9wdWxhdGUoZGV2LT5vZl9ub2RlLCBOVUxMLCBkZXYpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGJjbWFfaGNkX2luaXRfY2hpcF9hcm1faGMoc3RydWN0IGJjbWFfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBiY21hX2hjZF91c2IyMF9uc19pbml0X2hjKHN0cnVjdCBiY21hX2RldmljZSAqZGV2KQogewogCXUzMiB2YWw7CiAKLQkvKgotCSAqIERlbGF5IGFmdGVyIFBIWSBpbml0aWFsaXplZCB0byBlbnN1cmUgSEMgaXMgcmVhZHkgdG8gYmUgY29uZmlndXJlZAotCSAqLwotCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKLQogCS8qIFNldCBwYWNrZXQgYnVmZmVyIE9VVCB0aHJlc2hvbGQgKi8KIAl2YWwgPSBiY21hX3JlYWQzMihkZXYsIDB4OTQpOwogCXZhbCAmPSAweGZmZmY7CkBAIC0yMTMsMjAgKzI1MywzMyBAQAogCXZhbCA9IGJjbWFfcmVhZDMyKGRldiwgMHg5Yyk7CiAJdmFsIHw9IDE7CiAJYmNtYV93cml0ZTMyKGRldiwgMHg5YywgdmFsKTsKKworCS8qCisJICogQnJvYWRjb20gaW5pdGlhbGl6ZXMgUEhZIGFuZCB0aGVuIHdhaXRzIHRvIGVuc3VyZSBIQyBpcyByZWFkeSB0byBiZQorCSAqIGNvbmZpZ3VyZWQuIEluIG91ciBjYXNlIHRoZSBvcmRlciBpcyByZXZlcnNlZC4gV2UganVzdCBpbml0aWFsaXplZAorCSAqIGNvbnRyb2xsZXIgYW5kIHdlIGxldCBIQ0QgaW5pdGlhbGl6ZSBQSFksIHNvIGxldCdzIHdhaXQgKHNsZWVwKSBub3cuCisJICovCisJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwogfQogCi1zdGF0aWMgdm9pZCBiY21hX2hjZF9pbml0X2NoaXBfYXJtKHN0cnVjdCBiY21hX2RldmljZSAqZGV2KQorLyoqCisgKiBiY21hX2hjZF91c2IyMF9uc19pbml0IC0gSW5pdGlhbGl6ZSBOb3J0aHN0YXIgVVNCIDIuMCBjb250cm9sbGVyCisgKi8KK3N0YXRpYyBpbnQgYmNtYV9oY2RfdXNiMjBfbnNfaW5pdChzdHJ1Y3QgYmNtYV9oY2RfZGV2aWNlICpiY21hX2hjZCkKIHsKLQliY21hX2NvcmVfZW5hYmxlKGRldiwgMCk7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gYmNtYV9oY2QtPmNvcmU7CisJc3RydWN0IGJjbWFfY2hpcGluZm8gKmNpID0gJmNvcmUtPmJ1cy0+Y2hpcGluZm87CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNvcmUtPmRldjsKIAotCWlmIChkZXYtPmJ1cy0+Y2hpcGluZm8uaWQgPT0gQkNNQV9DSElQX0lEX0JDTTQ3MDcgfHwKLQkgICAgZGV2LT5idXMtPmNoaXBpbmZvLmlkID09IEJDTUFfQ0hJUF9JRF9CQ001MzAxOCkgewotCQlpZiAoZGV2LT5idXMtPmNoaXBpbmZvLnBrZyA9PSBCQ01BX1BLR19JRF9CQ000NzA3IHx8Ci0JCSAgICBkZXYtPmJ1cy0+Y2hpcGluZm8ucGtnID09IEJDTUFfUEtHX0lEX0JDTTQ3MDgpCi0JCQliY21hX2hjZF9pbml0X2NoaXBfYXJtX3BoeShkZXYpOworCWJjbWFfY29yZV9lbmFibGUoY29yZSwgMCk7CiAKLQkJYmNtYV9oY2RfaW5pdF9jaGlwX2FybV9oYyhkZXYpOwotCX0KKwlpZiAoY2ktPmlkID09IEJDTUFfQ0hJUF9JRF9CQ000NzA3IHx8CisJICAgIGNpLT5pZCA9PSBCQ01BX0NISVBfSURfQkNNNTMwMTgpCisJCWJjbWFfaGNkX3VzYjIwX25zX2luaXRfaGMoY29yZSk7CisKKwlvZl9wbGF0Zm9ybV9kZWZhdWx0X3BvcHVsYXRlKGRldi0+b2Zfbm9kZSwgTlVMTCwgZGV2KTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBiY21hX2hjaV9wbGF0Zm9ybV9wb3dlcl9ncGlvKHN0cnVjdCBiY21hX2RldmljZSAqZGV2LCBib29sIHZhbCkKQEAgLTI5OSwxNiArMzUyLDcgQEAKIAlpZiAoZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVudChkZXYtPmRtYV9kZXYsIERNQV9CSVRfTUFTSygzMikpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlzd2l0Y2ggKGRldi0+aWQuaWQpIHsKLQljYXNlIEJDTUFfQ09SRV9OU19VU0IyMDoKLQkJYmNtYV9oY2RfaW5pdF9jaGlwX2FybShkZXYpOwotCQlicmVhazsKLQljYXNlIEJDTUFfQ09SRV9VU0IyMF9IT1NUOgotCQliY21hX2hjZF9pbml0X2NoaXBfbWlwcyhkZXYpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CisJYmNtYV9oY2RfaW5pdF9jaGlwX21pcHMoZGV2KTsKIAogCS8qIEluIEFJIGNoaXBzIEVIQ0kgaXMgYWRkcnNwYWNlIDAsIE9IQ0kgaXMgMSAqLwogCW9oY2lfYWRkciA9IGRldi0+YWRkcl9zWzBdOwpAQCAtMzM4LDYgKzM4MiwxOCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgYmNtYV9oY2RfdXNiMzBfaW5pdChzdHJ1Y3QgYmNtYV9oY2RfZGV2aWNlICpiY21hX2hjZCkKK3sKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUgPSBiY21hX2hjZC0+Y29yZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY29yZS0+ZGV2OworCisJYmNtYV9jb3JlX2VuYWJsZShjb3JlLCAwKTsKKworCW9mX3BsYXRmb3JtX2RlZmF1bHRfcG9wdWxhdGUoZGV2LT5vZl9ub2RlLCBOVUxMLCBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYmNtYV9oY2RfcHJvYmUoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlKQogewogCWludCBlcnI7CkBAIC0zNTcsMTQgKzQxMywyNCBAQAogCiAJc3dpdGNoIChjb3JlLT5pZC5pZCkgewogCWNhc2UgQkNNQV9DT1JFX1VTQjIwX0hPU1Q6CisJCWlmIChJU19FTkFCTEVEKENPTkZJR19BUk0pKQorCQkJZXJyID0gYmNtYV9oY2RfdXNiMjBfb2xkX2FybV9pbml0KHVzYl9kZXYpOworCQllbHNlIGlmIChJU19FTkFCTEVEKENPTkZJR19NSVBTKSkKKwkJCWVyciA9IGJjbWFfaGNkX3VzYjIwX2luaXQodXNiX2Rldik7CisJCWVsc2UKKwkJCWVyciA9IC1FTk9UU1VQUDsKKwkJYnJlYWs7CiAJY2FzZSBCQ01BX0NPUkVfTlNfVVNCMjA6Ci0JCWVyciA9IGJjbWFfaGNkX3VzYjIwX2luaXQodXNiX2Rldik7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOworCQllcnIgPSBiY21hX2hjZF91c2IyMF9uc19pbml0KHVzYl9kZXYpOworCQlicmVhazsKKwljYXNlIEJDTUFfQ09SRV9OU19VU0IzMDoKKwkJZXJyID0gYmNtYV9oY2RfdXNiMzBfaW5pdCh1c2JfZGV2KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAliY21hX3NldF9kcnZkYXRhKGNvcmUsIHVzYl9kZXYpOwogCXJldHVybiAwOwpAQCAtNDE2LDYgKzQ4Miw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGJjbWFfZGV2aWNlX2lkIGJjbWFfaGNkX3RhYmxlW10gPSB7CiAJQkNNQV9DT1JFKEJDTUFfTUFOVUZfQkNNLCBCQ01BX0NPUkVfVVNCMjBfSE9TVCwgQkNNQV9BTllfUkVWLCBCQ01BX0FOWV9DTEFTUyksCiAJQkNNQV9DT1JFKEJDTUFfTUFOVUZfQkNNLCBCQ01BX0NPUkVfTlNfVVNCMjAsIEJDTUFfQU5ZX1JFViwgQkNNQV9BTllfQ0xBU1MpLAorCUJDTUFfQ09SRShCQ01BX01BTlVGX0JDTSwgQkNNQV9DT1JFX05TX1VTQjMwLCBCQ01BX0FOWV9SRVYsIEJDTUFfQU5ZX0NMQVNTKSwKIAl7fSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGJjbWEsIGJjbWFfaGNkX3RhYmxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwppbmRleCBhOTYyYjg5Li4xZTVmNTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCkBAIC0zMzIsMTEgKzMzMiwxMSBAQAogCWludAlwb3J0ID0gSENTX05fUE9SVFMoZWhjaS0+aGNzX3BhcmFtcyk7CiAKIAl3aGlsZSAocG9ydC0tKSB7Ci0JCWVoY2lfd3JpdGVsKGVoY2ksIFBPUlRfUldDX0JJVFMsCi0JCQkJJmVoY2ktPnJlZ3MtPnBvcnRfc3RhdHVzW3BvcnRdKTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZlaGNpLT5sb2NrKTsKIAkJZWhjaV9wb3J0X3Bvd2VyKGVoY2ksIHBvcnQsIGZhbHNlKTsKIAkJc3Bpbl9sb2NrX2lycSgmZWhjaS0+bG9jayk7CisJCWVoY2lfd3JpdGVsKGVoY2ksIFBPUlRfUldDX0JJVFMsCisJCQkJJmVoY2ktPnJlZ3MtPnBvcnRfc3RhdHVzW3BvcnRdKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wbGF0Zm9ybS5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBsYXRmb3JtLmMKaW5kZXggNjgxNmI4Yy4uODc2ZGNhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBsYXRmb3JtLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBsYXRmb3JtLmMKQEAgLTM4LDcgKzM4LDcgQEAKICNpbmNsdWRlICJlaGNpLmgiCiAKICNkZWZpbmUgRFJJVkVSX0RFU0MgIkVIQ0kgZ2VuZXJpYyBwbGF0Zm9ybSBkcml2ZXIiCi0jZGVmaW5lIEVIQ0lfTUFYX0NMS1MgMworI2RlZmluZSBFSENJX01BWF9DTEtTIDQKICNkZWZpbmUgRUhDSV9NQVhfUlNUUyAzCiAjZGVmaW5lIGhjZF90b19laGNpX3ByaXYoaCkgKChzdHJ1Y3QgZWhjaV9wbGF0Zm9ybV9wcml2ICopaGNkX3RvX2VoY2koaCktPnByaXYpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZmhjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZmhjaS1oY2QuYwppbmRleCAwOTYwZjQxLi41NWEwYWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2ZoY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9maGNpLWhjZC5jCkBAIC0zMTAsMTAgKzMxMCw4IEBACiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIFNDQyBkYXRhIHN0cnVjdHVyZSAqLwogCXVzYiA9IGt6YWxsb2Moc2l6ZW9mKCp1c2IpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXVzYikgewotCQlmaGNpX2VycihmaGNpLCAibm8gbWVtb3J5IGZvciBTQ0MgZGF0YSBzdHJ1Y3RcbiIpOworCWlmICghdXNiKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAl1c2ItPmZoY2kgPSBmaGNpOwogCXVzYi0+aGNfbGlzdCA9IGZoY2ktPmhjX2xpc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2ZzbC1tcGgtZHItb2YuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZnNsLW1waC1kci1vZi5jCmluZGV4IDEwNDRiMGYuLmYwN2NjYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZnNsLW1waC1kci1vZi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZnNsLW1waC1kci1vZi5jCkBAIC0yMjIsMjMgKzIyMiwxNyBAQAogCXBkYXRhLT5jb250cm9sbGVyX3ZlciA9IHVzYl9nZXRfdmVyX2luZm8obnApOwogCiAJLyogQWN0aXZhdGUgRXJyYXR1bSBieSByZWFkaW5nIHByb3BlcnR5IGluIGRldmljZSB0cmVlICovCi0JaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImZzbCx1c2ItZXJyYXR1bS1hMDA3NzkyIiwgTlVMTCkpCi0JCXBkYXRhLT5oYXNfZnNsX2VycmF0dW1fYTAwNzc5MiA9IDE7Ci0JZWxzZQotCQlwZGF0YS0+aGFzX2ZzbF9lcnJhdHVtX2EwMDc3OTIgPSAwOwotCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsdXNiLWVycmF0dW0tYTAwNTI3NSIsIE5VTEwpKQotCQlwZGF0YS0+aGFzX2ZzbF9lcnJhdHVtX2EwMDUyNzUgPSAxOwotCWVsc2UKLQkJcGRhdGEtPmhhc19mc2xfZXJyYXR1bV9hMDA1Mjc1ID0gMDsKKwlwZGF0YS0+aGFzX2ZzbF9lcnJhdHVtX2EwMDc3OTIgPQorCQlvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJmc2wsdXNiLWVycmF0dW0tYTAwNzc5MiIpOworCXBkYXRhLT5oYXNfZnNsX2VycmF0dW1fYTAwNTI3NSA9CisJCW9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImZzbCx1c2ItZXJyYXR1bS1hMDA1Mjc1Iik7CiAKIAkvKgogCSAqIERldGVybWluZSB3aGV0aGVyIHBoeV9jbGtfdmFsaWQgbmVlZHMgdG8gYmUgY2hlY2tlZAogCSAqIGJ5IHJlYWRpbmcgcHJvcGVydHkgaW4gZGV2aWNlIHRyZWUKIAkgKi8KLQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAicGh5LWNsay12YWxpZCIsIE5VTEwpKQotCQlwZGF0YS0+Y2hlY2tfcGh5X2Nsa192YWxpZCA9IDE7Ci0JZWxzZQotCQlwZGF0YS0+Y2hlY2tfcGh5X2Nsa192YWxpZCA9IDA7CisJcGRhdGEtPmNoZWNrX3BoeV9jbGtfdmFsaWQgPQorCQlvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJwaHktY2xrLXZhbGlkIik7CiAKIAlpZiAocGRhdGEtPmhhdmVfc3lzaWZfcmVncykgewogCQlpZiAocGRhdGEtPmNvbnRyb2xsZXJfdmVyID09IEZTTF9VU0JfVkVSX05PTkUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvbWF4MzQyMS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvbWF4MzQyMS1oY2QuYwppbmRleCBjMzY5YzI5Li4zNjk4NjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L21heDM0MjEtaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9tYXgzNDIxLWhjZC5jCkBAIC0xNjc1LDcgKzE2NzUsNyBAQAogCWlmIChwaW5fbnVtYmVyID4gNykKIAkJcmV0dXJuOwogCi0JbWFzayA9IDF1IDw8IHBpbl9udW1iZXI7CisJbWFzayA9IDF1IDw8IChwaW5fbnVtYmVyICUgNCk7CiAJaWR4ID0gcGluX251bWJlciAvIDQ7CiAKIAlpZiAodmFsdWUpCkBAIC0xODU2LDE1ICsxODU2LDExIEBACiAJSU5JVF9MSVNUX0hFQUQoJm1heDM0MjFfaGNkLT5lcF9saXN0KTsKIAogCW1heDM0MjFfaGNkLT50eCA9IGttYWxsb2Moc2l6ZW9mKCptYXgzNDIxX2hjZC0+dHgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1heDM0MjFfaGNkLT50eCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgImZhaWxlZCB0byBrbWFsbG9jIHR4IGJ1ZmZlclxuIik7CisJaWYgKCFtYXgzNDIxX2hjZC0+dHgpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCW1heDM0MjFfaGNkLT5yeCA9IGttYWxsb2Moc2l6ZW9mKCptYXgzNDIxX2hjZC0+cngpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1heDM0MjFfaGNkLT5yeCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgImZhaWxlZCB0byBrbWFsbG9jIHJ4IGJ1ZmZlclxuIik7CisJaWYgKCFtYXgzNDIxX2hjZC0+cngpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCiAJbWF4MzQyMV9oY2QtPnNwaV90aHJlYWQgPSBrdGhyZWFkX3J1bihtYXgzNDIxX3NwaV90aHJlYWQsIGhjZCwKIAkJCQkJICAgICAgIm1heDM0MjFfc3BpX3RocmVhZCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF0OTEuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdDkxLmMKaW5kZXggZDE3NzM3Mi4uNWI1ODgwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF0OTEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXQ5MS5jCkBAIC0yMSw4ICsyMSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4KKyNpbmNsdWRlIDxzb2MvYXQ5MS9hdG1lbC1zZnIuaD4KIAogI2luY2x1ZGUgIm9oY2kuaCIKIApAQCAtNTEsNiArNTQsNyBAQAogCXN0cnVjdCBjbGsgKmhjbGs7CiAJYm9vbCBjbG9ja2VkOwogCWJvb2wgd2FrZXVwOwkJLyogU2F2ZWQgd2FrZS11cCBzdGF0ZSBmb3IgcmVzdW1lICovCisJc3RydWN0IHJlZ21hcCAqc2ZyX3JlZ21hcDsKIH07CiAvKiBpbnRlcmZhY2UgYW5kIGZ1bmN0aW9uIGNsb2Nrczsgc29tZXRpbWVzIGFsc28gYW4gQUhCIGNsb2NrICovCiAKQEAgLTEzNCw2ICsxMzgsMTcgQEAKIAogc3RhdGljIHZvaWQgdXNiX2hjZF9hdDkxX3JlbW92ZSAoc3RydWN0IHVzYl9oY2QgKiwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKTsKIAorc3RhdGljIHN0cnVjdCByZWdtYXAgKmF0OTFfZHRfc3lzY29uX3Nmcih2b2lkKQoreworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKworCXJlZ21hcCA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X2NvbXBhdGlibGUoImF0bWVsLHNhbWE1ZDItc2ZyIik7CisJaWYgKElTX0VSUihyZWdtYXApKQorCQlyZWdtYXAgPSBOVUxMOworCisJcmV0dXJuIHJlZ21hcDsKK30KKwogLyogY29uZmlndXJlIHNvIGFuIEhDIGRldmljZSBhbmQgaWQgYXJlIGFsd2F5cyBwcm92aWRlZCAqLwogLyogYWx3YXlzIGNhbGxlZCB3aXRoIHByb2Nlc3MgY29udGV4dDsgc2xlZXBpbmcgaXMgT0sgKi8KIApAQCAtMTk3LDYgKzIxMiwxMCBAQAogCQlnb3RvIGVycjsKIAl9CiAKKwlvaGNpX2F0OTEtPnNmcl9yZWdtYXAgPSBhdDkxX2R0X3N5c2Nvbl9zZnIoKTsKKwlpZiAoIW9oY2lfYXQ5MS0+c2ZyX3JlZ21hcCkKKwkJZGV2X3dhcm4oZGV2LCAiZmFpbGVkIHRvIGZpbmQgc2ZyIG5vZGVcbiIpOworCiAJYm9hcmQgPSBoY2QtPnNlbGYuY29udHJvbGxlci0+cGxhdGZvcm1fZGF0YTsKIAlvaGNpID0gaGNkX3RvX29oY2koaGNkKTsKIAlvaGNpLT5udW1fcG9ydHMgPSBib2FyZC0+cG9ydHM7CkBAIC0yODIsNiArMzAxLDI4IEBACiAJcmV0dXJuIGxlbmd0aDsKIH0KIAorc3RhdGljIGludCBvaGNpX2F0OTFfcG9ydF9zdXNwZW5kKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgdTggc2V0KQoreworCXUzMiByZWd2YWw7CisJaW50IHJldDsKKworCWlmICghcmVnbWFwKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgQVQ5MV9TRlJfT0hDSUlDUiwgJnJlZ3ZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChzZXQpCisJCXJlZ3ZhbCB8PSBBVDkxX09IQ0lJQ1JfVVNCX1NVU1BFTkQ7CisJZWxzZQorCQlyZWd2YWwgJj0gfkFUOTFfT0hDSUlDUl9VU0JfU1VTUEVORDsKKworCXJlZ21hcF93cml0ZShyZWdtYXAsIEFUOTFfU0ZSX09IQ0lJQ1IsIHJlZ3ZhbCk7CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIExvb2sgYXQgdGhlIGNvbnRyb2wgcmVxdWVzdHMgdG8gdGhlIHJvb3QgaHViIGFuZCBzZWUgaWYgd2UgbmVlZCB0byBvdmVycmlkZS4KICAqLwpAQCAtMjg5LDYgKzMzMCw3IEBACiAJCQkJIHUxNiB3SW5kZXgsIGNoYXIgKmJ1ZiwgdTE2IHdMZW5ndGgpCiB7CiAJc3RydWN0IGF0OTFfdXNiaF9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoaGNkLT5zZWxmLmNvbnRyb2xsZXIpOworCXN0cnVjdCBvaGNpX2F0OTFfcHJpdiAqb2hjaV9hdDkxID0gaGNkX3RvX29oY2lfYXQ5MV9wcml2KGhjZCk7CiAJc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqZGVzYzsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAl1MzIgKmRhdGEgPSAodTMyICopYnVmOwpAQCAtMzAxLDcgKzM0Myw4IEBACiAKIAlzd2l0Y2ggKHR5cGVSZXEpIHsKIAljYXNlIFNldFBvcnRGZWF0dXJlOgotCQlpZiAod1ZhbHVlID09IFVTQl9QT1JUX0ZFQVRfUE9XRVIpIHsKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgogCQkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwgIlNldFBvcnRGZWF0OiBQT1dFUlxuIik7CiAJCQlpZiAodmFsaWRfcG9ydCh3SW5kZXgpKSB7CiAJCQkJb2hjaV9hdDkxX3VzYl9zZXRfcG93ZXIocGRhdGEsIHdJbmRleCwgMSk7CkBAIC0zMDksNiArMzUyLDE1IEBACiAJCQl9CiAKIAkJCWdvdG8gb3V0OworCisJCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgorCQkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwgIlNldFBvcnRGZWF0OiBTVVNQRU5EXG4iKTsKKwkJCWlmICh2YWxpZF9wb3J0KHdJbmRleCkpIHsKKwkJCQlvaGNpX2F0OTFfcG9ydF9zdXNwZW5kKG9oY2lfYXQ5MS0+c2ZyX3JlZ21hcCwKKwkJCQkJCSAgICAgICAxKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwogCkBAIC0zNDIsNiArMzk0LDE2IEBACiAJCQkJb2hjaV9hdDkxX3VzYl9zZXRfcG93ZXIocGRhdGEsIHdJbmRleCwgMCk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CisJCQlicmVhazsKKworCQljYXNlIFVTQl9QT1JUX0ZFQVRfU1VTUEVORDoKKwkJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJDbGVhclBvcnRGZWF0dXJlOiBTVVNQRU5EXG4iKTsKKwkJCWlmICh2YWxpZF9wb3J0KHdJbmRleCkpIHsKKwkJCQlvaGNpX2F0OTFfcG9ydF9zdXNwZW5kKG9oY2lfYXQ5MS0+c2ZyX3JlZ21hcCwKKwkJCQkJCSAgICAgICAwKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTU5OSw2ICs2NjEsOCBAQAogCWlmIChvaGNpX2F0OTEtPndha2V1cCkKIAkJZW5hYmxlX2lycV93YWtlKGhjZC0+aXJxKTsKIAorCW9oY2lfYXQ5MV9wb3J0X3N1c3BlbmQob2hjaV9hdDkxLT5zZnJfcmVnbWFwLCAxKTsKKwogCXJldCA9IG9oY2lfc3VzcGVuZChoY2QsIG9oY2lfYXQ5MS0+d2FrZXVwKTsKIAlpZiAocmV0KSB7CiAJCWlmIChvaGNpX2F0OTEtPndha2V1cCkKQEAgLTYzOCw2ICs3MDIsOSBAQAogCWF0OTFfc3RhcnRfY2xvY2sob2hjaV9hdDkxKTsKIAogCW9oY2lfcmVzdW1lKGhjZCwgZmFsc2UpOworCisJb2hjaV9hdDkxX3BvcnRfc3VzcGVuZChvaGNpX2F0OTEtPnNmcl9yZWdtYXAsIDApOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vbWFwLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktb21hcC5jCmluZGV4IGRlN2M2ODYuLjQ5NWMxNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vbWFwLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9tYXAuYwpAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgPG1hY2gvbXV4Lmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC91c2IuaD4KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktc2ExMTExLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktc2ExMTExLmMKaW5kZXggMmFjMjY2ZC4uM2E5ZWEzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNhMTExMS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zYTExMTEuYwpAQCAtMTMsOSArMTMsNyBAQAogICogVGhpcyBmaWxlIGlzIGxpY2VuY2VkIHVuZGVyIHRoZSBHUEwuCiAgKi8KIAotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPG1hY2gvYXNzYWJldC5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zYTExMTEuaD4KIAogI2lmbmRlZiBDT05GSUdfU0ExMTExCkBAIC0xMjcsNyArMTI1LDcgQEAKIAlkZXZfZGJnKCZkZXYtPmRldiwgInN0YXJ0aW5nIFNBLTExMTEgT0hDSSBVU0IgQ29udHJvbGxlclxuIik7CiAKIAlpZiAobWFjaGluZV9pc194cDg2MCgpIHx8Ci0JICAgIG1hY2hpbmVfaGFzX25lcG9uc2V0KCkgfHwKKwkgICAgbWFjaGluZV9pc19hc3NhYmV0KCkgfHwKIAkgICAgbWFjaGluZV9pc19wZnMxNjgoKSB8fAogCSAgICBtYWNoaW5lX2lzX2JhZGdlNCgpKQogCQl1c2JfcnN0ID0gVVNCX1JFU0VUX1BXUlNFTlNFTE9XIHwgVVNCX1JFU0VUX1BXUkNUUkxMT1c7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMKaW5kZXggYTdkZThlOC4uNWQzZDkxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuYwpAQCAtNjAxLDExICs2MDEsOCBAQAogCiAJdWhjaS0+ZnJhbWVfY3B1ID0ga2NhbGxvYyhVSENJX05VTUZSQU1FUywgc2l6ZW9mKCp1aGNpLT5mcmFtZV9jcHUpLAogCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCF1aGNpLT5mcmFtZV9jcHUpIHsKLQkJZGV2X2Vycih1aGNpX2Rldih1aGNpKSwKLQkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBmcmFtZSBwb2ludGVyc1xuIik7CisJaWYgKCF1aGNpLT5mcmFtZV9jcHUpCiAJCWdvdG8gZXJyX2FsbG9jX2ZyYW1lX2NwdTsKLQl9CiAKIAl1aGNpLT50ZF9wb29sID0gZG1hX3Bvb2xfY3JlYXRlKCJ1aGNpX3RkIiwgdWhjaV9kZXYodWhjaSksCiAJCQlzaXplb2Yoc3RydWN0IHVoY2lfdGQpLCAxNiwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3doY2kvaW5pdC5jIGIvZHJpdmVycy91c2IvaG9zdC93aGNpL2luaXQuYwppbmRleCBlMzYzNzIzLi5hZDhlYjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3doY2kvaW5pdC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9pbml0LmMKQEAgLTY1LDcgKzY1LDcgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3aGMtPmNtZF93cSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmd2hjLT5hc3luY19saXN0X3dxKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3aGMtPnBlcmlvZGljX2xpc3Rfd3EpOwotCXdoYy0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoZGV2X25hbWUoJndoYy0+dW1jLT5kZXYpKTsKKwl3aGMtPndvcmtxdWV1ZSA9IGFsbG9jX29yZGVyZWRfd29ya3F1ZXVlKGRldl9uYW1lKCZ3aGMtPnVtYy0+ZGV2KSwgMCk7CiAJaWYgKHdoYy0+d29ya3F1ZXVlID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1odWIuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1odWIuYwppbmRleCBkNjFmY2M0Li43MzBiOWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaHViLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWh1Yi5jCkBAIC0zODYsNiArMzg2LDkgQEAKIAogCXJldCA9IDA7CiAJdmlydF9kZXYgPSB4aGNpLT5kZXZzW3Nsb3RfaWRdOworCWlmICghdmlydF9kZXYpCisJCXJldHVybiAtRU5PREVWOworCiAJY21kID0geGhjaV9hbGxvY19jb21tYW5kKHhoY2ksIGZhbHNlLCB0cnVlLCBHRlBfTk9JTyk7CiAJaWYgKCFjbWQpIHsKIAkJeGhjaV9kYmcoeGhjaSwgIkNvdWxkbid0IGFsbG9jYXRlIGNvbW1hbmQgc3RydWN0dXJlLlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMKaW5kZXggNGZkMDQxYi4uZDdiMGY5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYwpAQCAtMzE0LDExICszMTQsMTIgQEAKIAkJdXNiX3JlbW92ZV9oY2QoeGhjaS0+c2hhcmVkX2hjZCk7CiAJCXVzYl9wdXRfaGNkKHhoY2ktPnNoYXJlZF9oY2QpOwogCX0KLQl1c2JfaGNkX3BjaV9yZW1vdmUoZGV2KTsKIAogCS8qIFdvcmthcm91bmQgZm9yIHNwdXJpb3VzIHdha2V1cHMgYXQgc2h1dGRvd24gd2l0aCBIU1cgKi8KIAlpZiAoeGhjaS0+cXVpcmtzICYgWEhDSV9TUFVSSU9VU19XQUtFVVApCiAJCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBQQ0lfRDNob3QpOworCisJdXNiX2hjZF9wY2lfcmVtb3ZlKGRldik7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jCmluZGV4IDkxOGUwYzcuLjc5NzEzN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXJpbmcuYwpAQCAtODUwLDYgKzg1MCwxMCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZ4aGNpLT5sb2NrLCBmbGFncyk7CiAKIAllcC0+c3RvcF9jbWRzX3BlbmRpbmctLTsKKwlpZiAoeGhjaS0+eGhjX3N0YXRlICYgWEhDSV9TVEFURV9SRU1PVklORykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4aGNpLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CiAJaWYgKHhoY2ktPnhoY19zdGF0ZSAmIFhIQ0lfU1RBVEVfRFlJTkcpIHsKIAkJeGhjaV9kYmdfdHJhY2UoeGhjaSwgdHJhY2VfeGhjaV9kYmdfY2FuY2VsX3VyYiwKIAkJCQkiU3RvcCBFUCB0aW1lciByYW4sIGJ1dCBhbm90aGVyIHRpbWVyIG1hcmtlZCAiCkBAIC05MDMsNyArOTA3LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4aGNpLT5sb2NrLCBmbGFncyk7CiAJeGhjaV9kYmdfdHJhY2UoeGhjaSwgdHJhY2VfeGhjaV9kYmdfY2FuY2VsX3VyYiwKIAkJCSJDYWxsaW5nIHVzYl9oY19kaWVkKCkiKTsKLQl1c2JfaGNfZGllZCh4aGNpX3RvX2hjZCh4aGNpKS0+cHJpbWFyeV9oY2QpOworCXVzYl9oY19kaWVkKHhoY2lfdG9faGNkKHhoY2kpKTsKIAl4aGNpX2RiZ190cmFjZSh4aGNpLCB0cmFjZV94aGNpX2RiZ19jYW5jZWxfdXJiLAogCQkJInhIQ0kgaG9zdCBjb250cm9sbGVyIGlzIGRlYWQuIik7CiB9CkBAIC0xMzM0LDEyICsxMzM4LDYgQEAKIAogCWNtZCA9IGxpc3RfZW50cnkoeGhjaS0+Y21kX2xpc3QubmV4dCwgc3RydWN0IHhoY2lfY29tbWFuZCwgY21kX2xpc3QpOwogCi0JaWYgKGNtZC0+Y29tbWFuZF90cmIgIT0geGhjaS0+Y21kX3JpbmctPmRlcXVldWUpIHsKLQkJeGhjaV9lcnIoeGhjaSwKLQkJCSAiQ29tbWFuZCBjb21wbGV0aW9uIGV2ZW50IGRvZXMgbm90IG1hdGNoIGNvbW1hbmRcbiIpOwotCQlyZXR1cm47Ci0JfQotCiAJZGVsX3RpbWVyKCZ4aGNpLT5jbWRfdGltZXIpOwogCiAJdHJhY2VfeGhjaV9jbWRfY29tcGxldGlvbihjbWRfdHJiLCAoc3RydWN0IHhoY2lfZ2VuZXJpY190cmIgKikgZXZlbnQpOwpAQCAtMTM1MSw2ICsxMzQ5LDEzIEBACiAJCXhoY2lfaGFuZGxlX3N0b3BwZWRfY21kX3JpbmcoeGhjaSwgY21kKTsKIAkJcmV0dXJuOwogCX0KKworCWlmIChjbWQtPmNvbW1hbmRfdHJiICE9IHhoY2ktPmNtZF9yaW5nLT5kZXF1ZXVlKSB7CisJCXhoY2lfZXJyKHhoY2ksCisJCQkgIkNvbW1hbmQgY29tcGxldGlvbiBldmVudCBkb2VzIG5vdCBtYXRjaCBjb21tYW5kXG4iKTsKKwkJcmV0dXJuOworCX0KKwogCS8qCiAJICogSG9zdCBhYm9ydGVkIHRoZSBjb21tYW5kIHJpbmcsIGNoZWNrIGlmIHRoZSBjdXJyZW50IGNvbW1hbmQgd2FzCiAJICogc3VwcG9zZWQgdG8gYmUgYWJvcnRlZCwgb3RoZXJ3aXNlIGNvbnRpbnVlIG5vcm1hbGx5LgpAQCAtMzI0Myw3ICszMjQ4LDggQEAKIAlzZW5kX2FkZHIgPSBhZGRyOwogCiAJLyogUXVldWUgdGhlIFRSQnMsIGV2ZW4gaWYgdGhleSBhcmUgemVyby1sZW5ndGggKi8KLQlmb3IgKGVucWRfbGVuID0gMDsgZW5xZF9sZW4gPCBmdWxsX2xlbjsgZW5xZF9sZW4gKz0gdHJiX2J1ZmZfbGVuKSB7CisJZm9yIChlbnFkX2xlbiA9IDA7IGZpcnN0X3RyYiB8fCBlbnFkX2xlbiA8IGZ1bGxfbGVuOworCQkJZW5xZF9sZW4gKz0gdHJiX2J1ZmZfbGVuKSB7CiAJCWZpZWxkID0gVFJCX1RZUEUoVFJCX05PUk1BTCk7CiAKIAkJLyogVFJCIGJ1ZmZlciBzaG91bGQgbm90IGNyb3NzIDY0S0IgYm91bmRhcmllcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXRlZ3JhLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktdGVncmEuYwppbmRleCAwZjUzYWUwLi5hNTlmYWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktdGVncmEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktdGVncmEuYwpAQCAtMTAzMyw3ICsxMDMzLDYgQEAKIAl0ZWdyYS0+cGh5cyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCB0ZWdyYS0+bnVtX3BoeXMsCiAJCQkJICAgc2l6ZW9mKCp0ZWdyYS0+cGh5cyksIEdGUF9LRVJORUwpOwogCWlmICghdGVncmEtPnBoeXMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIFBIWSBhcnJheVxuIik7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gcHV0X3BhZGN0bDsKIAl9CkBAIC0xMTE3LDYgKzExMTYsNyBAQAogCQkJCQkJIHRlZ3JhLT5oY2QpOwogCWlmICgheGhjaS0+c2hhcmVkX2hjZCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHNoYXJlZCBIQ0RcbiIpOworCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIHJlbW92ZV91c2IyOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYwppbmRleCAwMWQ5NmM5Li4xYTRjYTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYwpAQCAtMjk1LDEwICsyOTUsOCBAQAogCXhoY2ktPm1zaXhfZW50cmllcyA9CiAJCWttYWxsb2MoKHNpemVvZihzdHJ1Y3QgbXNpeF9lbnRyeSkpKnhoY2ktPm1zaXhfY291bnQsCiAJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCF4aGNpLT5tc2l4X2VudHJpZXMpIHsKLQkJeGhjaV9lcnIoeGhjaSwgIkZhaWxlZCB0byBhbGxvY2F0ZSBNU0ktWCBlbnRyaWVzXG4iKTsKKwlpZiAoIXhoY2ktPm1zaXhfZW50cmllcykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJZm9yIChpID0gMDsgaSA8IHhoY2ktPm1zaXhfY291bnQ7IGkrKykgewogCQl4aGNpLT5tc2l4X2VudHJpZXNbaV0uZW50cnkgPSBpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9LY29uZmlnIGIvZHJpdmVycy91c2IvbWlzYy9LY29uZmlnCmluZGV4IGViOGY4ZDMuLjQ3YjM1NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcKQEAgLTI0MCw2ICsyNDAsMTIgQEAKICAgICAgICBoZWxwCiAgICAgICAgICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIFNNU0MgVVNCMzUwMyBIU0lDIHRvIFVTQiAyLjAgRHJpdmVyLgogCitjb25maWcgVVNCX0hTSUNfVVNCNDYwNAorICAgICAgIHRyaXN0YXRlICJVU0I0NjA0IEhTSUMgdG8gVVNCMjAgRHJpdmVyIgorICAgICAgIGRlcGVuZHMgb24gSTJDCisgICAgICAgaGVscAorICAgICAgICAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBTTVNDIFVTQjQ2MDQgSFNJQyB0byBVU0IgMi4wIERyaXZlci4KKwogY29uZmlnIFVTQl9MSU5LX0xBWUVSX1RFU1QKIAl0cmlzdGF0ZSAiVVNCIExpbmsgTGF5ZXIgVGVzdCBkcml2ZXIiCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL21pc2MvTWFrZWZpbGUKaW5kZXggM2Q3OWZhYS4uM2QxOTkyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9taXNjL01ha2VmaWxlCkBAIC0yNCw2ICsyNCw3IEBACiBvYmotJChDT05GSUdfVVNCX1NFVlNFRykJCSs9IHVzYnNldnNlZy5vCiBvYmotJChDT05GSUdfVVNCX1lVUkVYKQkJCSs9IHl1cmV4Lm8KIG9iai0kKENPTkZJR19VU0JfSFNJQ19VU0IzNTAzKQkJKz0gdXNiMzUwMy5vCitvYmotJChDT05GSUdfVVNCX0hTSUNfVVNCNDYwNCkJCSs9IHVzYjQ2MDQubwogb2JqLSQoQ09ORklHX1VTQl9DSEFPU0tFWSkJCSs9IGNoYW9za2V5Lm8KIG9iai0kKENPTkZJR19VQ1NJKQkJCSs9IHVjc2kubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2FkdXR1eC5jIGIvZHJpdmVycy91c2IvbWlzYy9hZHV0dXguYwppbmRleCAzMDcxYzBlLi41NjQyNjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2FkdXR1eC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvYWR1dHV4LmMKQEAgLTY3Miw4ICs2NzIsNyBAQAogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCiAJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkdV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGV2ID09IE5VTEwpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWRldikgewogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtNzEwLDcgKzcwOSw2IEBACiAKIAlkZXYtPnJlYWRfYnVmZmVyX3ByaW1hcnkgPSBrbWFsbG9jKCg0ICogaW5fZW5kX3NpemUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldi0+cmVhZF9idWZmZXJfcHJpbWFyeSkgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIHJlYWRfYnVmZmVyX3ByaW1hcnlcbiIpOwogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTcyMyw3ICs3MjEsNiBAQAogCiAJZGV2LT5yZWFkX2J1ZmZlcl9zZWNvbmRhcnkgPSBrbWFsbG9jKCg0ICogaW5fZW5kX3NpemUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldi0+cmVhZF9idWZmZXJfc2Vjb25kYXJ5KSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgcmVhZF9idWZmZXJfc2Vjb25kYXJ5XG4iKTsKIAkJcmV0dmFsID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC03MzUsMjkgKzczMiwyMSBAQAogCW1lbXNldChkZXYtPnJlYWRfYnVmZmVyX3NlY29uZGFyeSArICgzICogaW5fZW5kX3NpemUpLCAnaCcsIGluX2VuZF9zaXplKTsKIAogCWRldi0+aW50ZXJydXB0X2luX2J1ZmZlciA9IGttYWxsb2MoaW5fZW5kX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX2J1ZmZlclxuIik7CisJaWYgKCFkZXYtPmludGVycnVwdF9pbl9idWZmZXIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCiAJLyogZGVidWcgY29kZSBwcmltZSB0aGUgYnVmZmVyICovCiAJbWVtc2V0KGRldi0+aW50ZXJydXB0X2luX2J1ZmZlciwgJ2knLCBpbl9lbmRfc2l6ZSk7CiAKIAlkZXYtPmludGVycnVwdF9pbl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX3VyYlxuIik7CisJaWYgKCFkZXYtPmludGVycnVwdF9pbl91cmIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWRldi0+aW50ZXJydXB0X291dF9idWZmZXIgPSBrbWFsbG9jKG91dF9lbmRfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X291dF9idWZmZXJcbiIpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcikKIAkJZ290byBlcnJvcjsKLQl9CiAJZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmludGVycnVwdF9vdXRfdXJiKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X291dF91cmJcbiIpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYikKIAkJZ290byBlcnJvcjsKLQl9CiAKIAlpZiAoIXVzYl9zdHJpbmcodWRldiwgdWRldi0+ZGVzY3JpcHRvci5pU2VyaWFsTnVtYmVyLCBkZXYtPnNlcmlhbF9udW1iZXIsCiAJCQlzaXplb2YoZGV2LT5zZXJpYWxfbnVtYmVyKSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvYXBwbGVkaXNwbGF5LmMgYi9kcml2ZXJzL3VzYi9taXNjL2FwcGxlZGlzcGxheS5jCmluZGV4IGEwYTM4MjcuLmRhNWZmNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvYXBwbGVkaXNwbGF5LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9hcHBsZWRpc3BsYXkuYwpAQCAtODUsNyArODUsNiBAQAogfTsKIAogc3RhdGljIGF0b21pY190IGNvdW50X2Rpc3BsYXlzID0gQVRPTUlDX0lOSVQoMCk7Ci1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOwogCiBzdGF0aWMgdm9pZCBhcHBsZWRpc3BsYXlfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKQogewpAQCAtMTIyLDcgKzEyMSw3IEBACiAJY2FzZSBBQ0RfQlROX0JSSUdIVF9VUDoKIAljYXNlIEFDRF9CVE5fQlJJR0hUX0RPV046CiAJCXBkYXRhLT5idXR0b25fcHJlc3NlZCA9IDE7Ci0JCXF1ZXVlX2RlbGF5ZWRfd29yayh3cSwgJnBkYXRhLT53b3JrLCAwKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwZGF0YS0+d29yaywgMCk7CiAJCWJyZWFrOwogCWNhc2UgQUNEX0JUTl9OT05FOgogCWRlZmF1bHQ6CkBAIC0yMzksNyArMjM4LDYgQEAKIAlwZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhcHBsZWRpc3BsYXkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBkYXRhKSB7CiAJCXJldHZhbCA9IC1FTk9NRU07Ci0JCWRldl9lcnIoJmlmYWNlLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKQEAgLTI1Myw4ICsyNTEsNiBAQAogCXBkYXRhLT5tc2dkYXRhID0ga21hbGxvYyhBQ0RfTVNHX0JVRkZFUl9MRU4sIEdGUF9LRVJORUwpOwogCWlmICghcGRhdGEtPm1zZ2RhdGEpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKLQkJZGV2X2VycigmaWZhY2UtPmRldiwKLQkJCSJBbGxvY2F0aW5nIGJ1ZmZlciBmb3IgY29udHJvbCBtZXNzYWdlcyBmYWlsZWRcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KIApAQCAtMjYyLDcgKzI1OCw2IEBACiAJcGRhdGEtPnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwZGF0YS0+dXJiKSB7CiAJCXJldHZhbCA9IC1FTk9NRU07Ci0JCWRldl9lcnIoJmlmYWNlLT5kZXYsICJBbGxvY2F0aW5nIFVSQiBmYWlsZWRcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KIApAQCAtMzQ0LDcgKzMzOSw3IEBACiAKIAlpZiAocGRhdGEpIHsKIAkJdXNiX2tpbGxfdXJiKHBkYXRhLT51cmIpOwotCQljYW5jZWxfZGVsYXllZF93b3JrKCZwZGF0YS0+d29yayk7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcGRhdGEtPndvcmspOwogCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIocGRhdGEtPmJkKTsKIAkJdXNiX2ZyZWVfY29oZXJlbnQocGRhdGEtPnVkZXYsIEFDRF9VUkJfQlVGRkVSX0xFTiwKIAkJCXBkYXRhLT51cmJkYXRhLCBwZGF0YS0+dXJiLT50cmFuc2Zlcl9kbWEpOwpAQCAtMzY1LDE5ICszNjAsMTEgQEAKIAogc3RhdGljIGludCBfX2luaXQgYXBwbGVkaXNwbGF5X2luaXQodm9pZCkKIHsKLQl3cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJhcHBsZWRpc3BsYXkiKTsKLQlpZiAoIXdxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYXBwbGVkaXNwbGF5OiBDb3VsZCBub3QgY3JlYXRlIHdvcmsgcXVldWVcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KIAlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZhcHBsZWRpc3BsYXlfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGFwcGxlZGlzcGxheV9leGl0KHZvaWQpCiB7Ci0JZmx1c2hfd29ya3F1ZXVlKHdxKTsKLQlkZXN0cm95X3dvcmtxdWV1ZSh3cSk7CiAJdXNiX2RlcmVnaXN0ZXIoJmFwcGxlZGlzcGxheV9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2N5cHJlc3NfY3k3YzYzLmMgYi9kcml2ZXJzL3VzYi9taXNjL2N5cHJlc3NfY3k3YzYzLmMKaW5kZXggNDAyYjk0ZC4uNWM5M2E4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9jeXByZXNzX2N5N2M2My5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvY3lwcmVzc19jeTdjNjMuYwpAQCAtNzksNyArNzksNiBAQAogCS8qIGFsbG9jYXRlIHNvbWUgbWVtb3J5IGZvciB0aGUgaS9vIGJ1ZmZlciovCiAJaW9idWYgPSBremFsbG9jKENZUFJFU1NfTUFYX1JFUVNJWkUsIEdGUF9LRVJORUwpOwogCWlmICghaW9idWYpIHsKLQkJZGV2X2VycigmZGV2LT51ZGV2LT5kZXYsICJPdXQgb2YgbWVtb3J5IVxuIik7CiAJCXJldHZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3I7CiAJfQpAQCAtMjA4LDEwICsyMDcsOCBAQAogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCiAJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwotCWlmIChkZXYgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnkhXG4iKTsKKwlpZiAoIWRldikKIAkJZ290byBlcnJvcl9tZW07Ci0JfQogCiAJZGV2LT51ZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9jeXRoZXJtLmMgYi9kcml2ZXJzL3VzYi9taXNjL2N5dGhlcm0uYwppbmRleCA5YmFiMWEzLi45ZDhiYjhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2N5dGhlcm0uYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2N5dGhlcm0uYwpAQCAtMTAxLDEwICsxMDEsOCBAQAogCWludCByZXR2YWw7CiAgICAKIAlidWZmZXIgPSBrbWFsbG9jKDgsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZmVyKSB7Ci0JCWRldl9lcnIoJmN5dGhlcm0tPnVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOworCWlmICghYnVmZmVyKQogCQlyZXR1cm4gMDsKLQl9CiAKIAljeXRoZXJtLT5icmlnaHRuZXNzID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CiAgICAKQEAgLTE0OCwxMCArMTQ2LDggQEAKIAlpbnQgdGVtcCwgc2lnbjsKICAgIAogCWJ1ZmZlciA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmZXIpIHsKLQkJZGV2X2VycigmY3l0aGVybS0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFidWZmZXIpCiAJCXJldHVybiAwOwotCX0KIAogCS8qIHJlYWQgdGVtcGVyYXR1cmUgKi8KIAlyZXR2YWwgPSB2ZW5kb3JfY29tbWFuZChjeXRoZXJtLT51ZGV2LCBSRUFEX1JBTSwgVEVNUCwgMCwgYnVmZmVyLCA4KTsKQEAgLTE5MiwxMCArMTg4LDggQEAKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAKIAlidWZmZXIgPSBrbWFsbG9jKDgsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZmVyKSB7Ci0JCWRldl9lcnIoJmN5dGhlcm0tPnVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOworCWlmICghYnVmZmVyKQogCQlyZXR1cm4gMDsKLQl9CiAKIAkvKiBjaGVjayBidXR0b24gKi8KIAlyZXR2YWwgPSB2ZW5kb3JfY29tbWFuZChjeXRoZXJtLT51ZGV2LCBSRUFEX1JBTSwgQlVUVE9OLCAwLCBidWZmZXIsIDgpOwpAQCAtMjMwLDEwICsyMjQsOCBAQAogCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKIAogCWJ1ZmZlciA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmZXIpIHsKLQkJZGV2X2VycigmY3l0aGVybS0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFidWZmZXIpCiAJCXJldHVybiAwOwotCX0KIAogCXJldHZhbCA9IHZlbmRvcl9jb21tYW5kKGN5dGhlcm0tPnVkZXYsIFJFQURfUE9SVCwgMCwgMCwgYnVmZmVyLCA4KTsKIAlpZiAocmV0dmFsKQpAQCAtMjU3LDEwICsyNDksOCBAQAogCWludCB0bXA7CiAgICAKIAlidWZmZXIgPSBrbWFsbG9jKDgsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZmVyKSB7Ci0JCWRldl9lcnIoJmN5dGhlcm0tPnVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOworCWlmICghYnVmZmVyKQogCQlyZXR1cm4gMDsKLQl9CiAKIAl0bXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKICAgIApAQCAtMjkwLDEwICsyODAsOCBAQAogCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKIAogCWJ1ZmZlciA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmZXIpIHsKLQkJZGV2X2VycigmY3l0aGVybS0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFidWZmZXIpCiAJCXJldHVybiAwOwotCX0KIAogCXJldHZhbCA9IHZlbmRvcl9jb21tYW5kKGN5dGhlcm0tPnVkZXYsIFJFQURfUE9SVCwgMSwgMCwgYnVmZmVyLCA4KTsKIAlpZiAocmV0dmFsKQpAQCAtMzE3LDEwICszMDUsOCBAQAogCWludCB0bXA7CiAgICAKIAlidWZmZXIgPSBrbWFsbG9jKDgsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZmVyKSB7Ci0JCWRldl9lcnIoJmN5dGhlcm0tPnVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOworCWlmICghYnVmZmVyKQogCQlyZXR1cm4gMDsKLQl9CiAKIAl0bXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKICAgIApAQCAtMzUxLDEwICszMzcsOCBAQAogCWludCByZXR2YWwgPSAtRU5PTUVNOwogCiAJZGV2ID0ga3phbGxvYyAoc2l6ZW9mKHN0cnVjdCB1c2JfY3l0aGVybSksIEdGUF9LRVJORUwpOwotCWlmIChkZXYgPT0gTlVMTCkgewotCQlkZXZfZXJyICgmaW50ZXJmYWNlLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWRldikKIAkJZ290byBlcnJvcl9tZW07Ci0JfQogCiAJZGV2LT51ZGV2ID0gdXNiX2dldF9kZXYodWRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvZXp1c2IuYyBiL2RyaXZlcnMvdXNiL21pc2MvZXp1c2IuYwppbmRleCA5NDc4MTFiLi44MzcyMDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2V6dXNiLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9lenVzYi5jCkBAIC0yMiw3ICsyMiw3IEBACiAJdW5zaWduZWQgc2hvcnQgbWF4X2ludGVybmFsX2FkcmVzczsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZXp1c2JfZnhfdHlwZSBlenVzYl9meDEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGV6dXNiX2Z4X3R5cGUgZXp1c2JfZngxID0gewogCS5jcHVjc19yZWcgPSAweDdGOTIsCiAJLm1heF9pbnRlcm5hbF9hZHJlc3MgPSAweDFCM0YsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9mdGRpLWVsYW4uYyBiL2RyaXZlcnMvdXNiL21pc2MvZnRkaS1lbGFuLmMKaW5kZXggNTJjMjdjYS4uOWE4MmY4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9mdGRpLWVsYW4uYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2Z0ZGktZWxhbi5jCkBAIC02MSw5ICs2MSw2IEBACiBNT0RVTEVfUEFSTV9ERVNDKGRpc3RydXN0X2Zpcm13YXJlLAogCQkgInRydWUgdG8gZGlzdHJ1c3QgZmlybXdhcmUgcG93ZXIvb3ZlcmN1cnJlbnQgc2V0dXAiKTsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHUxMzJfcGxhdGZvcm1fZHJpdmVyOwotc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpzdGF0dXNfcXVldWU7Ci1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmNvbW1hbmRfcXVldWU7Ci1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnJlc3BvbmRfcXVldWU7CiAvKgogICogZnRkaV9tb2R1bGVfbG9jayBleGlzdHMgdG8gcHJvdGVjdCBhY2Nlc3MgdG8gZ2xvYmFsIHZhcmlhYmxlcwogICoKQEAgLTIyOCw1NiArMjI1LDU2IEBACiAKIHN0YXRpYyB2b2lkIGZ0ZGlfc3RhdHVzX3JlcXVldWVfd29yayhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksIHVuc2lnbmVkIGludCBkZWx0YSkKIHsKLQlpZiAoIXF1ZXVlX2RlbGF5ZWRfd29yayhzdGF0dXNfcXVldWUsICZmdGRpLT5zdGF0dXNfd29yaywgZGVsdGEpKQorCWlmICghc2NoZWR1bGVfZGVsYXllZF93b3JrKCZmdGRpLT5zdGF0dXNfd29yaywgZGVsdGEpKQogCQlrcmVmX3B1dCgmZnRkaS0+a3JlZiwgZnRkaV9lbGFuX2RlbGV0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGZ0ZGlfc3RhdHVzX3F1ZXVlX3dvcmsoc3RydWN0IHVzYl9mdGRpICpmdGRpLCB1bnNpZ25lZCBpbnQgZGVsdGEpCiB7Ci0JaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayhzdGF0dXNfcXVldWUsICZmdGRpLT5zdGF0dXNfd29yaywgZGVsdGEpKQorCWlmIChzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmZ0ZGktPnN0YXR1c193b3JrLCBkZWx0YSkpCiAJCWtyZWZfZ2V0KCZmdGRpLT5rcmVmKTsKIH0KIAogc3RhdGljIHZvaWQgZnRkaV9zdGF0dXNfY2FuY2VsX3dvcmsoc3RydWN0IHVzYl9mdGRpICpmdGRpKQogewotCWlmIChjYW5jZWxfZGVsYXllZF93b3JrKCZmdGRpLT5zdGF0dXNfd29yaykpCisJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZnRkaS0+c3RhdHVzX3dvcmspKQogCQlrcmVmX3B1dCgmZnRkaS0+a3JlZiwgZnRkaV9lbGFuX2RlbGV0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGZ0ZGlfY29tbWFuZF9yZXF1ZXVlX3dvcmsoc3RydWN0IHVzYl9mdGRpICpmdGRpLCB1bnNpZ25lZCBpbnQgZGVsdGEpCiB7Ci0JaWYgKCFxdWV1ZV9kZWxheWVkX3dvcmsoY29tbWFuZF9xdWV1ZSwgJmZ0ZGktPmNvbW1hbmRfd29yaywgZGVsdGEpKQorCWlmICghc2NoZWR1bGVfZGVsYXllZF93b3JrKCZmdGRpLT5jb21tYW5kX3dvcmssIGRlbHRhKSkKIAkJa3JlZl9wdXQoJmZ0ZGktPmtyZWYsIGZ0ZGlfZWxhbl9kZWxldGUpOwogfQogCiBzdGF0aWMgdm9pZCBmdGRpX2NvbW1hbmRfcXVldWVfd29yayhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksIHVuc2lnbmVkIGludCBkZWx0YSkKIHsKLQlpZiAocXVldWVfZGVsYXllZF93b3JrKGNvbW1hbmRfcXVldWUsICZmdGRpLT5jb21tYW5kX3dvcmssIGRlbHRhKSkKKwlpZiAoc2NoZWR1bGVfZGVsYXllZF93b3JrKCZmdGRpLT5jb21tYW5kX3dvcmssIGRlbHRhKSkKIAkJa3JlZl9nZXQoJmZ0ZGktPmtyZWYpOwogfQogCiBzdGF0aWMgdm9pZCBmdGRpX2NvbW1hbmRfY2FuY2VsX3dvcmsoc3RydWN0IHVzYl9mdGRpICpmdGRpKQogewotCWlmIChjYW5jZWxfZGVsYXllZF93b3JrKCZmdGRpLT5jb21tYW5kX3dvcmspKQorCWlmIChjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmZ0ZGktPmNvbW1hbmRfd29yaykpCiAJCWtyZWZfcHV0KCZmdGRpLT5rcmVmLCBmdGRpX2VsYW5fZGVsZXRlKTsKIH0KIAogc3RhdGljIHZvaWQgZnRkaV9yZXNwb25zZV9yZXF1ZXVlX3dvcmsoc3RydWN0IHVzYl9mdGRpICpmdGRpLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZGVsdGEpCiB7Ci0JaWYgKCFxdWV1ZV9kZWxheWVkX3dvcmsocmVzcG9uZF9xdWV1ZSwgJmZ0ZGktPnJlc3BvbmRfd29yaywgZGVsdGEpKQorCWlmICghc2NoZWR1bGVfZGVsYXllZF93b3JrKCZmdGRpLT5yZXNwb25kX3dvcmssIGRlbHRhKSkKIAkJa3JlZl9wdXQoJmZ0ZGktPmtyZWYsIGZ0ZGlfZWxhbl9kZWxldGUpOwogfQogCiBzdGF0aWMgdm9pZCBmdGRpX3Jlc3BvbmRfcXVldWVfd29yayhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksIHVuc2lnbmVkIGludCBkZWx0YSkKIHsKLQlpZiAocXVldWVfZGVsYXllZF93b3JrKHJlc3BvbmRfcXVldWUsICZmdGRpLT5yZXNwb25kX3dvcmssIGRlbHRhKSkKKwlpZiAoc2NoZWR1bGVfZGVsYXllZF93b3JrKCZmdGRpLT5yZXNwb25kX3dvcmssIGRlbHRhKSkKIAkJa3JlZl9nZXQoJmZ0ZGktPmtyZWYpOwogfQogCiBzdGF0aWMgdm9pZCBmdGRpX3Jlc3BvbnNlX2NhbmNlbF93b3JrKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSkKIHsKLQlpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmZnRkaS0+cmVzcG9uZF93b3JrKSkKKwlpZiAoY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZmdGRpLT5yZXNwb25kX3dvcmspKQogCQlrcmVmX3B1dCgmZnRkaS0+a3JlZiwgZnRkaV9lbGFuX2RlbGV0ZSk7CiB9CiAKQEAgLTY2NSw3ICs2NjIsNyBAQAogewogCWNoYXIgZGF0YVszMCAqMyArIDRdOwogCWNoYXIgKmQgPSBkYXRhOwotCWludCBtID0gKHNpemVvZihkYXRhKSAtIDEpIC8gMzsKKwlpbnQgbSA9IChzaXplb2YoZGF0YSkgLSAxKSAvIDMgLSAxOwogCWludCBieXRlc19yZWFkID0gMDsKIAlpbnQgcmV0cnlfb25fZW1wdHkgPSAxMDsKIAlpbnQgcmV0cnlfb25fdGltZW91dCA9IDU7CkBAIC03ODUsMTEgKzc4Miw4IEBACiAJCXJldHVybiAwOwogCXRvdGFsX3NpemUgPSBmdGRpX2VsYW5fdG90YWxfY29tbWFuZF9zaXplKGZ0ZGksIGNvbW1hbmRfc2l6ZSk7CiAJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXVyYikgewotCQlkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IGEgdXJiIHRvIHdyaXRlICVkIGNvbW1hbmRzIHRvdGFsaW5nICVkIGJ5dGVzIHRvIHRoZSBVeHh4XG4iLAotCQkJY29tbWFuZF9zaXplLCB0b3RhbF9zaXplKTsKKwlpZiAoIXVyYikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCWJ1ZiA9IHVzYl9hbGxvY19jb2hlcmVudChmdGRpLT51ZGV2LCB0b3RhbF9zaXplLCBHRlBfS0VSTkVMLAogCQkJCSAmdXJiLT50cmFuc2Zlcl9kbWEpOwogCWlmICghYnVmKSB7CkBAIC0xNjg0LDcgKzE2NzgsNyBAQAogCQkJaW50IGkgPSAwOwogCQkJY2hhciBkYXRhWzMwICozICsgNF07CiAJCQljaGFyICpkID0gZGF0YTsKLQkJCWludCBtID0gKHNpemVvZihkYXRhKSAtIDEpIC8gMzsKKwkJCWludCBtID0gKHNpemVvZihkYXRhKSAtIDEpIC8gMyAtIDE7CiAJCQlpbnQgbCA9IDA7CiAJCQlzdHJ1Y3QgdTEzMl90YXJnZXQgKnRhcmdldCA9ICZmdGRpLT50YXJnZXRbZWRdOwogCQkJc3RydWN0IHUxMzJfY29tbWFuZCAqY29tbWFuZCA9ICZmdGRpLT5jb21tYW5kWwpAQCAtMTg3Niw3ICsxODcwLDcgQEAKIAkJaWYgKHBhY2tldF9ieXRlcyA+IDIpIHsKIAkJCWNoYXIgZGlhZ1szMCAqMyArIDRdOwogCQkJY2hhciAqZCA9IGRpYWc7Ci0JCQlpbnQgbSA9IChzaXplb2YoZGlhZykgLSAxKSAvIDM7CisJCQlpbnQgbSA9IChzaXplb2YoZGlhZykgLSAxKSAvIDMgLSAxOwogCQkJY2hhciAqYiA9IGZ0ZGktPmJ1bGtfaW5fYnVmZmVyOwogCQkJaW50IGJ5dGVzX3JlYWQgPSAwOwogCQkJZGlhZ1swXSA9IDA7CkBAIC0xOTQ4LDEwICsxOTQyLDggQEAKIAlpbnQgSSA9IDI1NzsKIAlpbnQgaSA9IDA7CiAJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXVyYikgewotCQlkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJjb3VsZCBub3QgYWxsb2MgYSB1cmIgZm9yIGZsdXNoIHNlcXVlbmNlXG4iKTsKKwlpZiAoIXVyYikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCWJ1ZiA9IHVzYl9hbGxvY19jb2hlcmVudChmdGRpLT51ZGV2LCBJLCBHRlBfS0VSTkVMLCAmdXJiLT50cmFuc2Zlcl9kbWEpOwogCWlmICghYnVmKSB7CiAJCWRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgImNvdWxkIG5vdCBnZXQgYSBidWZmZXIgZm9yIGZsdXNoIHNlcXVlbmNlXG4iKTsKQEAgLTE5ODgsMTAgKzE5ODAsOCBAQAogCWludCBJID0gNDsKIAlpbnQgaSA9IDA7CiAJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXVyYikgewotCQlkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IGEgdXJiIGZvciB0aGUgcmVzZXQgc2VxdWVuY2VcbiIpOworCWlmICghdXJiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJYnVmID0gdXNiX2FsbG9jX2NvaGVyZW50KGZ0ZGktPnVkZXYsIEksIEdGUF9LRVJORUwsICZ1cmItPnRyYW5zZmVyX2RtYSk7CiAJaWYgKCFidWYpIHsKIAkJZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiY291bGQgbm90IGdldCBhIGJ1ZmZlciBmb3IgdGhlIHJlc2V0IHNlcXVlbmNlXG4iKTsKQEAgLTIwNTMsNyArMjA0Myw3IEBACiAJCQlpZiAocGFja2V0X2J5dGVzID4gMikgewogCQkJCWNoYXIgZGlhZ1szMCAqMyArIDRdOwogCQkJCWNoYXIgKmQgPSBkaWFnOwotCQkJCWludCBtID0gKHNpemVvZihkaWFnKSAtIDEpIC8gMzsKKwkJCQlpbnQgbSA9IChzaXplb2YoZGlhZykgLSAxKSAvIDMgLSAxOwogCQkJCWNoYXIgKmIgPSBmdGRpLT5idWxrX2luX2J1ZmZlcjsKIAkJCQlpbnQgYnl0ZXNfcmVhZCA9IDA7CiAJCQkJdW5zaWduZWQgY2hhciBjID0gMDsKQEAgLTIxNTUsNyArMjE0NSw3IEBACiAJCWlmIChwYWNrZXRfYnl0ZXMgPiAyKSB7CiAJCQljaGFyIGRpYWdbMzAgKjMgKyA0XTsKIAkJCWNoYXIgKmQgPSBkaWFnOwotCQkJaW50IG0gPSAoc2l6ZW9mKGRpYWcpIC0gMSkgLyAzOworCQkJaW50IG0gPSAoc2l6ZW9mKGRpYWcpIC0gMSkgLyAzIC0gMTsKIAkJCWNoYXIgKmIgPSBmdGRpLT5idWxrX2luX2J1ZmZlcjsKIAkJCWludCBieXRlc19yZWFkID0gMDsKIAkJCWRpYWdbMF0gPSAwOwpAQCAtMjc0MCw3ICsyNzMwLDYgQEAKIAkJCWZ0ZGktPmJ1bGtfaW5fZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CiAJCQlmdGRpLT5idWxrX2luX2J1ZmZlciA9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwogCQkJaWYgKCFmdGRpLT5idWxrX2luX2J1ZmZlcikgewotCQkJCWRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBidWxrX2luX2J1ZmZlclxuIik7CiAJCQkJcmV0dmFsID0gLUVOT01FTTsKIAkJCQlnb3RvIGVycm9yOwogCQkJfQpAQCAtMjgyMyw5ICsyODEyLDYgQEAKIAkJCWZ0ZGktPmluaXRpYWxpemVkID0gMDsKIAkJCWZ0ZGktPnJlZ2lzdGVyZWQgPSAwOwogCQl9Ci0JCWZsdXNoX3dvcmtxdWV1ZShzdGF0dXNfcXVldWUpOwotCQlmbHVzaF93b3JrcXVldWUoY29tbWFuZF9xdWV1ZSk7Ci0JCWZsdXNoX3dvcmtxdWV1ZShyZXNwb25kX3F1ZXVlKTsKIAkJZnRkaS0+ZGlzY29ubmVjdGVkICs9IDE7CiAJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKIAkJZGV2X2luZm8oJmZ0ZGktPnVkZXYtPmRldiwgIlVTQiBGVERJIFUxMzIgaG9zdCBjb250cm9sbGVyIGludGVyZmFjZSBub3cgZGlzY29ubmVjdGVkXG4iKTsKQEAgLTI4NDUsMzEgKzI4MzEsMTIgQEAKIAlwcl9pbmZvKCJkcml2ZXIgJXNcbiIsIGZ0ZGlfZWxhbl9kcml2ZXIubmFtZSk7CiAJbXV0ZXhfaW5pdCgmZnRkaV9tb2R1bGVfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJmZ0ZGlfc3RhdGljX2xpc3QpOwotCXN0YXR1c19xdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJmdGRpLXN0YXR1cy1jb250cm9sIik7Ci0JaWYgKCFzdGF0dXNfcXVldWUpCi0JCWdvdG8gZXJyX3N0YXR1c19xdWV1ZTsKLQljb21tYW5kX3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImZ0ZGktY29tbWFuZC1lbmdpbmUiKTsKLQlpZiAoIWNvbW1hbmRfcXVldWUpCi0JCWdvdG8gZXJyX2NvbW1hbmRfcXVldWU7Ci0JcmVzcG9uZF9xdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJmdGRpLXJlc3BvbmQtZW5naW5lIik7Ci0JaWYgKCFyZXNwb25kX3F1ZXVlKQotCQlnb3RvIGVycl9yZXNwb25kX3F1ZXVlOwogCXJlc3VsdCA9IHVzYl9yZWdpc3RlcigmZnRkaV9lbGFuX2RyaXZlcik7CiAJaWYgKHJlc3VsdCkgewotCQlkZXN0cm95X3dvcmtxdWV1ZShzdGF0dXNfcXVldWUpOwotCQlkZXN0cm95X3dvcmtxdWV1ZShjb21tYW5kX3F1ZXVlKTsKLQkJZGVzdHJveV93b3JrcXVldWUocmVzcG9uZF9xdWV1ZSk7CiAJCXByX2VycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkXG4iLCByZXN1bHQpOwogCX0KIAlyZXR1cm4gcmVzdWx0OwogCi1lcnJfcmVzcG9uZF9xdWV1ZToKLQlkZXN0cm95X3dvcmtxdWV1ZShjb21tYW5kX3F1ZXVlKTsKLWVycl9jb21tYW5kX3F1ZXVlOgotCWRlc3Ryb3lfd29ya3F1ZXVlKHN0YXR1c19xdWV1ZSk7Ci1lcnJfc3RhdHVzX3F1ZXVlOgotCXByX2VycigiJXMgY291bGRuJ3QgY3JlYXRlIHdvcmtxdWV1ZVxuIiwgZnRkaV9lbGFuX2RyaXZlci5uYW1lKTsKLQlyZXR1cm4gLUVOT01FTTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZ0ZGlfZWxhbl9leGl0KHZvaWQpCkBAIC0yODgyLDE1ICsyODQ5LDcgQEAKIAkJZnRkaV9zdGF0dXNfY2FuY2VsX3dvcmsoZnRkaSk7CiAJCWZ0ZGlfY29tbWFuZF9jYW5jZWxfd29yayhmdGRpKTsKIAkJZnRkaV9yZXNwb25zZV9jYW5jZWxfd29yayhmdGRpKTsKLQl9IGZsdXNoX3dvcmtxdWV1ZShzdGF0dXNfcXVldWUpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKHN0YXR1c19xdWV1ZSk7Ci0Jc3RhdHVzX3F1ZXVlID0gTlVMTDsKLQlmbHVzaF93b3JrcXVldWUoY29tbWFuZF9xdWV1ZSk7Ci0JZGVzdHJveV93b3JrcXVldWUoY29tbWFuZF9xdWV1ZSk7Ci0JY29tbWFuZF9xdWV1ZSA9IE5VTEw7Ci0JZmx1c2hfd29ya3F1ZXVlKHJlc3BvbmRfcXVldWUpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKHJlc3BvbmRfcXVldWUpOwotCXJlc3BvbmRfcXVldWUgPSBOVUxMOworCX0KIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2lkbW91c2UuYyBiL2RyaXZlcnMvdXNiL21pc2MvaWRtb3VzZS5jCmluZGV4IDUxMDUzOTcuLjI5NzVlODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvaWRtb3VzZS5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvaWRtb3VzZS5jCkBAIC0zNjYsNyArMzY2LDYgQEAKIAkJCWttYWxsb2MoSU1HU0laRSArIGRldi0+YnVsa19pbl9zaXplLCBHRlBfS0VSTkVMKTsKIAogCQlpZiAoIWRldi0+YnVsa19pbl9idWZmZXIpIHsKLQkJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIGlucHV0IGJ1ZmZlci5cbiIpOwogCQkJaWRtb3VzZV9kZWxldGUoZGV2KTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2lvd2Fycmlvci5jIGIvZHJpdmVycy91c2IvbWlzYy9pb3dhcnJpb3IuYwppbmRleCAxOTUwZTg3Li4wOTU3NzhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2lvd2Fycmlvci5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvaW93YXJyaW9yLmMKQEAgLTI3OCw3ICsyNzgsNyBAQAogCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAogCS8qIHZlcmlmeSB0aGF0IHRoZSBkZXZpY2Ugd2Fzbid0IHVucGx1Z2dlZCAqLwotCWlmIChkZXYgPT0gTlVMTCB8fCAhZGV2LT5wcmVzZW50KQorCWlmICghZGV2IHx8ICFkZXYtPnByZXNlbnQpCiAJCXJldHVybiAtRU5PREVWOwogCiAJZGV2X2RiZygmZGV2LT5pbnRlcmZhY2UtPmRldiwgIm1pbm9yICVkLCBjb3VudCA9ICV6ZFxuIiwKQEAgLTQxMyw4ICs0MTMsNiBAQAogCQlpbnRfb3V0X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghaW50X291dF91cmIpIHsKIAkJCXJldHZhbCA9IC1FTk9NRU07Ci0JCQlkZXZfZGJnKCZkZXYtPmludGVyZmFjZS0+ZGV2LAotCQkJCSJVbmFibGUgdG8gYWxsb2NhdGUgdXJiXG4iKTsKIAkJCWdvdG8gZXJyb3Jfbm9fdXJiOwogCQl9CiAJCWJ1ZiA9IHVzYl9hbGxvY19jb2hlcmVudChkZXYtPnVkZXYsIGRldi0+cmVwb3J0X3NpemUsCkBAIC00ODIsOSArNDgwLDggQEAKIAlpbnQgaW9fcmVzOwkJLyogY2hlY2tzIGZvciBieXRlcyByZWFkL3dyaXR0ZW4gYW5kIGNvcHlfdG8vZnJvbV91c2VyIHJlc3VsdHMgKi8KIAogCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpZiAoZGV2ID09IE5VTEwpIHsKKwlpZiAoIWRldikKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JfQogCiAJYnVmZmVyID0ga3phbGxvYyhkZXYtPnJlcG9ydF9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikKQEAgLTY1NCw5ICs2NTEsOCBAQAogCWludCByZXR2YWwgPSAwOwogCiAJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWlmIChkZXYgPT0gTlVMTCkgeworCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKLQl9CiAKIAlkZXZfZGJnKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAibWlub3IgJWRcbiIsIGRldi0+bWlub3IpOwogCkBAIC03NjYsMTAgKzc2Miw4IEBACiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGluaXRpYWxpemUgaXQgKi8KIAlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW93YXJyaW9yKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFkZXYpCiAJCXJldHVybiByZXR2YWw7Ci0JfQogCiAJbXV0ZXhfaW5pdCgmZGV2LT5tdXRleCk7CiAKQEAgLTgxMiwxNSArODA2LDExIEBACiAKIAkvKiBjcmVhdGUgdGhlIHVyYiBhbmQgYnVmZmVyIGZvciByZWFkaW5nICovCiAJZGV2LT5pbnRfaW5fdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+aW50X2luX3VyYikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9pbl91cmJcbiIpOworCWlmICghZGV2LT5pbnRfaW5fdXJiKQogCQlnb3RvIGVycm9yOwotCX0KIAlkZXYtPmludF9pbl9idWZmZXIgPSBrbWFsbG9jKGRldi0+cmVwb3J0X3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5pbnRfaW5fYnVmZmVyKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50X2luX2J1ZmZlclxuIik7CisJaWYgKCFkZXYtPmludF9pbl9idWZmZXIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCXVzYl9maWxsX2ludF91cmIoZGV2LT5pbnRfaW5fdXJiLCBkZXYtPnVkZXYsCiAJCQkgdXNiX3JjdmludHBpcGUoZGV2LT51ZGV2LAogCQkJCQlkZXYtPmludF9pbl9lbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCkBAIC04MzEsMTAgKzgyMSw4IEBACiAJZGV2LT5yZWFkX3F1ZXVlID0KIAkgICAga21hbGxvYygoKGRldi0+cmVwb3J0X3NpemUgKyAxKSAqIE1BWF9JTlRFUlJVUFRfQlVGRkVSKSwKIAkJICAgIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5yZWFkX3F1ZXVlKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgcmVhZF9xdWV1ZVxuIik7CisJaWYgKCFkZXYtPnJlYWRfcXVldWUpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCS8qIEdldCB0aGUgc2VyaWFsLW51bWJlciBvZiB0aGUgY2hpcCAqLwogCW1lbXNldChkZXYtPmNoaXBfc2VyaWFsLCAweDAwLCBzaXplb2YoZGV2LT5jaGlwX3NlcmlhbCkpOwogCXVzYl9zdHJpbmcodWRldiwgdWRldi0+ZGVzY3JpcHRvci5pU2VyaWFsTnVtYmVyLCBkZXYtPmNoaXBfc2VyaWFsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9sZHVzYi5jIGIvZHJpdmVycy91c2IvbWlzYy9sZHVzYi5jCmluZGV4IGNjZTIyZmYuLjljYTU5NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvbGR1c2IuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMKQEAgLTY1OCwxMCArNjU4LDggQEAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGluaXRpYWxpemUgaXQgKi8KIAogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGV2ID09IE5VTEwpIHsKLQkJZGV2X2VycigmaW50Zi0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFkZXYpCiAJCWdvdG8gZXhpdDsKLQl9CiAJbXV0ZXhfaW5pdCgmZGV2LT5tdXRleCk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+cmJzbCk7CiAJZGV2LT5pbnRmID0gaW50ZjsKQEAgLTY3NCwxMCArNjcyLDggQEAKIAkgICAgIChsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gVVNCX0RFVklDRV9JRF9MRF9DT00zTEFCKSkgJiYKIAkgICAgKGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSA8PSAweDEwMykpIHsKIAkJYnVmZmVyID0ga21hbGxvYygyNTYsIEdGUF9LRVJORUwpOwotCQlpZiAoYnVmZmVyID09IE5VTEwpIHsKLQkJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIHN0cmluZyBidWZmZXJcbiIpOworCQlpZiAoIWJ1ZmZlcikKIAkJCWdvdG8gZXJyb3I7Ci0JCX0KIAkJLyogdXNiX3N0cmluZyBtYWtlcyBTRVRVUCtTVEFMTCB0byBsZWF2ZSBhbHdheXMgQ29udHJvbFJlYWRMb29wICovCiAJCXVzYl9zdHJpbmcodWRldiwgMjU1LCBidWZmZXIsIDI1Nik7CiAJCWtmcmVlKGJ1ZmZlcik7CkBAIC03MDQsMzIgKzcwMCwyMiBAQAogCiAJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSA9IHVzYl9lbmRwb2ludF9tYXhwKGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50KTsKIAlkZXYtPnJpbmdfYnVmZmVyID0ga21hbGxvYyhyaW5nX2J1ZmZlcl9zaXplKihzaXplb2Yoc2l6ZV90KStkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPnJpbmdfYnVmZmVyKSB7Ci0JCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIHJpbmdfYnVmZmVyXG4iKTsKKwlpZiAoIWRldi0+cmluZ19idWZmZXIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWRldi0+aW50ZXJydXB0X2luX2J1ZmZlciA9IGttYWxsb2MoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmludGVycnVwdF9pbl9idWZmZXIpIHsKLQkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX2J1ZmZlclxuIik7CisJaWYgKCFkZXYtPmludGVycnVwdF9pbl9idWZmZXIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWRldi0+aW50ZXJydXB0X2luX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmludGVycnVwdF9pbl91cmIpIHsKLQkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX3VyYlxuIik7CisJaWYgKCFkZXYtPmludGVycnVwdF9pbl91cmIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplID0gZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID8gdXNiX2VuZHBvaW50X21heHAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50KSA6CiAJCQkJCQkJCQkgdWRldi0+ZGVzY3JpcHRvci5iTWF4UGFja2V0U2l6ZTA7CiAJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciA9IGttYWxsb2Mod3JpdGVfYnVmZmVyX3NpemUqZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcikgewotCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X2J1ZmZlclxuIik7CisJaWYgKCFkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyKQogCQlnb3RvIGVycm9yOwotCX0KIAlkZXYtPmludGVycnVwdF9vdXRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+aW50ZXJydXB0X291dF91cmIpIHsKLQkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X291dF91cmJcbiIpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYikKIAkJZ290byBlcnJvcjsKLQl9CiAJZGV2LT5pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgPSBtaW5faW50ZXJydXB0X2luX2ludGVydmFsID4gZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJJbnRlcnZhbCA/IG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgOiBkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+YkludGVydmFsOwogCWlmIChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQpCiAJCWRldi0+aW50ZXJydXB0X291dF9pbnRlcnZhbCA9IG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsID4gZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50LT5iSW50ZXJ2YWwgPyBtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCA6IGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+YkludGVydmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9sZWdvdXNidG93ZXIuYyBiL2RyaXZlcnMvdXNiL21pc2MvbGVnb3VzYnRvd2VyLmMKaW5kZXggNzc3MWJlMy4uYzhmYmU3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9sZWdvdXNidG93ZXIuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2xlZ291c2J0b3dlci5jCkBAIC04MTcsMTAgKzgxNyw4IEBACiAKIAlkZXYgPSBrbWFsbG9jIChzaXplb2Yoc3RydWN0IGxlZ29fdXNiX3Rvd2VyKSwgR0ZQX0tFUk5FTCk7CiAKLQlpZiAoZGV2ID09IE5VTEwpIHsKLQkJZGV2X2VycihpZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFkZXYpCiAJCWdvdG8gZXhpdDsKLQl9CiAKIAltdXRleF9pbml0KCZkZXYtPmxvY2spOwogCkBAIC04NzEsNTEgKzg2OSwyMyBAQAogCX0KIAogCWRldi0+cmVhZF9idWZmZXIgPSBrbWFsbG9jIChyZWFkX2J1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+cmVhZF9idWZmZXIpIHsKLQkJZGV2X2VycihpZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgcmVhZF9idWZmZXJcbiIpOworCWlmICghZGV2LT5yZWFkX2J1ZmZlcikKIAkJZ290byBlcnJvcjsKLQl9CiAJZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyID0ga21hbGxvYyAodXNiX2VuZHBvaW50X21heHAoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+aW50ZXJydXB0X2luX2J1ZmZlcikgewotCQlkZXZfZXJyKGlkZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfaW5fYnVmZmVyXG4iKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X2luX2J1ZmZlcikKIAkJZ290byBlcnJvcjsKLQl9CiAJZGV2LT5pbnRlcnJ1cHRfaW5fdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+aW50ZXJydXB0X2luX3VyYikgewotCQlkZXZfZXJyKGlkZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfaW5fdXJiXG4iKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X2luX3VyYikKIAkJZ290byBlcnJvcjsKLQl9CiAJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciA9IGttYWxsb2MgKHdyaXRlX2J1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+aW50ZXJydXB0X291dF9idWZmZXIpIHsKLQkJZGV2X2VycihpZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X291dF9idWZmZXJcbiIpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcikKIAkJZ290byBlcnJvcjsKLQl9CiAJZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmludGVycnVwdF9vdXRfdXJiKSB7Ci0JCWRldl9lcnIoaWRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9vdXRfdXJiXG4iKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF91cmIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWRldi0+aW50ZXJydXB0X2luX2ludGVydmFsID0gaW50ZXJydXB0X2luX2ludGVydmFsID8gaW50ZXJydXB0X2luX2ludGVydmFsIDogZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJJbnRlcnZhbDsKIAlkZXYtPmludGVycnVwdF9vdXRfaW50ZXJ2YWwgPSBpbnRlcnJ1cHRfb3V0X2ludGVydmFsID8gaW50ZXJydXB0X291dF9pbnRlcnZhbCA6IGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+YkludGVydmFsOwogCi0JLyogd2UgY2FuIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugbm93LCBhcyBpdCBpcyByZWFkeSAqLwotCXVzYl9zZXRfaW50ZmRhdGEgKGludGVyZmFjZSwgZGV2KTsKLQotCXJldHZhbCA9IHVzYl9yZWdpc3Rlcl9kZXYgKGludGVyZmFjZSwgJnRvd2VyX2NsYXNzKTsKLQotCWlmIChyZXR2YWwpIHsKLQkJLyogc29tZXRoaW5nIHByZXZlbnRlZCB1cyBmcm9tIHJlZ2lzdGVyaW5nIHRoaXMgZHJpdmVyICovCi0JCWRldl9lcnIoaWRldiwgIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciB0aGlzIGRldmljZS5cbiIpOwotCQl1c2Jfc2V0X2ludGZkYXRhIChpbnRlcmZhY2UsIE5VTEwpOwotCQlnb3RvIGVycm9yOwotCX0KLQlkZXYtPm1pbm9yID0gaW50ZXJmYWNlLT5taW5vcjsKLQotCS8qIGxldCB0aGUgdXNlciBrbm93IHdoYXQgbm9kZSB0aGlzIGRldmljZSBpcyBub3cgYXR0YWNoZWQgdG8gKi8KLQlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJMRUdPIFVTQiBUb3dlciAjJWQgbm93IGF0dGFjaGVkIHRvIG1ham9yICIKLQkJICIlZCBtaW5vciAlZFxuIiwgKGRldi0+bWlub3IgLSBMRUdPX1VTQl9UT1dFUl9NSU5PUl9CQVNFKSwKLQkJIFVTQl9NQUpPUiwgZGV2LT5taW5vcik7Ci0KIAkvKiBnZXQgdGhlIGZpcm13YXJlIHZlcnNpb24gYW5kIGxvZyBpdCAqLwogCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyAodWRldiwKIAkJCQkgIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKQEAgLTkzNiw2ICs5MDYsMjMgQEAKIAkJIGdldF92ZXJzaW9uX3JlcGx5Lm1pbm9yLAogCQkgbGUxNl90b19jcHUoZ2V0X3ZlcnNpb25fcmVwbHkuYnVpbGRfbm8pKTsKIAorCS8qIHdlIGNhbiByZWdpc3RlciB0aGUgZGV2aWNlIG5vdywgYXMgaXQgaXMgcmVhZHkgKi8KKwl1c2Jfc2V0X2ludGZkYXRhIChpbnRlcmZhY2UsIGRldik7CisKKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXJfZGV2IChpbnRlcmZhY2UsICZ0b3dlcl9jbGFzcyk7CisKKwlpZiAocmV0dmFsKSB7CisJCS8qIHNvbWV0aGluZyBwcmV2ZW50ZWQgdXMgZnJvbSByZWdpc3RlcmluZyB0aGlzIGRyaXZlciAqLworCQlkZXZfZXJyKGlkZXYsICJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UuXG4iKTsKKwkJdXNiX3NldF9pbnRmZGF0YSAoaW50ZXJmYWNlLCBOVUxMKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZGV2LT5taW5vciA9IGludGVyZmFjZS0+bWlub3I7CisKKwkvKiBsZXQgdGhlIHVzZXIga25vdyB3aGF0IG5vZGUgdGhpcyBkZXZpY2UgaXMgbm93IGF0dGFjaGVkIHRvICovCisJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiTEVHTyBVU0IgVG93ZXIgIyVkIG5vdyBhdHRhY2hlZCB0byBtYWpvciAiCisJCSAiJWQgbWlub3IgJWRcbiIsIChkZXYtPm1pbm9yIC0gTEVHT19VU0JfVE9XRVJfTUlOT1JfQkFTRSksCisJCSBVU0JfTUFKT1IsIGRldi0+bWlub3IpOwogCiBleGl0OgogCXJldHVybiByZXR2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2x2c3Rlc3QuYyBiL2RyaXZlcnMvdXNiL21pc2MvbHZzdGVzdC5jCmluZGV4IDg2YjRlNGIuLjc3MTc2NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvbHZzdGVzdC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvbHZzdGVzdC5jCkBAIC0zNCw4ICszNCw2IEBACiAJc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciBkZXNjcmlwdG9yOwogCS8qIHVyYiBmb3IgcG9sbGluZyBpbnRlcnJ1cHQgcGlwZSAqLwogCXN0cnVjdCB1cmIgKnVyYjsKLQkvKiBMVlMgUkggd29yayBxdWV1ZSAqLwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpyaF9xdWV1ZTsKIAkvKiBMVkggUkggd29yayAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdAlyaF93b3JrOwogCS8qIFJIIHBvcnQgc3RhdHVzICovCkBAIC0yNDcsMTAgKzI0NSw4IEBACiAJaW50IHJldDsKIAogCWRlc2NyaXB0b3IgPSBrbWFsbG9jKHNpemVvZigqZGVzY3JpcHRvciksIEdGUF9LRVJORUwpOwotCWlmICghZGVzY3JpcHRvcikgewotCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBkZXNjcmlwdG9yIG1lbW9yeVxuIik7CisJaWYgKCFkZXNjcmlwdG9yKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAl1ZGV2ID0gY3JlYXRlX2x2c19kZXZpY2UoaW50Zik7CiAJaWYgKCF1ZGV2KSB7CkBAIC0zNTUsNyArMzUxLDcgQEAKIHsKIAlzdHJ1Y3QgbHZzX3JoICpsdnMgPSB1cmItPmNvbnRleHQ7CiAKLQlxdWV1ZV93b3JrKGx2cy0+cmhfcXVldWUsICZsdnMtPnJoX3dvcmspOworCXNjaGVkdWxlX3dvcmsoJmx2cy0+cmhfd29yayk7CiB9CiAKIHN0YXRpYyBpbnQgbHZzX3JoX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLApAQCAtMzk3LDI0ICszOTMsMTUgQEAKIAogCS8qIHN1Ym1pdCB1cmIgdG8gcG9sbCBpbnRlcnJ1cHQgZW5kcG9pbnQgKi8KIAlsdnMtPnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFsdnMtPnVyYikgewotCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJjb3VsZG4ndCBhbGxvY2F0ZSBsdnMgdXJiXG4iKTsKKwlpZiAoIWx2cy0+dXJiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlsdnMtPnJoX3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImx2c19yaF9xdWV1ZSIpOwotCWlmICghbHZzLT5yaF9xdWV1ZSkgewotCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJjb3VsZG4ndCBjcmVhdGUgd29ya3F1ZXVlXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmcmVlX3VyYjsKLQl9CiAKIAlJTklUX1dPUksoJmx2cy0+cmhfd29yaywgbHZzX3JoX3dvcmspOwogCiAJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZpbnRmLT5kZXYua29iaiwgJmx2c19hdHRyX2dyb3VwKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJGYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIG5vZGUgJWRcbiIsIHJldCk7Ci0JCWdvdG8gZGVzdHJveV9xdWV1ZTsKKwkJZ290byBmcmVlX3VyYjsKIAl9CiAKIAlwaXBlID0gdXNiX3JjdmludHBpcGUoaGRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOwpAQCAtNDMyLDggKzQxOSw2IEBACiAKIHN5c2ZzX3JlbW92ZToKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJmludGYtPmRldi5rb2JqLCAmbHZzX2F0dHJfZ3JvdXApOwotZGVzdHJveV9xdWV1ZToKLQlkZXN0cm95X3dvcmtxdWV1ZShsdnMtPnJoX3F1ZXVlKTsKIGZyZWVfdXJiOgogCXVzYl9mcmVlX3VyYihsdnMtPnVyYik7CiAJcmV0dXJuIHJldDsKQEAgLTQ0NCw3ICs0MjksNyBAQAogCXN0cnVjdCBsdnNfcmggKmx2cyA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJmludGYtPmRldi5rb2JqLCAmbHZzX2F0dHJfZ3JvdXApOwotCWRlc3Ryb3lfd29ya3F1ZXVlKGx2cy0+cmhfcXVldWUpOworCWZsdXNoX3dvcmsoJmx2cy0+cmhfd29yayk7CiAJdXNiX2ZyZWVfdXJiKGx2cy0+dXJiKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9zaXN1c2J2Z2Evc2lzdXNiLmMgYi9kcml2ZXJzL3VzYi9taXNjL3Npc3VzYnZnYS9zaXN1c2IuYwppbmRleCAwMmFiZmNkLi4wNWJkMzlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3Npc3VzYnZnYS9zaXN1c2IuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3Npc3VzYnZnYS9zaXN1c2IuYwpAQCAtMzA4NCw3ICszMDg0LDYgQEAKIAkvKiBBbGxvY2F0ZSBVUkJzICovCiAJc2lzdXNiLT5zaXN1cmJpbiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzaXN1c2ItPnNpc3VyYmluKSB7Ci0JCWRldl9lcnIoJnNpc3VzYi0+c2lzdXNiX2Rldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIFVSQnNcbiIpOwogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yXzM7CiAJfQpAQCAtMzA5Myw4ICszMDkyLDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgc2lzdXNiLT5udW1vYnVmczsgaSsrKSB7CiAJCXNpc3VzYi0+c2lzdXJib3V0W2ldID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFzaXN1c2ItPnNpc3VyYm91dFtpXSkgewotCQkJZGV2X2Vycigmc2lzdXNiLT5zaXN1c2JfZGV2LT5kZXYsCi0JCQkJCSJGYWlsZWQgdG8gYWxsb2NhdGUgVVJCc1xuIik7CiAJCQlyZXR2YWwgPSAtRU5PTUVNOwogCQkJZ290byBlcnJvcl80OwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3RyYW5jZXZpYnJhdG9yLmMgYi9kcml2ZXJzL3VzYi9taXNjL3RyYW5jZXZpYnJhdG9yLmMKaW5kZXggNDE0NTMxNC4uOTc5NTQ1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy90cmFuY2V2aWJyYXRvci5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvdHJhbmNldmlicmF0b3IuYwpAQCAtOTUsOCArOTUsNyBAQAogCWludCByZXR2YWw7CiAKIAlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHJhbmNldmlicmF0b3IpLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGV2ID09IE5VTEwpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWRldikgewogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvdXNiNDYwNC5jIGIvZHJpdmVycy91c2IvbWlzYy91c2I0NjA0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlmMzdmYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvdXNiNDYwNC5jCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogRHJpdmVyIGZvciBTTVNDIFVTQjQ2MDQgVVNCIEhTSUMgNC1wb3J0IDIuMCBodWIgY29udHJvbGxlciBkcml2ZXIKKyAqIEJhc2VkIG9uIHVzYjM1MDMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMgRG9uZ2ppbiBLaW0gKHRvYmV0dGVyQGdtYWlsLmNvbSkKKyAqIENvcHlyaWdodCAoYykgMjAxNiBMaW5hcm8gTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorCitlbnVtIHVzYjQ2MDRfbW9kZSB7CisJVVNCNDYwNF9NT0RFX1VOS05PV04sCisJVVNCNDYwNF9NT0RFX0hVQiwKKwlVU0I0NjA0X01PREVfU1RBTkRCWSwKK307CisKK3N0cnVjdCB1c2I0NjA0IHsKKwllbnVtIHVzYjQ2MDRfbW9kZQltb2RlOworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IGdwaW9fZGVzYwkqZ3Bpb19yZXNldDsKK307CisKK3N0YXRpYyB2b2lkIHVzYjQ2MDRfcmVzZXQoc3RydWN0IHVzYjQ2MDQgKmh1YiwgaW50IHN0YXRlKQoreworCWdwaW9kX3NldF92YWx1ZV9jYW5zbGVlcChodWItPmdwaW9fcmVzZXQsIHN0YXRlKTsKKworCS8qIFdhaXQgZm9yIGkyYyBsb2dpYyB0byBjb21lIHVwICovCisJaWYgKHN0YXRlKQorCQltc2xlZXAoMjUwKTsKK30KKworc3RhdGljIGludCB1c2I0NjA0X2Nvbm5lY3Qoc3RydWN0IHVzYjQ2MDQgKmh1YikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBodWItPmRldjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCWludCBlcnI7CisJdTggY29ubmVjdF9jbWRbXSA9IHsgMHhhYSwgMHg1NSwgMHgwMCB9OworCisJdXNiNDYwNF9yZXNldChodWIsIDEpOworCisJZXJyID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgY29ubmVjdF9jbWQsIEFSUkFZX1NJWkUoY29ubmVjdF9jbWQpKTsKKwlpZiAoZXJyIDwgMCkgeworCQl1c2I0NjA0X3Jlc2V0KGh1YiwgMCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaHViLT5tb2RlID0gVVNCNDYwNF9NT0RFX0hVQjsKKwlkZXZfZGJnKGRldiwgInN3aXRjaGVkIHRvIEhVQiBtb2RlXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYjQ2MDRfc3dpdGNoX21vZGUoc3RydWN0IHVzYjQ2MDQgKmh1YiwgZW51bSB1c2I0NjA0X21vZGUgbW9kZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBodWItPmRldjsKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgVVNCNDYwNF9NT0RFX0hVQjoKKwkJZXJyID0gdXNiNDYwNF9jb25uZWN0KGh1Yik7CisJCWJyZWFrOworCisJY2FzZSBVU0I0NjA0X01PREVfU1RBTkRCWToKKwkJdXNiNDYwNF9yZXNldChodWIsIDApOworCQlkZXZfZGJnKGRldiwgInN3aXRjaGVkIHRvIFNUQU5EQlkgbW9kZVxuIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJ1bmtub3duIG1vZGUgaXMgcmVxdWVzdGVkXG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB1c2I0NjA0X3Byb2JlKHN0cnVjdCB1c2I0NjA0ICpodWIpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaHViLT5kZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKKwlzdHJ1Y3QgZ3Bpb19kZXNjICpncGlvOworCXUzMiBtb2RlID0gVVNCNDYwNF9NT0RFX0hVQjsKKworCWdwaW8gPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbChkZXYsICJyZXNldCIsIEdQSU9EX09VVF9MT1cpOworCWlmIChJU19FUlIoZ3BpbykpCisJCXJldHVybiBQVFJfRVJSKGdwaW8pOworCWh1Yi0+Z3Bpb19yZXNldCA9IGdwaW87CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJpbml0aWFsLW1vZGUiLCAmaHViLT5tb2RlKSkKKwkJaHViLT5tb2RlID0gbW9kZTsKKworCXJldHVybiB1c2I0NjA0X3N3aXRjaF9tb2RlKGh1YiwgaHViLT5tb2RlKTsKK30KKworc3RhdGljIGludCB1c2I0NjA0X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYjQ2MDQgKmh1YjsKKworCWh1YiA9IGRldm1fa3phbGxvYygmaTJjLT5kZXYsIHNpemVvZigqaHViKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFodWIpCisJCXJldHVybiAtRU5PTUVNOworCisJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgaHViKTsKKwlodWItPmRldiA9ICZpMmMtPmRldjsKKworCXJldHVybiB1c2I0NjA0X3Byb2JlKGh1Yik7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgdXNiNDYwNF9pMmNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdXNiNDYwNCAqaHViID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwl1c2I0NjA0X3N3aXRjaF9tb2RlKGh1YiwgVVNCNDYwNF9NT0RFX1NUQU5EQlkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiNDYwNF9pMmNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB1c2I0NjA0ICpodWIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXVzYjQ2MDRfc3dpdGNoX21vZGUoaHViLCBodWItPm1vZGUpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHVzYjQ2MDRfaTJjX3BtX29wcywgdXNiNDYwNF9pMmNfc3VzcGVuZCwKKwkJdXNiNDYwNF9pMmNfcmVzdW1lKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHVzYjQ2MDRfaWRbXSA9IHsKKwl7ICJ1c2I0NjA0IiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB1c2I0NjA0X2lkKTsKKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdXNiNDYwNF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAic21zYyx1c2I0NjA0IiB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdXNiNDYwNF9vZl9tYXRjaCk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHVzYjQ2MDRfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ1c2I0NjA0IiwKKwkJLnBtID0gJnVzYjQ2MDRfaTJjX3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHVzYjQ2MDRfb2ZfbWF0Y2gpLAorCX0sCisJLnByb2JlCQk9IHVzYjQ2MDRfaTJjX3Byb2JlLAorCS5pZF90YWJsZQk9IHVzYjQ2MDRfaWQsCit9OworbW9kdWxlX2kyY19kcml2ZXIodXNiNDYwNF9pMmNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJVU0I0NjA0IFVTQiBIVUIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3VzYmxjZC5jIGIvZHJpdmVycy91c2IvbWlzYy91c2JsY2QuYwppbmRleCAxMTg0MzkwLi45ZjQ4NDE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3VzYmxjZC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvdXNibGNkLmMKQEAgLTMyMSwxMCArMzIxLDggQEAKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGV2ID09IE5VTEwpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWRldikKIAkJZ290byBlcnJvcjsKLQl9CiAJa3JlZl9pbml0KCZkZXYtPmtyZWYpOwogCXNlbWFfaW5pdCgmZGV2LT5saW1pdF9zZW0sIFVTQl9MQ0RfQ09OQ1VSUkVOVF9XUklURVMpOwogCWluaXRfdXNiX2FuY2hvcigmZGV2LT5zdWJtaXR0ZWQpOwpAQCAtMzUxLDExICszNDksOCBAQAogCQkJZGV2LT5idWxrX2luX3NpemUgPSBidWZmZXJfc2l6ZTsKIAkJCWRldi0+YnVsa19pbl9lbmRwb2ludEFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKIAkJCWRldi0+YnVsa19pbl9idWZmZXIgPSBrbWFsbG9jKGJ1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghZGV2LT5idWxrX2luX2J1ZmZlcikgewotCQkJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LAotCQkJCQkiQ291bGQgbm90IGFsbG9jYXRlIGJ1bGtfaW5fYnVmZmVyXG4iKTsKKwkJCWlmICghZGV2LT5idWxrX2luX2J1ZmZlcikKIAkJCQlnb3RvIGVycm9yOwotCQkJfQogCQl9CiAKIAkJaWYgKCFkZXYtPmJ1bGtfb3V0X2VuZHBvaW50QWRkciAmJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy91c2JzZXZzZWcuYyBiL2RyaXZlcnMvdXNiL21pc2MvdXNic2V2c2VnLmMKaW5kZXggMWZlNmI3My4uYTBiYTUyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy91c2JzZXZzZWcuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3VzYnNldnNlZy5jCkBAIC0xMjgsMTAgKzEyOCw4IEBACiAJCXJldHVybjsKIAogCWJ1ZmZlciA9IGt6YWxsb2MoTUFYTEVOLCBtZik7Ci0JaWYgKCFidWZmZXIpIHsKLQkJZGV2X2VycigmbXlkZXYtPnVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOworCWlmICghYnVmZmVyKQogCQlyZXR1cm47Ci0JfQogCiAJLyogVGhlIGRldmljZSBpcyByaWdodCB0byBsZWZ0LCB3aGVyZSBhcyB5b3Ugd3JpdGUgbGVmdCB0byByaWdodCAqLwogCWZvciAoaSA9IDA7IGkgPCBteWRldi0+dGV4dGxlbmd0aDsgaSsrKQpAQCAtMzQ2LDEwICszNDQsOCBAQAogCWludCByYyA9IC1FTk9NRU07CiAKIAlteWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2Jfc2V2c2VnZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG15ZGV2ID09IE5VTEwpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIW15ZGV2KQogCQlnb3RvIGVycm9yX21lbTsKLQl9CiAKIAlteWRldi0+dWRldiA9IHVzYl9nZXRfZGV2KHVkZXYpOwogCW15ZGV2LT5pbnRmID0gaW50ZXJmYWNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMgYi9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYwppbmRleCA2Yjk3OGYwLi41YzgyMTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYwpAQCAtNTg1LDcgKzU4NSw2IEBACiB7CiAJc3RydWN0IHVzYl9zZ19yZXF1ZXN0CSpyZXEgPSAoc3RydWN0IHVzYl9zZ19yZXF1ZXN0ICopIF9yZXE7CiAKLQlyZXEtPnN0YXR1cyA9IC1FVElNRURPVVQ7CiAJdXNiX3NnX2NhbmNlbChyZXEpOwogfQogCkBAIC02MTYsOCArNjE1LDEwIEBACiAJCW1vZF90aW1lcigmc2dfdGltZXIsIGppZmZpZXMgKwogCQkJCW1zZWNzX3RvX2ppZmZpZXMoU0lNUExFX0lPX1RJTUVPVVQpKTsKIAkJdXNiX3NnX3dhaXQocmVxKTsKLQkJZGVsX3RpbWVyX3N5bmMoJnNnX3RpbWVyKTsKLQkJcmV0dmFsID0gcmVxLT5zdGF0dXM7CisJCWlmICghZGVsX3RpbWVyX3N5bmMoJnNnX3RpbWVyKSkKKwkJCXJldHZhbCA9IC1FVElNRURPVVQ7CisJCWVsc2UKKwkJCXJldHZhbCA9IHJlcS0+c3RhdHVzOwogCiAJCS8qIEZJWE1FIGNoZWNrIHJlc3VsdGluZyBkYXRhIHBhdHRlcm4gKi8KIApAQCAtMjYwMiw3ICsyNjAzLDcgQEAKIAlrdGltZV9nZXRfdHM2NCgmc3RhcnQpOwogCiAJcmV0dmFsID0gdXNidGVzdF9kb19pb2N0bChpbnRmLCBwYXJhbV8zMik7Ci0JaWYgKHJldHZhbCkKKwlpZiAocmV0dmFsIDwgMCkKIAkJZ290byBmcmVlX211dGV4OwogCiAJa3RpbWVfZ2V0X3RzNjQoJmVuZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3VzczcyMC5jIGIvZHJpdmVycy91c2IvbWlzYy91c3M3MjAuYwppbmRleCBiYmQwMjljLi4zNTZkMzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3VzczcyMC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvdXNzNzIwLmMKQEAgLTE1MCwxMCArMTUwLDggQEAKIAlpZiAoIXVzYmRldikKIAkJcmV0dXJuIE5VTEw7CiAJcnEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdXNzNzIwX2FzeW5jX3JlcXVlc3QpLCBtZW1fZmxhZ3MpOwotCWlmICghcnEpIHsKLQkJZGV2X2VycigmdXNiZGV2LT5kZXYsICJzdWJtaXRfYXN5bmNfcmVxdWVzdCBvdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIXJxKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAJa3JlZl9pbml0KCZycS0+cmVmX2NvdW50KTsKIAlJTklUX0xJU1RfSEVBRCgmcnEtPmFzeW5jbGlzdCk7CiAJaW5pdF9jb21wbGV0aW9uKCZycS0+Y29tcGwpOwpAQCAtMTYyLDcgKzE2MCw2IEBACiAJcnEtPnVyYiA9IHVzYl9hbGxvY191cmIoMCwgbWVtX2ZsYWdzKTsKIAlpZiAoIXJxLT51cmIpIHsKIAkJa3JlZl9wdXQoJnJxLT5yZWZfY291bnQsIGRlc3Ryb3lfYXN5bmMpOwotCQlkZXZfZXJyKCZ1c2JkZXYtPmRldiwgInN1Ym1pdF9hc3luY19yZXF1ZXN0IG91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJcnEtPmRyID0ga21hbGxvYyhzaXplb2YoKnJxLT5kciksIG1lbV9mbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3l1cmV4LmMgYi9kcml2ZXJzL3VzYi9taXNjL3l1cmV4LmMKaW5kZXggMzQzZmE2Zi4uNTRlNTNhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy95dXJleC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MveXVyZXguYwpAQCAtMjAwLDEwICsyMDAsOCBAQAogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCiAJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwotCWlmICghZGV2KSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFkZXYpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWtyZWZfaW5pdCgmZGV2LT5rcmVmKTsKIAltdXRleF9pbml0KCZkZXYtPmlvX211dGV4KTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5sb2NrKTsKQEAgLTIzMSwxNyArMjI5LDEzIEBACiAKIAkvKiBhbGxvY2F0ZSBjb250cm9sIFVSQiAqLwogCWRldi0+Y250bF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5jbnRsX3VyYikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBjb250cm9sIFVSQlxuIik7CisJaWYgKCFkZXYtPmNudGxfdXJiKQogCQlnb3RvIGVycm9yOwotCX0KIAogCS8qIGFsbG9jYXRlIGJ1ZmZlciBmb3IgY29udHJvbCByZXEgKi8KIAlkZXYtPmNudGxfcmVxID0ga21hbGxvYyhZVVJFWF9CVUZfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmNudGxfcmVxKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiQ291bGQgbm90IGFsbG9jYXRlIGNudGxfcmVxXG4iKTsKKwlpZiAoIWRldi0+Y250bF9yZXEpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCiAJLyogYWxsb2NhdGUgYnVmZmVyIGZvciBjb250cm9sIG1zZyAqLwogCWRldi0+Y250bF9idWZmZXIgPSB1c2JfYWxsb2NfY29oZXJlbnQoZGV2LT51ZGV2LCBZVVJFWF9CVUZfU0laRSwKQEAgLTI2OSwxMCArMjYzLDggQEAKIAogCS8qIGFsbG9jYXRlIGludGVycnVwdCBVUkIgKi8KIAlkZXYtPnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPnVyYikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBVUkJcbiIpOworCWlmICghZGV2LT51cmIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCiAJLyogYWxsb2NhdGUgYnVmZmVyIGZvciBpbnRlcnJ1cHQgaW4gKi8KIAlkZXYtPmludF9idWZmZXIgPSB1c2JfYWxsb2NfY29oZXJlbnQoZGV2LT51ZGV2LCBZVVJFWF9CVUZfU0laRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZwppbmRleCA4ODY1MjZiLi43MmEyYTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCkBAIC04MiwxMiArODIsMTIgQEAKIAl0cmlzdGF0ZSAiREE4eHgvT01BUC1MMXgiCiAJZGVwZW5kcyBvbiBBUkNIX0RBVklOQ0lfREE4WFgKIAlkZXBlbmRzIG9uIE5PUF9VU0JfWENFSVYKLQlkZXBlbmRzIG9uIEJST0tFTgorCXNlbGVjdCBQSFlfREE4WFhfVVNCCiAKIGNvbmZpZyBVU0JfTVVTQl9UVVNCNjAxMAogCXRyaXN0YXRlICJUVVNCNjAxMCIKIAlkZXBlbmRzIG9uIEhBU19JT01FTQotCWRlcGVuZHMgb24gQVJDSF9PTUFQMlBMVVMgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiAoQVJDSF9PTUFQMlBMVVMgfHwgQ09NUElMRV9URVNUKSAmJiAhQkxBQ0tGSU4KIAlkZXBlbmRzIG9uIE5PUF9VU0JfWENFSVYgPSBVU0JfTVVTQl9IRFJDICMgYm90aCBidWlsdC1pbiBvciBib3RoIG1vZHVsZXMKIAogY29uZmlnIFVTQl9NVVNCX09NQVAyUExVUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9hbTM1eC5jIGIvZHJpdmVycy91c2IvbXVzYi9hbTM1eC5jCmluZGV4IGM0MWZlNTguLjUwY2E4MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvYW0zNXguYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL2FtMzV4LmMKQEAgLTQ3NCwxMCArNDc0LDggQEAKIAlpbnQJCQkJcmV0ID0gLUVOT01FTTsKIAogCWdsdWUgPSBremFsbG9jKHNpemVvZigqZ2x1ZSksIEdGUF9LRVJORUwpOwotCWlmICghZ2x1ZSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgZ2x1ZSBjb250ZXh0XG4iKTsKKwlpZiAoIWdsdWUpCiAJCWdvdG8gZXJyMDsKLQl9CiAKIAlwaHlfY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiZmNrIik7CiAJaWYgKElTX0VSUihwaHlfY2xrKSkgewpAQCAtNTEyLDggKzUxMCwxMCBAQAogCXBkYXRhLT5wbGF0Zm9ybV9vcHMJCT0gJmFtMzV4X29wczsKIAogCWdsdWUtPnBoeSA9IHVzYl9waHlfZ2VuZXJpY19yZWdpc3RlcigpOwotCWlmIChJU19FUlIoZ2x1ZS0+cGh5KSkKKwlpZiAoSVNfRVJSKGdsdWUtPnBoeSkpIHsKKwkJcmV0ID0gUFRSX0VSUihnbHVlLT5waHkpOwogCQlnb3RvIGVycjc7CisJfQogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGdsdWUpOwogCiAJcGluZm8gPSBhbTM1eF9kZXZfaW5mbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvZGE4eHguYyBiL2RyaXZlcnMvdXNiL211c2IvZGE4eHguYwppbmRleCBiMDNkM2I4Li4yMTBiN2U0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL2RhOHh4LmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9kYTh4eC5jCkBAIC0zMCwxMyArMzAsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi91c2JfcGh5X2dlbmVyaWMuaD4KIAotI2luY2x1ZGUgPG1hY2gvZGE4eHguaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3VzYi1kYXZpbmNpLmg+Ci0KICNpbmNsdWRlICJtdXNiX2NvcmUuaCIKIAogLyoKQEAgLTgwLDYxICs3OCwxNSBAQAogCiAjZGVmaW5lIERBOFhYX01FTlRPUl9DT1JFX09GRlNFVCAweDQwMAogCi0jZGVmaW5lIENGR0NISVAyCUlPX0FERFJFU1MoREE4WFhfU1lTQ0ZHMF9CQVNFICsgREE4WFhfQ0ZHQ0hJUDJfUkVHKQotCiBzdHJ1Y3QgZGE4eHhfZ2x1ZSB7CiAJc3RydWN0IGRldmljZQkJKmRldjsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSptdXNiOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBoeTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSp1c2JfcGh5OwogCXN0cnVjdCBjbGsJCSpjbGs7CisJc3RydWN0IHBoeQkJKnBoeTsKIH07CiAKIC8qCi0gKiBSRVZJU0lUIChQTSk6IHdlIHNob3VsZCBiZSBhYmxlIHRvIGtlZXAgdGhlIFBIWSBpbiBsb3cgcG93ZXIgbW9kZSBtb3N0Ci0gKiBvZiB0aGUgdGltZSAoMjQgTUh6IG9zY2lsbGF0b3IgYW5kIFBMTCBvZmYsIGV0Yy4pIGJ5IHNldHRpbmcgUE9XRVIuRDAKLSAqIGFuZCwgd2hlbiBpbiBob3N0IG1vZGUsIGF1dG9zdXNwZW5kaW5nIGlkbGUgcm9vdCBwb3J0cy4uLiBQSFlfUExMT04KLSAqIChvdmVycmlkaW5nIFNVU1BFTkRNPykgdGhlbiBsaWtlbHkgbmVlZHMgdG8gc3RheSBvZmYuCi0gKi8KLQotc3RhdGljIGlubGluZSB2b2lkIHBoeV9vbih2b2lkKQotewotCXUzMiBjZmdjaGlwMiA9IF9fcmF3X3JlYWRsKENGR0NISVAyKTsKLQotCS8qCi0JICogU3RhcnQgdGhlIG9uLWNoaXAgUEhZIGFuZCBpdHMgUExMLgotCSAqLwotCWNmZ2NoaXAyICY9IH4oQ0ZHQ0hJUDJfUkVTRVQgfCBDRkdDSElQMl9QSFlQV1JETiB8IENGR0NISVAyX09UR1BXUkROKTsKLQljZmdjaGlwMiB8PSBDRkdDSElQMl9QSFlfUExMT047Ci0JX19yYXdfd3JpdGVsKGNmZ2NoaXAyLCBDRkdDSElQMik7Ci0KLQlwcl9pbmZvKCJXYWl0aW5nIGZvciBVU0IgUEhZIGNsb2NrIGdvb2QuLi5cbiIpOwotCXdoaWxlICghKF9fcmF3X3JlYWRsKENGR0NISVAyKSAmIENGR0NISVAyX1BIWUNMS0dEKSkKLQkJY3B1X3JlbGF4KCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwaHlfb2ZmKHZvaWQpCi17Ci0JdTMyIGNmZ2NoaXAyID0gX19yYXdfcmVhZGwoQ0ZHQ0hJUDIpOwotCi0JLyoKLQkgKiBFbnN1cmUgdGhhdCBVU0IgMS4xIHJlZmVyZW5jZSBjbG9jayBpcyBub3QgYmVpbmcgc291cmNlZCBmcm9tCi0JICogVVNCIDIuMCBQSFkuICBPdGhlcndpc2UgZG8gbm90IHBvd2VyIGRvd24gdGhlIFBIWS4KLQkgKi8KLQlpZiAoIShjZmdjaGlwMiAmIENGR0NISVAyX1VTQjFQSFlDTEtNVVgpICYmCi0JICAgICAoY2ZnY2hpcDIgJiBDRkdDSElQMl9VU0IxU1VTUEVORE0pKSB7Ci0JCXByX3dhcm5pbmcoIlVTQiAxLjEgY2xvY2tlZCBmcm9tIFVTQiAyLjAgUEhZIC0tICIKLQkJCSAgICJjYW4ndCBwb3dlciBpdCBkb3duXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogUG93ZXIgZG93biB0aGUgb24tY2hpcCBQSFkuCi0JICovCi0JY2ZnY2hpcDIgfD0gQ0ZHQ0hJUDJfUEhZUFdSRE4gfCBDRkdDSElQMl9PVEdQV1JETjsKLQlfX3Jhd193cml0ZWwoY2ZnY2hpcDIsIENGR0NISVAyKTsKLX0KLQotLyoKICAqIEJlY2F1c2Ugd2UgZG9uJ3Qgc2V0IENUUkwuVUlOVCwgaXQncyAiaW1wb3J0YW50IiB0bzoKICAqCS0gbm90IHJlYWQvd3JpdGUgSU5UUlVTQi9JTlRSVVNCRSAoZXhjZXB0IGR1cmluZwogICoJICBpbml0aWFsIHNldHVwLCBhcyBhIHdvcmthcm91bmQpOwpAQCAtMzg1LDI5ICszMzcsMjkgQEAKIAogc3RhdGljIGludCBkYTh4eF9tdXNiX3NldF9tb2RlKHN0cnVjdCBtdXNiICptdXNiLCB1OCBtdXNiX21vZGUpCiB7Ci0JdTMyIGNmZ2NoaXAyID0gX19yYXdfcmVhZGwoQ0ZHQ0hJUDIpOworCXN0cnVjdCBkYTh4eF9nbHVlICpnbHVlID0gZGV2X2dldF9kcnZkYXRhKG11c2ItPmNvbnRyb2xsZXItPnBhcmVudCk7CisJZW51bSBwaHlfbW9kZSBwaHlfbW9kZTsKIAotCWNmZ2NoaXAyICY9IH5DRkdDSElQMl9PVEdNT0RFOwogCXN3aXRjaCAobXVzYl9tb2RlKSB7CiAJY2FzZSBNVVNCX0hPU1Q6CQkvKiBGb3JjZSBWQlVTIHZhbGlkLCBJRCA9IDAgKi8KLQkJY2ZnY2hpcDIgfD0gQ0ZHQ0hJUDJfRk9SQ0VfSE9TVDsKKwkJcGh5X21vZGUgPSBQSFlfTU9ERV9VU0JfSE9TVDsKIAkJYnJlYWs7CiAJY2FzZSBNVVNCX1BFUklQSEVSQUw6CS8qIEZvcmNlIFZCVVMgdmFsaWQsIElEID0gMSAqLwotCQljZmdjaGlwMiB8PSBDRkdDSElQMl9GT1JDRV9ERVZJQ0U7CisJCXBoeV9tb2RlID0gUEhZX01PREVfVVNCX0RFVklDRTsKIAkJYnJlYWs7CiAJY2FzZSBNVVNCX09URzoJCS8qIERvbid0IG92ZXJyaWRlIHRoZSBWQlVTL0lEIGNvbXBhcmF0b3JzICovCi0JCWNmZ2NoaXAyIHw9IENGR0NISVAyX05PX09WRVJSSURFOworCQlwaHlfbW9kZSA9IFBIWV9NT0RFX1VTQl9PVEc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIlRyeWluZyB0byBzZXQgdW5zdXBwb3J0ZWQgbW9kZSAldVxuIiwgbXVzYl9tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JX19yYXdfd3JpdGVsKGNmZ2NoaXAyLCBDRkdDSElQMik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHBoeV9zZXRfbW9kZShnbHVlLT5waHksIHBoeV9tb2RlKTsKIH0KIAogc3RhdGljIGludCBkYTh4eF9tdXNiX2luaXQoc3RydWN0IG11c2IgKm11c2IpCiB7CisJc3RydWN0IGRhOHh4X2dsdWUgKmdsdWUgPSBkZXZfZ2V0X2RydmRhdGEobXVzYi0+Y29udHJvbGxlci0+cGFyZW50KTsKIAl2b2lkIF9faW9tZW0gKnJlZ19iYXNlID0gbXVzYi0+Y3RybF9iYXNlOwogCXUzMiByZXY7CiAJaW50IHJldCA9IC1FTk9ERVY7CkBAIC00MjUsMzIgKzM3Nyw1NiBAQAogCQlnb3RvIGZhaWw7CiAJfQogCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGdsdWUtPmNsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGdsdWUtPmRldiwgImZhaWxlZCB0byBlbmFibGUgY2xvY2tcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCiAJc2V0dXBfdGltZXIoJm90Z193b3JrYXJvdW5kLCBvdGdfdGltZXIsICh1bnNpZ25lZCBsb25nKW11c2IpOwogCiAJLyogUmVzZXQgdGhlIGNvbnRyb2xsZXIgKi8KIAltdXNiX3dyaXRlbChyZWdfYmFzZSwgREE4WFhfVVNCX0NUUkxfUkVHLCBEQThYWF9TT0ZUX1JFU0VUX01BU0spOwogCiAJLyogU3RhcnQgdGhlIG9uLWNoaXAgUEhZIGFuZCBpdHMgUExMLiAqLwotCXBoeV9vbigpOworCXJldCA9IHBoeV9pbml0KGdsdWUtPnBoeSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGdsdWUtPmRldiwgIkZhaWxlZCB0byBpbml0IHBoeS5cbiIpOworCQlnb3RvIGVycl9waHlfaW5pdDsKKwl9CisKKwlyZXQgPSBwaHlfcG93ZXJfb24oZ2x1ZS0+cGh5KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZ2x1ZS0+ZGV2LCAiRmFpbGVkIHRvIHBvd2VyIG9uIHBoeS5cbiIpOworCQlnb3RvIGVycl9waHlfcG93ZXJfb247CisJfQogCiAJbXNsZWVwKDUpOwogCiAJLyogTk9URTogSVJRcyBhcmUgaW4gbWl4ZWQgbW9kZSwgbm90IGJ5cGFzcyB0byBwdXJlIE1VU0IgKi8KLQlwcl9kZWJ1ZygiREE4eHggT1RHIHJldmlzaW9uICUwOHgsIFBIWSAlMDN4LCBjb250cm9sICUwMnhcbiIsCi0JCSByZXYsIF9fcmF3X3JlYWRsKENGR0NISVAyKSwKKwlwcl9kZWJ1ZygiREE4eHggT1RHIHJldmlzaW9uICUwOHgsIGNvbnRyb2wgJTAyeFxuIiwgcmV2LAogCQkgbXVzYl9yZWFkYihyZWdfYmFzZSwgREE4WFhfVVNCX0NUUkxfUkVHKSk7CiAKIAltdXNiLT5pc3IgPSBkYTh4eF9tdXNiX2ludGVycnVwdDsKIAlyZXR1cm4gMDsKKworZXJyX3BoeV9wb3dlcl9vbjoKKwlwaHlfZXhpdChnbHVlLT5waHkpOworZXJyX3BoeV9pbml0OgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShnbHVlLT5jbGspOwogZmFpbDoKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGRhOHh4X211c2JfZXhpdChzdHJ1Y3QgbXVzYiAqbXVzYikKIHsKKwlzdHJ1Y3QgZGE4eHhfZ2x1ZSAqZ2x1ZSA9IGRldl9nZXRfZHJ2ZGF0YShtdXNiLT5jb250cm9sbGVyLT5wYXJlbnQpOworCiAJZGVsX3RpbWVyX3N5bmMoJm90Z193b3JrYXJvdW5kKTsKIAotCXBoeV9vZmYoKTsKKwlwaHlfcG93ZXJfb2ZmKGdsdWUtPnBoeSk7CisJcGh5X2V4aXQoZ2x1ZS0+cGh5KTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZ2x1ZS0+Y2xrKTsKIAogCXVzYl9wdXRfcGh5KG11c2ItPnhjZWl2KTsKIApAQCAtNDg2LDMwICs0NjIsMjUgQEAKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgbXVzYl9yZXNvdXJjZXNbMl07CiAJc3RydWN0IG11c2JfaGRyY19wbGF0Zm9ybV9kYXRhCSpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZQkJKm11c2I7CiAJc3RydWN0IGRhOHh4X2dsdWUJCSpnbHVlOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaW5mbwlwaW5mbzsKIAlzdHJ1Y3QgY2xrCQkJKmNsazsKKwlpbnQJCQkJcmV0OwogCi0JaW50CQkJCXJldCA9IC1FTk9NRU07CisJZ2x1ZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmdsdWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdsdWUpCisJCXJldHVybiAtRU5PTUVNOwogCi0JZ2x1ZSA9IGt6YWxsb2Moc2l6ZW9mKCpnbHVlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFnbHVlKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBnbHVlIGNvbnRleHRcbiIpOwotCQlnb3RvIGVycjA7Ci0JfQotCi0JY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAidXNiMjAiKTsKKwljbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInVzYjIwIik7CiAJaWYgKElTX0VSUihjbGspKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgY2xvY2tcbiIpOwotCQlyZXQgPSBQVFJfRVJSKGNsayk7Ci0JCWdvdG8gZXJyMzsKKwkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKIAl9CiAKLQlyZXQgPSBjbGtfZW5hYmxlKGNsayk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGNsb2NrXG4iKTsKLQkJZ290byBlcnI0OworCWdsdWUtPnBoeSA9IGRldm1fcGh5X2dldCgmcGRldi0+ZGV2LCAidXNiLXBoeSIpOworCWlmIChJU19FUlIoZ2x1ZS0+cGh5KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IHBoeVxuIik7CisJCXJldHVybiBQVFJfRVJSKGdsdWUtPnBoeSk7CiAJfQogCiAJZ2x1ZS0+ZGV2CQkJPSAmcGRldi0+ZGV2OwpAQCAtNTE3LDEwICs0ODgsMTEgQEAKIAogCXBkYXRhLT5wbGF0Zm9ybV9vcHMJCT0gJmRhOHh4X29wczsKIAotCWdsdWUtPnBoeSA9IHVzYl9waHlfZ2VuZXJpY19yZWdpc3RlcigpOwotCWlmIChJU19FUlIoZ2x1ZS0+cGh5KSkgewotCQlyZXQgPSBQVFJfRVJSKGdsdWUtPnBoeSk7Ci0JCWdvdG8gZXJyNTsKKwlnbHVlLT51c2JfcGh5ID0gdXNiX3BoeV9nZW5lcmljX3JlZ2lzdGVyKCk7CisJcmV0ID0gUFRSX0VSUl9PUl9aRVJPKGdsdWUtPnVzYl9waHkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHVzYl9waHlcbiIpOworCQlyZXR1cm4gcmV0OwogCX0KIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBnbHVlKTsKIApAQCAtNTQ0LDI4ICs1MTYsMTMgQEAKIAlwaW5mby5kYXRhID0gcGRhdGE7CiAJcGluZm8uc2l6ZV9kYXRhID0gc2l6ZW9mKCpwZGF0YSk7CiAKLQlnbHVlLT5tdXNiID0gbXVzYiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9mdWxsKCZwaW5mbyk7Ci0JaWYgKElTX0VSUihtdXNiKSkgewotCQlyZXQgPSBQVFJfRVJSKG11c2IpOworCWdsdWUtPm11c2IgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZnVsbCgmcGluZm8pOworCXJldCA9IFBUUl9FUlJfT1JfWkVSTyhnbHVlLT5tdXNiKTsKKwlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBtdXNiIGRldmljZTogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyNjsKKwkJdXNiX3BoeV9nZW5lcmljX3VucmVnaXN0ZXIoZ2x1ZS0+dXNiX3BoeSk7CiAJfQogCi0JcmV0dXJuIDA7Ci0KLWVycjY6Ci0JdXNiX3BoeV9nZW5lcmljX3VucmVnaXN0ZXIoZ2x1ZS0+cGh5KTsKLQotZXJyNToKLQljbGtfZGlzYWJsZShjbGspOwotCi1lcnI0OgotCWNsa19wdXQoY2xrKTsKLQotZXJyMzoKLQlrZnJlZShnbHVlKTsKLQotZXJyMDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01NzQsMTAgKzUzMSw3IEBACiAJc3RydWN0IGRhOHh4X2dsdWUJCSpnbHVlID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihnbHVlLT5tdXNiKTsKLQl1c2JfcGh5X2dlbmVyaWNfdW5yZWdpc3RlcihnbHVlLT5waHkpOwotCWNsa19kaXNhYmxlKGdsdWUtPmNsayk7Ci0JY2xrX3B1dChnbHVlLT5jbGspOwotCWtmcmVlKGdsdWUpOworCXVzYl9waHlfZ2VuZXJpY191bnJlZ2lzdGVyKGdsdWUtPnVzYl9waHkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYwppbmRleCA3NGZjMzA2Li4yN2RhZGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKQEAgLTE0NDgsNyArMTQ0OCw3IEBACiB7CiAJdTggcmVnOwogCWNoYXIgKnR5cGU7Ci0JY2hhciBhSW5mb1s5MF0sIGFSZXZpc2lvblszMl0sIGFEYXRlWzEyXTsKKwljaGFyIGFJbmZvWzkwXTsKIAl2b2lkIF9faW9tZW0JKm1iYXNlID0gbXVzYi0+bXJlZ3M7CiAJaW50CQlzdGF0dXMgPSAwOwogCWludAkJaTsKQEAgLTE0ODIsNyArMTQ4Miw2IEBACiAKIAlwcl9kZWJ1ZygiJXM6IENvbmZpZ0RhdGE9MHglMDJ4ICglcylcbiIsIG11c2JfZHJpdmVyX25hbWUsIHJlZywgYUluZm8pOwogCi0JYURhdGVbMF0gPSAwOwogCWlmIChNVVNCX0NPTlRST0xMRVJfTUhEUkMgPT0gbXVzYl90eXBlKSB7CiAJCW11c2ItPmlzX211bHRpcG9pbnQgPSAxOwogCQl0eXBlID0gIk0iOwpAQCAtMTQ5NywxMSArMTQ5NiwxMCBAQAogCiAJLyogbG9nIHJlbGVhc2UgaW5mbyAqLwogCW11c2ItPmh3dmVycyA9IG11c2JfcmVhZF9od3ZlcnMobWJhc2UpOwotCXNucHJpbnRmKGFSZXZpc2lvbiwgMzIsICIlZC4lZCVzIiwgTVVTQl9IV1ZFUlNfTUFKT1IobXVzYi0+aHd2ZXJzKSwKLQkJTVVTQl9IV1ZFUlNfTUlOT1IobXVzYi0+aHd2ZXJzKSwKLQkJKG11c2ItPmh3dmVycyAmIE1VU0JfSFdWRVJTX1JDKSA/ICJSQyIgOiAiIik7Ci0JcHJfZGVidWcoIiVzOiAlc0hEUkMgUlRMIHZlcnNpb24gJXMgJXNcbiIsCi0JCSBtdXNiX2RyaXZlcl9uYW1lLCB0eXBlLCBhUmV2aXNpb24sIGFEYXRlKTsKKwlwcl9kZWJ1ZygiJXM6ICVzSERSQyBSVEwgdmVyc2lvbiAlZC4lZCVzXG4iLAorCQkgbXVzYl9kcml2ZXJfbmFtZSwgdHlwZSwgTVVTQl9IV1ZFUlNfTUFKT1IobXVzYi0+aHd2ZXJzKSwKKwkJIE1VU0JfSFdWRVJTX01JTk9SKG11c2ItPmh3dmVycyksCisJCSAobXVzYi0+aHd2ZXJzICYgTVVTQl9IV1ZFUlNfUkMpID8gIlJDIiA6ICIiKTsKIAogCS8qIGNvbmZpZ3VyZSBlcDAgKi8KIAltdXNiX2NvbmZpZ3VyZV9lcDAobXVzYik7CkBAIC0xODMxLDExICsxODI5LDgwIEBACiAJLmF0dHJzID0gbXVzYl9hdHRyaWJ1dGVzLAogfTsKIAorI2RlZmluZSBNVVNCX1FVSVJLX0JfSU5WQUxJRF9WQlVTXzkxCShNVVNCX0RFVkNUTF9CREVWSUNFIHwgXAorCQkJCQkgKDIgPDwgTVVTQl9ERVZDVExfVkJVU19TSElGVCkgfCBcCisJCQkJCSBNVVNCX0RFVkNUTF9TRVNTSU9OKQorI2RlZmluZSBNVVNCX1FVSVJLX0FfRElTQ09OTkVDVF8xOQkoKDMgPDwgTVVTQl9ERVZDVExfVkJVU19TSElGVCkgfCBcCisJCQkJCSBNVVNCX0RFVkNUTF9TRVNTSU9OKQorCisvKgorICogQ2hlY2sgdGhlIG11c2IgZGV2Y3RsIHNlc3Npb24gYml0IHRvIGRldGVybWluZSBpZiB3ZSB3YW50IHRvCisgKiBhbGxvdyBQTSBydW50aW1lIGZvciB0aGUgZGV2aWNlLiBJbiBnZW5lcmFsLCB3ZSB3YW50IHRvIGtlZXAgdGhpbmdzCisgKiBhY3RpdmUgd2hlbiB0aGUgc2Vzc2lvbiBiaXQgaXMgc2V0IGV4Y2VwdCBhZnRlciBob3N0IGRpc2Nvbm5lY3QuCisgKgorICogT25seSBjYWxsZWQgZnJvbSBtdXNiX2lycV93b3JrLiBJZiB0aGlzIGV2ZXIgbmVlZHMgdG8gZ2V0IGNhbGxlZAorICogZWxzZXdoZXJlLCBwcm9wZXIgbG9ja2luZyBtdXN0IGJlIGltcGxlbWVudGVkIGZvciBtdXNiLT5zZXNzaW9uLgorICovCitzdGF0aWMgdm9pZCBtdXNiX3BtX3J1bnRpbWVfY2hlY2tfc2Vzc2lvbihzdHJ1Y3QgbXVzYiAqbXVzYikKK3sKKwl1OCBkZXZjdGwsIHM7CisJaW50IGVycm9yOworCisJZGV2Y3RsID0gbXVzYl9yZWFkYihtdXNiLT5tcmVncywgTVVTQl9ERVZDVEwpOworCisJLyogSGFuZGxlIHNlc3Npb24gc3RhdHVzIHF1aXJrcyBmaXJzdCAqLworCXMgPSBNVVNCX0RFVkNUTF9GU0RFViB8IE1VU0JfREVWQ1RMX0xTREVWIHwKKwkJTVVTQl9ERVZDVExfSFI7CisJc3dpdGNoIChkZXZjdGwgJiB+cykgeworCWNhc2UgTVVTQl9RVUlSS19CX0lOVkFMSURfVkJVU185MToKKwkJaWYgKCFtdXNiLT5zZXNzaW9uICYmICFtdXNiLT5xdWlya19pbnZhbGlkX3ZidXMpIHsKKwkJCW11c2ItPnF1aXJrX2ludmFsaWRfdmJ1cyA9IHRydWU7CisJCQltdXNiX2RiZyhtdXNiLAorCQkJCSAiRmlyc3QgaW52YWxpZCB2YnVzLCBhc3N1bWUgbm8gc2Vzc2lvbiIpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCWNhc2UgTVVTQl9RVUlSS19BX0RJU0NPTk5FQ1RfMTk6CisJCWlmICghbXVzYi0+c2Vzc2lvbikKKwkJCWJyZWFrOworCQltdXNiX2RiZyhtdXNiLCAiQWxsb3cgUE0gb24gcG9zc2libGUgaG9zdCBtb2RlIGRpc2Nvbm5lY3QiKTsKKwkJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShtdXNiLT5jb250cm9sbGVyKTsKKwkJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQobXVzYi0+Y29udHJvbGxlcik7CisJCW11c2ItPnNlc3Npb24gPSBmYWxzZTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcgaWYgc2Vzc2lvbiBoYXMgbm90IGNoYW5nZWQgKi8KKwlzID0gZGV2Y3RsICYgTVVTQl9ERVZDVExfU0VTU0lPTjsKKwlpZiAocyA9PSBtdXNiLT5zZXNzaW9uKQorCQlyZXR1cm47CisKKwkvKiBCbG9jayBQTSBvciBhbGxvdyBQTT8gKi8KKwlpZiAocykgeworCQltdXNiX2RiZyhtdXNiLCAiQmxvY2sgUE0gb24gYWN0aXZlIHNlc3Npb246ICUwMngiLCBkZXZjdGwpOworCQllcnJvciA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMobXVzYi0+Y29udHJvbGxlcik7CisJCWlmIChlcnJvciA8IDApCisJCQlkZXZfZXJyKG11c2ItPmNvbnRyb2xsZXIsICJDb3VsZCBub3QgZW5hYmxlOiAlaVxuIiwKKwkJCQllcnJvcik7CisJfSBlbHNlIHsKKwkJbXVzYl9kYmcobXVzYiwgIkFsbG93IFBNIHdpdGggbm8gc2Vzc2lvbjogJTAyeCIsIGRldmN0bCk7CisJCW11c2ItPnF1aXJrX2ludmFsaWRfdmJ1cyA9IGZhbHNlOworCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KG11c2ItPmNvbnRyb2xsZXIpOworCQlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChtdXNiLT5jb250cm9sbGVyKTsKKwl9CisKKwltdXNiLT5zZXNzaW9uID0gczsKK30KKwogLyogT25seSB1c2VkIHRvIHByb3ZpZGUgZHJpdmVyIG1vZGUgY2hhbmdlIGV2ZW50cyAqLwogc3RhdGljIHZvaWQgbXVzYl9pcnFfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCiB7CiAJc3RydWN0IG11c2IgKm11c2IgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IG11c2IsIGlycV93b3JrKTsKIAorCW11c2JfcG1fcnVudGltZV9jaGVja19zZXNzaW9uKG11c2IpOworCiAJaWYgKG11c2ItPnhjZWl2LT5vdGctPnN0YXRlICE9IG11c2ItPnhjZWl2X29sZF9zdGF0ZSkgewogCQltdXNiLT54Y2Vpdl9vbGRfc3RhdGUgPSBtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZTsKIAkJc3lzZnNfbm90aWZ5KCZtdXNiLT5jb250cm9sbGVyLT5rb2JqLCBOVUxMLCAibW9kZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaCBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmgKaW5kZXggYjU1YTc3Ni4uMmNiODhhNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmgKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaApAQCAtMzc4LDYgKzM3OCw4IEBACiAJdTgJCQltaW5fcG93ZXI7CS8qIHZidXMgZm9yIHBlcmlwaCwgaW4gbUEvMiAqLwogCiAJaW50CQkJcG9ydF9tb2RlOwkvKiBNVVNCX1BPUlRfTU9ERV8qICovCisJYm9vbAkJCXNlc3Npb247CisJYm9vbAkJCXF1aXJrX2ludmFsaWRfdmJ1czsKIAlib29sCQkJaXNfaG9zdDsKIAogCWludAkJCWFfd2FpdF9iY29uOwkvKiBWQlVTIHRpbWVvdXQgaW4gbXNlY3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kc3BzLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZHNwcy5jCmluZGV4IDI1MzcxNzkuLjBmMTdkMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kc3BzLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RzcHMuYwpAQCAtMTQ1LDQzICsxNDUsNiBAQAogCXsgIm1vZGUiLAkJMHhlOCB9LAogfTsKIAotc3RhdGljIHZvaWQgZHNwc19tdXNiX3RyeV9pZGxlKHN0cnVjdCBtdXNiICptdXNiLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gbXVzYi0+Y29udHJvbGxlcjsKLQlzdHJ1Y3QgZHNwc19nbHVlICpnbHVlID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKLQotCWlmICh0aW1lb3V0ID09IDApCi0JCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygzKTsKLQotCS8qIE5ldmVyIGlkbGUgaWYgYWN0aXZlLCBvciB3aGVuIFZCVVMgdGltZW91dCBpcyBub3Qgc2V0IGFzIGhvc3QgKi8KLQlpZiAobXVzYi0+aXNfYWN0aXZlIHx8IChtdXNiLT5hX3dhaXRfYmNvbiA9PSAwICYmCi0JCQltdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSA9PSBPVEdfU1RBVEVfQV9XQUlUX0JDT04pKSB7Ci0JCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIiVzIGFjdGl2ZSwgZGVsZXRpbmcgdGltZXJcbiIsCi0JCQkJdXNiX290Z19zdGF0ZV9zdHJpbmcobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUpKTsKLQkJZGVsX3RpbWVyKCZnbHVlLT50aW1lcik7Ci0JCWdsdWUtPmxhc3RfdGltZXIgPSBqaWZmaWVzOwotCQlyZXR1cm47Ci0JfQotCWlmIChtdXNiLT5wb3J0X21vZGUgIT0gTVVTQl9QT1JUX01PREVfRFVBTF9ST0xFKQotCQlyZXR1cm47Ci0KLQlpZiAoIW11c2ItPmcuZGV2LmRyaXZlcikKLQkJcmV0dXJuOwotCi0JaWYgKHRpbWVfYWZ0ZXIoZ2x1ZS0+bGFzdF90aW1lciwgdGltZW91dCkgJiYKLQkJCQl0aW1lcl9wZW5kaW5nKCZnbHVlLT50aW1lcikpIHsKLQkJZGV2X2RiZyhtdXNiLT5jb250cm9sbGVyLAotCQkJIkxvbmdlciBpZGxlIHRpbWVyIGFscmVhZHkgcGVuZGluZywgaWdub3JpbmcuLi5cbiIpOwotCQlyZXR1cm47Ci0JfQotCWdsdWUtPmxhc3RfdGltZXIgPSB0aW1lb3V0OwotCi0JZGV2X2RiZyhtdXNiLT5jb250cm9sbGVyLCAiJXMgaW5hY3RpdmUsIHN0YXJ0aW5nIGlkbGUgdGltZXIgZm9yICV1IG1zXG4iLAotCQl1c2Jfb3RnX3N0YXRlX3N0cmluZyhtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSksCi0JCQlqaWZmaWVzX3RvX21zZWNzKHRpbWVvdXQgLSBqaWZmaWVzKSk7Ci0JbW9kX3RpbWVyKCZnbHVlLT50aW1lciwgdGltZW91dCk7Ci19Ci0KIC8qKgogICogZHNwc19tdXNiX2VuYWJsZSAtIGVuYWJsZSBpbnRlcnJ1cHRzCiAgKi8KQEAgLTIwNiw3ICsxNjksNiBAQAogCQkJbXVzYi0+cG9ydF9tb2RlID09IE1VU0JfUE9SVF9NT0RFX0RVQUxfUk9MRSkKIAkJbW9kX3RpbWVyKCZnbHVlLT50aW1lciwgamlmZmllcyArCiAJCQkJbXNlY3NfdG9famlmZmllcyh3cnAtPnBvbGxfdGltZW91dCkpOwotCWRzcHNfbXVzYl90cnlfaWRsZShtdXNiLCAwKTsKIH0KIAogLyoqCkBAIC0yMzYsNiArMTk4LDExIEBACiAJdTggZGV2Y3RsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHNraXBfc2Vzc2lvbiA9IDA7CisJaW50IGVycjsKKworCWVyciA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKKwlpZiAoZXJyIDwgMCkKKwkJZGV2X2VycihkZXYsICJQb2xsIGNvdWxkIG5vdCBwbV9ydW50aW1lX2dldDogJWlcbiIsIGVycik7CiAKIAkvKgogCSAqIFdlIHBvbGwgYmVjYXVzZSBEU1BTIElQJ3Mgd29uJ3QgZXhwb3NlIHNldmVyYWwgT1RHLWNyaXRpY2FsCkBAIC0yNDcsNiArMjE0LDEwIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbXVzYi0+bG9jaywgZmxhZ3MpOwogCXN3aXRjaCAobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUpIHsKKwljYXNlIE9UR19TVEFURV9BX1dBSVRfVlJJU0U6CisJCW1vZF90aW1lcigmZ2x1ZS0+dGltZXIsIGppZmZpZXMgKworCQkJCW1zZWNzX3RvX2ppZmZpZXMod3JwLT5wb2xsX3RpbWVvdXQpKTsKKwkJYnJlYWs7CiAJY2FzZSBPVEdfU1RBVEVfQV9XQUlUX0JDT046CiAJCW11c2Jfd3JpdGViKG11c2ItPm1yZWdzLCBNVVNCX0RFVkNUTCwgMCk7CiAJCXNraXBfc2Vzc2lvbiA9IDE7CkBAIC0yNzUsNiArMjQ2LDkgQEAKIAkJYnJlYWs7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKKworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChkZXYpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgZHNwc19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqaGNpKQpAQCAtMzM4LDcgKzMxMiw4IEBACiAJCQlNVVNCX0hTVF9NT0RFKG11c2IpOwogCQkJbXVzYi0+eGNlaXYtPm90Zy0+ZGVmYXVsdF9hID0gMTsKIAkJCW11c2ItPnhjZWl2LT5vdGctPnN0YXRlID0gT1RHX1NUQVRFX0FfV0FJVF9WUklTRTsKLQkJCWRlbF90aW1lcigmZ2x1ZS0+dGltZXIpOworCQkJbW9kX3RpbWVyKCZnbHVlLT50aW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKHdycC0+cG9sbF90aW1lb3V0KSk7CiAJCX0gZWxzZSB7CiAJCQltdXNiLT5pc19hY3RpdmUgPSAwOwogCQkJTVVTQl9ERVZfTU9ERShtdXNiKTsKQEAgLTM1OCwxMSArMzMzLDE3IEBACiAJaWYgKG11c2ItPmludF90eCB8fCBtdXNiLT5pbnRfcnggfHwgbXVzYi0+aW50X3VzYikKIAkJcmV0IHw9IG11c2JfaW50ZXJydXB0KG11c2IpOwogCi0JLyogUG9sbCBmb3IgSUQgY2hhbmdlIGluIE9URyBwb3J0IG1vZGUgKi8KLQlpZiAobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUgPT0gT1RHX1NUQVRFX0JfSURMRSAmJgotCQkJbXVzYi0+cG9ydF9tb2RlID09IE1VU0JfUE9SVF9NT0RFX0RVQUxfUk9MRSkKKwkvKiBQb2xsIGZvciBJRCBjaGFuZ2UgYW5kIGNvbm5lY3QgKi8KKwlzd2l0Y2ggKG11c2ItPnhjZWl2LT5vdGctPnN0YXRlKSB7CisJY2FzZSBPVEdfU1RBVEVfQl9JRExFOgorCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9CQ09OOgogCQltb2RfdGltZXIoJmdsdWUtPnRpbWVyLCBqaWZmaWVzICsKIAkJCQltc2Vjc190b19qaWZmaWVzKHdycC0+cG9sbF90aW1lb3V0KSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKIApAQCAtNDYxLDYgKzQ0Miw5IEBACiAJCW11c2Jfd3JpdGViKG11c2ItPm1yZWdzLCBNVVNCX0JBQkJMRV9DVEwsIHZhbCk7CiAJfQogCisJbW9kX3RpbWVyKCZnbHVlLT50aW1lciwgamlmZmllcyArCisJCSAgbXNlY3NfdG9famlmZmllcyhnbHVlLT53cnAtPnBvbGxfdGltZW91dCkpOworCiAJcmV0dXJuIGRzcHNfbXVzYl9kYmdfaW5pdChtdXNiLCBnbHVlKTsKIH0KIApAQCAtNjIwLDcgKzYwNCw2IEBACiAJLmVuYWJsZQkJPSBkc3BzX211c2JfZW5hYmxlLAogCS5kaXNhYmxlCT0gZHNwc19tdXNiX2Rpc2FibGUsCiAKLQkudHJ5X2lkbGUJPSBkc3BzX211c2JfdHJ5X2lkbGUsCiAJLnNldF9tb2RlCT0gZHNwc19tdXNiX3NldF9tb2RlLAogCS5yZWNvdmVyCT0gZHNwc19tdXNiX3JlY292ZXIsCiB9OwpAQCAtNzg0LDYgKzc2Nyw4IEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBnbHVlKTsKIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZCgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheSgmcGRldi0+ZGV2LCAyMDApOwogCiAJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmcGRldi0+ZGV2KTsKIAlpZiAocmV0IDwgMCkgewpAQCAtNzk1LDExICs3ODAsMTUgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycjM7CiAKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKCZwZGV2LT5kZXYpOworCiAJcmV0dXJuIDA7CiAKIGVycjM6Ci0JcG1fcnVudGltZV9wdXQoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9wdXRfc3luYygmcGRldi0+ZGV2KTsKIGVycjI6CisJcG1fcnVudGltZV9kb250X3VzZV9hdXRvc3VzcGVuZCgmcGRldi0+ZGV2KTsKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTgxMSw3ICs4MDAsOCBAQAogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGdsdWUtPm11c2IpOwogCiAJLyogZGlzYWJsZSB1c2JzcyBjbG9ja3MgKi8KLQlwbV9ydW50aW1lX3B1dCgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX2RvbnRfdXNlX2F1dG9zdXNwZW5kKCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMKaW5kZXggNmQxZTk3NS4uYmZmNDg2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuYwpAQCAtMTk2NCw2ICsxOTY0LDkgQEAKIAkgKiB0aGF0IGN1cnJlbnRseSBtaXNiZWhhdmVzLgogCSAqLwogCisJLyogRm9yY2UgY2hlY2sgb2YgZGV2Y3RsIHJlZ2lzdGVyIGZvciBQTSBydW50aW1lICovCisJc2NoZWR1bGVfd29yaygmbXVzYi0+aXJxX3dvcmspOworCiAJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShtdXNiLT5jb250cm9sbGVyKTsKIAlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChtdXNiLT5jb250cm9sbGVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX3ZpcnRodWIuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl92aXJ0aHViLmMKaW5kZXggMTkyMjQ4Zi4uNjFiNWYxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX3ZpcnRodWIuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfdmlydGh1Yi5jCkBAIC0yNDUsNiArMjQ1LDcgQEAKIAkJCXVzYl9vdGdfc3RhdGVfc3RyaW5nKG11c2ItPnhjZWl2LT5vdGctPnN0YXRlKSk7CiAJfQogfQorRVhQT1JUX1NZTUJPTF9HUEwobXVzYl9yb290X2Rpc2Nvbm5lY3QpOwogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTI5MCw2ICsyOTEsNyBAQAogCXUzMgkJdGVtcDsKIAlpbnQJCXJldHZhbCA9IDA7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlib29sCQlzdGFydF9tdXNiID0gZmFsc2U7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbXVzYi0+bG9jaywgZmxhZ3MpOwogCkBAIC0zOTAsNyArMzkyLDcgQEAKIAkJCSAqIGxvZ2ljIHJlbGF0aW5nIHRvIFZCVVMgcG93ZXItdXAuCiAJCQkgKi8KIAkJCWlmICghaGNkLT5zZWxmLmlzX2JfaG9zdCAmJiBtdXNiX2hhc19nYWRnZXQobXVzYikpCi0JCQkJbXVzYl9zdGFydChtdXNiKTsKKwkJCQlzdGFydF9tdXNiID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQljYXNlIFVTQl9QT1JUX0ZFQVRfUkVTRVQ6CiAJCQltdXNiX3BvcnRfcmVzZXQobXVzYiwgdHJ1ZSk7CkBAIC00NTEsNSArNDUzLDkgQEAKIAkJcmV0dmFsID0gLUVQSVBFOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdXNiLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoc3RhcnRfbXVzYikKKwkJbXVzYl9zdGFydChtdXNiKTsKKwogCXJldHVybiByZXR2YWw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMgYi9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMKaW5kZXggMGI0Y2VjOS4uMWFiNjk3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2Ivb21hcDI0MzAuYwpAQCAtNDksOSArNDksNiBAQAogCWVudW0gbXVzYl92YnVzX2lkX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IHdvcmtfc3RydWN0CW9tYXBfbXVzYl9tYWlsYm94X3dvcms7CiAJc3RydWN0IGRldmljZQkJKmNvbnRyb2xfb3RnaHM7Ci0JYm9vbAkJCWNhYmxlX2Nvbm5lY3RlZDsKLQlib29sCQkJZW5hYmxlZDsKLQlib29sCQkJcG93ZXJlZDsKIH07CiAjZGVmaW5lIGdsdWVfdG9fbXVzYihnKQkJcGxhdGZvcm1fZ2V0X2RydmRhdGEoZy0+bXVzYikKIApAQCAtMTQxLDQ1ICsxMzgsNiBAQAogCW11c2Jfd3JpdGVsKG11c2ItPm1yZWdzLCBPVEdfRk9SQ0VTVERCWSwgbCk7CiB9CiAKLS8qCi0gKiBXZSBjYW4gZ2V0IG11bHRpcGxlIGNhYmxlIGV2ZW50cyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sKLSAqIG9mIHRoZSBwb3dlciBzdGF0ZS4gT25seSBrZWVwIHBvd2VyIGVuYWJsZWQgaWYgVVNCIGNhYmxlIGlzCi0gKiBjb25uZWN0ZWQgYW5kIGEgZ2FkZ2V0IGlzIHN0YXJ0ZWQuCi0gKi8KLXN0YXRpYyB2b2lkIG9tYXAyNDMwX3NldF9wb3dlcihzdHJ1Y3QgbXVzYiAqbXVzYiwgYm9vbCBlbmFibGVkLCBib29sIGNhYmxlKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IG11c2ItPmNvbnRyb2xsZXI7Ci0Jc3RydWN0IG9tYXAyNDMwX2dsdWUgKmdsdWUgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOwotCWJvb2wgcG93ZXJfdXA7Ci0JaW50IHJlczsKLQotCWlmIChnbHVlLT5lbmFibGVkICE9IGVuYWJsZWQpCi0JCWdsdWUtPmVuYWJsZWQgPSBlbmFibGVkOwotCi0JaWYgKGdsdWUtPmNhYmxlX2Nvbm5lY3RlZCAhPSBjYWJsZSkKLQkJZ2x1ZS0+Y2FibGVfY29ubmVjdGVkID0gY2FibGU7Ci0KLQlwb3dlcl91cCA9IGdsdWUtPmVuYWJsZWQgJiYgZ2x1ZS0+Y2FibGVfY29ubmVjdGVkOwotCWlmIChwb3dlcl91cCA9PSBnbHVlLT5wb3dlcmVkKSB7Ci0JCWRldl93YXJuKG11c2ItPmNvbnRyb2xsZXIsICJwb3dlciBzdGF0ZSBhbHJlYWR5ICVpXG4iLAotCQkJIHBvd2VyX3VwKTsKLQkJcmV0dXJuOwotCX0KLQotCWdsdWUtPnBvd2VyZWQgPSBwb3dlcl91cDsKLQotCWlmIChwb3dlcl91cCkgewotCQlyZXMgPSBwbV9ydW50aW1lX2dldF9zeW5jKG11c2ItPmNvbnRyb2xsZXIpOwotCQlpZiAocmVzIDwgMCkgewotCQkJZGV2X2VycihtdXNiLT5jb250cm9sbGVyLCAiY291bGQgbm90IGVuYWJsZTogJWkiLCByZXMpOwotCQkJZ2x1ZS0+cG93ZXJlZCA9IGZhbHNlOwotCQl9Ci0JfSBlbHNlIHsKLQkJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShtdXNiLT5jb250cm9sbGVyKTsKLQkJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQobXVzYi0+Y29udHJvbGxlcik7Ci0JfQotfQotCiBzdGF0aWMgaW50IG9tYXAyNDMwX211c2JfbWFpbGJveChlbnVtIG11c2JfdmJ1c19pZF9zdGF0dXMgc3RhdHVzKQogewogCXN0cnVjdCBvbWFwMjQzMF9nbHVlCSpnbHVlID0gX2dsdWU7CkBAIC0yMDMsMjEgKzE2MSwxNSBAQAogc3RhdGljIHZvaWQgb21hcF9tdXNiX3NldF9tYWlsYm94KHN0cnVjdCBvbWFwMjQzMF9nbHVlICpnbHVlKQogewogCXN0cnVjdCBtdXNiICptdXNiID0gZ2x1ZV90b19tdXNiKGdsdWUpOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IG11c2ItPmNvbnRyb2xsZXI7Ci0Jc3RydWN0IG11c2JfaGRyY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKKwlzdHJ1Y3QgbXVzYl9oZHJjX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KKwkJZGV2X2dldF9wbGF0ZGF0YShtdXNiLT5jb250cm9sbGVyKTsKIAlzdHJ1Y3Qgb21hcF9tdXNiX2JvYXJkX2RhdGEgKmRhdGEgPSBwZGF0YS0+Ym9hcmRfZGF0YTsKIAlzdHJ1Y3QgdXNiX290ZyAqb3RnID0gbXVzYi0+eGNlaXYtPm90ZzsKLQlib29sIGNhYmxlX2Nvbm5lY3RlZDsKIAotCWNhYmxlX2Nvbm5lY3RlZCA9ICgoZ2x1ZS0+c3RhdHVzID09IE1VU0JfSURfR1JPVU5EKSB8fAotCQkJICAgKGdsdWUtPnN0YXR1cyA9PSBNVVNCX1ZCVVNfVkFMSUQpKTsKLQotCWlmIChjYWJsZV9jb25uZWN0ZWQpCi0JCW9tYXAyNDMwX3NldF9wb3dlcihtdXNiLCBnbHVlLT5lbmFibGVkLCBjYWJsZV9jb25uZWN0ZWQpOwotCisJcG1fcnVudGltZV9nZXRfc3luYyhtdXNiLT5jb250cm9sbGVyKTsKIAlzd2l0Y2ggKGdsdWUtPnN0YXR1cykgewogCWNhc2UgTVVTQl9JRF9HUk9VTkQ6Ci0JCWRldl9kYmcoZGV2LCAiSUQgR05EXG4iKTsKKwkJZGV2X2RiZyhtdXNiLT5jb250cm9sbGVyLCAiSUQgR05EXG4iKTsKIAogCQlvdGctPmRlZmF1bHRfYSA9IHRydWU7CiAJCW11c2ItPnhjZWl2LT5vdGctPnN0YXRlID0gT1RHX1NUQVRFX0FfSURMRTsKQEAgLTIzMCw3ICsxODIsNyBAQAogCQlicmVhazsKIAogCWNhc2UgTVVTQl9WQlVTX1ZBTElEOgotCQlkZXZfZGJnKGRldiwgIlZCVVMgQ29ubmVjdFxuIik7CisJCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIlZCVVMgQ29ubmVjdFxuIik7CiAKIAkJb3RnLT5kZWZhdWx0X2EgPSBmYWxzZTsKIAkJbXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUgPSBPVEdfU1RBVEVfQl9JRExFOwpAQCAtMjQwLDcgKzE5Miw3IEBACiAKIAljYXNlIE1VU0JfSURfRkxPQVQ6CiAJY2FzZSBNVVNCX1ZCVVNfT0ZGOgotCQlkZXZfZGJnKGRldiwgIlZCVVMgRGlzY29ubmVjdFxuIik7CisJCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIlZCVVMgRGlzY29ubmVjdFxuIik7CiAKIAkJbXVzYi0+eGNlaXYtPmxhc3RfZXZlbnQgPSBVU0JfRVZFTlRfTk9ORTsKIAkJaWYgKG11c2ItPmdhZGdldF9kcml2ZXIpCkBAIC0yNTMsMTIgKzIwNSwxMCBAQAogCQkJVVNCX01PREVfRElTQ09OTkVDVCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9kYmcoZGV2LCAiSUQgZmxvYXRcbiIpOworCQlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsICJJRCBmbG9hdFxuIik7CiAJfQotCi0JaWYgKCFjYWJsZV9jb25uZWN0ZWQpCi0JCW9tYXAyNDMwX3NldF9wb3dlcihtdXNiLCBnbHVlLT5lbmFibGVkLCBjYWJsZV9jb25uZWN0ZWQpOwotCisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShtdXNiLT5jb250cm9sbGVyKTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChtdXNiLT5jb250cm9sbGVyKTsKIAlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmbXVzYi0+eGNlaXYtPm5vdGlmaWVyLAogCQkJbXVzYi0+eGNlaXYtPmxhc3RfZXZlbnQsIE5VTEwpOwogfQpAQCAtMzc2LDggKzMyNiw2IEBACiAJaWYgKCFXQVJOX09OKCFtdXNiLT5waHkpKQogCQlwaHlfcG93ZXJfb24obXVzYi0+cGh5KTsKIAotCW9tYXAyNDMwX3NldF9wb3dlcihtdXNiLCB0cnVlLCBnbHVlLT5jYWJsZV9jb25uZWN0ZWQpOwotCiAJc3dpdGNoIChnbHVlLT5zdGF0dXMpIHsKIAogCWNhc2UgTVVTQl9JRF9HUk9VTkQ6CkBAIC00MTksOCArMzY3LDYgQEAKIAlpZiAoZ2x1ZS0+c3RhdHVzICE9IE1VU0JfVU5LTk9XTikKIAkJb21hcF9jb250cm9sX3VzYl9zZXRfbW9kZShnbHVlLT5jb250cm9sX290Z2hzLAogCQkJVVNCX01PREVfRElTQ09OTkVDVCk7Ci0KLQlvbWFwMjQzMF9zZXRfcG93ZXIobXVzYiwgZmFsc2UsIGdsdWUtPmNhYmxlX2Nvbm5lY3RlZCk7CiB9CiAKIHN0YXRpYyBpbnQgb21hcDI0MzBfbXVzYl9leGl0KHN0cnVjdCBtdXNiICptdXNiKQpAQCAtNTcxLDcgKzUxNyw3IEBACiAKIAlwbV9ydW50aW1lX2VuYWJsZShnbHVlLT5kZXYpOwogCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKGdsdWUtPmRldik7Ci0JcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoZ2x1ZS0+ZGV2LCA1MDApOworCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KGdsdWUtPmRldiwgMTAwKTsKIAogCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQobXVzYik7CiAJaWYgKHJldCkgewpAQCAtNTkxLDExICs1MzcsOSBAQAogc3RhdGljIGludCBvbWFwMjQzMF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgb21hcDI0MzBfZ2x1ZSAqZ2x1ZSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBtdXNiICptdXNiID0gZ2x1ZV90b19tdXNiKGdsdWUpOwogCiAJcG1fcnVudGltZV9nZXRfc3luYyhnbHVlLT5kZXYpOwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGdsdWUtPm11c2IpOwotCW9tYXAyNDMwX3NldF9wb3dlcihtdXNiLCBmYWxzZSwgZmFsc2UpOwogCXBtX3J1bnRpbWVfcHV0X3N5bmMoZ2x1ZS0+ZGV2KTsKIAlwbV9ydW50aW1lX2RvbnRfdXNlX2F1dG9zdXNwZW5kKGdsdWUtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKGdsdWUtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL3N1bnhpLmMgYi9kcml2ZXJzL3VzYi9tdXNiL3N1bnhpLmMKaW5kZXggYzZlZTE2Ni4uMTQwODI0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9zdW54aS5jCisrKyBiL2RyaXZlcnMvdXNiL211c2Ivc3VueGkuYwpAQCAtNzQsNiArNzQsNyBAQAogI2RlZmluZSBTVU5YSV9NVVNCX0ZMX0hBU19TUkFNCQkJNQogI2RlZmluZSBTVU5YSV9NVVNCX0ZMX0hBU19SRVNFVAkJCTYKICNkZWZpbmUgU1VOWElfTVVTQl9GTF9OT19DT05GSUdEQVRBCQk3CisjZGVmaW5lIFNVTlhJX01VU0JfRkxfUEhZX01PREVfUEVORAkJOAogCiAvKiBPdXIgcmVhZC93cml0ZSBtZXRob2RzIG5lZWQgYWNjZXNzIGFuZCBkbyBub3QgZ2V0IHBhc3NlZCBpbiBhIG11c2IgcmVmIDp8ICovCiBzdGF0aWMgc3RydWN0IG11c2IgKnN1bnhpX211c2I7CkBAIC04Nyw2ICs4OCw3IEBACiAJc3RydWN0IHBoeQkJKnBoeTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSp1c2JfcGh5OwogCXN0cnVjdCB1c2JfcGh5CQkqeGNlaXY7CisJZW51bSBwaHlfbW9kZQkJcGh5X21vZGU7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CiAJc3RydWN0IGV4dGNvbl9kZXYJKmV4dGNvbjsKQEAgLTE0MCw2ICsxNDIsOSBAQAogCQkJY2xlYXJfYml0KFNVTlhJX01VU0JfRkxfUEhZX09OLCAmZ2x1ZS0+ZmxhZ3MpOwogCQl9CiAJfQorCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVU5YSV9NVVNCX0ZMX1BIWV9NT0RFX1BFTkQsICZnbHVlLT5mbGFncykpCisJCXBoeV9zZXRfbW9kZShnbHVlLT5waHksIGdsdWUtPnBoeV9tb2RlKTsKIH0KIAogc3RhdGljIHZvaWQgc3VueGlfbXVzYl9zZXRfdmJ1cyhzdHJ1Y3QgbXVzYiAqbXVzYiwgaW50IGlzX29uKQpAQCAtMzQxLDYgKzM0Niw1MCBAQAogewogfQogCitzdGF0aWMgaW50IHN1bnhpX211c2Jfc2V0X21vZGUoc3RydWN0IG11c2IgKm11c2IsIHU4IG1vZGUpCit7CisJc3RydWN0IHN1bnhpX2dsdWUgKmdsdWUgPSBkZXZfZ2V0X2RydmRhdGEobXVzYi0+Y29udHJvbGxlci0+cGFyZW50KTsKKwllbnVtIHBoeV9tb2RlIG5ld19tb2RlOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBNVVNCX0hPU1Q6CisJCW5ld19tb2RlID0gUEhZX01PREVfVVNCX0hPU1Q7CisJCWJyZWFrOworCWNhc2UgTVVTQl9QRVJJUEhFUkFMOgorCQluZXdfbW9kZSA9IFBIWV9NT0RFX1VTQl9ERVZJQ0U7CisJCWJyZWFrOworCWNhc2UgTVVTQl9PVEc6CisJCW5ld19tb2RlID0gUEhZX01PREVfVVNCX09URzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihtdXNiLT5jb250cm9sbGVyLT5wYXJlbnQsCisJCQkiRXJyb3IgcmVxdWVzdGVkIG1vZGUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGtlcm5lbFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChnbHVlLT5waHlfbW9kZSA9PSBuZXdfbW9kZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobXVzYi0+cG9ydF9tb2RlICE9IE1VU0JfUE9SVF9NT0RFX0RVQUxfUk9MRSkgeworCQlkZXZfZXJyKG11c2ItPmNvbnRyb2xsZXItPnBhcmVudCwKKwkJCSJFcnJvciBjaGFuZ2luZyBtb2RlcyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBkdWFsIHJvbGUgbW9kZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChtdXNiLT5wb3J0MV9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0VOQUJMRSkKKwkJbXVzYl9yb290X2Rpc2Nvbm5lY3QobXVzYik7CisKKwkvKgorCSAqIHBoeV9zZXRfbW9kZSBtYXkgc2xlZXAsIGFuZCB3ZSdyZSBjYWxsZWQgd2l0aCBhIHNwaW5sb2NrIGhlbGQsCisJICogc28gbGV0IHN1bnhpX211c2Jfd29yayBkZWFsIHdpdGggaXQuCisJICovCisJZ2x1ZS0+cGh5X21vZGUgPSBuZXdfbW9kZTsKKwlzZXRfYml0KFNVTlhJX01VU0JfRkxfUEhZX01PREVfUEVORCwgJmdsdWUtPmZsYWdzKTsKKwlzY2hlZHVsZV93b3JrKCZnbHVlLT53b3JrKTsKKworCXJldHVybiAwOworfQorCiAvKgogICogc3VueGkgbXVzYiByZWdpc3RlciBsYXlvdXQKICAqIDB4MDAgLSAweDE3CWZpZm8gcmVncywgMSBsb25nIHBlciBmaWZvCkBAIC01NjgsNiArNjE3LDcgQEAKIAkud3JpdGV3CQk9IHN1bnhpX211c2Jfd3JpdGV3LAogCS5kbWFfaW5pdAk9IHN1bnhpX211c2JfZG1hX2NvbnRyb2xsZXJfY3JlYXRlLAogCS5kbWFfZXhpdAk9IHN1bnhpX211c2JfZG1hX2NvbnRyb2xsZXJfZGVzdHJveSwKKwkuc2V0X21vZGUJPSBzdW54aV9tdXNiX3NldF9tb2RlLAogCS5zZXRfdmJ1cwk9IHN1bnhpX211c2Jfc2V0X3ZidXMsCiAJLnByZV9yb290X3Jlc2V0X2VuZCA9IHN1bnhpX211c2JfcHJlX3Jvb3RfcmVzZXRfZW5kLAogCS5wb3N0X3Jvb3RfcmVzZXRfZW5kID0gc3VueGlfbXVzYl9wb3N0X3Jvb3RfcmVzZXRfZW5kLApAQCAtNjE0LDIxICs2NjQsMjggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJZ2x1ZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmdsdWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdsdWUpCisJCXJldHVybiAtRU5PTUVNOworCiAJbWVtc2V0KCZwZGF0YSwgMCwgc2l6ZW9mKHBkYXRhKSk7CiAJc3dpdGNoICh1c2JfZ2V0X2RyX21vZGUoJnBkZXYtPmRldikpIHsKICNpZiBkZWZpbmVkIENPTkZJR19VU0JfTVVTQl9EVUFMX1JPTEUgfHwgZGVmaW5lZCBDT05GSUdfVVNCX01VU0JfSE9TVAogCWNhc2UgVVNCX0RSX01PREVfSE9TVDoKIAkJcGRhdGEubW9kZSA9IE1VU0JfUE9SVF9NT0RFX0hPU1Q7CisJCWdsdWUtPnBoeV9tb2RlID0gUEhZX01PREVfVVNCX0hPU1Q7CiAJCWJyZWFrOwogI2VuZGlmCiAjaWYgZGVmaW5lZCBDT05GSUdfVVNCX01VU0JfRFVBTF9ST0xFIHx8IGRlZmluZWQgQ09ORklHX1VTQl9NVVNCX0dBREdFVAogCWNhc2UgVVNCX0RSX01PREVfUEVSSVBIRVJBTDoKIAkJcGRhdGEubW9kZSA9IE1VU0JfUE9SVF9NT0RFX0dBREdFVDsKKwkJZ2x1ZS0+cGh5X21vZGUgPSBQSFlfTU9ERV9VU0JfREVWSUNFOwogCQlicmVhazsKICNlbmRpZgogI2lmZGVmIENPTkZJR19VU0JfTVVTQl9EVUFMX1JPTEUKIAljYXNlIFVTQl9EUl9NT0RFX09URzoKIAkJcGRhdGEubW9kZSA9IE1VU0JfUE9SVF9NT0RFX0RVQUxfUk9MRTsKKwkJZ2x1ZS0+cGh5X21vZGUgPSBQSFlfTU9ERV9VU0JfT1RHOwogCQlicmVhazsKICNlbmRpZgogCWRlZmF1bHQ6CkBAIC02MzgsMTAgKzY5NSw2IEBACiAJcGRhdGEucGxhdGZvcm1fb3BzCT0gJnN1bnhpX211c2Jfb3BzOwogCXBkYXRhLmNvbmZpZwkJPSAmc3VueGlfbXVzYl9oZHJjX2NvbmZpZzsKIAotCWdsdWUgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpnbHVlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFnbHVlKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCWdsdWUtPmRldiA9ICZwZGV2LT5kZXY7CiAJSU5JVF9XT1JLKCZnbHVlLT53b3JrLCBzdW54aV9tdXNiX3dvcmspOwogCWdsdWUtPmhvc3RfbmIubm90aWZpZXJfY2FsbCA9IHN1bnhpX211c2JfaG9zdF9ub3RpZmllcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktYWI4NTAwLXVzYi5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS1hYjg1MDAtdXNiLmMKaW5kZXggMGM5MTJkMy4uYTAzY2FmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcGh5L3BoeS1hYjg1MDAtdXNiLmMKKysrIGIvZHJpdmVycy91c2IvcGh5L3BoeS1hYjg1MDAtdXNiLmMKQEAgLTEyNDgsNyArMTI0OCw3IEBACiAJZXJyID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGFiLT5kZXYsCiAJCQlBQjg1MDBfREVCVUcsIEFCODUwMF9VU0JfUEhZX1RVTkUzLCAweDc4KTsKIAlpZiAoZXJyIDwgMCkKLQkJZGV2X2VycihhYi0+ZGV2LCAiRmFpbGVkIHRvIHNldCBQSFlfVFVORTMgcmVnZXN0ZXIgZXJyPSVkXG4iLAorCQlkZXZfZXJyKGFiLT5kZXYsICJGYWlsZWQgdG8gc2V0IFBIWV9UVU5FMyByZWdpc3RlciBlcnI9JWRcbiIsCiAJCQkJZXJyKTsKIAogCS8qIFN3aXRjaCB0byBub3JtYWwgbW9kZS9kaXNhYmxlIEJhbmsgMHgxMiBhY2Nlc3MgKi8KQEAgLTEyOTAsNyArMTI5MCw3IEBACiAJCQkweEZDLCAweDgwKTsKIAogCWlmIChlcnIgPCAwKQotCQlkZXZfZXJyKGFiLT5kZXYsICJGYWlsZWQgdG8gc2V0IFBIWV9UVU5FMyByZWdlc3RlciBlcnI9JWRcbiIsCisJCWRldl9lcnIoYWItPmRldiwgIkZhaWxlZCB0byBzZXQgUEhZX1RVTkUzIHJlZ2lzdGVyIGVycj0lZFxuIiwKIAkJCQllcnIpOwogCiAJLyogU3dpdGNoIHRvIG5vcm1hbCBtb2RlL2Rpc2FibGUgQmFuayAweDEyIGFjY2VzcyAqLwpAQCAtMTMyMSw3ICsxMzIxLDcgQEAKIAllcnIgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoYWItPmRldiwKIAkJCUFCODU0MF9ERUJVRywgQUI4NTAwX1VTQl9QSFlfVFVORTMsIDB4OTApOwogCWlmIChlcnIgPCAwKQotCQlkZXZfZXJyKGFiLT5kZXYsICJGYWlsZWQgdG8gc2V0IFBIWV9UVU5FMyByZWdlc3RlciByZXQ9JWRcbiIsCisJCWRldl9lcnIoYWItPmRldiwgIkZhaWxlZCB0byBzZXQgUEhZX1RVTkUzIHJlZ2lzdGVyIHJldD0lZFxuIiwKIAkJCQllcnIpOwogfQogCkBAIC0xMzUxLDcgKzEzNTEsNyBAQAogCWVyciA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShhYi0+ZGV2LAogCQkJQUI4NTAwX0RFQlVHLCBBQjg1MDBfVVNCX1BIWV9UVU5FMywgMHg4MCk7CiAJaWYgKGVyciA8IDApCi0JCWRldl9lcnIoYWItPmRldiwgIkZhaWxlZCB0byBzZXQgUEhZX1RVTkUzIHJlZ2VzdGVyIGVycj0lZFxuIiwKKwkJZGV2X2VycihhYi0+ZGV2LCAiRmFpbGVkIHRvIHNldCBQSFlfVFVORTMgcmVnaXN0ZXIgZXJyPSVkXG4iLAogCQkJCWVycik7CiAKIAkvKiBTd2l0Y2ggdG8gbm9ybWFsIG1vZGUvZGlzYWJsZSBCYW5rIDB4MTIgYWNjZXNzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9waHkvcGh5LWdlbmVyaWMuYyBiL2RyaXZlcnMvdXNiL3BoeS9waHktZ2VuZXJpYy5jCmluZGV4IDk4MGM5ZGUuLjgzMTFiYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvdXNiL3BoeS9waHktZ2VuZXJpYy5jCkBAIC0xMTgsOCArMTE4LDYgQEAKIAkJc3RhdHVzID0gVVNCX0VWRU5UX1ZCVVM7CiAJCW90Zy0+c3RhdGUgPSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOwogCQlub3AtPnBoeS5sYXN0X2V2ZW50ID0gc3RhdHVzOwotCQlpZiAob3RnLT5nYWRnZXQpCi0JCQl1c2JfZ2FkZ2V0X3ZidXNfY29ubmVjdChvdGctPmdhZGdldCk7CiAKIAkJLyogZHJhd2luZyBhICJ1bml0IGxvYWQiIGlzICphbHdheXMqIE9LLCBleGNlcHQgZm9yIE9URyAqLwogCQlub3Bfc2V0X3ZidXNfZHJhdyhub3AsIDEwMCk7CkBAIC0xMjksOCArMTI3LDYgQEAKIAl9IGVsc2UgewogCQlub3Bfc2V0X3ZidXNfZHJhdyhub3AsIDApOwogCi0JCWlmIChvdGctPmdhZGdldCkKLQkJCXVzYl9nYWRnZXRfdmJ1c19kaXNjb25uZWN0KG90Zy0+Z2FkZ2V0KTsKIAkJc3RhdHVzID0gVVNCX0VWRU5UX05PTkU7CiAJCW90Zy0+c3RhdGUgPSBPVEdfU1RBVEVfQl9JRExFOwogCQlub3AtPnBoeS5sYXN0X2V2ZW50ID0gc3RhdHVzOwpAQCAtMTQ0LDE0ICsxNDAsMTggQEAKIGludCB1c2JfZ2VuX3BoeV9pbml0KHN0cnVjdCB1c2JfcGh5ICpwaHkpCiB7CiAJc3RydWN0IHVzYl9waHlfZ2VuZXJpYyAqbm9wID0gZGV2X2dldF9kcnZkYXRhKHBoeS0+ZGV2KTsKKwlpbnQgcmV0OwogCiAJaWYgKCFJU19FUlIobm9wLT52Y2MpKSB7CiAJCWlmIChyZWd1bGF0b3JfZW5hYmxlKG5vcC0+dmNjKSkKIAkJCWRldl9lcnIocGh5LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIHBvd2VyXG4iKTsKIAl9CiAKLQlpZiAoIUlTX0VSUihub3AtPmNsaykpCi0JCWNsa19wcmVwYXJlX2VuYWJsZShub3AtPmNsayk7CisJaWYgKCFJU19FUlIobm9wLT5jbGspKSB7CisJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShub3AtPmNsayk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KIAogCW5vcF9yZXNldChub3ApOwogCkBAIC0xODcsNyArMTg3LDggQEAKIAogCW90Zy0+Z2FkZ2V0ID0gZ2FkZ2V0OwogCWlmIChvdGctPnN0YXRlID09IE9UR19TVEFURV9CX1BFUklQSEVSQUwpCi0JCXVzYl9nYWRnZXRfdmJ1c19jb25uZWN0KGdhZGdldCk7CisJCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZvdGctPnVzYl9waHktPm5vdGlmaWVyLAorCQkJCQkgICBVU0JfRVZFTlRfVkJVUywgb3RnLT5nYWRnZXQpOwogCWVsc2UKIAkJb3RnLT5zdGF0ZSA9IE9UR19TVEFURV9CX0lETEU7CiAJcmV0dXJuIDA7CkBAIC0zMjIsNiArMzIzLDggQEAKIAkJCQlncGlvZF90b19pcnEobm9wLT5ncGlvZF92YnVzKSwgZXJyKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KKwkJbm9wLT5waHkub3RnLT5zdGF0ZSA9IGdwaW9kX2dldF92YWx1ZShub3AtPmdwaW9kX3ZidXMpID8KKwkJCU9UR19TVEFURV9CX1BFUklQSEVSQUwgOiBPVEdfU1RBVEVfQl9JRExFOwogCX0KIAogCW5vcC0+cGh5LmluaXQJCT0gdXNiX2dlbl9waHlfaW5pdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktbXhzLXVzYi5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS1teHMtdXNiLmMKaW5kZXggMDBiZmVhMC4uMGUyZjFhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcGh5L3BoeS1teHMtdXNiLmMKKysrIGIvZHJpdmVycy91c2IvcGh5L3BoeS1teHMtdXNiLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNkZWZpbmUgRFJJVkVSX05BTUUgIm14c19waHkiCiAKICNkZWZpbmUgSFdfVVNCUEhZX1BXRAkJCQkweDAwCisjZGVmaW5lIEhXX1VTQlBIWV9UWAkJCQkweDEwCiAjZGVmaW5lIEhXX1VTQlBIWV9DVFJMCQkJCTB4MzAKICNkZWZpbmUgSFdfVVNCUEhZX0NUUkxfU0VUCQkJMHgzNAogI2RlZmluZSBIV19VU0JQSFlfQ1RSTF9DTFIJCQkweDM4CkBAIC0zOCw2ICszOSwxMCBAQAogI2RlZmluZSBIV19VU0JQSFlfSVBfU0VUCQkJMHg5NAogI2RlZmluZSBIV19VU0JQSFlfSVBfQ0xSCQkJMHg5OAogCisjZGVmaW5lIEdNX1VTQlBIWV9UWF9UWENBTDQ1RFAoeCkgICAgICAgICAgICAoKCh4KSAmIDB4ZikgPDwgMTYpCisjZGVmaW5lIEdNX1VTQlBIWV9UWF9UWENBTDQ1RE4oeCkgICAgICAgICAgICAoKCh4KSAmIDB4ZikgPDwgOCkKKyNkZWZpbmUgR01fVVNCUEhZX1RYX0RfQ0FMKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHhmKSA8PCAwKQorCiAjZGVmaW5lIEJNX1VTQlBIWV9DVFJMX1NGVFJTVAkJCUJJVCgzMSkKICNkZWZpbmUgQk1fVVNCUEhZX0NUUkxfQ0xLR0FURQkJCUJJVCgzMCkKICNkZWZpbmUgQk1fVVNCUEhZX0NUUkxfT1RHX0lEX1ZBTFVFCQlCSVQoMjcpCkBAIC0xMTUsNiArMTIwLDEyIEBACiAgKi8KICNkZWZpbmUgTVhTX1BIWV9ORUVEX0lQX0ZJWAkJCUJJVCgzKQogCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBmb3IgZGV2aWNlIHRyZWUgZW50cmllcyAqLworI2RlZmluZSBNWFNfUEhZX1RYX0NBTDQ1X01JTgkJCTMwCisjZGVmaW5lIE1YU19QSFlfVFhfQ0FMNDVfTUFYCQkJNTUKKyNkZWZpbmUgTVhTX1BIWV9UWF9EX0NBTF9NSU4JCQk3OQorI2RlZmluZSBNWFNfUEhZX1RYX0RfQ0FMX01BWAkJCTExOQorCiBzdHJ1Y3QgbXhzX3BoeV9kYXRhIHsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiB9OwpAQCAtMTY0LDYgKzE3NSw4IEBACiAJY29uc3Qgc3RydWN0IG14c19waHlfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfYW5hdG9wOwogCWludCBwb3J0X2lkOworCXUzMiB0eF9yZWdfc2V0OworCXUzMiB0eF9yZWdfbWFzazsKIH07CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19pbXg2cV9waHkoc3RydWN0IG14c19waHkgKm14c19waHkpCkBAIC0xODUsNiArMTk4LDIwIEBACiAJdXNsZWVwX3JhbmdlKDMwMCwgNDAwKTsKIH0KIAorc3RhdGljIHZvaWQgbXhzX3BoeV90eF9pbml0KHN0cnVjdCBteHNfcGh5ICpteHNfcGh5KQoreworCXZvaWQgX19pb21lbSAqYmFzZSA9IG14c19waHktPnBoeS5pb19wcml2OworCXUzMiBwaHl0eDsKKworCS8qIFVwZGF0ZSBUWCByZWdpc3RlciBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byB3cml0ZSAqLworCWlmIChteHNfcGh5LT50eF9yZWdfbWFzaykgeworCQlwaHl0eCA9IHJlYWRsKGJhc2UgKyBIV19VU0JQSFlfVFgpOworCQlwaHl0eCAmPSB+bXhzX3BoeS0+dHhfcmVnX21hc2s7CisJCXBoeXR4IHw9IG14c19waHktPnR4X3JlZ19zZXQ7CisJCXdyaXRlbChwaHl0eCwgYmFzZSArIEhXX1VTQlBIWV9UWCk7CisJfQorfQorCiBzdGF0aWMgaW50IG14c19waHlfaHdfaW5pdChzdHJ1Y3QgbXhzX3BoeSAqbXhzX3BoeSkKIHsKIAlpbnQgcmV0OwpAQCAtMjE0LDYgKzI0MSw4IEBACiAJaWYgKG14c19waHktPmRhdGEtPmZsYWdzICYgTVhTX1BIWV9ORUVEX0lQX0ZJWCkKIAkJd3JpdGVsKEJNX1VTQlBIWV9JUF9GSVgsIGJhc2UgKyBIV19VU0JQSFlfSVBfU0VUKTsKIAorCW14c19waHlfdHhfaW5pdChteHNfcGh5KTsKKwogCXJldHVybiAwOwogfQogCkBAIC00NTksNiArNDg4LDcgQEAKIAlpbnQgcmV0OwogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwl1MzIgdmFsOwogCiAJb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2UobXhzX3BoeV9kdF9pZHMsICZwZGV2LT5kZXYpOwogCWlmICghb2ZfaWQpCkBAIC00OTEsNiArNTIxLDM3IEBACiAJCX0KIAl9CiAKKwkvKiBQcmVjb21wdXRlIHdoaWNoIGJpdHMgb2YgdGhlIFRYIHJlZ2lzdGVyIGFyZSB0byBiZSB1cGRhdGVkLCBpZiBhbnkgKi8KKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZnNsLHR4LWNhbC00NS1kbi1vaG1zIiwgJnZhbCkgJiYKKwkgICAgdmFsID49IE1YU19QSFlfVFhfQ0FMNDVfTUlOICYmIHZhbCA8PSBNWFNfUEhZX1RYX0NBTDQ1X01BWCkgeworCQkvKiBTY2FsZSB0byBhIDQtYml0IHZhbHVlICovCisJCXZhbCA9IChNWFNfUEhZX1RYX0NBTDQ1X01BWCAtIHZhbCkgKiAweEYKKwkJCS8gKE1YU19QSFlfVFhfQ0FMNDVfTUFYIC0gTVhTX1BIWV9UWF9DQUw0NV9NSU4pOworCQlteHNfcGh5LT50eF9yZWdfbWFzayB8PSBHTV9VU0JQSFlfVFhfVFhDQUw0NUROKH4wKTsKKwkJbXhzX3BoeS0+dHhfcmVnX3NldCAgfD0gR01fVVNCUEhZX1RYX1RYQ0FMNDVETih2YWwpOworCX0KKworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJmc2wsdHgtY2FsLTQ1LWRwLW9obXMiLCAmdmFsKSAmJgorCSAgICB2YWwgPj0gTVhTX1BIWV9UWF9DQUw0NV9NSU4gJiYgdmFsIDw9IE1YU19QSFlfVFhfQ0FMNDVfTUFYKSB7CisJCS8qIFNjYWxlIHRvIGEgNC1iaXQgdmFsdWUuICovCisJCXZhbCA9IChNWFNfUEhZX1RYX0NBTDQ1X01BWCAtIHZhbCkgKiAweEYKKwkJCS8gKE1YU19QSFlfVFhfQ0FMNDVfTUFYIC0gTVhTX1BIWV9UWF9DQUw0NV9NSU4pOworCQlteHNfcGh5LT50eF9yZWdfbWFzayB8PSBHTV9VU0JQSFlfVFhfVFhDQUw0NURQKH4wKTsKKwkJbXhzX3BoeS0+dHhfcmVnX3NldCAgfD0gR01fVVNCUEhZX1RYX1RYQ0FMNDVEUCh2YWwpOworCX0KKworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJmc2wsdHgtZC1jYWwiLCAmdmFsKSAmJgorCSAgICB2YWwgPj0gTVhTX1BIWV9UWF9EX0NBTF9NSU4gJiYgdmFsIDw9IE1YU19QSFlfVFhfRF9DQUxfTUFYKSB7CisJCS8qIFNjYWxlIHRvIGEgNC1iaXQgdmFsdWUuICBSb3VuZCB1cCB0aGUgdmFsdWVzIGFuZCBoZWF2aWx5CisJCSAqIHdlaWdodCB0aGUgcm91bmRpbmcgYnkgYWRkaW5nIDIvMyBvZiB0aGUgZGVub21pbmF0b3IuCisJCSAqLworCQl2YWwgPSAoKE1YU19QSFlfVFhfRF9DQUxfTUFYIC0gdmFsKSAqIDB4RgorCQkJKyAoTVhTX1BIWV9UWF9EX0NBTF9NQVggLSBNWFNfUEhZX1RYX0RfQ0FMX01JTikgKiAyLzMpCisJCQkvIChNWFNfUEhZX1RYX0RfQ0FMX01BWCAtIE1YU19QSFlfVFhfRF9DQUxfTUlOKTsKKwkJbXhzX3BoeS0+dHhfcmVnX21hc2sgfD0gR01fVVNCUEhZX1RYX0RfQ0FMKH4wKTsKKwkJbXhzX3BoeS0+dHhfcmVnX3NldCAgfD0gR01fVVNCUEhZX1RYX0RfQ0FMKHZhbCk7CisJfQorCiAJcmV0ID0gb2ZfYWxpYXNfZ2V0X2lkKG5wLCAidXNicGh5Iik7CiAJaWYgKHJldCA8IDApCiAJCWRldl9kYmcoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgYWxpYXMgaWQsIGVycm5vICVkXG4iLCByZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGh5L3BoeS1vbWFwLW90Zy5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS1vbWFwLW90Zy5jCmluZGV4IDZmNmQyYTcuLjY1MjNhZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktb21hcC1vdGcuYworKysgYi9kcml2ZXJzL3VzYi9waHkvcGh5LW9tYXAtb3RnLmMKQEAgLTE0MCw2ICsxNDAsOCBAQAogCQkgKHJldiA+PiA0KSAmIDB4ZiwgcmV2ICYgMHhmLCBjb25maWctPmV4dGNvbiwgb3RnX2Rldi0+aWQsCiAJCSBvdGdfZGV2LT52YnVzKTsKIAorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG90Z19kZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvY29tbW9uLmMgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2NvbW1vbi5jCmluZGV4IDhmYmJjMmQuLjAxMmEzN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvY29tbW9uLmMKKysrIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9jb21tb24uYwpAQCAtNDgyLDYgKzQ4MiwxMCBAQAogCQkuZGF0YSA9ICh2b2lkICopVVNCSFNfVFlQRV9SQ0FSX0dFTjMsCiAJfSwKIAl7CisJCS5jb21wYXRpYmxlID0gInJlbmVzYXMsdXNiaHMtcjhhNzc5NiIsCisJCS5kYXRhID0gKHZvaWQgKilVU0JIU19UWVBFX1JDQVJfR0VOMywKKwl9LAorCXsKIAkJLmNvbXBhdGlibGUgPSAicmVuZXNhcyxyY2FyLWdlbjItdXNiaHMiLAogCQkuZGF0YSA9ICh2b2lkICopVVNCSFNfVFlQRV9SQ0FSX0dFTjIsCiAJfSwKQEAgLTUxNCw3ICs1MTgsOCBAQAogCWlmIChncGlvID4gMCkKIAkJZHBhcmFtLT5lbmFibGVfZ3BpbyA9IGdwaW87CiAKLQlpZiAoZHBhcmFtLT50eXBlID09IFVTQkhTX1RZUEVfUkNBUl9HRU4yKQorCWlmIChkcGFyYW0tPnR5cGUgPT0gVVNCSFNfVFlQRV9SQ0FSX0dFTjIgfHwKKwkgICAgZHBhcmFtLT50eXBlID09IFVTQkhTX1RZUEVfUkNBUl9HRU4zKQogCQlkcGFyYW0tPmhhc191c2JfZG1hYyA9IDE7CiAKIAlyZXR1cm4gaW5mbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvZmlmby5jIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9maWZvLmMKaW5kZXggMjgwZWQ1Zi4uODU3ZTc4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9maWZvLmMKKysrIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9maWZvLmMKQEAgLTg3MSw3ICs4NzEsNyBAQAogCiAJLyogdXNlIFBJTyBpZiBwYWNrZXQgaXMgbGVzcyB0aGFuIHBpb19kbWFfYm9yZGVyIG9yIHBpcGUgaXMgRENQICovCiAJaWYgKChsZW4gPCB1c2Joc19nZXRfZHBhcmFtKHByaXYsIHBpb19kbWFfYm9yZGVyKSkgfHwKLQkgICAgdXNiaHNfcGlwZV9pc19kY3AocGlwZSkpCisJICAgIHVzYmhzX3BpcGVfdHlwZV9pcyhwaXBlLCBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKSkKIAkJZ290byB1c2Joc2ZfcGlvX3ByZXBhcmVfcHVzaDsKIAogCS8qIGNoZWNrIGRhdGEgbGVuZ3RoIGlmIHRoaXMgZHJpdmVyIGRvbid0IHVzZSBVU0ItRE1BQyAqLwpAQCAtOTc2LDcgKzk3Niw3IEBACiAKIAkvKiB1c2UgUElPIGlmIHBhY2tldCBpcyBsZXNzIHRoYW4gcGlvX2RtYV9ib3JkZXIgb3IgcGlwZSBpcyBEQ1AgKi8KIAlpZiAoKHBrdC0+bGVuZ3RoIDwgdXNiaHNfZ2V0X2RwYXJhbShwcml2LCBwaW9fZG1hX2JvcmRlcikpIHx8Ci0JICAgIHVzYmhzX3BpcGVfaXNfZGNwKHBpcGUpKQorCSAgICB1c2Joc19waXBlX3R5cGVfaXMocGlwZSwgVVNCX0VORFBPSU5UX1hGRVJfSVNPQykpCiAJCWdvdG8gdXNiaHNmX3Bpb19wcmVwYXJlX3BvcDsKIAogCWZpZm8gPSB1c2Joc2ZfZ2V0X2RtYV9maWZvKHByaXYsIHBrdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZC5jIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2QuYwppbmRleCBkNGJlNWQ1Li4yODk2NWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZC5jCisrKyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kLmMKQEAgLTI4Miw5ICsyODIsMTYgQEAKIAlpZiAodXNiaHNfbW9kX2lzX2hvc3QocHJpdikpCiAJCXVzYmhzX3dyaXRlKHByaXYsIElOVFNUUzEsIH5pcnFfc3RhdGUuaW50c3RzMSAmIElOVFNUUzFfTUFHSUMpOwogCi0JdXNiaHNfd3JpdGUocHJpdiwgQlJEWVNUUywgfmlycV9zdGF0ZS5icmR5c3RzKTsKKwkvKgorCSAqIFRoZSBkcml2ZXIgc2hvdWxkIG5vdCBjbGVhciB0aGUgeHh4U1RTIGFmdGVyIHRoZSBsaW5lIG9mCisJICogImNhbGwgaXJxIGNhbGxiYWNrIGZ1bmN0aW9ucyIgYmVjYXVzZSBlYWNoICJpZiIgc3RhdGVtZW50IGlzCisJICogcG9zc2libGUgdG8gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGF2b2lkaW5nIGFueSBzaWRlIGVmZmVjdHMuCisJICovCisJaWYgKGlycV9zdGF0ZS5pbnRzdHMwICYgQlJEWSkKKwkJdXNiaHNfd3JpdGUocHJpdiwgQlJEWVNUUywgfmlycV9zdGF0ZS5icmR5c3RzKTsKIAl1c2Joc193cml0ZShwcml2LCBOUkRZU1RTLCB+aXJxX3N0YXRlLm5yZHlzdHMpOwotCXVzYmhzX3dyaXRlKHByaXYsIEJFTVBTVFMsIH5pcnFfc3RhdGUuYmVtcHN0cyk7CisJaWYgKGlycV9zdGF0ZS5pbnRzdHMwICYgQkVNUCkKKwkJdXNiaHNfd3JpdGUocHJpdiwgQkVNUFNUUywgfmlycV9zdGF0ZS5iZW1wc3RzKTsKIAogCS8qCiAJICogY2FsbCBpcnEgY2FsbGJhY2sgZnVuY3Rpb25zCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9nYWRnZXQuYyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kX2dhZGdldC5jCmluZGV4IDUwZjMzNjMuLjViYzdhNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kX2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kX2dhZGdldC5jCkBAIC0zMzUsNyArMzM1LDYgQEAKIAlidWYgPSBrbWFsbG9jKHNpemVvZigqYnVmKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFidWYpIHsKIAkJdXNiX2VwX2ZyZWVfcmVxdWVzdCgmZGNwLT5lcCwgcmVxKTsKLQkJZGV2X2VycihkZXYsICJyZWNpcCBkYXRhIGFsbG9jYXRpb24gZmFpbFxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTYxNywxMCArNjE2LDEzIEBACiAJCSAqIHVzZSBkbWFlbmdpbmUgaWYgcG9zc2libGUuCiAJCSAqIEl0IHdpbGwgdXNlIHBpbyBoYW5kbGVyIGlmIGltcG9zc2libGUuCiAJCSAqLwotCQlpZiAodXNiX2VuZHBvaW50X2Rpcl9pbihkZXNjKSkKKwkJaWYgKHVzYl9lbmRwb2ludF9kaXJfaW4oZGVzYykpIHsKIAkJCXBpcGUtPmhhbmRsZXIgPSAmdXNiaHNfZmlmb19kbWFfcHVzaF9oYW5kbGVyOwotCQllbHNlCisJCX0gZWxzZSB7CiAJCQlwaXBlLT5oYW5kbGVyID0gJnVzYmhzX2ZpZm9fZG1hX3BvcF9oYW5kbGVyOworCQkJdXNiaHNfeHh4c3RzX2NsZWFyKHByaXYsIEJSRFlTVFMsCisJCQkJCSAgIHVzYmhzX3BpcGVfbnVtYmVyKHBpcGUpKTsKKwkJfQogCiAJCXJldCA9IDA7CiAJfQpAQCAtMTA1OSwyMSArMTA2MSwxOCBAQAogCWludCByZXQ7CiAKIAlncHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2Joc2dfZ3ByaXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWdwcml2KSB7Ci0JCWRldl9lcnIoZGV2LCAiQ291bGQgbm90IGFsbG9jYXRlIGdhZGdldCBwcml2XG4iKTsKKwlpZiAoIWdwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAl1ZXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiaHNnX3VlcCkgKiBwaXBlX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghdWVwKSB7Ci0JCWRldl9lcnIoZGV2LCAiQ291bGQgbm90IGFsbG9jYXRlIGVwXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byB1c2Joc19tb2RfZ2FkZ2V0X3Byb2JlX2Vycl9ncHJpdjsKIAl9CiAKIAlncHJpdi0+dHJhbnNjZWl2ZXIgPSB1c2JfZ2V0X3BoeShVU0JfUEhZX1RZUEVfVU5ERUZJTkVEKTsKIAlkZXZfaW5mbyhkZXYsICIlc3RyYW5zY2VpdmVyIGZvdW5kXG4iLAotCQkgZ3ByaXYtPnRyYW5zY2VpdmVyID8gIiIgOiAibm8gIik7CisJCSAhSVNfRVJSKGdwcml2LT50cmFuc2NlaXZlcikgPyAiIiA6ICJubyAiKTsKIAogCS8qCiAJICogQ0FVVElPTgpAQCAtMTEwMyw2ICsxMTAyLDggQEAKIAlncHJpdi0+Z2FkZ2V0Lm5hbWUJCT0gInJlbmVzYXNfdXNiaHNfdWRjIjsKIAlncHJpdi0+Z2FkZ2V0Lm9wcwkJPSAmdXNiaHNnX2dhZGdldF9vcHM7CiAJZ3ByaXYtPmdhZGdldC5tYXhfc3BlZWQJCT0gVVNCX1NQRUVEX0hJR0g7CisJZ3ByaXYtPmdhZGdldC5xdWlya19hdm9pZHNfc2tiX3Jlc2VydmUgPSB1c2Joc19nZXRfZHBhcmFtKHByaXYsCisJCQkJCQkJCWhhc191c2JfZG1hYyk7CiAKIAlJTklUX0xJU1RfSEVBRCgmZ3ByaXYtPmdhZGdldC5lcF9saXN0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2RfaG9zdC5jIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2RfaG9zdC5jCmluZGV4IDNiZjBiNzIuLjE2NWU4MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kX2hvc3QuYworKysgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9ob3N0LmMKQEAgLTE2NiwxNCArMTY2LDEwIEBACiAJCQkJCSAgICAgICBnZnBfdCBtZW1fZmxhZ3MpCiB7CiAJc3RydWN0IHVzYmhzaF9yZXF1ZXN0ICp1cmVxOwotCXN0cnVjdCB1c2Joc19wcml2ICpwcml2ID0gdXNiaHNoX2hwcml2X3RvX3ByaXYoaHByaXYpOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHVzYmhzX3ByaXZfdG9fZGV2KHByaXYpOwogCiAJdXJlcSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2Joc2hfcmVxdWVzdCksIG1lbV9mbGFncyk7Ci0JaWYgKCF1cmVxKSB7Ci0JCWRldl9lcnIoZGV2LCAidXJlcSBhbGxvYyBmYWlsXG4iKTsKKwlpZiAoIXVyZXEpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXVzYmhzX3BrdF9pbml0KCZ1cmVxLT5wa3QpOwogCXVyZXEtPnVyYiA9IHVyYjsKQEAgLTM4OCwxMCArMzg0LDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJdWVwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYmhzaF9lcCksIG1lbV9mbGFncyk7Ci0JaWYgKCF1ZXApIHsKLQkJZGV2X2VycihkZXYsICJ1c2Joc2hfZXAgYWxsb2MgZmFpbFxuIik7CisJaWYgKCF1ZXApCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCS8qKioqKioqKioqKioqKioqKioqKiAgc3BpbiBsb2NrICoqKioqKioqKioqKioqKioqKioqLwogCXVzYmhzX2xvY2socHJpdiwgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9waXBlLmMgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL3BpcGUuYwppbmRleCBjMjM4NzcyLi45Mzk2YThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL3BpcGUuYworKysgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL3BpcGUuYwpAQCAtODA0LDEwICs4MDQsOCBAQAogCX0KIAogCWluZm8tPnBpcGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiaHNfcGlwZSkgKiBwaXBlX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghaW5mby0+cGlwZSkgewotCQlkZXZfZXJyKGRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBwaXBlXG4iKTsKKwlpZiAoIWluZm8tPnBpcGUpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWluZm8tPnNpemUgPSBwaXBlX3NpemU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMHguYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMHguYwppbmRleCA0ZDZhNWM2Li41NGE0ZGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTB4LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEweC5jCkBAIC0xMTgsNiArMTE4LDcgQEAKIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDg0MTEpIH0sIC8qIEt5b2NlcmEgR1BTIE1vZHVsZSAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODQxOCkgfSwgLyogSVJaIEF1dG9tYXRpb24gVGVsZXBvcnQgU0ctMTAgR1NNL0dQUlMgTW9kZW0gKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDg0NkUpIH0sIC8qIEJFSSBVU0IgU2Vuc29yIEludGVyZmFjZSAoVkNQKSAqLworCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODQ3MCkgfSwgLyogSnVuaXBlciBOZXR3b3JrcyBCWCBTZXJpZXMgU3lzdGVtIENvbnNvbGUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDg0NzcpIH0sIC8qIEJhbGx1ZmYgUkZJRCAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODRCNikgfSwgLyogU3Rhcml6b25hIEh5cGVyaW9uICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4NUVBKSB9LCAvKiBBQy1TZXJ2aWNlcyBJQlVTLUlGICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCmluZGV4IDAwODIwODAuLmIyZDc2N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCkBAIC02NDgsNiArNjQ4LDggQEAKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1RGRDEyOF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9GTTNSWF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9XUzc3N19QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1BBTE1TRU5TX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfSVZJVU1fWFNUQVRfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9TRE1VU0JRU1NfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9NQVNURVJERVZFTDJfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9GVVRVUkVfMF9QSUQpIH0sCkBAIC0xMDA4LDYgKzEwMTAsNyBAQAogCXsgVVNCX0RFVklDRShJQ1BEQVNfVklELCBJQ1BEQVNfSTc1NjBVX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoSUNQREFTX1ZJRCwgSUNQREFTX0k3NTYxVV9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKElDUERBU19WSUQsIElDUERBU19JNzU2M1VfUElEKSB9LAorCXsgVVNCX0RFVklDRShXSUNFRF9WSUQsIFdJQ0VEX1VTQjIwNzA2VjJfUElEKSB9LAogCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npb19pZHMuaCBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npb19pZHMuaAppbmRleCBjNWQ2YzFlLi5mODdhOTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW9faWRzLmgKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvX2lkcy5oCkBAIC00MDYsNiArNDA2LDEyIEBACiAjZGVmaW5lIEZURElfNE5fR0FMQVhZX0RFXzNfUElECTB4RjNDMgogCiAvKgorICogSXZpdW0gVGVjaG5vbG9naWVzIHByb2R1Y3QgSURzCisgKi8KKyNkZWZpbmUgRlRESV9QQUxNU0VOU19QSUQJMHhmNDQwCisjZGVmaW5lIEZURElfSVZJVU1fWFNUQVRfUElECTB4ZjQ0MQorCisvKgogICogTGlueCBUZWNobm9sb2dpZXMgcHJvZHVjdCBpZHMKICAqLwogI2RlZmluZSBMSU5YX1NETVVTQlFTU19QSUQJMHhGNDQ4CS8qIExpbnggU0RNLVVTQi1RUy1TICovCkBAIC02NzMsNiArNjc5LDEyIEBACiAjZGVmaW5lIElOVFJFUElEX05FT1ZJX1BJRAkweDA3MDEKIAogLyoKKyAqIFdJQ0VEIFVTQiBVQVJUCisgKi8KKyNkZWZpbmUgV0lDRURfVklECQkweDBBNUMKKyNkZWZpbmUgV0lDRURfVVNCMjA3MDZWMl9QSUQJMHg2NDIyCisKKy8qCiAgKiBEZWZpbml0aW9ucyBmb3IgSUQgVEVDSCAod3d3LmlkdC1uZXQuY29tKSBkZXZpY2VzCiAgKi8KICNkZWZpbmUgSURURUNIX1ZJRAkJMHgwQUNECS8qIElEIFRFQ0ggVmVuZG9yIElEICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbl9wZGEuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jCmluZGV4IDRmN2UwNzIuLmU0OWFkMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jCkBAIC0zMCwxMiArMzAsMTIgQEAKICNpbmNsdWRlIDxsaW51eC91c2IvZXp1c2IuaD4KIAogLyogbWFrZSBhIHNpbXBsZSBkZWZpbmUgdG8gaGFuZGxlIGlmIHdlIGFyZSBjb21waWxpbmcga2V5c3Bhbl9wZGEgb3IgeGlyY29tIHN1cHBvcnQgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fUERBKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fUERBX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fUERBKQogCSNkZWZpbmUgS0VZU1BBTgogI2Vsc2UKIAkjdW5kZWYgS0VZU1BBTgogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfVVNCX1NFUklBTF9YSVJDT00pIHx8IGRlZmluZWQoQ09ORklHX1VTQl9TRVJJQUxfWElSQ09NX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19VU0JfU0VSSUFMX1hJUkNPTSkKIAkjZGVmaW5lIFhJUkNPTQogI2Vsc2UKIAkjdW5kZWYgWElSQ09NCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzcyMC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYwppbmRleCA1NjA4YWY0Li5kZTk5OTJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzcyMC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3NzIwLmMKQEAgLTEyNTIsNyArMTI1Miw3IEBACiAKIAlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgewogCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2MoVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFLAotCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJCQkJCSAgICAgICBHRlBfQVRPTUlDKTsKIAkJaWYgKCF1cmItPnRyYW5zZmVyX2J1ZmZlcikKIAkJCWdvdG8gZXhpdDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwppbmRleCBlZDM3OGZiLi41NzQyNmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKQEAgLTEzNDAsOCArMTM0MCw4IEBACiAJfQogCiAJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKLQkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPQotCQkgICAga21hbGxvYyhVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2MoVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFLAorCQkJCQkgICAgICAgR0ZQX0FUT01JQyk7CiAJCWlmICghdXJiLT50cmFuc2Zlcl9idWZmZXIpCiAJCQlnb3RvIGV4aXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCmluZGV4IDhlMDc1MzYuLjk4OTRlMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKQEAgLTI3NCw2ICsyNzQsMTIgQEAKICNkZWZpbmUgVEVMSVRfUFJPRFVDVF9MRTkyMAkJCTB4MTIwMAogI2RlZmluZSBURUxJVF9QUk9EVUNUX0xFOTEwCQkJMHgxMjAxCiAjZGVmaW5lIFRFTElUX1BST0RVQ1RfTEU5MTBfVVNCQ0ZHNAkJMHgxMjA2CisjZGVmaW5lIFRFTElUX1BST0RVQ1RfTEU5MjBBNF8xMjA3CQkweDEyMDcKKyNkZWZpbmUgVEVMSVRfUFJPRFVDVF9MRTkyMEE0XzEyMDgJCTB4MTIwOAorI2RlZmluZSBURUxJVF9QUk9EVUNUX0xFOTIwQTRfMTIxMQkJMHgxMjExCisjZGVmaW5lIFRFTElUX1BST0RVQ1RfTEU5MjBBNF8xMjEyCQkweDEyMTIKKyNkZWZpbmUgVEVMSVRfUFJPRFVDVF9MRTkyMEE0XzEyMTMJCTB4MTIxMworI2RlZmluZSBURUxJVF9QUk9EVUNUX0xFOTIwQTRfMTIxNAkJMHgxMjE0CiAKIC8qIFpURSBQUk9EVUNUUyAqLwogI2RlZmluZSBaVEVfVkVORE9SX0lECQkJCTB4MTlkMgpAQCAtNTE5LDYgKzUyNSwxMiBAQAogI2RlZmluZSBWSUFURUxFQ09NX1ZFTkRPUl9JRAkJCTB4MTVlYgogI2RlZmluZSBWSUFURUxFQ09NX1BST0RVQ1RfQ0RTNwkJCTB4MDAwMQogCisvKiBXZVRlbGVjb20gcHJvZHVjdHMgKi8KKyNkZWZpbmUgV0VURUxFQ09NX1ZFTkRPUl9JRAkJCTB4MjJkZQorI2RlZmluZSBXRVRFTEVDT01fUFJPRFVDVF9XTUQyMDAJCTB4NjgwMQorI2RlZmluZSBXRVRFTEVDT01fUFJPRFVDVF82ODAyCQkJMHg2ODAyCisjZGVmaW5lIFdFVEVMRUNPTV9QUk9EVUNUX1dNRDMwMAkJMHg2ODAzCisKIHN0cnVjdCBvcHRpb25fYmxhY2tsaXN0X2luZm8gewogCS8qIGJpdG1hc2sgb2YgaW50ZXJmYWNlIG51bWJlcnMgYmxhY2tsaXN0ZWQgZm9yIHNlbmRfc2V0dXAgKi8KIAljb25zdCB1bnNpZ25lZCBsb25nIHNlbmRzZXR1cDsKQEAgLTYyOCw2ICs2NDAsMTEgQEAKIAkucmVzZXJ2ZWQgPSBCSVQoMSkgfCBCSVQoNSksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbl9ibGFja2xpc3RfaW5mbyB0ZWxpdF9sZTkyMGE0X2JsYWNrbGlzdF8xID0geworCS5zZW5kc2V0dXAgPSBCSVQoMCksCisJLnJlc2VydmVkID0gQklUKDEpLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb25fYmxhY2tsaXN0X2luZm8gdGVsaXRfbGU5MjJfYmxhY2tsaXN0X3VzYmNmZzAgPSB7CiAJLnNlbmRzZXR1cCA9IEJJVCgyKSwKIAkucmVzZXJ2ZWQgPSBCSVQoMCkgfCBCSVQoMSkgfCBCSVQoMyksCkBAIC0xMjAzLDYgKzEyMjAsMTYgQEAKIAkJLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZ0ZWxpdF9sZTkyMl9ibGFja2xpc3RfdXNiY2ZnMyB9LAogCXsgVVNCX0RFVklDRShURUxJVF9WRU5ET1JfSUQsIFRFTElUX1BST0RVQ1RfTEU5MjApLAogCQkuZHJpdmVyX2luZm8gPSAoa2VybmVsX3Vsb25nX3QpJnRlbGl0X2xlOTIwX2JsYWNrbGlzdCB9LAorCXsgVVNCX0RFVklDRShURUxJVF9WRU5ET1JfSUQsIFRFTElUX1BST0RVQ1RfTEU5MjBBNF8xMjA3KSB9LAorCXsgVVNCX0RFVklDRShURUxJVF9WRU5ET1JfSUQsIFRFTElUX1BST0RVQ1RfTEU5MjBBNF8xMjA4KSwKKwkJLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZ0ZWxpdF9sZTkyMGE0X2JsYWNrbGlzdF8xIH0sCisJeyBVU0JfREVWSUNFKFRFTElUX1ZFTkRPUl9JRCwgVEVMSVRfUFJPRFVDVF9MRTkyMEE0XzEyMTEpLAorCQkuZHJpdmVyX2luZm8gPSAoa2VybmVsX3Vsb25nX3QpJnRlbGl0X2xlOTIyX2JsYWNrbGlzdF91c2JjZmczIH0sCisJeyBVU0JfREVWSUNFKFRFTElUX1ZFTkRPUl9JRCwgVEVMSVRfUFJPRFVDVF9MRTkyMEE0XzEyMTIpLAorCQkuZHJpdmVyX2luZm8gPSAoa2VybmVsX3Vsb25nX3QpJnRlbGl0X2xlOTIwYTRfYmxhY2tsaXN0XzEgfSwKKwl7IFVTQl9ERVZJQ0VfSU5URVJGQUNFX0NMQVNTKFRFTElUX1ZFTkRPUl9JRCwgVEVMSVRfUFJPRFVDVF9MRTkyMEE0XzEyMTMsIDB4ZmYpIH0sCisJeyBVU0JfREVWSUNFKFRFTElUX1ZFTkRPUl9JRCwgVEVMSVRfUFJPRFVDVF9MRTkyMEE0XzEyMTQpLAorCQkuZHJpdmVyX2luZm8gPSAoa2VybmVsX3Vsb25nX3QpJnRlbGl0X2xlOTIyX2JsYWNrbGlzdF91c2JjZmczIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCBaVEVfUFJPRFVDVF9NRjYyMiwgMHhmZiwgMHhmZiwgMHhmZikgfSwgLyogWlRFIFdDRE1BIHByb2R1Y3RzICovCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDAwMDIsIDB4ZmYsIDB4ZmYsIDB4ZmYpLAogCQkuZHJpdmVyX2luZm8gPSAoa2VybmVsX3Vsb25nX3QpJm5ldF9pbnRmMV9ibGFja2xpc3QgfSwKQEAgLTE5NjYsOSArMTk5MywxMyBAQAogCSAgLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZuZXRfaW50ZjRfYmxhY2tsaXN0IH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDA3ZDEsIDB4M2UwMSwgMHhmZiwgMHhmZiwgMHhmZikgfSwgLyogRC1MaW5rIERXTS0xNTIvQzEgKi8KIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MDdkMSwgMHgzZTAyLCAweGZmLCAweGZmLCAweGZmKSB9LCAvKiBELUxpbmsgRFdNLTE1Ni9DMSAqLworCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgwN2QxLCAweDdlMTEsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sIC8qIEQtTGluayBEV00tMTU2L0EzICovCiAJeyBVU0JfREVWSUNFX0lOVEVSRkFDRV9DTEFTUygweDIwMjAsIDB4NDAwMCwgMHhmZikgfSwgICAgICAgICAgICAgICAgLyogT0xJQ0FSRDMwMCAtIE1UNjIyNSAqLwogCXsgVVNCX0RFVklDRShJTk9WSUFfVkVORE9SX0lELCBJTk9WSUFfU0VXODU4KSB9LAogCXsgVVNCX0RFVklDRShWSUFURUxFQ09NX1ZFTkRPUl9JRCwgVklBVEVMRUNPTV9QUk9EVUNUX0NEUzcpIH0sCisJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhXRVRFTEVDT01fVkVORE9SX0lELCBXRVRFTEVDT01fUFJPRFVDVF9XTUQyMDAsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCisJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhXRVRFTEVDT01fVkVORE9SX0lELCBXRVRFTEVDT01fUFJPRFVDVF82ODAyLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oV0VURUxFQ09NX1ZFTkRPUl9JRCwgV0VURUxFQ09NX1BST0RVQ1RfV01EMzAwLCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgfSAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBvcHRpb25faWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jCmluZGV4IDA3YjRiZjAuLmE4YjliZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYwpAQCAtMTc5LDIzICsxNzksMjMgQEAKIAogLyogQ29uZmlnIHN0cnVjdCAqLwogc3RydWN0IHRpX3VhcnRfY29uZmlnIHsKLQlfX3UxNgl3QmF1ZFJhdGU7Ci0JX191MTYJd0ZsYWdzOwotCV9fdTgJYkRhdGFCaXRzOwotCV9fdTgJYlBhcml0eTsKLQlfX3U4CWJTdG9wQml0czsKKwlfX2JlMTYJd0JhdWRSYXRlOworCV9fYmUxNgl3RmxhZ3M7CisJdTgJYkRhdGFCaXRzOworCXU4CWJQYXJpdHk7CisJdTgJYlN0b3BCaXRzOwogCWNoYXIJY1hvbjsKIAljaGFyCWNYb2ZmOwotCV9fdTgJYlVhcnRNb2RlOworCXU4CWJVYXJ0TW9kZTsKIH0gX19wYWNrZWQ7CiAKIC8qIEdldCBwb3J0IHN0YXR1cyAqLwogc3RydWN0IHRpX3BvcnRfc3RhdHVzIHsKLQlfX3U4CWJDbWRDb2RlOwotCV9fdTgJYk1vZHVsZUlkOwotCV9fdTgJYkVycm9yQ29kZTsKLQlfX3U4CWJNU1I7Ci0JX191OAliTFNSOworCXU4IGJDbWRDb2RlOworCXU4IGJNb2R1bGVJZDsKKwl1OCBiRXJyb3JDb2RlOworCXU4IGJNU1I7CisJdTggYkxTUjsKIH0gX19wYWNrZWQ7CiAKIC8qIFB1cmdlIG1vZGVzICovCkBAIC0yMTgsMTIgKzIxOCwxMiBAQAogI2RlZmluZSBUSV9SV19EQVRBX0RPVUJMRV9XT1JECQkweDA0CiAKIHN0cnVjdCB0aV93cml0ZV9kYXRhX2J5dGVzIHsKLQlfX3U4CWJBZGRyVHlwZTsKLQlfX3U4CWJEYXRhVHlwZTsKLQlfX3U4CWJEYXRhQ291bnRlcjsKKwl1OAliQWRkclR5cGU7CisJdTgJYkRhdGFUeXBlOworCXU4CWJEYXRhQ291bnRlcjsKIAlfX2JlMTYJd0Jhc2VBZGRySGk7CiAJX19iZTE2CXdCYXNlQWRkckxvOwotCV9fdTgJYkRhdGFbMF07CisJdTgJYkRhdGFbMF07CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgdGlfcmVhZF9kYXRhX3JlcXVlc3QgewpAQCAtMjU4LDcgKzI1OCw3IEBACiAvKiBGaXJtd2FyZSBpbWFnZSBoZWFkZXIgKi8KIHN0cnVjdCB0aV9maXJtd2FyZV9oZWFkZXIgewogCV9fbGUxNgl3TGVuZ3RoOwotCV9fdTgJYkNoZWNrU3VtOworCXU4CWJDaGVja1N1bTsKIH0gX19wYWNrZWQ7CiAKIC8qIFVBUlQgYWRkcmVzc2VzICovCkBAIC0yNzYsOSArMjc2LDYgQEAKIAogI2RlZmluZSBUSV9ERUZBVUxUX0NMT1NJTkdfV0FJVAk0MDAwCQkvKiBpbiAuMDEgc2VjcyAqLwogCi0vKiBzdXBwb3J0ZWQgc2V0c2VyaWFsIGZsYWdzICovCi0jZGVmaW5lIFRJX1NFVF9TRVJJQUxfRkxBR1MJMAotCiAvKiByZWFkIHVyYiBzdGF0ZXMgKi8KICNkZWZpbmUgVElfUkVBRF9VUkJfUlVOTklORwkwCiAjZGVmaW5lIFRJX1JFQURfVVJCX1NUT1BQSU5HCTEKQEAgLTI4OCwxMSArMjg1LDEwIEBACiAKIHN0cnVjdCB0aV9wb3J0IHsKIAlpbnQJCQl0cF9pc19vcGVuOwotCV9fdTgJCQl0cF9tc3I7Ci0JX191OAkJCXRwX3NoYWRvd19tY3I7Ci0JX191OAkJCXRwX3VhcnRfbW9kZTsJLyogMjMyIG9yIDQ4NSBtb2RlcyAqLworCXU4CQkJdHBfbXNyOworCXU4CQkJdHBfc2hhZG93X21jcjsKKwl1OAkJCXRwX3VhcnRfbW9kZTsJLyogMjMyIG9yIDQ4NSBtb2RlcyAqLwogCXVuc2lnbmVkIGludAkJdHBfdWFydF9iYXNlX2FkZHI7Ci0JaW50CQkJdHBfZmxhZ3M7CiAJc3RydWN0IHRpX2RldmljZQkqdHBfdGRldjsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0CSp0cF9wb3J0OwogCXNwaW5sb2NrX3QJCXRwX2xvY2s7CkBAIC0zMDYsNyArMzAyLDYgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbAkqdGRfc2VyaWFsOwogCWludAkJCXRkX2lzXzM0MTA7CiAJYm9vbAkJCXRkX3JzNDg1X29ubHk7Ci0JaW50CQkJdGRfdXJiX2Vycm9yOwogfTsKIAogc3RhdGljIGludCB0aV9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwpAQCAtMzQzLDcgKzMzOCw3IEBACiAJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpyZXRfYXJnKTsKIHN0YXRpYyBpbnQgdGlfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0aV9wb3J0ICp0cG9ydCwKIAlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKm5ld19hcmcpOwotc3RhdGljIHZvaWQgdGlfaGFuZGxlX25ld19tc3Ioc3RydWN0IHRpX3BvcnQgKnRwb3J0LCBfX3U4IG1zcik7CitzdGF0aWMgdm9pZCB0aV9oYW5kbGVfbmV3X21zcihzdHJ1Y3QgdGlfcG9ydCAqdHBvcnQsIHU4IG1zcik7CiAKIHN0YXRpYyB2b2lkIHRpX3N0b3BfcmVhZChzdHJ1Y3QgdGlfcG9ydCAqdHBvcnQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogc3RhdGljIGludCB0aV9yZXN0YXJ0X3JlYWQoc3RydWN0IHRpX3BvcnQgKnRwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKQEAgLTM1NCw3ICszNDksNyBAQAogCV9fdTE2IG1vZHVsZWlkLCBfX3UxNiB2YWx1ZSwgX191OCAqZGF0YSwgaW50IHNpemUpOwogCiBzdGF0aWMgaW50IHRpX3dyaXRlX2J5dGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IHRpX2RldmljZSAqdGRldiwKLQkJCSB1bnNpZ25lZCBsb25nIGFkZHIsIF9fdTggbWFzaywgX191OCBieXRlKTsKKwkJCSB1bnNpZ25lZCBsb25nIGFkZHIsIHU4IG1hc2ssIHU4IGJ5dGUpOwogCiBzdGF0aWMgaW50IHRpX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCB0aV9kZXZpY2UgKnRkZXYpOwogCkBAIC02NDcsMTIgKzY0MiwxMSBAQAogCXN0cnVjdCB1cmIgKnVyYjsKIAlpbnQgcG9ydF9udW1iZXI7CiAJaW50IHN0YXR1czsKLQlfX3UxNiBvcGVuX3NldHRpbmdzID0gKF9fdTgpKFRJX1BJUEVfTU9ERV9DT05USU5VT1VTIHwKLQkJCSAgICAgVElfUElQRV9USU1FT1VUX0VOQUJMRSB8Ci0JCQkgICAgIChUSV9UUkFOU0ZFUl9USU1FT1VUIDw8IDIpKTsKKwl1MTYgb3Blbl9zZXR0aW5nczsKIAotCWlmICh0cG9ydCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlvcGVuX3NldHRpbmdzID0gKFRJX1BJUEVfTU9ERV9DT05USU5VT1VTIHwKKwkJCSBUSV9QSVBFX1RJTUVPVVRfRU5BQkxFIHwKKwkJCSAoVElfVFJBTlNGRVJfVElNRU9VVCA8PCAyKSk7CiAKIAlkZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAl0ZGV2ID0gdHBvcnQtPnRwX3RkZXY7CkBAIC02ODYsNyArNjgwLDYgQEAKIAlpZiAodHR5KQogCQl0aV9zZXRfdGVybWlvcyh0dHksIHBvcnQsICZ0dHktPnRlcm1pb3MpOwogCi0JZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzZW5kaW5nIFRJX09QRU5fUE9SVFxuIiwgX19mdW5jX18pOwogCXN0YXR1cyA9IHRpX2NvbW1hbmRfb3V0X3N5bmModGRldiwgVElfT1BFTl9QT1JULAogCQkoX191OCkoVElfVUFSVDFfUE9SVCArIHBvcnRfbnVtYmVyKSwgb3Blbl9zZXR0aW5ncywgTlVMTCwgMCk7CiAJaWYgKHN0YXR1cykgewpAQCAtNjk1LDcgKzY4OCw2IEBACiAJCWdvdG8gdW5saW5rX2ludF91cmI7CiAJfQogCi0JZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzZW5kaW5nIFRJX1NUQVJUX1BPUlRcbiIsIF9fZnVuY19fKTsKIAlzdGF0dXMgPSB0aV9jb21tYW5kX291dF9zeW5jKHRkZXYsIFRJX1NUQVJUX1BPUlQsCiAJCShfX3U4KShUSV9VQVJUMV9QT1JUICsgcG9ydF9udW1iZXIpLCAwLCBOVUxMLCAwKTsKIAlpZiAoc3RhdHVzKSB7CkBAIC03MDQsNyArNjk2LDYgQEAKIAkJZ290byB1bmxpbmtfaW50X3VyYjsKIAl9CiAKLQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIHNlbmRpbmcgVElfUFVSR0VfUE9SVFxuIiwgX19mdW5jX18pOwogCXN0YXR1cyA9IHRpX2NvbW1hbmRfb3V0X3N5bmModGRldiwgVElfUFVSR0VfUE9SVCwKIAkJKF9fdTgpKFRJX1VBUlQxX1BPUlQgKyBwb3J0X251bWJlciksIFRJX1BVUkdFX0lOUFVULCBOVUxMLCAwKTsKIAlpZiAoc3RhdHVzKSB7CkBAIC03MjgsNyArNzE5LDYgQEAKIAlpZiAodHR5KQogCQl0aV9zZXRfdGVybWlvcyh0dHksIHBvcnQsICZ0dHktPnRlcm1pb3MpOwogCi0JZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzZW5kaW5nIFRJX09QRU5fUE9SVCAoMilcbiIsIF9fZnVuY19fKTsKIAlzdGF0dXMgPSB0aV9jb21tYW5kX291dF9zeW5jKHRkZXYsIFRJX09QRU5fUE9SVCwKIAkJKF9fdTgpKFRJX1VBUlQxX1BPUlQgKyBwb3J0X251bWJlciksIG9wZW5fc2V0dGluZ3MsIE5VTEwsIDApOwogCWlmIChzdGF0dXMpIHsKQEAgLTczNyw3ICs3MjcsNiBAQAogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KIAotCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gc2VuZGluZyBUSV9TVEFSVF9QT1JUICgyKVxuIiwgX19mdW5jX18pOwogCXN0YXR1cyA9IHRpX2NvbW1hbmRfb3V0X3N5bmModGRldiwgVElfU1RBUlRfUE9SVCwKIAkJKF9fdTgpKFRJX1VBUlQxX1BPUlQgKyBwb3J0X251bWJlciksIDAsIE5VTEwsIDApOwogCWlmIChzdGF0dXMpIHsKQEAgLTc0Nyw3ICs3MzYsNiBAQAogCX0KIAogCS8qIHN0YXJ0IHJlYWQgdXJiICovCi0JZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzdGFydCByZWFkIHVyYlxuIiwgX19mdW5jX18pOwogCXVyYiA9IHBvcnQtPnJlYWRfdXJiOwogCWlmICghdXJiKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gbm8gcmVhZCB1cmJcbiIsIF9fZnVuY19fKTsKQEAgLTc3Myw3ICs3NjEsNiBAQAogCQl1c2Jfa2lsbF91cmIocG9ydC0+c2VyaWFsLT5wb3J0WzBdLT5pbnRlcnJ1cHRfaW5fdXJiKTsKIHJlbGVhc2VfbG9jazoKIAltdXRleF91bmxvY2soJnRkZXYtPnRkX29wZW5fY2xvc2VfbG9jayk7Ci0JZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBleGl0ICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC03ODksOCArNzc2LDYgQEAKIAogCXRkZXYgPSB1c2JfZ2V0X3NlcmlhbF9kYXRhKHBvcnQtPnNlcmlhbCk7CiAJdHBvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0JaWYgKHRkZXYgPT0gTlVMTCB8fCB0cG9ydCA9PSBOVUxMKQotCQlyZXR1cm47CiAKIAl0cG9ydC0+dHBfaXNfb3BlbiA9IDA7CiAKQEAgLTgwMyw3ICs3ODgsNiBAQAogCiAJcG9ydF9udW1iZXIgPSBwb3J0LT5wb3J0X251bWJlcjsKIAotCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gc2VuZGluZyBUSV9DTE9TRV9QT1JUXG4iLCBfX2Z1bmNfXyk7CiAJc3RhdHVzID0gdGlfY29tbWFuZF9vdXRfc3luYyh0ZGV2LCBUSV9DTE9TRV9QT1JULAogCQkgICAgIChfX3U4KShUSV9VQVJUMV9QT1JUICsgcG9ydF9udW1iZXIpLCAwLCBOVUxMLCAwKTsKIAlpZiAoc3RhdHVzKQpAQCAtODMwLDExICs4MTQsMTAgQEAKIAlzdHJ1Y3QgdGlfcG9ydCAqdHBvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKIAlpZiAoY291bnQgPT0gMCkgewotCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlc1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAodHBvcnQgPT0gTlVMTCB8fCAhdHBvcnQtPnRwX2lzX29wZW4pCisJaWYgKCF0cG9ydC0+dHBfaXNfb3BlbikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAljb3VudCA9IGtmaWZvX2luX2xvY2tlZCgmcG9ydC0+d3JpdGVfZmlmbywgZGF0YSwgY291bnQsCkBAIC04NTIsOSArODM1LDYgQEAKIAlpbnQgcm9vbSA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICh0cG9ydCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwogCXJvb20gPSBrZmlmb19hdmFpbCgmcG9ydC0+d3JpdGVfZmlmbyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHBvcnQtPnRwX2xvY2ssIGZsYWdzKTsKQEAgLTg3MSw5ICs4NTEsNiBAQAogCWludCBjaGFycyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICh0cG9ydCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwogCWNoYXJzID0ga2ZpZm9fbGVuKCZwb3J0LT53cml0ZV9maWZvKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwpAQCAtOTAwLDkgKzg3Nyw2IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IHRpX3BvcnQgKnRwb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JaWYgKHRwb3J0ID09IE5VTEwpCi0JCXJldHVybjsKLQogCWlmIChJX0lYT0ZGKHR0eSkgfHwgQ19DUlRTQ1RTKHR0eSkpCiAJCXRpX3N0b3BfcmVhZCh0cG9ydCwgdHR5KTsKIApAQCAtOTE1LDkgKzg4OSw2IEBACiAJc3RydWN0IHRpX3BvcnQgKnRwb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWludCBzdGF0dXM7CiAKLQlpZiAodHBvcnQgPT0gTlVMTCkKLQkJcmV0dXJuOwotCiAJaWYgKElfSVhPRkYodHR5KSB8fCBDX0NSVFNDVFModHR5KSkgewogCQlzdGF0dXMgPSB0aV9yZXN0YXJ0X3JlYWQodHBvcnQsIHR0eSk7CiAJCWlmIChzdGF0dXMpCkBAIC05MzIsMTYgKzkwMywxMSBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCB0aV9wb3J0ICp0cG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWlmICh0cG9ydCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBUSU9DR1NFUklBTDoKLQkJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBUSU9DR1NFUklBTFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gdGlfZ2V0X3NlcmlhbF9pbmZvKHRwb3J0LAogCQkJCShzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKilhcmcpOwogCWNhc2UgVElPQ1NTRVJJQUw6Ci0JCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gVElPQ1NTRVJJQUxcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIHRpX3NldF9zZXJpYWxfaW5mbyh0dHksIHRwb3J0LAogCQkJCShzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKilhcmcpOwogCX0KQEAgLTk1OSw2ICs5MjUsOCBAQAogCWludCBzdGF0dXM7CiAJaW50IHBvcnRfbnVtYmVyID0gcG9ydC0+cG9ydF9udW1iZXI7CiAJdW5zaWduZWQgaW50IG1jcjsKKwl1MTYgd2JhdWRyYXRlOworCXUxNiB3ZmxhZ3MgPSAwOwogCiAJY2ZsYWcgPSB0dHktPnRlcm1pb3MuY19jZmxhZzsKIAlpZmxhZyA9IHR0eS0+dGVybWlvcy5jX2lmbGFnOwpAQCAtOTY3LDIxICs5MzUsMTYgQEAKIAlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIG9sZCBjbGZhZyAlMDh4LCBvbGQgaWZsYWcgJTA4eFxuIiwgX19mdW5jX18sCiAJCW9sZF90ZXJtaW9zLT5jX2NmbGFnLCBvbGRfdGVybWlvcy0+Y19pZmxhZyk7CiAKLQlpZiAodHBvcnQgPT0gTlVMTCkKLQkJcmV0dXJuOwotCiAJY29uZmlnID0ga21hbGxvYyhzaXplb2YoKmNvbmZpZyksIEdGUF9LRVJORUwpOwogCWlmICghY29uZmlnKQogCQlyZXR1cm47CiAKLQljb25maWctPndGbGFncyA9IDA7Ci0KIAkvKiB0aGVzZSBmbGFncyBtdXN0IGJlIHNldCAqLwotCWNvbmZpZy0+d0ZsYWdzIHw9IFRJX1VBUlRfRU5BQkxFX01TX0lOVFM7Ci0JY29uZmlnLT53RmxhZ3MgfD0gVElfVUFSVF9FTkFCTEVfQVVUT19TVEFSVF9ETUE7Ci0JY29uZmlnLT5iVWFydE1vZGUgPSAoX191OCkodHBvcnQtPnRwX3VhcnRfbW9kZSk7CisJd2ZsYWdzIHw9IFRJX1VBUlRfRU5BQkxFX01TX0lOVFM7CisJd2ZsYWdzIHw9IFRJX1VBUlRfRU5BQkxFX0FVVE9fU1RBUlRfRE1BOworCWNvbmZpZy0+YlVhcnRNb2RlID0gdHBvcnQtPnRwX3VhcnRfbW9kZTsKIAotCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgeworCXN3aXRjaCAoQ19DU0laRSh0dHkpKSB7CiAJY2FzZSBDUzU6CiAJCSAgICBjb25maWctPmJEYXRhQml0cyA9IFRJX1VBUlRfNV9EQVRBX0JJVFM7CiAJCSAgICBicmVhazsKQEAgLTEwMDAsMjkgKzk2MywyOSBAQAogCS8qIENNU1BBUiBpc24ndCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgKi8KIAl0dHktPnRlcm1pb3MuY19jZmxhZyAmPSB+Q01TUEFSOwogCi0JaWYgKGNmbGFnICYgUEFSRU5CKSB7Ci0JCWlmIChjZmxhZyAmIFBBUk9ERCkgewotCQkJY29uZmlnLT53RmxhZ3MgfD0gVElfVUFSVF9FTkFCTEVfUEFSSVRZX0NIRUNLSU5HOworCWlmIChDX1BBUkVOQih0dHkpKSB7CisJCWlmIChDX1BBUk9ERCh0dHkpKSB7CisJCQl3ZmxhZ3MgfD0gVElfVUFSVF9FTkFCTEVfUEFSSVRZX0NIRUNLSU5HOwogCQkJY29uZmlnLT5iUGFyaXR5ID0gVElfVUFSVF9PRERfUEFSSVRZOwogCQl9IGVsc2UgewotCQkJY29uZmlnLT53RmxhZ3MgfD0gVElfVUFSVF9FTkFCTEVfUEFSSVRZX0NIRUNLSU5HOworCQkJd2ZsYWdzIHw9IFRJX1VBUlRfRU5BQkxFX1BBUklUWV9DSEVDS0lORzsKIAkJCWNvbmZpZy0+YlBhcml0eSA9IFRJX1VBUlRfRVZFTl9QQVJJVFk7CiAJCX0KIAl9IGVsc2UgewotCQljb25maWctPndGbGFncyAmPSB+VElfVUFSVF9FTkFCTEVfUEFSSVRZX0NIRUNLSU5HOworCQl3ZmxhZ3MgJj0gflRJX1VBUlRfRU5BQkxFX1BBUklUWV9DSEVDS0lORzsKIAkJY29uZmlnLT5iUGFyaXR5ID0gVElfVUFSVF9OT19QQVJJVFk7CiAJfQogCi0JaWYgKGNmbGFnICYgQ1NUT1BCKQorCWlmIChDX0NTVE9QQih0dHkpKQogCQljb25maWctPmJTdG9wQml0cyA9IFRJX1VBUlRfMl9TVE9QX0JJVFM7CiAJZWxzZQogCQljb25maWctPmJTdG9wQml0cyA9IFRJX1VBUlRfMV9TVE9QX0JJVFM7CiAKLQlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJaWYgKENfQ1JUU0NUUyh0dHkpKSB7CiAJCS8qIFJUUyBmbG93IGNvbnRyb2wgbXVzdCBiZSBvZmYgdG8gZHJvcCBSVFMgZm9yIGJhdWQgcmF0ZSBCMCAqLwotCQlpZiAoKGNmbGFnICYgQ0JBVUQpICE9IEIwKQotCQkJY29uZmlnLT53RmxhZ3MgfD0gVElfVUFSVF9FTkFCTEVfUlRTX0lOOwotCQljb25maWctPndGbGFncyB8PSBUSV9VQVJUX0VOQUJMRV9DVFNfT1VUOworCQlpZiAoKENfQkFVRCh0dHkpKSAhPSBCMCkKKwkJCXdmbGFncyB8PSBUSV9VQVJUX0VOQUJMRV9SVFNfSU47CisJCXdmbGFncyB8PSBUSV9VQVJUX0VOQUJMRV9DVFNfT1VUOwogCX0gZWxzZSB7CiAJCXRpX3Jlc3RhcnRfcmVhZCh0cG9ydCwgdHR5KTsKIAl9CkBAIC0xMDMyLDM0ICs5OTUsMzQgQEAKIAkJY29uZmlnLT5jWG9mZiA9IFNUT1BfQ0hBUih0dHkpOwogCiAJCWlmIChJX0lYT0ZGKHR0eSkpCi0JCQljb25maWctPndGbGFncyB8PSBUSV9VQVJUX0VOQUJMRV9YX0lOOworCQkJd2ZsYWdzIHw9IFRJX1VBUlRfRU5BQkxFX1hfSU47CiAJCWVsc2UKIAkJCXRpX3Jlc3RhcnRfcmVhZCh0cG9ydCwgdHR5KTsKIAogCQlpZiAoSV9JWE9OKHR0eSkpCi0JCQljb25maWctPndGbGFncyB8PSBUSV9VQVJUX0VOQUJMRV9YX09VVDsKKwkJCXdmbGFncyB8PSBUSV9VQVJUX0VOQUJMRV9YX09VVDsKIAl9CiAKIAliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUodHR5KTsKIAlpZiAoIWJhdWQpCiAJCWJhdWQgPSA5NjAwOwogCWlmICh0cG9ydC0+dHBfdGRldi0+dGRfaXNfMzQxMCkKLQkJY29uZmlnLT53QmF1ZFJhdGUgPSAoX191MTYpKCg5MjMwNzcgKyBiYXVkLzIpIC8gYmF1ZCk7CisJCXdiYXVkcmF0ZSA9ICg5MjMwNzcgKyBiYXVkLzIpIC8gYmF1ZDsKIAllbHNlCi0JCWNvbmZpZy0+d0JhdWRSYXRlID0gKF9fdTE2KSgoNDYxNTM4ICsgYmF1ZC8yKSAvIGJhdWQpOworCQl3YmF1ZHJhdGUgPSAoNDYxNTM4ICsgYmF1ZC8yKSAvIGJhdWQ7CiAKIAkvKiBGSVhNRTogU2hvdWxkIGNhbGN1bGF0ZSByZXN1bHRpbmcgYmF1ZCBoZXJlIGFuZCByZXBvcnQgaXQgYmFjayAqLwotCWlmICgoY2ZsYWcgJiBDQkFVRCkgIT0gQjApCisJaWYgKChDX0JBVUQodHR5KSkgIT0gQjApCiAJCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKHR0eSwgYmF1ZCwgYmF1ZCk7CiAKIAlkZXZfZGJnKCZwb3J0LT5kZXYsCiAJCSIlcyAtIEJhdWRSYXRlPSVkLCB3QmF1ZFJhdGU9JWQsIHdGbGFncz0weCUwNFgsIGJEYXRhQml0cz0lZCwgYlBhcml0eT0lZCwgYlN0b3BCaXRzPSVkLCBjWG9uPSVkLCBjWG9mZj0lZCwgYlVhcnRNb2RlPSVkXG4iLAotCQlfX2Z1bmNfXywgYmF1ZCwgY29uZmlnLT53QmF1ZFJhdGUsIGNvbmZpZy0+d0ZsYWdzLAorCQlfX2Z1bmNfXywgYmF1ZCwgd2JhdWRyYXRlLCB3ZmxhZ3MsCiAJCWNvbmZpZy0+YkRhdGFCaXRzLCBjb25maWctPmJQYXJpdHksIGNvbmZpZy0+YlN0b3BCaXRzLAogCQljb25maWctPmNYb24sIGNvbmZpZy0+Y1hvZmYsIGNvbmZpZy0+YlVhcnRNb2RlKTsKIAotCWNwdV90b19iZTE2cygmY29uZmlnLT53QmF1ZFJhdGUpOwotCWNwdV90b19iZTE2cygmY29uZmlnLT53RmxhZ3MpOworCWNvbmZpZy0+d0JhdWRSYXRlID0gY3B1X3RvX2JlMTYod2JhdWRyYXRlKTsKKwljb25maWctPndGbGFncyA9IGNwdV90b19iZTE2KHdmbGFncyk7CiAKIAlzdGF0dXMgPSB0aV9jb21tYW5kX291dF9zeW5jKHRwb3J0LT50cF90ZGV2LCBUSV9TRVRfQ09ORklHLAogCQkoX191OCkoVElfVUFSVDFfUE9SVCArIHBvcnRfbnVtYmVyKSwgMCwgKF9fdTggKiljb25maWcsCkBAIC0xMDcxLDcgKzEwMzQsNyBAQAogCS8qIFNFVF9DT05GSUcgYXNzZXJ0cyBSVFMgYW5kIERUUiwgcmVzZXQgdGhlbSBjb3JyZWN0bHkgKi8KIAltY3IgPSB0cG9ydC0+dHBfc2hhZG93X21jcjsKIAkvKiBpZiBiYXVkIHJhdGUgaXMgQjAsIGNsZWFyIFJUUyBhbmQgRFRSICovCi0JaWYgKChjZmxhZyAmIENCQVVEKSA9PSBCMCkKKwlpZiAoQ19CQVVEKHR0eSkgPT0gQjApCiAJCW1jciAmPSB+KFRJX01DUl9EVFIgfCBUSV9NQ1JfUlRTKTsKIAlzdGF0dXMgPSB0aV9zZXRfbWNyKHRwb3J0LCBtY3IpOwogCWlmIChzdGF0dXMpCkBAIC0xMDkyLDkgKzEwNTUsNiBAQAogCXVuc2lnbmVkIGludCBtY3I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICh0cG9ydCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwogCW1zciA9IHRwb3J0LT50cF9tc3I7CiAJbWNyID0gdHBvcnQtPnRwX3NoYWRvd19tY3I7CkBAIC0xMTIyLDkgKzEwODIsNiBAQAogCXVuc2lnbmVkIGludCBtY3I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICh0cG9ydCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwogCW1jciA9IHRwb3J0LT50cF9zaGFkb3dfbWNyOwogCkBAIC0xMTU1LDkgKzExMTIsNiBAQAogCiAJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzdGF0ZSA9ICVkXG4iLCBfX2Z1bmNfXywgYnJlYWtfc3RhdGUpOwogCi0JaWYgKHRwb3J0ID09IE5VTEwpCi0JCXJldHVybjsKLQogCXN0YXR1cyA9IHRpX3dyaXRlX2J5dGUocG9ydCwgdHBvcnQtPnRwX3RkZXYsCiAJCXRwb3J0LT50cF91YXJ0X2Jhc2VfYWRkciArIFRJX1VBUlRfT0ZGU0VUX0xDUiwKIAkJVElfTENSX0JSRUFLLCBicmVha19zdGF0ZSA9PSAtMSA/IFRJX0xDUl9CUkVBSyA6IDApOwpAQCAtMTE4OSw3ICsxMTQzLDcgQEAKIAlpbnQgZnVuY3Rpb247CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCWludCByZXR2YWw7Ci0JX191OCBtc3I7CisJdTggbXNyOwogCiAJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIDA6CkBAIC0xMTk4LDExICsxMTUyLDkgQEAKIAljYXNlIC1FTk9FTlQ6CiAJY2FzZSAtRVNIVVRET1dOOgogCQlkZXZfZGJnKGRldiwgIiVzIC0gdXJiIHNodXR0aW5nIGRvd24sICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJdGRldi0+dGRfdXJiX2Vycm9yID0gMTsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoZGV2LCAiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMsICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJdGRldi0+dGRfdXJiX2Vycm9yID0gMTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTI3NSwxMiArMTIyNywxMCBAQAogCWNhc2UgLUVOT0VOVDoKIAljYXNlIC1FU0hVVERPV046CiAJCWRldl9kYmcoZGV2LCAiJXMgLSB1cmIgc2h1dHRpbmcgZG93biwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwotCQl0cG9ydC0+dHBfdGRldi0+dGRfdXJiX2Vycm9yID0gMTsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoZGV2LCAiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMsICVkXG4iLAogCQkJX19mdW5jX18sIHN0YXR1cyk7Ci0JCXRwb3J0LT50cF90ZGV2LT50ZF91cmJfZXJyb3IgPSAxOwogCX0KIAogCWlmIChzdGF0dXMgPT0gLUVQSVBFKQpAQCAtMTMzNSwxMiArMTI4NSwxMCBAQAogCWNhc2UgLUVOT0VOVDoKIAljYXNlIC1FU0hVVERPV046CiAJCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gdXJiIHNodXR0aW5nIGRvd24sICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJdHBvcnQtPnRwX3RkZXYtPnRkX3VyYl9lcnJvciA9IDE7CiAJCXJldHVybjsKIAlkZWZhdWx0OgogCQlkZXZfZXJyX2NvbnNvbGUocG9ydCwgIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzLCAlZFxuIiwKIAkJCV9fZnVuY19fLCBzdGF0dXMpOwotCQl0cG9ydC0+dHBfdGRldi0+dGRfdXJiX2Vycm9yID0gMTsKIAl9CiAKIAkvKiBzZW5kIGFueSBidWZmZXJlZCBkYXRhICovCkBAIC0xNDkwLDcgKzE0MzgsNiBAQAogCXJldF9zZXJpYWwudHlwZSA9IFBPUlRfMTY1NTBBOwogCXJldF9zZXJpYWwubGluZSA9IHBvcnQtPm1pbm9yOwogCXJldF9zZXJpYWwucG9ydCA9IHBvcnQtPnBvcnRfbnVtYmVyOwotCXJldF9zZXJpYWwuZmxhZ3MgPSB0cG9ydC0+dHBfZmxhZ3M7CiAJcmV0X3NlcmlhbC54bWl0X2ZpZm9fc2l6ZSA9IGtmaWZvX3NpemUoJnBvcnQtPndyaXRlX2ZpZm8pOwogCXJldF9zZXJpYWwuYmF1ZF9iYXNlID0gdHBvcnQtPnRwX3RkZXYtPnRkX2lzXzM0MTAgPyA5MjE2MDAgOiA0NjA4MDA7CiAJcmV0X3NlcmlhbC5jbG9zaW5nX3dhaXQgPSBjd2FpdDsKQEAgLTE1MTUsMTQgKzE0NjIsMTMgQEAKIAlpZiAoY3dhaXQgIT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUpCiAJCWN3YWl0ID0gbXNlY3NfdG9famlmZmllcygxMCAqIG5ld19zZXJpYWwuY2xvc2luZ193YWl0KTsKIAotCXRwb3J0LT50cF9mbGFncyA9IG5ld19zZXJpYWwuZmxhZ3MgJiBUSV9TRVRfU0VSSUFMX0ZMQUdTOwogCXRwb3J0LT50cF9wb3J0LT5wb3J0LmNsb3Npbmdfd2FpdCA9IGN3YWl0OwogCiAJcmV0dXJuIDA7CiB9CiAKIAotc3RhdGljIHZvaWQgdGlfaGFuZGxlX25ld19tc3Ioc3RydWN0IHRpX3BvcnQgKnRwb3J0LCBfX3U4IG1zcikKK3N0YXRpYyB2b2lkIHRpX2hhbmRsZV9uZXdfbXNyKHN0cnVjdCB0aV9wb3J0ICp0cG9ydCwgdTggbXNyKQogewogCXN0cnVjdCBhc3luY19pY291bnQgKmljb3VudDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwpAQCAtMTYzNCw4ICsxNTgwLDggQEAKIAogCiBzdGF0aWMgaW50IHRpX3dyaXRlX2J5dGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQkJCXN0cnVjdCB0aV9kZXZpY2UgKnRkZXYsIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCV9fdTggbWFzaywgX191OCBieXRlKQorCQkJIHN0cnVjdCB0aV9kZXZpY2UgKnRkZXYsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSB1OCBtYXNrLCB1OCBieXRlKQogewogCWludCBzdGF0dXM7CiAJdW5zaWduZWQgaW50IHNpemU7CkBAIC0xNjc5LDExICsxNjI1LDEwIEBACiAJaW50IGxlbjsKIAogCWZvciAocG9zID0gc2l6ZW9mKHN0cnVjdCB0aV9maXJtd2FyZV9oZWFkZXIpOyBwb3MgPCBzaXplOyBwb3MrKykKLQkJY3MgPSAoX191OCkoY3MgKyBidWZmZXJbcG9zXSk7CisJCWNzID0gKHU4KShjcyArIGJ1ZmZlcltwb3NdKTsKIAogCWhlYWRlciA9IChzdHJ1Y3QgdGlfZmlybXdhcmVfaGVhZGVyICopYnVmZmVyOwotCWhlYWRlci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KChfX3UxNikoc2l6ZQotCQkJCQktIHNpemVvZihzdHJ1Y3QgdGlfZmlybXdhcmVfaGVhZGVyKSkpOworCWhlYWRlci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KHNpemUgLSBzaXplb2YoKmhlYWRlcikpOwogCWhlYWRlci0+YkNoZWNrU3VtID0gY3M7CiAKIAlkZXZfZGJnKCZkZXYtPmRldiwgIiVzIC0gZG93bmxvYWRpbmcgZmlybXdhcmVcbiIsIF9fZnVuY19fKTsKQEAgLTE3MDEsNyArMTY0Niw3IEBACiB7CiAJaW50IHN0YXR1czsKIAlpbnQgYnVmZmVyX3NpemU7Ci0JX191OCAqYnVmZmVyOworCXU4ICpidWZmZXI7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHRkZXYtPnRkX3NlcmlhbC0+ZGV2OwogCXVuc2lnbmVkIGludCBwaXBlID0gdXNiX3NuZGJ1bGtwaXBlKGRldiwKIAkJdGRldi0+dGRfc2VyaWFsLT5wb3J0WzBdLT5idWxrX291dF9lbmRwb2ludEFkZHJlc3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwtc2ltcGxlLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC1zaW1wbGUuYwppbmRleCBhMjA0NzgyLi5lOThiNmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC1zaW1wbGUuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC1zaW1wbGUuYwpAQCAtNTQsNyArNTQsOCBAQAogLyogSW5maW5lb24gRmxhc2hsb2FkZXIgZHJpdmVyICovCiAjZGVmaW5lIEZMQVNITE9BREVSX0lEUygpCQlcCiAJeyBVU0JfREVWSUNFX0lOVEVSRkFDRV9DTEFTUygweDA1OGIsIDB4MDA0MSwgVVNCX0NMQVNTX0NEQ19EQVRBKSB9LCBcCi0JeyBVU0JfREVWSUNFKDB4ODA4NywgMHgwNzE2KSB9CisJeyBVU0JfREVWSUNFKDB4ODA4NywgMHgwNzE2KSB9LCBcCisJeyBVU0JfREVWSUNFKDB4ODA4NywgMHgwODAxKSB9CiBERVZJQ0UoZmxhc2hsb2FkZXIsIEZMQVNITE9BREVSX0lEUyk7CiAKIC8qIEdvb2dsZSBTZXJpYWwgVVNCIFN1YkNsYXNzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYwppbmRleCBiMWI5YmFjLi5kMjEzY2Y0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKQEAgLTE0MzMsNyArMTQzMyw3IEBACiAKIAlyYyA9IHVzYl9yZWdpc3Rlcih1ZHJpdmVyKTsKIAlpZiAocmMpCi0JCXJldHVybiByYzsKKwkJZ290byBmYWlsZWRfdXNiX3JlZ2lzdGVyOwogCiAJZm9yIChzZCA9IHNlcmlhbF9kcml2ZXJzOyAqc2Q7ICsrc2QpIHsKIAkJKCpzZCktPnVzYl9kcml2ZXIgPSB1ZHJpdmVyOwpAQCAtMTQ1MSw2ICsxNDUxLDggQEAKIAl3aGlsZSAoc2QtLSA+IHNlcmlhbF9kcml2ZXJzKQogCQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoKnNkKTsKIAl1c2JfZGVyZWdpc3Rlcih1ZHJpdmVyKTsKK2ZhaWxlZF91c2JfcmVnaXN0ZXI6CisJa2ZyZWUodWRyaXZlcik7CiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX3NlcmlhbF9yZWdpc3Rlcl9kcml2ZXJzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvYWxhdWRhLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2FsYXVkYS5jCmluZGV4IDFkOGIwM2MuLjg3OGI0YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvYWxhdWRhLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9hbGF1ZGEuYwpAQCAtOTM5LDEwICs5MzksOCBAQAogCiAJbGVuID0gbWluKHNlY3RvcnMsIGJsb2Nrc2l6ZSkgKiAocGFnZXNpemUgKyA2NCk7CiAJYnVmZmVyID0ga21hbGxvYyhsZW4sIEdGUF9OT0lPKTsKLQlpZiAoYnVmZmVyID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWxhdWRhX3JlYWRfZGF0YTogT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFidWZmZXIpCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7Ci0JfQogCiAJLyogRmlndXJlIG91dCB0aGUgaW5pdGlhbCBMQkEgYW5kIHBhZ2UgKi8KIAlsYmEgPSBhZGRyZXNzID4+IGJsb2Nrc2hpZnQ7CkBAIC0xMDMzLDE4ICsxMDMxLDE1IEBACiAKIAlsZW4gPSBtaW4oc2VjdG9ycywgYmxvY2tzaXplKSAqIHBhZ2VzaXplOwogCWJ1ZmZlciA9IGttYWxsb2MobGVuLCBHRlBfTk9JTyk7Ci0JaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFsYXVkYV93cml0ZV9kYXRhOiBPdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWJ1ZmZlcikKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKLQl9CiAKIAkvKgogCSAqIFdlIGFsc28gbmVlZCBhIHRlbXBvcmFyeSBibG9jayBidWZmZXIsIHdoZXJlIHdlIHJlYWQgaW4gdGhlIG9sZCBkYXRhLAogCSAqIG92ZXJ3cml0ZSBwYXJ0cyB3aXRoIHRoZSBuZXcgZGF0YSwgYW5kIG1hbmlwdWxhdGUgdGhlIHJlZHVuZGFuY3kgZGF0YQogCSAqLwogCWJsb2NrYnVmZmVyID0ga21hbGxvYygocGFnZXNpemUgKyA2NCkgKiBibG9ja3NpemUsIEdGUF9OT0lPKTsKLQlpZiAoYmxvY2tidWZmZXIgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhbGF1ZGFfd3JpdGVfZGF0YTogT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFibG9ja2J1ZmZlcikgewogCQlrZnJlZShidWZmZXIpOwogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYwppbmRleCAzM2ViOTIzLi44Y2QyOTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jCkBAIC0yOTYsNiArMjk2LDE0IEBACiAJCWlmICh1cy0+ZmZsYWdzICYgVVNfRkxfQlJPS0VOX0ZVQSkKIAkJCXNkZXYtPmJyb2tlbl9mdWEgPSAxOwogCisJCS8qIFNvbWUgZXZlbiB0b3RhbGx5IGZhaWwgdG8gaW5kaWNhdGUgYSBjYWNoZSAqLworCQlpZiAodXMtPmZmbGFncyAmIFVTX0ZMX0FMV0FZU19TWU5DKSB7CisJCQkvKiBkb24ndCByZWFkIGNhY2hpbmcgaW5mb3JtYXRpb24gKi8KKwkJCXNkZXYtPnNraXBfbXNfcGFnZV84ID0gMTsKKwkJCXNkZXYtPnNraXBfbXNfcGFnZV8zZiA9IDE7CisJCQkvKiBhc3N1bWUgc3luYyBpcyBuZWVkZWQgKi8KKwkJCXNkZXYtPndjZV9kZWZhdWx0X29uID0gMTsKKwkJfQogCX0gZWxzZSB7CiAKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2RkcjA5LmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3NkZHIwOS5jCmluZGV4IGM1Nzk3ZmEuLjNhZWFhNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2RkcjA5LmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zZGRyMDkuYwpAQCAtNzY2LDEwICs3NjYsOCBAQAogCiAJbGVuID0gbWluKHNlY3RvcnMsICh1bnNpZ25lZCBpbnQpIGluZm8tPmJsb2Nrc2l6ZSkgKiBpbmZvLT5wYWdlc2l6ZTsKIAlidWZmZXIgPSBrbWFsbG9jKGxlbiwgR0ZQX05PSU8pOwotCWlmIChidWZmZXIgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJzZGRyMDlfcmVhZF9kYXRhOiBPdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWJ1ZmZlcikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJLy8gVGhpcyBjb3VsZCBiZSBtYWRlIG11Y2ggbW9yZSBlZmZpY2llbnQgYnkgY2hlY2tpbmcgZm9yCiAJLy8gY29udGlndW91cyBMQkEncy4gQW5vdGhlciBleGVyY2lzZSBsZWZ0IHRvIHRoZSBzdHVkZW50LgpAQCAtMTAwNCwxMCArMTAwMiw4IEBACiAJcGFnZWxlbiA9ICgxIDw8IGluZm8tPnBhZ2VzaGlmdCkgKyAoMSA8PCBDT05UUk9MX1NISUZUKTsKIAlibG9ja2xlbiA9IChwYWdlbGVuIDw8IGluZm8tPmJsb2Nrc2hpZnQpOwogCWJsb2NrYnVmZmVyID0ga21hbGxvYyhibG9ja2xlbiwgR0ZQX05PSU8pOwotCWlmICghYmxvY2tidWZmZXIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2RkcjA5X3dyaXRlX2RhdGE6IE91dCBvZiBtZW1vcnlcbiIpOworCWlmICghYmxvY2tidWZmZXIpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCS8qCiAJICogU2luY2Ugd2UgZG9uJ3Qgd3JpdGUgdGhlIHVzZXIgZGF0YSBkaXJlY3RseSB0byB0aGUgZGV2aWNlLApAQCAtMTAxNyw4ICsxMDEzLDcgQEAKIAogCWxlbiA9IG1pbihzZWN0b3JzLCAodW5zaWduZWQgaW50KSBpbmZvLT5ibG9ja3NpemUpICogaW5mby0+cGFnZXNpemU7CiAJYnVmZmVyID0ga21hbGxvYyhsZW4sIEdGUF9OT0lPKTsKLQlpZiAoYnVmZmVyID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2RkcjA5X3dyaXRlX2RhdGE6IE91dCBvZiBtZW1vcnlcbiIpOworCWlmICghYnVmZmVyKSB7CiAJCWtmcmVlKGJsb2NrYnVmZmVyKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTI0MSw4ICsxMjM2LDcgQEAKIAlhbGxvY19ibG9ja3MgPSBtaW4obnVtYmxvY2tzLCBTRERSMDlfUkVBRF9NQVBfQlVGU1ogPj4gQ09OVFJPTF9TSElGVCk7CiAJYWxsb2NfbGVuID0gKGFsbG9jX2Jsb2NrcyA8PCBDT05UUk9MX1NISUZUKTsKIAlidWZmZXIgPSBrbWFsbG9jKGFsbG9jX2xlbiwgR0ZQX05PSU8pOwotCWlmIChidWZmZXIgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJzZGRyMDlfcmVhZF9tYXA6IG91dCBvZiBtZW1vcnlcbiIpOworCWlmICghYnVmZmVyKSB7CiAJCXJlc3VsdCA9IC0xOwogCQlnb3RvIGRvbmU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKaW5kZXggYWEzNTM5Mi4uYWYzYzdlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaAorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCkBAIC0zMzgsNiArMzM4LDEzIEBACiAJCVVTQl9TQ19ERVZJQ0UsIFVTQl9QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX05PX1dQX0RFVEVDVCksCiAKKy8qIFJlcG9ydGVkIGJ5IEVnYmVydCBFaWNoIDxlaWNoQHN1c2UuY29tPiAqLworVU5VU1VBTF9ERVYoICAweDA0ODAsIDB4ZDAxMCwgMHgwMTAwLCAweDk5OTksCisJCSJUb3NoaWJhIiwKKwkJIkV4dGVybmFsIFVTQiAzLjAiLAorCQlVU0JfU0NfREVWSUNFLCBVU0JfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9BTFdBWVNfU1lOQyksCisKIC8qIFBhdGNoIHN1Ym1pdHRlZCBieSBQaGlsaXBwIEZyaWVkcmljaCA8cGhpbGlwcEB2b2lkLmF0PiAqLwogVU5VU1VBTF9ERVYoICAweDA0ODIsIDB4MDEwMCwgMHgwMTAwLCAweDAxMDAsCiAJCSJLeW9jZXJhIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCmluZGV4IGVmMmQ4Y2QuLjJjYmExM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwpAQCAtNDk4LDcgKzQ5OCw4IEBACiAJCQlVU19GTF9OT19SRUFEX0RJU0NfSU5GTyB8IFVTX0ZMX05PX1JFQURfQ0FQQUNJVFlfMTYgfAogCQkJVVNfRkxfSU5JVElBTF9SRUFEMTAgfCBVU19GTF9XUklURV9DQUNIRSB8CiAJCQlVU19GTF9OT19BVEFfMVggfCBVU19GTF9OT19SRVBPUlRfT1BDT0RFUyB8Ci0JCQlVU19GTF9NQVhfU0VDVE9SU18yNDAgfCBVU19GTF9OT19SRVBPUlRfTFVOUyk7CisJCQlVU19GTF9NQVhfU0VDVE9SU18yNDAgfCBVU19GTF9OT19SRVBPUlRfTFVOUyB8CisJCQlVU19GTF9BTFdBWVNfU1lOQyk7CiAKIAlwID0gcXVpcmtzOwogCXdoaWxlICgqcCkgewpAQCAtNTgxLDYgKzU4Miw5IEBACiAJCWNhc2UgJ3cnOgogCQkJZiB8PSBVU19GTF9OT19XUF9ERVRFQ1Q7CiAJCQlicmVhazsKKwkJY2FzZSAneSc6CisJCQlmIHw9IFVTX0ZMX0FMV0FZU19TWU5DOworCQkJYnJlYWs7CiAJCS8qIElnbm9yZSB1bnJlY29nbml6ZWQgZmxhZyBjaGFyYWN0ZXJzICovCiAJCX0KIAl9CkBAIC03OTQsMTAgKzc5OCw4IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICp0aDsKIAogCXVzLT5jdXJyZW50X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF1cy0+Y3VycmVudF91cmIpIHsKLQkJdXNiX3N0b3JfZGJnKHVzLCAiVVJCIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwlpZiAoIXVzLT5jdXJyZW50X3VyYikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJLyoKIAkgKiBKdXN0IGJlZm9yZSB3ZSBzdGFydCBvdXIgY29udHJvbCB0aHJlYWQsIGluaXRpYWxpemUKQEAgLTEwNzAsMTcgKzEwNzIsMTcgQEAKIAlyZXN1bHQgPSB1c2Jfc3Rvcl9hY3F1aXJlX3Jlc291cmNlcyh1cyk7CiAJaWYgKHJlc3VsdCkKIAkJZ290byBCYWREZXZpY2U7CisJdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX25vX3Jlc3VtZSh1cy0+cHVzYl9pbnRmKTsKIAlzbnByaW50Zih1cy0+c2NzaV9uYW1lLCBzaXplb2YodXMtPnNjc2lfbmFtZSksICJ1c2Itc3RvcmFnZSAlcyIsCiAJCQkJCWRldl9uYW1lKCZ1cy0+cHVzYl9pbnRmLT5kZXYpKTsKIAlyZXN1bHQgPSBzY3NpX2FkZF9ob3N0KHVzX3RvX2hvc3QodXMpLCBkZXYpOwogCWlmIChyZXN1bHQpIHsKIAkJZGV2X3dhcm4oZGV2LAogCQkJCSJVbmFibGUgdG8gYWRkIHRoZSBzY3NpIGhvc3RcbiIpOwotCQlnb3RvIEJhZERldmljZTsKKwkJZ290byBIb3N0QWRkRXJyOwogCX0KIAogCS8qIFN1Ym1pdCB0aGUgZGVsYXllZF93b3JrIGZvciBTQ1NJLWRldmljZSBzY2FubmluZyAqLwotCXVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZV9ub19yZXN1bWUodXMtPnB1c2JfaW50Zik7CiAJc2V0X2JpdChVU19GTElEWF9TQ0FOX1BFTkRJTkcsICZ1cy0+ZGZsYWdzKTsKIAogCWlmIChkZWxheV91c2UgPiAwKQpAQCAtMTA5MCw2ICsxMDkyLDggQEAKIAlyZXR1cm4gMDsKIAogCS8qIFdlIGNvbWUgaGVyZSBpZiB0aGVyZSBhcmUgYW55IHByb2JsZW1zICovCitIb3N0QWRkRXJyOgorCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9ub19zdXNwZW5kKHVzLT5wdXNiX2ludGYpOwogQmFkRGV2aWNlOgogCXVzYl9zdG9yX2RiZyh1cywgInN0b3JhZ2VfcHJvYmUoKSBmYWlsZWRcbiIpOwogCXJlbGVhc2VfZXZlcnl0aGluZyh1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi91c2Itc2tlbGV0b24uYyBiL2RyaXZlcnMvdXNiL3VzYi1za2VsZXRvbi5jCmluZGV4IDU0NWQwOWIuLjUxMzNhMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3VzYi1za2VsZXRvbi5jCisrKyBiL2RyaXZlcnMvdXNiL3VzYi1za2VsZXRvbi5jCkBAIC00OTksMTAgKzQ5OSw4IEBACiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGluaXRpYWxpemUgaXQgKi8KIAlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWRldikKIAkJZ290byBlcnJvcjsKLQl9CiAJa3JlZl9pbml0KCZkZXYtPmtyZWYpOwogCXNlbWFfaW5pdCgmZGV2LT5saW1pdF9zZW0sIFdSSVRFU19JTl9GTElHSFQpOwogCW11dGV4X2luaXQoJmRldi0+aW9fbXV0ZXgpOwpAQCAtNTI2LDE3ICs1MjQsMTEgQEAKIAkJCWRldi0+YnVsa19pbl9zaXplID0gYnVmZmVyX3NpemU7CiAJCQlkZXYtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CiAJCQlkZXYtPmJ1bGtfaW5fYnVmZmVyID0ga21hbGxvYyhidWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIWRldi0+YnVsa19pbl9idWZmZXIpIHsKLQkJCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwKLQkJCQkJIkNvdWxkIG5vdCBhbGxvY2F0ZSBidWxrX2luX2J1ZmZlclxuIik7CisJCQlpZiAoIWRldi0+YnVsa19pbl9idWZmZXIpCiAJCQkJZ290byBlcnJvcjsKLQkJCX0KIAkJCWRldi0+YnVsa19pbl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQkJaWYgKCFkZXYtPmJ1bGtfaW5fdXJiKSB7Ci0JCQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCi0JCQkJCSJDb3VsZCBub3QgYWxsb2NhdGUgYnVsa19pbl91cmJcbiIpOworCQkJaWYgKCFkZXYtPmJ1bGtfaW5fdXJiKQogCQkJCWdvdG8gZXJyb3I7Ci0JCQl9CiAJCX0KIAogCQlpZiAoIWRldi0+YnVsa19vdXRfZW5kcG9pbnRBZGRyICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi91c2JpcC9LY29uZmlnIGIvZHJpdmVycy91c2IvdXNiaXAvS2NvbmZpZwppbmRleCAxNzY0NmIyLi5lZWVmYTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi91c2JpcC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL3VzYmlwL0tjb25maWcKQEAgLTEsNiArMSw3IEBACiBjb25maWcgVVNCSVBfQ09SRQogCXRyaXN0YXRlICJVU0IvSVAgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFVTQl9DT01NT04gJiYgTkVUCisJZGVwZW5kcyBvbiBORVQKKwlzZWxlY3QgVVNCX0NPTU1PTgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZW5hYmxlcyBwdXNoaW5nIFVTQiBwYWNrZXRzIG92ZXIgSVAgdG8gYWxsb3cgcmVtb3RlCiAJICBtYWNoaW5lcyBkaXJlY3QgYWNjZXNzIHRvIFVTQiBkZXZpY2VzLiBJdCBwcm92aWRlcyB0aGUKQEAgLTI0LDYgKzI1LDI3IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2aGNpLWhjZC4KIAorY29uZmlnIFVTQklQX1ZIQ0lfSENfUE9SVFMKKwlpbnQgIk51bWJlciBvZiBwb3J0cyBwZXIgVVNCL0lQIHZpcnR1YWwgaG9zdCBjb250cm9sbGVyIgorCXJhbmdlIDEgMzEKKwlkZWZhdWx0IDgKKwlkZXBlbmRzIG9uIFVTQklQX1ZIQ0lfSENECisJLS0taGVscC0tLQorCSAgVG8gaW5jcmVhc2UgbnVtYmVyIG9mIHBvcnRzIGF2YWlsYWJsZSBmb3IgVVNCL0lQIHZpcnR1YWwKKwkgIGhvc3QgY29udHJvbGxlciBkcml2ZXIsIHRoaXMgZGVmaW5lcyBudW1iZXIgb2YgcG9ydHMgcGVyCisJICBVU0IvSVAgdmlydHVhbCBob3N0IGNvbnRyb2xsZXIuCisKK2NvbmZpZyBVU0JJUF9WSENJX05SX0hDUworCWludCAiTnVtYmVyIG9mIFVTQi9JUCB2aXJ0dWFsIGhvc3QgY29udHJvbGxlcnMiCisJcmFuZ2UgMSAxMjgKKwlkZWZhdWx0IDEKKwlkZXBlbmRzIG9uIFVTQklQX1ZIQ0lfSENECisJLS0taGVscC0tLQorCSAgVG8gaW5jcmVhc2UgbnVtYmVyIG9mIHBvcnRzIGF2YWlsYWJsZSBmb3IgVVNCL0lQIHZpcnR1YWwKKwkgIGhvc3QgY29udHJvbGxlciBkcml2ZXIsIHRoaXMgZGVmaW5lcyBudW1iZXIgb2YgVVNCL0lQCisJICB2aXJ0dWFsIGhvc3QgY29udHJvbGxlcnMgYXMgaWYgYWRkaW5nIHBoeXNpY2FsIGhvc3QKKwkgIGNvbnRyb2xsZXJzLgorCiBjb25maWcgVVNCSVBfSE9TVAogCXRyaXN0YXRlICJIb3N0IGRyaXZlciIKIAlkZXBlbmRzIG9uIFVTQklQX0NPUkUgJiYgVVNCCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi91c2JpcC9zdHViX3J4LmMgYi9kcml2ZXJzL3VzYi91c2JpcC9zdHViX3J4LmMKaW5kZXggMmRmNjNlMy4uMTkxYjE3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvdXNiaXAvc3R1Yl9yeC5jCisrKyBiL2RyaXZlcnMvdXNiL3VzYmlwL3N0dWJfcnguYwpAQCAtNDYxLDcgKzQ2MSw2IEBACiAJCXByaXYtPnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIXByaXYtPnVyYikgewotCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJtYWxsb2MgdXJiXG4iKTsKIAkJdXNiaXBfZXZlbnRfYWRkKHVkLCBTREVWX0VWRU5UX0VSUk9SX01BTExPQyk7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi91c2JpcC92aGNpLmggYi9kcml2ZXJzL3VzYi91c2JpcC92aGNpLmgKaW5kZXggYTg2M2E5OC4uODhiNzFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvdXNiaXAvdmhjaS5oCisrKyBiL2RyaXZlcnMvdXNiL3VzYmlwL3ZoY2kuaApAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBUYWthaGlybyBIaXJvZnVjaGkKKyAqIENvcHlyaWdodCAoQykgMjAxNSBOb2J1byBJd2F0YQogICoKICAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTcyLDEzICs3MywyNSBAQAogfTsKIAogLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBwb3J0cy4gVmFsdWUgaGFzIGFuIHVwcGVyYm91bmQgb2YgVVNCX01BWENISUxEUkVOICovCi0jZGVmaW5lIFZIQ0lfTlBPUlRTIDgKKyNpZmRlZiBDT05GSUdfVVNCSVBfVkhDSV9IQ19QT1JUUworI2RlZmluZSBWSENJX0hDX1BPUlRTIENPTkZJR19VU0JJUF9WSENJX0hDX1BPUlRTCisjZWxzZQorI2RlZmluZSBWSENJX0hDX1BPUlRTIDgKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1VTQklQX1ZIQ0lfTlJfSENTCisjZGVmaW5lIFZIQ0lfTlJfSENTIENPTkZJR19VU0JJUF9WSENJX05SX0hDUworI2Vsc2UKKyNkZWZpbmUgVkhDSV9OUl9IQ1MgMQorI2VuZGlmCisKKyNkZWZpbmUgTUFYX1NUQVRVU19OQU1FIDE2CiAKIC8qIGZvciB1c2JfYnVzLmhjcHJpdiAqLwogc3RydWN0IHZoY2lfaGNkIHsKIAlzcGlubG9ja190IGxvY2s7CiAKLQl1MzIgcG9ydF9zdGF0dXNbVkhDSV9OUE9SVFNdOworCXUzMiBwb3J0X3N0YXR1c1tWSENJX0hDX1BPUlRTXTsKIAogCXVuc2lnbmVkIHJlc3VtaW5nOjE7CiAJdW5zaWduZWQgbG9uZyByZV90aW1lb3V0OwpAQCAtOTAsMTQgKzEwMywxOSBAQAogCSAqIHdJbmRleCBzaG93cyB0aGUgcG9ydCBudW1iZXIgYW5kIGJlZ2lucyBmcm9tIDEuCiAJICogQnV0LCB0aGUgaW5kZXggb2YgdGhpcyBhcnJheSBiZWdpbnMgZnJvbSAwLgogCSAqLwotCXN0cnVjdCB2aGNpX2RldmljZSB2ZGV2W1ZIQ0lfTlBPUlRTXTsKKwlzdHJ1Y3QgdmhjaV9kZXZpY2UgdmRldltWSENJX0hDX1BPUlRTXTsKIH07CiAKLWV4dGVybiBzdHJ1Y3QgdmhjaV9oY2QgKnRoZV9jb250cm9sbGVyOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZGV2X2F0dHJfZ3JvdXA7CitleHRlcm4gaW50IHZoY2lfbnVtX2NvbnRyb2xsZXJzOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKip2aGNpX3BkZXZzOworZXh0ZXJuIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdmhjaV9hdHRyX2dyb3VwOwogCiAvKiB2aGNpX2hjZC5jICovCi12b2lkIHJoX3BvcnRfY29ubmVjdChpbnQgcmhwb3J0LCBlbnVtIHVzYl9kZXZpY2Vfc3BlZWQgc3BlZWQpOwordm9pZCByaF9wb3J0X2Nvbm5lY3Qoc3RydWN0IHZoY2lfZGV2aWNlICp2ZGV2LCBlbnVtIHVzYl9kZXZpY2Vfc3BlZWQgc3BlZWQpOworCisvKiB2aGNpX3N5c2ZzLmMgKi8KK2ludCB2aGNpX2luaXRfYXR0cl9ncm91cCh2b2lkKTsKK3ZvaWQgdmhjaV9maW5pc2hfYXR0cl9ncm91cCh2b2lkKTsKIAogLyogdmhjaV9yeC5jICovCiBzdHJ1Y3QgdXJiICpwaWNrdXBfdXJiX2FuZF9mcmVlX3ByaXYoc3RydWN0IHZoY2lfZGV2aWNlICp2ZGV2LCBfX3UzMiBzZXFudW0pOwpAQCAtMTA2LDkgKzEyNCwxNCBAQAogLyogdmhjaV90eC5jICovCiBpbnQgdmhjaV90eF9sb29wKHZvaWQgKmRhdGEpOwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB2aGNpX2RldmljZSAqcG9ydF90b192ZGV2KF9fdTMyIHBvcnQpCitzdGF0aWMgaW5saW5lIF9fdTMyIHBvcnRfdG9fcmhwb3J0KF9fdTMyIHBvcnQpCiB7Ci0JcmV0dXJuICZ0aGVfY29udHJvbGxlci0+dmRldltwb3J0XTsKKwlyZXR1cm4gcG9ydCAlIFZIQ0lfSENfUE9SVFM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBvcnRfdG9fcGRldl9ucihfX3UzMiBwb3J0KQoreworCXJldHVybiBwb3J0IC8gVkhDSV9IQ19QT1JUUzsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdmhjaV9oY2QgKmhjZF90b192aGNpKHN0cnVjdCB1c2JfaGNkICpoY2QpCkBAIC0xMTYsMTQgKzEzOSwyNSBAQAogCXJldHVybiAoc3RydWN0IHZoY2lfaGNkICopIChoY2QtPmhjZF9wcml2KTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICpoY2RfZGV2KHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJcmV0dXJuIChoY2QpLT5zZWxmLmNvbnRyb2xsZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqaGNkX25hbWUoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlyZXR1cm4gKGhjZCktPnNlbGYuYnVzX25hbWU7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHVzYl9oY2QgKnZoY2lfdG9faGNkKHN0cnVjdCB2aGNpX2hjZCAqdmhjaSkKIHsKIAlyZXR1cm4gY29udGFpbmVyX29mKCh2b2lkICopIHZoY2ksIHN0cnVjdCB1c2JfaGNkLCBoY2RfcHJpdik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqdmhjaV9kZXYoc3RydWN0IHZoY2lfaGNkICp2aGNpKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgdmhjaV9oY2QgKnZkZXZfdG9fdmhjaShzdHJ1Y3QgdmhjaV9kZXZpY2UgKnZkZXYpCiB7Ci0JcmV0dXJuIHZoY2lfdG9faGNkKHZoY2kpLT5zZWxmLmNvbnRyb2xsZXI7CisJcmV0dXJuIGNvbnRhaW5lcl9vZigKKwkJCSh2b2lkICopKHZkZXYgLSB2ZGV2LT5yaHBvcnQpLCBzdHJ1Y3QgdmhjaV9oY2QsIHZkZXYpOwogfQogCiAjZW5kaWYgLyogX19VU0JJUF9WSENJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3VzYmlwL3ZoY2lfaGNkLmMgYi9kcml2ZXJzL3VzYi91c2JpcC92aGNpX2hjZC5jCmluZGV4IDJlMDQ1MGJlLi4wM2VjY2YyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi91c2JpcC92aGNpX2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL3VzYmlwL3ZoY2lfaGNkLmMKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggVGFrYWhpcm8gSGlyb2Z1Y2hpCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBOb2J1byBJd2F0YQogICoKICAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTU2LDcgKzU3LDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lW10gPSAidmhjaV9oY2QiOwogc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX2Rlc2NbXSA9ICJVU0IvSVAgVmlydHVhbCBIb3N0IENvbnRyb2xsZXIiOwogCi1zdHJ1Y3QgdmhjaV9oY2QgKnRoZV9jb250cm9sbGVyOworaW50IHZoY2lfbnVtX2NvbnRyb2xsZXJzID0gVkhDSV9OUl9IQ1M7CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKip2aGNpX3BkZXZzOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJpdF9kZXNjW10gPSB7CiAJIkNPTk5FQ1RJT04iLAkJLyowKi8KQEAgLTExOSw0NyArMTIyLDU5IEBACiAJcHJfZGVidWcoIlxuIik7CiB9CiAKLXZvaWQgcmhfcG9ydF9jb25uZWN0KGludCByaHBvcnQsIGVudW0gdXNiX2RldmljZV9zcGVlZCBzcGVlZCkKK3ZvaWQgcmhfcG9ydF9jb25uZWN0KHN0cnVjdCB2aGNpX2RldmljZSAqdmRldiwgZW51bSB1c2JfZGV2aWNlX3NwZWVkIHNwZWVkKQogeworCXN0cnVjdCB2aGNpX2hjZAkqdmhjaSA9IHZkZXZfdG9fdmhjaSh2ZGV2KTsKKwlpbnQJCXJocG9ydCA9IHZkZXYtPnJocG9ydDsKKwl1MzIJCXN0YXR1czsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCiAJdXNiaXBfZGJnX3ZoY2lfcmgoInJoX3BvcnRfY29ubmVjdCAlZFxuIiwgcmhwb3J0KTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAKLQl0aGVfY29udHJvbGxlci0+cG9ydF9zdGF0dXNbcmhwb3J0XSB8PSBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04KLQkJfCAoMSA8PCBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTik7CisJc3RhdHVzID0gdmhjaS0+cG9ydF9zdGF0dXNbcmhwb3J0XTsKKworCXN0YXR1cyB8PSBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04gfCAoMSA8PCBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTik7CiAKIAlzd2l0Y2ggKHNwZWVkKSB7CiAJY2FzZSBVU0JfU1BFRURfSElHSDoKLQkJdGhlX2NvbnRyb2xsZXItPnBvcnRfc3RhdHVzW3JocG9ydF0gfD0gVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEOworCQlzdGF0dXMgfD0gVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEOwogCQlicmVhazsKIAljYXNlIFVTQl9TUEVFRF9MT1c6Ci0JCXRoZV9jb250cm9sbGVyLT5wb3J0X3N0YXR1c1tyaHBvcnRdIHw9IFVTQl9QT1JUX1NUQVRfTE9XX1NQRUVEOworCQlzdGF0dXMgfD0gVVNCX1BPUlRfU1RBVF9MT1dfU1BFRUQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJdmhjaS0+cG9ydF9zdGF0dXNbcmhwb3J0XSA9IHN0YXR1czsKIAotCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXModmhjaV90b19oY2QodGhlX2NvbnRyb2xsZXIpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CisKKwl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzKHZoY2lfdG9faGNkKHZoY2kpKTsKIH0KIAotc3RhdGljIHZvaWQgcmhfcG9ydF9kaXNjb25uZWN0KGludCByaHBvcnQpCitzdGF0aWMgdm9pZCByaF9wb3J0X2Rpc2Nvbm5lY3Qoc3RydWN0IHZoY2lfZGV2aWNlICp2ZGV2KQogeworCXN0cnVjdCB2aGNpX2hjZAkqdmhjaSA9IHZkZXZfdG9fdmhjaSh2ZGV2KTsKKwlpbnQJCXJocG9ydCA9IHZkZXYtPnJocG9ydDsKKwl1MzIJCXN0YXR1czsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCiAJdXNiaXBfZGJnX3ZoY2lfcmgoInJoX3BvcnRfZGlzY29ubmVjdCAlZFxuIiwgcmhwb3J0KTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAKLQl0aGVfY29udHJvbGxlci0+cG9ydF9zdGF0dXNbcmhwb3J0XSAmPSB+VVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OOwotCXRoZV9jb250cm9sbGVyLT5wb3J0X3N0YXR1c1tyaHBvcnRdIHw9Ci0JCQkJCSgxIDw8IFVTQl9QT1JUX0ZFQVRfQ19DT05ORUNUSU9OKTsKKwlzdGF0dXMgPSB2aGNpLT5wb3J0X3N0YXR1c1tyaHBvcnRdOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKLQl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzKHZoY2lfdG9faGNkKHRoZV9jb250cm9sbGVyKSk7CisJc3RhdHVzICY9IH5VU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT047CisJc3RhdHVzIHw9ICgxIDw8IFVTQl9QT1JUX0ZFQVRfQ19DT05ORUNUSU9OKTsKKworCXZoY2ktPnBvcnRfc3RhdHVzW3JocG9ydF0gPSBzdGF0dXM7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CisJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyh2aGNpX3RvX2hjZCh2aGNpKSk7CiB9CiAKICNkZWZpbmUgUE9SVF9DX01BU0sJCQkJXApAQCAtMTg4LDcgKzIwMyw3IEBACiAJaW50CQljaGFuZ2VkID0gMDsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCi0JcmV0dmFsID0gRElWX1JPVU5EX1VQKFZIQ0lfTlBPUlRTICsgMSwgOCk7CisJcmV0dmFsID0gRElWX1JPVU5EX1VQKFZIQ0lfSENfUE9SVFMgKyAxLCA4KTsKIAltZW1zZXQoYnVmLCAwLCByZXR2YWwpOwogCiAJdmhjaSA9IGhjZF90b192aGNpKGhjZCk7CkBAIC0yMDAsNyArMjE1LDcgQEAKIAl9CiAKIAkvKiBjaGVjayBwc2V1ZG8gc3RhdHVzIHJlZ2lzdGVyIGZvciBlYWNoIHBvcnQgKi8KLQlmb3IgKHJocG9ydCA9IDA7IHJocG9ydCA8IFZIQ0lfTlBPUlRTOyByaHBvcnQrKykgeworCWZvciAocmhwb3J0ID0gMDsgcmhwb3J0IDwgVkhDSV9IQ19QT1JUUzsgcmhwb3J0KyspIHsKIAkJaWYgKCh2aGNpLT5wb3J0X3N0YXR1c1tyaHBvcnRdICYgUE9SVF9DX01BU0spKSB7CiAJCQkvKiBUaGUgc3RhdHVzIG9mIGEgcG9ydCBoYXMgYmVlbiBjaGFuZ2VkLCAqLwogCQkJdXNiaXBfZGJnX3ZoY2lfcmgoInBvcnQgJWQgc3RhdHVzIGNoYW5nZWRcbiIsIHJocG9ydCk7CkBAIC0yMjUsNyArMjQwLDcgQEAKIAlkZXNjLT5iRGVzY0xlbmd0aCA9IDk7CiAJZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyA9IGNwdV90b19sZTE2KAogCQlIVUJfQ0hBUl9JTkRWX1BPUlRfTFBTTSB8IEhVQl9DSEFSX0NPTU1PTl9PQ1BNKTsKLQlkZXNjLT5iTmJyUG9ydHMgPSBWSENJX05QT1JUUzsKKwlkZXNjLT5iTmJyUG9ydHMgPSBWSENJX0hDX1BPUlRTOwogCWRlc2MtPnUuaHMuRGV2aWNlUmVtb3ZhYmxlWzBdID0gMHhmZjsKIAlkZXNjLT51LmhzLkRldmljZVJlbW92YWJsZVsxXSA9IDB4ZmY7CiB9CkBAIC0yMzgsNyArMjUzLDcgQEAKIAlpbnQJCXJocG9ydDsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCi0JdTMyIHByZXZfcG9ydF9zdGF0dXNbVkhDSV9OUE9SVFNdOworCXUzMiBwcmV2X3BvcnRfc3RhdHVzW1ZIQ0lfSENfUE9SVFNdOwogCiAJaWYgKCFIQ0RfSFdfQUNDRVNTSUJMRShoY2QpKQogCQlyZXR1cm4gLUVUSU1FRE9VVDsKQEAgLTI0OSw3ICsyNjQsNyBAQAogCSAqLwogCXVzYmlwX2RiZ192aGNpX3JoKCJ0eXBlUmVxICV4IHdWYWx1ZSAleCB3SW5kZXggJXhcbiIsIHR5cGVSZXEsIHdWYWx1ZSwKIAkJCSAgd0luZGV4KTsKLQlpZiAod0luZGV4ID4gVkhDSV9OUE9SVFMpCisJaWYgKHdJbmRleCA+IFZIQ0lfSENfUE9SVFMpCiAJCXByX2VycigiaW52YWxpZCBwb3J0IG51bWJlciAlZFxuIiwgd0luZGV4KTsKIAlyaHBvcnQgPSAoKF9fdTgpKHdJbmRleCAmIDB4MDBmZikpIC0gMTsKIApAQCAtMzE1LDcgKzMzMCw3IEBACiAJCWJyZWFrOwogCWNhc2UgR2V0UG9ydFN0YXR1czoKIAkJdXNiaXBfZGJnX3ZoY2lfcmgoIiBHZXRQb3J0U3RhdHVzIHBvcnQgJXhcbiIsIHdJbmRleCk7Ci0JCWlmICh3SW5kZXggPiBWSENJX05QT1JUUyB8fCB3SW5kZXggPCAxKSB7CisJCWlmICh3SW5kZXggPiBWSENJX0hDX1BPUlRTIHx8IHdJbmRleCA8IDEpIHsKIAkJCXByX2VycigiaW52YWxpZCBwb3J0IG51bWJlciAlZFxuIiwgd0luZGV4KTsKIAkJCXJldHZhbCA9IC1FUElQRTsKIAkJfQpAQCAtNDE2LDE0ICs0MzEsMjcgQEAKIAogc3RhdGljIHN0cnVjdCB2aGNpX2RldmljZSAqZ2V0X3ZkZXYoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7Ci0JaW50IGk7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkOworCXN0cnVjdCB2aGNpX2hjZCAqdmhjaTsKKwlpbnQgcGRldl9uciwgcmhwb3J0OwogCiAJaWYgKCF1ZGV2KQogCQlyZXR1cm4gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBWSENJX05QT1JUUzsgaSsrKQotCQlpZiAodGhlX2NvbnRyb2xsZXItPnZkZXZbaV0udWRldiA9PSB1ZGV2KQotCQkJcmV0dXJuIHBvcnRfdG9fdmRldihpKTsKKwlmb3IgKHBkZXZfbnIgPSAwOyBwZGV2X25yIDwgdmhjaV9udW1fY29udHJvbGxlcnM7IHBkZXZfbnIrKykgeworCQlwZGV2ID0gKih2aGNpX3BkZXZzICsgcGRldl9ucik7CisJCWlmIChwZGV2ID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJCWlmIChoY2QgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQl2aGNpID0gaGNkX3RvX3ZoY2koaGNkKTsKKwkJZm9yIChyaHBvcnQgPSAwOyByaHBvcnQgPCBWSENJX0hDX1BPUlRTOyByaHBvcnQrKykgeworCQkJaWYgKHZoY2ktPnZkZXZbcmhwb3J0XS51ZGV2ID09IHVkZXYpCisJCQkJcmV0dXJuICZ2aGNpLT52ZGV2W3JocG9ydF07CisJCX0KKwl9CiAKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTQzMiw2ICs0NjAsNyBAQAogewogCXN0cnVjdCB2aGNpX2RldmljZSAqdmRldiA9IGdldF92ZGV2KHVyYi0+ZGV2KTsKIAlzdHJ1Y3QgdmhjaV9wcml2ICpwcml2OworCXN0cnVjdCB2aGNpX2hjZCAqdmhjaSA9IHZkZXZfdG9fdmhjaSh2ZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCF2ZGV2KSB7CkBAIC00NDcsNyArNDc2LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZGV2LT5wcml2X2xvY2ssIGZsYWdzKTsKIAotCXByaXYtPnNlcW51bSA9IGF0b21pY19pbmNfcmV0dXJuKCZ0aGVfY29udHJvbGxlci0+c2VxbnVtKTsKKwlwcml2LT5zZXFudW0gPSBhdG9taWNfaW5jX3JldHVybigmdmhjaS0+c2VxbnVtKTsKIAlpZiAocHJpdi0+c2VxbnVtID09IDB4ZmZmZikKIAkJZGV2X2luZm8oJnVyYi0+ZGV2LT5kZXYsICJzZXFudW0gbWF4XG4iKTsKIApAQCAtNDY1LDcgKzQ5NCw5IEBACiBzdGF0aWMgaW50IHZoY2lfdXJiX2VucXVldWUoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiLAogCQkJICAgIGdmcF90IG1lbV9mbGFncykKIHsKKwlzdHJ1Y3QgdmhjaV9oY2QgKnZoY2kgPSBoY2RfdG9fdmhjaShoY2QpOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ1cmItPmRldi0+ZGV2OworCXU4IHBvcnRudW0gPSB1cmItPmRldi0+cG9ydG51bTsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgdmhjaV9kZXZpY2UgKnZkZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTQ3MywyNiArNTA0LDMwIEBACiAJdXNiaXBfZGJnX3ZoY2lfaGMoImVudGVyLCB1c2JfaGNkICVwIHVyYiAlcCBtZW1fZmxhZ3MgJWRcbiIsCiAJCQkgIGhjZCwgdXJiLCBtZW1fZmxhZ3MpOwogCisJaWYgKHBvcnRudW0gPiBWSENJX0hDX1BPUlRTKSB7CisJCXByX2VycigiaW52YWxpZCBwb3J0IG51bWJlciAlZFxuIiwgcG9ydG51bSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwl2ZGV2ID0gJnZoY2ktPnZkZXZbcG9ydG51bS0xXTsKKwogCS8qIHBhdGNoIHRvIHVzYl9zZ19pbml0KCkgaXMgaW4gMi41LjYwICovCiAJQlVHX09OKCF1cmItPnRyYW5zZmVyX2J1ZmZlciAmJiB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAogCWlmICh1cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpIHsKIAkJZGV2X2VycihkZXYsICJVUkIgYWxyZWFkeSB1bmxpbmtlZCEsIHN0YXR1cyAlZFxuIiwgdXJiLT5zdGF0dXMpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybiB1cmItPnN0YXR1czsKIAl9CiAKLQl2ZGV2ID0gcG9ydF90b192ZGV2KHVyYi0+ZGV2LT5wb3J0bnVtLTEpOwotCiAJLyogcmVmdXNlIGVucXVldWUgZm9yIGRlYWQgY29ubmVjdGlvbiAqLwogCXNwaW5fbG9jaygmdmRldi0+dWQubG9jayk7CiAJaWYgKHZkZXYtPnVkLnN0YXR1cyA9PSBWREVWX1NUX05VTEwgfHwKIAkgICAgdmRldi0+dWQuc3RhdHVzID09IFZERVZfU1RfRVJST1IpIHsKIAkJZGV2X2VycihkZXYsICJlbnF1ZXVlIGZvciBpbmFjdGl2ZSBwb3J0ICVkXG4iLCB2ZGV2LT5yaHBvcnQpOwogCQlzcGluX3VubG9jaygmdmRldi0+dWQubG9jayk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCXNwaW5fdW5sb2NrKCZ2ZGV2LT51ZC5sb2NrKTsKQEAgLTU2NSwxNyArNjAwLDE2IEBACiAKIG91dDoKIAl2aGNpX3R4X3VyYih1cmIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmhjaS0+bG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiAKIG5vX25lZWRfeG1pdDoKIAl1c2JfaGNkX3VubGlua191cmJfZnJvbV9lcChoY2QsIHVyYik7CiBub19uZWVkX3VubGluazoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAlpZiAoIXJldCkKLQkJdXNiX2hjZF9naXZlYmFja191cmIodmhjaV90b19oY2QodGhlX2NvbnRyb2xsZXIpLAotCQkJCSAgICAgdXJiLCB1cmItPnN0YXR1cyk7CisJCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKGhjZCwgdXJiLCB1cmItPnN0YXR1cyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjI3LDE5ICs2NjEsMjAgQEAKICAqLwogc3RhdGljIGludCB2aGNpX3VyYl9kZXF1ZXVlKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKIHsKKwlzdHJ1Y3QgdmhjaV9oY2QgKnZoY2kgPSBoY2RfdG9fdmhjaShoY2QpOwogCXN0cnVjdCB2aGNpX3ByaXYgKnByaXY7CiAJc3RydWN0IHZoY2lfZGV2aWNlICp2ZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlwcl9pbmZvKCJkZXF1ZXVlIGEgdXJiICVwXG4iLCB1cmIpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAogCXByaXYgPSB1cmItPmhjcHJpdjsKIAlpZiAoIXByaXYpIHsKIAkJLyogVVJCIHdhcyBuZXZlciBsaW5rZWQhIG9yIHdpbGwgYmUgc29vbiBnaXZlbiBiYWNrIGJ5CiAJCSAqIHZoY2lfcnguICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIC1FSURSTTsKIAl9CiAKQEAgLTY0OCw3ICs2ODMsNyBAQAogCiAJCXJldCA9IHVzYl9oY2RfY2hlY2tfdW5saW5rX3VyYihoY2QsIHVyYiwgc3RhdHVzKTsKIAkJaWYgKHJldCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CkBAIC02NzYsMTAgKzcxMSw5IEBACiAKIAkJdXNiX2hjZF91bmxpbmtfdXJiX2Zyb21fZXAoaGNkLCB1cmIpOwogCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7Ci0JCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKHZoY2lfdG9faGNkKHRoZV9jb250cm9sbGVyKSwgdXJiLAotCQkJCSAgICAgdXJiLT5zdGF0dXMpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmhjaS0+bG9jaywgZmxhZ3MpOworCQl1c2JfaGNkX2dpdmViYWNrX3VyYih2aGNpX3RvX2hjZCh2aGNpKSwgdXJiLCB1cmItPnN0YXR1cyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAKIAl9IGVsc2UgewogCQkvKiB0Y3AgY29ubmVjdGlvbiBpcyBhbGl2ZSAqLwpAQCAtNjkxLDEyICs3MjUsMTIgQEAKIAkJdW5saW5rID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZoY2lfdW5saW5rKSwgR0ZQX0FUT01JQyk7CiAJCWlmICghdW5saW5rKSB7CiAJCQlzcGluX3VubG9jaygmdmRldi0+cHJpdl9sb2NrKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAJCQl1c2JpcF9ldmVudF9hZGQoJnZkZXYtPnVkLCBWREVWX0VWRU5UX0VSUk9SX01BTExPQyk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCi0JCXVubGluay0+c2VxbnVtID0gYXRvbWljX2luY19yZXR1cm4oJnRoZV9jb250cm9sbGVyLT5zZXFudW0pOworCQl1bmxpbmstPnNlcW51bSA9IGF0b21pY19pbmNfcmV0dXJuKCZ2aGNpLT5zZXFudW0pOwogCQlpZiAodW5saW5rLT5zZXFudW0gPT0gMHhmZmZmKQogCQkJcHJfaW5mbygic2VxbnVtIG1heFxuIik7CiAKQEAgLTcxMiw3ICs3NDYsNyBAQAogCQlzcGluX3VubG9jaygmdmRldi0+cHJpdl9sb2NrKTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAogCXVzYmlwX2RiZ192aGNpX2hjKCJsZWF2ZVxuIik7CiAJcmV0dXJuIDA7CkBAIC03MjAsMTAgKzc1NCwxMiBAQAogCiBzdGF0aWMgdm9pZCB2aGNpX2RldmljZV91bmxpbmtfY2xlYW51cChzdHJ1Y3QgdmhjaV9kZXZpY2UgKnZkZXYpCiB7CisJc3RydWN0IHZoY2lfaGNkICp2aGNpID0gdmRldl90b192aGNpKHZkZXYpOworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSB2aGNpX3RvX2hjZCh2aGNpKTsKIAlzdHJ1Y3QgdmhjaV91bmxpbmsgKnVubGluaywgKnRtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAlzcGluX2xvY2soJnZkZXYtPnByaXZfbG9jayk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodW5saW5rLCB0bXAsICZ2ZGV2LT51bmxpbmtfdHgsIGxpc3QpIHsKQEAgLTc1MiwyNCArNzg4LDIzIEBACiAKIAkJdXJiLT5zdGF0dXMgPSAtRU5PREVWOwogCi0JCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKHZoY2lfdG9faGNkKHRoZV9jb250cm9sbGVyKSwgdXJiKTsKKwkJdXNiX2hjZF91bmxpbmtfdXJiX2Zyb21fZXAoaGNkLCB1cmIpOwogCiAJCWxpc3RfZGVsKCZ1bmxpbmstPmxpc3QpOwogCiAJCXNwaW5fdW5sb2NrKCZ2ZGV2LT5wcml2X2xvY2spOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAKLQkJdXNiX2hjZF9naXZlYmFja191cmIodmhjaV90b19oY2QodGhlX2NvbnRyb2xsZXIpLCB1cmIsCi0JCQkJICAgICB1cmItPnN0YXR1cyk7CisJCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKGhjZCwgdXJiLCB1cmItPnN0YXR1cyk7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAJCXNwaW5fbG9jaygmdmRldi0+cHJpdl9sb2NrKTsKIAogCQlrZnJlZSh1bmxpbmspOwogCX0KIAogCXNwaW5fdW5sb2NrKCZ2ZGV2LT5wcml2X2xvY2spOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmhjaS0+bG9jaywgZmxhZ3MpOwogfQogCiAvKgpAQCAtODI3LDcgKzg2Miw3IEBACiAJICogaXMgYWN0dWFsbHkgZ2l2ZW4gYmFjayBieSB2aGNpX3J4IGFmdGVyIHJlY2VpdmluZyBpdHMgcmV0dXJuIHBkdS4KIAkgKgogCSAqLwotCXJoX3BvcnRfZGlzY29ubmVjdCh2ZGV2LT5yaHBvcnQpOworCXJoX3BvcnRfZGlzY29ubmVjdCh2ZGV2KTsKIAogCXByX2luZm8oImRpc2Nvbm5lY3QgZGV2aWNlXG4iKTsKIH0KQEAgLTg2Niw3ICs5MDEsNyBAQAogCiBzdGF0aWMgdm9pZCB2aGNpX2RldmljZV9pbml0KHN0cnVjdCB2aGNpX2RldmljZSAqdmRldikKIHsKLQltZW1zZXQodmRldiwgMCwgc2l6ZW9mKCp2ZGV2KSk7CisJbWVtc2V0KHZkZXYsIDAsIHNpemVvZihzdHJ1Y3QgdmhjaV9kZXZpY2UpKTsKIAogCXZkZXYtPnVkLnNpZGUgICA9IFVTQklQX1ZIQ0k7CiAJdmRldi0+dWQuc3RhdHVzID0gVkRFVl9TVF9OVUxMOwpAQCAtODg3LDE3ICs5MjIsMzQgQEAKIAl1c2JpcF9zdGFydF9laCgmdmRldi0+dWQpOwogfQogCitzdGF0aWMgaW50IGhjZF9uYW1lX3RvX2lkKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciAqYzsKKwlsb25nIHZhbDsKKwlpbnQgcmV0OworCisJYyA9IHN0cmNocihuYW1lLCAnLicpOworCWlmIChjID09IE5VTEwpCisJCXJldHVybiAwOworCisJcmV0ID0ga3N0cnRvbChjKzEsIDEwLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiB2YWw7Cit9CisKIHN0YXRpYyBpbnQgdmhjaV9zdGFydChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewogCXN0cnVjdCB2aGNpX2hjZCAqdmhjaSA9IGhjZF90b192aGNpKGhjZCk7Ci0JaW50IHJocG9ydDsKKwlpbnQgaWQsIHJocG9ydDsKIAlpbnQgZXJyID0gMDsKIAogCXVzYmlwX2RiZ192aGNpX2hjKCJlbnRlciB2aGNpX3N0YXJ0XG4iKTsKIAogCS8qIGluaXRpYWxpemUgcHJpdmF0ZSBkYXRhIG9mIHVzYl9oY2QgKi8KIAotCWZvciAocmhwb3J0ID0gMDsgcmhwb3J0IDwgVkhDSV9OUE9SVFM7IHJocG9ydCsrKSB7CisJZm9yIChyaHBvcnQgPSAwOyByaHBvcnQgPCBWSENJX0hDX1BPUlRTOyByaHBvcnQrKykgewogCQlzdHJ1Y3QgdmhjaV9kZXZpY2UgKnZkZXYgPSAmdmhjaS0+dmRldltyaHBvcnRdOwogCiAJCXZoY2lfZGV2aWNlX2luaXQodmRldik7CkBAIC05MTAsMTEgKzk2MiwyNiBAQAogCWhjZC0+cG93ZXJfYnVkZ2V0ID0gMDsgLyogbm8gbGltaXQgKi8KIAloY2QtPnVzZXNfbmV3X3BvbGxpbmcgPSAxOwogCisJaWQgPSBoY2RfbmFtZV90b19pZChoY2RfbmFtZShoY2QpKTsKKwlpZiAoaWQgPCAwKSB7CisJCXByX2VycigiaW52YWxpZCB2aGNpIG5hbWUgJXNcbiIsIGhjZF9uYW1lKGhjZCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAkvKiB2aGNpX2hjZCBpcyBub3cgcmVhZHkgdG8gYmUgY29udHJvbGxlZCB0aHJvdWdoIHN5c2ZzICovCi0JZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZ2aGNpX2Rldih2aGNpKS0+a29iaiwgJmRldl9hdHRyX2dyb3VwKTsKLQlpZiAoZXJyKSB7Ci0JCXByX2VycigiY3JlYXRlIHN5c2ZzIGZpbGVzXG4iKTsKLQkJcmV0dXJuIGVycjsKKwlpZiAoaWQgPT0gMCkgeworCQllcnIgPSB2aGNpX2luaXRfYXR0cl9ncm91cCgpOworCQlpZiAoZXJyKSB7CisJCQlwcl9lcnIoImluaXQgYXR0ciBncm91cFxuIik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmaGNkX2RldihoY2QpLT5rb2JqLCAmdmhjaV9hdHRyX2dyb3VwKTsKKwkJaWYgKGVycikgeworCQkJcHJfZXJyKCJjcmVhdGUgc3lzZnMgZmlsZXNcbiIpOworCQkJdmhjaV9maW5pc2hfYXR0cl9ncm91cCgpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlwcl9pbmZvKCJjcmVhdGVkIHN5c2ZzICVzXG4iLCBoY2RfbmFtZShoY2QpKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTkyMywxNSArOTkwLDE5IEBACiBzdGF0aWMgdm9pZCB2aGNpX3N0b3Aoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAlzdHJ1Y3QgdmhjaV9oY2QgKnZoY2kgPSBoY2RfdG9fdmhjaShoY2QpOwotCWludCByaHBvcnQgPSAwOworCWludCBpZCwgcmhwb3J0OwogCiAJdXNiaXBfZGJnX3ZoY2lfaGMoInN0b3AgVkhDSSBjb250cm9sbGVyXG4iKTsKIAogCS8qIDEuIHJlbW92ZSB0aGUgdXNlcmxhbmQgaW50ZXJmYWNlIG9mIHZoY2lfaGNkICovCi0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZ2aGNpX2Rldih2aGNpKS0+a29iaiwgJmRldl9hdHRyX2dyb3VwKTsKKwlpZCA9IGhjZF9uYW1lX3RvX2lkKGhjZF9uYW1lKGhjZCkpOworCWlmIChpZCA9PSAwKSB7CisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmaGNkX2RldihoY2QpLT5rb2JqLCAmdmhjaV9hdHRyX2dyb3VwKTsKKwkJdmhjaV9maW5pc2hfYXR0cl9ncm91cCgpOworCX0KIAogCS8qIDIuIHNodXRkb3duIGFsbCB0aGUgcG9ydHMgb2YgdmhjaV9oY2QgKi8KLQlmb3IgKHJocG9ydCA9IDA7IHJocG9ydCA8IFZIQ0lfTlBPUlRTOyByaHBvcnQrKykgeworCWZvciAocmhwb3J0ID0gMDsgcmhwb3J0IDwgVkhDSV9IQ19QT1JUUzsgcmhwb3J0KyspIHsKIAkJc3RydWN0IHZoY2lfZGV2aWNlICp2ZGV2ID0gJnZoY2ktPnZkZXZbcmhwb3J0XTsKIAogCQl1c2JpcF9ldmVudF9hZGQoJnZkZXYtPnVkLCBWREVWX0VWRU5UX1JFTU9WRUQpOwpAQCAtMTAyNSw5ICsxMDk2LDYgQEAKIAl9CiAJaGNkLT5oYXNfdHQgPSAxOwogCi0JLyogdGhpcyBpcyBwcml2YXRlIGRhdGEgZm9yIHZoY2lfaGNkICovCi0JdGhlX2NvbnRyb2xsZXIgPSBoY2RfdG9fdmhjaShoY2QpOwotCiAJLyoKIAkgKiBGaW5pc2ggZ2VuZXJpYyBIQ0Qgc3RydWN0dXJlIGluaXRpYWxpemF0aW9uIGFuZCByZWdpc3Rlci4KIAkgKiBDYWxsIHRoZSBkcml2ZXIncyByZXNldCgpIGFuZCBzdGFydCgpIHJvdXRpbmVzLgpAQCAtMTAzNiw3ICsxMTA0LDYgQEAKIAlpZiAocmV0ICE9IDApIHsKIAkJcHJfZXJyKCJ1c2JfYWRkX2hjZCBmYWlsZWQgJWRcbiIsIHJldCk7CiAJCXVzYl9wdXRfaGNkKGhjZCk7Ci0JCXRoZV9jb250cm9sbGVyID0gTlVMTDsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTEwNTksNyArMTEyNiw2IEBACiAJICovCiAJdXNiX3JlbW92ZV9oY2QoaGNkKTsKIAl1c2JfcHV0X2hjZChoY2QpOwotCXRoZV9jb250cm9sbGVyID0gTlVMTDsKIAogCXJldHVybiAwOwogfQpAQCAtMTA3MCwyMSArMTEzNiwyNCBAQAogc3RhdGljIGludCB2aGNpX2hjZF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkOwotCWludCByaHBvcnQgPSAwOworCXN0cnVjdCB2aGNpX2hjZCAqdmhjaTsKKwlpbnQgcmhwb3J0OwogCWludCBjb25uZWN0ZWQgPSAwOwogCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAloY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoIWhjZCkKKwkJcmV0dXJuIDA7CisJdmhjaSA9IGhjZF90b192aGNpKGhjZCk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmhjaS0+bG9jaywgZmxhZ3MpOwogCi0JZm9yIChyaHBvcnQgPSAwOyByaHBvcnQgPCBWSENJX05QT1JUUzsgcmhwb3J0KyspCi0JCWlmICh0aGVfY29udHJvbGxlci0+cG9ydF9zdGF0dXNbcmhwb3J0XSAmCi0JCSAgICBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04pCisJZm9yIChyaHBvcnQgPSAwOyByaHBvcnQgPCBWSENJX0hDX1BPUlRTOyByaHBvcnQrKykKKwkJaWYgKHZoY2ktPnBvcnRfc3RhdHVzW3JocG9ydF0gJiBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04pCiAJCQljb25uZWN0ZWQgKz0gMTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmhjaS0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKGNvbm5lY3RlZCA+IDApIHsKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwKQEAgLTExMDYsNiArMTE3NSw4IEBACiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCWhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWlmICghaGNkKQorCQlyZXR1cm4gMDsKIAlzZXRfYml0KEhDRF9GTEFHX0hXX0FDQ0VTU0lCTEUsICZoY2QtPmZsYWdzKTsKIAl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzKGhjZCk7CiAKQEAgLTExMjksNTIgKzEyMDAsNzggQEAKIAl9LAogfTsKIAotLyoKLSAqIFRoZSBWSENJICdkZXZpY2UnIGlzICd2aXJ0dWFsJzsgbm90IGEgcmVhbCBwbHVnJnBsYXkgaGFyZHdhcmUuCi0gKiBXZSBuZWVkIHRvIGFkZCB0aGlzIHZpcnR1YWwgZGV2aWNlIGFzIGEgcGxhdGZvcm0gZGV2aWNlIGFyYml0cmFyaWx5OgotICoJMS4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCkKLSAqLwotc3RhdGljIHZvaWQgdGhlX3BkZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGFkZF9wbGF0Zm9ybV9kZXZpY2UoaW50IGlkKQogeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJaW50IGRldl9ucjsKKworCWlmIChpZCA9PSAwKQorCQlkZXZfbnIgPSAtMTsKKwllbHNlCisJCWRldl9uciA9IGlkOworCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoZHJpdmVyX25hbWUsIGRldl9uciwgTlVMTCwgMCk7CisJaWYgKElTX0VSUihwZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIocGRldik7CisKKwkqKHZoY2lfcGRldnMgKyBpZCkgPSBwZGV2OworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0aGVfcGRldiA9IHsKLQkvKiBzaG91bGQgYmUgdGhlIHNhbWUgbmFtZSBhcyBkcml2ZXJfbmFtZSAqLwotCS5uYW1lID0gZHJpdmVyX25hbWUsCi0JLmlkID0gLTEsCi0JLmRldiA9IHsKLQkJLnJlbGVhc2UgPSB0aGVfcGRldl9yZWxlYXNlLAotCX0sCi19Oworc3RhdGljIHZvaWQgZGVsX3BsYXRmb3JtX2RldmljZXModm9pZCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHZoY2lfbnVtX2NvbnRyb2xsZXJzOyBpKyspIHsKKwkJcGRldiA9ICoodmhjaV9wZGV2cyArIGkpOworCQlpZiAocGRldiAhPSBOVUxMKQorCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7CisJCSoodmhjaV9wZGV2cyArIGkpID0gTlVMTDsKKwl9CisJc3lzZnNfcmVtb3ZlX2xpbmsoJnBsYXRmb3JtX2J1cy5rb2JqLCBkcml2ZXJfbmFtZSk7Cit9CiAKIHN0YXRpYyBpbnQgX19pbml0IHZoY2lfaGNkX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0OworCWludCBpLCByZXQ7CiAKIAlpZiAodXNiX2Rpc2FibGVkKCkpCiAJCXJldHVybiAtRU5PREVWOwogCisJaWYgKHZoY2lfbnVtX2NvbnRyb2xsZXJzIDwgMSkKKwkJdmhjaV9udW1fY29udHJvbGxlcnMgPSAxOworCisJdmhjaV9wZGV2cyA9IGtjYWxsb2ModmhjaV9udW1fY29udHJvbGxlcnMsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTsKKwlpZiAodmhjaV9wZGV2cyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdmhjaV9kcml2ZXIpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2RyaXZlcl9yZWdpc3RlcjsKIAotCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmdGhlX3BkZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX3BsYXRmb3JtX2RldmljZV9yZWdpc3RlcjsKKwlmb3IgKGkgPSAwOyBpIDwgdmhjaV9udW1fY29udHJvbGxlcnM7IGkrKykgeworCQlyZXQgPSBhZGRfcGxhdGZvcm1fZGV2aWNlKGkpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyOworCX0KIAogCXByX2luZm8oRFJJVkVSX0RFU0MgIiB2IiBVU0JJUF9WRVJTSU9OICJcbiIpOwogCXJldHVybiByZXQ7CiAKIGVycl9wbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXI6CisJZGVsX3BsYXRmb3JtX2RldmljZXMoKTsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdmhjaV9kcml2ZXIpOwogZXJyX2RyaXZlcl9yZWdpc3RlcjoKKwlrZnJlZSh2aGNpX3BkZXZzKTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdmhjaV9oY2RfZXhpdCh2b2lkKQogewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZ0aGVfcGRldik7CisJZGVsX3BsYXRmb3JtX2RldmljZXMoKTsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdmhjaV9kcml2ZXIpOworCWtmcmVlKHZoY2lfcGRldnMpOwogfQogCiBtb2R1bGVfaW5pdCh2aGNpX2hjZF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3VzYmlwL3ZoY2lfcnguYyBiL2RyaXZlcnMvdXNiL3VzYmlwL3ZoY2lfcnguYwppbmRleCBkNjU2ZTBlLi5mYzJkMzE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi91c2JpcC92aGNpX3J4LmMKKysrIGIvZHJpdmVycy91c2IvdXNiaXAvdmhjaV9yeC5jCkBAIC03MCw2ICs3MCw3IEBACiBzdGF0aWMgdm9pZCB2aGNpX3JlY3ZfcmV0X3N1Ym1pdChzdHJ1Y3QgdmhjaV9kZXZpY2UgKnZkZXYsCiAJCQkJIHN0cnVjdCB1c2JpcF9oZWFkZXIgKnBkdSkKIHsKKwlzdHJ1Y3QgdmhjaV9oY2QgKnZoY2kgPSB2ZGV2X3RvX3ZoY2kodmRldik7CiAJc3RydWN0IHVzYmlwX2RldmljZSAqdWQgPSAmdmRldi0+dWQ7CiAJc3RydWN0IHVyYiAqdXJiOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC04MSw3ICs4Miw3IEBACiAJaWYgKCF1cmIpIHsKIAkJcHJfZXJyKCJjYW5ub3QgZmluZCBhIHVyYiBvZiBzZXFudW0gJXVcbiIsIHBkdS0+YmFzZS5zZXFudW0pOwogCQlwcl9pbmZvKCJtYXggc2VxbnVtICVkXG4iLAotCQkJYXRvbWljX3JlYWQoJnRoZV9jb250cm9sbGVyLT5zZXFudW0pKTsKKwkJCWF0b21pY19yZWFkKCZ2aGNpLT5zZXFudW0pKTsKIAkJdXNiaXBfZXZlbnRfYWRkKHVkLCBWREVWX0VWRU5UX0VSUk9SX1RDUCk7CiAJCXJldHVybjsKIAl9CkBAIC0xMDUsMTEgKzEwNiwxMSBAQAogCiAJdXNiaXBfZGJnX3ZoY2lfcngoIm5vdyBnaXZlYmFjayB1cmIgJXBcbiIsIHVyYik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKLQl1c2JfaGNkX3VubGlua191cmJfZnJvbV9lcCh2aGNpX3RvX2hjZCh0aGVfY29udHJvbGxlciksIHVyYik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmhjaS0+bG9jaywgZmxhZ3MpOworCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKHZoY2lfdG9faGNkKHZoY2kpLCB1cmIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAotCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKHZoY2lfdG9faGNkKHRoZV9jb250cm9sbGVyKSwgdXJiLCB1cmItPnN0YXR1cyk7CisJdXNiX2hjZF9naXZlYmFja191cmIodmhjaV90b19oY2QodmhjaSksIHVyYiwgdXJiLT5zdGF0dXMpOwogCiAJdXNiaXBfZGJnX3ZoY2lfcngoIkxlYXZlXG4iKTsKIH0KQEAgLTE0Miw2ICsxNDMsNyBAQAogc3RhdGljIHZvaWQgdmhjaV9yZWN2X3JldF91bmxpbmsoc3RydWN0IHZoY2lfZGV2aWNlICp2ZGV2LAogCQkJCSBzdHJ1Y3QgdXNiaXBfaGVhZGVyICpwZHUpCiB7CisJc3RydWN0IHZoY2lfaGNkICp2aGNpID0gdmRldl90b192aGNpKHZkZXYpOwogCXN0cnVjdCB2aGNpX3VubGluayAqdW5saW5rOwogCXN0cnVjdCB1cmIgKnVyYjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTc0LDEyICsxNzYsMTEgQEAKIAkJdXJiLT5zdGF0dXMgPSBwZHUtPnUucmV0X3VubGluay5zdGF0dXM7CiAJCXByX2luZm8oInVyYi0+c3RhdHVzICVkXG4iLCB1cmItPnN0YXR1cyk7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7Ci0JCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKHZoY2lfdG9faGNkKHRoZV9jb250cm9sbGVyKSwgdXJiKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKKwkJdXNiX2hjZF91bmxpbmtfdXJiX2Zyb21fZXAodmhjaV90b19oY2QodmhjaSksIHVyYik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAotCQl1c2JfaGNkX2dpdmViYWNrX3VyYih2aGNpX3RvX2hjZCh0aGVfY29udHJvbGxlciksIHVyYiwKLQkJCQkgICAgIHVyYi0+c3RhdHVzKTsKKwkJdXNiX2hjZF9naXZlYmFja191cmIodmhjaV90b19oY2QodmhjaSksIHVyYiwgdXJiLT5zdGF0dXMpOwogCX0KIAogCWtmcmVlKHVubGluayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi91c2JpcC92aGNpX3N5c2ZzLmMgYi9kcml2ZXJzL3VzYi91c2JpcC92aGNpX3N5c2ZzLmMKaW5kZXggNWI1NDYyZS4uYzQwNDAxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvdXNiaXAvdmhjaV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvdXNiL3VzYmlwL3ZoY2lfc3lzZnMuYwpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBUYWthaGlybyBIaXJvZnVjaGkKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IE5vYnVvIEl3YXRhCiAgKgogICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjAsNiArMjEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAidXNiaXBfY29tbW9uLmgiCiAjaW5jbHVkZSAidmhjaS5oIgpAQCAtMjcsMTA2ICszMCwxOTAgQEAKIC8qIFRPRE86IHJlZmluZSBsb2NraW5nID8qLwogCiAvKiBTeXNmcyBlbnRyeSB0byBzaG93IHBvcnQgc3RhdHVzICovCi1zdGF0aWMgc3NpemVfdCBzdGF0dXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgY2hhciAqb3V0KQorc3RhdGljIHNzaXplX3Qgc3RhdHVzX3Nob3dfdmhjaShpbnQgcGRldl9uciwgY2hhciAqb3V0KQogeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSAqKHZoY2lfcGRldnMgKyBwZGV2X25yKTsKKwlzdHJ1Y3QgdmhjaV9oY2QgKnZoY2k7CiAJY2hhciAqcyA9IG91dDsKIAlpbnQgaSA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCUJVR19PTighdGhlX2NvbnRyb2xsZXIgfHwgIW91dCk7CisJaWYgKCFwZGV2IHx8ICFvdXQpIHsKKwkJdXNiaXBfZGJnX3ZoY2lfc3lzZnMoInNob3cgc3RhdHVzIGVycm9yXG4iKTsKKwkJcmV0dXJuIDA7CisJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJdmhjaSA9IGhjZF90b192aGNpKHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAKIAkvKgogCSAqIG91dHB1dCBleGFtcGxlOgotCSAqIHBydCBzdGEgc3BkIGRldiBzb2NrZXQgICAgICAgICAgIGxvY2FsX2J1c2lkCi0JICogMDAwIDAwNCAwMDAgMDAwICAgICAgICAgYzVhN2JiODAgMS0yLjMKLQkgKiAwMDEgMDA0IDAwMCAwMDAgICAgICAgICBkOGNlZTk4MCAyLTMuNAorCSAqIHBvcnQgc3RhIHNwZCBkZXYgICAgICBzb2NrZXQgICAgICAgICAgIGxvY2FsX2J1c2lkCisJICogMDAwMCAwMDQgMDAwIDAwMDAwMDAwICAgICAgICAgYzVhN2JiODAgMS0yLjMKKwkgKiAwMDAxIDAwNCAwMDAgMDAwMDAwMDAgICAgICAgICBkOGNlZTk4MCAyLTMuNAogCSAqCiAJICogSVAgYWRkcmVzcyBjYW4gYmUgcmV0cmlldmVkIGZyb20gYSBzb2NrZXQgcG9pbnRlciBhZGRyZXNzIGJ5IGxvb2tpbmcKIAkgKiB1cCAvcHJvYy9uZXQve3RjcCx0Y3A2fS4gQWxzbywgYSB1c2VybGFuZCBwcm9ncmFtIG1heSByZW1lbWJlciBhCiAJICogcG9ydCBudW1iZXIgYW5kIGl0cyBwZWVyIElQIGFkZHJlc3MuCiAJICovCi0Jb3V0ICs9IHNwcmludGYob3V0LAotCQkgICAgICAgInBydCBzdGEgc3BkIGJ1cyBkZXYgc29ja2V0ICAgICAgICAgICBsb2NhbF9idXNpZFxuIik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVkhDSV9OUE9SVFM7IGkrKykgewotCQlzdHJ1Y3QgdmhjaV9kZXZpY2UgKnZkZXYgPSBwb3J0X3RvX3ZkZXYoaSk7CisJZm9yIChpID0gMDsgaSA8IFZIQ0lfSENfUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgdmhjaV9kZXZpY2UgKnZkZXYgPSAmdmhjaS0+dmRldltpXTsKIAogCQlzcGluX2xvY2soJnZkZXYtPnVkLmxvY2spOwotCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlMDN1ICUwM3UgIiwgaSwgdmRldi0+dWQuc3RhdHVzKTsKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiJTA0dSAlMDN1ICIsCisJCQkJICAgIChwZGV2X25yICogVkhDSV9IQ19QT1JUUykgKyBpLAorCQkJCSAgICB2ZGV2LT51ZC5zdGF0dXMpOwogCiAJCWlmICh2ZGV2LT51ZC5zdGF0dXMgPT0gVkRFVl9TVF9VU0VEKSB7CiAJCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlMDN1ICUwOHggIiwKLQkJCQkgICAgICAgdmRldi0+c3BlZWQsIHZkZXYtPmRldmlkKTsKLQkJCW91dCArPSBzcHJpbnRmKG91dCwgIiUxNnAgIiwgdmRldi0+dWQudGNwX3NvY2tldCk7Ci0JCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlcyIsIGRldl9uYW1lKCZ2ZGV2LT51ZGV2LT5kZXYpKTsKKwkJCQkJICAgIHZkZXYtPnNwZWVkLCB2ZGV2LT5kZXZpZCk7CisJCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlMTZwICVzIiwKKwkJCQkJICAgIHZkZXYtPnVkLnRjcF9zb2NrZXQsCisJCQkJCSAgICBkZXZfbmFtZSgmdmRldi0+dWRldi0+ZGV2KSk7CiAKIAkJfSBlbHNlIHsKLQkJCW91dCArPSBzcHJpbnRmKG91dCwgIjAwMCAwMDAgMDAwIDAwMDAwMDAwMDAwMDAwMDAgMC0wIik7CisJCQlvdXQgKz0gc3ByaW50ZihvdXQsICIwMDAgMDAwMDAwMDAgIik7CisJCQlvdXQgKz0gc3ByaW50ZihvdXQsICIwMDAwMDAwMDAwMDAwMDAwIDAtMCIpOwogCQl9CiAKIAkJb3V0ICs9IHNwcmludGYob3V0LCAiXG4iKTsKIAkJc3Bpbl91bmxvY2soJnZkZXYtPnVkLmxvY2spOwogCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmhjaS0+bG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIG91dCAtIHM7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFJfUk8oc3RhdHVzKTsKKworc3RhdGljIHNzaXplX3Qgc3RhdHVzX3Nob3dfbm90X3JlYWR5KGludCBwZGV2X25yLCBjaGFyICpvdXQpCit7CisJY2hhciAqcyA9IG91dDsKKwlpbnQgaSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgVkhDSV9IQ19QT1JUUzsgaSsrKSB7CisJCW91dCArPSBzcHJpbnRmKG91dCwgIiUwNHUgJTAzdSAiLAorCQkJCSAgICAocGRldl9uciAqIFZIQ0lfSENfUE9SVFMpICsgaSwKKwkJCQkgICAgVkRFVl9TVF9OT1RBU1NJR05FRCk7CisJCW91dCArPSBzcHJpbnRmKG91dCwgIjAwMCAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIDAtMCIpOworCQlvdXQgKz0gc3ByaW50ZihvdXQsICJcbiIpOworCX0KKwlyZXR1cm4gb3V0IC0gczsKK30KKworc3RhdGljIGludCBzdGF0dXNfbmFtZV90b19pZChjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgKmM7CisJbG9uZyB2YWw7CisJaW50IHJldDsKKworCWMgPSBzdHJjaHIobmFtZSwgJy4nKTsKKwlpZiAoYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGtzdHJ0b2woYysxLCAxMCwgJnZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgc3NpemVfdCBzdGF0dXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqb3V0KQoreworCWNoYXIgKnMgPSBvdXQ7CisJaW50IHBkZXZfbnI7CisKKwlvdXQgKz0gc3ByaW50ZihvdXQsCisJCSAgICAgICAicG9ydCBzdGEgc3BkIGRldiAgICAgIHNvY2tldCAgICAgICAgICAgbG9jYWxfYnVzaWRcbiIpOworCisJcGRldl9uciA9IHN0YXR1c19uYW1lX3RvX2lkKGF0dHItPmF0dHIubmFtZSk7CisJaWYgKHBkZXZfbnIgPCAwKQorCQlvdXQgKz0gc3RhdHVzX3Nob3dfbm90X3JlYWR5KHBkZXZfbnIsIG91dCk7CisJZWxzZQorCQlvdXQgKz0gc3RhdHVzX3Nob3dfdmhjaShwZGV2X25yLCBvdXQpOworCisJcmV0dXJuIG91dCAtIHM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG5wb3J0c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpvdXQpCit7CisJY2hhciAqcyA9IG91dDsKKworCW91dCArPSBzcHJpbnRmKG91dCwgIiVkXG4iLCBWSENJX0hDX1BPUlRTICogdmhjaV9udW1fY29udHJvbGxlcnMpOworCXJldHVybiBvdXQgLSBzOworfQorc3RhdGljIERFVklDRV9BVFRSX1JPKG5wb3J0cyk7CiAKIC8qIFN5c2ZzIGVudHJ5IHRvIHNodXRkb3duIGEgdmlydHVhbCBjb25uZWN0aW9uICovCi1zdGF0aWMgaW50IHZoY2lfcG9ydF9kaXNjb25uZWN0KF9fdTMyIHJocG9ydCkKK3N0YXRpYyBpbnQgdmhjaV9wb3J0X2Rpc2Nvbm5lY3Qoc3RydWN0IHZoY2lfaGNkICp2aGNpLCBfX3UzMiByaHBvcnQpCiB7Ci0Jc3RydWN0IHZoY2lfZGV2aWNlICp2ZGV2OworCXN0cnVjdCB2aGNpX2RldmljZSAqdmRldiA9ICZ2aGNpLT52ZGV2W3JocG9ydF07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXVzYmlwX2RiZ192aGNpX3N5c2ZzKCJlbnRlclxuIik7CiAKIAkvKiBsb2NrICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7Ci0KLQl2ZGV2ID0gcG9ydF90b192ZGV2KHJocG9ydCk7Ci0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmhjaS0+bG9jaywgZmxhZ3MpOwogCXNwaW5fbG9jaygmdmRldi0+dWQubG9jayk7CisKIAlpZiAodmRldi0+dWQuc3RhdHVzID09IFZERVZfU1RfTlVMTCkgewogCQlwcl9lcnIoIm5vdCBjb25uZWN0ZWQgJWRcbiIsIHZkZXYtPnVkLnN0YXR1cyk7CiAKIAkJLyogdW5sb2NrICovCiAJCXNwaW5fdW5sb2NrKCZ2ZGV2LT51ZC5sb2NrKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmhjaS0+bG9jaywgZmxhZ3MpOwogCiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIHVubG9jayAqLwogCXNwaW5fdW5sb2NrKCZ2ZGV2LT51ZC5sb2NrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAogCXVzYmlwX2V2ZW50X2FkZCgmdmRldi0+dWQsIFZERVZfRVZFTlRfRE9XTik7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB2YWxpZF9wb3J0KF9fdTMyIHBkZXZfbnIsIF9fdTMyIHJocG9ydCkKK3sKKwlpZiAocGRldl9uciA+PSB2aGNpX251bV9jb250cm9sbGVycykgeworCQlwcl9lcnIoInBkZXYgJXVcbiIsIHBkZXZfbnIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHJocG9ydCA+PSBWSENJX0hDX1BPUlRTKSB7CisJCXByX2Vycigicmhwb3J0ICV1XG4iLCByaHBvcnQpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX2RldGFjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCWludCBlcnI7Ci0JX191MzIgcmhwb3J0ID0gMDsKKwlfX3UzMiBwb3J0ID0gMCwgcGRldl9uciA9IDAsIHJocG9ydCA9IDA7CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKKwlpbnQgcmV0OwogCi0JaWYgKHNzY2FuZihidWYsICIldSIsICZyaHBvcnQpICE9IDEpCisJaWYgKGtzdHJ0b2ludChidWYsIDEwLCAmcG9ydCkgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIGNoZWNrIHJocG9ydCAqLwotCWlmIChyaHBvcnQgPj0gVkhDSV9OUE9SVFMpIHsKLQkJZGV2X2VycihkZXYsICJpbnZhbGlkIHBvcnQgJXVcbiIsIHJocG9ydCk7CisJcGRldl9uciA9IHBvcnRfdG9fcGRldl9ucihwb3J0KTsKKwlyaHBvcnQgPSBwb3J0X3RvX3JocG9ydChwb3J0KTsKKworCWlmICghdmFsaWRfcG9ydChwZGV2X25yLCByaHBvcnQpKQogCQlyZXR1cm4gLUVJTlZBTDsKKworCWhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKCoodmhjaV9wZGV2cyArIHBkZXZfbnIpKTsKKwlpZiAoaGNkID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJwb3J0IGlzIG5vdCByZWFkeSAldVxuIiwgcG9ydCk7CisJCXJldHVybiAtRUFHQUlOOwogCX0KIAotCWVyciA9IHZoY2lfcG9ydF9kaXNjb25uZWN0KHJocG9ydCk7Ci0JaWYgKGVyciA8IDApCisJcmV0ID0gdmhjaV9wb3J0X2Rpc2Nvbm5lY3QoaGNkX3RvX3ZoY2koaGNkKSwgcmhwb3J0KTsKKwlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl1c2JpcF9kYmdfdmhjaV9zeXNmcygiTGVhdmVcbiIpOwpAQCAtMTM1LDE2ICsyMjIsMTIgQEAKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihkZXRhY2gsIFNfSVdVU1IsIE5VTEwsIHN0b3JlX2RldGFjaCk7CiAKLS8qIFN5c2ZzIGVudHJ5IHRvIGVzdGFibGlzaCBhIHZpcnR1YWwgY29ubmVjdGlvbiAqLwotc3RhdGljIGludCB2YWxpZF9hcmdzKF9fdTMyIHJocG9ydCwgZW51bSB1c2JfZGV2aWNlX3NwZWVkIHNwZWVkKQorc3RhdGljIGludCB2YWxpZF9hcmdzKF9fdTMyIHBkZXZfbnIsIF9fdTMyIHJocG9ydCwgZW51bSB1c2JfZGV2aWNlX3NwZWVkIHNwZWVkKQogewotCS8qIGNoZWNrIHJocG9ydCAqLwotCWlmIChyaHBvcnQgPj0gVkhDSV9OUE9SVFMpIHsKLQkJcHJfZXJyKCJwb3J0ICV1XG4iLCByaHBvcnQpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXZhbGlkX3BvcnQocGRldl9uciwgcmhwb3J0KSkgeworCQlyZXR1cm4gMDsKIAl9CiAKLQkvKiBjaGVjayBzcGVlZCAqLwogCXN3aXRjaCAoc3BlZWQpIHsKIAljYXNlIFVTQl9TUEVFRF9MT1c6CiAJY2FzZSBVU0JfU1BFRURfRlVMTDoKQEAgLTE1NCwxMiArMjM3LDEzIEBACiAJZGVmYXVsdDoKIAkJcHJfZXJyKCJGYWlsZWQgYXR0YWNoIHJlcXVlc3QgZm9yIHVuc3VwcG9ydGVkIFVTQiBzcGVlZDogJXNcbiIsCiAJCQl1c2Jfc3BlZWRfc3RyaW5nKHNwZWVkKSk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIH0KIAorLyogU3lzZnMgZW50cnkgdG8gZXN0YWJsaXNoIGEgdmlydHVhbCBjb25uZWN0aW9uICovCiAvKgogICogVG8gc3RhcnQgYSBuZXcgVVNCL0lQIGF0dGFjaG1lbnQsIGEgdXNlcmxhbmQgcHJvZ3JhbSBuZWVkcyB0byBzZXR1cCBhIFRDUAogICogY29ubmVjdGlvbiBhbmQgdGhlbiB3cml0ZSBpdHMgc29ja2V0IGRlc2NyaXB0b3Igd2l0aCByZW1vdGUgZGV2aWNlCkBAIC0xNzQsMTAgKzI1OCwxMiBAQAogc3RhdGljIHNzaXplX3Qgc3RvcmVfYXR0YWNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IHZoY2lfZGV2aWNlICp2ZGV2OwogCXN0cnVjdCBzb2NrZXQgKnNvY2tldDsKIAlpbnQgc29ja2ZkID0gMDsKLQlfX3UzMiByaHBvcnQgPSAwLCBkZXZpZCA9IDAsIHNwZWVkID0gMDsKKwlfX3UzMiBwb3J0ID0gMCwgcGRldl9uciA9IDAsIHJocG9ydCA9IDAsIGRldmlkID0gMCwgc3BlZWQgPSAwOworCXN0cnVjdCB1c2JfaGNkICpoY2Q7CisJc3RydWN0IHZoY2lfaGNkICp2aGNpOworCXN0cnVjdCB2aGNpX2RldmljZSAqdmRldjsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTE4NywxNiArMjczLDI4IEBACiAJICogQGRldmlkOiB1bmlxdWUgZGV2aWNlIGlkZW50aWZpZXIgaW4gYSByZW1vdGUgaG9zdAogCSAqIEBzcGVlZDogdXNiIGRldmljZSBzcGVlZCBpbiBhIHJlbW90ZSBob3N0CiAJICovCi0JaWYgKHNzY2FuZihidWYsICIldSAldSAldSAldSIsICZyaHBvcnQsICZzb2NrZmQsICZkZXZpZCwgJnNwZWVkKSAhPSA0KQorCWlmIChzc2NhbmYoYnVmLCAiJXUgJXUgJXUgJXUiLCAmcG9ydCwgJnNvY2tmZCwgJmRldmlkLCAmc3BlZWQpICE9IDQpCiAJCXJldHVybiAtRUlOVkFMOworCXBkZXZfbnIgPSBwb3J0X3RvX3BkZXZfbnIocG9ydCk7CisJcmhwb3J0ID0gcG9ydF90b19yaHBvcnQocG9ydCk7CiAKLQl1c2JpcF9kYmdfdmhjaV9zeXNmcygicmhwb3J0KCV1KSBzb2NrZmQoJXUpIGRldmlkKCV1KSBzcGVlZCgldSlcbiIsCi0JCQkgICAgIHJocG9ydCwgc29ja2ZkLCBkZXZpZCwgc3BlZWQpOworCXVzYmlwX2RiZ192aGNpX3N5c2ZzKCJwb3J0KCV1KSBwZGV2KCVkKSByaHBvcnQoJXUpXG4iLAorCQkJICAgICBwb3J0LCBwZGV2X25yLCByaHBvcnQpOworCXVzYmlwX2RiZ192aGNpX3N5c2ZzKCJzb2NrZmQoJXUpIGRldmlkKCV1KSBzcGVlZCgldSlcbiIsCisJCQkgICAgIHNvY2tmZCwgZGV2aWQsIHNwZWVkKTsKIAogCS8qIGNoZWNrIHJlY2VpdmVkIHBhcmFtZXRlcnMgKi8KLQlpZiAodmFsaWRfYXJncyhyaHBvcnQsIHNwZWVkKSA8IDApCisJaWYgKCF2YWxpZF9hcmdzKHBkZXZfbnIsIHJocG9ydCwgc3BlZWQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKCoodmhjaV9wZGV2cyArIHBkZXZfbnIpKTsKKwlpZiAoaGNkID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJwb3J0ICVkIGlzIG5vdCByZWFkeVxuIiwgcG9ydCk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwl2aGNpID0gaGNkX3RvX3ZoY2koaGNkKTsKKwl2ZGV2ID0gJnZoY2ktPnZkZXZbcmhwb3J0XTsKKwogCS8qIEV4dHJhY3Qgc29ja2V0IGZyb20gZmQuICovCiAJc29ja2V0ID0gc29ja2ZkX2xvb2t1cChzb2NrZmQsICZlcnIpOwogCWlmICghc29ja2V0KQpAQCAtMjA1LDE0ICszMDMsMTMgQEAKIAkvKiBub3cgbmVlZCBsb2NrIHVudGlsIHNldHRpbmcgdmRldiBzdGF0dXMgYXMgdXNlZCAqLwogCiAJLyogYmVnaW4gYSBsb2NrICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7Ci0JdmRldiA9IHBvcnRfdG9fdmRldihyaHBvcnQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAJc3Bpbl9sb2NrKCZ2ZGV2LT51ZC5sb2NrKTsKIAogCWlmICh2ZGV2LT51ZC5zdGF0dXMgIT0gVkRFVl9TVF9OVUxMKSB7CiAJCS8qIGVuZCBvZiB0aGUgbG9jayAqLwogCQlzcGluX3VubG9jaygmdmRldi0+dWQubG9jayk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAogCQlzb2NrZmRfcHV0KHNvY2tldCk7CiAKQEAgLTIyMCw5ICszMTcsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZGV2X2luZm8oZGV2LAotCQkgInJocG9ydCgldSkgc29ja2ZkKCVkKSBkZXZpZCgldSkgc3BlZWQoJXUpIHNwZWVkX3N0ciglcylcbiIsCi0JCSByaHBvcnQsIHNvY2tmZCwgZGV2aWQsIHNwZWVkLCB1c2Jfc3BlZWRfc3RyaW5nKHNwZWVkKSk7CisJZGV2X2luZm8oZGV2LCAicGRldigldSkgcmhwb3J0KCV1KSBzb2NrZmQoJWQpXG4iLAorCQkgcGRldl9uciwgcmhwb3J0LCBzb2NrZmQpOworCWRldl9pbmZvKGRldiwgImRldmlkKCV1KSBzcGVlZCgldSkgc3BlZWRfc3RyKCVzKVxuIiwKKwkJIGRldmlkLCBzcGVlZCwgdXNiX3NwZWVkX3N0cmluZyhzcGVlZCkpOwogCiAJdmRldi0+ZGV2aWQgICAgICAgICA9IGRldmlkOwogCXZkZXYtPnNwZWVkICAgICAgICAgPSBzcGVlZDsKQEAgLTIzMCwyNiArMzI4LDkyIEBACiAJdmRldi0+dWQuc3RhdHVzICAgICA9IFZERVZfU1RfTk9UQVNTSUdORUQ7CiAKIAlzcGluX3VubG9jaygmdmRldi0+dWQubG9jayk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAJLyogZW5kIHRoZSBsb2NrICovCiAKIAl2ZGV2LT51ZC50Y3BfcnggPSBrdGhyZWFkX2dldF9ydW4odmhjaV9yeF9sb29wLCAmdmRldi0+dWQsICJ2aGNpX3J4Iik7CiAJdmRldi0+dWQudGNwX3R4ID0ga3RocmVhZF9nZXRfcnVuKHZoY2lfdHhfbG9vcCwgJnZkZXYtPnVkLCAidmhjaV90eCIpOwogCi0JcmhfcG9ydF9jb25uZWN0KHJocG9ydCwgc3BlZWQpOworCXJoX3BvcnRfY29ubmVjdCh2ZGV2LCBzcGVlZCk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CiBzdGF0aWMgREVWSUNFX0FUVFIoYXR0YWNoLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9hdHRhY2gpOwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGV2X2F0dHJzW10gPSB7Ci0JJmRldl9hdHRyX3N0YXR1cy5hdHRyLAotCSZkZXZfYXR0cl9kZXRhY2guYXR0ciwKLQkmZGV2X2F0dHJfYXR0YWNoLmF0dHIsCi0JJmRldl9hdHRyX3VzYmlwX2RlYnVnLmF0dHIsCi0JTlVMTCwKKyNkZWZpbmUgTUFYX1NUQVRVU19OQU1FIDE2CisKK3N0cnVjdCBzdGF0dXNfYXR0ciB7CisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgYXR0cjsKKwljaGFyIG5hbWVbTUFYX1NUQVRVU19OQU1FKzFdOwogfTsKIAotY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBkZXZfYXR0cl9ncm91cCA9IHsKLQkuYXR0cnMgPSBkZXZfYXR0cnMsCitzdGF0aWMgc3RydWN0IHN0YXR1c19hdHRyICpzdGF0dXNfYXR0cnM7CisKK3N0YXRpYyB2b2lkIHNldF9zdGF0dXNfYXR0cihpbnQgaWQpCit7CisJc3RydWN0IHN0YXR1c19hdHRyICpzdGF0dXM7CisKKwlzdGF0dXMgPSBzdGF0dXNfYXR0cnMgKyBpZDsKKwlpZiAoaWQgPT0gMCkKKwkJc3RyY3B5KHN0YXR1cy0+bmFtZSwgInN0YXR1cyIpOworCWVsc2UKKwkJc25wcmludGYoc3RhdHVzLT5uYW1lLCBNQVhfU1RBVFVTX05BTUUrMSwgInN0YXR1cy4lZCIsIGlkKTsKKwlzdGF0dXMtPmF0dHIuYXR0ci5uYW1lID0gc3RhdHVzLT5uYW1lOworCXN0YXR1cy0+YXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOworCXN0YXR1cy0+YXR0ci5zaG93ID0gc3RhdHVzX3Nob3c7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9zdGF0dXNfYXR0cnModm9pZCkKK3sKKwlpbnQgaWQ7CisKKwlzdGF0dXNfYXR0cnMgPSBrY2FsbG9jKHZoY2lfbnVtX2NvbnRyb2xsZXJzLCBzaXplb2Yoc3RydWN0IHN0YXR1c19hdHRyKSwKKwkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoc3RhdHVzX2F0dHJzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpZCA9IDA7IGlkIDwgdmhjaV9udW1fY29udHJvbGxlcnM7IGlkKyspCisJCXNldF9zdGF0dXNfYXR0cihpZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmluaXNoX3N0YXR1c19hdHRycyh2b2lkKQoreworCWtmcmVlKHN0YXR1c19hdHRycyk7Cit9CisKK3N0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdmhjaV9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IE5VTEwsCiB9OworCitpbnQgdmhjaV9pbml0X2F0dHJfZ3JvdXAodm9pZCkKK3sKKwlzdHJ1Y3QgYXR0cmlidXRlICoqYXR0cnM7CisJaW50IHJldCwgaTsKKworCWF0dHJzID0ga2NhbGxvYygodmhjaV9udW1fY29udHJvbGxlcnMgKyA1KSwgc2l6ZW9mKHN0cnVjdCBhdHRyaWJ1dGUgKiksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoYXR0cnMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBpbml0X3N0YXR1c19hdHRycygpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUoYXR0cnMpOworCQlyZXR1cm4gcmV0OworCX0KKwkqYXR0cnMgPSAmZGV2X2F0dHJfbnBvcnRzLmF0dHI7CisJKihhdHRycyArIDEpID0gJmRldl9hdHRyX2RldGFjaC5hdHRyOworCSooYXR0cnMgKyAyKSA9ICZkZXZfYXR0cl9hdHRhY2guYXR0cjsKKwkqKGF0dHJzICsgMykgPSAmZGV2X2F0dHJfdXNiaXBfZGVidWcuYXR0cjsKKwlmb3IgKGkgPSAwOyBpIDwgdmhjaV9udW1fY29udHJvbGxlcnM7IGkrKykKKwkJKihhdHRycyArIGkgKyA0KSA9ICYoKHN0YXR1c19hdHRycyArIGkpLT5hdHRyLmF0dHIpOworCXZoY2lfYXR0cl9ncm91cC5hdHRycyA9IGF0dHJzOworCXJldHVybiAwOworfQorCit2b2lkIHZoY2lfZmluaXNoX2F0dHJfZ3JvdXAodm9pZCkKK3sKKwlmaW5pc2hfc3RhdHVzX2F0dHJzKCk7CisJa2ZyZWUodmhjaV9hdHRyX2dyb3VwLmF0dHJzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3VzYmlwL3Z1ZGNfZGV2LmMgYi9kcml2ZXJzL3VzYi91c2JpcC92dWRjX2Rldi5jCmluZGV4IDg5OTRhMTMuLjcwOTE4NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3VzYmlwL3Z1ZGNfZGV2LmMKKysrIGIvZHJpdmVycy91c2IvdXNiaXAvdnVkY19kZXYuYwpAQCAtNDUwLDcgKzQ1MCw3IEBACiAJaWYgKHVkLT50Y3Bfc29ja2V0KQogCQlrZXJuZWxfc29ja19zaHV0ZG93bih1ZC0+dGNwX3NvY2tldCwgU0hVVF9SRFdSKTsKIAotCWlmICh1ZC0+dGNwX3R4KSB7CisJaWYgKHVkLT50Y3BfcngpIHsKIAkJa3RocmVhZF9zdG9wX3B1dCh1ZC0+dGNwX3J4KTsKIAkJdWQtPnRjcF9yeCA9IE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvdXNiaXAvdnVkY19yeC5jIGIvZHJpdmVycy91c2IvdXNiaXAvdnVkY19yeC5jCmluZGV4IDM0NGJkOTQuLmU0MjliNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3VzYmlwL3Z1ZGNfcnguYworKysgYi9kcml2ZXJzL3VzYi91c2JpcC92dWRjX3J4LmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogCXVyYl9wLT51cmItPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKIAogCS8qIEZJWE1FOiBtb3JlIHBpcGUgc2V0dXAgdG8gcGxlYXNlIHVzYmlwX2NvbW1vbiAqLwotCXVyYl9wLT51cmItPnBpcGUgJj0gfigxMSA8PCAzMCk7CisJdXJiX3AtPnVyYi0+cGlwZSAmPSB+KDMgPDwgMzApOwogCXN3aXRjaCAodXJiX3AtPmVwLT50eXBlKSB7CiAJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLOgogCQl1cmJfcC0+dXJiLT5waXBlIHw9IChQSVBFX0JVTEsgPDwgMzApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvY2JhZi5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvY2JhZi5jCmluZGV4IGRhMWI4NzIuLmZiNzBjYmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS9jYmFmLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvY2JhZi5jCkBAIC02MTAsOCArNjEwLDcgQEAKIAljYmFmLT51c2JfaWZhY2UgPSB1c2JfZ2V0X2ludGYoaWZhY2UpOwogCXJlc3VsdCA9IGNiYWZfY2hlY2soY2JhZik7CiAJaWYgKHJlc3VsdCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJUaGlzIGRldmljZSBpcyBub3QgV1VTQi1DQkFGIGNvbXBsaWFudCIKLQkJCSJhbmQgaXMgbm90IHN1cHBvcnRlZCB5ZXQuXG4iKTsKKwkJZGV2X2VycihkZXYsICJUaGlzIGRldmljZSBpcyBub3QgV1VTQi1DQkFGIGNvbXBsaWFudCBhbmQgaXMgbm90IHN1cHBvcnRlZCB5ZXQuXG4iKTsKIAkJZ290byBlcnJvcl9jaGVjazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2NyeXB0by5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvY3J5cHRvLmMKaW5kZXggMzNhY2QxNS4uNzliMmI2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvY3J5cHRvLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvY3J5cHRvLmMKQEAgLTIyOSwxMCArMjI5LDggQEAKIAkJemVyb19wYWRkaW5nID0gc2l6ZW9mKHN0cnVjdCBhZXNfY2NtX2Jsb2NrKSAtIHplcm9fcGFkZGluZzsKIAlkc3Rfc2l6ZSA9IGJsZW4gKyBzaXplb2YoYjApICsgc2l6ZW9mKGIxKSArIHplcm9fcGFkZGluZzsKIAlkc3RfYnVmID0ga3phbGxvYyhkc3Rfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRzdF9idWYgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIkU6IGNhbid0IGFsbG9jIGRlc3RpbmF0aW9uIGJ1ZmZlclxuIik7CisJaWYgKCFkc3RfYnVmKQogCQlnb3RvIGVycm9yX2RzdF9idWY7Ci0JfQogCiAJbWVtc2V0KGl2LCAwLCBzaXplb2YoaXYpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvc2VjdXJpdHkuYyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3NlY3VyaXR5LmMKaW5kZXggYjY2ZmFhZi4uOGM5NDIxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvc2VjdXJpdHkuYworKysgYi9kcml2ZXJzL3VzYi93dXNiY29yZS9zZWN1cml0eS5jCkBAIC0zNzQsMTAgKzM3NCw4IEBACiAJc3RydWN0IHd1c2Jfa2V5ZHZ0X291dCBrZXlkdnRfb3V0OwogCiAJaHMgPSBrY2FsbG9jKDMsIHNpemVvZihoc1swXSksIEdGUF9LRVJORUwpOwotCWlmIChocyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZGV2LCAiY2FuJ3QgYWxsb2NhdGUgaGFuZHNoYWtlIGRhdGFcbiIpOworCWlmICghaHMpCiAJCWdvdG8gZXJyb3Jfa3phbGxvYzsKLQl9CiAKIAkvKiBXZSBuZWVkIHRvIHR1cm4gZW5jcnlwdGlvbiBiZWZvcmUgYmVnaW5uaW5nIHRoZSA0d2F5CiAJICogaHNoYWtlIChXVVNCMS4wWy4zLjIuMl0pICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1uZXAuYyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLW5lcC5jCmluZGV4IDYwYTEwZDIuLmVkNDYyMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLW5lcC5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLW5lcC5jCkBAIC0yNzEsMTYgKzI3MSwxMSBAQAogCWVwZCA9ICZpZmFjZS0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50WzBdLmRlc2M7CiAJd2EtPm5lcF9idWZmZXJfc2l6ZSA9IDEwMjQ7CiAJd2EtPm5lcF9idWZmZXIgPSBrbWFsbG9jKHdhLT5uZXBfYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICh3YS0+bmVwX2J1ZmZlciA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZGV2LAotCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBub3RpZmljYXRpb24ncyByZWFkIGJ1ZmZlclxuIik7CisJaWYgKCF3YS0+bmVwX2J1ZmZlcikKIAkJZ290byBlcnJvcl9uZXBfYnVmZmVyOwotCX0KIAl3YS0+bmVwX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHdhLT5uZXBfdXJiID09IE5VTEwpIHsKLQkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgbm90aWZpY2F0aW9uIFVSQlxuIik7CisJaWYgKHdhLT5uZXBfdXJiID09IE5VTEwpCiAJCWdvdG8gZXJyb3JfdXJiX2FsbG9jOwotCX0KIAl1c2JfZmlsbF9pbnRfdXJiKHdhLT5uZXBfdXJiLCB1c2JfZGV2LAogCQkJIHVzYl9yY3ZpbnRwaXBlKHVzYl9kZXYsIGVwZC0+YkVuZHBvaW50QWRkcmVzcyksCiAJCQkgd2EtPm5lcF9idWZmZXIsIHdhLT5uZXBfYnVmZmVyX3NpemUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS14ZmVyLmMgYi9kcml2ZXJzL3VzYi93dXNiY29yZS93YS14ZmVyLmMKaW5kZXggNjlhZjRmZC4uMTY3ZmNjNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXhmZXIuYworKysgYi9kcml2ZXJzL3VzYi93dXNiY29yZS93YS14ZmVyLmMKQEAgLTI4NjUsMTAgKzI4NjUsOCBAQAogCQlnb3RvIG91dDsKIAogCXdhLT5kdGlfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAod2EtPmR0aV91cmIgPT0gTlVMTCkgewotCQlkZXZfZXJyKGRldiwgIkNhbid0IGFsbG9jYXRlIERUSSBVUkJcbiIpOworCWlmICh3YS0+ZHRpX3VyYiA9PSBOVUxMKQogCQlnb3RvIGVycm9yX2R0aV91cmJfYWxsb2M7Ci0JfQogCXVzYl9maWxsX2J1bGtfdXJiKAogCQl3YS0+ZHRpX3VyYiwgd2EtPnVzYl9kZXYsCiAJCXVzYl9yY3ZidWxrcGlwZSh3YS0+dXNiX2RldiwgMHg4MCB8IGR0aV9lcGQtPmJFbmRwb2ludEFkZHJlc3MpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvaHdhLXJjLmMgYi9kcml2ZXJzL3V3Yi9od2EtcmMuYwppbmRleCAwMjU3ZjM1Li4wYWE2YzNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3V3Yi9od2EtcmMuYworKysgYi9kcml2ZXJzL3V3Yi9od2EtcmMuYwpAQCAtNzAxLDEwICs3MDEsOCBAQAogCQlnb3RvIGVycm9yX3JkX2J1ZmZlcjsKIAl9CiAJaHdhcmMtPm5lZXBfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoaHdhcmMtPm5lZXBfdXJiID09IE5VTEwpIHsKLQkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgbm90aWZpY2F0aW9uIFVSQlxuIik7CisJaWYgKGh3YXJjLT5uZWVwX3VyYiA9PSBOVUxMKQogCQlnb3RvIGVycm9yX3VyYl9hbGxvYzsKLQl9CiAJdXNiX2ZpbGxfaW50X3VyYihod2FyYy0+bmVlcF91cmIsIHVzYl9kZXYsCiAJCQkgdXNiX3JjdmludHBpcGUodXNiX2RldiwgZXBkLT5iRW5kcG9pbnRBZGRyZXNzKSwKIAkJCSBod2FyYy0+cmRfYnVmZmVyLCBQQUdFX1NJWkUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Njc2kuYyBiL2RyaXZlcnMvdmhvc3Qvc2NzaS5jCmluZGV4IDlkNjMyMGUuLjZlMjlkMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmhvc3Qvc2NzaS5jCisrKyBiL2RyaXZlcnMvdmhvc3Qvc2NzaS5jCkBAIC04OCw3ICs4OCw3IEBACiAJc3RydWN0IHNjYXR0ZXJsaXN0ICp0dmNfcHJvdF9zZ2w7CiAJc3RydWN0IHBhZ2UgKip0dmNfdXBhZ2VzOwogCS8qIFBvaW50ZXIgdG8gcmVzcG9uc2UgaGVhZGVyIGlvdmVjICovCi0Jc3RydWN0IGlvdmVjICp0dmNfcmVzcF9pb3Y7CisJc3RydWN0IGlvdmVjIHR2Y19yZXNwX2lvdjsKIAkvKiBQb2ludGVyIHRvIHZob3N0X3Njc2kgZm9yIG91ciBkZXZpY2UgKi8KIAlzdHJ1Y3Qgdmhvc3Rfc2NzaSAqdHZjX3Zob3N0OwogCS8qIFBvaW50ZXIgdG8gdmhvc3RfdmlydHF1ZXVlIGZvciB0aGUgY21kICovCkBAIC01NDcsNyArNTQ3LDcgQEAKIAkJbWVtY3B5KHZfcnNwLnNlbnNlLCBjbWQtPnR2Y19zZW5zZV9idWYsCiAJCSAgICAgICBzZV9jbWQtPnNjc2lfc2Vuc2VfbGVuZ3RoKTsKIAotCQlpb3ZfaXRlcl9pbml0KCZpb3ZfaXRlciwgUkVBRCwgY21kLT50dmNfcmVzcF9pb3YsCisJCWlvdl9pdGVyX2luaXQoJmlvdl9pdGVyLCBSRUFELCAmY21kLT50dmNfcmVzcF9pb3YsCiAJCQkgICAgICBjbWQtPnR2Y19pbl9pb3ZzLCBzaXplb2Yodl9yc3ApKTsKIAkJcmV0ID0gY29weV90b19pdGVyKCZ2X3JzcCwgc2l6ZW9mKHZfcnNwKSwgJmlvdl9pdGVyKTsKIAkJaWYgKGxpa2VseShyZXQgPT0gc2l6ZW9mKHZfcnNwKSkpIHsKQEAgLTEwNDQsNyArMTA0NCw3IEBACiAJCX0KIAkJY21kLT50dmNfdmhvc3QgPSB2czsKIAkJY21kLT50dmNfdnEgPSB2cTsKLQkJY21kLT50dmNfcmVzcF9pb3YgPSAmdnEtPmlvdltvdXRdOworCQljbWQtPnR2Y19yZXNwX2lvdiA9IHZxLT5pb3Zbb3V0XTsKIAkJY21kLT50dmNfaW5faW92cyA9IGluOwogCiAJCXByX2RlYnVnKCJ2aG9zdF9zY3NpIGdvdCBjb21tYW5kIG9wY29kZTogJSMwMngsIGx1bjogJWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Rlc3QuYyBiL2RyaXZlcnMvdmhvc3QvdGVzdC5jCmluZGV4IDM4OGVlYzQuLjNjYzk4YzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmhvc3QvdGVzdC5jCisrKyBiL2RyaXZlcnMvdmhvc3QvdGVzdC5jCkBAIC0yMjAsMjAgKzIyMCwyMCBAQAogewogCXZvaWQgKnByaXYgPSBOVUxMOwogCWxvbmcgZXJyOwotCXN0cnVjdCB2aG9zdF9tZW1vcnkgKm1lbW9yeTsKKwlzdHJ1Y3Qgdmhvc3RfdW1lbSAqdW1lbTsKIAogCW11dGV4X2xvY2soJm4tPmRldi5tdXRleCk7CiAJZXJyID0gdmhvc3RfZGV2X2NoZWNrX293bmVyKCZuLT5kZXYpOwogCWlmIChlcnIpCiAJCWdvdG8gZG9uZTsKLQltZW1vcnkgPSB2aG9zdF9kZXZfcmVzZXRfb3duZXJfcHJlcGFyZSgpOwotCWlmICghbWVtb3J5KSB7CisJdW1lbSA9IHZob3N0X2Rldl9yZXNldF9vd25lcl9wcmVwYXJlKCk7CisJaWYgKCF1bWVtKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZG9uZTsKIAl9CiAJdmhvc3RfdGVzdF9zdG9wKG4sICZwcml2KTsKIAl2aG9zdF90ZXN0X2ZsdXNoKG4pOwotCXZob3N0X2Rldl9yZXNldF9vd25lcigmbi0+ZGV2LCBtZW1vcnkpOworCXZob3N0X2Rldl9yZXNldF9vd25lcigmbi0+ZGV2LCB1bWVtKTsKIGRvbmU6CiAJbXV0ZXhfdW5sb2NrKCZuLT5kZXYubXV0ZXgpOwogCXJldHVybiBlcnI7CkBAIC0zMjIsMTggKzMyMiw3IEBACiAJInZob3N0LXRlc3QiLAogCSZ2aG9zdF90ZXN0X2ZvcHMsCiB9OwotCi1zdGF0aWMgaW50IHZob3N0X3Rlc3RfaW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZ2aG9zdF90ZXN0X21pc2MpOwotfQotbW9kdWxlX2luaXQodmhvc3RfdGVzdF9pbml0KTsKLQotc3RhdGljIHZvaWQgdmhvc3RfdGVzdF9leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZ2aG9zdF90ZXN0X21pc2MpOwotfQotbW9kdWxlX2V4aXQodmhvc3RfdGVzdF9leGl0KTsKK21vZHVsZV9taXNjX2RldmljZSh2aG9zdF90ZXN0X21pc2MpOwogCiBNT0RVTEVfVkVSU0lPTigiMC4wLjEiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19yaW5nLmMgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcmluZy5jCmluZGV4IGUzODNlY2QuLmVkOWM5ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19yaW5nLmMKKysrIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX3JpbmcuYwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAgKiBtYWtpbmcgYWxsIG9mIHRoZSBhcmNoIERNQSBvcHMgd29yayBvbiB0aGUgdnJpbmcgZGV2aWNlIGl0c2VsZgogICogaXMgYSBtZXNzLiAgRm9yIG5vdywgd2UgdXNlIHRoZSBwYXJlbnQgZGV2aWNlIGZvciBETUEgb3BzLgogICovCi1zdHJ1Y3QgZGV2aWNlICp2cmluZ19kbWFfZGV2KGNvbnN0IHN0cnVjdCB2cmluZ192aXJ0cXVldWUgKnZxKQorc3RhdGljIHN0cnVjdCBkZXZpY2UgKnZyaW5nX2RtYV9kZXYoY29uc3Qgc3RydWN0IHZyaW5nX3ZpcnRxdWV1ZSAqdnEpCiB7CiAJcmV0dXJuIHZxLT52cS52ZGV2LT5kZXYucGFyZW50OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92bWUvYnJpZGdlcy9LY29uZmlnIGIvZHJpdmVycy92bWUvYnJpZGdlcy9LY29uZmlnCmluZGV4IGY2ZDg1NDUuLmY2ZGRjMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdm1lL2JyaWRnZXMvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL0tjb25maWcKQEAgLTEzLDMgKzEzLDExIEBACiAJaGVscAogCSBJZiB5b3Ugc2F5IFkgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBUdW5kcmEgVFNJMTQ4IFZNRSBicmlkZ2UKIAkgY2hpcC4KKworY29uZmlnIFZNRV9GQUtFCisJdHJpc3RhdGUgIkZha2UiCisJaGVscAorCSBJZiB5b3Ugc2F5IFkgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBmYWtlIFZNRSBicmlkZ2UuIFRoaXMKKwkgcHJvdmlkZXMgYSB2aXJ0dWFsaXNlZCBWTUUgQnVzIGZvciBkZXZpY2VzIHdpdGggbm8gVk1FIGJyaWRnZS4gVGhpcworCSBpcyBtYWlubHkgdXNlZnVsIGZvciBWTUUgZGV2ZWxvcG1lbnQgKGluIHRoZSBhYnNlbmNlIG9mIFZNRQorCSBoYXJkd2FyZSkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZtZS9icmlkZ2VzL01ha2VmaWxlIGIvZHJpdmVycy92bWUvYnJpZGdlcy9NYWtlZmlsZQppbmRleCA1OTYzOGFmLi5iMDc0NTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZtZS9icmlkZ2VzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdm1lL2JyaWRnZXMvTWFrZWZpbGUKQEAgLTEsMiArMSwzIEBACiBvYmotJChDT05GSUdfVk1FX0NBOTFDWDQyKQkrPSB2bWVfY2E5MWN4NDIubwogb2JqLSQoQ09ORklHX1ZNRV9UU0kxNDgpCSs9IHZtZV90c2kxNDgubworb2JqLSQoQ09ORklHX1ZNRV9GQUtFKQkJKz0gdm1lX2Zha2UubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYyBiL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmMKaW5kZXggOWYyYzgzNC4uNmI1ZWU4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYworKysgYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5jCkBAIC00Nyw2ICs0Nyw4IEBACiAJeyB9LAogfTsKIAorTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGNhOTFjeDQyX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjYTkxY3g0Ml9kcml2ZXIgPSB7CiAJLm5hbWUgPSBkcml2ZXJfbmFtZSwKIAkuaWRfdGFibGUgPSBjYTkxY3g0Ml9pZHMsCkBAIC02OSw3ICs3MSw3IEBACiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQlpZiAoc3RhdCAmIENBOTFDWDQyX0xJTlRfTE1baV0pIHsKIAkJCS8qIFdlIG9ubHkgZW5hYmxlIGludGVycnVwdHMgaWYgdGhlIGNhbGxiYWNrIGlzIHNldCAqLwotCQkJYnJpZGdlLT5sbV9jYWxsYmFja1tpXShpKTsKKwkJCWJyaWRnZS0+bG1fY2FsbGJhY2tbaV0oYnJpZGdlLT5sbV9kYXRhW2ldKTsKIAkJCXNlcnZpY2VkIHw9IENBOTFDWDQyX0xJTlRfTE1baV07CiAJCX0KIAl9CkBAIC0xNDEwLDcgKzE0MTIsNyBAQAogICogQ2FsbGJhY2sgd2lsbCBiZSBwYXNzZWQgdGhlIG1vbml0b3IgdHJpZ2dlcmVkLgogICovCiBzdGF0aWMgaW50IGNhOTFjeDQyX2xtX2F0dGFjaChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgaW50IG1vbml0b3IsCi0Jdm9pZCAoKmNhbGxiYWNrKShpbnQpKQorCXZvaWQgKCpjYWxsYmFjaykodm9pZCAqKSwgdm9pZCAqZGF0YSkKIHsKIAl1MzIgbG1fY3RsLCB0bXA7CiAJc3RydWN0IGNhOTFjeDQyX2RyaXZlciAqYnJpZGdlOwpAQCAtMTQzOCw2ICsxNDQwLDcgQEAKIAogCS8qIEF0dGFjaCBjYWxsYmFjayAqLwogCWJyaWRnZS0+bG1fY2FsbGJhY2tbbW9uaXRvcl0gPSBjYWxsYmFjazsKKwlicmlkZ2UtPmxtX2RhdGFbbW9uaXRvcl0gPSBkYXRhOwogCiAJLyogRW5hYmxlIExvY2F0aW9uIE1vbml0b3IgaW50ZXJydXB0ICovCiAJdG1wID0gaW9yZWFkMzIoYnJpZGdlLT5iYXNlICsgTElOVF9FTik7CkBAIC0xNDc3LDYgKzE0ODAsNyBAQAogCiAJLyogRGV0YWNoIGNhbGxiYWNrICovCiAJYnJpZGdlLT5sbV9jYWxsYmFja1ttb25pdG9yXSA9IE5VTEw7CisJYnJpZGdlLT5sbV9kYXRhW21vbml0b3JdID0gTlVMTDsKIAogCS8qIElmIGFsbCBsb2NhdGlvbiBtb25pdG9ycyBkaXNhYmxlZCwgZGlzYWJsZSBnbG9iYWwgTG9jYXRpb24gTW9uaXRvciAqLwogCWlmICgodG1wICYgKENBOTFDWDQyX0xJTlRfTE0wIHwgQ0E5MUNYNDJfTElOVF9MTTEgfCBDQTkxQ1g0Ml9MSU5UX0xNMiB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5oIGIvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuaAppbmRleCBkNTQxMTllLi5mMzVjOWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5oCisrKyBiL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmgKQEAgLTQzLDcgKzQzLDggQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdCBkbWFfcXVldWU7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgaWFja19xdWV1ZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBtYm94X3F1ZXVlOwotCXZvaWQgKCpsbV9jYWxsYmFja1s0XSkoaW50KTsJLyogQ2FsbGVkIGluIGludGVycnVwdCBoYW5kbGVyICovCisJdm9pZCAoKmxtX2NhbGxiYWNrWzRdKSh2b2lkICopOwkvKiBDYWxsZWQgaW4gaW50ZXJydXB0IGhhbmRsZXIgKi8KKwl2b2lkICpsbV9kYXRhWzRdOwogCXZvaWQgKmNyY3NyX2tlcm5lbDsKIAlkbWFfYWRkcl90IGNyY3NyX2J1czsKIAlzdHJ1Y3QgbXV0ZXggdm1lX3JtdzsJCS8qIE9ubHkgb25lIFJNVyBjeWNsZSBhdCBhIHRpbWUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX2Zha2UuYyBiL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX2Zha2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGIzYWNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfZmFrZS5jCkBAIC0wLDAgKzEsMTMwNiBAQAorLyoKKyAqIEZha2UgVk1FIGJyaWRnZSBzdXBwb3J0LgorICoKKyAqIFRoaXMgZHJpdmUgcHJvdmlkZXMgYSBmYWtlIFZNRSBicmlkZ2UgY2hpcCwgdGhpcyBlbmFibGVzIGRlYnVnZ2luZyBvZiB0aGUKKyAqIFZNRSBmcmFtZXdvcmsgaW4gdGhlIGFic2VuY2Ugb2YgYSBWTUUgc3lzdGVtLgorICoKKyAqIFRoaXMgZHJpdmVyIGhhcyB0byBkbyBhIG51bWJlciBvZiB0aGluZ3MgaW4gc29mdHdhcmUgdGhhdCB3b3VsZCBiZSBkcml2ZW4KKyAqIGJ5IGhhcmR3YXJlIGlmIGl0IHdhcyBhdmFpbGFibGUsIGl0IHdpbGwgYWxzbyByZXN1bHQgaW4gZXh0cmEgb3ZlcmhlYWQgYXQKKyAqIHRpbWVzIHdoZW4gY29tcGFyZWQgd2l0aCBkcml2aW5nIGFjdHVhbCBoYXJkd2FyZS4KKyAqCisgKiBBdXRob3I6IE1hcnR5biBXZWxjaCA8bWFydHluQHdlbGNoZXMubWUudWs+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgTWFydHluIFdlbGNoCisgKgorICogQmFzZWQgb24gdm1lX3RzaTE0OC5jOgorICoKKyAqIEF1dGhvcjogTWFydHluIFdlbGNoIDxtYXJ0eW4ud2VsY2hAZ2UuY29tPgorICogQ29weXJpZ2h0IDIwMDggR0UgSW50ZWxsaWdlbnQgUGxhdGZvcm1zIEVtYmVkZGVkIFN5c3RlbXMsIEluYy4KKyAqCisgKiBCYXNlZCBvbiB3b3JrIGJ5IFRvbSBBcm1pc3RlYWQgYW5kIEFqaXQgUHJlbQorICogQ29weXJpZ2h0IDIwMDQgTW90b3JvbGEgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtZS5oPgorCisjaW5jbHVkZSAiLi4vdm1lX2JyaWRnZS5oIgorCisvKgorICogIERlZmluZSB0aGUgbnVtYmVyIG9mIGVhY2ggdGhhdCB0aGUgZmFrZSBkcml2ZXIgc3VwcG9ydHMuCisgKi8KKyNkZWZpbmUgRkFLRV9NQVhfTUFTVEVSCQk4CS8qIE1heCBNYXN0ZXIgV2luZG93cyAqLworI2RlZmluZSBGQUtFX01BWF9TTEFWRQkJOAkvKiBNYXggU2xhdmUgV2luZG93cyAqLworCisvKiBTdHJ1Y3R1cmVzIHRvIGhvbGQgaW5mb3JtYXRpb24gbm9ybWFsbHkgaGVsZCBpbiBkZXZpY2UgcmVnaXN0ZXJzICovCitzdHJ1Y3QgZmFrZV9zbGF2ZV93aW5kb3cgeworCWludCBlbmFibGVkOworCXVuc2lnbmVkIGxvbmcgbG9uZyB2bWVfYmFzZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZTsKKwl2b2lkICpidWZfYmFzZTsKKwl1MzIgYXNwYWNlOworCXUzMiBjeWNsZTsKK307CisKK3N0cnVjdCBmYWtlX21hc3Rlcl93aW5kb3cgeworCWludCBlbmFibGVkOworCXVuc2lnbmVkIGxvbmcgbG9uZyB2bWVfYmFzZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZTsKKwl1MzIgYXNwYWNlOworCXUzMiBjeWNsZTsKKwl1MzIgZHdpZHRoOworfTsKKworLyogU3RydWN0dXJlIHVzZWQgdG8gaG9sZCBkcml2ZXIgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBmYWtlX2RyaXZlciB7CisJc3RydWN0IHZtZV9icmlkZ2UgKnBhcmVudDsKKwlzdHJ1Y3QgZmFrZV9zbGF2ZV93aW5kb3cgc2xhdmVzW0ZBS0VfTUFYX1NMQVZFXTsKKwlzdHJ1Y3QgZmFrZV9tYXN0ZXJfd2luZG93IG1hc3RlcnNbRkFLRV9NQVhfTUFTVEVSXTsKKwl1MzIgbG1fZW5hYmxlZDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbG1fYmFzZTsKKwl1MzIgbG1fYXNwYWNlOworCXUzMiBsbV9jeWNsZTsKKwl2b2lkICgqbG1fY2FsbGJhY2tbNF0pKHZvaWQgKik7CisJdm9pZCAqbG1fZGF0YVs0XTsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaW50X3Rhc2tsZXQ7CisJaW50IGludF9sZXZlbDsKKwlpbnQgaW50X3N0YXRpZDsKKwl2b2lkICpjcmNzcl9rZXJuZWw7CisJZG1hX2FkZHJfdCBjcmNzcl9idXM7CisJLyogT25seSBvbmUgVk1FIGludGVycnVwdCBjYW4gYmUgZ2VuZXJhdGVkIGF0IGEgdGltZSwgcHJvdmlkZSBsb2NraW5nICovCisJc3RydWN0IG11dGV4IHZtZV9pbnQ7Cit9OworCisvKiBNb2R1bGUgcGFyYW1ldGVyICovCitzdGF0aWMgaW50IGdlb2lkOworCitzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfbmFtZVtdID0gInZtZV9mYWtlIjsKKworc3RhdGljIHN0cnVjdCB2bWVfYnJpZGdlICpleGl0X3BvaW50ZXI7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICp2bWVfcm9vdDsKKworLyoKKyAqIENhbGxpbmcgVk1FIGJ1cyBpbnRlcnJ1cHQgY2FsbGJhY2sgaWYgcHJvdmlkZWQuCisgKi8KK3N0YXRpYyB2b2lkIGZha2VfVklSUV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgdm1lX2JyaWRnZSAqZmFrZV9icmlkZ2U7CisJc3RydWN0IGZha2VfZHJpdmVyICpicmlkZ2U7CisKKwlmYWtlX2JyaWRnZSA9IChzdHJ1Y3Qgdm1lX2JyaWRnZSAqKSBkYXRhOworCWJyaWRnZSA9IGZha2VfYnJpZGdlLT5kcml2ZXJfcHJpdjsKKworCXZtZV9pcnFfaGFuZGxlcihmYWtlX2JyaWRnZSwgYnJpZGdlLT5pbnRfbGV2ZWwsIGJyaWRnZS0+aW50X3N0YXRpZCk7Cit9CisKKy8qCisgKiBDb25maWd1cmUgVk1FIGludGVycnVwdAorICovCitzdGF0aWMgdm9pZCBmYWtlX2lycV9zZXQoc3RydWN0IHZtZV9icmlkZ2UgKmZha2VfYnJpZGdlLCBpbnQgbGV2ZWwsCisJCWludCBzdGF0ZSwgaW50IHN5bmMpCit7CisJLyogTm90aGluZyB0byBkbyAqLworfQorCitzdGF0aWMgdm9pZCAqZmFrZV9wY2lfdG9fcHRyKGRtYV9hZGRyX3QgYWRkcikKK3sKKwlyZXR1cm4gKHZvaWQgKikodWludHB0cl90KWFkZHI7Cit9CisKK3N0YXRpYyBkbWFfYWRkcl90IGZha2VfcHRyX3RvX3BjaSh2b2lkICphZGRyKQoreworCXJldHVybiAoZG1hX2FkZHJfdCkodWludHB0cl90KWFkZHI7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBhIFZNRSBidXMgaW50ZXJydXB0IGF0IHRoZSByZXF1ZXN0ZWQgbGV2ZWwgJiB2ZWN0b3IuIFdhaXQgZm9yCisgKiBpbnRlcnJ1cHQgdG8gYmUgYWNrZWQuCisgKi8KK3N0YXRpYyBpbnQgZmFrZV9pcnFfZ2VuZXJhdGUoc3RydWN0IHZtZV9icmlkZ2UgKmZha2VfYnJpZGdlLCBpbnQgbGV2ZWwsCisJCWludCBzdGF0aWQpCit7CisJc3RydWN0IGZha2VfZHJpdmVyICpicmlkZ2U7CisKKwlicmlkZ2UgPSBmYWtlX2JyaWRnZS0+ZHJpdmVyX3ByaXY7CisKKwltdXRleF9sb2NrKCZicmlkZ2UtPnZtZV9pbnQpOworCisJYnJpZGdlLT5pbnRfbGV2ZWwgPSBsZXZlbDsKKworCWJyaWRnZS0+aW50X3N0YXRpZCA9IHN0YXRpZDsKKworCS8qCisJICogU2NoZWR1bGUgdGFza2xldCB0byBydW4gVk1FIGhhbmRsZXIgdG8gZW11bGF0ZSBub3JtYWwgVk1FIGludGVycnVwdAorCSAqIGhhbmRsZXIgYmVoYXZpb3VyLgorCSAqLworCXRhc2tsZXRfc2NoZWR1bGUoJmJyaWRnZS0+aW50X3Rhc2tsZXQpOworCisJbXV0ZXhfdW5sb2NrKCZicmlkZ2UtPnZtZV9pbnQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGEgc2xhdmUgd2luZG93IHdpdGggdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzLgorICovCitzdGF0aWMgaW50IGZha2Vfc2xhdmVfc2V0KHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UgKmltYWdlLCBpbnQgZW5hYmxlZCwKKwkJdW5zaWduZWQgbG9uZyBsb25nIHZtZV9iYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSwKKwkJZG1hX2FkZHJfdCBidWZfYmFzZSwgdTMyIGFzcGFjZSwgdTMyIGN5Y2xlKQoreworCXVuc2lnbmVkIGludCBpLCBncmFudWxhcml0eSA9IDA7CisJdW5zaWduZWQgbG9uZyBsb25nIHZtZV9ib3VuZDsKKwlzdHJ1Y3Qgdm1lX2JyaWRnZSAqZmFrZV9icmlkZ2U7CisJc3RydWN0IGZha2VfZHJpdmVyICpicmlkZ2U7CisKKwlmYWtlX2JyaWRnZSA9IGltYWdlLT5wYXJlbnQ7CisJYnJpZGdlID0gZmFrZV9icmlkZ2UtPmRyaXZlcl9wcml2OworCisJaSA9IGltYWdlLT5udW1iZXI7CisKKwlzd2l0Y2ggKGFzcGFjZSkgeworCWNhc2UgVk1FX0ExNjoKKwkJZ3JhbnVsYXJpdHkgPSAweDEwOworCQlicmVhazsKKwljYXNlIFZNRV9BMjQ6CisJCWdyYW51bGFyaXR5ID0gMHgxMDAwOworCQlicmVhazsKKwljYXNlIFZNRV9BMzI6CisJCWdyYW51bGFyaXR5ID0gMHgxMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBWTUVfQTY0OgorCQlncmFudWxhcml0eSA9IDB4MTAwMDA7CisJCWJyZWFrOworCWNhc2UgVk1FX0NSQ1NSOgorCWNhc2UgVk1FX1VTRVIxOgorCWNhc2UgVk1FX1VTRVIyOgorCWNhc2UgVk1FX1VTRVIzOgorCWNhc2UgVk1FX1VTRVI0OgorCWRlZmF1bHQ6CisJCXByX2VycigiSW52YWxpZCBhZGRyZXNzIHNwYWNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBCb3VuZCBhZGRyZXNzIGlzIGEgdmFsaWQgYWRkcmVzcyBmb3IgdGhlIHdpbmRvdywgYWRqdXN0CisJICogYWNjb3JkaW5nbHkKKwkgKi8KKwl2bWVfYm91bmQgPSB2bWVfYmFzZSArIHNpemUgLSBncmFudWxhcml0eTsKKworCWlmICh2bWVfYmFzZSAmIChncmFudWxhcml0eSAtIDEpKSB7CisJCXByX2VycigiSW52YWxpZCBWTUUgYmFzZSBhbGlnbm1lbnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHZtZV9ib3VuZCAmIChncmFudWxhcml0eSAtIDEpKSB7CisJCXByX2VycigiSW52YWxpZCBWTUUgYm91bmQgYWxpZ25tZW50XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmaW1hZ2UtPm10eCk7CisKKwlicmlkZ2UtPnNsYXZlc1tpXS5lbmFibGVkID0gZW5hYmxlZDsKKwlicmlkZ2UtPnNsYXZlc1tpXS52bWVfYmFzZSA9IHZtZV9iYXNlOworCWJyaWRnZS0+c2xhdmVzW2ldLnNpemUgPSBzaXplOworCWJyaWRnZS0+c2xhdmVzW2ldLmJ1Zl9iYXNlID0gZmFrZV9wY2lfdG9fcHRyKGJ1Zl9iYXNlKTsKKwlicmlkZ2UtPnNsYXZlc1tpXS5hc3BhY2UgPSBhc3BhY2U7CisJYnJpZGdlLT5zbGF2ZXNbaV0uY3ljbGUgPSBjeWNsZTsKKworCW11dGV4X3VubG9jaygmaW1hZ2UtPm10eCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdldCBzbGF2ZSB3aW5kb3cgY29uZmlndXJhdGlvbi4KKyAqLworc3RhdGljIGludCBmYWtlX3NsYXZlX2dldChzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICppbWFnZSwgaW50ICplbmFibGVkLAorCQl1bnNpZ25lZCBsb25nIGxvbmcgKnZtZV9iYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgKnNpemUsCisJCWRtYV9hZGRyX3QgKmJ1Zl9iYXNlLCB1MzIgKmFzcGFjZSwgdTMyICpjeWNsZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZTsKKworCWJyaWRnZSA9IGltYWdlLT5wYXJlbnQtPmRyaXZlcl9wcml2OworCisJaSA9IGltYWdlLT5udW1iZXI7CisKKwltdXRleF9sb2NrKCZpbWFnZS0+bXR4KTsKKworCSplbmFibGVkID0gYnJpZGdlLT5zbGF2ZXNbaV0uZW5hYmxlZDsKKwkqdm1lX2Jhc2UgPSBicmlkZ2UtPnNsYXZlc1tpXS52bWVfYmFzZTsKKwkqc2l6ZSA9IGJyaWRnZS0+c2xhdmVzW2ldLnNpemU7CisJKmJ1Zl9iYXNlID0gZmFrZV9wdHJfdG9fcGNpKGJyaWRnZS0+c2xhdmVzW2ldLmJ1Zl9iYXNlKTsKKwkqYXNwYWNlID0gYnJpZGdlLT5zbGF2ZXNbaV0uYXNwYWNlOworCSpjeWNsZSA9IGJyaWRnZS0+c2xhdmVzW2ldLmN5Y2xlOworCisJbXV0ZXhfdW5sb2NrKCZpbWFnZS0+bXR4KTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2V0IHRoZSBhdHRyaWJ1dGVzIG9mIGFuIG91dGJvdW5kIHdpbmRvdy4KKyAqLworc3RhdGljIGludCBmYWtlX21hc3Rlcl9zZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCBpbnQgZW5hYmxlZCwKKwkJdW5zaWduZWQgbG9uZyBsb25nIHZtZV9iYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSwKKwkJdTMyIGFzcGFjZSwgdTMyIGN5Y2xlLCB1MzIgZHdpZHRoKQoreworCWludCByZXR2YWwgPSAwOworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCB2bWVfYnJpZGdlICpmYWtlX2JyaWRnZTsKKwlzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZTsKKworCWZha2VfYnJpZGdlID0gaW1hZ2UtPnBhcmVudDsKKworCWJyaWRnZSA9IGZha2VfYnJpZGdlLT5kcml2ZXJfcHJpdjsKKworCS8qIFZlcmlmeSBpbnB1dCBkYXRhICovCisJaWYgKHZtZV9iYXNlICYgMHhGRkZGKSB7CisJCXByX2VycigiSW52YWxpZCBWTUUgV2luZG93IGFsaWdubWVudFxuIik7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3dpbmRvdzsKKwl9CisKKwlpZiAoc2l6ZSAmIDB4RkZGRikgeworCQlwcl9lcnIoIkludmFsaWQgc2l6ZSBhbGlnbm1lbnRcbiIpOworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGVycl93aW5kb3c7CisJfQorCisJaWYgKChzaXplID09IDApICYmIChlbmFibGVkICE9IDApKSB7CisJCXByX2VycigiU2l6ZSBtdXN0IGJlIG5vbi16ZXJvIGZvciBlbmFibGVkIHdpbmRvd3NcbiIpOworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGVycl93aW5kb3c7CisJfQorCisJLyogU2V0dXAgZGF0YSB3aWR0aCAqLworCXN3aXRjaCAoZHdpZHRoKSB7CisJY2FzZSBWTUVfRDg6CisJY2FzZSBWTUVfRDE2OgorCWNhc2UgVk1FX0QzMjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCJJbnZhbGlkIGRhdGEgd2lkdGhcbiIpOworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGVycl9kd2lkdGg7CisJfQorCisJLyogU2V0dXAgYWRkcmVzcyBzcGFjZSAqLworCXN3aXRjaCAoYXNwYWNlKSB7CisJY2FzZSBWTUVfQTE2OgorCWNhc2UgVk1FX0EyNDoKKwljYXNlIFZNRV9BMzI6CisJY2FzZSBWTUVfQTY0OgorCWNhc2UgVk1FX0NSQ1NSOgorCWNhc2UgVk1FX1VTRVIxOgorCWNhc2UgVk1FX1VTRVIyOgorCWNhc2UgVk1FX1VTRVIzOgorCWNhc2UgVk1FX1VTRVI0OgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIkludmFsaWQgYWRkcmVzcyBzcGFjZVxuIik7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2FzcGFjZTsKKwl9CisKKwlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKKworCWkgPSBpbWFnZS0+bnVtYmVyOworCisJYnJpZGdlLT5tYXN0ZXJzW2ldLmVuYWJsZWQgPSBlbmFibGVkOworCWJyaWRnZS0+bWFzdGVyc1tpXS52bWVfYmFzZSA9IHZtZV9iYXNlOworCWJyaWRnZS0+bWFzdGVyc1tpXS5zaXplID0gc2l6ZTsKKwlicmlkZ2UtPm1hc3RlcnNbaV0uYXNwYWNlID0gYXNwYWNlOworCWJyaWRnZS0+bWFzdGVyc1tpXS5jeWNsZSA9IGN5Y2xlOworCWJyaWRnZS0+bWFzdGVyc1tpXS5kd2lkdGggPSBkd2lkdGg7CisKKwlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOworCisJcmV0dXJuIDA7CisKK2Vycl9hc3BhY2U6CitlcnJfZHdpZHRoOgorZXJyX3dpbmRvdzoKKwlyZXR1cm4gcmV0dmFsOworCit9CisKKy8qCisgKiBTZXQgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gb3V0Ym91bmQgd2luZG93LgorICovCitzdGF0aWMgaW50IF9fZmFrZV9tYXN0ZXJfZ2V0KHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgaW50ICplbmFibGVkLAorCQl1bnNpZ25lZCBsb25nIGxvbmcgKnZtZV9iYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgKnNpemUsCisJCXUzMiAqYXNwYWNlLCB1MzIgKmN5Y2xlLCB1MzIgKmR3aWR0aCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZTsKKworCWJyaWRnZSA9IGltYWdlLT5wYXJlbnQtPmRyaXZlcl9wcml2OworCisJaSA9IGltYWdlLT5udW1iZXI7CisKKwkqZW5hYmxlZCA9IGJyaWRnZS0+bWFzdGVyc1tpXS5lbmFibGVkOworCSp2bWVfYmFzZSA9IGJyaWRnZS0+bWFzdGVyc1tpXS52bWVfYmFzZTsKKwkqc2l6ZSA9IGJyaWRnZS0+bWFzdGVyc1tpXS5zaXplOworCSphc3BhY2UgPSBicmlkZ2UtPm1hc3RlcnNbaV0uYXNwYWNlOworCSpjeWNsZSA9IGJyaWRnZS0+bWFzdGVyc1tpXS5jeWNsZTsKKwkqZHdpZHRoID0gYnJpZGdlLT5tYXN0ZXJzW2ldLmR3aWR0aDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZmFrZV9tYXN0ZXJfZ2V0KHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgaW50ICplbmFibGVkLAorCQl1bnNpZ25lZCBsb25nIGxvbmcgKnZtZV9iYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgKnNpemUsCisJCXUzMiAqYXNwYWNlLCB1MzIgKmN5Y2xlLCB1MzIgKmR3aWR0aCkKK3sKKwlpbnQgcmV0dmFsOworCisJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CisKKwlyZXR2YWwgPSBfX2Zha2VfbWFzdGVyX2dldChpbWFnZSwgZW5hYmxlZCwgdm1lX2Jhc2UsIHNpemUsIGFzcGFjZSwKKwkJCWN5Y2xlLCBkd2lkdGgpOworCisJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIHZvaWQgZmFrZV9sbV9jaGVjayhzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZSwgdW5zaWduZWQgbG9uZyBsb25nIGFkZHIsCisJCQkgIHUzMiBhc3BhY2UsIHUzMiBjeWNsZSkKK3sKKwlzdHJ1Y3Qgdm1lX2JyaWRnZSAqZmFrZV9icmlkZ2U7CisJdW5zaWduZWQgbG9uZyBsb25nIGxtX2Jhc2U7CisJdTMyIGxtX2FzcGFjZSwgbG1fY3ljbGU7CisJaW50IGk7CisJc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG07CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zID0gTlVMTCwgKm47CisKKwkvKiBHZXQgdm1lX2JyaWRnZSAqLworCWZha2VfYnJpZGdlID0gYnJpZGdlLT5wYXJlbnQ7CisKKwkvKiBMb29wIHRocm91Z2ggZWFjaCBsb2NhdGlvbiBtb25pdG9yIHJlc291cmNlICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbiwgJmZha2VfYnJpZGdlLT5sbV9yZXNvdXJjZXMpIHsKKwkJbG0gPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9sbV9yZXNvdXJjZSwgbGlzdCk7CisKKwkJLyogSWYgZGlzYWJsZWQsIHdlJ3JlIGRvbmUgKi8KKwkJaWYgKGJyaWRnZS0+bG1fZW5hYmxlZCA9PSAwKQorCQkJcmV0dXJuOworCisJCWxtX2Jhc2UgPSBicmlkZ2UtPmxtX2Jhc2U7CisJCWxtX2FzcGFjZSA9IGJyaWRnZS0+bG1fYXNwYWNlOworCQlsbV9jeWNsZSA9IGJyaWRnZS0+bG1fY3ljbGU7CisKKwkJLyogRmlyc3QgbWFrZSBzdXJlIHRoYXQgdGhlIGN5Y2xlIGFuZCBhZGRyZXNzIHNwYWNlIG1hdGNoICovCisJCWlmICgobG1fYXNwYWNlID09IGFzcGFjZSkgJiYgKGxtX2N5Y2xlID09IGN5Y2xlKSkgeworCQkJZm9yIChpID0gMDsgaSA8IGxtLT5tb25pdG9yczsgaSsrKSB7CisJCQkJLyogRWFjaCBsb2NhdGlvbiBtb25pdG9yIGNvdmVycyA4IGJ5dGVzICovCisJCQkJaWYgKCgobG1fYmFzZSArICg4ICogaSkpIDw9IGFkZHIpICYmCisJCQkJICAgICgobG1fYmFzZSArICg4ICogaSkgKyA4KSA+IGFkZHIpKSB7CisJCQkJCWlmIChicmlkZ2UtPmxtX2NhbGxiYWNrW2ldICE9IE5VTEwpCisJCQkJCQlicmlkZ2UtPmxtX2NhbGxiYWNrW2ldKAorCQkJCQkJCWJyaWRnZS0+bG1fZGF0YVtpXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdTggZmFrZV92bWVyZWFkOChzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZSwgdW5zaWduZWQgbG9uZyBsb25nIGFkZHIsCisJCXUzMiBhc3BhY2UsIHUzMiBjeWNsZSkKK3sKKwl1OCByZXR2YWwgPSAweGZmOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCwgZW5kLCBvZmZzZXQ7CisJdTggKmxvYzsKKworCWZvciAoaSA9IDA7IGkgPCBGQUtFX01BWF9TTEFWRTsgaSsrKSB7CisJCXN0YXJ0ID0gYnJpZGdlLT5zbGF2ZXNbaV0udm1lX2Jhc2U7CisJCWVuZCA9IGJyaWRnZS0+c2xhdmVzW2ldLnZtZV9iYXNlICsgYnJpZGdlLT5zbGF2ZXNbaV0uc2l6ZTsKKworCQlpZiAoYXNwYWNlICE9IGJyaWRnZS0+c2xhdmVzW2ldLmFzcGFjZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjeWNsZSAhPSBicmlkZ2UtPnNsYXZlc1tpXS5jeWNsZSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgoYWRkciA+PSBzdGFydCkgJiYgKGFkZHIgPCBlbmQpKSB7CisJCQlvZmZzZXQgPSBhZGRyIC0gYnJpZGdlLT5zbGF2ZXNbaV0udm1lX2Jhc2U7CisJCQlsb2MgPSAodTggKikoYnJpZGdlLT5zbGF2ZXNbaV0uYnVmX2Jhc2UgKyBvZmZzZXQpOworCQkJcmV0dmFsID0gKmxvYzsKKworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmYWtlX2xtX2NoZWNrKGJyaWRnZSwgYWRkciwgYXNwYWNlLCBjeWNsZSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdTE2IGZha2Vfdm1lcmVhZDE2KHN0cnVjdCBmYWtlX2RyaXZlciAqYnJpZGdlLCB1bnNpZ25lZCBsb25nIGxvbmcgYWRkciwKKwkJdTMyIGFzcGFjZSwgdTMyIGN5Y2xlKQoreworCXUxNiByZXR2YWwgPSAweGZmZmY7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0LCBlbmQsIG9mZnNldDsKKwl1MTYgKmxvYzsKKworCWZvciAoaSA9IDA7IGkgPCBGQUtFX01BWF9TTEFWRTsgaSsrKSB7CisJCWlmIChhc3BhY2UgIT0gYnJpZGdlLT5zbGF2ZXNbaV0uYXNwYWNlKQorCQkJY29udGludWU7CisKKwkJaWYgKGN5Y2xlICE9IGJyaWRnZS0+c2xhdmVzW2ldLmN5Y2xlKQorCQkJY29udGludWU7CisKKwkJc3RhcnQgPSBicmlkZ2UtPnNsYXZlc1tpXS52bWVfYmFzZTsKKwkJZW5kID0gYnJpZGdlLT5zbGF2ZXNbaV0udm1lX2Jhc2UgKyBicmlkZ2UtPnNsYXZlc1tpXS5zaXplOworCisJCWlmICgoYWRkciA+PSBzdGFydCkgJiYgKChhZGRyICsgMSkgPCBlbmQpKSB7CisJCQlvZmZzZXQgPSBhZGRyIC0gYnJpZGdlLT5zbGF2ZXNbaV0udm1lX2Jhc2U7CisJCQlsb2MgPSAodTE2ICopKGJyaWRnZS0+c2xhdmVzW2ldLmJ1Zl9iYXNlICsgb2Zmc2V0KTsKKwkJCXJldHZhbCA9ICpsb2M7CisKKwkJCWJyZWFrOworCQl9CisJfQorCisJZmFrZV9sbV9jaGVjayhicmlkZ2UsIGFkZHIsIGFzcGFjZSwgY3ljbGUpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHUzMiBmYWtlX3ZtZXJlYWQzMihzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZSwgdW5zaWduZWQgbG9uZyBsb25nIGFkZHIsCisJCXUzMiBhc3BhY2UsIHUzMiBjeWNsZSkKK3sKKwl1MzIgcmV0dmFsID0gMHhmZmZmZmZmZjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQsIGVuZCwgb2Zmc2V0OworCXUzMiAqbG9jOworCisJZm9yIChpID0gMDsgaSA8IEZBS0VfTUFYX1NMQVZFOyBpKyspIHsKKwkJaWYgKGFzcGFjZSAhPSBicmlkZ2UtPnNsYXZlc1tpXS5hc3BhY2UpCisJCQljb250aW51ZTsKKworCQlpZiAoY3ljbGUgIT0gYnJpZGdlLT5zbGF2ZXNbaV0uY3ljbGUpCisJCQljb250aW51ZTsKKworCQlzdGFydCA9IGJyaWRnZS0+c2xhdmVzW2ldLnZtZV9iYXNlOworCQllbmQgPSBicmlkZ2UtPnNsYXZlc1tpXS52bWVfYmFzZSArIGJyaWRnZS0+c2xhdmVzW2ldLnNpemU7CisKKwkJaWYgKChhZGRyID49IHN0YXJ0KSAmJiAoKGFkZHIgKyAzKSA8IGVuZCkpIHsKKwkJCW9mZnNldCA9IGFkZHIgLSBicmlkZ2UtPnNsYXZlc1tpXS52bWVfYmFzZTsKKwkJCWxvYyA9ICh1MzIgKikoYnJpZGdlLT5zbGF2ZXNbaV0uYnVmX2Jhc2UgKyBvZmZzZXQpOworCQkJcmV0dmFsID0gKmxvYzsKKworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmYWtlX2xtX2NoZWNrKGJyaWRnZSwgYWRkciwgYXNwYWNlLCBjeWNsZSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc3NpemVfdCBmYWtlX21hc3Rlcl9yZWFkKHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgdm9pZCAqYnVmLAorCQlzaXplX3QgY291bnQsIGxvZmZfdCBvZmZzZXQpCit7CisJaW50IHJldHZhbDsKKwl1MzIgYXNwYWNlLCBjeWNsZSwgZHdpZHRoOworCXN0cnVjdCB2bWVfYnJpZGdlICpmYWtlX2JyaWRnZTsKKwlzdHJ1Y3QgZmFrZV9kcml2ZXIgKnByaXY7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBsb25nIGFkZHI7CisJdW5zaWduZWQgaW50IGRvbmUgPSAwOworCXVuc2lnbmVkIGludCBjb3VudDMyOworCisJZmFrZV9icmlkZ2UgPSBpbWFnZS0+cGFyZW50OworCisJcHJpdiA9IGZha2VfYnJpZGdlLT5kcml2ZXJfcHJpdjsKKworCWkgPSBpbWFnZS0+bnVtYmVyOworCisJYWRkciA9ICh1bnNpZ25lZCBsb25nIGxvbmcpcHJpdi0+bWFzdGVyc1tpXS52bWVfYmFzZSArIG9mZnNldDsKKwlhc3BhY2UgPSBwcml2LT5tYXN0ZXJzW2ldLmFzcGFjZTsKKwljeWNsZSA9IHByaXYtPm1hc3RlcnNbaV0uY3ljbGU7CisJZHdpZHRoID0gcHJpdi0+bWFzdGVyc1tpXS5kd2lkdGg7CisKKwlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKKworCS8qIFRoZSBmb2xsb3dpbmcgY29kZSBoYW5kbGVzIFZNRSBhZGRyZXNzIGFsaWdubWVudC4gV2UgY2Fubm90IHVzZQorCSAqIG1lbWNweV94eHggaGVyZSBiZWNhdXNlIGl0IG1heSBjdXQgZGF0YSB0cmFuc2ZlcnMgaW4gdG8gOC1iaXQKKwkgKiBjeWNsZXMgd2hlbiBEMTYgb3IgRDMyIGN5Y2xlcyBhcmUgcmVxdWlyZWQgb24gdGhlIFZNRSBidXMuCisJICogT24gdGhlIG90aGVyIGhhbmQsIHRoZSBicmlkZ2UgaXRzZWxmIGFzc3VyZXMgdGhhdCB0aGUgbWF4aW11bSBkYXRhCisJICogY3ljbGUgY29uZmlndXJlZCBmb3IgdGhlIHRyYW5zZmVyIGlzIHVzZWQgYW5kIHNwbGl0cyBpdAorCSAqIGF1dG9tYXRpY2FsbHkgZm9yIG5vbi1hbGlnbmVkIGFkZHJlc3Nlcywgc28gd2UgZG9uJ3Qgd2FudCB0aGUKKwkgKiBvdmVyaGVhZCBvZiBuZWVkbGVzc2x5IGZvcmNpbmcgc21hbGwgdHJhbnNmZXJzIGZvciB0aGUgZW50aXJlIGN5Y2xlLgorCSAqLworCWlmIChhZGRyICYgMHgxKSB7CisJCSoodTggKilidWYgPSBmYWtlX3ZtZXJlYWQ4KHByaXYsIGFkZHIsIGFzcGFjZSwgY3ljbGUpOworCQlkb25lICs9IDE7CisJCWlmIChkb25lID09IGNvdW50KQorCQkJZ290byBvdXQ7CisJfQorCWlmICgoZHdpZHRoID09IFZNRV9EMTYpIHx8IChkd2lkdGggPT0gVk1FX0QzMikpIHsKKwkJaWYgKChhZGRyICsgZG9uZSkgJiAweDIpIHsKKwkJCWlmICgoY291bnQgLSBkb25lKSA8IDIpIHsKKwkJCQkqKHU4ICopKGJ1ZiArIGRvbmUpID0gZmFrZV92bWVyZWFkOChwcml2LAorCQkJCQkJYWRkciArIGRvbmUsIGFzcGFjZSwgY3ljbGUpOworCQkJCWRvbmUgKz0gMTsKKwkJCQlnb3RvIG91dDsKKwkJCX0gZWxzZSB7CisJCQkJKih1MTYgKikoYnVmICsgZG9uZSkgPSBmYWtlX3ZtZXJlYWQxNihwcml2LAorCQkJCQkJYWRkciArIGRvbmUsIGFzcGFjZSwgY3ljbGUpOworCQkJCWRvbmUgKz0gMjsKKwkJCX0KKwkJfQorCX0KKworCWlmIChkd2lkdGggPT0gVk1FX0QzMikgeworCQljb3VudDMyID0gKGNvdW50IC0gZG9uZSkgJiB+MHgzOworCQl3aGlsZSAoZG9uZSA8IGNvdW50MzIpIHsKKwkJCSoodTMyICopKGJ1ZiArIGRvbmUpID0gZmFrZV92bWVyZWFkMzIocHJpdiwgYWRkciArIGRvbmUsCisJCQkJCWFzcGFjZSwgY3ljbGUpOworCQkJZG9uZSArPSA0OworCQl9CisJfSBlbHNlIGlmIChkd2lkdGggPT0gVk1FX0QxNikgeworCQljb3VudDMyID0gKGNvdW50IC0gZG9uZSkgJiB+MHgzOworCQl3aGlsZSAoZG9uZSA8IGNvdW50MzIpIHsKKwkJCSoodTE2ICopKGJ1ZiArIGRvbmUpID0gZmFrZV92bWVyZWFkMTYocHJpdiwgYWRkciArIGRvbmUsCisJCQkJCWFzcGFjZSwgY3ljbGUpOworCQkJZG9uZSArPSAyOworCQl9CisJfSBlbHNlIGlmIChkd2lkdGggPT0gVk1FX0Q4KSB7CisJCWNvdW50MzIgPSAoY291bnQgLSBkb25lKTsKKwkJd2hpbGUgKGRvbmUgPCBjb3VudDMyKSB7CisJCQkqKHU4ICopKGJ1ZiArIGRvbmUpID0gZmFrZV92bWVyZWFkOChwcml2LCBhZGRyICsgZG9uZSwKKwkJCQkJYXNwYWNlLCBjeWNsZSk7CisJCQlkb25lICs9IDE7CisJCX0KKworCX0KKworCWlmICgoZHdpZHRoID09IFZNRV9EMTYpIHx8IChkd2lkdGggPT0gVk1FX0QzMikpIHsKKwkJaWYgKChjb3VudCAtIGRvbmUpICYgMHgyKSB7CisJCQkqKHUxNiAqKShidWYgKyBkb25lKSA9IGZha2Vfdm1lcmVhZDE2KHByaXYsIGFkZHIgKyBkb25lLAorCQkJCQlhc3BhY2UsIGN5Y2xlKTsKKwkJCWRvbmUgKz0gMjsKKwkJfQorCX0KKwlpZiAoKGNvdW50IC0gZG9uZSkgJiAweDEpIHsKKwkJKih1OCAqKShidWYgKyBkb25lKSA9IGZha2Vfdm1lcmVhZDgocHJpdiwgYWRkciArIGRvbmUsIGFzcGFjZSwKKwkJCQljeWNsZSk7CisJCWRvbmUgKz0gMTsKKwl9CisKK291dDoKKwlyZXR2YWwgPSBjb3VudDsKKworCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBmYWtlX3ZtZXdyaXRlOChzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZSwgdTggKmJ1ZiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyLCB1MzIgYXNwYWNlLCB1MzIgY3ljbGUpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0LCBlbmQsIG9mZnNldDsKKwl1OCAqbG9jOworCisJZm9yIChpID0gMDsgaSA8IEZBS0VfTUFYX1NMQVZFOyBpKyspIHsKKwkJaWYgKGFzcGFjZSAhPSBicmlkZ2UtPnNsYXZlc1tpXS5hc3BhY2UpCisJCQljb250aW51ZTsKKworCQlpZiAoY3ljbGUgIT0gYnJpZGdlLT5zbGF2ZXNbaV0uY3ljbGUpCisJCQljb250aW51ZTsKKworCQlzdGFydCA9IGJyaWRnZS0+c2xhdmVzW2ldLnZtZV9iYXNlOworCQllbmQgPSBicmlkZ2UtPnNsYXZlc1tpXS52bWVfYmFzZSArIGJyaWRnZS0+c2xhdmVzW2ldLnNpemU7CisKKwkJaWYgKChhZGRyID49IHN0YXJ0KSAmJiAoYWRkciA8IGVuZCkpIHsKKwkJCW9mZnNldCA9IGFkZHIgLSBicmlkZ2UtPnNsYXZlc1tpXS52bWVfYmFzZTsKKwkJCWxvYyA9ICh1OCAqKSgodm9pZCAqKWJyaWRnZS0+c2xhdmVzW2ldLmJ1Zl9iYXNlICsgb2Zmc2V0KTsKKwkJCSpsb2MgPSAqYnVmOworCisJCQlicmVhazsKKwkJfQorCX0KKworCWZha2VfbG1fY2hlY2soYnJpZGdlLCBhZGRyLCBhc3BhY2UsIGN5Y2xlKTsKKworfQorCitzdGF0aWMgdm9pZCBmYWtlX3ZtZXdyaXRlMTYoc3RydWN0IGZha2VfZHJpdmVyICpicmlkZ2UsIHUxNiAqYnVmLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyLCB1MzIgYXNwYWNlLCB1MzIgY3ljbGUpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0LCBlbmQsIG9mZnNldDsKKwl1MTYgKmxvYzsKKworCWZvciAoaSA9IDA7IGkgPCBGQUtFX01BWF9TTEFWRTsgaSsrKSB7CisJCWlmIChhc3BhY2UgIT0gYnJpZGdlLT5zbGF2ZXNbaV0uYXNwYWNlKQorCQkJY29udGludWU7CisKKwkJaWYgKGN5Y2xlICE9IGJyaWRnZS0+c2xhdmVzW2ldLmN5Y2xlKQorCQkJY29udGludWU7CisKKwkJc3RhcnQgPSBicmlkZ2UtPnNsYXZlc1tpXS52bWVfYmFzZTsKKwkJZW5kID0gYnJpZGdlLT5zbGF2ZXNbaV0udm1lX2Jhc2UgKyBicmlkZ2UtPnNsYXZlc1tpXS5zaXplOworCisJCWlmICgoYWRkciA+PSBzdGFydCkgJiYgKChhZGRyICsgMSkgPCBlbmQpKSB7CisJCQlvZmZzZXQgPSBhZGRyIC0gYnJpZGdlLT5zbGF2ZXNbaV0udm1lX2Jhc2U7CisJCQlsb2MgPSAodTE2ICopKCh2b2lkICopYnJpZGdlLT5zbGF2ZXNbaV0uYnVmX2Jhc2UgKyBvZmZzZXQpOworCQkJKmxvYyA9ICpidWY7CisKKwkJCWJyZWFrOworCQl9CisJfQorCisJZmFrZV9sbV9jaGVjayhicmlkZ2UsIGFkZHIsIGFzcGFjZSwgY3ljbGUpOworCit9CisKK3N0YXRpYyB2b2lkIGZha2Vfdm1ld3JpdGUzMihzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZSwgdTMyICpidWYsCisJCQkgICAgdW5zaWduZWQgbG9uZyBsb25nIGFkZHIsIHUzMiBhc3BhY2UsIHUzMiBjeWNsZSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQsIGVuZCwgb2Zmc2V0OworCXUzMiAqbG9jOworCisJZm9yIChpID0gMDsgaSA8IEZBS0VfTUFYX1NMQVZFOyBpKyspIHsKKwkJaWYgKGFzcGFjZSAhPSBicmlkZ2UtPnNsYXZlc1tpXS5hc3BhY2UpCisJCQljb250aW51ZTsKKworCQlpZiAoY3ljbGUgIT0gYnJpZGdlLT5zbGF2ZXNbaV0uY3ljbGUpCisJCQljb250aW51ZTsKKworCQlzdGFydCA9IGJyaWRnZS0+c2xhdmVzW2ldLnZtZV9iYXNlOworCQllbmQgPSBicmlkZ2UtPnNsYXZlc1tpXS52bWVfYmFzZSArIGJyaWRnZS0+c2xhdmVzW2ldLnNpemU7CisKKwkJaWYgKChhZGRyID49IHN0YXJ0KSAmJiAoKGFkZHIgKyAzKSA8IGVuZCkpIHsKKwkJCW9mZnNldCA9IGFkZHIgLSBicmlkZ2UtPnNsYXZlc1tpXS52bWVfYmFzZTsKKwkJCWxvYyA9ICh1MzIgKikoKHZvaWQgKilicmlkZ2UtPnNsYXZlc1tpXS5idWZfYmFzZSArIG9mZnNldCk7CisJCQkqbG9jID0gKmJ1ZjsKKworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmYWtlX2xtX2NoZWNrKGJyaWRnZSwgYWRkciwgYXNwYWNlLCBjeWNsZSk7CisKK30KKworc3RhdGljIHNzaXplX3QgZmFrZV9tYXN0ZXJfd3JpdGUoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCB2b2lkICpidWYsCisJCXNpemVfdCBjb3VudCwgbG9mZl90IG9mZnNldCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwl1MzIgYXNwYWNlLCBjeWNsZSwgZHdpZHRoOworCXVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyOworCWludCBpOworCXVuc2lnbmVkIGludCBkb25lID0gMDsKKwl1bnNpZ25lZCBpbnQgY291bnQzMjsKKworCXN0cnVjdCB2bWVfYnJpZGdlICpmYWtlX2JyaWRnZTsKKwlzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZTsKKworCWZha2VfYnJpZGdlID0gaW1hZ2UtPnBhcmVudDsKKworCWJyaWRnZSA9IGZha2VfYnJpZGdlLT5kcml2ZXJfcHJpdjsKKworCWkgPSBpbWFnZS0+bnVtYmVyOworCisJYWRkciA9IGJyaWRnZS0+bWFzdGVyc1tpXS52bWVfYmFzZSArIG9mZnNldDsKKwlhc3BhY2UgPSBicmlkZ2UtPm1hc3RlcnNbaV0uYXNwYWNlOworCWN5Y2xlID0gYnJpZGdlLT5tYXN0ZXJzW2ldLmN5Y2xlOworCWR3aWR0aCA9IGJyaWRnZS0+bWFzdGVyc1tpXS5kd2lkdGg7CisKKwlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKKworCS8qIEhlcmUgd2UgYXBwbHkgZm9yIHRoZSBzYW1lIHN0cmF0ZWd5IHdlIGRvIGluIG1hc3Rlcl9yZWFkCisJICogZnVuY3Rpb24gaW4gb3JkZXIgdG8gYXNzdXJlIHRoZSBjb3JyZWN0IGN5Y2xlcy4KKwkgKi8KKwlpZiAoYWRkciAmIDB4MSkgeworCQlmYWtlX3ZtZXdyaXRlOChicmlkZ2UsICh1OCAqKWJ1ZiwgYWRkciwgYXNwYWNlLCBjeWNsZSk7CisJCWRvbmUgKz0gMTsKKwkJaWYgKGRvbmUgPT0gY291bnQpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKGR3aWR0aCA9PSBWTUVfRDE2KSB8fCAoZHdpZHRoID09IFZNRV9EMzIpKSB7CisJCWlmICgoYWRkciArIGRvbmUpICYgMHgyKSB7CisJCQlpZiAoKGNvdW50IC0gZG9uZSkgPCAyKSB7CisJCQkJZmFrZV92bWV3cml0ZTgoYnJpZGdlLCAodTggKikoYnVmICsgZG9uZSksCisJCQkJCQlhZGRyICsgZG9uZSwgYXNwYWNlLCBjeWNsZSk7CisJCQkJZG9uZSArPSAxOworCQkJCWdvdG8gb3V0OworCQkJfSBlbHNlIHsKKwkJCQlmYWtlX3ZtZXdyaXRlMTYoYnJpZGdlLCAodTE2ICopKGJ1ZiArIGRvbmUpLAorCQkJCQkJYWRkciArIGRvbmUsIGFzcGFjZSwgY3ljbGUpOworCQkJCWRvbmUgKz0gMjsKKwkJCX0KKwkJfQorCX0KKworCWlmIChkd2lkdGggPT0gVk1FX0QzMikgeworCQljb3VudDMyID0gKGNvdW50IC0gZG9uZSkgJiB+MHgzOworCQl3aGlsZSAoZG9uZSA8IGNvdW50MzIpIHsKKwkJCWZha2Vfdm1ld3JpdGUzMihicmlkZ2UsICh1MzIgKikoYnVmICsgZG9uZSksCisJCQkJCWFkZHIgKyBkb25lLCBhc3BhY2UsIGN5Y2xlKTsKKwkJCWRvbmUgKz0gNDsKKwkJfQorCX0gZWxzZSBpZiAoZHdpZHRoID09IFZNRV9EMTYpIHsKKwkJY291bnQzMiA9IChjb3VudCAtIGRvbmUpICYgfjB4MzsKKwkJd2hpbGUgKGRvbmUgPCBjb3VudDMyKSB7CisJCQlmYWtlX3ZtZXdyaXRlMTYoYnJpZGdlLCAodTE2ICopKGJ1ZiArIGRvbmUpLAorCQkJCQlhZGRyICsgZG9uZSwgYXNwYWNlLCBjeWNsZSk7CisJCQlkb25lICs9IDI7CisJCX0KKwl9IGVsc2UgaWYgKGR3aWR0aCA9PSBWTUVfRDgpIHsKKwkJY291bnQzMiA9IChjb3VudCAtIGRvbmUpOworCQl3aGlsZSAoZG9uZSA8IGNvdW50MzIpIHsKKwkJCWZha2Vfdm1ld3JpdGU4KGJyaWRnZSwgKHU4ICopKGJ1ZiArIGRvbmUpLCBhZGRyICsgZG9uZSwKKwkJCQkJYXNwYWNlLCBjeWNsZSk7CisJCQlkb25lICs9IDE7CisJCX0KKworCX0KKworCWlmICgoZHdpZHRoID09IFZNRV9EMTYpIHx8IChkd2lkdGggPT0gVk1FX0QzMikpIHsKKwkJaWYgKChjb3VudCAtIGRvbmUpICYgMHgyKSB7CisJCQlmYWtlX3ZtZXdyaXRlMTYoYnJpZGdlLCAodTE2ICopKGJ1ZiArIGRvbmUpLAorCQkJCQlhZGRyICsgZG9uZSwgYXNwYWNlLCBjeWNsZSk7CisJCQlkb25lICs9IDI7CisJCX0KKwl9CisKKwlpZiAoKGNvdW50IC0gZG9uZSkgJiAweDEpIHsKKwkJZmFrZV92bWV3cml0ZTgoYnJpZGdlLCAodTggKikoYnVmICsgZG9uZSksIGFkZHIgKyBkb25lLCBhc3BhY2UsCisJCQkJY3ljbGUpOworCQlkb25lICs9IDE7CisJfQorCitvdXQ6CisJcmV0dmFsID0gY291bnQ7CisKKwlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFBlcmZvcm0gYW4gUk1XIGN5Y2xlIG9uIHRoZSBWTUUgYnVzLgorICoKKyAqIFJlcXVpcmVzIGEgcHJldmlvdXNseSBjb25maWd1cmVkIG1hc3RlciB3aW5kb3csIHJldHVybnMgZmluYWwgdmFsdWUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmFrZV9tYXN0ZXJfcm13KHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwKKwkJdW5zaWduZWQgaW50IG1hc2ssIHVuc2lnbmVkIGludCBjb21wYXJlLCB1bnNpZ25lZCBpbnQgc3dhcCwKKwkJbG9mZl90IG9mZnNldCkKK3sKKwl1MzIgdG1wLCBiYXNlOworCXUzMiBhc3BhY2UsIGN5Y2xlOworCWludCBpOworCXN0cnVjdCBmYWtlX2RyaXZlciAqYnJpZGdlOworCisJYnJpZGdlID0gaW1hZ2UtPnBhcmVudC0+ZHJpdmVyX3ByaXY7CisKKwkvKiBGaW5kIHRoZSBQQ0kgYWRkcmVzcyB0aGF0IG1hcHMgdG8gdGhlIGRlc2lyZWQgVk1FIGFkZHJlc3MgKi8KKwlpID0gaW1hZ2UtPm51bWJlcjsKKworCWJhc2UgPSBicmlkZ2UtPm1hc3RlcnNbaV0udm1lX2Jhc2U7CisJYXNwYWNlID0gYnJpZGdlLT5tYXN0ZXJzW2ldLmFzcGFjZTsKKwljeWNsZSA9IGJyaWRnZS0+bWFzdGVyc1tpXS5jeWNsZTsKKworCS8qIExvY2sgaW1hZ2UgKi8KKwlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKKworCS8qIFJlYWQgZXhpc3RpbmcgdmFsdWUgKi8KKwl0bXAgPSBmYWtlX3ZtZXJlYWQzMihicmlkZ2UsIGJhc2UgKyBvZmZzZXQsIGFzcGFjZSwgY3ljbGUpOworCisJLyogUGVyZm9ybSBjaGVjayAqLworCWlmICgodG1wICYmIG1hc2spID09IChjb21wYXJlICYmIG1hc2spKSB7CisJCXRtcCA9IHRtcCB8IChtYXNrIHwgc3dhcCk7CisJCXRtcCA9IHRtcCAmICh+bWFzayB8IHN3YXApOworCisJCS8qIFdyaXRlIGJhY2sgKi8KKwkJZmFrZV92bWV3cml0ZTMyKGJyaWRnZSwgJnRtcCwgYmFzZSArIG9mZnNldCwgYXNwYWNlLCBjeWNsZSk7CisJfQorCisJLyogVW5sb2NrIGltYWdlICovCisJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKKworCXJldHVybiB0bXA7Cit9CisKKy8qCisgKiBBbGwgNCBsb2NhdGlvbiBtb25pdG9ycyByZXNpZGUgYXQgdGhlIHNhbWUgYmFzZSAtIHRoaXMgaXMgdGhlcmVmb3JlIGEKKyAqIHN5c3RlbSB3aWRlIGNvbmZpZ3VyYXRpb24uCisgKgorICogVGhpcyBkb2VzIG5vdCBlbmFibGUgdGhlIExNIG1vbml0b3IgLSB0aGF0IHNob3VsZCBiZSBkb25lIHdoZW4gdGhlIGZpcnN0CisgKiBjYWxsYmFjayBpcyBhdHRhY2hlZCBhbmQgZGlzYWJsZWQgd2hlbiB0aGUgbGFzdCBjYWxsYmFjayBpcyByZW1vdmVkLgorICovCitzdGF0aWMgaW50IGZha2VfbG1fc2V0KHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLCB1bnNpZ25lZCBsb25nIGxvbmcgbG1fYmFzZSwKKwkJdTMyIGFzcGFjZSwgdTMyIGN5Y2xlKQoreworCWludCBpOworCXN0cnVjdCB2bWVfYnJpZGdlICpmYWtlX2JyaWRnZTsKKwlzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZTsKKworCWZha2VfYnJpZGdlID0gbG0tPnBhcmVudDsKKworCWJyaWRnZSA9IGZha2VfYnJpZGdlLT5kcml2ZXJfcHJpdjsKKworCW11dGV4X2xvY2soJmxtLT5tdHgpOworCisJLyogSWYgd2UgYWxyZWFkeSBoYXZlIGEgY2FsbGJhY2sgYXR0YWNoZWQsIHdlIGNhbid0IG1vdmUgaXQhICovCisJZm9yIChpID0gMDsgaSA8IGxtLT5tb25pdG9yczsgaSsrKSB7CisJCWlmIChicmlkZ2UtPmxtX2NhbGxiYWNrW2ldICE9IE5VTEwpIHsKKwkJCW11dGV4X3VubG9jaygmbG0tPm10eCk7CisJCQlwcl9lcnIoIkxvY2F0aW9uIG1vbml0b3IgY2FsbGJhY2sgYXR0YWNoZWQsIGNhbid0IHJlc2V0XG4iKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwlzd2l0Y2ggKGFzcGFjZSkgeworCWNhc2UgVk1FX0ExNjoKKwljYXNlIFZNRV9BMjQ6CisJY2FzZSBWTUVfQTMyOgorCWNhc2UgVk1FX0E2NDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKKwkJcHJfZXJyKCJJbnZhbGlkIGFkZHJlc3Mgc3BhY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlicmlkZ2UtPmxtX2Jhc2UgPSBsbV9iYXNlOworCWJyaWRnZS0+bG1fYXNwYWNlID0gYXNwYWNlOworCWJyaWRnZS0+bG1fY3ljbGUgPSBjeWNsZTsKKworCW11dGV4X3VubG9jaygmbG0tPm10eCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNhbGxiYWNrIG1vbml0b3IgYW5kIHJldHVybiB3aGV0aGVyIGl0IGlzIGVuYWJsZWQKKyAqIG9yIGRpc2FibGVkLgorICovCitzdGF0aWMgaW50IGZha2VfbG1fZ2V0KHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLAorCQl1bnNpZ25lZCBsb25nIGxvbmcgKmxtX2Jhc2UsIHUzMiAqYXNwYWNlLCB1MzIgKmN5Y2xlKQoreworCXN0cnVjdCBmYWtlX2RyaXZlciAqYnJpZGdlOworCisJYnJpZGdlID0gbG0tPnBhcmVudC0+ZHJpdmVyX3ByaXY7CisKKwltdXRleF9sb2NrKCZsbS0+bXR4KTsKKworCSpsbV9iYXNlID0gYnJpZGdlLT5sbV9iYXNlOworCSphc3BhY2UgPSBicmlkZ2UtPmxtX2FzcGFjZTsKKwkqY3ljbGUgPSBicmlkZ2UtPmxtX2N5Y2xlOworCisJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKKworCXJldHVybiBicmlkZ2UtPmxtX2VuYWJsZWQ7Cit9CisKKy8qCisgKiBBdHRhY2ggYSBjYWxsYmFjayB0byBhIHNwZWNpZmljIGxvY2F0aW9uIG1vbml0b3IuCisgKgorICogQ2FsbGJhY2sgd2lsbCBiZSBwYXNzZWQgdGhlIG1vbml0b3IgdHJpZ2dlcmVkLgorICovCitzdGF0aWMgaW50IGZha2VfbG1fYXR0YWNoKHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLCBpbnQgbW9uaXRvciwKKwkJdm9pZCAoKmNhbGxiYWNrKSh2b2lkICopLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB2bWVfYnJpZGdlICpmYWtlX2JyaWRnZTsKKwlzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZTsKKworCWZha2VfYnJpZGdlID0gbG0tPnBhcmVudDsKKworCWJyaWRnZSA9IGZha2VfYnJpZGdlLT5kcml2ZXJfcHJpdjsKKworCW11dGV4X2xvY2soJmxtLT5tdHgpOworCisJLyogRW5zdXJlIHRoYXQgdGhlIGxvY2F0aW9uIG1vbml0b3IgaXMgY29uZmlndXJlZCAtIG5lZWQgUEdNIG9yIERBVEEgKi8KKwlpZiAoYnJpZGdlLT5sbV9jeWNsZSA9PSAwKSB7CisJCW11dGV4X3VubG9jaygmbG0tPm10eCk7CisJCXByX2VycigiTG9jYXRpb24gbW9uaXRvciBub3QgcHJvcGVybHkgY29uZmlndXJlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIHRoYXQgYSBjYWxsYmFjayBpc24ndCBhbHJlYWR5IGF0dGFjaGVkICovCisJaWYgKGJyaWRnZS0+bG1fY2FsbGJhY2tbbW9uaXRvcl0gIT0gTlVMTCkgeworCQltdXRleF91bmxvY2soJmxtLT5tdHgpOworCQlwcl9lcnIoIkV4aXN0aW5nIGNhbGxiYWNrIGF0dGFjaGVkXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBBdHRhY2ggY2FsbGJhY2sgKi8KKwlicmlkZ2UtPmxtX2NhbGxiYWNrW21vbml0b3JdID0gY2FsbGJhY2s7CisJYnJpZGdlLT5sbV9kYXRhW21vbml0b3JdID0gZGF0YTsKKworCS8qIEVuc3VyZSB0aGF0IGdsb2JhbCBMb2NhdGlvbiBNb25pdG9yIEVuYWJsZSBzZXQgKi8KKwlicmlkZ2UtPmxtX2VuYWJsZWQgPSAxOworCisJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKKworCXJldHVybiAwOworfQorCisvKgorICogRGV0YWNoIGEgY2FsbGJhY2sgZnVuY3Rpb24gZm9ybiBhIHNwZWNpZmljIGxvY2F0aW9uIG1vbml0b3IuCisgKi8KK3N0YXRpYyBpbnQgZmFrZV9sbV9kZXRhY2goc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sIGludCBtb25pdG9yKQoreworCXUzMiB0bXA7CisJaW50IGk7CisJc3RydWN0IGZha2VfZHJpdmVyICpicmlkZ2U7CisKKwlicmlkZ2UgPSBsbS0+cGFyZW50LT5kcml2ZXJfcHJpdjsKKworCW11dGV4X2xvY2soJmxtLT5tdHgpOworCisJLyogRGV0YWNoIGNhbGxiYWNrICovCisJYnJpZGdlLT5sbV9jYWxsYmFja1ttb25pdG9yXSA9IE5VTEw7CisJYnJpZGdlLT5sbV9kYXRhW21vbml0b3JdID0gTlVMTDsKKworCS8qIElmIGFsbCBsb2NhdGlvbiBtb25pdG9ycyBkaXNhYmxlZCwgZGlzYWJsZSBnbG9iYWwgTG9jYXRpb24gTW9uaXRvciAqLworCXRtcCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGxtLT5tb25pdG9yczsgaSsrKSB7CisJCWlmIChicmlkZ2UtPmxtX2NhbGxiYWNrW2ldICE9IE5VTEwpCisJCQl0bXAgPSAxOworCX0KKworCWlmICh0bXAgPT0gMCkKKwkJYnJpZGdlLT5sbV9lbmFibGVkID0gMDsKKworCW11dGV4X3VubG9jaygmbG0tPm10eCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERldGVybWluZSBHZW9ncmFwaGljYWwgQWRkcmVzc2luZworICovCitzdGF0aWMgaW50IGZha2Vfc2xvdF9nZXQoc3RydWN0IHZtZV9icmlkZ2UgKmZha2VfYnJpZGdlKQoreworCXJldHVybiBnZW9pZDsKK30KKworc3RhdGljIHZvaWQgKmZha2VfYWxsb2NfY29uc2lzdGVudChzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIHNpemVfdCBzaXplLAorCQlkbWFfYWRkcl90ICpkbWEpCit7CisJdm9pZCAqYWxsb2MgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCisJaWYgKGFsbG9jICE9IE5VTEwpCisJCSpkbWEgPSBmYWtlX3B0cl90b19wY2koYWxsb2MpOworCisJcmV0dXJuIGFsbG9jOworfQorCitzdGF0aWMgdm9pZCBmYWtlX2ZyZWVfY29uc2lzdGVudChzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIHNpemVfdCBzaXplLAorCQl2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWEpCit7CisJa2ZyZWUodmFkZHIpOworLyoKKwlkbWFfZnJlZV9jb2hlcmVudChwYXJlbnQsIHNpemUsIHZhZGRyLCBkbWEpOworKi8KK30KKworLyoKKyAqIENvbmZpZ3VyZSBDUi9DU1Igc3BhY2UKKyAqCisgKiBBY2Nlc3MgdG8gdGhlIENSL0NTUiBjYW4gYmUgY29uZmlndXJlZCBhdCBwb3dlci11cC4gVGhlIGxvY2F0aW9uIG9mIHRoZQorICogQ1IvQ1NSIHJlZ2lzdGVycyBpbiB0aGUgQ1IvQ1NSIGFkZHJlc3Mgc3BhY2UgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYm9hcmRzCisgKiBHZW9ncmFwaGljIGFkZHJlc3MuCisgKgorICogRWFjaCBib2FyZCBoYXMgYSA1MTJrQiB3aW5kb3csIHdpdGggdGhlIGhpZ2hlc3QgNGtCIGJlaW5nIHVzZWQgZm9yIHRoZQorICogYm9hcmRzIHJlZ2lzdGVycywgdGhpcyBtZWFucyB0aGVyZSBpcyBhIGZpeCBsZW5ndGggNTA4a0Igd2luZG93IHdoaWNoIG11c3QKKyAqIGJlIG1hcHBlZCBvbnRvIFBDSSBtZW1vcnkuCisgKi8KK3N0YXRpYyBpbnQgZmFrZV9jcmNzcl9pbml0KHN0cnVjdCB2bWVfYnJpZGdlICpmYWtlX2JyaWRnZSkKK3sKKwl1MzIgdnN0YXQ7CisJc3RydWN0IGZha2VfZHJpdmVyICpicmlkZ2U7CisKKwlicmlkZ2UgPSBmYWtlX2JyaWRnZS0+ZHJpdmVyX3ByaXY7CisKKwkvKiBBbGxvY2F0ZSBtZW0gZm9yIENSL0NTUiBpbWFnZSAqLworCWJyaWRnZS0+Y3Jjc3Jfa2VybmVsID0ga3phbGxvYyhWTUVfQ1JDU1JfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCWJyaWRnZS0+Y3Jjc3JfYnVzID0gZmFrZV9wdHJfdG9fcGNpKGJyaWRnZS0+Y3Jjc3Jfa2VybmVsKTsKKwlpZiAoYnJpZGdlLT5jcmNzcl9rZXJuZWwgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2c3RhdCA9IGZha2Vfc2xvdF9nZXQoZmFrZV9icmlkZ2UpOworCisJcHJfaW5mbygiQ1IvQ1NSIE9mZnNldDogJWRcbiIsIHZzdGF0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmYWtlX2NyY3NyX2V4aXQoc3RydWN0IHZtZV9icmlkZ2UgKmZha2VfYnJpZGdlKQoreworCXN0cnVjdCBmYWtlX2RyaXZlciAqYnJpZGdlOworCisJYnJpZGdlID0gZmFrZV9icmlkZ2UtPmRyaXZlcl9wcml2OworCisJa2ZyZWUoYnJpZGdlLT5jcmNzcl9rZXJuZWwpOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IGZha2VfaW5pdCh2b2lkKQoreworCWludCByZXR2YWwsIGk7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zID0gTlVMTCwgKm47CisJc3RydWN0IHZtZV9icmlkZ2UgKmZha2VfYnJpZGdlOworCXN0cnVjdCBmYWtlX2RyaXZlciAqZmFrZV9kZXZpY2U7CisJc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKm1hc3Rlcl9pbWFnZTsKKwlzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICpzbGF2ZV9pbWFnZTsKKwlzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbTsKKworCS8qIFdlIG5lZWQgYSBmYWtlIHBhcmVudCBkZXZpY2UgKi8KKwl2bWVfcm9vdCA9IF9fcm9vdF9kZXZpY2VfcmVnaXN0ZXIoInZtZSIsIFRISVNfTU9EVUxFKTsKKworCS8qIElmIHdlIHdhbnQgdG8gc3VwcG9ydCBtb3JlIHRoYW4gb25lIGJyaWRnZSBhdCBzb21lIHBvaW50LCB3ZSBuZWVkIHRvCisJICogZHluYW1pY2FsbHkgYWxsb2NhdGUgdGhpcyBzbyB3ZSBnZXQgb25lIHBlciBkZXZpY2UuCisJICovCisJZmFrZV9icmlkZ2UgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgdm1lX2JyaWRnZSksIEdGUF9LRVJORUwpOworCWlmIChmYWtlX2JyaWRnZSA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3N0cnVjdDsKKwl9CisKKwlmYWtlX2RldmljZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmYWtlX2RyaXZlciksIEdGUF9LRVJORUwpOworCWlmIChmYWtlX2RldmljZSA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2RyaXZlcjsKKwl9CisKKwlmYWtlX2JyaWRnZS0+ZHJpdmVyX3ByaXYgPSBmYWtlX2RldmljZTsKKworCWZha2VfYnJpZGdlLT5wYXJlbnQgPSB2bWVfcm9vdDsKKworCWZha2VfZGV2aWNlLT5wYXJlbnQgPSBmYWtlX2JyaWRnZTsKKworCS8qIEluaXRpYWxpemUgd2FpdCBxdWV1ZXMgJiBtdXR1YWwgZXhjbHVzaW9uIGZsYWdzICovCisJbXV0ZXhfaW5pdCgmZmFrZV9kZXZpY2UtPnZtZV9pbnQpOworCW11dGV4X2luaXQoJmZha2VfYnJpZGdlLT5pcnFfbXR4KTsKKwl0YXNrbGV0X2luaXQoJmZha2VfZGV2aWNlLT5pbnRfdGFza2xldCwgZmFrZV9WSVJRX3Rhc2tsZXQsCisJCQkodW5zaWduZWQgbG9uZykgZmFrZV9icmlkZ2UpOworCisJc3RyY3B5KGZha2VfYnJpZGdlLT5uYW1lLCBkcml2ZXJfbmFtZSk7CisKKwkvKiBBZGQgbWFzdGVyIHdpbmRvd3MgdG8gbGlzdCAqLworCUlOSVRfTElTVF9IRUFEKCZmYWtlX2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcyk7CisJZm9yIChpID0gMDsgaSA8IEZBS0VfTUFYX01BU1RFUjsgaSsrKSB7CisJCW1hc3Rlcl9pbWFnZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKG1hc3Rlcl9pbWFnZSA9PSBOVUxMKSB7CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJZ290byBlcnJfbWFzdGVyOworCQl9CisJCW1hc3Rlcl9pbWFnZS0+cGFyZW50ID0gZmFrZV9icmlkZ2U7CisJCXNwaW5fbG9ja19pbml0KCZtYXN0ZXJfaW1hZ2UtPmxvY2spOworCQltYXN0ZXJfaW1hZ2UtPmxvY2tlZCA9IDA7CisJCW1hc3Rlcl9pbWFnZS0+bnVtYmVyID0gaTsKKwkJbWFzdGVyX2ltYWdlLT5hZGRyZXNzX2F0dHIgPSBWTUVfQTE2IHwgVk1FX0EyNCB8IFZNRV9BMzIgfAorCQkJVk1FX0E2NDsKKwkJbWFzdGVyX2ltYWdlLT5jeWNsZV9hdHRyID0gVk1FX1NDVCB8IFZNRV9CTFQgfCBWTUVfTUJMVCB8CisJCQlWTUVfMmVWTUUgfCBWTUVfMmVTU1QgfCBWTUVfMmVTU1RCIHwgVk1FXzJlU1NUMTYwIHwKKwkJCVZNRV8yZVNTVDI2NyB8IFZNRV8yZVNTVDMyMCB8IFZNRV9TVVBFUiB8IFZNRV9VU0VSIHwKKwkJCVZNRV9QUk9HIHwgVk1FX0RBVEE7CisJCW1hc3Rlcl9pbWFnZS0+d2lkdGhfYXR0ciA9IFZNRV9EMTYgfCBWTUVfRDMyOworCQltZW1zZXQoJm1hc3Rlcl9pbWFnZS0+YnVzX3Jlc291cmNlLCAwLAorCQkJCXNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwkJbWFzdGVyX2ltYWdlLT5rZXJuX2Jhc2UgID0gTlVMTDsKKwkJbGlzdF9hZGRfdGFpbCgmbWFzdGVyX2ltYWdlLT5saXN0LAorCQkJCSZmYWtlX2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcyk7CisJfQorCisJLyogQWRkIHNsYXZlIHdpbmRvd3MgdG8gbGlzdCAqLworCUlOSVRfTElTVF9IRUFEKCZmYWtlX2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKTsKKwlmb3IgKGkgPSAwOyBpIDwgRkFLRV9NQVhfU0xBVkU7IGkrKykgeworCQlzbGF2ZV9pbWFnZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UpLAorCQkJCUdGUF9LRVJORUwpOworCQlpZiAoc2xhdmVfaW1hZ2UgPT0gTlVMTCkgeworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX3NsYXZlOworCQl9CisJCXNsYXZlX2ltYWdlLT5wYXJlbnQgPSBmYWtlX2JyaWRnZTsKKwkJbXV0ZXhfaW5pdCgmc2xhdmVfaW1hZ2UtPm10eCk7CisJCXNsYXZlX2ltYWdlLT5sb2NrZWQgPSAwOworCQlzbGF2ZV9pbWFnZS0+bnVtYmVyID0gaTsKKwkJc2xhdmVfaW1hZ2UtPmFkZHJlc3NfYXR0ciA9IFZNRV9BMTYgfCBWTUVfQTI0IHwgVk1FX0EzMiB8CisJCQlWTUVfQTY0IHwgVk1FX0NSQ1NSIHwgVk1FX1VTRVIxIHwgVk1FX1VTRVIyIHwKKwkJCVZNRV9VU0VSMyB8IFZNRV9VU0VSNDsKKwkJc2xhdmVfaW1hZ2UtPmN5Y2xlX2F0dHIgPSBWTUVfU0NUIHwgVk1FX0JMVCB8IFZNRV9NQkxUIHwKKwkJCVZNRV8yZVZNRSB8IFZNRV8yZVNTVCB8IFZNRV8yZVNTVEIgfCBWTUVfMmVTU1QxNjAgfAorCQkJVk1FXzJlU1NUMjY3IHwgVk1FXzJlU1NUMzIwIHwgVk1FX1NVUEVSIHwgVk1FX1VTRVIgfAorCQkJVk1FX1BST0cgfCBWTUVfREFUQTsKKwkJbGlzdF9hZGRfdGFpbCgmc2xhdmVfaW1hZ2UtPmxpc3QsCisJCQkJJmZha2VfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpOworCX0KKworCS8qIEFkZCBsb2NhdGlvbiBtb25pdG9yIHRvIGxpc3QgKi8KKwlJTklUX0xJU1RfSEVBRCgmZmFrZV9icmlkZ2UtPmxtX3Jlc291cmNlcyk7CisJbG0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGxtID09IE5VTEwpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBsb2NhdGlvbiBtb25pdG9yIHJlc291cmNlIHN0cnVjdHVyZVxuIik7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2xtOworCX0KKwlsbS0+cGFyZW50ID0gZmFrZV9icmlkZ2U7CisJbXV0ZXhfaW5pdCgmbG0tPm10eCk7CisJbG0tPmxvY2tlZCA9IDA7CisJbG0tPm51bWJlciA9IDE7CisJbG0tPm1vbml0b3JzID0gNDsKKwlsaXN0X2FkZF90YWlsKCZsbS0+bGlzdCwgJmZha2VfYnJpZGdlLT5sbV9yZXNvdXJjZXMpOworCisJZmFrZV9icmlkZ2UtPnNsYXZlX2dldCA9IGZha2Vfc2xhdmVfZ2V0OworCWZha2VfYnJpZGdlLT5zbGF2ZV9zZXQgPSBmYWtlX3NsYXZlX3NldDsKKwlmYWtlX2JyaWRnZS0+bWFzdGVyX2dldCA9IGZha2VfbWFzdGVyX2dldDsKKwlmYWtlX2JyaWRnZS0+bWFzdGVyX3NldCA9IGZha2VfbWFzdGVyX3NldDsKKwlmYWtlX2JyaWRnZS0+bWFzdGVyX3JlYWQgPSBmYWtlX21hc3Rlcl9yZWFkOworCWZha2VfYnJpZGdlLT5tYXN0ZXJfd3JpdGUgPSBmYWtlX21hc3Rlcl93cml0ZTsKKwlmYWtlX2JyaWRnZS0+bWFzdGVyX3JtdyA9IGZha2VfbWFzdGVyX3JtdzsKKwlmYWtlX2JyaWRnZS0+aXJxX3NldCA9IGZha2VfaXJxX3NldDsKKwlmYWtlX2JyaWRnZS0+aXJxX2dlbmVyYXRlID0gZmFrZV9pcnFfZ2VuZXJhdGU7CisJZmFrZV9icmlkZ2UtPmxtX3NldCA9IGZha2VfbG1fc2V0OworCWZha2VfYnJpZGdlLT5sbV9nZXQgPSBmYWtlX2xtX2dldDsKKwlmYWtlX2JyaWRnZS0+bG1fYXR0YWNoID0gZmFrZV9sbV9hdHRhY2g7CisJZmFrZV9icmlkZ2UtPmxtX2RldGFjaCA9IGZha2VfbG1fZGV0YWNoOworCWZha2VfYnJpZGdlLT5zbG90X2dldCA9IGZha2Vfc2xvdF9nZXQ7CisJZmFrZV9icmlkZ2UtPmFsbG9jX2NvbnNpc3RlbnQgPSBmYWtlX2FsbG9jX2NvbnNpc3RlbnQ7CisJZmFrZV9icmlkZ2UtPmZyZWVfY29uc2lzdGVudCA9IGZha2VfZnJlZV9jb25zaXN0ZW50OworCisJcHJfaW5mbygiQm9hcmQgaXMlcyB0aGUgVk1FIHN5c3RlbSBjb250cm9sbGVyXG4iLAorCQkJKGdlb2lkID09IDEpID8gIiIgOiAiIG5vdCIpOworCisJcHJfaW5mbygiVk1FIGdlb2dyYXBoaWNhbCBhZGRyZXNzIGlzIHNldCB0byAlZFxuIiwgZ2VvaWQpOworCisJcmV0dmFsID0gZmFrZV9jcmNzcl9pbml0KGZha2VfYnJpZGdlKTsKKwlpZiAocmV0dmFsKSB7CisJCXByX2VycigiQ1IvQ1NSIGNvbmZpZ3VyYXRpb24gZmFpbGVkLlxuIik7CisJCWdvdG8gZXJyX2NyY3NyOworCX0KKworCXJldHZhbCA9IHZtZV9yZWdpc3Rlcl9icmlkZ2UoZmFrZV9icmlkZ2UpOworCWlmIChyZXR2YWwgIT0gMCkgeworCQlwcl9lcnIoIkNoaXAgUmVnaXN0cmF0aW9uIGZhaWxlZC5cbiIpOworCQlnb3RvIGVycl9yZWc7CisJfQorCisJZXhpdF9wb2ludGVyID0gZmFrZV9icmlkZ2U7CisKKwlyZXR1cm4gMDsKKworZXJyX3JlZzoKKwlmYWtlX2NyY3NyX2V4aXQoZmFrZV9icmlkZ2UpOworZXJyX2NyY3NyOgorZXJyX2xtOgorCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sICZmYWtlX2JyaWRnZS0+bG1fcmVzb3VyY2VzKSB7CisJCWxtID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UsIGxpc3QpOworCQlsaXN0X2RlbChwb3MpOworCQlrZnJlZShsbSk7CisJfQorZXJyX3NsYXZlOgorCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sICZmYWtlX2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSB7CisJCXNsYXZlX2ltYWdlID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UsIGxpc3QpOworCQlsaXN0X2RlbChwb3MpOworCQlrZnJlZShzbGF2ZV9pbWFnZSk7CisJfQorZXJyX21hc3RlcjoKKwkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuLCAmZmFrZV9icmlkZ2UtPm1hc3Rlcl9yZXNvdXJjZXMpIHsKKwkJbWFzdGVyX2ltYWdlID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlLAorCQkJCWxpc3QpOworCQlsaXN0X2RlbChwb3MpOworCQlrZnJlZShtYXN0ZXJfaW1hZ2UpOworCX0KKworCWtmcmVlKGZha2VfZGV2aWNlKTsKK2Vycl9kcml2ZXI6CisJa2ZyZWUoZmFrZV9icmlkZ2UpOworZXJyX3N0cnVjdDoKKwlyZXR1cm4gcmV0dmFsOworCit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGZha2VfZXhpdCh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcyA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wbGlzdDsKKwlzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqbWFzdGVyX2ltYWdlOworCXN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UgKnNsYXZlX2ltYWdlOworCWludCBpOworCXN0cnVjdCB2bWVfYnJpZGdlICpmYWtlX2JyaWRnZTsKKwlzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZTsKKworCWZha2VfYnJpZGdlID0gZXhpdF9wb2ludGVyOworCisJYnJpZGdlID0gZmFrZV9icmlkZ2UtPmRyaXZlcl9wcml2OworCisJcHJfZGVidWcoIkRyaXZlciBpcyBiZWluZyB1bmxvYWRlZC5cbiIpOworCisJLyoKKwkgKiAgU2h1dGRvd24gYWxsIGluYm91bmQgYW5kIG91dGJvdW5kIHdpbmRvd3MuCisJICovCisJZm9yIChpID0gMDsgaSA8IEZBS0VfTUFYX01BU1RFUjsgaSsrKQorCQlicmlkZ2UtPm1hc3RlcnNbaV0uZW5hYmxlZCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgRkFLRV9NQVhfU0xBVkU7IGkrKykKKwkJYnJpZGdlLT5zbGF2ZXNbaV0uZW5hYmxlZCA9IDA7CisKKwkvKgorCSAqICBTaHV0ZG93biBMb2NhdGlvbiBtb25pdG9yLgorCSAqLworCWJyaWRnZS0+bG1fZW5hYmxlZCA9IDA7CisKKwl2bWVfdW5yZWdpc3Rlcl9icmlkZ2UoZmFrZV9icmlkZ2UpOworCisJZmFrZV9jcmNzcl9leGl0KGZha2VfYnJpZGdlKTsKKwkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0bXBsaXN0LCAmZmFrZV9icmlkZ2UtPnNsYXZlX3Jlc291cmNlcykgeworCQlzbGF2ZV9pbWFnZSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlLCBsaXN0KTsKKwkJbGlzdF9kZWwocG9zKTsKKwkJa2ZyZWUoc2xhdmVfaW1hZ2UpOworCX0KKworCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcGxpc3QsICZmYWtlX2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcykgeworCQltYXN0ZXJfaW1hZ2UgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UsCisJCQkJbGlzdCk7CisJCWxpc3RfZGVsKHBvcyk7CisJCWtmcmVlKG1hc3Rlcl9pbWFnZSk7CisJfQorCisJa2ZyZWUoZmFrZV9icmlkZ2UtPmRyaXZlcl9wcml2KTsKKworCWtmcmVlKGZha2VfYnJpZGdlKTsKKworCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIodm1lX3Jvb3QpOworfQorCisKK01PRFVMRV9QQVJNX0RFU0MoZ2VvaWQsICJTZXQgZ2VvZ3JhcGhpY2FsIGFkZHJlc3NpbmciKTsKK21vZHVsZV9wYXJhbShnZW9pZCwgaW50LCAwKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJGYWtlIFZNRSBicmlkZ2UgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGZha2VfaW5pdCk7Cittb2R1bGVfZXhpdChmYWtlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMgYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYwppbmRleCA0YmM1ZDQ1Li5mYzFiNjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYworKysgYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYwpAQCAtNTAsNiArNTAsOCBAQAogCXsgfSwKIH07CiAKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB0c2kxNDhfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHRzaTE0OF9kcml2ZXIgPSB7CiAJLm5hbWUgPSBkcml2ZXJfbmFtZSwKIAkuaWRfdGFibGUgPSB0c2kxNDhfaWRzLApAQCAtMTAyLDcgKzEwNCw3IEBACiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQlpZiAoc3RhdCAmIFRTSTE0OF9MQ1NSX0lOVFNfTE1TW2ldKSB7CiAJCQkvKiBXZSBvbmx5IGVuYWJsZSBpbnRlcnJ1cHRzIGlmIHRoZSBjYWxsYmFjayBpcyBzZXQgKi8KLQkJCWJyaWRnZS0+bG1fY2FsbGJhY2tbaV0oaSk7CisJCQlicmlkZ2UtPmxtX2NhbGxiYWNrW2ldKGJyaWRnZS0+bG1fZGF0YVtpXSk7CiAJCQlzZXJ2aWNlZCB8PSBUU0kxNDhfTENTUl9JTlRDX0xNQ1tpXTsKIAkJfQogCX0KQEAgLTIwNDcsNyArMjA0OSw3IEBACiAgKiBDYWxsYmFjayB3aWxsIGJlIHBhc3NlZCB0aGUgbW9uaXRvciB0cmlnZ2VyZWQuCiAgKi8KIHN0YXRpYyBpbnQgdHNpMTQ4X2xtX2F0dGFjaChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgaW50IG1vbml0b3IsCi0Jdm9pZCAoKmNhbGxiYWNrKShpbnQpKQorCXZvaWQgKCpjYWxsYmFjaykodm9pZCAqKSwgdm9pZCAqZGF0YSkKIHsKIAl1MzIgbG1fY3RsLCB0bXA7CiAJc3RydWN0IHZtZV9icmlkZ2UgKnRzaTE0OF9icmlkZ2U7CkBAIC0yMDc3LDYgKzIwNzksNyBAQAogCiAJLyogQXR0YWNoIGNhbGxiYWNrICovCiAJYnJpZGdlLT5sbV9jYWxsYmFja1ttb25pdG9yXSA9IGNhbGxiYWNrOworCWJyaWRnZS0+bG1fZGF0YVttb25pdG9yXSA9IGRhdGE7CiAKIAkvKiBFbmFibGUgTG9jYXRpb24gTW9uaXRvciBpbnRlcnJ1cHQgKi8KIAl0bXAgPSBpb3JlYWQzMmJlKGJyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVOKTsKQEAgLTIxMjQsNiArMjEyNyw3IEBACiAKIAkvKiBEZXRhY2ggY2FsbGJhY2sgKi8KIAlicmlkZ2UtPmxtX2NhbGxiYWNrW21vbml0b3JdID0gTlVMTDsKKwlicmlkZ2UtPmxtX2RhdGFbbW9uaXRvcl0gPSBOVUxMOwogCiAJLyogSWYgYWxsIGxvY2F0aW9uIG1vbml0b3JzIGRpc2FibGVkLCBkaXNhYmxlIGdsb2JhbCBMb2NhdGlvbiBNb25pdG9yICovCiAJaWYgKChsbV9lbiAmIChUU0kxNDhfTENTUl9JTlRTX0xNMFMgfCBUU0kxNDhfTENTUl9JTlRTX0xNMVMgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmggYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguaAppbmRleCBmNWVkMTQzLi4wOTM1ZDg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguaAorKysgYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguaApAQCAtMzgsNyArMzgsOCBAQAogCXZvaWQgX19pb21lbSAqYmFzZTsJLyogQmFzZSBBZGRyZXNzIG9mIGRldmljZSByZWdpc3RlcnMgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBkbWFfcXVldWVbMl07CiAJd2FpdF9xdWV1ZV9oZWFkX3QgaWFja19xdWV1ZTsKLQl2b2lkICgqbG1fY2FsbGJhY2tbNF0pKGludCk7CS8qIENhbGxlZCBpbiBpbnRlcnJ1cHQgaGFuZGxlciAqLworCXZvaWQgKCpsbV9jYWxsYmFja1s0XSkodm9pZCAqKTsJLyogQ2FsbGVkIGluIGludGVycnVwdCBoYW5kbGVyICovCisJdm9pZCAqbG1fZGF0YVs0XTsKIAl2b2lkICpjcmNzcl9rZXJuZWw7CiAJZG1hX2FkZHJfdCBjcmNzcl9idXM7CiAJc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmZsdXNoX2ltYWdlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92bWUvdm1lLmMgYi9kcml2ZXJzL3ZtZS92bWUuYwppbmRleCAzN2FjMGE1Li4xNWI2NDA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZtZS92bWUuYworKysgYi9kcml2ZXJzL3ZtZS92bWUuYwpAQCAtMTMsOCArMTMsOCBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMzksNyArMzksNiBAQAogc3RhdGljIExJU1RfSEVBRCh2bWVfYnVzX2xpc3QpOwogc3RhdGljIERFRklORV9NVVRFWCh2bWVfYnVzZXNfbG9jayk7CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCB2bWVfZXhpdCh2b2lkKTsKIHN0YXRpYyBpbnQgX19pbml0IHZtZV9pbml0KHZvaWQpOwogCiBzdGF0aWMgc3RydWN0IHZtZV9kZXYgKmRldl90b192bWVfZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTEzMjEsNyArMTMyMCw3IEBACiBFWFBPUlRfU1lNQk9MKHZtZV9sbV9nZXQpOwogCiBpbnQgdm1lX2xtX2F0dGFjaChzdHJ1Y3Qgdm1lX3Jlc291cmNlICpyZXNvdXJjZSwgaW50IG1vbml0b3IsCi0Jdm9pZCAoKmNhbGxiYWNrKShpbnQpKQorCXZvaWQgKCpjYWxsYmFjaykodm9pZCAqKSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgdm1lX2JyaWRnZSAqYnJpZGdlID0gZmluZF9icmlkZ2UocmVzb3VyY2UpOwogCXN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtOwpAQCAtMTMzOCw3ICsxMzM3LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0dXJuIGJyaWRnZS0+bG1fYXR0YWNoKGxtLCBtb25pdG9yLCBjYWxsYmFjayk7CisJcmV0dXJuIGJyaWRnZS0+bG1fYXR0YWNoKGxtLCBtb25pdG9yLCBjYWxsYmFjaywgZGF0YSk7CiB9CiBFWFBPUlRfU1lNQk9MKHZtZV9sbV9hdHRhY2gpOwogCkBAIC0xNjIyLDI1ICsxNjIxLDEwIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGludCB2bWVfYnVzX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IHJldHZhbCA9IC1FTk9ERVY7Ci0Jc3RydWN0IHZtZV9kcml2ZXIgKmRyaXZlcjsKLQlzdHJ1Y3Qgdm1lX2RldiAqdmRldiA9IGRldl90b192bWVfZGV2KGRldik7Ci0KLQlkcml2ZXIgPSBkZXYtPnBsYXRmb3JtX2RhdGE7Ci0KLQlpZiAoZHJpdmVyLT5yZW1vdmUgIT0gTlVMTCkKLQkJcmV0dmFsID0gZHJpdmVyLT5yZW1vdmUodmRldik7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCiBzdHJ1Y3QgYnVzX3R5cGUgdm1lX2J1c190eXBlID0gewogCS5uYW1lID0gInZtZSIsCiAJLm1hdGNoID0gdm1lX2J1c19tYXRjaCwKIAkucHJvYmUgPSB2bWVfYnVzX3Byb2JlLAotCS5yZW1vdmUgPSB2bWVfYnVzX3JlbW92ZSwKIH07CiBFWFBPUlRfU1lNQk9MKHZtZV9idXNfdHlwZSk7CiAKQEAgLTE2NDgsMTEgKzE2MzIsNCBAQAogewogCXJldHVybiBidXNfcmVnaXN0ZXIoJnZtZV9idXNfdHlwZSk7CiB9Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB2bWVfZXhpdCh2b2lkKQotewotCWJ1c191bnJlZ2lzdGVyKCZ2bWVfYnVzX3R5cGUpOwotfQotCiBzdWJzeXNfaW5pdGNhbGwodm1lX2luaXQpOwotbW9kdWxlX2V4aXQodm1lX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92bWUvdm1lX2JyaWRnZS5oIGIvZHJpdmVycy92bWUvdm1lX2JyaWRnZS5oCmluZGV4IGNiODI0NmYuLjI2NjJlOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdm1lL3ZtZV9icmlkZ2UuaAorKysgYi9kcml2ZXJzL3ZtZS92bWVfYnJpZGdlLmgKQEAgLTE2MCw3ICsxNjAsOCBAQAogCWludCAoKmxtX3NldCkgKHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKiwgdW5zaWduZWQgbG9uZyBsb25nLCB1MzIsIHUzMik7CiAJaW50ICgqbG1fZ2V0KSAoc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqLCB1bnNpZ25lZCBsb25nIGxvbmcgKiwgdTMyICosCiAJCXUzMiAqKTsKLQlpbnQgKCpsbV9hdHRhY2gpIChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICosIGludCwgdm9pZCAoKmNhbGxiYWNrKShpbnQpKTsKKwlpbnQgKCpsbV9hdHRhY2gpKHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKiwgaW50LAorCQkJIHZvaWQgKCpjYWxsYmFjaykodm9pZCAqKSwgdm9pZCAqKTsKIAlpbnQgKCpsbV9kZXRhY2gpIChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICosIGludCk7CiAKIAkvKiBDUi9DU1Igc3BhY2UgZnVuY3Rpb25zICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3NsYXZlcy93MV90aGVybS5jIGIvZHJpdmVycy93MS9zbGF2ZXMvdzFfdGhlcm0uYwppbmRleCA1ODFhMzAwLi44MjYxMWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3NsYXZlcy93MV90aGVybS5jCisrKyBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX3RoZXJtLmMKQEAgLTY2LDcgKzY2LDcgQEAKIAogLyogcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSByZWZjbnQgaW4gdGhlIGZhbWlseSBkYXRhICovCiAjZGVmaW5lIFRIRVJNX1JFRkNOVChmYW1pbHlfZGF0YSkgXAotCSgmKChzdHJ1Y3QgdzFfdGhlcm1fZmFtaWx5X2RhdGEqKWZhbWlseV9kYXRhKS0+cmVmY250KQorCSgmKChzdHJ1Y3QgdzFfdGhlcm1fZmFtaWx5X2RhdGEgKilmYW1pbHlfZGF0YSktPnJlZmNudCkKIAogc3RhdGljIGludCB3MV90aGVybV9hZGRfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCkKIHsKQEAgLTgxLDcgKzgxLDggQEAKIHN0YXRpYyB2b2lkIHcxX3RoZXJtX3JlbW92ZV9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKQogewogCWludCByZWZjbnQgPSBhdG9taWNfc3ViX3JldHVybigxLCBUSEVSTV9SRUZDTlQoc2wtPmZhbWlseV9kYXRhKSk7Ci0Jd2hpbGUocmVmY250KSB7CisKKwl3aGlsZSAocmVmY250KSB7CiAJCW1zbGVlcCgxMDAwKTsKIAkJcmVmY250ID0gYXRvbWljX3JlYWQoVEhFUk1fUkVGQ05UKHNsLT5mYW1pbHlfZGF0YSkpOwogCX0KQEAgLTE1MSw4ICsxNTIsNyBAQAogCS5mb3BzID0gJncxX3RoZXJtX2ZvcHMsCiB9OwogCi1zdHJ1Y3QgdzFfdGhlcm1fZmFtaWx5X2NvbnZlcnRlcgoteworc3RydWN0IHcxX3RoZXJtX2ZhbWlseV9jb252ZXJ0ZXIgewogCXU4CQkJYnJva2VuOwogCXUxNgkJCXJlc2VydmVkOwogCXN0cnVjdCB3MV9mYW1pbHkJKmY7CkBAIC0yOTMsNyArMjkzLDcgQEAKIAl1aW50OF90IHByZWNpc2lvbl9iaXRzOwogCXVpbnQ4X3QgbWFzayA9IDB4NjA7CiAKLQlpZih2YWwgPiAxMiB8fCB2YWwgPCA5KSB7CisJaWYgKHZhbCA+IDEyIHx8IHZhbCA8IDkpIHsKIAkJcHJfd2FybigiVW5zdXBwb3J0ZWQgcHJlY2lzaW9uXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTMzNiw3ICszMzYsOCBAQAogCiAJCQkvKiByZWFkIHZhbHVlcyB0byBvbmx5IGFsdGVyIHByZWNpc2lvbiBiaXRzICovCiAJCQl3MV93cml0ZV84KGRldiwgVzFfUkVBRF9TQ1JBVENIUEFEKTsKLQkJCWlmICgoY291bnQgPSB3MV9yZWFkX2Jsb2NrKGRldiwgcm9tLCA5KSkgIT0gOSkKKwkJCWNvdW50ID0gdzFfcmVhZF9ibG9jayhkZXYsIHJvbSwgOSk7CisJCQlpZiAoY291bnQgIT0gOSkKIAkJCQlkZXZfd2FybihkZXZpY2UsICJ3MV9yZWFkX2Jsb2NrKCkgcmV0dXJuZWQgJXUgaW5zdGVhZCBvZiA5LlxuIiwJY291bnQpOwogCiAJCQljcmMgPSB3MV9jYWxjX2NyYzgocm9tLCA4KTsKQEAgLTM2Niw2ICszNjcsNyBAQAogc3RhdGljIGlubGluZSBpbnQgdzFfRFMxOEIyMF9jb252ZXJ0X3RlbXAodTggcm9tWzldKQogewogCXMxNiB0ID0gbGUxNl90b19jcHVwKChfX2xlMTYgKilyb20pOworCiAJcmV0dXJuIHQqMTAwMC8xNjsKIH0KIApAQCAtNDE1LDcgKzQxNyw3IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodzFfdGhlcm1fZmFtaWxpZXMpOyArK2kpIHsKIAkJaWYgKHcxX3RoZXJtX2ZhbWlsaWVzW2ldLmYtPmZpZCA9PSBzbC0+ZmFtaWx5LT5maWQpIHsKIAkJCS8qIHplcm8gdmFsdWUgaW5kaWNhdGVzIHRvIHdyaXRlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB0byBlZXByb20gKi8KLQkJCWlmICgwID09IHZhbCkKKwkJCWlmICh2YWwgPT0gMCkKIAkJCQlyZXQgPSB3MV90aGVybV9mYW1pbGllc1tpXS5lZXByb20oZGV2aWNlKTsKIAkJCWVsc2UKIAkJCQlyZXQgPSB3MV90aGVybV9mYW1pbGllc1tpXS5wcmVjaXNpb24oZGV2aWNlLCB2YWwpOwpAQCAtNDM5LDggKzQ0MSw3IEBACiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIHBvc3RfdW5sb2NrOwogCi0JaWYoIXNsLT5mYW1pbHlfZGF0YSkKLQl7CisJaWYgKCFzbC0+ZmFtaWx5X2RhdGEpIHsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBwcmVfdW5sb2NrOwogCX0KQEAgLTQ5NSw3ICs0OTYsOCBAQAogCQkJaWYgKCF3MV9yZXNldF9zZWxlY3Rfc2xhdmUoc2wpKSB7CiAKIAkJCQl3MV93cml0ZV84KGRldiwgVzFfUkVBRF9TQ1JBVENIUEFEKTsKLQkJCQlpZiAoKGNvdW50ID0gdzFfcmVhZF9ibG9jayhkZXYsIHJvbSwgOSkpICE9IDkpIHsKKwkJCQljb3VudCA9IHcxX3JlYWRfYmxvY2soZGV2LCByb20sIDkpOworCQkJCWlmIChjb3VudCAhPSA5KSB7CiAJCQkJCWRldl93YXJuKGRldmljZSwgIncxX3JlYWRfYmxvY2soKSAiCiAJCQkJCQkicmV0dXJuZWQgJXUgaW5zdGVhZCBvZiA5LlxuIiwKIAkJCQkJCWNvdW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzEuYyBiL2RyaXZlcnMvdzEvdzEuYwppbmRleCBiYjM0MzYyLi5lMjEzYzY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxLmMKKysrIGIvZHJpdmVycy93MS93MS5jCkBAIC01Myw4ICs1Myw4IEBACiBtb2R1bGVfcGFyYW1fbmFtZWQodGltZW91dCwgdzFfdGltZW91dCwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgInRpbWUgaW4gc2Vjb25kcyBiZXR3ZWVuIGF1dG9tYXRpYyBzbGF2ZSBzZWFyY2hlcyIpOwogbW9kdWxlX3BhcmFtX25hbWVkKHRpbWVvdXRfdXMsIHcxX3RpbWVvdXRfdXMsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsICJ0aW1lIGluIG1pY3Jvc2Vjb25kcyBiZXR3ZWVuIGF1dG9tYXRpYyBzbGF2ZSIKLQkJICAgICAgICAgICIgc2VhcmNoZXMiKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dF91cywKKwkJICJ0aW1lIGluIG1pY3Jvc2Vjb25kcyBiZXR3ZWVuIGF1dG9tYXRpYyBzbGF2ZSBzZWFyY2hlcyIpOwogLyogQSBzZWFyY2ggc3RvcHMgd2hlbiB3MV9tYXhfc2xhdmVfY291bnQgZGV2aWNlcyBoYXZlIGJlZW4gZm91bmQgaW4gdGhhdAogICogc2VhcmNoLiAgVGhlIG5leHQgc2VhcmNoIHdpbGwgc3RhcnQgb3ZlciBhbmQgZGV0ZWN0IHRoZSBzYW1lIHNldCBvZiBkZXZpY2VzCiAgKiBvbiBhIHN0YXRpYyAxLXdpcmUgYnVzLiAgTWVtb3J5IGlzIG5vdCBhbGxvY2F0ZWQgYmFzZWQgb24gdGhpcyBudW1iZXIsIGp1c3QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZyBiL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZwppbmRleCAxYmZmZTAwLi41MGRiYWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKKysrIGIvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCkBAIC0xNTIsNiArMTUyLDE5IEBACiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBiZSBidWlsdCBhcyBhIG1vZHVsZS4gVGhlIG1vZHVsZSBuYW1lIGlzIHRhbmdveF93ZHQuCiAKK2NvbmZpZyBXREFUX1dEVAorCXRyaXN0YXRlICJBQ1BJIFdhdGNoZG9nIEFjdGlvbiBUYWJsZSAoV0RBVCkiCisJZGVwZW5kcyBvbiBBQ1BJCisJc2VsZWN0IEFDUElfV0FUQ0hET0cKKwloZWxwCisJICBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIHN5c3RlbXMgd2l0aCBBQ1BJIFdhdGNoZG9nIEFjdGlvbgorCSAgVGFibGUgKFdEQVQpIHRhYmxlLiBTZXJ2ZXJzIHR5cGljYWxseSBoYXZlIHRoaXMgYnV0IGl0IGNhbiBiZQorCSAgZm91bmQgb24gc29tZSBkZXNrdG9wIG1hY2hpbmVzIGFzIHdlbGwuIFRoaXMgZHJpdmVyIHdpbGwgdGFrZQorCSAgb3ZlciB0aGUgbmF0aXZlIGlUQ08gd2F0Y2hkb2cgZHJpdmVyIGZvdW5kIG9uIG1hbnkgSW50ZWwgQ1BVcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIHdkYXRfd2R0LgorCiBjb25maWcgV004MzFYX1dBVENIRE9HCiAJdHJpc3RhdGUgIldNODMxeCB3YXRjaGRvZyIKIAlkZXBlbmRzIG9uIE1GRF9XTTgzMVgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUgYi9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlCmluZGV4IGMyMmFkM2UuLmNiYTAwNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUKKysrIGIvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQpAQCAtMjAyLDYgKzIwMiw3IEBACiBvYmotJChDT05GSUdfREE5MDYzX1dBVENIRE9HKSArPSBkYTkwNjNfd2R0Lm8KIG9iai0kKENPTkZJR19HUElPX1dBVENIRE9HKQkrPSBncGlvX3dkdC5vCiBvYmotJChDT05GSUdfVEFOR09YX1dBVENIRE9HKSArPSB0YW5nb3hfd2R0Lm8KK29iai0kKENPTkZJR19XREFUX1dEVCkgKz0gd2RhdF93ZHQubwogb2JqLSQoQ09ORklHX1dNODMxWF9XQVRDSERPRykgKz0gd204MzF4X3dkdC5vCiBvYmotJChDT05GSUdfV004MzUwX1dBVENIRE9HKSArPSB3bTgzNTBfd2R0Lm8KIG9iai0kKENPTkZJR19NQVg2M1hYX1dBVENIRE9HKSArPSBtYXg2M3h4X3dkdC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3Bjd2RfdXNiLmMgYi9kcml2ZXJzL3dhdGNoZG9nL3Bjd2RfdXNiLmMKaW5kZXggNjg5NTJkOS4uOTllYmY2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9wY3dkX3VzYi5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvcGN3ZF91c2IuYwpAQCAtNjY2LDEwICs2NjYsOCBAQAogCiAJLyogYWxsb2NhdGUgdGhlIHVyYidzICovCiAJdXNiX3Bjd2QtPmludHJfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXVzYl9wY3dkLT5pbnRyX3VyYikgewotCQlwcl9lcnIoIk91dCBvZiBtZW1vcnlcbiIpOworCWlmICghdXNiX3Bjd2QtPmludHJfdXJiKQogCQlnb3RvIGVycm9yOwotCX0KIAogCS8qIGluaXRpYWxpc2UgdGhlIGludHIgdXJiJ3MgKi8KIAl1c2JfZmlsbF9pbnRfdXJiKHVzYl9wY3dkLT5pbnRyX3VyYiwgdWRldiwgcGlwZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvd2RhdF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvd2RhdF93ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDczZTNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy93YXRjaGRvZy93ZGF0X3dkdC5jCkBAIC0wLDAgKzEsNTI2IEBACisvKgorICogQUNQSSBIYXJkd2FyZSBXYXRjaGRvZyAoV0RBVCkgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiwgSW50ZWwgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogTWlrYSBXZXN0ZXJiZXJnIDxtaWthLndlc3RlcmJlcmdAbGludXguaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisKKyNkZWZpbmUgTUFYX1dEQVRfQUNUSU9OUyBBQ1BJX1dEQVRfQUNUSU9OX1JFU0VSVkVECisKKy8qKgorICogc3RydWN0IHdkYXRfaW5zdHJ1Y3Rpb24gLSBTaW5nbGUgQUNQSSBXREFUIGluc3RydWN0aW9uCisgKiBAZW50cnk6IENvcHkgb2YgdGhlIEFDUEkgdGFibGUgaW5zdHJ1Y3Rpb24KKyAqIEByZWc6IFJlZ2lzdGVyIHRoZSBpbnN0cnVjdGlvbiBpcyBhY2Nlc3NpbmcKKyAqIEBub2RlOiBOZXh0IGluc3RydWN0aW9uIGluIGFjdGlvbiBzZXF1ZW5jZQorICovCitzdHJ1Y3Qgd2RhdF9pbnN0cnVjdGlvbiB7CisJc3RydWN0IGFjcGlfd2RhdF9lbnRyeSBlbnRyeTsKKwl2b2lkIF9faW9tZW0gKnJlZzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7Cit9OworCisvKioKKyAqIHN0cnVjdCB3ZGF0X3dkdCAtIEFDUEkgV0RBVCB3YXRjaGRvZyBkZXZpY2UKKyAqIEBwZGV2OiBQYXJlbnQgcGxhdGZvcm0gZGV2aWNlCisgKiBAd2RkOiBXYXRjaGRvZyBjb3JlIGRldmljZQorICogQHBlcmlvZDogSG93IGxvbmcgaXMgb25lIHdhdGNoZG9nIHBlcmlvZCBpbiBtcworICogQHN0b3BwZWRfaW5fc2xlZXA6IElzIHRoaXMgd2F0Y2hkb2cgc3RvcHBlZCBieSB0aGUgZmlybXdhcmUgaW4gUzEtUzUKKyAqIEBzdG9wcGVkOiBXYXMgdGhlIHdhdGNoZG9nIHN0b3BwZWQgYnkgdGhlIGRyaXZlciBpbiBzdXNwZW5kCisgKiBAYWN0aW9uczogQW4gYXJyYXkgb2YgaW5zdHJ1Y3Rpb24gbGlzdHMgaW5kZXhlZCBieSBhbiBhY3Rpb24gbnVtYmVyIGZyb20KKyAqICAgICAgICAgICB0aGUgV0RBVCB0YWJsZS4gVGhlcmUgY2FuIGJlICVOVUxMIGVudHJpZXMgZm9yIG5vdCBpbXBsZW1lbnRlZAorICogICAgICAgICAgIGFjdGlvbnMuCisgKi8KK3N0cnVjdCB3ZGF0X3dkdCB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlIHdkZDsKKwl1bnNpZ25lZCBpbnQgcGVyaW9kOworCWJvb2wgc3RvcHBlZF9pbl9zbGVlcDsKKwlib29sIHN0b3BwZWQ7CisJc3RydWN0IGxpc3RfaGVhZCAqaW5zdHJ1Y3Rpb25zW01BWF9XREFUX0FDVElPTlNdOworfTsKKworI2RlZmluZSB0b193ZGF0X3dkdCh3ZGQpIGNvbnRhaW5lcl9vZih3ZGQsIHN0cnVjdCB3ZGF0X3dkdCwgd2RkKQorCitzdGF0aWMgYm9vbCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9IgorCQkgX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX05PV0FZT1VUKSAiKSIpOworCitzdGF0aWMgaW50IHdkYXRfd2R0X3JlYWQoc3RydWN0IHdkYXRfd2R0ICp3ZGF0LAorCSBjb25zdCBzdHJ1Y3Qgd2RhdF9pbnN0cnVjdGlvbiAqaW5zdHIsIHUzMiAqdmFsdWUpCit7CisJY29uc3Qgc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpnYXMgPSAmaW5zdHItPmVudHJ5LnJlZ2lzdGVyX3JlZ2lvbjsKKworCXN3aXRjaCAoZ2FzLT5hY2Nlc3Nfd2lkdGgpIHsKKwljYXNlIDE6CisJCSp2YWx1ZSA9IGlvcmVhZDgoaW5zdHItPnJlZyk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJKnZhbHVlID0gaW9yZWFkMTYoaW5zdHItPnJlZyk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJKnZhbHVlID0gaW9yZWFkMzIoaW5zdHItPnJlZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9kYmcoJndkYXQtPnBkZXYtPmRldiwgIlJlYWQgJSN4IGZyb20gMHglMDhsbHhcbiIsICp2YWx1ZSwKKwkJZ2FzLT5hZGRyZXNzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdkYXRfd2R0X3dyaXRlKHN0cnVjdCB3ZGF0X3dkdCAqd2RhdCwKKwljb25zdCBzdHJ1Y3Qgd2RhdF9pbnN0cnVjdGlvbiAqaW5zdHIsIHUzMiB2YWx1ZSkKK3sKKwljb25zdCBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKmdhcyA9ICZpbnN0ci0+ZW50cnkucmVnaXN0ZXJfcmVnaW9uOworCisJc3dpdGNoIChnYXMtPmFjY2Vzc193aWR0aCkgeworCWNhc2UgMToKKwkJaW93cml0ZTgoKHU4KXZhbHVlLCBpbnN0ci0+cmVnKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpb3dyaXRlMTYoKHUxNil2YWx1ZSwgaW5zdHItPnJlZyk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaW93cml0ZTMyKHZhbHVlLCBpbnN0ci0+cmVnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZygmd2RhdC0+cGRldi0+ZGV2LCAiV3JvdGUgJSN4IHRvIDB4JTA4bGx4XG4iLCB2YWx1ZSwKKwkJZ2FzLT5hZGRyZXNzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdkYXRfd2R0X3J1bl9hY3Rpb24oc3RydWN0IHdkYXRfd2R0ICp3ZGF0LCB1bnNpZ25lZCBpbnQgYWN0aW9uLAorCQkJICAgICAgIHUzMiBwYXJhbSwgdTMyICpyZXR2YWwpCit7CisJc3RydWN0IHdkYXRfaW5zdHJ1Y3Rpb24gKmluc3RyOworCisJaWYgKGFjdGlvbiA+PSBBUlJBWV9TSVpFKHdkYXQtPmluc3RydWN0aW9ucykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCF3ZGF0LT5pbnN0cnVjdGlvbnNbYWN0aW9uXSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJZGV2X2RiZygmd2RhdC0+cGRldi0+ZGV2LCAiUnVubmluZyBhY3Rpb24gJSN4XG4iLCBhY3Rpb24pOworCisJLyogUnVuIGVhY2ggaW5zdHJ1Y3Rpb24gc2VxdWVudGlhbGx5ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbnN0ciwgd2RhdC0+aW5zdHJ1Y3Rpb25zW2FjdGlvbl0sIG5vZGUpIHsKKwkJY29uc3Qgc3RydWN0IGFjcGlfd2RhdF9lbnRyeSAqZW50cnkgPSAmaW5zdHItPmVudHJ5OworCQljb25zdCBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKmdhczsKKwkJdTMyIGZsYWdzLCB2YWx1ZSwgbWFzaywgeCwgeTsKKwkJYm9vbCBwcmVzZXJ2ZTsKKwkJaW50IHJldDsKKworCQlnYXMgPSAmZW50cnktPnJlZ2lzdGVyX3JlZ2lvbjsKKworCQlwcmVzZXJ2ZSA9IGVudHJ5LT5pbnN0cnVjdGlvbiAmIEFDUElfV0RBVF9QUkVTRVJWRV9SRUdJU1RFUjsKKwkJZmxhZ3MgPSBlbnRyeS0+aW5zdHJ1Y3Rpb24gJiB+QUNQSV9XREFUX1BSRVNFUlZFX1JFR0lTVEVSOworCQl2YWx1ZSA9IGVudHJ5LT52YWx1ZTsKKwkJbWFzayA9IGVudHJ5LT5tYXNrOworCisJCXN3aXRjaCAoZmxhZ3MpIHsKKwkJY2FzZSBBQ1BJX1dEQVRfUkVBRF9WQUxVRToKKwkJCXJldCA9IHdkYXRfd2R0X3JlYWQod2RhdCwgaW5zdHIsICZ4KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJCXggPj49IGdhcy0+Yml0X29mZnNldDsKKwkJCXggJj0gbWFzazsKKwkJCWlmIChyZXR2YWwpCisJCQkJKnJldHZhbCA9IHggPT0gdmFsdWU7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfV0RBVF9SRUFEX0NPVU5URE9XTjoKKwkJCXJldCA9IHdkYXRfd2R0X3JlYWQod2RhdCwgaW5zdHIsICZ4KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJCXggPj49IGdhcy0+Yml0X29mZnNldDsKKwkJCXggJj0gbWFzazsKKwkJCWlmIChyZXR2YWwpCisJCQkJKnJldHZhbCA9IHg7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfV0RBVF9XUklURV9WQUxVRToKKwkJCXggPSB2YWx1ZSAmIG1hc2s7CisJCQl4IDw8PSBnYXMtPmJpdF9vZmZzZXQ7CisJCQlpZiAocHJlc2VydmUpIHsKKwkJCQlyZXQgPSB3ZGF0X3dkdF9yZWFkKHdkYXQsIGluc3RyLCAmeSk7CisJCQkJaWYgKHJldCkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl5ID0geSAmIH4obWFzayA8PCBnYXMtPmJpdF9vZmZzZXQpOworCQkJCXggfD0geTsKKwkJCX0KKwkJCXJldCA9IHdkYXRfd2R0X3dyaXRlKHdkYXQsIGluc3RyLCB4KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9XREFUX1dSSVRFX0NPVU5URE9XTjoKKwkJCXggPSBwYXJhbTsKKwkJCXggJj0gbWFzazsKKwkJCXggPDw9IGdhcy0+Yml0X29mZnNldDsKKwkJCWlmIChwcmVzZXJ2ZSkgeworCQkJCXJldCA9IHdkYXRfd2R0X3JlYWQod2RhdCwgaW5zdHIsICZ5KTsKKwkJCQlpZiAocmV0KQorCQkJCQlyZXR1cm4gcmV0OworCQkJCXkgPSB5ICYgfihtYXNrIDw8IGdhcy0+Yml0X29mZnNldCk7CisJCQkJeCB8PSB5OworCQkJfQorCQkJcmV0ID0gd2RhdF93ZHRfd3JpdGUod2RhdCwgaW5zdHIsIHgpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoJndkYXQtPnBkZXYtPmRldiwgIlVua25vd24gaW5zdHJ1Y3Rpb246ICV1XG4iLAorCQkJCWZsYWdzKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2RhdF93ZHRfZW5hYmxlX3JlYm9vdChzdHJ1Y3Qgd2RhdF93ZHQgKndkYXQpCit7CisJaW50IHJldDsKKworCS8qCisJICogV0RBVCBzcGVjaWZpY2F0aW9uIHNheXMgdGhhdCB0aGUgd2F0Y2hkb2cgaXMgcmVxdWlyZWQgdG8gcmVib290CisJICogdGhlIHN5c3RlbSB3aGVuIGl0IGZpcmVzLiBIb3dldmVyLCBpdCBhbHNvIHN0YXRlcyB0aGF0IGl0IGlzCisJICogcmVjb21tZWRlZCB0byBtYWtlIGl0IGNvbmZpZ3VyYWJsZSB0aHJvdWdoIGhhcmR3YXJlIHJlZ2lzdGVyLiBXZQorCSAqIGVuYWJsZSByZWJvb3Qgbm93IGlmIGl0IGlzIGNvbmZpZ3JhYmxlLCBqdXN0IGluIGNhc2UuCisJICovCisJcmV0ID0gd2RhdF93ZHRfcnVuX2FjdGlvbih3ZGF0LCBBQ1BJX1dEQVRfU0VUX1JFQk9PVCwgMCwgTlVMTCk7CisJaWYgKHJldCAmJiByZXQgIT0gLUVPUE5PVFNVUFApIHsKKwkJZGV2X2Vycigmd2RhdC0+cGRldi0+ZGV2LAorCQkJIkZhaWxlZCB0byBlbmFibGUgcmVib290IHdoZW4gd2F0Y2hkb2cgdHJpZ2dlcnNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3ZGF0X3dkdF9ib290X3N0YXR1cyhzdHJ1Y3Qgd2RhdF93ZHQgKndkYXQpCit7CisJdTMyIGJvb3Rfc3RhdHVzID0gMDsKKwlpbnQgcmV0OworCisJcmV0ID0gd2RhdF93ZHRfcnVuX2FjdGlvbih3ZGF0LCBBQ1BJX1dEQVRfR0VUX1NUQVRVUywgMCwgJmJvb3Rfc3RhdHVzKTsKKwlpZiAocmV0ICYmIHJldCAhPSAtRU9QTk9UU1VQUCkgeworCQlkZXZfZXJyKCZ3ZGF0LT5wZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVhZCBib290IHN0YXR1c1xuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYm9vdF9zdGF0dXMpCisJCXdkYXQtPndkZC5ib290c3RhdHVzID0gV0RJT0ZfQ0FSRFJFU0VUOworCisJLyogQ2xlYXIgdGhlIGJvb3Qgc3RhdHVzIGluIGNhc2UgQklPUyBkaWQgbm90IGRvIGl0ICovCisJcmV0ID0gd2RhdF93ZHRfcnVuX2FjdGlvbih3ZGF0LCBBQ1BJX1dEQVRfU0VUX1NUQVRVUywgMCwgTlVMTCk7CisJaWYgKHJldCAmJiByZXQgIT0gLUVPUE5PVFNVUFApCisJCWRldl9lcnIoJndkYXQtPnBkZXYtPmRldiwgIkZhaWxlZCB0byBjbGVhciBib290IHN0YXR1c1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHdkYXRfd2R0X3NldF9ydW5uaW5nKHN0cnVjdCB3ZGF0X3dkdCAqd2RhdCkKK3sKKwl1MzIgcnVubmluZyA9IDA7CisJaW50IHJldDsKKworCXJldCA9IHdkYXRfd2R0X3J1bl9hY3Rpb24od2RhdCwgQUNQSV9XREFUX0dFVF9SVU5OSU5HX1NUQVRFLCAwLAorCQkJCSAgJnJ1bm5pbmcpOworCWlmIChyZXQgJiYgcmV0ICE9IC1FT1BOT1RTVVBQKQorCQlkZXZfZXJyKCZ3ZGF0LT5wZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVhZCBydW5uaW5nIHN0YXRlXG4iKTsKKworCWlmIChydW5uaW5nKQorCQlzZXRfYml0KFdET0dfSFdfUlVOTklORywgJndkYXQtPndkZC5zdGF0dXMpOworfQorCitzdGF0aWMgaW50IHdkYXRfd2R0X3N0YXJ0KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKK3sKKwlyZXR1cm4gd2RhdF93ZHRfcnVuX2FjdGlvbih0b193ZGF0X3dkdCh3ZGQpLAorCQkJCSAgIEFDUElfV0RBVF9TRVRfUlVOTklOR19TVEFURSwgMCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgd2RhdF93ZHRfc3RvcChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQpCit7CisJcmV0dXJuIHdkYXRfd2R0X3J1bl9hY3Rpb24odG9fd2RhdF93ZHQod2RkKSwKKwkJCQkgICBBQ1BJX1dEQVRfU0VUX1NUT1BQRURfU1RBVEUsIDAsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHdkYXRfd2R0X3Bpbmcoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkKQoreworCXJldHVybiB3ZGF0X3dkdF9ydW5fYWN0aW9uKHRvX3dkYXRfd2R0KHdkZCksIEFDUElfV0RBVF9SRVNFVCwgMCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgd2RhdF93ZHRfc2V0X3RpbWVvdXQoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkLAorCQkJCXVuc2lnbmVkIGludCB0aW1lb3V0KQoreworCXN0cnVjdCB3ZGF0X3dkdCAqd2RhdCA9IHRvX3dkYXRfd2R0KHdkZCk7CisJdW5zaWduZWQgaW50IHBlcmlvZHM7CisJaW50IHJldDsKKworCXBlcmlvZHMgPSB0aW1lb3V0ICogMTAwMCAvIHdkYXQtPnBlcmlvZDsKKwlyZXQgPSB3ZGF0X3dkdF9ydW5fYWN0aW9uKHdkYXQsIEFDUElfV0RBVF9TRVRfQ09VTlRET1dOLCBwZXJpb2RzLCBOVUxMKTsKKwlpZiAoIXJldCkKKwkJd2RkLT50aW1lb3V0ID0gdGltZW91dDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHdkYXRfd2R0X2dldF90aW1lbGVmdChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQpCit7CisJc3RydWN0IHdkYXRfd2R0ICp3ZGF0ID0gdG9fd2RhdF93ZHQod2RkKTsKKwl1MzIgcGVyaW9kcyA9IDA7CisKKwl3ZGF0X3dkdF9ydW5fYWN0aW9uKHdkYXQsIEFDUElfV0RBVF9HRVRfQ09VTlRET1dOLCAwLCAmcGVyaW9kcyk7CisJcmV0dXJuIHBlcmlvZHMgKiB3ZGF0LT5wZXJpb2QgLyAxMDAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX2luZm8gd2RhdF93ZHRfaW5mbyA9IHsKKwkub3B0aW9ucyA9IFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfTUFHSUNDTE9TRSwKKwkuZmlybXdhcmVfdmVyc2lvbiA9IDAsCisJLmlkZW50aXR5ID0gIndkYXRfd2R0IiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfb3BzIHdkYXRfd2R0X29wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuc3RhcnQgPSB3ZGF0X3dkdF9zdGFydCwKKwkuc3RvcCA9IHdkYXRfd2R0X3N0b3AsCisJLnBpbmcgPSB3ZGF0X3dkdF9waW5nLAorCS5zZXRfdGltZW91dCA9IHdkYXRfd2R0X3NldF90aW1lb3V0LAorCS5nZXRfdGltZWxlZnQgPSB3ZGF0X3dkdF9nZXRfdGltZWxlZnQsCit9OworCitzdGF0aWMgaW50IHdkYXRfd2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJY29uc3Qgc3RydWN0IGFjcGlfd2RhdF9lbnRyeSAqZW50cmllczsKKwljb25zdCBzdHJ1Y3QgYWNwaV90YWJsZV93ZGF0ICp0Ymw7CisJc3RydWN0IHdkYXRfd2R0ICp3ZGF0OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXZvaWQgX19pb21lbSAqKnJlZ3M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWludCBpLCByZXQ7CisKKwlzdGF0dXMgPSBhY3BpX2dldF90YWJsZShBQ1BJX1NJR19XREFULCAwLAorCQkJCShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopJnRibCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXdkYXQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp3ZGF0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF3ZGF0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlZ3MgPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwgcGRldi0+bnVtX3Jlc291cmNlcywgc2l6ZW9mKCpyZWdzKSwKKwkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlZ3MpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogV0RBVCBzcGVjaWZpY2F0aW9uIHdhbnRzIHRvIGhhdmUgPj0gMW1zIHBlcmlvZCAqLworCWlmICh0YmwtPnRpbWVyX3BlcmlvZCA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh0YmwtPm1pbl9jb3VudCA+IHRibC0+bWF4X2NvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdkYXQtPnBlcmlvZCA9IHRibC0+dGltZXJfcGVyaW9kOworCXdkYXQtPndkZC5taW5faHdfaGVhcnRiZWF0X21zID0gd2RhdC0+cGVyaW9kICogdGJsLT5taW5fY291bnQ7CisJd2RhdC0+d2RkLm1heF9od19oZWFydGJlYXRfbXMgPSB3ZGF0LT5wZXJpb2QgKiB0YmwtPm1heF9jb3VudDsKKwl3ZGF0LT5zdG9wcGVkX2luX3NsZWVwID0gdGJsLT5mbGFncyAmIEFDUElfV0RBVF9TVE9QUEVEOworCXdkYXQtPndkZC5pbmZvID0gJndkYXRfd2R0X2luZm87CisJd2RhdC0+d2RkLm9wcyA9ICZ3ZGF0X3dkdF9vcHM7CisJd2RhdC0+cGRldiA9IHBkZXY7CisKKwkvKiBSZXF1ZXN0IGFuZCBtYXAgYWxsIHJlc291cmNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBwZGV2LT5udW1fcmVzb3VyY2VzOyBpKyspIHsKKwkJdm9pZCBfX2lvbWVtICpyZWc7CisKKwkJcmVzID0gJnBkZXYtPnJlc291cmNlW2ldOworCQlpZiAocmVzb3VyY2VfdHlwZShyZXMpID09IElPUkVTT1VSQ0VfTUVNKSB7CisJCQlyZWcgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwkJCWlmIChJU19FUlIocmVnKSkKKwkJCQlyZXR1cm4gUFRSX0VSUihyZWcpOworCQl9IGVsc2UgaWYgKHJlc291cmNlX3R5cGUocmVzKSA9PSBJT1JFU09VUkNFX0lPKSB7CisJCQlyZWcgPSBkZXZtX2lvcG9ydF9tYXAoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwgMSk7CisJCQlpZiAoIXJlZykKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuc3VwcG9ydGVkIHJlc291cmNlXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcmVnc1tpXSA9IHJlZzsKKwl9CisKKwllbnRyaWVzID0gKHN0cnVjdCBhY3BpX3dkYXRfZW50cnkgKikodGJsICsgMSk7CisJZm9yIChpID0gMDsgaSA8IHRibC0+ZW50cmllczsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZ2FzOworCQlzdHJ1Y3Qgd2RhdF9pbnN0cnVjdGlvbiAqaW5zdHI7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmluc3RydWN0aW9uczsKKwkJdW5zaWduZWQgaW50IGFjdGlvbjsKKwkJc3RydWN0IHJlc291cmNlIHI7CisJCWludCBqOworCisJCWFjdGlvbiA9IGVudHJpZXNbaV0uYWN0aW9uOworCQlpZiAoYWN0aW9uID49IE1BWF9XREFUX0FDVElPTlMpIHsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgIlNraXBwaW5nIHVua25vd24gYWN0aW9uOiAldVxuIiwKKwkJCQlhY3Rpb24pOworCQkJY29udGludWU7CisJCX0KKworCQlpbnN0ciA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmluc3RyKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW5zdHIpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlJTklUX0xJU1RfSEVBRCgmaW5zdHItPm5vZGUpOworCQlpbnN0ci0+ZW50cnkgPSBlbnRyaWVzW2ldOworCisJCWdhcyA9ICZlbnRyaWVzW2ldLnJlZ2lzdGVyX3JlZ2lvbjsKKworCQltZW1zZXQoJnIsIDAsIHNpemVvZihyKSk7CisJCXIuc3RhcnQgPSBnYXMtPmFkZHJlc3M7CisJCXIuZW5kID0gci5zdGFydCArIGdhcy0+YWNjZXNzX3dpZHRoOworCQlpZiAoZ2FzLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZKSB7CisJCQlyLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisJCX0gZWxzZSBpZiAoZ2FzLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8pIHsKKwkJCXIuZmxhZ3MgPSBJT1JFU09VUkNFX0lPOworCQl9IGVsc2UgeworCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiVW5zdXBwb3J0ZWQgYWRkcmVzcyBzcGFjZTogJWRcbiIsCisJCQkJZ2FzLT5zcGFjZV9pZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEZpbmQgdGhlIG1hdGNoaW5nIHJlc291cmNlICovCisJCWZvciAoaiA9IDA7IGogPCBwZGV2LT5udW1fcmVzb3VyY2VzOyBqKyspIHsKKwkJCXJlcyA9ICZwZGV2LT5yZXNvdXJjZVtqXTsKKwkJCWlmIChyZXNvdXJjZV9jb250YWlucyhyZXMsICZyKSkgeworCQkJCWluc3RyLT5yZWcgPSByZWdzW2pdICsgci5zdGFydCAtIHJlcy0+c3RhcnQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWluc3RyLT5yZWcpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkkvTyByZXNvdXJjZSBub3QgZm91bmRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpbnN0cnVjdGlvbnMgPSB3ZGF0LT5pbnN0cnVjdGlvbnNbYWN0aW9uXTsKKwkJaWYgKCFpbnN0cnVjdGlvbnMpIHsKKwkJCWluc3RydWN0aW9ucyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCQkJCQlzaXplb2YoKmluc3RydWN0aW9ucyksIEdGUF9LRVJORUwpOworCQkJaWYgKCFpbnN0cnVjdGlvbnMpCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCUlOSVRfTElTVF9IRUFEKGluc3RydWN0aW9ucyk7CisJCQl3ZGF0LT5pbnN0cnVjdGlvbnNbYWN0aW9uXSA9IGluc3RydWN0aW9uczsKKwkJfQorCisJCWxpc3RfYWRkX3RhaWwoJmluc3RyLT5ub2RlLCBpbnN0cnVjdGlvbnMpOworCX0KKworCXdkYXRfd2R0X2Jvb3Rfc3RhdHVzKHdkYXQpOworCXdkYXRfd2R0X3NldF9ydW5uaW5nKHdkYXQpOworCisJcmV0ID0gd2RhdF93ZHRfZW5hYmxlX3JlYm9vdCh3ZGF0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgd2RhdCk7CisKKwl3YXRjaGRvZ19zZXRfbm93YXlvdXQoJndkYXQtPndkZCwgbm93YXlvdXQpOworCXJldHVybiBkZXZtX3dhdGNoZG9nX3JlZ2lzdGVyX2RldmljZSgmcGRldi0+ZGV2LCAmd2RhdC0+d2RkKTsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCB3ZGF0X3dkdF9zdXNwZW5kX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHdkYXRfd2R0ICp3ZGF0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IHJldDsKKworCWlmICghd2F0Y2hkb2dfYWN0aXZlKCZ3ZGF0LT53ZGQpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogV2UgbmVlZCB0byBzdG9wIHRoZSB3YXRjaGRvZyBpZiBmaXJtYXJlIGlzIG5vdCBkb2luZyBpdCBvciBpZiB3ZQorCSAqIGFyZSBnb2luZyBzdXNwZW5kIHRvIGlkbGUgKHdoZXJlIGZpcm13YXJlIGlzIG5vdCBpbnZvbHZlZCkuIElmCisJICogZmlybXdhcmUgaXMgc3RvcHBpbmcgdGhlIHdhdGNoZG9nIHdlIGtpY2sgaXQgaGVyZSBvbmUgbW9yZSB0aW1lCisJICogdG8gZ2l2ZSBpdCBzb21lIHRpbWUuCisJICovCisJd2RhdC0+c3RvcHBlZCA9IGZhbHNlOworCWlmIChhY3BpX3RhcmdldF9zeXN0ZW1fc3RhdGUoKSA9PSBBQ1BJX1NUQVRFX1MwIHx8CisJICAgICF3ZGF0LT5zdG9wcGVkX2luX3NsZWVwKSB7CisJCXJldCA9IHdkYXRfd2R0X3N0b3AoJndkYXQtPndkZCk7CisJCWlmICghcmV0KQorCQkJd2RhdC0+c3RvcHBlZCA9IHRydWU7CisJfSBlbHNlIHsKKwkJcmV0ID0gd2RhdF93ZHRfcGluZygmd2RhdC0+d2RkKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdkYXRfd2R0X3Jlc3VtZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCB3ZGF0X3dkdCAqd2RhdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCByZXQ7CisKKwlpZiAoIXdhdGNoZG9nX2FjdGl2ZSgmd2RhdC0+d2RkKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXdkYXQtPnN0b3BwZWQpIHsKKwkJLyoKKwkJICogTG9va3MgbGlrZSB0aGUgYm9vdCBmaXJtd2FyZSByZWluaXRpYWxpemVzIHRoZSB3YXRjaGRvZworCQkgKiBiZWZvcmUgaXQgaGFuZHMgb2ZmIHRvIHRoZSBPUyBvbiByZXN1bWUgZnJvbSBzbGVlcCBzbyB3ZQorCQkgKiBzdG9wIGFuZCByZXByb2dyYW0gdGhlIHdhdGNoZG9nIGhlcmUuCisJCSAqLworCQlyZXQgPSB3ZGF0X3dkdF9zdG9wKCZ3ZGF0LT53ZGQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSB3ZGF0X3dkdF9zZXRfdGltZW91dCgmd2RhdC0+d2RkLCB3ZGF0LT53ZGQudGltZW91dCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IHdkYXRfd2R0X2VuYWJsZV9yZWJvb3Qod2RhdCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiB3ZGF0X3dkdF9zdGFydCgmd2RhdC0+d2RkKTsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgd2RhdF93ZHRfcG1fb3BzID0geworCVNFVF9OT0lSUV9TWVNURU1fU0xFRVBfUE1fT1BTKHdkYXRfd2R0X3N1c3BlbmRfbm9pcnEsCisJCQkJICAgICAgd2RhdF93ZHRfcmVzdW1lX25vaXJxKQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgd2RhdF93ZHRfZHJpdmVyID0geworCS5wcm9iZSA9IHdkYXRfd2R0X3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIndkYXRfd2R0IiwKKwkJLnBtID0gJndkYXRfd2R0X3BtX29wcywKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih3ZGF0X3dkdF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJNaWthIFdlc3RlcmJlcmcgPG1pa2Eud2VzdGVyYmVyZ0BsaW51eC5pbnRlbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFDUEkgSGFyZHdhcmUgV2F0Y2hkb2cgKFdEQVQpIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp3ZGF0X3dkdCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19kZXZfZnJvbnRlbmQuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfZGV2X2Zyb250ZW5kLmMKaW5kZXggNzQ4Nzk3MS4uYzEwMTBmMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfZGV2X2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19kZXZfZnJvbnRlbmQuYwpAQCAtMzE2LDcgKzMxNiw3IEBACiAJCQlyYyA9IC1FTk9NRU07CiAJCQlnb3RvIG91dDsKIAkJfQotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChtc2dfdHlwZSA9PSBYU19UUkFOU0FDVElPTl9FTkQpIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywgJnUtPnRyYW5zYWN0aW9ucywgbGlzdCkKIAkJCWlmICh0cmFucy0+aGFuZGxlLmlkID09IHUtPnUubXNnLnR4X2lkKQogCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tjb25maWcKaW5kZXggMmJjN2FkNy4uM2VmNjJiYSAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC03OSw2ICs3OSw3IEBACiBjb25maWcgRklMRV9MT0NLSU5HCiAJYm9vbCAiRW5hYmxlIFBPU0lYIGZpbGUgbG9ja2luZyBBUEkiIGlmIEVYUEVSVAogCWRlZmF1bHQgeQorCXNlbGVjdCBQRVJDUFVfUldTRU0KIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN0YW5kYXJkIGZpbGUgbG9ja2luZyBzdXBwb3J0LCByZXF1aXJlZAogICAgICAgICAgIGZvciBmaWxlc3lzdGVtcyBsaWtlIE5GUyBhbmQgZm9yIHRoZSBmbG9jaygpIHN5c3RlbQpkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZy5iaW5mbXQgYi9mcy9LY29uZmlnLmJpbmZtdAppbmRleCBjN2VmZGRmLi40YzA5ZDkzIDEwMDY0NAotLS0gYS9mcy9LY29uZmlnLmJpbmZtdAorKysgYi9mcy9LY29uZmlnLmJpbmZtdApAQCAtODksNyArODksNyBAQAogCiBjb25maWcgQklORk1UX0ZMQVQKIAlib29sICJLZXJuZWwgc3VwcG9ydCBmb3IgZmxhdCBiaW5hcmllcyIKLQlkZXBlbmRzIG9uICFNTVUgfHwgTTY4SworCWRlcGVuZHMgb24gIU1NVSB8fCBBUk0gfHwgTTY4SwogCWRlcGVuZHMgb24gIUZSViB8fCBCUk9LRU4KIAloZWxwCiAJICBTdXBwb3J0IHVDbGludXggRkxBVCBmb3JtYXQgYmluYXJpZXMuCmRpZmYgLS1naXQgYS9mcy9hZnMvY2FsbGJhY2suYyBiL2ZzL2Fmcy9jYWxsYmFjay5jCmluZGV4IDdlZjYzN2QuLjFlOWQyZjggMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9jYWxsYmFjay5jCisrKyBiL2ZzL2Fmcy9jYWxsYmFjay5jCkBAIC00NjEsOCArNDYxLDggQEAKICAqLwogaW50IF9faW5pdCBhZnNfY2FsbGJhY2tfdXBkYXRlX2luaXQodm9pZCkKIHsKLQlhZnNfY2FsbGJhY2tfdXBkYXRlX3dvcmtlciA9Ci0JCWNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrYWZzX2NhbGxiYWNrZCIpOworCWFmc19jYWxsYmFja191cGRhdGVfd29ya2VyID0gYWxsb2Nfb3JkZXJlZF93b3JrcXVldWUoImthZnNfY2FsbGJhY2tkIiwKKwkJCQkJCQkgICAgIFdRX01FTV9SRUNMQUlNKTsKIAlyZXR1cm4gYWZzX2NhbGxiYWNrX3VwZGF0ZV93b3JrZXIgPyAwIDogLUVOT01FTTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvYWZzL2Ntc2VydmljZS5jIGIvZnMvYWZzL2Ntc2VydmljZS5jCmluZGV4IDRiMGVmZjYuLjIwMzdlN2EgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9jbXNlcnZpY2UuYworKysgYi9mcy9hZnMvY21zZXJ2aWNlLmMKQEAgLTE3LDE5ICsxNywxMiBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiYWZzX2NtLmgiCiAKLSNpZiAwCi1zdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYWZzX2NtX3dvcmtxdWV1ZTsKLSNlbmRpZiAgLyogIDAgICovCi0KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfaW5pdF9jYWxsX2JhY2tfc3RhdGUoc3RydWN0IGFmc19jYWxsICosCi0JCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfaW5pdF9jYWxsX2JhY2tfc3RhdGUzKHN0cnVjdCBhZnNfY2FsbCAqLAotCQkJCQkJc3RydWN0IHNrX2J1ZmYgKiwgYm9vbCk7Ci1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2NiX3Byb2JlKHN0cnVjdCBhZnNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfY2FsbGJhY2soc3RydWN0IGFmc19jYWxsICosIHN0cnVjdCBza19idWZmICosIGJvb2wpOwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9wcm9iZV91dWlkKHN0cnVjdCBhZnNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfdGVsbF9tZV9hYm91dF95b3Vyc2VsZihzdHJ1Y3QgYWZzX2NhbGwgKiwKLQkJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfaW5pdF9jYWxsX2JhY2tfc3RhdGUoc3RydWN0IGFmc19jYWxsICopOworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9pbml0X2NhbGxfYmFja19zdGF0ZTMoc3RydWN0IGFmc19jYWxsICopOworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9wcm9iZShzdHJ1Y3QgYWZzX2NhbGwgKik7CitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2NiX2NhbGxiYWNrKHN0cnVjdCBhZnNfY2FsbCAqKTsKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfcHJvYmVfdXVpZChzdHJ1Y3QgYWZzX2NhbGwgKik7CitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2NiX3RlbGxfbWVfYWJvdXRfeW91cnNlbGYoc3RydWN0IGFmc19jYWxsICopOwogc3RhdGljIHZvaWQgYWZzX2NtX2Rlc3RydWN0b3Ioc3RydWN0IGFmc19jYWxsICopOwogCiAvKgpAQCAtMTM0LDcgKzEyNyw3IEBACiAJICogcmVjZWl2ZWQuICBUaGUgc3RlcCBudW1iZXIgaGVyZSBtdXN0IG1hdGNoIHRoZSBmaW5hbCBudW1iZXIgaW4KIAkgKiBhZnNfZGVsaXZlcl9jYl9jYWxsYmFjaygpLgogCSAqLwotCWlmIChjYWxsLT51bm1hcnNoYWxsID09IDYpIHsKKwlpZiAoY2FsbC0+dW5tYXJzaGFsbCA9PSA1KSB7CiAJCUFTU0VSVChjYWxsLT5zZXJ2ZXIgJiYgY2FsbC0+Y291bnQgJiYgY2FsbC0+cmVxdWVzdCk7CiAJCWFmc19icmVha19jYWxsYmFja3MoY2FsbC0+c2VydmVyLCBjYWxsLT5jb3VudCwgY2FsbC0+cmVxdWVzdCk7CiAJfQpAQCAtMTY4LDMyICsxNjEsMjkgQEAKIC8qCiAgKiBkZWxpdmVyIHJlcXVlc3QgZGF0YSB0byBhIENCLkNhbGxCYWNrIGNhbGwKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9jYWxsYmFjayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9jYWxsYmFjayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CisJc3RydWN0IHNvY2thZGRyX3J4cnBjIHNyeDsKIAlzdHJ1Y3QgYWZzX2NhbGxiYWNrICpjYjsKIAlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOwotCXN0cnVjdCBpbl9hZGRyIGFkZHI7CiAJX19iZTMyICpicDsKIAl1MzIgdG1wOwogCWludCByZXQsIGxvb3A7CiAKLQlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKKwlfZW50ZXIoInsldX0iLCBjYWxsLT51bm1hcnNoYWxsKTsKIAogCXN3aXRjaCAoY2FsbC0+dW5tYXJzaGFsbCkgewogCWNhc2UgMDoKKwkJcnhycGNfa2VybmVsX2dldF9wZWVyKGFmc19zb2NrZXQsIGNhbGwtPnJ4Y2FsbCwgJnNyeCk7CiAJCWNhbGwtPm9mZnNldCA9IDA7CiAJCWNhbGwtPnVubWFyc2hhbGwrKzsKIAogCQkvKiBleHRyYWN0IHRoZSBGSUQgYXJyYXkgYW5kIGl0cyBjb3VudCBpbiB0d28gc3RlcHMgKi8KIAljYXNlIDE6CiAJCV9kZWJ1ZygiZXh0cmFjdCBGSUQgY291bnQiKTsKLQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBza2IsIGxhc3QsICZjYWxsLT50bXAsIDQpOwotCQlzd2l0Y2ggKHJldCkgewotCQljYXNlIDA6CQlicmVhazsKLQkJY2FzZSAtRUFHQUlOOglyZXR1cm4gMDsKLQkJZGVmYXVsdDoJcmV0dXJuIHJldDsKLQkJfQorCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsICZjYWxsLT50bXAsIDQsIHRydWUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CiAKIAkJY2FsbC0+Y291bnQgPSBudG9obChjYWxsLT50bXApOwogCQlfZGVidWcoIkZJRCBjb3VudDogJXUiLCBjYWxsLT5jb3VudCk7CkBAIC0yMDgsMTMgKzE5OCwxMCBAQAogCiAJY2FzZSAyOgogCQlfZGVidWcoImV4dHJhY3QgRklEIGFycmF5Iik7Ci0JCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5idWZmZXIsCi0JCQkJICAgICAgIGNhbGwtPmNvdW50ICogMyAqIDQpOwotCQlzd2l0Y2ggKHJldCkgewotCQljYXNlIDA6CQlicmVhazsKLQkJY2FzZSAtRUFHQUlOOglyZXR1cm4gMDsKLQkJZGVmYXVsdDoJcmV0dXJuIHJldDsKLQkJfQorCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIGNhbGwtPmJ1ZmZlciwKKwkJCQkgICAgICAgY2FsbC0+Y291bnQgKiAzICogNCwgdHJ1ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAogCQlfZGVidWcoInVubWFyc2hhbGwgRklEIGFycmF5Iik7CiAJCWNhbGwtPnJlcXVlc3QgPSBrY2FsbG9jKGNhbGwtPmNvdW50LApAQCAtMjM4LDEyICsyMjUsOSBAQAogCQkvKiBleHRyYWN0IHRoZSBjYWxsYmFjayBhcnJheSBhbmQgaXRzIGNvdW50IGluIHR3byBzdGVwcyAqLwogCWNhc2UgMzoKIAkJX2RlYnVnKCJleHRyYWN0IENCIGNvdW50Iik7Ci0JCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCAmY2FsbC0+dG1wLCA0KTsKLQkJc3dpdGNoIChyZXQpIHsKLQkJY2FzZSAwOgkJYnJlYWs7Ci0JCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7Ci0JCWRlZmF1bHQ6CXJldHVybiByZXQ7Ci0JCX0KKwkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCAmY2FsbC0+dG1wLCA0LCB0cnVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OwogCiAJCXRtcCA9IG50b2hsKGNhbGwtPnRtcCk7CiAJCV9kZWJ1ZygiQ0IgY291bnQ6ICV1IiwgdG1wKTsKQEAgLTI1MSwxOCArMjM1LDEzIEBACiAJCQlyZXR1cm4gLUVCQURNU0c7CiAJCWNhbGwtPm9mZnNldCA9IDA7CiAJCWNhbGwtPnVubWFyc2hhbGwrKzsKLQkJaWYgKHRtcCA9PSAwKQotCQkJZ290byBlbXB0eV9jYl9hcnJheTsKIAogCWNhc2UgNDoKIAkJX2RlYnVnKCJleHRyYWN0IENCIGFycmF5Iik7Ci0JCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5yZXF1ZXN0LAotCQkJCSAgICAgICBjYWxsLT5jb3VudCAqIDMgKiA0KTsKLQkJc3dpdGNoIChyZXQpIHsKLQkJY2FzZSAwOgkJYnJlYWs7Ci0JCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7Ci0JCWRlZmF1bHQ6CXJldHVybiByZXQ7Ci0JCX0KKwkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBjYWxsLT5idWZmZXIsCisJCQkJICAgICAgIGNhbGwtPmNvdW50ICogMyAqIDQsIGZhbHNlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OwogCiAJCV9kZWJ1ZygidW5tYXJzaGFsbCBDQiBhcnJheSIpOwogCQljYiA9IGNhbGwtPnJlcXVlc3Q7CkBAIC0yNzMsMTUgKzI1Miw5IEBACiAJCQljYi0+dHlwZQk9IG50b2hsKCpicCsrKTsKIAkJfQogCi0JZW1wdHlfY2JfYXJyYXk6CiAJCWNhbGwtPm9mZnNldCA9IDA7CiAJCWNhbGwtPnVubWFyc2hhbGwrKzsKIAotCWNhc2UgNToKLQkJX2RlYnVnKCJ0cmFpbGVyIik7Ci0JCWlmIChza2ItPmxlbiAhPSAwKQotCQkJcmV0dXJuIC1FQkFETVNHOwotCiAJCS8qIFJlY29yZCB0aGF0IHRoZSBtZXNzYWdlIHdhcyB1bm1hcnNoYWxsZWQgc3VjY2Vzc2Z1bGx5IHNvCiAJCSAqIHRoYXQgdGhlIGNhbGwgZGVzdHJ1Y3RvciBjYW4ga25vdyBkbyB0aGUgY2FsbGJhY2sgYnJlYWtpbmcKIAkJICogd29yaywgZXZlbiBpZiB0aGUgZmluYWwgQUNLIGlzbid0IHJlY2VpdmVkLgpAQCAtMjkwLDE5ICsyNjMsMTUgQEAKIAkJICogdXBkYXRlZCBhbHNvLgogCQkgKi8KIAkJY2FsbC0+dW5tYXJzaGFsbCsrOwotCWNhc2UgNjoKKwljYXNlIDU6CiAJCWJyZWFrOwogCX0KIAotCWlmICghbGFzdCkKLQkJcmV0dXJuIDA7Ci0KIAljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX1JFUExZSU5HOwogCiAJLyogd2UnbGwgbmVlZCB0aGUgZmlsZSBzZXJ2ZXIgcmVjb3JkIGFzIHRoYXQgdGVsbHMgdXMgd2hpY2ggc2V0IG9mCiAJICogdm5vZGVzIHRvIG9wZXJhdGUgdXBvbiAqLwotCW1lbWNweSgmYWRkciwgJmlwX2hkcihza2IpLT5zYWRkciwgNCk7Ci0Jc2VydmVyID0gYWZzX2ZpbmRfc2VydmVyKCZhZGRyKTsKKwlzZXJ2ZXIgPSBhZnNfZmluZF9zZXJ2ZXIoJnNyeCk7CiAJaWYgKCFzZXJ2ZXIpCiAJCXJldHVybiAtRU5PVENPTk47CiAJY2FsbC0+c2VydmVyID0gc2VydmVyOwpAQCAtMzI5LDI3ICsyOTgsMjYgQEAKIC8qCiAgKiBkZWxpdmVyIHJlcXVlc3QgZGF0YSB0byBhIENCLkluaXRDYWxsQmFja1N0YXRlIGNhbGwKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9pbml0X2NhbGxfYmFja19zdGF0ZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgICAgICAgYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9pbml0X2NhbGxfYmFja19zdGF0ZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CisJc3RydWN0IHNvY2thZGRyX3J4cnBjIHNyeDsKIAlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOwotCXN0cnVjdCBpbl9hZGRyIGFkZHI7CisJaW50IHJldDsKIAotCV9lbnRlcigiLHsldX0sJWQiLCBza2ItPmxlbiwgbGFzdCk7CisJX2VudGVyKCIiKTsKIAotCWlmIChza2ItPmxlbiA+IDApCi0JCXJldHVybiAtRUJBRE1TRzsKLQlpZiAoIWxhc3QpCi0JCXJldHVybiAwOworCXJ4cnBjX2tlcm5lbF9nZXRfcGVlcihhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwsICZzcngpOworCisJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBOVUxMLCAwLCBmYWxzZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAkvKiBubyB1bm1hcnNoYWxsaW5nIHJlcXVpcmVkICovCiAJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9SRVBMWUlORzsKIAogCS8qIHdlJ2xsIG5lZWQgdGhlIGZpbGUgc2VydmVyIHJlY29yZCBhcyB0aGF0IHRlbGxzIHVzIHdoaWNoIHNldCBvZgogCSAqIHZub2RlcyB0byBvcGVyYXRlIHVwb24gKi8KLQltZW1jcHkoJmFkZHIsICZpcF9oZHIoc2tiKS0+c2FkZHIsIDQpOwotCXNlcnZlciA9IGFmc19maW5kX3NlcnZlcigmYWRkcik7CisJc2VydmVyID0gYWZzX2ZpbmRfc2VydmVyKCZzcngpOwogCWlmICghc2VydmVyKQogCQlyZXR1cm4gLUVOT1RDT05OOwogCWNhbGwtPnNlcnZlciA9IHNlcnZlcjsKQEAgLTM2MiwxMDggKzMzMCwyMCBAQAogLyoKICAqIGRlbGl2ZXIgcmVxdWVzdCBkYXRhIHRvIGEgQ0IuSW5pdENhbGxCYWNrU3RhdGUzIGNhbGwKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9pbml0X2NhbGxfYmFja19zdGF0ZTMoc3RydWN0IGFmc19jYWxsICpjYWxsLAotCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJCWJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfaW5pdF9jYWxsX2JhY2tfc3RhdGUzKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKKwlzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgc3J4OwogCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7Ci0Jc3RydWN0IGluX2FkZHIgYWRkcjsKLQotCV9lbnRlcigiLHsldX0sJWQiLCBza2ItPmxlbiwgbGFzdCk7Ci0KLQlpZiAoIWxhc3QpCi0JCXJldHVybiAwOwotCi0JLyogbm8gdW5tYXJzaGFsbGluZyByZXF1aXJlZCAqLwotCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfUkVQTFlJTkc7Ci0KLQkvKiB3ZSdsbCBuZWVkIHRoZSBmaWxlIHNlcnZlciByZWNvcmQgYXMgdGhhdCB0ZWxscyB1cyB3aGljaCBzZXQgb2YKLQkgKiB2bm9kZXMgdG8gb3BlcmF0ZSB1cG9uICovCi0JbWVtY3B5KCZhZGRyLCAmaXBfaGRyKHNrYiktPnNhZGRyLCA0KTsKLQlzZXJ2ZXIgPSBhZnNfZmluZF9zZXJ2ZXIoJmFkZHIpOwotCWlmICghc2VydmVyKQotCQlyZXR1cm4gLUVOT1RDT05OOwotCWNhbGwtPnNlcnZlciA9IHNlcnZlcjsKLQotCUlOSVRfV09SSygmY2FsbC0+d29yaywgU1JYQUZTQ0JfSW5pdENhbGxCYWNrU3RhdGUpOwotCXF1ZXVlX3dvcmsoYWZzX3dxLCAmY2FsbC0+d29yayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBhbGxvdyB0aGUgZmlsZXNlcnZlciB0byBzZWUgaWYgdGhlIGNhY2hlIG1hbmFnZXIgaXMgc3RpbGwgYWxpdmUKLSAqLwotc3RhdGljIHZvaWQgU1JYQUZTQ0JfUHJvYmUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX2NhbGwsIHdvcmspOwotCi0JX2VudGVyKCIiKTsKLQlhZnNfc2VuZF9lbXB0eV9yZXBseShjYWxsKTsKLQlfbGVhdmUoIiIpOwotfQotCi0vKgotICogZGVsaXZlciByZXF1ZXN0IGRhdGEgdG8gYSBDQi5Qcm9iZSBjYWxsCi0gKi8KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfcHJvYmUoc3RydWN0IGFmc19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCWJvb2wgbGFzdCkKLXsKLQlfZW50ZXIoIix7JXV9LCVkIiwgc2tiLT5sZW4sIGxhc3QpOwotCi0JaWYgKHNrYi0+bGVuID4gMCkKLQkJcmV0dXJuIC1FQkFETVNHOwotCWlmICghbGFzdCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBubyB1bm1hcnNoYWxsaW5nIHJlcXVpcmVkICovCi0JY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9SRVBMWUlORzsKLQotCUlOSVRfV09SSygmY2FsbC0+d29yaywgU1JYQUZTQ0JfUHJvYmUpOwotCXF1ZXVlX3dvcmsoYWZzX3dxLCAmY2FsbC0+d29yayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBhbGxvdyB0aGUgZmlsZXNlcnZlciB0byBxdWlja2x5IGZpbmQgb3V0IGlmIHRoZSBmaWxlc2VydmVyIGhhcyBiZWVuIHJlYm9vdGVkCi0gKi8KLXN0YXRpYyB2b2lkIFNSWEFGU0NCX1Byb2JlVXVpZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGFmc19jYWxsICpjYWxsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZnNfY2FsbCwgd29yayk7Ci0Jc3RydWN0IGFmc191dWlkICpyID0gY2FsbC0+cmVxdWVzdDsKLQotCXN0cnVjdCB7Ci0JCV9fYmUzMgltYXRjaDsKLQl9IHJlcGx5OwotCi0JX2VudGVyKCIiKTsKLQotCi0JaWYgKG1lbWNtcChyLCAmYWZzX3V1aWQsIHNpemVvZihhZnNfdXVpZCkpID09IDApCi0JCXJlcGx5Lm1hdGNoID0gaHRvbmwoMCk7Ci0JZWxzZQotCQlyZXBseS5tYXRjaCA9IGh0b25sKDEpOwotCi0JYWZzX3NlbmRfc2ltcGxlX3JlcGx5KGNhbGwsICZyZXBseSwgc2l6ZW9mKHJlcGx5KSk7Ci0JX2xlYXZlKCIiKTsKLX0KLQotLyoKLSAqIGRlbGl2ZXIgcmVxdWVzdCBkYXRhIHRvIGEgQ0IuUHJvYmVVdWlkIGNhbGwKLSAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9wcm9iZV91dWlkKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgIGJvb2wgbGFzdCkKLXsKIAlzdHJ1Y3QgYWZzX3V1aWQgKnI7CiAJdW5zaWduZWQgbG9vcDsKIAlfX2JlMzIgKmI7CiAJaW50IHJldDsKIAotCV9lbnRlcigieyV1fSx7JXV9LCVkIiwgY2FsbC0+dW5tYXJzaGFsbCwgc2tiLT5sZW4sIGxhc3QpOworCV9lbnRlcigiIik7CiAKLQlpZiAoc2tiLT5sZW4gPiAwKQotCQlyZXR1cm4gLUVCQURNU0c7Ci0JaWYgKCFsYXN0KQotCQlyZXR1cm4gMDsKKwlyeHJwY19rZXJuZWxfZ2V0X3BlZXIoYWZzX3NvY2tldCwgY2FsbC0+cnhjYWxsLCAmc3J4KTsKKworCV9lbnRlcigieyV1fSIsIGNhbGwtPnVubWFyc2hhbGwpOwogCiAJc3dpdGNoIChjYWxsLT51bm1hcnNoYWxsKSB7CiAJY2FzZSAwOgpAQCAtNDc1LDggKzM1NSw4IEBACiAKIAljYXNlIDE6CiAJCV9kZWJ1ZygiZXh0cmFjdCBVVUlEIik7Ci0JCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5idWZmZXIsCi0JCQkJICAgICAgIDExICogc2l6ZW9mKF9fYmUzMikpOworCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIGNhbGwtPmJ1ZmZlciwKKwkJCQkgICAgICAgMTEgKiBzaXplb2YoX19iZTMyKSwgZmFsc2UpOwogCQlzd2l0Y2ggKHJldCkgewogCQljYXNlIDA6CQlicmVhazsKIAkJY2FzZSAtRUFHQUlOOglyZXR1cm4gMDsKQEAgLTUwMywxNCArMzgzLDEzMiBAQAogCQljYWxsLT51bm1hcnNoYWxsKys7CiAKIAljYXNlIDI6Ci0JCV9kZWJ1ZygidHJhaWxlciIpOwotCQlpZiAoc2tiLT5sZW4gIT0gMCkKLQkJCXJldHVybiAtRUJBRE1TRzsKIAkJYnJlYWs7CiAJfQogCi0JaWYgKCFsYXN0KQotCQlyZXR1cm4gMDsKKwkvKiBubyB1bm1hcnNoYWxsaW5nIHJlcXVpcmVkICovCisJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9SRVBMWUlORzsKKworCS8qIHdlJ2xsIG5lZWQgdGhlIGZpbGUgc2VydmVyIHJlY29yZCBhcyB0aGF0IHRlbGxzIHVzIHdoaWNoIHNldCBvZgorCSAqIHZub2RlcyB0byBvcGVyYXRlIHVwb24gKi8KKwlzZXJ2ZXIgPSBhZnNfZmluZF9zZXJ2ZXIoJnNyeCk7CisJaWYgKCFzZXJ2ZXIpCisJCXJldHVybiAtRU5PVENPTk47CisJY2FsbC0+c2VydmVyID0gc2VydmVyOworCisJSU5JVF9XT1JLKCZjYWxsLT53b3JrLCBTUlhBRlNDQl9Jbml0Q2FsbEJhY2tTdGF0ZSk7CisJcXVldWVfd29yayhhZnNfd3EsICZjYWxsLT53b3JrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGFsbG93IHRoZSBmaWxlc2VydmVyIHRvIHNlZSBpZiB0aGUgY2FjaGUgbWFuYWdlciBpcyBzdGlsbCBhbGl2ZQorICovCitzdGF0aWMgdm9pZCBTUlhBRlNDQl9Qcm9iZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFmc19jYWxsICpjYWxsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZnNfY2FsbCwgd29yayk7CisKKwlfZW50ZXIoIiIpOworCWFmc19zZW5kX2VtcHR5X3JlcGx5KGNhbGwpOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBkZWxpdmVyIHJlcXVlc3QgZGF0YSB0byBhIENCLlByb2JlIGNhbGwKKyAqLworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9wcm9iZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCit7CisJaW50IHJldDsKKworCV9lbnRlcigiIik7CisKKwlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIE5VTEwsIDAsIGZhbHNlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIG5vIHVubWFyc2hhbGxpbmcgcmVxdWlyZWQgKi8KKwljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX1JFUExZSU5HOworCisJSU5JVF9XT1JLKCZjYWxsLT53b3JrLCBTUlhBRlNDQl9Qcm9iZSk7CisJcXVldWVfd29yayhhZnNfd3EsICZjYWxsLT53b3JrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGFsbG93IHRoZSBmaWxlc2VydmVyIHRvIHF1aWNrbHkgZmluZCBvdXQgaWYgdGhlIGZpbGVzZXJ2ZXIgaGFzIGJlZW4gcmVib290ZWQKKyAqLworc3RhdGljIHZvaWQgU1JYQUZTQ0JfUHJvYmVVdWlkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFmc19jYWxsLCB3b3JrKTsKKwlzdHJ1Y3QgYWZzX3V1aWQgKnIgPSBjYWxsLT5yZXF1ZXN0OworCisJc3RydWN0IHsKKwkJX19iZTMyCW1hdGNoOworCX0gcmVwbHk7CisKKwlfZW50ZXIoIiIpOworCisJaWYgKG1lbWNtcChyLCAmYWZzX3V1aWQsIHNpemVvZihhZnNfdXVpZCkpID09IDApCisJCXJlcGx5Lm1hdGNoID0gaHRvbmwoMCk7CisJZWxzZQorCQlyZXBseS5tYXRjaCA9IGh0b25sKDEpOworCisJYWZzX3NlbmRfc2ltcGxlX3JlcGx5KGNhbGwsICZyZXBseSwgc2l6ZW9mKHJlcGx5KSk7CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGRlbGl2ZXIgcmVxdWVzdCBkYXRhIHRvIGEgQ0IuUHJvYmVVdWlkIGNhbGwKKyAqLworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9wcm9iZV91dWlkKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3QgYWZzX3V1aWQgKnI7CisJdW5zaWduZWQgbG9vcDsKKwlfX2JlMzIgKmI7CisJaW50IHJldDsKKworCV9lbnRlcigieyV1fSIsIGNhbGwtPnVubWFyc2hhbGwpOworCisJc3dpdGNoIChjYWxsLT51bm1hcnNoYWxsKSB7CisJY2FzZSAwOgorCQljYWxsLT5vZmZzZXQgPSAwOworCQljYWxsLT5idWZmZXIgPSBrbWFsbG9jKDExICogc2l6ZW9mKF9fYmUzMiksIEdGUF9LRVJORUwpOworCQlpZiAoIWNhbGwtPmJ1ZmZlcikKKwkJCXJldHVybiAtRU5PTUVNOworCQljYWxsLT51bm1hcnNoYWxsKys7CisKKwljYXNlIDE6CisJCV9kZWJ1ZygiZXh0cmFjdCBVVUlEIik7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICAxMSAqIHNpemVvZihfX2JlMzIpLCBmYWxzZSk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoJCWJyZWFrOworCQljYXNlIC1FQUdBSU46CXJldHVybiAwOworCQlkZWZhdWx0OglyZXR1cm4gcmV0OworCQl9CisKKwkJX2RlYnVnKCJ1bm1hcnNoYWxsIFVVSUQiKTsKKwkJY2FsbC0+cmVxdWVzdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfdXVpZCksIEdGUF9LRVJORUwpOworCQlpZiAoIWNhbGwtPnJlcXVlc3QpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQliID0gY2FsbC0+YnVmZmVyOworCQlyID0gY2FsbC0+cmVxdWVzdDsKKwkJci0+dGltZV9sb3cJCQk9IG50b2hsKGJbMF0pOworCQlyLT50aW1lX21pZAkJCT0gbnRvaGwoYlsxXSk7CisJCXItPnRpbWVfaGlfYW5kX3ZlcnNpb24JCT0gbnRvaGwoYlsyXSk7CisJCXItPmNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWQgCT0gbnRvaGwoYlszXSk7CisJCXItPmNsb2NrX3NlcV9sb3cJCT0gbnRvaGwoYls0XSk7CisKKwkJZm9yIChsb29wID0gMDsgbG9vcCA8IDY7IGxvb3ArKykKKwkJCXItPm5vZGVbbG9vcF0gPSBudG9obChiW2xvb3AgKyA1XSk7CisKKwkJY2FsbC0+b2Zmc2V0ID0gMDsKKwkJY2FsbC0+dW5tYXJzaGFsbCsrOworCisJY2FzZSAyOgorCQlicmVhazsKKwl9CiAKIAljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX1JFUExZSU5HOwogCkBAIC01ODUsMTUgKzU4MywxNSBAQAogLyoKICAqIGRlbGl2ZXIgcmVxdWVzdCBkYXRhIHRvIGEgQ0IuVGVsbE1lQWJvdXRZb3Vyc2VsZiBjYWxsCiAgKi8KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfdGVsbF9tZV9hYm91dF95b3Vyc2VsZihzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl90ZWxsX21lX2Fib3V0X3lvdXJzZWxmKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKLQlfZW50ZXIoIix7JXV9LCVkIiwgc2tiLT5sZW4sIGxhc3QpOworCWludCByZXQ7CiAKLQlpZiAoc2tiLT5sZW4gPiAwKQotCQlyZXR1cm4gLUVCQURNU0c7Ci0JaWYgKCFsYXN0KQotCQlyZXR1cm4gMDsKKwlfZW50ZXIoIiIpOworCisJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBOVUxMLCAwLCBmYWxzZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAkvKiBubyB1bm1hcnNoYWxsaW5nIHJlcXVpcmVkICovCiAJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9SRVBMWUlORzsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9mbG9jay5jIGIvZnMvYWZzL2Zsb2NrLmMKaW5kZXggZDkxYTljOS4uMzE5MWRmZiAxMDA2NDQKLS0tIGEvZnMvYWZzL2Zsb2NrLmMKKysrIGIvZnMvYWZzL2Zsb2NrLmMKQEAgLTM2LDggKzM2LDggQEAKIAlpZiAoIWFmc19sb2NrX21hbmFnZXIpIHsKIAkJbXV0ZXhfbG9jaygmYWZzX2xvY2tfbWFuYWdlcl9tdXRleCk7CiAJCWlmICghYWZzX2xvY2tfbWFuYWdlcikgewotCQkJYWZzX2xvY2tfbWFuYWdlciA9Ci0JCQkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImthZnNfbG9ja2QiKTsKKwkJCWFmc19sb2NrX21hbmFnZXIgPSBhbGxvY193b3JrcXVldWUoImthZnNfbG9ja2QiLAorCQkJCQkJCSAgIFdRX01FTV9SRUNMQUlNLCAwKTsKIAkJCWlmICghYWZzX2xvY2tfbWFuYWdlcikKIAkJCQlyZXQgPSAtRU5PTUVNOwogCQl9CmRpZmYgLS1naXQgYS9mcy9hZnMvZnNjbGllbnQuYyBiL2ZzL2Fmcy9mc2NsaWVudC5jCmluZGV4IGMyZTkzMGUuLjk2ZjRkNzYgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9mc2NsaWVudC5jCisrKyBiL2ZzL2Fmcy9mc2NsaWVudC5jCkBAIC0yMzUsMjAgKzIzNSwxNyBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5GZXRjaFN0YXR1cwogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX2ZldGNoX3N0YXR1cyhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfZmV0Y2hfc3RhdHVzKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKIAlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IGNhbGwtPnJlcGx5OwogCWNvbnN0IF9fYmUzMiAqYnA7CisJaW50IHJldDsKIAotCV9lbnRlcigiLCwldSIsIGxhc3QpOworCV9lbnRlcigiIik7CiAKLQlhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiKTsKLQlpZiAoIWxhc3QpCi0JCXJldHVybiAwOwotCi0JaWYgKGNhbGwtPnJlcGx5X3NpemUgIT0gY2FsbC0+cmVwbHlfbWF4KQotCQlyZXR1cm4gLUVCQURNU0c7CisJcmV0ID0gYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCiAJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgb25jZSB3ZSd2ZSByZWNlaXZlZCBhbGwgb2YgaXQgKi8KIAlicCA9IGNhbGwtPmJ1ZmZlcjsKQEAgLTMwOSw4ICszMDYsNyBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5GZXRjaERhdGEKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19mZXRjaF9kYXRhKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwKLQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfZmV0Y2hfZGF0YShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CiAJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBjYWxsLT5yZXBseTsKIAljb25zdCBfX2JlMzIgKmJwOwpAQCAtMzE4LDcgKzMxNCw3IEBACiAJdm9pZCAqYnVmZmVyOwogCWludCByZXQ7CiAKLQlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKKwlfZW50ZXIoInsldX0iLCBjYWxsLT51bm1hcnNoYWxsKTsKIAogCXN3aXRjaCAoY2FsbC0+dW5tYXJzaGFsbCkgewogCWNhc2UgMDoKQEAgLTMzNCwxMiArMzMwLDkgQEAKIAkJICogY2xpZW50KSAqLwogCWNhc2UgMToKIAkJX2RlYnVnKCJleHRyYWN0IGRhdGEgbGVuZ3RoIChNU1cpIik7Ci0JCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCAmY2FsbC0+dG1wLCA0KTsKLQkJc3dpdGNoIChyZXQpIHsKLQkJY2FzZSAwOgkJYnJlYWs7Ci0JCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7Ci0JCWRlZmF1bHQ6CXJldHVybiByZXQ7Ci0JCX0KKwkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCAmY2FsbC0+dG1wLCA0LCB0cnVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OwogCiAJCWNhbGwtPmNvdW50ID0gbnRvaGwoY2FsbC0+dG1wKTsKIAkJX2RlYnVnKCJEQVRBIGxlbmd0aCBNU1c6ICV1IiwgY2FsbC0+Y291bnQpOwpAQCAtMzUyLDEyICszNDUsOSBAQAogCQkvKiBleHRyYWN0IHRoZSByZXR1cm5lZCBkYXRhIGxlbmd0aCAqLwogCWNhc2UgMjoKIAkJX2RlYnVnKCJleHRyYWN0IGRhdGEgbGVuZ3RoIik7Ci0JCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCAmY2FsbC0+dG1wLCA0KTsKLQkJc3dpdGNoIChyZXQpIHsKLQkJY2FzZSAwOgkJYnJlYWs7Ci0JCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7Ci0JCWRlZmF1bHQ6CXJldHVybiByZXQ7Ci0JCX0KKwkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCAmY2FsbC0+dG1wLCA0LCB0cnVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OwogCiAJCWNhbGwtPmNvdW50ID0gbnRvaGwoY2FsbC0+dG1wKTsKIAkJX2RlYnVnKCJEQVRBIGxlbmd0aDogJXUiLCBjYWxsLT5jb3VudCk7CkBAIC0zNzEsMTUgKzM2MSwxMiBAQAogCQlfZGVidWcoImV4dHJhY3QgZGF0YSIpOwogCQlpZiAoY2FsbC0+Y291bnQgPiAwKSB7CiAJCQlwYWdlID0gY2FsbC0+cmVwbHkzOwotCQkJYnVmZmVyID0ga21hcF9hdG9taWMocGFnZSk7Ci0JCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgYnVmZmVyLAotCQkJCQkgICAgICAgY2FsbC0+Y291bnQpOwotCQkJa3VubWFwX2F0b21pYyhidWZmZXIpOwotCQkJc3dpdGNoIChyZXQpIHsKLQkJCWNhc2UgMDoJCWJyZWFrOwotCQkJY2FzZSAtRUFHQUlOOglyZXR1cm4gMDsKLQkJCWRlZmF1bHQ6CXJldHVybiByZXQ7Ci0JCQl9CisJCQlidWZmZXIgPSBrbWFwKHBhZ2UpOworCQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBidWZmZXIsCisJCQkJCSAgICAgICBjYWxsLT5jb3VudCwgdHJ1ZSk7CisJCQlrdW5tYXAoYnVmZmVyKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CiAJCX0KIAogCQljYWxsLT5vZmZzZXQgPSAwOwpAQCAtMzg3LDEzICszNzQsMTAgQEAKIAogCQkvKiBleHRyYWN0IHRoZSBtZXRhZGF0YSAqLwogCWNhc2UgNDoKLQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBza2IsIGxhc3QsIGNhbGwtPmJ1ZmZlciwKLQkJCQkgICAgICAgKDIxICsgMyArIDYpICogNCk7Ci0JCXN3aXRjaCAocmV0KSB7Ci0JCWNhc2UgMDoJCWJyZWFrOwotCQljYXNlIC1FQUdBSU46CXJldHVybiAwOwotCQlkZWZhdWx0OglyZXR1cm4gcmV0OwotCQl9CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICAoMjEgKyAzICsgNikgKiA0LCBmYWxzZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAogCQlicCA9IGNhbGwtPmJ1ZmZlcjsKIAkJeGRyX2RlY29kZV9BRlNGZXRjaFN0YXR1cygmYnAsICZ2bm9kZS0+c3RhdHVzLCB2bm9kZSwgTlVMTCk7CkBAIC00MDUsMjEgKzM4OSwxNSBAQAogCQljYWxsLT51bm1hcnNoYWxsKys7CiAKIAljYXNlIDU6Ci0JCV9kZWJ1ZygidHJhaWxlciIpOwotCQlpZiAoc2tiLT5sZW4gIT0gMCkKLQkJCXJldHVybiAtRUJBRE1TRzsKIAkJYnJlYWs7CiAJfQogCi0JaWYgKCFsYXN0KQotCQlyZXR1cm4gMDsKLQogCWlmIChjYWxsLT5jb3VudCA8IFBBR0VfU0laRSkgewogCQlfZGVidWcoImNsZWFyIik7CiAJCXBhZ2UgPSBjYWxsLT5yZXBseTM7Ci0JCWJ1ZmZlciA9IGttYXBfYXRvbWljKHBhZ2UpOworCQlidWZmZXIgPSBrbWFwKHBhZ2UpOwogCQltZW1zZXQoYnVmZmVyICsgY2FsbC0+Y291bnQsIDAsIFBBR0VfU0laRSAtIGNhbGwtPmNvdW50KTsKLQkJa3VubWFwX2F0b21pYyhidWZmZXIpOworCQlrdW5tYXAoYnVmZmVyKTsKIAl9CiAKIAlfbGVhdmUoIiA9IDAgW2RvbmVdIik7CkBAIC01MzIsMTQgKzUxMCwxMiBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5HaXZlVXBDYWxsQmFja3MKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19naXZlX3VwX2NhbGxiYWNrcyhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX2dpdmVfdXBfY2FsbGJhY2tzKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKLQlfZW50ZXIoIix7JXV9LCVkIiwgc2tiLT5sZW4sIGxhc3QpOworCV9lbnRlcigiIik7CiAKLQlpZiAoc2tiLT5sZW4gPiAwKQotCQlyZXR1cm4gLUVCQURNU0c7IC8qIHNob3VsZG4ndCBiZSBhbnkgcmVwbHkgZGF0YSAqLwotCXJldHVybiAwOworCS8qIHNob3VsZG4ndCBiZSBhbnkgcmVwbHkgZGF0YSAqLworCXJldHVybiBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIE5VTEwsIDAsIGZhbHNlKTsKIH0KIAogLyoKQEAgLTYxNywyMCArNTkzLDE3IEBACiAvKgogICogZGVsaXZlciByZXBseSBkYXRhIHRvIGFuIEZTLkNyZWF0ZUZpbGUgb3IgYW4gRlMuTWFrZURpcgogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX2NyZWF0ZV92bm9kZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfY3JlYXRlX3Zub2RlKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKIAlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IGNhbGwtPnJlcGx5OwogCWNvbnN0IF9fYmUzMiAqYnA7CisJaW50IHJldDsKIAotCV9lbnRlcigieyV1fSx7JXV9LCVkIiwgY2FsbC0+dW5tYXJzaGFsbCwgc2tiLT5sZW4sIGxhc3QpOworCV9lbnRlcigieyV1fSIsIGNhbGwtPnVubWFyc2hhbGwpOwogCi0JYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYik7Ci0JaWYgKCFsYXN0KQotCQlyZXR1cm4gMDsKLQotCWlmIChjYWxsLT5yZXBseV9zaXplICE9IGNhbGwtPnJlcGx5X21heCkKLQkJcmV0dXJuIC1FQkFETVNHOworCXJldCA9IGFmc190cmFuc2Zlcl9yZXBseShjYWxsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5IG9uY2Ugd2UndmUgcmVjZWl2ZWQgYWxsIG9mIGl0ICovCiAJYnAgPSBjYWxsLT5idWZmZXI7CkBAIC03MTYsMjAgKzY4OSwxNyBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5SZW1vdmVGaWxlIG9yIEZTLlJlbW92ZURpcgogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3JlbW92ZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfcmVtb3ZlKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKIAlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IGNhbGwtPnJlcGx5OwogCWNvbnN0IF9fYmUzMiAqYnA7CisJaW50IHJldDsKIAotCV9lbnRlcigieyV1fSx7JXV9LCVkIiwgY2FsbC0+dW5tYXJzaGFsbCwgc2tiLT5sZW4sIGxhc3QpOworCV9lbnRlcigieyV1fSIsIGNhbGwtPnVubWFyc2hhbGwpOwogCi0JYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYik7Ci0JaWYgKCFsYXN0KQotCQlyZXR1cm4gMDsKLQotCWlmIChjYWxsLT5yZXBseV9zaXplICE9IGNhbGwtPnJlcGx5X21heCkKLQkJcmV0dXJuIC1FQkFETVNHOworCXJldCA9IGFmc190cmFuc2Zlcl9yZXBseShjYWxsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5IG9uY2Ugd2UndmUgcmVjZWl2ZWQgYWxsIG9mIGl0ICovCiAJYnAgPSBjYWxsLT5idWZmZXI7CkBAIC03OTksMjAgKzc2OSwxNyBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5MaW5rCiAgKi8KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfbGluayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19saW5rKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKIAlzdHJ1Y3QgYWZzX3Zub2RlICpkdm5vZGUgPSBjYWxsLT5yZXBseSwgKnZub2RlID0gY2FsbC0+cmVwbHkyOwogCWNvbnN0IF9fYmUzMiAqYnA7CisJaW50IHJldDsKIAotCV9lbnRlcigieyV1fSx7JXV9LCVkIiwgY2FsbC0+dW5tYXJzaGFsbCwgc2tiLT5sZW4sIGxhc3QpOworCV9lbnRlcigieyV1fSIsIGNhbGwtPnVubWFyc2hhbGwpOwogCi0JYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYik7Ci0JaWYgKCFsYXN0KQotCQlyZXR1cm4gMDsKLQotCWlmIChjYWxsLT5yZXBseV9zaXplICE9IGNhbGwtPnJlcGx5X21heCkKLQkJcmV0dXJuIC1FQkFETVNHOworCXJldCA9IGFmc190cmFuc2Zlcl9yZXBseShjYWxsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5IG9uY2Ugd2UndmUgcmVjZWl2ZWQgYWxsIG9mIGl0ICovCiAJYnAgPSBjYWxsLT5idWZmZXI7CkBAIC04ODcsMjAgKzg1NCwxNyBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5TeW1saW5rCiAgKi8KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfc3ltbGluayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3N5bWxpbmsoc3RydWN0IGFmc19jYWxsICpjYWxsKQogewogCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gY2FsbC0+cmVwbHk7CiAJY29uc3QgX19iZTMyICpicDsKKwlpbnQgcmV0OwogCi0JX2VudGVyKCJ7JXV9LHsldX0sJWQiLCBjYWxsLT51bm1hcnNoYWxsLCBza2ItPmxlbiwgbGFzdCk7CisJX2VudGVyKCJ7JXV9IiwgY2FsbC0+dW5tYXJzaGFsbCk7CiAKLQlhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiKTsKLQlpZiAoIWxhc3QpCi0JCXJldHVybiAwOwotCi0JaWYgKGNhbGwtPnJlcGx5X3NpemUgIT0gY2FsbC0+cmVwbHlfbWF4KQotCQlyZXR1cm4gLUVCQURNU0c7CisJcmV0ID0gYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCiAJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgb25jZSB3ZSd2ZSByZWNlaXZlZCBhbGwgb2YgaXQgKi8KIAlicCA9IGNhbGwtPmJ1ZmZlcjsKQEAgLTk5NCwyMCArOTU4LDE3IEBACiAvKgogICogZGVsaXZlciByZXBseSBkYXRhIHRvIGFuIEZTLlJlbmFtZQogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3JlbmFtZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3JlbmFtZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CiAJc3RydWN0IGFmc192bm9kZSAqb3JpZ19kdm5vZGUgPSBjYWxsLT5yZXBseSwgKm5ld19kdm5vZGUgPSBjYWxsLT5yZXBseTI7CiAJY29uc3QgX19iZTMyICpicDsKKwlpbnQgcmV0OwogCi0JX2VudGVyKCJ7JXV9LHsldX0sJWQiLCBjYWxsLT51bm1hcnNoYWxsLCBza2ItPmxlbiwgbGFzdCk7CisJX2VudGVyKCJ7JXV9IiwgY2FsbC0+dW5tYXJzaGFsbCk7CiAKLQlhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiKTsKLQlpZiAoIWxhc3QpCi0JCXJldHVybiAwOwotCi0JaWYgKGNhbGwtPnJlcGx5X3NpemUgIT0gY2FsbC0+cmVwbHlfbWF4KQotCQlyZXR1cm4gLUVCQURNU0c7CisJcmV0ID0gYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCiAJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgb25jZSB3ZSd2ZSByZWNlaXZlZCBhbGwgb2YgaXQgKi8KIAlicCA9IGNhbGwtPmJ1ZmZlcjsKQEAgLTExMDAsMjUgKzEwNjEsMTcgQEAKIC8qCiAgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYW4gRlMuU3RvcmVEYXRhCiAgKi8KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfc3RvcmVfZGF0YShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3N0b3JlX2RhdGEoc3RydWN0IGFmc19jYWxsICpjYWxsKQogewogCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gY2FsbC0+cmVwbHk7CiAJY29uc3QgX19iZTMyICpicDsKKwlpbnQgcmV0OwogCi0JX2VudGVyKCIsLCV1IiwgbGFzdCk7CisJX2VudGVyKCIiKTsKIAotCWFmc190cmFuc2Zlcl9yZXBseShjYWxsLCBza2IpOwotCWlmICghbGFzdCkgewotCQlfbGVhdmUoIiA9IDAgW21vcmVdIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChjYWxsLT5yZXBseV9zaXplICE9IGNhbGwtPnJlcGx5X21heCkgewotCQlfbGVhdmUoIiA9IC1FQkFETVNHIFsldSAhPSAldV0iLAotCQkgICAgICAgY2FsbC0+cmVwbHlfc2l6ZSwgY2FsbC0+cmVwbHlfbWF4KTsKLQkJcmV0dXJuIC1FQkFETVNHOwotCX0KKwlyZXQgPSBhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSBvbmNlIHdlJ3ZlIHJlY2VpdmVkIGFsbCBvZiBpdCAqLwogCWJwID0gY2FsbC0+YnVmZmVyOwpAQCAtMTI4NiwyNiArMTIzOSwxOCBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5TdG9yZVN0YXR1cwogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3N0b3JlX3N0YXR1cyhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfc3RvcmVfc3RhdHVzKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKIAlhZnNfZGF0YXZlcnNpb25fdCAqc3RvcmVfdmVyc2lvbjsKIAlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IGNhbGwtPnJlcGx5OwogCWNvbnN0IF9fYmUzMiAqYnA7CisJaW50IHJldDsKIAotCV9lbnRlcigiLCwldSIsIGxhc3QpOworCV9lbnRlcigiIik7CiAKLQlhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiKTsKLQlpZiAoIWxhc3QpIHsKLQkJX2xlYXZlKCIgPSAwIFttb3JlXSIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoY2FsbC0+cmVwbHlfc2l6ZSAhPSBjYWxsLT5yZXBseV9tYXgpIHsKLQkJX2xlYXZlKCIgPSAtRUJBRE1TRyBbJXUgIT0gJXVdIiwKLQkJICAgICAgIGNhbGwtPnJlcGx5X3NpemUsIGNhbGwtPnJlcGx5X21heCk7Ci0JCXJldHVybiAtRUJBRE1TRzsKLQl9CisJcmV0ID0gYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCiAJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgb25jZSB3ZSd2ZSByZWNlaXZlZCBhbGwgb2YgaXQgKi8KIAlzdG9yZV92ZXJzaW9uID0gTlVMTDsKQEAgLTE0ODUsMTQgKzE0MzAsMTMgQEAKIC8qCiAgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYW4gRlMuR2V0Vm9sdW1lU3RhdHVzCiAgKi8KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfZ2V0X3ZvbHVtZV9zdGF0dXMoc3RydWN0IGFmc19jYWxsICpjYWxsLAotCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19nZXRfdm9sdW1lX3N0YXR1cyhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CiAJY29uc3QgX19iZTMyICpicDsKIAljaGFyICpwOwogCWludCByZXQ7CiAKLQlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKKwlfZW50ZXIoInsldX0iLCBjYWxsLT51bm1hcnNoYWxsKTsKIAogCXN3aXRjaCAoY2FsbC0+dW5tYXJzaGFsbCkgewogCWNhc2UgMDoKQEAgLTE1MDIsMTMgKzE0NDYsMTAgQEAKIAkJLyogZXh0cmFjdCB0aGUgcmV0dXJuZWQgc3RhdHVzIHJlY29yZCAqLwogCWNhc2UgMToKIAkJX2RlYnVnKCJleHRyYWN0IHN0YXR1cyIpOwotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgY2FsbC0+YnVmZmVyLAotCQkJCSAgICAgICAxMiAqIDQpOwotCQlzd2l0Y2ggKHJldCkgewotCQljYXNlIDA6CQlicmVhazsKLQkJY2FzZSAtRUFHQUlOOglyZXR1cm4gMDsKLQkJZGVmYXVsdDoJcmV0dXJuIHJldDsKLQkJfQorCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIGNhbGwtPmJ1ZmZlciwKKwkJCQkgICAgICAgMTIgKiA0LCB0cnVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OwogCiAJCWJwID0gY2FsbC0+YnVmZmVyOwogCQl4ZHJfZGVjb2RlX0FGU0ZldGNoVm9sdW1lU3RhdHVzKCZicCwgY2FsbC0+cmVwbHkyKTsKQEAgLTE1MTcsMTIgKzE0NTgsOSBAQAogCiAJCS8qIGV4dHJhY3QgdGhlIHZvbHVtZSBuYW1lIGxlbmd0aCAqLwogCWNhc2UgMjoKLQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBza2IsIGxhc3QsICZjYWxsLT50bXAsIDQpOwotCQlzd2l0Y2ggKHJldCkgewotCQljYXNlIDA6CQlicmVhazsKLQkJY2FzZSAtRUFHQUlOOglyZXR1cm4gMDsKLQkJZGVmYXVsdDoJcmV0dXJuIHJldDsKLQkJfQorCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsICZjYWxsLT50bXAsIDQsIHRydWUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CiAKIAkJY2FsbC0+Y291bnQgPSBudG9obChjYWxsLT50bXApOwogCQlfZGVidWcoInZvbG5hbWUgbGVuZ3RoOiAldSIsIGNhbGwtPmNvdW50KTsKQEAgLTE1MzUsMTMgKzE0NzMsMTAgQEAKIAljYXNlIDM6CiAJCV9kZWJ1ZygiZXh0cmFjdCB2b2xuYW1lIik7CiAJCWlmIChjYWxsLT5jb3VudCA+IDApIHsKLQkJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5yZXBseTMsCi0JCQkJCSAgICAgICBjYWxsLT5jb3VudCk7Ci0JCQlzd2l0Y2ggKHJldCkgewotCQkJY2FzZSAwOgkJYnJlYWs7Ci0JCQljYXNlIC1FQUdBSU46CXJldHVybiAwOwotCQkJZGVmYXVsdDoJcmV0dXJuIHJldDsKLQkJCX0KKwkJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+cmVwbHkzLAorCQkJCQkgICAgICAgY2FsbC0+Y291bnQsIHRydWUpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKIAkJfQogCiAJCXAgPSBjYWxsLT5yZXBseTM7CkBAIC0xNTU5LDEzICsxNDk0LDEwIEBACiAJCWNhbGwtPmNvdW50ID0gNCAtIChjYWxsLT5jb3VudCAmIDMpOwogCiAJY2FzZSA0OgotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgY2FsbC0+YnVmZmVyLAotCQkJCSAgICAgICBjYWxsLT5jb3VudCk7Ci0JCXN3aXRjaCAocmV0KSB7Ci0JCWNhc2UgMDoJCWJyZWFrOwotCQljYXNlIC1FQUdBSU46CXJldHVybiAwOwotCQlkZWZhdWx0OglyZXR1cm4gcmV0OwotCQl9CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICBjYWxsLT5jb3VudCwgdHJ1ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAogCQljYWxsLT5vZmZzZXQgPSAwOwogCQljYWxsLT51bm1hcnNoYWxsKys7CkBAIC0xNTczLDEyICsxNTA1LDkgQEAKIAogCQkvKiBleHRyYWN0IHRoZSBvZmZsaW5lIG1lc3NhZ2UgbGVuZ3RoICovCiAJY2FzZSA1OgotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgJmNhbGwtPnRtcCwgNCk7Ci0JCXN3aXRjaCAocmV0KSB7Ci0JCWNhc2UgMDoJCWJyZWFrOwotCQljYXNlIC1FQUdBSU46CXJldHVybiAwOwotCQlkZWZhdWx0OglyZXR1cm4gcmV0OwotCQl9CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgJmNhbGwtPnRtcCwgNCwgdHJ1ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAogCQljYWxsLT5jb3VudCA9IG50b2hsKGNhbGwtPnRtcCk7CiAJCV9kZWJ1Zygib2ZmbGluZSBtc2cgbGVuZ3RoOiAldSIsIGNhbGwtPmNvdW50KTsKQEAgLTE1OTEsMTMgKzE1MjAsMTAgQEAKIAljYXNlIDY6CiAJCV9kZWJ1ZygiZXh0cmFjdCBvZmZsaW5lIik7CiAJCWlmIChjYWxsLT5jb3VudCA+IDApIHsKLQkJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5yZXBseTMsCi0JCQkJCSAgICAgICBjYWxsLT5jb3VudCk7Ci0JCQlzd2l0Y2ggKHJldCkgewotCQkJY2FzZSAwOgkJYnJlYWs7Ci0JCQljYXNlIC1FQUdBSU46CXJldHVybiAwOwotCQkJZGVmYXVsdDoJcmV0dXJuIHJldDsKLQkJCX0KKwkJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+cmVwbHkzLAorCQkJCQkgICAgICAgY2FsbC0+Y291bnQsIHRydWUpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKIAkJfQogCiAJCXAgPSBjYWxsLT5yZXBseTM7CkBAIC0xNjE1LDEzICsxNTQxLDEwIEBACiAJCWNhbGwtPmNvdW50ID0gNCAtIChjYWxsLT5jb3VudCAmIDMpOwogCiAJY2FzZSA3OgotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgY2FsbC0+YnVmZmVyLAotCQkJCSAgICAgICBjYWxsLT5jb3VudCk7Ci0JCXN3aXRjaCAocmV0KSB7Ci0JCWNhc2UgMDoJCWJyZWFrOwotCQljYXNlIC1FQUdBSU46CXJldHVybiAwOwotCQlkZWZhdWx0OglyZXR1cm4gcmV0OwotCQl9CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICBjYWxsLT5jb3VudCwgdHJ1ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAogCQljYWxsLT5vZmZzZXQgPSAwOwogCQljYWxsLT51bm1hcnNoYWxsKys7CkBAIC0xNjI5LDEyICsxNTUyLDkgQEAKIAogCQkvKiBleHRyYWN0IHRoZSBtZXNzYWdlIG9mIHRoZSBkYXkgbGVuZ3RoICovCiAJY2FzZSA4OgotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgJmNhbGwtPnRtcCwgNCk7Ci0JCXN3aXRjaCAocmV0KSB7Ci0JCWNhc2UgMDoJCWJyZWFrOwotCQljYXNlIC1FQUdBSU46CXJldHVybiAwOwotCQlkZWZhdWx0OglyZXR1cm4gcmV0OwotCQl9CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgJmNhbGwtPnRtcCwgNCwgdHJ1ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAogCQljYWxsLT5jb3VudCA9IG50b2hsKGNhbGwtPnRtcCk7CiAJCV9kZWJ1ZygibW90ZCBsZW5ndGg6ICV1IiwgY2FsbC0+Y291bnQpOwpAQCAtMTY0NywxMyArMTU2NywxMCBAQAogCWNhc2UgOToKIAkJX2RlYnVnKCJleHRyYWN0IG1vdGQiKTsKIAkJaWYgKGNhbGwtPmNvdW50ID4gMCkgewotCQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBza2IsIGxhc3QsIGNhbGwtPnJlcGx5MywKLQkJCQkJICAgICAgIGNhbGwtPmNvdW50KTsKLQkJCXN3aXRjaCAocmV0KSB7Ci0JCQljYXNlIDA6CQlicmVhazsKLQkJCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7Ci0JCQlkZWZhdWx0OglyZXR1cm4gcmV0OwotCQkJfQorCQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBjYWxsLT5yZXBseTMsCisJCQkJCSAgICAgICBjYWxsLT5jb3VudCwgdHJ1ZSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OwogCQl9CiAKIAkJcCA9IGNhbGwtPnJlcGx5MzsKQEAgLTE2NjQsMzUgKzE1ODEsMjAgQEAKIAkJY2FsbC0+dW5tYXJzaGFsbCsrOwogCiAJCS8qIGV4dHJhY3QgdGhlIG1lc3NhZ2Ugb2YgdGhlIGRheSBwYWRkaW5nICovCi0JCWlmICgoY2FsbC0+Y291bnQgJiAzKSA9PSAwKSB7Ci0JCQljYWxsLT51bm1hcnNoYWxsKys7Ci0JCQlnb3RvIG5vX21vdGRfcGFkZGluZzsKLQkJfQotCQljYWxsLT5jb3VudCA9IDQgLSAoY2FsbC0+Y291bnQgJiAzKTsKKwkJY2FsbC0+Y291bnQgPSAoNCAtIChjYWxsLT5jb3VudCAmIDMpKSAmIDM7CiAKIAljYXNlIDEwOgotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgY2FsbC0+YnVmZmVyLAotCQkJCSAgICAgICBjYWxsLT5jb3VudCk7Ci0JCXN3aXRjaCAocmV0KSB7Ci0JCWNhc2UgMDoJCWJyZWFrOwotCQljYXNlIC1FQUdBSU46CXJldHVybiAwOwotCQlkZWZhdWx0OglyZXR1cm4gcmV0OwotCQl9CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICBjYWxsLT5jb3VudCwgZmFsc2UpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CiAKIAkJY2FsbC0+b2Zmc2V0ID0gMDsKIAkJY2FsbC0+dW5tYXJzaGFsbCsrOwotCW5vX21vdGRfcGFkZGluZzoKLQogCWNhc2UgMTE6Ci0JCV9kZWJ1ZygidHJhaWxlciAlZCIsIHNrYi0+bGVuKTsKLQkJaWYgKHNrYi0+bGVuICE9IDApCi0JCQlyZXR1cm4gLUVCQURNU0c7CiAJCWJyZWFrOwogCX0KIAotCWlmICghbGFzdCkKLQkJcmV0dXJuIDA7Ci0KIAlfbGVhdmUoIiA9IDAgW2RvbmVdIik7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNzYwLDE5ICsxNjYyLDE2IEBACiAvKgogICogZGVsaXZlciByZXBseSBkYXRhIHRvIGFuIEZTLlNldExvY2ssIEZTLkV4dGVuZExvY2sgb3IgRlMuUmVsZWFzZUxvY2sKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc194eHh4X2xvY2soc3RydWN0IGFmc19jYWxsICpjYWxsLAotCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3h4eHhfbG9jayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CiAJY29uc3QgX19iZTMyICpicDsKKwlpbnQgcmV0OwogCi0JX2VudGVyKCJ7JXV9LHsldX0sJWQiLCBjYWxsLT51bm1hcnNoYWxsLCBza2ItPmxlbiwgbGFzdCk7CisJX2VudGVyKCJ7JXV9IiwgY2FsbC0+dW5tYXJzaGFsbCk7CiAKLQlhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiKTsKLQlpZiAoIWxhc3QpCi0JCXJldHVybiAwOwotCi0JaWYgKGNhbGwtPnJlcGx5X3NpemUgIT0gY2FsbC0+cmVwbHlfbWF4KQotCQlyZXR1cm4gLUVCQURNU0c7CisJcmV0ID0gYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCiAJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgb25jZSB3ZSd2ZSByZWNlaXZlZCBhbGwgb2YgaXQgKi8KIAlicCA9IGNhbGwtPmJ1ZmZlcjsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9pbnRlcm5hbC5oIGIvZnMvYWZzL2ludGVybmFsLmgKaW5kZXggNzFkNTk4Mi4uNTQ5N2M4NCAxMDA2NDQKLS0tIGEvZnMvYWZzL2ludGVybmFsLmgKKysrIGIvZnMvYWZzL2ludGVybmFsLmgKQEAgLTEzLDEzICsxMywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3J4cnBjLmg+CiAjaW5jbHVkZSA8bGludXgva2V5Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9mc2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KIAogI2luY2x1ZGUgImFmcy5oIgogI2luY2x1ZGUgImFmc192bC5oIgpAQCAtNTYsNyArNTYsNyBAQAogICovCiBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSB7CiAJLyogUnhSUEMgcmVjZWl2ZWQgbWVzc2FnZSBub3RpZmljYXRpb24gKi8KLQl2b2lkICgqcnhfd2FrZXVwKShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpOworCXJ4cnBjX25vdGlmeV9yeF90IG5vdGlmeV9yeDsKIAogCS8qIHN5bmNocm9ub3VzIGNhbGwgd2FpdGVyIGFuZCBjYWxsIGRpc3BhdGNoZWQgbm90aWZpY2F0aW9uICovCiAJaW50ICgqd2FpdCkoc3RydWN0IGFmc19jYWxsICpjYWxsKTsKQEAgLTc1LDEwICs3NSw4IEBACiAJY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgKnR5cGU7CS8qIHR5cGUgb2YgY2FsbCAqLwogCWNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGU7CS8qIGNvbXBsZXRpb24gd2FpdCBtb2RlICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdHE7CQkvKiBwcm9jZXNzZXMgYXdhaXRpbmcgY29tcGxldGlvbiAqLwotCXZvaWQgKCphc3luY193b3JrZm4pKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCk7IC8qIGFzeW5jaHJvbm91cyB3b3JrIGZ1bmN0aW9uICovCiAJc3RydWN0IHdvcmtfc3RydWN0CWFzeW5jX3dvcms7CS8qIGFzeW5jaHJvbm91cyB3b3JrIHByb2Nlc3NvciAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwkJLyogYWN0dWFsIHdvcmsgcHJvY2Vzc29yICovCi0Jc3RydWN0IHNrX2J1ZmZfaGVhZAlyeF9xdWV1ZTsJLyogcmVjZWl2ZWQgcGFja2V0cyAqLwogCXN0cnVjdCByeHJwY19jYWxsCSpyeGNhbGw7CS8qIFJ4UlBDIGNhbGwgaGFuZGxlICovCiAJc3RydWN0IGtleQkJKmtleTsJCS8qIHNlY3VyaXR5IGZvciB0aGlzIGNhbGwgKi8KIAlzdHJ1Y3QgYWZzX3NlcnZlcgkqc2VydmVyOwkvKiBzZXJ2ZXIgYWZmZWN0ZWQgYnkgaW5jb21pbmcgQ00gY2FsbCAqLwpAQCAtOTIsNiArOTAsNyBAQAogCXZvaWQJCQkqcmVwbHk0OwkvKiByZXBseSBidWZmZXIgKGZvdXJ0aCBwYXJ0KSAqLwogCXBnb2ZmX3QJCQlmaXJzdDsJCS8qIGZpcnN0IHBhZ2UgaW4gbWFwcGluZyB0byBkZWFsIHdpdGggKi8KIAlwZ29mZl90CQkJbGFzdDsJCS8qIGxhc3QgcGFnZSBpbiBtYXBwaW5nIHRvIGRlYWwgd2l0aCAqLworCXNpemVfdAkJCW9mZnNldDsJCS8qIG9mZnNldCBpbnRvIHJlY2VpdmVkIGRhdGEgc3RvcmUgKi8KIAllbnVtIHsJCQkJCS8qIGNhbGwgc3RhdGUgKi8KIAkJQUZTX0NBTExfUkVRVUVTVElORywJLyogcmVxdWVzdCBpcyBiZWluZyBzZW50IGZvciBvdXRnb2luZyBjYWxsICovCiAJCUFGU19DQUxMX0FXQUlUX1JFUExZLAkvKiBhd2FpdGluZyByZXBseSB0byBvdXRnb2luZyBjYWxsICovCkBAIC05OSwyMSArOTgsMTggQEAKIAkJQUZTX0NBTExfQVdBSVRfUkVRVUVTVCwJLyogYXdhaXRpbmcgcmVxdWVzdCBkYXRhIG9uIGluY29taW5nIGNhbGwgKi8KIAkJQUZTX0NBTExfUkVQTFlJTkcsCS8qIHJlcGx5aW5nIHRvIGluY29taW5nIGNhbGwgKi8KIAkJQUZTX0NBTExfQVdBSVRfQUNLLAkvKiBhd2FpdGluZyBmaW5hbCBBQ0sgb2YgaW5jb21pbmcgY2FsbCAqLwotCQlBRlNfQ0FMTF9DT01QTEVURSwJLyogc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCAqLwotCQlBRlNfQ0FMTF9CVVNZLAkJLyogc2VydmVyIHdhcyBidXN5ICovCi0JCUFGU19DQUxMX0FCT1JURUQsCS8qIGNhbGwgd2FzIGFib3J0ZWQgKi8KLQkJQUZTX0NBTExfRVJST1IsCQkvKiBjYWxsIGZhaWxlZCBkdWUgdG8gZXJyb3IgKi8KKwkJQUZTX0NBTExfQ09NUExFVEUsCS8qIENvbXBsZXRlZCBvciBmYWlsZWQgKi8KIAl9CQkJc3RhdGU7CiAJaW50CQkJZXJyb3I7CQkvKiBlcnJvciBjb2RlICovCisJdTMyCQkJYWJvcnRfY29kZTsJLyogUmVtb3RlIGFib3J0IElEIG9yIDAgKi8KIAl1bnNpZ25lZAkJcmVxdWVzdF9zaXplOwkvKiBzaXplIG9mIHJlcXVlc3QgZGF0YSAqLwogCXVuc2lnbmVkCQlyZXBseV9tYXg7CS8qIG1heGltdW0gc2l6ZSBvZiByZXBseSAqLwotCXVuc2lnbmVkCQlyZXBseV9zaXplOwkvKiBjdXJyZW50IHNpemUgb2YgcmVwbHkgKi8KIAl1bnNpZ25lZAkJZmlyc3Rfb2Zmc2V0OwkvKiBvZmZzZXQgaW50byBtYXBwaW5nW2ZpcnN0XSAqLwogCXVuc2lnbmVkCQlsYXN0X3RvOwkvKiBhbW91bnQgb2YgbWFwcGluZ1tsYXN0XSAqLwotCXVuc2lnbmVkCQlvZmZzZXQ7CQkvKiBvZmZzZXQgaW50byByZWNlaXZlZCBkYXRhIHN0b3JlICovCiAJdW5zaWduZWQgY2hhcgkJdW5tYXJzaGFsbDsJLyogdW5tYXJzaGFsbGluZyBwaGFzZSAqLwogCWJvb2wJCQlpbmNvbWluZzsJLyogVCBpZiBpbmNvbWluZyBjYWxsICovCiAJYm9vbAkJCXNlbmRfcGFnZXM7CS8qIFQgaWYgZGF0YSBmcm9tIG1hcHBpbmcgc2hvdWxkIGJlIHNlbnQgKi8KKwlib29sCQkJbmVlZF9hdHRlbnRpb247CS8qIFQgaWYgUnhSUEMgcG9rZWQgdXMgKi8KIAl1MTYJCQlzZXJ2aWNlX2lkOwkvKiBSeFJQQyBzZXJ2aWNlIElEIHRvIGNhbGwgKi8KIAlfX2JlMTYJCQlwb3J0OwkJLyogdGFyZ2V0IFVEUCBwb3J0ICovCiAJX19iZTMyCQkJb3BlcmF0aW9uX0lEOwkvKiBvcGVyYXRpb24gSUQgZm9yIGFuIGluY29taW5nIGNhbGwgKi8KQEAgLTEyOCw4ICsxMjQsNyBAQAogCS8qIGRlbGl2ZXIgcmVxdWVzdCBvciByZXBseSBkYXRhIHRvIGFuIGNhbGwKIAkgKiAtIHJldHVybmluZyBhbiBlcnJvciB3aWxsIGNhdXNlIHRoZSBjYWxsIHRvIGJlIGFib3J0ZWQKIAkgKi8KLQlpbnQgKCpkZWxpdmVyKShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgICBib29sIGxhc3QpOworCWludCAoKmRlbGl2ZXIpKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCk7CiAKIAkvKiBtYXAgYW4gYWJvcnQgY29kZSB0byBhbiBlcnJvciBudW1iZXIgKi8KIAlpbnQgKCphYm9ydF90b19lcnJvcikodTMyIGFib3J0X2NvZGUpOwpAQCAtNjA3LDYgKzYwMiw4IEBACiAvKgogICogcnhycGMuYwogICovCitleHRlcm4gc3RydWN0IHNvY2tldCAqYWZzX3NvY2tldDsKKwogZXh0ZXJuIGludCBhZnNfb3Blbl9zb2NrZXQodm9pZCk7CiBleHRlcm4gdm9pZCBhZnNfY2xvc2Vfc29ja2V0KHZvaWQpOwogZXh0ZXJuIGludCBhZnNfbWFrZV9jYWxsKHN0cnVjdCBpbl9hZGRyICosIHN0cnVjdCBhZnNfY2FsbCAqLCBnZnBfdCwKQEAgLTYxNCwxMSArNjExLDE0IEBACiBleHRlcm4gc3RydWN0IGFmc19jYWxsICphZnNfYWxsb2NfZmxhdF9jYWxsKGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlICosCiAJCQkJCSAgICBzaXplX3QsIHNpemVfdCk7CiBleHRlcm4gdm9pZCBhZnNfZmxhdF9jYWxsX2Rlc3RydWN0b3Ioc3RydWN0IGFmc19jYWxsICopOwotZXh0ZXJuIHZvaWQgYWZzX3RyYW5zZmVyX3JlcGx5KHN0cnVjdCBhZnNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIGV4dGVybiB2b2lkIGFmc19zZW5kX2VtcHR5X3JlcGx5KHN0cnVjdCBhZnNfY2FsbCAqKTsKIGV4dGVybiB2b2lkIGFmc19zZW5kX3NpbXBsZV9yZXBseShzdHJ1Y3QgYWZzX2NhbGwgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOwotZXh0ZXJuIGludCBhZnNfZXh0cmFjdF9kYXRhKHN0cnVjdCBhZnNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sLCB2b2lkICosCi0JCQkgICAgc2l6ZV90KTsKK2V4dGVybiBpbnQgYWZzX2V4dHJhY3RfZGF0YShzdHJ1Y3QgYWZzX2NhbGwgKiwgdm9pZCAqLCBzaXplX3QsIGJvb2wpOworCitzdGF0aWMgaW5saW5lIGludCBhZnNfdHJhbnNmZXJfcmVwbHkoc3RydWN0IGFmc19jYWxsICpjYWxsKQoreworCXJldHVybiBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIGNhbGwtPmJ1ZmZlciwgY2FsbC0+cmVwbHlfbWF4LCBmYWxzZSk7Cit9CiAKIC8qCiAgKiBzZWN1cml0eS5jCkBAIC02NDIsNyArNjQyLDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBhZnNfc2VydmVyICphZnNfbG9va3VwX3NlcnZlcihzdHJ1Y3QgYWZzX2NlbGwgKiwKIAkJCQkJICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICopOwotZXh0ZXJuIHN0cnVjdCBhZnNfc2VydmVyICphZnNfZmluZF9zZXJ2ZXIoY29uc3Qgc3RydWN0IGluX2FkZHIgKik7CitleHRlcm4gc3RydWN0IGFmc19zZXJ2ZXIgKmFmc19maW5kX3NlcnZlcihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKik7CiBleHRlcm4gdm9pZCBhZnNfcHV0X3NlcnZlcihzdHJ1Y3QgYWZzX3NlcnZlciAqKTsKIGV4dGVybiB2b2lkIF9fZXhpdCBhZnNfcHVyZ2Vfc2VydmVycyh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvZnMvYWZzL21haW4uYyBiL2ZzL2Fmcy9tYWluLmMKaW5kZXggMzVkZTBjMC4uMGIxODdlZiAxMDA2NDQKLS0tIGEvZnMvYWZzL21haW4uYworKysgYi9mcy9hZnMvbWFpbi5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIE1PRFVMRV9ERVNDUklQVElPTigiQUZTIENsaWVudCBGaWxlIFN5c3RlbSIpOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3J4cnBjLmMgYi9mcy9hZnMvcnhycGMuYwppbmRleCA0ODMyZGU4NC4uNTliZGFhNyAxMDA2NDQKLS0tIGEvZnMvYWZzL3J4cnBjLmMKKysrIGIvZnMvYWZzL3J4cnBjLmMKQEAgLTE2LDM0ICsxNiwzNiBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiYWZzX2NtLmgiCiAKLXN0YXRpYyBzdHJ1Y3Qgc29ja2V0ICphZnNfc29ja2V0OyAvKiBteSBSeFJQQyBzb2NrZXQgKi8KK3N0cnVjdCBzb2NrZXQgKmFmc19zb2NrZXQ7IC8qIG15IFJ4UlBDIHNvY2tldCAqLwogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICphZnNfYXN5bmNfY2FsbHM7CitzdGF0aWMgc3RydWN0IGFmc19jYWxsICphZnNfc3BhcmVfaW5jb21pbmdfY2FsbDsKIHN0YXRpYyBhdG9taWNfdCBhZnNfb3V0c3RhbmRpbmdfY2FsbHM7Ci1zdGF0aWMgYXRvbWljX3QgYWZzX291dHN0YW5kaW5nX3NrYnM7CiAKLXN0YXRpYyB2b2lkIGFmc193YWtlX3VwX2NhbGxfd2FpdGVyKHN0cnVjdCBhZnNfY2FsbCAqKTsKK3N0YXRpYyB2b2lkIGFmc19mcmVlX2NhbGwoc3RydWN0IGFmc19jYWxsICopOworc3RhdGljIHZvaWQgYWZzX3dha2VfdXBfY2FsbF93YWl0ZXIoc3RydWN0IHNvY2sgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKiwgdW5zaWduZWQgbG9uZyk7CiBzdGF0aWMgaW50IGFmc193YWl0X2Zvcl9jYWxsX3RvX2NvbXBsZXRlKHN0cnVjdCBhZnNfY2FsbCAqKTsKLXN0YXRpYyB2b2lkIGFmc193YWtlX3VwX2FzeW5jX2NhbGwoc3RydWN0IGFmc19jYWxsICopOworc3RhdGljIHZvaWQgYWZzX3dha2VfdXBfYXN5bmNfY2FsbChzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqLCB1bnNpZ25lZCBsb25nKTsKIHN0YXRpYyBpbnQgYWZzX2RvbnRfd2FpdF9mb3JfY2FsbF90b19jb21wbGV0ZShzdHJ1Y3QgYWZzX2NhbGwgKik7Ci1zdGF0aWMgdm9pZCBhZnNfcHJvY2Vzc19hc3luY19jYWxsKHN0cnVjdCBhZnNfY2FsbCAqKTsKLXN0YXRpYyB2b2lkIGFmc19yeF9pbnRlcmNlcHRvcihzdHJ1Y3Qgc29jayAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY21fb3BfaWQoc3RydWN0IGFmc19jYWxsICosIHN0cnVjdCBza19idWZmICosIGJvb2wpOworc3RhdGljIHZvaWQgYWZzX3Byb2Nlc3NfYXN5bmNfY2FsbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBhZnNfcnhfbmV3X2NhbGwoc3RydWN0IHNvY2sgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKiwgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBhZnNfcnhfZGlzY2FyZF9uZXdfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqLCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY21fb3BfaWQoc3RydWN0IGFmc19jYWxsICopOwogCiAvKiBzeW5jaHJvbm91cyBjYWxsIG1hbmFnZW1lbnQgKi8KIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlIGFmc19zeW5jX2NhbGwgPSB7Ci0JLnJ4X3dha2V1cAk9IGFmc193YWtlX3VwX2NhbGxfd2FpdGVyLAorCS5ub3RpZnlfcngJPSBhZnNfd2FrZV91cF9jYWxsX3dhaXRlciwKIAkud2FpdAkJPSBhZnNfd2FpdF9mb3JfY2FsbF90b19jb21wbGV0ZSwKIH07CiAKIC8qIGFzeW5jaHJvbm91cyBjYWxsIG1hbmFnZW1lbnQgKi8KIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlIGFmc19hc3luY19jYWxsID0gewotCS5yeF93YWtldXAJPSBhZnNfd2FrZV91cF9hc3luY19jYWxsLAorCS5ub3RpZnlfcngJPSBhZnNfd2FrZV91cF9hc3luY19jYWxsLAogCS53YWl0CQk9IGFmc19kb250X3dhaXRfZm9yX2NhbGxfdG9fY29tcGxldGUsCiB9OwogCiAvKiBhc3luY2hyb25vdXMgaW5jb21pbmcgY2FsbCBtYW5hZ2VtZW50ICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgYWZzX2FzeW5jX2luY29taW5nX2NhbGwgPSB7Ci0JLnJ4X3dha2V1cAk9IGFmc193YWtlX3VwX2FzeW5jX2NhbGwsCisJLm5vdGlmeV9yeAk9IGFmc193YWtlX3VwX2FzeW5jX2NhbGwsCiB9OwogCiAvKiBhc3luY2hyb25vdXMgaW5jb21pbmcgY2FsbCBpbml0aWFsIHByb2Nlc3NpbmcgKi8KQEAgLTUzLDE3ICs1NSw5IEBACiAJLmFib3J0X3RvX2Vycm9yCT0gYWZzX2Fib3J0X3RvX2Vycm9yLAogfTsKIAotc3RhdGljIHZvaWQgYWZzX2NvbGxlY3RfaW5jb21pbmdfY2FsbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBhZnNfY2hhcmdlX3ByZWFsbG9jYXRpb24oc3RydWN0IHdvcmtfc3RydWN0ICopOwogCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmZfaGVhZCBhZnNfaW5jb21pbmdfY2FsbHM7Ci1zdGF0aWMgREVDTEFSRV9XT1JLKGFmc19jb2xsZWN0X2luY29taW5nX2NhbGxfd29yaywgYWZzX2NvbGxlY3RfaW5jb21pbmdfY2FsbCk7Ci0KLXN0YXRpYyB2b2lkIGFmc19hc3luY193b3JrZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX2NhbGwsIGFzeW5jX3dvcmspOwotCi0JY2FsbC0+YXN5bmNfd29ya2ZuKGNhbGwpOwotfQorc3RhdGljIERFQ0xBUkVfV09SSyhhZnNfY2hhcmdlX3ByZWFsbG9jYXRpb25fd29yaywgYWZzX2NoYXJnZV9wcmVhbGxvY2F0aW9uKTsKIAogc3RhdGljIGludCBhZnNfd2FpdF9hdG9taWNfdChhdG9taWNfdCAqcCkKIHsKQEAgLTgzLDEwICs3Nyw4IEBACiAKIAlfZW50ZXIoIiIpOwogCi0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYWZzX2luY29taW5nX2NhbGxzKTsKLQogCXJldCA9IC1FTk9NRU07Ci0JYWZzX2FzeW5jX2NhbGxzID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImthZnNkIik7CisJYWZzX2FzeW5jX2NhbGxzID0gYWxsb2Nfd29ya3F1ZXVlKCJrYWZzZCIsIFdRX01FTV9SRUNMQUlNLCAwKTsKIAlpZiAoIWFmc19hc3luY19jYWxscykKIAkJZ290byBlcnJvcl8wOwogCkBAIC0xMTAsMTMgKzEwMiwxNSBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yXzI7CiAKKwlyeHJwY19rZXJuZWxfbmV3X2NhbGxfbm90aWZpY2F0aW9uKHNvY2tldCwgYWZzX3J4X25ld19jYWxsLAorCQkJCQkgICBhZnNfcnhfZGlzY2FyZF9uZXdfY2FsbCk7CisKIAlyZXQgPSBrZXJuZWxfbGlzdGVuKHNvY2tldCwgSU5UX01BWCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3JfMjsKIAotCXJ4cnBjX2tlcm5lbF9pbnRlcmNlcHRfcnhfbWVzc2FnZXMoc29ja2V0LCBhZnNfcnhfaW50ZXJjZXB0b3IpOwotCiAJYWZzX3NvY2tldCA9IHNvY2tldDsKKwlhZnNfY2hhcmdlX3ByZWFsbG9jYXRpb24oTlVMTCk7CiAJX2xlYXZlKCIgPSAwIik7CiAJcmV0dXJuIDA7CiAKQEAgLTEzNiw1NSArMTMwLDI4IEBACiB7CiAJX2VudGVyKCIiKTsKIAorCWlmIChhZnNfc3BhcmVfaW5jb21pbmdfY2FsbCkgeworCQlhdG9taWNfaW5jKCZhZnNfb3V0c3RhbmRpbmdfY2FsbHMpOworCQlhZnNfZnJlZV9jYWxsKGFmc19zcGFyZV9pbmNvbWluZ19jYWxsKTsKKwkJYWZzX3NwYXJlX2luY29taW5nX2NhbGwgPSBOVUxMOworCX0KKworCV9kZWJ1Zygib3V0c3RhbmRpbmcgJXUiLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX2NhbGxzKSk7CiAJd2FpdF9vbl9hdG9taWNfdCgmYWZzX291dHN0YW5kaW5nX2NhbGxzLCBhZnNfd2FpdF9hdG9taWNfdCwKIAkJCSBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJX2RlYnVnKCJubyBvdXRzdGFuZGluZyBjYWxscyIpOwogCisJZmx1c2hfd29ya3F1ZXVlKGFmc19hc3luY19jYWxscyk7CisJa2VybmVsX3NvY2tfc2h1dGRvd24oYWZzX3NvY2tldCwgU0hVVF9SRFdSKTsKKwlmbHVzaF93b3JrcXVldWUoYWZzX2FzeW5jX2NhbGxzKTsKIAlzb2NrX3JlbGVhc2UoYWZzX3NvY2tldCk7CiAKIAlfZGVidWcoImRld29yayIpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGFmc19hc3luY19jYWxscyk7Ci0KLQlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19za2JzKSwgPT0sIDApOwogCV9sZWF2ZSgiIik7CiB9CiAKIC8qCi0gKiBub3RlIHRoYXQgdGhlIGRhdGEgaW4gYSBzb2NrZXQgYnVmZmVyIGlzIG5vdyBkZWxpdmVyZWQgYW5kIHRoYXQgdGhlIGJ1ZmZlcgotICogc2hvdWxkIGJlIGZyZWVkCi0gKi8KLXN0YXRpYyB2b2lkIGFmc19kYXRhX2RlbGl2ZXJlZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWlmICghc2tiKSB7Ci0JCV9kZWJ1ZygiRExWUiBOVUxMIFslZF0iLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX3NrYnMpKTsKLQkJZHVtcF9zdGFjaygpOwotCX0gZWxzZSB7Ci0JCV9kZWJ1ZygiRExWUiAlcHsldX0gWyVkXSIsCi0JCSAgICAgICBza2IsIHNrYi0+bWFyaywgYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19za2JzKSk7Ci0JCWlmIChhdG9taWNfZGVjX3JldHVybigmYWZzX291dHN0YW5kaW5nX3NrYnMpID09IC0xKQotCQkJQlVHKCk7Ci0JCXJ4cnBjX2tlcm5lbF9kYXRhX2RlbGl2ZXJlZChza2IpOwotCX0KLX0KLQotLyoKLSAqIGZyZWUgYSBzb2NrZXQgYnVmZmVyCi0gKi8KLXN0YXRpYyB2b2lkIGFmc19mcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWlmICghc2tiKSB7Ci0JCV9kZWJ1ZygiRlJFRSBOVUxMIFslZF0iLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX3NrYnMpKTsKLQkJZHVtcF9zdGFjaygpOwotCX0gZWxzZSB7Ci0JCV9kZWJ1ZygiRlJFRSAlcHsldX0gWyVkXSIsCi0JCSAgICAgICBza2IsIHNrYi0+bWFyaywgYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19za2JzKSk7Ci0JCWlmIChhdG9taWNfZGVjX3JldHVybigmYWZzX291dHN0YW5kaW5nX3NrYnMpID09IC0xKQotCQkJQlVHKCk7Ci0JCXJ4cnBjX2tlcm5lbF9mcmVlX3NrYihza2IpOwotCX0KLX0KLQotLyoKICAqIGZyZWUgYSBjYWxsCiAgKi8KIHN0YXRpYyB2b2lkIGFmc19mcmVlX2NhbGwoc3RydWN0IGFmc19jYWxsICpjYWxsKQpAQCAtMTk0LDcgKzE2MSw2IEBACiAKIAlBU1NFUlRDTVAoY2FsbC0+cnhjYWxsLCA9PSwgTlVMTCk7CiAJQVNTRVJUKCF3b3JrX3BlbmRpbmcoJmNhbGwtPmFzeW5jX3dvcmspKTsKLQlBU1NFUlQoc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkpOwogCUFTU0VSVChjYWxsLT50eXBlLT5uYW1lICE9IE5VTEwpOwogCiAJa2ZyZWUoY2FsbC0+cmVxdWVzdCk7CkBAIC0yMTAsNyArMTc2LDcgQEAKIHN0YXRpYyB2b2lkIGFmc19lbmRfY2FsbF9ub2ZyZWUoc3RydWN0IGFmc19jYWxsICpjYWxsKQogewogCWlmIChjYWxsLT5yeGNhbGwpIHsKLQkJcnhycGNfa2VybmVsX2VuZF9jYWxsKGNhbGwtPnJ4Y2FsbCk7CisJCXJ4cnBjX2tlcm5lbF9lbmRfY2FsbChhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwpOwogCQljYWxsLT5yeGNhbGwgPSBOVUxMOwogCX0KIAlpZiAoY2FsbC0+dHlwZS0+ZGVzdHJ1Y3RvcikKQEAgLTIzMCw3ICsxOTYsNyBAQAogICogYWxsb2NhdGUgYSBjYWxsIHdpdGggZmxhdCByZXF1ZXN0IGFuZCByZXBseSBidWZmZXJzCiAgKi8KIHN0cnVjdCBhZnNfY2FsbCAqYWZzX2FsbG9jX2ZsYXRfY2FsbChjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSAqdHlwZSwKLQkJCQkgICAgIHNpemVfdCByZXF1ZXN0X3NpemUsIHNpemVfdCByZXBseV9zaXplKQorCQkJCSAgICAgc2l6ZV90IHJlcXVlc3Rfc2l6ZSwgc2l6ZV90IHJlcGx5X21heCkKIHsKIAlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGw7CiAKQEAgLTI0NCw3ICsyMTAsNyBAQAogCiAJY2FsbC0+dHlwZSA9IHR5cGU7CiAJY2FsbC0+cmVxdWVzdF9zaXplID0gcmVxdWVzdF9zaXplOwotCWNhbGwtPnJlcGx5X21heCA9IHJlcGx5X3NpemU7CisJY2FsbC0+cmVwbHlfbWF4ID0gcmVwbHlfbWF4OwogCiAJaWYgKHJlcXVlc3Rfc2l6ZSkgewogCQljYWxsLT5yZXF1ZXN0ID0ga21hbGxvYyhyZXF1ZXN0X3NpemUsIEdGUF9OT0ZTKTsKQEAgLTI1MiwxNCArMjE4LDEzIEBACiAJCQlnb3RvIG5vbWVtX2ZyZWU7CiAJfQogCi0JaWYgKHJlcGx5X3NpemUpIHsKLQkJY2FsbC0+YnVmZmVyID0ga21hbGxvYyhyZXBseV9zaXplLCBHRlBfTk9GUyk7CisJaWYgKHJlcGx5X21heCkgeworCQljYWxsLT5idWZmZXIgPSBrbWFsbG9jKHJlcGx5X21heCwgR0ZQX05PRlMpOwogCQlpZiAoIWNhbGwtPmJ1ZmZlcikKIAkJCWdvdG8gbm9tZW1fZnJlZTsKIAl9CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYWxsLT53YWl0cSk7Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2FsbC0+cnhfcXVldWUpOwogCXJldHVybiBjYWxsOwogCiBub21lbV9mcmVlOgpAQCAtMzI4LDggKzI5Myw4IEBACiAJCQkgKiByZXR1cm5zIGZyb20gc2VuZGluZyB0aGUgcmVxdWVzdCAqLwogCQkJaWYgKGZpcnN0ICsgbG9vcCA+PSBsYXN0KQogCQkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQVdBSVRfUkVQTFk7Ci0JCQlyZXQgPSByeHJwY19rZXJuZWxfc2VuZF9kYXRhKGNhbGwtPnJ4Y2FsbCwgbXNnLAotCQkJCQkJICAgICB0byAtIG9mZnNldCk7CisJCQlyZXQgPSByeHJwY19rZXJuZWxfc2VuZF9kYXRhKGFmc19zb2NrZXQsIGNhbGwtPnJ4Y2FsbCwKKwkJCQkJCSAgICAgbXNnLCB0byAtIG9mZnNldCk7CiAJCQlrdW5tYXAocGFnZXNbbG9vcF0pOwogCQkJaWYgKHJldCA8IDApCiAJCQkJYnJlYWs7CkBAIC0zNTcsNyArMzIyLDYgQEAKIAlzdHJ1Y3QgbXNnaGRyIG1zZzsKIAlzdHJ1Y3Qga3ZlYyBpb3ZbMV07CiAJaW50IHJldDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJX2VudGVyKCIleCx7JWR9LCIsIGFkZHItPnNfYWRkciwgbnRvaHMoY2FsbC0+cG9ydCkpOwogCkBAIC0zNjksOCArMzMzLDcgQEAKIAkgICAgICAgYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19jYWxscykpOwogCiAJY2FsbC0+d2FpdF9tb2RlID0gd2FpdF9tb2RlOwotCWNhbGwtPmFzeW5jX3dvcmtmbiA9IGFmc19wcm9jZXNzX2FzeW5jX2NhbGw7Ci0JSU5JVF9XT1JLKCZjYWxsLT5hc3luY193b3JrLCBhZnNfYXN5bmNfd29ya2ZuKTsKKwlJTklUX1dPUksoJmNhbGwtPmFzeW5jX3dvcmssIGFmc19wcm9jZXNzX2FzeW5jX2NhbGwpOwogCiAJbWVtc2V0KCZzcngsIDAsIHNpemVvZihzcngpKTsKIAlzcnguc3J4X2ZhbWlseSA9IEFGX1JYUlBDOwpAQCAtMzgzLDcgKzM0Niw4IEBACiAKIAkvKiBjcmVhdGUgYSBjYWxsICovCiAJcnhjYWxsID0gcnhycGNfa2VybmVsX2JlZ2luX2NhbGwoYWZzX3NvY2tldCwgJnNyeCwgY2FsbC0+a2V5LAotCQkJCQkgKHVuc2lnbmVkIGxvbmcpIGNhbGwsIGdmcCk7CisJCQkJCSAodW5zaWduZWQgbG9uZykgY2FsbCwgZ2ZwLAorCQkJCQkgd2FpdF9tb2RlLT5ub3RpZnlfcngpOwogCWNhbGwtPmtleSA9IE5VTEw7CiAJaWYgKElTX0VSUihyeGNhbGwpKSB7CiAJCXJldCA9IFBUUl9FUlIocnhjYWxsKTsKQEAgLTQwOSw3ICszNzMsOCBAQAogCSAqIHJlcXVlc3QgKi8KIAlpZiAoIWNhbGwtPnNlbmRfcGFnZXMpCiAJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQVdBSVRfUkVQTFk7Ci0JcmV0ID0gcnhycGNfa2VybmVsX3NlbmRfZGF0YShyeGNhbGwsICZtc2csIGNhbGwtPnJlcXVlc3Rfc2l6ZSk7CisJcmV0ID0gcnhycGNfa2VybmVsX3NlbmRfZGF0YShhZnNfc29ja2V0LCByeGNhbGwsCisJCQkJICAgICAmbXNnLCBjYWxsLT5yZXF1ZXN0X3NpemUpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yX2RvX2Fib3J0OwogCkBAIC00MjQsOSArMzg5LDcgQEAKIAlyZXR1cm4gd2FpdF9tb2RlLT53YWl0KGNhbGwpOwogCiBlcnJvcl9kb19hYm9ydDoKLQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChyeGNhbGwsIFJYX1VTRVJfQUJPUlQpOwotCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmNhbGwtPnJ4X3F1ZXVlKSkpCi0JCWFmc19mcmVlX3NrYihza2IpOworCXJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKGFmc19zb2NrZXQsIHJ4Y2FsbCwgUlhfVVNFUl9BQk9SVCwgLXJldCwgIktTRCIpOwogZXJyb3Jfa2lsbF9jYWxsOgogCWFmc19lbmRfY2FsbChjYWxsKTsKIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKQEAgLTQzNCwxMzUgKzM5Nyw3NyBAQAogfQogCiAvKgotICogSGFuZGxlcyBpbnRlcmNlcHRlZCBtZXNzYWdlcyB0aGF0IHdlcmUgYXJyaXZpbmcgaW4gdGhlIHNvY2tldCdzIFJ4IHF1ZXVlLgotICoKLSAqIENhbGxlZCBmcm9tIHRoZSBBRl9SWFJQQyBjYWxsIHByb2Nlc3NvciBpbiB3YWl0cXVldWUgcHJvY2VzcyBjb250ZXh0LiAgRm9yCi0gKiBlYWNoIGNhbGwsIGl0IGlzIGd1YXJhbnRlZWQgdGhpcyB3aWxsIGJlIGNhbGxlZCBpbiBvcmRlciBvZiBwYWNrZXQgdG8gYmUKLSAqIGRlbGl2ZXJlZC4KLSAqLwotc3RhdGljIHZvaWQgYWZzX3J4X2ludGVyY2VwdG9yKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgbG9uZyB1c2VyX2NhbGxfSUQsCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSAoc3RydWN0IGFmc19jYWxsICopIHVzZXJfY2FsbF9JRDsKLQotCV9lbnRlcigiJXAsLCV1IiwgY2FsbCwgc2tiLT5tYXJrKTsKLQotCV9kZWJ1ZygiSUNQVCAlcHsldX0gWyVkXSIsCi0JICAgICAgIHNrYiwgc2tiLT5tYXJrLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX3NrYnMpKTsKLQotCUFTU0VSVENNUChzaywgPT0sIGFmc19zb2NrZXQtPnNrKTsKLQlhdG9taWNfaW5jKCZhZnNfb3V0c3RhbmRpbmdfc2ticyk7Ci0KLQlpZiAoIWNhbGwpIHsKLQkJLyogaXRzIGFuIGluY29taW5nIGNhbGwgZm9yIG91ciBjYWxsYmFjayBzZXJ2aWNlICovCi0JCXNrYl9xdWV1ZV90YWlsKCZhZnNfaW5jb21pbmdfY2FsbHMsIHNrYik7Ci0JCXF1ZXVlX3dvcmsoYWZzX3dxLCAmYWZzX2NvbGxlY3RfaW5jb21pbmdfY2FsbF93b3JrKTsKLQl9IGVsc2UgewotCQkvKiByb3V0ZSB0aGUgbWVzc2FnZXMgZGlyZWN0bHkgdG8gdGhlIGFwcHJvcHJpYXRlIGNhbGwgKi8KLQkJc2tiX3F1ZXVlX3RhaWwoJmNhbGwtPnJ4X3F1ZXVlLCBza2IpOwotCQljYWxsLT53YWl0X21vZGUtPnJ4X3dha2V1cChjYWxsKTsKLQl9Ci0KLQlfbGVhdmUoIiIpOwotfQotCi0vKgogICogZGVsaXZlciBtZXNzYWdlcyB0byBhIGNhbGwKICAqLwogc3RhdGljIHZvaWQgYWZzX2RlbGl2ZXJfdG9fY2FsbChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlib29sIGxhc3Q7CiAJdTMyIGFib3J0X2NvZGU7CiAJaW50IHJldDsKIAotCV9lbnRlcigiIik7CisJX2VudGVyKCIlcyIsIGNhbGwtPnR5cGUtPm5hbWUpOwogCi0Jd2hpbGUgKChjYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9SRVBMWSB8fAotCQljYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9PUF9JRCB8fAotCQljYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9SRVFVRVNUIHx8Ci0JCWNhbGwtPnN0YXRlID09IEFGU19DQUxMX0FXQUlUX0FDSykgJiYKLQkgICAgICAgKHNrYiA9IHNrYl9kZXF1ZXVlKCZjYWxsLT5yeF9xdWV1ZSkpKSB7Ci0JCXN3aXRjaCAoc2tiLT5tYXJrKSB7Ci0JCWNhc2UgUlhSUENfU0tCX01BUktfREFUQToKLQkJCV9kZWJ1ZygiUmN2IERBVEEiKTsKLQkJCWxhc3QgPSByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0KHNrYik7Ci0JCQlyZXQgPSBjYWxsLT50eXBlLT5kZWxpdmVyKGNhbGwsIHNrYiwgbGFzdCk7Ci0JCQlzd2l0Y2ggKHJldCkgewotCQkJY2FzZSAwOgotCQkJCWlmIChsYXN0ICYmCi0JCQkJICAgIGNhbGwtPnN0YXRlID09IEFGU19DQUxMX0FXQUlUX1JFUExZKQotCQkJCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0NPTVBMRVRFOwotCQkJCWJyZWFrOwotCQkJY2FzZSAtRU5PVENPTk46Ci0JCQkJYWJvcnRfY29kZSA9IFJYX0NBTExfREVBRDsKLQkJCQlnb3RvIGRvX2Fib3J0OwotCQkJY2FzZSAtRU5PVFNVUFA6Ci0JCQkJYWJvcnRfY29kZSA9IFJYX0lOVkFMSURfT1BFUkFUSU9OOwotCQkJCWdvdG8gZG9fYWJvcnQ7Ci0JCQlkZWZhdWx0OgotCQkJCWFib3J0X2NvZGUgPSBSWEdFTl9DQ19VTk1BUlNIQUw7Ci0JCQkJaWYgKGNhbGwtPnN0YXRlICE9IEFGU19DQUxMX0FXQUlUX1JFUExZKQotCQkJCQlhYm9ydF9jb2RlID0gUlhHRU5fU1NfVU5NQVJTSEFMOwotCQkJZG9fYWJvcnQ6Ci0JCQkJcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoY2FsbC0+cnhjYWxsLAotCQkJCQkJCWFib3J0X2NvZGUpOwotCQkJCWNhbGwtPmVycm9yID0gcmV0OwotCQkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfRVJST1I7Ci0JCQkJYnJlYWs7CisJd2hpbGUgKGNhbGwtPnN0YXRlID09IEFGU19DQUxMX0FXQUlUX1JFUExZIHx8CisJICAgICAgIGNhbGwtPnN0YXRlID09IEFGU19DQUxMX0FXQUlUX09QX0lEIHx8CisJICAgICAgIGNhbGwtPnN0YXRlID09IEFGU19DQUxMX0FXQUlUX1JFUVVFU1QgfHwKKwkgICAgICAgY2FsbC0+c3RhdGUgPT0gQUZTX0NBTExfQVdBSVRfQUNLCisJICAgICAgICkgeworCQlpZiAoY2FsbC0+c3RhdGUgPT0gQUZTX0NBTExfQVdBSVRfQUNLKSB7CisJCQlzaXplX3Qgb2Zmc2V0ID0gMDsKKwkJCXJldCA9IHJ4cnBjX2tlcm5lbF9yZWN2X2RhdGEoYWZzX3NvY2tldCwgY2FsbC0+cnhjYWxsLAorCQkJCQkJICAgICBOVUxMLCAwLCAmb2Zmc2V0LCBmYWxzZSwKKwkJCQkJCSAgICAgJmNhbGwtPmFib3J0X2NvZGUpOworCQkJaWYgKHJldCA9PSAtRUlOUFJPR1JFU1MgfHwgcmV0ID09IC1FQUdBSU4pCisJCQkJcmV0dXJuOworCQkJaWYgKHJldCA9PSAxKSB7CisJCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9DT01QTEVURTsKKwkJCQlnb3RvIGRvbmU7CiAJCQl9Ci0JCQlhZnNfZGF0YV9kZWxpdmVyZWQoc2tiKTsKLQkJCXNrYiA9IE5VTEw7Ci0JCQljb250aW51ZTsKLQkJY2FzZSBSWFJQQ19TS0JfTUFSS19GSU5BTF9BQ0s6Ci0JCQlfZGVidWcoIlJjdiBBQ0siKTsKLQkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQ09NUExFVEU7Ci0JCQlicmVhazsKLQkJY2FzZSBSWFJQQ19TS0JfTUFSS19CVVNZOgotCQkJX2RlYnVnKCJSY3YgQlVTWSIpOwotCQkJY2FsbC0+ZXJyb3IgPSAtRUJVU1k7Ci0JCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0JVU1k7Ci0JCQlicmVhazsKLQkJY2FzZSBSWFJQQ19TS0JfTUFSS19SRU1PVEVfQUJPUlQ6Ci0JCQlhYm9ydF9jb2RlID0gcnhycGNfa2VybmVsX2dldF9hYm9ydF9jb2RlKHNrYik7Ci0JCQljYWxsLT5lcnJvciA9IGNhbGwtPnR5cGUtPmFib3J0X3RvX2Vycm9yKGFib3J0X2NvZGUpOwotCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9BQk9SVEVEOwotCQkJX2RlYnVnKCJSY3YgQUJPUlQgJXUgLT4gJWQiLCBhYm9ydF9jb2RlLCBjYWxsLT5lcnJvcik7Ci0JCQlicmVhazsKLQkJY2FzZSBSWFJQQ19TS0JfTUFSS19MT0NBTF9BQk9SVDoKLQkJCWFib3J0X2NvZGUgPSByeHJwY19rZXJuZWxfZ2V0X2Fib3J0X2NvZGUoc2tiKTsKLQkJCWNhbGwtPmVycm9yID0gY2FsbC0+dHlwZS0+YWJvcnRfdG9fZXJyb3IoYWJvcnRfY29kZSk7Ci0JCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0FCT1JURUQ7Ci0JCQlfZGVidWcoIkxvYyBBQk9SVCAldSAtPiAlZCIsIGFib3J0X2NvZGUsIGNhbGwtPmVycm9yKTsKLQkJCWJyZWFrOwotCQljYXNlIFJYUlBDX1NLQl9NQVJLX05FVF9FUlJPUjoKLQkJCWNhbGwtPmVycm9yID0gLXJ4cnBjX2tlcm5lbF9nZXRfZXJyb3JfbnVtYmVyKHNrYik7Ci0JCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0VSUk9SOwotCQkJX2RlYnVnKCJSY3YgTkVUIEVSUk9SICVkIiwgY2FsbC0+ZXJyb3IpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlhSUENfU0tCX01BUktfTE9DQUxfRVJST1I6Ci0JCQljYWxsLT5lcnJvciA9IC1yeHJwY19rZXJuZWxfZ2V0X2Vycm9yX251bWJlcihza2IpOwotCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9FUlJPUjsKLQkJCV9kZWJ1ZygiUmN2IExPQ0FMIEVSUk9SICVkIiwgY2FsbC0+ZXJyb3IpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlCVUcoKTsKLQkJCWJyZWFrOworCQkJcmV0dXJuOwogCQl9CiAKLQkJYWZzX2ZyZWVfc2tiKHNrYik7CisJCXJldCA9IGNhbGwtPnR5cGUtPmRlbGl2ZXIoY2FsbCk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoKKwkJCWlmIChjYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9SRVBMWSkKKwkJCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0NPTVBMRVRFOworCQkJZ290byBkb25lOworCQljYXNlIC1FSU5QUk9HUkVTUzoKKwkJY2FzZSAtRUFHQUlOOgorCQkJZ290byBvdXQ7CisJCWNhc2UgLUVOT1RDT05OOgorCQkJYWJvcnRfY29kZSA9IFJYX0NBTExfREVBRDsKKwkJCXJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKGFmc19zb2NrZXQsIGNhbGwtPnJ4Y2FsbCwKKwkJCQkJCWFib3J0X2NvZGUsIC1yZXQsICJLTkMiKTsKKwkJCWdvdG8gZG9fYWJvcnQ7CisJCWNhc2UgLUVOT1RTVVBQOgorCQkJYWJvcnRfY29kZSA9IFJYX0lOVkFMSURfT1BFUkFUSU9OOworCQkJcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoYWZzX3NvY2tldCwgY2FsbC0+cnhjYWxsLAorCQkJCQkJYWJvcnRfY29kZSwgLXJldCwgIktJViIpOworCQkJZ290byBkb19hYm9ydDsKKwkJY2FzZSAtRU5PREFUQToKKwkJY2FzZSAtRUJBRE1TRzoKKwkJY2FzZSAtRU1TR1NJWkU6CisJCWRlZmF1bHQ6CisJCQlhYm9ydF9jb2RlID0gUlhHRU5fQ0NfVU5NQVJTSEFMOworCQkJaWYgKGNhbGwtPnN0YXRlICE9IEFGU19DQUxMX0FXQUlUX1JFUExZKQorCQkJCWFib3J0X2NvZGUgPSBSWEdFTl9TU19VTk1BUlNIQUw7CisJCQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwsCisJCQkJCQlhYm9ydF9jb2RlLCBFQkFETVNHLCAiS1VNIik7CisJCQlnb3RvIGRvX2Fib3J0OworCQl9CiAJfQogCi0JLyogbWFrZSBzdXJlIHRoZSBxdWV1ZSBpcyBlbXB0eSBpZiB0aGUgY2FsbCBpcyBkb25lIHdpdGggKHdlIG1pZ2h0IGhhdmUKLQkgKiBhYm9ydGVkIHRoZSBjYWxsIGVhcmx5IGJlY2F1c2Ugb2YgYW4gdW5tYXJzaGFsbGluZyBlcnJvcikgKi8KLQlpZiAoY2FsbC0+c3RhdGUgPj0gQUZTX0NBTExfQ09NUExFVEUpIHsKLQkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY2FsbC0+cnhfcXVldWUpKSkKLQkJCWFmc19mcmVlX3NrYihza2IpOwotCQlpZiAoY2FsbC0+aW5jb21pbmcpCi0JCQlhZnNfZW5kX2NhbGwoY2FsbCk7Ci0JfQotCitkb25lOgorCWlmIChjYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9DT01QTEVURSAmJiBjYWxsLT5pbmNvbWluZykKKwkJYWZzX2VuZF9jYWxsKGNhbGwpOworb3V0OgogCV9sZWF2ZSgiIik7CisJcmV0dXJuOworCitkb19hYm9ydDoKKwljYWxsLT5lcnJvciA9IHJldDsKKwljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0NPTVBMRVRFOworCWdvdG8gZG9uZTsKIH0KIAogLyoKQEAgLTU3MCw3ICs0NzUsNyBAQAogICovCiBzdGF0aWMgaW50IGFmc193YWl0X2Zvcl9jYWxsX3RvX2NvbXBsZXRlKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWNvbnN0IGNoYXIgKmFib3J0X3doeTsKIAlpbnQgcmV0OwogCiAJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKQEAgLTU4MiwxNSArNDg3LDE4IEBACiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAKIAkJLyogZGVsaXZlciBhbnkgbWVzc2FnZXMgdGhhdCBhcmUgaW4gdGhlIHF1ZXVlICovCi0JCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkpIHsKKwkJaWYgKGNhbGwtPnN0YXRlIDwgQUZTX0NBTExfQ09NUExFVEUgJiYgY2FsbC0+bmVlZF9hdHRlbnRpb24pIHsKKwkJCWNhbGwtPm5lZWRfYXR0ZW50aW9uID0gZmFsc2U7CiAJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJCQlhZnNfZGVsaXZlcl90b19jYWxsKGNhbGwpOwogCQkJY29udGludWU7CiAJCX0KIAorCQlhYm9ydF93aHkgPSAiS1dDIjsKIAkJcmV0ID0gY2FsbC0+ZXJyb3I7Ci0JCWlmIChjYWxsLT5zdGF0ZSA+PSBBRlNfQ0FMTF9DT01QTEVURSkKKwkJaWYgKGNhbGwtPnN0YXRlID09IEFGU19DQUxMX0NPTVBMRVRFKQogCQkJYnJlYWs7CisJCWFib3J0X3doeSA9ICJLV0kiOwogCQlyZXQgPSAtRUlOVFI7CiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCWJyZWFrOwpAQCAtNjAzLDkgKzUxMSw4IEBACiAJLyoga2lsbCB0aGUgY2FsbCAqLwogCWlmIChjYWxsLT5zdGF0ZSA8IEFGU19DQUxMX0NPTVBMRVRFKSB7CiAJCV9kZWJ1ZygiY2FsbCBpbmNvbXBsZXRlIik7Ci0JCXJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKGNhbGwtPnJ4Y2FsbCwgUlhfQ0FMTF9ERUFEKTsKLQkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY2FsbC0+cnhfcXVldWUpKSkKLQkJCWFmc19mcmVlX3NrYihza2IpOworCQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwsCisJCQkJCVJYX0NBTExfREVBRCwgLXJldCwgYWJvcnRfd2h5KTsKIAl9CiAKIAlfZGVidWcoImNhbGwgY29tcGxldGUiKTsKQEAgLTYxNywxNyArNTI0LDI0IEBACiAvKgogICogd2FrZSB1cCBhIHdhaXRpbmcgY2FsbAogICovCi1zdGF0aWMgdm9pZCBhZnNfd2FrZV91cF9jYWxsX3dhaXRlcihzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCitzdGF0aWMgdm9pZCBhZnNfd2FrZV91cF9jYWxsX3dhaXRlcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCByeHJwY19jYWxsICpyeGNhbGwsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgY2FsbF91c2VyX0lEKQogeworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IChzdHJ1Y3QgYWZzX2NhbGwgKiljYWxsX3VzZXJfSUQ7CisKKwljYWxsLT5uZWVkX2F0dGVudGlvbiA9IHRydWU7CiAJd2FrZV91cCgmY2FsbC0+d2FpdHEpOwogfQogCiAvKgogICogd2FrZSB1cCBhbiBhc3luY2hyb25vdXMgY2FsbAogICovCi1zdGF0aWMgdm9pZCBhZnNfd2FrZV91cF9hc3luY19jYWxsKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKK3N0YXRpYyB2b2lkIGFmc193YWtlX3VwX2FzeW5jX2NhbGwoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhjYWxsLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgY2FsbF91c2VyX0lEKQogewotCV9lbnRlcigiIik7CisJc3RydWN0IGFmc19jYWxsICpjYWxsID0gKHN0cnVjdCBhZnNfY2FsbCAqKWNhbGxfdXNlcl9JRDsKKworCWNhbGwtPm5lZWRfYXR0ZW50aW9uID0gdHJ1ZTsKIAlxdWV1ZV93b3JrKGFmc19hc3luY19jYWxscywgJmNhbGwtPmFzeW5jX3dvcmspOwogfQogCkBAIC02NDUsOCArNTU5LDEwIEBACiAvKgogICogZGVsZXRlIGFuIGFzeW5jaHJvbm91cyBjYWxsCiAgKi8KLXN0YXRpYyB2b2lkIGFmc19kZWxldGVfYXN5bmNfY2FsbChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCitzdGF0aWMgdm9pZCBhZnNfZGVsZXRlX2FzeW5jX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX2NhbGwsIGFzeW5jX3dvcmspOworCiAJX2VudGVyKCIiKTsKIAogCWFmc19mcmVlX2NhbGwoY2FsbCk7CkBAIC02NTYsMTcgKzU3MiwxOSBAQAogCiAvKgogICogcGVyZm9ybSBwcm9jZXNzaW5nIG9uIGFuIGFzeW5jaHJvbm91cyBjYWxsCi0gKiAtIG9uIGEgbXVsdGlwbGUtdGhyZWFkIHdvcmtxdWV1ZSB0aGlzIHdvcmsgaXRlbSBtYXkgdHJ5IHRvIHJ1biBvbiBzZXZlcmFsCi0gKiAgIENQVXMgYXQgdGhlIHNhbWUgdGltZQogICovCi1zdGF0aWMgdm9pZCBhZnNfcHJvY2Vzc19hc3luY19jYWxsKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKK3N0YXRpYyB2b2lkIGFmc19wcm9jZXNzX2FzeW5jX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX2NhbGwsIGFzeW5jX3dvcmspOworCiAJX2VudGVyKCIiKTsKIAotCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkpCisJaWYgKGNhbGwtPnN0YXRlIDwgQUZTX0NBTExfQ09NUExFVEUgJiYgY2FsbC0+bmVlZF9hdHRlbnRpb24pIHsKKwkJY2FsbC0+bmVlZF9hdHRlbnRpb24gPSBmYWxzZTsKIAkJYWZzX2RlbGl2ZXJfdG9fY2FsbChjYWxsKTsKKwl9CiAKLQlpZiAoY2FsbC0+c3RhdGUgPj0gQUZTX0NBTExfQ09NUExFVEUgJiYgY2FsbC0+d2FpdF9tb2RlKSB7CisJaWYgKGNhbGwtPnN0YXRlID09IEFGU19DQUxMX0NPTVBMRVRFICYmIGNhbGwtPndhaXRfbW9kZSkgewogCQlpZiAoY2FsbC0+d2FpdF9tb2RlLT5hc3luY19jb21wbGV0ZSkKIAkJCWNhbGwtPndhaXRfbW9kZS0+YXN5bmNfY29tcGxldGUoY2FsbC0+cmVwbHksCiAJCQkJCQkJY2FsbC0+ZXJyb3IpOwpAQCAtNjc3LDEwNCArNTk1LDkzIEBACiAKIAkJLyogd2UgY2FuJ3QganVzdCBkZWxldGUgdGhlIGNhbGwgYmVjYXVzZSB0aGUgd29yayBpdGVtIG1heSBiZQogCQkgKiBxdWV1ZWQgKi8KLQkJY2FsbC0+YXN5bmNfd29ya2ZuID0gYWZzX2RlbGV0ZV9hc3luY19jYWxsOworCQljYWxsLT5hc3luY193b3JrLmZ1bmMgPSBhZnNfZGVsZXRlX2FzeW5jX2NhbGw7CiAJCXF1ZXVlX3dvcmsoYWZzX2FzeW5jX2NhbGxzLCAmY2FsbC0+YXN5bmNfd29yayk7CiAJfQogCiAJX2xlYXZlKCIiKTsKIH0KIAotLyoKLSAqIGVtcHR5IGEgc29ja2V0IGJ1ZmZlciBpbnRvIGEgZmxhdCByZXBseSBidWZmZXIKLSAqLwotdm9pZCBhZnNfdHJhbnNmZXJfcmVwbHkoc3RydWN0IGFmc19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgYWZzX3J4X2F0dGFjaChzdHJ1Y3QgcnhycGNfY2FsbCAqcnhjYWxsLCB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCkKIHsKLQlzaXplX3QgbGVuID0gc2tiLT5sZW47CisJc3RydWN0IGFmc19jYWxsICpjYWxsID0gKHN0cnVjdCBhZnNfY2FsbCAqKXVzZXJfY2FsbF9JRDsKIAotCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgY2FsbC0+YnVmZmVyICsgY2FsbC0+cmVwbHlfc2l6ZSwgbGVuKSA8IDApCi0JCUJVRygpOwotCWNhbGwtPnJlcGx5X3NpemUgKz0gbGVuOworCWNhbGwtPnJ4Y2FsbCA9IHJ4Y2FsbDsKIH0KIAogLyoKLSAqIGFjY2VwdCB0aGUgYmFja2xvZyBvZiBpbmNvbWluZyBjYWxscworICogQ2hhcmdlIHRoZSBpbmNvbWluZyBjYWxsIHByZWFsbG9jYXRpb24uCiAgKi8KLXN0YXRpYyB2b2lkIGFmc19jb2xsZWN0X2luY29taW5nX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgYWZzX2NoYXJnZV9wcmVhbGxvY2F0aW9uKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqcnhjYWxsOwotCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IE5VTEw7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSBhZnNfc3BhcmVfaW5jb21pbmdfY2FsbDsKIAotCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmFmc19pbmNvbWluZ19jYWxscykpKSB7Ci0JCV9kZWJ1ZygibmV3IGNhbGwiKTsKLQotCQkvKiBkb24ndCBuZWVkIHRoZSBub3RpZmljYXRpb24gKi8KLQkJYWZzX2ZyZWVfc2tiKHNrYik7Ci0KKwlmb3IgKDs7KSB7CiAJCWlmICghY2FsbCkgewogCQkJY2FsbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfY2FsbCksIEdGUF9LRVJORUwpOwotCQkJaWYgKCFjYWxsKSB7Ci0JCQkJcnhycGNfa2VybmVsX3JlamVjdF9jYWxsKGFmc19zb2NrZXQpOwotCQkJCXJldHVybjsKLQkJCX0KKwkJCWlmICghY2FsbCkKKwkJCQlicmVhazsKIAotCQkJY2FsbC0+YXN5bmNfd29ya2ZuID0gYWZzX3Byb2Nlc3NfYXN5bmNfY2FsbDsKLQkJCUlOSVRfV09SSygmY2FsbC0+YXN5bmNfd29yaywgYWZzX2FzeW5jX3dvcmtmbik7CisJCQlJTklUX1dPUksoJmNhbGwtPmFzeW5jX3dvcmssIGFmc19wcm9jZXNzX2FzeW5jX2NhbGwpOwogCQkJY2FsbC0+d2FpdF9tb2RlID0gJmFmc19hc3luY19pbmNvbWluZ19jYWxsOwogCQkJY2FsbC0+dHlwZSA9ICZhZnNfUlhDTXh4eHg7CiAJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYWxsLT53YWl0cSk7Ci0JCQlza2JfcXVldWVfaGVhZF9pbml0KCZjYWxsLT5yeF9xdWV1ZSk7CiAJCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0FXQUlUX09QX0lEOwotCi0JCQlfZGVidWcoIkNBTEwgJXB7JXN9IFslZF0iLAotCQkJICAgICAgIGNhbGwsIGNhbGwtPnR5cGUtPm5hbWUsCi0JCQkgICAgICAgYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19jYWxscykpOwotCQkJYXRvbWljX2luYygmYWZzX291dHN0YW5kaW5nX2NhbGxzKTsKIAkJfQogCi0JCXJ4Y2FsbCA9IHJ4cnBjX2tlcm5lbF9hY2NlcHRfY2FsbChhZnNfc29ja2V0LAotCQkJCQkJICAodW5zaWduZWQgbG9uZykgY2FsbCk7Ci0JCWlmICghSVNfRVJSKHJ4Y2FsbCkpIHsKLQkJCWNhbGwtPnJ4Y2FsbCA9IHJ4Y2FsbDsKLQkJCWNhbGwgPSBOVUxMOwotCQl9CisJCWlmIChyeHJwY19rZXJuZWxfY2hhcmdlX2FjY2VwdChhZnNfc29ja2V0LAorCQkJCQkgICAgICAgYWZzX3dha2VfdXBfYXN5bmNfY2FsbCwKKwkJCQkJICAgICAgIGFmc19yeF9hdHRhY2gsCisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyljYWxsLAorCQkJCQkgICAgICAgR0ZQX0tFUk5FTCkgPCAwKQorCQkJYnJlYWs7CisJCWNhbGwgPSBOVUxMOwogCX0KLQotCWlmIChjYWxsKQotCQlhZnNfZnJlZV9jYWxsKGNhbGwpOworCWFmc19zcGFyZV9pbmNvbWluZ19jYWxsID0gY2FsbDsKIH0KIAogLyoKLSAqIGdyYWIgdGhlIG9wZXJhdGlvbiBJRCBmcm9tIGFuIGluY29taW5nIGNhY2hlIG1hbmFnZXIgY2FsbAorICogRGlzY2FyZCBhIHByZWFsbG9jYXRlZCBjYWxsIHdoZW4gYSBzb2NrZXQgaXMgc2h1dCBkb3duLgogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2NtX29wX2lkKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQlib29sIGxhc3QpCitzdGF0aWMgdm9pZCBhZnNfcnhfZGlzY2FyZF9uZXdfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqcnhjYWxsLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCkKIHsKLQlzaXplX3QgbGVuID0gc2tiLT5sZW47Ci0Jdm9pZCAqb2lidWYgPSAodm9pZCAqKSAmY2FsbC0+b3BlcmF0aW9uX0lEOworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IChzdHJ1Y3QgYWZzX2NhbGwgKil1c2VyX2NhbGxfSUQ7CiAKLQlfZW50ZXIoInsldX0seyV6dX0sJWQiLCBjYWxsLT5vZmZzZXQsIGxlbiwgbGFzdCk7CisJYXRvbWljX2luYygmYWZzX291dHN0YW5kaW5nX2NhbGxzKTsKKwljYWxsLT5yeGNhbGwgPSBOVUxMOworCWFmc19mcmVlX2NhbGwoY2FsbCk7Cit9CisKKy8qCisgKiBOb3RpZmljYXRpb24gb2YgYW4gaW5jb21pbmcgY2FsbC4KKyAqLworc3RhdGljIHZvaWQgYWZzX3J4X25ld19jYWxsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHJ4cnBjX2NhbGwgKnJ4Y2FsbCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCkKK3sKKwlhdG9taWNfaW5jKCZhZnNfb3V0c3RhbmRpbmdfY2FsbHMpOworCXF1ZXVlX3dvcmsoYWZzX3dxLCAmYWZzX2NoYXJnZV9wcmVhbGxvY2F0aW9uX3dvcmspOworfQorCisvKgorICogR3JhYiB0aGUgb3BlcmF0aW9uIElEIGZyb20gYW4gaW5jb21pbmcgY2FjaGUgbWFuYWdlciBjYWxsLiAgVGhlIHNvY2tldAorICogYnVmZmVyIGlzIGRpc2NhcmRlZCBvbiBlcnJvciBvciBpZiB3ZSBkb24ndCB5ZXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEuCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY21fb3BfaWQoc3RydWN0IGFmc19jYWxsICpjYWxsKQoreworCWludCByZXQ7CisKKwlfZW50ZXIoInslenV9IiwgY2FsbC0+b2Zmc2V0KTsKIAogCUFTU0VSVENNUChjYWxsLT5vZmZzZXQsIDwsIDQpOwogCiAJLyogdGhlIG9wZXJhdGlvbiBJRCBmb3JtcyB0aGUgZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgcmVxdWVzdCBkYXRhICovCi0JbGVuID0gbWluX3Qoc2l6ZV90LCBsZW4sIDQgLSBjYWxsLT5vZmZzZXQpOwotCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgb2lidWYgKyBjYWxsLT5vZmZzZXQsIGxlbikgPCAwKQotCQlCVUcoKTsKLQlpZiAoIXBza2JfcHVsbChza2IsIGxlbikpCi0JCUJVRygpOwotCWNhbGwtPm9mZnNldCArPSBsZW47Ci0KLQlpZiAoY2FsbC0+b2Zmc2V0IDwgNCkgewotCQlpZiAobGFzdCkgewotCQkJX2xlYXZlKCIgPSAtRUJBRE1TRyBbb3AgSUQgc2hvcnRdIik7Ci0JCQlyZXR1cm4gLUVCQURNU0c7Ci0JCX0KLQkJX2xlYXZlKCIgPSAwIFtpbmNvbXBsZXRlXSIpOwotCQlyZXR1cm4gMDsKLQl9CisJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCAmY2FsbC0+b3BlcmF0aW9uX0lELCA0LCB0cnVlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQVdBSVRfUkVRVUVTVDsKKwljYWxsLT5vZmZzZXQgPSAwOwogCiAJLyogYXNrIHRoZSBjYWNoZSBtYW5hZ2VyIHRvIHJvdXRlIHRoZSBjYWxsIChpdCdsbCBjaGFuZ2UgdGhlIGNhbGwgdHlwZQogCSAqIGlmIHN1Y2Nlc3NmdWwpICovCkBAIC03ODMsNyArNjkwLDcgQEAKIAogCS8qIHBhc3MgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSByZW1haW5lciBvZiB0aGlzIG1lc3NhZ2Ugb2ZmIHRvIHRoZQogCSAqIGNhY2hlIG1hbmFnZXIgb3AgKi8KLQlyZXR1cm4gY2FsbC0+dHlwZS0+ZGVsaXZlcihjYWxsLCBza2IsIGxhc3QpOworCXJldHVybiBjYWxsLT50eXBlLT5kZWxpdmVyKGNhbGwpOwogfQogCiAvKgpAQCAtODAzLDE0ICs3MTAsMTUgQEAKIAltc2cubXNnX2ZsYWdzCQk9IDA7CiAKIAljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0FXQUlUX0FDSzsKLQlzd2l0Y2ggKHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEoY2FsbC0+cnhjYWxsLCAmbXNnLCAwKSkgeworCXN3aXRjaCAocnhycGNfa2VybmVsX3NlbmRfZGF0YShhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwsICZtc2csIDApKSB7CiAJY2FzZSAwOgogCQlfbGVhdmUoIiBbcmVwbGllZF0iKTsKIAkJcmV0dXJuOwogCiAJY2FzZSAtRU5PTUVNOgogCQlfZGVidWcoIm9vbSIpOwotCQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChjYWxsLT5yeGNhbGwsIFJYX1VTRVJfQUJPUlQpOworCQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwsCisJCQkJCVJYX1VTRVJfQUJPUlQsIEVOT01FTSwgIktPTyIpOwogCWRlZmF1bHQ6CiAJCWFmc19lbmRfY2FsbChjYWxsKTsKIAkJX2xlYXZlKCIgW2Vycm9yXSIpOwpAQCAtODM5LDcgKzc0Nyw3IEBACiAJbXNnLm1zZ19mbGFncwkJPSAwOwogCiAJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9BV0FJVF9BQ0s7Ci0JbiA9IHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEoY2FsbC0+cnhjYWxsLCAmbXNnLCBsZW4pOworCW4gPSByeHJwY19rZXJuZWxfc2VuZF9kYXRhKGFmc19zb2NrZXQsIGNhbGwtPnJ4Y2FsbCwgJm1zZywgbGVuKTsKIAlpZiAobiA+PSAwKSB7CiAJCS8qIFN1Y2Nlc3MgKi8KIAkJX2xlYXZlKCIgW3JlcGxpZWRdIik7CkBAIC04NDgsMzcgKzc1Niw1MCBAQAogCiAJaWYgKG4gPT0gLUVOT01FTSkgewogCQlfZGVidWcoIm9vbSIpOwotCQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChjYWxsLT5yeGNhbGwsIFJYX1VTRVJfQUJPUlQpOworCQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwsCisJCQkJCVJYX1VTRVJfQUJPUlQsIEVOT01FTSwgIktPTyIpOwogCX0KIAlhZnNfZW5kX2NhbGwoY2FsbCk7CiAJX2xlYXZlKCIgW2Vycm9yXSIpOwogfQogCiAvKgotICogZXh0cmFjdCBhIHBpZWNlIG9mIGRhdGEgZnJvbSB0aGUgcmVjZWl2ZWQgZGF0YSBzb2NrZXQgYnVmZmVycworICogRXh0cmFjdCBhIHBpZWNlIG9mIGRhdGEgZnJvbSB0aGUgcmVjZWl2ZWQgZGF0YSBzb2NrZXQgYnVmZmVycy4KICAqLwotaW50IGFmc19leHRyYWN0X2RhdGEoc3RydWN0IGFmc19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgIGJvb2wgbGFzdCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCitpbnQgYWZzX2V4dHJhY3RfZGF0YShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkgICAgIGJvb2wgd2FudF9tb3JlKQogewotCXNpemVfdCBsZW4gPSBza2ItPmxlbjsKKwlpbnQgcmV0OwogCi0JX2VudGVyKCJ7JXV9LHslenV9LCVkLCwlenUiLCBjYWxsLT5vZmZzZXQsIGxlbiwgbGFzdCwgY291bnQpOworCV9lbnRlcigieyVzLCV6dX0sLCV6dSwlZCIsCisJICAgICAgIGNhbGwtPnR5cGUtPm5hbWUsIGNhbGwtPm9mZnNldCwgY291bnQsIHdhbnRfbW9yZSk7CiAKLQlBU1NFUlRDTVAoY2FsbC0+b2Zmc2V0LCA8LCBjb3VudCk7CisJQVNTRVJUQ01QKGNhbGwtPm9mZnNldCwgPD0sIGNvdW50KTsKIAotCWxlbiA9IG1pbl90KHNpemVfdCwgbGVuLCBjb3VudCAtIGNhbGwtPm9mZnNldCk7Ci0JaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCBidWYgKyBjYWxsLT5vZmZzZXQsIGxlbikgPCAwIHx8Ci0JICAgICFwc2tiX3B1bGwoc2tiLCBsZW4pKQotCQlCVUcoKTsKLQljYWxsLT5vZmZzZXQgKz0gbGVuOworCXJldCA9IHJ4cnBjX2tlcm5lbF9yZWN2X2RhdGEoYWZzX3NvY2tldCwgY2FsbC0+cnhjYWxsLAorCQkJCSAgICAgYnVmLCBjb3VudCwgJmNhbGwtPm9mZnNldCwKKwkJCQkgICAgIHdhbnRfbW9yZSwgJmNhbGwtPmFib3J0X2NvZGUpOworCWlmIChyZXQgPT0gMCB8fCByZXQgPT0gLUVBR0FJTikKKwkJcmV0dXJuIHJldDsKIAotCWlmIChjYWxsLT5vZmZzZXQgPCBjb3VudCkgewotCQlpZiAobGFzdCkgewotCQkJX2xlYXZlKCIgPSAtRUJBRE1TRyBbJWQgPCAlenVdIiwgY2FsbC0+b2Zmc2V0LCBjb3VudCk7Ci0JCQlyZXR1cm4gLUVCQURNU0c7CisJaWYgKHJldCA9PSAxKSB7CisJCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKKwkJY2FzZSBBRlNfQ0FMTF9BV0FJVF9SRVBMWToKKwkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQ09NUExFVEU7CisJCQlicmVhazsKKwkJY2FzZSBBRlNfQ0FMTF9BV0FJVF9SRVFVRVNUOgorCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9SRVBMWUlORzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CiAJCX0KLQkJX2xlYXZlKCIgPSAtRUFHQUlOIik7Ci0JCXJldHVybiAtRUFHQUlOOworCQlyZXR1cm4gMDsKIAl9Ci0JcmV0dXJuIDA7CisKKwlpZiAocmV0ID09IC1FQ09OTkFCT1JURUQpCisJCWNhbGwtPmVycm9yID0gY2FsbC0+dHlwZS0+YWJvcnRfdG9fZXJyb3IoY2FsbC0+YWJvcnRfY29kZSk7CisJZWxzZQorCQljYWxsLT5lcnJvciA9IHJldDsKKwljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0NPTVBMRVRFOworCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9mcy9hZnMvc2VydmVyLmMgYi9mcy9hZnMvc2VydmVyLmMKaW5kZXggZjM0MmFjZi4uZDQwNjZhYiAxMDA2NDQKLS0tIGEvZnMvYWZzL3NlcnZlci5jCisrKyBiL2ZzL2Fmcy9zZXJ2ZXIuYwpAQCAtMTc4LDEzICsxNzgsMTggQEAKIC8qCiAgKiBsb29rIHVwIGEgc2VydmVyIGJ5IGl0cyBJUCBhZGRyZXNzCiAgKi8KLXN0cnVjdCBhZnNfc2VydmVyICphZnNfZmluZF9zZXJ2ZXIoY29uc3Qgc3RydWN0IGluX2FkZHIgKl9hZGRyKQorc3RydWN0IGFmc19zZXJ2ZXIgKmFmc19maW5kX3NlcnZlcihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCkKIHsKIAlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyID0gTlVMTDsKIAlzdHJ1Y3QgcmJfbm9kZSAqcDsKLQlzdHJ1Y3QgaW5fYWRkciBhZGRyID0gKl9hZGRyOworCXN0cnVjdCBpbl9hZGRyIGFkZHIgPSBzcngtPnRyYW5zcG9ydC5zaW4uc2luX2FkZHI7CiAKLQlfZW50ZXIoIiVwSTQiLCAmYWRkci5zX2FkZHIpOworCV9lbnRlcigieyVkLCVwSTR9Iiwgc3J4LT50cmFuc3BvcnQuZmFtaWx5LCAmYWRkci5zX2FkZHIpOworCisJaWYgKHNyeC0+dHJhbnNwb3J0LmZhbWlseSAhPSBBRl9JTkVUKSB7CisJCVdBUk4odHJ1ZSwgIkFGUyBkb2VzIG5vdCB5ZXMgc3VwcG9ydCBub24tSVB2NCBhZGRyZXNzZXNcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAKIAlyZWFkX2xvY2soJmFmc19zZXJ2ZXJzX2xvY2spOwogCmRpZmYgLS1naXQgYS9mcy9hZnMvdmxjbGllbnQuYyBiL2ZzL2Fmcy92bGNsaWVudC5jCmluZGV4IDM0MGFmZDAuLjk0YmNkOTcgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy92bGNsaWVudC5jCisrKyBiL2ZzL2Fmcy92bGNsaWVudC5jCkBAIC01OCwyMiArNTgsMTggQEAKIC8qCiAgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYSBWTC5HZXRFbnRyeUJ5WFhYIGNhbGwKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl92bF9nZXRfZW50cnlfYnlfeHh4KHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwKLQkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl92bF9nZXRfZW50cnlfYnlfeHh4KHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKIAlzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqZW50cnk7CiAJX19iZTMyICpicDsKIAl1MzIgdG1wOwotCWludCBsb29wOworCWludCBsb29wLCByZXQ7CiAKLQlfZW50ZXIoIiwsJXUiLCBsYXN0KTsKKwlfZW50ZXIoIiIpOwogCi0JYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYik7Ci0JaWYgKCFsYXN0KQotCQlyZXR1cm4gMDsKLQotCWlmIChjYWxsLT5yZXBseV9zaXplICE9IGNhbGwtPnJlcGx5X21heCkKLQkJcmV0dXJuIC1FQkFETVNHOworCXJldCA9IGFmc190cmFuc2Zlcl9yZXBseShjYWxsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5IG9uY2Ugd2UndmUgcmVjZWl2ZWQgYWxsIG9mIGl0ICovCiAJZW50cnkgPSBjYWxsLT5yZXBseTsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy92bG9jYXRpb24uYyBiL2ZzL2Fmcy92bG9jYXRpb24uYwppbmRleCA1Mjk3Njc4Li40NWE4NjM5IDEwMDY0NAotLS0gYS9mcy9hZnMvdmxvY2F0aW9uLmMKKysrIGIvZnMvYWZzL3Zsb2NhdGlvbi5jCkBAIC01OTQsOCArNTk0LDggQEAKICAqLwogaW50IF9faW5pdCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9pbml0KHZvaWQpCiB7Ci0JYWZzX3Zsb2NhdGlvbl91cGRhdGVfd29ya2VyID0KLQkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImthZnNfdmx1cGRhdGVkIik7CisJYWZzX3Zsb2NhdGlvbl91cGRhdGVfd29ya2VyID0gYWxsb2Nfd29ya3F1ZXVlKCJrYWZzX3ZsdXBkYXRlZCIsCisJCQkJCQkgICAgICBXUV9NRU1fUkVDTEFJTSwgMCk7CiAJcmV0dXJuIGFmc192bG9jYXRpb25fdXBkYXRlX3dvcmtlciA/IDAgOiAtRU5PTUVNOwogfQogCmRpZmYgLS1naXQgYS9mcy9haW8uYyBiL2ZzL2Fpby5jCmluZGV4IGZiOGU0NWIuLjRmZTgxZDEgMTAwNjQ0Ci0tLSBhL2ZzL2Fpby5jCisrKyBiL2ZzL2Fpby5jCkBAIC0yMzksNyArMjM5LDEyIEBACiAJc3RhdGljIGNvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBvcHMgPSB7CiAJCS5kX2RuYW1lCT0gc2ltcGxlX2RuYW1lLAogCX07Ci0JcmV0dXJuIG1vdW50X3BzZXVkbyhmc190eXBlLCAiYWlvOiIsIE5VTEwsICZvcHMsIEFJT19SSU5HX01BR0lDKTsKKwlzdHJ1Y3QgZGVudHJ5ICpyb290ID0gbW91bnRfcHNldWRvKGZzX3R5cGUsICJhaW86IiwgTlVMTCwgJm9wcywKKwkJCQkJICAgQUlPX1JJTkdfTUFHSUMpOworCisJaWYgKCFJU19FUlIocm9vdCkpCisJCXJvb3QtPmRfc2ItPnNfaWZsYWdzIHw9IFNCX0lfTk9FWEVDOworCXJldHVybiByb290OwogfQogCiAvKiBhaW9fc2V0dXAKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvZXhwaXJlLmMgYi9mcy9hdXRvZnM0L2V4cGlyZS5jCmluZGV4IGI0OTM5MDkuLmQ4ZTZkNDIgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvZXhwaXJlLmMKKysrIGIvZnMvYXV0b2ZzNC9leHBpcmUuYwpAQCAtNDE3LDYgKzQxNyw3IEBACiAJfQogCXJldHVybiBOVUxMOwogfQorCiAvKgogICogRmluZCBhbiBlbGlnaWJsZSB0cmVlIHRvIHRpbWUtb3V0CiAgKiBBIHRyZWUgaXMgZWxpZ2libGUgaWYgOi0KQEAgLTQzMiw2ICs0MzMsNyBAQAogCXN0cnVjdCBkZW50cnkgKnJvb3QgPSBzYi0+c19yb290OwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAlzdHJ1Y3QgZGVudHJ5ICpleHBpcmVkOworCXN0cnVjdCBkZW50cnkgKmZvdW5kOwogCXN0cnVjdCBhdXRvZnNfaW5mbyAqaW5vOwogCiAJaWYgKCFyb290KQpAQCAtNDQyLDMxICs0NDQsNDYgQEAKIAogCWRlbnRyeSA9IE5VTEw7CiAJd2hpbGUgKChkZW50cnkgPSBnZXRfbmV4dF9wb3NpdGl2ZV9zdWJkaXIoZGVudHJ5LCByb290KSkpIHsKKwkJaW50IGZsYWdzID0gaG93OworCiAJCXNwaW5fbG9jaygmc2JpLT5mc19sb2NrKTsKIAkJaW5vID0gYXV0b2ZzNF9kZW50cnlfaW5vKGRlbnRyeSk7Ci0JCWlmIChpbm8tPmZsYWdzICYgQVVUT0ZTX0lORl9XQU5UX0VYUElSRSkKLQkJCWV4cGlyZWQgPSBOVUxMOwotCQllbHNlCi0JCQlleHBpcmVkID0gc2hvdWxkX2V4cGlyZShkZW50cnksIG1udCwgdGltZW91dCwgaG93KTsKLQkJaWYgKCFleHBpcmVkKSB7CisJCWlmIChpbm8tPmZsYWdzICYgQVVUT0ZTX0lORl9XQU5UX0VYUElSRSkgewogCQkJc3Bpbl91bmxvY2soJnNiaS0+ZnNfbG9jayk7CiAJCQljb250aW51ZTsKIAkJfQorCQlzcGluX3VubG9jaygmc2JpLT5mc19sb2NrKTsKKworCQlleHBpcmVkID0gc2hvdWxkX2V4cGlyZShkZW50cnksIG1udCwgdGltZW91dCwgZmxhZ3MpOworCQlpZiAoIWV4cGlyZWQpCisJCQljb250aW51ZTsKKworCQlzcGluX2xvY2soJnNiaS0+ZnNfbG9jayk7CiAJCWlubyA9IGF1dG9mczRfZGVudHJ5X2lubyhleHBpcmVkKTsKIAkJaW5vLT5mbGFncyB8PSBBVVRPRlNfSU5GX1dBTlRfRVhQSVJFOwogCQlzcGluX3VubG9jaygmc2JpLT5mc19sb2NrKTsKIAkJc3luY2hyb25pemVfcmN1KCk7Ci0JCXNwaW5fbG9jaygmc2JpLT5mc19sb2NrKTsKLQkJaWYgKHNob3VsZF9leHBpcmUoZXhwaXJlZCwgbW50LCB0aW1lb3V0LCBob3cpKSB7Ci0JCQlpZiAoZXhwaXJlZCAhPSBkZW50cnkpCi0JCQkJZHB1dChkZW50cnkpOwotCQkJZ290byBmb3VuZDsKLQkJfQogCisJCS8qIE1ha2Ugc3VyZSBhIHJlZmVyZW5jZSBpcyBub3QgdGFrZW4gb24gZm91bmQgaWYKKwkJICogdGhpbmdzIGhhdmUgY2hhbmdlZC4KKwkJICovCisJCWZsYWdzICY9IH5BVVRPRlNfRVhQX0xFQVZFUzsKKwkJZm91bmQgPSBzaG91bGRfZXhwaXJlKGV4cGlyZWQsIG1udCwgdGltZW91dCwgaG93KTsKKwkJaWYgKCFmb3VuZCB8fCBmb3VuZCAhPSBleHBpcmVkKQorCQkJLyogU29tZXRoaW5nIGhhcyBjaGFuZ2VkLCBjb250aW51ZSAqLworCQkJZ290byBuZXh0OworCisJCWlmIChleHBpcmVkICE9IGRlbnRyeSkKKwkJCWRwdXQoZGVudHJ5KTsKKworCQlzcGluX2xvY2soJnNiaS0+ZnNfbG9jayk7CisJCWdvdG8gZm91bmQ7CituZXh0OgorCQlzcGluX2xvY2soJnNiaS0+ZnNfbG9jayk7CiAJCWluby0+ZmxhZ3MgJj0gfkFVVE9GU19JTkZfV0FOVF9FWFBJUkU7CisJCXNwaW5fdW5sb2NrKCZzYmktPmZzX2xvY2spOwogCQlpZiAoZXhwaXJlZCAhPSBkZW50cnkpCiAJCQlkcHV0KGV4cGlyZWQpOwotCQlzcGluX3VubG9jaygmc2JpLT5mc19sb2NrKTsKIAl9CiAJcmV0dXJuIE5VTEw7CiAKQEAgLTQ4Myw2ICs1MDAsNyBAQAogCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpID0gYXV0b2ZzNF9zYmkoZGVudHJ5LT5kX3NiKTsKIAlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmlubyA9IGF1dG9mczRfZGVudHJ5X2lubyhkZW50cnkpOwogCWludCBzdGF0dXM7CisJaW50IHN0YXRlOwogCiAJLyogQmxvY2sgb24gYW55IHBlbmRpbmcgZXhwaXJlICovCiAJaWYgKCEoaW5vLT5mbGFncyAmIEFVVE9GU19JTkZfV0FOVF9FWFBJUkUpKQpAQCAtNDkwLDggKzUwOCwxOSBAQAogCWlmIChyY3Vfd2FsaykKIAkJcmV0dXJuIC1FQ0hJTEQ7CiAKK3JldHJ5OgogCXNwaW5fbG9jaygmc2JpLT5mc19sb2NrKTsKLQlpZiAoaW5vLT5mbGFncyAmIEFVVE9GU19JTkZfRVhQSVJJTkcpIHsKKwlzdGF0ZSA9IGluby0+ZmxhZ3MgJiAoQVVUT0ZTX0lORl9XQU5UX0VYUElSRSB8IEFVVE9GU19JTkZfRVhQSVJJTkcpOworCWlmIChzdGF0ZSA9PSBBVVRPRlNfSU5GX1dBTlRfRVhQSVJFKSB7CisJCXNwaW5fdW5sb2NrKCZzYmktPmZzX2xvY2spOworCQkvKgorCQkgKiBQb3NzaWJseSBiZWluZyBzZWxlY3RlZCBmb3IgZXhwaXJlLCB3YWl0IHVudGlsCisJCSAqIGl0J3Mgc2VsZWN0ZWQgb3Igbm90LgorCQkgKi8KKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoSFovMTApOworCQlnb3RvIHJldHJ5OworCX0KKwlpZiAoc3RhdGUgJiBBVVRPRlNfSU5GX0VYUElSSU5HKSB7CiAJCXNwaW5fdW5sb2NrKCZzYmktPmZzX2xvY2spOwogCiAJCXByX2RlYnVnKCJ3YWl0aW5nIGZvciBleHBpcmUgJXAgbmFtZT0lcGRcbiIsIGRlbnRyeSwgZGVudHJ5KTsKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9lbGYuYyBiL2ZzL2JpbmZtdF9lbGYuYwppbmRleCA3ZjZhZmYzZi4uMjQ3MmFmMiAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2VsZi5jCisrKyBiL2ZzL2JpbmZtdF9lbGYuYwpAQCAtODUzLDYgKzg1Myw3IEBACiAJCWN1cnJlbnQtPmZsYWdzIHw9IFBGX1JBTkRPTUlaRTsKIAogCXNldHVwX25ld19leGVjKGJwcm0pOworCWluc3RhbGxfZXhlY19jcmVkcyhicHJtKTsKIAogCS8qIERvIHRoaXMgc28gdGhhdCB3ZSBjYW4gbG9hZCB0aGUgaW50ZXJwcmV0ZXIsIGlmIG5lZWQgYmUuICBXZSB3aWxsCiAJICAgY2hhbmdlIHNvbWUgb2YgdGhlc2UgbGF0ZXIgKi8KQEAgLTEwNDQsNyArMTA0NSw2IEBACiAJCWdvdG8gb3V0OwogI2VuZGlmIC8qIEFSQ0hfSEFTX1NFVFVQX0FERElUSU9OQUxfUEFHRVMgKi8KIAotCWluc3RhbGxfZXhlY19jcmVkcyhicHJtKTsKIAlyZXR2YWwgPSBjcmVhdGVfZWxmX3RhYmxlcyhicHJtLCAmbG9jLT5lbGZfZXgsCiAJCQkgIGxvYWRfYWRkciwgaW50ZXJwX2xvYWRfYWRkcik7CiAJaWYgKHJldHZhbCA8IDApCkBAIC0xNjI0LDIwICsxNjI0LDEyIEBACiAJCXJlZ3NldC0+d3JpdGViYWNrKHRhc2ssIHJlZ3NldCwgMSk7CiB9CiAKLSNpZm5kZWYgUFJfUkVHX1NJWkUKLSNkZWZpbmUgUFJfUkVHX1NJWkUoUykgc2l6ZW9mKFMpCi0jZW5kaWYKLQogI2lmbmRlZiBQUlNUQVRVU19TSVpFCi0jZGVmaW5lIFBSU1RBVFVTX1NJWkUoUykgc2l6ZW9mKFMpCi0jZW5kaWYKLQotI2lmbmRlZiBQUl9SRUdfUFRSCi0jZGVmaW5lIFBSX1JFR19QVFIoUykgKCYoKFMpLT5wcl9yZWcpKQorI2RlZmluZSBQUlNUQVRVU19TSVpFKFMsIFIpIHNpemVvZihTKQogI2VuZGlmCiAKICNpZm5kZWYgU0VUX1BSX0ZQVkFMSUQKLSNkZWZpbmUgU0VUX1BSX0ZQVkFMSUQoUywgVikgKChTKS0+cHJfZnB2YWxpZCA9IChWKSkKKyNkZWZpbmUgU0VUX1BSX0ZQVkFMSUQoUywgViwgUikgKChTKS0+cHJfZnB2YWxpZCA9IChWKSkKICNlbmRpZgogCiBzdGF0aWMgaW50IGZpbGxfdGhyZWFkX2NvcmVfaW5mbyhzdHJ1Y3QgZWxmX3RocmVhZF9jb3JlX2luZm8gKnQsCkBAIC0xNjQ1LDYgKzE2MzcsNyBAQAogCQkJCSBsb25nIHNpZ25yLCBzaXplX3QgKnRvdGFsKQogewogCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCByZWdzZXRfc2l6ZSA9IHZpZXctPnJlZ3NldHNbMF0ubiAqIHZpZXctPnJlZ3NldHNbMF0uc2l6ZTsKIAogCS8qCiAJICogTlRfUFJTVEFUVVMgaXMgdGhlIG9uZSBzcGVjaWFsIGNhc2UsIGJlY2F1c2UgdGhlIHJlZ3NldCBkYXRhCkBAIC0xNjUzLDEyICsxNjQ2LDExIEBACiAJICogV2UgYXNzdW1lIHRoYXQgcmVnc2V0IDAgaXMgTlRfUFJTVEFUVVMuCiAJICovCiAJZmlsbF9wcnN0YXR1cygmdC0+cHJzdGF0dXMsIHQtPnRhc2ssIHNpZ25yKTsKLQkodm9pZCkgdmlldy0+cmVnc2V0c1swXS5nZXQodC0+dGFzaywgJnZpZXctPnJlZ3NldHNbMF0sCi0JCQkJICAgIDAsIFBSX1JFR19TSVpFKHQtPnByc3RhdHVzLnByX3JlZyksCi0JCQkJICAgIFBSX1JFR19QVFIoJnQtPnByc3RhdHVzKSwgTlVMTCk7CisJKHZvaWQpIHZpZXctPnJlZ3NldHNbMF0uZ2V0KHQtPnRhc2ssICZ2aWV3LT5yZWdzZXRzWzBdLCAwLCByZWdzZXRfc2l6ZSwKKwkJCQkgICAgJnQtPnByc3RhdHVzLnByX3JlZywgTlVMTCk7CiAKIAlmaWxsX25vdGUoJnQtPm5vdGVzWzBdLCAiQ09SRSIsIE5UX1BSU1RBVFVTLAotCQkgIFBSU1RBVFVTX1NJWkUodC0+cHJzdGF0dXMpLCAmdC0+cHJzdGF0dXMpOworCQkgIFBSU1RBVFVTX1NJWkUodC0+cHJzdGF0dXMsIHJlZ3NldF9zaXplKSwgJnQtPnByc3RhdHVzKTsKIAkqdG90YWwgKz0gbm90ZXNpemUoJnQtPm5vdGVzWzBdKTsKIAogCWRvX3RocmVhZF9yZWdzZXRfd3JpdGViYWNrKHQtPnRhc2ssICZ2aWV3LT5yZWdzZXRzWzBdKTsKQEAgLTE2ODgsNyArMTY4MCw4IEBACiAJCQkJCQkgIHJlZ3NldC0+Y29yZV9ub3RlX3R5cGUsCiAJCQkJCQkgIHNpemUsIGRhdGEpOwogCQkJCWVsc2UgewotCQkJCQlTRVRfUFJfRlBWQUxJRCgmdC0+cHJzdGF0dXMsIDEpOworCQkJCQlTRVRfUFJfRlBWQUxJRCgmdC0+cHJzdGF0dXMsCisJCQkJCQkJMSwgcmVnc2V0X3NpemUpOwogCQkJCQlmaWxsX25vdGUoJnQtPm5vdGVzW2ldLCAiQ09SRSIsCiAJCQkJCQkgIE5UX1BSRlBSRUcsIHNpemUsIGRhdGEpOwogCQkJCX0KZGlmZiAtLWdpdCBhL2ZzL2Jsb2NrX2Rldi5jIGIvZnMvYmxvY2tfZGV2LmMKaW5kZXggYzNjZGRlOC4uMDhhZTk5MyAxMDA2NDQKLS0tIGEvZnMvYmxvY2tfZGV2LmMKKysrIGIvZnMvYmxvY2tfZGV2LmMKQEAgLTI0OSw3ICsyNDksOCBAQAogCQkgKiB0aGF3X2JkZXYgZHJvcHMgaXQuCiAJCSAqLwogCQlzYiA9IGdldF9zdXBlcihiZGV2KTsKLQkJZHJvcF9zdXBlcihzYik7CisJCWlmIChzYikKKwkJCWRyb3Bfc3VwZXIoc2IpOwogCQltdXRleF91bmxvY2soJmJkZXYtPmJkX2ZzZnJlZXplX211dGV4KTsKIAkJcmV0dXJuIHNiOwogCX0KQEAgLTY0Niw3ICs2NDcsNyBAQAogewogCXN0cnVjdCBkZW50cnkgKmRlbnQ7CiAJZGVudCA9IG1vdW50X3BzZXVkbyhmc190eXBlLCAiYmRldjoiLCAmYmRldl9zb3BzLCBOVUxMLCBCREVWRlNfTUFHSUMpOwotCWlmIChkZW50KQorCWlmICghSVNfRVJSKGRlbnQpKQogCQlkZW50LT5kX3NiLT5zX2lmbGFncyB8PSBTQl9JX0NHUk9VUFdCOwogCXJldHVybiBkZW50OwogfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvYmFja3JlZi5jIGIvZnMvYnRyZnMvYmFja3JlZi5jCmluZGV4IDJiODg0MzkuLjQ1NWE2YjIgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2JhY2tyZWYuYworKysgYi9mcy9idHJmcy9iYWNrcmVmLmMKQEAgLTU4OSw2ICs1ODksNyBAQAogCiAJCQlsaXN0X2RlbCgmcmVmMi0+bGlzdCk7CiAJCQlrbWVtX2NhY2hlX2ZyZWUoYnRyZnNfcHJlbGltX3JlZl9jYWNoZSwgcmVmMik7CisJCQljb25kX3Jlc2NoZWQoKTsKIAkJfQogCiAJfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvY3RyZWUuaCBiL2ZzL2J0cmZzL2N0cmVlLmgKaW5kZXggMmZlOGY4OS4uMzNmZTAzNSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvY3RyZWUuaAorKysgYi9mcy9idHJmcy9jdHJlZS5oCkBAIC00MjcsNiArNDI3LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHJvX2JnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHByaW9yaXR5X3RpY2tldHM7CiAJc3RydWN0IGxpc3RfaGVhZCB0aWNrZXRzOworCXU2NCB0aWNrZXRzX2lkOwogCiAJc3RydWN0IHJ3X3NlbWFwaG9yZSBncm91cHNfc2VtOwogCS8qIGZvciBibG9jayBncm91cHMgaW4gb3VyIHNhbWUgdHlwZSAqLwpAQCAtMTAyOCw2ICsxMDI5LDcgQEAKIAlzdHJ1Y3QgYnRyZnNfd29ya3F1ZXVlICpxZ3JvdXBfcmVzY2FuX3dvcmtlcnM7CiAJc3RydWN0IGNvbXBsZXRpb24gcWdyb3VwX3Jlc2Nhbl9jb21wbGV0aW9uOwogCXN0cnVjdCBidHJmc193b3JrIHFncm91cF9yZXNjYW5fd29yazsKKwlib29sIHFncm91cF9yZXNjYW5fcnVubmluZzsJLyogcHJvdGVjdGVkIGJ5IHFncm91cF9yZXNjYW5fbG9jayAqLwogCiAJLyogZmlsZXN5c3RlbSBzdGF0ZSAqLwogCXVuc2lnbmVkIGxvbmcgZnNfc3RhdGU7CkBAIC0xMDc5LDYgKzEwODEsOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgcGlubmVkX2NodW5rczsKIAogCWludCBjcmVhdGluZ19mcmVlX3NwYWNlX3RyZWU7CisJLyogVXNlZCB0byByZWNvcmQgaW50ZXJuYWxseSB3aGV0aGVyIGZzIGhhcyBiZWVuIGZyb3plbiAqLworCWludCBmc19mcm96ZW47CiB9OwogCiBzdHJ1Y3QgYnRyZnNfc3Vidm9sdW1lX3dyaXRlcnMgewpAQCAtMjU3OCw3ICsyNTgyLDcgQEAKIAkJCQkgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkgICB1NjQgcm9vdF9vYmplY3RpZCwgdTY0IG93bmVyLCB1NjQgb2Zmc2V0LAogCQkJCSAgIHN0cnVjdCBidHJmc19rZXkgKmlucyk7Ci1pbnQgYnRyZnNfcmVzZXJ2ZV9leHRlbnQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBudW1fYnl0ZXMsCitpbnQgYnRyZnNfcmVzZXJ2ZV9leHRlbnQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCByYW1fYnl0ZXMsIHU2NCBudW1fYnl0ZXMsCiAJCQkgdTY0IG1pbl9hbGxvY19zaXplLCB1NjQgZW1wdHlfc2l6ZSwgdTY0IGhpbnRfYnl0ZSwKIAkJCSBzdHJ1Y3QgYnRyZnNfa2V5ICppbnMsIGludCBpc19kYXRhLCBpbnQgZGVsYWxsb2MpOwogaW50IGJ0cmZzX2luY19yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsIHN0cnVjdCBidHJmc19yb290ICpyb290LApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZGVsYXllZC1yZWYuYyBiL2ZzL2J0cmZzL2RlbGF5ZWQtcmVmLmMKaW5kZXggZDlkZGNmYy4uYWMwMmUwNCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZGVsYXllZC1yZWYuYworKysgYi9mcy9idHJmcy9kZWxheWVkLXJlZi5jCkBAIC01NDEsNyArNTQxLDYgQEAKIAlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfaGVhZCAqZXhpc3Rpbmc7CiAJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX2hlYWQgKmhlYWRfcmVmID0gTlVMTDsKIAlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfcm9vdCAqZGVsYXllZF9yZWZzOwotCXN0cnVjdCBidHJmc19xZ3JvdXBfZXh0ZW50X3JlY29yZCAqcWV4aXN0aW5nOwogCWludCBjb3VudF9tb2QgPSAxOwogCWludCBtdXN0X2luc2VydF9yZXNlcnZlZCA9IDA7CiAKQEAgLTYwNiwxMCArNjA1LDggQEAKIAkJcXJlY29yZC0+bnVtX2J5dGVzID0gbnVtX2J5dGVzOwogCQlxcmVjb3JkLT5vbGRfcm9vdHMgPSBOVUxMOwogCi0JCXFleGlzdGluZyA9IGJ0cmZzX3Fncm91cF9pbnNlcnRfZGlydHlfZXh0ZW50KGZzX2luZm8sCi0JCQkJCQkJICAgICBkZWxheWVkX3JlZnMsCi0JCQkJCQkJICAgICBxcmVjb3JkKTsKLQkJaWYgKHFleGlzdGluZykKKwkJaWYoYnRyZnNfcWdyb3VwX2luc2VydF9kaXJ0eV9leHRlbnRfbm9sb2NrKGZzX2luZm8sCisJCQkJCWRlbGF5ZWRfcmVmcywgcXJlY29yZCkpCiAJCQlrZnJlZShxcmVjb3JkKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2Rpc2staW8uYyBiL2ZzL2J0cmZzL2Rpc2staW8uYwppbmRleCA1OWZlYmZiLi41NGJjOGM3IDEwMDY0NAotLS0gYS9mcy9idHJmcy9kaXNrLWlvLmMKKysrIGIvZnMvYnRyZnMvZGlzay1pby5jCkBAIC01NTksOCArNTU5LDI5IEBACiAJdTMyIG5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKTsKIAlpbnQgc2xvdDsKIAotCWlmIChucml0ZW1zID09IDApCisJaWYgKG5yaXRlbXMgPT0gMCkgeworCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqY2hlY2tfcm9vdDsKKworCQlrZXkub2JqZWN0aWQgPSBidHJmc19oZWFkZXJfb3duZXIobGVhZik7CisJCWtleS50eXBlID0gQlRSRlNfUk9PVF9JVEVNX0tFWTsKKwkJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisKKwkJY2hlY2tfcm9vdCA9IGJ0cmZzX2dldF9mc19yb290KHJvb3QtPmZzX2luZm8sICZrZXksIGZhbHNlKTsKKwkJLyoKKwkJICogVGhlIG9ubHkgcmVhc29uIHdlIGFsc28gY2hlY2sgTlVMTCBoZXJlIGlzIHRoYXQgZHVyaW5nCisJCSAqIG9wZW5fY3RyZWUoKSBzb21lIHJvb3RzIGhhcyBub3QgeWV0IGJlZW4gc2V0IHVwLgorCQkgKi8KKwkJaWYgKCFJU19FUlJfT1JfTlVMTChjaGVja19yb290KSkgeworCQkJLyogaWYgbGVhZiBpcyB0aGUgcm9vdCwgdGhlbiBpdCdzIGZpbmUgKi8KKwkJCWlmIChsZWFmLT5zdGFydCAhPQorCQkJICAgIGJ0cmZzX3Jvb3RfYnl0ZW5yKCZjaGVja19yb290LT5yb290X2l0ZW0pKSB7CisJCQkJQ09SUlVQVCgibm9uLXJvb3QgbGVhZidzIG5yaXRlbXMgaXMgMCIsCisJCQkJCWxlYWYsIHJvb3QsIDApOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CiAJCXJldHVybiAwOworCX0KIAogCS8qIENoZWNrIHRoZSAwIGl0ZW0gKi8KIAlpZiAoYnRyZnNfaXRlbV9vZmZzZXRfbnIobGVhZiwgMCkgKyBidHJmc19pdGVtX3NpemVfbnIobGVhZiwgMCkgIT0KQEAgLTYxMiw2ICs2MzMsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBjaGVja19ub2RlKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbm9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIG5yID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobm9kZSk7CisKKwlpZiAobnIgPT0gMCB8fCBuciA+IEJUUkZTX05PREVQVFJTX1BFUl9CTE9DSyhyb290KSkgeworCQlidHJmc19jcml0KHJvb3QtPmZzX2luZm8sCisJCQkgICAiY29ycnVwdCBub2RlOiBibG9jayAlbGx1IHJvb3QgJWxsdSBucml0ZW1zICVsdSIsCisJCQkgICBub2RlLT5zdGFydCwgcm9vdC0+b2JqZWN0aWQsIG5yKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGJ0cmVlX3JlYWRwYWdlX2VuZF9pb19ob29rKHN0cnVjdCBidHJmc19pb19iaW8gKmlvX2JpbywKIAkJCQkgICAgICB1NjQgcGh5X29mZnNldCwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkJICAgICAgdTY0IHN0YXJ0LCB1NjQgZW5kLCBpbnQgbWlycm9yKQpAQCAtNjgyLDYgKzcxNiw5IEBACiAJCXJldCA9IC1FSU87CiAJfQogCisJaWYgKGZvdW5kX2xldmVsID4gMCAmJiBjaGVja19ub2RlKHJvb3QsIGViKSkKKwkJcmV0ID0gLUVJTzsKKwogCWlmICghcmV0KQogCQlzZXRfZXh0ZW50X2J1ZmZlcl91cHRvZGF0ZShlYik7CiBlcnI6CkBAIC0xNjE4LDggKzE2NTUsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYnRyZnNfcm9vdCAqYnRyZnNfbG9va3VwX2ZzX3Jvb3Qoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCi0JCQkJCSAgICAgICB1NjQgcm9vdF9pZCkKK3N0cnVjdCBidHJmc19yb290ICpidHJmc19sb29rdXBfZnNfcm9vdChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKKwkJCQkJdTY0IHJvb3RfaWQpCiB7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3Q7CiAKQEAgLTIyOTgsNiArMjMzNSw3IEBACiAJZnNfaW5mby0+cXVvdGFfZW5hYmxlZCA9IDA7CiAJZnNfaW5mby0+cGVuZGluZ19xdW90YV9zdGF0ZSA9IDA7CiAJZnNfaW5mby0+cWdyb3VwX3VsaXN0ID0gTlVMTDsKKwlmc19pbmZvLT5xZ3JvdXBfcmVzY2FuX3J1bm5pbmcgPSBmYWxzZTsKIAltdXRleF9pbml0KCZmc19pbmZvLT5xZ3JvdXBfcmVzY2FuX2xvY2spOwogfQogCkBAIC0yNjI0LDYgKzI2NjIsNyBAQAogCWF0b21pY19zZXQoJmZzX2luZm8tPnFncm91cF9vcF9zZXEsIDApOwogCWF0b21pY19zZXQoJmZzX2luZm8tPnJlYWRhX3dvcmtzX2NudCwgMCk7CiAJYXRvbWljNjRfc2V0KCZmc19pbmZvLT50cmVlX21vZF9zZXEsIDApOworCWZzX2luZm8tPmZzX2Zyb3plbiA9IDA7CiAJZnNfaW5mby0+c2IgPSBzYjsKIAlmc19pbmZvLT5tYXhfaW5saW5lID0gQlRSRlNfREVGQVVMVF9NQVhfSU5MSU5FOwogCWZzX2luZm8tPm1ldGFkYXRhX3JhdGlvID0gMDsKQEAgLTM3MzksOCArMzc3OCwxNSBAQAogCWlmIChidHJmc19yb290X3JlZnMoJnJvb3QtPnJvb3RfaXRlbSkgPT0gMCkKIAkJc3luY2hyb25pemVfc3JjdSgmZnNfaW5mby0+c3Vidm9sX3NyY3UpOwogCi0JaWYgKHRlc3RfYml0KEJUUkZTX0ZTX1NUQVRFX0VSUk9SLCAmZnNfaW5mby0+ZnNfc3RhdGUpKQorCWlmICh0ZXN0X2JpdChCVFJGU19GU19TVEFURV9FUlJPUiwgJmZzX2luZm8tPmZzX3N0YXRlKSkgewogCQlidHJmc19mcmVlX2xvZyhOVUxMLCByb290KTsKKwkJaWYgKHJvb3QtPnJlbG9jX3Jvb3QpIHsKKwkJCWZyZWVfZXh0ZW50X2J1ZmZlcihyb290LT5yZWxvY19yb290LT5ub2RlKTsKKwkJCWZyZWVfZXh0ZW50X2J1ZmZlcihyb290LT5yZWxvY19yb290LT5jb21taXRfcm9vdCk7CisJCQlidHJmc19wdXRfZnNfcm9vdChyb290LT5yZWxvY19yb290KTsKKwkJCXJvb3QtPnJlbG9jX3Jvb3QgPSBOVUxMOworCQl9CisJfQogCiAJaWYgKHJvb3QtPmZyZWVfaW5vX3Bpbm5lZCkKIAkJX19idHJmc19yZW1vdmVfZnJlZV9zcGFjZV9jYWNoZShyb290LT5mcmVlX2lub19waW5uZWQpOwpAQCAtMzg1MSw3ICszODk3LDcgQEAKIAlzbXBfbWIoKTsKIAogCS8qIHdhaXQgZm9yIHRoZSBxZ3JvdXAgcmVzY2FuIHdvcmtlciB0byBzdG9wICovCi0JYnRyZnNfcWdyb3VwX3dhaXRfZm9yX2NvbXBsZXRpb24oZnNfaW5mbyk7CisJYnRyZnNfcWdyb3VwX3dhaXRfZm9yX2NvbXBsZXRpb24oZnNfaW5mbywgZmFsc2UpOwogCiAJLyogd2FpdCBmb3IgdGhlIHV1aWRfc2NhbiB0YXNrIHRvIGZpbmlzaCAqLwogCWRvd24oJmZzX2luZm8tPnV1aWRfdHJlZV9yZXNjYW5fc2VtKTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2Rpc2staW8uaCBiL2ZzL2J0cmZzL2Rpc2staW8uaAppbmRleCBiMzIwN2EwZS4uZjE5YTk4MiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZGlzay1pby5oCisrKyBiL2ZzL2J0cmZzL2Rpc2staW8uaApAQCAtNjgsNiArNjgsOCBAQAogc3RydWN0IGJ0cmZzX3Jvb3QgKmJ0cmZzX3JlYWRfZnNfcm9vdChzdHJ1Y3QgYnRyZnNfcm9vdCAqdHJlZV9yb290LAogCQkJCSAgICAgIHN0cnVjdCBidHJmc19rZXkgKmxvY2F0aW9uKTsKIGludCBidHJmc19pbml0X2ZzX3Jvb3Qoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOworc3RydWN0IGJ0cmZzX3Jvb3QgKmJ0cmZzX2xvb2t1cF9mc19yb290KHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCQl1NjQgcm9vdF9pZCk7CiBpbnQgYnRyZnNfaW5zZXJ0X2ZzX3Jvb3Qoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCiAJCQkgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOwogdm9pZCBidHJmc19mcmVlX2ZzX3Jvb3RzKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvKTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMgYi9mcy9idHJmcy9leHRlbnQtdHJlZS5jCmluZGV4IDYxYjQ5NGUuLjY2NWRhOGYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYwpAQCAtNjAsMjEgKzYwLDYgQEAKIAlDSFVOS19BTExPQ19GT1JDRSA9IDIsCiB9OwogCi0vKgotICogQ29udHJvbCBob3cgcmVzZXJ2YXRpb25zIGFyZSBkZWFsdCB3aXRoLgotICoKLSAqIFJFU0VSVkVfRlJFRSAtIGZyZWVpbmcgYSByZXNlcnZhdGlvbi4KLSAqIFJFU0VSVkVfQUxMT0MgLSBhbGxvY2F0aW5nIHNwYWNlIGFuZCB3ZSBuZWVkIHRvIHVwZGF0ZSBieXRlc19tYXlfdXNlIGZvcgotICogICBFTk9TUEMgYWNjb3VudGluZwotICogUkVTRVJWRV9BTExPQ19OT19BQ0NPVU5UIC0gYWxsb2NhdGluZyBzcGFjZSBhbmQgd2Ugc2hvdWxkIG5vdCB1cGRhdGUKLSAqICAgYnl0ZXNfbWF5X3VzZSBhcyB0aGUgRU5PU1BDIGFjY291bnRpbmcgaXMgZG9uZSBlbHNld2hlcmUKLSAqLwotZW51bSB7Ci0JUkVTRVJWRV9GUkVFID0gMCwKLQlSRVNFUlZFX0FMTE9DID0gMSwKLQlSRVNFUlZFX0FMTE9DX05PX0FDQ09VTlQgPSAyLAotfTsKLQogc3RhdGljIGludCB1cGRhdGVfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IGJ5dGVuciwKIAkJCSAgICAgIHU2NCBudW1fYnl0ZXMsIGludCBhbGxvYyk7CkBAIC0xMDQsOSArODksMTAgQEAKIAkJCSBzdHJ1Y3QgYnRyZnNfa2V5ICprZXkpOwogc3RhdGljIHZvaWQgZHVtcF9zcGFjZV9pbmZvKHN0cnVjdCBidHJmc19zcGFjZV9pbmZvICppbmZvLCB1NjQgYnl0ZXMsCiAJCQkgICAgaW50IGR1bXBfYmxvY2tfZ3JvdXBzKTsKLXN0YXRpYyBpbnQgYnRyZnNfdXBkYXRlX3Jlc2VydmVkX2J5dGVzKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGUsCi0JCQkJICAgICAgIHU2NCBudW1fYnl0ZXMsIGludCByZXNlcnZlLAotCQkJCSAgICAgICBpbnQgZGVsYWxsb2MpOworc3RhdGljIGludCBidHJmc19hZGRfcmVzZXJ2ZWRfYnl0ZXMoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSwKKwkJCQkgICAgdTY0IHJhbV9ieXRlcywgdTY0IG51bV9ieXRlcywgaW50IGRlbGFsbG9jKTsKK3N0YXRpYyBpbnQgYnRyZnNfZnJlZV9yZXNlcnZlZF9ieXRlcyhzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlLAorCQkJCSAgICAgdTY0IG51bV9ieXRlcywgaW50IGRlbGFsbG9jKTsKIHN0YXRpYyBpbnQgYmxvY2tfcnN2X3VzZV9ieXRlcyhzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3YsCiAJCQkgICAgICAgdTY0IG51bV9ieXRlcyk7CiBpbnQgYnRyZnNfcGluX2V4dGVudChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKQEAgLTM1MDEsNyArMzQ4Nyw2IEBACiAJCWRjcyA9IEJUUkZTX0RDX1NFVFVQOwogCWVsc2UgaWYgKHJldCA9PSAtRU5PU1BDKQogCQlzZXRfYml0KEJUUkZTX1RSQU5TX0NBQ0hFX0VOT1NQQywgJnRyYW5zLT50cmFuc2FjdGlvbi0+ZmxhZ3MpOwotCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShpbm9kZSwgMCwgbnVtX3BhZ2VzKTsKIAogb3V0X3B1dDoKIAlpcHV0KGlub2RlKTsKQEAgLTQyODYsMTMgKzQyNzEsMTAgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCS8qCi0JICogVXNlIG5ldyBidHJmc19xZ3JvdXBfcmVzZXJ2ZV9kYXRhIHRvIHJlc2VydmUgcHJlY2lvdXMgZGF0YSBzcGFjZQotCSAqCi0JICogVE9ETzogRmluZCBhIGdvb2QgbWV0aG9kIHRvIGF2b2lkIHJlc2VydmUgZGF0YSBzcGFjZSBmb3IgTk9DT1cKLQkgKiByYW5nZSwgYnV0IGRvbid0IGltcGFjdCBwZXJmb3JtYW5jZSBvbiBxdW90YSBkaXNhYmxlIGNhc2UuCi0JICovCisJLyogVXNlIG5ldyBidHJmc19xZ3JvdXBfcmVzZXJ2ZV9kYXRhIHRvIHJlc2VydmUgcHJlY2lvdXMgZGF0YSBzcGFjZS4gKi8KIAlyZXQgPSBidHJmc19xZ3JvdXBfcmVzZXJ2ZV9kYXRhKGlub2RlLCBzdGFydCwgbGVuKTsKKwlpZiAocmV0KQorCQlidHJmc19mcmVlX3Jlc2VydmVkX2RhdGFfc3BhY2Vfbm9xdW90YShpbm9kZSwgc3RhcnQsIGxlbik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDQ3Miw2ICs0NDU0LDE1IEBACiAJfQogfQogCisvKgorICogSWYgZm9yY2UgaXMgQ0hVTktfQUxMT0NfRk9SQ0U6CisgKiAgICAtIHJldHVybiAxIGlmIGl0IHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZXMgYSBjaHVuaywKKyAqICAgIC0gcmV0dXJuIGVycm9ycyBpbmNsdWRpbmcgLUVOT1NQQyBvdGhlcndpc2UuCisgKiBJZiBmb3JjZSBpcyBOT1QgQ0hVTktfQUxMT0NfRk9SQ0U6CisgKiAgICAtIHJldHVybiAwIGlmIGl0IGRvZXNuJ3QgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBjaHVuaywKKyAqICAgIC0gcmV0dXJuIDEgaWYgaXQgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlcyBhIGNodW5rLAorICogICAgLSByZXR1cm4gZXJyb3JzIGluY2x1ZGluZyAtRU5PU1BDIG90aGVyd2lzZS4KKyAqLwogc3RhdGljIGludCBkb19jaHVua19hbGxvYyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKmV4dGVudF9yb290LCB1NjQgZmxhZ3MsIGludCBmb3JjZSkKIHsKQEAgLTQ4ODIsNyArNDg3Myw3IEBACiAJCQkJICAgICBidHJmc19nZXRfYWxsb2NfcHJvZmlsZShyb290LCAwKSwKIAkJCQkgICAgIENIVU5LX0FMTE9DX05PX0ZPUkNFKTsKIAkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKLQkJaWYgKHJldCA9PSAtRU5PU1BDKQorCQlpZiAocmV0ID4gMCB8fCByZXQgPT0gLUVOT1NQQykKIAkJCXJldCA9IDA7CiAJCWJyZWFrOwogCWNhc2UgQ09NTUlUX1RSQU5TOgpAQCAtNDkwNywxMSArNDg5OCw2IEBACiAJdTY0IGV4cGVjdGVkOwogCXU2NCB0b19yZWNsYWltID0gMDsKIAotCXRvX3JlY2xhaW0gPSBtaW5fdCh1NjQsIG51bV9vbmxpbmVfY3B1cygpICogU1pfMU0sIFNaXzE2TSk7Ci0JaWYgKGNhbl9vdmVyY29tbWl0KHJvb3QsIHNwYWNlX2luZm8sIHRvX3JlY2xhaW0sCi0JCQkgICBCVFJGU19SRVNFUlZFX0ZMVVNIX0FMTCkpCi0JCXJldHVybiAwOwotCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aWNrZXQsICZzcGFjZV9pbmZvLT50aWNrZXRzLCBsaXN0KQogCQl0b19yZWNsYWltICs9IHRpY2tldC0+Ynl0ZXM7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aWNrZXQsICZzcGFjZV9pbmZvLT5wcmlvcml0eV90aWNrZXRzLCBsaXN0KQpAQCAtNDkxOSw2ICs0OTA1LDExIEBACiAJaWYgKHRvX3JlY2xhaW0pCiAJCXJldHVybiB0b19yZWNsYWltOwogCisJdG9fcmVjbGFpbSA9IG1pbl90KHU2NCwgbnVtX29ubGluZV9jcHVzKCkgKiBTWl8xTSwgU1pfMTZNKTsKKwlpZiAoY2FuX292ZXJjb21taXQocm9vdCwgc3BhY2VfaW5mbywgdG9fcmVjbGFpbSwKKwkJCSAgIEJUUkZTX1JFU0VSVkVfRkxVU0hfQUxMKSkKKwkJcmV0dXJuIDA7CisKIAl1c2VkID0gc3BhY2VfaW5mby0+Ynl0ZXNfdXNlZCArIHNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkICsKIAkgICAgICAgc3BhY2VfaW5mby0+Ynl0ZXNfcGlubmVkICsgc3BhY2VfaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKwogCSAgICAgICBzcGFjZV9pbmZvLT5ieXRlc19tYXlfdXNlOwpAQCAtNDk3MiwxMiArNDk2MywxMiBAQAogICovCiBzdGF0aWMgdm9pZCBidHJmc19hc3luY19yZWNsYWltX21ldGFkYXRhX3NwYWNlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgcmVzZXJ2ZV90aWNrZXQgKmxhc3RfdGlja2V0ID0gTlVMTDsKIAlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbzsKIAlzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqc3BhY2VfaW5mbzsKIAl1NjQgdG9fcmVjbGFpbTsKIAlpbnQgZmx1c2hfc3RhdGU7CiAJaW50IGNvbW1pdF9jeWNsZXMgPSAwOworCXU2NCBsYXN0X3RpY2tldHNfaWQ7CiAKIAlmc19pbmZvID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBidHJmc19mc19pbmZvLCBhc3luY19yZWNsYWltX3dvcmspOwogCXNwYWNlX2luZm8gPSBfX2ZpbmRfc3BhY2VfaW5mbyhmc19pbmZvLCBCVFJGU19CTE9DS19HUk9VUF9NRVRBREFUQSk7CkBAIC00OTkwLDggKzQ5ODEsNyBAQAogCQlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CiAJCXJldHVybjsKIAl9Ci0JbGFzdF90aWNrZXQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzcGFjZV9pbmZvLT50aWNrZXRzLAotCQkJCSAgICAgICBzdHJ1Y3QgcmVzZXJ2ZV90aWNrZXQsIGxpc3QpOworCWxhc3RfdGlja2V0c19pZCA9IHNwYWNlX2luZm8tPnRpY2tldHNfaWQ7CiAJc3Bpbl91bmxvY2soJnNwYWNlX2luZm8tPmxvY2spOwogCiAJZmx1c2hfc3RhdGUgPSBGTFVTSF9ERUxBWUVEX0lURU1TX05SOwpAQCAtNTAxMSwxMCArNTAwMSwxMCBAQAogCQkJCQkJCSAgICAgIHNwYWNlX2luZm8pOwogCQl0aWNrZXQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzcGFjZV9pbmZvLT50aWNrZXRzLAogCQkJCQkgIHN0cnVjdCByZXNlcnZlX3RpY2tldCwgbGlzdCk7Ci0JCWlmIChsYXN0X3RpY2tldCA9PSB0aWNrZXQpIHsKKwkJaWYgKGxhc3RfdGlja2V0c19pZCA9PSBzcGFjZV9pbmZvLT50aWNrZXRzX2lkKSB7CiAJCQlmbHVzaF9zdGF0ZSsrOwogCQl9IGVsc2UgewotCQkJbGFzdF90aWNrZXQgPSB0aWNrZXQ7CisJCQlsYXN0X3RpY2tldHNfaWQgPSBzcGFjZV9pbmZvLT50aWNrZXRzX2lkOwogCQkJZmx1c2hfc3RhdGUgPSBGTFVTSF9ERUxBWUVEX0lURU1TX05SOwogCQkJaWYgKGNvbW1pdF9jeWNsZXMpCiAJCQkJY29tbWl0X2N5Y2xlcy0tOwpAQCAtNTM5MCw2ICs1MzgwLDcgQEAKIAkJCWxpc3RfZGVsX2luaXQoJnRpY2tldC0+bGlzdCk7CiAJCQludW1fYnl0ZXMgLT0gdGlja2V0LT5ieXRlczsKIAkJCXRpY2tldC0+Ynl0ZXMgPSAwOworCQkJc3BhY2VfaW5mby0+dGlja2V0c19pZCsrOwogCQkJd2FrZV91cCgmdGlja2V0LT53YWl0KTsKIAkJfSBlbHNlIHsKIAkJCXRpY2tldC0+Ynl0ZXMgLT0gbnVtX2J5dGVzOwpAQCAtNTQzMiw2ICs1NDIzLDcgQEAKIAkJCW51bV9ieXRlcyAtPSB0aWNrZXQtPmJ5dGVzOwogCQkJc3BhY2VfaW5mby0+Ynl0ZXNfbWF5X3VzZSArPSB0aWNrZXQtPmJ5dGVzOwogCQkJdGlja2V0LT5ieXRlcyA9IDA7CisJCQlzcGFjZV9pbmZvLT50aWNrZXRzX2lkKys7CiAJCQl3YWtlX3VwKCZ0aWNrZXQtPndhaXQpOwogCQl9IGVsc2UgewogCQkJdHJhY2VfYnRyZnNfc3BhY2VfcmVzZXJ2YXRpb24oZnNfaW5mbywgInNwYWNlX2luZm8iLApAQCAtNjQ5NywxOSArNjQ4OSwxNSBAQAogfQogCiAvKioKLSAqIGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyAtIHVwZGF0ZSB0aGUgYmxvY2tfZ3JvdXAgYW5kIHNwYWNlIGluZm8gY291bnRlcnMKKyAqIGJ0cmZzX2FkZF9yZXNlcnZlZF9ieXRlcyAtIHVwZGF0ZSB0aGUgYmxvY2tfZ3JvdXAgYW5kIHNwYWNlIGluZm8gY291bnRlcnMKICAqIEBjYWNoZToJVGhlIGNhY2hlIHdlIGFyZSBtYW5pcHVsYXRpbmcKKyAqIEByYW1fYnl0ZXM6ICBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGZpbGUgY29udGVudCwgYW5kIHdpbGwgYmUgc2FtZSB0bworICogICAgICAgICAgICAgIEBudW1fYnl0ZXMgZXhjZXB0IGZvciB0aGUgY29tcHJlc3MgcGF0aC4KICAqIEBudW1fYnl0ZXM6CVRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gcXVlc3Rpb24KLSAqIEByZXNlcnZlOglPbmUgb2YgdGhlIHJlc2VydmF0aW9uIGVudW1zCiAgKiBAZGVsYWxsb2M6ICAgVGhlIGJsb2NrcyBhcmUgYWxsb2NhdGVkIGZvciB0aGUgZGVsYWxsb2Mgd3JpdGUKICAqCi0gKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYWxsb2NhdG9yIHdoZW4gaXQgcmVzZXJ2ZXMgc3BhY2UsIG9yIGJ5IHNvbWVib2R5IHdobyBpcwotICogZnJlZWluZyBzcGFjZSB0aGF0IHdhcyBuZXZlciBhY3R1YWxseSB1c2VkIG9uIGRpc2suICBGb3IgZXhhbXBsZSBpZiB5b3UKLSAqIHJlc2VydmUgc29tZSBzcGFjZSBmb3IgYSBuZXcgbGVhZiBpbiB0cmFuc2FjdGlvbiBBIGFuZCBiZWZvcmUgdHJhbnNhY3Rpb24gQQotICogY29tbWl0cyB5b3UgZnJlZSB0aGF0IGxlYWYsIHlvdSBjYWxsIHRoaXMgd2l0aCByZXNlcnZlIHNldCB0byAwIGluIG9yZGVyIHRvCi0gKiBjbGVhciB0aGUgcmVzZXJ2YXRpb24uCi0gKgotICogTWV0YWRhdGEgcmVzZXJ2YXRpb25zIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBSRVNFUlZFX0FMTE9DIHNvIHdlIGRvIHRoZSBwcm9wZXIKKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBhbGxvY2F0b3Igd2hlbiBpdCByZXNlcnZlcyBzcGFjZS4gTWV0YWRhdGEKKyAqIHJlc2VydmF0aW9ucyBzaG91bGQgYmUgY2FsbGVkIHdpdGggUkVTRVJWRV9BTExPQyBzbyB3ZSBkbyB0aGUgcHJvcGVyCiAgKiBFTk9TUEMgYWNjb3VudGluZy4gIEZvciBkYXRhIHdlIGhhbmRsZSB0aGUgcmVzZXJ2YXRpb24gdGhyb3VnaCBjbGVhcmluZyB0aGUKICAqIGRlbGFsbG9jIGJpdHMgaW4gdGhlIGlvX3RyZWUuICBXZSBoYXZlIHRvIGRvIHRoaXMgc2luY2Ugd2UgY291bGQgZW5kIHVwCiAgKiBhbGxvY2F0aW5nIGxlc3MgZGlzayBzcGFjZSBmb3IgdGhlIGFtb3VudCBvZiBkYXRhIHdlIGhhdmUgcmVzZXJ2ZWQgaW4gdGhlCkBAIC02NTE5LDQ0ICs2NTA3LDYzIEBACiAgKiBtYWtlIHRoZSByZXNlcnZhdGlvbiBhbmQgcmV0dXJuIC1FQUdBSU4sIG90aGVyd2lzZSB0aGlzIGZ1bmN0aW9uIGFsd2F5cwogICogc3VjY2VlZHMuCiAgKi8KLXN0YXRpYyBpbnQgYnRyZnNfdXBkYXRlX3Jlc2VydmVkX2J5dGVzKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGUsCi0JCQkJICAgICAgIHU2NCBudW1fYnl0ZXMsIGludCByZXNlcnZlLCBpbnQgZGVsYWxsb2MpCitzdGF0aWMgaW50IGJ0cmZzX2FkZF9yZXNlcnZlZF9ieXRlcyhzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlLAorCQkJCSAgICB1NjQgcmFtX2J5dGVzLCB1NjQgbnVtX2J5dGVzLCBpbnQgZGVsYWxsb2MpCiB7CiAJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKnNwYWNlX2luZm8gPSBjYWNoZS0+c3BhY2VfaW5mbzsKIAlpbnQgcmV0ID0gMDsKIAogCXNwaW5fbG9jaygmc3BhY2VfaW5mby0+bG9jayk7CiAJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7Ci0JaWYgKHJlc2VydmUgIT0gUkVTRVJWRV9GUkVFKSB7Ci0JCWlmIChjYWNoZS0+cm8pIHsKLQkJCXJldCA9IC1FQUdBSU47Ci0JCX0gZWxzZSB7Ci0JCQljYWNoZS0+cmVzZXJ2ZWQgKz0gbnVtX2J5dGVzOwotCQkJc3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKz0gbnVtX2J5dGVzOwotCQkJaWYgKHJlc2VydmUgPT0gUkVTRVJWRV9BTExPQykgewotCQkJCXRyYWNlX2J0cmZzX3NwYWNlX3Jlc2VydmF0aW9uKGNhY2hlLT5mc19pbmZvLAotCQkJCQkJInNwYWNlX2luZm8iLCBzcGFjZV9pbmZvLT5mbGFncywKLQkJCQkJCW51bV9ieXRlcywgMCk7Ci0JCQkJc3BhY2VfaW5mby0+Ynl0ZXNfbWF5X3VzZSAtPSBudW1fYnl0ZXM7Ci0JCQl9Ci0KLQkJCWlmIChkZWxhbGxvYykKLQkJCQljYWNoZS0+ZGVsYWxsb2NfYnl0ZXMgKz0gbnVtX2J5dGVzOwotCQl9CisJaWYgKGNhY2hlLT5ybykgeworCQlyZXQgPSAtRUFHQUlOOwogCX0gZWxzZSB7Ci0JCWlmIChjYWNoZS0+cm8pCi0JCQlzcGFjZV9pbmZvLT5ieXRlc19yZWFkb25seSArPSBudW1fYnl0ZXM7Ci0JCWNhY2hlLT5yZXNlcnZlZCAtPSBudW1fYnl0ZXM7Ci0JCXNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkIC09IG51bV9ieXRlczsKKwkJY2FjaGUtPnJlc2VydmVkICs9IG51bV9ieXRlczsKKwkJc3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKz0gbnVtX2J5dGVzOwogCisJCXRyYWNlX2J0cmZzX3NwYWNlX3Jlc2VydmF0aW9uKGNhY2hlLT5mc19pbmZvLAorCQkJCSJzcGFjZV9pbmZvIiwgc3BhY2VfaW5mby0+ZmxhZ3MsCisJCQkJcmFtX2J5dGVzLCAwKTsKKwkJc3BhY2VfaW5mby0+Ynl0ZXNfbWF5X3VzZSAtPSByYW1fYnl0ZXM7CiAJCWlmIChkZWxhbGxvYykKLQkJCWNhY2hlLT5kZWxhbGxvY19ieXRlcyAtPSBudW1fYnl0ZXM7CisJCQljYWNoZS0+ZGVsYWxsb2NfYnl0ZXMgKz0gbnVtX2J5dGVzOwogCX0KIAlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOwogCXNwaW5fdW5sb2NrKCZzcGFjZV9pbmZvLT5sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqIGJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfYnl0ZXMgLSB1cGRhdGUgdGhlIGJsb2NrX2dyb3VwIGFuZCBzcGFjZSBpbmZvIGNvdW50ZXJzCisgKiBAY2FjaGU6ICAgICAgVGhlIGNhY2hlIHdlIGFyZSBtYW5pcHVsYXRpbmcKKyAqIEBudW1fYnl0ZXM6ICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHF1ZXN0aW9uCisgKiBAZGVsYWxsb2M6ICAgVGhlIGJsb2NrcyBhcmUgYWxsb2NhdGVkIGZvciB0aGUgZGVsYWxsb2Mgd3JpdGUKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBieSBzb21lYm9keSB3aG8gaXMgZnJlZWluZyBzcGFjZSB0aGF0IHdhcyBuZXZlciBhY3R1YWxseSB1c2VkCisgKiBvbiBkaXNrLiAgRm9yIGV4YW1wbGUgaWYgeW91IHJlc2VydmUgc29tZSBzcGFjZSBmb3IgYSBuZXcgbGVhZiBpbiB0cmFuc2FjdGlvbgorICogQSBhbmQgYmVmb3JlIHRyYW5zYWN0aW9uIEEgY29tbWl0cyB5b3UgZnJlZSB0aGF0IGxlYWYsIHlvdSBjYWxsIHRoaXMgd2l0aAorICogcmVzZXJ2ZSBzZXQgdG8gMCBpbiBvcmRlciB0byBjbGVhciB0aGUgcmVzZXJ2YXRpb24uCisgKi8KKworc3RhdGljIGludCBidHJmc19mcmVlX3Jlc2VydmVkX2J5dGVzKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGUsCisJCQkJICAgICB1NjQgbnVtX2J5dGVzLCBpbnQgZGVsYWxsb2MpCit7CisJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKnNwYWNlX2luZm8gPSBjYWNoZS0+c3BhY2VfaW5mbzsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7CisJaWYgKGNhY2hlLT5ybykKKwkJc3BhY2VfaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKz0gbnVtX2J5dGVzOworCWNhY2hlLT5yZXNlcnZlZCAtPSBudW1fYnl0ZXM7CisJc3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgLT0gbnVtX2J5dGVzOworCisJaWYgKGRlbGFsbG9jKQorCQljYWNoZS0+ZGVsYWxsb2NfYnl0ZXMgLT0gbnVtX2J5dGVzOworCXNwaW5fdW5sb2NrKCZjYWNoZS0+bG9jayk7CisJc3Bpbl91bmxvY2soJnNwYWNlX2luZm8tPmxvY2spOworCXJldHVybiByZXQ7Cit9CiB2b2lkIGJ0cmZzX3ByZXBhcmVfZXh0ZW50X2NvbW1pdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKIHsKQEAgLTcxOTEsNyArNzE5OCw3IEBACiAJCVdBUk5fT04odGVzdF9iaXQoRVhURU5UX0JVRkZFUl9ESVJUWSwgJmJ1Zi0+YmZsYWdzKSk7CiAKIAkJYnRyZnNfYWRkX2ZyZWVfc3BhY2UoY2FjaGUsIGJ1Zi0+c3RhcnQsIGJ1Zi0+bGVuKTsKLQkJYnRyZnNfdXBkYXRlX3Jlc2VydmVkX2J5dGVzKGNhY2hlLCBidWYtPmxlbiwgUkVTRVJWRV9GUkVFLCAwKTsKKwkJYnRyZnNfZnJlZV9yZXNlcnZlZF9ieXRlcyhjYWNoZSwgYnVmLT5sZW4sIDApOwogCQlidHJmc19wdXRfYmxvY2tfZ3JvdXAoY2FjaGUpOwogCQl0cmFjZV9idHJmc19yZXNlcnZlZF9leHRlbnRfZnJlZShyb290LCBidWYtPnN0YXJ0LCBidWYtPmxlbik7CiAJCXBpbiA9IDA7CkBAIC03NDE2LDkgKzc0MjMsOSBAQAogICogdGhlIGZyZWUgc3BhY2UgZXh0ZW50IGN1cnJlbnRseS4KICAqLwogc3RhdGljIG5vaW5saW5lIGludCBmaW5kX2ZyZWVfZXh0ZW50KHN0cnVjdCBidHJmc19yb290ICpvcmlnX3Jvb3QsCi0JCQkJICAgICB1NjQgbnVtX2J5dGVzLCB1NjQgZW1wdHlfc2l6ZSwKLQkJCQkgICAgIHU2NCBoaW50X2J5dGUsIHN0cnVjdCBidHJmc19rZXkgKmlucywKLQkJCQkgICAgIHU2NCBmbGFncywgaW50IGRlbGFsbG9jKQorCQkJCXU2NCByYW1fYnl0ZXMsIHU2NCBudW1fYnl0ZXMsIHU2NCBlbXB0eV9zaXplLAorCQkJCXU2NCBoaW50X2J5dGUsIHN0cnVjdCBidHJmc19rZXkgKmlucywKKwkJCQl1NjQgZmxhZ3MsIGludCBkZWxhbGxvYykKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IG9yaWdfcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3Q7CkBAIC03NDMwLDggKzc0MzcsNiBAQAogCXN0cnVjdCBidHJmc19zcGFjZV9pbmZvICpzcGFjZV9pbmZvOwogCWludCBsb29wID0gMDsKIAlpbnQgaW5kZXggPSBfX2dldF9yYWlkX2luZGV4KGZsYWdzKTsKLQlpbnQgYWxsb2NfdHlwZSA9IChmbGFncyAmIEJUUkZTX0JMT0NLX0dST1VQX0RBVEEpID8KLQkJUkVTRVJWRV9BTExPQ19OT19BQ0NPVU5UIDogUkVTRVJWRV9BTExPQzsKIAlib29sIGZhaWxlZF9jbHVzdGVyX3JlZmlsbCA9IGZhbHNlOwogCWJvb2wgZmFpbGVkX2FsbG9jID0gZmFsc2U7CiAJYm9vbCB1c2VfY2x1c3RlciA9IHRydWU7CkBAIC03NzYzLDggKzc3NjgsOCBAQAogCQkJCQkgICAgIHNlYXJjaF9zdGFydCAtIG9mZnNldCk7CiAJCUJVR19PTihvZmZzZXQgPiBzZWFyY2hfc3RhcnQpOwogCi0JCXJldCA9IGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyhibG9ja19ncm91cCwgbnVtX2J5dGVzLAotCQkJCQkJICBhbGxvY190eXBlLCBkZWxhbGxvYyk7CisJCXJldCA9IGJ0cmZzX2FkZF9yZXNlcnZlZF9ieXRlcyhibG9ja19ncm91cCwgcmFtX2J5dGVzLAorCQkJCW51bV9ieXRlcywgZGVsYWxsb2MpOwogCQlpZiAocmV0ID09IC1FQUdBSU4pIHsKIAkJCWJ0cmZzX2FkZF9mcmVlX3NwYWNlKGJsb2NrX2dyb3VwLCBvZmZzZXQsIG51bV9ieXRlcyk7CiAJCQlnb3RvIGxvb3A7CkBAIC03OTM2LDcgKzc5NDEsNyBAQAogCXVwX3JlYWQoJmluZm8tPmdyb3Vwc19zZW0pOwogfQogCi1pbnQgYnRyZnNfcmVzZXJ2ZV9leHRlbnQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCitpbnQgYnRyZnNfcmVzZXJ2ZV9leHRlbnQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCByYW1fYnl0ZXMsCiAJCQkgdTY0IG51bV9ieXRlcywgdTY0IG1pbl9hbGxvY19zaXplLAogCQkJIHU2NCBlbXB0eV9zaXplLCB1NjQgaGludF9ieXRlLAogCQkJIHN0cnVjdCBidHJmc19rZXkgKmlucywgaW50IGlzX2RhdGEsIGludCBkZWxhbGxvYykKQEAgLTc5NDgsOCArNzk1Myw4IEBACiAJZmxhZ3MgPSBidHJmc19nZXRfYWxsb2NfcHJvZmlsZShyb290LCBpc19kYXRhKTsKIGFnYWluOgogCVdBUk5fT04obnVtX2J5dGVzIDwgcm9vdC0+c2VjdG9yc2l6ZSk7Ci0JcmV0ID0gZmluZF9mcmVlX2V4dGVudChyb290LCBudW1fYnl0ZXMsIGVtcHR5X3NpemUsIGhpbnRfYnl0ZSwgaW5zLAotCQkJICAgICAgIGZsYWdzLCBkZWxhbGxvYyk7CisJcmV0ID0gZmluZF9mcmVlX2V4dGVudChyb290LCByYW1fYnl0ZXMsIG51bV9ieXRlcywgZW1wdHlfc2l6ZSwKKwkJCSAgICAgICBoaW50X2J5dGUsIGlucywgZmxhZ3MsIGRlbGFsbG9jKTsKIAlpZiAoIXJldCAmJiAhaXNfZGF0YSkgewogCQlidHJmc19kZWNfYmxvY2tfZ3JvdXBfcmVzZXJ2YXRpb25zKHJvb3QtPmZzX2luZm8sCiAJCQkJCQkgICBpbnMtPm9iamVjdGlkKTsKQEAgLTc5NTgsNiArNzk2Myw3IEBACiAJCQludW1fYnl0ZXMgPSBtaW4obnVtX2J5dGVzID4+IDEsIGlucy0+b2Zmc2V0KTsKIAkJCW51bV9ieXRlcyA9IHJvdW5kX2Rvd24obnVtX2J5dGVzLCByb290LT5zZWN0b3JzaXplKTsKIAkJCW51bV9ieXRlcyA9IG1heChudW1fYnl0ZXMsIG1pbl9hbGxvY19zaXplKTsKKwkJCXJhbV9ieXRlcyA9IG51bV9ieXRlczsKIAkJCWlmIChudW1fYnl0ZXMgPT0gbWluX2FsbG9jX3NpemUpCiAJCQkJZmluYWxfdHJpZWQgPSB0cnVlOwogCQkJZ290byBhZ2FpbjsKQEAgLTc5OTUsNyArODAwMSw3IEBACiAJCWlmIChidHJmc190ZXN0X29wdChyb290LT5mc19pbmZvLCBESVNDQVJEKSkKIAkJCXJldCA9IGJ0cmZzX2Rpc2NhcmRfZXh0ZW50KHJvb3QsIHN0YXJ0LCBsZW4sIE5VTEwpOwogCQlidHJmc19hZGRfZnJlZV9zcGFjZShjYWNoZSwgc3RhcnQsIGxlbik7Ci0JCWJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyhjYWNoZSwgbGVuLCBSRVNFUlZFX0ZSRUUsIGRlbGFsbG9jKTsKKwkJYnRyZnNfZnJlZV9yZXNlcnZlZF9ieXRlcyhjYWNoZSwgbGVuLCBkZWxhbGxvYyk7CiAJCXRyYWNlX2J0cmZzX3Jlc2VydmVkX2V4dGVudF9mcmVlKHJvb3QsIHN0YXJ0LCBsZW4pOwogCX0KIApAQCAtODIwOCw2ICs4MjE0LDcgQEAKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXA7CisJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKnNwYWNlX2luZm87CiAKIAkvKgogCSAqIE1peGVkIGJsb2NrIGdyb3VwcyB3aWxsIGV4Y2x1ZGUgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIGxvZyBzbyB3ZSBvbmx5CkBAIC04MjIzLDkgKzgyMzAsMTQgQEAKIAlpZiAoIWJsb2NrX2dyb3VwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldCA9IGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyhibG9ja19ncm91cCwgaW5zLT5vZmZzZXQsCi0JCQkJCSAgUkVTRVJWRV9BTExPQ19OT19BQ0NPVU5ULCAwKTsKLQlCVUdfT04ocmV0KTsgLyogbG9naWMgZXJyb3IgKi8KKwlzcGFjZV9pbmZvID0gYmxvY2tfZ3JvdXAtPnNwYWNlX2luZm87CisJc3Bpbl9sb2NrKCZzcGFjZV9pbmZvLT5sb2NrKTsKKwlzcGluX2xvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKKwlzcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCArPSBpbnMtPm9mZnNldDsKKwlibG9ja19ncm91cC0+cmVzZXJ2ZWQgKz0gaW5zLT5vZmZzZXQ7CisJc3Bpbl91bmxvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisKIAlyZXQgPSBhbGxvY19yZXNlcnZlZF9maWxlX2V4dGVudCh0cmFucywgcm9vdCwgMCwgcm9vdF9vYmplY3RpZCwKIAkJCQkJIDAsIG93bmVyLCBvZmZzZXQsIGlucywgMSk7CiAJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKGJsb2NrX2dyb3VwKTsKQEAgLTgzNjgsNyArODM4MCw3IEBACiAJaWYgKElTX0VSUihibG9ja19yc3YpKQogCQlyZXR1cm4gRVJSX0NBU1QoYmxvY2tfcnN2KTsKIAotCXJldCA9IGJ0cmZzX3Jlc2VydmVfZXh0ZW50KHJvb3QsIGJsb2Nrc2l6ZSwgYmxvY2tzaXplLAorCXJldCA9IGJ0cmZzX3Jlc2VydmVfZXh0ZW50KHJvb3QsIGJsb2Nrc2l6ZSwgYmxvY2tzaXplLCBibG9ja3NpemUsCiAJCQkJICAgZW1wdHlfc2l6ZSwgaGludCwgJmlucywgMCwgMCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfdW51c2U7CkBAIC04NTIxLDM1ICs4NTMzLDYgQEAKIAl3Yy0+cmVhZGFfc2xvdCA9IHNsb3Q7CiB9CiAKLS8qCi0gKiBUaGVzZSBtYXkgbm90IGJlIHNlZW4gYnkgdGhlIHVzdWFsIGluYy9kZWMgcmVmIGNvZGUgc28gd2UgaGF2ZSB0bwotICogYWRkIHRoZW0gaGVyZS4KLSAqLwotc3RhdGljIGludCByZWNvcmRfb25lX3N1YnRyZWVfZXh0ZW50KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIsCi0JCQkJICAgICB1NjQgbnVtX2J5dGVzKQotewotCXN0cnVjdCBidHJmc19xZ3JvdXBfZXh0ZW50X3JlY29yZCAqcXJlY29yZDsKLQlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfcm9vdCAqZGVsYXllZF9yZWZzOwotCi0JcXJlY29yZCA9IGttYWxsb2Moc2l6ZW9mKCpxcmVjb3JkKSwgR0ZQX05PRlMpOwotCWlmICghcXJlY29yZCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlxcmVjb3JkLT5ieXRlbnIgPSBieXRlbnI7Ci0JcXJlY29yZC0+bnVtX2J5dGVzID0gbnVtX2J5dGVzOwotCXFyZWNvcmQtPm9sZF9yb290cyA9IE5VTEw7Ci0KLQlkZWxheWVkX3JlZnMgPSAmdHJhbnMtPnRyYW5zYWN0aW9uLT5kZWxheWVkX3JlZnM7Ci0Jc3Bpbl9sb2NrKCZkZWxheWVkX3JlZnMtPmxvY2spOwotCWlmIChidHJmc19xZ3JvdXBfaW5zZXJ0X2RpcnR5X2V4dGVudCh0cmFucy0+ZnNfaW5mbywKLQkJCQkJICAgICBkZWxheWVkX3JlZnMsIHFyZWNvcmQpKQotCQlrZnJlZShxcmVjb3JkKTsKLQlzcGluX3VubG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGFjY291bnRfbGVhZl9pdGVtcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJICAgICAgc3RydWN0IGV4dGVudF9idWZmZXIgKmViKQpAQCAtODU4Myw3ICs4NTY2LDggQEAKIAogCQludW1fYnl0ZXMgPSBidHJmc19maWxlX2V4dGVudF9kaXNrX251bV9ieXRlcyhlYiwgZmkpOwogCi0JCXJldCA9IHJlY29yZF9vbmVfc3VidHJlZV9leHRlbnQodHJhbnMsIHJvb3QsIGJ5dGVuciwgbnVtX2J5dGVzKTsKKwkJcmV0ID0gYnRyZnNfcWdyb3VwX2luc2VydF9kaXJ0eV9leHRlbnQodHJhbnMsIHJvb3QtPmZzX2luZm8sCisJCQkJYnl0ZW5yLCBudW1fYnl0ZXMsIEdGUF9OT0ZTKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtODczMiw4ICs4NzE2LDkgQEAKIAkJCWJ0cmZzX3NldF9sb2NrX2Jsb2NraW5nX3J3KGViLCBCVFJGU19SRUFEX0xPQ0spOwogCQkJcGF0aC0+bG9ja3NbbGV2ZWxdID0gQlRSRlNfUkVBRF9MT0NLX0JMT0NLSU5HOwogCi0JCQlyZXQgPSByZWNvcmRfb25lX3N1YnRyZWVfZXh0ZW50KHRyYW5zLCByb290LCBjaGlsZF9ieXRlbnIsCi0JCQkJCQkJcm9vdC0+bm9kZXNpemUpOworCQkJcmV0ID0gYnRyZnNfcWdyb3VwX2luc2VydF9kaXJ0eV9leHRlbnQodHJhbnMsCisJCQkJCXJvb3QtPmZzX2luZm8sIGNoaWxkX2J5dGVuciwKKwkJCQkJcm9vdC0+bm9kZXNpemUsIEdGUF9OT0ZTKTsKIAkJCWlmIChyZXQpCiAJCQkJZ290byBvdXQ7CiAJCX0KQEAgLTk5MDYsNiArOTg5MSw3IEBACiAJCQl9IGVsc2UgewogCQkJCXJldCA9IDA7CiAJCQl9CisJCQlmcmVlX2V4dGVudF9tYXAoZW0pOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJcGF0aC0+c2xvdHNbMF0rKzsKQEAgLTk5NDIsNiArOTkyOCw3IEBACiAJCWJsb2NrX2dyb3VwLT5pcmVmID0gMDsKIAkJYmxvY2tfZ3JvdXAtPmlub2RlID0gTlVMTDsKIAkJc3Bpbl91bmxvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKKwkJQVNTRVJUKGJsb2NrX2dyb3VwLT5pb19jdGwuaW5vZGUgPT0gTlVMTCk7CiAJCWlwdXQoaW5vZGUpOwogCQlsYXN0ID0gYmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZCArIGJsb2NrX2dyb3VwLT5rZXkub2Zmc2V0OwogCQlidHJmc19wdXRfYmxvY2tfZ3JvdXAoYmxvY2tfZ3JvdXApOwpAQCAtOTk5OSw2ICs5OTg2LDEwIEBACiAJCQlmcmVlX2V4Y2x1ZGVkX2V4dGVudHMoaW5mby0+ZXh0ZW50X3Jvb3QsIGJsb2NrX2dyb3VwKTsKIAogCQlidHJmc19yZW1vdmVfZnJlZV9zcGFjZV9jYWNoZShibG9ja19ncm91cCk7CisJCUFTU0VSVChsaXN0X2VtcHR5KCZibG9ja19ncm91cC0+ZGlydHlfbGlzdCkpOworCQlBU1NFUlQobGlzdF9lbXB0eSgmYmxvY2tfZ3JvdXAtPmlvX2xpc3QpKTsKKwkJQVNTRVJUKGxpc3RfZW1wdHkoJmJsb2NrX2dyb3VwLT5iZ19saXN0KSk7CisJCUFTU0VSVChhdG9taWNfcmVhZCgmYmxvY2tfZ3JvdXAtPmNvdW50KSA9PSAxKTsKIAkJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKGJsb2NrX2dyb3VwKTsKIAogCQlzcGluX2xvY2soJmluZm8tPmJsb2NrX2dyb3VwX2NhY2hlX2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZXh0ZW50X2lvLmggYi9mcy9idHJmcy9leHRlbnRfaW8uaAppbmRleCBiYzI3MjlhLi4yOGNkODhmIDEwMDY0NAotLS0gYS9mcy9idHJmcy9leHRlbnRfaW8uaAorKysgYi9mcy9idHJmcy9leHRlbnRfaW8uaApAQCAtMjAsNiArMjAsNyBAQAogI2RlZmluZSBFWFRFTlRfREFNQUdFRAkJKDFVIDw8IDE0KQogI2RlZmluZSBFWFRFTlRfTk9SRVNFUlZFCSgxVSA8PCAxNSkKICNkZWZpbmUgRVhURU5UX1FHUk9VUF9SRVNFUlZFRAkoMVUgPDwgMTYpCisjZGVmaW5lIEVYVEVOVF9DTEVBUl9EQVRBX1JFU1YJKDFVIDw8IDE3KQogI2RlZmluZSBFWFRFTlRfSU9CSVRTCQkoRVhURU5UX0xPQ0tFRCB8IEVYVEVOVF9XUklURUJBQ0spCiAjZGVmaW5lIEVYVEVOVF9DVExCSVRTCQkoRVhURU5UX0RPX0FDQ09VTlRJTkcgfCBFWFRFTlRfRklSU1RfREVMQUxMT0MpCiAKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2ZpbGUuYyBiL2ZzL2J0cmZzL2ZpbGUuYwppbmRleCA1ODQyNDIzLi5mZWEzMWE0IDEwMDY0NAotLS0gYS9mcy9idHJmcy9maWxlLmMKKysrIGIvZnMvYnRyZnMvZmlsZS5jCkBAIC0yMDcwLDcgKzIwNzAsNyBAQAogCX0KIAl0cmFucy0+c3luYyA9IHRydWU7CiAKLQlidHJmc19pbml0X2xvZ19jdHgoJmN0eCk7CisJYnRyZnNfaW5pdF9sb2dfY3R4KCZjdHgsIGlub2RlKTsKIAogCXJldCA9IGJ0cmZzX2xvZ19kZW50cnlfc2FmZSh0cmFucywgcm9vdCwgZGVudHJ5LCBzdGFydCwgZW5kLCAmY3R4KTsKIAlpZiAocmV0IDwgMCkgewpAQCAtMjY3NSw2ICsyNjc1LDcgQEAKIAogCWFsbG9jX3N0YXJ0ID0gcm91bmRfZG93bihvZmZzZXQsIGJsb2Nrc2l6ZSk7CiAJYWxsb2NfZW5kID0gcm91bmRfdXAob2Zmc2V0ICsgbGVuLCBibG9ja3NpemUpOworCWN1cl9vZmZzZXQgPSBhbGxvY19zdGFydDsKIAogCS8qIE1ha2Ugc3VyZSB3ZSBhcmVuJ3QgYmVpbmcgZ2l2ZSBzb21lIGNyYXAgbW9kZSAqLwogCWlmIChtb2RlICYgfihGQUxMT0NfRkxfS0VFUF9TSVpFIHwgRkFMTE9DX0ZMX1BVTkNIX0hPTEUpKQpAQCAtMjc2Nyw3ICsyNzY4LDYgQEAKIAogCS8qIEZpcnN0LCBjaGVjayBpZiB3ZSBleGNlZWQgdGhlIHFncm91cCBsaW1pdCAqLwogCUlOSVRfTElTVF9IRUFEKCZyZXNlcnZlX2xpc3QpOwotCWN1cl9vZmZzZXQgPSBhbGxvY19zdGFydDsKIAl3aGlsZSAoMSkgewogCQllbSA9IGJ0cmZzX2dldF9leHRlbnQoaW5vZGUsIE5VTEwsIDAsIGN1cl9vZmZzZXQsCiAJCQkJICAgICAgYWxsb2NfZW5kIC0gY3VyX29mZnNldCwgMCk7CkBAIC0yNzk0LDYgKzI3OTQsMTQgQEAKIAkJCQkJbGFzdF9ieXRlIC0gY3VyX29mZnNldCk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBEbyBub3QgbmVlZCB0byByZXNlcnZlIHVud3JpdHRlbiBleHRlbnQgZm9yIHRoaXMKKwkJCSAqIHJhbmdlLCBmcmVlIHJlc2VydmVkIGRhdGEgc3BhY2UgZmlyc3QsIG90aGVyd2lzZQorCQkJICogaXQnbGwgcmVzdWx0IGluIGZhbHNlIEVOT1NQQyBlcnJvci4KKwkJCSAqLworCQkJYnRyZnNfZnJlZV9yZXNlcnZlZF9kYXRhX3NwYWNlKGlub2RlLCBjdXJfb2Zmc2V0LAorCQkJCWxhc3RfYnl0ZSAtIGN1cl9vZmZzZXQpOwogCQl9CiAJCWZyZWVfZXh0ZW50X21hcChlbSk7CiAJCWN1cl9vZmZzZXQgPSBsYXN0X2J5dGU7CkBAIC0yODExLDYgKzI4MTksOSBAQAogCQkJCQlyYW5nZS0+c3RhcnQsCiAJCQkJCXJhbmdlLT5sZW4sIDEgPDwgaW5vZGUtPmlfYmxrYml0cywKIAkJCQkJb2Zmc2V0ICsgbGVuLCAmYWxsb2NfaGludCk7CisJCWVsc2UKKwkJCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShpbm9kZSwgcmFuZ2UtPnN0YXJ0LAorCQkJCQkJICAgICAgIHJhbmdlLT5sZW4pOwogCQlsaXN0X2RlbCgmcmFuZ2UtPmxpc3QpOwogCQlrZnJlZShyYW5nZSk7CiAJfQpAQCAtMjg0NSwxOCArMjg1NiwxMSBAQAogCXVubG9ja19leHRlbnRfY2FjaGVkKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgYWxsb2Nfc3RhcnQsIGxvY2tlZF9lbmQsCiAJCQkgICAgICZjYWNoZWRfc3RhdGUsIEdGUF9LRVJORUwpOwogb3V0OgotCS8qCi0JICogQXMgd2Ugd2FpdGVkIHRoZSBleHRlbnQgcmFuZ2UsIHRoZSBkYXRhX3Jzdl9tYXAgbXVzdCBiZSBlbXB0eQotCSAqIGluIHRoZSByYW5nZSwgYXMgd3JpdHRlbiBkYXRhIHJhbmdlIHdpbGwgYmUgcmVsZWFzZWQgZnJvbSBpdC4KLQkgKiBBbmQgZm9yIHByZWFsbG9hY3RlZCBleHRlbnQsIGl0IHdpbGwgYWxzbyBiZSByZWxlYXNlZCB3aGVuCi0JICogaXRzIG1ldGFkYXRhIGlzIHdyaXR0ZW4uCi0JICogU28gdGhpcyBpcyBjb21wbGV0ZWx5IHVzZWQgYXMgY2xlYW51cC4KLQkgKi8KLQlidHJmc19xZ3JvdXBfZnJlZV9kYXRhKGlub2RlLCBhbGxvY19zdGFydCwgYWxsb2NfZW5kIC0gYWxsb2Nfc3RhcnQpOwogCWlub2RlX3VubG9jayhpbm9kZSk7CiAJLyogTGV0IGdvIG9mIG91ciByZXNlcnZhdGlvbi4gKi8KLQlidHJmc19mcmVlX3Jlc2VydmVkX2RhdGFfc3BhY2UoaW5vZGUsIGFsbG9jX3N0YXJ0LAotCQkJCSAgICAgICBhbGxvY19lbmQgLSBhbGxvY19zdGFydCk7CisJaWYgKHJldCAhPSAwKQorCQlidHJmc19mcmVlX3Jlc2VydmVkX2RhdGFfc3BhY2UoaW5vZGUsIGFsbG9jX3N0YXJ0LAorCQkJCSAgICAgICBhbGxvY19lbmQgLSBjdXJfb2Zmc2V0KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9idHJmcy9pbm9kZS1tYXAuYyBiL2ZzL2J0cmZzL2lub2RlLW1hcC5jCmluZGV4IGFhNmZhYmEuLjM1OWVlODYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2lub2RlLW1hcC5jCisrKyBiL2ZzL2J0cmZzL2lub2RlLW1hcC5jCkBAIC00OTUsMTAgKzQ5NSw5IEBACiAJcmV0ID0gYnRyZnNfcHJlYWxsb2NfZmlsZV9yYW5nZV90cmFucyhpbm9kZSwgdHJhbnMsIDAsIDAsIHByZWFsbG9jLAogCQkJCQkgICAgICBwcmVhbGxvYywgcHJlYWxsb2MsICZhbGxvY19oaW50KTsKIAlpZiAocmV0KSB7Ci0JCWJ0cmZzX2RlbGFsbG9jX3JlbGVhc2Vfc3BhY2UoaW5vZGUsIDAsIHByZWFsbG9jKTsKKwkJYnRyZnNfZGVsYWxsb2NfcmVsZWFzZV9tZXRhZGF0YShpbm9kZSwgcHJlYWxsb2MpOwogCQlnb3RvIG91dF9wdXQ7CiAJfQotCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShpbm9kZSwgMCwgcHJlYWxsb2MpOwogCiAJcmV0ID0gYnRyZnNfd3JpdGVfb3V0X2lub19jYWNoZShyb290LCB0cmFucywgcGF0aCwgaW5vZGUpOwogb3V0X3B1dDoKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lub2RlLmMgYi9mcy9idHJmcy9pbm9kZS5jCmluZGV4IDA4ZGZjNTcuLmU2ODExYzQyIDEwMDY0NAotLS0gYS9mcy9idHJmcy9pbm9kZS5jCisrKyBiL2ZzL2J0cmZzL2lub2RlLmMKQEAgLTU2Niw2ICs1NjYsOCBAQAogCQkJCQkJICAgICBQQUdFX1NFVF9XUklURUJBQ0sgfAogCQkJCQkJICAgICBwYWdlX2Vycm9yX29wIHwKIAkJCQkJCSAgICAgUEFHRV9FTkRfV1JJVEVCQUNLKTsKKwkJCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZV9ub3F1b3RhKGlub2RlLCBzdGFydCwKKwkJCQkJCWVuZCAtIHN0YXJ0ICsgMSk7CiAJCQlnb3RvIGZyZWVfcGFnZXNfb3V0OwogCQl9CiAJfQpAQCAtNzQyLDcgKzc0NCw3IEBACiAJCWxvY2tfZXh0ZW50KGlvX3RyZWUsIGFzeW5jX2V4dGVudC0+c3RhcnQsCiAJCQkgICAgYXN5bmNfZXh0ZW50LT5zdGFydCArIGFzeW5jX2V4dGVudC0+cmFtX3NpemUgLSAxKTsKIAotCQlyZXQgPSBidHJmc19yZXNlcnZlX2V4dGVudChyb290LAorCQlyZXQgPSBidHJmc19yZXNlcnZlX2V4dGVudChyb290LCBhc3luY19leHRlbnQtPnJhbV9zaXplLAogCQkJCQkgICBhc3luY19leHRlbnQtPmNvbXByZXNzZWRfc2l6ZSwKIAkJCQkJICAgYXN5bmNfZXh0ZW50LT5jb21wcmVzc2VkX3NpemUsCiAJCQkJCSAgIDAsIGFsbG9jX2hpbnQsICZpbnMsIDEsIDEpOwpAQCAtOTY5LDcgKzk3MSw4IEBACiAJCQkJICAgICBFWFRFTlRfREVGUkFHLCBQQUdFX1VOTE9DSyB8CiAJCQkJICAgICBQQUdFX0NMRUFSX0RJUlRZIHwgUEFHRV9TRVRfV1JJVEVCQUNLIHwKIAkJCQkgICAgIFBBR0VfRU5EX1dSSVRFQkFDSyk7Ci0KKwkJCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZV9ub3F1b3RhKGlub2RlLCBzdGFydCwKKwkJCQkJCWVuZCAtIHN0YXJ0ICsgMSk7CiAJCQkqbnJfd3JpdHRlbiA9ICpucl93cml0dGVuICsKIAkJCSAgICAgKGVuZCAtIHN0YXJ0ICsgUEFHRV9TSVpFKSAvIFBBR0VfU0laRTsKIAkJCSpwYWdlX3N0YXJ0ZWQgPSAxOwpAQCAtOTg5LDcgKzk5Miw3IEBACiAJCXVuc2lnbmVkIGxvbmcgb3A7CiAKIAkJY3VyX2FsbG9jX3NpemUgPSBkaXNrX251bV9ieXRlczsKLQkJcmV0ID0gYnRyZnNfcmVzZXJ2ZV9leHRlbnQocm9vdCwgY3VyX2FsbG9jX3NpemUsCisJCXJldCA9IGJ0cmZzX3Jlc2VydmVfZXh0ZW50KHJvb3QsIGN1cl9hbGxvY19zaXplLCBjdXJfYWxsb2Nfc2l6ZSwKIAkJCQkJICAgcm9vdC0+c2VjdG9yc2l6ZSwgMCwgYWxsb2NfaGludCwKIAkJCQkJICAgJmlucywgMSwgMSk7CiAJCWlmIChyZXQgPCAwKQpAQCAtMTQ4OSw4ICsxNDkyLDEwIEBACiAJCWV4dGVudF9jbGVhcl91bmxvY2tfZGVsYWxsb2MoaW5vZGUsIGN1cl9vZmZzZXQsCiAJCQkJCSAgICAgY3VyX29mZnNldCArIG51bV9ieXRlcyAtIDEsCiAJCQkJCSAgICAgbG9ja2VkX3BhZ2UsIEVYVEVOVF9MT0NLRUQgfAotCQkJCQkgICAgIEVYVEVOVF9ERUxBTExPQywgUEFHRV9VTkxPQ0sgfAotCQkJCQkgICAgIFBBR0VfU0VUX1BSSVZBVEUyKTsKKwkJCQkJICAgICBFWFRFTlRfREVMQUxMT0MgfAorCQkJCQkgICAgIEVYVEVOVF9DTEVBUl9EQVRBX1JFU1YsCisJCQkJCSAgICAgUEFHRV9VTkxPQ0sgfCBQQUdFX1NFVF9QUklWQVRFMik7CisKIAkJaWYgKCFub2xvY2sgJiYgbm9jb3cpCiAJCQlidHJmc19lbmRfd3JpdGVfbm9fc25hcHNob3Rpbmcocm9vdCk7CiAJCWN1cl9vZmZzZXQgPSBleHRlbnRfZW5kOwpAQCAtMTgwNyw3ICsxODEyLDkgQEAKIAkJCXJldHVybjsKIAogCQlpZiAocm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgIT0gQlRSRlNfREFUQV9SRUxPQ19UUkVFX09CSkVDVElECi0JCSAgICAmJiBkb19saXN0ICYmICEoc3RhdGUtPnN0YXRlICYgRVhURU5UX05PUkVTRVJWRSkpCisJCSAgICAmJiBkb19saXN0ICYmICEoc3RhdGUtPnN0YXRlICYgRVhURU5UX05PUkVTRVJWRSkKKwkJICAgICYmICgqYml0cyAmIChFWFRFTlRfRE9fQUNDT1VOVElORyB8CisJCSAgICBFWFRFTlRfQ0xFQVJfREFUQV9SRVNWKSkpCiAJCQlidHJmc19mcmVlX3Jlc2VydmVkX2RhdGFfc3BhY2Vfbm9xdW90YShpbm9kZSwKIAkJCQkJc3RhdGUtPnN0YXJ0LCBsZW4pOwogCkBAIC03MjUxLDcgKzcyNTgsNyBAQAogCWludCByZXQ7CiAKIAlhbGxvY19oaW50ID0gZ2V0X2V4dGVudF9hbGxvY2F0aW9uX2hpbnQoaW5vZGUsIHN0YXJ0LCBsZW4pOwotCXJldCA9IGJ0cmZzX3Jlc2VydmVfZXh0ZW50KHJvb3QsIGxlbiwgcm9vdC0+c2VjdG9yc2l6ZSwgMCwKKwlyZXQgPSBidHJmc19yZXNlcnZlX2V4dGVudChyb290LCBsZW4sIGxlbiwgcm9vdC0+c2VjdG9yc2l6ZSwgMCwKIAkJCQkgICBhbGxvY19oaW50LCAmaW5zLCAxLCAxKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwpAQCAtNzc1MSw2ICs3NzU4LDEzIEBACiAJCQkJcmV0ID0gUFRSX0VSUihlbTIpOwogCQkJCWdvdG8gdW5sb2NrX2VycjsKIAkJCX0KKwkJCS8qCisJCQkgKiBGb3IgaW5vZGUgbWFya2VkIE5PREFUQUNPVyBvciBleHRlbnQgbWFya2VkIFBSRUFMTE9DLAorCQkJICogdXNlIHRoZSBleGlzdGluZyBvciBwcmVhbGxvY2F0ZWQgZXh0ZW50LCBzbyBkb2VzIG5vdAorCQkJICogbmVlZCB0byBhZGp1c3QgYnRyZnNfc3BhY2VfaW5mbydzIGJ5dGVzX21heV91c2UuCisJCQkgKi8KKwkJCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZV9ub3F1b3RhKGlub2RlLAorCQkJCQlzdGFydCwgbGVuKTsKIAkJCWdvdG8gdW5sb2NrOwogCQl9CiAJfQpAQCAtNzc4NSw3ICs3Nzk5LDYgQEAKIAkJCWlfc2l6ZV93cml0ZShpbm9kZSwgc3RhcnQgKyBsZW4pOwogCiAJCWFkanVzdF9kaW9fb3V0c3RhbmRpbmdfZXh0ZW50cyhpbm9kZSwgZGlvX2RhdGEsIGxlbik7Ci0JCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShpbm9kZSwgc3RhcnQsIGxlbik7CiAJCVdBUk5fT04oZGlvX2RhdGEtPnJlc2VydmUgPCBsZW4pOwogCQlkaW9fZGF0YS0+cmVzZXJ2ZSAtPSBsZW47CiAJCWRpb19kYXRhLT51bnN1Ym1pdHRlZF9vZV9yYW5nZV9lbmQgPSBzdGFydCArIGxlbjsKQEAgLTEwMzA2LDYgKzEwMzE5LDcgQEAKIAl1NjQgbGFzdF9hbGxvYyA9ICh1NjQpLTE7CiAJaW50IHJldCA9IDA7CiAJYm9vbCBvd25fdHJhbnMgPSB0cnVlOworCXU2NCBlbmQgPSBzdGFydCArIG51bV9ieXRlcyAtIDE7CiAKIAlpZiAodHJhbnMpCiAJCW93bl90cmFucyA9IGZhbHNlOwpAQCAtMTAzMjcsOCArMTAzNDEsOCBAQAogCQkgKiBzaXplZCBjaHVua3MuCiAJCSAqLwogCQljdXJfYnl0ZXMgPSBtaW4oY3VyX2J5dGVzLCBsYXN0X2FsbG9jKTsKLQkJcmV0ID0gYnRyZnNfcmVzZXJ2ZV9leHRlbnQocm9vdCwgY3VyX2J5dGVzLCBtaW5fc2l6ZSwgMCwKLQkJCQkJICAgKmFsbG9jX2hpbnQsICZpbnMsIDEsIDApOworCQlyZXQgPSBidHJmc19yZXNlcnZlX2V4dGVudChyb290LCBjdXJfYnl0ZXMsIGN1cl9ieXRlcywKKwkJCQltaW5fc2l6ZSwgMCwgKmFsbG9jX2hpbnQsICZpbnMsIDEsIDApOwogCQlpZiAocmV0KSB7CiAJCQlpZiAob3duX3RyYW5zKQogCQkJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CkBAIC0xMDQxNCw2ICsxMDQyOCw5IEBACiAJCWlmIChvd25fdHJhbnMpCiAJCQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCX0KKwlpZiAoY3VyX29mZnNldCA8IGVuZCkKKwkJYnRyZnNfZnJlZV9yZXNlcnZlZF9kYXRhX3NwYWNlKGlub2RlLCBjdXJfb2Zmc2V0LAorCQkJZW5kIC0gY3VyX29mZnNldCArIDEpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lvY3RsLmMgYi9mcy9idHJmcy9pb2N0bC5jCmluZGV4IDE0ZWQxZTkuLjdmZDkzOWIgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2lvY3RsLmMKKysrIGIvZnMvYnRyZnMvaW9jdGwuYwpAQCAtMTYzNCw2ICsxNjM0LDkgQEAKIAlpbnQgbmFtZWxlbjsKIAlpbnQgcmV0ID0gMDsKIAorCWlmICghU19JU0RJUihmaWxlX2lub2RlKGZpbGUpLT5pX21vZGUpKQorCQlyZXR1cm4gLUVOT1RESVI7CisKIAlyZXQgPSBtbnRfd2FudF93cml0ZV9maWxlKGZpbGUpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwpAQCAtMTY5MSw2ICsxNjk0LDkgQEAKIAlzdHJ1Y3QgYnRyZnNfaW9jdGxfdm9sX2FyZ3MgKnZvbF9hcmdzOwogCWludCByZXQ7CiAKKwlpZiAoIVNfSVNESVIoZmlsZV9pbm9kZShmaWxlKS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FTk9URElSOworCiAJdm9sX2FyZ3MgPSBtZW1kdXBfdXNlcihhcmcsIHNpemVvZigqdm9sX2FyZ3MpKTsKIAlpZiAoSVNfRVJSKHZvbF9hcmdzKSkKIAkJcmV0dXJuIFBUUl9FUlIodm9sX2FyZ3MpOwpAQCAtMTcxNCw2ICsxNzIwLDkgQEAKIAlib29sIHJlYWRvbmx5ID0gZmFsc2U7CiAJc3RydWN0IGJ0cmZzX3Fncm91cF9pbmhlcml0ICppbmhlcml0ID0gTlVMTDsKIAorCWlmICghU19JU0RJUihmaWxlX2lub2RlKGZpbGUpLT5pX21vZGUpKQorCQlyZXR1cm4gLUVOT1RESVI7CisKIAl2b2xfYXJncyA9IG1lbWR1cF91c2VyKGFyZywgc2l6ZW9mKCp2b2xfYXJncykpOwogCWlmIChJU19FUlIodm9sX2FyZ3MpKQogCQlyZXR1cm4gUFRSX0VSUih2b2xfYXJncyk7CkBAIC0yMzU3LDYgKzIzNjYsOSBAQAogCWludCByZXQ7CiAJaW50IGVyciA9IDA7CiAKKwlpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQorCQlyZXR1cm4gLUVOT1RESVI7CisKIAl2b2xfYXJncyA9IG1lbWR1cF91c2VyKGFyZywgc2l6ZW9mKCp2b2xfYXJncykpOwogCWlmIChJU19FUlIodm9sX2FyZ3MpKQogCQlyZXR1cm4gUFRSX0VSUih2b2xfYXJncyk7CkBAIC01MDg0LDcgKzUwOTYsNyBAQAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCXJldHVybiBidHJmc19xZ3JvdXBfd2FpdF9mb3JfY29tcGxldGlvbihyb290LT5mc19pbmZvKTsKKwlyZXR1cm4gYnRyZnNfcWdyb3VwX3dhaXRfZm9yX2NvbXBsZXRpb24ocm9vdC0+ZnNfaW5mbywgdHJ1ZSk7CiB9CiAKIHN0YXRpYyBsb25nIF9idHJmc19pb2N0bF9zZXRfcmVjZWl2ZWRfc3Vidm9sKHN0cnVjdCBmaWxlICpmaWxlLApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvcWdyb3VwLmMgYi9mcy9idHJmcy9xZ3JvdXAuYwppbmRleCA5M2VlMWMxLi44ZGIyZTI5IDEwMDY0NAotLS0gYS9mcy9idHJmcy9xZ3JvdXAuYworKysgYi9mcy9idHJmcy9xZ3JvdXAuYwpAQCAtOTk1LDcgKzk5NSw3IEBACiAJCWdvdG8gb3V0OwogCWZzX2luZm8tPnF1b3RhX2VuYWJsZWQgPSAwOwogCWZzX2luZm8tPnBlbmRpbmdfcXVvdGFfc3RhdGUgPSAwOwotCWJ0cmZzX3Fncm91cF93YWl0X2Zvcl9jb21wbGV0aW9uKGZzX2luZm8pOworCWJ0cmZzX3Fncm91cF93YWl0X2Zvcl9jb21wbGV0aW9uKGZzX2luZm8sIGZhbHNlKTsKIAlzcGluX2xvY2soJmZzX2luZm8tPnFncm91cF9sb2NrKTsKIAlxdW90YV9yb290ID0gZnNfaW5mby0+cXVvdGFfcm9vdDsKIAlmc19pbmZvLT5xdW90YV9yb290ID0gTlVMTDsKQEAgLTE0NTMsMTAgKzE0NTMsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0cnVjdCBidHJmc19xZ3JvdXBfZXh0ZW50X3JlY29yZCAqCi1idHJmc19xZ3JvdXBfaW5zZXJ0X2RpcnR5X2V4dGVudChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKLQkJCQkgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX3Jvb3QgKmRlbGF5ZWRfcmVmcywKLQkJCQkgc3RydWN0IGJ0cmZzX3Fncm91cF9leHRlbnRfcmVjb3JkICpyZWNvcmQpCitpbnQgYnRyZnNfcWdyb3VwX2luc2VydF9kaXJ0eV9leHRlbnRfbm9sb2NrKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9yb290ICpkZWxheWVkX3JlZnMsCisJCQkJc3RydWN0IGJ0cmZzX3Fncm91cF9leHRlbnRfcmVjb3JkICpyZWNvcmQpCiB7CiAJc3RydWN0IHJiX25vZGUgKipwID0gJmRlbGF5ZWRfcmVmcy0+ZGlydHlfZXh0ZW50X3Jvb3QucmJfbm9kZTsKIAlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50X25vZGUgPSBOVUxMOwpAQCAtMTQ3NSwxMiArMTQ3NCw0MiBAQAogCQllbHNlIGlmIChieXRlbnIgPiBlbnRyeS0+Ynl0ZW5yKQogCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKIAkJZWxzZQotCQkJcmV0dXJuIGVudHJ5OworCQkJcmV0dXJuIDE7CiAJfQogCiAJcmJfbGlua19ub2RlKCZyZWNvcmQtPm5vZGUsIHBhcmVudF9ub2RlLCBwKTsKIAlyYl9pbnNlcnRfY29sb3IoJnJlY29yZC0+bm9kZSwgJmRlbGF5ZWRfcmVmcy0+ZGlydHlfZXh0ZW50X3Jvb3QpOwotCXJldHVybiBOVUxMOworCXJldHVybiAwOworfQorCitpbnQgYnRyZnNfcWdyb3VwX2luc2VydF9kaXJ0eV9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLCB1NjQgYnl0ZW5yLCB1NjQgbnVtX2J5dGVzLAorCQlnZnBfdCBnZnBfZmxhZykKK3sKKwlzdHJ1Y3QgYnRyZnNfcWdyb3VwX2V4dGVudF9yZWNvcmQgKnJlY29yZDsKKwlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfcm9vdCAqZGVsYXllZF9yZWZzOworCWludCByZXQ7CisKKwlpZiAoIWZzX2luZm8tPnF1b3RhX2VuYWJsZWQgfHwgYnl0ZW5yID09IDAgfHwgbnVtX2J5dGVzID09IDApCisJCXJldHVybiAwOworCWlmIChXQVJOX09OKHRyYW5zID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZWNvcmQgPSBrbWFsbG9jKHNpemVvZigqcmVjb3JkKSwgZ2ZwX2ZsYWcpOworCWlmICghcmVjb3JkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRlbGF5ZWRfcmVmcyA9ICZ0cmFucy0+dHJhbnNhY3Rpb24tPmRlbGF5ZWRfcmVmczsKKwlyZWNvcmQtPmJ5dGVuciA9IGJ5dGVucjsKKwlyZWNvcmQtPm51bV9ieXRlcyA9IG51bV9ieXRlczsKKwlyZWNvcmQtPm9sZF9yb290cyA9IE5VTEw7CisKKwlzcGluX2xvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7CisJcmV0ID0gYnRyZnNfcWdyb3VwX2luc2VydF9kaXJ0eV9leHRlbnRfbm9sb2NrKGZzX2luZm8sIGRlbGF5ZWRfcmVmcywKKwkJCQkJCSAgICAgIHJlY29yZCk7CisJc3Bpbl91bmxvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7CisJaWYgKHJldCA+IDApCisJCWtmcmVlKHJlY29yZCk7CisJcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgVVBEQVRFX05FVwkwCkBAIC0yMzAzLDYgKzIzMzIsMTAgQEAKIAlpbnQgZXJyID0gLUVOT01FTTsKIAlpbnQgcmV0ID0gMDsKIAorCW11dGV4X2xvY2soJmZzX2luZm8tPnFncm91cF9yZXNjYW5fbG9jayk7CisJZnNfaW5mby0+cWdyb3VwX3Jlc2Nhbl9ydW5uaW5nID0gdHJ1ZTsKKwltdXRleF91bmxvY2soJmZzX2luZm8tPnFncm91cF9yZXNjYW5fbG9jayk7CisKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwogCWlmICghcGF0aCkKIAkJZ290byBvdXQ7CkBAIC0yMzY5LDYgKzI0MDIsOSBAQAogCX0KIAogZG9uZToKKwltdXRleF9sb2NrKCZmc19pbmZvLT5xZ3JvdXBfcmVzY2FuX2xvY2spOworCWZzX2luZm8tPnFncm91cF9yZXNjYW5fcnVubmluZyA9IGZhbHNlOworCW11dGV4X3VubG9jaygmZnNfaW5mby0+cWdyb3VwX3Jlc2Nhbl9sb2NrKTsKIAljb21wbGV0ZV9hbGwoJmZzX2luZm8tPnFncm91cF9yZXNjYW5fY29tcGxldGlvbik7CiB9CiAKQEAgLTI0ODcsMjAgKzI1MjMsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGJ0cmZzX3Fncm91cF93YWl0X2Zvcl9jb21wbGV0aW9uKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvKQoraW50IGJ0cmZzX3Fncm91cF93YWl0X2Zvcl9jb21wbGV0aW9uKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCSAgICAgYm9vbCBpbnRlcnJ1cHRpYmxlKQogewogCWludCBydW5uaW5nOwogCWludCByZXQgPSAwOwogCiAJbXV0ZXhfbG9jaygmZnNfaW5mby0+cWdyb3VwX3Jlc2Nhbl9sb2NrKTsKIAlzcGluX2xvY2soJmZzX2luZm8tPnFncm91cF9sb2NrKTsKLQlydW5uaW5nID0gZnNfaW5mby0+cWdyb3VwX2ZsYWdzICYgQlRSRlNfUUdST1VQX1NUQVRVU19GTEFHX1JFU0NBTjsKKwlydW5uaW5nID0gZnNfaW5mby0+cWdyb3VwX3Jlc2Nhbl9ydW5uaW5nOwogCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5xZ3JvdXBfbG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5xZ3JvdXBfcmVzY2FuX2xvY2spOwogCi0JaWYgKHJ1bm5pbmcpCisJaWYgKCFydW5uaW5nKQorCQlyZXR1cm4gMDsKKworCWlmIChpbnRlcnJ1cHRpYmxlKQogCQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoCiAJCQkJCSZmc19pbmZvLT5xZ3JvdXBfcmVzY2FuX2NvbXBsZXRpb24pOworCWVsc2UKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmZnNfaW5mby0+cWdyb3VwX3Jlc2Nhbl9jb21wbGV0aW9uKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9xZ3JvdXAuaCBiL2ZzL2J0cmZzL3Fncm91cC5oCmluZGV4IDcxMDg4N2MuLjFiYzY0YzggMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3Fncm91cC5oCisrKyBiL2ZzL2J0cmZzL3Fncm91cC5oCkBAIC00Niw3ICs0Niw4IEBACiAJCQlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyk7CiBpbnQgYnRyZnNfcWdyb3VwX3Jlc2NhbihzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyk7CiB2b2lkIGJ0cmZzX3Fncm91cF9yZXNjYW5fcmVzdW1lKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvKTsKLWludCBidHJmc19xZ3JvdXBfd2FpdF9mb3JfY29tcGxldGlvbihzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyk7CitpbnQgYnRyZnNfcWdyb3VwX3dhaXRfZm9yX2NvbXBsZXRpb24oc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCisJCQkJICAgICBib29sIGludGVycnVwdGlibGUpOwogaW50IGJ0cmZzX2FkZF9xZ3JvdXBfcmVsYXRpb24oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgICAgICBzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywgdTY0IHNyYywgdTY0IGRzdCk7CiBpbnQgYnRyZnNfZGVsX3Fncm91cF9yZWxhdGlvbihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKQEAgLTYzLDEwICs2NCwzNSBAQAogc3RydWN0IGJ0cmZzX2RlbGF5ZWRfZXh0ZW50X29wOwogaW50IGJ0cmZzX3Fncm91cF9wcmVwYXJlX2FjY291bnRfZXh0ZW50cyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCQkJIHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvKTsKLXN0cnVjdCBidHJmc19xZ3JvdXBfZXh0ZW50X3JlY29yZCAqCi1idHJmc19xZ3JvdXBfaW5zZXJ0X2RpcnR5X2V4dGVudChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKLQkJCQkgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX3Jvb3QgKmRlbGF5ZWRfcmVmcywKLQkJCQkgc3RydWN0IGJ0cmZzX3Fncm91cF9leHRlbnRfcmVjb3JkICpyZWNvcmQpOworLyoKKyAqIEluc2VydCBvbmUgZGlydHkgZXh0ZW50IHJlY29yZCBpbnRvIEBkZWxheWVkX3JlZnMsIGluZm9ybWluZyBxZ3JvdXAgdG8KKyAqIGFjY291bnQgdGhhdCBleHRlbnQgYXQgY29tbWl0IHRyYW5zIHRpbWUuCisgKgorICogTm8gbG9jayB2ZXJzaW9uLCBjYWxsZXIgbXVzdCBhY3F1aXJlIGRlbGF5ZWQgcmVmIGxvY2sgYW5kIGFsbG9jYXRlIG1lbW9yeS4KKyAqCisgKiBSZXR1cm4gMCBmb3Igc3VjY2VzcyBpbnNlcnQKKyAqIFJldHVybiA+MCBmb3IgZXhpc3RpbmcgcmVjb3JkLCBjYWxsZXIgY2FuIGZyZWUgQHJlY29yZCBzYWZlbHkuCisgKiBFcnJvciBpcyBub3QgcG9zc2libGUKKyAqLworaW50IGJ0cmZzX3Fncm91cF9pbnNlcnRfZGlydHlfZXh0ZW50X25vbG9jaygKKwkJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCisJCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9yb290ICpkZWxheWVkX3JlZnMsCisJCXN0cnVjdCBidHJmc19xZ3JvdXBfZXh0ZW50X3JlY29yZCAqcmVjb3JkKTsKKworLyoKKyAqIEluc2VydCBvbmUgZGlydHkgZXh0ZW50IHJlY29yZCBpbnRvIEBkZWxheWVkX3JlZnMsIGluZm9ybWluZyBxZ3JvdXAgdG8KKyAqIGFjY291bnQgdGhhdCBleHRlbnQgYXQgY29tbWl0IHRyYW5zIHRpbWUuCisgKgorICogQmV0dGVyIGVuY2Fwc3VsYXRlZCB2ZXJzaW9uLgorICoKKyAqIFJldHVybiAwIGlmIHRoZSBvcGVyYXRpb24gaXMgZG9uZS4KKyAqIFJldHVybiA8MCBmb3IgZXJyb3IsIGxpa2UgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBvciBpbnZhbGlkIHBhcmFtZXRlcgorICogKE5VTEwgdHJhbnMpCisgKi8KK2ludCBidHJmc19xZ3JvdXBfaW5zZXJ0X2RpcnR5X2V4dGVudChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sIHU2NCBieXRlbnIsIHU2NCBudW1fYnl0ZXMsCisJCWdmcF90IGdmcF9mbGFnKTsKKwogaW50CiBidHJmc19xZ3JvdXBfYWNjb3VudF9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgICAgc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCmRpZmYgLS1naXQgYS9mcy9idHJmcy9yZWxvY2F0aW9uLmMgYi9mcy9idHJmcy9yZWxvY2F0aW9uLmMKaW5kZXggYjI2YTVhZS4uYzBjMTNkYyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvcmVsb2NhdGlvbi5jCisrKyBiL2ZzL2J0cmZzL3JlbG9jYXRpb24uYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgImFzeW5jLXRocmVhZC5oIgogI2luY2x1ZGUgImZyZWUtc3BhY2UtY2FjaGUuaCIKICNpbmNsdWRlICJpbm9kZS1tYXAuaCIKKyNpbmNsdWRlICJxZ3JvdXAuaCIKIAogLyoKICAqIGJhY2tyZWZfbm9kZSwgbWFwcGluZ19ub2RlIGFuZCB0cmVlX2Jsb2NrIHN0YXJ0IHdpdGggdGhpcwpAQCAtMzAzNywxNSArMzAzOCwxOSBAQAogCXU2NCBudW1fYnl0ZXM7CiAJaW50IG5yID0gMDsKIAlpbnQgcmV0ID0gMDsKKwl1NjQgcHJlYWxsb2Nfc3RhcnQgPSBjbHVzdGVyLT5zdGFydCAtIG9mZnNldDsKKwl1NjQgcHJlYWxsb2NfZW5kID0gY2x1c3Rlci0+ZW5kIC0gb2Zmc2V0OworCXU2NCBjdXJfb2Zmc2V0OwogCiAJQlVHX09OKGNsdXN0ZXItPnN0YXJ0ICE9IGNsdXN0ZXItPmJvdW5kYXJ5WzBdKTsKIAlpbm9kZV9sb2NrKGlub2RlKTsKIAotCXJldCA9IGJ0cmZzX2NoZWNrX2RhdGFfZnJlZV9zcGFjZShpbm9kZSwgY2x1c3Rlci0+c3RhcnQsCi0JCQkJCSAgY2x1c3Rlci0+ZW5kICsgMSAtIGNsdXN0ZXItPnN0YXJ0KTsKKwlyZXQgPSBidHJmc19jaGVja19kYXRhX2ZyZWVfc3BhY2UoaW5vZGUsIHByZWFsbG9jX3N0YXJ0LAorCQkJCQkgIHByZWFsbG9jX2VuZCArIDEgLSBwcmVhbGxvY19zdGFydCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKKwljdXJfb2Zmc2V0ID0gcHJlYWxsb2Nfc3RhcnQ7CiAJd2hpbGUgKG5yIDwgY2x1c3Rlci0+bnIpIHsKIAkJc3RhcnQgPSBjbHVzdGVyLT5ib3VuZGFyeVtucl0gLSBvZmZzZXQ7CiAJCWlmIChuciArIDEgPCBjbHVzdGVyLT5ucikKQEAgLTMwNTUsMTYgKzMwNjAsMjEgQEAKIAogCQlsb2NrX2V4dGVudCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIHN0YXJ0LCBlbmQpOwogCQludW1fYnl0ZXMgPSBlbmQgKyAxIC0gc3RhcnQ7CisJCWlmIChjdXJfb2Zmc2V0IDwgc3RhcnQpCisJCQlidHJmc19mcmVlX3Jlc2VydmVkX2RhdGFfc3BhY2UoaW5vZGUsIGN1cl9vZmZzZXQsCisJCQkJCXN0YXJ0IC0gY3VyX29mZnNldCk7CiAJCXJldCA9IGJ0cmZzX3ByZWFsbG9jX2ZpbGVfcmFuZ2UoaW5vZGUsIDAsIHN0YXJ0LAogCQkJCQkJbnVtX2J5dGVzLCBudW1fYnl0ZXMsCiAJCQkJCQllbmQgKyAxLCAmYWxsb2NfaGludCk7CisJCWN1cl9vZmZzZXQgPSBlbmQgKyAxOwogCQl1bmxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgc3RhcnQsIGVuZCk7CiAJCWlmIChyZXQpCiAJCQlicmVhazsKIAkJbnIrKzsKIAl9Ci0JYnRyZnNfZnJlZV9yZXNlcnZlZF9kYXRhX3NwYWNlKGlub2RlLCBjbHVzdGVyLT5zdGFydCwKLQkJCQkgICAgICAgY2x1c3Rlci0+ZW5kICsgMSAtIGNsdXN0ZXItPnN0YXJ0KTsKKwlpZiAoY3VyX29mZnNldCA8IHByZWFsbG9jX2VuZCkKKwkJYnRyZnNfZnJlZV9yZXNlcnZlZF9kYXRhX3NwYWNlKGlub2RlLCBjdXJfb2Zmc2V0LAorCQkJCSAgICAgICBwcmVhbGxvY19lbmQgKyAxIC0gY3VyX29mZnNldCk7CiBvdXQ6CiAJaW5vZGVfdW5sb2NrKGlub2RlKTsKIAlyZXR1cm4gcmV0OwpAQCAtMzkxNiw2ICszOTI2LDkwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBRZ3JvdXAgZml4ZXIgZm9yIGRhdGEgY2h1bmsgcmVsb2NhdGlvbi4KKyAqIFRoZSBkYXRhIHJlbG9jYXRpb24gaXMgZG9uZSBpbiB0aGUgZm9sbG93aW5nIHN0ZXBzCisgKiAxKSBDb3B5IGRhdGEgZXh0ZW50cyBpbnRvIGRhdGEgcmVsb2MgdHJlZQorICogMikgQ3JlYXRlIHRyZWUgcmVsb2MgdHJlZShzcGVjaWFsIHNuYXBzaG90KSBmb3IgcmVsYXRlZCBzdWJ2b2x1bWVzCisgKiAzKSBNb2RpZnkgZmlsZSBleHRlbnRzIGluIHRyZWUgcmVsb2MgdHJlZQorICogNCkgTWVyZ2UgdHJlZSByZWxvYyB0cmVlIHdpdGggb3JpZ2luYWwgZnMgdHJlZSwgYnkgc3dhcHBpbmcgdHJlZSBibG9ja3MKKyAqCisgKiBUaGUgcHJvYmxlbSBpcywgZGF0YSBhbmQgdHJlZSByZWxvYyB0cmVlIGFyZSBub3QgYWNjb3VudGVkIHRvIHFncm91cCwKKyAqIGFuZCA0KSB3aWxsIG9ubHkgaW5mbyBxZ3JvdXAgdG8gdHJhY2sgdHJlZSBibG9ja3MgY2hhbmdlLCBub3QgZmlsZSBleHRlbnRzCisgKiBpbiB0aGUgdHJlZSBibG9ja3MuCisgKgorICogVGhlIGdvb2QgbmV3cyBpcywgcmVsYXRlZCBkYXRhIGV4dGVudHMgYXJlIGFsbCBpbiBkYXRhIHJlbG9jIHRyZWUsIHNvIHdlCisgKiBvbmx5IG5lZWQgdG8gaW5mbyBxZ3JvdXAgdG8gdHJhY2sgYWxsIGZpbGUgZXh0ZW50cyBpbiBkYXRhIHJlbG9jIHRyZWUKKyAqIGJlZm9yZSBjb21taXQgdHJhbnMuCisgKi8KK3N0YXRpYyBpbnQgcWdyb3VwX2ZpeF9yZWxvY2F0ZWRfZGF0YV9leHRlbnRzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCQkgICAgIHN0cnVjdCByZWxvY19jb250cm9sICpyYykKK3sKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJjLT5leHRlbnRfcm9vdC0+ZnNfaW5mbzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcmMtPmRhdGFfaW5vZGU7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmRhdGFfcmVsb2Nfcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCWludCByZXQgPSAwOworCisJaWYgKCFmc19pbmZvLT5xdW90YV9lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogT25seSBmb3Igc3RhZ2Ugd2hlcmUgd2UgdXBkYXRlIGRhdGEgcG9pbnRlcnMgdGhlIHFncm91cCBmaXggaXMKKwkgKiB2YWxpZC4KKwkgKiBGb3IgTU9WSU5HX0RBVEEgc3RhZ2UsIHdlIHdpbGwgbWlzcyB0aGUgdGltaW5nIG9mIHN3YXBwaW5nIHRyZWUKKwkgKiBibG9ja3MsIGFuZCB3b24ndCBmaXggaXQuCisJICovCisJaWYgKCEocmMtPnN0YWdlID09IFVQREFURV9EQVRBX1BUUlMgJiYgcmMtPmV4dGVudHNfZm91bmQpKQorCQlyZXR1cm4gMDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKwlrZXkub2JqZWN0aWQgPSBidHJmc19pbm8oaW5vZGUpOworCWtleS50eXBlID0gQlRSRlNfRVhURU5UX0RBVEFfS0VZOworCWtleS5vZmZzZXQgPSAwOworCisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgZGF0YV9yZWxvY19yb290LCAma2V5LCBwYXRoLCAwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlsb2NrX2V4dGVudCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIDAsICh1NjQpLTEpOworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpmaTsKKworCQlidHJmc19pdGVtX2tleV90b19jcHUocGF0aC0+bm9kZXNbMF0sICZrZXksIHBhdGgtPnNsb3RzWzBdKTsKKwkJaWYgKGtleS5vYmplY3RpZCA+IGJ0cmZzX2lubyhpbm9kZSkpCisJCQlicmVhazsKKwkJaWYgKGtleS50eXBlICE9IEJUUkZTX0VYVEVOVF9EQVRBX0tFWSkKKwkJCWdvdG8gbmV4dDsKKwkJZmkgPSBidHJmc19pdGVtX3B0cihwYXRoLT5ub2Rlc1swXSwgcGF0aC0+c2xvdHNbMF0sCisJCQkJICAgIHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtKTsKKwkJaWYgKGJ0cmZzX2ZpbGVfZXh0ZW50X3R5cGUocGF0aC0+bm9kZXNbMF0sIGZpKSAhPQorCQkJCUJUUkZTX0ZJTEVfRVhURU5UX1JFRykKKwkJCWdvdG8gbmV4dDsKKwkJcmV0ID0gYnRyZnNfcWdyb3VwX2luc2VydF9kaXJ0eV9leHRlbnQodHJhbnMsIGZzX2luZm8sCisJCQlidHJmc19maWxlX2V4dGVudF9kaXNrX2J5dGVucihwYXRoLT5ub2Rlc1swXSwgZmkpLAorCQkJYnRyZnNfZmlsZV9leHRlbnRfZGlza19udW1fYnl0ZXMocGF0aC0+bm9kZXNbMF0sIGZpKSwKKwkJCUdGUF9OT0ZTKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKK25leHQ6CisJCXJldCA9IGJ0cmZzX25leHRfaXRlbShkYXRhX3JlbG9jX3Jvb3QsIHBhdGgpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCQlpZiAocmV0ID4gMCkgeworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCXVubG9ja19leHRlbnQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCAwICwgKHU2NCktMSk7CitvdXQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50IHJlbG9jYXRlX2Jsb2NrX2dyb3VwKHN0cnVjdCByZWxvY19jb250cm9sICpyYykKIHsKIAlzdHJ1Y3QgcmJfcm9vdCBibG9ja3MgPSBSQl9ST09UOwpAQCAtNDEwMiwxMCArNDE5NiwxOCBAQAogCiAJLyogZ2V0IHJpZCBvZiBwaW5uZWQgZXh0ZW50cyAqLwogCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyYy0+ZXh0ZW50X3Jvb3QpOwotCWlmIChJU19FUlIodHJhbnMpKQorCWlmIChJU19FUlIodHJhbnMpKSB7CiAJCWVyciA9IFBUUl9FUlIodHJhbnMpOwotCWVsc2UKLQkJYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByYy0+ZXh0ZW50X3Jvb3QpOworCQlnb3RvIG91dF9mcmVlOworCX0KKwlyZXQgPSBxZ3JvdXBfZml4X3JlbG9jYXRlZF9kYXRhX2V4dGVudHModHJhbnMsIHJjKTsKKwlpZiAocmV0IDwgMCkgeworCQlidHJmc19hYm9ydF90cmFuc2FjdGlvbih0cmFucywgcmV0KTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSByZXQ7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCWJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcmMtPmV4dGVudF9yb290KTsKIG91dF9mcmVlOgogCWJ0cmZzX2ZyZWVfYmxvY2tfcnN2KHJjLT5leHRlbnRfcm9vdCwgcmMtPmJsb2NrX3Jzdik7CiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwpAQCAtNDQ2OCwxMCArNDU3MCwxNiBAQAogCXVuc2V0X3JlbG9jX2NvbnRyb2wocmMpOwogCiAJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJjLT5leHRlbnRfcm9vdCk7Ci0JaWYgKElTX0VSUih0cmFucykpCisJaWYgKElTX0VSUih0cmFucykpIHsKIAkJZXJyID0gUFRSX0VSUih0cmFucyk7Ci0JZWxzZQotCQllcnIgPSBidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIHJjLT5leHRlbnRfcm9vdCk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCWVyciA9IHFncm91cF9maXhfcmVsb2NhdGVkX2RhdGFfZXh0ZW50cyh0cmFucywgcmMpOworCWlmIChlcnIgPCAwKSB7CisJCWJ0cmZzX2Fib3J0X3RyYW5zYWN0aW9uKHRyYW5zLCBlcnIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKwllcnIgPSBidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIHJjLT5leHRlbnRfcm9vdCk7CiBvdXRfZnJlZToKIAlrZnJlZShyYyk7CiBvdXQ6CmRpZmYgLS1naXQgYS9mcy9idHJmcy9yb290LXRyZWUuYyBiL2ZzL2J0cmZzL3Jvb3QtdHJlZS5jCmluZGV4IDdmZDdlMTguLjA5MTI5NjAgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3Jvb3QtdHJlZS5jCisrKyBiL2ZzL2J0cmZzL3Jvb3QtdHJlZS5jCkBAIC0yNzIsNiArMjcyLDIzIEBACiAJCXJvb3Rfa2V5Lm9iamVjdGlkID0ga2V5Lm9mZnNldDsKIAkJa2V5Lm9mZnNldCsrOwogCisJCS8qCisJCSAqIFRoZSByb290IG1pZ2h0IGhhdmUgYmVlbiBpbnNlcnRlZCBhbHJlYWR5LCBhcyBiZWZvcmUgd2UgbG9vaworCQkgKiBmb3Igb3JwaGFuIHJvb3RzLCBsb2cgcmVwbGF5IG1pZ2h0IGhhdmUgaGFwcGVuZWQsIHdoaWNoCisJCSAqIHRyaWdnZXJzIGEgdHJhbnNhY3Rpb24gY29tbWl0IGFuZCBxZ3JvdXAgYWNjb3VudGluZywgd2hpY2gKKwkJICogaW4gdHVybiByZWFkcyBhbmQgaW5zZXJ0cyBmcyByb290cyB3aGlsZSBkb2luZyBiYWNrcmVmCisJCSAqIHdhbGtpbmcuCisJCSAqLworCQlyb290ID0gYnRyZnNfbG9va3VwX2ZzX3Jvb3QodHJlZV9yb290LT5mc19pbmZvLAorCQkJCQkgICAgcm9vdF9rZXkub2JqZWN0aWQpOworCQlpZiAocm9vdCkgeworCQkJV0FSTl9PTighdGVzdF9iaXQoQlRSRlNfUk9PVF9PUlBIQU5fSVRFTV9JTlNFUlRFRCwKKwkJCQkJICAmcm9vdC0+c3RhdGUpKTsKKwkJCWlmIChidHJmc19yb290X3JlZnMoJnJvb3QtPnJvb3RfaXRlbSkgPT0gMCkKKwkJCQlidHJmc19hZGRfZGVhZF9yb290KHJvb3QpOworCQkJY29udGludWU7CisJCX0KKwogCQlyb290ID0gYnRyZnNfcmVhZF9mc19yb290KHRyZWVfcm9vdCwgJnJvb3Rfa2V5KTsKIAkJZXJyID0gUFRSX0VSUl9PUl9aRVJPKHJvb3QpOwogCQlpZiAoZXJyICYmIGVyciAhPSAtRU5PRU5UKSB7CkBAIC0zMTAsMTYgKzMyNyw4IEBACiAJCXNldF9iaXQoQlRSRlNfUk9PVF9PUlBIQU5fSVRFTV9JTlNFUlRFRCwgJnJvb3QtPnN0YXRlKTsKIAogCQllcnIgPSBidHJmc19pbnNlcnRfZnNfcm9vdChyb290LT5mc19pbmZvLCByb290KTsKLQkJLyoKLQkJICogVGhlIHJvb3QgbWlnaHQgaGF2ZSBiZWVuIGluc2VydGVkIGFscmVhZHksIGFzIGJlZm9yZSB3ZSBsb29rCi0JCSAqIGZvciBvcnBoYW4gcm9vdHMsIGxvZyByZXBsYXkgbWlnaHQgaGF2ZSBoYXBwZW5lZCwgd2hpY2gKLQkJICogdHJpZ2dlcnMgYSB0cmFuc2FjdGlvbiBjb21taXQgYW5kIHFncm91cCBhY2NvdW50aW5nLCB3aGljaAotCQkgKiBpbiB0dXJuIHJlYWRzIGFuZCBpbnNlcnRzIGZzIHJvb3RzIHdoaWxlIGRvaW5nIGJhY2tyZWYKLQkJICogd2Fsa2luZy4KLQkJICovCi0JCWlmIChlcnIgPT0gLUVFWElTVCkKLQkJCWVyciA9IDA7CiAJCWlmIChlcnIpIHsKKwkJCUJVR19PTihlcnIgPT0gLUVFWElTVCk7CiAJCQlidHJmc19mcmVlX2ZzX3Jvb3Qocm9vdCk7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvc2VuZC5jIGIvZnMvYnRyZnMvc2VuZC5jCmluZGV4IGVmZTEyOWYuLmE4NzY3NWYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3NlbmQuYworKysgYi9mcy9idHJmcy9zZW5kLmMKQEAgLTQyNjgsMTAgKzQyNjgsMTIgQEAKIAl9CiAJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOwogCisJLyoKKwkgKiBXZSBkb24ndCBhY3R1YWxseSBjYXJlIGFib3V0IHBlbmRpbmdfbW92ZSBhcyB3ZSBhcmUgc2ltcGx5CisJICogcmUtY3JlYXRpbmcgdGhpcyBpbm9kZSBhbmQgd2lsbCBiZSByZW5hbWUnaW5nIGl0IGludG8gcGxhY2Ugb25jZSB3ZQorCSAqIHJlbmFtZSB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKwkgKi8KIAlyZXQgPSBwcm9jZXNzX3JlY29yZGVkX3JlZnMoc2N0eCwgJnBlbmRpbmdfbW92ZSk7Ci0JLyogT25seSBhcHBsaWNhYmxlIHRvIGFuIGluY3JlbWVudGFsIHNlbmQuICovCi0JQVNTRVJUKHBlbmRpbmdfbW92ZSA9PSAwKTsKLQogb3V0OgogCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvc3VwZXIuYyBiL2ZzL2J0cmZzL3N1cGVyLmMKaW5kZXggODY0Y2UzMy4uNDA3MWZlMiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvc3VwZXIuYworKysgYi9mcy9idHJmcy9zdXBlci5jCkBAIC0yMjQxLDYgKzIyNDEsMTMgQEAKIAlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IGJ0cmZzX3NiKHNiKS0+dHJlZV9yb290OwogCisJcm9vdC0+ZnNfaW5mby0+ZnNfZnJvemVuID0gMTsKKwkvKgorCSAqIFdlIGRvbid0IG5lZWQgYSBiYXJyaWVyIGhlcmUsIHdlJ2xsIHdhaXQgZm9yIGFueSB0cmFuc2FjdGlvbiB0aGF0CisJICogY291bGQgYmUgaW4gcHJvZ3Jlc3Mgb24gb3RoZXIgdGhyZWFkcyAoYW5kIGRvIGRlbGF5ZWQgaXB1dHMgdGhhdAorCSAqIHdlIHdhbnQgdG8gYXZvaWQgb24gYSBmcm96ZW4gZmlsZXN5c3RlbSksIG9yIGRvIHRoZSBjb21taXQKKwkgKiBvdXJzZWx2ZXMuCisJICovCiAJdHJhbnMgPSBidHJmc19hdHRhY2hfdHJhbnNhY3Rpb25fYmFycmllcihyb290KTsKIAlpZiAoSVNfRVJSKHRyYW5zKSkgewogCQkvKiBubyB0cmFuc2FjdGlvbiwgZG9uJ3QgYm90aGVyICovCkBAIC0yMjUxLDYgKzIyNTgsMTQgQEAKIAlyZXR1cm4gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIH0KIAorc3RhdGljIGludCBidHJmc191bmZyZWV6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gYnRyZnNfc2Ioc2IpLT50cmVlX3Jvb3Q7CisKKwlyb290LT5mc19pbmZvLT5mc19mcm96ZW4gPSAwOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGJ0cmZzX3Nob3dfZGV2bmFtZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBkZW50cnkgKnJvb3QpCiB7CiAJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8gPSBidHJmc19zYihyb290LT5kX3NiKTsKQEAgLTIyOTksNiArMjMxNCw3IEBACiAJLnN0YXRmcwkJPSBidHJmc19zdGF0ZnMsCiAJLnJlbW91bnRfZnMJPSBidHJmc19yZW1vdW50LAogCS5mcmVlemVfZnMJPSBidHJmc19mcmVlemUsCisJLnVuZnJlZXplX2ZzCT0gYnRyZnNfdW5mcmVlemUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidHJmc19jdGxfZm9wcyA9IHsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMgYi9mcy9idHJmcy90cmFuc2FjdGlvbi5jCmluZGV4IDljY2EwYTcuLjk1ZDQxOTEgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMKKysrIGIvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYwpAQCAtMjI3OCw4ICsyMjc4LDEzIEBACiAKIAlrbWVtX2NhY2hlX2ZyZWUoYnRyZnNfdHJhbnNfaGFuZGxlX2NhY2hlcCwgdHJhbnMpOwogCisJLyoKKwkgKiBJZiBmcyBoYXMgYmVlbiBmcm96ZW4sIHdlIGNhbiBub3QgaGFuZGxlIGRlbGF5ZWQgaXB1dHMsIG90aGVyd2lzZQorCSAqIGl0J2xsIHJlc3VsdCBpbiBkZWFkbG9jayBhYm91dCBTQl9GUkVFWkVfRlMuCisJICovCiAJaWYgKGN1cnJlbnQgIT0gcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fa3RocmVhZCAmJgotCSAgICBjdXJyZW50ICE9IHJvb3QtPmZzX2luZm8tPmNsZWFuZXJfa3RocmVhZCkKKwkgICAgY3VycmVudCAhPSByb290LT5mc19pbmZvLT5jbGVhbmVyX2t0aHJlYWQgJiYKKwkgICAgIXJvb3QtPmZzX2luZm8tPmZzX2Zyb3plbikKIAkJYnRyZnNfcnVuX2RlbGF5ZWRfaXB1dHMocm9vdCk7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJlZS1sb2cuYyBiL2ZzL2J0cmZzL3RyZWUtbG9nLmMKaW5kZXggZmZmM2YzZS4uZWY5YzU1YiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdHJlZS1sb2cuYworKysgYi9mcy9idHJmcy90cmVlLWxvZy5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAiYmFja3JlZi5oIgogI2luY2x1ZGUgImhhc2guaCIKICNpbmNsdWRlICJjb21wcmVzc2lvbi5oIgorI2luY2x1ZGUgInFncm91cC5oIgogCiAvKiBtYWdpYyB2YWx1ZXMgZm9yIHRoZSBpbm9kZV9vbmx5IGZpZWxkIGluIGJ0cmZzX2xvZ19pbm9kZToKICAqCkBAIC02ODAsNiArNjgxLDIxIEBACiAJCWlucy50eXBlID0gQlRSRlNfRVhURU5UX0lURU1fS0VZOwogCQlvZmZzZXQgPSBrZXktPm9mZnNldCAtIGJ0cmZzX2ZpbGVfZXh0ZW50X29mZnNldChlYiwgaXRlbSk7CiAKKwkJLyoKKwkJICogTWFudWFsbHkgcmVjb3JkIGRpcnR5IGV4dGVudCwgYXMgaGVyZSB3ZSBkaWQgYSBzaGFsbG93CisJCSAqIGZpbGUgZXh0ZW50IGl0ZW0gY29weSBhbmQgc2tpcCBub3JtYWwgYmFja3JlZiB1cGRhdGUsCisJCSAqIGJ1dCBtb2RpZnlpbmcgZXh0ZW50IHRyZWUgYWxsIGJ5IG91cnNlbHZlcy4KKwkJICogU28gbmVlZCB0byBtYW51YWxseSByZWNvcmQgZGlydHkgZXh0ZW50IGZvciBxZ3JvdXAsCisJCSAqIGFzIHRoZSBvd25lciBvZiB0aGUgZmlsZSBleHRlbnQgY2hhbmdlZCBmcm9tIGxvZyB0cmVlCisJCSAqIChkb2Vzbid0IGFmZmVjdCBxZ3JvdXApIHRvIGZzL2ZpbGUgdHJlZShhZmZlY3RzIHFncm91cCkKKwkJICovCisJCXJldCA9IGJ0cmZzX3Fncm91cF9pbnNlcnRfZGlydHlfZXh0ZW50KHRyYW5zLCByb290LT5mc19pbmZvLAorCQkJCWJ0cmZzX2ZpbGVfZXh0ZW50X2Rpc2tfYnl0ZW5yKGViLCBpdGVtKSwKKwkJCQlidHJmc19maWxlX2V4dGVudF9kaXNrX251bV9ieXRlcyhlYiwgaXRlbSksCisJCQkJR0ZQX05PRlMpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCiAJCWlmIChpbnMub2JqZWN0aWQgPiAwKSB7CiAJCQl1NjQgY3N1bV9zdGFydDsKIAkJCXU2NCBjc3VtX2VuZDsKQEAgLTI4MDcsNyArMjgyMyw3IEBACiAJICovCiAJbXV0ZXhfdW5sb2NrKCZyb290LT5sb2dfbXV0ZXgpOwogCi0JYnRyZnNfaW5pdF9sb2dfY3R4KCZyb290X2xvZ19jdHgpOworCWJ0cmZzX2luaXRfbG9nX2N0eCgmcm9vdF9sb2dfY3R4LCBOVUxMKTsKIAogCW11dGV4X2xvY2soJmxvZ19yb290X3RyZWUtPmxvZ19tdXRleCk7CiAJYXRvbWljX2luYygmbG9nX3Jvb3RfdHJlZS0+bG9nX2JhdGNoKTsKQEAgLTI4NTEsNiArMjg2Nyw3IEBACiAKIAlpZiAobG9nX3Jvb3RfdHJlZS0+bG9nX3RyYW5zaWRfY29tbWl0dGVkID49IHJvb3RfbG9nX2N0eC5sb2dfdHJhbnNpZCkgewogCQlibGtfZmluaXNoX3BsdWcoJnBsdWcpOworCQlsaXN0X2RlbF9pbml0KCZyb290X2xvZ19jdHgubGlzdCk7CiAJCW11dGV4X3VubG9jaygmbG9nX3Jvb3RfdHJlZS0+bG9nX211dGV4KTsKIAkJcmV0ID0gcm9vdF9sb2dfY3R4LmxvZ19yZXQ7CiAJCWdvdG8gb3V0OwpAQCAtNDc0MSw3ICs0NzU4LDggQEAKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJZXJyID0gcmV0OwogCQkJCWdvdG8gb3V0X3VubG9jazsKLQkJCX0gZWxzZSBpZiAocmV0ID4gMCkgeworCQkJfSBlbHNlIGlmIChyZXQgPiAwICYmIGN0eCAmJgorCQkJCSAgIG90aGVyX2lubyAhPSBidHJmc19pbm8oY3R4LT5pbm9kZSkpIHsKIAkJCQlzdHJ1Y3QgYnRyZnNfa2V5IGlub2RlX2tleTsKIAkJCQlzdHJ1Y3QgaW5vZGUgKm90aGVyX2lub2RlOwogCmRpZmYgLS1naXQgYS9mcy9idHJmcy90cmVlLWxvZy5oIGIvZnMvYnRyZnMvdHJlZS1sb2cuaAppbmRleCBhOWYxYjc1Li5hYjg1OGUzIDEwMDY0NAotLS0gYS9mcy9idHJmcy90cmVlLWxvZy5oCisrKyBiL2ZzL2J0cmZzL3RyZWUtbG9nLmgKQEAgLTMwLDE1ICszMCwxOCBAQAogCWludCBsb2dfdHJhbnNpZDsKIAlpbnQgaW9fZXJyOwogCWJvb2wgbG9nX25ld19kZW50cmllczsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBidHJmc19pbml0X2xvZ19jdHgoc3RydWN0IGJ0cmZzX2xvZ19jdHggKmN0eCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBidHJmc19pbml0X2xvZ19jdHgoc3RydWN0IGJ0cmZzX2xvZ19jdHggKmN0eCwKKwkJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWN0eC0+bG9nX3JldCA9IDA7CiAJY3R4LT5sb2dfdHJhbnNpZCA9IDA7CiAJY3R4LT5pb19lcnIgPSAwOwogCWN0eC0+bG9nX25ld19kZW50cmllcyA9IGZhbHNlOworCWN0eC0+aW5vZGUgPSBpbm9kZTsKIAlJTklUX0xJU1RfSEVBRCgmY3R4LT5saXN0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdm9sdW1lcy5jIGIvZnMvYnRyZnMvdm9sdW1lcy5jCmluZGV4IDUxZjEyNTUuLjAzNWVmY2UgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3ZvbHVtZXMuYworKysgYi9mcy9idHJmcy92b2x1bWVzLmMKQEAgLTgzNCwxMCArODM0LDYgQEAKIAlzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2U7CiAKIAlkZXZpY2UgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJ0cmZzX2RldmljZSwgcmN1X3dvcmspOwotCi0JaWYgKGRldmljZS0+YmRldikKLQkJYmxrZGV2X3B1dChkZXZpY2UtPmJkZXYsIGRldmljZS0+bW9kZSk7Ci0KIAlyY3Vfc3RyaW5nX2ZyZWUoZGV2aWNlLT5uYW1lKTsKIAlrZnJlZShkZXZpY2UpOwogfQpAQCAtODUyLDYgKzg0OCwxNyBAQAogCXNjaGVkdWxlX3dvcmsoJmRldmljZS0+cmN1X3dvcmspOwogfQogCitzdGF0aWMgdm9pZCBidHJmc19jbG9zZV9iZGV2KHN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZSkKK3sKKwlpZiAoZGV2aWNlLT5iZGV2ICYmIGRldmljZS0+d3JpdGVhYmxlKSB7CisJCXN5bmNfYmxvY2tkZXYoZGV2aWNlLT5iZGV2KTsKKwkJaW52YWxpZGF0ZV9iZGV2KGRldmljZS0+YmRldik7CisJfQorCisJaWYgKGRldmljZS0+YmRldikKKwkJYmxrZGV2X3B1dChkZXZpY2UtPmJkZXYsIGRldmljZS0+bW9kZSk7Cit9CisKIHN0YXRpYyB2b2lkIGJ0cmZzX2Nsb3NlX29uZV9kZXZpY2Uoc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmc19kZXZpY2VzID0gZGV2aWNlLT5mc19kZXZpY2VzOwpAQCAtODcwLDEwICs4NzcsNyBAQAogCWlmIChkZXZpY2UtPm1pc3NpbmcpCiAJCWZzX2RldmljZXMtPm1pc3NpbmdfZGV2aWNlcy0tOwogCi0JaWYgKGRldmljZS0+YmRldiAmJiBkZXZpY2UtPndyaXRlYWJsZSkgewotCQlzeW5jX2Jsb2NrZGV2KGRldmljZS0+YmRldik7Ci0JCWludmFsaWRhdGVfYmRldihkZXZpY2UtPmJkZXYpOwotCX0KKwlidHJmc19jbG9zZV9iZGV2KGRldmljZSk7CiAKIAluZXdfZGV2aWNlID0gYnRyZnNfYWxsb2NfZGV2aWNlKE5VTEwsICZkZXZpY2UtPmRldmlkLAogCQkJCQlkZXZpY2UtPnV1aWQpOwpAQCAtMTkzMiw2ICsxOTM2LDggQEAKIAkJYnRyZnNfc3lzZnNfcm1fZGV2aWNlX2xpbmsocm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcywgZGV2aWNlKTsKIAl9CiAKKwlidHJmc19jbG9zZV9iZGV2KGRldmljZSk7CisKIAljYWxsX3JjdSgmZGV2aWNlLT5yY3UsIGZyZWVfZGV2aWNlKTsKIAogCW51bV9kZXZpY2VzID0gYnRyZnNfc3VwZXJfbnVtX2RldmljZXMocm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSkgLSAxOwpAQCAtMjAyNSw2ICsyMDMxLDkgQEAKIAkJLyogemVybyBvdXQgdGhlIG9sZCBzdXBlciBpZiBpdCBpcyB3cml0YWJsZSAqLwogCQlidHJmc19zY3JhdGNoX3N1cGVyYmxvY2tzKHNyY2Rldi0+YmRldiwgc3JjZGV2LT5uYW1lLT5zdHIpOwogCX0KKworCWJ0cmZzX2Nsb3NlX2JkZXYoc3JjZGV2KTsKKwogCWNhbGxfcmN1KCZzcmNkZXYtPnJjdSwgZnJlZV9kZXZpY2UpOwogCiAJLyoKQEAgLTIwODAsNiArMjA4OSw4IEBACiAJICogdGhlIGRldmljZV9saXN0X211dGV4IGxvY2suCiAJICovCiAJYnRyZnNfc2NyYXRjaF9zdXBlcmJsb2Nrcyh0Z3RkZXYtPmJkZXYsIHRndGRldi0+bmFtZS0+c3RyKTsKKworCWJ0cmZzX2Nsb3NlX2JkZXYodGd0ZGV2KTsKIAljYWxsX3JjdSgmdGd0ZGV2LT5yY3UsIGZyZWVfZGV2aWNlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvY2VwaC9kaXIuYyBiL2ZzL2NlcGgvZGlyLmMKaW5kZXggYzY0YTBiNy4uZGY0YjNlNiAxMDA2NDQKLS0tIGEvZnMvY2VwaC9kaXIuYworKysgYi9mcy9jZXBoL2Rpci5jCkBAIC01OTcsNyArNTk3LDcgQEAKIAlpZiAoaXNfaGFzaF9vcmRlcihuZXdfcG9zKSkgewogCQkvKiBubyBuZWVkIHRvIHJlc2V0IGxhc3RfbmFtZSBmb3IgYSBmb3J3YXJkIHNlZWsgd2hlbgogCQkgKiBkZW50cmllcyBhcmUgc290cmVkIGluIGhhc2ggb3JkZXIgKi8KLQl9IGVsc2UgaWYgKGZpLT5mcmFnIHw9IGZwb3NfZnJhZyhuZXdfcG9zKSkgeworCX0gZWxzZSBpZiAoZmktPmZyYWcgIT0gZnBvc19mcmFnKG5ld19wb3MpKSB7CiAJCXJldHVybiB0cnVlOwogCX0KIAlyaW5mbyA9IGZpLT5sYXN0X3JlYWRkaXIgPyAmZmktPmxhc3RfcmVhZGRpci0+cl9yZXBseV9pbmZvIDogTlVMTDsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmMgYi9mcy9jaWZzL2NpZnNmcy5jCmluZGV4IDZiYmVjNWUuLjE0YWU0YjggMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2ZzLmMKKysrIGIvZnMvY2lmcy9jaWZzZnMuYwpAQCAtNjA5LDYgKzYwOSw5IEBACiAJY2hhciAqcywgKnA7CiAJY2hhciBzZXA7CiAKKwlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1VTRV9QUkVGSVhfUEFUSCkKKwkJcmV0dXJuIGRnZXQoc2ItPnNfcm9vdCk7CisKIAlmdWxsX3BhdGggPSBjaWZzX2J1aWxkX3BhdGhfdG9fcm9vdCh2b2wsIGNpZnNfc2IsCiAJCQkJCSAgICBjaWZzX3NiX21hc3Rlcl90Y29uKGNpZnNfc2IpKTsKIAlpZiAoZnVsbF9wYXRoID09IE5VTEwpCkBAIC02ODYsMjYgKzY4OSwyMiBAQAogCWNpZnNfc2ItPm1vdW50ZGF0YSA9IGtzdHJuZHVwKGRhdGEsIFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNpZnNfc2ItPm1vdW50ZGF0YSA9PSBOVUxMKSB7CiAJCXJvb3QgPSBFUlJfUFRSKC1FTk9NRU0pOwotCQlnb3RvIG91dF9jaWZzX3NiOworCQlnb3RvIG91dF9mcmVlOwogCX0KIAotCWlmICh2b2x1bWVfaW5mby0+cHJlcGF0aCkgewotCQljaWZzX3NiLT5wcmVwYXRoID0ga3N0cmR1cCh2b2x1bWVfaW5mby0+cHJlcGF0aCwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChjaWZzX3NiLT5wcmVwYXRoID09IE5VTEwpIHsKLQkJCXJvb3QgPSBFUlJfUFRSKC1FTk9NRU0pOwotCQkJZ290byBvdXRfY2lmc19zYjsKLQkJfQorCXJjID0gY2lmc19zZXR1cF9jaWZzX3NiKHZvbHVtZV9pbmZvLCBjaWZzX3NiKTsKKwlpZiAocmMpIHsKKwkJcm9vdCA9IEVSUl9QVFIocmMpOworCQlnb3RvIG91dF9mcmVlOwogCX0KIAotCWNpZnNfc2V0dXBfY2lmc19zYih2b2x1bWVfaW5mbywgY2lmc19zYik7Ci0KIAlyYyA9IGNpZnNfbW91bnQoY2lmc19zYiwgdm9sdW1lX2luZm8pOwogCWlmIChyYykgewogCQlpZiAoIShmbGFncyAmIE1TX1NJTEVOVCkpCiAJCQljaWZzX2RiZyhWRlMsICJjaWZzX21vdW50IGZhaWxlZCB3L3JldHVybiBjb2RlID0gJWRcbiIsCiAJCQkJIHJjKTsKIAkJcm9vdCA9IEVSUl9QVFIocmMpOwotCQlnb3RvIG91dF9tb3VudGRhdGE7CisJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCiAJbW50X2RhdGEudm9sID0gdm9sdW1lX2luZm87CkBAIC03MzUsMTEgKzczNCw3IEBACiAJCXNiLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKIAl9CiAKLQlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1VTRV9QUkVGSVhfUEFUSCkKLQkJcm9vdCA9IGRnZXQoc2ItPnNfcm9vdCk7Ci0JZWxzZQotCQlyb290ID0gY2lmc19nZXRfcm9vdCh2b2x1bWVfaW5mbywgc2IpOwotCisJcm9vdCA9IGNpZnNfZ2V0X3Jvb3Qodm9sdW1lX2luZm8sIHNiKTsKIAlpZiAoSVNfRVJSKHJvb3QpKQogCQlnb3RvIG91dF9zdXBlcjsKIApAQCAtNzUyLDkgKzc0Nyw5IEBACiAJY2lmc19jbGVhbnVwX3ZvbHVtZV9pbmZvKHZvbHVtZV9pbmZvKTsKIAlyZXR1cm4gcm9vdDsKIAotb3V0X21vdW50ZGF0YToKK291dF9mcmVlOgorCWtmcmVlKGNpZnNfc2ItPnByZXBhdGgpOwogCWtmcmVlKGNpZnNfc2ItPm1vdW50ZGF0YSk7Ci1vdXRfY2lmc19zYjoKIAlrZnJlZShjaWZzX3NiKTsKIG91dF9ubHM6CiAJdW5sb2FkX25scyh2b2x1bWVfaW5mby0+bG9jYWxfbmxzKTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc3Byb3RvLmggYi9mcy9jaWZzL2NpZnNwcm90by5oCmluZGV4IDEyNDNiZDMuLjk1ZGFiNDMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3Byb3RvLmgKKysrIGIvZnMvY2lmcy9jaWZzcHJvdG8uaApAQCAtMTg0LDcgKzE4NCw3IEBACiAJCQkgICAgICAgICB1bnNpZ25lZCBpbnQgdG9fcmVhZCk7CiBleHRlcm4gaW50IGNpZnNfcmVhZF9wYWdlX2Zyb21fc29ja2V0KHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwKIAkJCQkgICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IHRvX3JlYWQpOwotZXh0ZXJuIHZvaWQgY2lmc19zZXR1cF9jaWZzX3NiKHN0cnVjdCBzbWJfdm9sICpwdm9sdW1lX2luZm8sCitleHRlcm4gaW50IGNpZnNfc2V0dXBfY2lmc19zYihzdHJ1Y3Qgc21iX3ZvbCAqcHZvbHVtZV9pbmZvLAogCQkJICAgICAgIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IpOwogZXh0ZXJuIGludCBjaWZzX21hdGNoX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB2b2lkICopOwogZXh0ZXJuIHZvaWQgY2lmc19jbGVhbnVwX3ZvbHVtZV9pbmZvKHN0cnVjdCBzbWJfdm9sICpwdm9sdW1lX2luZm8pOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jb25uZWN0LmMgYi9mcy9jaWZzL2Nvbm5lY3QuYwppbmRleCA3YWUwMzI4Li4yZTRmNGJhIDEwMDY0NAotLS0gYS9mcy9jaWZzL2Nvbm5lY3QuYworKysgYi9mcy9jaWZzL2Nvbm5lY3QuYwpAQCAtMjc4MSw2ICsyNzgxLDI0IEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBpbnQKK21hdGNoX3ByZXBhdGgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGNpZnNfbW50X2RhdGEgKm1udF9kYXRhKQoreworCXN0cnVjdCBjaWZzX3NiX2luZm8gKm9sZCA9IENJRlNfU0Ioc2IpOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKm5ldyA9IG1udF9kYXRhLT5jaWZzX3NiOworCisJaWYgKG9sZC0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1VTRV9QUkVGSVhfUEFUSCkgeworCQlpZiAoIShuZXctPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9VU0VfUFJFRklYX1BBVEgpKQorCQkJcmV0dXJuIDA7CisJCS8qIFRoZSBwcmVwYXRoIHNob3VsZCBiZSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncyAqLworCQlpZiAoc3RyY21wKG5ldy0+cHJlcGF0aCwgb2xkLT5wcmVwYXRoKSkKKwkJCXJldHVybiAwOworCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKwogaW50CiBjaWZzX21hdGNoX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpCiB7CkBAIC0yODA4LDcgKzI4MjYsOCBAQAogCiAJaWYgKCFtYXRjaF9zZXJ2ZXIodGNwX3Nydiwgdm9sdW1lX2luZm8pIHx8CiAJICAgICFtYXRjaF9zZXNzaW9uKHNlcywgdm9sdW1lX2luZm8pIHx8Ci0JICAgICFtYXRjaF90Y29uKHRjb24sIHZvbHVtZV9pbmZvLT5VTkMpKSB7CisJICAgICFtYXRjaF90Y29uKHRjb24sIHZvbHVtZV9pbmZvLT5VTkMpIHx8CisJICAgICFtYXRjaF9wcmVwYXRoKHNiLCBtbnRfZGF0YSkpIHsKIAkJcmMgPSAwOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zMjIyLDcgKzMyNDEsNyBAQAogCX0KIH0KIAotdm9pZCBjaWZzX3NldHVwX2NpZnNfc2Ioc3RydWN0IHNtYl92b2wgKnB2b2x1bWVfaW5mbywKK2ludCBjaWZzX3NldHVwX2NpZnNfc2Ioc3RydWN0IHNtYl92b2wgKnB2b2x1bWVfaW5mbywKIAkJCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IpCiB7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmNpZnNfc2ItPnBydW5lX3RsaW5rcywgY2lmc19wcnVuZV90bGlua3MpOwpAQCAtMzMxNiw2ICszMzM1LDE0IEBACiAKIAlpZiAoKHB2b2x1bWVfaW5mby0+Y2lmc19hY2wpICYmIChwdm9sdW1lX2luZm8tPmR5bnBlcm0pKQogCQljaWZzX2RiZyhWRlMsICJtb3VudCBvcHRpb24gZHlucGVybSBpZ25vcmVkIGlmIGNpZnNhY2wgbW91bnQgb3B0aW9uIHN1cHBvcnRlZFxuIik7CisKKwlpZiAocHZvbHVtZV9pbmZvLT5wcmVwYXRoKSB7CisJCWNpZnNfc2ItPnByZXBhdGggPSBrc3RyZHVwKHB2b2x1bWVfaW5mby0+cHJlcGF0aCwgR0ZQX0tFUk5FTCk7CisJCWlmIChjaWZzX3NiLT5wcmVwYXRoID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL2ZzL2NvbmZpZ2ZzL2ZpbGUuYyBiL2ZzL2NvbmZpZ2ZzL2ZpbGUuYwppbmRleCBjMzBjZjQ5Li4yYzYzMTJkIDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9maWxlLmMKKysrIGIvZnMvY29uZmlnZnMvZmlsZS5jCkBAIC0zMzMsNiArMzMzLDcgQEAKIAkJaWYgKGJpbl9hdHRyLT5jYl9tYXhfc2l6ZSAmJgogCQkJKnBwb3MgKyBjb3VudCA+IGJpbl9hdHRyLT5jYl9tYXhfc2l6ZSkgewogCQkJbGVuID0gLUVGQklHOworCQkJZ290byBvdXQ7CiAJCX0KIAogCQl0YnVmID0gdm1hbGxvYygqcHBvcyArIGNvdW50KTsKZGlmZiAtLWdpdCBhL2ZzL2NyeXB0by9wb2xpY3kuYyBiL2ZzL2NyeXB0by9wb2xpY3kuYwppbmRleCAwZjk5NjFlLi5lZDExNWFjIDEwMDY0NAotLS0gYS9mcy9jcnlwdG8vcG9saWN5LmMKKysrIGIvZnMvY3J5cHRvL3BvbGljeS5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZnNjcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogCiBzdGF0aWMgaW50IGlub2RlX2hhc19lbmNyeXB0aW9uX2NvbnRleHQoc3RydWN0IGlub2RlICppbm9kZSkKIHsKQEAgLTkyLDI2ICs5Myw0MiBAQAogCXJldHVybiBpbm9kZS0+aV9zYi0+c19jb3AtPnNldF9jb250ZXh0KGlub2RlLCAmY3R4LCBzaXplb2YoY3R4KSwgTlVMTCk7CiB9CiAKLWludCBmc2NyeXB0X3Byb2Nlc3NfcG9saWN5KHN0cnVjdCBpbm9kZSAqaW5vZGUsCitpbnQgZnNjcnlwdF9wcm9jZXNzX3BvbGljeShzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCQljb25zdCBzdHJ1Y3QgZnNjcnlwdF9wb2xpY3kgKnBvbGljeSkKIHsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxwKTsKKwlpbnQgcmV0OworCisJaWYgKCFpbm9kZV9vd25lcl9vcl9jYXBhYmxlKGlub2RlKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKIAlpZiAocG9saWN5LT52ZXJzaW9uICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCisJcmV0ID0gbW50X3dhbnRfd3JpdGVfZmlsZShmaWxwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJaWYgKCFpbm9kZV9oYXNfZW5jcnlwdGlvbl9jb250ZXh0KGlub2RlKSkgewotCQlpZiAoIWlub2RlLT5pX3NiLT5zX2NvcC0+ZW1wdHlfZGlyKQotCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCQlpZiAoIWlub2RlLT5pX3NiLT5zX2NvcC0+ZW1wdHlfZGlyKGlub2RlKSkKLQkJCXJldHVybiAtRU5PVEVNUFRZOwotCQlyZXR1cm4gY3JlYXRlX2VuY3J5cHRpb25fY29udGV4dF9mcm9tX3BvbGljeShpbm9kZSwgcG9saWN5KTsKKwkJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJZWxzZSBpZiAoIWlub2RlLT5pX3NiLT5zX2NvcC0+ZW1wdHlfZGlyKQorCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWVsc2UgaWYgKCFpbm9kZS0+aV9zYi0+c19jb3AtPmVtcHR5X2Rpcihpbm9kZSkpCisJCQlyZXQgPSAtRU5PVEVNUFRZOworCQllbHNlCisJCQlyZXQgPSBjcmVhdGVfZW5jcnlwdGlvbl9jb250ZXh0X2Zyb21fcG9saWN5KGlub2RlLAorCQkJCQkJCQkgICAgcG9saWN5KTsKKwl9IGVsc2UgaWYgKCFpc19lbmNyeXB0aW9uX2NvbnRleHRfY29uc2lzdGVudF93aXRoX3BvbGljeShpbm9kZSwKKwkJCQkJCQkJIHBvbGljeSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiBQb2xpY3kgaW5jb25zaXN0ZW50IHdpdGggZW5jcnlwdGlvbiBjb250ZXh0XG4iLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOwogCX0KIAotCWlmIChpc19lbmNyeXB0aW9uX2NvbnRleHRfY29uc2lzdGVudF93aXRoX3BvbGljeShpbm9kZSwgcG9saWN5KSkKLQkJcmV0dXJuIDA7Ci0KLQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUG9saWN5IGluY29uc2lzdGVudCB3aXRoIGVuY3J5cHRpb24gY29udGV4dFxuIiwKLQkgICAgICAgX19mdW5jX18pOwotCXJldHVybiAtRUlOVkFMOworCW1udF9kcm9wX3dyaXRlX2ZpbGUoZmlscCk7CisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woZnNjcnlwdF9wcm9jZXNzX3BvbGljeSk7CiAKZGlmZiAtLWdpdCBhL2ZzL2RlYnVnZnMvZmlsZS5jIGIvZnMvZGVidWdmcy9maWxlLmMKaW5kZXggNTkyMDU5Zi4uMzU0ZTJhYiAxMDA2NDQKLS0tIGEvZnMvZGVidWdmcy9maWxlLmMKKysrIGIvZnMvZGVidWdmcy9maWxlLmMKQEAgLTk3LDkgKzk3LDYgQEAKIAogI2RlZmluZSBGX0RFTlRSWShmaWxwKSAoKGZpbHApLT5mX3BhdGguZGVudHJ5KQogCi0jZGVmaW5lIFJFQUxfRk9QU19ERVJFRihkZW50cnkpCQkJCQlcCi0JKChjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICopKGRlbnRyeSktPmRfZnNkYXRhKQotCiBzdGF0aWMgaW50IG9wZW5fcHJveHlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAljb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBGX0RFTlRSWShmaWxwKTsKQEAgLTExMiw3ICsxMDksNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZWFsX2ZvcHMgPSBSRUFMX0ZPUFNfREVSRUYoZGVudHJ5KTsKKwlyZWFsX2ZvcHMgPSBkZWJ1Z2ZzX3JlYWxfZm9wcyhmaWxwKTsKIAlyZWFsX2ZvcHMgPSBmb3BzX2dldChyZWFsX2ZvcHMpOwogCWlmICghcmVhbF9mb3BzKSB7CiAJCS8qIEh1aD8gTW9kdWxlIGRpZCBub3QgY2xlYW4gdXAgYWZ0ZXIgaXRzZWxmIGF0IGV4aXQ/ICovCkBAIC0xNDMsNyArMTQwLDcgQEAKIHsJCQkJCQkJCQlcCiAJY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gRl9ERU5UUlkoZmlscCk7CQkJXAogCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKnJlYWxfZm9wcyA9CQkJXAotCQlSRUFMX0ZPUFNfREVSRUYoZGVudHJ5KTsJCQkJXAorCQlkZWJ1Z2ZzX3JlYWxfZm9wcyhmaWxwKTsJCQkJXAogCWludCBzcmN1X2lkeDsJCQkJCQkJXAogCXJldF90eXBlIHI7CQkJCQkJCVwKIAkJCQkJCQkJCVwKQEAgLTE3Niw3ICsxNzMsNyBAQAogCQkJCXN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKIHsKIAljb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBGX0RFTlRSWShmaWxwKTsKLQljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpyZWFsX2ZvcHMgPSBSRUFMX0ZPUFNfREVSRUYoZGVudHJ5KTsKKwljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpyZWFsX2ZvcHMgPSBkZWJ1Z2ZzX3JlYWxfZm9wcyhmaWxwKTsKIAlpbnQgc3JjdV9pZHg7CiAJdW5zaWduZWQgaW50IHIgPSAwOwogCkBAIC0xOTMsNyArMTkwLDcgQEAKIHN0YXRpYyBpbnQgZnVsbF9wcm94eV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCWNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IEZfREVOVFJZKGZpbHApOwotCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKnJlYWxfZm9wcyA9IFJFQUxfRk9QU19ERVJFRihkZW50cnkpOworCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKnJlYWxfZm9wcyA9IGRlYnVnZnNfcmVhbF9mb3BzKGZpbHApOwogCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKnByb3h5X2ZvcHMgPSBmaWxwLT5mX29wOwogCWludCByID0gMDsKIApAQCAtMjA5LDcgKzIwNiw3IEBACiAJcmVwbGFjZV9mb3BzKGZpbHAsIGRfaW5vZGUoZGVudHJ5KS0+aV9mb3ApOwogCWtmcmVlKCh2b2lkICopcHJveHlfZm9wcyk7CiAJZm9wc19wdXQocmVhbF9mb3BzKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcjsKIH0KIAogc3RhdGljIHZvaWQgX19mdWxsX3Byb3h5X2ZvcHNfaW5pdChzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpwcm94eV9mb3BzLApAQCAtMjQxLDcgKzIzOCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJlYWxfZm9wcyA9IFJFQUxfRk9QU19ERVJFRihkZW50cnkpOworCXJlYWxfZm9wcyA9IGRlYnVnZnNfcmVhbF9mb3BzKGZpbHApOwogCXJlYWxfZm9wcyA9IGZvcHNfZ2V0KHJlYWxfZm9wcyk7CiAJaWYgKCFyZWFsX2ZvcHMpIHsKIAkJLyogSHVoPyBNb2R1bGUgZGlkIG5vdCBjbGVhbnVwIGFmdGVyIGl0c2VsZiBhdCBleGl0PyAqLwpkaWZmIC0tZ2l0IGEvZnMvZGVidWdmcy9pbnRlcm5hbC5oIGIvZnMvZGVidWdmcy9pbnRlcm5hbC5oCmluZGV4IGJiYTUyNjMuLmIzZTg0NDMgMTAwNjQ0Ci0tLSBhL2ZzL2RlYnVnZnMvaW50ZXJuYWwuaAorKysgYi9mcy9kZWJ1Z2ZzL2ludGVybmFsLmgKQEAgLTE5LDggKzE5LDQgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnZnNfb3Blbl9wcm94eV9maWxlX29wZXJhdGlvbnM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z2ZzX2Z1bGxfcHJveHlfZmlsZV9vcGVyYXRpb25zOwogCi1zdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV9maWxlX3Vuc2FmZShjb25zdCBjaGFyICpuYW1lLCB1bW9kZV90IG1vZGUsCi0JCQkJCXN0cnVjdCBkZW50cnkgKnBhcmVudCwgdm9pZCAqZGF0YSwKLQkJCQkJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcyk7Ci0KICNlbmRpZiAvKiBfREVCVUdGU19JTlRFUk5BTF9IXyAqLwpkaWZmIC0tZ2l0IGEvZnMvZGV2cHRzL2lub2RlLmMgYi9mcy9kZXZwdHMvaW5vZGUuYwppbmRleCBkMTE2NDUzLi40NDJkMWE3IDEwMDY0NAotLS0gYS9mcy9kZXZwdHMvaW5vZGUuYworKysgYi9mcy9kZXZwdHMvaW5vZGUuYwpAQCAtMjcyLDEzICsyNzIsOCBAQAogCXN0cnVjdCBkZW50cnkgKnJvb3QgPSBzYi0+c19yb290OwogCXN0cnVjdCBwdHNfZnNfaW5mbyAqZnNpID0gREVWUFRTX1NCKHNiKTsKIAlzdHJ1Y3QgcHRzX21vdW50X29wdHMgKm9wdHMgPSAmZnNpLT5tb3VudF9vcHRzOwotCWt1aWRfdCByb290X3VpZDsKLQlrZ2lkX3Qgcm9vdF9naWQ7Ci0KLQlyb290X3VpZCA9IG1ha2Vfa3VpZChjdXJyZW50X3VzZXJfbnMoKSwgMCk7Ci0Jcm9vdF9naWQgPSBtYWtlX2tnaWQoY3VycmVudF91c2VyX25zKCksIDApOwotCWlmICghdWlkX3ZhbGlkKHJvb3RfdWlkKSB8fCAhZ2lkX3ZhbGlkKHJvb3RfZ2lkKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJa3VpZF90IHB0bXhfdWlkID0gY3VycmVudF9mc3VpZCgpOworCWtnaWRfdCBwdG14X2dpZCA9IGN1cnJlbnRfZnNnaWQoKTsKIAogCWlub2RlX2xvY2soZF9pbm9kZShyb290KSk7CiAKQEAgLTMwOSw4ICszMDQsOCBAQAogCiAJbW9kZSA9IFNfSUZDSFJ8b3B0cy0+cHRteG1vZGU7CiAJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBtb2RlLCBNS0RFVihUVFlBVVhfTUFKT1IsIDIpKTsKLQlpbm9kZS0+aV91aWQgPSByb290X3VpZDsKLQlpbm9kZS0+aV9naWQgPSByb290X2dpZDsKKwlpbm9kZS0+aV91aWQgPSBwdG14X3VpZDsKKwlpbm9kZS0+aV9naWQgPSBwdG14X2dpZDsKIAogCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwogCkBAIC0zMzYsNyArMzMxLDYgQEAKIAlzdHJ1Y3QgcHRzX2ZzX2luZm8gKmZzaSA9IERFVlBUU19TQihzYik7CiAJc3RydWN0IHB0c19tb3VudF9vcHRzICpvcHRzID0gJmZzaS0+bW91bnRfb3B0czsKIAotCXN5bmNfZmlsZXN5c3RlbShzYik7CiAJZXJyID0gcGFyc2VfbW91bnRfb3B0aW9ucyhkYXRhLCBQQVJTRV9SRU1PVU5ULCBvcHRzKTsKIAogCS8qCkBAIC0zOTUsNiArMzg5LDcgQEAKIGRldnB0c19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnJvcjsKIAogCXMtPnNfaWZsYWdzICY9IH5TQl9JX05PREVWOwogCXMtPnNfYmxvY2tzaXplID0gMTAyNDsKQEAgLTQwMywxMCArMzk4LDE2IEBACiAJcy0+c19vcCA9ICZkZXZwdHNfc29wczsKIAlzLT5zX3RpbWVfZ3JhbiA9IDE7CiAKKwllcnJvciA9IC1FTk9NRU07CiAJcy0+c19mc19pbmZvID0gbmV3X3B0c19mc19pbmZvKHMpOwogCWlmICghcy0+c19mc19pbmZvKQogCQlnb3RvIGZhaWw7CiAKKwllcnJvciA9IHBhcnNlX21vdW50X29wdGlvbnMoZGF0YSwgUEFSU0VfTU9VTlQsICZERVZQVFNfU0IocyktPm1vdW50X29wdHMpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsOworCisJZXJyb3IgPSAtRU5PTUVNOwogCWlub2RlID0gbmV3X2lub2RlKHMpOwogCWlmICghaW5vZGUpCiAJCWdvdG8gZmFpbDsKQEAgLTQxOCwxMyArNDE5LDIxIEBACiAJc2V0X25saW5rKGlub2RlLCAyKTsKIAogCXMtPnNfcm9vdCA9IGRfbWFrZV9yb290KGlub2RlKTsKLQlpZiAocy0+c19yb290KQotCQlyZXR1cm4gMDsKKwlpZiAoIXMtPnNfcm9vdCkgeworCQlwcl9lcnIoImdldCByb290IGRlbnRyeSBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWw7CisJfQogCi0JcHJfZXJyKCJnZXQgcm9vdCBkZW50cnkgZmFpbGVkXG4iKTsKKwllcnJvciA9IG1rbm9kX3B0bXgocyk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWxfZHB1dDsKIAorCXJldHVybiAwOworZmFpbF9kcHV0OgorCWRwdXQocy0+c19yb290KTsKKwlzLT5zX3Jvb3QgPSBOVUxMOwogZmFpbDoKLQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qCkBAIC00MzYsNDMgKzQ0NSwxNSBAQAogc3RhdGljIHN0cnVjdCBkZW50cnkgKmRldnB0c19tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKIAlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQogewotCWludCBlcnJvcjsKLQlzdHJ1Y3QgcHRzX21vdW50X29wdHMgb3B0czsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnM7Ci0KLQllcnJvciA9IHBhcnNlX21vdW50X29wdGlvbnMoZGF0YSwgUEFSU0VfTU9VTlQsICZvcHRzKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBFUlJfUFRSKGVycm9yKTsKLQotCXMgPSBzZ2V0KGZzX3R5cGUsIE5VTEwsIHNldF9hbm9uX3N1cGVyLCBmbGFncywgTlVMTCk7Ci0JaWYgKElTX0VSUihzKSkKLQkJcmV0dXJuIEVSUl9DQVNUKHMpOwotCi0JaWYgKCFzLT5zX3Jvb3QpIHsKLQkJZXJyb3IgPSBkZXZwdHNfZmlsbF9zdXBlcihzLCBkYXRhLCBmbGFncyAmIE1TX1NJTEVOVCA/IDEgOiAwKTsKLQkJaWYgKGVycm9yKQotCQkJZ290byBvdXRfdW5kb19zZ2V0OwotCQlzLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKLQl9Ci0KLQltZW1jcHkoJihERVZQVFNfU0IocykpLT5tb3VudF9vcHRzLCAmb3B0cywgc2l6ZW9mKG9wdHMpKTsKLQotCWVycm9yID0gbWtub2RfcHRteChzKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0X3VuZG9fc2dldDsKLQotCXJldHVybiBkZ2V0KHMtPnNfcm9vdCk7Ci0KLW91dF91bmRvX3NnZXQ6Ci0JZGVhY3RpdmF0ZV9sb2NrZWRfc3VwZXIocyk7Ci0JcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCXJldHVybiBtb3VudF9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgZGV2cHRzX2ZpbGxfc3VwZXIpOwogfQogCiBzdGF0aWMgdm9pZCBkZXZwdHNfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBwdHNfZnNfaW5mbyAqZnNpID0gREVWUFRTX1NCKHNiKTsKIAotCWlkYV9kZXN0cm95KCZmc2ktPmFsbG9jYXRlZF9wdHlzKTsKKwlpZiAoZnNpKQorCQlpZGFfZGVzdHJveSgmZnNpLT5hbGxvY2F0ZWRfcHR5cyk7CiAJa2ZyZWUoZnNpKTsKIAlraWxsX2xpdHRlcl9zdXBlcihzYik7CiB9CkBAIC01ODUsNyArNTY2LDggQEAKICAqLwogdm9pZCAqZGV2cHRzX2dldF9wcml2KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKLQlXQVJOX09OX09OQ0UoZGVudHJ5LT5kX3NiLT5zX21hZ2ljICE9IERFVlBUU19TVVBFUl9NQUdJQyk7CisJaWYgKGRlbnRyeS0+ZF9zYi0+c19tYWdpYyAhPSBERVZQVFNfU1VQRVJfTUFHSUMpCisJCXJldHVybiBOVUxMOwogCXJldHVybiBkZW50cnktPmRfZnNkYXRhOwogfQogCmRpZmYgLS1naXQgYS9mcy9kbG0vZGVidWdfZnMuYyBiL2ZzL2RsbS9kZWJ1Z19mcy5jCmluZGV4IGVlYTY0OTEuLjQ2NmY3ZDYgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9kZWJ1Z19mcy5jCisrKyBiL2ZzL2RsbS9kZWJ1Z19mcy5jCkBAIC02MDcsMjAgKzYwNyw1NCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9ybWF0M19mb3BzOwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9ybWF0NF9mb3BzOwogCi1zdGF0aWMgaW50IHRhYmxlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IHRhYmxlX29wZW4xKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBzZXFfZmlsZSAqc2VxOwotCWludCByZXQgPSAtMTsKKwlpbnQgcmV0OwogCi0JaWYgKGZpbGUtPmZfb3AgPT0gJmZvcm1hdDFfZm9wcykKLQkJcmV0ID0gc2VxX29wZW4oZmlsZSwgJmZvcm1hdDFfc2VxX29wcyk7Ci0JZWxzZSBpZiAoZmlsZS0+Zl9vcCA9PSAmZm9ybWF0Ml9mb3BzKQotCQlyZXQgPSBzZXFfb3BlbihmaWxlLCAmZm9ybWF0Ml9zZXFfb3BzKTsKLQllbHNlIGlmIChmaWxlLT5mX29wID09ICZmb3JtYXQzX2ZvcHMpCi0JCXJldCA9IHNlcV9vcGVuKGZpbGUsICZmb3JtYXQzX3NlcV9vcHMpOwotCWVsc2UgaWYgKGZpbGUtPmZfb3AgPT0gJmZvcm1hdDRfZm9wcykKLQkJcmV0ID0gc2VxX29wZW4oZmlsZSwgJmZvcm1hdDRfc2VxX29wcyk7CisJcmV0ID0gc2VxX29wZW4oZmlsZSwgJmZvcm1hdDFfc2VxX29wcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAorCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnByaXZhdGUgPSBpbm9kZS0+aV9wcml2YXRlOyAvKiB0aGUgZGxtX2xzICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFibGVfb3BlbjIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJaW50IHJldDsKKworCXJldCA9IHNlcV9vcGVuKGZpbGUsICZmb3JtYXQyX3NlcV9vcHMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2VxLT5wcml2YXRlID0gaW5vZGUtPmlfcHJpdmF0ZTsgLyogdGhlIGRsbV9scyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhYmxlX29wZW4zKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzZXFfZmlsZSAqc2VxOworCWludCByZXQ7CisKKwlyZXQgPSBzZXFfb3BlbihmaWxlLCAmZm9ybWF0M19zZXFfb3BzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNlcS0+cHJpdmF0ZSA9IGlub2RlLT5pX3ByaXZhdGU7IC8qIHRoZSBkbG1fbHMgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YWJsZV9vcGVuNChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlpbnQgcmV0OworCisJcmV0ID0gc2VxX29wZW4oZmlsZSwgJmZvcm1hdDRfc2VxX29wcyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNjMxLDcgKzY2NSw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcm1hdDFfZm9wcyA9IHsKIAkub3duZXIgICA9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgID0gdGFibGVfb3BlbiwKKwkub3BlbiAgICA9IHRhYmxlX29wZW4xLAogCS5yZWFkICAgID0gc2VxX3JlYWQsCiAJLmxsc2VlayAgPSBzZXFfbHNlZWssCiAJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZQpAQCAtNjM5LDcgKzY3Myw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcm1hdDJfZm9wcyA9IHsKIAkub3duZXIgICA9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgID0gdGFibGVfb3BlbiwKKwkub3BlbiAgICA9IHRhYmxlX29wZW4yLAogCS5yZWFkICAgID0gc2VxX3JlYWQsCiAJLmxsc2VlayAgPSBzZXFfbHNlZWssCiAJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZQpAQCAtNjQ3LDcgKzY4MSw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcm1hdDNfZm9wcyA9IHsKIAkub3duZXIgICA9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgID0gdGFibGVfb3BlbiwKKwkub3BlbiAgICA9IHRhYmxlX29wZW4zLAogCS5yZWFkICAgID0gc2VxX3JlYWQsCiAJLmxsc2VlayAgPSBzZXFfbHNlZWssCiAJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZQpAQCAtNjU1LDcgKzY4OSw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcm1hdDRfZm9wcyA9IHsKIAkub3duZXIgICA9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgID0gdGFibGVfb3BlbiwKKwkub3BlbiAgICA9IHRhYmxlX29wZW40LAogCS5yZWFkICAgID0gc2VxX3JlYWQsCiAJLmxsc2VlayAgPSBzZXFfbHNlZWssCiAJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZQpkaWZmIC0tZ2l0IGEvZnMvZWZpdmFyZnMvaW5vZGUuYyBiL2ZzL2VmaXZhcmZzL2lub2RlLmMKaW5kZXggMWQ3M2ZjNi4uY2JiNTBjYSAxMDA2NDQKLS0tIGEvZnMvZWZpdmFyZnMvaW5vZGUuYworKysgYi9mcy9lZml2YXJmcy9pbm9kZS5jCkBAIC0xMDUsNyArMTA1LDEwIEBACiAKIAlpbm9kZS0+aV9wcml2YXRlID0gdmFyOwogCi0JZWZpdmFyX2VudHJ5X2FkZCh2YXIsICZlZml2YXJmc19saXN0KTsKKwllcnIgPSBlZml2YXJfZW50cnlfYWRkKHZhciwgJmVmaXZhcmZzX2xpc3QpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKIAlkZ2V0KGRlbnRyeSk7CiBvdXQ6CmRpZmYgLS1naXQgYS9mcy9lZml2YXJmcy9zdXBlci5jIGIvZnMvZWZpdmFyZnMvc3VwZXIuYwppbmRleCA2ODhjY2MxLi5kN2E3YzUzIDEwMDY0NAotLS0gYS9mcy9lZml2YXJmcy9zdXBlci5jCisrKyBiL2ZzL2VmaXZhcmZzL3N1cGVyLmMKQEAgLTE1NywxMiArMTU3LDE0IEBACiAJCWdvdG8gZmFpbF9pbm9kZTsKIAl9CiAKKwllZml2YXJfZW50cnlfc2l6ZShlbnRyeSwgJnNpemUpOworCWVyciA9IGVmaXZhcl9lbnRyeV9hZGQoZW50cnksICZlZml2YXJmc19saXN0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxfaW5vZGU7CisKIAkvKiBjb3BpZWQgYnkgdGhlIGFib3ZlIHRvIGxvY2FsIHN0b3JhZ2UgaW4gdGhlIGRlbnRyeS4gKi8KIAlrZnJlZShuYW1lKTsKIAotCWVmaXZhcl9lbnRyeV9zaXplKGVudHJ5LCAmc2l6ZSk7Ci0JZWZpdmFyX2VudHJ5X2FkZChlbnRyeSwgJmVmaXZhcmZzX2xpc3QpOwotCiAJaW5vZGVfbG9jayhpbm9kZSk7CiAJaW5vZGUtPmlfcHJpdmF0ZSA9IGVudHJ5OwogCWlfc2l6ZV93cml0ZShpbm9kZSwgc2l6ZSArIHNpemVvZihlbnRyeS0+dmFyLkF0dHJpYnV0ZXMpKTsKQEAgLTE4Miw3ICsxODQsMTAgQEAKIAogc3RhdGljIGludCBlZml2YXJmc19kZXN0cm95KHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5LCB2b2lkICpkYXRhKQogewotCWVmaXZhcl9lbnRyeV9yZW1vdmUoZW50cnkpOworCWludCBlcnIgPSBlZml2YXJfZW50cnlfcmVtb3ZlKGVudHJ5KTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAJa2ZyZWUoZW50cnkpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9pYWxsb2MuYyBiL2ZzL2V4dDIvaWFsbG9jLmMKaW5kZXggZWZlNWZiMi4uMDRlNzNhOSAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9pYWxsb2MuYworKysgYi9mcy9leHQyL2lhbGxvYy5jCkBAIC00NjUsNiArNDY1LDExIEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgc2JpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CiAJCWdkcCA9IGV4dDJfZ2V0X2dyb3VwX2Rlc2Moc2IsIGdyb3VwLCAmYmgyKTsKKwkJaWYgKCFnZHApIHsKKwkJCWlmICgrK2dyb3VwID09IHNiaS0+c19ncm91cHNfY291bnQpCisJCQkJZ3JvdXAgPSAwOworCQkJY29udGludWU7CisJCX0KIAkJYnJlbHNlKGJpdG1hcF9iaCk7CiAJCWJpdG1hcF9iaCA9IHJlYWRfaW5vZGVfYml0bWFwKHNiLCBncm91cCk7CiAJCWlmICghYml0bWFwX2JoKSB7CmRpZmYgLS1naXQgYS9mcy9leHQyL2lub2RlLmMgYi9mcy9leHQyL2lub2RlLmMKaW5kZXggYzdkYmI0Ni4uMWU3MmQ0MiAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9pbm9kZS5jCisrKyBiL2ZzL2V4dDIvaW5vZGUuYwpAQCAtNzMyLDYgKzczMiwxNiBAQAogCX0KIAogCWlmIChJU19EQVgoaW5vZGUpKSB7CisJCWludCBpOworCisJCS8qCisJCSAqIFdlIG11c3QgdW5tYXAgYmxvY2tzIGJlZm9yZSB6ZXJvaW5nIHNvIHRoYXQgd3JpdGViYWNrIGNhbm5vdAorCQkgKiBvdmVyd3JpdGUgemVyb3Mgd2l0aCBzdGFsZSBkYXRhIGZyb20gYmxvY2sgZGV2aWNlIHBhZ2UgY2FjaGUuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJdW5tYXBfdW5kZXJseWluZ19tZXRhZGF0YShpbm9kZS0+aV9zYi0+c19iZGV2LAorCQkJCQlsZTMyX3RvX2NwdShjaGFpbltkZXB0aC0xXS5rZXkpICsgaSk7CisJCX0KIAkJLyoKIAkJICogYmxvY2sgbXVzdCBiZSBpbml0aWFsaXNlZCBiZWZvcmUgd2UgcHV0IGl0IGluIHRoZSB0cmVlCiAJCSAqIHNvIHRoYXQgaXQncyBub3QgZm91bmQgYnkgYW5vdGhlciB0aHJlYWQgYmVmb3JlIGl0J3MKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW5vZGUuYyBiL2ZzL2V4dDQvaW5vZGUuYwppbmRleCAzMTMxNzQ3Li5jNmVhMjVhIDEwMDY0NAotLS0gYS9mcy9leHQ0L2lub2RlLmMKKysrIGIvZnMvZXh0NC9pbm9kZS5jCkBAIC01NDY2LDggKzU0NjYsNiBAQAogCQkJCQkJICAgICAgc2JpLT5zX3dhbnRfZXh0cmFfaXNpemUsCiAJCQkJCQkgICAgICBpbG9jLCBoYW5kbGUpOwogCQkJaWYgKHJldCkgewotCQkJCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLAotCQkJCQkJICAgICBFWFQ0X1NUQVRFX05PX0VYUEFORCk7CiAJCQkJaWYgKG1udF9jb3VudCAhPQogCQkJCQlsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfbW50X2NvdW50KSkgewogCQkJCQlleHQ0X3dhcm5pbmcoaW5vZGUtPmlfc2IsCmRpZmYgLS1naXQgYS9mcy9leHQ0L2lvY3RsLmMgYi9mcy9leHQ0L2lvY3RsLmMKaW5kZXggMTA2ODZmZC4uMWJiN2RmNSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pb2N0bC5jCisrKyBiL2ZzL2V4dDQvaW9jdGwuYwpAQCAtNzc2LDcgKzc3Niw3IEBACiAJCQkJICAgKHN0cnVjdCBmc2NyeXB0X3BvbGljeSBfX3VzZXIgKilhcmcsCiAJCQkJICAgc2l6ZW9mKHBvbGljeSkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiBmc2NyeXB0X3Byb2Nlc3NfcG9saWN5KGlub2RlLCAmcG9saWN5KTsKKwkJcmV0dXJuIGZzY3J5cHRfcHJvY2Vzc19wb2xpY3koZmlscCwgJnBvbGljeSk7CiAjZWxzZQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvc3VwZXIuYyBiL2ZzL2V4dDQvc3VwZXIuYwppbmRleCAxYzU5M2FhLi4zZWM4NzA4IDEwMDY0NAotLS0gYS9mcy9leHQ0L3N1cGVyLmMKKysrIGIvZnMvZXh0NC9zdXBlci5jCkBAIC0yMjExLDYgKzIyMTEsNyBAQAogCiAvKiBDYWxsZWQgYXQgbW91bnQtdGltZSwgc3VwZXItYmxvY2sgaXMgbG9ja2VkICovCiBzdGF0aWMgaW50IGV4dDRfY2hlY2tfZGVzY3JpcHRvcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgIGV4dDRfZnNibGtfdCBzYl9ibG9jaywKIAkJCQkgIGV4dDRfZ3JvdXBfdCAqZmlyc3Rfbm90X3plcm9lZCkKIHsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKQEAgLTIyNDEsNiArMjI0MiwxMSBAQAogCQkJZ3JwID0gaTsKIAogCQlibG9ja19iaXRtYXAgPSBleHQ0X2Jsb2NrX2JpdG1hcChzYiwgZ2RwKTsKKwkJaWYgKGJsb2NrX2JpdG1hcCA9PSBzYl9ibG9jaykgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiZXh0NF9jaGVja19kZXNjcmlwdG9yczogIgorCQkJCSAiQmxvY2sgYml0bWFwIGZvciBncm91cCAldSBvdmVybGFwcyAiCisJCQkJICJzdXBlcmJsb2NrIiwgaSk7CisJCX0KIAkJaWYgKGJsb2NrX2JpdG1hcCA8IGZpcnN0X2Jsb2NrIHx8IGJsb2NrX2JpdG1hcCA+IGxhc3RfYmxvY2spIHsKIAkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImV4dDRfY2hlY2tfZGVzY3JpcHRvcnM6ICIKIAkJCSAgICAgICAiQmxvY2sgYml0bWFwIGZvciBncm91cCAldSBub3QgaW4gZ3JvdXAgIgpAQCAtMjI0OCw2ICsyMjU0LDExIEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCQlpbm9kZV9iaXRtYXAgPSBleHQ0X2lub2RlX2JpdG1hcChzYiwgZ2RwKTsKKwkJaWYgKGlub2RlX2JpdG1hcCA9PSBzYl9ibG9jaykgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiZXh0NF9jaGVja19kZXNjcmlwdG9yczogIgorCQkJCSAiSW5vZGUgYml0bWFwIGZvciBncm91cCAldSBvdmVybGFwcyAiCisJCQkJICJzdXBlcmJsb2NrIiwgaSk7CisJCX0KIAkJaWYgKGlub2RlX2JpdG1hcCA8IGZpcnN0X2Jsb2NrIHx8IGlub2RlX2JpdG1hcCA+IGxhc3RfYmxvY2spIHsKIAkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImV4dDRfY2hlY2tfZGVzY3JpcHRvcnM6ICIKIAkJCSAgICAgICAiSW5vZGUgYml0bWFwIGZvciBncm91cCAldSBub3QgaW4gZ3JvdXAgIgpAQCAtMjI1NSw2ICsyMjY2LDExIEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCQlpbm9kZV90YWJsZSA9IGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCk7CisJCWlmIChpbm9kZV90YWJsZSA9PSBzYl9ibG9jaykgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiZXh0NF9jaGVja19kZXNjcmlwdG9yczogIgorCQkJCSAiSW5vZGUgdGFibGUgZm9yIGdyb3VwICV1IG92ZXJsYXBzICIKKwkJCQkgInN1cGVyYmxvY2siLCBpKTsKKwkJfQogCQlpZiAoaW5vZGVfdGFibGUgPCBmaXJzdF9ibG9jayB8fAogCQkgICAgaW5vZGVfdGFibGUgKyBzYmktPnNfaXRiX3Blcl9ncm91cCAtIDEgPiBsYXN0X2Jsb2NrKSB7CiAJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzOiAiCkBAIC0zNzU3LDcgKzM3NzMsNyBAQAogCQkJZ290byBmYWlsZWRfbW91bnQyOwogCQl9CiAJfQotCWlmICghZXh0NF9jaGVja19kZXNjcmlwdG9ycyhzYiwgJmZpcnN0X25vdF96ZXJvZWQpKSB7CisJaWYgKCFleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzKHNiLCBsb2dpY2FsX3NiX2Jsb2NrLCAmZmlyc3Rfbm90X3plcm9lZCkpIHsKIAkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiZ3JvdXAgZGVzY3JpcHRvcnMgY29ycnVwdGVkISIpOwogCQlyZXQgPSAtRUZTQ09SUlVQVEVEOwogCQlnb3RvIGZhaWxlZF9tb3VudDI7CmRpZmYgLS1naXQgYS9mcy9leHQ0L3hhdHRyLmMgYi9mcy9leHQ0L3hhdHRyLmMKaW5kZXggMzllOWNmYi4uMmViOTM1YyAxMDA2NDQKLS0tIGEvZnMvZXh0NC94YXR0ci5jCisrKyBiL2ZzL2V4dDQveGF0dHIuYwpAQCAtMTM1MywxNSArMTM1MywxOSBAQAogCXNpemVfdCBtaW5fb2ZmcywgZnJlZTsKIAlpbnQgdG90YWxfaW5vOwogCXZvaWQgKmJhc2UsICpzdGFydCwgKmVuZDsKLQlpbnQgZXh0cmFfaXNpemUgPSAwLCBlcnJvciA9IDAsIHRyaWVkX21pbl9leHRyYV9pc2l6ZSA9IDA7CisJaW50IGVycm9yID0gMCwgdHJpZWRfbWluX2V4dHJhX2lzaXplID0gMDsKIAlpbnQgc19taW5fZXh0cmFfaXNpemUgPSBsZTE2X3RvX2NwdShFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19lcy0+c19taW5fZXh0cmFfaXNpemUpOworCWludCBpc2l6ZV9kaWZmOwkvKiBIb3cgbXVjaCBkbyB3ZSBuZWVkIHRvIGdyb3cgaV9leHRyYV9pc2l6ZSAqLwogCiAJZG93bl93cml0ZSgmRVhUNF9JKGlub2RlKS0+eGF0dHJfc2VtKTsKKwkvKgorCSAqIFNldCBFWFQ0X1NUQVRFX05PX0VYUEFORCB0byBhdm9pZCByZWN1cnNpb24gd2hlbiBtYXJraW5nIGlub2RlIGRpcnR5CisJICovCisJZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTk9fRVhQQU5EKTsKIHJldHJ5OgotCWlmIChFWFQ0X0koaW5vZGUpLT5pX2V4dHJhX2lzaXplID49IG5ld19leHRyYV9pc2l6ZSkgewotCQl1cF93cml0ZSgmRVhUNF9JKGlub2RlKS0+eGF0dHJfc2VtKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWlzaXplX2RpZmYgPSBuZXdfZXh0cmFfaXNpemUgLSBFWFQ0X0koaW5vZGUpLT5pX2V4dHJhX2lzaXplOworCWlmIChFWFQ0X0koaW5vZGUpLT5pX2V4dHJhX2lzaXplID49IG5ld19leHRyYV9pc2l6ZSkKKwkJZ290byBvdXQ7CiAKIAloZWFkZXIgPSBJSERSKGlub2RlLCByYXdfaW5vZGUpOwogCWVudHJ5ID0gSUZJUlNUKGhlYWRlcik7CkBAIC0xMzgyLDcgKzEzODYsNyBAQAogCQlnb3RvIGNsZWFudXA7CiAKIAlmcmVlID0gZXh0NF94YXR0cl9mcmVlX3NwYWNlKGxhc3QsICZtaW5fb2ZmcywgYmFzZSwgJnRvdGFsX2lubyk7Ci0JaWYgKGZyZWUgPj0gbmV3X2V4dHJhX2lzaXplKSB7CisJaWYgKGZyZWUgPj0gaXNpemVfZGlmZikgewogCQllbnRyeSA9IElGSVJTVChoZWFkZXIpOwogCQlleHQ0X3hhdHRyX3NoaWZ0X2VudHJpZXMoZW50cnksCUVYVDRfSShpbm9kZSktPmlfZXh0cmFfaXNpemUKIAkJCQktIG5ld19leHRyYV9pc2l6ZSwgKHZvaWQgKilyYXdfaW5vZGUgKwpAQCAtMTM5MCw4ICsxMzk0LDcgQEAKIAkJCQkodm9pZCAqKWhlYWRlciwgdG90YWxfaW5vLAogCQkJCWlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CiAJCUVYVDRfSShpbm9kZSktPmlfZXh0cmFfaXNpemUgPSBuZXdfZXh0cmFfaXNpemU7Ci0JCWVycm9yID0gMDsKLQkJZ290byBjbGVhbnVwOworCQlnb3RvIG91dDsKIAl9CiAKIAkvKgpAQCAtMTQxNCw3ICsxNDE3LDcgQEAKIAkJZW5kID0gYmgtPmJfZGF0YSArIGJoLT5iX3NpemU7CiAJCW1pbl9vZmZzID0gZW5kIC0gYmFzZTsKIAkJZnJlZSA9IGV4dDRfeGF0dHJfZnJlZV9zcGFjZShmaXJzdCwgJm1pbl9vZmZzLCBiYXNlLCBOVUxMKTsKLQkJaWYgKGZyZWUgPCBuZXdfZXh0cmFfaXNpemUpIHsKKwkJaWYgKGZyZWUgPCBpc2l6ZV9kaWZmKSB7CiAJCQlpZiAoIXRyaWVkX21pbl9leHRyYV9pc2l6ZSAmJiBzX21pbl9leHRyYV9pc2l6ZSkgewogCQkJCXRyaWVkX21pbl9leHRyYV9pc2l6ZSsrOwogCQkJCW5ld19leHRyYV9pc2l6ZSA9IHNfbWluX2V4dHJhX2lzaXplOwpAQCAtMTQyOCw3ICsxNDMxLDcgQEAKIAkJZnJlZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKIAl9CiAKLQl3aGlsZSAobmV3X2V4dHJhX2lzaXplID4gMCkgeworCXdoaWxlIChpc2l6ZV9kaWZmID4gMCkgewogCQlzaXplX3Qgb2Zmcywgc2l6ZSwgZW50cnlfc2l6ZTsKIAkJc3RydWN0IGV4dDRfeGF0dHJfZW50cnkgKnNtYWxsX2VudHJ5ID0gTlVMTDsKIAkJc3RydWN0IGV4dDRfeGF0dHJfaW5mbyBpID0gewpAQCAtMTQ1OSw3ICsxNDYyLDcgQEAKIAkJCUVYVDRfWEFUVFJfU0laRShsZTMyX3RvX2NwdShsYXN0LT5lX3ZhbHVlX3NpemUpKSArCiAJCQkJCUVYVDRfWEFUVFJfTEVOKGxhc3QtPmVfbmFtZV9sZW4pOwogCQkJaWYgKHRvdGFsX3NpemUgPD0gZnJlZSAmJiB0b3RhbF9zaXplIDwgbWluX3RvdGFsX3NpemUpIHsKLQkJCQlpZiAodG90YWxfc2l6ZSA8IG5ld19leHRyYV9pc2l6ZSkgeworCQkJCWlmICh0b3RhbF9zaXplIDwgaXNpemVfZGlmZikgewogCQkJCQlzbWFsbF9lbnRyeSA9IGxhc3Q7CiAJCQkJfSBlbHNlIHsKIAkJCQkJZW50cnkgPSBsYXN0OwpAQCAtMTUxNCwyMiArMTUxNywyMiBAQAogCQllcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsICZpLCBpcyk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gY2xlYW51cDsKKwkJdG90YWxfaW5vIC09IGVudHJ5X3NpemU7CiAKIAkJZW50cnkgPSBJRklSU1QoaGVhZGVyKTsKLQkJaWYgKGVudHJ5X3NpemUgKyBFWFQ0X1hBVFRSX1NJWkUoc2l6ZSkgPj0gbmV3X2V4dHJhX2lzaXplKQotCQkJc2hpZnRfYnl0ZXMgPSBuZXdfZXh0cmFfaXNpemU7CisJCWlmIChlbnRyeV9zaXplICsgRVhUNF9YQVRUUl9TSVpFKHNpemUpID49IGlzaXplX2RpZmYpCisJCQlzaGlmdF9ieXRlcyA9IGlzaXplX2RpZmY7CiAJCWVsc2UKLQkJCXNoaWZ0X2J5dGVzID0gZW50cnlfc2l6ZSArIHNpemU7CisJCQlzaGlmdF9ieXRlcyA9IGVudHJ5X3NpemUgKyBFWFQ0X1hBVFRSX1NJWkUoc2l6ZSk7CiAJCS8qIEFkanVzdCB0aGUgb2Zmc2V0cyBhbmQgc2hpZnQgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGFoZWFkICovCi0JCWV4dDRfeGF0dHJfc2hpZnRfZW50cmllcyhlbnRyeSwgRVhUNF9JKGlub2RlKS0+aV9leHRyYV9pc2l6ZSAtCi0JCQlzaGlmdF9ieXRlcywgKHZvaWQgKilyYXdfaW5vZGUgKwotCQkJRVhUNF9HT09EX09MRF9JTk9ERV9TSVpFICsgZXh0cmFfaXNpemUgKyBzaGlmdF9ieXRlcywKLQkJCSh2b2lkICopaGVhZGVyLCB0b3RhbF9pbm8gLSBlbnRyeV9zaXplLAotCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwkJZXh0NF94YXR0cl9zaGlmdF9lbnRyaWVzKGVudHJ5LCAtc2hpZnRfYnl0ZXMsCisJCQkodm9pZCAqKXJhd19pbm9kZSArIEVYVDRfR09PRF9PTERfSU5PREVfU0laRSArCisJCQlFWFQ0X0koaW5vZGUpLT5pX2V4dHJhX2lzaXplICsgc2hpZnRfYnl0ZXMsCisJCQkodm9pZCAqKWhlYWRlciwgdG90YWxfaW5vLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwogCi0JCWV4dHJhX2lzaXplICs9IHNoaWZ0X2J5dGVzOwotCQluZXdfZXh0cmFfaXNpemUgLT0gc2hpZnRfYnl0ZXM7Ci0JCUVYVDRfSShpbm9kZSktPmlfZXh0cmFfaXNpemUgPSBleHRyYV9pc2l6ZTsKKwkJaXNpemVfZGlmZiAtPSBzaGlmdF9ieXRlczsKKwkJRVhUNF9JKGlub2RlKS0+aV9leHRyYV9pc2l6ZSArPSBzaGlmdF9ieXRlczsKKwkJaGVhZGVyID0gSUhEUihpbm9kZSwgcmF3X2lub2RlKTsKIAogCQlpLm5hbWUgPSBiX2VudHJ5X25hbWU7CiAJCWkudmFsdWUgPSBidWZmZXI7CkBAIC0xNTUxLDYgKzE1NTQsOCBAQAogCQlrZnJlZShicyk7CiAJfQogCWJyZWxzZShiaCk7CitvdXQ6CisJZXh0NF9jbGVhcl9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9OT19FWFBBTkQpOwogCXVwX3dyaXRlKCZFWFQ0X0koaW5vZGUpLT54YXR0cl9zZW0pOwogCXJldHVybiAwOwogCkBAIC0xNTYyLDYgKzE1NjcsMTAgQEAKIAlrZnJlZShpcyk7CiAJa2ZyZWUoYnMpOwogCWJyZWxzZShiaCk7CisJLyoKKwkgKiBXZSBkZWxpYmVyYXRlbHkgbGVhdmUgRVhUNF9TVEFURV9OT19FWFBBTkQgc2V0IGhlcmUgc2luY2UgaW5vZGUKKwkgKiBzaXplIGV4cGFuc2lvbiBmYWlsZWQuCisJICovCiAJdXBfd3JpdGUoJkVYVDRfSShpbm9kZSktPnhhdHRyX3NlbSk7CiAJcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC94YXR0ci5oIGIvZnMvZXh0NC94YXR0ci5oCmluZGV4IDY5ZGQzZTYuLmE5MmU3ODMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQveGF0dHIuaAorKysgYi9mcy9leHQ0L3hhdHRyLmgKQEAgLTI0LDYgKzI0LDcgQEAKICNkZWZpbmUgRVhUNF9YQVRUUl9JTkRFWF9TWVNURU0JCQk3CiAjZGVmaW5lIEVYVDRfWEFUVFJfSU5ERVhfUklDSEFDTAkJOAogI2RlZmluZSBFWFQ0X1hBVFRSX0lOREVYX0VOQ1JZUFRJT04JCTkKKyNkZWZpbmUgRVhUNF9YQVRUUl9JTkRFWF9IVVJECQkJMTAgLyogUmVzZXJ2ZWQgZm9yIEh1cmQgKi8KIAogc3RydWN0IGV4dDRfeGF0dHJfaGVhZGVyIHsKIAlfX2xlMzIJaF9tYWdpYzsJLyogbWFnaWMgbnVtYmVyIGZvciBpZGVudGlmaWNhdGlvbiAqLwpkaWZmIC0tZ2l0IGEvZnMvZjJmcy9kYXRhLmMgYi9mcy9mMmZzL2RhdGEuYwppbmRleCBkNjRkMmE1Li5jY2I0MDFlIDEwMDY0NAotLS0gYS9mcy9mMmZzL2RhdGEuYworKysgYi9mcy9mMmZzL2RhdGEuYwpAQCAtMTY5OSwxMSArMTY5OSwxMSBAQAogCXRyYWNlX2YyZnNfd3JpdGVfZW5kKGlub2RlLCBwb3MsIGxlbiwgY29waWVkKTsKIAogCXNldF9wYWdlX2RpcnR5KHBhZ2UpOwotCWYyZnNfcHV0X3BhZ2UocGFnZSwgMSk7CiAKIAlpZiAocG9zICsgY29waWVkID4gaV9zaXplX3JlYWQoaW5vZGUpKQogCQlmMmZzX2lfc2l6ZV93cml0ZShpbm9kZSwgcG9zICsgY29waWVkKTsKIAorCWYyZnNfcHV0X3BhZ2UocGFnZSwgMSk7CiAJZjJmc191cGRhdGVfdGltZShGMkZTX0lfU0IoaW5vZGUpLCBSRVFfVElNRSk7CiAJcmV0dXJuIGNvcGllZDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2YyZnMvZjJmcy5oIGIvZnMvZjJmcy9mMmZzLmgKaW5kZXggNjc1ZmE3OS4uMTRmNWZlMiAxMDA2NDQKLS0tIGEvZnMvZjJmcy9mMmZzLmgKKysrIGIvZnMvZjJmcy9mMmZzLmgKQEAgLTUzOCw3ICs1MzgsNyBAQAogCS8qIE5BVCBjYWNoZSBtYW5hZ2VtZW50ICovCiAJc3RydWN0IHJhZGl4X3RyZWVfcm9vdCBuYXRfcm9vdDsvKiByb290IG9mIHRoZSBuYXQgZW50cnkgY2FjaGUgKi8KIAlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290IG5hdF9zZXRfcm9vdDsvKiByb290IG9mIHRoZSBuYXQgc2V0IGNhY2hlICovCi0Jc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgbmF0X3RyZWVfbG9jazsJLyogcHJvdGVjdCBuYXRfdHJlZV9sb2NrICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZSBuYXRfdHJlZV9sb2NrOwkvKiBwcm90ZWN0IG5hdF90cmVlX2xvY2sgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIG5hdF9lbnRyaWVzOwkvKiBjYWNoZWQgbmF0IGVudHJ5IGxpc3QgKGNsZWFuKSAqLwogCXVuc2lnbmVkIGludCBuYXRfY250OwkJLyogdGhlICMgb2YgY2FjaGVkIG5hdCBlbnRyaWVzICovCiAJdW5zaWduZWQgaW50IGRpcnR5X25hdF9jbnQ7CS8qIHRvdGFsIG51bSBvZiBuYXQgZW50cmllcyBpbiBzZXQgKi8KQEAgLTc4Nyw3ICs3ODcsNyBAQAogCXN0cnVjdCBmMmZzX2NoZWNrcG9pbnQgKmNrcHQ7CQkvKiByYXcgY2hlY2twb2ludCBwb2ludGVyICovCiAJc3RydWN0IGlub2RlICptZXRhX2lub2RlOwkJLyogY2FjaGUgbWV0YSBibG9ja3MgKi8KIAlzdHJ1Y3QgbXV0ZXggY3BfbXV0ZXg7CQkJLyogY2hlY2twb2ludCBwcm9jZWR1cmUgbG9jayAqLwotCXN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlIGNwX3J3c2VtOwkJLyogYmxvY2tpbmcgRlMgb3BlcmF0aW9ucyAqLworCXN0cnVjdCByd19zZW1hcGhvcmUgY3BfcndzZW07CQkvKiBibG9ja2luZyBGUyBvcGVyYXRpb25zICovCiAJc3RydWN0IHJ3X3NlbWFwaG9yZSBub2RlX3dyaXRlOwkJLyogbG9ja2luZyBub2RlIHdyaXRlcyAqLwogCXdhaXRfcXVldWVfaGVhZF90IGNwX3dhaXQ7CiAJdW5zaWduZWQgbG9uZyBsYXN0X3RpbWVbTUFYX1RJTUVdOwkvKiB0byBzdG9yZSB0aW1lIGluIGppZmZpZXMgKi8KQEAgLTEwNzQsMjIgKzEwNzQsMjIgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGYyZnNfbG9ja19vcChzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmkpCiB7Ci0JcGVyY3B1X2Rvd25fcmVhZCgmc2JpLT5jcF9yd3NlbSk7CisJZG93bl9yZWFkKCZzYmktPmNwX3J3c2VtKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGYyZnNfdW5sb2NrX29wKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSkKIHsKLQlwZXJjcHVfdXBfcmVhZCgmc2JpLT5jcF9yd3NlbSk7CisJdXBfcmVhZCgmc2JpLT5jcF9yd3NlbSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmMmZzX2xvY2tfYWxsKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSkKIHsKLQlwZXJjcHVfZG93bl93cml0ZSgmc2JpLT5jcF9yd3NlbSk7CisJZG93bl93cml0ZSgmc2JpLT5jcF9yd3NlbSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmMmZzX3VubG9ja19hbGwoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpKQogewotCXBlcmNwdV91cF93cml0ZSgmc2JpLT5jcF9yd3NlbSk7CisJdXBfd3JpdGUoJnNiaS0+Y3BfcndzZW0pOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBfX2dldF9jcF9yZWFzb24oc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpKQpkaWZmIC0tZ2l0IGEvZnMvZjJmcy9maWxlLmMgYi9mcy9mMmZzL2ZpbGUuYwppbmRleCAwZTQ5M2Y2Li4yOGY0ZjRjIDEwMDY0NAotLS0gYS9mcy9mMmZzL2ZpbGUuYworKysgYi9mcy9mMmZzL2ZpbGUuYwpAQCAtMTc1NywyMSArMTc1NywxNCBAQAogewogCXN0cnVjdCBmc2NyeXB0X3BvbGljeSBwb2xpY3k7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlscCk7Ci0JaW50IHJldDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcG9saWN5LCAoc3RydWN0IGZzY3J5cHRfcG9saWN5IF9fdXNlciAqKWFyZywKIAkJCQkJCQlzaXplb2YocG9saWN5KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcmV0ID0gbW50X3dhbnRfd3JpdGVfZmlsZShmaWxwKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCiAJZjJmc191cGRhdGVfdGltZShGMkZTX0lfU0IoaW5vZGUpLCBSRVFfVElNRSk7Ci0JcmV0ID0gZnNjcnlwdF9wcm9jZXNzX3BvbGljeShpbm9kZSwgJnBvbGljeSk7CiAKLQltbnRfZHJvcF93cml0ZV9maWxlKGZpbHApOwotCXJldHVybiByZXQ7CisJcmV0dXJuIGZzY3J5cHRfcHJvY2Vzc19wb2xpY3koZmlscCwgJnBvbGljeSk7CiB9CiAKIHN0YXRpYyBpbnQgZjJmc19pb2NfZ2V0X2VuY3J5cHRpb25fcG9saWN5KHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIGFyZykKQEAgLTIwODYsMTUgKzIwNzksMTkgQEAKIAlpZiAodW5saWtlbHkoZjJmc19yZWFkb25seShzcmMtPmlfc2IpKSkKIAkJcmV0dXJuIC1FUk9GUzsKIAotCWlmIChTX0lTRElSKHNyYy0+aV9tb2RlKSB8fCBTX0lTRElSKGRzdC0+aV9tb2RlKSkKLQkJcmV0dXJuIC1FSVNESVI7CisJaWYgKCFTX0lTUkVHKHNyYy0+aV9tb2RlKSB8fCAhU19JU1JFRyhkc3QtPmlfbW9kZSkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGYyZnNfZW5jcnlwdGVkX2lub2RlKHNyYykgfHwgZjJmc19lbmNyeXB0ZWRfaW5vZGUoZHN0KSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJaW5vZGVfbG9jayhzcmMpOwotCWlmIChzcmMgIT0gZHN0KQotCQlpbm9kZV9sb2NrKGRzdCk7CisJaWYgKHNyYyAhPSBkc3QpIHsKKwkJaWYgKCFpbm9kZV90cnlsb2NrKGRzdCkpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQogCiAJcmV0ID0gLUVJTlZBTDsKIAlpZiAocG9zX2luICsgbGVuID4gc3JjLT5pX3NpemUgfHwgcG9zX2luICsgbGVuIDwgcG9zX2luKQpAQCAtMjE1Miw2ICsyMTQ5LDcgQEAKIG91dF91bmxvY2s6CiAJaWYgKHNyYyAhPSBkc3QpCiAJCWlub2RlX3VubG9jayhkc3QpOworb3V0OgogCWlub2RlX3VubG9jayhzcmMpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9mcy9mMmZzL25vZGUuYyBiL2ZzL2YyZnMvbm9kZS5jCmluZGV4IGIyZmE0YjYuLmY3NWQxOTcgMTAwNjQ0Ci0tLSBhL2ZzL2YyZnMvbm9kZS5jCisrKyBiL2ZzL2YyZnMvbm9kZS5jCkBAIC0yMDYsMTQgKzIwNiwxNCBAQAogCXN0cnVjdCBuYXRfZW50cnkgKmU7CiAJYm9vbCBuZWVkID0gZmFsc2U7CiAKLQlwZXJjcHVfZG93bl9yZWFkKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKKwlkb3duX3JlYWQoJm5tX2ktPm5hdF90cmVlX2xvY2spOwogCWUgPSBfX2xvb2t1cF9uYXRfY2FjaGUobm1faSwgbmlkKTsKIAlpZiAoZSkgewogCQlpZiAoIWdldF9uYXRfZmxhZyhlLCBJU19DSEVDS1BPSU5URUQpICYmCiAJCQkJIWdldF9uYXRfZmxhZyhlLCBIQVNfRlNZTkNFRF9JTk9ERSkpCiAJCQluZWVkID0gdHJ1ZTsKIAl9Ci0JcGVyY3B1X3VwX3JlYWQoJm5tX2ktPm5hdF90cmVlX2xvY2spOworCXVwX3JlYWQoJm5tX2ktPm5hdF90cmVlX2xvY2spOwogCXJldHVybiBuZWVkOwogfQogCkBAIC0yMjMsMTEgKzIyMywxMSBAQAogCXN0cnVjdCBuYXRfZW50cnkgKmU7CiAJYm9vbCBpc19jcCA9IHRydWU7CiAKLQlwZXJjcHVfZG93bl9yZWFkKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKKwlkb3duX3JlYWQoJm5tX2ktPm5hdF90cmVlX2xvY2spOwogCWUgPSBfX2xvb2t1cF9uYXRfY2FjaGUobm1faSwgbmlkKTsKIAlpZiAoZSAmJiAhZ2V0X25hdF9mbGFnKGUsIElTX0NIRUNLUE9JTlRFRCkpCiAJCWlzX2NwID0gZmFsc2U7Ci0JcGVyY3B1X3VwX3JlYWQoJm5tX2ktPm5hdF90cmVlX2xvY2spOworCXVwX3JlYWQoJm5tX2ktPm5hdF90cmVlX2xvY2spOwogCXJldHVybiBpc19jcDsKIH0KIApAQCAtMjM3LDEzICsyMzcsMTMgQEAKIAlzdHJ1Y3QgbmF0X2VudHJ5ICplOwogCWJvb2wgbmVlZF91cGRhdGUgPSB0cnVlOwogCi0JcGVyY3B1X2Rvd25fcmVhZCgmbm1faS0+bmF0X3RyZWVfbG9jayk7CisJZG93bl9yZWFkKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKIAllID0gX19sb29rdXBfbmF0X2NhY2hlKG5tX2ksIGlubyk7CiAJaWYgKGUgJiYgZ2V0X25hdF9mbGFnKGUsIEhBU19MQVNUX0ZTWU5DKSAmJgogCQkJKGdldF9uYXRfZmxhZyhlLCBJU19DSEVDS1BPSU5URUQpIHx8CiAJCQkgZ2V0X25hdF9mbGFnKGUsIEhBU19GU1lOQ0VEX0lOT0RFKSkpCiAJCW5lZWRfdXBkYXRlID0gZmFsc2U7Ci0JcGVyY3B1X3VwX3JlYWQoJm5tX2ktPm5hdF90cmVlX2xvY2spOworCXVwX3JlYWQoJm5tX2ktPm5hdF90cmVlX2xvY2spOwogCXJldHVybiBuZWVkX3VwZGF0ZTsKIH0KIApAQCAtMjg0LDcgKzI4NCw3IEBACiAJc3RydWN0IGYyZnNfbm1faW5mbyAqbm1faSA9IE5NX0koc2JpKTsKIAlzdHJ1Y3QgbmF0X2VudHJ5ICplOwogCi0JcGVyY3B1X2Rvd25fd3JpdGUoJm5tX2ktPm5hdF90cmVlX2xvY2spOworCWRvd25fd3JpdGUoJm5tX2ktPm5hdF90cmVlX2xvY2spOwogCWUgPSBfX2xvb2t1cF9uYXRfY2FjaGUobm1faSwgbmktPm5pZCk7CiAJaWYgKCFlKSB7CiAJCWUgPSBncmFiX25hdF9lbnRyeShubV9pLCBuaS0+bmlkKTsKQEAgLTMzNCw3ICszMzQsNyBAQAogCQkJc2V0X25hdF9mbGFnKGUsIEhBU19GU1lOQ0VEX0lOT0RFLCB0cnVlKTsKIAkJc2V0X25hdF9mbGFnKGUsIEhBU19MQVNUX0ZTWU5DLCBmc3luY19kb25lKTsKIAl9Ci0JcGVyY3B1X3VwX3dyaXRlKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKKwl1cF93cml0ZSgmbm1faS0+bmF0X3RyZWVfbG9jayk7CiB9CiAKIGludCB0cnlfdG9fZnJlZV9uYXRzKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgaW50IG5yX3NocmluaykKQEAgLTM0Miw3ICszNDIsOCBAQAogCXN0cnVjdCBmMmZzX25tX2luZm8gKm5tX2kgPSBOTV9JKHNiaSk7CiAJaW50IG5yID0gbnJfc2hyaW5rOwogCi0JcGVyY3B1X2Rvd25fd3JpdGUoJm5tX2ktPm5hdF90cmVlX2xvY2spOworCWlmICghZG93bl93cml0ZV90cnlsb2NrKCZubV9pLT5uYXRfdHJlZV9sb2NrKSkKKwkJcmV0dXJuIDA7CiAKIAl3aGlsZSAobnJfc2hyaW5rICYmICFsaXN0X2VtcHR5KCZubV9pLT5uYXRfZW50cmllcykpIHsKIAkJc3RydWN0IG5hdF9lbnRyeSAqbmU7CkBAIC0zNTEsNyArMzUyLDcgQEAKIAkJX19kZWxfZnJvbV9uYXRfY2FjaGUobm1faSwgbmUpOwogCQlucl9zaHJpbmstLTsKIAl9Ci0JcGVyY3B1X3VwX3dyaXRlKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKKwl1cF93cml0ZSgmbm1faS0+bmF0X3RyZWVfbG9jayk7CiAJcmV0dXJuIG5yIC0gbnJfc2hyaW5rOwogfQogCkBAIC0zNzMsMTMgKzM3NCwxMyBAQAogCW5pLT5uaWQgPSBuaWQ7CiAKIAkvKiBDaGVjayBuYXQgY2FjaGUgKi8KLQlwZXJjcHVfZG93bl9yZWFkKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKKwlkb3duX3JlYWQoJm5tX2ktPm5hdF90cmVlX2xvY2spOwogCWUgPSBfX2xvb2t1cF9uYXRfY2FjaGUobm1faSwgbmlkKTsKIAlpZiAoZSkgewogCQluaS0+aW5vID0gbmF0X2dldF9pbm8oZSk7CiAJCW5pLT5ibGtfYWRkciA9IG5hdF9nZXRfYmxrYWRkcihlKTsKIAkJbmktPnZlcnNpb24gPSBuYXRfZ2V0X3ZlcnNpb24oZSk7Ci0JCXBlcmNwdV91cF9yZWFkKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKKwkJdXBfcmVhZCgmbm1faS0+bmF0X3RyZWVfbG9jayk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQwMywxMSArNDA0LDExIEBACiAJbm9kZV9pbmZvX2Zyb21fcmF3X25hdChuaSwgJm5lKTsKIAlmMmZzX3B1dF9wYWdlKHBhZ2UsIDEpOwogY2FjaGU6Ci0JcGVyY3B1X3VwX3JlYWQoJm5tX2ktPm5hdF90cmVlX2xvY2spOworCXVwX3JlYWQoJm5tX2ktPm5hdF90cmVlX2xvY2spOwogCS8qIGNhY2hlIG5hdCBlbnRyeSAqLwotCXBlcmNwdV9kb3duX3dyaXRlKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKKwlkb3duX3dyaXRlKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKIAljYWNoZV9uYXRfZW50cnkoc2JpLCBuaWQsICZuZSk7Ci0JcGVyY3B1X3VwX3dyaXRlKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKKwl1cF93cml0ZSgmbm1faS0+bmF0X3RyZWVfbG9jayk7CiB9CiAKIC8qCkBAIC0xNzg4LDcgKzE3ODksNyBAQAogCXJhX21ldGFfcGFnZXMoc2JpLCBOQVRfQkxPQ0tfT0ZGU0VUKG5pZCksIEZSRUVfTklEX1BBR0VTLAogCQkJCQkJCU1FVEFfTkFULCB0cnVlKTsKIAotCXBlcmNwdV9kb3duX3JlYWQoJm5tX2ktPm5hdF90cmVlX2xvY2spOworCWRvd25fcmVhZCgmbm1faS0+bmF0X3RyZWVfbG9jayk7CiAKIAl3aGlsZSAoMSkgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGdldF9jdXJyZW50X25hdF9wYWdlKHNiaSwgbmlkKTsKQEAgLTE4MjAsNyArMTgyMSw3IEBACiAJCQlyZW1vdmVfZnJlZV9uaWQobm1faSwgbmlkKTsKIAl9CiAJdXBfcmVhZCgmY3Vyc2VnLT5qb3VybmFsX3J3c2VtKTsKLQlwZXJjcHVfdXBfcmVhZCgmbm1faS0+bmF0X3RyZWVfbG9jayk7CisJdXBfcmVhZCgmbm1faS0+bmF0X3RyZWVfbG9jayk7CiAKIAlyYV9tZXRhX3BhZ2VzKHNiaSwgTkFUX0JMT0NLX09GRlNFVChubV9pLT5uZXh0X3NjYW5fbmlkKSwKIAkJCQkJbm1faS0+cmFfbmlkX3BhZ2VzLCBNRVRBX05BVCwgZmFsc2UpOwpAQCAtMjIwOSw3ICsyMjEwLDcgQEAKIAlpZiAoIW5tX2ktPmRpcnR5X25hdF9jbnQpCiAJCXJldHVybjsKIAotCXBlcmNwdV9kb3duX3dyaXRlKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKKwlkb3duX3dyaXRlKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKIAogCS8qCiAJICogaWYgdGhlcmUgYXJlIG5vIGVub3VnaCBzcGFjZSBpbiBqb3VybmFsIHRvIHN0b3JlIGRpcnR5IG5hdApAQCAtMjIzMiw3ICsyMjMzLDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2V0LCB0bXAsICZzZXRzLCBzZXRfbGlzdCkKIAkJX19mbHVzaF9uYXRfZW50cnlfc2V0KHNiaSwgc2V0KTsKIAotCXBlcmNwdV91cF93cml0ZSgmbm1faS0+bmF0X3RyZWVfbG9jayk7CisJdXBfd3JpdGUoJm5tX2ktPm5hdF90cmVlX2xvY2spOwogCiAJZjJmc19idWdfb24oc2JpLCBubV9pLT5kaXJ0eV9uYXRfY250KTsKIH0KQEAgLTIyNjgsOCArMjI2OSw3IEBACiAKIAltdXRleF9pbml0KCZubV9pLT5idWlsZF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmbm1faS0+ZnJlZV9uaWRfbGlzdF9sb2NrKTsKLQlpZiAocGVyY3B1X2luaXRfcndzZW0oJm5tX2ktPm5hdF90cmVlX2xvY2spKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpbml0X3J3c2VtKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKIAogCW5tX2ktPm5leHRfc2Nhbl9uaWQgPSBsZTMyX3RvX2NwdShzYmktPmNrcHQtPm5leHRfZnJlZV9uaWQpOwogCW5tX2ktPmJpdG1hcF9zaXplID0gX19iaXRtYXBfc2l6ZShzYmksIE5BVF9CSVRNQVApOwpAQCAtMjMyNiw3ICsyMzI2LDcgQEAKIAlzcGluX3VubG9jaygmbm1faS0+ZnJlZV9uaWRfbGlzdF9sb2NrKTsKIAogCS8qIGRlc3Ryb3kgbmF0IGNhY2hlICovCi0JcGVyY3B1X2Rvd25fd3JpdGUoJm5tX2ktPm5hdF90cmVlX2xvY2spOworCWRvd25fd3JpdGUoJm5tX2ktPm5hdF90cmVlX2xvY2spOwogCXdoaWxlICgoZm91bmQgPSBfX2dhbmdfbG9va3VwX25hdF9jYWNoZShubV9pLAogCQkJCQluaWQsIE5BVFZFQ19TSVpFLCBuYXR2ZWMpKSkgewogCQl1bnNpZ25lZCBpZHg7CkBAIC0yMzUxLDkgKzIzNTEsOCBAQAogCQkJa21lbV9jYWNoZV9mcmVlKG5hdF9lbnRyeV9zZXRfc2xhYiwgc2V0dmVjW2lkeF0pOwogCQl9CiAJfQotCXBlcmNwdV91cF93cml0ZSgmbm1faS0+bmF0X3RyZWVfbG9jayk7CisJdXBfd3JpdGUoJm5tX2ktPm5hdF90cmVlX2xvY2spOwogCi0JcGVyY3B1X2ZyZWVfcndzZW0oJm5tX2ktPm5hdF90cmVlX2xvY2spOwogCWtmcmVlKG5tX2ktPm5hdF9iaXRtYXApOwogCXNiaS0+bm1faW5mbyA9IE5VTEw7CiAJa2ZyZWUobm1faSk7CmRpZmYgLS1naXQgYS9mcy9mMmZzL3N1cGVyLmMgYi9mcy9mMmZzL3N1cGVyLmMKaW5kZXggMWI4NmQzZi4uN2Y4NjNhNiAxMDA2NDQKLS0tIGEvZnMvZjJmcy9zdXBlci5jCisrKyBiL2ZzL2YyZnMvc3VwZXIuYwpAQCAtNzA2LDggKzcwNiw2IEBACiAJCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+bnJfcGFnZXNbaV0pOwogCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+YWxsb2NfdmFsaWRfYmxvY2tfY291bnQpOwogCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+dG90YWxfdmFsaWRfaW5vZGVfY291bnQpOwotCi0JcGVyY3B1X2ZyZWVfcndzZW0oJnNiaS0+Y3BfcndzZW0pOwogfQogCiBzdGF0aWMgdm9pZCBmMmZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQpAQCAtMTQ4Myw5ICsxNDgxLDYgQEAKIHsKIAlpbnQgaSwgZXJyOwogCi0JaWYgKHBlcmNwdV9pbml0X3J3c2VtKCZzYmktPmNwX3J3c2VtKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlmb3IgKGkgPSAwOyBpIDwgTlJfQ09VTlRfVFlQRTsgaSsrKSB7CiAJCWVyciA9IHBlcmNwdV9jb3VudGVyX2luaXQoJnNiaS0+bnJfcGFnZXNbaV0sIDAsIEdGUF9LRVJORUwpOwogCQlpZiAoZXJyKQpAQCAtMTY4Niw2ICsxNjgxLDcgQEAKIAkJc2JpLT53cml0ZV9pb1tpXS5iaW8gPSBOVUxMOwogCX0KIAorCWluaXRfcndzZW0oJnNiaS0+Y3BfcndzZW0pOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNiaS0+Y3Bfd2FpdCk7CiAJaW5pdF9zYl9pbmZvKHNiaSk7CiAKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvS2NvbmZpZyBiL2ZzL2Z1c2UvS2NvbmZpZwppbmRleCAxYjJmNmMyLi43NmYwOWNlIDEwMDY0NAotLS0gYS9mcy9mdXNlL0tjb25maWcKKysrIGIvZnMvZnVzZS9LY29uZmlnCkBAIC0xLDUgKzEsNiBAQAogY29uZmlnIEZVU0VfRlMKIAl0cmlzdGF0ZSAiRlVTRSAoRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UpIHN1cHBvcnQiCisJc2VsZWN0IEZTX1BPU0lYX0FDTAogCWhlbHAKIAkgIFdpdGggRlVTRSBpdCBpcyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgYSBmdWxseSBmdW5jdGlvbmFsIGZpbGVzeXN0ZW0KIAkgIGluIGEgdXNlcnNwYWNlIHByb2dyYW0uCmRpZmYgLS1naXQgYS9mcy9mdXNlL01ha2VmaWxlIGIvZnMvZnVzZS9NYWtlZmlsZQppbmRleCBlOTVlZWI0Li42MGRhODRhIDEwMDY0NAotLS0gYS9mcy9mdXNlL01ha2VmaWxlCisrKyBiL2ZzL2Z1c2UvTWFrZWZpbGUKQEAgLTUsNCArNSw0IEBACiBvYmotJChDT05GSUdfRlVTRV9GUykgKz0gZnVzZS5vCiBvYmotJChDT05GSUdfQ1VTRSkgKz0gY3VzZS5vCiAKLWZ1c2Utb2JqcyA6PSBkZXYubyBkaXIubyBmaWxlLm8gaW5vZGUubyBjb250cm9sLm8KK2Z1c2Utb2JqcyA6PSBkZXYubyBkaXIubyBmaWxlLm8gaW5vZGUubyBjb250cm9sLm8geGF0dHIubyBhY2wubwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9hY2wuYyBiL2ZzL2Z1c2UvYWNsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4NTc2NQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Z1c2UvYWNsLmMKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQ2Fub25pY2FsIEx0ZC4gPHNldGguZm9yc2hlZUBjYW5vbmljYWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBjYW4gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLgorICogU2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKi8KKworI2luY2x1ZGUgImZ1c2VfaS5oIgorCisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsX3hhdHRyLmg+CisKK3N0cnVjdCBwb3NpeF9hY2wgKmZ1c2VfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCWludCBzaXplOworCWNvbnN0IGNoYXIgKm5hbWU7CisJdm9pZCAqdmFsdWUgPSBOVUxMOworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKworCWlmICghZmMtPnBvc2l4X2FjbCB8fCBmYy0+bm9fZ2V0eGF0dHIpCisJCXJldHVybiBOVUxMOworCisJaWYgKHR5cGUgPT0gQUNMX1RZUEVfQUNDRVNTKQorCQluYW1lID0gWEFUVFJfTkFNRV9QT1NJWF9BQ0xfQUNDRVNTOworCWVsc2UgaWYgKHR5cGUgPT0gQUNMX1RZUEVfREVGQVVMVCkKKwkJbmFtZSA9IFhBVFRSX05BTUVfUE9TSVhfQUNMX0RFRkFVTFQ7CisJZWxzZQorCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CisKKwl2YWx1ZSA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZhbHVlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlzaXplID0gZnVzZV9nZXR4YXR0cihpbm9kZSwgbmFtZSwgdmFsdWUsIFBBR0VfU0laRSk7CisJaWYgKHNpemUgPiAwKQorCQlhY2wgPSBwb3NpeF9hY2xfZnJvbV94YXR0cigmaW5pdF91c2VyX25zLCB2YWx1ZSwgc2l6ZSk7CisJZWxzZSBpZiAoKHNpemUgPT0gMCkgfHwgKHNpemUgPT0gLUVOT0RBVEEpIHx8CisJCSAoc2l6ZSA9PSAtRU9QTk9UU1VQUCAmJiBmYy0+bm9fZ2V0eGF0dHIpKQorCQlhY2wgPSBOVUxMOworCWVsc2UgaWYgKHNpemUgPT0gLUVSQU5HRSkKKwkJYWNsID0gRVJSX1BUUigtRTJCSUcpOworCWVsc2UKKwkJYWNsID0gRVJSX1BUUihzaXplKTsKKworCWtmcmVlKHZhbHVlKTsKKwlyZXR1cm4gYWNsOworfQorCitpbnQgZnVzZV9zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgaW50IHR5cGUpCit7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKwljb25zdCBjaGFyICpuYW1lOworCWludCByZXQ7CisKKwlpZiAoIWZjLT5wb3NpeF9hY2wgfHwgZmMtPm5vX3NldHhhdHRyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAodHlwZSA9PSBBQ0xfVFlQRV9BQ0NFU1MpCisJCW5hbWUgPSBYQVRUUl9OQU1FX1BPU0lYX0FDTF9BQ0NFU1M7CisJZWxzZSBpZiAodHlwZSA9PSBBQ0xfVFlQRV9ERUZBVUxUKQorCQluYW1lID0gWEFUVFJfTkFNRV9QT1NJWF9BQ0xfREVGQVVMVDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFjbCkgeworCQkvKgorCQkgKiBGdXNlIHVzZXJzcGFjZSBpcyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgYWNjZXNzCisJCSAqIHBlcm1pc3Npb25zIGluIHRoZSBpbm9kZSwgaWYgbmVlZGVkLiBmdXNlX3NldHhhdHRyCisJCSAqIGludmFsaWRhdGVzIHRoZSBpbm9kZSBhdHRyaWJ1dGVzLCB3aGljaCB3aWxsIGZvcmNlCisJCSAqIHRoZW0gdG8gYmUgcmVmcmVzaGVkIHRoZSBuZXh0IHRpbWUgdGhleSBhcmUgdXNlZCwKKwkJICogYW5kIGl0IGFsc28gdXBkYXRlcyBpX2N0aW1lLgorCQkgKi8KKwkJc2l6ZV90IHNpemUgPSBwb3NpeF9hY2xfeGF0dHJfc2l6ZShhY2wtPmFfY291bnQpOworCQl2b2lkICp2YWx1ZTsKKworCQlpZiAoc2l6ZSA+IFBBR0VfU0laRSkKKwkJCXJldHVybiAtRTJCSUc7CisKKwkJdmFsdWUgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcmV0ID0gcG9zaXhfYWNsX3RvX3hhdHRyKCZpbml0X3VzZXJfbnMsIGFjbCwgdmFsdWUsIHNpemUpOworCQlpZiAocmV0IDwgMCkgeworCQkJa2ZyZWUodmFsdWUpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldCA9IGZ1c2Vfc2V0eGF0dHIoaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplLCAwKTsKKwkJa2ZyZWUodmFsdWUpOworCX0gZWxzZSB7CisJCXJldCA9IGZ1c2VfcmVtb3ZleGF0dHIoaW5vZGUsIG5hbWUpOworCX0KKwlmb3JnZXRfYWxsX2NhY2hlZF9hY2xzKGlub2RlKTsKKwlmdXNlX2ludmFsaWRhdGVfYXR0cihpbm9kZSk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9kZXYuYyBiL2ZzL2Z1c2UvZGV2LmMKaW5kZXggYTk0ZDJlZC4uYzQxYmRlMiAxMDA2NDQKLS0tIGEvZnMvZnVzZS9kZXYuYworKysgYi9mcy9mdXNlL2Rldi5jCkBAIC03NjcsNyArNzY3LDYgQEAKIAkJY3MtPmxlbiA9IGVycjsKIAkJY3MtPm9mZnNldCA9IG9mZjsKIAkJY3MtPnBnID0gcGFnZTsKLQkJY3MtPm9mZnNldCA9IG9mZjsKIAkJaW92X2l0ZXJfYWR2YW5jZShjcy0+aXRlciwgZXJyKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZGlyLmMgYi9mcy9mdXNlL2Rpci5jCmluZGV4IGM0N2I3NzguLmY3Yzg0YWIgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZGlyLmMKKysrIGIvZnMvZnVzZS9kaXIuYwpAQCAtMTMsNiArMTMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KIAogc3RhdGljIGJvb2wgZnVzZV91c2VfcmVhZGRpcnBsdXMoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KQogewpAQCAtMzcsNDcgKzM5LDM5IEBACiAJc2V0X2JpdChGVVNFX0lfQURWSVNFX1JEUExVUywgJmZpLT5zdGF0ZSk7CiB9CiAKLSNpZiBCSVRTX1BFUl9MT05HID49IDY0Cit1bmlvbiBmdXNlX2RlbnRyeSB7CisJdTY0IHRpbWU7CisJc3RydWN0IHJjdV9oZWFkIHJjdTsKK307CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBmdXNlX2RlbnRyeV9zZXR0aW1lKHN0cnVjdCBkZW50cnkgKmVudHJ5LCB1NjQgdGltZSkKIHsKLQllbnRyeS0+ZF90aW1lID0gdGltZTsKKwkoKHVuaW9uIGZ1c2VfZGVudHJ5ICopIGVudHJ5LT5kX2ZzZGF0YSktPnRpbWUgPSB0aW1lOwogfQogCiBzdGF0aWMgaW5saW5lIHU2NCBmdXNlX2RlbnRyeV90aW1lKHN0cnVjdCBkZW50cnkgKmVudHJ5KQogewotCXJldHVybiBlbnRyeS0+ZF90aW1lOworCXJldHVybiAoKHVuaW9uIGZ1c2VfZGVudHJ5ICopIGVudHJ5LT5kX2ZzZGF0YSktPnRpbWU7CiB9Ci0jZWxzZQotLyoKLSAqIE9uIDMyIGJpdCBhcmNocyBzdG9yZSB0aGUgaGlnaCAzMiBiaXRzIG9mIHRpbWUgaW4gZF9mc2RhdGEKLSAqLwotc3RhdGljIHZvaWQgZnVzZV9kZW50cnlfc2V0dGltZShzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgdTY0IHRpbWUpCi17Ci0JZW50cnktPmRfdGltZSA9IHRpbWU7Ci0JZW50cnktPmRfZnNkYXRhID0gKHZvaWQgKikgKHVuc2lnbmVkIGxvbmcpICh0aW1lID4+IDMyKTsKLX0KLQotc3RhdGljIHU2NCBmdXNlX2RlbnRyeV90aW1lKHN0cnVjdCBkZW50cnkgKmVudHJ5KQotewotCXJldHVybiAodTY0KSBlbnRyeS0+ZF90aW1lICsKLQkJKCh1NjQpICh1bnNpZ25lZCBsb25nKSBlbnRyeS0+ZF9mc2RhdGEgPDwgMzIpOwotfQotI2VuZGlmCiAKIC8qCiAgKiBGVVNFIGNhY2hlcyBkZW50cmllcyBhbmQgYXR0cmlidXRlcyB3aXRoIHNlcGFyYXRlIHRpbWVvdXQuICBUaGUKICAqIHRpbWUgaW4gamlmZmllcyB1bnRpbCB0aGUgZGVudHJ5L2F0dHJpYnV0ZXMgYXJlIHZhbGlkIGlzIHN0b3JlZCBpbgotICogZGVudHJ5LT5kX3RpbWUgYW5kIGZ1c2VfaW5vZGUtPmlfdGltZSByZXNwZWN0aXZlbHkuCisgKiBkZW50cnktPmRfZnNkYXRhIGFuZCBmdXNlX2lub2RlLT5pX3RpbWUgcmVzcGVjdGl2ZWx5LgogICovCiAKIC8qCiAgKiBDYWxjdWxhdGUgdGhlIHRpbWUgaW4gamlmZmllcyB1bnRpbCBhIGRlbnRyeS9hdHRyaWJ1dGVzIGFyZSB2YWxpZAogICovCi1zdGF0aWMgdTY0IHRpbWVfdG9famlmZmllcyh1bnNpZ25lZCBsb25nIHNlYywgdW5zaWduZWQgbG9uZyBuc2VjKQorc3RhdGljIHU2NCB0aW1lX3RvX2ppZmZpZXModTY0IHNlYywgdTMyIG5zZWMpCiB7CiAJaWYgKHNlYyB8fCBuc2VjKSB7Ci0JCXN0cnVjdCB0aW1lc3BlYyB0cyA9IHtzZWMsIG5zZWN9OwotCQlyZXR1cm4gZ2V0X2ppZmZpZXNfNjQoKSArIHRpbWVzcGVjX3RvX2ppZmZpZXMoJnRzKTsKKwkJc3RydWN0IHRpbWVzcGVjNjQgdHMgPSB7CisJCQlzZWMsCisJCQltYXhfdCh1MzIsIG5zZWMsIE5TRUNfUEVSX1NFQyAtIDEpCisJCX07CisKKwkJcmV0dXJuIGdldF9qaWZmaWVzXzY0KCkgKyB0aW1lc3BlYzY0X3RvX2ppZmZpZXMoJnRzKTsKIAl9IGVsc2UKIAkJcmV0dXJuIDA7CiB9CkBAIC0yNDMsNiArMjM3LDcgQEAKIAkJaWYgKHJldCB8fCAob3V0YXJnLmF0dHIubW9kZSBeIGlub2RlLT5pX21vZGUpICYgU19JRk1UKQogCQkJZ290byBpbnZhbGlkOwogCisJCWZvcmdldF9hbGxfY2FjaGVkX2FjbHMoaW5vZGUpOwogCQlmdXNlX2NoYW5nZV9hdHRyaWJ1dGVzKGlub2RlLCAmb3V0YXJnLmF0dHIsCiAJCQkJICAgICAgIGVudHJ5X2F0dHJfdGltZW91dCgmb3V0YXJnKSwKIAkJCQkgICAgICAgYXR0cl92ZXJzaW9uKTsKQEAgLTI3Miw4ICsyNjcsMjMgQEAKIAlyZXR1cm4gIW5vZGVpZCB8fCBub2RlaWQgPT0gRlVTRV9ST09UX0lEOwogfQogCitzdGF0aWMgaW50IGZ1c2VfZGVudHJ5X2luaXQoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWRlbnRyeS0+ZF9mc2RhdGEgPSBremFsbG9jKHNpemVvZih1bmlvbiBmdXNlX2RlbnRyeSksIEdGUF9LRVJORUwpOworCisJcmV0dXJuIGRlbnRyeS0+ZF9mc2RhdGEgPyAwIDogLUVOT01FTTsKK30KK3N0YXRpYyB2b2lkIGZ1c2VfZGVudHJ5X3JlbGVhc2Uoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXVuaW9uIGZ1c2VfZGVudHJ5ICpmZCA9IGRlbnRyeS0+ZF9mc2RhdGE7CisKKwlrZnJlZV9yY3UoZmQsIHJjdSk7Cit9CisKIGNvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBmdXNlX2RlbnRyeV9vcGVyYXRpb25zID0gewogCS5kX3JldmFsaWRhdGUJPSBmdXNlX2RlbnRyeV9yZXZhbGlkYXRlLAorCS5kX2luaXQJCT0gZnVzZV9kZW50cnlfaW5pdCwKKwkuZF9yZWxlYXNlCT0gZnVzZV9kZW50cnlfcmVsZWFzZSwKIH07CiAKIGludCBmdXNlX3ZhbGlkX3R5cGUoaW50IG0pCkBAIC02MzQsNyArNjQ0LDcgQEAKIAlyZXR1cm4gY3JlYXRlX25ld19lbnRyeShmYywgJmFyZ3MsIGRpciwgZW50cnksIFNfSUZMTkspOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZnVzZV91cGRhdGVfY3RpbWUoc3RydWN0IGlub2RlICppbm9kZSkKK3ZvaWQgZnVzZV91cGRhdGVfY3RpbWUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlpZiAoIUlTX05PQ01USU1FKGlub2RlKSkgewogCQlpbm9kZS0+aV9jdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CkBAIC05MTcsNiArOTI3LDcgQEAKIAogCWlmICh0aW1lX2JlZm9yZTY0KGZpLT5pX3RpbWUsIGdldF9qaWZmaWVzXzY0KCkpKSB7CiAJCXIgPSB0cnVlOworCQlmb3JnZXRfYWxsX2NhY2hlZF9hY2xzKGlub2RlKTsKIAkJZXJyID0gZnVzZV9kb19nZXRhdHRyKGlub2RlLCBzdGF0LCBmaWxlKTsKIAl9IGVsc2UgewogCQlyID0gZmFsc2U7CkBAIC0xMDE3LDcgKzEwMjgsNyBAQAogewogCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkOwogCi0JaWYgKGZjLT5mbGFncyAmIEZVU0VfQUxMT1dfT1RIRVIpCisJaWYgKGZjLT5hbGxvd19vdGhlcikKIAkJcmV0dXJuIDE7CiAKIAljcmVkID0gY3VycmVudF9jcmVkKCk7CkBAIC0xMDY0LDYgKzEwNzUsNyBAQAogCWlmIChtYXNrICYgTUFZX05PVF9CTE9DSykKIAkJcmV0dXJuIC1FQ0hJTEQ7CiAKKwlmb3JnZXRfYWxsX2NhY2hlZF9hY2xzKGlub2RlKTsKIAlyZXR1cm4gZnVzZV9kb19nZXRhdHRyKGlub2RlLCBOVUxMLCBOVUxMKTsKIH0KIApAQCAtMTA5Miw3ICsxMTA0LDcgQEAKIAkvKgogCSAqIElmIGF0dHJpYnV0ZXMgYXJlIG5lZWRlZCwgcmVmcmVzaCB0aGVtIGJlZm9yZSBwcm9jZWVkaW5nCiAJICovCi0JaWYgKChmYy0+ZmxhZ3MgJiBGVVNFX0RFRkFVTFRfUEVSTUlTU0lPTlMpIHx8CisJaWYgKGZjLT5kZWZhdWx0X3Blcm1pc3Npb25zIHx8CiAJICAgICgobWFzayAmIE1BWV9FWEVDKSAmJiBTX0lTUkVHKGlub2RlLT5pX21vZGUpKSkgewogCQlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkgPSBnZXRfZnVzZV9pbm9kZShpbm9kZSk7CiAKQEAgLTExMDUsNyArMTExNyw3IEBACiAJCX0KIAl9CiAKLQlpZiAoZmMtPmZsYWdzICYgRlVTRV9ERUZBVUxUX1BFUk1JU1NJT05TKSB7CisJaWYgKGZjLT5kZWZhdWx0X3Blcm1pc3Npb25zKSB7CiAJCWVyciA9IGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzayk7CiAKIAkJLyogSWYgcGVybWlzc2lvbiBpcyBkZW5pZWQsIHRyeSB0byByZWZyZXNoIGZpbGUKQEAgLTEyMzMsNiArMTI0NSw3IEBACiAJCWZpLT5ubG9va3VwKys7CiAJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAKKwkJZm9yZ2V0X2FsbF9jYWNoZWRfYWNscyhpbm9kZSk7CiAJCWZ1c2VfY2hhbmdlX2F0dHJpYnV0ZXMoaW5vZGUsICZvLT5hdHRyLAogCQkJCSAgICAgICBlbnRyeV9hdHRyX3RpbWVvdXQobyksCiAJCQkJICAgICAgIGF0dHJfdmVyc2lvbik7CkBAIC0xNjA1LDcgKzE2MTgsNyBAQAogCWludCBlcnI7CiAJYm9vbCB0cnVzdF9sb2NhbF9jbXRpbWUgPSBpc193YiAmJiBTX0lTUkVHKGlub2RlLT5pX21vZGUpOwogCi0JaWYgKCEoZmMtPmZsYWdzICYgRlVTRV9ERUZBVUxUX1BFUk1JU1NJT05TKSkKKwlpZiAoIWZjLT5kZWZhdWx0X3Blcm1pc3Npb25zKQogCQlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX0ZPUkNFOwogCiAJZXJyID0gaW5vZGVfY2hhbmdlX29rKGlub2RlLCBhdHRyKTsKQEAgLTE3MDIsMTQgKzE3MTUsNjMgQEAKIHN0YXRpYyBpbnQgZnVzZV9zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRfaW5vZGUoZW50cnkpOworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJc3RydWN0IGZpbGUgKmZpbGUgPSAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0ZJTEUpID8gYXR0ci0+aWFfZmlsZSA6IE5VTEw7CisJaW50IHJldDsKIAogCWlmICghZnVzZV9hbGxvd19jdXJyZW50X3Byb2Nlc3MoZ2V0X2Z1c2VfY29ubihpbm9kZSkpKQogCQlyZXR1cm4gLUVBQ0NFUzsKIAotCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfRklMRSkKLQkJcmV0dXJuIGZ1c2VfZG9fc2V0YXR0cihpbm9kZSwgYXR0ciwgYXR0ci0+aWFfZmlsZSk7Ci0JZWxzZQotCQlyZXR1cm4gZnVzZV9kb19zZXRhdHRyKGlub2RlLCBhdHRyLCBOVUxMKTsKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiAoQVRUUl9LSUxMX1NVSUQgfCBBVFRSX0tJTExfU0dJRCkpIHsKKwkJYXR0ci0+aWFfdmFsaWQgJj0gfihBVFRSX0tJTExfU1VJRCB8IEFUVFJfS0lMTF9TR0lEIHwKKwkJCQkgICAgQVRUUl9NT0RFKTsKKworCQkvKgorCQkgKiBUaGUgb25seSBzYW5lIHdheSB0byByZWxpYWJseSBraWxsIHN1aWQvc2dpZCBpcyB0byBkbyBpdCBpbgorCQkgKiB0aGUgdXNlcnNwYWNlIGZpbGVzeXN0ZW0KKwkJICoKKwkJICogVGhpcyBzaG91bGQgYmUgZG9uZSBvbiB3cml0ZSgpLCB0cnVuY2F0ZSgpIGFuZCBjaG93bigpLgorCQkgKi8KKwkJaWYgKCFmYy0+aGFuZGxlX2tpbGxwcml2KSB7CisJCQlpbnQga2lsbDsKKworCQkJLyoKKwkJCSAqIGlhX21vZGUgY2FsY3VsYXRpb24gbWF5IGhhdmUgdXNlZCBzdGFsZSBpX21vZGUuCisJCQkgKiBSZWZyZXNoIGFuZCByZWNhbGN1bGF0ZS4KKwkJCSAqLworCQkJcmV0ID0gZnVzZV9kb19nZXRhdHRyKGlub2RlLCBOVUxMLCBmaWxlKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKworCQkJYXR0ci0+aWFfbW9kZSA9IGlub2RlLT5pX21vZGU7CisJCQlraWxsID0gc2hvdWxkX3JlbW92ZV9zdWlkKGVudHJ5KTsKKwkJCWlmIChraWxsICYgQVRUUl9LSUxMX1NVSUQpIHsKKwkJCQlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX01PREU7CisJCQkJYXR0ci0+aWFfbW9kZSAmPSB+U19JU1VJRDsKKwkJCX0KKwkJCWlmIChraWxsICYgQVRUUl9LSUxMX1NHSUQpIHsKKwkJCQlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX01PREU7CisJCQkJYXR0ci0+aWFfbW9kZSAmPSB+U19JU0dJRDsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIWF0dHItPmlhX3ZhbGlkKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGZ1c2VfZG9fc2V0YXR0cihpbm9kZSwgYXR0ciwgZmlsZSk7CisJaWYgKCFyZXQpIHsKKwkJLyoKKwkJICogSWYgZmlsZXN5c3RlbSBzdXBwb3J0cyBhY2xzIGl0IG1heSBoYXZlIHVwZGF0ZWQgYWNsIHhhdHRycyBpbgorCQkgKiB0aGUgZmlsZXN5c3RlbSwgc28gZm9yZ2V0IGNhY2hlZCBhY2xzIGZvciB0aGUgaW5vZGUuCisJCSAqLworCQlpZiAoZmMtPnBvc2l4X2FjbCkKKwkJCWZvcmdldF9hbGxfY2FjaGVkX2FjbHMoaW5vZGUpOworCisJCS8qIERpcmVjdG9yeSBtb2RlIGNoYW5nZWQsIG1heSBuZWVkIHRvIHJldmFsaWRhdGUgYWNjZXNzICovCisJCWlmIChkX2lzX2RpcihlbnRyeSkgJiYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSkKKwkJCWZ1c2VfaW52YWxpZGF0ZV9lbnRyeV9jYWNoZShlbnRyeSk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZnVzZV9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwKQEAgLTE3MjQsMTUyICsxNzg2LDYgQEAKIAlyZXR1cm4gZnVzZV91cGRhdGVfYXR0cmlidXRlcyhpbm9kZSwgc3RhdCwgTlVMTCwgTlVMTCk7CiB9CiAKLXN0YXRpYyBpbnQgZnVzZV9zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICp1bnVzZWQsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsCi0JCQkgc2l6ZV90IHNpemUsIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwotCUZVU0VfQVJHUyhhcmdzKTsKLQlzdHJ1Y3QgZnVzZV9zZXR4YXR0cl9pbiBpbmFyZzsKLQlpbnQgZXJyOwotCi0JaWYgKGZjLT5ub19zZXR4YXR0cikKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JbWVtc2V0KCZpbmFyZywgMCwgc2l6ZW9mKGluYXJnKSk7Ci0JaW5hcmcuc2l6ZSA9IHNpemU7Ci0JaW5hcmcuZmxhZ3MgPSBmbGFnczsKLQlhcmdzLmluLmgub3Bjb2RlID0gRlVTRV9TRVRYQVRUUjsKLQlhcmdzLmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOwotCWFyZ3MuaW4ubnVtYXJncyA9IDM7Ci0JYXJncy5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOwotCWFyZ3MuaW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKLQlhcmdzLmluLmFyZ3NbMV0uc2l6ZSA9IHN0cmxlbihuYW1lKSArIDE7Ci0JYXJncy5pbi5hcmdzWzFdLnZhbHVlID0gbmFtZTsKLQlhcmdzLmluLmFyZ3NbMl0uc2l6ZSA9IHNpemU7Ci0JYXJncy5pbi5hcmdzWzJdLnZhbHVlID0gdmFsdWU7Ci0JZXJyID0gZnVzZV9zaW1wbGVfcmVxdWVzdChmYywgJmFyZ3MpOwotCWlmIChlcnIgPT0gLUVOT1NZUykgewotCQlmYy0+bm9fc2V0eGF0dHIgPSAxOwotCQllcnIgPSAtRU9QTk9UU1VQUDsKLQl9Ci0JaWYgKCFlcnIpIHsKLQkJZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpOwotCQlmdXNlX3VwZGF0ZV9jdGltZShpbm9kZSk7Ci0JfQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGZ1c2VfZ2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKLXsKLQlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwotCUZVU0VfQVJHUyhhcmdzKTsKLQlzdHJ1Y3QgZnVzZV9nZXR4YXR0cl9pbiBpbmFyZzsKLQlzdHJ1Y3QgZnVzZV9nZXR4YXR0cl9vdXQgb3V0YXJnOwotCXNzaXplX3QgcmV0OwotCi0JaWYgKGZjLT5ub19nZXR4YXR0cikKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JbWVtc2V0KCZpbmFyZywgMCwgc2l6ZW9mKGluYXJnKSk7Ci0JaW5hcmcuc2l6ZSA9IHNpemU7Ci0JYXJncy5pbi5oLm9wY29kZSA9IEZVU0VfR0VUWEFUVFI7Ci0JYXJncy5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKLQlhcmdzLmluLm51bWFyZ3MgPSAyOwotCWFyZ3MuaW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKLQlhcmdzLmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7Ci0JYXJncy5pbi5hcmdzWzFdLnNpemUgPSBzdHJsZW4obmFtZSkgKyAxOwotCWFyZ3MuaW4uYXJnc1sxXS52YWx1ZSA9IG5hbWU7Ci0JLyogVGhpcyBpcyByZWFsbHkgdHdvIGRpZmZlcmVudCBvcGVyYXRpb25zIHJvbGxlZCBpbnRvIG9uZSAqLwotCWFyZ3Mub3V0Lm51bWFyZ3MgPSAxOwotCWlmIChzaXplKSB7Ci0JCWFyZ3Mub3V0LmFyZ3ZhciA9IDE7Ci0JCWFyZ3Mub3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemU7Ci0JCWFyZ3Mub3V0LmFyZ3NbMF0udmFsdWUgPSB2YWx1ZTsKLQl9IGVsc2UgewotCQlhcmdzLm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKLQkJYXJncy5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7Ci0JfQotCXJldCA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZmMsICZhcmdzKTsKLQlpZiAoIXJldCAmJiAhc2l6ZSkKLQkJcmV0ID0gb3V0YXJnLnNpemU7Ci0JaWYgKHJldCA9PSAtRU5PU1lTKSB7Ci0JCWZjLT5ub19nZXR4YXR0ciA9IDE7Ci0JCXJldCA9IC1FT1BOT1RTVVBQOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBmdXNlX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgY2hhciAqbGlzdCwgc2l6ZV90IHNpemUpCi17Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGRfaW5vZGUoZW50cnkpOwotCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7Ci0JRlVTRV9BUkdTKGFyZ3MpOwotCXN0cnVjdCBmdXNlX2dldHhhdHRyX2luIGluYXJnOwotCXN0cnVjdCBmdXNlX2dldHhhdHRyX291dCBvdXRhcmc7Ci0Jc3NpemVfdCByZXQ7Ci0KLQlpZiAoIWZ1c2VfYWxsb3dfY3VycmVudF9wcm9jZXNzKGZjKSkKLQkJcmV0dXJuIC1FQUNDRVM7Ci0KLQlpZiAoZmMtPm5vX2xpc3R4YXR0cikKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JbWVtc2V0KCZpbmFyZywgMCwgc2l6ZW9mKGluYXJnKSk7Ci0JaW5hcmcuc2l6ZSA9IHNpemU7Ci0JYXJncy5pbi5oLm9wY29kZSA9IEZVU0VfTElTVFhBVFRSOwotCWFyZ3MuaW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7Ci0JYXJncy5pbi5udW1hcmdzID0gMTsKLQlhcmdzLmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7Ci0JYXJncy5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOwotCS8qIFRoaXMgaXMgcmVhbGx5IHR3byBkaWZmZXJlbnQgb3BlcmF0aW9ucyByb2xsZWQgaW50byBvbmUgKi8KLQlhcmdzLm91dC5udW1hcmdzID0gMTsKLQlpZiAoc2l6ZSkgewotCQlhcmdzLm91dC5hcmd2YXIgPSAxOwotCQlhcmdzLm91dC5hcmdzWzBdLnNpemUgPSBzaXplOwotCQlhcmdzLm91dC5hcmdzWzBdLnZhbHVlID0gbGlzdDsKLQl9IGVsc2UgewotCQlhcmdzLm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKLQkJYXJncy5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7Ci0JfQotCXJldCA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZmMsICZhcmdzKTsKLQlpZiAoIXJldCAmJiAhc2l6ZSkKLQkJcmV0ID0gb3V0YXJnLnNpemU7Ci0JaWYgKHJldCA9PSAtRU5PU1lTKSB7Ci0JCWZjLT5ub19saXN0eGF0dHIgPSAxOwotCQlyZXQgPSAtRU9QTk9UU1VQUDsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBmdXNlX3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKmVudHJ5LCBjb25zdCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkX2lub2RlKGVudHJ5KTsKLQlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwotCUZVU0VfQVJHUyhhcmdzKTsKLQlpbnQgZXJyOwotCi0JaWYgKGZjLT5ub19yZW1vdmV4YXR0cikKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JYXJncy5pbi5oLm9wY29kZSA9IEZVU0VfUkVNT1ZFWEFUVFI7Ci0JYXJncy5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKLQlhcmdzLmluLm51bWFyZ3MgPSAxOwotCWFyZ3MuaW4uYXJnc1swXS5zaXplID0gc3RybGVuKG5hbWUpICsgMTsKLQlhcmdzLmluLmFyZ3NbMF0udmFsdWUgPSBuYW1lOwotCWVyciA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZmMsICZhcmdzKTsKLQlpZiAoZXJyID09IC1FTk9TWVMpIHsKLQkJZmMtPm5vX3JlbW92ZXhhdHRyID0gMTsKLQkJZXJyID0gLUVPUE5PVFNVUFA7Ci0JfQotCWlmICghZXJyKSB7Ci0JCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsKLQkJZnVzZV91cGRhdGVfY3RpbWUoaW5vZGUpOwotCX0KLQlyZXR1cm4gZXJyOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZnVzZV9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKIAkubG9va3VwCQk9IGZ1c2VfbG9va3VwLAogCS5ta2RpcgkJPSBmdXNlX21rZGlyLApAQCAtMTg4NCwxMCArMTgwMCwxMiBAQAogCS5ta25vZAkJPSBmdXNlX21rbm9kLAogCS5wZXJtaXNzaW9uCT0gZnVzZV9wZXJtaXNzaW9uLAogCS5nZXRhdHRyCT0gZnVzZV9nZXRhdHRyLAotCS5zZXR4YXR0cgk9IGZ1c2Vfc2V0eGF0dHIsCi0JLmdldHhhdHRyCT0gZnVzZV9nZXR4YXR0ciwKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCiAJLmxpc3R4YXR0cgk9IGZ1c2VfbGlzdHhhdHRyLAotCS5yZW1vdmV4YXR0cgk9IGZ1c2VfcmVtb3ZleGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKKwkuZ2V0X2FjbAk9IGZ1c2VfZ2V0X2FjbCwKKwkuc2V0X2FjbAk9IGZ1c2Vfc2V0X2FjbCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZGlyX29wZXJhdGlvbnMgPSB7CkBAIC0xOTA1LDEwICsxODIzLDEyIEBACiAJLnNldGF0dHIJPSBmdXNlX3NldGF0dHIsCiAJLnBlcm1pc3Npb24JPSBmdXNlX3Blcm1pc3Npb24sCiAJLmdldGF0dHIJPSBmdXNlX2dldGF0dHIsCi0JLnNldHhhdHRyCT0gZnVzZV9zZXR4YXR0ciwKLQkuZ2V0eGF0dHIJPSBmdXNlX2dldHhhdHRyLAorCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKIAkubGlzdHhhdHRyCT0gZnVzZV9saXN0eGF0dHIsCi0JLnJlbW92ZXhhdHRyCT0gZnVzZV9yZW1vdmV4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAorCS5nZXRfYWNsCT0gZnVzZV9nZXRfYWNsLAorCS5zZXRfYWNsCT0gZnVzZV9zZXRfYWNsLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGZ1c2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0gewpAQCAtMTkxNiwxMCArMTgzNiwxMCBAQAogCS5nZXRfbGluawk9IGZ1c2VfZ2V0X2xpbmssCiAJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKIAkuZ2V0YXR0cgk9IGZ1c2VfZ2V0YXR0ciwKLQkuc2V0eGF0dHIJPSBmdXNlX3NldHhhdHRyLAotCS5nZXR4YXR0cgk9IGZ1c2VfZ2V0eGF0dHIsCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAogCS5saXN0eGF0dHIJPSBmdXNlX2xpc3R4YXR0ciwKLQkucmVtb3ZleGF0dHIJPSBmdXNlX3JlbW92ZXhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiB9OwogCiB2b2lkIGZ1c2VfaW5pdF9jb21tb24oc3RydWN0IGlub2RlICppbm9kZSkKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZmlsZS5jIGIvZnMvZnVzZS9maWxlLmMKaW5kZXggZjM5NGFmZi4uYjdiZWI2NyAxMDA2NDQKLS0tIGEvZnMvZnVzZS9maWxlLmMKKysrIGIvZnMvZnVzZS9maWxlLmMKQEAgLTUzMCwxMyArNTMwLDEzIEBACiAJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gY291bnQ7CiB9CiAKLXN0YXRpYyB2b2lkIGZ1c2VfcmVsZWFzZV91c2VyX3BhZ2VzKHN0cnVjdCBmdXNlX3JlcSAqcmVxLCBpbnQgd3JpdGUpCitzdGF0aWMgdm9pZCBmdXNlX3JlbGVhc2VfdXNlcl9wYWdlcyhzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgYm9vbCBzaG91bGRfZGlydHkpCiB7CiAJdW5zaWduZWQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCByZXEtPm51bV9wYWdlczsgaSsrKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gcmVxLT5wYWdlc1tpXTsKLQkJaWYgKHdyaXRlKQorCQlpZiAoc2hvdWxkX2RpcnR5KQogCQkJc2V0X3BhZ2VfZGlydHlfbG9jayhwYWdlKTsKIAkJcHV0X3BhZ2UocGFnZSk7CiAJfQpAQCAtMTMyMCw2ICsxMzIwLDcgQEAKIAkJICAgICAgIGxvZmZfdCAqcHBvcywgaW50IGZsYWdzKQogewogCWludCB3cml0ZSA9IGZsYWdzICYgRlVTRV9ESU9fV1JJVEU7CisJYm9vbCBzaG91bGRfZGlydHkgPSAhd3JpdGUgJiYgaXRlcl9pc19pb3ZlYyhpdGVyKTsKIAlpbnQgY3VzZSA9IGZsYWdzICYgRlVTRV9ESU9fQ1VTRTsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvLT5maWxlOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CkBAIC0xMzYzLDcgKzEzNjQsNyBAQAogCQkJbnJlcyA9IGZ1c2Vfc2VuZF9yZWFkKHJlcSwgaW8sIHBvcywgbmJ5dGVzLCBvd25lcik7CiAKIAkJaWYgKCFpby0+YXN5bmMpCi0JCQlmdXNlX3JlbGVhc2VfdXNlcl9wYWdlcyhyZXEsICF3cml0ZSk7CisJCQlmdXNlX3JlbGVhc2VfdXNlcl9wYWdlcyhyZXEsIHNob3VsZF9kaXJ0eSk7CiAJCWlmIChyZXEtPm91dC5oLmVycm9yKSB7CiAJCQllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCQkJYnJlYWs7CkBAIC0yMzI1LDQ5ICsyMzI2LDYgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IGZ1c2VfaW9jdGxfY29weV91c2VyKHN0cnVjdCBwYWdlICoqcGFnZXMsIHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJdW5zaWduZWQgaW50IG5yX3NlZ3MsIHNpemVfdCBieXRlcywgYm9vbCB0b191c2VyKQotewotCXN0cnVjdCBpb3ZfaXRlciBpaTsKLQlpbnQgcGFnZV9pZHggPSAwOwotCi0JaWYgKCFieXRlcykKLQkJcmV0dXJuIDA7Ci0KLQlpb3ZfaXRlcl9pbml0KCZpaSwgdG9fdXNlciA/IFJFQUQgOiBXUklURSwgaW92LCBucl9zZWdzLCBieXRlcyk7Ci0KLQl3aGlsZSAoaW92X2l0ZXJfY291bnQoJmlpKSkgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBhZ2VzW3BhZ2VfaWR4KytdOwotCQlzaXplX3QgdG9kbyA9IG1pbl90KHNpemVfdCwgUEFHRV9TSVpFLCBpb3ZfaXRlcl9jb3VudCgmaWkpKTsKLQkJdm9pZCAqa2FkZHI7Ci0KLQkJa2FkZHIgPSBrbWFwKHBhZ2UpOwotCi0JCXdoaWxlICh0b2RvKSB7Ci0JCQljaGFyIF9fdXNlciAqdWFkZHIgPSBpaS5pb3YtPmlvdl9iYXNlICsgaWkuaW92X29mZnNldDsKLQkJCXNpemVfdCBpb3ZfbGVuID0gaWkuaW92LT5pb3ZfbGVuIC0gaWkuaW92X29mZnNldDsKLQkJCXNpemVfdCBjb3B5ID0gbWluKHRvZG8sIGlvdl9sZW4pOwotCQkJc2l6ZV90IGxlZnQ7Ci0KLQkJCWlmICghdG9fdXNlcikKLQkJCQlsZWZ0ID0gY29weV9mcm9tX3VzZXIoa2FkZHIsIHVhZGRyLCBjb3B5KTsKLQkJCWVsc2UKLQkJCQlsZWZ0ID0gY29weV90b191c2VyKHVhZGRyLCBrYWRkciwgY29weSk7Ci0KLQkJCWlmICh1bmxpa2VseShsZWZ0KSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJaW92X2l0ZXJfYWR2YW5jZSgmaWksIGNvcHkpOwotCQkJdG9kbyAtPSBjb3B5OwotCQkJa2FkZHIgKz0gY29weTsKLQkJfQotCi0JCWt1bm1hcChwYWdlKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyoKICAqIENVU0Ugc2VydmVycyBjb21waWxlZCBvbiAzMmJpdCBicm9rZSBvbiA2NGJpdCBrZXJuZWxzIGJlY2F1c2UgdGhlCiAgKiBBQkkgd2FzIGRlZmluZWQgdG8gYmUgJ3N0cnVjdCBpb3ZlYycgd2hpY2ggaXMgZGlmZmVyZW50IG9uIDMyYml0CkBAIC0yNTE5LDggKzI0NzcsOSBAQAogCXN0cnVjdCBpb3ZlYyAqaW92X3BhZ2UgPSBOVUxMOwogCXN0cnVjdCBpb3ZlYyAqaW5faW92ID0gTlVMTCwgKm91dF9pb3YgPSBOVUxMOwogCXVuc2lnbmVkIGludCBpbl9pb3ZzID0gMCwgb3V0X2lvdnMgPSAwLCBudW1fcGFnZXMgPSAwLCBtYXhfcGFnZXM7Ci0Jc2l6ZV90IGluX3NpemUsIG91dF9zaXplLCB0cmFuc2ZlcnJlZDsKLQlpbnQgZXJyOworCXNpemVfdCBpbl9zaXplLCBvdXRfc2l6ZSwgdHJhbnNmZXJyZWQsIGM7CisJaW50IGVyciwgaTsKKwlzdHJ1Y3QgaW92X2l0ZXIgaWk7CiAKICNpZiBCSVRTX1BFUl9MT05HID09IDMyCiAJaW5hcmcuZmxhZ3MgfD0gRlVTRV9JT0NUTF8zMkJJVDsKQEAgLTI2MDIsMTAgKzI1NjEsMTMgQEAKIAkJcmVxLT5pbi5hcmdzWzFdLnNpemUgPSBpbl9zaXplOwogCQlyZXEtPmluLmFyZ3BhZ2VzID0gMTsKIAotCQllcnIgPSBmdXNlX2lvY3RsX2NvcHlfdXNlcihwYWdlcywgaW5faW92LCBpbl9pb3ZzLCBpbl9zaXplLAotCQkJCQkgICBmYWxzZSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dDsKKwkJZXJyID0gLUVGQVVMVDsKKwkJaW92X2l0ZXJfaW5pdCgmaWksIFdSSVRFLCBpbl9pb3YsIGluX2lvdnMsIGluX3NpemUpOworCQlmb3IgKGkgPSAwOyBpb3ZfaXRlcl9jb3VudCgmaWkpICYmICFXQVJOX09OKGkgPj0gbnVtX3BhZ2VzKTsgaSsrKSB7CisJCQljID0gY29weV9wYWdlX2Zyb21faXRlcihwYWdlc1tpXSwgMCwgUEFHRV9TSVpFLCAmaWkpOworCQkJaWYgKGMgIT0gUEFHRV9TSVpFICYmIGlvdl9pdGVyX2NvdW50KCZpaSkpCisJCQkJZ290byBvdXQ7CisJCX0KIAl9CiAKIAlyZXEtPm91dC5udW1hcmdzID0gMjsKQEAgLTI2NzEsNyArMjYzMywxNCBAQAogCWlmICh0cmFuc2ZlcnJlZCA+IGluYXJnLm91dF9zaXplKQogCQlnb3RvIG91dDsKIAotCWVyciA9IGZ1c2VfaW9jdGxfY29weV91c2VyKHBhZ2VzLCBvdXRfaW92LCBvdXRfaW92cywgdHJhbnNmZXJyZWQsIHRydWUpOworCWVyciA9IC1FRkFVTFQ7CisJaW92X2l0ZXJfaW5pdCgmaWksIFJFQUQsIG91dF9pb3YsIG91dF9pb3ZzLCB0cmFuc2ZlcnJlZCk7CisJZm9yIChpID0gMDsgaW92X2l0ZXJfY291bnQoJmlpKSAmJiAhV0FSTl9PTihpID49IG51bV9wYWdlcyk7IGkrKykgeworCQljID0gY29weV9wYWdlX3RvX2l0ZXIocGFnZXNbaV0sIDAsIFBBR0VfU0laRSwgJmlpKTsKKwkJaWYgKGMgIT0gUEFHRV9TSVpFICYmIGlvdl9pdGVyX2NvdW50KCZpaSkpCisJCQlnb3RvIG91dDsKKwl9CisJZXJyID0gMDsKICBvdXQ6CiAJaWYgKHJlcSkKIAkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZnVzZV9pLmggYi9mcy9mdXNlL2Z1c2VfaS5oCmluZGV4IGQ5OGQ4Y2MuLjI0YWRhNWQgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZnVzZV9pLmgKKysrIGIvZnMvZnVzZS9mdXNlX2kuaApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KIAogLyoqIE1heCBudW1iZXIgb2YgcGFnZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHNpbmdsZSByZWFkIHJlcXVlc3QgKi8KICNkZWZpbmUgRlVTRV9NQVhfUEFHRVNfUEVSX1JFUSAzMgpAQCAtMzYsMTUgKzM3LDYgQEAKIC8qKiBOdW1iZXIgb2YgZGVudHJpZXMgZm9yIGVhY2ggY29ubmVjdGlvbiBpbiB0aGUgY29udHJvbCBmaWxlc3lzdGVtICovCiAjZGVmaW5lIEZVU0VfQ1RMX05VTV9ERU5UUklFUyA1CiAKLS8qKiBJZiB0aGUgRlVTRV9ERUZBVUxUX1BFUk1JU1NJT05TIGZsYWcgaXMgZ2l2ZW4sIHRoZSBmaWxlc3lzdGVtCi0gICAgbW9kdWxlIHdpbGwgY2hlY2sgcGVybWlzc2lvbnMgYmFzZWQgb24gdGhlIGZpbGUgbW9kZS4gIE90aGVyd2lzZSBubwotICAgIHBlcm1pc3Npb24gY2hlY2tpbmcgaXMgZG9uZSBpbiB0aGUga2VybmVsICovCi0jZGVmaW5lIEZVU0VfREVGQVVMVF9QRVJNSVNTSU9OUyAoMSA8PCAwKQotCi0vKiogSWYgdGhlIEZVU0VfQUxMT1dfT1RIRVIgZmxhZyBpcyBnaXZlbiwgdGhlbiBub3Qgb25seSB0aGUgdXNlcgotICAgIGRvaW5nIHRoZSBtb3VudCB3aWxsIGJlIGFsbG93ZWQgdG8gYWNjZXNzIHRoZSBmaWxlc3lzdGVtICovCi0jZGVmaW5lIEZVU0VfQUxMT1dfT1RIRVIgICAgICAgICAoMSA8PCAxKQotCiAvKiogTnVtYmVyIG9mIHBhZ2UgcG9pbnRlcnMgZW1iZWRkZWQgaW4gZnVzZV9yZXEgKi8KICNkZWZpbmUgRlVTRV9SRVFfSU5MSU5FX1BBR0VTIDEKIApAQCAtNDY5LDkgKzQ2MSw2IEBACiAJLyoqIFRoZSBncm91cCBpZCBmb3IgdGhpcyBtb3VudCAqLwogCWtnaWRfdCBncm91cF9pZDsKIAotCS8qKiBUaGUgZnVzZSBtb3VudCBmbGFncyBmb3IgdGhpcyBtb3VudCAqLwotCXVuc2lnbmVkIGZsYWdzOwotCiAJLyoqIE1heGltdW0gcmVhZCBzaXplICovCiAJdW5zaWduZWQgbWF4X3JlYWQ7CiAKQEAgLTU0Nyw2ICs1MzYsOSBAQAogCS8qKiBhbGxvdyBwYXJhbGxlbCBsb29rdXBzIGFuZCByZWFkZGlyIChkZWZhdWx0IGlzIHNlcmlhbGl6ZWQpICovCiAJdW5zaWduZWQgcGFyYWxsZWxfZGlyb3BzOjE7CiAKKwkvKiogaGFuZGxlIGZzIGhhbmRsZXMga2lsbGluZyBzdWlkL3NnaWQvY2FwIG9uIHdyaXRlL2Nob3duL3RydW5jICovCisJdW5zaWduZWQgaGFuZGxlX2tpbGxwcml2OjE7CisKIAkvKgogCSAqIFRoZSBmb2xsb3dpbmcgYml0ZmllbGRzIGFyZSBvbmx5IGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMKIAkgKiBhbmQgaGVuY2UgcmFjZXMgaW4gc2V0dGluZyB0aGVtIHdpbGwgbm90IGNhdXNlIG1hbGZ1bmN0aW9uCkBAIC02MjQsNiArNjE2LDE1IEBACiAJLyoqIElzIGxzZWVrIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KIAl1bnNpZ25lZCBub19sc2VlazoxOwogCisJLyoqIERvZXMgdGhlIGZpbGVzeXN0ZW0gc3VwcG9ydCBwb3NpeCBhY2xzPyAqLworCXVuc2lnbmVkIHBvc2l4X2FjbDoxOworCisJLyoqIENoZWNrIHBlcm1pc3Npb25zIGJhc2VkIG9uIHRoZSBmaWxlIG1vZGUgb3Igbm90PyAqLworCXVuc2lnbmVkIGRlZmF1bHRfcGVybWlzc2lvbnM6MTsKKworCS8qKiBBbGxvdyBvdGhlciB0aGFuIHRoZSBtb3VudGVyIHVzZXIgdG8gYWNjZXNzIHRoZSBmaWxlc3lzdGVtID8gKi8KKwl1bnNpZ25lZCBhbGxvd19vdGhlcjoxOworCiAJLyoqIFRoZSBudW1iZXIgb2YgcmVxdWVzdHMgd2FpdGluZyBmb3IgY29tcGxldGlvbiAqLwogCWF0b21pY190IG51bV93YWl0aW5nOwogCkBAIC05MDIsNiArOTAzLDggQEAKIAogdTY0IGZ1c2VfbG9ja19vd25lcl9pZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgZmxfb3duZXJfdCBpZCk7CiAKK3ZvaWQgZnVzZV91cGRhdGVfY3RpbWUoc3RydWN0IGlub2RlICppbm9kZSk7CisKIGludCBmdXNlX3VwZGF0ZV9hdHRyaWJ1dGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBrc3RhdCAqc3RhdCwKIAkJCSAgIHN0cnVjdCBmaWxlICpmaWxlLCBib29sICpyZWZyZXNoZWQpOwogCkBAIC05NjYsNCArOTY5LDE3IEBACiB2b2lkIGZ1c2VfdW5sb2NrX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogdm9pZCBmdXNlX2xvY2tfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiAKK2ludCBmdXNlX3NldHhhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAorCQkgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOworc3NpemVfdCBmdXNlX2dldHhhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnZhbHVlLAorCQkgICAgICBzaXplX3Qgc2l6ZSk7Citzc2l6ZV90IGZ1c2VfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmVudHJ5LCBjaGFyICpsaXN0LCBzaXplX3Qgc2l6ZSk7CitpbnQgZnVzZV9yZW1vdmV4YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqZnVzZV94YXR0cl9oYW5kbGVyc1tdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpmdXNlX2FjbF94YXR0cl9oYW5kbGVyc1tdOworCitzdHJ1Y3QgcG9zaXhfYWNsOworc3RydWN0IHBvc2l4X2FjbCAqZnVzZV9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKTsKK2ludCBmdXNlX3NldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBvc2l4X2FjbCAqYWNsLCBpbnQgdHlwZSk7CisKICNlbmRpZiAvKiBfRlNfRlVTRV9JX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvaW5vZGUuYyBiL2ZzL2Z1c2UvaW5vZGUuYwppbmRleCA0ZTA1YjUxLi4xNzE0MTA5IDEwMDY0NAotLS0gYS9mcy9mdXNlL2lub2RlLmMKKysrIGIvZnMvZnVzZS9pbm9kZS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbC5oPgogCiBNT0RVTEVfQVVUSE9SKCJNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlIik7CkBAIC02Niw3ICs2Nyw4IEBACiAJdW5zaWduZWQgcm9vdG1vZGVfcHJlc2VudDoxOwogCXVuc2lnbmVkIHVzZXJfaWRfcHJlc2VudDoxOwogCXVuc2lnbmVkIGdyb3VwX2lkX3ByZXNlbnQ6MTsKLQl1bnNpZ25lZCBmbGFnczsKKwl1bnNpZ25lZCBkZWZhdWx0X3Blcm1pc3Npb25zOjE7CisJdW5zaWduZWQgYWxsb3dfb3RoZXI6MTsKIAl1bnNpZ25lZCBtYXhfcmVhZDsKIAl1bnNpZ25lZCBibGtzaXplOwogfTsKQEAgLTE5Miw3ICsxOTQsNyBAQAogCSAqIGNoZWNrIGluIG1heV9kZWxldGUoKS4KIAkgKi8KIAlmaS0+b3JpZ19pX21vZGUgPSBpbm9kZS0+aV9tb2RlOwotCWlmICghKGZjLT5mbGFncyAmIEZVU0VfREVGQVVMVF9QRVJNSVNTSU9OUykpCisJaWYgKCFmYy0+ZGVmYXVsdF9wZXJtaXNzaW9ucykKIAkJaW5vZGUtPmlfbW9kZSAmPSB+U19JU1ZUWDsKIAogCWZpLT5vcmlnX2lubyA9IGF0dHItPmlubzsKQEAgLTM0MCw2ICszNDIsNyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAogCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsKKwlmb3JnZXRfYWxsX2NhY2hlZF9hY2xzKGlub2RlKTsKIAlpZiAob2Zmc2V0ID49IDApIHsKIAkJcGdfc3RhcnQgPSBvZmZzZXQgPj4gUEFHRV9TSElGVDsKIAkJaWYgKGxlbiA8PSAwKQpAQCAtNTMyLDExICs1MzUsMTEgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgT1BUX0RFRkFVTFRfUEVSTUlTU0lPTlM6Ci0JCQlkLT5mbGFncyB8PSBGVVNFX0RFRkFVTFRfUEVSTUlTU0lPTlM7CisJCQlkLT5kZWZhdWx0X3Blcm1pc3Npb25zID0gMTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgT1BUX0FMTE9XX09USEVSOgotCQkJZC0+ZmxhZ3MgfD0gRlVTRV9BTExPV19PVEhFUjsKKwkJCWQtPmFsbG93X290aGVyID0gMTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgT1BUX01BWF9SRUFEOgpAQCAtNTcwLDkgKzU3Myw5IEBACiAKIAlzZXFfcHJpbnRmKG0sICIsdXNlcl9pZD0ldSIsIGZyb21fa3VpZF9tdW5nZWQoJmluaXRfdXNlcl9ucywgZmMtPnVzZXJfaWQpKTsKIAlzZXFfcHJpbnRmKG0sICIsZ3JvdXBfaWQ9JXUiLCBmcm9tX2tnaWRfbXVuZ2VkKCZpbml0X3VzZXJfbnMsIGZjLT5ncm91cF9pZCkpOwotCWlmIChmYy0+ZmxhZ3MgJiBGVVNFX0RFRkFVTFRfUEVSTUlTU0lPTlMpCisJaWYgKGZjLT5kZWZhdWx0X3Blcm1pc3Npb25zKQogCQlzZXFfcHV0cyhtLCAiLGRlZmF1bHRfcGVybWlzc2lvbnMiKTsKLQlpZiAoZmMtPmZsYWdzICYgRlVTRV9BTExPV19PVEhFUikKKwlpZiAoZmMtPmFsbG93X290aGVyKQogCQlzZXFfcHV0cyhtLCAiLGFsbG93X290aGVyIik7CiAJaWYgKGZjLT5tYXhfcmVhZCAhPSB+MCkKIAkJc2VxX3ByaW50ZihtLCAiLG1heF9yZWFkPSV1IiwgZmMtPm1heF9yZWFkKTsKQEAgLTkxMCw4ICs5MTMsMTUgQEAKIAkJCQlmYy0+d3JpdGViYWNrX2NhY2hlID0gMTsKIAkJCWlmIChhcmctPmZsYWdzICYgRlVTRV9QQVJBTExFTF9ESVJPUFMpCiAJCQkJZmMtPnBhcmFsbGVsX2Rpcm9wcyA9IDE7CisJCQlpZiAoYXJnLT5mbGFncyAmIEZVU0VfSEFORExFX0tJTExQUklWKQorCQkJCWZjLT5oYW5kbGVfa2lsbHByaXYgPSAxOwogCQkJaWYgKGFyZy0+dGltZV9ncmFuICYmIGFyZy0+dGltZV9ncmFuIDw9IDEwMDAwMDAwMDApCiAJCQkJZmMtPnNiLT5zX3RpbWVfZ3JhbiA9IGFyZy0+dGltZV9ncmFuOworCQkJaWYgKChhcmctPmZsYWdzICYgRlVTRV9QT1NJWF9BQ0wpKSB7CisJCQkJZmMtPmRlZmF1bHRfcGVybWlzc2lvbnMgPSAxOworCQkJCWZjLT5wb3NpeF9hY2wgPSAxOworCQkJCWZjLT5zYi0+c194YXR0ciA9IGZ1c2VfYWNsX3hhdHRyX2hhbmRsZXJzOworCQkJfQogCQl9IGVsc2UgewogCQkJcmFfcGFnZXMgPSBmYy0+bWF4X3JlYWQgLyBQQUdFX1NJWkU7CiAJCQlmYy0+bm9fbG9jayA9IDE7CkBAIC05NDEsNyArOTUxLDcgQEAKIAkJRlVTRV9GTE9DS19MT0NLUyB8IEZVU0VfSEFTX0lPQ1RMX0RJUiB8IEZVU0VfQVVUT19JTlZBTF9EQVRBIHwKIAkJRlVTRV9ET19SRUFERElSUExVUyB8IEZVU0VfUkVBRERJUlBMVVNfQVVUTyB8IEZVU0VfQVNZTkNfRElPIHwKIAkJRlVTRV9XUklURUJBQ0tfQ0FDSEUgfCBGVVNFX05PX09QRU5fU1VQUE9SVCB8Ci0JCUZVU0VfUEFSQUxMRUxfRElST1BTOworCQlGVVNFX1BBUkFMTEVMX0RJUk9QUyB8IEZVU0VfSEFORExFX0tJTExQUklWIHwgRlVTRV9QT1NJWF9BQ0w7CiAJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfSU5JVDsKIAlyZXEtPmluLm51bWFyZ3MgPSAxOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKCphcmcpOwpAQCAtMTA3MSw2ICsxMDgxLDcgQEAKIAl9CiAJc2ItPnNfbWFnaWMgPSBGVVNFX1NVUEVSX01BR0lDOwogCXNiLT5zX29wID0gJmZ1c2Vfc3VwZXJfb3BlcmF0aW9uczsKKwlzYi0+c194YXR0ciA9IGZ1c2VfeGF0dHJfaGFuZGxlcnM7CiAJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOwogCXNiLT5zX3RpbWVfZ3JhbiA9IDE7CiAJc2ItPnNfZXhwb3J0X29wID0gJmZ1c2VfZXhwb3J0X29wZXJhdGlvbnM7CkBAIC0xMTA5LDcgKzExMjAsOCBAQAogCQlmYy0+ZG9udF9tYXNrID0gMTsKIAlzYi0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKIAotCWZjLT5mbGFncyA9IGQuZmxhZ3M7CisJZmMtPmRlZmF1bHRfcGVybWlzc2lvbnMgPSBkLmRlZmF1bHRfcGVybWlzc2lvbnM7CisJZmMtPmFsbG93X290aGVyID0gZC5hbGxvd19vdGhlcjsKIAlmYy0+dXNlcl9pZCA9IGQudXNlcl9pZDsKIAlmYy0+Z3JvdXBfaWQgPSBkLmdyb3VwX2lkOwogCWZjLT5tYXhfcmVhZCA9IG1heF90KHVuc2lnbmVkLCA0MDk2LCBkLm1heF9yZWFkKTsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UveGF0dHIuYyBiL2ZzL2Z1c2UveGF0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2FhYzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZnVzZS94YXR0ci5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDE2ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CisgKgorICogVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCisgKiBTZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqLworCisjaW5jbHVkZSAiZnVzZV9pLmgiCisKKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbF94YXR0ci5oPgorCitpbnQgZnVzZV9zZXR4YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwKKwkJICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJRlVTRV9BUkdTKGFyZ3MpOworCXN0cnVjdCBmdXNlX3NldHhhdHRyX2luIGluYXJnOworCWludCBlcnI7CisKKwlpZiAoZmMtPm5vX3NldHhhdHRyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwltZW1zZXQoJmluYXJnLCAwLCBzaXplb2YoaW5hcmcpKTsKKwlpbmFyZy5zaXplID0gc2l6ZTsKKwlpbmFyZy5mbGFncyA9IGZsYWdzOworCWFyZ3MuaW4uaC5vcGNvZGUgPSBGVVNFX1NFVFhBVFRSOworCWFyZ3MuaW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJYXJncy5pbi5udW1hcmdzID0gMzsKKwlhcmdzLmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CisJYXJncy5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOworCWFyZ3MuaW4uYXJnc1sxXS5zaXplID0gc3RybGVuKG5hbWUpICsgMTsKKwlhcmdzLmluLmFyZ3NbMV0udmFsdWUgPSBuYW1lOworCWFyZ3MuaW4uYXJnc1syXS5zaXplID0gc2l6ZTsKKwlhcmdzLmluLmFyZ3NbMl0udmFsdWUgPSB2YWx1ZTsKKwllcnIgPSBmdXNlX3NpbXBsZV9yZXF1ZXN0KGZjLCAmYXJncyk7CisJaWYgKGVyciA9PSAtRU5PU1lTKSB7CisJCWZjLT5ub19zZXR4YXR0ciA9IDE7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCX0KKwlpZiAoIWVycikgeworCQlmdXNlX2ludmFsaWRhdGVfYXR0cihpbm9kZSk7CisJCWZ1c2VfdXBkYXRlX2N0aW1lKGlub2RlKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3NpemVfdCBmdXNlX2dldHhhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnZhbHVlLAorCQkgICAgICBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCUZVU0VfQVJHUyhhcmdzKTsKKwlzdHJ1Y3QgZnVzZV9nZXR4YXR0cl9pbiBpbmFyZzsKKwlzdHJ1Y3QgZnVzZV9nZXR4YXR0cl9vdXQgb3V0YXJnOworCXNzaXplX3QgcmV0OworCisJaWYgKGZjLT5ub19nZXR4YXR0cikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbWVtc2V0KCZpbmFyZywgMCwgc2l6ZW9mKGluYXJnKSk7CisJaW5hcmcuc2l6ZSA9IHNpemU7CisJYXJncy5pbi5oLm9wY29kZSA9IEZVU0VfR0VUWEFUVFI7CisJYXJncy5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKKwlhcmdzLmluLm51bWFyZ3MgPSAyOworCWFyZ3MuaW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKKwlhcmdzLmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CisJYXJncy5pbi5hcmdzWzFdLnNpemUgPSBzdHJsZW4obmFtZSkgKyAxOworCWFyZ3MuaW4uYXJnc1sxXS52YWx1ZSA9IG5hbWU7CisJLyogVGhpcyBpcyByZWFsbHkgdHdvIGRpZmZlcmVudCBvcGVyYXRpb25zIHJvbGxlZCBpbnRvIG9uZSAqLworCWFyZ3Mub3V0Lm51bWFyZ3MgPSAxOworCWlmIChzaXplKSB7CisJCWFyZ3Mub3V0LmFyZ3ZhciA9IDE7CisJCWFyZ3Mub3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemU7CisJCWFyZ3Mub3V0LmFyZ3NbMF0udmFsdWUgPSB2YWx1ZTsKKwl9IGVsc2UgeworCQlhcmdzLm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKKwkJYXJncy5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7CisJfQorCXJldCA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZmMsICZhcmdzKTsKKwlpZiAoIXJldCAmJiAhc2l6ZSkKKwkJcmV0ID0gbWluX3Qoc3NpemVfdCwgb3V0YXJnLnNpemUsIFhBVFRSX1NJWkVfTUFYKTsKKwlpZiAocmV0ID09IC1FTk9TWVMpIHsKKwkJZmMtPm5vX2dldHhhdHRyID0gMTsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV92ZXJpZnlfeGF0dHJfbGlzdChjaGFyICpsaXN0LCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3Qgb3JpZ3NpemUgPSBzaXplOworCisJd2hpbGUgKHNpemUpIHsKKwkJc2l6ZV90IHRoaXNsZW4gPSBzdHJubGVuKGxpc3QsIHNpemUpOworCisJCWlmICghdGhpc2xlbiB8fCB0aGlzbGVuID09IHNpemUpCisJCQlyZXR1cm4gLUVJTzsKKworCQlzaXplIC09IHRoaXNsZW4gKyAxOworCQlsaXN0ICs9IHRoaXNsZW4gKyAxOworCX0KKworCXJldHVybiBvcmlnc2l6ZTsKK30KKworc3NpemVfdCBmdXNlX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgY2hhciAqbGlzdCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRfaW5vZGUoZW50cnkpOworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJRlVTRV9BUkdTKGFyZ3MpOworCXN0cnVjdCBmdXNlX2dldHhhdHRyX2luIGluYXJnOworCXN0cnVjdCBmdXNlX2dldHhhdHRyX291dCBvdXRhcmc7CisJc3NpemVfdCByZXQ7CisKKwlpZiAoIWZ1c2VfYWxsb3dfY3VycmVudF9wcm9jZXNzKGZjKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlpZiAoZmMtPm5vX2xpc3R4YXR0cikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbWVtc2V0KCZpbmFyZywgMCwgc2l6ZW9mKGluYXJnKSk7CisJaW5hcmcuc2l6ZSA9IHNpemU7CisJYXJncy5pbi5oLm9wY29kZSA9IEZVU0VfTElTVFhBVFRSOworCWFyZ3MuaW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJYXJncy5pbi5udW1hcmdzID0gMTsKKwlhcmdzLmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CisJYXJncy5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOworCS8qIFRoaXMgaXMgcmVhbGx5IHR3byBkaWZmZXJlbnQgb3BlcmF0aW9ucyByb2xsZWQgaW50byBvbmUgKi8KKwlhcmdzLm91dC5udW1hcmdzID0gMTsKKwlpZiAoc2l6ZSkgeworCQlhcmdzLm91dC5hcmd2YXIgPSAxOworCQlhcmdzLm91dC5hcmdzWzBdLnNpemUgPSBzaXplOworCQlhcmdzLm91dC5hcmdzWzBdLnZhbHVlID0gbGlzdDsKKwl9IGVsc2UgeworCQlhcmdzLm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKKwkJYXJncy5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7CisJfQorCXJldCA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZmMsICZhcmdzKTsKKwlpZiAoIXJldCAmJiAhc2l6ZSkKKwkJcmV0ID0gbWluX3Qoc3NpemVfdCwgb3V0YXJnLnNpemUsIFhBVFRSX0xJU1RfTUFYKTsKKwlpZiAocmV0ID4gMCAmJiBzaXplKQorCQlyZXQgPSBmdXNlX3ZlcmlmeV94YXR0cl9saXN0KGxpc3QsIHJldCk7CisJaWYgKHJldCA9PSAtRU5PU1lTKSB7CisJCWZjLT5ub19saXN0eGF0dHIgPSAxOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IGZ1c2VfcmVtb3ZleGF0dHIoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCUZVU0VfQVJHUyhhcmdzKTsKKwlpbnQgZXJyOworCisJaWYgKGZjLT5ub19yZW1vdmV4YXR0cikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJYXJncy5pbi5oLm9wY29kZSA9IEZVU0VfUkVNT1ZFWEFUVFI7CisJYXJncy5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKKwlhcmdzLmluLm51bWFyZ3MgPSAxOworCWFyZ3MuaW4uYXJnc1swXS5zaXplID0gc3RybGVuKG5hbWUpICsgMTsKKwlhcmdzLmluLmFyZ3NbMF0udmFsdWUgPSBuYW1lOworCWVyciA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZmMsICZhcmdzKTsKKwlpZiAoZXJyID09IC1FTk9TWVMpIHsKKwkJZmMtPm5vX3JlbW92ZXhhdHRyID0gMTsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJfQorCWlmICghZXJyKSB7CisJCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsKKwkJZnVzZV91cGRhdGVfY3RpbWUoaW5vZGUpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGZ1c2VfeGF0dHJfZ2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLAorCQkJIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSBjb25zdCBjaGFyICpuYW1lLCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpCit7CisJcmV0dXJuIGZ1c2VfZ2V0eGF0dHIoaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplKTsKK30KKworc3RhdGljIGludCBmdXNlX3hhdHRyX3NldChjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciwKKwkJCSAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsCisJCQkgIGludCBmbGFncykKK3sKKwlpZiAoIXZhbHVlKQorCQlyZXR1cm4gZnVzZV9yZW1vdmV4YXR0cihpbm9kZSwgbmFtZSk7CisKKwlyZXR1cm4gZnVzZV9zZXR4YXR0cihpbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIGZ1c2VfeGF0dHJfaGFuZGxlciA9IHsKKwkucHJlZml4ID0gIiIsCisJLmdldCAgICA9IGZ1c2VfeGF0dHJfZ2V0LAorCS5zZXQgICAgPSBmdXNlX3hhdHRyX3NldCwKK307CisKK2NvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpmdXNlX3hhdHRyX2hhbmRsZXJzW10gPSB7CisJJmZ1c2VfeGF0dHJfaGFuZGxlciwKKwlOVUxMCit9OworCitjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqZnVzZV9hY2xfeGF0dHJfaGFuZGxlcnNbXSA9IHsKKwkmcG9zaXhfYWNsX2FjY2Vzc194YXR0cl9oYW5kbGVyLAorCSZwb3NpeF9hY2xfZGVmYXVsdF94YXR0cl9oYW5kbGVyLAorCSZmdXNlX3hhdHRyX2hhbmRsZXIsCisJTlVMTAorfTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvYW9wcy5jIGIvZnMvZ2ZzMi9hb3BzLmMKaW5kZXggODJkZjM2OC4uNWE2ZjUyZSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9hb3BzLmMKKysrIGIvZnMvZ2ZzMi9hb3BzLmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogCQlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOwogCQlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKIAkJCWNyZWF0ZV9lbXB0eV9idWZmZXJzKHBhZ2UsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwKLQkJCQkJICAgICAoMSA8PCBCSF9EaXJ0eSl8KDEgPDwgQkhfVXB0b2RhdGUpKTsKKwkJCQkJICAgICBCSVQoQkhfRGlydHkpfEJJVChCSF9VcHRvZGF0ZSkpOwogCQl9CiAJCWdmczJfcGFnZV9hZGRfZGF0YWJ1ZnMoaXAsIHBhZ2UsIDAsIHNkcC0+c2RfdmZzLT5zX2Jsb2Nrc2l6ZS0xKTsKIAl9CkBAIC0xMTQ3LDYgKzExNDcsMTYgQEAKIAlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCiAJCXJldHVybiAwOwogCisJLyoKKwkgKiBGcm9tIHhmc192bV9yZWxlYXNlcGFnZTogbW0gYWNjb21tb2RhdGVzIGFuIG9sZCBleHQzIGNhc2Ugd2hlcmUKKwkgKiBjbGVhbiBwYWdlcyBtaWdodCBub3QgaGF2ZSBoYWQgdGhlIGRpcnR5IGJpdCBjbGVhcmVkLiAgVGh1cywgaXQgY2FuCisJICogc2VuZCBhY3R1YWwgZGlydHkgcGFnZXMgdG8gLT5yZWxlYXNlcGFnZSgpIHZpYSBzaHJpbmtfYWN0aXZlX2xpc3QoKS4KKwkgKgorCSAqIEFzIGEgd29ya2Fyb3VuZCwgd2Ugc2tpcCBwYWdlcyB0aGF0IGNvbnRhaW4gZGlydHkgYnVmZmVycyBiZWxvdy4KKwkgKiBPbmNlIC0+cmVsZWFzZXBhZ2UgaXNuJ3QgY2FsbGVkIG9uIGRpcnR5IHBhZ2VzIGFueW1vcmUsIHdlIGNhbiB3YXJuCisJICogb24gZGlydHkgYnVmZmVycyBsaWtlIHdlIHVzZWQgdG8gaGVyZSBhZ2Fpbi4KKwkgKi8KKwogCWdmczJfbG9nX2xvY2soc2RwKTsKIAlzcGluX2xvY2soJnNkcC0+c2RfYWlsX2xvY2spOwogCWhlYWQgPSBiaCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKQEAgLTExNTYsOCArMTE2Niw4IEBACiAJCWJkID0gYmgtPmJfcHJpdmF0ZTsKIAkJaWYgKGJkICYmIGJkLT5iZF90cikKIAkJCWdvdG8gY2Fubm90X3JlbGVhc2U7Ci0JCWlmIChidWZmZXJfcGlubmVkKGJoKSB8fCBidWZmZXJfZGlydHkoYmgpKQotCQkJZ290byBub3RfcG9zc2libGU7CisJCWlmIChidWZmZXJfZGlydHkoYmgpIHx8IFdBUk5fT04oYnVmZmVyX3Bpbm5lZChiaCkpKQorCQkJZ290byBjYW5ub3RfcmVsZWFzZTsKIAkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CiAJfSB3aGlsZShiaCAhPSBoZWFkKTsKIAlzcGluX3VubG9jaygmc2RwLT5zZF9haWxfbG9jayk7CkBAIC0xMTgwLDkgKzExOTAsNiBAQAogCiAJcmV0dXJuIHRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSk7CiAKLW5vdF9wb3NzaWJsZTogLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotCVdBUk5fT04oYnVmZmVyX2RpcnR5KGJoKSk7Ci0JV0FSTl9PTihidWZmZXJfcGlubmVkKGJoKSk7CiBjYW5ub3RfcmVsZWFzZToKIAlzcGluX3VubG9jaygmc2RwLT5zZF9haWxfbG9jayk7CiAJZ2ZzMl9sb2dfdW5sb2NrKHNkcCk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2JtYXAuYyBiL2ZzL2dmczIvYm1hcC5jCmluZGV4IDZlMmJlYzEuLjY0NTcyMWYgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvYm1hcC5jCisrKyBiL2ZzL2dmczIvYm1hcC5jCkBAIC04Miw4ICs4Miw4IEBACiAJfQogCiAJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQotCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCAxIDw8IGlub2RlLT5pX2Jsa2JpdHMsCi0JCQkJICAgICAoMSA8PCBCSF9VcHRvZGF0ZSkpOworCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBCSVQoaW5vZGUtPmlfYmxrYml0cyksCisJCQkJICAgICBCSVQoQkhfVXB0b2RhdGUpKTsKIAogCWJoID0gcGFnZV9idWZmZXJzKHBhZ2UpOwogCkBAIC02OTAsNyArNjkwLDcgQEAKIAlCVUdfT04oIWRibG9jayk7CiAJQlVHX09OKCFuZXcpOwogCi0JYmguYl9zaXplID0gMSA8PCAoaW5vZGUtPmlfYmxrYml0cyArIChjcmVhdGUgPyAwIDogNSkpOworCWJoLmJfc2l6ZSA9IEJJVChpbm9kZS0+aV9ibGtiaXRzICsgKGNyZWF0ZSA/IDAgOiA1KSk7CiAJcmV0ID0gZ2ZzMl9ibG9ja19tYXAoaW5vZGUsIGxibG9jaywgJmJoLCBjcmVhdGUpOwogCSpleHRsZW4gPSBiaC5iX3NpemUgPj4gaW5vZGUtPmlfYmxrYml0czsKIAkqZGJsb2NrID0gYmguYl9ibG9ja25yOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9kaXIuYyBiL2ZzL2dmczIvZGlyLmMKaW5kZXggZmNiNTliMi4uZGI4ZmJlYiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9kaXIuYworKysgYi9mcy9nZnMyL2Rpci5jCkBAIC0zNTEsNyArMzUxLDcgQEAKIAlpZiAoaGMpCiAJCXJldHVybiBoYzsKIAotCWhzaXplID0gMSA8PCBpcC0+aV9kZXB0aDsKKwloc2l6ZSA9IEJJVChpcC0+aV9kZXB0aCk7CiAJaHNpemUgKj0gc2l6ZW9mKF9fYmU2NCk7CiAJaWYgKGhzaXplICE9IGlfc2l6ZV9yZWFkKCZpcC0+aV9pbm9kZSkpIHsKIAkJZ2ZzMl9jb25zaXN0X2lub2RlKGlwKTsKQEAgLTgxOSw4ICs4MTksOCBAQAogCiAJaWYgKGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX0VYSEFTSCkgewogCQlzdHJ1Y3QgZ2ZzMl9sZWFmICpsZWFmOwotCQl1bnNpZ25lZCBoc2l6ZSA9IDEgPDwgaXAtPmlfZGVwdGg7Ci0JCXVuc2lnbmVkIGluZGV4OworCQl1bnNpZ25lZCBpbnQgaHNpemUgPSBCSVQoaXAtPmlfZGVwdGgpOworCQl1bnNpZ25lZCBpbnQgaW5kZXg7CiAJCXU2NCBsbjsKIAkJaWYgKGhzaXplICogc2l6ZW9mKHU2NCkgIT0gaV9zaXplX3JlYWQoaW5vZGUpKSB7CiAJCQlnZnMyX2NvbnNpc3RfaW5vZGUoaXApOwpAQCAtOTMyLDcgKzkzMiw3IEBACiAJCXJldHVybiAtRU5PU1BDOwogCWJuID0gYmgtPmJfYmxvY2tucjsKIAotCWdmczJfYXNzZXJ0KHNkcCwgZGlwLT5pX2VudHJpZXMgPCAoMSA8PCAxNikpOworCWdmczJfYXNzZXJ0KHNkcCwgZGlwLT5pX2VudHJpZXMgPCBCSVQoMTYpKTsKIAlsZWFmLT5sZl9lbnRyaWVzID0gY3B1X3RvX2JlMTYoZGlwLT5pX2VudHJpZXMpOwogCiAJLyogIENvcHkgZGlyZW50cyAgKi8KQEAgLTEwNDEsNyArMTA0MSw3IEBACiAJYm4gPSBuYmgtPmJfYmxvY2tucjsKIAogCS8qICBDb21wdXRlIHRoZSBzdGFydCBhbmQgbGVuIG9mIGxlYWYgcG9pbnRlcnMgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotCWxlbiA9IDEgPDwgKGRpcC0+aV9kZXB0aCAtIGJlMTZfdG9fY3B1KG9sZWFmLT5sZl9kZXB0aCkpOworCWxlbiA9IEJJVChkaXAtPmlfZGVwdGggLSBiZTE2X3RvX2NwdShvbGVhZi0+bGZfZGVwdGgpKTsKIAloYWxmX2xlbiA9IGxlbiA+PiAxOwogCWlmICghaGFsZl9sZW4pIHsKIAkJcHJfd2FybigiaV9kZXB0aCAldSBsZl9kZXB0aCAldSBpbmRleCAldVxuIiwKQEAgLTExNjMsNyArMTE2Myw3IEBACiAJaW50IHg7CiAJaW50IGVycm9yID0gMDsKIAotCWhzaXplID0gMSA8PCBkaXAtPmlfZGVwdGg7CisJaHNpemUgPSBCSVQoZGlwLT5pX2RlcHRoKTsKIAloc2l6ZV9ieXRlcyA9IGhzaXplICogc2l6ZW9mKF9fYmU2NCk7CiAKIAloYyA9IGdmczJfZGlyX2dldF9oYXNoX3RhYmxlKGRpcCk7CkBAIC0xNTM5LDcgKzE1MzksNyBAQAogCWludCBlcnJvciA9IDA7CiAJdW5zaWduZWQgZGVwdGggPSAwOwogCi0JaHNpemUgPSAxIDw8IGRpcC0+aV9kZXB0aDsKKwloc2l6ZSA9IEJJVChkaXAtPmlfZGVwdGgpOwogCWhhc2ggPSBnZnMyX2Rpcl9vZmZzZXQyaGFzaChjdHgtPnBvcyk7CiAJaW5kZXggPSBoYXNoID4+ICgzMiAtIGRpcC0+aV9kZXB0aCk7CiAKQEAgLTE1NTgsNyArMTU1OCw3IEBACiAJCWlmIChlcnJvcikKIAkJCWJyZWFrOwogCi0JCWxlbiA9IDEgPDwgKGRpcC0+aV9kZXB0aCAtIGRlcHRoKTsKKwkJbGVuID0gQklUKGRpcC0+aV9kZXB0aCAtIGRlcHRoKTsKIAkJaW5kZXggPSAoaW5kZXggJiB+KGxlbiAtIDEpKSArIGxlbjsKIAl9CiAKQEAgLTIxMTMsNyArMjExMyw3IEBACiAJdTY0IGxlYWZfbm87CiAJaW50IGVycm9yID0gMCwgbGFzdDsKIAotCWhzaXplID0gMSA8PCBkaXAtPmlfZGVwdGg7CisJaHNpemUgPSBCSVQoZGlwLT5pX2RlcHRoKTsKIAogCWxwID0gZ2ZzMl9kaXJfZ2V0X2hhc2hfdGFibGUoZGlwKTsKIAlpZiAoSVNfRVJSKGxwKSkKQEAgLTIxMjYsNyArMjEyNiw3IEBACiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBvdXQ7CiAJCQlsZWFmID0gKHN0cnVjdCBnZnMyX2xlYWYgKiliaC0+Yl9kYXRhOwotCQkJbGVuID0gMSA8PCAoZGlwLT5pX2RlcHRoIC0gYmUxNl90b19jcHUobGVhZi0+bGZfZGVwdGgpKTsKKwkJCWxlbiA9IEJJVChkaXAtPmlfZGVwdGggLSBiZTE2X3RvX2NwdShsZWFmLT5sZl9kZXB0aCkpOwogCiAJCQluZXh0X2luZGV4ID0gKGluZGV4ICYgfihsZW4gLSAxKSkgKyBsZW47CiAJCQlsYXN0ID0gKChuZXh0X2luZGV4ID49IGhzaXplKSA/IDEgOiAwKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZmlsZS5jIGIvZnMvZ2ZzMi9maWxlLmMKaW5kZXggMzIwZTY1ZS4uMzYwMTg4ZiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9maWxlLmMKKysrIGIvZnMvZ2ZzMi9maWxlLmMKQEAgLTM5NSw5ICszOTUsNiBAQAogCiAJc2Jfc3RhcnRfcGFnZWZhdWx0KGlub2RlLT5pX3NiKTsKIAotCS8qIFVwZGF0ZSBmaWxlIHRpbWVzIGJlZm9yZSB0YWtpbmcgcGFnZSBsb2NrICovCi0JZmlsZV91cGRhdGVfdGltZSh2bWEtPnZtX2ZpbGUpOwotCiAJcmV0ID0gZ2ZzMl9yc3FhX2FsbG9jKGlwKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKQEAgLTQwOSw2ICs0MDYsOSBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0X3VuaW5pdDsKIAorCS8qIFVwZGF0ZSBmaWxlIHRpbWVzIGJlZm9yZSB0YWtpbmcgcGFnZSBsb2NrICovCisJZmlsZV91cGRhdGVfdGltZSh2bWEtPnZtX2ZpbGUpOworCiAJc2V0X2JpdChHTEZfRElSVFksICZpcC0+aV9nbC0+Z2xfZmxhZ3MpOwogCXNldF9iaXQoR0lGX1NXX1BBR0VELCAmaXAtPmlfZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9mcy9nZnMyL2dsb2NrLmMgYi9mcy9nZnMyL2dsb2NrLmMKaW5kZXggM2E5MGIyYi4uMTRjYmY2MCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9nbG9jay5jCisrKyBiL2ZzL2dmczIvZ2xvY2suYwpAQCAtNjksNyArNjksNyBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhscnVfbG9jayk7CiAKICNkZWZpbmUgR0ZTMl9HTF9IQVNIX1NISUZUICAgICAgMTUKLSNkZWZpbmUgR0ZTMl9HTF9IQVNIX1NJWkUgICAgICAgKDEgPDwgR0ZTMl9HTF9IQVNIX1NISUZUKQorI2RlZmluZSBHRlMyX0dMX0hBU0hfU0laRSAgICAgICBCSVQoR0ZTMl9HTF9IQVNIX1NISUZUKQogCiBzdGF0aWMgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIGh0X3Bhcm1zID0gewogCS5uZWxlbV9oaW50ID0gR0ZTMl9HTF9IQVNIX1NJWkUgKiAzIC8gNCwKQEAgLTE3ODEsNyArMTc4MSwxMyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlyZWdpc3Rlcl9zaHJpbmtlcigmZ2xvY2tfc2hyaW5rZXIpOworCXJldCA9IHJlZ2lzdGVyX3Nocmlua2VyKCZnbG9ja19zaHJpbmtlcik7CisJaWYgKHJldCkgeworCQlkZXN0cm95X3dvcmtxdWV1ZShnZnMyX2RlbGV0ZV93b3JrcXVldWUpOworCQlkZXN0cm95X3dvcmtxdWV1ZShnbG9ja193b3JrcXVldWUpOworCQlyaGFzaHRhYmxlX2Rlc3Ryb3koJmdsX2hhc2hfdGFibGUpOworCQlyZXR1cm4gcmV0OworCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9pbm9kZS5jIGIvZnMvZ2ZzMi9pbm9kZS5jCmluZGV4IGU0ZGEwZWMuLmZiM2E4MTAgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvaW5vZGUuYworKysgYi9mcy9nZnMyL2lub2RlLmMKQEAgLTE4Nyw2ICsxODcsMTAgQEAKIAkJfQogCiAJCWdmczJfc2V0X2lvcChpbm9kZSk7CisKKwkJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gMDsKKwkJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7CisKIAkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CiAJfQogCmRpZmYgLS1naXQgYS9mcy9nZnMyL2lub2RlLmggYi9mcy9nZnMyL2lub2RlLmgKaW5kZXggNzcxMGRmZC4uYWFjZThjZSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9pbm9kZS5oCisrKyBiL2ZzL2dmczIvaW5vZGUuaApAQCAtODUsNyArODUsNyBAQAogCXU2NCBzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwogCWlmIChzaXplIDwgbWluc2l6ZSB8fCBzaXplID4gbWF4c2l6ZSkKIAkJZ290byBlcnI7Ci0JaWYgKHNpemUgJiAoKDEgPDwgaW5vZGUtPmlfYmxrYml0cykgLSAxKSkKKwlpZiAoc2l6ZSAmIChCSVQoaW5vZGUtPmlfYmxrYml0cykgLSAxKSkKIAkJZ290byBlcnI7CiAJcmV0dXJuIDA7CiBlcnI6CmRpZmYgLS1naXQgYS9mcy9nZnMyL21haW4uYyBiL2ZzL2dmczIvbWFpbi5jCmluZGV4IDc0ZmQwMTMuLjY3ZDFmYzQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbWFpbi5jCisrKyBiL2ZzL2dmczIvbWFpbi5jCkBAIC0xNDUsNyArMTQ1LDkgQEAKIAlpZiAoIWdmczJfcWFkYXRhX2NhY2hlcCkKIAkJZ290byBmYWlsOwogCi0JcmVnaXN0ZXJfc2hyaW5rZXIoJmdmczJfcWRfc2hyaW5rZXIpOworCWVycm9yID0gcmVnaXN0ZXJfc2hyaW5rZXIoJmdmczJfcWRfc2hyaW5rZXIpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsOwogCiAJZXJyb3IgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZnZnMyX2ZzX3R5cGUpOwogCWlmIChlcnJvcikKZGlmZiAtLWdpdCBhL2ZzL2dmczIvbWV0YV9pby5jIGIvZnMvZ2ZzMi9tZXRhX2lvLmMKaW5kZXggOTUwYjhiZS4uMzczNjM5YTUgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbWV0YV9pby5jCisrKyBiL2ZzL2dmczIvbWV0YV9pby5jCkBAIC0yMTYsMjMgKzIxNiwyNiBAQAogc3RhdGljIHZvaWQgZ2ZzMl9zdWJtaXRfYmhzKGludCBvcCwgaW50IG9wX2ZsYWdzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tdLAogCQkJICAgIGludCBudW0pCiB7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGJoc1swXTsKLQlzdHJ1Y3QgYmlvICpiaW87Ci0JaW50IGk7CisJd2hpbGUgKG51bSA+IDApIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9ICpiaHM7CisJCXN0cnVjdCBiaW8gKmJpbzsKIAotCWlmICghbnVtKQotCQlyZXR1cm47Ci0KLQliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIG51bSk7Ci0JYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IGJoLT5iX2Jsb2NrbnIgKiAoYmgtPmJfc2l6ZSA+PiA5KTsKLQliaW8tPmJpX2JkZXYgPSBiaC0+Yl9iZGV2OwotCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQliaCA9IGJoc1tpXTsKLQkJYmlvX2FkZF9wYWdlKGJpbywgYmgtPmJfcGFnZSwgYmgtPmJfc2l6ZSwgYmhfb2Zmc2V0KGJoKSk7CisJCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9JTywgbnVtKTsKKwkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IGJoLT5iX2Jsb2NrbnIgKiAoYmgtPmJfc2l6ZSA+PiA5KTsKKwkJYmlvLT5iaV9iZGV2ID0gYmgtPmJfYmRldjsKKwkJd2hpbGUgKG51bSA+IDApIHsKKwkJCWJoID0gKmJoczsKKwkJCWlmICghYmlvX2FkZF9wYWdlKGJpbywgYmgtPmJfcGFnZSwgYmgtPmJfc2l6ZSwgYmhfb2Zmc2V0KGJoKSkpIHsKKwkJCQlCVUdfT04oYmlvLT5iaV9pdGVyLmJpX3NpemUgPT0gMCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQliaHMrKzsKKwkJCW51bS0tOworCQl9CisJCWJpby0+YmlfZW5kX2lvID0gZ2ZzMl9tZXRhX3JlYWRfZW5kaW87CisJCWJpb19zZXRfb3BfYXR0cnMoYmlvLCBvcCwgb3BfZmxhZ3MpOworCQlzdWJtaXRfYmlvKGJpbyk7CiAJfQotCWJpby0+YmlfZW5kX2lvID0gZ2ZzMl9tZXRhX3JlYWRfZW5kaW87Ci0JYmlvX3NldF9vcF9hdHRycyhiaW8sIG9wLCBvcF9mbGFncyk7Ci0Jc3VibWl0X2JpbyhiaW8pOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKaW5kZXggZWYxZTE4Mi4uZmY3MmFjNiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKKysrIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKQEAgLTU4LDcgKzU4LDcgQEAKIAlndC0+Z3RfcXVvdGFfc2NhbGVfbnVtID0gMTsKIAlndC0+Z3RfcXVvdGFfc2NhbGVfZGVuID0gMTsKIAlndC0+Z3RfbmV3X2ZpbGVzX2pkYXRhID0gMDsKLQlndC0+Z3RfbWF4X3JlYWRhaGVhZCA9IDEgPDwgMTg7CisJZ3QtPmd0X21heF9yZWFkYWhlYWQgPSBCSVQoMTgpOwogCWd0LT5ndF9jb21wbGFpbl9zZWNzID0gMTA7CiB9CiAKQEAgLTI4NCw3ICsyODQsNyBAQAogCiAJc2RwLT5zZF9mc2IyYmJfc2hpZnQgPSBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0IC0KIAkJCSAgICAgICBHRlMyX0JBU0lDX0JMT0NLX1NISUZUOwotCXNkcC0+c2RfZnNiMmJiID0gMSA8PCBzZHAtPnNkX2ZzYjJiYl9zaGlmdDsKKwlzZHAtPnNkX2ZzYjJiYiA9IEJJVChzZHAtPnNkX2ZzYjJiYl9zaGlmdCk7CiAJc2RwLT5zZF9kaXB0cnMgPSAoc2RwLT5zZF9zYi5zYl9ic2l6ZSAtCiAJCQkgIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpKSAvIHNpemVvZih1NjQpOwogCXNkcC0+c2RfaW5wdHJzID0gKHNkcC0+c2Rfc2Iuc2JfYnNpemUgLQpAQCAtMzAyLDcgKzMwMiw3IEBACiAKIAkvKiBDb21wdXRlIG1heGltdW0gcmVzZXJ2YXRpb24gcmVxdWlyZWQgdG8gYWRkIGEgZW50cnkgdG8gYSBkaXJlY3RvcnkgKi8KIAotCWhhc2hfYmxvY2tzID0gRElWX1JPVU5EX1VQKHNpemVvZih1NjQpICogKDEgPDwgR0ZTMl9ESVJfTUFYX0RFUFRIKSwKKwloYXNoX2Jsb2NrcyA9IERJVl9ST1VORF9VUChzaXplb2YodTY0KSAqIEJJVChHRlMyX0RJUl9NQVhfREVQVEgpLAogCQkJICAgICBzZHAtPnNkX2pic2l6ZSk7CiAKIAlpbmRfYmxvY2tzID0gMDsKQEAgLTEwODksNyArMTA4OSw3IEBACiAJc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdCA9IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCXNkcC0+c2RfZnNiMmJiX3NoaWZ0ID0gc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdCAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZTMl9CQVNJQ19CTE9DS19TSElGVDsKLQlzZHAtPnNkX2ZzYjJiYiA9IDEgPDwgc2RwLT5zZF9mc2IyYmJfc2hpZnQ7CisJc2RwLT5zZF9mc2IyYmIgPSBCSVQoc2RwLT5zZF9mc2IyYmJfc2hpZnQpOwogCiAJc2RwLT5zZF90dW5lLmd0X2xvZ2Rfc2VjcyA9IHNkcC0+c2RfYXJncy5hcl9jb21taXQ7CiAJc2RwLT5zZF90dW5lLmd0X3F1b3RhX3F1YW50dW0gPSBzZHAtPnNkX2FyZ3MuYXJfcXVvdGFfcXVhbnR1bTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvcXVvdGEuYyBiL2ZzL2dmczIvcXVvdGEuYwppbmRleCA3NzkzMGNhLi44YWYyZGZhIDEwMDY0NAotLS0gYS9mcy9nZnMyL3F1b3RhLmMKKysrIGIvZnMvZ2ZzMi9xdW90YS5jCkBAIC03NSw3ICs3NSw3IEBACiAjaW5jbHVkZSAidXRpbC5oIgogCiAjZGVmaW5lIEdGUzJfUURfSEFTSF9TSElGVCAgICAgIDEyCi0jZGVmaW5lIEdGUzJfUURfSEFTSF9TSVpFICAgICAgICgxIDw8IEdGUzJfUURfSEFTSF9TSElGVCkKKyNkZWZpbmUgR0ZTMl9RRF9IQVNIX1NJWkUgICAgICAgQklUKEdGUzJfUURfSEFTSF9TSElGVCkKICNkZWZpbmUgR0ZTMl9RRF9IQVNIX01BU0sgICAgICAgKEdGUzJfUURfSEFTSF9TSVpFIC0gMSkKIAogLyogTG9jayBvcmRlcjogcWRfbG9jayAtPiBidWNrZXQgbG9jayAtPiBxZC0+bG9ja3JlZi5sb2NrIC0+IGxydSBsb2NrICovCkBAIC0zODQsNyArMzg0LDcgQEAKIAlibG9jayA9IHFkLT5xZF9zbG90IC8gc2RwLT5zZF9xY19wZXJfYmxvY2s7CiAJb2Zmc2V0ID0gcWQtPnFkX3Nsb3QgJSBzZHAtPnNkX3FjX3Blcl9ibG9jazsKIAotCWJoX21hcC5iX3NpemUgPSAxIDw8IGlwLT5pX2lub2RlLmlfYmxrYml0czsKKwliaF9tYXAuYl9zaXplID0gQklUKGlwLT5pX2lub2RlLmlfYmxrYml0cyk7CiAJZXJyb3IgPSBnZnMyX2Jsb2NrX21hcCgmaXAtPmlfaW5vZGUsIGJsb2NrLCAmYmhfbWFwLCAwKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZmFpbDsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvc3VwZXIuYyBiL2ZzL2dmczIvc3VwZXIuYwppbmRleCAzYTdlNjBiLi5lM2VlMzg3IDEwMDY0NAotLS0gYS9mcy9nZnMyL3N1cGVyLmMKKysrIGIvZnMvZ2ZzMi9zdXBlci5jCkBAIC0zNTksNyArMzU5LDcgQEAKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoamQtPmpkX2lub2RlKTsKIAl1NjQgc2l6ZSA9IGlfc2l6ZV9yZWFkKGpkLT5qZF9pbm9kZSk7CiAKLQlpZiAoZ2ZzMl9jaGVja19pbnRlcm5hbF9maWxlX3NpemUoamQtPmpkX2lub2RlLCA4IDw8IDIwLCAxIDw8IDMwKSkKKwlpZiAoZ2ZzMl9jaGVja19pbnRlcm5hbF9maWxlX3NpemUoamQtPmpkX2lub2RlLCA4IDw8IDIwLCBCSVQoMzApKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlqZC0+amRfYmxvY2tzID0gc2l6ZSA+PiBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0OwpkaWZmIC0tZ2l0IGEvZnMvaW9jdGwuYyBiL2ZzL2lvY3RsLmMKaW5kZXggMGY1NmRlYi4uYzQxNTY2OCAxMDA2NDQKLS0tIGEvZnMvaW9jdGwuYworKysgYi9mcy9pb2N0bC5jCkBAIC01NjgsNyArNTY4LDcgQEAKIAlyZXR1cm4gdGhhd19zdXBlcihzYik7CiB9CiAKLXN0YXRpYyBsb25nIGlvY3RsX2ZpbGVfZGVkdXBlX3JhbmdlKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBpb2N0bF9maWxlX2RlZHVwZV9yYW5nZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgZmlsZV9kZWR1cGVfcmFuZ2UgX191c2VyICphcmdwID0gYXJnOwogCXN0cnVjdCBmaWxlX2RlZHVwZV9yYW5nZSAqc2FtZSA9IE5VTEw7CkBAIC01ODIsNiArNTgyLDEwIEBACiAJfQogCiAJc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBmaWxlX2RlZHVwZV9yYW5nZSBfX3VzZXIsIGluZm9bY291bnRdKTsKKwlpZiAoc2l6ZSA+IFBBR0VfU0laRSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CiAKIAlzYW1lID0gbWVtZHVwX3VzZXIoYXJncCwgc2l6ZSk7CiAJaWYgKElTX0VSUihzYW1lKSkgewpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc190eG5tZ3IuYyBiL2ZzL2pmcy9qZnNfdHhubWdyLmMKaW5kZXggMmU1ODk3OC4uNGQ5NzM1MjQgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfdHhubWdyLmMKKysrIGIvZnMvamZzL2pmc190eG5tZ3IuYwpAQCAtMjg5Myw4ICsyODkzLDcgQEAKIAkgKiBvbiBhbm9uX2xpc3QyLiAgTGV0J3MgY2hlY2suCiAJICovCiAJaWYgKCFsaXN0X2VtcHR5KCZUeEFuY2hvci5hbm9uX2xpc3QyKSkgewotCQlsaXN0X3NwbGljZSgmVHhBbmNob3IuYW5vbl9saXN0MiwgJlR4QW5jaG9yLmFub25fbGlzdCk7Ci0JCUlOSVRfTElTVF9IRUFEKCZUeEFuY2hvci5hbm9uX2xpc3QyKTsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmVHhBbmNob3IuYW5vbl9saXN0MiwgJlR4QW5jaG9yLmFub25fbGlzdCk7CiAJCWdvdG8gcmVzdGFydDsKIAl9CiAJVFhOX1VOTE9DSygpOwpkaWZmIC0tZ2l0IGEvZnMvamZzL3Jlc2l6ZS5jIGIvZnMvamZzL3Jlc2l6ZS5jCmluZGV4IDkwYjNiYzIuLmJkOWI2NDEgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9yZXNpemUuYworKysgYi9mcy9qZnMvcmVzaXplLmMKQEAgLTM3OSw4ICszNzksMTQgQEAKIAkgKiBjYWNoZWQgaW4gbWV0YS1kYXRhIGNhY2hlLCBhbmQgbm90IHdyaXR0ZW4gb3V0CiAJICogYnkgdHhDb21taXQoKTsKIAkgKi8KLQlmaWxlbWFwX2ZkYXRhd2FpdChpcGJtYXAtPmlfbWFwcGluZyk7Ci0JZmlsZW1hcF93cml0ZV9hbmRfd2FpdChpcGJtYXAtPmlfbWFwcGluZyk7CisJcmMgPSBmaWxlbWFwX2ZkYXRhd2FpdChpcGJtYXAtPmlfbWFwcGluZyk7CisJaWYgKHJjKQorCQlnb3RvIGVycm9yX291dDsKKworCXJjID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdChpcGJtYXAtPmlfbWFwcGluZyk7CisJaWYgKHJjKQorCQlnb3RvIGVycm9yX291dDsKKwogCWRpV3JpdGVTcGVjaWFsKGlwYm1hcCwgMCk7CiAKIAluZXdQYWdlID0gblBhZ2VzOwkvKiBmaXJzdCBuZXcgcGFnZSBudW1iZXIgKi8KZGlmZiAtLWdpdCBhL2ZzL2tlcm5mcy9maWxlLmMgYi9mcy9rZXJuZnMvZmlsZS5jCmluZGV4IGUxNTc0MDAuLjJiY2I4NmUgMTAwNjQ0Ci0tLSBhL2ZzL2tlcm5mcy9maWxlLmMKKysrIGIvZnMva2VybmZzL2ZpbGUuYwpAQCAtODQwLDIxICs4NDAsMzUgQEAKIAltdXRleF9sb2NrKCZrZXJuZnNfbXV0ZXgpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpbmZvLCAma2VybmZzX3Jvb3Qoa24pLT5zdXBlcnMsIG5vZGUpIHsKKwkJc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQ7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0JCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAorCQkvKgorCQkgKiBXZSB3YW50IGZzbm90aWZ5X21vZGlmeSgpIG9uIEBrbiBidXQgYXMgdGhlCisJCSAqIG1vZGlmaWNhdGlvbnMgYXJlbid0IG9yaWdpbmF0aW5nIGZyb20gdXNlcmxhbmQgZG9uJ3QKKwkJICogaGF2ZSB0aGUgbWF0Y2hpbmcgQGZpbGUgYXZhaWxhYmxlLiAgTG9vayB1cCB0aGUgaW5vZGVzCisJCSAqIGFuZCBnZW5lcmF0ZSB0aGUgZXZlbnRzIG1hbnVhbGx5LgorCQkgKi8KIAkJaW5vZGUgPSBpbG9va3VwKGluZm8tPnNiLCBrbi0+aW5vKTsKIAkJaWYgKCFpbm9kZSkKIAkJCWNvbnRpbnVlOwogCi0JCWRlbnRyeSA9IGRfZmluZF9hbnlfYWxpYXMoaW5vZGUpOwotCQlpZiAoZGVudHJ5KSB7Ci0JCQlmc25vdGlmeV9wYXJlbnQoTlVMTCwgZGVudHJ5LCBGU19NT0RJRlkpOwotCQkJZnNub3RpZnkoaW5vZGUsIEZTX01PRElGWSwgaW5vZGUsIEZTTk9USUZZX0VWRU5UX0lOT0RFLAotCQkJCSBOVUxMLCAwKTsKLQkJCWRwdXQoZGVudHJ5KTsKKwkJcGFyZW50ID0ga2VybmZzX2dldF9wYXJlbnQoa24pOworCQlpZiAocGFyZW50KSB7CisJCQlzdHJ1Y3QgaW5vZGUgKnBfaW5vZGU7CisKKwkJCXBfaW5vZGUgPSBpbG9va3VwKGluZm8tPnNiLCBwYXJlbnQtPmlubyk7CisJCQlpZiAocF9pbm9kZSkgeworCQkJCWZzbm90aWZ5KHBfaW5vZGUsIEZTX01PRElGWSB8IEZTX0VWRU5UX09OX0NISUxELAorCQkJCQkgaW5vZGUsIEZTTk9USUZZX0VWRU5UX0lOT0RFLCBrbi0+bmFtZSwgMCk7CisJCQkJaXB1dChwX2lub2RlKTsKKwkJCX0KKworCQkJa2VybmZzX3B1dChwYXJlbnQpOwogCQl9CiAKKwkJZnNub3RpZnkoaW5vZGUsIEZTX01PRElGWSwgaW5vZGUsIEZTTk9USUZZX0VWRU5UX0lOT0RFLAorCQkJIGtuLT5uYW1lLCAwKTsKIAkJaXB1dChpbm9kZSk7CiAJfQogCmRpZmYgLS1naXQgYS9mcy9sb2Nrcy5jIGIvZnMvbG9ja3MuYwppbmRleCBlZTFiMTVmLi45MGVjNjcxIDEwMDY0NAotLS0gYS9mcy9sb2Nrcy5jCisrKyBiL2ZzL2xvY2tzLmMKQEAgLTEyNyw3ICsxMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9oYXNodGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9sZ2xvY2suaD4KIAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2ZpbGVsb2NrLmg+CkBAIC0xNTgsMTIgKzE1NywxOCBAQAogCiAvKgogICogVGhlIGdsb2JhbCBmaWxlX2xvY2tfbGlzdCBpcyBvbmx5IHVzZWQgZm9yIGRpc3BsYXlpbmcgL3Byb2MvbG9ja3MsIHNvIHdlCi0gKiBrZWVwIGEgbGlzdCBvbiBlYWNoIENQVSwgd2l0aCBlYWNoIGxpc3QgcHJvdGVjdGVkIGJ5IGl0cyBvd24gc3BpbmxvY2sgdmlhCi0gKiB0aGUgZmlsZV9sb2NrX2xnbG9jay4gTm90ZSB0aGF0IGFsdGVyYXRpb25zIHRvIHRoZSBsaXN0IGFsc28gcmVxdWlyZSB0aGF0Ci0gKiB0aGUgcmVsZXZhbnQgZmxjX2xvY2sgaXMgaGVsZC4KKyAqIGtlZXAgYSBsaXN0IG9uIGVhY2ggQ1BVLCB3aXRoIGVhY2ggbGlzdCBwcm90ZWN0ZWQgYnkgaXRzIG93biBzcGlubG9jay4KKyAqIEdsb2JhbCBzZXJpYWxpemF0aW9uIGlzIGRvbmUgdXNpbmcgZmlsZV9yd3NlbS4KKyAqCisgKiBOb3RlIHRoYXQgYWx0ZXJhdGlvbnMgdG8gdGhlIGxpc3QgYWxzbyByZXF1aXJlIHRoYXQgdGhlIHJlbGV2YW50IGZsY19sb2NrIGlzCisgKiBoZWxkLgogICovCi1ERUZJTkVfU1RBVElDX0xHTE9DSyhmaWxlX2xvY2tfbGdsb2NrKTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaGxpc3RfaGVhZCwgZmlsZV9sb2NrX2xpc3QpOworc3RydWN0IGZpbGVfbG9ja19saXN0X3N0cnVjdCB7CisJc3BpbmxvY2tfdAkJbG9jazsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAlobGlzdDsKK307CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGZpbGVfbG9ja19saXN0X3N0cnVjdCwgZmlsZV9sb2NrX2xpc3QpOworREVGSU5FX1NUQVRJQ19QRVJDUFVfUldTRU0oZmlsZV9yd3NlbSk7CiAKIC8qCiAgKiBUaGUgYmxvY2tlZF9oYXNoIGlzIHVzZWQgdG8gZmluZCBQT1NJWCBsb2NrIGxvb3BzIGZvciBkZWFkbG9jayBkZXRlY3Rpb24uCkBAIC01ODcsMTUgKzU5MiwyMyBAQAogLyogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgZmxjX2xvY2sgaGVsZCEgKi8KIHN0YXRpYyB2b2lkIGxvY2tzX2luc2VydF9nbG9iYWxfbG9ja3Moc3RydWN0IGZpbGVfbG9jayAqZmwpCiB7Ci0JbGdfbG9jYWxfbG9jaygmZmlsZV9sb2NrX2xnbG9jayk7CisJc3RydWN0IGZpbGVfbG9ja19saXN0X3N0cnVjdCAqZmxsID0gdGhpc19jcHVfcHRyKCZmaWxlX2xvY2tfbGlzdCk7CisKKwlwZXJjcHVfcndzZW1fYXNzZXJ0X2hlbGQoJmZpbGVfcndzZW0pOworCisJc3Bpbl9sb2NrKCZmbGwtPmxvY2spOwogCWZsLT5mbF9saW5rX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlobGlzdF9hZGRfaGVhZCgmZmwtPmZsX2xpbmssIHRoaXNfY3B1X3B0cigmZmlsZV9sb2NrX2xpc3QpKTsKLQlsZ19sb2NhbF91bmxvY2soJmZpbGVfbG9ja19sZ2xvY2spOworCWhsaXN0X2FkZF9oZWFkKCZmbC0+ZmxfbGluaywgJmZsbC0+aGxpc3QpOworCXNwaW5fdW5sb2NrKCZmbGwtPmxvY2spOwogfQogCiAvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBmbGNfbG9jayBoZWxkISAqLwogc3RhdGljIHZvaWQgbG9ja3NfZGVsZXRlX2dsb2JhbF9sb2NrcyhzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKIHsKKwlzdHJ1Y3QgZmlsZV9sb2NrX2xpc3Rfc3RydWN0ICpmbGw7CisKKwlwZXJjcHVfcndzZW1fYXNzZXJ0X2hlbGQoJmZpbGVfcndzZW0pOworCiAJLyoKIAkgKiBBdm9pZCB0YWtpbmcgbG9jayBpZiBhbHJlYWR5IHVuaGFzaGVkLiBUaGlzIGlzIHNhZmUgc2luY2UgdGhpcyBjaGVjawogCSAqIGlzIGRvbmUgd2hpbGUgaG9sZGluZyB0aGUgZmxjX2xvY2ssIGFuZCBuZXcgaW5zZXJ0aW9ucyBpbnRvIHRoZSBsaXN0CkBAIC02MDMsOSArNjE2LDExIEBACiAJICovCiAJaWYgKGhsaXN0X3VuaGFzaGVkKCZmbC0+ZmxfbGluaykpCiAJCXJldHVybjsKLQlsZ19sb2NhbF9sb2NrX2NwdSgmZmlsZV9sb2NrX2xnbG9jaywgZmwtPmZsX2xpbmtfY3B1KTsKKworCWZsbCA9IHBlcl9jcHVfcHRyKCZmaWxlX2xvY2tfbGlzdCwgZmwtPmZsX2xpbmtfY3B1KTsKKwlzcGluX2xvY2soJmZsbC0+bG9jayk7CiAJaGxpc3RfZGVsX2luaXQoJmZsLT5mbF9saW5rKTsKLQlsZ19sb2NhbF91bmxvY2tfY3B1KCZmaWxlX2xvY2tfbGdsb2NrLCBmbC0+ZmxfbGlua19jcHUpOworCXNwaW5fdW5sb2NrKCZmbGwtPmxvY2spOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZwpAQCAtOTE1LDYgKzkzMCw3IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwlwZXJjcHVfZG93bl9yZWFkX3ByZWVtcHRfZGlzYWJsZSgmZmlsZV9yd3NlbSk7CiAJc3Bpbl9sb2NrKCZjdHgtPmZsY19sb2NrKTsKIAlpZiAocmVxdWVzdC0+ZmxfZmxhZ3MgJiBGTF9BQ0NFU1MpCiAJCWdvdG8gZmluZF9jb25mbGljdDsKQEAgLTk1NSw2ICs5NzEsNyBAQAogCiBvdXQ6CiAJc3Bpbl91bmxvY2soJmN0eC0+ZmxjX2xvY2spOworCXBlcmNwdV91cF9yZWFkX3ByZWVtcHRfZW5hYmxlKCZmaWxlX3J3c2VtKTsKIAlpZiAobmV3X2ZsKQogCQlsb2Nrc19mcmVlX2xvY2sobmV3X2ZsKTsKIAlsb2Nrc19kaXNwb3NlX2xpc3QoJmRpc3Bvc2UpOwpAQCAtOTkxLDYgKzEwMDgsNyBAQAogCQluZXdfZmwyID0gbG9ja3NfYWxsb2NfbG9jaygpOwogCX0KIAorCXBlcmNwdV9kb3duX3JlYWRfcHJlZW1wdF9kaXNhYmxlKCZmaWxlX3J3c2VtKTsKIAlzcGluX2xvY2soJmN0eC0+ZmxjX2xvY2spOwogCS8qCiAJICogTmV3IGxvY2sgcmVxdWVzdC4gV2FsayBhbGwgUE9TSVggbG9ja3MgYW5kIGxvb2sgZm9yIGNvbmZsaWN0cy4gSWYKQEAgLTExNjIsNiArMTE4MCw3IEBACiAJfQogIG91dDoKIAlzcGluX3VubG9jaygmY3R4LT5mbGNfbG9jayk7CisJcGVyY3B1X3VwX3JlYWRfcHJlZW1wdF9lbmFibGUoJmZpbGVfcndzZW0pOwogCS8qCiAJICogRnJlZSBhbnkgdW51c2VkIGxvY2tzLgogCSAqLwpAQCAtMTQzNiw2ICsxNDU1LDcgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAorCXBlcmNwdV9kb3duX3JlYWRfcHJlZW1wdF9kaXNhYmxlKCZmaWxlX3J3c2VtKTsKIAlzcGluX2xvY2soJmN0eC0+ZmxjX2xvY2spOwogCiAJdGltZV9vdXRfbGVhc2VzKGlub2RlLCAmZGlzcG9zZSk7CkBAIC0xNDg3LDkgKzE1MDcsMTMgQEAKIAlsb2Nrc19pbnNlcnRfYmxvY2soZmwsIG5ld19mbCk7CiAJdHJhY2VfYnJlYWtfbGVhc2VfYmxvY2soaW5vZGUsIG5ld19mbCk7CiAJc3Bpbl91bmxvY2soJmN0eC0+ZmxjX2xvY2spOworCXBlcmNwdV91cF9yZWFkX3ByZWVtcHRfZW5hYmxlKCZmaWxlX3J3c2VtKTsKKwogCWxvY2tzX2Rpc3Bvc2VfbGlzdCgmZGlzcG9zZSk7CiAJZXJyb3IgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChuZXdfZmwtPmZsX3dhaXQsCiAJCQkJCQkhbmV3X2ZsLT5mbF9uZXh0LCBicmVha190aW1lKTsKKworCXBlcmNwdV9kb3duX3JlYWRfcHJlZW1wdF9kaXNhYmxlKCZmaWxlX3J3c2VtKTsKIAlzcGluX2xvY2soJmN0eC0+ZmxjX2xvY2spOwogCXRyYWNlX2JyZWFrX2xlYXNlX3VuYmxvY2soaW5vZGUsIG5ld19mbCk7CiAJbG9ja3NfZGVsZXRlX2Jsb2NrKG5ld19mbCk7CkBAIC0xNTA2LDYgKzE1MzAsNyBAQAogCX0KIG91dDoKIAlzcGluX3VubG9jaygmY3R4LT5mbGNfbG9jayk7CisJcGVyY3B1X3VwX3JlYWRfcHJlZW1wdF9lbmFibGUoJmZpbGVfcndzZW0pOwogCWxvY2tzX2Rpc3Bvc2VfbGlzdCgmZGlzcG9zZSk7CiAJbG9ja3NfZnJlZV9sb2NrKG5ld19mbCk7CiAJcmV0dXJuIGVycm9yOwpAQCAtMTY2MCw2ICsxNjg1LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJcGVyY3B1X2Rvd25fcmVhZF9wcmVlbXB0X2Rpc2FibGUoJmZpbGVfcndzZW0pOwogCXNwaW5fbG9jaygmY3R4LT5mbGNfbG9jayk7CiAJdGltZV9vdXRfbGVhc2VzKGlub2RlLCAmZGlzcG9zZSk7CiAJZXJyb3IgPSBjaGVja19jb25mbGljdGluZ19vcGVuKGRlbnRyeSwgYXJnLCBsZWFzZS0+ZmxfZmxhZ3MpOwpAQCAtMTczMCw2ICsxNzU2LDcgQEAKIAkJbGVhc2UtPmZsX2xtb3BzLT5sbV9zZXR1cChsZWFzZSwgcHJpdik7CiBvdXQ6CiAJc3Bpbl91bmxvY2soJmN0eC0+ZmxjX2xvY2spOworCXBlcmNwdV91cF9yZWFkX3ByZWVtcHRfZW5hYmxlKCZmaWxlX3J3c2VtKTsKIAlsb2Nrc19kaXNwb3NlX2xpc3QoJmRpc3Bvc2UpOwogCWlmIChpc19kZWxlZykKIAkJaW5vZGVfdW5sb2NrKGlub2RlKTsKQEAgLTE3NTIsNiArMTc3OSw3IEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAKKwlwZXJjcHVfZG93bl9yZWFkX3ByZWVtcHRfZGlzYWJsZSgmZmlsZV9yd3NlbSk7CiAJc3Bpbl9sb2NrKCZjdHgtPmZsY19sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZsLCAmY3R4LT5mbGNfbGVhc2UsIGZsX2xpc3QpIHsKIAkJaWYgKGZsLT5mbF9maWxlID09IGZpbHAgJiYKQEAgLTE3NjQsNiArMTc5Miw3IEBACiAJaWYgKHZpY3RpbSkKIAkJZXJyb3IgPSBmbC0+ZmxfbG1vcHMtPmxtX2NoYW5nZSh2aWN0aW0sIEZfVU5MQ0ssICZkaXNwb3NlKTsKIAlzcGluX3VubG9jaygmY3R4LT5mbGNfbG9jayk7CisJcGVyY3B1X3VwX3JlYWRfcHJlZW1wdF9lbmFibGUoJmZpbGVfcndzZW0pOwogCWxvY2tzX2Rpc3Bvc2VfbGlzdCgmZGlzcG9zZSk7CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMjU3NCw5ICsyNjAzLDIwIEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiAJdW5zaWduZWQgaW50IGZsX3BpZDsKIAotCWlmIChmbC0+ZmxfbnNwaWQpCi0JCWZsX3BpZCA9IHBpZF92bnIoZmwtPmZsX25zcGlkKTsKLQllbHNlCisJaWYgKGZsLT5mbF9uc3BpZCkgeworCQlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcHJvY19waWRucyA9IGZpbGVfaW5vZGUoZi0+ZmlsZSktPmlfc2ItPnNfZnNfaW5mbzsKKworCQkvKiBEb24ndCBsZXQgZmxfcGlkIGNoYW5nZSBiYXNlZCBvbiB3aG8gaXMgcmVhZGluZyB0aGUgZmlsZSAqLworCQlmbF9waWQgPSBwaWRfbnJfbnMoZmwtPmZsX25zcGlkLCBwcm9jX3BpZG5zKTsKKworCQkvKgorCQkgKiBJZiB0aGVyZSBpc24ndCBhIGZsX3BpZCBkb24ndCBkaXNwbGF5IHdobyBpcyB3YWl0aW5nIG9uCisJCSAqIHRoZSBsb2NrIGlmIHdlIGFyZSBjYWxsZWQgZnJvbSBsb2Nrc19zaG93LCBvciBpZiB3ZSBhcmUKKwkJICogY2FsbGVkIGZyb20gX19zaG93X2ZkX2luZm8gLSBza2lwIGxvY2sgZW50aXJlbHkKKwkJICovCisJCWlmIChmbF9waWQgPT0gMCkKKwkJCXJldHVybjsKKwl9IGVsc2UKIAkJZmxfcGlkID0gZmwtPmZsX3BpZDsKIAogCWlmIChmbC0+ZmxfZmlsZSAhPSBOVUxMKQpAQCAtMjY0OCw5ICsyNjg4LDEzIEBACiB7CiAJc3RydWN0IGxvY2tzX2l0ZXJhdG9yICppdGVyID0gZi0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZmlsZV9sb2NrICpmbCwgKmJmbDsKKwlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcHJvY19waWRucyA9IGZpbGVfaW5vZGUoZi0+ZmlsZSktPmlfc2ItPnNfZnNfaW5mbzsKIAogCWZsID0gaGxpc3RfZW50cnkodiwgc3RydWN0IGZpbGVfbG9jaywgZmxfbGluayk7CiAKKwlpZiAoZmwtPmZsX25zcGlkICYmICFwaWRfbnJfbnMoZmwtPmZsX25zcGlkLCBwcm9jX3BpZG5zKSkKKwkJcmV0dXJuIDA7CisKIAlsb2NrX2dldF9zdGF0dXMoZiwgZmwsIGl0ZXItPmxpX3BvcywgIiIpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShiZmwsICZmbC0+ZmxfYmxvY2ssIGZsX2Jsb2NrKQpAQCAtMjcwMyw5ICsyNzQ3LDkgQEAKIAlzdHJ1Y3QgbG9ja3NfaXRlcmF0b3IgKml0ZXIgPSBmLT5wcml2YXRlOwogCiAJaXRlci0+bGlfcG9zID0gKnBvcyArIDE7Ci0JbGdfZ2xvYmFsX2xvY2soJmZpbGVfbG9ja19sZ2xvY2spOworCXBlcmNwdV9kb3duX3dyaXRlKCZmaWxlX3J3c2VtKTsKIAlzcGluX2xvY2soJmJsb2NrZWRfbG9ja19sb2NrKTsKLQlyZXR1cm4gc2VxX2hsaXN0X3N0YXJ0X3BlcmNwdSgmZmlsZV9sb2NrX2xpc3QsICZpdGVyLT5saV9jcHUsICpwb3MpOworCXJldHVybiBzZXFfaGxpc3Rfc3RhcnRfcGVyY3B1KCZmaWxlX2xvY2tfbGlzdC5obGlzdCwgJml0ZXItPmxpX2NwdSwgKnBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkICpsb2Nrc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCkBAIC0yNzEzLDE0ICsyNzU3LDE0IEBACiAJc3RydWN0IGxvY2tzX2l0ZXJhdG9yICppdGVyID0gZi0+cHJpdmF0ZTsKIAogCSsraXRlci0+bGlfcG9zOwotCXJldHVybiBzZXFfaGxpc3RfbmV4dF9wZXJjcHUodiwgJmZpbGVfbG9ja19saXN0LCAmaXRlci0+bGlfY3B1LCBwb3MpOworCXJldHVybiBzZXFfaGxpc3RfbmV4dF9wZXJjcHUodiwgJmZpbGVfbG9ja19saXN0LmhsaXN0LCAmaXRlci0+bGlfY3B1LCBwb3MpOwogfQogCiBzdGF0aWMgdm9pZCBsb2Nrc19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqdikKIAlfX3JlbGVhc2VzKCZibG9ja2VkX2xvY2tfbG9jaykKIHsKIAlzcGluX3VubG9jaygmYmxvY2tlZF9sb2NrX2xvY2spOwotCWxnX2dsb2JhbF91bmxvY2soJmZpbGVfbG9ja19sZ2xvY2spOworCXBlcmNwdV91cF93cml0ZSgmZmlsZV9yd3NlbSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbG9ja3Nfc2VxX29wZXJhdGlvbnMgPSB7CkBAIC0yNzYxLDEwICsyODA1LDEzIEBACiAJZmlsZWxvY2tfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZmlsZV9sb2NrX2NhY2hlIiwKIAkJCXNpemVvZihzdHJ1Y3QgZmlsZV9sb2NrKSwgMCwgU0xBQl9QQU5JQywgTlVMTCk7CiAKLQlsZ19sb2NrX2luaXQoJmZpbGVfbG9ja19sZ2xvY2ssICJmaWxlX2xvY2tfbGdsb2NrIik7CiAKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKLQkJSU5JVF9ITElTVF9IRUFEKHBlcl9jcHVfcHRyKCZmaWxlX2xvY2tfbGlzdCwgaSkpOworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCXN0cnVjdCBmaWxlX2xvY2tfbGlzdF9zdHJ1Y3QgKmZsbCA9IHBlcl9jcHVfcHRyKCZmaWxlX2xvY2tfbGlzdCwgaSk7CisKKwkJc3Bpbl9sb2NrX2luaXQoJmZsbC0+bG9jayk7CisJCUlOSVRfSExJU1RfSEVBRCgmZmxsLT5obGlzdCk7CisJfQogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuYyBiL2ZzL25mcy9ibG9ja2xheW91dC9ibG9ja2xheW91dC5jCmluZGV4IGY1NWE0ZTcuLjIxNzg0NzYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9ibG9ja2xheW91dC9ibG9ja2xheW91dC5jCisrKyBiL2ZzL25mcy9ibG9ja2xheW91dC9ibG9ja2xheW91dC5jCkBAIC0zNDYsNyArMzQ2LDcgQEAKIAkJCVBBR0VfU0laRSAtIDEpICYgKGxvZmZfdClQQUdFX01BU0s7CiAKIAkJZXh0X3RyZWVfbWFya193cml0dGVuKGJsLCBzdGFydCA+PiBTRUNUT1JfU0hJRlQsCi0JCQkJCShlbmQgLSBzdGFydCkgPj4gU0VDVE9SX1NISUZUKTsKKwkJCQkJKGVuZCAtIHN0YXJ0KSA+PiBTRUNUT1JfU0hJRlQsIGVuZCk7CiAJfQogCiAJcG5mc19sZF93cml0ZV9kb25lKGhkcik7CmRpZmYgLS1naXQgYS9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuaCBiL2ZzL25mcy9ibG9ja2xheW91dC9ibG9ja2xheW91dC5oCmluZGV4IDE4ZTZmZDAuLmVmYzAwN2YgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9ibG9ja2xheW91dC9ibG9ja2xheW91dC5oCisrKyBiL2ZzL25mcy9ibG9ja2xheW91dC9ibG9ja2xheW91dC5oCkBAIC0xNDEsNiArMTQxLDcgQEAKIAlzdHJ1Y3QgcmJfcm9vdAkJYmxfZXh0X3JvOwogCXNwaW5sb2NrX3QJCWJsX2V4dF9sb2NrOyAgIC8qIFByb3RlY3RzIGxpc3QgbWFuaXB1bGF0aW9uICovCiAJYm9vbAkJCWJsX3Njc2lfbGF5b3V0OworCXU2NAkJCWJsX2x3YjsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICoKQEAgLTE4Miw3ICsxODMsNyBAQAogaW50IGV4dF90cmVlX3JlbW92ZShzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKmJsLCBib29sIHJ3LCBzZWN0b3JfdCBzdGFydCwKIAkJc2VjdG9yX3QgZW5kKTsKIGludCBleHRfdHJlZV9tYXJrX3dyaXR0ZW4oc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCwgc2VjdG9yX3Qgc3RhcnQsCi0JCXNlY3Rvcl90IGxlbik7CisJCXNlY3Rvcl90IGxlbiwgdTY0IGx3Yik7CiBib29sIGV4dF90cmVlX2xvb2t1cChzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKmJsLCBzZWN0b3JfdCBpc2VjdCwKIAkJc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpyZXQsIGJvb2wgcncpOwogaW50IGV4dF90cmVlX3ByZXBhcmVfY29tbWl0KHN0cnVjdCBuZnM0X2xheW91dGNvbW1pdF9hcmdzICphcmcpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2Jsb2NrbGF5b3V0L2V4dGVudF90cmVlLmMgYi9mcy9uZnMvYmxvY2tsYXlvdXQvZXh0ZW50X3RyZWUuYwppbmRleCA5OTJiY2IxLi5jODVmYmZkIDEwMDY0NAotLS0gYS9mcy9uZnMvYmxvY2tsYXlvdXQvZXh0ZW50X3RyZWUuYworKysgYi9mcy9uZnMvYmxvY2tsYXlvdXQvZXh0ZW50X3RyZWUuYwpAQCAtNDAyLDcgKzQwMiw3IEBACiAKIGludAogZXh0X3RyZWVfbWFya193cml0dGVuKHN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCAqYmwsIHNlY3Rvcl90IHN0YXJ0LAotCQlzZWN0b3JfdCBsZW4pCisJCXNlY3Rvcl90IGxlbiwgdTY0IGx3YikKIHsKIAlzdHJ1Y3QgcmJfcm9vdCAqcm9vdCA9ICZibC0+YmxfZXh0X3J3OwogCXNlY3Rvcl90IGVuZCA9IHN0YXJ0ICsgbGVuOwpAQCAtNDcxLDYgKzQ3MSw4IEBACiAJCX0KIAl9CiBvdXQ6CisJaWYgKGJsLT5ibF9sd2IgPCBsd2IpCisJCWJsLT5ibF9sd2IgPSBsd2I7CiAJc3Bpbl91bmxvY2soJmJsLT5ibF9leHRfbG9jayk7CiAKIAlfX2V4dF9wdXRfZGV2aWNlaWRzKCZ0bXApOwpAQCAtNTE4LDcgKzUyMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZXh0X3RyZWVfZW5jb2RlX2NvbW1pdChzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKmJsLCBfX2JlMzIgKnAsCi0JCXNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90ICpjb3VudCkKKwkJc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgKmNvdW50LCBfX3U2NCAqbGFzdGJ5dGUpCiB7CiAJc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZTsKIAlpbnQgcmV0ID0gMDsKQEAgLTU0Miw2ICs1NDQsOCBAQAogCQkJcCA9IGVuY29kZV9ibG9ja19leHRlbnQoYmUsIHApOwogCQliZS0+YmVfdGFnID0gRVhURU5UX0NPTU1JVFRJTkc7CiAJfQorCSpsYXN0Ynl0ZSA9IGJsLT5ibF9sd2IgLSAxOworCWJsLT5ibF9sd2IgPSAwOwogCXNwaW5fdW5sb2NrKCZibC0+YmxfZXh0X2xvY2spOwogCiAJcmV0dXJuIHJldDsKQEAgLTU2NCw3ICs1NjgsNyBAQAogCWFyZy0+bGF5b3V0dXBkYXRlX3BhZ2VzID0gJmFyZy0+bGF5b3V0dXBkYXRlX3BhZ2U7CiAKIHJldHJ5OgotCXJldCA9IGV4dF90cmVlX2VuY29kZV9jb21taXQoYmwsIHN0YXJ0X3AgKyAxLCBidWZmZXJfc2l6ZSwgJmNvdW50KTsKKwlyZXQgPSBleHRfdHJlZV9lbmNvZGVfY29tbWl0KGJsLCBzdGFydF9wICsgMSwgYnVmZmVyX3NpemUsICZjb3VudCwgJmFyZy0+bGFzdGJ5dGV3cml0dGVuKTsKIAlpZiAodW5saWtlbHkocmV0KSkgewogCQlleHRfdHJlZV9mcmVlX2NvbW1pdGRhdGEoYXJnLCBidWZmZXJfc2l6ZSk7CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9jYWxsYmFjay5jIGIvZnMvbmZzL2NhbGxiYWNrLmMKaW5kZXggYTdmMmU2ZS4uNTJhMjgzMSAxMDA2NDQKLS0tIGEvZnMvbmZzL2NhbGxiYWNrLmMKKysrIGIvZnMvbmZzL2NhbGxiYWNrLmMKQEAgLTI3NSw2ICsyNzUsNyBAQAogZXJyX3NvY2tzOgogCXN2Y19ycGNiX2NsZWFudXAoc2VydiwgbmV0KTsKIGVycl9iaW5kOgorCW5uLT5jYl91c2Vyc1ttaW5vcnZlcnNpb25dLS07CiAJZHByaW50aygiTkZTOiBDb3VsZG4ndCBjcmVhdGUgY2FsbGJhY2sgc29ja2V0OiBlcnIgPSAlZDsgIgogCQkJIm5ldCA9ICVwXG4iLCByZXQsIG5ldCk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2ZzL25mcy9jYWxsYmFja19wcm9jLmMgYi9mcy9uZnMvY2FsbGJhY2tfcHJvYy5jCmluZGV4IGM5MmE3NWUuLmY5NTNlZjYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jYWxsYmFja19wcm9jLmMKKysrIGIvZnMvbmZzL2NhbGxiYWNrX3Byb2MuYwpAQCAtNDU0LDExICs0NTQsOCBAQAogCQkJCSgodTMyICopJnJjbGlzdC0+cmNsX3Nlc3Npb25pZC5kYXRhKVszXSwKIAkJCQlyZWYtPnJjX3NlcXVlbmNlaWQsIHJlZi0+cmNfc2xvdGlkKTsKIAotCQkJc3Bpbl9sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOwotCQkJc3RhdHVzID0gKHRlc3RfYml0KHJlZi0+cmNfc2xvdGlkLCB0YmwtPnVzZWRfc2xvdHMpICYmCi0JCQkJICB0YmwtPnNsb3RzW3JlZi0+cmNfc2xvdGlkXS5zZXFfbnIgPT0KLQkJCQkJcmVmLT5yY19zZXF1ZW5jZWlkKTsKLQkJCXNwaW5fdW5sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOworCQkJc3RhdHVzID0gbmZzNF9zbG90X3dhaXRfb25fc2VxaWQodGJsLCByZWYtPnJjX3Nsb3RpZCwKKwkJCQkJcmVmLT5yY19zZXF1ZW5jZWlkLCBIWiA+PiAxKSA8IDA7CiAJCQlpZiAoc3RhdHVzKQogCQkJCWdvdG8gb3V0OwogCQl9CkBAIC00ODcsNyArNDg0LDYgQEAKIAkJZ290byBvdXQ7CiAKIAl0YmwgPSAmY2xwLT5jbF9zZXNzaW9uLT5iY19zbG90X3RhYmxlOwotCXNsb3QgPSB0YmwtPnNsb3RzICsgYXJncy0+Y3NhX3Nsb3RpZDsKIAogCS8qIFNldCB1cCByZXMgYmVmb3JlIGdyYWJiaW5nIHRoZSBzcGlubG9jayAqLwogCW1lbWNweSgmcmVzLT5jc3Jfc2Vzc2lvbmlkLCAmYXJncy0+Y3NhX3Nlc3Npb25pZCwKZGlmZiAtLWdpdCBhL2ZzL25mcy9jbGllbnQuYyBiL2ZzL25mcy9jbGllbnQuYwppbmRleCAwMDNlYmNlLi4xZTEwNjc4IDEwMDY0NAotLS0gYS9mcy9uZnMvY2xpZW50LmMKKysrIGIvZnMvbmZzL2NsaWVudC5jCkBAIC00MjYsNyArNDI2LDcgQEAKICAqIEluaXRpYWxpc2UgdGhlIHRpbWVvdXQgdmFsdWVzIGZvciBhIGNvbm5lY3Rpb24KICAqLwogdm9pZCBuZnNfaW5pdF90aW1lb3V0X3ZhbHVlcyhzdHJ1Y3QgcnBjX3RpbWVvdXQgKnRvLCBpbnQgcHJvdG8sCi0JCQkJICAgIHVuc2lnbmVkIGludCB0aW1lbywgdW5zaWduZWQgaW50IHJldHJhbnMpCisJCQkJICAgIGludCB0aW1lbywgaW50IHJldHJhbnMpCiB7CiAJdG8tPnRvX2luaXR2YWwgPSB0aW1lbyAqIEhaIC8gMTA7CiAJdG8tPnRvX3JldHJpZXMgPSByZXRyYW5zOwpAQCAtNDM0LDkgKzQzNCw5IEBACiAJc3dpdGNoIChwcm90bykgewogCWNhc2UgWFBSVF9UUkFOU1BPUlRfVENQOgogCWNhc2UgWFBSVF9UUkFOU1BPUlRfUkRNQToKLQkJaWYgKHRvLT50b19yZXRyaWVzID09IDApCisJCWlmIChyZXRyYW5zID09IE5GU19VTlNQRUNfUkVUUkFOUykKIAkJCXRvLT50b19yZXRyaWVzID0gTkZTX0RFRl9UQ1BfUkVUUkFOUzsKLQkJaWYgKHRvLT50b19pbml0dmFsID09IDApCisJCWlmICh0aW1lbyA9PSBORlNfVU5TUEVDX1RJTUVPIHx8IHRvLT50b19yZXRyaWVzID09IDApCiAJCQl0by0+dG9faW5pdHZhbCA9IE5GU19ERUZfVENQX1RJTUVPICogSFogLyAxMDsKIAkJaWYgKHRvLT50b19pbml0dmFsID4gTkZTX01BWF9UQ1BfVElNRU9VVCkKIAkJCXRvLT50b19pbml0dmFsID0gTkZTX01BWF9UQ1BfVElNRU9VVDsKQEAgLTQ0OSw5ICs0NDksOSBAQAogCQl0by0+dG9fZXhwb25lbnRpYWwgPSAwOwogCQlicmVhazsKIAljYXNlIFhQUlRfVFJBTlNQT1JUX1VEUDoKLQkJaWYgKHRvLT50b19yZXRyaWVzID09IDApCisJCWlmIChyZXRyYW5zID09IE5GU19VTlNQRUNfUkVUUkFOUykKIAkJCXRvLT50b19yZXRyaWVzID0gTkZTX0RFRl9VRFBfUkVUUkFOUzsKLQkJaWYgKCF0by0+dG9faW5pdHZhbCkKKwkJaWYgKHRpbWVvID09IE5GU19VTlNQRUNfVElNRU8gfHwgdG8tPnRvX2luaXR2YWwgPT0gMCkKIAkJCXRvLT50b19pbml0dmFsID0gTkZTX0RFRl9VRFBfVElNRU8gKiBIWiAvIDEwOwogCQlpZiAodG8tPnRvX2luaXR2YWwgPiBORlNfTUFYX1VEUF9USU1FT1VUKQogCQkJdG8tPnRvX2luaXR2YWwgPSBORlNfTUFYX1VEUF9USU1FT1VUOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2ZpbGUuYyBiL2ZzL25mcy9maWxlLmMKaW5kZXggN2Q2MjA5Ny4uY2E2OTlkZCAxMDA2NDQKLS0tIGEvZnMvbmZzL2ZpbGUuYworKysgYi9mcy9uZnMvZmlsZS5jCkBAIC02NTcsNyArNjU3LDEwIEBACiAJaWYgKHJlc3VsdCA8PSAwKQogCQlnb3RvIG91dDsKIAotCXdyaXR0ZW4gPSBnZW5lcmljX3dyaXRlX3N5bmMoaW9jYiwgcmVzdWx0KTsKKwlyZXN1bHQgPSBnZW5lcmljX3dyaXRlX3N5bmMoaW9jYiwgcmVzdWx0KTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXQ7CisJd3JpdHRlbiA9IHJlc3VsdDsKIAlpb2NiLT5raV9wb3MgKz0gd3JpdHRlbjsKIAogCS8qIFJldHVybiBlcnJvciB2YWx1ZXMgKi8KZGlmZiAtLWdpdCBhL2ZzL25mcy9mbGV4ZmlsZWxheW91dC9mbGV4ZmlsZWxheW91dC5jIGIvZnMvbmZzL2ZsZXhmaWxlbGF5b3V0L2ZsZXhmaWxlbGF5b3V0LmMKaW5kZXggZTYyMDZlYS4uNTFiNTEzNiAxMDA2NDQKLS0tIGEvZnMvbmZzL2ZsZXhmaWxlbGF5b3V0L2ZsZXhmaWxlbGF5b3V0LmMKKysrIGIvZnMvbmZzL2ZsZXhmaWxlbGF5b3V0L2ZsZXhmaWxlbGF5b3V0LmMKQEAgLTM3LDYgKzM3LDcgQEAKIAlpZiAoZmZsKSB7CiAJCUlOSVRfTElTVF9IRUFEKCZmZmwtPmVycm9yX2xpc3QpOwogCQlJTklUX0xJU1RfSEVBRCgmZmZsLT5taXJyb3JzKTsKKwkJZmZsLT5sYXN0X3JlcG9ydF90aW1lID0ga3RpbWVfZ2V0KCk7CiAJCXJldHVybiAmZmZsLT5nZW5lcmljX2hkcjsKIAl9IGVsc2UKIAkJcmV0dXJuIE5VTEw7CkBAIC02NDAsMTkgKzY0MSwxOCBAQAogewogCXN0YXRpYyBjb25zdCBrdGltZV90IG5vdGltZSA9IHswfTsKIAlzNjQgcmVwb3J0X2ludGVydmFsID0gRkZfTEFZT1VUU1RBVFNfUkVQT1JUX0lOVEVSVkFMOworCXN0cnVjdCBuZnM0X2ZsZXhmaWxlX2xheW91dCAqZmZsID0gRkZfTEFZT1VUX0ZST01fSERSKG1pcnJvci0+bGF5b3V0KTsKIAogCW5mczRfZmZfc3RhcnRfYnVzeV90aW1lcigmbGF5b3V0c3RhdC0+YnVzeV90aW1lciwgbm93KTsKIAlpZiAoa3RpbWVfZXF1YWwobWlycm9yLT5zdGFydF90aW1lLCBub3RpbWUpKQogCQltaXJyb3ItPnN0YXJ0X3RpbWUgPSBub3c7Ci0JaWYgKGt0aW1lX2VxdWFsKG1pcnJvci0+bGFzdF9yZXBvcnRfdGltZSwgbm90aW1lKSkKLQkJbWlycm9yLT5sYXN0X3JlcG9ydF90aW1lID0gbm93OwogCWlmIChtaXJyb3ItPnJlcG9ydF9pbnRlcnZhbCAhPSAwKQogCQlyZXBvcnRfaW50ZXJ2YWwgPSAoczY0KW1pcnJvci0+cmVwb3J0X2ludGVydmFsICogMTAwMExMOwogCWVsc2UgaWYgKGxheW91dHN0YXRzX3RpbWVyICE9IDApCiAJCXJlcG9ydF9pbnRlcnZhbCA9IChzNjQpbGF5b3V0c3RhdHNfdGltZXIgKiAxMDAwTEw7Ci0JaWYgKGt0aW1lX3RvX21zKGt0aW1lX3N1Yihub3csIG1pcnJvci0+bGFzdF9yZXBvcnRfdGltZSkpID49CisJaWYgKGt0aW1lX3RvX21zKGt0aW1lX3N1Yihub3csIGZmbC0+bGFzdF9yZXBvcnRfdGltZSkpID49CiAJCQlyZXBvcnRfaW50ZXJ2YWwpIHsKLQkJbWlycm9yLT5sYXN0X3JlcG9ydF90aW1lID0gbm93OworCQlmZmwtPmxhc3RfcmVwb3J0X3RpbWUgPSBub3c7CiAJCXJldHVybiB0cnVlOwogCX0KIApAQCAtODA2LDExICs4MDYsMTQgQEAKIHsKIAlzdHJ1Y3QgbmZzNF9mZl9sYXlvdXRfc2VnbWVudCAqZmxzID0gRkZfTEFZT1VUX0xTRUcobHNlZyk7CiAJc3RydWN0IG5mczRfcG5mc19kcyAqZHM7CisJYm9vbCBmYWlsX3JldHVybiA9IGZhbHNlOwogCWludCBpZHg7CiAKIAkvKiBtaXJyb3JzIGFyZSBzb3J0ZWQgYnkgZWZmaWNpZW5jeSAqLwogCWZvciAoaWR4ID0gc3RhcnRfaWR4OyBpZHggPCBmbHMtPm1pcnJvcl9hcnJheV9jbnQ7IGlkeCsrKSB7Ci0JCWRzID0gbmZzNF9mZl9sYXlvdXRfcHJlcGFyZV9kcyhsc2VnLCBpZHgsIGZhbHNlKTsKKwkJaWYgKGlkeCsxID09IGZscy0+bWlycm9yX2FycmF5X2NudCkKKwkJCWZhaWxfcmV0dXJuID0gdHJ1ZTsKKwkJZHMgPSBuZnM0X2ZmX2xheW91dF9wcmVwYXJlX2RzKGxzZWcsIGlkeCwgZmFpbF9yZXR1cm4pOwogCQlpZiAoZHMpIHsKIAkJCSpiZXN0X2lkeCA9IGlkeDsKIAkJCXJldHVybiBkczsKQEAgLTg1OSw2ICs4NjIsNyBAQAogCXN0cnVjdCBuZnM0X3BuZnNfZHMgKmRzOwogCWludCBkc19pZHg7CiAKK3JldHJ5OgogCS8qIFVzZSBmdWxsIGxheW91dCBmb3Igbm93ICovCiAJaWYgKCFwZ2lvLT5wZ19sc2VnKQogCQlmZl9sYXlvdXRfcGdfZ2V0X3JlYWQocGdpbywgcmVxLCBmYWxzZSk7CkBAIC04NzEsMTAgKzg3NSwxMyBAQAogCiAJZHMgPSBmZl9sYXlvdXRfY2hvb3NlX2Jlc3RfZHNfZm9yX3JlYWQocGdpby0+cGdfbHNlZywgMCwgJmRzX2lkeCk7CiAJaWYgKCFkcykgewotCQlpZiAoZmZfbGF5b3V0X25vX2ZhbGxiYWNrX3RvX21kcyhwZ2lvLT5wZ19sc2VnKSkKLQkJCWdvdG8gb3V0X3BuZnM7Ci0JCWVsc2UKKwkJaWYgKCFmZl9sYXlvdXRfbm9fZmFsbGJhY2tfdG9fbWRzKHBnaW8tPnBnX2xzZWcpKQogCQkJZ290byBvdXRfbWRzOworCQlwbmZzX3B1dF9sc2VnKHBnaW8tPnBnX2xzZWcpOworCQlwZ2lvLT5wZ19sc2VnID0gTlVMTDsKKwkJLyogU2xlZXAgZm9yIDEgc2Vjb25kIGJlZm9yZSByZXRyeWluZyAqLworCQlzc2xlZXAoMSk7CisJCWdvdG8gcmV0cnk7CiAJfQogCiAJbWlycm9yID0gRkZfTEFZT1VUX0NPTVAocGdpby0+cGdfbHNlZywgZHNfaWR4KTsKQEAgLTg5MCwxMiArODk3LDYgQEAKIAlwbmZzX3B1dF9sc2VnKHBnaW8tPnBnX2xzZWcpOwogCXBnaW8tPnBnX2xzZWcgPSBOVUxMOwogCW5mc19wYWdlaW9fcmVzZXRfcmVhZF9tZHMocGdpbyk7Ci0JcmV0dXJuOwotCi1vdXRfcG5mczoKLQlwbmZzX3NldF9sb19mYWlsKHBnaW8tPnBnX2xzZWcpOwotCXBuZnNfcHV0X2xzZWcocGdpby0+cGdfbHNlZyk7Ci0JcGdpby0+cGdfbHNlZyA9IE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC05MDksNiArOTEwLDcgQEAKIAlpbnQgaTsKIAlpbnQgc3RhdHVzOwogCityZXRyeToKIAlpZiAoIXBnaW8tPnBnX2xzZWcpIHsKIAkJcGdpby0+cGdfbHNlZyA9IHBuZnNfdXBkYXRlX2xheW91dChwZ2lvLT5wZ19pbm9kZSwKIAkJCQkJCSAgIHJlcS0+d2JfY29udGV4dCwKQEAgLTk0MCwxMCArOTQyLDEzIEBACiAJZm9yIChpID0gMDsgaSA8IHBnaW8tPnBnX21pcnJvcl9jb3VudDsgaSsrKSB7CiAJCWRzID0gbmZzNF9mZl9sYXlvdXRfcHJlcGFyZV9kcyhwZ2lvLT5wZ19sc2VnLCBpLCB0cnVlKTsKIAkJaWYgKCFkcykgewotCQkJaWYgKGZmX2xheW91dF9ub19mYWxsYmFja190b19tZHMocGdpby0+cGdfbHNlZykpCi0JCQkJZ290byBvdXRfcG5mczsKLQkJCWVsc2UKKwkJCWlmICghZmZfbGF5b3V0X25vX2ZhbGxiYWNrX3RvX21kcyhwZ2lvLT5wZ19sc2VnKSkKIAkJCQlnb3RvIG91dF9tZHM7CisJCQlwbmZzX3B1dF9sc2VnKHBnaW8tPnBnX2xzZWcpOworCQkJcGdpby0+cGdfbHNlZyA9IE5VTEw7CisJCQkvKiBTbGVlcCBmb3IgMSBzZWNvbmQgYmVmb3JlIHJldHJ5aW5nICovCisJCQlzc2xlZXAoMSk7CisJCQlnb3RvIHJldHJ5OwogCQl9CiAJCXBnbSA9ICZwZ2lvLT5wZ19taXJyb3JzW2ldOwogCQltaXJyb3IgPSBGRl9MQVlPVVRfQ09NUChwZ2lvLT5wZ19sc2VnLCBpKTsKQEAgLTk1NiwxMiArOTYxLDYgQEAKIAlwbmZzX3B1dF9sc2VnKHBnaW8tPnBnX2xzZWcpOwogCXBnaW8tPnBnX2xzZWcgPSBOVUxMOwogCW5mc19wYWdlaW9fcmVzZXRfd3JpdGVfbWRzKHBnaW8pOwotCXJldHVybjsKLQotb3V0X3BuZnM6Ci0JcG5mc19zZXRfbG9fZmFpbChwZ2lvLT5wZ19sc2VnKTsKLQlwbmZzX3B1dF9sc2VnKHBnaW8tPnBnX2xzZWcpOwotCXBnaW8tPnBnX2xzZWcgPSBOVUxMOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50CmRpZmYgLS1naXQgYS9mcy9uZnMvZmxleGZpbGVsYXlvdXQvZmxleGZpbGVsYXlvdXQuaCBiL2ZzL25mcy9mbGV4ZmlsZWxheW91dC9mbGV4ZmlsZWxheW91dC5oCmluZGV4IDFiY2RiMTUuLjNlZTBjOWYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9mbGV4ZmlsZWxheW91dC9mbGV4ZmlsZWxheW91dC5oCisrKyBiL2ZzL25mcy9mbGV4ZmlsZWxheW91dC9mbGV4ZmlsZWxheW91dC5oCkBAIC04NCw3ICs4NCw2IEBACiAJc3RydWN0IG5mczRfZmZfbGF5b3V0c3RhdAlyZWFkX3N0YXQ7CiAJc3RydWN0IG5mczRfZmZfbGF5b3V0c3RhdAl3cml0ZV9zdGF0OwogCWt0aW1lX3QJCQkJc3RhcnRfdGltZTsKLQlrdGltZV90CQkJCWxhc3RfcmVwb3J0X3RpbWU7CiAJdTMyCQkJCXJlcG9ydF9pbnRlcnZhbDsKIH07CiAKQEAgLTEwMSw2ICsxMDAsNyBAQAogCXN0cnVjdCBwbmZzX2RzX2NvbW1pdF9pbmZvIGNvbW1pdF9pbmZvOwogCXN0cnVjdCBsaXN0X2hlYWQJbWlycm9yczsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWVycm9yX2xpc3Q7IC8qIG5mczRfZmZfbGF5b3V0X2RzX2VyciAqLworCWt0aW1lX3QJCQlsYXN0X3JlcG9ydF90aW1lOyAvKiBMYXlvdXRzdGF0IHJlcG9ydCB0aW1lcyAqLwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZzNF9mbGV4ZmlsZV9sYXlvdXQgKgpkaWZmIC0tZ2l0IGEvZnMvbmZzL2ZsZXhmaWxlbGF5b3V0L2ZsZXhmaWxlbGF5b3V0ZGV2LmMgYi9mcy9uZnMvZmxleGZpbGVsYXlvdXQvZmxleGZpbGVsYXlvdXRkZXYuYwppbmRleCAwYWEzNmJlLi5mN2EzZjZiIDEwMDY0NAotLS0gYS9mcy9uZnMvZmxleGZpbGVsYXlvdXQvZmxleGZpbGVsYXlvdXRkZXYuYworKysgYi9mcy9uZnMvZmxleGZpbGVsYXlvdXQvZmxleGZpbGVsYXlvdXRkZXYuYwpAQCAtMTcsOCArMTcsOCBAQAogCiAjZGVmaW5lIE5GU0RCR19GQUNJTElUWQkJTkZTREJHX1BORlNfTEQKIAotc3RhdGljIHVuc2lnbmVkIGludCBkYXRhc2VydmVyX3RpbWVvID0gTkZTNF9ERUZfRFNfVElNRU87Ci1zdGF0aWMgdW5zaWduZWQgaW50IGRhdGFzZXJ2ZXJfcmV0cmFucyA9IE5GUzRfREVGX0RTX1JFVFJBTlM7CitzdGF0aWMgdW5zaWduZWQgaW50IGRhdGFzZXJ2ZXJfdGltZW8gPSBORlNfREVGX1RDUF9SRVRSQU5TOworc3RhdGljIHVuc2lnbmVkIGludCBkYXRhc2VydmVyX3JldHJhbnM7CiAKIHZvaWQgbmZzNF9mZl9sYXlvdXRfcHV0X2RldmljZWlkKHN0cnVjdCBuZnM0X2ZmX2xheW91dF9kcyAqbWlycm9yX2RzKQogewpAQCAtMzc5LDcgKzM3OSw3IEBACiAKIAlkZXZpZCA9ICZtaXJyb3ItPm1pcnJvcl9kcy0+aWRfbm9kZTsKIAlpZiAoZmZfbGF5b3V0X3Rlc3RfZGV2aWRfdW5hdmFpbGFibGUoZGV2aWQpKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfZmFpbDsKIAogCWRzID0gbWlycm9yLT5taXJyb3JfZHMtPmRzOwogCS8qIG1hdGNoaW5nIHNtcF93bWIoKSBpbiBfbmZzNF9wbmZzX3YzLzRfZHNfY29ubmVjdCAqLwpAQCAtNDA1LDE1ICs0MDUsMTYgQEAKIAkJCW1pcnJvci0+bWlycm9yX2RzLT5kc192ZXJzaW9uc1swXS5yc2l6ZSA9IG1heF9wYXlsb2FkOwogCQlpZiAobWlycm9yLT5taXJyb3JfZHMtPmRzX3ZlcnNpb25zWzBdLndzaXplID4gbWF4X3BheWxvYWQpCiAJCQltaXJyb3ItPm1pcnJvcl9kcy0+ZHNfdmVyc2lvbnNbMF0ud3NpemUgPSBtYXhfcGF5bG9hZDsKLQl9IGVsc2UgewotCQlmZl9sYXlvdXRfdHJhY2tfZHNfZXJyb3IoRkZfTEFZT1VUX0ZST01fSERSKGxzZWctPnBsc19sYXlvdXQpLAotCQkJCQkgbWlycm9yLCBsc2VnLT5wbHNfcmFuZ2Uub2Zmc2V0LAotCQkJCQkgbHNlZy0+cGxzX3JhbmdlLmxlbmd0aCwgTkZTNEVSUl9OWElPLAotCQkJCQkgT1BfSUxMRUdBTCwgR0ZQX05PSU8pOwotCQlpZiAoZmFpbF9yZXR1cm4gfHwgIWZmX2xheW91dF9oYXNfYXZhaWxhYmxlX2RzKGxzZWcpKQotCQkJcG5mc19lcnJvcl9tYXJrX2xheW91dF9mb3JfcmV0dXJuKGlubywgbHNlZyk7Ci0JCWRzID0gTlVMTDsKKwkJZ290byBvdXQ7CiAJfQorCWZmX2xheW91dF90cmFja19kc19lcnJvcihGRl9MQVlPVVRfRlJPTV9IRFIobHNlZy0+cGxzX2xheW91dCksCisJCQkJIG1pcnJvciwgbHNlZy0+cGxzX3JhbmdlLm9mZnNldCwKKwkJCQkgbHNlZy0+cGxzX3JhbmdlLmxlbmd0aCwgTkZTNEVSUl9OWElPLAorCQkJCSBPUF9JTExFR0FMLCBHRlBfTk9JTyk7CitvdXRfZmFpbDoKKwlpZiAoZmFpbF9yZXR1cm4gfHwgIWZmX2xheW91dF9oYXNfYXZhaWxhYmxlX2RzKGxzZWcpKQorCQlwbmZzX2Vycm9yX21hcmtfbGF5b3V0X2Zvcl9yZXR1cm4oaW5vLCBsc2VnKTsKKwlkcyA9IE5VTEw7CiBvdXQ6CiAJcmV0dXJuIGRzOwogfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2ludGVybmFsLmggYi9mcy9uZnMvaW50ZXJuYWwuaAppbmRleCA3Y2U1ZTAyLi43NDkzNWExIDEwMDY0NAotLS0gYS9mcy9uZnMvaW50ZXJuYWwuaAorKysgYi9mcy9uZnMvaW50ZXJuYWwuaApAQCAtNTgsNiArNTgsOSBAQAogICovCiAjZGVmaW5lIE5GU19VTlNQRUNfUE9SVAkJKC0xKQogCisjZGVmaW5lIE5GU19VTlNQRUNfUkVUUkFOUwkoVUlOVF9NQVgpCisjZGVmaW5lIE5GU19VTlNQRUNfVElNRU8JKFVJTlRfTUFYKQorCiAvKgogICogTWF4aW11bSBudW1iZXIgb2YgcGFnZXMgdGhhdCByZWFkZGlyIGNhbiB1c2UgZm9yIGNyZWF0aW5nCiAgKiBhIHZtYXBwZWQgYXJyYXkgb2YgcGFnZXMuCkBAIC0xNTYsNyArMTU5LDcgQEAKIGludCBuZnNfcHJvYmVfZnNpbmZvKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKiwgc3RydWN0IG5mc19mYXR0ciAqKTsKIHZvaWQgbmZzX3NlcnZlcl9pbnNlcnRfbGlzdHMoc3RydWN0IG5mc19zZXJ2ZXIgKik7CiB2b2lkIG5mc19zZXJ2ZXJfcmVtb3ZlX2xpc3RzKHN0cnVjdCBuZnNfc2VydmVyICopOwotdm9pZCBuZnNfaW5pdF90aW1lb3V0X3ZhbHVlcyhzdHJ1Y3QgcnBjX3RpbWVvdXQgKiwgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7Cit2b2lkIG5mc19pbml0X3RpbWVvdXRfdmFsdWVzKHN0cnVjdCBycGNfdGltZW91dCAqdG8sIGludCBwcm90bywgaW50IHRpbWVvLCBpbnQgcmV0cmFucyk7CiBpbnQgbmZzX2luaXRfc2VydmVyX3JwY2NsaWVudChzdHJ1Y3QgbmZzX3NlcnZlciAqLCBjb25zdCBzdHJ1Y3QgcnBjX3RpbWVvdXQgKnQsCiAJCXJwY19hdXRoZmxhdm9yX3QpOwogc3RydWN0IG5mc19zZXJ2ZXIgKm5mc19hbGxvY19zZXJ2ZXIodm9pZCk7CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNDJwcm9jLmMgYi9mcy9uZnMvbmZzNDJwcm9jLmMKaW5kZXggNmY0NzUyNy4uNjRiNDNiNCAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczQycHJvYy5jCisrKyBiL2ZzL25mcy9uZnM0MnByb2MuYwpAQCAtMzE4LDEwICszMTgsMjIgQEAKIG5mczQyX2xheW91dHN0YXRfcHJlcGFyZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHZvaWQgKmNhbGxkYXRhKQogewogCXN0cnVjdCBuZnM0Ml9sYXlvdXRzdGF0X2RhdGEgKmRhdGEgPSBjYWxsZGF0YTsKLQlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihkYXRhLT5hcmdzLmlub2RlKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGF0YS0+aW5vZGU7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoaW5vZGUpOworCXN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvOwogCisJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlsbyA9IE5GU19JKGlub2RlKS0+bGF5b3V0OworCWlmICghcG5mc19sYXlvdXRfaXNfdmFsaWQobG8pKSB7CisJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJcnBjX2V4aXQodGFzaywgMCk7CisJCXJldHVybjsKKwl9CisJbmZzNF9zdGF0ZWlkX2NvcHkoJmRhdGEtPmFyZ3Muc3RhdGVpZCwgJmxvLT5wbGhfc3RhdGVpZCk7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwogCW5mczQxX3NldHVwX3NlcXVlbmNlKG5mczRfZ2V0X3Nlc3Npb24oc2VydmVyKSwgJmRhdGEtPmFyZ3Muc2VxX2FyZ3MsCiAJCQkgICAgICZkYXRhLT5yZXMuc2VxX3JlcywgdGFzayk7CisKIH0KIAogc3RhdGljIHZvaWQKQEAgLTM0MSwxMSArMzUzLDExIEBACiAJY2FzZSAtTkZTNEVSUl9BRE1JTl9SRVZPS0VEOgogCWNhc2UgLU5GUzRFUlJfREVMRUdfUkVWT0tFRDoKIAljYXNlIC1ORlM0RVJSX1NUQUxFX1NUQVRFSUQ6Ci0JY2FzZSAtTkZTNEVSUl9PTERfU1RBVEVJRDoKIAljYXNlIC1ORlM0RVJSX0JBRF9TVEFURUlEOgogCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwogCQlsbyA9IE5GU19JKGlub2RlKS0+bGF5b3V0OwotCQlpZiAobG8gJiYgbmZzNF9zdGF0ZWlkX21hdGNoKCZkYXRhLT5hcmdzLnN0YXRlaWQsCisJCWlmIChwbmZzX2xheW91dF9pc192YWxpZChsbykgJiYKKwkJICAgIG5mczRfc3RhdGVpZF9tYXRjaCgmZGF0YS0+YXJncy5zdGF0ZWlkLAogCQkJCQkgICAgICZsby0+cGxoX3N0YXRlaWQpKSB7CiAJCQlMSVNUX0hFQUQoaGVhZCk7CiAKQEAgLTM1OSwxMSArMzcxLDIzIEBACiAJCX0gZWxzZQogCQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwogCQlicmVhazsKKwljYXNlIC1ORlM0RVJSX09MRF9TVEFURUlEOgorCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCQlsbyA9IE5GU19JKGlub2RlKS0+bGF5b3V0OworCQlpZiAocG5mc19sYXlvdXRfaXNfdmFsaWQobG8pICYmCisJCSAgICBuZnM0X3N0YXRlaWRfbWF0Y2hfb3RoZXIoJmRhdGEtPmFyZ3Muc3RhdGVpZCwKKwkJCQkJJmxvLT5wbGhfc3RhdGVpZCkpIHsKKwkJCS8qIERvIHdlIG5lZWQgdG8gZGVsYXkgYmVmb3JlIHJlc2VuZGluZz8gKi8KKwkJCWlmICghbmZzNF9zdGF0ZWlkX2lzX25ld2VyKCZsby0+cGxoX3N0YXRlaWQsCisJCQkJCQkmZGF0YS0+YXJncy5zdGF0ZWlkKSkKKwkJCQlycGNfZGVsYXkodGFzaywgSFopOworCQkJcnBjX3Jlc3RhcnRfY2FsbF9wcmVwYXJlKHRhc2spOworCQl9CisJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJYnJlYWs7CiAJY2FzZSAtRU5PVFNVUFA6CiAJY2FzZSAtRU9QTk9UU1VQUDoKIAkJTkZTX1NFUlZFUihpbm9kZSktPmNhcHMgJj0gfk5GU19DQVBfTEFZT1VUU1RBVFM7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7CiAJfQogCiAJZHByaW50aygiJXMgc2VydmVyIHJldHVybnMgJWRcbiIsIF9fZnVuY19fLCB0YXNrLT50a19zdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRjbGllbnQuYyBiL2ZzL25mcy9uZnM0Y2xpZW50LmMKaW5kZXggOGQ3ZDA4ZC4uY2QzYjdjZiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRjbGllbnQuYworKysgYi9mcy9uZnMvbmZzNGNsaWVudC5jCkBAIC04MTcsNiArODE3LDExIEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCisJaWYgKHNlcnZlci0+bmZzX2NsaWVudCA9PSBjbHApIHsKKwkJZXJyb3IgPSAtRUxPT1A7CisJCWdvdG8gZXJyb3I7CisJfQorCiAJLyoKIAkgKiBRdWVyeSBmb3IgdGhlIGxlYXNlIHRpbWUgb24gY2xpZW50aWQgc2V0dXAgb3IgcmVuZXdhbAogCSAqCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHByb2MuYyBiL2ZzL25mcy9uZnM0cHJvYy5jCmluZGV4IDE5NDliYmQuLmE5ZGVjMzIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0cHJvYy5jCisrKyBiL2ZzL25mcy9uZnM0cHJvYy5jCkBAIC02MzQsMTUgKzYzNCwxMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZzNDBfc2V0dXBfc2VxdWVuY2UpOwogCi1zdGF0aWMgaW50IG5mczQwX3NlcXVlbmNlX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrLAotCQkJICAgICAgIHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKQorc3RhdGljIHZvaWQgbmZzNDBfc2VxdWVuY2VfZnJlZV9zbG90KHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKQogewogCXN0cnVjdCBuZnM0X3Nsb3QgKnNsb3QgPSByZXMtPnNyX3Nsb3Q7CiAJc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsOwogCi0JaWYgKHNsb3QgPT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0KIAl0YmwgPSBzbG90LT50YWJsZTsKIAlzcGluX2xvY2soJnRibC0+c2xvdF90YmxfbG9jayk7CiAJaWYgKCFuZnM0MV93YWtlX2FuZF9hc3NpZ25fc2xvdCh0YmwsIHNsb3QpKQpAQCAtNjUwLDcgKzY0NiwxMyBAQAogCXNwaW5fdW5sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOwogCiAJcmVzLT5zcl9zbG90ID0gTlVMTDsKLW91dDoKK30KKworc3RhdGljIGludCBuZnM0MF9zZXF1ZW5jZV9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaywKKwkJCSAgICAgICBzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMgKnJlcykKK3sKKwlpZiAocmVzLT5zcl9zbG90ICE9IE5VTEwpCisJCW5mczQwX3NlcXVlbmNlX2ZyZWVfc2xvdChyZXMpOwogCXJldHVybiAxOwogfQogCkBAIC02NjYsNiArNjY4LDExIEBACiAJdGJsID0gc2xvdC0+dGFibGU7CiAJc2Vzc2lvbiA9IHRibC0+c2Vzc2lvbjsKIAorCS8qIEJ1bXAgdGhlIHNsb3Qgc2VxdWVuY2UgbnVtYmVyICovCisJaWYgKHNsb3QtPnNlcV9kb25lKQorCQlzbG90LT5zZXFfbnIrKzsKKwlzbG90LT5zZXFfZG9uZSA9IDA7CisKIAlzcGluX2xvY2soJnRibC0+c2xvdF90YmxfbG9jayk7CiAJLyogQmUgbmljZSB0byB0aGUgc2VydmVyOiB0cnkgdG8gZW5zdXJlIHRoYXQgdGhlIGxhc3QgdHJhbnNtaXR0ZWQKIAkgKiB2YWx1ZSBmb3IgaGlnaGVzdF91c2VyX3Nsb3RpZCA8PSB0YXJnZXRfaGlnaGVzdF9zbG90aWQKQEAgLTY4Niw5ICs2OTMsMTIgQEAKIAlyZXMtPnNyX3Nsb3QgPSBOVUxMOwogCWlmIChzZW5kX25ld19oaWdoZXN0X3VzZWRfc2xvdGlkKQogCQluZnM0MV9ub3RpZnlfc2VydmVyKHNlc3Npb24tPmNscCk7CisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnRibC0+c2xvdF93YWl0cSkpCisJCXdha2VfdXBfYWxsKCZ0YmwtPnNsb3Rfd2FpdHEpOwogfQogCi1pbnQgbmZzNDFfc2VxdWVuY2VfZG9uZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0MV9zZXF1ZW5jZV9wcm9jZXNzKHN0cnVjdCBycGNfdGFzayAqdGFzaywKKwkJc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMpCiB7CiAJc3RydWN0IG5mczRfc2Vzc2lvbiAqc2Vzc2lvbjsKIAlzdHJ1Y3QgbmZzNF9zbG90ICpzbG90ID0gcmVzLT5zcl9zbG90OwpAQCAtNzE0LDcgKzcyNCw3IEBACiAJc3dpdGNoIChyZXMtPnNyX3N0YXR1cykgewogCWNhc2UgMDoKIAkJLyogVXBkYXRlIHRoZSBzbG90J3Mgc2VxdWVuY2UgYW5kIGNsaWVudGlkIGxlYXNlIHRpbWVyICovCi0JCSsrc2xvdC0+c2VxX25yOworCQlzbG90LT5zZXFfZG9uZSA9IDE7CiAJCWNscCA9IHNlc3Npb24tPmNscDsKIAkJZG9fcmVuZXdfbGVhc2UoY2xwLCByZXMtPnNyX3RpbWVzdGFtcCk7CiAJCS8qIENoZWNrIHNlcXVlbmNlIGZsYWdzICovCkBAIC03NjksMTYgKzc3OSwxNiBAQAogCQlnb3RvIHJldHJ5X25vd2FpdDsKIAlkZWZhdWx0OgogCQkvKiBKdXN0IHVwZGF0ZSB0aGUgc2xvdCBzZXF1ZW5jZSBuby4gKi8KLQkJKytzbG90LT5zZXFfbnI7CisJCXNsb3QtPnNlcV9kb25lID0gMTsKIAl9CiBvdXQ6CiAJLyogVGhlIHNlc3Npb24gbWF5IGJlIHJlc2V0IGJ5IG9uZSBvZiB0aGUgZXJyb3IgaGFuZGxlcnMuICovCiAJZHByaW50aygiJXM6IEVycm9yICVkIGZyZWUgdGhlIHNsb3QgXG4iLCBfX2Z1bmNfXywgcmVzLT5zcl9zdGF0dXMpOwotCW5mczQxX3NlcXVlbmNlX2ZyZWVfc2xvdChyZXMpOwogb3V0X25vYWN0aW9uOgogCXJldHVybiByZXQ7CiByZXRyeV9ub3dhaXQ6CiAJaWYgKHJwY19yZXN0YXJ0X2NhbGxfcHJlcGFyZSh0YXNrKSkgeworCQluZnM0MV9zZXF1ZW5jZV9mcmVlX3Nsb3QocmVzKTsKIAkJdGFzay0+dGtfc3RhdHVzID0gMDsKIAkJcmV0ID0gMDsKIAl9CkBAIC03ODksOCArNzk5LDM3IEBACiAJcnBjX2RlbGF5KHRhc2ssIE5GUzRfUE9MTF9SRVRSWV9NQVgpOwogCXJldHVybiAwOwogfQorCitpbnQgbmZzNDFfc2VxdWVuY2VfZG9uZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKQoreworCWlmICghbmZzNDFfc2VxdWVuY2VfcHJvY2Vzcyh0YXNrLCByZXMpKQorCQlyZXR1cm4gMDsKKwlpZiAocmVzLT5zcl9zbG90ICE9IE5VTEwpCisJCW5mczQxX3NlcXVlbmNlX2ZyZWVfc2xvdChyZXMpOworCXJldHVybiAxOworCit9CiBFWFBPUlRfU1lNQk9MX0dQTChuZnM0MV9zZXF1ZW5jZV9kb25lKTsKIAorc3RhdGljIGludCBuZnM0X3NlcXVlbmNlX3Byb2Nlc3Moc3RydWN0IHJwY190YXNrICp0YXNrLCBzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMgKnJlcykKK3sKKwlpZiAocmVzLT5zcl9zbG90ID09IE5VTEwpCisJCXJldHVybiAxOworCWlmIChyZXMtPnNyX3Nsb3QtPnRhYmxlLT5zZXNzaW9uICE9IE5VTEwpCisJCXJldHVybiBuZnM0MV9zZXF1ZW5jZV9wcm9jZXNzKHRhc2ssIHJlcyk7CisJcmV0dXJuIG5mczQwX3NlcXVlbmNlX2RvbmUodGFzaywgcmVzKTsKK30KKworc3RhdGljIHZvaWQgbmZzNF9zZXF1ZW5jZV9mcmVlX3Nsb3Qoc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMpCit7CisJaWYgKHJlcy0+c3Jfc2xvdCAhPSBOVUxMKSB7CisJCWlmIChyZXMtPnNyX3Nsb3QtPnRhYmxlLT5zZXNzaW9uICE9IE5VTEwpCisJCQluZnM0MV9zZXF1ZW5jZV9mcmVlX3Nsb3QocmVzKTsKKwkJZWxzZQorCQkJbmZzNDBfc2VxdWVuY2VfZnJlZV9zbG90KHJlcyk7CisJfQorfQorCiBpbnQgbmZzNF9zZXF1ZW5jZV9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaywgc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMpCiB7CiAJaWYgKHJlcy0+c3Jfc2xvdCA9PSBOVUxMKQpAQCAtOTIwLDYgKzk1OSwxNyBAQAogCQkJCSAgICBhcmdzLCByZXMsIHRhc2spOwogfQogCitzdGF0aWMgaW50IG5mczRfc2VxdWVuY2VfcHJvY2VzcyhzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKQoreworCXJldHVybiBuZnM0MF9zZXF1ZW5jZV9kb25lKHRhc2ssIHJlcyk7Cit9CisKK3N0YXRpYyB2b2lkIG5mczRfc2VxdWVuY2VfZnJlZV9zbG90KHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKQoreworCWlmIChyZXMtPnNyX3Nsb3QgIT0gTlVMTCkKKwkJbmZzNDBfc2VxdWVuY2VfZnJlZV9zbG90KHJlcyk7Cit9CisKIGludCBuZnM0X3NlcXVlbmNlX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrLAogCQkgICAgICAgc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMpCiB7CkBAIC0xMTk3LDYgKzEyNDcsNyBAQAogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBwLT5kZW50cnktPmRfc2I7CiAKIAluZnNfZnJlZV9zZXFpZChwLT5vX2FyZy5zZXFpZCk7CisJbmZzNF9zZXF1ZW5jZV9mcmVlX3Nsb3QoJnAtPm9fcmVzLnNlcV9yZXMpOwogCWlmIChwLT5zdGF0ZSAhPSBOVUxMKQogCQluZnM0X3B1dF9vcGVuX3N0YXRlKHAtPnN0YXRlKTsKIAluZnM0X3B1dF9zdGF0ZV9vd25lcihwLT5vd25lcik7CkBAIC0xNjU2LDkgKzE3MDcsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgbmZzNF9zdGF0ZSAqCiBuZnM0X29wZW5kYXRhX3RvX25mczRfc3RhdGUoc3RydWN0IG5mczRfb3BlbmRhdGEgKmRhdGEpCiB7CisJc3RydWN0IG5mczRfc3RhdGUgKnJldDsKKwogCWlmIChkYXRhLT5vX2FyZy5jbGFpbSA9PSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMpCi0JCXJldHVybiBfbmZzNF9vcGVuZGF0YV9yZWNsYWltX3RvX25mczRfc3RhdGUoZGF0YSk7Ci0JcmV0dXJuIF9uZnM0X29wZW5kYXRhX3RvX25mczRfc3RhdGUoZGF0YSk7CisJCXJldCA9X25mczRfb3BlbmRhdGFfcmVjbGFpbV90b19uZnM0X3N0YXRlKGRhdGEpOworCWVsc2UKKwkJcmV0ID0gX25mczRfb3BlbmRhdGFfdG9fbmZzNF9zdGF0ZShkYXRhKTsKKwluZnM0X3NlcXVlbmNlX2ZyZWVfc2xvdCgmZGF0YS0+b19yZXMuc2VxX3Jlcyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpuZnM0X3N0YXRlX2ZpbmRfb3Blbl9jb250ZXh0KHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSkKQEAgLTIwNTYsNyArMjExMiw3IEBACiAKIAlkYXRhLT5ycGNfc3RhdHVzID0gdGFzay0+dGtfc3RhdHVzOwogCi0JaWYgKCFuZnM0X3NlcXVlbmNlX2RvbmUodGFzaywgJmRhdGEtPm9fcmVzLnNlcV9yZXMpKQorCWlmICghbmZzNF9zZXF1ZW5jZV9wcm9jZXNzKHRhc2ssICZkYXRhLT5vX3Jlcy5zZXFfcmVzKSkKIAkJcmV0dXJuOwogCiAJaWYgKHRhc2stPnRrX3N0YXR1cyA9PSAwKSB7CkBAIC03NTE0LDEyICs3NTcwLDIwIEBACiAJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhzZXNzaW9uLT5jbHAtPmNsX3JwY2NsaWVudCwgJm1zZywgUlBDX1RBU0tfVElNRU9VVCk7CiAJdHJhY2VfbmZzNF9jcmVhdGVfc2Vzc2lvbihjbHAsIHN0YXR1cyk7CiAKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgLU5GUzRFUlJfU1RBTEVfQ0xJRU5USUQ6CisJY2FzZSAtTkZTNEVSUl9ERUxBWToKKwljYXNlIC1FVElNRURPVVQ6CisJY2FzZSAtRUFDQ0VTOgorCWNhc2UgLUVBR0FJTjoKKwkJZ290byBvdXQ7CisJfTsKKworCWNscC0+Y2xfc2VxaWQrKzsKIAlpZiAoIXN0YXR1cykgewogCQkvKiBWZXJpZnkgdGhlIHNlc3Npb24ncyBuZWdvdGlhdGVkIGNoYW5uZWxfYXR0cnMgdmFsdWVzICovCiAJCXN0YXR1cyA9IG5mczRfdmVyaWZ5X2NoYW5uZWxfYXR0cnMoJmFyZ3MsICZyZXMpOwogCQkvKiBJbmNyZW1lbnQgdGhlIGNsaWVudGlkIHNsb3Qgc2VxdWVuY2UgaWQgKi8KLQkJaWYgKGNscC0+Y2xfc2VxaWQgPT0gcmVzLnNlcWlkKQotCQkJY2xwLT5jbF9zZXFpZCsrOwogCQlpZiAoc3RhdHVzKQogCQkJZ290byBvdXQ7CiAJCW5mczRfdXBkYXRlX3Nlc3Npb24oc2Vzc2lvbiwgJnJlcyk7CkBAIC03ODY0LDcgKzc5MjgsNyBAQAogCXN0cnVjdCBuZnM0X2xheW91dGdldCAqbGdwID0gY2FsbGRhdGE7CiAKIAlkcHJpbnRrKCItLT4gJXNcbiIsIF9fZnVuY19fKTsKLQluZnM0MV9zZXF1ZW5jZV9kb25lKHRhc2ssICZsZ3AtPnJlcy5zZXFfcmVzKTsKKwluZnM0MV9zZXF1ZW5jZV9wcm9jZXNzKHRhc2ssICZsZ3AtPnJlcy5zZXFfcmVzKTsKIAlkcHJpbnRrKCI8LS0gJXNcbiIsIF9fZnVuY19fKTsKIH0KIApAQCAtODA4MCw2ICs4MTQ0LDcgQEAKIAkvKiBpZiBsYXlvdXRwLT5sZW4gaXMgMCwgbmZzNF9sYXlvdXRnZXRfcHJlcGFyZSBjYWxsZWQgcnBjX2V4aXQgKi8KIAlpZiAoc3RhdHVzID09IDAgJiYgbGdwLT5yZXMubGF5b3V0cC0+bGVuKQogCQlsc2VnID0gcG5mc19sYXlvdXRfcHJvY2VzcyhsZ3ApOworCW5mczRfc2VxdWVuY2VfZnJlZV9zbG90KCZsZ3AtPnJlcy5zZXFfcmVzKTsKIAlycGNfcHV0X3Rhc2sodGFzayk7CiAJZHByaW50aygiPC0tICVzIHN0YXR1cz0lZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJaWYgKHN0YXR1cykKQEAgLTgxMDYsNyArODE3MSw3IEBACiAKIAlkcHJpbnRrKCItLT4gJXNcbiIsIF9fZnVuY19fKTsKIAotCWlmICghbmZzNDFfc2VxdWVuY2VfZG9uZSh0YXNrLCAmbHJwLT5yZXMuc2VxX3JlcykpCisJaWYgKCFuZnM0MV9zZXF1ZW5jZV9wcm9jZXNzKHRhc2ssICZscnAtPnJlcy5zZXFfcmVzKSkKIAkJcmV0dXJuOwogCiAJc2VydmVyID0gTkZTX1NFUlZFUihscnAtPmFyZ3MuaW5vZGUpOwpAQCAtODExOCw2ICs4MTgzLDcgQEAKIAljYXNlIC1ORlM0RVJSX0RFTEFZOgogCQlpZiAobmZzNF9hc3luY19oYW5kbGVfZXJyb3IodGFzaywgc2VydmVyLCBOVUxMLCBOVUxMKSAhPSAtRUFHQUlOKQogCQkJYnJlYWs7CisJCW5mczRfc2VxdWVuY2VfZnJlZV9zbG90KCZscnAtPnJlcy5zZXFfcmVzKTsKIAkJcnBjX3Jlc3RhcnRfY2FsbF9wcmVwYXJlKHRhc2spOwogCQlyZXR1cm47CiAJfQpAQCAtODEzMiwxMiArODE5OCwxNiBAQAogCiAJZHByaW50aygiLS0+ICVzXG4iLCBfX2Z1bmNfXyk7CiAJc3Bpbl9sb2NrKCZsby0+cGxoX2lub2RlLT5pX2xvY2spOwotCXBuZnNfbWFya19tYXRjaGluZ19sc2Vnc19pbnZhbGlkKGxvLCAmZnJlZW1lLCAmbHJwLT5hcmdzLnJhbmdlLAotCQkJYmUzMl90b19jcHUobHJwLT5hcmdzLnN0YXRlaWQuc2VxaWQpKTsKLQlpZiAobHJwLT5yZXMubHJzX3ByZXNlbnQgJiYgcG5mc19sYXlvdXRfaXNfdmFsaWQobG8pKQorCWlmIChscnAtPnJlcy5scnNfcHJlc2VudCkgeworCQlwbmZzX21hcmtfbWF0Y2hpbmdfbHNlZ3NfaW52YWxpZChsbywgJmZyZWVtZSwKKwkJCQkmbHJwLT5hcmdzLnJhbmdlLAorCQkJCWJlMzJfdG9fY3B1KGxycC0+YXJncy5zdGF0ZWlkLnNlcWlkKSk7CiAJCXBuZnNfc2V0X2xheW91dF9zdGF0ZWlkKGxvLCAmbHJwLT5yZXMuc3RhdGVpZCwgdHJ1ZSk7CisJfSBlbHNlCisJCXBuZnNfbWFya19sYXlvdXRfc3RhdGVpZF9pbnZhbGlkKGxvLCAmZnJlZW1lKTsKIAlwbmZzX2NsZWFyX2xheW91dHJldHVybl93YWl0Yml0KGxvKTsKIAlzcGluX3VubG9jaygmbG8tPnBsaF9pbm9kZS0+aV9sb2NrKTsKKwluZnM0X3NlcXVlbmNlX2ZyZWVfc2xvdCgmbHJwLT5yZXMuc2VxX3Jlcyk7CiAJcG5mc19mcmVlX2xzZWdfbGlzdCgmZnJlZW1lKTsKIAlwbmZzX3B1dF9sYXlvdXRfaGRyKGxycC0+YXJncy5sYXlvdXQpOwogCW5mc19pcHV0X2FuZF9kZWFjdGl2ZShscnAtPmlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0c2Vzc2lvbi5jIGIvZnMvbmZzL25mczRzZXNzaW9uLmMKaW5kZXggMzMyZDA2ZS4uYjYyOTczMCAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRzZXNzaW9uLmMKKysrIGIvZnMvbmZzL25mczRzZXNzaW9uLmMKQEAgLTI4LDYgKzI4LDcgQEAKIAl0YmwtPmhpZ2hlc3RfdXNlZF9zbG90aWQgPSBORlM0X05PX1NMT1Q7CiAJc3Bpbl9sb2NrX2luaXQoJnRibC0+c2xvdF90YmxfbG9jayk7CiAJcnBjX2luaXRfcHJpb3JpdHlfd2FpdF9xdWV1ZSgmdGJsLT5zbG90X3RibF93YWl0cSwgcXVldWUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRibC0+c2xvdF93YWl0cSk7CiAJaW5pdF9jb21wbGV0aW9uKCZ0YmwtPmNvbXBsZXRlKTsKIH0KIApAQCAtMTcyLDYgKzE3Myw1OCBAQAogCXJldHVybiBFUlJfUFRSKC1FMkJJRyk7CiB9CiAKK3N0YXRpYyBpbnQgbmZzNF9zbG90X2dldF9zZXFpZChzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICAqdGJsLCB1MzIgc2xvdGlkLAorCQl1MzIgKnNlcV9ucikKKwlfX211c3RfaG9sZCgmdGJsLT5zbG90X3RibF9sb2NrKQoreworCXN0cnVjdCBuZnM0X3Nsb3QgKnNsb3Q7CisKKwlzbG90ID0gbmZzNF9sb29rdXBfc2xvdCh0YmwsIHNsb3RpZCk7CisJaWYgKElTX0VSUihzbG90KSkKKwkJcmV0dXJuIFBUUl9FUlIoc2xvdCk7CisJKnNlcV9uciA9IHNsb3QtPnNlcV9ucjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG5mczRfc2xvdF9zZXFpZF9pbl91c2UgLSB0ZXN0IGlmIGEgc2xvdCBzZXF1ZW5jZSBpZCBpcyBzdGlsbCBpbiB1c2UKKyAqCisgKiBHaXZlbiBhIHNsb3QgdGFibGUsIHNsb3QgaWQgYW5kIHNlcXVlbmNlIG51bWJlciwgZGV0ZXJtaW5lIGlmIHRoZQorICogUlBDIGNhbGwgaW4gcXVlc3Rpb24gaXMgc3RpbGwgaW4gZmxpZ2h0LiBUaGlzIGZ1bmN0aW9uIGlzIG1haW5seQorICogaW50ZW5kZWQgZm9yIHVzZSBieSB0aGUgY2FsbGJhY2sgY2hhbm5lbC4KKyAqLworc3RhdGljIGJvb2wgbmZzNF9zbG90X3NlcWlkX2luX3VzZShzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0YmwsCisJCXUzMiBzbG90aWQsIHUzMiBzZXFfbnIpCit7CisJdTMyIGN1cl9zZXE7CisJYm9vbCByZXQgPSBmYWxzZTsKKworCXNwaW5fbG9jaygmdGJsLT5zbG90X3RibF9sb2NrKTsKKwlpZiAobmZzNF9zbG90X2dldF9zZXFpZCh0YmwsIHNsb3RpZCwgJmN1cl9zZXEpID09IDAgJiYKKwkgICAgY3VyX3NlcSA9PSBzZXFfbnIgJiYgdGVzdF9iaXQoc2xvdGlkLCB0YmwtPnVzZWRfc2xvdHMpKQorCQlyZXQgPSB0cnVlOworCXNwaW5fdW5sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBuZnM0X3Nsb3Rfd2FpdF9vbl9zZXFpZCAtIHdhaXQgdW50aWwgYSBzbG90IHNlcXVlbmNlIGlkIGlzIGNvbXBsZXRlCisgKgorICogR2l2ZW4gYSBzbG90IHRhYmxlLCBzbG90IGlkIGFuZCBzZXF1ZW5jZSBudW1iZXIsIHdhaXQgdW50aWwgdGhlCisgKiBjb3JyZXNwb25kaW5nIFJQQyBjYWxsIGNvbXBsZXRlcy4gVGhpcyBmdW5jdGlvbiBpcyBtYWlubHkKKyAqIGludGVuZGVkIGZvciB1c2UgYnkgdGhlIGNhbGxiYWNrIGNoYW5uZWwuCisgKi8KK2ludCBuZnM0X3Nsb3Rfd2FpdF9vbl9zZXFpZChzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0YmwsCisJCXUzMiBzbG90aWQsIHUzMiBzZXFfbnIsCisJCXVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlpZiAod2FpdF9ldmVudF90aW1lb3V0KHRibC0+c2xvdF93YWl0cSwKKwkJCSFuZnM0X3Nsb3Rfc2VxaWRfaW5fdXNlKHRibCwgc2xvdGlkLCBzZXFfbnIpLAorCQkJdGltZW91dCkgPT0gMCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBuZnM0X2FsbG9jX3Nsb3QgLSBlZmZpY2llbnRseSBsb29rIGZvciBhIGZyZWUgc2xvdAogICoKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0c2Vzc2lvbi5oIGIvZnMvbmZzL25mczRzZXNzaW9uLmgKaW5kZXggNWI1MTI5OC4uZjcwM2I3NSAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRzZXNzaW9uLmgKKysrIGIvZnMvbmZzL25mczRzZXNzaW9uLmgKQEAgLTIxLDcgKzIxLDggQEAKIAl1bnNpZ25lZCBsb25nCQlnZW5lcmF0aW9uOwogCXUzMgkJCXNsb3RfbnI7CiAJdTMyCQkgCXNlcV9ucjsKLQl1bnNpZ25lZCBpbnQJCWludGVycnVwdGVkIDogMTsKKwl1bnNpZ25lZCBpbnQJCWludGVycnVwdGVkIDogMSwKKwkJCQlzZXFfZG9uZSA6IDE7CiB9OwogCiAvKiBTZXNzaW9ucyAqLwpAQCAtMzYsNiArMzcsNyBAQAogCXVuc2lnbmVkIGxvbmcgICB1c2VkX3Nsb3RzW1NMT1RfVEFCTEVfU1pdOyAvKiB1c2VkL3VudXNlZCBiaXRtYXAgKi8KIAlzcGlubG9ja190CXNsb3RfdGJsX2xvY2s7CiAJc3RydWN0IHJwY193YWl0X3F1ZXVlCXNsb3RfdGJsX3dhaXRxOwkvKiBhbGxvY2F0b3JzIG1heSB3YWl0IGhlcmUgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAlzbG90X3dhaXRxOwkvKiBDb21wbGV0aW9uIHdhaXQgb24gc2xvdCAqLwogCXUzMgkJbWF4X3Nsb3RzOwkJLyogIyBzbG90cyBpbiB0YWJsZSAqLwogCXUzMgkJbWF4X3Nsb3RpZDsJCS8qIE1heCBhbGxvd2VkIHNsb3RpZCB2YWx1ZSAqLwogCXUzMgkJaGlnaGVzdF91c2VkX3Nsb3RpZDsJLyogc2VudCB0byBzZXJ2ZXIgb24gZWFjaCBTRVEuCkBAIC03OCw2ICs4MCw5IEBACiBleHRlcm4gdm9pZCBuZnM0X3NodXRkb3duX3Nsb3RfdGFibGUoc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsKTsKIGV4dGVybiBzdHJ1Y3QgbmZzNF9zbG90ICpuZnM0X2FsbG9jX3Nsb3Qoc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsKTsKIGV4dGVybiBzdHJ1Y3QgbmZzNF9zbG90ICpuZnM0X2xvb2t1cF9zbG90KHN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibCwgdTMyIHNsb3RpZCk7CitleHRlcm4gaW50IG5mczRfc2xvdF93YWl0X29uX3NlcWlkKHN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibCwKKwkJdTMyIHNsb3RpZCwgdTMyIHNlcV9uciwKKwkJdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKIGV4dGVybiBib29sIG5mczRfdHJ5X3RvX2xvY2tfc2xvdChzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0YmwsIHN0cnVjdCBuZnM0X3Nsb3QgKnNsb3QpOwogZXh0ZXJuIHZvaWQgbmZzNF9mcmVlX3Nsb3Qoc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsLCBzdHJ1Y3QgbmZzNF9zbG90ICpzbG90KTsKIGV4dGVybiB2b2lkIG5mczRfc2xvdF90YmxfZHJhaW5fY29tcGxldGUoc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9wbmZzLmMgYi9mcy9uZnMvcG5mcy5jCmluZGV4IDcwODA2Y2EuLjJjOTNhODUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wbmZzLmMKKysrIGIvZnMvbmZzL3BuZnMuYwpAQCAtMzY1LDcgKzM2NSw4IEBACiAJLyogTWF0Y2hlZCBieSBwbmZzX2dldF9sYXlvdXRfaGRyIGluIHBuZnNfbGF5b3V0X2luc2VydF9sc2VnICovCiAJYXRvbWljX2RlYygmbG8tPnBsaF9yZWZjb3VudCk7CiAJaWYgKGxpc3RfZW1wdHkoJmxvLT5wbGhfc2VncykpIHsKLQkJc2V0X2JpdChORlNfTEFZT1VUX0lOVkFMSURfU1RJRCwgJmxvLT5wbGhfZmxhZ3MpOworCQlpZiAoYXRvbWljX3JlYWQoJmxvLT5wbGhfb3V0c3RhbmRpbmcpID09IDApCisJCQlzZXRfYml0KE5GU19MQVlPVVRfSU5WQUxJRF9TVElELCAmbG8tPnBsaF9mbGFncyk7CiAJCWNsZWFyX2JpdChORlNfTEFZT1VUX0JVTEtfUkVDQUxMLCAmbG8tPnBsaF9mbGFncyk7CiAJfQogCXJwY193YWtlX3VwKCZORlNfU0VSVkVSKGlub2RlKS0+cm9jX3JwY3dhaXRxKTsKQEAgLTc2OCwxNyArNzY5LDMyIEBACiAJcG5mc19kZXN0cm95X2xheW91dHNfYnljbGlkKGNscCwgZmFsc2UpOwogfQogCitzdGF0aWMgdm9pZAorcG5mc19jbGVhcl9sYXlvdXRyZXR1cm5faW5mbyhzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbykKK3sKKwlsby0+cGxoX3JldHVybl9pb21vZGUgPSAwOworCWxvLT5wbGhfcmV0dXJuX3NlcSA9IDA7CisJY2xlYXJfYml0KE5GU19MQVlPVVRfUkVUVVJOX1JFUVVFU1RFRCwgJmxvLT5wbGhfZmxhZ3MpOworfQorCiAvKiB1cGRhdGUgbG8tPnBsaF9zdGF0ZWlkIHdpdGggbmV3IGlmIGlzIG1vcmUgcmVjZW50ICovCiB2b2lkCiBwbmZzX3NldF9sYXlvdXRfc3RhdGVpZChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywgY29uc3QgbmZzNF9zdGF0ZWlkICpuZXcsCiAJCQlib29sIHVwZGF0ZV9iYXJyaWVyKQogewogCXUzMiBvbGRzZXEsIG5ld3NlcSwgbmV3X2JhcnJpZXIgPSAwOwotCWJvb2wgaW52YWxpZCA9ICFwbmZzX2xheW91dF9pc192YWxpZChsbyk7CiAKIAlvbGRzZXEgPSBiZTMyX3RvX2NwdShsby0+cGxoX3N0YXRlaWQuc2VxaWQpOwogCW5ld3NlcSA9IGJlMzJfdG9fY3B1KG5ldy0+c2VxaWQpOwotCWlmIChpbnZhbGlkIHx8IHBuZnNfc2VxaWRfaXNfbmV3ZXIobmV3c2VxLCBvbGRzZXEpKSB7CisKKwlpZiAoIXBuZnNfbGF5b3V0X2lzX3ZhbGlkKGxvKSkgeworCQluZnM0X3N0YXRlaWRfY29weSgmbG8tPnBsaF9zdGF0ZWlkLCBuZXcpOworCQlsby0+cGxoX2JhcnJpZXIgPSBuZXdzZXE7CisJCXBuZnNfY2xlYXJfbGF5b3V0cmV0dXJuX2luZm8obG8pOworCQljbGVhcl9iaXQoTkZTX0xBWU9VVF9JTlZBTElEX1NUSUQsICZsby0+cGxoX2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocG5mc19zZXFpZF9pc19uZXdlcihuZXdzZXEsIG9sZHNlcSkpIHsKIAkJbmZzNF9zdGF0ZWlkX2NvcHkoJmxvLT5wbGhfc3RhdGVpZCwgbmV3KTsKIAkJLyoKIAkJICogQmVjYXVzZSBvZiB3cmFwYXJvdW5kLCB3ZSB3YW50IHRvIGtlZXAgdGhlIGJhcnJpZXIKQEAgLTc5MCw3ICs4MDYsNyBAQAogCQluZXdfYmFycmllciA9IGJlMzJfdG9fY3B1KG5ldy0+c2VxaWQpOwogCWVsc2UgaWYgKG5ld19iYXJyaWVyID09IDApCiAJCXJldHVybjsKLQlpZiAoaW52YWxpZCB8fCBwbmZzX3NlcWlkX2lzX25ld2VyKG5ld19iYXJyaWVyLCBsby0+cGxoX2JhcnJpZXIpKQorCWlmIChwbmZzX3NlcWlkX2lzX25ld2VyKG5ld19iYXJyaWVyLCBsby0+cGxoX2JhcnJpZXIpKQogCQlsby0+cGxoX2JhcnJpZXIgPSBuZXdfYmFycmllcjsKIH0KIApAQCAtODg2LDE5ICs5MDIsMTQgQEAKIAlycGNfd2FrZV91cCgmTkZTX1NFUlZFUihsby0+cGxoX2lub2RlKS0+cm9jX3JwY3dhaXRxKTsKIH0KIAotc3RhdGljIHZvaWQKLXBuZnNfY2xlYXJfbGF5b3V0cmV0dXJuX2luZm8oc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8pCi17Ci0JbG8tPnBsaF9yZXR1cm5faW9tb2RlID0gMDsKLQlsby0+cGxoX3JldHVybl9zZXEgPSAwOwotCWNsZWFyX2JpdChORlNfTEFZT1VUX1JFVFVSTl9SRVFVRVNURUQsICZsby0+cGxoX2ZsYWdzKTsKLX0KLQogc3RhdGljIGJvb2wKIHBuZnNfcHJlcGFyZV9sYXlvdXRyZXR1cm4oc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sCiAJCW5mczRfc3RhdGVpZCAqc3RhdGVpZCwKIAkJZW51bSBwbmZzX2lvbW9kZSAqaW9tb2RlKQogeworCS8qIFNlcmlhbGlzZSBMQVlPVVRHRVQvTEFZT1VUUkVUVVJOICovCisJaWYgKGF0b21pY19yZWFkKCZsby0+cGxoX291dHN0YW5kaW5nKSAhPSAwKQorCQlyZXR1cm4gZmFsc2U7CiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoTkZTX0xBWU9VVF9SRVRVUk4sICZsby0+cGxoX2ZsYWdzKSkKIAkJcmV0dXJuIGZhbHNlOwogCXBuZnNfZ2V0X2xheW91dF9oZHIobG8pOwpAQCAtMTU1NSw2ICsxNTY2LDcgQEAKIAl9CiAKIGxvb2t1cF9hZ2FpbjoKKwluZnM0X2NsaWVudF9yZWNvdmVyX2V4cGlyZWRfbGVhc2UoY2xwKTsKIAlmaXJzdCA9IGZhbHNlOwogCXNwaW5fbG9jaygmaW5vLT5pX2xvY2spOwogCWxvID0gcG5mc19maW5kX2FsbG9jX2xheW91dChpbm8sIGN0eCwgZ2ZwX2ZsYWdzKTsKQEAgLTE3OTcsMTYgKzE4MDksMTEgQEAKIAkJICovCiAJCXBuZnNfbWFya19sYXlvdXRfc3RhdGVpZF9pbnZhbGlkKGxvLCAmZnJlZV9tZSk7CiAKLQkJbmZzNF9zdGF0ZWlkX2NvcHkoJmxvLT5wbGhfc3RhdGVpZCwgJnJlcy0+c3RhdGVpZCk7Ci0JCWxvLT5wbGhfYmFycmllciA9IGJlMzJfdG9fY3B1KHJlcy0+c3RhdGVpZC5zZXFpZCk7CisJCXBuZnNfc2V0X2xheW91dF9zdGF0ZWlkKGxvLCAmcmVzLT5zdGF0ZWlkLCB0cnVlKTsKIAl9CiAKIAlwbmZzX2dldF9sc2VnKGxzZWcpOwogCXBuZnNfbGF5b3V0X2luc2VydF9sc2VnKGxvLCBsc2VnLCAmZnJlZV9tZSk7Ci0JaWYgKCFwbmZzX2xheW91dF9pc192YWxpZChsbykpIHsKLQkJcG5mc19jbGVhcl9sYXlvdXRyZXR1cm5faW5mbyhsbyk7Ci0JCWNsZWFyX2JpdChORlNfTEFZT1VUX0lOVkFMSURfU1RJRCwgJmxvLT5wbGhfZmxhZ3MpOwotCX0KIAogCiAJaWYgKHJlcy0+cmV0dXJuX29uX2Nsb3NlKQpAQCAtMjUxMCw3ICsyNTE3LDYgQEAKIAogCWRhdGEtPmFyZ3MuZmggPSBORlNfRkgoaW5vZGUpOwogCWRhdGEtPmFyZ3MuaW5vZGUgPSBpbm9kZTsKLQluZnM0X3N0YXRlaWRfY29weSgmZGF0YS0+YXJncy5zdGF0ZWlkLCAmaGRyLT5wbGhfc3RhdGVpZCk7CiAJc3RhdHVzID0gbGQtPnByZXBhcmVfbGF5b3V0c3RhdHMoJmRhdGEtPmFyZ3MpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0X2ZyZWU7CmRpZmYgLS1naXQgYS9mcy9uZnMvc3VwZXIuYyBiL2ZzL25mcy9zdXBlci5jCmluZGV4IDE4ZDQ0NmUuLmQzOTYwMTMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9zdXBlci5jCisrKyBiL2ZzL25mcy9zdXBlci5jCkBAIC05MjMsNiArOTIzLDggQEAKIAogCWRhdGEgPSBremFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOwogCWlmIChkYXRhKSB7CisJCWRhdGEtPnRpbWVvCQk9IE5GU19VTlNQRUNfVElNRU87CisJCWRhdGEtPnJldHJhbnMJCT0gTkZTX1VOU1BFQ19SRVRSQU5TOwogCQlkYXRhLT5hY3JlZ21pbgkJPSBORlNfREVGX0FDUkVHTUlOOwogCQlkYXRhLT5hY3JlZ21heAkJPSBORlNfREVGX0FDUkVHTUFYOwogCQlkYXRhLT5hY2Rpcm1pbgkJPSBORlNfREVGX0FDRElSTUlOOwpAQCAtMTE4OSw2ICsxMTkxLDE5IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IG5mc19nZXRfb3B0aW9uX3VsX2JvdW5kKHN1YnN0cmluZ190IGFyZ3NbXSwgdW5zaWduZWQgbG9uZyAqb3B0aW9uLAorCQl1bnNpZ25lZCBsb25nIGxfYm91bmQsIHVuc2lnbmVkIGxvbmcgdV9ib3VuZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gbmZzX2dldF9vcHRpb25fdWwoYXJncywgb3B0aW9uKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisJaWYgKCpvcHRpb24gPCBsX2JvdW5kIHx8ICpvcHRpb24gPiB1X2JvdW5kKQorCQlyZXR1cm4gLUVSQU5HRTsKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIEVycm9yLWNoZWNrIGFuZCBjb252ZXJ0IGEgc3RyaW5nIG9mIG1vdW50IG9wdGlvbnMgZnJvbSB1c2VyIHNwYWNlIGludG8KICAqIGEgZGF0YSBzdHJ1Y3R1cmUuICBUaGUgd2hvbGUgbW91bnQgc3RyaW5nIGlzIHByb2Nlc3NlZDsgYmFkIG9wdGlvbnMgYXJlCkBAIC0xMzUyLDEyICsxMzY3LDEyIEBACiAJCQltbnQtPmJzaXplID0gb3B0aW9uOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X3RpbWVvOgotCQkJaWYgKG5mc19nZXRfb3B0aW9uX3VsKGFyZ3MsICZvcHRpb24pIHx8IG9wdGlvbiA9PSAwKQorCQkJaWYgKG5mc19nZXRfb3B0aW9uX3VsX2JvdW5kKGFyZ3MsICZvcHRpb24sIDEsIElOVF9NQVgpKQogCQkJCWdvdG8gb3V0X2ludmFsaWRfdmFsdWU7CiAJCQltbnQtPnRpbWVvID0gb3B0aW9uOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X3JldHJhbnM6Ci0JCQlpZiAobmZzX2dldF9vcHRpb25fdWwoYXJncywgJm9wdGlvbikgfHwgb3B0aW9uID09IDApCisJCQlpZiAobmZzX2dldF9vcHRpb25fdWxfYm91bmQoYXJncywgJm9wdGlvbiwgMCwgSU5UX01BWCkpCiAJCQkJZ290byBvdXRfaW52YWxpZF92YWx1ZTsKIAkJCW1udC0+cmV0cmFucyA9IG9wdGlvbjsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5LmMgYi9mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuYwppbmRleCBkMmY5N2VjLi5lMGU1ZjdjIDEwMDY0NAotLS0gYS9mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuYworKysgYi9mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuYwpAQCAtNjcsMTggKzY3LDcgQEAKIAogCXByX2RlYnVnKCIlczogZ3JvdXA9JXAgZXZlbnQ9JXBcbiIsIF9fZnVuY19fLCBncm91cCwgZXZlbnQpOwogCi0Jd2FpdF9ldmVudChncm91cC0+ZmFub3RpZnlfZGF0YS5hY2Nlc3Nfd2FpdHEsIGV2ZW50LT5yZXNwb25zZSB8fAotCQkJCWF0b21pY19yZWFkKCZncm91cC0+ZmFub3RpZnlfZGF0YS5ieXBhc3NfcGVybSkpOwotCi0JaWYgKCFldmVudC0+cmVzcG9uc2UpIHsJLyogYnlwYXNzX3Blcm0gc2V0ICovCi0JCS8qCi0JCSAqIEV2ZW50IHdhcyBjYW5jZWxlZCBiZWNhdXNlIGdyb3VwIGlzIGJlaW5nIGRlc3Ryb3llZC4gUmVtb3ZlCi0JCSAqIGl0IGZyb20gZ3JvdXAncyBldmVudCBsaXN0IGJlY2F1c2Ugd2UgYXJlIHJlc3BvbnNpYmxlIGZvcgotCQkgKiBmcmVlaW5nIHRoZSBwZXJtaXNzaW9uIGV2ZW50LgotCQkgKi8KLQkJZnNub3RpZnlfcmVtb3ZlX2V2ZW50KGdyb3VwLCAmZXZlbnQtPmZhZS5mc2UpOwotCQlyZXR1cm4gMDsKLQl9CisJd2FpdF9ldmVudChncm91cC0+ZmFub3RpZnlfZGF0YS5hY2Nlc3Nfd2FpdHEsIGV2ZW50LT5yZXNwb25zZSk7CiAKIAkvKiB1c2Vyc3BhY2UgcmVzcG9uZGVkLCBjb252ZXJ0IHRvIHNvbWV0aGluZyB1c2FibGUgKi8KIAlzd2l0Y2ggKGV2ZW50LT5yZXNwb25zZSkgewpkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5X3VzZXIuYyBiL2ZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeV91c2VyLmMKaW5kZXggOGU4ZTZiYy4uYTY0MzEzOCAxMDA2NDQKLS0tIGEvZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5X3VzZXIuYworKysgYi9mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnlfdXNlci5jCkBAIC0zNTgsMTYgKzM1OCwyMCBAQAogCiAjaWZkZWYgQ09ORklHX0ZBTk9USUZZX0FDQ0VTU19QRVJNSVNTSU9OUwogCXN0cnVjdCBmYW5vdGlmeV9wZXJtX2V2ZW50X2luZm8gKmV2ZW50LCAqbmV4dDsKKwlzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmZzbl9ldmVudDsKIAogCS8qCi0JICogVGhlcmUgbWF5IGJlIHN0aWxsIG5ldyBldmVudHMgYXJyaXZpbmcgaW4gdGhlIG5vdGlmaWNhdGlvbiBxdWV1ZQotCSAqIGJ1dCBzaW5jZSB1c2Vyc3BhY2UgY2Fubm90IHVzZSBmYW5vdGlmeSBmZCBhbnltb3JlLCBubyBldmVudCBjYW4KLQkgKiBlbnRlciBvciBsZWF2ZSBhY2Nlc3NfbGlzdCBieSBub3cuCisJICogU3RvcCBuZXcgZXZlbnRzIGZyb20gYXJyaXZpbmcgaW4gdGhlIG5vdGlmaWNhdGlvbiBxdWV1ZS4gc2luY2UKKwkgKiB1c2Vyc3BhY2UgY2Fubm90IHVzZSBmYW5vdGlmeSBmZCBhbnltb3JlLCBubyBldmVudCBjYW4gZW50ZXIgb3IKKwkgKiBsZWF2ZSBhY2Nlc3NfbGlzdCBieSBub3cgZWl0aGVyLgorCSAqLworCWZzbm90aWZ5X2dyb3VwX3N0b3BfcXVldWVpbmcoZ3JvdXApOworCisJLyoKKwkgKiBQcm9jZXNzIGFsbCBwZXJtaXNzaW9uIGV2ZW50cyBvbiBhY2Nlc3NfbGlzdCBhbmQgbm90aWZpY2F0aW9uIHF1ZXVlCisJICogYW5kIHNpbXVsYXRlIHJlcGx5IGZyb20gdXNlcnNwYWNlLgogCSAqLwogCXNwaW5fbG9jaygmZ3JvdXAtPmZhbm90aWZ5X2RhdGEuYWNjZXNzX2xvY2spOwotCi0JYXRvbWljX2luYygmZ3JvdXAtPmZhbm90aWZ5X2RhdGEuYnlwYXNzX3Blcm0pOwotCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV2ZW50LCBuZXh0LCAmZ3JvdXAtPmZhbm90aWZ5X2RhdGEuYWNjZXNzX2xpc3QsCiAJCQkJIGZhZS5mc2UubGlzdCkgewogCQlwcl9kZWJ1ZygiJXM6IGZvdW5kIGdyb3VwPSVwIGV2ZW50PSVwXG4iLCBfX2Z1bmNfXywgZ3JvdXAsCkBAIC0zNzksMTIgKzM4MywyMSBAQAogCXNwaW5fdW5sb2NrKCZncm91cC0+ZmFub3RpZnlfZGF0YS5hY2Nlc3NfbG9jayk7CiAKIAkvKgotCSAqIFNpbmNlIGJ5cGFzc19wZXJtIGlzIHNldCwgbmV3bHkgcXVldWVkIGV2ZW50cyB3aWxsIG5vdCB3YWl0IGZvcgotCSAqIGFjY2VzcyByZXNwb25zZS4gV2FrZSB1cCB0aGUgYWxyZWFkeSBzbGVlcGluZyBvbmVzIG5vdy4KLQkgKiBzeW5jaHJvbml6ZV9zcmN1KCkgaW4gZnNub3RpZnlfZGVzdHJveV9ncm91cCgpIHdpbGwgd2FpdCBmb3IgYWxsCi0JICogcHJvY2Vzc2VzIHNsZWVwaW5nIGluIGZhbm90aWZ5X2hhbmRsZV9ldmVudCgpIHdhaXRpbmcgZm9yIGFjY2VzcwotCSAqIHJlc3BvbnNlIGFuZCB0aHVzIGFsc28gZm9yIGFsbCBwZXJtaXNzaW9uIGV2ZW50cyB0byBiZSBmcmVlZC4KKwkgKiBEZXN0cm95IGFsbCBub24tcGVybWlzc2lvbiBldmVudHMuIEZvciBwZXJtaXNzaW9uIGV2ZW50cyBqdXN0CisJICogZGVxdWV1ZSB0aGVtIGFuZCBzZXQgdGhlIHJlc3BvbnNlLiBUaGV5IHdpbGwgYmUgZnJlZWQgb25jZSB0aGUKKwkgKiByZXNwb25zZSBpcyBjb25zdW1lZCBhbmQgZmFub3RpZnlfZ2V0X3Jlc3BvbnNlKCkgcmV0dXJucy4KIAkgKi8KKwltdXRleF9sb2NrKCZncm91cC0+bm90aWZpY2F0aW9uX211dGV4KTsKKwl3aGlsZSAoIWZzbm90aWZ5X25vdGlmeV9xdWV1ZV9pc19lbXB0eShncm91cCkpIHsKKwkJZnNuX2V2ZW50ID0gZnNub3RpZnlfcmVtb3ZlX2ZpcnN0X2V2ZW50KGdyb3VwKTsKKwkJaWYgKCEoZnNuX2V2ZW50LT5tYXNrICYgRkFOX0FMTF9QRVJNX0VWRU5UUykpCisJCQlmc25vdGlmeV9kZXN0cm95X2V2ZW50KGdyb3VwLCBmc25fZXZlbnQpOworCQllbHNlCisJCQlGQU5PVElGWV9QRShmc25fZXZlbnQpLT5yZXNwb25zZSA9IEZBTl9BTExPVzsKKwl9CisJbXV0ZXhfdW5sb2NrKCZncm91cC0+bm90aWZpY2F0aW9uX211dGV4KTsKKworCS8qIFJlc3BvbnNlIGZvciBhbGwgcGVybWlzc2lvbiBldmVudHMgaXQgc2V0LCB3YWtldXAgd2FpdGVycyAqLwogCXdha2VfdXAoJmdyb3VwLT5mYW5vdGlmeV9kYXRhLmFjY2Vzc193YWl0cSk7CiAjZW5kaWYKIApAQCAtNzU1LDcgKzc2OCw2IEBACiAJc3Bpbl9sb2NrX2luaXQoJmdyb3VwLT5mYW5vdGlmeV9kYXRhLmFjY2Vzc19sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZncm91cC0+ZmFub3RpZnlfZGF0YS5hY2Nlc3Nfd2FpdHEpOwogCUlOSVRfTElTVF9IRUFEKCZncm91cC0+ZmFub3RpZnlfZGF0YS5hY2Nlc3NfbGlzdCk7Ci0JYXRvbWljX3NldCgmZ3JvdXAtPmZhbm90aWZ5X2RhdGEuYnlwYXNzX3Blcm0sIDApOwogI2VuZGlmCiAJc3dpdGNoIChmbGFncyAmIEZBTl9BTExfQ0xBU1NfQklUUykgewogCWNhc2UgRkFOX0NMQVNTX05PVElGOgpkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L2dyb3VwLmMgYi9mcy9ub3RpZnkvZ3JvdXAuYwppbmRleCAzZTJkZDg1Li5iNDdmN2NmIDEwMDY0NAotLS0gYS9mcy9ub3RpZnkvZ3JvdXAuYworKysgYi9mcy9ub3RpZnkvZ3JvdXAuYwpAQCAtNDAsNiArNDAsMTcgQEAKIH0KIAogLyoKKyAqIFN0b3AgcXVldWVpbmcgbmV3IGV2ZW50cyBmb3IgdGhpcyBncm91cC4gT25jZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAqIGZzbm90aWZ5X2FkZF9ldmVudCgpIHdpbGwgbm90IGFkZCBhbnkgbmV3IGV2ZW50cyB0byB0aGUgZ3JvdXAncyBxdWV1ZS4KKyAqLwordm9pZCBmc25vdGlmeV9ncm91cF9zdG9wX3F1ZXVlaW5nKHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXApCit7CisJbXV0ZXhfbG9jaygmZ3JvdXAtPm5vdGlmaWNhdGlvbl9tdXRleCk7CisJZ3JvdXAtPnNodXRkb3duID0gdHJ1ZTsKKwltdXRleF91bmxvY2soJmdyb3VwLT5ub3RpZmljYXRpb25fbXV0ZXgpOworfQorCisvKgogICogVHJ5aW5nIHRvIGdldCByaWQgb2YgYSBncm91cC4gUmVtb3ZlIGFsbCBtYXJrcywgZmx1c2ggYWxsIGV2ZW50cyBhbmQgcmVsZWFzZQogICogdGhlIGdyb3VwIHJlZmVyZW5jZS4KICAqIE5vdGUgdGhhdCBhbm90aGVyIHRocmVhZCBjYWxsaW5nIGZzbm90aWZ5X2NsZWFyX21hcmtzX2J5X2dyb3VwKCkgbWF5IHN0aWxsCkBAIC00Nyw2ICs1OCwxNCBAQAogICovCiB2b2lkIGZzbm90aWZ5X2Rlc3Ryb3lfZ3JvdXAoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCkKIHsKKwkvKgorCSAqIFN0b3AgcXVldWVpbmcgbmV3IGV2ZW50cy4gVGhlIGNvZGUgYmVsb3cgaXMgY2FyZWZ1bCBlbm91Z2ggdG8gbm90CisJICogcmVxdWlyZSB0aGlzIGJ1dCBmYW5vdGlmeSBuZWVkcyB0byBzdG9wIHF1ZXVpbmcgZXZlbnRzIGV2ZW4gYmVmb3JlCisJICogZnNub3RpZnlfZGVzdHJveV9ncm91cCgpIGlzIGNhbGxlZCBhbmQgdGhpcyBtYWtlcyB0aGUgb3RoZXIgY2FsbGVycworCSAqIG9mIGZzbm90aWZ5X2Rlc3Ryb3lfZ3JvdXAoKSB0byBzZWUgdGhlIHNhbWUgYmVoYXZpb3IuCisJICovCisJZnNub3RpZnlfZ3JvdXBfc3RvcF9xdWV1ZWluZyhncm91cCk7CisKIAkvKiBjbGVhciBhbGwgaW5vZGUgbWFya3MgZm9yIHRoaXMgZ3JvdXAsIGF0dGFjaCB0aGVtIHRvIGRlc3Ryb3lfbGlzdCAqLwogCWZzbm90aWZ5X2RldGFjaF9ncm91cF9tYXJrcyhncm91cCk7CiAKZGlmZiAtLWdpdCBhL2ZzL25vdGlmeS9ub3RpZmljYXRpb24uYyBiL2ZzL25vdGlmeS9ub3RpZmljYXRpb24uYwppbmRleCBhOTVkOGUwLi5lNDU1ZTgzIDEwMDY0NAotLS0gYS9mcy9ub3RpZnkvbm90aWZpY2F0aW9uLmMKKysrIGIvZnMvbm90aWZ5L25vdGlmaWNhdGlvbi5jCkBAIC04Miw3ICs4Miw4IEBACiAgKiBBZGQgYW4gZXZlbnQgdG8gdGhlIGdyb3VwIG5vdGlmaWNhdGlvbiBxdWV1ZS4gIFRoZSBncm91cCBjYW4gbGF0ZXIgcHVsbCB0aGlzCiAgKiBldmVudCBvZmYgdGhlIHF1ZXVlIHRvIGRlYWwgd2l0aC4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIDAgaWYgdGhlIGV2ZW50IHdhcwogICogYWRkZWQgdG8gdGhlIHF1ZXVlLCAxIGlmIHRoZSBldmVudCB3YXMgbWVyZ2VkIHdpdGggc29tZSBvdGhlciBxdWV1ZWQgZXZlbnQsCi0gKiAyIGlmIHRoZSBxdWV1ZSBvZiBldmVudHMgaGFzIG92ZXJmbG93bi4KKyAqIDIgaWYgdGhlIGV2ZW50IHdhcyBub3QgcXVldWVkIC0gZWl0aGVyIHRoZSBxdWV1ZSBvZiBldmVudHMgaGFzIG92ZXJmbG93bgorICogb3IgdGhlIGdyb3VwIGlzIHNodXR0aW5nIGRvd24uCiAgKi8KIGludCBmc25vdGlmeV9hZGRfZXZlbnQoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCwKIAkJICAgICAgIHN0cnVjdCBmc25vdGlmeV9ldmVudCAqZXZlbnQsCkBAIC05Niw2ICs5NywxMSBAQAogCiAJbXV0ZXhfbG9jaygmZ3JvdXAtPm5vdGlmaWNhdGlvbl9tdXRleCk7CiAKKwlpZiAoZ3JvdXAtPnNodXRkb3duKSB7CisJCW11dGV4X3VubG9jaygmZ3JvdXAtPm5vdGlmaWNhdGlvbl9tdXRleCk7CisJCXJldHVybiAyOworCX0KKwogCWlmIChncm91cC0+cV9sZW4gPj0gZ3JvdXAtPm1heF9ldmVudHMpIHsKIAkJcmV0ID0gMjsKIAkJLyogUXVldWUgb3ZlcmZsb3cgZXZlbnQgb25seSBpZiBpdCBpc24ndCBhbHJlYWR5IHF1ZXVlZCAqLwpAQCAtMTI2LDIxICsxMzIsNiBAQAogfQogCiAvKgotICogUmVtb3ZlIEBldmVudCBmcm9tIGdyb3VwJ3Mgbm90aWZpY2F0aW9uIHF1ZXVlLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YKLSAqIHRoZSBjYWxsZXIgdG8gZGVzdHJveSB0aGUgZXZlbnQuCi0gKi8KLXZvaWQgZnNub3RpZnlfcmVtb3ZlX2V2ZW50KHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXAsCi0JCQkgICBzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmV2ZW50KQotewotCW11dGV4X2xvY2soJmdyb3VwLT5ub3RpZmljYXRpb25fbXV0ZXgpOwotCWlmICghbGlzdF9lbXB0eSgmZXZlbnQtPmxpc3QpKSB7Ci0JCWxpc3RfZGVsX2luaXQoJmV2ZW50LT5saXN0KTsKLQkJZ3JvdXAtPnFfbGVuLS07Ci0JfQotCW11dGV4X3VubG9jaygmZ3JvdXAtPm5vdGlmaWNhdGlvbl9tdXRleCk7Ci19Ci0KLS8qCiAgKiBSZW1vdmUgYW5kIHJldHVybiB0aGUgZmlyc3QgZXZlbnQgZnJvbSB0aGUgbm90aWZpY2F0aW9uIGxpc3QuICBJdCBpcyB0aGUKICAqIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gZGVzdHJveSB0aGUgb2J0YWluZWQgZXZlbnQKICAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYWxsb2MuYyBiL2ZzL29jZnMyL2FsbG9jLmMKaW5kZXggN2RhYmJjMy4uZjE2NWY4NiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYWxsb2MuYworKysgYi9mcy9vY2ZzMi9hbGxvYy5jCkBAIC01OTIyLDcgKzU5MjIsNiBAQAogfQogCiBzdGF0aWMgaW50IG9jZnMyX3JlcGxheV90cnVuY2F0ZV9yZWNvcmRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCQkgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJIHN0cnVjdCBpbm9kZSAqZGF0YV9hbGxvY19pbm9kZSwKIAkJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqZGF0YV9hbGxvY19iaCkKIHsKQEAgLTU5MzUsMTEgKzU5MzQsMTkgQEAKIAlzdHJ1Y3Qgb2NmczJfdHJ1bmNhdGVfbG9nICp0bDsKIAlzdHJ1Y3QgaW5vZGUgKnRsX2lub2RlID0gb3NiLT5vc2JfdGxfaW5vZGU7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICp0bF9iaCA9IG9zYi0+b3NiX3RsX2JoOworCWhhbmRsZV90ICpoYW5kbGU7CiAKIAlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIHRsX2JoLT5iX2RhdGE7CiAJdGwgPSAmZGktPmlkMi5pX2RlYWxsb2M7CiAJaSA9IGxlMTZfdG9fY3B1KHRsLT50bF91c2VkKSAtIDE7CiAJd2hpbGUgKGkgPj0gMCkgeworCQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1RSVU5DQVRFX0xPR19GTFVTSF9PTkVfUkVDKTsKKwkJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQlnb3RvIGJhaWw7CisJCX0KKwogCQkvKiBDYWxsZXIgaGFzIGdpdmVuIHVzIGF0IGxlYXN0IGVub3VnaCBjcmVkaXRzIHRvCiAJCSAqIHVwZGF0ZSB0aGUgdHJ1bmNhdGUgbG9nIGRpbm9kZSAqLwogCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIElOT0RFX0NBQ0hFKHRsX2lub2RlKSwgdGxfYmgsCkBAIC01OTc0LDEyICs1OTgxLDcgQEAKIAkJCX0KIAkJfQogCi0JCXN0YXR1cyA9IG9jZnMyX2V4dGVuZF90cmFucyhoYW5kbGUsCi0JCQkJT0NGUzJfVFJVTkNBVEVfTE9HX0ZMVVNIX09ORV9SRUMpOwotCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQkJZ290byBiYWlsOwotCQl9CisJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAJCWktLTsKIAl9CiAKQEAgLTU5OTQsNyArNTk5Niw2IEBACiB7CiAJaW50IHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgbnVtX3RvX2ZsdXNoOwotCWhhbmRsZV90ICpoYW5kbGU7CiAJc3RydWN0IGlub2RlICp0bF9pbm9kZSA9IG9zYi0+b3NiX3RsX2lub2RlOwogCXN0cnVjdCBpbm9kZSAqZGF0YV9hbGxvY19pbm9kZSA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICp0bF9iaCA9IG9zYi0+b3NiX3RsX2JoOwpAQCAtNjAzOCwyMSArNjAzOSwxMSBAQAogCQlnb3RvIG91dF9tdXRleDsKIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1RSVU5DQVRFX0xPR19GTFVTSF9PTkVfUkVDKTsKLQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KLQlzdGF0dXMgPSBvY2ZzMl9yZXBsYXlfdHJ1bmNhdGVfcmVjb3Jkcyhvc2IsIGhhbmRsZSwgZGF0YV9hbGxvY19pbm9kZSwKKwlzdGF0dXMgPSBvY2ZzMl9yZXBsYXlfdHJ1bmNhdGVfcmVjb3Jkcyhvc2IsIGRhdGFfYWxsb2NfaW5vZGUsCiAJCQkJCSAgICAgICBkYXRhX2FsbG9jX2JoKTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCi0Jb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKLQotb3V0X3VubG9jazoKIAlicmVsc2UoZGF0YV9hbGxvY19iaCk7CiAJb2NmczJfaW5vZGVfdW5sb2NrKGRhdGFfYWxsb2NfaW5vZGUsIDEpOwogCkBAIC02NDEzLDQzICs2NDA0LDM0IEBACiAJCWdvdG8gb3V0X211dGV4OwogCX0KIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfU1VCQUxMT0NfRlJFRSk7Ci0JaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCiAJd2hpbGUgKGhlYWQpIHsKIAkJaWYgKGhlYWQtPmZyZWVfYmcpCiAJCQliZ19ibGtubyA9IGhlYWQtPmZyZWVfYmc7CiAJCWVsc2UKIAkJCWJnX2Jsa25vID0gb2NmczJfd2hpY2hfc3ViYWxsb2NfZ3JvdXAoaGVhZC0+ZnJlZV9ibGssCiAJCQkJCQkJICAgICAgaGVhZC0+ZnJlZV9iaXQpOworCQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1NVQkFMTE9DX0ZSRUUpOworCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCiAJCXRyYWNlX29jZnMyX2ZyZWVfY2FjaGVkX2Jsb2NrcygKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWhlYWQtPmZyZWVfYmxrLCBoZWFkLT5mcmVlX2JpdCk7CiAKIAkJcmV0ID0gb2NmczJfZnJlZV9zdWJhbGxvY19iaXRzKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAogCQkJCQkgICAgICAgaGVhZC0+ZnJlZV9iaXQsIGJnX2Jsa25vLCAxKTsKLQkJaWYgKHJldCkgeworCQlpZiAocmV0KQogCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXRfam91cm5hbDsKLQkJfQogCi0JCXJldCA9IG9jZnMyX2V4dGVuZF90cmFucyhoYW5kbGUsIE9DRlMyX1NVQkFMTE9DX0ZSRUUpOwotCQlpZiAocmV0KSB7Ci0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dF9qb3VybmFsOwotCQl9CisJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAKIAkJdG1wID0gaGVhZDsKIAkJaGVhZCA9IGhlYWQtPmZyZWVfbmV4dDsKIAkJa2ZyZWUodG1wKTsKIAl9CiAKLW91dF9qb3VybmFsOgotCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7Ci0KIG91dF91bmxvY2s6CiAJb2NmczJfaW5vZGVfdW5sb2NrKGlub2RlLCAxKTsKIAlicmVsc2UoZGlfYmgpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYW9wcy5jIGIvZnMvb2NmczIvYW9wcy5jCmluZGV4IDk4ZDM2NTQuLmJiYjRiM2UgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FvcHMuYworKysgYi9mcy9vY2ZzMi9hb3BzLmMKQEAgLTE4NDIsNiArMTg0MiwxNiBAQAogCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAKIG91dDoKKwkvKgorCSAqIFRoZSBtbWFwcGVkIHBhZ2Ugd29uJ3QgYmUgdW5sb2NrZWQgaW4gb2NmczJfZnJlZV93cml0ZV9jdHh0KCksCisJICogZXZlbiBpbiBjYXNlIG9mIGVycm9yIGhlcmUgbGlrZSBFTk9TUEMgYW5kIEVOT01FTS4gU28sIHdlIG5lZWQKKwkgKiB0byB1bmxvY2sgdGhlIHRhcmdldCBwYWdlIG1hbnVhbGx5IHRvIHByZXZlbnQgZGVhZGxvY2tzIHdoZW4KKwkgKiByZXRyeWluZyBhZ2FpbiBvbiBFTk9TUEMsIG9yIHdoZW4gcmV0dXJuaW5nIG5vbi1WTV9GQVVMVF9MT0NLRUQKKwkgKiB0byBWTSBjb2RlLgorCSAqLworCWlmICh3Yy0+d190YXJnZXRfbG9ja2VkKQorCQl1bmxvY2tfcGFnZShtbWFwX3BhZ2UpOworCiAJb2NmczJfZnJlZV93cml0ZV9jdHh0KGlub2RlLCB3Yyk7CiAKIAlpZiAoZGF0YV9hYykgewpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci90Y3BfaW50ZXJuYWwuaCBiL2ZzL29jZnMyL2NsdXN0ZXIvdGNwX2ludGVybmFsLmgKaW5kZXggOTRiMTgzNi4uYjk1ZTdkZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci90Y3BfaW50ZXJuYWwuaAorKysgYi9mcy9vY2ZzMi9jbHVzdGVyL3RjcF9pbnRlcm5hbC5oCkBAIC00NCw5ICs0NCw2IEBACiAgKiB2ZXJzaW9uIGhlcmUgaW4gdGNwX2ludGVybmFsLmggc2hvdWxkIG5vdCBuZWVkIHRvIGJlIGJ1bXBlZCBmb3IKICAqIGZpbGVzeXN0ZW0gbG9ja2luZyBjaGFuZ2VzLgogICoKLSAqIE5ldyBpbiB2ZXJzaW9uIDEyCi0gKgktIE5lZ290aWF0ZSBoYiB0aW1lb3V0IHdoZW4gc3RvcmFnZSBpcyBkb3duLgotICoKICAqIE5ldyBpbiB2ZXJzaW9uIDExCiAgKiAJLSBOZWdvdGlhdGlvbiBvZiBmaWxlc3lzdGVtIGxvY2tpbmcgaW4gdGhlIGRsbSBqb2luLgogICoKQEAgLTc4LDcgKzc1LDcgQEAKICAqIAktIGZ1bGwgNjQgYml0IGlfc2l6ZSBpbiB0aGUgbWV0YWRhdGEgbG9jayBsdmJzCiAgKiAJLSBpbnRyb2R1Y3Rpb24gb2YgInJ3IiBsb2NrIGFuZCBwdXNoaW5nIG1ldGEvZGF0YSBsb2NraW5nIGRvd24KICAqLwotI2RlZmluZSBPMk5FVF9QUk9UT0NPTF9WRVJTSU9OIDEyVUxMCisjZGVmaW5lIE8yTkVUX1BST1RPQ09MX1ZFUlNJT04gMTFVTEwKIHN0cnVjdCBvMm5ldF9oYW5kc2hha2UgewogCV9fYmU2NAlwcm90b2NvbF92ZXJzaW9uOwogCV9fYmU2NAljb25uZWN0b3JfaWQ7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtY29udmVydC5jIGIvZnMvb2NmczIvZGxtL2RsbWNvbnZlcnQuYwppbmRleCBjZGVhZmI0Li4wYmIxMjg2IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtY29udmVydC5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1jb252ZXJ0LmMKQEAgLTI2OCw3ICsyNjgsNiBAQAogCQkJCSAgc3RydWN0IGRsbV9sb2NrICpsb2NrLCBpbnQgZmxhZ3MsIGludCB0eXBlKQogewogCWVudW0gZGxtX3N0YXR1cyBzdGF0dXM7Ci0JdTggb2xkX293bmVyID0gcmVzLT5vd25lcjsKIAogCW1sb2coMCwgInR5cGU9JWQsIGNvbnZlcnRfdHlwZT0lZCwgYnVzeT0lZFxuIiwgbG9jay0+bWwudHlwZSwKIAkgICAgIGxvY2stPm1sLmNvbnZlcnRfdHlwZSwgcmVzLT5zdGF0ZSAmIERMTV9MT0NLX1JFU19JTl9QUk9HUkVTUyk7CkBAIC0zMzUsNyArMzM0LDYgQEAKIAogCXNwaW5fbG9jaygmcmVzLT5zcGlubG9jayk7CiAJcmVzLT5zdGF0ZSAmPSB+RExNX0xPQ0tfUkVTX0lOX1BST0dSRVNTOwotCWxvY2stPmNvbnZlcnRfcGVuZGluZyA9IDA7CiAJLyogaWYgaXQgZmFpbGVkLCBtb3ZlIGl0IGJhY2sgdG8gZ3JhbnRlZCBxdWV1ZS4KIAkgKiBpZiBtYXN0ZXIgcmV0dXJucyBETE1fTk9STUFMIGFuZCB0aGVuIGRvd24gYmVmb3JlIHNlbmRpbmcgYXN0LAogCSAqIGl0IG1heSBoYXZlIGFscmVhZHkgYmVlbiBtb3ZlZCB0byBncmFudGVkIHF1ZXVlLCByZXNldCB0bwpAQCAtMzQ0LDEyICszNDIsMTQgQEAKIAkJaWYgKHN0YXR1cyAhPSBETE1fTk9UUVVFVUVEKQogCQkJZGxtX2Vycm9yKHN0YXR1cyk7CiAJCWRsbV9yZXZlcnRfcGVuZGluZ19jb252ZXJ0KHJlcywgbG9jayk7Ci0JfSBlbHNlIGlmICgocmVzLT5zdGF0ZSAmIERMTV9MT0NLX1JFU19SRUNPVkVSSU5HKSB8fAotCQkJKG9sZF9vd25lciAhPSByZXMtPm93bmVyKSkgewotCQltbG9nKDAsICJyZXMgJS4qcyBpcyBpbiByZWNvdmVyaW5nIG9yIGhhcyBiZWVuIHJlY292ZXJlZC5cbiIsCi0JCQkJcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSk7CisJfSBlbHNlIGlmICghbG9jay0+Y29udmVydF9wZW5kaW5nKSB7CisJCW1sb2coMCwgIiVzOiByZXMgJS4qcywgb3duZXIgZGllZCBhbmQgbG9jayBoYXMgYmVlbiBtb3ZlZCBiYWNrICIKKwkJCQkidG8gZ3JhbnRlZCBsaXN0LCByZXRyeSBjb252ZXJ0LlxuIiwKKwkJCQlkbG0tPm5hbWUsIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUpOwogCQlzdGF0dXMgPSBETE1fUkVDT1ZFUklORzsKIAl9CisKKwlsb2NrLT5jb252ZXJ0X3BlbmRpbmcgPSAwOwogYmFpbDoKIAlzcGluX3VubG9jaygmcmVzLT5zcGlubG9jayk7CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2ZpbGUuYyBiL2ZzL29jZnMyL2ZpbGUuYwppbmRleCA0ZTdiMGRjLi4wYjA1NWJmIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9maWxlLmMKKysrIGIvZnMvb2NmczIvZmlsZS5jCkBAIC0xNTA2LDcgKzE1MDYsOCBAQAogCQkJCSAgICAgICB1NjQgc3RhcnQsIHU2NCBsZW4pCiB7CiAJaW50IHJldCA9IDA7Ci0JdTY0IHRtcGVuZCwgZW5kID0gc3RhcnQgKyBsZW47CisJdTY0IHRtcGVuZCA9IDA7CisJdTY0IGVuZCA9IHN0YXJ0ICsgbGVuOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCXVuc2lnbmVkIGludCBjc2l6ZSA9IG9zYi0+c19jbHVzdGVyc2l6ZTsKIAloYW5kbGVfdCAqaGFuZGxlOwpAQCAtMTUzOCwxOCArMTUzOSwzMSBAQAogCX0KIAogCS8qCi0JICogV2Ugd2FudCB0byBnZXQgdGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBlbmQgb2YgdGhlIDFzdCBjbHVzdGVyLgorCSAqIElmIHN0YXJ0IGlzIG9uIGEgY2x1c3RlciBib3VuZGFyeSBhbmQgZW5kIGlzIHNvbWV3aGVyZSBpbiBhbm90aGVyCisJICogY2x1c3Rlciwgd2UgaGF2ZSBub3QgQ09XZWQgdGhlIGNsdXN0ZXIgc3RhcnRpbmcgYXQgc3RhcnQsIHVubGVzcworCSAqIGVuZCBpcyBhbHNvIHdpdGhpbiB0aGUgc2FtZSBjbHVzdGVyLiBTbywgaW4gdGhpcyBjYXNlLCB3ZSBza2lwIHRoaXMKKwkgKiBmaXJzdCBjYWxsIHRvIG9jZnMyX3plcm9fcmFuZ2VfZm9yX3RydW5jYXRlKCkgdHJ1bmNhdGUgYW5kIG1vdmUgb24KKwkgKiB0byB0aGUgbmV4dCBvbmUuCiAJICovCi0JdG1wZW5kID0gKHU2NClvc2ItPnNfY2x1c3RlcnNpemUgKyAoc3RhcnQgJiB+KG9zYi0+c19jbHVzdGVyc2l6ZSAtIDEpKTsKLQlpZiAodG1wZW5kID4gZW5kKQotCQl0bXBlbmQgPSBlbmQ7CisJaWYgKChzdGFydCAmIChjc2l6ZSAtIDEpKSAhPSAwKSB7CisJCS8qCisJCSAqIFdlIHdhbnQgdG8gZ2V0IHRoZSBieXRlIG9mZnNldCBvZiB0aGUgZW5kIG9mIHRoZSAxc3QKKwkJICogY2x1c3Rlci4KKwkJICovCisJCXRtcGVuZCA9ICh1NjQpb3NiLT5zX2NsdXN0ZXJzaXplICsKKwkJCShzdGFydCAmIH4ob3NiLT5zX2NsdXN0ZXJzaXplIC0gMSkpOworCQlpZiAodG1wZW5kID4gZW5kKQorCQkJdG1wZW5kID0gZW5kOwogCi0JdHJhY2Vfb2NmczJfemVyb19wYXJ0aWFsX2NsdXN0ZXJzX3JhbmdlMSgodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0LAotCQkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpdG1wZW5kKTsKKwkJdHJhY2Vfb2NmczJfemVyb19wYXJ0aWFsX2NsdXN0ZXJzX3JhbmdlMSgKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnQsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXRtcGVuZCk7CiAKLQlyZXQgPSBvY2ZzMl96ZXJvX3JhbmdlX2Zvcl90cnVuY2F0ZShpbm9kZSwgaGFuZGxlLCBzdGFydCwgdG1wZW5kKTsKLQlpZiAocmV0KQotCQltbG9nX2Vycm5vKHJldCk7CisJCXJldCA9IG9jZnMyX3plcm9fcmFuZ2VfZm9yX3RydW5jYXRlKGlub2RlLCBoYW5kbGUsIHN0YXJ0LAorCQkJCQkJICAgIHRtcGVuZCk7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisJfQogCiAJaWYgKHRtcGVuZCA8IGVuZCkgewogCQkvKgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3ViYWxsb2MuYyBiL2ZzL29jZnMyL3N1YmFsbG9jLmMKaW5kZXggZWE0NzEyMC4uNmFkMzUzMyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3ViYWxsb2MuYworKysgYi9mcy9vY2ZzMi9zdWJhbGxvYy5jCkBAIC0xMTk5LDE0ICsxMTk5LDI0IEBACiAJCQlpbm9kZV91bmxvY2soKCphYyktPmFjX2lub2RlKTsKIAogCQkJcmV0ID0gb2NmczJfdHJ5X3RvX2ZyZWVfdHJ1bmNhdGVfbG9nKG9zYiwgYml0c193YW50ZWQpOwotCQkJaWYgKHJldCA9PSAxKQorCQkJaWYgKHJldCA9PSAxKSB7CisJCQkJaXB1dCgoKmFjKS0+YWNfaW5vZGUpOworCQkJCSgqYWMpLT5hY19pbm9kZSA9IE5VTEw7CiAJCQkJZ290byByZXRyeTsKKwkJCX0KIAogCQkJaWYgKHJldCA8IDApCiAJCQkJbWxvZ19lcnJubyhyZXQpOwogCiAJCQlpbm9kZV9sb2NrKCgqYWMpLT5hY19pbm9kZSk7Ci0JCQlvY2ZzMl9pbm9kZV9sb2NrKCgqYWMpLT5hY19pbm9kZSwgTlVMTCwgMSk7CisJCQlyZXQgPSBvY2ZzMl9pbm9kZV9sb2NrKCgqYWMpLT5hY19pbm9kZSwgTlVMTCwgMSk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlpbm9kZV91bmxvY2soKCphYyktPmFjX2lub2RlKTsKKwkJCQlpcHV0KCgqYWMpLT5hY19pbm9kZSk7CisJCQkJKCphYyktPmFjX2lub2RlID0gTlVMTDsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CiAJCX0KIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKZGlmZiAtLWdpdCBhL2ZzL292ZXJsYXlmcy9jb3B5X3VwLmMgYi9mcy9vdmVybGF5ZnMvY29weV91cC5jCmluZGV4IDU0ZTVkNjYuLmRiMzdhMGUgMTAwNjQ0Ci0tLSBhL2ZzL292ZXJsYXlmcy9jb3B5X3VwLmMKKysrIGIvZnMvb3ZlcmxheWZzL2NvcHlfdXAuYwpAQCAtODAsNiArODAsOCBAQAogCX0KIAogCWZvciAobmFtZSA9IGJ1ZjsgbmFtZSA8IChidWYgKyBsaXN0X3NpemUpOyBuYW1lICs9IHN0cmxlbihuYW1lKSArIDEpIHsKKwkJaWYgKG92bF9pc19wcml2YXRlX3hhdHRyKG5hbWUpKQorCQkJY29udGludWU7CiByZXRyeToKIAkJc2l6ZSA9IHZmc19nZXR4YXR0cihvbGQsIG5hbWUsIHZhbHVlLCB2YWx1ZV9zaXplKTsKIAkJaWYgKHNpemUgPT0gLUVSQU5HRSkKQEAgLTEwMyw2ICsxMDUsMTMgQEAKIAkJCWdvdG8gcmV0cnk7CiAJCX0KIAorCQllcnJvciA9IHNlY3VyaXR5X2lub2RlX2NvcHlfdXBfeGF0dHIobmFtZSk7CisJCWlmIChlcnJvciA8IDAgJiYgZXJyb3IgIT0gLUVPUE5PVFNVUFApCisJCQlicmVhazsKKwkJaWYgKGVycm9yID09IDEpIHsKKwkJCWVycm9yID0gMDsKKwkJCWNvbnRpbnVlOyAvKiBEaXNjYXJkICovCisJCX0KIAkJZXJyb3IgPSB2ZnNfc2V0eGF0dHIobmV3LCBuYW1lLCB2YWx1ZSwgc2l6ZSwgMCk7CiAJCWlmIChlcnJvcikKIAkJCWJyZWFrOwpAQCAtMjQ2LDYgKzI1NSw4IEBACiAJc3RydWN0IGRlbnRyeSAqdXBwZXIgPSBOVUxMOwogCXVtb2RlX3QgbW9kZSA9IHN0YXQtPm1vZGU7CiAJaW50IGVycjsKKwljb25zdCBzdHJ1Y3QgY3JlZCAqb2xkX2NyZWRzID0gTlVMTDsKKwlzdHJ1Y3QgY3JlZCAqbmV3X2NyZWRzID0gTlVMTDsKIAogCW5ld2RlbnRyeSA9IG92bF9sb29rdXBfdGVtcCh3b3JrZGlyLCBkZW50cnkpOwogCWVyciA9IFBUUl9FUlIobmV3ZGVudHJ5KTsKQEAgLTI1OCwxMCArMjY5LDIzIEBACiAJaWYgKElTX0VSUih1cHBlcikpCiAJCWdvdG8gb3V0MTsKIAorCWVyciA9IHNlY3VyaXR5X2lub2RlX2NvcHlfdXAoZGVudHJ5LCAmbmV3X2NyZWRzKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQyOworCisJaWYgKG5ld19jcmVkcykKKwkJb2xkX2NyZWRzID0gb3ZlcnJpZGVfY3JlZHMobmV3X2NyZWRzKTsKKwogCS8qIENhbid0IHByb3Blcmx5IHNldCBtb2RlIG9uIGNyZWF0aW9uIGJlY2F1c2Ugb2YgdGhlIHVtYXNrICovCiAJc3RhdC0+bW9kZSAmPSBTX0lGTVQ7CiAJZXJyID0gb3ZsX2NyZWF0ZV9yZWFsKHdkaXIsIG5ld2RlbnRyeSwgc3RhdCwgbGluaywgTlVMTCwgdHJ1ZSk7CiAJc3RhdC0+bW9kZSA9IG1vZGU7CisKKwlpZiAobmV3X2NyZWRzKSB7CisJCXJldmVydF9jcmVkcyhvbGRfY3JlZHMpOworCQlwdXRfY3JlZChuZXdfY3JlZHMpOworCX0KKwogCWlmIChlcnIpCiAJCWdvdG8gb3V0MjsKIApkaWZmIC0tZ2l0IGEvZnMvb3ZlcmxheWZzL2Rpci5jIGIvZnMvb3ZlcmxheWZzL2Rpci5jCmluZGV4IDEyYmNkMDcuLmIwZmZhMWQgMTAwNjQ0Ci0tLSBhL2ZzL292ZXJsYXlmcy9kaXIuYworKysgYi9mcy9vdmVybGF5ZnMvZGlyLmMKQEAgLTEyLDYgKzEyLDggQEAKICNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY3JlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbF94YXR0ci5oPgogI2luY2x1ZGUgIm92ZXJsYXlmcy5oIgogCiB2b2lkIG92bF9jbGVhbnVwKHN0cnVjdCBpbm9kZSAqd2Rpciwgc3RydWN0IGRlbnRyeSAqd2RlbnRyeSkKQEAgLTE4Niw2ICsxODgsOSBAQAogCXN0cnVjdCBkZW50cnkgKm5ld2RlbnRyeTsKIAlpbnQgZXJyOwogCisJaWYgKCFoYXJkbGluayAmJiAhSVNfUE9TSVhBQ0wodWRpcikpCisJCXN0YXQtPm1vZGUgJj0gfmN1cnJlbnRfdW1hc2soKTsKKwogCWlub2RlX2xvY2tfbmVzdGVkKHVkaXIsIElfTVVURVhfUEFSRU5UKTsKIAluZXdkZW50cnkgPSBsb29rdXBfb25lX2xlbihkZW50cnktPmRfbmFtZS5uYW1lLCB1cHBlcmRpciwKIAkJCQkgICBkZW50cnktPmRfbmFtZS5sZW4pOwpAQCAtMzM1LDYgKzM0MCwzMiBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgb3ZsX3NldF91cHBlcl9hY2woc3RydWN0IGRlbnRyeSAqdXBwZXJkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKmFjbCkKK3sKKwl2b2lkICpidWZmZXI7CisJc2l6ZV90IHNpemU7CisJaW50IGVycjsKKworCWlmICghSVNfRU5BQkxFRChDT05GSUdfRlNfUE9TSVhfQUNMKSB8fCAhYWNsKQorCQlyZXR1cm4gMDsKKworCXNpemUgPSBwb3NpeF9hY2xfdG9feGF0dHIoTlVMTCwgYWNsLCBOVUxMLCAwKTsKKwlidWZmZXIgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNpemUgPSBwb3NpeF9hY2xfdG9feGF0dHIoJmluaXRfdXNlcl9ucywgYWNsLCBidWZmZXIsIHNpemUpOworCWVyciA9IHNpemU7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwllcnIgPSB2ZnNfc2V0eGF0dHIodXBwZXJkZW50cnksIG5hbWUsIGJ1ZmZlciwgc2l6ZSwgWEFUVFJfQ1JFQVRFKTsKK291dF9mcmVlOgorCWtmcmVlKGJ1ZmZlcik7CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBvdmxfY3JlYXRlX292ZXJfd2hpdGVvdXQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgICBzdHJ1Y3Qga3N0YXQgKnN0YXQsIGNvbnN0IGNoYXIgKmxpbmssCiAJCQkJICAgIHN0cnVjdCBkZW50cnkgKmhhcmRsaW5rKQpAQCAtMzQ2LDEwICszNzcsMTggQEAKIAlzdHJ1Y3QgZGVudHJ5ICp1cHBlcjsKIAlzdHJ1Y3QgZGVudHJ5ICpuZXdkZW50cnk7CiAJaW50IGVycjsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2wsICpkZWZhdWx0X2FjbDsKIAogCWlmIChXQVJOX09OKCF3b3JrZGlyKSkKIAkJcmV0dXJuIC1FUk9GUzsKIAorCWlmICghaGFyZGxpbmspIHsKKwkJZXJyID0gcG9zaXhfYWNsX2NyZWF0ZShkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLAorCQkJCSAgICAgICAmc3RhdC0+bW9kZSwgJmRlZmF1bHRfYWNsLCAmYWNsKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCiAJZXJyID0gb3ZsX2xvY2tfcmVuYW1lX3dvcmtkaXIod29ya2RpciwgdXBwZXJkaXIpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwpAQCAtMzg0LDYgKzQyMywxNyBAQAogCQlpZiAoZXJyKQogCQkJZ290byBvdXRfY2xlYW51cDsKIAl9CisJaWYgKCFoYXJkbGluaykgeworCQllcnIgPSBvdmxfc2V0X3VwcGVyX2FjbChuZXdkZW50cnksIFhBVFRSX05BTUVfUE9TSVhfQUNMX0FDQ0VTUywKKwkJCQkJYWNsKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2NsZWFudXA7CisKKwkJZXJyID0gb3ZsX3NldF91cHBlcl9hY2wobmV3ZGVudHJ5LCBYQVRUUl9OQU1FX1BPU0lYX0FDTF9ERUZBVUxULAorCQkJCQlkZWZhdWx0X2FjbCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9jbGVhbnVwOworCX0KIAogCWlmICghaGFyZGxpbmsgJiYgU19JU0RJUihzdGF0LT5tb2RlKSkgewogCQllcnIgPSBvdmxfc2V0X29wYXF1ZShuZXdkZW50cnkpOwpAQCAtNDEwLDYgKzQ2MCwxMCBAQAogb3V0X3VubG9jazoKIAl1bmxvY2tfcmVuYW1lKHdvcmtkaXIsIHVwcGVyZGlyKTsKIG91dDoKKwlpZiAoIWhhcmRsaW5rKSB7CisJCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJCXBvc2l4X2FjbF9yZWxlYXNlKGRlZmF1bHRfYWNsKTsKKwl9CiAJcmV0dXJuIGVycjsKIAogb3V0X2NsZWFudXA6CkBAIC00MzUsNiArNDg5LDE1IEBACiAJaWYgKG92ZXJyaWRlX2NyZWQpIHsKIAkJb3ZlcnJpZGVfY3JlZC0+ZnN1aWQgPSBpbm9kZS0+aV91aWQ7CiAJCW92ZXJyaWRlX2NyZWQtPmZzZ2lkID0gaW5vZGUtPmlfZ2lkOworCQlpZiAoIWhhcmRsaW5rKSB7CisJCQllcnIgPSBzZWN1cml0eV9kZW50cnlfY3JlYXRlX2ZpbGVzX2FzKGRlbnRyeSwKKwkJCQkJc3RhdC0+bW9kZSwgJmRlbnRyeS0+ZF9uYW1lLCBvbGRfY3JlZCwKKwkJCQkJb3ZlcnJpZGVfY3JlZCk7CisJCQlpZiAoZXJyKSB7CisJCQkJcHV0X2NyZWQob3ZlcnJpZGVfY3JlZCk7CisJCQkJZ290byBvdXRfcmV2ZXJ0X2NyZWRzOworCQkJfQorCQl9CiAJCXB1dF9jcmVkKG92ZXJyaWRlX2NyZWRzKG92ZXJyaWRlX2NyZWQpKTsKIAkJcHV0X2NyZWQob3ZlcnJpZGVfY3JlZCk7CiAKQEAgLTQ0NSw2ICs1MDgsNyBAQAogCQkJZXJyID0gb3ZsX2NyZWF0ZV9vdmVyX3doaXRlb3V0KGRlbnRyeSwgaW5vZGUsIHN0YXQsCiAJCQkJCQkJbGluaywgaGFyZGxpbmspOwogCX0KK291dF9yZXZlcnRfY3JlZHM6CiAJcmV2ZXJ0X2NyZWRzKG9sZF9jcmVkKTsKIAlpZiAoIWVycikgewogCQlzdHJ1Y3QgaW5vZGUgKnJlYWxpbm9kZSA9IGRfaW5vZGUob3ZsX2RlbnRyeV91cHBlcihkZW50cnkpKTsKQEAgLTk1MCw5ICsxMDE0LDkgQEAKIAkucGVybWlzc2lvbgk9IG92bF9wZXJtaXNzaW9uLAogCS5nZXRhdHRyCT0gb3ZsX2Rpcl9nZXRhdHRyLAogCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCi0JLmdldHhhdHRyCT0gb3ZsX2dldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCiAJLmxpc3R4YXR0cgk9IG92bF9saXN0eGF0dHIsCi0JLnJlbW92ZXhhdHRyCT0gb3ZsX3JlbW92ZXhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiAJLmdldF9hY2wJPSBvdmxfZ2V0X2FjbCwKIAkudXBkYXRlX3RpbWUJPSBvdmxfdXBkYXRlX3RpbWUsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvb3ZlcmxheWZzL2lub2RlLmMgYi9mcy9vdmVybGF5ZnMvaW5vZGUuYwppbmRleCAxYjg4NWMxLi5jNzU2MjVjIDEwMDY0NAotLS0gYS9mcy9vdmVybGF5ZnMvaW5vZGUuYworKysgYi9mcy9vdmVybGF5ZnMvaW5vZGUuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsLmg+CiAjaW5jbHVkZSAib3ZlcmxheWZzLmgiCiAKIHN0YXRpYyBpbnQgb3ZsX2NvcHlfdXBfdHJ1bmNhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQpAQCAtMTkxLDMyICsxOTIsNDQgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgYm9vbCBvdmxfaXNfcHJpdmF0ZV94YXR0cihjb25zdCBjaGFyICpuYW1lKQorYm9vbCBvdmxfaXNfcHJpdmF0ZV94YXR0cihjb25zdCBjaGFyICpuYW1lKQogewotI2RlZmluZSBPVkxfWEFUVFJfUFJFX05BTUUgT1ZMX1hBVFRSX1BSRUZJWCAiLiIKLQlyZXR1cm4gc3RybmNtcChuYW1lLCBPVkxfWEFUVFJfUFJFX05BTUUsCi0JCSAgICAgICBzaXplb2YoT1ZMX1hBVFRSX1BSRV9OQU1FKSAtIDEpID09IDA7CisJcmV0dXJuIHN0cm5jbXAobmFtZSwgT1ZMX1hBVFRSX1BSRUZJWCwKKwkJICAgICAgIHNpemVvZihPVkxfWEFUVFJfUFJFRklYKSAtIDEpID09IDA7CiB9CiAKLWludCBvdmxfc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsCi0JCSBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoraW50IG92bF94YXR0cl9zZXQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwKKwkJICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQogewogCWludCBlcnI7Ci0Jc3RydWN0IGRlbnRyeSAqdXBwZXJkZW50cnk7CisJc3RydWN0IHBhdGggcmVhbHBhdGg7CisJZW51bSBvdmxfcGF0aF90eXBlIHR5cGUgPSBvdmxfcGF0aF9yZWFsKGRlbnRyeSwgJnJlYWxwYXRoKTsKIAljb25zdCBzdHJ1Y3QgY3JlZCAqb2xkX2NyZWQ7CiAKIAllcnIgPSBvdmxfd2FudF93cml0ZShkZW50cnkpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCisJaWYgKCF2YWx1ZSAmJiAhT1ZMX1RZUEVfVVBQRVIodHlwZSkpIHsKKwkJZXJyID0gdmZzX2dldHhhdHRyKHJlYWxwYXRoLmRlbnRyeSwgbmFtZSwgTlVMTCwgMCk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXRfZHJvcF93cml0ZTsKKwl9CisKIAllcnIgPSBvdmxfY29weV91cChkZW50cnkpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2Ryb3Bfd3JpdGU7CiAKLQl1cHBlcmRlbnRyeSA9IG92bF9kZW50cnlfdXBwZXIoZGVudHJ5KTsKKwlpZiAoIU9WTF9UWVBFX1VQUEVSKHR5cGUpKQorCQlvdmxfcGF0aF91cHBlcihkZW50cnksICZyZWFscGF0aCk7CisKIAlvbGRfY3JlZCA9IG92bF9vdmVycmlkZV9jcmVkcyhkZW50cnktPmRfc2IpOwotCWVyciA9IHZmc19zZXR4YXR0cih1cHBlcmRlbnRyeSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKKwlpZiAodmFsdWUpCisJCWVyciA9IHZmc19zZXR4YXR0cihyZWFscGF0aC5kZW50cnksIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7CisJZWxzZSB7CisJCVdBUk5fT04oZmxhZ3MgIT0gWEFUVFJfUkVQTEFDRSk7CisJCWVyciA9IHZmc19yZW1vdmV4YXR0cihyZWFscGF0aC5kZW50cnksIG5hbWUpOworCX0KIAlyZXZlcnRfY3JlZHMob2xkX2NyZWQpOwogCiBvdXRfZHJvcF93cml0ZToKQEAgLTIyNSwxNiArMjM4LDEzIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3NpemVfdCBvdmxfZ2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKK2ludCBvdmxfeGF0dHJfZ2V0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IGRlbnRyeSAqcmVhbGRlbnRyeSA9IG92bF9kZW50cnlfcmVhbChkZW50cnkpOwogCXNzaXplX3QgcmVzOwogCWNvbnN0IHN0cnVjdCBjcmVkICpvbGRfY3JlZDsKIAotCWlmIChvdmxfaXNfcHJpdmF0ZV94YXR0cihuYW1lKSkKLQkJcmV0dXJuIC1FTk9EQVRBOwotCiAJb2xkX2NyZWQgPSBvdmxfb3ZlcnJpZGVfY3JlZHMoZGVudHJ5LT5kX3NiKTsKIAlyZXMgPSB2ZnNfZ2V0eGF0dHIocmVhbGRlbnRyeSwgbmFtZSwgdmFsdWUsIHNpemUpOwogCXJldmVydF9jcmVkcyhvbGRfY3JlZCk7CkBAIC0yNDUsNyArMjU1LDggQEAKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpyZWFsZGVudHJ5ID0gb3ZsX2RlbnRyeV9yZWFsKGRlbnRyeSk7CiAJc3NpemVfdCByZXM7Ci0JaW50IG9mZjsKKwlzaXplX3QgbGVuOworCWNoYXIgKnM7CiAJY29uc3Qgc3RydWN0IGNyZWQgKm9sZF9jcmVkOwogCiAJb2xkX2NyZWQgPSBvdmxfb3ZlcnJpZGVfY3JlZHMoZGVudHJ5LT5kX3NiKTsKQEAgLTI1NSw3MyArMjY2LDM5IEBACiAJCXJldHVybiByZXM7CiAKIAkvKiBmaWx0ZXIgb3V0IHByaXZhdGUgeGF0dHJzICovCi0JZm9yIChvZmYgPSAwOyBvZmYgPCByZXM7KSB7Ci0JCWNoYXIgKnMgPSBsaXN0ICsgb2ZmOwotCQlzaXplX3Qgc2xlbiA9IHN0cmxlbihzKSArIDE7CisJZm9yIChzID0gbGlzdCwgbGVuID0gcmVzOyBsZW47KSB7CisJCXNpemVfdCBzbGVuID0gc3RybmxlbihzLCBsZW4pICsgMTsKIAotCQlCVUdfT04ob2ZmICsgc2xlbiA+IHJlcyk7CisJCS8qIHVuZGVybHlpbmcgZnMgcHJvdmlkaW5nIHVzIHdpdGggYW4gYnJva2VuIHhhdHRyIGxpc3Q/ICovCisJCWlmIChXQVJOX09OKHNsZW4gPiBsZW4pKQorCQkJcmV0dXJuIC1FSU87CiAKKwkJbGVuIC09IHNsZW47CiAJCWlmIChvdmxfaXNfcHJpdmF0ZV94YXR0cihzKSkgewogCQkJcmVzIC09IHNsZW47Ci0JCQltZW1tb3ZlKHMsIHMgKyBzbGVuLCByZXMgLSBvZmYpOworCQkJbWVtbW92ZShzLCBzICsgc2xlbiwgbGVuKTsKIAkJfSBlbHNlIHsKLQkJCW9mZiArPSBzbGVuOworCQkJcyArPSBzbGVuOwogCQl9CiAJfQogCiAJcmV0dXJuIHJlczsKIH0KIAotaW50IG92bF9yZW1vdmV4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgcGF0aCByZWFscGF0aDsKLQllbnVtIG92bF9wYXRoX3R5cGUgdHlwZSA9IG92bF9wYXRoX3JlYWwoZGVudHJ5LCAmcmVhbHBhdGgpOwotCWNvbnN0IHN0cnVjdCBjcmVkICpvbGRfY3JlZDsKLQotCWVyciA9IG92bF93YW50X3dyaXRlKGRlbnRyeSk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0KLQllcnIgPSAtRU5PREFUQTsKLQlpZiAob3ZsX2lzX3ByaXZhdGVfeGF0dHIobmFtZSkpCi0JCWdvdG8gb3V0X2Ryb3Bfd3JpdGU7Ci0KLQlpZiAoIU9WTF9UWVBFX1VQUEVSKHR5cGUpKSB7Ci0JCWVyciA9IHZmc19nZXR4YXR0cihyZWFscGF0aC5kZW50cnksIG5hbWUsIE5VTEwsIDApOwotCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gb3V0X2Ryb3Bfd3JpdGU7Ci0KLQkJZXJyID0gb3ZsX2NvcHlfdXAoZGVudHJ5KTsKLQkJaWYgKGVycikKLQkJCWdvdG8gb3V0X2Ryb3Bfd3JpdGU7Ci0KLQkJb3ZsX3BhdGhfdXBwZXIoZGVudHJ5LCAmcmVhbHBhdGgpOwotCX0KLQotCW9sZF9jcmVkID0gb3ZsX292ZXJyaWRlX2NyZWRzKGRlbnRyeS0+ZF9zYik7Ci0JZXJyID0gdmZzX3JlbW92ZXhhdHRyKHJlYWxwYXRoLmRlbnRyeSwgbmFtZSk7Ci0JcmV2ZXJ0X2NyZWRzKG9sZF9jcmVkKTsKLW91dF9kcm9wX3dyaXRlOgotCW92bF9kcm9wX3dyaXRlKGRlbnRyeSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQogc3RydWN0IHBvc2l4X2FjbCAqb3ZsX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCiB7CiAJc3RydWN0IGlub2RlICpyZWFsaW5vZGUgPSBvdmxfaW5vZGVfcmVhbChpbm9kZSwgTlVMTCk7CiAJY29uc3Qgc3RydWN0IGNyZWQgKm9sZF9jcmVkOwogCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKIAotCWlmICghSVNfUE9TSVhBQ0wocmVhbGlub2RlKSkKKwlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX0ZTX1BPU0lYX0FDTCkgfHwgIUlTX1BPU0lYQUNMKHJlYWxpbm9kZSkpCiAJCXJldHVybiBOVUxMOwogCiAJaWYgKCFyZWFsaW5vZGUtPmlfb3AtPmdldF9hY2wpCiAJCXJldHVybiBOVUxMOwogCiAJb2xkX2NyZWQgPSBvdmxfb3ZlcnJpZGVfY3JlZHMoaW5vZGUtPmlfc2IpOwotCWFjbCA9IHJlYWxpbm9kZS0+aV9vcC0+Z2V0X2FjbChyZWFsaW5vZGUsIHR5cGUpOworCWFjbCA9IGdldF9hY2wocmVhbGlub2RlLCB0eXBlKTsKIAlyZXZlcnRfY3JlZHMob2xkX2NyZWQpOwogCiAJcmV0dXJuIGFjbDsKQEAgLTM5MSw5ICszNjgsOSBAQAogCS5wZXJtaXNzaW9uCT0gb3ZsX3Blcm1pc3Npb24sCiAJLmdldGF0dHIJPSBvdmxfZ2V0YXR0ciwKIAkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAotCS5nZXR4YXR0cgk9IG92bF9nZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAogCS5saXN0eGF0dHIJPSBvdmxfbGlzdHhhdHRyLAotCS5yZW1vdmV4YXR0cgk9IG92bF9yZW1vdmV4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAogCS5nZXRfYWNsCT0gb3ZsX2dldF9hY2wsCiAJLnVwZGF0ZV90aW1lCT0gb3ZsX3VwZGF0ZV90aW1lLAogfTsKQEAgLTQwNCw5ICszODEsOSBAQAogCS5yZWFkbGluawk9IG92bF9yZWFkbGluaywKIAkuZ2V0YXR0cgk9IG92bF9nZXRhdHRyLAogCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCi0JLmdldHhhdHRyCT0gb3ZsX2dldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCiAJLmxpc3R4YXR0cgk9IG92bF9saXN0eGF0dHIsCi0JLnJlbW92ZXhhdHRyCT0gb3ZsX3JlbW92ZXhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiAJLnVwZGF0ZV90aW1lCT0gb3ZsX3VwZGF0ZV90aW1lLAogfTsKIApAQCAtNDE1LDYgKzM5Miw5IEBACiAJaW5vZGUtPmlfaW5vID0gZ2V0X25leHRfaW5vKCk7CiAJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJaW5vZGUtPmlfZmxhZ3MgfD0gU19OT0NNVElNRTsKKyNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCisJaW5vZGUtPmlfYWNsID0gaW5vZGUtPmlfZGVmYXVsdF9hY2wgPSBBQ0xfRE9OVF9DQUNIRTsKKyNlbmRpZgogCiAJbW9kZSAmPSBTX0lGTVQ7CiAJc3dpdGNoIChtb2RlKSB7CmRpZmYgLS1naXQgYS9mcy9vdmVybGF5ZnMvb3ZlcmxheWZzLmggYi9mcy9vdmVybGF5ZnMvb3ZlcmxheWZzLmgKaW5kZXggZTRmNWM5NS4uNTgxM2NjZiAxMDA2NDQKLS0tIGEvZnMvb3ZlcmxheWZzL292ZXJsYXlmcy5oCisrKyBiL2ZzL292ZXJsYXlmcy9vdmVybGF5ZnMuaApAQCAtMjQsOCArMjQsOCBAQAogCShPVkxfVFlQRV9NRVJHRSh0eXBlKSB8fCAhT1ZMX1RZUEVfVVBQRVIodHlwZSkpCiAKIAotI2RlZmluZSBPVkxfWEFUVFJfUFJFRklYIFhBVFRSX1RSVVNURURfUFJFRklYICJvdmVybGF5IgotI2RlZmluZSBPVkxfWEFUVFJfT1BBUVVFIE9WTF9YQVRUUl9QUkVGSVggIi5vcGFxdWUiCisjZGVmaW5lIE9WTF9YQVRUUl9QUkVGSVggWEFUVFJfVFJVU1RFRF9QUkVGSVggIm92ZXJsYXkuIgorI2RlZmluZSBPVkxfWEFUVFJfT1BBUVVFIE9WTF9YQVRUUl9QUkVGSVggIm9wYXF1ZSIKIAogI2RlZmluZSBPVkxfSVNVUFBFUl9NQVNLIDFVTAogCkBAIC0xNzksMjAgKzE3OSwyMSBAQAogdm9pZCBvdmxfY2xlYW51cF93aGl0ZW91dHMoc3RydWN0IGRlbnRyeSAqdXBwZXIsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOwogdm9pZCBvdmxfY2FjaGVfZnJlZShzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKIGludCBvdmxfY2hlY2tfZF90eXBlX3N1cHBvcnRlZChzdHJ1Y3QgcGF0aCAqcmVhbHBhdGgpOwordm9pZCBvdmxfd29ya2Rpcl9jbGVhbnVwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkJCSBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBsZXZlbCk7CiAKIC8qIGlub2RlLmMgKi8KIGludCBvdmxfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cik7CiBpbnQgb3ZsX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spOwotaW50IG92bF9zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCSBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwKLQkJIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOwotc3NpemVfdCBvdmxfZ2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSk7CitpbnQgb3ZsX3hhdHRyX3NldChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAorCQkgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOworaW50IG92bF94YXR0cl9nZXQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLAorCQkgIHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSk7CiBzc2l6ZV90IG92bF9saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpsaXN0LCBzaXplX3Qgc2l6ZSk7Ci1pbnQgb3ZsX3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSk7CiBzdHJ1Y3QgcG9zaXhfYWNsICpvdmxfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSk7CiBpbnQgb3ZsX29wZW5fbWF5YmVfY29weV91cChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHVuc2lnbmVkIGludCBmaWxlX2ZsYWdzKTsKIGludCBvdmxfdXBkYXRlX3RpbWUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHRpbWVzcGVjICp0cywgaW50IGZsYWdzKTsKK2Jvb2wgb3ZsX2lzX3ByaXZhdGVfeGF0dHIoY29uc3QgY2hhciAqbmFtZSk7CiAKIHN0cnVjdCBpbm9kZSAqb3ZsX25ld19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bW9kZV90IG1vZGUpOwogc3RydWN0IGlub2RlICpvdmxfZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBpbm9kZSAqcmVhbGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL292ZXJsYXlmcy9yZWFkZGlyLmMgYi9mcy9vdmVybGF5ZnMvcmVhZGRpci5jCmluZGV4IGNmMzdmYzcuLmYyNDFiNGUgMTAwNjQ0Ci0tLSBhL2ZzL292ZXJsYXlmcy9yZWFkZGlyLmMKKysrIGIvZnMvb3ZlcmxheWZzL3JlYWRkaXIuYwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAJCQllcnIgPSByZGQtPmVycjsKIAl9IHdoaWxlICghZXJyICYmIHJkZC0+Y291bnQpOwogCi0JaWYgKCFlcnIgJiYgcmRkLT5maXJzdF9tYXliZV93aGl0ZW91dCkKKwlpZiAoIWVyciAmJiByZGQtPmZpcnN0X21heWJlX3doaXRlb3V0ICYmIHJkZC0+ZGVudHJ5KQogCQllcnIgPSBvdmxfY2hlY2tfd2hpdGVvdXRzKHJlYWxwYXRoLT5kZW50cnksIHJkZCk7CiAKIAlmcHV0KHJlYWxmaWxlKTsKQEAgLTYwNiwzICs2MDYsNjQgQEAKIAogCXJldHVybiByZGQuZF90eXBlX3N1cHBvcnRlZDsKIH0KKworc3RhdGljIHZvaWQgb3ZsX3dvcmtkaXJfY2xlYW51cF9yZWN1cnNlKHN0cnVjdCBwYXRoICpwYXRoLCBpbnQgbGV2ZWwpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IHBhdGgtPmRlbnRyeS0+ZF9pbm9kZTsKKwlMSVNUX0hFQUQobGlzdCk7CisJc3RydWN0IG92bF9jYWNoZV9lbnRyeSAqcDsKKwlzdHJ1Y3Qgb3ZsX3JlYWRkaXJfZGF0YSByZGQgPSB7CisJCS5jdHguYWN0b3IgPSBvdmxfZmlsbF9tZXJnZSwKKwkJLmRlbnRyeSA9IE5VTEwsCisJCS5saXN0ID0gJmxpc3QsCisJCS5yb290ID0gUkJfUk9PVCwKKwkJLmlzX2xvd2VzdCA9IGZhbHNlLAorCX07CisKKwllcnIgPSBvdmxfZGlyX3JlYWQocGF0aCwgJnJkZCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlpbm9kZV9sb2NrX25lc3RlZChkaXIsIElfTVVURVhfUEFSRU5UKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZsaXN0LCBsX25vZGUpIHsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCisJCWlmIChwLT5uYW1lWzBdID09ICcuJykgeworCQkJaWYgKHAtPmxlbiA9PSAxKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHAtPmxlbiA9PSAyICYmIHAtPm5hbWVbMV0gPT0gJy4nKQorCQkJCWNvbnRpbnVlOworCQl9CisJCWRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKHAtPm5hbWUsIHBhdGgtPmRlbnRyeSwgcC0+bGVuKTsKKwkJaWYgKElTX0VSUihkZW50cnkpKQorCQkJY29udGludWU7CisJCWlmIChkZW50cnktPmRfaW5vZGUpCisJCQlvdmxfd29ya2Rpcl9jbGVhbnVwKGRpciwgcGF0aC0+bW50LCBkZW50cnksIGxldmVsKTsKKwkJZHB1dChkZW50cnkpOworCX0KKwlpbm9kZV91bmxvY2soZGlyKTsKK291dDoKKwlvdmxfY2FjaGVfZnJlZSgmbGlzdCk7Cit9CisKK3ZvaWQgb3ZsX3dvcmtkaXJfY2xlYW51cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHZmc21vdW50ICptbnQsCisJCQkgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbGV2ZWwpCit7CisJaW50IGVycjsKKworCWlmICghZF9pc19kaXIoZGVudHJ5KSB8fCBsZXZlbCA+IDEpIHsKKwkJb3ZsX2NsZWFudXAoZGlyLCBkZW50cnkpOworCQlyZXR1cm47CisJfQorCisJZXJyID0gb3ZsX2RvX3JtZGlyKGRpciwgZGVudHJ5KTsKKwlpZiAoZXJyKSB7CisJCXN0cnVjdCBwYXRoIHBhdGggPSB7IC5tbnQgPSBtbnQsIC5kZW50cnkgPSBkZW50cnkgfTsKKworCQlpbm9kZV91bmxvY2soZGlyKTsKKwkJb3ZsX3dvcmtkaXJfY2xlYW51cF9yZWN1cnNlKCZwYXRoLCBsZXZlbCArIDEpOworCQlpbm9kZV9sb2NrX25lc3RlZChkaXIsIElfTVVURVhfUEFSRU5UKTsKKwkJb3ZsX2NsZWFudXAoZGlyLCBkZW50cnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2ZzL292ZXJsYXlmcy9zdXBlci5jIGIvZnMvb3ZlcmxheWZzL3N1cGVyLmMKaW5kZXggNDAzNjEzMi4uZTJhOTRhMiAxMDA2NDQKLS0tIGEvZnMvb3ZlcmxheWZzL3N1cGVyLmMKKysrIGIvZnMvb3ZlcmxheWZzL3N1cGVyLmMKQEAgLTgxNCw2ICs4MTQsMTAgQEAKIAkJc3RydWN0IGtzdGF0IHN0YXQgPSB7CiAJCQkubW9kZSA9IFNfSUZESVIgfCAwLAogCQl9OworCQlzdHJ1Y3QgaWF0dHIgYXR0ciA9IHsKKwkJCS5pYV92YWxpZCA9IEFUVFJfTU9ERSwKKwkJCS5pYV9tb2RlID0gc3RhdC5tb2RlLAorCQl9OwogCiAJCWlmICh3b3JrLT5kX2lub2RlKSB7CiAJCQllcnIgPSAtRUVYSVNUOwpAQCAtODIxLDcgKzgyNSw3IEBACiAJCQkJZ290byBvdXRfZHB1dDsKIAogCQkJcmV0cmllZCA9IHRydWU7Ci0JCQlvdmxfY2xlYW51cChkaXIsIHdvcmspOworCQkJb3ZsX3dvcmtkaXJfY2xlYW51cChkaXIsIG1udCwgd29yaywgMCk7CiAJCQlkcHV0KHdvcmspOwogCQkJZ290byByZXRyeTsKIAkJfQpAQCAtODI5LDYgKzgzMywyMSBAQAogCQllcnIgPSBvdmxfY3JlYXRlX3JlYWwoZGlyLCB3b3JrLCAmc3RhdCwgTlVMTCwgTlVMTCwgdHJ1ZSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dF9kcHV0OworCisJCWVyciA9IHZmc19yZW1vdmV4YXR0cih3b3JrLCBYQVRUUl9OQU1FX1BPU0lYX0FDTF9ERUZBVUxUKTsKKwkJaWYgKGVyciAmJiBlcnIgIT0gLUVOT0RBVEEgJiYgZXJyICE9IC1FT1BOT1RTVVBQKQorCQkJZ290byBvdXRfZHB1dDsKKworCQllcnIgPSB2ZnNfcmVtb3ZleGF0dHIod29yaywgWEFUVFJfTkFNRV9QT1NJWF9BQ0xfQUNDRVNTKTsKKwkJaWYgKGVyciAmJiBlcnIgIT0gLUVOT0RBVEEgJiYgZXJyICE9IC1FT1BOT1RTVVBQKQorCQkJZ290byBvdXRfZHB1dDsKKworCQkvKiBDbGVhciBhbnkgaW5oZXJpdGVkIG1vZGUgYml0cyAqLworCQlpbm9kZV9sb2NrKHdvcmstPmRfaW5vZGUpOworCQllcnIgPSBub3RpZnlfY2hhbmdlKHdvcmssICZhdHRyLCBOVUxMKTsKKwkJaW5vZGVfdW5sb2NrKHdvcmstPmRfaW5vZGUpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfZHB1dDsKIAl9CiBvdXRfdW5sb2NrOgogCWlub2RlX3VubG9jayhkaXIpOwpAQCAtOTY3LDEwICs5ODYsMTkgQEAKIAlyZXR1cm4gY3RyOwogfQogCi1zdGF0aWMgaW50IG92bF9wb3NpeF9hY2xfeGF0dHJfc2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLAotCQkJCSAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwKLQkJCQkgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQorc3RhdGljIGludCBfX21heWJlX3VudXNlZAorb3ZsX3Bvc2l4X2FjbF94YXR0cl9nZXQoY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIsCisJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQljb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCXJldHVybiBvdmxfeGF0dHJfZ2V0KGRlbnRyeSwgaGFuZGxlci0+bmFtZSwgYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIGludCBfX21heWJlX3VudXNlZAorb3ZsX3Bvc2l4X2FjbF94YXR0cl9zZXQoY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIsCisJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQljb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwKKwkJCXNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGRlbnRyeSAqd29ya2RpciA9IG92bF93b3JrZGlyKGRlbnRyeSk7CiAJc3RydWN0IGlub2RlICpyZWFsaW5vZGUgPSBvdmxfaW5vZGVfcmVhbChpbm9kZSwgTlVMTCk7CkBAIC05OTgsMTkgKzEwMjYsMjIgQEAKIAogCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CiAKLQlyZXR1cm4gb3ZsX3NldHhhdHRyKGRlbnRyeSwgaW5vZGUsIGhhbmRsZXItPm5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7CisJZXJyID0gb3ZsX3hhdHRyX3NldChkZW50cnksIGhhbmRsZXItPm5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7CisJaWYgKCFlcnIpCisJCW92bF9jb3B5YXR0cihvdmxfaW5vZGVfcmVhbChpbm9kZSwgTlVMTCksIGlub2RlKTsKKworCXJldHVybiBlcnI7CiAKIG91dF9hY2xfcmVsZWFzZToKIAlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgb3ZsX290aGVyX3hhdHRyX3NldChjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciwKLQkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsCi0JCQkgICAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3N0YXRpYyBpbnQgb3ZsX293bl94YXR0cl9nZXQoY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIsCisJCQkgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKLQlyZXR1cm4gb3ZsX3NldHhhdHRyKGRlbnRyeSwgaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7CisJcmV0dXJuIC1FUEVSTTsKIH0KIAogc3RhdGljIGludCBvdmxfb3duX3hhdHRyX3NldChjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciwKQEAgLTEwMjEsNDIgKzEwNTIsNTkgQEAKIAlyZXR1cm4gLUVQRVJNOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgb3ZsX3Bvc2l4X2FjbF9hY2Nlc3NfeGF0dHJfaGFuZGxlciA9IHsKK3N0YXRpYyBpbnQgb3ZsX290aGVyX3hhdHRyX2dldChjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciwKKwkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gb3ZsX3hhdHRyX2dldChkZW50cnksIG5hbWUsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgb3ZsX290aGVyX3hhdHRyX3NldChjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciwKKwkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsCisJCQkgICAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlyZXR1cm4gb3ZsX3hhdHRyX3NldChkZW50cnksIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBfX21heWJlX3VudXNlZAorb3ZsX3Bvc2l4X2FjbF9hY2Nlc3NfeGF0dHJfaGFuZGxlciA9IHsKIAkubmFtZSA9IFhBVFRSX05BTUVfUE9TSVhfQUNMX0FDQ0VTUywKIAkuZmxhZ3MgPSBBQ0xfVFlQRV9BQ0NFU1MsCisJLmdldCA9IG92bF9wb3NpeF9hY2xfeGF0dHJfZ2V0LAogCS5zZXQgPSBvdmxfcG9zaXhfYWNsX3hhdHRyX3NldCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBvdmxfcG9zaXhfYWNsX2RlZmF1bHRfeGF0dHJfaGFuZGxlciA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBfX21heWJlX3VudXNlZAorb3ZsX3Bvc2l4X2FjbF9kZWZhdWx0X3hhdHRyX2hhbmRsZXIgPSB7CiAJLm5hbWUgPSBYQVRUUl9OQU1FX1BPU0lYX0FDTF9ERUZBVUxULAogCS5mbGFncyA9IEFDTF9UWVBFX0RFRkFVTFQsCisJLmdldCA9IG92bF9wb3NpeF9hY2xfeGF0dHJfZ2V0LAogCS5zZXQgPSBvdmxfcG9zaXhfYWNsX3hhdHRyX3NldCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBvdmxfb3duX3hhdHRyX2hhbmRsZXIgPSB7CiAJLnByZWZpeAk9IE9WTF9YQVRUUl9QUkVGSVgsCisJLmdldCA9IG92bF9vd25feGF0dHJfZ2V0LAogCS5zZXQgPSBvdmxfb3duX3hhdHRyX3NldCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBvdmxfb3RoZXJfeGF0dHJfaGFuZGxlciA9IHsKIAkucHJlZml4CT0gIiIsIC8qIGNhdGNoIGFsbCAqLworCS5nZXQgPSBvdmxfb3RoZXJfeGF0dHJfZ2V0LAogCS5zZXQgPSBvdmxfb3RoZXJfeGF0dHJfc2V0LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpvdmxfeGF0dHJfaGFuZGxlcnNbXSA9IHsKKyNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCiAJJm92bF9wb3NpeF9hY2xfYWNjZXNzX3hhdHRyX2hhbmRsZXIsCiAJJm92bF9wb3NpeF9hY2xfZGVmYXVsdF94YXR0cl9oYW5kbGVyLAorI2VuZGlmCiAJJm92bF9vd25feGF0dHJfaGFuZGxlciwKIAkmb3ZsX290aGVyX3hhdHRyX2hhbmRsZXIsCiAJTlVMTAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpvdmxfeGF0dHJfbm9hY2xfaGFuZGxlcnNbXSA9IHsKLQkmb3ZsX293bl94YXR0cl9oYW5kbGVyLAotCSZvdmxfb3RoZXJfeGF0dHJfaGFuZGxlciwKLQlOVUxMLAotfTsKLQogc3RhdGljIGludCBvdmxfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQogewogCXN0cnVjdCBwYXRoIHVwcGVycGF0aCA9IHsgTlVMTCwgTlVMTCB9OwpAQCAtMTEzMiw3ICsxMTgwLDcgQEAKIAllcnIgPSAtRUlOVkFMOwogCXN0YWNrbGVuID0gb3ZsX3NwbGl0X2xvd2VyZGlycyhsb3dlcnRtcCk7CiAJaWYgKHN0YWNrbGVuID4gT1ZMX01BWF9TVEFDSykgewotCQlwcl9lcnIoIm92ZXJsYXlmczogdG9vIG1hbnkgbG93ZXIgZGlyZWN0cmllcywgbGltaXQgaXMgJWRcbiIsCisJCXByX2Vycigib3ZlcmxheWZzOiB0b28gbWFueSBsb3dlciBkaXJlY3RvcmllcywgbGltaXQgaXMgJWRcbiIsCiAJCSAgICAgICBPVkxfTUFYX1NUQUNLKTsKIAkJZ290byBvdXRfZnJlZV9sb3dlcnRtcDsKIAl9IGVsc2UgaWYgKCF1ZnMtPmNvbmZpZy51cHBlcmRpciAmJiBzdGFja2xlbiA9PSAxKSB7CkBAIC0xMjY5LDEwICsxMzE3LDcgQEAKIAogCXNiLT5zX21hZ2ljID0gT1ZFUkxBWUZTX1NVUEVSX01BR0lDOwogCXNiLT5zX29wID0gJm92bF9zdXBlcl9vcGVyYXRpb25zOwotCWlmIChJU19FTkFCTEVEKENPTkZJR19GU19QT1NJWF9BQ0wpKQotCQlzYi0+c194YXR0ciA9IG92bF94YXR0cl9oYW5kbGVyczsKLQllbHNlCi0JCXNiLT5zX3hhdHRyID0gb3ZsX3hhdHRyX25vYWNsX2hhbmRsZXJzOworCXNiLT5zX3hhdHRyID0gb3ZsX3hhdHRyX2hhbmRsZXJzOwogCXNiLT5zX3Jvb3QgPSByb290X2RlbnRyeTsKIAlzYi0+c19mc19pbmZvID0gdWZzOwogCXNiLT5zX2ZsYWdzIHw9IE1TX1BPU0lYQUNMOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9iYXNlLmMgYi9mcy9wcm9jL2Jhc2UuYwppbmRleCA1NGUyNzAyLi4zYjc5MmFiIDEwMDY0NAotLS0gYS9mcy9wcm9jL2Jhc2UuYworKysgYi9mcy9wcm9jL2Jhc2UuYwpAQCAtNDgzLDcgKzQ4Myw3IEBACiAJCXNhdmVfc3RhY2tfdHJhY2VfdHNrKHRhc2ssICZ0cmFjZSk7CiAKIAkJZm9yIChpID0gMDsgaSA8IHRyYWNlLm5yX2VudHJpZXM7IGkrKykgewotCQkJc2VxX3ByaW50ZihtLCAiWzwlcEs+XSAlcFNcbiIsCisJCQlzZXFfcHJpbnRmKG0sICJbPCVwSz5dICVwQlxuIiwKIAkJCQkgICAodm9pZCAqKWVudHJpZXNbaV0sICh2b2lkICopZW50cmllc1tpXSk7CiAJCX0KIAkJdW5sb2NrX3RyYWNlKHRhc2spOwpAQCAtMTU1NiwxOCArMTU1NiwxMyBAQAogc3RhdGljIGludCBwcm9jX2V4ZV9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHBhdGggKmV4ZV9wYXRoKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLQlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKIAlzdHJ1Y3QgZmlsZSAqZXhlX2ZpbGU7CiAKIAl0YXNrID0gZ2V0X3Byb2NfdGFzayhkX2lub2RlKGRlbnRyeSkpOwogCWlmICghdGFzaykKIAkJcmV0dXJuIC1FTk9FTlQ7Ci0JbW0gPSBnZXRfdGFza19tbSh0YXNrKTsKKwlleGVfZmlsZSA9IGdldF90YXNrX2V4ZV9maWxlKHRhc2spOwogCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKLQlpZiAoIW1tKQotCQlyZXR1cm4gLUVOT0VOVDsKLQlleGVfZmlsZSA9IGdldF9tbV9leGVfZmlsZShtbSk7Ci0JbW1wdXQobW0pOwogCWlmIChleGVfZmlsZSkgewogCQkqZXhlX3BhdGggPSBleGVfZmlsZS0+Zl9wYXRoOwogCQlwYXRoX2dldCgmZXhlX2ZpbGUtPmZfcGF0aCk7CmRpZmYgLS1naXQgYS9mcy9wcm9jL2dlbmVyaWMuYyBiL2ZzL3Byb2MvZ2VuZXJpYy5jCmluZGV4IGM2MzM0NzYuLmJjYTY2ZDggMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvZ2VuZXJpYy5jCisrKyBiL2ZzL3Byb2MvZ2VuZXJpYy5jCkBAIC0zOTAsNiArMzkwLDggQEAKIAlhdG9taWNfc2V0KCZlbnQtPmNvdW50LCAxKTsKIAlzcGluX2xvY2tfaW5pdCgmZW50LT5wZGVfdW5sb2FkX2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZlbnQtPnBkZV9vcGVuZXJzKTsKKwlwcm9jX3NldF91c2VyKGVudCwgKCpwYXJlbnQpLT51aWQsICgqcGFyZW50KS0+Z2lkKTsKKwogb3V0OgogCXJldHVybiBlbnQ7CiB9CmRpZmYgLS1naXQgYS9mcy9wcm9jL2tjb3JlLmMgYi9mcy9wcm9jL2tjb3JlLmMKaW5kZXggYTkzOWY1ZS4uNWM4OWEwNyAxMDA2NDQKLS0tIGEvZnMvcHJvYy9rY29yZS5jCisrKyBiL2ZzL3Byb2Mva2NvcmUuYwpAQCAtNDMwLDYgKzQzMCw3IEBACiBzdGF0aWMgc3NpemVfdAogcmVhZF9rY29yZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbiwgbG9mZl90ICpmcG9zKQogeworCWNoYXIgKmJ1ZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzc2l6ZV90IGFjYyA9IDA7CiAJc2l6ZV90IHNpemUsIHRzejsKIAlzaXplX3QgZWxmX2J1ZmxlbjsKQEAgLTUwMCwyMyArNTAxLDIwIEBACiAJCQlpZiAoY2xlYXJfdXNlcihidWZmZXIsIHRzeikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0gZWxzZSBpZiAoaXNfdm1hbGxvY19vcl9tb2R1bGVfYWRkcigodm9pZCAqKXN0YXJ0KSkgewotCQkJY2hhciAqIGVsZl9idWY7Ci0KLQkJCWVsZl9idWYgPSBremFsbG9jKHRzeiwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIWVsZl9idWYpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl2cmVhZChlbGZfYnVmLCAoY2hhciAqKXN0YXJ0LCB0c3opOworCQkJdnJlYWQoYnVmLCAoY2hhciAqKXN0YXJ0LCB0c3opOwogCQkJLyogd2UgaGF2ZSB0byB6ZXJvLWZpbGwgdXNlciBidWZmZXIgZXZlbiBpZiBubyByZWFkICovCi0JCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgZWxmX2J1ZiwgdHN6KSkgewotCQkJCWtmcmVlKGVsZl9idWYpOworCQkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGJ1ZiwgdHN6KSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJCWtmcmVlKGVsZl9idWYpOwogCQl9IGVsc2UgewogCQkJaWYgKGtlcm5fYWRkcl92YWxpZChzdGFydCkpIHsKIAkJCQl1bnNpZ25lZCBsb25nIG47CiAKLQkJCQluID0gY29weV90b191c2VyKGJ1ZmZlciwgKGNoYXIgKilzdGFydCwgdHN6KTsKKwkJCQkvKgorCQkJCSAqIFVzaW5nIGJvdW5jZSBidWZmZXIgdG8gYnlwYXNzIHRoZQorCQkJCSAqIGhhcmRlbmVkIHVzZXIgY29weSBrZXJuZWwgdGV4dCBjaGVja3MuCisJCQkJICovCisJCQkJbWVtY3B5KGJ1ZiwgKGNoYXIgKikgc3RhcnQsIHRzeik7CisJCQkJbiA9IGNvcHlfdG9fdXNlcihidWZmZXIsIGJ1ZiwgdHN6KTsKIAkJCQkvKgogCQkJCSAqIFdlIGNhbm5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGZhdWx0IG9uIHNvdXJjZQogCQkJCSAqIGFuZCBmYXVsdCBvbiBkZXN0aW5hdGlvbi4gV2hlbiB0aGlzIGhhcHBlbnMKQEAgLTU0OSw2ICs1NDcsMTEgQEAKIHsKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCiAJCXJldHVybiAtRVBFUk07CisKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmaWxwLT5wcml2YXRlX2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCiAJaWYgKGtjb3JlX25lZWRfdXBkYXRlKQogCQlrY29yZV91cGRhdGVfcmFtKCk7CiAJaWYgKGlfc2l6ZV9yZWFkKGlub2RlKSAhPSBwcm9jX3Jvb3Rfa2NvcmUtPnNpemUpIHsKQEAgLTU1OSwxMCArNTYyLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcmVsZWFzZV9rY29yZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlrZnJlZShmaWxlLT5wcml2YXRlX2RhdGEpOworCXJldHVybiAwOworfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2tjb3JlX29wZXJhdGlvbnMgPSB7CiAJLnJlYWQJCT0gcmVhZF9rY29yZSwKIAkub3BlbgkJPSBvcGVuX2tjb3JlLAorCS5yZWxlYXNlCT0gcmVsZWFzZV9rY29yZSwKIAkubGxzZWVrCQk9IGRlZmF1bHRfbGxzZWVrLAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wcm9jX25ldC5jIGIvZnMvcHJvYy9wcm9jX25ldC5jCmluZGV4IGM4YmJjNjguLjdhZTZiMWQgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvcHJvY19uZXQuYworKysgYi9mcy9wcm9jL3Byb2NfbmV0LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KKyNpbmNsdWRlIDxsaW51eC91aWRnaWQuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKQEAgLTE4NSw2ICsxODYsOCBAQAogc3RhdGljIF9fbmV0X2luaXQgaW50IHByb2NfbmV0X25zX2luaXQoc3RydWN0IG5ldCAqbmV0KQogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqbmV0ZCwgKm5ldF9zdGF0ZDsKKwlrdWlkX3QgdWlkOworCWtnaWRfdCBnaWQ7CiAJaW50IGVycjsKIAogCWVyciA9IC1FTk9NRU07CkBAIC0xOTksNiArMjAyLDE2IEBACiAJbmV0ZC0+cGFyZW50ID0gJnByb2Nfcm9vdDsKIAltZW1jcHkobmV0ZC0+bmFtZSwgIm5ldCIsIDQpOwogCisJdWlkID0gbWFrZV9rdWlkKG5ldC0+dXNlcl9ucywgMCk7CisJaWYgKCF1aWRfdmFsaWQodWlkKSkKKwkJdWlkID0gbmV0ZC0+dWlkOworCisJZ2lkID0gbWFrZV9rZ2lkKG5ldC0+dXNlcl9ucywgMCk7CisJaWYgKCFnaWRfdmFsaWQoZ2lkKSkKKwkJZ2lkID0gbmV0ZC0+Z2lkOworCisJcHJvY19zZXRfdXNlcihuZXRkLCB1aWQsIGdpZCk7CisKIAllcnIgPSAtRUVYSVNUOwogCW5ldF9zdGF0ZCA9IHByb2NfbmV0X21rZGlyKG5ldCwgInN0YXQiLCBuZXRkKTsKIAlpZiAoIW5ldF9zdGF0ZCkKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvcHJvY19zeXNjdGwuYyBiL2ZzL3Byb2MvcHJvY19zeXNjdGwuYwppbmRleCAxYjkzNjUwLi4yZWQzZDcxIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2Nfc3lzY3RsLmMKKysrIGIvZnMvcHJvYy9wcm9jX3N5c2N0bC5jCkBAIC00MzAsNiArNDMwLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKnByb2Nfc3lzX21ha2VfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmhlYWQsIHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKQogeworCXN0cnVjdCBjdGxfdGFibGVfcm9vdCAqcm9vdCA9IGhlYWQtPnJvb3Q7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgcHJvY19pbm9kZSAqZWk7CiAKQEAgLTQ1Nyw2ICs0NTgsMTAgQEAKIAkJaWYgKGlzX2VtcHR5X2RpcihoZWFkKSkKIAkJCW1ha2VfZW1wdHlfZGlyX2lub2RlKGlub2RlKTsKIAl9CisKKwlpZiAocm9vdC0+c2V0X293bmVyc2hpcCkKKwkJcm9vdC0+c2V0X293bmVyc2hpcChoZWFkLCB0YWJsZSwgJmlub2RlLT5pX3VpZCwgJmlub2RlLT5pX2dpZCk7CisKIG91dDoKIAlyZXR1cm4gaW5vZGU7CiB9CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Rhc2tfbW11LmMgYi9mcy9wcm9jL3Rhc2tfbW11LmMKaW5kZXggMTg3ZDg0ZS4uZjZmYTk5ZSAxMDA2NDQKLS0tIGEvZnMvcHJvYy90YXNrX21tdS5jCisrKyBiL2ZzL3Byb2MvdGFza19tbXUuYwpAQCAtNTgxLDYgKzU4MSw4IEBACiAJCW1zcy0+YW5vbnltb3VzX3RocCArPSBIUEFHRV9QTURfU0laRTsKIAllbHNlIGlmIChQYWdlU3dhcEJhY2tlZChwYWdlKSkKIAkJbXNzLT5zaG1lbV90aHAgKz0gSFBBR0VfUE1EX1NJWkU7CisJZWxzZSBpZiAoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkKKwkJLyogcGFzcyAqLzsKIAllbHNlCiAJCVZNX0JVR19PTl9QQUdFKDEsIHBhZ2UpOwogCXNtYXBzX2FjY291bnQobXNzLCBwYWdlLCB0cnVlLCBwbWRfeW91bmcoKnBtZCksIHBtZF9kaXJ0eSgqcG1kKSk7CmRpZmYgLS1naXQgYS9mcy9xdW90YS9xdW90YS5jIGIvZnMvcXVvdGEvcXVvdGEuYwppbmRleCAzNWRmMDhlLi4yZDQ0NTQyIDEwMDY0NAotLS0gYS9mcy9xdW90YS9xdW90YS5jCisrKyBiL2ZzL3F1b3RhL3F1b3RhLmMKQEAgLTM0MSw2ICszNDEsNyBAQAogCXN0cnVjdCBxY19zdGF0ZSBzdGF0ZTsKIAlpbnQgcmV0OwogCisJbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgcWNfc3RhdGUpKTsKIAlyZXQgPSBzYi0+c19xY29wLT5nZXRfc3RhdGUoc2IsICZzdGF0ZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC0zNjUsMTcgKzM2NiwxOSBAQAogCWZxcy0+cXNfcnRidGltZWxpbWl0ID0gc3RhdGUuc19zdGF0ZVt0eXBlXS5ydF9zcGNfdGltZWxpbWl0OwogCWZxcy0+cXNfYndhcm5saW1pdCA9IHN0YXRlLnNfc3RhdGVbdHlwZV0uc3BjX3dhcm5saW1pdDsKIAlmcXMtPnFzX2l3YXJubGltaXQgPSBzdGF0ZS5zX3N0YXRlW3R5cGVdLmlub193YXJubGltaXQ7Ci0JaWYgKHN0YXRlLnNfc3RhdGVbVVNSUVVPVEFdLmZsYWdzICYgUUNJX0FDQ1RfRU5BQkxFRCkgeworCisJLyogSW5vZGVzIG1heSBiZSBhbGxvY2F0ZWQgZXZlbiBpZiBpbmFjdGl2ZTsgY29weSBvdXQgaWYgcHJlc2VudCAqLworCWlmIChzdGF0ZS5zX3N0YXRlW1VTUlFVT1RBXS5pbm8pIHsKIAkJZnFzLT5xc191cXVvdGEucWZzX2lubyA9IHN0YXRlLnNfc3RhdGVbVVNSUVVPVEFdLmlubzsKIAkJZnFzLT5xc191cXVvdGEucWZzX25ibGtzID0gc3RhdGUuc19zdGF0ZVtVU1JRVU9UQV0uYmxvY2tzOwogCQlmcXMtPnFzX3VxdW90YS5xZnNfbmV4dGVudHMgPSBzdGF0ZS5zX3N0YXRlW1VTUlFVT1RBXS5uZXh0ZW50czsKIAl9Ci0JaWYgKHN0YXRlLnNfc3RhdGVbR1JQUVVPVEFdLmZsYWdzICYgUUNJX0FDQ1RfRU5BQkxFRCkgeworCWlmIChzdGF0ZS5zX3N0YXRlW0dSUFFVT1RBXS5pbm8pIHsKIAkJZnFzLT5xc19ncXVvdGEucWZzX2lubyA9IHN0YXRlLnNfc3RhdGVbR1JQUVVPVEFdLmlubzsKIAkJZnFzLT5xc19ncXVvdGEucWZzX25ibGtzID0gc3RhdGUuc19zdGF0ZVtHUlBRVU9UQV0uYmxvY2tzOwogCQlmcXMtPnFzX2dxdW90YS5xZnNfbmV4dGVudHMgPSBzdGF0ZS5zX3N0YXRlW0dSUFFVT1RBXS5uZXh0ZW50czsKIAl9Ci0JaWYgKHN0YXRlLnNfc3RhdGVbUFJKUVVPVEFdLmZsYWdzICYgUUNJX0FDQ1RfRU5BQkxFRCkgeworCWlmIChzdGF0ZS5zX3N0YXRlW1BSSlFVT1RBXS5pbm8pIHsKIAkJLyoKIAkJICogUV9YR0VUUVNUQVQgZG9lc24ndCBoYXZlIHJvb20gZm9yIGJvdGggZ3JvdXAgYW5kIHByb2plY3QKIAkJICogcXVvdGFzLiAgU28sIGFsbG93IHRoZSBwcm9qZWN0IHF1b3RhIHZhbHVlcyB0byBiZSBjb3BpZWQgb3V0CkBAIC00MTEsNiArNDE0LDcgQEAKIAlzdHJ1Y3QgcWNfc3RhdGUgc3RhdGU7CiAJaW50IHJldDsKIAorCW1lbXNldCgmc3RhdGUsIDAsIHNpemVvZiAoc3RydWN0IHFjX3N0YXRlKSk7CiAJcmV0ID0gc2ItPnNfcWNvcC0+Z2V0X3N0YXRlKHNiLCAmc3RhdGUpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtNDM1LDE3ICs0MzksMTkgQEAKIAlmcXMtPnFzX3J0YnRpbWVsaW1pdCA9IHN0YXRlLnNfc3RhdGVbdHlwZV0ucnRfc3BjX3RpbWVsaW1pdDsKIAlmcXMtPnFzX2J3YXJubGltaXQgPSBzdGF0ZS5zX3N0YXRlW3R5cGVdLnNwY193YXJubGltaXQ7CiAJZnFzLT5xc19pd2FybmxpbWl0ID0gc3RhdGUuc19zdGF0ZVt0eXBlXS5pbm9fd2FybmxpbWl0OwotCWlmIChzdGF0ZS5zX3N0YXRlW1VTUlFVT1RBXS5mbGFncyAmIFFDSV9BQ0NUX0VOQUJMRUQpIHsKKworCS8qIElub2RlcyBtYXkgYmUgYWxsb2NhdGVkIGV2ZW4gaWYgaW5hY3RpdmU7IGNvcHkgb3V0IGlmIHByZXNlbnQgKi8KKwlpZiAoc3RhdGUuc19zdGF0ZVtVU1JRVU9UQV0uaW5vKSB7CiAJCWZxcy0+cXNfdXF1b3RhLnFmc19pbm8gPSBzdGF0ZS5zX3N0YXRlW1VTUlFVT1RBXS5pbm87CiAJCWZxcy0+cXNfdXF1b3RhLnFmc19uYmxrcyA9IHN0YXRlLnNfc3RhdGVbVVNSUVVPVEFdLmJsb2NrczsKIAkJZnFzLT5xc191cXVvdGEucWZzX25leHRlbnRzID0gc3RhdGUuc19zdGF0ZVtVU1JRVU9UQV0ubmV4dGVudHM7CiAJfQotCWlmIChzdGF0ZS5zX3N0YXRlW0dSUFFVT1RBXS5mbGFncyAmIFFDSV9BQ0NUX0VOQUJMRUQpIHsKKwlpZiAoc3RhdGUuc19zdGF0ZVtHUlBRVU9UQV0uaW5vKSB7CiAJCWZxcy0+cXNfZ3F1b3RhLnFmc19pbm8gPSBzdGF0ZS5zX3N0YXRlW0dSUFFVT1RBXS5pbm87CiAJCWZxcy0+cXNfZ3F1b3RhLnFmc19uYmxrcyA9IHN0YXRlLnNfc3RhdGVbR1JQUVVPVEFdLmJsb2NrczsKIAkJZnFzLT5xc19ncXVvdGEucWZzX25leHRlbnRzID0gc3RhdGUuc19zdGF0ZVtHUlBRVU9UQV0ubmV4dGVudHM7CiAJfQotCWlmIChzdGF0ZS5zX3N0YXRlW1BSSlFVT1RBXS5mbGFncyAmIFFDSV9BQ0NUX0VOQUJMRUQpIHsKKwlpZiAoc3RhdGUuc19zdGF0ZVtQUkpRVU9UQV0uaW5vKSB7CiAJCWZxcy0+cXNfcHF1b3RhLnFmc19pbm8gPSBzdGF0ZS5zX3N0YXRlW1BSSlFVT1RBXS5pbm87CiAJCWZxcy0+cXNfcHF1b3RhLnFmc19uYmxrcyA9IHN0YXRlLnNfc3RhdGVbUFJKUVVPVEFdLmJsb2NrczsKIAkJZnFzLT5xc19wcXVvdGEucWZzX25leHRlbnRzID0gc3RhdGUuc19zdGF0ZVtQUkpRVU9UQV0ubmV4dGVudHM7CmRpZmYgLS1naXQgYS9mcy9yYW1mcy9maWxlLW1tdS5jIGIvZnMvcmFtZnMvZmlsZS1tbXUuYwppbmRleCAxODNhMjEyLi4xMmFmMDQ5IDEwMDY0NAotLS0gYS9mcy9yYW1mcy9maWxlLW1tdS5jCisrKyBiL2ZzL3JhbWZzL2ZpbGUtbW11LmMKQEAgLTI3LDkgKzI3LDE3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbWZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJhbWZzX21tdV9nZXRfdW5tYXBwZWRfYXJlYShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwZ29mZiwKKwkJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlyZXR1cm4gY3VycmVudC0+bW0tPmdldF91bm1hcHBlZF9hcmVhKGZpbGUsIGFkZHIsIGxlbiwgcGdvZmYsIGZsYWdzKTsKK30KKwogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByYW1mc19maWxlX29wZXJhdGlvbnMgPSB7CiAJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCiAJLndyaXRlX2l0ZXIJPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKQEAgLTM4LDYgKzQ2LDcgQEAKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCiAJLnNwbGljZV93cml0ZQk9IGl0ZXJfZmlsZV9zcGxpY2Vfd3JpdGUsCiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5nZXRfdW5tYXBwZWRfYXJlYQk9IHJhbWZzX21tdV9nZXRfdW5tYXBwZWRfYXJlYSwKIH07CiAKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHJhbWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMgYi9mcy9yZWlzZXJmcy9zdXBlci5jCmluZGV4IDdhNGE4NWEuLjc0ZDVkZGQgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMKKysrIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwpAQCAtMTkwLDcgKzE5MCwxNSBAQAogc3RhdGljIGludCByZWlzZXJmc19xdW90YV9vbl9tb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50KTsKICNlbmRpZgogCi0vKiBsb29rIGZvciB1bmNvbXBsZXRlZCB1bmxpbmtzIGFuZCB0cnVuY2F0ZXMgYW5kIGNvbXBsZXRlIHRoZW0gKi8KKy8qCisgKiBMb29rIGZvciB1bmNvbXBsZXRlZCB1bmxpbmtzIGFuZCB0cnVuY2F0ZXMgYW5kIGNvbXBsZXRlIHRoZW0KKyAqCisgKiBDYWxsZWQgd2l0aCBzdXBlcmJsb2NrIHdyaXRlIGxvY2tlZC4gIElmIHF1b3RhcyBhcmUgZW5hYmxlZCwgd2UgaGF2ZSB0bworICogcmVsZWFzZS9yZXRha2UgbGVzdCB3ZSBjYWxsIGRxdW90X3F1b3RhX29uX21vdW50KCksIHByb2NlZWQgdG8KKyAqIHNjaGVkdWxlX29uX2VhY2hfY3B1KCkgaW4gaW52YWxpZGF0ZV9iZGV2KCkgYW5kIGRlYWRsb2NrIHdhaXRpbmcgZm9yIHRoZSBwZXIKKyAqIGNwdSB3b3JrbGV0cyB0byBjb21wbGV0ZSBmbHVzaF9hc3luY19jb21taXRzKCkgdGhhdCBpbiB0dXJuIHdhaXQgZm9yIHRoZQorICogc3VwZXJibG9jayB3cml0ZSBsb2NrLgorICovCiBzdGF0aWMgaW50IGZpbmlzaF91bmZpbmlzaGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKIAlJTklUSUFMSVpFX1BBVEgocGF0aCk7CkBAIC0yMzcsNyArMjQ1LDkgQEAKIAkJCQlxdW90YV9lbmFibGVkW2ldID0gMDsKIAkJCQljb250aW51ZTsKIAkJCX0KKwkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKIAkJCXJldCA9IHJlaXNlcmZzX3F1b3RhX29uX21vdW50KHMsIGkpOworCQkJcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJlaXNlcmZzX3dhcm5pbmcocywgInJlaXNlcmZzLTI1MDAiLAogCQkJCQkJICJjYW5ub3QgdHVybiBvbiBqb3VybmFsZWQgIgpkaWZmIC0tZ2l0IGEvZnMvc2VxX2ZpbGUuYyBiL2ZzL3NlcV9maWxlLmMKaW5kZXggMTlmNTMyZS4uNmRjNDI5NiAxMDA2NDQKLS0tIGEvZnMvc2VxX2ZpbGUuYworKysgYi9mcy9zZXFfZmlsZS5jCkBAIC0yMjMsOCArMjIzLDEwIEBACiAJCXNpemUgLT0gbjsKIAkJYnVmICs9IG47CiAJCWNvcGllZCArPSBuOwotCQlpZiAoIW0tPmNvdW50KQorCQlpZiAoIW0tPmNvdW50KSB7CisJCQltLT5mcm9tID0gMDsKIAkJCW0tPmluZGV4Kys7CisJCX0KIAkJaWYgKCFzaXplKQogCQkJZ290byBEb25lOwogCX0KZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2ZpbGUuYyBiL2ZzL3N5c2ZzL2ZpbGUuYwppbmRleCBmMzU1MjNkLi5iODAzMjEzIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9maWxlLmMKKysrIGIvZnMvc3lzZnMvZmlsZS5jCkBAIC0xMTQsOSArMTE0LDE1IEBACiAJICogSWYgYnVmICE9IG9mLT5wcmVhbGxvY19idWYsIHdlIGRvbid0IGtub3cgaG93CiAJICogbGFyZ2UgaXQgaXMsIHNvIGNhbm5vdCBzYWZlbHkgcGFzcyBpdCB0byAtPnNob3cKIAkgKi8KLQlpZiAocG9zIHx8IFdBUk5fT05fT05DRShidWYgIT0gb2YtPnByZWFsbG9jX2J1ZikpCisJaWYgKFdBUk5fT05fT05DRShidWYgIT0gb2YtPnByZWFsbG9jX2J1ZikpCiAJCXJldHVybiAwOwogCWxlbiA9IG9wcy0+c2hvdyhrb2JqLCBvZi0+a24tPnByaXYsIGJ1Zik7CisJaWYgKHBvcykgeworCQlpZiAobGVuIDw9IHBvcykKKwkJCXJldHVybiAwOworCQlsZW4gLT0gcG9zOworCQltZW1tb3ZlKGJ1ZiwgYnVmICsgcG9zLCBsZW4pOworCX0KIAlyZXR1cm4gbWluKGNvdW50LCBsZW4pOwogfQogCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9ncm91cC5jIGIvZnMvc3lzZnMvZ3JvdXAuYwppbmRleCBkYzEzNThiLi5hYzJkZTBlIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9ncm91cC5jCisrKyBiL2ZzL3N5c2ZzL2dyb3VwLmMKQEAgLTIzMyw4ICsyMzMsOCBAQAogCQlrbiA9IGtlcm5mc19maW5kX2FuZF9nZXQocGFyZW50LCBncnAtPm5hbWUpOwogCQlpZiAoIWtuKSB7CiAJCQlXQVJOKCFrbiwgS0VSTl9XQVJOSU5HCi0JCQkgICAgICJzeXNmcyBncm91cCAlcCBub3QgZm91bmQgZm9yIGtvYmplY3QgJyVzJ1xuIiwKLQkJCSAgICAgZ3JwLCBrb2JqZWN0X25hbWUoa29iaikpOworCQkJICAgICAic3lzZnMgZ3JvdXAgJyVzJyBub3QgZm91bmQgZm9yIGtvYmplY3QgJyVzJ1xuIiwKKwkJCSAgICAgZ3JwLT5uYW1lLCBrb2JqZWN0X25hbWUoa29iaikpOwogCQkJcmV0dXJuOwogCQl9CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3RuY19jb21taXQuYyBiL2ZzL3ViaWZzL3RuY19jb21taXQuYwppbmRleCBiNDUzNDVkLi41MTE1N2RhIDEwMDY0NAotLS0gYS9mcy91Ymlmcy90bmNfY29tbWl0LmMKKysrIGIvZnMvdWJpZnMvdG5jX2NvbW1pdC5jCkBAIC0zNzAsNyArMzcwLDcgQEAKIAogCXAgPSBjLT5nYXBfbGViczsKIAlkbyB7Ci0JCXViaWZzX2Fzc2VydChwIDwgYy0+Z2FwX2xlYnMgKyBzaXplb2YoaW50KSAqIGMtPmxzdC5pZHhfbGVicyk7CisJCXViaWZzX2Fzc2VydChwIDwgYy0+Z2FwX2xlYnMgKyBjLT5sc3QuaWR4X2xlYnMpOwogCQl3cml0dGVuID0gbGF5b3V0X2xlYl9pbl9nYXBzKGMsIHApOwogCQlpZiAod3JpdHRlbiA8IDApIHsKIAkJCWVyciA9IHdyaXR0ZW47CmRpZmYgLS1naXQgYS9mcy91Ymlmcy94YXR0ci5jIGIvZnMvdWJpZnMveGF0dHIuYwppbmRleCBlMjM3ODExLi4xMWEwMDQxIDEwMDY0NAotLS0gYS9mcy91Ymlmcy94YXR0ci5jCisrKyBiL2ZzL3ViaWZzL3hhdHRyLmMKQEAgLTU3NSw3ICs1NzUsOCBAQAogCWRiZ19nZW4oInhhdHRyICclcycsIGlubyAlbHUgKCclcGQnKSwgYnVmIHNpemUgJXpkIiwgbmFtZSwKIAkJaW5vZGUtPmlfaW5vLCBkZW50cnksIHNpemUpOwogCi0JcmV0dXJuICBfX3ViaWZzX2dldHhhdHRyKGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOworCW5hbWUgPSB4YXR0cl9mdWxsX25hbWUoaGFuZGxlciwgbmFtZSk7CisJcmV0dXJuIF9fdWJpZnNfZ2V0eGF0dHIoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSk7CiB9CiAKIHN0YXRpYyBpbnQgdWJpZnNfeGF0dHJfc2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLApAQCAtNTg2LDYgKzU4Nyw4IEBACiAJZGJnX2dlbigieGF0dHIgJyVzJywgaG9zdCBpbm8gJWx1ICgnJXBkJyksIHNpemUgJXpkIiwKIAkJbmFtZSwgaW5vZGUtPmlfaW5vLCBkZW50cnksIHNpemUpOwogCisJbmFtZSA9IHhhdHRyX2Z1bGxfbmFtZShoYW5kbGVyLCBuYW1lKTsKKwogCWlmICh2YWx1ZSkKIAkJcmV0dXJuIF9fdWJpZnNfc2V0eGF0dHIoaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZnMvdWRmL2ZpbGUuYyBiL2ZzL3VkZi9maWxlLmMKaW5kZXggNjMyNTcwNi4uZTg1NWJmOCAxMDA2NDQKLS0tIGEvZnMvdWRmL2ZpbGUuYworKysgYi9mcy91ZGYvZmlsZS5jCkBAIC05NCw3ICs5NCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCSpwYWdlcCA9IHBhZ2U7CiAKLQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSAmJiBsZW4gIT0gUEFHRV9TSVpFKQorCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKQogCQlfX3VkZl9hZGluaWNiX3JlYWRwYWdlKHBhZ2UpOwogCXJldHVybiAwOwogfQpAQCAtMTA1LDExICsxMDUsMjUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB1ZGZfYWRpbmljYl93cml0ZV9lbmQoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCSBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGNvcGllZCwKKwkJCQkgc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKmZzZGF0YSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlsb2ZmX3QgbGFzdF9wb3MgPSBwb3MgKyBjb3BpZWQ7CisJaWYgKGxhc3RfcG9zID4gaW5vZGUtPmlfc2l6ZSkKKwkJaV9zaXplX3dyaXRlKGlub2RlLCBsYXN0X3Bvcyk7CisJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcHV0X3BhZ2UocGFnZSk7CisJcmV0dXJuIGNvcGllZDsKK30KKwogY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB1ZGZfYWRpbmljYl9hb3BzID0gewogCS5yZWFkcGFnZQk9IHVkZl9hZGluaWNiX3JlYWRwYWdlLAogCS53cml0ZXBhZ2UJPSB1ZGZfYWRpbmljYl93cml0ZXBhZ2UsCiAJLndyaXRlX2JlZ2luCT0gdWRmX2FkaW5pY2Jfd3JpdGVfYmVnaW4sCi0JLndyaXRlX2VuZAk9IHNpbXBsZV93cml0ZV9lbmQsCisJLndyaXRlX2VuZAk9IHVkZl9hZGluaWNiX3dyaXRlX2VuZCwKIAkuZGlyZWN0X0lPCT0gdWRmX2FkaW5pY2JfZGlyZWN0X0lPLAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmggYi9pbmNsdWRlL2FjcGkvYWNjb25maWcuaAppbmRleCBmZTJlM2FjLi4xMmMyODgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNjb25maWcuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNjb25maWcuaApAQCAtMTQ0LDYgKzE0NCwxMCBAQAogCiAjZGVmaW5lIEFDUElfQUREUkVTU19SQU5HRV9NQVggICAgICAgICAgMgogCisvKiBNYXhpbXVtIG51bWJlciBvZiBXaGlsZSgpIGxvb3BzIGJlZm9yZSBhYm9ydCAqLworCisjZGVmaW5lIEFDUElfTUFYX0xPT1BfQ09VTlQgICAgICAgICAgICAgMHhGRkZGCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBBQ1BJIFNwZWNpZmljYXRpb24gY29uc3RhbnRzIChEbyBub3QgY2hhbmdlIHVubGVzcyB0aGUgc3BlY2lmaWNhdGlvbiBjaGFuZ2VzKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2Fjb3V0cHV0LmggYi9pbmNsdWRlL2FjcGkvYWNvdXRwdXQuaAppbmRleCAzNGY2MDFlLi40OGViNGRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNvdXRwdXQuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNvdXRwdXQuaApAQCAtMzY2LDcgKzM2Niw3IEBACiAJQUNQSV9UUkFDRV9FTlRSWSAobmFtZSwgYWNwaV91dF90cmFjZV91MzIsIHUzMiwgdmFsdWUpCiAKICNkZWZpbmUgQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIobmFtZSwgc3RyaW5nKSBcCi0JQUNQSV9UUkFDRV9FTlRSWSAobmFtZSwgYWNwaV91dF90cmFjZV9zdHIsIGNoYXIgKiwgc3RyaW5nKQorCUFDUElfVFJBQ0VfRU5UUlkgKG5hbWUsIGFjcGlfdXRfdHJhY2Vfc3RyLCBjb25zdCBjaGFyICosIHN0cmluZykKIAogI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX0VOVFJZKCkgXAogCWFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKCkKQEAgLTQyNSw2ICs0MjUsOSBAQAogI2RlZmluZSByZXR1cm5fUFRSKHBvaW50ZXIpIFwKIAlBQ1BJX1RSQUNFX0VYSVQgKGFjcGlfdXRfcHRyX2V4aXQsIHZvaWQgKiwgcG9pbnRlcikKIAorI2RlZmluZSByZXR1cm5fU1RSKHN0cmluZykgXAorCUFDUElfVFJBQ0VfRVhJVCAoYWNwaV91dF9zdHJfZXhpdCwgY29uc3QgY2hhciAqLCBzdHJpbmcpCisKICNkZWZpbmUgcmV0dXJuX1ZBTFVFKHZhbHVlKSBcCiAJQUNQSV9UUkFDRV9FWElUIChhY3BpX3V0X3ZhbHVlX2V4aXQsIHU2NCwgdmFsdWUpCiAKQEAgLTQ3OCw2ICs0ODEsNyBAQAogI2RlZmluZSByZXR1cm5fVk9JRCAgICAgICAgICAgICAgICAgICAgIHJldHVybgogI2RlZmluZSByZXR1cm5fQUNQSV9TVEFUVVMocykgICAgICAgICAgIHJldHVybihzKQogI2RlZmluZSByZXR1cm5fUFRSKHMpICAgICAgICAgICAgICAgICAgIHJldHVybihzKQorI2RlZmluZSByZXR1cm5fU1RSKHMpICAgICAgICAgICAgICAgICAgIHJldHVybihzKQogI2RlZmluZSByZXR1cm5fVkFMVUUocykgICAgICAgICAgICAgICAgIHJldHVybihzKQogI2RlZmluZSByZXR1cm5fVUlOVDgocykgICAgICAgICAgICAgICAgIHJldHVybihzKQogI2RlZmluZSByZXR1cm5fVUlOVDMyKHMpICAgICAgICAgICAgICAgIHJldHVybihzKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmggYi9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaAppbmRleCA1NjI2MDNkLi5mMzQxNGM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaApAQCAtMzcxLDYgKzM3MSwxMiBAQAogYWNwaV9zdGF0dXMgYWNwaV9vc19ub3RpZnlfY29tbWFuZF9jb21wbGV0ZSh2b2lkKTsKICNlbmRpZgogCisjaWZuZGVmIEFDUElfVVNFX0FMVEVSTkFURV9QUk9UT1RZUEVfYWNwaV9vc190cmFjZV9wb2ludAordm9pZAorYWNwaV9vc190cmFjZV9wb2ludChhY3BpX3RyYWNlX2V2ZW50X3R5cGUgdHlwZSwKKwkJICAgIHU4IGJlZ2luLCB1OCAqYW1sLCBjaGFyICpwYXRobmFtZSk7CisjZW5kaWYKKwogLyoKICAqIE9idGFpbiBBQ1BJIHRhYmxlKHMpCiAgKi8KQEAgLTQxNiw0MSArNDIyLDQgQEAKIHZvaWQgYWNwaV9vc19jbG9zZV9kaXJlY3Rvcnkodm9pZCAqZGlyX2hhbmRsZSk7CiAjZW5kaWYKIAotLyoKLSAqIEZpbGUgSS9PIGFuZCByZWxhdGVkIHN1cHBvcnQKLSAqLwotI2lmbmRlZiBBQ1BJX1VTRV9BTFRFUk5BVEVfUFJPVE9UWVBFX2FjcGlfb3Nfb3Blbl9maWxlCi1BQ1BJX0ZJTEUgYWNwaV9vc19vcGVuX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgdTggbW9kZXMpOwotI2VuZGlmCi0KLSNpZm5kZWYgQUNQSV9VU0VfQUxURVJOQVRFX1BST1RPVFlQRV9hY3BpX29zX2Nsb3NlX2ZpbGUKLXZvaWQgYWNwaV9vc19jbG9zZV9maWxlKEFDUElfRklMRSBmaWxlKTsKLSNlbmRpZgotCi0jaWZuZGVmIEFDUElfVVNFX0FMVEVSTkFURV9QUk9UT1RZUEVfYWNwaV9vc19yZWFkX2ZpbGUKLWludAotYWNwaV9vc19yZWFkX2ZpbGUoQUNQSV9GSUxFIGZpbGUsCi0JCSAgdm9pZCAqYnVmZmVyLCBhY3BpX3NpemUgc2l6ZSwgYWNwaV9zaXplIGNvdW50KTsKLSNlbmRpZgotCi0jaWZuZGVmIEFDUElfVVNFX0FMVEVSTkFURV9QUk9UT1RZUEVfYWNwaV9vc193cml0ZV9maWxlCi1pbnQKLWFjcGlfb3Nfd3JpdGVfZmlsZShBQ1BJX0ZJTEUgZmlsZSwKLQkJICAgdm9pZCAqYnVmZmVyLCBhY3BpX3NpemUgc2l6ZSwgYWNwaV9zaXplIGNvdW50KTsKLSNlbmRpZgotCi0jaWZuZGVmIEFDUElfVVNFX0FMVEVSTkFURV9QUk9UT1RZUEVfYWNwaV9vc19nZXRfZmlsZV9vZmZzZXQKLWxvbmcgYWNwaV9vc19nZXRfZmlsZV9vZmZzZXQoQUNQSV9GSUxFIGZpbGUpOwotI2VuZGlmCi0KLSNpZm5kZWYgQUNQSV9VU0VfQUxURVJOQVRFX1BST1RPVFlQRV9hY3BpX29zX3NldF9maWxlX29mZnNldAotYWNwaV9zdGF0dXMgYWNwaV9vc19zZXRfZmlsZV9vZmZzZXQoQUNQSV9GSUxFIGZpbGUsIGxvbmcgb2Zmc2V0LCB1OCBmcm9tKTsKLSNlbmRpZgotCi0jaWZuZGVmIEFDUElfVVNFX0FMVEVSTkFURV9QUk9UT1RZUEVfYWNwaV9vc190cmFjZV9wb2ludAotdm9pZAotYWNwaV9vc190cmFjZV9wb2ludChhY3BpX3RyYWNlX2V2ZW50X3R5cGUgdHlwZSwKLQkJICAgIHU4IGJlZ2luLCB1OCAqYW1sLCBjaGFyICpwYXRobmFtZSk7Ci0jZW5kaWYKLQogI2VuZGlmCQkJCS8qIF9fQUNQSU9TWEZfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaXhmLmggYi9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKaW5kZXggMWZmM2E3Ni4uYzdiM2ExMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpeGYuaApAQCAtNDYsNyArNDYsNyBAQAogCiAvKiBDdXJyZW50IEFDUElDQSBzdWJzeXN0ZW0gdmVyc2lvbiBpbiBZWVlZTU1ERCBmb3JtYXQgKi8KIAotI2RlZmluZSBBQ1BJX0NBX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MjAxNjA0MjIKKyNkZWZpbmUgQUNQSV9DQV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDIwMTYwODMxCiAKICNpbmNsdWRlIDxhY3BpL2FjY29uZmlnLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3R5cGVzLmg+CkBAIC0xOTUsNiArMTk1LDEzIEBACiBBQ1BJX0lOSVRfR0xPQkFMKHU4LCBhY3BpX2dibF9ncm91cF9tb2R1bGVfbGV2ZWxfY29kZSwgVFJVRSk7CiAKIC8qCisgKiBPcHRpb25hbGx5IHN1cHBvcnQgbW9kdWxlIGxldmVsIGNvZGUgYnkgcGFyc2luZyB0aGUgZW50aXJlIHRhYmxlIGFzCisgKiBhIHRlcm1fbGlzdC4gRGVmYXVsdCBpcyBGQUxTRSwgZG8gbm90IGV4ZWN1dGUgZW50aXJlIHRhYmxlIHVudGlsIHNvbWUKKyAqIGxvY2sgb3JkZXIgaXNzdWVzIGFyZSBmaXhlZC4KKyAqLworQUNQSV9JTklUX0dMT0JBTCh1OCwgYWNwaV9nYmxfcGFyc2VfdGFibGVfYXNfdGVybV9saXN0LCBGQUxTRSk7CisKKy8qCiAgKiBPcHRpb25hbGx5IHVzZSAzMi1iaXQgRkFEVCBhZGRyZXNzZXMgaWYgYW5kIHdoZW4gdGhlcmUgaXMgYSBjb25mbGljdAogICogKGFkZHJlc3MgbWlzbWF0Y2gpIGJldHdlZW4gdGhlIDMyLWJpdCBhbmQgNjQtYml0IHZlcnNpb25zIG9mIHRoZQogICogYWRkcmVzcy4gQWx0aG91Z2ggQUNQSUNBIGFkaGVyZXMgdG8gdGhlIEFDUEkgc3BlY2lmaWNhdGlvbiB3aGljaApAQCAtNDE2LDE4ICs0MjMsMTkgQEAKIC8qCiAgKiBJbml0aWFsaXphdGlvbgogICovCi1BQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgX19pbml0CitBQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OCiAJCQkgICAgYWNwaV9pbml0aWFsaXplX3RhYmxlcyhzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjCiAJCQkJCQkgICAqaW5pdGlhbF9zdG9yYWdlLAogCQkJCQkJICAgdTMyIGluaXRpYWxfdGFibGVfY291bnQsCiAJCQkJCQkgICB1OCBhbGxvd19yZXNpemUpKQotQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIF9faW5pdCBhY3BpX2luaXRpYWxpemVfc3Vic3lzdGVtKHZvaWQpKQotCi1BQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfZW5hYmxlX3N1YnN5c3RlbSh1MzIgZmxhZ3MpKQotCi1BQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgX19pbml0Ci0JCQkgICAgYWNwaV9pbml0aWFsaXplX29iamVjdHModTMyIGZsYWdzKSkKLUFDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBfX2luaXQgYWNwaV90ZXJtaW5hdGUodm9pZCkpCitBQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OCisJCQkgICAgIGFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0odm9pZCkpCitBQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OCisJCQkgICAgIGFjcGlfZW5hYmxlX3N1YnN5c3RlbSh1MzIgZmxhZ3MpKQorQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTgorCQkJICAgICBhY3BpX2luaXRpYWxpemVfb2JqZWN0cyh1MzIgZmxhZ3MpKQorQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTgorCQkJICAgICBhY3BpX3Rlcm1pbmF0ZSh2b2lkKSkKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgZ2xvYmFsIGludGVyZmFjZXMKQEAgLTQ2Nyw3ICs0NzUsNyBAQAogLyoKICAqIEFDUEkgdGFibGUgbG9hZC91bmxvYWQgaW50ZXJmYWNlcwogICovCi1BQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgX19pbml0CitBQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OCiAJCQkgICAgYWNwaV9pbnN0YWxsX3RhYmxlKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAogCQkJCQkgICAgICAgdTggcGh5c2ljYWwpKQogCkBAIC00NzYsMTQgKzQ4NCwxNyBAQAogCiBBQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMKIAkJCSAgICBhY3BpX3VubG9hZF9wYXJlbnRfdGFibGUoYWNwaV9oYW5kbGUgb2JqZWN0KSkKLUFDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBfX2luaXQgYWNwaV9sb2FkX3RhYmxlcyh2b2lkKSkKKworQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTgorCQkJICAgIGFjcGlfbG9hZF90YWJsZXModm9pZCkpCiAKIC8qCiAgKiBBQ1BJIHRhYmxlIG1hbmlwdWxhdGlvbiBpbnRlcmZhY2VzCiAgKi8KLUFDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBfX2luaXQgYWNwaV9yZWFsbG9jYXRlX3Jvb3RfdGFibGUodm9pZCkpCitBQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OCisJCQkgICAgYWNwaV9yZWFsbG9jYXRlX3Jvb3RfdGFibGUodm9pZCkpCiAKLUFDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBfX2luaXQKK0FDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBBQ1BJX0lOSVRfRlVOQ1RJT04KIAkJCSAgICBhY3BpX2ZpbmRfcm9vdF9wb2ludGVyKGFjcGlfcGh5c2ljYWxfYWRkcmVzcwogCQkJCQkJICAgKnJzZHBfYWRkcmVzcykpCiBBQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMKQEAgLTczMiw2ICs3NDMsMTAgQEAKIAkJCQkJCXUzMiBncGVfbnVtYmVyKSkKIAogQUNQSV9IV19ERVBFTkRFTlRfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cworCQkJCWFjcGlfbWFza19ncGUoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKKwkJCQkJICAgICAgdTMyIGdwZV9udW1iZXIsIHU4IGlzX21hc2tlZCkpCisKK0FDUElfSFdfREVQRU5ERU5UX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMKIAkJCQlhY3BpX21hcmtfZ3BlX2Zvcl93YWtlKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsCiAJCQkJCQkgICAgICAgdTMyIGdwZV9udW1iZXIpKQogCkBAIC05MzUsOSArOTUwLDYgQEAKIAkJCSAgICAgICBhY3BpX3RyYWNlX3BvaW50KGFjcGlfdHJhY2VfZXZlbnRfdHlwZSB0eXBlLAogCQkJCQkJdTggYmVnaW4sCiAJCQkJCQl1OCAqYW1sLCBjaGFyICpwYXRobmFtZSkpCi1BQ1BJX0FQUF9ERVBFTkRFTlRfUkVUVVJOX1ZPSUQoQUNQSV9QUklOVEZfTElLRSgxKQotCQkJCXZvaWQgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKLQkJCQlhY3BpX2xvZ19lcnJvcihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpCiAKIGFjcGlfc3RhdHVzIGFjcGlfaW5pdGlhbGl6ZV9kZWJ1Z2dlcih2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdGJsLmggYi9pbmNsdWRlL2FjcGkvYWN0YmwuaAppbmRleCBjMTk3MDBlLi4xYjk0OWUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN0YmwuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0YmwuaApAQCAtMjMwLDYyICsyMzAsNzIgQEAKIC8qIEZpZWxkcyBjb21tb24gdG8gYWxsIHZlcnNpb25zIG9mIHRoZSBGQURUICovCiAKIHN0cnVjdCBhY3BpX3RhYmxlX2ZhZHQgewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7CS8qIENvbW1vbiBBQ1BJIHRhYmxlIGhlYWRlciAqLwotCXUzMiBmYWNzOwkJLyogMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRkFDUyAqLwotCXUzMiBkc2R0OwkJLyogMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRFNEVCAqLwotCXU4IG1vZGVsOwkJLyogU3lzdGVtIEludGVycnVwdCBNb2RlbCAoQUNQSSAxLjApIC0gbm90IHVzZWQgaW4gQUNQSSAyLjArICovCi0JdTggcHJlZmVycmVkX3Byb2ZpbGU7CS8qIENvbnZleXMgcHJlZmVycmVkIHBvd2VyIG1hbmFnZW1lbnQgcHJvZmlsZSB0byBPU1BNLiAqLwotCXUxNiBzY2lfaW50ZXJydXB0OwkvKiBTeXN0ZW0gdmVjdG9yIG9mIFNDSSBpbnRlcnJ1cHQgKi8KLQl1MzIgc21pX2NvbW1hbmQ7CS8qIDMyLWJpdCBQb3J0IGFkZHJlc3Mgb2YgU01JIGNvbW1hbmQgcG9ydCAqLwotCXU4IGFjcGlfZW5hYmxlOwkJLyogVmFsdWUgdG8gd3JpdGUgdG8gU01JX0NNRCB0byBlbmFibGUgQUNQSSAqLwotCXU4IGFjcGlfZGlzYWJsZTsJLyogVmFsdWUgdG8gd3JpdGUgdG8gU01JX0NNRCB0byBkaXNhYmxlIEFDUEkgKi8KLQl1OCBzNF9iaW9zX3JlcXVlc3Q7CS8qIFZhbHVlIHRvIHdyaXRlIHRvIFNNSV9DTUQgdG8gZW50ZXIgUzRCSU9TIHN0YXRlICovCi0JdTggcHN0YXRlX2NvbnRyb2w7CS8qIFByb2Nlc3NvciBwZXJmb3JtYW5jZSBzdGF0ZSBjb250cm9sICovCi0JdTMyIHBtMWFfZXZlbnRfYmxvY2s7CS8qIDMyLWJpdCBwb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFhIEV2ZW50IFJlZyBCbGsgKi8KLQl1MzIgcG0xYl9ldmVudF9ibG9jazsJLyogMzItYml0IHBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWIgRXZlbnQgUmVnIEJsayAqLwotCXUzMiBwbTFhX2NvbnRyb2xfYmxvY2s7CS8qIDMyLWJpdCBwb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFhIENvbnRyb2wgUmVnIEJsayAqLwotCXUzMiBwbTFiX2NvbnRyb2xfYmxvY2s7CS8qIDMyLWJpdCBwb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFiIENvbnRyb2wgUmVnIEJsayAqLwotCXUzMiBwbTJfY29udHJvbF9ibG9jazsJLyogMzItYml0IHBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMiBDb250cm9sIFJlZyBCbGsgKi8KLQl1MzIgcG1fdGltZXJfYmxvY2s7CS8qIDMyLWJpdCBwb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IFRpbWVyIEN0cmwgUmVnIEJsayAqLwotCXUzMiBncGUwX2Jsb2NrOwkJLyogMzItYml0IHBvcnQgYWRkcmVzcyBvZiBHZW5lcmFsIFB1cnBvc2UgRXZlbnQgMCBSZWcgQmxrICovCi0JdTMyIGdwZTFfYmxvY2s7CQkvKiAzMi1iaXQgcG9ydCBhZGRyZXNzIG9mIEdlbmVyYWwgUHVycG9zZSBFdmVudCAxIFJlZyBCbGsgKi8KLQl1OCBwbTFfZXZlbnRfbGVuZ3RoOwkvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbTF4X2V2ZW50X2Jsb2NrICovCi0JdTggcG0xX2NvbnRyb2xfbGVuZ3RoOwkvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbTF4X2NvbnRyb2xfYmxvY2sgKi8KLQl1OCBwbTJfY29udHJvbF9sZW5ndGg7CS8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtMl9jb250cm9sX2Jsb2NrICovCi0JdTggcG1fdGltZXJfbGVuZ3RoOwkvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbV90aW1lcl9ibG9jayAqLwotCXU4IGdwZTBfYmxvY2tfbGVuZ3RoOwkvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBncGUwX2Jsb2NrICovCi0JdTggZ3BlMV9ibG9ja19sZW5ndGg7CS8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IGdwZTFfYmxvY2sgKi8KLQl1OCBncGUxX2Jhc2U7CQkvKiBPZmZzZXQgaW4gR1BFIG51bWJlciBzcGFjZSB3aGVyZSBHUEUxIGV2ZW50cyBzdGFydCAqLwotCXU4IGNzdF9jb250cm9sOwkJLyogU3VwcG9ydCBmb3IgdGhlIF9DU1Qgb2JqZWN0IGFuZCBDLVN0YXRlcyBjaGFuZ2Ugbm90aWZpY2F0aW9uICovCi0JdTE2IGMyX2xhdGVuY3k7CQkvKiBXb3JzdCBjYXNlIEhXIGxhdGVuY3kgdG8gZW50ZXIvZXhpdCBDMiBzdGF0ZSAqLwotCXUxNiBjM19sYXRlbmN5OwkJLyogV29yc3QgY2FzZSBIVyBsYXRlbmN5IHRvIGVudGVyL2V4aXQgQzMgc3RhdGUgKi8KLQl1MTYgZmx1c2hfc2l6ZTsJCS8qIFByb2Nlc3NvciBtZW1vcnkgY2FjaGUgbGluZSB3aWR0aCwgaW4gYnl0ZXMgKi8KLQl1MTYgZmx1c2hfc3RyaWRlOwkvKiBOdW1iZXIgb2YgZmx1c2ggc3RyaWRlcyB0aGF0IG5lZWQgdG8gYmUgcmVhZCAqLwotCXU4IGR1dHlfb2Zmc2V0OwkJLyogUHJvY2Vzc29yIGR1dHkgY3ljbGUgaW5kZXggaW4gcHJvY2Vzc29yIFBfQ05UIHJlZyAqLwotCXU4IGR1dHlfd2lkdGg7CQkvKiBQcm9jZXNzb3IgZHV0eSBjeWNsZSB2YWx1ZSBiaXQgd2lkdGggaW4gUF9DTlQgcmVnaXN0ZXIgKi8KLQl1OCBkYXlfYWxhcm07CQkvKiBJbmRleCB0byBkYXktb2YtbW9udGggYWxhcm0gaW4gUlRDIENNT1MgUkFNICovCi0JdTggbW9udGhfYWxhcm07CQkvKiBJbmRleCB0byBtb250aC1vZi15ZWFyIGFsYXJtIGluIFJUQyBDTU9TIFJBTSAqLwotCXU4IGNlbnR1cnk7CQkvKiBJbmRleCB0byBjZW50dXJ5IGluIFJUQyBDTU9TIFJBTSAqLwotCXUxNiBib290X2ZsYWdzOwkJLyogSUEtUEMgQm9vdCBBcmNoaXRlY3R1cmUgRmxhZ3MgKHNlZSBiZWxvdyBmb3IgaW5kaXZpZHVhbCBmbGFncykgKi8KLQl1OCByZXNlcnZlZDsJCS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KLQl1MzIgZmxhZ3M7CQkvKiBNaXNjZWxsYW5lb3VzIGZsYWcgYml0cyAoc2VlIGJlbG93IGZvciBpbmRpdmlkdWFsIGZsYWdzKSAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyByZXNldF9yZWdpc3RlcjsJLyogNjQtYml0IGFkZHJlc3Mgb2YgdGhlIFJlc2V0IHJlZ2lzdGVyICovCi0JdTggcmVzZXRfdmFsdWU7CQkvKiBWYWx1ZSB0byB3cml0ZSB0byB0aGUgcmVzZXRfcmVnaXN0ZXIgcG9ydCB0byByZXNldCB0aGUgc3lzdGVtICovCi0JdTE2IGFybV9ib290X2ZsYWdzOwkvKiBBUk0tU3BlY2lmaWMgQm9vdCBGbGFncyAoc2VlIGJlbG93IGZvciBpbmRpdmlkdWFsIGZsYWdzKSAoQUNQSSA1LjEpICovCi0JdTggbWlub3JfcmV2aXNpb247CS8qIEZBRFQgTWlub3IgUmV2aXNpb24gKEFDUEkgNS4xKSAqLwotCXU2NCBYZmFjczsJCS8qIDY0LWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIEZBQ1MgKi8KLQl1NjQgWGRzZHQ7CQkvKiA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBEU0RUICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTFhX2V2ZW50X2Jsb2NrOwkvKiA2NC1iaXQgRXh0ZW5kZWQgUG93ZXIgTWd0IDFhIEV2ZW50IFJlZyBCbGsgYWRkcmVzcyAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0xYl9ldmVudF9ibG9jazsJLyogNjQtYml0IEV4dGVuZGVkIFBvd2VyIE1ndCAxYiBFdmVudCBSZWcgQmxrIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMWFfY29udHJvbF9ibG9jazsJLyogNjQtYml0IEV4dGVuZGVkIFBvd2VyIE1ndCAxYSBDb250cm9sIFJlZyBCbGsgYWRkcmVzcyAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0xYl9jb250cm9sX2Jsb2NrOwkvKiA2NC1iaXQgRXh0ZW5kZWQgUG93ZXIgTWd0IDFiIENvbnRyb2wgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTJfY29udHJvbF9ibG9jazsJLyogNjQtYml0IEV4dGVuZGVkIFBvd2VyIE1ndCAyIENvbnRyb2wgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbV90aW1lcl9ibG9jazsJLyogNjQtYml0IEV4dGVuZGVkIFBvd2VyIE1ndCBUaW1lciBDdHJsIFJlZyBCbGsgYWRkcmVzcyAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4Z3BlMF9ibG9jazsJLyogNjQtYml0IEV4dGVuZGVkIEdlbmVyYWwgUHVycG9zZSBFdmVudCAwIFJlZyBCbGsgYWRkcmVzcyAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4Z3BlMV9ibG9jazsJLyogNjQtYml0IEV4dGVuZGVkIEdlbmVyYWwgUHVycG9zZSBFdmVudCAxIFJlZyBCbGsgYWRkcmVzcyAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBzbGVlcF9jb250cm9sOwkvKiA2NC1iaXQgU2xlZXAgQ29udHJvbCByZWdpc3RlciAoQUNQSSA1LjApICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHNsZWVwX3N0YXR1czsJLyogNjQtYml0IFNsZWVwIFN0YXR1cyByZWdpc3RlciAoQUNQSSA1LjApICovCi0JdTY0IGh5cGVydmlzb3JfaWQ7CS8qIEh5cGVydmlzb3IgVmVuZG9yIElEIChBQ1BJIDYuMCkgKi8KKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwkvKiBbVjFdIENvbW1vbiBBQ1BJIHRhYmxlIGhlYWRlciAqLworCXUzMiBmYWNzOwkJLyogW1YxXSAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBGQUNTICovCisJdTMyIGRzZHQ7CQkvKiBbVjFdIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIERTRFQgKi8KKwl1OCBtb2RlbDsJCS8qIFtWMV0gU3lzdGVtIEludGVycnVwdCBNb2RlbCAoQUNQSSAxLjApIC0gbm90IHVzZWQgaW4gQUNQSSAyLjArICovCisJdTggcHJlZmVycmVkX3Byb2ZpbGU7CS8qIFtWMV0gQ29udmV5cyBwcmVmZXJyZWQgcG93ZXIgbWFuYWdlbWVudCBwcm9maWxlIHRvIE9TUE0uICovCisJdTE2IHNjaV9pbnRlcnJ1cHQ7CS8qIFtWMV0gU3lzdGVtIHZlY3RvciBvZiBTQ0kgaW50ZXJydXB0ICovCisJdTMyIHNtaV9jb21tYW5kOwkvKiBbVjFdIDMyLWJpdCBQb3J0IGFkZHJlc3Mgb2YgU01JIGNvbW1hbmQgcG9ydCAqLworCXU4IGFjcGlfZW5hYmxlOwkJLyogW1YxXSBWYWx1ZSB0byB3cml0ZSB0byBTTUlfQ01EIHRvIGVuYWJsZSBBQ1BJICovCisJdTggYWNwaV9kaXNhYmxlOwkvKiBbVjFdIFZhbHVlIHRvIHdyaXRlIHRvIFNNSV9DTUQgdG8gZGlzYWJsZSBBQ1BJICovCisJdTggczRfYmlvc19yZXF1ZXN0OwkvKiBbVjFdIFZhbHVlIHRvIHdyaXRlIHRvIFNNSV9DTUQgdG8gZW50ZXIgUzRCSU9TIHN0YXRlICovCisJdTggcHN0YXRlX2NvbnRyb2w7CS8qIFtWMV0gUHJvY2Vzc29yIHBlcmZvcm1hbmNlIHN0YXRlIGNvbnRyb2wgKi8KKwl1MzIgcG0xYV9ldmVudF9ibG9jazsJLyogW1YxXSAzMi1iaXQgcG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYSBFdmVudCBSZWcgQmxrICovCisJdTMyIHBtMWJfZXZlbnRfYmxvY2s7CS8qIFtWMV0gMzItYml0IHBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWIgRXZlbnQgUmVnIEJsayAqLworCXUzMiBwbTFhX2NvbnRyb2xfYmxvY2s7CS8qIFtWMV0gMzItYml0IHBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWEgQ29udHJvbCBSZWcgQmxrICovCisJdTMyIHBtMWJfY29udHJvbF9ibG9jazsJLyogW1YxXSAzMi1iaXQgcG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYiBDb250cm9sIFJlZyBCbGsgKi8KKwl1MzIgcG0yX2NvbnRyb2xfYmxvY2s7CS8qIFtWMV0gMzItYml0IHBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMiBDb250cm9sIFJlZyBCbGsgKi8KKwl1MzIgcG1fdGltZXJfYmxvY2s7CS8qIFtWMV0gMzItYml0IHBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgVGltZXIgQ3RybCBSZWcgQmxrICovCisJdTMyIGdwZTBfYmxvY2s7CQkvKiBbVjFdIDMyLWJpdCBwb3J0IGFkZHJlc3Mgb2YgR2VuZXJhbCBQdXJwb3NlIEV2ZW50IDAgUmVnIEJsayAqLworCXUzMiBncGUxX2Jsb2NrOwkJLyogW1YxXSAzMi1iaXQgcG9ydCBhZGRyZXNzIG9mIEdlbmVyYWwgUHVycG9zZSBFdmVudCAxIFJlZyBCbGsgKi8KKwl1OCBwbTFfZXZlbnRfbGVuZ3RoOwkvKiBbVjFdIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtMXhfZXZlbnRfYmxvY2sgKi8KKwl1OCBwbTFfY29udHJvbF9sZW5ndGg7CS8qIFtWMV0gQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG0xeF9jb250cm9sX2Jsb2NrICovCisJdTggcG0yX2NvbnRyb2xfbGVuZ3RoOwkvKiBbVjFdIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtMl9jb250cm9sX2Jsb2NrICovCisJdTggcG1fdGltZXJfbGVuZ3RoOwkvKiBbVjFdIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtX3RpbWVyX2Jsb2NrICovCisJdTggZ3BlMF9ibG9ja19sZW5ndGg7CS8qIFtWMV0gQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgZ3BlMF9ibG9jayAqLworCXU4IGdwZTFfYmxvY2tfbGVuZ3RoOwkvKiBbVjFdIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IGdwZTFfYmxvY2sgKi8KKwl1OCBncGUxX2Jhc2U7CQkvKiBbVjFdIE9mZnNldCBpbiBHUEUgbnVtYmVyIHNwYWNlIHdoZXJlIEdQRTEgZXZlbnRzIHN0YXJ0ICovCisJdTggY3N0X2NvbnRyb2w7CQkvKiBbVjFdIFN1cHBvcnQgZm9yIHRoZSBfQ1NUIG9iamVjdCBhbmQgQy1TdGF0ZXMgY2hhbmdlIG5vdGlmaWNhdGlvbiAqLworCXUxNiBjMl9sYXRlbmN5OwkJLyogW1YxXSBXb3JzdCBjYXNlIEhXIGxhdGVuY3kgdG8gZW50ZXIvZXhpdCBDMiBzdGF0ZSAqLworCXUxNiBjM19sYXRlbmN5OwkJLyogW1YxXSBXb3JzdCBjYXNlIEhXIGxhdGVuY3kgdG8gZW50ZXIvZXhpdCBDMyBzdGF0ZSAqLworCXUxNiBmbHVzaF9zaXplOwkJLyogW1YxXSBQcm9jZXNzb3IgbWVtb3J5IGNhY2hlIGxpbmUgd2lkdGgsIGluIGJ5dGVzICovCisJdTE2IGZsdXNoX3N0cmlkZTsJLyogW1YxXSBOdW1iZXIgb2YgZmx1c2ggc3RyaWRlcyB0aGF0IG5lZWQgdG8gYmUgcmVhZCAqLworCXU4IGR1dHlfb2Zmc2V0OwkJLyogW1YxXSBQcm9jZXNzb3IgZHV0eSBjeWNsZSBpbmRleCBpbiBwcm9jZXNzb3IgUF9DTlQgcmVnICovCisJdTggZHV0eV93aWR0aDsJCS8qIFtWMV0gUHJvY2Vzc29yIGR1dHkgY3ljbGUgdmFsdWUgYml0IHdpZHRoIGluIFBfQ05UIHJlZ2lzdGVyICovCisJdTggZGF5X2FsYXJtOwkJLyogW1YxXSBJbmRleCB0byBkYXktb2YtbW9udGggYWxhcm0gaW4gUlRDIENNT1MgUkFNICovCisJdTggbW9udGhfYWxhcm07CQkvKiBbVjFdIEluZGV4IHRvIG1vbnRoLW9mLXllYXIgYWxhcm0gaW4gUlRDIENNT1MgUkFNICovCisJdTggY2VudHVyeTsJCS8qIFtWMV0gSW5kZXggdG8gY2VudHVyeSBpbiBSVEMgQ01PUyBSQU0gKi8KKwl1MTYgYm9vdF9mbGFnczsJCS8qIFtWM10gSUEtUEMgQm9vdCBBcmNoaXRlY3R1cmUgRmxhZ3MgKHNlZSBiZWxvdyBmb3IgaW5kaXZpZHVhbCBmbGFncykgKi8KKwl1OCByZXNlcnZlZDsJCS8qIFtWMV0gUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCXUzMiBmbGFnczsJCS8qIFtWMV0gTWlzY2VsbGFuZW91cyBmbGFnIGJpdHMgKHNlZSBiZWxvdyBmb3IgaW5kaXZpZHVhbCBmbGFncykgKi8KKwkvKiBFbmQgb2YgVmVyc2lvbiAxIEZBRFQgZmllbGRzIChBQ1BJIDEuMCkgKi8KKworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyByZXNldF9yZWdpc3RlcjsJLyogW1YzXSA2NC1iaXQgYWRkcmVzcyBvZiB0aGUgUmVzZXQgcmVnaXN0ZXIgKi8KKwl1OCByZXNldF92YWx1ZTsJCS8qIFtWM10gVmFsdWUgdG8gd3JpdGUgdG8gdGhlIHJlc2V0X3JlZ2lzdGVyIHBvcnQgdG8gcmVzZXQgdGhlIHN5c3RlbSAqLworCXUxNiBhcm1fYm9vdF9mbGFnczsJLyogW1Y1XSBBUk0tU3BlY2lmaWMgQm9vdCBGbGFncyAoc2VlIGJlbG93IGZvciBpbmRpdmlkdWFsIGZsYWdzKSAoQUNQSSA1LjEpICovCisJdTggbWlub3JfcmV2aXNpb247CS8qIFtWNV0gRkFEVCBNaW5vciBSZXZpc2lvbiAoQUNQSSA1LjEpICovCisJdTY0IFhmYWNzOwkJLyogW1YzXSA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBGQUNTICovCisJdTY0IFhkc2R0OwkJLyogW1YzXSA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBEU0RUICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTFhX2V2ZW50X2Jsb2NrOwkvKiBbVjNdIDY0LWJpdCBFeHRlbmRlZCBQb3dlciBNZ3QgMWEgRXZlbnQgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTFiX2V2ZW50X2Jsb2NrOwkvKiBbVjNdIDY0LWJpdCBFeHRlbmRlZCBQb3dlciBNZ3QgMWIgRXZlbnQgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTFhX2NvbnRyb2xfYmxvY2s7CS8qIFtWM10gNjQtYml0IEV4dGVuZGVkIFBvd2VyIE1ndCAxYSBDb250cm9sIFJlZyBCbGsgYWRkcmVzcyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0xYl9jb250cm9sX2Jsb2NrOwkvKiBbVjNdIDY0LWJpdCBFeHRlbmRlZCBQb3dlciBNZ3QgMWIgQ29udHJvbCBSZWcgQmxrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMl9jb250cm9sX2Jsb2NrOwkvKiBbVjNdIDY0LWJpdCBFeHRlbmRlZCBQb3dlciBNZ3QgMiBDb250cm9sIFJlZyBCbGsgYWRkcmVzcyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG1fdGltZXJfYmxvY2s7CS8qIFtWM10gNjQtYml0IEV4dGVuZGVkIFBvd2VyIE1ndCBUaW1lciBDdHJsIFJlZyBCbGsgYWRkcmVzcyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4Z3BlMF9ibG9jazsJLyogW1YzXSA2NC1iaXQgRXh0ZW5kZWQgR2VuZXJhbCBQdXJwb3NlIEV2ZW50IDAgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhncGUxX2Jsb2NrOwkvKiBbVjNdIDY0LWJpdCBFeHRlbmRlZCBHZW5lcmFsIFB1cnBvc2UgRXZlbnQgMSBSZWcgQmxrIGFkZHJlc3MgKi8KKwkvKiBFbmQgb2YgVmVyc2lvbiAzIEZBRFQgZmllbGRzIChBQ1BJIDIuMCkgKi8KKworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBzbGVlcF9jb250cm9sOwkvKiBbVjRdIDY0LWJpdCBTbGVlcCBDb250cm9sIHJlZ2lzdGVyIChBQ1BJIDUuMCkgKi8KKwkvKiBFbmQgb2YgVmVyc2lvbiA0IEZBRFQgZmllbGRzIChBQ1BJIDMuMCBhbmQgQUNQSSA0LjApIChGaWVsZCB3YXMgb3JpZ2luYWxseSByZXNlcnZlZCBpbiBBQ1BJIDMuMCkgKi8KKworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBzbGVlcF9zdGF0dXM7CS8qIFtWNV0gNjQtYml0IFNsZWVwIFN0YXR1cyByZWdpc3RlciAoQUNQSSA1LjApICovCisJLyogRW5kIG9mIFZlcnNpb24gNSBGQURUIGZpZWxkcyAoQUNQSSA1LjApICovCisKKwl1NjQgaHlwZXJ2aXNvcl9pZDsJLyogW1Y2XSBIeXBlcnZpc29yIFZlbmRvciBJRCAoQUNQSSA2LjApICovCisJLyogRW5kIG9mIFZlcnNpb24gNiBGQURUIGZpZWxkcyAoQUNQSSA2LjApICovCisKIH07CiAKIC8qIE1hc2tzIGZvciBGQURUIElBLVBDIEJvb3QgQXJjaGl0ZWN0dXJlIEZsYWdzIChib290X2ZsYWdzKSBbVnhdPUludHJvZHVjZWQgaW4gdGhpcyBGQURUIHJldmlzaW9uICovCkBAIC0zMDEsOCArMzExLDggQEAKIAogLyogTWFza3MgZm9yIEZBRFQgQVJNIEJvb3QgQXJjaGl0ZWN0dXJlIEZsYWdzIChhcm1fYm9vdF9mbGFncykgQUNQSSA1LjEgKi8KIAotI2RlZmluZSBBQ1BJX0ZBRFRfUFNDSV9DT01QTElBTlQgICAgKDEpCS8qIDAwOiBbVjUrXSBQU0NJIDAuMisgaXMgaW1wbGVtZW50ZWQgKi8KLSNkZWZpbmUgQUNQSV9GQURUX1BTQ0lfVVNFX0hWQyAgICAgICgxPDwxKQkvKiAwMTogW1Y1K10gSFZDIG11c3QgYmUgdXNlZCBpbnN0ZWFkIG9mIFNNQyBhcyB0aGUgUFNDSSBjb25kdWl0ICovCisjZGVmaW5lIEFDUElfRkFEVF9QU0NJX0NPTVBMSUFOVCAgICAoMSkJLyogMDA6IFtWNV0gUFNDSSAwLjIrIGlzIGltcGxlbWVudGVkICovCisjZGVmaW5lIEFDUElfRkFEVF9QU0NJX1VTRV9IVkMgICAgICAoMTw8MSkJLyogMDE6IFtWNV0gSFZDIG11c3QgYmUgdXNlZCBpbnN0ZWFkIG9mIFNNQyBhcyB0aGUgUFNDSSBjb25kdWl0ICovCiAKIC8qIE1hc2tzIGZvciBGQURUIGZsYWdzICovCiAKQEAgLTM5OSwyMCArNDA5LDM0IEBACiAgKiBtYXRjaCB0aGUgZXhwZWN0ZWQgbGVuZ3RoLiBJbiBvdGhlciB3b3JkcywgdGhlIGxlbmd0aCBvZiB0aGUKICAqIEZBRFQgaXMgdGhlIGJvdHRvbSBsaW5lIGFzIHRvIHdoYXQgdGhlIHZlcnNpb24gcmVhbGx5IGlzLgogICoKLSAqIEZvciByZWZlcmVuY2UsIHRoZSB2YWx1ZXMgYmVsb3cgYXJlIGFzIGZvbGxvd3M6Ci0gKiAgICAgRkFEVCBWMSBzaXplOiAweDA3NAotICogICAgIEZBRFQgVjIgc2l6ZTogMHgwODQKLSAqICAgICBGQURUIFYzIHNpemU6IDB4MEY0Ci0gKiAgICAgRkFEVCBWNCBzaXplOiAweDBGNAotICogICAgIEZBRFQgVjUgc2l6ZTogMHgxMEMKLSAqICAgICBGQURUIFY2IHNpemU6IDB4MTE0CisgKiBOT1RFOiBUaGVyZSBpcyBubyBvZmZpY2lhbHkgcmVsZWFzZWQgVjIgb2YgdGhlIEZBRFQuIFRoaXMKKyAqIHZlcnNpb24gd2FzIHVzZWQgb25seSBmb3IgcHJvdG90eXBpbmcgYW5kIHRlc3RpbmcgZHVyaW5nIHRoZQorICogMzItYml0IHRvIDY0LWJpdCB0cmFuc2l0aW9uLiBWMyB3YXMgdGhlIGZpcnN0IG9mZmljaWFsIDY0LWJpdAorICogdmVyc2lvbiBvZiB0aGUgRkFEVC4KKyAqCisgKiBVcGRhdGUgdGhpcyBsaXN0IG9mIGRlZmluZXMgd2hlbiBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBGQURUIGlzCisgKiBhZGRlZCB0byB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLiBOb3RlIHRoYXQgdGhlIEZBRFQgdmVyc2lvbiBpcworICogb25seSBpbmNyZW1lbnRlZCB3aGVuIG5ldyBmaWVsZHMgYXJlIGFwcGVuZGVkIHRvIHRoZSBleGlzdGluZworICogdmVyc2lvbi4gVGhlcmVmb3JlLCB0aGUgRkFEVCB2ZXJzaW9uIGlzIGNvbXBldGVseSBpbmRlcGVuZGVudAorICogZnJvbSB0aGUgdmVyc2lvbiBvZiB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uIHdoZXJlIGl0IGlzCisgKiBkZWZpbmVkLgorICoKKyAqIEZvciByZWZlcmVuY2UsIHRoZSB2YXJpb3VzIEZBRFQgbGVuZ3RocyBhcmUgYXMgZm9sbG93czoKKyAqICAgICBGQURUIFYxIHNpemU6IDB4MDc0ICAgICAgQUNQSSAxLjAKKyAqICAgICBGQURUIFYzIHNpemU6IDB4MEY0ICAgICAgQUNQSSAyLjAKKyAqICAgICBGQURUIFY0IHNpemU6IDB4MTAwICAgICAgQUNQSSAzLjAgYW5kIEFDUEkgNC4wCisgKiAgICAgRkFEVCBWNSBzaXplOiAweDEwQyAgICAgIEFDUEkgNS4wCisgKiAgICAgRkFEVCBWNiBzaXplOiAweDExNCAgICAgIEFDUEkgNi4wCiAgKi8KLSNkZWZpbmUgQUNQSV9GQURUX1YxX1NJWkUgICAgICAgKHUzMikgKEFDUElfRkFEVF9PRkZTRVQgKGZsYWdzKSArIDQpCi0jZGVmaW5lIEFDUElfRkFEVF9WMl9TSVpFICAgICAgICh1MzIpIChBQ1BJX0ZBRFRfT0ZGU0VUIChtaW5vcl9yZXZpc2lvbikgKyAxKQotI2RlZmluZSBBQ1BJX0ZBRFRfVjNfU0laRSAgICAgICAodTMyKSAoQUNQSV9GQURUX09GRlNFVCAoc2xlZXBfY29udHJvbCkpCi0jZGVmaW5lIEFDUElfRkFEVF9WNV9TSVpFICAgICAgICh1MzIpIChBQ1BJX0ZBRFRfT0ZGU0VUIChoeXBlcnZpc29yX2lkKSkKLSNkZWZpbmUgQUNQSV9GQURUX1Y2X1NJWkUgICAgICAgKHUzMikgKHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfZmFkdCkpCisjZGVmaW5lIEFDUElfRkFEVF9WMV9TSVpFICAgICAgICh1MzIpIChBQ1BJX0ZBRFRfT0ZGU0VUIChmbGFncykgKyA0KQkvKiBBQ1BJIDEuMCAqLworI2RlZmluZSBBQ1BJX0ZBRFRfVjNfU0laRSAgICAgICAodTMyKSAoQUNQSV9GQURUX09GRlNFVCAoc2xlZXBfY29udHJvbCkpCS8qIEFDUEkgMi4wICovCisjZGVmaW5lIEFDUElfRkFEVF9WNF9TSVpFICAgICAgICh1MzIpIChBQ1BJX0ZBRFRfT0ZGU0VUIChzbGVlcF9zdGF0dXMpKQkvKiBBQ1BJIDMuMCBhbmQgQUNQSSA0LjAgKi8KKyNkZWZpbmUgQUNQSV9GQURUX1Y1X1NJWkUgICAgICAgKHUzMikgKEFDUElfRkFEVF9PRkZTRVQgKGh5cGVydmlzb3JfaWQpKQkvKiBBQ1BJIDUuMCAqLworI2RlZmluZSBBQ1BJX0ZBRFRfVjZfU0laRSAgICAgICAodTMyKSAoc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9mYWR0KSkJLyogQUNQSSA2LjAgKi8KIAorLyogVXBkYXRlIHRoZXNlIHdoZW4gbmV3IEZBRFQgdmVyc2lvbnMgYXJlIGFkZGVkICovCisKKyNkZWZpbmUgQUNQSV9GQURUX01BWF9WRVJTSU9OICAgNgogI2RlZmluZSBBQ1BJX0ZBRFRfQ09ORk9STUFOQ0UgICAiQUNQSSA2LjEgKEZBRFQgdmVyc2lvbiA2KSIKIAogI2VuZGlmCQkJCS8qIF9fQUNUQkxfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oIGIvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaAppbmRleCBjYjM4OWVmLi4xZDc5OGFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKQEAgLTczMiwxNiArNzMyLDE3IEBACiAgKiBUaGUgZW5jb2Rpbmcgb2YgYWNwaV9ldmVudF9zdGF0dXMgaXMgaWxsdXN0cmF0ZWQgYmVsb3cuCiAgKiBOb3RlIHRoYXQgYSBzZXQgYml0ICgxKSBpbmRpY2F0ZXMgdGhlIHByb3BlcnR5IGlzIFRSVUUKICAqIChlLmcuIGlmIGJpdCAwIGlzIHNldCB0aGVuIHRoZSBldmVudCBpcyBlbmFibGVkKS4KLSAqICstLS0tLS0tLS0tLS0tKy0rLSstKy0rLSsKLSAqIHwgICBCaXRzIDMxOjUgfDR8M3wyfDF8MHwKLSAqICstLS0tLS0tLS0tLS0tKy0rLSstKy0rLSsKLSAqICAgICAgICAgIHwgICAgIHwgfCB8IHwgfAotICogICAgICAgICAgfCAgICAgfCB8IHwgfCArLSBFbmFibGVkPwotICogICAgICAgICAgfCAgICAgfCB8IHwgKy0tLSBFbmFibGVkIGZvciB3YWtlPwotICogICAgICAgICAgfCAgICAgfCB8ICstLS0tLSBTdGF0dXMgYml0IHNldD8KLSAqICAgICAgICAgIHwgICAgIHwgKy0tLS0tLS0gRW5hYmxlIGJpdCBzZXQ/Ci0gKiAgICAgICAgICB8ICAgICArLS0tLS0tLS0tIEhhcyBhIGhhbmRsZXI/Ci0gKiAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tIDxSZXNlcnZlZD4KKyAqICstLS0tLS0tLS0tLS0tKy0rLSstKy0rLSstKworICogfCAgIEJpdHMgMzE6NiB8NXw0fDN8MnwxfDB8CisgKiArLS0tLS0tLS0tLS0tLSstKy0rLSstKy0rLSsKKyAqICAgICAgICAgIHwgICAgIHwgfCB8IHwgfCB8CisgKiAgICAgICAgICB8ICAgICB8IHwgfCB8IHwgKy0gRW5hYmxlZD8KKyAqICAgICAgICAgIHwgICAgIHwgfCB8IHwgKy0tLSBFbmFibGVkIGZvciB3YWtlPworICogICAgICAgICAgfCAgICAgfCB8IHwgKy0tLS0tIFN0YXR1cyBiaXQgc2V0PworICogICAgICAgICAgfCAgICAgfCB8ICstLS0tLS0tIEVuYWJsZSBiaXQgc2V0PworICogICAgICAgICAgfCAgICAgfCArLS0tLS0tLS0tIEhhcyBhIGhhbmRsZXI/CisgKiAgICAgICAgICB8ICAgICArLS0tLS0tLS0tLS0gTWFza2VkPworICogICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tIDxSZXNlcnZlZD4KICAqLwogdHlwZWRlZiB1MzIgYWNwaV9ldmVudF9zdGF0dXM7CiAKQEAgLTc1MSw2ICs3NTIsNyBAQAogI2RlZmluZSBBQ1BJX0VWRU5UX0ZMQUdfU1RBVFVTX1NFVCAgICAgIChhY3BpX2V2ZW50X3N0YXR1cykgMHgwNAogI2RlZmluZSBBQ1BJX0VWRU5UX0ZMQUdfRU5BQkxFX1NFVCAgICAgIChhY3BpX2V2ZW50X3N0YXR1cykgMHgwOAogI2RlZmluZSBBQ1BJX0VWRU5UX0ZMQUdfSEFTX0hBTkRMRVIgICAgIChhY3BpX2V2ZW50X3N0YXR1cykgMHgxMAorI2RlZmluZSBBQ1BJX0VWRU5UX0ZMQUdfTUFTS0VEICAgICAgICAgIChhY3BpX2V2ZW50X3N0YXR1cykgMHgyMAogI2RlZmluZSBBQ1BJX0VWRU5UX0ZMQUdfU0VUICAgICAgICAgICAgIEFDUElfRVZFTlRfRkxBR19TVEFUVVNfU0VUCiAKIC8qIEFjdGlvbnMgZm9yIGFjcGlfc2V0X2dwZSwgYWNwaV9ncGVfd2FrZXVwLCBhY3BpX2h3X2xvd19zZXRfZ3BlICovCkBAIC03NjEsMTQgKzc2MywxNSBAQAogCiAvKgogICogR1BFIGluZm8gZmxhZ3MgLSBQZXIgR1BFCi0gKiArLS0tLS0tLSstKy0rLS0tKwotICogfCAgNzo1ICB8NHwzfDI6MHwKLSAqICstLS0tLS0tKy0rLSstLS0rCi0gKiAgICAgfCAgICB8IHwgIHwKLSAqICAgICB8ICAgIHwgfCAgKy0tIFR5cGUgb2YgZGlzcGF0Y2g6dG8gbWV0aG9kLCBoYW5kbGVyLCBub3RpZnksIG9yIG5vbmUKLSAqICAgICB8ICAgIHwgKy0tLS0tIEludGVycnVwdCB0eXBlOiBlZGdlIG9yIGxldmVsIHRyaWdnZXJlZAotICogICAgIHwgICAgKy0tLS0tLS0gSXMgYSBXYWtlIEdQRQotICogICAgICstLS0tLS0tLS0tLS0gPFJlc2VydmVkPgorICogKy0tLSstKy0rLSstLS0rCisgKiB8Nzo2fDV8NHwzfDI6MHwKKyAqICstLS0rLSstKy0rLS0tKworICogICB8ICB8IHwgfCAgfAorICogICB8ICB8IHwgfCAgKy0tIFR5cGUgb2YgZGlzcGF0Y2g6dG8gbWV0aG9kLCBoYW5kbGVyLCBub3RpZnksIG9yIG5vbmUKKyAqICAgfCAgfCB8ICstLS0tLSBJbnRlcnJ1cHQgdHlwZTogZWRnZSBvciBsZXZlbCB0cmlnZ2VyZWQKKyAqICAgfCAgfCArLS0tLS0tLSBJcyBhIFdha2UgR1BFCisgKiAgIHwgICstLS0tLS0tLS0gSXMgR1BFIG1hc2tlZCBieSB0aGUgc29mdHdhcmUgR1BFIG1hc2tpbmcgbWFjaGFuaXNtCisgKiAgICstLS0tLS0tLS0tLS0gPFJlc2VydmVkPgogICovCiAjZGVmaW5lIEFDUElfR1BFX0RJU1BBVENIX05PTkUgICAgICAgICAgKHU4KSAweDAwCiAjZGVmaW5lIEFDUElfR1BFX0RJU1BBVENIX01FVEhPRCAgICAgICAgKHU4KSAweDAxCkBAIC0xMDMxLDEyICsxMDM0LDYgQEAKIAl1MzIgbWV0aG9kX2NvdW50OwogfTsKIAotLyogVGFibGUgRXZlbnQgVHlwZXMgKi8KLQotI2RlZmluZSBBQ1BJX1RBQkxFX0VWRU5UX0xPQUQgICAgICAgICAgIDB4MAotI2RlZmluZSBBQ1BJX1RBQkxFX0VWRU5UX1VOTE9BRCAgICAgICAgIDB4MQotI2RlZmluZSBBQ1BJX05VTV9UQUJMRV9FVkVOVFMgICAgICAgICAgIDIKLQogLyoKICAqIFR5cGVzIHNwZWNpZmljIHRvIHRoZSBPUyBzZXJ2aWNlIGludGVyZmFjZXMKICAqLwpAQCAtMTA4OCw5ICsxMDg1LDEzIEBACiB0eXBlZGVmCiBhY3BpX3N0YXR1cyAoKmFjcGlfdGFibGVfaGFuZGxlcikgKHUzMiBldmVudCwgdm9pZCAqdGFibGUsIHZvaWQgKmNvbnRleHQpOwogCi0jZGVmaW5lIEFDUElfVEFCTEVfTE9BRCAgICAgICAgICAgICAweDAKLSNkZWZpbmUgQUNQSV9UQUJMRV9VTkxPQUQgICAgICAgICAgIDB4MQotI2RlZmluZSBBQ1BJX05VTV9UQUJMRV9FVkVOVFMgICAgICAgMgorLyogVGFibGUgRXZlbnQgVHlwZXMgKi8KKworI2RlZmluZSBBQ1BJX1RBQkxFX0VWRU5UX0xPQUQgICAgICAgICAgIDB4MAorI2RlZmluZSBBQ1BJX1RBQkxFX0VWRU5UX1VOTE9BRCAgICAgICAgIDB4MQorI2RlZmluZSBBQ1BJX1RBQkxFX0VWRU5UX0lOU1RBTEwgICAgICAgIDB4MgorI2RlZmluZSBBQ1BJX1RBQkxFX0VWRU5UX1VOSU5TVEFMTCAgICAgIDB4MworI2RlZmluZSBBQ1BJX05VTV9UQUJMRV9FVkVOVFMgICAgICAgICAgIDQKIAogLyogQWRkcmVzcyBTcGFjZXMgKEZvciBPcGVyYXRpb24gUmVnaW9ucykgKi8KIApAQCAtMTI4NSwxNSArMTI4Niw2IEBACiAjZGVmaW5lIEFDUElfT1NJX1dJTl84ICAgICAgICAgICAgICAgICAgMHgwQwogI2RlZmluZSBBQ1BJX09TSV9XSU5fMTAgICAgICAgICAgICAgICAgIDB4MEQKIAotLyogRGVmaW5pdGlvbnMgb2YgZmlsZSBJTyAqLwotCi0jZGVmaW5lIEFDUElfRklMRV9SRUFESU5HICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBBQ1BJX0ZJTEVfV1JJVElORyAgICAgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgQUNQSV9GSUxFX0JJTkFSWSAgICAgICAgICAgICAgICAweDA0Ci0KLSNkZWZpbmUgQUNQSV9GSUxFX0JFR0lOICAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIEFDUElfRklMRV9FTkQgICAgICAgICAgICAgICAgICAgMHgwMgotCiAvKiBEZWZpbml0aW9ucyBvZiBnZXRvcHQgKi8KIAogI2RlZmluZSBBQ1BJX09QVF9FTkQgICAgICAgICAgICAgICAgICAgIC0xCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvY3BwY19hY3BpLmggYi9pbmNsdWRlL2FjcGkvY3BwY19hY3BpLmgKaW5kZXggMjg0OTY1Yy4uNDI3YTdjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2NwcGNfYWNwaS5oCisrKyBiL2luY2x1ZGUvYWNwaS9jcHBjX2FjcGkuaApAQCAtMjQsNyArMjQsOSBAQAogI2RlZmluZSBDUFBDX05VTV9FTlQJMjEKICNkZWZpbmUgQ1BQQ19SRVYJMgogCi0jZGVmaW5lIFBDQ19DTURfQ09NUExFVEUgMQorI2RlZmluZSBQQ0NfQ01EX0NPTVBMRVRFX01BU0sJKDEgPDwgMCkKKyNkZWZpbmUgUENDX0VSUk9SX01BU0sJCSgxIDw8IDIpCisKICNkZWZpbmUgTUFYX0NQQ19SRUdfRU5UIDE5CiAKIC8qIENQUEMgc3BlY2lmaWMgUENDIGNvbW1hbmRzLiAqLwpAQCAtNDksNiArNTEsNyBAQAogICovCiBzdHJ1Y3QgY3BjX3JlZ2lzdGVyX3Jlc291cmNlIHsKIAlhY3BpX29iamVjdF90eXBlIHR5cGU7CisJdTY0IF9faW9tZW0gKnN5c19tZW1fdmFkZHI7CiAJdW5pb24gewogCQlzdHJ1Y3QgY3BjX3JlZyByZWc7CiAJCXU2NCBpbnRfdmFsdWU7CkBAIC02MCw4ICs2MywxMSBAQAogCWludCBudW1fZW50cmllczsKIAlpbnQgdmVyc2lvbjsKIAlpbnQgY3B1X2lkOworCWludCB3cml0ZV9jbWRfc3RhdHVzOworCWludCB3cml0ZV9jbWRfaWQ7CiAJc3RydWN0IGNwY19yZWdpc3Rlcl9yZXNvdXJjZSBjcGNfcmVnc1tNQVhfQ1BDX1JFR19FTlRdOwogCXN0cnVjdCBhY3BpX3BzZF9wYWNrYWdlIGRvbWFpbl9pbmZvOworCXN0cnVjdCBrb2JqZWN0IGtvYmo7CiB9OwogCiAvKiBUaGVzZSBhcmUgaW5kZXhlcyBpbnRvIHRoZSBwZXItY3B1IGNwY19yZWdzW10uIE9yZGVyIGlzIGltcG9ydGFudC4gKi8KQEAgLTk2LDcgKzEwMiw2IEBACiBzdHJ1Y3QgY3BwY19wZXJmX2NhcHMgewogCXUzMiBoaWdoZXN0X3BlcmY7CiAJdTMyIG5vbWluYWxfcGVyZjsKLQl1MzIgcmVmZXJlbmNlX3BlcmY7CiAJdTMyIGxvd2VzdF9wZXJmOwogfTsKIApAQCAtMTA4LDEzICsxMTMsMTMgQEAKIAogc3RydWN0IGNwcGNfcGVyZl9mYl9jdHJzIHsKIAl1NjQgcmVmZXJlbmNlOwotCXU2NCBwcmV2X3JlZmVyZW5jZTsKIAl1NjQgZGVsaXZlcmVkOwotCXU2NCBwcmV2X2RlbGl2ZXJlZDsKKwl1NjQgcmVmZXJlbmNlX3BlcmY7CisJdTY0IGN0cl93cmFwX3RpbWU7CiB9OwogCiAvKiBQZXIgQ1BVIGNvbnRhaW5lciBmb3IgcnVudGltZSBDUFBDIG1hbmFnZW1lbnQuICovCi1zdHJ1Y3QgY3B1ZGF0YSB7CitzdHJ1Y3QgY3BwY19jcHVkYXRhIHsKIAlpbnQgY3B1OwogCXN0cnVjdCBjcHBjX3BlcmZfY2FwcyBwZXJmX2NhcHM7CiAJc3RydWN0IGNwcGNfcGVyZl9jdHJscyBwZXJmX2N0cmxzOwpAQCAtMTI3LDYgKzEzMiw3IEBACiBleHRlcm4gaW50IGNwcGNfZ2V0X3BlcmZfY3RycyhpbnQgY3B1LCBzdHJ1Y3QgY3BwY19wZXJmX2ZiX2N0cnMgKnBlcmZfZmJfY3Rycyk7CiBleHRlcm4gaW50IGNwcGNfc2V0X3BlcmYoaW50IGNwdSwgc3RydWN0IGNwcGNfcGVyZl9jdHJscyAqcGVyZl9jdHJscyk7CiBleHRlcm4gaW50IGNwcGNfZ2V0X3BlcmZfY2FwcyhpbnQgY3B1LCBzdHJ1Y3QgY3BwY19wZXJmX2NhcHMgKmNhcHMpOwotZXh0ZXJuIGludCBhY3BpX2dldF9wc2RfbWFwKHN0cnVjdCBjcHVkYXRhICoqKTsKK2V4dGVybiBpbnQgYWNwaV9nZXRfcHNkX21hcChzdHJ1Y3QgY3BwY19jcHVkYXRhICoqKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgY3BwY19nZXRfdHJhbnNpdGlvbl9sYXRlbmN5KGludCBjcHUpOwogCiAjZW5kaWYgLyogX0NQUENfQUNQSV9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2Vudi5oIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52LmgKaW5kZXggODZiNWE4NC4uMzRjY2U3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52LmgKKysrIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52LmgKQEAgLTc4LDYgKzc4LDcgQEAKIAkoZGVmaW5lZCBBQ1BJX0VYQU1QTEVfQVBQKQogI2RlZmluZSBBQ1BJX0FQUExJQ0FUSU9OCiAjZGVmaW5lIEFDUElfU0lOR0xFX1RIUkVBREVECisjZGVmaW5lIFVTRV9OQVRJVkVfQUxMT0NBVEVfWkVST0VECiAjZW5kaWYKIAogLyogaUFTTCBjb25maWd1cmF0aW9uICovCkBAIC0xMjQsNyArMTI1LDYgQEAKIAogI2lmZGVmIEFDUElfRFVNUF9BUFAKICNkZWZpbmUgQUNQSV9VU0VfTkFUSVZFX01FTU9SWV9NQVBQSU5HCi0jZGVmaW5lIFVTRV9OQVRJVkVfQUxMT0NBVEVfWkVST0VECiAjZW5kaWYKIAogLyogYWNwaV9uYW1lcy9FeGFtcGxlIGNvbmZpZ3VyYXRpb24uIEhhcmR3YXJlIGRpc2FibGVkICovCkBAIC0xNDksNyArMTQ5LDYgQEAKIC8qIENvbW1vbiBmb3IgYWxsIEFDUElDQSBhcHBsaWNhdGlvbnMgKi8KIAogI2lmZGVmIEFDUElfQVBQTElDQVRJT04KLSNkZWZpbmUgQUNQSV9VU0VfU1lTVEVNX0NMSUJSQVJZCiAjZGVmaW5lIEFDUElfVVNFX0xPQ0FMX0NBQ0hFCiAjZW5kaWYKIApAQCAtMTY3LDEwICsxNjYsMjEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBIb3N0IGNvbmZpZ3VyYXRpb24gZmlsZXMuIFRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIGZpbGVzIGFyZSBpbmNsdWRlZAotICogYnkgdGhlIGhvc3QgZmlsZXMuCisgKiBmaXJzdC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQorI2luY2x1ZGUgPGFjcGkvcGxhdGZvcm0vYWNnY2MuaD4KKworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNpbmNsdWRlICJhY21zdmMuaCIKKworI2VsaWYgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQorI2luY2x1ZGUgImFjaW50ZWwuaCIKKworI2VuZGlmCisKICNpZiBkZWZpbmVkKF9MSU5VWCkgfHwgZGVmaW5lZChfX2xpbnV4X18pCiAjaW5jbHVkZSA8YWNwaS9wbGF0Zm9ybS9hY2xpbnV4Lmg+CiAKQEAgLTIxMCwxOCArMjIwLDIwIEBACiAjZWxpZiBkZWZpbmVkKF9fT1MyX18pCiAjaW5jbHVkZSAiYWNvczIuaCIKIAotI2VsaWYgZGVmaW5lZChfQUVEX0VGSSkKLSNpbmNsdWRlICJhY2VmaS5oIgotCi0jZWxpZiBkZWZpbmVkKF9HTlVfRUZJKQotI2luY2x1ZGUgImFjZWZpLmgiCi0KICNlbGlmIGRlZmluZWQoX19IQUlLVV9fKQogI2luY2x1ZGUgImFjaGFpa3UuaCIKIAogI2VsaWYgZGVmaW5lZChfX1FOWF9fKQogI2luY2x1ZGUgImFjcW54LmgiCiAKKy8qCisgKiBFRkkgYXBwbGljYXRpb25zIGNhbiBiZSBidWlsdCB3aXRoIC1ub3N0ZGxpYiwgaW4gdGhpcyBjYXNlLCBpdCBtdXN0IGJlCisgKiBpbmNsdWRlZCBhZnRlciBpbmNsdWRpbmcgYWxsIG90aGVyIGhvc3QgZW52aXJvbm1lbnRhbCBkZWZpbml0aW9ucywgaW4KKyAqIG9yZGVyIHRvIG92ZXJyaWRlIHRoZSBkZWZpbml0aW9ucy4KKyAqLworI2VsaWYgZGVmaW5lZChfQUVEX0VGSSkgfHwgZGVmaW5lZChfR05VX0VGSSkgfHwgZGVmaW5lZChfRURLMl9FRkkpCisjaW5jbHVkZSAiYWNlZmkuaCIKKwogI2Vsc2UKIAogLyogVW5rbm93biBlbnZpcm9ubWVudCAqLwpAQCAtMzI2LDcgKzMzOCw4IEBACiAgKiBBQ1BJX1VTRV9TWVNURU1fQ0xJQlJBUlkgLSBEZWZpbmUgdGhpcyBpZiBsaW5raW5nIHRvIGFuIGFjdHVhbCBDIGxpYnJhcnkuCiAgKiAgICAgIE90aGVyd2lzZSwgbG9jYWwgdmVyc2lvbnMgb2Ygc3RyaW5nL21lbW9yeSBmdW5jdGlvbnMgd2lsbCBiZSB1c2VkLgogICogQUNQSV9VU0VfU1RBTkRBUkRfSEVBREVSUyAtIERlZmluZSB0aGlzIGlmIGxpbmtpbmcgdG8gYSBDIGxpYnJhcnkgYW5kCi0gKiAgICAgIHRoZSBzdGFuZGFyZCBoZWFkZXIgZmlsZXMgbWF5IGJlIHVzZWQuCisgKiAgICAgIHRoZSBzdGFuZGFyZCBoZWFkZXIgZmlsZXMgbWF5IGJlIHVzZWQuIERlZmluaW5nIHRoaXMgaW1wbGllcyB0aGF0CisgKiAgICAgIEFDUElfVVNFX1NZU1RFTV9DTElCUkFSWSBoYXMgYmVlbiBkZWZpbmVkLgogICoKICAqIFRoZSBBQ1BJQ0Egc3Vic3lzdGVtIG9ubHkgdXNlcyBsb3cgbGV2ZWwgQyBsaWJyYXJ5IGZ1bmN0aW9ucyB0aGF0IGRvIG5vdAogICogY2FsbCBvcGVyYXRpbmcgc3lzdGVtIHNlcnZpY2VzIGFuZCBtYXkgdGhlcmVmb3JlIGJlIGlubGluZWQgaW4gdGhlIGNvZGUuCkBAIC0zMzQsNyArMzQ3LDYgQEAKICAqIEl0IG1heSBiZSBuZWNlc3NhcnkgdG8gdGFpbG9yIHRoZXNlIGluY2x1ZGUgZmlsZXMgdG8gdGhlIHRhcmdldAogICogZ2VuZXJhdGlvbiBlbnZpcm9ubWVudC4KICAqLwotI2lmZGVmIEFDUElfVVNFX1NZU1RFTV9DTElCUkFSWQogCiAvKiBVc2UgdGhlIHN0YW5kYXJkIEMgbGlicmFyeSBoZWFkZXJzLiBXZSB3YW50IHRvIGtlZXAgdGhlc2UgdG8gYSBtaW5pbXVtLiAqLwogCkBAIC0zNDIsNTcgKzM1NCwyMCBAQAogCiAvKiBVc2UgdGhlIHN0YW5kYXJkIGhlYWRlcnMgZnJvbSB0aGUgc3RhbmRhcmQgbG9jYXRpb25zICovCiAKLSNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgorI2lmZGVmIEFDUElfQVBQTElDQVRJT04KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKIAogI2VuZGlmCQkJCS8qIEFDUElfVVNFX1NUQU5EQVJEX0hFQURFUlMgKi8KIAotLyogV2Ugd2lsbCBiZSBsaW5raW5nIHRvIHRoZSBzdGFuZGFyZCBDbGliIGZ1bmN0aW9ucyAqLwotCi0jZWxzZQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTm90IHVzaW5nIG5hdGl2ZSBDIGxpYnJhcnksIHVzZSBsb2NhbCBpbXBsZW1lbnRhdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBVc2UgbG9jYWwgZGVmaW5pdGlvbnMgb2YgQyBsaWJyYXJ5IG1hY3JvcyBhbmQgZnVuY3Rpb25zLiBUaGVzZSBmdW5jdGlvbgotICogaW1wbGVtZW50YXRpb25zIG1heSBub3QgYmUgYXMgZWZmaWNpZW50IGFzIGFuIGlubGluZSBvciBhc3NlbWJseSBjb2RlCi0gKiBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBhIG5hdGl2ZSBDIGxpYnJhcnksIGJ1dCB0aGV5IGFyZSBmdW5jdGlvbmFsbHkKLSAqIGVxdWl2YWxlbnQuCi0gKi8KLSNpZm5kZWYgdmFfYXJnCi0KLSNpZm5kZWYgX1ZBTElTVAotI2RlZmluZSBfVkFMSVNUCi10eXBlZGVmIGNoYXIgKnZhX2xpc3Q7Ci0jZW5kaWYJCQkJLyogX1ZBTElTVCAqLwotCi0vKiBTdG9yYWdlIGFsaWdubWVudCBwcm9wZXJ0aWVzICovCi0KLSNkZWZpbmUgIF9BVVBCTkQgICAgICAgICAgICAgICAgKHNpemVvZiAoYWNwaV9uYXRpdmVfaW50KSAtIDEpCi0jZGVmaW5lICBfQUROQk5EICAgICAgICAgICAgICAgIChzaXplb2YgKGFjcGlfbmF0aXZlX2ludCkgLSAxKQotCi0vKiBWYXJpYWJsZSBhcmd1bWVudCBsaXN0IG1hY3JvIGRlZmluaXRpb25zICovCi0KLSNkZWZpbmUgX2JuZChYLCBibmQpICAgICAgICAgICAgKCgoc2l6ZW9mIChYKSkgKyAoYm5kKSkgJiAofihibmQpKSkKLSNkZWZpbmUgdmFfYXJnKGFwLCBUKSAgICAgICAgICAgKCooVCAqKSgoKGFwKSArPSAoX2JuZCAoVCwgX0FVUEJORCkpKSAtIChfYm5kIChULF9BRE5CTkQpKSkpCi0jZGVmaW5lIHZhX2VuZChhcCkgICAgICAgICAgICAgIChhcCA9ICh2YV9saXN0KSBOVUxMKQotI2RlZmluZSB2YV9zdGFydChhcCwgQSkgICAgICAgICAodm9pZCkgKChhcCkgPSAoKChjaGFyICopICYoQSkpICsgKF9ibmQgKEEsX0FVUEJORCkpKSkKLQotI2VuZGlmCQkJCS8qIHZhX2FyZyAqLwotCi0vKiBVc2UgdGhlIGxvY2FsIChBQ1BJQ0EpIGRlZmluaXRpb25zIG9mIHRoZSBjbGliIGZ1bmN0aW9ucyAqLwotCi0jZW5kaWYJCQkJLyogQUNQSV9VU0VfU1lTVEVNX0NMSUJSQVJZICovCi0KLSNpZm5kZWYgQUNQSV9GSUxFCiAjaWZkZWYgQUNQSV9BUFBMSUNBVElPTgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjZGVmaW5lIEFDUElfRklMRSAgICAgICAgICAgICAgRklMRSAqCiAjZGVmaW5lIEFDUElfRklMRV9PVVQgICAgICAgICAgc3Rkb3V0CiAjZGVmaW5lIEFDUElfRklMRV9FUlIgICAgICAgICAgc3RkZXJyCkBAIC00MDEsNiArMzc2LDkgQEAKICNkZWZpbmUgQUNQSV9GSUxFX09VVCAgICAgICAgICBOVUxMCiAjZGVmaW5lIEFDUElfRklMRV9FUlIgICAgICAgICAgTlVMTAogI2VuZGlmCQkJCS8qIEFDUElfQVBQTElDQVRJT04gKi8KLSNlbmRpZgkJCQkvKiBBQ1BJX0ZJTEUgKi8KKworI2lmbmRlZiBBQ1BJX0lOSVRfRlVOQ1RJT04KKyNkZWZpbmUgQUNQSV9JTklUX0ZVTkNUSU9OCisjZW5kaWYKIAogI2VuZGlmCQkJCS8qIF9fQUNFTlZfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnZleC5oIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52ZXguaAppbmRleCA0ZjE1YzFkLi5iMzE3MWI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnZleC5oCisrKyBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2VudmV4LmgKQEAgLTU2LDE4ICs1NiwyNSBAQAogI2lmIGRlZmluZWQoX0xJTlVYKSB8fCBkZWZpbmVkKF9fbGludXhfXykKICNpbmNsdWRlIDxhY3BpL3BsYXRmb3JtL2FjbGludXhleC5oPgogCi0jZWxpZiBkZWZpbmVkKFdJTjMyKQotI2luY2x1ZGUgImFjd2luZXguaCIKLQotI2VsaWYgZGVmaW5lZChfQUVEX0VGSSkKLSNpbmNsdWRlICJhY2VmaWV4LmgiCi0KLSNlbGlmIGRlZmluZWQoX0dOVV9FRkkpCi0jaW5jbHVkZSAiYWNlZmlleC5oIgotCiAjZWxpZiBkZWZpbmVkKF9fRHJhZ29uRmx5X18pCiAjaW5jbHVkZSAiYWNkcmFnb25mbHlleC5oIgogCisvKgorICogRUZJIGFwcGxpY2F0aW9ucyBjYW4gYmUgYnVpbHQgd2l0aCAtbm9zdGRsaWIsIGluIHRoaXMgY2FzZSwgaXQgbXVzdCBiZQorICogaW5jbHVkZWQgYWZ0ZXIgaW5jbHVkaW5nIGFsbCBvdGhlciBob3N0IGVudmlyb25tZW50YWwgZGVmaW5pdGlvbnMsIGluCisgKiBvcmRlciB0byBvdmVycmlkZSB0aGUgZGVmaW5pdGlvbnMuCisgKi8KKyNlbGlmIGRlZmluZWQoX0FFRF9FRkkpIHx8IGRlZmluZWQoX0dOVV9FRkkpIHx8IGRlZmluZWQoX0VESzJfRUZJKQorI2luY2x1ZGUgImFjZWZpZXguaCIKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQorI2luY2x1ZGUgImFjZ2NjZXguaCIKKworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNpbmNsdWRlICJhY21zdmNleC5oIgorCiAjZW5kaWYKIAogLyohIFtFbmRdIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uICEqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjLmggYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNnY2MuaAppbmRleCBjNWEyMTZjLi44ZjY2YWFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNnY2MuaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNnY2MuaApAQCAtNDQsNiArNDQsMTIgQEAKICNpZm5kZWYgX19BQ0dDQ19IX18KICNkZWZpbmUgX19BQ0dDQ19IX18KIAorLyoKKyAqIFVzZSBjb21waWxlciBzcGVjaWZpYyA8c3RkYXJnLmg+IGlzIGEgZ29vZCBwcmFjdGljZSBmb3IgZXZlbiB3aGVuCisgKiAtbm9zdGRpbmMgaXMgc3BlY2lmaWVkIChpLmUuLCBBQ1BJX1VTRV9TVEFOREFSRF9IRUFERVJTIHVuZGVmaW5lZC4KKyAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCiAjZGVmaW5lIEFDUElfSU5MSU5FICAgICAgICAgICAgIF9faW5saW5lX18KIAogLyogRnVuY3Rpb24gbmFtZSBpcyB1c2VkIGZvciBkZWJ1ZyBvdXRwdXQuIE5vbi1BTlNJLCBjb21waWxlci1kZXBlbmRlbnQgKi8KQEAgLTY0LDE3ICs3MCw2IEBACiAgKi8KICNkZWZpbmUgQUNQSV9VTlVTRURfVkFSIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKQogCi0vKgotICogU29tZSB2ZXJzaW9ucyBvZiBnY2MgaW1wbGVtZW50IHN0cmNocigpIHdpdGggYSBidWdneSBtYWNyby4gU28sCi0gKiB1bmRlZiBpdCBoZXJlLiBQcmV2ZW50cyBlcnJvciBtZXNzYWdlcyBvZiB0aGlzIGZvcm0gKHVzdWFsbHkgZnJvbSB0aGUKLSAqIGZpbGUgZ2V0b3B0LmMpOgotICoKLSAqIGVycm9yOiBsb2dpY2FsICcmJicgd2l0aCBub24temVybyBjb25zdGFudCB3aWxsIGFsd2F5cyBldmFsdWF0ZSBhcyB0cnVlCi0gKi8KLSNpZmRlZiBzdHJjaHIKLSN1bmRlZiBzdHJjaHIKLSNlbmRpZgotCiAvKiBHQ0Mgc3VwcG9ydHMgX19WQV9BUkdTX18gaW4gbWFjcm9zICovCiAKICNkZWZpbmUgQ09NUElMRVJfVkFfTUFDUk8gICAgICAgICAgICAgICAxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNnY2NleC5oIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmVhZDJjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjZXguaApAQCAtMCwwICsxLDU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZTogYWNnY2NleC5oIC0gRXh0cmEgR0NDIHNwZWNpZmljIGRlZmluZXMsIGV0Yy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE2LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpZm5kZWYgX19BQ0dDQ0VYX0hfXworI2RlZmluZSBfX0FDR0NDRVhfSF9fCisKKy8qCisgKiBTb21lIHZlcnNpb25zIG9mIGdjYyBpbXBsZW1lbnQgc3RyY2hyKCkgd2l0aCBhIGJ1Z2d5IG1hY3JvLiBTbywKKyAqIHVuZGVmIGl0IGhlcmUuIFByZXZlbnRzIGVycm9yIG1lc3NhZ2VzIG9mIHRoaXMgZm9ybSAodXN1YWxseSBmcm9tIHRoZQorICogZmlsZSBnZXRvcHQuYyk6CisgKgorICogZXJyb3I6IGxvZ2ljYWwgJyYmJyB3aXRoIG5vbi16ZXJvIGNvbnN0YW50IHdpbGwgYWx3YXlzIGV2YWx1YXRlIGFzIHRydWUKKyAqLworI2lmZGVmIHN0cmNocgorI3VuZGVmIHN0cmNocgorI2VuZGlmCisKKyNlbmRpZgkJCQkvKiBfX0FDR0NDRVhfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaAppbmRleCA5M2I2MWIxLi5hNWQ5OGQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oCisrKyBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmgKQEAgLTkyLDYgKzkyLDggQEAKICNpbmNsdWRlIDxhc20vYWNlbnYuaD4KICNlbmRpZgogCisjZGVmaW5lIEFDUElfSU5JVF9GVU5DVElPTiBfX2luaXQKKwogI2lmbmRlZiBDT05GSUdfQUNQSQogCiAvKiBFeHRlcm5hbCBnbG9iYWxzIGZvciBfX0tFUk5FTF9fLCBzdHVicyBpcyBuZWVkZWQgKi8KQEAgLTE2OCwxMyArMTcwLDIxIEBACiAjZGVmaW5lIEFDUElfVVNFX0FMVEVSTkFURV9QUk9UT1RZUEVfYWNwaV9vc19nZXRfbmV4dF9maWxlbmFtZQogI2RlZmluZSBBQ1BJX1VTRV9BTFRFUk5BVEVfUFJPVE9UWVBFX2FjcGlfb3NfY2xvc2VfZGlyZWN0b3J5CiAKKyNkZWZpbmUgQUNQSV9NU0dfRVJST1IgICAgICAgICAgS0VSTl9FUlIgIkFDUEkgRXJyb3I6ICIKKyNkZWZpbmUgQUNQSV9NU0dfRVhDRVBUSU9OICAgICAgS0VSTl9FUlIgIkFDUEkgRXhjZXB0aW9uOiAiCisjZGVmaW5lIEFDUElfTVNHX1dBUk5JTkcgICAgICAgIEtFUk5fV0FSTklORyAiQUNQSSBXYXJuaW5nOiAiCisjZGVmaW5lIEFDUElfTVNHX0lORk8gICAgICAgICAgIEtFUk5fSU5GTyAiQUNQSTogIgorCisjZGVmaW5lIEFDUElfTVNHX0JJT1NfRVJST1IgICAgIEtFUk5fRVJSICJBQ1BJIEJJT1MgRXJyb3IgKGJ1Zyk6ICIKKyNkZWZpbmUgQUNQSV9NU0dfQklPU19XQVJOSU5HICAgS0VSTl9XQVJOSU5HICJBQ1BJIEJJT1MgV2FybmluZyAoYnVnKTogIgorCiAjZWxzZQkJCQkvKiAhX19LRVJORUxfXyAqLwogCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KKyNkZWZpbmUgQUNQSV9VU0VfU1RBTkRBUkRfSEVBREVSUworCisjaWZkZWYgQUNQSV9VU0VfU1RBTkRBUkRfSEVBREVSUwogI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCiAKIC8qIERlZmluZS9kaXNhYmxlIGtlcm5lbC1zcGVjaWZpYyBkZWNsYXJhdG9ycyAqLwogCkBAIC0yMDUsOCArMjE1LDQgQEAKIAogI2VuZGlmCQkJCS8qIF9fS0VSTkVMX18gKi8KIAotLyogTGludXggdXNlcyBHQ0MgKi8KLQotI2luY2x1ZGUgPGFjcGkvcGxhdGZvcm0vYWNnY2MuaD4KLQogI2VuZGlmCQkJCS8qIF9fQUNMSU5VWF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4ZXguaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4ZXguaAppbmRleCBmOGJiMGQ4Li5hNTUwOWQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eGV4LmgKKysrIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXhleC5oCkBAIC03MSw3ICs3MSw3IEBACiAvKgogICogT3ZlcnJpZGVzIGZvciBpbi1rZXJuZWwgQUNQSUNBCiAgKi8KLWFjcGlfc3RhdHVzIF9faW5pdCBhY3BpX29zX2luaXRpYWxpemUodm9pZCk7CithY3BpX3N0YXR1cyBBQ1BJX0lOSVRfRlVOQ1RJT04gYWNwaV9vc19pbml0aWFsaXplKHZvaWQpOwogCiBhY3BpX3N0YXR1cyBhY3BpX29zX3Rlcm1pbmF0ZSh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCmluZGV4IGJmZTZiMmUuLmYzZGIxMWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKQEAgLTM1OSw3ICszNTksNyBAQAogICogb25saW5lZC9vZmZsaW5lZC4gSW4gc3VjaCBjYXNlIHRoZSBmbGFncy50aHJvdHRsaW5nIHdpbGwgYmUgdXBkYXRlZC4KICAqLwogZXh0ZXJuIHZvaWQgYWNwaV9wcm9jZXNzb3JfcmVldmFsdWF0ZV90c3RhdGUoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKLQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uKTsKKwkJCWJvb2wgaXNfZGVhZCk7CiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX2ZvcHM7CiBleHRlcm4gdm9pZCBhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX2luaXQodm9pZCk7CiAjZWxzZQpAQCAtMzgwLDcgKzM4MCw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9yZWV2YWx1YXRlX3RzdGF0ZShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAotCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24pIHt9CisJCQlib29sIGlzX2RlYWQpIHt9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX2luaXQodm9pZCkge30KICNlbmRpZgkvKiBDT05GSUdfQUNQSV9DUFVfRlJFUV9QU1MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy91YWNjZXNzLmgKaW5kZXggMWJmYTYwMi4uNmRmOWIwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy91YWNjZXNzLmgKQEAgLTcyLDYgKzcyLDcgQEAKIC8qIFJldHVybnMgMCBpZiBleGNlcHRpb24gbm90IGZvdW5kIGFuZCBmaXh1cCBvdGhlcndpc2UuICAqLwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2VhcmNoX2V4Y2VwdGlvbl90YWJsZSh1bnNpZ25lZCBsb25nKTsKIAorCiAvKgogICogYXJjaGl0ZWN0dXJlcyB3aXRoIGFuIE1NVSBzaG91bGQgb3ZlcnJpZGUgdGhlc2UgdHdvCiAgKi8KQEAgLTIzMCwxNCArMjMxLDE4IEBACiAJbWlnaHRfZmF1bHQoKTsJCQkJCQlcCiAJYWNjZXNzX29rKFZFUklGWV9SRUFELCBfX3AsIHNpemVvZigqcHRyKSkgPwkJXAogCQlfX2dldF91c2VyKCh4KSwgKF9fdHlwZW9mX18oKihwdHIpKSAqKV9fcCkgOglcCi0JCS1FRkFVTFQ7CQkJCQlcCisJCSgoeCkgPSAoX190eXBlb2ZfXygqKHB0cikpKTAsLUVGQVVMVCk7CQlcCiB9KQogCiAjaWZuZGVmIF9fZ2V0X3VzZXJfZm4KIHN0YXRpYyBpbmxpbmUgaW50IF9fZ2V0X3VzZXJfZm4oc2l6ZV90IHNpemUsIGNvbnN0IHZvaWQgX191c2VyICpwdHIsIHZvaWQgKngpCiB7Ci0Jc2l6ZSA9IF9fY29weV9mcm9tX3VzZXIoeCwgcHRyLCBzaXplKTsKLQlyZXR1cm4gc2l6ZSA/IC1FRkFVTFQgOiBzaXplOworCXNpemVfdCBuID0gX19jb3B5X2Zyb21fdXNlcih4LCBwdHIsIHNpemUpOworCWlmICh1bmxpa2VseShuKSkgeworCQltZW1zZXQoeCArIChzaXplIC0gbiksIDAsIG4pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgX19nZXRfdXNlcl9mbihzeiwgdSwgaykJX19nZXRfdXNlcl9mbihzeiwgdSwgaykKQEAgLTI1NywxMSArMjYyLDEzIEBACiBzdGF0aWMgaW5saW5lIGxvbmcgY29weV9mcm9tX3VzZXIodm9pZCAqdG8sCiAJCWNvbnN0IHZvaWQgX191c2VyICogZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogeworCXVuc2lnbmVkIGxvbmcgcmVzID0gbjsKIAltaWdodF9mYXVsdCgpOwotCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKQotCQlyZXR1cm4gX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbik7Ci0JZWxzZQotCQlyZXR1cm4gbjsKKwlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpKQorCQlyZXMgPSBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKKwlpZiAodW5saWtlbHkocmVzKSkKKwkJbWVtc2V0KHRvICsgKG4gLSByZXMpLCAwLCByZXMpOworCXJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbmxpbmUgbG9uZyBjb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9leHlub3M1NDEwLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2V4eW5vczU0MTAuaAppbmRleCA4NWI0NjdiLi42Y2I0ZTkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2V4eW5vczU0MTAuaAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2V4eW5vczU0MTAuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBDTEtfRk9VVF9NUExMCQk0CiAjZGVmaW5lIENMS19GT1VUX0JQTEwJCTUKICNkZWZpbmUgQ0xLX0ZPVVRfS1BMTAkJNgorI2RlZmluZSBDTEtfRk9VVF9FUExMCQk3CiAKIC8qIGdhdGUgZm9yIHNwZWNpYWwgY2xvY2tzIChzY2xrKSAqLwogI2RlZmluZSBDTEtfU0NMS19VQVJUMAkJMTI4CkBAIC01NSw2ICs1Niw4IEBACiAjZGVmaW5lIENMS19NTUMwCQkzNTEKICNkZWZpbmUgQ0xLX01NQzEJCTM1MgogI2RlZmluZSBDTEtfTU1DMgkJMzUzCisjZGVmaW5lIENMS19QRE1BMAkJMzYyCisjZGVmaW5lIENMS19QRE1BMQkJMzYzCiAjZGVmaW5lIENMS19VU0JIMjAJCTM2NQogI2RlZmluZSBDTEtfVVNCRDMwMAkJMzY2CiAjZGVmaW5lIENMS19VU0JEMzAxCQkzNjcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZXh5bm9zNTQyMC5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9leHlub3M1NDIwLmgKaW5kZXggMTdhYjgzOS4uNmZkMjFjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9leHlub3M1NDIwLmgKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9leHlub3M1NDIwLmgKQEAgLTIxNCw2ICsyMTQsOSBAQAogI2RlZmluZSBDTEtfTU9VVF9TV19BQ0xLNDAwICAgICA2NTEKICNkZWZpbmUgQ0xLX01PVVRfVVNFUl9BQ0xLMzAwX0dTQ0wJNjUyCiAjZGVmaW5lIENMS19NT1VUX1NXX0FDTEszMDBfR1NDTAk2NTMKKyNkZWZpbmUgQ0xLX01PVVRfTUNMS19DRFJFWAk2NTQKKyNkZWZpbmUgQ0xLX01PVVRfQlBMTAkJNjU1CisjZGVmaW5lIENMS19NT1VUX01YX01TUExMX0NDT1JFCTY1NgogCiAvKiBkaXZpZGVyIGNsb2NrcyAqLwogI2RlZmluZSBDTEtfRE9VVF9QSVhFTAkJNzY4CkBAIC0yMzksOCArMjQyLDE0IEBACiAjZGVmaW5lIENMS19ET1VUX0FDTEszMDBfRElTUDEJNzg4CiAjZGVmaW5lIENMS19ET1VUX0FDTEszMDBfR1NDTAk3ODkKICNkZWZpbmUgQ0xLX0RPVVRfQUNMSzQwMF9ESVNQMQk3OTAKKyNkZWZpbmUgQ0xLX0RPVVRfUENMS19DRFJFWAk3OTEKKyNkZWZpbmUgQ0xLX0RPVVRfU0NMS19DRFJFWAk3OTIKKyNkZWZpbmUgQ0xLX0RPVVRfQUNMS19DRFJFWDEJNzkzCisjZGVmaW5lIENMS19ET1VUX0NDTEtfRFJFWDAJNzk0CisjZGVmaW5lIENMS19ET1VUX0NMSzJYX1BIWTAJNzk1CisjZGVmaW5lIENMS19ET1VUX1BDTEtfQ09SRV9NRU0JNzk2CiAKIC8qIG11c3QgYmUgZ3JlYXRlciB0aGFuIG1heGltYWwgY2xvY2sgaWQgKi8KLSNkZWZpbmUgQ0xLX05SX0NMS1MJCTc5MQorI2RlZmluZSBDTEtfTlJfQ0xLUwkJNzk3CiAKICNlbmRpZiAvKiBfRFRfQklORElOR1NfQ0xPQ0tfRVhZTk9TXzU0MjBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9leHlub3M1NDQwLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2V4eW5vczU0NDAuaAppbmRleCBjNjZmYzQwLi44NDJjZGMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2V4eW5vczU0NDAuaAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2V4eW5vczU0NDAuaApAQCAtMTQsNiArMTQsOCBAQAogCiAjZGVmaW5lIENMS19YVEFMCQkxCiAjZGVmaW5lIENMS19BUk1fQ0xLCQkyCisjZGVmaW5lIENMS19DUExMQQkJMworI2RlZmluZSBDTEtfQ1BMTEIJCTQKICNkZWZpbmUgQ0xLX1NQSV9CQVVECQkxNgogI2RlZmluZSBDTEtfUEIwXzI1MAkJMTcKICNkZWZpbmUgQ0xLX1BSMF8yNTAJCTE4CmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2d4YmItYW9jbGtjLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2d4YmItYW9jbGtjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE3NTE0OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZ3hiYi1hb2Nsa2MuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEJheUxpYnJlLCBTQVMuCisgKiBBdXRob3I6IE5laWwgQXJtc3Ryb25nIDxuYXJtc3Ryb25nQGJheWxpYnJlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQmF5TGlicmUsIFNBUy4KKyAqIEF1dGhvcjogTmVpbCBBcm1zdHJvbmcgPG5hcm1zdHJvbmdAYmF5bGlicmUuY29tPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgRFRfQklORElOR1NfQ0xPQ0tfQU1MT0dJQ19NRVNPTl9HWEJCX0FPQ0xLCisjZGVmaW5lIERUX0JJTkRJTkdTX0NMT0NLX0FNTE9HSUNfTUVTT05fR1hCQl9BT0NMSworCisjZGVmaW5lIENMS0lEX0FPX1JFTU9URQkJMAorI2RlZmluZSBDTEtJRF9BT19JMkNfTUFTVEVSCTEKKyNkZWZpbmUgQ0xLSURfQU9fSTJDX1NMQVZFCTIKKyNkZWZpbmUgQ0xLSURfQU9fVUFSVDEJCTMKKyNkZWZpbmUgQ0xLSURfQU9fVUFSVDIJCTQKKyNkZWZpbmUgQ0xLSURfQU9fSVJfQkxBU1RFUgk1CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9neGJiLWNsa2MuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZ3hiYi1jbGtjLmgKaW5kZXggZjg4OWQ4MC4uY2U0YWQ2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9neGJiLWNsa2MuaAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2d4YmItY2xrYy5oCkBAIC02LDcgKzYsMTQgQEAKICNkZWZpbmUgX19HWEJCX0NMS0NfSAogCiAjZGVmaW5lIENMS0lEX0NQVUNMSwkJMQorI2RlZmluZSBDTEtJRF9IRE1JX1BMTAkJMgorI2RlZmluZSBDTEtJRF9GQ0xLX0RJVjIJCTQKKyNkZWZpbmUgQ0xLSURfRkNMS19ESVYzCQk1CisjZGVmaW5lIENMS0lEX0ZDTEtfRElWNAkJNgogI2RlZmluZSBDTEtJRF9DTEs4MQkJMTIKICNkZWZpbmUgQ0xLSURfRVRICQkzNgorI2RlZmluZSBDTEtJRF9TRF9FTU1DX0EJCTk0CisjZGVmaW5lIENMS0lEX1NEX0VNTUNfQgkJOTUKKyNkZWZpbmUgQ0xLSURfU0RfRU1NQ19DCQk5NgogCiAjZW5kaWYgLyogX19HWEJCX0NMS0NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9pbXg1LWNsb2NrLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2lteDUtY2xvY2suaAppbmRleCBmNGI3NDc4Li5kMzgyZmM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2lteDUtY2xvY2suaAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2lteDUtY2xvY2suaApAQCAtMjAxLDYgKzIwMSwxOSBAQAogI2RlZmluZSBJTVg1X0NMS19TVEVQX1NFTAkJMTg5CiAjZGVmaW5lIElNWDVfQ0xLX0NQVV9QT0RGX1NFTAkJMTkwCiAjZGVmaW5lIElNWDVfQ0xLX0FSTQkJCTE5MQotI2RlZmluZSBJTVg1X0NMS19FTkQJCQkxOTIKKyNkZWZpbmUgSU1YNV9DTEtfRklSSV9QUkVECQkxOTIKKyNkZWZpbmUgSU1YNV9DTEtfRklSSV9TRUwJCTE5MworI2RlZmluZSBJTVg1X0NMS19GSVJJX1BPREYJCTE5NAorI2RlZmluZSBJTVg1X0NMS19GSVJJX1NFUklBTF9HQVRFCTE5NQorI2RlZmluZSBJTVg1X0NMS19GSVJJX0lQR19HQVRFCQkxOTYKKyNkZWZpbmUgSU1YNV9DTEtfQ1NJMF9NQ0xLMV9QUkVECTE5NworI2RlZmluZSBJTVg1X0NMS19DU0kwX01DTEsxX1NFTAkJMTk4CisjZGVmaW5lIElNWDVfQ0xLX0NTSTBfTUNMSzFfUE9ERgkxOTkKKyNkZWZpbmUgSU1YNV9DTEtfQ1NJMF9NQ0xLMV9HQVRFCTIwMAorI2RlZmluZSBJTVg1X0NMS19JRUVFMTU4OF9QUkVECQkyMDEKKyNkZWZpbmUgSU1YNV9DTEtfSUVFRTE1ODhfU0VMCQkyMDIKKyNkZWZpbmUgSU1YNV9DTEtfSUVFRTE1ODhfUE9ERgkJMjAzCisjZGVmaW5lIElNWDVfQ0xLX0lFRUUxNTg4X0dBVEUJCTIwNAorI2RlZmluZSBJTVg1X0NMS19FTkQJCQkyMDUKIAogI2VuZGlmIC8qIF9fRFRfQklORElOR1NfQ0xPQ0tfSU1YNV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2lteDZxZGwtY2xvY2suaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svaW14NnFkbC1jbG9jay5oCmluZGV4IDI5MDUwMzMuLmRhNTlmZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svaW14NnFkbC1jbG9jay5oCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svaW14NnFkbC1jbG9jay5oCkBAIC0yNjksNiArMjY5LDggQEAKICNkZWZpbmUgSU1YNlFETF9DTEtfUFJHMF9BUEIJCQkyNTYKICNkZWZpbmUgSU1YNlFETF9DTEtfUFJHMV9BUEIJCQkyNTcKICNkZWZpbmUgSU1YNlFETF9DTEtfUFJFX0FYSQkJCTI1OAotI2RlZmluZSBJTVg2UURMX0NMS19FTkQJCQkJMjU5CisjZGVmaW5lIElNWDZRRExfQ0xLX01MQl9TRUwJCQkyNTkKKyNkZWZpbmUgSU1YNlFETF9DTEtfTUxCX1BPREYJCQkyNjAKKyNkZWZpbmUgSU1YNlFETF9DTEtfRU5ECQkJCTI2MQogCiAjZW5kaWYgLyogX19EVF9CSU5ESU5HU19DTE9DS19JTVg2UURMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc2MjAuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc2MjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmFiYTI4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzYyMC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTlZJRElBIENPUlBPUkFUSU9OLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogRGV2aWNlIFRyZWUgYmluZGluZyBjb25zdGFudHMgY2xvY2tzIGZvciB0aGUgTWF4aW0gNzc2MjAgUE1JQy4KKyAqLworCisjaWZuZGVmIF9EVF9CSU5ESU5HU19DTE9DS19NQVhJTV9NQVg3NzYyMF9DTE9DS19ICisjZGVmaW5lIF9EVF9CSU5ESU5HU19DTE9DS19NQVhJTV9NQVg3NzYyMF9DTE9DS19ICisKKy8qIEZpeGVkIHJhdGUgY2xvY2tzLiAqLworCisjZGVmaW5lIE1BWDc3NjIwX0NMS18zMktfT1VUMAkJMAorCisvKiBUb3RhbCBudW1iZXIgb2YgY2xvY2tzLiAqLworI2RlZmluZSBNQVg3NzYyMF9DTEtTX05VTQkJKE1BWDc3NjIwX0NMS18zMktfT1VUMCArIDEpCisKKyNlbmRpZiAvKiBfRFRfQklORElOR1NfQ0xPQ0tfTUFYSU1fTUFYNzc2MjBfQ0xPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9tZXNvbjhiLWNsa2MuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svbWVzb244Yi1jbGtjLmgKaW5kZXggNTk1YTU4ZC4uYTU1ZmY4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9tZXNvbjhiLWNsa2MuaAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL21lc29uOGItY2xrYy5oCkBAIC0yMiw2ICsyMiw0IEBACiAjZGVmaW5lIENMS0lEX01QRUdfU0VMCQkxNAogI2RlZmluZSBDTEtJRF9NUEVHX0RJVgkJMTUKIAotI2RlZmluZSBDTEtfTlJfQ0xLUwkJKENMS0lEX01QRUdfRElWICsgMSkKLQogI2VuZGlmIC8qIF9fTUVTT044Ql9DTEtDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svbXQyNzAxLWNsay5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9tdDI3MDEtY2xrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA2MmM2NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svbXQyNzAxLWNsay5oCkBAIC0wLDAgKzEsNDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IE1lZGlhVGVrIEluYy4KKyAqIEF1dGhvcjogU2h1bmxpIFdhbmcgPHNodW5saS53YW5nQG1lZGlhdGVrLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfRFRfQklORElOR1NfQ0xLX01UMjcwMV9ICisjZGVmaW5lIF9EVF9CSU5ESU5HU19DTEtfTVQyNzAxX0gKKworLyogVE9QQ0tHRU4gKi8KKyNkZWZpbmUgQ0xLX1RPUF9TWVNQTEwJCQkJMQorI2RlZmluZSBDTEtfVE9QX1NZU1BMTF9EMgkJCTIKKyNkZWZpbmUgQ0xLX1RPUF9TWVNQTExfRDMJCQkzCisjZGVmaW5lIENMS19UT1BfU1lTUExMX0Q1CQkJNAorI2RlZmluZSBDTEtfVE9QX1NZU1BMTF9ENwkJCTUKKyNkZWZpbmUgQ0xLX1RPUF9TWVNQTEwxX0QyCQkJNgorI2RlZmluZSBDTEtfVE9QX1NZU1BMTDFfRDQJCQk3CisjZGVmaW5lIENMS19UT1BfU1lTUExMMV9EOAkJCTgKKyNkZWZpbmUgQ0xLX1RPUF9TWVNQTEwxX0QxNgkJCTkKKyNkZWZpbmUgQ0xLX1RPUF9TWVNQTEwyX0QyCQkJMTAKKyNkZWZpbmUgQ0xLX1RPUF9TWVNQTEwyX0Q0CQkJMTEKKyNkZWZpbmUgQ0xLX1RPUF9TWVNQTEwyX0Q4CQkJMTIKKyNkZWZpbmUgQ0xLX1RPUF9TWVNQTEwzX0QyCQkJMTMKKyNkZWZpbmUgQ0xLX1RPUF9TWVNQTEwzX0Q0CQkJMTQKKyNkZWZpbmUgQ0xLX1RPUF9TWVNQTEw0X0QyCQkJMTUKKyNkZWZpbmUgQ0xLX1RPUF9TWVNQTEw0X0Q0CQkJMTYKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMCQkJCTE3CisjZGVmaW5lIENMS19UT1BfVU5JVlBMTF9EMgkJCTE4CisjZGVmaW5lIENMS19UT1BfVU5JVlBMTF9EMwkJCTE5CisjZGVmaW5lIENMS19UT1BfVU5JVlBMTF9ENQkJCTIwCisjZGVmaW5lIENMS19UT1BfVU5JVlBMTF9ENwkJCTIxCisjZGVmaW5lIENMS19UT1BfVU5JVlBMTF9EMjYJCQkyMgorI2RlZmluZSBDTEtfVE9QX1VOSVZQTExfRDUyCQkJMjMKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMX0QxMDgJCQkyNAorI2RlZmluZSBDTEtfVE9QX1VTQl9QSFk0OE0JCQkyNQorI2RlZmluZSBDTEtfVE9QX1VOSVZQTEwxX0QyCQkJMjYKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMMV9ENAkJCTI3CisjZGVmaW5lIENMS19UT1BfVU5JVlBMTDFfRDgJCQkyOAorI2RlZmluZSBDTEtfVE9QX1VOSVZQTEwyX0QyCQkJMjkKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMMl9ENAkJCTMwCisjZGVmaW5lIENMS19UT1BfVU5JVlBMTDJfRDgJCQkzMQorI2RlZmluZSBDTEtfVE9QX1VOSVZQTEwyX0QxNgkJCTMyCisjZGVmaW5lIENMS19UT1BfVU5JVlBMTDJfRDMyCQkJMzMKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMM19EMgkJCTM0CisjZGVmaW5lIENMS19UT1BfVU5JVlBMTDNfRDQJCQkzNQorI2RlZmluZSBDTEtfVE9QX1VOSVZQTEwzX0Q4CQkJMzYKKyNkZWZpbmUgQ0xLX1RPUF9NU0RDUExMCQkJCTM3CisjZGVmaW5lIENMS19UT1BfTVNEQ1BMTF9EMgkJCTM4CisjZGVmaW5lIENMS19UT1BfTVNEQ1BMTF9ENAkJCTM5CisjZGVmaW5lIENMS19UT1BfTVNEQ1BMTF9EOAkJCTQwCisjZGVmaW5lIENMS19UT1BfTU1QTEwJCQkJNDEKKyNkZWZpbmUgQ0xLX1RPUF9NTVBMTF9EMgkJCTQyCisjZGVmaW5lIENMS19UT1BfRE1QTEwJCQkJNDMKKyNkZWZpbmUgQ0xLX1RPUF9ETVBMTF9EMgkJCTQ0CisjZGVmaW5lIENMS19UT1BfRE1QTExfRDQJCQk0NQorI2RlZmluZSBDTEtfVE9QX0RNUExMX1gyCQkJNDYKKyNkZWZpbmUgQ0xLX1RPUF9UVkRQTEwJCQkJNDcKKyNkZWZpbmUgQ0xLX1RPUF9UVkRQTExfRDIJCQk0OAorI2RlZmluZSBDTEtfVE9QX1RWRFBMTF9ENAkJCTQ5CisjZGVmaW5lIENMS19UT1BfVFZEMlBMTAkJCQk1MAorI2RlZmluZSBDTEtfVE9QX1RWRDJQTExfRDIJCQk1MQorI2RlZmluZSBDTEtfVE9QX0hBRERTMlBMTF85OE0JCQk1MgorI2RlZmluZSBDTEtfVE9QX0hBRERTMlBMTF8yOTRNCQkJNTMKKyNkZWZpbmUgQ0xLX1RPUF9IQUREUzJfRkIJCQk1NAorI2RlZmluZSBDTEtfVE9QX01JUElQTExfRDIJCQk1NQorI2RlZmluZSBDTEtfVE9QX01JUElQTExfRDQJCQk1NgorI2RlZmluZSBDTEtfVE9QX0hETUlQTEwJCQkJNTcKKyNkZWZpbmUgQ0xLX1RPUF9IRE1JUExMX0QyCQkJNTgKKyNkZWZpbmUgQ0xLX1RPUF9IRE1JUExMX0QzCQkJNTkKKyNkZWZpbmUgQ0xLX1RPUF9IRE1JX1NDTF9SWAkJCTYwCisjZGVmaW5lIENMS19UT1BfSERNSV8wX1BJWDM0ME0JCQk2MQorI2RlZmluZSBDTEtfVE9QX0hETUlfMF9ERUVQMzQwTQkJCTYyCisjZGVmaW5lIENMS19UT1BfSERNSV8wX1BMTDM0ME0JCQk2MworI2RlZmluZSBDTEtfVE9QX0FVRDFQTExfOThNCQkJNjQKKyNkZWZpbmUgQ0xLX1RPUF9BVUQyUExMXzkwTQkJCTY1CisjZGVmaW5lIENMS19UT1BfQVVEUExMCQkJCTY2CisjZGVmaW5lIENMS19UT1BfQVVEUExMX0Q0CQkJNjcKKyNkZWZpbmUgQ0xLX1RPUF9BVURQTExfRDgJCQk2OAorI2RlZmluZSBDTEtfVE9QX0FVRFBMTF9EMTYJCQk2OQorI2RlZmluZSBDTEtfVE9QX0FVRFBMTF9EMjQJCQk3MAorI2RlZmluZSBDTEtfVE9QX0VUSFBMTF81MDBNCQkJNzEKKyNkZWZpbmUgQ0xLX1RPUF9WREVDUExMCQkJCTcyCisjZGVmaW5lIENMS19UT1BfVkVOQ1BMTAkJCQk3MworI2RlZmluZSBDTEtfVE9QX01JUElQTEwJCQkJNzQKKyNkZWZpbmUgQ0xLX1RPUF9BUk1QTExfMVAzRwkJCTc1CisKKyNkZWZpbmUgQ0xLX1RPUF9NTV9TRUwJCQkJNzYKKyNkZWZpbmUgQ0xLX1RPUF9ERFJQSFlDRkdfU0VMCQkJNzcKKyNkZWZpbmUgQ0xLX1RPUF9NRU1fU0VMCQkJCTc4CisjZGVmaW5lIENMS19UT1BfQVhJX1NFTAkJCQk3OQorI2RlZmluZSBDTEtfVE9QX0NBTVRHX1NFTAkJCTgwCisjZGVmaW5lIENMS19UT1BfTUZHX1NFTAkJCQk4MQorI2RlZmluZSBDTEtfVE9QX1ZERUNfU0VMCQkJODIKKyNkZWZpbmUgQ0xLX1RPUF9QV01fU0VMCQkJCTgzCisjZGVmaW5lIENMS19UT1BfTVNEQzMwXzBfU0VMCQkJODQKKyNkZWZpbmUgQ0xLX1RPUF9VU0IyMF9TRUwJCQk4NQorI2RlZmluZSBDTEtfVE9QX1NQSTBfU0VMCQkJODYKKyNkZWZpbmUgQ0xLX1RPUF9VQVJUX1NFTAkJCTg3CisjZGVmaW5lIENMS19UT1BfQVVESU5UQlVTX1NFTAkJCTg4CisjZGVmaW5lIENMS19UT1BfQVVESU9fU0VMCQkJODkKKyNkZWZpbmUgQ0xLX1RPUF9NU0RDMzBfMl9TRUwJCQk5MAorI2RlZmluZSBDTEtfVE9QX01TREMzMF8xX1NFTAkJCTkxCisjZGVmaW5lIENMS19UT1BfRFBJMV9TRUwJCQk5MgorI2RlZmluZSBDTEtfVE9QX0RQSTBfU0VMCQkJOTMKKyNkZWZpbmUgQ0xLX1RPUF9TQ1BfU0VMCQkJCTk0CisjZGVmaW5lIENMS19UT1BfUE1JQ1NQSV9TRUwJCQk5NQorI2RlZmluZSBDTEtfVE9QX0FQTExfU0VMCQkJOTYKKyNkZWZpbmUgQ0xLX1RPUF9IRE1JX1NFTAkJCTk3CisjZGVmaW5lIENMS19UT1BfVFZFX1NFTAkJCQk5OAorI2RlZmluZSBDTEtfVE9QX0VNTUNfSENMS19TRUwJCQk5OQorI2RlZmluZSBDTEtfVE9QX05GSTJYX1NFTAkJCTEwMAorI2RlZmluZSBDTEtfVE9QX1JUQ19TRUwJCQkJMTAxCisjZGVmaW5lIENMS19UT1BfT1NEX1NFTAkJCQkxMDIKKyNkZWZpbmUgQ0xLX1RPUF9OUl9TRUwJCQkJMTAzCisjZGVmaW5lIENMS19UT1BfRElfU0VMCQkJCTEwNAorI2RlZmluZSBDTEtfVE9QX0ZMQVNIX1NFTAkJCTEwNQorI2RlZmluZSBDTEtfVE9QX0FTTV9NX1NFTAkJCTEwNgorI2RlZmluZSBDTEtfVE9QX0FTTV9JX1NFTAkJCTEwNworI2RlZmluZSBDTEtfVE9QX0lOVERJUl9TRUwJCQkxMDgKKyNkZWZpbmUgQ0xLX1RPUF9IRE1JUlhfQklTVF9TRUwJCQkxMDkKKyNkZWZpbmUgQ0xLX1RPUF9FVEhJRl9TRUwJCQkxMTAKKyNkZWZpbmUgQ0xLX1RPUF9NU19DQVJEX1NFTAkJCTExMQorI2RlZmluZSBDTEtfVE9QX0FTTV9IX1NFTAkJCTExMgorI2RlZmluZSBDTEtfVE9QX1NQSTFfU0VMCQkJMTEzCisjZGVmaW5lIENMS19UT1BfQ01TWVNfU0VMCQkJMTE0CisjZGVmaW5lIENMS19UT1BfTVNEQzMwXzNfU0VMCQkJMTE1CisjZGVmaW5lIENMS19UT1BfSERNSVJYMjZfMjRfU0VMCQkJMTE2CisjZGVmaW5lIENMS19UT1BfQVVEMkRWRF9TRUwJCQkxMTcKKyNkZWZpbmUgQ0xLX1RPUF84QkRBQ19TRUwJCQkxMTgKKyNkZWZpbmUgQ0xLX1RPUF9TUEkyX1NFTAkJCTExOQorI2RlZmluZSBDTEtfVE9QX0FVRF9NVVgxX1NFTAkJCTEyMAorI2RlZmluZSBDTEtfVE9QX0FVRF9NVVgyX1NFTAkJCTEyMQorI2RlZmluZSBDTEtfVE9QX0FVRFBMTF9NVVhfU0VMCQkJMTIyCisjZGVmaW5lIENMS19UT1BfQVVEX0sxX1NSQ19TRUwJCQkxMjMKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSzJfU1JDX1NFTAkJCTEyNAorI2RlZmluZSBDTEtfVE9QX0FVRF9LM19TUkNfU0VMCQkJMTI1CisjZGVmaW5lIENMS19UT1BfQVVEX0s0X1NSQ19TRUwJCQkxMjYKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSzVfU1JDX1NFTAkJCTEyNworI2RlZmluZSBDTEtfVE9QX0FVRF9LNl9TUkNfU0VMCQkJMTI4CisjZGVmaW5lIENMS19UT1BfUEFETUNMS19TRUwJCQkxMjkKKyNkZWZpbmUgQ0xLX1RPUF9BVURfRVhUQ0sxX0RJVgkJCTEzMAorI2RlZmluZSBDTEtfVE9QX0FVRF9FWFRDSzJfRElWCQkJMTMxCisjZGVmaW5lIENMS19UT1BfQVVEX01VWDFfRElWCQkJMTMyCisjZGVmaW5lIENMS19UT1BfQVVEX01VWDJfRElWCQkJMTMzCisjZGVmaW5lIENMS19UT1BfQVVEX0sxX1NSQ19ESVYJCQkxMzQKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSzJfU1JDX0RJVgkJCTEzNQorI2RlZmluZSBDTEtfVE9QX0FVRF9LM19TUkNfRElWCQkJMTM2CisjZGVmaW5lIENMS19UT1BfQVVEX0s0X1NSQ19ESVYJCQkxMzcKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSzVfU1JDX0RJVgkJCTEzOAorI2RlZmluZSBDTEtfVE9QX0FVRF9LNl9TUkNfRElWCQkJMTM5CisjZGVmaW5lIENMS19UT1BfQVVEX0kyUzFfTUNMSwkJCTE0MAorI2RlZmluZSBDTEtfVE9QX0FVRF9JMlMyX01DTEsJCQkxNDEKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSTJTM19NQ0xLCQkJMTQyCisjZGVmaW5lIENMS19UT1BfQVVEX0kyUzRfTUNMSwkJCTE0MworI2RlZmluZSBDTEtfVE9QX0FVRF9JMlM1X01DTEsJCQkxNDQKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSTJTNl9NQ0xLCQkJMTQ1CisjZGVmaW5lIENMS19UT1BfQVVEXzQ4S19USU1JTkcJCQkxNDYKKyNkZWZpbmUgQ0xLX1RPUF9BVURfNDRLX1RJTUlORwkJCTE0NworCisjZGVmaW5lIENMS19UT1BfMzJLX0lOVEVSTkFMCQkJMTQ4CisjZGVmaW5lIENMS19UT1BfMzJLX0VYVEVSTkFMCQkJMTQ5CisjZGVmaW5lIENMS19UT1BfQ0xLMjZNX0Q4CQkJMTUwCisjZGVmaW5lIENMS19UT1BfOEJEQUMJCQkJMTUxCisjZGVmaW5lIENMS19UT1BfV0JHX0RJR180MTZNCQkJMTUyCisjZGVmaW5lIENMS19UT1BfRFBJCQkJCTE1MworI2RlZmluZSBDTEtfVE9QX0hETUlUWF9DTEtESUdfQ1RTCQkxNTQKKyNkZWZpbmUgQ0xLX1RPUF9EU0kwX0xOVENfRFNJCQkJMTU1CisjZGVmaW5lIENMS19UT1BfQVVEX0VYVDEJCQkxNTYKKyNkZWZpbmUgQ0xLX1RPUF9BVURfRVhUMgkJCTE1NworI2RlZmluZSBDTEtfVE9QX05GSTFYX1BBRAkJCTE1OAorI2RlZmluZSBDTEtfVE9QX05SCQkJCTE1OQorCisvKiBBUE1JWEVEU1lTICovCisKKyNkZWZpbmUgQ0xLX0FQTUlYRURfQVJNUExMCQkJMQorI2RlZmluZSBDTEtfQVBNSVhFRF9NQUlOUExMCQkJMgorI2RlZmluZSBDTEtfQVBNSVhFRF9VTklWUExMCQkJMworI2RlZmluZSBDTEtfQVBNSVhFRF9NTVBMTAkJCTQKKyNkZWZpbmUgQ0xLX0FQTUlYRURfTVNEQ1BMTAkJCTUKKyNkZWZpbmUgQ0xLX0FQTUlYRURfVFZEUExMCQkJNgorI2RlZmluZSBDTEtfQVBNSVhFRF9BVUQxUExMCQkJNworI2RlZmluZSBDTEtfQVBNSVhFRF9UUkdQTEwJCQk4CisjZGVmaW5lIENMS19BUE1JWEVEX0VUSFBMTAkJCTkKKyNkZWZpbmUgQ0xLX0FQTUlYRURfVkRFQ1BMTAkJCTEwCisjZGVmaW5lIENMS19BUE1JWEVEX0hBRERTMlBMTAkJCTExCisjZGVmaW5lIENMS19BUE1JWEVEX0FVRDJQTEwJCQkxMgorI2RlZmluZSBDTEtfQVBNSVhFRF9UVkQyUExMCQkJMTMKKyNkZWZpbmUgQ0xLX0FQTUlYRURfTlIJCQkJMTQKKworLyogRERSUEhZICovCisKKyNkZWZpbmUgQ0xLX0REUlBIWV9WRU5DUExMCQkJMQorI2RlZmluZSBDTEtfRERSUEhZX05SCQkJCTIKKworLyogSU5GUkFDRkcgKi8KKworI2RlZmluZSBDTEtfSU5GUkFfREJHCQkJCTEKKyNkZWZpbmUgQ0xLX0lORlJBX1NNSQkJCQkyCisjZGVmaW5lIENMS19JTkZSQV9RQVhJX0NNNAkJCTMKKyNkZWZpbmUgQ0xLX0lORlJBX0FVRF9TUExJTl9CCQkJNAorI2RlZmluZSBDTEtfSU5GUkFfQVVESU8JCQkJNQorI2RlZmluZSBDTEtfSU5GUkFfRUZVU0UJCQkJNgorI2RlZmluZSBDTEtfSU5GUkFfTDJDX1NSQU0JCQk3CisjZGVmaW5lIENMS19JTkZSQV9NNFUJCQkJOAorI2RlZmluZSBDTEtfSU5GUkFfQ09OTk1DVQkJCTkKKyNkZWZpbmUgQ0xLX0lORlJBX1RSTkcJCQkJMTAKKyNkZWZpbmUgQ0xLX0lORlJBX1JBTUJVRklGCQkJMTEKKyNkZWZpbmUgQ0xLX0lORlJBX0NQVU0JCQkJMTIKKyNkZWZpbmUgQ0xLX0lORlJBX0tQCQkJCTEzCisjZGVmaW5lIENMS19JTkZSQV9DRUMJCQkJMTQKKyNkZWZpbmUgQ0xLX0lORlJBX0lSUlgJCQkJMTUKKyNkZWZpbmUgQ0xLX0lORlJBX1BNSUNTUEkJCQkxNgorI2RlZmluZSBDTEtfSU5GUkFfUE1JQ1dSQVAJCQkxNworI2RlZmluZSBDTEtfSU5GUkFfRERDQ0kJCQkJMTgKKyNkZWZpbmUgQ0xLX0lORlJBX0NMS18xM00JCQkxOQorI2RlZmluZSBDTEtfSU5GUkFfTlIJCQkJMjAKKworLyogUEVSSUNGRyAqLworCisjZGVmaW5lIENMS19QRVJJX05GSQkJCQkxCisjZGVmaW5lIENMS19QRVJJX1RIRVJNCQkJCTIKKyNkZWZpbmUgQ0xLX1BFUklfUFdNMQkJCQkzCisjZGVmaW5lIENMS19QRVJJX1BXTTIJCQkJNAorI2RlZmluZSBDTEtfUEVSSV9QV00zCQkJCTUKKyNkZWZpbmUgQ0xLX1BFUklfUFdNNAkJCQk2CisjZGVmaW5lIENMS19QRVJJX1BXTTUJCQkJNworI2RlZmluZSBDTEtfUEVSSV9QV002CQkJCTgKKyNkZWZpbmUgQ0xLX1BFUklfUFdNNwkJCQk5CisjZGVmaW5lIENMS19QRVJJX1BXTQkJCQkxMAorI2RlZmluZSBDTEtfUEVSSV9VU0IwCQkJCTExCisjZGVmaW5lIENMS19QRVJJX1VTQjEJCQkJMTIKKyNkZWZpbmUgQ0xLX1BFUklfQVBfRE1BCQkJCTEzCisjZGVmaW5lIENMS19QRVJJX01TREMzMF8wCQkJMTQKKyNkZWZpbmUgQ0xLX1BFUklfTVNEQzMwXzEJCQkxNQorI2RlZmluZSBDTEtfUEVSSV9NU0RDMzBfMgkJCTE2CisjZGVmaW5lIENMS19QRVJJX01TREMzMF8zCQkJMTcKKyNkZWZpbmUgQ0xLX1BFUklfTVNEQzUwXzMJCQkxOAorI2RlZmluZSBDTEtfUEVSSV9OTEkJCQkJMTkKKyNkZWZpbmUgQ0xLX1BFUklfVUFSVDAJCQkJMjAKKyNkZWZpbmUgQ0xLX1BFUklfVUFSVDEJCQkJMjEKKyNkZWZpbmUgQ0xLX1BFUklfVUFSVDIJCQkJMjIKKyNkZWZpbmUgQ0xLX1BFUklfVUFSVDMJCQkJMjMKKyNkZWZpbmUgQ0xLX1BFUklfQlRJRgkJCQkyNAorI2RlZmluZSBDTEtfUEVSSV9JMkMwCQkJCTI1CisjZGVmaW5lIENMS19QRVJJX0kyQzEJCQkJMjYKKyNkZWZpbmUgQ0xLX1BFUklfSTJDMgkJCQkyNworI2RlZmluZSBDTEtfUEVSSV9JMkMzCQkJCTI4CisjZGVmaW5lIENMS19QRVJJX0FVWEFEQwkJCQkyOQorI2RlZmluZSBDTEtfUEVSSV9TUEkwCQkJCTMwCisjZGVmaW5lIENMS19QRVJJX0VUSAkJCQkzMQorI2RlZmluZSBDTEtfUEVSSV9VU0IwX01DVQkJCTMyCisKKyNkZWZpbmUgQ0xLX1BFUklfVVNCMV9NQ1UJCQkzMworI2RlZmluZSBDTEtfUEVSSV9VU0JfU0xWCQkJMzQKKyNkZWZpbmUgQ0xLX1BFUklfR0NQVQkJCQkzNQorI2RlZmluZSBDTEtfUEVSSV9ORklfRUNDCQkJMzYKKyNkZWZpbmUgQ0xLX1BFUklfTkZJX1BBRAkJCTM3CisjZGVmaW5lIENMS19QRVJJX0ZMQVNICQkJCTM4CisjZGVmaW5lIENMS19QRVJJX0hPU1Q4OV9JTlQJCQkzOQorI2RlZmluZSBDTEtfUEVSSV9IT1NUODlfU1BJCQkJNDAKKyNkZWZpbmUgQ0xLX1BFUklfSE9TVDg5X0RWRAkJCTQxCisjZGVmaW5lIENMS19QRVJJX1NQSTEJCQkJNDIKKyNkZWZpbmUgQ0xLX1BFUklfU1BJMgkJCQk0MworI2RlZmluZSBDTEtfUEVSSV9GQ0kJCQkJNDQKKworI2RlZmluZSBDTEtfUEVSSV9VQVJUMF9TRUwJCQk0NQorI2RlZmluZSBDTEtfUEVSSV9VQVJUMV9TRUwJCQk0NgorI2RlZmluZSBDTEtfUEVSSV9VQVJUMl9TRUwJCQk0NworI2RlZmluZSBDTEtfUEVSSV9VQVJUM19TRUwJCQk0OAorI2RlZmluZSBDTEtfUEVSSV9OUgkJCQk0OQorCisvKiBBVURJTyAqLworCisjZGVmaW5lIENMS19BVURfQUZFCQkJCTEKKyNkZWZpbmUgQ0xLX0FVRF9MUkNLX0RFVEVDVAkJCTIKKyNkZWZpbmUgQ0xLX0FVRF9JMlMJCQkJMworI2RlZmluZSBDTEtfQVVEX0FQTExfVFVORVIJCQk0CisjZGVmaW5lIENMS19BVURfSERNSQkJCQk1CisjZGVmaW5lIENMS19BVURfU1BERgkJCQk2CisjZGVmaW5lIENMS19BVURfU1BERjIJCQkJNworI2RlZmluZSBDTEtfQVVEX0FQTEwJCQkJOAorI2RlZmluZSBDTEtfQVVEX1RNTAkJCQk5CisjZGVmaW5lIENMS19BVURfQUhCX0lETEVfRVhUCQkJMTAKKyNkZWZpbmUgQ0xLX0FVRF9BSEJfSURMRV9JTlQJCQkxMQorCisjZGVmaW5lIENMS19BVURfSTJTSU4xCQkJCTEyCisjZGVmaW5lIENMS19BVURfSTJTSU4yCQkJCTEzCisjZGVmaW5lIENMS19BVURfSTJTSU4zCQkJCTE0CisjZGVmaW5lIENMS19BVURfSTJTSU40CQkJCTE1CisjZGVmaW5lIENMS19BVURfSTJTSU41CQkJCTE2CisjZGVmaW5lIENMS19BVURfSTJTSU42CQkJCTE3CisjZGVmaW5lIENMS19BVURfSTJTTzEJCQkJMTgKKyNkZWZpbmUgQ0xLX0FVRF9JMlNPMgkJCQkxOQorI2RlZmluZSBDTEtfQVVEX0kyU08zCQkJCTIwCisjZGVmaW5lIENMS19BVURfSTJTTzQJCQkJMjEKKyNkZWZpbmUgQ0xLX0FVRF9JMlNPNQkJCQkyMgorI2RlZmluZSBDTEtfQVVEX0kyU082CQkJCTIzCisjZGVmaW5lIENMS19BVURfQVNSQ0kxCQkJCTI0CisjZGVmaW5lIENMS19BVURfQVNSQ0kyCQkJCTI1CisjZGVmaW5lIENMS19BVURfQVNSQ08xCQkJCTI2CisjZGVmaW5lIENMS19BVURfQVNSQ08yCQkJCTI3CisjZGVmaW5lIENMS19BVURfQVNSQzExCQkJCTI4CisjZGVmaW5lIENMS19BVURfQVNSQzEyCQkJCTI5CisjZGVmaW5lIENMS19BVURfSERNSVJYCQkJCTMwCisjZGVmaW5lIENMS19BVURfSU5URElSCQkJCTMxCisjZGVmaW5lIENMS19BVURfQTFTWVMJCQkJMzIKKyNkZWZpbmUgQ0xLX0FVRF9BMlNZUwkJCQkzMworI2RlZmluZSBDTEtfQVVEX0FGRV9DT05OCQkJMzQKKyNkZWZpbmUgQ0xLX0FVRF9BRkVfUENNSUYJCQkzNQorI2RlZmluZSBDTEtfQVVEX0FGRV9NUkdJRgkJCTM2CisKKyNkZWZpbmUgQ0xLX0FVRF9NTUlGX1VMMQkJCTM3CisjZGVmaW5lIENMS19BVURfTU1JRl9VTDIJCQkzOAorI2RlZmluZSBDTEtfQVVEX01NSUZfVUwzCQkJMzkKKyNkZWZpbmUgQ0xLX0FVRF9NTUlGX1VMNAkJCTQwCisjZGVmaW5lIENMS19BVURfTU1JRl9VTDUJCQk0MQorI2RlZmluZSBDTEtfQVVEX01NSUZfVUw2CQkJNDIKKyNkZWZpbmUgQ0xLX0FVRF9NTUlGX0RMMQkJCTQzCisjZGVmaW5lIENMS19BVURfTU1JRl9ETDIJCQk0NAorI2RlZmluZSBDTEtfQVVEX01NSUZfREwzCQkJNDUKKyNkZWZpbmUgQ0xLX0FVRF9NTUlGX0RMNAkJCTQ2CisjZGVmaW5lIENMS19BVURfTU1JRl9ETDUJCQk0NworI2RlZmluZSBDTEtfQVVEX01NSUZfREw2CQkJNDgKKyNkZWZpbmUgQ0xLX0FVRF9NTUlGX0RMTUNICQkJNDkKKyNkZWZpbmUgQ0xLX0FVRF9NTUlGX0FSQjEJCQk1MAorI2RlZmluZSBDTEtfQVVEX01NSUZfQVdCMQkJCTUxCisjZGVmaW5lIENMS19BVURfTU1JRl9BV0IyCQkJNTIKKyNkZWZpbmUgQ0xLX0FVRF9NTUlGX0RBSQkJCTUzCisKKyNkZWZpbmUgQ0xLX0FVRF9ETUlDMQkJCQk1NAorI2RlZmluZSBDTEtfQVVEX0RNSUMyCQkJCTU1CisjZGVmaW5lIENMS19BVURfQVNSQ0kzCQkJCTU2CisjZGVmaW5lIENMS19BVURfQVNSQ0k0CQkJCTU3CisjZGVmaW5lIENMS19BVURfQVNSQ0k1CQkJCTU4CisjZGVmaW5lIENMS19BVURfQVNSQ0k2CQkJCTU5CisjZGVmaW5lIENMS19BVURfQVNSQ08zCQkJCTYwCisjZGVmaW5lIENMS19BVURfQVNSQ080CQkJCTYxCisjZGVmaW5lIENMS19BVURfQVNSQ081CQkJCTYyCisjZGVmaW5lIENMS19BVURfQVNSQ082CQkJCTYzCisjZGVmaW5lIENMS19BVURfTUVNX0FTUkMxCQkJNjQKKyNkZWZpbmUgQ0xLX0FVRF9NRU1fQVNSQzIJCQk2NQorI2RlZmluZSBDTEtfQVVEX01FTV9BU1JDMwkJCTY2CisjZGVmaW5lIENMS19BVURfTUVNX0FTUkM0CQkJNjcKKyNkZWZpbmUgQ0xLX0FVRF9NRU1fQVNSQzUJCQk2OAorI2RlZmluZSBDTEtfQVVEX0RTRF9FTkMJCQkJNjkKKyNkZWZpbmUgQ0xLX0FVRF9BU1JDX0JSRwkJCTcwCisjZGVmaW5lIENMS19BVURfTlIJCQkJNzEKKworLyogTU1TWVMgKi8KKworI2RlZmluZSBDTEtfTU1fU01JX0NPTU1PTgkJCTEKKyNkZWZpbmUgQ0xLX01NX1NNSV9MQVJCMAkJCTIKKyNkZWZpbmUgQ0xLX01NX0NNRFEJCQkJMworI2RlZmluZSBDTEtfTU1fTVVURVgJCQkJNAorI2RlZmluZSBDTEtfTU1fRElTUF9DT0xPUgkJCTUKKyNkZWZpbmUgQ0xLX01NX0RJU1BfQkxTCQkJCTYKKyNkZWZpbmUgQ0xLX01NX0RJU1BfV0RNQQkJCTcKKyNkZWZpbmUgQ0xLX01NX0RJU1BfUkRNQQkJCTgKKyNkZWZpbmUgQ0xLX01NX0RJU1BfT1ZMCQkJCTkKKyNkZWZpbmUgQ0xLX01NX01EUF9URFNIUAkJCTEwCisjZGVmaW5lIENMS19NTV9NRFBfV1JPVAkJCQkxMQorI2RlZmluZSBDTEtfTU1fTURQX1dETUEJCQkJMTIKKyNkZWZpbmUgQ0xLX01NX01EUF9SU1oxCQkJCTEzCisjZGVmaW5lIENMS19NTV9NRFBfUlNaMAkJCQkxNAorI2RlZmluZSBDTEtfTU1fTURQX1JETUEJCQkJMTUKKyNkZWZpbmUgQ0xLX01NX01EUF9CTFNfMjZNCQkJMTYKKyNkZWZpbmUgQ0xLX01NX0NBTV9NRFAJCQkJMTcKKyNkZWZpbmUgQ0xLX01NX0ZBS0VfRU5HCQkJCTE4CisjZGVmaW5lIENMS19NTV9NVVRFWF8zMksJCQkxOQorI2RlZmluZSBDTEtfTU1fRElTUF9SRE1BMQkJCTIwCisjZGVmaW5lIENMS19NTV9ESVNQX1VGT0UJCQkyMQorCisjZGVmaW5lIENMS19NTV9EU0lfRU5HSU5FCQkJMjIKKyNkZWZpbmUgQ0xLX01NX0RTSV9ESUcJCQkJMjMKKyNkZWZpbmUgQ0xLX01NX0RQSV9ESUdMCQkJCTI0CisjZGVmaW5lIENMS19NTV9EUElfRU5HSU5FCQkJMjUKKyNkZWZpbmUgQ0xLX01NX0RQSTFfRElHTAkJCTI2CisjZGVmaW5lIENMS19NTV9EUEkxX0VOR0lORQkJCTI3CisjZGVmaW5lIENMS19NTV9UVkVfT1VUUFVUCQkJMjgKKyNkZWZpbmUgQ0xLX01NX1RWRV9JTlBVVAkJCTI5CisjZGVmaW5lIENMS19NTV9IRE1JX1BJWEVMCQkJMzAKKyNkZWZpbmUgQ0xLX01NX0hETUlfUExMCQkJCTMxCisjZGVmaW5lIENMS19NTV9IRE1JX0FVRElPCQkJMzIKKyNkZWZpbmUgQ0xLX01NX0hETUlfU1BESUYJCQkzMworI2RlZmluZSBDTEtfTU1fVFZFX0ZNTQkJCQkzNAorI2RlZmluZSBDTEtfTU1fTlIJCQkJMzUKKworLyogSU1HU1lTICovCisKKyNkZWZpbmUgQ0xLX0lNR19TTUlfQ09NTQkJCTEKKyNkZWZpbmUgQ0xLX0lNR19SRVNaCQkJCTIKKyNkZWZpbmUgQ0xLX0lNR19KUEdERUNfU01JCQkJMworI2RlZmluZSBDTEtfSU1HX0pQR0RFQwkJCQk0CisjZGVmaW5lIENMS19JTUdfVkVOQ19MVAkJCQk1CisjZGVmaW5lIENMS19JTUdfVkVOQwkJCQk2CisjZGVmaW5lIENMS19JTUdfTlIJCQkJNworCisvKiBWREVDICovCisKKyNkZWZpbmUgQ0xLX1ZERUNfQ0tHRU4JCQkJMQorI2RlZmluZSBDTEtfVkRFQ19MQVJCCQkJCTIKKyNkZWZpbmUgQ0xLX1ZERUNfTlIJCQkJMworCisvKiBISUZTWVMgKi8KKworI2RlZmluZSBDTEtfSElGU1lTX1VTQjBQSFkJCQkxCisjZGVmaW5lIENMS19ISUZTWVNfVVNCMVBIWQkJCTIKKyNkZWZpbmUgQ0xLX0hJRlNZU19QQ0lFMAkJCTMKKyNkZWZpbmUgQ0xLX0hJRlNZU19QQ0lFMQkJCTQKKyNkZWZpbmUgQ0xLX0hJRlNZU19QQ0lFMgkJCTUKKyNkZWZpbmUgQ0xLX0hJRlNZU19OUgkJCQk2CisKKy8qIEVUSFNZUyAqLworI2RlZmluZSBDTEtfRVRIU1lTX0hTRE1BCQkJMQorI2RlZmluZSBDTEtfRVRIU1lTX0VTVwkJCQkyCisjZGVmaW5lIENMS19FVEhTWVNfR1AyCQkJCTMKKyNkZWZpbmUgQ0xLX0VUSFNZU19HUDEJCQkJNAorI2RlZmluZSBDTEtfRVRIU1lTX1BDTQkJCQk1CisjZGVmaW5lIENMS19FVEhTWVNfR0RNQQkJCQk2CisjZGVmaW5lIENMS19FVEhTWVNfSTJTCQkJCTcKKyNkZWZpbmUgQ0xLX0VUSFNZU19DUllQVE8JCQk4CisjZGVmaW5lIENMS19FVEhTWVNfTlIJCQkJOQorCisvKiBCRFAgKi8KKworI2RlZmluZSBDTEtfQkRQX0JSR19CQQkJCQkxCisjZGVmaW5lIENMS19CRFBfQlJHX0RSQU0JCQkyCisjZGVmaW5lIENMS19CRFBfTEFSQl9EUkFNCQkJMworI2RlZmluZSBDTEtfQkRQX1dSX1ZESV9QWEwJCQk0CisjZGVmaW5lIENMS19CRFBfV1JfVkRJX0RSQU0JCQk1CisjZGVmaW5lIENMS19CRFBfV1JfQgkJCQk2CisjZGVmaW5lIENMS19CRFBfREdJX0lOCQkJCTcKKyNkZWZpbmUgQ0xLX0JEUF9ER0lfT1VUCQkJCTgKKyNkZWZpbmUgQ0xLX0JEUF9GTVRfTUFTVF8yNwkJCTkKKyNkZWZpbmUgQ0xLX0JEUF9GTVRfQgkJCQkxMAorI2RlZmluZSBDTEtfQkRQX09TRF9CCQkJCTExCisjZGVmaW5lIENMS19CRFBfT1NEX0RSQU0JCQkxMgorI2RlZmluZSBDTEtfQkRQX09TRF9BR0VOVAkJCTEzCisjZGVmaW5lIENMS19CRFBfT1NEX1BYTAkJCQkxNAorI2RlZmluZSBDTEtfQkRQX1JMRV9CCQkJCTE1CisjZGVmaW5lIENMS19CRFBfUkxFX0FHRU5UCQkJMTYKKyNkZWZpbmUgQ0xLX0JEUF9STEVfRFJBTQkJCTE3CisjZGVmaW5lIENMS19CRFBfRjI3TQkJCQkxOAorI2RlZmluZSBDTEtfQkRQX0YyN01fVkRPVVQJCQkxOQorI2RlZmluZSBDTEtfQkRQX0YyN183NF83NAkJCTIwCisjZGVmaW5lIENMS19CRFBfRjJGUwkJCQkyMQorI2RlZmluZSBDTEtfQkRQX0YyRlM3NF8xNDgJCQkyMgorI2RlZmluZSBDTEtfQkRQX0ZCCQkJCTIzCisjZGVmaW5lIENMS19CRFBfVkRPX0RSQU0JCQkyNAorI2RlZmluZSBDTEtfQkRQX1ZET18yRlMJCQkJMjUKKyNkZWZpbmUgQ0xLX0JEUF9WRE9fQgkJCQkyNgorI2RlZmluZSBDTEtfQkRQX1dSX0RJX1BYTAkJCTI3CisjZGVmaW5lIENMS19CRFBfV1JfRElfRFJBTQkJCTI4CisjZGVmaW5lIENMS19CRFBfV1JfRElfQgkJCQkyOQorI2RlZmluZSBDTEtfQkRQX05SX1BYTAkJCQkzMAorI2RlZmluZSBDTEtfQkRQX05SX0RSQU0JCQkJMzEKKyNkZWZpbmUgQ0xLX0JEUF9OUl9CCQkJCTMyCisKKyNkZWZpbmUgQ0xLX0JEUF9SWF9GCQkJCTMzCisjZGVmaW5lIENMS19CRFBfUlhfWAkJCQkzNAorI2RlZmluZSBDTEtfQkRQX1JYUERUCQkJCTM1CisjZGVmaW5lIENMS19CRFBfUlhfQ1NDTF9OCQkJMzYKKyNkZWZpbmUgQ0xLX0JEUF9SWF9DU0NMCQkJCTM3CisjZGVmaW5lIENMS19CRFBfUlhfRERDU0NMX04JCQkzOAorI2RlZmluZSBDTEtfQkRQX1JYX0REQ1NDTAkJCTM5CisjZGVmaW5lIENMS19CRFBfUlhfVkNPCQkJCTQwCisjZGVmaW5lIENMS19CRFBfUlhfRFAJCQkJNDEKKyNkZWZpbmUgQ0xLX0JEUF9SWF9QCQkJCTQyCisjZGVmaW5lIENMS19CRFBfUlhfTQkJCQk0MworI2RlZmluZSBDTEtfQkRQX1JYX1BMTAkJCQk0NAorI2RlZmluZSBDTEtfQkRQX0JSR19SVF9CCQkJNDUKKyNkZWZpbmUgQ0xLX0JEUF9CUkdfUlRfRFJBTQkJCTQ2CisjZGVmaW5lIENMS19CRFBfTEFSQlJUX0RSQU0JCQk0NworI2RlZmluZSBDTEtfQkRQX1RNRFNfU1lOCQkJNDgKKyNkZWZpbmUgQ0xLX0JEUF9IRE1JX01PTgkJCTQ5CisjZGVmaW5lIENMS19CRFBfTlIJCQkJNTAKKworI2VuZGlmIC8qIF9EVF9CSU5ESU5HU19DTEtfTVQyNzAxX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2MtbWRtOTYxNS5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1tZG05NjE1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFiMmM0MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2MtbWRtOTYxNS5oCkBAIC0wLDAgKzEsMzI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgQmF5TGlicmUsIFNBUy4KKyAqIEF1dGhvciA6IE5laWwgQXJtc3Ryb25nIDxuYXJtc3Ryb25nQGJheWxpYnJlLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0RUX0JJTkRJTkdTX0NMS19NRE1fR0NDXzk2MTVfSAorI2RlZmluZSBfRFRfQklORElOR1NfQ0xLX01ETV9HQ0NfOTYxNV9ICisKKyNkZWZpbmUgQUZBQl9DTEtfU1JDCQkJCTAKKyNkZWZpbmUgQUZBQl9DT1JFX0NMSwkJCQkxCisjZGVmaW5lIFNGQUJfTVNTX1E2X1NXX0FfQ0xLCQkJMgorI2RlZmluZSBTRkFCX01TU19RNl9GV19BX0NMSwkJCTMKKyNkZWZpbmUgUURTU19TVE1fQ0xLCQkJCTQKKyNkZWZpbmUgU0NTU19BX0NMSwkJCQk1CisjZGVmaW5lIFNDU1NfSF9DTEsJCQkJNgorI2RlZmluZSBTQ1NTX1hPX1NSQ19DTEsJCQkJNworI2RlZmluZSBBRkFCX0VCSTFfQ0gwX0FfQ0xLCQkJOAorI2RlZmluZSBBRkFCX0VCSTFfQ0gxX0FfQ0xLCQkJOQorI2RlZmluZSBBRkFCX0FYSV9TMF9GQ0xLCQkJMTAKKyNkZWZpbmUgQUZBQl9BWElfUzFfRkNMSwkJCTExCisjZGVmaW5lIEFGQUJfQVhJX1MyX0ZDTEsJCQkxMgorI2RlZmluZSBBRkFCX0FYSV9TM19GQ0xLCQkJMTMKKyNkZWZpbmUgQUZBQl9BWElfUzRfRkNMSwkJCTE0CisjZGVmaW5lIFNGQUJfQ09SRV9DTEsJCQkJMTUKKyNkZWZpbmUgU0ZBQl9BWElfUzBfRkNMSwkJCTE2CisjZGVmaW5lIFNGQUJfQVhJX1MxX0ZDTEsJCQkxNworI2RlZmluZSBTRkFCX0FYSV9TMl9GQ0xLCQkJMTgKKyNkZWZpbmUgU0ZBQl9BWElfUzNfRkNMSwkJCTE5CisjZGVmaW5lIFNGQUJfQVhJX1M0X0ZDTEsJCQkyMAorI2RlZmluZSBTRkFCX0FIQl9TMF9GQ0xLCQkJMjEKKyNkZWZpbmUgU0ZBQl9BSEJfUzFfRkNMSwkJCTIyCisjZGVmaW5lIFNGQUJfQUhCX1MyX0ZDTEsJCQkyMworI2RlZmluZSBTRkFCX0FIQl9TM19GQ0xLCQkJMjQKKyNkZWZpbmUgU0ZBQl9BSEJfUzRfRkNMSwkJCTI1CisjZGVmaW5lIFNGQUJfQUhCX1M1X0ZDTEsJCQkyNgorI2RlZmluZSBTRkFCX0FIQl9TNl9GQ0xLCQkJMjcKKyNkZWZpbmUgU0ZBQl9BSEJfUzdfRkNMSwkJCTI4CisjZGVmaW5lIFFEU1NfQVRfQ0xLX1NSQwkJCQkyOQorI2RlZmluZSBRRFNTX0FUX0NMSwkJCQkzMAorI2RlZmluZSBRRFNTX1RSQUNFQ0xLSU5fQ0xLX1NSQwkJCTMxCisjZGVmaW5lIFFEU1NfVFJBQ0VDTEtJTl9DTEsJCQkzMgorI2RlZmluZSBRRFNTX1RTQ1RSX0NMS19TUkMJCQkzMworI2RlZmluZSBRRFNTX1RTQ1RSX0NMSwkJCQkzNAorI2RlZmluZSBTRkFCX0FETTBfTTBfQV9DTEsJCQkzNQorI2RlZmluZSBTRkFCX0FETTBfTTFfQV9DTEsJCQkzNgorI2RlZmluZSBTRkFCX0FETTBfTTJfSF9DTEsJCQkzNworI2RlZmluZSBBRE0wX0NMSwkJCQkzOAorI2RlZmluZSBBRE0wX1BCVVNfQ0xLCQkJCTM5CisjZGVmaW5lIE1TU19YUFVfQ0xLCQkJCTQwCisjZGVmaW5lIElNRU0wX0FfQ0xLCQkJCTQxCisjZGVmaW5lIFFEU1NfSF9DTEsJCQkJNDIKKyNkZWZpbmUgUENJRV9BX0NMSwkJCQk0MworI2RlZmluZSBQQ0lFX0FVWF9DTEsJCQkJNDQKKyNkZWZpbmUgUENJRV9QSFlfUkVGX0NMSwkJCTQ1CisjZGVmaW5lIFBDSUVfSF9DTEsJCQkJNDYKKyNkZWZpbmUgU0ZBQl9DTEtfU1JDCQkJCTQ3CisjZGVmaW5lIE1BSEIwX0NMSwkJCQk0OAorI2RlZmluZSBRNlNXX0NMS19TUkMJCQkJNDkKKyNkZWZpbmUgUTZTV19DTEsJCQkJNTAKKyNkZWZpbmUgUTZGV19DTEtfU1JDCQkJCTUxCisjZGVmaW5lIFE2RldfQ0xLCQkJCTUyCisjZGVmaW5lIFNGQUJfTVNTX01fQV9DTEsJCQk1MworI2RlZmluZSBTRkFCX1VTQjNfTV9BX0NMSwkJCTU0CisjZGVmaW5lIFNGQUJfTFBBU1NfUTZfQV9DTEsJCQk1NQorI2RlZmluZSBTRkFCX0FGQUJfTV9BX0NMSwkJCTU2CisjZGVmaW5lIEFGQUJfU0ZBQl9NMF9BX0NMSwkJCTU3CisjZGVmaW5lIEFGQUJfU0ZBQl9NMV9BX0NMSwkJCTU4CisjZGVmaW5lIFNGQUJfU0FUQV9TX0hfQ0xLCQkJNTkKKyNkZWZpbmUgREZBQl9DTEtfU1JDCQkJCTYwCisjZGVmaW5lIERGQUJfQ0xLCQkJCTYxCisjZGVmaW5lIFNGQUJfREZBQl9NX0FfQ0xLCQkJNjIKKyNkZWZpbmUgREZBQl9TRkFCX01fQV9DTEsJCQk2MworI2RlZmluZSBERkFCX1NXQVkwX0hfQ0xLCQkJNjQKKyNkZWZpbmUgREZBQl9TV0FZMV9IX0NMSwkJCTY1CisjZGVmaW5lIERGQUJfQVJCMF9IX0NMSwkJCQk2NgorI2RlZmluZSBERkFCX0FSQjFfSF9DTEsJCQkJNjcKKyNkZWZpbmUgUFBTU19IX0NMSwkJCQk2OAorI2RlZmluZSBQUFNTX1BST0NfQ0xLCQkJCTY5CisjZGVmaW5lIFBQU1NfVElNRVIwX0NMSwkJCQk3MAorI2RlZmluZSBQUFNTX1RJTUVSMV9DTEsJCQkJNzEKKyNkZWZpbmUgUE1FTV9BX0NMSwkJCQk3MgorI2RlZmluZSBETUFfQkFNX0hfQ0xLCQkJCTczCisjZGVmaW5lIFNJQ19IX0NMSwkJCQk3NAorI2RlZmluZSBTUFNfVElDX0hfQ0xLCQkJCTc1CisjZGVmaW5lIFNMSU1CVVNfSF9DTEsJCQkJNzYKKyNkZWZpbmUgU0xJTUJVU19YT19TUkNfQ0xLCQkJNzcKKyNkZWZpbmUgQ0ZQQl8yWF9DTEtfU1JDCQkJCTc4CisjZGVmaW5lIENGUEJfQ0xLCQkJCTc5CisjZGVmaW5lIENGUEIwX0hfQ0xLCQkJCTgwCisjZGVmaW5lIENGUEIxX0hfQ0xLCQkJCTgxCisjZGVmaW5lIENGUEIyX0hfQ0xLCQkJCTgyCisjZGVmaW5lIFNGQUJfQ0ZQQl9NX0hfQ0xLCQkJODMKKyNkZWZpbmUgQ0ZQQl9NQVNURVJfSF9DTEsJCQk4NAorI2RlZmluZSBTRkFCX0NGUEJfU19IX0NMSwkJCTg1CisjZGVmaW5lIENGUEJfU1BMSVRURVJfSF9DTEsJCQk4NgorI2RlZmluZSBUU0lGX0hfQ0xLCQkJCTg3CisjZGVmaW5lIFRTSUZfSU5BQ1RJVklUWV9USU1FUlNfQ0xLCQk4OAorI2RlZmluZSBUU0lGX1JFRl9TUkMJCQkJODkKKyNkZWZpbmUgVFNJRl9SRUZfQ0xLCQkJCTkwCisjZGVmaW5lIENFMV9IX0NMSwkJCQk5MQorI2RlZmluZSBDRTFfQ09SRV9DTEsJCQkJOTIKKyNkZWZpbmUgQ0UxX1NMRUVQX0NMSwkJCQk5MworI2RlZmluZSBDRTJfSF9DTEsJCQkJOTQKKyNkZWZpbmUgQ0UyX0NPUkVfQ0xLCQkJCTk1CisjZGVmaW5lIFNGUEJfSF9DTEtfU1JDCQkJCTk3CisjZGVmaW5lIFNGUEJfSF9DTEsJCQkJOTgKKyNkZWZpbmUgU0ZBQl9TRlBCX01fSF9DTEsJCQk5OQorI2RlZmluZSBTRkFCX1NGUEJfU19IX0NMSwkJCTEwMAorI2RlZmluZSBSUE1fUFJPQ19DTEsJCQkJMTAxCisjZGVmaW5lIFJQTV9CVVNfSF9DTEsJCQkJMTAyCisjZGVmaW5lIFJQTV9TTEVFUF9DTEsJCQkJMTAzCisjZGVmaW5lIFJQTV9USU1FUl9DTEsJCQkJMTA0CisjZGVmaW5lIFJQTV9NU0dfUkFNX0hfQ0xLCQkJMTA1CisjZGVmaW5lIFBNSUNfQVJCMF9IX0NMSwkJCQkxMDYKKyNkZWZpbmUgUE1JQ19BUkIxX0hfQ0xLCQkJCTEwNworI2RlZmluZSBQTUlDX1NTQkkyX1NSQwkJCQkxMDgKKyNkZWZpbmUgUE1JQ19TU0JJMl9DTEsJCQkJMTA5CisjZGVmaW5lIFNEQzFfSF9DTEsJCQkJMTEwCisjZGVmaW5lIFNEQzJfSF9DTEsJCQkJMTExCisjZGVmaW5lIFNEQzNfSF9DTEsJCQkJMTEyCisjZGVmaW5lIFNEQzRfSF9DTEsJCQkJMTEzCisjZGVmaW5lIFNEQzVfSF9DTEsJCQkJMTE0CisjZGVmaW5lIFNEQzFfU1JDCQkJCTExNQorI2RlZmluZSBTREMyX1NSQwkJCQkxMTYKKyNkZWZpbmUgU0RDM19TUkMJCQkJMTE3CisjZGVmaW5lIFNEQzRfU1JDCQkJCTExOAorI2RlZmluZSBTREM1X1NSQwkJCQkxMTkKKyNkZWZpbmUgU0RDMV9DTEsJCQkJMTIwCisjZGVmaW5lIFNEQzJfQ0xLCQkJCTEyMQorI2RlZmluZSBTREMzX0NMSwkJCQkxMjIKKyNkZWZpbmUgU0RDNF9DTEsJCQkJMTIzCisjZGVmaW5lIFNEQzVfQ0xLCQkJCTEyNAorI2RlZmluZSBERkFCX0EyX0hfQ0xLCQkJCTEyNQorI2RlZmluZSBVU0JfSFMxX0hfQ0xLCQkJCTEyNgorI2RlZmluZSBVU0JfSFMxX1hDVlJfU1JDCQkJMTI3CisjZGVmaW5lIFVTQl9IUzFfWENWUl9DTEsJCQkxMjgKKyNkZWZpbmUgVVNCX0hTSUNfSF9DTEsJCQkJMTI5CisjZGVmaW5lIFVTQl9IU0lDX1hDVlJfRlNfU1JDCQkJMTMwCisjZGVmaW5lIFVTQl9IU0lDX1hDVlJfRlNfQ0xLCQkJMTMxCisjZGVmaW5lIFVTQl9IU0lDX1NZU1RFTV9DTEtfU1JDCQkJMTMyCisjZGVmaW5lIFVTQl9IU0lDX1NZU1RFTV9DTEsJCQkxMzMKKyNkZWZpbmUgQ0ZQQjBfQzBfSF9DTEsJCQkJMTM0CisjZGVmaW5lIENGUEIwX0MxX0hfQ0xLCQkJCTEzNQorI2RlZmluZSBDRlBCMF9EMF9IX0NMSwkJCQkxMzYKKyNkZWZpbmUgQ0ZQQjBfRDFfSF9DTEsJCQkJMTM3CisjZGVmaW5lIFVTQl9GUzFfSF9DTEsJCQkJMTM4CisjZGVmaW5lIFVTQl9GUzFfWENWUl9GU19TUkMJCQkxMzkKKyNkZWZpbmUgVVNCX0ZTMV9YQ1ZSX0ZTX0NMSwkJCTE0MAorI2RlZmluZSBVU0JfRlMxX1NZU1RFTV9DTEsJCQkxNDEKKyNkZWZpbmUgVVNCX0ZTMl9IX0NMSwkJCQkxNDIKKyNkZWZpbmUgVVNCX0ZTMl9YQ1ZSX0ZTX1NSQwkJCTE0MworI2RlZmluZSBVU0JfRlMyX1hDVlJfRlNfQ0xLCQkJMTQ0CisjZGVmaW5lIFVTQl9GUzJfU1lTVEVNX0NMSwkJCTE0NQorI2RlZmluZSBHU0JJX0NPTU1PTl9TSU1fU1JDCQkJMTQ2CisjZGVmaW5lIEdTQkkxX0hfQ0xLCQkJCTE0NworI2RlZmluZSBHU0JJMl9IX0NMSwkJCQkxNDgKKyNkZWZpbmUgR1NCSTNfSF9DTEsJCQkJMTQ5CisjZGVmaW5lIEdTQkk0X0hfQ0xLCQkJCTE1MAorI2RlZmluZSBHU0JJNV9IX0NMSwkJCQkxNTEKKyNkZWZpbmUgR1NCSTZfSF9DTEsJCQkJMTUyCisjZGVmaW5lIEdTQkk3X0hfQ0xLCQkJCTE1MworI2RlZmluZSBHU0JJOF9IX0NMSwkJCQkxNTQKKyNkZWZpbmUgR1NCSTlfSF9DTEsJCQkJMTU1CisjZGVmaW5lIEdTQkkxMF9IX0NMSwkJCQkxNTYKKyNkZWZpbmUgR1NCSTExX0hfQ0xLCQkJCTE1NworI2RlZmluZSBHU0JJMTJfSF9DTEsJCQkJMTU4CisjZGVmaW5lIEdTQkkxX1VBUlRfU1JDCQkJCTE1OQorI2RlZmluZSBHU0JJMV9VQVJUX0NMSwkJCQkxNjAKKyNkZWZpbmUgR1NCSTJfVUFSVF9TUkMJCQkJMTYxCisjZGVmaW5lIEdTQkkyX1VBUlRfQ0xLCQkJCTE2MgorI2RlZmluZSBHU0JJM19VQVJUX1NSQwkJCQkxNjMKKyNkZWZpbmUgR1NCSTNfVUFSVF9DTEsJCQkJMTY0CisjZGVmaW5lIEdTQkk0X1VBUlRfU1JDCQkJCTE2NQorI2RlZmluZSBHU0JJNF9VQVJUX0NMSwkJCQkxNjYKKyNkZWZpbmUgR1NCSTVfVUFSVF9TUkMJCQkJMTY3CisjZGVmaW5lIEdTQkk1X1VBUlRfQ0xLCQkJCTE2OAorI2RlZmluZSBHU0JJNl9VQVJUX1NSQwkJCQkxNjkKKyNkZWZpbmUgR1NCSTZfVUFSVF9DTEsJCQkJMTcwCisjZGVmaW5lIEdTQkk3X1VBUlRfU1JDCQkJCTE3MQorI2RlZmluZSBHU0JJN19VQVJUX0NMSwkJCQkxNzIKKyNkZWZpbmUgR1NCSThfVUFSVF9TUkMJCQkJMTczCisjZGVmaW5lIEdTQkk4X1VBUlRfQ0xLCQkJCTE3NAorI2RlZmluZSBHU0JJOV9VQVJUX1NSQwkJCQkxNzUKKyNkZWZpbmUgR1NCSTlfVUFSVF9DTEsJCQkJMTc2CisjZGVmaW5lIEdTQkkxMF9VQVJUX1NSQwkJCQkxNzcKKyNkZWZpbmUgR1NCSTEwX1VBUlRfQ0xLCQkJCTE3OAorI2RlZmluZSBHU0JJMTFfVUFSVF9TUkMJCQkJMTc5CisjZGVmaW5lIEdTQkkxMV9VQVJUX0NMSwkJCQkxODAKKyNkZWZpbmUgR1NCSTEyX1VBUlRfU1JDCQkJCTE4MQorI2RlZmluZSBHU0JJMTJfVUFSVF9DTEsJCQkJMTgyCisjZGVmaW5lIEdTQkkxX1FVUF9TUkMJCQkJMTgzCisjZGVmaW5lIEdTQkkxX1FVUF9DTEsJCQkJMTg0CisjZGVmaW5lIEdTQkkyX1FVUF9TUkMJCQkJMTg1CisjZGVmaW5lIEdTQkkyX1FVUF9DTEsJCQkJMTg2CisjZGVmaW5lIEdTQkkzX1FVUF9TUkMJCQkJMTg3CisjZGVmaW5lIEdTQkkzX1FVUF9DTEsJCQkJMTg4CisjZGVmaW5lIEdTQkk0X1FVUF9TUkMJCQkJMTg5CisjZGVmaW5lIEdTQkk0X1FVUF9DTEsJCQkJMTkwCisjZGVmaW5lIEdTQkk1X1FVUF9TUkMJCQkJMTkxCisjZGVmaW5lIEdTQkk1X1FVUF9DTEsJCQkJMTkyCisjZGVmaW5lIEdTQkk2X1FVUF9TUkMJCQkJMTkzCisjZGVmaW5lIEdTQkk2X1FVUF9DTEsJCQkJMTk0CisjZGVmaW5lIEdTQkk3X1FVUF9TUkMJCQkJMTk1CisjZGVmaW5lIEdTQkk3X1FVUF9DTEsJCQkJMTk2CisjZGVmaW5lIEdTQkk4X1FVUF9TUkMJCQkJMTk3CisjZGVmaW5lIEdTQkk4X1FVUF9DTEsJCQkJMTk4CisjZGVmaW5lIEdTQkk5X1FVUF9TUkMJCQkJMTk5CisjZGVmaW5lIEdTQkk5X1FVUF9DTEsJCQkJMjAwCisjZGVmaW5lIEdTQkkxMF9RVVBfU1JDCQkJCTIwMQorI2RlZmluZSBHU0JJMTBfUVVQX0NMSwkJCQkyMDIKKyNkZWZpbmUgR1NCSTExX1FVUF9TUkMJCQkJMjAzCisjZGVmaW5lIEdTQkkxMV9RVVBfQ0xLCQkJCTIwNAorI2RlZmluZSBHU0JJMTJfUVVQX1NSQwkJCQkyMDUKKyNkZWZpbmUgR1NCSTEyX1FVUF9DTEsJCQkJMjA2CisjZGVmaW5lIEdTQkkxX1NJTV9DTEsJCQkJMjA3CisjZGVmaW5lIEdTQkkyX1NJTV9DTEsJCQkJMjA4CisjZGVmaW5lIEdTQkkzX1NJTV9DTEsJCQkJMjA5CisjZGVmaW5lIEdTQkk0X1NJTV9DTEsJCQkJMjEwCisjZGVmaW5lIEdTQkk1X1NJTV9DTEsJCQkJMjExCisjZGVmaW5lIEdTQkk2X1NJTV9DTEsJCQkJMjEyCisjZGVmaW5lIEdTQkk3X1NJTV9DTEsJCQkJMjEzCisjZGVmaW5lIEdTQkk4X1NJTV9DTEsJCQkJMjE0CisjZGVmaW5lIEdTQkk5X1NJTV9DTEsJCQkJMjE1CisjZGVmaW5lIEdTQkkxMF9TSU1fQ0xLCQkJCTIxNgorI2RlZmluZSBHU0JJMTFfU0lNX0NMSwkJCQkyMTcKKyNkZWZpbmUgR1NCSTEyX1NJTV9DTEsJCQkJMjE4CisjZGVmaW5lIFVTQl9IU0lDX0hTSUNfQ0xLX1NSQwkJCTIxOQorI2RlZmluZSBVU0JfSFNJQ19IU0lDX0NMSwkJCTIyMAorI2RlZmluZSBVU0JfSFNJQ19IU0lPX0NBTF9DTEsJCQkyMjEKKyNkZWZpbmUgU1BETV9DRkdfSF9DTEsJCQkJMjIyCisjZGVmaW5lIFNQRE1fTVNUUl9IX0NMSwkJCQkyMjMKKyNkZWZpbmUgU1BETV9GRl9DTEtfU1JDCQkJCTIyNAorI2RlZmluZSBTUERNX0ZGX0NMSwkJCQkyMjUKKyNkZWZpbmUgU0VDX0NUUkxfQ0xLCQkJCTIyNgorI2RlZmluZSBTRUNfQ1RSTF9BQ0NfQ0xLX1NSQwkJCTIyNworI2RlZmluZSBTRUNfQ1RSTF9BQ0NfQ0xLCQkJMjI4CisjZGVmaW5lIFRMTU1fSF9DTEsJCQkJMjI5CisjZGVmaW5lIFRMTU1fQ0xLCQkJCTIzMAorI2RlZmluZSBTRkFCX01TU19TX0hfQ0xLCQkJMjMxCisjZGVmaW5lIE1TU19TTFBfQ0xLCQkJCTIzMgorI2RlZmluZSBNU1NfUTZTV19KVEFHX0NMSwkJCTIzMworI2RlZmluZSBNU1NfUTZGV19KVEFHX0NMSwkJCTIzNAorI2RlZmluZSBNU1NfU19IX0NMSwkJCQkyMzUKKyNkZWZpbmUgTVNTX0NYT19TUkNfQ0xLCQkJCTIzNgorI2RlZmluZSBTQVRBX0hfQ0xLCQkJCTIzNworI2RlZmluZSBTQVRBX0NMS19TUkMJCQkJMjM4CisjZGVmaW5lIFNBVEFfUlhPT0JfQ0xLCQkJCTIzOQorI2RlZmluZSBTQVRBX1BNQUxJVkVfQ0xLCQkJMjQwCisjZGVmaW5lIFNBVEFfUEhZX1JFRl9DTEsJCQkyNDEKKyNkZWZpbmUgVFNTQ19DTEtfU1JDCQkJCTI0MgorI2RlZmluZSBUU1NDX0NMSwkJCQkyNDMKKyNkZWZpbmUgUERNX1NSQwkJCQkJMjQ0CisjZGVmaW5lIFBETV9DTEsJCQkJCTI0NQorI2RlZmluZSBHUDBfU1JDCQkJCQkyNDYKKyNkZWZpbmUgR1AwX0NMSwkJCQkJMjQ3CisjZGVmaW5lIEdQMV9TUkMJCQkJCTI0OAorI2RlZmluZSBHUDFfQ0xLCQkJCQkyNDkKKyNkZWZpbmUgR1AyX1NSQwkJCQkJMjUwCisjZGVmaW5lIEdQMl9DTEsJCQkJCTI1MQorI2RlZmluZSBNUE1fQ0xLCQkJCQkyNTIKKyNkZWZpbmUgRUJJMV9DTEtfU1JDCQkJCTI1MworI2RlZmluZSBFQkkxX0NIMF9DTEsJCQkJMjU0CisjZGVmaW5lIEVCSTFfQ0gxX0NMSwkJCQkyNTUKKyNkZWZpbmUgRUJJMV8yWF9DTEsJCQkJMjU2CisjZGVmaW5lIEVCSTFfQ0gwX0RRX0NMSwkJCQkyNTcKKyNkZWZpbmUgRUJJMV9DSDFfRFFfQ0xLCQkJCTI1OAorI2RlZmluZSBFQkkxX0NIMF9DQV9DTEsJCQkJMjU5CisjZGVmaW5lIEVCSTFfQ0gxX0NBX0NMSwkJCQkyNjAKKyNkZWZpbmUgRUJJMV9YT19DTEsJCQkJMjYxCisjZGVmaW5lIFNGQUJfU01QU1NfU19IX0NMSwkJCTI2MgorI2RlZmluZSBQUk5HX1NSQwkJCQkyNjMKKyNkZWZpbmUgUFJOR19DTEsJCQkJMjY0CisjZGVmaW5lIFBYT19TUkMJCQkJCTI2NQorI2RlZmluZSBMUEFTU19DWE9fQ0xLCQkJCTI2NgorI2RlZmluZSBMUEFTU19QWE9fQ0xLCQkJCTI2NworI2RlZmluZSBTUERNX0NZX1BPUlQwX0NMSwkJCTI2OAorI2RlZmluZSBTUERNX0NZX1BPUlQxX0NMSwkJCTI2OQorI2RlZmluZSBTUERNX0NZX1BPUlQyX0NMSwkJCTI3MAorI2RlZmluZSBTUERNX0NZX1BPUlQzX0NMSwkJCTI3MQorI2RlZmluZSBTUERNX0NZX1BPUlQ0X0NMSwkJCTI3MgorI2RlZmluZSBTUERNX0NZX1BPUlQ1X0NMSwkJCTI3MworI2RlZmluZSBTUERNX0NZX1BPUlQ2X0NMSwkJCTI3NAorI2RlZmluZSBTUERNX0NZX1BPUlQ3X0NMSwkJCTI3NQorI2RlZmluZSBQTEwwCQkJCQkyNzYKKyNkZWZpbmUgUExMMF9WT1RFCQkJCTI3NworI2RlZmluZSBQTEwzCQkJCQkyNzgKKyNkZWZpbmUgUExMM19WT1RFCQkJCTI3OQorI2RlZmluZSBQTEw0X1ZPVEUJCQkJMjgwCisjZGVmaW5lIFBMTDUJCQkJCTI4MQorI2RlZmluZSBQTEw1X1ZPVEUJCQkJMjgyCisjZGVmaW5lIFBMTDYJCQkJCTI4MworI2RlZmluZSBQTEw2X1ZPVEUJCQkJMjg0CisjZGVmaW5lIFBMTDdfVk9URQkJCQkyODUKKyNkZWZpbmUgUExMOAkJCQkJMjg2CisjZGVmaW5lIFBMTDhfVk9URQkJCQkyODcKKyNkZWZpbmUgUExMOQkJCQkJMjg4CisjZGVmaW5lIFBMTDEwCQkJCQkyODkKKyNkZWZpbmUgUExMMTEJCQkJCTI5MAorI2RlZmluZSBQTEwxMgkJCQkJMjkxCisjZGVmaW5lIFBMTDEzCQkJCQkyOTIKKyNkZWZpbmUgUExMMTQJCQkJCTI5MworI2RlZmluZSBQTEwxNF9WT1RFCQkJCTI5NAorI2RlZmluZSBVU0JfSFMzX0hfQ0xLCQkJCTI5NQorI2RlZmluZSBVU0JfSFMzX1hDVlJfU1JDCQkJMjk2CisjZGVmaW5lIFVTQl9IUzNfWENWUl9DTEsJCQkyOTcKKyNkZWZpbmUgVVNCX0hTNF9IX0NMSwkJCQkyOTgKKyNkZWZpbmUgVVNCX0hTNF9YQ1ZSX1NSQwkJCTI5OQorI2RlZmluZSBVU0JfSFM0X1hDVlJfQ0xLCQkJMzAwCisjZGVmaW5lIFNBVEFfUEhZX0NGR19DTEsJCQkzMDEKKyNkZWZpbmUgU0FUQV9BX0NMSwkJCQkzMDIKKyNkZWZpbmUgQ0UzX1NSQwkJCQkJMzAzCisjZGVmaW5lIENFM19DT1JFX0NMSwkJCQkzMDQKKyNkZWZpbmUgQ0UzX0hfQ0xLCQkJCTMwNQorI2RlZmluZSBVU0JfSFMxX1NZU1RFTV9DTEtfU1JDCQkJMzA2CisjZGVmaW5lIFVTQl9IUzFfU1lTVEVNX0NMSwkJCTMwNworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2MtbXNtODk5Ni5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1tc204OTk2LmgKaW5kZXggNmY4MTRkYi4uMTgyODcyMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1tc204OTk2LmgKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1tc204OTk2LmgKQEAgLTMzNSw2ICszMzUsMTEgQEAKICNkZWZpbmUgR0NDX01TTVBVX0JDUgkJCQkJCTk4CiAjZGVmaW5lIEdDQ19NU1NfUTZfQkNSCQkJCQkJOTkKICNkZWZpbmUgR0NDX1FSRUZTX1ZCR19DQUxfQkNSCQkJCQkxMDAKKyNkZWZpbmUgR0NDX1BDSUVfUEhZX0NPTV9CQ1IJCQkJCTEwMQorI2RlZmluZSBHQ0NfUENJRV9QSFlfQ09NX05PQ1NSX0JDUgkJCQkxMDIKKyNkZWZpbmUgR0NDX1VTQjNfUEhZX0JDUgkJCQkJMTAzCisjZGVmaW5lIEdDQ19VU0IzUEhZX1BIWV9CQ1IJCQkJCTEwNAorCiAKIC8qIEluZGV4ZXMgZm9yIEdEU0NzICovCiAjZGVmaW5lIEFHR1JFMF9OT0NfR0RTQwkJCTAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcWNvbSxsY2MtbWRtOTYxNS5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9xY29tLGxjYy1tZG05NjE1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjOTYzYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcWNvbSxsY2MtbWRtOTYxNS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSBCYXlMaWJyZSwgU0FTLgorICogQXV0aG9yIDogTmVpbCBBcm1zdHJvbmcgPG5hcm1zdHJvbmdAYmF5bGlicmUuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfRFRfQklORElOR1NfQ0xLX0xDQ19NRE05NjE1X0gKKyNkZWZpbmUgX0RUX0JJTkRJTkdTX0NMS19MQ0NfTURNOTYxNV9ICisKKyNkZWZpbmUgUExMNAkJCQkwCisjZGVmaW5lIE1JMlNfT1NSX1NSQwkJCTEKKyNkZWZpbmUgTUkyU19PU1JfQ0xLCQkJMgorI2RlZmluZSBNSTJTX0RJVl9DTEsJCQkzCisjZGVmaW5lIE1JMlNfQklUX0RJVl9DTEsJCTQKKyNkZWZpbmUgTUkyU19CSVRfQ0xLCQkJNQorI2RlZmluZSBQQ01fU1JDCQkJCTYKKyNkZWZpbmUgUENNX0NMS19PVVQJCQk3CisjZGVmaW5lIFBDTV9DTEsJCQkJOAorI2RlZmluZSBTTElNQlVTX1NSQwkJCTkKKyNkZWZpbmUgQVVESU9fU0xJTUJVU19DTEsJCTEwCisjZGVmaW5lIFNQU19TTElNQlVTX0NMSwkJCTExCisjZGVmaW5lIENPREVDX0kyU19NSUNfT1NSX1NSQwkJMTIKKyNkZWZpbmUgQ09ERUNfSTJTX01JQ19PU1JfQ0xLCQkxMworI2RlZmluZSBDT0RFQ19JMlNfTUlDX0RJVl9DTEsJCTE0CisjZGVmaW5lIENPREVDX0kyU19NSUNfQklUX0RJVl9DTEsJMTUKKyNkZWZpbmUgQ09ERUNfSTJTX01JQ19CSVRfQ0xLCQkxNgorI2RlZmluZSBTUEFSRV9JMlNfTUlDX09TUl9TUkMJCTE3CisjZGVmaW5lIFNQQVJFX0kyU19NSUNfT1NSX0NMSwkJMTgKKyNkZWZpbmUgU1BBUkVfSTJTX01JQ19ESVZfQ0xLCQkxOQorI2RlZmluZSBTUEFSRV9JMlNfTUlDX0JJVF9ESVZfQ0xLCTIwCisjZGVmaW5lIFNQQVJFX0kyU19NSUNfQklUX0NMSwkJMjEKKyNkZWZpbmUgQ09ERUNfSTJTX1NQS1JfT1NSX1NSQwkJMjIKKyNkZWZpbmUgQ09ERUNfSTJTX1NQS1JfT1NSX0NMSwkJMjMKKyNkZWZpbmUgQ09ERUNfSTJTX1NQS1JfRElWX0NMSwkJMjQKKyNkZWZpbmUgQ09ERUNfSTJTX1NQS1JfQklUX0RJVl9DTEsJMjUKKyNkZWZpbmUgQ09ERUNfSTJTX1NQS1JfQklUX0NMSwkJMjYKKyNkZWZpbmUgU1BBUkVfSTJTX1NQS1JfT1NSX1NSQwkJMjcKKyNkZWZpbmUgU1BBUkVfSTJTX1NQS1JfT1NSX0NMSwkJMjgKKyNkZWZpbmUgU1BBUkVfSTJTX1NQS1JfRElWX0NMSwkJMjkKKyNkZWZpbmUgU1BBUkVfSTJTX1NQS1JfQklUX0RJVl9DTEsJMzAKKyNkZWZpbmUgU1BBUkVfSTJTX1NQS1JfQklUX0NMSwkJMzEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sbW1jYy1tc204OTk2LmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sbW1jYy1tc204OTk2LmgKaW5kZXggN2QzYTdmYS4uNWFiYzQ0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9xY29tLG1tY2MtbXNtODk5Ni5oCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcWNvbSxtbWNjLW1zbTg5OTYuaApAQCAtMjk4LDUgKzI5OCw2IEBACiAjZGVmaW5lIEZEX0dEU0MJCQkxMgogI2RlZmluZSBNRFNTX0dEU0MJCTEzCiAjZGVmaW5lIEdQVV9HWF9HRFNDCQkxNAorI2RlZmluZSBNTUFHSUNfQklNQ19HRFNDCTE1CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9yazMzOTktY3J1LmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3JrMzM5OS1jcnUuaAppbmRleCA1MGE0NGNmLi4yMjBhNjBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3JrMzM5OS1jcnUuaAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3JrMzM5OS1jcnUuaApAQCAtMTMxLDEyICsxMzEsMTUgQEAKICNkZWZpbmUgU0NMS19EUEhZX1JYMF9DRkcJCTE2NQogI2RlZmluZSBTQ0xLX1JNSUlfU1JDCQkJMTY2CiAjZGVmaW5lIFNDTEtfUENJRVBIWV9SRUYxMDBNCQkxNjcKKyNkZWZpbmUgU0NMS19ERFJDCQkJMTY4CiAKICNkZWZpbmUgRENMS19WT1AwCQkJMTgwCiAjZGVmaW5lIERDTEtfVk9QMQkJCTE4MQogI2RlZmluZSBEQ0xLX1ZPUDBfRElWCQkJMTgyCiAjZGVmaW5lIERDTEtfVk9QMV9ESVYJCQkxODMKICNkZWZpbmUgRENMS19NMF9QRVJJTFAJCQkxODQKKyNkZWZpbmUgRENMS19WT1AwX0ZSQUMJCQkxODUKKyNkZWZpbmUgRENMS19WT1AxX0ZSQUMJCQkxODYKIAogI2RlZmluZSBGQ0xLX0NNMFMJCQkxOTAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9zdW42aS1hMzEtY2N1LmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3N1bjZpLWEzMS1jY3UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDgyNTMwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9zdW42aS1hMzEtY2N1LmgKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQ2hlbi1ZdSBUc2FpIDx3ZW5zQGNzaWUub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBkdWFsLWxpY2Vuc2VkOiB5b3UgY2FuIHVzZSBpdCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR1BMIG9yIHRoZSBYMTEgbGljZW5zZSwgYXQgeW91ciBvcHRpb24uIE5vdGUgdGhhdCB0aGlzIGR1YWwKKyAqIGxpY2Vuc2luZyBvbmx5IGFwcGxpZXMgdG8gdGhpcyBmaWxlLCBhbmQgbm90IHRoaXMgcHJvamVjdCBhcyBhCisgKiB3aG9sZS4KKyAqCisgKiAgYSkgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiAgICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBPciwgYWx0ZXJuYXRpdmVseSwKKyAqCisgKiAgYikgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogICAgIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9uczoKKyAqCisgKiAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqICAgICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRFRfQklORElOR1NfQ0xLX1NVTjZJX0EzMV9IXworI2RlZmluZSBfRFRfQklORElOR1NfQ0xLX1NVTjZJX0EzMV9IXworCisjZGVmaW5lIENMS19QTExfUEVSSVBICQkxMAorCisjZGVmaW5lIENMS19DUFUJCQkxOAorCisjZGVmaW5lIENMS19BSEIxX01JUElEU0kJMjMKKyNkZWZpbmUgQ0xLX0FIQjFfU1MJCTI0CisjZGVmaW5lIENMS19BSEIxX0RNQQkJMjUKKyNkZWZpbmUgQ0xLX0FIQjFfTU1DMAkJMjYKKyNkZWZpbmUgQ0xLX0FIQjFfTU1DMQkJMjcKKyNkZWZpbmUgQ0xLX0FIQjFfTU1DMgkJMjgKKyNkZWZpbmUgQ0xLX0FIQjFfTU1DMwkJMjkKKyNkZWZpbmUgQ0xLX0FIQjFfTkFORDEJCTMwCisjZGVmaW5lIENMS19BSEIxX05BTkQwCQkzMQorI2RlZmluZSBDTEtfQUhCMV9TRFJBTQkJMzIKKyNkZWZpbmUgQ0xLX0FIQjFfRU1BQwkJMzMKKyNkZWZpbmUgQ0xLX0FIQjFfVFMJCTM0CisjZGVmaW5lIENMS19BSEIxX0hTVElNRVIJMzUKKyNkZWZpbmUgQ0xLX0FIQjFfU1BJMAkJMzYKKyNkZWZpbmUgQ0xLX0FIQjFfU1BJMQkJMzcKKyNkZWZpbmUgQ0xLX0FIQjFfU1BJMgkJMzgKKyNkZWZpbmUgQ0xLX0FIQjFfU1BJMwkJMzkKKyNkZWZpbmUgQ0xLX0FIQjFfT1RHCQk0MAorI2RlZmluZSBDTEtfQUhCMV9FSENJMAkJNDEKKyNkZWZpbmUgQ0xLX0FIQjFfRUhDSTEJCTQyCisjZGVmaW5lIENMS19BSEIxX09IQ0kwCQk0MworI2RlZmluZSBDTEtfQUhCMV9PSENJMQkJNDQKKyNkZWZpbmUgQ0xLX0FIQjFfT0hDSTIJCTQ1CisjZGVmaW5lIENMS19BSEIxX1ZFCQk0NgorI2RlZmluZSBDTEtfQUhCMV9MQ0QwCQk0NworI2RlZmluZSBDTEtfQUhCMV9MQ0QxCQk0OAorI2RlZmluZSBDTEtfQUhCMV9DU0kJCTQ5CisjZGVmaW5lIENMS19BSEIxX0hETUkJCTUwCisjZGVmaW5lIENMS19BSEIxX0JFMAkJNTEKKyNkZWZpbmUgQ0xLX0FIQjFfQkUxCQk1MgorI2RlZmluZSBDTEtfQUhCMV9GRTAJCTUzCisjZGVmaW5lIENMS19BSEIxX0ZFMQkJNTQKKyNkZWZpbmUgQ0xLX0FIQjFfTVAJCTU1CisjZGVmaW5lIENMS19BSEIxX0dQVQkJNTYKKyNkZWZpbmUgQ0xLX0FIQjFfREVVMAkJNTcKKyNkZWZpbmUgQ0xLX0FIQjFfREVVMQkJNTgKKyNkZWZpbmUgQ0xLX0FIQjFfRFJDMAkJNTkKKyNkZWZpbmUgQ0xLX0FIQjFfRFJDMQkJNjAKKworI2RlZmluZSBDTEtfQVBCMV9DT0RFQwkJNjEKKyNkZWZpbmUgQ0xLX0FQQjFfU1BESUYJCTYyCisjZGVmaW5lIENMS19BUEIxX0RJR0lUQUxfTUlDCTYzCisjZGVmaW5lIENMS19BUEIxX1BJTwkJNjQKKyNkZWZpbmUgQ0xLX0FQQjFfREFVRElPMAk2NQorI2RlZmluZSBDTEtfQVBCMV9EQVVESU8xCTY2CisKKyNkZWZpbmUgQ0xLX0FQQjJfSTJDMAkJNjcKKyNkZWZpbmUgQ0xLX0FQQjJfSTJDMQkJNjgKKyNkZWZpbmUgQ0xLX0FQQjJfSTJDMgkJNjkKKyNkZWZpbmUgQ0xLX0FQQjJfSTJDMwkJNzAKKyNkZWZpbmUgQ0xLX0FQQjJfVUFSVDAJCTcxCisjZGVmaW5lIENMS19BUEIyX1VBUlQxCQk3MgorI2RlZmluZSBDTEtfQVBCMl9VQVJUMgkJNzMKKyNkZWZpbmUgQ0xLX0FQQjJfVUFSVDMJCTc0CisjZGVmaW5lIENMS19BUEIyX1VBUlQ0CQk3NQorI2RlZmluZSBDTEtfQVBCMl9VQVJUNQkJNzYKKworI2RlZmluZSBDTEtfTkFORDAJCTc3CisjZGVmaW5lIENMS19OQU5EMQkJNzgKKyNkZWZpbmUgQ0xLX01NQzAJCTc5CisjZGVmaW5lIENMS19NTUMwX1NBTVBMRQkJODAKKyNkZWZpbmUgQ0xLX01NQzBfT1VUUFVUCQk4MQorI2RlZmluZSBDTEtfTU1DMQkJODIKKyNkZWZpbmUgQ0xLX01NQzFfU0FNUExFCQk4MworI2RlZmluZSBDTEtfTU1DMV9PVVRQVVQJCTg0CisjZGVmaW5lIENMS19NTUMyCQk4NQorI2RlZmluZSBDTEtfTU1DMl9TQU1QTEUJCTg2CisjZGVmaW5lIENMS19NTUMyX09VVFBVVAkJODcKKyNkZWZpbmUgQ0xLX01NQzMJCTg4CisjZGVmaW5lIENMS19NTUMzX1NBTVBMRQkJODkKKyNkZWZpbmUgQ0xLX01NQzNfT1VUUFVUCQk5MAorI2RlZmluZSBDTEtfVFMJCQk5MQorI2RlZmluZSBDTEtfU1MJCQk5MgorI2RlZmluZSBDTEtfU1BJMAkJOTMKKyNkZWZpbmUgQ0xLX1NQSTEJCTk0CisjZGVmaW5lIENMS19TUEkyCQk5NQorI2RlZmluZSBDTEtfU1BJMwkJOTYKKyNkZWZpbmUgQ0xLX0RBVURJTzAJCTk3CisjZGVmaW5lIENMS19EQVVESU8xCQk5OAorI2RlZmluZSBDTEtfU1BESUYJCTk5CisjZGVmaW5lIENMS19VU0JfUEhZMAkJMTAwCisjZGVmaW5lIENMS19VU0JfUEhZMQkJMTAxCisjZGVmaW5lIENMS19VU0JfUEhZMgkJMTAyCisjZGVmaW5lIENMS19VU0JfT0hDSTAJCTEwMworI2RlZmluZSBDTEtfVVNCX09IQ0kxCQkxMDQKKyNkZWZpbmUgQ0xLX1VTQl9PSENJMgkJMTA1CisKKyNkZWZpbmUgQ0xLX0RSQU1fVkUJCTExMAorI2RlZmluZSBDTEtfRFJBTV9DU0lfSVNQCTExMQorI2RlZmluZSBDTEtfRFJBTV9UUwkJMTEyCisjZGVmaW5lIENMS19EUkFNX0RSQzAJCTExMworI2RlZmluZSBDTEtfRFJBTV9EUkMxCQkxMTQKKyNkZWZpbmUgQ0xLX0RSQU1fREVVMAkJMTE1CisjZGVmaW5lIENMS19EUkFNX0RFVTEJCTExNgorI2RlZmluZSBDTEtfRFJBTV9GRTAJCTExNworI2RlZmluZSBDTEtfRFJBTV9GRTEJCTExOAorI2RlZmluZSBDTEtfRFJBTV9CRTAJCTExOQorI2RlZmluZSBDTEtfRFJBTV9CRTEJCTEyMAorI2RlZmluZSBDTEtfRFJBTV9NUAkJMTIxCisKKyNkZWZpbmUgQ0xLX0JFMAkJCTEyMgorI2RlZmluZSBDTEtfQkUxCQkJMTIzCisjZGVmaW5lIENMS19GRTAJCQkxMjQKKyNkZWZpbmUgQ0xLX0ZFMQkJCTEyNQorI2RlZmluZSBDTEtfTVAJCQkxMjYKKyNkZWZpbmUgQ0xLX0xDRDBfQ0gwCQkxMjcKKyNkZWZpbmUgQ0xLX0xDRDFfQ0gwCQkxMjgKKyNkZWZpbmUgQ0xLX0xDRDBfQ0gxCQkxMjkKKyNkZWZpbmUgQ0xLX0xDRDFfQ0gxCQkxMzAKKyNkZWZpbmUgQ0xLX0NTSTBfU0NMSwkJMTMxCisjZGVmaW5lIENMS19DU0kwX01DTEsJCTEzMgorI2RlZmluZSBDTEtfQ1NJMV9NQ0xLCQkxMzMKKyNkZWZpbmUgQ0xLX1ZFCQkJMTM0CisjZGVmaW5lIENMS19DT0RFQwkJMTM1CisjZGVmaW5lIENMS19BVlMJCQkxMzYKKyNkZWZpbmUgQ0xLX0RJR0lUQUxfTUlDCQkxMzcKKyNkZWZpbmUgQ0xLX0hETUkJCTEzOAorI2RlZmluZSBDTEtfSERNSV9EREMJCTEzOQorI2RlZmluZSBDTEtfUFMJCQkxNDAKKworI2RlZmluZSBDTEtfTUlQSV9EU0kJCTE0MworI2RlZmluZSBDTEtfTUlQSV9EU0lfRFBIWQkxNDQKKyNkZWZpbmUgQ0xLX01JUElfQ1NJX0RQSFkJMTQ1CisjZGVmaW5lIENMS19JRVBfRFJDMAkJMTQ2CisjZGVmaW5lIENMS19JRVBfRFJDMQkJMTQ3CisjZGVmaW5lIENMS19JRVBfREVVMAkJMTQ4CisjZGVmaW5lIENMS19JRVBfREVVMQkJMTQ5CisjZGVmaW5lIENMS19HUFVfQ09SRQkJMTUwCisjZGVmaW5lIENMS19HUFVfTUVNT1JZCQkxNTEKKyNkZWZpbmUgQ0xLX0dQVV9IWUQJCTE1MgorI2RlZmluZSBDTEtfQVRTCQkJMTUzCisjZGVmaW5lIENMS19UUkFDRQkJMTU0CisKKyNkZWZpbmUgQ0xLX09VVF9BCQkxNTUKKyNkZWZpbmUgQ0xLX09VVF9CCQkxNTYKKyNkZWZpbmUgQ0xLX09VVF9DCQkxNTcKKworI2VuZGlmIC8qIF9EVF9CSU5ESU5HU19DTEtfU1VONklfQTMxX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3N1bjhpLWEyMy1hMzMtY2N1LmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3N1bjhpLWEyMy1hMzMtY2N1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyMjJiNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svc3VuOGktYTIzLWEzMy1jY3UuaApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBNYXhpbWUgUmlwYXJkIDxtYXhpbWUucmlwYXJkQGZyZWUtZWxlY3Ryb25zLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZHVhbC1saWNlbnNlZDogeW91IGNhbiB1c2UgaXQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdQTCBvciB0aGUgWDExIGxpY2Vuc2UsIGF0IHlvdXIgb3B0aW9uLiBOb3RlIHRoYXQgdGhpcyBkdWFsCisgKiBsaWNlbnNpbmcgb25seSBhcHBsaWVzIHRvIHRoaXMgZmlsZSwgYW5kIG5vdCB0aGlzIHByb2plY3QgYXMgYQorICogd2hvbGUuCisgKgorICogIGEpIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogICAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogT3IsIGFsdGVybmF0aXZlbHksCisgKgorICogIGIpIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqICAgICBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnM6CisgKgorICogICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiAgICAgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0RUX0JJTkRJTkdTX0NMS19TVU44SV9BMjNfQTMzX0hfCisjZGVmaW5lIF9EVF9CSU5ESU5HU19DTEtfU1VOOElfQTIzX0EzM19IXworCisjZGVmaW5lIENMS19DUFVYCQkxOAorCisjZGVmaW5lIENMS19CVVNfTUlQSV9EU0kJMjMKKyNkZWZpbmUgQ0xLX0JVU19TUwkJMjQKKyNkZWZpbmUgQ0xLX0JVU19ETUEJCTI1CisjZGVmaW5lIENMS19CVVNfTU1DMAkJMjYKKyNkZWZpbmUgQ0xLX0JVU19NTUMxCQkyNworI2RlZmluZSBDTEtfQlVTX01NQzIJCTI4CisjZGVmaW5lIENMS19CVVNfTkFORAkJMjkKKyNkZWZpbmUgQ0xLX0JVU19EUkFNCQkzMAorI2RlZmluZSBDTEtfQlVTX0hTVElNRVIJCTMxCisjZGVmaW5lIENMS19CVVNfU1BJMAkJMzIKKyNkZWZpbmUgQ0xLX0JVU19TUEkxCQkzMworI2RlZmluZSBDTEtfQlVTX09URwkJMzQKKyNkZWZpbmUgQ0xLX0JVU19FSENJCQkzNQorI2RlZmluZSBDTEtfQlVTX09IQ0kJCTM2CisjZGVmaW5lIENMS19CVVNfVkUJCTM3CisjZGVmaW5lIENMS19CVVNfTENECQkzOAorI2RlZmluZSBDTEtfQlVTX0NTSQkJMzkKKyNkZWZpbmUgQ0xLX0JVU19ERV9CRQkJNDAKKyNkZWZpbmUgQ0xLX0JVU19ERV9GRQkJNDEKKyNkZWZpbmUgQ0xLX0JVU19HUFUJCTQyCisjZGVmaW5lIENMS19CVVNfTVNHQk9YCQk0MworI2RlZmluZSBDTEtfQlVTX1NQSU5MT0NLCTQ0CisjZGVmaW5lIENMS19CVVNfRFJDCQk0NQorI2RlZmluZSBDTEtfQlVTX1NBVAkJNDYKKyNkZWZpbmUgQ0xLX0JVU19DT0RFQwkJNDcKKyNkZWZpbmUgQ0xLX0JVU19QSU8JCTQ4CisjZGVmaW5lIENMS19CVVNfSTJTMAkJNDkKKyNkZWZpbmUgQ0xLX0JVU19JMlMxCQk1MAorI2RlZmluZSBDTEtfQlVTX0kyQzAJCTUxCisjZGVmaW5lIENMS19CVVNfSTJDMQkJNTIKKyNkZWZpbmUgQ0xLX0JVU19JMkMyCQk1MworI2RlZmluZSBDTEtfQlVTX1VBUlQwCQk1NAorI2RlZmluZSBDTEtfQlVTX1VBUlQxCQk1NQorI2RlZmluZSBDTEtfQlVTX1VBUlQyCQk1NgorI2RlZmluZSBDTEtfQlVTX1VBUlQzCQk1NworI2RlZmluZSBDTEtfQlVTX1VBUlQ0CQk1OAorI2RlZmluZSBDTEtfTkFORAkJNTkKKyNkZWZpbmUgQ0xLX01NQzAJCTYwCisjZGVmaW5lIENMS19NTUMwX1NBTVBMRQkJNjEKKyNkZWZpbmUgQ0xLX01NQzBfT1VUUFVUCQk2MgorI2RlZmluZSBDTEtfTU1DMQkJNjMKKyNkZWZpbmUgQ0xLX01NQzFfU0FNUExFCQk2NAorI2RlZmluZSBDTEtfTU1DMV9PVVRQVVQJCTY1CisjZGVmaW5lIENMS19NTUMyCQk2NgorI2RlZmluZSBDTEtfTU1DMl9TQU1QTEUJCTY3CisjZGVmaW5lIENMS19NTUMyX09VVFBVVAkJNjgKKyNkZWZpbmUgQ0xLX1NTCQkJNjkKKyNkZWZpbmUgQ0xLX1NQSTAJCTcwCisjZGVmaW5lIENMS19TUEkxCQk3MQorI2RlZmluZSBDTEtfSTJTMAkJNzIKKyNkZWZpbmUgQ0xLX0kyUzEJCTczCisjZGVmaW5lIENMS19VU0JfUEhZMAkJNzQKKyNkZWZpbmUgQ0xLX1VTQl9QSFkxCQk3NQorI2RlZmluZSBDTEtfVVNCX0hTSUMJCTc2CisjZGVmaW5lIENMS19VU0JfSFNJQ18xMk0JNzcKKyNkZWZpbmUgQ0xLX1VTQl9PSENJCQk3OAorCisjZGVmaW5lIENMS19EUkFNX1ZFCQk4MAorI2RlZmluZSBDTEtfRFJBTV9DU0kJCTgxCisjZGVmaW5lIENMS19EUkFNX0RSQwkJODIKKyNkZWZpbmUgQ0xLX0RSQU1fREVfRkUJCTgzCisjZGVmaW5lIENMS19EUkFNX0RFX0JFCQk4NAorI2RlZmluZSBDTEtfREVfQkUJCTg1CisjZGVmaW5lIENMS19ERV9GRQkJODYKKyNkZWZpbmUgQ0xLX0xDRF9DSDAJCTg3CisjZGVmaW5lIENMS19MQ0RfQ0gxCQk4OAorI2RlZmluZSBDTEtfQ1NJX1NDTEsJCTg5CisjZGVmaW5lIENMS19DU0lfTUNMSwkJOTAKKyNkZWZpbmUgQ0xLX1ZFCQkJOTEKKyNkZWZpbmUgQ0xLX0FDX0RJRwkJOTIKKyNkZWZpbmUgQ0xLX0FDX0RJR180WAkJOTMKKyNkZWZpbmUgQ0xLX0FWUwkJCTk0CisKKyNkZWZpbmUgQ0xLX0RTSV9TQ0xLCQk5NgorI2RlZmluZSBDTEtfRFNJX0RQSFkJCTk3CisjZGVmaW5lIENMS19EUkMJCQk5OAorI2RlZmluZSBDTEtfR1BVCQkJOTkKKyNkZWZpbmUgQ0xLX0FUUwkJCTEwMAorCisjZW5kaWYgLyogX0RUX0JJTkRJTkdTX0NMS19TVU44SV9BMjNfQTMzX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3p4Mjk2NzE4LWNsb2NrLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3p4Mjk2NzE4LWNsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIyZDUyMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svengyOTY3MTgtY2xvY2suaApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSAtIDIwMTYgWlRFIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpZm5kZWYgX19EVF9CSU5ESU5HU19DTE9DS19aWDI5NjcxOF9ICisjZGVmaW5lIF9fRFRfQklORElOR1NfQ0xPQ0tfWlgyOTY3MThfSAorCisvKiBQTEwgKi8KKyNkZWZpbmUgWlgyOTY3MThfUExMX0NQVQkxCisjZGVmaW5lIFpYMjk2NzE4X1BMTF9NQUMJMgorI2RlZmluZSBaWDI5NjcxOF9QTExfTU0wCTMKKyNkZWZpbmUgWlgyOTY3MThfUExMX01NMQk0CisjZGVmaW5lIFpYMjk2NzE4X1BMTF9WR0EJNQorI2RlZmluZSBaWDI5NjcxOF9QTExfRERSCTYKKyNkZWZpbmUgWlgyOTY3MThfUExMX0FVRElPCTcKKyNkZWZpbmUgWlgyOTY3MThfUExMX0hTSUMJOAorI2RlZmluZSBDUFVfREJHX0dBVEUJCTkKKyNkZWZpbmUgQTcyX0dBVEUJCTEwCisjZGVmaW5lIENQVV9QRVJJX0dBVEUJCTExCisjZGVmaW5lIEE1M19HQVRFCQkxMgorI2RlZmluZSBERFIxX0dBVEUJCTEzCisjZGVmaW5lIEREUjBfR0FURQkJMTQKKyNkZWZpbmUgU0QxX1dDTEsJCTE1CisjZGVmaW5lIFNEMV9BSEIJCQkxNgorI2RlZmluZSBTRDBfV0NMSwkJMTcKKyNkZWZpbmUgU0QwX0FIQgkJCTE4CisjZGVmaW5lIEVNTUNfV0NMSwkJMTkKKyNkZWZpbmUgRU1NQ19OQU5EX0FYSQkJMjAKKyNkZWZpbmUgTkFORF9XQ0xLCQkyMQorI2RlZmluZSBFTU1DX05BTkRfQUhCCQkyMgorI2RlZmluZSBMU1AxXzE0OE01CQkyMworI2RlZmluZSBMU1AxXzk5TQkJMjQKKyNkZWZpbmUgTFNQMV8yNE0JCTI1CisjZGVmaW5lIExTUDBfNzRNMjUJCTI2CisjZGVmaW5lIExTUDBfMzJLCQkyNworI2RlZmluZSBMU1AwXzE0OE01CQkyOAorI2RlZmluZSBMU1AwXzk5TQkJMjkKKyNkZWZpbmUgTFNQMF8yNE0JCTMwCisjZGVmaW5lIERFTVVYX0FYSQkJMzEKKyNkZWZpbmUgREVNVVhfQVBCCQkzMgorI2RlZmluZSBERU1VWF8xNDhNNQkJMzMKKyNkZWZpbmUgREVNVVhfMTA4TQkJMzQKKyNkZWZpbmUgQVVESU9fQVBCCQkzNQorI2RlZmluZSBBVURJT185OU0JCTM2CisjZGVmaW5lIEFVRElPXzI0TQkJMzcKKyNkZWZpbmUgQVVESU9fMTZNMzg0CQkzOAorI2RlZmluZSBBVURJT18zMksJCTM5CisjZGVmaW5lIFdEVF9XQ0xLCQk0MAorI2RlZmluZSBUSU1FUl9XQ0xLCQk0MQorI2RlZmluZSBWREVfQUNMSwkJNDIKKyNkZWZpbmUgVkNFX0FDTEsJCTQzCisjZGVmaW5lIEhERV9BQ0xLCQk0NAorI2RlZmluZSBHUFVfQUNMSwkJNDUKKyNkZWZpbmUgU0FQUFVfQUNMSwkJNDYKKyNkZWZpbmUgU0FQUFVfV0NMSwkJNDcKKyNkZWZpbmUgVk9VX0FDTEsJCTQ4CisjZGVmaW5lIFZPVV9NQUlOX1dDTEsJCTQ5CisjZGVmaW5lIFZPVV9BVVhfV0NMSwkJNTAKKyNkZWZpbmUgVk9VX1BQVV9XQ0xLCQk1MQorI2RlZmluZSBNSVBJX0NGR19DTEsJCTUyCisjZGVmaW5lIFZHQV9JMkNfV0NMSwkJNTMKKyNkZWZpbmUgTUlQSV9SRUZfQ0xLCQk1NAorI2RlZmluZSBIRE1JX09TQ19DRUMJCTU1CisjZGVmaW5lIEhETUlfT1NDX0NMSwkJNTYKKyNkZWZpbmUgSERNSV9YQ0xLCQk1NworI2RlZmluZSBWSVVfTTBfQUNMSwkJNTgKKyNkZWZpbmUgVklVX00xX0FDTEsJCTU5CisjZGVmaW5lIFZJVV9XQ0xLCQk2MAorI2RlZmluZSBWSVVfSlBFR19XQ0xLCQk2MQorI2RlZmluZSBWSVVfQ0ZHX0NMSwkJNjIKKyNkZWZpbmUgVFNfU1lTX1dDTEsJCTYzCisjZGVmaW5lIFRTX1NZU18xMDhNCQk2NAorI2RlZmluZSBVU0IyMF9IQ0xLCQk2NQorI2RlZmluZSBVU0IyMF9QSFlfQ0xLCQk2NgorI2RlZmluZSBVU0IyMV9IQ0xLCQk2NworI2RlZmluZSBVU0IyMV9QSFlfQ0xLCQk2OAorI2RlZmluZSBHTUFDX1JNSUlDTEsJCTY5CisjZGVmaW5lIEdNQUNfUENMSwkJNzAKKyNkZWZpbmUgR01BQ19BQ0xLCQk3MQorI2RlZmluZSBHTUFDX1JGQ0xLCQk3MgorI2RlZmluZSBURU1QU0VOU09SX0dBVEUJCTczCisKKyNkZWZpbmUgVE9QX05SX0NMS1MJCTc0CisKKworI2RlZmluZSBMU1AwX1RJTUVSM19QQ0xLCTEKKyNkZWZpbmUgTFNQMF9USU1FUjNfV0NMSwkyCisjZGVmaW5lIExTUDBfVElNRVI0X1BDTEsJMworI2RlZmluZSBMU1AwX1RJTUVSNF9XQ0xLCTQKKyNkZWZpbmUgTFNQMF9USU1FUjVfUENMSwk1CisjZGVmaW5lIExTUDBfVElNRVI1X1dDTEsJNgorI2RlZmluZSBMU1AwX1VBUlQzX1BDTEsJCTcKKyNkZWZpbmUgTFNQMF9VQVJUM19XQ0xLCQk4CisjZGVmaW5lIExTUDBfVUFSVDFfUENMSwkJOQorI2RlZmluZSBMU1AwX1VBUlQxX1dDTEsJCTEwCisjZGVmaW5lIExTUDBfVUFSVDJfUENMSwkJMTEKKyNkZWZpbmUgTFNQMF9VQVJUMl9XQ0xLCQkxMgorI2RlZmluZSBMU1AwX1NQSUZDMF9QQ0xLCTEzCisjZGVmaW5lIExTUDBfU1BJRkMwX1dDTEsJMTQKKyNkZWZpbmUgTFNQMF9JMkM0X1BDTEsJCTE1CisjZGVmaW5lIExTUDBfSTJDNF9XQ0xLCQkxNgorI2RlZmluZSBMU1AwX0kyQzVfUENMSwkJMTcKKyNkZWZpbmUgTFNQMF9JMkM1X1dDTEsJCTE4CisjZGVmaW5lIExTUDBfU1NQMF9QQ0xLCQkxOQorI2RlZmluZSBMU1AwX1NTUDBfV0NMSwkJMjAKKyNkZWZpbmUgTFNQMF9TU1AxX1BDTEsJCTIxCisjZGVmaW5lIExTUDBfU1NQMV9XQ0xLCQkyMgorI2RlZmluZSBMU1AwX1VTSU1fUENMSwkJMjMKKyNkZWZpbmUgTFNQMF9VU0lNX1dDTEsJCTI0CisjZGVmaW5lIExTUDBfR1BJT19QQ0xLCQkyNQorI2RlZmluZSBMU1AwX0dQSU9fV0NMSwkJMjYKKyNkZWZpbmUgTFNQMF9JMkMzX1BDTEsJCTI3CisjZGVmaW5lIExTUDBfSTJDM19XQ0xLCQkyOAorCisjZGVmaW5lIExTUDBfTlJfQ0xLUwkJMjkKKworCisjZGVmaW5lIExTUDFfVUFSVDRfUENMSwkJMQorI2RlZmluZSBMU1AxX1VBUlQ0X1dDTEsJCTIKKyNkZWZpbmUgTFNQMV9VQVJUNV9QQ0xLCQkzCisjZGVmaW5lIExTUDFfVUFSVDVfV0NMSwkJNAorI2RlZmluZSBMU1AxX1BXTV9QQ0xLCQk1CisjZGVmaW5lIExTUDFfUFdNX1dDTEsJCTYKKyNkZWZpbmUgTFNQMV9JMkMyX1BDTEsJCTcKKyNkZWZpbmUgTFNQMV9JMkMyX1dDTEsJCTgKKyNkZWZpbmUgTFNQMV9TU1AyX1BDTEsJCTkKKyNkZWZpbmUgTFNQMV9TU1AyX1dDTEsJCTEwCisjZGVmaW5lIExTUDFfU1NQM19QQ0xLCQkxMQorI2RlZmluZSBMU1AxX1NTUDNfV0NMSwkJMTIKKyNkZWZpbmUgTFNQMV9TU1A0X1BDTEsJCTEzCisjZGVmaW5lIExTUDFfU1NQNF9XQ0xLCQkxNAorI2RlZmluZSBMU1AxX1VTSU0xX1BDTEsJCTE1CisjZGVmaW5lIExTUDFfVVNJTTFfV0NMSwkJMTYKKworI2RlZmluZSBMU1AxX05SX0NMS1MJCTE3CisKKworI2RlZmluZSBBVURJT19JMlMwX1dDTEsJCTEKKyNkZWZpbmUgQVVESU9fSTJTMF9QQ0xLCQkyCisjZGVmaW5lIEFVRElPX0kyUzFfV0NMSwkJMworI2RlZmluZSBBVURJT19JMlMxX1BDTEsJCTQKKyNkZWZpbmUgQVVESU9fSTJTMl9XQ0xLCQk1CisjZGVmaW5lIEFVRElPX0kyUzJfUENMSwkJNgorI2RlZmluZSBBVURJT19JMlMzX1dDTEsJCTcKKyNkZWZpbmUgQVVESU9fSTJTM19QQ0xLCQk4CisjZGVmaW5lIEFVRElPX0kyQzBfV0NMSwkJOQorI2RlZmluZSBBVURJT19JMkMwX1BDTEsJCTEwCisjZGVmaW5lIEFVRElPX1NQRElGMF9XQ0xLCTExCisjZGVmaW5lIEFVRElPX1NQRElGMF9QQ0xLCTEyCisjZGVmaW5lIEFVRElPX1NQRElGMV9XQ0xLCTEzCisjZGVmaW5lIEFVRElPX1NQRElGMV9QQ0xLCTE0CisjZGVmaW5lIEFVRElPX1RJTUVSX1dDTEsJMTUKKyNkZWZpbmUgQVVESU9fVElNRVJfUENMSwkxNgorI2RlZmluZSBBVURJT19URE1fV0NMSwkJMTcKKyNkZWZpbmUgQVVESU9fVERNX1BDTEsJCTE4CisjZGVmaW5lIEFVRElPX1RTX1BDTEsJCTE5CisKKyNkZWZpbmUgQVVESU9fTlJfQ0xLUwkJMjAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL25ldC9tc2NjLXBoeS12c2M4NTMxLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL25ldC9tc2NjLXBoeS12c2M4NTMxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4M2RkMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvbmV0L21zY2MtcGh5LXZzYzg1MzEuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogRGV2aWNlIFRyZWUgY29uc3RhbnRzIGZvciBNaWNyb3NlbWkgVlNDODUzMSBQSFkKKyAqCisgKiBBdXRob3I6IE5hZ2FyYWp1IExha2thcmFqdQorICoKKyAqIExpY2Vuc2U6IER1YWwgTUlUL0dQTAorICogQ29weXJpZ2h0IChjKSAyMDE2IE1pY3Jvc2VtaSBDb3Jwb3JhdGlvbgorICovCisKKyNpZm5kZWYgX0RUX0JJTkRJTkdTX01TQ0NfVlNDODUzMV9ICisjZGVmaW5lIF9EVF9CSU5ESU5HU19NU0NDX1ZTQzg1MzFfSAorCisvKiBNQUMgaW50ZXJmYWNlIEVkZ2UgcmF0ZSBjb250cm9sIFZERE1BQyBpbiBtaWxsaSBWb2x0cyAqLworI2RlZmluZSBNU0NDX1ZERE1BQ18zMzAwCQkgMzMwMAorI2RlZmluZSBNU0NDX1ZERE1BQ18yNTAwCQkgMjUwMAorI2RlZmluZSBNU0NDX1ZERE1BQ18xODAwCQkgMTgwMAorI2RlZmluZSBNU0NDX1ZERE1BQ18xNTAwCQkgMTUwMAorI2RlZmluZSBNU0NDX1ZERE1BQ19NQVgJCQkgNAorI2RlZmluZSBNU0NDX1NMT1dET1dOX01BWAkJIDgKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L2d4YmItYW9jbGtjLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L2d4YmItYW9jbGtjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzZmQ2MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvcmVzZXQvZ3hiYi1hb2Nsa2MuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEJheUxpYnJlLCBTQVMuCisgKiBBdXRob3I6IE5laWwgQXJtc3Ryb25nIDxuYXJtc3Ryb25nQGJheWxpYnJlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQmF5TGlicmUsIFNBUy4KKyAqIEF1dGhvcjogTmVpbCBBcm1zdHJvbmcgPG5hcm1zdHJvbmdAYmF5bGlicmUuY29tPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgRFRfQklORElOR1NfUkVTRVRfQU1MT0dJQ19NRVNPTl9HWEJCX0FPQ0xLCisjZGVmaW5lIERUX0JJTkRJTkdTX1JFU0VUX0FNTE9HSUNfTUVTT05fR1hCQl9BT0NMSworCisjZGVmaW5lIFJFU0VUX0FPX1JFTU9URQkJMAorI2RlZmluZSBSRVNFVF9BT19JMkNfTUFTVEVSCTEKKyNkZWZpbmUgUkVTRVRfQU9fSTJDX1NMQVZFCTIKKyNkZWZpbmUgUkVTRVRfQU9fVUFSVDEJCTMKKyNkZWZpbmUgUkVTRVRfQU9fVUFSVDIJCTQKKyNkZWZpbmUgUkVTRVRfQU9fSVJfQkxBU1RFUgk1CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9tdDI3MDEtcmVzZXRzLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L210MjcwMS1yZXNldHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWYwMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9tdDI3MDEtcmVzZXRzLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBNZWRpYVRlaywgU2h1bmxpIFdhbmcgPHNodW5saS53YW5nQG1lZGlhdGVrLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfRFRfQklORElOR1NfUkVTRVRfQ09OVFJPTExFUl9NVDI3MDEKKyNkZWZpbmUgX0RUX0JJTkRJTkdTX1JFU0VUX0NPTlRST0xMRVJfTVQyNzAxCisKKy8qIElORlJBQ0ZHIHJlc2V0cyAqLworI2RlZmluZSBNVDI3MDFfSU5GUkFfRU1JX1JFR19SU1QJCTAKKyNkZWZpbmUgTVQyNzAxX0lORlJBX0RSQU1DMF9BMF9SU1QJCTEKKyNkZWZpbmUgTVQyNzAxX0lORlJBX0ZIQ1RMX1JTVAkJCTIKKyNkZWZpbmUgTVQyNzAxX0lORlJBX0FQQ0lSUV9FSU5UX1JTVAkJMworI2RlZmluZSBNVDI3MDFfSU5GUkFfQVBYR1BUX1JTVAkJCTQKKyNkZWZpbmUgTVQyNzAxX0lORlJBX1NDUFNZU19SU1QJCQk1CisjZGVmaW5lIE1UMjcwMV9JTkZSQV9LUF9SU1QJCQk2CisjZGVmaW5lIE1UMjcwMV9JTkZSQV9QTUlDX1dSQVBfUlNUCQk3CisjZGVmaW5lIE1UMjcwMV9JTkZSQV9NSVBJX1JTVAkJCTgKKyNkZWZpbmUgTVQyNzAxX0lORlJBX0lSUlhfUlNUCQkJOQorI2RlZmluZSBNVDI3MDFfSU5GUkFfQ0VDX1JTVAkJCTEwCisjZGVmaW5lIE1UMjcwMV9JTkZSQV9FTUlfUlNUCQkJMzIKKyNkZWZpbmUgTVQyNzAxX0lORlJBX0RSQU1DMF9SU1QJCQkzNAorI2RlZmluZSBNVDI3MDFfSU5GUkFfVFJOR19SU1QJCQkzNworI2RlZmluZSBNVDI3MDFfSU5GUkFfU1lTSVJRX1JTVAkJCTM4CisKKy8qICBQRVJJQ0ZHIHJlc2V0cyAqLworI2RlZmluZSBNVDI3MDFfUEVSSV9VQVJUMF9TV19SU1QJCTAKKyNkZWZpbmUgTVQyNzAxX1BFUklfVUFSVDFfU1dfUlNUCQkxCisjZGVmaW5lIE1UMjcwMV9QRVJJX1VBUlQyX1NXX1JTVAkJMgorI2RlZmluZSBNVDI3MDFfUEVSSV9VQVJUM19TV19SU1QJCTMKKyNkZWZpbmUgTVQyNzAxX1BFUklfR0NQVV9TV19SU1QJCQk1CisjZGVmaW5lIE1UMjcwMV9QRVJJX0JUSUZfU1dfUlNUCQkJNgorI2RlZmluZSBNVDI3MDFfUEVSSV9QV01fU1dfUlNUCQkJOAorI2RlZmluZSBNVDI3MDFfUEVSSV9BVVhBRENfU1dfUlNUCQkxMAorI2RlZmluZSBNVDI3MDFfUEVSSV9ETUFfU1dfUlNUCQkJMTEKKyNkZWZpbmUgTVQyNzAxX1BFUklfTkZJX1NXX1JTVAkJCTE0CisjZGVmaW5lIE1UMjcwMV9QRVJJX05MSV9TV19SU1QJCQkxNQorI2RlZmluZSBNVDI3MDFfUEVSSV9USEVSTV9TV19SU1QJCTE2CisjZGVmaW5lIE1UMjcwMV9QRVJJX01TREMyX1NXX1JTVAkJMTcKKyNkZWZpbmUgTVQyNzAxX1BFUklfTVNEQzBfU1dfUlNUCQkxOQorI2RlZmluZSBNVDI3MDFfUEVSSV9NU0RDMV9TV19SU1QJCTIwCisjZGVmaW5lIE1UMjcwMV9QRVJJX0kyQzBfU1dfUlNUCQkJMjIKKyNkZWZpbmUgTVQyNzAxX1BFUklfSTJDMV9TV19SU1QJCQkyMworI2RlZmluZSBNVDI3MDFfUEVSSV9JMkMyX1NXX1JTVAkJCTI0CisjZGVmaW5lIE1UMjcwMV9QRVJJX0kyQzNfU1dfUlNUCQkJMjUKKyNkZWZpbmUgTVQyNzAxX1BFUklfVVNCX1NXX1JTVAkJCTI4CisjZGVmaW5lIE1UMjcwMV9QRVJJX0VUSF9TV19SU1QJCQkyOQorI2RlZmluZSBNVDI3MDFfUEVSSV9TUEkwX1NXX1JTVAkJCTMzCisKKy8qIFRPUFJHVSByZXNldHMgKi8KKyNkZWZpbmUgTVQyNzAxX1RPUFJHVV9JTkZSQV9SU1QJCQkwCisjZGVmaW5lIE1UMjcwMV9UT1BSR1VfTU1fUlNUCQkJMQorI2RlZmluZSBNVDI3MDFfVE9QUkdVX01GR19SU1QJCQkyCisjZGVmaW5lIE1UMjcwMV9UT1BSR1VfRVRIRE1BX1JTVAkJMworI2RlZmluZSBNVDI3MDFfVE9QUkdVX1ZERUNfUlNUCQkJNAorI2RlZmluZSBNVDI3MDFfVE9QUkdVX1ZFTkNfSU1HX1JTVAkJNQorI2RlZmluZSBNVDI3MDFfVE9QUkdVX0REUlBIWV9SU1QJCTYKKyNkZWZpbmUgTVQyNzAxX1RPUFJHVV9NRF9SU1QJCQk3CisjZGVmaW5lIE1UMjcwMV9UT1BSR1VfSU5GUkFfQU9fUlNUCQk4CisjZGVmaW5lIE1UMjcwMV9UT1BSR1VfQ09OTl9SU1QJCQk5CisjZGVmaW5lIE1UMjcwMV9UT1BSR1VfQVBNSVhFRF9SU1QJCTEwCisjZGVmaW5lIE1UMjcwMV9UT1BSR1VfSElGU1lTX1JTVAkJMTEKKyNkZWZpbmUgTVQyNzAxX1RPUFJHVV9DT05OX01DVV9SU1QJCTEyCisjZGVmaW5lIE1UMjcwMV9UT1BSR1VfQkRQX0RJU1BfUlNUCQkxMworCisvKiBISUZTWVMgcmVzZXRzICovCisjZGVmaW5lIE1UMjcwMV9ISUZTWVNfVUhPU1QwX1JTVAkJMworI2RlZmluZSBNVDI3MDFfSElGU1lTX1VIT1NUMV9SU1QJCTQKKyNkZWZpbmUgTVQyNzAxX0hJRlNZU19VUEhZMF9SU1QJCQkyMQorI2RlZmluZSBNVDI3MDFfSElGU1lTX1VQSFkxX1JTVAkJCTIyCisjZGVmaW5lIE1UMjcwMV9ISUZTWVNfUENJRTBfUlNUCQkJMjQKKyNkZWZpbmUgTVQyNzAxX0hJRlNZU19QQ0lFMV9SU1QJCQkyNQorI2RlZmluZSBNVDI3MDFfSElGU1lTX1BDSUUyX1JTVAkJCTI2CisKKyNlbmRpZiAgLyogX0RUX0JJTkRJTkdTX1JFU0VUX0NPTlRST0xMRVJfTVQyNzAxICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L3Fjb20sZ2NjLW1kbTk2MTUuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvcmVzZXQvcWNvbSxnY2MtbWRtOTYxNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmODZlOWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L3Fjb20sZ2NjLW1kbTk2MTUuaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIEJheUxpYnJlLCBTQVMuCisgKiBBdXRob3IgOiBOZWlsIEFybXN0cm9uZyA8bmFybXN0cm9uZ0BiYXlsaWJyZS5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9EVF9CSU5ESU5HU19SRVNFVF9HQ0NfTURNOTYxNV9ICisjZGVmaW5lIF9EVF9CSU5ESU5HU19SRVNFVF9HQ0NfTURNOTYxNV9ICisKKyNkZWZpbmUgU0ZBQl9NU1NfUTZfU1dfUkVTRVQJCQkJMAorI2RlZmluZSBTRkFCX01TU19RNl9GV19SRVNFVAkJCQkxCisjZGVmaW5lIFFEU1NfU1RNX1JFU0VUCQkJCQkyCisjZGVmaW5lIEFGQUJfU01QU1NfU19SRVNFVAkJCQkzCisjZGVmaW5lIEFGQUJfU01QU1NfTTFfUkVTRVQJCQkJNAorI2RlZmluZSBBRkFCX1NNUFNTX00wX1JFU0VUCQkJCTUKKyNkZWZpbmUgQUZBQl9FQkkxX0NIMF9SRVNFVAkJCQk2CisjZGVmaW5lIEFGQUJfRUJJMV9DSDFfUkVTRVQJCQkJNworI2RlZmluZSBTRkFCX0FETTBfTTBfUkVTRVQJCQkJOAorI2RlZmluZSBTRkFCX0FETTBfTTFfUkVTRVQJCQkJOQorI2RlZmluZSBTRkFCX0FETTBfTTJfUkVTRVQJCQkJMTAKKyNkZWZpbmUgQURNMF9DMl9SRVNFVAkJCQkJMTEKKyNkZWZpbmUgQURNMF9DMV9SRVNFVAkJCQkJMTIKKyNkZWZpbmUgQURNMF9DMF9SRVNFVAkJCQkJMTMKKyNkZWZpbmUgQURNMF9QQlVTX1JFU0VUCQkJCQkxNAorI2RlZmluZSBBRE0wX1JFU0VUCQkJCQkxNQorI2RlZmluZSBRRFNTX0NMS1NfU1dfUkVTRVQJCQkJMTYKKyNkZWZpbmUgUURTU19QT1JfUkVTRVQJCQkJCTE3CisjZGVmaW5lIFFEU1NfVFNDVFJfUkVTRVQJCQkJMTgKKyNkZWZpbmUgUURTU19IUkVTRVRfUkVTRVQJCQkJMTkKKyNkZWZpbmUgUURTU19BWElfUkVTRVQJCQkJCTIwCisjZGVmaW5lIFFEU1NfREJHX1JFU0VUCQkJCQkyMQorI2RlZmluZSBQQ0lFX0FfUkVTRVQJCQkJCTIyCisjZGVmaW5lIFBDSUVfQVVYX1JFU0VUCQkJCQkyMworI2RlZmluZSBQQ0lFX0hfUkVTRVQJCQkJCTI0CisjZGVmaW5lIFNGQUJfUENJRV9NX1JFU0VUCQkJCTI1CisjZGVmaW5lIFNGQUJfUENJRV9TX1JFU0VUCQkJCTI2CisjZGVmaW5lIFNGQUJfTVNTX01fUkVTRVQJCQkJMjcKKyNkZWZpbmUgU0ZBQl9VU0IzX01fUkVTRVQJCQkJMjgKKyNkZWZpbmUgU0ZBQl9SSVZBX01fUkVTRVQJCQkJMjkKKyNkZWZpbmUgU0ZBQl9MUEFTU19SRVNFVAkJCQkzMAorI2RlZmluZSBTRkFCX0FGQUJfTV9SRVNFVAkJCQkzMQorI2RlZmluZSBBRkFCX1NGQUJfTTBfUkVTRVQJCQkJMzIKKyNkZWZpbmUgQUZBQl9TRkFCX00xX1JFU0VUCQkJCTMzCisjZGVmaW5lIFNGQUJfU0FUQV9TX1JFU0VUCQkJCTM0CisjZGVmaW5lIFNGQUJfREZBQl9NX1JFU0VUCQkJCTM1CisjZGVmaW5lIERGQUJfU0ZBQl9NX1JFU0VUCQkJCTM2CisjZGVmaW5lIERGQUJfU1dBWTBfUkVTRVQJCQkJMzcKKyNkZWZpbmUgREZBQl9TV0FZMV9SRVNFVAkJCQkzOAorI2RlZmluZSBERkFCX0FSQjBfUkVTRVQJCQkJCTM5CisjZGVmaW5lIERGQUJfQVJCMV9SRVNFVAkJCQkJNDAKKyNkZWZpbmUgUFBTU19QUk9DX1JFU0VUCQkJCQk0MQorI2RlZmluZSBQUFNTX1JFU0VUCQkJCQk0MgorI2RlZmluZSBETUFfQkFNX1JFU0VUCQkJCQk0MworI2RlZmluZSBTUFNfVElDX0hfUkVTRVQJCQkJCTQ0CisjZGVmaW5lIFNMSU1CVVNfSF9SRVNFVAkJCQkJNDUKKyNkZWZpbmUgU0ZBQl9DRlBCX01fUkVTRVQJCQkJNDYKKyNkZWZpbmUgU0ZBQl9DRlBCX1NfUkVTRVQJCQkJNDcKKyNkZWZpbmUgVFNJRl9IX1JFU0VUCQkJCQk0OAorI2RlZmluZSBDRTFfSF9SRVNFVAkJCQkJNDkKKyNkZWZpbmUgQ0UxX0NPUkVfUkVTRVQJCQkJCTUwCisjZGVmaW5lIENFMV9TTEVFUF9SRVNFVAkJCQkJNTEKKyNkZWZpbmUgQ0UyX0hfUkVTRVQJCQkJCTUyCisjZGVmaW5lIENFMl9DT1JFX1JFU0VUCQkJCQk1MworI2RlZmluZSBTRkFCX1NGUEJfTV9SRVNFVAkJCQk1NAorI2RlZmluZSBTRkFCX1NGUEJfU19SRVNFVAkJCQk1NQorI2RlZmluZSBSUE1fUFJPQ19SRVNFVAkJCQkJNTYKKyNkZWZpbmUgUE1JQ19TU0JJMl9SRVNFVAkJCQk1NworI2RlZmluZSBTREMxX1JFU0VUCQkJCQk1OAorI2RlZmluZSBTREMyX1JFU0VUCQkJCQk1OQorI2RlZmluZSBTREMzX1JFU0VUCQkJCQk2MAorI2RlZmluZSBTREM0X1JFU0VUCQkJCQk2MQorI2RlZmluZSBTREM1X1JFU0VUCQkJCQk2MgorI2RlZmluZSBERkFCX0EyX1JFU0VUCQkJCQk2MworI2RlZmluZSBVU0JfSFMxX1JFU0VUCQkJCQk2NAorI2RlZmluZSBVU0JfSFNJQ19SRVNFVAkJCQkJNjUKKyNkZWZpbmUgVVNCX0ZTMV9YQ1ZSX1JFU0VUCQkJCTY2CisjZGVmaW5lIFVTQl9GUzFfUkVTRVQJCQkJCTY3CisjZGVmaW5lIFVTQl9GUzJfWENWUl9SRVNFVAkJCQk2OAorI2RlZmluZSBVU0JfRlMyX1JFU0VUCQkJCQk2OQorI2RlZmluZSBHU0JJMV9SRVNFVAkJCQkJNzAKKyNkZWZpbmUgR1NCSTJfUkVTRVQJCQkJCTcxCisjZGVmaW5lIEdTQkkzX1JFU0VUCQkJCQk3MgorI2RlZmluZSBHU0JJNF9SRVNFVAkJCQkJNzMKKyNkZWZpbmUgR1NCSTVfUkVTRVQJCQkJCTc0CisjZGVmaW5lIEdTQkk2X1JFU0VUCQkJCQk3NQorI2RlZmluZSBHU0JJN19SRVNFVAkJCQkJNzYKKyNkZWZpbmUgR1NCSThfUkVTRVQJCQkJCTc3CisjZGVmaW5lIEdTQkk5X1JFU0VUCQkJCQk3OAorI2RlZmluZSBHU0JJMTBfUkVTRVQJCQkJCTc5CisjZGVmaW5lIEdTQkkxMV9SRVNFVAkJCQkJODAKKyNkZWZpbmUgR1NCSTEyX1JFU0VUCQkJCQk4MQorI2RlZmluZSBTUERNX1JFU0VUCQkJCQk4MgorI2RlZmluZSBUTE1NX0hfUkVTRVQJCQkJCTgzCisjZGVmaW5lIFNGQUJfTVNTX1NfUkVTRVQJCQkJODQKKyNkZWZpbmUgTVNTX1NMUF9SRVNFVAkJCQkJODUKKyNkZWZpbmUgTVNTX1E2U1dfSlRBR19SRVNFVAkJCQk4NgorI2RlZmluZSBNU1NfUTZGV19KVEFHX1JFU0VUCQkJCTg3CisjZGVmaW5lIE1TU19SRVNFVAkJCQkJODgKKyNkZWZpbmUgU0FUQV9IX1JFU0VUCQkJCQk4OQorI2RlZmluZSBTQVRBX1JYT09CX1JFU0UJCQkJCTkwCisjZGVmaW5lIFNBVEFfUE1BTElWRV9SRVNFVAkJCQk5MQorI2RlZmluZSBTQVRBX1NGQUJfTV9SRVNFVAkJCQk5MgorI2RlZmluZSBUU1NDX1JFU0VUCQkJCQk5MworI2RlZmluZSBQRE1fUkVTRVQJCQkJCTk0CisjZGVmaW5lIE1QTV9IX1JFU0VUCQkJCQk5NQorI2RlZmluZSBNUE1fUkVTRVQJCQkJCTk2CisjZGVmaW5lIFNGQUJfU01QU1NfU19SRVNFVAkJCQk5NworI2RlZmluZSBQUk5HX1JFU0VUCQkJCQk5OAorI2RlZmluZSBSSVZBX1JFU0VUCQkJCQk5OQorI2RlZmluZSBVU0JfSFMzX1JFU0VUCQkJCQkxMDAKKyNkZWZpbmUgVVNCX0hTNF9SRVNFVAkJCQkJMTAxCisjZGVmaW5lIENFM19SRVNFVAkJCQkJMTAyCisjZGVmaW5lIFBDSUVfRVhUX1BDSV9SRVNFVAkJCQkxMDMKKyNkZWZpbmUgUENJRV9QSFlfUkVTRVQJCQkJCTEwNAorI2RlZmluZSBQQ0lFX1BDSV9SRVNFVAkJCQkJMTA1CisjZGVmaW5lIFBDSUVfUE9SX1JFU0VUCQkJCQkxMDYKKyNkZWZpbmUgUENJRV9IQ0xLX1JFU0VUCQkJCQkxMDcKKyNkZWZpbmUgUENJRV9BQ0xLX1JFU0VUCQkJCQkxMDgKKyNkZWZpbmUgQ0UzX0hfUkVTRVQJCQkJCTEwOQorI2RlZmluZSBTRkFCX0NFM19NX1JFU0VUCQkJCTExMAorI2RlZmluZSBTRkFCX0NFM19TX1JFU0VUCQkJCTExMQorI2RlZmluZSBTQVRBX1JFU0VUCQkJCQkxMTIKKyNkZWZpbmUgQ0UzX1NMRUVQX1JFU0VUCQkJCQkxMTMKKyNkZWZpbmUgR1NTX1NMUF9SRVNFVAkJCQkJMTE0CisjZGVmaW5lIEdTU19SRVNFVAkJCQkJMTE1CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9zdW42aS1hMzEtY2N1LmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L3N1bjZpLWEzMS1jY3UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmZmMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9zdW42aS1hMzEtY2N1LmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQ2hlbi1ZdSBUc2FpIDx3ZW5zQGNzaWUub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBkdWFsLWxpY2Vuc2VkOiB5b3UgY2FuIHVzZSBpdCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR1BMIG9yIHRoZSBYMTEgbGljZW5zZSwgYXQgeW91ciBvcHRpb24uIE5vdGUgdGhhdCB0aGlzIGR1YWwKKyAqIGxpY2Vuc2luZyBvbmx5IGFwcGxpZXMgdG8gdGhpcyBmaWxlLCBhbmQgbm90IHRoaXMgcHJvamVjdCBhcyBhCisgKiB3aG9sZS4KKyAqCisgKiAgYSkgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiAgICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBPciwgYWx0ZXJuYXRpdmVseSwKKyAqCisgKiAgYikgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogICAgIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9uczoKKyAqCisgKiAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqICAgICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRFRfQklORElOR1NfUlNUX1NVTjZJX0EzMV9IXworI2RlZmluZSBfRFRfQklORElOR1NfUlNUX1NVTjZJX0EzMV9IXworCisjZGVmaW5lIFJTVF9VU0JfUEhZMAkJMAorI2RlZmluZSBSU1RfVVNCX1BIWTEJCTEKKyNkZWZpbmUgUlNUX1VTQl9QSFkyCQkyCisKKyNkZWZpbmUgUlNUX0FIQjFfTUlQSV9EU0kJMworI2RlZmluZSBSU1RfQUhCMV9TUwkJNAorI2RlZmluZSBSU1RfQUhCMV9ETUEJCTUKKyNkZWZpbmUgUlNUX0FIQjFfTU1DMAkJNgorI2RlZmluZSBSU1RfQUhCMV9NTUMxCQk3CisjZGVmaW5lIFJTVF9BSEIxX01NQzIJCTgKKyNkZWZpbmUgUlNUX0FIQjFfTU1DMwkJOQorI2RlZmluZSBSU1RfQUhCMV9OQU5EMQkJMTAKKyNkZWZpbmUgUlNUX0FIQjFfTkFORDAJCTExCisjZGVmaW5lIFJTVF9BSEIxX1NEUkFNCQkxMgorI2RlZmluZSBSU1RfQUhCMV9FTUFDCQkxMworI2RlZmluZSBSU1RfQUhCMV9UUwkJMTQKKyNkZWZpbmUgUlNUX0FIQjFfSFNUSU1FUgkxNQorI2RlZmluZSBSU1RfQUhCMV9TUEkwCQkxNgorI2RlZmluZSBSU1RfQUhCMV9TUEkxCQkxNworI2RlZmluZSBSU1RfQUhCMV9TUEkyCQkxOAorI2RlZmluZSBSU1RfQUhCMV9TUEkzCQkxOQorI2RlZmluZSBSU1RfQUhCMV9PVEcJCTIwCisjZGVmaW5lIFJTVF9BSEIxX0VIQ0kwCQkyMQorI2RlZmluZSBSU1RfQUhCMV9FSENJMQkJMjIKKyNkZWZpbmUgUlNUX0FIQjFfT0hDSTAJCTIzCisjZGVmaW5lIFJTVF9BSEIxX09IQ0kxCQkyNAorI2RlZmluZSBSU1RfQUhCMV9PSENJMgkJMjUKKyNkZWZpbmUgUlNUX0FIQjFfVkUJCTI2CisjZGVmaW5lIFJTVF9BSEIxX0xDRDAJCTI3CisjZGVmaW5lIFJTVF9BSEIxX0xDRDEJCTI4CisjZGVmaW5lIFJTVF9BSEIxX0NTSQkJMjkKKyNkZWZpbmUgUlNUX0FIQjFfSERNSQkJMzAKKyNkZWZpbmUgUlNUX0FIQjFfQkUwCQkzMQorI2RlZmluZSBSU1RfQUhCMV9CRTEJCTMyCisjZGVmaW5lIFJTVF9BSEIxX0ZFMAkJMzMKKyNkZWZpbmUgUlNUX0FIQjFfRkUxCQkzNAorI2RlZmluZSBSU1RfQUhCMV9NUAkJMzUKKyNkZWZpbmUgUlNUX0FIQjFfR1BVCQkzNgorI2RlZmluZSBSU1RfQUhCMV9ERVUwCQkzNworI2RlZmluZSBSU1RfQUhCMV9ERVUxCQkzOAorI2RlZmluZSBSU1RfQUhCMV9EUkMwCQkzOQorI2RlZmluZSBSU1RfQUhCMV9EUkMxCQk0MAorI2RlZmluZSBSU1RfQUhCMV9MVkRTCQk0MQorCisjZGVmaW5lIFJTVF9BUEIxX0NPREVDCQk0MgorI2RlZmluZSBSU1RfQVBCMV9TUERJRgkJNDMKKyNkZWZpbmUgUlNUX0FQQjFfRElHSVRBTF9NSUMJNDQKKyNkZWZpbmUgUlNUX0FQQjFfREFVRElPMAk0NQorI2RlZmluZSBSU1RfQVBCMV9EQVVESU8xCTQ2CisjZGVmaW5lIFJTVF9BUEIyX0kyQzAJCTQ3CisjZGVmaW5lIFJTVF9BUEIyX0kyQzEJCTQ4CisjZGVmaW5lIFJTVF9BUEIyX0kyQzIJCTQ5CisjZGVmaW5lIFJTVF9BUEIyX0kyQzMJCTUwCisjZGVmaW5lIFJTVF9BUEIyX1VBUlQwCQk1MQorI2RlZmluZSBSU1RfQVBCMl9VQVJUMQkJNTIKKyNkZWZpbmUgUlNUX0FQQjJfVUFSVDIJCTUzCisjZGVmaW5lIFJTVF9BUEIyX1VBUlQzCQk1NAorI2RlZmluZSBSU1RfQVBCMl9VQVJUNAkJNTUKKyNkZWZpbmUgUlNUX0FQQjJfVUFSVDUJCTU2CisKKyNlbmRpZiAvKiBfRFRfQklORElOR1NfUlNUX1NVTjZJX0EzMV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9zdW44aS1hMjMtYTMzLWNjdS5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9zdW44aS1hMjMtYTMzLWNjdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMjFmMmIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L3N1bjhpLWEyMy1hMzMtY2N1LmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBNYXhpbWUgUmlwYXJkIDxtYXhpbWUucmlwYXJkQGZyZWUtZWxlY3Ryb25zLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZHVhbC1saWNlbnNlZDogeW91IGNhbiB1c2UgaXQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdQTCBvciB0aGUgWDExIGxpY2Vuc2UsIGF0IHlvdXIgb3B0aW9uLiBOb3RlIHRoYXQgdGhpcyBkdWFsCisgKiBsaWNlbnNpbmcgb25seSBhcHBsaWVzIHRvIHRoaXMgZmlsZSwgYW5kIG5vdCB0aGlzIHByb2plY3QgYXMgYQorICogd2hvbGUuCisgKgorICogIGEpIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogICAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogT3IsIGFsdGVybmF0aXZlbHksCisgKgorICogIGIpIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqICAgICBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnM6CisgKgorICogICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiAgICAgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0RUX0JJTkRJTkdTX1JTVF9TVU44SV9BMjNfQTMzX0hfCisjZGVmaW5lIF9EVF9CSU5ESU5HU19SU1RfU1VOOElfQTIzX0EzM19IXworCisjZGVmaW5lIFJTVF9VU0JfUEhZMAkJMAorI2RlZmluZSBSU1RfVVNCX1BIWTEJCTEKKyNkZWZpbmUgUlNUX1VTQl9IU0lDCQkyCisjZGVmaW5lIFJTVF9NQlVTCQkzCisjZGVmaW5lIFJTVF9CVVNfTUlQSV9EU0kJNAorI2RlZmluZSBSU1RfQlVTX1NTCQk1CisjZGVmaW5lIFJTVF9CVVNfRE1BCQk2CisjZGVmaW5lIFJTVF9CVVNfTU1DMAkJNworI2RlZmluZSBSU1RfQlVTX01NQzEJCTgKKyNkZWZpbmUgUlNUX0JVU19NTUMyCQk5CisjZGVmaW5lIFJTVF9CVVNfTkFORAkJMTAKKyNkZWZpbmUgUlNUX0JVU19EUkFNCQkxMQorI2RlZmluZSBSU1RfQlVTX0hTVElNRVIJCTEyCisjZGVmaW5lIFJTVF9CVVNfU1BJMAkJMTMKKyNkZWZpbmUgUlNUX0JVU19TUEkxCQkxNAorI2RlZmluZSBSU1RfQlVTX09URwkJMTUKKyNkZWZpbmUgUlNUX0JVU19FSENJCQkxNgorI2RlZmluZSBSU1RfQlVTX09IQ0kJCTE3CisjZGVmaW5lIFJTVF9CVVNfVkUJCTE4CisjZGVmaW5lIFJTVF9CVVNfTENECQkxOQorI2RlZmluZSBSU1RfQlVTX0NTSQkJMjAKKyNkZWZpbmUgUlNUX0JVU19ERV9CRQkJMjEKKyNkZWZpbmUgUlNUX0JVU19ERV9GRQkJMjIKKyNkZWZpbmUgUlNUX0JVU19HUFUJCTIzCisjZGVmaW5lIFJTVF9CVVNfTVNHQk9YCQkyNAorI2RlZmluZSBSU1RfQlVTX1NQSU5MT0NLCTI1CisjZGVmaW5lIFJTVF9CVVNfRFJDCQkyNgorI2RlZmluZSBSU1RfQlVTX1NBVAkJMjcKKyNkZWZpbmUgUlNUX0JVU19MVkRTCQkyOAorI2RlZmluZSBSU1RfQlVTX0NPREVDCQkyOQorI2RlZmluZSBSU1RfQlVTX0kyUzAJCTMwCisjZGVmaW5lIFJTVF9CVVNfSTJTMQkJMzEKKyNkZWZpbmUgUlNUX0JVU19JMkMwCQkzMgorI2RlZmluZSBSU1RfQlVTX0kyQzEJCTMzCisjZGVmaW5lIFJTVF9CVVNfSTJDMgkJMzQKKyNkZWZpbmUgUlNUX0JVU19VQVJUMAkJMzUKKyNkZWZpbmUgUlNUX0JVU19VQVJUMQkJMzYKKyNkZWZpbmUgUlNUX0JVU19VQVJUMgkJMzcKKyNkZWZpbmUgUlNUX0JVU19VQVJUMwkJMzgKKyNkZWZpbmUgUlNUX0JVU19VQVJUNAkJMzkKKworI2VuZGlmIC8qIF9EVF9CSU5ESU5HU19SU1RfU1VOOElfQTIzX0EzM19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hY3BpLmggYi9pbmNsdWRlL2xpbnV4L2FjcGkuaAppbmRleCA0ZDg0NTJjLi45NGFmY2IyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hY3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKQEAgLTg1LDYgKzg1LDggQEAKIAlyZXR1cm4gZGV2X25hbWUoJmFkZXYtPmRldik7CiB9CiAKK3N0cnVjdCBkZXZpY2UgKmFjcGlfZ2V0X2ZpcnN0X3BoeXNpY2FsX25vZGUoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KTsKKwogZW51bSBhY3BpX2lycV9tb2RlbF9pZCB7CiAJQUNQSV9JUlFfTU9ERUxfUElDID0gMCwKIAlBQ1BJX0lSUV9NT0RFTF9JT0FQSUMsCkBAIC0yNjcsMTIgKzI2OSwxOCBAQAogCXJldHVybiBwaHlzX2lkID09IFBIWVNfQ1BVSURfSU5WQUxJRDsKIH0KIAorLyogVmFsaWRhdGUgdGhlIHByb2Nlc3NvciBvYmplY3QncyBwcm9jX2lkICovCitib29sIGFjcGlfcHJvY2Vzc29yX3ZhbGlkYXRlX3Byb2NfaWQoaW50IHByb2NfaWQpOworCiAjaWZkZWYgQ09ORklHX0FDUElfSE9UUExVR19DUFUKIC8qIEFyY2ggZGVwZW5kZW50IGZ1bmN0aW9ucyBmb3IgY3B1IGhvdHBsdWcgc3VwcG9ydCAqLwogaW50IGFjcGlfbWFwX2NwdShhY3BpX2hhbmRsZSBoYW5kbGUsIHBoeXNfY3B1aWRfdCBwaHlzaWQsIGludCAqcGNwdSk7CiBpbnQgYWNwaV91bm1hcF9jcHUoaW50IGNwdSk7CitpbnQgYWNwaV9tYXBfY3B1Mm5vZGUoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgY3B1LCBpbnQgcGh5c2lkKTsKICNlbmRpZiAvKiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVSAqLwogCit2b2lkIGFjcGlfc2V0X3Byb2Nlc3Nvcl9tYXBwaW5nKHZvaWQpOworCiAjaWZkZWYgQ09ORklHX0FDUElfSE9UUExVR19JT0FQSUMKIGludCBhY3BpX2dldF9pb2FwaWNfaWQoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZ3NpX2Jhc2UsIHU2NCAqcGh5c19hZGRyKTsKICNlbmRpZgpAQCAtNjM0LDYgKzY0MiwxMSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2UgKmFjcGlfZ2V0X2ZpcnN0X3BoeXNpY2FsX25vZGUoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KQoreworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9lYXJseV9pbml0KHZvaWQpIHsgfQogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfc3Vic3lzdGVtX2luaXQodm9pZCkgeyB9CiAKQEAgLTc1MSw2ICs3NjQsMTIgQEAKIAogI2VuZGlmCS8qICFDT05GSUdfQUNQSSAqLwogCisjaWZkZWYgQ09ORklHX0FDUElfSE9UUExVR19JT0FQSUMKK2ludCBhY3BpX2lvYXBpY19hZGQoYWNwaV9oYW5kbGUgcm9vdCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgYWNwaV9pb2FwaWNfYWRkKGFjcGlfaGFuZGxlIHJvb3QpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0FDUEkKIHZvaWQgYWNwaV9vc19zZXRfcHJlcGFyZV9zbGVlcChpbnQgKCpmdW5jKSh1OCBzbGVlcF9zdGF0ZSwKIAkJCSAgICAgICB1MzIgcG0xYV9jdHJsLCAgdTMyIHBtMWJfY3RybCkpOwpAQCAtMTA1Niw3ICsxMDc1LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotI2RlZmluZSBBQ1BJX0RFQ0xBUkVfUFJPQkVfRU5UUlkodGFibGUsIG5hbWUsIHRhYmxlX2lkLCBzdWJ0YWJsZSwgdmFsaWRhdGUsIGRhdGEsIGZuKSBcCisjZGVmaW5lIEFDUElfREVDTEFSRV9QUk9CRV9FTlRSWSh0YWJsZSwgbmFtZSwgdGFibGVfaWQsIHN1YnRhYmxlLCB2YWxpZCwgZGF0YSwgZm4pIFwKIAlzdGF0aWMgY29uc3Qgdm9pZCAqIF9fYWNwaV90YWJsZV8jI25hbWVbXQkJCVwKIAkJX19hdHRyaWJ1dGVfXygodW51c2VkKSkJCQkJCVwKIAkJID0geyAodm9pZCAqKSB0YWJsZV9pZCwJCQkJCVwKQEAgLTEwNzQsNCArMTA5MywxNiBAQAogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfdGFibGVfdXBncmFkZSh2b2lkKSB7IH0KICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfQUNQSSkgJiYgZGVmaW5lZChDT05GSUdfQUNQSV9XQVRDSERPRykKK2V4dGVybiBib29sIGFjcGlfaGFzX3dhdGNoZG9nKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgYm9vbCBhY3BpX2hhc193YXRjaGRvZyh2b2lkKSB7IHJldHVybiBmYWxzZTsgfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQUNQSV9TUENSX1RBQkxFCitpbnQgcGFyc2Vfc3Bjcihib29sIGVhcmx5Y29uKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBwYXJzZV9zcGNyKGJvb2wgZWFybHljb24pIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgorCiAjZW5kaWYJLypfTElOVVhfQUNQSV9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWNwaV9pb3J0LmggYi9pbmNsdWRlL2xpbnV4L2FjcGlfaW9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMzJkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2FjcGlfaW9ydC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYsIFNlbWloYWxmCisgKglBdXRob3I6IFRvbWFzeiBOb3dpY2tpIDx0bkBzZW1paGFsZi5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICovCisKKyNpZm5kZWYgX19BQ1BJX0lPUlRfSF9fCisjZGVmaW5lIF9fQUNQSV9JT1JUX0hfXworCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Z3bm9kZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorCitpbnQgaW9ydF9yZWdpc3Rlcl9kb21haW5fdG9rZW4oaW50IHRyYW5zX2lkLCBzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndfbm9kZSk7Cit2b2lkIGlvcnRfZGVyZWdpc3Rlcl9kb21haW5fdG9rZW4oaW50IHRyYW5zX2lkKTsKK3N0cnVjdCBmd25vZGVfaGFuZGxlICppb3J0X2ZpbmRfZG9tYWluX3Rva2VuKGludCB0cmFuc19pZCk7CisjaWZkZWYgQ09ORklHX0FDUElfSU9SVAordm9pZCBhY3BpX2lvcnRfaW5pdCh2b2lkKTsKK3UzMiBpb3J0X21zaV9tYXBfcmlkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHJlcV9pZCk7CitzdHJ1Y3QgaXJxX2RvbWFpbiAqaW9ydF9nZXRfZGV2aWNlX2RvbWFpbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiByZXFfaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX2lvcnRfaW5pdCh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdTMyIGlvcnRfbXNpX21hcF9yaWQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgcmVxX2lkKQoreyByZXR1cm4gcmVxX2lkOyB9CitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcnFfZG9tYWluICppb3J0X2dldF9kZXZpY2VfZG9tYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCQl1MzIgcmVxX2lkKQoreyByZXR1cm4gTlVMTDsgfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FDUElfSU9SVF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYW1iYS9idXMuaCBiL2luY2x1ZGUvbGludXgvYW1iYS9idXMuaAppbmRleCAzZDhkY2RkLi5kMTQzYzEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FtYmEvYnVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9hbWJhL2J1cy5oCkBAIC01Myw4ICs1MywxNCBAQAogCUFNQkFfVkVORE9SX1NUID0gMHg4MCwKIAlBTUJBX1ZFTkRPUl9RQ09NID0gMHg1MSwKIAlBTUJBX1ZFTkRPUl9MU0kgPSAweGI2LAorCUFNQkFfVkVORE9SX0xJTlVYID0gMHhmZSwJLyogVGhpcyB2YWx1ZSBpcyBub3Qgb2ZmaWNpYWwgKi8KIH07CiAKKy8qIFRoaXMgaXMgdXNlZCB0byBnZW5lcmF0ZSBwc2V1ZG8tSUQgZm9yIEFNQkEgZGV2aWNlICovCisjZGVmaW5lIEFNQkFfTElOVVhfSUQoY29uZiwgcmV2LCBwYXJ0KSBcCisJKCgoY29uZikgJiAweGZmKSA8PCAyNCB8ICgocmV2KSAmIDB4ZikgPDwgMjAgfCBcCisJQU1CQV9WRU5ET1JfTElOVVggPDwgMTIgfCAoKHBhcnQpICYgMHhmZmYpKQorCiBleHRlcm4gc3RydWN0IGJ1c190eXBlIGFtYmFfYnVzdHlwZTsKIAogI2RlZmluZSB0b19hbWJhX2RldmljZShkKQljb250YWluZXJfb2YoZCwgc3RydWN0IGFtYmFfZGV2aWNlLCBkZXYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FtYmEvc2VyaWFsLmggYi9pbmNsdWRlL2xpbnV4L2FtYmEvc2VyaWFsLmgKaW5kZXggZDc2YTE5Yi4uYWQwOTY1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hbWJhL3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvYW1iYS9zZXJpYWwuaApAQCAtMTA0LDYgKzEwNCwxNSBAQAogI2RlZmluZSBVQVJUMDF4X0ZSX0NUUyAJCTB4MDAxCiAjZGVmaW5lIFVBUlQwMXhfRlJfVE1TSwkJKFVBUlQwMXhfRlJfVFhGRiArIFVBUlQwMXhfRlJfQlVTWSkKIAorLyoKKyAqIFNvbWUgYml0cyBvZiBGbGFnIFJlZ2lzdGVyIG9uIFpURSBkZXZpY2UgaGF2ZSBkaWZmZXJlbnQgcG9zaXRpb24gZnJvbQorICogc3RhbmRhcmQgb25lcy4KKyAqLworI2RlZmluZSBaWF9VQVJUMDF4X0ZSX0JVU1kJMHgxMDAKKyNkZWZpbmUgWlhfVUFSVDAxeF9GUl9EU1IJMHgwMDgKKyNkZWZpbmUgWlhfVUFSVDAxeF9GUl9DVFMJMHgwMDIKKyNkZWZpbmUgWlhfVUFSVDAxMV9GUl9SSQkweDAwMQorCiAjZGVmaW5lIFVBUlQwMTFfQ1JfQ1RTRU4JMHg4MDAwCS8qIENUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgKi8KICNkZWZpbmUgVUFSVDAxMV9DUl9SVFNFTgkweDQwMDAJLyogUlRTIGhhcmR3YXJlIGZsb3cgY29udHJvbCAqLwogI2RlZmluZSBVQVJUMDExX0NSX09VVDIJCTB4MjAwMAkvKiBPVVQyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0bWVsX3NlcmlhbC5oIGIvaW5jbHVkZS9saW51eC9hdG1lbF9zZXJpYWwuaAppbmRleCA1YTRkNjY0Li5iZDI1NjA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0bWVsX3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvYXRtZWxfc2VyaWFsLmgKQEAgLTExOCw2ICsxMTgsOCBAQAogCiAjZGVmaW5lIEFUTUVMX1VTX0JSR1IJCTB4MjAJLyogQmF1ZCBSYXRlIEdlbmVyYXRvciBSZWdpc3RlciAqLwogI2RlZmluZQlBVE1FTF9VU19DRAkJR0VOTUFTSygxNSwgMCkJLyogQ2xvY2sgRGl2aWRlciAqLworI2RlZmluZSBBVE1FTF9VU19GUF9PRkZTRVQJMTYJLyogRnJhY3Rpb25hbCBQYXJ0ICovCisjZGVmaW5lIEFUTUVMX1VTX0ZQX01BU0sJMHg3CiAKICNkZWZpbmUgQVRNRUxfVVNfUlRPUgkJMHgyNAkvKiBSZWNlaXZlciBUaW1lLW91dCBSZWdpc3RlciBmb3IgVVNBUlQgKi8KICNkZWZpbmUgQVRNRUxfVUFfUlRPUgkJMHgyOAkvKiBSZWNlaXZlciBUaW1lLW91dCBSZWdpc3RlciBmb3IgVUFSVCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iY21hL2JjbWEuaCBiL2luY2x1ZGUvbGludXgvYmNtYS9iY21hLmgKaW5kZXggM2RiMjVkZi4uOGVlZWRiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iY21hL2JjbWEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYS5oCkBAIC0yMDUsNiArMjA1LDkgQEAKICNkZWZpbmUgIEJDTUFfUEtHX0lEX0JDTTQ3MDkJMAogI2RlZmluZSBCQ01BX0NISVBfSURfQkNNNDcwOTQJNTMwMzAKICNkZWZpbmUgQkNNQV9DSElQX0lEX0JDTTUzMDE4CTUzMDE4CisjZGVmaW5lIEJDTUFfQ0hJUF9JRF9CQ001MzU3Mwk1MzU3MworI2RlZmluZSAgQkNNQV9QS0dfSURfQkNNNTM1NzMJMAorI2RlZmluZSAgQkNNQV9QS0dfSURfQkNNNDcxODkJMQogCiAvKiBCb2FyZCB0eXBlcyAob24gUENJIHVzdWFsbHkgZXF1YWxzIHRvIHRoZSBzdWJzeXN0ZW0gZGV2IGlkKSAqLwogLyogQkNNNDMxMyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfcmVncy5oIGIvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfcmVncy5oCmluZGV4IGViZDVjMWYuLjk5ODZmODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmNtYS9iY21hX3JlZ3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9yZWdzLmgKQEAgLTEwLDYgKzEwLDcgQEAKICNkZWZpbmUgIEJDTUFfQ0xLQ1RMU1RfSEFWRUFMUFJFUQkweDAwMDAwMDA4IC8qIEFMUCBhdmFpbGFibGUgcmVxdWVzdCAqLwogI2RlZmluZSAgQkNNQV9DTEtDVExTVF9IQVZFSFRSRVEJMHgwMDAwMDAxMCAvKiBIVCBhdmFpbGFibGUgcmVxdWVzdCAqLwogI2RlZmluZSAgQkNNQV9DTEtDVExTVF9IV0NST0ZGCQkweDAwMDAwMDIwIC8qIEZvcmNlIEhXIGNsb2NrIHJlcXVlc3Qgb2ZmICovCisjZGVmaW5lICBCQ01BX0NMS0NUTFNUX0hRQ0xLUkVRCQkweDAwMDAwMDQwIC8qIEhRIENsb2NrICovCiAjZGVmaW5lICBCQ01BX0NMS0NUTFNUX0VYVFJFU1JFUQkweDAwMDAwNzAwIC8qIE1hc2sgb2YgZXh0ZXJuYWwgcmVzb3VyY2UgcmVxdWVzdHMgKi8KICNkZWZpbmUgIEJDTUFfQ0xLQ1RMU1RfRVhUUkVTUkVRX1NISUZUCTgKICNkZWZpbmUgIEJDTUFfQ0xLQ1RMU1RfSEFWRUFMUAkJMHgwMDAxMDAwMCAvKiBBTFAgYXZhaWxhYmxlICovCkBAIC0yMyw2ICsyNCw3IEBACiAjZGVmaW5lICBCQ01BX0NMS0NUTFNUXzQzMjhBMF9IQVZFQUxQCTB4MDAwMjAwMDAgLyogNDMyOGEwIGhhcyByZXZlcnNlZCBiaXRzICovCiAKIC8qIEFnZW50IHJlZ2lzdGVycyAoY29tbW9uIGZvciBldmVyeSBjb3JlKSAqLworI2RlZmluZSBCQ01BX09PQl9TRUxfT1VUX0EzMAkJMHgwMTAwCiAjZGVmaW5lIEJDTUFfSU9DVEwJCQkweDA0MDggLyogSU8gY29udHJvbCAqLwogI2RlZmluZSAgQkNNQV9JT0NUTF9DTEsJCQkweDAwMDEKICNkZWZpbmUgIEJDTUFfSU9DVExfRkdDCQkJMHgwMDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jpby5oIGIvaW5jbHVkZS9saW51eC9iaW8uaAppbmRleCA1OWZmYWE2Li4yM2RkZjRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jpby5oCisrKyBiL2luY2x1ZGUvbGludXgvYmlvLmgKQEAgLTcxLDcgKzcxLDggQEAKIHsKIAlpZiAoYmlvICYmCiAJICAgIGJpby0+YmlfaXRlci5iaV9zaXplICYmCi0JICAgIGJpb19vcChiaW8pICE9IFJFUV9PUF9ESVNDQVJEKQorCSAgICBiaW9fb3AoYmlvKSAhPSBSRVFfT1BfRElTQ0FSRCAmJgorCSAgICBiaW9fb3AoYmlvKSAhPSBSRVFfT1BfU0VDVVJFX0VSQVNFKQogCQlyZXR1cm4gdHJ1ZTsKIAogCXJldHVybiBmYWxzZTsKQEAgLTc5LDcgKzgwLDkgQEAKIAogc3RhdGljIGlubGluZSBib29sIGJpb19ub19hZHZhbmNlX2l0ZXIoc3RydWN0IGJpbyAqYmlvKQogewotCXJldHVybiBiaW9fb3AoYmlvKSA9PSBSRVFfT1BfRElTQ0FSRCB8fCBiaW9fb3AoYmlvKSA9PSBSRVFfT1BfV1JJVEVfU0FNRTsKKwlyZXR1cm4gYmlvX29wKGJpbykgPT0gUkVRX09QX0RJU0NBUkQgfHwKKwkgICAgICAgYmlvX29wKGJpbykgPT0gUkVRX09QX1NFQ1VSRV9FUkFTRSB8fAorCSAgICAgICBiaW9fb3AoYmlvKSA9PSBSRVFfT1BfV1JJVEVfU0FNRTsKIH0KIAogc3RhdGljIGlubGluZSBib29sIGJpb19pc19ydyhzdHJ1Y3QgYmlvICpiaW8pCkBAIC0xOTksNiArMjAyLDkgQEAKIAlpZiAoYmlvX29wKGJpbykgPT0gUkVRX09QX0RJU0NBUkQpCiAJCXJldHVybiAxOwogCisJaWYgKGJpb19vcChiaW8pID09IFJFUV9PUF9TRUNVUkVfRVJBU0UpCisJCXJldHVybiAxOworCiAJaWYgKGJpb19vcChiaW8pID09IFJFUV9PUF9XUklURV9TQU1FKQogCQlyZXR1cm4gMTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaXRmaWVsZC5oIGIvaW5jbHVkZS9saW51eC9iaXRmaWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NTA1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2JpdGZpZWxkLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBGZWxpeCBGaWV0a2F1IDxuYmRAbmJkLm5hbWU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA5IEl2byB2YW4gRG9vcm4gPEl2RG9vcm5AZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0JJVEZJRUxEX0gKKyNkZWZpbmUgX0xJTlVYX0JJVEZJRUxEX0gKKworI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorCisvKgorICogQml0ZmllbGQgYWNjZXNzIG1hY3JvcworICoKKyAqIEZJRUxEX3tHRVQsUFJFUH0gbWFjcm9zIHRha2UgYXMgZmlyc3QgcGFyYW1ldGVyIHNoaWZ0ZWQgbWFzaworICogZnJvbSB3aGljaCB0aGV5IGV4dHJhY3QgdGhlIGJhc2UgbWFzayBhbmQgc2hpZnQgYW1vdW50LgorICogTWFzayBtdXN0IGJlIGEgY29tcGlsYXRpb24gdGltZSBjb25zdGFudC4KKyAqCisgKiBFeGFtcGxlOgorICoKKyAqICAjZGVmaW5lIFJFR19GSUVMRF9BICBHRU5NQVNLKDYsIDApCisgKiAgI2RlZmluZSBSRUdfRklFTERfQiAgQklUKDcpCisgKiAgI2RlZmluZSBSRUdfRklFTERfQyAgR0VOTUFTSygxNSwgOCkKKyAqICAjZGVmaW5lIFJFR19GSUVMRF9EICBHRU5NQVNLKDMxLCAxNikKKyAqCisgKiBHZXQ6CisgKiAgYSA9IEZJRUxEX0dFVChSRUdfRklFTERfQSwgcmVnKTsKKyAqICBiID0gRklFTERfR0VUKFJFR19GSUVMRF9CLCByZWcpOworICoKKyAqIFNldDoKKyAqICByZWcgPSBGSUVMRF9QUkVQKFJFR19GSUVMRF9BLCAxKSB8CisgKgkgIEZJRUxEX1BSRVAoUkVHX0ZJRUxEX0IsIDApIHwKKyAqCSAgRklFTERfUFJFUChSRUdfRklFTERfQywgYykgfAorICoJICBGSUVMRF9QUkVQKFJFR19GSUVMRF9ELCAweDQwKTsKKyAqCisgKiBNb2RpZnk6CisgKiAgcmVnICY9IH5SRUdfRklFTERfQzsKKyAqICByZWcgfD0gRklFTERfUFJFUChSRUdfRklFTERfQywgYyk7CisgKi8KKworI2RlZmluZSBfX2JmX3NoZih4KSAoX19idWlsdGluX2Zmc2xsKHgpIC0gMSkKKworI2RlZmluZSBfX0JGX0ZJRUxEX0NIRUNLKF9tYXNrLCBfcmVnLCBfdmFsLCBfcGZ4KQkJCVwKKwkoewkJCQkJCQkJXAorCQlCVUlMRF9CVUdfT05fTVNHKCFfX2J1aWx0aW5fY29uc3RhbnRfcChfbWFzayksCQlcCisJCQkJIF9wZnggIm1hc2sgaXMgbm90IGNvbnN0YW50Iik7CQlcCisJCUJVSUxEX0JVR19PTl9NU0coIShfbWFzayksIF9wZnggIm1hc2sgaXMgemVybyIpOwlcCisJCUJVSUxEX0JVR19PTl9NU0coX19idWlsdGluX2NvbnN0YW50X3AoX3ZhbCkgPwkJXAorCQkJCSB+KChfbWFzaykgPj4gX19iZl9zaGYoX21hc2spKSAmIChfdmFsKSA6IDAsIFwKKwkJCQkgX3BmeCAidmFsdWUgdG9vIGxhcmdlIGZvciB0aGUgZmllbGQiKTsgXAorCQlCVUlMRF9CVUdfT05fTVNHKChfbWFzaykgPiAodHlwZW9mKF9yZWcpKX4wdWxsLAkJXAorCQkJCSBfcGZ4ICJ0eXBlIG9mIHJlZyB0b28gc21hbGwgZm9yIG1hc2siKTsgXAorCQlfX0JVSUxEX0JVR19PTl9OT1RfUE9XRVJfT0ZfMigoX21hc2spICsJCQlcCisJCQkJCSAgICAgICgxVUxMIDw8IF9fYmZfc2hmKF9tYXNrKSkpOyBcCisJfSkKKworLyoqCisgKiBGSUVMRF9QUkVQKCkgLSBwcmVwYXJlIGEgYml0ZmllbGQgZWxlbWVudAorICogQF9tYXNrOiBzaGlmdGVkIG1hc2sgZGVmaW5pbmcgdGhlIGZpZWxkJ3MgbGVuZ3RoIGFuZCBwb3NpdGlvbgorICogQF92YWw6ICB2YWx1ZSB0byBwdXQgaW4gdGhlIGZpZWxkCisgKgorICogRklFTERfUFJFUCgpIG1hc2tzIGFuZCBzaGlmdHMgdXAgdGhlIHZhbHVlLiAgVGhlIHJlc3VsdCBzaG91bGQKKyAqIGJlIGNvbWJpbmVkIHdpdGggb3RoZXIgZmllbGRzIG9mIHRoZSBiaXRmaWVsZCB1c2luZyBsb2dpY2FsIE9SLgorICovCisjZGVmaW5lIEZJRUxEX1BSRVAoX21hc2ssIF92YWwpCQkJCQkJXAorCSh7CQkJCQkJCQlcCisJCV9fQkZfRklFTERfQ0hFQ0soX21hc2ssIDBVTEwsIF92YWwsICJGSUVMRF9QUkVQOiAiKTsJXAorCQkoKHR5cGVvZihfbWFzaykpKF92YWwpIDw8IF9fYmZfc2hmKF9tYXNrKSkgJiAoX21hc2spOwlcCisJfSkKKworLyoqCisgKiBGSUVMRF9HRVQoKSAtIGV4dHJhY3QgYSBiaXRmaWVsZCBlbGVtZW50CisgKiBAX21hc2s6IHNoaWZ0ZWQgbWFzayBkZWZpbmluZyB0aGUgZmllbGQncyBsZW5ndGggYW5kIHBvc2l0aW9uCisgKiBAX3JlZzogIDMyYml0IHZhbHVlIG9mIGVudGlyZSBiaXRmaWVsZAorICoKKyAqIEZJRUxEX0dFVCgpIGV4dHJhY3RzIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkgQF9tYXNrIGZyb20gdGhlCisgKiBiaXRmaWVsZCBwYXNzZWQgaW4gYXMgQF9yZWcgYnkgbWFza2luZyBhbmQgc2hpZnRpbmcgaXQgZG93bi4KKyAqLworI2RlZmluZSBGSUVMRF9HRVQoX21hc2ssIF9yZWcpCQkJCQkJXAorCSh7CQkJCQkJCQlcCisJCV9fQkZfRklFTERfQ0hFQ0soX21hc2ssIF9yZWcsIDBVLCAiRklFTERfR0VUOiAiKTsJXAorCQkodHlwZW9mKF9tYXNrKSkoKChfcmVnKSAmIChfbWFzaykpID4+IF9fYmZfc2hmKF9tYXNrKSk7CVwKKwl9KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYml0bWFwLmggYi9pbmNsdWRlL2xpbnV4L2JpdG1hcC5oCmluZGV4IDU5OGJjOTkuLjNiNzc1ODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYml0bWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9iaXRtYXAuaApAQCAtMzM5LDYgKzMzOSwyNCBAQAogCXJldHVybiBfX2JpdG1hcF9wYXJzZShidWYsIGJ1ZmxlbiwgMCwgbWFza3AsIG5tYXNrYml0cyk7CiB9CiAKKy8qCisgKiBiaXRtYXBfZnJvbV91NjQgLSBDaGVjayBhbmQgc3dhcCB3b3JkcyB3aXRoaW4gdTY0LgorICogIEBtYXNrOiBzb3VyY2UgYml0bWFwCisgKiAgQGRzdDogIGRlc3RpbmF0aW9uIGJpdG1hcAorICoKKyAqIEluIDMyLWJpdCBCaWcgRW5kaWFuIGtlcm5lbCwgd2hlbiB1c2luZyAodTMyICopKCZ2YWwpWypdCisgKiB0byByZWFkIHU2NCBtYXNrLCB3ZSB3aWxsIGdldCB0aGUgd3Jvbmcgd29yZC4KKyAqIFRoYXQgaXMgIih1MzIgKikoJnZhbClbMF0iIGdldHMgdGhlIHVwcGVyIDMyIGJpdHMsCisgKiBidXQgd2UgZXhwZWN0IHRoZSBsb3dlciAzMi1iaXRzIG9mIHU2NC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJpdG1hcF9mcm9tX3U2NCh1bnNpZ25lZCBsb25nICpkc3QsIHU2NCBtYXNrKQoreworCWRzdFswXSA9IG1hc2sgJiBVTE9OR19NQVg7CisKKwlpZiAoc2l6ZW9mKG1hc2spID4gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCQlkc3RbMV0gPSBtYXNrID4+IDMyOworfQorCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX0xJTlVYX0JJVE1BUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAppbmRleCAyYzIxMGI2Li5lNzkwNTVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTg4Miw3ICs4ODIsNyBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYmxrX3F1ZXVlX2dldF9tYXhfc2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKIAkJCQkJCSAgICAgaW50IG9wKQogewotCWlmICh1bmxpa2VseShvcCA9PSBSRVFfT1BfRElTQ0FSRCkpCisJaWYgKHVubGlrZWx5KG9wID09IFJFUV9PUF9ESVNDQVJEIHx8IG9wID09IFJFUV9PUF9TRUNVUkVfRVJBU0UpKQogCQlyZXR1cm4gbWluKHEtPmxpbWl0cy5tYXhfZGlzY2FyZF9zZWN0b3JzLCBVSU5UX01BWCA+PiA5KTsKIAogCWlmICh1bmxpa2VseShvcCA9PSBSRVFfT1BfV1JJVEVfU0FNRSkpCkBAIC05MTMsNyArOTEzLDkgQEAKIAlpZiAodW5saWtlbHkocnEtPmNtZF90eXBlICE9IFJFUV9UWVBFX0ZTKSkKIAkJcmV0dXJuIHEtPmxpbWl0cy5tYXhfaHdfc2VjdG9yczsKIAotCWlmICghcS0+bGltaXRzLmNodW5rX3NlY3RvcnMgfHwgKHJlcV9vcChycSkgPT0gUkVRX09QX0RJU0NBUkQpKQorCWlmICghcS0+bGltaXRzLmNodW5rX3NlY3RvcnMgfHwKKwkgICAgcmVxX29wKHJxKSA9PSBSRVFfT1BfRElTQ0FSRCB8fAorCSAgICByZXFfb3AocnEpID09IFJFUV9PUF9TRUNVUkVfRVJBU0UpCiAJCXJldHVybiBibGtfcXVldWVfZ2V0X21heF9zZWN0b3JzKHEsIHJlcV9vcChycSkpOwogCiAJcmV0dXJuIG1pbihibGtfbWF4X3NpemVfb2Zmc2V0KHEsIG9mZnNldCksCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JwZi5oIGIvaW5jbHVkZS9saW51eC9icGYuaAppbmRleCAxMTEzNDIzLi5jMjAxMDE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JwZi5oCisrKyBiL2luY2x1ZGUvbGludXgvYnBmLmgKQEAgLTk2LDYgKzk2LDcgQEAKIHN0cnVjdCBicGZfZnVuY19wcm90byB7CiAJdTY0ICgqZnVuYykodTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpOwogCWJvb2wgZ3BsX29ubHk7CisJYm9vbCBwa3RfYWNjZXNzOwogCWVudW0gYnBmX3JldHVybl90eXBlIHJldF90eXBlOwogCWVudW0gYnBmX2FyZ190eXBlIGFyZzFfdHlwZTsKIAllbnVtIGJwZl9hcmdfdHlwZSBhcmcyX3R5cGU7CkBAIC0xMzgsNiArMTM5LDEzIEBACiAJICovCiAJUFRSX1RPX1BBQ0tFVCwKIAlQVFJfVE9fUEFDS0VUX0VORCwJIC8qIHNrYi0+ZGF0YSArIGhlYWRsZW4gKi8KKworCS8qIFBUUl9UT19NQVBfVkFMVUVfQURKIGlzIHVzZWQgZm9yIGRvaW5nIHBvaW50ZXIgbWF0aCBpbnNpZGUgb2YgYSBtYXAKKwkgKiBlbGVtIHZhbHVlLiAgV2Ugb25seSBhbGxvdyB0aGlzIGlmIHdlIGNhbiBzdGF0aWNhbGx5IHZlcmlmeSB0aGF0CisJICogYWNjZXNzIGZyb20gdGhpcyByZWdpc3RlciBhcmUgZ29pbmcgdG8gZmFsbCB3aXRoaW4gdGhlIHNpemUgb2YgdGhlCisJICogbWFwIGVsZW1lbnQuCisJICovCisJUFRSX1RPX01BUF9WQUxVRV9BREosCiB9OwogCiBzdHJ1Y3QgYnBmX3Byb2c7CkBAIC0xNTEsNyArMTU5LDggQEAKIAkgKi8KIAlib29sICgqaXNfdmFsaWRfYWNjZXNzKShpbnQgb2ZmLCBpbnQgc2l6ZSwgZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSwKIAkJCQllbnVtIGJwZl9yZWdfdHlwZSAqcmVnX3R5cGUpOwotCisJaW50ICgqZ2VuX3Byb2xvZ3VlKShzdHJ1Y3QgYnBmX2luc24gKmluc24sIGJvb2wgZGlyZWN0X3dyaXRlLAorCQkJICAgIGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZyk7CiAJdTMyICgqY29udmVydF9jdHhfYWNjZXNzKShlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlLCBpbnQgZHN0X3JlZywKIAkJCQkgIGludCBzcmNfcmVnLCBpbnQgY3R4X29mZiwKIAkJCQkgIHN0cnVjdCBicGZfaW5zbiAqaW5zbiwgc3RydWN0IGJwZl9wcm9nICpwcm9nKTsKQEAgLTI5Nyw2ICszMDYsMTAgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBicGZfcHJvZ19wdXQoc3RydWN0IGJwZl9wcm9nICpwcm9nKQogewogfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgYnBmX3Byb2cgKmJwZl9wcm9nX2luYyhzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCit7CisJcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOworfQogI2VuZGlmIC8qIENPTkZJR19CUEZfU1lTQ0FMTCAqLwogCiAvKiB2ZXJpZmllciBwcm90b3R5cGVzIGZvciBoZWxwZXIgZnVuY3Rpb25zIGNhbGxlZCBmcm9tIGVCUEYgcHJvZ3JhbXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmggYi9pbmNsdWRlL2xpbnV4L2JwZl92ZXJpZmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMzViOTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2JwZl92ZXJpZmllci5oCkBAIC0wLDAgKzEsMTAyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBQTFVNZ3JpZCwgaHR0cDovL3BsdW1ncmlkLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpZm5kZWYgX0xJTlVYX0JQRl9WRVJJRklFUl9ICisjZGVmaW5lIF9MSU5VWF9CUEZfVkVSSUZJRVJfSCAxCisKKyNpbmNsdWRlIDxsaW51eC9icGYuaD4gLyogZm9yIGVudW0gYnBmX3JlZ190eXBlICovCisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+IC8qIGZvciBNQVhfQlBGX1NUQUNLICovCisKKyAvKiBKdXN0IHNvbWUgYXJiaXRyYXJ5IHZhbHVlcyBzbyB3ZSBjYW4gc2FmZWx5IGRvIG1hdGggd2l0aG91dCBvdmVyZmxvd2luZyBhbmQKKyAgKiBhcmUgb2J2aW91c2x5IHdyb25nIGZvciBhbnkgc29ydCBvZiBtZW1vcnkgYWNjZXNzLgorICAqLworI2RlZmluZSBCUEZfUkVHSVNURVJfTUFYX1JBTkdFICgxMDI0ICogMTAyNCAqIDEwMjQpCisjZGVmaW5lIEJQRl9SRUdJU1RFUl9NSU5fUkFOR0UgLSgxMDI0ICogMTAyNCAqIDEwMjQpCisKK3N0cnVjdCBicGZfcmVnX3N0YXRlIHsKKwllbnVtIGJwZl9yZWdfdHlwZSB0eXBlOworCS8qCisJICogVXNlZCB0byBkZXRlcm1pbmUgaWYgYW55IG1lbW9yeSBhY2Nlc3MgdXNpbmcgdGhpcyByZWdpc3RlciB3aWxsCisJICogcmVzdWx0IGluIGEgYmFkIGFjY2Vzcy4KKwkgKi8KKwl1NjQgbWluX3ZhbHVlLCBtYXhfdmFsdWU7CisJdW5pb24geworCQkvKiB2YWxpZCB3aGVuIHR5cGUgPT0gQ09OU1RfSU1NIHwgUFRSX1RPX1NUQUNLIHwgVU5LTk9XTl9WQUxVRSAqLworCQlzNjQgaW1tOworCisJCS8qIHZhbGlkIHdoZW4gdHlwZSA9PSBQVFJfVE9fUEFDS0VUKiAqLworCQlzdHJ1Y3QgeworCQkJdTMyIGlkOworCQkJdTE2IG9mZjsKKwkJCXUxNiByYW5nZTsKKwkJfTsKKworCQkvKiB2YWxpZCB3aGVuIHR5cGUgPT0gQ09OU1RfUFRSX1RPX01BUCB8IFBUUl9UT19NQVBfVkFMVUUgfAorCQkgKiAgIFBUUl9UT19NQVBfVkFMVUVfT1JfTlVMTAorCQkgKi8KKwkJc3RydWN0IGJwZl9tYXAgKm1hcF9wdHI7CisJfTsKK307CisKK2VudW0gYnBmX3N0YWNrX3Nsb3RfdHlwZSB7CisJU1RBQ0tfSU5WQUxJRCwgICAgLyogbm90aGluZyB3YXMgc3RvcmVkIGluIHRoaXMgc3RhY2sgc2xvdCAqLworCVNUQUNLX1NQSUxMLCAgICAgIC8qIHJlZ2lzdGVyIHNwaWxsZWQgaW50byBzdGFjayAqLworCVNUQUNLX01JU0MJICAvKiBCUEYgcHJvZ3JhbSB3cm90ZSBzb21lIGRhdGEgaW50byB0aGlzIHNsb3QgKi8KK307CisKKyNkZWZpbmUgQlBGX1JFR19TSVpFIDgJLyogc2l6ZSBvZiBlQlBGIHJlZ2lzdGVyIGluIGJ5dGVzICovCisKKy8qIHN0YXRlIG9mIHRoZSBwcm9ncmFtOgorICogdHlwZSBvZiBhbGwgcmVnaXN0ZXJzIGFuZCBzdGFjayBpbmZvCisgKi8KK3N0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgeworCXN0cnVjdCBicGZfcmVnX3N0YXRlIHJlZ3NbTUFYX0JQRl9SRUddOworCXU4IHN0YWNrX3Nsb3RfdHlwZVtNQVhfQlBGX1NUQUNLXTsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSBzcGlsbGVkX3JlZ3NbTUFYX0JQRl9TVEFDSyAvIEJQRl9SRUdfU0laRV07Cit9OworCisvKiBsaW5rZWQgbGlzdCBvZiB2ZXJpZmllciBzdGF0ZXMgdXNlZCB0byBwcnVuZSBzZWFyY2ggKi8KK3N0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGVfbGlzdCB7CisJc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSBzdGF0ZTsKKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlX2xpc3QgKm5leHQ7Cit9OworCitzdHJ1Y3QgYnBmX2luc25fYXV4X2RhdGEgeworCWVudW0gYnBmX3JlZ190eXBlIHB0cl90eXBlOwkvKiBwb2ludGVyIHR5cGUgZm9yIGxvYWQvc3RvcmUgaW5zbnMgKi8KK307CisKKyNkZWZpbmUgTUFYX1VTRURfTUFQUyA2NCAvKiBtYXggbnVtYmVyIG9mIG1hcHMgYWNjZXNzZWQgYnkgb25lIGVCUEYgcHJvZ3JhbSAqLworCitzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudjsKK3N0cnVjdCBicGZfZXh0X2FuYWx5emVyX29wcyB7CisJaW50ICgqaW5zbl9ob29rKShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAorCQkJIGludCBpbnNuX2lkeCwgaW50IHByZXZfaW5zbl9pZHgpOworfTsKKworLyogc2luZ2xlIGNvbnRhaW5lciBmb3IgYWxsIHN0cnVjdHMKKyAqIG9uZSB2ZXJpZmllcl9lbnYgcGVyIGJwZl9jaGVjaygpIGNhbGwKKyAqLworc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgeworCXN0cnVjdCBicGZfcHJvZyAqcHJvZzsJCS8qIGVCUEYgcHJvZ3JhbSBiZWluZyB2ZXJpZmllZCAqLworCXN0cnVjdCBicGZfdmVyaWZpZXJfc3RhY2tfZWxlbSAqaGVhZDsgLyogc3RhY2sgb2YgdmVyaWZpZXIgc3RhdGVzIHRvIGJlIHByb2Nlc3NlZCAqLworCWludCBzdGFja19zaXplOwkJCS8qIG51bWJlciBvZiBzdGF0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisJc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSBjdXJfc3RhdGU7IC8qIGN1cnJlbnQgdmVyaWZpZXIgc3RhdGUgKi8KKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlX2xpc3QgKipleHBsb3JlZF9zdGF0ZXM7IC8qIHNlYXJjaCBwcnVuaW5nIG9wdGltaXphdGlvbiAqLworCWNvbnN0IHN0cnVjdCBicGZfZXh0X2FuYWx5emVyX29wcyAqYW5hbHl6ZXJfb3BzOyAvKiBleHRlcm5hbCBhbmFseXplciBvcHMgKi8KKwl2b2lkICphbmFseXplcl9wcml2OyAvKiBwb2ludGVyIHRvIGV4dGVybmFsIGFuYWx5emVyJ3MgcHJpdmF0ZSBkYXRhICovCisJc3RydWN0IGJwZl9tYXAgKnVzZWRfbWFwc1tNQVhfVVNFRF9NQVBTXTsgLyogYXJyYXkgb2YgbWFwJ3MgdXNlZCBieSBlQlBGIHByb2dyYW0gKi8KKwl1MzIgdXNlZF9tYXBfY250OwkJLyogbnVtYmVyIG9mIHVzZWQgbWFwcyAqLworCXUzMiBpZF9nZW47CQkJLyogdXNlZCB0byBnZW5lcmF0ZSB1bmlxdWUgcmVnIElEcyAqLworCWJvb2wgYWxsb3dfcHRyX2xlYWtzOworCWJvb2wgc2Vlbl9kaXJlY3Rfd3JpdGU7CisJYm9vbCB2YXJsZW5fbWFwX3ZhbHVlX2FjY2VzczsKKwlzdHJ1Y3QgYnBmX2luc25fYXV4X2RhdGEgKmluc25fYXV4X2RhdGE7IC8qIGFycmF5IG9mIHBlci1pbnNuIHN0YXRlICovCit9OworCitpbnQgYnBmX2FuYWx5emVyKHN0cnVjdCBicGZfcHJvZyAqcHJvZywgY29uc3Qgc3RydWN0IGJwZl9leHRfYW5hbHl6ZXJfb3BzICpvcHMsCisJCSB2b2lkICpwcml2KTsKKworI2VuZGlmIC8qIF9MSU5VWF9CUEZfVkVSSUZJRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9idWcuaCBiL2luY2x1ZGUvbGludXgvYnVnLmgKaW5kZXggZTUxYjA3MC4uMjkyZDZhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9idWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2J1Zy5oCkBAIC0xMyw2ICsxMyw3IEBACiBzdHJ1Y3QgcHRfcmVnczsKIAogI2lmZGVmIF9fQ0hFQ0tFUl9fCisjZGVmaW5lIF9fQlVJTERfQlVHX09OX05PVF9QT1dFUl9PRl8yKG4pICgwKQogI2RlZmluZSBCVUlMRF9CVUdfT05fTk9UX1BPV0VSX09GXzIobikgKDApCiAjZGVmaW5lIEJVSUxEX0JVR19PTl9aRVJPKGUpICgwKQogI2RlZmluZSBCVUlMRF9CVUdfT05fTlVMTChlKSAoKHZvaWQqKTApCkBAIC0yNCw2ICsyNSw4IEBACiAjZWxzZSAvKiBfX0NIRUNLRVJfXyAqLwogCiAvKiBGb3JjZSBhIGNvbXBpbGF0aW9uIGVycm9yIGlmIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBpcyBub3QgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIF9fQlVJTERfQlVHX09OX05PVF9QT1dFUl9PRl8yKG4pCVwKKwlCVUlMRF9CVUdfT04oKChuKSAmICgobikgLSAxKSkgIT0gMCkKICNkZWZpbmUgQlVJTERfQlVHX09OX05PVF9QT1dFUl9PRl8yKG4pCQkJXAogCUJVSUxEX0JVR19PTigobikgPT0gMCB8fCAoKChuKSAmICgobikgLSAxKSkgIT0gMCkpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2FuL2Rldi5oIGIvaW5jbHVkZS9saW51eC9jYW4vZGV2LmgKaW5kZXggNTI2MTc1MS4uNWY1MjcwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jYW4vZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9jYW4vZGV2LmgKQEAgLTMyLDYgKzMyLDcgQEAKICAqIENBTiBjb21tb24gcHJpdmF0ZSBkYXRhCiAgKi8KIHN0cnVjdCBjYW5fcHJpdiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgY2FuX2RldmljZV9zdGF0cyBjYW5fc3RhdHM7CiAKIAlzdHJ1Y3QgY2FuX2JpdHRpbWluZyBiaXR0aW1pbmcsIGRhdGFfYml0dGltaW5nOwpAQCAtNDcsNyArNDgsNyBAQAogCXUzMiBjdHJsbW9kZV9zdGF0aWM7CS8qIHN0YXRpYyBlbmFibGVkIG9wdGlvbnMgZm9yIGRyaXZlci9oYXJkd2FyZSAqLwogCiAJaW50IHJlc3RhcnRfbXM7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgcmVzdGFydF90aW1lcjsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHJlc3RhcnRfd29yazsKIAogCWludCAoKmRvX3NldF9iaXR0aW1pbmcpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCWludCAoKmRvX3NldF9kYXRhX2JpdHRpbWluZykoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NlYy1mdW5jcy5oIGIvaW5jbHVkZS9saW51eC9jZWMtZnVuY3MuaAppbmRleCA4MmMzZDNiLi4xMzhiYmY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NlYy1mdW5jcy5oCisrKyBiL2luY2x1ZGUvbGludXgvY2VjLWZ1bmNzLmgKQEAgLTE2MiwxMCArMTYyLDExIEBACiAKIAogLyogT25lIFRvdWNoIFJlY29yZCBGZWF0dXJlICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY2VjX21zZ19yZWNvcmRfb2ZmKHN0cnVjdCBjZWNfbXNnICptc2cpCitzdGF0aWMgaW5saW5lIHZvaWQgY2VjX21zZ19yZWNvcmRfb2ZmKHN0cnVjdCBjZWNfbXNnICptc2csIGJvb2wgcmVwbHkpCiB7CiAJbXNnLT5sZW4gPSAyOwogCW1zZy0+bXNnWzFdID0gQ0VDX01TR19SRUNPUkRfT0ZGOworCW1zZy0+cmVwbHkgPSByZXBseSA/IENFQ19NU0dfUkVDT1JEX1NUQVRVUyA6IDA7CiB9CiAKIHN0cnVjdCBjZWNfb3BfYXJpYl9kYXRhIHsKQEAgLTIyNyw3ICsyMjgsNyBAQAogCWlmIChkaWdpdGFsLT5zZXJ2aWNlX2lkX21ldGhvZCA9PSBDRUNfT1BfU0VSVklDRV9JRF9NRVRIT0RfQllfQ0hBTk5FTCkgewogCQkqbXNnKysgPSAoZGlnaXRhbC0+Y2hhbm5lbC5jaGFubmVsX251bWJlcl9mbXQgPDwgMikgfAogCQkJIChkaWdpdGFsLT5jaGFubmVsLm1ham9yID4+IDgpOwotCQkqbXNnKysgPSBkaWdpdGFsLT5jaGFubmVsLm1ham9yICYmIDB4ZmY7CisJCSptc2crKyA9IGRpZ2l0YWwtPmNoYW5uZWwubWFqb3IgJiAweGZmOwogCQkqbXNnKysgPSBkaWdpdGFsLT5jaGFubmVsLm1pbm9yID4+IDg7CiAJCSptc2crKyA9IGRpZ2l0YWwtPmNoYW5uZWwubWlub3IgJiAweGZmOwogCQkqbXNnKysgPSAwOwpAQCAtMzIzLDYgKzMyNCw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjZWNfbXNnX3JlY29yZF9vbihzdHJ1Y3QgY2VjX21zZyAqbXNnLAorCQkJCSAgICAgYm9vbCByZXBseSwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBjZWNfb3BfcmVjb3JkX3NyYyAqcmVjX3NyYykKIHsKIAlzd2l0Y2ggKHJlY19zcmMtPnR5cGUpIHsKQEAgLTM0Niw2ICszNDgsNyBAQAogCQkJCQkgICAgcmVjX3NyYy0+ZXh0X3BoeXNfYWRkci5waHlzX2FkZHIpOwogCQlicmVhazsKIAl9CisJbXNnLT5yZXBseSA9IHJlcGx5ID8gQ0VDX01TR19SRUNPUkRfU1RBVFVTIDogMDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNlY19vcHNfcmVjb3JkX29uKGNvbnN0IHN0cnVjdCBjZWNfbXNnICptc2csCkBAIC0xMTQxLDYgKzExNDQsNzUgQEAKIAltc2ctPnJlcGx5ID0gcmVwbHkgPyBDRUNfTVNHX0RFVklDRV9WRU5ET1JfSUQgOiAwOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgY2VjX21zZ192ZW5kb3JfY29tbWFuZChzdHJ1Y3QgY2VjX21zZyAqbXNnLAorCQkJCQkgIF9fdTggc2l6ZSwgY29uc3QgX191OCAqdmVuZG9yX2NtZCkKK3sKKwlpZiAoc2l6ZSA+IDE0KQorCQlzaXplID0gMTQ7CisJbXNnLT5sZW4gPSAyICsgc2l6ZTsKKwltc2ctPm1zZ1sxXSA9IENFQ19NU0dfVkVORE9SX0NPTU1BTkQ7CisJbWVtY3B5KG1zZy0+bXNnICsgMiwgdmVuZG9yX2NtZCwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjZWNfb3BzX3ZlbmRvcl9jb21tYW5kKGNvbnN0IHN0cnVjdCBjZWNfbXNnICptc2csCisJCQkJCSAgX191OCAqc2l6ZSwKKwkJCQkJICBjb25zdCBfX3U4ICoqdmVuZG9yX2NtZCkKK3sKKwkqc2l6ZSA9IG1zZy0+bGVuIC0gMjsKKworCWlmICgqc2l6ZSA+IDE0KQorCQkqc2l6ZSA9IDE0OworCSp2ZW5kb3JfY21kID0gbXNnLT5tc2cgKyAyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2VjX21zZ192ZW5kb3JfY29tbWFuZF93aXRoX2lkKHN0cnVjdCBjZWNfbXNnICptc2csCisJCQkJCQkgIF9fdTMyIHZlbmRvcl9pZCwgX191OCBzaXplLAorCQkJCQkJICBjb25zdCBfX3U4ICp2ZW5kb3JfY21kKQoreworCWlmIChzaXplID4gMTEpCisJCXNpemUgPSAxMTsKKwltc2ctPmxlbiA9IDUgKyBzaXplOworCW1zZy0+bXNnWzFdID0gQ0VDX01TR19WRU5ET1JfQ09NTUFORF9XSVRIX0lEOworCW1zZy0+bXNnWzJdID0gdmVuZG9yX2lkID4+IDE2OworCW1zZy0+bXNnWzNdID0gKHZlbmRvcl9pZCA+PiA4KSAmIDB4ZmY7CisJbXNnLT5tc2dbNF0gPSB2ZW5kb3JfaWQgJiAweGZmOworCW1lbWNweShtc2ctPm1zZyArIDUsIHZlbmRvcl9jbWQsIHNpemUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2VjX29wc192ZW5kb3JfY29tbWFuZF93aXRoX2lkKGNvbnN0IHN0cnVjdCBjZWNfbXNnICptc2csCisJCQkJCQkgIF9fdTMyICp2ZW5kb3JfaWQsICBfX3U4ICpzaXplLAorCQkJCQkJICBjb25zdCBfX3U4ICoqdmVuZG9yX2NtZCkKK3sKKwkqc2l6ZSA9IG1zZy0+bGVuIC0gNTsKKworCWlmICgqc2l6ZSA+IDExKQorCQkqc2l6ZSA9IDExOworCSp2ZW5kb3JfaWQgPSAobXNnLT5tc2dbMl0gPDwgMTYpIHwgKG1zZy0+bXNnWzNdIDw8IDgpIHwgbXNnLT5tc2dbNF07CisJKnZlbmRvcl9jbWQgPSBtc2ctPm1zZyArIDU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjZWNfbXNnX3ZlbmRvcl9yZW1vdGVfYnV0dG9uX2Rvd24oc3RydWN0IGNlY19tc2cgKm1zZywKKwkJCQkJCSAgICAgX191OCBzaXplLAorCQkJCQkJICAgICBjb25zdCBfX3U4ICpyY19jb2RlKQoreworCWlmIChzaXplID4gMTQpCisJCXNpemUgPSAxNDsKKwltc2ctPmxlbiA9IDIgKyBzaXplOworCW1zZy0+bXNnWzFdID0gQ0VDX01TR19WRU5ET1JfUkVNT1RFX0JVVFRPTl9ET1dOOworCW1lbWNweShtc2ctPm1zZyArIDIsIHJjX2NvZGUsIHNpemUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2VjX29wc192ZW5kb3JfcmVtb3RlX2J1dHRvbl9kb3duKGNvbnN0IHN0cnVjdCBjZWNfbXNnICptc2csCisJCQkJCQkgICAgIF9fdTggKnNpemUsCisJCQkJCQkgICAgIGNvbnN0IF9fdTggKipyY19jb2RlKQoreworCSpzaXplID0gbXNnLT5sZW4gLSAyOworCisJaWYgKCpzaXplID4gMTQpCisJCSpzaXplID0gMTQ7CisJKnJjX2NvZGUgPSBtc2ctPm1zZyArIDI7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBjZWNfbXNnX3ZlbmRvcl9yZW1vdGVfYnV0dG9uX3VwKHN0cnVjdCBjZWNfbXNnICptc2cpCiB7CiAJbXNnLT5sZW4gPSAyOwpAQCAtMTI3Nyw3ICsxMzQ5LDcgQEAKIAkJbXNnLT5sZW4gKz0gNDsKIAkJbXNnLT5tc2dbM10gPSAodWlfY21kLT5jaGFubmVsX2lkZW50aWZpZXIuY2hhbm5lbF9udW1iZXJfZm10IDw8IDIpIHwKIAkJCSAgICAgICh1aV9jbWQtPmNoYW5uZWxfaWRlbnRpZmllci5tYWpvciA+PiA4KTsKLQkJbXNnLT5tc2dbNF0gPSB1aV9jbWQtPmNoYW5uZWxfaWRlbnRpZmllci5tYWpvciAmJiAweGZmOworCQltc2ctPm1zZ1s0XSA9IHVpX2NtZC0+Y2hhbm5lbF9pZGVudGlmaWVyLm1ham9yICYgMHhmZjsKIAkJbXNnLT5tc2dbNV0gPSB1aV9jbWQtPmNoYW5uZWxfaWRlbnRpZmllci5taW5vciA+PiA4OwogCQltc2ctPm1zZ1s2XSA9IHVpX2NtZC0+Y2hhbm5lbF9pZGVudGlmaWVyLm1pbm9yICYgMHhmZjsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NlYy5oIGIvaW5jbHVkZS9saW51eC9jZWMuaAppbmRleCBiM2UyMjg5Li44NTE5NjhlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NlYy5oCisrKyBiL2luY2x1ZGUvbGludXgvY2VjLmgKQEAgLTM2NCw3ICszNjQsNyBAQAogICogQG51bV9sb2dfYWRkcnM6IGhvdyBtYW55IGxvZ2ljYWwgYWRkcmVzc2VzIHNob3VsZCBiZSBjbGFpbWVkLiBTZXQgYnkgdGhlCiAgKgljYWxsZXIuCiAgKiBAdmVuZG9yX2lkOiB0aGUgdmVuZG9yIElEIG9mIHRoZSBkZXZpY2UuIFNldCBieSB0aGUgY2FsbGVyLgotICogQGZsYWdzOiBzZXQgdG8gMC4KKyAqIEBmbGFnczogZmxhZ3MuCiAgKiBAb3NkX25hbWU6IHRoZSBPU0QgbmFtZSBvZiB0aGUgZGV2aWNlLiBTZXQgYnkgdGhlIGNhbGxlci4KICAqIEBwcmltYXJ5X2RldmljZV90eXBlOiB0aGUgcHJpbWFyeSBkZXZpY2UgdHlwZSBmb3IgZWFjaCBsb2dpY2FsIGFkZHJlc3MuCiAgKglTZXQgYnkgdGhlIGNhbGxlci4KQEAgLTM4OSw2ICszODksOSBAQAogCV9fdTggZmVhdHVyZXNbQ0VDX01BWF9MT0dfQUREUlNdWzEyXTsKIH07CiAKKy8qIEFsbG93IGEgZmFsbGJhY2sgdG8gdW5yZWdpc3RlcmVkICovCisjZGVmaW5lIENFQ19MT0dfQUREUlNfRkxfQUxMT1dfVU5SRUdfRkFMTEJBQ0sJKDEgPDwgMCkKKwogLyogRXZlbnRzICovCiAKIC8qIEV2ZW50IHRoYXQgb2NjdXJzIHdoZW4gdGhlIGFkYXB0ZXIgc3RhdGUgY2hhbmdlcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaCBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKaW5kZXggOTg0ZjczYi4uYTQ0MTRhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCkBAIC00OTcsNiArNDk3LDIzIEBACiAJcmV0dXJuIGNncnAtPmFuY2VzdG9yX2lkc1thbmNlc3Rvci0+bGV2ZWxdID09IGFuY2VzdG9yLT5pZDsKIH0KIAorLyoqCisgKiB0YXNrX3VuZGVyX2Nncm91cF9oaWVyYXJjaHkgLSB0ZXN0IHRhc2sncyBtZW1iZXJzaGlwIG9mIGNncm91cCBhbmNlc3RyeQorICogQHRhc2s6IHRoZSB0YXNrIHRvIGJlIHRlc3RlZAorICogQGFuY2VzdG9yOiBwb3NzaWJsZSBhbmNlc3RvciBvZiBAdGFzaydzIGNncm91cAorICoKKyAqIFRlc3RzIHdoZXRoZXIgQHRhc2sncyBkZWZhdWx0IGNncm91cCBoaWVyYXJjaHkgaXMgYSBkZXNjZW5kYW50IG9mIEBhbmNlc3Rvci4KKyAqIEl0IGZvbGxvd3MgYWxsIHRoZSBzYW1lIHJ1bGVzIGFzIGNncm91cF9pc19kZXNjZW5kYW50LCBhbmQgb25seSBhcHBsaWVzCisgKiB0byB0aGUgZGVmYXVsdCBoaWVyYXJjaHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCB0YXNrX3VuZGVyX2Nncm91cF9oaWVyYXJjaHkoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCQkgICAgICAgc3RydWN0IGNncm91cCAqYW5jZXN0b3IpCit7CisJc3RydWN0IGNzc19zZXQgKmNzZXQgPSB0YXNrX2Nzc19zZXQodGFzayk7CisKKwlyZXR1cm4gY2dyb3VwX2lzX2Rlc2NlbmRhbnQoY3NldC0+ZGZsX2NncnAsIGFuY2VzdG9yKTsKK30KKwogLyogbm8gc3luY2hyb25pemF0aW9uLCB0aGUgcmVzdWx0IGNhbiBvbmx5IGJlIHVzZWQgYXMgYSBoaW50ICovCiBzdGF0aWMgaW5saW5lIGJvb2wgY2dyb3VwX2lzX3BvcHVsYXRlZChzdHJ1Y3QgY2dyb3VwICpjZ3JwKQogewpAQCAtNTU3LDYgKzU3NCw3IEBACiAjZWxzZSAvKiAhQ09ORklHX0NHUk9VUFMgKi8KIAogc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGU7CitzdHJ1Y3QgY2dyb3VwOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgY3NzX3B1dChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKSB7fQogc3RhdGljIGlubGluZSBpbnQgY2dyb3VwX2F0dGFjaF90YXNrX2FsbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmZyb20sCkBAIC01NzQsNiArNTkyLDExIEBACiBzdGF0aWMgaW5saW5lIGludCBjZ3JvdXBfaW5pdF9lYXJseSh2b2lkKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBjZ3JvdXBfaW5pdCh2b2lkKSB7IHJldHVybiAwOyB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCB0YXNrX3VuZGVyX2Nncm91cF9oaWVyYXJjaHkoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCQkgICAgICAgc3RydWN0IGNncm91cCAqYW5jZXN0b3IpCit7CisJcmV0dXJuIHRydWU7Cit9CiAjZW5kaWYgLyogIUNPTkZJR19DR1JPVVBTICovCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nsay1wcm92aWRlci5oIGIvaW5jbHVkZS9saW51eC9jbGstcHJvdmlkZXIuaAppbmRleCBhMzljMGM1Li5hZjU5NjM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nsay1wcm92aWRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvY2xrLXByb3ZpZGVyLmgKQEAgLTc3Miw3ICs3NzIsNyBAQAogfTsKIAogc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgewotCXNpemVfdCBudW07CisJdW5zaWduZWQgaW50IG51bTsKIAlzdHJ1Y3QgY2xrX2h3ICpod3NbXTsKIH07CiAKQEAgLTc4MCw2ICs3ODAsMTggQEAKIAogI2RlZmluZSBDTEtfT0ZfREVDTEFSRShuYW1lLCBjb21wYXQsIGZuKSBPRl9ERUNMQVJFXzEoY2xrLCBuYW1lLCBjb21wYXQsIGZuKQogCisvKgorICogVXNlIHRoaXMgbWFjcm8gd2hlbiB5b3UgaGF2ZSBhIGRyaXZlciB0aGF0IHJlcXVpcmVzIHR3byBpbml0aWFsaXphdGlvbgorICogcm91dGluZXMsIG9uZSBhdCBvZl9jbGtfaW5pdCgpLCBhbmQgb25lIGF0IHBsYXRmb3JtIGRldmljZSBwcm9iZQorICovCisjZGVmaW5lIENMS19PRl9ERUNMQVJFX0RSSVZFUihuYW1lLCBjb21wYXQsIGZuKSBcCisJc3RhdGljIHZvaWQgbmFtZSMjX29mX2Nsa19pbml0X2RyaXZlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQlcCisJewkJCQkJCQkJXAorCQlvZl9ub2RlX2NsZWFyX2ZsYWcobnAsIE9GX1BPUFVMQVRFRCk7CQkJXAorCQlmbihucCk7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJT0ZfREVDTEFSRV8xKGNsaywgbmFtZSwgY29tcGF0LCBuYW1lIyNfb2ZfY2xrX2luaXRfZHJpdmVyKQorCiAjaWZkZWYgQ09ORklHX09GCiBpbnQgb2ZfY2xrX2FkZF9wcm92aWRlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJc3RydWN0IGNsayAqKCpjbGtfc3JjX2dldCkoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqYXJncywKQEAgLTg0Miw3ICs4NTQsNyBAQAogewogCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwogfQotc3RhdGljIGlubGluZSBpbnQgb2ZfY2xrX2dldF9wYXJlbnRfY291bnQoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG9mX2Nsa19nZXRfcGFyZW50X2NvdW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLWdjYy5oIGIvaW5jbHVkZS9saW51eC9jb21waWxlci1nY2MuaAppbmRleCBlMjk0OTM5Li41NzNjNWExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLWdjYy5oCisrKyBiL2luY2x1ZGUvbGludXgvY29tcGlsZXItZ2NjLmgKQEAgLTE1OCw3ICsxNTgsNyBAQAogI2RlZmluZSBfX2NvbXBpbGVyX29mZnNldG9mKGEsIGIpCQkJCQlcCiAJX19idWlsdGluX29mZnNldG9mKGEsIGIpCiAKLSNpZiBHQ0NfVkVSU0lPTiA+PSA0MDEwMCAmJiBHQ0NfVkVSU0lPTiA8IDQwNjAwCisjaWYgR0NDX1ZFUlNJT04gPj0gNDAxMDAKICMgZGVmaW5lIF9fY29tcGlsZXRpbWVfb2JqZWN0X3NpemUob2JqKSBfX2J1aWx0aW5fb2JqZWN0X3NpemUob2JqLCAwKQogI2VuZGlmCiAKQEAgLTI0Miw3ICsyNDIsMTEgQEAKICAqLwogI2RlZmluZSBhc21fdm9sYXRpbGVfZ290byh4Li4uKQlkbyB7IGFzbSBnb3RvKHgpOyBhc20gKCIiKTsgfSB3aGlsZSAoMCkKIAotI2lmZGVmIENPTkZJR19BUkNIX1VTRV9CVUlMVElOX0JTV0FQCisvKgorICogc3BhcnNlIChfX0NIRUNLRVJfXykgcHJldGVuZHMgdG8gYmUgZ2NjLCBidXQgY2FuJ3QgZG8gY29uc3RhbnQKKyAqIGZvbGRpbmcgaW4gX19idWlsdGluX2Jzd2FwKigpICh5ZXQpLCBzbyBkb24ndCBzZXQgdGhlc2UgZm9yIGl0LgorICovCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9VU0VfQlVJTFRJTl9CU1dBUCkgJiYgIWRlZmluZWQoX19DSEVDS0VSX18pCiAjaWYgR0NDX1ZFUlNJT04gPj0gNDA0MDAKICNkZWZpbmUgX19IQVZFX0JVSUxUSU5fQlNXQVAzMl9fCiAjZGVmaW5lIF9fSEFWRV9CVUlMVElOX0JTV0FQNjRfXwpAQCAtMjUwLDcgKzI1NCw3IEBACiAjaWYgR0NDX1ZFUlNJT04gPj0gNDA4MDAKICNkZWZpbmUgX19IQVZFX0JVSUxUSU5fQlNXQVAxNl9fCiAjZW5kaWYKLSNlbmRpZiAvKiBDT05GSUdfQVJDSF9VU0VfQlVJTFRJTl9CU1dBUCAqLworI2VuZGlmIC8qIENPTkZJR19BUkNIX1VTRV9CVUlMVElOX0JTV0FQICYmICFfX0NIRUNLRVJfXyAqLwogCiAjaWYgR0NDX1ZFUlNJT04gPj0gNTAwMDAKICNkZWZpbmUgS0FTQU5fQUJJX1ZFUlNJT04gNApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21waWxlci5oIGIvaW5jbHVkZS9saW51eC9jb21waWxlci5oCmluZGV4IDFiYjk1NDguLjY2ODU2OTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmgKQEAgLTUyNywxMyArNTI3LDE0IEBACiAgKiBvYmplY3QncyBsaWZldGltZSBpcyBtYW5hZ2VkIGJ5IHNvbWV0aGluZyBvdGhlciB0aGFuIFJDVS4gIFRoYXQKICAqICJzb21ldGhpbmcgb3RoZXIiIG1pZ2h0IGJlIHJlZmVyZW5jZSBjb3VudGluZyBvciBzaW1wbGUgaW1tb3J0YWxpdHkuCiAgKgotICogVGhlIHNlZW1pbmdseSB1bnVzZWQgdm9pZCAqIHZhcmlhYmxlIGlzIHRvIHZhbGlkYXRlIEBwIGlzIGluZGVlZCBhIHBvaW50ZXIKLSAqIHR5cGUuIEFsbCBwb2ludGVyIHR5cGVzIHNpbGVudGx5IGNhc3QgdG8gdm9pZCAqLgorICogVGhlIHNlZW1pbmdseSB1bnVzZWQgdmFyaWFibGUgX19fdHlwZWNoZWNrX3AgdmFsaWRhdGVzIHRoYXQgQHAgaXMKKyAqIGluZGVlZCBhIHBvaW50ZXIgdHlwZSBieSB1c2luZyBhIHBvaW50ZXIgdG8gdHlwZW9mKCpwKSBhcyB0aGUgdHlwZS4KKyAqIFRha2luZyBhIHBvaW50ZXIgdG8gdHlwZW9mKCpwKSBhZ2FpbiBpcyBuZWVkZWQgaW4gY2FzZSBwIGlzIHZvaWQgKi4KICAqLwogI2RlZmluZSBsb2NrbGVzc19kZXJlZmVyZW5jZShwKSBcCiAoeyBcCiAJdHlwZW9mKHApIF9fX19fX19fX3AxID0gUkVBRF9PTkNFKHApOyBcCi0JX19tYXliZV91bnVzZWQgY29uc3Qgdm9pZCAqIGNvbnN0IF9fX19fX19fX3AyID0gX19fX19fX19fcDE7IFwKKwl0eXBlb2YoKihwKSkgKl9fX3R5cGVjaGVja19wIF9fbWF5YmVfdW51c2VkOyBcCiAJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7IC8qIERlcGVuZGVuY3kgb3JkZXIgdnMuIHAgYWJvdmUuICovIFwKIAkoX19fX19fX19fcDEpOyBcCiB9KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb3Jlc2lnaHQuaCBiL2luY2x1ZGUvbGludXgvY29yZXNpZ2h0LmgKaW5kZXggMzg1ZDYyZS4uMmE1OTgyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb3Jlc2lnaHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvcmVzaWdodC5oCkBAIC0yMzIsOCArMjMyLDkgQEAKIAlpbnQgKCpjcHVfaWQpKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2Rldik7CiAJaW50ICgqdHJhY2VfaWQpKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2Rldik7CiAJaW50ICgqZW5hYmxlKShzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYsCi0JCSAgICAgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsICB1MzIgbW9kZSk7Ci0Jdm9pZCAoKmRpc2FibGUpKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2Rldik7CisJCSAgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgIHUzMiBtb2RlKTsKKwl2b2lkICgqZGlzYWJsZSkoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2LAorCQkJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKIH07CiAKIHN0cnVjdCBjb3Jlc2lnaHRfb3BzIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1LmggYi9pbmNsdWRlL2xpbnV4L2NwdS5oCmluZGV4IDc5N2Q5YzguLjc1NzJkOWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1LmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHUuaApAQCAtNjEsMTcgKzYxLDggQEAKICNkZWZpbmUgQ1BVX0RPV05fUFJFUEFSRQkweDAwMDUgLyogQ1BVICh1bnNpZ25lZCl2IGdvaW5nIGRvd24gKi8KICNkZWZpbmUgQ1BVX0RPV05fRkFJTEVECQkweDAwMDYgLyogQ1BVICh1bnNpZ25lZCl2IE5PVCBnb2luZyBkb3duICovCiAjZGVmaW5lIENQVV9ERUFECQkweDAwMDcgLyogQ1BVICh1bnNpZ25lZCl2IGRlYWQgKi8KLSNkZWZpbmUgQ1BVX0RZSU5HCQkweDAwMDggLyogQ1BVICh1bnNpZ25lZCl2IG5vdCBydW5uaW5nIGFueSB0YXNrLAotCQkJCQkqIG5vdCBoYW5kbGluZyBpbnRlcnJ1cHRzLCBzb29uIGRlYWQuCi0JCQkJCSogQ2FsbGVkIG9uIHRoZSBkeWluZyBjcHUsIGludGVycnVwdHMKLQkJCQkJKiBhcmUgYWxyZWFkeSBkaXNhYmxlZC4gTXVzdCBub3QKLQkJCQkJKiBzbGVlcCwgbXVzdCBub3QgZmFpbCAqLwogI2RlZmluZSBDUFVfUE9TVF9ERUFECQkweDAwMDkgLyogQ1BVICh1bnNpZ25lZCl2IGRlYWQsIGNwdV9ob3RwbHVnCiAJCQkJCSogbG9jayBpcyBkcm9wcGVkICovCi0jZGVmaW5lIENQVV9TVEFSVElORwkJMHgwMDBBIC8qIENQVSAodW5zaWduZWQpdiBzb29uIHJ1bm5pbmcuCi0JCQkJCSogQ2FsbGVkIG9uIHRoZSBuZXcgY3B1LCBqdXN0IGJlZm9yZQotCQkJCQkqIGVuYWJsaW5nIGludGVycnVwdHMuIE11c3Qgbm90IHNsZWVwLAotCQkJCQkqIG11c3Qgbm90IGZhaWwgKi8KICNkZWZpbmUgQ1BVX0JST0tFTgkJMHgwMDBCIC8qIENQVSAodW5zaWduZWQpdiBkaWQgbm90IGRpZSBwcm9wZXJseSwKIAkJCQkJKiBwZXJoYXBzIGR1ZSB0byBwcmVlbXB0aW9uLiAqLwogCkBAIC04Niw5ICs3Nyw2IEBACiAjZGVmaW5lIENQVV9ET1dOX1BSRVBBUkVfRlJPWkVOCShDUFVfRE9XTl9QUkVQQVJFIHwgQ1BVX1RBU0tTX0ZST1pFTikKICNkZWZpbmUgQ1BVX0RPV05fRkFJTEVEX0ZST1pFTgkoQ1BVX0RPV05fRkFJTEVEIHwgQ1BVX1RBU0tTX0ZST1pFTikKICNkZWZpbmUgQ1BVX0RFQURfRlJPWkVOCQkoQ1BVX0RFQUQgfCBDUFVfVEFTS1NfRlJPWkVOKQotI2RlZmluZSBDUFVfRFlJTkdfRlJPWkVOCShDUFVfRFlJTkcgfCBDUFVfVEFTS1NfRlJPWkVOKQotI2RlZmluZSBDUFVfU1RBUlRJTkdfRlJPWkVOCShDUFVfU1RBUlRJTkcgfCBDUFVfVEFTS1NfRlJPWkVOKQotCiAKICNpZmRlZiBDT05GSUdfU01QCiBleHRlcm4gYm9vbCBjcHVocF90YXNrc19mcm96ZW47CkBAIC0yMjgsNyArMjE2LDExIEBACiAjZW5kaWYJCS8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQX1NNUAotZXh0ZXJuIGludCBkaXNhYmxlX25vbmJvb3RfY3B1cyh2b2lkKTsKK2V4dGVybiBpbnQgZnJlZXplX3NlY29uZGFyeV9jcHVzKGludCBwcmltYXJ5KTsKK3N0YXRpYyBpbmxpbmUgaW50IGRpc2FibGVfbm9uYm9vdF9jcHVzKHZvaWQpCit7CisJcmV0dXJuIGZyZWV6ZV9zZWNvbmRhcnlfY3B1cygwKTsKK30KIGV4dGVybiB2b2lkIGVuYWJsZV9ub25ib290X2NwdXModm9pZCk7CiAjZWxzZSAvKiAhQ09ORklHX1BNX1NMRUVQX1NNUCAqLwogc3RhdGljIGlubGluZSBpbnQgZGlzYWJsZV9ub25ib290X2NwdXModm9pZCkgeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVob3RwbHVnLmggYi9pbmNsdWRlL2xpbnV4L2NwdWhvdHBsdWcuaAppbmRleCAyNDJiZjUzLi5hOGZmYzQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdWhvdHBsdWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdWhvdHBsdWcuaApAQCAtMSw2ICsxLDggQEAKICNpZm5kZWYgX19DUFVIT1RQTFVHX0gKICNkZWZpbmUgX19DUFVIT1RQTFVHX0gKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKIGVudW0gY3B1aHBfc3RhdGUgewogCUNQVUhQX09GRkxJTkUsCiAJQ1BVSFBfQ1JFQVRFX1RIUkVBRFMsCkBAIC0xNCwxNSArMTYsNDAgQEAKIAlDUFVIUF9QRVJGX1NVUEVSSCwKIAlDUFVIUF9YODZfSFBFVF9ERUFELAogCUNQVUhQX1g4Nl9BUEJfREVBRCwKKwlDUFVIUF9WSVJUX05FVF9ERUFELAorCUNQVUhQX1NMVUJfREVBRCwKKwlDUFVIUF9NTV9XUklURUJBQ0tfREVBRCwKKwlDUFVIUF9TT0ZUSVJRX0RFQUQsCisJQ1BVSFBfTkVUX01WTkVUQV9ERUFELAorCUNQVUhQX0NQVUlETEVfREVBRCwKKwlDUFVIUF9BUk02NF9GUFNJTURfREVBRCwKKwlDUFVIUF9BUk1fT01BUF9XQUtFX0RFQUQsCisJQ1BVSFBfSVJRX1BPTExfREVBRCwKKwlDUFVIUF9CTE9DS19TT0ZUSVJRX0RFQUQsCisJQ1BVSFBfVklSVF9TQ1NJX0RFQUQsCisJQ1BVSFBfQUNQSV9DUFVEUlZfREVBRCwKKwlDUFVIUF9TMzkwX1BGQVVMVF9ERUFELAorCUNQVUhQX0JMS19NUV9ERUFELAogCUNQVUhQX1dPUktRVUVVRV9QUkVQLAogCUNQVUhQX1BPV0VSX05VTUFfUFJFUEFSRSwKIAlDUFVIUF9IUlRJTUVSU19QUkVQQVJFLAogCUNQVUhQX1BST0ZJTEVfUFJFUEFSRSwKIAlDUFVIUF9YMkFQSUNfUFJFUEFSRSwKIAlDUFVIUF9TTVBDRkRfUFJFUEFSRSwKKwlDUFVIUF9SRUxBWV9QUkVQQVJFLAorCUNQVUhQX1NMQUJfUFJFUEFSRSwKKwlDUFVIUF9NRF9SQUlENV9QUkVQQVJFLAogCUNQVUhQX1JDVVRSRUVfUFJFUCwKKwlDUFVIUF9DUFVJRExFX0NPVVBMRURfUFJFUEFSRSwKKwlDUFVIUF9QT1dFUlBDX1BNQUNfUFJFUEFSRSwKKwlDUFVIUF9QT1dFUlBDX01NVV9DVFhfUFJFUEFSRSwKIAlDUFVIUF9OT1RJRllfUFJFUEFSRSwKKwlDUFVIUF9BUk1fU0hNT0JJTEVfU0NVX1BSRVBBUkUsCisJQ1BVSFBfU0hfU0gzWF9QUkVQQVJFLAorCUNQVUhQX0JMS19NUV9QUkVQQVJFLAogCUNQVUhQX1RJTUVSU19ERUFELAorCUNQVUhQX05PVEZfRVJSX0lOSl9QUkVQQVJFLAorCUNQVUhQX01JUFNfU09DX1BSRVBBUkUsCiAJQ1BVSFBfQlJJTkdVUF9DUFUsCiAJQ1BVSFBfQVBfSURMRV9ERUFELAogCUNQVUhQX0FQX09GRkxJTkUsCkBAIC00NSw2ICs3Miw4IEBACiAJQ1BVSFBfQVBfUEVSRl9NRVRBR19TVEFSVElORywKIAlDUFVIUF9BUF9NSVBTX09QX0xPT05HU09OM19TVEFSVElORywKIAlDUFVIUF9BUF9BUk1fVkZQX1NUQVJUSU5HLAorCUNQVUhQX0FQX0FSTTY0X0RFQlVHX01PTklUT1JTX1NUQVJUSU5HLAorCUNQVUhQX0FQX1BFUkZfQVJNX0hXX0JSRUFLUE9JTlRfU1RBUlRJTkcsCiAJQ1BVSFBfQVBfUEVSRl9BUk1fU1RBUlRJTkcsCiAJQ1BVSFBfQVBfQVJNX0wyWDBfU1RBUlRJTkcsCiAJQ1BVSFBfQVBfQVJNX0FSQ0hfVElNRVJfU1RBUlRJTkcsCkBAIC02OCw3ICs5Nyw2IEBACiAJQ1BVSFBfQVBfQVJNNjRfSVNOREVQX1NUQVJUSU5HLAogCUNQVUhQX0FQX1NNUENGRF9EWUlORywKIAlDUFVIUF9BUF9YODZfVEJPT1RfRFlJTkcsCi0JQ1BVSFBfQVBfTk9USUZZX1NUQVJUSU5HLAogCUNQVUhQX0FQX09OTElORSwKIAlDUFVIUF9URUFSRE9XTl9DUFUsCiAJQ1BVSFBfQVBfT05MSU5FX0lETEUsCkBAIC04Niw2ICsxMTQsNyBAQAogCUNQVUhQX0FQX1BFUkZfUzM5MF9TRl9PTkxJTkUsCiAJQ1BVSFBfQVBfUEVSRl9BUk1fQ0NJX09OTElORSwKIAlDUFVIUF9BUF9QRVJGX0FSTV9DQ05fT05MSU5FLAorCUNQVUhQX0FQX1BFUkZfQVJNX0wyWDBfT05MSU5FLAogCUNQVUhQX0FQX1dPUktRVUVVRV9PTkxJTkUsCiAJQ1BVSFBfQVBfUkNVVFJFRV9PTkxJTkUsCiAJQ1BVSFBfQVBfTk9USUZZX09OTElORSwKQEAgLTk5LDcgKzEyOCw3IEBACiAKIGludCBfX2NwdWhwX3NldHVwX3N0YXRlKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUsCWNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgaW52b2tlLAogCQkJaW50ICgqc3RhcnR1cCkodW5zaWduZWQgaW50IGNwdSksCi0JCQlpbnQgKCp0ZWFyZG93bikodW5zaWduZWQgaW50IGNwdSkpOworCQkJaW50ICgqdGVhcmRvd24pKHVuc2lnbmVkIGludCBjcHUpLCBib29sIG11bHRpX2luc3RhbmNlKTsKIAogLyoqCiAgKiBjcHVocF9zZXR1cF9zdGF0ZSAtIFNldHVwIGhvdHBsdWcgc3RhdGUgY2FsbGJhY2tzIHdpdGggY2FsbGluZyB0aGUgY2FsbGJhY2tzCkBAIC0xMTYsNyArMTQ1LDcgQEAKIAkJCQkgICAgaW50ICgqc3RhcnR1cCkodW5zaWduZWQgaW50IGNwdSksCiAJCQkJICAgIGludCAoKnRlYXJkb3duKSh1bnNpZ25lZCBpbnQgY3B1KSkKIHsKLQlyZXR1cm4gX19jcHVocF9zZXR1cF9zdGF0ZShzdGF0ZSwgbmFtZSwgdHJ1ZSwgc3RhcnR1cCwgdGVhcmRvd24pOworCXJldHVybiBfX2NwdWhwX3NldHVwX3N0YXRlKHN0YXRlLCBuYW1lLCB0cnVlLCBzdGFydHVwLCB0ZWFyZG93biwgZmFsc2UpOwogfQogCiAvKioKQEAgLTEzNSw3ICsxNjQsNjYgQEAKIAkJCQkJICAgIGludCAoKnN0YXJ0dXApKHVuc2lnbmVkIGludCBjcHUpLAogCQkJCQkgICAgaW50ICgqdGVhcmRvd24pKHVuc2lnbmVkIGludCBjcHUpKQogewotCXJldHVybiBfX2NwdWhwX3NldHVwX3N0YXRlKHN0YXRlLCBuYW1lLCBmYWxzZSwgc3RhcnR1cCwgdGVhcmRvd24pOworCXJldHVybiBfX2NwdWhwX3NldHVwX3N0YXRlKHN0YXRlLCBuYW1lLCBmYWxzZSwgc3RhcnR1cCwgdGVhcmRvd24sCisJCQkJICAgZmFsc2UpOworfQorCisvKioKKyAqIGNwdWhwX3NldHVwX3N0YXRlX211bHRpIC0gQWRkIGNhbGxiYWNrcyBmb3IgbXVsdGkgc3RhdGUKKyAqIEBzdGF0ZToJVGhlIHN0YXRlIGZvciB3aGljaCB0aGUgY2FsbHMgYXJlIGluc3RhbGxlZAorICogQG5hbWU6CU5hbWUgb2YgdGhlIGNhbGxiYWNrLgorICogQHN0YXJ0dXA6CXN0YXJ0dXAgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEB0ZWFyZG93bjoJdGVhcmRvd24gY2FsbGJhY2sgZnVuY3Rpb24KKyAqCisgKiBTZXRzIHRoZSBpbnRlcm5hbCBtdWx0aV9pbnN0YW5jZSBmbGFnIGFuZCBwcmVwYXJlcyBhIHN0YXRlIHRvIHdvcmsgYXMgYSBtdWx0aQorICogaW5zdGFuY2UgY2FsbGJhY2suIE5vIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBhdCB0aGlzIHBvaW50LiBUaGUgY2FsbGJhY2tzIGFyZQorICogaW52b2tlZCBvbmNlIGFuIGluc3RhbmNlIGZvciB0aGlzIHN0YXRlIGFyZSByZWdpc3RlcmVkIHZpYQorICogQGNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZSBvciBAY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlX25vY2FsbHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNwdWhwX3NldHVwX3N0YXRlX211bHRpKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUsCisJCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICBpbnQgKCpzdGFydHVwKSh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQkJCSBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSksCisJCQkJCSAgaW50ICgqdGVhcmRvd24pKHVuc2lnbmVkIGludCBjcHUsCisJCQkJCQkJICBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkpCit7CisJcmV0dXJuIF9fY3B1aHBfc2V0dXBfc3RhdGUoc3RhdGUsIG5hbWUsIGZhbHNlLAorCQkJCSAgICh2b2lkICopIHN0YXJ0dXAsCisJCQkJICAgKHZvaWQgKikgdGVhcmRvd24sIHRydWUpOworfQorCitpbnQgX19jcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2UoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsCisJCQkgICAgICAgYm9vbCBpbnZva2UpOworCisvKioKKyAqIGNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZSAtIEFkZCBhbiBpbnN0YW5jZSBmb3IgYSBzdGF0ZSBhbmQgaW52b2tlIHN0YXJ0dXAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLgorICogQHN0YXRlOglUaGUgc3RhdGUgZm9yIHdoaWNoIHRoZSBpbnN0YW5jZSBpcyBpbnN0YWxsZWQKKyAqIEBub2RlOglUaGUgbm9kZSBmb3IgdGhpcyBpbmRpdmlkdWFsIHN0YXRlLgorICoKKyAqIEluc3RhbGxzIHRoZSBpbnN0YW5jZSBmb3IgdGhlIEBzdGF0ZSBhbmQgaW52b2tlcyB0aGUgc3RhcnR1cCBjYWxsYmFjayBvbgorICogdGhlIHByZXNlbnQgY3B1cyB3aGljaCBoYXZlIGFscmVhZHkgcmVhY2hlZCB0aGUgQHN0YXRlLiBUaGUgQHN0YXRlIG11c3QgaGF2ZQorICogYmVlbiBlYXJsaWVyIG1hcmtlZCBhcyBtdWx0aS1pbnN0YW5jZSBieSBAY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZShlbnVtIGNwdWhwX3N0YXRlIHN0YXRlLAorCQkJCQkgICBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKK3sKKwlyZXR1cm4gX19jcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2Uoc3RhdGUsIG5vZGUsIHRydWUpOworfQorCisvKioKKyAqIGNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZV9ub2NhbGxzIC0gQWRkIGFuIGluc3RhbmNlIGZvciBhIHN0YXRlIHdpdGhvdXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tpbmcgdGhlIHN0YXJ0dXAgY2FsbGJhY2suCisgKiBAc3RhdGU6CVRoZSBzdGF0ZSBmb3Igd2hpY2ggdGhlIGluc3RhbmNlIGlzIGluc3RhbGxlZAorICogQG5vZGU6CVRoZSBub2RlIGZvciB0aGlzIGluZGl2aWR1YWwgc3RhdGUuCisgKgorICogSW5zdGFsbHMgdGhlIGluc3RhbmNlIGZvciB0aGUgQHN0YXRlIFRoZSBAc3RhdGUgbXVzdCBoYXZlIGJlZW4gZWFybGllcgorICogbWFya2VkIGFzIG11bHRpLWluc3RhbmNlIGJ5IEBjcHVocF9zZXR1cF9zdGF0ZV9tdWx0aS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlX25vY2FsbHMoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSwKKwkJCQkJCSAgIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQoreworCXJldHVybiBfX2NwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZShzdGF0ZSwgbm9kZSwgZmFsc2UpOwogfQogCiB2b2lkIF9fY3B1aHBfcmVtb3ZlX3N0YXRlKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUsIGJvb2wgaW52b2tlKTsKQEAgLTE2Miw2ICsyNTAsNTEgQEAKIAlfX2NwdWhwX3JlbW92ZV9zdGF0ZShzdGF0ZSwgZmFsc2UpOwogfQogCisvKioKKyAqIGNwdWhwX3JlbW92ZV9tdWx0aV9zdGF0ZSAtIFJlbW92ZSBob3RwbHVnIG11bHRpIHN0YXRlIGNhbGxiYWNrCisgKiBAc3RhdGU6CVRoZSBzdGF0ZSBmb3Igd2hpY2ggdGhlIGNhbGxzIGFyZSByZW1vdmVkCisgKgorICogUmVtb3ZlcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIGZyb20gYSBtdWx0aSBzdGF0ZS4gVGhpcyBpcyB0aGUgcmV2ZXJzZSBvZgorICogY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoKS4gQWxsIGluc3RhbmNlcyBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQgYmVmb3JlCisgKiBpbnZva2luZyB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUpCit7CisJX19jcHVocF9yZW1vdmVfc3RhdGUoc3RhdGUsIGZhbHNlKTsKK30KKworaW50IF9fY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUsCisJCQkJICBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgYm9vbCBpbnZva2UpOworCisvKioKKyAqIGNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZSAtIFJlbW92ZSBob3RwbHVnIGluc3RhbmNlIGZyb20gc3RhdGUgYW5kIGludm9rZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRlYXJkb3duIGNhbGxiYWNrCisgKiBAc3RhdGU6CVRoZSBzdGF0ZSBmcm9tIHdoaWNoIHRoZSBpbnN0YW5jZSBpcyByZW1vdmVkCisgKiBAbm9kZToJVGhlIG5vZGUgZm9yIHRoaXMgaW5kaXZpZHVhbCBzdGF0ZS4KKyAqCisgKiBSZW1vdmVzIHRoZSBpbnN0YW5jZSBhbmQgaW52b2tlcyB0aGUgdGVhcmRvd24gY2FsbGJhY2sgb24gdGhlIHByZXNlbnQgY3B1cworICogd2hpY2ggaGF2ZSBhbHJlYWR5IHJlYWNoZWQgdGhlIEBzdGF0ZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUsCisJCQkJCSAgICAgIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQoreworCXJldHVybiBfX2NwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZShzdGF0ZSwgbm9kZSwgdHJ1ZSk7Cit9CisKKy8qKgorICogY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlX25vY2FsbHMgLSBSZW1vdmUgaG90cGx1ZyBpbnN0YW5jZSBmcm9tIHN0YXRlCisgKgkJCQkJIHdpdGhvdXQgaW52b2tpbmcgdGhlIHJlYXRkb3duIGNhbGxiYWNrCisgKiBAc3RhdGU6CVRoZSBzdGF0ZSBmcm9tIHdoaWNoIHRoZSBpbnN0YW5jZSBpcyByZW1vdmVkCisgKiBAbm9kZToJVGhlIG5vZGUgZm9yIHRoaXMgaW5kaXZpZHVhbCBzdGF0ZS4KKyAqCisgKiBSZW1vdmVzIHRoZSBpbnN0YW5jZSB3aXRob3V0IGludm9raW5nIHRoZSB0ZWFyZG93biBjYWxsYmFjay4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlX25vY2FsbHMoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSwKKwkJCQkJCSAgICAgIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQoreworCXJldHVybiBfX2NwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZShzdGF0ZSwgbm9kZSwgZmFsc2UpOworfQorCiAjaWZkZWYgQ09ORklHX1NNUAogdm9pZCBjcHVocF9vbmxpbmVfaWRsZShlbnVtIGNwdWhwX3N0YXRlIHN0YXRlKTsKICNlbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RlYnVnZnMuaCBiL2luY2x1ZGUvbGludXgvZGVidWdmcy5oCmluZGV4IDE0MzhlMjMuLjRkM2YwZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGVidWdmcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZGVidWdmcy5oCkBAIC00NSw2ICs0NSwyMyBAQAogCiBleHRlcm4gc3RydWN0IHNyY3Vfc3RydWN0IGRlYnVnZnNfc3JjdTsKIAorLyoqCisgKiBkZWJ1Z2ZzX3JlYWxfZm9wcyAtIGdldHRlciBmb3IgdGhlIHJlYWwgZmlsZSBvcGVyYXRpb24KKyAqIEBmaWxwOiBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZmlsZQorICoKKyAqIE11c3Qgb25seSBiZSBjYWxsZWQgdW5kZXIgdGhlIHByb3RlY3Rpb24gZXN0YWJsaXNoZWQgYnkKKyAqIGRlYnVnZnNfdXNlX2ZpbGVfc3RhcnQoKS4KKyAqLworc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpkZWJ1Z2ZzX3JlYWxfZm9wcyhzdHJ1Y3QgZmlsZSAqZmlscCkKKwlfX211c3RfaG9sZCgmZGVidWdmc19zcmN1KQoreworCS8qCisJICogTmVpdGhlciB0aGUgcG9pbnRlciB0byB0aGUgc3RydWN0IGZpbGVfb3BlcmF0aW9ucywgbm9yIGl0cworCSAqIGNvbnRlbnRzIGV2ZXIgY2hhbmdlIC0tIHNyY3VfZGVyZWZlcmVuY2UoKSBpcyBub3QgbmVlZGVkIGhlcmUuCisJICovCisJcmV0dXJuIGZpbHAtPmZfcGF0aC5kZW50cnktPmRfZnNkYXRhOworfQorCiAjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpCiAKIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX2ZpbGUoY29uc3QgY2hhciAqbmFtZSwgdW1vZGVfdCBtb2RlLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZmcmVxLWV2ZW50LmggYi9pbmNsdWRlL2xpbnV4L2RldmZyZXEtZXZlbnQuaAppbmRleCAwYTgzYTFlLi40ZGIwMGIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmZyZXEtZXZlbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RldmZyZXEtZXZlbnQuaApAQCAtMTQ4LDExICsxNDgsNiBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKmRldmZyZXFfZXZlbnRfZ2V0X2RydmRhdGEoc3RydWN0IGRldmZyZXFfZXZlbnRfZGV2ICplZGV2KQotewotCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotfQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZmcmVxX2V2ZW50X2RldiAqZGV2ZnJlcV9ldmVudF9nZXRfZWRldl9ieV9waGFuZGxlKAogCQkJCQlzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpbmRleCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmcuaAppbmRleCA2NjUzM2UxLi5kYzY5ZGYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy5oCkBAIC03MTgsNyArNzE4LDcgQEAKICNkZWZpbmUgZG1hX21tYXBfd3JpdGVjb21iaW5lIGRtYV9tbWFwX3djCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19ORUVEX0RNQV9NQVBfU1RBVEUKKyNpZiBkZWZpbmVkKENPTkZJR19ORUVEX0RNQV9NQVBfU1RBVEUpIHx8IGRlZmluZWQoQ09ORklHX0RNQV9BUElfREVCVUcpCiAjZGVmaW5lIERFRklORV9ETUFfVU5NQVBfQUREUihBRERSX05BTUUpICAgICAgICBkbWFfYWRkcl90IEFERFJfTkFNRQogI2RlZmluZSBERUZJTkVfRE1BX1VOTUFQX0xFTihMRU5fTkFNRSkgICAgICAgICAgX191MzIgTEVOX05BTUUKICNkZWZpbmUgZG1hX3VubWFwX2FkZHIoUFRSLCBBRERSX05BTUUpICAgICAgICAgICAoKFBUUiktPkFERFJfTkFNRSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1hL2R3LmggYi9pbmNsdWRlL2xpbnV4L2RtYS9kdy5oCmluZGV4IGYyZTUzOGEuLmNjZmQwYzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1hL2R3LmgKKysrIGIvaW5jbHVkZS9saW51eC9kbWEvZHcuaApAQCAtNDAsOCArNDAsMTMgQEAKIH07CiAKIC8qIEV4cG9ydCB0byB0aGUgcGxhdGZvcm0gZHJpdmVycyAqLworI2lmIElTX0VOQUJMRUQoQ09ORklHX0RXX0RNQUNfQ09SRSkKIGludCBkd19kbWFfcHJvYmUoc3RydWN0IGR3X2RtYV9jaGlwICpjaGlwKTsKIGludCBkd19kbWFfcmVtb3ZlKHN0cnVjdCBkd19kbWFfY2hpcCAqY2hpcCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZHdfZG1hX3Byb2JlKHN0cnVjdCBkd19kbWFfY2hpcCAqY2hpcCkgeyByZXR1cm4gLUVOT0RFVjsgfQorc3RhdGljIGlubGluZSBpbnQgZHdfZG1hX3JlbW92ZShzdHJ1Y3QgZHdfZG1hX2NoaXAgKmNoaXApIHsgcmV0dXJuIDA7IH0KKyNlbmRpZiAvKiBDT05GSUdfRFdfRE1BQ19DT1JFICovCiAKIC8qIERNQSBBUEkgZXh0ZW5zaW9ucyAqLwogc3RydWN0IGR3X2Rlc2M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYS9oc3UuaCBiL2luY2x1ZGUvbGludXgvZG1hL2hzdS5oCmluZGV4IGFhZmY2OGUuLjE5N2VlYzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1hL2hzdS5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1hL2hzdS5oCkBAIC00MSw4ICs0MSw3IEBACiAvKiBFeHBvcnQgdG8gdGhlIGludGVybmFsIHVzZXJzICovCiBpbnQgaHN1X2RtYV9nZXRfc3RhdHVzKHN0cnVjdCBoc3VfZG1hX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHNob3J0IG5yLAogCQkgICAgICAgdTMyICpzdGF0dXMpOwotaXJxcmV0dXJuX3QgaHN1X2RtYV9kb19pcnEoc3RydWN0IGhzdV9kbWFfY2hpcCAqY2hpcCwgdW5zaWduZWQgc2hvcnQgbnIsCi0JCQkgICB1MzIgc3RhdHVzKTsKK2ludCBoc3VfZG1hX2RvX2lycShzdHJ1Y3QgaHN1X2RtYV9jaGlwICpjaGlwLCB1bnNpZ25lZCBzaG9ydCBuciwgdTMyIHN0YXR1cyk7CiAKIC8qIEV4cG9ydCB0byB0aGUgcGxhdGZvcm0gZHJpdmVycyAqLwogaW50IGhzdV9kbWFfcHJvYmUoc3RydWN0IGhzdV9kbWFfY2hpcCAqY2hpcCk7CkBAIC01MywxMCArNTIsMTAgQEAKIHsKIAlyZXR1cm4gMDsKIH0KLXN0YXRpYyBpbmxpbmUgaXJxcmV0dXJuX3QgaHN1X2RtYV9kb19pcnEoc3RydWN0IGhzdV9kbWFfY2hpcCAqY2hpcCwKLQkJCQkJIHVuc2lnbmVkIHNob3J0IG5yLCB1MzIgc3RhdHVzKQorc3RhdGljIGlubGluZSBpbnQgaHN1X2RtYV9kb19pcnEoc3RydWN0IGhzdV9kbWFfY2hpcCAqY2hpcCwgdW5zaWduZWQgc2hvcnQgbnIsCisJCQkJIHUzMiBzdGF0dXMpCiB7Ci0JcmV0dXJuIElSUV9OT05FOworCXJldHVybiAwOwogfQogc3RhdGljIGlubGluZSBpbnQgaHN1X2RtYV9wcm9iZShzdHJ1Y3QgaHN1X2RtYV9jaGlwICpjaGlwKSB7IHJldHVybiAtRU5PREVWOyB9CiBzdGF0aWMgaW5saW5lIGludCBoc3VfZG1hX3JlbW92ZShzdHJ1Y3QgaHN1X2RtYV9jaGlwICpjaGlwKSB7IHJldHVybiAwOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VmaS5oIGIvaW5jbHVkZS9saW51eC9lZmkuaAppbmRleCA3ZjVhNTgyLi4yZDA4OTQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VmaS5oCisrKyBiL2luY2x1ZGUvbGludXgvZWZpLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KICNpbmNsdWRlIDxsaW51eC9wc3RvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5nZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KICNpbmNsdWRlIDxsaW51eC9zY3JlZW5faW5mby5oPgpAQCAtMzcsNiArMzgsNyBAQAogI2RlZmluZSBFRklfV1JJVEVfUFJPVEVDVEVECSggOCB8ICgxVUwgPDwgKEJJVFNfUEVSX0xPTkctMSkpKQogI2RlZmluZSBFRklfT1VUX09GX1JFU09VUkNFUwkoIDkgfCAoMVVMIDw8IChCSVRTX1BFUl9MT05HLTEpKSkKICNkZWZpbmUgRUZJX05PVF9GT1VORAkJKDE0IHwgKDFVTCA8PCAoQklUU19QRVJfTE9ORy0xKSkpCisjZGVmaW5lIEVGSV9BQk9SVEVECQkoMjEgfCAoMVVMIDw8IChCSVRTX1BFUl9MT05HLTEpKSkKICNkZWZpbmUgRUZJX1NFQ1VSSVRZX1ZJT0xBVElPTgkoMjYgfCAoMVVMIDw8IChCSVRTX1BFUl9MT05HLTEpKSkKIAogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGVmaV9zdGF0dXNfdDsKQEAgLTExOCw2ICsxMjAsMTUgQEAKIAl1MzIgaW1hZ2VzaXplOwogfSBlZmlfY2Fwc3VsZV9oZWFkZXJfdDsKIAorc3RydWN0IGVmaV9ib290X21lbW1hcCB7CisJZWZpX21lbW9yeV9kZXNjX3QJKiptYXA7CisJdW5zaWduZWQgbG9uZwkJKm1hcF9zaXplOworCXVuc2lnbmVkIGxvbmcJCSpkZXNjX3NpemU7CisJdTMyCQkJKmRlc2NfdmVyOworCXVuc2lnbmVkIGxvbmcJCSprZXlfcHRyOworCXVuc2lnbmVkIGxvbmcJCSpidWZmX3NpemU7Cit9OworCiAvKgogICogRUZJIGNhcHN1bGUgZmxhZ3MKICAqLwpAQCAtNjY5LDYgKzY4MCwxOCBAQAogCXVuc2lnbmVkIGxvbmcgdGFibGVzOwogfSBlZmlfc3lzdGVtX3RhYmxlX3Q7CiAKKy8qCisgKiBBcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgc3RydWN0dXJlIGZvciBkZXNjcmliaW5nIGEgbWVtb3J5IG1hcCBmb3IgdGhlCisgKiBiZW5lZml0IG9mIGVmaV9tZW1tYXBfaW5pdF9lYXJseSgpLCBzYXZpbmcgdXMgdGhlIG5lZWQgdG8gcGFzcyBmb3VyCisgKiBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3QgZWZpX21lbW9yeV9tYXBfZGF0YSB7CisJcGh5c19hZGRyX3QgcGh5c19tYXA7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGxvbmcgZGVzY192ZXJzaW9uOworCXVuc2lnbmVkIGxvbmcgZGVzY19zaXplOworfTsKKwogc3RydWN0IGVmaV9tZW1vcnlfbWFwIHsKIAlwaHlzX2FkZHJfdCBwaHlzX21hcDsKIAl2b2lkICptYXA7CkBAIC02NzYsNiArNjk5LDEyIEBACiAJaW50IG5yX21hcDsKIAl1bnNpZ25lZCBsb25nIGRlc2NfdmVyc2lvbjsKIAl1bnNpZ25lZCBsb25nIGRlc2Nfc2l6ZTsKKwlib29sIGxhdGU7Cit9OworCitzdHJ1Y3QgZWZpX21lbV9yYW5nZSB7CisJc3RydWN0IHJhbmdlIHJhbmdlOworCXU2NCBhdHRyaWJ1dGU7CiB9OwogCiBzdHJ1Y3QgZWZpX2ZkdF9wYXJhbXMgewpAQCAtOTAwLDYgKzkyOSwxNiBAQAogfQogI2VuZGlmCiBleHRlcm4gdm9pZCBfX2lvbWVtICplZmlfbG9va3VwX21hcHBlZF9hZGRyKHU2NCBwaHlzX2FkZHIpOworCitleHRlcm4gaW50IF9faW5pdCBlZmlfbWVtbWFwX2luaXRfZWFybHkoc3RydWN0IGVmaV9tZW1vcnlfbWFwX2RhdGEgKmRhdGEpOworZXh0ZXJuIGludCBfX2luaXQgZWZpX21lbW1hcF9pbml0X2xhdGUocGh5c19hZGRyX3QgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiB2b2lkIF9faW5pdCBlZmlfbWVtbWFwX3VubWFwKHZvaWQpOworZXh0ZXJuIGludCBfX2luaXQgZWZpX21lbW1hcF9pbnN0YWxsKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGludCBucl9tYXApOworZXh0ZXJuIGludCBfX2luaXQgZWZpX21lbW1hcF9zcGxpdF9jb3VudChlZmlfbWVtb3J5X2Rlc2NfdCAqbWQsCisJCQkJCSBzdHJ1Y3QgcmFuZ2UgKnJhbmdlKTsKK2V4dGVybiB2b2lkIF9faW5pdCBlZmlfbWVtbWFwX2luc2VydChzdHJ1Y3QgZWZpX21lbW9yeV9tYXAgKm9sZF9tZW1tYXAsCisJCQkJICAgICB2b2lkICpidWYsIHN0cnVjdCBlZmlfbWVtX3JhbmdlICptZW0pOworCiBleHRlcm4gaW50IGVmaV9jb25maWdfaW5pdChlZmlfY29uZmlnX3RhYmxlX3R5cGVfdCAqYXJjaF90YWJsZXMpOwogI2lmZGVmIENPTkZJR19FRklfRVNSVAogZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9lc3J0X2luaXQodm9pZCk7CkBAIC05MTUsNiArOTU0LDcgQEAKIGV4dGVybiBpbnQgX19pbml0IGVmaV91YXJ0X2NvbnNvbGVfb25seSAodm9pZCk7CiBleHRlcm4gdTY0IGVmaV9tZW1fZGVzY19lbmQoZWZpX21lbW9yeV9kZXNjX3QgKm1kKTsKIGV4dGVybiBpbnQgZWZpX21lbV9kZXNjX2xvb2t1cCh1NjQgcGh5c19hZGRyLCBlZmlfbWVtb3J5X2Rlc2NfdCAqb3V0X21kKTsKK2V4dGVybiB2b2lkIGVmaV9tZW1fcmVzZXJ2ZShwaHlzX2FkZHJfdCBhZGRyLCB1NjQgc2l6ZSk7CiBleHRlcm4gdm9pZCBlZmlfaW5pdGlhbGl6ZV9pb21lbV9yZXNvdXJjZXMoc3RydWN0IHJlc291cmNlICpjb2RlX3Jlc291cmNlLAogCQlzdHJ1Y3QgcmVzb3VyY2UgKmRhdGFfcmVzb3VyY2UsIHN0cnVjdCByZXNvdXJjZSAqYnNzX3Jlc291cmNlKTsKIGV4dGVybiB2b2lkIGVmaV9yZXNlcnZlX2Jvb3Rfc2VydmljZXModm9pZCk7CkBAIC05NDYsNyArOTg2LDcgQEAKIC8qIEl0ZXJhdGUgdGhyb3VnaCBhbiBlZmlfbWVtb3J5X21hcCAqLwogI2RlZmluZSBmb3JfZWFjaF9lZmlfbWVtb3J5X2Rlc2NfaW5fbWFwKG0sIG1kKQkJCQkgICBcCiAJZm9yICgobWQpID0gKG0pLT5tYXA7CQkJCQkJICAgXAotCSAgICAgKCh2b2lkICopKG1kKSArIChtKS0+ZGVzY19zaXplKSA8PSAobSktPm1hcF9lbmQ7CQkgICBcCisJICAgICAobWQpICYmICgodm9pZCAqKShtZCkgKyAobSktPmRlc2Nfc2l6ZSkgPD0gKG0pLT5tYXBfZW5kOwkgICBcCiAJICAgICAobWQpID0gKHZvaWQgKikobWQpICsgKG0pLT5kZXNjX3NpemUpCiAKIC8qKgpAQCAtMTEyNywxMiArMTE2Nyw2IEBACiB9OwogCiBzdHJ1Y3QgZWZpdmFycyB7Ci0JLyoKLQkgKiAtPmxvY2sgcHJvdGVjdHMgdHdvIHRoaW5nczoKLQkgKiAxKSBlZml2YXJmc19saXN0IGFuZCBlZml2YXJzX3N5c2ZzX2xpc3QKLQkgKiAyKSAtPm9wcyBjYWxscwotCSAqLwotCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3Qga3NldCAqa3NldDsKIAlzdHJ1Y3Qga29iamVjdCAqa29iamVjdDsKIAljb25zdCBzdHJ1Y3QgZWZpdmFyX29wZXJhdGlvbnMgKm9wczsKQEAgLTEyNzMsOCArMTMwNyw4IEBACiBpbnQgZWZpdmFyX2luaXQoaW50ICgqZnVuYykoZWZpX2NoYXIxNl90ICosIGVmaV9ndWlkX3QsIHVuc2lnbmVkIGxvbmcsIHZvaWQgKiksCiAJCXZvaWQgKmRhdGEsIGJvb2wgZHVwbGljYXRlcywgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7CiAKLXZvaWQgZWZpdmFyX2VudHJ5X2FkZChzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7Ci12b2lkIGVmaXZhcl9lbnRyeV9yZW1vdmUoc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnkpOworaW50IGVmaXZhcl9lbnRyeV9hZGQoc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnksIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOworaW50IGVmaXZhcl9lbnRyeV9yZW1vdmUoc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnkpOwogCiBpbnQgX19lZml2YXJfZW50cnlfZGVsZXRlKHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5KTsKIGludCBlZml2YXJfZW50cnlfZGVsZXRlKHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5KTsKQEAgLTEyOTEsNyArMTMyNSw3IEBACiBpbnQgZWZpdmFyX2VudHJ5X3NldF9zYWZlKGVmaV9jaGFyMTZfdCAqbmFtZSwgZWZpX2d1aWRfdCB2ZW5kb3IsIHUzMiBhdHRyaWJ1dGVzLAogCQkJICBib29sIGJsb2NrLCB1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKmRhdGEpOwogCi12b2lkIGVmaXZhcl9lbnRyeV9pdGVyX2JlZ2luKHZvaWQpOworaW50IGVmaXZhcl9lbnRyeV9pdGVyX2JlZ2luKHZvaWQpOwogdm9pZCBlZml2YXJfZW50cnlfaXRlcl9lbmQodm9pZCk7CiAKIGludCBfX2VmaXZhcl9lbnRyeV9pdGVyKGludCAoKmZ1bmMpKHN0cnVjdCBlZml2YXJfZW50cnkgKiwgdm9pZCAqKSwKQEAgLTEzMjcsNyArMTM2MSw2IEBACiAKICNpZmRlZiBDT05GSUdfRUZJX1JVTlRJTUVfTUFQCiBpbnQgZWZpX3J1bnRpbWVfbWFwX2luaXQoc3RydWN0IGtvYmplY3QgKik7Ci12b2lkIGVmaV9ydW50aW1lX21hcF9zZXR1cCh2b2lkICosIGludCwgdTMyKTsKIGludCBlZmlfZ2V0X3J1bnRpbWVfbWFwX3NpemUodm9pZCk7CiBpbnQgZWZpX2dldF9ydW50aW1lX21hcF9kZXNjX3NpemUodm9pZCk7CiBpbnQgZWZpX3J1bnRpbWVfbWFwX2NvcHkodm9pZCAqYnVmLCBzaXplX3QgYnVmc3opOwpAQCAtMTMzNyw5ICsxMzcwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1lZmlfcnVudGltZV9tYXBfc2V0dXAodm9pZCAqbWFwLCBpbnQgbnJfZW50cmllcywgdTMyIGRlc2Nfc2l6ZSkge30KLQogc3RhdGljIGlubGluZSBpbnQgZWZpX2dldF9ydW50aW1lX21hcF9zaXplKHZvaWQpCiB7CiAJcmV0dXJuIDA7CkBAIC0xMzcxLDExICsxNDAxLDcgQEAKIAkJCSAgZWZpX2xvYWRlZF9pbWFnZV90ICppbWFnZSwgaW50ICpjbWRfbGluZV9sZW4pOwogCiBlZmlfc3RhdHVzX3QgZWZpX2dldF9tZW1vcnlfbWFwKGVmaV9zeXN0ZW1fdGFibGVfdCAqc3lzX3RhYmxlX2FyZywKLQkJCQllZmlfbWVtb3J5X2Rlc2NfdCAqKm1hcCwKLQkJCQl1bnNpZ25lZCBsb25nICptYXBfc2l6ZSwKLQkJCQl1bnNpZ25lZCBsb25nICpkZXNjX3NpemUsCi0JCQkJdTMyICpkZXNjX3ZlciwKLQkJCQl1bnNpZ25lZCBsb25nICprZXlfcHRyKTsKKwkJCQlzdHJ1Y3QgZWZpX2Jvb3RfbWVtbWFwICptYXApOwogCiBlZmlfc3RhdHVzX3QgZWZpX2xvd19hbGxvYyhlZmlfc3lzdGVtX3RhYmxlX3QgKnN5c190YWJsZV9hcmcsCiAJCQkgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24sCkBAIC0xNDU3LDQgKzE0ODMsMTQgQEAKIAlhcmNoX2VmaV9jYWxsX3ZpcnRfdGVhcmRvd24oKTsJCQkJCVwKIH0pCiAKK3R5cGVkZWYgZWZpX3N0YXR1c190ICgqZWZpX2V4aXRfYm9vdF9tYXBfcHJvY2Vzc2luZykoCisJZWZpX3N5c3RlbV90YWJsZV90ICpzeXNfdGFibGVfYXJnLAorCXN0cnVjdCBlZmlfYm9vdF9tZW1tYXAgKm1hcCwKKwl2b2lkICpwcml2KTsKKworZWZpX3N0YXR1c190IGVmaV9leGl0X2Jvb3Rfc2VydmljZXMoZWZpX3N5c3RlbV90YWJsZV90ICpzeXNfdGFibGUsCisJCQkJICAgIHZvaWQgKmhhbmRsZSwKKwkJCQkgICAgc3RydWN0IGVmaV9ib290X21lbW1hcCAqbWFwLAorCQkJCSAgICB2b2lkICpwcml2LAorCQkJCSAgICBlZmlfZXhpdF9ib290X21hcF9wcm9jZXNzaW5nIHByaXZfZnVuYyk7CiAjZW5kaWYgLyogX0xJTlVYX0VGSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dGNvbi5oIGIvaW5jbHVkZS9saW51eC9leHRjb24uaAppbmRleCA2MTAwNDQxLi5iODcxYzBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dGNvbi5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0Y29uLmgKQEAgLTI5LDYgKzI5LDE1IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAKIC8qCisgKiBEZWZpbmUgdGhlIHR5cGUgb2Ygc3VwcG9ydGVkIGV4dGVybmFsIGNvbm5lY3RvcnMKKyAqLworI2RlZmluZSBFWFRDT05fVFlQRV9VU0IJCUJJVCgwKQkvKiBVU0IgY29ubmVjdG9yICovCisjZGVmaW5lIEVYVENPTl9UWVBFX0NIRwkJQklUKDEpCS8qIENoYXJnZXIgY29ubmVjdG9yICovCisjZGVmaW5lIEVYVENPTl9UWVBFX0pBQ0sJQklUKDIpCS8qIEphY2sgY29ubmVjdG9yICovCisjZGVmaW5lIEVYVENPTl9UWVBFX0RJU1AJQklUKDMpCS8qIERpc3BsYXkgY29ubmVjdG9yICovCisjZGVmaW5lIEVYVENPTl9UWVBFX01JU0MJQklUKDQpCS8qIE1pc2NlbGxhbmVvdXMgY29ubmVjdG9yICovCisKKy8qCiAgKiBEZWZpbmUgdGhlIHVuaXF1ZSBpZCBvZiBzdXBwb3J0ZWQgZXh0ZXJuYWwgY29ubmVjdG9ycwogICovCiAjZGVmaW5lIEVYVENPTl9OT05FCQkwCkBAIC00NCw2ICs1Myw3IEBACiAjZGVmaW5lIEVYVENPTl9DSEdfVVNCX0FDQQk4CS8qIEFjY2Vzc29yeSBDaGFyZ2VyIEFkYXB0ZXIgKi8KICNkZWZpbmUgRVhUQ09OX0NIR19VU0JfRkFTVAk5CiAjZGVmaW5lIEVYVENPTl9DSEdfVVNCX1NMT1cJMTAKKyNkZWZpbmUgRVhUQ09OX0NIR19XUFQJCTExCS8qIFdpcmVsZXNzIFBvd2VyIFRyYW5zZmVyICovCiAKIC8qIEphY2sgZXh0ZXJuYWwgY29ubmVjdG9yICovCiAjZGVmaW5lIEVYVENPTl9KQUNLX01JQ1JPUEhPTkUJMjAKQEAgLTYwLDYgKzcwLDggQEAKICNkZWZpbmUgRVhUQ09OX0RJU1BfTUhMCQk0MQkvKiBNb2JpbGUgSGlnaC1EZWZpbml0aW9uIExpbmsgKi8KICNkZWZpbmUgRVhUQ09OX0RJU1BfRFZJCQk0MgkvKiBEaWdpdGFsIFZpc3VhbCBJbnRlcmZhY2UgKi8KICNkZWZpbmUgRVhUQ09OX0RJU1BfVkdBCQk0MwkvKiBWaWRlbyBHcmFwaGljcyBBcnJheSAqLworI2RlZmluZSBFWFRDT05fRElTUF9EUAkJNDQJLyogRGlzcGxheSBQb3J0ICovCisjZGVmaW5lIEVYVENPTl9ESVNQX0hNRAkJNDUJLyogSGVhZC1Nb3VudGVkIERpc3BsYXkgKi8KIAogLyogTWlzY2VsbGFuZW91cyBleHRlcm5hbCBjb25uZWN0b3IgKi8KICNkZWZpbmUgRVhUQ09OX0RPQ0sJCTYwCkBAIC02OCw2ICs4MCw4NSBAQAogCiAjZGVmaW5lIEVYVENPTl9OVU0JCTYzCiAKKy8qCisgKiBEZWZpbmUgdGhlIHByb3BlcnR5IG9mIHN1cHBvcnRlZCBleHRlcm5hbCBjb25uZWN0b3JzLgorICoKKyAqIFdoZW4gYWRkaW5nIHRoZSBuZXcgZXh0Y29uIHByb3BlcnR5LCB0aGV5ICptdXN0KiBoYXZlCisgKiB0aGUgdHlwZS92YWx1ZS9kZWZhdWx0IGluZm9ybWF0aW9uLiBBbHNvLCB5b3UgKmhhdmUgdG8qCisgKiBtb2RpZnkgdGhlIEVYVENPTl9QUk9QX1t0eXBlXV9TVEFSVC9FTkQgZGVmaW5pdGlvbnMKKyAqIHdoaWNoIG1lYW4gdGhlIHJhbmdlIG9mIHRoZSBzdXBwb3J0ZWQgcHJvcGVydGllcworICogZm9yIGVhY2ggZXh0Y29uIHR5cGUuCisgKgorICogVGhlIG5hbWluZyBzdHlsZSBvZiBwcm9wZXJ0eQorICogOiBFWFRDT05fUFJPUF9bdHlwZV1fW3Byb3BlcnR5IG5hbWVdCisgKgorICogRVhUQ09OX1BST1BfVVNCX1twcm9wZXJ0eSBuYW1lXQk6IFVTQiBwcm9wZXJ0eQorICogRVhUQ09OX1BST1BfQ0hHX1twcm9wZXJ0eSBuYW1lXQk6IENoYXJnZXIgcHJvcGVydHkKKyAqIEVYVENPTl9QUk9QX0pBQ0tfW3Byb3BlcnR5IG5hbWVdCTogSmFjayBwcm9wZXJ0eQorICogRVhUQ09OX1BST1BfRElTUF9bcHJvcGVydHkgbmFtZV0JOiBEaXNwbGF5IHByb3BlcnR5CisgKi8KKworLyoKKyAqIFByb3BlcnRpZXMgb2YgRVhUQ09OX1RZUEVfVVNCLgorICoKKyAqIC0gRVhUQ09OX1BST1BfVVNCX1ZCVVMKKyAqIEB0eXBlOglpbnRlZ2VyIChpbnR2YWwpCisgKiBAdmFsdWU6CTAgKGxvdykgb3IgMSAoaGlnaCkKKyAqIEBkZWZhdWx0OgkwIChsb3cpCisgKiAtIEVYVENPTl9QUk9QX1VTQl9UWVBFQ19QT0xBUklUWQorICogQHR5cGU6CWludGVnZXIgKGludHZhbCkKKyAqIEB2YWx1ZToJMCAobm9ybWFsKSBvciAxIChmbGlwKQorICogQGRlZmF1bHQ6CTAgKG5vcm1hbCkKKyAqIC0gRVhUQ09OX1BST1BfVVNCX1NTIChTdXBlclNwZWVkKQorICogQHR5cGU6ICAgICAgIGludGVnZXIgKGludHZhbCkKKyAqIEB2YWx1ZTogICAgICAwIChVU0IvVVNCMikgb3IgMSAoVVNCMykKKyAqIEBkZWZhdWx0OiAgICAwIChVU0IvVVNCMikKKyAqCisgKi8KKyNkZWZpbmUgRVhUQ09OX1BST1BfVVNCX1ZCVVMJCTAKKyNkZWZpbmUgRVhUQ09OX1BST1BfVVNCX1RZUEVDX1BPTEFSSVRZCTEKKyNkZWZpbmUgRVhUQ09OX1BST1BfVVNCX1NTCQkyCisKKyNkZWZpbmUgRVhUQ09OX1BST1BfVVNCX01JTgkJMAorI2RlZmluZSBFWFRDT05fUFJPUF9VU0JfTUFYCQkyCisjZGVmaW5lIEVYVENPTl9QUk9QX1VTQl9DTlQJKEVYVENPTl9QUk9QX1VTQl9NQVggLSBFWFRDT05fUFJPUF9VU0JfTUlOICsgMSkKKworLyogUHJvcGVydGllcyBvZiBFWFRDT05fVFlQRV9DSEcuICovCisjZGVmaW5lIEVYVENPTl9QUk9QX0NIR19NSU4JCTUwCisjZGVmaW5lIEVYVENPTl9QUk9QX0NIR19NQVgJCTUwCisjZGVmaW5lIEVYVENPTl9QUk9QX0NIR19DTlQJKEVYVENPTl9QUk9QX0NIR19NQVggLSBFWFRDT05fUFJPUF9DSEdfTUlOICsgMSkKKworLyogUHJvcGVydGllcyBvZiBFWFRDT05fVFlQRV9KQUNLLiAqLworI2RlZmluZSBFWFRDT05fUFJPUF9KQUNLX01JTgkJMTAwCisjZGVmaW5lIEVYVENPTl9QUk9QX0pBQ0tfTUFYCQkxMDAKKyNkZWZpbmUgRVhUQ09OX1BST1BfSkFDS19DTlQgKEVYVENPTl9QUk9QX0pBQ0tfTUFYIC0gRVhUQ09OX1BST1BfSkFDS19NSU4gKyAxKQorCisvKgorICogUHJvcGVydGllcyBvZiBFWFRDT05fVFlQRV9ESVNQLgorICoKKyAqIC0gRVhUQ09OX1BST1BfRElTUF9IUEQgKEhvdCBQbHVnIERldGVjdCkKKyAqIEB0eXBlOiAgICAgICBpbnRlZ2VyIChpbnR2YWwpCisgKiBAdmFsdWU6ICAgICAgMCAobm8gaHBkKSBvciAxIChocGQpCisgKiBAZGVmYXVsdDogICAgMCAobm8gaHBkKQorICoKKyAqLworI2RlZmluZSBFWFRDT05fUFJPUF9ESVNQX0hQRAkJMTUwCisKKy8qIFByb3BlcnRpZXMgb2YgRVhUQ09OX1RZUEVfRElTUC4gKi8KKyNkZWZpbmUgRVhUQ09OX1BST1BfRElTUF9NSU4JCTE1MAorI2RlZmluZSBFWFRDT05fUFJPUF9ESVNQX01BWAkJMTUxCisjZGVmaW5lIEVYVENPTl9QUk9QX0RJU1BfQ05UIChFWFRDT05fUFJPUF9ESVNQX01BWCAtIEVYVENPTl9QUk9QX0RJU1BfTUlOICsgMSkKKworLyoKKyAqIERlZmluZSB0aGUgdHlwZSBvZiBwcm9wZXJ0eSdzIHZhbHVlLgorICoKKyAqIERlZmluZSB0aGUgcHJvcGVydHkncyB2YWx1ZSBhcyB1bmlvbiB0eXBlLiBCZWNhdXNlIGVhY2ggcHJvcGVydHkKKyAqIHdvdWxkIG5lZWQgdGhlIGRpZmZlcmVudCBkYXRhIHR5cGUgdG8gc3RvcmUgaXQuCisgKi8KK3VuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSB7CisJaW50IGludHZhbDsJLyogdHlwZSA6IGludGVnZXIgKGludHZhbCkgKi8KK307CisKIHN0cnVjdCBleHRjb25fY2FibGU7CiAKIC8qKgpAQCAtMTUwLDI2ICsyNDEsNDIgQEAKIGV4dGVybiB2b2lkIGRldm1fZXh0Y29uX2Rldl9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYpOwogCiAvKgotICogZ2V0L3NldC91cGRhdGVfc3RhdGUgYWNjZXNzIHRoZSAzMmIgZW5jb2RlZCBzdGF0ZSB2YWx1ZSwgd2hpY2ggcmVwcmVzZW50cwotICogc3RhdGVzIG9mIGFsbCBwb3NzaWJsZSBjYWJsZXMgb2YgdGhlIG11bHRpc3RhdGUgcG9ydC4gRm9yIGV4YW1wbGUsIGlmIG9uZQotICogY2FsbHMgZXh0Y29uX3NldF9zdGF0ZShlZGV2LCAweDcpLCBpdCBtYXkgbWVhbiB0aGF0IGFsbCB0aGUgdGhyZWUgY2FibGVzCi0gKiBhcmUgYXR0YWNoZWQgdG8gdGhlIHBvcnQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdTMyIGV4dGNvbl9nZXRfc3RhdGUoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYpCi17Ci0JcmV0dXJuIGVkZXYtPnN0YXRlOwotfQotCi1leHRlcm4gaW50IGV4dGNvbl9zZXRfc3RhdGUoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHUzMiBzdGF0ZSk7Ci1leHRlcm4gaW50IGV4dGNvbl91cGRhdGVfc3RhdGUoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHUzMiBtYXNrLCB1MzIgc3RhdGUpOwotCi0vKgotICogZ2V0L3NldF9jYWJsZV9zdGF0ZSBhY2Nlc3MgZWFjaCBiaXQgb2YgdGhlIDMyYiBlbmNvZGVkIHN0YXRlIHZhbHVlLgorICogZ2V0L3NldF9zdGF0ZSBhY2Nlc3MgZWFjaCBiaXQgb2YgdGhlIDMyYiBlbmNvZGVkIHN0YXRlIHZhbHVlLgogICogVGhleSBhcmUgdXNlZCB0byBhY2Nlc3MgdGhlIHN0YXR1cyBvZiBlYWNoIGNhYmxlIGJhc2VkIG9uIHRoZSBjYWJsZSBpZC4KICAqLwotZXh0ZXJuIGludCBleHRjb25fZ2V0X2NhYmxlX3N0YXRlXyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkKTsKLWV4dGVybiBpbnQgZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCwKK2V4dGVybiBpbnQgZXh0Y29uX2dldF9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkKTsKK2V4dGVybiBpbnQgZXh0Y29uX3NldF9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAogCQkJCSAgIGJvb2wgY2FibGVfc3RhdGUpOworZXh0ZXJuIGludCBleHRjb25fc2V0X3N0YXRlX3N5bmMoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCwKKwkJCQlib29sIGNhYmxlX3N0YXRlKTsKKy8qCisgKiBTeW5jaHJvbml6ZSB0aGUgc3RhdGUgYW5kIHByb3BlcnR5IGRhdGEgZm9yIGEgc3BlY2lmaWMgZXh0ZXJuYWwgY29ubmVjdG9yLgorICovCitleHRlcm4gaW50IGV4dGNvbl9zeW5jKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQpOworCisvKgorICogZ2V0L3NldF9wcm9wZXJ0eSBhY2Nlc3MgdGhlIHByb3BlcnR5IHZhbHVlIG9mIGVhY2ggZXh0ZXJuYWwgY29ubmVjdG9yLgorICogVGhleSBhcmUgdXNlZCB0byBhY2Nlc3MgdGhlIHByb3BlcnR5IG9mIGVhY2ggY2FibGUgYmFzZWQgb24gdGhlIHByb3BlcnR5IGlkLgorICovCitleHRlcm4gaW50IGV4dGNvbl9nZXRfcHJvcGVydHkoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCwKKwkJCQl1bnNpZ25lZCBpbnQgcHJvcCwKKwkJCQl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUgKnByb3BfdmFsKTsKK2V4dGVybiBpbnQgZXh0Y29uX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCXVuc2lnbmVkIGludCBwcm9wLAorCQkJCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSBwcm9wX3ZhbCk7CitleHRlcm4gaW50IGV4dGNvbl9zZXRfcHJvcGVydHlfc3luYyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCXVuc2lnbmVkIGludCBwcm9wLAorCQkJCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSBwcm9wX3ZhbCk7CisKKy8qCisgKiBnZXQvc2V0X3Byb3BlcnR5X2NhcGFiaWxpdHkgc2V0IHRoZSBjYXBhYmlsaXR5IG9mIHRoZSBwcm9wZXJ0eSBmb3IgZWFjaAorICogZXh0ZXJuYWwgY29ubmVjdG9yLiBUaGV5IGFyZSB1c2VkIHRvIHNldCB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgcHJvcGVydHkKKyAqIG9mIGVhY2ggZXh0ZXJuYWwgY29ubmVjdG9yIGJhc2VkIG9uIHRoZSBpZCBhbmQgcHJvcGVydHkuCisgKi8KK2V4dGVybiBpbnQgZXh0Y29uX2dldF9wcm9wZXJ0eV9jYXBhYmlsaXR5KHN0cnVjdCBleHRjb25fZGV2ICplZGV2LAorCQkJCXVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHByb3ApOworZXh0ZXJuIGludCBleHRjb25fc2V0X3Byb3BlcnR5X2NhcGFiaWxpdHkoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsCisJCQkJdW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBpbnQgcHJvcCk7CiAKIC8qCiAgKiBGb2xsb3dpbmcgQVBJcyBhcmUgdG8gbW9uaXRvciBldmVyeSBhY3Rpb24gb2YgYSBub3RpZmllci4KQEAgLTIzMiwzMCArMzM5LDU3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXZtX2V4dGNvbl9kZXZfZnJlZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldikgeyB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIGV4dGNvbl9nZXRfc3RhdGUoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYpCisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dGNvbl9nZXRfc3RhdGUoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCkKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZXh0Y29uX3NldF9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdTMyIHN0YXRlKQorc3RhdGljIGlubGluZSBpbnQgZXh0Y29uX3NldF9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCWJvb2wgY2FibGVfc3RhdGUpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGV4dGNvbl91cGRhdGVfc3RhdGUoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHUzMiBtYXNrLAotCQkJCSAgICAgICB1MzIgc3RhdGUpCitzdGF0aWMgaW5saW5lIGludCBleHRjb25fc2V0X3N0YXRlX3N5bmMoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCwKKwkJCQlib29sIGNhYmxlX3N0YXRlKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBleHRjb25fZ2V0X2NhYmxlX3N0YXRlXyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwKLQkJCQkJICB1bnNpZ25lZCBpbnQgaWQpCitzdGF0aWMgaW5saW5lIGludCBleHRjb25fc3luYyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwKLQkJCQkJICB1bnNpZ25lZCBpbnQgaWQsIGJvb2wgY2FibGVfc3RhdGUpCitzdGF0aWMgaW5saW5lIGludCBleHRjb25fZ2V0X3Byb3BlcnR5KHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsCisJCQkJCXVuc2lnbmVkIGludCBwcm9wLAorCQkJCQl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUgKnByb3BfdmFsKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgZXh0Y29uX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCQl1bnNpZ25lZCBpbnQgcHJvcCwKKwkJCQkJdW5pb24gZXh0Y29uX3Byb3BlcnR5X3ZhbHVlIHByb3BfdmFsKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHRjb25fc2V0X3Byb3BlcnR5X3N5bmMoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsCisJCQkJCXVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHByb3AsCisJCQkJCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSBwcm9wX3ZhbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZXh0Y29uX2dldF9wcm9wZXJ0eV9jYXBhYmlsaXR5KHN0cnVjdCBleHRjb25fZGV2ICplZGV2LAorCQkJCQl1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBwcm9wKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHRjb25fc2V0X3Byb3BlcnR5X2NhcGFiaWxpdHkoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsCisJCQkJCXVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHByb3ApCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMjAsNCArNDU0LDE1IEBACiB7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dGNvbl9nZXRfY2FibGVfc3RhdGVfKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQpCit7CisJcmV0dXJuIGV4dGNvbl9nZXRfc3RhdGUoZWRldiwgaWQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCSAgIGJvb2wgY2FibGVfc3RhdGUpCit7CisJcmV0dXJuIGV4dGNvbl9zZXRfc3RhdGVfc3luYyhlZGV2LCBpZCwgY2FibGVfc3RhdGUpOworfQogI2VuZGlmIC8qIF9fTElOVVhfRVhUQ09OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHRjb24vZXh0Y29uLWFkYy1qYWNrLmggYi9pbmNsdWRlL2xpbnV4L2V4dGNvbi9leHRjb24tYWRjLWphY2suaAppbmRleCBhYzg1ZjIwLi5hMGUwM2IxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dGNvbi9leHRjb24tYWRjLWphY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dGNvbi9leHRjb24tYWRjLWphY2suaApAQCAtMjAsOCArMjAsOCBAQAogCiAvKioKICAqIHN0cnVjdCBhZGNfamFja19jb25kIC0gY29uZGl0aW9uIHRvIHVzZSBhbiBleHRjb24gc3RhdGUKLSAqIEBzdGF0ZToJCXRoZSBjb3JyZXNwb25kaW5nIGV4dGNvbiBzdGF0ZSAoaWYgMCwgdGhpcyBzdHJ1Y3QKICAqCQkJZGVub3RlcyB0aGUgbGFzdCBhZGNfamFja19jb25kIGVsZW1lbnQgYW1vbmcgdGhlIGFycmF5KQorICogQGlkOgkJCXRoZSB1bmlxdWUgaWQgb2YgZWFjaCBleHRlcm5hbCBjb25uZWN0b3IKICAqIEBtaW5fYWRjOgkJbWluIGFkYyB2YWx1ZSBmb3IgdGhpcyBjb25kaXRpb24KICAqIEBtYXhfYWRjOgkJbWF4IGFkYyB2YWx1ZSBmb3IgdGhpcyBjb25kaXRpb24KICAqCkBAIC0zMyw3ICszMyw3IEBACiAgKiBiZWNhdXNlIHdoZW4gbm8gYWRjX2phY2tfY29uZCBpcyBtZXQsIHN0YXRlID0gMCBpcyBhdXRvbWF0aWNhbGx5IGNob3Nlbi4KICAqLwogc3RydWN0IGFkY19qYWNrX2NvbmQgewotCXUzMiBzdGF0ZTsJLyogZXh0Y29uIHN0YXRlIHZhbHVlLiAwIGlmIGludmFsaWQgKi8KKwl1bnNpZ25lZCBpbnQgaWQ7CiAJdTMyIG1pbl9hZGM7CiAJdTMyIG1heF9hZGM7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mZW5jZS5oIGIvaW5jbHVkZS9saW51eC9mZW5jZS5oCmluZGV4IDhjYzcxOWEuLjJhYzZmYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmVuY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZlbmNlLmgKQEAgLTQ5LDggKzQ5LDYgQEAKICAqIEB0aW1lc3RhbXA6IFRpbWVzdGFtcCB3aGVuIHRoZSBmZW5jZSB3YXMgc2lnbmFsZWQuCiAgKiBAc3RhdHVzOiBPcHRpb25hbCwgb25seSB2YWxpZCBpZiA8IDAsIG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nCiAgKiBmZW5jZV9zaWduYWwsIGluZGljYXRlcyB0aGF0IHRoZSBmZW5jZSBoYXMgY29tcGxldGVkIHdpdGggYW4gZXJyb3IuCi0gKiBAY2hpbGRfbGlzdDogbGlzdCBvZiBjaGlsZHJlbiBmZW5jZXMKLSAqIEBhY3RpdmVfbGlzdDogbGlzdCBvZiBhY3RpdmUgZmVuY2VzCiAgKgogICogdGhlIGZsYWdzIG1lbWJlciBtdXN0IGJlIG1hbmlwdWxhdGVkIGFuZCByZWFkIHVzaW5nIHRoZSBhcHByb3ByaWF0ZQogICogYXRvbWljIG9wcyAoYml0XyopLCBzbyB0YWtpbmcgdGhlIHNwaW5sb2NrIHdpbGwgbm90IGJlIG5lZWRlZCBtb3N0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oIGIvaW5jbHVkZS9saW51eC9maWx0ZXIuaAppbmRleCBhMTY0MzliLi4xZjA5YzUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvZmlsdGVyLmgKQEAgLTMxNCw2ICszMTQsNzAgQEAKIAlicGZfc2l6ZTsJCQkJCQlcCiB9KQogCisjZGVmaW5lIEJQRl9TSVpFT0YodHlwZSkJCQkJCVwKKwkoewkJCQkJCQlcCisJCWNvbnN0IGludCBfX3NpemUgPSBieXRlc190b19icGZfc2l6ZShzaXplb2YodHlwZSkpOyBcCisJCUJVSUxEX0JVR19PTihfX3NpemUgPCAwKTsJCQlcCisJCV9fc2l6ZTsJCQkJCQlcCisJfSkKKworI2RlZmluZSBCUEZfRklFTERfU0laRU9GKHR5cGUsIGZpZWxkKQkJCQlcCisJKHsJCQkJCQkJXAorCQljb25zdCBpbnQgX19zaXplID0gYnl0ZXNfdG9fYnBmX3NpemUoRklFTERfU0laRU9GKHR5cGUsIGZpZWxkKSk7IFwKKwkJQlVJTERfQlVHX09OKF9fc2l6ZSA8IDApOwkJCVwKKwkJX19zaXplOwkJCQkJCVwKKwl9KQorCisjZGVmaW5lIF9fQlBGX01BUF8wKG0sIHYsIC4uLikgdgorI2RlZmluZSBfX0JQRl9NQVBfMShtLCB2LCB0LCBhLCAuLi4pIG0odCwgYSkKKyNkZWZpbmUgX19CUEZfTUFQXzIobSwgdiwgdCwgYSwgLi4uKSBtKHQsIGEpLCBfX0JQRl9NQVBfMShtLCB2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19CUEZfTUFQXzMobSwgdiwgdCwgYSwgLi4uKSBtKHQsIGEpLCBfX0JQRl9NQVBfMihtLCB2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19CUEZfTUFQXzQobSwgdiwgdCwgYSwgLi4uKSBtKHQsIGEpLCBfX0JQRl9NQVBfMyhtLCB2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19CUEZfTUFQXzUobSwgdiwgdCwgYSwgLi4uKSBtKHQsIGEpLCBfX0JQRl9NQVBfNChtLCB2LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBfX0JQRl9SRUdfMCguLi4pIF9fQlBGX1BBRCg1KQorI2RlZmluZSBfX0JQRl9SRUdfMSguLi4pIF9fQlBGX01BUCgxLCBfX1ZBX0FSR1NfXyksIF9fQlBGX1BBRCg0KQorI2RlZmluZSBfX0JQRl9SRUdfMiguLi4pIF9fQlBGX01BUCgyLCBfX1ZBX0FSR1NfXyksIF9fQlBGX1BBRCgzKQorI2RlZmluZSBfX0JQRl9SRUdfMyguLi4pIF9fQlBGX01BUCgzLCBfX1ZBX0FSR1NfXyksIF9fQlBGX1BBRCgyKQorI2RlZmluZSBfX0JQRl9SRUdfNCguLi4pIF9fQlBGX01BUCg0LCBfX1ZBX0FSR1NfXyksIF9fQlBGX1BBRCgxKQorI2RlZmluZSBfX0JQRl9SRUdfNSguLi4pIF9fQlBGX01BUCg1LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBfX0JQRl9NQVAobiwgLi4uKSBfX0JQRl9NQVBfIyNuKF9fVkFfQVJHU19fKQorI2RlZmluZSBfX0JQRl9SRUcobiwgLi4uKSBfX0JQRl9SRUdfIyNuKF9fVkFfQVJHU19fKQorCisjZGVmaW5lIF9fQlBGX0NBU1QodCwgYSkJCQkJCQkgICAgICAgXAorCShfX2ZvcmNlIHQpCQkJCQkJCSAgICAgICBcCisJKF9fZm9yY2UJCQkJCQkJICAgICAgIFwKKwkgdHlwZW9mKF9fYnVpbHRpbl9jaG9vc2VfZXhwcihzaXplb2YodCkgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAgICAgIFwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZykwLCAodCkwKSkpIGEKKyNkZWZpbmUgX19CUEZfViB2b2lkCisjZGVmaW5lIF9fQlBGX04KKworI2RlZmluZSBfX0JQRl9ERUNMX0FSR1ModCwgYSkgdCAgIGEKKyNkZWZpbmUgX19CUEZfREVDTF9SRUdTKHQsIGEpIHU2NCBhCisKKyNkZWZpbmUgX19CUEZfUEFEKG4pCQkJCQkJCSAgICAgICBcCisJX19CUEZfTUFQKG4sIF9fQlBGX0RFQ0xfQVJHUywgX19CUEZfTiwgdTY0LCBfX3VyXzEsIHU2NCwgX191cl8yLCAgICAgICBcCisJCSAgdTY0LCBfX3VyXzMsIHU2NCwgX191cl80LCB1NjQsIF9fdXJfNSkKKworI2RlZmluZSBCUEZfQ0FMTF94KHgsIG5hbWUsIC4uLikJCQkJCSAgICAgICBcCisJc3RhdGljIF9fYWx3YXlzX2lubGluZQkJCQkJCSAgICAgICBcCisJdTY0IF9fX18jI25hbWUoX19CUEZfTUFQKHgsIF9fQlBGX0RFQ0xfQVJHUywgX19CUEZfViwgX19WQV9BUkdTX18pKTsgICBcCisJdTY0IG5hbWUoX19CUEZfUkVHKHgsIF9fQlBGX0RFQ0xfUkVHUywgX19CUEZfTiwgX19WQV9BUkdTX18pKTsJICAgICAgIFwKKwl1NjQgbmFtZShfX0JQRl9SRUcoeCwgX19CUEZfREVDTF9SRUdTLCBfX0JQRl9OLCBfX1ZBX0FSR1NfXykpCSAgICAgICBcCisJewkJCQkJCQkJICAgICAgIFwKKwkJcmV0dXJuIF9fX18jI25hbWUoX19CUEZfTUFQKHgsX19CUEZfQ0FTVCxfX0JQRl9OLF9fVkFfQVJHU19fKSk7XAorCX0JCQkJCQkJCSAgICAgICBcCisJc3RhdGljIF9fYWx3YXlzX2lubGluZQkJCQkJCSAgICAgICBcCisJdTY0IF9fX18jI25hbWUoX19CUEZfTUFQKHgsIF9fQlBGX0RFQ0xfQVJHUywgX19CUEZfViwgX19WQV9BUkdTX18pKQorCisjZGVmaW5lIEJQRl9DQUxMXzAobmFtZSwgLi4uKQlCUEZfQ0FMTF94KDAsIG5hbWUsIF9fVkFfQVJHU19fKQorI2RlZmluZSBCUEZfQ0FMTF8xKG5hbWUsIC4uLikJQlBGX0NBTExfeCgxLCBuYW1lLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQlBGX0NBTExfMihuYW1lLCAuLi4pCUJQRl9DQUxMX3goMiwgbmFtZSwgX19WQV9BUkdTX18pCisjZGVmaW5lIEJQRl9DQUxMXzMobmFtZSwgLi4uKQlCUEZfQ0FMTF94KDMsIG5hbWUsIF9fVkFfQVJHU19fKQorI2RlZmluZSBCUEZfQ0FMTF80KG5hbWUsIC4uLikJQlBGX0NBTExfeCg0LCBuYW1lLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQlBGX0NBTExfNShuYW1lLCAuLi4pCUJQRl9DQUxMX3goNSwgbmFtZSwgX19WQV9BUkdTX18pCisKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAvKiBBIHN0cnVjdCBzb2NrX2ZpbHRlciBpcyBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQuICovCiBzdHJ1Y3QgY29tcGF0X3NvY2tfZnByb2cgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IDM1MjNiZjYuLjkwMWUyNWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTU3NCw2ICs1NzQsNyBAQAogCiBzdHJ1Y3QgcG9zaXhfYWNsOwogI2RlZmluZSBBQ0xfTk9UX0NBQ0hFRCAoKHZvaWQgKikoLTEpKQorI2RlZmluZSBBQ0xfRE9OVF9DQUNIRSAoKHZvaWQgKikoLTMpKQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwb3NpeF9hY2wgKgogdW5jYWNoZWRfYWNsX3NlbnRpbmVsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnNjcnlwdG8uaCBiL2luY2x1ZGUvbGludXgvZnNjcnlwdG8uaAppbmRleCBjZmE2Y2RlLi43NmNmZjE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzY3J5cHRvLmgKKysrIGIvaW5jbHVkZS9saW51eC9mc2NyeXB0by5oCkBAIC0yNzQsOCArMjc0LDcgQEAKIGV4dGVybiBpbnQgZnNjcnlwdF96ZXJvb3V0X3JhbmdlKHN0cnVjdCBpbm9kZSAqLCBwZ29mZl90LCBzZWN0b3JfdCwKIAkJCQkJCXVuc2lnbmVkIGludCk7CiAvKiBwb2xpY3kuYyAqLwotZXh0ZXJuIGludCBmc2NyeXB0X3Byb2Nlc3NfcG9saWN5KHN0cnVjdCBpbm9kZSAqLAotCQkJCQljb25zdCBzdHJ1Y3QgZnNjcnlwdF9wb2xpY3kgKik7CitleHRlcm4gaW50IGZzY3J5cHRfcHJvY2Vzc19wb2xpY3koc3RydWN0IGZpbGUgKiwgY29uc3Qgc3RydWN0IGZzY3J5cHRfcG9saWN5ICopOwogZXh0ZXJuIGludCBmc2NyeXB0X2dldF9wb2xpY3koc3RydWN0IGlub2RlICosIHN0cnVjdCBmc2NyeXB0X3BvbGljeSAqKTsKIGV4dGVybiBpbnQgZnNjcnlwdF9oYXNfcGVybWl0dGVkX2NvbnRleHQoc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqKTsKIGV4dGVybiBpbnQgZnNjcnlwdF9pbmhlcml0X2NvbnRleHQoc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqLApAQCAtMzQ1LDcgKzM0NCw3IEBACiB9CiAKIC8qIHBvbGljeS5jICovCi1zdGF0aWMgaW5saW5lIGludCBmc2NyeXB0X25vdHN1cHBfcHJvY2Vzc19wb2xpY3koc3RydWN0IGlub2RlICppLAorc3RhdGljIGlubGluZSBpbnQgZnNjcnlwdF9ub3RzdXBwX3Byb2Nlc3NfcG9saWN5KHN0cnVjdCBmaWxlICpmLAogCQkJCWNvbnN0IHN0cnVjdCBmc2NyeXB0X3BvbGljeSAqcCkKIHsKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5X2JhY2tlbmQuaCBiL2luY2x1ZGUvbGludXgvZnNub3RpZnlfYmFja2VuZC5oCmluZGV4IDU4MjA1ZjMzLi43MjY4ZWQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5X2JhY2tlbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5X2JhY2tlbmQuaApAQCAtMTQ4LDYgKzE0OCw3IEBACiAJI2RlZmluZSBGU19QUklPXzEJMSAvKiBmYW5vdGlmeSBjb250ZW50IGJhc2VkIGFjY2VzcyBjb250cm9sICovCiAJI2RlZmluZSBGU19QUklPXzIJMiAvKiBmYW5vdGlmeSBwcmUtY29udGVudCBhY2Nlc3MgKi8KIAl1bnNpZ25lZCBpbnQgcHJpb3JpdHk7CisJYm9vbCBzaHV0ZG93bjsJCS8qIGdyb3VwIGlzIGJlaW5nIHNodXQgZG93biwgZG9uJ3QgcXVldWUgbW9yZSBldmVudHMgKi8KIAogCS8qIHN0b3JlcyBhbGwgZmFzdHBhdGggbWFya3MgYXNzb2Mgd2l0aCB0aGlzIGdyb3VwIHNvIHRoZXkgY2FuIGJlIGNsZWFuZWQgb24gdW5yZWdpc3RlciAqLwogCXN0cnVjdCBtdXRleCBtYXJrX211dGV4OwkvKiBwcm90ZWN0IG1hcmtzX2xpc3QgKi8KQEAgLTE3OSw3ICsxODAsNiBAQAogCQkJc3BpbmxvY2tfdCBhY2Nlc3NfbG9jazsKIAkJCXN0cnVjdCBsaXN0X2hlYWQgYWNjZXNzX2xpc3Q7CiAJCQl3YWl0X3F1ZXVlX2hlYWRfdCBhY2Nlc3Nfd2FpdHE7Ci0JCQlhdG9taWNfdCBieXBhc3NfcGVybTsKICNlbmRpZiAvKiBDT05GSUdfRkFOT1RJRllfQUNDRVNTX1BFUk1JU1NJT05TICovCiAJCQlpbnQgZl9mbGFnczsKIAkJCXVuc2lnbmVkIGludCBtYXhfbWFya3M7CkBAIC0yOTIsNiArMjkyLDggQEAKIGV4dGVybiB2b2lkIGZzbm90aWZ5X2dldF9ncm91cChzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwKTsKIC8qIGRyb3AgcmVmZXJlbmNlIG9uIGEgZ3JvdXAgZnJvbSBmc25vdGlmeV9hbGxvY19ncm91cCAqLwogZXh0ZXJuIHZvaWQgZnNub3RpZnlfcHV0X2dyb3VwKHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXApOworLyogZ3JvdXAgZGVzdHJ1Y3Rpb24gYmVnaW5zLCBzdG9wIHF1ZXVpbmcgbmV3IGV2ZW50cyAqLworZXh0ZXJuIHZvaWQgZnNub3RpZnlfZ3JvdXBfc3RvcF9xdWV1ZWluZyhzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwKTsKIC8qIGRlc3Ryb3kgZ3JvdXAgKi8KIGV4dGVybiB2b2lkIGZzbm90aWZ5X2Rlc3Ryb3lfZ3JvdXAoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCk7CiAvKiBmYXN5bmMgaGFuZGxlciBmdW5jdGlvbiAqLwpAQCAtMzA0LDggKzMwNiw2IEBACiAJCQkgICAgICBzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmV2ZW50LAogCQkJICAgICAgaW50ICgqbWVyZ2UpKHN0cnVjdCBsaXN0X2hlYWQgKiwKIAkJCQkJICAgc3RydWN0IGZzbm90aWZ5X2V2ZW50ICopKTsKLS8qIFJlbW92ZSBwYXNzZWQgZXZlbnQgZnJvbSBncm91cHMgbm90aWZpY2F0aW9uIHF1ZXVlICovCi1leHRlcm4gdm9pZCBmc25vdGlmeV9yZW1vdmVfZXZlbnQoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCwgc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpldmVudCk7CiAvKiB0cnVlIGlmIHRoZSBncm91cCBub3RpZmljYXRpb24gcXVldWUgaXMgZW1wdHkgKi8KIGV4dGVybiBib29sIGZzbm90aWZ5X25vdGlmeV9xdWV1ZV9pc19lbXB0eShzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwKTsKIC8qIHJldHVybiwgYnV0IGRvIG5vdCBkZXF1ZXVlIHRoZSBmaXJzdCBldmVudCBvbiB0aGUgbm90aWZpY2F0aW9uIHF1ZXVlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oIGIvaW5jbHVkZS9saW51eC9mdHJhY2UuaAppbmRleCA3ZDU2NWFmLi42ZjkzYWM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZnRyYWNlLmgKQEAgLTc5NSw3ICs3OTUsMTIgQEAKIAl1bnNpZ25lZCBsb25nIGZ1bmM7CiAJdW5zaWduZWQgbG9uZyBsb25nIGNhbGx0aW1lOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBzdWJ0aW1lOworI2lmZGVmIEhBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVAogCXVuc2lnbmVkIGxvbmcgZnA7CisjZW5kaWYKKyNpZmRlZiBIQVZFX0ZVTkNUSU9OX0dSQVBIX1JFVF9BRERSX1BUUgorCXVuc2lnbmVkIGxvbmcgKnJldHA7CisjZW5kaWYKIH07CiAKIC8qCkBAIC04MDcsNyArODEyLDEwIEBACiAKIGV4dGVybiBpbnQKIGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZSh1bnNpZ25lZCBsb25nIHJldCwgdW5zaWduZWQgbG9uZyBmdW5jLCBpbnQgKmRlcHRoLAotCQkJIHVuc2lnbmVkIGxvbmcgZnJhbWVfcG9pbnRlcik7CisJCQkgdW5zaWduZWQgbG9uZyBmcmFtZV9wb2ludGVyLCB1bnNpZ25lZCBsb25nICpyZXRwKTsKKwordW5zaWduZWQgbG9uZyBmdHJhY2VfZ3JhcGhfcmV0X2FkZHIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgKmlkeCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyByZXQsIHVuc2lnbmVkIGxvbmcgKnJldHApOwogCiAvKgogICogU29tZXRpbWVzIHdlIGRvbid0IHdhbnQgdG8gdHJhY2UgYSBmdW5jdGlvbiB3aXRoIHRoZSBmdW5jdGlvbgpAQCAtODcwLDYgKzg3OCwxMyBAQAogCXJldHVybiAtMTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitmdHJhY2VfZ3JhcGhfcmV0X2FkZHIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgKmlkeCwgdW5zaWduZWQgbG9uZyByZXQsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnJldHApCit7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHBhdXNlX2dyYXBoX3RyYWNpbmcodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgdW5wYXVzZV9ncmFwaF90cmFjaW5nKHZvaWQpIHsgfQogI2VuZGlmIC8qIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ3Bpby9kcml2ZXIuaCBiL2luY2x1ZGUvbGludXgvZ3Bpby9kcml2ZXIuaAppbmRleCA1MDg4MmUwLi4xZjBiZTcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dwaW8vZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9ncGlvL2RyaXZlci5oCkBAIC0zLDcgKzMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2NoYWluZWRfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CkBAIC0xNiw2ICsxNSw3IEBACiBzdHJ1Y3QgZGV2aWNlX25vZGU7CiBzdHJ1Y3Qgc2VxX2ZpbGU7CiBzdHJ1Y3QgZ3Bpb19kZXZpY2U7CitzdHJ1Y3QgbW9kdWxlOwogCiAjaWZkZWYgQ09ORklHX0dQSU9MSUIKIApAQCAtMTEyLDYgKzExMiwxMCBAQAogICoJaW5pdGlhbGl6YXRpb24sIHByb3ZpZGVkIGJ5IEdQSU8gZHJpdmVyCiAgKiBAaXJxX3BhcmVudDogR1BJTyBJUlEgY2hpcCBwYXJlbnQvYmFuayBsaW51eCBpcnEgbnVtYmVyLAogICoJcHJvdmlkZWQgYnkgR1BJTyBkcml2ZXIKKyAqIEBpcnFfbmVlZF92YWxpZF9tYXNrOiBJZiBzZXQgY29yZSBhbGxvY2F0ZXMgQGlycV92YWxpZF9tYXNrIHdpdGggYWxsCisgKgliaXRzIHNldCB0byBvbmUKKyAqIEBpcnFfdmFsaWRfbWFzazogSWYgbm90ICVOVUxMIGhvbGRzIGJpdG1hc2sgb2YgR1BJT3Mgd2hpY2ggYXJlIHZhbGlkIHRvCisgKgliZSBpbmNsdWRlZCBpbiBJUlEgZG9tYWluIG9mIHRoZSBjaGlwCiAgKiBAbG9ja19rZXk6IHBlciBHUElPIElSUSBjaGlwIGxvY2tkZXAgY2xhc3MKICAqCiAgKiBBIGdwaW9fY2hpcCBjYW4gaGVscCBwbGF0Zm9ybXMgYWJzdHJhY3QgdmFyaW91cyBzb3VyY2VzIG9mIEdQSU9zIHNvCkBAIC0xOTAsNiArMTk0LDggQEAKIAlpcnFfZmxvd19oYW5kbGVyX3QJaXJxX2hhbmRsZXI7CiAJdW5zaWduZWQgaW50CQlpcnFfZGVmYXVsdF90eXBlOwogCWludAkJCWlycV9wYXJlbnQ7CisJYm9vbAkJCWlycV9uZWVkX3ZhbGlkX21hc2s7CisJdW5zaWduZWQgbG9uZwkJKmlycV92YWxpZF9tYXNrOwogCXN0cnVjdCBsb2NrX2NsYXNzX2tleQkqbG9ja19rZXk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oaWQtc2Vuc29yLWh1Yi5oIGIvaW5jbHVkZS9saW51eC9oaWQtc2Vuc29yLWh1Yi5oCmluZGV4IGMwMmI1Y2UuLmRkODVmMzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGlkLXNlbnNvci1odWIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hpZC1zZW5zb3ItaHViLmgKQEAgLTIzNiw2ICsyMzYsNyBAQAogCXN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9hdHRyaWJ1dGVfaW5mbyByZXBvcnRfc3RhdGU7CiAJc3RydWN0IGhpZF9zZW5zb3JfaHViX2F0dHJpYnV0ZV9pbmZvIHBvd2VyX3N0YXRlOwogCXN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9hdHRyaWJ1dGVfaW5mbyBzZW5zaXRpdml0eTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIH07CiAKIC8qIENvbnZlcnQgZnJvbSBoaWQgdW5pdCBleHBvIHRvIHJlZ3VsYXIgZXhwb25lbnQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaG9zdDF4LmggYi9pbmNsdWRlL2xpbnV4L2hvc3QxeC5oCmluZGV4IGQyYmE3ZDMuLjFmZmJmMmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaG9zdDF4LmgKKysrIGIvaW5jbHVkZS9saW51eC9ob3N0MXguaApAQCAtMzA0LDYgKzMwNCw4IEBACiAKIHN0cnVjdCB0ZWdyYV9taXBpX2RldmljZSAqdGVncmFfbWlwaV9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CiB2b2lkIHRlZ3JhX21pcGlfZnJlZShzdHJ1Y3QgdGVncmFfbWlwaV9kZXZpY2UgKmRldmljZSk7CitpbnQgdGVncmFfbWlwaV9lbmFibGUoc3RydWN0IHRlZ3JhX21pcGlfZGV2aWNlICpkZXZpY2UpOworaW50IHRlZ3JhX21pcGlfZGlzYWJsZShzdHJ1Y3QgdGVncmFfbWlwaV9kZXZpY2UgKmRldmljZSk7CiBpbnQgdGVncmFfbWlwaV9jYWxpYnJhdGUoc3RydWN0IHRlZ3JhX21pcGlfZGV2aWNlICpkZXZpY2UpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHdtb24uaCBiL2luY2x1ZGUvbGludXgvaHdtb24uaAppbmRleCAwOTM1NGY2Li45ZDJmOGJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2h3bW9uLmgKKysrIGIvaW5jbHVkZS9saW51eC9od21vbi5oCkBAIC0xNCw5ICsxNCwzNDEgQEAKICNpZm5kZWYgX0hXTU9OX0hfCiAjZGVmaW5lIF9IV01PTl9IXwogCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKIHN0cnVjdCBkZXZpY2U7CiBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwOwogCitlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB7CisJaHdtb25fY2hpcCwKKwlod21vbl90ZW1wLAorCWh3bW9uX2luLAorCWh3bW9uX2N1cnIsCisJaHdtb25fcG93ZXIsCisJaHdtb25fZW5lcmd5LAorCWh3bW9uX2h1bWlkaXR5LAorCWh3bW9uX2ZhbiwKKwlod21vbl9wd20sCit9OworCitlbnVtIGh3bW9uX2NoaXBfYXR0cmlidXRlcyB7CisJaHdtb25fY2hpcF90ZW1wX3Jlc2V0X2hpc3RvcnksCisJaHdtb25fY2hpcF9pbl9yZXNldF9oaXN0b3J5LAorCWh3bW9uX2NoaXBfY3Vycl9yZXNldF9oaXN0b3J5LAorCWh3bW9uX2NoaXBfcG93ZXJfcmVzZXRfaGlzdG9yeSwKKwlod21vbl9jaGlwX3JlZ2lzdGVyX3R6LAorCWh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsLAorCWh3bW9uX2NoaXBfYWxhcm1zLAorfTsKKworI2RlZmluZSBIV01PTl9DX1RFTVBfUkVTRVRfSElTVE9SWQlCSVQoaHdtb25fY2hpcF90ZW1wX3Jlc2V0X2hpc3RvcnkpCisjZGVmaW5lIEhXTU9OX0NfSU5fUkVTRVRfSElTVE9SWQlCSVQoaHdtb25fY2hpcF9pbl9yZXNldF9oaXN0b3J5KQorI2RlZmluZSBIV01PTl9DX0NVUlJfUkVTRVRfSElTVE9SWQlCSVQoaHdtb25fY2hpcF9jdXJyX3Jlc2V0X2hpc3RvcnkpCisjZGVmaW5lIEhXTU9OX0NfUE9XRVJfUkVTRVRfSElTVE9SWQlCSVQoaHdtb25fY2hpcF9wb3dlcl9yZXNldF9oaXN0b3J5KQorI2RlZmluZSBIV01PTl9DX1JFR0lTVEVSX1RaCQlCSVQoaHdtb25fY2hpcF9yZWdpc3Rlcl90eikKKyNkZWZpbmUgSFdNT05fQ19VUERBVEVfSU5URVJWQUwJCUJJVChod21vbl9jaGlwX3VwZGF0ZV9pbnRlcnZhbCkKKyNkZWZpbmUgSFdNT05fQ19BTEFSTVMJCQlCSVQoaHdtb25fY2hpcF9hbGFybXMpCisKK2VudW0gaHdtb25fdGVtcF9hdHRyaWJ1dGVzIHsKKwlod21vbl90ZW1wX2lucHV0ID0gMCwKKwlod21vbl90ZW1wX3R5cGUsCisJaHdtb25fdGVtcF9sY3JpdCwKKwlod21vbl90ZW1wX2xjcml0X2h5c3QsCisJaHdtb25fdGVtcF9taW4sCisJaHdtb25fdGVtcF9taW5faHlzdCwKKwlod21vbl90ZW1wX21heCwKKwlod21vbl90ZW1wX21heF9oeXN0LAorCWh3bW9uX3RlbXBfY3JpdCwKKwlod21vbl90ZW1wX2NyaXRfaHlzdCwKKwlod21vbl90ZW1wX2VtZXJnZW5jeSwKKwlod21vbl90ZW1wX2VtZXJnZW5jeV9oeXN0LAorCWh3bW9uX3RlbXBfYWxhcm0sCisJaHdtb25fdGVtcF9sY3JpdF9hbGFybSwKKwlod21vbl90ZW1wX21pbl9hbGFybSwKKwlod21vbl90ZW1wX21heF9hbGFybSwKKwlod21vbl90ZW1wX2NyaXRfYWxhcm0sCisJaHdtb25fdGVtcF9lbWVyZ2VuY3lfYWxhcm0sCisJaHdtb25fdGVtcF9mYXVsdCwKKwlod21vbl90ZW1wX29mZnNldCwKKwlod21vbl90ZW1wX2xhYmVsLAorCWh3bW9uX3RlbXBfbG93ZXN0LAorCWh3bW9uX3RlbXBfaGlnaGVzdCwKKwlod21vbl90ZW1wX3Jlc2V0X2hpc3RvcnksCit9OworCisjZGVmaW5lIEhXTU9OX1RfSU5QVVQJCUJJVChod21vbl90ZW1wX2lucHV0KQorI2RlZmluZSBIV01PTl9UX1RZUEUJCUJJVChod21vbl90ZW1wX3R5cGUpCisjZGVmaW5lIEhXTU9OX1RfTENSSVQJCUJJVChod21vbl90ZW1wX2xjcml0KQorI2RlZmluZSBIV01PTl9UX0xDUklUX0hZU1QJQklUKGh3bW9uX3RlbXBfbGNyaXRfaHlzdCkKKyNkZWZpbmUgSFdNT05fVF9NSU4JCUJJVChod21vbl90ZW1wX21pbikKKyNkZWZpbmUgSFdNT05fVF9NSU5fSFlTVAlCSVQoaHdtb25fdGVtcF9taW5faHlzdCkKKyNkZWZpbmUgSFdNT05fVF9NQVgJCUJJVChod21vbl90ZW1wX21heCkKKyNkZWZpbmUgSFdNT05fVF9NQVhfSFlTVAlCSVQoaHdtb25fdGVtcF9tYXhfaHlzdCkKKyNkZWZpbmUgSFdNT05fVF9DUklUCQlCSVQoaHdtb25fdGVtcF9jcml0KQorI2RlZmluZSBIV01PTl9UX0NSSVRfSFlTVAlCSVQoaHdtb25fdGVtcF9jcml0X2h5c3QpCisjZGVmaW5lIEhXTU9OX1RfRU1FUkdFTkNZCUJJVChod21vbl90ZW1wX2VtZXJnZW5jeSkKKyNkZWZpbmUgSFdNT05fVF9FTUVSR0VOQ1lfSFlTVAlCSVQoaHdtb25fdGVtcF9lbWVyZ2VuY3lfaHlzdCkKKyNkZWZpbmUgSFdNT05fVF9NSU5fQUxBUk0JQklUKGh3bW9uX3RlbXBfbWluX2FsYXJtKQorI2RlZmluZSBIV01PTl9UX01BWF9BTEFSTQlCSVQoaHdtb25fdGVtcF9tYXhfYWxhcm0pCisjZGVmaW5lIEhXTU9OX1RfQ1JJVF9BTEFSTQlCSVQoaHdtb25fdGVtcF9jcml0X2FsYXJtKQorI2RlZmluZSBIV01PTl9UX0VNRVJHRU5DWV9BTEFSTQlCSVQoaHdtb25fdGVtcF9lbWVyZ2VuY3lfYWxhcm0pCisjZGVmaW5lIEhXTU9OX1RfRkFVTFQJCUJJVChod21vbl90ZW1wX2ZhdWx0KQorI2RlZmluZSBIV01PTl9UX09GRlNFVAkJQklUKGh3bW9uX3RlbXBfb2Zmc2V0KQorI2RlZmluZSBIV01PTl9UX0xBQkVMCQlCSVQoaHdtb25fdGVtcF9sYWJlbCkKKyNkZWZpbmUgSFdNT05fVF9MT1dFU1QJCUJJVChod21vbl90ZW1wX2xvd2VzdCkKKyNkZWZpbmUgSFdNT05fVF9ISUdIRVNUCQlCSVQoaHdtb25fdGVtcF9oaWdoZXN0KQorI2RlZmluZSBIV01PTl9UX1JFU0VUX0hJU1RPUlkJQklUKGh3bW9uX3RlbXBfcmVzZXRfaGlzdG9yeSkKKworZW51bSBod21vbl9pbl9hdHRyaWJ1dGVzIHsKKwlod21vbl9pbl9pbnB1dCwKKwlod21vbl9pbl9taW4sCisJaHdtb25faW5fbWF4LAorCWh3bW9uX2luX2xjcml0LAorCWh3bW9uX2luX2NyaXQsCisJaHdtb25faW5fYXZlcmFnZSwKKwlod21vbl9pbl9sb3dlc3QsCisJaHdtb25faW5faGlnaGVzdCwKKwlod21vbl9pbl9yZXNldF9oaXN0b3J5LAorCWh3bW9uX2luX2xhYmVsLAorCWh3bW9uX2luX2FsYXJtLAorCWh3bW9uX2luX21pbl9hbGFybSwKKwlod21vbl9pbl9tYXhfYWxhcm0sCisJaHdtb25faW5fbGNyaXRfYWxhcm0sCisJaHdtb25faW5fY3JpdF9hbGFybSwKK307CisKKyNkZWZpbmUgSFdNT05fSV9JTlBVVAkJQklUKGh3bW9uX2luX2lucHV0KQorI2RlZmluZSBIV01PTl9JX01JTgkJQklUKGh3bW9uX2luX21pbikKKyNkZWZpbmUgSFdNT05fSV9NQVgJCUJJVChod21vbl9pbl9tYXgpCisjZGVmaW5lIEhXTU9OX0lfTENSSVQJCUJJVChod21vbl9pbl9sY3JpdCkKKyNkZWZpbmUgSFdNT05fSV9DUklUCQlCSVQoaHdtb25faW5fY3JpdCkKKyNkZWZpbmUgSFdNT05fSV9BVkVSQUdFCQlCSVQoaHdtb25faW5fYXZlcmFnZSkKKyNkZWZpbmUgSFdNT05fSV9MT1dFU1QJCUJJVChod21vbl9pbl9sb3dlc3QpCisjZGVmaW5lIEhXTU9OX0lfSElHSEVTVAkJQklUKGh3bW9uX2luX2hpZ2hlc3QpCisjZGVmaW5lIEhXTU9OX0lfUkVTRVRfSElTVE9SWQlCSVQoaHdtb25faW5fcmVzZXRfaGlzdG9yeSkKKyNkZWZpbmUgSFdNT05fSV9MQUJFTAkJQklUKGh3bW9uX2luX2xhYmVsKQorI2RlZmluZSBIV01PTl9JX0FMQVJNCQlCSVQoaHdtb25faW5fYWxhcm0pCisjZGVmaW5lIEhXTU9OX0lfTUlOX0FMQVJNCUJJVChod21vbl9pbl9taW5fYWxhcm0pCisjZGVmaW5lIEhXTU9OX0lfTUFYX0FMQVJNCUJJVChod21vbl9pbl9tYXhfYWxhcm0pCisjZGVmaW5lIEhXTU9OX0lfTENSSVRfQUxBUk0JQklUKGh3bW9uX2luX2xjcml0X2FsYXJtKQorI2RlZmluZSBIV01PTl9JX0NSSVRfQUxBUk0JQklUKGh3bW9uX2luX2NyaXRfYWxhcm0pCisKK2VudW0gaHdtb25fY3Vycl9hdHRyaWJ1dGVzIHsKKwlod21vbl9jdXJyX2lucHV0LAorCWh3bW9uX2N1cnJfbWluLAorCWh3bW9uX2N1cnJfbWF4LAorCWh3bW9uX2N1cnJfbGNyaXQsCisJaHdtb25fY3Vycl9jcml0LAorCWh3bW9uX2N1cnJfYXZlcmFnZSwKKwlod21vbl9jdXJyX2xvd2VzdCwKKwlod21vbl9jdXJyX2hpZ2hlc3QsCisJaHdtb25fY3Vycl9yZXNldF9oaXN0b3J5LAorCWh3bW9uX2N1cnJfbGFiZWwsCisJaHdtb25fY3Vycl9hbGFybSwKKwlod21vbl9jdXJyX21pbl9hbGFybSwKKwlod21vbl9jdXJyX21heF9hbGFybSwKKwlod21vbl9jdXJyX2xjcml0X2FsYXJtLAorCWh3bW9uX2N1cnJfY3JpdF9hbGFybSwKK307CisKKyNkZWZpbmUgSFdNT05fQ19JTlBVVAkJQklUKGh3bW9uX2N1cnJfaW5wdXQpCisjZGVmaW5lIEhXTU9OX0NfTUlOCQlCSVQoaHdtb25fY3Vycl9taW4pCisjZGVmaW5lIEhXTU9OX0NfTUFYCQlCSVQoaHdtb25fY3Vycl9tYXgpCisjZGVmaW5lIEhXTU9OX0NfTENSSVQJCUJJVChod21vbl9jdXJyX2xjcml0KQorI2RlZmluZSBIV01PTl9DX0NSSVQJCUJJVChod21vbl9jdXJyX2NyaXQpCisjZGVmaW5lIEhXTU9OX0NfQVZFUkFHRQkJQklUKGh3bW9uX2N1cnJfYXZlcmFnZSkKKyNkZWZpbmUgSFdNT05fQ19MT1dFU1QJCUJJVChod21vbl9jdXJyX2xvd2VzdCkKKyNkZWZpbmUgSFdNT05fQ19ISUdIRVNUCQlCSVQoaHdtb25fY3Vycl9oaWdoZXN0KQorI2RlZmluZSBIV01PTl9DX1JFU0VUX0hJU1RPUlkJQklUKGh3bW9uX2N1cnJfcmVzZXRfaGlzdG9yeSkKKyNkZWZpbmUgSFdNT05fQ19MQUJFTAkJQklUKGh3bW9uX2N1cnJfbGFiZWwpCisjZGVmaW5lIEhXTU9OX0NfQUxBUk0JCUJJVChod21vbl9jdXJyX2FsYXJtKQorI2RlZmluZSBIV01PTl9DX01JTl9BTEFSTQlCSVQoaHdtb25fY3Vycl9taW5fYWxhcm0pCisjZGVmaW5lIEhXTU9OX0NfTUFYX0FMQVJNCUJJVChod21vbl9jdXJyX21heF9hbGFybSkKKyNkZWZpbmUgSFdNT05fQ19MQ1JJVF9BTEFSTQlCSVQoaHdtb25fY3Vycl9sY3JpdF9hbGFybSkKKyNkZWZpbmUgSFdNT05fQ19DUklUX0FMQVJNCUJJVChod21vbl9jdXJyX2NyaXRfYWxhcm0pCisKK2VudW0gaHdtb25fcG93ZXJfYXR0cmlidXRlcyB7CisJaHdtb25fcG93ZXJfYXZlcmFnZSwKKwlod21vbl9wb3dlcl9hdmVyYWdlX2ludGVydmFsLAorCWh3bW9uX3Bvd2VyX2F2ZXJhZ2VfaW50ZXJ2YWxfbWF4LAorCWh3bW9uX3Bvd2VyX2F2ZXJhZ2VfaW50ZXJ2YWxfbWluLAorCWh3bW9uX3Bvd2VyX2F2ZXJhZ2VfaGlnaGVzdCwKKwlod21vbl9wb3dlcl9hdmVyYWdlX2xvd2VzdCwKKwlod21vbl9wb3dlcl9hdmVyYWdlX21heCwKKwlod21vbl9wb3dlcl9hdmVyYWdlX21pbiwKKwlod21vbl9wb3dlcl9pbnB1dCwKKwlod21vbl9wb3dlcl9pbnB1dF9oaWdoZXN0LAorCWh3bW9uX3Bvd2VyX2lucHV0X2xvd2VzdCwKKwlod21vbl9wb3dlcl9yZXNldF9oaXN0b3J5LAorCWh3bW9uX3Bvd2VyX2FjY3VyYWN5LAorCWh3bW9uX3Bvd2VyX2NhcCwKKwlod21vbl9wb3dlcl9jYXBfaHlzdCwKKwlod21vbl9wb3dlcl9jYXBfbWF4LAorCWh3bW9uX3Bvd2VyX2NhcF9taW4sCisJaHdtb25fcG93ZXJfbWF4LAorCWh3bW9uX3Bvd2VyX2NyaXQsCisJaHdtb25fcG93ZXJfbGFiZWwsCisJaHdtb25fcG93ZXJfYWxhcm0sCisJaHdtb25fcG93ZXJfY2FwX2FsYXJtLAorCWh3bW9uX3Bvd2VyX21heF9hbGFybSwKKwlod21vbl9wb3dlcl9jcml0X2FsYXJtLAorfTsKKworI2RlZmluZSBIV01PTl9QX0FWRVJBR0UJCQlCSVQoaHdtb25fcG93ZXJfYXZlcmFnZSkKKyNkZWZpbmUgSFdNT05fUF9BVkVSQUdFX0lOVEVSVkFMCUJJVChod21vbl9wb3dlcl9hdmVyYWdlX2ludGVydmFsKQorI2RlZmluZSBIV01PTl9QX0FWRVJBR0VfSU5URVJWQUxfTUFYCUJJVChod21vbl9wb3dlcl9hdmVyYWdlX2ludGVydmFsX21heCkKKyNkZWZpbmUgSFdNT05fUF9BVkVSQUdFX0lOVEVSVkFMX01JTglCSVQoaHdtb25fcG93ZXJfYXZlcmFnZV9pbnRlcnZhbF9taW4pCisjZGVmaW5lIEhXTU9OX1BfQVZFUkFHRV9ISUdIRVNUCQlCSVQoaHdtb25fcG93ZXJfYXZlcmFnZV9oaWdoZXN0KQorI2RlZmluZSBIV01PTl9QX0FWRVJBR0VfTE9XRVNUCQlCSVQoaHdtb25fcG93ZXJfYXZlcmFnZV9sb3dlc3QpCisjZGVmaW5lIEhXTU9OX1BfQVZFUkFHRV9NQVgJCUJJVChod21vbl9wb3dlcl9hdmVyYWdlX21heCkKKyNkZWZpbmUgSFdNT05fUF9BVkVSQUdFX01JTgkJQklUKGh3bW9uX3Bvd2VyX2F2ZXJhZ2VfbWluKQorI2RlZmluZSBIV01PTl9QX0lOUFVUCQkJQklUKGh3bW9uX3Bvd2VyX2lucHV0KQorI2RlZmluZSBIV01PTl9QX0lOUFVUX0hJR0hFU1QJCUJJVChod21vbl9wb3dlcl9pbnB1dF9oaWdoZXN0KQorI2RlZmluZSBIV01PTl9QX0lOUFVUX0xPV0VTVAkJQklUKGh3bW9uX3Bvd2VyX2lucHV0X2xvd2VzdCkKKyNkZWZpbmUgSFdNT05fUF9SRVNFVF9ISVNUT1JZCQlCSVQoaHdtb25fcG93ZXJfcmVzZXRfaGlzdG9yeSkKKyNkZWZpbmUgSFdNT05fUF9BQ0NVUkFDWQkJQklUKGh3bW9uX3Bvd2VyX2FjY3VyYWN5KQorI2RlZmluZSBIV01PTl9QX0NBUAkJCUJJVChod21vbl9wb3dlcl9jYXApCisjZGVmaW5lIEhXTU9OX1BfQ0FQX0hZU1QJCUJJVChod21vbl9wb3dlcl9jYXBfaHlzdCkKKyNkZWZpbmUgSFdNT05fUF9DQVBfTUFYCQkJQklUKGh3bW9uX3Bvd2VyX2NhcF9tYXgpCisjZGVmaW5lIEhXTU9OX1BfQ0FQX01JTgkJCUJJVChod21vbl9wb3dlcl9jYXBfbWluKQorI2RlZmluZSBIV01PTl9QX01BWAkJCUJJVChod21vbl9wb3dlcl9tYXgpCisjZGVmaW5lIEhXTU9OX1BfQ1JJVAkJCUJJVChod21vbl9wb3dlcl9jcml0KQorI2RlZmluZSBIV01PTl9QX0xBQkVMCQkJQklUKGh3bW9uX3Bvd2VyX2xhYmVsKQorI2RlZmluZSBIV01PTl9QX0FMQVJNCQkJQklUKGh3bW9uX3Bvd2VyX2FsYXJtKQorI2RlZmluZSBIV01PTl9QX0NBUF9BTEFSTQkJQklUKGh3bW9uX3Bvd2VyX2NhcF9hbGFybSkKKyNkZWZpbmUgSFdNT05fUF9NQVhfQUxBUk0JCUJJVChod21vbl9wb3dlcl9tYXhfYWxhcm0pCisjZGVmaW5lIEhXTU9OX1BfQ1JJVF9BTEFSTQkJQklUKGh3bW9uX3Bvd2VyX2NyaXRfYWxhcm0pCisKK2VudW0gaHdtb25fZW5lcmd5X2F0dHJpYnV0ZXMgeworCWh3bW9uX2VuZXJneV9pbnB1dCwKKwlod21vbl9lbmVyZ3lfbGFiZWwsCit9OworCisjZGVmaW5lIEhXTU9OX0VfSU5QVVQJCQlCSVQoaHdtb25fZW5lcmd5X2lucHV0KQorI2RlZmluZSBIV01PTl9FX0xBQkVMCQkJQklUKGh3bW9uX2VuZXJneV9sYWJlbCkKKworZW51bSBod21vbl9odW1pZGl0eV9hdHRyaWJ1dGVzIHsKKwlod21vbl9odW1pZGl0eV9pbnB1dCwKKwlod21vbl9odW1pZGl0eV9sYWJlbCwKKwlod21vbl9odW1pZGl0eV9taW4sCisJaHdtb25faHVtaWRpdHlfbWluX2h5c3QsCisJaHdtb25faHVtaWRpdHlfbWF4LAorCWh3bW9uX2h1bWlkaXR5X21heF9oeXN0LAorCWh3bW9uX2h1bWlkaXR5X2FsYXJtLAorCWh3bW9uX2h1bWlkaXR5X2ZhdWx0LAorfTsKKworI2RlZmluZSBIV01PTl9IX0lOUFVUCQkJQklUKGh3bW9uX2h1bWlkaXR5X2lucHV0KQorI2RlZmluZSBIV01PTl9IX0xBQkVMCQkJQklUKGh3bW9uX2h1bWlkaXR5X2xhYmVsKQorI2RlZmluZSBIV01PTl9IX01JTgkJCUJJVChod21vbl9odW1pZGl0eV9taW4pCisjZGVmaW5lIEhXTU9OX0hfTUlOX0hZU1QJCUJJVChod21vbl9odW1pZGl0eV9taW5faHlzdCkKKyNkZWZpbmUgSFdNT05fSF9NQVgJCQlCSVQoaHdtb25faHVtaWRpdHlfbWF4KQorI2RlZmluZSBIV01PTl9IX01BWF9IWVNUCQlCSVQoaHdtb25faHVtaWRpdHlfbWF4X2h5c3QpCisjZGVmaW5lIEhXTU9OX0hfQUxBUk0JCQlCSVQoaHdtb25faHVtaWRpdHlfYWxhcm0pCisjZGVmaW5lIEhXTU9OX0hfRkFVTFQJCQlCSVQoaHdtb25faHVtaWRpdHlfZmF1bHQpCisKK2VudW0gaHdtb25fZmFuX2F0dHJpYnV0ZXMgeworCWh3bW9uX2Zhbl9pbnB1dCwKKwlod21vbl9mYW5fbGFiZWwsCisJaHdtb25fZmFuX21pbiwKKwlod21vbl9mYW5fbWF4LAorCWh3bW9uX2Zhbl9kaXYsCisJaHdtb25fZmFuX3B1bHNlcywKKwlod21vbl9mYW5fdGFyZ2V0LAorCWh3bW9uX2Zhbl9hbGFybSwKKwlod21vbl9mYW5fbWluX2FsYXJtLAorCWh3bW9uX2Zhbl9tYXhfYWxhcm0sCisJaHdtb25fZmFuX2ZhdWx0LAorfTsKKworI2RlZmluZSBIV01PTl9GX0lOUFVUCQkJQklUKGh3bW9uX2Zhbl9pbnB1dCkKKyNkZWZpbmUgSFdNT05fRl9MQUJFTAkJCUJJVChod21vbl9mYW5fbGFiZWwpCisjZGVmaW5lIEhXTU9OX0ZfTUlOCQkJQklUKGh3bW9uX2Zhbl9taW4pCisjZGVmaW5lIEhXTU9OX0ZfTUFYCQkJQklUKGh3bW9uX2Zhbl9tYXgpCisjZGVmaW5lIEhXTU9OX0ZfRElWCQkJQklUKGh3bW9uX2Zhbl9kaXYpCisjZGVmaW5lIEhXTU9OX0ZfUFVMU0VTCQkJQklUKGh3bW9uX2Zhbl9wdWxzZXMpCisjZGVmaW5lIEhXTU9OX0ZfVEFSR0VUCQkJQklUKGh3bW9uX2Zhbl90YXJnZXQpCisjZGVmaW5lIEhXTU9OX0ZfQUxBUk0JCQlCSVQoaHdtb25fZmFuX2FsYXJtKQorI2RlZmluZSBIV01PTl9GX01JTl9BTEFSTQkJQklUKGh3bW9uX2Zhbl9taW5fYWxhcm0pCisjZGVmaW5lIEhXTU9OX0ZfTUFYX0FMQVJNCQlCSVQoaHdtb25fZmFuX21heF9hbGFybSkKKyNkZWZpbmUgSFdNT05fRl9GQVVMVAkJCUJJVChod21vbl9mYW5fZmF1bHQpCisKK2VudW0gaHdtb25fcHdtX2F0dHJpYnV0ZXMgeworCWh3bW9uX3B3bV9pbnB1dCwKKwlod21vbl9wd21fZW5hYmxlLAorCWh3bW9uX3B3bV9tb2RlLAorCWh3bW9uX3B3bV9mcmVxLAorfTsKKworI2RlZmluZSBIV01PTl9QV01fSU5QVVQJCQlCSVQoaHdtb25fcHdtX2lucHV0KQorI2RlZmluZSBIV01PTl9QV01fRU5BQkxFCQlCSVQoaHdtb25fcHdtX2VuYWJsZSkKKyNkZWZpbmUgSFdNT05fUFdNX01PREUJCQlCSVQoaHdtb25fcHdtX21vZGUpCisjZGVmaW5lIEhXTU9OX1BXTV9GUkVRCQkJQklUKGh3bW9uX3B3bV9mcmVxKQorCisvKioKKyAqIHN0cnVjdCBod21vbl9vcHMgLSBod21vbiBkZXZpY2Ugb3BlcmF0aW9ucworICogQGlzX3Zpc2libGU6IENhbGxiYWNrIHRvIHJldHVybiBhdHRyaWJ1dGUgdmlzaWJpbGl0eS4gTWFuZGF0b3J5LgorICoJCVBhcmFtZXRlcnMgYXJlOgorICoJCUBjb25zdCB2b2lkICpkcnZkYXRhOgorICoJCQlQb2ludGVyIHRvIGRyaXZlci1wcml2YXRlIGRhdGEgc3RydWN0dXJlIHBhc3NlZAorICoJCQlhcyBhcmd1bWVudCB0byBod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKCkuCisgKgkJQHR5cGU6CVNlbnNvciB0eXBlCisgKgkJQGF0dHI6CVNlbnNvciBhdHRyaWJ1dGUKKyAqCQlAY2hhbm5lbDoKKyAqCQkJQ2hhbm5lbCBudW1iZXIKKyAqCQlUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlsZSBwZXJtaXNzaW9ucy4KKyAqCQlJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIDAsIG5vIGF0dHJpYnV0ZSB3aWxsIGJlIGNyZWF0ZWQuCisgKiBAcmVhZDogICAgICAgUmVhZCBjYWxsYmFjay4gT3B0aW9uYWwuIElmIG5vdCBwcm92aWRlZCwgYXR0cmlidXRlcworICoJCXdpbGwgbm90IGJlIHJlYWRhYmxlLgorICoJCVBhcmFtZXRlcnMgYXJlOgorICoJCUBkZXY6CVBvaW50ZXIgdG8gaGFyZHdhcmUgbW9uaXRvcmluZyBkZXZpY2UKKyAqCQlAdHlwZToJU2Vuc29yIHR5cGUKKyAqCQlAYXR0cjoJU2Vuc29yIGF0dHJpYnV0ZQorICoJCUBjaGFubmVsOgorICoJCQlDaGFubmVsIG51bWJlcgorICoJCUB2YWw6CVBvaW50ZXIgdG8gcmV0dXJuZWQgdmFsdWUKKyAqCQlUaGUgZnVuY3Rpb24gcmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIuCisgKiBAd3JpdGU6CVdyaXRlIGNhbGxiYWNrLiBPcHRpb25hbC4gSWYgbm90IHByb3ZpZGVkLCBhdHRyaWJ1dGVzCisgKgkJd2lsbCBub3QgYmUgd3JpdGFibGUuCisgKgkJUGFyYW1ldGVycyBhcmU6CisgKgkJQGRldjoJUG9pbnRlciB0byBoYXJkd2FyZSBtb25pdG9yaW5nIGRldmljZQorICoJCUB0eXBlOglTZW5zb3IgdHlwZQorICoJCUBhdHRyOglTZW5zb3IgYXR0cmlidXRlCisgKgkJQGNoYW5uZWw6CisgKgkJCUNoYW5uZWwgbnVtYmVyCisgKgkJQHZhbDoJVmFsdWUgdG8gd3JpdGUKKyAqCQlUaGUgZnVuY3Rpb24gcmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIuCisgKi8KK3N0cnVjdCBod21vbl9vcHMgeworCXVtb2RlX3QgKCppc192aXNpYmxlKShjb25zdCB2b2lkICpkcnZkYXRhLCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJICAgICAgdTMyIGF0dHIsIGludCBjaGFubmVsKTsKKwlpbnQgKCpyZWFkKShzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCSAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnZhbCk7CisJaW50ICgqd3JpdGUpKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJICAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgdmFsKTsKK307CisKKy8qKgorICogQ2hhbm5lbCBpbmZvcm1hdGlvbgorICogQHR5cGU6CUNoYW5uZWwgdHlwZS4KKyAqIEBjb25maWc6CVBvaW50ZXIgdG8gTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2YgY2hhbm5lbCBwYXJhbWV0ZXJzLgorICoJCVVzZSBmb3IgcGVyLWNoYW5uZWwgYXR0cmlidXRlcy4KKyAqLworc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyB7CisJZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZTsKKwljb25zdCB1MzIgKmNvbmZpZzsKK307CisKKy8qKgorICogQ2hpcCBjb25maWd1cmF0aW9uCisgKiBAb3BzOglQb2ludGVyIHRvIGh3bW9uIG9wZXJhdGlvbnMuCisgKiBAaW5mbzoJTnVsbC10ZXJtaW5hdGVkIGxpc3Qgb2YgY2hhbm5lbCBpbmZvcm1hdGlvbi4KKyAqLworc3RydWN0IGh3bW9uX2NoaXBfaW5mbyB7CisJY29uc3Qgc3RydWN0IGh3bW9uX29wcyAqb3BzOworCWNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gKippbmZvOworfTsKKwogc3RydWN0IGRldmljZSAqaHdtb25fZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldik7CiBzdHJ1Y3QgZGV2aWNlICoKIGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCkBAIC0yNiw2ICszNTgsMTYgQEAKIGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgICAgICAgdm9pZCAqZHJ2ZGF0YSwKIAkJCQkgICAgICAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKmdyb3Vwcyk7CitzdHJ1Y3QgZGV2aWNlICoKK2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCWNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRydmRhdGEsCisJCQkJY29uc3Qgc3RydWN0IGh3bW9uX2NoaXBfaW5mbyAqaW5mbywKKwkJCQljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzKTsKK3N0cnVjdCBkZXZpY2UgKgorZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRydmRhdGEsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvICppbmZvLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKmdyb3Vwcyk7CiAKIHZvaWQgaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KTsKIHZvaWQgZGV2bV9od21vbl9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oeXBlcnYuaCBiL2luY2x1ZGUvbGludXgvaHlwZXJ2LmgKaW5kZXggYjEwOTU0YS4uNjgyNDU1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oeXBlcnYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2h5cGVydi5oCkBAIC02NzQsNiArNjc0LDExIEBACiAJSFZfU0lHTkFMX1BPTElDWV9FWFBMSUNJVCwKIH07CiAKK2VudW0gaHZfbnVtYV9wb2xpY3kgeworCUhWX0JBTEFOQ0VEID0gMCwKKwlIVl9MT0NBTElaRUQsCit9OworCiBlbnVtIHZtYnVzX2RldmljZV90eXBlIHsKIAlIVl9JREUgPSAwLAogCUhWX1NDU0ksCkBAIC03MDEsOSArNzA2LDYgQEAKIH07CiAKIHN0cnVjdCB2bWJ1c19jaGFubmVsIHsKLQkvKiBVbmlxdWUgY2hhbm5lbCBpZCAqLwotCWludCBpZDsKLQogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdGVudHJ5OwogCiAJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iajsKQEAgLTg1MCw2ICs4NTIsNDMgQEAKIAkgKiByaW5nIGxvY2sgdG8gcHJlc2VydmUgdGhlIGN1cnJlbnQgYmVoYXZpb3IuCiAJICovCiAJYm9vbCBhY3F1aXJlX3JpbmdfbG9jazsKKwkvKgorCSAqIEZvciBwZXJmb3JtYW5jZSBjcml0aWNhbCBjaGFubmVscyAoc3RvcmFnZSwgbmV0d29ya2luZworCSAqIGV0YywpLCBIeXBlci1WIGhhcyBhIG1lY2hhbmlzbSB0byBlbmhhbmNlIHRoZSB0aHJvdWdocHV0CisJICogYXQgdGhlIGV4cGVuc2Ugb2YgbGF0ZW5jeToKKwkgKiBXaGVuIHRoZSBob3N0IGlzIHRvIGJlIHNpZ25hbGVkLCB3ZSBqdXN0IHNldCBhIGJpdCBpbiBhIHNoYXJlZCBwYWdlCisJICogYW5kIHRoaXMgYml0IHdpbGwgYmUgaW5zcGVjdGVkIGJ5IHRoZSBoeXBlcnZpc29yIHdpdGhpbiBhIGNlcnRhaW4KKwkgKiB3aW5kb3cgYW5kIGlmIHRoZSBiaXQgaXMgc2V0LCB0aGUgaG9zdCB3aWxsIGJlIHNpZ25hbGVkLiBUaGUgd2luZG93CisJICogb2YgdGltZSBpcyB0aGUgbW9uaXRvciBsYXRlbmN5IC0gY3VycmVudGx5IGFyb3VuZCAxMDAgdXNlY3MuIFRoaXMKKwkgKiBtZWNoYW5pc20gaW1wcm92ZXMgdGhyb3VnaHB1dCBieToKKwkgKgorCSAqIEEpIE1ha2luZyB0aGUgaG9zdCBtb3JlIGVmZmljaWVudCAtIGVhY2ggdGltZSBpdCB3YWtlcyB1cCwKKwkgKiAgICBwb3RlbnRpYWxseSBpdCB3aWxsIHByb2Nlc3MgbW9yZXYgbnVtYmVyIG9mIHBhY2tldHMuIFRoZQorCSAqICAgIG1vbml0b3IgbGF0ZW5jeSBhbGxvd3MgYSBiYXRjaCB0byBidWlsZCB1cC4KKwkgKiBCKSBCeSBkZWZlcnJpbmcgdGhlIGh5cGVyY2FsbCB0byBzaWduYWwsIHdlIHdpbGwgYWxzbyBtaW5pbWl6ZQorCSAqICAgIHRoZSBpbnRlcnJ1cHRzLgorCSAqCisJICogQ2xlYXJseSwgdGhlc2Ugb3B0aW1pemF0aW9ucyBpbXByb3ZlIHRocm91Z2hwdXQgYXQgdGhlIGV4cGVuc2Ugb2YKKwkgKiBsYXRlbmN5LiBGdXJ0aGVybW9yZSwgc2luY2UgdGhlIGNoYW5uZWwgaXMgc2hhcmVkIGZvciBib3RoCisJICogY29udHJvbCBhbmQgZGF0YSBtZXNzYWdlcywgY29udHJvbCBtZXNzYWdlcyBjdXJyZW50bHkgc3VmZmVyCisJICogdW5uZWNlc3NhcnkgbGF0ZW5jeSBhZHZlcnNsZXkgaW1wYWN0aW5nIHBlcmZvcm1hbmNlIGFuZCBib290CisJICogdGltZS4gVG8gZml4IHRoaXMgaXNzdWUsIHBlcm1pdCB0YWdnaW5nIHRoZSBjaGFubmVsIGFzIGJlaW5nCisJICogaW4gImxvdyBsYXRlbmN5IiBtb2RlLiBJbiB0aGlzIG1vZGUsIHdlIHdpbGwgYnlwYXNzIHRoZSBtb25pdG9yCisJICogbWVjaGFuaXNtLgorCSAqLworCWJvb2wgbG93X2xhdGVuY3k7CisKKwkvKgorCSAqIE5VTUEgZGlzdHJpYnV0aW9uIHBvbGljeToKKwkgKiBXZSBzdXBwb3J0IHRlbyBwb2xpY2llczoKKwkgKiAxKSBCYWxhbmNlZDogSGVyZSBhbGwgcGVyZm9ybWFuY2UgY3JpdGljYWwgY2hhbm5lbHMgYXJlCisJICogICAgZGlzdHJpYnV0ZWQgZXZlbmx5IGFtb25nc3QgYWxsIHRoZSBOVU1BIG5vZGVzLgorCSAqICAgIFRoaXMgcG9saWN5IHdpbGwgYmUgdGhlIGRlZmF1bHQgcG9saWN5LgorCSAqIDIpIExvY2FsaXplZDogQWxsIGNoYW5uZWxzIG9mIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgYQorCSAqICAgIHBlcmZvcm1hbmNlIGNyaXRpY2FsIHNlcnZpY2Ugd2lsbCBiZSBhc3NpZ25lZCBDUFVzCisJICogICAgd2l0aGluIGEgc2VsZWN0ZWQgTlVNQSBub2RlLgorCSAqLworCWVudW0gaHZfbnVtYV9wb2xpY3kgYWZmaW5pdHlfcG9saWN5OwogCiB9OwogCkBAIC04NzAsNiArOTA5LDEyIEBACiAJYy0+c2lnbmFsX3BvbGljeSA9IHBvbGljeTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNldF9jaGFubmVsX2FmZmluaXR5X3N0YXRlKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjLAorCQkJCQkgICAgICBlbnVtIGh2X251bWFfcG9saWN5IHBvbGljeSkKK3sKKwljLT5hZmZpbml0eV9wb2xpY3kgPSBwb2xpY3k7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY2hhbm5lbF9yZWFkX3N0YXRlKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjLCBib29sIHN0YXRlKQogewogCWMtPmJhdGNoZWRfcmVhZGluZyA9IHN0YXRlOwpAQCAtODkxLDYgKzkzNiwxNiBAQAogCWMtPm91dGJvdW5kLnJpbmdfYnVmZmVyLT5wZW5kaW5nX3NlbmRfc3ogPSBzaXplOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2xvd19sYXRlbmN5X21vZGUoc3RydWN0IHZtYnVzX2NoYW5uZWwgKmMpCit7CisJYy0+bG93X2xhdGVuY3kgPSB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfbG93X2xhdGVuY3lfbW9kZShzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqYykKK3sKKwljLT5sb3dfbGF0ZW5jeSA9IGZhbHNlOworfQorCiB2b2lkIHZtYnVzX29ubWVzc2FnZSh2b2lkICpjb250ZXh0KTsKIAogaW50IHZtYnVzX3JlcXVlc3Rfb2ZmZXJzKHZvaWQpOwpAQCAtMTExNCw2ICsxMTY5LDEzIEBACiAJCQkJCSBjb25zdCBjaGFyICptb2RfbmFtZSk7CiB2b2lkIHZtYnVzX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBodl9kcml2ZXIgKmh2X2RyaXZlcik7CiAKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqdm1idXNfZGV2X25hbWUoY29uc3Qgc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaikKK3sKKwljb25zdCBzdHJ1Y3Qga29iamVjdCAqa29iaiA9ICZkZXZpY2Vfb2JqLT5kZXZpY2Uua29iajsKKworCXJldHVybiBrb2JqLT5uYW1lOworfQorCiB2b2lkIHZtYnVzX2h2c29ja19kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCk7CiAKIGludCB2bWJ1c19hbGxvY2F0ZV9tbWlvKHN0cnVjdCByZXNvdXJjZSAqKm5ldywgc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaiwKQEAgLTEyNTcsNiArMTMxOSwyNyBAQAogCQkJMHg4MCwgMHgyZSwgMHgyNywgMHhlZCwgMHhlMSwgMHg5ZikKIAogLyoKKyAqIExpbnV4IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgMyBkZXZpY2VzOiB0aGUgZmlyc3QgdHdvIGFyZSBmb3IKKyAqIEF1dG9tYXRpYyBWaXJ0dWFsIE1hY2hpbmUgQWN0aXZhdGlvbiwgYW5kIHRoZSB0aGlyZCBpcyBmb3IKKyAqIFJlbW90ZSBEZXNrdG9wIFZpcnR1YWxpemF0aW9uLgorICoge2Y4ZTY1NzE2LTNjYjMtNGEwNi05YTYwLTE4ODljNWNjY2FiNX0KKyAqIHszMzc1YmFmNC05ZTE1LTRiMzAtYjc2NS02N2FjYjEwZDYwN2J9CisgKiB7Mjc2YWFjZjQtYWMxNS00MjZjLTk4ZGQtNzUyMWFkM2YwMWZlfQorICovCisKKyNkZWZpbmUgSFZfQVZNQTFfR1VJRCBcCisJLmd1aWQgPSBVVUlEX0xFKDB4ZjhlNjU3MTYsIDB4M2NiMywgMHg0YTA2LCAweDlhLCAweDYwLCBcCisJCQkweDE4LCAweDg5LCAweGM1LCAweGNjLCAweGNhLCAweGI1KQorCisjZGVmaW5lIEhWX0FWTUEyX0dVSUQgXAorCS5ndWlkID0gVVVJRF9MRSgweDMzNzViYWY0LCAweDllMTUsIDB4NGIzMCwgMHhiNywgMHg2NSwgXAorCQkJMHg2NywgMHhhYywgMHhiMSwgMHgwZCwgMHg2MCwgMHg3YikKKworI2RlZmluZSBIVl9SRFZfR1VJRCBcCisJLmd1aWQgPSBVVUlEX0xFKDB4Mjc2YWFjZjQsIDB4YWMxNSwgMHg0MjZjLCAweDk4LCAweGRkLCBcCisJCQkweDc1LCAweDIxLCAweGFkLCAweDNmLCAweDAxLCAweGZlKQorCisvKgogICogQ29tbW9uIGhlYWRlciBmb3IgSHlwZXItViBJQ3MKICAqLwogCkBAIC0xMzQ0LDYgKzE0MjcsMTUgQEAKIAl1OCBmbGFnczsKIH0gX19wYWNrZWQ7CiAKK3N0cnVjdCBpY3RpbWVzeW5jX3JlZl9kYXRhIHsKKwl1NjQgcGFyZW50dGltZTsKKwl1NjQgdm1yZWZlcmVuY2V0aW1lOworCXU4IGZsYWdzOworCWNoYXIgbGVhcGZsYWdzOworCWNoYXIgc3RyYXR1bTsKKwl1OCByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKIHN0cnVjdCBoeXBlcnZfc2VydmljZV9jYWxsYmFjayB7CiAJdTggbXNnX3R5cGU7CiAJY2hhciAqbG9nX21zZzsKQEAgLTEzNTcsNiArMTQ0OSw5IEBACiAJCQkJCXN0cnVjdCBpY21zZ19uZWdvdGlhdGUgKiwgdTggKiwgaW50LAogCQkJCQlpbnQpOwogCit2b2lkIGh2X2V2ZW50X3Rhc2tsZXRfZGlzYWJsZShzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCk7Cit2b2lkIGh2X2V2ZW50X3Rhc2tsZXRfZW5hYmxlKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKTsKKwogdm9pZCBodl9wcm9jZXNzX2NoYW5uZWxfcmVtb3ZhbChzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHJlbGlkKTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHlwZXJ2aXNvci5oIGIvaW5jbHVkZS9saW51eC9oeXBlcnZpc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhNWVmMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaHlwZXJ2aXNvci5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgX19MSU5VWF9IWVBFVklTT1JfSAorI2RlZmluZSBfX0xJTlVYX0hZUEVWSVNPUl9ICisKKy8qCisgKglHZW5lcmljIEh5cGVydmlzb3Igc3VwcG9ydAorICoJCUp1ZXJnZW4gR3Jvc3MgPGpncm9zc0BzdXNlLmNvbT4KKyAqLworCisjaWZkZWYgQ09ORklHX0hZUEVSVklTT1JfR1VFU1QKKyNpbmNsdWRlIDxhc20vaHlwZXJ2aXNvci5oPgorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBoeXBlcnZpc29yX3Bpbl92Y3B1KGludCBjcHUpCit7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTElOVVhfSFlQRVZJU09SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfYnJpZGdlLmggYi9pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oCmluZGV4IGRjYjg5ZTMuLmM2NTg3YzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaApAQCAtNDUsNiArNDUsNyBAQAogI2RlZmluZSBCUl9QUk9YWUFSUAkJQklUKDgpCiAjZGVmaW5lIEJSX0xFQVJOSU5HX1NZTkMJQklUKDkpCiAjZGVmaW5lIEJSX1BST1hZQVJQX1dJRkkJQklUKDEwKQorI2RlZmluZSBCUl9NQ0FTVF9GTE9PRAkJQklUKDExKQogCiAjZGVmaW5lIEJSX0RFRkFVTFRfQUdFSU5HX1RJTUUJKDMwMCAqIEhaKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX2xpbmsuaCBiL2luY2x1ZGUvbGludXgvaWZfbGluay5oCmluZGV4IGY5MjNkMTUuLjBiMTdjNTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfbGluay5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfbGluay5oCkBAIC0yNSw1ICsyNSw2IEBACiAJX191MzIgbWF4X3R4X3JhdGU7CiAJX191MzIgcnNzX3F1ZXJ5X2VuOwogCV9fdTMyIHRydXN0ZWQ7CisJX19iZTE2IHZsYW5fcHJvdG87CiB9OwogI2VuZGlmIC8qIF9MSU5VWF9JRl9MSU5LX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oIGIvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKaW5kZXggYTVmNmNlNi4uMzMxOWQ5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKQEAgLTgxLDYgKzgxLDcgQEAKICNkZWZpbmUgc2tiX3ZsYW5fdGFnX3ByZXNlbnQoX19za2IpCSgoX19za2IpLT52bGFuX3RjaSAmIFZMQU5fVEFHX1BSRVNFTlQpCiAjZGVmaW5lIHNrYl92bGFuX3RhZ19nZXQoX19za2IpCQkoKF9fc2tiKS0+dmxhbl90Y2kgJiB+VkxBTl9UQUdfUFJFU0VOVCkKICNkZWZpbmUgc2tiX3ZsYW5fdGFnX2dldF9pZChfX3NrYikJKChfX3NrYiktPnZsYW5fdGNpICYgVkxBTl9WSURfTUFTSykKKyNkZWZpbmUgc2tiX3ZsYW5fdGFnX2dldF9wcmlvKF9fc2tiKQkoKF9fc2tiKS0+dmxhbl90Y2kgJiBWTEFOX1BSSU9fTUFTSykKIAogLyoqCiAgKglzdHJ1Y3Qgdmxhbl9wY3B1X3N0YXRzIC0gVkxBTiBwZXJjcHUgcngvdHggc3RhdHMKQEAgLTI3MSw2ICsyNzIsMjMgQEAKIH0KICNlbmRpZgogCisvKioKKyAqIGV0aF90eXBlX3ZsYW4gLSBjaGVjayBmb3IgdmFsaWQgdmxhbiBldGhlciB0eXBlLgorICogQGV0aGVydHlwZTogZXRoZXIgdHlwZSB0byBjaGVjaworICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXRoZXIgdHlwZSBpcyBhIHZsYW4gZXRoZXIgdHlwZS4KKyAqLworc3RhdGljIGlubGluZSBib29sIGV0aF90eXBlX3ZsYW4oX19iZTE2IGV0aGVydHlwZSkKK3sKKwlzd2l0Y2ggKGV0aGVydHlwZSkgeworCWNhc2UgaHRvbnMoRVRIX1BfODAyMVEpOgorCWNhc2UgaHRvbnMoRVRIX1BfODAyMUFEKToKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKwogc3RhdGljIGlubGluZSBib29sIHZsYW5faHdfb2ZmbG9hZF9jYXBhYmxlKG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzLAogCQkJCQkgICBfX2JlMTYgcHJvdG8pCiB7CkBAIC00MjQsOCArNDQyLDcgQEAKIHsKIAlzdHJ1Y3Qgdmxhbl9ldGhoZHIgKnZldGggPSAoc3RydWN0IHZsYW5fZXRoaGRyICopc2tiLT5kYXRhOwogCi0JaWYgKHZldGgtPmhfdmxhbl9wcm90byAhPSBodG9ucyhFVEhfUF84MDIxUSkgJiYKLQkgICAgdmV0aC0+aF92bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFBRCkpCisJaWYgKCFldGhfdHlwZV92bGFuKHZldGgtPmhfdmxhbl9wcm90bykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJKnZsYW5fdGNpID0gbnRvaHModmV0aC0+aF92bGFuX1RDSSk7CkBAIC00ODcsNyArNTA0LDcgQEAKIAkgKiBwcmVzZW50IGF0IG1hY19sZW4gLSBWTEFOX0hMRU4gKGlmIG1hY19sZW4gPiAwKSwgb3IgYXQKIAkgKiBFVEhfSExFTiBvdGhlcndpc2UKIAkgKi8KLQlpZiAodHlwZSA9PSBodG9ucyhFVEhfUF84MDIxUSkgfHwgdHlwZSA9PSBodG9ucyhFVEhfUF84MDIxQUQpKSB7CisJaWYgKGV0aF90eXBlX3ZsYW4odHlwZSkpIHsKIAkJaWYgKHZsYW5fZGVwdGgpIHsKIAkJCWlmIChXQVJOX09OKHZsYW5fZGVwdGggPCBWTEFOX0hMRU4pKQogCQkJCXJldHVybiAwOwpAQCAtNTA1LDggKzUyMiw3IEBACiAJCQl2aCA9IChzdHJ1Y3Qgdmxhbl9oZHIgKikoc2tiLT5kYXRhICsgdmxhbl9kZXB0aCk7CiAJCQl0eXBlID0gdmgtPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG87CiAJCQl2bGFuX2RlcHRoICs9IFZMQU5fSExFTjsKLQkJfSB3aGlsZSAodHlwZSA9PSBodG9ucyhFVEhfUF84MDIxUSkgfHwKLQkJCSB0eXBlID09IGh0b25zKEVUSF9QXzgwMjFBRCkpOworCQl9IHdoaWxlIChldGhfdHlwZV92bGFuKHR5cGUpKTsKIAl9CiAKIAlpZiAoZGVwdGgpCkBAIC01NzEsOCArNTg3LDcgQEAKIHN0YXRpYyBpbmxpbmUgYm9vbCBza2Jfdmxhbl90YWdnZWQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpZiAoIXNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikgJiYKLQkgICAgbGlrZWx5KHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfODAyMVEpICYmCi0JCSAgIHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfODAyMUFEKSkpCisJICAgIGxpa2VseSghZXRoX3R5cGVfdmxhbihza2ItPnByb3RvY29sKSkpCiAJCXJldHVybiBmYWxzZTsKIAogCXJldHVybiB0cnVlOwpAQCAtNTkyLDE1ICs2MDcsMTQgQEAKIAlpZiAoIXNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpIHsKIAkJc3RydWN0IHZsYW5fZXRoaGRyICp2ZWg7CiAKLQkJaWYgKGxpa2VseShwcm90b2NvbCAhPSBodG9ucyhFVEhfUF84MDIxUSkgJiYKLQkJCSAgIHByb3RvY29sICE9IGh0b25zKEVUSF9QXzgwMjFBRCkpKQorCQlpZiAobGlrZWx5KCFldGhfdHlwZV92bGFuKHByb3RvY29sKSkpCiAJCQlyZXR1cm4gZmFsc2U7CiAKIAkJdmVoID0gKHN0cnVjdCB2bGFuX2V0aGhkciAqKXNrYi0+ZGF0YTsKIAkJcHJvdG9jb2wgPSB2ZWgtPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG87CiAJfQogCi0JaWYgKHByb3RvY29sICE9IGh0b25zKEVUSF9QXzgwMjFRKSAmJiBwcm90b2NvbCAhPSBodG9ucyhFVEhfUF84MDIxQUQpKQorCWlmICghZXRoX3R5cGVfdmxhbihwcm90b2NvbCkpCiAJCXJldHVybiBmYWxzZTsKIAogCXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9paW8vY29uc3VtZXIuaCBiL2luY2x1ZGUvbGludXgvaWlvL2NvbnN1bWVyLmgKaW5kZXggM2Q2NzJmNy4uOWVkY2NmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9paW8vY29uc3VtZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lpby9jb25zdW1lci5oCkBAIC0xNjUsNiArMTY1LDE4IEBACiAqaWlvX2NoYW5uZWxfY2JfZ2V0X2NoYW5uZWxzKGNvbnN0IHN0cnVjdCBpaW9fY2JfYnVmZmVyICpjYl9idWZmZXIpOwogCiAvKioKKyAqIGlpb19jaGFubmVsX2NiX2dldF9paW9fZGV2KCkgLSBnZXQgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAqIEBjYl9idWZmZXI6CQlUaGUgY2FsbGJhY2sgYnVmZmVyIGZyb20gd2hvbSB3ZSB3YW50IHRoZSBkZXZpY2UKKyAqCQkJaW5mb3JtYXRpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvd3Mgb25lIHRvIG9idGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlLgorICogVGhlIHByaW1hcnkgYWltIGlzIHRvIGFsbG93IGRyaXZlcnMgdGhhdCBhcmUgY29uc3VtaW5nIGEgZGV2aWNlIHRvIHF1ZXJ5CisgKiB0aGluZ3MgbGlrZSBjdXJyZW50IHRyaWdnZXIuCisgKi8KK3N0cnVjdCBpaW9fZGV2CisqaWlvX2NoYW5uZWxfY2JfZ2V0X2lpb19kZXYoY29uc3Qgc3RydWN0IGlpb19jYl9idWZmZXIgKmNiX2J1ZmZlcik7CisKKy8qKgogICogaWlvX3JlYWRfY2hhbm5lbF9yYXcoKSAtIHJlYWQgZnJvbSBhIGdpdmVuIGNoYW5uZWwKICAqIEBjaGFuOgkJVGhlIGNoYW5uZWwgYmVpbmcgcXVlcmllZC4KICAqIEB2YWw6CQlWYWx1ZSByZWFkIGJhY2suCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lpby9paW8uaCBiL2luY2x1ZGUvbGludXgvaWlvL2lpby5oCmluZGV4IDg1NGUyZGEuLmI0YTA2NzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWlvL2lpby5oCisrKyBiL2luY2x1ZGUvbGludXgvaWlvL2lpby5oCkBAIC00ODMsNiArNDgzLDcgQEAKICAqIEBzY2FuX3RpbWVzdGFtcDoJW0lOVEVSTl0gc2V0IGlmIGFueSBidWZmZXJzIGhhdmUgcmVxdWVzdGVkIHRpbWVzdGFtcAogICogQHNjYW5faW5kZXhfdGltZXN0YW1wOltJTlRFUk5dIGNhY2hlIG9mIHRoZSBpbmRleCB0byB0aGUgdGltZXN0YW1wCiAgKiBAdHJpZzoJCVtJTlRFUk5dIGN1cnJlbnQgZGV2aWNlIHRyaWdnZXIgKGJ1ZmZlciBtb2RlcykKKyAqIEB0cmlnX3JlYWRvbmx5CVtJTlRFUk5dIG1hcmsgdGhlIGN1cnJlbnQgdHJpZ2dlciBpbW11dGFibGUKICAqIEBwb2xsZnVuYzoJCVtEUklWRVJdIGZ1bmN0aW9uIHJ1biBvbiB0cmlnZ2VyIGJlaW5nIHJlY2VpdmVkCiAgKiBAcG9sbGZ1bmNfZXZlbnQ6CVtEUklWRVJdIGZ1bmN0aW9uIHJ1biBvbiBldmVudHMgdHJpZ2dlciBiZWluZyByZWNlaXZlZAogICogQGNoYW5uZWxzOgkJW0RSSVZFUl0gY2hhbm5lbCBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSB0YWJsZQpAQCAtNTIzLDYgKzUyNCw3IEBACiAJYm9vbAkJCQlzY2FuX3RpbWVzdGFtcDsKIAl1bnNpZ25lZAkJCXNjYW5faW5kZXhfdGltZXN0YW1wOwogCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CisJYm9vbAkJCQl0cmlnX3JlYWRvbmx5OwogCXN0cnVjdCBpaW9fcG9sbF9mdW5jCQkqcG9sbGZ1bmM7CiAJc3RydWN0IGlpb19wb2xsX2Z1bmMJCSpwb2xsZnVuY19ldmVudDsKIApAQCAtNjQyLDYgKzY0NCw3IEBACiB9CiAKIHZvaWQgaWlvX2RldmljZV9mcmVlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworaW50IGRldm1faWlvX2RldmljZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcywgdm9pZCAqZGF0YSk7CiBzdHJ1Y3QgaWlvX2RldiAqZGV2bV9paW9fZGV2aWNlX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNpemVvZl9wcml2KTsKIHZvaWQgZGV2bV9paW9fZGV2aWNlX2ZyZWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIHN0cnVjdCBpaW9fdHJpZ2dlciAqZGV2bV9paW9fdHJpZ2dlcl9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lpby9zd190cmlnZ2VyLmggYi9pbmNsdWRlL2xpbnV4L2lpby9zd190cmlnZ2VyLmgKaW5kZXggNTE5OGY4ZS4uYzk3ZWFiNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9paW8vc3dfdHJpZ2dlci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWlvL3N3X3RyaWdnZXIuaApAQCAtNjIsNyArNjIsNyBAQAogCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgIHN0cnVjdCBjb25maWdfaXRlbV90eXBlICp0eXBlKQogewotI2lmZGVmIENPTkZJR19DT05GSUdGU19GUworI2lmIElTX0VOQUJMRUQoQ09ORklHX0NPTkZJR0ZTX0ZTKQogCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZSgmdC0+Z3JvdXAsIG5hbWUsIHR5cGUpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lpby90cmlnZ2VyLmggYi9pbmNsdWRlL2xpbnV4L2lpby90cmlnZ2VyLmgKaW5kZXggMWM5ZTAyOC4uNGYxMTU0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9paW8vdHJpZ2dlci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWlvL3RyaWdnZXIuaApAQCAtNTYsNiArNTYsOSBAQAogICogQHN1YmlycXM6CQlbSU5URVJOXSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgJ2NoaWxkJyBpcnFzLgogICogQHBvb2w6CQlbSU5URVJOXSBiaXRtYXAgb2YgaXJxcyBjdXJyZW50bHkgaW4gdXNlLgogICogQHBvb2xfbG9jazoJCVtJTlRFUk5dIHByb3RlY3Rpb24gb2YgdGhlIGlycSBwb29sLgorICogQGF0dGFjaGVkX293bl9kZXZpY2U6W0lOVEVSTl0gaWYgd2UgYXJlIHVzaW5nIG91ciBvd24gZGV2aWNlIGFzIHRyaWdnZXIsCisgKgkJCWkuZS4gaWYgd2UgcmVnaXN0ZXJlZCBhIHBvbGwgZnVuY3Rpb24gdG8gdGhlIHNhbWUKKyAqCQkJZGV2aWNlIGFzIHRoZSBvbmUgcHJvdmlkaW5nIHRoZSB0cmlnZ2VyLgogICoqLwogc3RydWN0IGlpb190cmlnZ2VyIHsKIAljb25zdCBzdHJ1Y3QgaWlvX3RyaWdnZXJfb3BzCSpvcHM7CkBAIC03Myw2ICs3Niw3IEBACiAJc3RydWN0IGlpb19zdWJpcnEgc3ViaXJxc1tDT05GSUdfSUlPX0NPTlNVTUVSU19QRVJfVFJJR0dFUl07CiAJdW5zaWduZWQgbG9uZyBwb29sW0JJVFNfVE9fTE9OR1MoQ09ORklHX0lJT19DT05TVU1FUlNfUEVSX1RSSUdHRVIpXTsKIAlzdHJ1Y3QgbXV0ZXgJCQlwb29sX2xvY2s7CisJYm9vbAkJCQlhdHRhY2hlZF9vd25fZGV2aWNlOwogfTsKIAogCkBAIC0xMjUsMTIgKzEyOSwyNyBAQAogICoqLwogaW50IGlpb190cmlnZ2VyX3JlZ2lzdGVyKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZ19pbmZvKTsKIAoraW50IGRldm1faWlvX3RyaWdnZXJfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGlpb190cmlnZ2VyICp0cmlnX2luZm8pOworCiAvKioKICAqIGlpb190cmlnZ2VyX3VucmVnaXN0ZXIoKSAtIHVucmVnaXN0ZXIgYSB0cmlnZ2VyIGZyb20gdGhlIGNvcmUKICAqIEB0cmlnX2luZm86CXRyaWdnZXIgdG8gYmUgdW5yZWdpc3RlcmVkCiAgKiovCiB2b2lkIGlpb190cmlnZ2VyX3VucmVnaXN0ZXIoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnX2luZm8pOwogCit2b2lkIGRldm1faWlvX3RyaWdnZXJfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZ19pbmZvKTsKKworLyoqCisgKiBpaW9fdHJpZ2dlcl9zZXRfaW1tdXRhYmxlKCkgLSBzZXQgYW4gaW1tdXRhYmxlIHRyaWdnZXIgb24gZGVzdGluYXRpb24KKyAqCisgKiBAaW5kaW9fZGV2IC0gSUlPIGRldmljZSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgZGV2aWNlCisgKiBAdHJpZyAtIHRyaWdnZXIgdG8gYXNzaWduIHRvIGRldmljZQorICoKKyAqKi8KK2ludCBpaW9fdHJpZ2dlcl9zZXRfaW1tdXRhYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyk7CisKIC8qKgogICogaWlvX3RyaWdnZXJfcG9sbCgpIC0gY2FsbGVkIG9uIGEgdHJpZ2dlciBvY2N1cnJpbmcKICAqIEB0cmlnOgl0cmlnZ2VyIHdoaWNoIG9jY3VycmVkCkBAIC0xNDUsNiArMTY0LDEzIEBACiBfX3ByaW50ZigxLCAyKSBzdHJ1Y3QgaWlvX3RyaWdnZXIgKmlpb190cmlnZ2VyX2FsbG9jKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIHZvaWQgaWlvX3RyaWdnZXJfZnJlZShzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcpOwogCisvKioKKyAqIGlpb190cmlnZ2VyX3VzaW5nX293bigpIC0gdGVsbHMgdXMgaWYgd2UgdXNlIG91ciBvd24gSFcgdHJpZ2dlciBvdXJzZWx2ZXMKKyAqIEBpbmRpb19kZXY6ICBkZXZpY2UgdG8gY2hlY2sKKyAqLworYm9vbCBpaW9fdHJpZ2dlcl91c2luZ19vd24oc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKKwogI2Vsc2UKIHN0cnVjdCBpaW9fdHJpZ2dlcjsKIHN0cnVjdCBpaW9fdHJpZ2dlcl9vcHM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmggYi9pbmNsdWRlL2xpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmgKaW5kZXggZjcyZjcwZC4uMzAxNDU2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9paW8vdHJpZ2dlcmVkX2J1ZmZlci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWlvL3RyaWdnZXJlZF9idWZmZXIuaApAQCAtMTIsNCArMTIsMTIgQEAKIAljb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgKnNldHVwX29wcyk7CiB2b2lkIGlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKK2ludCBkZXZtX2lpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgaXJxcmV0dXJuX3QgKCpoKShpbnQgaXJxLCB2b2lkICpwKSwKKwkJCQkgICAgaXJxcmV0dXJuX3QgKCp0aHJlYWQpKGludCBpcnEsIHZvaWQgKnApLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgKm9wcyk7Cit2b2lkIGRldm1faWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5ldF9kaWFnLmggYi9pbmNsdWRlL2xpbnV4L2luZXRfZGlhZy5oCmluZGV4IGZlYjA0ZWEuLjY1ZGE0MzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5ldF9kaWFnLmgKKysrIGIvaW5jbHVkZS9saW51eC9pbmV0X2RpYWcuaApAQCAtMzcsNyArMzcsNyBAQAogCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqcmVxLAogCQkgICAgICBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnMsCiAJCSAgICAgIHUzMiBwaWQsIHUzMiBzZXEsIHUxNiBubG1zZ19mbGFncywKLQkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoKTsKKwkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoLCBib29sIG5ldF9hZG1pbik7CiB2b2lkIGluZXRfZGlhZ19kdW1wX2ljc2soc3RydWN0IGluZXRfaGFzaGluZm8gKmgsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogCQkJIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyLApAQCAtNTYsNyArNTYsNyBAQAogCiBpbnQgaW5ldF9kaWFnX21zZ19hdHRyc19maWxsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgc3RydWN0IGluZXRfZGlhZ19tc2cgKnIsIGludCBleHQsCi0JCQkgICAgIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucyk7CisJCQkgICAgIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucywgYm9vbCBuZXRfYWRtaW4pOwogCiBleHRlcm4gaW50ICBpbmV0X2RpYWdfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyICpoYW5kbGVyKTsKIGV4dGVybiB2b2lkIGluZXRfZGlhZ191bnJlZ2lzdGVyKGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfaGFuZGxlciAqaGFuZGxlcik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oIGIvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaAppbmRleCBmODgzNGY4Li4zMjVmNjQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKQEAgLTE1LDYgKzE1LDggQEAKICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkL3J0Lmg+CiAKKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KKwogI2lmZGVmIENPTkZJR19TTVAKICMgZGVmaW5lIElOSVRfUFVTSEFCTEVfVEFTS1ModHNrKQkJCQkJXAogCS5wdXNoYWJsZV90YXNrcyA9IFBMSVNUX05PREVfSU5JVCh0c2sucHVzaGFibGVfdGFza3MsIE1BWF9QUklPKSwKQEAgLTE4MywxMiArMTg1LDIxIEBACiAjIGRlZmluZSBJTklUX0tBU0FOKHRzaykKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1RIUkVBRF9JTkZPX0lOX1RBU0sKKyMgZGVmaW5lIElOSVRfVEFTS19USSh0c2spCQkJXAorCS50aHJlYWRfaW5mbyA9IElOSVRfVEhSRUFEX0lORk8odHNrKSwJXAorCS5zdGFja19yZWZjb3VudCA9IEFUT01JQ19JTklUKDEpLAorI2Vsc2UKKyMgZGVmaW5lIElOSVRfVEFTS19USSh0c2spCisjZW5kaWYKKwogLyoKICAqICBJTklUX1RBU0sgaXMgdXNlZCB0byBzZXQgdXAgdGhlIGZpcnN0IHRhc2sgdGFibGUsIHRvdWNoIGF0CiAgKiB5b3VyIG93biByaXNrIS4gQmFzZT0wLCBsaW1pdD0weDFmZmZmZiAoPTJNQikKICAqLwogI2RlZmluZSBJTklUX1RBU0sodHNrKQlcCiB7CQkJCQkJCQkJXAorCUlOSVRfVEFTS19USSh0c2spCQkJCQkJXAogCS5zdGF0ZQkJPSAwLAkJCQkJCVwKIAkuc3RhY2sJCT0gaW5pdF9zdGFjaywJCQkJCVwKIAkudXNhZ2UJCT0gQVRPTUlDX0lOSVQoMiksCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmggYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCmluZGV4IGI2NjgzZjAuLjcyZjA3MjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaApAQCAtMjc4LDcgKzI3OCw4IEBACiBleHRlcm4gaW50CiBpcnFfc2V0X2FmZmluaXR5X25vdGlmaWVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfYWZmaW5pdHlfbm90aWZ5ICpub3RpZnkpOwogCi1zdHJ1Y3QgY3B1bWFzayAqaXJxX2NyZWF0ZV9hZmZpbml0eV9tYXNrKHVuc2lnbmVkIGludCAqbnJfdmVjcyk7CitzdHJ1Y3QgY3B1bWFzayAqaXJxX2NyZWF0ZV9hZmZpbml0eV9tYXNrcyhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYWZmaW5pdHksIGludCBudmVjKTsKK2ludCBpcnFfY2FsY19hZmZpbml0eV92ZWN0b3JzKGNvbnN0IHN0cnVjdCBjcHVtYXNrICphZmZpbml0eSwgaW50IG1heHZlYyk7CiAKICNlbHNlIC8qIENPTkZJR19TTVAgKi8KIApAQCAtMzExLDExICszMTIsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgY3B1bWFzayAqaXJxX2NyZWF0ZV9hZmZpbml0eV9tYXNrKHVuc2lnbmVkIGludCAqbnJfdmVjcykKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNwdW1hc2sgKgoraXJxX2NyZWF0ZV9hZmZpbml0eV9tYXNrcyhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYWZmaW5pdHksIGludCBudmVjKQogewotCSpucl92ZWNzID0gMTsKIAlyZXR1cm4gTlVMTDsKIH0KKworc3RhdGljIGlubGluZSBpbnQKK2lycV9jYWxjX2FmZmluaXR5X3ZlY3RvcnMoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmFmZmluaXR5LCBpbnQgbWF4dmVjKQoreworCXJldHVybiBtYXh2ZWM7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lwdjYuaCBiL2luY2x1ZGUvbGludXgvaXB2Ni5oCmluZGV4IGM2ZGJjZDguLjdlOWE3ODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXB2Ni5oCisrKyBiL2luY2x1ZGUvbGludXgvaXB2Ni5oCkBAIC0xOCw2ICsxOCw3IEBACiAJX19zMzIJCWRhZF90cmFuc21pdHM7CiAJX19zMzIJCXJ0cl9zb2xpY2l0czsKIAlfX3MzMgkJcnRyX3NvbGljaXRfaW50ZXJ2YWw7CisJX19zMzIJCXJ0cl9zb2xpY2l0X21heF9pbnRlcnZhbDsKIAlfX3MzMgkJcnRyX3NvbGljaXRfZGVsYXk7CiAJX19zMzIJCWZvcmNlX21sZF92ZXJzaW9uOwogCV9fczMyCQltbGR2MV91bnNvbGljaXRlZF9yZXBvcnRfaW50ZXJ2YWw7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycS5oIGIvaW5jbHVkZS9saW51eC9pcnEuaAppbmRleCBiNTI0MjRlLi5lNzk4NzU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTkxNiwxMiArOTE2LDIwIEBACiAJCQkgICAgIHVuc2lnbmVkIGludCBjbHIsIHVuc2lnbmVkIGludCBzZXQpOwogCiBzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqaXJxX2dldF9kb21haW5fZ2VuZXJpY19jaGlwKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBpbnQgaHdfaXJxKTsKLWludCBpcnFfYWxsb2NfZG9tYWluX2dlbmVyaWNfY2hpcHMoc3RydWN0IGlycV9kb21haW4gKmQsIGludCBpcnFzX3Blcl9jaGlwLAotCQkJCSAgIGludCBudW1fY3QsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgaXJxX2Zsb3dfaGFuZGxlcl90IGhhbmRsZXIsCi0JCQkJICAgdW5zaWduZWQgaW50IGNsciwgdW5zaWduZWQgaW50IHNldCwKLQkJCQkgICBlbnVtIGlycV9nY19mbGFncyBmbGFncyk7CiAKK2ludCBfX2lycV9hbGxvY19kb21haW5fZ2VuZXJpY19jaGlwcyhzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwgaW50IGlycXNfcGVyX2NoaXAsCisJCQkJICAgICBpbnQgbnVtX2N0LCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgaXJxX2Zsb3dfaGFuZGxlcl90IGhhbmRsZXIsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY2xyLCB1bnNpZ25lZCBpbnQgc2V0LAorCQkJCSAgICAgZW51bSBpcnFfZ2NfZmxhZ3MgZmxhZ3MpOworCisjZGVmaW5lIGlycV9hbGxvY19kb21haW5fZ2VuZXJpY19jaGlwcyhkLCBpcnFzX3Blcl9jaGlwLCBudW1fY3QsIG5hbWUsCVwKKwkJCQkgICAgICAgaGFuZGxlciwJY2xyLCBzZXQsIGZsYWdzKQlcCisoewkJCQkJCQkJCVwKKwlNQVlCRV9CVUlMRF9CVUdfT04oaXJxc19wZXJfY2hpcCA+IDMyKTsJCQkJXAorCV9faXJxX2FsbG9jX2RvbWFpbl9nZW5lcmljX2NoaXBzKGQsIGlycXNfcGVyX2NoaXAsIG51bV9jdCwgbmFtZSxcCisJCQkJCSBoYW5kbGVyLCBjbHIsIHNldCwgZmxhZ3MpOwlcCit9KQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpcnFfY2hpcF90eXBlICppcnFfZGF0YV9nZXRfY2hpcF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKQEAgLTk0NSw2ICs5NTMsMTYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpcnFfZ2NfdW5sb2NrKHN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYykgeyB9CiAjZW5kaWYKIAorLyoKKyAqIFRoZSBpcnFzYXZlIHZhcmlhbnRzIGFyZSBmb3IgdXNhZ2UgaW4gbm9uIGludGVycnVwdCBjb2RlLiBEbyBub3QgdXNlCisgKiB0aGVtIGluIGlycV9jaGlwIGNhbGxiYWNrcy4gVXNlIGlycV9nY19sb2NrKCkgaW5zdGVhZC4KKyAqLworI2RlZmluZSBpcnFfZ2NfbG9ja19pcnFzYXZlKGdjLCBmbGFncykJXAorCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmKGdjKS0+bG9jaywgZmxhZ3MpCisKKyNkZWZpbmUgaXJxX2djX3VubG9ja19pcnFyZXN0b3JlKGdjLCBmbGFncykJXAorCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCYoZ2MpLT5sb2NrLCBmbGFncykKKwogc3RhdGljIGlubGluZSB2b2lkIGlycV9yZWdfd3JpdGVsKHN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYywKIAkJCQkgIHUzMiB2YWwsIGludCByZWdfb2Zmc2V0KQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnFjaGlwL2FybS1naWMtdjMuaCBiL2luY2x1ZGUvbGludXgvaXJxY2hpcC9hcm0tZ2ljLXYzLmgKaW5kZXggNTZiMGI3ZS4uODM2MWM4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnFjaGlwL2FybS1naWMtdjMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycWNoaXAvYXJtLWdpYy12My5oCkBAIC0zMzcsNiArMzM3LDcgQEAKICAqLwogI2RlZmluZSBFX0lUU19NT1ZJX1VOTUFQUEVEX0lOVEVSUlVQVAkJMHgwMTAxMDcKICNkZWZpbmUgRV9JVFNfTU9WSV9VTk1BUFBFRF9DT0xMRUNUSU9OCQkweDAxMDEwOQorI2RlZmluZSBFX0lUU19JTlRfVU5NQVBQRURfSU5URVJSVVBUCQkweDAxMDMwNwogI2RlZmluZSBFX0lUU19DTEVBUl9VTk1BUFBFRF9JTlRFUlJVUFQJCTB4MDEwNTA3CiAjZGVmaW5lIEVfSVRTX01BUERfREVWSUNFX09PUgkJCTB4MDEwODAxCiAjZGVmaW5lIEVfSVRTX01BUENfUFJPQ05VTV9PT1IJCQkweDAxMDkwMgpAQCAtNDI5LDkgKzQzMCw5IEBACiB9OwogCiBzdHJ1Y3QgaXJxX2RvbWFpbjsKLXN0cnVjdCBkZXZpY2Vfbm9kZTsKK3N0cnVjdCBmd25vZGVfaGFuZGxlOwogaW50IGl0c19jcHVfaW5pdCh2b2lkKTsKLWludCBpdHNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHN0cnVjdCByZGlzdHMgKnJkaXN0cywKK2ludCBpdHNfaW5pdChzdHJ1Y3QgZndub2RlX2hhbmRsZSAqaGFuZGxlLCBzdHJ1Y3QgcmRpc3RzICpyZGlzdHMsCiAJICAgICBzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluKTsKIAogc3RhdGljIGlubGluZSBib29sIGdpY19lbmFibGVfc3JlKHZvaWQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycWRlc2MuaCBiL2luY2x1ZGUvbGludXgvaXJxZGVzYy5oCmluZGV4IGI1MWJlZWIuLmM5YmU1NzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXJxZGVzYy5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxZGVzYy5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfTElOVVhfSVJRREVTQ19ICiAKICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KIAogLyoKICAqIENvcmUgaW50ZXJuYWwgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBpcnEgZGVzY3JpcHRvcnMKQEAgLTQzLDYgKzQ0LDcgQEAKICAqIEBmb3JjZV9yZXN1bWVfZGVwdGg6CW51bWJlciBvZiBpcnFhY3Rpb25zIG9uIGEgaXJxIGRlc2NyaXB0b3Igd2l0aAogICoJCQlJUlFGX0ZPUkNFX1JFU1VNRSBzZXQKICAqIEByY3U6CQlyY3UgaGVhZCBmb3IgZGVsYXllZCBmcmVlCisgKiBAa29iajoJCWtvYmplY3QgdXNlZCB0byByZXByZXNlbnQgdGhpcyBzdHJ1Y3QgaW4gc3lzZnMKICAqIEBkaXI6CQkvcHJvYy9pcnEvIHByb2NmcyBlbnRyeQogICogQG5hbWU6CQlmbG93IGhhbmRsZXIgbmFtZSBmb3IgL3Byb2MvaW50ZXJydXB0cyBvdXRwdXQKICAqLwpAQCAtODgsNiArOTAsNyBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NQQVJTRV9JUlEKIAlzdHJ1Y3QgcmN1X2hlYWQJCXJjdTsKKwlzdHJ1Y3Qga29iamVjdAkJa29iajsKICNlbmRpZgogCWludAkJCXBhcmVudF9pcnE7CiAJc3RydWN0IG1vZHVsZQkJKm93bmVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qdW1wX2xhYmVsLmggYi9pbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWwuaAppbmRleCA2NjFhZjU2Li5hMDU0N2M1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWwuaApAQCAtMjEsNiArMjEsOCBAQAogICoKICAqIERFRklORV9TVEFUSUNfS0VZX1RSVUUoa2V5KTsKICAqIERFRklORV9TVEFUSUNfS0VZX0ZBTFNFKGtleSk7CisgKiBERUZJTkVfU1RBVElDX0tFWV9BUlJBWV9UUlVFKGtleXMsIGNvdW50KTsKKyAqIERFRklORV9TVEFUSUNfS0VZX0FSUkFZX0ZBTFNFKGtleXMsIGNvdW50KTsKICAqIHN0YXRpY19icmFuY2hfbGlrZWx5KCkKICAqIHN0YXRpY19icmFuY2hfdW5saWtlbHkoKQogICoKQEAgLTI2Nyw5ICsyNjksMjUgQEAKICNkZWZpbmUgREVGSU5FX1NUQVRJQ19LRVlfVFJVRShuYW1lKQlcCiAJc3RydWN0IHN0YXRpY19rZXlfdHJ1ZSBuYW1lID0gU1RBVElDX0tFWV9UUlVFX0lOSVQKIAorI2RlZmluZSBERUNMQVJFX1NUQVRJQ19LRVlfVFJVRShuYW1lKQlcCisJZXh0ZXJuIHN0cnVjdCBzdGF0aWNfa2V5X3RydWUgbmFtZQorCiAjZGVmaW5lIERFRklORV9TVEFUSUNfS0VZX0ZBTFNFKG5hbWUpCVwKIAlzdHJ1Y3Qgc3RhdGljX2tleV9mYWxzZSBuYW1lID0gU1RBVElDX0tFWV9GQUxTRV9JTklUCiAKKyNkZWZpbmUgREVDTEFSRV9TVEFUSUNfS0VZX0ZBTFNFKG5hbWUpCVwKKwlleHRlcm4gc3RydWN0IHN0YXRpY19rZXlfZmFsc2UgbmFtZQorCisjZGVmaW5lIERFRklORV9TVEFUSUNfS0VZX0FSUkFZX1RSVUUobmFtZSwgY291bnQpCQlcCisJc3RydWN0IHN0YXRpY19rZXlfdHJ1ZSBuYW1lW2NvdW50XSA9IHsJCQlcCisJCVswIC4uLiAoY291bnQpIC0gMV0gPSBTVEFUSUNfS0VZX1RSVUVfSU5JVCwJXAorCX0KKworI2RlZmluZSBERUZJTkVfU1RBVElDX0tFWV9BUlJBWV9GQUxTRShuYW1lLCBjb3VudCkJCVwKKwlzdHJ1Y3Qgc3RhdGljX2tleV9mYWxzZSBuYW1lW2NvdW50XSA9IHsJCQlcCisJCVswIC4uLiAoY291bnQpIC0gMV0gPSBTVEFUSUNfS0VZX0ZBTFNFX0lOSVQsCVwKKwl9CisKIGV4dGVybiBib29sIF9fX193cm9uZ19icmFuY2hfZXJyb3Iodm9pZCk7CiAKICNkZWZpbmUgc3RhdGljX2tleV9lbmFibGVkKHgpCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCmluZGV4IGQ5NmE2MTEuLjc0ZmQ2ZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtMjU5LDE3ICsyNTksMTQgQEAKIGV4dGVybiBzdHJ1Y3QgYXRvbWljX25vdGlmaWVyX2hlYWQgcGFuaWNfbm90aWZpZXJfbGlzdDsKIGV4dGVybiBsb25nICgqcGFuaWNfYmxpbmspKGludCBzdGF0ZSk7CiBfX3ByaW50ZigxLCAyKQotdm9pZCBwYW5pYyhjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX25vcmV0dXJuIF9fY29sZDsKK3ZvaWQgcGFuaWMoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fbm9yZXR1cm4gX19jb2xkOwogdm9pZCBubWlfcGFuaWMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGNvbnN0IGNoYXIgKm1zZyk7CiBleHRlcm4gdm9pZCBvb3BzX2VudGVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgb29wc19leGl0KHZvaWQpOwogdm9pZCBwcmludF9vb3BzX2VuZF9tYXJrZXIodm9pZCk7CiBleHRlcm4gaW50IG9vcHNfbWF5X3ByaW50KHZvaWQpOwotdm9pZCBkb19leGl0KGxvbmcgZXJyb3JfY29kZSkKLQlfX25vcmV0dXJuOwotdm9pZCBjb21wbGV0ZV9hbmRfZXhpdChzdHJ1Y3QgY29tcGxldGlvbiAqLCBsb25nKQotCV9fbm9yZXR1cm47Cit2b2lkIGRvX2V4aXQobG9uZyBlcnJvcl9jb2RlKSBfX25vcmV0dXJuOwordm9pZCBjb21wbGV0ZV9hbmRfZXhpdChzdHJ1Y3QgY29tcGxldGlvbiAqLCBsb25nKSBfX25vcmV0dXJuOwogCiAvKiBJbnRlcm5hbCwgZG8gbm90IHVzZS4gKi8KIGludCBfX211c3RfY2hlY2sgX2tzdHJ0b3VsKGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBsb25nICpyZXMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdGltZS5oIGIvaW5jbHVkZS9saW51eC9rdGltZS5oCmluZGV4IDJiNmEyMDQuLjBmYjdmZmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3RpbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2t0aW1lLmgKQEAgLTY0LDYgKzY0LDEzIEBACiAJCSh7IChrdGltZV90KXsgLnR2NjQgPSAobGhzKS50djY0ICsgKHJocykudHY2NCB9OyB9KQogCiAvKgorICogU2FtZSBhcyBrdGltZV9hZGQoKSwgYnV0IGF2b2lkcyB1bmRlZmluZWQgYmVoYXZpb3VyIG9uIG92ZXJmbG93OyBob3dldmVyLAorICogdGhpcyBtZWFucyB0aGF0IHlvdSBtdXN0IGNoZWNrIHRoZSByZXN1bHQgZm9yIG92ZXJmbG93IHlvdXJzZWxmLgorICovCisjZGVmaW5lIGt0aW1lX2FkZF91bnNhZmUobGhzLCByaHMpIFwKKwkJKHsgKGt0aW1lX3QpeyAudHY2NCA9ICh1NjQpIChsaHMpLnR2NjQgKyAocmhzKS50djY0IH07IH0pCisKKy8qCiAgKiBBZGQgYSBrdGltZV90IHZhcmlhYmxlIGFuZCBhIHNjYWxhciBuYW5vc2Vjb25kIHZhbHVlLgogICogcmVzID0ga3QgKyBuc3ZhbDoKICAqLwpAQCAtMjMxLDYgKzIzOCwxMSBAQAogCXJldHVybiBrdGltZV9zdWJfbnMoa3QsIHVzZWMgKiBOU0VDX1BFUl9VU0VDKTsKIH0KIAorc3RhdGljIGlubGluZSBrdGltZV90IGt0aW1lX3N1Yl9tcyhjb25zdCBrdGltZV90IGt0LCBjb25zdCB1NjQgbXNlYykKK3sKKwlyZXR1cm4ga3RpbWVfc3ViX25zKGt0LCBtc2VjICogTlNFQ19QRVJfTVNFQyk7Cit9CisKIGV4dGVybiBrdGltZV90IGt0aW1lX2FkZF9zYWZlKGNvbnN0IGt0aW1lX3QgbGhzLCBjb25zdCBrdGltZV90IHJocyk7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sZWRzLmggYi9pbmNsdWRlL2xpbnV4L2xlZHMuaAppbmRleCA4YTNiNWQyLi5kZGZjYjJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xlZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xlZHMuaApAQCAtMzU5LDYgKzM1OSwxMSBAQAogCXN0cnVjdCBsZWRfaW5mbwkqbGVkczsKIH07CiAKK3N0cnVjdCBncGlvX2Rlc2M7Cit0eXBlZGVmIGludCAoKmdwaW9fYmxpbmtfc2V0X3QpKHN0cnVjdCBncGlvX2Rlc2MgKmRlc2MsIGludCBzdGF0ZSwKKwkJCQl1bnNpZ25lZCBsb25nICpkZWxheV9vbiwKKwkJCQl1bnNpZ25lZCBsb25nICpkZWxheV9vZmYpOworCiAvKiBGb3IgdGhlIGxlZHMtZ3BpbyBkcml2ZXIgKi8KIHN0cnVjdCBncGlvX2xlZCB7CiAJY29uc3QgY2hhciAqbmFtZTsKQEAgLTM4Miw5ICszODcsNyBAQAogI2RlZmluZSBHUElPX0xFRF9OT19CTElOS19MT1cJMAkvKiBObyBibGluayBHUElPIHN0YXRlIGxvdyAqLwogI2RlZmluZSBHUElPX0xFRF9OT19CTElOS19ISUdICTEJLyogTm8gYmxpbmsgR1BJTyBzdGF0ZSBoaWdoICovCiAjZGVmaW5lIEdQSU9fTEVEX0JMSU5LCQkyCS8qIFBsZWFzZSwgYmxpbmsgKi8KLQlpbnQJCSgqZ3Bpb19ibGlua19zZXQpKHN0cnVjdCBncGlvX2Rlc2MgKmRlc2MsIGludCBzdGF0ZSwKLQkJCQkJdW5zaWduZWQgbG9uZyAqZGVsYXlfb24sCi0JCQkJCXVuc2lnbmVkIGxvbmcgKmRlbGF5X29mZik7CisJZ3Bpb19ibGlua19zZXRfdAlncGlvX2JsaW5rX3NldDsKIH07CiAKICNpZmRlZiBDT05GSUdfTkVXX0xFRFMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGdsb2NrLmggYi9pbmNsdWRlL2xpbnV4L2xnbG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTJlYmQxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbGdsb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogU3BlY2lhbGlzZWQgbG9jYWwtZ2xvYmFsIHNwaW5sb2NrLiBDYW4gb25seSBiZSBkZWNsYXJlZCBhcyBnbG9iYWwgdmFyaWFibGVzCi0gKiB0byBhdm9pZCBvdmVyaGVhZCBhbmQga2VlcCB0aGluZ3Mgc2ltcGxlIChhbmQgd2UgZG9uJ3Qgd2FudCB0byBzdGFydCB1c2luZwotICogdGhlc2UgaW5zaWRlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJ1Y3R1cmVzKS4KLSAqCi0gKiAibG9jYWwvZ2xvYmFsIGxvY2tzIiAobGdsb2NrcykgY2FuIGJlIHVzZWQgdG86Ci0gKgotICogLSBQcm92aWRlIGZhc3QgZXhjbHVzaXZlIGFjY2VzcyB0byBwZXItQ1BVIGRhdGEsIHdpdGggZXhjbHVzaXZlIGFjY2VzcyB0bwotICogICBhbm90aGVyIENQVSdzIGRhdGEgYWxsb3dlZCBidXQgcG9zc2libHkgc3ViamVjdCB0byBjb250ZW50aW9uLCBhbmQgdG8KLSAqICAgcHJvdmlkZSB2ZXJ5IHNsb3cgZXhjbHVzaXZlIGFjY2VzcyB0byBhbGwgcGVyLUNQVSBkYXRhLgotICogLSBPciB0byBwcm92aWRlIHZlcnkgZmFzdCBhbmQgc2NhbGFibGUgcmVhZCBzZXJpYWxpc2F0aW9uLCBhbmQgdG8gcHJvdmlkZQotICogICB2ZXJ5IHNsb3cgZXhjbHVzaXZlIHNlcmlhbGlzYXRpb24gb2YgZGF0YSAobm90IG5lY2Vzc2FyaWx5IHBlci1DUFUgZGF0YSkuCi0gKgotICogQnJsb2NrcyBhcmUgYWxzbyBpbXBsZW1lbnRlZCBhcyBhIHNob3J0LWhhbmQgbm90YXRpb24gZm9yIHRoZSBsYXR0ZXIgdXNlCi0gKiBjYXNlLgotICoKLSAqIENvcHlyaWdodCAyMDA5LCAyMDEwLCBOaWNrIFBpZ2dpbiwgTm92ZWxsIEluYy4KLSAqLwotI2lmbmRlZiBfX0xJTlVYX0xHTE9DS19ICi0jZGVmaW5lIF9fTElOVVhfTEdMT0NLX0gKLQotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgotI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgotI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgotI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+Ci0KLSNpZmRlZiBDT05GSUdfU01QCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfTE9DS19BTExPQwotI2RlZmluZSBMT0NLREVQX0lOSVRfTUFQIGxvY2tkZXBfaW5pdF9tYXAKLSNlbHNlCi0jZGVmaW5lIExPQ0tERVBfSU5JVF9NQVAoYSwgYiwgYywgZCkKLSNlbmRpZgotCi1zdHJ1Y3QgbGdsb2NrIHsKLQlhcmNoX3NwaW5sb2NrX3QgX19wZXJjcHUgKmxvY2s7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MKLQlzdHJ1Y3QgbG9ja19jbGFzc19rZXkgbG9ja19rZXk7Ci0Jc3RydWN0IGxvY2tkZXBfbWFwICAgIGxvY2tfZGVwX21hcDsKLSNlbmRpZgotfTsKLQotI2RlZmluZSBERUZJTkVfTEdMT0NLKG5hbWUpCQkJCQkJXAotCXN0YXRpYyBERUZJTkVfUEVSX0NQVShhcmNoX3NwaW5sb2NrX3QsIG5hbWUgIyMgX2xvY2spCQlcCi0JPSBfX0FSQ0hfU1BJTl9MT0NLX1VOTE9DS0VEOwkJCQkJXAotCXN0cnVjdCBsZ2xvY2sgbmFtZSA9IHsgLmxvY2sgPSAmbmFtZSAjIyBfbG9jayB9Ci0KLSNkZWZpbmUgREVGSU5FX1NUQVRJQ19MR0xPQ0sobmFtZSkJCQkJCVwKLQlzdGF0aWMgREVGSU5FX1BFUl9DUFUoYXJjaF9zcGlubG9ja190LCBuYW1lICMjIF9sb2NrKQkJXAotCT0gX19BUkNIX1NQSU5fTE9DS19VTkxPQ0tFRDsJCQkJCVwKLQlzdGF0aWMgc3RydWN0IGxnbG9jayBuYW1lID0geyAubG9jayA9ICZuYW1lICMjIF9sb2NrIH0KLQotdm9pZCBsZ19sb2NrX2luaXQoc3RydWN0IGxnbG9jayAqbGcsIGNoYXIgKm5hbWUpOwotCi12b2lkIGxnX2xvY2FsX2xvY2soc3RydWN0IGxnbG9jayAqbGcpOwotdm9pZCBsZ19sb2NhbF91bmxvY2soc3RydWN0IGxnbG9jayAqbGcpOwotdm9pZCBsZ19sb2NhbF9sb2NrX2NwdShzdHJ1Y3QgbGdsb2NrICpsZywgaW50IGNwdSk7Ci12b2lkIGxnX2xvY2FsX3VubG9ja19jcHUoc3RydWN0IGxnbG9jayAqbGcsIGludCBjcHUpOwotCi12b2lkIGxnX2RvdWJsZV9sb2NrKHN0cnVjdCBsZ2xvY2sgKmxnLCBpbnQgY3B1MSwgaW50IGNwdTIpOwotdm9pZCBsZ19kb3VibGVfdW5sb2NrKHN0cnVjdCBsZ2xvY2sgKmxnLCBpbnQgY3B1MSwgaW50IGNwdTIpOwotCi12b2lkIGxnX2dsb2JhbF9sb2NrKHN0cnVjdCBsZ2xvY2sgKmxnKTsKLXZvaWQgbGdfZ2xvYmFsX3VubG9jayhzdHJ1Y3QgbGdsb2NrICpsZyk7Ci0KLSNlbHNlCi0vKiBXaGVuICFDT05GSUdfU01QLCBtYXAgbGdsb2NrIHRvIHNwaW5sb2NrICovCi0jZGVmaW5lIGxnbG9jayBzcGlubG9jawotI2RlZmluZSBERUZJTkVfTEdMT0NLKG5hbWUpIERFRklORV9TUElOTE9DSyhuYW1lKQotI2RlZmluZSBERUZJTkVfU1RBVElDX0xHTE9DSyhuYW1lKSBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5hbWUpCi0jZGVmaW5lIGxnX2xvY2tfaW5pdChsZywgbmFtZSkgc3Bpbl9sb2NrX2luaXQobGcpCi0jZGVmaW5lIGxnX2xvY2FsX2xvY2sgc3Bpbl9sb2NrCi0jZGVmaW5lIGxnX2xvY2FsX3VubG9jayBzcGluX3VubG9jawotI2RlZmluZSBsZ19sb2NhbF9sb2NrX2NwdShsZywgY3B1KSBzcGluX2xvY2sobGcpCi0jZGVmaW5lIGxnX2xvY2FsX3VubG9ja19jcHUobGcsIGNwdSkgc3Bpbl91bmxvY2sobGcpCi0jZGVmaW5lIGxnX2dsb2JhbF9sb2NrIHNwaW5fbG9jawotI2RlZmluZSBsZ19nbG9iYWxfdW5sb2NrIHNwaW5fdW5sb2NrCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpc3QuaCBiL2luY2x1ZGUvbGludXgvbGlzdC5oCmluZGV4IDUxODMxMzguLjU4MDllOWEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpc3QuaApAQCAtMzgxLDggKzM4MSwxMSBAQAogICoKICAqIE5vdGUgdGhhdCBpZiB0aGUgbGlzdCBpcyBlbXB0eSwgaXQgcmV0dXJucyBOVUxMLgogICovCi0jZGVmaW5lIGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbChwdHIsIHR5cGUsIG1lbWJlcikgXAotCSghbGlzdF9lbXB0eShwdHIpID8gbGlzdF9maXJzdF9lbnRyeShwdHIsIHR5cGUsIG1lbWJlcikgOiBOVUxMKQorI2RlZmluZSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwocHRyLCB0eXBlLCBtZW1iZXIpICh7IFwKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkX18gPSAocHRyKTsgXAorCXN0cnVjdCBsaXN0X2hlYWQgKnBvc19fID0gUkVBRF9PTkNFKGhlYWRfXy0+bmV4dCk7IFwKKwlwb3NfXyAhPSBoZWFkX18gPyBsaXN0X2VudHJ5KHBvc19fLCB0eXBlLCBtZW1iZXIpIDogTlVMTDsgXAorfSkKIAogLyoqCiAgKiBsaXN0X25leHRfZW50cnkgLSBnZXQgdGhlIG5leHQgZWxlbWVudCBpbiBsaXN0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xzbV9hdWRpdC5oIGIvaW5jbHVkZS9saW51eC9sc21fYXVkaXQuaAppbmRleCBmZmI5YzlkLi5lNThlNTc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xzbV9hdWRpdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbHNtX2F1ZGl0LmgKQEAgLTU5LDYgKzU5LDcgQEAKICNkZWZpbmUgTFNNX0FVRElUX0RBVEFfSU5PREUJOQogI2RlZmluZSBMU01fQVVESVRfREFUQV9ERU5UUlkJMTAKICNkZWZpbmUgTFNNX0FVRElUX0RBVEFfSU9DVExfT1AJMTEKKyNkZWZpbmUgTFNNX0FVRElUX0RBVEFfRklMRQkxMgogCXVuaW9uIAl7CiAJCXN0cnVjdCBwYXRoIHBhdGg7CiAJCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKQEAgLTc1LDYgKzc2LDcgQEAKICNlbmRpZgogCQljaGFyICprbW9kX25hbWU7CiAJCXN0cnVjdCBsc21faW9jdGxvcF9hdWRpdCAqb3A7CisJCXN0cnVjdCBmaWxlICpmaWxlOwogCX0gdTsKIAkvKiB0aGlzIHVuaW9uIGNvbnRhaW5zIExTTSBzcGVjaWZpYyBkYXRhICovCiAJdW5pb24gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sc21faG9va3MuaCBiL2luY2x1ZGUvbGludXgvbHNtX2hvb2tzLmgKaW5kZXggMTAxYmYxOS4uNTU4YWRmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sc21faG9va3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xzbV9ob29rcy5oCkBAIC0xNTEsNiArMTUxLDE2IEBACiAgKglAbmFtZSBuYW1lIG9mIHRoZSBsYXN0IHBhdGggY29tcG9uZW50IHVzZWQgdG8gY3JlYXRlIGZpbGUKICAqCUBjdHggcG9pbnRlciB0byBwbGFjZSB0aGUgcG9pbnRlciB0byB0aGUgcmVzdWx0aW5nIGNvbnRleHQgaW4uCiAgKglAY3R4bGVuIHBvaW50IHRvIHBsYWNlIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyBjb250ZXh0LgorICogQGRlbnRyeV9jcmVhdGVfZmlsZXNfYXM6CisgKglDb21wdXRlIGEgY29udGV4dCBmb3IgYSBkZW50cnkgYXMgdGhlIGlub2RlIGlzIG5vdCB5ZXQgYXZhaWxhYmxlCisgKglhbmQgc2V0IHRoYXQgY29udGV4dCBpbiBwYXNzZWQgaW4gY3JlZHMgc28gdGhhdCBuZXcgZmlsZXMgYXJlCisgKgljcmVhdGVkIHVzaW5nIHRoYXQgY29udGV4dC4gQ29udGV4dCBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZQorICoJcGFzc2VkIGluIGNyZWRzIGFuZCBub3QgdGhlIGNyZWRzIG9mIHRoZSBjYWxsZXIuCisgKglAZGVudHJ5IGRlbnRyeSB0byB1c2UgaW4gY2FsY3VsYXRpbmcgdGhlIGNvbnRleHQuCisgKglAbW9kZSBtb2RlIHVzZWQgdG8gZGV0ZXJtaW5lIHJlc291cmNlIHR5cGUuCisgKglAbmFtZSBuYW1lIG9mIHRoZSBsYXN0IHBhdGggY29tcG9uZW50IHVzZWQgdG8gY3JlYXRlIGZpbGUKKyAqCUBvbGQgY3JlZHMgd2hpY2ggc2hvdWxkIGJlIHVzZWQgZm9yIGNvbnRleHQgY2FsY3VsYXRpb24KKyAqCUBuZXcgY3JlZHMgdG8gbW9kaWZ5CiAgKgogICoKICAqIFNlY3VyaXR5IGhvb2tzIGZvciBpbm9kZSBvcGVyYXRpb25zLgpAQCAtNDAxLDYgKzQxMSwyMyBAQAogICoJQGlub2RlIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgaW5vZGUuCiAgKglAc2VjaWQgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSByZXN1bHQgd2lsbCBiZSBzYXZlZC4KICAqCUluIGNhc2Ugb2YgZmFpbHVyZSwgQHNlY2lkIHdpbGwgYmUgc2V0IHRvIHplcm8uCisgKiBAaW5vZGVfY29weV91cDoKKyAqCUEgZmlsZSBpcyBhYm91dCB0byBiZSBjb3BpZWQgdXAgZnJvbSBsb3dlciBsYXllciB0byB1cHBlciBsYXllciBvZgorICoJb3ZlcmxheSBmaWxlc3lzdGVtLiBTZWN1cml0eSBtb2R1bGUgY2FuIHByZXBhcmUgYSBzZXQgb2YgbmV3IGNyZWRzCisgKglhbmQgbW9kaWZ5IGFzIG5lZWQgYmUgYW5kIHJldHVybiBuZXcgY3JlZHMuIENhbGxlciB3aWxsIHN3aXRjaCB0bworICoJbmV3IGNyZWRzIHRlbXBvcmFyaWx5IHRvIGNyZWF0ZSBuZXcgZmlsZSBhbmQgcmVsZWFzZSBuZXdseSBhbGxvY2F0ZWQKKyAqCWNyZWRzLgorICoJQHNyYyBpbmRpY2F0ZXMgdGhlIHVuaW9uIGRlbnRyeSBvZiBmaWxlIHRoYXQgaXMgYmVpbmcgY29waWVkIHVwLgorICoJQG5ldyBwb2ludGVyIHRvIHBvaW50ZXIgdG8gcmV0dXJuIG5ld2x5IGFsbG9jYXRlZCBjcmVkcy4KKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBlcnJvci4KKyAqIEBpbm9kZV9jb3B5X3VwX3hhdHRyOgorICoJRmlsdGVyIHRoZSB4YXR0cnMgYmVpbmcgY29waWVkIHVwIHdoZW4gYSB1bmlvbmVkIGZpbGUgaXMgY29waWVkCisgKgl1cCBmcm9tIGEgbG93ZXIgbGF5ZXIgdG8gdGhlIHVuaW9uL292ZXJsYXkgbGF5ZXIuCisgKglAbmFtZSBpbmRpY2F0ZXMgdGhlIG5hbWUgb2YgdGhlIHhhdHRyLgorICoJUmV0dXJucyAwIHRvIGFjY2VwdCB0aGUgeGF0dHIsIDEgdG8gZGlzY2FyZCB0aGUgeGF0dHIsIC1FT1BOT1RTVVBQIGlmCisgKglzZWN1cml0eSBtb2R1bGUgZG9lcyBub3Qga25vdyBhYm91dCBhdHRyaWJ1dGUgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKgl0byBhYm9ydCB0aGUgY29weSB1cC4gTm90ZSB0aGF0IHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHJlYWRpbmcKKyAqCWFuZCB3cml0aW5nIHRoZSB4YXR0cnMgYXMgdGhpcyBob29rIGlzIG1lcmVseSBhIGZpbHRlci4KICAqCiAgKiBTZWN1cml0eSBob29rcyBmb3IgZmlsZSBvcGVyYXRpb25zCiAgKgpAQCAtMTM1OCw2ICsxMzg1LDEwIEBACiAJaW50ICgqZGVudHJ5X2luaXRfc2VjdXJpdHkpKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCiAJCQkJCWNvbnN0IHN0cnVjdCBxc3RyICpuYW1lLCB2b2lkICoqY3R4LAogCQkJCQl1MzIgKmN0eGxlbik7CisJaW50ICgqZGVudHJ5X2NyZWF0ZV9maWxlc19hcykoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJCQkJc3RydWN0IHFzdHIgKm5hbWUsCisJCQkJCWNvbnN0IHN0cnVjdCBjcmVkICpvbGQsCisJCQkJCXN0cnVjdCBjcmVkICpuZXcpOwogCiAKICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfUEFUSApAQCAtMTQyNSw2ICsxNDU2LDggQEAKIAlpbnQgKCppbm9kZV9saXN0c2VjdXJpdHkpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmJ1ZmZlciwKIAkJCQkJc2l6ZV90IGJ1ZmZlcl9zaXplKTsKIAl2b2lkICgqaW5vZGVfZ2V0c2VjaWQpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiAqc2VjaWQpOworCWludCAoKmlub2RlX2NvcHlfdXApKHN0cnVjdCBkZW50cnkgKnNyYywgc3RydWN0IGNyZWQgKipuZXcpOworCWludCAoKmlub2RlX2NvcHlfdXBfeGF0dHIpKGNvbnN0IGNoYXIgKm5hbWUpOwogCiAJaW50ICgqZmlsZV9wZXJtaXNzaW9uKShzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1hc2spOwogCWludCAoKmZpbGVfYWxsb2Nfc2VjdXJpdHkpKHN0cnVjdCBmaWxlICpmaWxlKTsKQEAgLTE0NTUsNyArMTQ4OCw2IEBACiAJaW50ICgqa2VybmVsX2FjdF9hcykoc3RydWN0IGNyZWQgKm5ldywgdTMyIHNlY2lkKTsKIAlpbnQgKCprZXJuZWxfY3JlYXRlX2ZpbGVzX2FzKShzdHJ1Y3QgY3JlZCAqbmV3LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIAlpbnQgKCprZXJuZWxfbW9kdWxlX3JlcXVlc3QpKGNoYXIgKmttb2RfbmFtZSk7Ci0JaW50ICgqa2VybmVsX21vZHVsZV9mcm9tX2ZpbGUpKHN0cnVjdCBmaWxlICpmaWxlKTsKIAlpbnQgKCprZXJuZWxfcmVhZF9maWxlKShzdHJ1Y3QgZmlsZSAqZmlsZSwgZW51bSBrZXJuZWxfcmVhZF9maWxlX2lkIGlkKTsKIAlpbnQgKCprZXJuZWxfcG9zdF9yZWFkX2ZpbGUpKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIGxvZmZfdCBzaXplLAogCQkJCSAgICAgZW51bSBrZXJuZWxfcmVhZF9maWxlX2lkIGlkKTsKQEAgLTE2NTYsNiArMTY4OCw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBzYl9jbG9uZV9tbnRfb3B0czsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHNiX3BhcnNlX29wdHNfc3RyOwogCXN0cnVjdCBsaXN0X2hlYWQgZGVudHJ5X2luaXRfc2VjdXJpdHk7CisJc3RydWN0IGxpc3RfaGVhZCBkZW50cnlfY3JlYXRlX2ZpbGVzX2FzOwogI2lmZGVmIENPTkZJR19TRUNVUklUWV9QQVRICiAJc3RydWN0IGxpc3RfaGVhZCBwYXRoX3VubGluazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBhdGhfbWtkaXI7CkBAIC0xNjk2LDYgKzE3MjksOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgaW5vZGVfc2V0c2VjdXJpdHk7CiAJc3RydWN0IGxpc3RfaGVhZCBpbm9kZV9saXN0c2VjdXJpdHk7CiAJc3RydWN0IGxpc3RfaGVhZCBpbm9kZV9nZXRzZWNpZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGlub2RlX2NvcHlfdXA7CisJc3RydWN0IGxpc3RfaGVhZCBpbm9kZV9jb3B5X3VwX3hhdHRyOwogCXN0cnVjdCBsaXN0X2hlYWQgZmlsZV9wZXJtaXNzaW9uOwogCXN0cnVjdCBsaXN0X2hlYWQgZmlsZV9hbGxvY19zZWN1cml0eTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZpbGVfZnJlZV9zZWN1cml0eTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWNiLmggYi9pbmNsdWRlL2xpbnV4L21jYi5oCmluZGV4IGVhZDEzZDIuLjQwOTdhYzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWNiLmgKKysrIGIvaW5jbHVkZS9saW51eC9tY2IuaApAQCAtNDEsMTUgKzQxLDE3IEBACiAJY2hhciBuYW1lW0NIQU1FTEVPTl9GSUxFTkFNRV9MRU4gKyAxXTsKIAlpbnQgKCpnZXRfaXJxKShzdHJ1Y3QgbWNiX2RldmljZSAqZGV2KTsKIH07Ci0jZGVmaW5lIHRvX21jYl9idXMoYikgY29udGFpbmVyX29mKChiKSwgc3RydWN0IG1jYl9idXMsIGRldikKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWNiX2J1cyAqdG9fbWNiX2J1cyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBtY2JfYnVzLCBkZXYpOworfQogCiAvKioKICAqIHN0cnVjdCBtY2JfZGV2aWNlIC0gTUVOIENoYW1lbGVvbiBCdXMgZGV2aWNlCiAgKgotICogQGJ1c19saXN0OiBpbnRlcm5hbCBsaXN0IGhhbmRsaW5nIGZvciBidXMgY29kZQogICogQGRldjogZGV2aWNlIGluIGtlcm5lbCByZXByZXNlbnRhdGlvbgogICogQGJ1czogbWNiIGJ1cyB0aGUgZGV2aWNlIGlzIHBsdWdnZWQgdG8KLSAqIEBzdWJvcmRpbmF0ZTogc3Vib3JkaW5hdGUgTUNCdXMgaW4gY2FzZSBvZiBicmlkZ2UKICAqIEBpc19hZGRlZDogZmxhZyB0byBjaGVjayBpZiBkZXZpY2UgaXMgYWRkZWQgdG8gYnVzCiAgKiBAZHJpdmVyOiBhc3NvY2lhdGVkIG1jYl9kcml2ZXIKICAqIEBpZDogbWNiIGRldmljZSBpZApAQCAtNjIsMTAgKzY0LDggQEAKICAqIEBtZW1vcnk6IG1lbW9yeSByZXNvdXJjZQogICovCiBzdHJ1Y3QgbWNiX2RldmljZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBidXNfbGlzdDsKIAlzdHJ1Y3QgZGV2aWNlIGRldjsKIAlzdHJ1Y3QgbWNiX2J1cyAqYnVzOwotCXN0cnVjdCBtY2JfYnVzICpzdWJvcmRpbmF0ZTsKIAlib29sIGlzX2FkZGVkOwogCXN0cnVjdCBtY2JfZHJpdmVyICpkcml2ZXI7CiAJdTE2IGlkOwpAQCAtNzYsOCArNzYsMTMgQEAKIAlpbnQgcmV2OwogCXN0cnVjdCByZXNvdXJjZSBpcnE7CiAJc3RydWN0IHJlc291cmNlIG1lbTsKKwlzdHJ1Y3QgZGV2aWNlICpkbWFfZGV2OwogfTsKLSNkZWZpbmUgdG9fbWNiX2RldmljZSh4KSBjb250YWluZXJfb2YoKHgpLCBzdHJ1Y3QgbWNiX2RldmljZSwgZGV2KQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtY2JfZGV2aWNlICp0b19tY2JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGRldiwgc3RydWN0IG1jYl9kZXZpY2UsIGRldik7Cit9CiAKIC8qKgogICogc3RydWN0IG1jYl9kcml2ZXIgLSBNRU4gQ2hhbWVsZW9uIEJ1cyBkZXZpY2UgZHJpdmVyCkBAIC05NSw3ICsxMDAsMTEgQEAKIAl2b2lkICgqcmVtb3ZlKShzdHJ1Y3QgbWNiX2RldmljZSAqbWRldik7CiAJdm9pZCAoKnNodXRkb3duKShzdHJ1Y3QgbWNiX2RldmljZSAqbWRldik7CiB9OwotI2RlZmluZSB0b19tY2JfZHJpdmVyKHgpIGNvbnRhaW5lcl9vZigoeCksIHN0cnVjdCBtY2JfZHJpdmVyLCBkcml2ZXIpCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1jYl9kcml2ZXIgKnRvX21jYl9kcml2ZXIoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGRydiwgc3RydWN0IG1jYl9kcml2ZXIsIGRyaXZlcik7Cit9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqbWNiX2dldF9kcnZkYXRhKHN0cnVjdCBtY2JfZGV2aWNlICpkZXYpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oIGIvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaAppbmRleCA0NDI5ZDI1Li41ZTViMjk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKQEAgLTE5NSw2ICsxOTUsNyBAQAogfQogCiBleHRlcm4gaW50IG1wb2xfbWlzcGxhY2VkKHN0cnVjdCBwYWdlICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIG1wb2xfcHV0X3Rhc2tfcG9saWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIAogI2Vsc2UKIApAQCAtMjk3LDUgKzI5OCw4IEBACiAJcmV0dXJuIC0xOyAvKiBubyBub2RlIHByZWZlcmVuY2UgKi8KIH0KIAorc3RhdGljIGlubGluZSB2b2lkIG1wb2xfcHV0X3Rhc2tfcG9saWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKK30KICNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9kYTh4eC1jZmdjaGlwLmggYi9pbmNsdWRlL2xpbnV4L21mZC9kYTh4eC1jZmdjaGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0OTg1ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL2RhOHh4LWNmZ2NoaXAuaApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIFRJIERhVmluY2kgREE4eHggQ0hJUENGR3ggcmVnaXN0ZXJzIGZvciBzeXNjb24gY29uc3VtZXJzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBEYXZpZCBMZWNobmVyIDxkYXZpZEBsZWNobm9sb2d5LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX0RBOFhYX0NGR0NISVBfSAorI2RlZmluZSBfX0xJTlVYX01GRF9EQThYWF9DRkdDSElQX0gKKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisvKiByZWdpc3RlciBvZmZzZXQgKDMyLWJpdCByZWdpc3RlcnMpICovCisjZGVmaW5lIENGR0NISVAobikJCQkJKChuKSAqIDQpCisKKy8qIENGR0NISVAwIChQTEwwL0VETUEzXzApIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgQ0ZHQ0hJUDBfUExMX01BU1RFUl9MT0NLCQlCSVQoNCkKKyNkZWZpbmUgQ0ZHQ0hJUDBfRURNQTMwVEMxREJTKG4pCQkoKG4pIDw8IDIpCisjZGVmaW5lIENGR0NISVAwX0VETUEzMFRDMURCU19NQVNLCQlDRkdDSElQMF9FRE1BMzBUQzFEQlMoMHgzKQorI2RlZmluZSBDRkdDSElQMF9FRE1BMzBUQzFEQlNfMTYJCUNGR0NISVAwX0VETUEzMFRDMURCUygweDApCisjZGVmaW5lIENGR0NISVAwX0VETUEzMFRDMURCU18zMgkJQ0ZHQ0hJUDBfRURNQTMwVEMxREJTKDB4MSkKKyNkZWZpbmUgQ0ZHQ0hJUDBfRURNQTMwVEMxREJTXzY0CQlDRkdDSElQMF9FRE1BMzBUQzFEQlMoMHgyKQorI2RlZmluZSBDRkdDSElQMF9FRE1BMzBUQzBEQlMobikJCSgobikgPDwgMCkKKyNkZWZpbmUgQ0ZHQ0hJUDBfRURNQTMwVEMwREJTX01BU0sJCUNGR0NISVAwX0VETUEzMFRDMERCUygweDMpCisjZGVmaW5lIENGR0NISVAwX0VETUEzMFRDMERCU18xNgkJQ0ZHQ0hJUDBfRURNQTMwVEMwREJTKDB4MCkKKyNkZWZpbmUgQ0ZHQ0hJUDBfRURNQTMwVEMwREJTXzMyCQlDRkdDSElQMF9FRE1BMzBUQzBEQlMoMHgxKQorI2RlZmluZSBDRkdDSElQMF9FRE1BMzBUQzBEQlNfNjQJCUNGR0NISVAwX0VETUEzMFRDMERCUygweDIpCisKKy8qIENGR0NISVAxIChlQ0FQL0hQSS9FRE1BM18xL2VIUlBXTSBUQkNMSy9NY0FTUDAgQU1VVEVJTikgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDKG4pCQkJKChuKSA8PCAyNykKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMlNSQ19NQVNLCQkJQ0ZHQ0hJUDFfQ0FQMlNSQygweDFmKQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX0VDQVBfUElOCQlDRkdDSElQMV9DQVAyU1JDKDB4MCkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMlNSQ19NQ0FTUDBfVFgJCUNGR0NISVAxX0NBUDJTUkMoMHgxKQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX01DQVNQMF9SWAkJQ0ZHQ0hJUDFfQ0FQMlNSQygweDIpCisjZGVmaW5lIENGR0NISVAxX0NBUDJTUkNfRU1BQ19DMF9SWF9USFJFU0hPTEQJQ0ZHQ0hJUDFfQ0FQMlNSQygweDcpCisjZGVmaW5lIENGR0NISVAxX0NBUDJTUkNfRU1BQ19DMF9SWAkJQ0ZHQ0hJUDFfQ0FQMlNSQygweDgpCisjZGVmaW5lIENGR0NISVAxX0NBUDJTUkNfRU1BQ19DMF9UWAkJQ0ZHQ0hJUDFfQ0FQMlNSQygweDkpCisjZGVmaW5lIENGR0NISVAxX0NBUDJTUkNfRU1BQ19DMF9NSVNDCQlDRkdDSElQMV9DQVAyU1JDKDB4YSkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMlNSQ19FTUFDX0MxX1JYX1RIUkVTSE9MRAlDRkdDSElQMV9DQVAyU1JDKDB4YikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMlNSQ19FTUFDX0MxX1JYCQlDRkdDSElQMV9DQVAyU1JDKDB4YykKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMlNSQ19FTUFDX0MxX1RYCQlDRkdDSElQMV9DQVAyU1JDKDB4ZCkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMlNSQ19FTUFDX0MxX01JU0MJCUNGR0NISVAxX0NBUDJTUkMoMHhlKQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX0VNQUNfQzJfUlhfVEhSRVNIT0xECUNGR0NISVAxX0NBUDJTUkMoMHhmKQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX0VNQUNfQzJfUlgJCUNGR0NISVAxX0NBUDJTUkMoMHgxMCkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMlNSQ19FTUFDX0MyX1RYCQlDRkdDSElQMV9DQVAyU1JDKDB4MTEpCisjZGVmaW5lIENGR0NISVAxX0NBUDJTUkNfRU1BQ19DMl9NSVNDCQlDRkdDSElQMV9DQVAyU1JDKDB4MTIpCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkMobikJCQkoKG4pIDw8IDIyKQorI2RlZmluZSBDRkdDSElQMV9DQVAxU1JDX01BU0sJCQlDRkdDSElQMV9DQVAxU1JDKDB4MWYpCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfRUNBUF9QSU4JCUNGR0NISVAxX0NBUDFTUkMoMHgwKQorI2RlZmluZSBDRkdDSElQMV9DQVAxU1JDX01DQVNQMF9UWAkJQ0ZHQ0hJUDFfQ0FQMVNSQygweDEpCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfTUNBU1AwX1JYCQlDRkdDSElQMV9DQVAxU1JDKDB4MikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMVNSQ19FTUFDX0MwX1JYX1RIUkVTSE9MRAlDRkdDSElQMV9DQVAxU1JDKDB4NykKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMVNSQ19FTUFDX0MwX1JYCQlDRkdDSElQMV9DQVAxU1JDKDB4OCkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMVNSQ19FTUFDX0MwX1RYCQlDRkdDSElQMV9DQVAxU1JDKDB4OSkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMVNSQ19FTUFDX0MwX01JU0MJCUNGR0NISVAxX0NBUDFTUkMoMHhhKQorI2RlZmluZSBDRkdDSElQMV9DQVAxU1JDX0VNQUNfQzFfUlhfVEhSRVNIT0xECUNGR0NISVAxX0NBUDFTUkMoMHhiKQorI2RlZmluZSBDRkdDSElQMV9DQVAxU1JDX0VNQUNfQzFfUlgJCUNGR0NISVAxX0NBUDFTUkMoMHhjKQorI2RlZmluZSBDRkdDSElQMV9DQVAxU1JDX0VNQUNfQzFfVFgJCUNGR0NISVAxX0NBUDFTUkMoMHhkKQorI2RlZmluZSBDRkdDSElQMV9DQVAxU1JDX0VNQUNfQzFfTUlTQwkJQ0ZHQ0hJUDFfQ0FQMVNSQygweGUpCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfRU1BQ19DMl9SWF9USFJFU0hPTEQJQ0ZHQ0hJUDFfQ0FQMVNSQygweGYpCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfRU1BQ19DMl9SWAkJQ0ZHQ0hJUDFfQ0FQMVNSQygweDEwKQorI2RlZmluZSBDRkdDSElQMV9DQVAxU1JDX0VNQUNfQzJfVFgJCUNGR0NISVAxX0NBUDFTUkMoMHgxMSkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMVNSQ19FTUFDX0MyX01JU0MJCUNGR0NISVAxX0NBUDFTUkMoMHgxMikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQyhuKQkJCSgobikgPDwgMTcpCisjZGVmaW5lIENGR0NISVAxX0NBUDBTUkNfTUFTSwkJCUNGR0NISVAxX0NBUDBTUkMoMHgxZikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19FQ0FQX1BJTgkJQ0ZHQ0hJUDFfQ0FQMFNSQygweDApCisjZGVmaW5lIENGR0NISVAxX0NBUDBTUkNfTUNBU1AwX1RYCQlDRkdDSElQMV9DQVAwU1JDKDB4MSkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19NQ0FTUDBfUlgJCUNGR0NISVAxX0NBUDBTUkMoMHgyKQorI2RlZmluZSBDRkdDSElQMV9DQVAwU1JDX0VNQUNfQzBfUlhfVEhSRVNIT0xECUNGR0NISVAxX0NBUDBTUkMoMHg3KQorI2RlZmluZSBDRkdDSElQMV9DQVAwU1JDX0VNQUNfQzBfUlgJCUNGR0NISVAxX0NBUDBTUkMoMHg4KQorI2RlZmluZSBDRkdDSElQMV9DQVAwU1JDX0VNQUNfQzBfVFgJCUNGR0NISVAxX0NBUDBTUkMoMHg5KQorI2RlZmluZSBDRkdDSElQMV9DQVAwU1JDX0VNQUNfQzBfTUlTQwkJQ0ZHQ0hJUDFfQ0FQMFNSQygweGEpCisjZGVmaW5lIENGR0NISVAxX0NBUDBTUkNfRU1BQ19DMV9SWF9USFJFU0hPTEQJQ0ZHQ0hJUDFfQ0FQMFNSQygweGIpCisjZGVmaW5lIENGR0NISVAxX0NBUDBTUkNfRU1BQ19DMV9SWAkJQ0ZHQ0hJUDFfQ0FQMFNSQygweGMpCisjZGVmaW5lIENGR0NISVAxX0NBUDBTUkNfRU1BQ19DMV9UWAkJQ0ZHQ0hJUDFfQ0FQMFNSQygweGQpCisjZGVmaW5lIENGR0NISVAxX0NBUDBTUkNfRU1BQ19DMV9NSVNDCQlDRkdDSElQMV9DQVAwU1JDKDB4ZSkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19FTUFDX0MyX1JYX1RIUkVTSE9MRAlDRkdDSElQMV9DQVAwU1JDKDB4ZikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19FTUFDX0MyX1JYCQlDRkdDSElQMV9DQVAwU1JDKDB4MTApCisjZGVmaW5lIENGR0NISVAxX0NBUDBTUkNfRU1BQ19DMl9UWAkJQ0ZHQ0hJUDFfQ0FQMFNSQygweDExKQorI2RlZmluZSBDRkdDSElQMV9DQVAwU1JDX0VNQUNfQzJfTUlTQwkJQ0ZHQ0hJUDFfQ0FQMFNSQygweDEyKQorI2RlZmluZSBDRkdDSElQMV9IUElCWVRFQUQJCQlCSVQoMTYpCisjZGVmaW5lIENGR0NISVAxX0hQSUVOQQkJCQlCSVQoMTUpCisjZGVmaW5lIENGR0NISVAwX0VETUEzMVRDMERCUyhuKQkJKChuKSA8PCAxMykKKyNkZWZpbmUgQ0ZHQ0hJUDBfRURNQTMxVEMwREJTX01BU0sJCUNGR0NISVAwX0VETUEzMVRDMERCUygweDMpCisjZGVmaW5lIENGR0NISVAwX0VETUEzMVRDMERCU18xNgkJQ0ZHQ0hJUDBfRURNQTMxVEMwREJTKDB4MCkKKyNkZWZpbmUgQ0ZHQ0hJUDBfRURNQTMxVEMwREJTXzMyCQlDRkdDSElQMF9FRE1BMzFUQzBEQlMoMHgxKQorI2RlZmluZSBDRkdDSElQMF9FRE1BMzFUQzBEQlNfNjQJCUNGR0NISVAwX0VETUEzMVRDMERCUygweDIpCisjZGVmaW5lIENGR0NISVAxX1RCQ0xLU1lOQwkJCUJJVCgxMikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQU1VVEVTRUwwKG4pCQkJKChuKSA8PCAwKQorI2RlZmluZSBDRkdDSElQMV9BTVVURVNFTDBfTUFTSwkJCUNGR0NISVAxX0FNVVRFU0VMMCgweGYpCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9MT1cJCQlDRkdDSElQMV9BTVVURVNFTDAoMHgwKQorI2RlZmluZSBDRkdDSElQMV9BTVVURVNFTDBfQkFOS18wCQlDRkdDSElQMV9BTVVURVNFTDAoMHgxKQorI2RlZmluZSBDRkdDSElQMV9BTVVURVNFTDBfQkFOS18xCQlDRkdDSElQMV9BTVVURVNFTDAoMHgyKQorI2RlZmluZSBDRkdDSElQMV9BTVVURVNFTDBfQkFOS18yCQlDRkdDSElQMV9BTVVURVNFTDAoMHgzKQorI2RlZmluZSBDRkdDSElQMV9BTVVURVNFTDBfQkFOS18zCQlDRkdDSElQMV9BTVVURVNFTDAoMHg0KQorI2RlZmluZSBDRkdDSElQMV9BTVVURVNFTDBfQkFOS180CQlDRkdDSElQMV9BTVVURVNFTDAoMHg1KQorI2RlZmluZSBDRkdDSElQMV9BTVVURVNFTDBfQkFOS181CQlDRkdDSElQMV9BTVVURVNFTDAoMHg2KQorI2RlZmluZSBDRkdDSElQMV9BTVVURVNFTDBfQkFOS182CQlDRkdDSElQMV9BTVVURVNFTDAoMHg3KQorI2RlZmluZSBDRkdDSElQMV9BTVVURVNFTDBfQkFOS183CQlDRkdDSElQMV9BTVVURVNFTDAoMHg4KQorCisvKiBDRkdDSElQMiAoVVNCIFBIWSkgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBDRkdDSElQMl9QSFlDTEtHRAkJCUJJVCgxNykKKyNkZWZpbmUgQ0ZHQ0hJUDJfVkJVU1NFTlNFCQkJQklUKDE2KQorI2RlZmluZSBDRkdDSElQMl9SRVNFVAkJCQlCSVQoMTUpCisjZGVmaW5lIENGR0NISVAyX09UR01PREUobikJCQkoKG4pIDw8IDEzKQorI2RlZmluZSBDRkdDSElQMl9PVEdNT0RFX01BU0sJCQlDRkdDSElQMl9PVEdNT0RFKDB4MykKKyNkZWZpbmUgQ0ZHQ0hJUDJfT1RHTU9ERV9OT19PVkVSUklERQkJQ0ZHQ0hJUDJfT1RHTU9ERSgweDApCisjZGVmaW5lIENGR0NISVAyX09UR01PREVfRk9SQ0VfSE9TVAkJQ0ZHQ0hJUDJfT1RHTU9ERSgweDEpCisjZGVmaW5lIENGR0NISVAyX09UR01PREVfRk9SQ0VfREVWSUNFCQlDRkdDSElQMl9PVEdNT0RFKDB4MikKKyNkZWZpbmUgQ0ZHQ0hJUDJfT1RHTU9ERV9GT1JDRV9IT1NUX1ZCVVNfTE9XCUNGR0NISVAyX09UR01PREUoMHgzKQorI2RlZmluZSBDRkdDSElQMl9VU0IxUEhZQ0xLTVVYCQkJQklUKDEyKQorI2RlZmluZSBDRkdDSElQMl9VU0IyUEhZQ0xLTVVYCQkJQklUKDExKQorI2RlZmluZSBDRkdDSElQMl9QSFlQV1JETgkJCUJJVCgxMCkKKyNkZWZpbmUgQ0ZHQ0hJUDJfT1RHUFdSRE4JCQlCSVQoOSkKKyNkZWZpbmUgQ0ZHQ0hJUDJfREFUUE9MCQkJCUJJVCg4KQorI2RlZmluZSBDRkdDSElQMl9VU0IxU1VTUEVORE0JCQlCSVQoNykKKyNkZWZpbmUgQ0ZHQ0hJUDJfUEhZX1BMTE9OCQkJQklUKDYpCisjZGVmaW5lIENGR0NISVAyX1NFU0VOREVOCQkJQklUKDUpCisjZGVmaW5lIENGR0NISVAyX1ZCRFRDVEVOCQkJQklUKDQpCisjZGVmaW5lIENGR0NISVAyX1JFRkZSRVEobikJCQkoKG4pIDw8IDApCisjZGVmaW5lIENGR0NISVAyX1JFRkZSRVFfTUFTSwkJCUNGR0NISVAyX1JFRkZSRVEoMHhmKQorI2RlZmluZSBDRkdDSElQMl9SRUZGUkVRXzEyTUhaCQkJQ0ZHQ0hJUDJfUkVGRlJFUSgweDEpCisjZGVmaW5lIENGR0NISVAyX1JFRkZSRVFfMjRNSFoJCQlDRkdDSElQMl9SRUZGUkVRKDB4MikKKyNkZWZpbmUgQ0ZHQ0hJUDJfUkVGRlJFUV80OE1IWgkJCUNGR0NISVAyX1JFRkZSRVEoMHgzKQorI2RlZmluZSBDRkdDSElQMl9SRUZGUkVRXzE5XzJNSFoJCUNGR0NISVAyX1JFRkZSRVEoMHg0KQorI2RlZmluZSBDRkdDSElQMl9SRUZGUkVRXzM4XzRNSFoJCUNGR0NISVAyX1JFRkZSRVEoMHg1KQorI2RlZmluZSBDRkdDSElQMl9SRUZGUkVRXzEzTUhaCQkJQ0ZHQ0hJUDJfUkVGRlJFUSgweDYpCisjZGVmaW5lIENGR0NISVAyX1JFRkZSRVFfMjZNSFoJCQlDRkdDSElQMl9SRUZGUkVRKDB4NykKKyNkZWZpbmUgQ0ZHQ0hJUDJfUkVGRlJFUV8yME1IWgkJCUNGR0NISVAyX1JFRkZSRVEoMHg4KQorI2RlZmluZSBDRkdDSElQMl9SRUZGUkVRXzQwTUhaCQkJQ0ZHQ0hJUDJfUkVGRlJFUSgweDkpCisKKy8qIENGR0NISVAzIChFTUFDL3VQUC9QTEwxL0FTWU5DMy9QUlUvRElWNC41L0VNSUZBKSByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIENGR0NISVAzX1JNSUlfU0VMCQkJQklUKDgpCisjZGVmaW5lIENGR0NISVAzX1VQUF9UWF9DTEtTUkMJCQlCSVQoNikKKyNkZWZpbmUgQ0ZHQ0hJUDNfUExMMV9NQVNURVJfTE9DSwkJQklUKDUpCisjZGVmaW5lIENGR0NISVAzX0FTWU5DM19DTEtTUkMJCQlCSVQoNCkKKyNkZWZpbmUgQ0ZHQ0hJUDNfUFJVRVZUU0VMCQkJQklUKDMpCisjZGVmaW5lIENGR0NISVAzX0RJVjQ1UEVOQQkJCUJJVCgyKQorI2RlZmluZSBDRkdDSElQM19FTUFfQ0xLU1JDCQkJQklUKDEpCisKKy8qIENGR0NISVA0IChNY0FTUDAgQU1VTlRFSU4pIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgQ0ZHQ0hJUDRfQU1VVEVDTFIwCQkJQklUKDApCisKKyNlbmRpZiAvKiBfX0xJTlVYX01GRF9EQThYWF9DRkdDSElQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2xwODczeC5oIGIvaW5jbHVkZS9saW51eC9tZmQvbHA4NzN4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiMWJkNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL2xwODczeC5oCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogRnVuY3Rpb25zIHRvIGFjY2VzcyBMUDg3M1ggcG93ZXIgbWFuYWdlbWVudCBjaGlwLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCAiYXMgaXMiIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQ7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX0xQODczWF9ICisjZGVmaW5lIF9fTElOVVhfTUZEX0xQODczWF9ICisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKworLyogTFA4NzN4IGNoaXAgaWQgbGlzdCAqLworI2RlZmluZSBMUDg3M1gJCQkweDAwCisKKy8qIEFsbCByZWdpc3RlciBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgTFA4NzNYX1JFR19ERVZfUkVWCQkwWDAwCisjZGVmaW5lIExQODczWF9SRUdfT1RQX1JFVgkJMFgwMQorI2RlZmluZSBMUDg3M1hfUkVHX0JVQ0swX0NUUkxfMQkJMFgwMgorI2RlZmluZSBMUDg3M1hfUkVHX0JVQ0swX0NUUkxfMgkJMFgwMworI2RlZmluZSBMUDg3M1hfUkVHX0JVQ0sxX0NUUkxfMQkJMFgwNAorI2RlZmluZSBMUDg3M1hfUkVHX0JVQ0sxX0NUUkxfMgkJMFgwNQorI2RlZmluZSBMUDg3M1hfUkVHX0JVQ0swX1ZPVVQJCTBYMDYKKyNkZWZpbmUgTFA4NzNYX1JFR19CVUNLMV9WT1VUCQkwWDA3CisjZGVmaW5lIExQODczWF9SRUdfTERPMF9DVFJMCQkwWDA4CisjZGVmaW5lIExQODczWF9SRUdfTERPMV9DVFJMICAgICAgICAgICAgMFgwOQorI2RlZmluZSBMUDg3M1hfUkVHX0xETzBfVk9VVAkJMFgwQQorI2RlZmluZSBMUDg3M1hfUkVHX0xETzFfVk9VVAkJMFgwQgorI2RlZmluZSBMUDg3M1hfUkVHX0JVQ0swX0RFTEFZCQkwWDBDCisjZGVmaW5lIExQODczWF9SRUdfQlVDSzFfREVMQVkJCTBYMEQKKyNkZWZpbmUgTFA4NzNYX1JFR19MRE8wX0RFTEFZCQkwWDBFCisjZGVmaW5lIExQODczWF9SRUdfTERPMV9ERUxBWQkJMFgwRgorI2RlZmluZSBMUDg3M1hfUkVHX0dQT19ERUxBWQkJMFgxMAorI2RlZmluZSBMUDg3M1hfUkVHX0dQTzJfREVMQVkJCTBYMTEKKyNkZWZpbmUgTFA4NzNYX1JFR19HUE9fQ1RSTAkJMFgxMgorI2RlZmluZSBMUDg3M1hfUkVHX0NPTkZJRwkJMFgxMworI2RlZmluZSBMUDg3M1hfUkVHX1BMTF9DVFJMCQkwWDE0CisjZGVmaW5lIExQODczWF9SRUdfUEdPT0RfQ1RSTDEJCTBYMTUKKyNkZWZpbmUgTFA4NzNYX1JFR19QR09PRF9DVFJMMgkJMFgxNgorI2RlZmluZSBMUDg3M1hfUkVHX1BHX0ZBVUxUCQkwWDE3CisjZGVmaW5lIExQODczWF9SRUdfUkVTRVQJCTBYMTgKKyNkZWZpbmUgTFA4NzNYX1JFR19JTlRfVE9QXzEJCTBYMTkKKyNkZWZpbmUgTFA4NzNYX1JFR19JTlRfVE9QXzIJCTBYMUEKKyNkZWZpbmUgTFA4NzNYX1JFR19JTlRfQlVDSwkJMFgxQgorI2RlZmluZSBMUDg3M1hfUkVHX0lOVF9MRE8JCTBYMUMKKyNkZWZpbmUgTFA4NzNYX1JFR19UT1BfU1RBVAkJMFgxRAorI2RlZmluZSBMUDg3M1hfUkVHX0JVQ0tfU1RBVAkJMFgxRQorI2RlZmluZSBMUDg3M1hfUkVHX0xET19TVEFUCQkweDFGCisjZGVmaW5lIExQODczWF9SRUdfVE9QX01BU0tfMQkJMHgyMAorI2RlZmluZSBMUDg3M1hfUkVHX1RPUF9NQVNLXzIJCTB4MjEKKyNkZWZpbmUgTFA4NzNYX1JFR19CVUNLX01BU0sJCTB4MjIKKyNkZWZpbmUgTFA4NzNYX1JFR19MRE9fTUFTSwkJMHgyMworI2RlZmluZSBMUDg3M1hfUkVHX1NFTF9JX0xPQUQJCTB4MjQKKyNkZWZpbmUgTFA4NzNYX1JFR19JX0xPQURfMgkJMHgyNQorI2RlZmluZSBMUDg3M1hfUkVHX0lfTE9BRF8xCQkweDI2CisKKyNkZWZpbmUgTFA4NzNYX1JFR19NQVgJCQlMUDg3M1hfUkVHX0lfTE9BRF8xCisKKy8qIFJlZ2lzdGVyIGZpZWxkIGRlZmluaXRpb25zICovCisjZGVmaW5lIExQODczWF9ERVZfUkVWX0RFVl9JRAkJCTB4QzAKKyNkZWZpbmUgTFA4NzNYX0RFVl9SRVZfQUxMX0xBWUVSCQkweDMwCisjZGVmaW5lIExQODczWF9ERVZfUkVWX01FVEFMX0xBWUVSCQkweDBGCisKKyNkZWZpbmUgTFA4NzNYX09UUF9SRVZfT1RQX0lECQkJMHhGRgorCisjZGVmaW5lIExQODczWF9CVUNLMF9DVFJMXzFfQlVDSzBfRlBXTQkJQklUKDMpCisjZGVmaW5lIExQODczWF9CVUNLMF9DVFJMXzFfQlVDSzBfUkRJU19FTglCSVQoMikKKyNkZWZpbmUgTFA4NzNYX0JVQ0swX0NUUkxfMV9CVUNLMF9FTl9QSU5fQ1RSTAlCSVQoMSkKKyNkZWZpbmUgTFA4NzNYX0JVQ0swX0NUUkxfMV9CVUNLMF9FTgkJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX0JVQ0swX0NUUkxfMl9CVUNLMF9JTElNCQkweDM4CisjZGVmaW5lIExQODczWF9CVUNLMF9DVFJMXzJfQlVDSzBfU0xFV19SQVRFCTB4MDcKKworI2RlZmluZSBMUDg3M1hfQlVDSzFfQ1RSTF8xX0JVQ0sxX0ZQV00JCUJJVCgzKQorI2RlZmluZSBMUDg3M1hfQlVDSzFfQ1RSTF8xX0JVQ0sxX1JESVNfRU4JQklUKDIpCisjZGVmaW5lIExQODczWF9CVUNLMV9DVFJMXzFfQlVDSzFfRU5fUElOX0NUUkwJQklUKDEpCisjZGVmaW5lIExQODczWF9CVUNLMV9DVFJMXzFfQlVDSzFfRU4JCUJJVCgwKQorCisjZGVmaW5lIExQODczWF9CVUNLMV9DVFJMXzJfQlVDSzFfSUxJTQkJMHgzOAorI2RlZmluZSBMUDg3M1hfQlVDSzFfQ1RSTF8yX0JVQ0sxX1NMRVdfUkFURQkweDA3CisKKyNkZWZpbmUgTFA4NzNYX0JVQ0swX1ZPVVRfQlVDSzBfVlNFVAkJMHhGRgorCisjZGVmaW5lIExQODczWF9CVUNLMV9WT1VUX0JVQ0sxX1ZTRVQJCTB4RkYKKworI2RlZmluZSBMUDg3M1hfTERPMF9DVFJMX0xETzBfUkRJU19FTgkJQklUKDIpCisjZGVmaW5lIExQODczWF9MRE8wX0NUUkxfTERPMF9FTl9QSU5fQ1RSTAlCSVQoMSkKKyNkZWZpbmUgTFA4NzNYX0xETzBfQ1RSTF9MRE8wX0VOCQlCSVQoMCkKKworI2RlZmluZSBMUDg3M1hfTERPMV9DVFJMX0xETzFfUkRJU19FTgkJQklUKDIpCisjZGVmaW5lIExQODczWF9MRE8xX0NUUkxfTERPMV9FTl9QSU5fQ1RSTAlCSVQoMSkKKyNkZWZpbmUgTFA4NzNYX0xETzFfQ1RSTF9MRE8xX0VOCQlCSVQoMCkKKworI2RlZmluZSBMUDg3M1hfTERPMF9WT1VUX0xETzBfVlNFVAkJMHgxRgorCisjZGVmaW5lIExQODczWF9MRE8xX1ZPVVRfTERPMV9WU0VUCQkweDFGCisKKyNkZWZpbmUgTFA4NzNYX0JVQ0swX0RFTEFZX0JVQ0swX1NEX0RFTEFZCTB4RjAKKyNkZWZpbmUgTFA4NzNYX0JVQ0swX0RFTEFZX0JVQ0swX1NVX0RFTEFZCTB4MEYKKworI2RlZmluZSBMUDg3M1hfQlVDSzFfREVMQVlfQlVDSzFfU0RfREVMQVkJMHhGMAorI2RlZmluZSBMUDg3M1hfQlVDSzFfREVMQVlfQlVDSzFfU1VfREVMQVkJMHgwRgorCisjZGVmaW5lIExQODczWF9MRE8wX0RFTEFZX0xETzBfU0RfREVMQVkJMHhGMAorI2RlZmluZSBMUDg3M1hfTERPMF9ERUxBWV9MRE8wX1NVX0RFTEFZCTB4MEYKKworI2RlZmluZSBMUDg3M1hfTERPMV9ERUxBWV9MRE8xX1NEX0RFTEFZCTB4RjAKKyNkZWZpbmUgTFA4NzNYX0xETzFfREVMQVlfTERPMV9TVV9ERUxBWQkweDBGCisKKyNkZWZpbmUgTFA4NzNYX0dQT19ERUxBWV9HUE9fU0RfREVMQVkJCTB4RjAKKyNkZWZpbmUgTFA4NzNYX0dQT19ERUxBWV9HUE9fU1VfREVMQVkJCTB4MEYKKworI2RlZmluZSBMUDg3M1hfR1BPMl9ERUxBWV9HUE8yX1NEX0RFTEFZCTB4RjAKKyNkZWZpbmUgTFA4NzNYX0dQTzJfREVMQVlfR1BPMl9TVV9ERUxBWQkweDBGCisKKyNkZWZpbmUgTFA4NzNYX0dQT19DVFJMX0dQTzJfT0QJCUJJVCg2KQorI2RlZmluZSBMUDg3M1hfR1BPX0NUUkxfR1BPMl9FTl9QSU5fQ1RSTAlCSVQoNSkKKyNkZWZpbmUgTFA4NzNYX0dQT19DVFJMX0dQTzJfRU4JCUJJVCg0KQorI2RlZmluZSBMUDg3M1hfR1BPX0NUUkxfR1BPX09ECQkJQklUKDIpCisjZGVmaW5lIExQODczWF9HUE9fQ1RSTF9HUE9fRU5fUElOX0NUUkwJQklUKDEpCisjZGVmaW5lIExQODczWF9HUE9fQ1RSTF9HUE9fRU4JCQlCSVQoMCkKKworI2RlZmluZSBMUDg3M1hfQ09ORklHX1NVX0RFTEFZX1NFTAkJQklUKDYpCisjZGVmaW5lIExQODczWF9DT05GSUdfU0RfREVMQVlfU0VMCQlCSVQoNSkKKyNkZWZpbmUgTFA4NzNYX0NPTkZJR19DTEtJTl9QSU5fU0VMCQlCSVQoNCkKKyNkZWZpbmUgTFA4NzNYX0NPTkZJR19DTEtJTl9QRAkJCUJJVCgzKQorI2RlZmluZSBMUDg3M1hfQ09ORklHX0VOX1BECQkJQklUKDIpCisjZGVmaW5lIExQODczWF9DT05GSUdfVERJRV9XQVJOX0xFVkVMCQlCSVQoMSkKKyNkZWZpbmUgTFA4NzNYX0VOX1NQUkVBRF9TUEVDCQkJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX1BMTF9DVFJMX0VOX1BMTAkJCUJJVCg2KQorI2RlZmluZSBMUDg3M1hfRVhUX0NMS19GUkVRCQkJMHgxRgorCisjZGVmaW5lIExQODczWF9QR09PRF9DVFJMMV9QR09PRF9QT0wJCUJJVCg3KQorI2RlZmluZSBMUDg3M1hfUEdPT0RfQ1RSTDFfUEdPT0RfT0QJCUJJVCg2KQorI2RlZmluZSBMUDg3M1hfUEdPT0RfQ1RSTDFfUEdPT0RfV0lORE9XX0xETwlCSVQoNSkKKyNkZWZpbmUgTFA4NzNYX1BHT09EX0NUUkwxX1BHT09EX1dJTkRPV05fQlVDSwlCSVQoNCkKKyNkZWZpbmUgTFA4NzNYX1BHT09EX0NUUkwxX1BHT09EX0VOX1BHT09EX0xETzEJQklUKDMpCisjZGVmaW5lIExQODczWF9QR09PRF9DVFJMMV9QR09PRF9FTl9QR09PRF9MRE8wCUJJVCgyKQorI2RlZmluZSBMUDg3M1hfUEdPT0RfQ1RSTDFfUEdPT0RfRU5fUEdPT0RfQlVDSzEJQklUKDEpCisjZGVmaW5lIExQODczWF9QR09PRF9DVFJMMV9QR09PRF9FTl9QR09PRF9CVUNLMAlCSVQoMCkKKworI2RlZmluZSBMUDg3M1hfUEdPT0RfQ1RSTDJfRU5fUEdPT0RfVFdBUk4JQklUKDIpCisjZGVmaW5lIExQODczWF9QR09PRF9DVFJMMl9FTl9QR19GQVVMVF9HQVRFCUJJVCgxKQorI2RlZmluZSBMUDg3M1hfUEdPT0RfQ1RSTDJfUEdPT0RfTU9ERQkJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX1BHX0ZBVUxUX1BHX0ZBVUxUX0xETzEJCUJJVCgzKQorI2RlZmluZSBMUDg3M1hfUEdfRkFVTFRfUEdfRkFVTFRfTERPMAkJQklUKDIpCisjZGVmaW5lIExQODczWF9QR19GQVVMVF9QR19GQVVMVF9CVUNLMQkJQklUKDEpCisjZGVmaW5lIExQODczWF9QR19GQVVMVF9QR19GQVVMVF9CVUNLMAkJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX1JFU0VUX1NXX1JFU0VUCQkJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX0lOVF9UT1BfMV9QR09PRF9JTlQJCUJJVCg3KQorI2RlZmluZSBMUDg3M1hfSU5UX1RPUF8xX0xET19JTlQJCUJJVCg2KQorI2RlZmluZSBMUDg3M1hfSU5UX1RPUF8xX0JVQ0tfSU5UCQlCSVQoNSkKKyNkZWZpbmUgTFA4NzNYX0lOVF9UT1BfMV9TWU5DX0NMS19JTlQJCUJJVCg0KQorI2RlZmluZSBMUDg3M1hfSU5UX1RPUF8xX1RESUVfU0RfSU5UCQlCSVQoMykKKyNkZWZpbmUgTFA4NzNYX0lOVF9UT1BfMV9URElFX1dBUk5fSU5UCQlCSVQoMikKKyNkZWZpbmUgTFA4NzNYX0lOVF9UT1BfMV9PVlBfSU5UCQlCSVQoMSkKKyNkZWZpbmUgTFA4NzNYX0lOVF9UT1BfMV9JX01FQVNfSU5UCQlCSVQoMCkKKworI2RlZmluZSBMUDg3M1hfSU5UX1RPUF8yX1JFU0VUX1JFR19JTlQJCUJJVCgwKQorCisjZGVmaW5lIExQODczWF9JTlRfQlVDS19CVUNLMV9QR19JTlQJCUJJVCg2KQorI2RlZmluZSBMUDg3M1hfSU5UX0JVQ0tfQlVDSzFfU0NfSU5UCQlCSVQoNSkKKyNkZWZpbmUgTFA4NzNYX0lOVF9CVUNLX0JVQ0sxX0lMSU1fSU5UCQlCSVQoNCkKKyNkZWZpbmUgTFA4NzNYX0lOVF9CVUNLX0JVQ0swX1BHX0lOVAkJQklUKDIpCisjZGVmaW5lIExQODczWF9JTlRfQlVDS19CVUNLMF9TQ19JTlQJCUJJVCgxKQorI2RlZmluZSBMUDg3M1hfSU5UX0JVQ0tfQlVDSzBfSUxJTV9JTlQJCUJJVCgwKQorCisjZGVmaW5lIExQODczWF9JTlRfTERPX0xETzFfUEdfSU5UCQlCSVQoNikKKyNkZWZpbmUgTFA4NzNYX0lOVF9MRE9fTERPMV9TQ19JTlQJCUJJVCg1KQorI2RlZmluZSBMUDg3M1hfSU5UX0xET19MRE8xX0lMSU1fSU5UCQlCSVQoNCkKKyNkZWZpbmUgTFA4NzNYX0lOVF9MRE9fTERPMF9QR19JTlQJCUJJVCgyKQorI2RlZmluZSBMUDg3M1hfSU5UX0xET19MRE8wX1NDX0lOVAkJQklUKDEpCisjZGVmaW5lIExQODczWF9JTlRfTERPX0xETzBfSUxJTV9JTlQJCUJJVCgwKQorCisjZGVmaW5lIExQODczWF9UT1BfU1RBVF9QR09PRF9TVEFUCQlCSVQoNykKKyNkZWZpbmUgTFA4NzNYX1RPUF9TVEFUX1NZTkNfQ0xLX1NUQVQJCUJJVCg0KQorI2RlZmluZSBMUDg3M1hfVE9QX1NUQVRfVERJRV9TRF9TVEFUCQlCSVQoMykKKyNkZWZpbmUgTFA4NzNYX1RPUF9TVEFUX1RESUVfV0FSTl9TVEFUCQlCSVQoMikKKyNkZWZpbmUgTFA4NzNYX1RPUF9TVEFUX09WUF9TVEFUCQlCSVQoMSkKKworI2RlZmluZSBMUDg3M1hfQlVDS19TVEFUX0JVQ0sxX1NUQVQJCUJJVCg3KQorI2RlZmluZSBMUDg3M1hfQlVDS19TVEFUX0JVQ0sxX1BHX1NUQVQJCUJJVCg2KQorI2RlZmluZSBMUDg3M1hfQlVDS19TVEFUX0JVQ0sxX0lMSU1fU1RBVAlCSVQoNCkKKyNkZWZpbmUgTFA4NzNYX0JVQ0tfU1RBVF9CVUNLMF9TVEFUCQlCSVQoMykKKyNkZWZpbmUgTFA4NzNYX0JVQ0tfU1RBVF9CVUNLMF9QR19TVEFUCQlCSVQoMikKKyNkZWZpbmUgTFA4NzNYX0JVQ0tfU1RBVF9CVUNLMF9JTElNX1NUQVQJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX0xET19TVEFUX0xETzFfU1RBVAkJQklUKDcpCisjZGVmaW5lIExQODczWF9MRE9fU1RBVF9MRE8xX1BHX1NUQVQJCUJJVCg2KQorI2RlZmluZSBMUDg3M1hfTERPX1NUQVRfTERPMV9JTElNX1NUQVQJCUJJVCg0KQorI2RlZmluZSBMUDg3M1hfTERPX1NUQVRfTERPMF9TVEFUCQlCSVQoMykKKyNkZWZpbmUgTFA4NzNYX0xET19TVEFUX0xETzBfUEdfU1RBVAkJQklUKDIpCisjZGVmaW5lIExQODczWF9MRE9fU1RBVF9MRE8wX0lMSU1fU1RBVAkJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX1RPUF9NQVNLXzFfUEdPT0RfSU5UX01BU0sJQklUKDcpCisjZGVmaW5lIExQODczWF9UT1BfTUFTS18xX1NZTkNfQ0xLX01BU0sJQklUKDQpCisjZGVmaW5lIExQODczWF9UT1BfTUFTS18xX1RESUVfV0FSTl9NQVNLCUJJVCgyKQorI2RlZmluZSBMUDg3M1hfVE9QX01BU0tfMV9JX01FQVNfTUFTSwkJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX1RPUF9NQVNLXzJfUkVTRVRfUkVHX01BU0sJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX0JVQ0tfTUFTS19CVUNLMV9QR0ZfTUFTSwlCSVQoNykKKyNkZWZpbmUgTFA4NzNYX0JVQ0tfTUFTS19CVUNLMV9QR1JfTUFTSwlCSVQoNikKKyNkZWZpbmUgTFA4NzNYX0JVQ0tfTUFTS19CVUNLMV9JTElNX01BU0sJQklUKDQpCisjZGVmaW5lIExQODczWF9CVUNLX01BU0tfQlVDSzBfUEdGX01BU0sJQklUKDMpCisjZGVmaW5lIExQODczWF9CVUNLX01BU0tfQlVDSzBfUEdSX01BU0sJQklUKDIpCisjZGVmaW5lIExQODczWF9CVUNLX01BU0tfQlVDSzBfSUxJTV9NQVNLCUJJVCgwKQorCisjZGVmaW5lIExQODczWF9MRE9fTUFTS19MRE8xX1BHRl9NQVNLCQlCSVQoNykKKyNkZWZpbmUgTFA4NzNYX0xET19NQVNLX0xETzFfUEdSX01BU0sJCUJJVCg2KQorI2RlZmluZSBMUDg3M1hfTERPX01BU0tfTERPMV9JTElNX01BU0sJCUJJVCg0KQorI2RlZmluZSBMUDg3M1hfTERPX01BU0tfTERPMF9QR0ZfTUFTSwkJQklUKDMpCisjZGVmaW5lIExQODczWF9MRE9fTUFTS19MRE8wX1BHUl9NQVNLCQlCSVQoMikKKyNkZWZpbmUgTFA4NzNYX0xET19NQVNLX0xETzBfSUxJTV9NQVNLCQlCSVQoMCkKKworI2RlZmluZSBMUDg3M1hfU0VMX0lfTE9BRF9DVVJSRU5UX0JVQ0tfU0VMRUNUCUJJVCgwKQorCisjZGVmaW5lIExQODczWF9JX0xPQURfMl9CVUNLX0xPQURfQ1VSUkVOVAlCSVQoMCkKKworI2RlZmluZSBMUDg3M1hfSV9MT0FEXzFfQlVDS19MT0FEX0NVUlJFTlQJMHhGRgorCisjZGVmaW5lIExQODczWF9NQVhfUkVHX0lECQlMUDg3M1hfTERPXzEKKworLyogTnVtYmVyIG9mIHN0ZXAtZG93biBjb252ZXJ0ZXJzIGF2YWlsYWJsZSAqLworI2RlZmluZSBMUDg3M1hfTlVNX0JVQ0sJCTIKKy8qIE51bWJlciBvZiBMRE8gdm9sdGFnZSByZWd1bGF0b3JzIGF2YWlsYWJsZSAqLworI2RlZmluZSBMUDg3M1hfTlVNX0xETwkJMgorLyogTnVtYmVyIG9mIHRvdGFsIHJlZ3VsYXRvcnMgYXZhaWxhYmxlICovCisjZGVmaW5lIExQODczWF9OVU1fUkVHVUxBVE9SCQkoTFA4NzNYX05VTV9CVUNLICsgTFA4NzNYX05VTV9MRE8pCisKK2VudW0gbHA4NzN4X3JlZ3VsYXRvcl9pZCB7CisJLyogQlVDSydzICovCisJTFA4NzNYX0JVQ0tfMCwKKwlMUDg3M1hfQlVDS18xLAorCS8qIExET3MgKi8KKwlMUDg3M1hfTERPXzAsCisJTFA4NzNYX0xET18xLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgbHA4NzN4IC0gc3RhdGUgaG9sZGVyIGZvciB0aGUgbHA4NzN4IGRyaXZlcgorICogQGRldjogc3RydWN0IGRldmljZSBwb2ludGVyIGZvciBNRkQgZGV2aWNlCisgKiBAcmV2OiByZXZpc2lvbiBvZiB0aGUgbHA4NzN4CisgKiBAbG9jazogbG9jayBndWFyZGluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUKKyAqIEByZWdtYXA6IHJlZ2lzdGVyIG1hcCBvZiB0aGUgbHA4NzN4IFBNSUMKKyAqCisgKiBEZXZpY2UgZGF0YSBtYXkgYmUgdXNlZCB0byBhY2Nlc3MgdGhlIExQODczWCBjaGlwCisgKi8KK3N0cnVjdCBscDg3M3ggeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl1OCByZXY7CisJc3RydWN0IG11dGV4IGxvY2s7CS8qIGxvY2sgZ3VhcmRpbmcgdGhlIGRhdGEgc3RydWN0dXJlICovCisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworfTsKKyNlbmRpZiAvKiBfX0xJTlVYX01GRF9MUDg3M1hfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvc3RtcGUuaCBiL2luY2x1ZGUvbGludXgvbWZkL3N0bXBlLmgKaW5kZXggZGU3NDhiYy4uNGE4MjdhZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvc3RtcGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9zdG1wZS5oCkBAIC0yNiw2ICsyNiw3IEBACiAJU1RNUEU2MTAsCiAJU1RNUEU4MDEsCiAJU1RNUEU4MTEsCisJU1RNUEUxNjAwLAogCVNUTVBFMTYwMSwKIAlTVE1QRTE4MDEsCiAJU1RNUEUyNDAxLApAQCAtMzksMjIgKzQwLDQyIEBACiAgKi8KIGVudW0gewogCVNUTVBFX0lEWF9DSElQX0lELAorCVNUTVBFX0lEWF9TWVNfQ1RSTCwKKwlTVE1QRV9JRFhfU1lTX0NUUkwyLAogCVNUTVBFX0lEWF9JQ1JfTFNCLAogCVNUTVBFX0lEWF9JRVJfTFNCLAorCVNUTVBFX0lEWF9JRVJfTVNCLAogCVNUTVBFX0lEWF9JU1JfTFNCLAogCVNUTVBFX0lEWF9JU1JfTVNCLAogCVNUTVBFX0lEWF9HUE1SX0xTQiwKKwlTVE1QRV9JRFhfR1BNUl9DU0IsCisJU1RNUEVfSURYX0dQTVJfTVNCLAogCVNUTVBFX0lEWF9HUFNSX0xTQiwKKwlTVE1QRV9JRFhfR1BTUl9DU0IsCisJU1RNUEVfSURYX0dQU1JfTVNCLAogCVNUTVBFX0lEWF9HUENSX0xTQiwKKwlTVE1QRV9JRFhfR1BDUl9DU0IsCisJU1RNUEVfSURYX0dQQ1JfTVNCLAogCVNUTVBFX0lEWF9HUERSX0xTQiwKKwlTVE1QRV9JRFhfR1BEUl9DU0IsCisJU1RNUEVfSURYX0dQRFJfTVNCLAorCVNUTVBFX0lEWF9HUEVEUl9MU0IsCisJU1RNUEVfSURYX0dQRURSX0NTQiwKIAlTVE1QRV9JRFhfR1BFRFJfTVNCLAogCVNUTVBFX0lEWF9HUFJFUl9MU0IsCisJU1RNUEVfSURYX0dQUkVSX0NTQiwKKwlTVE1QRV9JRFhfR1BSRVJfTVNCLAogCVNUTVBFX0lEWF9HUEZFUl9MU0IsCisJU1RNUEVfSURYX0dQRkVSX0NTQiwKKwlTVE1QRV9JRFhfR1BGRVJfTVNCLAogCVNUTVBFX0lEWF9HUFBVUl9MU0IsCiAJU1RNUEVfSURYX0dQUERSX0xTQiwKIAlTVE1QRV9JRFhfR1BBRlJfVV9NU0IsCiAJU1RNUEVfSURYX0lFR1BJT1JfTFNCLAorCVNUTVBFX0lEWF9JRUdQSU9SX0NTQiwKKwlTVE1QRV9JRFhfSUVHUElPUl9NU0IsCiAJU1RNUEVfSURYX0lTR1BJT1JfTFNCLAorCVNUTVBFX0lEWF9JU0dQSU9SX0NTQiwKIAlTVE1QRV9JRFhfSVNHUElPUl9NU0IsCiAJU1RNUEVfSURYX01BWCwKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC90aV9hbTMzNXhfdHNjYWRjLmggYi9pbmNsdWRlL2xpbnV4L21mZC90aV9hbTMzNXhfdHNjYWRjLmgKaW5kZXggMjU2N2E4Ny4uN2Y1NWI4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvdGlfYW0zMzV4X3RzY2FkYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3RpX2FtMzM1eF90c2NhZGMuaApAQCAtMTM4LDE2ICsxMzgsMTYgQEAKIC8qCiAgKiB0aW1lIGluIHVzIGZvciBwcm9jZXNzaW5nIGEgc2luZ2xlIGNoYW5uZWwsIGNhbGN1bGF0ZWQgYXMgZm9sbG93czoKICAqCi0gKiBudW0gY3ljbGVzID0gb3BlbiBkZWxheSArIChzYW1wbGUgZGVsYXkgKyBjb252IHRpbWUpICogYXZlcmFnaW5nCisgKiBtYXggbnVtIGN5Y2xlcyA9IG9wZW4gZGVsYXkgKyAoc2FtcGxlIGRlbGF5ICsgY29udiB0aW1lKSAqIGF2ZXJhZ2luZwogICoKLSAqIG51bSBjeWNsZXM6IDE1MiArICgxICsgMTMpICogMTYgPSAzNzYKKyAqIG1heCBudW0gY3ljbGVzOiAyNjIxNDMgKyAoMjU1ICsgMTMpICogMTYgPSAyNjY0MzEKICAqCiAgKiBjbG9jayBmcmVxdWVuY3k6IDI2TUh6IC8gOCA9IDMuMjVNSHoKICAqIGNsb2NrIHBlcmlvZDogMSAvIDMuMjVNSHogPSAzMDhucwogICoKLSAqIHByb2Nlc3NpbmcgdGltZTogMzc2ICogMzA4bnMgPSAxMTZ1cworICogbWF4IHByb2Nlc3NpbmcgdGltZTogMjY2NDMxICogMzA4bnMgPSA4M21zKGFwcHJveCkKICAqLwotI2RlZmluZSBJRExFX1RJTUVPVVQgMTE2IC8qIG1pY3Jvc2VjICovCisjZGVmaW5lIElETEVfVElNRU9VVCA4MyAvKiBtaWxsaXNlY29uZHMgKi8KIAogI2RlZmluZSBUU0NBRENfQ0VMTFMJCTIKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvdHBzNjUyMTguaCBiL2luY2x1ZGUvbGludXgvbWZkL3RwczY1MjE4LmgKaW5kZXggN2ZkZjUzMi4uZDFkYjk1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvdHBzNjUyMTguaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC90cHM2NTIxOC5oCkBAIC02Myw2ICs2MywxMSBAQAogI2RlZmluZSBUUFM2NTIxOF9DSElQSURfQ0hJUF9NQVNLCTB4RjgKICNkZWZpbmUgVFBTNjUyMThfQ0hJUElEX1JFVl9NQVNLCTB4MDcKIAorI2RlZmluZSBUUFM2NTIxOF9SRVZfMV8wCQkweDAKKyNkZWZpbmUgVFBTNjUyMThfUkVWXzFfMQkJMHgxCisjZGVmaW5lIFRQUzY1MjE4X1JFVl8yXzAJCTB4MgorI2RlZmluZSBUUFM2NTIxOF9SRVZfMl8xCQkweDMKKwogI2RlZmluZSBUUFM2NTIxOF9JTlQxX1ZQUkcJCUJJVCg1KQogI2RlZmluZSBUUFM2NTIxOF9JTlQxX0FDCQlCSVQoNCkKICNkZWZpbmUgVFBTNjUyMThfSU5UMV9QQgkJQklUKDMpCkBAIC0yNjcsNiArMjcyLDcgQEAKIHN0cnVjdCB0cHM2NTIxOCB7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXVuc2lnbmVkIGludCBpZDsKKwl1OCByZXY7CiAKIAlzdHJ1Y3QgbXV0ZXggdHBzX2xvY2s7CQkvKiBsb2NrIGd1YXJkaW5nIHRoZSBkYXRhIHN0cnVjdHVyZSAqLwogCS8qIElSUSBEYXRhICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21pc2NkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCmluZGV4IDU0MzAzNzQuLjcyMjY5OGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCkBAIC0zLDYgKzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAKIC8qCiAgKglUaGVzZSBhbGxvY2F0aW9ucyBhcmUgbWFuYWdlZCBieSBkZXZpY2VAbGFuYW5hLm9yZy4gSWYgeW91IHVzZSBhbgpAQCAtNzAsNiArNzEsMTMgQEAKIGV4dGVybiBpbnQgbWlzY19yZWdpc3RlcihzdHJ1Y3QgbWlzY2RldmljZSAqbWlzYyk7CiBleHRlcm4gdm9pZCBtaXNjX2RlcmVnaXN0ZXIoc3RydWN0IG1pc2NkZXZpY2UgKm1pc2MpOwogCisvKgorICogSGVscGVyIG1hY3JvIGZvciBkcml2ZXJzIHRoYXQgZG9uJ3QgZG8gYW55dGhpbmcgc3BlY2lhbCBpbiBtb2R1bGUgaW5pdCAvIGV4aXQKKyAqIGNhbGwuIFRoaXMgaGVscHMgaW4gZWxlbWluYXRpbmcgb2YgYm9pbGVycGxhdGUgY29kZS4KKyAqLworI2RlZmluZSBtb2R1bGVfbWlzY19kZXZpY2UoX19taXNjX2RldmljZSkgXAorCW1vZHVsZV9kcml2ZXIoX19taXNjX2RldmljZSwgbWlzY19yZWdpc3RlciwgbWlzY19kZXJlZ2lzdGVyKQorCiAjZGVmaW5lIE1PRFVMRV9BTElBU19NSVNDREVWKG1pbm9yKQkJCQlcCiAJTU9EVUxFX0FMSUFTKCJjaGFyLW1ham9yLSIgX19zdHJpbmdpZnkoTUlTQ19NQUpPUikJXAogCSItIiBfX3N0cmluZ2lmeShtaW5vcikpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDQvY21kLmggYi9pbmNsdWRlL2xpbnV4L21seDQvY21kLmgKaW5kZXggMTE2YjI4NC4uMWYzNTY4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg0L2NtZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NC9jbWQuaApAQCAtMzA5LDcgKzMwOSw4IEBACiAJCSAgICAgIHN0cnVjdCBpZmxhX3ZmX3N0YXRzICp2Zl9zdGF0cyk7CiB1MzIgbWx4NF9jb21tX2dldF92ZXJzaW9uKHZvaWQpOwogaW50IG1seDRfc2V0X3ZmX21hYyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHBvcnQsIGludCB2ZiwgdTY0IG1hYyk7Ci1pbnQgbWx4NF9zZXRfdmZfdmxhbihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHBvcnQsIGludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcyk7CitpbnQgbWx4NF9zZXRfdmZfdmxhbihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHBvcnQsIGludCB2ZiwgdTE2IHZsYW4sCisJCSAgICAgdTggcW9zLCBfX2JlMTYgcHJvdG8pOwogaW50IG1seDRfc2V0X3ZmX3JhdGUoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBwb3J0LCBpbnQgdmYsIGludCBtaW5fdHhfcmF0ZSwKIAkJICAgICBpbnQgbWF4X3R4X3JhdGUpOwogaW50IG1seDRfc2V0X3ZmX3Nwb29mY2hrKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcG9ydCwgaW50IHZmLCBib29sIHNldHRpbmcpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbHg0L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9tbHg0L2RldmljZS5oCmluZGV4IDQyZGEzNTUuLjU5YjUwZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NC9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L21seDQvZGV2aWNlLmgKQEAgLTIyMSw2ICsyMjEsNyBAQAogCU1MWDRfREVWX0NBUF9GTEFHMl9ST0NFX1YxX1YyCQk9IDFVTEwgPDwgIDMzLAogCU1MWDRfREVWX0NBUF9GTEFHMl9ETUZTX1VDX01DX1NOSUZGRVIgICA9IDFVTEwgPDwgIDM0LAogCU1MWDRfREVWX0NBUF9GTEFHMl9ESUFHX1BFUl9QT1JUCT0gMVVMTCA8PCAgMzUsCisJTUxYNF9ERVZfQ0FQX0ZMQUcyX1NWTEFOX0JZX1FQICAgICAgICAgID0gMVVMTCA8PCAgMzYsCiB9OwogCiBlbnVtIHsKQEAgLTEzNzEsNiArMTM3Miw4IEBACiBpbnQgbWx4NF9TRVRfUE9SVF9WWExBTihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTggc3RlZXJpbmcsIGludCBlbmFibGUpOwogaW50IHNldF9waHZfYml0KHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCBpbnQgbmV3X3ZhbCk7CiBpbnQgZ2V0X3Bodl9iaXQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIGludCAqcGh2KTsKK2ludCBtbHg0X2dldF9pc192bGFuX29mZmxvYWRfZGlzYWJsZWQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsCisJCQkJICAgICAgYm9vbCAqdmxhbl9vZmZsb2FkX2Rpc2FibGVkKTsKIGludCBtbHg0X2ZpbmRfY2FjaGVkX21hYyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTY0IG1hYywgaW50ICppZHgpOwogaW50IG1seDRfZmluZF9jYWNoZWRfdmxhbihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTE2IHZpZCwgaW50ICppZHgpOwogaW50IG1seDRfcmVnaXN0ZXJfdmxhbihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTE2IHZsYW4sIGludCAqaW5kZXgpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbHg0L3FwLmggYi9pbmNsdWRlL2xpbnV4L21seDQvcXAuaAppbmRleCBkZWFhMjIxLi5iNGVlOGY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDQvcXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L21seDQvcXAuaApAQCAtMTYwLDYgKzE2MCw3IEBACiAKIGVudW0geyAvKiBmbCAqLwogCU1MWDRfRkxfQ1YJPSAxIDw8IDYsCisJTUxYNF9GTF9TVgk9IDEgPDwgNSwKIAlNTFg0X0ZMX0VUSF9ISURFX0NRRV9WTEFOCT0gMSA8PCAyLAogCU1MWDRfRkxfRVRIX1NSQ19DSEVDS19NQ19MQgk9IDEgPDwgMSwKIAlNTFg0X0ZMX0VUSF9TUkNfQ0hFQ0tfVUNfTEIJPSAxIDw8IDAsCkBAIC0yNjcsNiArMjY4LDcgQEAKIAlNTFg0X1VQRF9RUF9QQVRIX01BU0tfRlZMX1JYCQkJPSAxNiArIDMyLAogCU1MWDRfVVBEX1FQX1BBVEhfTUFTS19FVEhfU1JDX0NIRUNLX1VDX0xCCT0gMTggKyAzMiwKIAlNTFg0X1VQRF9RUF9QQVRIX01BU0tfRVRIX1NSQ19DSEVDS19NQ19MQgk9IDE5ICsgMzIsCisJTUxYNF9VUERfUVBfUEFUSF9NQVNLX1NWCQkJPSAyMiArIDMyLAogfTsKIAogZW51bSB7IC8qIHBhcmFtMyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbHg1L2NxLmggYi9pbmNsdWRlL2xpbnV4L21seDUvY3EuaAppbmRleCAyNTY2ZjZkLi43YzNjMGQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDUvY3EuaAorKysgYi9pbmNsdWRlL2xpbnV4L21seDUvY3EuaApAQCAtMTcwLDEyICsxNzAsMTIgQEAKIGludCBtbHg1X2luaXRfY3FfdGFibGUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CiB2b2lkIG1seDVfY2xlYW51cF9jcV90YWJsZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKIGludCBtbHg1X2NvcmVfY3JlYXRlX2NxKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2NvcmVfY3EgKmNxLAotCQkJc3RydWN0IG1seDVfY3JlYXRlX2NxX21ib3hfaW4gKmluLCBpbnQgaW5sZW4pOworCQkJdTMyICppbiwgaW50IGlubGVuKTsKIGludCBtbHg1X2NvcmVfZGVzdHJveV9jcShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jb3JlX2NxICpjcSk7CiBpbnQgbWx4NV9jb3JlX3F1ZXJ5X2NxKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2NvcmVfY3EgKmNxLAotCQkgICAgICAgc3RydWN0IG1seDVfcXVlcnlfY3FfbWJveF9vdXQgKm91dCk7CisJCSAgICAgICB1MzIgKm91dCwgaW50IG91dGxlbik7CiBpbnQgbWx4NV9jb3JlX21vZGlmeV9jcShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jb3JlX2NxICpjcSwKLQkJCXN0cnVjdCBtbHg1X21vZGlmeV9jcV9tYm94X2luICppbiwgaW50IGluX3N6KTsKKwkJCXUzMiAqaW4sIGludCBpbmxlbik7CiBpbnQgbWx4NV9jb3JlX21vZGlmeV9jcV9tb2RlcmF0aW9uKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQkJICAgc3RydWN0IG1seDVfY29yZV9jcSAqY3EsIHUxNiBjcV9wZXJpb2QsCiAJCQkJICAgdTE2IGNxX21heF9jb3VudCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDUvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L21seDUvZGV2aWNlLmgKaW5kZXggMGI2ZDE1Yy4uNzdjMTQxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg1L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NS9kZXZpY2UuaApAQCAtMTk4LDE5ICsxOTgsNiBAQAogfTsKIAogZW51bSB7Ci0JTUxYNV9BQ0NFU1NfTU9ERV9QQQk9IDAsCi0JTUxYNV9BQ0NFU1NfTU9ERV9NVFQJPSAxLAotCU1MWDVfQUNDRVNTX01PREVfS0xNCT0gMgotfTsKLQotZW51bSB7Ci0JTUxYNV9NS0VZX1JFTU9URV9JTlZBTAk9IDEgPDwgMjQsCi0JTUxYNV9NS0VZX0ZMQUdfU1lOQ19VTVIgPSAxIDw8IDI5LAotCU1MWDVfTUtFWV9CU0ZfRU4JPSAxIDw8IDMwLAotCU1MWDVfTUtFWV9MRU42NAkJPSAxIDw8IDMxLAotfTsKLQotZW51bSB7CiAJTUxYNV9FTl9SRAk9ICh1NjQpMSwKIAlNTFg1X0VOX1dSCT0gKHU2NCkyCiB9OwpAQCAtNDExLDMzICszOTgsNiBAQAogCU1MWDVfTUFYX1NHRV9SRAk9ICg1MTIgLSAxNiAtIDE2KSAvIDE2CiB9OwogCi1zdHJ1Y3QgbWx4NV9pbmJveF9oZHIgewotCV9fYmUxNgkJb3Bjb2RlOwotCXU4CQlyc3ZkWzRdOwotCV9fYmUxNgkJb3Btb2Q7Ci19OwotCi1zdHJ1Y3QgbWx4NV9vdXRib3hfaGRyIHsKLQl1OAkJc3RhdHVzOwotCXU4CQlyc3ZkWzNdOwotCV9fYmUzMgkJc3luZHJvbWU7Ci19OwotCi1zdHJ1Y3QgbWx4NV9jbWRfcXVlcnlfYWRhcHRlcl9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2NtZF9xdWVyeV9hZGFwdGVyX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmQwWzI0XTsKLQl1OAkJCWludGFwaW47Ci0JdTgJCQlyc3ZkMVsxM107Ci0JX19iZTE2CQkJdnNkX3ZlbmRvcl9pZDsKLQl1OAkJCXZzZFsyMDhdOwotCXU4CQkJdnNkX3BzaWRbMTZdOwotfTsKLQogZW51bSBtbHg1X29kcF90cmFuc3BvcnRfY2FwX2JpdHMgewogCU1MWDVfT0RQX1NVUFBPUlRfU0VORAkgPSAxIDw8IDMxLAogCU1MWDVfT0RQX1NVUFBPUlRfUkVDVgkgPSAxIDw8IDMwLApAQCAtNDU1LDMwICs0MTUsNiBAQAogCWNoYXIgcmVzZXJ2ZWQyWzB4ZTRdOwogfTsKIAotc3RydWN0IG1seDVfY21kX2luaXRfaGNhX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkMFsyXTsKLQlfX2JlMTYJCQlwcm9maWxlOwotCXU4CQkJcnN2ZDFbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9jbWRfaW5pdF9oY2FfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2NtZF90ZWFyZG93bl9oY2FfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmQwWzJdOwotCV9fYmUxNgkJCXByb2ZpbGU7Ci0JdTgJCQlyc3ZkMVs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2NtZF90ZWFyZG93bl9oY2FfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KIHN0cnVjdCBtbHg1X2NtZF9sYXlvdXQgewogCXU4CQl0eXBlOwogCXU4CQlyc3ZkMFszXTsKQEAgLTQ5NCw3ICs0MzAsNiBAQAogCXU4CQlzdGF0dXNfb3duOwogfTsKIAotCiBzdHJ1Y3QgaGVhbHRoX2J1ZmZlciB7CiAJX19iZTMyCQlhc3NlcnRfdmFyWzVdOwogCV9fYmUzMgkJcnN2ZDBbM107CkBAIC04NTYsMjQ1ICs3OTEsMTUgQEAKIAlzdHJ1Y3QgbWx4NV9jcWU2NAljcWU2NDsKIH07CiAKLXN0cnVjdCBtbHg1X3NycV9jdHggewotCXU4CQkJc3RhdGVfbG9nX3N6OwotCXU4CQkJcnN2ZDBbM107Ci0JX19iZTMyCQkJZmxhZ3NfeHJjZDsKLQlfX2JlMzIJCQlwZ29mZl9jcW47Ci0JdTgJCQlyc3ZkMVs0XTsKLQl1OAkJCWxvZ19wZ19zejsKLQl1OAkJCXJzdmQyWzddOwotCV9fYmUzMgkJCXBkOwotCV9fYmUxNgkJCWx3bTsKLQlfX2JlMTYJCQl3cWVfY250OwotCXU4CQkJcnN2ZDNbOF07Ci0JX19iZTY0CQkJZGJfcmVjb3JkOwotfTsKLQotc3RydWN0IG1seDVfY3JlYXRlX3NycV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCWlucHV0X3NycW47Ci0JdTgJCQlyc3ZkMFs0XTsKLQlzdHJ1Y3QgbWx4NV9zcnFfY3R4CWN0eDsKLQl1OAkJCXJzdmQxWzIwOF07Ci0JX19iZTY0CQkJcGFzWzBdOwotfTsKLQotc3RydWN0IG1seDVfY3JlYXRlX3NycV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JX19iZTMyCQkJc3JxbjsKLQl1OAkJCXJzdmRbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kZXN0cm95X3NycV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCXNycW47Ci0JdTgJCQlyc3ZkWzRdOwotfTsKLQotc3RydWN0IG1seDVfZGVzdHJveV9zcnFfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X3F1ZXJ5X3NycV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCXNycW47Ci0JdTgJCQlyc3ZkMFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X3F1ZXJ5X3NycV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkMFs4XTsKLQlzdHJ1Y3QgbWx4NV9zcnFfY3R4CWN0eDsKLQl1OAkJCXJzdmQxWzMyXTsKLQlfX2JlNjQJCQlwYXNbMF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9hcm1fc3JxX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJc3JxbjsKLQlfX2JlMTYJCQlyc3ZkOwotCV9fYmUxNgkJCWx3bTsKLX07Ci0KLXN0cnVjdCBtbHg1X2FybV9zcnFfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2NxX2NvbnRleHQgewotCXU4CQkJc3RhdHVzOwotCXU4CQkJY3FlX3N6X2ZsYWdzOwotCXU4CQkJc3Q7Ci0JdTgJCQlyc3ZkMzsKLQl1OAkJCXJzdmQ0WzZdOwotCV9fYmUxNgkJCXBhZ2Vfb2Zmc2V0OwotCV9fYmUzMgkJCWxvZ19zel91c3JfcGFnZTsKLQlfX2JlMTYJCQljcV9wZXJpb2Q7Ci0JX19iZTE2CQkJY3FfbWF4X2NvdW50OwotCV9fYmUxNgkJCXJzdmQyMDsKLQlfX2JlMTYJCQljX2VxbjsKLQl1OAkJCWxvZ19wZ19zejsKLQl1OAkJCXJzdmQyNVs3XTsKLQlfX2JlMzIJCQlsYXN0X25vdGlmaWVkX2luZGV4OwotCV9fYmUzMgkJCXNvbGljaXRfcHJvZHVjZXJfaW5kZXg7Ci0JX19iZTMyCQkJY29uc3VtZXJfY291bnRlcjsKLQlfX2JlMzIJCQlwcm9kdWNlcl9jb3VudGVyOwotCXU4CQkJcnN2ZDQ4WzhdOwotCV9fYmU2NAkJCWRiX3JlY29yZF9hZGRyOwotfTsKLQotc3RydWN0IG1seDVfY3JlYXRlX2NxX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJaW5wdXRfY3FuOwotCXU4CQkJcnN2ZHhbNF07Ci0Jc3RydWN0IG1seDVfY3FfY29udGV4dAljdHg7Ci0JdTgJCQlyc3ZkNlsxOTJdOwotCV9fYmU2NAkJCXBhc1swXTsKLX07Ci0KLXN0cnVjdCBtbHg1X2NyZWF0ZV9jcV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JX19iZTMyCQkJY3FuOwotCXU4CQkJcnN2ZDBbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kZXN0cm95X2NxX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJY3FuOwotCXU4CQkJcnN2ZDBbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kZXN0cm95X2NxX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmQwWzhdOwotfTsKLQotc3RydWN0IG1seDVfcXVlcnlfY3FfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQljcW47Ci0JdTgJCQlyc3ZkMFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X3F1ZXJ5X2NxX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmQwWzhdOwotCXN0cnVjdCBtbHg1X2NxX2NvbnRleHQJY3R4OwotCXU4CQkJcnN2ZDZbMTZdOwotCV9fYmU2NAkJCXBhc1swXTsKLX07Ci0KLXN0cnVjdCBtbHg1X21vZGlmeV9jcV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCWNxbjsKLQlfX2JlMzIJCQlmaWVsZF9zZWxlY3Q7Ci0Jc3RydWN0IG1seDVfY3FfY29udGV4dAljdHg7Ci0JdTgJCQlyc3ZkWzE5Ml07Ci0JX19iZTY0CQkJcGFzWzBdOwotfTsKLQotc3RydWN0IG1seDVfbW9kaWZ5X2NxX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9lbmFibGVfaGNhX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQotc3RydWN0IG1seDVfZW5hYmxlX2hjYV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQotc3RydWN0IG1seDVfZGlzYWJsZV9oY2FfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kaXNhYmxlX2hjYV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQotc3RydWN0IG1seDVfZXFfY29udGV4dCB7Ci0JdTgJCQlzdGF0dXM7Ci0JdTgJCQllY19vaTsKLQl1OAkJCXN0OwotCXU4CQkJcnN2ZDJbN107Ci0JX19iZTE2CQkJcGFnZV9wZmZzZXQ7Ci0JX19iZTMyCQkJbG9nX3N6X3Vzcl9wYWdlOwotCXU4CQkJcnN2ZDNbN107Ci0JdTgJCQlpbnRyOwotCXU4CQkJbG9nX3BhZ2Vfc2l6ZTsKLQl1OAkJCXJzdmQ0WzE1XTsKLQlfX2JlMzIJCQljb25zdW1lcl9jb3VudGVyOwotCV9fYmUzMgkJCXByb2R1c2VyX2NvdW50ZXI7Ci0JdTgJCQlyc3ZkNVsxNl07Ci19OwotCi1zdHJ1Y3QgbWx4NV9jcmVhdGVfZXFfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmQwWzNdOwotCXU4CQkJaW5wdXRfZXFuOwotCXU4CQkJcnN2ZDFbNF07Ci0Jc3RydWN0IG1seDVfZXFfY29udGV4dAljdHg7Ci0JdTgJCQlyc3ZkMls4XTsKLQlfX2JlNjQJCQlldmVudHNfbWFzazsKLQl1OAkJCXJzdmQzWzE3Nl07Ci0JX19iZTY0CQkJcGFzWzBdOwotfTsKLQotc3RydWN0IG1seDVfY3JlYXRlX2VxX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmQwWzNdOwotCXU4CQkJZXFfbnVtYmVyOwotCXU4CQkJcnN2ZDFbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kZXN0cm95X2VxX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkMFszXTsKLQl1OAkJCWVxbjsKLQl1OAkJCXJzdmQxWzRdOwotfTsKLQotc3RydWN0IG1seDVfZGVzdHJveV9lcV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQotc3RydWN0IG1seDVfbWFwX2VxX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTY0CQkJbWFzazsKLQl1OAkJCW11OwotCXU4CQkJcnN2ZDBbMl07Ci0JdTgJCQllcW47Ci0JdTgJCQlyc3ZkMVsyNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9tYXBfZXFfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X3F1ZXJ5X2VxX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkMFszXTsKLQl1OAkJCWVxbjsKLQl1OAkJCXJzdmQxWzRdOwotfTsKLQotc3RydWN0IG1seDVfcXVlcnlfZXFfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLQlzdHJ1Y3QgbWx4NV9lcV9jb250ZXh0CWN0eDsKK2VudW0geworCU1MWDVfTUtFWV9TVEFUVVNfRlJFRSA9IDEgPDwgNiwKIH07CiAKIGVudW0gewotCU1MWDVfTUtFWV9TVEFUVVNfRlJFRSA9IDEgPDwgNiwKKwlNTFg1X01LRVlfUkVNT1RFX0lOVkFMCT0gMSA8PCAyNCwKKwlNTFg1X01LRVlfRkxBR19TWU5DX1VNUiA9IDEgPDwgMjksCisJTUxYNV9NS0VZX0JTRl9FTgk9IDEgPDwgMzAsCisJTUxYNV9NS0VZX0xFTjY0CQk9IDEgPDwgMzEsCiB9OwogCiBzdHJ1Y3QgbWx4NV9ta2V5X3NlZyB7CkBAIC0xMTE5LDEzNCArODI0LDEyIEBACiAJdTgJCXJzdmQ0WzRdOwogfTsKIAotc3RydWN0IG1seDVfcXVlcnlfc3BlY2lhbF9jdHhzX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQotc3RydWN0IG1seDVfcXVlcnlfc3BlY2lhbF9jdHhzX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlkdW1wX2ZpbGxfbWtleTsKLQlfX2JlMzIJCQlyZXNlcnZlZF9sa2V5OwotfTsKLQotc3RydWN0IG1seDVfY3JlYXRlX21rZXlfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlpbnB1dF9ta2V5X2luZGV4OwotCV9fYmUzMgkJCWZsYWdzOwotCXN0cnVjdCBtbHg1X21rZXlfc2VnCXNlZzsKLQl1OAkJCXJzdmQxWzE2XTsKLQlfX2JlMzIJCQl4bGF0X29jdF9hY3Rfc2l6ZTsKLQlfX2JlMzIJCQlyc3ZkMjsKLQl1OAkJCXJzdmQzWzE2OF07Ci0JX19iZTY0CQkJcGFzWzBdOwotfTsKLQotc3RydWN0IG1seDVfY3JlYXRlX21rZXlfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCV9fYmUzMgkJCW1rZXk7Ci0JdTgJCQlyc3ZkWzRdOwotfTsKLQotc3RydWN0IG1seDVfZGVzdHJveV9ta2V5X21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJbWtleTsKLQl1OAkJCXJzdmRbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kZXN0cm95X21rZXlfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X3F1ZXJ5X21rZXlfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlta2V5OwotfTsKLQotc3RydWN0IG1seDVfcXVlcnlfbWtleV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JX19iZTY0CQkJcGFzWzBdOwotfTsKLQotc3RydWN0IG1seDVfbW9kaWZ5X21rZXlfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlta2V5OwotCV9fYmU2NAkJCXBhc1swXTsKLX07Ci0KLXN0cnVjdCBtbHg1X21vZGlmeV9ta2V5X21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kdW1wX21rZXlfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLX07Ci0KLXN0cnVjdCBtbHg1X2R1bXBfbWtleV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JX19iZTMyCQkJbWtleTsKLX07Ci0KLXN0cnVjdCBtbHg1X21hZF9pZmNfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMTYJCQlyZW1vdGVfbGlkOwotCXU4CQkJcnN2ZDA7Ci0JdTgJCQlwb3J0OwotCXU4CQkJcnN2ZDFbNF07Ci0JdTgJCQlkYXRhWzI1Nl07Ci19OwotCi1zdHJ1Y3QgbWx4NV9tYWRfaWZjX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci0JdTgJCQlkYXRhWzI1Nl07Ci19OwotCi1zdHJ1Y3QgbWx4NV9hY2Nlc3NfcmVnX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgkJaGRyOwotCXU4CQkJCXJzdmQwWzJdOwotCV9fYmUxNgkJCQlyZWdpc3Rlcl9pZDsKLQlfX2JlMzIJCQkJYXJnOwotCV9fYmUzMgkJCQlkYXRhWzBdOwotfTsKLQotc3RydWN0IG1seDVfYWNjZXNzX3JlZ19tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgkJaGRyOwotCXU4CQkJCXJzdmRbOF07Ci0JX19iZTMyCQkJCWRhdGFbMF07Ci19OwotCiAjZGVmaW5lIE1MWDVfQVRUUl9FWFRFTkRFRF9QT1JUX0lORk8JY3B1X3RvX2JlMTYoMHhmZjkwKQogCiBlbnVtIHsKIAlNTFhfRVhUX1BPUlRfQ0FQX0ZMQUdfRVhURU5ERURfUE9SVF9JTkZPCT0gMSA8PCAgMAogfTsKIAotc3RydWN0IG1seDVfYWxsb2NhdGVfcHN2X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIgICBoZHI7Ci0JX19iZTMyCQkJbnBzdl9wZDsKLQlfX2JlMzIJCQlyc3ZkX3BzdjA7Ci19OwotCi1zdHJ1Y3QgbWx4NV9hbGxvY2F0ZV9wc3Zfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyICBoZHI7Ci0JdTgJCQlyc3ZkWzhdOwotCV9fYmUzMgkJCXBzdl9pZHhbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kZXN0cm95X3Bzdl9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIgICAgICAgICAgICAgICAgICBwc3ZfbnVtYmVyOwotCXU4ICAgICAgICAgICAgICAgICAgICAgIHJzdmRbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kZXN0cm95X3Bzdl9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIgIGhkcjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICByc3ZkWzhdOwotfTsKLQogZW51bSB7CiAJVlBPUlRfU1RBVEVfRE9XTgkJPSAweDAsCiAJVlBPUlRfU1RBVEVfVVAJCQk9IDB4MSwKQEAgLTEzODEsNiArOTY0LDE4IEBACiAjZGVmaW5lIE1MWDVfQ0FQX0ZMT1dUQUJMRV9OSUNfUlhfTUFYKG1kZXYsIGNhcCkgXAogCU1MWDVfQ0FQX0ZMT1dUQUJMRV9NQVgobWRldiwgZmxvd190YWJsZV9wcm9wZXJ0aWVzX25pY19yZWNlaXZlLmNhcCkKIAorI2RlZmluZSBNTFg1X0NBUF9GTE9XVEFCTEVfU05JRkZFUl9SWChtZGV2LCBjYXApIFwKKwlNTFg1X0NBUF9GTE9XVEFCTEUobWRldiwgZmxvd190YWJsZV9wcm9wZXJ0aWVzX25pY19yZWNlaXZlX3NuaWZmZXIuY2FwKQorCisjZGVmaW5lIE1MWDVfQ0FQX0ZMT1dUQUJMRV9TTklGRkVSX1JYX01BWChtZGV2LCBjYXApIFwKKwlNTFg1X0NBUF9GTE9XVEFCTEVfTUFYKG1kZXYsIGZsb3dfdGFibGVfcHJvcGVydGllc19uaWNfcmVjZWl2ZV9zbmlmZmVyLmNhcCkKKworI2RlZmluZSBNTFg1X0NBUF9GTE9XVEFCTEVfU05JRkZFUl9UWChtZGV2LCBjYXApIFwKKwlNTFg1X0NBUF9GTE9XVEFCTEUobWRldiwgZmxvd190YWJsZV9wcm9wZXJ0aWVzX25pY190cmFuc21pdF9zbmlmZmVyLmNhcCkKKworI2RlZmluZSBNTFg1X0NBUF9GTE9XVEFCTEVfU05JRkZFUl9UWF9NQVgobWRldiwgY2FwKSBcCisJTUxYNV9DQVBfRkxPV1RBQkxFX01BWChtZGV2LCBmbG93X3RhYmxlX3Byb3BlcnRpZXNfbmljX3RyYW5zbWl0X3NuaWZmZXIuY2FwKQorCiAjZGVmaW5lIE1MWDVfQ0FQX0VTV19GTE9XVEFCTEUobWRldiwgY2FwKSBcCiAJTUxYNV9HRVQoZmxvd190YWJsZV9lc3dpdGNoX2NhcCwgXAogCQkgbWRldi0+aGNhX2NhcHNfY3VyW01MWDVfQ0FQX0VTV0lUQ0hfRkxPV19UQUJMRV0sIGNhcCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NS9kcml2ZXIuaCBiL2luY2x1ZGUvbGludXgvbWx4NS9kcml2ZXIuaAppbmRleCBjY2VhNmZiLi44NWM0Nzg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDUvZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg1L2RyaXZlci5oCkBAIC00OSwxMCArNDksNiBAQAogI2luY2x1ZGUgPGxpbnV4L21seDUvc3JxLmg+CiAKIGVudW0gewotCU1MWDVfUlFfQklUTUFTS19WU0QgPSAxIDw8IDEsCi19OwotCi1lbnVtIHsKIAlNTFg1X0JPQVJEX0lEX0xFTiA9IDY0LAogCU1MWDVfTUFYX05BTUVfTEVOID0gMTYsCiB9OwpAQCAtNDgxLDYgKzQ3Nyw3IEBACiB9OwogCiBzdHJ1Y3QgbWx4NV9lc3dpdGNoOworc3RydWN0IG1seDVfbGFnOwogCiBzdHJ1Y3QgbWx4NV9ybF9lbnRyeSB7CiAJdTMyICAgICAgICAgICAgICAgICAgICAgcmF0ZTsKQEAgLTU1NCw2ICs1NTEsNyBAQAogCXN0cnVjdCBtbHg1X2Zsb3dfc3RlZXJpbmcgKnN0ZWVyaW5nOwogCXN0cnVjdCBtbHg1X2Vzd2l0Y2ggICAgICplc3dpdGNoOwogCXN0cnVjdCBtbHg1X2NvcmVfc3Jpb3YJc3Jpb3Y7CisJc3RydWN0IG1seDVfbGFnCQkqbGFnOwogCXVuc2lnbmVkIGxvbmcJCXBjaV9kZXZfZGF0YTsKIAlzdHJ1Y3QgbWx4NV9mY19zdGF0cwkJZmNfc3RhdHM7CiAJc3RydWN0IG1seDVfcmxfdGFibGUgICAgICAgICAgICBybF90YWJsZTsKQEAgLTc3MSwxNCArNzY5LDE1IEBACiB2b2lkIG1seDVfY21kX2NsZWFudXAoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CiB2b2lkIG1seDVfY21kX3VzZV9ldmVudHMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CiB2b2lkIG1seDVfY21kX3VzZV9wb2xsaW5nKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwotaW50IG1seDVfY21kX3N0YXR1c190b19lcnIoc3RydWN0IG1seDVfb3V0Ym94X2hkciAqaGRyKTsKLWludCBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyX3YyKHZvaWQgKnB0cik7Ci1pbnQgbWx4NV9jb3JlX2dldF9jYXBzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIGVudW0gbWx4NV9jYXBfdHlwZSBjYXBfdHlwZSk7CisKIGludCBtbHg1X2NtZF9leGVjKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHZvaWQgKmluLCBpbnQgaW5fc2l6ZSwgdm9pZCAqb3V0LAogCQkgIGludCBvdXRfc2l6ZSk7CiBpbnQgbWx4NV9jbWRfZXhlY19jYihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB2b2lkICppbiwgaW50IGluX3NpemUsCiAJCSAgICAgdm9pZCAqb3V0LCBpbnQgb3V0X3NpemUsIG1seDVfY21kX2Nia190IGNhbGxiYWNrLAogCQkgICAgIHZvaWQgKmNvbnRleHQpOwordm9pZCBtbHg1X2NtZF9tYm94X3N0YXR1cyh2b2lkICpvdXQsIHU4ICpzdGF0dXMsIHUzMiAqc3luZHJvbWUpOworCitpbnQgbWx4NV9jb3JlX2dldF9jYXBzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIGVudW0gbWx4NV9jYXBfdHlwZSBjYXBfdHlwZSk7CiBpbnQgbWx4NV9jbWRfYWxsb2NfdWFyKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiAqdWFybik7CiBpbnQgbWx4NV9jbWRfZnJlZV91YXIoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHVhcm4pOwogaW50IG1seDVfYWxsb2NfdXVhcnMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfdXVhcl9pbmZvICp1dWFyaSk7CkBAIC04MDcsMTUgKzgwNiwxOCBAQAogCQkgICAgICB1MTYgbHdtLCBpbnQgaXNfc3JxKTsKIHZvaWQgbWx4NV9pbml0X21rZXlfdGFibGUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CiB2b2lkIG1seDVfY2xlYW51cF9ta2V5X3RhYmxlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOworaW50IG1seDVfY29yZV9jcmVhdGVfbWtleV9jYihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAorCQkJICAgICBzdHJ1Y3QgbWx4NV9jb3JlX21rZXkgKm1rZXksCisJCQkgICAgIHUzMiAqaW4sIGludCBpbmxlbiwKKwkJCSAgICAgdTMyICpvdXQsIGludCBvdXRsZW4sCisJCQkgICAgIG1seDVfY21kX2Nia190IGNhbGxiYWNrLCB2b2lkICpjb250ZXh0KTsKIGludCBtbHg1X2NvcmVfY3JlYXRlX21rZXkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKIAkJCSAgc3RydWN0IG1seDVfY29yZV9ta2V5ICpta2V5LAotCQkJICBzdHJ1Y3QgbWx4NV9jcmVhdGVfbWtleV9tYm94X2luICppbiwgaW50IGlubGVuLAotCQkJICBtbHg1X2NtZF9jYmtfdCBjYWxsYmFjaywgdm9pZCAqY29udGV4dCwKLQkJCSAgc3RydWN0IG1seDVfY3JlYXRlX21rZXlfbWJveF9vdXQgKm91dCk7CisJCQkgIHUzMiAqaW4sIGludCBpbmxlbik7CiBpbnQgbWx4NV9jb3JlX2Rlc3Ryb3lfbWtleShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkJICAgc3RydWN0IG1seDVfY29yZV9ta2V5ICpta2V5KTsKIGludCBtbHg1X2NvcmVfcXVlcnlfbWtleShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jb3JlX21rZXkgKm1rZXksCi0JCQkgc3RydWN0IG1seDVfcXVlcnlfbWtleV9tYm94X291dCAqb3V0LCBpbnQgb3V0bGVuKTsKKwkJCSB1MzIgKm91dCwgaW50IG91dGxlbik7CiBpbnQgbWx4NV9jb3JlX2R1bXBfZmlsbF9ta2V5KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2NvcmVfbWtleSAqX21rZXksCiAJCQkgICAgIHUzMiAqbWtleSk7CiBpbnQgbWx4NV9jb3JlX2FsbG9jX3BkKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiAqcGRuKTsKQEAgLTgyNiw4ICs4MjgsNiBAQAogdm9pZCBtbHg1X3BhZ2VhbGxvY19jbGVhbnVwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwogaW50IG1seDVfcGFnZWFsbG9jX3N0YXJ0KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwogdm9pZCBtbHg1X3BhZ2VhbGxvY19zdG9wKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwotaW50IG1seDVfc3Jpb3ZfaW5pdChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKLWludCBtbHg1X3NyaW92X2NsZWFudXAoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CiB2b2lkIG1seDVfY29yZV9yZXFfcGFnZXNfaGFuZGxlcihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgZnVuY19pZCwKIAkJCQkgczMyIG5wYWdlcyk7CiBpbnQgbWx4NV9zYXRpc2Z5X3N0YXJ0dXBfcGFnZXMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgaW50IGJvb3QpOwpAQCAtODY1LDcgKzg2NSw3IEBACiBpbnQgbWx4NV9kZWJ1Z19lcV9hZGQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfZXEgKmVxKTsKIHZvaWQgbWx4NV9kZWJ1Z19lcV9yZW1vdmUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfZXEgKmVxKTsKIGludCBtbHg1X2NvcmVfZXFfcXVlcnkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfZXEgKmVxLAotCQkgICAgICAgc3RydWN0IG1seDVfcXVlcnlfZXFfbWJveF9vdXQgKm91dCwgaW50IG91dGxlbik7CisJCSAgICAgICB1MzIgKm91dCwgaW50IG91dGxlbik7CiBpbnQgbWx4NV9lcV9kZWJ1Z2ZzX2luaXQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CiB2b2lkIG1seDVfZXFfZGVidWdmc19jbGVhbnVwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwogaW50IG1seDVfY3FfZGVidWdmc19pbml0KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwpAQCAtOTMwLDYgKzkzMCw4IEBACiBzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgewogCXZvaWQgKgkJCSgqYWRkKShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKIAl2b2lkCQkJKCpyZW1vdmUpKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHZvaWQgKmNvbnRleHQpOworCWludAkJCSgqYXR0YWNoKShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB2b2lkICpjb250ZXh0KTsKKwl2b2lkCQkJKCpkZXRhY2gpKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHZvaWQgKmNvbnRleHQpOwogCXZvaWQJCQkoKmV2ZW50KShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB2b2lkICpjb250ZXh0LAogCQkJCQkgZW51bSBtbHg1X2Rldl9ldmVudCBldmVudCwgdW5zaWduZWQgbG9uZyBwYXJhbSk7CiAJdm9pZCAqICAgICAgICAgICAgICAgICAgKCpnZXRfZGV2KSh2b2lkICpjb250ZXh0KTsKQEAgLTk0Miw2ICs5NDQsMTEgQEAKIHZvaWQgbWx4NV91bnJlZ2lzdGVyX2ludGVyZmFjZShzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgKmludGYpOwogaW50IG1seDVfY29yZV9xdWVyeV92ZW5kb3JfaWQoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHUzMiAqdmVuZG9yX2lkKTsKIAoraW50IG1seDVfY21kX2NyZWF0ZV92cG9ydF9sYWcoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CitpbnQgbWx4NV9jbWRfZGVzdHJveV92cG9ydF9sYWcoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7Citib29sIG1seDVfbGFnX2lzX2FjdGl2ZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKK3N0cnVjdCBuZXRfZGV2aWNlICptbHg1X2xhZ19nZXRfcm9jZV9uZXRkZXYoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CisKIHN0cnVjdCBtbHg1X3Byb2ZpbGUgewogCXU2NAltYXNrOwogCXU4CWxvZ19tYXhfcXA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDUvZnMuaCBiL2luY2x1ZGUvbGludXgvbWx4NS9mcy5oCmluZGV4IGUwMzZkNjAuLjkzZWJjNWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NS9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NS9mcy5oCkBAIC01NCw2ICs1NCw3IEBACiAKIGVudW0gbWx4NV9mbG93X25hbWVzcGFjZV90eXBlIHsKIAlNTFg1X0ZMT1dfTkFNRVNQQUNFX0JZUEFTUywKKwlNTFg1X0ZMT1dfTkFNRVNQQUNFX0xBRywKIAlNTFg1X0ZMT1dfTkFNRVNQQUNFX09GRkxPQURTLAogCU1MWDVfRkxPV19OQU1FU1BBQ0VfRVRIVE9PTCwKIAlNTFg1X0ZMT1dfTkFNRVNQQUNFX0tFUk5FTCwKQEAgLTYyLDYgKzYzLDggQEAKIAlNTFg1X0ZMT1dfTkFNRVNQQUNFX0ZEQiwKIAlNTFg1X0ZMT1dfTkFNRVNQQUNFX0VTV19FR1JFU1MsCiAJTUxYNV9GTE9XX05BTUVTUEFDRV9FU1dfSU5HUkVTUywKKwlNTFg1X0ZMT1dfTkFNRVNQQUNFX1NOSUZGRVJfUlgsCisJTUxYNV9GTE9XX05BTUVTUEFDRV9TTklGRkVSX1RYLAogfTsKIAogc3RydWN0IG1seDVfZmxvd190YWJsZTsKQEAgLTEwNiw2ICsxMDksOSBAQAogCQkJICAgICBpbnQgcHJpbywKIAkJCSAgICAgaW50IG51bV9mbG93X3RhYmxlX2VudHJpZXMsCiAJCQkgICAgIHUzMiBsZXZlbCwgdTE2IHZwb3J0KTsKK3N0cnVjdCBtbHg1X2Zsb3dfdGFibGUgKm1seDVfY3JlYXRlX2xhZ19kZW11eF9mbG93X3RhYmxlKAorCQkJCQkgICAgICAgc3RydWN0IG1seDVfZmxvd19uYW1lc3BhY2UgKm5zLAorCQkJCQkgICAgICAgaW50IHByaW8sIHUzMiBsZXZlbCk7CiBpbnQgbWx4NV9kZXN0cm95X2Zsb3dfdGFibGUoc3RydWN0IG1seDVfZmxvd190YWJsZSAqZnQpOwogCiAvKiBpbmJveCBzaG91bGQgYmUgc2V0IHdpdGggdGhlIGZvbGxvd2luZyB2YWx1ZXM6CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDUvbWx4NV9pZmMuaCBiL2luY2x1ZGUvbGludXgvbWx4NS9tbHg1X2lmYy5oCmluZGV4IDIxYmM0NTUuLjYwNDVkNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NS9tbHg1X2lmYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NS9tbHg1X2lmYy5oCkBAIC0xNTIsNyArMTUyLDcgQEAKIAlNTFg1X0NNRF9PUF9DT05GSUdfSU5UX01PREVSQVRJT04gICAgICAgICA9IDB4ODA0LAogCU1MWDVfQ01EX09QX0FDQ0VTU19SRUcgICAgICAgICAgICAgICAgICAgID0gMHg4MDUsCiAJTUxYNV9DTURfT1BfQVRUQUNIX1RPX01DRyAgICAgICAgICAgICAgICAgPSAweDgwNiwKLQlNTFg1X0NNRF9PUF9ERVRUQUNIX0ZST01fTUNHICAgICAgICAgICAgICA9IDB4ODA3LAorCU1MWDVfQ01EX09QX0RFVEFDSF9GUk9NX01DRyAgICAgICAgICAgICAgID0gMHg4MDcsCiAJTUxYNV9DTURfT1BfR0VUX0RST1BQRURfUEFDS0VUX0xPRyAgICAgICAgPSAweDgwYSwKIAlNTFg1X0NNRF9PUF9NQURfSUZDICAgICAgICAgICAgICAgICAgICAgICA9IDB4NTBkLAogCU1MWDVfQ01EX09QX1FVRVJZX01BRF9ERU1VWCAgICAgICAgICAgICAgID0gMHg4MGIsCkBAIC0xNzQsNiArMTc0LDEyIEBACiAJTUxYNV9DTURfT1BfREVMRVRFX0wyX1RBQkxFX0VOVFJZICAgICAgICAgPSAweDgyYiwKIAlNTFg1X0NNRF9PUF9TRVRfV09MX1JPTCAgICAgICAgICAgICAgICAgICA9IDB4ODMwLAogCU1MWDVfQ01EX09QX1FVRVJZX1dPTF9ST0wgICAgICAgICAgICAgICAgID0gMHg4MzEsCisJTUxYNV9DTURfT1BfQ1JFQVRFX0xBRyAgICAgICAgICAgICAgICAgICAgPSAweDg0MCwKKwlNTFg1X0NNRF9PUF9NT0RJRllfTEFHICAgICAgICAgICAgICAgICAgICA9IDB4ODQxLAorCU1MWDVfQ01EX09QX1FVRVJZX0xBRyAgICAgICAgICAgICAgICAgICAgID0gMHg4NDIsCisJTUxYNV9DTURfT1BfREVTVFJPWV9MQUcgICAgICAgICAgICAgICAgICAgPSAweDg0MywKKwlNTFg1X0NNRF9PUF9DUkVBVEVfVlBPUlRfTEFHICAgICAgICAgICAgICA9IDB4ODQ0LAorCU1MWDVfQ01EX09QX0RFU1RST1lfVlBPUlRfTEFHICAgICAgICAgICAgID0gMHg4NDUsCiAJTUxYNV9DTURfT1BfQ1JFQVRFX1RJUiAgICAgICAgICAgICAgICAgICAgPSAweDkwMCwKIAlNTFg1X0NNRF9PUF9NT0RJRllfVElSICAgICAgICAgICAgICAgICAgICA9IDB4OTAxLAogCU1MWDVfQ01EX09QX0RFU1RST1lfVElSICAgICAgICAgICAgICAgICAgID0gMHg5MDIsCkBAIC0yMTIsNiArMjE4LDggQEAKIAlNTFg1X0NNRF9PUF9ERUFMTE9DX0ZMT1dfQ09VTlRFUiAgICAgICAgICA9IDB4OTNhLAogCU1MWDVfQ01EX09QX1FVRVJZX0ZMT1dfQ09VTlRFUiAgICAgICAgICAgID0gMHg5M2IsCiAJTUxYNV9DTURfT1BfTU9ESUZZX0ZMT1dfVEFCTEUgICAgICAgICAgICAgPSAweDkzYywKKwlNTFg1X0NNRF9PUF9BTExPQ19FTkNBUF9IRUFERVIgICAgICAgICAgICA9IDB4OTNkLAorCU1MWDVfQ01EX09QX0RFQUxMT0NfRU5DQVBfSEVBREVSICAgICAgICAgID0gMHg5M2UsCiAJTUxYNV9DTURfT1BfTUFYCiB9OwogCkBAIC0yODEsNyArMjg5LDkgQEAKIAl1OCAgICAgICAgIG1vZGlmeV9yb290WzB4MV07CiAJdTggICAgICAgICBpZGVudGlmaWVkX21pc3NfdGFibGVfbW9kZVsweDFdOwogCXU4ICAgICAgICAgZmxvd190YWJsZV9tb2RpZnlbMHgxXTsKLQl1OCAgICAgICAgIHJlc2VydmVkX2F0XzdbMHgxOV07CisJdTggICAgICAgICBlbmNhcFsweDFdOworCXU4ICAgICAgICAgZGVjYXBbMHgxXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzlbMHgxN107CiAKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0XzIwWzB4Ml07CiAJdTggICAgICAgICBsb2dfbWF4X2Z0X3NpemVbMHg2XTsKQEAgLTQ3Myw3ICs0ODMsOSBAQAogCiBzdHJ1Y3QgbWx4NV9pZmNfZmxvd190YWJsZV9uaWNfY2FwX2JpdHMgewogCXU4ICAgICAgICAgbmljX3J4X211bHRpX3BhdGhfdGlyc1sweDFdOwotCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMVsweDFmZl07CisJdTggICAgICAgICBuaWNfcnhfbXVsdGlfcGF0aF90aXJzX2Z0c1sweDFdOworCXU4ICAgICAgICAgYWxsb3dfc25pZmZlcl9hbmRfbmljX3J4X3NoYXJlZF90aXJbMHgxXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzNbMHgxZmRdOwogCiAJc3RydWN0IG1seDVfaWZjX2Zsb3dfdGFibGVfcHJvcF9sYXlvdXRfYml0cyBmbG93X3RhYmxlX3Byb3BlcnRpZXNfbmljX3JlY2VpdmU7CiAKQEAgLTUxMiw3ICs1MjQsMTUgQEAKIAl1OCAgICAgICAgIG5pY192cG9ydF9ub2RlX2d1aWRfbW9kaWZ5WzB4MV07CiAJdTggICAgICAgICBuaWNfdnBvcnRfcG9ydF9ndWlkX21vZGlmeVsweDFdOwogCi0JdTggICAgICAgICByZXNlcnZlZF9hdF8yMFsweDdlMF07CisJdTggICAgICAgICB2eGxhbl9lbmNhcF9kZWNhcFsweDFdOworCXU4ICAgICAgICAgbnZncmVfZW5jYXBfZGVjYXBbMHgxXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzIyWzB4OV07CisJdTggICAgICAgICBsb2dfbWF4X2VuY2FwX2hlYWRlcnNbMHg1XTsKKwl1OCAgICAgICAgIHJlc2VydmVkXzJiWzB4Nl07CisJdTggICAgICAgICBtYXhfZW5jYXBfaGVhZGVyX3NpemVbMHhhXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfNDBbMHg3YzBdOworCiB9OwogCiBzdHJ1Y3QgbWx4NV9pZmNfcW9zX2NhcF9iaXRzIHsKQEAgLTc2Nyw3ICs3ODcsOSBAQAogCXU4ICAgICAgICAgb3V0X29mX3NlcV9jbnRbMHgxXTsKIAl1OCAgICAgICAgIHZwb3J0X2NvdW50ZXJzWzB4MV07CiAJdTggICAgICAgICByZXRyYW5zbWlzc2lvbl9xX2NvdW50ZXJzWzB4MV07Ci0JdTggICAgICAgICByZXNlcnZlZF9hdF8xODNbMHgzXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzE4M1sweDFdOworCXU4ICAgICAgICAgbW9kaWZ5X3JxX2NvdW50ZXJfc2V0X2lkWzB4MV07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8xODVbMHgxXTsKIAl1OCAgICAgICAgIG1heF9xcF9jbnRbMHhhXTsKIAl1OCAgICAgICAgIHBrZXlfdGFibGVfc2l6ZVsweDEwXTsKIApAQCAtODcwLDcgKzg5MiwxMCBAQAogCXU4ICAgICAgICAgcGFkX3R4X2V0aF9wYWNrZXRbMHgxXTsKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0XzI2M1sweDhdOwogCXU4ICAgICAgICAgbG9nX2JmX3JlZ19zaXplWzB4NV07Ci0JdTggICAgICAgICByZXNlcnZlZF9hdF8yNzBbMHgxMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzI3MFsweGJdOworCXU4ICAgICAgICAgbGFnX21hc3RlclsweDFdOworCXU4ICAgICAgICAgbnVtX2xhZ19wb3J0c1sweDRdOwogCiAJdTggICAgICAgICByZXNlcnZlZF9hdF8yODBbMHgxMF07CiAJdTggICAgICAgICBtYXhfd3FlX3N6X3NxWzB4MTBdOwpAQCAtMTkwNCw3ICsxOTI5LDcgQEAKIAogc3RydWN0IG1seDVfaWZjX3FwY19iaXRzIHsKIAl1OCAgICAgICAgIHN0YXRlWzB4NF07Ci0JdTggICAgICAgICByZXNlcnZlZF9hdF80WzB4NF07CisJdTggICAgICAgICBsYWdfdHhfcG9ydF9hZmZpbml0eVsweDRdOwogCXU4ICAgICAgICAgc3RbMHg4XTsKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwWzB4M107CiAJdTggICAgICAgICBwbV9zdGF0ZVsweDJdOwpAQCAtMTk2Niw3ICsxOTkxLDEwIEBACiAJdTggICAgICAgICByZXNlcnZlZF9hdF8zZTBbMHg4XTsKIAl1OCAgICAgICAgIGNxbl9zbmRbMHgxOF07CiAKLQl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwMFsweDQwXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwMFsweDhdOworCXU4ICAgICAgICAgZGV0aF9zcXBuWzB4MThdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF80MjBbMHgyMF07CiAKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQ0MFsweDhdOwogCXU4ICAgICAgICAgbGFzdF9hY2tlZF9wc25bMHgxOF07CkBAIC0yMDY0LDYgKzIwOTIsOCBAQAogCU1MWDVfRkxPV19DT05URVhUX0FDVElPTl9EUk9QICAgICAgPSAweDIsCiAJTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0ZXRF9ERVNUICA9IDB4NCwKIAlNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fQ09VTlQgICAgID0gMHg4LAorCU1MWDVfRkxPV19DT05URVhUX0FDVElPTl9FTkNBUCAgICAgPSAweDEwLAorCU1MWDVfRkxPV19DT05URVhUX0FDVElPTl9ERUNBUCAgICAgPSAweDIwLAogfTsKIAogc3RydWN0IG1seDVfaWZjX2Zsb3dfY29udGV4dF9iaXRzIHsKQEAgLTIwODMsNyArMjExMyw5IEBACiAJdTggICAgICAgICByZXNlcnZlZF9hdF9hMFsweDhdOwogCXU4ICAgICAgICAgZmxvd19jb3VudGVyX2xpc3Rfc2l6ZVsweDE4XTsKIAotCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfYzBbMHgxNDBdOworCXU4ICAgICAgICAgZW5jYXBfaWRbMHgyMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0X2UwWzB4MTIwXTsKIAogCXN0cnVjdCBtbHg1X2lmY19mdGVfbWF0Y2hfcGFyYW1fYml0cyBtYXRjaF92YWx1ZTsKIApAQCAtMjE0Niw3ICsyMTc4LDExIEBACiB9OwogCiBzdHJ1Y3QgbWx4NV9pZmNfdGlzY19iaXRzIHsKLQl1OCAgICAgICAgIHJlc2VydmVkX2F0XzBbMHhjXTsKKwl1OCAgICAgICAgIHN0cmljdF9sYWdfdHhfcG9ydF9hZmZpbml0eVsweDFdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMVsweDNdOworCXU4ICAgICAgICAgbGFnX3R4X3BvcnRfYWZmaW5pdHlbMHgwNF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzhbMHg0XTsKIAl1OCAgICAgICAgIHByaW9bMHg0XTsKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwWzB4MTBdOwogCkBAIC0yODA4LDcgKzI4NDQsNyBAQAogCiAJc3RydWN0IG1seDVfaWZjX3RhZ19tYXRjaGluZ190b3BvbG9neV9jb250ZXh0X2JpdHMgdGFnX21hdGNoaW5nX3RvcG9sb2d5X2NvbnRleHQ7CiAKLQl1OCAgICAgICAgIHJlc2VydmVkX2F0XzE4MFsweDE4MF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8xODBbMHgyMDBdOwogCiAJc3RydWN0IG1seDVfaWZjX3dxX2JpdHMgd3E7CiB9OwpAQCAtMzQ4OSw3ICszNTI1LDcgQEAKIAogCXU4ICAgICAgICAgc3luZHJvbWVbMHgyMF07CiAKLQl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4MjBdOworCXU4ICAgICAgICAgZHVtcF9maWxsX21rZXlbMHgyMF07CiAKIAl1OCAgICAgICAgIHJlc2RfbGtleVsweDIwXTsKIH07CkBAIC00MjEzLDYgKzQyNDksODUgQEAKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0XzYwWzB4MjBdOwogfTsKIAorc3RydWN0IG1seDVfaWZjX2VuY2FwX2hlYWRlcl9pbl9iaXRzIHsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzBbMHg1XTsKKwl1OCAgICAgICAgIGhlYWRlcl90eXBlWzB4M107CisJdTggICAgICAgICByZXNlcnZlZF9hdF84WzB4ZV07CisJdTggICAgICAgICBlbmNhcF9oZWFkZXJfc2l6ZVsweGFdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF8yMFsweDEwXTsKKwl1OCAgICAgICAgIGVuY2FwX2hlYWRlclsyXVsweDhdOworCisJdTggICAgICAgICBtb3JlX2VuY2FwX2hlYWRlclswXVsweDhdOworfTsKKworc3RydWN0IG1seDVfaWZjX3F1ZXJ5X2VuY2FwX2hlYWRlcl9vdXRfYml0cyB7CisJdTggICAgICAgICBzdGF0dXNbMHg4XTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzhbMHgxOF07CisKKwl1OCAgICAgICAgIHN5bmRyb21lWzB4MjBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF80MFsweGEwXTsKKworCXN0cnVjdCBtbHg1X2lmY19lbmNhcF9oZWFkZXJfaW5fYml0cyBlbmNhcF9oZWFkZXJbMF07Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfcXVlcnlfZW5jYXBfaGVhZGVyX2luX2JpdHMgeworCXU4ICAgICAgICAgb3Bjb2RlWzB4MTBdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTBbMHgxMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzIwWzB4MTBdOworCXU4ICAgICAgICAgb3BfbW9kWzB4MTBdOworCisJdTggICAgICAgICBlbmNhcF9pZFsweDIwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNjBbMHhhMF07Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfYWxsb2NfZW5jYXBfaGVhZGVyX291dF9iaXRzIHsKKwl1OCAgICAgICAgIHN0YXR1c1sweDhdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfOFsweDE4XTsKKworCXU4ICAgICAgICAgc3luZHJvbWVbMHgyMF07CisKKwl1OCAgICAgICAgIGVuY2FwX2lkWzB4MjBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF82MFsweDIwXTsKK307CisKK3N0cnVjdCBtbHg1X2lmY19hbGxvY19lbmNhcF9oZWFkZXJfaW5fYml0cyB7CisJdTggICAgICAgICBvcGNvZGVbMHgxMF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8xMFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjBbMHgxMF07CisJdTggICAgICAgICBvcF9tb2RbMHgxMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4YTBdOworCisJc3RydWN0IG1seDVfaWZjX2VuY2FwX2hlYWRlcl9pbl9iaXRzIGVuY2FwX2hlYWRlcjsKK307CisKK3N0cnVjdCBtbHg1X2lmY19kZWFsbG9jX2VuY2FwX2hlYWRlcl9vdXRfYml0cyB7CisJdTggICAgICAgICBzdGF0dXNbMHg4XTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzhbMHgxOF07CisKKwl1OCAgICAgICAgIHN5bmRyb21lWzB4MjBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF80MFsweDQwXTsKK307CisKK3N0cnVjdCBtbHg1X2lmY19kZWFsbG9jX2VuY2FwX2hlYWRlcl9pbl9iaXRzIHsKKwl1OCAgICAgICAgIG9wY29kZVsweDEwXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwWzB4MTBdOworCisJdTggICAgICAgICByZXNlcnZlZF8yMFsweDEwXTsKKwl1OCAgICAgICAgIG9wX21vZFsweDEwXTsKKworCXU4ICAgICAgICAgZW5jYXBfaWRbMHgyMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkXzYwWzB4MjBdOworfTsKKwogc3RydWN0IG1seDVfaWZjX3F1ZXJ5X2RjdF9vdXRfYml0cyB7CiAJdTggICAgICAgICBzdGF0dXNbMHg4XTsKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0XzhbMHgxOF07CkBAIC00NTE3LDcgKzQ2MzIsOSBAQAogc3RydWN0IG1seDVfaWZjX21vZGlmeV90aXNfYml0bWFza19iaXRzIHsKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0XzBbMHgyMF07CiAKLQl1OCAgICAgICAgIHJlc2VydmVkX2F0XzIwWzB4MWZdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjBbMHgxZF07CisJdTggICAgICAgICBsYWdfdHhfcG9ydF9hZmZpbml0eVsweDFdOworCXU4ICAgICAgICAgc3RyaWN0X2xhZ190eF9wb3J0X2FmZmluaXR5WzB4MV07CiAJdTggICAgICAgICBwcmlvWzB4MV07CiB9OwogCkBAIC00NjUyLDYgKzQ3NjksMTEgQEAKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4NDBdOwogfTsKIAorZW51bSB7CisJTUxYNV9NT0RJRllfUlFfSU5fTU9ESUZZX0JJVE1BU0tfVlNEID0gMVVMTCA8PCAxLAorCU1MWDVfTU9ESUZZX1JRX0lOX01PRElGWV9CSVRNQVNLX01PRElGWV9SUV9DT1VOVEVSX1NFVF9JRCA9IDFVTEwgPDwgMywKK307CisKIHN0cnVjdCBtbHg1X2lmY19tb2RpZnlfcnFfaW5fYml0cyB7CiAJdTggICAgICAgICBvcGNvZGVbMHgxMF07CiAJdTggICAgICAgICByZXNlcnZlZF9hdF8xMFsweDEwXTsKQEAgLTQ3MjEsNyArNDg0Myw3IEBACiAJdTggICAgICAgICByZXNlcnZlZF9hdF8wWzB4MTZdOwogCXU4ICAgICAgICAgbm9kZV9ndWlkWzB4MV07CiAJdTggICAgICAgICBwb3J0X2d1aWRbMHgxXTsKLQl1OCAgICAgICAgIHJlc2VydmVkX2F0XzE4WzB4MV07CisJdTggICAgICAgICBtaW5faW5saW5lWzB4MV07CiAJdTggICAgICAgICBtdHVbMHgxXTsKIAl1OCAgICAgICAgIGNoYW5nZV9ldmVudFsweDFdOwogCXU4ICAgICAgICAgcHJvbWlzY1sweDFdOwpAQCAtNjA5OSw3ICs2MjIxLDkgQEAKIAogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfYTBbMHgyMF07CiAKLQl1OCAgICAgICAgIHJlc2VydmVkX2F0X2MwWzB4NF07CisJdTggICAgICAgICBlbmNhcF9lblsweDFdOworCXU4ICAgICAgICAgZGVjYXBfZW5bMHgxXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0X2MyWzB4Ml07CiAJdTggICAgICAgICB0YWJsZV9taXNzX21vZGVbMHg0XTsKIAl1OCAgICAgICAgIGxldmVsWzB4OF07CiAJdTggICAgICAgICByZXNlcnZlZF9hdF9kMFsweDhdOwpAQCAtNjEwOCw3ICs2MjMyLDEwIEBACiAJdTggICAgICAgICByZXNlcnZlZF9hdF9lMFsweDhdOwogCXU4ICAgICAgICAgdGFibGVfbWlzc19pZFsweDE4XTsKIAotCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTAwWzB4MTAwXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwMFsweDhdOworCXU4ICAgICAgICAgbGFnX21hc3Rlcl9uZXh0X3RhYmxlX2lkWzB4MThdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF8xMjBbMHg4MF07CiB9OwogCiBzdHJ1Y3QgbWx4NV9pZmNfY3JlYXRlX2Zsb3dfZ3JvdXBfb3V0X2JpdHMgewpAQCAtNjcxMCw5ICs2ODM3LDEwIEBACiB9OwogCiBzdHJ1Y3QgbWx4NV9pZmNfcHR5c19yZWdfYml0cyB7Ci0JdTggICAgICAgICBhbl9kaXNhYmxlX2NhcFsweDFdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMFsweDFdOwogCXU4ICAgICAgICAgYW5fZGlzYWJsZV9hZG1pblsweDFdOwotCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMlsweDZdOworCXU4ICAgICAgICAgYW5fZGlzYWJsZV9jYXBbMHgxXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzNbMHg1XTsKIAl1OCAgICAgICAgIGxvY2FsX3BvcnRbMHg4XTsKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwWzB4ZF07CiAJdTggICAgICAgICBwcm90b19tYXNrWzB4M107CkBAIC03NTYyLDcgKzc2OTAsOCBAQAogfTsKIAogZW51bSB7Ci0JTUxYNV9NT0RJRllfRkxPV19UQUJMRV9NSVNTX1RBQkxFX0lEID0gMHgxLAorCU1MWDVfTU9ESUZZX0ZMT1dfVEFCTEVfTUlTU19UQUJMRV9JRCAgICAgPSAoMVVMIDw8IDApLAorCU1MWDVfTU9ESUZZX0ZMT1dfVEFCTEVfTEFHX05FWFRfVEFCTEVfSUQgPSAoMVVMIDw8IDE1KSwKIH07CiAKIHN0cnVjdCBtbHg1X2lmY19tb2RpZnlfZmxvd190YWJsZV9vdXRfYml0cyB7CkBAIC03NjAxLDcgKzc3MzAsMTAgQEAKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0X2UwWzB4OF07CiAJdTggICAgICAgICB0YWJsZV9taXNzX2lkWzB4MThdOwogCi0JdTggICAgICAgICByZXNlcnZlZF9hdF8xMDBbMHgxMDBdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTAwWzB4OF07CisJdTggICAgICAgICBsYWdfbWFzdGVyX25leHRfdGFibGVfaWRbMHgxOF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEyMFsweDgwXTsKIH07CiAKIHN0cnVjdCBtbHg1X2lmY19ldHNfdGNuX2NvbmZpZ19yZWdfYml0cyB7CkBAIC03NzA5LDQgKzc4NDEsMTM0IEBACiAJdTggICAgICAgICBlcnJvclsweDhdOwogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfYTBbMHgxNjBdOwogfTsKKworc3RydWN0IG1seDVfaWZjX2xhZ2NfYml0cyB7CisJdTggICAgICAgICByZXNlcnZlZF9hdF8wWzB4MWRdOworCXU4ICAgICAgICAgbGFnX3N0YXRlWzB4M107CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzIwWzB4MTRdOworCXU4ICAgICAgICAgdHhfcmVtYXBfYWZmaW5pdHlfMlsweDRdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMzhbMHg0XTsKKwl1OCAgICAgICAgIHR4X3JlbWFwX2FmZmluaXR5XzFbMHg0XTsKK307CisKK3N0cnVjdCBtbHg1X2lmY19jcmVhdGVfbGFnX291dF9iaXRzIHsKKwl1OCAgICAgICAgIHN0YXR1c1sweDhdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfOFsweDE4XTsKKworCXU4ICAgICAgICAgc3luZHJvbWVbMHgyMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4NDBdOworfTsKKworc3RydWN0IG1seDVfaWZjX2NyZWF0ZV9sYWdfaW5fYml0cyB7CisJdTggICAgICAgICBvcGNvZGVbMHgxMF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8xMFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjBbMHgxMF07CisJdTggICAgICAgICBvcF9tb2RbMHgxMF07CisKKwlzdHJ1Y3QgbWx4NV9pZmNfbGFnY19iaXRzIGN0eDsKK307CisKK3N0cnVjdCBtbHg1X2lmY19tb2RpZnlfbGFnX291dF9iaXRzIHsKKwl1OCAgICAgICAgIHN0YXR1c1sweDhdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfOFsweDE4XTsKKworCXU4ICAgICAgICAgc3luZHJvbWVbMHgyMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4NDBdOworfTsKKworc3RydWN0IG1seDVfaWZjX21vZGlmeV9sYWdfaW5fYml0cyB7CisJdTggICAgICAgICBvcGNvZGVbMHgxMF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8xMFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjBbMHgxMF07CisJdTggICAgICAgICBvcF9tb2RbMHgxMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4MjBdOworCXU4ICAgICAgICAgZmllbGRfc2VsZWN0WzB4MjBdOworCisJc3RydWN0IG1seDVfaWZjX2xhZ2NfYml0cyBjdHg7Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfcXVlcnlfbGFnX291dF9iaXRzIHsKKwl1OCAgICAgICAgIHN0YXR1c1sweDhdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfOFsweDE4XTsKKworCXU4ICAgICAgICAgc3luZHJvbWVbMHgyMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4NDBdOworCisJc3RydWN0IG1seDVfaWZjX2xhZ2NfYml0cyBjdHg7Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfcXVlcnlfbGFnX2luX2JpdHMgeworCXU4ICAgICAgICAgb3Bjb2RlWzB4MTBdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTBbMHgxMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzIwWzB4MTBdOworCXU4ICAgICAgICAgb3BfbW9kWzB4MTBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF80MFsweDQwXTsKK307CisKK3N0cnVjdCBtbHg1X2lmY19kZXN0cm95X2xhZ19vdXRfYml0cyB7CisJdTggICAgICAgICBzdGF0dXNbMHg4XTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzhbMHgxOF07CisKKwl1OCAgICAgICAgIHN5bmRyb21lWzB4MjBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF80MFsweDQwXTsKK307CisKK3N0cnVjdCBtbHg1X2lmY19kZXN0cm95X2xhZ19pbl9iaXRzIHsKKwl1OCAgICAgICAgIG9wY29kZVsweDEwXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwWzB4MTBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF8yMFsweDEwXTsKKwl1OCAgICAgICAgIG9wX21vZFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHg0MF07Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfY3JlYXRlX3Zwb3J0X2xhZ19vdXRfYml0cyB7CisJdTggICAgICAgICBzdGF0dXNbMHg4XTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzhbMHgxOF07CisKKwl1OCAgICAgICAgIHN5bmRyb21lWzB4MjBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF80MFsweDQwXTsKK307CisKK3N0cnVjdCBtbHg1X2lmY19jcmVhdGVfdnBvcnRfbGFnX2luX2JpdHMgeworCXU4ICAgICAgICAgb3Bjb2RlWzB4MTBdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTBbMHgxMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzIwWzB4MTBdOworCXU4ICAgICAgICAgb3BfbW9kWzB4MTBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF80MFsweDQwXTsKK307CisKK3N0cnVjdCBtbHg1X2lmY19kZXN0cm95X3Zwb3J0X2xhZ19vdXRfYml0cyB7CisJdTggICAgICAgICBzdGF0dXNbMHg4XTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzhbMHgxOF07CisKKwl1OCAgICAgICAgIHN5bmRyb21lWzB4MjBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF80MFsweDQwXTsKK307CisKK3N0cnVjdCBtbHg1X2lmY19kZXN0cm95X3Zwb3J0X2xhZ19pbl9iaXRzIHsKKwl1OCAgICAgICAgIG9wY29kZVsweDEwXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwWzB4MTBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF8yMFsweDEwXTsKKwl1OCAgICAgICAgIG9wX21vZFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHg0MF07Cit9OworCiAjZW5kaWYgLyogTUxYNV9JRkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbHg1L3BvcnQuaCBiL2luY2x1ZGUvbGludXgvbWx4NS9wb3J0LmgKaW5kZXggZTMwMTJjYy4uYjMwNjVhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg1L3BvcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L21seDUvcG9ydC5oCkBAIC02MSw2ICs2MSwzOSBAQAogI2RlZmluZSBNTFg1X0kyQ19BRERSX0hJR0gJCTB4NTEKICNkZWZpbmUgTUxYNV9FRVBST01fUEFHRV9MRU5HVEgJCTI1NgogCitlbnVtIG1seDVlX2xpbmtfbW9kZSB7CisJTUxYNUVfMTAwMEJBU0VfQ1hfU0dNSUkJID0gMCwKKwlNTFg1RV8xMDAwQkFTRV9LWAkgPSAxLAorCU1MWDVFXzEwR0JBU0VfQ1g0CSA9IDIsCisJTUxYNUVfMTBHQkFTRV9LWDQJID0gMywKKwlNTFg1RV8xMEdCQVNFX0tSCSA9IDQsCisJTUxYNUVfMjBHQkFTRV9LUjIJID0gNSwKKwlNTFg1RV80MEdCQVNFX0NSNAkgPSA2LAorCU1MWDVFXzQwR0JBU0VfS1I0CSA9IDcsCisJTUxYNUVfNTZHQkFTRV9SNAkgPSA4LAorCU1MWDVFXzEwR0JBU0VfQ1IJID0gMTIsCisJTUxYNUVfMTBHQkFTRV9TUgkgPSAxMywKKwlNTFg1RV8xMEdCQVNFX0VSCSA9IDE0LAorCU1MWDVFXzQwR0JBU0VfU1I0CSA9IDE1LAorCU1MWDVFXzQwR0JBU0VfTFI0CSA9IDE2LAorCU1MWDVFXzUwR0JBU0VfU1IyCSA9IDE4LAorCU1MWDVFXzEwMEdCQVNFX0NSNAkgPSAyMCwKKwlNTFg1RV8xMDBHQkFTRV9TUjQJID0gMjEsCisJTUxYNUVfMTAwR0JBU0VfS1I0CSA9IDIyLAorCU1MWDVFXzEwMEdCQVNFX0xSNAkgPSAyMywKKwlNTFg1RV8xMDBCQVNFX1RYCSA9IDI0LAorCU1MWDVFXzEwMDBCQVNFX1QJID0gMjUsCisJTUxYNUVfMTBHQkFTRV9UCQkgPSAyNiwKKwlNTFg1RV8yNUdCQVNFX0NSCSA9IDI3LAorCU1MWDVFXzI1R0JBU0VfS1IJID0gMjgsCisJTUxYNUVfMjVHQkFTRV9TUgkgPSAyOSwKKwlNTFg1RV81MEdCQVNFX0NSMgkgPSAzMCwKKwlNTFg1RV81MEdCQVNFX0tSMgkgPSAzMSwKKwlNTFg1RV9MSU5LX01PREVTX05VTUJFUiwKK307CisKKyNkZWZpbmUgTUxYNUVfUFJPVF9NQVNLKGxpbmtfbW9kZSkgKDEgPDwgbGlua19tb2RlKQorCiBpbnQgbWx4NV9zZXRfcG9ydF9jYXBzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHU4IHBvcnRfbnVtLCB1MzIgY2Fwcyk7CiBpbnQgbWx4NV9xdWVyeV9wb3J0X3B0eXMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyICpwdHlzLAogCQkJIGludCBwdHlzX3NpemUsIGludCBwcm90b19tYXNrLCB1OCBsb2NhbF9wb3J0KTsKQEAgLTcwLDkgKzEwMywxMCBAQAogCQkJCXUzMiAqcHJvdG9fYWRtaW4sIGludCBwcm90b19tYXNrKTsKIGludCBtbHg1X3F1ZXJ5X3BvcnRfbGlua193aWR0aF9vcGVyKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQkJICAgIHU4ICpsaW5rX3dpZHRoX29wZXIsIHU4IGxvY2FsX3BvcnQpOwotaW50IG1seDVfcXVlcnlfcG9ydF9wcm90b19vcGVyKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCi0JCQkgICAgICAgdTggKnByb3RvX29wZXIsIGludCBwcm90b19tYXNrLAotCQkJICAgICAgIHU4IGxvY2FsX3BvcnQpOworaW50IG1seDVfcXVlcnlfcG9ydF9pYl9wcm90b19vcGVyKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCisJCQkJICB1OCAqcHJvdG9fb3BlciwgdTggbG9jYWxfcG9ydCk7CitpbnQgbWx4NV9xdWVyeV9wb3J0X2V0aF9wcm90b19vcGVyKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCisJCQkJICAgdTMyICpwcm90b19vcGVyLCB1OCBsb2NhbF9wb3J0KTsKIGludCBtbHg1X3NldF9wb3J0X3B0eXMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgYm9vbCBhbl9kaXNhYmxlLAogCQkgICAgICAgdTMyIHByb3RvX2FkbWluLCBpbnQgcHJvdG9fbWFzayk7CiB2b2lkIG1seDVfdG9nZ2xlX3BvcnRfbGluayhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NS9xcC5oIGIvaW5jbHVkZS9saW51eC9tbHg1L3FwLmgKaW5kZXggNzg3OWJmNC4uMGFhY2IyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg1L3FwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg1L3FwLmgKQEAgLTEyMywxMiArMTIzLDEzIEBACiB9OwogCiBlbnVtIHsKLQlNTFg1X05PTl9aRVJPX1JRCT0gMCA8PCAyNCwKLQlNTFg1X1NSUV9SUQkJPSAxIDw8IDI0LAotCU1MWDVfQ1JRX1JRCQk9IDIgPDwgMjQsCi0JTUxYNV9aRVJPX0xFTl9SUQk9IDMgPDwgMjQKKwlNTFg1X05PTl9aRVJPX1JRCT0gMHgwLAorCU1MWDVfU1JRX1JRCQk9IDB4MSwKKwlNTFg1X0NSUV9SUQkJPSAweDIsCisJTUxYNV9aRVJPX0xFTl9SUQk9IDB4MwogfTsKIAorLyogVE9ETyBSRU0gKi8KIGVudW0gewogCS8qIHBhcmFtczEgKi8KIAlNTFg1X1FQX0JJVF9TUkUJCQkJPSAxIDw8IDE1LApAQCAtMTc4LDEyICsxNzksNiBAQAogfTsKIAogZW51bSB7Ci0JTUxYNV9RUF9MQVRfU0VOU0lUSVZFCT0gMSA8PCAyOCwKLQlNTFg1X1FQX0JMT0NLX01DQVNUCT0gMSA8PCAzMCwKLQlNTFg1X1FQX0VOQUJMRV9TSUcJPSAxIDw8IDMxLAotfTsKLQotZW51bSB7CiAJTUxYNV9SQ1ZfREJSCT0gMCwKIAlNTFg1X1NORF9EQlIJPSAxLAogfTsKQEAgLTQ4NCw2ICs0NzksNyBAQAogCXU4CQkJcm1hY1s2XTsKIH07CiAKKy8qIEZJWE1FOiB1c2UgbWx4NV9pZmMuaCBxcGMgKi8KIHN0cnVjdCBtbHg1X3FwX2NvbnRleHQgewogCV9fYmUzMgkJCWZsYWdzOwogCV9fYmUzMgkJCWZsYWdzX3BkOwpAQCAtNTI1LDk5ICs1MjEsNiBAQAogCXU4CQkJcnN2ZDFbMjRdOwogfTsKIAotc3RydWN0IG1seDVfY3JlYXRlX3FwX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJaW5wdXRfcXBuOwotCXU4CQkJcnN2ZDBbNF07Ci0JX19iZTMyCQkJb3B0X3BhcmFtX21hc2s7Ci0JdTgJCQlyc3ZkMVs0XTsKLQlzdHJ1Y3QgbWx4NV9xcF9jb250ZXh0CWN0eDsKLQl1OAkJCXJzdmQzWzE2XTsKLQlfX2JlNjQJCQlwYXNbMF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9jcmVhdGVfcXBfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCV9fYmUzMgkJCXFwbjsKLQl1OAkJCXJzdmQwWzRdOwotfTsKLQotc3RydWN0IG1seDVfZGVzdHJveV9xcF9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCXFwbjsKLQl1OAkJCXJzdmQwWzRdOwotfTsKLQotc3RydWN0IG1seDVfZGVzdHJveV9xcF9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkMFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X21vZGlmeV9xcF9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCXFwbjsKLQl1OAkJCXJzdmQwWzRdOwotCV9fYmUzMgkJCW9wdHBhcmFtOwotCXU4CQkJcnN2ZDFbNF07Ci0Jc3RydWN0IG1seDVfcXBfY29udGV4dAljdHg7Ci0JdTgJCQlyc3ZkMlsxNl07Ci19OwotCi1zdHJ1Y3QgbWx4NV9tb2RpZnlfcXBfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZDBbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9xdWVyeV9xcF9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCXFwbjsKLQl1OAkJCXJzdmRbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9xdWVyeV9xcF9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkMVs4XTsKLQlfX2JlMzIJCQlvcHRwYXJhbTsKLQl1OAkJCXJzdmQwWzRdOwotCXN0cnVjdCBtbHg1X3FwX2NvbnRleHQJY3R4OwotCXU4CQkJcnN2ZDJbMTZdOwotCV9fYmU2NAkJCXBhc1swXTsKLX07Ci0KLXN0cnVjdCBtbHg1X2NvbmZfc3FwX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJcXBuOwotCXU4CQkJcnN2ZFszXTsKLQl1OAkJCXR5cGU7Ci19OwotCi1zdHJ1Y3QgbWx4NV9jb25mX3NxcF9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQotc3RydWN0IG1seDVfYWxsb2NfeHJjZF9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2FsbG9jX3hyY2RfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCV9fYmUzMgkJCXhyY2RuOwotCXU4CQkJcnN2ZFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2RlYWxsb2NfeHJjZF9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCXhyY2RuOwotCXU4CQkJcnN2ZFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2RlYWxsb2NfeHJjZF9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgbWx4NV9jb3JlX3FwICpfX21seDVfcXBfbG9va3VwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiBxcG4pCiB7CiAJcmV0dXJuIHJhZGl4X3RyZWVfbG9va3VwKCZkZXYtPnByaXYucXBfdGFibGUudHJlZSwgcXBuKTsKQEAgLTYyOCwyOCArNTMxLDE3IEBACiAJcmV0dXJuIHJhZGl4X3RyZWVfbG9va3VwKCZkZXYtPnByaXYubWtleV90YWJsZS50cmVlLCBrZXkpOwogfQogCi1zdHJ1Y3QgbWx4NV9wYWdlX2ZhdWx0X3Jlc3VtZV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCWZsYWdzX3FwbjsKLQl1OAkJCXJlc2VydmVkWzRdOwotfTsKLQotc3RydWN0IG1seDVfcGFnZV9mYXVsdF9yZXN1bWVfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KIGludCBtbHg1X2NvcmVfY3JlYXRlX3FwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQlzdHJ1Y3QgbWx4NV9jb3JlX3FwICpxcCwKLQkJCXN0cnVjdCBtbHg1X2NyZWF0ZV9xcF9tYm94X2luICppbiwKKwkJCXUzMiAqaW4sCiAJCQlpbnQgaW5sZW4pOwotaW50IG1seDVfY29yZV9xcF9tb2RpZnkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2IG9wZXJhdGlvbiwKLQkJCXN0cnVjdCBtbHg1X21vZGlmeV9xcF9tYm94X2luICppbiwgaW50IHNxZF9ldmVudCwKK2ludCBtbHg1X2NvcmVfcXBfbW9kaWZ5KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUxNiBvcGNvZGUsCisJCQl1MzIgb3B0X3BhcmFtX21hc2ssIHZvaWQgKnFwYywKIAkJCXN0cnVjdCBtbHg1X2NvcmVfcXAgKnFwKTsKIGludCBtbHg1X2NvcmVfZGVzdHJveV9xcChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkJIHN0cnVjdCBtbHg1X2NvcmVfcXAgKnFwKTsKIGludCBtbHg1X2NvcmVfcXBfcXVlcnkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfY29yZV9xcCAqcXAsCi0JCSAgICAgICBzdHJ1Y3QgbWx4NV9xdWVyeV9xcF9tYm94X291dCAqb3V0LCBpbnQgb3V0bGVuKTsKKwkJICAgICAgIHUzMiAqb3V0LCBpbnQgb3V0bGVuKTsKIAogaW50IG1seDVfY29yZV94cmNkX2FsbG9jKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiAqeHJjZG4pOwogaW50IG1seDVfY29yZV94cmNkX2RlYWxsb2Moc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHhyY2RuKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NS92cG9ydC5oIGIvaW5jbHVkZS9saW51eC9tbHg1L3Zwb3J0LmgKaW5kZXggZTA4N2I3ZC4uNDUxYjBiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg1L3Zwb3J0LmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg1L3Zwb3J0LmgKQEAgLTQ1LDYgKzQ1LDggQEAKIAkJCQkgICAgIHUxNiB2cG9ydCwgdTggKmFkZHIpOwogdm9pZCBtbHg1X3F1ZXJ5X25pY192cG9ydF9taW5faW5saW5lKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LAogCQkJCSAgICAgdTggKm1pbl9pbmxpbmUpOworaW50IG1seDVfbW9kaWZ5X25pY192cG9ydF9taW5faW5saW5lKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LAorCQkJCSAgICAgdTE2IHZwb3J0LCB1OCBtaW5faW5saW5lKTsKIGludCBtbHg1X21vZGlmeV9uaWNfdnBvcnRfbWFjX2FkZHJlc3Moc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKIAkJCQkgICAgICB1MTYgdnBvcnQsIHU4ICphZGRyKTsKIGludCBtbHg1X3F1ZXJ5X25pY192cG9ydF9tdHUoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHUxNiAqbXR1KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW0uaCBiL2luY2x1ZGUvbGludXgvbW0uaAppbmRleCAwOGVkNTNlLi41ZjE0NTM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbS5oCkBAIC0yMDE0LDEwICsyMDE0LDEzIEBACiAKIGV4dGVybiB2b2lkIHNldF9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IGZpbGUgKm5ld19leGVfZmlsZSk7CiBleHRlcm4gc3RydWN0IGZpbGUgKmdldF9tbV9leGVfZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CitleHRlcm4gc3RydWN0IGZpbGUgKmdldF90YXNrX2V4ZV9maWxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAKIGV4dGVybiBib29sIG1heV9leHBhbmRfdm0oc3RydWN0IG1tX3N0cnVjdCAqLCB2bV9mbGFnc190LCB1bnNpZ25lZCBsb25nIG5wYWdlcyk7CiBleHRlcm4gdm9pZCB2bV9zdGF0X2FjY291bnQoc3RydWN0IG1tX3N0cnVjdCAqLCB2bV9mbGFnc190LCBsb25nIG5wYWdlcyk7CiAKK2V4dGVybiBib29sIHZtYV9pc19zcGVjaWFsX21hcHBpbmcoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgY29uc3Qgc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZyAqc20pOwogZXh0ZXJuIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqX2luc3RhbGxfc3BlY2lhbF9tYXBwaW5nKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCiAJCQkJICAgdW5zaWduZWQgbG9uZyBmbGFncywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaCBiL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaAppbmRleCBkODY3M2NhLi43M2ZhZDgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvY2FyZC5oCkBAIC0yOTIsNiArMjkyLDcgQEAKIAl1MzIJCQlyYXdfY2lkWzRdOwkvKiByYXcgY2FyZCBDSUQgKi8KIAl1MzIJCQlyYXdfY3NkWzRdOwkvKiByYXcgY2FyZCBDU0QgKi8KIAl1MzIJCQlyYXdfc2NyWzJdOwkvKiByYXcgY2FyZCBTQ1IgKi8KKwl1MzIJCQlyYXdfc3NyWzE2XTsJLyogcmF3IGNhcmQgU1NSICovCiAJc3RydWN0IG1tY19jaWQJCWNpZDsJCS8qIGNhcmQgaWRlbnRpZmljYXRpb24gKi8KIAlzdHJ1Y3QgbW1jX2NzZAkJY3NkOwkJLyogY2FyZCBzcGVjaWZpYyAqLwogCXN0cnVjdCBtbWNfZXh0X2NzZAlleHRfY3NkOwkvKiBtbWMgdjQgZXh0ZW5kZWQgY2FyZCBzcGVjaWZpYyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvY29yZS5oIGIvaW5jbHVkZS9saW51eC9tbWMvY29yZS5oCmluZGV4IGIwMWU3N2QuLjJiOTUzZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9jb3JlLmgKQEAgLTU1LDYgKzU1LDkgQEAKICNkZWZpbmUgTU1DX1JTUF9SNgkoTU1DX1JTUF9QUkVTRU5UfE1NQ19SU1BfQ1JDfE1NQ19SU1BfT1BDT0RFKQogI2RlZmluZSBNTUNfUlNQX1I3CShNTUNfUlNQX1BSRVNFTlR8TU1DX1JTUF9DUkN8TU1DX1JTUF9PUENPREUpCiAKKy8qIENhbiBiZSB1c2VkIGJ5IGNvcmUgdG8gcG9sbCBhZnRlciBzd2l0Y2ggdG8gTU1DIEhTIG1vZGUgKi8KKyNkZWZpbmUgTU1DX1JTUF9SMV9OT19DUkMJKE1NQ19SU1BfUFJFU0VOVHxNTUNfUlNQX09QQ09ERSkKKwogI2RlZmluZSBtbWNfcmVzcF90eXBlKGNtZCkJKChjbWQpLT5mbGFncyAmIChNTUNfUlNQX1BSRVNFTlR8TU1DX1JTUF8xMzZ8TU1DX1JTUF9DUkN8TU1DX1JTUF9CVVNZfE1NQ19SU1BfT1BDT0RFKSkKIAogLyoKQEAgLTEzMyw4ICsxMzYsMTIgQEAKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQJKnN0b3A7CiAKIAlzdHJ1Y3QgY29tcGxldGlvbgljb21wbGV0aW9uOworCXN0cnVjdCBjb21wbGV0aW9uCWNtZF9jb21wbGV0aW9uOwogCXZvaWQJCQkoKmRvbmUpKHN0cnVjdCBtbWNfcmVxdWVzdCAqKTsvKiBjb21wbGV0aW9uIGZ1bmN0aW9uICovCiAJc3RydWN0IG1tY19ob3N0CQkqaG9zdDsKKworCS8qIEFsbG93IG90aGVyIGNvbW1hbmRzIGR1cmluZyB0aGlzIG9uZ29pbmcgZGF0YSB0cmFuc2ZlciBvciBidXN5IHdhaXQgKi8KKwlib29sCQkJY2FwX2NtZF9kdXJpbmdfdGZyOwogfTsKIAogc3RydWN0IG1tY19jYXJkOwpAQCAtMTQ2LDYgKzE1Myw5IEBACiAJCQkJCSAgIHN0cnVjdCBtbWNfYXN5bmNfcmVxICosIGludCAqKTsKIGV4dGVybiBpbnQgbW1jX2ludGVycnVwdF9ocGkoc3RydWN0IG1tY19jYXJkICopOwogZXh0ZXJuIHZvaWQgbW1jX3dhaXRfZm9yX3JlcShzdHJ1Y3QgbW1jX2hvc3QgKiwgc3RydWN0IG1tY19yZXF1ZXN0ICopOworZXh0ZXJuIHZvaWQgbW1jX3dhaXRfZm9yX3JlcV9kb25lKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwKKwkJCQkgIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKTsKK2V4dGVybiBib29sIG1tY19pc19yZXFfZG9uZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKTsKIGV4dGVybiBpbnQgbW1jX3dhaXRfZm9yX2NtZChzdHJ1Y3QgbW1jX2hvc3QgKiwgc3RydWN0IG1tY19jb21tYW5kICosIGludCk7CiBleHRlcm4gaW50IG1tY19hcHBfY21kKHN0cnVjdCBtbWNfaG9zdCAqLCBzdHJ1Y3QgbW1jX2NhcmQgKik7CiBleHRlcm4gaW50IG1tY193YWl0X2Zvcl9hcHBfY21kKHN0cnVjdCBtbWNfaG9zdCAqLCBzdHJ1Y3QgbW1jX2NhcmQgKiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2R3X21tYy5oIGIvaW5jbHVkZS9saW51eC9tbWMvZHdfbW1jLmgKaW5kZXggODNiMGVkZmMuLmY1YWYyYmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL2R3X21tYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2R3X21tYy5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CiAKICNkZWZpbmUgTUFYX01DSV9TTE9UUwkyCiAKQEAgLTI1OSw2ICsyNjAsNyBAQAogCS8qIGRlbGF5IGluIG1TIGJlZm9yZSBkZXRlY3RpbmcgY2FyZHMgYWZ0ZXIgaW50ZXJydXB0ICovCiAJdTMyIGRldGVjdF9kZWxheV9tczsKIAorCXN0cnVjdCByZXNldF9jb250cm9sICpyc3RjOwogCXN0cnVjdCBkd19tY2lfZG1hX29wcyAqZG1hX29wczsKIAlzdHJ1Y3QgZG1hX3BkYXRhICpkYXRhOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaCBiL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaAppbmRleCBhYTRiZmJmLi4wYjI0Mzk0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCkBAIC0yODEsNiArMjgxLDcgQEAKICNkZWZpbmUgTU1DX0NBUF9EUklWRVJfVFlQRV9BCSgxIDw8IDIzKQkvKiBIb3N0IHN1cHBvcnRzIERyaXZlciBUeXBlIEEgKi8KICNkZWZpbmUgTU1DX0NBUF9EUklWRVJfVFlQRV9DCSgxIDw8IDI0KQkvKiBIb3N0IHN1cHBvcnRzIERyaXZlciBUeXBlIEMgKi8KICNkZWZpbmUgTU1DX0NBUF9EUklWRVJfVFlQRV9ECSgxIDw8IDI1KQkvKiBIb3N0IHN1cHBvcnRzIERyaXZlciBUeXBlIEQgKi8KKyNkZWZpbmUgTU1DX0NBUF9DTURfRFVSSU5HX1RGUgkoMSA8PCAyOSkJLyogQ29tbWFuZHMgZHVyaW5nIGRhdGEgdHJhbnNmZXIgKi8KICNkZWZpbmUgTU1DX0NBUF9DTUQyMwkJKDEgPDwgMzApCS8qIENNRDIzIHN1cHBvcnRlZC4gKi8KICNkZWZpbmUgTU1DX0NBUF9IV19SRVNFVAkoMSA8PCAzMSkJLyogSGFyZHdhcmUgcmVzZXQgKi8KIApAQCAtMzgyLDYgKzM4Myw5IEBACiAJc3RydWN0IG1tY19hc3luY19yZXEJKmFyZXE7CQkvKiBhY3RpdmUgYXN5bmMgcmVxICovCiAJc3RydWN0IG1tY19jb250ZXh0X2luZm8JY29udGV4dF9pbmZvOwkvKiBhc3luYyBzeW5jaHJvbml6YXRpb24gaW5mbyAqLwogCisJLyogT25nb2luZyBkYXRhIHRyYW5zZmVyIHRoYXQgYWxsb3dzIGNvbW1hbmRzIGR1cmluZyB0cmFuc2ZlciAqLworCXN0cnVjdCBtbWNfcmVxdWVzdAkqb25nb2luZ19tcnE7CisKICNpZmRlZiBDT05GSUdfRkFJTF9NTUNfUkVRVUVTVAogCXN0cnVjdCBmYXVsdF9hdHRyCWZhaWxfbW1jX3JlcXVlc3Q7CiAjZW5kaWYKQEAgLTQxOCw2ICs0MjIsNyBAQAogCiB2b2lkIG1tY19kZXRlY3RfY2hhbmdlKHN0cnVjdCBtbWNfaG9zdCAqLCB1bnNpZ25lZCBsb25nIGRlbGF5KTsKIHZvaWQgbW1jX3JlcXVlc3RfZG9uZShzdHJ1Y3QgbW1jX2hvc3QgKiwgc3RydWN0IG1tY19yZXF1ZXN0ICopOwordm9pZCBtbWNfY29tbWFuZF9kb25lKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgbW1jX3NpZ25hbF9zZGlvX2lycShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9zZGlvX2lkcy5oIGIvaW5jbHVkZS9saW51eC9tbWMvc2Rpb19pZHMuaAppbmRleCAwZDEyNmFlLi5kNDNlZjk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9zZGlvX2lkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL3NkaW9faWRzLmgKQEAgLTMyLDYgKzMyLDcgQEAKICNkZWZpbmUgU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzNDAJCTB4YTk0YwogI2RlZmluZSBTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzM0MQkJMHhhOTRkCiAjZGVmaW5lIFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMzVfNDMzOQkweDQzMzUKKyNkZWZpbmUgU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzOQkJMHg0MzM5CiAjZGVmaW5lIFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMzYyCQkweGE5NjIKICNkZWZpbmUgU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDM0MzAJCTB4YTlhNgogI2RlZmluZSBTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzQ1CQkweDQzNDUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW16b25lLmggYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCmluZGV4IGQ1NzJiNzguLjdmMmFlOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW16b25lLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaApAQCAtODI4LDkgKzgyOCwyMSBAQAogICovCiAjZGVmaW5lIHpvbmVfaWR4KHpvbmUpCQkoKHpvbmUpIC0gKHpvbmUpLT56b25lX3BnZGF0LT5ub2RlX3pvbmVzKQogCi1zdGF0aWMgaW5saW5lIGludCBwb3B1bGF0ZWRfem9uZShzdHJ1Y3Qgem9uZSAqem9uZSkKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgYSB6b25lIGhhcyBwYWdlcyBtYW5hZ2VkIGJ5IHRoZSBidWRkeSBhbGxvY2F0b3IuCisgKiBBbGwgdGhlIHJlY2xhaW0gZGVjaXNpb25zIGhhdmUgdG8gdXNlIHRoaXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4KKyAqIHBvcHVsYXRlZF96b25lKCkuIElmIHRoZSB3aG9sZSB6b25lIGlzIHJlc2VydmVkIHRoZW4gd2UgY2FuIGVhc2lseQorICogZW5kIHVwIHdpdGggcG9wdWxhdGVkX3pvbmUoKSAmJiAhbWFuYWdlZF96b25lKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYW5hZ2VkX3pvbmUoc3RydWN0IHpvbmUgKnpvbmUpCiB7Ci0JcmV0dXJuICghIXpvbmUtPnByZXNlbnRfcGFnZXMpOworCXJldHVybiB6b25lLT5tYW5hZ2VkX3BhZ2VzOworfQorCisvKiBSZXR1cm5zIHRydWUgaWYgYSB6b25lIGhhcyBtZW1vcnkgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBwb3B1bGF0ZWRfem9uZShzdHJ1Y3Qgem9uZSAqem9uZSkKK3sKKwlyZXR1cm4gem9uZS0+cHJlc2VudF9wYWdlczsKIH0KIAogZXh0ZXJuIGludCBtb3ZhYmxlX3pvbmU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21yb3V0ZS5oIGIvaW5jbHVkZS9saW51eC9tcm91dGUuaAppbmRleCBkMzUxZmQzLi5lNWZiODEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21yb3V0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbXJvdXRlLmgKQEAgLTEyMCw1ICsxMjAsNSBAQAogc3RydWN0IHJ0bXNnOwogaW50IGlwbXJfZ2V0X3JvdXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCi0JCSAgIHN0cnVjdCBydG1zZyAqcnRtLCBpbnQgbm93YWl0KTsKKwkJICAgc3RydWN0IHJ0bXNnICpydG0sIGludCBub3dhaXQsIHUzMiBwb3J0aWQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21yb3V0ZTYuaCBiL2luY2x1ZGUvbGludXgvbXJvdXRlNi5oCmluZGV4IDM5ODdiNjQuLjE5YTFjMGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXJvdXRlNi5oCisrKyBiL2luY2x1ZGUvbGludXgvbXJvdXRlNi5oCkBAIC0xMTYsNyArMTE2LDcgQEAKIAogc3RydWN0IHJ0bXNnOwogZXh0ZXJuIGludCBpcDZtcl9nZXRfcm91dGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgc3RydWN0IHJ0bXNnICpydG0sIGludCBub3dhaXQpOworCQkJICAgc3RydWN0IHJ0bXNnICpydG0sIGludCBub3dhaXQsIHUzMiBwb3J0aWQpOwogCiAjaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFCiBleHRlcm4gc3RydWN0IHNvY2sgKm1yb3V0ZTZfc29ja2V0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21zaS5oIGIvaW5jbHVkZS9saW51eC9tc2kuaAppbmRleCBlOGM4MWZiLi4wZGIzMjBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21zaS5oCisrKyBiL2luY2x1ZGUvbGludXgvbXNpLmgKQEAgLTY4LDcgKzY4LDcgQEAKIAl1bnNpZ25lZCBpbnQJCQludmVjX3VzZWQ7CiAJc3RydWN0IGRldmljZQkJCSpkZXY7CiAJc3RydWN0IG1zaV9tc2cJCQltc2c7Ci0JY29uc3Qgc3RydWN0IGNwdW1hc2sJCSphZmZpbml0eTsKKwlzdHJ1Y3QgY3B1bWFzawkJCSphZmZpbml0eTsKIAogCXVuaW9uIHsKIAkJLyogUENJIE1TSS9YIHNwZWNpZmljIGRhdGEgKi8KQEAgLTEyMyw3ICsxMjMsOCBAQAogfQogI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCiAKLXN0cnVjdCBtc2lfZGVzYyAqYWxsb2NfbXNpX2VudHJ5KHN0cnVjdCBkZXZpY2UgKmRldik7CitzdHJ1Y3QgbXNpX2Rlc2MgKmFsbG9jX21zaV9lbnRyeShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBudmVjLAorCQkJCSBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYWZmaW5pdHkpOwogdm9pZCBmcmVlX21zaV9lbnRyeShzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5KTsKIHZvaWQgX19wY2lfcmVhZF9tc2lfbXNnKHN0cnVjdCBtc2lfZGVzYyAqZW50cnksIHN0cnVjdCBtc2lfbXNnICptc2cpOwogdm9pZCBfX3BjaV93cml0ZV9tc2lfbXNnKHN0cnVjdCBtc2lfZGVzYyAqZW50cnksIHN0cnVjdCBtc2lfbXNnICptc2cpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXQuaCBiL2luY2x1ZGUvbGludXgvbmV0LmgKaW5kZXggYjlmMGZmNC4uY2QwYzhiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldC5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgva21lbWNoZWNrLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9vbmNlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KIAogI2luY2x1ZGUgPHVhcGkvbGludXgvbmV0Lmg+CiAKQEAgLTEyOCw2ICsxMjksOSBAQAogc3RydWN0IHNvY2thZGRyOwogc3RydWN0IG1zZ2hkcjsKIHN0cnVjdCBtb2R1bGU7CitzdHJ1Y3Qgc2tfYnVmZjsKK3R5cGVkZWYgaW50ICgqc2tfcmVhZF9hY3Rvcl90KShyZWFkX2Rlc2NyaXB0b3JfdCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLAorCQkJICAgICAgIHVuc2lnbmVkIGludCwgc2l6ZV90KTsKIAogc3RydWN0IHByb3RvX29wcyB7CiAJaW50CQlmYW1pbHk7CkBAIC0xODYsNiArMTkwLDggQEAKIAkJCQkgICAgICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKTsKIAlpbnQJCSgqc2V0X3BlZWtfb2ZmKShzdHJ1Y3Qgc29jayAqc2ssIGludCB2YWwpOwogCWludAkJKCpwZWVrX2xlbikoc3RydWN0IHNvY2tldCAqc29jayk7CisJaW50CQkoKnJlYWRfc29jaykoc3RydWN0IHNvY2sgKnNrLCByZWFkX2Rlc2NyaXB0b3JfdCAqZGVzYywKKwkJCQkgICAgIHNrX3JlYWRfYWN0b3JfdCByZWN2X2FjdG9yKTsKIH07CiAKICNkZWZpbmUgREVDTEFSRV9TT0NLQUREUih0eXBlLCBkc3QsIHNyYykJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKaW5kZXggMDc2ZGY1My4uMTM2YWU2YmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaApAQCAtNTIsNiArNTIsNyBAQAogI2luY2x1ZGUgPHVhcGkvbGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8dWFwaS9saW51eC9pZl9ib25kaW5nLmg+CiAjaW5jbHVkZSA8dWFwaS9saW51eC9wa3RfY2xzLmg+CisjaW5jbHVkZSA8bGludXgvaGFzaHRhYmxlLmg+CiAKIHN0cnVjdCBuZXRwb2xsX2luZm87CiBzdHJ1Y3QgZGV2aWNlOwpAQCAtNzg4LDYgKzc4OSw3IEBACiAJVENfU0VUVVBfQ0xTVTMyLAogCVRDX1NFVFVQX0NMU0ZMT1dFUiwKIAlUQ19TRVRVUF9NQVRDSEFMTCwKKwlUQ19TRVRVUF9DTFNCUEYsCiB9OwogCiBzdHJ1Y3QgdGNfY2xzX3UzMl9vZmZsb2FkOwpAQCAtNzk5LDYgKzgwMSw3IEBACiAJCXN0cnVjdCB0Y19jbHNfdTMyX29mZmxvYWQgKmNsc191MzI7CiAJCXN0cnVjdCB0Y19jbHNfZmxvd2VyX29mZmxvYWQgKmNsc19mbG93ZXI7CiAJCXN0cnVjdCB0Y19jbHNfbWF0Y2hhbGxfb2ZmbG9hZCAqY2xzX21hbGw7CisJCXN0cnVjdCB0Y19jbHNfYnBmX29mZmxvYWQgKmNsc19icGY7CiAJfTsKIH07CiAKQEAgLTkyMyw2ICs5MjYsMTQgQEAKICAqCTMuIFVwZGF0ZSBkZXYtPnN0YXRzIGFzeW5jaHJvbm91c2x5IGFuZCBhdG9taWNhbGx5LCBhbmQgZGVmaW5lCiAgKgkgICBuZWl0aGVyIG9wZXJhdGlvbi4KICAqCisgKiBib29sICgqbmRvX2hhc19vZmZsb2FkX3N0YXRzKShpbnQgYXR0cl9pZCkKKyAqCVJldHVybiB0cnVlIGlmIHRoaXMgZGV2aWNlIHN1cHBvcnRzIG9mZmxvYWQgc3RhdHMgb2YgdGhpcyBhdHRyX2lkLgorICoKKyAqIGludCAoKm5kb19nZXRfb2ZmbG9hZF9zdGF0cykoaW50IGF0dHJfaWQsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgKgl2b2lkICphdHRyX2RhdGEpCisgKglHZXQgc3RhdGlzdGljcyBmb3Igb2ZmbG9hZCBvcGVyYXRpb25zIGJ5IGF0dHJfaWQuIFdyaXRlIGl0IGludG8gdGhlCisgKglhdHRyX2RhdGEgcG9pbnRlci4KKyAqCiAgKiBpbnQgKCpuZG9fdmxhbl9yeF9hZGRfdmlkKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX2JlMTYgcHJvdG8sIHUxNiB2aWQpOwogICoJSWYgZGV2aWNlIHN1cHBvcnRzIFZMQU4gZmlsdGVyaW5nIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYQogICoJVkxBTiBpZCBpcyByZWdpc3RlcmVkLgpAQCAtOTM1LDcgKzk0Niw4IEBACiAgKgogICoJU1ItSU9WIG1hbmFnZW1lbnQgZnVuY3Rpb25zLgogICogaW50ICgqbmRvX3NldF92Zl9tYWMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2ZiwgdTgqIG1hYyk7Ci0gKiBpbnQgKCpuZG9fc2V0X3ZmX3ZsYW4pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcyk7CisgKiBpbnQgKCpuZG9fc2V0X3ZmX3ZsYW4pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2ZiwgdTE2IHZsYW4sCisgKgkJCSAgdTggcW9zLCBfX2JlMTYgcHJvdG8pOwogICogaW50ICgqbmRvX3NldF92Zl9yYXRlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmYsIGludCBtaW5fdHhfcmF0ZSwKICAqCQkJICBpbnQgbWF4X3R4X3JhdGUpOwogICogaW50ICgqbmRvX3NldF92Zl9zcG9vZmNoaykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZmLCBib29sIHNldHRpbmcpOwpAQCAtMTAzMCw3ICsxMDQyLDcgQEAKICAqCURlbGV0ZXMgdGhlIEZEQiBlbnRyeSBmcm9tIGRldiBjb3Jlc3BvbmRpbmcgdG8gYWRkci4KICAqIGludCAoKm5kb19mZGJfZHVtcCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogICoJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZmlsdGVyX2RldiwKLSAqCQkgICAgICAgaW50IGlkeCkKKyAqCQkgICAgICAgaW50ICppZHgpCiAgKglVc2VkIHRvIGFkZCBGREIgZW50cmllcyB0byBkdW1wIHJlcXVlc3RzLiBJbXBsZW1lbnRlcnMgc2hvdWxkIGFkZAogICoJZW50cmllcyB0byBza2IgYW5kIHVwZGF0ZSBpZHggd2l0aCB0aGUgbnVtYmVyIG9mIGVudHJpZXMuCiAgKgpAQCAtMTE1NCw2ICsxMTY2LDEwIEBACiAKIAlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQqICgqbmRvX2dldF9zdGF0czY0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkJICAgICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0b3JhZ2UpOworCWJvb2wJCQkoKm5kb19oYXNfb2ZmbG9hZF9zdGF0cykoaW50IGF0dHJfaWQpOworCWludAkJCSgqbmRvX2dldF9vZmZsb2FkX3N0YXRzKShpbnQgYXR0cl9pZCwKKwkJCQkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCQkgdm9pZCAqYXR0cl9kYXRhKTsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyogKCpuZG9fZ2V0X3N0YXRzKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogCWludAkJCSgqbmRvX3ZsYW5fcnhfYWRkX3ZpZCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTExNzIsNyArMTE4OCw4IEBACiAJaW50CQkJKCpuZG9fc2V0X3ZmX21hYykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJCSAgaW50IHF1ZXVlLCB1OCAqbWFjKTsKIAlpbnQJCQkoKm5kb19zZXRfdmZfdmxhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJCSAgIGludCBxdWV1ZSwgdTE2IHZsYW4sIHU4IHFvcyk7CisJCQkJCQkgICBpbnQgcXVldWUsIHUxNiB2bGFuLAorCQkJCQkJICAgdTggcW9zLCBfX2JlMTYgcHJvdG8pOwogCWludAkJCSgqbmRvX3NldF92Zl9yYXRlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkJICAgaW50IHZmLCBpbnQgbWluX3R4X3JhdGUsCiAJCQkJCQkgICBpbnQgbWF4X3R4X3JhdGUpOwpAQCAtMTI2Miw3ICsxMjc5LDcgQEAKIAkJCQkJCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZmlsdGVyX2RldiwKLQkJCQkJCWludCBpZHgpOworCQkJCQkJaW50ICppZHgpOwogCiAJaW50CQkJKCpuZG9fYnJpZGdlX3NldGxpbmspKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQkgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKQEAgLTE1NjEsOCArMTU3OCw2IEBACiAgKgogICoJQHhwc19tYXBzOglYWFg6IG5lZWQgY29tbWVudHMgb24gdGhpcyBvbmUKICAqCi0gKglAb2ZmbG9hZF9md2RfbWFyazoJT2ZmbG9hZCBkZXZpY2UgZndkaW5nIG1hcmsKLSAqCiAgKglAd2F0Y2hkb2dfdGltZW86CVJlcHJlc2VudHMgdGhlIHRpbWVvdXQgdGhhdCBpcyB1c2VkIGJ5CiAgKgkJCQl0aGUgd2F0Y2hkb2cgKHNlZSBkZXZfd2F0Y2hkb2coKSkKICAqCUB3YXRjaGRvZ190aW1lcjoJTGlzdCBvZiB0aW1lcnMKQEAgLTE3ODQsNyArMTc5OSw3IEBACiAjZW5kaWYKIAlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlIF9fcmN1ICppbmdyZXNzX3F1ZXVlOwogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfSU5HUkVTUwotCXN0cnVjdCBsaXN0X2hlYWQJbmZfaG9va3NfaW5ncmVzczsKKwlzdHJ1Y3QgbmZfaG9va19lbnRyeSBfX3JjdSAqbmZfaG9va3NfaW5ncmVzczsKICNlbmRpZgogCiAJdW5zaWduZWQgY2hhcgkJYnJvYWRjYXN0W01BWF9BRERSX0xFTl07CkBAIC0xODAwLDYgKzE4MTUsOSBAQAogCXVuc2lnbmVkIGludAkJbnVtX3R4X3F1ZXVlczsKIAl1bnNpZ25lZCBpbnQJCXJlYWxfbnVtX3R4X3F1ZXVlczsKIAlzdHJ1Y3QgUWRpc2MJCSpxZGlzYzsKKyNpZmRlZiBDT05GSUdfTkVUX1NDSEVECisJREVDTEFSRV9IQVNIVEFCTEUJKHFkaXNjX2hhc2gsIDQpOworI2VuZGlmCiAJdW5zaWduZWQgbG9uZwkJdHhfcXVldWVfbGVuOwogCXNwaW5sb2NrX3QJCXR4X2dsb2JhbF9sb2NrOwogCWludAkJCXdhdGNoZG9nX3RpbWVvOwpAQCAtMTgxMCw5ICsxODI4LDYgQEAKICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKIAlzdHJ1Y3QgdGNmX3Byb3RvIF9fcmN1ICAqZWdyZXNzX2NsX2xpc3Q7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfTkVUX1NXSVRDSERFVgotCXUzMgkJCW9mZmxvYWRfZndkX21hcms7Ci0jZW5kaWYKIAogCS8qIFRoZXNlIG1heSBiZSBuZWVkZWQgZm9yIGZ1dHVyZSBuZXR3b3JrLXBvd2VyLWRvd24gY29kZS4gKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdAl3YXRjaGRvZ190aW1lcjsKQEAgLTMyNjcsNiArMzI4Miw3IEBACiAJbmFwaS0+c2tiID0gTlVMTDsKIH0KIAorYm9vbCBuZXRkZXZfaXNfcnhfaGFuZGxlcl9idXN5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogaW50IG5ldGRldl9yeF9oYW5kbGVyX3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgICAgcnhfaGFuZGxlcl9mdW5jX3QgKnJ4X2hhbmRsZXIsCiAJCQkgICAgICAgdm9pZCAqcnhfaGFuZGxlcl9kYXRhKTsKQEAgLTM4OTEsOCArMzkwNyw3IEBACiBleHRlcm4gdTggbmV0ZGV2X3Jzc19rZXlbTkVUREVWX1JTU19LRVlfTEVOXSBfX3JlYWRfbW9zdGx5Owogdm9pZCBuZXRkZXZfcnNzX2tleV9maWxsKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbik7CiAKLWludCBkZXZfZ2V0X25lc3RfbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgIGJvb2wgKCp0eXBlX2NoZWNrKShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSk7CitpbnQgZGV2X2dldF9uZXN0X2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogaW50IHNrYl9jaGVja3N1bV9oZWxwKHN0cnVjdCBza19idWZmICpza2IpOwogc3RydWN0IHNrX2J1ZmYgKl9fc2tiX2dzb19zZWdtZW50KHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcywgYm9vbCB0eF9wYXRoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oCmluZGV4IDkyMzBmOWEuLmFiYzdmZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIuaApAQCAtNTUsMTIgKzU1LDM0IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm91dDsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAJc3RydWN0IG5ldCAqbmV0OwotCXN0cnVjdCBsaXN0X2hlYWQgKmhvb2tfbGlzdDsKKwlzdHJ1Y3QgbmZfaG9va19lbnRyeSBfX3JjdSAqaG9va19lbnRyaWVzOwogCWludCAoKm9rZm4pKHN0cnVjdCBuZXQgKiwgc3RydWN0IHNvY2sgKiwgc3RydWN0IHNrX2J1ZmYgKik7CiB9OwogCit0eXBlZGVmIHVuc2lnbmVkIGludCBuZl9ob29rZm4odm9pZCAqcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSk7CitzdHJ1Y3QgbmZfaG9va19vcHMgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKworCS8qIFVzZXIgZmlsbHMgaW4gZnJvbSBoZXJlIGRvd24uICovCisJbmZfaG9va2ZuCQkqaG9vazsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OworCXZvaWQJCQkqcHJpdjsKKwl1X2ludDhfdAkJcGY7CisJdW5zaWduZWQgaW50CQlob29rbnVtOworCS8qIEhvb2tzIGFyZSBvcmRlcmVkIGluIGFzY2VuZGluZyBwcmlvcml0eS4gKi8KKwlpbnQJCQlwcmlvcml0eTsKK307CisKK3N0cnVjdCBuZl9ob29rX2VudHJ5IHsKKwlzdHJ1Y3QgbmZfaG9va19lbnRyeSBfX3JjdQkqbmV4dDsKKwlzdHJ1Y3QgbmZfaG9va19vcHMJCW9wczsKKwljb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMJKm9yaWdfb3BzOworfTsKKwogc3RhdGljIGlubGluZSB2b2lkIG5mX2hvb2tfc3RhdGVfaW5pdChzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqcCwKLQkJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpob29rX2xpc3QsCisJCQkJICAgICAgc3RydWN0IG5mX2hvb2tfZW50cnkgKmhvb2tfZW50cnksCiAJCQkJICAgICAgdW5zaWduZWQgaW50IGhvb2ssCiAJCQkJICAgICAgaW50IHRocmVzaCwgdV9pbnQ4X3QgcGYsCiAJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2LApAQCAtNzYsMjYgKzk4LDExIEBACiAJcC0+b3V0ID0gb3V0ZGV2OwogCXAtPnNrID0gc2s7CiAJcC0+bmV0ID0gbmV0OwotCXAtPmhvb2tfbGlzdCA9IGhvb2tfbGlzdDsKKwlSQ1VfSU5JVF9QT0lOVEVSKHAtPmhvb2tfZW50cmllcywgaG9va19lbnRyeSk7CiAJcC0+b2tmbiA9IG9rZm47CiB9CiAKLXR5cGVkZWYgdW5zaWduZWQgaW50IG5mX2hvb2tmbih2b2lkICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKTsKIAotc3RydWN0IG5mX2hvb2tfb3BzIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIAlsaXN0OwotCi0JLyogVXNlciBmaWxscyBpbiBmcm9tIGhlcmUgZG93bi4gKi8KLQluZl9ob29rZm4JCSpob29rOwotCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7Ci0Jdm9pZAkJCSpwcml2OwotCXVfaW50OF90CQlwZjsKLQl1bnNpZ25lZCBpbnQJCWhvb2tudW07Ci0JLyogSG9va3MgYXJlIG9yZGVyZWQgaW4gYXNjZW5kaW5nIHByaW9yaXR5LiAqLwotCWludAkJCXByaW9yaXR5OwotfTsKIAogc3RydWN0IG5mX3NvY2tvcHRfb3BzIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CkBAIC0xMzMsNiArMTQwLDggQEAKIHZvaWQgbmZfdW5yZWdpc3Rlcl9ob29rKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnKTsKIGludCBuZl9yZWdpc3Rlcl9ob29rcyhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZywgdW5zaWduZWQgaW50IG4pOwogdm9pZCBuZl91bnJlZ2lzdGVyX2hvb2tzKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnLCB1bnNpZ25lZCBpbnQgbik7CitpbnQgX25mX3JlZ2lzdGVyX2hvb2tzKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnLCB1bnNpZ25lZCBpbnQgbik7Cit2b2lkIF9uZl91bnJlZ2lzdGVyX2hvb2tzKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnLCB1bnNpZ25lZCBpbnQgbik7CiAKIC8qIEZ1bmN0aW9ucyB0byByZWdpc3RlciBnZXQvc2V0c29ja29wdCByYW5nZXMgKG5vbi1pbmNsdXNpdmUpLiAgWW91CiAgICBuZWVkIHRvIGNoZWNrIHBlcm1pc3Npb25zIHlvdXJzZWxmISAqLwpAQCAtMTYxLDcgKzE3MCw4IEBACiAJCQkJIGludCAoKm9rZm4pKHN0cnVjdCBuZXQgKiwgc3RydWN0IHNvY2sgKiwgc3RydWN0IHNrX2J1ZmYgKiksCiAJCQkJIGludCB0aHJlc2gpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaG9va19saXN0OworCXN0cnVjdCBuZl9ob29rX2VudHJ5ICpob29rX2hlYWQ7CisJaW50IHJldCA9IDE7CiAKICNpZmRlZiBIQVZFX0pVTVBfTEFCRUwKIAlpZiAoX19idWlsdGluX2NvbnN0YW50X3AocGYpICYmCkBAIC0xNzAsMTYgKzE4MCwxOSBAQAogCQlyZXR1cm4gMTsKICNlbmRpZgogCi0JaG9va19saXN0ID0gJm5ldC0+bmYuaG9va3NbcGZdW2hvb2tdOwotCi0JaWYgKCFsaXN0X2VtcHR5KGhvb2tfbGlzdCkpIHsKKwlyY3VfcmVhZF9sb2NrKCk7CisJaG9va19oZWFkID0gcmN1X2RlcmVmZXJlbmNlKG5ldC0+bmYuaG9va3NbcGZdW2hvb2tdKTsKKwlpZiAoaG9va19oZWFkKSB7CiAJCXN0cnVjdCBuZl9ob29rX3N0YXRlIHN0YXRlOwogCi0JCW5mX2hvb2tfc3RhdGVfaW5pdCgmc3RhdGUsIGhvb2tfbGlzdCwgaG9vaywgdGhyZXNoLAorCQluZl9ob29rX3N0YXRlX2luaXQoJnN0YXRlLCBob29rX2hlYWQsIGhvb2ssIHRocmVzaCwKIAkJCQkgICBwZiwgaW5kZXYsIG91dGRldiwgc2ssIG5ldCwgb2tmbik7Ci0JCXJldHVybiBuZl9ob29rX3Nsb3coc2tiLCAmc3RhdGUpOworCisJCXJldCA9IG5mX2hvb2tfc2xvdyhza2IsICZzdGF0ZSk7CiAJfQotCXJldHVybiAxOworCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgbmZfaG9vayh1X2ludDhfdCBwZiwgdW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBuZXQgKm5ldCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaAppbmRleCAyNzU1MDU3Li4xZDFlZjRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oCkBAIC00LDEzICs0LDkgQEAKICNpbmNsdWRlIDx1YXBpL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmg+CiAKIHN0cnVjdCBpcF9jb25udHJhY2tfc3RhdCB7Ci0JdW5zaWduZWQgaW50IHNlYXJjaGVkOwogCXVuc2lnbmVkIGludCBmb3VuZDsKLQl1bnNpZ25lZCBpbnQgbmV3OwogCXVuc2lnbmVkIGludCBpbnZhbGlkOwogCXVuc2lnbmVkIGludCBpZ25vcmU7Ci0JdW5zaWduZWQgaW50IGRlbGV0ZTsKLQl1bnNpZ25lZCBpbnQgZGVsZXRlX2xpc3Q7CiAJdW5zaWduZWQgaW50IGluc2VydDsKIAl1bnNpZ25lZCBpbnQgaW5zZXJ0X2ZhaWxlZDsKIAl1bnNpZ25lZCBpbnQgZHJvcDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19ncmUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19ncmUuaAppbmRleCBkZjc4ZGMyLi5kZWUwYWNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5oCkBAIC0xLDY4ICsxLDggQEAKICNpZm5kZWYgX0NPTk5UUkFDS19QUk9UT19HUkVfSAogI2RlZmluZSBfQ09OTlRSQUNLX1BST1RPX0dSRV9ICiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotCi0vKiBHUkUgUFJPVE9DT0wgSEVBREVSICovCi0KLS8qIEdSRSBWZXJzaW9uIGZpZWxkICovCi0jZGVmaW5lIEdSRV9WRVJTSU9OXzE3MDEJMHgwCi0jZGVmaW5lIEdSRV9WRVJTSU9OX1BQVFAJMHgxCi0KLS8qIEdSRSBQcm90b2NvbCBmaWVsZCAqLwotI2RlZmluZSBHUkVfUFJPVE9DT0xfUFBUUAkweDg4MEIKLQotLyogR1JFIEZsYWdzICovCi0jZGVmaW5lIEdSRV9GTEFHX0MJCTB4ODAKLSNkZWZpbmUgR1JFX0ZMQUdfUgkJMHg0MAotI2RlZmluZSBHUkVfRkxBR19LCQkweDIwCi0jZGVmaW5lIEdSRV9GTEFHX1MJCTB4MTAKLSNkZWZpbmUgR1JFX0ZMQUdfQQkJMHg4MAotCi0jZGVmaW5lIEdSRV9JU19DKGYpCSgoZikmR1JFX0ZMQUdfQykKLSNkZWZpbmUgR1JFX0lTX1IoZikJKChmKSZHUkVfRkxBR19SKQotI2RlZmluZSBHUkVfSVNfSyhmKQkoKGYpJkdSRV9GTEFHX0spCi0jZGVmaW5lIEdSRV9JU19TKGYpCSgoZikmR1JFX0ZMQUdfUykKLSNkZWZpbmUgR1JFX0lTX0EoZikJKChmKSZHUkVfRkxBR19BKQotCi0vKiBHUkUgaXMgYSBtZXNzOiBGb3VyIGRpZmZlcmVudCBzdGFuZGFyZHMgKi8KLXN0cnVjdCBncmVfaGRyIHsKLSNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKLQlfX3UxNglyZWM6MywKLQkJc3JyOjEsCi0JCXNlcToxLAotCQlrZXk6MSwKLQkJcm91dGluZzoxLAotCQljc3VtOjEsCi0JCXZlcnNpb246MywKLQkJcmVzZXJ2ZWQ6NCwKLQkJYWNrOjE7Ci0jZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKLQlfX3UxNgljc3VtOjEsCi0JCXJvdXRpbmc6MSwKLQkJa2V5OjEsCi0JCXNlcToxLAotCQlzcnI6MSwKLQkJcmVjOjMsCi0JCWFjazoxLAotCQlyZXNlcnZlZDo0LAotCQl2ZXJzaW9uOjM7Ci0jZWxzZQotI2Vycm9yICJBZGp1c3QgeW91ciA8YXNtL2J5dGVvcmRlci5oPiBkZWZpbmVzIgotI2VuZGlmCi0JX19iZTE2CXByb3RvY29sOwotfTsKLQotLyogbW9kaWZpZWQgR1JFIGhlYWRlciBmb3IgUFBUUCAqLwotc3RydWN0IGdyZV9oZHJfcHB0cCB7Ci0JX191OCAgIGZsYWdzOwkJLyogYml0ZmllbGQgKi8KLQlfX3U4ICAgdmVyc2lvbjsJCS8qIHNob3VsZCBiZSBHUkVfVkVSU0lPTl9QUFRQICovCi0JX19iZTE2IHByb3RvY29sOwkvKiBzaG91bGQgYmUgR1JFX1BST1RPQ09MX1BQVFAgKi8KLQlfX2JlMTYgcGF5bG9hZF9sZW47CS8qIHNpemUgb2YgcHBwIHBheWxvYWQsIG5vdCBpbmMuIGdyZSBoZWFkZXIgKi8KLQlfX2JlMTYgY2FsbF9pZDsJCS8qIHBlZXIncyBjYWxsX2lkIGZvciB0aGlzIHNlc3Npb24gKi8KLQlfX2JlMzIgc2VxOwkJLyogc2VxdWVuY2UgbnVtYmVyLiAgUHJlc2VudCBpZiBTPT0xICovCi0JX19iZTMyIGFjazsJCS8qIHNlcSBudW1iZXIgb2YgaGlnaGVzdCBwYWNrZXQgcmVjZWl2ZWQgYnkgKi8KLQkJCQkvKiAgc2VuZGVyIGluIHRoaXMgc2Vzc2lvbiAqLwotfTsKKyNpbmNsdWRlIDxuZXQvZ3JlLmg+CisjaW5jbHVkZSA8bmV0L3BwdHAuaD4KIAogc3RydWN0IG5mX2N0X2dyZSB7CiAJdW5zaWduZWQgaW50IHN0cmVhbV90aW1lb3V0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2FjY3QuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19hY2N0LmgKaW5kZXggODBjYTg4OS4uNjY0ZGEwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2FjY3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfYWNjdC5oCkBAIC0xNSw2ICsxNSw2IEBACiBzdHJ1Y3QgbmZfYWNjdCAqbmZubF9hY2N0X2ZpbmRfZ2V0KHN0cnVjdCBuZXQgKm5ldCwgY29uc3QgY2hhciAqZmlsdGVyX25hbWUpOwogdm9pZCBuZm5sX2FjY3RfcHV0KHN0cnVjdCBuZl9hY2N0ICphY2N0KTsKIHZvaWQgbmZubF9hY2N0X3VwZGF0ZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmZfYWNjdCAqbmZhY2N0KTsKLWV4dGVybiBpbnQgbmZubF9hY2N0X292ZXJxdW90YShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgc3RydWN0IG5mX2FjY3QgKm5mYWNjdCk7CitpbnQgbmZubF9hY2N0X292ZXJxdW90YShzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgbmZfYWNjdCAqbmZhY2N0KTsKICNlbmRpZiAvKiBfTkZOTF9BQ0NUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2luZ3Jlc3MuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2luZ3Jlc3MuaAppbmRleCA1ZmNkMzc1Li4zM2UzN2ZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pbmdyZXNzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaW5ncmVzcy5oCkBAIC0xMSwyMiArMTEsMzAgQEAKIAlpZiAoIXN0YXRpY19rZXlfZmFsc2UoJm5mX2hvb2tzX25lZWRlZFtORlBST1RPX05FVERFVl1bTkZfTkVUREVWX0lOR1JFU1NdKSkKIAkJcmV0dXJuIGZhbHNlOwogI2VuZGlmCi0JcmV0dXJuICFsaXN0X2VtcHR5KCZza2ItPmRldi0+bmZfaG9va3NfaW5ncmVzcyk7CisJcmV0dXJuIHJjdV9hY2Nlc3NfcG9pbnRlcihza2ItPmRldi0+bmZfaG9va3NfaW5ncmVzcyk7CiB9CiAKKy8qIGNhbGxlciBtdXN0IGhvbGQgcmN1X3JlYWRfbG9jayAqLwogc3RhdGljIGlubGluZSBpbnQgbmZfaG9va19pbmdyZXNzKHN0cnVjdCBza19idWZmICpza2IpCiB7CisJc3RydWN0IG5mX2hvb2tfZW50cnkgKmUgPSByY3VfZGVyZWZlcmVuY2Uoc2tiLT5kZXYtPm5mX2hvb2tzX2luZ3Jlc3MpOwogCXN0cnVjdCBuZl9ob29rX3N0YXRlIHN0YXRlOwogCi0JbmZfaG9va19zdGF0ZV9pbml0KCZzdGF0ZSwgJnNrYi0+ZGV2LT5uZl9ob29rc19pbmdyZXNzLAotCQkJICAgTkZfTkVUREVWX0lOR1JFU1MsIElOVF9NSU4sIE5GUFJPVE9fTkVUREVWLAotCQkJICAgc2tiLT5kZXYsIE5VTEwsIE5VTEwsIGRldl9uZXQoc2tiLT5kZXYpLCBOVUxMKTsKKwkvKiBNdXN0IHJlY2hlY2sgdGhlIGluZ3Jlc3MgaG9vayBoZWFkLCBpbiB0aGUgZXZlbnQgaXQgYmVjYW1lIE5VTEwKKwkgKiBhZnRlciB0aGUgY2hlY2sgaW4gbmZfaG9va19pbmdyZXNzX2FjdGl2ZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KKwkgKi8KKwlpZiAodW5saWtlbHkoIWUpKQorCQlyZXR1cm4gMDsKKworCW5mX2hvb2tfc3RhdGVfaW5pdCgmc3RhdGUsIGUsIE5GX05FVERFVl9JTkdSRVNTLCBJTlRfTUlOLAorCQkJICAgTkZQUk9UT19ORVRERVYsIHNrYi0+ZGV2LCBOVUxMLCBOVUxMLAorCQkJICAgZGV2X25ldChza2ItPmRldiksIE5VTEwpOwogCXJldHVybiBuZl9ob29rX3Nsb3coc2tiLCAmc3RhdGUpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbmZfaG9va19pbmdyZXNzX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlJTklUX0xJU1RfSEVBRCgmZGV2LT5uZl9ob29rc19pbmdyZXNzKTsKKwlSQ1VfSU5JVF9QT0lOVEVSKGRldi0+bmZfaG9va3NfaW5ncmVzcywgTlVMTCk7CiB9CiAjZWxzZSAvKiBDT05GSUdfTkVURklMVEVSX0lOR1JFU1MgKi8KIHN0YXRpYyBpbmxpbmUgaW50IG5mX2hvb2tfaW5ncmVzc19hY3RpdmUoc3RydWN0IHNrX2J1ZmYgKnNrYikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbnZtZS5oIGIvaW5jbHVkZS9saW51eC9udm1lLmgKaW5kZXggZDhiMzdiYS4uNzY3NjU1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9udm1lLmgKKysrIGIvaW5jbHVkZS9saW51eC9udm1lLmgKQEAgLTc5NCw3ICs3OTQsNyBAQAogfTsKIAogc3RydWN0IG52bWZfY29ubmVjdF9kYXRhIHsKLQl1dWlkX2xlCQlob3N0aWQ7CisJdXVpZF9iZQkJaG9zdGlkOwogCV9fbGUxNgkJY250bGlkOwogCWNoYXIJCXJlc3Y0WzIzOF07CiAJY2hhcgkJc3Vic3lzbnFuW05WTUZfTlFOX0ZJRUxEX0xFTl07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mLmggYi9pbmNsdWRlL2xpbnV4L29mLmgKaW5kZXggM2Q5ZmY4ZS4uMjk5YWViMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZi5oCisrKyBiL2luY2x1ZGUvbGludXgvb2YuaApAQCAtMjkxLDIwICsyOTEsMjQgQEAKIGV4dGVybiBpbnQgb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCQkgICAgICAgY29uc3QgY2hhciAqcHJvcG5hbWUsCiAJCQkJICAgICAgIHUzMiBpbmRleCwgdTMyICpvdXRfdmFsdWUpOwotZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3U4X2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQljb25zdCBjaGFyICpwcm9wbmFtZSwgdTggKm91dF92YWx1ZXMsIHNpemVfdCBzeik7Ci1leHRlcm4gaW50IG9mX3Byb3BlcnR5X3JlYWRfdTE2X2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQljb25zdCBjaGFyICpwcm9wbmFtZSwgdTE2ICpvdXRfdmFsdWVzLCBzaXplX3Qgc3opOwotZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAotCQkJCSAgICAgIHUzMiAqb3V0X3ZhbHVlcywKLQkJCQkgICAgICBzaXplX3Qgc3opOworZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3U4X2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCWNvbnN0IGNoYXIgKnByb3BuYW1lLCB1OCAqb3V0X3ZhbHVlcywKKwkJCQkJc2l6ZV90IHN6X21pbiwgc2l6ZV90IHN6X21heCk7CitleHRlcm4gaW50IG9mX3Byb3BlcnR5X3JlYWRfdmFyaWFibGVfdTE2X2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCWNvbnN0IGNoYXIgKnByb3BuYW1lLCB1MTYgKm91dF92YWx1ZXMsCisJCQkJCXNpemVfdCBzel9taW4sIHNpemVfdCBzel9tYXgpOworZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3UzMl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQljb25zdCBjaGFyICpwcm9wbmFtZSwKKwkJCQkJdTMyICpvdXRfdmFsdWVzLAorCQkJCQlzaXplX3Qgc3pfbWluLAorCQkJCQlzaXplX3Qgc3pfbWF4KTsKIGV4dGVybiBpbnQgb2ZfcHJvcGVydHlfcmVhZF91NjQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCQljb25zdCBjaGFyICpwcm9wbmFtZSwgdTY0ICpvdXRfdmFsdWUpOwotZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3U2NF9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAotCQkJCSAgICAgIHU2NCAqb3V0X3ZhbHVlcywKLQkJCQkgICAgICBzaXplX3Qgc3opOworZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3U2NF9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQljb25zdCBjaGFyICpwcm9wbmFtZSwKKwkJCQkJdTY0ICpvdXRfdmFsdWVzLAorCQkJCQlzaXplX3Qgc3pfbWluLAorCQkJCQlzaXplX3Qgc3pfbWF4KTsKIAogZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCSAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLApAQCAtMzgwLDYgKzM4NCwxMjIgQEAKIAogI2RlZmluZSBvZl9tYXRjaF9wdHIoX3B0cikJKF9wdHIpCiAKKy8qKgorICogb2ZfcHJvcGVydHlfcmVhZF91OF9hcnJheSAtIEZpbmQgYW5kIHJlYWQgYW4gYXJyYXkgb2YgdTggZnJvbSBhIHByb3BlcnR5LgorICoKKyAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCisgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgorICogQG91dF92YWx1ZXM6CXBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlLCBtb2RpZmllZCBvbmx5IGlmIHJldHVybiB2YWx1ZSBpcyAwLgorICogQHN6OgkJbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQKKyAqCisgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgcmVhZCA4LWJpdCB2YWx1ZShzKSBmcm9tCisgKiBpdC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0LAorICogLUVOT0RBVEEgaWYgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgLUVPVkVSRkxPVyBpZiB0aGUKKyAqIHByb3BlcnR5IGRhdGEgaXNuJ3QgbGFyZ2UgZW5vdWdoLgorICoKKyAqIGR0cyBlbnRyeSBvZiBhcnJheSBzaG91bGQgYmUgbGlrZToKKyAqCXByb3BlcnR5ID0gL2JpdHMvIDggPDB4NTAgMHg2MCAweDcwPjsKKyAqCisgKiBUaGUgb3V0X3ZhbHVlcyBpcyBtb2RpZmllZCBvbmx5IGlmIGEgdmFsaWQgdTggdmFsdWUgY2FuIGJlIGRlY29kZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9mX3Byb3BlcnR5X3JlYWRfdThfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAorCQkJCQkgICAgdTggKm91dF92YWx1ZXMsIHNpemVfdCBzeikKK3sKKwlpbnQgcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91OF9hcnJheShucCwgcHJvcG5hbWUsIG91dF92YWx1ZXMsCisJCQkJCQkgICAgIHN6LCAwKTsKKwlpZiAocmV0ID49IDApCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBvZl9wcm9wZXJ0eV9yZWFkX3UxNl9hcnJheSAtIEZpbmQgYW5kIHJlYWQgYW4gYXJyYXkgb2YgdTE2IGZyb20gYSBwcm9wZXJ0eS4KKyAqCisgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgorICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KKyAqIEBvdXRfdmFsdWVzOglwb2ludGVyIHRvIHJldHVybiB2YWx1ZSwgbW9kaWZpZWQgb25seSBpZiByZXR1cm4gdmFsdWUgaXMgMC4KKyAqIEBzejoJCW51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkCisgKgorICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIG5vZGUgYW5kIHJlYWQgMTYtYml0IHZhbHVlKHMpIGZyb20KKyAqIGl0LiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QsCisgKiAtRU5PREFUQSBpZiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsIGFuZCAtRU9WRVJGTE9XIGlmIHRoZQorICogcHJvcGVydHkgZGF0YSBpc24ndCBsYXJnZSBlbm91Z2guCisgKgorICogZHRzIGVudHJ5IG9mIGFycmF5IHNob3VsZCBiZSBsaWtlOgorICoJcHJvcGVydHkgPSAvYml0cy8gMTYgPDB4NTAwMCAweDYwMDAgMHg3MDAwPjsKKyAqCisgKiBUaGUgb3V0X3ZhbHVlcyBpcyBtb2RpZmllZCBvbmx5IGlmIGEgdmFsaWQgdTE2IHZhbHVlIGNhbiBiZSBkZWNvZGVkLgorICovCitzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UxNl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAorCQkJCQkgICAgIHUxNiAqb3V0X3ZhbHVlcywgc2l6ZV90IHN6KQoreworCWludCByZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3UxNl9hcnJheShucCwgcHJvcG5hbWUsIG91dF92YWx1ZXMsCisJCQkJCQkgICAgICBzeiwgMCk7CisJaWYgKHJldCA+PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkgLSBGaW5kIGFuZCByZWFkIGFuIGFycmF5IG9mIDMyIGJpdCBpbnRlZ2VycworICogZnJvbSBhIHByb3BlcnR5LgorICoKKyAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCisgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgorICogQG91dF92YWx1ZXM6CXBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlLCBtb2RpZmllZCBvbmx5IGlmIHJldHVybiB2YWx1ZSBpcyAwLgorICogQHN6OgkJbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQKKyAqCisgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgcmVhZCAzMi1iaXQgdmFsdWUocykgZnJvbQorICogaXQuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCwKKyAqIC1FTk9EQVRBIGlmIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FT1ZFUkZMT1cgaWYgdGhlCisgKiBwcm9wZXJ0eSBkYXRhIGlzbid0IGxhcmdlIGVub3VnaC4KKyAqCisgKiBUaGUgb3V0X3ZhbHVlcyBpcyBtb2RpZmllZCBvbmx5IGlmIGEgdmFsaWQgdTMyIHZhbHVlIGNhbiBiZSBkZWNvZGVkLgorICovCitzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAorCQkJCQkgICAgIHUzMiAqb3V0X3ZhbHVlcywgc2l6ZV90IHN6KQoreworCWludCByZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3UzMl9hcnJheShucCwgcHJvcG5hbWUsIG91dF92YWx1ZXMsCisJCQkJCQkgICAgICBzeiwgMCk7CisJaWYgKHJldCA+PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogb2ZfcHJvcGVydHlfcmVhZF91NjRfYXJyYXkgLSBGaW5kIGFuZCByZWFkIGFuIGFycmF5IG9mIDY0IGJpdCBpbnRlZ2VycworICogZnJvbSBhIHByb3BlcnR5LgorICoKKyAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCisgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgorICogQG91dF92YWx1ZXM6CXBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlLCBtb2RpZmllZCBvbmx5IGlmIHJldHVybiB2YWx1ZSBpcyAwLgorICogQHN6OgkJbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQKKyAqCisgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgcmVhZCA2NC1iaXQgdmFsdWUocykgZnJvbQorICogaXQuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCwKKyAqIC1FTk9EQVRBIGlmIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FT1ZFUkZMT1cgaWYgdGhlCisgKiBwcm9wZXJ0eSBkYXRhIGlzbid0IGxhcmdlIGVub3VnaC4KKyAqCisgKiBUaGUgb3V0X3ZhbHVlcyBpcyBtb2RpZmllZCBvbmx5IGlmIGEgdmFsaWQgdTY0IHZhbHVlIGNhbiBiZSBkZWNvZGVkLgorICovCitzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3U2NF9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAorCQkJCQkgICAgIHU2NCAqb3V0X3ZhbHVlcywgc2l6ZV90IHN6KQoreworCWludCByZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3U2NF9hcnJheShucCwgcHJvcG5hbWUsIG91dF92YWx1ZXMsCisJCQkJCQkgICAgICBzeiwgMCk7CisJaWYgKHJldCA+PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAgKiBjb25zdCBfX2JlMzIgKnA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX2ZkdC5oIGIvaW5jbHVkZS9saW51eC9vZl9mZHQuaAppbmRleCAyNmMzMzAyLi40MzQxZjMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mX2ZkdC5oCisrKyBiL2luY2x1ZGUvbGludXgvb2ZfZmR0LmgKQEAgLTE0LDYgKzE0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAKIC8qIERlZmluaXRpb25zIHVzZWQgYnkgdGhlIGZsYXR0ZW5lZCBkZXZpY2UgdHJlZSAqLwogI2RlZmluZSBPRl9EVF9IRUFERVIJCTB4ZDAwZGZlZWQJLyogbWFya2VyICovCkBAIC02Niw2ICs2Nyw3IEBACiAJCQkJICAgICBpbnQgZGVwdGgsIHZvaWQgKmRhdGEpOwogZXh0ZXJuIGludCBlYXJseV9pbml0X2R0X3NjYW5fbWVtb3J5KHVuc2lnbmVkIGxvbmcgbm9kZSwgY29uc3QgY2hhciAqdW5hbWUsCiAJCQkJICAgICBpbnQgZGVwdGgsIHZvaWQgKmRhdGEpOworZXh0ZXJuIGludCBlYXJseV9pbml0X2R0X3NjYW5fY2hvc2VuX3N0ZG91dCh2b2lkKTsKIGV4dGVybiB2b2lkIGVhcmx5X2luaXRfZmR0X3NjYW5fcmVzZXJ2ZWRfbWVtKHZvaWQpOwogZXh0ZXJuIHZvaWQgZWFybHlfaW5pdF9mZHRfcmVzZXJ2ZV9zZWxmKHZvaWQpOwogZXh0ZXJuIHZvaWQgZWFybHlfaW5pdF9kdF9hZGRfbWVtb3J5X2FyY2godTY0IGJhc2UsIHU2NCBzaXplKTsKQEAgLTk0LDYgKzk2LDcgQEAKIGV4dGVybiB1NjQgb2ZfZmxhdF9kdF90cmFuc2xhdGVfYWRkcmVzcyh1bnNpZ25lZCBsb25nIG5vZGUpOwogZXh0ZXJuIHZvaWQgb2ZfZmR0X2xpbWl0X21lbW9yeShpbnQgbGltaXQpOwogI2Vsc2UgLyogQ09ORklHX09GX0ZMQVRUUkVFICovCitzdGF0aWMgaW5saW5lIGludCBlYXJseV9pbml0X2R0X3NjYW5fY2hvc2VuX3N0ZG91dCh2b2lkKSB7IHJldHVybiAtRU5PREVWOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZWFybHlfaW5pdF9mZHRfc2Nhbl9yZXNlcnZlZF9tZW0odm9pZCkge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBlYXJseV9pbml0X2ZkdF9yZXNlcnZlX3NlbGYodm9pZCkge30KIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqb2ZfZmxhdF9kdF9nZXRfbWFjaGluZV9uYW1lKHZvaWQpIHsgcmV0dXJuIE5VTEw7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2ZfZ3Bpby5oIGIvaW5jbHVkZS9saW51eC9vZl9ncGlvLmgKaW5kZXggMDkyMTg2Yy4uM2Y4N2VhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9ncGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9vZl9ncGlvLmgKQEAgLTYxLDggKzYxLDYgQEAKIH0KIGV4dGVybiB2b2lkIG9mX21tX2dwaW9jaGlwX3JlbW92ZShzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYyk7CiAKLWV4dGVybiBpbnQgb2ZfZ3Bpb2NoaXBfYWRkKHN0cnVjdCBncGlvX2NoaXAgKmdjKTsKLWV4dGVybiB2b2lkIG9mX2dwaW9jaGlwX3JlbW92ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYyk7CiBleHRlcm4gaW50IG9mX2dwaW9fc2ltcGxlX3hsYXRlKHN0cnVjdCBncGlvX2NoaXAgKmdjLAogCQkJCWNvbnN0IHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmdwaW9zcGVjLAogCQkJCXUzMiAqZmxhZ3MpOwpAQCAtODYsOSArODQsNiBAQAogCXJldHVybiAtRU5PU1lTOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBvZl9ncGlvY2hpcF9hZGQoc3RydWN0IGdwaW9fY2hpcCAqZ2MpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvZl9ncGlvY2hpcF9yZW1vdmUoc3RydWN0IGdwaW9fY2hpcCAqZ2MpIHsgfQotCiAjZW5kaWYgLyogQ09ORklHX09GX0dQSU8gKi8KIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oIGIvaW5jbHVkZS9saW51eC9wYWRhdGEuaAppbmRleCAxMTNlZTYyLi4wZjllNTY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGFkYXRhLmgKQEAgLTE1MSw3ICsxNTEsNyBAQAogICogQGZsYWdzOiBwYWRhdGEgZmxhZ3MuCiAgKi8KIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgewotCXN0cnVjdCBub3RpZmllcl9ibG9jawkJIGNwdV9ub3RpZmllcjsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZQkJIG5vZGU7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJCSp3cTsKIAlzdHJ1Y3QgcGFyYWxsZWxfZGF0YQkJKnBkOwogCXN0cnVjdCBwYWRhdGFfY3B1bWFzawkJY3B1bWFzazsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oIGIvaW5jbHVkZS9saW51eC9wYWdlbWFwLmgKaW5kZXggNjZhMTI2MC4uMDFlODQ0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wYWdlbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9wYWdlbWFwLmgKQEAgLTU3MSw1NiArNTcxLDU3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGZhdWx0X2luX211bHRpcGFnZXNfd3JpdGVhYmxlKGNoYXIgX191c2VyICp1YWRkciwgaW50IHNpemUpCiB7Ci0JaW50IHJldCA9IDA7CiAJY2hhciBfX3VzZXIgKmVuZCA9IHVhZGRyICsgc2l6ZSAtIDE7CiAKIAlpZiAodW5saWtlbHkoc2l6ZSA9PSAwKSkKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIDA7CiAKKwlpZiAodW5saWtlbHkodWFkZHIgPiBlbmQpKQorCQlyZXR1cm4gLUVGQVVMVDsKIAkvKgogCSAqIFdyaXRpbmcgemVyb2VzIGludG8gdXNlcnNwYWNlIGhlcmUgaXMgT0ssIGJlY2F1c2Ugd2Uga25vdyB0aGF0IGlmCiAJICogdGhlIHplcm8gZ2V0cyB0aGVyZSwgd2UnbGwgYmUgb3ZlcndyaXRpbmcgaXQuCiAJICovCi0Jd2hpbGUgKHVhZGRyIDw9IGVuZCkgewotCQlyZXQgPSBfX3B1dF91c2VyKDAsIHVhZGRyKTsKLQkJaWYgKHJldCAhPSAwKQotCQkJcmV0dXJuIHJldDsKKwlkbyB7CisJCWlmICh1bmxpa2VseShfX3B1dF91c2VyKDAsIHVhZGRyKSAhPSAwKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCQl1YWRkciArPSBQQUdFX1NJWkU7Ci0JfQorCX0gd2hpbGUgKHVhZGRyIDw9IGVuZCk7CiAKIAkvKiBDaGVjayB3aGV0aGVyIHRoZSByYW5nZSBzcGlsbGVkIGludG8gdGhlIG5leHQgcGFnZS4gKi8KIAlpZiAoKCh1bnNpZ25lZCBsb25nKXVhZGRyICYgUEFHRV9NQVNLKSA9PQogCQkJKCh1bnNpZ25lZCBsb25nKWVuZCAmIFBBR0VfTUFTSykpCi0JCXJldCA9IF9fcHV0X3VzZXIoMCwgZW5kKTsKKwkJcmV0dXJuIF9fcHV0X3VzZXIoMCwgZW5kKTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGZhdWx0X2luX211bHRpcGFnZXNfcmVhZGFibGUoY29uc3QgY2hhciBfX3VzZXIgKnVhZGRyLAogCQkJCQkgICAgICAgaW50IHNpemUpCiB7CiAJdm9sYXRpbGUgY2hhciBjOwotCWludCByZXQgPSAwOwogCWNvbnN0IGNoYXIgX191c2VyICplbmQgPSB1YWRkciArIHNpemUgLSAxOwogCiAJaWYgKHVubGlrZWx5KHNpemUgPT0gMCkpCi0JCXJldHVybiByZXQ7CisJCXJldHVybiAwOwogCi0Jd2hpbGUgKHVhZGRyIDw9IGVuZCkgewotCQlyZXQgPSBfX2dldF91c2VyKGMsIHVhZGRyKTsKLQkJaWYgKHJldCAhPSAwKQotCQkJcmV0dXJuIHJldDsKKwlpZiAodW5saWtlbHkodWFkZHIgPiBlbmQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvIHsKKwkJaWYgKHVubGlrZWx5KF9fZ2V0X3VzZXIoYywgdWFkZHIpICE9IDApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXVhZGRyICs9IFBBR0VfU0laRTsKLQl9CisJfSB3aGlsZSAodWFkZHIgPD0gZW5kKTsKIAogCS8qIENoZWNrIHdoZXRoZXIgdGhlIHJhbmdlIHNwaWxsZWQgaW50byB0aGUgbmV4dCBwYWdlLiAqLwogCWlmICgoKHVuc2lnbmVkIGxvbmcpdWFkZHIgJiBQQUdFX01BU0spID09CiAJCQkoKHVuc2lnbmVkIGxvbmcpZW5kICYgUEFHRV9NQVNLKSkgewotCQlyZXQgPSBfX2dldF91c2VyKGMsIGVuZCk7Ci0JCSh2b2lkKWM7CisJCXJldHVybiBfX2dldF91c2VyKGMsIGVuZCk7CiAJfQogCi0JcmV0dXJuIHJldDsKKwkodm9pZCljOworCXJldHVybiAwOwogfQogCiBpbnQgYWRkX3RvX3BhZ2VfY2FjaGVfbG9ja2VkKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLmggYi9pbmNsdWRlL2xpbnV4L3BjaS5oCmluZGV4IDI1OTlhOTguLjdjYzBhY2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtNjgzLDE1ICs2ODMsNiBAQAogI2RlZmluZQl0b19wY2lfZHJpdmVyKGRydikgY29udGFpbmVyX29mKGRydiwgc3RydWN0IHBjaV9kcml2ZXIsIGRyaXZlcikKIAogLyoqCi0gKiBERUZJTkVfUENJX0RFVklDRV9UQUJMRSAtIG1hY3JvIHVzZWQgdG8gZGVzY3JpYmUgYSBwY2kgZGV2aWNlIHRhYmxlCi0gKiBAX3RhYmxlOiBkZXZpY2UgdGFibGUgbmFtZQotICoKLSAqIFRoaXMgbWFjcm8gaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIG5ldyBjb2RlLgotICovCi0jZGVmaW5lIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKF90YWJsZSkgXAotCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIF90YWJsZVtdCi0KLS8qKgogICogUENJX0RFVklDRSAtIG1hY3JvIHVzZWQgdG8gZGVzY3JpYmUgYSBzcGVjaWZpYyBwY2kgZGV2aWNlCiAgKiBAdmVuZDogdGhlIDE2IGJpdCBQQ0kgVmVuZG9yIElECiAgKiBAZGV2OiB0aGUgMTYgYml0IFBDSSBEZXZpY2UgSUQKQEAgLTExMzUsNiArMTEyNiw3IEBACiBpbnQgcGNpX2VuYWJsZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKiwgaW50IG1hc2spOwogdm9pZCBwY2lfZml4dXBfaXJxcyh1OCAoKikoc3RydWN0IHBjaV9kZXYgKiwgdTggKiksCiAJCSAgICBpbnQgKCopKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICosIHU4LCB1OCkpOworc3RydWN0IHJlc291cmNlICpwY2lfZmluZF9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7CiAjZGVmaW5lIEhBVkVfUENJX1JFUV9SRUdJT05TCTIKIGludCBfX211c3RfY2hlY2sgcGNpX3JlcXVlc3RfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBjaGFyICopOwogaW50IF9fbXVzdF9jaGVjayBwY2lfcmVxdWVzdF9yZWdpb25zX2V4Y2x1c2l2ZShzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBjaGFyICopOwpAQCAtMTI1MSwxMCArMTI0MywxMiBAQAogaW50IHBjaV9zZXRfdmdhX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBib29sIGRlY29kZSwKIAkJICAgICAgdW5zaWduZWQgaW50IGNvbW1hbmRfYml0cywgdTMyIGZsYWdzKTsKIAotI2RlZmluZSBQQ0lfSVJRX05PTEVHQUNZCSgxIDw8IDApIC8qIGRvbid0IHVzZSBsZWdhY3kgaW50ZXJydXB0cyAqLwotI2RlZmluZSBQQ0lfSVJRX05PTVNJCQkoMSA8PCAxKSAvKiBkb24ndCB1c2UgTVNJIGludGVycnVwdHMgKi8KLSNkZWZpbmUgUENJX0lSUV9OT01TSVgJCSgxIDw8IDIpIC8qIGRvbid0IHVzZSBNU0ktWCBpbnRlcnJ1cHRzICovCi0jZGVmaW5lIFBDSV9JUlFfTk9BRkZJTklUWQkoMSA8PCAzKSAvKiBkb24ndCBhdXRvLWFzc2lnbiBhZmZpbml0eSAqLworI2RlZmluZSBQQ0lfSVJRX0xFR0FDWQkJKDEgPDwgMCkgLyogYWxsb3cgbGVnYWN5IGludGVycnVwdHMgKi8KKyNkZWZpbmUgUENJX0lSUV9NU0kJCSgxIDw8IDEpIC8qIGFsbG93IE1TSSBpbnRlcnJ1cHRzICovCisjZGVmaW5lIFBDSV9JUlFfTVNJWAkJKDEgPDwgMikgLyogYWxsb3cgTVNJLVggaW50ZXJydXB0cyAqLworI2RlZmluZSBQQ0lfSVJRX0FGRklOSVRZCSgxIDw8IDMpIC8qIGF1dG8tYXNzaWduIGFmZmluaXR5ICovCisjZGVmaW5lIFBDSV9JUlFfQUxMX1RZUEVTIFwKKwkoUENJX0lSUV9MRUdBQ1kgfCBQQ0lfSVJRX01TSSB8IFBDSV9JUlFfTVNJWCkKIAogLyoga21lbV9jYWNoZSBzdHlsZSB3cmFwcGVyIGFyb3VuZCBwY2lfYWxsb2NfY29uc2lzdGVudCgpICovCiAKQEAgLTEzMDcsNiArMTMwMSw3IEBACiAJCXVuc2lnbmVkIGludCBtYXhfdmVjcywgdW5zaWduZWQgaW50IGZsYWdzKTsKIHZvaWQgcGNpX2ZyZWVfaXJxX3ZlY3RvcnMoc3RydWN0IHBjaV9kZXYgKmRldik7CiBpbnQgcGNpX2lycV92ZWN0b3Ioc3RydWN0IHBjaV9kZXYgKmRldiwgdW5zaWduZWQgaW50IG5yKTsKK2NvbnN0IHN0cnVjdCBjcHVtYXNrICpwY2lfaXJxX2dldF9hZmZpbml0eShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHZlYyk7CiAKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBwY2lfbXNpX3ZlY19jb3VudChzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IHJldHVybiAtRU5PU1lTOyB9CkBAIC0xMzQ5LDYgKzEzNDQsMTEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIGRldi0+aXJxOwogfQorc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqcGNpX2lycV9nZXRfYWZmaW5pdHkoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCWludCB2ZWMpCit7CisJcmV0dXJuIGNwdV9wb3NzaWJsZV9tYXNrOworfQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUENJRVBPUlRCVVMKQEAgLTE1NDksNiArMTU0OSw5IEBACiAJCQkJICBpbnQgZW5hYmxlKQogeyByZXR1cm4gMDsgfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZXNvdXJjZSAqcGNpX2ZpbmRfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJCSBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKK3sgcmV0dXJuIE5VTEw7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHBjaV9yZXF1ZXN0X3JlZ2lvbnMoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqcmVzX25hbWUpCiB7IHJldHVybiAtRUlPOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpX3JlbGVhc2VfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGVyY3B1LXJ3c2VtLmggYi9pbmNsdWRlL2xpbnV4L3BlcmNwdS1yd3NlbS5oCmluZGV4IGMyZmEzZWMuLjViMmU2MTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGVyY3B1LXJ3c2VtLmgKKysrIGIvaW5jbHVkZS9saW51eC9wZXJjcHUtcndzZW0uaApAQCAtMTAsMzIgKzEwLDEyMiBAQAogCiBzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSB7CiAJc3RydWN0IHJjdV9zeW5jCQlyc3M7Ci0JdW5zaWduZWQgaW50IF9fcGVyY3B1CSpmYXN0X3JlYWRfY3RyOworCXVuc2lnbmVkIGludCBfX3BlcmNwdQkqcmVhZF9jb3VudDsKIAlzdHJ1Y3Qgcndfc2VtYXBob3JlCXJ3X3NlbTsKLQlhdG9taWNfdAkJc2xvd19yZWFkX2N0cjsKLQl3YWl0X3F1ZXVlX2hlYWRfdAl3cml0ZV93YWl0cTsKKwl3YWl0X3F1ZXVlX2hlYWRfdAl3cml0ZXI7CisJaW50CQkJcmVhZGVyc19ibG9jazsKIH07CiAKLWV4dGVybiB2b2lkIHBlcmNwdV9kb3duX3JlYWQoc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKik7Ci1leHRlcm4gaW50ICBwZXJjcHVfZG93bl9yZWFkX3RyeWxvY2soc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKik7Ci1leHRlcm4gdm9pZCBwZXJjcHVfdXBfcmVhZChzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqKTsKKyNkZWZpbmUgREVGSU5FX1NUQVRJQ19QRVJDUFVfUldTRU0obmFtZSkJCQkJXAorc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgX19wZXJjcHVfcndzZW1fcmNfIyNuYW1lKTsJCVwKK3N0YXRpYyBzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSBuYW1lID0gewkJCQlcCisJLnJzcyA9IF9fUkNVX1NZTkNfSU5JVElBTElaRVIobmFtZS5yc3MsIFJDVV9TQ0hFRF9TWU5DKSwJXAorCS5yZWFkX2NvdW50ID0gJl9fcGVyY3B1X3J3c2VtX3JjXyMjbmFtZSwJCQlcCisJLnJ3X3NlbSA9IF9fUldTRU1fSU5JVElBTElaRVIobmFtZS5yd19zZW0pLAkJCVwKKwkud3JpdGVyID0gX19XQUlUX1FVRVVFX0hFQURfSU5JVElBTElaRVIobmFtZS53cml0ZXIpLAkJXAorfQorCitleHRlcm4gaW50IF9fcGVyY3B1X2Rvd25fcmVhZChzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqLCBpbnQpOworZXh0ZXJuIHZvaWQgX19wZXJjcHVfdXBfcmVhZChzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqKTsKKworc3RhdGljIGlubGluZSB2b2lkIHBlcmNwdV9kb3duX3JlYWRfcHJlZW1wdF9kaXNhYmxlKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpzZW0pCit7CisJbWlnaHRfc2xlZXAoKTsKKworCXJ3c2VtX2FjcXVpcmVfcmVhZCgmc2VtLT5yd19zZW0uZGVwX21hcCwgMCwgMCwgX1JFVF9JUF8pOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJLyoKKwkgKiBXZSBhcmUgaW4gYW4gUkNVLXNjaGVkIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLCBzbyB0aGUgd3JpdGVyCisJICogY2Fubm90IGJvdGggY2hhbmdlIHNlbS0+c3RhdGUgZnJvbSByZWFkZXJzX2Zhc3QgYW5kIHN0YXJ0IGNoZWNraW5nCisJICogY291bnRlcnMgd2hpbGUgd2UgYXJlIGhlcmUuIFNvIGlmIHdlIHNlZSAhc2VtLT5zdGF0ZSwgd2Uga25vdyB0aGF0CisJICogdGhlIHdyaXRlciB3b24ndCBiZSBjaGVja2luZyB1bnRpbCB3ZSdyZSBwYXN0IHRoZSBwcmVlbXB0X2VuYWJsZSgpCisJICogYW5kIHRoYXQgb25lIHRoZSBzeW5jaHJvbml6ZV9zY2hlZCgpIGlzIGRvbmUsIHRoZSB3cml0ZXIgd2lsbCBzZWUKKwkgKiBhbnl0aGluZyB3ZSBkaWQgd2l0aGluIHRoaXMgUkNVLXNjaGVkIHJlYWQtc2l6ZSBjcml0aWNhbCBzZWN0aW9uLgorCSAqLworCV9fdGhpc19jcHVfaW5jKCpzZW0tPnJlYWRfY291bnQpOworCWlmICh1bmxpa2VseSghcmN1X3N5bmNfaXNfaWRsZSgmc2VtLT5yc3MpKSkKKwkJX19wZXJjcHVfZG93bl9yZWFkKHNlbSwgZmFsc2UpOyAvKiBVbmNvbmRpdGlvbmFsIG1lbW9yeSBiYXJyaWVyICovCisJYmFycmllcigpOworCS8qCisJICogVGhlIGJhcnJpZXIoKSBwcmV2ZW50cyB0aGUgY29tcGlsZXIgZnJvbQorCSAqIGJsZWVkaW5nIHRoZSBjcml0aWNhbCBzZWN0aW9uIG91dC4KKwkgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIHBlcmNwdV9kb3duX3JlYWQoc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlwZXJjcHVfZG93bl9yZWFkX3ByZWVtcHRfZGlzYWJsZShzZW0pOworCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBlcmNwdV9kb3duX3JlYWRfdHJ5bG9jayhzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqc2VtKQoreworCWludCByZXQgPSAxOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJLyoKKwkgKiBTYW1lIGFzIGluIHBlcmNwdV9kb3duX3JlYWQoKS4KKwkgKi8KKwlfX3RoaXNfY3B1X2luYygqc2VtLT5yZWFkX2NvdW50KTsKKwlpZiAodW5saWtlbHkoIXJjdV9zeW5jX2lzX2lkbGUoJnNlbS0+cnNzKSkpCisJCXJldCA9IF9fcGVyY3B1X2Rvd25fcmVhZChzZW0sIHRydWUpOyAvKiBVbmNvbmRpdGlvbmFsIG1lbW9yeSBiYXJyaWVyICovCisJcHJlZW1wdF9lbmFibGUoKTsKKwkvKgorCSAqIFRoZSBiYXJyaWVyKCkgZnJvbSBwcmVlbXB0X2VuYWJsZSgpIHByZXZlbnRzIHRoZSBjb21waWxlciBmcm9tCisJICogYmxlZWRpbmcgdGhlIGNyaXRpY2FsIHNlY3Rpb24gb3V0LgorCSAqLworCisJaWYgKHJldCkKKwkJcndzZW1fYWNxdWlyZV9yZWFkKCZzZW0tPnJ3X3NlbS5kZXBfbWFwLCAwLCAxLCBfUkVUX0lQXyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGVyY3B1X3VwX3JlYWRfcHJlZW1wdF9lbmFibGUoc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKnNlbSkKK3sKKwkvKgorCSAqIFRoZSBiYXJyaWVyKCkgcHJldmVudHMgdGhlIGNvbXBpbGVyIGZyb20KKwkgKiBibGVlZGluZyB0aGUgY3JpdGljYWwgc2VjdGlvbiBvdXQuCisJICovCisJYmFycmllcigpOworCS8qCisJICogU2FtZSBhcyBpbiBwZXJjcHVfZG93bl9yZWFkKCkuCisJICovCisJaWYgKGxpa2VseShyY3Vfc3luY19pc19pZGxlKCZzZW0tPnJzcykpKQorCQlfX3RoaXNfY3B1X2RlYygqc2VtLT5yZWFkX2NvdW50KTsKKwllbHNlCisJCV9fcGVyY3B1X3VwX3JlYWQoc2VtKTsgLyogVW5jb25kaXRpb25hbCBtZW1vcnkgYmFycmllciAqLworCXByZWVtcHRfZW5hYmxlKCk7CisKKwlyd3NlbV9yZWxlYXNlKCZzZW0tPnJ3X3NlbS5kZXBfbWFwLCAxLCBfUkVUX0lQXyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZXJjcHVfdXBfcmVhZChzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqc2VtKQoreworCXByZWVtcHRfZGlzYWJsZSgpOworCXBlcmNwdV91cF9yZWFkX3ByZWVtcHRfZW5hYmxlKHNlbSk7Cit9CiAKIGV4dGVybiB2b2lkIHBlcmNwdV9kb3duX3dyaXRlKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICopOwogZXh0ZXJuIHZvaWQgcGVyY3B1X3VwX3dyaXRlKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICopOwogCiBleHRlcm4gaW50IF9fcGVyY3B1X2luaXRfcndzZW0oc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKiwKIAkJCQljb25zdCBjaGFyICosIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqKTsKKwogZXh0ZXJuIHZvaWQgcGVyY3B1X2ZyZWVfcndzZW0oc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKik7CiAKLSNkZWZpbmUgcGVyY3B1X2luaXRfcndzZW0oYnJ3KQlcCisjZGVmaW5lIHBlcmNwdV9pbml0X3J3c2VtKHNlbSkJCQkJCVwKICh7CQkJCQkJCQlcCiAJc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSByd3NlbV9rZXk7CQkJXAotCV9fcGVyY3B1X2luaXRfcndzZW0oYnJ3LCAjYnJ3LCAmcndzZW1fa2V5KTsJCVwKKwlfX3BlcmNwdV9pbml0X3J3c2VtKHNlbSwgI3NlbSwgJnJ3c2VtX2tleSk7CQlcCiB9KQogCi0KICNkZWZpbmUgcGVyY3B1X3J3c2VtX2lzX2hlbGQoc2VtKSBsb2NrZGVwX2lzX2hlbGQoJihzZW0pLT5yd19zZW0pCiAKKyNkZWZpbmUgcGVyY3B1X3J3c2VtX2Fzc2VydF9oZWxkKHNlbSkJCQkJXAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJihzZW0pLT5yd19zZW0pCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBwZXJjcHVfcndzZW1fcmVsZWFzZShzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqc2VtLAogCQkJCQlib29sIHJlYWQsIHVuc2lnbmVkIGxvbmcgaXApCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BlcmYvYXJtX3BtdS5oIGIvaW5jbHVkZS9saW51eC9wZXJmL2FybV9wbXUuaAppbmRleCBlMTg4NDM4Li44NDYyZGEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmYvYXJtX3BtdS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGVyZi9hcm1fcG11LmgKQEAgLTE0LDcgKzE0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KLQorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KIAogLyoKQEAgLTc3LDYgKzc3LDEzIEBACiAJc3RydWN0IGFybV9wbXUJCSpwZXJjcHVfcG11OwogfTsKIAorZW51bSBhcm1wbXVfYXR0cl9ncm91cHMgeworCUFSTVBNVV9BVFRSX0dST1VQX0NPTU1PTiwKKwlBUk1QTVVfQVRUUl9HUk9VUF9FVkVOVFMsCisJQVJNUE1VX0FUVFJfR1JPVVBfRk9STUFUUywKKwlBUk1QTVVfTlJfQVRUUl9HUk9VUFMKK307CisKIHN0cnVjdCBhcm1fcG11IHsKIAlzdHJ1Y3QgcG11CXBtdTsKIAljcHVtYXNrX3QJYWN0aXZlX2lycXM7CkBAIC0xMDksOCArMTE2LDEwIEBACiAJREVDTEFSRV9CSVRNQVAocG1jZWlkX2JpdG1hcCwgQVJNVjhfUE1VVjNfTUFYX0NPTU1PTl9FVkVOVFMpOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBsYXRfZGV2aWNlOwogCXN0cnVjdCBwbXVfaHdfZXZlbnRzCV9fcGVyY3B1ICpod19ldmVudHM7Ci0Jc3RydWN0IGxpc3RfaGVhZAllbnRyeTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZQlub2RlOwogCXN0cnVjdCBub3RpZmllcl9ibG9jawljcHVfcG1fbmI7CisJLyogdGhlIGF0dHJfZ3JvdXBzIGFycmF5IG11c3QgYmUgTlVMTC10ZXJtaW5hdGVkICovCisJY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYXR0cl9ncm91cHNbQVJNUE1VX05SX0FUVFJfR1JPVVBTICsgMV07CiB9OwogCiAjZGVmaW5lIHRvX2FybV9wbXUocCkgKGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QgYXJtX3BtdSwgcG11KSkKQEAgLTE1MSw2ICsxNjAsOCBAQAogCQkJIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX3RhYmxlLAogCQkJIGNvbnN0IHN0cnVjdCBwbXVfcHJvYmVfaW5mbyAqcHJvYmVfdGFibGUpOwogCisjZGVmaW5lIEFSTVY4X1BNVV9QREVWX05BTUUgImFybXY4LXBtdSIKKwogI2VuZGlmIC8qIENPTkZJR19BUk1fUE1VICovCiAKICNlbmRpZiAvKiBfX0FSTV9QTVVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaCBiL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oCmluZGV4IDJiNmI0M2MuLjA2MGQwZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oCkBAIC01MTAsOSArNTEwLDE1IEBACiAJCQkJCXN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhICosCiAJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAotZW51bSBwZXJmX2dyb3VwX2ZsYWcgewotCVBFUkZfR1JPVVBfU09GVFdBUkUJCT0gMHgxLAotfTsKKy8qCisgKiBFdmVudCBjYXBhYmlsaXRpZXMuIEZvciBldmVudF9jYXBzIGFuZCBncm91cHMgY2Fwcy4KKyAqCisgKiBQRVJGX0VWX0NBUF9TT0ZUV0FSRTogSXMgYSBzb2Z0d2FyZSBldmVudC4KKyAqIFBFUkZfRVZfQ0FQX1JFQURfQUNUSVZFX1BLRzogQSBDUFUgZXZlbnQgKG9yIGNncm91cCBldmVudCkgdGhhdCBjYW4gYmUgcmVhZAorICogZnJvbSBhbnkgQ1BVIGluIHRoZSBwYWNrYWdlIHdoZXJlIGl0IGlzIGFjdGl2ZS4KKyAqLworI2RlZmluZSBQRVJGX0VWX0NBUF9TT0ZUV0FSRQkJQklUKDApCisjZGVmaW5lIFBFUkZfRVZfQ0FQX1JFQURfQUNUSVZFX1BLRwlCSVQoMSkKIAogI2RlZmluZSBTV0VWRU5UX0hMSVNUX0JJVFMJCTgKICNkZWZpbmUgU1dFVkVOVF9ITElTVF9TSVpFCQkoMSA8PCBTV0VWRU5UX0hMSVNUX0JJVFMpCkBAIC01NjgsNyArNTc0LDEyIEBACiAJc3RydWN0IGhsaXN0X25vZGUJCWhsaXN0X2VudHJ5OwogCXN0cnVjdCBsaXN0X2hlYWQJCWFjdGl2ZV9lbnRyeTsKIAlpbnQJCQkJbnJfc2libGluZ3M7Ci0JaW50CQkJCWdyb3VwX2ZsYWdzOworCisJLyogTm90IHNlcmlhbGl6ZWQuIE9ubHkgd3JpdHRlbiBkdXJpbmcgZXZlbnQgaW5pdGlhbGl6YXRpb24uICovCisJaW50CQkJCWV2ZW50X2NhcHM7CisJLyogVGhlIGN1bXVsYXRpdmUgQU5EIG9mIGFsbCBldmVudF9jYXBzIGZvciBldmVudHMgaW4gdGhpcyBncm91cC4gKi8KKwlpbnQJCQkJZ3JvdXBfY2FwczsKKwogCXN0cnVjdCBwZXJmX2V2ZW50CQkqZ3JvdXBfbGVhZGVyOwogCXN0cnVjdCBwbXUJCQkqcG11OwogCXZvaWQJCQkJKnBtdV9wcml2YXRlOwpAQCAtNjc5LDYgKzY5MCwxMCBAQAogCXU2NAkJCQkoKmNsb2NrKSh2b2lkKTsKIAlwZXJmX292ZXJmbG93X2hhbmRsZXJfdAkJb3ZlcmZsb3dfaGFuZGxlcjsKIAl2b2lkCQkJCSpvdmVyZmxvd19oYW5kbGVyX2NvbnRleHQ7CisjaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMCisJcGVyZl9vdmVyZmxvd19oYW5kbGVyX3QJCW9yaWdfb3ZlcmZsb3dfaGFuZGxlcjsKKwlzdHJ1Y3QgYnBmX3Byb2cJCQkqcHJvZzsKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0VWRU5UX1RSQUNJTkcKIAlzdHJ1Y3QgdHJhY2VfZXZlbnRfY2FsbAkJKnRwX2V2ZW50OwpAQCAtNzc0LDYgKzc4OSw5IEBACiAjaWZkZWYgQ09ORklHX0NHUk9VUF9QRVJGCiAJc3RydWN0IHBlcmZfY2dyb3VwCQkqY2dycDsKICNlbmRpZgorCisJc3RydWN0IGxpc3RfaGVhZAkJc2NoZWRfY2JfZW50cnk7CisJaW50CQkJCXNjaGVkX2NiX3VzYWdlOwogfTsKIAogc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSB7CkBAIC03ODgsNiArODA2LDExIEBACiAJaW50CQkJCXBhZ2U7CiB9OwogCitzdHJ1Y3QgYnBmX3BlcmZfZXZlbnRfZGF0YV9rZXJuIHsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKKwlzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YTsKK307CisKICNpZmRlZiBDT05GSUdfQ0dST1VQX1BFUkYKIAogLyoKQEAgLTk4NSw3ICsxMDA4LDcgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgaXNfc29mdHdhcmVfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewotCXJldHVybiBldmVudC0+cG11LT50YXNrX2N0eF9uciA9PSBwZXJmX3N3X2NvbnRleHQ7CisJcmV0dXJuIGV2ZW50LT5ldmVudF9jYXBzICYgUEVSRl9FVl9DQVBfU09GVFdBUkU7CiB9CiAKIGV4dGVybiBzdHJ1Y3Qgc3RhdGljX2tleSBwZXJmX3N3ZXZlbnRfZW5hYmxlZFtQRVJGX0NPVU5UX1NXX01BWF07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BoeS5oIGIvaW5jbHVkZS9saW51eC9waHkuaAppbmRleCAyZDI0YjI4Li5lMjVmMTgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BoeS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGh5LmgKQEAgLTgwLDYgKzgwLDcgQEAKIAlQSFlfSU5URVJGQUNFX01PREVfWEdNSUksCiAJUEhZX0lOVEVSRkFDRV9NT0RFX01PQ0EsCiAJUEhZX0lOVEVSRkFDRV9NT0RFX1FTR01JSSwKKwlQSFlfSU5URVJGQUNFX01PREVfVFJHTUlJLAogCVBIWV9JTlRFUkZBQ0VfTU9ERV9NQVgsCiB9IHBoeV9pbnRlcmZhY2VfdDsKIApAQCAtMTIzLDYgKzEyNCw4IEBACiAJCXJldHVybiAibW9jYSI7CiAJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUVNHTUlJOgogCQlyZXR1cm4gInFzZ21paSI7CisJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfVFJHTUlJOgorCQlyZXR1cm4gInRyZ21paSI7CiAJZGVmYXVsdDoKIAkJcmV0dXJuICJ1bmtub3duIjsKIAl9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BoeS9waHkuaCBiL2luY2x1ZGUvbGludXgvcGh5L3BoeS5oCmluZGV4IGYwOGI2NzIuLmVlMWJlZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGh5L3BoeS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGh5L3BoeS5oCkBAIC0zNiw2ICszNiw3IEBACiAgKiBAcG93ZXJfb246IHBvd2VyaW5nIG9uIHRoZSBwaHkKICAqIEBwb3dlcl9vZmY6IHBvd2VyaW5nIG9mZiB0aGUgcGh5CiAgKiBAc2V0X21vZGU6IHNldCB0aGUgbW9kZSBvZiB0aGUgcGh5CisgKiBAcmVzZXQ6IHJlc2V0dGluZyB0aGUgcGh5CiAgKiBAb3duZXI6IHRoZSBtb2R1bGUgb3duZXIgY29udGFpbmluZyB0aGUgb3BzCiAgKi8KIHN0cnVjdCBwaHlfb3BzIHsKQEAgLTQ0LDYgKzQ1LDcgQEAKIAlpbnQJKCpwb3dlcl9vbikoc3RydWN0IHBoeSAqcGh5KTsKIAlpbnQJKCpwb3dlcl9vZmYpKHN0cnVjdCBwaHkgKnBoeSk7CiAJaW50CSgqc2V0X21vZGUpKHN0cnVjdCBwaHkgKnBoeSwgZW51bSBwaHlfbW9kZSBtb2RlKTsKKwlpbnQJKCpyZXNldCkoc3RydWN0IHBoeSAqcGh5KTsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIH07CiAKQEAgLTEzNiw2ICsxMzgsNyBAQAogaW50IHBoeV9wb3dlcl9vbihzdHJ1Y3QgcGh5ICpwaHkpOwogaW50IHBoeV9wb3dlcl9vZmYoc3RydWN0IHBoeSAqcGh5KTsKIGludCBwaHlfc2V0X21vZGUoc3RydWN0IHBoeSAqcGh5LCBlbnVtIHBoeV9tb2RlIG1vZGUpOworaW50IHBoeV9yZXNldChzdHJ1Y3QgcGh5ICpwaHkpOwogc3RhdGljIGlubGluZSBpbnQgcGh5X2dldF9idXNfd2lkdGgoc3RydWN0IHBoeSAqcGh5KQogewogCXJldHVybiBwaHktPmF0dHJzLmJ1c193aWR0aDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kbWEtZHcuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kbWEtZHcuaAppbmRleCBkMTVkOGJhLi41ZjBlMTFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZG1hLWR3LmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1kdy5oCkBAIC0yMyw2ICsyMyw3IEBACiAgKiBAZHN0X2lkOglkc3QgcmVxdWVzdCBsaW5lCiAgKiBAbV9tYXN0ZXI6CW1lbW9yeSBtYXN0ZXIgZm9yIHRyYW5zZmVycyBvbiBhbGxvY2F0ZWQgY2hhbm5lbAogICogQHBfbWFzdGVyOglwZXJpcGhlcmFsIG1hc3RlciBmb3IgdHJhbnNmZXJzIG9uIGFsbG9jYXRlZCBjaGFubmVsCisgKiBAaHNfcG9sYXJpdHk6c2V0IGFjdGl2ZSBsb3cgcG9sYXJpdHkgb2YgaGFuZHNoYWtlIGludGVyZmFjZQogICovCiBzdHJ1Y3QgZHdfZG1hX3NsYXZlIHsKIAlzdHJ1Y3QgZGV2aWNlCQkqZG1hX2RldjsKQEAgLTMwLDYgKzMxLDcgQEAKIAl1OAkJCWRzdF9pZDsKIAl1OAkJCW1fbWFzdGVyOwogCXU4CQkJcF9tYXN0ZXI7CisJYm9vbAkJCWhzX3BvbGFyaXR5OwogfTsKIAogLyoqCkBAIC0zOCw2ICs0MCw3IEBACiAgKiBAaXNfcHJpdmF0ZTogVGhlIGRldmljZSBjaGFubmVscyBzaG91bGQgYmUgbWFya2VkIGFzIHByaXZhdGUgYW5kIG5vdCBmb3IKICAqCWJ5IHRoZSBnZW5lcmFsIHB1cnBvc2UgRE1BIGNoYW5uZWwgYWxsb2NhdG9yLgogICogQGlzX21lbWNweTogVGhlIGRldmljZSBjaGFubmVscyBkbyBzdXBwb3J0IG1lbW9yeS10by1tZW1vcnkgdHJhbnNmZXJzLgorICogQGlzX25vbGxwOiBUaGUgZGV2aWNlIGNoYW5uZWxzIGRvZXMgbm90IHN1cHBvcnQgbXVsdGkgYmxvY2sgdHJhbnNmZXJzLgogICogQGNoYW5fYWxsb2NhdGlvbl9vcmRlcjogQWxsb2NhdGUgY2hhbm5lbHMgc3RhcnRpbmcgZnJvbSAwIG9yIDcKICAqIEBjaGFuX3ByaW9yaXR5OiBTZXQgY2hhbm5lbCBwcmlvcml0eSBpbmNyZWFzaW5nIGZyb20gMCB0byA3IG9yIDcgdG8gMC4KICAqIEBibG9ja19zaXplOiBNYXhpbXVtIGJsb2NrIHNpemUgc3VwcG9ydGVkIGJ5IHRoZSBjb250cm9sbGVyCkBAIC00OSw2ICs1Miw3IEBACiAJdW5zaWduZWQgaW50CW5yX2NoYW5uZWxzOwogCWJvb2wJCWlzX3ByaXZhdGU7CiAJYm9vbAkJaXNfbWVtY3B5OworCWJvb2wJCWlzX25vbGxwOwogI2RlZmluZSBDSEFOX0FMTE9DQVRJT05fQVNDRU5ESU5HCTAJLyogemVybyB0byBzZXZlbiAqLwogI2RlZmluZSBDSEFOX0FMTE9DQVRJT05fREVTQ0VORElORwkxCS8qIHNldmVuIHRvIHplcm8gKi8KIAl1bnNpZ25lZCBjaGFyCWNoYW5fYWxsb2NhdGlvbl9vcmRlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2h0Yy1lZ3Bpby5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2dwaW8taHRjLWVncGlvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbGludXgvbWZkL2h0Yy1lZ3Bpby5oCnJlbmFtZSB0byBpbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZ3Bpby1odGMtZWdwaW8uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2dwaW8tbHBjMzJ4eC5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2dwaW8tbHBjMzJ4eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTQ0ZTk2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9ncGlvLWxwYzMyeHguaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBBdXRob3I6IEtldmluIFdlbGxzIDxrZXZpbi53ZWxsc0BueHAuY29tPgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBOWFAgU2VtaWNvbmR1Y3RvcnMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX01BQ0hfR1BJT19MUEMzMlhYX0gKLSNkZWZpbmUgX19NQUNIX0dQSU9fTFBDMzJYWF9ICi0KLS8qCi0gKiBOb3RlIQotICogTXV4ZWQgR1AgcGlucyBuZWVkIHRvIGJlIHNldHVwIHRvIHRoZSBHUCBzdGF0ZSBpbiB0aGUgYm9hcmQgbGV2ZWwKLSAqIGNvZGUgcHJpb3IgdG8gdXNpbmcgdGhpcyBkcml2ZXIuCi0gKiBHUEkgcGlucyA6IDI4eFAzIGdyb3VwCi0gKiBHUE8gcGlucyA6IDI0eFAzIGdyb3VwCi0gKiBHUElPIHBpbnM6IDh4UDAgZ3JvdXAsIDI0eFAxIGdyb3VwLCAxM3hQMiBncm91cCwgNnhQMyBncm91cAotICovCi0KLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX01BWCA4Ci0jZGVmaW5lIExQQzMyWFhfR1BJT19QMV9NQVggMjQKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX01BWCAxMwotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDNfTUFYIDYKLSNkZWZpbmUgTFBDMzJYWF9HUElfUDNfTUFYIDI5Ci0jZGVmaW5lIExQQzMyWFhfR1BPX1AzX01BWCAyNAotCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMF9HUlAgMAotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfR1JQIChMUEMzMlhYX0dQSU9fUDBfR1JQICsgTFBDMzJYWF9HUElPX1AwX01BWCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX0dSUCAoTFBDMzJYWF9HUElPX1AxX0dSUCArIExQQzMyWFhfR1BJT19QMV9NQVgpCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QM19HUlAgKExQQzMyWFhfR1BJT19QMl9HUlAgKyBMUEMzMlhYX0dQSU9fUDJfTUFYKQotI2RlZmluZSBMUEMzMlhYX0dQSV9QM19HUlAgKExQQzMyWFhfR1BJT19QM19HUlAgKyBMUEMzMlhYX0dQSU9fUDNfTUFYKQotI2RlZmluZSBMUEMzMlhYX0dQT19QM19HUlAgKExQQzMyWFhfR1BJX1AzX0dSUCArIExQQzMyWFhfR1BJX1AzX01BWCkKLQotLyoKLSAqIEEgc3BlY2lmaWMgR1BJTyBjYW4gYmUgc2VsZWN0ZWQgd2l0aCB0aGlzIG1hY3JvCi0gKiBpZSwgR1BJT18wNSBjYW4gYmUgc2VsZWN0ZWQgd2l0aCBMUEMzMlhYX0dQSU8oTFBDMzJYWF9HUElPX1AzX0dSUCwgNSkKLSAqIFNlZSB0aGUgTFBDMzJ4MCBVc2VyJ3MgZ3VpZGUgZm9yIEdQSU8gZ3JvdXAgbnVtYmVycwotICovCi0jZGVmaW5lIExQQzMyWFhfR1BJTyh4LCB5KSAoKHgpICsgKHkpKQotCi0jZW5kaWYgLyogX19NQUNIX0dQSU9fTFBDMzJYWF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtX2RvbWFpbi5oIGIvaW5jbHVkZS9saW51eC9wbV9kb21haW4uaAppbmRleCAzMWZlYzg1Li5hMDlmZTVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BtX2RvbWFpbi5oCisrKyBiL2luY2x1ZGUvbGludXgvcG1fZG9tYWluLmgKQEAgLTUxLDYgKzUxLDggQEAKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIAlzdHJ1Y3QgZGV2X3Bvd2VyX2dvdmVybm9yICpnb3Y7CiAJc3RydWN0IHdvcmtfc3RydWN0IHBvd2VyX29mZl93b3JrOworCXN0cnVjdCBmd25vZGVfaGFuZGxlICpwcm92aWRlcjsJLyogSWRlbnRpdHkgb2YgdGhlIGRvbWFpbiBwcm92aWRlciAqLworCWJvb2wgaGFzX3Byb3ZpZGVyOwogCWNvbnN0IGNoYXIgKm5hbWU7CiAJYXRvbWljX3Qgc2RfY291bnQ7CS8qIE51bWJlciBvZiBzdWJkb21haW5zIHdpdGggcG93ZXIgIm9uIiAqLwogCWVudW0gZ3BkX3N0YXR1cyBzdGF0dXM7CS8qIEN1cnJlbnQgc3RhdGUgb2YgdGhlIGRvbWFpbiAqLwpAQCAtMTE2LDcgKzExOCw2IEBACiAJcmV0dXJuIHRvX2dwZF9kYXRhKGRldi0+cG93ZXIuc3Vic3lzX2RhdGEtPmRvbWFpbl9kYXRhKTsKIH0KIAotZXh0ZXJuIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqcG1fZ2VucGRfbG9va3VwX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBfX3BtX2dlbnBkX2FkZF9kZXZpY2Uoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwKIAkJCQkgc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgZ3BkX3RpbWluZ19kYXRhICp0ZCk7CkBAIC0xMjksNiArMTMwLDcgQEAKIAkJCQkgICAgIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqdGFyZ2V0KTsKIGV4dGVybiBpbnQgcG1fZ2VucGRfaW5pdChzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAogCQkJIHN0cnVjdCBkZXZfcG93ZXJfZ292ZXJub3IgKmdvdiwgYm9vbCBpc19vZmYpOworZXh0ZXJuIGludCBwbV9nZW5wZF9yZW1vdmUoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCk7CiAKIGV4dGVybiBzdHJ1Y3QgZGV2X3Bvd2VyX2dvdmVybm9yIHNpbXBsZV9xb3NfZ292ZXJub3I7CiBleHRlcm4gc3RydWN0IGRldl9wb3dlcl9nb3Zlcm5vciBwbV9kb21haW5fYWx3YXlzX29uX2dvdjsKQEAgLTEzOCwxMCArMTQwLDYgQEAKIHsKIAlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKIH0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpwbV9nZW5wZF9sb29rdXBfZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gTlVMTDsKLX0KIHN0YXRpYyBpbmxpbmUgaW50IF9fcG1fZ2VucGRfYWRkX2RldmljZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAogCQkJCQlzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJCXN0cnVjdCBncGRfdGltaW5nX2RhdGEgKnRkKQpAQCAtMTY4LDYgKzE2NiwxMCBAQAogewogCXJldHVybiAtRU5PU1lTOwogfQorc3RhdGljIGlubGluZSBpbnQgcG1fZ2VucGRfcmVtb3ZlKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpCit7CisJcmV0dXJuIC1FTk9UU1VQUDsKK30KICNlbmRpZgogCiBzdGF0aWMgaW5saW5lIGludCBwbV9nZW5wZF9hZGRfZGV2aWNlKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQsCkBAIC0xOTIsNTcgKzE5NCw1NyBAQAogCXVuc2lnbmVkIGludCBudW1fZG9tYWluczsKIH07CiAKLXR5cGVkZWYgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICooKmdlbnBkX3hsYXRlX3QpKHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmFyZ3MsCi0JCQkJCQl2b2lkICpkYXRhKTsKLQogI2lmZGVmIENPTkZJR19QTV9HRU5FUklDX0RPTUFJTlNfT0YKLWludCBfX29mX2dlbnBkX2FkZF9wcm92aWRlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBnZW5wZF94bGF0ZV90IHhsYXRlLAotCQkJdm9pZCAqZGF0YSk7CitpbnQgb2ZfZ2VucGRfYWRkX3Byb3ZpZGVyX3NpbXBsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkKTsKK2ludCBvZl9nZW5wZF9hZGRfcHJvdmlkZXJfb25lY2VsbChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSAgc3RydWN0IGdlbnBkX29uZWNlbGxfZGF0YSAqZGF0YSk7CiB2b2lkIG9mX2dlbnBkX2RlbF9wcm92aWRlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKLXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqb2ZfZ2VucGRfZ2V0X2Zyb21fcHJvdmlkZXIoCi0JCQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpnZW5wZHNwZWMpOwotCi1zdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKl9fb2ZfZ2VucGRfeGxhdGVfc2ltcGxlKAotCQkJCQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpnZW5wZHNwZWMsCi0JCQkJCXZvaWQgKmRhdGEpOwotc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpfX29mX2dlbnBkX3hsYXRlX29uZWNlbGwoCi0JCQkJCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmdlbnBkc3BlYywKLQkJCQkJdm9pZCAqZGF0YSk7CitleHRlcm4gaW50IG9mX2dlbnBkX2FkZF9kZXZpY2Uoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqYXJncywKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBvZl9nZW5wZF9hZGRfc3ViZG9tYWluKHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKnBhcmVudCwKKwkJCQkgIHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKm5ld19zdWJkb21haW4pOworZXh0ZXJuIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqb2ZfZ2VucGRfcmVtb3ZlX2xhc3Qoc3RydWN0IGRldmljZV9ub2RlICpucCk7CiAKIGludCBnZW5wZF9kZXZfcG1fYXR0YWNoKHN0cnVjdCBkZXZpY2UgKmRldik7CiAjZWxzZSAvKiAhQ09ORklHX1BNX0dFTkVSSUNfRE9NQUlOU19PRiAqLwotc3RhdGljIGlubGluZSBpbnQgX19vZl9nZW5wZF9hZGRfcHJvdmlkZXIoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkJZ2VucGRfeGxhdGVfdCB4bGF0ZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbmxpbmUgaW50IG9mX2dlbnBkX2FkZF9wcm92aWRlcl9zaW1wbGUoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKIHsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOT1RTVVBQOwogfQorCitzdGF0aWMgaW5saW5lIGludCBvZl9nZW5wZF9hZGRfcHJvdmlkZXJfb25lY2VsbChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQlzdHJ1Y3QgZ2VucGRfb25lY2VsbF9kYXRhICpkYXRhKQoreworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBvZl9nZW5wZF9kZWxfcHJvdmlkZXIoc3RydWN0IGRldmljZV9ub2RlICpucCkge30KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKm9mX2dlbnBkX2dldF9mcm9tX3Byb3ZpZGVyKAotCQkJc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqZ2VucGRzcGVjKQorc3RhdGljIGlubGluZSBpbnQgb2ZfZ2VucGRfYWRkX2RldmljZShzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICphcmdzLAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAotI2RlZmluZSBfX29mX2dlbnBkX3hsYXRlX3NpbXBsZQkJTlVMTAotI2RlZmluZSBfX29mX2dlbnBkX3hsYXRlX29uZWNlbGwJTlVMTAorc3RhdGljIGlubGluZSBpbnQgb2ZfZ2VucGRfYWRkX3N1YmRvbWFpbihzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpwYXJlbnQsCisJCQkJCSBzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpuZXdfc3ViZG9tYWluKQoreworCXJldHVybiAtRU5PREVWOworfQogCiBzdGF0aWMgaW5saW5lIGludCBnZW5wZF9kZXZfcG1fYXR0YWNoKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUE1fR0VORVJJQ19ET01BSU5TX09GICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IG9mX2dlbnBkX2FkZF9wcm92aWRlcl9zaW1wbGUoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqb2ZfZ2VucGRfcmVtb3ZlX2xhc3Qoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlyZXR1cm4gX19vZl9nZW5wZF9hZGRfcHJvdmlkZXIobnAsIF9fb2ZfZ2VucGRfeGxhdGVfc2ltcGxlLCBnZW5wZCk7CisJcmV0dXJuIEVSUl9QVFIoLUVOT1RTVVBQKTsKIH0KLXN0YXRpYyBpbmxpbmUgaW50IG9mX2dlbnBkX2FkZF9wcm92aWRlcl9vbmVjZWxsKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJCXN0cnVjdCBnZW5wZF9vbmVjZWxsX2RhdGEgKmRhdGEpCi17Ci0JcmV0dXJuIF9fb2ZfZ2VucGRfYWRkX3Byb3ZpZGVyKG5wLCBfX29mX2dlbnBkX3hsYXRlX29uZWNlbGwsIGRhdGEpOwotfQorI2VuZGlmIC8qIENPTkZJR19QTV9HRU5FUklDX0RPTUFJTlNfT0YgKi8KIAogI2lmZGVmIENPTkZJR19QTQogZXh0ZXJuIGludCBkZXZfcG1fZG9tYWluX2F0dGFjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgcG93ZXJfb24pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wcm9wZXJ0eS5oIGIvaW5jbHVkZS9saW51eC9wcm9wZXJ0eS5oCmluZGV4IDNhMmY5YWUuLjg1NmU1MGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJvcGVydHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Byb3BlcnR5LmgKQEAgLTE5MCw3ICsxOTAsNyBAQAogCS5sZW5ndGggPSBBUlJBWV9TSVpFKF92YWxfKSAqIHNpemVvZihfdHlwZV8pLAkJXAogCS5pc19hcnJheSA9IHRydWUsCQkJCQlcCiAJLmlzX3N0cmluZyA9IGZhbHNlLAkJCQkJXAotCXsgLnBvaW50ZXIgPSB7IF90eXBlXyMjX2RhdGEgPSBfdmFsXyB9IH0sCQlcCisJeyAucG9pbnRlciA9IHsgLl90eXBlXyMjX2RhdGEgPSBfdmFsXyB9IH0sCQlcCiB9CiAKICNkZWZpbmUgUFJPUEVSVFlfRU5UUllfVThfQVJSQVkoX25hbWVfLCBfdmFsXykJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3B0cF9jbG9ja19rZXJuZWwuaCBiL2luY2x1ZGUvbGludXgvcHRwX2Nsb2NrX2tlcm5lbC5oCmluZGV4IDZiMTVlMTYuLjVhZDU0ZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHRwX2Nsb2NrX2tlcm5lbC5oCisrKyBiL2luY2x1ZGUvbGludXgvcHRwX2Nsb2NrX2tlcm5lbC5oCkBAIC0xMjcsNiArMTI3LDExIEBACiAgKgogICogQGluZm86ICAgU3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG5ldyBjbG9jay4KICAqIEBwYXJlbnQ6IFBvaW50ZXIgdG8gdGhlIHBhcmVudCBkZXZpY2Ugb2YgdGhlIG5ldyBjbG9jay4KKyAqCisgKiBSZXR1cm5zIGEgdmFsaWQgcG9pbnRlciBvbiBzdWNjZXNzIG9yIFBUUl9FUlIgb24gZmFpbHVyZS4gIElmIFBIQworICogc3VwcG9ydCBpcyBtaXNzaW5nIGF0IHRoZSBjb25maWd1cmF0aW9uIGxldmVsLCB0aGlzIGZ1bmN0aW9uCisgKiByZXR1cm5zIE5VTEwsIGFuZCBkcml2ZXJzIGFyZSBleHBlY3RlZCB0byBncmFjZWZ1bGx5IGhhbmRsZSB0aGF0CisgKiBjYXNlIHNlcGFyYXRlbHkuCiAgKi8KIAogZXh0ZXJuIHN0cnVjdCBwdHBfY2xvY2sgKnB0cF9jbG9ja19yZWdpc3RlcihzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKmluZm8sCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3B4YTJ4eF9zc3AuaCBiL2luY2x1ZGUvbGludXgvcHhhMnh4X3NzcC5oCmluZGV4IDJhMDk3ZDEuLjJkNmYwYzM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3B4YTJ4eF9zc3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L3B4YTJ4eF9zc3AuaApAQCAtODMsNyArODMsNiBAQAogI2RlZmluZSBTU1NSX1JGUwkoMSA8PCA2KQkvKiBSZWNlaXZlIEZJRk8gU2VydmljZSBSZXF1ZXN0ICovCiAjZGVmaW5lIFNTU1JfUk9SCSgxIDw8IDcpCS8qIFJlY2VpdmUgRklGTyBPdmVycnVuICovCiAKLSNpZmRlZiBDT05GSUdfQVJDSF9QWEEKICNkZWZpbmUgUlhfVEhSRVNIX0RGTFQJOAogI2RlZmluZSBUWF9USFJFU0hfREZMVAk4CiAKQEAgLTk1LDE5ICs5NCwxNiBAQAogI2RlZmluZSBTU0NSMV9SRlQJKDB4MDAwMDNjMDApCS8qIFJlY2VpdmUgRklGTyBUaHJlc2hvbGQgKG1hc2spICovCiAjZGVmaW5lIFNTQ1IxX1J4VHJlc2goeCkgKCgoeCkgLSAxKSA8PCAxMCkgLyogbGV2ZWwgWzEuLjE2XSAqLwogCi0jZWxzZQorI2RlZmluZSBSWF9USFJFU0hfQ0U0MTAwX0RGTFQJMgorI2RlZmluZSBUWF9USFJFU0hfQ0U0MTAwX0RGTFQJMgogCi0jZGVmaW5lIFJYX1RIUkVTSF9ERkxUCTIKLSNkZWZpbmUgVFhfVEhSRVNIX0RGTFQJMgorI2RlZmluZSBDRTQxMDBfU1NTUl9URkxfTUFTSwkoMHgzIDw8IDgpCS8qIFRyYW5zbWl0IEZJRk8gTGV2ZWwgbWFzayAqLworI2RlZmluZSBDRTQxMDBfU1NTUl9SRkxfTUFTSwkoMHgzIDw8IDEyKQkvKiBSZWNlaXZlIEZJRk8gTGV2ZWwgbWFzayAqLwogCi0jZGVmaW5lIFNTU1JfVEZMX01BU0sJKDB4MyA8PCA4KQkvKiBUcmFuc21pdCBGSUZPIExldmVsIG1hc2sgKi8KLSNkZWZpbmUgU1NTUl9SRkxfTUFTSwkoMHgzIDw8IDEyKQkvKiBSZWNlaXZlIEZJRk8gTGV2ZWwgbWFzayAqLwotCi0jZGVmaW5lIFNTQ1IxX1RGVAkoMHgwMDAwMDBjMCkJLyogVHJhbnNtaXQgRklGTyBUaHJlc2hvbGQgKG1hc2spICovCi0jZGVmaW5lIFNTQ1IxX1R4VHJlc2goeCkgKCgoeCkgLSAxKSA8PCA2KSAvKiBsZXZlbCBbMS4uNF0gKi8KLSNkZWZpbmUgU1NDUjFfUkZUCSgweDAwMDAwYzAwKQkvKiBSZWNlaXZlIEZJRk8gVGhyZXNob2xkIChtYXNrKSAqLwotI2RlZmluZSBTU0NSMV9SeFRyZXNoKHgpICgoKHgpIC0gMSkgPDwgMTApIC8qIGxldmVsIFsxLi40XSAqLwotI2VuZGlmCisjZGVmaW5lIENFNDEwMF9TU0NSMV9URlQJKDB4MDAwMDAwYzApCS8qIFRyYW5zbWl0IEZJRk8gVGhyZXNob2xkIChtYXNrKSAqLworI2RlZmluZSBDRTQxMDBfU1NDUjFfVHhUcmVzaCh4KSAoKCh4KSAtIDEpIDw8IDYpCS8qIGxldmVsIFsxLi40XSAqLworI2RlZmluZSBDRTQxMDBfU1NDUjFfUkZUCSgweDAwMDAwYzAwKQkvKiBSZWNlaXZlIEZJRk8gVGhyZXNob2xkIChtYXNrKSAqLworI2RlZmluZSBDRTQxMDBfU1NDUjFfUnhUcmVzaCh4KSAoKCh4KSAtIDEpIDw8IDEwKQkvKiBsZXZlbCBbMS4uNF0gKi8KIAogLyogUVVBUktfWDEwMDAgU1NDUjAgYml0IGRlZmluaXRpb24gKi8KICNkZWZpbmUgUVVBUktfWDEwMDBfU1NDUjBfRFNTCSgweDFGKQkJLyogRGF0YSBTaXplIFNlbGVjdCAobWFzaykgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWVkL2NvbW1vbl9oc2kuaCBiL2luY2x1ZGUvbGludXgvcWVkL2NvbW1vbl9oc2kuaAppbmRleCA0MGMwYWRhLi43MzRkZWIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3FlZC9jb21tb25faHNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9xZWQvY29tbW9uX2hzaS5oCkBAIC01LDI4ICs1LDc3IEBACiAgKiAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCiAgKiB0aGlzIHNvdXJjZSB0cmVlLgogICovCisjaWZuZGVmIF9DT01NT05fSFNJX0gKKyNkZWZpbmUgX0NPTU1PTl9IU0lfSAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworLyogZG1hX2FkZHJfdCBtYW5pcCAqLworI2RlZmluZSBETUFfTE9fTEUoeCkJCWNwdV90b19sZTMyKGxvd2VyXzMyX2JpdHMoeCkpCisjZGVmaW5lIERNQV9ISV9MRSh4KQkJY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyh4KSkKKyNkZWZpbmUgRE1BX1JFR1BBSVJfTEUoeCwgdmFsKQlkbyB7IFwKKwkJCQkJKHgpLmhpID0gRE1BX0hJX0xFKCh2YWwpKTsgXAorCQkJCQkoeCkubG8gPSBETUFfTE9fTEUoKHZhbCkpOyBcCisJCQkJfSB3aGlsZSAoMCkKKworI2RlZmluZSBISUxPX0dFTihoaSwgbG8sIHR5cGUpICAoKCgodHlwZSkoaGkpKSA8PCAzMikgKyAobG8pKQorI2RlZmluZSBISUxPXzY0KGhpLCBsbykgSElMT19HRU4oKGxlMzJfdG9fY3B1KGhpKSksIChsZTMyX3RvX2NwdShsbykpLCB1NjQpCisjZGVmaW5lIEhJTE9fNjRfUkVHUEFJUihyZWdwYWlyKSAgICAgICAgKEhJTE9fNjQocmVncGFpci5oaSwgcmVncGFpci5sbykpCisjZGVmaW5lIEhJTE9fRE1BX1JFR1BBSVIocmVncGFpcikJKChkbWFfYWRkcl90KUhJTE9fNjRfUkVHUEFJUihyZWdwYWlyKSkKIAogI2lmbmRlZiBfX0NPTU1PTl9IU0lfXwogI2RlZmluZSBfX0NPTU1PTl9IU0lfXwogCi0jZGVmaW5lIENPUkVfU1BRRV9QQUdFX1NJWkVfQllURVMgICAgICAgICAgICAgICAgICAgICAgIDQwOTYKIAogI2RlZmluZSBYX0ZJTkFMX0NMRUFOVVBfQUdHX0lOVCAxCisKKyNkZWZpbmUgRVZFTlRfUklOR19QQUdFX1NJWkVfQllURVMgICAgICAgICAgNDA5NgorCiAjZGVmaW5lIE5VTV9PRl9HTE9CQUxfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOAorI2RlZmluZSBDT01NT05fUVVFVUVfRU5UUllfTUFYX0JZVEVfU0laRSAgICAgICAgNjQKKworI2RlZmluZSBJU0NTSV9DRFVfVEFTS19TRUdfVFlQRSAgICAgICAwCisjZGVmaW5lIFJETUFfQ0RVX1RBU0tfU0VHX1RZUEUgICAgICAgIDEKKworI2RlZmluZSBGV19BU1NFUlRfR0VORVJBTF9BVFROX0lEWCAgICAzMgorCisjZGVmaW5lIE1BWF9QSU5ORURfQ0NGQyAgICAgICAgICAgICAgICAgMzIKIAogLyogUXVldWUgWm9uZSBzaXplcyBpbiBieXRlcyAqLwogI2RlZmluZSBUU1RPUk1fUVpPTkVfU0laRSA4Ci0jZGVmaW5lIE1TVE9STV9RWk9ORV9TSVpFIDAKKyNkZWZpbmUgTVNUT1JNX1FaT05FX1NJWkUgMTYKICNkZWZpbmUgVVNUT1JNX1FaT05FX1NJWkUgOAogI2RlZmluZSBYU1RPUk1fUVpPTkVfU0laRSA4CiAjZGVmaW5lIFlTVE9STV9RWk9ORV9TSVpFIDAKICNkZWZpbmUgUFNUT1JNX1FaT05FX1NJWkUgMAogCi0jZGVmaW5lIEVUSF9NQVhfTlVNX1JYX1FVRVVFU19QRVJfVkYgMTYKKyNkZWZpbmUgTVNUT1JNX1ZGX1pPTkVfREVGQVVMVF9TSVpFX0xPRwk3CisjZGVmaW5lIEVUSF9NQVhfTlVNX1JYX1FVRVVFU19QRVJfVkZfREVGQVVMVAkxNgorI2RlZmluZSBFVEhfTUFYX05VTV9SWF9RVUVVRVNfUEVSX1ZGX0RPVUJMRQk0OAorI2RlZmluZSBFVEhfTUFYX05VTV9SWF9RVUVVRVNfUEVSX1ZGX1FVQUQJMTEyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENPUkUgKExJR0hUIEwyKSBGVyBDT05TVEFOVFMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDT1JFX0xMMl9NQVhfUkFNUk9EX1BFUl9DT04JOAorI2RlZmluZSBDT1JFX0xMMl9UWF9CRF9QQUdFX1NJWkVfQllURVMJNDA5NgorI2RlZmluZSBDT1JFX0xMMl9SWF9CRF9QQUdFX1NJWkVfQllURVMJNDA5NgorI2RlZmluZSBDT1JFX0xMMl9SWF9DUUVfUEFHRV9TSVpFX0JZVEVTCTQwOTYKKyNkZWZpbmUgQ09SRV9MTDJfUlhfTlVNX05FWFRfUEFHRV9CRFMJMQorCisjZGVmaW5lIENPUkVfTEwyX1RYX01BWF9CRFNfUEVSX1BBQ0tFVAkxMgorCisjZGVmaW5lIENPUkVfU1BRRV9QQUdFX1NJWkVfQllURVMJNDA5NgorCisjZGVmaW5lIE1BWF9OVU1fTEwyX1JYX1FVRVVFUwkJMzIKKyNkZWZpbmUgTUFYX05VTV9MTDJfVFhfU1RBVFNfQ09VTlRFUlMJMzIKIAogI2RlZmluZSBGV19NQUpPUl9WRVJTSU9OCTgKICNkZWZpbmUgRldfTUlOT1JfVkVSU0lPTgkxMAotI2RlZmluZSBGV19SRVZJU0lPTl9WRVJTSU9OCTUKKyNkZWZpbmUgRldfUkVWSVNJT05fVkVSU0lPTgkxMAogI2RlZmluZSBGV19FTkdJTkVFUklOR19WRVJTSU9OCTAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtODMsNiArMTMyLDIwIEBACiAjZGVmaW5lIE5VTV9PRl9MQ0lEUwkJKDMyMCkKICNkZWZpbmUgTlVNX09GX0xUSURTCQkoMzIwKQogCisvKiBDbG9jayB2YWx1ZXMgKi8KKyNkZWZpbmUgTUFTVEVSX0NMS19GUkVRX0U0CSgzNzVlNikKKyNkZWZpbmUgU1RPUk1fQ0xLX0ZSRVFfRTQJKDEwMDBlNikKKyNkZWZpbmUgQ0xLMjVNX0NMS19GUkVRX0U0CSgyNWU2KQorCisvKiBHbG9iYWwgUFhQIHdpbmRvd3MgKEdUVCkgKi8KKyNkZWZpbmUgTlVNX09GX0dUVAkJMTkKKyNkZWZpbmUgR1RUX0RXT1JEX1NJWkVfQklUUwkxMAorI2RlZmluZSBHVFRfQllURV9TSVpFX0JJVFMJKEdUVF9EV09SRF9TSVpFX0JJVFMgKyAyKQorI2RlZmluZSBHVFRfRFdPUkRfU0laRQkJQklUKEdUVF9EV09SRF9TSVpFX0JJVFMpCisKKy8qIFRvb2xzIFZlcnNpb24gKi8KKyNkZWZpbmUgVE9PTFNfVkVSU0lPTiAxMAorCiAvKioqKioqKioqKioqKioqKiovCiAvKiBDRFUgQ09OU1RBTlRTICovCiAvKioqKioqKioqKioqKioqKiovCkBAIC05MCw2ICsxNTMsOCBAQAogI2RlZmluZSBDRFVfU0VHX1RZUEVfT0ZGU0VUX1JFR19UWVBFX1NISUZUICAgICAgICAgICAgICAoMTcpCiAjZGVmaW5lIENEVV9TRUdfVFlQRV9PRkZTRVRfUkVHX09GRlNFVF9NQVNLICAgICAgICAgICAgICgweDFmZmZmKQogCisjZGVmaW5lIENEVV9WRl9GTF9TRUdfVFlQRV9PRkZTRVRfUkVHX1RZUEVfU0hJRlQJKDEyKQorI2RlZmluZSBDRFVfVkZfRkxfU0VHX1RZUEVfT0ZGU0VUX1JFR19PRkZTRVRfTUFTSwkoMHhmZmYpCiAvKioqKioqKioqKioqKioqKiovCiAvKiBEUSBDT05TVEFOVFMgICovCiAvKioqKioqKioqKioqKioqKiovCkBAIC0xMTUsNiArMTgwLDExIEBACiAjZGVmaW5lCURRX1hDTV9FVEhfVFhfQkRfQ09OU19DTUQJRFFfWENNX0FHR19WQUxfU0VMX1dPUkQzCiAjZGVmaW5lCURRX1hDTV9FVEhfVFhfQkRfUFJPRF9DTUQJRFFfWENNX0FHR19WQUxfU0VMX1dPUkQ0CiAjZGVmaW5lCURRX1hDTV9FVEhfR09fVE9fQkRfQ09OU19DTUQJRFFfWENNX0FHR19WQUxfU0VMX1dPUkQ1CisjZGVmaW5lIERRX1hDTV9JU0NTSV9TUV9DT05TX0NNRAlEUV9YQ01fQUdHX1ZBTF9TRUxfV09SRDMKKyNkZWZpbmUgRFFfWENNX0lTQ1NJX1NRX1BST0RfQ01ECURRX1hDTV9BR0dfVkFMX1NFTF9XT1JENAorI2RlZmluZSBEUV9YQ01fSVNDU0lfTU9SRV9UT19TRU5EX1NFUV9DTUQgRFFfWENNX0FHR19WQUxfU0VMX1JFRzMKKyNkZWZpbmUgRFFfWENNX0lTQ1NJX0VYUF9TVEFUX1NOX0NNRAlEUV9YQ01fQUdHX1ZBTF9TRUxfUkVHNgorI2RlZmluZSBEUV9YQ01fUk9DRV9TUV9QUk9EX0NNRAlEUV9YQ01fQUdHX1ZBTF9TRUxfV09SRDQKIAogLyogVUNNIGFnZyB2YWwgc2VsZWN0aW9uIChIVykgKi8KICNkZWZpbmUJRFFfVUNNX0FHR19WQUxfU0VMX1dPUkQwCTAKQEAgLTE1OSwxMyArMjI5LDE2IEBACiAjZGVmaW5lCURRX1hDTV9BR0dfRkxHX1NISUZUX0NGMjMJNwogCiAvKiBYQ00gYWdnIGNvdW50ZXIgZmxhZyBzZWxlY3Rpb24gKi8KLSNkZWZpbmUgRFFfWENNX0NPUkVfRFFfQ0ZfQ01ECQkoMSA8PCBEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjE4KQotI2RlZmluZSBEUV9YQ01fQ09SRV9URVJNSU5BVEVfQ01ECSgxIDw8IERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMTkpCi0jZGVmaW5lIERRX1hDTV9DT1JFX1NMT1dfUEFUSF9DTUQJKDEgPDwgRFFfWENNX0FHR19GTEdfU0hJRlRfQ0YyMikKLSNkZWZpbmUgRFFfWENNX0VUSF9EUV9DRl9DTUQJCSgxIDw8IERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMTgpCi0jZGVmaW5lIERRX1hDTV9FVEhfVEVSTUlOQVRFX0NNRAkoMSA8PCBEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjE5KQotI2RlZmluZSBEUV9YQ01fRVRIX1NMT1dfUEFUSF9DTUQJKDEgPDwgRFFfWENNX0FHR19GTEdfU0hJRlRfQ0YyMikKLSNkZWZpbmUgRFFfWENNX0VUSF9UUEhfRU5fQ01ECQkoMSA8PCBEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjIzKQorI2RlZmluZSBEUV9YQ01fQ09SRV9EUV9DRl9DTUQJCUJJVChEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjE4KQorI2RlZmluZSBEUV9YQ01fQ09SRV9URVJNSU5BVEVfQ01ECUJJVChEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjE5KQorI2RlZmluZSBEUV9YQ01fQ09SRV9TTE9XX1BBVEhfQ01ECUJJVChEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjIyKQorI2RlZmluZSBEUV9YQ01fRVRIX0RRX0NGX0NNRAkJQklUKERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMTgpCisjZGVmaW5lIERRX1hDTV9FVEhfVEVSTUlOQVRFX0NNRAlCSVQoRFFfWENNX0FHR19GTEdfU0hJRlRfQ0YxOSkKKyNkZWZpbmUgRFFfWENNX0VUSF9TTE9XX1BBVEhfQ01ECUJJVChEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjIyKQorI2RlZmluZSBEUV9YQ01fRVRIX1RQSF9FTl9DTUQJCUJJVChEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjIzKQorI2RlZmluZSBEUV9YQ01fSVNDU0lfRFFfRkxVU0hfQ01ECUJJVChEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjE5KQorI2RlZmluZSBEUV9YQ01fSVNDU0lfU0xPV19QQVRIX0NNRAlCSVQoRFFfWENNX0FHR19GTEdfU0hJRlRfQ0YyMikKKyNkZWZpbmUgRFFfWENNX0lTQ1NJX1BST0NfT05MWV9DTEVBTlVQX0NNRCBCSVQoRFFfWENNX0FHR19GTEdfU0hJRlRfQ0YyMykKIAogLyogVUNNIGFnZyBjb3VudGVyIGZsYWcgc2VsZWN0aW9uIChIVykgKi8KICNkZWZpbmUJRFFfVUNNX0FHR19GTEdfU0hJRlRfQ0YwCTAKQEAgLTE3OCw5ICsyNTEsNDUgQEAKICNkZWZpbmUJRFFfVUNNX0FHR19GTEdfU0hJRlRfUlVMRTFFTgk3CiAKIC8qIFVDTSBhZ2cgY291bnRlciBmbGFnIHNlbGVjdGlvbiAoRlcpICovCi0jZGVmaW5lIERRX1VDTV9FVEhfUE1EX1RYX0FSTV9DTUQJKDEgPDwgRFFfVUNNX0FHR19GTEdfU0hJRlRfQ0Y0KQotI2RlZmluZSBEUV9VQ01fRVRIX1BNRF9SWF9BUk1fQ01ECSgxIDw8IERRX1VDTV9BR0dfRkxHX1NISUZUX0NGNSkKKyNkZWZpbmUgRFFfVUNNX0VUSF9QTURfVFhfQVJNX0NNRAlCSVQoRFFfVUNNX0FHR19GTEdfU0hJRlRfQ0Y0KQorI2RlZmluZSBEUV9VQ01fRVRIX1BNRF9SWF9BUk1fQ01ECUJJVChEUV9VQ01fQUdHX0ZMR19TSElGVF9DRjUpCisjZGVmaW5lIERRX1VDTV9ST0NFX0NRX0FSTV9TRV9DRl9DTUQJQklUKERRX1VDTV9BR0dfRkxHX1NISUZUX0NGNCkKKyNkZWZpbmUgRFFfVUNNX1JPQ0VfQ1FfQVJNX0NGX0NNRAlCSVQoRFFfVUNNX0FHR19GTEdfU0hJRlRfQ0Y1KQogCisvKiBUQ00gYWdnIGNvdW50ZXIgZmxhZyBzZWxlY3Rpb24gKEhXKSAqLworI2RlZmluZSBEUV9UQ01fQUdHX0ZMR19TSElGVF9DRjAJMAorI2RlZmluZSBEUV9UQ01fQUdHX0ZMR19TSElGVF9DRjEJMQorI2RlZmluZSBEUV9UQ01fQUdHX0ZMR19TSElGVF9DRjIJMgorI2RlZmluZSBEUV9UQ01fQUdHX0ZMR19TSElGVF9DRjMJMworI2RlZmluZSBEUV9UQ01fQUdHX0ZMR19TSElGVF9DRjQJNAorI2RlZmluZSBEUV9UQ01fQUdHX0ZMR19TSElGVF9DRjUJNQorI2RlZmluZSBEUV9UQ01fQUdHX0ZMR19TSElGVF9DRjYJNgorI2RlZmluZSBEUV9UQ01fQUdHX0ZMR19TSElGVF9DRjcJNworLyogVENNIGFnZyBjb3VudGVyIGZsYWcgc2VsZWN0aW9uIChGVykgKi8KKyNkZWZpbmUgRFFfVENNX0lTQ1NJX0ZMVVNIX1EwX0NNRAlCSVQoRFFfVENNX0FHR19GTEdfU0hJRlRfQ0YxKQorI2RlZmluZSBEUV9UQ01fSVNDU0lfVElNRVJfU1RPUF9BTExfQ01ECUJJVChEUV9UQ01fQUdHX0ZMR19TSElGVF9DRjMpCisKKy8qIFBXTSBhZGRyZXNzIG1hcHBpbmcgKi8KKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9EUE1fQkFTRQkweDAKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9EUE1fRU5ECTB4MjcKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9YQ00xNl9CQVNFCTB4NDAKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9YQ00zMl9CQVNFCTB4NDQKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9VQ00xNl9CQVNFCTB4NDgKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9VQ00zMl9CQVNFCTB4NEMKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9VQ00xNl80CTB4NTAKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9UQ00xNl9CQVNFCTB4NTgKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9UQ00zMl9CQVNFCTB4NUMKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9YQ01fRkxBR1MJMHg2OAorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1VDTV9GTEFHUwkweDY5CisjZGVmaW5lIERRX1BXTV9PRkZTRVRfVENNX0ZMQUdTCTB4NkIKKworI2RlZmluZSBEUV9QV01fT0ZGU0VUX1hDTV9SRE1BX1NRX1BST0QJCShEUV9QV01fT0ZGU0VUX1hDTTE2X0JBU0UgKyAyKQorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1VDTV9SRE1BX0NRX0NPTlNfMzJCSVQJKERRX1BXTV9PRkZTRVRfVUNNMzJfQkFTRSkKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9VQ01fUkRNQV9DUV9DT05TXzE2QklUCShEUV9QV01fT0ZGU0VUX1VDTTE2XzQpCisjZGVmaW5lIERRX1BXTV9PRkZTRVRfVUNNX1JETUFfSU5UX1RJTUVPVVQJKERRX1BXTV9PRkZTRVRfVUNNMTZfQkFTRSArIDIpCisjZGVmaW5lIERRX1BXTV9PRkZTRVRfVUNNX1JETUFfQVJNX0ZMQUdTCShEUV9QV01fT0ZGU0VUX1VDTV9GTEFHUykKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9UQ01fUk9DRV9SUV9QUk9ECQkoRFFfUFdNX09GRlNFVF9UQ00xNl9CQVNFICsgMSkKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9UQ01fSVdBUlBfUlFfUFJPRAkJKERRX1BXTV9PRkZTRVRfVENNMTZfQkFTRSArIDMpCiAjZGVmaW5lCURRX1JFR0lPTl9TSElGVAkoMTIpCiAKIC8qIERQTSAqLwpAQCAtMjE0LDE1ICszMjMsMTcgQEAKICAqLwogI2RlZmluZSBDTV9UWF9QUV9CQVNFCTB4MjAwCiAKKy8qIG51bWJlciBvZiBnbG9iYWwgVnBvcnQvUUNOIHJhdGUgbGltaXRlcnMgKi8KKyNkZWZpbmUgTUFYX1FNX0dMT0JBTF9STFMJMjU2CiAvKiBRTSByZWdpc3RlcnMgZGF0YSAqLwogI2RlZmluZSBRTV9MSU5FX0NSRF9SRUdfV0lEVEgJCTE2Ci0jZGVmaW5lIFFNX0xJTkVfQ1JEX1JFR19TSUdOX0JJVAkoMSA8PCAoUU1fTElORV9DUkRfUkVHX1dJRFRIIC0gMSkpCisjZGVmaW5lIFFNX0xJTkVfQ1JEX1JFR19TSUdOX0JJVAlCSVQoKFFNX0xJTkVfQ1JEX1JFR19XSURUSCAtIDEpKQogI2RlZmluZSBRTV9CWVRFX0NSRF9SRUdfV0lEVEgJCTI0Ci0jZGVmaW5lIFFNX0JZVEVfQ1JEX1JFR19TSUdOX0JJVAkoMSA8PCAoUU1fQllURV9DUkRfUkVHX1dJRFRIIC0gMSkpCisjZGVmaW5lIFFNX0JZVEVfQ1JEX1JFR19TSUdOX0JJVAlCSVQoKFFNX0JZVEVfQ1JEX1JFR19XSURUSCAtIDEpKQogI2RlZmluZSBRTV9XRlFfQ1JEX1JFR19XSURUSAkJMzIKLSNkZWZpbmUgUU1fV0ZRX0NSRF9SRUdfU0lHTl9CSVQJCSgxIDw8IChRTV9XRlFfQ1JEX1JFR19XSURUSCAtIDEpKQorI2RlZmluZSBRTV9XRlFfQ1JEX1JFR19TSUdOX0JJVAkJQklUKChRTV9XRlFfQ1JEX1JFR19XSURUSCAtIDEpKQogI2RlZmluZSBRTV9STF9DUkRfUkVHX1dJRFRICQkzMgotI2RlZmluZSBRTV9STF9DUkRfUkVHX1NJR05fQklUCQkoMSA8PCAoUU1fUkxfQ1JEX1JFR19XSURUSCAtIDEpKQorI2RlZmluZSBRTV9STF9DUkRfUkVHX1NJR05fQklUCQlCSVQoKFFNX1JMX0NSRF9SRUdfV0lEVEggLSAxKSkKIAogLyoqKioqKioqKioqKioqKioqLwogLyogQ0FVIENPTlNUQU5UUyAqLwpAQCAtMjg3LDYgKzM5OCwxNyBAQAogLyogUFhQIENPTlNUQU5UUyAqLwogLyoqKioqKioqKioqKioqKioqLwogCisvKiBCYXJzIGZvciBCbG9ja3MgKi8KKyNkZWZpbmUgUFhQX0JBUl9HUkMJMAorI2RlZmluZSBQWFBfQkFSX1RTRE0JMAorI2RlZmluZSBQWFBfQkFSX1VTRE0JMAorI2RlZmluZSBQWFBfQkFSX1hTRE0JMAorI2RlZmluZSBQWFBfQkFSX01TRE0JMAorI2RlZmluZSBQWFBfQkFSX1lTRE0JMAorI2RlZmluZSBQWFBfQkFSX1BTRE0JMAorI2RlZmluZSBQWFBfQkFSX0lHVQkwCisjZGVmaW5lIFBYUF9CQVJfRFEJMQorCiAvKiBQVFQgYW5kIEdUVCAqLwogI2RlZmluZSBQWFBfTlVNX1BGX1dJTkRPV1MJCTEyCiAjZGVmaW5lIFBYUF9QRVJfUEZfRU5UUllfU0laRQkJOApAQCAtMzM0LDYgKzQ1Niw1MiBAQAogCShQWFBfRVhURVJOQUxfQkFSX0dMT0JBTF9XSU5ET1dfU1RBUlQgKyBcCiAJIFBYUF9FWFRFUk5BTF9CQVJfR0xPQkFMX1dJTkRPV19MRU5HVEggLSAxKQogCisvKiBQRiBCQVIgKi8KKyNkZWZpbmUgUFhQX0JBUjBfU1RBUlRfR1JDCTB4MDAwMAorI2RlZmluZSBQWFBfQkFSMF9HUkNfTEVOR1RICTB4MUMwMDAwMAorI2RlZmluZSBQWFBfQkFSMF9FTkRfR1JDCShQWFBfQkFSMF9TVEFSVF9HUkMgKyBcCisJCQkJIFBYUF9CQVIwX0dSQ19MRU5HVEggLSAxKQorCisjZGVmaW5lIFBYUF9CQVIwX1NUQVJUX0lHVQkweDFDMDAwMDAKKyNkZWZpbmUgUFhQX0JBUjBfSUdVX0xFTkdUSAkweDEwMDAwCisjZGVmaW5lIFBYUF9CQVIwX0VORF9JR1UJKFBYUF9CQVIwX1NUQVJUX0lHVSArIFwKKwkJCQkgUFhQX0JBUjBfSUdVX0xFTkdUSCAtIDEpCisKKyNkZWZpbmUgUFhQX0JBUjBfU1RBUlRfVFNETQkweDFDODAwMDAKKyNkZWZpbmUgUFhQX0JBUjBfU0RNX0xFTkdUSAkweDQwMDAwCisjZGVmaW5lIFBYUF9CQVIwX1NETV9SRVNFUlZFRF9MRU5HVEgJMHg0MDAwMAorI2RlZmluZSBQWFBfQkFSMF9FTkRfVFNETQkoUFhQX0JBUjBfU1RBUlRfVFNETSArIFwKKwkJCQkgUFhQX0JBUjBfU0RNX0xFTkdUSCAtIDEpCisKKyNkZWZpbmUgUFhQX0JBUjBfU1RBUlRfTVNETQkweDFEMDAwMDAKKyNkZWZpbmUgUFhQX0JBUjBfRU5EX01TRE0JKFBYUF9CQVIwX1NUQVJUX01TRE0gKyBcCisJCQkJIFBYUF9CQVIwX1NETV9MRU5HVEggLSAxKQorCisjZGVmaW5lIFBYUF9CQVIwX1NUQVJUX1VTRE0JMHgxRDgwMDAwCisjZGVmaW5lIFBYUF9CQVIwX0VORF9VU0RNCShQWFBfQkFSMF9TVEFSVF9VU0RNICsgXAorCQkJCSBQWFBfQkFSMF9TRE1fTEVOR1RIIC0gMSkKKworI2RlZmluZSBQWFBfQkFSMF9TVEFSVF9YU0RNCTB4MUUwMDAwMAorI2RlZmluZSBQWFBfQkFSMF9FTkRfWFNETQkoUFhQX0JBUjBfU1RBUlRfWFNETSArIFwKKwkJCQkgUFhQX0JBUjBfU0RNX0xFTkdUSCAtIDEpCisKKyNkZWZpbmUgUFhQX0JBUjBfU1RBUlRfWVNETQkweDFFODAwMDAKKyNkZWZpbmUgUFhQX0JBUjBfRU5EX1lTRE0JKFBYUF9CQVIwX1NUQVJUX1lTRE0gKyBcCisJCQkJIFBYUF9CQVIwX1NETV9MRU5HVEggLSAxKQorCisjZGVmaW5lIFBYUF9CQVIwX1NUQVJUX1BTRE0JMHgxRjAwMDAwCisjZGVmaW5lIFBYUF9CQVIwX0VORF9QU0RNCShQWFBfQkFSMF9TVEFSVF9QU0RNICsgXAorCQkJCSBQWFBfQkFSMF9TRE1fTEVOR1RIIC0gMSkKKworI2RlZmluZSBQWFBfQkFSMF9GSVJTVF9JTlZBTElEX0FERFJFU1MJKFBYUF9CQVIwX0VORF9QU0RNICsgMSkKKworLyogVkYgQkFSICovCisjZGVmaW5lIFBYUF9WRl9CQVIwCTAKKworI2RlZmluZSBQWFBfVkZfQkFSMF9TVEFSVF9HUkMJMHgzRTAwCisjZGVmaW5lIFBYUF9WRl9CQVIwX0dSQ19MRU5HVEgJMHgyMDAKKyNkZWZpbmUgUFhQX1ZGX0JBUjBfRU5EX0dSQwkoUFhQX1ZGX0JBUjBfU1RBUlRfR1JDICsgXAorCQkJCSBQWFBfVkZfQkFSMF9HUkNfTEVOR1RIIC0gMSkKIAogI2RlZmluZSBQWFBfVkZfQkFSMF9TVEFSVF9JR1UgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBQWFBfVkZfQkFSMF9JR1VfTEVOR1RIICAgICAgICAgICAgICAgICAgMHgzMDAwCkBAIC0zOTksNiArNTY3LDIwIEBACiAjZGVmaW5lIFBYUF9OVU1fSUxUX1JFQ09SRFNfQkIgNzYwMAogI2RlZmluZSBQWFBfTlVNX0lMVF9SRUNPUkRTX0syIDExMDAwCiAjZGVmaW5lIE1BWF9OVU1fSUxUX1JFQ09SRFMgTUFYKFBYUF9OVU1fSUxUX1JFQ09SRFNfQkIsIFBYUF9OVU1fSUxUX1JFQ09SRFNfSzIpCisjZGVmaW5lIFBYUF9RVUVVRVNfWk9ORV9NQVhfTlVNIDMyMAorLyoqKioqKioqKioqKioqKioqLworLyogUFJNIENPTlNUQU5UUyAqLworLyoqKioqKioqKioqKioqKioqLworI2RlZmluZSBQUk1fRE1BX1BBRF9CWVRFU19OVU0JMgorLyoqKioqKioqKioqKioqKioqKi8KKy8qIFNETXMgQ09OU1RBTlRTICovCisvKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTRE1fT1BfR0VOX1RSSUdfTk9ORQkwCisjZGVmaW5lIFNETV9PUF9HRU5fVFJJR19XQUtFX1RIUkVBRAkxCisjZGVmaW5lIFNETV9PUF9HRU5fVFJJR19BR0dfSU5UCTIKKyNkZWZpbmUgU0RNX09QX0dFTl9UUklHX0xPQURFUgk0CisjZGVmaW5lIFNETV9PUF9HRU5fVFJJR19JTkRJQ0FURV9FUlJPUgk2CisjZGVmaW5lIFNETV9PUF9HRU5fVFJJR19SRUxFQVNFX1RIUkVBRAk3CiAKICNkZWZpbmUgU0RNX0NPTVBfVFlQRV9OT05FICAgICAgICAgICAgICAwCiAjZGVmaW5lIFNETV9DT01QX1RZUEVfV0FLRV9USFJFQUQgICAgICAgMQpAQCAtNDI0LDYgKzYwNiw4IEBACiAvKiBQUlMgQ09OU1RBTlRTICovCiAvKioqKioqKioqKioqKioqKiovCiAKKyNkZWZpbmUgUFJTX0dGVF9DQU1fTElORVNfTk9fTUFUQ0gJMzEKKwogLyogQXN5bmMgZGF0YSBLQ1EgQ1FFICovCiBzdHJ1Y3QgYXN5bmNfZGF0YSB7CiAJX19sZTMyCWNpZDsKQEAgLTQ0MCwyMCArNjI0LDYgQEAKICNkZWZpbmUJQ09BTEVTQ0lOR19USU1FU0VUX1ZBTElEX1NISUZUCQk3CiB9OwogCi1zdHJ1Y3QgY29tbW9uX3Byc19wZl9tc2dfaW5mbyB7Ci0JX19sZTMyIHZhbHVlOwotI2RlZmluZQlDT01NT05fUFJTX1BGX01TR19JTkZPX05QQVJfREVGQVVMVF9QRl9NQVNLCTB4MQotI2RlZmluZQlDT01NT05fUFJTX1BGX01TR19JTkZPX05QQVJfREVGQVVMVF9QRl9TSElGVAkwCi0jZGVmaW5lCUNPTU1PTl9QUlNfUEZfTVNHX0lORk9fRldfREVCVUdfMV9NQVNLCQkweDEKLSNkZWZpbmUJQ09NTU9OX1BSU19QRl9NU0dfSU5GT19GV19ERUJVR18xX1NISUZUCQkxCi0jZGVmaW5lCUNPTU1PTl9QUlNfUEZfTVNHX0lORk9fRldfREVCVUdfMl9NQVNLCQkweDEKLSNkZWZpbmUJQ09NTU9OX1BSU19QRl9NU0dfSU5GT19GV19ERUJVR18yX1NISUZUCQkyCi0jZGVmaW5lCUNPTU1PTl9QUlNfUEZfTVNHX0lORk9fRldfREVCVUdfM19NQVNLCQkweDEKLSNkZWZpbmUJQ09NTU9OX1BSU19QRl9NU0dfSU5GT19GV19ERUJVR18zX1NISUZUCQkzCi0jZGVmaW5lCUNPTU1PTl9QUlNfUEZfTVNHX0lORk9fUkVTRVJWRURfTUFTSwkJMHhGRkZGRkZGCi0jZGVmaW5lCUNPTU1PTl9QUlNfUEZfTVNHX0lORk9fUkVTRVJWRURfU0hJRlQJCTQKLX07Ci0KIHN0cnVjdCBjb21tb25fcXVldWVfem9uZSB7CiAJX19sZTE2IHJpbmdfZHJ2X2RhdGFfY29uc3VtZXI7CiAJX19sZTE2IHJlc2VydmVkOwpAQCAtNDczLDYgKzY0MywxOSBAQAogCXN0cnVjdCByZWdwYWlyIG1zZ19hZGRyOwogfTsKIAorc3RydWN0IGlzY3NpX2VxZV9kYXRhIHsKKwlfX2xlMzIgY2lkOworCV9fbGUxNiBjb25uX2lkOworCXU4IGVycm9yX2NvZGU7CisJdTggZXJyb3JfcGR1X29wY29kZV9yZXNlcnZlZDsKKyNkZWZpbmUgSVNDU0lfRVFFX0RBVEFfRVJST1JfUERVX09QQ09ERV9NQVNLCQkweDNGCisjZGVmaW5lIElTQ1NJX0VRRV9EQVRBX0VSUk9SX1BEVV9PUENPREVfU0hJRlQJCTAKKyNkZWZpbmUgSVNDU0lfRVFFX0RBVEFfRVJST1JfUERVX09QQ09ERV9WQUxJRF9NQVNLCTB4MQorI2RlZmluZSBJU0NTSV9FUUVfREFUQV9FUlJPUl9QRFVfT1BDT0RFX1ZBTElEX1NISUZUCSA2CisjZGVmaW5lIElTQ1NJX0VRRV9EQVRBX1JFU0VSVkVEMF9NQVNLCQkJMHgxCisjZGVmaW5lIElTQ1NJX0VRRV9EQVRBX1JFU0VSVkVEMF9TSElGVAkJCTcKK307CisKIHN0cnVjdCBtYWxpY2lvdXNfdmZfZXFlX2RhdGEgewogCXU4IHZmX2lkOwogCXU4IGVycl9pZDsKQEAgLTQ4OCw4ICs2NzEsMTAgQEAKIHVuaW9uIGV2ZW50X3JpbmdfZGF0YSB7CiAJdTggYnl0ZXNbOF07CiAJc3RydWN0IHZmX3BmX2NoYW5uZWxfZXFlX2RhdGEgdmZfcGZfY2hhbm5lbDsKKwlzdHJ1Y3QgaXNjc2lfZXFlX2RhdGEgaXNjc2lfaW5mbzsKIAlzdHJ1Y3QgbWFsaWNpb3VzX3ZmX2VxZV9kYXRhIG1hbGljaW91c192ZjsKIAlzdHJ1Y3QgaW5pdGlhbF9jbGVhbnVwX2VxZV9kYXRhIHZmX2luaXRfY2xlYW51cDsKKwlzdHJ1Y3QgcmVncGFpciByb2NlX2hhbmRsZTsKIH07CiAKIC8qIEV2ZW50IFJpbmcgRW50cnkgKi8KQEAgLTYxNiw2ICs4MDEsNTIgQEAKIAlNQVhfREJfREVTVAogfTsKIAorLyogRW51bSBvZiBkb29yYmVsbCBEUE0gdHlwZXMgKi8KK2VudW0gZGJfZHBtX3R5cGUgeworCURQTV9MRUdBQ1ksCisJRFBNX1JPQ0UsCisJRFBNX0wyX0lOTElORSwKKwlEUE1fTDJfQkQsCisJTUFYX0RCX0RQTV9UWVBFCit9OworCisvKiBTdHJ1Y3R1cmUgZm9yIGRvb3JiZWxsIGRhdGEsIGluIEwyIERQTSBtb2RlLCBmb3IgMXN0IGRiIGluIGEgRFBNIGJ1cnN0ICovCitzdHJ1Y3QgZGJfbDJfZHBtX2RhdGEgeworCV9fbGUxNiBpY2lkOworCV9fbGUxNiBiZF9wcm9kOworCV9fbGUzMiBwYXJhbXM7CisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX1NJWkVfTUFTSwkweDNGCisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX1NJWkVfU0hJRlQJMAorI2RlZmluZSBEQl9MMl9EUE1fREFUQV9EUE1fVFlQRV9NQVNLCTB4MworI2RlZmluZSBEQl9MMl9EUE1fREFUQV9EUE1fVFlQRV9TSElGVAk2CisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX05VTV9CRFNfTUFTSwkweEZGCisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX05VTV9CRFNfU0hJRlQJOAorI2RlZmluZSBEQl9MMl9EUE1fREFUQV9QS1RfU0laRV9NQVNLCTB4N0ZGCisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX1BLVF9TSVpFX1NISUZUCTE2CisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX1JFU0VSVkVEMF9NQVNLCTB4MQorI2RlZmluZSBEQl9MMl9EUE1fREFUQV9SRVNFUlZFRDBfU0hJRlQgMjcKKyNkZWZpbmUgREJfTDJfRFBNX0RBVEFfU0dFX05VTV9NQVNLCTB4NworI2RlZmluZSBEQl9MMl9EUE1fREFUQV9TR0VfTlVNX1NISUZUCTI4CisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX1JFU0VSVkVEMV9NQVNLCTB4MQorI2RlZmluZSBEQl9MMl9EUE1fREFUQV9SRVNFUlZFRDFfU0hJRlQgMzEKK307CisKKy8qIFN0cnVjdHVyZSBmb3IgU0dFIGluIGEgRFBNIGRvb3JiZWxsIG9mIHR5cGUgRFBNX0wyX0JEICovCitzdHJ1Y3QgZGJfbDJfZHBtX3NnZSB7CisJc3RydWN0IHJlZ3BhaXIgYWRkcjsKKwlfX2xlMTYgbmJ5dGVzOworCV9fbGUxNiBiaXRmaWVsZHM7CisjZGVmaW5lIERCX0wyX0RQTV9TR0VfVFBIX1NUX0lOREVYX01BU0sJMHgxRkYKKyNkZWZpbmUgREJfTDJfRFBNX1NHRV9UUEhfU1RfSU5ERVhfU0hJRlQgMAorI2RlZmluZSBEQl9MMl9EUE1fU0dFX1JFU0VSVkVEMF9NQVNLCTB4MworI2RlZmluZSBEQl9MMl9EUE1fU0dFX1JFU0VSVkVEMF9TSElGVAk5CisjZGVmaW5lIERCX0wyX0RQTV9TR0VfU1RfVkFMSURfTUFTSwkweDEKKyNkZWZpbmUgREJfTDJfRFBNX1NHRV9TVF9WQUxJRF9TSElGVAkxMQorI2RlZmluZSBEQl9MMl9EUE1fU0dFX1JFU0VSVkVEMV9NQVNLCTB4RgorI2RlZmluZSBEQl9MMl9EUE1fU0dFX1JFU0VSVkVEMV9TSElGVAkxMgorCV9fbGUzMiByZXNlcnZlZDI7Cit9OworCiAvKiBTdHJ1Y3R1cmUgZm9yIGRvb3JiZWxsIGFkZHJlc3MsIGluIGxlZ2FjeSBtb2RlICovCiBzdHJ1Y3QgZGJfbGVnYWN5X2FkZHIgewogCV9fbGUzMiBhZGRyOwpAQCAtNjI3LDYgKzg1OCw0OSBAQAogI2RlZmluZSBEQl9MRUdBQ1lfQUREUl9JQ0lEX1NISUZUICAgICAgNQogfTsKIAorLyogU3RydWN0dXJlIGZvciBkb29yYmVsbCBhZGRyZXNzLCBpbiBQV00gbW9kZSAqLworc3RydWN0IGRiX3B3bV9hZGRyIHsKKwlfX2xlMzIgYWRkcjsKKyNkZWZpbmUgREJfUFdNX0FERFJfUkVTRVJWRUQwX01BU0sJMHg3CisjZGVmaW5lIERCX1BXTV9BRERSX1JFU0VSVkVEMF9TSElGVCAwCisjZGVmaW5lIERCX1BXTV9BRERSX09GRlNFVF9NQVNLCTB4N0YKKyNkZWZpbmUgREJfUFdNX0FERFJfT0ZGU0VUX1NISUZUCTMKKyNkZWZpbmUgREJfUFdNX0FERFJfV0lEX01BU0sJMHgzCisjZGVmaW5lIERCX1BXTV9BRERSX1dJRF9TSElGVAkxMAorI2RlZmluZSBEQl9QV01fQUREUl9EUElfTUFTSwkweEZGRkYKKyNkZWZpbmUgREJfUFdNX0FERFJfRFBJX1NISUZUCTEyCisjZGVmaW5lIERCX1BXTV9BRERSX1JFU0VSVkVEMV9NQVNLCTB4RgorI2RlZmluZSBEQl9QV01fQUREUl9SRVNFUlZFRDFfU0hJRlQgMjgKK307CisKKy8qIFBhcmFtZXRlcnMgdG8gUm9DRSBmaXJtd2FyZSwgcGFzc2VkIGluIEVEUE0gZG9vcmJlbGwgKi8KK3N0cnVjdCBkYl9yb2NlX2RwbV9wYXJhbXMgeworCV9fbGUzMiBwYXJhbXM7CisjZGVmaW5lIERCX1JPQ0VfRFBNX1BBUkFNU19TSVpFX01BU0sJCTB4M0YKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX1NJWkVfU0hJRlQJCTAKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX0RQTV9UWVBFX01BU0sJMHgzCisjZGVmaW5lIERCX1JPQ0VfRFBNX1BBUkFNU19EUE1fVFlQRV9TSElGVAk2CisjZGVmaW5lIERCX1JPQ0VfRFBNX1BBUkFNU19PUENPREVfTUFTSwkJMHhGRgorI2RlZmluZSBEQl9ST0NFX0RQTV9QQVJBTVNfT1BDT0RFX1NISUZUCQk4CisjZGVmaW5lIERCX1JPQ0VfRFBNX1BBUkFNU19XUUVfU0laRV9NQVNLCTB4N0ZGCisjZGVmaW5lIERCX1JPQ0VfRFBNX1BBUkFNU19XUUVfU0laRV9TSElGVAkxNgorI2RlZmluZSBEQl9ST0NFX0RQTV9QQVJBTVNfUkVTRVJWRUQwX01BU0sJMHgxCisjZGVmaW5lIERCX1JPQ0VfRFBNX1BBUkFNU19SRVNFUlZFRDBfU0hJRlQJMjcKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX0NPTVBMRVRJT05fRkxHX01BU0sJMHgxCisjZGVmaW5lIERCX1JPQ0VfRFBNX1BBUkFNU19DT01QTEVUSU9OX0ZMR19TSElGVCAyOAorI2RlZmluZSBEQl9ST0NFX0RQTV9QQVJBTVNfU19GTEdfTUFTSwkJMHgxCisjZGVmaW5lIERCX1JPQ0VfRFBNX1BBUkFNU19TX0ZMR19TSElGVAkJMjkKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX1JFU0VSVkVEMV9NQVNLCTB4MworI2RlZmluZSBEQl9ST0NFX0RQTV9QQVJBTVNfUkVTRVJWRUQxX1NISUZUCTMwCit9OworCisvKiBTdHJ1Y3R1cmUgZm9yIGRvb3JiZWxsIGRhdGEsIGluIFJPQ0UgRFBNIG1vZGUsIGZvciAxc3QgZGIgaW4gYSBEUE0gYnVyc3QgKi8KK3N0cnVjdCBkYl9yb2NlX2RwbV9kYXRhIHsKKwlfX2xlMTYgaWNpZDsKKwlfX2xlMTYgcHJvZF92YWw7CisJc3RydWN0IGRiX3JvY2VfZHBtX3BhcmFtcyBwYXJhbXM7Cit9OworCiAvKiBJZ3UgaW50ZXJydXB0IGNvbW1hbmQgKi8KIGVudW0gaWd1X2ludF9jbWQgewogCUlHVV9JTlRfRU5BQkxFCT0gMCwKQEAgLTc2NCw2ICsxMDM4LDE5IEBACiAJc3RydWN0IHB4cF9wcmV0ZW5kX2NtZAlwcmV0ZW5kOwogfTsKIAorLyogVkYgWm9uZSBBIFBlcm1pc3Npb24gUmVnaXN0ZXIuICovCitzdHJ1Y3QgcHhwX3ZmX3pvbmVfYV9wZXJtaXNzaW9uIHsKKwlfX2xlMzIgY29udHJvbDsKKyNkZWZpbmUgUFhQX1ZGX1pPTkVfQV9QRVJNSVNTSU9OX1ZGSURfTUFTSwkweEZGCisjZGVmaW5lIFBYUF9WRl9aT05FX0FfUEVSTUlTU0lPTl9WRklEX1NISUZUCTAKKyNkZWZpbmUgUFhQX1ZGX1pPTkVfQV9QRVJNSVNTSU9OX1ZBTElEX01BU0sJMHgxCisjZGVmaW5lIFBYUF9WRl9aT05FX0FfUEVSTUlTU0lPTl9WQUxJRF9TSElGVAk4CisjZGVmaW5lIFBYUF9WRl9aT05FX0FfUEVSTUlTU0lPTl9SRVNFUlZFRDBfTUFTSwkweDdGCisjZGVmaW5lIFBYUF9WRl9aT05FX0FfUEVSTUlTU0lPTl9SRVNFUlZFRDBfU0hJRlQgOQorI2RlZmluZSBQWFBfVkZfWk9ORV9BX1BFUk1JU1NJT05fUkVTRVJWRUQxX01BU0sJMHhGRkZGCisjZGVmaW5lIFBYUF9WRl9aT05FX0FfUEVSTUlTU0lPTl9SRVNFUlZFRDFfU0hJRlQgMTYKK307CisKIC8qIFJTUyBoYXNoIHR5cGUgKi8KIHN0cnVjdCByZGlmX3Rhc2tfY29udGV4dCB7CiAJX19sZTMyIGluaXRpYWxfcmVmX3RhZzsKQEAgLTgzMSw2ICsxMTE4LDcgQEAKIAlfX2xlMzIgcmVzZXJ2ZWQyOwogfTsKIAorLyogUlNTIGhhc2ggdHlwZSAqLwogZW51bSByc3NfaGFzaF90eXBlIHsKIAlSU1NfSEFTSF9UWVBFX0RFRkFVTFQJPSAwLAogCVJTU19IQVNIX1RZUEVfSVBWNAk9IDEsCkBAIC05NDIsNyArMTIzMCw3IEBACiB9OwogCiBzdHJ1Y3QgdGltZXJzX2NvbnRleHQgewotCV9fbGUzMiBsb2dpY2FsX2NsaWVudDA7CisJX19sZTMyIGxvZ2ljYWxfY2xpZW50XzA7CiAjZGVmaW5lIFRJTUVSU19DT05URVhUX0VYUElSQVRJT05USU1FTEMwX01BU0sgICAgIDB4RkZGRkZGRgogI2RlZmluZSBUSU1FUlNfQ09OVEVYVF9FWFBJUkFUSU9OVElNRUxDMF9TSElGVCAgICAwCiAjZGVmaW5lIFRJTUVSU19DT05URVhUX1ZBTElETEMwX01BU0sgICAgICAgICAgICAgIDB4MQpAQCAtOTUxLDcgKzEyMzksNyBAQAogI2RlZmluZSBUSU1FUlNfQ09OVEVYVF9BQ1RJVkVMQzBfU0hJRlQgICAgICAgICAgICAyOQogI2RlZmluZSBUSU1FUlNfQ09OVEVYVF9SRVNFUlZFRDBfTUFTSyAgICAgICAgICAgICAweDMKICNkZWZpbmUgVElNRVJTX0NPTlRFWFRfUkVTRVJWRUQwX1NISUZUICAgICAgICAgICAgMzAKLQlfX2xlMzIgbG9naWNhbF9jbGllbnQxOworCV9fbGUzMiBsb2dpY2FsX2NsaWVudF8xOwogI2RlZmluZSBUSU1FUlNfQ09OVEVYVF9FWFBJUkFUSU9OVElNRUxDMV9NQVNLICAgICAweEZGRkZGRkYKICNkZWZpbmUgVElNRVJTX0NPTlRFWFRfRVhQSVJBVElPTlRJTUVMQzFfU0hJRlQgICAgMAogI2RlZmluZSBUSU1FUlNfQ09OVEVYVF9WQUxJRExDMV9NQVNLICAgICAgICAgICAgICAweDEKQEAgLTk2MCw3ICsxMjQ4LDcgQEAKICNkZWZpbmUgVElNRVJTX0NPTlRFWFRfQUNUSVZFTEMxX1NISUZUICAgICAgICAgICAgMjkKICNkZWZpbmUgVElNRVJTX0NPTlRFWFRfUkVTRVJWRUQxX01BU0sgICAgICAgICAgICAgMHgzCiAjZGVmaW5lIFRJTUVSU19DT05URVhUX1JFU0VSVkVEMV9TSElGVCAgICAgICAgICAgIDMwCi0JX19sZTMyIGxvZ2ljYWxfY2xpZW50MjsKKwlfX2xlMzIgbG9naWNhbF9jbGllbnRfMjsKICNkZWZpbmUgVElNRVJTX0NPTlRFWFRfRVhQSVJBVElPTlRJTUVMQzJfTUFTSyAgICAgMHhGRkZGRkZGCiAjZGVmaW5lIFRJTUVSU19DT05URVhUX0VYUElSQVRJT05USU1FTEMyX1NISUZUICAgIDAKICNkZWZpbmUgVElNRVJTX0NPTlRFWFRfVkFMSURMQzJfTUFTSyAgICAgICAgICAgICAgMHgxCkBAIC05NzgsMyArMTI2Niw0IEBACiAjZGVmaW5lIFRJTUVSU19DT05URVhUX1JFU0VSVkVEM19TSElGVCAgICAgICAgICAgIDI5CiB9OwogI2VuZGlmIC8qIF9fQ09NTU9OX0hTSV9fICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWVkL2V0aF9jb21tb24uaCBiL2luY2x1ZGUvbGludXgvcWVkL2V0aF9jb21tb24uaAppbmRleCBiNWViYzY5Li4xYWEwNzI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3FlZC9ldGhfY29tbW9uLmgKKysrIGIvaW5jbHVkZS9saW51eC9xZWQvZXRoX2NvbW1vbi5oCkBAIC0xMyw5ICsxMywxMiBAQAogLyogRVRIIEZXIENPTlNUQU5UUyAqLwogLyoqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBFVEhfSFNJX1ZFUl9NQUpPUiAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEVUSF9IU0lfVkVSX01JTk9SICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgRVRIX0NBQ0hFX0xJTkVfU0laRSAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgRVRIX0hTSV9WRVJfTUlOT1IJMTAKIAorI2RlZmluZSBFVEhfSFNJX1ZFUl9OT19QS1RfTEVOX1RVTk4JNQorCisjZGVmaW5lIEVUSF9DQUNIRV9MSU5FX1NJWkUgICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIEVUSF9SWF9DUUVfR0FQCTMyCiAjZGVmaW5lIEVUSF9NQVhfUkFNUk9EX1BFUl9DT04gICAgICAgICAgICAgICAgICAgICAgICAgIDgKICNkZWZpbmUgRVRIX1RYX0JEX1BBR0VfU0laRV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgNDA5NgogI2RlZmluZSBFVEhfUlhfQkRfUEFHRV9TSVpFX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICA0MDk2CkBAIC0yNCwxNSArMjcsMjUgQEAKIAogI2RlZmluZSBFVEhfVFhfTUlOX0JEU19QRVJfTk9OX0xTT19QS1QgICAgICAgICAgICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgRVRIX1RYX01BWF9CRFNfUEVSX05PTl9MU09fUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAxOAorI2RlZmluZSBFVEhfVFhfTUFYX0JEU19QRVJfTFNPX1BBQ0tFVAkyNTUKICNkZWZpbmUgRVRIX1RYX01BWF9MU09fSERSX05CRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKICNkZWZpbmUgRVRIX1RYX01JTl9CRFNfUEVSX0xTT19QS1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKICNkZWZpbmUgRVRIX1RYX01JTl9CRFNfUEVSX1RVTk5fSVBWNl9XSVRIX0VYVF9QS1QgICAgICAgMwogI2RlZmluZSBFVEhfVFhfTUlOX0JEU19QRVJfSVBWNl9XSVRIX0VYVF9QS1QgICAgICAgICAgICAyCiAjZGVmaW5lIEVUSF9UWF9NSU5fQkRTX1BFUl9QS1RfV19MT09QQkFDS19NT0RFICAgICAgICAgIDIKLSNkZWZpbmUgRVRIX1RYX01BWF9OT05fTFNPX1BLVF9MRU4gICAgICAgICAgICAgICAgICAoOTcwMCAtICg0ICsgMTIgKyA4KSkKKyNkZWZpbmUgRVRIX1RYX01BWF9OT05fTFNPX1BLVF9MRU4JKDk3MDAgLSAoNCArIDQgKyAxMiArIDgpKQogI2RlZmluZSBFVEhfVFhfTUFYX0xTT19IRFJfQllURVMgICAgICAgICAgICAgICAgICAgIDUxMAorI2RlZmluZSBFVEhfVFhfTFNPX1dJTkRPV19CRFNfTlVNCSgxOCAtIDEpCisjZGVmaW5lIEVUSF9UWF9MU09fV0lORE9XX01JTl9MRU4JOTcwMAorI2RlZmluZSBFVEhfVFhfTUFYX0xTT19QQVlMT0FEX0xFTgkweEZFMDAwCisjZGVmaW5lIEVUSF9UWF9OVU1fU0FNRV9BU19MQVNUX0VOVFJJRVMJMzIwCisjZGVmaW5lIEVUSF9UWF9JTkFDVElWRV9TQU1FX0FTX0xBU1QJMHhGRkZGCiAKICNkZWZpbmUgRVRIX05VTV9TVEFUSVNUSUNfQ09VTlRFUlMgICAgICAgICAgICAgICAgICAgICAgTUFYX05VTV9WUE9SVFMKKyNkZWZpbmUgRVRIX05VTV9TVEFUSVNUSUNfQ09VTlRFUlNfRE9VQkxFX1ZGX1pPTkUgXAorCShFVEhfTlVNX1NUQVRJU1RJQ19DT1VOVEVSUyAtIE1BWF9OVU1fVkZTIC8gMikKKyNkZWZpbmUgRVRIX05VTV9TVEFUSVNUSUNfQ09VTlRFUlNfUVVBRF9WRl9aT05FIFwKKwkoRVRIX05VTV9TVEFUSVNUSUNfQ09VTlRFUlMgLSAzICogTUFYX05VTV9WRlMgLyA0KQogCiAvKiBNYXhpbXVtIG51bWJlciBvZiBidWZmZXJzLCB1c2VkIGZvciBSWCBwYWNrZXQgcGxhY2VtZW50ICovCiAjZGVmaW5lIEVUSF9SWF9NQVhfQlVGRl9QRVJfUEtUICAgICAgICAgICAgIDUKQEAgLTU5LDYgKzcyLDggQEAKICNkZWZpbmUgRVRIX1RQQV9DUUVfQ09OVF9MRU5fTElTVF9TSVpFICAgIDYKICNkZWZpbmUgRVRIX1RQQV9DUUVfRU5EX0xFTl9MSVNUX1NJWkUgICAgIDQKIAorLyogQ29udHJvbCBmcmFtZSBjaGVjayBjb25zdGFudHMgKi8KKyNkZWZpbmUgRVRIX0NUTF9GUkFNRV9FVEhfVFlQRV9OVU0JNAogCiBzdHJ1Y3QgZXRoX3R4XzFzdF9iZF9mbGFncyB7CiAJdTggYml0ZmllbGRzOwpAQCAtODIsMTAgKzk3LDEwIEBACiAKIC8qIFRoZSBwYXJzaW5nIGluZm9ybWF0aW9uIGRhdGEgZm8gcnRoZSBmaXJzdCB0eCBiZCBvZiBhIGdpdmVuIHBhY2tldC4gKi8KIHN0cnVjdCBldGhfdHhfZGF0YV8xc3RfYmQgewotCV9fbGUxNgkJCQl2bGFuOwotCXU4CQkJCW5iZHM7Ci0Jc3RydWN0IGV0aF90eF8xc3RfYmRfZmxhZ3MJYmRfZmxhZ3M7Ci0JX19sZTE2CQkJCWJpdGZpZWxkczsKKwlfX2xlMTYgdmxhbjsKKwl1OCBuYmRzOworCXN0cnVjdCBldGhfdHhfMXN0X2JkX2ZsYWdzIGJkX2ZsYWdzOworCV9fbGUxNiBiaXRmaWVsZHM7CiAjZGVmaW5lIEVUSF9UWF9EQVRBXzFTVF9CRF9UVU5OX0ZMQUdfTUFTSyAgMHgxCiAjZGVmaW5lIEVUSF9UWF9EQVRBXzFTVF9CRF9UVU5OX0ZMQUdfU0hJRlQgMAogI2RlZmluZSBFVEhfVFhfREFUQV8xU1RfQkRfUkVTRVJWRUQwX01BU0sgICAgICAgICAgMHgxCkBAIC05Niw3ICsxMTEsNyBAQAogCiAvKiBUaGUgcGFyc2luZyBpbmZvcm1hdGlvbiBkYXRhIGZvciB0aGUgc2Vjb25kIHR4IGJkIG9mIGEgZ2l2ZW4gcGFja2V0LiAqLwogc3RydWN0IGV0aF90eF9kYXRhXzJuZF9iZCB7Ci0JX19sZTE2CXR1bm5faXBfc2l6ZTsKKwlfX2xlMTYgdHVubl9pcF9zaXplOwogCV9fbGUxNgliaXRmaWVsZHMxOwogI2RlZmluZSBFVEhfVFhfREFUQV8yTkRfQkRfVFVOTl9JTk5FUl9MMl9IRFJfU0laRV9XX01BU0sgIDB4RgogI2RlZmluZSBFVEhfVFhfREFUQV8yTkRfQkRfVFVOTl9JTk5FUl9MMl9IRFJfU0laRV9XX1NISUZUIDAKQEAgLTEyNSw5ICsxNDAsMTQgQEAKICNkZWZpbmUgRVRIX1RYX0RBVEFfMk5EX0JEX1JFU0VSVkVEMF9TSElGVCAgICAgICAgICAgICAgICAxMwogfTsKIAorLyogRmlybXdhcmUgZGF0YSBmb3IgTDItRURQTSBwYWNrZXQuICovCitzdHJ1Y3QgZXRoX2VkcG1fZndfZGF0YSB7CisJc3RydWN0IGV0aF90eF9kYXRhXzFzdF9iZCBkYXRhXzFzdF9iZDsKKwlzdHJ1Y3QgZXRoX3R4X2RhdGFfMm5kX2JkIGRhdGFfMm5kX2JkOworCV9fbGUzMiByZXNlcnZlZDsKK307CisKIHN0cnVjdCBldGhfZmFzdF9wYXRoX2NxZV9md19kZWJ1ZyB7Ci0JdTggcmVzZXJ2ZWQwOwotCXU4IHJlc2VydmVkMTsKIAlfX2xlMTYgcmVzZXJ2ZWQyOwogfTsKIApAQCAtMTQ4LDYgKzE2OCwxNyBAQAogI2RlZmluZQlFVEhfVFVOTkVMX1BBUlNJTkdfRkxBR1NfSVBWNF9PUFRJT05TX1NISUZUCTcKIH07CiAKKy8qIFBNRCBmbG93IGNvbnRyb2wgYml0cyAqLworc3RydWN0IGV0aF9wbWRfZmxvd19mbGFncyB7CisJdTggZmxhZ3M7CisjZGVmaW5lIEVUSF9QTURfRkxPV19GTEFHU19WQUxJRF9NQVNLCTB4MQorI2RlZmluZSBFVEhfUE1EX0ZMT1dfRkxBR1NfVkFMSURfU0hJRlQJMAorI2RlZmluZSBFVEhfUE1EX0ZMT1dfRkxBR1NfVE9HR0xFX01BU0sJMHgxCisjZGVmaW5lIEVUSF9QTURfRkxPV19GTEFHU19UT0dHTEVfU0hJRlQJMQorI2RlZmluZSBFVEhfUE1EX0ZMT1dfRkxBR1NfUkVTRVJWRURfTUFTSyAweDNGCisjZGVmaW5lIEVUSF9QTURfRkxPV19GTEFHU19SRVNFUlZFRF9TSElGVCAyCit9OworCiAvKiBSZWd1bGFyIEVUSCBSeCBGUCBDUUUuICovCiBzdHJ1Y3QgZXRoX2Zhc3RfcGF0aF9yeF9yZWdfY3FlIHsKIAl1OCB0eXBlOwpAQCAtMTY2LDY0ICsxOTcsNjMgQEAKIAl1OCBwbGFjZW1lbnRfb2Zmc2V0OwogCXN0cnVjdCBldGhfdHVubmVsX3BhcnNpbmdfZmxhZ3MgdHVubmVsX3BhcnNfZmxhZ3M7CiAJdTggYmRfbnVtOwotCXU4IHJlc2VydmVkWzddOworCXU4IHJlc2VydmVkWzldOwogCXN0cnVjdCBldGhfZmFzdF9wYXRoX2NxZV9md19kZWJ1ZyBmd19kZWJ1ZzsKIAl1OCByZXNlcnZlZDFbM107Ci0JdTggZmxhZ3M7Ci0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfUkVHX0NRRV9WQUxJRF9NQVNLICAgICAgICAgIDB4MQotI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX1JFR19DUUVfVkFMSURfU0hJRlQgICAgICAgICAwCi0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfUkVHX0NRRV9WQUxJRF9UT0dHTEVfTUFTSyAgIDB4MQotI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX1JFR19DUUVfVkFMSURfVE9HR0xFX1NISUZUICAxCi0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfUkVHX0NRRV9SRVNFUlZFRDJfTUFTSyAgICAgIDB4M0YKLSNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9SRUdfQ1FFX1JFU0VSVkVEMl9TSElGVCAgICAgMgorCXN0cnVjdCBldGhfcG1kX2Zsb3dfZmxhZ3MgcG1kX2ZsYWdzOwogfTsKIAogLyogVFBBLWNvbnRpbnVlIEVUSCBSeCBGUCBDUUUuICovCiBzdHJ1Y3QgZXRoX2Zhc3RfcGF0aF9yeF90cGFfY29udF9jcWUgewotCXU4CXR5cGU7Ci0JdTgJdHBhX2FnZ19pbmRleDsKLQlfX2xlMTYJbGVuX2xpc3RbRVRIX1RQQV9DUUVfQ09OVF9MRU5fTElTVF9TSVpFXTsKLQl1OAlyZXNlcnZlZFs1XTsKLQl1OAlyZXNlcnZlZDE7Ci0JX19sZTE2CXJlc2VydmVkMltFVEhfVFBBX0NRRV9DT05UX0xFTl9MSVNUX1NJWkVdOworCXU4IHR5cGU7CisJdTggdHBhX2FnZ19pbmRleDsKKwlfX2xlMTYgbGVuX2xpc3RbRVRIX1RQQV9DUUVfQ09OVF9MRU5fTElTVF9TSVpFXTsKKwl1OCByZXNlcnZlZDsKKwl1OCByZXNlcnZlZDE7CisJX19sZTE2IHJlc2VydmVkMltFVEhfVFBBX0NRRV9DT05UX0xFTl9MSVNUX1NJWkVdOworCXU4IHJlc2VydmVkM1szXTsKKwlzdHJ1Y3QgZXRoX3BtZF9mbG93X2ZsYWdzIHBtZF9mbGFnczsKIH07CiAKIC8qIFRQQS1lbmQgRVRIIFJ4IEZQIENRRS4gKi8KIHN0cnVjdCBldGhfZmFzdF9wYXRoX3J4X3RwYV9lbmRfY3FlIHsKLQl1OAl0eXBlOwotCXU4CXRwYV9hZ2dfaW5kZXg7Ci0JX19sZTE2CXRvdGFsX3BhY2tldF9sZW47Ci0JdTgJbnVtX29mX2JkczsKLQl1OAllbmRfcmVhc29uOwotCV9fbGUxNgludW1fb2ZfY29hbGVzY2VkX3NlZ3M7Ci0JX19sZTMyCXRzX2RlbHRhOwotCV9fbGUxNglsZW5fbGlzdFtFVEhfVFBBX0NRRV9FTkRfTEVOX0xJU1RfU0laRV07Ci0JdTgJcmVzZXJ2ZWQxWzNdOwotCXU4CXJlc2VydmVkMjsKLQlfX2xlMTYJcmVzZXJ2ZWQzW0VUSF9UUEFfQ1FFX0VORF9MRU5fTElTVF9TSVpFXTsKKwl1OCB0eXBlOworCXU4IHRwYV9hZ2dfaW5kZXg7CisJX19sZTE2IHRvdGFsX3BhY2tldF9sZW47CisJdTggbnVtX29mX2JkczsKKwl1OCBlbmRfcmVhc29uOworCV9fbGUxNiBudW1fb2ZfY29hbGVzY2VkX3NlZ3M7CisJX19sZTMyIHRzX2RlbHRhOworCV9fbGUxNiBsZW5fbGlzdFtFVEhfVFBBX0NRRV9FTkRfTEVOX0xJU1RfU0laRV07CisJX19sZTE2IHJlc2VydmVkM1tFVEhfVFBBX0NRRV9FTkRfTEVOX0xJU1RfU0laRV07CisJX19sZTE2IHJlc2VydmVkMTsKKwl1OCByZXNlcnZlZDI7CisJc3RydWN0IGV0aF9wbWRfZmxvd19mbGFncyBwbWRfZmxhZ3M7CiB9OwogCiAvKiBUUEEtc3RhcnQgRVRIIFJ4IEZQIENRRS4gKi8KIHN0cnVjdCBldGhfZmFzdF9wYXRoX3J4X3RwYV9zdGFydF9jcWUgewotCXU4CXR5cGU7Ci0JdTgJYml0ZmllbGRzOworCXU4IHR5cGU7CisJdTggYml0ZmllbGRzOwogI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX1RQQV9TVEFSVF9DUUVfUlNTX0hBU0hfVFlQRV9NQVNLICAweDcKICNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9UUEFfU1RBUlRfQ1FFX1JTU19IQVNIX1RZUEVfU0hJRlQgMAogI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX1RQQV9TVEFSVF9DUUVfVENfTUFTSyAgICAgICAgICAgICAweEYKICNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9UUEFfU1RBUlRfQ1FFX1RDX1NISUZUICAgICAgICAgICAgMwogI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX1RQQV9TVEFSVF9DUUVfUkVTRVJWRUQwX01BU0sgICAgICAweDEKICNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9UUEFfU1RBUlRfQ1FFX1JFU0VSVkVEMF9TSElGVCAgICAgNwotCV9fbGUxNglzZWdfbGVuOworCV9fbGUxNiBzZWdfbGVuOwogCXN0cnVjdCBwYXJzaW5nX2FuZF9lcnJfZmxhZ3MgcGFyc19mbGFnczsKLQlfX2xlMTYJdmxhbl90YWc7Ci0JX19sZTMyCXJzc19oYXNoOwotCV9fbGUxNglsZW5fb25fZmlyc3RfYmQ7Ci0JdTgJcGxhY2VtZW50X29mZnNldDsKKwlfX2xlMTYgdmxhbl90YWc7CisJX19sZTMyIHJzc19oYXNoOworCV9fbGUxNiBsZW5fb25fZmlyc3RfYmQ7CisJdTggcGxhY2VtZW50X29mZnNldDsKIAlzdHJ1Y3QgZXRoX3R1bm5lbF9wYXJzaW5nX2ZsYWdzIHR1bm5lbF9wYXJzX2ZsYWdzOwotCXU4CXRwYV9hZ2dfaW5kZXg7Ci0JdTgJaGVhZGVyX2xlbjsKLQlfX2xlMTYJZXh0X2JkX2xlbl9saXN0W0VUSF9UUEFfQ1FFX1NUQVJUX0xFTl9MSVNUX1NJWkVdOworCXU4IHRwYV9hZ2dfaW5kZXg7CisJdTggaGVhZGVyX2xlbjsKKwlfX2xlMTYgZXh0X2JkX2xlbl9saXN0W0VUSF9UUEFfQ1FFX1NUQVJUX0xFTl9MSVNUX1NJWkVdOwogCXN0cnVjdCBldGhfZmFzdF9wYXRoX2NxZV9md19kZWJ1ZyBmd19kZWJ1ZzsKKwl1OCByZXNlcnZlZDsKKwlzdHJ1Y3QgZXRoX3BtZF9mbG93X2ZsYWdzIHBtZF9mbGFnczsKIH07CiAKIC8qIFRoZSBMNCBwc2V1ZG8gY2hlY2tzdW0gbW9kZSBmb3IgRXRoZXJuZXQgKi8KQEAgLTI0NSwxNSArMjc1LDcgQEAKIAl1OAlyZXNlcnZlZFsyNV07CiAJX19sZTE2CWVjaG87CiAJdTgJcmVzZXJ2ZWQxOwotCXU4CWZsYWdzOwotLyogZm9yIFBNRCBtb2RlIC0gdmFsaWQgaW5kaWNhdGlvbiAqLwotI2RlZmluZSBFVEhfU0xPV19QQVRIX1JYX0NRRV9WQUxJRF9NQVNLICAgICAgICAgMHgxCi0jZGVmaW5lIEVUSF9TTE9XX1BBVEhfUlhfQ1FFX1ZBTElEX1NISUZUICAgICAgICAwCi0vKiBmb3IgUE1EIG1vZGUgLSB2YWxpZCB0b2dnbGUgaW5kaWNhdGlvbiAqLwotI2RlZmluZSBFVEhfU0xPV19QQVRIX1JYX0NRRV9WQUxJRF9UT0dHTEVfTUFTSyAgMHgxCi0jZGVmaW5lIEVUSF9TTE9XX1BBVEhfUlhfQ1FFX1ZBTElEX1RPR0dMRV9TSElGVCAxCi0jZGVmaW5lIEVUSF9TTE9XX1BBVEhfUlhfQ1FFX1JFU0VSVkVEMl9NQVNLICAgICAweDNGCi0jZGVmaW5lIEVUSF9TTE9XX1BBVEhfUlhfQ1FFX1JFU0VSVkVEMl9TSElGVCAgICAyCisJc3RydWN0IGV0aF9wbWRfZmxvd19mbGFncyBwbWRfZmxhZ3M7CiB9OwogCiAvKiB1bmlvbiBmb3IgYWxsIEVUSCBSeCBDUUUgdHlwZXMgKi8KQEAgLTI3Niw2ICsyOTgsMTEgQEAKIAlNQVhfRVRIX1JYX0NRRV9UWVBFCiB9OwogCitzdHJ1Y3QgZXRoX3J4X3BtZF9jcWUgeworCXVuaW9uIGV0aF9yeF9jcWUgY3FlOworCXU4IHJlc2VydmVkW0VUSF9SWF9DUUVfR0FQXTsKK307CisKIGVudW0gZXRoX3J4X3R1bm5fdHlwZSB7CiAJRVRIX1JYX05PX1RVTk4sCiAJRVRIX1JYX1RVTk5fR0VORVZFLApAQCAtMzEzLDggKzM0MCw4IEBACiAKIC8qIFRoZSBwYXJzaW5nIGluZm9ybWF0aW9uIGRhdGEgZm9yIHRoZSB0aGlyZCB0eCBiZCBvZiBhIGdpdmVuIHBhY2tldC4gKi8KIHN0cnVjdCBldGhfdHhfZGF0YV8zcmRfYmQgewotCV9fbGUxNglsc29fbXNzOwotCV9fbGUxNgliaXRmaWVsZHM7CisJX19sZTE2IGxzb19tc3M7CisJX19sZTE2IGJpdGZpZWxkczsKICNkZWZpbmUgRVRIX1RYX0RBVEFfM1JEX0JEX1RDUF9IRFJfTEVOX0RXX01BU0sgIDB4RgogI2RlZmluZSBFVEhfVFhfREFUQV8zUkRfQkRfVENQX0hEUl9MRU5fRFdfU0hJRlQgMAogI2RlZmluZSBFVEhfVFhfREFUQV8zUkRfQkRfSERSX05CRF9NQVNLICAgICAgICAgMHhGCkBAIC0zMjMsOCArMzUwLDggQEAKICNkZWZpbmUgRVRIX1RYX0RBVEFfM1JEX0JEX1NUQVJUX0JEX1NISUZUICAgICAgIDgKICNkZWZpbmUgRVRIX1RYX0RBVEFfM1JEX0JEX1JFU0VSVkVEMF9NQVNLICAgICAgIDB4N0YKICNkZWZpbmUgRVRIX1RYX0RBVEFfM1JEX0JEX1JFU0VSVkVEMF9TSElGVCAgICAgIDkKLQl1OAl0dW5uX2w0X2hkcl9zdGFydF9vZmZzZXRfdzsKLQl1OAl0dW5uX2hkcl9zaXplX3c7CisJdTggdHVubl9sNF9oZHJfc3RhcnRfb2Zmc2V0X3c7CisJdTggdHVubl9oZHJfc2l6ZV93OwogfTsKIAogLyogVGhlIHRoaXJkIHR4IGJkIG9mIGEgZ2l2ZW4gcGFja2V0ICovCkBAIC0zNTUsMTAgKzM4MiwxMCBAQAogfTsKIAogdW5pb24gZXRoX3R4X2JkX3R5cGVzIHsKLQlzdHJ1Y3QgZXRoX3R4XzFzdF9iZAlmaXJzdF9iZDsKLQlzdHJ1Y3QgZXRoX3R4XzJuZF9iZAlzZWNvbmRfYmQ7Ci0Jc3RydWN0IGV0aF90eF8zcmRfYmQJdGhpcmRfYmQ7Ci0Jc3RydWN0IGV0aF90eF9iZAlyZWdfYmQ7CisJc3RydWN0IGV0aF90eF8xc3RfYmQgZmlyc3RfYmQ7CisJc3RydWN0IGV0aF90eF8ybmRfYmQgc2Vjb25kX2JkOworCXN0cnVjdCBldGhfdHhfM3JkX2JkIHRoaXJkX2JkOworCXN0cnVjdCBldGhfdHhfYmQgcmVnX2JkOwogfTsKIAogLyogTXN0b3JtIFF1ZXVlIFpvbmUgKi8KQEAgLTM4OSw4ICs0MTYsOCBAQAogI2RlZmluZSBFVEhfREJfREFUQV9SRVNFUlZFRF9TSElGVCAgICA1CiAjZGVmaW5lIEVUSF9EQl9EQVRBX0FHR19WQUxfU0VMX01BU0sgIDB4MwogI2RlZmluZSBFVEhfREJfREFUQV9BR0dfVkFMX1NFTF9TSElGVCA2Ci0JdTgJYWdnX2ZsYWdzOwotCV9fbGUxNgliZF9wcm9kOworCXU4IGFnZ19mbGFnczsKKwlfX2xlMTYgYmRfcHJvZDsKIH07CiAKICNlbmRpZiAvKiBfX0VUSF9DT01NT05fXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZWQvaXNjc2lfY29tbW9uLmggYi9pbmNsdWRlL2xpbnV4L3FlZC9pc2NzaV9jb21tb24uaAppbmRleCBiM2MwZmViLi44ZjY0YjEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3FlZC9pc2NzaV9jb21tb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L3FlZC9pc2NzaV9jb21tb24uaApAQCAtMzExLDcgKzMxMSw3IEBACiAjZGVmaW5lIElTQ1NJX0xPR0lOX1JFUV9IRFJfREFUQV9TRUdfTEVOX1NISUZUICAwCiAjZGVmaW5lIElTQ1NJX0xPR0lOX1JFUV9IRFJfVE9UQUxfQUhTX0xFTl9NQVNLICAweEZGCiAjZGVmaW5lIElTQ1NJX0xPR0lOX1JFUV9IRFJfVE9UQUxfQUhTX0xFTl9TSElGVCAyNAotCV9fbGUzMiBpc2lkX1RBQkM7CisJX19sZTMyIGlzaWRfdGFiYzsKIAlfX2xlMTYgdHNpaDsKIAlfX2xlMTYgaXNpZF9kOwogCV9fbGUzMiBpdHQ7CkBAIC00NjQsNyArNDY0LDcgQEAKICNkZWZpbmUgSVNDU0lfTE9HSU5fUkVTUE9OU0VfSERSX0RBVEFfU0VHX0xFTl9TSElGVCAgMAogI2RlZmluZSBJU0NTSV9MT0dJTl9SRVNQT05TRV9IRFJfVE9UQUxfQUhTX0xFTl9NQVNLICAweEZGCiAjZGVmaW5lIElTQ1NJX0xPR0lOX1JFU1BPTlNFX0hEUl9UT1RBTF9BSFNfTEVOX1NISUZUIDI0Ci0JX19sZTMyIGlzaWRfVEFCQzsKKwlfX2xlMzIgaXNpZF90YWJjOwogCV9fbGUxNiB0c2loOwogCV9fbGUxNiBpc2lkX2Q7CiAJX19sZTMyIGl0dDsKQEAgLTY4OCw4ICs2ODgsNyBAQAogZW51bSBpc2NzaV9jcWVzX3R5cGUgewogCUlTQ1NJX0NRRV9UWVBFX1NPTElDSVRFRCA9IDEsCiAJSVNDU0lfQ1FFX1RZUEVfVU5TT0xJQ0lURUQsCi0JSVNDU0lfQ1FFX1RZUEVfU09MSUNJVEVEX1dJVEhfU0VOU0UKLQkgICAsCisJSVNDU0lfQ1FFX1RZUEVfU09MSUNJVEVEX1dJVEhfU0VOU0UsCiAJSVNDU0lfQ1FFX1RZUEVfVEFTS19DTEVBTlVQLAogCUlTQ1NJX0NRRV9UWVBFX0RVTU1ZLAogCU1BWF9JU0NTSV9DUUVTX1RZUEUKQEAgLTc2OSw5ICs3NjgsOSBAQAogCUlTQ1NJX0VWRU5UX1RZUEVfVVBEQVRFX0NPTk4sCiAJSVNDU0lfRVZFTlRfVFlQRV9DTEVBUl9TUSwKIAlJU0NTSV9FVkVOVF9UWVBFX1RFUk1JTkFURV9DT05OLAorCUlTQ1NJX0VWRU5UX1RZUEVfTUFDX1VQREFURV9DT05OLAogCUlTQ1NJX0VWRU5UX1RZUEVfQVNZTl9DT05ORUNUX0NPTVBMRVRFLAogCUlTQ1NJX0VWRU5UX1RZUEVfQVNZTl9URVJNSU5BVEVfRE9ORSwKLQlSRVNFUlZFRDgsCiAJUkVTRVJWRUQ5LAogCUlTQ1NJX0VWRU5UX1RZUEVfU1RBUlRfT0ZfRVJST1JfVFlQRVMgPSAxMCwKIAlJU0NTSV9FVkVOVF9UWVBFX0FTWU5fQUJPUlRfUkNWRCwKQEAgLTg2Nyw2ICs4NjYsNyBAQAogCUlTQ1NJX1JBTVJPRF9DTURfSURfVVBEQVRFX0NPTk4gPSA0LAogCUlTQ1NJX1JBTVJPRF9DTURfSURfVEVSTUlOQVRJT05fQ09OTiA9IDUsCiAJSVNDU0lfUkFNUk9EX0NNRF9JRF9DTEVBUl9TUSA9IDYsCisJSVNDU0lfUkFNUk9EX0NNRF9JRF9NQUNfVVBEQVRFID0gNywKIAlNQVhfSVNDU0lfUkFNUk9EX0NNRF9JRAogfTsKIApAQCAtODgzLDYgKzg4MywxNiBAQAogCV9fbGUxNiByMnRfc247CiB9OwogCitzdHJ1Y3QgaXNjc2lfc3BlX2Nvbm5fbWFjX3VwZGF0ZSB7CisJc3RydWN0IGlzY3NpX3Nsb3dfcGF0aF9oZHIgaGRyOworCV9fbGUxNiBjb25uX2lkOworCV9fbGUzMiBmd19jaWQ7CisJX19sZTE2IHJlbW90ZV9tYWNfYWRkcl9sbzsKKwlfX2xlMTYgcmVtb3RlX21hY19hZGRyX21pZDsKKwlfX2xlMTYgcmVtb3RlX21hY19hZGRyX2hpOworCXU4IHJlc2VydmVkMFsyXTsKK307CisKIHN0cnVjdCBpc2NzaV9zcGVfY29ubl9vZmZsb2FkIHsKIAlzdHJ1Y3QgaXNjc2lfc2xvd19wYXRoX2hkciBoZHI7CiAJX19sZTE2IGNvbm5faWQ7CkBAIC0xMzAyLDE0ICsxMzEyLDYgQEAKIAlzdHJ1Y3QgcmVncGFpciBpc2NzaV9yeF9kcm9wcGVkX3BkdXNfdGFza19ub3RfdmFsaWQ7CiB9OwogCi1zdHJ1Y3Qgb29vX29wYXF1ZSB7Ci0JX19sZTMyIGNpZDsKLQl1OCBkcm9wX2lzbGU7Ci0JdTggZHJvcF9zaXplOwotCXU4IG9vb19vcGNvZGU7Ci0JdTggb29vX2lzbGU7Ci19OwotCiBzdHJ1Y3QgcHN0b3JtX2lzY3NpX3N0YXRzX2RydiB7CiAJc3RydWN0IHJlZ3BhaXIgaXNjc2lfdHhfYnl0ZXNfY250OwogCXN0cnVjdCByZWdwYWlyIGlzY3NpX3R4X3BhY2tldF9jbnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3FlZC9xZWRfY2hhaW4uaCBiL2luY2x1ZGUvbGludXgvcWVkL3FlZF9jaGFpbi5oCmluZGV4IDdlNDQxYmQuLjcyZDg4Y2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcWVkL3FlZF9jaGFpbi5oCisrKyBiL2luY2x1ZGUvbGludXgvcWVkL3FlZF9jaGFpbi5oCkBAIC0xNiwxOSArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9xZWQvY29tbW9uX2hzaS5oPgogCi0vKiBkbWFfYWRkcl90IG1hbmlwICovCi0jZGVmaW5lIERNQV9MT19MRSh4KSAgICAgICAgICAgIGNwdV90b19sZTMyKGxvd2VyXzMyX2JpdHMoeCkpCi0jZGVmaW5lIERNQV9ISV9MRSh4KSAgICAgICAgICAgIGNwdV90b19sZTMyKHVwcGVyXzMyX2JpdHMoeCkpCi0jZGVmaW5lIERNQV9SRUdQQUlSX0xFKHgsIHZhbCkgIGRvIHsgXAotCQkJCQkoeCkuaGkgPSBETUFfSElfTEUoKHZhbCkpOyBcCi0JCQkJCSh4KS5sbyA9IERNQV9MT19MRSgodmFsKSk7IFwKLQkJCQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIEhJTE9fR0VOKGhpLCBsbywgdHlwZSkgICgoKCh0eXBlKShoaSkpIDw8IDMyKSArIChsbykpCi0jZGVmaW5lIEhJTE9fNjQoaGksIGxvKSBISUxPX0dFTigobGUzMl90b19jcHUoaGkpKSwgKGxlMzJfdG9fY3B1KGxvKSksIHU2NCkKLSNkZWZpbmUgSElMT182NF9SRUdQQUlSKHJlZ3BhaXIpICAgICAgICAoSElMT182NChyZWdwYWlyLmhpLCByZWdwYWlyLmxvKSkKLSNkZWZpbmUgSElMT19ETUFfUkVHUEFJUihyZWdwYWlyKQkoKGRtYV9hZGRyX3QpSElMT182NF9SRUdQQUlSKHJlZ3BhaXIpKQotCiBlbnVtIHFlZF9jaGFpbl9tb2RlIHsKIAkvKiBFYWNoIFBhZ2UgY29udGFpbnMgYSBuZXh0IHBvaW50ZXIgYXQgaXRzIGVuZCAqLwogCVFFRF9DSEFJTl9NT0RFX05FWFRfUFRSLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZWQvcWVkX2V0aF9pZi5oIGIvaW5jbHVkZS9saW51eC9xZWQvcWVkX2V0aF9pZi5oCmluZGV4IDQ0NzVhOWQuLjMzYzI0ZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcWVkL3FlZF9ldGhfaWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3FlZC9xZWRfZXRoX2lmLmgKQEAgLTIzLDYgKzIzLDkgQEAKIAogCXU4CXBvcnRfbWFjW0VUSF9BTEVOXTsKIAl1OAludW1fdmxhbl9maWx0ZXJzOworCisJLyogTGVnYWN5IFZGIC0gdGhpcyBhZmZlY3RzIHRoZSBkYXRhcGF0aCwgc28gcWVkZSBoYXMgdG8ga25vdyAqLworCWJvb2wgaXNfbGVnYWN5OwogfTsKIAogc3RydWN0IHFlZF91cGRhdGVfdnBvcnRfcnNzX3BhcmFtcyB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3FlZC9xZWRfaWYuaCBiL2luY2x1ZGUvbGludXgvcWVkL3FlZF9pZi5oCmluZGV4IGIxZTNjNTcuLmY5YWU5MDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcWVkL3FlZF9pZi5oCisrKyBiL2luY2x1ZGUvbGludXgvcWVkL3FlZF9pZi5oCkBAIC0zNCw2ICszNCw4IEBACiAJRENCWF9NQVhfUFJPVE9DT0xfVFlQRQogfTsKIAorI2RlZmluZSBRRURfUk9DRV9QUk9UT0NPTF9JTkRFWCAoMykKKwogI2lmZGVmIENPTkZJR19EQ0IKICNkZWZpbmUgUUVEX0xMRFBfQ0hBU1NJU19JRF9TVEFUX0xFTiA0CiAjZGVmaW5lIFFFRF9MTERQX1BPUlRfSURfU1RBVF9MRU4gNApAQCAtNzAsOCArNzIsMTYgQEAKIAl1OCBtYXhfdGM7CiB9OwogCitlbnVtIHFlZF9kY2J4X3NmX2llZWVfdHlwZSB7CisJUUVEX0RDQlhfU0ZfSUVFRV9FVEhUWVBFLAorCVFFRF9EQ0JYX1NGX0lFRUVfVENQX1BPUlQsCisJUUVEX0RDQlhfU0ZfSUVFRV9VRFBfUE9SVCwKKwlRRURfRENCWF9TRl9JRUVFX1RDUF9VRFBfUE9SVAorfTsKKwogc3RydWN0IHFlZF9hcHBfZW50cnkgewogCWJvb2wgZXRodHlwZTsKKwllbnVtIHFlZF9kY2J4X3NmX2llZWVfdHlwZSBzZl9pZWVlOwogCWJvb2wgZW5hYmxlZDsKIAl1OCBwcmlvOwogCXUxNiBwcm90b19pZDsKQEAgLTI1MiwxNSArMjYyLDE1IEBACiAJLyogTUZXIHZlcnNpb24gKi8KIAl1MzIJCW1md19yZXY7CiAKLQlib29sIHJkbWFfc3VwcG9ydGVkOwotCiAJdTMyCQlmbGFzaF9zaXplOwogCXU4CQltZl9tb2RlOwogCWJvb2wJCXR4X3N3aXRjaGluZzsKKwlib29sCQlyZG1hX3N1cHBvcnRlZDsKIH07CiAKIGVudW0gcWVkX3NiX3R5cGUgewogCVFFRF9TQl9UWVBFX0wyX1FVRVVFLAorCVFFRF9TQl9UWVBFX0NOUSwKIH07CiAKIGVudW0gcWVkX3Byb3RvY29sIHsKQEAgLTI2OCw2ICsyNzgsMjEgQEAKIAlRRURfUFJPVE9DT0xfSVNDU0ksCiB9OwogCitlbnVtIHFlZF9saW5rX21vZGVfYml0cyB7CisJUUVEX0xNX0ZJQlJFX0JJVCA9IEJJVCgwKSwKKwlRRURfTE1fQXV0b25lZ19CSVQgPSBCSVQoMSksCisJUUVEX0xNX0FzeW1fUGF1c2VfQklUID0gQklUKDIpLAorCVFFRF9MTV9QYXVzZV9CSVQgPSBCSVQoMyksCisJUUVEX0xNXzEwMDBiYXNlVF9IYWxmX0JJVCA9IEJJVCg0KSwKKwlRRURfTE1fMTAwMGJhc2VUX0Z1bGxfQklUID0gQklUKDUpLAorCVFFRF9MTV8xMDAwMGJhc2VLUl9GdWxsX0JJVCA9IEJJVCg2KSwKKwlRRURfTE1fMjUwMDBiYXNlS1JfRnVsbF9CSVQgPSBCSVQoNyksCisJUUVEX0xNXzQwMDAwYmFzZUxSNF9GdWxsX0JJVCA9IEJJVCg4KSwKKwlRRURfTE1fNTAwMDBiYXNlS1IyX0Z1bGxfQklUID0gQklUKDkpLAorCVFFRF9MTV8xMDAwMDBiYXNlS1I0X0Z1bGxfQklUID0gQklUKDEwKSwKKwlRRURfTE1fQ09VTlQgPSAxMQorfTsKKwogc3RydWN0IHFlZF9saW5rX3BhcmFtcyB7CiAJYm9vbAlsaW5rX3VwOwogCkBAIC0yOTUsOSArMzIwLDExIEBACiBzdHJ1Y3QgcWVkX2xpbmtfb3V0cHV0IHsKIAlib29sCWxpbmtfdXA7CiAKLQl1MzIJc3VwcG9ydGVkX2NhcHM7ICAgICAgICAgLyogSW4gU1VQUE9SVEVEIGRlZnMgKi8KLQl1MzIJYWR2ZXJ0aXNlZF9jYXBzOyAgICAgICAgLyogSW4gQURWRVJUSVNFRCBkZWZzICovCi0JdTMyCWxwX2NhcHM7ICAgICAgICAgICAgICAgIC8qIEluIEFEVkVSVElTRUQgZGVmcyAqLworCS8qIEluIFFFRF9MTV8qIGRlZnMgKi8KKwl1MzIJc3VwcG9ydGVkX2NhcHM7CisJdTMyCWFkdmVydGlzZWRfY2FwczsKKwl1MzIJbHBfY2FwczsKKwogCXUzMglzcGVlZDsgICAgICAgICAgICAgICAgICAvKiBJbiBNYi9zICovCiAJdTgJZHVwbGV4OyAgICAgICAgICAgICAgICAgLyogSW4gRFVQTEVYIGRlZnMgKi8KIAl1OAlwb3J0OyAgICAgICAgICAgICAgICAgICAvKiBJbiBQT1JUIGRlZnMgKi8KQEAgLTQzMCw2ICs0NTcsMTAgQEAKIAl2b2lkCQkoKnNpbWRfaGFuZGxlcl9jbGVhbikoc3RydWN0IHFlZF9kZXYgKmNkZXYsCiAJCQkJCSAgICAgIGludCBpbmRleCk7CiAKKwlpbnQgKCpkYmdfYWxsX2RhdGEpIChzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyKTsKKworCWludCAoKmRiZ19hbGxfZGF0YV9zaXplKSAoc3RydWN0IHFlZF9kZXYgKmNkZXYpOworCiAvKioKICAqIEBicmllZiBjYW5fbGlua19jaGFuZ2UgLSBjYW4gdGhlIGluc3RhbmNlIGNoYW5nZSB0aGUgbGluayBvciBub3QKICAqCkBAIC01OTgsOCArNjI5LDkgQEAKIAlRRURfTVNHX1NQCT0gMHgxMDAwMDAsCiAJUUVEX01TR19TVE9SQUdFID0gMHgyMDAwMDAsCiAJUUVEX01TR19DWFQJPSAweDgwMDAwMCwKKwlRRURfTVNHX0xMMgk9IDB4MTAwMDAwMCwKIAlRRURfTVNHX0lMVAk9IDB4MjAwMDAwMCwKLQlRRURfTVNHX1JPQ0UJPSAweDQwMDAwMDAsCisJUUVEX01TR19SRE1BCT0gMHg0MDAwMDAwLAogCVFFRF9NU0dfREVCVUcJPSAweDgwMDAwMDAsCiAJLyogdG8gYmUgYWRkZWQuLi51cCB0byAweDgwMDAwMDAgKi8KIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3FlZC9xZWRfbGwyX2lmLmggYi9pbmNsdWRlL2xpbnV4L3FlZC9xZWRfbGwyX2lmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3NWMyNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcWVkL3FlZF9sbDJfaWYuaApAQCAtMCwwICsxLDEzOSBAQAorLyogUUxvZ2ljIHFlZCBOSUMgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFFMb2dpYyBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKKyAqIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2lmbmRlZiBfUUVEX0xMMl9JRl9ICisjZGVmaW5lIF9RRURfTEwyX0lGX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9xZWQvcWVkX2lmLmg+CisKK3N0cnVjdCBxZWRfbGwyX3N0YXRzIHsKKwl1NjQgZ3NpX2ludmFsaWRfaGRyOworCXU2NCBnc2lfaW52YWxpZF9wa3RfbGVuZ3RoOworCXU2NCBnc2lfdW5zdXBwb3J0ZWRfcGt0X3R5cDsKKwl1NjQgZ3NpX2NyY2Noa3NtX2Vycm9yOworCisJdTY0IHBhY2tldF90b29fYmlnX2Rpc2NhcmQ7CisJdTY0IG5vX2J1ZmZfZGlzY2FyZDsKKworCXU2NCByY3ZfdWNhc3RfYnl0ZXM7CisJdTY0IHJjdl9tY2FzdF9ieXRlczsKKwl1NjQgcmN2X2JjYXN0X2J5dGVzOworCXU2NCByY3ZfdWNhc3RfcGt0czsKKwl1NjQgcmN2X21jYXN0X3BrdHM7CisJdTY0IHJjdl9iY2FzdF9wa3RzOworCisJdTY0IHNlbnRfdWNhc3RfYnl0ZXM7CisJdTY0IHNlbnRfbWNhc3RfYnl0ZXM7CisJdTY0IHNlbnRfYmNhc3RfYnl0ZXM7CisJdTY0IHNlbnRfdWNhc3RfcGt0czsKKwl1NjQgc2VudF9tY2FzdF9wa3RzOworCXU2NCBzZW50X2JjYXN0X3BrdHM7Cit9OworCisjZGVmaW5lIFFFRF9MTDJfVU5VU0VEX0hBTkRMRSAgICgweGZmKQorCitzdHJ1Y3QgcWVkX2xsMl9jYl9vcHMgeworCWludCAoKnJ4X2NiKSh2b2lkICosIHN0cnVjdCBza19idWZmICosIHUzMiwgdTMyKTsKKwlpbnQgKCp0eF9jYikodm9pZCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKK307CisKK3N0cnVjdCBxZWRfbGwyX3BhcmFtcyB7CisJdTE2IG10dTsKKwlib29sIGRyb3BfdHRsMF9wYWNrZXRzOworCWJvb2wgcnhfdmxhbl9zdHJpcHBpbmc7CisJdTggdHhfdGM7CisJYm9vbCBmcmFnc19tYXBwZWQ7CisJdTggbGwyX21hY19hZGRyZXNzW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCBxZWRfbGwyX29wcyB7CisvKioKKyAqIEBicmllZiBzdGFydCAtIGluaXRpYWxpemVzIGxsMgorICoKKyAqIEBwYXJhbSBjZGV2CisgKiBAcGFyYW0gcGFyYW1zIC0gcHJvdG9jb2wgZHJpdmVyIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBsbDIuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciB2YWx1ZS4KKyAqLworCWludCAoKnN0YXJ0KShzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IHFlZF9sbDJfcGFyYW1zICpwYXJhbXMpOworCisvKioKKyAqIEBicmllZiBzdG9wIC0gc3RvcHMgdGhlIGxsMgorICoKKyAqIEBwYXJhbSBjZGV2CisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciB2YWx1ZS4KKyAqLworCWludCAoKnN0b3ApKHN0cnVjdCBxZWRfZGV2ICpjZGV2KTsKKworLyoqCisgKiBAYnJpZWYgc3RhcnRfeG1pdCAtIHRyYW5zbWl0cyBhbiBza2Igb3ZlciB0aGUgbGwyIGludGVyZmFjZQorICoKKyAqIEBwYXJhbSBjZGV2CisgKiBAcGFyYW0gc2tiCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciB2YWx1ZS4KKyAqLworCWludCAoKnN0YXJ0X3htaXQpKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworLyoqCisgKiBAYnJpZWYgcmVnaXN0ZXJfY2Jfb3BzIC0gcHJvdG9jb2wgZHJpdmVyIHJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmb3IgUngvVHgKKyAqIHBhY2tldHMuIFNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGBzdGFydCcuCisgKgorICogQHBhcmFtIGNkZXYKKyAqIEBwYXJhbSBjb29raWUgLSB0byBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucy4KKyAqIEBwYXJhbSBvcHMgLSB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIHRvIHJlZ2lzdGVyIGZvciBSeCAvIFR4LgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgdmFsdWUuCisgKi8KKwl2b2lkICgqcmVnaXN0ZXJfY2Jfb3BzKShzdHJ1Y3QgcWVkX2RldiAqY2RldiwKKwkJCQljb25zdCBzdHJ1Y3QgcWVkX2xsMl9jYl9vcHMgKm9wcywKKwkJCQl2b2lkICpjb29raWUpOworCisvKioKKyAqIEBicmllZiBnZXQgTEwyIHJlbGF0ZWQgc3RhdGlzdGljcworICoKKyAqIEBwYXJhbSBjZGV2CisgKiBAcGFyYW0gc3RhdHMgLSBwb2ludGVyIHRvIHN0cnVjdCB0aGF0IHdvdWxkIGJlIGZpbGxlZCB3aXRoIHN0YXRzCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG90aGVyd2lzZS4KKyAqLworCWludCAoKmdldF9zdGF0cykoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHN0cnVjdCBxZWRfbGwyX3N0YXRzICpzdGF0cyk7Cit9OworCisjaWZkZWYgQ09ORklHX1FFRF9MTDIKK2ludCBxZWRfbGwyX2FsbG9jX2lmKHN0cnVjdCBxZWRfZGV2ICopOwordm9pZCBxZWRfbGwyX2RlYWxsb2NfaWYoc3RydWN0IHFlZF9kZXYgKik7CisjZWxzZQorc3RhdGljIGNvbnN0IHN0cnVjdCBxZWRfbGwyX29wcyBxZWRfbGwyX29wc19wYXNzID0geworCS5zdGFydCA9IE5VTEwsCisJLnN0b3AgPSBOVUxMLAorCS5zdGFydF94bWl0ID0gTlVMTCwKKwkucmVnaXN0ZXJfY2Jfb3BzID0gTlVMTCwKKwkuZ2V0X3N0YXRzID0gTlVMTCwKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHFlZF9sbDJfYWxsb2NfaWYoc3RydWN0IHFlZF9kZXYgKmNkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZWRfbGwyX2RlYWxsb2NfaWYoc3RydWN0IHFlZF9kZXYgKmNkZXYpCit7Cit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZWQvcWVkX3JvY2VfaWYuaCBiL2luY2x1ZGUvbGludXgvcWVkL3FlZF9yb2NlX2lmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwNDdkMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcWVkL3FlZF9yb2NlX2lmLmgKQEAgLTAsMCArMSw2MDQgQEAKKy8qIFFMb2dpYyBxZWQgTklDIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgIFFMb2dpYyBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9RRURfUk9DRV9JRl9ICisjZGVmaW5lIF9RRURfUk9DRV9JRl9ICisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9xZWQvcWVkX2lmLmg+CisjaW5jbHVkZSA8bGludXgvcWVkL3FlZF9sbDJfaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9xZWQvcmRtYV9jb21tb24uaD4KKworZW51bSBxZWRfcm9jZV9sbDJfdHhfZGVzdCB7CisJLyogTGlnaHQgTDIgVFggRGVzdGluYXRpb24gdG8gdGhlIE5ldHdvcmsgKi8KKwlRRURfUk9DRV9MTDJfVFhfREVTVF9OVywKKworCS8qIExpZ2h0IEwyIFRYIERlc3RpbmF0aW9uIHRvIHRoZSBMb29wYmFjayAqLworCVFFRF9ST0NFX0xMMl9UWF9ERVNUX0xCLAorCVFFRF9ST0NFX0xMMl9UWF9ERVNUX01BWAorfTsKKworI2RlZmluZSBRRURfUkRNQV9NQVhfQ05RX1NJWkUgICAgICAgICAgICAgICAoMHhGRkZGKQorCisvKiByZG1hIGludGVyZmFjZSAqLworCitlbnVtIHFlZF9yb2NlX3FwX3N0YXRlIHsKKwlRRURfUk9DRV9RUF9TVEFURV9SRVNFVCwKKwlRRURfUk9DRV9RUF9TVEFURV9JTklULAorCVFFRF9ST0NFX1FQX1NUQVRFX1JUUiwKKwlRRURfUk9DRV9RUF9TVEFURV9SVFMsCisJUUVEX1JPQ0VfUVBfU1RBVEVfU1FELAorCVFFRF9ST0NFX1FQX1NUQVRFX0VSUiwKKwlRRURfUk9DRV9RUF9TVEFURV9TUUUKK307CisKK2VudW0gcWVkX3JkbWFfdGlkX3R5cGUgeworCVFFRF9SRE1BX1RJRF9SRUdJU1RFUkVEX01SLAorCVFFRF9SRE1BX1RJRF9GTVIsCisJUUVEX1JETUFfVElEX01XX1RZUEUxLAorCVFFRF9SRE1BX1RJRF9NV19UWVBFMkEKK307CisKK3N0cnVjdCBxZWRfcmRtYV9ldmVudHMgeworCXZvaWQgKmNvbnRleHQ7CisJdm9pZCAoKmFmZmlsaWF0ZWRfZXZlbnQpKHZvaWQgKmNvbnRleHQsIHU4IGZ3X2V2ZW50X2NvZGUsCisJCQkJIHZvaWQgKmZ3X2hhbmRsZSk7CisJdm9pZCAoKnVuYWZmaWxpYXRlZF9ldmVudCkodm9pZCAqY29udGV4dCwgdTggZXZlbnRfY29kZSk7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfZGV2aWNlIHsKKwl1MzIgdmVuZG9yX2lkOworCXUzMiB2ZW5kb3JfcGFydF9pZDsKKwl1MzIgaHdfdmVyOworCXU2NCBmd192ZXI7CisKKwl1NjQgbm9kZV9ndWlkOworCXU2NCBzeXNfaW1hZ2VfZ3VpZDsKKworCXU4IG1heF9jbnE7CisJdTggbWF4X3NnZTsKKwl1OCBtYXhfc3JxX3NnZTsKKwl1MTYgbWF4X2lubGluZTsKKwl1MzIgbWF4X3dxZTsKKwl1MzIgbWF4X3NycV93cWU7CisJdTggbWF4X3FwX3Jlc3BfcmRfYXRvbWljX3Jlc2M7CisJdTggbWF4X3FwX3JlcV9yZF9hdG9taWNfcmVzYzsKKwl1NjQgbWF4X2Rldl9yZXNwX3JkX2F0b21pY19yZXNjOworCXUzMiBtYXhfY3E7CisJdTMyIG1heF9xcDsKKwl1MzIgbWF4X3NycTsKKwl1MzIgbWF4X21yOworCXU2NCBtYXhfbXJfc2l6ZTsKKwl1MzIgbWF4X2NxZTsKKwl1MzIgbWF4X213OworCXUzMiBtYXhfZm1yOworCXUzMiBtYXhfbXJfbXdfZm1yX3BibDsKKwl1NjQgbWF4X21yX213X2Ztcl9zaXplOworCXUzMiBtYXhfcGQ7CisJdTMyIG1heF9haDsKKwl1OCBtYXhfcGtleTsKKwl1MTYgbWF4X3NycV93cjsKKwl1OCBtYXhfc3RhdHNfcXVldWVzOworCXUzMiBkZXZfY2FwczsKKworCS8qIEFiaWx0eSB0byBzdXBwb3J0IFJOUi1OQUsgZ2VuZXJhdGlvbiAqLworCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfUk5SX05BS19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfUk5SX05BS19TSElGVCAgICAgICAgICAgICAgICAgIDAKKwkvKiBBYmlsdHkgdG8gc3VwcG9ydCBzaHV0ZG93biBwb3J0ICovCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfU0hVVERPV05fUE9SVF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfU0hVVERPV05fUE9SVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMQorCS8qIEFiaWx0eSB0byBzdXBwb3J0IHBvcnQgYWN0aXZlIGV2ZW50ICovCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfUE9SVF9BQ1RJVkVfRVZFTlRfTUFTSyAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX1BPUlRfQUNUSVZFX0VWRU5UX1NISUZUICAgICAgICAgICAgICAgIDIKKwkvKiBBYmlsdHkgdG8gc3VwcG9ydCBwb3J0IGNoYW5nZSBldmVudCAqLworI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX1BPUlRfQ0hBTkdFX0VWRU5UX01BU0sgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9QT1JUX0NIQU5HRV9FVkVOVF9TSElGVCAgICAgICAgICAgICAgICAzCisJLyogQWJpbHR5IHRvIHN1cHBvcnQgc3lzdGVtIGltYWdlIEdVSUQgKi8KKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9TWVNfSU1BR0VfTUFTSyAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfU1lTX0lNQUdFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNAorCS8qIEFiaWx0eSB0byBzdXBwb3J0IGJhZCBQX0tleSBjb3VudGVyIHN1cHBvcnQgKi8KKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9CQURfUEtFWV9DTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9CQURfUEtFWV9DTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICA1CisJLyogQWJpbHR5IHRvIHN1cHBvcnQgYXRvbWljIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9BVE9NSUNfT1BfTUFTSyAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfQVRPTUlDX09QX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX1JFU0laRV9DUV9NQVNLICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9SRVNJWkVfQ1FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA3CisJLyogQWJpbHR5IHRvIHN1cHBvcnQgbW9kaWZ5aW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZgorCSAqIG91dHN0YW5kaW5nIHdvcmsgcmVxdWVzdHMgcGVyIFFQCisJICovCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfUkVTSVpFX01BWF9XUl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfUkVTSVpFX01BWF9XUl9TSElGVCAgICAgICAgICAgICAgICAgICAgOAorCS8qIEFiaWx0eSB0byBzdXBwb3J0IGF1dG9tYXRpYyBwYXRoIG1pZ3JhdGlvbiAqLworI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX0FVVE9fUEFUSF9NSUdfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX0FVVE9fUEFUSF9NSUdfU0hJRlQgICAgICAgICAgICAgICAgICAgIDkKKwkvKiBBYmlsdHkgdG8gc3VwcG9ydCB0aGUgYmFzZSBtZW1vcnkgbWFuYWdlbWVudCBleHRlbnNpb25zICovCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfQkFTRV9NRU1PUllfRVhUX01BU0sgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfQkFTRV9NRU1PUllfRVhUX1NISUZUICAgICAgICAgIDEwCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfQkFTRV9RVUVVRV9FWFRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfQkFTRV9RVUVVRV9FWFRfU0hJRlQgICAgICAgICAgICAgICAgICAgMTEKKwkvKiBBYmlsdHkgdG8gc3VwcG9ydCBtdWx0aXBpbGUgcGFnZSBzaXplcyBwZXIgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX01VTFRJX1BBR0VfUEVSX01SX0VYVF9NQVNLICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX01VTFRJX1BBR0VfUEVSX01SX0VYVF9TSElGVCAgICAgICAgICAgIDEyCisJLyogQWJpbHR5IHRvIHN1cHBvcnQgYmxvY2sgbGlzdCBwaHlzaWNhbCBidWZmZXIgbGlzdCAqLworI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX0JMT0NLX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX0JMT0NLX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEzCisJLyogQWJpbHR5IHRvIHN1cHBvcnQgemVybyBiYXNlZCB2aXJ0dWFsIGFkZHJlc3NlcyAqLworI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX1pCVkFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX1pCVkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisJLyogQWJpbHR5IHRvIHN1cHBvcnQgbG9jYWwgaW52YWxpZGF0ZSBmZW5jaW5nICovCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfTE9DQUxfSU5WX0ZFTkNFX01BU0sgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfTE9DQUxfSU5WX0ZFTkNFX1NISUZUICAgICAgICAgIDE1CisJLyogQWJpbHR5IHRvIHN1cHBvcnQgTG9vcGJhY2sgb24gUVAgKi8KKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9MQl9JTkRJQ0FUT1JfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9MQl9JTkRJQ0FUT1JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNgorCXU2NCBwYWdlX3NpemVfY2FwczsKKwl1OCBkZXZfYWNrX2RlbGF5OworCXUzMiByZXNlcnZlZF9sa2V5OworCXUzMiBiYWRfcGtleV9jb3VudGVyOworCXN0cnVjdCBxZWRfcmRtYV9ldmVudHMgZXZlbnRzOworfTsKKworZW51bSBxZWRfcG9ydF9zdGF0ZSB7CisJUUVEX1JETUFfUE9SVF9VUCwKKwlRRURfUkRNQV9QT1JUX0RPV04sCit9OworCitlbnVtIHFlZF9yb2NlX2NhcGFiaWxpdHkgeworCVFFRF9ST0NFX1YxID0gMSA8PCAwLAorCVFFRF9ST0NFX1YyID0gMSA8PCAxLAorfTsKKworc3RydWN0IHFlZF9yZG1hX3BvcnQgeworCWVudW0gcWVkX3BvcnRfc3RhdGUgcG9ydF9zdGF0ZTsKKwlpbnQgbGlua19zcGVlZDsKKwl1NjQgbWF4X21zZ19zaXplOworCXU4IHNvdXJjZV9naWRfdGFibGVfbGVuOworCXZvaWQgKnNvdXJjZV9naWRfdGFibGVfcHRyOworCXU4IHBrZXlfdGFibGVfbGVuOworCXZvaWQgKnBrZXlfdGFibGVfcHRyOworCXUzMiBwa2V5X2JhZF9jb3VudGVyOworCWVudW0gcWVkX3JvY2VfY2FwYWJpbGl0eSBjYXBhYmlsaXR5OworfTsKKworc3RydWN0IHFlZF9yZG1hX2NucV9wYXJhbXMgeworCXU4IG51bV9wYmxfcGFnZXM7CisJdTY0IHBibF9wdHI7Cit9OworCisvKiBUaGUgQ1EgTW9kZSBhZmZlY3RzIHRoZSBDUSBkb29yYmVsbCB0cmFuc2FjdGlvbiBzaXplLgorICogNjQvMzIgYml0IG1hY2hpbmVzIHNob3VsZCBjb25maWd1cmUgdG8gMzIvMTYgYml0cyByZXNwZWN0aXZlbHkuCisgKi8KK2VudW0gcWVkX3JkbWFfY3FfbW9kZSB7CisJUUVEX1JETUFfQ1FfTU9ERV8xNl9CSVRTLAorCVFFRF9SRE1BX0NRX01PREVfMzJfQklUUywKK307CisKK3N0cnVjdCBxZWRfcm9jZV9kY3Fjbl9wYXJhbXMgeworCXU4IG5vdGlmaWNhdGlvbl9wb2ludDsKKwl1OCByZWFjdGlvbl9wb2ludDsKKworCS8qIGZpZWxkcyBmb3Igbm90aWZpY2F0aW9uIHBvaW50ICovCisJdTMyIGNucF9zZW5kX3RpbWVvdXQ7CisKKwkvKiBmaWVsZHMgZm9yIHJlYWN0aW9uIHBvaW50ICovCisJdTMyIHJsX2JjX3JhdGU7CisJdTE2IHJsX21heF9yYXRlOworCXUxNiBybF9yX2FpOworCXUxNiBybF9yX2hhaTsKKwl1MTYgZGNxY25fZzsKKwl1MzIgZGNxY25fa191czsKKwl1MzIgZGNxY25fdGltZW91dF91czsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9zdGFydF9pbl9wYXJhbXMgeworCXN0cnVjdCBxZWRfcmRtYV9ldmVudHMgKmV2ZW50czsKKwlzdHJ1Y3QgcWVkX3JkbWFfY25xX3BhcmFtcyBjbnFfcGJsX2xpc3RbMTI4XTsKKwl1OCBkZXNpcmVkX2NucTsKKwllbnVtIHFlZF9yZG1hX2NxX21vZGUgY3FfbW9kZTsKKwlzdHJ1Y3QgcWVkX3JvY2VfZGNxY25fcGFyYW1zIGRjcWNuX3BhcmFtczsKKwl1MTYgbWF4X210dTsKKwl1OCBtYWNfYWRkcltFVEhfQUxFTl07CisJdTggaXdhcnBfZmxhZ3M7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfYWRkX3VzZXJfb3V0X3BhcmFtcyB7CisJdTE2IGRwaTsKKwl1NjQgZHBpX2FkZHI7CisJdTY0IGRwaV9waHlzX2FkZHI7CisJdTMyIGRwaV9zaXplOworfTsKKworZW51bSByb2NlX21vZGUgeworCVJPQ0VfVjEsCisJUk9DRV9WMl9JUFY0LAorCVJPQ0VfVjJfSVBWNiwKKwlNQVhfUk9DRV9NT0RFCit9OworCit1bmlvbiBxZWRfZ2lkIHsKKwl1OCBieXRlc1sxNl07CisJdTE2IHdvcmRzWzhdOworCXUzMiBkd29yZHNbNF07CisJdTY0IHF3b3Jkc1syXTsKKwl1MzIgaXB2NF9hZGRyOworfTsKKworc3RydWN0IHFlZF9yZG1hX3JlZ2lzdGVyX3RpZF9pbl9wYXJhbXMgeworCXUzMiBpdGlkOworCWVudW0gcWVkX3JkbWFfdGlkX3R5cGUgdGlkX3R5cGU7CisJdTgga2V5OworCXUxNiBwZDsKKwlib29sIGxvY2FsX3JlYWQ7CisJYm9vbCBsb2NhbF93cml0ZTsKKwlib29sIHJlbW90ZV9yZWFkOworCWJvb2wgcmVtb3RlX3dyaXRlOworCWJvb2wgcmVtb3RlX2F0b21pYzsKKwlib29sIG13X2JpbmQ7CisJdTY0IHBibF9wdHI7CisJYm9vbCBwYmxfdHdvX2xldmVsOworCXU4IHBibF9wYWdlX3NpemVfbG9nOworCXU4IHBhZ2Vfc2l6ZV9sb2c7CisJdTMyIGZibzsKKwl1NjQgbGVuZ3RoOworCXU2NCB2YWRkcjsKKwlib29sIHpidmE7CisJYm9vbCBwaHlfbXI7CisJYm9vbCBkbWFfbXI7CisKKwlib29sIGRpZl9lbmFibGVkOworCXU2NCBkaWZfZXJyb3JfYWRkcjsKKwl1NjQgZGlmX3J1bnRfYWRkcjsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9jcmVhdGVfY3FfaW5fcGFyYW1zIHsKKwl1MzIgY3FfaGFuZGxlX2xvOworCXUzMiBjcV9oYW5kbGVfaGk7CisJdTMyIGNxX3NpemU7CisJdTE2IGRwaTsKKwlib29sIHBibF90d29fbGV2ZWw7CisJdTY0IHBibF9wdHI7CisJdTE2IHBibF9udW1fcGFnZXM7CisJdTggcGJsX3BhZ2Vfc2l6ZV9sb2c7CisJdTggY25xX2lkOworCXUxNiBpbnRfdGltZW91dDsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9jcmVhdGVfc3JxX2luX3BhcmFtcyB7CisJdTY0IHBibF9iYXNlX2FkZHI7CisJdTY0IHByb2RfcGFpcl9hZGRyOworCXUxNiBudW1fcGFnZXM7CisJdTE2IHBkX2lkOworCXUxNiBwYWdlX3NpemU7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfZGVzdHJveV9jcV9pbl9wYXJhbXMgeworCXUxNiBpY2lkOworfTsKKworc3RydWN0IHFlZF9yZG1hX2Rlc3Ryb3lfY3Ffb3V0X3BhcmFtcyB7CisJdTE2IG51bV9jcV9ub3RpZjsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9jcmVhdGVfcXBfaW5fcGFyYW1zIHsKKwl1MzIgcXBfaGFuZGxlX2xvOworCXUzMiBxcF9oYW5kbGVfaGk7CisJdTMyIHFwX2hhbmRsZV9hc3luY19sbzsKKwl1MzIgcXBfaGFuZGxlX2FzeW5jX2hpOworCWJvb2wgdXNlX3NycTsKKwlib29sIHNpZ25hbF9hbGw7CisJYm9vbCBmbXJfYW5kX3Jlc2VydmVkX2xrZXk7CisJdTE2IHBkOworCXUxNiBkcGk7CisJdTE2IHNxX2NxX2lkOworCXUxNiBzcV9udW1fcGFnZXM7CisJdTY0IHNxX3BibF9wdHI7CisJdTggbWF4X3NxX3NnZXM7CisJdTE2IHJxX2NxX2lkOworCXUxNiBycV9udW1fcGFnZXM7CisJdTY0IHJxX3BibF9wdHI7CisJdTE2IHNycV9pZDsKKwl1OCBzdGF0c19xdWV1ZTsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9jcmVhdGVfcXBfb3V0X3BhcmFtcyB7CisJdTMyIHFwX2lkOworCXUxNiBpY2lkOworCXZvaWQgKnJxX3BibF92aXJ0OworCWRtYV9hZGRyX3QgcnFfcGJsX3BoeXM7CisJdm9pZCAqc3FfcGJsX3ZpcnQ7CisJZG1hX2FkZHJfdCBzcV9wYmxfcGh5czsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9tb2RpZnlfcXBfaW5fcGFyYW1zIHsKKwl1MzIgbW9kaWZ5X2ZsYWdzOworI2RlZmluZSBRRURfUkRNQV9NT0RJRllfUVBfVkFMSURfTkVXX1NUQVRFX01BU0sgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfTU9ESUZZX1FQX1ZBTElEX05FV19TVEFURV9TSElGVCAgICAgICAgICAgICAgMAorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfUEtFWV9NQVNLICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1BLRVlfU0hJRlQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBRRURfUkRNQV9NT0RJRllfUVBfVkFMSURfUkRNQV9PUFNfRU5fTUFTSyAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfTU9ESUZZX1FQX1ZBTElEX1JETUFfT1BTX0VOX1NISUZUICAgICAgICAgICAgMgorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfREVTVF9RUF9NQVNLICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX0RFU1RfUVBfU0hJRlQgICAgICAgICAgICAgICAgMworI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfQUREUkVTU19WRUNUT1JfTUFTSyAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX0FERFJFU1NfVkVDVE9SX1NISUZUICAgICAgICAgNAorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfUlFfUFNOX01BU0sgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1JRX1BTTl9TSElGVCAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfU1FfUFNOX01BU0sgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1NRX1BTTl9TSElGVCAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBRRURfUkRNQV9NT0RJRllfUVBfVkFMSURfTUFYX1JEX0FUT01JQ19SRVFfTUFTSyAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfTU9ESUZZX1FQX1ZBTElEX01BWF9SRF9BVE9NSUNfUkVRX1NISUZUICAgICAgNworI2RlZmluZSBRRURfUkRNQV9NT0RJRllfUVBfVkFMSURfTUFYX1JEX0FUT01JQ19SRVNQX01BU0sgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfTU9ESUZZX1FQX1ZBTElEX01BWF9SRF9BVE9NSUNfUkVTUF9TSElGVCAgICAgOAorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfQUNLX1RJTUVPVVRfTUFTSyAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX0FDS19USU1FT1VUX1NISUZUICAgICAgICAgICAgOQorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfUkVUUllfQ05UX01BU0sgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1JFVFJZX0NOVF9TSElGVCAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1JOUl9SRVRSWV9DTlRfTUFTSyAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9STlJfUkVUUllfQ05UX1NISUZUICAgICAgICAgIDExCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9NSU5fUk5SX05BS19USU1FUl9NQVNLICAgICAgIDB4MQorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfTUlOX1JOUl9OQUtfVElNRVJfU0hJRlQgICAgICAxMgorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfRTJFX0ZMT1dfQ09OVFJPTF9FTl9NQVNLICAgICAweDEKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX0UyRV9GTE9XX0NPTlRST0xfRU5fU0hJRlQgICAgMTMKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1JPQ0VfTU9ERV9NQVNLICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9ST0NFX01PREVfU0hJRlQgICAgICAgICAgICAgIDE0CisKKwllbnVtIHFlZF9yb2NlX3FwX3N0YXRlIG5ld19zdGF0ZTsKKwl1MTYgcGtleTsKKwlib29sIGluY29taW5nX3JkbWFfcmVhZF9lbjsKKwlib29sIGluY29taW5nX3JkbWFfd3JpdGVfZW47CisJYm9vbCBpbmNvbWluZ19hdG9taWNfZW47CisJYm9vbCBlMmVfZmxvd19jb250cm9sX2VuOworCXUzMiBkZXN0X3FwOworCWJvb2wgbGJfaW5kaWNhdGlvbjsKKwl1MTYgbXR1OworCXU4IHRyYWZmaWNfY2xhc3NfdG9zOworCXU4IGhvcF9saW1pdF90dGw7CisJdTMyIGZsb3dfbGFiZWw7CisJdW5pb24gcWVkX2dpZCBzZ2lkOworCXVuaW9uIHFlZF9naWQgZGdpZDsKKwl1MTYgdWRwX3NyY19wb3J0OworCisJdTE2IHZsYW5faWQ7CisKKwl1MzIgcnFfcHNuOworCXUzMiBzcV9wc247CisJdTggbWF4X3JkX2F0b21pY19yZXNwOworCXU4IG1heF9yZF9hdG9taWNfcmVxOworCXUzMiBhY2tfdGltZW91dDsKKwl1OCByZXRyeV9jbnQ7CisJdTggcm5yX3JldHJ5X2NudDsKKwl1OCBtaW5fcm5yX25ha190aW1lcjsKKwlib29sIHNxZF9hc3luYzsKKwl1OCByZW1vdGVfbWFjX2FkZHJbNl07CisJdTggbG9jYWxfbWFjX2FkZHJbNl07CisJYm9vbCB1c2VfbG9jYWxfbWFjOworCWVudW0gcm9jZV9tb2RlIHJvY2VfbW9kZTsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9xdWVyeV9xcF9vdXRfcGFyYW1zIHsKKwllbnVtIHFlZF9yb2NlX3FwX3N0YXRlIHN0YXRlOworCXUzMiBycV9wc247CisJdTMyIHNxX3BzbjsKKwlib29sIGRyYWluaW5nOworCXUxNiBtdHU7CisJdTMyIGRlc3RfcXA7CisJYm9vbCBpbmNvbWluZ19yZG1hX3JlYWRfZW47CisJYm9vbCBpbmNvbWluZ19yZG1hX3dyaXRlX2VuOworCWJvb2wgaW5jb21pbmdfYXRvbWljX2VuOworCWJvb2wgZTJlX2Zsb3dfY29udHJvbF9lbjsKKwl1bmlvbiBxZWRfZ2lkIHNnaWQ7CisJdW5pb24gcWVkX2dpZCBkZ2lkOworCXUzMiBmbG93X2xhYmVsOworCXU4IGhvcF9saW1pdF90dGw7CisJdTggdHJhZmZpY19jbGFzc190b3M7CisJdTMyIHRpbWVvdXQ7CisJdTggcm5yX3JldHJ5OworCXU4IHJldHJ5X2NudDsKKwl1OCBtaW5fcm5yX25ha190aW1lcjsKKwl1MTYgcGtleV9pbmRleDsKKwl1OCBtYXhfcmRfYXRvbWljOworCXU4IG1heF9kZXN0X3JkX2F0b21pYzsKKwlib29sIHNxZF9hc3luYzsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9jcmVhdGVfc3JxX291dF9wYXJhbXMgeworCXUxNiBzcnFfaWQ7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfZGVzdHJveV9zcnFfaW5fcGFyYW1zIHsKKwl1MTYgc3JxX2lkOworfTsKKworc3RydWN0IHFlZF9yZG1hX21vZGlmeV9zcnFfaW5fcGFyYW1zIHsKKwl1MzIgd3FlX2xpbWl0OworCXUxNiBzcnFfaWQ7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfc3RhdHNfb3V0X3BhcmFtcyB7CisJdTY0IHNlbnRfYnl0ZXM7CisJdTY0IHNlbnRfcGt0czsKKwl1NjQgcmN2X2J5dGVzOworCXU2NCByY3ZfcGt0czsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9jb3VudGVyc19vdXRfcGFyYW1zIHsKKwl1NjQgcGRfY291bnQ7CisJdTY0IG1heF9wZDsKKwl1NjQgZHBpX2NvdW50OworCXU2NCBtYXhfZHBpOworCXU2NCBjcV9jb3VudDsKKwl1NjQgbWF4X2NxOworCXU2NCBxcF9jb3VudDsKKwl1NjQgbWF4X3FwOworCXU2NCB0aWRfY291bnQ7CisJdTY0IG1heF90aWQ7Cit9OworCisjZGVmaW5lIFFFRF9ST0NFX1RYX0hFQURfRkFJTFVSRSAgICAgICAgKDEpCisjZGVmaW5lIFFFRF9ST0NFX1RYX0ZSQUdfRkFJTFVSRSAgICAgICAgKDIpCisKK3N0cnVjdCBxZWRfcm9jZV9sbDJfaGVhZGVyIHsKKwl2b2lkICp2YWRkcjsKKwlkbWFfYWRkcl90IGJhZGRyOworCXNpemVfdCBsZW47Cit9OworCitzdHJ1Y3QgcWVkX3JvY2VfbGwyX2J1ZmZlciB7CisJZG1hX2FkZHJfdCBiYWRkcjsKKwlzaXplX3QgbGVuOworfTsKKworc3RydWN0IHFlZF9yb2NlX2xsMl9wYWNrZXQgeworCXN0cnVjdCBxZWRfcm9jZV9sbDJfaGVhZGVyIGhlYWRlcjsKKwlpbnQgbl9zZWc7CisJc3RydWN0IHFlZF9yb2NlX2xsMl9idWZmZXIgcGF5bG9hZFtSRE1BX01BWF9TR0VfUEVSX1NRX1dRRV07CisJaW50IHJvY2VfbW9kZTsKKwllbnVtIHFlZF9yb2NlX2xsMl90eF9kZXN0IHR4X2Rlc3Q7Cit9OworCitzdHJ1Y3QgcWVkX3JvY2VfbGwyX3R4X3BhcmFtcyB7CisJaW50IHJlc2VydmVkOworfTsKKworc3RydWN0IHFlZF9yb2NlX2xsMl9yeF9wYXJhbXMgeworCXUxNiB2bGFuX2lkOworCXU4IHNtYWNbRVRIX0FMRU5dOworCWludCByYzsKK307CisKK3N0cnVjdCBxZWRfcm9jZV9sbDJfY2JzIHsKKwl2b2lkICgqdHhfY2IpKHZvaWQgKnBkZXYsIHN0cnVjdCBxZWRfcm9jZV9sbDJfcGFja2V0ICpwa3QpOworCisJdm9pZCAoKnJ4X2NiKSh2b2lkICpwZGV2LCBzdHJ1Y3QgcWVkX3JvY2VfbGwyX3BhY2tldCAqcGt0LAorCQkgICAgICBzdHJ1Y3QgcWVkX3JvY2VfbGwyX3J4X3BhcmFtcyAqcGFyYW1zKTsKK307CisKK3N0cnVjdCBxZWRfcm9jZV9sbDJfcGFyYW1zIHsKKwl1MTYgbWF4X3J4X2J1ZmZlcnM7CisJdTE2IG1heF90eF9idWZmZXJzOworCXUxNiBtdHU7CisJdTggbWFjX2FkZHJlc3NbRVRIX0FMRU5dOworCXN0cnVjdCBxZWRfcm9jZV9sbDJfY2JzIGNiczsKKwl2b2lkICpjYl9jb29raWU7Cit9OworCitzdHJ1Y3QgcWVkX3JvY2VfbGwyX2luZm8geworCXU4IGhhbmRsZTsKKwlzdHJ1Y3QgcWVkX3JvY2VfbGwyX2NicyBjYnM7CisJdTggbWFjX2FkZHJlc3NbRVRIX0FMRU5dOworCXZvaWQgKmNiX2Nvb2tpZTsKKworCS8qIExvY2sgdG8gcHJvdGVjdCBsbDIgKi8KKwlzdHJ1Y3QgbXV0ZXggbG9jazsKK307CisKK2VudW0gcWVkX3JkbWFfdHlwZSB7CisJUUVEX1JETUFfVFlQRV9ST0NFLAorfTsKKworc3RydWN0IHFlZF9kZXZfcmRtYV9pbmZvIHsKKwlzdHJ1Y3QgcWVkX2Rldl9pbmZvIGNvbW1vbjsKKwllbnVtIHFlZF9yZG1hX3R5cGUgcmRtYV90eXBlOworfTsKKworc3RydWN0IHFlZF9yZG1hX29wcyB7CisJY29uc3Qgc3RydWN0IHFlZF9jb21tb25fb3BzICpjb21tb247CisKKwlpbnQgKCpmaWxsX2Rldl9pbmZvKShzdHJ1Y3QgcWVkX2RldiAqY2RldiwKKwkJCSAgICAgc3RydWN0IHFlZF9kZXZfcmRtYV9pbmZvICppbmZvKTsKKwl2b2lkICooKnJkbWFfZ2V0X3JkbWFfY3R4KShzdHJ1Y3QgcWVkX2RldiAqY2Rldik7CisKKwlpbnQgKCpyZG1hX2luaXQpKHN0cnVjdCBxZWRfZGV2ICpkZXYsCisJCQkgc3RydWN0IHFlZF9yZG1hX3N0YXJ0X2luX3BhcmFtcyAqaXBhcmFtcyk7CisKKwlpbnQgKCpyZG1hX2FkZF91c2VyKSh2b2lkICpyZG1hX2N4dCwKKwkJCSAgICAgc3RydWN0IHFlZF9yZG1hX2FkZF91c2VyX291dF9wYXJhbXMgKm9wYXJhbXMpOworCisJdm9pZCAoKnJkbWFfcmVtb3ZlX3VzZXIpKHZvaWQgKnJkbWFfY3h0LCB1MTYgZHBpKTsKKwlpbnQgKCpyZG1hX3N0b3ApKHZvaWQgKnJkbWFfY3h0KTsKKwlzdHJ1Y3QgcWVkX3JkbWFfZGV2aWNlKiAoKnJkbWFfcXVlcnlfZGV2aWNlKSh2b2lkICpyZG1hX2N4dCk7CisJc3RydWN0IHFlZF9yZG1hX3BvcnQqICgqcmRtYV9xdWVyeV9wb3J0KSh2b2lkICpyZG1hX2N4dCk7CisJaW50ICgqcmRtYV9nZXRfc3RhcnRfc2IpKHN0cnVjdCBxZWRfZGV2ICpjZGV2KTsKKwlpbnQgKCpyZG1hX2dldF9taW5fY25xX21zaXgpKHN0cnVjdCBxZWRfZGV2ICpjZGV2KTsKKwl2b2lkICgqcmRtYV9jbnFfcHJvZF91cGRhdGUpKHZvaWQgKnJkbWFfY3h0LCB1OCBjbnFfaW5kZXgsIHUxNiBwcm9kKTsKKwlpbnQgKCpyZG1hX2dldF9yZG1hX2ludCkoc3RydWN0IHFlZF9kZXYgKmNkZXYsCisJCQkJIHN0cnVjdCBxZWRfaW50X2luZm8gKmluZm8pOworCWludCAoKnJkbWFfc2V0X3JkbWFfaW50KShzdHJ1Y3QgcWVkX2RldiAqY2RldiwgdTE2IGNudCk7CisJaW50ICgqcmRtYV9hbGxvY19wZCkodm9pZCAqcmRtYV9jeHQsIHUxNiAqcGQpOworCXZvaWQgKCpyZG1hX2RlYWxsb2NfcGQpKHZvaWQgKnJkbWFfY3h0LCB1MTYgcGQpOworCWludCAoKnJkbWFfY3JlYXRlX2NxKSh2b2lkICpyZG1hX2N4dCwKKwkJCSAgICAgIHN0cnVjdCBxZWRfcmRtYV9jcmVhdGVfY3FfaW5fcGFyYW1zICpwYXJhbXMsCisJCQkgICAgICB1MTYgKmljaWQpOworCWludCAoKnJkbWFfZGVzdHJveV9jcSkodm9pZCAqcmRtYV9jeHQsCisJCQkgICAgICAgc3RydWN0IHFlZF9yZG1hX2Rlc3Ryb3lfY3FfaW5fcGFyYW1zICppcGFyYW1zLAorCQkJICAgICAgIHN0cnVjdCBxZWRfcmRtYV9kZXN0cm95X2NxX291dF9wYXJhbXMgKm9wYXJhbXMpOworCXN0cnVjdCBxZWRfcmRtYV9xcCAqCisJKCpyZG1hX2NyZWF0ZV9xcCkodm9pZCAqcmRtYV9jeHQsCisJCQkgIHN0cnVjdCBxZWRfcmRtYV9jcmVhdGVfcXBfaW5fcGFyYW1zICppcGFyYW1zLAorCQkJICBzdHJ1Y3QgcWVkX3JkbWFfY3JlYXRlX3FwX291dF9wYXJhbXMgKm9wYXJhbXMpOworCisJaW50ICgqcmRtYV9tb2RpZnlfcXApKHZvaWQgKnJvY2VfY3h0LCBzdHJ1Y3QgcWVkX3JkbWFfcXAgKnFwLAorCQkJICAgICAgc3RydWN0IHFlZF9yZG1hX21vZGlmeV9xcF9pbl9wYXJhbXMgKmlwYXJhbXMpOworCisJaW50ICgqcmRtYV9xdWVyeV9xcCkodm9pZCAqcmRtYV9jeHQsIHN0cnVjdCBxZWRfcmRtYV9xcCAqcXAsCisJCQkgICAgIHN0cnVjdCBxZWRfcmRtYV9xdWVyeV9xcF9vdXRfcGFyYW1zICpvcGFyYW1zKTsKKwlpbnQgKCpyZG1hX2Rlc3Ryb3lfcXApKHZvaWQgKnJkbWFfY3h0LCBzdHJ1Y3QgcWVkX3JkbWFfcXAgKnFwKTsKKwlpbnQKKwkoKnJkbWFfcmVnaXN0ZXJfdGlkKSh2b2lkICpyZG1hX2N4dCwKKwkJCSAgICAgc3RydWN0IHFlZF9yZG1hX3JlZ2lzdGVyX3RpZF9pbl9wYXJhbXMgKmlwYXJhbXMpOworCWludCAoKnJkbWFfZGVyZWdpc3Rlcl90aWQpKHZvaWQgKnJkbWFfY3h0LCB1MzIgaXRpZCk7CisJaW50ICgqcmRtYV9hbGxvY190aWQpKHZvaWQgKnJkbWFfY3h0LCB1MzIgKml0aWQpOworCXZvaWQgKCpyZG1hX2ZyZWVfdGlkKSh2b2lkICpyZG1hX2N4dCwgdTMyIGl0aWQpOworCWludCAoKnJvY2VfbGwyX3N0YXJ0KShzdHJ1Y3QgcWVkX2RldiAqY2RldiwKKwkJCSAgICAgIHN0cnVjdCBxZWRfcm9jZV9sbDJfcGFyYW1zICpwYXJhbXMpOworCWludCAoKnJvY2VfbGwyX3N0b3ApKHN0cnVjdCBxZWRfZGV2ICpjZGV2KTsKKwlpbnQgKCpyb2NlX2xsMl90eCkoc3RydWN0IHFlZF9kZXYgKmNkZXYsCisJCQkgICBzdHJ1Y3QgcWVkX3JvY2VfbGwyX3BhY2tldCAqcGFja2V0LAorCQkJICAgc3RydWN0IHFlZF9yb2NlX2xsMl90eF9wYXJhbXMgKnBhcmFtcyk7CisJaW50ICgqcm9jZV9sbDJfcG9zdF9yeF9idWZmZXIpKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgcWVkX3JvY2VfbGwyX2J1ZmZlciAqYnVmLAorCQkJCSAgICAgICB1NjQgY29va2llLCB1OCBub3RpZnlfZncpOworCWludCAoKnJvY2VfbGwyX3NldF9tYWNfZmlsdGVyKShzdHJ1Y3QgcWVkX2RldiAqY2RldiwKKwkJCQkgICAgICAgdTggKm9sZF9tYWNfYWRkcmVzcywKKwkJCQkgICAgICAgdTggKm5ld19tYWNfYWRkcmVzcyk7CisJaW50ICgqcm9jZV9sbDJfc3RhdHMpKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJICAgICAgc3RydWN0IHFlZF9sbDJfc3RhdHMgKnN0YXRzKTsKK307CisKK2NvbnN0IHN0cnVjdCBxZWRfcmRtYV9vcHMgKnFlZF9nZXRfcmRtYV9vcHModm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZWQvcWVkZV9yb2NlLmggYi9pbmNsdWRlL2xpbnV4L3FlZC9xZWRlX3JvY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWZiZTZkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9xZWQvcWVkZV9yb2NlLmgKQEAgLTAsMCArMSw4OCBAQAorLyogUUxvZ2ljIHFlZHIgTklDIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgIFFMb2dpYyBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisjaWZuZGVmIFFFREVfUk9DRV9ICisjZGVmaW5lIFFFREVfUk9DRV9ICisKK3N0cnVjdCBxZWRyX2RldjsKK3N0cnVjdCBxZWRfZGV2Oworc3RydWN0IHFlZGVfZGV2OworCitlbnVtIHFlZGVfcm9jZV9ldmVudCB7CisJUUVERV9VUCwKKwlRRURFX0RPV04sCisJUUVERV9DSEFOR0VfQUREUiwKKwlRRURFX0NMT1NFCit9OworCitzdHJ1Y3QgcWVkZV9yb2NlX2V2ZW50X3dvcmsgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwl2b2lkICpwdHI7CisJZW51bSBxZWRlX3JvY2VfZXZlbnQgZXZlbnQ7Cit9OworCitzdHJ1Y3QgcWVkcl9kcml2ZXIgeworCXVuc2lnbmVkIGNoYXIgbmFtZVszMl07CisKKwlzdHJ1Y3QgcWVkcl9kZXYqICgqYWRkKShzdHJ1Y3QgcWVkX2RldiAqLCBzdHJ1Y3QgcGNpX2RldiAqLAorCQkJCXN0cnVjdCBuZXRfZGV2aWNlICopOworCisJdm9pZCAoKnJlbW92ZSkoc3RydWN0IHFlZHJfZGV2ICopOworCXZvaWQgKCpub3RpZnkpKHN0cnVjdCBxZWRyX2RldiAqLCBlbnVtIHFlZGVfcm9jZV9ldmVudCk7Cit9OworCisvKiBBUElzIGZvciBSb0NFIGRyaXZlciB0byByZWdpc3RlciBjYWxsYmFjayBoYW5kbGVycywKKyAqIHdoaWNoIHdpbGwgYmUgaW52b2tlZCB3aGVuIGRldmljZSBpcyBhZGRlZCwgcmVtb3ZlZCwgaWZ1cCwgaWZkb3duCisgKi8KK2ludCBxZWRlX3JvY2VfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBxZWRyX2RyaXZlciAqZHJ2KTsKK3ZvaWQgcWVkZV9yb2NlX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBxZWRyX2RyaXZlciAqZHJ2KTsKKworYm9vbCBxZWRlX3JvY2Vfc3VwcG9ydGVkKHN0cnVjdCBxZWRlX2RldiAqZGV2KTsKKworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lORklOSUJBTkRfUUVEUikKK2ludCBxZWRlX3JvY2VfZGV2X2FkZChzdHJ1Y3QgcWVkZV9kZXYgKmRldik7Cit2b2lkIHFlZGVfcm9jZV9kZXZfZXZlbnRfb3BlbihzdHJ1Y3QgcWVkZV9kZXYgKmRldik7Cit2b2lkIHFlZGVfcm9jZV9kZXZfZXZlbnRfY2xvc2Uoc3RydWN0IHFlZGVfZGV2ICpkZXYpOwordm9pZCBxZWRlX3JvY2VfZGV2X3JlbW92ZShzdHJ1Y3QgcWVkZV9kZXYgKmRldik7Cit2b2lkIHFlZGVfcm9jZV9ldmVudF9jaGFuZ2VhZGRyKHN0cnVjdCBxZWRlX2RldiAqcWVkcik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgcWVkZV9yb2NlX2Rldl9hZGQoc3RydWN0IHFlZGVfZGV2ICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZWRlX3JvY2VfZGV2X2V2ZW50X29wZW4oc3RydWN0IHFlZGVfZGV2ICpkZXYpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgcWVkZV9yb2NlX2Rldl9ldmVudF9jbG9zZShzdHJ1Y3QgcWVkZV9kZXYgKmRldikge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBxZWRlX3JvY2VfZGV2X3JlbW92ZShzdHJ1Y3QgcWVkZV9kZXYgKmRldikge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBxZWRlX3JvY2VfZXZlbnRfY2hhbmdlYWRkcihzdHJ1Y3QgcWVkZV9kZXYgKnFlZHIpIHt9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZWQvcmRtYV9jb21tb24uaCBiL2luY2x1ZGUvbGludXgvcWVkL3JkbWFfY29tbW9uLmgKaW5kZXggMTg3OTkxYy4uNzY2MzcyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xZWQvcmRtYV9jb21tb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L3FlZC9yZG1hX2NvbW1vbi5oCkBAIC0yOCw2ICsyOCw3IEBACiAjZGVmaW5lIFJETUFfTUFYX1BEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNjQgKiAxMDI0KQogCiAjZGVmaW5lIFJETUFfTlVNX1NUQVRJU1RJQ19DT1VOVEVSUyAgICAgICAgICAgICAgICAgICAgIE1BWF9OVU1fVlBPUlRTCisjZGVmaW5lIFJETUFfTlVNX1NUQVRJU1RJQ19DT1VOVEVSU19CQgkJCU1BWF9OVU1fVlBPUlRTX0JCCiAKICNkZWZpbmUgUkRNQV9UQVNLX1RZUEUgKFBST1RPQ09MSURfUk9DRSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZWQvdGNwX2NvbW1vbi5oIGIvaW5jbHVkZS9saW51eC9xZWQvdGNwX2NvbW1vbi5oCmluZGV4IGFjY2JhMGUuLmRjMzg4OWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcWVkL3RjcF9jb21tb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L3FlZC90Y3BfY29tbW9uLmgKQEAgLTExLDYgKzExLDE0IEBACiAKICNkZWZpbmUgVENQX0lOVkFMSURfVElNRU9VVF9WQUwgLTEKIAorc3RydWN0IG9vb19vcGFxdWUgeworCV9fbGUzMiBjaWQ7CisJdTggZHJvcF9pc2xlOworCXU4IGRyb3Bfc2l6ZTsKKwl1OCBvb29fb3Bjb2RlOworCXU4IG9vb19pc2xlOworfTsKKwogZW51bSB0Y3BfY29ubmVjdF9tb2RlIHsKIAlUQ1BfQ09OTkVDVF9BQ1RJVkUsCiAJVENQX0NPTk5FQ1RfUEFTU0lWRSwKQEAgLTE4LDE0ICsyNiwxMCBAQAogfTsKIAogc3RydWN0IHRjcF9pbml0X3BhcmFtcyB7Ci0JX19sZTMyIG1heF9jd25kOwotCV9fbGUxNiBkdXBfYWNrX3RocmVzaG9sZDsKKwlfX2xlMzIgdHdvX21zbF90aW1lcjsKIAlfX2xlMTYgdHhfc3dzX3RpbWVyOwotCV9fbGUxNiBtaW5fcnRvOwotCV9fbGUxNiBtaW5fcnRvX3J0OwotCV9fbGUxNiBtYXhfcnRvOwogCXU4IG1heGZpbnJ0OwotCXU4IHJlc2VydmVkWzFdOworCXU4IHJlc2VydmVkWzldOwogfTsKIAogZW51bSB0Y3BfaXBfdmVyc2lvbiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhZGl4LXRyZWUuaCBiL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCmluZGV4IDRjNDUxMDUuLjUyYjk3ZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCkBAIC0yODAsOSArMjgwLDkgQEAKIAkJCSAgICAgIHN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUpOwogdm9pZCAqcmFkaXhfdHJlZV9kZWxldGVfaXRlbShzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICosIHVuc2lnbmVkIGxvbmcsIHZvaWQgKik7CiB2b2lkICpyYWRpeF90cmVlX2RlbGV0ZShzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICosIHVuc2lnbmVkIGxvbmcpOwotc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqcmFkaXhfdHJlZV9yZXBsYWNlX2NsZWFyX3RhZ3MoCi0JCQkJc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKLQkJCQl1bnNpZ25lZCBsb25nIGluZGV4LCB2b2lkICplbnRyeSk7Cit2b2lkIHJhZGl4X3RyZWVfY2xlYXJfdGFncyhzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAorCQkJICAgc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSwKKwkJCSAgIHZvaWQgKipzbG90KTsKIHVuc2lnbmVkIGludCByYWRpeF90cmVlX2dhbmdfbG9va3VwKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCiAJCQl2b2lkICoqcmVzdWx0cywgdW5zaWduZWQgbG9uZyBmaXJzdF9pbmRleCwKIAkJCXVuc2lnbmVkIGludCBtYXhfaXRlbXMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL3BxLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvcHEuaAppbmRleCBhMDExOGQ1Li4zOTVhNGM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvcHEuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvcHEuaApAQCAtMTAzLDYgKzEwMyw3IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2F2eDJ4MjsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfYXZ4Mng0OwogZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl90aWxlZ3g4OworZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9zMzkwdng4OwogCiBzdHJ1Y3QgcmFpZDZfcmVjb3ZfY2FsbHMgewogCXZvaWQgKCpkYXRhMikoaW50LCBzaXplX3QsIGludCwgaW50LCB2b2lkICoqKTsKQEAgLTExNSw2ICsxMTYsNyBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9yZWNvdl9jYWxscyByYWlkNl9yZWNvdl9pbnR4MTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfcmVjb3ZfY2FsbHMgcmFpZDZfcmVjb3Zfc3NzZTM7CiBleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X3JlY292X2NhbGxzIHJhaWQ2X3JlY292X2F2eDI7CitleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X3JlY292X2NhbGxzIHJhaWQ2X3JlY292X3MzOTB4YzsKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9uZW9ueDE7CiBleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X25lb254MjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmN1X3N5bmMuaCBiL2luY2x1ZGUvbGludXgvcmN1X3N5bmMuaAppbmRleCBhNjNhMzNlLi5lY2U3ZWQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JjdV9zeW5jLmgKKysrIGIvaW5jbHVkZS9saW51eC9yY3Vfc3luYy5oCkBAIC01OSw2ICs1OSw3IEBACiB9CiAKIGV4dGVybiB2b2lkIHJjdV9zeW5jX2luaXQoc3RydWN0IHJjdV9zeW5jICosIGVudW0gcmN1X3N5bmNfdHlwZSk7CitleHRlcm4gdm9pZCByY3Vfc3luY19lbnRlcl9zdGFydChzdHJ1Y3QgcmN1X3N5bmMgKik7CiBleHRlcm4gdm9pZCByY3Vfc3luY19lbnRlcihzdHJ1Y3QgcmN1X3N5bmMgKik7CiBleHRlcm4gdm9pZCByY3Vfc3luY19leGl0KHN0cnVjdCByY3Vfc3luYyAqKTsKIGV4dGVybiB2b2lkIHJjdV9zeW5jX2R0b3Ioc3RydWN0IHJjdV9zeW5jICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oIGIvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCmluZGV4IDFhYTYyZTEuLjMyMWY5ZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKQEAgLTMzNCw2ICszMzQsNyBAQAogdm9pZCByY3VfYmhfcXModm9pZCk7CiB2b2lkIHJjdV9jaGVja19jYWxsYmFja3MoaW50IHVzZXIpOwogdm9pZCByY3VfcmVwb3J0X2RlYWQodW5zaWduZWQgaW50IGNwdSk7Cit2b2lkIHJjdV9jcHVfc3RhcnRpbmcodW5zaWduZWQgaW50IGNwdSk7CiAKICNpZm5kZWYgQ09ORklHX1RJTllfUkNVCiB2b2lkIHJjdV9lbmRfaW5rZXJuZWxfYm9vdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVnbWFwLmggYi9pbmNsdWRlL2xpbnV4L3JlZ21hcC5oCmluZGV4IDJjMTJjYzUuLjlhZGM3YjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVnbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWdtYXAuaApAQCAtMjQxLDkgKzI0MSw5IEBACiAgKiAgICAgICAgICAgICAgICByZWdpc3RlciBjYWNoZSBzdXBwb3J0KS4KICAqIEBudW1fcmVnX2RlZmF1bHRzOiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcmVnX2RlZmF1bHRzLgogICoKLSAqIEByZWFkX2ZsYWdfbWFzazogTWFzayB0byBiZSBzZXQgaW4gdGhlIHRvcCBieXRlIG9mIHRoZSByZWdpc3RlciB3aGVuIGRvaW5nCisgKiBAcmVhZF9mbGFnX21hc2s6IE1hc2sgdG8gYmUgc2V0IGluIHRoZSB0b3AgYnl0ZXMgb2YgdGhlIHJlZ2lzdGVyIHdoZW4gZG9pbmcKICAqICAgICAgICAgICAgICAgICAgYSByZWFkLgotICogQHdyaXRlX2ZsYWdfbWFzazogTWFzayB0byBiZSBzZXQgaW4gdGhlIHRvcCBieXRlIG9mIHRoZSByZWdpc3RlciB3aGVuIGRvaW5nCisgKiBAd3JpdGVfZmxhZ19tYXNrOiBNYXNrIHRvIGJlIHNldCBpbiB0aGUgdG9wIGJ5dGVzIG9mIHRoZSByZWdpc3RlciB3aGVuIGRvaW5nCiAgKiAgICAgICAgICAgICAgICAgICBhIHdyaXRlLiBJZiBib3RoIHJlYWRfZmxhZ19tYXNrIGFuZCB3cml0ZV9mbGFnX21hc2sgYXJlCiAgKiAgICAgICAgICAgICAgICAgICBlbXB0eSB0aGUgcmVnbWFwX2J1cyBkZWZhdWx0IG1hc2tzIGFyZSB1c2VkLgogICogQHVzZV9zaW5nbGVfcnc6IElmIHNldCwgY29udmVydHMgdGhlIGJ1bGsgcmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucyBpbnRvCkBAIC0yOTksOCArMjk5LDggQEAKIAljb25zdCB2b2lkICpyZWdfZGVmYXVsdHNfcmF3OwogCXVuc2lnbmVkIGludCBudW1fcmVnX2RlZmF1bHRzX3JhdzsKIAotCXU4IHJlYWRfZmxhZ19tYXNrOwotCXU4IHdyaXRlX2ZsYWdfbWFzazsKKwl1bnNpZ25lZCBsb25nIHJlYWRfZmxhZ19tYXNrOworCXVuc2lnbmVkIGxvbmcgd3JpdGVfZmxhZ19tYXNrOwogCiAJYm9vbCB1c2Vfc2luZ2xlX3J3OwogCWJvb2wgY2FuX211bHRpX3dyaXRlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaCBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmgKaW5kZXggY2FlNTAwYi4uNjkyMTA4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oCkBAIC0xNDAsOCArMTQwLDYgQEAKICAqCiAgKiBAc3VwcGx5OiAgIFRoZSBuYW1lIG9mIHRoZSBzdXBwbHkuICBJbml0aWFsaXNlZCBieSB0aGUgdXNlciBiZWZvcmUKICAqICAgICAgICAgICAgdXNpbmcgdGhlIGJ1bGsgcmVndWxhdG9yIEFQSXMuCi0gKiBAb3B0aW9uYWw6IFRoZSBzdXBwbHkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3B0aW9uYWwuIEluaXRpYWxpc2VkIGJ5IHRoZSB1c2VyCi0gKiAgICAgICAgICAgIGJlZm9yZSB1c2luZyB0aGUgYnVsayByZWd1bGF0b3IgQVBJcy4KICAqIEBjb25zdW1lcjogVGhlIHJlZ3VsYXRvciBjb25zdW1lciBmb3IgdGhlIHN1cHBseS4gIFRoaXMgd2lsbCBiZSBtYW5hZ2VkCiAgKiAgICAgICAgICAgIGJ5IHRoZSBidWxrIEFQSS4KICAqCkBAIC0xNTEsNyArMTQ5LDYgQEAKICAqLwogc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgewogCWNvbnN0IGNoYXIgKnN1cHBseTsKLQlib29sIG9wdGlvbmFsOwogCXN0cnVjdCByZWd1bGF0b3IgKmNvbnN1bWVyOwogCiAJLyogcHJpdmF0ZTogSW50ZXJuYWwgdXNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaCBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCmluZGV4IGZjZmE0MGEuLjM3YjUzMjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCkBAIC0xMTMsMTAgKzExMywxNCBAQAogICogICAgICAgICAgICAgICBzdGFiaWxpc2UgYWZ0ZXIgYmVpbmcgZW5hYmxlZCwgaW4gbWljcm9zZWNvbmRzLgogICogQHNldF9yYW1wX2RlbGF5OiBTZXQgdGhlIHJhbXAgZGVsYXkgZm9yIHRoZSByZWd1bGF0b3IuIFRoZSBkcml2ZXIgc2hvdWxkCiAgKgkJc2VsZWN0IHJhbXAgZGVsYXkgZXF1YWwgdG8gb3IgbGVzcyB0aGFuKGNsb3Nlc3QpIHJhbXBfZGVsYXkuCisgKiBAc2V0X3ZvbHRhZ2VfdGltZTogVGltZSB0YWtlbiBmb3IgdGhlIHJlZ3VsYXRvciB2b2x0YWdlIG91dHB1dCB2b2x0YWdlCisgKiAgICAgICAgICAgICAgIHRvIHN0YWJpbGlzZSBhZnRlciBiZWluZyBzZXQgdG8gYSBuZXcgdmFsdWUsIGluIG1pY3Jvc2Vjb25kcy4KKyAqICAgICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIHRoZSBmcm9tIGFuZCB0byB2b2x0YWdlIGFzIGlucHV0LCBpdAorICogICAgICAgICAgICAgICBzaG91bGQgcmV0dXJuIHRoZSB3b3JzdCBjYXNlLgogICogQHNldF92b2x0YWdlX3RpbWVfc2VsOiBUaW1lIHRha2VuIGZvciB0aGUgcmVndWxhdG9yIHZvbHRhZ2Ugb3V0cHV0IHZvbHRhZ2UKICAqICAgICAgICAgICAgICAgdG8gc3RhYmlsaXNlIGFmdGVyIGJlaW5nIHNldCB0byBhIG5ldyB2YWx1ZSwgaW4gbWljcm9zZWNvbmRzLgotICogICAgICAgICAgICAgICBUaGUgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIGZyb20gYW5kIHRvIHZvbHRhZ2Ugc2VsZWN0b3IsIHRoZQotICogICAgICAgICAgICAgICBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSB3b3JzdCBjYXNlLgorICogICAgICAgICAgICAgICBUaGUgZnVuY3Rpb24gcmVjZWl2ZXMgdGhlIGZyb20gYW5kIHRvIHZvbHRhZ2Ugc2VsZWN0b3IgYXMKKyAqICAgICAgICAgICAgICAgaW5wdXQsIGl0IHNob3VsZCByZXR1cm4gdGhlIHdvcnN0IGNhc2UuCiAgKiBAc2V0X3NvZnRfc3RhcnQ6IEVuYWJsZSBzb2Z0IHN0YXJ0IGZvciB0aGUgcmVndWxhdG9yLgogICoKICAqIEBzZXRfc3VzcGVuZF92b2x0YWdlOiBTZXQgdGhlIHZvbHRhZ2UgZm9yIHRoZSByZWd1bGF0b3Igd2hlbiB0aGUgc3lzdGVtCkBAIC0xNjgsNiArMTcyLDggQEAKIAkvKiBUaW1lIHRha2VuIHRvIGVuYWJsZSBvciBzZXQgdm9sdGFnZSBvbiB0aGUgcmVndWxhdG9yICovCiAJaW50ICgqZW5hYmxlX3RpbWUpIChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKTsKIAlpbnQgKCpzZXRfcmFtcF9kZWxheSkgKHN0cnVjdCByZWd1bGF0b3JfZGV2ICosIGludCByYW1wX2RlbGF5KTsKKwlpbnQgKCpzZXRfdm9sdGFnZV90aW1lKSAoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKiwgaW50IG9sZF91ViwKKwkJCQkgaW50IG5ld191Vik7CiAJaW50ICgqc2V0X3ZvbHRhZ2VfdGltZV9zZWwpIChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqLAogCQkJCSAgICAgdW5zaWduZWQgaW50IG9sZF9zZWxlY3RvciwKIAkJCQkgICAgIHVuc2lnbmVkIGludCBuZXdfc2VsZWN0b3IpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWxheS5oIGIvaW5jbHVkZS9saW51eC9yZWxheS5oCmluZGV4IGQ3YzgzNTkuLmVjYmIzNGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVsYXkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlbGF5LmgKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAKIC8qCiAgKiBUcmFja3MgY2hhbmdlcyB0byByY2hhbi9yY2hhbl9idWYgc3RydWN0cwpAQCAtNjMsNyArNjQsNyBAQAogCXN0cnVjdCBrcmVmIGtyZWY7CQkvKiBjaGFubmVsIHJlZmNvdW50ICovCiAJdm9pZCAqcHJpdmF0ZV9kYXRhOwkJLyogZm9yIHVzZXItZGVmaW5lZCBkYXRhICovCiAJc2l6ZV90IGxhc3RfdG9vYmlnOwkJLyogdHJpZWQgdG8gbG9nIGV2ZW50ID4gc3ViYnVmIHNpemUgKi8KLQlzdHJ1Y3QgcmNoYW5fYnVmICpidWZbTlJfQ1BVU107IC8qIHBlci1jcHUgY2hhbm5lbCBidWZmZXJzICovCisJc3RydWN0IHJjaGFuX2J1ZiAqKiBfX3BlcmNwdSBidWY7IC8qIHBlci1jcHUgY2hhbm5lbCBidWZmZXJzICovCiAJaW50IGlzX2dsb2JhbDsJCQkvKiBPbmUgZ2xvYmFsIGJ1ZmZlciA/ICovCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogZm9yIGNoYW5uZWwgbGlzdCAqLwogCXN0cnVjdCBkZW50cnkgKnBhcmVudDsJCS8qIHBhcmVudCBkZW50cnkgcGFzc2VkIHRvIG9wZW4gKi8KQEAgLTIwNCw3ICsyMDUsNyBAQAogCXN0cnVjdCByY2hhbl9idWYgKmJ1ZjsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlidWYgPSBjaGFuLT5idWZbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwlidWYgPSAqdGhpc19jcHVfcHRyKGNoYW4tPmJ1Zik7CiAJaWYgKHVubGlrZWx5KGJ1Zi0+b2Zmc2V0ICsgbGVuZ3RoID4gY2hhbi0+c3ViYnVmX3NpemUpKQogCQlsZW5ndGggPSByZWxheV9zd2l0Y2hfc3ViYnVmKGJ1ZiwgbGVuZ3RoKTsKIAltZW1jcHkoYnVmLT5kYXRhICsgYnVmLT5vZmZzZXQsIGRhdGEsIGxlbmd0aCk7CkBAIC0yMzAsMTIgKzIzMSwxMiBAQAogewogCXN0cnVjdCByY2hhbl9idWYgKmJ1ZjsKIAotCWJ1ZiA9IGNoYW4tPmJ1ZltnZXRfY3B1KCldOworCWJ1ZiA9ICpnZXRfY3B1X3B0cihjaGFuLT5idWYpOwogCWlmICh1bmxpa2VseShidWYtPm9mZnNldCArIGxlbmd0aCA+IGJ1Zi0+Y2hhbi0+c3ViYnVmX3NpemUpKQogCQlsZW5ndGggPSByZWxheV9zd2l0Y2hfc3ViYnVmKGJ1ZiwgbGVuZ3RoKTsKIAltZW1jcHkoYnVmLT5kYXRhICsgYnVmLT5vZmZzZXQsIGRhdGEsIGxlbmd0aCk7CiAJYnVmLT5vZmZzZXQgKz0gbGVuZ3RoOwotCXB1dF9jcHUoKTsKKwlwdXRfY3B1X3B0cihjaGFuLT5idWYpOwogfQogCiAvKioKQEAgLTI1MSwxNyArMjUyLDE5IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqcmVsYXlfcmVzZXJ2ZShzdHJ1Y3QgcmNoYW4gKmNoYW4sIHNpemVfdCBsZW5ndGgpCiB7Ci0Jdm9pZCAqcmVzZXJ2ZWQ7Ci0Jc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gY2hhbi0+YnVmW3NtcF9wcm9jZXNzb3JfaWQoKV07CisJdm9pZCAqcmVzZXJ2ZWQgPSBOVUxMOworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZiA9ICpnZXRfY3B1X3B0cihjaGFuLT5idWYpOwogCiAJaWYgKHVubGlrZWx5KGJ1Zi0+b2Zmc2V0ICsgbGVuZ3RoID4gYnVmLT5jaGFuLT5zdWJidWZfc2l6ZSkpIHsKIAkJbGVuZ3RoID0gcmVsYXlfc3dpdGNoX3N1YmJ1ZihidWYsIGxlbmd0aCk7CiAJCWlmICghbGVuZ3RoKQotCQkJcmV0dXJuIE5VTEw7CisJCQlnb3RvIGVuZDsKIAl9CiAJcmVzZXJ2ZWQgPSBidWYtPmRhdGEgKyBidWYtPm9mZnNldDsKIAlidWYtPm9mZnNldCArPSBsZW5ndGg7CiAKK2VuZDoKKwlwdXRfY3B1X3B0cihjaGFuLT5idWYpOwogCXJldHVybiByZXNlcnZlZDsKIH0KIApAQCAtMjg1LDUgKzI4OCwxMSBAQAogICovCiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWxheV9maWxlX29wZXJhdGlvbnM7CiAKKyNpZmRlZiBDT05GSUdfUkVMQVkKK2ludCByZWxheV9wcmVwYXJlX2NwdSh1bnNpZ25lZCBpbnQgY3B1KTsKKyNlbHNlCisjZGVmaW5lIHJlbGF5X3ByZXBhcmVfY3B1ICAgICBOVUxMCisjZW5kaWYKKwogI2VuZGlmIC8qIF9MSU5VWF9SRUxBWV9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmhhc2h0YWJsZS5oIGIvaW5jbHVkZS9saW51eC9yaGFzaHRhYmxlLmgKaW5kZXggM2VlZjA4MC4uNWMxMzJkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yaGFzaHRhYmxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yaGFzaHRhYmxlLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogUmVzaXphYmxlLCBTY2FsYWJsZSwgQ29uY3VycmVudCBIYXNoIFRhYmxlCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDE1IEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KICAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgogICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTQgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CiAgKgpAQCAtNTMsNiArNTMsMTEgQEAKIAlzdHJ1Y3Qgcmhhc2hfaGVhZCBfX3JjdQkJKm5leHQ7CiB9OwogCitzdHJ1Y3QgcmhsaXN0X2hlYWQgeworCXN0cnVjdCByaGFzaF9oZWFkCQlyaGVhZDsKKwlzdHJ1Y3QgcmhsaXN0X2hlYWQgX19yY3UJKm5leHQ7Cit9OworCiAvKioKICAqIHN0cnVjdCBidWNrZXRfdGFibGUgLSBUYWJsZSBvZiBoYXNoIGJ1Y2tldHMKICAqIEBzaXplOiBOdW1iZXIgb2YgaGFzaCBidWNrZXRzCkBAIC0xMzcsNiArMTQyLDcgQEAKICAqIEBrZXlfbGVuOiBLZXkgbGVuZ3RoIGZvciBoYXNoZm4KICAqIEBlbGFzdGljaXR5OiBNYXhpbXVtIGNoYWluIGxlbmd0aCBiZWZvcmUgcmVoYXNoCiAgKiBAcDogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKiBAcmhsaXN0OiBUcnVlIGlmIHRoaXMgaXMgYW4gcmhsdGFibGUKICAqIEBydW5fd29yazogRGVmZXJyZWQgd29ya2VyIHRvIGV4cGFuZC9zaHJpbmsgYXN5bmNocm9ub3VzbHkKICAqIEBtdXRleDogTXV0ZXggdG8gcHJvdGVjdCBjdXJyZW50L2Z1dHVyZSB0YWJsZSBzd2FwcGluZwogICogQGxvY2s6IFNwaW4gbG9jayB0byBwcm90ZWN0IHdhbGtlciBsaXN0CkBAIC0xNDcsMTIgKzE1MywyMSBAQAogCXVuc2lnbmVkIGludAkJCWtleV9sZW47CiAJdW5zaWduZWQgaW50CQkJZWxhc3RpY2l0eTsKIAlzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMJcDsKKwlib29sCQkJCXJobGlzdDsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXJ1bl93b3JrOwogCXN0cnVjdCBtdXRleCAgICAgICAgICAgICAgICAgICAgbXV0ZXg7CiAJc3BpbmxvY2tfdAkJCWxvY2s7CiB9OwogCiAvKioKKyAqIHN0cnVjdCByaGx0YWJsZSAtIEhhc2ggdGFibGUgd2l0aCBkdXBsaWNhdGUgb2JqZWN0cyBpbiBhIGxpc3QKKyAqIEBodDogVW5kZXJseWluZyByaHRhYmxlCisgKi8KK3N0cnVjdCByaGx0YWJsZSB7CisJc3RydWN0IHJoYXNodGFibGUgaHQ7Cit9OworCisvKioKICAqIHN0cnVjdCByaGFzaHRhYmxlX3dhbGtlciAtIEhhc2ggdGFibGUgd2Fsa2VyCiAgKiBAbGlzdDogTGlzdCBlbnRyeSBvbiBsaXN0IG9mIHdhbGtlcnMKICAqIEB0Ymw6IFRoZSB0YWJsZSB0aGF0IHdlIHdlcmUgd2Fsa2luZyBvdmVyCkBAIC0xNjMsOSArMTc4LDEwIEBACiB9OwogCiAvKioKLSAqIHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgLSBIYXNoIHRhYmxlIGl0ZXJhdG9yLCBmaXRzIGludG8gbmV0bGluayBjYgorICogc3RydWN0IHJoYXNodGFibGVfaXRlciAtIEhhc2ggdGFibGUgaXRlcmF0b3IKICAqIEBodDogVGFibGUgdG8gaXRlcmF0ZSB0aHJvdWdoCiAgKiBAcDogQ3VycmVudCBwb2ludGVyCisgKiBAbGlzdDogQ3VycmVudCBoYXNoIGxpc3QgcG9pbnRlcgogICogQHdhbGtlcjogQXNzb2NpYXRlZCByaGFzaHRhYmxlIHdhbGtlcgogICogQHNsb3Q6IEN1cnJlbnQgc2xvdAogICogQHNraXA6IE51bWJlciBvZiBlbnRyaWVzIHRvIHNraXAgaW4gc2xvdApAQCAtMTczLDcgKzE4OSw4IEBACiBzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyIHsKIAlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQ7CiAJc3RydWN0IHJoYXNoX2hlYWQgKnA7Ci0Jc3RydWN0IHJoYXNodGFibGVfd2Fsa2VyICp3YWxrZXI7CisJc3RydWN0IHJobGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCByaGFzaHRhYmxlX3dhbGtlciB3YWxrZXI7CiAJdW5zaWduZWQgaW50IHNsb3Q7CiAJdW5zaWduZWQgaW50IHNraXA7CiB9OwpAQCAtMzM5LDE1ICszNTYsMTQgQEAKIAogaW50IHJoYXNodGFibGVfaW5pdChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCiAJCSAgICBjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgKnBhcmFtcyk7CitpbnQgcmhsdGFibGVfaW5pdChzdHJ1Y3QgcmhsdGFibGUgKmhsdCwKKwkJICBjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgKnBhcmFtcyk7CiAKLXN0cnVjdCBidWNrZXRfdGFibGUgKnJoYXNodGFibGVfaW5zZXJ0X3Nsb3coc3RydWN0IHJoYXNodGFibGUgKmh0LAotCQkJCQkgICAgY29uc3Qgdm9pZCAqa2V5LAotCQkJCQkgICAgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKLQkJCQkJICAgIHN0cnVjdCBidWNrZXRfdGFibGUgKm9sZF90YmwpOwotaW50IHJoYXNodGFibGVfaW5zZXJ0X3JlaGFzaChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCk7Cit2b2lkICpyaGFzaHRhYmxlX2luc2VydF9zbG93KHN0cnVjdCByaGFzaHRhYmxlICpodCwgY29uc3Qgdm9pZCAqa2V5LAorCQkJICAgICBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqKTsKIAotaW50IHJoYXNodGFibGVfd2Fsa19pbml0KHN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IHJoYXNodGFibGVfaXRlciAqaXRlciwKLQkJCSBnZnBfdCBnZnApOwordm9pZCByaGFzaHRhYmxlX3dhbGtfZW50ZXIoc3RydWN0IHJoYXNodGFibGUgKmh0LAorCQkJICAgc3RydWN0IHJoYXNodGFibGVfaXRlciAqaXRlcik7CiB2b2lkIHJoYXNodGFibGVfd2Fsa19leGl0KHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKml0ZXIpOwogaW50IHJoYXNodGFibGVfd2Fsa19zdGFydChzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICppdGVyKSBfX2FjcXVpcmVzKFJDVSk7CiB2b2lkICpyaGFzaHRhYmxlX3dhbGtfbmV4dChzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICppdGVyKTsKQEAgLTUwNiw2ICs1MjIsMzEgQEAKIAlyaHRfZm9yX2VhY2hfZW50cnlfcmN1X2NvbnRpbnVlKHRwb3MsIHBvcywgKHRibCktPmJ1Y2tldHNbaGFzaF0sXAogCQkJCQl0YmwsIGhhc2gsIG1lbWJlcikKIAorLyoqCisgKiByaGxfZm9yX2VhY2hfcmN1IC0gaXRlcmF0ZSBvdmVyIHJjdSBoYXNoIHRhYmxlIGxpc3QKKyAqIEBwb3M6CXRoZSAmc3RydWN0IHJsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAbGlzdDoJdGhlIGhlYWQgb2YgdGhlIGxpc3QKKyAqCisgKiBUaGlzIGhhc2ggY2hhaW4gbGlzdC10cmF2ZXJzYWwgcHJpbWl0aXZlIHNob3VsZCBiZSB1c2VkIG9uIHRoZQorICogbGlzdCByZXR1cm5lZCBieSByaGx0YWJsZV9sb29rdXAuCisgKi8KKyNkZWZpbmUgcmhsX2Zvcl9lYWNoX3JjdShwb3MsIGxpc3QpCQkJCQlcCisJZm9yIChwb3MgPSBsaXN0OyBwb3M7IHBvcyA9IHJjdV9kZXJlZmVyZW5jZV9yYXcocG9zLT5uZXh0KSkKKworLyoqCisgKiByaGxfZm9yX2VhY2hfZW50cnlfcmN1IC0gaXRlcmF0ZSBvdmVyIHJjdSBoYXNoIHRhYmxlIGxpc3Qgb2YgZ2l2ZW4gdHlwZQorICogQHRwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAcG9zOgl0aGUgJnN0cnVjdCBybGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQGxpc3Q6CXRoZSBoZWFkIG9mIHRoZSBsaXN0CisgKiBAbWVtYmVyOgluYW1lIG9mIHRoZSAmc3RydWN0IHJsaXN0X2hlYWQgd2l0aGluIHRoZSBoYXNoYWJsZSBzdHJ1Y3QuCisgKgorICogVGhpcyBoYXNoIGNoYWluIGxpc3QtdHJhdmVyc2FsIHByaW1pdGl2ZSBzaG91bGQgYmUgdXNlZCBvbiB0aGUKKyAqIGxpc3QgcmV0dXJuZWQgYnkgcmhsdGFibGVfbG9va3VwLgorICovCisjZGVmaW5lIHJobF9mb3JfZWFjaF9lbnRyeV9yY3UodHBvcywgcG9zLCBsaXN0LCBtZW1iZXIpCQkJXAorCWZvciAocG9zID0gbGlzdDsgcG9zICYmIHJodF9lbnRyeSh0cG9zLCBwb3MsIG1lbWJlcik7CQlcCisJICAgICBwb3MgPSByY3VfZGVyZWZlcmVuY2VfcmF3KHBvcy0+bmV4dCkpCisKIHN0YXRpYyBpbmxpbmUgaW50IHJoYXNodGFibGVfY29tcGFyZShzdHJ1Y3Qgcmhhc2h0YWJsZV9jb21wYXJlX2FyZyAqYXJnLAogCQkJCSAgICAgY29uc3Qgdm9pZCAqb2JqKQogewpAQCAtNTE1LDE4ICs1NTYsOCBAQAogCXJldHVybiBtZW1jbXAocHRyICsgaHQtPnAua2V5X29mZnNldCwgYXJnLT5rZXksIGh0LT5wLmtleV9sZW4pOwogfQogCi0vKioKLSAqIHJoYXNodGFibGVfbG9va3VwX2Zhc3QgLSBzZWFyY2ggaGFzaCB0YWJsZSwgaW5saW5lZCB2ZXJzaW9uCi0gKiBAaHQ6CQloYXNoIHRhYmxlCi0gKiBAa2V5Ogl0aGUgcG9pbnRlciB0byB0aGUga2V5Ci0gKiBAcGFyYW1zOgloYXNoIHRhYmxlIHBhcmFtZXRlcnMKLSAqCi0gKiBDb21wdXRlcyB0aGUgaGFzaCB2YWx1ZSBmb3IgdGhlIGtleSBhbmQgdHJhdmVyc2VzIHRoZSBidWNrZXQgY2hhaW4gbG9va2luZwotICogZm9yIGEgZW50cnkgd2l0aCBhbiBpZGVudGljYWwga2V5LiBUaGUgZmlyc3QgbWF0Y2hpbmcgZW50cnkgaXMgcmV0dXJuZWQuCi0gKgotICogUmV0dXJucyB0aGUgZmlyc3QgZW50cnkgb24gd2hpY2ggdGhlIGNvbXBhcmUgZnVuY3Rpb24gcmV0dXJuZWQgdHJ1ZS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkICpyaGFzaHRhYmxlX2xvb2t1cF9mYXN0KAorLyogSW50ZXJuYWwgZnVuY3Rpb24sIGRvIG5vdCB1c2UuICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCByaGFzaF9oZWFkICpfX3JoYXNodGFibGVfbG9va3VwKAogCXN0cnVjdCByaGFzaHRhYmxlICpodCwgY29uc3Qgdm9pZCAqa2V5LAogCWNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMpCiB7CkBAIC01MzgsOCArNTY5LDYgQEAKIAlzdHJ1Y3Qgcmhhc2hfaGVhZCAqaGU7CiAJdW5zaWduZWQgaW50IGhhc2g7CiAKLQlyY3VfcmVhZF9sb2NrKCk7Ci0KIAl0YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KGh0LT50YmwsIGh0KTsKIHJlc3RhcnQ6CiAJaGFzaCA9IHJodF9rZXlfaGFzaGZuKGh0LCB0YmwsIGtleSwgcGFyYW1zKTsKQEAgLTU0OCw4ICs1NzcsNyBAQAogCQkgICAgcGFyYW1zLm9ial9jbXBmbigmYXJnLCByaHRfb2JqKGh0LCBoZSkpIDoKIAkJICAgIHJoYXNodGFibGVfY29tcGFyZSgmYXJnLCByaHRfb2JqKGh0LCBoZSkpKQogCQkJY29udGludWU7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlyZXR1cm4gcmh0X29iaihodCwgaGUpOworCQlyZXR1cm4gaGU7CiAJfQogCiAJLyogRW5zdXJlIHdlIHNlZSBhbnkgbmV3IHRhYmxlcy4gKi8KQEAgLTU1OCw4OSArNTg2LDE2NSBAQAogCXRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UodGJsLT5mdXR1cmVfdGJsLCBodCk7CiAJaWYgKHVubGlrZWx5KHRibCkpCiAJCWdvdG8gcmVzdGFydDsKLQlyY3VfcmVhZF91bmxvY2soKTsKIAogCXJldHVybiBOVUxMOwogfQogCi0vKiBJbnRlcm5hbCBmdW5jdGlvbiwgcGxlYXNlIHVzZSByaGFzaHRhYmxlX2luc2VydF9mYXN0KCkgaW5zdGVhZCAqLwotc3RhdGljIGlubGluZSBpbnQgX19yaGFzaHRhYmxlX2luc2VydF9mYXN0KAotCXN0cnVjdCByaGFzaHRhYmxlICpodCwgY29uc3Qgdm9pZCAqa2V5LCBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqLAorLyoqCisgKiByaGFzaHRhYmxlX2xvb2t1cCAtIHNlYXJjaCBoYXNoIHRhYmxlCisgKiBAaHQ6CQloYXNoIHRhYmxlCisgKiBAa2V5Ogl0aGUgcG9pbnRlciB0byB0aGUga2V5CisgKiBAcGFyYW1zOgloYXNoIHRhYmxlIHBhcmFtZXRlcnMKKyAqCisgKiBDb21wdXRlcyB0aGUgaGFzaCB2YWx1ZSBmb3IgdGhlIGtleSBhbmQgdHJhdmVyc2VzIHRoZSBidWNrZXQgY2hhaW4gbG9va2luZworICogZm9yIGEgZW50cnkgd2l0aCBhbiBpZGVudGljYWwga2V5LiBUaGUgZmlyc3QgbWF0Y2hpbmcgZW50cnkgaXMgcmV0dXJuZWQuCisgKgorICogVGhpcyBtdXN0IG9ubHkgYmUgY2FsbGVkIHVuZGVyIHRoZSBSQ1UgcmVhZCBsb2NrLgorICoKKyAqIFJldHVybnMgdGhlIGZpcnN0IGVudHJ5IG9uIHdoaWNoIHRoZSBjb21wYXJlIGZ1bmN0aW9uIHJldHVybmVkIHRydWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqcmhhc2h0YWJsZV9sb29rdXAoCisJc3RydWN0IHJoYXNodGFibGUgKmh0LCBjb25zdCB2b2lkICprZXksCiAJY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcykKIHsKKwlzdHJ1Y3Qgcmhhc2hfaGVhZCAqaGUgPSBfX3JoYXNodGFibGVfbG9va3VwKGh0LCBrZXksIHBhcmFtcyk7CisKKwlyZXR1cm4gaGUgPyByaHRfb2JqKGh0LCBoZSkgOiBOVUxMOworfQorCisvKioKKyAqIHJoYXNodGFibGVfbG9va3VwX2Zhc3QgLSBzZWFyY2ggaGFzaCB0YWJsZSwgd2l0aG91dCBSQ1UgcmVhZCBsb2NrCisgKiBAaHQ6CQloYXNoIHRhYmxlCisgKiBAa2V5Ogl0aGUgcG9pbnRlciB0byB0aGUga2V5CisgKiBAcGFyYW1zOgloYXNoIHRhYmxlIHBhcmFtZXRlcnMKKyAqCisgKiBDb21wdXRlcyB0aGUgaGFzaCB2YWx1ZSBmb3IgdGhlIGtleSBhbmQgdHJhdmVyc2VzIHRoZSBidWNrZXQgY2hhaW4gbG9va2luZworICogZm9yIGEgZW50cnkgd2l0aCBhbiBpZGVudGljYWwga2V5LiBUaGUgZmlyc3QgbWF0Y2hpbmcgZW50cnkgaXMgcmV0dXJuZWQuCisgKgorICogT25seSB1c2UgdGhpcyBmdW5jdGlvbiB3aGVuIHlvdSBoYXZlIG90aGVyIG1lY2hhbmlzbXMgZ3VhcmFudGVlaW5nCisgKiB0aGF0IHRoZSBvYmplY3Qgd29uJ3QgZ28gYXdheSBhZnRlciB0aGUgUkNVIHJlYWQgbG9jayBpcyByZWxlYXNlZC4KKyAqCisgKiBSZXR1cm5zIHRoZSBmaXJzdCBlbnRyeSBvbiB3aGljaCB0aGUgY29tcGFyZSBmdW5jdGlvbiByZXR1cm5lZCB0cnVlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKnJoYXNodGFibGVfbG9va3VwX2Zhc3QoCisJc3RydWN0IHJoYXNodGFibGUgKmh0LCBjb25zdCB2b2lkICprZXksCisJY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcykKK3sKKwl2b2lkICpvYmo7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJb2JqID0gcmhhc2h0YWJsZV9sb29rdXAoaHQsIGtleSwgcGFyYW1zKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBvYmo7Cit9CisKKy8qKgorICogcmhsdGFibGVfbG9va3VwIC0gc2VhcmNoIGhhc2ggbGlzdCB0YWJsZQorICogQGhsdDoJaGFzaCB0YWJsZQorICogQGtleToJdGhlIHBvaW50ZXIgdG8gdGhlIGtleQorICogQHBhcmFtczoJaGFzaCB0YWJsZSBwYXJhbWV0ZXJzCisgKgorICogQ29tcHV0ZXMgdGhlIGhhc2ggdmFsdWUgZm9yIHRoZSBrZXkgYW5kIHRyYXZlcnNlcyB0aGUgYnVja2V0IGNoYWluIGxvb2tpbmcKKyAqIGZvciBhIGVudHJ5IHdpdGggYW4gaWRlbnRpY2FsIGtleS4gIEFsbCBtYXRjaGluZyBlbnRyaWVzIGFyZSByZXR1cm5lZAorICogaW4gYSBsaXN0LgorICoKKyAqIFRoaXMgbXVzdCBvbmx5IGJlIGNhbGxlZCB1bmRlciB0aGUgUkNVIHJlYWQgbG9jay4KKyAqCisgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGVudHJpZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4ga2V5LgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCByaGxpc3RfaGVhZCAqcmhsdGFibGVfbG9va3VwKAorCXN0cnVjdCByaGx0YWJsZSAqaGx0LCBjb25zdCB2b2lkICprZXksCisJY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcykKK3sKKwlzdHJ1Y3Qgcmhhc2hfaGVhZCAqaGUgPSBfX3JoYXNodGFibGVfbG9va3VwKCZobHQtPmh0LCBrZXksIHBhcmFtcyk7CisKKwlyZXR1cm4gaGUgPyBjb250YWluZXJfb2YoaGUsIHN0cnVjdCByaGxpc3RfaGVhZCwgcmhlYWQpIDogTlVMTDsKK30KKworLyogSW50ZXJuYWwgZnVuY3Rpb24sIHBsZWFzZSB1c2Ugcmhhc2h0YWJsZV9pbnNlcnRfZmFzdCgpIGluc3RlYWQuIFRoaXMKKyAqIGZ1bmN0aW9uIHJldHVybnMgdGhlIGV4aXN0aW5nIGVsZW1lbnQgYWxyZWFkeSBpbiBoYXNoZXMgaW4gdGhlcmUgaXMgYSBjbGFzaCwKKyAqIG90aGVyd2lzZSBpdCByZXR1cm5zIGFuIGVycm9yIHZpYSBFUlJfUFRSKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqX19yaGFzaHRhYmxlX2luc2VydF9mYXN0KAorCXN0cnVjdCByaGFzaHRhYmxlICpodCwgY29uc3Qgdm9pZCAqa2V5LCBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqLAorCWNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMsIGJvb2wgcmhsaXN0KQorewogCXN0cnVjdCByaGFzaHRhYmxlX2NvbXBhcmVfYXJnIGFyZyA9IHsKIAkJLmh0ID0gaHQsCiAJCS5rZXkgPSBrZXksCiAJfTsKLQlzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwsICpuZXdfdGJsOworCXN0cnVjdCByaGFzaF9oZWFkIF9fcmN1ICoqcHByZXY7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOwogCXN0cnVjdCByaGFzaF9oZWFkICpoZWFkOwogCXNwaW5sb2NrX3QgKmxvY2s7Ci0JdW5zaWduZWQgaW50IGVsYXN0aWNpdHk7CiAJdW5zaWduZWQgaW50IGhhc2g7Ci0JaW50IGVycjsKKwlpbnQgZWxhc3RpY2l0eTsKKwl2b2lkICpkYXRhOwogCi1yZXN0YXJ0OgogCXJjdV9yZWFkX2xvY2soKTsKIAogCXRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UoaHQtPnRibCwgaHQpOworCWhhc2ggPSByaHRfaGVhZF9oYXNoZm4oaHQsIHRibCwgb2JqLCBwYXJhbXMpOworCWxvY2sgPSByaHRfYnVja2V0X2xvY2sodGJsLCBoYXNoKTsKKwlzcGluX2xvY2tfYmgobG9jayk7CiAKLQkvKiBBbGwgaW5zZXJ0aW9ucyBtdXN0IGdyYWIgdGhlIG9sZGVzdCB0YWJsZSBjb250YWluaW5nCi0JICogdGhlIGhhc2hlZCBidWNrZXQgdGhhdCBpcyB5ZXQgdG8gYmUgcmVoYXNoZWQuCi0JICovCi0JZm9yICg7OykgewotCQloYXNoID0gcmh0X2hlYWRfaGFzaGZuKGh0LCB0YmwsIG9iaiwgcGFyYW1zKTsKLQkJbG9jayA9IHJodF9idWNrZXRfbG9jayh0YmwsIGhhc2gpOwotCQlzcGluX2xvY2tfYmgobG9jayk7Ci0KLQkJaWYgKHRibC0+cmVoYXNoIDw9IGhhc2gpCi0JCQlicmVhazsKLQorCWlmICh1bmxpa2VseShyaHRfZGVyZWZlcmVuY2VfYnVja2V0KHRibC0+ZnV0dXJlX3RibCwgdGJsLCBoYXNoKSkpIHsKK3Nsb3dfcGF0aDoKIAkJc3Bpbl91bmxvY2tfYmgobG9jayk7Ci0JCXRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UodGJsLT5mdXR1cmVfdGJsLCBodCk7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm4gcmhhc2h0YWJsZV9pbnNlcnRfc2xvdyhodCwga2V5LCBvYmopOwogCX0KIAotCW5ld190YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KHRibC0+ZnV0dXJlX3RibCwgaHQpOwotCWlmICh1bmxpa2VseShuZXdfdGJsKSkgewotCQl0YmwgPSByaGFzaHRhYmxlX2luc2VydF9zbG93KGh0LCBrZXksIG9iaiwgbmV3X3RibCk7Ci0JCWlmICghSVNfRVJSX09SX05VTEwodGJsKSkKLQkJCWdvdG8gc2xvd19wYXRoOworCWVsYXN0aWNpdHkgPSBodC0+ZWxhc3RpY2l0eTsKKwlwcHJldiA9ICZ0YmwtPmJ1Y2tldHNbaGFzaF07CisJcmh0X2Zvcl9lYWNoKGhlYWQsIHRibCwgaGFzaCkgeworCQlzdHJ1Y3QgcmhsaXN0X2hlYWQgKnBsaXN0OworCQlzdHJ1Y3QgcmhsaXN0X2hlYWQgKmxpc3Q7CiAKLQkJZXJyID0gUFRSX0VSUih0YmwpOwotCQlnb3RvIG91dDsKKwkJZWxhc3RpY2l0eS0tOworCQlpZiAoIWtleSB8fAorCQkgICAgKHBhcmFtcy5vYmpfY21wZm4gPworCQkgICAgIHBhcmFtcy5vYmpfY21wZm4oJmFyZywgcmh0X29iaihodCwgaGVhZCkpIDoKKwkJICAgICByaGFzaHRhYmxlX2NvbXBhcmUoJmFyZywgcmh0X29iaihodCwgaGVhZCkpKSkKKwkJCWNvbnRpbnVlOworCisJCWRhdGEgPSByaHRfb2JqKGh0LCBoZWFkKTsKKworCQlpZiAoIXJobGlzdCkKKwkJCWdvdG8gb3V0OworCisKKwkJbGlzdCA9IGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCByaGxpc3RfaGVhZCwgcmhlYWQpOworCQlwbGlzdCA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgcmhsaXN0X2hlYWQsIHJoZWFkKTsKKworCQlSQ1VfSU5JVF9QT0lOVEVSKGxpc3QtPm5leHQsIHBsaXN0KTsKKwkJaGVhZCA9IHJodF9kZXJlZmVyZW5jZV9idWNrZXQoaGVhZC0+bmV4dCwgdGJsLCBoYXNoKTsKKwkJUkNVX0lOSVRfUE9JTlRFUihsaXN0LT5yaGVhZC5uZXh0LCBoZWFkKTsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKCpwcHJldiwgb2JqKTsKKworCQlnb3RvIGdvb2Q7CiAJfQogCi0JZXJyID0gLUUyQklHOworCWlmIChlbGFzdGljaXR5IDw9IDApCisJCWdvdG8gc2xvd19wYXRoOworCisJZGF0YSA9IEVSUl9QVFIoLUUyQklHKTsKIAlpZiAodW5saWtlbHkocmh0X2dyb3dfYWJvdmVfbWF4KGh0LCB0YmwpKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAodW5saWtlbHkocmh0X2dyb3dfYWJvdmVfMTAwKGh0LCB0YmwpKSkgewotc2xvd19wYXRoOgotCQlzcGluX3VubG9ja19iaChsb2NrKTsKLQkJZXJyID0gcmhhc2h0YWJsZV9pbnNlcnRfcmVoYXNoKGh0LCB0YmwpOwotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJZ290byByZXN0YXJ0OwotCX0KLQotCWVyciA9IC1FRVhJU1Q7Ci0JZWxhc3RpY2l0eSA9IGh0LT5lbGFzdGljaXR5OwotCXJodF9mb3JfZWFjaChoZWFkLCB0YmwsIGhhc2gpIHsKLQkJaWYgKGtleSAmJgotCQkgICAgdW5saWtlbHkoIShwYXJhbXMub2JqX2NtcGZuID8KLQkJCSAgICAgICBwYXJhbXMub2JqX2NtcGZuKCZhcmcsIHJodF9vYmooaHQsIGhlYWQpKSA6Ci0JCQkgICAgICAgcmhhc2h0YWJsZV9jb21wYXJlKCZhcmcsIHJodF9vYmooaHQsIGhlYWQpKSkpKQotCQkJZ290byBvdXQ7Ci0JCWlmICghLS1lbGFzdGljaXR5KQotCQkJZ290byBzbG93X3BhdGg7Ci0JfQotCi0JZXJyID0gMDsKKwlpZiAodW5saWtlbHkocmh0X2dyb3dfYWJvdmVfMTAwKGh0LCB0YmwpKSkKKwkJZ290byBzbG93X3BhdGg7CiAKIAloZWFkID0gcmh0X2RlcmVmZXJlbmNlX2J1Y2tldCh0YmwtPmJ1Y2tldHNbaGFzaF0sIHRibCwgaGFzaCk7CiAKIAlSQ1VfSU5JVF9QT0lOVEVSKG9iai0+bmV4dCwgaGVhZCk7CisJaWYgKHJobGlzdCkgeworCQlzdHJ1Y3QgcmhsaXN0X2hlYWQgKmxpc3Q7CisKKwkJbGlzdCA9IGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCByaGxpc3RfaGVhZCwgcmhlYWQpOworCQlSQ1VfSU5JVF9QT0lOVEVSKGxpc3QtPm5leHQsIE5VTEwpOworCX0KIAogCXJjdV9hc3NpZ25fcG9pbnRlcih0YmwtPmJ1Y2tldHNbaGFzaF0sIG9iaik7CiAKQEAgLTY0OCwxMSArNzUyLDE0IEBACiAJaWYgKHJodF9ncm93X2Fib3ZlXzc1KGh0LCB0YmwpKQogCQlzY2hlZHVsZV93b3JrKCZodC0+cnVuX3dvcmspOwogCitnb29kOgorCWRhdGEgPSBOVUxMOworCiBvdXQ6CiAJc3Bpbl91bmxvY2tfYmgobG9jayk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlyZXR1cm4gZXJyOworCXJldHVybiBkYXRhOwogfQogCiAvKioKQEAgLTY3NSw3ICs3ODIsNjUgQEAKIAlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIHN0cnVjdCByaGFzaF9oZWFkICpvYmosCiAJY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcykKIHsKLQlyZXR1cm4gX19yaGFzaHRhYmxlX2luc2VydF9mYXN0KGh0LCBOVUxMLCBvYmosIHBhcmFtcyk7CisJdm9pZCAqcmV0OworCisJcmV0ID0gX19yaGFzaHRhYmxlX2luc2VydF9mYXN0KGh0LCBOVUxMLCBvYmosIHBhcmFtcywgZmFsc2UpOworCWlmIChJU19FUlIocmV0KSkKKwkJcmV0dXJuIFBUUl9FUlIocmV0KTsKKworCXJldHVybiByZXQgPT0gTlVMTCA/IDAgOiAtRUVYSVNUOworfQorCisvKioKKyAqIHJobHRhYmxlX2luc2VydF9rZXkgLSBpbnNlcnQgb2JqZWN0IGludG8gaGFzaCBsaXN0IHRhYmxlCisgKiBAaGx0OgloYXNoIGxpc3QgdGFibGUKKyAqIEBrZXk6CXRoZSBwb2ludGVyIHRvIHRoZSBrZXkKKyAqIEBsaXN0Oglwb2ludGVyIHRvIGhhc2ggbGlzdCBoZWFkIGluc2lkZSBvYmplY3QKKyAqIEBwYXJhbXM6CWhhc2ggdGFibGUgcGFyYW1ldGVycworICoKKyAqIFdpbGwgdGFrZSBhIHBlciBidWNrZXQgc3BpbmxvY2sgdG8gcHJvdGVjdCBhZ2FpbnN0IG11dHVhbCBtdXRhdGlvbnMKKyAqIG9uIHRoZSBzYW1lIGJ1Y2tldC4gTXVsdGlwbGUgaW5zZXJ0aW9ucyBtYXkgb2NjdXIgaW4gcGFyYWxsZWwgdW5sZXNzCisgKiB0aGV5IG1hcCB0byB0aGUgc2FtZSBidWNrZXQgbG9jay4KKyAqCisgKiBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIGF0b21pYyBjb250ZXh0LgorICoKKyAqIFdpbGwgdHJpZ2dlciBhbiBhdXRvbWF0aWMgZGVmZXJyZWQgdGFibGUgcmVzaXppbmcgaWYgdGhlIHNpemUgZ3Jvd3MKKyAqIGJleW9uZCB0aGUgd2F0ZXJtYXJrIGluZGljYXRlZCBieSBncm93X2RlY2lzaW9uKCkgd2hpY2ggY2FuIGJlIHBhc3NlZAorICogdG8gcmhhc2h0YWJsZV9pbml0KCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJobHRhYmxlX2luc2VydF9rZXkoCisJc3RydWN0IHJobHRhYmxlICpobHQsIGNvbnN0IHZvaWQgKmtleSwgc3RydWN0IHJobGlzdF9oZWFkICpsaXN0LAorCWNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMpCit7CisJcmV0dXJuIFBUUl9FUlIoX19yaGFzaHRhYmxlX2luc2VydF9mYXN0KCZobHQtPmh0LCBrZXksICZsaXN0LT5yaGVhZCwKKwkJCQkJCXBhcmFtcywgdHJ1ZSkpOworfQorCisvKioKKyAqIHJobHRhYmxlX2luc2VydCAtIGluc2VydCBvYmplY3QgaW50byBoYXNoIGxpc3QgdGFibGUKKyAqIEBobHQ6CWhhc2ggbGlzdCB0YWJsZQorICogQGxpc3Q6CXBvaW50ZXIgdG8gaGFzaCBsaXN0IGhlYWQgaW5zaWRlIG9iamVjdAorICogQHBhcmFtczoJaGFzaCB0YWJsZSBwYXJhbWV0ZXJzCisgKgorICogV2lsbCB0YWtlIGEgcGVyIGJ1Y2tldCBzcGlubG9jayB0byBwcm90ZWN0IGFnYWluc3QgbXV0dWFsIG11dGF0aW9ucworICogb24gdGhlIHNhbWUgYnVja2V0LiBNdWx0aXBsZSBpbnNlcnRpb25zIG1heSBvY2N1ciBpbiBwYXJhbGxlbCB1bmxlc3MKKyAqIHRoZXkgbWFwIHRvIHRoZSBzYW1lIGJ1Y2tldCBsb2NrLgorICoKKyAqIEl0IGlzIHNhZmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20gYXRvbWljIGNvbnRleHQuCisgKgorICogV2lsbCB0cmlnZ2VyIGFuIGF1dG9tYXRpYyBkZWZlcnJlZCB0YWJsZSByZXNpemluZyBpZiB0aGUgc2l6ZSBncm93cworICogYmV5b25kIHRoZSB3YXRlcm1hcmsgaW5kaWNhdGVkIGJ5IGdyb3dfZGVjaXNpb24oKSB3aGljaCBjYW4gYmUgcGFzc2VkCisgKiB0byByaGFzaHRhYmxlX2luaXQoKS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcmhsdGFibGVfaW5zZXJ0KAorCXN0cnVjdCByaGx0YWJsZSAqaGx0LCBzdHJ1Y3QgcmhsaXN0X2hlYWQgKmxpc3QsCisJY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcykKK3sKKwljb25zdCBjaGFyICprZXkgPSByaHRfb2JqKCZobHQtPmh0LCAmbGlzdC0+cmhlYWQpOworCisJa2V5ICs9IHBhcmFtcy5rZXlfb2Zmc2V0OworCisJcmV0dXJuIHJobHRhYmxlX2luc2VydF9rZXkoaGx0LCBrZXksIGxpc3QsIHBhcmFtcyk7CiB9CiAKIC8qKgpAQCAtNzA0LDExICs4NjksMTYgQEAKIAljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQogewogCWNvbnN0IGNoYXIgKmtleSA9IHJodF9vYmooaHQsIG9iaik7CisJdm9pZCAqcmV0OwogCiAJQlVHX09OKGh0LT5wLm9ial9oYXNoZm4pOwogCi0JcmV0dXJuIF9fcmhhc2h0YWJsZV9pbnNlcnRfZmFzdChodCwga2V5ICsgaHQtPnAua2V5X29mZnNldCwgb2JqLAotCQkJCQlwYXJhbXMpOworCXJldCA9IF9fcmhhc2h0YWJsZV9pbnNlcnRfZmFzdChodCwga2V5ICsgaHQtPnAua2V5X29mZnNldCwgb2JqLCBwYXJhbXMsCisJCQkJICAgICAgIGZhbHNlKTsKKwlpZiAoSVNfRVJSKHJldCkpCisJCXJldHVybiBQVFJfRVJSKHJldCk7CisKKwlyZXR1cm4gcmV0ID09IE5VTEwgPyAwIDogLUVFWElTVDsKIH0KIAogLyoqCkBAIC03MzcsMTUgKzkwNyw0MiBAQAogCXN0cnVjdCByaGFzaHRhYmxlICpodCwgY29uc3Qgdm9pZCAqa2V5LCBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqLAogCWNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMpCiB7CisJdm9pZCAqcmV0OworCiAJQlVHX09OKCFodC0+cC5vYmpfaGFzaGZuIHx8ICFrZXkpOwogCi0JcmV0dXJuIF9fcmhhc2h0YWJsZV9pbnNlcnRfZmFzdChodCwga2V5LCBvYmosIHBhcmFtcyk7CisJcmV0ID0gX19yaGFzaHRhYmxlX2luc2VydF9mYXN0KGh0LCBrZXksIG9iaiwgcGFyYW1zLCBmYWxzZSk7CisJaWYgKElTX0VSUihyZXQpKQorCQlyZXR1cm4gUFRSX0VSUihyZXQpOworCisJcmV0dXJuIHJldCA9PSBOVUxMID8gMCA6IC1FRVhJU1Q7Cit9CisKKy8qKgorICogcmhhc2h0YWJsZV9sb29rdXBfZ2V0X2luc2VydF9rZXkgLSBsb29rdXAgYW5kIGluc2VydCBvYmplY3QgaW50byBoYXNoIHRhYmxlCisgKiBAaHQ6CQloYXNoIHRhYmxlCisgKiBAb2JqOglwb2ludGVyIHRvIGhhc2ggaGVhZCBpbnNpZGUgb2JqZWN0CisgKiBAcGFyYW1zOgloYXNoIHRhYmxlIHBhcmFtZXRlcnMKKyAqIEBkYXRhOglwb2ludGVyIHRvIGVsZW1lbnQgZGF0YSBhbHJlYWR5IGluIGhhc2hlcworICoKKyAqIEp1c3QgbGlrZSByaGFzaHRhYmxlX2xvb2t1cF9pbnNlcnRfa2V5KCksIGJ1dCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlCisgKiBvYmplY3QgaWYgaXQgZXhpc3RzLCBOVUxMIGlmIGl0IGRvZXMgbm90IGFuZCB0aGUgaW5zZXJ0aW9uIHdhcyBzdWNjZXNzZnVsLAorICogYW5kIGFuIEVSUl9QVFIgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKnJoYXNodGFibGVfbG9va3VwX2dldF9pbnNlcnRfa2V5KAorCXN0cnVjdCByaGFzaHRhYmxlICpodCwgY29uc3Qgdm9pZCAqa2V5LCBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqLAorCWNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMpCit7CisJQlVHX09OKCFodC0+cC5vYmpfaGFzaGZuIHx8ICFrZXkpOworCisJcmV0dXJuIF9fcmhhc2h0YWJsZV9pbnNlcnRfZmFzdChodCwga2V5LCBvYmosIHBhcmFtcywgZmFsc2UpOwogfQogCiAvKiBJbnRlcm5hbCBmdW5jdGlvbiwgcGxlYXNlIHVzZSByaGFzaHRhYmxlX3JlbW92ZV9mYXN0KCkgaW5zdGVhZCAqLwotc3RhdGljIGlubGluZSBpbnQgX19yaGFzaHRhYmxlX3JlbW92ZV9mYXN0KAorc3RhdGljIGlubGluZSBpbnQgX19yaGFzaHRhYmxlX3JlbW92ZV9mYXN0X29uZSgKIAlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCwKLQlzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqLCBjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQorCXN0cnVjdCByaGFzaF9oZWFkICpvYmosIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMsCisJYm9vbCByaGxpc3QpCiB7CiAJc3RydWN0IHJoYXNoX2hlYWQgX19yY3UgKipwcHJldjsKIAlzdHJ1Y3Qgcmhhc2hfaGVhZCAqaGU7CkBAIC03NjAsMTggKzk1Nyw4NiBAQAogCiAJcHByZXYgPSAmdGJsLT5idWNrZXRzW2hhc2hdOwogCXJodF9mb3JfZWFjaChoZSwgdGJsLCBoYXNoKSB7CisJCXN0cnVjdCByaGxpc3RfaGVhZCAqbGlzdDsKKworCQlsaXN0ID0gY29udGFpbmVyX29mKGhlLCBzdHJ1Y3QgcmhsaXN0X2hlYWQsIHJoZWFkKTsKKwogCQlpZiAoaGUgIT0gb2JqKSB7CisJCQlzdHJ1Y3QgcmhsaXN0X2hlYWQgX19yY3UgKipscHByZXY7CisKIAkJCXBwcmV2ID0gJmhlLT5uZXh0OwotCQkJY29udGludWU7CisKKwkJCWlmICghcmhsaXN0KQorCQkJCWNvbnRpbnVlOworCisJCQlkbyB7CisJCQkJbHBwcmV2ID0gJmxpc3QtPm5leHQ7CisJCQkJbGlzdCA9IHJodF9kZXJlZmVyZW5jZV9idWNrZXQobGlzdC0+bmV4dCwKKwkJCQkJCQkgICAgICB0YmwsIGhhc2gpOworCQkJfSB3aGlsZSAobGlzdCAmJiBvYmogIT0gJmxpc3QtPnJoZWFkKTsKKworCQkJaWYgKCFsaXN0KQorCQkJCWNvbnRpbnVlOworCisJCQlsaXN0ID0gcmh0X2RlcmVmZXJlbmNlX2J1Y2tldChsaXN0LT5uZXh0LCB0YmwsIGhhc2gpOworCQkJUkNVX0lOSVRfUE9JTlRFUigqbHBwcmV2LCBsaXN0KTsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKIAkJfQogCi0JCXJjdV9hc3NpZ25fcG9pbnRlcigqcHByZXYsIG9iai0+bmV4dCk7Ci0JCWVyciA9IDA7CisJCW9iaiA9IHJodF9kZXJlZmVyZW5jZV9idWNrZXQob2JqLT5uZXh0LCB0YmwsIGhhc2gpOworCQllcnIgPSAxOworCisJCWlmIChyaGxpc3QpIHsKKwkJCWxpc3QgPSByaHRfZGVyZWZlcmVuY2VfYnVja2V0KGxpc3QtPm5leHQsIHRibCwgaGFzaCk7CisJCQlpZiAobGlzdCkgeworCQkJCVJDVV9JTklUX1BPSU5URVIobGlzdC0+cmhlYWQubmV4dCwgb2JqKTsKKwkJCQlvYmogPSAmbGlzdC0+cmhlYWQ7CisJCQkJZXJyID0gMDsKKwkJCX0KKwkJfQorCisJCXJjdV9hc3NpZ25fcG9pbnRlcigqcHByZXYsIG9iaik7CiAJCWJyZWFrOwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKGxvY2spOwogCisJaWYgKGVyciA+IDApIHsKKwkJYXRvbWljX2RlYygmaHQtPm5lbGVtcyk7CisJCWlmICh1bmxpa2VseShodC0+cC5hdXRvbWF0aWNfc2hyaW5raW5nICYmCisJCQkgICAgIHJodF9zaHJpbmtfYmVsb3dfMzAoaHQsIHRibCkpKQorCQkJc2NoZWR1bGVfd29yaygmaHQtPnJ1bl93b3JrKTsKKwkJZXJyID0gMDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBJbnRlcm5hbCBmdW5jdGlvbiwgcGxlYXNlIHVzZSByaGFzaHRhYmxlX3JlbW92ZV9mYXN0KCkgaW5zdGVhZCAqLworc3RhdGljIGlubGluZSBpbnQgX19yaGFzaHRhYmxlX3JlbW92ZV9mYXN0KAorCXN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKKwljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zLCBib29sIHJobGlzdCkKK3sKKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICp0Ymw7CisJaW50IGVycjsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCXRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UoaHQtPnRibCwgaHQpOworCisJLyogQmVjYXVzZSB3ZSBoYXZlIGFscmVhZHkgdGFrZW4gKGFuZCByZWxlYXNlZCkgdGhlIGJ1Y2tldAorCSAqIGxvY2sgaW4gb2xkX3RibCwgaWYgd2UgZmluZCB0aGF0IGZ1dHVyZV90YmwgaXMgbm90IHlldAorCSAqIHZpc2libGUgdGhlbiB0aGF0IGd1YXJhbnRlZXMgdGhlIGVudHJ5IHRvIHN0aWxsIGJlIGluCisJICogdGhlIG9sZCB0YmwgaWYgaXQgZXhpc3RzLgorCSAqLworCXdoaWxlICgoZXJyID0gX19yaGFzaHRhYmxlX3JlbW92ZV9mYXN0X29uZShodCwgdGJsLCBvYmosIHBhcmFtcywKKwkJCQkJCSAgIHJobGlzdCkpICYmCisJICAgICAgICh0YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KHRibC0+ZnV0dXJlX3RibCwgaHQpKSkKKwkJOworCisJcmN1X3JlYWRfdW5sb2NrKCk7CisKIAlyZXR1cm4gZXJyOwogfQogCkBAIC03OTQsMzQgKzEwNTksMjkgQEAKIAlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIHN0cnVjdCByaGFzaF9oZWFkICpvYmosCiAJY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcykKIHsKLQlzdHJ1Y3QgYnVja2V0X3RhYmxlICp0Ymw7Ci0JaW50IGVycjsKKwlyZXR1cm4gX19yaGFzaHRhYmxlX3JlbW92ZV9mYXN0KGh0LCBvYmosIHBhcmFtcywgZmFsc2UpOworfQogCi0JcmN1X3JlYWRfbG9jaygpOwotCi0JdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShodC0+dGJsLCBodCk7Ci0KLQkvKiBCZWNhdXNlIHdlIGhhdmUgYWxyZWFkeSB0YWtlbiAoYW5kIHJlbGVhc2VkKSB0aGUgYnVja2V0Ci0JICogbG9jayBpbiBvbGRfdGJsLCBpZiB3ZSBmaW5kIHRoYXQgZnV0dXJlX3RibCBpcyBub3QgeWV0Ci0JICogdmlzaWJsZSB0aGVuIHRoYXQgZ3VhcmFudGVlcyB0aGUgZW50cnkgdG8gc3RpbGwgYmUgaW4KLQkgKiB0aGUgb2xkIHRibCBpZiBpdCBleGlzdHMuCi0JICovCi0Jd2hpbGUgKChlcnIgPSBfX3JoYXNodGFibGVfcmVtb3ZlX2Zhc3QoaHQsIHRibCwgb2JqLCBwYXJhbXMpKSAmJgotCSAgICAgICAodGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdSh0YmwtPmZ1dHVyZV90YmwsIGh0KSkpCi0JCTsKLQotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwotCi0JYXRvbWljX2RlYygmaHQtPm5lbGVtcyk7Ci0JaWYgKHVubGlrZWx5KGh0LT5wLmF1dG9tYXRpY19zaHJpbmtpbmcgJiYKLQkJICAgICByaHRfc2hyaW5rX2JlbG93XzMwKGh0LCB0YmwpKSkKLQkJc2NoZWR1bGVfd29yaygmaHQtPnJ1bl93b3JrKTsKLQotb3V0OgotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIGVycjsKKy8qKgorICogcmhsdGFibGVfcmVtb3ZlIC0gcmVtb3ZlIG9iamVjdCBmcm9tIGhhc2ggbGlzdCB0YWJsZQorICogQGhsdDoJaGFzaCBsaXN0IHRhYmxlCisgKiBAbGlzdDoJcG9pbnRlciB0byBoYXNoIGxpc3QgaGVhZCBpbnNpZGUgb2JqZWN0CisgKiBAcGFyYW1zOgloYXNoIHRhYmxlIHBhcmFtZXRlcnMKKyAqCisgKiBTaW5jZSB0aGUgaGFzaCBjaGFpbiBpcyBzaW5nbGUgbGlua2VkLCB0aGUgcmVtb3ZhbCBvcGVyYXRpb24gbmVlZHMgdG8KKyAqIHdhbGsgdGhlIGJ1Y2tldCBjaGFpbiB1cG9uIHJlbW92YWwuIFRoZSByZW1vdmFsIG9wZXJhdGlvbiBpcyB0aHVzCisgKiBjb25zaWRlcmFibGUgc2xvdyBpZiB0aGUgaGFzaCB0YWJsZSBpcyBub3QgY29ycmVjdGx5IHNpemVkLgorICoKKyAqIFdpbGwgYXV0b21hdGljYWxseSBzaHJpbmsgdGhlIHRhYmxlIHZpYSByaGFzaHRhYmxlX2V4cGFuZCgpIGlmIHRoZQorICogc2hyaW5rX2RlY2lzaW9uIGZ1bmN0aW9uIHNwZWNpZmllZCBhdCByaGFzaHRhYmxlX2luaXQoKSByZXR1cm5zIHRydWUuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIC1FTk9FTlQgaWYgdGhlIGVudHJ5IGNvdWxkIG5vdCBiZSBmb3VuZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcmhsdGFibGVfcmVtb3ZlKAorCXN0cnVjdCByaGx0YWJsZSAqaGx0LCBzdHJ1Y3QgcmhsaXN0X2hlYWQgKmxpc3QsCisJY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcykKK3sKKwlyZXR1cm4gX19yaGFzaHRhYmxlX3JlbW92ZV9mYXN0KCZobHQtPmh0LCAmbGlzdC0+cmhlYWQsIHBhcmFtcywgdHJ1ZSk7CiB9CiAKIC8qIEludGVybmFsIGZ1bmN0aW9uLCBwbGVhc2UgdXNlIHJoYXNodGFibGVfcmVwbGFjZV9mYXN0KCkgaW5zdGVhZCAqLwpAQCAtOTA2LDQgKzExNjYsNTkgQEAKIAlyZXR1cm4gZXJyOwogfQogCisvKiBPYnNvbGV0ZSBmdW5jdGlvbiwgZG8gbm90IHVzZSBpbiBuZXcgY29kZS4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJoYXNodGFibGVfd2Fsa19pbml0KHN0cnVjdCByaGFzaHRhYmxlICpodCwKKwkJCQkgICAgICAgc3RydWN0IHJoYXNodGFibGVfaXRlciAqaXRlciwgZ2ZwX3QgZ2ZwKQoreworCXJoYXNodGFibGVfd2Fsa19lbnRlcihodCwgaXRlcik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcmhsdGFibGVfd2Fsa19lbnRlciAtIEluaXRpYWxpc2UgYW4gaXRlcmF0b3IKKyAqIEBobHQ6CVRhYmxlIHRvIHdhbGsgb3ZlcgorICogQGl0ZXI6CUhhc2ggdGFibGUgSXRlcmF0b3IKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIGEgaGFzaCB0YWJsZSB3YWxrLgorICoKKyAqIE5vdGUgdGhhdCBpZiB5b3UgcmVzdGFydCBhIHdhbGsgYWZ0ZXIgcmhhc2h0YWJsZV93YWxrX3N0b3AgeW91CisgKiBtYXkgc2VlIHRoZSBzYW1lIG9iamVjdCB0d2ljZS4gIEFsc28sIHlvdSBtYXkgbWlzcyBvYmplY3RzIGlmCisgKiB0aGVyZSBhcmUgcmVtb3ZhbHMgaW4gYmV0d2VlbiByaGFzaHRhYmxlX3dhbGtfc3RvcCBhbmQgdGhlIG5leHQKKyAqIGNhbGwgdG8gcmhhc2h0YWJsZV93YWxrX3N0YXJ0LgorICoKKyAqIEZvciBhIGNvbXBsZXRlbHkgc3RhYmxlIHdhbGsgeW91IHNob3VsZCBjb25zdHJ1Y3QgeW91ciBvd24gZGF0YQorICogc3RydWN0dXJlIG91dHNpZGUgdGhlIGhhc2ggdGFibGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgc28geW91IG11c3Qgbm90IGNhbGwgaXQgZnJvbSBpbnRlcnJ1cHQKKyAqIGNvbnRleHQgb3Igd2l0aCBzcGluIGxvY2tzIGhlbGQuCisgKgorICogWW91IG11c3QgY2FsbCByaGFzaHRhYmxlX3dhbGtfZXhpdCBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByaGx0YWJsZV93YWxrX2VudGVyKHN0cnVjdCByaGx0YWJsZSAqaGx0LAorCQkJCSAgICAgICBzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICppdGVyKQoreworCXJldHVybiByaGFzaHRhYmxlX3dhbGtfZW50ZXIoJmhsdC0+aHQsIGl0ZXIpOworfQorCisvKioKKyAqIHJobHRhYmxlX2ZyZWVfYW5kX2Rlc3Ryb3kgLSBmcmVlIGVsZW1lbnRzIGFuZCBkZXN0cm95IGhhc2ggbGlzdCB0YWJsZQorICogQGhsdDoJdGhlIGhhc2ggbGlzdCB0YWJsZSB0byBkZXN0cm95CisgKiBAZnJlZV9mbjoJY2FsbGJhY2sgdG8gcmVsZWFzZSByZXNvdXJjZXMgb2YgZWxlbWVudAorICogQGFyZzoJcG9pbnRlciBwYXNzZWQgdG8gZnJlZV9mbgorICoKKyAqIFNlZSBkb2N1bWVudGF0aW9uIGZvciByaGFzaHRhYmxlX2ZyZWVfYW5kX2Rlc3Ryb3kuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByaGx0YWJsZV9mcmVlX2FuZF9kZXN0cm95KHN0cnVjdCByaGx0YWJsZSAqaGx0LAorCQkJCQkgICAgIHZvaWQgKCpmcmVlX2ZuKSh2b2lkICpwdHIsCisJCQkJCQkJICAgICB2b2lkICphcmcpLAorCQkJCQkgICAgIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gcmhhc2h0YWJsZV9mcmVlX2FuZF9kZXN0cm95KCZobHQtPmh0LCBmcmVlX2ZuLCBhcmcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmhsdGFibGVfZGVzdHJveShzdHJ1Y3QgcmhsdGFibGUgKmhsdCkKK3sKKwlyZXR1cm4gcmhsdGFibGVfZnJlZV9hbmRfZGVzdHJveShobHQsIE5VTEwsIE5VTEwpOworfQorCiAjZW5kaWYgLyogX0xJTlVYX1JIQVNIVEFCTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaCBiL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmgKaW5kZXggMmRhZWNlOC4uNTdlNTQ4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oCkBAIC0xMDUsNyArMTA1LDcgQEAKIAkJCSAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZmlsdGVyX2RldiwKLQkJCSAgICAgaW50IGlkeCk7CisJCQkgICAgIGludCAqaWR4KTsKIGV4dGVybiBpbnQgbmRvX2RmbHRfZmRiX2FkZChzdHJ1Y3QgbmRtc2cgKm5kbSwKIAkJCSAgICBzdHJ1Y3QgbmxhdHRyICp0YltdLAogCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKaW5kZXggNjJjNjhlNS4uNzU0M2E0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtNDQ4LDYgKzQ0OCw4IEBACiAJaW9fc2NoZWR1bGVfdGltZW91dChNQVhfU0NIRURVTEVfVElNRU9VVCk7CiB9CiAKK3ZvaWQgX19ub3JldHVybiBkb190YXNrX2RlYWQodm9pZCk7CisKIHN0cnVjdCBuc3Byb3h5Owogc3RydWN0IHVzZXJfbmFtZXNwYWNlOwogCkBAIC0xMDIyLDcgKzEwMjQsOCBAQAogI2RlZmluZSBTRF9CQUxBTkNFX0ZPUksJCTB4MDAwOAkvKiBCYWxhbmNlIG9uIGZvcmssIGNsb25lICovCiAjZGVmaW5lIFNEX0JBTEFOQ0VfV0FLRQkJMHgwMDEwICAvKiBCYWxhbmNlIG9uIHdha2V1cCAqLwogI2RlZmluZSBTRF9XQUtFX0FGRklORQkJMHgwMDIwCS8qIFdha2UgdGFzayB0byB3YWtpbmcgQ1BVICovCi0jZGVmaW5lIFNEX1NIQVJFX0NQVUNBUEFDSVRZCTB4MDA4MAkvKiBEb21haW4gbWVtYmVycyBzaGFyZSBjcHUgcG93ZXIgKi8KKyNkZWZpbmUgU0RfQVNZTV9DUFVDQVBBQ0lUWQkweDAwNDAgIC8qIEdyb3VwcyBoYXZlIGRpZmZlcmVudCBtYXggY3B1IGNhcGFjaXRpZXMgKi8KKyNkZWZpbmUgU0RfU0hBUkVfQ1BVQ0FQQUNJVFkJMHgwMDgwCS8qIERvbWFpbiBtZW1iZXJzIHNoYXJlIGNwdSBjYXBhY2l0eSAqLwogI2RlZmluZSBTRF9TSEFSRV9QT1dFUkRPTUFJTgkweDAxMDAJLyogRG9tYWluIG1lbWJlcnMgc2hhcmUgcG93ZXIgZG9tYWluICovCiAjZGVmaW5lIFNEX1NIQVJFX1BLR19SRVNPVVJDRVMJMHgwMjAwCS8qIERvbWFpbiBtZW1iZXJzIHNoYXJlIGNwdSBwa2cgcmVzb3VyY2VzICovCiAjZGVmaW5lIFNEX1NFUklBTElaRQkJMHgwNDAwCS8qIE9ubHkgYSBzaW5nbGUgbG9hZCBiYWxhbmNpbmcgaW5zdGFuY2UgKi8KQEAgLTEwNjQsNiArMTA2NywxMiBAQAogCiBzdHJ1Y3Qgc2NoZWRfZ3JvdXA7CiAKK3N0cnVjdCBzY2hlZF9kb21haW5fc2hhcmVkIHsKKwlhdG9taWNfdAlyZWY7CisJYXRvbWljX3QJbnJfYnVzeV9jcHVzOworCWludAkJaGFzX2lkbGVfY29yZXM7Cit9OworCiBzdHJ1Y3Qgc2NoZWRfZG9tYWluIHsKIAkvKiBUaGVzZSBmaWVsZHMgbXVzdCBiZSBzZXR1cCAqLwogCXN0cnVjdCBzY2hlZF9kb21haW4gKnBhcmVudDsJLyogdG9wIGRvbWFpbiBtdXN0IGJlIG51bGwgdGVybWluYXRlZCAqLwpAQCAtMTA5NCw2ICsxMTAzLDggQEAKIAl1NjQgbWF4X25ld2lkbGVfbGJfY29zdDsKIAl1bnNpZ25lZCBsb25nIG5leHRfZGVjYXlfbWF4X2xiX2Nvc3Q7CiAKKwl1NjQgYXZnX3NjYW5fY29zdDsJCS8qIHNlbGVjdF9pZGxlX3NpYmxpbmcgKi8KKwogI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCiAJLyogbG9hZF9iYWxhbmNlKCkgc3RhdHMgKi8KIAl1bnNpZ25lZCBpbnQgbGJfY291bnRbQ1BVX01BWF9JRExFX1RZUEVTXTsKQEAgLTExMzIsNiArMTE0Myw3IEBACiAJCXZvaWQgKnByaXZhdGU7CQkvKiB1c2VkIGR1cmluZyBjb25zdHJ1Y3Rpb24gKi8KIAkJc3RydWN0IHJjdV9oZWFkIHJjdTsJLyogdXNlZCBkdXJpbmcgZGVzdHJ1Y3Rpb24gKi8KIAl9OworCXN0cnVjdCBzY2hlZF9kb21haW5fc2hhcmVkICpzaGFyZWQ7CiAKIAl1bnNpZ25lZCBpbnQgc3Bhbl93ZWlnaHQ7CiAJLyoKQEAgLTExNjUsNiArMTE3Nyw3IEBACiAKIHN0cnVjdCBzZF9kYXRhIHsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICoqX19wZXJjcHUgc2Q7CisJc3RydWN0IHNjaGVkX2RvbWFpbl9zaGFyZWQgKipfX3BlcmNwdSBzZHM7CiAJc3RydWN0IHNjaGVkX2dyb3VwICoqX19wZXJjcHUgc2c7CiAJc3RydWN0IHNjaGVkX2dyb3VwX2NhcGFjaXR5ICoqX19wZXJjcHUgc2djOwogfTsKQEAgLTE0NTgsNiArMTQ3MSwxMyBAQAogfTsKIAogc3RydWN0IHRhc2tfc3RydWN0IHsKKyNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSworCS8qCisJICogRm9yIHJlYXNvbnMgb2YgaGVhZGVyIHNvdXAgKHNlZSBjdXJyZW50X3RocmVhZF9pbmZvKCkpLCB0aGlzCisJICogbXVzdCBiZSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0YXNrX3N0cnVjdC4KKwkgKi8KKwlzdHJ1Y3QgdGhyZWFkX2luZm8gdGhyZWFkX2luZm87CisjZW5kaWYKIAl2b2xhdGlsZSBsb25nIHN0YXRlOwkvKiAtMSB1bnJ1bm5hYmxlLCAwIHJ1bm5hYmxlLCA+MCBzdG9wcGVkICovCiAJdm9pZCAqc3RhY2s7CiAJYXRvbWljX3QgdXNhZ2U7CkBAIC0xNDY3LDYgKzE0ODcsOSBAQAogI2lmZGVmIENPTkZJR19TTVAKIAlzdHJ1Y3QgbGxpc3Rfbm9kZSB3YWtlX2VudHJ5OwogCWludCBvbl9jcHU7CisjaWZkZWYgQ09ORklHX1RIUkVBRF9JTkZPX0lOX1RBU0sKKwl1bnNpZ25lZCBpbnQgY3B1OwkvKiBjdXJyZW50IENQVSAqLworI2VuZGlmCiAJdW5zaWduZWQgaW50IHdha2VlX2ZsaXBzOwogCXVuc2lnbmVkIGxvbmcgd2FrZWVfZmxpcF9kZWNheV90czsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmxhc3Rfd2FrZWU7CkBAIC0xOTIzLDYgKzE5NDYsMTMgQEAKICNpZmRlZiBDT05GSUdfTU1VCiAJc3RydWN0IHRhc2tfc3RydWN0ICpvb21fcmVhcGVyX2xpc3Q7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworCXN0cnVjdCB2bV9zdHJ1Y3QgKnN0YWNrX3ZtX2FyZWE7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSworCS8qIEEgbGl2ZSB0YXNrIGhvbGRzIG9uZSByZWZlcmVuY2UuICovCisJYXRvbWljX3Qgc3RhY2tfcmVmY291bnQ7CisjZW5kaWYKIC8qIENQVS1zcGVjaWZpYyBzdGF0ZSBvZiB0aGlzIHRhc2sgKi8KIAlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCB0aHJlYWQ7CiAvKgpAQCAtMTkzOSw2ICsxOTY5LDE4IEBACiAjIGRlZmluZSBhcmNoX3Rhc2tfc3RydWN0X3NpemUgKHNpemVvZihzdHJ1Y3QgdGFza19zdHJ1Y3QpKQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworc3RhdGljIGlubGluZSBzdHJ1Y3Qgdm1fc3RydWN0ICp0YXNrX3N0YWNrX3ZtX2FyZWEoY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICp0KQoreworCXJldHVybiB0LT5zdGFja192bV9hcmVhOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZtX3N0cnVjdCAqdGFza19zdGFja192bV9hcmVhKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCiAvKiBGdXR1cmUtc2FmZSBhY2Nlc3NvciBmb3Igc3RydWN0IHRhc2tfc3RydWN0J3MgY3B1c19hbGxvd2VkLiAqLwogI2RlZmluZSB0c2tfY3B1c19hbGxvd2VkKHRzaykgKCYodHNrKS0+Y3B1c19hbGxvd2VkKQogCkBAIC0yNTY4LDEyICsyNjEwLDE0IEBACiAJcmV0dXJuIHAtPnBpZCA9PSAwOwogfQogZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqY3Vycl90YXNrKGludCBjcHUpOwotZXh0ZXJuIHZvaWQgc2V0X2N1cnJfdGFzayhpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOworZXh0ZXJuIHZvaWQgaWE2NF9zZXRfY3Vycl90YXNrKGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiAKIHZvaWQgeWllbGQodm9pZCk7CiAKIHVuaW9uIHRocmVhZF91bmlvbiB7CisjaWZuZGVmIENPTkZJR19USFJFQURfSU5GT19JTl9UQVNLCiAJc3RydWN0IHRocmVhZF9pbmZvIHRocmVhZF9pbmZvOworI2VuZGlmCiAJdW5zaWduZWQgbG9uZyBzdGFja1tUSFJFQURfU0laRS9zaXplb2YobG9uZyldOwogfTsKIApAQCAtMzA2MSwxMCArMzEwNSwzNCBAQAogCWNncm91cF90aHJlYWRncm91cF9jaGFuZ2VfZW5kKHRzayk7CiB9CiAKLSNpZm5kZWYgX19IQVZFX1RIUkVBRF9GVU5DVElPTlMKKyNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0aHJlYWRfaW5mbyAqdGFza190aHJlYWRfaW5mbyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJcmV0dXJuICZ0YXNrLT50aHJlYWRfaW5mbzsKK30KKworLyoKKyAqIFdoZW4gYWNjZXNzaW5nIHRoZSBzdGFjayBvZiBhIG5vbi1jdXJyZW50IHRhc2sgdGhhdCBtaWdodCBleGl0LCB1c2UKKyAqIHRyeV9nZXRfdGFza19zdGFjaygpIGluc3RlYWQuICB0YXNrX3N0YWNrX3BhZ2Ugd2lsbCByZXR1cm4gYSBwb2ludGVyCisgKiB0aGF0IGNvdWxkIGdldCBmcmVlZCBvdXQgZnJvbSB1bmRlciB5b3UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqdGFza19zdGFja19wYWdlKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlyZXR1cm4gdGFzay0+c3RhY2s7Cit9CisKKyNkZWZpbmUgc2V0dXBfdGhyZWFkX3N0YWNrKG5ldyxvbGQpCWRvIHsgfSB3aGlsZSgwKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgKmVuZF9vZl9zdGFjayhjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJcmV0dXJuIHRhc2stPnN0YWNrOworfQorCisjZWxpZiAhZGVmaW5lZChfX0hBVkVfVEhSRUFEX0ZVTkNUSU9OUykKIAogI2RlZmluZSB0YXNrX3RocmVhZF9pbmZvKHRhc2spCSgoc3RydWN0IHRocmVhZF9pbmZvICopKHRhc2spLT5zdGFjaykKLSNkZWZpbmUgdGFza19zdGFja19wYWdlKHRhc2spCSgodGFzayktPnN0YWNrKQorI2RlZmluZSB0YXNrX3N0YWNrX3BhZ2UodGFzaykJKCh2b2lkICopKHRhc2spLT5zdGFjaykKIAogc3RhdGljIGlubGluZSB2b2lkIHNldHVwX3RocmVhZF9zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqb3JnKQogewpAQCAtMzA5MSw2ICszMTU5LDI0IEBACiB9CiAKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX1RIUkVBRF9JTkZPX0lOX1RBU0sKK3N0YXRpYyBpbmxpbmUgdm9pZCAqdHJ5X2dldF90YXNrX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXJldHVybiBhdG9taWNfaW5jX25vdF96ZXJvKCZ0c2stPnN0YWNrX3JlZmNvdW50KSA/CisJCXRhc2tfc3RhY2tfcGFnZSh0c2spIDogTlVMTDsKK30KKworZXh0ZXJuIHZvaWQgcHV0X3Rhc2tfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCAqdHJ5X2dldF90YXNrX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXJldHVybiB0YXNrX3N0YWNrX3BhZ2UodHNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF90YXNrX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKSB7fQorI2VuZGlmCisKICNkZWZpbmUgdGFza19zdGFja19lbmRfY29ycnVwdGVkKHRhc2spIFwKIAkJKCooZW5kX29mX3N0YWNrKHRhc2spKSAhPSBTVEFDS19FTkRfTUFHSUMpCiAKQEAgLTMyMDYsNyArMzI5MiwxMSBAQAogICogY29uZF9yZXNjaGVkX2xvY2soKSB3aWxsIGRyb3AgdGhlIHNwaW5sb2NrIGJlZm9yZSBzY2hlZHVsaW5nLAogICogY29uZF9yZXNjaGVkX3NvZnRpcnEoKSB3aWxsIGVuYWJsZSBiaHMgYmVmb3JlIHNjaGVkdWxpbmcuCiAgKi8KKyNpZm5kZWYgQ09ORklHX1BSRUVNUFQKIGV4dGVybiBpbnQgX2NvbmRfcmVzY2hlZCh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBfY29uZF9yZXNjaGVkKHZvaWQpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgogCiAjZGVmaW5lIGNvbmRfcmVzY2hlZCgpICh7CQkJXAogCV9fX21pZ2h0X3NsZWVwKF9fRklMRV9fLCBfX0xJTkVfXywgMCk7CVwKQEAgLTMyMzYsNiArMzMyNiwxNSBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfcHJlZW1wdF9kaXNhYmxlX2lwKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKyNpZmRlZiBDT05GSUdfREVCVUdfUFJFRU1QVAorCXJldHVybiBwLT5wcmVlbXB0X2Rpc2FibGVfaXA7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKIC8qCiAgKiBEb2VzIGEgY3JpdGljYWwgc2VjdGlvbiBuZWVkIHRvIGJlIGJyb2tlbiBkdWUgdG8gYW5vdGhlcgogICogdGFzayB3YWl0aW5nPzogKHRlY2huaWNhbGx5IGRvZXMgbm90IGRlcGVuZCBvbiBDT05GSUdfUFJFRU1QVCwKQEAgLTMzNjQsNyArMzQ2MywxMSBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB0YXNrX2NwdShjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CisjaWZkZWYgQ09ORklHX1RIUkVBRF9JTkZPX0lOX1RBU0sKKwlyZXR1cm4gcC0+Y3B1OworI2Vsc2UKIAlyZXR1cm4gdGFza190aHJlYWRfaW5mbyhwKS0+Y3B1OworI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHRhc2tfbm9kZShjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCkBAIC0zNDY5LDE1ICszNTcyLDIwIEBACiAJcmV0dXJuIHRhc2tfcmxpbWl0X21heChjdXJyZW50LCBsaW1pdCk7CiB9CiAKKyNkZWZpbmUgU0NIRURfQ1BVRlJFUV9SVAkoMVUgPDwgMCkKKyNkZWZpbmUgU0NIRURfQ1BVRlJFUV9ETAkoMVUgPDwgMSkKKyNkZWZpbmUgU0NIRURfQ1BVRlJFUV9JT1dBSVQJKDFVIDw8IDIpCisKKyNkZWZpbmUgU0NIRURfQ1BVRlJFUV9SVF9ETAkoU0NIRURfQ1BVRlJFUV9SVCB8IFNDSEVEX0NQVUZSRVFfREwpCisKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKIHN0cnVjdCB1cGRhdGVfdXRpbF9kYXRhIHsKLQl2b2lkICgqZnVuYykoc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGEsCi0JCSAgICAgdTY0IHRpbWUsIHVuc2lnbmVkIGxvbmcgdXRpbCwgdW5zaWduZWQgbG9uZyBtYXgpOworICAgICAgIHZvaWQgKCpmdW5jKShzdHJ1Y3QgdXBkYXRlX3V0aWxfZGF0YSAqZGF0YSwgdTY0IHRpbWUsIHVuc2lnbmVkIGludCBmbGFncyk7CiB9OwogCiB2b2lkIGNwdWZyZXFfYWRkX3VwZGF0ZV91dGlsX2hvb2soaW50IGNwdSwgc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGEsCi0JCQl2b2lkICgqZnVuYykoc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGEsIHU2NCB0aW1lLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyB1dGlsLCB1bnNpZ25lZCBsb25nIG1heCkpOworICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZnVuYykoc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGEsIHU2NCB0aW1lLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpKTsKIHZvaWQgY3B1ZnJlcV9yZW1vdmVfdXBkYXRlX3V0aWxfaG9vayhpbnQgY3B1KTsKICNlbmRpZiAvKiBDT05GSUdfQ1BVX0ZSRVEgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY3RwLmggYi9pbmNsdWRlL2xpbnV4L3NjdHAuaAppbmRleCBkZTFmNjQzLi5mY2I0YzM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjdHAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjdHAuaApAQCAtNzA1LDcwICs3MDUsNiBAQAogCXNjdHBfYXV0aGhkcl90IGF1dGhfaGRyOwogfSBfX3BhY2tlZCBzY3RwX2F1dGhfY2h1bmtfdDsKIAotc3RydWN0IHNjdHBfaW5mbyB7Ci0JX191MzIJc2N0cGlfdGFnOwotCV9fdTMyCXNjdHBpX3N0YXRlOwotCV9fdTMyCXNjdHBpX3J3bmQ7Ci0JX191MTYJc2N0cGlfdW5hY2tkYXRhOwotCV9fdTE2CXNjdHBpX3BlbmRkYXRhOwotCV9fdTE2CXNjdHBpX2luc3RybXM7Ci0JX191MTYJc2N0cGlfb3V0c3RybXM7Ci0JX191MzIJc2N0cGlfZnJhZ21lbnRhdGlvbl9wb2ludDsKLQlfX3UzMglzY3RwaV9pbnF1ZXVlOwotCV9fdTMyCXNjdHBpX291dHF1ZXVlOwotCV9fdTMyCXNjdHBpX292ZXJhbGxfZXJyb3I7Ci0JX191MzIJc2N0cGlfbWF4X2J1cnN0OwotCV9fdTMyCXNjdHBpX21heHNlZzsKLQlfX3UzMglzY3RwaV9wZWVyX3J3bmQ7Ci0JX191MzIJc2N0cGlfcGVlcl90YWc7Ci0JX191OAlzY3RwaV9wZWVyX2NhcGFibGU7Ci0JX191OAlzY3RwaV9wZWVyX3NhY2s7Ci0JX191MTYJX19yZXNlcnZlZDE7Ci0KLQkvKiBhc3NvYyBzdGF0dXMgaW5mbyAqLwotCV9fdTY0CXNjdHBpX2lzYWNrczsKLQlfX3U2NAlzY3RwaV9vc2Fja3M7Ci0JX191NjQJc2N0cGlfb3BhY2tldHM7Ci0JX191NjQJc2N0cGlfaXBhY2tldHM7Ci0JX191NjQJc2N0cGlfcnR4Y2h1bmtzOwotCV9fdTY0CXNjdHBpX291dG9mc2VxdHNuczsKLQlfX3U2NAlzY3RwaV9pZHVwY2h1bmtzOwotCV9fdTY0CXNjdHBpX2dhcGNudDsKLQlfX3U2NAlzY3RwaV9vdW9kY2h1bmtzOwotCV9fdTY0CXNjdHBpX2l1b2RjaHVua3M7Ci0JX191NjQJc2N0cGlfb29kY2h1bmtzOwotCV9fdTY0CXNjdHBpX2lvZGNodW5rczsKLQlfX3U2NAlzY3RwaV9vY3RybGNodW5rczsKLQlfX3U2NAlzY3RwaV9pY3RybGNodW5rczsKLQotCS8qIHByaW1hcnkgdHJhbnNwb3J0IGluZm8gKi8KLQlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZQlzY3RwaV9wX2FkZHJlc3M7Ci0JX19zMzIJc2N0cGlfcF9zdGF0ZTsKLQlfX3UzMglzY3RwaV9wX2N3bmQ7Ci0JX191MzIJc2N0cGlfcF9zcnR0OwotCV9fdTMyCXNjdHBpX3BfcnRvOwotCV9fdTMyCXNjdHBpX3BfaGJpbnRlcnZhbDsKLQlfX3UzMglzY3RwaV9wX3BhdGhtYXhyeHQ7Ci0JX191MzIJc2N0cGlfcF9zYWNrZGVsYXk7Ci0JX191MzIJc2N0cGlfcF9zYWNrZnJlcTsKLQlfX3UzMglzY3RwaV9wX3NzdGhyZXNoOwotCV9fdTMyCXNjdHBpX3BfcGFydGlhbF9ieXRlc19hY2tlZDsKLQlfX3UzMglzY3RwaV9wX2ZsaWdodF9zaXplOwotCV9fdTE2CXNjdHBpX3BfZXJyb3I7Ci0JX191MTYJX19yZXNlcnZlZDI7Ci0KLQkvKiBzY3RwIHNvY2sgaW5mbyAqLwotCV9fdTMyCXNjdHBpX3NfYXV0b2Nsb3NlOwotCV9fdTMyCXNjdHBpX3NfYWRhcHRhdGlvbl9pbmQ7Ci0JX191MzIJc2N0cGlfc19wZF9wb2ludDsKLQlfX3U4CXNjdHBpX3Nfbm9kZWxheTsKLQlfX3U4CXNjdHBpX3NfZGlzYWJsZV9mcmFnbWVudHM7Ci0JX191OAlzY3RwaV9zX3Y0bWFwcGVkOwotCV9fdTgJc2N0cGlfc19mcmFnX2ludGVybGVhdmU7Ci0JX191MzIJc2N0cGlfc190eXBlOwotCV9fdTMyCV9fcmVzZXJ2ZWQzOwotfTsKLQogc3RydWN0IHNjdHBfaW5mb3ggewogCXN0cnVjdCBzY3RwX2luZm8gKnNjdHBpbmZvOwogCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oIGIvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCmluZGV4IDc4MzFjZDUuLmMyMTI1ZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKQEAgLTI0Miw2ICsyNDIsMTAgQEAKIGludCBzZWN1cml0eV9kZW50cnlfaW5pdF9zZWN1cml0eShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAogCQkJCQljb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwgdm9pZCAqKmN0eCwKIAkJCQkJdTMyICpjdHhsZW4pOworaW50IHNlY3VyaXR5X2RlbnRyeV9jcmVhdGVfZmlsZXNfYXMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJCQkJc3RydWN0IHFzdHIgKm5hbWUsCisJCQkJCWNvbnN0IHN0cnVjdCBjcmVkICpvbGQsCisJCQkJCXN0cnVjdCBjcmVkICpuZXcpOwogCiBpbnQgc2VjdXJpdHlfaW5vZGVfYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSk7CiB2b2lkIHNlY3VyaXR5X2lub2RlX2ZyZWUoc3RydWN0IGlub2RlICppbm9kZSk7CkBAIC0yODIsNiArMjg2LDggQEAKIGludCBzZWN1cml0eV9pbm9kZV9zZXRzZWN1cml0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncyk7CiBpbnQgc2VjdXJpdHlfaW5vZGVfbGlzdHNlY3VyaXR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKTsKIHZvaWQgc2VjdXJpdHlfaW5vZGVfZ2V0c2VjaWQoc3RydWN0IGlub2RlICppbm9kZSwgdTMyICpzZWNpZCk7CitpbnQgc2VjdXJpdHlfaW5vZGVfY29weV91cChzdHJ1Y3QgZGVudHJ5ICpzcmMsIHN0cnVjdCBjcmVkICoqbmV3KTsKK2ludCBzZWN1cml0eV9pbm9kZV9jb3B5X3VwX3hhdHRyKGNvbnN0IGNoYXIgKm5hbWUpOwogaW50IHNlY3VyaXR5X2ZpbGVfcGVybWlzc2lvbihzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1hc2spOwogaW50IHNlY3VyaXR5X2ZpbGVfYWxsb2Moc3RydWN0IGZpbGUgKmZpbGUpOwogdm9pZCBzZWN1cml0eV9maWxlX2ZyZWUoc3RydWN0IGZpbGUgKmZpbGUpOwpAQCAtMzA3LDcgKzMxMyw2IEBACiBpbnQgc2VjdXJpdHlfa2VybmVsX2FjdF9hcyhzdHJ1Y3QgY3JlZCAqbmV3LCB1MzIgc2VjaWQpOwogaW50IHNlY3VyaXR5X2tlcm5lbF9jcmVhdGVfZmlsZXNfYXMoc3RydWN0IGNyZWQgKm5ldywgc3RydWN0IGlub2RlICppbm9kZSk7CiBpbnQgc2VjdXJpdHlfa2VybmVsX21vZHVsZV9yZXF1ZXN0KGNoYXIgKmttb2RfbmFtZSk7Ci1pbnQgc2VjdXJpdHlfa2VybmVsX21vZHVsZV9mcm9tX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUpOwogaW50IHNlY3VyaXR5X2tlcm5lbF9yZWFkX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIGVudW0ga2VybmVsX3JlYWRfZmlsZV9pZCBpZCk7CiBpbnQgc2VjdXJpdHlfa2VybmVsX3Bvc3RfcmVhZF9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIGxvZmZfdCBzaXplLAogCQkJCSAgIGVudW0ga2VybmVsX3JlYWRfZmlsZV9pZCBpZCk7CkBAIC01OTgsNiArNjAzLDE0IEBACiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCitzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9kZW50cnlfY3JlYXRlX2ZpbGVzX2FzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkJCSAgaW50IG1vZGUsIHN0cnVjdCBxc3RyICpuYW1lLAorCQkJCQkJICBjb25zdCBzdHJ1Y3QgY3JlZCAqb2xkLAorCQkJCQkJICBzdHJ1Y3QgY3JlZCAqbmV3KQoreworCXJldHVybiAwOworfQorCiAKIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX2luaXRfc2VjdXJpdHkoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJCXN0cnVjdCBpbm9kZSAqZGlyLApAQCAtNzU4LDYgKzc3MSwxNiBAQAogCSpzZWNpZCA9IDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX2NvcHlfdXAoc3RydWN0IGRlbnRyeSAqc3JjLCBzdHJ1Y3QgY3JlZCAqKm5ldykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfaW5vZGVfY29weV91cF94YXR0cihjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfZmlsZV9wZXJtaXNzaW9uKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgbWFzaykKIHsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaAppbmRleCA5MjMyNjZjLi40OGVjNzY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfODI1MC5oCkBAIC0xMTEsNyArMTExLDYgQEAKIAkJCQkJCSAqICAgaWYgbm9fY29uc29sZV9zdXNwZW5kCiAJCQkJCQkgKi8KIAl1bnNpZ25lZCBjaGFyCQlwcm9iZTsKLQlzdHJ1Y3QgbWN0cmxfZ3Bpb3MJKmdwaW9zOwogI2RlZmluZSBVQVJUX1BST0JFX1JTQQkoMSA8PCAwKQogCiAJLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAppbmRleCAyZjQ0ZTIwLi4zNDQyMDE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCkBAIC0zNjcsMTQgKzM2NywyMSBAQAogCiAjZGVmaW5lIEVBUkxZQ09OX0RFQ0xBUkUoX25hbWUsIGZuKQlPRl9FQVJMWUNPTl9ERUNMQVJFKF9uYW1lLCAiIiwgZm4pCiAKLWV4dGVybiBpbnQgc2V0dXBfZWFybHljb24oY2hhciAqYnVmKTsKIGV4dGVybiBpbnQgb2Zfc2V0dXBfZWFybHljb24oY29uc3Qgc3RydWN0IGVhcmx5Y29uX2lkICptYXRjaCwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBub2RlLAogCQkJICAgICBjb25zdCBjaGFyICpvcHRpb25zKTsKIAorI2lmZGVmIENPTkZJR19TRVJJQUxfRUFSTFlDT04KK2V4dGVybiBib29sIGVhcmx5Y29uX2luaXRfaXNfZGVmZXJyZWQgX19pbml0ZGF0YTsKK2ludCBzZXR1cF9lYXJseWNvbihjaGFyICpidWYpOworI2Vsc2UKK3N0YXRpYyBjb25zdCBib29sIGVhcmx5Y29uX2luaXRfaXNfZGVmZXJyZWQ7CitzdGF0aWMgaW5saW5lIGludCBzZXR1cF9lYXJseWNvbihjaGFyICpidWYpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgorCiBzdHJ1Y3QgdWFydF9wb3J0ICp1YXJ0X2dldF9jb25zb2xlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnRzLCBpbnQgbnIsCiAJCQkJICAgc3RydWN0IGNvbnNvbGUgKmMpOwotaW50IHVhcnRfcGFyc2VfZWFybHljb24oY2hhciAqcCwgdW5zaWduZWQgY2hhciAqaW90eXBlLCB1bnNpZ25lZCBsb25nICphZGRyLAoraW50IHVhcnRfcGFyc2VfZWFybHljb24oY2hhciAqcCwgdW5zaWduZWQgY2hhciAqaW90eXBlLCByZXNvdXJjZV9zaXplX3QgKmFkZHIsCiAJCQljaGFyICoqb3B0aW9ucyk7CiB2b2lkIHVhcnRfcGFyc2Vfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBpbnQgKmJhdWQsIGludCAqcGFyaXR5LCBpbnQgKmJpdHMsCiAJCQlpbnQgKmZsb3cpOwpAQCAtNDEyLDcgKzQxOSw3IEBACiBzdGF0aWMgaW5saW5lIGludCB1YXJ0X3R4X3N0b3BwZWQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+c3RhdGUtPnBvcnQudHR5OwotCWlmICh0dHktPnN0b3BwZWQgfHwgcG9ydC0+aHdfc3RvcHBlZCkKKwlpZiAoKHR0eSAmJiB0dHktPnN0b3BwZWQpIHx8IHBvcnQtPmh3X3N0b3BwZWQpCiAJCXJldHVybiAxOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaCBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKaW5kZXggNmYwYjNlMC4uOWJmNjBiNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCkBAIC02MTIsNyArNjEyLDYgQEAKICAqCUBub19mY3M6ICBSZXF1ZXN0IE5JQyB0byB0cmVhdCBsYXN0IDQgYnl0ZXMgYXMgRXRoZXJuZXQgRkNTCiAgICoJQG5hcGlfaWQ6IGlkIG9mIHRoZSBOQVBJIHN0cnVjdCB0aGlzIHNrYiBjYW1lIGZyb20KICAqCUBzZWNtYXJrOiBzZWN1cml0eSBtYXJraW5nCi0gKglAb2ZmbG9hZF9md2RfbWFyazogZndkaW5nIG9mZmxvYWQgbWFyawogICoJQG1hcms6IEdlbmVyaWMgcGFja2V0IG1hcmsKICAqCUB2bGFuX3Byb3RvOiB2bGFuIGVuY2Fwc3VsYXRpb24gcHJvdG9jb2wKICAqCUB2bGFuX3RjaTogdmxhbiB0YWcgY29udHJvbCBpbmZvcm1hdGlvbgpAQCAtNjc3LDEzICs2NzYsMjMgQEAKIAkgKi8KIAlrbWVtY2hlY2tfYml0ZmllbGRfYmVnaW4oZmxhZ3MxKTsKIAlfX3UxNgkJCXF1ZXVlX21hcHBpbmc7CisKKy8qIGlmIHlvdSBtb3ZlIGNsb25lZCBhcm91bmQgeW91IGFsc28gbXVzdCBhZGFwdCB0aG9zZSBjb25zdGFudHMgKi8KKyNpZmRlZiBfX0JJR19FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgQ0xPTkVEX01BU0sJKDEgPDwgNykKKyNlbHNlCisjZGVmaW5lIENMT05FRF9NQVNLCTEKKyNlbmRpZgorI2RlZmluZSBDTE9ORURfT0ZGU0VUKCkJCW9mZnNldG9mKHN0cnVjdCBza19idWZmLCBfX2Nsb25lZF9vZmZzZXQpCisKKwlfX3U4CQkJX19jbG9uZWRfb2Zmc2V0WzBdOwogCV9fdTgJCQljbG9uZWQ6MSwKIAkJCQlub2hkcjoxLAogCQkJCWZjbG9uZToyLAogCQkJCXBlZWtlZDoxLAogCQkJCWhlYWRfZnJhZzoxLAotCQkJCXhtaXRfbW9yZToxOwotCS8qIG9uZSBiaXQgaG9sZSAqLworCQkJCXhtaXRfbW9yZToxLAorCQkJCV9fdW51c2VkOjE7IC8qIG9uZSBiaXQgaG9sZSAqLwogCWttZW1jaGVja19iaXRmaWVsZF9lbmQoZmxhZ3MxKTsKIAogCS8qIGZpZWxkcyBlbmNsb3NlZCBpbiBoZWFkZXJzX3N0YXJ0L2hlYWRlcnNfZW5kIGFyZSBjb3BpZWQKQEAgLTczMCw3ICs3MzksMTAgQEAKIAlfX3U4CQkJaXB2c19wcm9wZXJ0eToxOwogCV9fdTgJCQlpbm5lcl9wcm90b2NvbF90eXBlOjE7CiAJX191OAkJCXJlbWNzdW1fb2ZmbG9hZDoxOwotCS8qIDMgb3IgNSBiaXQgaG9sZSAqLworI2lmZGVmIENPTkZJR19ORVRfU1dJVENIREVWCisJX191OAkJCW9mZmxvYWRfZndkX21hcms6MTsKKyNlbmRpZgorCS8qIDIsIDQgb3IgNSBiaXQgaG9sZSAqLwogCiAjaWZkZWYgQ09ORklHX05FVF9TQ0hFRAogCV9fdTE2CQkJdGNfaW5kZXg7CS8qIHRyYWZmaWMgY29udHJvbCBpbmRleCAqLwpAQCAtNzU3LDE0ICs3NjksOSBAQAogCQl1bnNpZ25lZCBpbnQJc2VuZGVyX2NwdTsKIAl9OwogI2VuZGlmCi0JdW5pb24gewogI2lmZGVmIENPTkZJR19ORVRXT1JLX1NFQ01BUksKLQkJX191MzIJCXNlY21hcms7CisJX191MzIJCXNlY21hcms7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfTkVUX1NXSVRDSERFVgotCQlfX3UzMgkJb2ZmbG9hZF9md2RfbWFyazsKLSNlbmRpZgotCX07CiAKIAl1bmlvbiB7CiAJCV9fdTMyCQltYXJrOwpAQCAtMjI5NSw3ICsyMzAyLDcgQEAKIAogaW50IF9fX3Bza2JfdHJpbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKTsKIAotc3RhdGljIGlubGluZSB2b2lkIF9fc2tiX3RyaW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3NrYl9zZXRfbGVuZ3RoKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJaWYgKHVubGlrZWx5KHNrYl9pc19ub25saW5lYXIoc2tiKSkpIHsKIAkJV0FSTl9PTigxKTsKQEAgLTIzMDUsNiArMjMxMiwxMSBAQAogCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgbGVuKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIF9fc2tiX3RyaW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlfX3NrYl9zZXRfbGVuZ3RoKHNrYiwgbGVuKTsKK30KKwogdm9pZCBza2JfdHJpbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKTsKIAogc3RhdGljIGlubGluZSBpbnQgX19wc2tiX3RyaW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKQEAgLTIzMzUsNiArMjM0NywyMCBAQAogCUJVR19PTihlcnIpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBfX3NrYl9ncm93KHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IGRpZmYgPSBsZW4gLSBza2ItPmxlbjsKKworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IGRpZmYpIHsKKwkJaW50IHJldCA9IHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCBkaWZmIC0gc2tiX3RhaWxyb29tKHNrYiksCisJCQkJCSAgIEdGUF9BVE9NSUMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJX19za2Jfc2V0X2xlbmd0aChza2IsIGxlbik7CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICoJc2tiX29ycGhhbiAtIG9ycGhhbiBhIGJ1ZmZlcgogICoJQHNrYjogYnVmZmVyIHRvIG9ycGhhbgpAQCAtMjM4Niw2ICsyNDEyLDggQEAKIAkJa2ZyZWVfc2tiKHNrYik7CiB9CiAKK3ZvaWQgc2tiX3JidHJlZV9wdXJnZShzdHJ1Y3QgcmJfcm9vdCAqcm9vdCk7CisKIHZvaWQgKm5ldGRldl9hbGxvY19mcmFnKHVuc2lnbmVkIGludCBmcmFnc3opOwogCiBzdHJ1Y3Qgc2tfYnVmZiAqX19uZXRkZXZfYWxsb2Nfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBsZW5ndGgsCkBAIC0yODQ3LDYgKzI4NzUsMTggQEAKIAkgICAgICAgX19za2JfbGluZWFyaXplKHNrYikgOiAwOwogfQogCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQKK19fc2tiX3Bvc3RwdWxsX3Jjc3VtKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHZvaWQgKnN0YXJ0LCB1bnNpZ25lZCBpbnQgbGVuLAorCQkgICAgIHVuc2lnbmVkIGludCBvZmYpCit7CisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQorCQlza2ItPmNzdW0gPSBjc3VtX2Jsb2NrX3N1Yihza2ItPmNzdW0sCisJCQkJCSAgIGNzdW1fcGFydGlhbChzdGFydCwgbGVuLCAwKSwgb2ZmKTsKKwllbHNlIGlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMICYmCisJCSBza2JfY2hlY2tzdW1fc3RhcnRfb2Zmc2V0KHNrYikgPCAwKQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Cit9CisKIC8qKgogICoJc2tiX3Bvc3RwdWxsX3Jjc3VtIC0gdXBkYXRlIGNoZWNrc3VtIGZvciByZWNlaXZlZCBza2IgYWZ0ZXIgcHVsbAogICoJQHNrYjogYnVmZmVyIHRvIHVwZGF0ZQpAQCAtMjg1NywzNiArMjg5NywzOCBAQAogICoJdXBkYXRlIHRoZSBDSEVDS1NVTV9DT01QTEVURSBjaGVja3N1bSwgb3Igc2V0IGlwX3N1bW1lZCB0bwogICoJQ0hFQ0tTVU1fTk9ORSBzbyB0aGF0IGl0IGNhbiBiZSByZWNvbXB1dGVkIGZyb20gc2NyYXRjaC4KICAqLwotCiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3Bvc3RwdWxsX3Jjc3VtKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgICAgY29uc3Qgdm9pZCAqc3RhcnQsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQotCQlza2ItPmNzdW0gPSBjc3VtX3N1Yihza2ItPmNzdW0sIGNzdW1fcGFydGlhbChzdGFydCwgbGVuLCAwKSk7Ci0JZWxzZSBpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCAmJgotCQkgc2tiX2NoZWNrc3VtX3N0YXJ0X29mZnNldChza2IpIDwgMCkKLQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCV9fc2tiX3Bvc3RwdWxsX3Jjc3VtKHNrYiwgc3RhcnQsIGxlbiwgMCk7CiB9CiAKLXVuc2lnbmVkIGNoYXIgKnNrYl9wdWxsX3Jjc3VtKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pOworc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkCitfX3NrYl9wb3N0cHVzaF9yY3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCB2b2lkICpzdGFydCwgdW5zaWduZWQgaW50IGxlbiwKKwkJICAgICB1bnNpZ25lZCBpbnQgb2ZmKQoreworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkKKwkJc2tiLT5jc3VtID0gY3N1bV9ibG9ja19hZGQoc2tiLT5jc3VtLAorCQkJCQkgICBjc3VtX3BhcnRpYWwoc3RhcnQsIGxlbiwgMCksIG9mZik7Cit9CiAKKy8qKgorICoJc2tiX3Bvc3RwdXNoX3Jjc3VtIC0gdXBkYXRlIGNoZWNrc3VtIGZvciByZWNlaXZlZCBza2IgYWZ0ZXIgcHVzaAorICoJQHNrYjogYnVmZmVyIHRvIHVwZGF0ZQorICoJQHN0YXJ0OiBzdGFydCBvZiBkYXRhIGFmdGVyIHB1c2gKKyAqCUBsZW46IGxlbmd0aCBvZiBkYXRhIHB1c2hlZAorICoKKyAqCUFmdGVyIGRvaW5nIGEgcHVzaCBvbiBhIHJlY2VpdmVkIHBhY2tldCwgeW91IG5lZWQgdG8gY2FsbCB0aGlzIHRvCisgKgl1cGRhdGUgdGhlIENIRUNLU1VNX0NPTVBMRVRFIGNoZWNrc3VtLgorICovCiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3Bvc3RwdXNoX3Jjc3VtKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgICAgY29uc3Qgdm9pZCAqc3RhcnQsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JLyogRm9yIHBlcmZvcm1pbmcgdGhlIHJldmVyc2Ugb3BlcmF0aW9uIHRvIHNrYl9wb3N0cHVsbF9yY3N1bSgpLAotCSAqIHdlIGNhbiBpbnN0ZWFkIG9mIC4uLgotCSAqCi0JICogICBza2ItPmNzdW0gPSBjc3VtX2FkZChza2ItPmNzdW0sIGNzdW1fcGFydGlhbChzdGFydCwgbGVuLCAwKSk7Ci0JICoKLQkgKiAuLi4ganVzdCB1c2UgdGhpcyBlcXVpdmFsZW50IHZlcnNpb24gaGVyZSB0byBzYXZlIGEgZmV3Ci0JICogaW5zdHJ1Y3Rpb25zLiBGZWVkaW5nIGNzdW0gb2YgMCBpbiBjc3VtX3BhcnRpYWwoKSBhbmQgbGF0ZXIKLQkgKiBvbiBhZGRpbmcgc2tiLT5jc3VtIGlzIGVxdWl2YWxlbnQgdG8gZmVlZCBza2ItPmNzdW0gaW4gdGhlCi0JICogZmlyc3QgcGxhY2UuCi0JICovCi0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQotCQlza2ItPmNzdW0gPSBjc3VtX3BhcnRpYWwoc3RhcnQsIGxlbiwgc2tiLT5jc3VtKTsKKwlfX3NrYl9wb3N0cHVzaF9yY3N1bShza2IsIHN0YXJ0LCBsZW4sIDApOwogfQogCit1bnNpZ25lZCBjaGFyICpza2JfcHVsbF9yY3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKTsKKwogLyoqCiAgKglza2JfcHVzaF9yY3N1bSAtIHB1c2ggc2tiIGFuZCB1cGRhdGUgcmVjZWl2ZSBjaGVja3N1bQogICoJQHNrYjogYnVmZmVyIHRvIHVwZGF0ZQpAQCAtMjkyNCw2ICsyOTY2LDIxIEBACiAJcmV0dXJuIF9fcHNrYl90cmltKHNrYiwgbGVuKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgX19za2JfdHJpbV9yY3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCV9fc2tiX3RyaW0oc2tiLCBsZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3NrYl9ncm93X3Jjc3VtKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pCit7CisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJcmV0dXJuIF9fc2tiX2dyb3coc2tiLCBsZW4pOworfQorCiAjZGVmaW5lIHNrYl9xdWV1ZV93YWxrKHF1ZXVlLCBza2IpIFwKIAkJZm9yIChza2IgPSAocXVldWUpLT5uZXh0OwkJCQkJXAogCQkgICAgIHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKikocXVldWUpOwkJCQlcCkBAIC0zMDI4LDYgKzMwODUsNyBAQAogc3RydWN0IHNrX2J1ZmYgKnNrYl9zZWdtZW50KHN0cnVjdCBza19idWZmICpza2IsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKTsKIHN0cnVjdCBza19idWZmICpza2Jfdmxhbl91bnRhZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCBza2JfZW5zdXJlX3dyaXRhYmxlKHN0cnVjdCBza19idWZmICpza2IsIGludCB3cml0ZV9sZW4pOworaW50IF9fc2tiX3ZsYW5fcG9wKHN0cnVjdCBza19idWZmICpza2IsIHUxNiAqdmxhbl90Y2kpOwogaW50IHNrYl92bGFuX3BvcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCBza2Jfdmxhbl9wdXNoKHN0cnVjdCBza19idWZmICpza2IsIF9fYmUxNiB2bGFuX3Byb3RvLCB1MTYgdmxhbl90Y2kpOwogc3RydWN0IHNrX2J1ZmYgKnBza2JfZXh0cmFjdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2ZmLCBpbnQgdG9fY29weSwKQEAgLTM3MTIsNiArMzc3MCwxMyBAQAogCXJldHVybiBza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlICYgU0tCX0dTT19UQ1BWNjsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNrYl9nc29fcmVzZXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplID0gMDsKKwlza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzID0gMDsKKwlza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlID0gMDsKK30KKwogdm9pZCBfX3NrYl93YXJuX2xyb19mb3J3YXJkaW5nKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpOwogCiBzdGF0aWMgaW5saW5lIGJvb2wgc2tiX3dhcm5faWZfbHJvKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NsYWIuaCBiL2luY2x1ZGUvbGludXgvc2xhYi5oCmluZGV4IDQyOTM4MDguLjA4NGIxMmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xhYi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2xhYi5oCkBAIC02NTAsNCArNjUwLDEyIEBACiB1bnNpZ25lZCBpbnQga21lbV9jYWNoZV9zaXplKHN0cnVjdCBrbWVtX2NhY2hlICpzKTsKIHZvaWQgX19pbml0IGttZW1fY2FjaGVfaW5pdF9sYXRlKHZvaWQpOwogCisjaWYgZGVmaW5lZChDT05GSUdfU01QKSAmJiBkZWZpbmVkKENPTkZJR19TTEFCKQoraW50IHNsYWJfcHJlcGFyZV9jcHUodW5zaWduZWQgaW50IGNwdSk7CitpbnQgc2xhYl9kZWFkX2NwdSh1bnNpZ25lZCBpbnQgY3B1KTsKKyNlbHNlCisjZGVmaW5lIHNsYWJfcHJlcGFyZV9jcHUJTlVMTAorI2RlZmluZSBzbGFiX2RlYWRfY3B1CQlOVUxMCisjZW5kaWYKKwogI2VuZGlmCS8qIF9MSU5VWF9TTEFCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc21jOTF4LmggYi9pbmNsdWRlL2xpbnV4L3NtYzkxeC5oCmluZGV4IDc2MTk5YjcuLmUzMDJjNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc21jOTF4LmgKKysrIGIvaW5jbHVkZS9saW51eC9zbWM5MXguaApAQCAtMSw2ICsxLDE2IEBACiAjaWZuZGVmIF9fU01DOTFYX0hfXwogI2RlZmluZSBfX1NNQzkxWF9IX18KIAorLyoKKyAqIFRoZXNlIGJpdHMgZGVmaW5lIHdoaWNoIGFjY2VzcyBzaXplcyBhIHBsYXRmb3JtIGNhbiBzdXBwb3J0LCByYXRoZXIKKyAqIHRoYW4gdGhlIG1heGltYWwgYWNjZXNzIHNpemUuICBTbywgaWYgeW91ciBwbGF0Zm9ybSBjYW4gZG8gMTYtYml0CisgKiBhbmQgMzItYml0IGFjY2Vzc2VzIHRvIHRoZSBTTUM5MXggZGV2aWNlLCBidXQgbm90IDgtYml0LCBzZXQgYm90aAorICogU01DOTFYX1VTRV8xNkJJVCBhbmQgU01DOTFYX1VTRV8zMkJJVC4KKyAqCisgKiBUaGUgU01DOTF4IGRyaXZlciByZXF1aXJlcyBhdCBsZWFzdCBvbmUgb2YgU01DOTFYX1VTRV84QklUIG9yCisgKiBTTUM5MVhfVVNFXzE2QklUIHRvIGJlIHN1cHBvcnRlZCAtIGp1c3Qgc2V0dGluZyBTTUM5MVhfVVNFXzMyQklUIGlzCisgKiBhbiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24uCisgKi8KICNkZWZpbmUgU01DOTFYX1VTRV84QklUICgxIDw8IDApCiAjZGVmaW5lIFNNQzkxWF9VU0VfMTZCSVQgKDEgPDwgMSkKICNkZWZpbmUgU01DOTFYX1VTRV8zMkJJVCAoMSA8PCAyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbXAuaCBiL2luY2x1ZGUvbGludXgvc21wLmgKaW5kZXggZWNjYWU0NjkuLjhlMGNiN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc21wLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbXAuaApAQCAtMTk2LDYgKzE5Niw5IEBACiAKIHZvaWQgc21wX3NldHVwX3Byb2Nlc3Nvcl9pZCh2b2lkKTsKIAoraW50IHNtcF9jYWxsX29uX2NwdSh1bnNpZ25lZCBpbnQgY3B1LCBpbnQgKCpmdW5jKSh2b2lkICopLCB2b2lkICpwYXIsCisJCSAgICBib29sIHBoeXMpOworCiAvKiBTTVAgY29yZSBmdW5jdGlvbnMgKi8KIGludCBzbXBjZmRfcHJlcGFyZV9jcHUodW5zaWduZWQgaW50IGNwdSk7CiBpbnQgc21wY2ZkX2RlYWRfY3B1KHVuc2lnbmVkIGludCBjcHUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGkvc3BpLmggYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaAppbmRleCAwNzJjYjJhLi40Yjc0M2FjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaApAQCAtMzEyLDYgKzMxMiw4IEBACiAgKiBAZmxhZ3M6IG90aGVyIGNvbnN0cmFpbnRzIHJlbGV2YW50IHRvIHRoaXMgZHJpdmVyCiAgKiBAbWF4X3RyYW5zZmVyX3NpemU6IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbWF4IHRyYW5zZmVyIHNpemUgZm9yCiAgKglhICZzcGlfZGV2aWNlOyBtYXkgYmUgJU5VTEwsIHNvIHRoZSBkZWZhdWx0ICVTSVpFX01BWCB3aWxsIGJlIHVzZWQuCisgKiBAbWF4X21lc3NhZ2Vfc2l6ZTogZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtYXggbWVzc2FnZSBzaXplIGZvcgorICoJYSAmc3BpX2RldmljZTsgbWF5IGJlICVOVUxMLCBzbyB0aGUgZGVmYXVsdCAlU0laRV9NQVggd2lsbCBiZSB1c2VkLgogICogQGlvX211dGV4OiBtdXRleCBmb3IgcGh5c2ljYWwgYnVzIGFjY2VzcwogICogQGJ1c19sb2NrX3NwaW5sb2NrOiBzcGlubG9jayBmb3IgU1BJIGJ1cyBsb2NraW5nCiAgKiBAYnVzX2xvY2tfbXV0ZXg6IG11dGV4IGZvciBleGNsdXNpb24gb2YgbXVsdGlwbGUgY2FsbGVycwpAQCAtNDQyLDEwICs0NDQsMTEgQEAKICNkZWZpbmUgU1BJX01BU1RFUl9NVVNUX1RYICAgICAgQklUKDQpCQkvKiByZXF1aXJlcyB0eCAqLwogCiAJLyoKLQkgKiBvbiBzb21lIGhhcmR3YXJlIHRyYW5zZmVyIHNpemUgbWF5IGJlIGNvbnN0cmFpbmVkCisJICogb24gc29tZSBoYXJkd2FyZSB0cmFuc2ZlciAvIG1lc3NhZ2Ugc2l6ZSBtYXkgYmUgY29uc3RyYWluZWQKIAkgKiB0aGUgbGltaXQgbWF5IGRlcGVuZCBvbiBkZXZpY2UgdHJhbnNmZXIgc2V0dGluZ3MKIAkgKi8KIAlzaXplX3QgKCptYXhfdHJhbnNmZXJfc2l6ZSkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSk7CisJc2l6ZV90ICgqbWF4X21lc3NhZ2Vfc2l6ZSkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSk7CiAKIAkvKiBJL08gbXV0ZXggKi8KIAlzdHJ1Y3QgbXV0ZXgJCWlvX211dGV4OwpAQCAtOTA1LDEyICs5MDgsMjYgQEAKIAkJCSAgICBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc3NhZ2UpOwogCiBzdGF0aWMgaW5saW5lIHNpemVfdAorc3BpX21heF9tZXNzYWdlX3NpemUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gc3BpLT5tYXN0ZXI7CisJaWYgKCFtYXN0ZXItPm1heF9tZXNzYWdlX3NpemUpCisJCXJldHVybiBTSVpFX01BWDsKKwlyZXR1cm4gbWFzdGVyLT5tYXhfbWVzc2FnZV9zaXplKHNwaSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90CiBzcGlfbWF4X3RyYW5zZmVyX3NpemUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gc3BpLT5tYXN0ZXI7Ci0JaWYgKCFtYXN0ZXItPm1heF90cmFuc2Zlcl9zaXplKQotCQlyZXR1cm4gU0laRV9NQVg7Ci0JcmV0dXJuIG1hc3Rlci0+bWF4X3RyYW5zZmVyX3NpemUoc3BpKTsKKwlzaXplX3QgdHJfbWF4ID0gU0laRV9NQVg7CisJc2l6ZV90IG1zZ19tYXggPSBzcGlfbWF4X21lc3NhZ2Vfc2l6ZShzcGkpOworCisJaWYgKG1hc3Rlci0+bWF4X3RyYW5zZmVyX3NpemUpCisJCXRyX21heCA9IG1hc3Rlci0+bWF4X3RyYW5zZmVyX3NpemUoc3BpKTsKKworCS8qIHRyYW5zZmVyIHNpemUgbGltaXQgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIG1lc3NzYWdlIHNpemUgbGltaXQgKi8KKwlyZXR1cm4gbWluKHRyX21heCwgbXNnX21heCk7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTk4MCw1OCArOTk3LDYgQEAKIGV4dGVybiBpbnQgc3BpX2J1c191bmxvY2soc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlcik7CiAKIC8qKgotICogc3BpX3dyaXRlIC0gU1BJIHN5bmNocm9ub3VzIHdyaXRlCi0gKiBAc3BpOiBkZXZpY2UgdG8gd2hpY2ggZGF0YSB3aWxsIGJlIHdyaXR0ZW4KLSAqIEBidWY6IGRhdGEgYnVmZmVyCi0gKiBAbGVuOiBkYXRhIGJ1ZmZlciBzaXplCi0gKiBDb250ZXh0OiBjYW4gc2xlZXAKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgYnVmZmVyIEBidWYuCi0gKiBDYWxsYWJsZSBvbmx5IGZyb20gY29udGV4dHMgdGhhdCBjYW4gc2xlZXAuCi0gKgotICogUmV0dXJuOiB6ZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgotICovCi1zdGF0aWMgaW5saW5lIGludAotc3BpX3dyaXRlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXQgPSB7Ci0JCQkudHhfYnVmCQk9IGJ1ZiwKLQkJCS5sZW4JCT0gbGVuLAotCQl9OwotCXN0cnVjdCBzcGlfbWVzc2FnZQltOwotCi0Jc3BpX21lc3NhZ2VfaW5pdCgmbSk7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnQsICZtKTsKLQlyZXR1cm4gc3BpX3N5bmMoc3BpLCAmbSk7Ci19Ci0KLS8qKgotICogc3BpX3JlYWQgLSBTUEkgc3luY2hyb25vdXMgcmVhZAotICogQHNwaTogZGV2aWNlIGZyb20gd2hpY2ggZGF0YSB3aWxsIGJlIHJlYWQKLSAqIEBidWY6IGRhdGEgYnVmZmVyCi0gKiBAbGVuOiBkYXRhIGJ1ZmZlciBzaXplCi0gKiBDb250ZXh0OiBjYW4gc2xlZXAKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBidWZmZXIgQGJ1Zi4KLSAqIENhbGxhYmxlIG9ubHkgZnJvbSBjb250ZXh0cyB0aGF0IGNhbiBzbGVlcC4KLSAqCi0gKiBSZXR1cm46IHplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1zcGlfcmVhZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IHNwaV90cmFuc2Zlcgl0ID0gewotCQkJLnJ4X2J1ZgkJPSBidWYsCi0JCQkubGVuCQk9IGxlbiwKLQkJfTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UJbTsKLQotCXNwaV9tZXNzYWdlX2luaXQoJm0pOwotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0LCAmbSk7Ci0JcmV0dXJuIHNwaV9zeW5jKHNwaSwgJm0pOwotfQotCi0vKioKICAqIHNwaV9zeW5jX3RyYW5zZmVyIC0gc3luY2hyb25vdXMgU1BJIGRhdGEgdHJhbnNmZXIKICAqIEBzcGk6IGRldmljZSB3aXRoIHdoaWNoIGRhdGEgd2lsbCBiZSBleGNoYW5nZWQKICAqIEB4ZmVyczogQW4gYXJyYXkgb2Ygc3BpX3RyYW5zZmVycwpAQCAtMTA1NSw2ICsxMDIwLDUyIEBACiAJcmV0dXJuIHNwaV9zeW5jKHNwaSwgJm1zZyk7CiB9CiAKKy8qKgorICogc3BpX3dyaXRlIC0gU1BJIHN5bmNocm9ub3VzIHdyaXRlCisgKiBAc3BpOiBkZXZpY2UgdG8gd2hpY2ggZGF0YSB3aWxsIGJlIHdyaXR0ZW4KKyAqIEBidWY6IGRhdGEgYnVmZmVyCisgKiBAbGVuOiBkYXRhIGJ1ZmZlciBzaXplCisgKiBDb250ZXh0OiBjYW4gc2xlZXAKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgYnVmZmVyIEBidWYuCisgKiBDYWxsYWJsZSBvbmx5IGZyb20gY29udGV4dHMgdGhhdCBjYW4gc2xlZXAuCisgKgorICogUmV0dXJuOiB6ZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIGludAorc3BpX3dyaXRlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXQgPSB7CisJCQkudHhfYnVmCQk9IGJ1ZiwKKwkJCS5sZW4JCT0gbGVuLAorCQl9OworCisJcmV0dXJuIHNwaV9zeW5jX3RyYW5zZmVyKHNwaSwgJnQsIDEpOworfQorCisvKioKKyAqIHNwaV9yZWFkIC0gU1BJIHN5bmNocm9ub3VzIHJlYWQKKyAqIEBzcGk6IGRldmljZSBmcm9tIHdoaWNoIGRhdGEgd2lsbCBiZSByZWFkCisgKiBAYnVmOiBkYXRhIGJ1ZmZlcgorICogQGxlbjogZGF0YSBidWZmZXIgc2l6ZQorICogQ29udGV4dDogY2FuIHNsZWVwCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgYnVmZmVyIEBidWYuCisgKiBDYWxsYWJsZSBvbmx5IGZyb20gY29udGV4dHMgdGhhdCBjYW4gc2xlZXAuCisgKgorICogUmV0dXJuOiB6ZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIGludAorc3BpX3JlYWQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIJdCA9IHsKKwkJCS5yeF9idWYJCT0gYnVmLAorCQkJLmxlbgkJPSBsZW4sCisJCX07CisKKwlyZXR1cm4gc3BpX3N5bmNfdHJhbnNmZXIoc3BpLCAmdCwgMSk7Cit9CisKIC8qIHRoaXMgY29waWVzIHR4YnVmIGFuZCByeGJ1ZiBkYXRhOyBmb3Igc21hbGwgdHJhbnNmZXJzIG9ubHkhICovCiBleHRlcm4gaW50IHNwaV93cml0ZV90aGVuX3JlYWQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKIAkJY29uc3Qgdm9pZCAqdHhidWYsIHVuc2lnbmVkIG5fdHgsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaCBiL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCmluZGV4IDc2OTNlMzkuLmQ5NzE4MzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCkBAIC0yNDUsNiArMjQ1LDcgQEAKIAlyZXR1cm4gdW5saWtlbHkoc3VzcGVuZF9mcmVlemVfc3RhdGUgPT0gRlJFRVpFX1NUQVRFX0VOVEVSKTsKIH0KIAorZXh0ZXJuIHZvaWQgX19pbml0IHBtX3N0YXRlc19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgZnJlZXplX3NldF9vcHMoY29uc3Qgc3RydWN0IHBsYXRmb3JtX2ZyZWV6ZV9vcHMgKm9wcyk7CiBleHRlcm4gdm9pZCBmcmVlemVfd2FrZSh2b2lkKTsKIApAQCAtMjc5LDYgKzI4MCw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc3VzcGVuZF9zZXRfb3BzKGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyAqb3BzKSB7fQogc3RhdGljIGlubGluZSBpbnQgcG1fc3VzcGVuZChzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpIHsgcmV0dXJuIC1FTk9TWVM7IH0KIHN0YXRpYyBpbmxpbmUgYm9vbCBpZGxlX3Nob3VsZF9mcmVlemUodm9pZCkgeyByZXR1cm4gZmFsc2U7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgcG1fc3RhdGVzX2luaXQodm9pZCkge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlemVfc2V0X29wcyhjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZnJlZXplX29wcyAqb3BzKSB7fQogc3RhdGljIGlubGluZSB2b2lkIGZyZWV6ZV93YWtlKHZvaWQpIHt9CiAjZW5kaWYgLyogIUNPTkZJR19TVVNQRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YXAuaCBiL2luY2x1ZGUvbGludXgvc3dhcC5oCmluZGV4IGIxN2NjNDguLmUxZDc2MTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3dhcC5oCkBAIC0yNTcsNiArMjU3LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHdvcmtpbmdzZXRfbm9kZV9wYWdlc19kZWMoc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSkKIHsKKwlWTV9XQVJOX09OX09OQ0UoIXdvcmtpbmdzZXRfbm9kZV9wYWdlcyhub2RlKSk7CiAJbm9kZS0+Y291bnQtLTsKIH0KIApAQCAtMjcyLDYgKzI3Myw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3b3JraW5nc2V0X25vZGVfc2hhZG93c19kZWMoc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSkKIHsKKwlWTV9XQVJOX09OX09OQ0UoIXdvcmtpbmdzZXRfbm9kZV9zaGFkb3dzKG5vZGUpKTsKIAlub2RlLT5jb3VudCAtPSAxVSA8PCBSQURJWF9UUkVFX0NPVU5UX1NISUZUOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oIGIvaW5jbHVkZS9saW51eC9zeXNjdGwuaAppbmRleCA2OTdlMTYwLi5lY2MzZTA3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC91aWRnaWQuaD4KICNpbmNsdWRlIDx1YXBpL2xpbnV4L3N5c2N0bC5oPgogCiAvKiBGb3IgdGhlIC9wcm9jL3N5cyBzdXBwb3J0ICovCkBAIC00Miw2ICs0Myw4IEBACiAJCQkgdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIGV4dGVybiBpbnQgcHJvY19kb2ludHZlYyhzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKIAkJCSB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOworZXh0ZXJuIGludCBwcm9jX2RvdWludHZlYyhzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKKwkJCSB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwogZXh0ZXJuIGludCBwcm9jX2RvaW50dmVjX21pbm1heChzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKIAkJCQl2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwogZXh0ZXJuIGludCBwcm9jX2RvaW50dmVjX2ppZmZpZXMoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsCkBAIC0xNTcsNiArMTYwLDkgQEAKIAlzdHJ1Y3QgY3RsX3RhYmxlX3NldCBkZWZhdWx0X3NldDsKIAlzdHJ1Y3QgY3RsX3RhYmxlX3NldCAqKCpsb29rdXApKHN0cnVjdCBjdGxfdGFibGVfcm9vdCAqcm9vdCwKIAkJCQkJICAgc3RydWN0IG5zcHJveHkgKm5hbWVzcGFjZXMpOworCXZvaWQgKCpzZXRfb3duZXJzaGlwKShzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaGVhZCwKKwkJCSAgICAgIHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLAorCQkJICAgICAga3VpZF90ICp1aWQsIGtnaWRfdCAqZ2lkKTsKIAlpbnQgKCpwZXJtaXNzaW9ucykoc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmhlYWQsIHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGNwLmggYi9pbmNsdWRlL2xpbnV4L3RjcC5oCmluZGV4IDdiZTliMTIuLmExN2FlN2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGNwLmgKKysrIGIvaW5jbHVkZS9saW51eC90Y3AuaApAQCAtMTksNiArMTksNyBAQAogCiAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC93aW5fbWlubWF4Lmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvaW5ldF9jb25uZWN0aW9uX3NvY2suaD4KICNpbmNsdWRlIDxuZXQvaW5ldF90aW1ld2FpdF9zb2NrLmg+CkBAIC0yMTIsNyArMjEzLDggQEAKIAkJdTggcmVvcmQ7ICAgIC8qIHJlb3JkZXJpbmcgZGV0ZWN0ZWQgKi8KIAl9IHJhY2s7CiAJdTE2CWFkdm1zczsJCS8qIEFkdmVydGlzZWQgTVNTCQkJKi8KLQl1OAl1bnVzZWQ7CisJdTgJcmF0ZV9hcHBfbGltaXRlZDoxLCAgLyogcmF0ZV97ZGVsaXZlcmVkLGludGVydmFsX3VzfSBsaW1pdGVkPyAqLworCQl1bnVzZWQ6NzsKIAl1OAlub25hZ2xlICAgICA6IDQsLyogRGlzYWJsZSBOYWdsZSBhbGdvcml0aG0/ICAgICAgICAgICAgICovCiAJCXRoaW5fbHRvICAgIDogMSwvKiBVc2UgbGluZWFyIHRpbWVvdXRzIGZvciB0aGluIHN0cmVhbXMgKi8KIAkJdGhpbl9kdXBhY2sgOiAxLC8qIEZhc3QgcmV0cmFuc21pdCBvbiBmaXJzdCBkdXBhY2sgICAgICAqLwpAQCAtMjM0LDkgKzIzNiw3IEBACiAJdTMyCW1kZXZfbWF4X3VzOwkvKiBtYXhpbWFsIG1kZXYgZm9yIHRoZSBsYXN0IHJ0dCBwZXJpb2QJKi8KIAl1MzIJcnR0dmFyX3VzOwkvKiBzbW9vdGhlZCBtZGV2X21heAkJCSovCiAJdTMyCXJ0dF9zZXE7CS8qIHNlcXVlbmNlIG51bWJlciB0byB1cGRhdGUgcnR0dmFyCSovCi0Jc3RydWN0IHJ0dF9tZWFzIHsKLQkJdTMyIHJ0dCwgdHM7CS8qIFJUVCBpbiB1c2VjIGFuZCBzYW1wbGluZyB0aW1lIGluIGppZmZpZXMuICovCi0JfSBydHRfbWluWzNdOworCXN0cnVjdCAgbWlubWF4IHJ0dF9taW47CiAKIAl1MzIJcGFja2V0c19vdXQ7CS8qIFBhY2tldHMgd2hpY2ggYXJlICJpbiBmbGlnaHQiCSovCiAJdTMyCXJldHJhbnNfb3V0OwkvKiBSZXRyYW5zbWl0dGVkIHBhY2tldHMgb3V0CQkqLwpAQCAtMjY4LDYgKzI2OCwxMiBAQAogCQkJCSAqIHJlY2VpdmVyIGluIFJlY292ZXJ5LiAqLwogCXUzMglwcnJfb3V0OwkvKiBUb3RhbCBudW1iZXIgb2YgcGt0cyBzZW50IGR1cmluZyBSZWNvdmVyeS4gKi8KIAl1MzIJZGVsaXZlcmVkOwkvKiBUb3RhbCBkYXRhIHBhY2tldHMgZGVsaXZlcmVkIGluY2wuIHJleG1pdHMgKi8KKwl1MzIJbG9zdDsJCS8qIFRvdGFsIGRhdGEgcGFja2V0cyBsb3N0IGluY2wuIHJleG1pdHMgKi8KKwl1MzIJYXBwX2xpbWl0ZWQ7CS8qIGxpbWl0ZWQgdW50aWwgImRlbGl2ZXJlZCIgcmVhY2hlcyB0aGlzIHZhbCAqLworCXN0cnVjdCBza2JfbXN0YW1wIGZpcnN0X3R4X21zdGFtcDsgIC8qIHN0YXJ0IG9mIHdpbmRvdyBzZW5kIHBoYXNlICovCisJc3RydWN0IHNrYl9tc3RhbXAgZGVsaXZlcmVkX21zdGFtcDsgLyogdGltZSB3ZSByZWFjaGVkICJkZWxpdmVyZWQiICovCisJdTMyCXJhdGVfZGVsaXZlcmVkOyAgICAvKiBzYXZlZCByYXRlIHNhbXBsZTogcGFja2V0cyBkZWxpdmVyZWQgKi8KKwl1MzIJcmF0ZV9pbnRlcnZhbF91czsgIC8qIHNhdmVkIHJhdGUgc2FtcGxlOiB0aW1lIGVsYXBzZWQgKi8KIAogIAl1MzIJcmN2X3duZDsJLyogQ3VycmVudCByZWNlaXZlciB3aW5kb3cJCSovCiAJdTMyCXdyaXRlX3NlcTsJLyogVGFpbCgrMSkgb2YgZGF0YSBoZWxkIGluIHRjcCBzZW5kIGJ1ZmZlciAqLwpAQCAtMjgxLDEwICsyODcsOSBAQAogCXN0cnVjdCBza19idWZmKiBsb3N0X3NrYl9oaW50OwogCXN0cnVjdCBza19idWZmICpyZXRyYW5zbWl0X3NrYl9oaW50OwogCi0JLyogT09PIHNlZ21lbnRzIGdvIGluIHRoaXMgbGlzdC4gTm90ZSB0aGF0IHNvY2tldCBsb2NrIG11c3QgYmUgaGVsZCwKLQkgKiBhcyB3ZSBkbyBub3QgdXNlIHNrX2J1ZmZfaGVhZCBsb2NrLgotCSAqLwotCXN0cnVjdCBza19idWZmX2hlYWQJb3V0X29mX29yZGVyX3F1ZXVlOworCS8qIE9PTyBzZWdtZW50cyBnbyBpbiB0aGlzIHJidHJlZS4gU29ja2V0IGxvY2sgbXVzdCBiZSBoZWxkLiAqLworCXN0cnVjdCByYl9yb290CW91dF9vZl9vcmRlcl9xdWV1ZTsKKwlzdHJ1Y3Qgc2tfYnVmZgkqb29vX2xhc3Rfc2tiOyAvKiBjYWNoZSByYl9sYXN0KG91dF9vZl9vcmRlcl9xdWV1ZSkgKi8KIAogCS8qIFNBQ0tzIGRhdGEsIHRoZXNlIDIgbmVlZCB0byBiZSB0b2dldGhlciAoc2VlIHRjcF9vcHRpb25zX3dyaXRlKSAqLwogCXN0cnVjdCB0Y3Bfc2Fja19ibG9jayBkdXBsaWNhdGVfc2Fja1sxXTsgLyogRC1TQUNLIGJsb2NrICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2xpbnV4L3RocmVhZF9pbmZvLmgKaW5kZXggY2JkODk5MC4uNDVmMDA0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvbGludXgvdGhyZWFkX2luZm8uaApAQCAtMTMsNiArMTMsMjEgQEAKIHN0cnVjdCB0aW1lc3BlYzsKIHN0cnVjdCBjb21wYXRfdGltZXNwZWM7CiAKKyNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSworc3RydWN0IHRocmVhZF9pbmZvIHsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIGxvdyBsZXZlbCBmbGFncyAqLworfTsKKworI2RlZmluZSBJTklUX1RIUkVBRF9JTkZPKHRzaykJCQlcCit7CQkJCQkJXAorCS5mbGFncwkJPSAwLAkJCVwKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1RIUkVBRF9JTkZPX0lOX1RBU0sKKyNkZWZpbmUgY3VycmVudF90aHJlYWRfaW5mbygpICgoc3RydWN0IHRocmVhZF9pbmZvICopY3VycmVudCkKKyNlbmRpZgorCiAvKgogICogU3lzdGVtIGNhbGwgcmVzdGFydCBibG9jay4KICAqLwpAQCAtMTE4LDEwICsxMzMsMTEgQEAKIGV4dGVybiB2b2lkIF9fY2hlY2tfb2JqZWN0X3NpemUoY29uc3Qgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIG4sCiAJCQkJCWJvb2wgdG9fdXNlcik7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19vYmplY3Rfc2l6ZShjb25zdCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgbiwKLQkJCQkgICAgIGJvb2wgdG9fdXNlcikKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBjaGVja19vYmplY3Rfc2l6ZShjb25zdCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgbiwKKwkJCQkJICAgICAgYm9vbCB0b191c2VyKQogewotCV9fY2hlY2tfb2JqZWN0X3NpemUocHRyLCBuLCB0b191c2VyKTsKKwlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQorCQlfX2NoZWNrX29iamVjdF9zaXplKHB0ciwgbiwgdG9fdXNlcik7CiB9CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX29iamVjdF9zaXplKGNvbnN0IHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBuLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aW1lNjQuaCBiL2luY2x1ZGUvbGludXgvdGltZTY0LmgKaW5kZXggN2U1ZDJmYS4uOTgwYzcxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1lNjQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpbWU2NC5oCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgogCiB0eXBlZGVmIF9fczY0IHRpbWU2NF90OwordHlwZWRlZiBfX3U2NCB0aW1ldTY0X3Q7CiAKIC8qCiAgKiBUaGlzIHdhbnRzIHRvIGdvIGludG8gdWFwaS9saW51eC90aW1lLmggb25jZSB3ZSBhZ3JlZWQgYWJvdXQgdGhlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWVrZWVwaW5nLmggYi9pbmNsdWRlL2xpbnV4L3RpbWVrZWVwaW5nLmgKaW5kZXggODE2Yjc1NC4uMDkxNjhjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1la2VlcGluZy5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZWtlZXBpbmcuaApAQCAtMSw3ICsxLDcgQEAKICNpZm5kZWYgX0xJTlVYX1RJTUVLRUVQSU5HX0gKICNkZWZpbmUgX0xJTlVYX1RJTUVLRUVQSU5HX0gKIAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2Vycm5vLWJhc2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogCiAvKiBJbmNsdWRlZCBmcm9tIGxpbnV4L2t0aW1lLmggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90b3J0dXJlLmggYi9pbmNsdWRlL2xpbnV4L3RvcnR1cmUuaAppbmRleCA2Njg1YTczLi5hNDU3MDJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RvcnR1cmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RvcnR1cmUuaApAQCAtNDMsNyArNDMsNyBAQAogCiAjZGVmaW5lIFRPUlRVUkVfRkxBRyAiLXRvcnR1cmU6IgogI2RlZmluZSBUT1JPVVRfU1RSSU5HKHMpIFwKLQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRyBzICJcbiIsIHRvcnR1cmVfdHlwZSkKKwlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRyAiICVzXG4iLCB0b3J0dXJlX3R5cGUsIHMpCiAjZGVmaW5lIFZFUkJPU0VfVE9ST1VUX1NUUklORyhzKSBcCiAJZG8geyBpZiAodmVyYm9zZSkgcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcgIiAlc1xuIiwgdG9ydHVyZV90eXBlLCBzKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgVkVSQk9TRV9UT1JPVVRfRVJSU1RSSU5HKHMpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdTY0X3N0YXRzX3N5bmMuaCBiL2luY2x1ZGUvbGludXgvdTY0X3N0YXRzX3N5bmMuaAppbmRleCBkM2EyYmI3Li42NTBmM2RkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3U2NF9zdGF0c19zeW5jLmgKKysrIGIvaW5jbHVkZS9saW51eC91NjRfc3RhdHNfc3luYy5oCkBAIC0xMDMsMjkgKzEwMyw0MCBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHU2NF9zdGF0c19mZXRjaF9iZWdpbihjb25zdCBzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKnN5bmNwKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX191NjRfc3RhdHNfZmV0Y2hfYmVnaW4oY29uc3Qgc3RydWN0IHU2NF9zdGF0c19zeW5jICpzeW5jcCkKIHsKICNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiBkZWZpbmVkKENPTkZJR19TTVApCiAJcmV0dXJuIHJlYWRfc2VxY291bnRfYmVnaW4oJnN5bmNwLT5zZXEpOwogI2Vsc2UKLSNpZiBCSVRTX1BFUl9MT05HPT0zMgorCXJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHU2NF9zdGF0c19mZXRjaF9iZWdpbihjb25zdCBzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKnN5bmNwKQoreworI2lmIEJJVFNfUEVSX0xPTkc9PTMyICYmICFkZWZpbmVkKENPTkZJR19TTVApCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAjZW5kaWYKLQlyZXR1cm4gMDsKKwlyZXR1cm4gX191NjRfc3RhdHNfZmV0Y2hfYmVnaW4oc3luY3ApOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgX191NjRfc3RhdHNfZmV0Y2hfcmV0cnkoY29uc3Qgc3RydWN0IHU2NF9zdGF0c19zeW5jICpzeW5jcCwKKwkJCQkJIHVuc2lnbmVkIGludCBzdGFydCkKK3sKKyNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiBkZWZpbmVkKENPTkZJR19TTVApCisJcmV0dXJuIHJlYWRfc2VxY291bnRfcmV0cnkoJnN5bmNwLT5zZXEsIHN0YXJ0KTsKKyNlbHNlCisJcmV0dXJuIGZhbHNlOwogI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCB1NjRfc3RhdHNfZmV0Y2hfcmV0cnkoY29uc3Qgc3RydWN0IHU2NF9zdGF0c19zeW5jICpzeW5jcCwKIAkJCQkJIHVuc2lnbmVkIGludCBzdGFydCkKIHsKLSNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiBkZWZpbmVkKENPTkZJR19TTVApCi0JcmV0dXJuIHJlYWRfc2VxY291bnRfcmV0cnkoJnN5bmNwLT5zZXEsIHN0YXJ0KTsKLSNlbHNlCi0jaWYgQklUU19QRVJfTE9ORz09MzIKKyNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiAhZGVmaW5lZChDT05GSUdfU01QKQogCXByZWVtcHRfZW5hYmxlKCk7CiAjZW5kaWYKLQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKKwlyZXR1cm4gX191NjRfc3RhdHNfZmV0Y2hfcmV0cnkoc3luY3AsIHN0YXJ0KTsKIH0KIAogLyoKQEAgLTEzNiwyNyArMTQ3LDE5IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHU2NF9zdGF0c19mZXRjaF9iZWdpbl9pcnEoY29uc3Qgc3RydWN0IHU2NF9zdGF0c19zeW5jICpzeW5jcCkKIHsKLSNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiBkZWZpbmVkKENPTkZJR19TTVApCi0JcmV0dXJuIHJlYWRfc2VxY291bnRfYmVnaW4oJnN5bmNwLT5zZXEpOwotI2Vsc2UKLSNpZiBCSVRTX1BFUl9MT05HPT0zMgorI2lmIEJJVFNfUEVSX0xPTkc9PTMyICYmICFkZWZpbmVkKENPTkZJR19TTVApCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKICNlbmRpZgotCXJldHVybiAwOwotI2VuZGlmCisJcmV0dXJuIF9fdTY0X3N0YXRzX2ZldGNoX2JlZ2luKHN5bmNwKTsKIH0KIAogc3RhdGljIGlubGluZSBib29sIHU2NF9zdGF0c19mZXRjaF9yZXRyeV9pcnEoY29uc3Qgc3RydWN0IHU2NF9zdGF0c19zeW5jICpzeW5jcCwKLQkJCQkJIHVuc2lnbmVkIGludCBzdGFydCkKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgc3RhcnQpCiB7Ci0jaWYgQklUU19QRVJfTE9ORz09MzIgJiYgZGVmaW5lZChDT05GSUdfU01QKQotCXJldHVybiByZWFkX3NlcWNvdW50X3JldHJ5KCZzeW5jcC0+c2VxLCBzdGFydCk7Ci0jZWxzZQotI2lmIEJJVFNfUEVSX0xPTkc9PTMyCisjaWYgQklUU19QRVJfTE9ORz09MzIgJiYgIWRlZmluZWQoQ09ORklHX1NNUCkKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAjZW5kaWYKLQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKKwlyZXR1cm4gX191NjRfc3RhdHNfZmV0Y2hfcmV0cnkoc3luY3AsIHN0YXJ0KTsKIH0KIAogI2VuZGlmIC8qIF9MSU5VWF9VNjRfU1RBVFNfU1lOQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Vpby5oIGIvaW5jbHVkZS9saW51eC91aW8uaAppbmRleCAxYjVkMWNkLi43NWI0YWFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Vpby5oCisrKyBiL2luY2x1ZGUvbGludXgvdWlvLmgKQEAgLTc2LDcgKzc2LDcgQEAKIAkJc3RydWN0IGlvdl9pdGVyICppLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IGJ5dGVzKTsKIHZvaWQgaW92X2l0ZXJfYWR2YW5jZShzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCBieXRlcyk7CiBpbnQgaW92X2l0ZXJfZmF1bHRfaW5fcmVhZGFibGUoc3RydWN0IGlvdl9pdGVyICppLCBzaXplX3QgYnl0ZXMpOwotaW50IGlvdl9pdGVyX2ZhdWx0X2luX211bHRpcGFnZXNfcmVhZGFibGUoc3RydWN0IGlvdl9pdGVyICppLCBzaXplX3QgYnl0ZXMpOworI2RlZmluZSBpb3ZfaXRlcl9mYXVsdF9pbl9tdWx0aXBhZ2VzX3JlYWRhYmxlIGlvdl9pdGVyX2ZhdWx0X2luX3JlYWRhYmxlCiBzaXplX3QgaW92X2l0ZXJfc2luZ2xlX3NlZ19jb3VudChjb25zdCBzdHJ1Y3QgaW92X2l0ZXIgKmkpOwogc2l6ZV90IGNvcHlfcGFnZV90b19pdGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgYnl0ZXMsCiAJCQkgc3RydWN0IGlvdl9pdGVyICppKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWxwaS9kcml2ZXIuaCBiL2luY2x1ZGUvbGludXgvdWxwaS9kcml2ZXIuaAppbmRleCAzODhmNmUwLi5hN2FmMjFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VscGkvZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC91bHBpL2RyaXZlci5oCkBAIC0xNSw3ICsxNSw3IEBACiAgKi8KIHN0cnVjdCB1bHBpIHsKIAlzdHJ1Y3QgdWxwaV9kZXZpY2VfaWQgaWQ7Ci0Jc3RydWN0IHVscGlfb3BzICpvcHM7CisJY29uc3Qgc3RydWN0IHVscGlfb3BzICpvcHM7CiAJc3RydWN0IGRldmljZSBkZXY7CiB9OwogCkBAIC00Nyw3ICs0NywxMSBAQAogCiAjZGVmaW5lIHRvX3VscGlfZHJpdmVyKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgdWxwaV9kcml2ZXIsIGRyaXZlcikKIAotaW50IHVscGlfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1bHBpX2RyaXZlciAqZHJ2KTsKKy8qCisgKiB1c2UgYSBtYWNybyB0byBhdm9pZCBpbmNsdWRlIGNoYWluaW5nIHRvIGdldCBUSElTX01PRFVMRQorICovCisjZGVmaW5lIHVscGlfcmVnaXN0ZXJfZHJpdmVyKGRydikgX191bHBpX3JlZ2lzdGVyX2RyaXZlcihkcnYsIFRISVNfTU9EVUxFKQoraW50IF9fdWxwaV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVscGlfZHJpdmVyICpkcnYsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSk7CiB2b2lkIHVscGlfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVscGlfZHJpdmVyICpkcnYpOwogCiAjZGVmaW5lIG1vZHVsZV91bHBpX2RyaXZlcihfX3VscGlfZHJpdmVyKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VscGkvaW50ZXJmYWNlLmggYi9pbmNsdWRlL2xpbnV4L3VscGkvaW50ZXJmYWNlLmgKaW5kZXggNGRlOGFiNC4uYTIwMTFhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91bHBpL2ludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdWxwaS9pbnRlcmZhY2UuaApAQCAtNCwyMCArNCwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIHN0cnVjdCB1bHBpOworc3RydWN0IGRldmljZTsKIAogLyoqCiAgKiBzdHJ1Y3QgdWxwaV9vcHMgLSBVTFBJIHJlZ2lzdGVyIGFjY2VzcwotICogQGRldjogdGhlIGludGVyZmFjZSBwcm92aWRlcgogICogQHJlYWQ6IHJlYWQgb3BlcmF0aW9uIGZvciBVTFBJIHJlZ2lzdGVyIGFjY2VzcwogICogQHdyaXRlOiB3cml0ZSBvcGVyYXRpb24gZm9yIFVMUEkgcmVnaXN0ZXIgYWNjZXNzCiAgKi8KIHN0cnVjdCB1bHBpX29wcyB7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCWludCAoKnJlYWQpKHN0cnVjdCB1bHBpX29wcyAqb3BzLCB1OCBhZGRyKTsKLQlpbnQgKCp3cml0ZSkoc3RydWN0IHVscGlfb3BzICpvcHMsIHU4IGFkZHIsIHU4IHZhbCk7CisJaW50ICgqcmVhZCkoc3RydWN0IGRldmljZSAqZGV2LCB1OCBhZGRyKTsKKwlpbnQgKCp3cml0ZSkoc3RydWN0IGRldmljZSAqZGV2LCB1OCBhZGRyLCB1OCB2YWwpOwogfTsKIAotc3RydWN0IHVscGkgKnVscGlfcmVnaXN0ZXJfaW50ZXJmYWNlKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IHVscGlfb3BzICopOworc3RydWN0IHVscGkgKnVscGlfcmVnaXN0ZXJfaW50ZXJmYWNlKHN0cnVjdCBkZXZpY2UgKiwgY29uc3Qgc3RydWN0IHVscGlfb3BzICopOwogdm9pZCB1bHBpX3VucmVnaXN0ZXJfaW50ZXJmYWNlKHN0cnVjdCB1bHBpICopOwogCiAjZW5kaWYgLyogX19MSU5VWF9VTFBJX0lOVEVSRkFDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9jb21wb3NpdGUuaCBiL2luY2x1ZGUvbGludXgvdXNiL2NvbXBvc2l0ZS5oCmluZGV4IDJiODFiMjQuLjQ2MTZhNDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL2NvbXBvc2l0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2NvbXBvc2l0ZS5oCkBAIC0yMjAsNyArMjIwLDggQEAKIAlpbnQJCQkoKnNldHVwKShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICosCiAJCQkJCWNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKik7CiAJYm9vbAkJCSgqcmVxX21hdGNoKShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICosCi0JCQkJCWNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKik7CisJCQkJCWNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKiwKKwkJCQkJYm9vbCBjb25maWcwKTsKIAl2b2lkCQkJKCpzdXNwZW5kKShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICopOwogCXZvaWQJCQkoKnJlc3VtZSkoc3RydWN0IHVzYl9mdW5jdGlvbiAqKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvZ2FkZ2V0LmggYi9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQuaAppbmRleCA2MTJkYmRmLi44ZTgxZjllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQuaApAQCAtMzQ2LDYgKzM0Niw4IEBACiAgKglvciBCLVBlcmlwaGVyYWwgd2FudHMgdG8gdGFrZSBob3N0IHJvbGUuCiAgKiBAcXVpcmtfZXBfb3V0X2FsaWduZWRfc2l6ZTogZXBvdXQgcmVxdWlyZXMgYnVmZmVyIHNpemUgdG8gYmUgYWxpZ25lZCB0bwogICoJTWF4UGFja2V0U2l6ZS4KKyAqIEBxdWlya19hdm9pZHNfc2tiX3Jlc2VydmU6IHVkYy9wbGF0Zm9ybSB3YW50cyB0byBhdm9pZCBza2JfcmVzZXJ2ZSgpIGluCisgKgl1X2V0aGVyLmMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KICAqIEBpc19zZWxmcG93ZXJlZDogaWYgdGhlIGdhZGdldCBpcyBzZWxmLXBvd2VyZWQuCiAgKiBAZGVhY3RpdmF0ZWQ6IFRydWUgaWYgZ2FkZ2V0IGlzIGRlYWN0aXZhdGVkIC0gaW4gZGVhY3RpdmF0ZWQgc3RhdGUgaXQgY2Fubm90CiAgKgliZSBjb25uZWN0ZWQuCkBAIC0zOTgsNiArNDAwLDcgQEAKIAl1bnNpZ25lZAkJCXF1aXJrX2FsdHNldF9ub3Rfc3VwcDoxOwogCXVuc2lnbmVkCQkJcXVpcmtfc3RhbGxfbm90X3N1cHA6MTsKIAl1bnNpZ25lZAkJCXF1aXJrX3pscF9ub3Rfc3VwcDoxOworCXVuc2lnbmVkCQkJcXVpcmtfYXZvaWRzX3NrYl9yZXNlcnZlOjE7CiAJdW5zaWduZWQJCQlpc19zZWxmcG93ZXJlZDoxOwogCXVuc2lnbmVkCQkJZGVhY3RpdmF0ZWQ6MTsKIAl1bnNpZ25lZAkJCWNvbm5lY3RlZDoxOwpAQCAtNDE4LDggKzQyMSwyMCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmKGdhZGdldCktPmVwX2xpc3QsIGVwX2xpc3QpCiAKIC8qKgorICogdXNiX2VwX2FsaWduIC0gcmV0dXJucyBAbGVuIGFsaWduZWQgdG8gZXAncyBtYXhwYWNrZXRzaXplLgorICogQGVwOiB0aGUgZW5kcG9pbnQgd2hvc2UgbWF4cGFja2V0c2l6ZSBpcyB1c2VkIHRvIGFsaWduIEBsZW4KKyAqIEBsZW46IGJ1ZmZlciBzaXplJ3MgbGVuZ3RoIHRvIGFsaWduIHRvIEBlcCdzIG1heHBhY2tldHNpemUKKyAqCisgKiBUaGlzIGhlbHBlciBpcyB1c2VkIHRvIGFsaWduIGJ1ZmZlcidzIHNpemUgdG8gYW4gZXAncyBtYXhwYWNrZXRzaXplLgorICovCitzdGF0aWMgaW5saW5lIHNpemVfdCB1c2JfZXBfYWxpZ24oc3RydWN0IHVzYl9lcCAqZXAsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIHJvdW5kX3VwKGxlbiwgKHNpemVfdClsZTE2X3RvX2NwdShlcC0+ZGVzYy0+d01heFBhY2tldFNpemUpKTsKK30KKworLyoqCiAgKiB1c2JfZXBfYWxpZ25fbWF5YmUgLSByZXR1cm5zIEBsZW4gYWxpZ25lZCB0byBlcCdzIG1heHBhY2tldHNpemUgaWYgZ2FkZ2V0Ci0gKglyZXF1aXJlcyBxdWlya19lcF9vdXRfYWxpZ25lZF9zaXplLCBvdGhlcndpc2UgcmVndWVucyBsZW4uCisgKglyZXF1aXJlcyBxdWlya19lcF9vdXRfYWxpZ25lZF9zaXplLCBvdGhlcndpc2UgcmV0dXJucyBsZW4uCiAgKiBAZzogY29udHJvbGxlciB0byBjaGVjayBmb3IgcXVpcmsKICAqIEBlcDogdGhlIGVuZHBvaW50IHdob3NlIG1heHBhY2tldHNpemUgaXMgdXNlZCB0byBhbGlnbiBAbGVuCiAgKiBAbGVuOiBidWZmZXIgc2l6ZSdzIGxlbmd0aCB0byBhbGlnbiB0byBAZXAncyBtYXhwYWNrZXRzaXplCkBAIC00MzAsOCArNDQ1LDcgQEAKIHN0YXRpYyBpbmxpbmUgc2l6ZV90CiB1c2JfZXBfYWxpZ25fbWF5YmUoc3RydWN0IHVzYl9nYWRnZXQgKmcsIHN0cnVjdCB1c2JfZXAgKmVwLCBzaXplX3QgbGVuKQogewotCXJldHVybiAhZy0+cXVpcmtfZXBfb3V0X2FsaWduZWRfc2l6ZSA/IGxlbiA6Ci0JCQlyb3VuZF91cChsZW4sIChzaXplX3QpZXAtPmRlc2MtPndNYXhQYWNrZXRTaXplKTsKKwlyZXR1cm4gZy0+cXVpcmtfZXBfb3V0X2FsaWduZWRfc2l6ZSA/IHVzYl9lcF9hbGlnbihlcCwgbGVuKSA6IGxlbjsKIH0KIAogLyoqCkBAIC00NjMsNiArNDc3LDE2IEBACiB9CiAKIC8qKgorICogZ2FkZ2V0X2F2b2lkc19za2JfcmVzZXJ2ZSAtIHJldHVybiB0cnVlIGlmZiB0aGUgaGFyZHdhcmUgd291bGQgbGlrZSB0byBhdm9pZAorICoJc2tiX3Jlc2VydmUgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KKyAqIEBnOiBjb250cm9sbGVyIHRvIGNoZWNrIGZvciBxdWlyaworICovCitzdGF0aWMgaW5saW5lIGludCBnYWRnZXRfYXZvaWRzX3NrYl9yZXNlcnZlKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnKQoreworCXJldHVybiBnLT5xdWlya19hdm9pZHNfc2tiX3Jlc2VydmU7Cit9CisKKy8qKgogICogZ2FkZ2V0X2lzX2R1YWxzcGVlZCAtIHJldHVybiB0cnVlIGlmZiB0aGUgaGFyZHdhcmUgaGFuZGxlcyBoaWdoIHNwZWVkCiAgKiBAZzogY29udHJvbGxlciB0aGF0IG1pZ2h0IHN1cHBvcnQgYm90aCBoaWdoIGFuZCBmdWxsIHNwZWVkcwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oIGIvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaAppbmRleCAyNDVmNTdkLi4wYWFlMWIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKQEAgLTgxLDYgKzgxLDggQEAKIAkJLyogU2V0cyBtYXhfc2VjdG9ycyB0byAyNDAgKi8JCQlcCiAJVVNfRkxBRyhOT19SRVBPUlRfTFVOUywJMHgxMDAwMDAwMCkJCQlcCiAJCS8qIENhbm5vdCBoYW5kbGUgUkVQT1JUX0xVTlMgKi8JCQlcCisJVVNfRkxBRyhBTFdBWVNfU1lOQywgMHgyMDAwMDAwMCkJCQlcCisJCS8qIGxpZXMgYWJvdXQgY2FjaGluZywgc28gYWx3YXlzIHN5bmMgKi8JXAogCiAjZGVmaW5lIFVTX0ZMQUcobmFtZSwgdmFsdWUpCVVTX0ZMXyMjbmFtZSA9IHZhbHVlICwKIGVudW0geyBVU19ET19BTExfRkxBR1MgfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdm1lLmggYi9pbmNsdWRlL2xpbnV4L3ZtZS5oCmluZGV4IDcxZTRhNmQuLmVhNjA5NWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdm1lLmgKKysrIGIvaW5jbHVkZS9saW51eC92bWUuaApAQCAtMTY2LDcgKzE2Niw3IEBACiBpbnQgdm1lX2xtX2NvdW50KHN0cnVjdCB2bWVfcmVzb3VyY2UgKik7CiBpbnQgdm1lX2xtX3NldChzdHJ1Y3Qgdm1lX3Jlc291cmNlICosIHVuc2lnbmVkIGxvbmcgbG9uZywgdTMyLCB1MzIpOwogaW50IHZtZV9sbV9nZXQoc3RydWN0IHZtZV9yZXNvdXJjZSAqLCB1bnNpZ25lZCBsb25nIGxvbmcgKiwgdTMyICosIHUzMiAqKTsKLWludCB2bWVfbG1fYXR0YWNoKHN0cnVjdCB2bWVfcmVzb3VyY2UgKiwgaW50LCB2b2lkICgqY2FsbGJhY2spKGludCkpOworaW50IHZtZV9sbV9hdHRhY2goc3RydWN0IHZtZV9yZXNvdXJjZSAqLCBpbnQsIHZvaWQgKCpjYWxsYmFjaykodm9pZCAqKSwgdm9pZCAqKTsKIGludCB2bWVfbG1fZGV0YWNoKHN0cnVjdCB2bWVfcmVzb3VyY2UgKiwgaW50KTsKIHZvaWQgdm1lX2xtX2ZyZWUoc3RydWN0IHZtZV9yZXNvdXJjZSAqKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93YWl0LmggYi9pbmNsdWRlL2xpbnV4L3dhaXQuaAppbmRleCBjM2ZmNzRkLi4yNDA4ZThkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC93YWl0LmgKKysrIGIvaW5jbHVkZS9saW51eC93YWl0LmgKQEAgLTI0OCw2ICsyNDgsOCBAQAogCSghX19idWlsdGluX2NvbnN0YW50X3Aoc3RhdGUpIHx8CQkJCVwKIAkJc3RhdGUgPT0gVEFTS19JTlRFUlJVUFRJQkxFIHx8IHN0YXRlID09IFRBU0tfS0lMTEFCTEUpCVwKIAorZXh0ZXJuIHZvaWQgaW5pdF93YWl0X2VudHJ5KHdhaXRfcXVldWVfdCAqX193YWl0LCBpbnQgZmxhZ3MpOworCiAvKgogICogVGhlIGJlbG93IG1hY3JvIF9fX3dhaXRfZXZlbnQoKSBoYXMgYW4gZXhwbGljaXQgc2hhZG93IG9mIHRoZSBfX3JldAogICogdmFyaWFibGUgd2hlbiB1c2VkIGZyb20gdGhlIHdhaXRfZXZlbnRfKigpIG1hY3Jvcy4KQEAgLTI2NiwxMiArMjY4LDcgQEAKIAl3YWl0X3F1ZXVlX3QgX193YWl0OwkJCQkJCVwKIAlsb25nIF9fcmV0ID0gcmV0OwkvKiBleHBsaWNpdCBzaGFkb3cgKi8JCQlcCiAJCQkJCQkJCQlcCi0JSU5JVF9MSVNUX0hFQUQoJl9fd2FpdC50YXNrX2xpc3QpOwkJCQlcCi0JaWYgKGV4Y2x1c2l2ZSkJCQkJCQkJXAotCQlfX3dhaXQuZmxhZ3MgPSBXUV9GTEFHX0VYQ0xVU0lWRTsJCQlcCi0JZWxzZQkJCQkJCQkJXAotCQlfX3dhaXQuZmxhZ3MgPSAwOwkJCQkJXAotCQkJCQkJCQkJXAorCWluaXRfd2FpdF9lbnRyeSgmX193YWl0LCBleGNsdXNpdmUgPyBXUV9GTEFHX0VYQ0xVU0lWRSA6IDApOwlcCiAJZm9yICg7OykgewkJCQkJCQlcCiAJCWxvbmcgX19pbnQgPSBwcmVwYXJlX3RvX3dhaXRfZXZlbnQoJndxLCAmX193YWl0LCBzdGF0ZSk7XAogCQkJCQkJCQkJXApAQCAtMjgwLDEyICsyNzcsNyBAQAogCQkJCQkJCQkJXAogCQlpZiAoX19fd2FpdF9pc19pbnRlcnJ1cHRpYmxlKHN0YXRlKSAmJiBfX2ludCkgewkJXAogCQkJX19yZXQgPSBfX2ludDsJCQkJCVwKLQkJCWlmIChleGNsdXNpdmUpIHsJCQkJXAotCQkJCWFib3J0X2V4Y2x1c2l2ZV93YWl0KCZ3cSwgJl9fd2FpdCwJXAotCQkJCQkJICAgICBzdGF0ZSwgTlVMTCk7CVwKLQkJCQlnb3RvIF9fb3V0OwkJCQlcCi0JCQl9CQkJCQkJXAotCQkJYnJlYWs7CQkJCQkJXAorCQkJZ290byBfX291dDsJCQkJCVwKIAkJfQkJCQkJCQlcCiAJCQkJCQkJCQlcCiAJCWNtZDsJCQkJCQkJXApAQCAtOTg5LDcgKzk4MSw2IEBACiB2b2lkIHByZXBhcmVfdG9fd2FpdF9leGNsdXNpdmUod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHdhaXRfcXVldWVfdCAqd2FpdCwgaW50IHN0YXRlKTsKIGxvbmcgcHJlcGFyZV90b193YWl0X2V2ZW50KHdhaXRfcXVldWVfaGVhZF90ICpxLCB3YWl0X3F1ZXVlX3QgKndhaXQsIGludCBzdGF0ZSk7CiB2b2lkIGZpbmlzaF93YWl0KHdhaXRfcXVldWVfaGVhZF90ICpxLCB3YWl0X3F1ZXVlX3QgKndhaXQpOwotdm9pZCBhYm9ydF9leGNsdXNpdmVfd2FpdCh3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgd2FpdF9xdWV1ZV90ICp3YWl0LCB1bnNpZ25lZCBpbnQgbW9kZSwgdm9pZCAqa2V5KTsKIGxvbmcgd2FpdF93b2tlbih3YWl0X3F1ZXVlX3QgKndhaXQsIHVuc2lnbmVkIG1vZGUsIGxvbmcgdGltZW91dCk7CiBpbnQgd29rZW5fd2FrZV9mdW5jdGlvbih3YWl0X3F1ZXVlX3QgKndhaXQsIHVuc2lnbmVkIG1vZGUsIGludCBzeW5jLCB2b2lkICprZXkpOwogaW50IGF1dG9yZW1vdmVfd2FrZV9mdW5jdGlvbih3YWl0X3F1ZXVlX3QgKndhaXQsIHVuc2lnbmVkIG1vZGUsIGludCBzeW5jLCB2b2lkICprZXkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93aW5fbWlubWF4LmggYi9pbmNsdWRlL2xpbnV4L3dpbl9taW5tYXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjU2OTYwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC93aW5fbWlubWF4LmgKQEAgLTAsMCArMSwzNyBAQAorLyoqCisgKiBsaWIvbWlubWF4LmM6IHdpbmRvd2VkIG1pbi9tYXggdHJhY2tlciBieSBLYXRobGVlbiBOaWNob2xzLgorICoKKyAqLworI2lmbmRlZiBNSU5NQVhfSAorI2RlZmluZSBNSU5NQVhfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogQSBzaW5nbGUgZGF0YSBwb2ludCBmb3Igb3VyIHBhcmFtZXRlcml6ZWQgbWluLW1heCB0cmFja2VyICovCitzdHJ1Y3QgbWlubWF4X3NhbXBsZSB7CisJdTMyCXQ7CS8qIHRpbWUgbWVhc3VyZW1lbnQgd2FzIHRha2VuICovCisJdTMyCXY7CS8qIHZhbHVlIG1lYXN1cmVkICovCit9OworCisvKiBTdGF0ZSBmb3IgdGhlIHBhcmFtZXRlcml6ZWQgbWluLW1heCB0cmFja2VyICovCitzdHJ1Y3QgbWlubWF4IHsKKwlzdHJ1Y3QgbWlubWF4X3NhbXBsZSBzWzNdOworfTsKKworc3RhdGljIGlubGluZSB1MzIgbWlubWF4X2dldChjb25zdCBzdHJ1Y3QgbWlubWF4ICptKQoreworCXJldHVybiBtLT5zWzBdLnY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1pbm1heF9yZXNldChzdHJ1Y3QgbWlubWF4ICptLCB1MzIgdCwgdTMyIG1lYXMpCit7CisJc3RydWN0IG1pbm1heF9zYW1wbGUgdmFsID0geyAudCA9IHQsIC52ID0gbWVhcyB9OworCisJbS0+c1syXSA9IG0tPnNbMV0gPSBtLT5zWzBdID0gdmFsOworCXJldHVybiBtLT5zWzBdLnY7Cit9CisKK3UzMiBtaW5tYXhfcnVubmluZ19tYXgoc3RydWN0IG1pbm1heCAqbSwgdTMyIHdpbiwgdTMyIHQsIHUzMiBtZWFzKTsKK3UzMiBtaW5tYXhfcnVubmluZ19taW4oc3RydWN0IG1pbm1heCAqbSwgdTMyIHdpbiwgdTMyIHQsIHUzMiBtZWFzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2NlYy5oIGIvaW5jbHVkZS9tZWRpYS9jZWMuaAppbmRleCBkYzc4NTRiLi5mZGI1ZDYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL2NlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvY2VjLmgKQEAgLTU3LDggKzU3LDggQEAKIAlpbnQgbWlub3I7CiAJYm9vbCByZWdpc3RlcmVkOwogCWJvb2wgdW5yZWdpc3RlcmVkOwotCXN0cnVjdCBtdXRleCBmaHNfbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZoczsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKIH07CiAKIHN0cnVjdCBjZWNfYWRhcHRlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2FjdF9hcGkuaCBiL2luY2x1ZGUvbmV0L2FjdF9hcGkuaAppbmRleCA0MWU2YTI0Li44MmYzYzkxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9hY3RfYXBpLmgKKysrIGIvaW5jbHVkZS9uZXQvYWN0X2FwaS5oCkBAIC0xNzYsOCArMTc2LDggQEAKIGludCB0Y2ZfdW5yZWdpc3Rlcl9hY3Rpb24oc3RydWN0IHRjX2FjdGlvbl9vcHMgKmEsCiAJCQkgIHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyAqb3BzKTsKIGludCB0Y2ZfYWN0aW9uX2Rlc3Ryb3koc3RydWN0IGxpc3RfaGVhZCAqYWN0aW9ucywgaW50IGJpbmQpOwotaW50IHRjZl9hY3Rpb25fZXhlYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICphY3Rpb25zLAotCQkgICAgc3RydWN0IHRjZl9yZXN1bHQgKnJlcyk7CitpbnQgdGNmX2FjdGlvbl9leGVjKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKiphY3Rpb25zLAorCQkgICAgaW50IG5yX2FjdGlvbnMsIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpOwogaW50IHRjZl9hY3Rpb25faW5pdChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBubGF0dHIgKm5sYSwKIAkJCQkgIHN0cnVjdCBubGF0dHIgKmVzdCwgY2hhciAqbiwgaW50IG92ciwKIAkJCQkgIGludCBiaW5kLCBzdHJ1Y3QgbGlzdF9oZWFkICopOwpAQCAtMTg5LDMwICsxODksMTcgQEAKIGludCB0Y2ZfYWN0aW9uX2R1bXBfMShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQsIGludCk7CiBpbnQgdGNmX2FjdGlvbl9jb3B5X3N0YXRzKHN0cnVjdCBza19idWZmICosIHN0cnVjdCB0Y19hY3Rpb24gKiwgaW50KTsKIAotI2RlZmluZSB0Y19ub19hY3Rpb25zKF9leHRzKSBcCi0JKGxpc3RfZW1wdHkoJihfZXh0cyktPmFjdGlvbnMpKQotCi0jZGVmaW5lIHRjX2Zvcl9lYWNoX2FjdGlvbihfYSwgX2V4dHMpIFwKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGEsICYoX2V4dHMpLT5hY3Rpb25zLCBsaXN0KQotCi0jZGVmaW5lIHRjX3NpbmdsZV9hY3Rpb24oX2V4dHMpIFwKLQkobGlzdF9pc19zaW5ndWxhcigmKF9leHRzKS0+YWN0aW9ucykpCisjZW5kaWYgLyogQ09ORklHX05FVF9DTFNfQUNUICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0Y2ZfYWN0aW9uX3N0YXRzX3VwZGF0ZShzdHJ1Y3QgdGNfYWN0aW9uICphLCB1NjQgYnl0ZXMsCiAJCQkJCSAgIHU2NCBwYWNrZXRzLCB1NjQgbGFzdHVzZSkKIHsKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKIAlpZiAoIWEtPm9wcy0+c3RhdHNfdXBkYXRlKQogCQlyZXR1cm47CiAKIAlhLT5vcHMtPnN0YXRzX3VwZGF0ZShhLCBieXRlcywgcGFja2V0cywgbGFzdHVzZSk7CisjZW5kaWYKIH0KIAotI2Vsc2UgLyogQ09ORklHX05FVF9DTFNfQUNUICovCi0KLSNkZWZpbmUgdGNfbm9fYWN0aW9ucyhfZXh0cykgdHJ1ZQotI2RlZmluZSB0Y19mb3JfZWFjaF9hY3Rpb24oX2EsIF9leHRzKSB3aGlsZSAoKHZvaWQpKF9hKSwgMCkKLSNkZWZpbmUgdGNfc2luZ2xlX2FjdGlvbihfZXh0cykgZmFsc2UKLSNkZWZpbmUgdGNmX2FjdGlvbl9zdGF0c191cGRhdGUoYSwgYnl0ZXMsIHBhY2tldHMsIGxhc3R1c2UpCi0KLSNlbmRpZiAvKiBDT05GSUdfTkVUX0NMU19BQ1QgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYWRkcmNvbmYuaCBiL2luY2x1ZGUvbmV0L2FkZHJjb25mLmgKaW5kZXggOTgyNmQzYS4uZjJkMDcyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYWRkcmNvbmYuaAorKysgYi9pbmNsdWRlL25ldC9hZGRyY29uZi5oCkBAIC0xLDggKzEsOSBAQAogI2lmbmRlZiBfQUREUkNPTkZfSAogI2RlZmluZSBfQUREUkNPTkZfSAogCi0jZGVmaW5lIE1BWF9SVFJfU09MSUNJVEFUSU9OUwkJMworI2RlZmluZSBNQVhfUlRSX1NPTElDSVRBVElPTlMJCS0xCQkvKiB1bmxpbWl0ZWQgKi8KICNkZWZpbmUgUlRSX1NPTElDSVRBVElPTl9JTlRFUlZBTAkoNCpIWikKKyNkZWZpbmUgUlRSX1NPTElDSVRBVElPTl9NQVhfSU5URVJWQUwJKDM2MDAqSFopCS8qIDEgaG91ciAqLwogCiAjZGVmaW5lIE1JTl9WQUxJRF9MSUZFVElNRQkJKDIqMzYwMCkJLyogMiBob3VycyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9hZl9yeHJwYy5oIGIvaW5jbHVkZS9uZXQvYWZfcnhycGMuaAppbmRleCBhYzFiYzNjLi4xMDYxYTQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9hZl9yeHJwYy5oCisrKyBiL2luY2x1ZGUvbmV0L2FmX3J4cnBjLmgKQEAgLTEyLDQyICsxMiwzOSBAQAogI2lmbmRlZiBfTkVUX1JYUlBDX0gKICNkZWZpbmUgX05FVF9SWFJQQ19ICiAKLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9yeHJwYy5oPgogCitzdHJ1Y3Qga2V5Oworc3RydWN0IHNvY2s7CitzdHJ1Y3Qgc29ja2V0Owogc3RydWN0IHJ4cnBjX2NhbGw7CiAKLS8qCi0gKiB0aGUgbWFyayBhcHBsaWVkIHRvIHNvY2tldCBidWZmZXJzIHRoYXQgbWF5IGJlIGludGVyY2VwdGVkCi0gKi8KLWVudW0gcnhycGNfc2tiX21hcmsgewotCVJYUlBDX1NLQl9NQVJLX0RBVEEsCQkvKiBkYXRhIG1lc3NhZ2UgKi8KLQlSWFJQQ19TS0JfTUFSS19GSU5BTF9BQ0ssCS8qIGZpbmFsIEFDSyByZWNlaXZlZCBtZXNzYWdlICovCi0JUlhSUENfU0tCX01BUktfQlVTWSwJCS8qIHNlcnZlciBidXN5IG1lc3NhZ2UgKi8KLQlSWFJQQ19TS0JfTUFSS19SRU1PVEVfQUJPUlQsCS8qIHJlbW90ZSBhYm9ydCBtZXNzYWdlICovCi0JUlhSUENfU0tCX01BUktfTE9DQUxfQUJPUlQsCS8qIGxvY2FsIGFib3J0IG1lc3NhZ2UgKi8KLQlSWFJQQ19TS0JfTUFSS19ORVRfRVJST1IsCS8qIG5ldHdvcmsgZXJyb3IgbWVzc2FnZSAqLwotCVJYUlBDX1NLQl9NQVJLX0xPQ0FMX0VSUk9SLAkvKiBsb2NhbCBlcnJvciBtZXNzYWdlICovCi0JUlhSUENfU0tCX01BUktfTkVXX0NBTEwsCS8qIGxvY2FsIGVycm9yIG1lc3NhZ2UgKi8KLX07Cit0eXBlZGVmIHZvaWQgKCpyeHJwY19ub3RpZnlfcnhfdCkoc3RydWN0IHNvY2sgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcpOwordHlwZWRlZiB2b2lkICgqcnhycGNfbm90aWZ5X25ld19jYWxsX3QpKHN0cnVjdCBzb2NrICosIHN0cnVjdCByeHJwY19jYWxsICosCisJCQkJCXVuc2lnbmVkIGxvbmcpOwordHlwZWRlZiB2b2lkICgqcnhycGNfZGlzY2FyZF9uZXdfY2FsbF90KShzdHJ1Y3QgcnhycGNfY2FsbCAqLCB1bnNpZ25lZCBsb25nKTsKK3R5cGVkZWYgdm9pZCAoKnJ4cnBjX3VzZXJfYXR0YWNoX2NhbGxfdCkoc3RydWN0IHJ4cnBjX2NhbGwgKiwgdW5zaWduZWQgbG9uZyk7CiAKLXR5cGVkZWYgdm9pZCAoKnJ4cnBjX2ludGVyY2VwdG9yX3QpKHN0cnVjdCBzb2NrICosIHVuc2lnbmVkIGxvbmcsCi0JCQkJICAgIHN0cnVjdCBza19idWZmICopOwotdm9pZCByeHJwY19rZXJuZWxfaW50ZXJjZXB0X3J4X21lc3NhZ2VzKHN0cnVjdCBzb2NrZXQgKiwgcnhycGNfaW50ZXJjZXB0b3JfdCk7Cit2b2lkIHJ4cnBjX2tlcm5lbF9uZXdfY2FsbF9ub3RpZmljYXRpb24oc3RydWN0IHNvY2tldCAqLAorCQkJCQlyeHJwY19ub3RpZnlfbmV3X2NhbGxfdCwKKwkJCQkJcnhycGNfZGlzY2FyZF9uZXdfY2FsbF90KTsKIHN0cnVjdCByeHJwY19jYWxsICpyeHJwY19rZXJuZWxfYmVnaW5fY2FsbChzdHJ1Y3Qgc29ja2V0ICosCiAJCQkJCSAgIHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqLAogCQkJCQkgICBzdHJ1Y3Qga2V5ICosCiAJCQkJCSAgIHVuc2lnbmVkIGxvbmcsCi0JCQkJCSAgIGdmcF90KTsKLWludCByeHJwY19rZXJuZWxfc2VuZF9kYXRhKHN0cnVjdCByeHJwY19jYWxsICosIHN0cnVjdCBtc2doZHIgKiwgc2l6ZV90KTsKLXZvaWQgcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKiwgdTMyKTsKLXZvaWQgcnhycGNfa2VybmVsX2VuZF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICopOwotYm9vbCByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0KHN0cnVjdCBza19idWZmICopOwotdTMyIHJ4cnBjX2tlcm5lbF9nZXRfYWJvcnRfY29kZShzdHJ1Y3Qgc2tfYnVmZiAqKTsKLWludCByeHJwY19rZXJuZWxfZ2V0X2Vycm9yX251bWJlcihzdHJ1Y3Qgc2tfYnVmZiAqKTsKLXZvaWQgcnhycGNfa2VybmVsX2RhdGFfZGVsaXZlcmVkKHN0cnVjdCBza19idWZmICopOwotdm9pZCByeHJwY19rZXJuZWxfZnJlZV9za2Ioc3RydWN0IHNrX2J1ZmYgKik7Ci1zdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfa2VybmVsX2FjY2VwdF9jYWxsKHN0cnVjdCBzb2NrZXQgKiwgdW5zaWduZWQgbG9uZyk7Ci1pbnQgcnhycGNfa2VybmVsX3JlamVjdF9jYWxsKHN0cnVjdCBzb2NrZXQgKik7CisJCQkJCSAgIGdmcF90LAorCQkJCQkgICByeHJwY19ub3RpZnlfcnhfdCk7CitpbnQgcnhycGNfa2VybmVsX3NlbmRfZGF0YShzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCByeHJwY19jYWxsICosCisJCQkgICBzdHJ1Y3QgbXNnaGRyICosIHNpemVfdCk7CitpbnQgcnhycGNfa2VybmVsX3JlY3ZfZGF0YShzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCByeHJwY19jYWxsICosCisJCQkgICB2b2lkICosIHNpemVfdCwgc2l6ZV90ICosIGJvb2wsIHUzMiAqKTsKK3ZvaWQgcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoc3RydWN0IHNvY2tldCAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqLAorCQkJICAgICB1MzIsIGludCwgY29uc3QgY2hhciAqKTsKK3ZvaWQgcnhycGNfa2VybmVsX2VuZF9jYWxsKHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKik7Cit2b2lkIHJ4cnBjX2tlcm5lbF9nZXRfcGVlcihzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCByeHJwY19jYWxsICosCisJCQkgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKik7CitpbnQgcnhycGNfa2VybmVsX2NoYXJnZV9hY2NlcHQoc3RydWN0IHNvY2tldCAqLCByeHJwY19ub3RpZnlfcnhfdCwKKwkJCSAgICAgICByeHJwY191c2VyX2F0dGFjaF9jYWxsX3QsIHVuc2lnbmVkIGxvbmcsIGdmcF90KTsKIAogI2VuZGlmIC8qIF9ORVRfUlhSUENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYWZfdW5peC5oIGIvaW5jbHVkZS9uZXQvYWZfdW5peC5oCmluZGV4IDliNGM0MTguLmZkNjBlY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2FmX3VuaXguaAorKysgYi9pbmNsdWRlL25ldC9hZl91bml4LmgKQEAgLTUyLDcgKzUyLDcgQEAKIAlzdHJ1Y3Qgc29jawkJc2s7CiAJc3RydWN0IHVuaXhfYWRkcmVzcyAgICAgKmFkZHI7CiAJc3RydWN0IHBhdGgJCXBhdGg7Ci0Jc3RydWN0IG11dGV4CQlyZWFkbG9jazsKKwlzdHJ1Y3QgbXV0ZXgJCWlvbG9jaywgYmluZGxvY2s7CiAJc3RydWN0IHNvY2sJCSpwZWVyOwogCXN0cnVjdCBsaXN0X2hlYWQJbGluazsKIAlhdG9taWNfbG9uZ190CQlpbmZsaWdodDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9ibHVldG9vdGguaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9ibHVldG9vdGguaAppbmRleCBiZmQxNTkwLi4wYTFlMjFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oCkBAIC0yOSw3ICsyOSw4IEBACiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogCi0jZGVmaW5lIEJUX1NVQlNZU19WRVJTSU9OICIyLjIxIgorI2RlZmluZSBCVF9TVUJTWVNfVkVSU0lPTgkyCisjZGVmaW5lIEJUX1NVQlNZU19SRVZJU0lPTgkyMgogCiAjaWZuZGVmIEFGX0JMVUVUT09USAogI2RlZmluZSBBRl9CTFVFVE9PVEgJMzEKQEAgLTM3MSw2ICszNzIsNyBAQAogdm9pZCBoY2lfc29ja19jbGVhcl9mbGFnKHN0cnVjdCBzb2NrICpzaywgaW50IG5yKTsKIGludCBoY2lfc29ja190ZXN0X2ZsYWcoc3RydWN0IHNvY2sgKnNrLCBpbnQgbnIpOwogdW5zaWduZWQgc2hvcnQgaGNpX3NvY2tfZ2V0X2NoYW5uZWwoc3RydWN0IHNvY2sgKnNrKTsKK3UzMiBoY2lfc29ja19nZXRfY29va2llKHN0cnVjdCBzb2NrICpzayk7CiAKIGludCBoY2lfc29ja19pbml0KHZvaWQpOwogdm9pZCBoY2lfc29ja19jbGVhbnVwKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaS5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaS5oCmluZGV4IDAwM2IyNTIuLjk5YWE1ZTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2kuaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmgKQEAgLTYzLDYgKzYzLDcgQEAKICNkZWZpbmUgSENJX1NESU8JNgogI2RlZmluZSBIQ0lfU1BJCQk3CiAjZGVmaW5lIEhDSV9JMkMJCTgKKyNkZWZpbmUgSENJX1NNRAkJOQogCiAvKiBIQ0kgY29udHJvbGxlciB0eXBlcyAqLwogI2RlZmluZSBIQ0lfUFJJTUFSWQkweDAwCkBAIC0yMDcsNyArMjA4LDExIEBACiAJSENJX01HTVRfSU5ERVhfRVZFTlRTLAogCUhDSV9NR01UX1VOQ09ORl9JTkRFWF9FVkVOVFMsCiAJSENJX01HTVRfRVhUX0lOREVYX0VWRU5UUywKLQlIQ0lfTUdNVF9HRU5FUklDX0VWRU5UUywKKwlIQ0lfTUdNVF9FWFRfSU5GT19FVkVOVFMsCisJSENJX01HTVRfT1BUSU9OX0VWRU5UUywKKwlIQ0lfTUdNVF9TRVRUSU5HX0VWRU5UUywKKwlIQ0lfTUdNVF9ERVZfQ0xBU1NfRVZFTlRTLAorCUhDSV9NR01UX0xPQ0FMX05BTUVfRVZFTlRTLAogCUhDSV9NR01UX09PQl9EQVRBX0VWRU5UUywKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfY29yZS5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmgKaW5kZXggZWU3ZmM0Ny4uZjAwYmY2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmgKQEAgLTIxMSw2ICsyMTEsNyBAQAogCV9fdTgJCWRldl9uYW1lW0hDSV9NQVhfTkFNRV9MRU5HVEhdOwogCV9fdTgJCXNob3J0X25hbWVbSENJX01BWF9TSE9SVF9OQU1FX0xFTkdUSF07CiAJX191OAkJZWlyW0hDSV9NQVhfRUlSX0xFTkdUSF07CisJX191MTYJCWFwcGVhcmFuY2U7CiAJX191OAkJZGV2X2NsYXNzWzNdOwogCV9fdTgJCW1ham9yX2NsYXNzOwogCV9fdTgJCW1pbm9yX2NsYXNzOwpAQCAtMzk5LDcgKzQwMCw5IEBACiAJc3RydWN0IGRlbGF5ZWRfd29yawlycGFfZXhwaXJlZDsKIAliZGFkZHJfdAkJcnBhOwogCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQlRfTEVEUykKIAlzdHJ1Y3QgbGVkX3RyaWdnZXIJKnBvd2VyX2xlZDsKKyNlbmRpZgogCiAJaW50ICgqb3Blbikoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwogCWludCAoKmNsb3NlKShzdHJ1Y3QgaGNpX2RldiAqaGRldik7CkBAIC0xMDI2LDggKzEwMjksOCBAQAogaW50IGhjaV9yZXNldF9kZXYoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwogaW50IGhjaV9yZWN2X2ZyYW1lKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCBoY2lfcmVjdl9kaWFnKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXZvaWQgaGNpX3NldF9od19pbmZvKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLik7Ci12b2lkIGhjaV9zZXRfZndfaW5mbyhzdHJ1Y3QgaGNpX2RldiAqaGRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pOworX19wcmludGYoMiwgMykgdm9pZCBoY2lfc2V0X2h3X2luZm8oc3RydWN0IGhjaV9kZXYgKmhkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK19fcHJpbnRmKDIsIDMpIHZvaWQgaGNpX3NldF9md19pbmZvKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiBpbnQgaGNpX2Rldl9vcGVuKF9fdTE2IGRldik7CiBpbnQgaGNpX2Rldl9jbG9zZShfX3UxNiBkZXYpOwogaW50IGhjaV9kZXZfZG9fY2xvc2Uoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwpAQCAtMTQwNCw2ICsxNDA3LDkgQEAKIHZvaWQgaGNpX3NlbmRfdG9fY2hhbm5lbCh1bnNpZ25lZCBzaG9ydCBjaGFubmVsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJIGludCBmbGFnLCBzdHJ1Y3Qgc29jayAqc2tpcF9zayk7CiB2b2lkIGhjaV9zZW5kX3RvX21vbml0b3Ioc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpOwordm9pZCBoY2lfc2VuZF9tb25pdG9yX2N0cmxfZXZlbnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHUxNiBldmVudCwKKwkJCQkgdm9pZCAqZGF0YSwgdTE2IGRhdGFfbGVuLCBrdGltZV90IHRzdGFtcCwKKwkJCQkgaW50IGZsYWcsIHN0cnVjdCBzb2NrICpza2lwX3NrKTsKIAogdm9pZCBoY2lfc29ja19kZXZfZXZlbnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGludCBldmVudCk7CiAKQEAgLTE0NDksNiArMTQ1NSw3IEBACiAjZGVmaW5lIERJU0NPVl9CUkVEUl9JTlFVSVJZX0xFTgkweDA4CiAjZGVmaW5lIERJU0NPVl9MRV9SRVNUQVJUX0RFTEFZCQltc2Vjc190b19qaWZmaWVzKDIwMCkJLyogbXNlYyAqLwogCit2b2lkIG1nbXRfZmlsbF92ZXJzaW9uX2luZm8odm9pZCAqdmVyKTsKIGludCBtZ210X25ld19zZXR0aW5ncyhzdHJ1Y3QgaGNpX2RldiAqaGRldik7CiB2b2lkIG1nbXRfaW5kZXhfYWRkZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwogdm9pZCBtZ210X2luZGV4X3JlbW92ZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9tb24uaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfbW9uLmgKaW5kZXggNTg3ZDAxMy4uMjQwNzg2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9tb24uaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX21vbi5oCkBAIC00NSw2ICs0NSwxMCBAQAogI2RlZmluZSBIQ0lfTU9OX1ZFTkRPUl9ESUFHCTExCiAjZGVmaW5lIEhDSV9NT05fU1lTVEVNX05PVEUJMTIKICNkZWZpbmUgSENJX01PTl9VU0VSX0xPR0dJTkcJMTMKKyNkZWZpbmUgSENJX01PTl9DVFJMX09QRU4JMTQKKyNkZWZpbmUgSENJX01PTl9DVFJMX0NMT1NFCTE1CisjZGVmaW5lIEhDSV9NT05fQ1RSTF9DT01NQU5ECTE2CisjZGVmaW5lIEhDSV9NT05fQ1RSTF9FVkVOVAkxNwogCiBzdHJ1Y3QgaGNpX21vbl9uZXdfaW5kZXggewogCV9fdTgJCXR5cGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvbWdtdC5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL21nbXQuaAppbmRleCA3NjQ3OTY0Li43MmE0NTZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvbWdtdC5oCisrKyBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9tZ210LmgKQEAgLTU4Niw2ICs1ODYsMjQgQEAKIAogI2RlZmluZSBNR01UX09QX1NUQVJUX0xJTUlURURfRElTQ09WRVJZCTB4MDA0MQogCisjZGVmaW5lIE1HTVRfT1BfUkVBRF9FWFRfSU5GTwkJMHgwMDQyCisjZGVmaW5lIE1HTVRfUkVBRF9FWFRfSU5GT19TSVpFCQkwCitzdHJ1Y3QgbWdtdF9ycF9yZWFkX2V4dF9pbmZvIHsKKwliZGFkZHJfdCBiZGFkZHI7CisJX191OCAgICAgdmVyc2lvbjsKKwlfX2xlMTYgICBtYW51ZmFjdHVyZXI7CisJX19sZTMyICAgc3VwcG9ydGVkX3NldHRpbmdzOworCV9fbGUzMiAgIGN1cnJlbnRfc2V0dGluZ3M7CisJX19sZTE2ICAgZWlyX2xlbjsKKwlfX3U4ICAgICBlaXJbMF07Cit9IF9fcGFja2VkOworCisjZGVmaW5lIE1HTVRfT1BfU0VUX0FQUEVBUkFOQ0UJCTB4MDA0Mworc3RydWN0IG1nbXRfY3Bfc2V0X2FwcGVhcmFuY2UgeworCV9fdTE2CWFwcGVhcmFuY2U7Cit9IF9fcGFja2VkOworI2RlZmluZSBNR01UX1NFVF9BUFBFQVJBTkNFX1NJWkUJMgorCiAjZGVmaW5lIE1HTVRfRVZfQ01EX0NPTVBMRVRFCQkweDAwMDEKIHN0cnVjdCBtZ210X2V2X2NtZF9jb21wbGV0ZSB7CiAJX19sZTE2CW9wY29kZTsKQEAgLTgwMCwzICs4MTgsOSBAQAogc3RydWN0IG1nbXRfZXZfYWR2ZXJ0aXNpbmdfcmVtb3ZlZCB7CiAJX191OCAgICBpbnN0YW5jZTsKIH0gX19wYWNrZWQ7CisKKyNkZWZpbmUgTUdNVF9FVl9FWFRfSU5GT19DSEFOR0VECTB4MDAyNQorc3RydWN0IG1nbXRfZXZfZXh0X2luZm9fY2hhbmdlZCB7CisJX19sZTE2CWVpcl9sZW47CisJX191OAllaXJbMF07Cit9IF9fcGFja2VkOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaCBiL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKaW5kZXggOWMyM2Y0ZDMuLmZlNzhmMDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKKysrIGIvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaApAQCAtNSw3ICs1LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgMjAwNi0yMDEwCUpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CiAgKiBDb3B5cmlnaHQgMjAxMy0yMDE0IEludGVsIE1vYmlsZSBDb21tdW5pY2F0aW9ucyBHbWJICi0gKiBDb3B5cmlnaHQgMjAxNQlJbnRlbCBEZXV0c2NobGFuZCBHbWJICisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2CUludGVsIERldXRzY2hsYW5kIEdtYkgKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTU5Myw2ICs1OTMsOCBAQAogCXM4IG5vaXNlOwogfTsKIAorI2RlZmluZSBDRkc4MDIxMV9NQVhfV0VQX0tFWVMJNAorCiAvKioKICAqIHN0cnVjdCBjZmc4MDIxMV9jcnlwdG9fc2V0dGluZ3MgLSBDcnlwdG8gc2V0dGluZ3MKICAqIEB3cGFfdmVyc2lvbnM6IGluZGljYXRlcyB3aGljaCwgaWYgYW55LCBXUEEgdmVyc2lvbnMgYXJlIGVuYWJsZWQKQEAgLTYxMCw2ICs2MTIsOSBAQAogICoJYWxsb3dlZCB0aHJvdWdoIGV2ZW4gb24gdW5hdXRob3JpemVkIHBvcnRzCiAgKiBAY29udHJvbF9wb3J0X25vX2VuY3J5cHQ6IFRSVUUgdG8gcHJldmVudCBlbmNyeXB0aW9uIG9mIGNvbnRyb2wgcG9ydAogICoJcHJvdG9jb2wgZnJhbWVzLgorICogQHdlcF9rZXlzOiBzdGF0aWMgV0VQIGtleXMsIGlmIG5vdCBOVUxMIHBvaW50cyB0byBhbiBhcnJheSBvZgorICoJQ0ZHODAyMTFfTUFYX1dFUF9LRVlTIFdFUCBrZXlzCisgKiBAd2VwX3R4X2tleToga2V5IGluZGV4ICgwLi4zKSBvZiB0aGUgZGVmYXVsdCBUWCBzdGF0aWMgV0VQIGtleQogICovCiBzdHJ1Y3QgY2ZnODAyMTFfY3J5cHRvX3NldHRpbmdzIHsKIAl1MzIgd3BhX3ZlcnNpb25zOwpAQCAtNjIxLDYgKzYyNiw4IEBACiAJYm9vbCBjb250cm9sX3BvcnQ7CiAJX19iZTE2IGNvbnRyb2xfcG9ydF9ldGhlcnR5cGU7CiAJYm9vbCBjb250cm9sX3BvcnRfbm9fZW5jcnlwdDsKKwlzdHJ1Y3Qga2V5X3BhcmFtcyAqd2VwX2tleXM7CisJaW50IHdlcF90eF9rZXk7CiB9OwogCiAvKioKQEAgLTY3Niw2ICs2ODMsMTggQEAKIAlzdHJ1Y3QgbWFjX2FkZHJlc3MgbWFjX2FkZHJzW107CiB9OwogCisvKgorICogY2ZnODAyMTFfYml0cmF0ZV9tYXNrIC0gbWFza3MgZm9yIGJpdHJhdGUgY29udHJvbAorICovCitzdHJ1Y3QgY2ZnODAyMTFfYml0cmF0ZV9tYXNrIHsKKwlzdHJ1Y3QgeworCQl1MzIgbGVnYWN5OworCQl1OCBodF9tY3NbSUVFRTgwMjExX0hUX01DU19NQVNLX0xFTl07CisJCXUxNiB2aHRfbWNzW05MODAyMTFfVkhUX05TU19NQVhdOworCQllbnVtIG5sODAyMTFfdHhyYXRlX2dpIGdpOworCX0gY29udHJvbFtOVU1fTkw4MDIxMV9CQU5EU107Cit9OworCiAvKioKICAqIHN0cnVjdCBjZmc4MDIxMV9hcF9zZXR0aW5ncyAtIEFQIGNvbmZpZ3VyYXRpb24KICAqCkBAIC03MDAsNiArNzE5LDcgQEAKICAqCU1BQyBhZGRyZXNzIGJhc2VkIGFjY2VzcyBjb250cm9sCiAgKiBAcGJzczogSWYgc2V0LCBzdGFydCBhcyBhIFBDUCBpbnN0ZWFkIG9mIEFQLiBSZWxldmFudCBmb3IgRE1HCiAgKgluZXR3b3Jrcy4KKyAqIEBiZWFjb25fcmF0ZTogYml0cmF0ZSB0byBiZSB1c2VkIGZvciBiZWFjb25zCiAgKi8KIHN0cnVjdCBjZmc4MDIxMV9hcF9zZXR0aW5ncyB7CiAJc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNoYW5kZWY7CkBAIC03MTksNiArNzM5LDcgQEAKIAlib29sIHAycF9vcHBfcHM7CiAJY29uc3Qgc3RydWN0IGNmZzgwMjExX2FjbF9kYXRhICphY2w7CiAJYm9vbCBwYnNzOworCXN0cnVjdCBjZmc4MDIxMV9iaXRyYXRlX21hc2sgYmVhY29uX3JhdGU7CiB9OwogCiAvKioKQEAgLTExMDIsNiArMTEyMyw3IEBACiAJc3RydWN0IGNmZzgwMjExX3RpZF9zdGF0cyBwZXJ0aWRbSUVFRTgwMjExX05VTV9USURTICsgMV07CiB9OwogCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQ0ZHODAyMTEpCiAvKioKICAqIGNmZzgwMjExX2dldF9zdGF0aW9uIC0gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBnaXZlbiBzdGF0aW9uCiAgKiBAZGV2OiB0aGUgZGV2aWNlIHdoZXJlIHRoZSBzdGF0aW9uIGlzIHN1cHBvc2VkIHRvIGJlIGNvbm5lY3RlZCB0bwpAQCAtMTExNCw2ICsxMTM2LDE0IEBACiAgKi8KIGludCBjZmc4MDIxMV9nZXRfc3RhdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1OCAqbWFjX2FkZHIsCiAJCQkgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGNmZzgwMjExX2dldF9zdGF0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIGNvbnN0IHU4ICptYWNfYWRkciwKKwkJCQkgICAgICAgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pCit7CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisjZW5kaWYKIAogLyoqCiAgKiBlbnVtIG1vbml0b3JfZmxhZ3MgLSBtb25pdG9yIGZsYWdzCkBAIC0xMzQyLDYgKzEzNzIsNyBAQAogICogQGJlYWNvbl9pbnRlcnZhbDogYmVhY29uIGludGVydmFsIHRvIHVzZQogICogQG1jYXN0X3JhdGU6IG11bHRpY2F0IHJhdGUgZm9yIE1lc2ggTm9kZSBbNk1icHMgaXMgdGhlIGRlZmF1bHQgZm9yIDgwMi4xMWFdCiAgKiBAYmFzaWNfcmF0ZXM6IGJhc2ljIHJhdGVzIHRvIHVzZSB3aGVuIGNyZWF0aW5nIHRoZSBtZXNoCisgKiBAYmVhY29uX3JhdGU6IGJpdHJhdGUgdG8gYmUgdXNlZCBmb3IgYmVhY29ucwogICoKICAqIFRoZXNlIHBhcmFtZXRlcnMgYXJlIGZpeGVkIHdoZW4gdGhlIG1lc2ggaXMgY3JlYXRlZC4KICAqLwpAQCAtMTM2Miw2ICsxMzkzLDcgQEAKIAl1MTYgYmVhY29uX2ludGVydmFsOwogCWludCBtY2FzdF9yYXRlW05VTV9OTDgwMjExX0JBTkRTXTsKIAl1MzIgYmFzaWNfcmF0ZXM7CisJc3RydWN0IGNmZzgwMjExX2JpdHJhdGVfbWFzayBiZWFjb25fcmF0ZTsKIH07CiAKIC8qKgpAQCAtMjAwMSwxNyArMjAzMyw2IEBACiAJV0lQSFlfUEFSQU1fRFlOX0FDSwkJPSAxIDw8IDUsCiB9OwogCi0vKgotICogY2ZnODAyMTFfYml0cmF0ZV9tYXNrIC0gbWFza3MgZm9yIGJpdHJhdGUgY29udHJvbAotICovCi1zdHJ1Y3QgY2ZnODAyMTFfYml0cmF0ZV9tYXNrIHsKLQlzdHJ1Y3QgewotCQl1MzIgbGVnYWN5OwotCQl1OCBodF9tY3NbSUVFRTgwMjExX0hUX01DU19NQVNLX0xFTl07Ci0JCXUxNiB2aHRfbWNzW05MODAyMTFfVkhUX05TU19NQVhdOwotCQllbnVtIG5sODAyMTFfdHhyYXRlX2dpIGdpOwotCX0gY29udHJvbFtOVU1fTkw4MDIxMV9CQU5EU107Ci19OwogLyoqCiAgKiBzdHJ1Y3QgY2ZnODAyMTFfcG1rc2EgLSBQTUsgU2VjdXJpdHkgQXNzb2NpYXRpb24KICAqCkBAIC0yMjkzLDYgKzIzMTQsOTggQEAKIH07CiAKIC8qKgorICogc3RydWN0IGNmZzgwMjExX25hbl9jb25mIC0gTkFOIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBUaGlzIHN0cnVjdCBkZWZpbmVzIE5BTiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqCisgKiBAbWFzdGVyX3ByZWY6IG1hc3RlciBwcmVmZXJlbmNlICgxIC0gMjU1KQorICogQGR1YWw6IGR1YWwgYmFuZCBvcGVyYXRpb24gbW9kZSwgc2VlICZlbnVtIG5sODAyMTFfbmFuX2R1YWxfYmFuZF9jb25mCisgKi8KK3N0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiB7CisJdTggbWFzdGVyX3ByZWY7CisJdTggZHVhbDsKK307CisKKy8qKgorICogZW51bSBjZmc4MDIxMV9uYW5fY29uZl9jaGFuZ2VzIC0gaW5kaWNhdGVzIGNoYW5nZWQgZmllbGRzIGluIE5BTgorICogY29uZmlndXJhdGlvbgorICoKKyAqIEBDRkc4MDIxMV9OQU5fQ09ORl9DSEFOR0VEX1BSRUY6IG1hc3RlciBwcmVmZXJlbmNlCisgKiBAQ0ZHODAyMTFfTkFOX0NPTkZfQ0hBTkdFRF9EVUFMOiBkdWFsIGJhbmQgb3BlcmF0aW9uCisgKi8KK2VudW0gY2ZnODAyMTFfbmFuX2NvbmZfY2hhbmdlcyB7CisJQ0ZHODAyMTFfTkFOX0NPTkZfQ0hBTkdFRF9QUkVGID0gQklUKDApLAorCUNGRzgwMjExX05BTl9DT05GX0NIQU5HRURfRFVBTCA9IEJJVCgxKSwKK307CisKKy8qKgorICogc3RydWN0IGNmZzgwMjExX25hbl9mdW5jX2ZpbHRlciAtIGEgTkFOIGZ1bmN0aW9uIFJ4IC8gVHggZmlsdGVyCisgKgorICogQGZpbHRlcjogdGhlIGNvbnRlbnQgb2YgdGhlIGZpbHRlcgorICogQGxlbjogdGhlIGxlbmd0aCBvZiB0aGUgZmlsdGVyCisgKi8KK3N0cnVjdCBjZmc4MDIxMV9uYW5fZnVuY19maWx0ZXIgeworCWNvbnN0IHU4ICpmaWx0ZXI7CisJdTggbGVuOworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgLSBhIE5BTiBmdW5jdGlvbgorICoKKyAqIEB0eXBlOiAmZW51bSBubDgwMjExX25hbl9mdW5jdGlvbl90eXBlCisgKiBAc2VydmljZV9pZDogdGhlIHNlcnZpY2UgSUQgb2YgdGhlIGZ1bmN0aW9uCisgKiBAcHVibGlzaF90eXBlOiAmbmw4MDIxMV9uYW5fcHVibGlzaF90eXBlCisgKiBAY2xvc2VfcmFuZ2U6IGlmIHRydWUsIHRoZSByYW5nZSBzaG91bGQgYmUgbGltaXRlZC4gVGhyZXNob2xkIGlzCisgKglpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy4KKyAqIEBwdWJsaXNoX2JjYXN0OiBpZiB0cnVlLCB0aGUgc29saWNpdGVkIHB1Ymxpc2ggc2hvdWxkIGJlIGJyb2FkY2FzdGVkCisgKiBAc3Vic2NyaWJlX2FjdGl2ZTogaWYgdHJ1ZSwgdGhlIHN1YnNjcmliZSBpcyBhY3RpdmUKKyAqIEBmb2xsb3d1cF9pZDogdGhlIGluc3RhbmNlIElEIGZvciBmb2xsb3cgdXAKKyAqIEBmb2xsb3d1cF9yZXFpZDogdGhlIHJlcXVlc3RvciBpbnN0YW5jZSBJRCBmb3IgZm9sbG93IHVwCisgKiBAZm9sbG93dXBfZGVzdDogTUFDIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudCBvZiB0aGUgZm9sbG93IHVwCisgKiBAdHRsOiB0aW1lIHRvIGxpdmUgY291bnRlciBpbiBEVy4KKyAqIEBzZXJ2X3NwZWNfaW5mbzogU2VydmljZSBTcGVjaWZpYyBJbmZvCisgKiBAc2Vydl9zcGVjX2luZm9fbGVuOiBTZXJ2aWNlIFNwZWNpZmljIEluZm8gbGVuZ3RoCisgKiBAc3JmX2luY2x1ZGU6IGlmIHRydWUsIFNSRiBpcyBpbmNsdXNpdmUKKyAqIEBzcmZfYmY6IEJsb29tIEZpbHRlcgorICogQHNyZl9iZl9sZW46IEJsb29tIEZpbHRlciBsZW5ndGgKKyAqIEBzcmZfYmZfaWR4OiBCbG9vbSBGaWx0ZXIgaW5kZXgKKyAqIEBzcmZfbWFjczogU1JGIE1BQyBhZGRyZXNzZXMKKyAqIEBzcmZfbnVtX21hY3M6IG51bWJlciBvZiBNQUMgYWRkcmVzc2VzIGluIFNSRgorICogQHJ4X2ZpbHRlcnM6IHJ4IGZpbHRlcnMgdGhhdCBhcmUgbWF0Y2hlZCB3aXRoIGNvcnJlc3BvbmRpbmcgcGVlcidzIHR4X2ZpbHRlcgorICogQHR4X2ZpbHRlcnM6IGZpbHRlcnMgdGhhdCBzaG91bGQgYmUgdHJhbnNtaXR0ZWQgaW4gdGhlIFNERi4KKyAqIEBudW1fcnhfZmlsdGVyczogbGVuZ3RoIG9mICZyeF9maWx0ZXJzLgorICogQG51bV90eF9maWx0ZXJzOiBsZW5ndGggb2YgJnR4X2ZpbHRlcnMuCisgKiBAaW5zdGFuY2VfaWQ6IGRyaXZlciBhbGxvY2F0ZWQgaWQgb2YgdGhlIGZ1bmN0aW9uLgorICogQGNvb2tpZTogdW5pcXVlIE5BTiBmdW5jdGlvbiBpZGVudGlmaWVyLgorICovCitzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgeworCWVudW0gbmw4MDIxMV9uYW5fZnVuY3Rpb25fdHlwZSB0eXBlOworCXU4IHNlcnZpY2VfaWRbTkw4MDIxMV9OQU5fRlVOQ19TRVJWSUNFX0lEX0xFTl07CisJdTggcHVibGlzaF90eXBlOworCWJvb2wgY2xvc2VfcmFuZ2U7CisJYm9vbCBwdWJsaXNoX2JjYXN0OworCWJvb2wgc3Vic2NyaWJlX2FjdGl2ZTsKKwl1OCBmb2xsb3d1cF9pZDsKKwl1OCBmb2xsb3d1cF9yZXFpZDsKKwlzdHJ1Y3QgbWFjX2FkZHJlc3MgZm9sbG93dXBfZGVzdDsKKwl1MzIgdHRsOworCWNvbnN0IHU4ICpzZXJ2X3NwZWNfaW5mbzsKKwl1OCBzZXJ2X3NwZWNfaW5mb19sZW47CisJYm9vbCBzcmZfaW5jbHVkZTsKKwljb25zdCB1OCAqc3JmX2JmOworCXU4IHNyZl9iZl9sZW47CisJdTggc3JmX2JmX2lkeDsKKwlzdHJ1Y3QgbWFjX2FkZHJlc3MgKnNyZl9tYWNzOworCWludCBzcmZfbnVtX21hY3M7CisJc3RydWN0IGNmZzgwMjExX25hbl9mdW5jX2ZpbHRlciAqcnhfZmlsdGVyczsKKwlzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmNfZmlsdGVyICp0eF9maWx0ZXJzOworCXU4IG51bV90eF9maWx0ZXJzOworCXU4IG51bV9yeF9maWx0ZXJzOworCXU4IGluc3RhbmNlX2lkOworCXU2NCBjb29raWU7Cit9OworCisvKioKICAqIHN0cnVjdCBjZmc4MDIxMV9vcHMgLSBiYWNrZW5kIGRlc2NyaXB0aW9uIGZvciB3aXJlbGVzcyBjb25maWd1cmF0aW9uCiAgKgogICogVGhpcyBzdHJ1Y3QgaXMgcmVnaXN0ZXJlZCBieSBmdWxsbWFjIGNhcmQgZHJpdmVycyBhbmQvb3Igd2lyZWxlc3Mgc3RhY2tzCkBAIC0yNDIzLDcgKzI1MzYsOCBAQAogICoJY2FzZXMsIHRoZSByZXN1bHQgb2Ygcm9hbWluZyBpcyBpbmRpY2F0ZWQgd2l0aCBhIGNhbGwgdG8KICAqCWNmZzgwMjExX3JvYW1lZCgpIG9yIGNmZzgwMjExX3JvYW1lZF9ic3MoKS4KICAqCShpbnZva2VkIHdpdGggdGhlIHdpcmVsZXNzX2RldiBtdXRleCBoZWxkKQotICogQGRpc2Nvbm5lY3Q6IERpc2Nvbm5lY3QgZnJvbSB0aGUgQlNTL0VTUy4KKyAqIEBkaXNjb25uZWN0OiBEaXNjb25uZWN0IGZyb20gdGhlIEJTUy9FU1MuIE9uY2UgZG9uZSwgY2FsbAorICoJY2ZnODAyMTFfZGlzY29ubmVjdGVkKCkuCiAgKgkoaW52b2tlZCB3aXRoIHRoZSB3aXJlbGVzc19kZXYgbXV0ZXggaGVsZCkKICAqCiAgKiBAam9pbl9pYnNzOiBKb2luIHRoZSBzcGVjaWZpZWQgSUJTUyAob3IgY3JlYXRlIGlmIG5lY2Vzc2FyeSkuIE9uY2UgZG9uZSwgY2FsbApAQCAtMjU3OSw2ICsyNjkzLDE5IEBACiAgKglhbmQgcmV0dXJuaW5nIHRvIHRoZSBiYXNlIGNoYW5uZWwgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUgQVAuCiAgKiBAdGRsc19jYW5jZWxfY2hhbm5lbF9zd2l0Y2g6IFN0b3AgY2hhbm5lbC1zd2l0Y2hpbmcgd2l0aCBhIFRETFMgcGVlci4gQm90aAogICoJcGVlcnMgbXVzdCBiZSBvbiB0aGUgYmFzZSBjaGFubmVsIHdoZW4gdGhlIGNhbGwgY29tcGxldGVzLgorICogQHN0YXJ0X25hbjogU3RhcnQgdGhlIE5BTiBpbnRlcmZhY2UuCisgKiBAc3RvcF9uYW46IFN0b3AgdGhlIE5BTiBpbnRlcmZhY2UuCisgKiBAYWRkX25hbl9mdW5jOiBBZGQgYSBOQU4gZnVuY3Rpb24uIFJldHVybnMgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqCU9uIHN1Y2Nlc3MgQG5hbl9mdW5jIG93bmVyc2hpcCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgZHJpdmVyIGFuZAorICoJaXQgbWF5IGFjY2VzcyBpdCBvdXRzaWRlIG9mIHRoZSBzY29wZSBvZiB0aGlzIGZ1bmN0aW9uLiBUaGUgZHJpdmVyCisgKglzaG91bGQgZnJlZSB0aGUgQG5hbl9mdW5jIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZCBieSBjYWxsaW5nCisgKgljZmc4MDIxMV9mcmVlX25hbl9mdW5jKCkuCisgKglPbiBzdWNjZXNzIHRoZSBkcml2ZXIgc2hvdWxkIGFzc2lnbiBhbiBpbnN0YW5jZV9pZCBpbiB0aGUKKyAqCXByb3ZpZGVkIEBuYW5fZnVuYy4KKyAqIEBkZWxfbmFuX2Z1bmM6IERlbGV0ZSBhIE5BTiBmdW5jdGlvbi4KKyAqIEBuYW5fY2hhbmdlX2NvbmY6IGNoYW5nZXMgTkFOIGNvbmZpZ3VyYXRpb24uIFRoZSBjaGFuZ2VkIHBhcmFtZXRlcnMgbXVzdAorICoJYmUgc3BlY2lmaWVkIGluIEBjaGFuZ2VzICh1c2luZyAmZW51bSBjZmc4MDIxMV9uYW5fY29uZl9jaGFuZ2VzKTsKKyAqCUFsbCBvdGhlciBwYXJhbWV0ZXJzIG11c3QgYmUgaWdub3JlZC4KICAqLwogc3RydWN0IGNmZzgwMjExX29wcyB7CiAJaW50CSgqc3VzcGVuZCkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293KTsKQEAgLTI4NDQsNiArMjk3MSwxNyBAQAogCXZvaWQJKCp0ZGxzX2NhbmNlbF9jaGFubmVsX3N3aXRjaCkoc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJICAgICAgY29uc3QgdTggKmFkZHIpOworCWludAkoKnN0YXJ0X25hbikoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCSAgICAgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mKTsKKwl2b2lkCSgqc3RvcF9uYW4pKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpOworCWludAkoKmFkZF9uYW5fZnVuYykoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQlzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgKm5hbl9mdW5jKTsKKwl2b2lkCSgqZGVsX25hbl9mdW5jKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJICAgICAgIHU2NCBjb29raWUpOworCWludAkoKm5hbl9jaGFuZ2VfY29uZikoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgIHN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiAqY29uZiwKKwkJCQkgICB1MzIgY2hhbmdlcyk7CiB9OwogCiAvKgpAQCAtMjg5MCw2ICszMDI4LDggQEAKICAqIEBXSVBIWV9GTEFHX1NVUFBPUlRTXzVfMTBfTUhaOiBEZXZpY2Ugc3VwcG9ydHMgNSBNSHogYW5kIDEwIE1IeiBjaGFubmVscy4KICAqIEBXSVBIWV9GTEFHX0hBU19DSEFOTkVMX1NXSVRDSDogRGV2aWNlIHN1cHBvcnRzIGNoYW5uZWwgc3dpdGNoIGluCiAgKgliZWFjb25pbmcgbW9kZSAoQVAsIElCU1MsIE1lc2gsIC4uLikuCisgKiBAV0lQSFlfRkxBR19IQVNfU1RBVElDX1dFUDogVGhlIGRldmljZSBzdXBwb3J0cyBzdGF0aWMgV0VQIGtleSBpbnN0YWxsYXRpb24KKyAqCWJlZm9yZSBjb25uZWN0aW9uLgogICovCiBlbnVtIHdpcGh5X2ZsYWdzIHsKIAkvKiB1c2UgaG9sZSBhdCAwICovCkBAIC0yOTE1LDYgKzMwNTUsNyBAQAogCVdJUEhZX0ZMQUdfSEFTX1JFTUFJTl9PTl9DSEFOTkVMCT0gQklUKDIxKSwKIAlXSVBIWV9GTEFHX1NVUFBPUlRTXzVfMTBfTUhaCQk9IEJJVCgyMiksCiAJV0lQSFlfRkxBR19IQVNfQ0hBTk5FTF9TV0lUQ0gJCT0gQklUKDIzKSwKKwlXSVBIWV9GTEFHX0hBU19TVEFUSUNfV0VQCQk9IEJJVCgyNCksCiB9OwogCiAvKioKQEAgLTMyOTIsNiArMzQzMyw4IEBACiAgKiBAYnNzX3NlbGVjdF9zdXBwb3J0OiBiaXRtYXNrIGluZGljYXRpbmcgdGhlIEJTUyBzZWxlY3Rpb24gY3JpdGVyaWEgc3VwcG9ydGVkCiAgKglieSB0aGUgZHJpdmVyIGluIHRoZSAuY29ubmVjdCgpIGNhbGxiYWNrLiBUaGUgYml0IHBvc2l0aW9uIG1hcHMgdG8gdGhlCiAgKglhdHRyaWJ1dGUgaW5kaWNlcyBkZWZpbmVkIGluICZlbnVtIG5sODAyMTFfYnNzX3NlbGVjdF9hdHRyLgorICoKKyAqIEBjb29raWVfY291bnRlcjogdW5pcXVlIGdlbmVyaWMgY29va2llIGNvdW50ZXIsIHVzZWQgdG8gaWRlbnRpZnkgb2JqZWN0cy4KICAqLwogc3RydWN0IHdpcGh5IHsKIAkvKiBhc3NpZ24gdGhlc2UgZmllbGRzIGJlZm9yZSB5b3UgcmVnaXN0ZXIgdGhlIHdpcGh5ICovCkBAIC0zNDIxLDYgKzM1NjQsOCBAQAogCiAJdTMyIGJzc19zZWxlY3Rfc3VwcG9ydDsKIAorCXU2NCBjb29raWVfY291bnRlcjsKKwogCWNoYXIgcHJpdlswXSBfX2FsaWduZWQoTkVUREVWX0FMSUdOKTsKIH07CiAKQEAgLTM2MDEsNiArMzc0Niw3IEBACiAgKgliZWFjb25zLCAwIHdoZW4gbm90IHZhbGlkCiAgKiBAYWRkcmVzczogVGhlIGFkZHJlc3MgZm9yIHRoaXMgZGV2aWNlLCB2YWxpZCBvbmx5IGlmIEBuZXRkZXYgaXMgJU5VTEwKICAqIEBwMnBfc3RhcnRlZDogdHJ1ZSBpZiB0aGlzIGlzIGEgUDJQIERldmljZSB0aGF0IGhhcyBiZWVuIHN0YXJ0ZWQKKyAqIEBuYW5fc3RhcnRlZDogdHJ1ZSBpZiB0aGlzIGlzIGEgTkFOIGludGVyZmFjZSB0aGF0IGhhcyBiZWVuIHN0YXJ0ZWQKICAqIEBjYWNfc3RhcnRlZDogdHJ1ZSBpZiBERlMgY2hhbm5lbCBhdmFpbGFiaWxpdHkgY2hlY2sgaGFzIGJlZW4gc3RhcnRlZAogICogQGNhY19zdGFydF90aW1lOiB0aW1lc3RhbXAgKGppZmZpZXMpIHdoZW4gdGhlIGRmcyBzdGF0ZSB3YXMgZW50ZXJlZC4KICAqIEBjYWNfdGltZV9tczogQ0FDIHRpbWUgaW4gbXMKQEAgLTM2MzIsNyArMzc3OCw3IEBACiAKIAlzdHJ1Y3QgbXV0ZXggbXR4OwogCi0JYm9vbCB1c2VfNGFkZHIsIHAycF9zdGFydGVkOworCWJvb2wgdXNlXzRhZGRyLCBwMnBfc3RhcnRlZCwgbmFuX3N0YXJ0ZWQ7CiAKIAl1OCBhZGRyZXNzW0VUSF9BTEVOXSBfX2FsaWduZWQoc2l6ZW9mKHUxNikpOwogCkBAIC0zOTQ2LDYgKzQwOTIsMzQgQEAKIAkJCQkgICAgc3RydWN0IGNmZzgwMjExX3Fvc19tYXAgKnFvc19tYXApOwogCiAvKioKKyAqIGNmZzgwMjExX2ZpbmRfaWVfbWF0Y2ggLSBtYXRjaCBpbmZvcm1hdGlvbiBlbGVtZW50IGFuZCBieXRlIGFycmF5IGluIGRhdGEKKyAqCisgKiBAZWlkOiBlbGVtZW50IElECisgKiBAaWVzOiBkYXRhIGNvbnNpc3Rpbmcgb2YgSUVzCisgKiBAbGVuOiBsZW5ndGggb2YgZGF0YQorICogQG1hdGNoOiBieXRlIGFycmF5IHRvIG1hdGNoCisgKiBAbWF0Y2hfbGVuOiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG1hdGNoIGFycmF5CisgKiBAbWF0Y2hfb2Zmc2V0OiBvZmZzZXQgaW4gdGhlIElFIHdoZXJlIHRoZSBieXRlIGFycmF5IHNob3VsZCBtYXRjaC4KKyAqCUlmIG1hdGNoX2xlbiBpcyB6ZXJvLCB0aGlzIG11c3QgYWxzbyBiZSBzZXQgdG8gemVyby4KKyAqCU90aGVyd2lzZSB0aGlzIG11c3QgYmUgc2V0IHRvIDIgb3IgbW9yZSwgYmVjYXVzZSB0aGUgZmlyc3QKKyAqCWJ5dGUgaXMgdGhlIGVsZW1lbnQgaWQsIHdoaWNoIGlzIGFscmVhZHkgY29tcGFyZWQgdG8gZWlkLCBhbmQKKyAqCXRoZSBzZWNvbmQgYnl0ZSBpcyB0aGUgSUUgbGVuZ3RoLgorICoKKyAqIFJldHVybjogJU5VTEwgaWYgdGhlIGVsZW1lbnQgSUQgY291bGQgbm90IGJlIGZvdW5kIG9yIGlmCisgKiB0aGUgZWxlbWVudCBpcyBpbnZhbGlkIChjbGFpbXMgdG8gYmUgbG9uZ2VyIHRoYW4gdGhlIGdpdmVuCisgKiBkYXRhKSBvciBpZiB0aGUgYnl0ZSBhcnJheSBkb2Vzbid0IG1hdGNoLCBvciBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0CisgKiBieXRlIG9mIHRoZSByZXF1ZXN0ZWQgZWxlbWVudCwgdGhhdCBpcyB0aGUgYnl0ZSBjb250YWluaW5nIHRoZQorICogZWxlbWVudCBJRC4KKyAqCisgKiBOb3RlOiBUaGVyZSBhcmUgbm8gY2hlY2tzIG9uIHRoZSBlbGVtZW50IGxlbmd0aCBvdGhlciB0aGFuCisgKiBoYXZpbmcgdG8gZml0IGludG8gdGhlIGdpdmVuIGRhdGEgYW5kIGJlaW5nIGxhcmdlIGVub3VnaCBmb3IgdGhlCisgKiBieXRlIGFycmF5IHRvIG1hdGNoLgorICovCitjb25zdCB1OCAqY2ZnODAyMTFfZmluZF9pZV9tYXRjaCh1OCBlaWQsIGNvbnN0IHU4ICppZXMsIGludCBsZW4sCisJCQkJIGNvbnN0IHU4ICptYXRjaCwgaW50IG1hdGNoX2xlbiwKKwkJCQkgaW50IG1hdGNoX29mZnNldCk7CisKKy8qKgogICogY2ZnODAyMTFfZmluZF9pZSAtIGZpbmQgaW5mb3JtYXRpb24gZWxlbWVudCBpbiBkYXRhCiAgKgogICogQGVpZDogZWxlbWVudCBJRApAQCAtMzk2MCw3ICs0MTM0LDEwIEBACiAgKiBOb3RlOiBUaGVyZSBhcmUgbm8gY2hlY2tzIG9uIHRoZSBlbGVtZW50IGxlbmd0aCBvdGhlciB0aGFuCiAgKiBoYXZpbmcgdG8gZml0IGludG8gdGhlIGdpdmVuIGRhdGEuCiAgKi8KLWNvbnN0IHU4ICpjZmc4MDIxMV9maW5kX2llKHU4IGVpZCwgY29uc3QgdTggKmllcywgaW50IGxlbik7CitzdGF0aWMgaW5saW5lIGNvbnN0IHU4ICpjZmc4MDIxMV9maW5kX2llKHU4IGVpZCwgY29uc3QgdTggKmllcywgaW50IGxlbikKK3sKKwlyZXR1cm4gY2ZnODAyMTFfZmluZF9pZV9tYXRjaChlaWQsIGllcywgbGVuLCBOVUxMLCAwLCAwKTsKK30KIAogLyoqCiAgKiBjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZSAtIGZpbmQgdmVuZG9yIHNwZWNpZmljIGluZm9ybWF0aW9uIGVsZW1lbnQgaW4gZGF0YQpAQCAtNTUwOSw2ICs1Njg2LDY3IEBACiAJcmV0dXJuIChmdF9ieXRlICYgQklUKGZ0aWR4ICUgOCkpICE9IDA7CiB9CiAKKy8qKgorICogY2ZnODAyMTFfZnJlZV9uYW5fZnVuYyAtIGZyZWUgTkFOIGZ1bmN0aW9uCisgKiBAZjogTkFOIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGZyZWVkCisgKgorICogRnJlZXMgYWxsIHRoZSBOQU4gZnVuY3Rpb24gYW5kIGFsbCBpdCdzIGFsbG9jYXRlZCBtZW1iZXJzLgorICovCit2b2lkIGNmZzgwMjExX2ZyZWVfbmFuX2Z1bmMoc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpmKTsKKworLyoqCisgKiBzdHJ1Y3QgY2ZnODAyMTFfbmFuX21hdGNoX3BhcmFtcyAtIE5BTiBtYXRjaCBwYXJhbWV0ZXJzCisgKiBAdHlwZTogdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgdHJpZ2dlcmVkIGEgbWF0Y2guIElmIGl0IGlzCisgKgkgJU5MODAyMTFfTkFOX0ZVTkNfU1VCU0NSSUJFIGl0IG1lYW5zIHRoYXQgd2UgcmVwbGllZCB0byBhIHN1YnNjcmliZXIuCisgKgkgSWYgaXQgaXMgJU5MODAyMTFfTkFOX0ZVTkNfUFVCTElTSCwgaXQgbWVhbnMgdGhhdCB3ZSBnb3QgYSBkaXNjb3ZlcnkKKyAqCSByZXN1bHQuCisgKgkgSWYgaXQgaXMgJU5MODAyMTFfTkFOX0ZVTkNfRk9MTE9XX1VQLCB3ZSByZWNlaXZlZCBhIGZvbGxvdyB1cC4KKyAqIEBpbnN0X2lkOiB0aGUgbG9jYWwgaW5zdGFuY2UgaWQKKyAqIEBwZWVyX2luc3RfaWQ6IHRoZSBpbnN0YW5jZSBpZCBvZiB0aGUgcGVlcidzIGZ1bmN0aW9uCisgKiBAYWRkcjogdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBwZWVyCisgKiBAaW5mb19sZW46IHRoZSBsZW5ndGggb2YgdGhlICZpbmZvCisgKiBAaW5mbzogdGhlIFNlcnZpY2UgU3BlY2lmaWMgSW5mbyBmcm9tIHRoZSBwZWVyIChpZiBhbnkpCisgKiBAY29va2llOiB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgorICovCitzdHJ1Y3QgY2ZnODAyMTFfbmFuX21hdGNoX3BhcmFtcyB7CisJZW51bSBubDgwMjExX25hbl9mdW5jdGlvbl90eXBlIHR5cGU7CisJdTggaW5zdF9pZDsKKwl1OCBwZWVyX2luc3RfaWQ7CisJY29uc3QgdTggKmFkZHI7CisJdTggaW5mb19sZW47CisJY29uc3QgdTggKmluZm87CisJdTY0IGNvb2tpZTsKK307CisKKy8qKgorICogY2ZnODAyMTFfbmFuX21hdGNoIC0gcmVwb3J0IGEgbWF0Y2ggZm9yIGEgTkFOIGZ1bmN0aW9uLgorICogQHdkZXY6IHRoZSB3aXJlbGVzcyBkZXZpY2UgcmVwb3J0aW5nIHRoZSBtYXRjaAorICogQG1hdGNoOiBtYXRjaCBub3RpZmljYXRpb24gcGFyYW1ldGVycworICogQGdmcDogYWxsb2NhdGlvbiBmbGFncworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVwb3J0cyB0aGF0IHRoZSBhIE5BTiBmdW5jdGlvbiBoYWQgYSBtYXRjaC4gVGhpcworICogY2FuIGJlIGEgc3Vic2NyaWJlIHRoYXQgaGFkIGEgbWF0Y2ggb3IgYSBzb2xpY2l0ZWQgcHVibGlzaCB0aGF0CisgKiB3YXMgc2VudC4gSXQgY2FuIGFsc28gYmUgYSBmb2xsb3cgdXAgdGhhdCB3YXMgcmVjZWl2ZWQuCisgKi8KK3ZvaWQgY2ZnODAyMTFfbmFuX21hdGNoKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQlzdHJ1Y3QgY2ZnODAyMTFfbmFuX21hdGNoX3BhcmFtcyAqbWF0Y2gsIGdmcF90IGdmcCk7CisKKy8qKgorICogY2ZnODAyMTFfbmFuX2Z1bmNfdGVybWluYXRlZCAtIG5vdGlmeSBhYm91dCBOQU4gZnVuY3Rpb24gdGVybWluYXRpb24uCisgKgorICogQHdkZXY6IHRoZSB3aXJlbGVzcyBkZXZpY2UgcmVwb3J0aW5nIHRoZSBtYXRjaAorICogQGluc3RfaWQ6IHRoZSBsb2NhbCBpbnN0YW5jZSBpZAorICogQHJlYXNvbjogdGVybWluYXRpb24gcmVhc29uIChvbmUgb2YgdGhlIE5MODAyMTFfTkFOX0ZVTkNfVEVSTV9SRUFTT05fKikKKyAqIEBjb29raWU6IHVuaXF1ZSBOQU4gZnVuY3Rpb24gaWRlbnRpZmllcgorICogQGdmcDogYWxsb2NhdGlvbiBmbGFncworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVwb3J0cyB0aGF0IHRoZSBhIE5BTiBmdW5jdGlvbiBpcyB0ZXJtaW5hdGVkLgorICovCit2b2lkIGNmZzgwMjExX25hbl9mdW5jX3Rlcm1pbmF0ZWQoc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgIHU4IGluc3RfaWQsCisJCQkJICBlbnVtIG5sODAyMTFfbmFuX2Z1bmNfdGVybV9yZWFzb24gcmVhc29uLAorCQkJCSAgdTY0IGNvb2tpZSwgZ2ZwX3QgZ2ZwKTsKKwogLyogZXRodG9vbCBoZWxwZXIgKi8KIHZvaWQgY2ZnODAyMTFfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2RldmxpbmsuaCBiL2luY2x1ZGUvbmV0L2RldmxpbmsuaAppbmRleCBjOTlmZmU4Li4yMTFiZDNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9kZXZsaW5rLmgKKysrIGIvaW5jbHVkZS9uZXQvZGV2bGluay5oCkBAIC01MCw3ICs1MCw2IEBACiB9OwogCiBzdHJ1Y3QgZGV2bGlua19vcHMgewotCXNpemVfdCBwcml2X3NpemU7CiAJaW50ICgqcG9ydF90eXBlX3NldCkoc3RydWN0IGRldmxpbmtfcG9ydCAqZGV2bGlua19wb3J0LAogCQkJICAgICBlbnVtIGRldmxpbmtfcG9ydF90eXBlIHBvcnRfdHlwZSk7CiAJaW50ICgqcG9ydF9zcGxpdCkoc3RydWN0IGRldmxpbmsgKmRldmxpbmssIHVuc2lnbmVkIGludCBwb3J0X2luZGV4LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZHNhLmggYi9pbmNsdWRlL25ldC9kc2EuaAppbmRleCAyMjE3YTNmLi5iMTIyMTk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9kc2EuaAorKysgYi9pbmNsdWRlL25ldC9kc2EuaApAQCAtMjYsNiArMjYsNyBAQAogCURTQV9UQUdfUFJPVE9fVFJBSUxFUiwKIAlEU0FfVEFHX1BST1RPX0VEU0EsCiAJRFNBX1RBR19QUk9UT19CUkNNLAorCURTQV9UQUdfUFJPVE9fUUNBLAogCURTQV9UQUdfTEFTVCwJCS8qIE1VU1QgQkUgTEFTVCAqLwogfTsKIApAQCAtMTQyLDYgKzE0Myw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UJKm5ldGRldjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUJKmRuOwogCXVuc2lnbmVkIGludAkJYWdlaW5nX3RpbWU7CisJdTgJCQlzdHBfc3RhdGU7CiB9OwogCiBzdHJ1Y3QgZHNhX3N3aXRjaCB7CkBAIC0xNjUsOSArMTY3LDkgQEAKIAlzdHJ1Y3QgZHNhX2NoaXBfZGF0YQkqY2Q7CiAKIAkvKgotCSAqIFRoZSB1c2VkIHN3aXRjaCBkcml2ZXIuCisJICogVGhlIHN3aXRjaCBvcGVyYXRpb25zLgogCSAqLwotCXN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlcgkqZHJ2OworCXN0cnVjdCBkc2Ffc3dpdGNoX29wcwkqb3BzOwogCiAJLyoKIAkgKiBBbiBhcnJheSBvZiB3aGljaCBlbGVtZW50IFthXSBpbmRpY2F0ZXMgd2hpY2ggcG9ydCBvbiB0aGlzCkBAIC0yMzQsMTkgKzIzNiwyMSBAQAogc3RydWN0IHN3aXRjaGRldl90cmFuczsKIHN0cnVjdCBzd2l0Y2hkZXZfb2JqOwogc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGI7CitzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X21kYjsKIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfdmxhbjsKIAotc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyIHsKK3N0cnVjdCBkc2Ffc3dpdGNoX29wcyB7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogCi0JZW51bSBkc2FfdGFnX3Byb3RvY29sCXRhZ19wcm90b2NvbDsKLQogCS8qCiAJICogUHJvYmluZyBhbmQgc2V0dXAuCiAJICovCiAJY29uc3QgY2hhcgkqKCpwcm9iZSkoc3RydWN0IGRldmljZSAqZHNhX2RldiwKIAkJCQkgIHN0cnVjdCBkZXZpY2UgKmhvc3RfZGV2LCBpbnQgc3dfYWRkciwKIAkJCQkgIHZvaWQgKipwcml2KTsKKworCWVudW0gZHNhX3RhZ19wcm90b2NvbCAoKmdldF90YWdfcHJvdG9jb2wpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyk7CisKIAlpbnQJKCpzZXR1cCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKTsKIAlpbnQJKCpzZXRfYWRkcikoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCB1OCAqYWRkcik7CiAJdTMyCSgqZ2V0X3BoeV9mbGFncykoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCk7CkBAIC0zMzYsNiArMzQwLDcgQEAKIAl2b2lkCSgqcG9ydF9icmlkZ2VfbGVhdmUpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQpOwogCXZvaWQJKCpwb3J0X3N0cF9zdGF0ZV9zZXQpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJICAgICAgdTggc3RhdGUpOworCXZvaWQJKCpwb3J0X2Zhc3RfYWdlKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KTsKIAogCS8qCiAJICogVkxBTiBzdXBwb3J0CkBAIC0zNjgsMTcgKzM3MywyNyBAQAogCWludAkoKnBvcnRfZmRiX2R1bXApKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCiAJCQkJIGludCAoKmNiKShzdHJ1Y3Qgc3dpdGNoZGV2X29iaiAqb2JqKSk7CisKKwkvKgorCSAqIE11bHRpY2FzdCBkYXRhYmFzZQorCSAqLworCWludAkoKnBvcnRfbWRiX3ByZXBhcmUpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfbWRiICptZGIsCisJCQkJICAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKTsKKwl2b2lkCSgqcG9ydF9tZGJfYWRkKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkJCWNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfbWRiICptZGIsCisJCQkJc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpOworCWludAkoKnBvcnRfbWRiX2RlbCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCQljb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X21kYiAqbWRiKTsKKwlpbnQJKCpwb3J0X21kYl9kdW1wKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkJCSBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X21kYiAqbWRiLAorCQkJCSBpbnQgKCpjYikoc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaikpOwogfTsKIAotdm9pZCByZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKHN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciAqdHlwZSk7Ci12b2lkIHVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcihzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKnR5cGUpOwordm9pZCByZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKHN0cnVjdCBkc2Ffc3dpdGNoX29wcyAqdHlwZSk7Cit2b2lkIHVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcihzdHJ1Y3QgZHNhX3N3aXRjaF9vcHMgKnR5cGUpOwogc3RydWN0IG1paV9idXMgKmRzYV9ob3N0X2Rldl90b19taWlfYnVzKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqZHNfdG9fcHJpdihzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCi17Ci0JcmV0dXJuIGRzLT5wcml2OwotfQotCiBzdGF0aWMgaW5saW5lIGJvb2wgZHNhX3VzZXNfdGFnZ2VkX3Byb3RvY29sKHN0cnVjdCBkc2Ffc3dpdGNoX3RyZWUgKmRzdCkKIHsKIAlyZXR1cm4gZHN0LT5yY3YgIT0gTlVMTDsKQEAgLTM4Niw0ICs0MDEsMTggQEAKIAogdm9pZCBkc2FfdW5yZWdpc3Rlcl9zd2l0Y2goc3RydWN0IGRzYV9zd2l0Y2ggKmRzKTsKIGludCBkc2FfcmVnaXN0ZXJfc3dpdGNoKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgc3RydWN0IGRldmljZV9ub2RlICpucCk7CisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitpbnQgZHNhX3N3aXRjaF9zdXNwZW5kKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyk7CitpbnQgZHNhX3N3aXRjaF9yZXN1bWUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBkc2Ffc3dpdGNoX3N1c3BlbmQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgZHNhX3N3aXRjaF9yZXN1bWUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoreworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2RzdF9tZXRhZGF0YS5oIGIvaW5jbHVkZS9uZXQvZHN0X21ldGFkYXRhLmgKaW5kZXggNWRiOWY1OS4uNjk2NWM4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZHN0X21ldGFkYXRhLmgKKysrIGIvaW5jbHVkZS9uZXQvZHN0X21ldGFkYXRhLmgKQEAgLTExMiwxMiArMTEyLDEzIEBACiAJcmV0dXJuICZkc3QtPnUudHVuX2luZm87CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IG1ldGFkYXRhX2RzdCAqaXBfdHVuX3J4X2RzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkJIF9fYmUxNiBmbGFncywKLQkJCQkJCSBfX2JlNjQgdHVubmVsX2lkLAotCQkJCQkJIGludCBtZF9zaXplKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWV0YWRhdGFfZHN0ICpfX2lwX3R1bl9zZXRfZHN0KF9fYmUzMiBzYWRkciwKKwkJCQkJCSAgICBfX2JlMzIgZGFkZHIsCisJCQkJCQkgICAgX191OCB0b3MsIF9fdTggdHRsLAorCQkJCQkJICAgIF9fYmUxNiBmbGFncywKKwkJCQkJCSAgICBfX2JlNjQgdHVubmVsX2lkLAorCQkJCQkJICAgIGludCBtZF9zaXplKQogewotCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAJc3RydWN0IG1ldGFkYXRhX2RzdCAqdHVuX2RzdDsKIAogCXR1bl9kc3QgPSB0dW5fcnhfZHN0KG1kX3NpemUpOwpAQCAtMTI1LDE3ICsxMjYsMzAgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlpcF90dW5uZWxfa2V5X2luaXQoJnR1bl9kc3QtPnUudHVuX2luZm8ua2V5LAotCQkJICAgaXBoLT5zYWRkciwgaXBoLT5kYWRkciwgaXBoLT50b3MsIGlwaC0+dHRsLAorCQkJICAgc2FkZHIsIGRhZGRyLCB0b3MsIHR0bCwKIAkJCSAgIDAsIDAsIDAsIHR1bm5lbF9pZCwgZmxhZ3MpOwogCXJldHVybiB0dW5fZHN0OwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBtZXRhZGF0YV9kc3QgKmlwdjZfdHVuX3J4X2RzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWV0YWRhdGFfZHN0ICppcF90dW5fcnhfZHN0KHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCQkgX19iZTE2IGZsYWdzLAogCQkJCQkJIF9fYmU2NCB0dW5uZWxfaWQsCiAJCQkJCQkgaW50IG1kX3NpemUpCiB7Ci0JY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwNmggPSBpcHY2X2hkcihza2IpOworCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisKKwlyZXR1cm4gX19pcF90dW5fc2V0X2RzdChpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLCBpcGgtPnRvcywgaXBoLT50dGwsCisJCQkJZmxhZ3MsIHR1bm5lbF9pZCwgbWRfc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1ldGFkYXRhX2RzdCAqX19pcHY2X3R1bl9zZXRfZHN0KGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCisJCQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQkJCQkJICAgICAgX191OCB0b3MsIF9fdTggdHRsLAorCQkJCQkJICAgICAgX19iZTMyIGxhYmVsLAorCQkJCQkJICAgICAgX19iZTE2IGZsYWdzLAorCQkJCQkJICAgICAgX19iZTY0IHR1bm5lbF9pZCwKKwkJCQkJCSAgICAgIGludCBtZF9zaXplKQorewogCXN0cnVjdCBtZXRhZGF0YV9kc3QgKnR1bl9kc3Q7CiAJc3RydWN0IGlwX3R1bm5lbF9pbmZvICppbmZvOwogCkBAIC0xNTAsMTQgKzE2NCwyNiBAQAogCWluZm8tPmtleS50cF9zcmMgPSAwOwogCWluZm8tPmtleS50cF9kc3QgPSAwOwogCi0JaW5mby0+a2V5LnUuaXB2Ni5zcmMgPSBpcDZoLT5zYWRkcjsKLQlpbmZvLT5rZXkudS5pcHY2LmRzdCA9IGlwNmgtPmRhZGRyOworCWluZm8tPmtleS51LmlwdjYuc3JjID0gKnNhZGRyOworCWluZm8tPmtleS51LmlwdjYuZHN0ID0gKmRhZGRyOwogCi0JaW5mby0+a2V5LnRvcyA9IGlwdjZfZ2V0X2RzZmllbGQoaXA2aCk7Ci0JaW5mby0+a2V5LnR0bCA9IGlwNmgtPmhvcF9saW1pdDsKLQlpbmZvLT5rZXkubGFiZWwgPSBpcDZfZmxvd2xhYmVsKGlwNmgpOworCWluZm8tPmtleS50b3MgPSB0b3M7CisJaW5mby0+a2V5LnR0bCA9IHR0bDsKKwlpbmZvLT5rZXkubGFiZWwgPSBsYWJlbDsKIAogCXJldHVybiB0dW5fZHN0OwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtZXRhZGF0YV9kc3QgKmlwdjZfdHVuX3J4X2RzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkJICAgX19iZTE2IGZsYWdzLAorCQkJCQkJICAgX19iZTY0IHR1bm5lbF9pZCwKKwkJCQkJCSAgIGludCBtZF9zaXplKQoreworCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcDZoID0gaXB2Nl9oZHIoc2tiKTsKKworCXJldHVybiBfX2lwdjZfdHVuX3NldF9kc3QoJmlwNmgtPnNhZGRyLCAmaXA2aC0+ZGFkZHIsCisJCQkJICBpcHY2X2dldF9kc2ZpZWxkKGlwNmgpLCBpcDZoLT5ob3BfbGltaXQsCisJCQkJICBpcDZfZmxvd2xhYmVsKGlwNmgpLCBmbGFncywgdHVubmVsX2lkLAorCQkJCSAgbWRfc2l6ZSk7Cit9CiAjZW5kaWYgLyogX19ORVRfRFNUX01FVEFEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2Zsb3cuaCBiL2luY2x1ZGUvbmV0L2Zsb3cuaAppbmRleCBkNDdlZjRiLi4wMzVhYTc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9mbG93LmgKKysrIGIvaW5jbHVkZS9uZXQvZmxvdy5oCkBAIC0zNCw4ICszNCw3IEBACiAJX191OAlmbG93aWNfZmxhZ3M7CiAjZGVmaW5lIEZMT1dJX0ZMQUdfQU5ZU1JDCQkweDAxCiAjZGVmaW5lIEZMT1dJX0ZMQUdfS05PV05fTkgJCTB4MDIKLSNkZWZpbmUgRkxPV0lfRkxBR19MM01ERVZfU1JDCQkweDA0Ci0jZGVmaW5lIEZMT1dJX0ZMQUdfU0tJUF9OSF9PSUYJCTB4MDgKKyNkZWZpbmUgRkxPV0lfRkxBR19TS0lQX05IX09JRgkJMHgwNAogCV9fdTMyCWZsb3dpY19zZWNpZDsKIAlzdHJ1Y3QgZmxvd2lfdHVubmVsIGZsb3dpY190dW5fa2V5OwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2Zsb3dfZGlzc2VjdG9yLmggYi9pbmNsdWRlL25ldC9mbG93X2Rpc3NlY3Rvci5oCmluZGV4IGQzZDYwZGMuLmQ5NTM0OTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2Zsb3dfZGlzc2VjdG9yLmgKKysrIGIvaW5jbHVkZS9uZXQvZmxvd19kaXNzZWN0b3IuaApAQCAtMzIsOCArMzIsMTMgQEAKIH07CiAKIHN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfdGFncyB7Ci0JdTMyCXZsYW5faWQ6MTIsCi0JCWZsb3dfbGFiZWw6MjA7CisJdTMyCWZsb3dfbGFiZWw7Cit9OworCitzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3ZsYW4geworCXUxNgl2bGFuX2lkOjEyLAorCQl2bGFuX3ByaW9yaXR5OjM7CisJdTE2CXBhZGRpbmc7CiB9OwogCiBzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2tleWlkIHsKQEAgLTExOSw3ICsxMjQsNyBAQAogCUZMT1dfRElTU0VDVE9SX0tFWV9QT1JUUywgLyogc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9wb3J0cyAqLwogCUZMT1dfRElTU0VDVE9SX0tFWV9FVEhfQUREUlMsIC8qIHN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfZXRoX2FkZHJzICovCiAJRkxPV19ESVNTRUNUT1JfS0VZX1RJUENfQUREUlMsIC8qIHN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfdGlwY19hZGRycyAqLwotCUZMT1dfRElTU0VDVE9SX0tFWV9WTEFOSUQsIC8qIHN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfZmxvd190YWdzICovCisJRkxPV19ESVNTRUNUT1JfS0VZX1ZMQU4sIC8qIHN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfZmxvd192bGFuICovCiAJRkxPV19ESVNTRUNUT1JfS0VZX0ZMT1dfTEFCRUwsIC8qIHN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfZmxvd190YWdzICovCiAJRkxPV19ESVNTRUNUT1JfS0VZX0dSRV9LRVlJRCwgLyogc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9rZXlpZCAqLwogCUZMT1dfRElTU0VDVE9SX0tFWV9NUExTX0VOVFJPUFksIC8qIHN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfa2V5aWQgKi8KQEAgLTE0OCw2ICsxNTMsNyBAQAogI2RlZmluZSBGTE9XX0tFWVNfSEFTSF9TVEFSVF9GSUVMRCBiYXNpYwogCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfYmFzaWMgYmFzaWM7CiAJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV90YWdzIHRhZ3M7CisJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV92bGFuIHZsYW47CiAJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9rZXlpZCBrZXlpZDsKIAlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3BvcnRzIHBvcnRzOwogCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfYWRkcnMgYWRkcnM7CkBAIC0xNzcsNyArMTgzLDcgQEAKIHZvaWQgbWFrZV9mbG93X2tleXNfZGlnZXN0KHN0cnVjdCBmbG93X2tleXNfZGlnZXN0ICpkaWdlc3QsCiAJCQkgICBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KTsKIAotc3RhdGljIGlubGluZSBib29sIGZsb3dfa2V5c19oYXZlX2w0KHN0cnVjdCBmbG93X2tleXMgKmtleXMpCitzdGF0aWMgaW5saW5lIGJvb2wgZmxvd19rZXlzX2hhdmVfbDQoY29uc3Qgc3RydWN0IGZsb3dfa2V5cyAqa2V5cykKIHsKIAlyZXR1cm4gKGtleXMtPnBvcnRzLnBvcnRzIHx8IGtleXMtPnRhZ3MuZmxvd19sYWJlbCk7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9mcS5oIGIvaW5jbHVkZS9uZXQvZnEuaAppbmRleCAyNjhiNDkwLi42ZDg1MjFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9mcS5oCisrKyBiL2luY2x1ZGUvbmV0L2ZxLmgKQEAgLTcyLDkgKzcyLDEyIEBACiAJdTMyIGZsb3dzX2NudDsKIAl1MzIgcGVydHVyYmF0aW9uOwogCXUzMiBsaW1pdDsKKwl1MzIgbWVtb3J5X2xpbWl0OworCXUzMiBtZW1vcnlfdXNhZ2U7CiAJdTMyIHF1YW50dW07CiAJdTMyIGJhY2tsb2c7CiAJdTMyIG92ZXJsaW1pdDsKKwl1MzIgb3Zlcm1lbW9yeTsKIAl1MzIgY29sbGlzaW9uczsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2ZxX2ltcGwuaCBiL2luY2x1ZGUvbmV0L2ZxX2ltcGwuaAppbmRleCAxNjNmM2VkLi40ZTYxMzFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9mcV9pbXBsLmgKKysrIGIvaW5jbHVkZS9uZXQvZnFfaW1wbC5oCkBAIC0yOSw2ICsyOSw3IEBACiAJdGluLT5iYWNrbG9nX3BhY2tldHMtLTsKIAlmbG93LT5iYWNrbG9nIC09IHNrYi0+bGVuOwogCWZxLT5iYWNrbG9nLS07CisJZnEtPm1lbW9yeV91c2FnZSAtPSBza2ItPnRydWVzaXplOwogCiAJaWYgKGZsb3ctPmJhY2tsb2cgPT0gMCkgewogCQlsaXN0X2RlbF9pbml0KCZmbG93LT5iYWNrbG9nY2hhaW4pOwpAQCAtMTU0LDYgKzE1NSw3IEBACiAJZmxvdy0+YmFja2xvZyArPSBza2ItPmxlbjsKIAl0aW4tPmJhY2tsb2dfYnl0ZXMgKz0gc2tiLT5sZW47CiAJdGluLT5iYWNrbG9nX3BhY2tldHMrKzsKKwlmcS0+bWVtb3J5X3VzYWdlICs9IHNrYi0+dHJ1ZXNpemU7CiAJZnEtPmJhY2tsb2crKzsKIAogCWZxX3JlY2FsY19iYWNrbG9nKGZxLCB0aW4sIGZsb3cpOwpAQCAtMTY2LDcgKzE2OCw3IEBACiAKIAlfX3NrYl9xdWV1ZV90YWlsKCZmbG93LT5xdWV1ZSwgc2tiKTsKIAotCWlmIChmcS0+YmFja2xvZyA+IGZxLT5saW1pdCkgeworCWlmIChmcS0+YmFja2xvZyA+IGZxLT5saW1pdCB8fCBmcS0+bWVtb3J5X3VzYWdlID4gZnEtPm1lbW9yeV9saW1pdCkgewogCQlmbG93ID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZmcS0+YmFja2xvZ3MsCiAJCQkJCQlzdHJ1Y3QgZnFfZmxvdywKIAkJCQkJCWJhY2tsb2djaGFpbik7CkBAIC0xODEsNiArMTgzLDggQEAKIAogCQlmbG93LT50aW4tPm92ZXJsaW1pdCsrOwogCQlmcS0+b3ZlcmxpbWl0Kys7CisJCWlmIChmcS0+bWVtb3J5X3VzYWdlID4gZnEtPm1lbW9yeV9saW1pdCkKKwkJCWZxLT5vdmVybWVtb3J5Kys7CiAJfQogfQogCkBAIC0yNTEsNiArMjU1LDcgQEAKIAlmcS0+cGVydHVyYmF0aW9uID0gcHJhbmRvbV91MzIoKTsKIAlmcS0+cXVhbnR1bSA9IDMwMDsKIAlmcS0+bGltaXQgPSA4MTkyOworCWZxLT5tZW1vcnlfbGltaXQgPSAxNiA8PCAyMDsgLyogMTYgTUJ5dGVzICovCiAKIAlmcS0+Zmxvd3MgPSBrY2FsbG9jKGZxLT5mbG93c19jbnQsIHNpemVvZihmcS0+Zmxvd3NbMF0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZxLT5mbG93cykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2dyZS5oIGIvaW5jbHVkZS9uZXQvZ3JlLmgKaW5kZXggN2E1NGEzMS4uZDI1ZDgzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZ3JlLmgKKysrIGIvaW5jbHVkZS9uZXQvZ3JlLmgKQEAgLTcsNyArNywxNSBAQAogc3RydWN0IGdyZV9iYXNlX2hkciB7CiAJX19iZTE2IGZsYWdzOwogCV9fYmUxNiBwcm90b2NvbDsKLX07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ3JlX2Z1bGxfaGRyIHsKKwlzdHJ1Y3QgZ3JlX2Jhc2VfaGRyIGZpeGVkX2hlYWRlcjsKKwlfX2JlMTYgY3N1bTsKKwlfX2JlMTYgcmVzZXJ2ZWQxOworCV9fYmUzMiBrZXk7CisJX19iZTMyIHNlcTsKK30gX19wYWNrZWQ7CiAjZGVmaW5lIEdSRV9IRUFERVJfU0VDVElPTiA0CiAKICNkZWZpbmUgR1JFUFJPVE9fQ0lTQ08JCTAKQEAgLTEwNCw2ICsxMTIsNyBAQAogCiAJc2tiX3B1c2goc2tiLCBoZHJfbGVuKTsKIAorCXNrYl9zZXRfaW5uZXJfcHJvdG9jb2woc2tiLCBwcm90byk7CiAJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAlncmVoID0gKHN0cnVjdCBncmVfYmFzZV9oZHIgKilza2ItPmRhdGE7CiAJZ3JlaC0+ZmxhZ3MgPSBncmVfdG5sX2ZsYWdzX3RvX2dyZV9mbGFncyhmbGFncyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pZWVlODAyMTFfcmFkaW90YXAuaCBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oCmluZGV4IGIwZmQ5NDcuLmJhMDdiOWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oCisrKyBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oCkBAIC0xOTAsNiArMTkwLDEwIEBACiAgKiBJRUVFODAyMTFfUkFESU9UQVBfVkhUCXUxNiwgdTgsIHU4LCB1OFs0XSwgdTgsIHU4LCB1MTYKICAqCiAgKglDb250YWlucyBWSFQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBmcmFtZS4KKyAqCisgKiBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QCQl1NjQsIHUxNiwgdTgsIHU4CXZhcmlhYmxlCisgKgorICoJQ29udGFpbnMgdGltZXN0YW1wIGluZm9ybWF0aW9uIGZvciB0aGlzIGZyYW1lLgogICovCiBlbnVtIGllZWU4MDIxMV9yYWRpb3RhcF90eXBlIHsKIAlJRUVFODAyMTFfUkFESU9UQVBfVFNGVCA9IDAsCkBAIC0yMTQsNiArMjE4LDcgQEAKIAlJRUVFODAyMTFfUkFESU9UQVBfTUNTID0gMTksCiAJSUVFRTgwMjExX1JBRElPVEFQX0FNUERVX1NUQVRVUyA9IDIwLAogCUlFRUU4MDIxMV9SQURJT1RBUF9WSFQgPSAyMSwKKwlJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QID0gMjIsCiAKIAkvKiB2YWxpZCBpbiBldmVyeSBpdF9wcmVzZW50IGJpdG1hcCwgZXZlbiB2ZW5kb3IgbmFtZXNwYWNlcyAqLwogCUlFRUU4MDIxMV9SQURJT1RBUF9SQURJT1RBUF9OQU1FU1BBQ0UgPSAyOSwKQEAgLTMyMSw2ICszMjYsMjIgQEAKICNkZWZpbmUgSUVFRTgwMjExX1JBRElPVEFQX0NPRElOR19MRFBDX1VTRVIyCQkJMHgwNAogI2RlZmluZSBJRUVFODAyMTFfUkFESU9UQVBfQ09ESU5HX0xEUENfVVNFUjMJCQkweDA4CiAKKy8qIEZvciBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QICovCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfVU5JVF9NQVNLCQkJMHgwMDBGCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfVU5JVF9NUwkJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QX1VOSVRfVVMJCQkweDAwMDEKKyNkZWZpbmUgSUVFRTgwMjExX1JBRElPVEFQX1RJTUVTVEFNUF9VTklUX05TCQkJMHgwMDAzCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfU1BPU19NQVNLCQkJMHgwMEYwCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfU1BPU19CRUdJTl9NRFBVCQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMjExX1JBRElPVEFQX1RJTUVTVEFNUF9TUE9TX0VPX01QRFUJCTB4MDAxMAorI2RlZmluZSBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QX1NQT1NfRU9fUFBEVQkJMHgwMDIwCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfU1BPU19QTENQX1NJR19BQ1EJCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QX1NQT1NfVU5LTk9XTgkJMHgwMEYwCisKKyNkZWZpbmUgSUVFRTgwMjExX1JBRElPVEFQX1RJTUVTVEFNUF9GTEFHXzY0QklUCQkJMHgwMAorI2RlZmluZSBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QX0ZMQUdfMzJCSVQJCQkweDAxCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfRkxBR19BQ0NVUkFDWQkJMHgwMgorCiAvKiBoZWxwZXJzICovCiBzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfZ2V0X3JhZGlvdGFwX2xlbih1bnNpZ25lZCBjaGFyICpkYXRhKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaWZfaW5ldDYuaCBiL2luY2x1ZGUvbmV0L2lmX2luZXQ2LmgKaW5kZXggMWM4YjY4Mi4uNTE1MzUyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaWZfaW5ldDYuaAorKysgYi9pbmNsdWRlL25ldC9pZl9pbmV0Ni5oCkBAIC0yMDEsNiArMjAxLDcgQEAKIAlzdHJ1Y3QgaXB2Nl9kZXZzdGF0CXN0YXRzOwogCiAJc3RydWN0IHRpbWVyX2xpc3QJcnNfdGltZXI7CisJX19zMzIJCQlyc19pbnRlcnZhbDsJLyogaW4gamlmZmllcyAqLwogCV9fdTgJCQlyc19wcm9iZXM7CiAKIAlfX3U4CQkJYWRkcl9nZW5fbW9kZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmggYi9pbmNsdWRlL25ldC9pbmV0X2Nvbm5lY3Rpb25fc29jay5oCmluZGV4IDQ5ZGNhZDQuLjE5N2EzMGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldF9jb25uZWN0aW9uX3NvY2suaApAQCAtMTM0LDggKzEzNCw4IEBACiAJfSBpY3NrX210dXA7CiAJdTMyCQkJICBpY3NrX3VzZXJfdGltZW91dDsKIAotCXU2NAkJCSAgaWNza19jYV9wcml2WzY0IC8gc2l6ZW9mKHU2NCldOwotI2RlZmluZSBJQ1NLX0NBX1BSSVZfU0laRSAgICAgICg4ICogc2l6ZW9mKHU2NCkpCisJdTY0CQkJICBpY3NrX2NhX3ByaXZbODggLyBzaXplb2YodTY0KV07CisjZGVmaW5lIElDU0tfQ0FfUFJJVl9TSVpFICAgICAgKDExICogc2l6ZW9mKHU2NCkpCiB9OwogCiAjZGVmaW5lIElDU0tfVElNRV9SRVRSQU5TCTEJLyogUmV0cmFuc21pdCB0aW1lciAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaW5ldF9lY24uaCBiL2luY2x1ZGUvbmV0L2luZXRfZWNuLmgKaW5kZXggMGRjMGE1MS4uZGNlMmQ1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaW5ldF9lY24uaAorKysgYi9pbmNsdWRlL25ldC9pbmV0X2Vjbi5oCkBAIC0xMjgsNyArMTI4LDggQEAKIAl0byA9IGZyb20gfCBodG9ubChJTkVUX0VDTl9DRSA8PCAyMCk7CiAJKihfX2JlMzIgKilpcGggPSB0bzsKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpCi0JCXNrYi0+Y3N1bSA9IGNzdW1fYWRkKGNzdW1fc3ViKHNrYi0+Y3N1bSwgZnJvbSksIHRvKTsKKwkJc2tiLT5jc3VtID0gY3N1bV9hZGQoY3N1bV9zdWIoc2tiLT5jc3VtLCAoX19mb3JjZSBfX3dzdW0pZnJvbSksCisJCQkJICAgICAoX19mb3JjZSBfX3dzdW0pdG8pOwogCXJldHVybiAxOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcC5oIGIvaW5jbHVkZS9uZXQvaXAuaAppbmRleCA5NzQyYjkyLi5iYzQzYzBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcC5oCisrKyBiL2luY2x1ZGUvbmV0L2lwLmgKQEAgLTIxOSw2ICsyMTksMjkgQEAKIH0KICNlbmRpZgogCisjZGVmaW5lIHNubXBfZ2V0X2NwdV9maWVsZDY0X2JhdGNoKGJ1ZmY2NCwgc3RhdHNfbGlzdCwgbWliX3N0YXRpc3RpYywgb2Zmc2V0KSBcCit7IFwKKwlpbnQgaSwgYzsgXAorCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjKSB7IFwKKwkJZm9yIChpID0gMDsgc3RhdHNfbGlzdFtpXS5uYW1lOyBpKyspIFwKKwkJCWJ1ZmY2NFtpXSArPSBzbm1wX2dldF9jcHVfZmllbGQ2NCggXAorCQkJCQltaWJfc3RhdGlzdGljLCBcCisJCQkJCWMsIHN0YXRzX2xpc3RbaV0uZW50cnksIFwKKwkJCQkJb2Zmc2V0KTsgXAorCX0gXAorfQorCisjZGVmaW5lIHNubXBfZ2V0X2NwdV9maWVsZF9iYXRjaChidWZmLCBzdGF0c19saXN0LCBtaWJfc3RhdGlzdGljKSBcCit7IFwKKwlpbnQgaSwgYzsgXAorCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjKSB7IFwKKwkJZm9yIChpID0gMDsgc3RhdHNfbGlzdFtpXS5uYW1lOyBpKyspIFwKKwkJCWJ1ZmZbaV0gKz0gc25tcF9nZXRfY3B1X2ZpZWxkKCBcCisJCQkJCQltaWJfc3RhdGlzdGljLCBcCisJCQkJCQljLCBzdGF0c19saXN0W2ldLmVudHJ5KTsgXAorCX0gXAorfQorCiB2b2lkIGluZXRfZ2V0X2xvY2FsX3BvcnRfcmFuZ2Uoc3RydWN0IG5ldCAqbmV0LCBpbnQgKmxvdywgaW50ICpoaWdoKTsKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwNl9yb3V0ZS5oIGIvaW5jbHVkZS9uZXQvaXA2X3JvdXRlLmgKaW5kZXggZDk3MzA1ZC4uZTBjZDMxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXA2X3JvdXRlLmgKKysrIGIvaW5jbHVkZS9uZXQvaXA2X3JvdXRlLmgKQEAgLTY0LDYgKzY0LDkgQEAKIH0KIAogdm9pZCBpcDZfcm91dGVfaW5wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdHJ1Y3QgZHN0X2VudHJ5ICppcDZfcm91dGVfaW5wdXRfbG9va3VwKHN0cnVjdCBuZXQgKm5ldCwKKwkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZmxvd2k2ICpmbDYsIGludCBmbGFncyk7CiAKIHN0cnVjdCBkc3RfZW50cnkgKmlwNl9yb3V0ZV9vdXRwdXRfZmxhZ3Moc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCSBzdHJ1Y3QgZmxvd2k2ICpmbDYsIGludCBmbGFncyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcDZfdHVubmVsLmggYi9pbmNsdWRlL25ldC9pcDZfdHVubmVsLmgKaW5kZXggNDNhNWEwZS4uMjBlZDk2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXA2X3R1bm5lbC5oCisrKyBiL2luY2x1ZGUvbmV0L2lwNl90dW5uZWwuaApAQCAtMjMsNiArMjMsNyBAQAogCV9fdTggcHJvdG87CQkvKiB0dW5uZWwgcHJvdG9jb2wgKi8KIAlfX3U4IGVuY2FwX2xpbWl0OwkvKiBlbmNhcHN1bGF0aW9uIGxpbWl0IGZvciB0dW5uZWwgKi8KIAlfX3U4IGhvcF9saW1pdDsJCS8qIGhvcCBsaW1pdCBmb3IgdHVubmVsICovCisJYm9vbCBjb2xsZWN0X21kOwogCV9fYmUzMiBmbG93aW5mbzsJLyogdHJhZmZpYyBjbGFzcyBhbmQgZmxvd2xhYmVsIGZvciB0dW5uZWwgKi8KIAlfX3UzMiBmbGFnczsJCS8qIHR1bm5lbCBmbGFncyAqLwogCXN0cnVjdCBpbjZfYWRkciBsYWRkcjsJLyogbG9jYWwgdHVubmVsIGVuZC1wb2ludCBhZGRyZXNzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcF9maWIuaCBiL2luY2x1ZGUvbmV0L2lwX2ZpYi5oCmluZGV4IDQwNzlmYzEuLmI5MzE0YjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwX2ZpYi5oCisrKyBiL2luY2x1ZGUvbmV0L2lwX2ZpYi5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bmV0L2ZpYl9ydWxlcy5oPgogI2luY2x1ZGUgPG5ldC9pbmV0cGVlci5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAKIHN0cnVjdCBmaWJfY29uZmlnIHsKIAl1OAkJCWZjX2RzdF9sZW47CkBAIC0xMTEsNiArMTEyLDcgQEAKIAl1bnNpZ25lZCBjaGFyCQlmaWJfc2NvcGU7CiAJdW5zaWduZWQgY2hhcgkJZmliX3R5cGU7CiAJX19iZTMyCQkJZmliX3ByZWZzcmM7CisJdTMyCQkJZmliX3RiX2lkOwogCXUzMgkJCWZpYl9wcmlvcml0eTsKIAl1MzIJCQkqZmliX21ldHJpY3M7CiAjZGVmaW5lIGZpYl9tdHUgZmliX21ldHJpY3NbUlRBWF9NVFUtMV0KQEAgLTEyMSw2ICsxMjMsNyBAQAogI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEgKIAlpbnQJCQlmaWJfd2VpZ2h0OwogI2VuZGlmCisJdW5zaWduZWQgaW50CQlmaWJfb2ZmbG9hZF9jbnQ7CiAJc3RydWN0IHJjdV9oZWFkCQlyY3U7CiAJc3RydWN0IGZpYl9uaAkJZmliX25oWzBdOwogI2RlZmluZSBmaWJfZGV2CQlmaWJfbmhbMF0ubmhfZGV2CkBAIC0xNzIsNiArMTc1LDE4IEBACiAKIF9fYmUzMiBmaWJfaW5mb191cGRhdGVfbmhfc2FkZHIoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmliX25oICpuaCk7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaWJfaW5mb19vZmZsb2FkX2luYyhzdHJ1Y3QgZmliX2luZm8gKmZpKQoreworCWZpLT5maWJfb2ZmbG9hZF9jbnQrKzsKKwlmaS0+ZmliX2ZsYWdzIHw9IFJUTkhfRl9PRkZMT0FEOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmliX2luZm9fb2ZmbG9hZF9kZWMoc3RydWN0IGZpYl9pbmZvICpmaSkKK3sKKwlpZiAoLS1maS0+ZmliX29mZmxvYWRfY250ID09IDApCisJCWZpLT5maWJfZmxhZ3MgJj0gflJUTkhfRl9PRkZMT0FEOworfQorCiAjZGVmaW5lIEZJQl9SRVNfU0FERFIobmV0LCByZXMpCQkJCVwKIAkoKEZJQl9SRVNfTkgocmVzKS5uaF9zYWRkcl9nZW5pZCA9PQkJXAogCSAgYXRvbWljX3JlYWQoJihuZXQpLT5pcHY0LmRldl9hZGRyX2dlbmlkKSkgPwlcCkBAIC0xODQsNiArMTk5LDMzIEBACiAjZGVmaW5lIEZJQl9SRVNfUFJFRlNSQyhuZXQsIHJlcykJKChyZXMpLmZpLT5maWJfcHJlZnNyYyA/IDogXAogCQkJCQkgRklCX1JFU19TQUREUihuZXQsIHJlcykpCiAKK3N0cnVjdCBmaWJfbm90aWZpZXJfaW5mbyB7CisJc3RydWN0IG5ldCAqbmV0OworfTsKKworc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvIHsKKwlzdHJ1Y3QgZmliX25vdGlmaWVyX2luZm8gaW5mbzsgLyogbXVzdCBiZSBmaXJzdCAqLworCXUzMiBkc3Q7CisJaW50IGRzdF9sZW47CisJc3RydWN0IGZpYl9pbmZvICpmaTsKKwl1OCB0b3M7CisJdTggdHlwZTsKKwl1MzIgdGJfaWQ7CisJdTMyIG5sZmxhZ3M7Cit9OworCitlbnVtIGZpYl9ldmVudF90eXBlIHsKKwlGSUJfRVZFTlRfRU5UUllfQURELAorCUZJQl9FVkVOVF9FTlRSWV9ERUwsCisJRklCX0VWRU5UX1JVTEVfQURELAorCUZJQl9FVkVOVF9SVUxFX0RFTCwKK307CisKK2ludCByZWdpc3Rlcl9maWJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CitpbnQgdW5yZWdpc3Rlcl9maWJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CitpbnQgY2FsbF9maWJfbm90aWZpZXJzKHN0cnVjdCBuZXQgKm5ldCwgZW51bSBmaWJfZXZlbnRfdHlwZSBldmVudF90eXBlLAorCQkgICAgICAgc3RydWN0IGZpYl9ub3RpZmllcl9pbmZvICppbmZvKTsKKwogc3RydWN0IGZpYl90YWJsZSB7CiAJc3RydWN0IGhsaXN0X25vZGUJdGJfaGxpc3Q7CiAJdTMyCQkJdGJfaWQ7CkBAIC0xOTUsMTMgKzIzNywxMiBAQAogCiBpbnQgZmliX3RhYmxlX2xvb2t1cChzdHJ1Y3QgZmliX3RhYmxlICp0YiwgY29uc3Qgc3RydWN0IGZsb3dpNCAqZmxwLAogCQkgICAgIHN0cnVjdCBmaWJfcmVzdWx0ICpyZXMsIGludCBmaWJfZmxhZ3MpOwotaW50IGZpYl90YWJsZV9pbnNlcnQoc3RydWN0IGZpYl90YWJsZSAqLCBzdHJ1Y3QgZmliX2NvbmZpZyAqKTsKLWludCBmaWJfdGFibGVfZGVsZXRlKHN0cnVjdCBmaWJfdGFibGUgKiwgc3RydWN0IGZpYl9jb25maWcgKik7CitpbnQgZmliX3RhYmxlX2luc2VydChzdHJ1Y3QgbmV0ICosIHN0cnVjdCBmaWJfdGFibGUgKiwgc3RydWN0IGZpYl9jb25maWcgKik7CitpbnQgZmliX3RhYmxlX2RlbGV0ZShzdHJ1Y3QgbmV0ICosIHN0cnVjdCBmaWJfdGFibGUgKiwgc3RydWN0IGZpYl9jb25maWcgKik7CiBpbnQgZmliX3RhYmxlX2R1bXAoc3RydWN0IGZpYl90YWJsZSAqdGFibGUsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7Ci1pbnQgZmliX3RhYmxlX2ZsdXNoKHN0cnVjdCBmaWJfdGFibGUgKnRhYmxlKTsKK2ludCBmaWJfdGFibGVfZmx1c2goc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmliX3RhYmxlICp0YWJsZSk7CiBzdHJ1Y3QgZmliX3RhYmxlICpmaWJfdHJpZV91bm1lcmdlKHN0cnVjdCBmaWJfdGFibGUgKm1haW5fdGIpOwotdm9pZCBmaWJfdGFibGVfZmx1c2hfZXh0ZXJuYWwoc3RydWN0IGZpYl90YWJsZSAqdGFibGUpOwogdm9pZCBmaWJfZnJlZV90YWJsZShzdHJ1Y3QgZmliX3RhYmxlICp0Yik7CiAKICNpZm5kZWYgQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUwpAQCAtMzE0LDEyICszNTUsMTEgQEAKIH0KICNlbmRpZgogaW50IGZpYl91bm1lcmdlKHN0cnVjdCBuZXQgKm5ldCk7Ci12b2lkIGZpYl9mbHVzaF9leHRlcm5hbChzdHJ1Y3QgbmV0ICpuZXQpOwogCiAvKiBFeHBvcnRlZCBieSBmaWJfc2VtYW50aWNzLmMgKi8KIGludCBpcF9maWJfY2hlY2tfZGVmYXVsdChfX2JlMzIgZ3csIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogaW50IGZpYl9zeW5jX2Rvd25fZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIGJvb2wgZm9yY2UpOwotaW50IGZpYl9zeW5jX2Rvd25fYWRkcihzdHJ1Y3QgbmV0ICpuZXQsIF9fYmUzMiBsb2NhbCk7CitpbnQgZmliX3N5bmNfZG93bl9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUzMiBsb2NhbCk7CiBpbnQgZmliX3N5bmNfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG5oX2ZsYWdzKTsKIAogZXh0ZXJuIHUzMiBmaWJfbXVsdGlwYXRoX3NlY3JldCBfX3JlYWRfbW9zdGx5OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXBfdHVubmVscy5oIGIvaW5jbHVkZS9uZXQvaXBfdHVubmVscy5oCmluZGV4IGE1ZTcwMzUuLjU5NTU3YzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwX3R1bm5lbHMuaAorKysgYi9pbmNsdWRlL25ldC9pcF90dW5uZWxzLmgKQEAgLTIyMiw2ICsyMjIsMjUgQEAKIAlyZXR1cm4gdHVuX2luZm8tPm1vZGUgJiBJUF9UVU5ORUxfSU5GT19JUFY2ID8gQUZfSU5FVDYgOiBBRl9JTkVUOwogfQogCitzdGF0aWMgaW5saW5lIF9fYmU2NCBrZXkzMl90b190dW5uZWxfaWQoX19iZTMyIGtleSkKK3sKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwlyZXR1cm4gKF9fZm9yY2UgX19iZTY0KWtleTsKKyNlbHNlCisJcmV0dXJuIChfX2ZvcmNlIF9fYmU2NCkoKF9fZm9yY2UgdTY0KWtleSA8PCAzMik7CisjZW5kaWYKK30KKworLyogUmV0dXJucyB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBhIF9fYmU2NC4gKi8KK3N0YXRpYyBpbmxpbmUgX19iZTMyIHR1bm5lbF9pZF90b19rZXkzMihfX2JlNjQgdHVuX2lkKQoreworI2lmZGVmIF9fQklHX0VORElBTgorCXJldHVybiAoX19mb3JjZSBfX2JlMzIpdHVuX2lkOworI2Vsc2UKKwlyZXR1cm4gKF9fZm9yY2UgX19iZTMyKSgoX19mb3JjZSB1NjQpdHVuX2lkID4+IDMyKTsKKyNlbmRpZgorfQorCiAjaWZkZWYgQ09ORklHX0lORVQKIAogaW50IGlwX3R1bm5lbF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpAQCAtMjM2LDYgKzI1NSw4IEBACiAKIHZvaWQgaXBfdHVubmVsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJICAgIGNvbnN0IHN0cnVjdCBpcGhkciAqdG5sX3BhcmFtcywgY29uc3QgdTggcHJvdG9jb2wpOwordm9pZCBpcF9tZF90dW5uZWxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICAgY29uc3QgdTggcHJvdG8pOwogaW50IGlwX3R1bm5lbF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnAsIGludCBjbWQpOwogaW50IF9faXBfdHVubmVsX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUsIGJvb2wgc3RyaWN0KTsKIGludCBpcF90dW5uZWxfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9rY20uaCBiL2luY2x1ZGUvbmV0L2tjbS5oCmluZGV4IDI4NDBiNTguLjJhODk2NTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2tjbS5oCisrKyBiL2luY2x1ZGUvbmV0L2tjbS5oCkBAIC0xMyw2ICsxMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9zdHJwYXJzZXIuaD4KICNpbmNsdWRlIDx1YXBpL2xpbnV4L2tjbS5oPgogCiBleHRlcm4gdW5zaWduZWQgaW50IGtjbV9uZXRfaWQ7CkBAIC0yMSwxNiArMjIsOCBAQAogI2RlZmluZSBLQ01fU1RBVFNfSU5DUihzdGF0KSAoKHN0YXQpKyspCiAKIHN0cnVjdCBrY21fcHNvY2tfc3RhdHMgewotCXVuc2lnbmVkIGxvbmcgbG9uZyByeF9tc2dzOwotCXVuc2lnbmVkIGxvbmcgbG9uZyByeF9ieXRlczsKIAl1bnNpZ25lZCBsb25nIGxvbmcgdHhfbXNnczsKIAl1bnNpZ25lZCBsb25nIGxvbmcgdHhfYnl0ZXM7Ci0JdW5zaWduZWQgaW50IHJ4X2Fib3J0czsKLQl1bnNpZ25lZCBpbnQgcnhfbWVtX2ZhaWw7Ci0JdW5zaWduZWQgaW50IHJ4X25lZWRfbW9yZV9oZHI7Ci0JdW5zaWduZWQgaW50IHJ4X21zZ190b29fYmlnOwotCXVuc2lnbmVkIGludCByeF9tc2dfdGltZW91dHM7Ci0JdW5zaWduZWQgaW50IHJ4X2JhZF9oZHJfbGVuOwogCXVuc2lnbmVkIGxvbmcgbG9uZyByZXNlcnZlZDsKIAl1bnNpZ25lZCBsb25nIGxvbmcgdW5yZXNlcnZlZDsKIAl1bnNpZ25lZCBpbnQgdHhfYWJvcnRzOwpAQCAtNjQsMTMgKzU3LDYgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqbGFzdF9za2I7CiB9OwogCi1zdHJ1Y3Qga2NtX3J4X21zZyB7Ci0JaW50IGZ1bGxfbGVuOwotCWludCBhY2N1bV9sZW47Ci0JaW50IG9mZnNldDsKLQlpbnQgZWFybHlfZWF0ZW47Ci19OwotCiAvKiBTb2NrZXQgc3RydWN0dXJlIGZvciBLQ00gY2xpZW50IHNvY2tldHMgKi8KIHN0cnVjdCBrY21fc29jayB7CiAJc3RydWN0IHNvY2sgc2s7CkBAIC04Nyw2ICs3Myw3IEBACiAJc3RydWN0IHdvcmtfc3RydWN0IHR4X3dvcms7CiAJc3RydWN0IGxpc3RfaGVhZCB3YWl0X3Bzb2NrX2xpc3Q7CiAJc3RydWN0IHNrX2J1ZmYgKnNlcV9za2I7CisJdTMyIHR4X3N0b3BwZWQgOiAxOwogCiAJLyogRG9uJ3QgdXNlIGJpdCBmaWVsZHMgaGVyZSwgdGhlc2UgYXJlIHNldCB1bmRlciBkaWZmZXJlbnQgbG9ja3MgKi8KIAlib29sIHR4X3dhaXQ7CkBAIC0xMDQsMTEgKzkxLDExIEBACiAvKiBTdHJ1Y3R1cmUgZm9yIGFuIGF0dGFjaGVkIGxvd2VyIHNvY2tldCAqLwogc3RydWN0IGtjbV9wc29jayB7CiAJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBzdHJwYXJzZXIgc3RycDsKIAlzdHJ1Y3Qga2NtX211eCAqbXV4OwogCWludCBpbmRleDsKIAogCXUzMiB0eF9zdG9wcGVkIDogMTsKLQl1MzIgcnhfc3RvcHBlZCA6IDE7CiAJdTMyIGRvbmUgOiAxOwogCXUzMiB1bmF0dGFjaGluZyA6IDE7CiAKQEAgLTEyMSwxOCArMTA4LDEyIEBACiAJc3RydWN0IGtjbV9wc29ja19zdGF0cyBzdGF0czsKIAogCS8qIFJlY2VpdmUgKi8KLQlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiX2hlYWQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKipyeF9za2JfbmV4dHA7Ci0Jc3RydWN0IHNrX2J1ZmYgKnJlYWR5X3J4X21zZzsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBzb2NrX3JlYWR5X2xpc3Q7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHJ4X3dvcms7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayByeF9kZWxheWVkX3dvcms7CiAJc3RydWN0IGJwZl9wcm9nICpicGZfcHJvZzsKIAlzdHJ1Y3Qga2NtX3NvY2sgKnJ4X2tjbTsKIAl1bnNpZ25lZCBsb25nIGxvbmcgc2F2ZWRfcnhfYnl0ZXM7CiAJdW5zaWduZWQgbG9uZyBsb25nIHNhdmVkX3J4X21zZ3M7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgcnhfbXNnX3RpbWVyOwotCXVuc2lnbmVkIGludCByeF9uZWVkX2J5dGVzOworCXN0cnVjdCBza19idWZmICpyZWFkeV9yeF9tc2c7CiAKIAkvKiBUcmFuc21pdCAqLwogCXN0cnVjdCBrY21fc29jayAqdHhfa2NtOwpAQCAtMTQ2LDYgKzEyNyw3IEBACiAJc3RydWN0IG11dGV4IG11dGV4OwogCXN0cnVjdCBrY21fcHNvY2tfc3RhdHMgYWdncmVnYXRlX3Bzb2NrX3N0YXRzOwogCXN0cnVjdCBrY21fbXV4X3N0YXRzIGFnZ3JlZ2F0ZV9tdXhfc3RhdHM7CisJc3RydWN0IHN0cnBfYWdncl9zdGF0cyBhZ2dyZWdhdGVfc3RycF9zdGF0czsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG11eF9saXN0OwogCWludCBjb3VudDsKIH07CkBAIC0xNjMsNiArMTQ1LDcgQEAKIAogCXN0cnVjdCBrY21fbXV4X3N0YXRzIHN0YXRzOwogCXN0cnVjdCBrY21fcHNvY2tfc3RhdHMgYWdncmVnYXRlX3Bzb2NrX3N0YXRzOworCXN0cnVjdCBzdHJwX2FnZ3Jfc3RhdHMgYWdncmVnYXRlX3N0cnBfc3RhdHM7CiAKIAkvKiBSZWNlaXZlICovCiAJc3BpbmxvY2tfdCByeF9sb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CkBAIC0xOTAsMTQgKzE3Myw2IEBACiAJLyogU2F2ZSBwc29jayBzdGF0aXN0aWNzIGluIHRoZSBtdXggd2hlbiBwc29jayBpcyBiZWluZyB1bmF0dGFjaGVkLiAqLwogCiAjZGVmaW5lIFNBVkVfUFNPQ0tfU1RBVFMoX3N0YXQpIChhZ2dfc3RhdHMtPl9zdGF0ICs9IHN0YXRzLT5fc3RhdCkKLQlTQVZFX1BTT0NLX1NUQVRTKHJ4X21zZ3MpOwotCVNBVkVfUFNPQ0tfU1RBVFMocnhfYnl0ZXMpOwotCVNBVkVfUFNPQ0tfU1RBVFMocnhfYWJvcnRzKTsKLQlTQVZFX1BTT0NLX1NUQVRTKHJ4X21lbV9mYWlsKTsKLQlTQVZFX1BTT0NLX1NUQVRTKHJ4X25lZWRfbW9yZV9oZHIpOwotCVNBVkVfUFNPQ0tfU1RBVFMocnhfbXNnX3Rvb19iaWcpOwotCVNBVkVfUFNPQ0tfU1RBVFMocnhfbXNnX3RpbWVvdXRzKTsKLQlTQVZFX1BTT0NLX1NUQVRTKHJ4X2JhZF9oZHJfbGVuKTsKIAlTQVZFX1BTT0NLX1NUQVRTKHR4X21zZ3MpOwogCVNBVkVfUFNPQ0tfU1RBVFModHhfYnl0ZXMpOwogCVNBVkVfUFNPQ0tfU1RBVFMocmVzZXJ2ZWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbDNtZGV2LmggYi9pbmNsdWRlL25ldC9sM21kZXYuaAppbmRleCBlOTAwOTUwLi5iMjIwZGFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9sM21kZXYuaAorKysgYi9pbmNsdWRlL25ldC9sM21kZXYuaApAQCAtMTEsNiArMTEsNyBAQAogI2lmbmRlZiBfTkVUX0wzTURFVl9IXwogI2RlZmluZSBfTkVUX0wzTURFVl9IXwogCisjaW5jbHVkZSA8bmV0L2RzdC5oPgogI2luY2x1ZGUgPG5ldC9maWJfcnVsZXMuaD4KIAogLyoqCkBAIC0xOCwzMCArMTksMjQgQEAKICAqCiAgKiBAbDNtZGV2X2ZpYl90YWJsZTogR2V0IEZJQiB0YWJsZSBpZCB0byB1c2UgZm9yIGxvb2t1cHMKICAqCi0gKiBAbDNtZGV2X2dldF9ydGFibGU6IEdldCBjYWNoZWQgSVB2NCBydGFibGUgKGRzdF9lbnRyeSkgZm9yIGRldmljZQorICogQGwzbWRldl9sM19yY3Y6ICAgIEhvb2sgaW4gTDMgcmVjZWl2ZSBwYXRoCiAgKgotICogQGwzbWRldl9nZXRfc2FkZHI6IEdldCBzb3VyY2UgYWRkcmVzcyBmb3IgYSBmbG93CisgKiBAbDNtZGV2X2wzX291dDogICAgSG9vayBpbiBMMyBvdXRwdXQgcGF0aAogICoKLSAqIEBsM21kZXZfZ2V0X3J0Nl9kc3Q6IEdldCBjYWNoZWQgSVB2NiBydDZfaW5mbyAoZHN0X2VudHJ5KSBmb3IgZGV2aWNlCisgKiBAbDNtZGV2X2xpbmtfc2NvcGVfbG9va3VwOiBJUHY2IGxvb2t1cCBmb3IgbGlua2xvY2FsIGFuZCBtY2FzdCBkZXN0aW5hdGlvbnMKICAqLwogCiBzdHJ1Y3QgbDNtZGV2X29wcyB7CiAJdTMyCQkoKmwzbWRldl9maWJfdGFibGUpKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCXN0cnVjdCBza19idWZmICogKCpsM21kZXZfbDNfcmN2KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsIHUxNiBwcm90byk7Ci0KLQkvKiBJUHY0IG9wcyAqLwotCXN0cnVjdCBydGFibGUgKgkoKmwzbWRldl9nZXRfcnRhYmxlKShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBmbG93aTQgKmZsNCk7Ci0JaW50CQkoKmwzbWRldl9nZXRfc2FkZHIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCSAgICBzdHJ1Y3QgZmxvd2k0ICpmbDQpOworCXN0cnVjdCBza19idWZmICogKCpsM21kZXZfbDNfb3V0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICB1MTYgcHJvdG8pOwogCiAJLyogSVB2NiBvcHMgKi8KLQlzdHJ1Y3QgZHN0X2VudHJ5ICogKCpsM21kZXZfZ2V0X3J0Nl9kc3QpKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJc3RydWN0IGRzdF9lbnRyeSAqICgqbDNtZGV2X2xpbmtfc2NvcGVfbG9va3VwKShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkJIHN0cnVjdCBmbG93aTYgKmZsNik7Ci0JaW50CQkgICAoKmwzbWRldl9nZXRfc2FkZHI2KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJY29uc3Qgc3RydWN0IHNvY2sgKnNrLAotCQkJCQkJc3RydWN0IGZsb3dpNiAqZmw2KTsKIH07CiAKICNpZmRlZiBDT05GSUdfTkVUX0wzX01BU1RFUl9ERVYKQEAgLTQ5LDYgKzQ0LDggQEAKIGludCBsM21kZXZfZmliX3J1bGVfbWF0Y2goc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmxvd2kgKmZsLAogCQkJICBzdHJ1Y3QgZmliX2xvb2t1cF9hcmcgKmFyZyk7CiAKK3ZvaWQgbDNtZGV2X3VwZGF0ZV9mbG93KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGZsb3dpICpmbCk7CisKIGludCBsM21kZXZfbWFzdGVyX2lmaW5kZXhfcmN1KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGlubGluZSBpbnQgbDNtZGV2X21hc3Rlcl9pZmluZGV4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CkBAIC04MCw3ICs3Nyw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUKLWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpsM21kZXZfbWFzdGVyX2Rldl9yY3UoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKl9kZXYpCitzdHJ1Y3QgbmV0X2RldmljZSAqbDNtZGV2X21hc3Rlcl9kZXZfcmN1KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpfZGV2KQogewogCS8qIG5ldGRldl9tYXN0ZXJfdXBwZXJfZGV2X2dldF9yY3UgY2FsbHMKIAkgKiBsaXN0X2ZpcnN0X29yX251bGxfcmN1IHRvIHdhbGsgdGhlIHVwcGVyIGRldiBsaXN0LgpAQCAtODksNyArODYsNyBAQAogCSAqIHR5cGVjYXN0IHRvIHJlbW92ZSB0aGUgY29uc3QKIAkgKi8KIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopX2RldjsKLQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqbWFzdGVyOworCXN0cnVjdCBuZXRfZGV2aWNlICptYXN0ZXI7CiAKIAlpZiAoIWRldikKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMDQsMjYgKzEwMSw2IEBACiAJcmV0dXJuIG1hc3RlcjsKIH0KIAotLyogZ2V0IGluZGV4IG9mIGFuIGludGVyZmFjZSB0byB1c2UgZm9yIEZJQiBsb29rdXBzLiBGb3IgZGV2aWNlcwotICogZW5zbGF2ZWQgdG8gYW4gTDMgbWFzdGVyIGRldmljZSBGSUIgbG9va3VwcyBhcmUgYmFzZWQgb24gdGhlCi0gKiBtYXN0ZXIgaW5kZXgKLSAqLwotc3RhdGljIGlubGluZSBpbnQgbDNtZGV2X2ZpYl9vaWZfcmN1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGwzbWRldl9tYXN0ZXJfaWZpbmRleF9yY3UoZGV2KSA/IDogZGV2LT5pZmluZGV4OwotfQotCi1zdGF0aWMgaW5saW5lIGludCBsM21kZXZfZmliX29pZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCWludCBvaWY7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0Jb2lmID0gbDNtZGV2X2ZpYl9vaWZfcmN1KGRldik7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlyZXR1cm4gb2lmOwotfQotCiB1MzIgbDNtZGV2X2ZpYl90YWJsZV9yY3UoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiB1MzIgbDNtZGV2X2ZpYl90YWJsZV9ieV9pbmRleChzdHJ1Y3QgbmV0ICpuZXQsIGludCBpZmluZGV4KTsKIHN0YXRpYyBpbmxpbmUgdTMyIGwzbWRldl9maWJfdGFibGUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTEzNywzOSArMTE0LDcgQEAKIAlyZXR1cm4gdGJfaWQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJ0YWJsZSAqbDNtZGV2X2dldF9ydGFibGUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBmbG93aTQgKmZsNCkKLXsKLQlpZiAobmV0aWZfaXNfbDNfbWFzdGVyKGRldikgJiYgZGV2LT5sM21kZXZfb3BzLT5sM21kZXZfZ2V0X3J0YWJsZSkKLQkJcmV0dXJuIGRldi0+bDNtZGV2X29wcy0+bDNtZGV2X2dldF9ydGFibGUoZGV2LCBmbDQpOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBuZXRpZl9pbmRleF9pc19sM19tYXN0ZXIoc3RydWN0IG5ldCAqbmV0LCBpbnQgaWZpbmRleCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCWJvb2wgcmMgPSBmYWxzZTsKLQotCWlmIChpZmluZGV4ID09IDApCi0JCXJldHVybiBmYWxzZTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQotCWRldiA9IGRldl9nZXRfYnlfaW5kZXhfcmN1KG5ldCwgaWZpbmRleCk7Ci0JaWYgKGRldikKLQkJcmMgPSBuZXRpZl9pc19sM19tYXN0ZXIoZGV2KTsKLQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgbDNtZGV2X2dldF9zYWRkcihzdHJ1Y3QgbmV0ICpuZXQsIGludCBpZmluZGV4LCBzdHJ1Y3QgZmxvd2k0ICpmbDQpOwotCi1zdHJ1Y3QgZHN0X2VudHJ5ICpsM21kZXZfZ2V0X3J0Nl9kc3Qoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmxvd2k2ICpmbDYpOwotaW50IGwzbWRldl9nZXRfc2FkZHI2KHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IHNvY2sgKnNrLAotCQkgICAgICBzdHJ1Y3QgZmxvd2k2ICpmbDYpOworc3RydWN0IGRzdF9lbnRyeSAqbDNtZGV2X2xpbmtfc2NvcGVfbG9va3VwKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGZsb3dpNiAqZmw2KTsKIAogc3RhdGljIGlubGluZQogc3RydWN0IHNrX2J1ZmYgKmwzbWRldl9sM19yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IHByb3RvKQpAQCAtMTk5LDYgKzE0NCwzNCBAQAogCXJldHVybiBsM21kZXZfbDNfcmN2KHNrYiwgQUZfSU5FVDYpOwogfQogCitzdGF0aWMgaW5saW5lCitzdHJ1Y3Qgc2tfYnVmZiAqbDNtZGV2X2wzX291dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHUxNiBwcm90bykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiX2RzdChza2IpLT5kZXY7CisKKwlpZiAobmV0aWZfaXNfbDNfc2xhdmUoZGV2KSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqbWFzdGVyOworCisJCW1hc3RlciA9IG5ldGRldl9tYXN0ZXJfdXBwZXJfZGV2X2dldF9yY3UoZGV2KTsKKwkJaWYgKG1hc3RlciAmJiBtYXN0ZXItPmwzbWRldl9vcHMtPmwzbWRldl9sM19vdXQpCisJCQlza2IgPSBtYXN0ZXItPmwzbWRldl9vcHMtPmwzbWRldl9sM19vdXQobWFzdGVyLCBzaywKKwkJCQkJCQkJc2tiLCBwcm90byk7CisJfQorCisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGlubGluZQorc3RydWN0IHNrX2J1ZmYgKmwzbWRldl9pcF9vdXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBsM21kZXZfbDNfb3V0KHNrLCBza2IsIEFGX0lORVQpOworfQorCitzdGF0aWMgaW5saW5lCitzdHJ1Y3Qgc2tfYnVmZiAqbDNtZGV2X2lwNl9vdXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBsM21kZXZfbDNfb3V0KHNrLCBza2IsIEFGX0lORVQ2KTsKK30KICNlbHNlCiAKIHN0YXRpYyBpbmxpbmUgaW50IGwzbWRldl9tYXN0ZXJfaWZpbmRleF9yY3UoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTIxNiwyMCArMTg5LDExIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUKLWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpsM21kZXZfbWFzdGVyX2Rldl9yY3UoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0cnVjdCBuZXRfZGV2aWNlICpsM21kZXZfbWFzdGVyX2Rldl9yY3UoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbDNtZGV2X2ZpYl9vaWZfcmN1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGRldiA/IGRldi0+aWZpbmRleCA6IDA7Ci19Ci1zdGF0aWMgaW5saW5lIGludCBsM21kZXZfZmliX29pZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXJldHVybiBkZXYgPyBkZXYtPmlmaW5kZXggOiAwOwotfQotCiBzdGF0aWMgaW5saW5lIHUzMiBsM21kZXZfZmliX3RhYmxlX3JjdShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXJldHVybiAwOwpAQCAtMjQzLDM1ICsyMDcsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcnRhYmxlICpsM21kZXZfZ2V0X3J0YWJsZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGZsb3dpNCAqZmw0KQotewotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgbmV0aWZfaW5kZXhfaXNfbDNfbWFzdGVyKHN0cnVjdCBuZXQgKm5ldCwgaW50IGlmaW5kZXgpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBsM21kZXZfZ2V0X3NhZGRyKHN0cnVjdCBuZXQgKm5ldCwgaW50IGlmaW5kZXgsCi0JCQkJICAgc3RydWN0IGZsb3dpNCAqZmw0KQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW5saW5lCi1zdHJ1Y3QgZHN0X2VudHJ5ICpsM21kZXZfZ2V0X3J0Nl9kc3Qoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmxvd2k2ICpmbDYpCitzdHJ1Y3QgZHN0X2VudHJ5ICpsM21kZXZfbGlua19zY29wZV9sb29rdXAoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmxvd2k2ICpmbDYpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGwzbWRldl9nZXRfc2FkZHI2KHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IHNvY2sgKnNrLAotCQkJCSAgICBzdHJ1Y3QgZmxvd2k2ICpmbDYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUKIHN0cnVjdCBza19idWZmICpsM21kZXZfaXBfcmN2KHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0yODUsMTEgKzIyNiwyNyBAQAogfQogCiBzdGF0aWMgaW5saW5lCitzdHJ1Y3Qgc2tfYnVmZiAqbDNtZGV2X2lwX291dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGlubGluZQorc3RydWN0IHNrX2J1ZmYgKmwzbWRldl9pcDZfb3V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW5saW5lCiBpbnQgbDNtZGV2X2ZpYl9ydWxlX21hdGNoKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGZsb3dpICpmbCwKIAkJCSAgc3RydWN0IGZpYl9sb29rdXBfYXJnICphcmcpCiB7CiAJcmV0dXJuIDE7CiB9CitzdGF0aWMgaW5saW5lCit2b2lkIGwzbWRldl91cGRhdGVfZmxvdyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmbG93aSAqZmwpCit7Cit9CiAjZW5kaWYKIAogI2VuZGlmIC8qIF9ORVRfTDNNREVWX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9sd3R1bm5lbC5oIGIvaW5jbHVkZS9uZXQvbHd0dW5uZWwuaAppbmRleCBlOWYxMTZlLi5lYTNmODBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9sd3R1bm5lbC5oCisrKyBiL2luY2x1ZGUvbmV0L2x3dHVubmVsLmgKQEAgLTEzLDYgKzEzLDEzIEBACiAvKiBsdyB0dW5uZWwgc3RhdGUgZmxhZ3MgKi8KICNkZWZpbmUgTFdUVU5ORUxfU1RBVEVfT1VUUFVUX1JFRElSRUNUCUJJVCgwKQogI2RlZmluZSBMV1RVTk5FTF9TVEFURV9JTlBVVF9SRURJUkVDVAlCSVQoMSkKKyNkZWZpbmUgTFdUVU5ORUxfU1RBVEVfWE1JVF9SRURJUkVDVAlCSVQoMikKKworZW51bSB7CisJTFdUVU5ORUxfWE1JVF9ET05FLAorCUxXVFVOTkVMX1hNSVRfQ09OVElOVUUsCit9OworCiAKIHN0cnVjdCBsd3R1bm5lbF9zdGF0ZSB7CiAJX191MTYJCXR5cGU7CkBAIC0yMSw2ICsyOCw3IEBACiAJaW50CQkoKm9yaWdfb3V0cHV0KShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAJaW50CQkoKm9yaWdfaW5wdXQpKHN0cnVjdCBza19idWZmICopOwogCWludCAgICAgICAgICAgICBsZW47CisJX191MTYJCWhlYWRyb29tOwogCV9fdTggICAgICAgICAgICBkYXRhWzBdOwogfTsKIApAQCAtMzQsNiArNDIsNyBAQAogCQkJICBzdHJ1Y3QgbHd0dW5uZWxfc3RhdGUgKmx3dHN0YXRlKTsKIAlpbnQgKCpnZXRfZW5jYXBfc2l6ZSkoc3RydWN0IGx3dHVubmVsX3N0YXRlICpsd3RzdGF0ZSk7CiAJaW50ICgqY21wX2VuY2FwKShzdHJ1Y3QgbHd0dW5uZWxfc3RhdGUgKmEsIHN0cnVjdCBsd3R1bm5lbF9zdGF0ZSAqYik7CisJaW50ICgqeG1pdCkoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiB9OwogCiAjaWZkZWYgQ09ORklHX0xXVFVOTkVMCkBAIC03NSw2ICs4NCwyNCBAQAogCiAJcmV0dXJuIGZhbHNlOwogfQorCitzdGF0aWMgaW5saW5lIGJvb2wgbHd0dW5uZWxfeG1pdF9yZWRpcmVjdChzdHJ1Y3QgbHd0dW5uZWxfc3RhdGUgKmx3dHN0YXRlKQoreworCWlmIChsd3RzdGF0ZSAmJiAobHd0c3RhdGUtPmZsYWdzICYgTFdUVU5ORUxfU1RBVEVfWE1JVF9SRURJUkVDVCkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBsd3R1bm5lbF9oZWFkcm9vbShzdHJ1Y3QgbHd0dW5uZWxfc3RhdGUgKmx3dHN0YXRlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBtdHUpCit7CisJaWYgKGx3dHVubmVsX3htaXRfcmVkaXJlY3QobHd0c3RhdGUpICYmIGx3dHN0YXRlLT5oZWFkcm9vbSA8IG10dSkKKwkJcmV0dXJuIGx3dHN0YXRlLT5oZWFkcm9vbTsKKworCXJldHVybiAwOworfQorCiBpbnQgbHd0dW5uZWxfZW5jYXBfYWRkX29wcyhjb25zdCBzdHJ1Y3QgbHd0dW5uZWxfZW5jYXBfb3BzICpvcCwKIAkJCSAgIHVuc2lnbmVkIGludCBudW0pOwogaW50IGx3dHVubmVsX2VuY2FwX2RlbF9vcHMoY29uc3Qgc3RydWN0IGx3dHVubmVsX2VuY2FwX29wcyAqb3AsCkBAIC05MCw2ICsxMTcsNyBAQAogaW50IGx3dHVubmVsX2NtcF9lbmNhcChzdHJ1Y3QgbHd0dW5uZWxfc3RhdGUgKmEsIHN0cnVjdCBsd3R1bm5lbF9zdGF0ZSAqYik7CiBpbnQgbHd0dW5uZWxfb3V0cHV0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCBsd3R1bm5lbF9pbnB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBsd3R1bm5lbF94bWl0KHN0cnVjdCBza19idWZmICpza2IpOwogCiAjZWxzZQogCkBAIC0xMTcsNiArMTQ1LDE3IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgbHd0dW5uZWxfeG1pdF9yZWRpcmVjdChzdHJ1Y3QgbHd0dW5uZWxfc3RhdGUgKmx3dHN0YXRlKQoreworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbHd0dW5uZWxfaGVhZHJvb20oc3RydWN0IGx3dHVubmVsX3N0YXRlICpsd3RzdGF0ZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgbXR1KQoreworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIGludCBsd3R1bm5lbF9lbmNhcF9hZGRfb3BzKGNvbnN0IHN0cnVjdCBsd3R1bm5lbF9lbmNhcF9vcHMgKm9wLAogCQkJCQkgdW5zaWduZWQgaW50IG51bSkKIHsKQEAgLTE3MCw2ICsyMDksMTEgQEAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGx3dHVubmVsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfTFdUVU5ORUwgKi8KIAogI2RlZmluZSBNT0RVTEVfQUxJQVNfUlROTF9MV1QoZW5jYXBfdHlwZSkgTU9EVUxFX0FMSUFTKCJydG5sLWx3dC0iIF9fc3RyaW5naWZ5KGVuY2FwX3R5cGUpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBiL2luY2x1ZGUvbmV0L21hYzgwMjExLmgKaW5kZXggYjRmYWFkYi4uYTgxMGRmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbWFjODAyMTEuaAorKysgYi9pbmNsdWRlL25ldC9tYWM4MDIxMS5oCkBAIC03MTUsNiArNzE1LDcgQEAKICAqCWZyYW1lIChQUy1Qb2xsIG9yIHVBUFNEKS4KICAqIEBJRUVFODAyMTFfVFhfQ1RSTF9SQVRFX0lOSkVDVDogVGhpcyBmcmFtZSBpcyBpbmplY3RlZCB3aXRoIHJhdGUgaW5mb3JtYXRpb24KICAqIEBJRUVFODAyMTFfVFhfQ1RSTF9BTVNEVTogVGhpcyBmcmFtZSBpcyBhbiBBLU1TRFUgZnJhbWUKKyAqIEBJRUVFODAyMTFfVFhfQ1RSTF9GQVNUX1hNSVQ6IFRoaXMgZnJhbWUgaXMgZ29pbmcgdGhyb3VnaCB0aGUgZmFzdF94bWl0IHBhdGgKICAqCiAgKiBUaGVzZSBmbGFncyBhcmUgdXNlZCBpbiB0eF9pbmZvLT5jb250cm9sLmZsYWdzLgogICovCkBAIC03MjMsNiArNzI0LDcgQEAKIAlJRUVFODAyMTFfVFhfQ1RSTF9QU19SRVNQT05TRQkJPSBCSVQoMSksCiAJSUVFRTgwMjExX1RYX0NUUkxfUkFURV9JTkpFQ1QJCT0gQklUKDIpLAogCUlFRUU4MDIxMV9UWF9DVFJMX0FNU0RVCQkJPSBCSVQoMyksCisJSUVFRTgwMjExX1RYX0NUUkxfRkFTVF9YTUlUCQk9IEJJVCg0KSwKIH07CiAKIC8qCkBAIC0xNzM1LDYgKzE3MzcsOSBAQAogICogQHN1cHBfcmF0ZXM6IEJpdG1hcCBvZiBzdXBwb3J0ZWQgcmF0ZXMgKHBlciBiYW5kKQogICogQGh0X2NhcDogSFQgY2FwYWJpbGl0aWVzIG9mIHRoaXMgU1RBOyByZXN0cmljdGVkIHRvIG91ciBvd24gY2FwYWJpbGl0aWVzCiAgKiBAdmh0X2NhcDogVkhUIGNhcGFiaWxpdGllcyBvZiB0aGlzIFNUQTsgcmVzdHJpY3RlZCB0byBvdXIgb3duIGNhcGFiaWxpdGllcworICogQG1heF9yeF9hZ2dyZWdhdGlvbl9zdWJmcmFtZXM6IG1heGltYWwgYW1vdW50IG9mIGZyYW1lcyBpbiBhIHNpbmdsZSBBTVBEVQorICoJdGhhdCB0aGlzIHN0YXRpb24gaXMgYWxsb3dlZCB0byB0cmFuc21pdCB0byB1cy4KKyAqCUNhbiBiZSBtb2RpZmllZCBieSBkcml2ZXIuCiAgKiBAd21lOiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgU1RBIHN1cHBvcnRzIFFvUy9XTUUgKGlmIGxvY2FsIGRldmljZXMgZG9lcywKICAqCW90aGVyd2lzZSBhbHdheXMgZmFsc2UpCiAgKiBAZHJ2X3ByaXY6IGRhdGEgYXJlYSBmb3IgZHJpdmVyIHVzZSwgd2lsbCBhbHdheXMgYmUgYWxpZ25lZCB0bwpAQCAtMTc3NSw2ICsxNzgwLDcgQEAKIAl1MTYgYWlkOwogCXN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCBodF9jYXA7CiAJc3RydWN0IGllZWU4MDIxMV9zdGFfdmh0X2NhcCB2aHRfY2FwOworCXU4IG1heF9yeF9hZ2dyZWdhdGlvbl9zdWJmcmFtZXM7CiAJYm9vbCB3bWU7CiAJdTggdWFwc2RfcXVldWVzOwogCXU4IG1heF9zcDsKQEAgLTIwMTQsNiArMjAyMCwxMSBAQAogICogQElFRUU4MDIxMV9IV19UWF9GUkFHX0xJU1Q6IEhhcmR3YXJlIChvciBkcml2ZXIpIHN1cHBvcnRzIHNlbmRpbmcgZnJhZ19saXN0CiAgKglza2JzLCBuZWVkZWQgZm9yIHplcm8tY29weSBzb2Z0d2FyZSBBLU1TRFUuCiAgKgorICogQElFRUU4MDIxMV9IV19SRVBPUlRTX0xPV19BQ0s6IFRoZSBkcml2ZXIgKG9yIGZpcm13YXJlKSByZXBvcnRzIGxvdyBhY2sgZXZlbnQKKyAqCWJ5IGllZWU4MDIxMV9yZXBvcnRfbG93X2FjaygpIGJhc2VkIG9uIGl0cyBvd24gYWxnb3JpdGhtLiBGb3Igc3VjaAorICoJZHJpdmVycywgbWFjODAyMTEgcGFja2V0IGxvc3MgbWVjaGFuaXNtIHdpbGwgbm90IGJlIHRyaWdnZXJlZCBhbmQgZHJpdmVyCisgKglpcyBjb21wbGV0ZWx5IGRlcGVuZGluZyBvbiBmaXJtd2FyZSBldmVudCBmb3Igc3RhdGlvbiBraWNrb3V0LgorICoKICAqIEBOVU1fSUVFRTgwMjExX0hXX0ZMQUdTOiBudW1iZXIgb2YgaGFyZHdhcmUgZmxhZ3MsIHVzZWQgZm9yIHNpemluZyBhcnJheXMKICAqLwogZW51bSBpZWVlODAyMTFfaHdfZmxhZ3MgewpAQCAtMjA1NCw2ICsyMDY1LDcgQEAKIAlJRUVFODAyMTFfSFdfVVNFU19SU1MsCiAJSUVFRTgwMjExX0hXX1RYX0FNU0RVLAogCUlFRUU4MDIxMV9IV19UWF9GUkFHX0xJU1QsCisJSUVFRTgwMjExX0hXX1JFUE9SVFNfTE9XX0FDSywKIAogCS8qIGtlZXAgbGFzdCwgb2J2aW91c2x5ICovCiAJTlVNX0lFRUU4MDIxMV9IV19GTEFHUwpAQCAtMjE0MSw2ICsyMTUzLDE0IEBACiAgKgl0aGUgZGVmYXVsdCBpcyBfR0kgfCBfQkFORFdJRFRILgogICoJVXNlIHRoZSAlSUVFRTgwMjExX1JBRElPVEFQX1ZIVF9LTk9XTl8qIHZhbHVlcy4KICAqCisgKiBAcmFkaW90YXBfdGltZXN0YW1wOiBJbmZvcm1hdGlvbiBmb3IgdGhlIHJhZGlvdGFwIHRpbWVzdGFtcCBmaWVsZDsgaWYgdGhlCisgKgkndW5pdHNfcG9zJyBtZW1iZXIgaXMgc2V0IHRvIGEgbm9uLW5lZ2F0aXZlIHZhbHVlIGl0IG11c3QgYmUgc2V0IHRvCisgKglhIGNvbWJpbmF0aW9uIG9mIGEgSUVFRTgwMjExX1JBRElPVEFQX1RJTUVTVEFNUF9VTklUXyogYW5kIGEKKyAqCUlFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfU1BPU18qIHZhbHVlLCBhbmQgdGhlbiB0aGUgdGltZXN0YW1wCisgKglmaWVsZCB3aWxsIGJlIGFkZGVkIGFuZCBwb3B1bGF0ZWQgZnJvbSB0aGUgJnN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzCisgKglkZXZpY2VfdGltZXN0YW1wLiBJZiB0aGUgJ2FjY3VyYWN5JyBtZW1iZXIgaXMgbm9uLW5lZ2F0aXZlLCBpdCdzIHB1dAorICoJaW50byB0aGUgYWNjdXJhY3kgcmFkaW90YXAgZmllbGQgYW5kIHRoZSBhY2N1cmFjeSBrbm93biBmbGFnIGlzIHNldC4KKyAqCiAgKiBAbmV0ZGV2X2ZlYXR1cmVzOiBuZXRkZXYgZmVhdHVyZXMgdG8gYmUgc2V0IGluIGVhY2ggbmV0ZGV2IGNyZWF0ZWQKICAqCWZyb20gdGhpcyBIVy4gTm90ZSB0aGF0IG5vdCBhbGwgZmVhdHVyZXMgYXJlIHVzYWJsZSB3aXRoIG1hYzgwMjExLAogICoJb3RoZXIgZmVhdHVyZXMgd2lsbCBiZSByZWplY3RlZCBkdXJpbmcgSFcgcmVnaXN0cmF0aW9uLgpAQCAtMjE1OSw2ICsyMTc5LDggQEAKICAqIEBuX2NpcGhlcl9zY2hlbWVzOiBhIHNpemUgb2YgYW4gYXJyYXkgb2YgY2lwaGVyIHNjaGVtZXMgZGVmaW5pdGlvbnMuCiAgKiBAY2lwaGVyX3NjaGVtZXM6IGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjaXBoZXIgc2NoZW1lIGRlZmluaXRpb25zCiAgKglzdXBwb3J0ZWQgYnkgSFcuCisgKiBAbWF4X25hbl9kZV9lbnRyaWVzOiBtYXhpbXVtIG51bWJlciBvZiBOQU4gREUgZnVuY3Rpb25zIHN1cHBvcnRlZCBieSB0aGUKKyAqCWRldmljZS4KICAqLwogc3RydWN0IGllZWU4MDIxMV9odyB7CiAJc3RydWN0IGllZWU4MDIxMV9jb25mIGNvbmY7CkBAIC0yMTg0LDExICsyMjA2LDE2IEBACiAJdTggb2ZmY2hhbm5lbF90eF9od19xdWV1ZTsKIAl1OCByYWRpb3RhcF9tY3NfZGV0YWlsczsKIAl1MTYgcmFkaW90YXBfdmh0X2RldGFpbHM7CisJc3RydWN0IHsKKwkJaW50IHVuaXRzX3BvczsKKwkJczE2IGFjY3VyYWN5OworCX0gcmFkaW90YXBfdGltZXN0YW1wOwogCW5ldGRldl9mZWF0dXJlc190IG5ldGRldl9mZWF0dXJlczsKIAl1OCB1YXBzZF9xdWV1ZXM7CiAJdTggdWFwc2RfbWF4X3NwX2xlbjsKIAl1OCBuX2NpcGhlcl9zY2hlbWVzOwogCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfY2lwaGVyX3NjaGVtZSAqY2lwaGVyX3NjaGVtZXM7CisJdTggbWF4X25hbl9kZV9lbnRyaWVzOwogfTsKIAogc3RhdGljIGlubGluZSBib29sIF9pZWVlODAyMTFfaHdfY2hlY2soc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCkBAIC0zMDg1LDExICszMTEyLDggQEAKICAqCiAgKiBAc3RhX2FkZF9kZWJ1Z2ZzOiBEcml2ZXJzIGNhbiB1c2UgdGhpcyBjYWxsYmFjayB0byBhZGQgZGVidWdmcyBmaWxlcwogICoJd2hlbiBhIHN0YXRpb24gaXMgYWRkZWQgdG8gbWFjODAyMTEncyBzdGF0aW9uIGxpc3QuIFRoaXMgY2FsbGJhY2sKLSAqCWFuZCBAc3RhX3JlbW92ZV9kZWJ1Z2ZzIHNob3VsZCBiZSB3aXRoaW4gYSBDT05GSUdfTUFDODAyMTFfREVCVUdGUwotICoJY29uZGl0aW9uYWwuIFRoaXMgY2FsbGJhY2sgY2FuIHNsZWVwLgotICoKLSAqIEBzdGFfcmVtb3ZlX2RlYnVnZnM6IFJlbW92ZSB0aGUgZGVidWdmcyBmaWxlcyB3aGljaCB3ZXJlIGFkZGVkIHVzaW5nCi0gKglAc3RhX2FkZF9kZWJ1Z2ZzLiBUaGlzIGNhbGxiYWNrIGNhbiBzbGVlcC4KKyAqCXNob3VsZCBiZSB3aXRoaW4gYSBDT05GSUdfTUFDODAyMTFfREVCVUdGUyBjb25kaXRpb25hbC4gVGhpcworICoJY2FsbGJhY2sgY2FuIHNsZWVwLgogICoKICAqIEBzdGFfbm90aWZ5OiBOb3RpZmllcyBsb3cgbGV2ZWwgZHJpdmVyIGFib3V0IHBvd2VyIHN0YXRlIHRyYW5zaXRpb24gb2YgYW4KICAqCWFzc29jaWF0ZWQgc3RhdGlvbiwgQVAsICBJQlNTL1dEUy9tZXNoIHBlZXIgZXRjLiBGb3IgYSBWSUYgb3BlcmF0aW5nCkBAIC0zMTQ3LDYgKzMxNzEsMTIgQEAKICAqCXJlcXVpcmVkIGZ1bmN0aW9uLgogICoJVGhlIGNhbGxiYWNrIGNhbiBzbGVlcC4KICAqCisgKiBAb2Zmc2V0X3RzZjogT2Zmc2V0IHRoZSBUU0YgdGltZXIgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiB0aGUKKyAqCWZpcm13YXJlL2hhcmR3YXJlLiAgUHJlZmVycmVkIHRvIHNldF90c2YgYXMgaXQgYXZvaWRzIGRlbGF5IGJldHdlZW4KKyAqCWNhbGxpbmcgc2V0X3RzZigpIGFuZCBoYXJkd2FyZSBnZXR0aW5nIHByb2dyYW1tZWQsIHdoaWNoIHdpbGwgc2hvdyB1cAorICoJYXMgVFNGIGRlbGF5LiBJcyBub3QgYSByZXF1aXJlZCBmdW5jdGlvbi4KKyAqCVRoZSBjYWxsYmFjayBjYW4gc2xlZXAuCisgKgogICogQHJlc2V0X3RzZjogUmVzZXQgdGhlIFRTRiB0aW1lciBhbmQgYWxsb3cgZmlybXdhcmUvaGFyZHdhcmUgdG8gc3luY2hyb25pemUKICAqCXdpdGggb3RoZXIgU1RBcyBpbiB0aGUgSUJTUy4gVGhpcyBpcyBvbmx5IHVzZWQgaW4gSUJTUyBtb2RlLiBUaGlzCiAgKglmdW5jdGlvbiBpcyBvcHRpb25hbCBpZiB0aGUgZmlybXdhcmUvaGFyZHdhcmUgdGFrZXMgZnVsbCBjYXJlIG9mCkBAIC0zNDAxLDYgKzM0MzEsMjEgQEAKICAqCXN5bmNocm9uaXphdGlvbiB3aGljaCBpcyBuZWVkZWQgaW4gY2FzZSBkcml2ZXIgaGFzIGluIGl0cyBSU1MgcXVldWVzCiAgKglwZW5kaW5nIGZyYW1lcyB0aGF0IHdlcmUgcmVjZWl2ZWQgcHJpb3IgdG8gdGhlIGNvbnRyb2wgcGF0aCBhY3Rpb24KICAqCWN1cnJlbnRseSB0YWtlbiAoZS5nLiBkaXNhc3NvY2lhdGlvbikgYnV0IGFyZSBub3QgcHJvY2Vzc2VkIHlldC4KKyAqCisgKiBAc3RhcnRfbmFuOiBqb2luIGFuIGV4aXN0aW5nIE5BTiBjbHVzdGVyLCBvciBjcmVhdGUgYSBuZXcgb25lLgorICogQHN0b3BfbmFuOiBsZWF2ZSB0aGUgTkFOIGNsdXN0ZXIuCisgKiBAbmFuX2NoYW5nZV9jb25mOiBjaGFuZ2UgTkFOIGNvbmZpZ3VyYXRpb24uIFRoZSBkYXRhIGluIGNmZzgwMjExX25hbl9jb25mCisgKgljb250YWlucyBmdWxsIG5ldyBjb25maWd1cmF0aW9uIGFuZCBjaGFuZ2VzIHNwZWNpZnkgd2hpY2ggcGFyYW1ldGVycworICoJYXJlIGNoYW5nZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBsYXN0IE5BTiBjb25maWcuCisgKglUaGUgZHJpdmVyIGdldHMgYm90aCBmdWxsIGNvbmZpZ3VyYXRpb24gYW5kIHRoZSBjaGFuZ2VkIHBhcmFtZXRlcnMgc2luY2UKKyAqCXNvbWUgZGV2aWNlcyBtYXkgbmVlZCB0aGUgZnVsbCBjb25maWd1cmF0aW9uIHdoaWxlIG90aGVycyBuZWVkIG9ubHkgdGhlCisgKgljaGFuZ2VkIHBhcmFtZXRlcnMuCisgKiBAYWRkX25hbl9mdW5jOiBBZGQgYSBOQU4gZnVuY3Rpb24uIFJldHVybnMgMCBvbiBzdWNjZXNzLiBUaGUgZGF0YSBpbgorICoJY2ZnODAyMTFfbmFuX2Z1bmMgbXVzdCBub3QgYmUgcmVmZXJlbmNlZCBvdXRzaWRlIHRoZSBzY29wZSBvZgorICoJdGhpcyBjYWxsLgorICogQGRlbF9uYW5fZnVuYzogUmVtb3ZlIGEgTkFOIGZ1bmN0aW9uLiBUaGUgZHJpdmVyIG11c3QgY2FsbAorICoJaWVlZTgwMjExX25hbl9mdW5jX3Rlcm1pbmF0ZWQoKSB3aXRoCisgKglOTDgwMjExX05BTl9GVU5DX1RFUk1fUkVBU09OX1VTRVJfUkVRVUVTVCByZWFzb24gY29kZSB1cG9uIHJlbW92YWwuCiAgKi8KIHN0cnVjdCBpZWVlODAyMTFfb3BzIHsKIAl2b2lkICgqdHgpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LApAQCAtMzQ4NSwxMCArMzUzMCw2IEBACiAJCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAogCQkJCXN0cnVjdCBkZW50cnkgKmRpcik7Ci0Jdm9pZCAoKnN0YV9yZW1vdmVfZGVidWdmcykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJCSAgIHN0cnVjdCBkZW50cnkgKmRpcik7CiAjZW5kaWYKIAl2b2lkICgqc3RhX25vdGlmeSkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQllbnVtIHN0YV9ub3RpZnlfY21kLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKQEAgLTM1MTYsNiArMzU1Nyw4IEBACiAJdTY0ICgqZ2V0X3RzZikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwogCXZvaWQgKCpzZXRfdHNmKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCXU2NCB0c2YpOworCXZvaWQgKCpvZmZzZXRfdHNmKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgIHM2NCBvZmZzZXQpOwogCXZvaWQgKCpyZXNldF90c2YpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKIAlpbnQgKCp0eF9sYXN0X2JlYWNvbikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogCWludCAoKmFtcGR1X2FjdGlvbikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCkBAIC0zNjIwLDcgKzM2NjMsOCBAQAogCiAJaW50ICgqam9pbl9pYnNzKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CiAJdm9pZCAoKmxlYXZlX2lic3MpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKLQl1MzIgKCpnZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dCkoc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7CisJdTMyICgqZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKIAlpbnQgKCpnZXRfdHhwb3dlcikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkgICBpbnQgKmRibSk7CiAKQEAgLTM2MzksNiArMzY4MywyMSBAQAogCXZvaWQgKCp3YWtlX3R4X3F1ZXVlKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhxICp0eHEpOwogCXZvaWQgKCpzeW5jX3J4X3F1ZXVlcykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCisJaW50ICgqc3RhcnRfbmFuKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJIHN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiAqY29uZik7CisJaW50ICgqc3RvcF9uYW4pKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CisJaW50ICgqbmFuX2NoYW5nZV9jb25mKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiAqY29uZiwgdTMyIGNoYW5nZXMpOworCWludCAoKmFkZF9uYW5fZnVuYykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgKm5hbl9mdW5jKTsKKwl2b2lkICgqZGVsX25hbl9mdW5jKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgIHU4IGluc3RhbmNlX2lkKTsKIH07CiAKIC8qKgpAQCAtNTcxMiw0ICs1NzcxLDM2IEBACiB2b2lkIGllZWU4MDIxMV90eHFfZ2V0X2RlcHRoKHN0cnVjdCBpZWVlODAyMTFfdHhxICp0eHEsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgKmZyYW1lX2NudCwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyAqYnl0ZV9jbnQpOworCisvKioKKyAqIGllZWU4MDIxMV9uYW5fZnVuY190ZXJtaW5hdGVkIC0gbm90aWZ5IGFib3V0IE5BTiBmdW5jdGlvbiB0ZXJtaW5hdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbm90aWZ5IG1hYzgwMjExIGFib3V0IE5BTiBmdW5jdGlvbiB0ZXJtaW5hdGlvbi4KKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbid0IGJlIGNhbGxlZCBmcm9tIGhhcmQgaXJxLgorICoKKyAqIEB2aWY6ICZzdHJ1Y3QgaWVlZTgwMjExX3ZpZiBwb2ludGVyIGZyb20gdGhlIGFkZF9pbnRlcmZhY2UgY2FsbGJhY2suCisgKiBAaW5zdF9pZDogdGhlIGxvY2FsIGluc3RhbmNlIGlkCisgKiBAcmVhc29uOiB0ZXJtaW5hdGlvbiByZWFzb24gKG9uZSBvZiB0aGUgTkw4MDIxMV9OQU5fRlVOQ19URVJNX1JFQVNPTl8qKQorICogQGdmcDogYWxsb2NhdGlvbiBmbGFncworICovCit2b2lkIGllZWU4MDIxMV9uYW5fZnVuY190ZXJtaW5hdGVkKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICAgdTggaW5zdF9pZCwKKwkJCQkgICBlbnVtIG5sODAyMTFfbmFuX2Z1bmNfdGVybV9yZWFzb24gcmVhc29uLAorCQkJCSAgIGdmcF90IGdmcCk7CisKKy8qKgorICogaWVlZTgwMjExX25hbl9mdW5jX21hdGNoIC0gbm90aWZ5IGFib3V0IE5BTiBmdW5jdGlvbiBtYXRjaCBldmVudC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbm90aWZ5IG1hYzgwMjExIGFib3V0IE5BTiBmdW5jdGlvbiBtYXRjaC4gVGhlCisgKiBjb29raWUgaW5zaWRlIHRoZSBtYXRjaCBzdHJ1Y3Qgd2lsbCBiZSBhc3NpZ25lZCBieSBtYWM4MDIxMS4KKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbid0IGJlIGNhbGxlZCBmcm9tIGhhcmQgaXJxLgorICoKKyAqIEB2aWY6ICZzdHJ1Y3QgaWVlZTgwMjExX3ZpZiBwb2ludGVyIGZyb20gdGhlIGFkZF9pbnRlcmZhY2UgY2FsbGJhY2suCisgKiBAbWF0Y2g6IG1hdGNoIGV2ZW50IGluZm9ybWF0aW9uCisgKiBAZ2ZwOiBhbGxvY2F0aW9uIGZsYWdzCisgKi8KK3ZvaWQgaWVlZTgwMjExX25hbl9mdW5jX21hdGNoKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgICBzdHJ1Y3QgY2ZnODAyMTFfbmFuX21hdGNoX3BhcmFtcyAqbWF0Y2gsCisJCQkgICAgICBnZnBfdCBnZnApOworCiAjZW5kaWYgLyogTUFDODAyMTFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbXBscy5oIGIvaW5jbHVkZS9uZXQvbXBscy5oCmluZGV4IDViM2I1YWQuLjFkYmM2NjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L21wbHMuaAorKysgYi9pbmNsdWRlL25ldC9tcGxzLmgKQEAgLTE5LDIxICsxOSwxOCBAQAogCiAjZGVmaW5lIE1QTFNfSExFTiA0CiAKK3N0cnVjdCBtcGxzX3NoaW1faGRyIHsKKwlfX2JlMzIgbGFiZWxfc3RhY2tfZW50cnk7Cit9OworCiBzdGF0aWMgaW5saW5lIGJvb2wgZXRoX3BfbXBscyhfX2JlMTYgZXRoX3R5cGUpCiB7CiAJcmV0dXJuIGV0aF90eXBlID09IGh0b25zKEVUSF9QX01QTFNfVUMpIHx8CiAJCWV0aF90eXBlID09IGh0b25zKEVUSF9QX01QTFNfTUMpOwogfQogCi0vKgotICogRm9yIG5vbi1NUExTIHNrYnMgdGhpcyB3aWxsIGNvcnJlc3BvbmQgdG8gdGhlIG5ldHdvcmsgaGVhZGVyLgotICogRm9yIE1QTFMgc2ticyBpdCB3aWxsIGJlIGJlZm9yZSB0aGUgbmV0d29ya19oZWFkZXIgYXMgdGhlIE1QTFMKLSAqIGxhYmVsIHN0YWNrIGxpZXMgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSBtYWMgaGVhZGVyIGFuZCB0aGUgbmV0d29yawotICogaGVhZGVyLiBUaGF0IGlzLCBmb3IgTVBMUyBza2JzIHRoZSBlbmQgb2YgdGhlIG1hYyBoZWFkZXIKLSAqIGlzIHRoZSB0b3Agb2YgdGhlIE1QTFMgbGFiZWwgc3RhY2suCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqc2tiX21wbHNfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtcGxzX3NoaW1faGRyICptcGxzX2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiBza2JfbWFjX2hlYWRlcihza2IpICsgc2tiLT5tYWNfbGVuOworCXJldHVybiAoc3RydWN0IG1wbHNfc2hpbV9oZHIgKilza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmNzaS5oIGIvaW5jbHVkZS9uZXQvbmNzaS5oCmluZGV4IDFkYmY0MmYuLjY4NjgwYmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25jc2kuaAorKysgYi9pbmNsdWRlL25ldC9uY3NpLmgKQEAgLTMxLDYgKzMxLDcgQEAKIHN0cnVjdCBuY3NpX2RldiAqbmNzaV9yZWdpc3Rlcl9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICB2b2lkICgqbm90aWZpZXIpKHN0cnVjdCBuY3NpX2RldiAqbmQpKTsKIGludCBuY3NpX3N0YXJ0X2RldihzdHJ1Y3QgbmNzaV9kZXYgKm5kKTsKK3ZvaWQgbmNzaV9zdG9wX2RldihzdHJ1Y3QgbmNzaV9kZXYgKm5kKTsKIHZvaWQgbmNzaV91bnJlZ2lzdGVyX2RldihzdHJ1Y3QgbmNzaV9kZXYgKm5kKTsKICNlbHNlIC8qICFDT05GSUdfTkVUX05DU0kgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5jc2lfZGV2ICpuY3NpX3JlZ2lzdGVyX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtNDQsNiArNDUsMTAgQEAKIAlyZXR1cm4gLUVOT1RUWTsKIH0KIAorc3RhdGljIHZvaWQgbmNzaV9zdG9wX2RldihzdHJ1Y3QgbmNzaV9kZXYgKm5kKQoreworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgbmNzaV91bnJlZ2lzdGVyX2RldihzdHJ1Y3QgbmNzaV9kZXYgKm5kKQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2JyX25ldGZpbHRlci5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2JyX25ldGZpbHRlci5oCmluZGV4IGU4ZDE0NDguLjBiMGMzNWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9icl9uZXRmaWx0ZXIuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvYnJfbmV0ZmlsdGVyLmgKQEAgLTE1LDYgKzE1LDEyIEBACiAKIHZvaWQgbmZfYnJpZGdlX3VwZGF0ZV9wcm90b2NvbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAoraW50IGJyX25mX2hvb2tfdGhyZXNoKHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrICpzaywKKwkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2LAorCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LAorCQkgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3QgbmV0ICosIHN0cnVjdCBzb2NrICosCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqKSk7CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2JyaWRnZV9pbmZvICoKIG5mX2JyaWRnZV9pbmZvX2dldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCmluZGV4IDQ0NWIwMTkuLjUwNDE4MDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKQEAgLTQyLDcgKzQyLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KIAogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKICNkZWZpbmUgTkZfQ1RfQVNTRVJUKHgpCQlXQVJOX09OKCEoeCkpCkBAIC03Myw3ICs3Miw3IEBACiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9pcHY2L25mX2Nvbm50cmFja19pcHY2Lmg+CiAKIHN0cnVjdCBuZl9jb25uIHsKLQkvKiBVc2FnZSBjb3VudCBpbiBoZXJlIGlzIDEgZm9yIGhhc2ggdGFibGUvZGVzdHJ1Y3QgdGltZXIsIDEgcGVyIHNrYiwKKwkvKiBVc2FnZSBjb3VudCBpbiBoZXJlIGlzIDEgZm9yIGhhc2ggdGFibGUsIDEgcGVyIHNrYiwKIAkgKiBwbHVzIDEgZm9yIGFueSBjb25uZWN0aW9uKHMpIHdlIGFyZSBgbWFzdGVyJyBmb3IKIAkgKgogCSAqIEhpbnQsIFNLQiBhZGRyZXNzIHRoaXMgc3RydWN0IGFuZCByZWZjbnQgdmlhIHNrYi0+bmZjdCBhbmQKQEAgLTk2LDggKzk1LDggQEAKIAkvKiBIYXZlIHdlIHNlZW4gdHJhZmZpYyBib3RoIHdheXMgeWV0PyAoYml0c2V0KSAqLwogCXVuc2lnbmVkIGxvbmcgc3RhdHVzOwogCi0JLyogVGltZXIgZnVuY3Rpb247IGRyb3BzIHJlZmNudCB3aGVuIGl0IGdvZXMgb2ZmLiAqLwotCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVvdXQ7CisJLyogamlmZmllczMyIHdoZW4gdGhpcyBjdCBpcyBjb25zaWRlcmVkIGRlYWQgKi8KKwl1MzIgdGltZW91dDsKIAogCXBvc3NpYmxlX25ldF90IGN0X25ldDsKIApAQCAtMjIwLDIxICsyMTksMTQgQEAKIAlfX25mX2N0X3JlZnJlc2hfYWNjdChjdCwgMCwgc2tiLCBleHRyYV9qaWZmaWVzLCAwKTsKIH0KIAotYm9vbCBfX25mX2N0X2tpbGxfYWNjdChzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGRvX2FjY3QpOwotCiAvKiBraWxsIGNvbm50cmFjayBhbmQgZG8gYWNjb3VudGluZyAqLwotc3RhdGljIGlubGluZSBib29sIG5mX2N0X2tpbGxfYWNjdChzdHJ1Y3QgbmZfY29ubiAqY3QsCi0JCQkJICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gX19uZl9jdF9raWxsX2FjY3QoY3QsIGN0aW5mbywgc2tiLCAxKTsKLX0KK2Jvb2wgbmZfY3Rfa2lsbF9hY2N0KHN0cnVjdCBuZl9jb25uICpjdCwgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIC8qIGtpbGwgY29ubnRyYWNrIHdpdGhvdXQgYWNjb3VudGluZyAqLwogc3RhdGljIGlubGluZSBib29sIG5mX2N0X2tpbGwoc3RydWN0IG5mX2Nvbm4gKmN0KQogewotCXJldHVybiBfX25mX2N0X2tpbGxfYWNjdChjdCwgMCwgTlVMTCwgMCk7CisJcmV0dXJuIG5mX2N0X2RlbGV0ZShjdCwgMCwgMCk7CiB9CiAKIC8qIFRoZXNlIGFyZSBmb3IgTkFULiAgSWNreS4gKi8KQEAgLTI5MSwyMSArMjgzLDU1IEBACiAJcmV0dXJuIHNrYi0+ZGV2ICYmIHNrYi0+c2tiX2lpZiAmJiBza2ItPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0s7CiB9CiAKKyNkZWZpbmUgbmZjdF90aW1lX3N0YW1wICgodTMyKShqaWZmaWVzKSkKKwogLyogamlmZmllcyB1bnRpbCBjdCBleHBpcmVzLCAwIGlmIGFscmVhZHkgZXhwaXJlZCAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5mX2N0X2V4cGlyZXMoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQogewotCWxvbmcgdGltZW91dCA9IChsb25nKWN0LT50aW1lb3V0LmV4cGlyZXMgLSAobG9uZylqaWZmaWVzOworCXMzMiB0aW1lb3V0ID0gY3QtPnRpbWVvdXQgLSBuZmN0X3RpbWVfc3RhbXA7CiAKIAlyZXR1cm4gdGltZW91dCA+IDAgPyB0aW1lb3V0IDogMDsKIH0KIAorc3RhdGljIGlubGluZSBib29sIG5mX2N0X2lzX2V4cGlyZWQoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQoreworCXJldHVybiAoX19zMzIpKGN0LT50aW1lb3V0IC0gbmZjdF90aW1lX3N0YW1wKSA8PSAwOworfQorCisvKiB1c2UgYWZ0ZXIgb2J0YWluaW5nIGEgcmVmZXJlbmNlIGNvdW50ICovCitzdGF0aWMgaW5saW5lIGJvb2wgbmZfY3Rfc2hvdWxkX2djKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKK3sKKwlyZXR1cm4gbmZfY3RfaXNfZXhwaXJlZChjdCkgJiYgbmZfY3RfaXNfY29uZmlybWVkKGN0KSAmJgorCSAgICAgICAhbmZfY3RfaXNfZHlpbmcoY3QpOworfQorCiBzdHJ1Y3Qga2VybmVsX3BhcmFtOwogCiBpbnQgbmZfY29ubnRyYWNrX3NldF9oYXNoc2l6ZShjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKTsKIGludCBuZl9jb25udHJhY2tfaGFzaF9yZXNpemUodW5zaWduZWQgaW50IGhhc2hzaXplKTsKKworZXh0ZXJuIHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpuZl9jb25udHJhY2tfaGFzaDsKIGV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOworZXh0ZXJuIHNlcWNvdW50X3QgbmZfY29ubnRyYWNrX2dlbmVyYXRpb247CiBleHRlcm4gdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19tYXg7CiAKKy8qIG11c3QgYmUgY2FsbGVkIHdpdGggcmN1IHJlYWQgbG9jayBoZWxkICovCitzdGF0aWMgaW5saW5lIHZvaWQKK25mX2Nvbm50cmFja19nZXRfaHQoc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKipoYXNoLCB1bnNpZ25lZCBpbnQgKmhzaXplKQoreworCXN0cnVjdCBobGlzdF9udWxsc19oZWFkICpocHRyOworCXVuc2lnbmVkIGludCBzZXF1ZW5jZSwgaHN6OworCisJZG8geworCQlzZXF1ZW5jZSA9IHJlYWRfc2VxY291bnRfYmVnaW4oJm5mX2Nvbm50cmFja19nZW5lcmF0aW9uKTsKKwkJaHN6ID0gbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOworCQlocHRyID0gbmZfY29ubnRyYWNrX2hhc2g7CisJfSB3aGlsZSAocmVhZF9zZXFjb3VudF9yZXRyeSgmbmZfY29ubnRyYWNrX2dlbmVyYXRpb24sIHNlcXVlbmNlKSk7CisKKwkqaGFzaCA9IGhwdHI7CisJKmhzaXplID0gaHN6OworfQorCiBzdHJ1Y3QgbmZfY29ubiAqbmZfY3RfdG1wbF9hbGxvYyhzdHJ1Y3QgbmV0ICpuZXQsCiAJCQkJIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfem9uZSAqem9uZSwKIAkJCQkgZ2ZwX3QgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaAppbmRleCA3OWQ3YWM1Li42MmUxN2QxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaApAQCAtNTEsOCArNTEsNiBAQAogCQkJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvLAogCQkJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvKTsKIAotdm9pZCBuZl9jb25udHJhY2tfZ2V0X2h0KHN0cnVjdCBobGlzdF9udWxsc19oZWFkICoqaGFzaCwgdW5zaWduZWQgaW50ICpoc2l6ZSk7Ci0KIC8qIEZpbmQgYSBjb25uZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSB0dXBsZS4gKi8KIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqCiBuZl9jb25udHJhY2tfZmluZF9nZXQoc3RydWN0IG5ldCAqbmV0LApAQCAtODMsNyArODEsNiBAQAogCiAjZGVmaW5lIENPTk5UUkFDS19MT0NLUyAxMDI0CiAKLWV4dGVybiBzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqbmZfY29ubnRyYWNrX2hhc2g7CiBleHRlcm4gc3BpbmxvY2tfdCBuZl9jb25udHJhY2tfbG9ja3NbQ09OTlRSQUNLX0xPQ0tTXTsKIHZvaWQgbmZfY29ubnRyYWNrX2xvY2soc3BpbmxvY2tfdCAqbG9jayk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oCmluZGV4IGZhMzY0NDcuLjEyZDk2N2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuaApAQCAtMTIsMTIgKzEyLDE5IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZV9jb21tb24uaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuaD4KIAorZW51bSBuZl9jdF9lY2FjaGVfc3RhdGUgeworCU5GQ1RfRUNBQ0hFX1VOS05PV04sCQkvKiBkZXN0cm95IGV2ZW50IG5vdCBzZW50ICovCisJTkZDVF9FQ0FDSEVfREVTVFJPWV9GQUlMLAkvKiB0cmllZCBidXQgZmFpbGVkIHRvIHNlbmQgZGVzdHJveSBldmVudCAqLworCU5GQ1RfRUNBQ0hFX0RFU1RST1lfU0VOVCwJLyogc2VudCBkZXN0cm95IGV2ZW50IGFmdGVyIGZhaWx1cmUgKi8KK307CisKIHN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlIHsKLQl1bnNpZ25lZCBsb25nIGNhY2hlOwkvKiBiaXRvcHMgd2FudCBsb25nICovCi0JdW5zaWduZWQgbG9uZyBtaXNzZWQ7CS8qIG1pc3NlZCBldmVudHMgKi8KLQl1MTYgY3RtYXNrOwkJLyogYml0bWFzayBvZiBjdCBldmVudHMgdG8gYmUgZGVsaXZlcmVkICovCi0JdTE2IGV4cG1hc2s7CQkvKiBiaXRtYXNrIG9mIGV4cGVjdCBldmVudHMgdG8gYmUgZGVsaXZlcmVkICovCi0JdTMyIHBvcnRpZDsJCS8qIG5ldGxpbmsgcG9ydGlkIG9mIGRlc3Ryb3llciAqLworCXVuc2lnbmVkIGxvbmcgY2FjaGU7CQkvKiBiaXRvcHMgd2FudCBsb25nICovCisJdW5zaWduZWQgbG9uZyBtaXNzZWQ7CQkvKiBtaXNzZWQgZXZlbnRzICovCisJdTE2IGN0bWFzazsJCQkvKiBiaXRtYXNrIG9mIGN0IGV2ZW50cyB0byBiZSBkZWxpdmVyZWQgKi8KKwl1MTYgZXhwbWFzazsJCQkvKiBiaXRtYXNrIG9mIGV4cGVjdCBldmVudHMgdG8gYmUgZGVsaXZlcmVkICovCisJdTMyIHBvcnRpZDsJCQkvKiBuZXRsaW5rIHBvcnRpZCBvZiBkZXN0cm95ZXIgKi8KKwllbnVtIG5mX2N0X2VjYWNoZV9zdGF0ZSBzdGF0ZTsJLyogZWNhY2hlIHN0YXRlICovCiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvLmgKaW5kZXggY2RjOTIwYi4uODk5MmU0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvLmgKQEAgLTYzLDEwICs2Myw2IEBACiAKIAlzaXplX3QgbmxhX3NpemU7CiAKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0JY29uc3QgY2hhcgkJKmN0bF90YWJsZV9wYXRoOwotI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KLQogCS8qIEluaXQgbDNwcm90byBwZXJuZXQgZGF0YSAqLwogCWludCAoKmluaXRfbmV0KShzdHJ1Y3QgbmV0ICpuZXQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oCmluZGV4IDFhNWZiMzYuLmRlNjI5ZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oCkBAIC0xMzQsMTQgKzEzNCw2IEBACiBpbnQgbmZfY3RfbDRwcm90b19yZWdpc3RlcihzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKnByb3RvKTsKIHZvaWQgbmZfY3RfbDRwcm90b191bnJlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqcHJvdG8pOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgbmZfY3Rfa2ZyZWVfY29tcGF0X3N5c2N0bF90YWJsZShzdHJ1Y3QgbmZfcHJvdG9fbmV0ICpwbikKLXsKLSNpZiBkZWZpbmVkKENPTkZJR19TWVNDVEwpICYmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCkKLQlrZnJlZShwbi0+Y3RsX2NvbXBhdF90YWJsZSk7Ci0JcG4tPmN0bF9jb21wYXRfdGFibGUgPSBOVUxMOwotI2VuZGlmCi19Ci0KIC8qIEdlbmVyaWMgbmV0bGluayBoZWxwZXJzICovCiBpbnQgbmZfY3RfcG9ydF90dXBsZV90b19ubGF0dHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N5bnByb3h5LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N5bnByb3h5LmgKaW5kZXggNjc5MzYxNC4uZTY5MzczMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zeW5wcm94eS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3lucHJveHkuaApAQCAtMjcsNiArMjcsMjAgQEAKICNlbmRpZgogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgbmZfY3RfYWRkX3N5bnByb3h5KHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqdG1wbCkKK3sKKwlpZiAodG1wbCAmJiBuZmN0X3N5bnByb3h5KHRtcGwpKSB7CisJCWlmICghbmZjdF9zZXFhZGpfZXh0X2FkZChjdCkpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJaWYgKCFuZmN0X3N5bnByb3h5X2V4dF9hZGQoY3QpKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCiBzdHJ1Y3Qgc3lucHJveHlfc3RhdHMgewogCXVuc2lnbmVkIGludAkJCXN5bl9yZWNlaXZlZDsKIAl1bnNpZ25lZCBpbnQJCQljb29raWVfaW52YWxpZDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9sb2cuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9sb2cuaAppbmRleCA4M2Q4NTViLi4zMDljZDI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbG9nLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2xvZy5oCkBAIC0yLDE1ICsyLDEwIEBACiAjZGVmaW5lIF9ORl9MT0dfSAogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2xvZy5oPgogCi0vKiB0aG9zZSBORl9MT0dfKiBkZWZpbmVzIGFuZCBzdHJ1Y3QgbmZfbG9naW5mbyBhcmUgbGVnYWN5IGRlZmluaXRpb3MgdGhhdCB3aWxsCi0gKiBkaXNhcHBlYXIgb25jZSBpcHRhYmxlcyBpcyByZXBsYWNlZCB3aXRoIHBrdHRhYmxlcy4gIFBsZWFzZSBETyBOT1QgdXNlIHRoZW0KLSAqIGZvciBhbnkgbmV3IGNvZGUhICovCi0jZGVmaW5lIE5GX0xPR19UQ1BTRVEJCTB4MDEJLyogTG9nIFRDUCBzZXF1ZW5jZSBudW1iZXJzICovCi0jZGVmaW5lIE5GX0xPR19UQ1BPUFQJCTB4MDIJLyogTG9nIFRDUCBvcHRpb25zICovCi0jZGVmaW5lIE5GX0xPR19JUE9QVAkJMHgwNAkvKiBMb2cgSVAgb3B0aW9ucyAqLwotI2RlZmluZSBORl9MT0dfVUlECQkweDA4CS8qIExvZyBVSUQgb3duaW5nIGxvY2FsIHNvY2tldCAqLwotI2RlZmluZSBORl9MT0dfTUFTSwkJMHgwZgorLyogTG9nIHRjcCBzZXF1ZW5jZSwgdGNwIG9wdGlvbnMsIGlwIG9wdGlvbnMgYW5kIHVpZCBvd25pbmcgbG9jYWwgc29ja2V0ICovCisjZGVmaW5lIE5GX0xPR19ERUZBVUxUX01BU0sJMHgwZgogCiAvKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgY29weV9sZW4gZmllbGQgaW4gbmZfbG9naW5mbyBpcyBzZXQgKi8KICNkZWZpbmUgTkZfTE9HX0ZfQ09QWV9MRU4JMHgxCkBAIC02MCw4ICs1NSw3IEBACiBpbnQgbmZfbG9nX3JlZ2lzdGVyKHVfaW50OF90IHBmLCBzdHJ1Y3QgbmZfbG9nZ2VyICpsb2dnZXIpOwogdm9pZCBuZl9sb2dfdW5yZWdpc3RlcihzdHJ1Y3QgbmZfbG9nZ2VyICpsb2dnZXIpOwogCi12b2lkIG5mX2xvZ19zZXQoc3RydWN0IG5ldCAqbmV0LCB1X2ludDhfdCBwZiwKLQkJY29uc3Qgc3RydWN0IG5mX2xvZ2dlciAqbG9nZ2VyKTsKK2ludCBuZl9sb2dfc2V0KHN0cnVjdCBuZXQgKm5ldCwgdV9pbnQ4X3QgcGYsIGNvbnN0IHN0cnVjdCBuZl9sb2dnZXIgKmxvZ2dlcik7CiB2b2lkIG5mX2xvZ191bnNldChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZl9sb2dnZXIgKmxvZ2dlcik7CiAKIGludCBuZl9sb2dfYmluZF9wZihzdHJ1Y3QgbmV0ICpuZXQsIHVfaW50OF90IHBmLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3F1ZXVlLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfcXVldWUuaAppbmRleCAwZGJjZTU1Li4yMjgwY2ZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfcXVldWUuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfcXVldWUuaApAQCAtMTEsNyArMTEsNiBAQAogCXN0cnVjdCBza19idWZmCQkqc2tiOwogCXVuc2lnbmVkIGludAkJaWQ7CiAKLQlzdHJ1Y3QgbmZfaG9va19vcHMJKmVsZW07CiAJc3RydWN0IG5mX2hvb2tfc3RhdGUJc3RhdGU7CiAJdTE2CQkJc2l6ZTsgLyogc2l6ZW9mKGVudHJ5KSArIHNhdmVkIHJvdXRlIGtleXMgKi8KIApAQCAtMjIsMTAgKzIxLDEwIEBACiAKIC8qIFBhY2tldCBxdWV1aW5nICovCiBzdHJ1Y3QgbmZfcXVldWVfaGFuZGxlciB7Ci0JaW50CQkJKCpvdXRmbikoc3RydWN0IG5mX3F1ZXVlX2VudHJ5ICplbnRyeSwKLQkJCQkJIHVuc2lnbmVkIGludCBxdWV1ZW51bSk7Ci0Jdm9pZAkJCSgqbmZfaG9va19kcm9wKShzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJCQlzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcyk7CisJaW50CQkoKm91dGZuKShzdHJ1Y3QgbmZfcXVldWVfZW50cnkgKmVudHJ5LAorCQkJCSB1bnNpZ25lZCBpbnQgcXVldWVudW0pOworCXZvaWQJCSgqbmZfaG9va19kcm9wKShzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJCWNvbnN0IHN0cnVjdCBuZl9ob29rX2VudHJ5ICpob29rcyk7CiB9OwogCiB2b2lkIG5mX3JlZ2lzdGVyX3F1ZXVlX2hhbmRsZXIoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZfcXVldWVfaGFuZGxlciAqcWgpOwpAQCAtNDEsMjMgKzQwLDE5IEBACiAJCSpqaGFzaF9pbml0dmFsID0gcHJhbmRvbV91MzIoKTsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgaGFzaF92NChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgamhhc2hfaW5pdHZhbCkKK3N0YXRpYyBpbmxpbmUgdTMyIGhhc2hfdjQoY29uc3Qgc3RydWN0IGlwaGRyICppcGgsIHUzMiBpbml0dmFsKQogewotCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7Ci0KIAkvKiBwYWNrZXRzIGluIGVpdGhlciBkaXJlY3Rpb24gZ28gaW50byBzYW1lIHF1ZXVlICovCiAJaWYgKChfX2ZvcmNlIHUzMilpcGgtPnNhZGRyIDwgKF9fZm9yY2UgdTMyKWlwaC0+ZGFkZHIpCiAJCXJldHVybiBqaGFzaF8zd29yZHMoKF9fZm9yY2UgdTMyKWlwaC0+c2FkZHIsCi0JCQkoX19mb3JjZSB1MzIpaXBoLT5kYWRkciwgaXBoLT5wcm90b2NvbCwgamhhc2hfaW5pdHZhbCk7CisJCQkoX19mb3JjZSB1MzIpaXBoLT5kYWRkciwgaXBoLT5wcm90b2NvbCwgaW5pdHZhbCk7CiAKIAlyZXR1cm4gamhhc2hfM3dvcmRzKChfX2ZvcmNlIHUzMilpcGgtPmRhZGRyLAotCQkJKF9fZm9yY2UgdTMyKWlwaC0+c2FkZHIsIGlwaC0+cHJvdG9jb2wsIGpoYXNoX2luaXR2YWwpOworCQkJKF9fZm9yY2UgdTMyKWlwaC0+c2FkZHIsIGlwaC0+cHJvdG9jb2wsIGluaXR2YWwpOwogfQogCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSVA2X05GX0lQVEFCTEVTKQotc3RhdGljIGlubGluZSB1MzIgaGFzaF92Nihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgamhhc2hfaW5pdHZhbCkKK3N0YXRpYyBpbmxpbmUgdTMyIGhhc2hfdjYoY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwNmgsIHUzMiBpbml0dmFsKQogewotCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcDZoID0gaXB2Nl9oZHIoc2tiKTsKIAl1MzIgYSwgYiwgYzsKIAogCWlmICgoX19mb3JjZSB1MzIpaXA2aC0+c2FkZHIuczZfYWRkcjMyWzNdIDwKQEAgLTc1LDIwICs3MCw1MCBAQAogCWVsc2UKIAkJYyA9IChfX2ZvcmNlIHUzMikgaXA2aC0+ZGFkZHIuczZfYWRkcjMyWzFdOwogCi0JcmV0dXJuIGpoYXNoXzN3b3JkcyhhLCBiLCBjLCBqaGFzaF9pbml0dmFsKTsKKwlyZXR1cm4gamhhc2hfM3dvcmRzKGEsIGIsIGMsIGluaXR2YWwpOwogfQotI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdTMyIGhhc2hfYnJpZGdlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHUzMiBpbml0dmFsKQoreworCXN0cnVjdCBpcHY2aGRyICppcDZoLCBfaXA2aDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCwgX2lwaDsKKworCXN3aXRjaCAoZXRoX2hkcihza2IpLT5oX3Byb3RvKSB7CisJY2FzZSBodG9ucyhFVEhfUF9JUCk6CisJCWlwaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpLAorCQkJCQkgc2l6ZW9mKCppcGgpLCAmX2lwaCk7CisJCWlmIChpcGgpCisJCQlyZXR1cm4gaGFzaF92NChpcGgsIGluaXR2YWwpOworCQlicmVhazsKKwljYXNlIGh0b25zKEVUSF9QX0lQVjYpOgorCQlpcDZoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYiksCisJCQkJCSAgc2l6ZW9mKCppcDZoKSwgJl9pcDZoKTsKKwkJaWYgKGlwNmgpCisJCQlyZXR1cm4gaGFzaF92NihpcDZoLCBpbml0dmFsKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBpbmxpbmUgdTMyCiBuZnF1ZXVlX2hhc2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IHF1ZXVlLCB1MTYgcXVldWVzX3RvdGFsLCB1OCBmYW1pbHksCi0JICAgICB1MzIgamhhc2hfaW5pdHZhbCkKKwkgICAgIHUzMiBpbml0dmFsKQogewotCWlmIChmYW1pbHkgPT0gTkZQUk9UT19JUFY0KQotCQlxdWV1ZSArPSAoKHU2NCkgaGFzaF92NChza2IsIGpoYXNoX2luaXR2YWwpICogcXVldWVzX3RvdGFsKSA+PiAzMjsKLSNpZiBJU19FTkFCTEVEKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpCi0JZWxzZSBpZiAoZmFtaWx5ID09IE5GUFJPVE9fSVBWNikKLQkJcXVldWUgKz0gKCh1NjQpIGhhc2hfdjYoc2tiLCBqaGFzaF9pbml0dmFsKSAqIHF1ZXVlc190b3RhbCkgPj4gMzI7Ci0jZW5kaWYKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgTkZQUk9UT19JUFY0OgorCQlxdWV1ZSArPSByZWNpcHJvY2FsX3NjYWxlKGhhc2hfdjQoaXBfaGRyKHNrYiksIGluaXR2YWwpLAorCQkJCQkgIHF1ZXVlc190b3RhbCk7CisJCWJyZWFrOworCWNhc2UgTkZQUk9UT19JUFY2OgorCQlxdWV1ZSArPSByZWNpcHJvY2FsX3NjYWxlKGhhc2hfdjYoaXB2Nl9oZHIoc2tiKSwgaW5pdHZhbCksCisJCQkJCSAgcXVldWVzX3RvdGFsKTsKKwkJYnJlYWs7CisJY2FzZSBORlBST1RPX0JSSURHRToKKwkJcXVldWUgKz0gcmVjaXByb2NhbF9zY2FsZShoYXNoX2JyaWRnZShza2IsIGluaXR2YWwpLAorCQkJCQkgIHF1ZXVlc190b3RhbCk7CisJCWJyZWFrOworCX0KIAogCXJldHVybiBxdWV1ZTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXMuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXMuaAppbmRleCBmMmYxMzM5Li41MDMxZTA3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlcy5oCkBAIC0xOSw2ICsxOSw3IEBACiAJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UJCSpvdXQ7CiAJdTgJCQkJcGY7CiAJdTgJCQkJaG9vazsKKwlib29sCQkJCXRwcm90X3NldDsKIAl1OAkJCQl0cHJvdDsKIAkvKiBmb3IgeF90YWJsZXMgY29tcGF0aWJpbGl0eSAqLwogCXN0cnVjdCB4dF9hY3Rpb25fcGFyYW0JCXh0OwpAQCAtMzYsNiArMzcsMjMgQEAKIAlwa3QtPnBmID0gcGt0LT54dC5mYW1pbHkgPSBzdGF0ZS0+cGY7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZnRfc2V0X3BrdGluZm9fcHJvdG9fdW5zcGVjKHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0LAorCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlwa3QtPnRwcm90X3NldCA9IGZhbHNlOworCXBrdC0+dHByb3QgPSAwOworCXBrdC0+eHQudGhvZmYgPSAwOworCXBrdC0+eHQuZnJhZ29mZiA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZnRfc2V0X3BrdGluZm9fdW5zcGVjKHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0LAorCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQoreworCW5mdF9zZXRfcGt0aW5mbyhwa3QsIHNrYiwgc3RhdGUpOworCW5mdF9zZXRfcGt0aW5mb19wcm90b191bnNwZWMocGt0LCBza2IpOworfQorCiAvKioKICAqIAlzdHJ1Y3QgbmZ0X3ZlcmRpY3QgLSBuZl90YWJsZXMgdmVyZGljdAogICoKQEAgLTEyNyw2ICsxNDUsNyBAQAogCXJldHVybiB0eXBlID09IE5GVF9EQVRBX1ZFUkRJQ1QgPyBORlRfUkVHX1ZFUkRJQ1QgOiBORlRfUkVHXzEgKiBORlRfUkVHX1NJWkUgLyBORlRfUkVHMzJfU0laRTsKIH0KIAordW5zaWduZWQgaW50IG5mdF9wYXJzZV91MzJfY2hlY2soY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0ciwgaW50IG1heCwgdTMyICpkZXN0KTsKIHVuc2lnbmVkIGludCBuZnRfcGFyc2VfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0cik7CiBpbnQgbmZ0X2R1bXBfcmVnaXN0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGF0dHIsIHVuc2lnbmVkIGludCByZWcpOwogCkBAIC0yNTEsNyArMjcwLDggQEAKIAogCWludAkJCQkoKmluc2VydCkoY29uc3Qgc3RydWN0IG5ldCAqbmV0LAogCQkJCQkJICBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJCQkJICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKTsKKwkJCQkJCSAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSwKKwkJCQkJCSAgc3RydWN0IG5mdF9zZXRfZXh0ICoqZXh0KTsKIAl2b2lkCQkJCSgqYWN0aXZhdGUpKGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwKIAkJCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAogCQkJCQkJICAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2VsZW0gKmVsZW0pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19icmlkZ2UuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfYnJpZGdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMWZiNzkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19icmlkZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2lmbmRlZiBfTkVUX05GX1RBQkxFU19CUklER0VfSAotI2RlZmluZSBfTkVUX05GX1RBQkxFU19CUklER0VfSAotCi1pbnQgbmZ0X2JyaWRnZV9pcGhkcl92YWxpZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWludCBuZnRfYnJpZGdlX2lwNmhkcl92YWxpZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQotI2VuZGlmIC8qIF9ORVRfTkZfVEFCTEVTX0JSSURHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2NvcmUuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5oCmluZGV4IGE5MDYwZGQuLjAwZjRmNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5oCkBAIC0yOCw2ICsyOCw5IEBACiBpbnQgbmZ0X2NtcF9tb2R1bGVfaW5pdCh2b2lkKTsKIHZvaWQgbmZ0X2NtcF9tb2R1bGVfZXhpdCh2b2lkKTsKIAoraW50IG5mdF9yYW5nZV9tb2R1bGVfaW5pdCh2b2lkKTsKK3ZvaWQgbmZ0X3JhbmdlX21vZHVsZV9leGl0KHZvaWQpOworCiBpbnQgbmZ0X2xvb2t1cF9tb2R1bGVfaW5pdCh2b2lkKTsKIHZvaWQgbmZ0X2xvb2t1cF9tb2R1bGVfZXhpdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY0LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjQuaAppbmRleCBjYTZlZjZiLi4yNWUzM2FlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjQuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjQuaApAQCAtMTQsMTEgKzE0LDUzIEBACiAJbmZ0X3NldF9wa3RpbmZvKHBrdCwgc2tiLCBzdGF0ZSk7CiAKIAlpcCA9IGlwX2hkcihwa3QtPnNrYik7CisJcGt0LT50cHJvdF9zZXQgPSB0cnVlOwogCXBrdC0+dHByb3QgPSBpcC0+cHJvdG9jb2w7CiAJcGt0LT54dC50aG9mZiA9IGlwX2hkcmxlbihwa3QtPnNrYik7CiAJcGt0LT54dC5mcmFnb2ZmID0gbnRvaHMoaXAtPmZyYWdfb2ZmKSAmIElQX09GRlNFVDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK19fbmZ0X3NldF9wa3RpbmZvX2lwdjRfdmFsaWRhdGUoc3RydWN0IG5mdF9wa3RpbmZvICpwa3QsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQljb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGlwaGRyICppcGgsIF9pcGg7CisJdTMyIGxlbiwgdGhvZmY7CisKKwlpcGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSwgc2l6ZW9mKCppcGgpLAorCQkJCSAmX2lwaCk7CisJaWYgKCFpcGgpCisJCXJldHVybiAtMTsKKworCWlmIChpcGgtPmlobCA8IDUgfHwgaXBoLT52ZXJzaW9uICE9IDQpCisJCXJldHVybiAtMTsKKworCWxlbiA9IG50b2hzKGlwaC0+dG90X2xlbik7CisJdGhvZmYgPSBpcGgtPmlobCAqIDQ7CisJaWYgKHNrYi0+bGVuIDwgbGVuKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAobGVuIDwgdGhvZmYpCisJCXJldHVybiAtMTsKKworCXBrdC0+dHByb3Rfc2V0ID0gdHJ1ZTsKKwlwa3QtPnRwcm90ID0gaXBoLT5wcm90b2NvbDsKKwlwa3QtPnh0LnRob2ZmID0gdGhvZmY7CisJcGt0LT54dC5mcmFnb2ZmID0gbnRvaHMoaXBoLT5mcmFnX29mZikgJiBJUF9PRkZTRVQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCituZnRfc2V0X3BrdGluZm9faXB2NF92YWxpZGF0ZShzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCwKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCit7CisJbmZ0X3NldF9wa3RpbmZvKHBrdCwgc2tiLCBzdGF0ZSk7CisJaWYgKF9fbmZ0X3NldF9wa3RpbmZvX2lwdjRfdmFsaWRhdGUocGt0LCBza2IsIHN0YXRlKSA8IDApCisJCW5mdF9zZXRfcGt0aW5mb19wcm90b191bnNwZWMocGt0LCBza2IpOworfQorCiBleHRlcm4gc3RydWN0IG5mdF9hZl9pbmZvIG5mdF9hZl9pcHY0OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfaXB2Ni5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY2LmgKaW5kZXggOGFkMzlhNi4uZDE1MGI1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY2LmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY2LmgKQEAgLTQsNyArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIHZvaWQKIG5mdF9zZXRfcGt0aW5mb19pcHY2KHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0LAogCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQpAQCAtMTUsMTUgKzE1LDY0IEBACiAJbmZ0X3NldF9wa3RpbmZvKHBrdCwgc2tiLCBzdGF0ZSk7CiAKIAlwcm90b2hkciA9IGlwdjZfZmluZF9oZHIocGt0LT5za2IsICZ0aG9mZiwgLTEsICZmcmFnX29mZiwgTlVMTCk7Ci0JLyogSWYgbWFsZm9ybWVkLCBkcm9wIGl0ICovCisJaWYgKHByb3RvaGRyIDwgMCkgeworCQluZnRfc2V0X3BrdGluZm9fcHJvdG9fdW5zcGVjKHBrdCwgc2tiKTsKKwkJcmV0dXJuOworCX0KKworCXBrdC0+dHByb3Rfc2V0ID0gdHJ1ZTsKKwlwa3QtPnRwcm90ID0gcHJvdG9oZHI7CisJcGt0LT54dC50aG9mZiA9IHRob2ZmOworCXBrdC0+eHQuZnJhZ29mZiA9IGZyYWdfb2ZmOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19uZnRfc2V0X3BrdGluZm9faXB2Nl92YWxpZGF0ZShzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCWNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKK3sKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQorCXN0cnVjdCBpcHY2aGRyICppcDZoLCBfaXA2aDsKKwl1bnNpZ25lZCBpbnQgdGhvZmYgPSAwOworCXVuc2lnbmVkIHNob3J0IGZyYWdfb2ZmOworCWludCBwcm90b2hkcjsKKwl1MzIgcGt0X2xlbjsKKworCWlwNmggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSwgc2l6ZW9mKCppcDZoKSwKKwkJCQkgICZfaXA2aCk7CisJaWYgKCFpcDZoKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoaXA2aC0+dmVyc2lvbiAhPSA2KQorCQlyZXR1cm4gLTE7CisKKwlwa3RfbGVuID0gbnRvaHMoaXA2aC0+cGF5bG9hZF9sZW4pOworCWlmIChwa3RfbGVuICsgc2l6ZW9mKCppcDZoKSA+IHNrYi0+bGVuKQorCQlyZXR1cm4gLTE7CisKKwlwcm90b2hkciA9IGlwdjZfZmluZF9oZHIocGt0LT5za2IsICZ0aG9mZiwgLTEsICZmcmFnX29mZiwgTlVMTCk7CiAJaWYgKHByb3RvaGRyIDwgMCkKIAkJcmV0dXJuIC0xOwogCisJcGt0LT50cHJvdF9zZXQgPSB0cnVlOwogCXBrdC0+dHByb3QgPSBwcm90b2hkcjsKIAlwa3QtPnh0LnRob2ZmID0gdGhvZmY7CiAJcGt0LT54dC5mcmFnb2ZmID0gZnJhZ19vZmY7CiAKIAlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIC0xOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbmZ0X3NldF9wa3RpbmZvX2lwdjZfdmFsaWRhdGUoc3RydWN0IG5mdF9wa3RpbmZvICpwa3QsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQoreworCW5mdF9zZXRfcGt0aW5mbyhwa3QsIHNrYiwgc3RhdGUpOworCWlmIChfX25mdF9zZXRfcGt0aW5mb19pcHY2X3ZhbGlkYXRlKHBrdCwgc2tiLCBzdGF0ZSkgPCAwKQorCQluZnRfc2V0X3BrdGluZm9fcHJvdG9fdW5zcGVjKHBrdCwgc2tiKTsKIH0KIAogZXh0ZXJuIHN0cnVjdCBuZnRfYWZfaW5mbyBuZnRfYWZfaXB2NjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZnRfbWV0YS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmgKaW5kZXggZDI3NTg4Yy4uMTEzOWNkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmgKQEAgLTM2LDQgKzM2LDggQEAKIHZvaWQgbmZ0X21ldGFfc2V0X2Rlc3Ryb3koY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKIAkJCSAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByKTsKIAoraW50IG5mdF9tZXRhX3NldF92YWxpZGF0ZShjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkJICBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQkgIGNvbnN0IHN0cnVjdCBuZnRfZGF0YSAqKmRhdGEpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZ0X3JlamVjdC5oCmluZGV4IDYwZmExNTMuLjAyZTI4YzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0LmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mdF9yZWplY3QuaApAQCAtOCw2ICs4LDEwIEBACiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnRfcmVqZWN0X3BvbGljeVtdOwogCitpbnQgbmZ0X3JlamVjdF92YWxpZGF0ZShjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkJY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJY29uc3Qgc3RydWN0IG5mdF9kYXRhICoqZGF0YSk7CisKIGludCBuZnRfcmVqZWN0X2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKIAkJICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKIAkJICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldG5zL2Nvbm50cmFjay5oIGIvaW5jbHVkZS9uZXQvbmV0bnMvY29ubnRyYWNrLmgKaW5kZXggMzhiMWE4MC4uZTQ2OWU4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0bnMvY29ubnRyYWNrLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0bnMvY29ubnRyYWNrLmgKQEAgLTE1LDEwICsxNSw2IEBACiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpjdGxfdGFibGVfaGVhZGVyOwogCXN0cnVjdCBjdGxfdGFibGUgICAgICAgICpjdGxfdGFibGU7Ci0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAotCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpjdGxfY29tcGF0X2hlYWRlcjsKLQlzdHJ1Y3QgY3RsX3RhYmxlICAgICAgICAqY3RsX2NvbXBhdF90YWJsZTsKLSNlbmRpZgogI2VuZGlmCiAJdW5zaWduZWQgaW50CQl1c2VyczsKIH07CkBAIC01OCwxMCArNTQsNiBAQAogCXN0cnVjdCBuZl91ZHBfbmV0CXVkcDsKIAlzdHJ1Y3QgbmZfaWNtcF9uZXQJaWNtcDsKIAlzdHJ1Y3QgbmZfaWNtcF9uZXQJaWNtcHY2OwotI2lmIGRlZmluZWQoQ09ORklHX1NZU0NUTCkgJiYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKQotCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpjdGxfdGFibGVfaGVhZGVyOwotCXN0cnVjdCBjdGxfdGFibGUJKmN0bF90YWJsZTsKLSNlbmRpZgogfTsKIAogc3RydWN0IGN0X3BjcHUgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0bnMvaXB2NC5oIGIvaW5jbHVkZS9uZXQvbmV0bnMvaXB2NC5oCmluZGV4IGQwNjFmZmUuLjdhZGY0MzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldG5zL2lwdjQuaAorKysgYi9pbmNsdWRlL25ldC9uZXRucy9pcHY0LmgKQEAgLTQwLDcgKzQwLDYgQEAKICNpZmRlZiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTCiAJc3RydWN0IGZpYl9ydWxlc19vcHMJKnJ1bGVzX29wczsKIAlib29sCQkJZmliX2hhc19jdXN0b21fcnVsZXM7Ci0Jc3RydWN0IGZpYl90YWJsZSBfX3JjdQkqZmliX2xvY2FsOwogCXN0cnVjdCBmaWJfdGFibGUgX19yY3UJKmZpYl9tYWluOwogCXN0cnVjdCBmaWJfdGFibGUgX19yY3UJKmZpYl9kZWZhdWx0OwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRucy9uZXRmaWx0ZXIuaCBiL2luY2x1ZGUvbmV0L25ldG5zL25ldGZpbHRlci5oCmluZGV4IDM2ZDcyMzUuLjU4NDg3YjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldG5zL25ldGZpbHRlci5oCisrKyBiL2luY2x1ZGUvbmV0L25ldG5zL25ldGZpbHRlci5oCkBAIC0xNiw2ICsxNiw2IEBACiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpuZl9sb2dfZGlyX2hlYWRlcjsKICNlbmRpZgotCXN0cnVjdCBsaXN0X2hlYWQgaG9va3NbTkZQUk9UT19OVU1QUk9UT11bTkZfTUFYX0hPT0tTXTsKKwlzdHJ1Y3QgbmZfaG9va19lbnRyeSBfX3JjdSAqaG9va3NbTkZQUk9UT19OVU1QUk9UT11bTkZfTUFYX0hPT0tTXTsKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldG5zL3hmcm0uaCBiL2luY2x1ZGUvbmV0L25ldG5zL3hmcm0uaAppbmRleCAyNGNkMzk0Li4yN2JiOTYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRucy94ZnJtLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0bnMveGZybS5oCkBAIC0xMSw3ICsxMSw3IEBACiBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlcjsKIAogc3RydWN0IHhmcm1fcG9saWN5X2hhc2ggewotCXN0cnVjdCBobGlzdF9oZWFkCSp0YWJsZTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAlfX3JjdSAqdGFibGU7CiAJdW5zaWduZWQgaW50CQlobWFzazsKIAl1OAkJCWRiaXRzNDsKIAl1OAkJCXNiaXRzNDsKQEAgLTM4LDE0ICszOCwxMiBAQAogCSAqIG1vZGUuIEFsc28sIGl0IGNhbiBiZSB1c2VkIGJ5IGFoL2VzcCBpY21wIGVycm9yIGhhbmRsZXIgdG8gZmluZAogCSAqIG9mZmVuZGluZyBTQS4KIAkgKi8KLQlzdHJ1Y3QgaGxpc3RfaGVhZAkqc3RhdGVfYnlkc3Q7Ci0Jc3RydWN0IGhsaXN0X2hlYWQJKnN0YXRlX2J5c3JjOwotCXN0cnVjdCBobGlzdF9oZWFkCSpzdGF0ZV9ieXNwaTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAlfX3JjdSAqc3RhdGVfYnlkc3Q7CisJc3RydWN0IGhsaXN0X2hlYWQJX19yY3UgKnN0YXRlX2J5c3JjOworCXN0cnVjdCBobGlzdF9oZWFkCV9fcmN1ICpzdGF0ZV9ieXNwaTsKIAl1bnNpZ25lZCBpbnQJCXN0YXRlX2htYXNrOwogCXVuc2lnbmVkIGludAkJc3RhdGVfbnVtOwogCXN0cnVjdCB3b3JrX3N0cnVjdAlzdGF0ZV9oYXNoX3dvcms7Ci0Jc3RydWN0IGhsaXN0X2hlYWQJc3RhdGVfZ2NfbGlzdDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJc3RhdGVfZ2Nfd29yazsKIAogCXN0cnVjdCBsaXN0X2hlYWQJcG9saWN5X2FsbDsKIAlzdHJ1Y3QgaGxpc3RfaGVhZAkqcG9saWN5X2J5aWR4OwpAQCAtNzMsNyArNzEsNyBAQAogCXN0cnVjdCBkc3Rfb3BzCQl4ZnJtNl9kc3Rfb3BzOwogI2VuZGlmCiAJc3BpbmxvY2tfdCB4ZnJtX3N0YXRlX2xvY2s7Ci0Jcndsb2NrX3QgeGZybV9wb2xpY3lfbG9jazsKKwlzcGlubG9ja190IHhmcm1fcG9saWN5X2xvY2s7CiAJc3RydWN0IG11dGV4IHhmcm1fY2ZnX211dGV4OwogCiAJLyogZmxvdyBjYWNoZSBwYXJ0ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wa3RfY2xzLmggYi9pbmNsdWRlL25ldC9wa3RfY2xzLmgKaW5kZXggNmY4ZDY1My4uNzY3YjAzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcGt0X2Nscy5oCisrKyBiL2luY2x1ZGUvbmV0L3BrdF9jbHMuaApAQCAtNTksNyArNTksOCBAQAogc3RydWN0IHRjZl9leHRzIHsKICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKIAlfX3UzMgl0eXBlOyAvKiBmb3IgYmFja3dhcmQgY29tcGF0KFRDQV9PTERfQ09NUEFUKSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgYWN0aW9uczsKKwlpbnQgbnJfYWN0aW9uczsKKwlzdHJ1Y3QgdGNfYWN0aW9uICoqYWN0aW9uczsKICNlbmRpZgogCS8qIE1hcCB0byBleHBvcnQgY2xhc3NpZmllciBzcGVjaWZpYyBleHRlbnNpb24gVExWIHR5cGVzIHRvIHRoZQogCSAqIGdlbmVyaWMgZXh0ZW5zaW9ucyBBUEkuIFVuc3VwcG9ydGVkIGV4dGVuc2lvbnMgbXVzdCBiZSBzZXQgdG8gMC4KQEAgLTY4LDE0ICs2OSwxOSBAQAogCWludCBwb2xpY2U7CiB9OwogCi1zdGF0aWMgaW5saW5lIHZvaWQgdGNmX2V4dHNfaW5pdChzdHJ1Y3QgdGNmX2V4dHMgKmV4dHMsIGludCBhY3Rpb24sIGludCBwb2xpY2UpCitzdGF0aWMgaW5saW5lIGludCB0Y2ZfZXh0c19pbml0KHN0cnVjdCB0Y2ZfZXh0cyAqZXh0cywgaW50IGFjdGlvbiwgaW50IHBvbGljZSkKIHsKICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKIAlleHRzLT50eXBlID0gMDsKLQlJTklUX0xJU1RfSEVBRCgmZXh0cy0+YWN0aW9ucyk7CisJZXh0cy0+bnJfYWN0aW9ucyA9IDA7CisJZXh0cy0+YWN0aW9ucyA9IGtjYWxsb2MoVENBX0FDVF9NQVhfUFJJTywgc2l6ZW9mKHN0cnVjdCB0Y19hY3Rpb24gKiksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFleHRzLT5hY3Rpb25zKQorCQlyZXR1cm4gLUVOT01FTTsKICNlbmRpZgogCWV4dHMtPmFjdGlvbiA9IGFjdGlvbjsKIAlleHRzLT5wb2xpY2UgPSBwb2xpY2U7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtODksNyArOTUsNyBAQAogdGNmX2V4dHNfaXNfcHJlZGljYXRpdmUoc3RydWN0IHRjZl9leHRzICpleHRzKQogewogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAotCXJldHVybiAhbGlzdF9lbXB0eSgmZXh0cy0+YWN0aW9ucyk7CisJcmV0dXJuIGV4dHMtPm5yX2FjdGlvbnM7CiAjZWxzZQogCXJldHVybiAwOwogI2VuZGlmCkBAIC0xMDgsNiArMTE0LDIwIEBACiAJcmV0dXJuIHRjZl9leHRzX2lzX3ByZWRpY2F0aXZlKGV4dHMpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgdGNmX2V4dHNfdG9fbGlzdChjb25zdCBzdHJ1Y3QgdGNmX2V4dHMgKmV4dHMsCisJCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKmFjdGlvbnMpCit7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZXh0cy0+bnJfYWN0aW9uczsgaSsrKSB7CisJCXN0cnVjdCB0Y19hY3Rpb24gKmEgPSBleHRzLT5hY3Rpb25zW2ldOworCisJCWxpc3RfYWRkX3RhaWwoJmEtPmxpc3QsIGFjdGlvbnMpOworCX0KKyNlbmRpZgorfQorCiAvKioKICAqIHRjZl9leHRzX2V4ZWMgLSBleGVjdXRlIHRjIGZpbHRlciBleHRlbnNpb25zCiAgKiBAc2tiOiBzb2NrZXQgYnVmZmVyCkBAIC0xMjQsMTIgKzE0NCwyNSBAQAogCSAgICAgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQogewogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAotCWlmICghbGlzdF9lbXB0eSgmZXh0cy0+YWN0aW9ucykpCi0JCXJldHVybiB0Y2ZfYWN0aW9uX2V4ZWMoc2tiLCAmZXh0cy0+YWN0aW9ucywgcmVzKTsKKwlpZiAoZXh0cy0+bnJfYWN0aW9ucykKKwkJcmV0dXJuIHRjZl9hY3Rpb25fZXhlYyhza2IsIGV4dHMtPmFjdGlvbnMsIGV4dHMtPm5yX2FjdGlvbnMsCisJCQkJICAgICAgIHJlcyk7CiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAorCisjZGVmaW5lIHRjX25vX2FjdGlvbnMoX2V4dHMpICAoKF9leHRzKS0+bnJfYWN0aW9ucyA9PSAwKQorI2RlZmluZSB0Y19zaW5nbGVfYWN0aW9uKF9leHRzKSAoKF9leHRzKS0+bnJfYWN0aW9ucyA9PSAxKQorCisjZWxzZSAvKiBDT05GSUdfTkVUX0NMU19BQ1QgKi8KKworI2RlZmluZSB0Y19ub19hY3Rpb25zKF9leHRzKSB0cnVlCisjZGVmaW5lIHRjX3NpbmdsZV9hY3Rpb24oX2V4dHMpIGZhbHNlCisKKyNlbmRpZiAvKiBDT05GSUdfTkVUX0NMU19BQ1QgKi8KKwogaW50IHRjZl9leHRzX3ZhbGlkYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRjZl9wcm90byAqdHAsCiAJCSAgICAgIHN0cnVjdCBubGF0dHIgKip0Yiwgc3RydWN0IG5sYXR0ciAqcmF0ZV90bHYsCiAJCSAgICAgIHN0cnVjdCB0Y2ZfZXh0cyAqZXh0cywgYm9vbCBvdnIpOwpAQCAtNDUzLDQgKzQ4NiwyMCBAQAogCXVuc2lnbmVkIGxvbmcgY29va2llOwogfTsKIAorZW51bSB0Y19jbHNicGZfY29tbWFuZCB7CisJVENfQ0xTQlBGX0FERCwKKwlUQ19DTFNCUEZfUkVQTEFDRSwKKwlUQ19DTFNCUEZfREVTVFJPWSwKKwlUQ19DTFNCUEZfU1RBVFMsCit9OworCitzdHJ1Y3QgdGNfY2xzX2JwZl9vZmZsb2FkIHsKKwllbnVtIHRjX2Nsc2JwZl9jb21tYW5kIGNvbW1hbmQ7CisJc3RydWN0IHRjZl9leHRzICpleHRzOworCXN0cnVjdCBicGZfcHJvZyAqcHJvZzsKKwljb25zdCBjaGFyICpuYW1lOworCWJvb2wgZXh0c19pbnRlZ3JhdGVkOworCXUzMiBnZW5fZmxhZ3M7Cit9OworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3BrdF9zY2hlZC5oIGIvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmgKaW5kZXggN2NhYTk5Yi4uY2QzMzRjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmgKKysrIGIvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmgKQEAgLTkwLDggKzkwLDggQEAKIHZvaWQgcWRpc2NfZ2V0X2RlZmF1bHQoY2hhciAqaWQsIHNpemVfdCBsZW4pOwogaW50IHFkaXNjX3NldF9kZWZhdWx0KGNvbnN0IGNoYXIgKmlkKTsKIAotdm9pZCBxZGlzY19saXN0X2FkZChzdHJ1Y3QgUWRpc2MgKnEpOwotdm9pZCBxZGlzY19saXN0X2RlbChzdHJ1Y3QgUWRpc2MgKnEpOwordm9pZCBxZGlzY19oYXNoX2FkZChzdHJ1Y3QgUWRpc2MgKnEpOwordm9pZCBxZGlzY19oYXNoX2RlbChzdHJ1Y3QgUWRpc2MgKnEpOwogc3RydWN0IFFkaXNjICpxZGlzY19sb29rdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGhhbmRsZSk7CiBzdHJ1Y3QgUWRpc2MgKnFkaXNjX2xvb2t1cF9jbGFzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgaGFuZGxlKTsKIHN0cnVjdCBxZGlzY19yYXRlX3RhYmxlICpxZGlzY19nZXRfcnRhYihzdHJ1Y3QgdGNfcmF0ZXNwZWMgKnIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wcHRwLmggYi9pbmNsdWRlL25ldC9wcHRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJlOWYxZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L3BwdHAuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9ORVRfUFBUUF9ICisjZGVmaW5lIF9ORVRfUFBUUF9ICisKKyNkZWZpbmUgUFBQX0xDUF9FQ0hPUkVRIDB4MDkKKyNkZWZpbmUgUFBQX0xDUF9FQ0hPUkVQIDB4MEEKKyNkZWZpbmUgU0NfUkNWX0JJVFMgICAgIChTQ19SQ1ZfQjdfMXxTQ19SQ1ZfQjdfMHxTQ19SQ1ZfT0REUHxTQ19SQ1ZfRVZOUCkKKworI2RlZmluZSBNSVNTSU5HX1dJTkRPVyAyMAorI2RlZmluZSBXUkFQUEVEKGN1cnNlcSwgbGFzdHNlcSlcCisJKCgoKGN1cnNlcSkgJiAweGZmZmZmZjAwKSA9PSAwKSAmJlwKKwkoKChsYXN0c2VxKSAmIDB4ZmZmZmZmMDApID09IDB4ZmZmZmZmMDApKQorCisjZGVmaW5lIFBQVFBfSEVBREVSX09WRVJIRUFEICgyK3NpemVvZihzdHJ1Y3QgcHB0cF9ncmVfaGVhZGVyKSkKK3N0cnVjdCBwcHRwX2dyZV9oZWFkZXIgeworCXN0cnVjdCBncmVfYmFzZV9oZHIgZ3JlX2hkOworCV9fYmUxNiBwYXlsb2FkX2xlbjsKKwlfX2JlMTYgY2FsbF9pZDsKKwlfX2JlMzIgc2VxOworCV9fYmUzMiBhY2s7Cit9IF9fcGFja2VkOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcm91dGUuaCBiL2luY2x1ZGUvbmV0L3JvdXRlLmgKaW5kZXggYWQ3NzdkNy4uMDQyOWQ0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcm91dGUuaAorKysgYi9pbmNsdWRlL25ldC9yb3V0ZS5oCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bmV0L2Zsb3cuaD4KICNpbmNsdWRlIDxuZXQvaW5ldF9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2lwX2ZpYi5oPgotI2luY2x1ZGUgPG5ldC9sM21kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9pbl9yb3V0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CkBAIC0yODUsMTUgKzI4NCw2IEBACiAJaXBfcm91dGVfY29ubmVjdF9pbml0KGZsNCwgZHN0LCBzcmMsIHRvcywgb2lmLCBwcm90b2NvbCwKIAkJCSAgICAgIHNwb3J0LCBkcG9ydCwgc2spOwogCi0JaWYgKCFzcmMgJiYgb2lmKSB7Ci0JCWludCByYzsKLQotCQlyYyA9IGwzbWRldl9nZXRfc2FkZHIobmV0LCBvaWYsIGZsNCk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gRVJSX1BUUihyYyk7Ci0KLQkJc3JjID0gZmw0LT5zYWRkcjsKLQl9CiAJaWYgKCFkc3QgfHwgIXNyYykgewogCQlydCA9IF9faXBfcm91dGVfb3V0cHV0X2tleShuZXQsIGZsNCk7CiAJCWlmIChJU19FUlIocnQpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaCBiL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKaW5kZXggOTA5YWZmMi4uZTZhYTBhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaAorKysgYi9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCkBAIC0zNiw2ICszNiwxNCBAQAogCXUxNgkJCWRhdGFbXTsKIH07CiAKKy8qIHNpbWlsYXIgdG8gc2tfYnVmZl9oZWFkLCBidXQgc2tiLT5wcmV2IHBvaW50ZXIgaXMgdW5kZWZpbmVkLiAqLworc3RydWN0IHFkaXNjX3NrYl9oZWFkIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkqaGVhZDsKKwlzdHJ1Y3Qgc2tfYnVmZgkqdGFpbDsKKwlfX3UzMgkJcWxlbjsKKwlzcGlubG9ja190CWxvY2s7Cit9OworCiBzdHJ1Y3QgUWRpc2MgewogCWludCAJCQkoKmVucXVldWUpKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCSAgIHN0cnVjdCBRZGlzYyAqc2NoLApAQCAtNjEsNyArNjksNyBAQAogCXUzMgkJCWxpbWl0OwogCWNvbnN0IHN0cnVjdCBRZGlzY19vcHMJKm9wczsKIAlzdHJ1Y3QgcWRpc2Nfc2l6ZV90YWJsZQlfX3JjdSAqc3RhYjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IGhsaXN0X25vZGUgICAgICAgaGFzaDsKIAl1MzIJCQloYW5kbGU7CiAJdTMyCQkJcGFyZW50OwogCXZvaWQJCQkqdTMyX25vZGU7CkBAIC03Niw3ICs4NCw3IEBACiAJICogRm9yIHBlcmZvcm1hbmNlIHNha2Ugb24gU01QLCB3ZSBwdXQgaGlnaGx5IG1vZGlmaWVkIGZpZWxkcyBhdCB0aGUgZW5kCiAJICovCiAJc3RydWN0IHNrX2J1ZmYJCSpnc29fc2tiIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7Ci0Jc3RydWN0IHNrX2J1ZmZfaGVhZAlxOworCXN0cnVjdCBxZGlzY19za2JfaGVhZAlxOwogCXN0cnVjdCBnbmV0X3N0YXRzX2Jhc2ljX3BhY2tlZCBic3RhdHM7CiAJc2VxY291bnRfdAkJcnVubmluZzsKIAlzdHJ1Y3QgZ25ldF9zdGF0c19xdWV1ZQlxc3RhdHM7CkBAIC01OTIsNyArNjAwLDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHFkaXNjX3FzdGF0c19jcHVfZHJvcChzdHJ1Y3QgUWRpc2MgKnNjaCkKIHsKLQlxc3RhdHNfZHJvcF9pbmModGhpc19jcHVfcHRyKHNjaC0+Y3B1X3FzdGF0cykpOworCXRoaXNfY3B1X2luYyhzY2gtPmNwdV9xc3RhdHMtPmRyb3BzKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHFkaXNjX3FzdGF0c19vdmVybGltaXQoc3RydWN0IFFkaXNjICpzY2gpCkBAIC02MDAsMTAgKzYwOCwyNyBAQAogCXNjaC0+cXN0YXRzLm92ZXJsaW1pdHMrKzsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX19xZGlzY19lbnF1ZXVlX3RhaWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpzY2gsCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpCitzdGF0aWMgaW5saW5lIHZvaWQgcWRpc2Nfc2tiX2hlYWRfaW5pdChzdHJ1Y3QgcWRpc2Nfc2tiX2hlYWQgKnFoKQogewotCV9fc2tiX3F1ZXVlX3RhaWwobGlzdCwgc2tiKTsKKwlxaC0+aGVhZCA9IE5VTEw7CisJcWgtPnRhaWwgPSBOVUxMOworCXFoLT5xbGVuID0gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19xZGlzY19lbnF1ZXVlX3RhaWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpzY2gsCisJCQkJICAgICAgIHN0cnVjdCBxZGlzY19za2JfaGVhZCAqcWgpCit7CisJc3RydWN0IHNrX2J1ZmYgKmxhc3QgPSBxaC0+dGFpbDsKKworCWlmIChsYXN0KSB7CisJCXNrYi0+bmV4dCA9IE5VTEw7CisJCWxhc3QtPm5leHQgPSBza2I7CisJCXFoLT50YWlsID0gc2tiOworCX0gZWxzZSB7CisJCXFoLT50YWlsID0gc2tiOworCQlxaC0+aGVhZCA9IHNrYjsKKwl9CisJcWgtPnFsZW4rKzsKIAlxZGlzY19xc3RhdHNfYmFja2xvZ19pbmMoc2NoLCBza2IpOwogCiAJcmV0dXJuIE5FVF9YTUlUX1NVQ0NFU1M7CkBAIC02MTQsMTQgKzYzOSwxNiBAQAogCXJldHVybiBfX3FkaXNjX2VucXVldWVfdGFpbChza2IsIHNjaCwgJnNjaC0+cSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKl9fcWRpc2NfZGVxdWV1ZV9oZWFkKHN0cnVjdCBRZGlzYyAqc2NoLAotCQkJCQkJICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKl9fcWRpc2NfZGVxdWV1ZV9oZWFkKHN0cnVjdCBxZGlzY19za2JfaGVhZCAqcWgpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IF9fc2tiX2RlcXVldWUobGlzdCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHFoLT5oZWFkOwogCiAJaWYgKGxpa2VseShza2IgIT0gTlVMTCkpIHsKLQkJcWRpc2NfcXN0YXRzX2JhY2tsb2dfZGVjKHNjaCwgc2tiKTsKLQkJcWRpc2NfYnN0YXRzX3VwZGF0ZShzY2gsIHNrYik7CisJCXFoLT5oZWFkID0gc2tiLT5uZXh0OworCQlxaC0+cWxlbi0tOworCQlpZiAocWgtPmhlYWQgPT0gTlVMTCkKKwkJCXFoLT50YWlsID0gTlVMTDsKKwkJc2tiLT5uZXh0ID0gTlVMTDsKIAl9CiAKIAlyZXR1cm4gc2tiOwpAQCAtNjI5LDcgKzY1NiwxNCBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpxZGlzY19kZXF1ZXVlX2hlYWQoc3RydWN0IFFkaXNjICpzY2gpCiB7Ci0JcmV0dXJuIF9fcWRpc2NfZGVxdWV1ZV9oZWFkKHNjaCwgJnNjaC0+cSk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IF9fcWRpc2NfZGVxdWV1ZV9oZWFkKCZzY2gtPnEpOworCisJaWYgKGxpa2VseShza2IgIT0gTlVMTCkpIHsKKwkJcWRpc2NfcXN0YXRzX2JhY2tsb2dfZGVjKHNjaCwgc2tiKTsKKwkJcWRpc2NfYnN0YXRzX3VwZGF0ZShzY2gsIHNrYik7CisJfQorCisJcmV0dXJuIHNrYjsKIH0KIAogLyogSW5zdGVhZCBvZiBjYWxsaW5nIGtmcmVlX3NrYigpIHdoaWxlIHJvb3QgcWRpc2MgbG9jayBpcyBoZWxkLApAQCAtNjQyLDEwICs2NzYsMTAgQEAKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19xZGlzY19xdWV1ZV9kcm9wX2hlYWQoc3RydWN0IFFkaXNjICpzY2gsCi0JCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0LAorCQkJCQkJICAgc3RydWN0IHFkaXNjX3NrYl9oZWFkICpxaCwKIAkJCQkJCSAgIHN0cnVjdCBza19idWZmICoqdG9fZnJlZSkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19za2JfZGVxdWV1ZShsaXN0KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19xZGlzY19kZXF1ZXVlX2hlYWQocWgpOwogCiAJaWYgKGxpa2VseShza2IgIT0gTlVMTCkpIHsKIAkJdW5zaWduZWQgaW50IGxlbiA9IHFkaXNjX3BrdF9sZW4oc2tiKTsKQEAgLTY2Niw3ICs3MDAsOSBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpxZGlzY19wZWVrX2hlYWQoc3RydWN0IFFkaXNjICpzY2gpCiB7Ci0JcmV0dXJuIHNrYl9wZWVrKCZzY2gtPnEpOworCWNvbnN0IHN0cnVjdCBxZGlzY19za2JfaGVhZCAqcWggPSAmc2NoLT5xOworCisJcmV0dXJuIHFoLT5oZWFkOwogfQogCiAvKiBnZW5lcmljIHBzZXVkbyBwZWVrIG1ldGhvZCBmb3Igbm9uLXdvcmstY29uc2VydmluZyBxZGlzYyAqLwpAQCAtNzAxLDE1ICs3MzcsMTkgQEAKIAlyZXR1cm4gc2tiOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19xZGlzY19yZXNldF9xdWV1ZShzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQorc3RhdGljIGlubGluZSB2b2lkIF9fcWRpc2NfcmVzZXRfcXVldWUoc3RydWN0IHFkaXNjX3NrYl9oZWFkICpxaCkKIHsKIAkvKgogCSAqIFdlIGRvIG5vdCBrbm93IHRoZSBiYWNrbG9nIGluIGJ5dGVzIG9mIHRoaXMgbGlzdCwgaXQKIAkgKiBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGNvcnJlY3QgaXQKIAkgKi8KLQlpZiAoIXNrYl9xdWV1ZV9lbXB0eShsaXN0KSkgewotCQlydG5sX2tmcmVlX3NrYnMobGlzdC0+bmV4dCwgbGlzdC0+cHJldik7Ci0JCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdChsaXN0KTsKKwlBU1NFUlRfUlROTCgpOworCWlmIChxaC0+cWxlbikgeworCQlydG5sX2tmcmVlX3NrYnMocWgtPmhlYWQsIHFoLT50YWlsKTsKKworCQlxaC0+aGVhZCA9IE5VTEw7CisJCXFoLT50YWlsID0gTlVMTDsKKwkJcWgtPnFsZW4gPSAwOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmggYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAppbmRleCA2MzJlMjA1Li44N2E3ZjQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaApAQCAtODMsOSArODMsOSBAQAogI2VuZGlmCiAKIC8qIFJvdW5kIGFuIGludCB1cCB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiA0LiAgKi8KLSNkZWZpbmUgV09SRF9ST1VORChzKSAoKChzKSszKSZ+MykKKyNkZWZpbmUgU0NUUF9QQUQ0KHMpICgoKHMpKzMpJn4zKQogLyogVHJ1bmNhdGUgdG8gdGhlIHByZXZpb3VzIG11bHRpcGxlIG9mIDQuICAqLwotI2RlZmluZSBXT1JEX1RSVU5DKHMpICgocykmfjMpCisjZGVmaW5lIFNDVFBfVFJVTkM0KHMpICgocykmfjMpCiAKIC8qCiAgKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMuCkBAIC00MzMsNyArNDMzLDcgQEAKIAlpZiAoYXNvYy0+dXNlcl9mcmFnKQogCQlmcmFnID0gbWluX3QoaW50LCBmcmFnLCBhc29jLT51c2VyX2ZyYWcpOwogCi0JZnJhZyA9IFdPUkRfVFJVTkMobWluX3QoaW50LCBmcmFnLCBTQ1RQX01BWF9DSFVOS19MRU4pKTsKKwlmcmFnID0gU0NUUF9UUlVOQzQobWluX3QoaW50LCBmcmFnLCBTQ1RQX01BWF9DSFVOS19MRU4pKTsKIAogCXJldHVybiBmcmFnOwogfQpAQCAtNDYyLDcgKzQ2Miw3IEBACiBmb3IgKHBvcy52ID0gY2h1bmstPm1lbWJlcjtcCiAgICAgIHBvcy52IDw9ICh2b2lkICopY2h1bmsgKyBlbmQgLSBudG9ocyhwb3MucC0+bGVuZ3RoKSAmJlwKICAgICAgbnRvaHMocG9zLnAtPmxlbmd0aCkgPj0gc2l6ZW9mKHNjdHBfcGFyYW1oZHJfdCk7XAotICAgICBwb3MudiArPSBXT1JEX1JPVU5EKG50b2hzKHBvcy5wLT5sZW5ndGgpKSkKKyAgICAgcG9zLnYgKz0gU0NUUF9QQUQ0KG50b2hzKHBvcy5wLT5sZW5ndGgpKSkKIAogI2RlZmluZSBzY3RwX3dhbGtfZXJyb3JzKGVyciwgY2h1bmtfaGRyKVwKIF9zY3RwX3dhbGtfZXJyb3JzKChlcnIpLCAoY2h1bmtfaGRyKSwgbnRvaHMoKGNodW5rX2hkciktPmxlbmd0aCkpCkBAIC00NzIsNyArNDcyLDcgQEAKIAkgICAgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpO1wKICAgICAgKHZvaWQgKillcnIgPD0gKHZvaWQgKiljaHVua19oZHIgKyBlbmQgLSBudG9ocyhlcnItPmxlbmd0aCkgJiZcCiAgICAgIG50b2hzKGVyci0+bGVuZ3RoKSA+PSBzaXplb2Yoc2N0cF9lcnJoZHJfdCk7IFwKLSAgICAgZXJyID0gKHNjdHBfZXJyaGRyX3QgKikoKHZvaWQgKillcnIgKyBXT1JEX1JPVU5EKG50b2hzKGVyci0+bGVuZ3RoKSkpKQorICAgICBlcnIgPSAoc2N0cF9lcnJoZHJfdCAqKSgodm9pZCAqKWVyciArIFNDVFBfUEFENChudG9ocyhlcnItPmxlbmd0aCkpKSkKIAogI2RlZmluZSBzY3RwX3dhbGtfZndkdHNuKHBvcywgY2h1bmspXAogX3NjdHBfd2Fsa19md2R0c24oKHBvcyksIChjaHVuayksIG50b2hzKChjaHVuayktPmNodW5rX2hkci0+bGVuZ3RoKSAtIHNpemVvZihzdHJ1Y3Qgc2N0cF9md2R0c25fY2h1bmspKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zbS5oIGIvaW5jbHVkZS9uZXQvc2N0cC9zbS5oCmluZGV4IGVmYzAxNzQuLmNhNmM5NzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvc20uaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3NtLmgKQEAgLTMwNyw4NSArMzA3LDI3IEBACiB9CiAKIC8qIENvbXBhcmUgdHdvIFRTTnMgKi8KKyNkZWZpbmUgVFNOX2x0KGEsYikJXAorCSh0eXBlY2hlY2soX191MzIsIGEpICYmIFwKKwkgdHlwZWNoZWNrKF9fdTMyLCBiKSAmJiBcCisJICgoX19zMzIpKChhKSAtIChiKSkgPCAwKSkKIAotLyogUkZDIDE5ODIgLSBTZXJpYWwgTnVtYmVyIEFyaXRobWV0aWMKLSAqCi0gKiAyLiBDb21wYXJpc29uCi0gKiAgVGhlbiwgczEgaXMgc2FpZCB0byBiZSBlcXVhbCB0byBzMiBpZiBhbmQgb25seSBpZiBpMSBpcyBlcXVhbCB0byBpMiwKLSAqICBpbiBhbGwgb3RoZXIgY2FzZXMsIHMxIGlzIG5vdCBlcXVhbCB0byBzMi4KLSAqCi0gKiBzMSBpcyBzYWlkIHRvIGJlIGxlc3MgdGhhbiBzMiBpZiwgYW5kIG9ubHkgaWYsIHMxIGlzIG5vdCBlcXVhbCB0byBzMiwKLSAqIGFuZAotICoKLSAqICAgICAgKGkxIDwgaTIgYW5kIGkyIC0gaTEgPCAyXihTRVJJQUxfQklUUyAtIDEpKSBvcgotICogICAgICAoaTEgPiBpMiBhbmQgaTEgLSBpMiA+IDJeKFNFUklBTF9CSVRTIC0gMSkpCi0gKgotICogczEgaXMgc2FpZCB0byBiZSBncmVhdGVyIHRoYW4gczIgaWYsIGFuZCBvbmx5IGlmLCBzMSBpcyBub3QgZXF1YWwgdG8KLSAqIHMyLCBhbmQKLSAqCi0gKiAgICAgIChpMSA8IGkyIGFuZCBpMiAtIGkxID4gMl4oU0VSSUFMX0JJVFMgLSAxKSkgb3IKLSAqICAgICAgKGkxID4gaTIgYW5kIGkxIC0gaTIgPCAyXihTRVJJQUxfQklUUyAtIDEpKQotICovCi0KLS8qCi0gKiBSRkMgMjk2MAotICogIDEuNiBTZXJpYWwgTnVtYmVyIEFyaXRobWV0aWMKLSAqCi0gKiBDb21wYXJpc29ucyBhbmQgYXJpdGhtZXRpYyBvbiBUU05zIGluIHRoaXMgZG9jdW1lbnQgU0hPVUxEIHVzZSBTZXJpYWwKLSAqIE51bWJlciBBcml0aG1ldGljIGFzIGRlZmluZWQgaW4gW1JGQzE5ODJdIHdoZXJlIFNFUklBTF9CSVRTID0gMzIuCi0gKi8KLQotZW51bSB7Ci0JVFNOX1NJR05fQklUID0gKDE8PDMxKQotfTsKLQotc3RhdGljIGlubGluZSBpbnQgVFNOX2x0KF9fdTMyIHMsIF9fdTMyIHQpCi17Ci0JcmV0dXJuICgocykgLSAodCkpICYgVFNOX1NJR05fQklUOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBUU05fbHRlKF9fdTMyIHMsIF9fdTMyIHQpCi17Ci0JcmV0dXJuICgocykgPT0gKHQpKSB8fCAoKChzKSAtICh0KSkgJiBUU05fU0lHTl9CSVQpOwotfQorI2RlZmluZSBUU05fbHRlKGEsYikJXAorCSh0eXBlY2hlY2soX191MzIsIGEpICYmIFwKKwkgdHlwZWNoZWNrKF9fdTMyLCBiKSAmJiBcCisJICgoX19zMzIpKChhKSAtIChiKSkgPD0gMCkpCiAKIC8qIENvbXBhcmUgdHdvIFNTTnMgKi8KKyNkZWZpbmUgU1NOX2x0KGEsYikJCVwKKwkodHlwZWNoZWNrKF9fdTE2LCBhKSAmJiBcCisJIHR5cGVjaGVjayhfX3UxNiwgYikgJiYgXAorCSAoKF9fczE2KSgoYSkgLSAoYikpIDwgMCkpCiAKLS8qCi0gKiBSRkMgMjk2MAotICogIDEuNiBTZXJpYWwgTnVtYmVyIEFyaXRobWV0aWMKLSAqCi0gKiBDb21wYXJpc29ucyBhbmQgYXJpdGhtZXRpYyBvbiBTdHJlYW0gU2VxdWVuY2UgTnVtYmVycyBpbiB0aGlzIGRvY3VtZW50Ci0gKiBTSE9VTEQgdXNlIFNlcmlhbCBOdW1iZXIgQXJpdGhtZXRpYyBhcyBkZWZpbmVkIGluIFtSRkMxOTgyXSB3aGVyZQotICogU0VSSUFMX0JJVFMgPSAxNi4KLSAqLwotZW51bSB7Ci0JU1NOX1NJR05fQklUID0gKDE8PDE1KQotfTsKLQotc3RhdGljIGlubGluZSBpbnQgU1NOX2x0KF9fdTE2IHMsIF9fdTE2IHQpCi17Ci0JcmV0dXJuICgocykgLSAodCkpICYgU1NOX1NJR05fQklUOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBTU05fbHRlKF9fdTE2IHMsIF9fdTE2IHQpCi17Ci0JcmV0dXJuICgocykgPT0gKHQpKSB8fCAoKChzKSAtICh0KSkgJiBTU05fU0lHTl9CSVQpOwotfQotCi0vKgotICogQURESVAgMy4xLjEKLSAqIFRoZSB2YWxpZCByYW5nZSBvZiBTZXJpYWwgTnVtYmVyIGlzIGZyb20gMCB0byA0Mjk0OTY3Mjk1ICgyKiozMiAtIDEpLiBTZXJpYWwKLSAqIE51bWJlcnMgd3JhcCBiYWNrIHRvIDAgYWZ0ZXIgcmVhY2hpbmcgNDI5NDk2NzI5NS4KLSAqLwotZW51bSB7Ci0JQURESVBfU0VSSUFMX1NJR05fQklUID0gKDE8PDMxKQotfTsKLQotc3RhdGljIGlubGluZSBpbnQgQURESVBfU0VSSUFMX2d0ZShfX3UxNiBzLCBfX3UxNiB0KQotewotCXJldHVybiAoKHMpID09ICh0KSkgfHwgKCgodCkgLSAocykpICYgQURESVBfU0VSSUFMX1NJR05fQklUKTsKLX0KKy8qIEFERElQIDMuMS4xICovCisjZGVmaW5lIEFERElQX1NFUklBTF9ndGUoYSxiKQlcCisJKHR5cGVjaGVjayhfX3UzMiwgYSkgJiYgXAorCSB0eXBlY2hlY2soX191MzIsIGIpICYmIFwKKwkgKChfX3MzMikoKGIpIC0gKGEpKSA8PSAwKSkKIAogLyogQ2hlY2sgVlRBRyBvZiB0aGUgcGFja2V0IG1hdGNoZXMgdGhlIHNlbmRlcidzIG93biB0YWcuICovCiBzdGF0aWMgaW5saW5lIGludApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmggYi9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaAppbmRleCBjZTkzYzRiLi4xMWMzYmYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaApAQCAtNTM3LDYgKzUzNyw3IEBACiBzdHJ1Y3Qgc2N0cF9kYXRhbXNnICpzY3RwX2RhdGFtc2dfZnJvbV91c2VyKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosCiAJCQkJCSAgICBzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICosCiAJCQkJCSAgICBzdHJ1Y3QgaW92X2l0ZXIgKik7Cit2b2lkIHNjdHBfZGF0YW1zZ19mcmVlKHN0cnVjdCBzY3RwX2RhdGFtc2cgKik7CiB2b2lkIHNjdHBfZGF0YW1zZ19wdXQoc3RydWN0IHNjdHBfZGF0YW1zZyAqKTsKIHZvaWQgc2N0cF9jaHVua19mYWlsKHN0cnVjdCBzY3RwX2NodW5rICosIGludCBlcnJvcik7CiBpbnQgc2N0cF9jaHVua19hYmFuZG9uZWQoc3RydWN0IHNjdHBfY2h1bmsgKik7CkBAIC01NTQsNiArNTU1LDkgQEAKIAogCWF0b21pY190IHJlZmNudDsKIAorCS8qIEhvdyBtYW55IHRpbWVzIHRoaXMgY2h1bmsgaGF2ZSBiZWVuIHNlbnQsIGZvciBwcnNjdHAgUlRYIHBvbGljeSAqLworCWludCBzZW50X2NvdW50OworCiAJLyogVGhpcyBpcyBvdXIgbGluayB0byB0aGUgcGVyLXRyYW5zcG9ydCB0cmFuc21pdHRlZCBsaXN0LiAgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHRyYW5zbWl0dGVkX2xpc3Q7CiAKQEAgLTYwMywxNiArNjA3LDYgQEAKIAkvKiBUaGlzIG5lZWRzIHRvIGJlIHJlY292ZXJhYmxlIGZvciBTQ1RQX1NFTkRfRkFJTEVEIGV2ZW50cy4gKi8KIAlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvIHNpbmZvOwogCi0JLyogV2UgdXNlIHRoaXMgZmllbGQgdG8gcmVjb3JkIHBhcmFtIGZvciBwcnNjdHAgcG9saWNpZXMsCi0JICogZm9yIFRUTCBwb2xpY3ksIGl0IGlzIHRoZSB0aW1lX3RvX2Ryb3Agb2YgdGhpcyBjaHVuaywKLQkgKiBmb3IgUlRYIHBvbGljeSwgaXQgaXMgdGhlIG1heF9zZW50X2NvdW50IG9mIHRoaXMgY2h1bmssCi0JICogZm9yIFBSSU8gcG9saWN5LCBpdCBpcyB0aGUgcHJpb3JpdHkgb2YgdGhpcyBjaHVuay4KLQkgKi8KLQl1bnNpZ25lZCBsb25nIHByc2N0cF9wYXJhbTsKLQotCS8qIEhvdyBtYW55IHRpbWVzIHRoaXMgY2h1bmsgaGF2ZSBiZWVuIHNlbnQsIGZvciBwcnNjdHAgUlRYIHBvbGljeSAqLwotCWludCBzZW50X2NvdW50OwotCiAJLyogV2hpY2ggYXNzb2NpYXRpb24gZG9lcyB0aGlzIGJlbG9uZyB0bz8gICovCiAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CiAKQEAgLTEwNzYsNyArMTA3MCw3IEBACiB2b2lkIHNjdHBfb3V0cV9pbml0KHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosIHN0cnVjdCBzY3RwX291dHEgKik7CiB2b2lkIHNjdHBfb3V0cV90ZWFyZG93bihzdHJ1Y3Qgc2N0cF9vdXRxICopOwogdm9pZCBzY3RwX291dHFfZnJlZShzdHJ1Y3Qgc2N0cF9vdXRxKik7Ci1pbnQgc2N0cF9vdXRxX3RhaWwoc3RydWN0IHNjdHBfb3V0cSAqLCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssIGdmcF90KTsKK3ZvaWQgc2N0cF9vdXRxX3RhaWwoc3RydWN0IHNjdHBfb3V0cSAqLCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssIGdmcF90KTsKIGludCBzY3RwX291dHFfc2FjayhzdHJ1Y3Qgc2N0cF9vdXRxICosIHN0cnVjdCBzY3RwX2NodW5rICopOwogaW50IHNjdHBfb3V0cV9pc19lbXB0eShjb25zdCBzdHJ1Y3Qgc2N0cF9vdXRxICopOwogdm9pZCBzY3RwX291dHFfcmVzdGFydChzdHJ1Y3Qgc2N0cF9vdXRxICopOwpAQCAtMTA4NCw3ICsxMDc4LDcgQEAKIHZvaWQgc2N0cF9yZXRyYW5zbWl0KHN0cnVjdCBzY3RwX291dHEgKiwgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICosCiAJCSAgICAgc2N0cF9yZXRyYW5zbWl0X3JlYXNvbl90KTsKIHZvaWQgc2N0cF9yZXRyYW5zbWl0X21hcmsoc3RydWN0IHNjdHBfb3V0cSAqLCBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKiwgX191OCk7Ci1pbnQgc2N0cF9vdXRxX3VuY29yayhzdHJ1Y3Qgc2N0cF9vdXRxICosIGdmcF90IGdmcCk7Cit2b2lkIHNjdHBfb3V0cV91bmNvcmsoc3RydWN0IHNjdHBfb3V0cSAqLCBnZnBfdCBnZnApOwogdm9pZCBzY3RwX3Byc2N0cF9wcnVuZShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkJICAgICAgIHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKnNpbmZvLCBpbnQgbXNnX2xlbik7CiAvKiBVbmNvcmsgYW5kIGZsdXNoIGFuIG91dHF1ZXVlLiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NvY2suaCBiL2luY2x1ZGUvbmV0L3NvY2suaAppbmRleCBmZjViZTdlLi5lYmY3NWRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvc29jay5oCkBAIC0xMDIwLDcgKzEwMjAsNiBAQAogCXZvaWQJCQkoKnVuaGFzaCkoc3RydWN0IHNvY2sgKnNrKTsKIAl2b2lkCQkJKCpyZWhhc2gpKHN0cnVjdCBzb2NrICpzayk7CiAJaW50CQkJKCpnZXRfcG9ydCkoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBzbnVtKTsKLQl2b2lkCQkJKCpjbGVhcl9zaykoc3RydWN0IHNvY2sgKnNrLCBpbnQgc2l6ZSk7CiAKIAkvKiBLZWVwaW5nIHRyYWNrIG9mIHNvY2tldHMgaW4gdXNlICovCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKQEAgLTExMTQsNiArMTExMywxNiBAQAogCSAgICAgICBza19zdHJlYW1fbWVtb3J5X2ZyZWUoc2spOwogfQogCitzdGF0aWMgaW5saW5lIGludCBza191bmRlcl9jZ3JvdXBfaGllcmFyY2h5KHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgIHN0cnVjdCBjZ3JvdXAgKmFuY2VzdG9yKQoreworI2lmZGVmIENPTkZJR19TT0NLX0NHUk9VUF9EQVRBCisJcmV0dXJuIGNncm91cF9pc19kZXNjZW5kYW50KHNvY2tfY2dyb3VwX3B0cigmc2stPnNrX2NncnBfZGF0YSksCisJCQkJICAgIGFuY2VzdG9yKTsKKyNlbHNlCisJcmV0dXJuIC1FTk9UU1VQUDsKKyNlbmRpZgorfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgc2tfaGFzX21lbW9yeV9wcmVzc3VyZShjb25zdCBzdHJ1Y3Qgc29jayAqc2spCiB7CkBAIC0xMjMyLDggKzEyNDEsNiBAQAogCXJldHVybiBzay0+c2tfcHJvdC0+aGFzaChzayk7CiB9CiAKLXZvaWQgc2tfcHJvdF9jbGVhcl9wb3J0YWRkcl9udWxscyhzdHJ1Y3Qgc29jayAqc2ssIGludCBzaXplKTsKLQogLyogQWJvdXQgMTAgc2Vjb25kcyAqLwogI2RlZmluZSBTT0NLX0RFU1RST1lfVElNRSAoMTAqSFopCiAKQEAgLTEzMzIsNiArMTMzOSwxNiBAQAogCWlmICghc2tfaGFzX2FjY291bnQoc2spKQogCQlyZXR1cm47CiAJc2stPnNrX2ZvcndhcmRfYWxsb2MgKz0gc2l6ZTsKKworCS8qIEF2b2lkIGEgcG9zc2libGUgb3ZlcmZsb3cuCisJICogVENQIHNlbmQgcXVldWVzIGNhbiBtYWtlIHRoaXMgaGFwcGVuLCBpZiBza19tZW1fcmVjbGFpbSgpCisJICogaXMgbm90IGNhbGxlZCBhbmQgbW9yZSB0aGFuIDIgR0J5dGVzIGFyZSByZWxlYXNlZCBhdCBvbmNlLgorCSAqCisJICogSWYgd2UgcmVhY2ggMiBNQnl0ZXMsIHJlY2xhaW0gMSBNQnl0ZXMgcmlnaHQgbm93LCB0aGVyZSBpcworCSAqIG5vIG5lZWQgdG8gaG9sZCB0aGF0IG11Y2ggZm9yd2FyZCBhbGxvY2F0aW9uIGFueXdheS4KKwkgKi8KKwlpZiAodW5saWtlbHkoc2stPnNrX2ZvcndhcmRfYWxsb2MgPj0gMSA8PCAyMSkpCisJCV9fc2tfbWVtX3JlY2xhaW0oc2ssIDEgPDwgMjApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2tfd21lbV9mcmVlX3NrYihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zdHJwYXJzZXIuaCBiL2luY2x1ZGUvbmV0L3N0cnBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMjhhZDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC9zdHJwYXJzZXIuaApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIFN0cmVhbSBQYXJzZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgVG9tIEhlcmJlcnQgPHRvbUBoZXJiZXJ0bGFuZC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fTkVUX1NUUlBBUlNFUl9IXworI2RlZmluZSBfX05FVF9TVFJQQVJTRVJfSF8KKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNkZWZpbmUgU1RSUF9TVEFUU19BREQoc3RhdCwgY291bnQpICgoc3RhdCkgKz0gKGNvdW50KSkKKyNkZWZpbmUgU1RSUF9TVEFUU19JTkNSKHN0YXQpICgoc3RhdCkrKykKKworc3RydWN0IHN0cnBfc3RhdHMgeworCXVuc2lnbmVkIGxvbmcgbG9uZyByeF9tc2dzOworCXVuc2lnbmVkIGxvbmcgbG9uZyByeF9ieXRlczsKKwl1bnNpZ25lZCBpbnQgcnhfbWVtX2ZhaWw7CisJdW5zaWduZWQgaW50IHJ4X25lZWRfbW9yZV9oZHI7CisJdW5zaWduZWQgaW50IHJ4X21zZ190b29fYmlnOworCXVuc2lnbmVkIGludCByeF9tc2dfdGltZW91dHM7CisJdW5zaWduZWQgaW50IHJ4X2JhZF9oZHJfbGVuOworfTsKKworc3RydWN0IHN0cnBfYWdncl9zdGF0cyB7CisJdW5zaWduZWQgbG9uZyBsb25nIHJ4X21zZ3M7CisJdW5zaWduZWQgbG9uZyBsb25nIHJ4X2J5dGVzOworCXVuc2lnbmVkIGludCByeF9tZW1fZmFpbDsKKwl1bnNpZ25lZCBpbnQgcnhfbmVlZF9tb3JlX2hkcjsKKwl1bnNpZ25lZCBpbnQgcnhfbXNnX3Rvb19iaWc7CisJdW5zaWduZWQgaW50IHJ4X21zZ190aW1lb3V0czsKKwl1bnNpZ25lZCBpbnQgcnhfYmFkX2hkcl9sZW47CisJdW5zaWduZWQgaW50IHJ4X2Fib3J0czsKKwl1bnNpZ25lZCBpbnQgcnhfaW50ZXJydXB0ZWQ7CisJdW5zaWduZWQgaW50IHJ4X3VucmVjb3ZfaW50cjsKK307CisKK3N0cnVjdCBzdHJwYXJzZXI7CisKKy8qIENhbGxiYWNrcyBhcmUgY2FsbGVkIHdpdGggbG9jayBoZWxkIGZvciB0aGUgYXR0YWNoZWQgc29ja2V0ICovCitzdHJ1Y3Qgc3RycF9jYWxsYmFja3MgeworCWludCAoKnBhcnNlX21zZykoc3RydWN0IHN0cnBhcnNlciAqc3RycCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJdm9pZCAoKnJjdl9tc2cpKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IpOworCWludCAoKnJlYWRfc29ja19kb25lKShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwLCBpbnQgZXJyKTsKKwl2b2lkICgqYWJvcnRfcGFyc2VyKShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwLCBpbnQgZXJyKTsKK307CisKK3N0cnVjdCBzdHJwX3J4X21zZyB7CisJaW50IGZ1bGxfbGVuOworCWludCBvZmZzZXQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzdHJwX3J4X21zZyAqc3RycF9yeF9tc2coc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBzdHJwX3J4X21zZyAqKSgodm9pZCAqKXNrYi0+Y2IgKworCQlvZmZzZXRvZihzdHJ1Y3QgcWRpc2Nfc2tiX2NiLCBkYXRhKSk7Cit9CisKKy8qIFN0cnVjdHVyZSBmb3IgYW4gYXR0YWNoZWQgbG93ZXIgc29ja2V0ICovCitzdHJ1Y3Qgc3RycGFyc2VyIHsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwl1MzIgcnhfc3RvcHBlZCA6IDE7CisJdTMyIHJ4X3BhdXNlZCA6IDE7CisJdTMyIHJ4X2Fib3J0ZWQgOiAxOworCXUzMiByeF9pbnRlcnJ1cHRlZCA6IDE7CisJdTMyIHJ4X3VucmVjb3ZfaW50ciA6IDE7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqKnJ4X3NrYl9uZXh0cDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCByeF9tc2dfdGltZXI7CisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYl9oZWFkOworCXVuc2lnbmVkIGludCByeF9uZWVkX2J5dGVzOworCXN0cnVjdCBkZWxheWVkX3dvcmsgcnhfZGVsYXllZF93b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCByeF93b3JrOworCXN0cnVjdCBzdHJwX3N0YXRzIHN0YXRzOworCXN0cnVjdCBzdHJwX2NhbGxiYWNrcyBjYjsKK307CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggbG9jayBoZWxkIGZvciBhdHRhY2hlZCBzb2NrZXQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzdHJwX3BhdXNlKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnApCit7CisJc3RycC0+cnhfcGF1c2VkID0gMTsKK30KKworLyogTWF5IGJlIGNhbGxlZCB3aXRob3V0IGhvbGRpbmcgbG9jayBmb3IgYXR0YWNoZWQgc29ja2V0ICovCit2b2lkIHN0cnBfdW5wYXVzZShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKTsKKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfc3RycF9zdGF0cyhzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwLAorCQkJCSAgIHN0cnVjdCBzdHJwX2FnZ3Jfc3RhdHMgKmFnZ19zdGF0cykKK3sKKwkvKiBTYXZlIHBzb2NrIHN0YXRpc3RpY3MgaW4gdGhlIG11eCB3aGVuIHBzb2NrIGlzIGJlaW5nIHVuYXR0YWNoZWQuICovCisKKyNkZWZpbmUgU0FWRV9QU09DS19TVEFUUyhfc3RhdCkgKGFnZ19zdGF0cy0+X3N0YXQgKz0JCVwKKwkJCQkgc3RycC0+c3RhdHMuX3N0YXQpCisJU0FWRV9QU09DS19TVEFUUyhyeF9tc2dzKTsKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X2J5dGVzKTsKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X21lbV9mYWlsKTsKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X25lZWRfbW9yZV9oZHIpOworCVNBVkVfUFNPQ0tfU1RBVFMocnhfbXNnX3Rvb19iaWcpOworCVNBVkVfUFNPQ0tfU1RBVFMocnhfbXNnX3RpbWVvdXRzKTsKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X2JhZF9oZHJfbGVuKTsKKyN1bmRlZiBTQVZFX1BTT0NLX1NUQVRTCisKKwlpZiAoc3RycC0+cnhfYWJvcnRlZCkKKwkJYWdnX3N0YXRzLT5yeF9hYm9ydHMrKzsKKwlpZiAoc3RycC0+cnhfaW50ZXJydXB0ZWQpCisJCWFnZ19zdGF0cy0+cnhfaW50ZXJydXB0ZWQrKzsKKwlpZiAoc3RycC0+cnhfdW5yZWNvdl9pbnRyKQorCQlhZ2dfc3RhdHMtPnJ4X3VucmVjb3ZfaW50cisrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWdncmVnYXRlX3N0cnBfc3RhdHMoc3RydWN0IHN0cnBfYWdncl9zdGF0cyAqc3RhdHMsCisJCQkJCXN0cnVjdCBzdHJwX2FnZ3Jfc3RhdHMgKmFnZ19zdGF0cykKK3sKKyNkZWZpbmUgU0FWRV9QU09DS19TVEFUUyhfc3RhdCkgKGFnZ19zdGF0cy0+X3N0YXQgKz0gc3RhdHMtPl9zdGF0KQorCVNBVkVfUFNPQ0tfU1RBVFMocnhfbXNncyk7CisJU0FWRV9QU09DS19TVEFUUyhyeF9ieXRlcyk7CisJU0FWRV9QU09DS19TVEFUUyhyeF9tZW1fZmFpbCk7CisJU0FWRV9QU09DS19TVEFUUyhyeF9uZWVkX21vcmVfaGRyKTsKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X21zZ190b29fYmlnKTsKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X21zZ190aW1lb3V0cyk7CisJU0FWRV9QU09DS19TVEFUUyhyeF9iYWRfaGRyX2xlbik7CisJU0FWRV9QU09DS19TVEFUUyhyeF9hYm9ydHMpOworCVNBVkVfUFNPQ0tfU1RBVFMocnhfaW50ZXJydXB0ZWQpOworCVNBVkVfUFNPQ0tfU1RBVFMocnhfdW5yZWNvdl9pbnRyKTsKKyN1bmRlZiBTQVZFX1BTT0NLX1NUQVRTCisKK30KKwordm9pZCBzdHJwX2RvbmUoc3RydWN0IHN0cnBhcnNlciAqc3RycCk7Cit2b2lkIHN0cnBfc3RvcChzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKTsKK3ZvaWQgc3RycF9jaGVja19yY3Yoc3RydWN0IHN0cnBhcnNlciAqc3RycCk7CitpbnQgc3RycF9pbml0KHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBzb2NrICpjc2ssCisJICAgICAgc3RydWN0IHN0cnBfY2FsbGJhY2tzICpjYik7Cit2b2lkIHN0cnBfZGF0YV9yZWFkeShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKTsKKworI2VuZGlmIC8qIF9fTkVUX1NUUlBBUlNFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc3dpdGNoZGV2LmggYi9pbmNsdWRlL25ldC9zd2l0Y2hkZXYuaAppbmRleCA2MmY2YTk2Li5lYmE4MGM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zd2l0Y2hkZXYuaAorKysgYi9pbmNsdWRlL25ldC9zd2l0Y2hkZXYuaApAQCAtNjgsNyArNjgsNiBAQAogZW51bSBzd2l0Y2hkZXZfb2JqX2lkIHsKIAlTV0lUQ0hERVZfT0JKX0lEX1VOREVGSU5FRCwKIAlTV0lUQ0hERVZfT0JKX0lEX1BPUlRfVkxBTiwKLQlTV0lUQ0hERVZfT0JKX0lEX0lQVjRfRklCLAogCVNXSVRDSERFVl9PQkpfSURfUE9SVF9GREIsCiAJU1dJVENIREVWX09CSl9JRF9QT1JUX01EQiwKIH07CkBAIC05MiwyMSArOTEsNiBAQAogI2RlZmluZSBTV0lUQ0hERVZfT0JKX1BPUlRfVkxBTihvYmopIFwKIAljb250YWluZXJfb2Yob2JqLCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X3ZsYW4sIG9iaikKIAotLyogU1dJVENIREVWX09CSl9JRF9JUFY0X0ZJQiAqLwotc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgewotCXN0cnVjdCBzd2l0Y2hkZXZfb2JqIG9iajsKLQl1MzIgZHN0OwotCWludCBkc3RfbGVuOwotCXN0cnVjdCBmaWJfaW5mbyAqZmk7Ci0JdTggdG9zOwotCXU4IHR5cGU7Ci0JdTMyIG5sZmxhZ3M7Ci0JdTMyIHRiX2lkOwotfTsKLQotI2RlZmluZSBTV0lUQ0hERVZfT0JKX0lQVjRfRklCKG9iaikgXAotCWNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliLCBvYmopCi0KIC8qIFNXSVRDSERFVl9PQkpfSURfUE9SVF9GREIgKi8KIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiIHsKIAlzdHJ1Y3Qgc3dpdGNoZGV2X29iaiBvYmo7CkBAIC0yMDksMTEgKzE5Myw2IEBACiAJCQkJICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdTE2IGZsYWdzKTsKIGludCBzd2l0Y2hkZXZfcG9ydF9icmlkZ2VfZGVsbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IG5sbXNnaGRyICpubGgsIHUxNiBmbGFncyk7Ci1pbnQgc3dpdGNoZGV2X2ZpYl9pcHY0X2FkZCh1MzIgZHN0LCBpbnQgZHN0X2xlbiwgc3RydWN0IGZpYl9pbmZvICpmaSwKLQkJCSAgIHU4IHRvcywgdTggdHlwZSwgdTMyIG5sZmxhZ3MsIHUzMiB0Yl9pZCk7Ci1pbnQgc3dpdGNoZGV2X2ZpYl9pcHY0X2RlbCh1MzIgZHN0LCBpbnQgZHN0X2xlbiwgc3RydWN0IGZpYl9pbmZvICpmaSwKLQkJCSAgIHU4IHRvcywgdTggdHlwZSwgdTMyIHRiX2lkKTsKLXZvaWQgc3dpdGNoZGV2X2ZpYl9pcHY0X2Fib3J0KHN0cnVjdCBmaWJfaW5mbyAqZmkpOwogaW50IHN3aXRjaGRldl9wb3J0X2ZkYl9hZGQoc3RydWN0IG5kbXNnICpuZG0sIHN0cnVjdCBubGF0dHIgKnRiW10sCiAJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLAogCQkJICAgdTE2IHZpZCwgdTE2IG5sbV9mbGFncyk7CkBAIC0yMjIsNyArMjAxLDcgQEAKIAkJCSAgIHUxNiB2aWQpOwogaW50IHN3aXRjaGRldl9wb3J0X2ZkYl9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpmaWx0ZXJfZGV2LCBpbnQgaWR4KTsKKwkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZmlsdGVyX2RldiwgaW50ICppZHgpOwogdm9pZCBzd2l0Y2hkZXZfcG9ydF9md2RfbWFya19zZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmdyb3VwX2RldiwKIAkJCQkgYm9vbCBqb2luaW5nKTsKQEAgLTMwNCwyNSArMjgzLDYgQEAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHN3aXRjaGRldl9maWJfaXB2NF9hZGQodTMyIGRzdCwgaW50IGRzdF9sZW4sCi0JCQkJCSBzdHJ1Y3QgZmliX2luZm8gKmZpLAotCQkJCQkgdTggdG9zLCB1OCB0eXBlLAotCQkJCQkgdTMyIG5sZmxhZ3MsIHUzMiB0Yl9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgc3dpdGNoZGV2X2ZpYl9pcHY0X2RlbCh1MzIgZHN0LCBpbnQgZHN0X2xlbiwKLQkJCQkJIHN0cnVjdCBmaWJfaW5mbyAqZmksCi0JCQkJCSB1OCB0b3MsIHU4IHR5cGUsIHUzMiB0Yl9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN3aXRjaGRldl9maWJfaXB2NF9hYm9ydChzdHJ1Y3QgZmliX2luZm8gKmZpKQotewotfQotCiBzdGF0aWMgaW5saW5lIGludCBzd2l0Y2hkZXZfcG9ydF9mZGJfYWRkKHN0cnVjdCBuZG1zZyAqbmRtLCBzdHJ1Y3QgbmxhdHRyICp0YltdLAogCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsCkBAIC0zNDIsMTUgKzMwMiw5IEBACiAJCQkJCSAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogCQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmZpbHRlcl9kZXYsCi0JCQkJCSAgaW50IGlkeCkKKwkJCQkJICBpbnQgKmlkeCkKIHsKLSAgICAgICByZXR1cm4gaWR4OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3dpdGNoZGV2X3BvcnRfZndkX21hcmtfc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZ3JvdXBfZGV2LAotCQkJCQkgICAgICAgYm9vbCBqb2luaW5nKQoteworICAgICAgIHJldHVybiAqaWR4OwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgc3dpdGNoZGV2X3BvcnRfc2FtZV9wYXJlbnRfaWQoc3RydWN0IG5ldF9kZXZpY2UgKmEsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90Y19hY3QvdGNfaWZlLmggYi9pbmNsdWRlL25ldC90Y19hY3QvdGNfaWZlLmgKaW5kZXggNTE2NGJkNy4uOWZkMmJlYTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3RjX2FjdC90Y19pZmUuaAorKysgYi9pbmNsdWRlL25ldC90Y19hY3QvdGNfaWZlLmgKQEAgLTUwLDkgKzUwLDExIEBACiBpbnQgaWZlX2FsbG9jX21ldGFfdTMyKHN0cnVjdCB0Y2ZfbWV0YV9pbmZvICptaSwgdm9pZCAqbWV0YXZhbCwgZ2ZwX3QgZ2ZwKTsKIGludCBpZmVfYWxsb2NfbWV0YV91MTYoc3RydWN0IHRjZl9tZXRhX2luZm8gKm1pLCB2b2lkICptZXRhdmFsLCBnZnBfdCBnZnApOwogaW50IGlmZV9jaGVja19tZXRhX3UzMih1MzIgbWV0YXZhbCwgc3RydWN0IHRjZl9tZXRhX2luZm8gKm1pKTsKK2ludCBpZmVfY2hlY2tfbWV0YV91MTYodTE2IG1ldGF2YWwsIHN0cnVjdCB0Y2ZfbWV0YV9pbmZvICptaSk7CiBpbnQgaWZlX2VuY29kZV9tZXRhX3UzMih1MzIgbWV0YXZhbCwgdm9pZCAqc2tiZGF0YSwgc3RydWN0IHRjZl9tZXRhX2luZm8gKm1pKTsKIGludCBpZmVfdmFsaWRhdGVfbWV0YV91MzIodm9pZCAqdmFsLCBpbnQgbGVuKTsKIGludCBpZmVfdmFsaWRhdGVfbWV0YV91MTYodm9pZCAqdmFsLCBpbnQgbGVuKTsKK2ludCBpZmVfZW5jb2RlX21ldGFfdTE2KHUxNiBtZXRhdmFsLCB2b2lkICpza2JkYXRhLCBzdHJ1Y3QgdGNmX21ldGFfaW5mbyAqbWkpOwogdm9pZCBpZmVfcmVsZWFzZV9tZXRhX2dlbihzdHJ1Y3QgdGNmX21ldGFfaW5mbyAqbWkpOwogaW50IHJlZ2lzdGVyX2lmZV9vcChzdHJ1Y3QgdGNmX21ldGFfb3BzICptb3BzKTsKIGludCB1bnJlZ2lzdGVyX2lmZV9vcChzdHJ1Y3QgdGNmX21ldGFfb3BzICptb3BzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RjX2FjdC90Y19za2Jtb2QuaCBiL2luY2x1ZGUvbmV0L3RjX2FjdC90Y19za2Jtb2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDRhMjExCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvdGNfYWN0L3RjX3NrYm1vZC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEphbWFsIEhhZGkgU2FsaW0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKi8KKworI2lmbmRlZiBfX05FVF9UQ19TS0JNT0RfSAorI2RlZmluZSBfX05FVF9UQ19TS0JNT0RfSAorCisjaW5jbHVkZSA8bmV0L2FjdF9hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfc2tibW9kLmg+CisKK3N0cnVjdCB0Y2Zfc2tibW9kX3BhcmFtcyB7CisJc3RydWN0IHJjdV9oZWFkCXJjdTsKKwl1NjQJZmxhZ3M7IC8qdXAgdG8gNjQgdHlwZXMgb2Ygb3BlcmF0aW9uczsgZXh0ZW5kIGlmIG5lZWRlZCAqLworCXU4CWV0aF9kc3RbRVRIX0FMRU5dOworCXUxNglldGhfdHlwZTsKKwl1OAlldGhfc3JjW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCB0Y2Zfc2tibW9kIHsKKwlzdHJ1Y3QgdGNfYWN0aW9uCWNvbW1vbjsKKwlzdHJ1Y3QgdGNmX3NrYm1vZF9wYXJhbXMgX19yY3UgKnNrYm1vZF9wOworfTsKKyNkZWZpbmUgdG9fc2tibW9kKGEpICgoc3RydWN0IHRjZl9za2Jtb2QgKilhKQorCisjZW5kaWYgLyogX19ORVRfVENfU0tCTU9EX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RjX2FjdC90Y190dW5uZWxfa2V5LmggYi9pbmNsdWRlL25ldC90Y19hY3QvdGNfdHVubmVsX2tleS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1M2Y4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC90Y19hY3QvdGNfdHVubmVsX2tleS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEFtaXIgVmFkYWkgPGFtaXJAdmFkYWkubWU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19ORVRfVENfVFVOTkVMX0tFWV9ICisjZGVmaW5lIF9fTkVUX1RDX1RVTk5FTF9LRVlfSAorCisjaW5jbHVkZSA8bmV0L2FjdF9hcGkuaD4KKworc3RydWN0IHRjZl90dW5uZWxfa2V5X3BhcmFtcyB7CisJc3RydWN0IHJjdV9oZWFkCQlyY3U7CisJaW50CQkJdGNmdF9hY3Rpb247CisJaW50CQkJYWN0aW9uOworCXN0cnVjdCBtZXRhZGF0YV9kc3QgICAgICp0Y2Z0X2VuY19tZXRhZGF0YTsKK307CisKK3N0cnVjdCB0Y2ZfdHVubmVsX2tleSB7CisJc3RydWN0IHRjX2FjdGlvbgkgICAgICBjb21tb247CisJc3RydWN0IHRjZl90dW5uZWxfa2V5X3BhcmFtcyBfX3JjdSAqcGFyYW1zOworfTsKKworI2RlZmluZSB0b190dW5uZWxfa2V5KGEpICgoc3RydWN0IHRjZl90dW5uZWxfa2V5ICopYSkKKworI2VuZGlmIC8qIF9fTkVUX1RDX1RVTk5FTF9LRVlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGNfYWN0L3RjX3ZsYW4uaCBiL2luY2x1ZGUvbmV0L3RjX2FjdC90Y192bGFuLmgKaW5kZXggZTI5ZjUyZS4uNDhjY2EzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGNfYWN0L3RjX3ZsYW4uaAorKysgYi9pbmNsdWRlL25ldC90Y19hY3QvdGNfdmxhbi5oCkBAIC0xMSw2ICsxMSw3IEBACiAjZGVmaW5lIF9fTkVUX1RDX1ZMQU5fSAogCiAjaW5jbHVkZSA8bmV0L2FjdF9hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfdmxhbi5oPgogCiAjZGVmaW5lIFZMQU5fRl9QT1AJCTB4MQogI2RlZmluZSBWTEFOX0ZfUFVTSAkJMHgyCkBAIC0yMCw3ICsyMSwzMiBAQAogCWludAkJCXRjZnZfYWN0aW9uOwogCXUxNgkJCXRjZnZfcHVzaF92aWQ7CiAJX19iZTE2CQkJdGNmdl9wdXNoX3Byb3RvOworCXU4CQkJdGNmdl9wdXNoX3ByaW87CiB9OwogI2RlZmluZSB0b192bGFuKGEpICgoc3RydWN0IHRjZl92bGFuICopYSkKIAorc3RhdGljIGlubGluZSBib29sIGlzX3RjZl92bGFuKGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEpCit7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCisJaWYgKGEtPm9wcyAmJiBhLT5vcHMtPnR5cGUgPT0gVENBX0FDVF9WTEFOKQorCQlyZXR1cm4gdHJ1ZTsKKyNlbmRpZgorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSB1MzIgdGNmX3ZsYW5fYWN0aW9uKGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEpCit7CisJcmV0dXJuIHRvX3ZsYW4oYSktPnRjZnZfYWN0aW9uOworfQorCitzdGF0aWMgaW5saW5lIHUxNiB0Y2Zfdmxhbl9wdXNoX3ZpZChjb25zdCBzdHJ1Y3QgdGNfYWN0aW9uICphKQoreworCXJldHVybiB0b192bGFuKGEpLT50Y2Z2X3B1c2hfdmlkOworfQorCitzdGF0aWMgaW5saW5lIF9fYmUxNiB0Y2Zfdmxhbl9wdXNoX3Byb3RvKGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEpCit7CisJcmV0dXJuIHRvX3ZsYW4oYSktPnRjZnZfcHVzaF9wcm90bzsKK30KKwogI2VuZGlmIC8qIF9fTkVUX1RDX1ZMQU5fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGNwLmggYi9pbmNsdWRlL25ldC90Y3AuaAppbmRleCBjMDBlN2Q1Li5mODNiN2YyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC90Y3AuaAorKysgYi9pbmNsdWRlL25ldC90Y3AuaApAQCAtMjI3LDEwICsyMjcsOSBAQAogI2RlZmluZQlURk9fU0VSVkVSX0NPT0tJRV9OT1RfUkVRRAkweDIwMAogCiAvKiBGb3JjZSBlbmFibGUgVEZPIG9uIGFsbCBsaXN0ZW5lcnMsIGkuZS4sIG5vdCByZXF1aXJpbmcgdGhlCi0gKiBUQ1BfRkFTVE9QRU4gc29ja2V0IG9wdGlvbi4gU09DS09QVDEvMiBkZXRlcm1pbmUgaG93IHRvIHNldCBtYXhfcWxlbi4KKyAqIFRDUF9GQVNUT1BFTiBzb2NrZXQgb3B0aW9uLgogICovCiAjZGVmaW5lCVRGT19TRVJWRVJfV09fU09DS09QVDEJMHg0MDAKLSNkZWZpbmUJVEZPX1NFUlZFUl9XT19TT0NLT1BUMgkweDgwMAogCiBleHRlcm4gc3RydWN0IGluZXRfdGltZXdhaXRfZGVhdGhfcm93IHRjcF9kZWF0aF9yb3c7CiAKQEAgLTUzNCw2ICs1MzMsOCBAQAogI2VuZGlmCiAvKiB0Y3Bfb3V0cHV0LmMgKi8KIAordTMyIHRjcF90c29fYXV0b3NpemUoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgbXNzX25vdywKKwkJICAgICBpbnQgbWluX3Rzb19zZWdzKTsKIHZvaWQgX190Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBjdXJfbXNzLAogCQkJICAgICAgIGludCBub25hZ2xlKTsKIGJvb2wgdGNwX21heV9zZW5kX25vdyhzdHJ1Y3Qgc29jayAqc2spOwpAQCAtNjA0LDggKzYwNSw2IEBACiB2b2lkIHRjcF9nZXRfaW5mbyhzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3QgdGNwX2luZm8gKik7CiAKIC8qIFJlYWQgJ3NlbmRmaWxlKCknLXN0eWxlIGZyb20gYSBUQ1Agc29ja2V0ICovCi10eXBlZGVmIGludCAoKnNrX3JlYWRfYWN0b3JfdCkocmVhZF9kZXNjcmlwdG9yX3QgKiwgc3RydWN0IHNrX2J1ZmYgKiwKLQkJCQl1bnNpZ25lZCBpbnQsIHNpemVfdCk7CiBpbnQgdGNwX3JlYWRfc29jayhzdHJ1Y3Qgc29jayAqc2ssIHJlYWRfZGVzY3JpcHRvcl90ICpkZXNjLAogCQkgIHNrX3JlYWRfYWN0b3JfdCByZWN2X2FjdG9yKTsKIApAQCAtNjQzLDcgKzY0Miw3IEBACiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAKLQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSAmJgorCWlmIChSQl9FTVBUWV9ST09UKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSAmJgogCSAgICB0cC0+cmN2X3duZCAmJgogCSAgICBhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpIDwgc2stPnNrX3JjdmJ1ZiAmJgogCSAgICAhdHAtPnVyZ19kYXRhKQpAQCAtNjc0LDcgKzY3Myw3IEBACiAvKiBNaW5pbXVtIFJUVCBpbiB1c2VjLiB+MCBtZWFucyBub3QgYXZhaWxhYmxlLiAqLwogc3RhdGljIGlubGluZSB1MzIgdGNwX21pbl9ydHQoY29uc3Qgc3RydWN0IHRjcF9zb2NrICp0cCkKIHsKLQlyZXR1cm4gdHAtPnJ0dF9taW5bMF0ucnR0OworCXJldHVybiBtaW5tYXhfZ2V0KCZ0cC0+cnR0X21pbik7CiB9CiAKIC8qIENvbXB1dGUgdGhlIGFjdHVhbCByZWNlaXZlIHdpbmRvdyB3ZSBhcmUgY3VycmVudGx5IGFkdmVydGlzaW5nLgpAQCAtNzY2LDggKzc2NSwxNiBAQAogCV9fdTMyCQlhY2tfc2VxOwkvKiBTZXF1ZW5jZSBudW1iZXIgQUNLJ2QJKi8KIAl1bmlvbiB7CiAJCXN0cnVjdCB7Ci0JCQkvKiBUaGVyZSBpcyBzcGFjZSBmb3IgdXAgdG8gMjAgYnl0ZXMgKi8KLQkJCV9fdTMyIGluX2ZsaWdodDsvKiBCeXRlcyBpbiBmbGlnaHQgd2hlbiBwYWNrZXQgc2VudCAqLworCQkJLyogVGhlcmUgaXMgc3BhY2UgZm9yIHVwIHRvIDI0IGJ5dGVzICovCisJCQlfX3UzMiBpbl9mbGlnaHQ6MzAsLyogQnl0ZXMgaW4gZmxpZ2h0IGF0IHRyYW5zbWl0ICovCisJCQkgICAgICBpc19hcHBfbGltaXRlZDoxLCAvKiBjd25kIG5vdCBmdWxseSB1c2VkPyAqLworCQkJICAgICAgdW51c2VkOjE7CisJCQkvKiBwa3RzIFMvQUNLZWQgc28gZmFyIHVwb24gdHggb2Ygc2tiLCBpbmNsIHJldHJhbnM6ICovCisJCQlfX3UzMiBkZWxpdmVyZWQ7CisJCQkvKiBzdGFydCBvZiBzZW5kIHBpcGVsaW5lIHBoYXNlICovCisJCQlzdHJ1Y3Qgc2tiX21zdGFtcCBmaXJzdF90eF9tc3RhbXA7CisJCQkvKiB3aGVuIHdlIHJlYWNoZWQgdGhlICJkZWxpdmVyZWQiIGNvdW50ICovCisJCQlzdHJ1Y3Qgc2tiX21zdGFtcCBkZWxpdmVyZWRfbXN0YW1wOwogCQl9IHR4OyAgIC8qIG9ubHkgdXNlZCBmb3Igb3V0Z29pbmcgc2ticyAqLwogCQl1bmlvbiB7CiAJCQlzdHJ1Y3QgaW5ldF9za2JfcGFybQloNDsKQEAgLTg2Myw2ICs4NzAsMjcgQEAKIAl1MzIgaW5fZmxpZ2h0OwogfTsKIAorLyogQSByYXRlIHNhbXBsZSBtZWFzdXJlcyB0aGUgbnVtYmVyIG9mIChvcmlnaW5hbC9yZXRyYW5zbWl0dGVkKSBkYXRhCisgKiBwYWNrZXRzIGRlbGl2ZXJlZCAiZGVsaXZlcmVkIiBvdmVyIGFuIGludGVydmFsIG9mIHRpbWUgImludGVydmFsX3VzIi4KKyAqIFRoZSB0Y3BfcmF0ZS5jIGNvZGUgZmlsbHMgaW4gdGhlIHJhdGUgc2FtcGxlLCBhbmQgY29uZ2VzdGlvbgorICogY29udHJvbCBtb2R1bGVzIHRoYXQgZGVmaW5lIGEgY29uZ19jb250cm9sIGZ1bmN0aW9uIHRvIHJ1biBhdCB0aGUgZW5kCisgKiBvZiBBQ0sgcHJvY2Vzc2luZyBjYW4gb3B0aW9uYWxseSBjaG9zZSB0byBjb25zdWx0IHRoaXMgc2FtcGxlIHdoZW4KKyAqIHNldHRpbmcgY3duZCBhbmQgcGFjaW5nIHJhdGUuCisgKiBBIHNhbXBsZSBpcyBpbnZhbGlkIGlmICJkZWxpdmVyZWQiIG9yICJpbnRlcnZhbF91cyIgaXMgbmVnYXRpdmUuCisgKi8KK3N0cnVjdCByYXRlX3NhbXBsZSB7CisJc3RydWN0CXNrYl9tc3RhbXAgcHJpb3JfbXN0YW1wOyAvKiBzdGFydGluZyB0aW1lc3RhbXAgZm9yIGludGVydmFsICovCisJdTMyICBwcmlvcl9kZWxpdmVyZWQ7CS8qIHRwLT5kZWxpdmVyZWQgYXQgInByaW9yX21zdGFtcCIgKi8KKwlzMzIgIGRlbGl2ZXJlZDsJCS8qIG51bWJlciBvZiBwYWNrZXRzIGRlbGl2ZXJlZCBvdmVyIGludGVydmFsICovCisJbG9uZyBpbnRlcnZhbF91czsJLyogdGltZSBmb3IgdHAtPmRlbGl2ZXJlZCB0byBpbmNyICJkZWxpdmVyZWQiICovCisJbG9uZyBydHRfdXM7CQkvKiBSVFQgb2YgbGFzdCAoUylBQ0tlZCBwYWNrZXQgKG9yIC0xKSAqLworCWludCAgbG9zc2VzOwkJLyogbnVtYmVyIG9mIHBhY2tldHMgbWFya2VkIGxvc3QgdXBvbiBBQ0sgKi8KKwl1MzIgIGFja2VkX3NhY2tlZDsJLyogbnVtYmVyIG9mIHBhY2tldHMgbmV3bHkgKFMpQUNLZWQgdXBvbiBBQ0sgKi8KKwl1MzIgIHByaW9yX2luX2ZsaWdodDsJLyogaW4gZmxpZ2h0IGJlZm9yZSB0aGlzIEFDSyAqLworCWJvb2wgaXNfYXBwX2xpbWl0ZWQ7CS8qIGlzIHNhbXBsZSBmcm9tIHBhY2tldCB3aXRoIGJ1YmJsZSBpbiBwaXBlPyAqLworCWJvb2wgaXNfcmV0cmFuczsJLyogaXMgc2FtcGxlIGZyb20gcmV0cmFuc21pc3Npb24/ICovCit9OworCiBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CiAJdTMyIGtleTsKQEAgLTg4Nyw2ICs5MTUsMTQgQEAKIAl1MzIgICgqdW5kb19jd25kKShzdHJ1Y3Qgc29jayAqc2spOwogCS8qIGhvb2sgZm9yIHBhY2tldCBhY2sgYWNjb3VudGluZyAob3B0aW9uYWwpICovCiAJdm9pZCAoKnBrdHNfYWNrZWQpKHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IGFja19zYW1wbGUgKnNhbXBsZSk7CisJLyogc3VnZ2VzdCBudW1iZXIgb2Ygc2VnbWVudHMgZm9yIGVhY2ggc2tiIHRvIHRyYW5zbWl0IChvcHRpb25hbCkgKi8KKwl1MzIgKCp0c29fc2Vnc19nb2FsKShzdHJ1Y3Qgc29jayAqc2spOworCS8qIHJldHVybnMgdGhlIG11bHRpcGxpZXIgdXNlZCBpbiB0Y3Bfc25kYnVmX2V4cGFuZCAob3B0aW9uYWwpICovCisJdTMyICgqc25kYnVmX2V4cGFuZCkoc3RydWN0IHNvY2sgKnNrKTsKKwkvKiBjYWxsIHdoZW4gcGFja2V0cyBhcmUgZGVsaXZlcmVkIHRvIHVwZGF0ZSBjd25kIGFuZCBwYWNpbmcgcmF0ZSwKKwkgKiBhZnRlciBhbGwgdGhlIGNhX3N0YXRlIHByb2Nlc3NpbmcuIChvcHRpb25hbCkKKwkgKi8KKwl2b2lkICgqY29uZ19jb250cm9sKShzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCByYXRlX3NhbXBsZSAqcnMpOwogCS8qIGdldCBpbmZvIGZvciBpbmV0X2RpYWcgKG9wdGlvbmFsKSAqLwogCXNpemVfdCAoKmdldF9pbmZvKShzdHJ1Y3Qgc29jayAqc2ssIHUzMiBleHQsIGludCAqYXR0ciwKIAkJCSAgIHVuaW9uIHRjcF9jY19pbmZvICppbmZvKTsKQEAgLTk0OSw2ICs5ODUsMTQgQEAKIAkJaWNzay0+aWNza19jYV9vcHMtPmN3bmRfZXZlbnQoc2ssIGV2ZW50KTsKIH0KIAorLyogRnJvbSB0Y3BfcmF0ZS5jICovCit2b2lkIHRjcF9yYXRlX3NrYl9zZW50KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7Cit2b2lkIHRjcF9yYXRlX3NrYl9kZWxpdmVyZWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgIHN0cnVjdCByYXRlX3NhbXBsZSAqcnMpOwordm9pZCB0Y3BfcmF0ZV9nZW4oc3RydWN0IHNvY2sgKnNrLCB1MzIgZGVsaXZlcmVkLCB1MzIgbG9zdCwKKwkJICBzdHJ1Y3Qgc2tiX21zdGFtcCAqbm93LCBzdHJ1Y3QgcmF0ZV9zYW1wbGUgKnJzKTsKK3ZvaWQgdGNwX3JhdGVfY2hlY2tfYXBwX2xpbWl0ZWQoc3RydWN0IHNvY2sgKnNrKTsKKwogLyogVGhlc2UgZnVuY3Rpb25zIGRldGVybWluZSBob3cgdGhlIGN1cnJlbnQgZmxvdyBiZWhhdmVzIGluIHJlc3BlY3Qgb2YgU0FDSwogICogaGFuZGxpbmcuIFNBQ0sgaXMgbmVnb3RpYXRlZCB3aXRoIHRoZSBwZWVyLCBhbmQgdGhlcmVmb3JlIGl0IGNhbiB2YXJ5CiAgKiBiZXR3ZWVuIGRpZmZlcmVudCBmbG93cy4KQEAgLTExNjQsNiArMTIwOCw3IEBACiB9CiAKIGJvb2wgdGNwX3ByZXF1ZXVlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7Citib29sIHRjcF9hZGRfYmFja2xvZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwogCiAjdW5kZWYgU1RBVEVfVFJBQ0UKIApAQCAtMTUyMyw2ICsxNTY4LDggQEAKIHsKIAlpZiAoc2stPnNrX3NlbmRfaGVhZCA9PSBza2JfdW5saW5rZWQpCiAJCXNrLT5za19zZW5kX2hlYWQgPSBOVUxMOworCWlmICh0Y3Bfc2soc2spLT5oaWdoZXN0X3NhY2sgPT0gc2tiX3VubGlua2VkKQorCQl0Y3Bfc2soc2spLT5oaWdoZXN0X3NhY2sgPSBOVUxMOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2luaXRfc2VuZF9oZWFkKHN0cnVjdCBzb2NrICpzaykKQEAgLTE4NTEsNiArMTg5OCw4IEBACiAJcmV0dXJuIGFuc3c7CiB9CiAKK2ludCB0Y3BfcGVla19sZW4oc3RydWN0IHNvY2tldCAqc29jayk7CisKIHN0YXRpYyBpbmxpbmUgdm9pZCB0Y3Bfc2Vnc19pbihzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXUxNiBzZWdzX2luOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdWRwLmggYi9pbmNsdWRlL25ldC91ZHAuaAppbmRleCA4ODk0ZDcxLi5lYTUzYTg3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC91ZHAuaAorKysgYi9pbmNsdWRlL25ldC91ZHAuaApAQCAtMjUxLDYgKzI1MSw3IEBACiAJCSBpbnQgKCpzYWRkcl9jbXApKGNvbnN0IHN0cnVjdCBzb2NrICosCiAJCQkJICBjb25zdCBzdHJ1Y3Qgc29jayAqKSk7CiB2b2lkIHVkcF9lcnIoc3RydWN0IHNrX2J1ZmYgKiwgdTMyKTsKK2ludCB1ZHBfYWJvcnQoc3RydWN0IHNvY2sgKnNrLCBpbnQgZXJyKTsKIGludCB1ZHBfc2VuZG1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbik7CiBpbnQgdWRwX3B1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrKTsKIHZvaWQgdWRwX2ZsdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzayk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC92eGxhbi5oIGIvaW5jbHVkZS9uZXQvdnhsYW4uaAppbmRleCBiOTZkMDM2Li4wMjU1NjEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC92eGxhbi5oCisrKyBiL2luY2x1ZGUvbmV0L3Z4bGFuLmgKQEAgLTM1MCwyNCArMzUwLDYgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIF9fYmUzMiB2eGxhbl90dW5faWRfdG9fdm5pKF9fYmU2NCB0dW5faWQpCi17Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JcmV0dXJuIChfX2ZvcmNlIF9fYmUzMil0dW5faWQ7Ci0jZWxzZQotCXJldHVybiAoX19mb3JjZSBfX2JlMzIpKChfX2ZvcmNlIHU2NCl0dW5faWQgPj4gMzIpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX19iZTY0IHZ4bGFuX3ZuaV90b190dW5faWQoX19iZTMyIHZuaSkKLXsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQlyZXR1cm4gKF9fZm9yY2UgX19iZTY0KXZuaTsKLSNlbHNlCi0JcmV0dXJuIChfX2ZvcmNlIF9fYmU2NCkoKHU2NCkoX19mb3JjZSB1MzIpdm5pIDw8IDMyKTsKLSNlbmRpZgotfQotCiBzdGF0aWMgaW5saW5lIHNpemVfdCB2eGxhbl9yY29fc3RhcnQoX19iZTMyIHZuaV9maWVsZCkKIHsKIAlyZXR1cm4gYmUzMl90b19jcHUodm5pX2ZpZWxkICYgVlhMQU5fUkNPX01BU0spIDw8IFZYTEFOX1JDT19TSElGVDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3hmcm0uaCBiL2luY2x1ZGUvbmV0L3hmcm0uaAppbmRleCBhZGZlYmQ2Li4zMTk0N2I5IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC94ZnJtLmgKKysrIGIvaW5jbHVkZS9uZXQveGZybS5oCkBAIC0xODcsNyArMTg3LDcgQEAKIAlzdHJ1Y3QgeGZybV9yZXBsYXlfc3RhdGVfZXNuICpwcmVwbGF5X2VzbjsKIAogCS8qIFRoZSBmdW5jdGlvbnMgZm9yIHJlcGxheSBkZXRlY3Rpb24uICovCi0Jc3RydWN0IHhmcm1fcmVwbGF5CSpyZXBsOworCWNvbnN0IHN0cnVjdCB4ZnJtX3JlcGxheSAqcmVwbDsKIAogCS8qIGludGVybmFsIGZsYWcgdGhhdCBvbmx5IGhvbGRzIHN0YXRlIGZvciBkZWxheWVkIGFldmVudCBhdCB0aGUKIAkgKiBtb21lbnQKQEAgLTE1NDAsOCArMTU0MCwxMCBAQAogdm9pZCB4ZnJtNF9sb2NhbF9lcnJvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgbXR1KTsKIGludCB4ZnJtNl9leHRyYWN0X2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCB4ZnJtNl9leHRyYWN0X2lucHV0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWludCB4ZnJtNl9yY3Zfc3BpKHN0cnVjdCBza19idWZmICpza2IsIGludCBuZXh0aGRyLCBfX2JlMzIgc3BpKTsKK2ludCB4ZnJtNl9yY3Zfc3BpKHN0cnVjdCBza19idWZmICpza2IsIGludCBuZXh0aGRyLCBfX2JlMzIgc3BpLAorCQkgIHN0cnVjdCBpcDZfdG5sICp0KTsKIGludCB4ZnJtNl90cmFuc3BvcnRfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IsIGludCBhc3luYyk7CitpbnQgeGZybTZfcmN2X3RubChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXA2X3RubCAqdCk7CiBpbnQgeGZybTZfcmN2KHN0cnVjdCBza19idWZmICpza2IpOwogaW50IHhmcm02X2lucHV0X2FkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgeGZybV9hZGRyZXNzX3QgKmRhZGRyLAogCQkgICAgIHhmcm1fYWRkcmVzc190ICpzYWRkciwgdTggcHJvdG8pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL2liX2hkcnMuaCBiL2luY2x1ZGUvcmRtYS9pYl9oZHJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4NDM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcmRtYS9pYl9oZHJzLmgKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBDb3B5cmlnaHQoYykgMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICogIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBJQl9IRFJTX0gKKyNkZWZpbmUgSUJfSERSU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxyZG1hL2liX3ZlcmJzLmg+CisKKyNkZWZpbmUgSUJfU0VRX05BSwkoMyA8PCAyOSkKKworLyogQUVUSCBOQUsgb3Bjb2RlIHZhbHVlcyAqLworI2RlZmluZSBJQl9STlJfTkFLICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgSUJfTkFLX1BTTl9FUlJPUiAgICAgICAgICAgICAgICAweDYwCisjZGVmaW5lIElCX05BS19JTlZBTElEX1JFUVVFU1QgICAgICAgICAgMHg2MQorI2RlZmluZSBJQl9OQUtfUkVNT1RFX0FDQ0VTU19FUlJPUiAgICAgIDB4NjIKKyNkZWZpbmUgSUJfTkFLX1JFTU9URV9PUEVSQVRJT05BTF9FUlJPUiAweDYzCisjZGVmaW5lIElCX05BS19JTlZBTElEX1JEX1JFUVVFU1QgICAgICAgMHg2NAorCisjZGVmaW5lIElCX0JUSF9SRVFfQUNLCQlCSVQoMzEpCisjZGVmaW5lIElCX0JUSF9TT0xJQ0lURUQJQklUKDIzKQorI2RlZmluZSBJQl9CVEhfTUlHX1JFUQkJQklUKDIyKQorCisjZGVmaW5lIElCX0dSSF9WRVJTSU9OCQk2CisjZGVmaW5lIElCX0dSSF9WRVJTSU9OX01BU0sJMHhGCisjZGVmaW5lIElCX0dSSF9WRVJTSU9OX1NISUZUCTI4CisjZGVmaW5lIElCX0dSSF9UQ0xBU1NfTUFTSwkweEZGCisjZGVmaW5lIElCX0dSSF9UQ0xBU1NfU0hJRlQJMjAKKyNkZWZpbmUgSUJfR1JIX0ZMT1dfTUFTSwkweEZGRkZGCisjZGVmaW5lIElCX0dSSF9GTE9XX1NISUZUCTAKKyNkZWZpbmUgSUJfR1JIX05FWFRfSERSCQkweDFCCisKK3N0cnVjdCBpYl9yZXRoIHsKKwlfX2JlNjQgdmFkZHI7ICAgICAgICAvKiBwb3RlbnRpYWxseSB1bmFsaWduZWQgKi8KKwlfX2JlMzIgcmtleTsKKwlfX2JlMzIgbGVuZ3RoOworfSBfX3BhY2tlZDsKKworc3RydWN0IGliX2F0b21pY19ldGggeworCV9fYmU2NCB2YWRkcjsgICAgICAgIC8qIHBvdGVudGlhbGx5IHVuYWxpZ25lZCAqLworCV9fYmUzMiBya2V5OworCV9fYmU2NCBzd2FwX2RhdGE7ICAgIC8qIHBvdGVudGlhbGx5IHVuYWxpZ25lZCAqLworCV9fYmU2NCBjb21wYXJlX2RhdGE7IC8qIHBvdGVudGlhbGx5IHVuYWxpZ25lZCAqLworfSBfX3BhY2tlZDsKKwordW5pb24gaWJfZWhkcnMgeworCXN0cnVjdCB7CisJCV9fYmUzMiBkZXRoWzJdOworCQlfX2JlMzIgaW1tX2RhdGE7CisJfSB1ZDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgaWJfcmV0aCByZXRoOworCQlfX2JlMzIgaW1tX2RhdGE7CisJfSByYzsKKwlzdHJ1Y3QgeworCQlfX2JlMzIgYWV0aDsKKwkJX19iZTY0IGF0b21pY19hY2tfZXRoOyAvKiBwb3RlbnRpYWxseSB1bmFsaWduZWQgKi8KKwl9IF9fcGFja2VkIGF0OworCV9fYmUzMiBpbW1fZGF0YTsKKwlfX2JlMzIgYWV0aDsKKwlfX2JlMzIgaWV0aDsKKwlzdHJ1Y3QgaWJfYXRvbWljX2V0aCBhdG9taWNfZXRoOworfSAgX19wYWNrZWQ7CisKK3N0cnVjdCBpYl9vdGhlcl9oZWFkZXJzIHsKKwlfX2JlMzIgYnRoWzNdOworCXVuaW9uIGliX2VoZHJzIHU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWJfaGVhZGVyIHsKKwlfX2JlMTYgbHJoWzRdOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBpYl9ncmggZ3JoOworCQkJc3RydWN0IGliX290aGVyX2hlYWRlcnMgb3RoOworCQl9IGw7CisJCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzIG90aDsKKwl9IHU7Cit9IF9fcGFja2VkOworCisvKiBhY2Nlc3NvcnMgZm9yIHVuYWxpZ25lZCBfX2JlNjQgaXRlbXMgKi8KKworc3RhdGljIGlubGluZSB1NjQgaWJfdTY0X2dldChfX2JlNjQgKnApCit7CisJcmV0dXJuIGdldF91bmFsaWduZWRfYmU2NChwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGliX3U2NF9wdXQodTY0IHZhbCwgX19iZTY0ICpwKQoreworCXB1dF91bmFsaWduZWRfYmU2NCh2YWwsIHApOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBnZXRfaWJfcmV0aF92YWRkcihzdHJ1Y3QgaWJfcmV0aCAqcmV0aCkKK3sKKwlyZXR1cm4gaWJfdTY0X2dldCgmcmV0aC0+dmFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2liX3JldGhfdmFkZHIodTY0IHZhbCwgc3RydWN0IGliX3JldGggKnJldGgpCit7CisJaWJfdTY0X3B1dCh2YWwsICZyZXRoLT52YWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0IGdldF9pYl9hdGV0aF92YWRkcihzdHJ1Y3QgaWJfYXRvbWljX2V0aCAqYXRldGgpCit7CisJcmV0dXJuIGliX3U2NF9nZXQoJmF0ZXRoLT52YWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfaWJfYXRldGhfdmFkZHIodTY0IHZhbCwgc3RydWN0IGliX2F0b21pY19ldGggKmF0ZXRoKQoreworCWliX3U2NF9wdXQodmFsLCAmYXRldGgtPnZhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB1NjQgZ2V0X2liX2F0ZXRoX3N3YXAoc3RydWN0IGliX2F0b21pY19ldGggKmF0ZXRoKQoreworCXJldHVybiBpYl91NjRfZ2V0KCZhdGV0aC0+c3dhcF9kYXRhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9pYl9hdGV0aF9zd2FwKHU2NCB2YWwsIHN0cnVjdCBpYl9hdG9taWNfZXRoICphdGV0aCkKK3sKKwlpYl91NjRfcHV0KHZhbCwgJmF0ZXRoLT5zd2FwX2RhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBnZXRfaWJfYXRldGhfY29tcGFyZShzdHJ1Y3QgaWJfYXRvbWljX2V0aCAqYXRldGgpCit7CisJcmV0dXJuIGliX3U2NF9nZXQoJmF0ZXRoLT5jb21wYXJlX2RhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2liX2F0ZXRoX2NvbXBhcmUodTY0IHZhbCwgc3RydWN0IGliX2F0b21pY19ldGggKmF0ZXRoKQoreworCWliX3U2NF9wdXQodmFsLCAmYXRldGgtPmNvbXBhcmVfZGF0YSk7Cit9CisKKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSUJfSERSU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3JkbWEvaWJfdmVyYnMuaCBiL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCmluZGV4IDhlOTBkZDIuLmUxZjk2NzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCisrKyBiL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCkBAIC0yMTE1LDIyICsyMTE1LDE3IEBACiAJCQkJICAgICAgIHNpemVfdCBsZW4pCiB7CiAJY29uc3Qgdm9pZCBfX3VzZXIgKnAgPSB1ZGF0YS0+aW5idWYgKyBvZmZzZXQ7Ci0JYm9vbCByZXQgPSBmYWxzZTsKKwlib29sIHJldDsKIAl1OCAqYnVmOwogCiAJaWYgKGxlbiA+IFVTSFJUX01BWCkKIAkJcmV0dXJuIGZhbHNlOwogCi0JYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwotCWlmICghYnVmKQorCWJ1ZiA9IG1lbWR1cF91c2VyKHAsIGxlbik7CisJaWYgKElTX0VSUihidWYpKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBwLCBsZW4pKQotCQlnb3RvIGZyZWU7Ci0KIAlyZXQgPSAhbWVtY2hyX2ludihidWYsIDAsIGxlbik7Ci0KLWZyZWU6CiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL3JkbWF2dF9xcC5oIGIvaW5jbHVkZS9yZG1hL3JkbWF2dF9xcC5oCmluZGV4IGJkMzRkMGIuLjJjNTE4M2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmRtYS9yZG1hdnRfcXAuaAorKysgYi9pbmNsdWRlL3JkbWEvcmRtYXZ0X3FwLmgKQEAgLTQ2Niw2ICs0NjYsMjUgQEAKIH0KIAogLyoqCisgKiBydnRfZ2V0X3FwIC0gZ2V0IGEgUVAgcmVmZXJlbmNlCisgKiBAcXAgLSB0aGUgUVAgdG8gaG9sZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcnZ0X2dldF9xcChzdHJ1Y3QgcnZ0X3FwICpxcCkKK3sKKwlhdG9taWNfaW5jKCZxcC0+cmVmY291bnQpOworfQorCisvKioKKyAqIHJ2dF9wdXRfcXAgLSByZWxlYXNlIGEgUVAgcmVmZXJlbmNlCisgKiBAcXAgLSB0aGUgUVAgdG8gcmVsZWFzZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcnZ0X3B1dF9xcChzdHJ1Y3QgcnZ0X3FwICpxcCkKK3sKKwlpZiAocXAgJiYgYXRvbWljX2RlY19hbmRfdGVzdCgmcXAtPnJlZmNvdW50KSkKKwkJd2FrZV91cCgmcXAtPndhaXQpOworfQorCisvKioKICAqIHJ2dF9xcF93cWVfcmVzZXJ2ZSAtIHJlc2VydmUgb3BlcmF0aW9uCiAgKiBAcXAgLSB0aGUgcnZ0IHFwCiAgKiBAd3FlIC0gdGhlIHNlbmQgd3FlCmRpZmYgLS1naXQgYS9pbmNsdWRlL3J4cnBjL3BhY2tldC5oIGIvaW5jbHVkZS9yeHJwYy9wYWNrZXQuaAppbmRleCBiMjAxNzQ0Li43MDNhNjRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL3J4cnBjL3BhY2tldC5oCisrKyBiL2luY2x1ZGUvcnhycGMvcGFja2V0LmgKQEAgLTI0LDYgKzI0LDcgQEAKICAqLwogc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyIHsKIAlfX2JlMzIJCWVwb2NoOwkJLyogY2xpZW50IGJvb3QgdGltZXN0YW1wICovCisjZGVmaW5lIFJYUlBDX1JBTkRPTV9FUE9DSAkweDgwMDAwMDAwCS8qIFJhbmRvbSBpZiBzZXQsIGRhdGUtYmFzZWQgaWYgbm90ICovCiAKIAlfX2JlMzIJCWNpZDsJCS8qIGNvbm5lY3Rpb24gYW5kIGNoYW5uZWwgSUQgKi8KICNkZWZpbmUgUlhSUENfTUFYQ0FMTFMJCTQJCQkvKiBtYXggYWN0aXZlIGNhbGxzIHBlciBjb25uICovCkBAIC0zMyw4ICszNCw2IEBACiAjZGVmaW5lIFJYUlBDX0NJRF9JTkMJCSgxIDw8IFJYUlBDX0NJRFNISUZUKQkvKiBjb25uZWN0aW9uIElEIGluY3JlbWVudCAqLwogCiAJX19iZTMyCQljYWxsTnVtYmVyOwkvKiBjYWxsIElEICgwIGZvciBjb25uZWN0aW9uLWxldmVsIHBhY2tldHMpICovCi0jZGVmaW5lIFJYUlBDX1BST0NFU1NfTUFYQ0FMTFMJKDE8PDIpCS8qIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxscyBwZXIgY29ubiAocG93ZXIgb2YgMikgKi8KLQogCV9fYmUzMgkJc2VxOwkJLyogc2VxdWVuY2UgbnVtYmVyIG9mIHBrdCBpbiBjYWxsIHN0cmVhbSAqLwogCV9fYmUzMgkJc2VyaWFsOwkJLyogc2VyaWFsIG51bWJlciBvZiBwa3Qgc2VudCB0byBuZXR3b3JrICovCiAKQEAgLTkyLDEwICs5MSwxNCBAQAogc3RydWN0IHJ4cnBjX2p1bWJvX2hlYWRlciB7CiAJdWludDhfdAkJZmxhZ3M7CQkvKiBwYWNrZXQgZmxhZ3MgKGFzIHBlciByeHJwY19oZWFkZXIpICovCiAJdWludDhfdAkJcGFkOwotCV9fYmUxNgkJX3JzdmQ7CQkvKiByZXNlcnZlZCAodXNlZCBieSBrZXJiZXJvcyBzZWN1cml0eSBhcyBja3N1bSkgKi8KKwl1bmlvbiB7CisJCV9fYmUxNglfcnN2ZDsJCS8qIHJlc2VydmVkICovCisJCV9fYmUxNglja3N1bTsJCS8qIGtlcmJlcm9zIHNlY3VyaXR5IGNoZWNrc3VtICovCisJfTsKIH07CiAKICNkZWZpbmUgUlhSUENfSlVNQk9fREFUQUxFTgkxNDEyCS8qIG5vbi10ZXJtaW5hbCBqdW1ibyBwYWNrZXQgZGF0YSBsZW5ndGggKi8KKyNkZWZpbmUgUlhSUENfSlVNQk9fU1VCUEtUTEVOCShSWFJQQ19KVU1CT19EQVRBTEVOICsgc2l6ZW9mKHN0cnVjdCByeHJwY19qdW1ib19oZWFkZXIpKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgpAQCAtMTIwLDYgKzEyMyw3IEBACiAjZGVmaW5lIFJYUlBDX0FDS19QSU5HX1JFU1BPTlNFCQk3CS8qIHJlc3BvbnNlIHRvIFJYUlBDX0FDS19QSU5HICovCiAjZGVmaW5lIFJYUlBDX0FDS19ERUxBWQkJCTgJLyogbm90aGluZyBoYXBwZW5lZCBzaW5jZSByZWNlaXZlZCBwYWNrZXQgKi8KICNkZWZpbmUgUlhSUENfQUNLX0lETEUJCQk5CS8qIEFDSyBkdWUgdG8gZnVsbHkgcmVjZWl2ZWQgQUNLIHdpbmRvdyAqLworI2RlZmluZSBSWFJQQ19BQ0tfX0lOVkFMSUQJCTEwCS8qIFJlcHJlc2VudGF0aW9uIG9mIGludmFsaWQgQUNLIHJlYXNvbiAqLwogCiAJdWludDhfdAkJbkFja3M7CQkvKiBudW1iZXIgb2YgQUNLcyAqLwogI2RlZmluZSBSWFJQQ19NQVhBQ0tTCTI1NQpAQCAtMTMwLDYgKzEzNCwxMyBAQAogCiB9IF9fcGFja2VkOwogCisvKiBTb21lIEFDS3MgcmVmZXIgdG8gc3BlY2lmaWMgcGFja2V0cyBhbmQgc29tZSBhcmUgZ2VuZXJhbCBhbmQgY2FuIGJlIHVwZGF0ZWQuICovCisjZGVmaW5lIFJYUlBDX0FDS19VUERBVEVBQkxFICgoMSA8PCBSWFJQQ19BQ0tfUkVRVUVTVEVEKQl8CVwKKwkJCSAgICAgICgxIDw8IFJYUlBDX0FDS19QSU5HX1JFU1BPTlNFKQl8CVwKKwkJCSAgICAgICgxIDw8IFJYUlBDX0FDS19ERUxBWSkJCXwJXAorCQkJICAgICAgKDEgPDwgUlhSUENfQUNLX0lETEUpKQorCisKIC8qCiAgKiBBQ0sgcGFja2V0cyBjYW4gaGF2ZSBhIGZ1cnRoZXIgcGllY2Ugb2YgaW5mb3JtYXRpb24gdGFnZ2VkIG9uIHRoZSBlbmQKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCmluZGV4IDBkZWU3YWYuLjdlNGNkNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKQEAgLTc3MSwxMiArNzcxLDkgQEAKIAkJc2hvc3QtPnRtZl9pbl9wcm9ncmVzczsKIH0KIAotZXh0ZXJuIGJvb2wgc2NzaV91c2VfYmxrX21xOwotCiBzdGF0aWMgaW5saW5lIGJvb2wgc2hvc3RfdXNlX2Jsa19tcShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKIHsKLQlyZXR1cm4gc2NzaV91c2VfYmxrX21xOwotCisJcmV0dXJuIHNob3N0LT51c2VfYmxrX21xOwogfQogCiBleHRlcm4gaW50IHNjc2lfcXVldWVfd29yayhzdHJ1Y3QgU2NzaV9Ib3N0ICosIHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuaAppbmRleCAxM2MwYjJiLi43M2Q4NzA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5oCkBAIC0xMSwxMiArMTEsMTIgQEAKIHN0cnVjdCByZXF1ZXN0OwogCiAjaWYgIUlTX0VOQUJMRUQoQ09ORklHX1NDU0lfU0FTX0FUVFJTKQotc3RhdGljIGlubGluZSBpbnQgaXNfc2FzX2F0dGFjaGVkKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3N0YXRpYyBpbmxpbmUgaW50IHNjc2lfaXNfc2FzX3JwaHkoY29uc3Qgc3RydWN0IGRldmljZSAqc2RldikKIHsKIAlyZXR1cm4gMDsKIH0KICNlbHNlCi1leHRlcm4gaW50IGlzX3Nhc19hdHRhY2hlZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOworZXh0ZXJuIGludCBzY3NpX2lzX3Nhc19ycGh5KGNvbnN0IHN0cnVjdCBkZXZpY2UgKik7CiAjZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQgc2FzX3Byb3RvY29sX2F0YShlbnVtIHNhc19wcm90b2NvbCBwcm90bykKQEAgLTIwMiw3ICsyMDIsNiBAQAogZXh0ZXJuIHZvaWQgc2FzX3JwaHlfcmVtb3ZlKHN0cnVjdCBzYXNfcnBoeSAqKTsKIGV4dGVybiB2b2lkIHNhc19ycGh5X2RlbGV0ZShzdHJ1Y3Qgc2FzX3JwaHkgKik7CiBleHRlcm4gdm9pZCBzYXNfcnBoeV91bmxpbmsoc3RydWN0IHNhc19ycGh5ICopOwotZXh0ZXJuIGludCBzY3NpX2lzX3Nhc19ycGh5KGNvbnN0IHN0cnVjdCBkZXZpY2UgKik7CiAKIHN0cnVjdCBzYXNfcG9ydCAqc2FzX3BvcnRfYWxsb2Moc3RydWN0IGRldmljZSAqLCBpbnQpOwogc3RydWN0IHNhc19wb3J0ICpzYXNfcG9ydF9hbGxvY19udW0oc3RydWN0IGRldmljZSAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc29jL2F0OTEvYXRtZWwtc2ZyLmggYi9pbmNsdWRlL3NvYy9hdDkxL2F0bWVsLXNmci5oCmluZGV4IDJmOWJiOTguLjUwNmVhOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc29jL2F0OTEvYXRtZWwtc2ZyLmgKKysrIGIvaW5jbHVkZS9zb2MvYXQ5MS9hdG1lbC1zZnIuaApAQCAtMTMsNiArMTMsMjAgQEAKICNpZm5kZWYgX0xJTlVYX01GRF9TWVNDT05fQVRNRUxfU0ZSX0gKICNkZWZpbmUgX0xJTlVYX01GRF9TWVNDT05fQVRNRUxfU0ZSX0gKIAorI2RlZmluZSBBVDkxX1NGUl9ERFJDRkcJCTB4MDQJLyogRERSIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKy8qIDB4MDggfiAweDBjOiBSZXNlcnZlZCAqLworI2RlZmluZSBBVDkxX1NGUl9PSENJSUNSCTB4MTAJLyogT0hDSSBJTlQgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1NGUl9PSENJSVNSCTB4MTQJLyogT0hDSSBJTlQgU3RhdHVzIFJlZ2lzdGVyICovCiAjZGVmaW5lIEFUOTFfU0ZSX0kyU0NMS1NFTAkweDkwCS8qIEkyU0MgUmVnaXN0ZXIgKi8KIAorLyogRmllbGQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQVQ5MV9PSENJSUNSX1NVU1BFTkRfQQlCSVQoOCkKKyNkZWZpbmUgQVQ5MV9PSENJSUNSX1NVU1BFTkRfQglCSVQoOSkKKyNkZWZpbmUgQVQ5MV9PSENJSUNSX1NVU1BFTkRfQwlCSVQoMTApCisKKyNkZWZpbmUgQVQ5MV9PSENJSUNSX1VTQl9TVVNQRU5ECShBVDkxX09IQ0lJQ1JfU1VTUEVORF9BIHwgXAorCQkJCQkgQVQ5MV9PSENJSUNSX1NVU1BFTkRfQiB8IFwKKwkJCQkJIEFUOTFfT0hDSUlDUl9TVVNQRU5EX0MpCisKKwogI2VuZGlmIC8qIF9MSU5VWF9NRkRfU1lTQ09OX0FUTUVMX1NGUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvYy9yb2NrY2hpcC9yb2NrY2hpcF9zaXAuaCBiL2luY2x1ZGUvc29jL3JvY2tjaGlwL3JvY2tjaGlwX3NpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjgwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvYy9yb2NrY2hpcC9yb2NrY2hpcF9zaXAuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCBGdXpob3UgUm9ja2NoaXAgRWxlY3Ryb25pY3MgQ28uLCBMdGQKKyAqIEF1dGhvcjogTGluIEh1YW5nIDxobEByb2NrLWNoaXBzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19TT0NfUk9DS0NISVBfU0lQX0gKKyNkZWZpbmUgX19TT0NfUk9DS0NISVBfU0lQX0gKKworI2RlZmluZSBST0NLQ0hJUF9TSVBfRFJBTV9GUkVRCQkJMHg4MjAwMDAwOAorI2RlZmluZSBST0NLQ0hJUF9TSVBfQ09ORklHX0RSQU1fSU5JVAkJMHgwMAorI2RlZmluZSBST0NLQ0hJUF9TSVBfQ09ORklHX0RSQU1fU0VUX1JBVEUJMHgwMQorI2RlZmluZSBST0NLQ0hJUF9TSVBfQ09ORklHX0RSQU1fUk9VTkRfUkFURQkweDAyCisjZGVmaW5lIFJPQ0tDSElQX1NJUF9DT05GSUdfRFJBTV9TRVRfQVRfU1IJMHgwMworI2RlZmluZSBST0NLQ0hJUF9TSVBfQ09ORklHX0RSQU1fR0VUX0JXCQkweDA0CisjZGVmaW5lIFJPQ0tDSElQX1NJUF9DT05GSUdfRFJBTV9HRVRfUkFURQkweDA1CisjZGVmaW5lIFJPQ0tDSElQX1NJUF9DT05GSUdfRFJBTV9DTFJfSVJRCTB4MDYKKyNkZWZpbmUgUk9DS0NISVBfU0lQX0NPTkZJR19EUkFNX1NFVF9QQVJBTQkweDA3CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9kYTcyMTkuaCBiL2luY2x1ZGUvc291bmQvZGE3MjE5LmgKaW5kZXggMDI4NzZhYy4uNDA5ZWYxMzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvZGE3MjE5LmgKKysrIGIvaW5jbHVkZS9zb3VuZC9kYTcyMTkuaApAQCAtMzQsNiArMzQsOCBAQAogc3RydWN0IGRhNzIxOV9hYWRfcGRhdGE7CiAKIHN0cnVjdCBkYTcyMTlfcGRhdGEgeworCWJvb2wgd2FrZXVwX3NvdXJjZTsKKwogCS8qIE1pYyAqLwogCWVudW0gZGE3MjE5X21pY2JpYXNfdm9sdGFnZSBtaWNiaWFzX2x2bDsKIAllbnVtIGRhNzIxOV9taWNfYW1wX2luX3NlbCBtaWNfYW1wX2luX3NlbDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvaGRhX3JlZ2lzdGVyLmggYi9pbmNsdWRlL3NvdW5kL2hkYV9yZWdpc3Rlci5oCmluZGV4IGZmMWFlY2YuLjAwMTMwNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvaGRhX3JlZ2lzdGVyLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9oZGFfcmVnaXN0ZXIuaApAQCAtODksNiArODksMTkgQEAKICNkZWZpbmUgQVpYX1JFR19TRF9CRExQTAkJMHgxOAogI2RlZmluZSBBWlhfUkVHX1NEX0JETFBVCQkweDFjCiAKKy8qIEdUUyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQVpYX1JFR19MTENICQkJMHgxNAorCisjZGVmaW5lIEFaWF9SRUdfR1RTX0JBU0UJCTB4NTIwCisKKyNkZWZpbmUgQVpYX1JFR19HVFNDQwkoQVpYX1JFR19HVFNfQkFTRSArIDB4MDApCisjZGVmaW5lIEFaWF9SRUdfV0FMRkNDCShBWlhfUkVHX0dUU19CQVNFICsgMHgwNCkKKyNkZWZpbmUgQVpYX1JFR19UU0NDTAkoQVpYX1JFR19HVFNfQkFTRSArIDB4MDgpCisjZGVmaW5lIEFaWF9SRUdfVFNDQ1UJKEFaWF9SRUdfR1RTX0JBU0UgKyAweDBDKQorI2RlZmluZSBBWlhfUkVHX0xMUEZPQwkoQVpYX1JFR19HVFNfQkFTRSArIDB4MTQpCisjZGVmaW5lIEFaWF9SRUdfTExQQ0wJKEFaWF9SRUdfR1RTX0JBU0UgKyAweDE4KQorI2RlZmluZSBBWlhfUkVHX0xMUENVCShBWlhfUkVHX0dUU19CQVNFICsgMHgxQykKKwogLyogSGFzd2VsbC9Ccm9hZHdlbGwgZGlzcGxheSBIRC1BIGNvbnRyb2xsZXIgRXh0ZW5kZWQgTW9kZSByZWdpc3RlcnMgKi8KICNkZWZpbmUgQVpYX1JFR19IU1dfRU00CQkJMHgxMDBjCiAjZGVmaW5lIEFaWF9SRUdfSFNXX0VNNQkJCTB4MTAxMApAQCAtMjQyLDYgKzI1NSwyOSBAQAogLyogSW50ZXJ2YWwgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGl0ZXJhdGluZyByZWdpc3RlciBvZmZzZXQgKi8KICNkZWZpbmUgQVpYX0RSU01fSU5URVJWQUwJCTB4MDgKIAorLyogR2xvYmFsIHRpbWUgc3luY2hyb25pemF0aW9uIHJlZ2lzdGVycyAqLworI2RlZmluZSBHVFNDQ19UU0NDRF9NQVNLCQkweDgwMDAwMDAwCisjZGVmaW5lIEdUU0NDX1RTQ0NEX1NISUZUCQlCSVQoMzEpCisjZGVmaW5lIEdUU0NDX1RTQ0NJX01BU0sJCTB4MjAKKyNkZWZpbmUgR1RTQ0NfQ0RNQVNfRE1BX0RJUl9TSElGVAk0CisKKyNkZWZpbmUgV0FMRkNDX0NJRl9NQVNLCQkJMHgxRkYKKyNkZWZpbmUgV0FMRkNDX0ZOX1NISUZUCQkJOQorI2RlZmluZSBIREFfQ0xLX0NZQ0xFU19QRVJfRlJBTUUJNTEyCisKKy8qCisgKiBBbiBlcnJvciBvY2N1cnMgbmVhciBmcmFtZSAicm9sbG92ZXIiLiBUaGUgY2xvY2tzIGluIGZyYW1lIHZhbHVlIGluZGljYXRlcworICogd2hldGhlciB0aGlzIGVycm9yIG1heSBoYXZlIG9jY3VycmVkLiBIZXJlIHdlIHVzZSB0aGUgdmFsdWUgb2YgMTAuIFBsZWFzZQorICogc2VlIHRoZSBlcnJhdGEgZm9yIHRoZSByaWdodCBudW1iZXIgWzwxMF0KKyAqLworI2RlZmluZSBIREFfTUFYX0NZQ0xFX1ZBTFVFCQk0OTkKKyNkZWZpbmUgSERBX01BWF9DWUNMRV9PRkZTRVQJCTEwCisjZGVmaW5lIEhEQV9NQVhfQ1lDTEVfUkVBRF9SRVRSWQkxMAorCisjZGVmaW5lIFRTQ0NVX0NDVV9TSElGVAkJCTMyCisjZGVmaW5lIExMUENfQ0NVX1NISUZUCQkJMzIKKworCiAvKgogICogaGVscGVycyB0byByZWFkIHRoZSBzdHJlYW0gcG9zaXRpb24KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9oZGF1ZGlvLmggYi9pbmNsdWRlL3NvdW5kL2hkYXVkaW8uaAppbmRleCA5M2U2M2M1Li41NjAwNGVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2hkYXVkaW8uaAorKysgYi9pbmNsdWRlL3NvdW5kL2hkYXVkaW8uaApAQCAtMjQ1LDYgKzI0NSwxMiBAQAogCiAvKgogICogSEQtYXVkaW8gYnVzIGJhc2UgZHJpdmVyCisgKgorICogQHBwY2FwOiBwcCBjYXBhYmlsaXRpZXMgcG9pbnRlcgorICogQHNwYmNhcDogU1BJQiBjYXBhYmlsaXRpZXMgcG9pbnRlcgorICogQG1sY2FwOiBNdWx0aUxpbmsgY2FwYWJpbGl0aWVzIHBvaW50ZXIKKyAqIEBndHNjYXA6IGd0cyBjYXBhYmlsaXRpZXMgcG9pbnRlcgorICogQGRyc21jYXA6IGRtYSByZXN1bWUgY2FwYWJpbGl0aWVzIHBvaW50ZXIKICAqLwogc3RydWN0IGhkYWNfYnVzIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CkBAIC0yNTYsNiArMjYyLDEyIEBACiAJdm9pZCBfX2lvbWVtICpyZW1hcF9hZGRyOwogCWludCBpcnE7CiAKKwl2b2lkIF9faW9tZW0gKnBwY2FwOworCXZvaWQgX19pb21lbSAqc3BiY2FwOworCXZvaWQgX19pb21lbSAqbWxjYXA7CisJdm9pZCBfX2lvbWVtICpndHNjYXA7CisJdm9pZCBfX2lvbWVtICpkcnNtY2FwOworCiAJLyogY29kZWMgbGlua2VkIGxpc3QgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGNvZGVjX2xpc3Q7CiAJdW5zaWduZWQgaW50IG51bV9jb2RlY3M7CkBAIC0zMzUsNiArMzQ3LDcgQEAKIGludCBzbmRfaGRhY19idXNfc2VuZF9jbWQoc3RydWN0IGhkYWNfYnVzICpidXMsIHVuc2lnbmVkIGludCB2YWwpOwogaW50IHNuZF9oZGFjX2J1c19nZXRfcmVzcG9uc2Uoc3RydWN0IGhkYWNfYnVzICpidXMsIHVuc2lnbmVkIGludCBhZGRyLAogCQkJICAgICAgdW5zaWduZWQgaW50ICpyZXMpOworaW50IHNuZF9oZGFjX2J1c19wYXJzZV9jYXBhYmlsaXRpZXMoc3RydWN0IGhkYWNfYnVzICpidXMpOwogaW50IHNuZF9oZGFjX2xpbmtfcG93ZXIoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgYm9vbCBlbmFibGUpOwogCiBib29sIHNuZF9oZGFjX2J1c19pbml0X2NoaXAoc3RydWN0IGhkYWNfYnVzICpidXMsIGJvb2wgZnVsbF9yZXNldCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2hkYXVkaW9fZXh0LmggYi9pbmNsdWRlL3NvdW5kL2hkYXVkaW9fZXh0LmgKaW5kZXggYjk1OTNiMi4uODY2MGE3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9oZGF1ZGlvX2V4dC5oCisrKyBiL2luY2x1ZGUvc291bmQvaGRhdWRpb19leHQuaApAQCAtOCwxMSArOCw2IEBACiAgKgogICogQGJ1czogaGRhYyBidXMKICAqIEBudW1fc3RyZWFtczogc3RyZWFtcyBzdXBwb3J0ZWQKLSAqIEBwcGNhcDogcHAgY2FwYWJpbGl0aWVzIHBvaW50ZXIKLSAqIEBzcGJjYXA6IFNQSUIgY2FwYWJpbGl0aWVzIHBvaW50ZXIKLSAqIEBtbGNhcDogTXVsdGlMaW5rIGNhcGFiaWxpdGllcyBwb2ludGVyCi0gKiBAZ3RzY2FwOiBndHMgY2FwYWJpbGl0aWVzIHBvaW50ZXIKLSAqIEBkcnNtY2FwOiBkbWEgcmVzdW1lIGNhcGFiaWxpdGllcyBwb2ludGVyCiAgKiBAaGxpbmtfbGlzdDogbGluayBsaXN0IG9mIEhEQSBsaW5rcwogICogQGxvY2s6IGxvY2sgZm9yIGxpbmsgbWdtdAogICogQGNtZF9kbWFfc3RhdGU6IHN0YXRlIG9mIGNtZCBETUFzOiBDT1JCIGFuZCBSSVJCCkBAIC0yMiwxMiArMTcsNiBAQAogCWludCBudW1fc3RyZWFtczsKIAlpbnQgaWR4OwogCi0Jdm9pZCBfX2lvbWVtICpwcGNhcDsKLQl2b2lkIF9faW9tZW0gKnNwYmNhcDsKLQl2b2lkIF9faW9tZW0gKm1sY2FwOwotCXZvaWQgX19pb21lbSAqZ3RzY2FwOwotCXZvaWQgX19pb21lbSAqZHJzbWNhcDsKLQogCXN0cnVjdCBsaXN0X2hlYWQgaGxpbmtfbGlzdDsKIAogCXN0cnVjdCBtdXRleCBsb2NrOwpAQCAtNTQsNyArNDMsNiBAQAogI2RlZmluZSBIREFfQ09ERUNfRVhUX0VOVFJZKF92aWQsIF9yZXZpZCwgX25hbWUsIF9kcnZfZGF0YSkgXAogCUhEQV9DT0RFQ19SRVZfRVhUX0VOVFJZKF92aWQsIF9yZXZpZCwgX25hbWUsIF9kcnZfZGF0YSkKIAotaW50IHNuZF9oZGFjX2V4dF9idXNfcGFyc2VfY2FwYWJpbGl0aWVzKHN0cnVjdCBoZGFjX2V4dF9idXMgKnNidXMpOwogdm9pZCBzbmRfaGRhY19leHRfYnVzX3BwY2FwX2VuYWJsZShzdHJ1Y3QgaGRhY19leHRfYnVzICpjaGlwLCBib29sIGVuYWJsZSk7CiB2b2lkIHNuZF9oZGFjX2V4dF9idXNfcHBjYXBfaW50X2VuYWJsZShzdHJ1Y3QgaGRhY19leHRfYnVzICpjaGlwLCBib29sIGVuYWJsZSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvbDMuaCBiL2luY2x1ZGUvc291bmQvbDMuaAppbmRleCA0MjNhMDhmLi4xNDcxZGEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2wzLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9sMy5oCkBAIC0yLDkgKzIsMTUgQEAKICNkZWZpbmUgX0wzX0hfIDEKIAogc3RydWN0IGwzX3BpbnMgewotCXZvaWQgKCpzZXRkYXQpKGludCk7Ci0Jdm9pZCAoKnNldGNsaykoaW50KTsKLQl2b2lkICgqc2V0bW9kZSkoaW50KTsKKwl2b2lkICgqc2V0ZGF0KShzdHJ1Y3QgbDNfcGlucyAqLCBpbnQpOworCXZvaWQgKCpzZXRjbGspKHN0cnVjdCBsM19waW5zICosIGludCk7CisJdm9pZCAoKnNldG1vZGUpKHN0cnVjdCBsM19waW5zICosIGludCk7CisKKwlpbnQgZ3Bpb19kYXRhOworCWludCBncGlvX2NsazsKKwlpbnQgZ3Bpb19tb2RlOworCWludCB1c2VfZ3Bpb3M7CisKIAlpbnQgZGF0YV9ob2xkOwogCWludCBkYXRhX3NldHVwOwogCWludCBjbG9ja19oaWdoOwpAQCAtMTMsNiArMTksOSBAQAogCWludCBtb2RlX3NldHVwOwogfTsKIAorc3RydWN0IGRldmljZTsKKwogaW50IGwzX3dyaXRlKHN0cnVjdCBsM19waW5zICphZGFwLCB1OCBhZGRyLCB1OCAqZGF0YSwgaW50IGxlbik7CitpbnQgbDNfc2V0X2dwaW9fb3BzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGwzX3BpbnMgKmFkYXApOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvcnQ1NjYwLmggYi9pbmNsdWRlL3NvdW5kL3J0NTY2MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NWY4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kL3J0NTY2MC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBsaW51eC9zb3VuZC9ydDU2NjAuaCAtLSBQbGF0Zm9ybSBkYXRhIGZvciBSVDU2NjAKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4KKyAqIEF1dGhvcjogT2RlciBDaGlvdSA8b2Rlcl9jaGlvdUByZWFsdGVrLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9TTkRfUlQ1NjYwX0gKKyNkZWZpbmUgX19MSU5VWF9TTkRfUlQ1NjYwX0gKKworZW51bSBydDU2NjBfZG1pYzFfZGF0YV9waW4geworCVJUNTY2MF9ETUlDMV9OVUxMLAorCVJUNTY2MF9ETUlDMV9EQVRBX0dQSU8yLAorCVJUNTY2MF9ETUlDMV9EQVRBX0lOMVAsCit9OworCitzdHJ1Y3QgcnQ1NjYwX3BsYXRmb3JtX2RhdGEgeworCS8qIElOMSAmIElOMyBjYW4gb3B0aW9uYWxseSBiZSBkaWZmZXJlbnRpYWwgKi8KKwlib29sIGluMV9kaWZmOworCWJvb2wgaW4zX2RpZmY7CisJYm9vbCB1c2VfbGRvMjsKKwlib29sIHBvd2Vyb2ZmX2NvZGVjX2luX3N1c3BlbmQ7CisKKwllbnVtIHJ0NTY2MF9kbWljMV9kYXRhX3BpbiBkbWljMV9kYXRhX3BpbjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zM2MyNHh4X3VkYTEzNHguaCBiL2luY2x1ZGUvc291bmQvczNjMjR4eF91ZGExMzR4LmgKaW5kZXggMzNkZjRjYi4uZmZhZjFmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zM2MyNHh4X3VkYTEzNHguaAorKysgYi9pbmNsdWRlL3NvdW5kL3MzYzI0eHhfdWRhMTM0eC5oCkBAIC03LDcgKzcsNiBAQAogCWludCBsM19jbGs7CiAJaW50IGwzX21vZGU7CiAJaW50IGwzX2RhdGE7Ci0Jdm9pZCAoKnBvd2VyKSAoaW50KTsKIAlpbnQgbW9kZWw7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NpbXBsZV9jYXJkX3V0aWxzLmggYi9pbmNsdWRlL3NvdW5kL3NpbXBsZV9jYXJkX3V0aWxzLmgKaW5kZXggODYwODhhZS4uZmQ2NDEyNTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc2ltcGxlX2NhcmRfdXRpbHMuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NpbXBsZV9jYXJkX3V0aWxzLmgKQEAgLTI3LDEwICsyNyw0NSBAQAogCQkJCSAgc3RydWN0IGRldmljZV9ub2RlICpjb2RlYywKIAkJCQkgIGNoYXIgKnByZWZpeCwKIAkJCQkgIHVuc2lnbmVkIGludCAqcmV0Zm10KTsKK19fcHJpbnRmKDMsIDQpCiBpbnQgYXNvY19zaW1wbGVfY2FyZF9zZXRfZGFpbGlua19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgICBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmssCiAJCQkJICAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pOwogaW50IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2FyZF9uYW1lKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsCiAJCQkJICAgICBjaGFyICpwcmVmaXgpOwogCisjZGVmaW5lIGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2xrX2NwdShub2RlLCBkYWlfbGluaywgc2ltcGxlX2RhaSkJCVwKKwlhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2Nsayhub2RlLCBkYWlfbGluay0+Y3B1X29mX25vZGUsIHNpbXBsZV9kYWkpCisjZGVmaW5lIGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2xrX2NvZGVjKG5vZGUsIGRhaV9saW5rLCBzaW1wbGVfZGFpKQkJXAorCWFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2xrKG5vZGUsIGRhaV9saW5rLT5jb2RlY19vZl9ub2RlLCBzaW1wbGVfZGFpKQoraW50IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2xrKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRhaV9vZl9ub2RlLAorCQkJICAgICAgIHN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKnNpbXBsZV9kYWkpOworCisjZGVmaW5lIGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY3B1KG5vZGUsIGRhaV9saW5rLAkJCQlcCisJCQkJICAgbGlzdF9uYW1lLCBjZWxsc19uYW1lLCBpc19zaW5nbGVfbGluaykJXAorCWFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfZGFpKG5vZGUsICZkYWlfbGluay0+Y3B1X29mX25vZGUsCQlcCisJCSZkYWlfbGluay0+Y3B1X2RhaV9uYW1lLCBsaXN0X25hbWUsIGNlbGxzX25hbWUsIGlzX3NpbmdsZV9saW5rKQorI2RlZmluZSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2NvZGVjKG5vZGUsIGRhaV9saW5rLCBsaXN0X25hbWUsIGNlbGxzX25hbWUpCVwKKwlhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2RhaShub2RlLCAmZGFpX2xpbmstPmNvZGVjX29mX25vZGUsCQlcCisJCSZkYWlfbGluay0+Y29kZWNfZGFpX25hbWUsIGxpc3RfbmFtZSwgY2VsbHNfbmFtZSwgTlVMTCkKKyNkZWZpbmUgYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9wbGF0Zm9ybShub2RlLCBkYWlfbGluaywgbGlzdF9uYW1lLCBjZWxsc19uYW1lKQlcCisJYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9kYWkobm9kZSwgJmRhaV9saW5rLT5wbGF0Zm9ybV9vZl9ub2RlLAkJXAorCQlOVUxMLCBsaXN0X25hbWUsIGNlbGxzX25hbWUsIE5VTEwpCitpbnQgYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9kYWkoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCSAgc3RydWN0IGRldmljZV9ub2RlICoqZW5kcG9pbnRfbnAsCisJCQkJICBjb25zdCBjaGFyICoqZGFpX25hbWUsCisJCQkJICBjb25zdCBjaGFyICpsaXN0X25hbWUsCisJCQkJICBjb25zdCBjaGFyICpjZWxsc19uYW1lLAorCQkJCSAgaW50ICppc19zaW5nbGVfbGlua3MpOworCitpbnQgYXNvY19zaW1wbGVfY2FyZF9pbml0X2RhaShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCSAgICAgIHN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKnNpbXBsZV9kYWkpOworCitpbnQgYXNvY19zaW1wbGVfY2FyZF9jYW5vbmljYWxpemVfZGFpbGluayhzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmspOwordm9pZCBhc29jX3NpbXBsZV9jYXJkX2Nhbm9uaWNhbGl6ZV9jcHUoc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rLAorCQkJCSAgICAgIGludCBpc19zaW5nbGVfbGlua3MpOworCitpbnQgYXNvY19zaW1wbGVfY2FyZF9jbGVhbl9yZWZlcmVuY2Uoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCk7CisKICNlbmRpZiAvKiBfX1NJTVBMRV9DQVJEX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MuaCBiL2luY2x1ZGUvc291bmQvc29jLmgKaW5kZXggNjE0NDg4Mi4uNGYxYzc4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zb2MuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NvYy5oCkBAIC04OTgsMTQgKzg5OCw2IEBACiAJaW50ICgqcmVzdW1lKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqKTsKIAlzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyIGNvbXBvbmVudF9kcml2ZXI7CiAKLQkvKiBEZWZhdWx0IGNvbnRyb2wgYW5kIHNldHVwLCBhZGRlZCBhZnRlciBwcm9iZSgpIGlzIHJ1biAqLwotCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpjb250cm9sczsKLQlpbnQgbnVtX2NvbnRyb2xzOwotCWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpkYXBtX3dpZGdldHM7Ci0JaW50IG51bV9kYXBtX3dpZGdldHM7Ci0JY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSAqZGFwbV9yb3V0ZXM7Ci0JaW50IG51bV9kYXBtX3JvdXRlczsKLQogCS8qIGNvZGVjIHdpZGUgb3BlcmF0aW9ucyAqLwogCWludCAoKnNldF9zeXNjbGspKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCSAgaW50IGNsa19pZCwgaW50IHNvdXJjZSwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpOwpAQCAtMTU0NywxNyArMTUzOSw2IEBACiAJcmV0dXJuIHNuZF9zb2NfY29tcG9uZW50X2dldF9kcnZkYXRhKCZwbGF0Zm9ybS0+Y29tcG9uZW50KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNuZF9zb2NfcGNtX3NldF9kcnZkYXRhKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCi0JCXZvaWQgKmRhdGEpCi17Ci0JZGV2X3NldF9kcnZkYXRhKHJ0ZC0+ZGV2LCBkYXRhKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkICpzbmRfc29jX3BjbV9nZXRfZHJ2ZGF0YShzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXJldHVybiBkZXZfZ2V0X2RydmRhdGEocnRkLT5kZXYpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgc25kX3NvY19pbml0aWFsaXplX2NhcmRfbGlzdHMoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKIHsKIAlJTklUX0xJU1RfSEVBRCgmY2FyZC0+Y29kZWNfZGV2X2xpc3QpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC90bHYuaCBiL2luY2x1ZGUvc291bmQvdGx2LmgKaW5kZXggZGY5N2QxOS4uMzY3N2ViYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC90bHYuaAorKysgYi9pbmNsdWRlL3NvdW5kL3Rsdi5oCkBAIC0yMiw2NyArMjIsMzkgQEAKICAqCiAgKi8KIAotLyoKLSAqIFRMViBzdHJ1Y3R1cmUgaXMgcmlnaHQgYmVoaW5kIHRoZSBzdHJ1Y3Qgc25kX2N0bF90bHY6Ci0gKiAgIHVuc2lnbmVkIGludCB0eXBlICAJLSBzZWUgU05EUlZfQ1RMX1RMVlRfKgotICogICB1bnNpZ25lZCBpbnQgbGVuZ3RoCi0gKiAgIC4uLi4gZGF0YSBhbGlnbmVkIHRvIHNpemVvZih1bnNpZ25lZCBpbnQpLCB1c2UKLSAqICAgICAgICBibG9ja19sZW5ndGggPSAobGVuZ3RoICsgKHNpemVvZih1bnNpZ25lZCBpbnQpIC0gMSkpICYKLSAqICAgICAgICAgICAgICAgICAgICAgICB+KHNpemVvZih1bnNpZ25lZCBpbnQpIC0gMSkpIC4uLi4KLSAqLwotCiAjaW5jbHVkZSA8dWFwaS9zb3VuZC90bHYuaD4KIAotI2RlZmluZSBUTFZfSVRFTSh0eXBlLCAuLi4pIFwKLQkodHlwZSksIFRMVl9MRU5HVEgoX19WQV9BUkdTX18pLCBfX1ZBX0FSR1NfXwotI2RlZmluZSBUTFZfTEVOR1RIKC4uLikgXAotCSgodW5zaWduZWQgaW50KXNpemVvZigoY29uc3QgdW5zaWduZWQgaW50W10pIHsgX19WQV9BUkdTX18gfSkpCisvKiBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCB0aGVzZSBtYWNyb3MgYXJlIGFsaWFzZXMgdG8gdGhlIG9uZXMgaW4gVUFQSS4gKi8KKyNkZWZpbmUgVExWX0lURU0JCQlTTkRSVl9DVExfVExWRF9JVEVNCisjZGVmaW5lIFRMVl9MRU5HVEgJCQlTTkRSVl9DVExfVExWRF9MRU5HVEgKIAotI2RlZmluZSBUTFZfQ09OVEFJTkVSX0lURU0oLi4uKSBcCi0JVExWX0lURU0oU05EUlZfQ1RMX1RMVlRfQ09OVEFJTkVSLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgREVDTEFSRV9UTFZfQ09OVEFJTkVSKG5hbWUsIC4uLikgXAotCXVuc2lnbmVkIGludCBuYW1lW10gPSB7IFRMVl9DT05UQUlORVJfSVRFTShfX1ZBX0FSR1NfXykgfQorI2RlZmluZSBUTFZfQ09OVEFJTkVSX0lURU0JCVNORFJWX0NUTF9UTFZEX0NPTlRBSU5FUl9JVEVNCisjZGVmaW5lIERFQ0xBUkVfVExWX0NPTlRBSU5FUgkJU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9DT05UQUlORVIKIAotI2RlZmluZSBUTFZfREJfU0NBTEVfTUFTSwkweGZmZmYKLSNkZWZpbmUgVExWX0RCX1NDQUxFX01VVEUJMHgxMDAwMAotI2RlZmluZSBUTFZfREJfU0NBTEVfSVRFTShtaW4sIHN0ZXAsIG11dGUpCQkJXAotCVRMVl9JVEVNKFNORFJWX0NUTF9UTFZUX0RCX1NDQUxFLAkJCVwKLQkJIChtaW4pLAkJCQkJXAotCQkgKChzdGVwKSAmIFRMVl9EQl9TQ0FMRV9NQVNLKSB8CQlcCi0JCQkoKG11dGUpID8gVExWX0RCX1NDQUxFX01VVEUgOiAwKSkKLSNkZWZpbmUgREVDTEFSRV9UTFZfREJfU0NBTEUobmFtZSwgbWluLCBzdGVwLCBtdXRlKSBcCi0JdW5zaWduZWQgaW50IG5hbWVbXSA9IHsgVExWX0RCX1NDQUxFX0lURU0obWluLCBzdGVwLCBtdXRlKSB9CisjZGVmaW5lIFRMVl9EQl9TQ0FMRV9NQVNLCQlTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9NQVNLCisjZGVmaW5lIFRMVl9EQl9TQ0FMRV9NVVRFCQlTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9NVVRFCisjZGVmaW5lIFRMVl9EQl9TQ0FMRV9JVEVNCQlTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9JVEVNCisjZGVmaW5lIERFQ0xBUkVfVExWX0RCX1NDQUxFCQlTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1NDQUxFCiAKLS8qIGRCIHNjYWxlIHNwZWNpZmllZCB3aXRoIG1pbi9tYXggdmFsdWVzIGluc3RlYWQgb2Ygc3RlcCAqLwotI2RlZmluZSBUTFZfREJfTUlOTUFYX0lURU0obWluX2RCLCBtYXhfZEIpCQkJXAotCVRMVl9JVEVNKFNORFJWX0NUTF9UTFZUX0RCX01JTk1BWCwgKG1pbl9kQiksIChtYXhfZEIpKQotI2RlZmluZSBUTFZfREJfTUlOTUFYX01VVEVfSVRFTShtaW5fZEIsIG1heF9kQikJCQlcCi0JVExWX0lURU0oU05EUlZfQ1RMX1RMVlRfREJfTUlOTUFYX01VVEUsIChtaW5fZEIpLCAobWF4X2RCKSkKLSNkZWZpbmUgREVDTEFSRV9UTFZfREJfTUlOTUFYKG5hbWUsIG1pbl9kQiwgbWF4X2RCKSBcCi0JdW5zaWduZWQgaW50IG5hbWVbXSA9IHsgVExWX0RCX01JTk1BWF9JVEVNKG1pbl9kQiwgbWF4X2RCKSB9Ci0jZGVmaW5lIERFQ0xBUkVfVExWX0RCX01JTk1BWF9NVVRFKG5hbWUsIG1pbl9kQiwgbWF4X2RCKSBcCi0JdW5zaWduZWQgaW50IG5hbWVbXSA9IHsgVExWX0RCX01JTk1BWF9NVVRFX0lURU0obWluX2RCLCBtYXhfZEIpIH0KKyNkZWZpbmUgVExWX0RCX01JTk1BWF9JVEVNCQlTTkRSVl9DVExfVExWRF9EQl9NSU5NQVhfSVRFTQorI2RlZmluZSBUTFZfREJfTUlOTUFYX01VVEVfSVRFTQkJU05EUlZfQ1RMX1RMVkRfREJfTUlOTUFYX01VVEVfSVRFTQorI2RlZmluZSBERUNMQVJFX1RMVl9EQl9NSU5NQVgJCVNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfTUlOTUFYCisjZGVmaW5lIERFQ0xBUkVfVExWX0RCX01JTk1BWF9NVVRFCVNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfTUlOTUFYX01VVEUKIAotLyogbGluZWFyIHZvbHVtZSBiZXR3ZWVuIG1pbl9kQiBhbmQgbWF4X2RCICguMDFkQiB1bml0KSAqLwotI2RlZmluZSBUTFZfREJfTElORUFSX0lURU0obWluX2RCLCBtYXhfZEIpCQkgICAgXAotCVRMVl9JVEVNKFNORFJWX0NUTF9UTFZUX0RCX0xJTkVBUiwgKG1pbl9kQiksIChtYXhfZEIpKQotI2RlZmluZSBERUNMQVJFX1RMVl9EQl9MSU5FQVIobmFtZSwgbWluX2RCLCBtYXhfZEIpCVwKLQl1bnNpZ25lZCBpbnQgbmFtZVtdID0geyBUTFZfREJfTElORUFSX0lURU0obWluX2RCLCBtYXhfZEIpIH0KKyNkZWZpbmUgVExWX0RCX0xJTkVBUl9JVEVNCQlTTkRSVl9DVExfVExWRF9EQl9MSU5FQVJfSVRFTQorI2RlZmluZSBERUNMQVJFX1RMVl9EQl9MSU5FQVIJCVNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfTElORUFSCiAKLS8qIGRCIHJhbmdlIGNvbnRhaW5lcjoKLSAqIEl0ZW1zIGluIGRCIHJhbmdlIGNvbnRhaW5lciBtdXN0IGJlIG9yZGVyZWQgYnkgdGhlaXIgdmFsdWVzIGFuZCBieSB0aGVpcgotICogZEIgdmFsdWVzLiBUaGlzIGltcGxpZXMgdGhhdCBsYXJnZXIgdmFsdWVzIG11c3QgY29ycmVzcG9uZCB3aXRoIGxhcmdlcgotICogZEIgdmFsdWVzICh3aGljaCBpcyBhbHNvIHJlcXVpcmVkIGZvciBhbGwgb3RoZXIgbWl4ZXIgY29udHJvbHMpLgorI2RlZmluZSBUTFZfREJfUkFOR0VfSVRFTQkJU05EUlZfQ1RMX1RMVkRfREJfUkFOR0VfSVRFTQorI2RlZmluZSBERUNMQVJFX1RMVl9EQl9SQU5HRQkJU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9SQU5HRQorCisjZGVmaW5lIFRMVl9EQl9HQUlOX01VVEUJCVNORFJWX0NUTF9UTFZEX0RCX0dBSU5fTVVURQorCisvKgorICogVGhlIGJlbG93IGFzc3VtZXMgdGhhdCBlYWNoIGl0ZW0gVExWIGlzIDQgd29yZHMgbGlrZSBEQl9TQ0FMRSBvciBMSU5FQVIuCisgKiBUaGlzIGlzIGFuIG9sZCBmYXNpb24gYW5kIG9ic29sZXRlZCBieSBjb21taXQgYmYxZDFjOWI2MTc5KCJBTFNBOiB0bHY6IGFkZAorICogREVDTEFSRV9UTFZfREJfUkFOR0UoKSIpLgogICovCi0vKiBFYWNoIGl0ZW0gaXM6IDxtaW4+IDxtYXg+IDxUTFY+ICovCi0jZGVmaW5lIFRMVl9EQl9SQU5HRV9JVEVNKC4uLikgXAotCVRMVl9JVEVNKFNORFJWX0NUTF9UTFZUX0RCX1JBTkdFLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgREVDTEFSRV9UTFZfREJfUkFOR0UobmFtZSwgLi4uKSBcCi0JdW5zaWduZWQgaW50IG5hbWVbXSA9IHsgVExWX0RCX1JBTkdFX0lURU0oX19WQV9BUkdTX18pIH0KLS8qIFRoZSBiZWxvdyBhc3N1bWVzIHRoYXQgZWFjaCBpdGVtIFRMViBpcyA0IHdvcmRzIGxpa2UgREJfU0NBTEUgb3IgTElORUFSICovCi0jZGVmaW5lIFRMVl9EQl9SQU5HRV9IRUFEKG51bSkJCQlcCisjZGVmaW5lIFRMVl9EQl9SQU5HRV9IRUFEKG51bSkgXAogCVNORFJWX0NUTF9UTFZUX0RCX1JBTkdFLCA2ICogKG51bSkgKiBzaXplb2YodW5zaWduZWQgaW50KQogCi0jZGVmaW5lIFRMVl9EQl9HQUlOX01VVEUJLTk5OTk5OTkKLQogI2VuZGlmIC8qIF9fU09VTkRfVExWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2NwdWhwLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9jcHVocC5oCmluZGV4IGE3MmJkOTMuLjk5Njk1M2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2NwdWhwLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvY3B1aHAuaApAQCAtMzMsNiArMzMsMzQgQEAKIAkJICBfX2VudHJ5LT5jcHUsIF9fZW50cnktPnRhcmdldCwgX19lbnRyeS0+aWR4LCBfX2VudHJ5LT5mdW4pCiApOwogCitUUkFDRV9FVkVOVChjcHVocF9tdWx0aV9lbnRlciwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBjcHUsCisJCSBpbnQgdGFyZ2V0LAorCQkgaW50IGlkeCwKKwkJIGludCAoKmZ1bikodW5zaWduZWQgaW50LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqKSwKKwkJIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKSwKKworCVRQX0FSR1MoY3B1LCB0YXJnZXQsIGlkeCwgZnVuLCBub2RlKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwJY3B1CQkpCisJCV9fZmllbGQoIGludCwJCXRhcmdldAkJKQorCQlfX2ZpZWxkKCBpbnQsCQlpZHgJCSkKKwkJX19maWVsZCggdm9pZCAqLAlmdW4JCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmNwdQk9IGNwdTsKKwkJX19lbnRyeS0+dGFyZ2V0CT0gdGFyZ2V0OworCQlfX2VudHJ5LT5pZHgJPSBpZHg7CisJCV9fZW50cnktPmZ1bgk9IGZ1bjsKKwkpLAorCisJVFBfcHJpbnRrKCJjcHU6ICUwNHUgdGFyZ2V0OiAlM2Qgc3RlcDogJTNkICglcGYpIiwKKwkJICBfX2VudHJ5LT5jcHUsIF9fZW50cnktPnRhcmdldCwgX19lbnRyeS0+aWR4LCBfX2VudHJ5LT5mdW4pCispOworCiBUUkFDRV9FVkVOVChjcHVocF9leGl0LAogCiAJVFBfUFJPVE8odW5zaWduZWQgaW50IGNwdSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL21jZS5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvbWNlLmgKaW5kZXggNGNiYmNlZi4uNzBmMDIxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvbWNlLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvbWNlLmgKQEAgLTIwLDYgKzIwLDggQEAKIAkJX19maWVsZCgJdTY0LAkJc3RhdHVzCQkpCiAJCV9fZmllbGQoCXU2NCwJCWFkZHIJCSkKIAkJX19maWVsZCgJdTY0LAkJbWlzYwkJKQorCQlfX2ZpZWxkKAl1NjQsCQlzeW5kCQkpCisJCV9fZmllbGQoCXU2NCwJCWlwaWQJCSkKIAkJX19maWVsZCgJdTY0LAkJaXAJCSkKIAkJX19maWVsZCgJdTY0LAkJdHNjCQkpCiAJCV9fZmllbGQoCXU2NCwJCXdhbGx0aW1lCSkKQEAgLTM4LDYgKzQwLDggQEAKIAkJX19lbnRyeS0+c3RhdHVzCQk9IG0tPnN0YXR1czsKIAkJX19lbnRyeS0+YWRkcgkJPSBtLT5hZGRyOwogCQlfX2VudHJ5LT5taXNjCQk9IG0tPm1pc2M7CisJCV9fZW50cnktPnN5bmQJCT0gbS0+c3luZDsKKwkJX19lbnRyeS0+aXBpZAkJPSBtLT5pcGlkOwogCQlfX2VudHJ5LT5pcAkJPSBtLT5pcDsKIAkJX19lbnRyeS0+dHNjCQk9IG0tPnRzYzsKIAkJX19lbnRyeS0+d2FsbHRpbWUJPSBtLT50aW1lOwpAQCAtNTAsMTEgKzU0LDEyIEBACiAJCV9fZW50cnktPmNwdXZlbmRvcgk9IG0tPmNwdXZlbmRvcjsKIAkpLAogCi0JVFBfcHJpbnRrKCJDUFU6ICVkLCBNQ0djL3M6ICVsbHgvJWxseCwgTUMlZDogJTAxNkx4LCBBRERSL01JU0M6ICUwMTZMeC8lMDE2THgsIFJJUDogJTAyeDo8JTAxNkx4PiwgVFNDOiAlbGx4LCBQUk9DRVNTT1I6ICV1OiV4LCBUSU1FOiAlbGx1LCBTT0NLRVQ6ICV1LCBBUElDOiAleCIsCisJVFBfcHJpbnRrKCJDUFU6ICVkLCBNQ0djL3M6ICVsbHgvJWxseCwgTUMlZDogJTAxNkx4LCBJUElEOiAlMDE2THgsIEFERFIvTUlTQy9TWU5EOiAlMDE2THgvJTAxNkx4LyUwMTZMeCwgUklQOiAlMDJ4OjwlMDE2THg+LCBUU0M6ICVsbHgsIFBST0NFU1NPUjogJXU6JXgsIFRJTUU6ICVsbHUsIFNPQ0tFVDogJXUsIEFQSUM6ICV4IiwKIAkJX19lbnRyeS0+Y3B1LAogCQlfX2VudHJ5LT5tY2djYXAsIF9fZW50cnktPm1jZ3N0YXR1cywKIAkJX19lbnRyeS0+YmFuaywgX19lbnRyeS0+c3RhdHVzLAotCQlfX2VudHJ5LT5hZGRyLCBfX2VudHJ5LT5taXNjLAorCQlfX2VudHJ5LT5pcGlkLAorCQlfX2VudHJ5LT5hZGRyLCBfX2VudHJ5LT5taXNjLCBfX2VudHJ5LT5zeW5kLAogCQlfX2VudHJ5LT5jcywgX19lbnRyeS0+aXAsCiAJCV9fZW50cnktPnRzYywKIAkJX19lbnRyeS0+Y3B1dmVuZG9yLCBfX2VudHJ5LT5jcHVpZCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3Bvd2VyLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9wb3dlci5oCmluZGV4IDE5ZTUwMzAuLjU0ZTNhYWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3Bvd2VyLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvcG93ZXIuaApAQCAtNjksNyArNjksOCBAQAogCQl1NjQgbXBlcmYsCiAJCXU2NCBhcGVyZiwKIAkJdTY0IHRzYywKLQkJdTMyIGZyZXEKKwkJdTMyIGZyZXEsCisJCXUzMiBpb19ib29zdAogCQkpLAogCiAJVFBfQVJHUyhjb3JlX2J1c3ksCkBAIC03OSw3ICs4MCw4IEBACiAJCW1wZXJmLAogCQlhcGVyZiwKIAkJdHNjLAotCQlmcmVxCisJCWZyZXEsCisJCWlvX2Jvb3N0CiAJCSksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KApAQCAtOTEsNiArOTMsNyBAQAogCQlfX2ZpZWxkKHU2NCwgYXBlcmYpCiAJCV9fZmllbGQodTY0LCB0c2MpCiAJCV9fZmllbGQodTMyLCBmcmVxKQorCQlfX2ZpZWxkKHUzMiwgaW9fYm9vc3QpCiAJCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKQEAgLTEwMiw5ICsxMDUsMTAgQEAKIAkJX19lbnRyeS0+YXBlcmYgPSBhcGVyZjsKIAkJX19lbnRyeS0+dHNjID0gdHNjOwogCQlfX2VudHJ5LT5mcmVxID0gZnJlcTsKKwkJX19lbnRyeS0+aW9fYm9vc3QgPSBpb19ib29zdDsKIAkJKSwKIAotCVRQX3ByaW50aygiY29yZV9idXN5PSVsdSBzY2FsZWQ9JWx1IGZyb209JWx1IHRvPSVsdSBtcGVyZj0lbGx1IGFwZXJmPSVsbHUgdHNjPSVsbHUgZnJlcT0lbHUgIiwKKwlUUF9wcmludGsoImNvcmVfYnVzeT0lbHUgc2NhbGVkPSVsdSBmcm9tPSVsdSB0bz0lbHUgbXBlcmY9JWxsdSBhcGVyZj0lbGx1IHRzYz0lbGx1IGZyZXE9JWx1IGlvX2Jvb3N0PSVsdSIsCiAJCSh1bnNpZ25lZCBsb25nKV9fZW50cnktPmNvcmVfYnVzeSwKIAkJKHVuc2lnbmVkIGxvbmcpX19lbnRyeS0+c2NhbGVkX2J1c3ksCiAJCSh1bnNpZ25lZCBsb25nKV9fZW50cnktPmZyb20sCkBAIC0xMTIsNyArMTE2LDggQEAKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5tcGVyZiwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5hcGVyZiwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT50c2MsCi0JCSh1bnNpZ25lZCBsb25nKV9fZW50cnktPmZyZXEKKwkJKHVuc2lnbmVkIGxvbmcpX19lbnRyeS0+ZnJlcSwKKwkJKHVuc2lnbmVkIGxvbmcpX19lbnRyeS0+aW9fYm9vc3QKIAkJKQogCiApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvcnhycGMuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3J4cnBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4M2U1ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3J4cnBjLmgKQEAgLTAsMCArMSw2MjUgQEAKKy8qIEFGX1JYUlBDIHRyYWNlcG9pbnRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSByeHJwYworCisjaWYgIWRlZmluZWQoX1RSQUNFX1JYUlBDX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9UUkFDRV9SWFJQQ19ICisKKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKK1RSQUNFX0VWRU5UKHJ4cnBjX2Nvbm4sCisJICAgIFRQX1BST1RPKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLCBlbnVtIHJ4cnBjX2Nvbm5fdHJhY2Ugb3AsCisJCSAgICAgaW50IHVzYWdlLCBjb25zdCB2b2lkICp3aGVyZSksCisKKwkgICAgVFBfQVJHUyhjb25uLCBvcCwgdXNhZ2UsIHdoZXJlKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqLAljb25uCQkpCisJCSAgICBfX2ZpZWxkKGludCwJCQlvcAkJKQorCQkgICAgX19maWVsZChpbnQsCQkJdXNhZ2UJCSkKKwkJICAgIF9fZmllbGQoY29uc3Qgdm9pZCAqLAkJd2hlcmUJCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPmNvbm4gPSBjb25uOworCQkgICAgX19lbnRyeS0+b3AgPSBvcDsKKwkJICAgIF9fZW50cnktPnVzYWdlID0gdXNhZ2U7CisJCSAgICBfX2VudHJ5LT53aGVyZSA9IHdoZXJlOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoIkM9JXAgJXMgdT0lZCBzcD0lcFNSIiwKKwkJICAgICAgX19lbnRyeS0+Y29ubiwKKwkJICAgICAgcnhycGNfY29ubl90cmFjZXNbX19lbnRyeS0+b3BdLAorCQkgICAgICBfX2VudHJ5LT51c2FnZSwKKwkJICAgICAgX19lbnRyeS0+d2hlcmUpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX2NsaWVudCwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sIGludCBjaGFubmVsLAorCQkgICAgIGVudW0gcnhycGNfY2xpZW50X3RyYWNlIG9wKSwKKworCSAgICBUUF9BUkdTKGNvbm4sIGNoYW5uZWwsIG9wKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqLAljb25uCQkpCisJCSAgICBfX2ZpZWxkKHUzMiwJCQljaWQJCSkKKwkJICAgIF9fZmllbGQoaW50LAkJCWNoYW5uZWwJCSkKKwkJICAgIF9fZmllbGQoaW50LAkJCXVzYWdlCQkpCisJCSAgICBfX2ZpZWxkKGVudW0gcnhycGNfY2xpZW50X3RyYWNlLAlvcAkJKQorCQkgICAgX19maWVsZChlbnVtIHJ4cnBjX2Nvbm5fY2FjaGVfc3RhdGUsIGNzCQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBfX2VudHJ5LT5jb25uID0gY29ubjsKKwkJICAgIF9fZW50cnktPmNoYW5uZWwgPSBjaGFubmVsOworCQkgICAgX19lbnRyeS0+dXNhZ2UgPSBhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpOworCQkgICAgX19lbnRyeS0+b3AgPSBvcDsKKwkJICAgIF9fZW50cnktPmNpZCA9IGNvbm4tPnByb3RvLmNpZDsKKwkJICAgIF9fZW50cnktPmNzID0gY29ubi0+Y2FjaGVfc3RhdGU7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiQz0lcCBoPSUyZCAlcyAlcyBpPSUwOHggdT0lZCIsCisJCSAgICAgIF9fZW50cnktPmNvbm4sCisJCSAgICAgIF9fZW50cnktPmNoYW5uZWwsCisJCSAgICAgIHJ4cnBjX2NsaWVudF90cmFjZXNbX19lbnRyeS0+b3BdLAorCQkgICAgICByeHJwY19jb25uX2NhY2hlX3N0YXRlc1tfX2VudHJ5LT5jc10sCisJCSAgICAgIF9fZW50cnktPmNpZCwKKwkJICAgICAgX19lbnRyeS0+dXNhZ2UpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX2NhbGwsCisJICAgIFRQX1BST1RPKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBlbnVtIHJ4cnBjX2NhbGxfdHJhY2Ugb3AsCisJCSAgICAgaW50IHVzYWdlLCBjb25zdCB2b2lkICp3aGVyZSwgY29uc3Qgdm9pZCAqYXV4KSwKKworCSAgICBUUF9BUkdTKGNhbGwsIG9wLCB1c2FnZSwgd2hlcmUsIGF1eCksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IHJ4cnBjX2NhbGwgKiwJY2FsbAkJKQorCQkgICAgX19maWVsZChpbnQsCQkJb3AJCSkKKwkJICAgIF9fZmllbGQoaW50LAkJCXVzYWdlCQkpCisJCSAgICBfX2ZpZWxkKGNvbnN0IHZvaWQgKiwJCXdoZXJlCQkpCisJCSAgICBfX2ZpZWxkKGNvbnN0IHZvaWQgKiwJCWF1eAkJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+Y2FsbCA9IGNhbGw7CisJCSAgICBfX2VudHJ5LT5vcCA9IG9wOworCQkgICAgX19lbnRyeS0+dXNhZ2UgPSB1c2FnZTsKKwkJICAgIF9fZW50cnktPndoZXJlID0gd2hlcmU7CisJCSAgICBfX2VudHJ5LT5hdXggPSBhdXg7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiYz0lcCAlcyB1PSVkIHNwPSVwU1IgYT0lcCIsCisJCSAgICAgIF9fZW50cnktPmNhbGwsCisJCSAgICAgIHJ4cnBjX2NhbGxfdHJhY2VzW19fZW50cnktPm9wXSwKKwkJICAgICAgX19lbnRyeS0+dXNhZ2UsCisJCSAgICAgIF9fZW50cnktPndoZXJlLAorCQkgICAgICBfX2VudHJ5LT5hdXgpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX3NrYiwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSByeHJwY19za2JfdHJhY2Ugb3AsCisJCSAgICAgaW50IHVzYWdlLCBpbnQgbW9kX2NvdW50LCBjb25zdCB2b2lkICp3aGVyZSksCisKKwkgICAgVFBfQVJHUyhza2IsIG9wLCB1c2FnZSwgbW9kX2NvdW50LCB3aGVyZSksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IHNrX2J1ZmYgKiwJCXNrYgkJKQorCQkgICAgX19maWVsZChlbnVtIHJ4cnBjX3NrYl90cmFjZSwJb3AJCSkKKwkJICAgIF9fZmllbGQoaW50LAkJCXVzYWdlCQkpCisJCSAgICBfX2ZpZWxkKGludCwJCQltb2RfY291bnQJKQorCQkgICAgX19maWVsZChjb25zdCB2b2lkICosCQl3aGVyZQkJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+c2tiID0gc2tiOworCQkgICAgX19lbnRyeS0+b3AgPSBvcDsKKwkJICAgIF9fZW50cnktPnVzYWdlID0gdXNhZ2U7CisJCSAgICBfX2VudHJ5LT5tb2RfY291bnQgPSBtb2RfY291bnQ7CisJCSAgICBfX2VudHJ5LT53aGVyZSA9IHdoZXJlOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoInM9JXAgJXMgdT0lZCBtPSVkIHA9JXBTUiIsCisJCSAgICAgIF9fZW50cnktPnNrYiwKKwkJICAgICAgcnhycGNfc2tiX3RyYWNlc1tfX2VudHJ5LT5vcF0sCisJCSAgICAgIF9fZW50cnktPnVzYWdlLAorCQkgICAgICBfX2VudHJ5LT5tb2RfY291bnQsCisJCSAgICAgIF9fZW50cnktPndoZXJlKQorCSAgICApOworCitUUkFDRV9FVkVOVChyeHJwY19yeF9wYWNrZXQsCisJICAgIFRQX1BST1RPKHN0cnVjdCByeHJwY19za2JfcHJpdiAqc3ApLAorCisJICAgIFRQX0FSR1Moc3ApLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkX3N0cnVjdChzdHJ1Y3QgcnhycGNfaG9zdF9oZWFkZXIsCWhkcgkJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgbWVtY3B5KCZfX2VudHJ5LT5oZHIsICZzcC0+aGRyLCBzaXplb2YoX19lbnRyeS0+aGRyKSk7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiJTA4eDolMDh4OiUwOHg6JTA0eCAlMDh4ICUwOHggJTAyeCAlMDJ4ICVzIiwKKwkJICAgICAgX19lbnRyeS0+aGRyLmVwb2NoLCBfX2VudHJ5LT5oZHIuY2lkLAorCQkgICAgICBfX2VudHJ5LT5oZHIuY2FsbE51bWJlciwgX19lbnRyeS0+aGRyLnNlcnZpY2VJZCwKKwkJICAgICAgX19lbnRyeS0+aGRyLnNlcmlhbCwgX19lbnRyeS0+aGRyLnNlcSwKKwkJICAgICAgX19lbnRyeS0+aGRyLnR5cGUsIF9fZW50cnktPmhkci5mbGFncywKKwkJICAgICAgX19lbnRyeS0+aGRyLnR5cGUgPD0gMTUgPyByeHJwY19wa3RzW19fZW50cnktPmhkci50eXBlXSA6ICI/VU5LIikKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfcnhfZG9uZSwKKwkgICAgVFBfUFJPVE8oaW50IHJlc3VsdCwgaW50IGFib3J0X2NvZGUpLAorCisJICAgIFRQX0FSR1MocmVzdWx0LCBhYm9ydF9jb2RlKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChpbnQsCQkJcmVzdWx0CQkpCisJCSAgICBfX2ZpZWxkKGludCwJCQlhYm9ydF9jb2RlCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPnJlc3VsdCA9IHJlc3VsdDsKKwkJICAgIF9fZW50cnktPmFib3J0X2NvZGUgPSBhYm9ydF9jb2RlOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoInI9JWQgYT0lZCIsIF9fZW50cnktPnJlc3VsdCwgX19lbnRyeS0+YWJvcnRfY29kZSkKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfYWJvcnQsCisJICAgIFRQX1BST1RPKGNvbnN0IGNoYXIgKndoeSwgdTMyIGNpZCwgdTMyIGNhbGxfaWQsIHJ4cnBjX3NlcV90IHNlcSwKKwkJICAgICBpbnQgYWJvcnRfY29kZSwgaW50IGVycm9yKSwKKworCSAgICBUUF9BUkdTKHdoeSwgY2lkLCBjYWxsX2lkLCBzZXEsIGFib3J0X2NvZGUsIGVycm9yKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19hcnJheShjaGFyLAkJCXdoeSwgNAkJKQorCQkgICAgX19maWVsZCh1MzIsCQkJY2lkCQkpCisJCSAgICBfX2ZpZWxkKHUzMiwJCQljYWxsX2lkCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcV90LAkJc2VxCQkpCisJCSAgICBfX2ZpZWxkKGludCwJCQlhYm9ydF9jb2RlCSkKKwkJICAgIF9fZmllbGQoaW50LAkJCWVycm9yCQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBtZW1jcHkoX19lbnRyeS0+d2h5LCB3aHksIDQpOworCQkgICAgX19lbnRyeS0+Y2lkID0gY2lkOworCQkgICAgX19lbnRyeS0+Y2FsbF9pZCA9IGNhbGxfaWQ7CisJCSAgICBfX2VudHJ5LT5hYm9ydF9jb2RlID0gYWJvcnRfY29kZTsKKwkJICAgIF9fZW50cnktPmVycm9yID0gZXJyb3I7CisJCSAgICBfX2VudHJ5LT5zZXEgPSBzZXE7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiJTA4eDolMDh4IHM9JXUgYT0lZCBlPSVkICVzIiwKKwkJICAgICAgX19lbnRyeS0+Y2lkLCBfX2VudHJ5LT5jYWxsX2lkLCBfX2VudHJ5LT5zZXEsCisJCSAgICAgIF9fZW50cnktPmFib3J0X2NvZGUsIF9fZW50cnktPmVycm9yLCBfX2VudHJ5LT53aHkpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX3RyYW5zbWl0LAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgZW51bSByeHJwY190cmFuc21pdF90cmFjZSB3aHkpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgd2h5KSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY2FsbCAqLAljYWxsCQkpCisJCSAgICBfX2ZpZWxkKGVudW0gcnhycGNfdHJhbnNtaXRfdHJhY2UsCXdoeQkJKQorCQkgICAgX19maWVsZChyeHJwY19zZXFfdCwJCXR4X2hhcmRfYWNrCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VxX3QsCQl0eF90b3AJCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPmNhbGwgPSBjYWxsOworCQkgICAgX19lbnRyeS0+d2h5ID0gd2h5OworCQkgICAgX19lbnRyeS0+dHhfaGFyZF9hY2sgPSBjYWxsLT50eF9oYXJkX2FjazsKKwkJICAgIF9fZW50cnktPnR4X3RvcCA9IGNhbGwtPnR4X3RvcDsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCJjPSVwICVzIGY9JTA4eCBuPSV1IiwKKwkJICAgICAgX19lbnRyeS0+Y2FsbCwKKwkJICAgICAgcnhycGNfdHJhbnNtaXRfdHJhY2VzW19fZW50cnktPndoeV0sCisJCSAgICAgIF9fZW50cnktPnR4X2hhcmRfYWNrICsgMSwKKwkJICAgICAgX19lbnRyeS0+dHhfdG9wIC0gX19lbnRyeS0+dHhfaGFyZF9hY2spCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX3J4X2FjaywKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHJ4cnBjX3NlcV90IGZpcnN0LCB1OCByZWFzb24sIHU4IG5fYWNrcyksCisKKwkgICAgVFBfQVJHUyhjYWxsLCBmaXJzdCwgcmVhc29uLCBuX2Fja3MpLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHN0cnVjdCByeHJwY19jYWxsICosCWNhbGwJCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VxX3QsCQlmaXJzdAkJKQorCQkgICAgX19maWVsZCh1OCwJCQkJcmVhc29uCQkpCisJCSAgICBfX2ZpZWxkKHU4LAkJCQluX2Fja3MJCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPmNhbGwgPSBjYWxsOworCQkgICAgX19lbnRyeS0+Zmlyc3QgPSBmaXJzdDsKKwkJICAgIF9fZW50cnktPnJlYXNvbiA9IHJlYXNvbjsKKwkJICAgIF9fZW50cnktPm5fYWNrcyA9IG5fYWNrczsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCJjPSVwICVzIGY9JTA4eCBuPSV1IiwKKwkJICAgICAgX19lbnRyeS0+Y2FsbCwKKwkJICAgICAgcnhycGNfYWNrX25hbWVzW19fZW50cnktPnJlYXNvbl0sCisJCSAgICAgIF9fZW50cnktPmZpcnN0LAorCQkgICAgICBfX2VudHJ5LT5uX2Fja3MpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX3R4X2RhdGEsCisJICAgIFRQX1BST1RPKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCByeHJwY19zZXFfdCBzZXEsCisJCSAgICAgcnhycGNfc2VyaWFsX3Qgc2VyaWFsLCB1OCBmbGFncywgYm9vbCByZXRyYW5zLCBib29sIGxvc2UpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgc2VxLCBzZXJpYWwsIGZsYWdzLCByZXRyYW5zLCBsb3NlKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY2FsbCAqLAljYWxsCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcV90LAkJc2VxCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcmlhbF90LAkJc2VyaWFsCQkpCisJCSAgICBfX2ZpZWxkKHU4LAkJCQlmbGFncwkJKQorCQkgICAgX19maWVsZChib29sLAkJCXJldHJhbnMJCSkKKwkJICAgIF9fZmllbGQoYm9vbCwJCQlsb3NlCQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBfX2VudHJ5LT5jYWxsID0gY2FsbDsKKwkJICAgIF9fZW50cnktPnNlcSA9IHNlcTsKKwkJICAgIF9fZW50cnktPnNlcmlhbCA9IHNlcmlhbDsKKwkJICAgIF9fZW50cnktPmZsYWdzID0gZmxhZ3M7CisJCSAgICBfX2VudHJ5LT5yZXRyYW5zID0gcmV0cmFuczsKKwkJICAgIF9fZW50cnktPmxvc2UgPSBsb3NlOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImM9JXAgREFUQSAlMDh4IHE9JTA4eCBmbD0lMDJ4JXMlcyIsCisJCSAgICAgIF9fZW50cnktPmNhbGwsCisJCSAgICAgIF9fZW50cnktPnNlcmlhbCwKKwkJICAgICAgX19lbnRyeS0+c2VxLAorCQkgICAgICBfX2VudHJ5LT5mbGFncywKKwkJICAgICAgX19lbnRyeS0+cmV0cmFucyA/ICIgKlJFVFJBTlMqIiA6ICIiLAorCQkgICAgICBfX2VudHJ5LT5sb3NlID8gIiAqTE9TRSoiIDogIiIpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX3R4X2FjaywKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHJ4cnBjX3NlcmlhbF90IHNlcmlhbCwKKwkJICAgICByeHJwY19zZXFfdCBhY2tfZmlyc3QsIHJ4cnBjX3NlcmlhbF90IGFja19zZXJpYWwsCisJCSAgICAgdTggcmVhc29uLCB1OCBuX2Fja3MpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgc2VyaWFsLCBhY2tfZmlyc3QsIGFja19zZXJpYWwsIHJlYXNvbiwgbl9hY2tzKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY2FsbCAqLAljYWxsCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcmlhbF90LAkJc2VyaWFsCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcV90LAkJYWNrX2ZpcnN0CSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VyaWFsX3QsCQlhY2tfc2VyaWFsCSkKKwkJICAgIF9fZmllbGQodTgsCQkJCXJlYXNvbgkJKQorCQkgICAgX19maWVsZCh1OCwJCQkJbl9hY2tzCQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBfX2VudHJ5LT5jYWxsID0gY2FsbDsKKwkJICAgIF9fZW50cnktPnNlcmlhbCA9IHNlcmlhbDsKKwkJICAgIF9fZW50cnktPmFja19maXJzdCA9IGFja19maXJzdDsKKwkJICAgIF9fZW50cnktPmFja19zZXJpYWwgPSBhY2tfc2VyaWFsOworCQkgICAgX19lbnRyeS0+cmVhc29uID0gcmVhc29uOworCQkgICAgX19lbnRyeS0+bl9hY2tzID0gbl9hY2tzOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoIiBjPSVwIEFDSyAgJTA4eCAlcyBmPSUwOHggcj0lMDh4IG49JXUiLAorCQkgICAgICBfX2VudHJ5LT5jYWxsLAorCQkgICAgICBfX2VudHJ5LT5zZXJpYWwsCisJCSAgICAgIHJ4cnBjX2Fja19uYW1lc1tfX2VudHJ5LT5yZWFzb25dLAorCQkgICAgICBfX2VudHJ5LT5hY2tfZmlyc3QsCisJCSAgICAgIF9fZW50cnktPmFja19zZXJpYWwsCisJCSAgICAgIF9fZW50cnktPm5fYWNrcykKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfcmVjZWl2ZSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGVudW0gcnhycGNfcmVjZWl2ZV90cmFjZSB3aHksCisJCSAgICAgcnhycGNfc2VyaWFsX3Qgc2VyaWFsLCByeHJwY19zZXFfdCBzZXEpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgd2h5LCBzZXJpYWwsIHNlcSksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IHJ4cnBjX2NhbGwgKiwJY2FsbAkJKQorCQkgICAgX19maWVsZChlbnVtIHJ4cnBjX3JlY2VpdmVfdHJhY2UsCXdoeQkJKQorCQkgICAgX19maWVsZChyeHJwY19zZXJpYWxfdCwJCXNlcmlhbAkJKQorCQkgICAgX19maWVsZChyeHJwY19zZXFfdCwJCXNlcQkJKQorCQkgICAgX19maWVsZChyeHJwY19zZXFfdCwJCWhhcmRfYWNrCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VxX3QsCQl0b3AJCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPmNhbGwgPSBjYWxsOworCQkgICAgX19lbnRyeS0+d2h5ID0gd2h5OworCQkgICAgX19lbnRyeS0+c2VyaWFsID0gc2VyaWFsOworCQkgICAgX19lbnRyeS0+c2VxID0gc2VxOworCQkgICAgX19lbnRyeS0+aGFyZF9hY2sgPSBjYWxsLT5yeF9oYXJkX2FjazsKKwkJICAgIF9fZW50cnktPnRvcCA9IGNhbGwtPnJ4X3RvcDsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCJjPSVwICVzIHI9JTA4eCBxPSUwOHggdz0lMDh4LSUwOHgiLAorCQkgICAgICBfX2VudHJ5LT5jYWxsLAorCQkgICAgICByeHJwY19yZWNlaXZlX3RyYWNlc1tfX2VudHJ5LT53aHldLAorCQkgICAgICBfX2VudHJ5LT5zZXJpYWwsCisJCSAgICAgIF9fZW50cnktPnNlcSwKKwkJICAgICAgX19lbnRyeS0+aGFyZF9hY2ssCisJCSAgICAgIF9fZW50cnktPnRvcCkKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfcmVjdm1zZywKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGVudW0gcnhycGNfcmVjdm1zZ190cmFjZSB3aHksCisJCSAgICAgcnhycGNfc2VxX3Qgc2VxLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuLAorCQkgICAgIGludCByZXQpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgd2h5LCBzZXEsIG9mZnNldCwgbGVuLCByZXQpLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHN0cnVjdCByeHJwY19jYWxsICosCWNhbGwJCSkKKwkJICAgIF9fZmllbGQoZW51bSByeHJwY19yZWN2bXNnX3RyYWNlLAl3aHkJCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VxX3QsCQlzZXEJCSkKKwkJICAgIF9fZmllbGQodW5zaWduZWQgaW50LAkJb2Zmc2V0CQkpCisJCSAgICBfX2ZpZWxkKHVuc2lnbmVkIGludCwJCWxlbgkJKQorCQkgICAgX19maWVsZChpbnQsCQkJcmV0CQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBfX2VudHJ5LT5jYWxsID0gY2FsbDsKKwkJICAgIF9fZW50cnktPndoeSA9IHdoeTsKKwkJICAgIF9fZW50cnktPnNlcSA9IHNlcTsKKwkJICAgIF9fZW50cnktPm9mZnNldCA9IG9mZnNldDsKKwkJICAgIF9fZW50cnktPmxlbiA9IGxlbjsKKwkJICAgIF9fZW50cnktPnJldCA9IHJldDsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCJjPSVwICVzIHE9JTA4eCBvPSV1IGw9JXUgcmV0PSVkIiwKKwkJICAgICAgX19lbnRyeS0+Y2FsbCwKKwkJICAgICAgcnhycGNfcmVjdm1zZ190cmFjZXNbX19lbnRyeS0+d2h5XSwKKwkJICAgICAgX19lbnRyeS0+c2VxLAorCQkgICAgICBfX2VudHJ5LT5vZmZzZXQsCisJCSAgICAgIF9fZW50cnktPmxlbiwKKwkJICAgICAgX19lbnRyeS0+cmV0KQorCSAgICApOworCitUUkFDRV9FVkVOVChyeHJwY19ydHRfdHgsCisJICAgIFRQX1BST1RPKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBlbnVtIHJ4cnBjX3J0dF90eF90cmFjZSB3aHksCisJCSAgICAgcnhycGNfc2VyaWFsX3Qgc2VuZF9zZXJpYWwpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgd2h5LCBzZW5kX3NlcmlhbCksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IHJ4cnBjX2NhbGwgKiwJY2FsbAkJKQorCQkgICAgX19maWVsZChlbnVtIHJ4cnBjX3J0dF90eF90cmFjZSwJd2h5CQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcmlhbF90LAkJc2VuZF9zZXJpYWwJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+Y2FsbCA9IGNhbGw7CisJCSAgICBfX2VudHJ5LT53aHkgPSB3aHk7CisJCSAgICBfX2VudHJ5LT5zZW5kX3NlcmlhbCA9IHNlbmRfc2VyaWFsOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImM9JXAgJXMgc3I9JTA4eCIsCisJCSAgICAgIF9fZW50cnktPmNhbGwsCisJCSAgICAgIHJ4cnBjX3J0dF90eF90cmFjZXNbX19lbnRyeS0+d2h5XSwKKwkJICAgICAgX19lbnRyeS0+c2VuZF9zZXJpYWwpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX3J0dF9yeCwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGVudW0gcnhycGNfcnR0X3J4X3RyYWNlIHdoeSwKKwkJICAgICByeHJwY19zZXJpYWxfdCBzZW5kX3NlcmlhbCwgcnhycGNfc2VyaWFsX3QgcmVzcF9zZXJpYWwsCisJCSAgICAgczY0IHJ0dCwgdTggbnIsIHM2NCBhdmcpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgd2h5LCBzZW5kX3NlcmlhbCwgcmVzcF9zZXJpYWwsIHJ0dCwgbnIsIGF2ZyksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IHJ4cnBjX2NhbGwgKiwJY2FsbAkJKQorCQkgICAgX19maWVsZChlbnVtIHJ4cnBjX3J0dF9yeF90cmFjZSwJd2h5CQkpCisJCSAgICBfX2ZpZWxkKHU4LAkJCQlucgkJKQorCQkgICAgX19maWVsZChyeHJwY19zZXJpYWxfdCwJCXNlbmRfc2VyaWFsCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VyaWFsX3QsCQlyZXNwX3NlcmlhbAkpCisJCSAgICBfX2ZpZWxkKHM2NCwJCQlydHQJCSkKKwkJICAgIF9fZmllbGQodTY0LAkJCWF2ZwkJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+Y2FsbCA9IGNhbGw7CisJCSAgICBfX2VudHJ5LT53aHkgPSB3aHk7CisJCSAgICBfX2VudHJ5LT5zZW5kX3NlcmlhbCA9IHNlbmRfc2VyaWFsOworCQkgICAgX19lbnRyeS0+cmVzcF9zZXJpYWwgPSByZXNwX3NlcmlhbDsKKwkJICAgIF9fZW50cnktPnJ0dCA9IHJ0dDsKKwkJICAgIF9fZW50cnktPm5yID0gbnI7CisJCSAgICBfX2VudHJ5LT5hdmcgPSBhdmc7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiYz0lcCAlcyBzcj0lMDh4IHJyPSUwOHggcnR0PSVsbGQgbnI9JXUgYXZnPSVsbGQiLAorCQkgICAgICBfX2VudHJ5LT5jYWxsLAorCQkgICAgICByeHJwY19ydHRfcnhfdHJhY2VzW19fZW50cnktPndoeV0sCisJCSAgICAgIF9fZW50cnktPnNlbmRfc2VyaWFsLAorCQkgICAgICBfX2VudHJ5LT5yZXNwX3NlcmlhbCwKKwkJICAgICAgX19lbnRyeS0+cnR0LAorCQkgICAgICBfX2VudHJ5LT5uciwKKwkJICAgICAgX19lbnRyeS0+YXZnKQorCSAgICApOworCitUUkFDRV9FVkVOVChyeHJwY190aW1lciwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGVudW0gcnhycGNfdGltZXJfdHJhY2Ugd2h5LAorCQkgICAgIGt0aW1lX3Qgbm93LCB1bnNpZ25lZCBsb25nIG5vd19qKSwKKworCSAgICBUUF9BUkdTKGNhbGwsIHdoeSwgbm93LCBub3dfaiksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IHJ4cnBjX2NhbGwgKiwJCWNhbGwJCSkKKwkJICAgIF9fZmllbGQoZW51bSByeHJwY190aW1lcl90cmFjZSwJCXdoeQkJKQorCQkgICAgX19maWVsZF9zdHJ1Y3Qoa3RpbWVfdCwJCQlub3cJCSkKKwkJICAgIF9fZmllbGRfc3RydWN0KGt0aW1lX3QsCQkJZXhwaXJlX2F0CSkKKwkJICAgIF9fZmllbGRfc3RydWN0KGt0aW1lX3QsCQkJYWNrX2F0CQkpCisJCSAgICBfX2ZpZWxkX3N0cnVjdChrdGltZV90LAkJCXJlc2VuZF9hdAkpCisJCSAgICBfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsCQkJbm93X2oJCSkKKwkJICAgIF9fZmllbGQodW5zaWduZWQgbG9uZywJCQl0aW1lcgkJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+Y2FsbAk9IGNhbGw7CisJCSAgICBfX2VudHJ5LT53aHkJPSB3aHk7CisJCSAgICBfX2VudHJ5LT5ub3cJPSBub3c7CisJCSAgICBfX2VudHJ5LT5leHBpcmVfYXQJPSBjYWxsLT5leHBpcmVfYXQ7CisJCSAgICBfX2VudHJ5LT5hY2tfYXQJPSBjYWxsLT5hY2tfYXQ7CisJCSAgICBfX2VudHJ5LT5yZXNlbmRfYXQJPSBjYWxsLT5yZXNlbmRfYXQ7CisJCSAgICBfX2VudHJ5LT5ub3dfagk9IG5vd19qOworCQkgICAgX19lbnRyeS0+dGltZXIJPSBjYWxsLT50aW1lci5leHBpcmVzOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImM9JXAgJXMgeD0lbGxkIGE9JWxsZCByPSVsbGQgdD0lbGQiLAorCQkgICAgICBfX2VudHJ5LT5jYWxsLAorCQkgICAgICByeHJwY190aW1lcl90cmFjZXNbX19lbnRyeS0+d2h5XSwKKwkJICAgICAga3RpbWVfdG9fbnMoa3RpbWVfc3ViKF9fZW50cnktPmV4cGlyZV9hdCwgX19lbnRyeS0+bm93KSksCisJCSAgICAgIGt0aW1lX3RvX25zKGt0aW1lX3N1YihfX2VudHJ5LT5hY2tfYXQsIF9fZW50cnktPm5vdykpLAorCQkgICAgICBrdGltZV90b19ucyhrdGltZV9zdWIoX19lbnRyeS0+cmVzZW5kX2F0LCBfX2VudHJ5LT5ub3cpKSwKKwkJICAgICAgX19lbnRyeS0+dGltZXIgLSBfX2VudHJ5LT5ub3dfaikKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfcnhfbG9zZSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCksCisKKwkgICAgVFBfQVJHUyhzcCksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGRfc3RydWN0KHN0cnVjdCByeHJwY19ob3N0X2hlYWRlciwJaGRyCQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBtZW1jcHkoJl9fZW50cnktPmhkciwgJnNwLT5oZHIsIHNpemVvZihfX2VudHJ5LT5oZHIpKTsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCIlMDh4OiUwOHg6JTA4eDolMDR4ICUwOHggJTA4eCAlMDJ4ICUwMnggJXMgKkxPU0UqIiwKKwkJICAgICAgX19lbnRyeS0+aGRyLmVwb2NoLCBfX2VudHJ5LT5oZHIuY2lkLAorCQkgICAgICBfX2VudHJ5LT5oZHIuY2FsbE51bWJlciwgX19lbnRyeS0+aGRyLnNlcnZpY2VJZCwKKwkJICAgICAgX19lbnRyeS0+aGRyLnNlcmlhbCwgX19lbnRyeS0+aGRyLnNlcSwKKwkJICAgICAgX19lbnRyeS0+aGRyLnR5cGUsIF9fZW50cnktPmhkci5mbGFncywKKwkJICAgICAgX19lbnRyeS0+aGRyLnR5cGUgPD0gMTUgPyByeHJwY19wa3RzW19fZW50cnktPmhkci50eXBlXSA6ICI/VU5LIikKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfcHJvcG9zZV9hY2ssCisJICAgIFRQX1BST1RPKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBlbnVtIHJ4cnBjX3Byb3Bvc2VfYWNrX3RyYWNlIHdoeSwKKwkJICAgICB1OCBhY2tfcmVhc29uLCByeHJwY19zZXJpYWxfdCBzZXJpYWwsIGJvb2wgaW1tZWRpYXRlLAorCQkgICAgIGJvb2wgYmFja2dyb3VuZCwgZW51bSByeHJwY19wcm9wb3NlX2Fja19vdXRjb21lIG91dGNvbWUpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgd2h5LCBhY2tfcmVhc29uLCBzZXJpYWwsIGltbWVkaWF0ZSwgYmFja2dyb3VuZCwKKwkJICAgIG91dGNvbWUpLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHN0cnVjdCByeHJwY19jYWxsICosCQljYWxsCQkpCisJCSAgICBfX2ZpZWxkKGVudW0gcnhycGNfcHJvcG9zZV9hY2tfdHJhY2UsCXdoeQkJKQorCQkgICAgX19maWVsZChyeHJwY19zZXJpYWxfdCwJCQlzZXJpYWwJCSkKKwkJICAgIF9fZmllbGQodTgsCQkJCQlhY2tfcmVhc29uCSkKKwkJICAgIF9fZmllbGQoYm9vbCwJCQkJaW1tZWRpYXRlCSkKKwkJICAgIF9fZmllbGQoYm9vbCwJCQkJYmFja2dyb3VuZAkpCisJCSAgICBfX2ZpZWxkKGVudW0gcnhycGNfcHJvcG9zZV9hY2tfb3V0Y29tZSwJb3V0Y29tZQkJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+Y2FsbAk9IGNhbGw7CisJCSAgICBfX2VudHJ5LT53aHkJPSB3aHk7CisJCSAgICBfX2VudHJ5LT5zZXJpYWwJPSBzZXJpYWw7CisJCSAgICBfX2VudHJ5LT5hY2tfcmVhc29uCT0gYWNrX3JlYXNvbjsKKwkJICAgIF9fZW50cnktPmltbWVkaWF0ZQk9IGltbWVkaWF0ZTsKKwkJICAgIF9fZW50cnktPmJhY2tncm91bmQJPSBiYWNrZ3JvdW5kOworCQkgICAgX19lbnRyeS0+b3V0Y29tZQk9IG91dGNvbWU7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiYz0lcCAlcyAlcyByPSUwOHggaT0ldSBiPSV1JXMiLAorCQkgICAgICBfX2VudHJ5LT5jYWxsLAorCQkgICAgICByeHJwY19wcm9wb3NlX2Fja190cmFjZXNbX19lbnRyeS0+d2h5XSwKKwkJICAgICAgcnhycGNfYWNrX25hbWVzW19fZW50cnktPmFja19yZWFzb25dLAorCQkgICAgICBfX2VudHJ5LT5zZXJpYWwsCisJCSAgICAgIF9fZW50cnktPmltbWVkaWF0ZSwKKwkJICAgICAgX19lbnRyeS0+YmFja2dyb3VuZCwKKwkJICAgICAgcnhycGNfcHJvcG9zZV9hY2tfb3V0Y29tZXNbX19lbnRyeS0+b3V0Y29tZV0pCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX3JldHJhbnNtaXQsCisJICAgIFRQX1BST1RPKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCByeHJwY19zZXFfdCBzZXEsIHU4IGFubm90YXRpb24sCisJCSAgICAgczY0IGV4cGlyeSksCisKKwkgICAgVFBfQVJHUyhjYWxsLCBzZXEsIGFubm90YXRpb24sIGV4cGlyeSksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IHJ4cnBjX2NhbGwgKiwJY2FsbAkJKQorCQkgICAgX19maWVsZChyeHJwY19zZXFfdCwJCXNlcQkJKQorCQkgICAgX19maWVsZCh1OCwJCQkJYW5ub3RhdGlvbgkpCisJCSAgICBfX2ZpZWxkKHM2NCwJCQlleHBpcnkJCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPmNhbGwgPSBjYWxsOworCQkgICAgX19lbnRyeS0+c2VxID0gc2VxOworCQkgICAgX19lbnRyeS0+YW5ub3RhdGlvbiA9IGFubm90YXRpb247CisJCSAgICBfX2VudHJ5LT5leHBpcnkgPSBleHBpcnk7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiYz0lcCBxPSV4IGE9JTAyeCB4cD0lbGxkIiwKKwkJICAgICAgX19lbnRyeS0+Y2FsbCwKKwkJICAgICAgX19lbnRyeS0+c2VxLAorCQkgICAgICBfX2VudHJ5LT5hbm5vdGF0aW9uLAorCQkgICAgICBfX2VudHJ5LT5leHBpcnkpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX2Nvbmdlc3QsCisJICAgIFRQX1BST1RPKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3QgcnhycGNfYWNrX3N1bW1hcnkgKnN1bW1hcnksCisJCSAgICAgcnhycGNfc2VyaWFsX3QgYWNrX3NlcmlhbCwgZW51bSByeHJwY19jb25nZXN0X2NoYW5nZSBjaGFuZ2UpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgc3VtbWFyeSwgYWNrX3NlcmlhbCwgY2hhbmdlKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY2FsbCAqLAkJY2FsbAkJKQorCQkgICAgX19maWVsZChlbnVtIHJ4cnBjX2Nvbmdlc3RfY2hhbmdlLAkJY2hhbmdlCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcV90LAkJCWhhcmRfYWNrCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VxX3QsCQkJdG9wCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcV90LAkJCWxvd2VzdF9uYWsJKQorCQkgICAgX19maWVsZChyeHJwY19zZXJpYWxfdCwJCQlhY2tfc2VyaWFsCSkKKwkJICAgIF9fZmllbGRfc3RydWN0KHN0cnVjdCByeHJwY19hY2tfc3VtbWFyeSwJc3VtCQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBfX2VudHJ5LT5jYWxsCT0gY2FsbDsKKwkJICAgIF9fZW50cnktPmNoYW5nZQk9IGNoYW5nZTsKKwkJICAgIF9fZW50cnktPmhhcmRfYWNrCT0gY2FsbC0+dHhfaGFyZF9hY2s7CisJCSAgICBfX2VudHJ5LT50b3AJPSBjYWxsLT50eF90b3A7CisJCSAgICBfX2VudHJ5LT5sb3dlc3RfbmFrCT0gY2FsbC0+YWNrc19sb3dlc3RfbmFrOworCQkgICAgX19lbnRyeS0+YWNrX3NlcmlhbAk9IGFja19zZXJpYWw7CisJCSAgICBtZW1jcHkoJl9fZW50cnktPnN1bSwgc3VtbWFyeSwgc2l6ZW9mKF9fZW50cnktPnN1bSkpOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImM9JXAgJTA4eCAlcyAlMDh4ICVzIGN3PSV1IHNzPSV1IG5yPSV1LCV1IG53PSV1LCV1IHI9JXUgYj0ldSB1PSV1IGQ9JXUgbD0leCVzJXMlcyIsCisJCSAgICAgIF9fZW50cnktPmNhbGwsCisJCSAgICAgIF9fZW50cnktPmFja19zZXJpYWwsCisJCSAgICAgIHJ4cnBjX2Fja19uYW1lc1tfX2VudHJ5LT5zdW0uYWNrX3JlYXNvbl0sCisJCSAgICAgIF9fZW50cnktPmhhcmRfYWNrLAorCQkgICAgICByeHJwY19jb25nZXN0X21vZGVzW19fZW50cnktPnN1bS5tb2RlXSwKKwkJICAgICAgX19lbnRyeS0+c3VtLmN3bmQsCisJCSAgICAgIF9fZW50cnktPnN1bS5zc3RocmVzaCwKKwkJICAgICAgX19lbnRyeS0+c3VtLm5yX2Fja3MsIF9fZW50cnktPnN1bS5ucl9uYWNrcywKKwkJICAgICAgX19lbnRyeS0+c3VtLm5yX25ld19hY2tzLCBfX2VudHJ5LT5zdW0ubnJfbmV3X25hY2tzLAorCQkgICAgICBfX2VudHJ5LT5zdW0ubnJfcm90X25ld19hY2tzLAorCQkgICAgICBfX2VudHJ5LT50b3AgLSBfX2VudHJ5LT5oYXJkX2FjaywKKwkJICAgICAgX19lbnRyeS0+c3VtLmN1bXVsYXRpdmVfYWNrcywKKwkJICAgICAgX19lbnRyeS0+c3VtLmR1cF9hY2tzLAorCQkgICAgICBfX2VudHJ5LT5sb3dlc3RfbmFrLCBfX2VudHJ5LT5zdW0ubmV3X2xvd19uYWNrID8gIiEiIDogIiIsCisJCSAgICAgIHJ4cnBjX2Nvbmdlc3RfY2hhbmdlc1tfX2VudHJ5LT5jaGFuZ2VdLAorCQkgICAgICBfX2VudHJ5LT5zdW0ucmV0cmFuc190aW1lbyA/ICIgclR4VG8iIDogIiIpCisJICAgICk7CisKKyNlbmRpZiAvKiBfVFJBQ0VfUlhSUENfSCAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9LYnVpbGQgYi9pbmNsdWRlL3VhcGkvbGludXgvS2J1aWxkCmluZGV4IDE4NWY4ZWEuLmQwMzUyYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9LYnVpbGQKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L0tidWlsZApAQCAtNzEsNiArNzEsNyBAQAogaGVhZGVyLXkgKz0gYmxrcGcuaAogaGVhZGVyLXkgKz0gYmxrdHJhY2VfYXBpLmgKIGhlYWRlci15ICs9IGJwZl9jb21tb24uaAoraGVhZGVyLXkgKz0gYnBmX3BlcmZfZXZlbnQuaAogaGVhZGVyLXkgKz0gYnBmLmgKIGhlYWRlci15ICs9IGJwcWV0aGVyLmgKIGhlYWRlci15ICs9IGJzZy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvYXRtX3phdG0uaCBiL2luY2x1ZGUvdWFwaS9saW51eC9hdG1femF0bS5oCmluZGV4IDljOWM2YWQuLjVjZDRkNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9hdG1femF0bS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9hdG1femF0bS5oCkBAIC0xNCw2ICsxNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9hdG1hcGkuaD4KICNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAKICNkZWZpbmUgWkFUTV9HRVRQT09MCV9JT1coJ2EnLEFUTUlPQ19TQVJQUlYrMSxzdHJ1Y3QgYXRtaWZfc2lvYykKIAkJCQkJCS8qIGdldCBwb29sIHN0YXRpc3RpY3MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9hdWRpdC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2F1ZGl0LmgKaW5kZXggODJlOGFhNS4uMjA4ZGY3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2F1ZGl0LmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2F1ZGl0LmgKQEAgLTMyOSw5ICszMjksMTEgQEAKICNkZWZpbmUgQVVESVRfRkVBVFVSRV9CSVRNQVBfQkFDS0xPR19MSU1JVAkweDAwMDAwMDAxCiAjZGVmaW5lIEFVRElUX0ZFQVRVUkVfQklUTUFQX0JBQ0tMT0dfV0FJVF9USU1FCTB4MDAwMDAwMDIKICNkZWZpbmUgQVVESVRfRkVBVFVSRV9CSVRNQVBfRVhFQ1VUQUJMRV9QQVRICTB4MDAwMDAwMDQKKyNkZWZpbmUgQVVESVRfRkVBVFVSRV9CSVRNQVBfRVhDTFVERV9FWFRFTkQJMHgwMDAwMDAwOAogI2RlZmluZSBBVURJVF9GRUFUVVJFX0JJVE1BUF9BTEwgKEFVRElUX0ZFQVRVUkVfQklUTUFQX0JBQ0tMT0dfTElNSVQgfCBcCiAJCQkJICBBVURJVF9GRUFUVVJFX0JJVE1BUF9CQUNLTE9HX1dBSVRfVElNRSB8IFwKLQkJCQkgIEFVRElUX0ZFQVRVUkVfQklUTUFQX0VYRUNVVEFCTEVfUEFUSCkKKwkJCQkgIEFVRElUX0ZFQVRVUkVfQklUTUFQX0VYRUNVVEFCTEVfUEFUSCB8IFwKKwkJCQkgIEFVRElUX0ZFQVRVUkVfQklUTUFQX0VYQ0xVREVfRVhURU5EKQogCiAvKiBkZXByZWNhdGVkOiBBVURJVF9WRVJTSU9OXyogKi8KICNkZWZpbmUgQVVESVRfVkVSU0lPTl9MQVRFU1QgCQlBVURJVF9GRUFUVVJFX0JJVE1BUF9BTEwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9iYXRtYW5fYWR2LmggYi9pbmNsdWRlL3VhcGkvbGludXgvYmF0bWFuX2Fkdi5oCmluZGV4IDBmYmY2ZmQuLjczNGZlODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9iYXRtYW5fYWR2LmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2JhdG1hbl9hZHYuaApAQCAtMjMsNiArMjMsNDIgQEAKICNkZWZpbmUgQkFUQURWX05MX01DQVNUX0dST1VQX1RQTUVURVIJInRwbWV0ZXIiCiAKIC8qKgorICogZW51bSBiYXRhZHZfdHRfY2xpZW50X2ZsYWdzIC0gVFQgY2xpZW50IHNwZWNpZmljIGZsYWdzCisgKiBAQkFUQURWX1RUX0NMSUVOVF9ERUw6IHRoZSBjbGllbnQgaGFzIHRvIGJlIGRlbGV0ZWQgZnJvbSB0aGUgdGFibGUKKyAqIEBCQVRBRFZfVFRfQ0xJRU5UX1JPQU06IHRoZSBjbGllbnQgcm9hbWVkIHRvL2Zyb20gYW5vdGhlciBub2RlIGFuZCB0aGUgbmV3CisgKiAgdXBkYXRlIHRlbGxpbmcgaXRzIG5ldyByZWFsIGxvY2F0aW9uIGhhcyBub3QgYmVlbiByZWNlaXZlZC9zZW50IHlldAorICogQEJBVEFEVl9UVF9DTElFTlRfV0lGSTogdGhpcyBjbGllbnQgaXMgY29ubmVjdGVkIHRocm91Z2ggYSB3aWZpIGludGVyZmFjZS4KKyAqICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgYnkgdGhlICJBUCBJc29sYXRpb24iIGZlYXR1cmUKKyAqIEBCQVRBRFZfVFRfQ0xJRU5UX0lTT0xBOiB0aGlzIGNsaWVudCBpcyBjb25zaWRlcmVkICJpc29sYXRlZCIuIFRoaXMKKyAqICBpbmZvcm1hdGlvbiBpcyB1c2VkIGJ5IHRoZSBFeHRlbmRlZCBJc29sYXRpb24gZmVhdHVyZQorICogQEJBVEFEVl9UVF9DTElFTlRfTk9QVVJHRTogdGhpcyBjbGllbnQgc2hvdWxkIG5ldmVyIGJlIHJlbW92ZWQgZnJvbSB0aGUgdGFibGUKKyAqIEBCQVRBRFZfVFRfQ0xJRU5UX05FVzogdGhpcyBjbGllbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGxvY2FsIHRhYmxlIGJ1dCBoYXMKKyAqICBub3QgYmVlbiBhbm5vdW5jZWQgeWV0CisgKiBAQkFUQURWX1RUX0NMSUVOVF9QRU5ESU5HOiB0aGlzIGNsaWVudCBpcyBtYXJrZWQgZm9yIHJlbW92YWwgYnV0IGl0IGlzIGtlcHQKKyAqICBpbiB0aGUgdGFibGUgZm9yIG9uZSBtb3JlIG9yaWdpbmF0b3IgaW50ZXJ2YWwgZm9yIGNvbnNpc3RlbmN5IHB1cnBvc2VzCisgKiBAQkFUQURWX1RUX0NMSUVOVF9URU1QOiB0aGlzIGdsb2JhbCBjbGllbnQgaGFzIGJlZW4gZGV0ZWN0ZWQgdG8gYmUgcGFydCBvZgorICogIHRoZSBuZXR3b3JrIGJ1dCBubyBubm9kZSBoYXMgYWxyZWFkeSBhbm5vdW5jZWQgaXQKKyAqCisgKiBCaXRzIGZyb20gMCB0byA3IGFyZSBjYWxsZWQgX3JlbW90ZSBmbGFnc18gYmVjYXVzZSB0aGV5IGFyZSBzZW50IG9uIHRoZSB3aXJlLgorICogQml0cyBmcm9tIDggdG8gMTUgYXJlIGNhbGxlZCBfbG9jYWwgZmxhZ3NfIGJlY2F1c2UgdGhleSBhcmUgdXNlZCBmb3IgbG9jYWwKKyAqIGNvbXB1dGF0aW9ucyBvbmx5LgorICoKKyAqIEJpdHMgZnJvbSA0IHRvIDcgLSBhIHN1YnNldCBvZiByZW1vdGUgZmxhZ3MgLSBhcmUgZW5zdXJlZCB0byBiZSBpbiBzeW5jIHdpdGgKKyAqIHRoZSBvdGhlciBub2RlcyBpbiB0aGUgbmV0d29yay4gVG8gYWNoaWV2ZSB0aGlzIGdvYWwgdGhlc2UgZmxhZ3MgYXJlIGluY2x1ZGVkCisgKiBpbiB0aGUgVFQgQ1JDIGNvbXB1dGF0aW9uLgorICovCitlbnVtIGJhdGFkdl90dF9jbGllbnRfZmxhZ3MgeworCUJBVEFEVl9UVF9DTElFTlRfREVMICAgICA9ICgxIDw8IDApLAorCUJBVEFEVl9UVF9DTElFTlRfUk9BTSAgICA9ICgxIDw8IDEpLAorCUJBVEFEVl9UVF9DTElFTlRfV0lGSSAgICA9ICgxIDw8IDQpLAorCUJBVEFEVl9UVF9DTElFTlRfSVNPTEEJID0gKDEgPDwgNSksCisJQkFUQURWX1RUX0NMSUVOVF9OT1BVUkdFID0gKDEgPDwgOCksCisJQkFUQURWX1RUX0NMSUVOVF9ORVcgICAgID0gKDEgPDwgOSksCisJQkFUQURWX1RUX0NMSUVOVF9QRU5ESU5HID0gKDEgPDwgMTApLAorCUJBVEFEVl9UVF9DTElFTlRfVEVNUAkgPSAoMSA8PCAxMSksCit9OworCisvKioKICAqIGVudW0gYmF0YWR2X25sX2F0dHJzIC0gYmF0bWFuLWFkdiBuZXRsaW5rIGF0dHJpYnV0ZXMKICAqCiAgKiBAQkFUQURWX0FUVFJfVU5TUEVDOiB1bnNwZWNpZmllZCBhdHRyaWJ1dGUgdG8gY2F0Y2ggZXJyb3JzCkBAIC00MCw2ICs3NiwyNiBAQAogICogQEJBVEFEVl9BVFRSX1RQTUVURVJfQllURVM6IGFtb3VudCBvZiBhY2tlZCBieXRlcyBkdXJpbmcgcnVuCiAgKiBAQkFUQURWX0FUVFJfVFBNRVRFUl9DT09LSUU6IHNlc3Npb24gY29va2llIHRvIG1hdGNoIHRwX21ldGVyIHNlc3Npb24KICAqIEBCQVRBRFZfQVRUUl9QQUQ6IGF0dHJpYnV0ZSB1c2VkIGZvciBwYWRkaW5nIGZvciA2NC1iaXQgYWxpZ25tZW50CisgKiBAQkFUQURWX0FUVFJfQUNUSVZFOiBGbGFnIGluZGljYXRpbmcgaWYgdGhlIGhhcmQgaW50ZXJmYWNlIGlzIGFjdGl2ZQorICogQEJBVEFEVl9BVFRSX1RUX0FERFJFU1M6IENsaWVudCBNQUMgYWRkcmVzcworICogQEJBVEFEVl9BVFRSX1RUX1RUVk46IFRyYW5zbGF0aW9uIHRhYmxlIHZlcnNpb24KKyAqIEBCQVRBRFZfQVRUUl9UVF9MQVNUX1RUVk46IFByZXZpb3VzIHRyYW5zbGF0aW9uIHRhYmxlIHZlcnNpb24KKyAqIEBCQVRBRFZfQVRUUl9UVF9DUkMzMjogQ1JDMzIgb3ZlciB0cmFuc2xhdGlvbiB0YWJsZQorICogQEJBVEFEVl9BVFRSX1RUX1ZJRDogVkxBTiBJRAorICogQEJBVEFEVl9BVFRSX1RUX0ZMQUdTOiBUcmFuc2xhdGlvbiB0YWJsZSBjbGllbnQgZmxhZ3MKKyAqIEBCQVRBRFZfQVRUUl9GTEFHX0JFU1Q6IEZsYWdzIGluZGljYXRpbmcgZW50cnkgaXMgdGhlIGJlc3QKKyAqIEBCQVRBRFZfQVRUUl9MQVNUX1NFRU5fTVNFQ1M6IFRpbWUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIGxhc3Qgc2VlbgorICogQEJBVEFEVl9BVFRSX05FSUdIX0FERFJFU1M6IE5laWdoYm91ciBNQUMgYWRkcmVzcworICogQEJBVEFEVl9BVFRSX1RROiBUUSB0byBuZWlnaGJvdXIKKyAqIEBCQVRBRFZfQVRUUl9USFJPVUdIUFVUOiBFc3RpbWF0ZWQgdGhyb3VnaHB1dCB0byBOZWlnaGJvdXIKKyAqIEBCQVRBRFZfQVRUUl9CQU5EV0lEVEhfVVA6IFJlcG9ydGVkIHVwbGluayBiYW5kd2lkdGgKKyAqIEBCQVRBRFZfQVRUUl9CQU5EV0lEVEhfRE9XTjogUmVwb3J0ZWQgZG93bmxpbmsgYmFuZHdpZHRoCisgKiBAQkFUQURWX0FUVFJfUk9VVEVSOiBHYXRld2F5IHJvdXRlciBNQUMgYWRkcmVzcworICogQEJBVEFEVl9BVFRSX0JMQV9PV046IEZsYWcgaW5kaWNhdGluZyBvd24gb3JpZ2luYXRvcgorICogQEJBVEFEVl9BVFRSX0JMQV9BRERSRVNTOiBCcmlkZ2UgbG9vcCBhdm9pZGFuY2UgY2xhaW0gTUFDIGFkZHJlc3MKKyAqIEBCQVRBRFZfQVRUUl9CTEFfVklEOiBCTEEgVkxBTiBJRAorICogQEJBVEFEVl9BVFRSX0JMQV9CQUNLQk9ORTogQkxBIGdhdGV3YXkgb3JpZ2luYXRvciBNQUMgYWRkcmVzcworICogQEJBVEFEVl9BVFRSX0JMQV9DUkM6IEJMQSBDUkMKICAqIEBfX0JBVEFEVl9BVFRSX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQogICogQE5VTV9CQVRBRFZfQVRUUjogdG90YWwgbnVtYmVyIG9mIGJhdGFkdl9ubF9hdHRycyBhdmFpbGFibGUKICAqIEBCQVRBRFZfQVRUUl9NQVg6IGhpZ2hlc3QgYXR0cmlidXRlIG51bWJlciBjdXJyZW50bHkgZGVmaW5lZApAQCAtNjAsNiArMTE2LDI2IEBACiAJQkFUQURWX0FUVFJfVFBNRVRFUl9CWVRFUywKIAlCQVRBRFZfQVRUUl9UUE1FVEVSX0NPT0tJRSwKIAlCQVRBRFZfQVRUUl9QQUQsCisJQkFUQURWX0FUVFJfQUNUSVZFLAorCUJBVEFEVl9BVFRSX1RUX0FERFJFU1MsCisJQkFUQURWX0FUVFJfVFRfVFRWTiwKKwlCQVRBRFZfQVRUUl9UVF9MQVNUX1RUVk4sCisJQkFUQURWX0FUVFJfVFRfQ1JDMzIsCisJQkFUQURWX0FUVFJfVFRfVklELAorCUJBVEFEVl9BVFRSX1RUX0ZMQUdTLAorCUJBVEFEVl9BVFRSX0ZMQUdfQkVTVCwKKwlCQVRBRFZfQVRUUl9MQVNUX1NFRU5fTVNFQ1MsCisJQkFUQURWX0FUVFJfTkVJR0hfQUREUkVTUywKKwlCQVRBRFZfQVRUUl9UUSwKKwlCQVRBRFZfQVRUUl9USFJPVUdIUFVULAorCUJBVEFEVl9BVFRSX0JBTkRXSURUSF9VUCwKKwlCQVRBRFZfQVRUUl9CQU5EV0lEVEhfRE9XTiwKKwlCQVRBRFZfQVRUUl9ST1VURVIsCisJQkFUQURWX0FUVFJfQkxBX09XTiwKKwlCQVRBRFZfQVRUUl9CTEFfQUREUkVTUywKKwlCQVRBRFZfQVRUUl9CTEFfVklELAorCUJBVEFEVl9BVFRSX0JMQV9CQUNLQk9ORSwKKwlCQVRBRFZfQVRUUl9CTEFfQ1JDLAogCS8qIGFkZCBhdHRyaWJ1dGVzIGFib3ZlIGhlcmUsIHVwZGF0ZSB0aGUgcG9saWN5IGluIG5ldGxpbmsuYyAqLwogCV9fQkFUQURWX0FUVFJfQUZURVJfTEFTVCwKIAlOVU1fQkFUQURWX0FUVFIgPSBfX0JBVEFEVl9BVFRSX0FGVEVSX0xBU1QsCkBAIC03Myw2ICsxNDksMTUgQEAKICAqIEBCQVRBRFZfQ01EX0dFVF9NRVNIX0lORk86IFF1ZXJ5IGJhc2ljIGluZm9ybWF0aW9uIGFib3V0IGJhdG1hbi1hZHYgZGV2aWNlCiAgKiBAQkFUQURWX0NNRF9UUF9NRVRFUjogU3RhcnQgYSB0cCBtZXRlciBzZXNzaW9uCiAgKiBAQkFUQURWX0NNRF9UUF9NRVRFUl9DQU5DRUw6IENhbmNlbCBhIHRwIG1ldGVyIHNlc3Npb24KKyAqIEBCQVRBRFZfQ01EX0dFVF9ST1VUSU5HX0FMR09TOiBRdWVyeSB0aGUgbGlzdCBvZiByb3V0aW5nIGFsZ29yaXRobXMuCisgKiBAQkFUQURWX0NNRF9HRVRfSEFSRElGUzogUXVlcnkgbGlzdCBvZiBoYXJkIGludGVyZmFjZXMKKyAqIEBCQVRBRFZfQ01EX0dFVF9UUkFOU1RBQkxFX0xPQ0FMOiBRdWVyeSBsaXN0IG9mIGxvY2FsIHRyYW5zbGF0aW9ucworICogQEJBVEFEVl9DTURfR0VUX1RSQU5TVEFCTEVfR0xPQkFMIFF1ZXJ5IGxpc3Qgb2YgZ2xvYmFsIHRyYW5zbGF0aW9ucworICogQEJBVEFEVl9DTURfR0VUX09SSUdJTkFUT1JTOiBRdWVyeSBsaXN0IG9mIG9yaWdpbmF0b3JzCisgKiBAQkFUQURWX0NNRF9HRVRfTkVJR0hCT1JTOiBRdWVyeSBsaXN0IG9mIG5laWdoYm91cnMKKyAqIEBCQVRBRFZfQ01EX0dFVF9HQVRFV0FZUzogUXVlcnkgbGlzdCBvZiBnYXRld2F5cworICogQEJBVEFEVl9DTURfR0VUX0JMQV9DTEFJTTogUXVlcnkgbGlzdCBvZiBicmlkZ2UgbG9vcCBhdm9pZGFuY2UgY2xhaW1zCisgKiBAQkFUQURWX0NNRF9HRVRfQkxBX0JBQ0tCT05FOiBRdWVyeSBsaXN0IG9mIGJyaWRnZSBsb29wIGF2b2lkYW5jZSBiYWNrYm9uZXMKICAqIEBfX0JBVEFEVl9DTURfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCiAgKiBAQkFUQURWX0NNRF9NQVg6IGhpZ2hlc3QgdXNlZCBjb21tYW5kIG51bWJlcgogICovCkBAIC04MSw2ICsxNjYsMTUgQEAKIAlCQVRBRFZfQ01EX0dFVF9NRVNIX0lORk8sCiAJQkFUQURWX0NNRF9UUF9NRVRFUiwKIAlCQVRBRFZfQ01EX1RQX01FVEVSX0NBTkNFTCwKKwlCQVRBRFZfQ01EX0dFVF9ST1VUSU5HX0FMR09TLAorCUJBVEFEVl9DTURfR0VUX0hBUkRJRlMsCisJQkFUQURWX0NNRF9HRVRfVFJBTlNUQUJMRV9MT0NBTCwKKwlCQVRBRFZfQ01EX0dFVF9UUkFOU1RBQkxFX0dMT0JBTCwKKwlCQVRBRFZfQ01EX0dFVF9PUklHSU5BVE9SUywKKwlCQVRBRFZfQ01EX0dFVF9ORUlHSEJPUlMsCisJQkFUQURWX0NNRF9HRVRfR0FURVdBWVMsCisJQkFUQURWX0NNRF9HRVRfQkxBX0NMQUlNLAorCUJBVEFEVl9DTURfR0VUX0JMQV9CQUNLQk9ORSwKIAkvKiBhZGQgbmV3IGNvbW1hbmRzIGFib3ZlIGhlcmUgKi8KIAlfX0JBVEFEVl9DTURfQUZURVJfTEFTVCwKIAlCQVRBRFZfQ01EX01BWCA9IF9fQkFUQURWX0NNRF9BRlRFUl9MQVNUIC0gMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oCmluZGV4IGRhMjE4ZmUuLmYwOWM3MGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgKQEAgLTk1LDYgKzk1LDcgQEAKIAlCUEZfUFJPR19UWVBFX1NDSEVEX0FDVCwKIAlCUEZfUFJPR19UWVBFX1RSQUNFUE9JTlQsCiAJQlBGX1BST0dfVFlQRV9YRFAsCisJQlBGX1BST0dfVFlQRV9QRVJGX0VWRU5ULAogfTsKIAogI2RlZmluZSBCUEZfUFNFVURPX01BUF9GRAkxCkBAIC0zMzksNyArMzQwLDcgQEAKIAlCUEZfRlVOQ19za2JfY2hhbmdlX3R5cGUsCiAKIAkvKioKLQkgKiBicGZfc2tiX2luX2Nncm91cChza2IsIG1hcCwgaW5kZXgpIC0gQ2hlY2sgY2dyb3VwMiBtZW1iZXJzaGlwIG9mIHNrYgorCSAqIGJwZl9za2JfdW5kZXJfY2dyb3VwKHNrYiwgbWFwLCBpbmRleCkgLSBDaGVjayBjZ3JvdXAyIG1lbWJlcnNoaXAgb2Ygc2tiCiAJICogQHNrYjogcG9pbnRlciB0byBza2IKIAkgKiBAbWFwOiBwb2ludGVyIHRvIGJwZl9tYXAgaW4gQlBGX01BUF9UWVBFX0NHUk9VUF9BUlJBWSB0eXBlCiAJICogQGluZGV4OiBpbmRleCBvZiB0aGUgY2dyb3VwIGluIHRoZSBicGZfbWFwCkBAIC0zNDgsNyArMzQ5LDcgQEAKIAkgKiAgID09IDEgc2tiIHN1Y2NlZWRlZCB0aGUgY2dyb3VwMiBkZXNjZW5kYW50IHRlc3QKIAkgKiAgICA8IDAgZXJyb3IKIAkgKi8KLQlCUEZfRlVOQ19za2JfaW5fY2dyb3VwLAorCUJQRl9GVU5DX3NrYl91bmRlcl9jZ3JvdXAsCiAKIAkvKioKIAkgKiBicGZfZ2V0X2hhc2hfcmVjYWxjKHNrYikKQEAgLTM3NSw2ICszNzYsNTYgQEAKIAkgKi8KIAlCUEZfRlVOQ19wcm9iZV93cml0ZV91c2VyLAogCisJLyoqCisJICogYnBmX2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXAobWFwLCBpbmRleCkgLSBDaGVjayBjZ3JvdXAyIG1lbWJlcnNoaXAgb2YgY3VycmVudCB0YXNrCisJICogQG1hcDogcG9pbnRlciB0byBicGZfbWFwIGluIEJQRl9NQVBfVFlQRV9DR1JPVVBfQVJSQVkgdHlwZQorCSAqIEBpbmRleDogaW5kZXggb2YgdGhlIGNncm91cCBpbiB0aGUgYnBmX21hcAorCSAqIFJldHVybjoKKwkgKiAgID09IDAgY3VycmVudCBmYWlsZWQgdGhlIGNncm91cDIgZGVzY2VuZGFudCB0ZXN0CisJICogICA9PSAxIGN1cnJlbnQgc3VjY2VlZGVkIHRoZSBjZ3JvdXAyIGRlc2NlbmRhbnQgdGVzdAorCSAqICAgIDwgMCBlcnJvcgorCSAqLworCUJQRl9GVU5DX2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXAsCisKKwkvKioKKwkgKiBicGZfc2tiX2NoYW5nZV90YWlsKHNrYiwgbGVuLCBmbGFncykKKwkgKiBUaGUgaGVscGVyIHdpbGwgcmVzaXplIHRoZSBza2IgdG8gdGhlIGdpdmVuIG5ldyBzaXplLAorCSAqIHRvIGJlIHVzZWQgZi5lLiB3aXRoIGNvbnRyb2wgbWVzc2FnZXMuCisJICogQHNrYjogcG9pbnRlciB0byBza2IKKwkgKiBAbGVuOiBuZXcgc2tiIGxlbmd0aAorCSAqIEBmbGFnczogcmVzZXJ2ZWQKKwkgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvcgorCSAqLworCUJQRl9GVU5DX3NrYl9jaGFuZ2VfdGFpbCwKKworCS8qKgorCSAqIGJwZl9za2JfcHVsbF9kYXRhKHNrYiwgbGVuKQorCSAqIFRoZSBoZWxwZXIgd2lsbCBwdWxsIGluIG5vbi1saW5lYXIgZGF0YSBpbiBjYXNlIHRoZQorCSAqIHNrYiBpcyBub24tbGluZWFyIGFuZCBub3QgYWxsIG9mIGxlbiBhcmUgcGFydCBvZiB0aGUKKwkgKiBsaW5lYXIgc2VjdGlvbi4gT25seSBuZWVkZWQgZm9yIHJlYWQvd3JpdGUgd2l0aCBkaXJlY3QKKwkgKiBwYWNrZXQgYWNjZXNzLgorCSAqIEBza2I6IHBvaW50ZXIgdG8gc2tiCisJICogQGxlbjogbGVuIHRvIG1ha2UgcmVhZC93cml0ZWFibGUKKwkgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvcgorCSAqLworCUJQRl9GVU5DX3NrYl9wdWxsX2RhdGEsCisKKwkvKioKKwkgKiBicGZfY3N1bV91cGRhdGUoc2tiLCBjc3VtKQorCSAqIEFkZHMgY3N1bSBpbnRvIHNrYi0+Y3N1bSBpbiBjYXNlIG9mIENIRUNLU1VNX0NPTVBMRVRFLgorCSAqIEBza2I6IHBvaW50ZXIgdG8gc2tiCisJICogQGNzdW06IGNzdW0gdG8gYWRkCisJICogUmV0dXJuOiBjc3VtIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IKKwkgKi8KKwlCUEZfRlVOQ19jc3VtX3VwZGF0ZSwKKworCS8qKgorCSAqIGJwZl9zZXRfaGFzaF9pbnZhbGlkKHNrYikKKwkgKiBJbnZhbGlkYXRlIGN1cnJlbnQgc2tiPmhhc2guCisJICogQHNrYjogcG9pbnRlciB0byBza2IKKwkgKi8KKwlCUEZfRlVOQ19zZXRfaGFzaF9pbnZhbGlkLAorCiAJX19CUEZfRlVOQ19NQVhfSUQsCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvYnBmX3BlcmZfZXZlbnQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9icGZfcGVyZl9ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NzQyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmX3BlcmZfZXZlbnQuaApAQCAtMCwwICsxLDE4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTYgRmFjZWJvb2sKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaWZuZGVmIF9VQVBJX19MSU5VWF9CUEZfUEVSRl9FVkVOVF9IX18KKyNkZWZpbmUgX1VBUElfX0xJTlVYX0JQRl9QRVJGX0VWRU5UX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKworc3RydWN0IGJwZl9wZXJmX2V2ZW50X2RhdGEgeworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CisJX191NjQgc2FtcGxlX3BlcmlvZDsKK307CisKKyNlbmRpZiAvKiBfVUFQSV9fTElOVVhfQlBGX1BFUkZfRVZFTlRfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvZXRodG9vbC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2V0aHRvb2wuaAppbmRleCBiOGYzOGU4Li4wOTlhNDIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvZXRodG9vbC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9ldGh0b29sLmgKQEAgLTEzNjIsNyArMTM2MiwxNCBAQAogCUVUSFRPT0xfTElOS19NT0RFXzEwMDAwMGJhc2VTUjRfRnVsbF9CSVQJPSAzNywKIAlFVEhUT09MX0xJTktfTU9ERV8xMDAwMDBiYXNlQ1I0X0Z1bGxfQklUCT0gMzgsCiAJRVRIVE9PTF9MSU5LX01PREVfMTAwMDAwYmFzZUxSNF9FUjRfRnVsbF9CSVQJPSAzOSwKLQlFVEhUT09MX0xJTktfTU9ERV81MDAwMGJhc2VTUjJfRnVsbF9CSVQgICAgICAgICA9IDQwLAorCUVUSFRPT0xfTElOS19NT0RFXzUwMDAwYmFzZVNSMl9GdWxsX0JJVAkJPSA0MCwKKwlFVEhUT09MX0xJTktfTU9ERV8xMDAwYmFzZVhfRnVsbF9CSVQJPSA0MSwKKwlFVEhUT09MX0xJTktfTU9ERV8xMDAwMGJhc2VDUl9GdWxsX0JJVAk9IDQyLAorCUVUSFRPT0xfTElOS19NT0RFXzEwMDAwYmFzZVNSX0Z1bGxfQklUCT0gNDMsCisJRVRIVE9PTF9MSU5LX01PREVfMTAwMDBiYXNlTFJfRnVsbF9CSVQJPSA0NCwKKwlFVEhUT09MX0xJTktfTU9ERV8xMDAwMGJhc2VMUk1fRnVsbF9CSVQJPSA0NSwKKwlFVEhUT09MX0xJTktfTU9ERV8xMDAwMGJhc2VFUl9GdWxsX0JJVAk9IDQ2LAorCiAKIAkvKiBMYXN0IGFsbG93ZWQgYml0IGZvciBfX0VUSFRPT0xfTElOS19NT0RFX0xFR0FDWV9NQVNLIGlzIGJpdAogCSAqIDMxLiBQbGVhc2UgZG8gTk9UIGRlZmluZSBhbnkgU1VQUE9SVEVEXyogb3IgQURWRVJUSVNFRF8qCkBAIC0xMzcxLDcgKzEzNzgsNyBAQAogCSAqLwogCiAJX19FVEhUT09MX0xJTktfTU9ERV9MQVNUCi0JICA9IEVUSFRPT0xfTElOS19NT0RFXzUwMDAwYmFzZVNSMl9GdWxsX0JJVCwKKwkgID0gRVRIVE9PTF9MSU5LX01PREVfMTAwMDBiYXNlRVJfRnVsbF9CSVQsCiB9OwogCiAjZGVmaW5lIF9fRVRIVE9PTF9MSU5LX01PREVfTEVHQUNZX01BU0soYmFzZV9uYW1lKQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvZnVzZS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2Z1c2UuaAppbmRleCAyN2UxNzM2Li40MmZhOTc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvZnVzZS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9mdXNlLmgKQEAgLTEwOCw2ICsxMDgsMTAgQEAKICAqCiAgKiAgNy4yNQogICogIC0gYWRkIEZVU0VfUEFSQUxMRUxfRElST1BTCisgKgorICogIDcuMjYKKyAqICAtIGFkZCBGVVNFX0hBTkRMRV9LSUxMUFJJVgorICogIC0gYWRkIEZVU0VfUE9TSVhfQUNMCiAgKi8KIAogI2lmbmRlZiBfTElOVVhfRlVTRV9ICkBAIC0xNDMsNyArMTQ3LDcgQEAKICNkZWZpbmUgRlVTRV9LRVJORUxfVkVSU0lPTiA3CiAKIC8qKiBNaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIGludGVyZmFjZSAqLwotI2RlZmluZSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OIDI1CisjZGVmaW5lIEZVU0VfS0VSTkVMX01JTk9SX1ZFUlNJT04gMjYKIAogLyoqIFRoZSBub2RlIElEIG9mIHRoZSByb290IGlub2RlICovCiAjZGVmaW5lIEZVU0VfUk9PVF9JRCAxCkBAIC0yMzgsNiArMjQyLDggQEAKICAqIEZVU0VfV1JJVEVCQUNLX0NBQ0hFOiB1c2Ugd3JpdGViYWNrIGNhY2hlIGZvciBidWZmZXJlZCB3cml0ZXMKICAqIEZVU0VfTk9fT1BFTl9TVVBQT1JUOiBrZXJuZWwgc3VwcG9ydHMgemVyby1tZXNzYWdlIG9wZW5zCiAgKiBGVVNFX1BBUkFMTEVMX0RJUk9QUzogYWxsb3cgcGFyYWxsZWwgbG9va3VwcyBhbmQgcmVhZGRpcgorICogRlVTRV9IQU5ETEVfS0lMTFBSSVY6IGZzIGhhbmRsZXMga2lsbGluZyBzdWlkL3NnaWQvY2FwIG9uIHdyaXRlL2Nob3duL3RydW5jCisgKiBGVVNFX1BPU0lYX0FDTDogZmlsZXN5c3RlbSBzdXBwb3J0cyBwb3NpeCBhY2xzCiAgKi8KICNkZWZpbmUgRlVTRV9BU1lOQ19SRUFECQkoMSA8PCAwKQogI2RlZmluZSBGVVNFX1BPU0lYX0xPQ0tTCSgxIDw8IDEpCkBAIC0yNTgsNiArMjY0LDggQEAKICNkZWZpbmUgRlVTRV9XUklURUJBQ0tfQ0FDSEUJKDEgPDwgMTYpCiAjZGVmaW5lIEZVU0VfTk9fT1BFTl9TVVBQT1JUCSgxIDw8IDE3KQogI2RlZmluZSBGVVNFX1BBUkFMTEVMX0RJUk9QUyAgICAoMSA8PCAxOCkKKyNkZWZpbmUgRlVTRV9IQU5ETEVfS0lMTFBSSVYJKDEgPDwgMTkpCisjZGVmaW5lIEZVU0VfUE9TSVhfQUNMCQkoMSA8PCAyMCkKIAogLyoqCiAgKiBDVVNFIElOSVQgcmVxdWVzdC9yZXBseSBmbGFncwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX2JyaWRnZS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lmX2JyaWRnZS5oCmluZGV4IGMxODZmNjQuLmFiOTJiY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9pZl9icmlkZ2UuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfYnJpZGdlLmgKQEAgLTE0MCw3ICsxNDAsNyBAQAogCV9fdTY0IHR4X2J5dGVzOwogCV9fdTY0IHR4X3BhY2tldHM7CiAJX191MTYgdmlkOwotCV9fdTE2IHBhZDE7CisJX191MTYgZmxhZ3M7CiAJX191MzIgcGFkMjsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9pZl9saW5rLmggYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfbGluay5oCmluZGV4IGExYjUyMDIuLmI0ZmJhNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9pZl9saW5rLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lmX2xpbmsuaApAQCAtMzE4LDYgKzMxOCw3IEBACiAJSUZMQV9CUlBPUlRfRkxVU0gsCiAJSUZMQV9CUlBPUlRfTVVMVElDQVNUX1JPVVRFUiwKIAlJRkxBX0JSUE9SVF9QQUQsCisJSUZMQV9CUlBPUlRfTUNBU1RfRkxPT0QsCiAJX19JRkxBX0JSUE9SVF9NQVgKIH07CiAjZGVmaW5lIElGTEFfQlJQT1JUX01BWCAoX19JRkxBX0JSUE9SVF9NQVggLSAxKQpAQCAtNDYzLDYgKzQ2NCw3IEBACiBlbnVtIGlwdmxhbl9tb2RlIHsKIAlJUFZMQU5fTU9ERV9MMiA9IDAsCiAJSVBWTEFOX01PREVfTDMsCisJSVBWTEFOX01PREVfTDNTLAogCUlQVkxBTl9NT0RFX01BWAogfTsKIApAQCAtNjE3LDcgKzYxOSw3IEBACiBlbnVtIHsKIAlJRkxBX1ZGX1VOU1BFQywKIAlJRkxBX1ZGX01BQywJCS8qIEhhcmR3YXJlIHF1ZXVlIHNwZWNpZmljIGF0dHJpYnV0ZXMgKi8KLQlJRkxBX1ZGX1ZMQU4sCisJSUZMQV9WRl9WTEFOLAkJLyogVkxBTiBJRCBhbmQgUW9TICovCiAJSUZMQV9WRl9UWF9SQVRFLAkvKiBNYXggVFggQmFuZHdpZHRoIEFsbG9jYXRpb24gKi8KIAlJRkxBX1ZGX1NQT09GQ0hLLAkvKiBTcG9vZiBDaGVja2luZyBvbi9vZmYgc3dpdGNoICovCiAJSUZMQV9WRl9MSU5LX1NUQVRFLAkvKiBsaW5rIHN0YXRlIGVuYWJsZS9kaXNhYmxlL2F1dG8gc3dpdGNoICovCkBAIC02MjksNiArNjMxLDcgQEAKIAlJRkxBX1ZGX1RSVVNULAkJLyogVHJ1c3QgVkYgKi8KIAlJRkxBX1ZGX0lCX05PREVfR1VJRCwJLyogVkYgSW5maW5pYmFuZCBub2RlIEdVSUQgKi8KIAlJRkxBX1ZGX0lCX1BPUlRfR1VJRCwJLyogVkYgSW5maW5pYmFuZCBwb3J0IEdVSUQgKi8KKwlJRkxBX1ZGX1ZMQU5fTElTVCwJLyogbmVzdGVkIGxpc3Qgb2YgdmxhbnMsIG9wdGlvbiBmb3IgUWluUSAqLwogCV9fSUZMQV9WRl9NQVgsCiB9OwogCkBAIC02NDUsNiArNjQ4LDIyIEBACiAJX191MzIgcW9zOwogfTsKIAorZW51bSB7CisJSUZMQV9WRl9WTEFOX0lORk9fVU5TUEVDLAorCUlGTEFfVkZfVkxBTl9JTkZPLAkvKiBWTEFOIElELCBRb1MgYW5kIFZMQU4gcHJvdG9jb2wgKi8KKwlfX0lGTEFfVkZfVkxBTl9JTkZPX01BWCwKK307CisKKyNkZWZpbmUgSUZMQV9WRl9WTEFOX0lORk9fTUFYIChfX0lGTEFfVkZfVkxBTl9JTkZPX01BWCAtIDEpCisjZGVmaW5lIE1BWF9WTEFOX0xJU1RfTEVOIDEKKworc3RydWN0IGlmbGFfdmZfdmxhbl9pbmZvIHsKKwlfX3UzMiB2ZjsKKwlfX3UzMiB2bGFuOyAvKiAwIC0gNDA5NSwgMCBkaXNhYmxlcyBWTEFOIGZpbHRlciAqLworCV9fdTMyIHFvczsKKwlfX2JlMTYgdmxhbl9wcm90bzsgLyogVkxBTiBwcm90b2NvbCBlaXRoZXIgODAyLjFRIG9yIDgwMi4xYWQgKi8KK307CisKIHN0cnVjdCBpZmxhX3ZmX3R4X3JhdGUgewogCV9fdTMyIHZmOwogCV9fdTMyIHJhdGU7IC8qIE1heCBUWCBiYW5kd2lkdGggaW4gTWJwcywgMCBkaXNhYmxlcyB0aHJvdHRsaW5nICovCkBAIC04MjUsNiArODQ0LDcgQEAKIAlJRkxBX1NUQVRTX0xJTktfNjQsCiAJSUZMQV9TVEFUU19MSU5LX1hTVEFUUywKIAlJRkxBX1NUQVRTX0xJTktfWFNUQVRTX1NMQVZFLAorCUlGTEFfU1RBVFNfTElOS19PRkZMT0FEX1hTVEFUUywKIAlfX0lGTEFfU1RBVFNfTUFYLAogfTsKIApAQCAtODQ0LDYgKzg2NCwxNCBAQAogfTsKICNkZWZpbmUgTElOS19YU1RBVFNfVFlQRV9NQVggKF9fTElOS19YU1RBVFNfVFlQRV9NQVggLSAxKQogCisvKiBUaGVzZSBhcmUgc3RhdHMgZW1iZWRkZWQgaW50byBJRkxBX1NUQVRTX0xJTktfT0ZGTE9BRF9YU1RBVFMgKi8KK2VudW0geworCUlGTEFfT0ZGTE9BRF9YU1RBVFNfVU5TUEVDLAorCUlGTEFfT0ZGTE9BRF9YU1RBVFNfQ1BVX0hJVCwgLyogc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICovCisJX19JRkxBX09GRkxPQURfWFNUQVRTX01BWAorfTsKKyNkZWZpbmUgSUZMQV9PRkZMT0FEX1hTVEFUU19NQVggKF9fSUZMQV9PRkZMT0FEX1hTVEFUU19NQVggLSAxKQorCiAvKiBYRFAgc2VjdGlvbiAqLwogCiBlbnVtIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9pZl9wcHBvbDJ0cC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lmX3BwcG9sMnRwLmgKaW5kZXggMTYzZThhZC4uNGJkMWY1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX3BwcG9sMnRwLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lmX3BwcG9sMnRwLmgKQEAgLTE2LDcgKzE2LDggQEAKICNkZWZpbmUgX1VBUElfX0xJTlVYX0lGX1BQUE9MMlRQX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgogCiAvKiBTdHJ1Y3R1cmUgdXNlZCB0byBjb25uZWN0KCkgdGhlIHNvY2tldCB0byBhIHBhcnRpY3VsYXIgdHVubmVsIFVEUAogICogc29ja2V0IG92ZXIgSVB2NC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9pZl9wcHBveC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lmX3BwcG94LmgKaW5kZXggZTEyODc2OS4uZDM3YmJiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX3BwcG94LmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lmX3BwcG94LmgKQEAgLTIxLDggKzIxLDExIEBACiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3BwcG9sMnRwLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KIAogLyogRm9yIHVzZXItc3BhY2UgcHJvZ3JhbXMgdG8gcGljayB1cCB0aGVzZSBkZWZpbml0aW9ucwogICogd2hpY2ggdGhleSB3b3VsZG4ndCBnZXQgb3RoZXJ3aXNlIHdpdGhvdXQgZGVmaW5pbmcgX19LRVJORUxfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX3R1bm5lbC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lmX3R1bm5lbC5oCmluZGV4IDEwNDZmNTUuLjkyZjNjODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9pZl90dW5uZWwuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfdHVubmVsLmgKQEAgLTIsNiArMiw5IEBACiAjZGVmaW5lIF9VQVBJX0lGX1RVTk5FTF9IXwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCiAKQEAgLTI0LDkgKzI3LDIzIEBACiAjZGVmaW5lIEdSRV9TRVEJCV9fY3B1X3RvX2JlMTYoMHgxMDAwKQogI2RlZmluZSBHUkVfU1RSSUNUCV9fY3B1X3RvX2JlMTYoMHgwODAwKQogI2RlZmluZSBHUkVfUkVDCQlfX2NwdV90b19iZTE2KDB4MDcwMCkKLSNkZWZpbmUgR1JFX0ZMQUdTCV9fY3B1X3RvX2JlMTYoMHgwMEY4KQorI2RlZmluZSBHUkVfQUNLCQlfX2NwdV90b19iZTE2KDB4MDA4MCkKKyNkZWZpbmUgR1JFX0ZMQUdTCV9fY3B1X3RvX2JlMTYoMHgwMDc4KQogI2RlZmluZSBHUkVfVkVSU0lPTglfX2NwdV90b19iZTE2KDB4MDAwNykKIAorI2RlZmluZSBHUkVfSVNfQ1NVTShmKQkJKChmKSAmIEdSRV9DU1VNKQorI2RlZmluZSBHUkVfSVNfUk9VVElORyhmKQkoKGYpICYgR1JFX1JPVVRJTkcpCisjZGVmaW5lIEdSRV9JU19LRVkoZikJCSgoZikgJiBHUkVfS0VZKQorI2RlZmluZSBHUkVfSVNfU0VRKGYpCQkoKGYpICYgR1JFX1NFUSkKKyNkZWZpbmUgR1JFX0lTX1NUUklDVChmKQkoKGYpICYgR1JFX1NUUklDVCkKKyNkZWZpbmUgR1JFX0lTX1JFQyhmKQkJKChmKSAmIEdSRV9SRUMpCisjZGVmaW5lIEdSRV9JU19BQ0soZikJCSgoZikgJiBHUkVfQUNLKQorCisjZGVmaW5lIEdSRV9WRVJTSU9OXzAJCV9fY3B1X3RvX2JlMTYoMHgwMDAwKQorI2RlZmluZSBHUkVfVkVSU0lPTl8xCQlfX2NwdV90b19iZTE2KDB4MDAwMSkKKyNkZWZpbmUgR1JFX1BST1RPX1BQUAkJX19jcHVfdG9fYmUxNigweDg4MGIpCisjZGVmaW5lIEdSRV9QUFRQX0tFWV9NQVNLCV9fY3B1X3RvX2JlMzIoMHhmZmZmKQorCiBzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gewogCWNoYXIJCQluYW1lW0lGTkFNU0laXTsKIAlpbnQJCQlsaW5rOwpAQCAtNTcsNiArNzQsNyBAQAogCUlGTEFfSVBUVU5fRU5DQVBfRkxBR1MsCiAJSUZMQV9JUFRVTl9FTkNBUF9TUE9SVCwKIAlJRkxBX0lQVFVOX0VOQ0FQX0RQT1JULAorCUlGTEFfSVBUVU5fQ09MTEVDVF9NRVRBREFUQSwKIAlfX0lGTEFfSVBUVU5fTUFYLAogfTsKICNkZWZpbmUgSUZMQV9JUFRVTl9NQVgJKF9fSUZMQV9JUFRVTl9NQVggLSAxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2luZXRfZGlhZy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2luZXRfZGlhZy5oCmluZGV4IGFiYmQxZGMuLjUwOWNkOTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9pbmV0X2RpYWcuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaW5ldF9kaWFnLmgKQEAgLTczLDYgKzczLDcgQEAKIAlJTkVUX0RJQUdfQkNfU19DT05ELAogCUlORVRfRElBR19CQ19EX0NPTkQsCiAJSU5FVF9ESUFHX0JDX0RFVl9DT05ELCAgIC8qIHUzMiBpZmluZGV4ICovCisJSU5FVF9ESUFHX0JDX01BUktfQ09ORCwKIH07CiAKIHN0cnVjdCBpbmV0X2RpYWdfaG9zdGNvbmQgewpAQCAtODIsNiArODMsMTEgQEAKIAlfX2JlMzIJYWRkclswXTsKIH07CiAKK3N0cnVjdCBpbmV0X2RpYWdfbWFya2NvbmQgeworCV9fdTMyIG1hcms7CisJX191MzIgbWFzazsKK307CisKIC8qIEJhc2UgaW5mbyBzdHJ1Y3R1cmUuIEl0IGNvbnRhaW5zIHNvY2tldCBpZGVudGl0eSAoYWRkcnMvcG9ydHMvY29va2llKQogICogYW5kLCBhbGFzLCB0aGUgaW5mb3JtYXRpb24gc2hvd24gYnkgbmV0c3RhdC4gKi8KIHN0cnVjdCBpbmV0X2RpYWdfbXNnIHsKQEAgLTExNyw2ICsxMjMsOCBAQAogCUlORVRfRElBR19MT0NBTFMsCiAJSU5FVF9ESUFHX1BFRVJTLAogCUlORVRfRElBR19QQUQsCisJSU5FVF9ESUFHX01BUkssCisJSU5FVF9ESUFHX0JCUklORk8sCiAJX19JTkVUX0RJQUdfTUFYLAogfTsKIApAQCAtMTUwLDggKzE1OCwyMCBAQAogCV9fdTMyCWRjdGNwX2FiX3RvdDsKIH07CiAKKy8qIElORVRfRElBR19CQlJJTkZPICovCisKK3N0cnVjdCB0Y3BfYmJyX2luZm8geworCS8qIHU2NCBidzogbWF4LWZpbHRlcmVkIEJXIChhcHAgdGhyb3VnaHB1dCkgZXN0aW1hdGUgaW4gQnl0ZSBwZXIgc2VjOiAqLworCV9fdTMyCWJicl9id19sbzsJCS8qIGxvd2VyIDMyIGJpdHMgb2YgYncgKi8KKwlfX3UzMgliYnJfYndfaGk7CQkvKiB1cHBlciAzMiBiaXRzIG9mIGJ3ICovCisJX191MzIJYmJyX21pbl9ydHQ7CQkvKiBtaW4tZmlsdGVyZWQgUlRUIGluIHVTZWMgKi8KKwlfX3UzMgliYnJfcGFjaW5nX2dhaW47CS8qIHBhY2luZyBnYWluIHNoaWZ0ZWQgbGVmdCA4IGJpdHMgKi8KKwlfX3UzMgliYnJfY3duZF9nYWluOwkJLyogY3duZCBnYWluIHNoaWZ0ZWQgbGVmdCA4IGJpdHMgKi8KK307CisKIHVuaW9uIHRjcF9jY19pbmZvIHsKIAlzdHJ1Y3QgdGNwdmVnYXNfaW5mbwl2ZWdhczsKIAlzdHJ1Y3QgdGNwX2RjdGNwX2luZm8JZGN0Y3A7CisJc3RydWN0IHRjcF9iYnJfaW5mbwliYnI7CiB9OwogI2VuZGlmIC8qIF9VQVBJX0lORVRfRElBR19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lwdjYuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9pcHY2LmgKaW5kZXggMzk1ODc2MC4uOGMyNzcyMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2lwdjYuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaXB2Ni5oCkBAIC0xNzcsNiArMTc3LDcgQEAKIAlERVZDT05GX0RST1BfVU5JQ0FTVF9JTl9MMl9NVUxUSUNBU1QsCiAJREVWQ09ORl9EUk9QX1VOU09MSUNJVEVEX05BLAogCURFVkNPTkZfS0VFUF9BRERSX09OX0RPV04sCisJREVWQ09ORl9SVFJfU09MSUNJVF9NQVhfSU5URVJWQUwsCiAJREVWQ09ORl9NQVgKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9pcHguaCBiL2luY2x1ZGUvdWFwaS9saW51eC9pcHguaAppbmRleCAzZDQ4MDE0Li4zMGYwMzFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvaXB4LmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lweC5oCkBAIC0xLDExICsxLDEzIEBACiAjaWZuZGVmIF9JUFhfSF8KICNkZWZpbmUgX0lQWF9IXworI2luY2x1ZGUgPGxpbnV4L2xpYmMtY29tcGF0Lmg+CS8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggZ2xpYmMgbmV0aXB4L2lweC5oICovCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CiAjZGVmaW5lIElQWF9OT0RFX0xFTgk2CiAjZGVmaW5lIElQWF9NVFUJCTU3NgogCisjaWYgX19VQVBJX0RFRl9TT0NLQUREUl9JUFgKIHN0cnVjdCBzb2NrYWRkcl9pcHggewogCV9fa2VybmVsX3NhX2ZhbWlseV90IHNpcHhfZmFtaWx5OwogCV9fYmUxNgkJc2lweF9wb3J0OwpAQCAtMTQsNiArMTYsNyBAQAogCV9fdTgJCXNpcHhfdHlwZTsKIAl1bnNpZ25lZCBjaGFyCXNpcHhfemVybzsJLyogMTYgYnl0ZSBmaWxsICovCiB9OworI2VuZGlmIC8qIF9fVUFQSV9ERUZfU09DS0FERFJfSVBYICovCiAKIC8qCiAgKiBTbyB3ZSBjYW4gZml0IHRoZSBleHRyYSBpbmZvIGZvciBTSU9DU0lGQUREUiBpbnRvIHRoZSBhZGRyZXNzIG5pY2VseQpAQCAtMjMsMTIgKzI2LDE1IEBACiAjZGVmaW5lIElQWF9ETFRJVEYJMAogI2RlZmluZSBJUFhfQ1JUSVRGCTEKIAorI2lmIF9fVUFQSV9ERUZfSVBYX1JPVVRFX0RFRklOSVRJT04KIHN0cnVjdCBpcHhfcm91dGVfZGVmaW5pdGlvbiB7CiAJX19iZTMyICAgICAgICBpcHhfbmV0d29yazsKIAlfX2JlMzIgICAgICAgIGlweF9yb3V0ZXJfbmV0d29yazsKIAl1bnNpZ25lZCBjaGFyIGlweF9yb3V0ZXJfbm9kZVtJUFhfTk9ERV9MRU5dOwogfTsKKyNlbmRpZiAvKiBfX1VBUElfREVGX0lQWF9ST1VURV9ERUZJTklUSU9OICovCiAKKyNpZiBfX1VBUElfREVGX0lQWF9JTlRFUkZBQ0VfREVGSU5JVElPTgogc3RydWN0IGlweF9pbnRlcmZhY2VfZGVmaW5pdGlvbiB7CiAJX19iZTMyICAgICAgICBpcHhfbmV0d29yazsKIAl1bnNpZ25lZCBjaGFyIGlweF9kZXZpY2VbMTZdOwpAQCAtNDUsMTYgKzUxLDIwIEBACiAjZGVmaW5lIElQWF9JTlRFUk5BTAkJMgogCXVuc2lnbmVkIGNoYXIgaXB4X25vZGVbSVBYX05PREVfTEVOXTsKIH07Ci0JCisjZW5kaWYgLyogX19VQVBJX0RFRl9JUFhfSU5URVJGQUNFX0RFRklOSVRJT04gKi8KKworI2lmIF9fVUFQSV9ERUZfSVBYX0NPTkZJR19EQVRBCiBzdHJ1Y3QgaXB4X2NvbmZpZ19kYXRhIHsKIAl1bnNpZ25lZCBjaGFyCWlweGNmZ19hdXRvX3NlbGVjdF9wcmltYXJ5OwogCXVuc2lnbmVkIGNoYXIJaXB4Y2ZnX2F1dG9fY3JlYXRlX2ludGVyZmFjZXM7CiB9OworI2VuZGlmIC8qIF9fVUFQSV9ERUZfSVBYX0NPTkZJR19EQVRBICovCiAKIC8qCiAgKiBPTEQgUm91dGUgRGVmaW5pdGlvbiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KICAqLwogCisjaWYgX19VQVBJX0RFRl9JUFhfUk9VVEVfREVGCiBzdHJ1Y3QgaXB4X3JvdXRlX2RlZiB7CiAJX19iZTMyCQlpcHhfbmV0d29yazsKIAlfX2JlMzIJCWlweF9yb3V0ZXJfbmV0d29yazsKQEAgLTY3LDYgKzc3LDcgQEAKICNkZWZpbmUgSVBYX1JUX0JMVUVCT09LCQkyCiAjZGVmaW5lIElQWF9SVF9ST1VURUQJCTEKIH07CisjZW5kaWYgLyogX19VQVBJX0RFRl9JUFhfUk9VVEVfREVGICovCiAKICNkZWZpbmUgU0lPQ0FJUFhJVEZDUlQJCShTSU9DUFJPVE9QUklWQVRFKQogI2RlZmluZSBTSU9DQUlQWFBSSVNMVAkJKFNJT0NQUk9UT1BSSVZBVEUgKyAxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2xpYmMtY29tcGF0LmggYi9pbmNsdWRlL3VhcGkvbGludXgvbGliYy1jb21wYXQuaAppbmRleCBlNGYwNDhlLi40NGI4YTZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbGliYy1jb21wYXQuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbGliYy1jb21wYXQuaApAQCAtMTM5LDYgKzEzOSwyNSBAQAogCiAjZW5kaWYgLyogX05FVElORVRfSU5fSCAqLwogCisvKiBDb29yZGluYXRlIHdpdGggZ2xpYmMgbmV0aXB4L2lweC5oIGhlYWRlci4gKi8KKyNpZiBkZWZpbmVkKF9fTkVUSVBYX0lQWF9IKQorCisjZGVmaW5lIF9fVUFQSV9ERUZfU09DS0FERFJfSVBYCQkJMAorI2RlZmluZSBfX1VBUElfREVGX0lQWF9ST1VURV9ERUZJTklUSU9OCQkwCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBYX0lOVEVSRkFDRV9ERUZJTklUSU9OCTAKKyNkZWZpbmUgX19VQVBJX0RFRl9JUFhfQ09ORklHX0RBVEEJCTAKKyNkZWZpbmUgX19VQVBJX0RFRl9JUFhfUk9VVEVfREVGCQkwCisKKyNlbHNlIC8qIGRlZmluZWQoX19ORVRJUFhfSVBYX0gpICovCisKKyNkZWZpbmUgX19VQVBJX0RFRl9TT0NLQUREUl9JUFgJCQkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBYX1JPVVRFX0RFRklOSVRJT04JCTEKKyNkZWZpbmUgX19VQVBJX0RFRl9JUFhfSU5URVJGQUNFX0RFRklOSVRJT04JMQorI2RlZmluZSBfX1VBUElfREVGX0lQWF9DT05GSUdfREFUQQkJMQorI2RlZmluZSBfX1VBUElfREVGX0lQWF9ST1VURV9ERUYJCTEKKworI2VuZGlmIC8qIGRlZmluZWQoX19ORVRJUFhfSVBYX0gpICovCisKIC8qIERlZmluaXRpb25zIGZvciB4YXR0ci5oICovCiAjaWYgZGVmaW5lZChfU1lTX1hBVFRSX0gpCiAjZGVmaW5lIF9fVUFQSV9ERUZfWEFUVFIJCTAKQEAgLTE3OSw2ICsxOTgsMTMgQEAKICNkZWZpbmUgX19VQVBJX0RFRl9JTjZfUEtUSU5GTwkJMQogI2RlZmluZSBfX1VBUElfREVGX0lQNl9NVFVJTkZPCQkxCiAKKy8qIERlZmluaXRpb25zIGZvciBpcHguaCAqLworI2RlZmluZSBfX1VBUElfREVGX1NPQ0tBRERSX0lQWAkJCTEKKyNkZWZpbmUgX19VQVBJX0RFRl9JUFhfUk9VVEVfREVGSU5JVElPTgkJMQorI2RlZmluZSBfX1VBUElfREVGX0lQWF9JTlRFUkZBQ0VfREVGSU5JVElPTgkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBYX0NPTkZJR19EQVRBCQkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBYX1JPVVRFX0RFRgkJMQorCiAvKiBEZWZpbml0aW9ucyBmb3IgeGF0dHIuaCAqLwogI2RlZmluZSBfX1VBUElfREVGX1hBVFRSCQkxCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9taWkuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9taWkuaAppbmRleCAyMzdmYWM0Li4xNWQ4NTEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbWlpLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L21paS5oCkBAIC00OCw2ICs0OCw3IEBACiAjZGVmaW5lIEJNQ1JfU1BFRUQxMDAJCTB4MjAwMAkvKiBTZWxlY3QgMTAwTWJwcyAgICAgICAgICAgICAgKi8KICNkZWZpbmUgQk1DUl9MT09QQkFDSwkJMHg0MDAwCS8qIFRYRCBsb29wYmFjayBiaXRzICAgICAgICAgICAqLwogI2RlZmluZSBCTUNSX1JFU0VUCQkweDgwMDAJLyogUmVzZXQgdG8gZGVmYXVsdCBzdGF0ZSAgICAgICovCisjZGVmaW5lIEJNQ1JfU1BFRUQxMAkJMHgwMDAwCS8qIFNlbGVjdCAxME1icHMgICAgICAgICAgICAgICAqLwogCiAvKiBCYXNpYyBtb2RlIHN0YXR1cyByZWdpc3Rlci4gKi8KICNkZWZpbmUgQk1TUl9FUkNBUAkJMHgwMDAxCS8qIEV4dC1yZWcgY2FwYWJpbGl0eSAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci9uZl9sb2cuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZfbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlMjFlMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZfbG9nLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfTkVURklMVEVSX05GX0xPR19ICisjZGVmaW5lIF9ORVRGSUxURVJfTkZfTE9HX0gKKworI2RlZmluZSBORl9MT0dfVENQU0VRCQkweDAxCS8qIExvZyBUQ1Agc2VxdWVuY2UgbnVtYmVycyAqLworI2RlZmluZSBORl9MT0dfVENQT1BUCQkweDAyCS8qIExvZyBUQ1Agb3B0aW9ucyAqLworI2RlZmluZSBORl9MT0dfSVBPUFQJCTB4MDQJLyogTG9nIElQIG9wdGlvbnMgKi8KKyNkZWZpbmUgTkZfTE9HX1VJRAkJMHgwOAkvKiBMb2cgVUlEIG93bmluZyBsb2NhbCBzb2NrZXQgKi8KKyNkZWZpbmUgTkZfTE9HX05GTE9HCQkweDEwCS8qIFVuc3VwcG9ydGVkLCBkb24ndCByZXVzZSAqLworI2RlZmluZSBORl9MT0dfTUFDREVDT0RFCTB4MjAJLyogRGVjb2RlIE1BQyBoZWFkZXIgKi8KKyNkZWZpbmUgTkZfTE9HX01BU0sJCTB4MmYKKworI2VuZGlmIC8qIF9ORVRGSUxURVJfTkZfTE9HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL25mX3RhYmxlcy5oCmluZGV4IDAxNzUxZmEuLmM2YzQ0NzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaApAQCAtMjQsNyArMjQsNyBAQAogCV9fTkZUX1JFR19NQVgsCiAKIAlORlRfUkVHMzJfMDAJPSA4LAotCU1GVF9SRUczMl8wMSwKKwlORlRfUkVHMzJfMDEsCiAJTkZUX1JFRzMyXzAyLAogCU5GVF9SRUczMl8wMywKIAlORlRfUkVHMzJfMDQsCkBAIC01NDYsNiArNTQ2LDM1IEBACiB9OwogI2RlZmluZSBORlRBX0NNUF9NQVgJCShfX05GVEFfQ01QX01BWCAtIDEpCiAKKy8qKgorICogZW51bSBuZnRfcmFuZ2Vfb3BzIC0gbmZfdGFibGVzIHJhbmdlIG9wZXJhdG9yCisgKgorICogQE5GVF9SQU5HRV9FUTogZXF1YWwKKyAqIEBORlRfUkFOR0VfTkVROiBub3QgZXF1YWwKKyAqLworZW51bSBuZnRfcmFuZ2Vfb3BzIHsKKwlORlRfUkFOR0VfRVEsCisJTkZUX1JBTkdFX05FUSwKK307CisKKy8qKgorICogZW51bSBuZnRfcmFuZ2VfYXR0cmlidXRlcyAtIG5mX3RhYmxlcyByYW5nZSBleHByZXNzaW9uIG5ldGxpbmsgYXR0cmlidXRlcworICoKKyAqIEBORlRBX1JBTkdFX1NSRUc6IHNvdXJjZSByZWdpc3RlciBvZiBkYXRhIHRvIGNvbXBhcmUgKE5MQV9VMzI6IG5mdF9yZWdpc3RlcnMpCisgKiBATkZUQV9SQU5HRV9PUDogY21wIG9wZXJhdGlvbiAoTkxBX1UzMjogbmZ0X2NtcF9vcHMpCisgKiBATkZUQV9SQU5HRV9GUk9NX0RBVEE6IGRhdGEgcmFuZ2UgZnJvbSAoTkxBX05FU1RFRDogbmZ0X2RhdGFfYXR0cmlidXRlcykKKyAqIEBORlRBX1JBTkdFX1RPX0RBVEE6IGRhdGEgcmFuZ2UgdG8gKE5MQV9ORVNURUQ6IG5mdF9kYXRhX2F0dHJpYnV0ZXMpCisgKi8KK2VudW0gbmZ0X3JhbmdlX2F0dHJpYnV0ZXMgeworCU5GVEFfUkFOR0VfVU5TUEVDLAorCU5GVEFfUkFOR0VfU1JFRywKKwlORlRBX1JBTkdFX09QLAorCU5GVEFfUkFOR0VfRlJPTV9EQVRBLAorCU5GVEFfUkFOR0VfVE9fREFUQSwKKwlfX05GVEFfUkFOR0VfTUFYCit9OworI2RlZmluZSBORlRBX1JBTkdFX01BWAkJKF9fTkZUQV9SQU5HRV9NQVggLSAxKQorCiBlbnVtIG5mdF9sb29rdXBfZmxhZ3MgewogCU5GVF9MT09LVVBfRl9JTlYgPSAoMSA8PCAwKSwKIH07CkBAIC01NzUsNiArNjA0LDEwIEBACiAJTkZUX0RZTlNFVF9PUF9VUERBVEUsCiB9OwogCitlbnVtIG5mdF9keW5zZXRfZmxhZ3MgeworCU5GVF9EWU5TRVRfRl9JTlYJPSAoMSA8PCAwKSwKK307CisKIC8qKgogICogZW51bSBuZnRfZHluc2V0X2F0dHJpYnV0ZXMgLSBkeW5zZXQgZXhwcmVzc2lvbiBhdHRyaWJ1dGVzCiAgKgpAQCAtNTg1LDYgKzYxOCw3IEBACiAgKiBATkZUQV9EWU5TRVRfU1JFR19EQVRBOiBzb3VyY2UgcmVnaXN0ZXIgb2YgdGhlIGRhdGEgKE5MQV9VMzIpCiAgKiBATkZUQV9EWU5TRVRfVElNRU9VVDogdGltZW91dCB2YWx1ZSBmb3IgdGhlIG5ldyBlbGVtZW50IChOTEFfVTY0KQogICogQE5GVEFfRFlOU0VUX0VYUFI6IGV4cHJlc3Npb24gKE5MQV9ORVNURUQ6IG5mdF9leHByX2F0dHJpYnV0ZXMpCisgKiBATkZUQV9EWU5TRVRfRkxBR1M6IGZsYWdzIChOTEFfVTMyKQogICovCiBlbnVtIG5mdF9keW5zZXRfYXR0cmlidXRlcyB7CiAJTkZUQV9EWU5TRVRfVU5TUEVDLApAQCAtNTk2LDYgKzYzMCw3IEBACiAJTkZUQV9EWU5TRVRfVElNRU9VVCwKIAlORlRBX0RZTlNFVF9FWFBSLAogCU5GVEFfRFlOU0VUX1BBRCwKKwlORlRBX0RZTlNFVF9GTEFHUywKIAlfX05GVEFfRFlOU0VUX01BWCwKIH07CiAjZGVmaW5lIE5GVEFfRFlOU0VUX01BWAkJKF9fTkZUQV9EWU5TRVRfTUFYIC0gMSkKQEAgLTcyNCw2ICs3NTksMjggQEAKIH07CiAKIC8qKgorICogZW51bSBuZnRfaGFzaF9hdHRyaWJ1dGVzIC0gbmZfdGFibGVzIGhhc2ggZXhwcmVzc2lvbiBuZXRsaW5rIGF0dHJpYnV0ZXMKKyAqCisgKiBATkZUQV9IQVNIX1NSRUc6IHNvdXJjZSByZWdpc3RlciAoTkxBX1UzMikKKyAqIEBORlRBX0hBU0hfRFJFRzogZGVzdGluYXRpb24gcmVnaXN0ZXIgKE5MQV9VMzIpCisgKiBATkZUQV9IQVNIX0xFTjogc291cmNlIGRhdGEgbGVuZ3RoIChOTEFfVTMyKQorICogQE5GVEFfSEFTSF9NT0RVTFVTOiBtb2R1bHVzIHZhbHVlIChOTEFfVTMyKQorICogQE5GVEFfSEFTSF9TRUVEOiBzZWVkIHZhbHVlIChOTEFfVTMyKQorICogQE5GVEFfSEFTSF9PRkZTRVQ6IGFkZCB0aGlzIG9mZnNldCB2YWx1ZSB0byBoYXNoIHJlc3VsdCAoTkxBX1UzMikKKyAqLworZW51bSBuZnRfaGFzaF9hdHRyaWJ1dGVzIHsKKwlORlRBX0hBU0hfVU5TUEVDLAorCU5GVEFfSEFTSF9TUkVHLAorCU5GVEFfSEFTSF9EUkVHLAorCU5GVEFfSEFTSF9MRU4sCisJTkZUQV9IQVNIX01PRFVMVVMsCisJTkZUQV9IQVNIX1NFRUQsCisJTkZUQV9IQVNIX09GRlNFVCwKKwlfX05GVEFfSEFTSF9NQVgsCit9OworI2RlZmluZSBORlRBX0hBU0hfTUFYCShfX05GVEFfSEFTSF9NQVggLSAxKQorCisvKioKICAqIGVudW0gbmZ0X21ldGFfYXR0cmlidXRlcyAtIG5mX3RhYmxlcyBtZXRhIGV4cHJlc3Npb24gbmV0bGluayBhdHRyaWJ1dGVzCiAgKgogICogQE5GVEFfTUVUQV9EUkVHOiBkZXN0aW5hdGlvbiByZWdpc3RlciAoTkxBX1UzMikKQEAgLTg2NiwxMiArOTIzLDE0IEBACiAgKiBATkZUQV9RVUVVRV9OVU06IG5ldGxpbmsgcXVldWUgdG8gc2VuZCBtZXNzYWdlcyB0byAoTkxBX1UxNikKICAqIEBORlRBX1FVRVVFX1RPVEFMOiBudW1iZXIgb2YgcXVldWVzIHRvIGxvYWQgYmFsYW5jZSBwYWNrZXRzIG9uIChOTEFfVTE2KQogICogQE5GVEFfUVVFVUVfRkxBR1M6IHZhcmlvdXMgZmxhZ3MgKE5MQV9VMTYpCisgKiBATkZUQV9RVUVVRV9TUkVHX1FOVU06IHNvdXJjZSByZWdpc3RlciBvZiBxdWV1ZSBudW1iZXIgKE5MQV9VMzI6IG5mdF9yZWdpc3RlcnMpCiAgKi8KIGVudW0gbmZ0X3F1ZXVlX2F0dHJpYnV0ZXMgewogCU5GVEFfUVVFVUVfVU5TUEVDLAogCU5GVEFfUVVFVUVfTlVNLAogCU5GVEFfUVVFVUVfVE9UQUwsCiAJTkZUQV9RVUVVRV9GTEFHUywKKwlORlRBX1FVRVVFX1NSRUdfUU5VTSwKIAlfX05GVEFfUVVFVUVfTUFYCiB9OwogI2RlZmluZSBORlRBX1FVRVVFX01BWAkJKF9fTkZUQV9RVUVVRV9NQVggLSAxKQpAQCAtODgwLDYgKzkzOSwyNSBAQAogI2RlZmluZSBORlRfUVVFVUVfRkxBR19DUFVfRkFOT1VUCTB4MDIgLyogdXNlIGN1cnJlbnQgQ1BVIChubyBoYXNoaW5nKSAqLwogI2RlZmluZSBORlRfUVVFVUVfRkxBR19NQVNLCQkweDAzCiAKK2VudW0gbmZ0X3F1b3RhX2ZsYWdzIHsKKwlORlRfUVVPVEFfRl9JTlYJCT0gKDEgPDwgMCksCit9OworCisvKioKKyAqIGVudW0gbmZ0X3F1b3RhX2F0dHJpYnV0ZXMgLSBuZl90YWJsZXMgcXVvdGEgZXhwcmVzc2lvbiBuZXRsaW5rIGF0dHJpYnV0ZXMKKyAqCisgKiBATkZUQV9RVU9UQV9CWVRFUzogcXVvdGEgaW4gYnl0ZXMgKE5MQV9VMTYpCisgKiBATkZUQV9RVU9UQV9GTEFHUzogZmxhZ3MgKE5MQV9VMzIpCisgKi8KK2VudW0gbmZ0X3F1b3RhX2F0dHJpYnV0ZXMgeworCU5GVEFfUVVPVEFfVU5TUEVDLAorCU5GVEFfUVVPVEFfQllURVMsCisJTkZUQV9RVU9UQV9GTEFHUywKKwlORlRBX1FVT1RBX1BBRCwKKwlfX05GVEFfUVVPVEFfTUFYCit9OworI2RlZmluZSBORlRBX1FVT1RBX01BWAkJKF9fTkZUQV9RVU9UQV9NQVggLSAxKQorCiAvKioKICAqIGVudW0gbmZ0X3JlamVjdF90eXBlcyAtIG5mX3RhYmxlcyByZWplY3QgZXhwcmVzc2lvbiByZWplY3QgdHlwZXMKICAqCkBAIC0xMDUxLDcgKzExMjksNyBAQAogICogQE5GVEFfVFJBQ0VfTkZQUk9UTzogbmYgcHJvdG9jb2wgcHJvY2Vzc2VkIChOTEFfVTMyKQogICogQE5GVEFfVFJBQ0VfUE9MSUNZOiBwb2xpY3kgdGhhdCBkZWNpZGVkIGZhdGUgb2YgcGFja2V0IChOTEFfVTMyKQogICovCi1lbnVtIG5mdF90cmFjZV9hdHRpYnV0ZXMgeworZW51bSBuZnRfdHJhY2VfYXR0cmlidXRlcyB7CiAJTkZUQV9UUkFDRV9VTlNQRUMsCiAJTkZUQV9UUkFDRV9UQUJMRSwKIAlORlRBX1RSQUNFX0NIQUlOLApAQCAtMTA4Miw0ICsxMTYwLDMwIEBACiAJX19ORlRfVFJBQ0VUWVBFX01BWAogfTsKICNkZWZpbmUgTkZUX1RSQUNFVFlQRV9NQVggKF9fTkZUX1RSQUNFVFlQRV9NQVggLSAxKQorCisvKioKKyAqIGVudW0gbmZ0X25nX2F0dHJpYnV0ZXMgLSBuZl90YWJsZXMgbnVtYmVyIGdlbmVyYXRvciBleHByZXNzaW9uIG5ldGxpbmsgYXR0cmlidXRlcworICoKKyAqIEBORlRBX05HX0RSRUc6IGRlc3RpbmF0aW9uIHJlZ2lzdGVyIChOTEFfVTMyKQorICogQE5GVEFfTkdfTU9EVUxVUzogbWF4aW11bSBjb3VudGVyIHZhbHVlIChOTEFfVTMyKQorICogQE5GVEFfTkdfVFlQRTogb3BlcmF0aW9uIHR5cGUgKE5MQV9VMzIpCisgKiBATkZUQV9OR19PRkZTRVQ6IG9mZnNldCB0byBiZSBhZGRlZCB0byB0aGUgY291bnRlciAoTkxBX1UzMikKKyAqLworZW51bSBuZnRfbmdfYXR0cmlidXRlcyB7CisJTkZUQV9OR19VTlNQRUMsCisJTkZUQV9OR19EUkVHLAorCU5GVEFfTkdfTU9EVUxVUywKKwlORlRBX05HX1RZUEUsCisJTkZUQV9OR19PRkZTRVQsCisJX19ORlRBX05HX01BWAorfTsKKyNkZWZpbmUgTkZUQV9OR19NQVgJKF9fTkZUQV9OR19NQVggLSAxKQorCitlbnVtIG5mdF9uZ190eXBlcyB7CisJTkZUX05HX0lOQ1JFTUVOVEFMLAorCU5GVF9OR19SQU5ET00sCisJX19ORlRfTkdfTUFYCit9OworI2RlZmluZSBORlRfTkdfTUFYCShfX05GVF9OR19NQVggLSAxKQorCiAjZW5kaWYgLyogX0xJTlVYX05GX1RBQkxFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaCBiL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2Nvbm50cmFjay5oCmluZGV4IDlkZjc4OTcwLi42ZGViODg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaApAQCAtMjMxLDEzICsyMzEsMTMgQEAKIAogZW51bSBjdGF0dHJfc3RhdHNfY3B1IHsKIAlDVEFfU1RBVFNfVU5TUEVDLAotCUNUQV9TVEFUU19TRUFSQ0hFRCwKKwlDVEFfU1RBVFNfU0VBUkNIRUQsCS8qIG5vIGxvbmdlciB1c2VkICovCiAJQ1RBX1NUQVRTX0ZPVU5ELAotCUNUQV9TVEFUU19ORVcsCisJQ1RBX1NUQVRTX05FVywJCS8qIG5vIGxvbmdlciB1c2VkICovCiAJQ1RBX1NUQVRTX0lOVkFMSUQsCiAJQ1RBX1NUQVRTX0lHTk9SRSwKLQlDVEFfU1RBVFNfREVMRVRFLAotCUNUQV9TVEFUU19ERUxFVEVfTElTVCwKKwlDVEFfU1RBVFNfREVMRVRFLAkvKiBubyBsb25nZXIgdXNlZCAqLworCUNUQV9TVEFUU19ERUxFVEVfTElTVCwJLyogbm8gbG9uZ2VyIHVzZWQgKi8KIAlDVEFfU1RBVFNfSU5TRVJULAogCUNUQV9TVEFUU19JTlNFUlRfRkFJTEVELAogCUNUQV9TVEFUU19EUk9QLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci94dF9oYXNobGltaXQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmgKaW5kZXggNmRiOTAzNy4uM2VmYzBjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci94dF9oYXNobGltaXQuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5oCkBAIC02LDYgKzYsNyBAQAogCiAvKiB0aW1pbmdzIGFyZSBpbiBtaWxsaXNlY29uZHMuICovCiAjZGVmaW5lIFhUX0hBU0hMSU1JVF9TQ0FMRSAxMDAwMAorI2RlZmluZSBYVF9IQVNITElNSVRfU0NBTEVfdjIgMTAwMDAwMGxsdQogLyogMS8xMCwwMDAgc2VjIHBlcmlvZCA9PiBtYXggb2YgMTAsMDAwL3NlYy4gIE1pbiByYXRlIGlzIHRoZW4gNDI5NDkwCiAgKiBzZWNvbmRzLCBvciBvbmUgcGFja2V0IGV2ZXJ5IDU5IGhvdXJzLgogICovCkBAIC02Myw2ICs2NCwyMCBAQAogCV9fdTggc3JjbWFzaywgZHN0bWFzazsKIH07CiAKK3N0cnVjdCBoYXNobGltaXRfY2ZnMiB7CisJX191NjQgYXZnOwkJLyogQXZlcmFnZSBzZWNzIGJldHdlZW4gcGFja2V0cyAqIHNjYWxlICovCisJX191NjQgYnVyc3Q7CQkvKiBQZXJpb2QgbXVsdGlwbGllciBmb3IgdXBwZXIgbGltaXQuICovCisJX191MzIgbW9kZTsJCS8qIGJpdG1hc2sgb2YgWFRfSEFTSExJTUlUX0hBU0hfKiAqLworCisJLyogdXNlciBzcGVjaWZpZWQgKi8KKwlfX3UzMiBzaXplOwkJLyogaG93IG1hbnkgYnVja2V0cyAqLworCV9fdTMyIG1heDsJCS8qIG1heCBudW1iZXIgb2YgZW50cmllcyAqLworCV9fdTMyIGdjX2ludGVydmFsOwkvKiBnYyBpbnRlcnZhbCAqLworCV9fdTMyIGV4cGlyZTsJCS8qIHdoZW4gZG8gZW50cmllcyBleHBpcmU/ICovCisKKwlfX3U4IHNyY21hc2ssIGRzdG1hc2s7Cit9OworCiBzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEgewogCWNoYXIgbmFtZVtJRk5BTVNJWl07CiAJc3RydWN0IGhhc2hsaW1pdF9jZmcxIGNmZzsKQEAgLTcxLDQgKzg2LDEyIEBACiAJc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKIH07CiAKK3N0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMiB7CisJY2hhciBuYW1lW05BTUVfTUFYXTsKKwlzdHJ1Y3QgaGFzaGxpbWl0X2NmZzIgY2ZnOworCisJLyogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBrZXJuZWwgKi8KKwlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm8gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworfTsKKwogI2VuZGlmIC8qIF9VQVBJX1hUX0hBU0hMSU1JVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbmw4MDIxMS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L25sODAyMTEuaAppbmRleCAyMjA2OTQxLi41NjM2OGU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbmw4MDIxMS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9ubDgwMjExLmgKQEAgLTQ4LDYgKzQ4LDcgQEAKICNkZWZpbmUgTkw4MDIxMV9NVUxUSUNBU1RfR1JPVVBfUkVHCQkicmVndWxhdG9yeSIKICNkZWZpbmUgTkw4MDIxMV9NVUxUSUNBU1RfR1JPVVBfTUxNRQkJIm1sbWUiCiAjZGVmaW5lIE5MODAyMTFfTVVMVElDQVNUX0dST1VQX1ZFTkRPUgkJInZlbmRvciIKKyNkZWZpbmUgTkw4MDIxMV9NVUxUSUNBU1RfR1JPVVBfTkFOCQkibmFuIgogI2RlZmluZSBOTDgwMjExX01VTFRJQ0FTVF9HUk9VUF9URVNUTU9ERQkidGVzdG1vZGUiCiAKIC8qKgpAQCAtODM4LDYgKzgzOSw0MSBAQAogICoJbm90IHJ1bm5pbmcuIFRoZSBkcml2ZXIgaW5kaWNhdGVzIHRoZSBzdGF0dXMgb2YgdGhlIHNjYW4gdGhyb3VnaAogICoJY2ZnODAyMTFfc2Nhbl9kb25lKCkuCiAgKgorICogQE5MODAyMTFfQ01EX1NUQVJUX05BTjogU3RhcnQgTkFOIG9wZXJhdGlvbiwgaWRlbnRpZmllZCBieSBpdHMKKyAqCSVOTDgwMjExX0FUVFJfV0RFViBpbnRlcmZhY2UuIFRoaXMgaW50ZXJmYWNlIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkKKyAqCWNyZWF0ZWQgd2l0aCAlTkw4MDIxMV9DTURfTkVXX0lOVEVSRkFDRS4gQWZ0ZXIgaXQgaGFzIGJlZW4gc3RhcnRlZCwgdGhlCisgKglOQU4gaW50ZXJmYWNlIHdpbGwgY3JlYXRlIG9yIGpvaW4gYSBjbHVzdGVyLiBUaGlzIGNvbW1hbmQgbXVzdCBoYXZlIGEKKyAqCXZhbGlkICVOTDgwMjExX0FUVFJfTkFOX01BU1RFUl9QUkVGIGF0dHJpYnV0ZSBhbmQgb3B0aW9uYWwKKyAqCSVOTDgwMjExX0FUVFJfTkFOX0RVQUwgYXR0cmlidXRlcy4KKyAqCUFmdGVyIHRoaXMgY29tbWFuZCBOQU4gZnVuY3Rpb25zIGNhbiBiZSBhZGRlZC4KKyAqIEBOTDgwMjExX0NNRF9TVE9QX05BTjogU3RvcCB0aGUgTkFOIG9wZXJhdGlvbiwgaWRlbnRpZmllZCBieQorICoJaXRzICVOTDgwMjExX0FUVFJfV0RFViBpbnRlcmZhY2UuCisgKiBATkw4MDIxMV9DTURfQUREX05BTl9GVU5DVElPTjogQWRkIGEgTkFOIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gaXMgZGVmaW5lZAorICoJd2l0aCAlTkw4MDIxMV9BVFRSX05BTl9GVU5DIG5lc3RlZCBhdHRyaWJ1dGUuIFdoZW4gY2FsbGVkLCB0aGlzCisgKglvcGVyYXRpb24gcmV0dXJucyB0aGUgc3RyaWN0bHkgcG9zaXRpdmUgYW5kIHVuaXF1ZSBpbnN0YW5jZSBpZAorICoJKCVOTDgwMjExX0FUVFJfTkFOX0ZVTkNfSU5TVF9JRCkgYW5kIGEgY29va2llICglTkw4MDIxMV9BVFRSX0NPT0tJRSkKKyAqCW9mIHRoZSBmdW5jdGlvbiB1cG9uIHN1Y2Nlc3MuCisgKglTaW5jZSBpbnN0YW5jZSBJRCdzIGNhbiBiZSByZS11c2VkLCB0aGlzIGNvb2tpZSBpcyB0aGUgcmlnaHQKKyAqCXdheSB0byBpZGVudGlmeSB0aGUgZnVuY3Rpb24uIFRoaXMgd2lsbCBhdm9pZCByYWNlcyB3aGVuIGEgdGVybWluYXRpb24KKyAqCWV2ZW50IGlzIGhhbmRsZWQgYnkgdGhlIHVzZXIgc3BhY2UgYWZ0ZXIgaXQgaGFzIGFscmVhZHkgYWRkZWQgYSBuZXcKKyAqCWZ1bmN0aW9uIHRoYXQgZ290IHRoZSBzYW1lIGluc3RhbmNlIGlkIGZyb20gdGhlIGtlcm5lbCBhcyB0aGUgb25lCisgKgl3aGljaCBqdXN0IHRlcm1pbmF0ZWQuCisgKglUaGlzIGNvb2tpZSBtYXkgYmUgdXNlZCBpbiBOQU4gZXZlbnRzIGV2ZW4gYmVmb3JlIHRoZSBjb21tYW5kCisgKglyZXR1cm5zLCBzbyB1c2Vyc3BhY2Ugc2hvdWxkbid0IHByb2Nlc3MgTkFOIGV2ZW50cyB1bnRpbCBpdCBwcm9jZXNzZXMKKyAqCXRoZSByZXNwb25zZSB0byB0aGlzIGNvbW1hbmQuCisgKglMb29rIGF0ICVOTDgwMjExX0FUVFJfU09DS0VUX09XTkVSIGFzIHdlbGwuCisgKiBATkw4MDIxMV9DTURfREVMX05BTl9GVU5DVElPTjogRGVsZXRlIGEgTkFOIGZ1bmN0aW9uIGJ5IGNvb2tpZS4KKyAqCVRoaXMgY29tbWFuZCBpcyBhbHNvIHVzZWQgYXMgYSBub3RpZmljYXRpb24gc2VudCB3aGVuIGEgTkFOIGZ1bmN0aW9uIGlzCisgKgl0ZXJtaW5hdGVkLiBUaGlzIHdpbGwgY29udGFpbiBhICVOTDgwMjExX0FUVFJfTkFOX0ZVTkNfSU5TVF9JRAorICoJYW5kICVOTDgwMjExX0FUVFJfQ09PS0lFIGF0dHJpYnV0ZXMuCisgKiBATkw4MDIxMV9DTURfQ0hBTkdFX05BTl9DT05GSUc6IENoYW5nZSBjdXJyZW50IE5BTiBjb25maWd1cmF0aW9uLiBOQU4KKyAqCW11c3QgYmUgb3BlcmF0aW9uYWwgKCVOTDgwMjExX0NNRF9TVEFSVF9OQU4gd2FzIGV4ZWN1dGVkKS4KKyAqCUl0IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorICoJJU5MODAyMTFfQVRUUl9OQU5fTUFTVEVSX1BSRUYsICVOTDgwMjExX0FUVFJfTkFOX0RVQUwuCisgKiBATkw4MDIxMV9DTURfTkFOX0ZVTkNfTUFUQ0g6IE5vdGlmaWNhdGlvbiBzZW50IHdoZW4gYSBtYXRjaCBpcyByZXBvcnRlZC4KKyAqCVRoaXMgd2lsbCBjb250YWluIGEgJU5MODAyMTFfQVRUUl9OQU5fTUFUQ0ggbmVzdGVkIGF0dHJpYnV0ZSBhbmQKKyAqCSVOTDgwMjExX0FUVFJfQ09PS0lFLgorICoKICAqIEBOTDgwMjExX0NNRF9NQVg6IGhpZ2hlc3QgdXNlZCBjb21tYW5kIG51bWJlcgogICogQF9fTkw4MDIxMV9DTURfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCiAgKi8KQEAgLTEwMjYsNiArMTA2MiwxMyBAQAogCiAJTkw4MDIxMV9DTURfQUJPUlRfU0NBTiwKIAorCU5MODAyMTFfQ01EX1NUQVJUX05BTiwKKwlOTDgwMjExX0NNRF9TVE9QX05BTiwKKwlOTDgwMjExX0NNRF9BRERfTkFOX0ZVTkNUSU9OLAorCU5MODAyMTFfQ01EX0RFTF9OQU5fRlVOQ1RJT04sCisJTkw4MDIxMV9DTURfQ0hBTkdFX05BTl9DT05GSUcsCisJTkw4MDIxMV9DTURfTkFOX01BVENILAorCiAJLyogYWRkIG5ldyBjb21tYW5kcyBhYm92ZSBoZXJlICovCiAKIAkvKiB1c2VkIHRvIGRlZmluZSBOTDgwMjExX0NNRF9NQVggYmVsb3cgKi8KQEAgLTEzNDMsNyArMTM4NiwxMyBAQAogICoJZW51bSBubDgwMjExX2JhbmQgdmFsdWUgaXMgdXNlZCBhcyB0aGUgaW5kZXggKG5sYV90eXBlKCkgb2YgdGhlIG5lc3RlZAogICoJZGF0YS4gSWYgYSBiYW5kIGlzIG5vdCBpbmNsdWRlZCwgaXQgd2lsbCBiZSBjb25maWd1cmVkIHRvIGFsbG93IGFsbAogICoJcmF0ZXMgYmFzZWQgb24gbmVnb3RpYXRlZCBzdXBwb3J0ZWQgcmF0ZXMgaW5mb3JtYXRpb24uIFRoaXMgYXR0cmlidXRlCi0gKglpcyB1c2VkIHdpdGggJU5MODAyMTFfQ01EX1NFVF9UWF9CSVRSQVRFX01BU0suCisgKglpcyB1c2VkIHdpdGggJU5MODAyMTFfQ01EX1NFVF9UWF9CSVRSQVRFX01BU0sgYW5kIHdpdGggc3RhcnRpbmcgQVAsCisgKglhbmQgam9pbmluZyBtZXNoIG5ldHdvcmtzIChub3QgSUJTUyB5ZXQpLiBJbiB0aGUgbGF0ZXIgY2FzZSwgaXQgbXVzdAorICoJc3BlY2lmeSBqdXN0IGEgc2luZ2xlIGJpdHJhdGUsIHdoaWNoIGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBiZWFjb24uCisgKglUaGUgZHJpdmVyIG11c3QgYWxzbyBzcGVjaWZ5IHN1cHBvcnQgZm9yIHRoaXMgd2l0aCB0aGUgZXh0ZW5kZWQKKyAqCWZlYXR1cmVzIE5MODAyMTFfRVhUX0ZFQVRVUkVfQkVBQ09OX1JBVEVfTEVHQUNZLAorICoJTkw4MDIxMV9FWFRfRkVBVFVSRV9CRUFDT05fUkFURV9IVCBhbmQKKyAqCU5MODAyMTFfRVhUX0ZFQVRVUkVfQkVBQ09OX1JBVEVfVkhULgogICoKICAqIEBOTDgwMjExX0FUVFJfRlJBTUVfTUFUQ0g6IEEgYmluYXJ5IGF0dHJpYnV0ZSB3aGljaCB0eXBpY2FsbHkgbXVzdCBjb250YWluCiAgKglhdCBsZWFzdCBvbmUgYnl0ZSwgY3VycmVudGx5IHVzZWQgd2l0aCBATkw4MDIxMV9DTURfUkVHSVNURVJfRlJBTUUuCkBAIC0xNzMzLDYgKzE3ODIsMTIgQEAKICAqCXJlZ3VsYXRvcnkgaW5kb29yIGNvbmZpZ3VyYXRpb24gd291bGQgYmUgb3duZWQgYnkgdGhlIG5ldGxpbmsgc29ja2V0CiAgKgl0aGF0IGNvbmZpZ3VyZWQgdGhlIGluZG9vciBzZXR0aW5nLCBhbmQgdGhlIGluZG9vciBvcGVyYXRpb24gd291bGQgYmUKICAqCWNsZWFyZWQgd2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZC4KKyAqCUlmIHNldCBkdXJpbmcgTkFOIGludGVyZmFjZSBjcmVhdGlvbiwgdGhlIGludGVyZmFjZSB3aWxsIGJlIGRlc3Ryb3llZAorICoJaWYgdGhlIHNvY2tldCBpcyBjbG9zZWQganVzdCBsaWtlIGFueSBvdGhlciBpbnRlcmZhY2UuIE1vcmVvdmVyLCBvbmx5CisgKgl0aGUgbmV0bGluayBzb2NrZXQgdGhhdCBjcmVhdGVkIHRoZSBpbnRlcmZhY2Ugd2lsbCBiZSBhbGxvd2VkIHRvIGFkZAorICoJYW5kIHJlbW92ZSBmdW5jdGlvbnMuIE5BTiBub3RpZmljYXRpb25zIHdpbGwgYmUgc2VudCBpbiB1bmljYXN0IHRvIHRoYXQKKyAqCXNvY2tldC4gV2l0aG91dCB0aGlzIGF0dHJpYnV0ZSwgYW55IHNvY2tldCBjYW4gYWRkIGZ1bmN0aW9ucyBhbmQgdGhlCisgKglub3RpZmljYXRpb25zIHdpbGwgYmUgc2VudCB0byB0aGUgJU5MODAyMTFfTUNHUlBfTkFOIG11bHRpY2FzdCBncm91cC4KICAqCiAgKiBATkw4MDIxMV9BVFRSX1RETFNfSU5JVElBVE9SOiBmbGFnIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IGVuZCBpcwogICoJdGhlIFRETFMgbGluayBpbml0aWF0b3IuCkBAIC0xODY3LDYgKzE5MjIsMjEgQEAKICAqIEBOTDgwMjExX0FUVFJfTUVTSF9QRUVSX0FJRDogQXNzb2NpYXRpb24gSUQgZm9yIHRoZSBtZXNoIHBlZXIgKHUxNikuIFRoaXMgaXMKICAqCXVzZWQgdG8gcHVsbCB0aGUgc3RvcmVkIGRhdGEgZm9yIG1lc2ggcGVlciBpbiBwb3dlciBzYXZlIHN0YXRlLgogICoKKyAqIEBOTDgwMjExX0FUVFJfTkFOX01BU1RFUl9QUkVGOiB0aGUgbWFzdGVyIHByZWZlcmVuY2UgdG8gYmUgdXNlZCBieQorICoJJU5MODAyMTFfQ01EX1NUQVJUX05BTiBhbmQgb3B0aW9uYWxseSB3aXRoCisgKgklTkw4MDIxMV9DTURfQ0hBTkdFX05BTl9DT05GSUcuIEl0cyB0eXBlIGlzIHU4IGFuZCBpdCBjYW4ndCBiZSAwLgorICoJQWxzbywgdmFsdWVzIDEgYW5kIDI1NSBhcmUgcmVzZXJ2ZWQgZm9yIGNlcnRpZmljYXRpb24gcHVycG9zZXMgYW5kCisgKglzaG91bGQgbm90IGJlIHVzZWQgZHVyaW5nIGEgbm9ybWFsIGRldmljZSBvcGVyYXRpb24uCisgKiBATkw4MDIxMV9BVFRSX05BTl9EVUFMOiBOQU4gZHVhbCBiYW5kIG9wZXJhdGlvbiBjb25maWcgKHNlZQorICoJJmVudW0gbmw4MDIxMV9uYW5fZHVhbF9iYW5kX2NvbmYpLiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHdpdGgKKyAqCSVOTDgwMjExX0NNRF9TVEFSVF9OQU4gYW5kIG9wdGlvbmFsbHkgd2l0aAorICoJJU5MODAyMTFfQ01EX0NIQU5HRV9OQU5fQ09ORklHLgorICogQE5MODAyMTFfQVRUUl9OQU5fRlVOQzogYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhZGRlZCB0byBOQU4uIFNlZQorICoJJmVudW0gbmw4MDIxMV9uYW5fZnVuY19hdHRyaWJ1dGVzIGZvciBkZXNjcmlwdGlvbiBvZiB0aGlzIG5lc3RlZAorICoJYXR0cmlidXRlLgorICogQE5MODAyMTFfQVRUUl9OQU5fTUFUQ0g6IHVzZWQgdG8gcmVwb3J0IGEgbWF0Y2guIFRoaXMgaXMgYSBuZXN0ZWQgYXR0cmlidXRlLgorICoJU2VlICZlbnVtIG5sODAyMTFfbmFuX21hdGNoX2F0dHJpYnV0ZXMuCisgKgogICogQE5VTV9OTDgwMjExX0FUVFI6IHRvdGFsIG51bWJlciBvZiBubDgwMjExX2F0dHJzIGF2YWlsYWJsZQogICogQE5MODAyMTFfQVRUUl9NQVg6IGhpZ2hlc3QgYXR0cmlidXRlIG51bWJlciBjdXJyZW50bHkgZGVmaW5lZAogICogQF9fTkw4MDIxMV9BVFRSX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQpAQCAtMjI2MSw2ICsyMzMxLDExIEBACiAKIAlOTDgwMjExX0FUVFJfTUVTSF9QRUVSX0FJRCwKIAorCU5MODAyMTFfQVRUUl9OQU5fTUFTVEVSX1BSRUYsCisJTkw4MDIxMV9BVFRSX05BTl9EVUFMLAorCU5MODAyMTFfQVRUUl9OQU5fRlVOQywKKwlOTDgwMjExX0FUVFJfTkFOX01BVENILAorCiAJLyogYWRkIGF0dHJpYnV0ZXMgaGVyZSwgdXBkYXRlIHRoZSBwb2xpY3kgaW4gbmw4MDIxMS5jICovCiAKIAlfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNULApAQCAtMjMzOSw2ICsyNDE0LDcgQEAKICAqCWNvbW1hbmRzIHRvIGNyZWF0ZSBhbmQgZGVzdHJveSBvbmUKICAqIEBOTDgwMjExX0lGX1RZUEVfT0NCOiBPdXRzaWRlIENvbnRleHQgb2YgYSBCU1MKICAqCVRoaXMgbW9kZSBjb3JyZXNwb25kcyB0byB0aGUgTUlCIHZhcmlhYmxlIGRvdDExT0NCQWN0aXZhdGVkPXRydWUKKyAqIEBOTDgwMjExX0lGVFlQRV9OQU46IE5BTiBkZXZpY2UgaW50ZXJmYWNlIHR5cGUgKG5vdCBhIG5ldGRldikKICAqIEBOTDgwMjExX0lGVFlQRV9NQVg6IGhpZ2hlc3QgaW50ZXJmYWNlIHR5cGUgbnVtYmVyIGN1cnJlbnRseSBkZWZpbmVkCiAgKiBATlVNX05MODAyMTFfSUZUWVBFUzogbnVtYmVyIG9mIGRlZmluZWQgaW50ZXJmYWNlIHR5cGVzCiAgKgpAQCAtMjM1OSw2ICsyNDM1LDcgQEAKIAlOTDgwMjExX0lGVFlQRV9QMlBfR08sCiAJTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSwKIAlOTDgwMjExX0lGVFlQRV9PQ0IsCisJTkw4MDIxMV9JRlRZUEVfTkFOLAogCiAJLyoga2VlcCBsYXN0ICovCiAJTlVNX05MODAyMTFfSUZUWVBFUywKQEAgLTQ1NTEsNiArNDYyOCwxMiBAQAogICoJKGlmIGF2YWlsYWJsZSkuCiAgKiBATkw4MDIxMV9FWFRfRkVBVFVSRV9TRVRfU0NBTl9EV0VMTDogVGhpcyBkcml2ZXIgc3VwcG9ydHMgY29uZmlndXJhdGlvbiBvZgogICoJY2hhbm5lbCBkd2VsbCB0aW1lLgorICogQE5MODAyMTFfRVhUX0ZFQVRVUkVfQkVBQ09OX1JBVEVfTEVHQUNZOiBEcml2ZXIgc3VwcG9ydHMgYmVhY29uIHJhdGUKKyAqCWNvbmZpZ3VyYXRpb24gKEFQL21lc2gpLCBzdXBwb3J0aW5nIGEgbGVnYWN5IChub24gSFQvVkhUKSByYXRlLgorICogQE5MODAyMTFfRVhUX0ZFQVRVUkVfQkVBQ09OX1JBVEVfSFQ6IERyaXZlciBzdXBwb3J0cyBiZWFjb24gcmF0ZQorICoJY29uZmlndXJhdGlvbiAoQVAvbWVzaCkgd2l0aCBIVCByYXRlcy4KKyAqIEBOTDgwMjExX0VYVF9GRUFUVVJFX0JFQUNPTl9SQVRFX1ZIVDogRHJpdmVyIHN1cHBvcnRzIGJlYWNvbiByYXRlCisgKgljb25maWd1cmF0aW9uIChBUC9tZXNoKSB3aXRoIFZIVCByYXRlcy4KICAqCiAgKiBATlVNX05MODAyMTFfRVhUX0ZFQVRVUkVTOiBudW1iZXIgb2YgZXh0ZW5kZWQgZmVhdHVyZXMuCiAgKiBATUFYX05MODAyMTFfRVhUX0ZFQVRVUkVTOiBoaWdoZXN0IGV4dGVuZGVkIGZlYXR1cmUgaW5kZXguCkBAIC00NTYyLDYgKzQ2NDUsOSBAQAogCU5MODAyMTFfRVhUX0ZFQVRVUkVfU0NBTl9TVEFSVF9USU1FLAogCU5MODAyMTFfRVhUX0ZFQVRVUkVfQlNTX1BBUkVOVF9UU0YsCiAJTkw4MDIxMV9FWFRfRkVBVFVSRV9TRVRfU0NBTl9EV0VMTCwKKwlOTDgwMjExX0VYVF9GRUFUVVJFX0JFQUNPTl9SQVRFX0xFR0FDWSwKKwlOTDgwMjExX0VYVF9GRUFUVVJFX0JFQUNPTl9SQVRFX0hULAorCU5MODAyMTFfRVhUX0ZFQVRVUkVfQkVBQ09OX1JBVEVfVkhULAogCiAJLyogYWRkIG5ldyBmZWF0dXJlcyBiZWZvcmUgdGhlIGRlZmluaXRpb24gYmVsb3cgKi8KIAlOVU1fTkw4MDIxMV9FWFRfRkVBVFVSRVMsCkBAIC00ODU1LDQgKzQ5NDEsMTg2IEBACiAJTkw4MDIxMV9CU1NfU0VMRUNUX0FUVFJfTUFYID0gX19OTDgwMjExX0JTU19TRUxFQ1RfQVRUUl9BRlRFUl9MQVNUIC0gMQogfTsKIAorLyoqCisgKiBlbnVtIG5sODAyMTFfbmFuX2R1YWxfYmFuZF9jb25mIC0gTkFOIGR1YWwgYmFuZCBjb25maWd1cmF0aW9uCisgKgorICogRGVmaW5lcyB0aGUgTkFOIGR1YWwgYmFuZCBtb2RlIG9mIG9wZXJhdGlvbgorICoKKyAqIEBOTDgwMjExX05BTl9CQU5EX0RFRkFVTFQ6IGRldmljZSBkZWZhdWx0IG1vZGUKKyAqIEBOTDgwMjExX05BTl9CQU5EXzJHSFo6IDIuNEdIeiBtb2RlCisgKiBATkw4MDIxMV9OQU5fQkFORF81R0haOiA1R0h6IG1vZGUKKyAgKi8KK2VudW0gbmw4MDIxMV9uYW5fZHVhbF9iYW5kX2NvbmYgeworCU5MODAyMTFfTkFOX0JBTkRfREVGQVVMVAk9IDEgPDwgMCwKKwlOTDgwMjExX05BTl9CQU5EXzJHSFoJCT0gMSA8PCAxLAorCU5MODAyMTFfTkFOX0JBTkRfNUdIWgkJPSAxIDw8IDIsCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9uYW5fZnVuY3Rpb25fdHlwZSAtIE5BTiBmdW5jdGlvbiB0eXBlCisgKgorICogRGVmaW5lcyB0aGUgZnVuY3Rpb24gdHlwZSBvZiBhIE5BTiBmdW5jdGlvbgorICoKKyAqIEBOTDgwMjExX05BTl9GVU5DX1BVQkxJU0g6IGZ1bmN0aW9uIGlzIHB1Ymxpc2gKKyAqIEBOTDgwMjExX05BTl9GVU5DX1NVQlNDUklCRTogZnVuY3Rpb24gaXMgc3Vic2NyaWJlCisgKiBATkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVA6IGZ1bmN0aW9uIGlzIGZvbGxvdy11cAorICovCitlbnVtIG5sODAyMTFfbmFuX2Z1bmN0aW9uX3R5cGUgeworCU5MODAyMTFfTkFOX0ZVTkNfUFVCTElTSCwKKwlOTDgwMjExX05BTl9GVU5DX1NVQlNDUklCRSwKKwlOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUCwKKworCS8qIGtlZXAgbGFzdCAqLworCV9fTkw4MDIxMV9OQU5fRlVOQ19UWVBFX0FGVEVSX0xBU1QsCisJTkw4MDIxMV9OQU5fRlVOQ19NQVhfVFlQRSA9IF9fTkw4MDIxMV9OQU5fRlVOQ19UWVBFX0FGVEVSX0xBU1QgLSAxLAorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfbmFuX3B1Ymxpc2hfdHlwZSAtIE5BTiBwdWJsaXNoIHR4IHR5cGUKKyAqCisgKiBEZWZpbmVzIGhvdyB0byBzZW5kIHB1Ymxpc2ggU2VydmljZSBEaXNjb3ZlcnkgRnJhbWVzCisgKgorICogQE5MODAyMTFfTkFOX1NPTElDSVRFRF9QVUJMSVNIOiBwdWJsaXNoIGZ1bmN0aW9uIGlzIHNvbGljaXRlZAorICogQE5MODAyMTFfTkFOX1VOU09MSUNJVEVEX1BVQkxJU0g6IHB1Ymxpc2ggZnVuY3Rpb24gaXMgdW5zb2xpY2l0ZWQKKyAqLworZW51bSBubDgwMjExX25hbl9wdWJsaXNoX3R5cGUgeworCU5MODAyMTFfTkFOX1NPTElDSVRFRF9QVUJMSVNIID0gMSA8PCAwLAorCU5MODAyMTFfTkFOX1VOU09MSUNJVEVEX1BVQkxJU0ggPSAxIDw8IDEsCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9uYW5fZnVuY190ZXJtX3JlYXNvbiAtIE5BTiBmdW5jdGlvbnMgdGVybWluYXRpb24gcmVhc29uCisgKgorICogRGVmaW5lcyB0ZXJtaW5hdGlvbiByZWFzb25zIG9mIGEgTkFOIGZ1bmN0aW9uCisgKgorICogQE5MODAyMTFfTkFOX0ZVTkNfVEVSTV9SRUFTT05fVVNFUl9SRVFVRVNUOiByZXF1ZXN0ZWQgYnkgdXNlcgorICogQE5MODAyMTFfTkFOX0ZVTkNfVEVSTV9SRUFTT05fVFRMX0VYUElSRUQ6IHRpbWVvdXQKKyAqIEBOTDgwMjExX05BTl9GVU5DX1RFUk1fUkVBU09OX0VSUk9SOiBlcnJvcmVkCisgKi8KK2VudW0gbmw4MDIxMV9uYW5fZnVuY190ZXJtX3JlYXNvbiB7CisJTkw4MDIxMV9OQU5fRlVOQ19URVJNX1JFQVNPTl9VU0VSX1JFUVVFU1QsCisJTkw4MDIxMV9OQU5fRlVOQ19URVJNX1JFQVNPTl9UVExfRVhQSVJFRCwKKwlOTDgwMjExX05BTl9GVU5DX1RFUk1fUkVBU09OX0VSUk9SLAorfTsKKworI2RlZmluZSBOTDgwMjExX05BTl9GVU5DX1NFUlZJQ0VfSURfTEVOIDYKKyNkZWZpbmUgTkw4MDIxMV9OQU5fRlVOQ19TRVJWSUNFX1NQRUNfSU5GT19NQVhfTEVOIDB4ZmYKKyNkZWZpbmUgTkw4MDIxMV9OQU5fRlVOQ19TUkZfTUFYX0xFTiAweGZmCisKKy8qKgorICogZW51bSBubDgwMjExX25hbl9mdW5jX2F0dHJpYnV0ZXMgLSBOQU4gZnVuY3Rpb24gYXR0cmlidXRlcworICogQF9fTkw4MDIxMV9OQU5fRlVOQ19JTlZBTElEOiBpbnZhbGlkCisgKiBATkw4MDIxMV9OQU5fRlVOQ19UWVBFOiAmZW51bSBubDgwMjExX25hbl9mdW5jdGlvbl90eXBlICh1OCkuCisgKiBATkw4MDIxMV9OQU5fRlVOQ19TRVJWSUNFX0lEOiA2IGJ5dGVzIG9mIHRoZSBzZXJ2aWNlIElEIGhhc2ggYXMKKyAqCXNwZWNpZmllZCBpbiBOQU4gc3BlYy4gVGhpcyBpcyBhIGJpbmFyeSBhdHRyaWJ1dGUuCisgKiBATkw4MDIxMV9OQU5fRlVOQ19QVUJMSVNIX1RZUEU6IHJlbGV2YW50IGlmIHRoZSBmdW5jdGlvbidzIHR5cGUgaXMKKyAqCXB1Ymxpc2guIERlZmluZXMgdGhlIHRyYW5zbWlzc2lvbiB0eXBlIGZvciB0aGUgcHVibGlzaCBTZXJ2aWNlIERpc2NvdmVyeQorICoJRnJhbWUsIHNlZSAmZW51bSBubDgwMjExX25hbl9wdWJsaXNoX3R5cGUuIEl0cyB0eXBlIGlzIHU4LgorICogQE5MODAyMTFfTkFOX0ZVTkNfUFVCTElTSF9CQ0FTVDogcmVsZXZhbnQgaWYgdGhlIGZ1bmN0aW9uIGlzIGEgc29saWNpdGVkCisgKglwdWJsaXNoLiBTaG91bGQgdGhlIHNvbGljaXRlZCBwdWJsaXNoIFNlcnZpY2UgRGlzY292ZXJ5IEZyYW1lIGJlIHNlbnQgdG8KKyAqCXRoZSBOQU4gQnJvYWRjYXN0IGFkZHJlc3MuIFRoaXMgaXMgYSBmbGFnLgorICogQE5MODAyMTFfTkFOX0ZVTkNfU1VCU0NSSUJFX0FDVElWRTogcmVsZXZhbnQgaWYgdGhlIGZ1bmN0aW9uJ3MgdHlwZSBpcworICoJc3Vic2NyaWJlLiBJcyB0aGUgc3Vic2NyaWJlIGFjdGl2ZS4gVGhpcyBpcyBhIGZsYWcuCisgKiBATkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVBfSUQ6IHJlbGV2YW50IGlmIHRoZSBmdW5jdGlvbidzIHR5cGUgaXMgZm9sbG93IHVwLgorICoJVGhlIGluc3RhbmNlIElEIGZvciB0aGUgZm9sbG93IHVwIFNlcnZpY2UgRGlzY292ZXJ5IEZyYW1lLiBUaGlzIGlzIHU4LgorICogQE5MODAyMTFfTkFOX0ZVTkNfRk9MTE9XX1VQX1JFUV9JRDogcmVsZXZhbnQgaWYgdGhlIGZ1bmN0aW9uJ3MgdHlwZQorICoJaXMgZm9sbG93IHVwLiBUaGlzIGlzIGEgdTguCisgKglUaGUgcmVxdWVzdG9yIGluc3RhbmNlIElEIGZvciB0aGUgZm9sbG93IHVwIFNlcnZpY2UgRGlzY292ZXJ5IEZyYW1lLgorICogQE5MODAyMTFfTkFOX0ZVTkNfRk9MTE9XX1VQX0RFU1Q6IHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgcmVjaXBpZW50IG9mIHRoZQorICoJZm9sbG93IHVwIFNlcnZpY2UgRGlzY292ZXJ5IEZyYW1lLiBUaGlzIGlzIGEgYmluYXJ5IGF0dHJpYnV0ZS4KKyAqIEBOTDgwMjExX05BTl9GVU5DX0NMT1NFX1JBTkdFOiBpcyB0aGlzIGZ1bmN0aW9uIGxpbWl0ZWQgZm9yIGRldmljZXMgaW4gYQorICoJY2xvc2UgcmFuZ2UuIFRoZSByYW5nZSBpdHNlbGYgKFJTU0kpIGlzIGRlZmluZWQgYnkgdGhlIGRldmljZS4KKyAqCVRoaXMgaXMgYSBmbGFnLgorICogQE5MODAyMTFfTkFOX0ZVTkNfVFRMOiBzdHJpY3RseSBwb3NpdGl2ZSBudW1iZXIgb2YgRFdzIHRoaXMgZnVuY3Rpb24gc2hvdWxkCisgKglzdGF5IGFjdGl2ZS4gSWYgbm90IHByZXNlbnQgaW5maW5pdGUgVFRMIGlzIGFzc3VtZWQuIFRoaXMgaXMgYSB1MzIuCisgKiBATkw4MDIxMV9OQU5fRlVOQ19TRVJWSUNFX0lORk86IGFycmF5IG9mIGJ5dGVzIGRlc2NyaWJpbmcgdGhlIHNlcnZpY2UKKyAqCXNwZWNpZmljIGluZm8uIFRoaXMgaXMgYSBiaW5hcnkgYXR0cmlidXRlLgorICogQE5MODAyMTFfTkFOX0ZVTkNfU1JGOiBTZXJ2aWNlIFJlY2VpdmUgRmlsdGVyLiBUaGlzIGlzIGEgbmVzdGVkIGF0dHJpYnV0ZS4KKyAqCVNlZSAmZW51bSBubDgwMjExX25hbl9zcmZfYXR0cmlidXRlcy4KKyAqIEBOTDgwMjExX05BTl9GVU5DX1JYX01BVENIX0ZJTFRFUjogUmVjZWl2ZSBNYXRjaGluZyBmaWx0ZXIuIFRoaXMgaXMgYSBuZXN0ZWQKKyAqCWF0dHJpYnV0ZS4gSXQgaXMgYSBsaXN0IG9mIGJpbmFyeSB2YWx1ZXMuCisgKiBATkw4MDIxMV9OQU5fRlVOQ19UWF9NQVRDSF9GSUxURVI6IFRyYW5zbWl0IE1hdGNoaW5nIGZpbHRlci4gVGhpcyBpcyBhCisgKgluZXN0ZWQgYXR0cmlidXRlLiBJdCBpcyBhIGxpc3Qgb2YgYmluYXJ5IHZhbHVlcy4KKyAqIEBOTDgwMjExX05BTl9GVU5DX0lOU1RBTkNFX0lEOiBUaGUgaW5zdGFuY2UgSUQgb2YgdGhlIGZ1bmN0aW9uLgorICoJSXRzIHR5cGUgaXMgdTggYW5kIGl0IGNhbm5vdCBiZSAwLgorICogQE5MODAyMTFfTkFOX0ZVTkNfVEVSTV9SRUFTT046IE5BTiBmdW5jdGlvbiB0ZXJtaW5hdGlvbiByZWFzb24uCisgKglTZWUgJmVudW0gbmw4MDIxMV9uYW5fZnVuY190ZXJtX3JlYXNvbi4KKyAqCisgKiBATlVNX05MODAyMTFfTkFOX0ZVTkNfQVRUUjogaW50ZXJuYWwKKyAqIEBOTDgwMjExX05BTl9GVU5DX0FUVFJfTUFYOiBoaWdoZXN0IE5BTiBmdW5jdGlvbiBhdHRyaWJ1dGUKKyAqLworZW51bSBubDgwMjExX25hbl9mdW5jX2F0dHJpYnV0ZXMgeworCV9fTkw4MDIxMV9OQU5fRlVOQ19JTlZBTElELAorCU5MODAyMTFfTkFOX0ZVTkNfVFlQRSwKKwlOTDgwMjExX05BTl9GVU5DX1NFUlZJQ0VfSUQsCisJTkw4MDIxMV9OQU5fRlVOQ19QVUJMSVNIX1RZUEUsCisJTkw4MDIxMV9OQU5fRlVOQ19QVUJMSVNIX0JDQVNULAorCU5MODAyMTFfTkFOX0ZVTkNfU1VCU0NSSUJFX0FDVElWRSwKKwlOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUF9JRCwKKwlOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUF9SRVFfSUQsCisJTkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVBfREVTVCwKKwlOTDgwMjExX05BTl9GVU5DX0NMT1NFX1JBTkdFLAorCU5MODAyMTFfTkFOX0ZVTkNfVFRMLAorCU5MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JTkZPLAorCU5MODAyMTFfTkFOX0ZVTkNfU1JGLAorCU5MODAyMTFfTkFOX0ZVTkNfUlhfTUFUQ0hfRklMVEVSLAorCU5MODAyMTFfTkFOX0ZVTkNfVFhfTUFUQ0hfRklMVEVSLAorCU5MODAyMTFfTkFOX0ZVTkNfSU5TVEFOQ0VfSUQsCisJTkw4MDIxMV9OQU5fRlVOQ19URVJNX1JFQVNPTiwKKworCS8qIGtlZXAgbGFzdCAqLworCU5VTV9OTDgwMjExX05BTl9GVU5DX0FUVFIsCisJTkw4MDIxMV9OQU5fRlVOQ19BVFRSX01BWCA9IE5VTV9OTDgwMjExX05BTl9GVU5DX0FUVFIgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9uYW5fc3JmX2F0dHJpYnV0ZXMgLSBOQU4gU2VydmljZSBSZXNwb25zZSBmaWx0ZXIgYXR0cmlidXRlcworICogQF9fTkw4MDIxMV9OQU5fU1JGX0lOVkFMSUQ6IGludmFsaWQKKyAqIEBOTDgwMjExX05BTl9TUkZfSU5DTFVERTogcHJlc2VudCBpZiB0aGUgaW5jbHVkZSBiaXQgb2YgdGhlIFNSRiBzZXQuCisgKglUaGlzIGlzIGEgZmxhZy4KKyAqIEBOTDgwMjExX05BTl9TUkZfQkY6IEJsb29tIEZpbHRlci4gUHJlc2VudCBpZiBhbmQgb25seSBpZgorICoJJk5MODAyMTFfTkFOX1NSRl9NQUNfQUREUlMgaXNuJ3QgcHJlc2VudC4gVGhpcyBhdHRyaWJ1dGUgaXMgYmluYXJ5LgorICogQE5MODAyMTFfTkFOX1NSRl9CRl9JRFg6IGluZGV4IG9mIHRoZSBCbG9vbSBGaWx0ZXIuIE1hbmRhdG9yeSBpZgorICoJJk5MODAyMTFfTkFOX1NSRl9CRiBpcyBwcmVzZW50LiBUaGlzIGlzIGEgdTguCisgKiBATkw4MDIxMV9OQU5fU1JGX01BQ19BRERSUzogbGlzdCBvZiBNQUMgYWRkcmVzc2VzIGZvciB0aGUgU1JGLiBQcmVzZW50IGlmCisgKglhbmQgb25seSBpZiAmTkw4MDIxMV9OQU5fU1JGX0JGIGlzbid0IHByZXNlbnQuIFRoaXMgaXMgYSBuZXN0ZWQKKyAqCWF0dHJpYnV0ZS4gRWFjaCBuZXN0ZWQgYXR0cmlidXRlIGlzIGEgTUFDIGFkZHJlc3MuCisgKiBATlVNX05MODAyMTFfTkFOX1NSRl9BVFRSOiBpbnRlcm5hbAorICogQE5MODAyMTFfTkFOX1NSRl9BVFRSX01BWDogaGlnaGVzdCBOQU4gU1JGIGF0dHJpYnV0ZQorICovCitlbnVtIG5sODAyMTFfbmFuX3NyZl9hdHRyaWJ1dGVzIHsKKwlfX05MODAyMTFfTkFOX1NSRl9JTlZBTElELAorCU5MODAyMTFfTkFOX1NSRl9JTkNMVURFLAorCU5MODAyMTFfTkFOX1NSRl9CRiwKKwlOTDgwMjExX05BTl9TUkZfQkZfSURYLAorCU5MODAyMTFfTkFOX1NSRl9NQUNfQUREUlMsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlOVU1fTkw4MDIxMV9OQU5fU1JGX0FUVFIsCisJTkw4MDIxMV9OQU5fU1JGX0FUVFJfTUFYID0gTlVNX05MODAyMTFfTkFOX1NSRl9BVFRSIC0gMSwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX25hbl9tYXRjaF9hdHRyaWJ1dGVzIC0gTkFOIG1hdGNoIGF0dHJpYnV0ZXMKKyAqIEBfX05MODAyMTFfTkFOX01BVENIX0lOVkFMSUQ6IGludmFsaWQKKyAqIEBOTDgwMjExX05BTl9NQVRDSF9GVU5DX0xPQ0FMOiB0aGUgbG9jYWwgZnVuY3Rpb24gdGhhdCBoYWQgdGhlCisgKgltYXRjaC4gVGhpcyBpcyBhIG5lc3RlZCBhdHRyaWJ1dGUuCisgKglTZWUgJmVudW0gbmw4MDIxMV9uYW5fZnVuY19hdHRyaWJ1dGVzLgorICogQE5MODAyMTFfTkFOX01BVENIX0ZVTkNfUEVFUjogdGhlIHBlZXIgZnVuY3Rpb24KKyAqCXRoYXQgY2F1c2VkIHRoZSBtYXRjaC4gVGhpcyBpcyBhIG5lc3RlZCBhdHRyaWJ1dGUuCisgKglTZWUgJmVudW0gbmw4MDIxMV9uYW5fZnVuY19hdHRyaWJ1dGVzLgorICoKKyAqIEBOVU1fTkw4MDIxMV9OQU5fTUFUQ0hfQVRUUjogaW50ZXJuYWwKKyAqIEBOTDgwMjExX05BTl9NQVRDSF9BVFRSX01BWDogaGlnaGVzdCBOQU4gbWF0Y2ggYXR0cmlidXRlCisgKi8KK2VudW0gbmw4MDIxMV9uYW5fbWF0Y2hfYXR0cmlidXRlcyB7CisJX19OTDgwMjExX05BTl9NQVRDSF9JTlZBTElELAorCU5MODAyMTFfTkFOX01BVENIX0ZVTkNfTE9DQUwsCisJTkw4MDIxMV9OQU5fTUFUQ0hfRlVOQ19QRUVSLAorCisJLyoga2VlcCBsYXN0ICovCisJTlVNX05MODAyMTFfTkFOX01BVENIX0FUVFIsCisJTkw4MDIxMV9OQU5fTUFUQ0hfQVRUUl9NQVggPSBOVU1fTkw4MDIxMV9OQU5fTUFUQ0hfQVRUUiAtIDEKK307CisKICNlbmRpZiAvKiBfX0xJTlVYX05MODAyMTFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L29wZW52c3dpdGNoLmggYi9pbmNsdWRlL3VhcGkvbGludXgvb3BlbnZzd2l0Y2guaAppbmRleCBkOTVhMzAxLi41OWVkMzk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvb3BlbnZzd2l0Y2guaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvb3BlbnZzd2l0Y2guaApAQCAtNTgzLDcgKzU4Myw3IEBACiAjZGVmaW5lIE9WU19VU0VSU1BBQ0VfQVRUUl9NQVggKF9fT1ZTX1VTRVJTUEFDRV9BVFRSX01BWCAtIDEpCiAKIHN0cnVjdCBvdnNfYWN0aW9uX3RydW5jIHsKLQl1aW50MzJfdCBtYXhfbGVuOyAvKiBNYXggcGFja2V0IHNpemUgaW4gYnl0ZXMuICovCisJX191MzIgbWF4X2xlbjsgLyogTWF4IHBhY2tldCBzaXplIGluIGJ5dGVzLiAqLwogfTsKIAogLyoqCkBAIC02MDUsMTMgKzYwNSwxMyBAQAogICogQHZsYW5fdGNpOiBUYWcgY29udHJvbCBpZGVudGlmaWVyIChUQ0kpIHRvIHB1c2guICBUaGUgQ0ZJIGJpdCBtdXN0IGJlIHNldAogICogKGJ1dCBpdCB3aWxsIG5vdCBiZSBzZXQgaW4gdGhlIDgwMi4xUSBoZWFkZXIgdGhhdCBpcyBwdXNoZWQpLgogICoKLSAqIFRoZSBAdmxhbl90cGlkIHZhbHVlIGlzIHR5cGljYWxseSAlRVRIX1BfODAyMVEuICBUaGUgb25seSBhY2NlcHRhYmxlIFRQSUQKLSAqIHZhbHVlcyBhcmUgdGhvc2UgdGhhdCB0aGUga2VybmVsIG1vZHVsZSBhbHNvIHBhcnNlcyBhcyA4MDIuMVEgaGVhZGVycywgdG8KLSAqIHByZXZlbnQgJU9WU19BQ1RJT05fQVRUUl9QVVNIX1ZMQU4gZm9sbG93ZWQgYnkgJU9WU19BQ1RJT05fQVRUUl9QT1BfVkxBTgotICogZnJvbSBoYXZpbmcgc3VycHJpc2luZyByZXN1bHRzLgorICogVGhlIEB2bGFuX3RwaWQgdmFsdWUgaXMgdHlwaWNhbGx5ICVFVEhfUF84MDIxUSBvciAlRVRIX1BfODAyMUFELgorICogVGhlIG9ubHkgYWNjZXB0YWJsZSBUUElEIHZhbHVlcyBhcmUgdGhvc2UgdGhhdCB0aGUga2VybmVsIG1vZHVsZSBhbHNvIHBhcnNlcworICogYXMgODAyLjFRIG9yIDgwMi4xQUQgaGVhZGVycywgdG8gcHJldmVudCAlT1ZTX0FDVElPTl9BVFRSX1BVU0hfVkxBTiBmb2xsb3dlZAorICogYnkgJU9WU19BQ1RJT05fQVRUUl9QT1BfVkxBTiBmcm9tIGhhdmluZyBzdXJwcmlzaW5nIHJlc3VsdHMuCiAgKi8KIHN0cnVjdCBvdnNfYWN0aW9uX3B1c2hfdmxhbiB7Ci0JX19iZTE2IHZsYW5fdHBpZDsJLyogODAyLjFRIFRQSUQuICovCisJX19iZTE2IHZsYW5fdHBpZDsJLyogODAyLjFRIG9yIDgwMi4xYWQgVFBJRC4gKi8KIAlfX2JlMTYgdmxhbl90Y2k7CS8qIDgwMi4xUSBUQ0kgKFZMQU4gSUQgYW5kIHByaW9yaXR5KS4gKi8KIH07CiAKQEAgLTYzMiw4ICs2MzIsOCBAQAogICogQGhhc2hfYmFzaXM6IGJhc2lzIHVzZWQgZm9yIGNvbXB1dGluZyBoYXNoLgogICovCiBzdHJ1Y3Qgb3ZzX2FjdGlvbl9oYXNoIHsKLQl1aW50MzJfdCAgaGFzaF9hbGc7ICAgICAvKiBPbmUgb2Ygb3ZzX2hhc2hfYWxnLiAqLwotCXVpbnQzMl90ICBoYXNoX2Jhc2lzOworCV9fdTMyICBoYXNoX2FsZzsgICAgIC8qIE9uZSBvZiBvdnNfaGFzaF9hbGcuICovCisJX191MzIgIGhhc2hfYmFzaXM7CiB9OwogCiAvKioKQEAgLTcyMSw5ICs3MjEsMTAgQEAKICAqIGlzIGNvcGllZCBmcm9tIHRoZSB2YWx1ZSB0byB0aGUgcGFja2V0IGhlYWRlciBmaWVsZCwgcmVzdCBvZiB0aGUgYml0cyBhcmUKICAqIGxlZnQgdW5jaGFuZ2VkLiAgVGhlIG5vbi1tYXNrZWQgdmFsdWUgYml0cyBtdXN0IGJlIHBhc3NlZCBpbiBhcyB6ZXJvZXMuCiAgKiBNYXNraW5nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoZSAlT1ZTX0tFWV9BVFRSX1RVTk5FTCBhdHRyaWJ1dGUuCi0gKiBAT1ZTX0FDVElPTl9BVFRSX1BVU0hfVkxBTjogUHVzaCBhIG5ldyBvdXRlcm1vc3QgODAyLjFRIGhlYWRlciBvbnRvIHRoZQotICogcGFja2V0LgotICogQE9WU19BQ1RJT05fQVRUUl9QT1BfVkxBTjogUG9wIHRoZSBvdXRlcm1vc3QgODAyLjFRIGhlYWRlciBvZmYgdGhlIHBhY2tldC4KKyAqIEBPVlNfQUNUSU9OX0FUVFJfUFVTSF9WTEFOOiBQdXNoIGEgbmV3IG91dGVybW9zdCA4MDIuMVEgb3IgODAyLjFhZCBoZWFkZXIKKyAqIG9udG8gdGhlIHBhY2tldC4KKyAqIEBPVlNfQUNUSU9OX0FUVFJfUE9QX1ZMQU46IFBvcCB0aGUgb3V0ZXJtb3N0IDgwMi4xUSBvciA4MDIuMWFkIGhlYWRlcgorICogZnJvbSB0aGUgcGFja2V0LgogICogQE9WU19BQ1RJT05fQVRUUl9TQU1QTEU6IFByb2JhYmlsaXRpY2FsbHkgZXhlY3V0ZXMgYWN0aW9ucywgYXMgc3BlY2lmaWVkIGluCiAgKiB0aGUgbmVzdGVkICVPVlNfU0FNUExFX0FUVFJfKiBhdHRyaWJ1dGVzLgogICogQE9WU19BQ1RJT05fQVRUUl9QVVNIX01QTFM6IFB1c2ggYSBuZXcgTVBMUyBsYWJlbCBzdGFjayBlbnRyeSBvbnRvIHRoZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3BrdF9jbHMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9wa3RfY2xzLmgKaW5kZXggZDFjMWNjYS4uOGZkNzE1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3BrdF9jbHMuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvcGt0X2Nscy5oCkBAIC0zOTYsNiArMzk2LDcgQEAKIAlUQ0FfQlBGX0ZELAogCVRDQV9CUEZfTkFNRSwKIAlUQ0FfQlBGX0ZMQUdTLAorCVRDQV9CUEZfRkxBR1NfR0VOLAogCV9fVENBX0JQRl9NQVgsCiB9OwogCkBAIC00MjgsNiArNDI5LDI0IEBACiAJVENBX0ZMT1dFUl9LRVlfVURQX0RTVCwJCS8qIGJlMTYgKi8KIAogCVRDQV9GTE9XRVJfRkxBR1MsCisJVENBX0ZMT1dFUl9LRVlfVkxBTl9JRCwJCS8qIGJlMTYgKi8KKwlUQ0FfRkxPV0VSX0tFWV9WTEFOX1BSSU8sCS8qIHU4ICAgKi8KKwlUQ0FfRkxPV0VSX0tFWV9WTEFOX0VUSF9UWVBFLAkvKiBiZTE2ICovCisKKwlUQ0FfRkxPV0VSX0tFWV9FTkNfS0VZX0lELAkvKiBiZTMyICovCisJVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfU1JDLAkvKiBiZTMyICovCisJVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfU1JDX01BU0ssLyogYmUzMiAqLworCVRDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X0RTVCwJLyogYmUzMiAqLworCVRDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X0RTVF9NQVNLLC8qIGJlMzIgKi8KKwlUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9TUkMsCS8qIHN0cnVjdCBpbjZfYWRkciAqLworCVRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X1NSQ19NQVNLLC8qIHN0cnVjdCBpbjZfYWRkciAqLworCVRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X0RTVCwJLyogc3RydWN0IGluNl9hZGRyICovCisJVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjZfRFNUX01BU0ssLyogc3RydWN0IGluNl9hZGRyICovCisKKwlUQ0FfRkxPV0VSX0tFWV9UQ1BfU1JDX01BU0ssCS8qIGJlMTYgKi8KKwlUQ0FfRkxPV0VSX0tFWV9UQ1BfRFNUX01BU0ssCS8qIGJlMTYgKi8KKwlUQ0FfRkxPV0VSX0tFWV9VRFBfU1JDX01BU0ssCS8qIGJlMTYgKi8KKwlUQ0FfRkxPV0VSX0tFWV9VRFBfRFNUX01BU0ssCS8qIGJlMTYgKi8KIAlfX1RDQV9GTE9XRVJfTUFYLAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3BrdF9zY2hlZC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3BrdF9zY2hlZC5oCmluZGV4IDIzODJlZWQuLmRmNzQ1MWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9wa3Rfc2NoZWQuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvcGt0X3NjaGVkLmgKQEAgLTc5Miw2ICs3OTIsOCBAQAogCiAJVENBX0ZRX09SUEhBTl9NQVNLLAkvKiBtYXNrIGFwcGxpZWQgdG8gb3JwaGFuZWQgc2tiIGhhc2hlcyAqLwogCisJVENBX0ZRX0xPV19SQVRFX1RIUkVTSE9MRCwgLyogcGVyIHBhY2tldCBkZWxheSB1bmRlciB0aGlzIHJhdGUgKi8KKwogCV9fVENBX0ZRX01BWAogfTsKIApAQCAtODA5LDcgKzgxMSw3IEBACiAJX191MzIJZmxvd3M7CiAJX191MzIJaW5hY3RpdmVfZmxvd3M7CiAJX191MzIJdGhyb3R0bGVkX2Zsb3dzOwotCV9fdTMyCXBhZDsKKwlfX3UzMgl1bnRocm90dGxlX2xhdGVuY3lfbnM7CiB9OwogCiAvKiBIZWF2eS1IaXR0ZXIgRmlsdGVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvc2N0cC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3NjdHAuaAppbmRleCBkMzA0ZjRjLi5hNDA2YWRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvc2N0cC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9zY3RwLmgKQEAgLTk0NCw0ICs5NDQsNjggQEAKIAlfX3UxNiBwcl9wb2xpY3k7CiB9OwogCitzdHJ1Y3Qgc2N0cF9pbmZvIHsKKwlfX3UzMglzY3RwaV90YWc7CisJX191MzIJc2N0cGlfc3RhdGU7CisJX191MzIJc2N0cGlfcnduZDsKKwlfX3UxNglzY3RwaV91bmFja2RhdGE7CisJX191MTYJc2N0cGlfcGVuZGRhdGE7CisJX191MTYJc2N0cGlfaW5zdHJtczsKKwlfX3UxNglzY3RwaV9vdXRzdHJtczsKKwlfX3UzMglzY3RwaV9mcmFnbWVudGF0aW9uX3BvaW50OworCV9fdTMyCXNjdHBpX2lucXVldWU7CisJX191MzIJc2N0cGlfb3V0cXVldWU7CisJX191MzIJc2N0cGlfb3ZlcmFsbF9lcnJvcjsKKwlfX3UzMglzY3RwaV9tYXhfYnVyc3Q7CisJX191MzIJc2N0cGlfbWF4c2VnOworCV9fdTMyCXNjdHBpX3BlZXJfcnduZDsKKwlfX3UzMglzY3RwaV9wZWVyX3RhZzsKKwlfX3U4CXNjdHBpX3BlZXJfY2FwYWJsZTsKKwlfX3U4CXNjdHBpX3BlZXJfc2FjazsKKwlfX3UxNglfX3Jlc2VydmVkMTsKKworCS8qIGFzc29jIHN0YXR1cyBpbmZvICovCisJX191NjQJc2N0cGlfaXNhY2tzOworCV9fdTY0CXNjdHBpX29zYWNrczsKKwlfX3U2NAlzY3RwaV9vcGFja2V0czsKKwlfX3U2NAlzY3RwaV9pcGFja2V0czsKKwlfX3U2NAlzY3RwaV9ydHhjaHVua3M7CisJX191NjQJc2N0cGlfb3V0b2ZzZXF0c25zOworCV9fdTY0CXNjdHBpX2lkdXBjaHVua3M7CisJX191NjQJc2N0cGlfZ2FwY250OworCV9fdTY0CXNjdHBpX291b2RjaHVua3M7CisJX191NjQJc2N0cGlfaXVvZGNodW5rczsKKwlfX3U2NAlzY3RwaV9vb2RjaHVua3M7CisJX191NjQJc2N0cGlfaW9kY2h1bmtzOworCV9fdTY0CXNjdHBpX29jdHJsY2h1bmtzOworCV9fdTY0CXNjdHBpX2ljdHJsY2h1bmtzOworCisJLyogcHJpbWFyeSB0cmFuc3BvcnQgaW5mbyAqLworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlCXNjdHBpX3BfYWRkcmVzczsKKwlfX3MzMglzY3RwaV9wX3N0YXRlOworCV9fdTMyCXNjdHBpX3BfY3duZDsKKwlfX3UzMglzY3RwaV9wX3NydHQ7CisJX191MzIJc2N0cGlfcF9ydG87CisJX191MzIJc2N0cGlfcF9oYmludGVydmFsOworCV9fdTMyCXNjdHBpX3BfcGF0aG1heHJ4dDsKKwlfX3UzMglzY3RwaV9wX3NhY2tkZWxheTsKKwlfX3UzMglzY3RwaV9wX3NhY2tmcmVxOworCV9fdTMyCXNjdHBpX3Bfc3N0aHJlc2g7CisJX191MzIJc2N0cGlfcF9wYXJ0aWFsX2J5dGVzX2Fja2VkOworCV9fdTMyCXNjdHBpX3BfZmxpZ2h0X3NpemU7CisJX191MTYJc2N0cGlfcF9lcnJvcjsKKwlfX3UxNglfX3Jlc2VydmVkMjsKKworCS8qIHNjdHAgc29jayBpbmZvICovCisJX191MzIJc2N0cGlfc19hdXRvY2xvc2U7CisJX191MzIJc2N0cGlfc19hZGFwdGF0aW9uX2luZDsKKwlfX3UzMglzY3RwaV9zX3BkX3BvaW50OworCV9fdTgJc2N0cGlfc19ub2RlbGF5OworCV9fdTgJc2N0cGlfc19kaXNhYmxlX2ZyYWdtZW50czsKKwlfX3U4CXNjdHBpX3NfdjRtYXBwZWQ7CisJX191OAlzY3RwaV9zX2ZyYWdfaW50ZXJsZWF2ZTsKKwlfX3UzMglzY3RwaV9zX3R5cGU7CisJX191MzIJX19yZXNlcnZlZDM7Cit9OworCiAjZW5kaWYgLyogX1VBUElfU0NUUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvc2VyaWFsX3JlZy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3NlcmlhbF9yZWcuaAppbmRleCAxZTVhYzRlNy4uYjRjMDQ4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3NlcmlhbF9yZWcuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvc2VyaWFsX3JlZy5oCkBAIC0zNzYsNSArMzc2LDEzIEBACiAjZGVmaW5lIFVBUlRfRVhBUl9UWFRSRwkJMHgwYQkvKiBUeCBGSUZPIHRyaWdnZXIgbGV2ZWwgd3JpdGUtb25seSAqLwogI2RlZmluZSBVQVJUX0VYQVJfUlhUUkcJCTB4MGIJLyogUnggRklGTyB0cmlnZ2VyIGxldmVsIHdyaXRlLW9ubHkgKi8KIAorLyoKKyAqIFRoZXNlIGFyZSBkZWZpbml0aW9ucyBmb3IgdGhlIEFsdGVyYSBBTFRSXzE2NTUwX0YzMi9GNjQvRjEyOAorICogTm9ybWFsaXplZCBmcm9tIDB4MTAwIHRvIDB4NDAgYmVjYXVzZSBvZiBzaGlmdCBieSAyICgzMiBiaXQgcmVncykuCisgKi8KKyNkZWZpbmUgVUFSVF9BTFRSX0FGUgkJMHg0MAkvKiBBZGRpdGlvbmFsIEZlYXR1cmVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfQUxUUl9FTl9UWEZJRk9fTFcJMHgwMQkvKiBFbmFibGUgdGhlIFRYIEZJRk8gTG93IFdhdGVybWFyayAqLworI2RlZmluZSBVQVJUX0FMVFJfVFhfTE9XCTB4NDEJLyogVHggRklGTyBMb3cgV2F0ZXJtYXJrICovCisKICNlbmRpZiAvKiBfTElOVVhfU0VSSUFMX1JFR19IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9zbm1wLmggYi9pbmNsdWRlL3VhcGkvbGludXgvc25tcC5oCmluZGV4IDI1YTlhZDguLmU3YTMxZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9zbm1wLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3NubXAuaApAQCAtMjM1LDYgKzIzNSw3IEBACiAJTElOVVhfTUlCX1RDUFNQVVJJT1VTUlRPUywJCS8qIFRDUFNwdXJpb3VzUlRPcyAqLwogCUxJTlVYX01JQl9UQ1BNRDVOT1RGT1VORCwJCS8qIFRDUE1ENU5vdEZvdW5kICovCiAJTElOVVhfTUlCX1RDUE1ENVVORVhQRUNURUQsCQkvKiBUQ1BNRDVVbmV4cGVjdGVkICovCisJTElOVVhfTUlCX1RDUE1ENUZBSUxVUkUsCQkvKiBUQ1BNRDVGYWlsdXJlICovCiAJTElOVVhfTUlCX1NBQ0tTSElGVEVELAogCUxJTlVYX01JQl9TQUNLTUVSR0VELAogCUxJTlVYX01JQl9TQUNLU0hJRlRGQUxMQkFDSywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfaWZlLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdGNfYWN0L3RjX2lmZS5oCmluZGV4IDRlY2UwMmEuLmNkMTgzNjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfaWZlLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3RjX2FjdC90Y19pZmUuaApAQCAtMzIsOCArMzIsOSBAQAogI2RlZmluZSBJRkVfTUVUQV9IQVNISUQgMgogI2RlZmluZQlJRkVfTUVUQV9QUklPIDMKICNkZWZpbmUJSUZFX01FVEFfUU1BUCA0CisjZGVmaW5lCUlGRV9NRVRBX1RDSU5ERVggNQogLypDYW4gYmUgb3ZlcnJpZGRlbiBhdCBydW50aW1lIGJ5IG1vZHVsZSBvcHRpb24qLwotI2RlZmluZQlfX0lGRV9NRVRBX01BWCA1CisjZGVmaW5lCV9fSUZFX01FVEFfTUFYIDYKICNkZWZpbmUgSUZFX01FVEFfTUFYIChfX0lGRV9NRVRBX01BWCAtIDEpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3RjX2FjdC90Y19za2Jtb2QuaCBiL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfc2tibW9kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmYzA3ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfc2tibW9kLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgSmFtYWwgSGFkaSBTYWxpbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqLworCisjaWZuZGVmIF9fTElOVVhfVENfU0tCTU9EX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19TS0JNT0RfSAorCisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCisjZGVmaW5lIFRDQV9BQ1RfU0tCTU9EIDE1CisKKyNkZWZpbmUgU0tCTU9EX0ZfRE1BQwkweDEKKyNkZWZpbmUgU0tCTU9EX0ZfU01BQwkweDIKKyNkZWZpbmUgU0tCTU9EX0ZfRVRZUEUJMHg0CisjZGVmaW5lIFNLQk1PRF9GX1NXQVBNQUMgMHg4CisKK3N0cnVjdCB0Y19za2Jtb2QgeworCXRjX2dlbjsKKwlfX3U2NCBmbGFnczsKK307CisKK2VudW0geworCVRDQV9TS0JNT0RfVU5TUEVDLAorCVRDQV9TS0JNT0RfVE0sCisJVENBX1NLQk1PRF9QQVJNUywKKwlUQ0FfU0tCTU9EX0RNQUMsCisJVENBX1NLQk1PRF9TTUFDLAorCVRDQV9TS0JNT0RfRVRZUEUsCisJVENBX1NLQk1PRF9QQUQsCisJX19UQ0FfU0tCTU9EX01BWAorfTsKKyNkZWZpbmUgVENBX1NLQk1PRF9NQVggKF9fVENBX1NLQk1PRF9NQVggLSAxKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfdHVubmVsX2tleS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3RjX2FjdC90Y190dW5uZWxfa2V5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwMTA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfdHVubmVsX2tleS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEFtaXIgVmFkYWkgPGFtaXJAdmFkYWkubWU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9UQ19UVU5ORUxfS0VZX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19UVU5ORUxfS0VZX0gKKworI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworI2RlZmluZSBUQ0FfQUNUX1RVTk5FTF9LRVkgMTcKKworI2RlZmluZSBUQ0FfVFVOTkVMX0tFWV9BQ1RfU0VUCSAgICAxCisjZGVmaW5lIFRDQV9UVU5ORUxfS0VZX0FDVF9SRUxFQVNFICAyCisKK3N0cnVjdCB0Y190dW5uZWxfa2V5IHsKKwl0Y19nZW47CisJaW50IHRfYWN0aW9uOworfTsKKworZW51bSB7CisJVENBX1RVTk5FTF9LRVlfVU5TUEVDLAorCVRDQV9UVU5ORUxfS0VZX1RNLAorCVRDQV9UVU5ORUxfS0VZX1BBUk1TLAorCVRDQV9UVU5ORUxfS0VZX0VOQ19JUFY0X1NSQywJLyogYmUzMiAqLworCVRDQV9UVU5ORUxfS0VZX0VOQ19JUFY0X0RTVCwJLyogYmUzMiAqLworCVRDQV9UVU5ORUxfS0VZX0VOQ19JUFY2X1NSQywJLyogc3RydWN0IGluNl9hZGRyICovCisJVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfRFNULAkvKiBzdHJ1Y3QgaW42X2FkZHIgKi8KKwlUQ0FfVFVOTkVMX0tFWV9FTkNfS0VZX0lELAkvKiBiZTY0ICovCisJVENBX1RVTk5FTF9LRVlfUEFELAorCV9fVENBX1RVTk5FTF9LRVlfTUFYLAorfTsKKworI2RlZmluZSBUQ0FfVFVOTkVMX0tFWV9NQVggKF9fVENBX1RVTk5FTF9LRVlfTUFYIC0gMSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvdGNfYWN0L3RjX3ZsYW4uaCBiL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfdmxhbi5oCmluZGV4IDMxMTUxZmYuLmJkZGIyNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfdmxhbi5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfdmxhbi5oCkBAIC0xNiw2ICsxNiw3IEBACiAKICNkZWZpbmUgVENBX1ZMQU5fQUNUX1BPUAkxCiAjZGVmaW5lIFRDQV9WTEFOX0FDVF9QVVNICTIKKyNkZWZpbmUgVENBX1ZMQU5fQUNUX01PRElGWQkzCiAKIHN0cnVjdCB0Y192bGFuIHsKIAl0Y19nZW47CkBAIC0yOSw2ICszMCw3IEBACiAJVENBX1ZMQU5fUFVTSF9WTEFOX0lELAogCVRDQV9WTEFOX1BVU0hfVkxBTl9QUk9UT0NPTCwKIAlUQ0FfVkxBTl9QQUQsCisJVENBX1ZMQU5fUFVTSF9WTEFOX1BSSU9SSVRZLAogCV9fVENBX1ZMQU5fTUFYLAogfTsKICNkZWZpbmUgVENBX1ZMQU5fTUFYIChfX1RDQV9WTEFOX01BWCAtIDEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvdGNwLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdGNwLmgKaW5kZXggNDgyODk4Zi4uNzNhYzBkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3RjcC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC90Y3AuaApAQCAtMTY3LDYgKzE2Nyw3IEBACiAJX191OAl0Y3BpX2JhY2tvZmY7CiAJX191OAl0Y3BpX29wdGlvbnM7CiAJX191OAl0Y3BpX3NuZF93c2NhbGUgOiA0LCB0Y3BpX3Jjdl93c2NhbGUgOiA0OworCV9fdTgJdGNwaV9kZWxpdmVyeV9yYXRlX2FwcF9saW1pdGVkOjE7CiAKIAlfX3UzMgl0Y3BpX3J0bzsKIAlfX3UzMgl0Y3BpX2F0bzsKQEAgLTIxMSw2ICsyMTIsOCBAQAogCV9fdTMyCXRjcGlfbWluX3J0dDsKIAlfX3UzMgl0Y3BpX2RhdGFfc2Vnc19pbjsJLyogUkZDNDg5OCB0Y3BFU3RhdHNEYXRhU2Vnc0luICovCiAJX191MzIJdGNwaV9kYXRhX3NlZ3Nfb3V0OwkvKiBSRkM0ODk4IHRjcEVTdGF0c0RhdGFTZWdzT3V0ICovCisKKwlfX3U2NCAgIHRjcGlfZGVsaXZlcnlfcmF0ZTsKIH07CiAKIC8qIGZvciBUQ1BfTUQ1U0lHIHNvY2tldCBvcHRpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC90aXBjX25ldGxpbmsuaCBiL2luY2x1ZGUvdWFwaS9saW51eC90aXBjX25ldGxpbmsuaAppbmRleCA1ZjNmNmQwLi5mOWVkZDIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdGlwY19uZXRsaW5rLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3RpcGNfbmV0bGluay5oCkBAIC01OSw2ICs1OSw5IEBACiAJVElQQ19OTF9NT05fU0VULAogCVRJUENfTkxfTU9OX0dFVCwKIAlUSVBDX05MX01PTl9QRUVSX0dFVCwKKwlUSVBDX05MX1BFRVJfUkVNT1ZFLAorCVRJUENfTkxfQkVBUkVSX0FERCwKKwlUSVBDX05MX1VEUF9HRVRfUkVNT1RFSVAsCiAKIAlfX1RJUENfTkxfQ01EX01BWCwKIAlUSVBDX05MX0NNRF9NQVggPSBfX1RJUENfTkxfQ01EX01BWCAtIDEKQEAgLTk4LDYgKzEwMSw3IEBACiAJVElQQ19OTEFfVURQX1VOU1BFQywKIAlUSVBDX05MQV9VRFBfTE9DQUwsCQkvKiBzb2NrYWRkcl9zdG9yYWdlICovCiAJVElQQ19OTEFfVURQX1JFTU9URSwJCS8qIHNvY2thZGRyX3N0b3JhZ2UgKi8KKwlUSVBDX05MQV9VRFBfTVVMVElfUkVNT1RFSVAsCS8qIGZsYWcgKi8KIAogCV9fVElQQ19OTEFfVURQX01BWCwKIAlUSVBDX05MQV9VRFBfTUFYID0gX19USVBDX05MQV9VRFBfTUFYIC0gMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3VzYi9mdW5jdGlvbmZzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdXNiL2Z1bmN0aW9uZnMuaAppbmRleCAxMDhkZDc5Li5hY2M2MzY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdXNiL2Z1bmN0aW9uZnMuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvdXNiL2Z1bmN0aW9uZnMuaApAQCAtMjEsNiArMjEsOCBAQAogCUZVTkNUSU9ORlNfSEFTX01TX09TX0RFU0MgPSA4LAogCUZVTkNUSU9ORlNfVklSVFVBTF9BRERSID0gMTYsCiAJRlVOQ1RJT05GU19FVkVOVEZEID0gMzIsCisJRlVOQ1RJT05GU19BTExfQ1RSTF9SRUNJUCA9IDY0LAorCUZVTkNUSU9ORlNfQ09ORklHMF9TRVRVUCA9IDEyOCwKIH07CiAKIC8qIERlc2NyaXB0b3Igb2YgYW4gbm9uLWF1ZGlvIGVuZHBvaW50ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgveGZybS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3hmcm0uaAppbmRleCAxNDMzMzg5Li4xZmM2MmIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgveGZybS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC94ZnJtLmgKQEAgLTI5OCw3ICsyOTgsNyBAQAogCVhGUk1BX0FMR19BVVRIX1RSVU5DLAkvKiBzdHJ1Y3QgeGZybV9hbGdvX2F1dGggKi8KIAlYRlJNQV9NQVJLLAkJLyogc3RydWN0IHhmcm1fbWFyayAqLwogCVhGUk1BX1RGQ1BBRCwJCS8qIF9fdTMyICovCi0JWEZSTUFfUkVQTEFZX0VTTl9WQUwsCS8qIHN0cnVjdCB4ZnJtX3JlcGxheV9lc24gKi8KKwlYRlJNQV9SRVBMQVlfRVNOX1ZBTCwJLyogc3RydWN0IHhmcm1fcmVwbGF5X3N0YXRlX2VzbiAqLwogCVhGUk1BX1NBX0VYVFJBX0ZMQUdTLAkvKiBfX3UzMiAqLwogCVhGUk1BX1BST1RPLAkJLyogX191OCAqLwogCVhGUk1BX0FERFJFU1NfRklMVEVSLAkvKiBzdHJ1Y3QgeGZybV9hZGRyZXNzX2ZpbHRlciAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL3NvdW5kL0tidWlsZCBiL2luY2x1ZGUvdWFwaS9zb3VuZC9LYnVpbGQKaW5kZXggNjkxOTg0Yy4uOTU3OGQ4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL3NvdW5kL0tidWlsZAorKysgYi9pbmNsdWRlL3VhcGkvc291bmQvS2J1aWxkCkBAIC0xMywzICsxMyw0IEBACiBoZWFkZXIteSArPSBzZm50X2luZm8uaAogaGVhZGVyLXkgKz0gdGx2LmgKIGhlYWRlci15ICs9IHVzYl9zdHJlYW0uaAoraGVhZGVyLXkgKz0gc25kX3NzdF90b2tlbnMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL3NvdW5kL2Fzb2MuaCBiL2luY2x1ZGUvdWFwaS9zb3VuZC9hc29jLmgKaW5kZXggZTQ3MDFhMy4uMzNkMDBhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL3NvdW5kL2Fzb2MuaAorKysgYi9pbmNsdWRlL3VhcGkvc291bmQvYXNvYy5oCkBAIC04Myw3ICs4Myw3IEBACiAjZGVmaW5lIFNORF9TT0NfVFBMR19OVU1fVEVYVFMJCTE2CiAKIC8qIEFCSSB2ZXJzaW9uICovCi0jZGVmaW5lIFNORF9TT0NfVFBMR19BQklfVkVSU0lPTgkweDQKKyNkZWZpbmUgU05EX1NPQ19UUExHX0FCSV9WRVJTSU9OCTB4NQogCiAvKiBNYXggc2l6ZSBvZiBUTFYgZGF0YSAqLwogI2RlZmluZSBTTkRfU09DX1RQTEdfVExWX1NJWkUJCTMyCkBAIC0xMDUsNyArMTA1LDggQEAKICNkZWZpbmUgU05EX1NPQ19UUExHX1RZUEVfQ09ERUNfTElOSwk5CiAjZGVmaW5lIFNORF9TT0NfVFBMR19UWVBFX0JBQ0tFTkRfTElOSwkxMAogI2RlZmluZSBTTkRfU09DX1RQTEdfVFlQRV9QREFUQQkJMTEKLSNkZWZpbmUgU05EX1NPQ19UUExHX1RZUEVfTUFYCVNORF9TT0NfVFBMR19UWVBFX1BEQVRBCisjZGVmaW5lIFNORF9TT0NfVFBMR19UWVBFX0JFX0RBSQkxMgorI2RlZmluZSBTTkRfU09DX1RQTEdfVFlQRV9NQVgJCVNORF9TT0NfVFBMR19UWVBFX0JFX0RBSQogCiAvKiB2ZW5kb3IgYmxvY2sgSURzIC0gcGxlYXNlIGFkZCBuZXcgdmVuZG9yIHR5cGVzIHRvIGVuZCAqLwogI2RlZmluZSBTTkRfU09DX1RQTEdfVFlQRV9WRU5ET1JfRlcJMTAwMApAQCAtMTI0LDYgKzEyNSwxMSBAQAogI2RlZmluZSBTTkRfU09DX1RQTEdfVFVQTEVfVFlQRV9XT1JECTQKICNkZWZpbmUgU05EX1NPQ19UUExHX1RVUExFX1RZUEVfU0hPUlQJNQogCisvKiBCRSBEQUkgZmxhZ3MgKi8KKyNkZWZpbmUgU05EX1NPQ19UUExHX0RBSV9GTEdCSVRfU1lNTUVUUklDX1JBVEVTICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgU05EX1NPQ19UUExHX0RBSV9GTEdCSVRfU1lNTUVUUklDX0NIQU5ORUxTICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgU05EX1NPQ19UUExHX0RBSV9GTEdCSVRfU1lNTUVUUklDX1NBTVBMRUJJVFMgICAgKDEgPDwgMikKKwogLyoKICAqIEJsb2NrIEhlYWRlci4KICAqIFRoaXMgaGVhZGVyIHByZWNlZGVzIGFsbCBvYmplY3QgYW5kIG9iamVjdCBhcnJheXMgYmVsb3cuCkBAIC0yNTEsNiArMjU3LDcgQEAKIAlfX2xlMzIgcGVyaW9kX3NpemVfbWF4OwkvKiBtYXggcGVyaW9kIHNpemUgYnl0ZXMgKi8KIAlfX2xlMzIgYnVmZmVyX3NpemVfbWluOwkvKiBtaW4gYnVmZmVyIHNpemUgYnl0ZXMgKi8KIAlfX2xlMzIgYnVmZmVyX3NpemVfbWF4OwkvKiBtYXggYnVmZmVyIHNpemUgYnl0ZXMgKi8KKwlfX2xlMzIgc2lnX2JpdHM7ICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBvZiBjb250ZW50ICovCiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKgpAQCAtMjg1LDYgKzI5Miw4IEBACiAJX19sZTMyIGdyYXBoX2VsZW1zOwkvKiBudW1iZXIgb2YgZ3JhcGggZWxlbWVudHMgKi8KIAlfX2xlMzIgcGNtX2VsZW1zOwkvKiBudW1iZXIgb2YgUENNIGVsZW1lbnRzICovCiAJX19sZTMyIGRhaV9saW5rX2VsZW1zOwkvKiBudW1iZXIgb2YgREFJIGxpbmsgZWxlbWVudHMgKi8KKwlfX2xlMzIgYmVfZGFpX2VsZW1zOwkvKiBudW1iZXIgb2YgQkUgREFJIGVsZW1lbnRzICovCisJX19sZTMyIHJlc2VydmVkWzIwXTsJLyogcmVzZXJ2ZWQgZm9yIG5ldyBBQkkgZWxlbWVudCB0eXBlcyAqLwogCXN0cnVjdCBzbmRfc29jX3RwbGdfcHJpdmF0ZSBwcml2OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIApAQCAtNDUwLDQgKzQ1OSwyNiBAQAogCXN0cnVjdCBzbmRfc29jX3RwbGdfc3RyZWFtIHN0cmVhbVtTTkRfU09DX1RQTEdfU1RSRUFNX0NPTkZJR19NQVhdOyAvKiBzdXBwb3J0ZWQgY29uZmlncyBwbGF5YmFjayBhbmQgY2FwdHJ1cmUgKi8KIAlfX2xlMzIgbnVtX3N0cmVhbXM7ICAgICAvKiBudW1iZXIgb2Ygc3RyZWFtcyAqLwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoKKyAqIERlc2NyaWJlcyBTVy9GVyBzcGVjaWZpYyBmZWF0dXJlcyBvZiBCRSBEQUkuCisgKgorICogRmlsZSBibG9jayByZXByZXNlbnRhdGlvbiBmb3IgQkUgREFJIDotCisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0rCisgKiB8IHN0cnVjdCBzbmRfc29jX3RwbGdfaGRyICAgICAgICAgICB8ICAxICB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0rCisgKiB8IHN0cnVjdCBzbmRfc29jX3RwbGdfYmVfZGFpICAgICAgICB8ICBOICB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0rCisgKi8KK3N0cnVjdCBzbmRfc29jX3RwbGdfYmVfZGFpIHsKKwlfX2xlMzIgc2l6ZTsgICAgICAgICAgICAvKiBpbiBieXRlcyBvZiB0aGlzIHN0cnVjdHVyZSAqLworCWNoYXIgZGFpX25hbWVbU05EUlZfQ1RMX0VMRU1fSURfTkFNRV9NQVhMRU5dOyAvKiBuYW1lIC0gdXNlZCB0byBtYXRjaCAqLworCV9fbGUzMiBkYWlfaWQ7ICAgICAgICAgIC8qIHVuaXF1ZSBJRCAtIHVzZWQgdG8gbWF0Y2ggKi8KKwlfX2xlMzIgcGxheWJhY2s7ICAgICAgICAvKiBzdXBwb3J0cyBwbGF5YmFjayBtb2RlICovCisJX19sZTMyIGNhcHR1cmU7ICAgICAgICAgLyogc3VwcG9ydHMgY2FwdHVyZSBtb2RlICovCisJc3RydWN0IHNuZF9zb2NfdHBsZ19zdHJlYW1fY2FwcyBjYXBzWzJdOyAvKiBwbGF5YmFjayBhbmQgY2FwdHVyZSBmb3IgREFJICovCisJX19sZTMyIGZsYWdfbWFzazsgICAgICAgLyogYml0bWFzayBvZiBmbGFncyB0byBjb25maWd1cmUgKi8KKwlfX2xlMzIgZmxhZ3M7ICAgICAgICAgICAvKiBTTkRfU09DX1RQTEdfREFJX0ZMR0JJVF8qICovCisJc3RydWN0IHNuZF9zb2NfdHBsZ19wcml2YXRlIHByaXY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvc291bmQvYXNvdW5kLmggYi9pbmNsdWRlL3VhcGkvc291bmQvYXNvdW5kLmgKaW5kZXggNjA5Y2FkYi4uYmUzNTNhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL3NvdW5kL2Fzb3VuZC5oCisrKyBiL2luY2x1ZGUvdWFwaS9zb3VuZC9hc291bmQuaApAQCAtMTA2LDkgKzEwNiwxMCBAQAogCVNORFJWX0hXREVQX0lGQUNFX0ZXX09YRlcsCS8qIE94Zm9yZCBPWEZXOTcwLzk3MSBiYXNlZCBkZXZpY2UgKi8KIAlTTkRSVl9IV0RFUF9JRkFDRV9GV19ESUdJMDBYLAkvKiBEaWdpZGVzaWduIERpZ2kgMDAyLzAwMyBmYW1pbHkgKi8KIAlTTkRSVl9IV0RFUF9JRkFDRV9GV19UQVNDQU0sCS8qIFRBU0NBTSBGaXJlV2lyZSBzZXJpZXMgKi8KKwlTTkRSVl9IV0RFUF9JRkFDRV9MSU5FNiwJLyogTGluZTYgVVNCIHByb2Nlc3NvcnMgKi8KIAogCS8qIERvbid0IGZvcmdldCB0byBjaGFuZ2UgdGhlIGZvbGxvd2luZzogKi8KLQlTTkRSVl9IV0RFUF9JRkFDRV9MQVNUID0gU05EUlZfSFdERVBfSUZBQ0VfRldfVEFTQ0FNCisJU05EUlZfSFdERVBfSUZBQ0VfTEFTVCA9IFNORFJWX0hXREVQX0lGQUNFX0xJTkU2CiB9OwogCiBzdHJ1Y3Qgc25kX2h3ZGVwX2luZm8gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL3NvdW5kL3NuZF9zc3RfdG9rZW5zLmggYi9pbmNsdWRlL3VhcGkvc291bmQvc25kX3NzdF90b2tlbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWUyZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL3NvdW5kL3NuZF9zc3RfdG9rZW5zLmgKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBzbmRfc3N0X3Rva2Vucy5oIC0gSW50ZWwgU1NUIHRva2VucyBkZWZpbml0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEludGVsIENvcnAKKyAqIEF1dGhvcjogU2hyZXlhcyBOQyA8c2hyZXlhcy5uY0BpbnRlbC5jb20+CisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19TTkRfU1NUX1RPS0VOU19IX18KKyNkZWZpbmUgX19TTkRfU1NUX1RPS0VOU19IX18KKworLyoqCisgKiAlU0tMX1RLTl9VVUlEOiAgICAgICAgICAgICAgIE1vZHVsZSBVVUlECisgKgorICogJVNLTF9US05fVThfQkxPQ0tfVFlQRTogICAgICBUeXBlIG9mIHRoZSBwcml2YXRlIGRhdGEgYmxvY2suQ2FuIGJlOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZXMsIGJ5dGVzLCBzaG9ydCBhbmQgd29yZHMKKyAqCisgKiAlU0tMX1RLTl9VOF9JTl9QSU5fVFlQRTogICAgIElucHV0IHBpbiB0eXBlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob21vZ2Vub3VzPTAsIGhldGVyb2dlbm91cz0xCisgKgorICogJVNLTF9US05fVThfT1VUX1BJTl9UWVBFOiAgICBPdXRwdXQgcGluIHR5cGUsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbW9nZW5vdXM9MCwgaGV0ZXJvZ2Vub3VzPTEKKyAqICVTS0xfVEtOX1U4X0RZTl9JTl9QSU46ICAgICAgQ29uZmlndXJlIElucHV0IHBpbiBkeW5hbWljYWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0cnVlCisgKgorICogJVNLTF9US05fVThfRFlOX09VVF9QSU46ICAgICBDb25maWd1cmUgT3V0cHV0IHBpbiBkeW5hbWljYWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0cnVlCisgKgorICogJVNLTF9US05fVThfSU5fUVVFVUVfQ09VTlQ6ICBTdG9yZSB0aGUgbnVtYmVyIG9mIElucHV0IHBpbnMKKyAqCisgKiAlU0tMX1RLTl9VOF9PVVRfUVVFVUVfQ09VTlQ6IFN0b3JlIHRoZSBudW1iZXIgb2YgT3V0cHV0IHBpbnMKKyAqCisgKiAlU0tMX1RLTl9VOF9USU1FX1NMT1Q6ICAgICAgIFRETSBzbG90IG51bWJlcgorICoKKyAqICVTS0xfVEtOX1U4X0NPUkVfSUQ6ICAgICAgICAgU3RvcmVzIG1vZHVsZSBhZmZpbml0eSB2YWx1ZS5DYW4gdGFrZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0xfQUZGSU5JVFlfQ09SRV8wID0gMCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX0FGRklOSVRZX0NPUkVfMSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX0FGRklOSVRZX0NPUkVfTUFYCisgKgorICogJVNLTF9US05fVThfTU9EX1RZUEU6ICAgICAgICBNb2R1bGUgdHlwZSB2YWx1ZS4KKyAqCisgKiAlU0tMX1RLTl9VOF9DT05OX1RZUEU6ICAgICAgIE1vZHVsZSBjb25uZWN0aW9uIHR5cGUgY2FuIGJlIGEgRkUsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFIG9yIE5PTkUgYXMgZGVmaW5lZCA6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9QSVBFX0NPTk5fVFlQRV9OT05FID0gMCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX1BJUEVfQ09OTl9UWVBFX0ZFID0gMSAoSE9TVF9ETUEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9QSVBFX0NPTk5fVFlQRV9CRSA9IDIgKExJTktfRE1BKQorICoKKyAqICVTS0xfVEtOX1U4X0RFVl9UWVBFOiAgICAgICAgVHlwZSBvZiBkZXZpY2UgdG8gd2hpY2ggdGhlIG1vZHVsZSBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIHRha2UgdGhlIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX0RFVklDRV9CVCA9IDB4MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX0RFVklDRV9ETUlDID0gMHgxLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0xfREVWSUNFX0kyUyA9IDB4MiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX0RFVklDRV9TTElNQlVTID0gMHgzLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0xfREVWSUNFX0hEQUxJTksgPSAweDQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9ERVZJQ0VfSERBSE9TVCA9IDB4NSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX0RFVklDRV9OT05FCisgKgorICogJVNLTF9US05fVThfSFdfQ09OTl9UWVBFOiAgICBDb25uZWN0aW9uIHR5cGUgb2YgdGhlIEhXIHRvIHdoaWNoIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgaXMgY29ubmVjdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9DT05OX05PTkUgPSAwLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0xfQ09OTl9TT1VSQ0UgPSAxLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0xfQ09OTl9TSU5LID0gMgorICoKKyAqICVTS0xfVEtOX1UxNl9QSU5fSU5TVF9JRDogICAgU3RvcmVzIHRoZSBwaW4gaW5zdGFuY2UgaWQKKyAqCisgKiAlU0tMX1RLTl9VMTZfTU9EX0lOU1RfSUQ6ICAgIFN0b3JlcyB0aGUgbWR1bGUgaW5zdGFuY2UgaWQKKyAqCisgKiAlU0tMX1RLTl9VMzJfTUFYX01DUFM6ICAgICAgIE1vZHVsZSBtYXggbWNwcyB2YWx1ZQorICoKKyAqICVTS0xfVEtOX1UzMl9NRU1fUEFHRVM6ICAgICAgTW9kdWxlIHJlc291cmNlIHBhZ2VzCisgKgorICogJVNLTF9US05fVTMyX09CUzogICAgICAgICAgICBTdG9yZXMgT3V0cHV0IEJ1ZmZlciBzaXplCisgKgorICogJVNLTF9US05fVTMyX0lCUzogICAgICAgICAgICBTdG9yZXMgaW5wdXQgYnVmZmVyIHNpemUKKyAqCisgKiAlU0tMX1RLTl9VMzJfVkJVU19JRDogICAgICAgIE1vZHVsZSBWQlVTX0lELiBQRE09MCwgU1NQMD0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1AxPTEsU1NQMj0yLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1AzPTMsIFNTUDQ9NCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NQNT01LCBTU1A2PTYsSU5WQUxJRAorICoKKyAqICVTS0xfVEtOX1UzMl9QQVJBTVNfRklYVVA6ICAgTW9kdWxlIFBhcmFtcyBmaXh1cCBtYXNrCisgKiAlU0tMX1RLTl9VMzJfQ09OVkVSVEVSOiAgICAgIE1vZHVsZSBwYXJhbXMgY29udmVydGVyIG1hc2sKKyAqICVTS0xfVEtOX1UzMl9QSVBFX0lEOiAgICAgICAgU3RvcmVzIHRoZSBwaXBlIGlkCisgKgorICogJVNLTF9US05fVTMyX1BJUEVfQ09OTl9UWVBFOiBUeXBlIG9mIHRoZSB0b2tlbiB0byB3aGljaCB0aGUgcGlwZSBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8uIEl0IGNhbiBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0xfUElQRV9DT05OX1RZUEVfTk9ORSA9IDAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9QSVBFX0NPTk5fVFlQRV9GRSA9IDEgKEhPU1RfRE1BKSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX1BJUEVfQ09OTl9UWVBFX0JFID0gMiAoTElOS19ETUEpLAorICoKKyAqICVTS0xfVEtOX1UzMl9QSVBFX1BSSU9SSVRZOiAgUGlwZSBwcmlvcml0eSB2YWx1ZQorICogJVNLTF9US05fVTMyX1BJUEVfTUVNX1BHUzogICBQaXBlIHJlc291cmNlIHBhZ2VzCisgKgorICogJVNLTF9US05fVTMyX0RJUl9QSU5fQ09VTlQ6ICBWYWx1ZSBmb3IgdGhlIGRpcmVjdGlvbiB0byBzZXQgaW5wdXQvb3V0cHV0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMgYW5kIHRoZSBwaW4gY291bnQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmaXJzdCA0IGJpdHMgaGF2ZSB0aGUgZGlyZWN0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGFuZCB0aGUgbmV4dCA0IGhhdmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBpbiBjb3VudCB2YWx1ZS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX0RJUl9JTiA9IDAsIFNLTF9ESVJfT1VUID0gMS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlucHV0IGFuZCBvdXRwdXQgZm9ybWF0cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSB0aGUgc2FtZSBzZXQgb2YgdG9rZW5zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gaW5wdXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG91dHB1dCBtYWRlIGJ5IHJlYWRpbmcgZGlyZWN0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLgorICoKKyAqICVTS0xfVEtOX1UzMl9GTVRfQ0g6ICAgICAgICAgU3VwcG9ydGVkIGNoYW5uZWwgY291bnQKKyAqCisgKiAlU0tMX1RLTl9VMzJfRk1UX0ZSRVE6ICAgICAgIFN1cHBvcnRlZCBmcmVxdWVuY3kvc2FtcGxlIHJhdGUKKyAqCisgKiAlU0tMX1RLTl9VMzJfRk1UX0JJVF9ERVBUSDogIFN1cHBvcnRlZCBjb250YWluZXIgc2l6ZQorICoKKyAqICVTS0xfVEtOX1UzMl9GTVRfU0FNUExFX1NJWkU6TnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGNvbnRhaW5lcgorICoKKyAqICVTS0xfVEtOX1UzMl9GTVRfQ0hfQ09ORklHOiAgU3VwcG9ydGVkIGNoYW5uZWwgY29uZmlndXJhdGlvbnMgZm9yIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC9vdXRwdXQuCisgKgorICogJVNLTF9US05fVTMyX0ZNVF9JTlRFUkxFQVZFOiBJbnRlcmxlYXZpbmcgc3R5bGUgd2hpY2ggY2FuIGJlIHBlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIG9yIHBlciBzYW1wbGUuIFRoZSB2YWx1ZXMgY2FuIGJlIDoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX0lOVEVSTEVBVklOR19QRVJfQ0hBTk5FTCA9IDAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9JTlRFUkxFQVZJTkdfUEVSX1NBTVBMRSA9IDEsCisgKgorICogJVNLTF9US05fVTMyX0ZNVF9TQU1QTEVfVFlQRToKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBzYW1wbGUgdHlwZS4gQ2FuIHRha2UgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogU0tMX1NBTVBMRV9UWVBFX0lOVF9NU0IgPSAwLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0xfU0FNUExFX1RZUEVfSU5UX0xTQiA9IDEsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9TQU1QTEVfVFlQRV9JTlRfU0lHTkVEID0gMiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX1NBTVBMRV9UWVBFX0lOVF9VTlNJR05FRCA9IDMsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9TQU1QTEVfVFlQRV9GTE9BVCA9IDQKKyAqCisgKiAlU0tMX1RLTl9VMzJfQ0hfTUFQOiAgICAgICAgIENoYW5uZWwgbWFwIHZhbHVlcworICogJVNLTF9US05fVTMyX01PRF9TRVRfUEFSQU1TOiBJdCBjYW4gdGFrZSB0aGVzZSB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9QQVJBTV9ERUZBVUxULCBTS0xfUEFSQU1fSU5JVCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX1BBUkFNX1NFVCwgU0tMX1BBUkFNX0JJTkQKKyAqCisgKiAlU0tMX1RLTl9VMzJfTU9EX1BBUkFNX0lEOiAgIElEIG9mIHRoZSBtb2R1bGUgcGFyYW1zCisgKgorICogJVNLTF9US05fVTMyX0NBUFNfU0VUX1BBUkFNUzoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHBhcmFtcyB2YWx1ZQorICoKKyAqICVTS0xfVEtOX1UzMl9DQVBTX1BBUkFNU19JRDogUGFyYW1zIElECisgKgorICogJVNLTF9US05fVTMyX0NBUFNfU0laRTogICAgICBDYXBzIHNpemUKKyAqCisgKiAlU0tMX1RLTl9VMzJfUFJPQ19ET01BSU46ICAgIFNwZWNpZnkgcHJvY2Vzc2luZyBkb21haW4KKyAqCisgKiAlU0tMX1RLTl9VMzJfTElCX0NPVU5UOiAgICAgIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGxpYnJhcmllcworICoKKyAqICVTS0xfVEtOX1NUUl9MSUJfTkFNRTogICAgICAgU3BlY2lmaWVzIHRoZSBsaWJyYXJ5IG5hbWUKKyAqCisgKiBtb2R1bGVfaWQgYW5kIGxvYWRhYmxlIGZsYWdzIGRvbnQgaGF2ZSB0b2tlbnMgYXMgdGhlc2UgdmFsdWVzIHdpbGwgYmUKKyAqIHJlYWQgZnJvbSB0aGUgRFNQIEZXIG1hbmlmZXN0CisgKi8KK2VudW0gU0tMX1RLTlMgeworCVNLTF9US05fVVVJRCA9IDEsCisJU0tMX1RLTl9VOF9OVU1fQkxPQ0tTLAorCVNLTF9US05fVThfQkxPQ0tfVFlQRSwKKwlTS0xfVEtOX1U4X0lOX1BJTl9UWVBFLAorCVNLTF9US05fVThfT1VUX1BJTl9UWVBFLAorCVNLTF9US05fVThfRFlOX0lOX1BJTiwKKwlTS0xfVEtOX1U4X0RZTl9PVVRfUElOLAorCVNLTF9US05fVThfSU5fUVVFVUVfQ09VTlQsCisJU0tMX1RLTl9VOF9PVVRfUVVFVUVfQ09VTlQsCisJU0tMX1RLTl9VOF9USU1FX1NMT1QsCisJU0tMX1RLTl9VOF9DT1JFX0lELAorCVNLTF9US05fVThfTU9EX1RZUEUsCisJU0tMX1RLTl9VOF9DT05OX1RZUEUsCisJU0tMX1RLTl9VOF9ERVZfVFlQRSwKKwlTS0xfVEtOX1U4X0hXX0NPTk5fVFlQRSwKKwlTS0xfVEtOX1UxNl9NT0RfSU5TVF9JRCwKKwlTS0xfVEtOX1UxNl9CTE9DS19TSVpFLAorCVNLTF9US05fVTMyX01BWF9NQ1BTLAorCVNLTF9US05fVTMyX01FTV9QQUdFUywKKwlTS0xfVEtOX1UzMl9PQlMsCisJU0tMX1RLTl9VMzJfSUJTLAorCVNLTF9US05fVTMyX1ZCVVNfSUQsCisJU0tMX1RLTl9VMzJfUEFSQU1TX0ZJWFVQLAorCVNLTF9US05fVTMyX0NPTlZFUlRFUiwKKwlTS0xfVEtOX1UzMl9QSVBFX0lELAorCVNLTF9US05fVTMyX1BJUEVfQ09OTl9UWVBFLAorCVNLTF9US05fVTMyX1BJUEVfUFJJT1JJVFksCisJU0tMX1RLTl9VMzJfUElQRV9NRU1fUEdTLAorCVNLTF9US05fVTMyX0RJUl9QSU5fQ09VTlQsCisJU0tMX1RLTl9VMzJfRk1UX0NILAorCVNLTF9US05fVTMyX0ZNVF9GUkVRLAorCVNLTF9US05fVTMyX0ZNVF9CSVRfREVQVEgsCisJU0tMX1RLTl9VMzJfRk1UX1NBTVBMRV9TSVpFLAorCVNLTF9US05fVTMyX0ZNVF9DSF9DT05GSUcsCisJU0tMX1RLTl9VMzJfRk1UX0lOVEVSTEVBVkUsCisJU0tMX1RLTl9VMzJfRk1UX1NBTVBMRV9UWVBFLAorCVNLTF9US05fVTMyX0ZNVF9DSF9NQVAsCisJU0tMX1RLTl9VMzJfUElOX01PRF9JRCwKKwlTS0xfVEtOX1UzMl9QSU5fSU5TVF9JRCwKKwlTS0xfVEtOX1UzMl9NT0RfU0VUX1BBUkFNUywKKwlTS0xfVEtOX1UzMl9NT0RfUEFSQU1fSUQsCisJU0tMX1RLTl9VMzJfQ0FQU19TRVRfUEFSQU1TLAorCVNLTF9US05fVTMyX0NBUFNfUEFSQU1TX0lELAorCVNLTF9US05fVTMyX0NBUFNfU0laRSwKKwlTS0xfVEtOX1UzMl9QUk9DX0RPTUFJTiwKKwlTS0xfVEtOX1UzMl9MSUJfQ09VTlQsCisJU0tMX1RLTl9TVFJfTElCX05BTUUsCisJU0tMX1RLTl9NQVggPSBTS0xfVEtOX1NUUl9MSUJfTkFNRSwKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL3NvdW5kL3Rsdi5oIGIvaW5jbHVkZS91YXBpL3NvdW5kL3Rsdi5oCmluZGV4IGZmYzRmMjAuLmI0ZGY0NDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9zb3VuZC90bHYuaAorKysgYi9pbmNsdWRlL3VhcGkvc291bmQvdGx2LmgKQEAgLTI4LDQgKzI4LDczIEBACiAjZGVmaW5lIFNORFJWX0NUTF9UTFZUX0NITUFQX1ZBUgkweDEwMgkvKiBjaGFubmVscyBmcmVlbHkgc3dhcHBhYmxlICovCiAjZGVmaW5lIFNORFJWX0NUTF9UTFZUX0NITUFQX1BBSVJFRAkweDEwMwkvKiBwYWlyLXdpc2Ugc3dhcHBhYmxlICovCiAKKy8qCisgKiBUTFYgc3RydWN0dXJlIGlzIHJpZ2h0IGJlaGluZCB0aGUgc3RydWN0IHNuZF9jdGxfdGx2OgorICogICB1bnNpZ25lZCBpbnQgdHlwZSAgCS0gc2VlIFNORFJWX0NUTF9UTFZUXyoKKyAqICAgdW5zaWduZWQgaW50IGxlbmd0aAorICogICAuLi4uIGRhdGEgYWxpZ25lZCB0byBzaXplb2YodW5zaWduZWQgaW50KSwgdXNlCisgKiAgICAgICAgYmxvY2tfbGVuZ3RoID0gKGxlbmd0aCArIChzaXplb2YodW5zaWduZWQgaW50KSAtIDEpKSAmCisgKiAgICAgICAgICAgICAgICAgICAgICAgfihzaXplb2YodW5zaWduZWQgaW50KSAtIDEpKSAuLi4uCisgKi8KKyNkZWZpbmUgU05EUlZfQ1RMX1RMVkRfSVRFTSh0eXBlLCAuLi4pIFwKKwkodHlwZSksIFNORFJWX0NUTF9UTFZEX0xFTkdUSChfX1ZBX0FSR1NfXyksIF9fVkFfQVJHU19fCisjZGVmaW5lIFNORFJWX0NUTF9UTFZEX0xFTkdUSCguLi4pIFwKKwkoKHVuc2lnbmVkIGludClzaXplb2YoKGNvbnN0IHVuc2lnbmVkIGludFtdKSB7IF9fVkFfQVJHU19fIH0pKQorCisjZGVmaW5lIFNORFJWX0NUTF9UTFZEX0NPTlRBSU5FUl9JVEVNKC4uLikgXAorCVNORFJWX0NUTF9UTFZEX0lURU0oU05EUlZfQ1RMX1RMVlRfQ09OVEFJTkVSLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9DT05UQUlORVIobmFtZSwgLi4uKSBcCisJdW5zaWduZWQgaW50IG5hbWVbXSA9IHsgXAorCQlTTkRSVl9DVExfVExWRF9DT05UQUlORVJfSVRFTShfX1ZBX0FSR1NfXykgXAorCX0KKworI2RlZmluZSBTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9NQVNLCTB4ZmZmZgorI2RlZmluZSBTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9NVVRFCTB4MTAwMDAKKyNkZWZpbmUgU05EUlZfQ1RMX1RMVkRfREJfU0NBTEVfSVRFTShtaW4sIHN0ZXAsIG11dGUpIFwKKwlTTkRSVl9DVExfVExWRF9JVEVNKFNORFJWX0NUTF9UTFZUX0RCX1NDQUxFLCBcCisJCQkgICAgKG1pbiksIFwKKwkJCSAgICAoKHN0ZXApICYgU05EUlZfQ1RMX1RMVkRfREJfU0NBTEVfTUFTSykgfCBcCisJCQkgICAgICgobXV0ZSkgPyBTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9NVVRFIDogMCkpCisjZGVmaW5lIFNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfU0NBTEUobmFtZSwgbWluLCBzdGVwLCBtdXRlKSBcCisJdW5zaWduZWQgaW50IG5hbWVbXSA9IHsgXAorCQlTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9JVEVNKG1pbiwgc3RlcCwgbXV0ZSkgXAorCX0KKworLyogZEIgc2NhbGUgc3BlY2lmaWVkIHdpdGggbWluL21heCB2YWx1ZXMgaW5zdGVhZCBvZiBzdGVwICovCisjZGVmaW5lIFNORFJWX0NUTF9UTFZEX0RCX01JTk1BWF9JVEVNKG1pbl9kQiwgbWF4X2RCKSBcCisJU05EUlZfQ1RMX1RMVkRfSVRFTShTTkRSVl9DVExfVExWVF9EQl9NSU5NQVgsIChtaW5fZEIpLCAobWF4X2RCKSkKKyNkZWZpbmUgU05EUlZfQ1RMX1RMVkRfREJfTUlOTUFYX01VVEVfSVRFTShtaW5fZEIsIG1heF9kQikgXAorCVNORFJWX0NUTF9UTFZEX0lURU0oU05EUlZfQ1RMX1RMVlRfREJfTUlOTUFYX01VVEUsIChtaW5fZEIpLCAobWF4X2RCKSkKKyNkZWZpbmUgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9NSU5NQVgobmFtZSwgbWluX2RCLCBtYXhfZEIpIFwKKwl1bnNpZ25lZCBpbnQgbmFtZVtdID0geyBcCisJCVNORFJWX0NUTF9UTFZEX0RCX01JTk1BWF9JVEVNKG1pbl9kQiwgbWF4X2RCKSBcCisJfQorI2RlZmluZSBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX01JTk1BWF9NVVRFKG5hbWUsIG1pbl9kQiwgbWF4X2RCKSBcCisJdW5zaWduZWQgaW50IG5hbWVbXSA9IHsgXAorCQlTTkRSVl9DVExfVExWRF9EQl9NSU5NQVhfTVVURV9JVEVNKG1pbl9kQiwgbWF4X2RCKSBcCisJfQorCisvKiBsaW5lYXIgdm9sdW1lIGJldHdlZW4gbWluX2RCIGFuZCBtYXhfZEIgKC4wMWRCIHVuaXQpICovCisjZGVmaW5lIFNORFJWX0NUTF9UTFZEX0RCX0xJTkVBUl9JVEVNKG1pbl9kQiwgbWF4X2RCKSBcCisJU05EUlZfQ1RMX1RMVkRfSVRFTShTTkRSVl9DVExfVExWVF9EQl9MSU5FQVIsIChtaW5fZEIpLCAobWF4X2RCKSkKKyNkZWZpbmUgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9MSU5FQVIobmFtZSwgbWluX2RCLCBtYXhfZEIpIFwKKwl1bnNpZ25lZCBpbnQgbmFtZVtdID0geyBcCisJCVNORFJWX0NUTF9UTFZEX0RCX0xJTkVBUl9JVEVNKG1pbl9kQiwgbWF4X2RCKSBcCisJfQorCisvKiBkQiByYW5nZSBjb250YWluZXI6CisgKiBJdGVtcyBpbiBkQiByYW5nZSBjb250YWluZXIgbXVzdCBiZSBvcmRlcmVkIGJ5IHRoZWlyIHZhbHVlcyBhbmQgYnkgdGhlaXIKKyAqIGRCIHZhbHVlcy4gVGhpcyBpbXBsaWVzIHRoYXQgbGFyZ2VyIHZhbHVlcyBtdXN0IGNvcnJlc3BvbmQgd2l0aCBsYXJnZXIKKyAqIGRCIHZhbHVlcyAod2hpY2ggaXMgYWxzbyByZXF1aXJlZCBmb3IgYWxsIG90aGVyIG1peGVyIGNvbnRyb2xzKS4KKyAqLworLyogRWFjaCBpdGVtIGlzOiA8bWluPiA8bWF4PiA8VExWPiAqLworI2RlZmluZSBTTkRSVl9DVExfVExWRF9EQl9SQU5HRV9JVEVNKC4uLikgXAorCVNORFJWX0NUTF9UTFZEX0lURU0oU05EUlZfQ1RMX1RMVlRfREJfUkFOR0UsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1JBTkdFKG5hbWUsIC4uLikgXAorCXVuc2lnbmVkIGludCBuYW1lW10gPSB7IFwKKwkJU05EUlZfQ1RMX1RMVkRfREJfUkFOR0VfSVRFTShfX1ZBX0FSR1NfXykgXAorCX0KKworI2RlZmluZSBTTkRSVl9DVExfVExWRF9EQl9HQUlOX01VVEUJLTk5OTk5OTkKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2Uvc2NoZWQuaCBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9zY2hlZC5oCmluZGV4IGYxODQ5MDkuLmE0YzRkNzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL2ludGVyZmFjZS9zY2hlZC5oCisrKyBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9zY2hlZC5oCkBAIC0zLDYgKzMsMjQgQEAKICAqCiAgKiBTY2hlZHVsZXIgc3RhdGUgaW50ZXJhY3Rpb25zCiAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvCisgKiBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZQorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKICAqIENvcHlyaWdodCAoYykgMjAwNSwgS2VpciBGcmFzZXIgPGtlaXJAeGVuc291cmNlLmNvbT4KICAqLwogCkBAIC0xMiwxOCArMzAsMzAgQEAKICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL2V2ZW50X2NoYW5uZWwuaD4KIAogLyoKKyAqIEd1ZXN0IFNjaGVkdWxlciBPcGVyYXRpb25zCisgKgorICogVGhlIFNDSEVET1AgaW50ZXJmYWNlIHByb3ZpZGVzIG1lY2hhbmlzbXMgZm9yIGEgZ3Vlc3QgdG8gaW50ZXJhY3QKKyAqIHdpdGggdGhlIHNjaGVkdWxlciwgaW5jbHVkaW5nIHlpZWxkLCBibG9ja2luZyBhbmQgc2h1dHRpbmcgaXRzZWxmCisgKiBkb3duLgorICovCisKKy8qCiAgKiBUaGUgcHJvdG90eXBlIGZvciB0aGlzIGh5cGVyY2FsbCBpczoKLSAqICBsb25nIHNjaGVkX29wX25ldyhpbnQgY21kLCB2b2lkICphcmcpCisgKiBsb25nIEhZUEVSVklTT1Jfc2NoZWRfb3AoZW51bSBzY2hlZF9vcCBjbWQsIHZvaWQgKmFyZywgLi4uKQorICoKICAqIEBjbWQgPT0gU0NIRURPUF8/Pz8gKHNjaGVkdWxlciBvcGVyYXRpb24pLgogICogQGFyZyA9PSBPcGVyYXRpb24tc3BlY2lmaWMgZXh0cmEgYXJndW1lbnQocyksIGFzIGRlc2NyaWJlZCBiZWxvdy4KKyAqIC4uLiAgPT0gQWRkaXRpb25hbCBPcGVyYXRpb24tc3BlY2lmaWMgZXh0cmEgYXJndW1lbnRzLCBkZXNjcmliZWQgYmVsb3cuCiAgKgotICogKipOT1RFKio6Ci0gKiBWZXJzaW9ucyBvZiBYZW4gcHJpb3IgdG8gMy4wLjIgcHJvdmlkZSBvbmx5IHRoZSBmb2xsb3dpbmcgbGVnYWN5IHZlcnNpb24KKyAqIFZlcnNpb25zIG9mIFhlbiBwcmlvciB0byAzLjAuMiBwcm92aWRlZCBvbmx5IHRoZSBmb2xsb3dpbmcgbGVnYWN5IHZlcnNpb24KICAqIG9mIHRoaXMgaHlwZXJjYWxsLCBzdXBwb3J0aW5nIG9ubHkgdGhlIGNvbW1hbmRzIHlpZWxkLCBibG9jayBhbmQgc2h1dGRvd246CiAgKiAgbG9uZyBzY2hlZF9vcChpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKICAqIEBjbWQgPT0gU0NIRURPUF8/Pz8gKHNjaGVkdWxlciBvcGVyYXRpb24pLgogICogQGFyZyA9PSAwICAgICAgICAgICAgICAgKFNDSEVET1BfeWllbGQgYW5kIFNDSEVET1BfYmxvY2spCiAgKiAgICAgID09IFNIVVRET1dOXyogY29kZSAoU0NIRURPUF9zaHV0ZG93bikKKyAqCisgKiBUaGlzIGxlZ2FjeSB2ZXJzaW9uIGlzIGF2YWlsYWJsZSB0byBuZXcgZ3Vlc3RzIGFzOgorICogbG9uZyBIWVBFUlZJU09SX3NjaGVkX29wX2NvbXBhdChlbnVtIHNjaGVkX29wIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiAgKi8KIAogLyoKQEAgLTQ0LDEyICs3NCwxNyBAQAogLyoKICAqIEhhbHQgZXhlY3V0aW9uIG9mIHRoaXMgZG9tYWluIChhbGwgVkNQVXMpIGFuZCBub3RpZnkgdGhlIHN5c3RlbSBjb250cm9sbGVyLgogICogQGFyZyA9PSBwb2ludGVyIHRvIHNjaGVkX3NodXRkb3duIHN0cnVjdHVyZS4KKyAqCisgKiBJZiB0aGUgc2NoZWRfc2h1dGRvd25fdCByZWFzb24gaXMgU0hVVERPV05fc3VzcGVuZCB0aGVuCisgKiB4ODYgUFYgZ3Vlc3RzIG11c3QgYWxzbyBzZXQgUkRYIChFRFggZm9yIDMyLWJpdCBndWVzdHMpIHRvIHRoZSBNRk4KKyAqIG9mIHRoZSBndWVzdCdzIHN0YXJ0IGluZm8gcGFnZS4gIFJEWC9FRFggaXMgdGhlIHRoaXJkIGh5cGVyY2FsbAorICogYXJndW1lbnQuCisgKgorICogSW4gYWRkaXRpb24sIHdoaWNoIHJlYXNvbiBpcyBTSFVURE9XTl9zdXNwZW5kIHRoaXMgaHlwZXJjYWxsCisgKiByZXR1cm5zIDEgaWYgc3VzcGVuZCB3YXMgY2FuY2VsbGVkIG9yIHRoZSBkb21haW4gd2FzIG1lcmVseQorICogY2hlY2twb2ludGVkLCBhbmQgMCBpZiBpdCBpcyByZXN1bWluZyBpbiBhIG5ldyBkb21haW4uCiAgKi8KICNkZWZpbmUgU0NIRURPUF9zaHV0ZG93biAgICAyCi1zdHJ1Y3Qgc2NoZWRfc2h1dGRvd24gewotICAgIHVuc2lnbmVkIGludCByZWFzb247IC8qIFNIVVRET1dOXyogKi8KLX07Ci1ERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVChzY2hlZF9zaHV0ZG93bik7CiAKIC8qCiAgKiBQb2xsIGEgc2V0IG9mIGV2ZW50LWNoYW5uZWwgcG9ydHMuIFJldHVybiB3aGVuIG9uZSBvciBtb3JlIGFyZSBwZW5kaW5nLiBBbgpAQCAtNTcsMTIgKzkyLDYgQEAKICAqIEBhcmcgPT0gcG9pbnRlciB0byBzY2hlZF9wb2xsIHN0cnVjdHVyZS4KICAqLwogI2RlZmluZSBTQ0hFRE9QX3BvbGwgICAgICAgIDMKLXN0cnVjdCBzY2hlZF9wb2xsIHsKLSAgICBHVUVTVF9IQU5ETEUoZXZ0Y2huX3BvcnRfdCkgcG9ydHM7Ci0gICAgdW5zaWduZWQgaW50IG5yX3BvcnRzOwotICAgIHVpbnQ2NF90IHRpbWVvdXQ7Ci19OwotREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1Qoc2NoZWRfcG9sbCk7CiAKIC8qCiAgKiBEZWNsYXJlIGEgc2h1dGRvd24gZm9yIGFub3RoZXIgZG9tYWluLiBUaGUgbWFpbiB1c2Ugb2YgdGhpcyBmdW5jdGlvbiBpcwpAQCAtNzEsMTUgKzEwMCwxMSBAQAogICogQGFyZyA9PSBwb2ludGVyIHRvIHNjaGVkX3JlbW90ZV9zaHV0ZG93biBzdHJ1Y3R1cmUuCiAgKi8KICNkZWZpbmUgU0NIRURPUF9yZW1vdGVfc2h1dGRvd24gICAgICAgIDQKLXN0cnVjdCBzY2hlZF9yZW1vdGVfc2h1dGRvd24gewotICAgIGRvbWlkX3QgZG9tYWluX2lkOyAgICAgICAgIC8qIFJlbW90ZSBkb21haW4gSUQgKi8KLSAgICB1bnNpZ25lZCBpbnQgcmVhc29uOyAgICAgICAvKiBTSFVURE9XTl94eHggcmVhc29uICovCi19OwogCiAvKgogICogTGF0Y2ggYSBzaHV0ZG93biBjb2RlLCBzbyB0aGF0IHdoZW4gdGhlIGRvbWFpbiBsYXRlciBzaHV0cyBkb3duIGl0CiAgKiByZXBvcnRzIHRoaXMgY29kZSB0byB0aGUgY29udHJvbCB0b29scy4KLSAqIEBhcmcgPT0gYXMgZm9yIFNDSEVET1Bfc2h1dGRvd24uCisgKiBAYXJnID09IHNjaGVkX3NodXRkb3duLCBhcyBmb3IgU0NIRURPUF9zaHV0ZG93bi4KICAqLwogI2RlZmluZSBTQ0hFRE9QX3NodXRkb3duX2NvZGUgNQogCkBAIC05MiwxMCArMTE3LDQ3IEBACiAgKiBXaXRoIGlkICE9IDAgYW5kIHRpbWVvdXQgIT0gMCwgcG9rZSB3YXRjaGRvZyB0aW1lciBhbmQgc2V0IG5ldyB0aW1lb3V0LgogICovCiAjZGVmaW5lIFNDSEVET1Bfd2F0Y2hkb2cgICAgNgorCisvKgorICogT3ZlcnJpZGUgdGhlIGN1cnJlbnQgdmNwdSBhZmZpbml0eSBieSBwaW5uaW5nIGl0IHRvIG9uZSBwaHlzaWNhbCBjcHUgb3IKKyAqIHVuZG8gdGhpcyBvdmVycmlkZSByZXN0b3JpbmcgdGhlIHByZXZpb3VzIGFmZmluaXR5LgorICogQGFyZyA9PSBwb2ludGVyIHRvIHNjaGVkX3Bpbl9vdmVycmlkZSBzdHJ1Y3R1cmUuCisgKgorICogQSBuZWdhdGl2ZSBwY3B1IHZhbHVlIHdpbGwgdW5kbyBhIHByZXZpb3VzIHBpbiBvdmVycmlkZSBhbmQgcmVzdG9yZSB0aGUKKyAqIHByZXZpb3VzIGNwdSBhZmZpbml0eS4KKyAqIFRoaXMgY2FsbCBpcyBhbGxvd2VkIGZvciB0aGUgaGFyZHdhcmUgZG9tYWluIG9ubHkgYW5kIHJlcXVpcmVzIHRoZSBjcHUKKyAqIHRvIGJlIHBhcnQgb2YgdGhlIGRvbWFpbidzIGNwdXBvb2wuCisgKi8KKyNkZWZpbmUgU0NIRURPUF9waW5fb3ZlcnJpZGUgNworCitzdHJ1Y3Qgc2NoZWRfc2h1dGRvd24geworICAgIHVuc2lnbmVkIGludCByZWFzb247IC8qIFNIVVRET1dOXyogPT4gc2h1dGRvd24gcmVhc29uICovCit9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1Qoc2NoZWRfc2h1dGRvd24pOworCitzdHJ1Y3Qgc2NoZWRfcG9sbCB7CisgICAgR1VFU1RfSEFORExFKGV2dGNobl9wb3J0X3QpIHBvcnRzOworICAgIHVuc2lnbmVkIGludCBucl9wb3J0czsKKyAgICB1aW50NjRfdCB0aW1lb3V0OworfTsKK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKHNjaGVkX3BvbGwpOworCitzdHJ1Y3Qgc2NoZWRfcmVtb3RlX3NodXRkb3duIHsKKyAgICBkb21pZF90IGRvbWFpbl9pZDsgICAgICAgICAvKiBSZW1vdGUgZG9tYWluIElEICovCisgICAgdW5zaWduZWQgaW50IHJlYXNvbjsgICAgICAgLyogU0hVVERPV05fKiA9PiBzaHV0ZG93biByZWFzb24gKi8KK307CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVChzY2hlZF9yZW1vdGVfc2h1dGRvd24pOworCiBzdHJ1Y3Qgc2NoZWRfd2F0Y2hkb2cgewogICAgIHVpbnQzMl90IGlkOyAgICAgICAgICAgICAgICAvKiB3YXRjaGRvZyBJRCAqLwogICAgIHVpbnQzMl90IHRpbWVvdXQ7ICAgICAgICAgICAvKiB0aW1lb3V0ICovCiB9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1Qoc2NoZWRfd2F0Y2hkb2cpOworCitzdHJ1Y3Qgc2NoZWRfcGluX292ZXJyaWRlIHsKKyAgICBpbnQzMl90IHBjcHU7Cit9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1Qoc2NoZWRfcGluX292ZXJyaWRlKTsKIAogLyoKICAqIFJlYXNvbiBjb2RlcyBmb3IgU0NIRURPUF9zaHV0ZG93bi4gVGhlc2UgbWF5IGJlIGludGVycHJldGVkIGJ5IGNvbnRyb2wKQEAgLTEwNyw2ICsxNjksNyBAQAogI2RlZmluZSBTSFVURE9XTl9zdXNwZW5kICAgIDIgIC8qIENsZWFuIHVwLCBzYXZlIHN1c3BlbmQgaW5mbywga2lsbC4gICAgICAgICAqLwogI2RlZmluZSBTSFVURE9XTl9jcmFzaCAgICAgIDMgIC8qIFRlbGwgY29udHJvbGxlciB3ZSd2ZSBjcmFzaGVkLiAgICAgICAgICAgICAqLwogI2RlZmluZSBTSFVURE9XTl93YXRjaGRvZyAgIDQgIC8qIFJlc3RhcnQgYmVjYXVzZSB3YXRjaGRvZyB0aW1lIGV4cGlyZWQuICAgICAqLworCiAvKgogICogRG9tYWluIGFza2VkIHRvIHBlcmZvcm0gJ3NvZnQgcmVzZXQnIGZvciBpdC4gVGhlIGV4cGVjdGVkIGJlaGF2aW9yIGlzIHRvCiAgKiByZXNldCBpbnRlcm5hbCBYZW4gc3RhdGUgZm9yIHRoZSBkb21haW4gcmV0dXJuaW5nIGl0IHRvIHRoZSBwb2ludCB3aGVyZSBpdApAQCAtMTE1LDUgKzE3OCw2IEBACiAgKiBpbnRlcmZhY2VzIGFnYWluLgogICovCiAjZGVmaW5lIFNIVVRET1dOX3NvZnRfcmVzZXQgNQorI2RlZmluZSBTSFVURE9XTl9NQVggICAgICAgIDUgIC8qIE1heGltdW0gdmFsaWQgc2h1dGRvd24gcmVhc29uLiAgICAgICAgICAgICAqLwogCiAjZW5kaWYgLyogX19YRU5fUFVCTElDX1NDSEVEX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4veGVuLW9wcy5oIGIvaW5jbHVkZS94ZW4veGVuLW9wcy5oCmluZGV4IDlhMzdjNTQxLi5iNTQ4NmU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3hlbi94ZW4tb3BzLmgKKysrIGIvaW5jbHVkZS94ZW4veGVuLW9wcy5oCkBAIC05LDggKzksOCBAQAogCiBERUNMQVJFX1BFUl9DUFUoc3RydWN0IHZjcHVfaW5mbyAqLCB4ZW5fdmNwdSk7CiAKLURFQ0xBUkVfUEVSX0NQVShpbnQsIHhlbl92Y3B1X2lkKTsKLXN0YXRpYyBpbmxpbmUgaW50IHhlbl92Y3B1X25yKGludCBjcHUpCitERUNMQVJFX1BFUl9DUFUodWludDMyX3QsIHhlbl92Y3B1X2lkKTsKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgeGVuX3ZjcHVfbnIoaW50IGNwdSkKIHsKIAlyZXR1cm4gcGVyX2NwdSh4ZW5fdmNwdV9pZCwgY3B1KTsKIH0KZGlmZiAtLWdpdCBhL2luaXQvS2NvbmZpZyBiL2luaXQvS2NvbmZpZwppbmRleCBjYWMzZjA5Li4zYjlhNDdmIDEwMDY0NAotLS0gYS9pbml0L0tjb25maWcKKysrIGIvaW5pdC9LY29uZmlnCkBAIC0yNiw2ICsyNiwxNiBAQAogY29uZmlnIEJVSUxEVElNRV9FWFRBQkxFX1NPUlQKIAlib29sCiAKK2NvbmZpZyBUSFJFQURfSU5GT19JTl9UQVNLCisJYm9vbAorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIHRvIG1vdmUgdGhyZWFkX2luZm8gb2ZmIHRoZSBzdGFjayBpbnRvIHRhc2tfc3RydWN0LiAgVG8KKwkgIG1ha2UgdGhpcyB3b3JrLCBhbiBhcmNoIHdpbGwgbmVlZCB0byByZW1vdmUgYWxsIHRocmVhZF9pbmZvIGZpZWxkcworCSAgZXhjZXB0IGZsYWdzIGFuZCBmaXggYW55IHJ1bnRpbWUgYnVncy4KKworCSAgT25lIHN1YnRsZSBjaGFuZ2UgdGhhdCB3aWxsIGJlIG5lZWRlZCBpcyB0byB1c2UgdHJ5X2dldF90YXNrX3N0YWNrKCkKKwkgIGFuZCBwdXRfdGFza19zdGFjaygpIGluIHNhdmVfdGhyZWFkX3N0YWNrX3RzaygpIGFuZCBnZXRfd2NoYW4oKS4KKwogbWVudSAiR2VuZXJhbCBzZXR1cCIKIAogY29uZmlnIEJST0tFTgpkaWZmIC0tZ2l0IGEvaW5pdC9pbml0X3Rhc2suYyBiL2luaXQvaW5pdF90YXNrLmMKaW5kZXggYmEwYTdmMzYuLjExZjgzYmUxIDEwMDY0NAotLS0gYS9pbml0L2luaXRfdGFzay5jCisrKyBiL2luaXQvaW5pdF90YXNrLmMKQEAgLTIyLDUgKzIyLDggQEAKICAqIEluaXRpYWwgdGhyZWFkIHN0cnVjdHVyZS4gQWxpZ25tZW50IG9mIHRoaXMgaXMgaGFuZGxlZCBieSBhIHNwZWNpYWwKICAqIGxpbmtlciBtYXAgZW50cnkuCiAgKi8KLXVuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbiBfX2luaXRfdGFza19kYXRhID0KLQl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwordW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uIF9faW5pdF90YXNrX2RhdGEgPSB7CisjaWZuZGVmIENPTkZJR19USFJFQURfSU5GT19JTl9UQVNLCisJSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spCisjZW5kaWYKK307CmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXQuYyBiL2tlcm5lbC9hdWRpdC5jCmluZGV4IGE4YTkxYmQuLmYxY2ExMTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdC5jCisrKyBiL2tlcm5lbC9hdWRpdC5jCkBAIC04NzcsNiArODc3LDEyIEBACiAJCQkJcmV0dXJuIGVycjsKIAkJfQogCQlpZiAocy5tYXNrICYgQVVESVRfU1RBVFVTX1BJRCkgeworCQkJLyogTk9URTogd2UgYXJlIHVzaW5nIHRhc2tfdGdpZF92bnIoKSBiZWxvdyBiZWNhdXNlCisJCQkgKiAgICAgICB0aGUgcy5waWQgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIG5hbWVzcGFjZQorCQkJICogICAgICAgb2YgdGhlIGNhbGxlcjsgYXQgcHJlc2VudCB0aGlzIGRvZXNuJ3QgbWF0dGVyCisJCQkgKiAgICAgICBtdWNoIHNpbmNlIHlvdSBjYW4gcmVhbGx5IG9ubHkgcnVuIGF1ZGl0ZAorCQkJICogICAgICAgZnJvbSB0aGUgaW5pdGlhbCBwaWQgbmFtZXNwYWNlLCBidXQgc29tZXRoaW5nCisJCQkgKiAgICAgICB0byBrZWVwIGluIG1pbmQgaWYgdGhpcyBjaGFuZ2VzICovCiAJCQlpbnQgbmV3X3BpZCA9IHMucGlkOwogCQkJcGlkX3QgcmVxdWVzdGluZ19waWQgPSB0YXNrX3RnaWRfdm5yKGN1cnJlbnQpOwogCkBAIC0xOTE3LDcgKzE5MjMsNyBAQAogCQkJICIgZXVpZD0ldSBzdWlkPSV1IGZzdWlkPSV1IgogCQkJICIgZWdpZD0ldSBzZ2lkPSV1IGZzZ2lkPSV1IHR0eT0lcyBzZXM9JXUiLAogCQkJIHRhc2tfcHBpZF9ucih0c2spLAotCQkJIHRhc2tfcGlkX25yKHRzayksCisJCQkgdGFza190Z2lkX25yKHRzayksCiAJCQkgZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIGF1ZGl0X2dldF9sb2dpbnVpZCh0c2spKSwKIAkJCSBmcm9tX2t1aWQoJmluaXRfdXNlcl9ucywgY3JlZC0+dWlkKSwKIAkJCSBmcm9tX2tnaWQoJmluaXRfdXNlcl9ucywgY3JlZC0+Z2lkKSwKZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdF93YXRjaC5jIGIva2VybmVsL2F1ZGl0X3dhdGNoLmMKaW5kZXggZDY3MDllYi4uMGQzMDJhOCAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0X3dhdGNoLmMKKysrIGIva2VybmVsL2F1ZGl0X3dhdGNoLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgpAQCAtNTQ0LDEwICs1NDUsMTEgQEAKIAl1bnNpZ25lZCBsb25nIGlubzsKIAlkZXZfdCBkZXY7CiAKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JZXhlX2ZpbGUgPSByY3VfZGVyZWZlcmVuY2UodHNrLT5tbS0+ZXhlX2ZpbGUpOworCWV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUodHNrKTsKKwlpZiAoIWV4ZV9maWxlKQorCQlyZXR1cm4gMDsKIAlpbm8gPSBleGVfZmlsZS0+Zl9pbm9kZS0+aV9pbm87CiAJZGV2ID0gZXhlX2ZpbGUtPmZfaW5vZGUtPmlfc2ItPnNfZGV2OwotCXJjdV9yZWFkX3VubG9jaygpOworCWZwdXQoZXhlX2ZpbGUpOwogCXJldHVybiBhdWRpdF9tYXJrX2NvbXBhcmUobWFyaywgaW5vLCBkZXYpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2F1ZGl0c2MuYyBiL2tlcm5lbC9hdWRpdHNjLmMKaW5kZXggNWFiZjFkYy4uMmNkNTI1NiAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0c2MuYworKysgYi9rZXJuZWwvYXVkaXRzYy5jCkBAIC00NTcsNyArNDU3LDcgQEAKIAogCQlzd2l0Y2ggKGYtPnR5cGUpIHsKIAkJY2FzZSBBVURJVF9QSUQ6Ci0JCQlwaWQgPSB0YXNrX3BpZF9ucih0c2spOworCQkJcGlkID0gdGFza190Z2lkX25yKHRzayk7CiAJCQlyZXN1bHQgPSBhdWRpdF9jb21wYXJhdG9yKHBpZCwgZi0+b3AsIGYtPnZhbCk7CiAJCQlicmVhazsKIAkJY2FzZSBBVURJVF9QUElEOgpAQCAtMTk5Myw3ICsxOTkzLDcgQEAKIAlsb2dpbnVpZCA9IGZyb21fa3VpZCgmaW5pdF91c2VyX25zLCBrbG9naW51aWQpLAogCXR0eSA9IGF1ZGl0X2dldF90dHkoY3VycmVudCk7CiAKLQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAicGlkPSVkIHVpZD0ldSIsIHRhc2tfcGlkX25yKGN1cnJlbnQpLCB1aWQpOworCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICJwaWQ9JWQgdWlkPSV1IiwgdGFza190Z2lkX25yKGN1cnJlbnQpLCB1aWQpOwogCWF1ZGl0X2xvZ190YXNrX2NvbnRleHQoYWIpOwogCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgb2xkLWF1aWQ9JXUgYXVpZD0ldSB0dHk9JXMgb2xkLXNlcz0ldSBzZXM9JXUgcmVzPSVkIiwKIAkJCSBvbGRsb2dpbnVpZCwgbG9naW51aWQsIHR0eSA/IHR0eV9uYW1lKHR0eSkgOiAiKG5vbmUpIiwKQEAgLTIyMjAsNyArMjIyMCw3IEBACiB7CiAJc3RydWN0IGF1ZGl0X2NvbnRleHQgKmNvbnRleHQgPSBjdXJyZW50LT5hdWRpdF9jb250ZXh0OwogCi0JY29udGV4dC0+dGFyZ2V0X3BpZCA9IHRhc2tfcGlkX25yKHQpOworCWNvbnRleHQtPnRhcmdldF9waWQgPSB0YXNrX3RnaWRfbnIodCk7CiAJY29udGV4dC0+dGFyZ2V0X2F1aWQgPSBhdWRpdF9nZXRfbG9naW51aWQodCk7CiAJY29udGV4dC0+dGFyZ2V0X3VpZCA9IHRhc2tfdWlkKHQpOwogCWNvbnRleHQtPnRhcmdldF9zZXNzaW9uaWQgPSBhdWRpdF9nZXRfc2Vzc2lvbmlkKHQpOwpAQCAtMjI0NSw3ICsyMjQ1LDcgQEAKIAogCWlmIChhdWRpdF9waWQgJiYgdC0+dGdpZCA9PSBhdWRpdF9waWQpIHsKIAkJaWYgKHNpZyA9PSBTSUdURVJNIHx8IHNpZyA9PSBTSUdIVVAgfHwgc2lnID09IFNJR1VTUjEgfHwgc2lnID09IFNJR1VTUjIpIHsKLQkJCWF1ZGl0X3NpZ19waWQgPSB0YXNrX3BpZF9ucih0c2spOworCQkJYXVkaXRfc2lnX3BpZCA9IHRhc2tfdGdpZF9ucih0c2spOwogCQkJaWYgKHVpZF92YWxpZCh0c2stPmxvZ2ludWlkKSkKIAkJCQlhdWRpdF9zaWdfdWlkID0gdHNrLT5sb2dpbnVpZDsKIAkJCWVsc2UKQEAgLTIzNDUsNyArMjM0NSw3IEBACiB2b2lkIF9fYXVkaXRfbG9nX2NhcHNldChjb25zdCBzdHJ1Y3QgY3JlZCAqbmV3LCBjb25zdCBzdHJ1Y3QgY3JlZCAqb2xkKQogewogCXN0cnVjdCBhdWRpdF9jb250ZXh0ICpjb250ZXh0ID0gY3VycmVudC0+YXVkaXRfY29udGV4dDsKLQljb250ZXh0LT5jYXBzZXQucGlkID0gdGFza19waWRfbnIoY3VycmVudCk7CisJY29udGV4dC0+Y2Fwc2V0LnBpZCA9IHRhc2tfdGdpZF9ucihjdXJyZW50KTsKIAljb250ZXh0LT5jYXBzZXQuY2FwLmVmZmVjdGl2ZSAgID0gbmV3LT5jYXBfZWZmZWN0aXZlOwogCWNvbnRleHQtPmNhcHNldC5jYXAuaW5oZXJpdGFibGUgPSBuZXctPmNhcF9lZmZlY3RpdmU7CiAJY29udGV4dC0+Y2Fwc2V0LmNhcC5wZXJtaXR0ZWQgICA9IG5ldy0+Y2FwX3Blcm1pdHRlZDsKQEAgLTIzNzcsNyArMjM3Nyw3IEBACiAJCQkgZnJvbV9rZ2lkKCZpbml0X3VzZXJfbnMsIGdpZCksCiAJCQkgc2Vzc2lvbmlkKTsKIAlhdWRpdF9sb2dfdGFza19jb250ZXh0KGFiKTsKLQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIHBpZD0lZCBjb21tPSIsIHRhc2tfcGlkX25yKGN1cnJlbnQpKTsKKwlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIHBpZD0lZCBjb21tPSIsIHRhc2tfdGdpZF9ucihjdXJyZW50KSk7CiAJYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhYiwgZ2V0X3Rhc2tfY29tbShjb21tLCBjdXJyZW50KSk7CiAJYXVkaXRfbG9nX2RfcGF0aF9leGUoYWIsIGN1cnJlbnQtPm1tKTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYXJyYXltYXAuYyBiL2tlcm5lbC9icGYvYXJyYXltYXAuYwppbmRleCA2MzNhNjUwLi5hMmFjMDUxIDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL2FycmF5bWFwLmMKKysrIGIva2VybmVsL2JwZi9hcnJheW1hcC5jCkBAIC01MzgsNyArNTM4LDcgQEAKIH0KIGxhdGVfaW5pdGNhbGwocmVnaXN0ZXJfcGVyZl9ldmVudF9hcnJheV9tYXApOwogCi0jaWZkZWYgQ09ORklHX1NPQ0tfQ0dST1VQX0RBVEEKKyNpZmRlZiBDT05GSUdfQ0dST1VQUwogc3RhdGljIHZvaWQgKmNncm91cF9mZF9hcnJheV9nZXRfcHRyKHN0cnVjdCBicGZfbWFwICptYXAsCiAJCQkJICAgICBzdHJ1Y3QgZmlsZSAqbWFwX2ZpbGUgLyogbm90IHVzZWQgKi8sCiAJCQkJICAgICBpbnQgZmQpCmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2NvcmUuYyBiL2tlcm5lbC9icGYvY29yZS5jCmluZGV4IDAzZmQyM2QuLmFhNmQ5ODEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvY29yZS5jCisrKyBiL2tlcm5lbC9icGYvY29yZS5jCkBAIC0xMDE4LDcgKzEwMTgsNyBAQAogCXByYW5kb21faW5pdF9vbmNlKCZicGZfdXNlcl9ybmRfc3RhdGUpOwogfQogCi11NjQgYnBmX3VzZXJfcm5kX3UzMih1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzAoYnBmX3VzZXJfcm5kX3UzMikKIHsKIAkvKiBTaG91bGQgc29tZW9uZSBldmVyIGhhdmUgdGhlIHJhdGhlciB1bndpc2UgaWRlYSB0byB1c2Ugc29tZQogCSAqIG9mIHRoZSByZWdpc3RlcnMgcGFzc2VkIGludG8gdGhpcyBmdW5jdGlvbiwgdGhlbiBub3RlIHRoYXQKQEAgLTEwMzEsNyArMTAzMSw3IEBACiAKIAlzdGF0ZSA9ICZnZXRfY3B1X3ZhcihicGZfdXNlcl9ybmRfc3RhdGUpOwogCXJlcyA9IHByYW5kb21fdTMyX3N0YXRlKHN0YXRlKTsKLQlwdXRfY3B1X3ZhcihzdGF0ZSk7CisJcHV0X2NwdV92YXIoYnBmX3VzZXJfcm5kX3N0YXRlKTsKIAogCXJldHVybiByZXM7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2hhc2h0YWIuYyBiL2tlcm5lbC9icGYvaGFzaHRhYi5jCmluZGV4IGZmZjM2NTAuLjU3MGVlY2EgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvaGFzaHRhYi5jCisrKyBiL2tlcm5lbC9icGYvaGFzaHRhYi5jCkBAIC0yNiwxMSArMjYsMTggQEAKIAlzdHJ1Y3QgYnVja2V0ICpidWNrZXRzOwogCXZvaWQgKmVsZW1zOwogCXN0cnVjdCBwY3B1X2ZyZWVsaXN0IGZyZWVsaXN0OworCXZvaWQgX19wZXJjcHUgKmV4dHJhX2VsZW1zOwogCWF0b21pY190IGNvdW50OwkvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBoYXNodGFibGUgKi8KIAl1MzIgbl9idWNrZXRzOwkvKiBudW1iZXIgb2YgaGFzaCBidWNrZXRzICovCiAJdTMyIGVsZW1fc2l6ZTsJLyogc2l6ZSBvZiBlYWNoIGVsZW1lbnQgaW4gYnl0ZXMgKi8KIH07CiAKK2VudW0gZXh0cmFfZWxlbV9zdGF0ZSB7CisJSFRBQl9OT1RfQU5fRVhUUkFfRUxFTSA9IDAsCisJSFRBQl9FWFRSQV9FTEVNX0ZSRUUsCisJSFRBQl9FWFRSQV9FTEVNX1VTRUQKK307CisKIC8qIGVhY2ggaHRhYiBlbGVtZW50IGlzIHN0cnVjdCBodGFiX2VsZW0gKyBrZXkgKyB2YWx1ZSAqLwogc3RydWN0IGh0YWJfZWxlbSB7CiAJdW5pb24gewpAQCAtMzgsNyArNDUsMTAgQEAKIAkJc3RydWN0IGJwZl9odGFiICpodGFiOwogCQlzdHJ1Y3QgcGNwdV9mcmVlbGlzdF9ub2RlIGZub2RlOwogCX07Ci0Jc3RydWN0IHJjdV9oZWFkIHJjdTsKKwl1bmlvbiB7CisJCXN0cnVjdCByY3VfaGVhZCByY3U7CisJCWVudW0gZXh0cmFfZWxlbV9zdGF0ZSBzdGF0ZTsKKwl9OwogCXUzMiBoYXNoOwogCWNoYXIga2V5WzBdIF9fYWxpZ25lZCg4KTsKIH07CkBAIC0xMTMsNiArMTIzLDIzIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBhbGxvY19leHRyYV9lbGVtcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpCit7CisJdm9pZCBfX3BlcmNwdSAqcHB0cjsKKwlpbnQgY3B1OworCisJcHB0ciA9IF9fYWxsb2NfcGVyY3B1X2dmcChodGFiLT5lbGVtX3NpemUsIDgsIEdGUF9VU0VSIHwgX19HRlBfTk9XQVJOKTsKKwlpZiAoIXBwdHIpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQkoKHN0cnVjdCBodGFiX2VsZW0gKilwZXJfY3B1X3B0cihwcHRyLCBjcHUpKS0+c3RhdGUgPQorCQkJSFRBQl9FWFRSQV9FTEVNX0ZSRUU7CisJfQorCWh0YWItPmV4dHJhX2VsZW1zID0gcHB0cjsKKwlyZXR1cm4gMDsKK30KKwogLyogQ2FsbGVkIGZyb20gc3lzY2FsbCAqLwogc3RhdGljIHN0cnVjdCBicGZfbWFwICpodGFiX21hcF9hbGxvYyh1bmlvbiBicGZfYXR0ciAqYXR0cikKIHsKQEAgLTE4NSw2ICsyMTIsOCBAQAogCWlmIChwZXJjcHUpCiAJCWNvc3QgKz0gKHU2NCkgcm91bmRfdXAoaHRhYi0+bWFwLnZhbHVlX3NpemUsIDgpICoKIAkJCW51bV9wb3NzaWJsZV9jcHVzKCkgKiBodGFiLT5tYXAubWF4X2VudHJpZXM7CisJZWxzZQorCSAgICAgICBjb3N0ICs9ICh1NjQpIGh0YWItPmVsZW1fc2l6ZSAqIG51bV9wb3NzaWJsZV9jcHVzKCk7CiAKIAlpZiAoY29zdCA+PSBVMzJfTUFYIC0gUEFHRV9TSVpFKQogCQkvKiBtYWtlIHN1cmUgcGFnZSBjb3VudCBkb2Vzbid0IG92ZXJmbG93ICovCkBAIC0yMTIsMTQgKzI0MSwyMiBAQAogCQlyYXdfc3Bpbl9sb2NrX2luaXQoJmh0YWItPmJ1Y2tldHNbaV0ubG9jayk7CiAJfQogCi0JaWYgKCEoYXR0ci0+bWFwX2ZsYWdzICYgQlBGX0ZfTk9fUFJFQUxMT0MpKSB7Ci0JCWVyciA9IHByZWFsbG9jX2VsZW1zX2FuZF9mcmVlbGlzdChodGFiKTsKKwlpZiAoIXBlcmNwdSkgeworCQllcnIgPSBhbGxvY19leHRyYV9lbGVtcyhodGFiKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZnJlZV9idWNrZXRzOwogCX0KIAorCWlmICghKGF0dHItPm1hcF9mbGFncyAmIEJQRl9GX05PX1BSRUFMTE9DKSkgeworCQllcnIgPSBwcmVhbGxvY19lbGVtc19hbmRfZnJlZWxpc3QoaHRhYik7CisJCWlmIChlcnIpCisJCQlnb3RvIGZyZWVfZXh0cmFfZWxlbXM7CisJfQorCiAJcmV0dXJuICZodGFiLT5tYXA7CiAKK2ZyZWVfZXh0cmFfZWxlbXM6CisJZnJlZV9wZXJjcHUoaHRhYi0+ZXh0cmFfZWxlbXMpOwogZnJlZV9idWNrZXRzOgogCWt2ZnJlZShodGFiLT5idWNrZXRzKTsKIGZyZWVfaHRhYjoKQEAgLTM0OSw3ICszODYsNiBAQAogCWlmIChodGFiLT5tYXAubWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9IQVNIKQogCQlmcmVlX3BlcmNwdShodGFiX2VsZW1fZ2V0X3B0cihsLCBodGFiLT5tYXAua2V5X3NpemUpKTsKIAlrZnJlZShsKTsKLQogfQogCiBzdGF0aWMgdm9pZCBodGFiX2VsZW1fZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkKQpAQCAtMzcwLDYgKzQwNiwxMSBAQAogCiBzdGF0aWMgdm9pZCBmcmVlX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpCiB7CisJaWYgKGwtPnN0YXRlID09IEhUQUJfRVhUUkFfRUxFTV9VU0VEKSB7CisJCWwtPnN0YXRlID0gSFRBQl9FWFRSQV9FTEVNX0ZSRUU7CisJCXJldHVybjsKKwl9CisKIAlpZiAoIShodGFiLT5tYXAubWFwX2ZsYWdzICYgQlBGX0ZfTk9fUFJFQUxMT0MpKSB7CiAJCXBjcHVfZnJlZWxpc3RfcHVzaCgmaHRhYi0+ZnJlZWxpc3QsICZsLT5mbm9kZSk7CiAJfSBlbHNlIHsKQEAgLTM4MSwyNSArNDIyLDQ0IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICphbGxvY19odGFiX2VsZW0oc3RydWN0IGJwZl9odGFiICpodGFiLCB2b2lkICprZXksCiAJCQkJCSB2b2lkICp2YWx1ZSwgdTMyIGtleV9zaXplLCB1MzIgaGFzaCwKLQkJCQkJIGJvb2wgcGVyY3B1LCBib29sIG9uYWxsY3B1cykKKwkJCQkJIGJvb2wgcGVyY3B1LCBib29sIG9uYWxsY3B1cywKKwkJCQkJIGJvb2wgb2xkX2VsZW1fZXhpc3RzKQogewogCXUzMiBzaXplID0gaHRhYi0+bWFwLnZhbHVlX3NpemU7CiAJYm9vbCBwcmVhbGxvYyA9ICEoaHRhYi0+bWFwLm1hcF9mbGFncyAmIEJQRl9GX05PX1BSRUFMTE9DKTsKIAlzdHJ1Y3QgaHRhYl9lbGVtICpsX25ldzsKIAl2b2lkIF9fcGVyY3B1ICpwcHRyOworCWludCBlcnIgPSAwOwogCiAJaWYgKHByZWFsbG9jKSB7CiAJCWxfbmV3ID0gKHN0cnVjdCBodGFiX2VsZW0gKilwY3B1X2ZyZWVsaXN0X3BvcCgmaHRhYi0+ZnJlZWxpc3QpOwogCQlpZiAoIWxfbmV3KQotCQkJcmV0dXJuIEVSUl9QVFIoLUUyQklHKTsKKwkJCWVyciA9IC1FMkJJRzsKIAl9IGVsc2UgewogCQlpZiAoYXRvbWljX2luY19yZXR1cm4oJmh0YWItPmNvdW50KSA+IGh0YWItPm1hcC5tYXhfZW50cmllcykgewogCQkJYXRvbWljX2RlYygmaHRhYi0+Y291bnQpOwotCQkJcmV0dXJuIEVSUl9QVFIoLUUyQklHKTsKKwkJCWVyciA9IC1FMkJJRzsKKwkJfSBlbHNlIHsKKwkJCWxfbmV3ID0ga21hbGxvYyhodGFiLT5lbGVtX3NpemUsCisJCQkJCUdGUF9BVE9NSUMgfCBfX0dGUF9OT1dBUk4pOworCQkJaWYgKCFsX25ldykKKwkJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAkJfQotCQlsX25ldyA9IGttYWxsb2MoaHRhYi0+ZWxlbV9zaXplLCBHRlBfQVRPTUlDIHwgX19HRlBfTk9XQVJOKTsKLQkJaWYgKCFsX25ldykKLQkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCWlmIChlcnIpIHsKKwkJaWYgKCFvbGRfZWxlbV9leGlzdHMpCisJCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCisJCS8qIGlmIHdlJ3JlIHVwZGF0aW5nIHRoZSBleGlzdGluZyBlbGVtZW50IGFuZCB0aGUgaGFzaCB0YWJsZQorCQkgKiBpcyBmdWxsLCB1c2UgcGVyLWNwdSBleHRyYSBlbGVtcworCQkgKi8KKwkJbF9uZXcgPSB0aGlzX2NwdV9wdHIoaHRhYi0+ZXh0cmFfZWxlbXMpOworCQlpZiAobF9uZXctPnN0YXRlICE9IEhUQUJfRVhUUkFfRUxFTV9GUkVFKQorCQkJcmV0dXJuIEVSUl9QVFIoLUUyQklHKTsKKwkJbF9uZXctPnN0YXRlID0gSFRBQl9FWFRSQV9FTEVNX1VTRUQ7CisJfSBlbHNlIHsKKwkJbF9uZXctPnN0YXRlID0gSFRBQl9OT1RfQU5fRVhUUkFfRUxFTTsKIAl9CiAKIAltZW1jcHkobF9uZXctPmtleSwga2V5LCBrZXlfc2l6ZSk7CkBAIC00ODksNyArNTQ5LDggQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycjsKIAotCWxfbmV3ID0gYWxsb2NfaHRhYl9lbGVtKGh0YWIsIGtleSwgdmFsdWUsIGtleV9zaXplLCBoYXNoLCBmYWxzZSwgZmFsc2UpOworCWxfbmV3ID0gYWxsb2NfaHRhYl9lbGVtKGh0YWIsIGtleSwgdmFsdWUsIGtleV9zaXplLCBoYXNoLCBmYWxzZSwgZmFsc2UsCisJCQkJISFsX29sZCk7CiAJaWYgKElTX0VSUihsX25ldykpIHsKIAkJLyogYWxsIHByZS1hbGxvY2F0ZWQgZWxlbWVudHMgYXJlIGluIHVzZSBvciBtZW1vcnkgZXhoYXVzdGVkICovCiAJCXJldCA9IFBUUl9FUlIobF9uZXcpOwpAQCAtNTYzLDcgKzYyNCw3IEBACiAJCX0KIAl9IGVsc2UgewogCQlsX25ldyA9IGFsbG9jX2h0YWJfZWxlbShodGFiLCBrZXksIHZhbHVlLCBrZXlfc2l6ZSwKLQkJCQkJaGFzaCwgdHJ1ZSwgb25hbGxjcHVzKTsKKwkJCQkJaGFzaCwgdHJ1ZSwgb25hbGxjcHVzLCBmYWxzZSk7CiAJCWlmIChJU19FUlIobF9uZXcpKSB7CiAJCQlyZXQgPSBQVFJfRVJSKGxfbmV3KTsKIAkJCWdvdG8gZXJyOwpAQCAtNjUyLDYgKzcxMyw3IEBACiAJCWh0YWJfZnJlZV9lbGVtcyhodGFiKTsKIAkJcGNwdV9mcmVlbGlzdF9kZXN0cm95KCZodGFiLT5mcmVlbGlzdCk7CiAJfQorCWZyZWVfcGVyY3B1KGh0YWItPmV4dHJhX2VsZW1zKTsKIAlrdmZyZWUoaHRhYi0+YnVja2V0cyk7CiAJa2ZyZWUoaHRhYik7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2hlbHBlcnMuYyBiL2tlcm5lbC9icGYvaGVscGVycy5jCmluZGV4IDFlYTNhZmIuLjM5OTE4NDAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvaGVscGVycy5jCisrKyBiL2tlcm5lbC9icGYvaGVscGVycy5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3VpZGdpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgogCiAvKiBJZiBrZXJuZWwgc3Vic3lzdGVtIGlzIGFsbG93aW5nIGVCUEYgcHJvZ3JhbXMgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLAogICogaW5zaWRlIGl0cyBvd24gdmVyaWZpZXJfb3BzLT5nZXRfZnVuY19wcm90bygpIGNhbGxiYWNrIGl0IHNob3VsZCByZXR1cm4KQEAgLTI2LDQ4ICsyNywzMiBAQAogICogaWYgcHJvZ3JhbSBpcyBhbGxvd2VkIHRvIGFjY2VzcyBtYXBzLCBzbyBjaGVjayByY3VfcmVhZF9sb2NrX2hlbGQgaW4KICAqIGFsbCB0aHJlZSBmdW5jdGlvbnMuCiAgKi8KLXN0YXRpYyB1NjQgYnBmX21hcF9sb29rdXBfZWxlbSh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzIoYnBmX21hcF9sb29rdXBfZWxlbSwgc3RydWN0IGJwZl9tYXAgKiwgbWFwLCB2b2lkICosIGtleSkKIHsKLQkvKiB2ZXJpZmllciBjaGVja2VkIHRoYXQgUjEgY29udGFpbnMgYSB2YWxpZCBwb2ludGVyIHRvIGJwZl9tYXAKLQkgKiBhbmQgUjIgcG9pbnRzIHRvIGEgcHJvZ3JhbSBzdGFjayBhbmQgbWFwLT5rZXlfc2l6ZSBieXRlcyB3ZXJlCi0JICogaW5pdGlhbGl6ZWQKLQkgKi8KLQlzdHJ1Y3QgYnBmX21hcCAqbWFwID0gKHN0cnVjdCBicGZfbWFwICopICh1bnNpZ25lZCBsb25nKSByMTsKLQl2b2lkICprZXkgPSAodm9pZCAqKSAodW5zaWduZWQgbG9uZykgcjI7Ci0Jdm9pZCAqdmFsdWU7Ci0KIAlXQVJOX09OX09OQ0UoIXJjdV9yZWFkX2xvY2tfaGVsZCgpKTsKLQotCXZhbHVlID0gbWFwLT5vcHMtPm1hcF9sb29rdXBfZWxlbShtYXAsIGtleSk7Ci0KLQkvKiBsb29rdXAoKSByZXR1cm5zIGVpdGhlciBwb2ludGVyIHRvIGVsZW1lbnQgdmFsdWUgb3IgTlVMTAotCSAqIHdoaWNoIGlzIHRoZSBtZWFuaW5nIG9mIFBUUl9UT19NQVBfVkFMVUVfT1JfTlVMTCB0eXBlCi0JICovCi0JcmV0dXJuICh1bnNpZ25lZCBsb25nKSB2YWx1ZTsKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIG1hcC0+b3BzLT5tYXBfbG9va3VwX2VsZW0obWFwLCBrZXkpOwogfQogCiBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX21hcF9sb29rdXBfZWxlbV9wcm90byA9IHsKIAkuZnVuYwkJPSBicGZfbWFwX2xvb2t1cF9lbGVtLAogCS5ncGxfb25seQk9IGZhbHNlLAorCS5wa3RfYWNjZXNzCT0gdHJ1ZSwKIAkucmV0X3R5cGUJPSBSRVRfUFRSX1RPX01BUF9WQUxVRV9PUl9OVUxMLAogCS5hcmcxX3R5cGUJPSBBUkdfQ09OU1RfTUFQX1BUUiwKIAkuYXJnMl90eXBlCT0gQVJHX1BUUl9UT19NQVBfS0VZLAogfTsKIAotc3RhdGljIHU2NCBicGZfbWFwX3VwZGF0ZV9lbGVtKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfNChicGZfbWFwX3VwZGF0ZV9lbGVtLCBzdHJ1Y3QgYnBmX21hcCAqLCBtYXAsIHZvaWQgKiwga2V5LAorCSAgIHZvaWQgKiwgdmFsdWUsIHU2NCwgZmxhZ3MpCiB7Ci0Jc3RydWN0IGJwZl9tYXAgKm1hcCA9IChzdHJ1Y3QgYnBmX21hcCAqKSAodW5zaWduZWQgbG9uZykgcjE7Ci0Jdm9pZCAqa2V5ID0gKHZvaWQgKikgKHVuc2lnbmVkIGxvbmcpIHIyOwotCXZvaWQgKnZhbHVlID0gKHZvaWQgKikgKHVuc2lnbmVkIGxvbmcpIHIzOwotCiAJV0FSTl9PTl9PTkNFKCFyY3VfcmVhZF9sb2NrX2hlbGQoKSk7Ci0KLQlyZXR1cm4gbWFwLT5vcHMtPm1hcF91cGRhdGVfZWxlbShtYXAsIGtleSwgdmFsdWUsIHI0KTsKKwlyZXR1cm4gbWFwLT5vcHMtPm1hcF91cGRhdGVfZWxlbShtYXAsIGtleSwgdmFsdWUsIGZsYWdzKTsKIH0KIAogY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9tYXBfdXBkYXRlX2VsZW1fcHJvdG8gPSB7CiAJLmZ1bmMJCT0gYnBmX21hcF91cGRhdGVfZWxlbSwKIAkuZ3BsX29ubHkJPSBmYWxzZSwKKwkucGt0X2FjY2Vzcwk9IHRydWUsCiAJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCiAJLmFyZzFfdHlwZQk9IEFSR19DT05TVF9NQVBfUFRSLAogCS5hcmcyX3R5cGUJPSBBUkdfUFRSX1RPX01BUF9LRVksCkBAIC03NSwxOSArNjAsMTYgQEAKIAkuYXJnNF90eXBlCT0gQVJHX0FOWVRISU5HLAogfTsKIAotc3RhdGljIHU2NCBicGZfbWFwX2RlbGV0ZV9lbGVtKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMihicGZfbWFwX2RlbGV0ZV9lbGVtLCBzdHJ1Y3QgYnBmX21hcCAqLCBtYXAsIHZvaWQgKiwga2V5KQogewotCXN0cnVjdCBicGZfbWFwICptYXAgPSAoc3RydWN0IGJwZl9tYXAgKikgKHVuc2lnbmVkIGxvbmcpIHIxOwotCXZvaWQgKmtleSA9ICh2b2lkICopICh1bnNpZ25lZCBsb25nKSByMjsKLQogCVdBUk5fT05fT05DRSghcmN1X3JlYWRfbG9ja19oZWxkKCkpOwotCiAJcmV0dXJuIG1hcC0+b3BzLT5tYXBfZGVsZXRlX2VsZW0obWFwLCBrZXkpOwogfQogCiBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX21hcF9kZWxldGVfZWxlbV9wcm90byA9IHsKIAkuZnVuYwkJPSBicGZfbWFwX2RlbGV0ZV9lbGVtLAogCS5ncGxfb25seQk9IGZhbHNlLAorCS5wa3RfYWNjZXNzCT0gdHJ1ZSwKIAkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKIAkuYXJnMV90eXBlCT0gQVJHX0NPTlNUX01BUF9QVFIsCiAJLmFyZzJfdHlwZQk9IEFSR19QVFJfVE9fTUFQX0tFWSwKQEAgLTk5LDcgKzgxLDcgQEAKIAkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKIH07CiAKLXN0YXRpYyB1NjQgYnBmX2dldF9zbXBfcHJvY2Vzc29yX2lkKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMChicGZfZ2V0X3NtcF9wcm9jZXNzb3JfaWQpCiB7CiAJcmV0dXJuIHNtcF9wcm9jZXNzb3JfaWQoKTsKIH0KQEAgLTExMCw3ICs5Miw3IEBACiAJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9rdGltZV9nZXRfbnModTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8wKGJwZl9rdGltZV9nZXRfbnMpCiB7CiAJLyogTk1JIHNhZmUgYWNjZXNzIHRvIGNsb2NrIG1vbm90b25pYyAqLwogCXJldHVybiBrdGltZV9nZXRfbW9ub19mYXN0X25zKCk7CkBAIC0xMjIsMTEgKzEwNCwxMSBAQAogCS5yZXRfdHlwZQk9IFJFVF9JTlRFR0VSLAogfTsKIAotc3RhdGljIHU2NCBicGZfZ2V0X2N1cnJlbnRfcGlkX3RnaWQodTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8wKGJwZl9nZXRfY3VycmVudF9waWRfdGdpZCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBjdXJyZW50OwogCi0JaWYgKCF0YXNrKQorCWlmICh1bmxpa2VseSghdGFzaykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dXJuICh1NjQpIHRhc2stPnRnaWQgPDwgMzIgfCB0YXNrLT5waWQ7CkBAIC0xMzgsMTggKzEyMCwxOCBAQAogCS5yZXRfdHlwZQk9IFJFVF9JTlRFR0VSLAogfTsKIAotc3RhdGljIHU2NCBicGZfZ2V0X2N1cnJlbnRfdWlkX2dpZCh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzAoYnBmX2dldF9jdXJyZW50X3VpZF9naWQpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gY3VycmVudDsKIAlrdWlkX3QgdWlkOwogCWtnaWRfdCBnaWQ7CiAKLQlpZiAoIXRhc2spCisJaWYgKHVubGlrZWx5KCF0YXNrKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAljdXJyZW50X3VpZF9naWQoJnVpZCwgJmdpZCk7CiAJcmV0dXJuICh1NjQpIGZyb21fa2dpZCgmaW5pdF91c2VyX25zLCBnaWQpIDw8IDMyIHwKLQkJZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIHVpZCk7CisJCSAgICAgZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIHVpZCk7CiB9CiAKIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfZ2V0X2N1cnJlbnRfdWlkX2dpZF9wcm90byA9IHsKQEAgLTE1OCwxMCArMTQwLDkgQEAKIAkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKIH07CiAKLXN0YXRpYyB1NjQgYnBmX2dldF9jdXJyZW50X2NvbW0odTY0IHIxLCB1NjQgc2l6ZSwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzIoYnBmX2dldF9jdXJyZW50X2NvbW0sIGNoYXIgKiwgYnVmLCB1MzIsIHNpemUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gY3VycmVudDsKLQljaGFyICpidWYgPSAoY2hhciAqKSAobG9uZykgcjE7CiAKIAlpZiAodW5saWtlbHkoIXRhc2spKQogCQlnb3RvIGVycl9jbGVhcjsKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvc3RhY2ttYXAuYyBiL2tlcm5lbC9icGYvc3RhY2ttYXAuYwppbmRleCBiZjQ0OTVmLi43MzJhZTE2IDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL3N0YWNrbWFwLmMKKysrIGIva2VybmVsL2JwZi9zdGFja21hcC5jCkBAIC0xMTYsMTAgKzExNiw5IEBACiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIAotdTY0IGJwZl9nZXRfc3RhY2tpZCh1NjQgcjEsIHU2NCByMiwgdTY0IGZsYWdzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzMoYnBmX2dldF9zdGFja2lkLCBzdHJ1Y3QgcHRfcmVncyAqLCByZWdzLCBzdHJ1Y3QgYnBmX21hcCAqLCBtYXAsCisJICAgdTY0LCBmbGFncykKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAobG9uZykgcjE7Ci0Jc3RydWN0IGJwZl9tYXAgKm1hcCA9IChzdHJ1Y3QgYnBmX21hcCAqKSAobG9uZykgcjI7CiAJc3RydWN0IGJwZl9zdGFja19tYXAgKnNtYXAgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX3N0YWNrX21hcCwgbWFwKTsKIAlzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKnRyYWNlOwogCXN0cnVjdCBzdGFja19tYXBfYnVja2V0ICpidWNrZXQsICpuZXdfYnVja2V0LCAqb2xkX2J1Y2tldDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuYwppbmRleCBmNzJmMjNiLi45OWE3ZTViIDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKKysrIGIva2VybmVsL2JwZi92ZXJpZmllci5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYnBmLmg+CisjaW5jbHVkZSA8bGludXgvYnBmX3ZlcmlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CiAjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CkBAIC0xMjYsNzUgKzEyNywxNiBAQAogICogYXJlIHNldCB0byBOT1RfSU5JVCB0byBpbmRpY2F0ZSB0aGF0IHRoZXkgYXJlIG5vIGxvbmdlciByZWFkYWJsZS4KICAqLwogCi1zdHJ1Y3QgcmVnX3N0YXRlIHsKLQllbnVtIGJwZl9yZWdfdHlwZSB0eXBlOwotCXVuaW9uIHsKLQkJLyogdmFsaWQgd2hlbiB0eXBlID09IENPTlNUX0lNTSB8IFBUUl9UT19TVEFDSyB8IFVOS05PV05fVkFMVUUgKi8KLQkJczY0IGltbTsKLQotCQkvKiB2YWxpZCB3aGVuIHR5cGUgPT0gUFRSX1RPX1BBQ0tFVCogKi8KLQkJc3RydWN0IHsKLQkJCXUzMiBpZDsKLQkJCXUxNiBvZmY7Ci0JCQl1MTYgcmFuZ2U7Ci0JCX07Ci0KLQkJLyogdmFsaWQgd2hlbiB0eXBlID09IENPTlNUX1BUUl9UT19NQVAgfCBQVFJfVE9fTUFQX1ZBTFVFIHwKLQkJICogICBQVFJfVE9fTUFQX1ZBTFVFX09SX05VTEwKLQkJICovCi0JCXN0cnVjdCBicGZfbWFwICptYXBfcHRyOwotCX07Ci19OwotCi1lbnVtIGJwZl9zdGFja19zbG90X3R5cGUgewotCVNUQUNLX0lOVkFMSUQsICAgIC8qIG5vdGhpbmcgd2FzIHN0b3JlZCBpbiB0aGlzIHN0YWNrIHNsb3QgKi8KLQlTVEFDS19TUElMTCwgICAgICAvKiByZWdpc3RlciBzcGlsbGVkIGludG8gc3RhY2sgKi8KLQlTVEFDS19NSVNDCSAgLyogQlBGIHByb2dyYW0gd3JvdGUgc29tZSBkYXRhIGludG8gdGhpcyBzbG90ICovCi19OwotCi0jZGVmaW5lIEJQRl9SRUdfU0laRSA4CS8qIHNpemUgb2YgZUJQRiByZWdpc3RlciBpbiBieXRlcyAqLwotCi0vKiBzdGF0ZSBvZiB0aGUgcHJvZ3JhbToKLSAqIHR5cGUgb2YgYWxsIHJlZ2lzdGVycyBhbmQgc3RhY2sgaW5mbwotICovCi1zdHJ1Y3QgdmVyaWZpZXJfc3RhdGUgewotCXN0cnVjdCByZWdfc3RhdGUgcmVnc1tNQVhfQlBGX1JFR107Ci0JdTggc3RhY2tfc2xvdF90eXBlW01BWF9CUEZfU1RBQ0tdOwotCXN0cnVjdCByZWdfc3RhdGUgc3BpbGxlZF9yZWdzW01BWF9CUEZfU1RBQ0sgLyBCUEZfUkVHX1NJWkVdOwotfTsKLQotLyogbGlua2VkIGxpc3Qgb2YgdmVyaWZpZXIgc3RhdGVzIHVzZWQgdG8gcHJ1bmUgc2VhcmNoICovCi1zdHJ1Y3QgdmVyaWZpZXJfc3RhdGVfbGlzdCB7Ci0Jc3RydWN0IHZlcmlmaWVyX3N0YXRlIHN0YXRlOwotCXN0cnVjdCB2ZXJpZmllcl9zdGF0ZV9saXN0ICpuZXh0OwotfTsKLQogLyogdmVyaWZpZXJfc3RhdGUgKyBpbnNuX2lkeCBhcmUgcHVzaGVkIHRvIHN0YWNrIHdoZW4gYnJhbmNoIGlzIGVuY291bnRlcmVkICovCi1zdHJ1Y3QgdmVyaWZpZXJfc3RhY2tfZWxlbSB7CitzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YWNrX2VsZW0gewogCS8qIHZlcmlmZXIgc3RhdGUgaXMgJ3N0JwogCSAqIGJlZm9yZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uICdpbnNuX2lkeCcKIAkgKiBhbmQgYWZ0ZXIgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAncHJldl9pbnNuX2lkeCcKIAkgKi8KLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhdGUgc3Q7CisJc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSBzdDsKIAlpbnQgaW5zbl9pZHg7CiAJaW50IHByZXZfaW5zbl9pZHg7Ci0Jc3RydWN0IHZlcmlmaWVyX3N0YWNrX2VsZW0gKm5leHQ7Ci19OwotCi0jZGVmaW5lIE1BWF9VU0VEX01BUFMgNjQgLyogbWF4IG51bWJlciBvZiBtYXBzIGFjY2Vzc2VkIGJ5IG9uZSBlQlBGIHByb2dyYW0gKi8KLQotLyogc2luZ2xlIGNvbnRhaW5lciBmb3IgYWxsIHN0cnVjdHMKLSAqIG9uZSB2ZXJpZmllcl9lbnYgcGVyIGJwZl9jaGVjaygpIGNhbGwKLSAqLwotc3RydWN0IHZlcmlmaWVyX2VudiB7Ci0Jc3RydWN0IGJwZl9wcm9nICpwcm9nOwkJLyogZUJQRiBwcm9ncmFtIGJlaW5nIHZlcmlmaWVkICovCi0Jc3RydWN0IHZlcmlmaWVyX3N0YWNrX2VsZW0gKmhlYWQ7IC8qIHN0YWNrIG9mIHZlcmlmaWVyIHN0YXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KLQlpbnQgc3RhY2tfc2l6ZTsJCQkvKiBudW1iZXIgb2Ygc3RhdGVzIHRvIGJlIHByb2Nlc3NlZCAqLwotCXN0cnVjdCB2ZXJpZmllcl9zdGF0ZSBjdXJfc3RhdGU7IC8qIGN1cnJlbnQgdmVyaWZpZXIgc3RhdGUgKi8KLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhdGVfbGlzdCAqKmV4cGxvcmVkX3N0YXRlczsgLyogc2VhcmNoIHBydW5pbmcgb3B0aW1pemF0aW9uICovCi0Jc3RydWN0IGJwZl9tYXAgKnVzZWRfbWFwc1tNQVhfVVNFRF9NQVBTXTsgLyogYXJyYXkgb2YgbWFwJ3MgdXNlZCBieSBlQlBGIHByb2dyYW0gKi8KLQl1MzIgdXNlZF9tYXBfY250OwkJLyogbnVtYmVyIG9mIHVzZWQgbWFwcyAqLwotCWJvb2wgYWxsb3dfcHRyX2xlYWtzOworCXN0cnVjdCBicGZfdmVyaWZpZXJfc3RhY2tfZWxlbSAqbmV4dDsKIH07CiAKICNkZWZpbmUgQlBGX0NPTVBMRVhJVFlfTElNSVRfSU5TTlMJNjU1MzYKQEAgLTIwMyw2ICsxNDUsNyBAQAogc3RydWN0IGJwZl9jYWxsX2FyZ19tZXRhIHsKIAlzdHJ1Y3QgYnBmX21hcCAqbWFwX3B0cjsKIAlib29sIHJhd19tb2RlOworCWJvb2wgcGt0X2FjY2VzczsKIAlpbnQgcmVnbm87CiAJaW50IGFjY2Vzc19zaXplOwogfTsKQEAgLTIzOSw2ICsxODIsNyBAQAogCVtDT05TVF9QVFJfVE9fTUFQXQk9ICJtYXBfcHRyIiwKIAlbUFRSX1RPX01BUF9WQUxVRV0JPSAibWFwX3ZhbHVlIiwKIAlbUFRSX1RPX01BUF9WQUxVRV9PUl9OVUxMXSA9ICJtYXBfdmFsdWVfb3JfbnVsbCIsCisJW1BUUl9UT19NQVBfVkFMVUVfQURKXQk9ICJtYXBfdmFsdWVfYWRqIiwKIAlbRlJBTUVfUFRSXQkJPSAiZnAiLAogCVtQVFJfVE9fU1RBQ0tdCQk9ICJmcCIsCiAJW0NPTlNUX0lNTV0JCT0gImltbSIsCkBAIC0yNDYsOSArMTkwLDkgQEAKIAlbUFRSX1RPX1BBQ0tFVF9FTkRdCT0gInBrdF9lbmQiLAogfTsKIAotc3RhdGljIHZvaWQgcHJpbnRfdmVyaWZpZXJfc3RhdGUoc3RydWN0IHZlcmlmaWVyX3N0YXRlICpzdGF0ZSkKK3N0YXRpYyB2b2lkIHByaW50X3ZlcmlmaWVyX3N0YXRlKHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnN0YXRlKQogewotCXN0cnVjdCByZWdfc3RhdGUgKnJlZzsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnOwogCWVudW0gYnBmX3JlZ190eXBlIHQ7CiAJaW50IGk7CiAKQEAgLTI2NiwxMCArMjEwLDE3IEBACiAJCWVsc2UgaWYgKHQgPT0gVU5LTk9XTl9WQUxVRSAmJiByZWctPmltbSkKIAkJCXZlcmJvc2UoIiVsbGQiLCByZWctPmltbSk7CiAJCWVsc2UgaWYgKHQgPT0gQ09OU1RfUFRSX1RPX01BUCB8fCB0ID09IFBUUl9UT19NQVBfVkFMVUUgfHwKLQkJCSB0ID09IFBUUl9UT19NQVBfVkFMVUVfT1JfTlVMTCkKKwkJCSB0ID09IFBUUl9UT19NQVBfVkFMVUVfT1JfTlVMTCB8fAorCQkJIHQgPT0gUFRSX1RPX01BUF9WQUxVRV9BREopCiAJCQl2ZXJib3NlKCIoa3M9JWQsdnM9JWQpIiwKIAkJCQlyZWctPm1hcF9wdHItPmtleV9zaXplLAogCQkJCXJlZy0+bWFwX3B0ci0+dmFsdWVfc2l6ZSk7CisJCWlmIChyZWctPm1pbl92YWx1ZSAhPSBCUEZfUkVHSVNURVJfTUlOX1JBTkdFKQorCQkJdmVyYm9zZSgiLG1pbl92YWx1ZT0lbGx1IiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlZy0+bWluX3ZhbHVlKTsKKwkJaWYgKHJlZy0+bWF4X3ZhbHVlICE9IEJQRl9SRUdJU1RFUl9NQVhfUkFOR0UpCisJCQl2ZXJib3NlKCIsbWF4X3ZhbHVlPSVsbHUiLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVnLT5tYXhfdmFsdWUpOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0JQRl9TVEFDSzsgaSArPSBCUEZfUkVHX1NJWkUpIHsKIAkJaWYgKHN0YXRlLT5zdGFja19zbG90X3R5cGVbaV0gPT0gU1RBQ0tfU1BJTEwpCkBAIC00MjQsOSArMzc1LDkgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgcG9wX3N0YWNrKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgaW50ICpwcmV2X2luc25faWR4KQorc3RhdGljIGludCBwb3Bfc3RhY2soc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50ICpwcmV2X2luc25faWR4KQogewotCXN0cnVjdCB2ZXJpZmllcl9zdGFja19lbGVtICplbGVtOworCXN0cnVjdCBicGZfdmVyaWZpZXJfc3RhY2tfZWxlbSAqZWxlbTsKIAlpbnQgaW5zbl9pZHg7CiAKIAlpZiAoZW52LT5oZWFkID09IE5VTEwpCkBAIC00NDMsMTIgKzM5NCwxMiBAQAogCXJldHVybiBpbnNuX2lkeDsKIH0KIAotc3RhdGljIHN0cnVjdCB2ZXJpZmllcl9zdGF0ZSAqcHVzaF9zdGFjayhzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYsIGludCBpbnNuX2lkeCwKLQkJCQkJIGludCBwcmV2X2luc25faWR4KQorc3RhdGljIHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnB1c2hfc3RhY2soc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKKwkJCQkJICAgICBpbnQgaW5zbl9pZHgsIGludCBwcmV2X2luc25faWR4KQogewotCXN0cnVjdCB2ZXJpZmllcl9zdGFja19lbGVtICplbGVtOworCXN0cnVjdCBicGZfdmVyaWZpZXJfc3RhY2tfZWxlbSAqZWxlbTsKIAotCWVsZW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmVyaWZpZXJfc3RhY2tfZWxlbSksIEdGUF9LRVJORUwpOworCWVsZW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YWNrX2VsZW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWVsZW0pCiAJCWdvdG8gZXJyOwogCkBAIC00NzQsMTMgKzQyNSwxNSBAQAogCUJQRl9SRUdfMCwgQlBGX1JFR18xLCBCUEZfUkVHXzIsIEJQRl9SRUdfMywgQlBGX1JFR180LCBCUEZfUkVHXzUKIH07CiAKLXN0YXRpYyB2b2lkIGluaXRfcmVnX3N0YXRlKHN0cnVjdCByZWdfc3RhdGUgKnJlZ3MpCitzdGF0aWMgdm9pZCBpbml0X3JlZ19zdGF0ZShzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVncykKIHsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfQlBGX1JFRzsgaSsrKSB7CiAJCXJlZ3NbaV0udHlwZSA9IE5PVF9JTklUOwogCQlyZWdzW2ldLmltbSA9IDA7CisJCXJlZ3NbaV0ubWluX3ZhbHVlID0gQlBGX1JFR0lTVEVSX01JTl9SQU5HRTsKKwkJcmVnc1tpXS5tYXhfdmFsdWUgPSBCUEZfUkVHSVNURVJfTUFYX1JBTkdFOwogCX0KIAogCS8qIGZyYW1lIHBvaW50ZXIgKi8KQEAgLTQ5MCwyMCArNDQzLDI2IEBACiAJcmVnc1tCUEZfUkVHXzFdLnR5cGUgPSBQVFJfVE9fQ1RYOwogfQogCi1zdGF0aWMgdm9pZCBtYXJrX3JlZ191bmtub3duX3ZhbHVlKHN0cnVjdCByZWdfc3RhdGUgKnJlZ3MsIHUzMiByZWdubykKK3N0YXRpYyB2b2lkIG1hcmtfcmVnX3Vua25vd25fdmFsdWUoc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MsIHUzMiByZWdubykKIHsKIAlCVUdfT04ocmVnbm8gPj0gTUFYX0JQRl9SRUcpOwogCXJlZ3NbcmVnbm9dLnR5cGUgPSBVTktOT1dOX1ZBTFVFOwogCXJlZ3NbcmVnbm9dLmltbSA9IDA7CiB9CiAKK3N0YXRpYyB2b2lkIHJlc2V0X3JlZ19yYW5nZV92YWx1ZXMoc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MsIHUzMiByZWdubykKK3sKKwlyZWdzW3JlZ25vXS5taW5fdmFsdWUgPSBCUEZfUkVHSVNURVJfTUlOX1JBTkdFOworCXJlZ3NbcmVnbm9dLm1heF92YWx1ZSA9IEJQRl9SRUdJU1RFUl9NQVhfUkFOR0U7Cit9CisKIGVudW0gcmVnX2FyZ190eXBlIHsKIAlTUkNfT1AsCQkvKiByZWdpc3RlciBpcyB1c2VkIGFzIHNvdXJjZSBvcGVyYW5kICovCiAJRFNUX09QLAkJLyogcmVnaXN0ZXIgaXMgdXNlZCBhcyBkZXN0aW5hdGlvbiBvcGVyYW5kICovCiAJRFNUX09QX05PX01BUksJLyogc2FtZSBhcyBhYm92ZSwgY2hlY2sgb25seSwgZG9uJ3QgbWFyayAqLwogfTsKIAotc3RhdGljIGludCBjaGVja19yZWdfYXJnKHN0cnVjdCByZWdfc3RhdGUgKnJlZ3MsIHUzMiByZWdubywKK3N0YXRpYyBpbnQgY2hlY2tfcmVnX2FyZyhzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVncywgdTMyIHJlZ25vLAogCQkJIGVudW0gcmVnX2FyZ190eXBlIHQpCiB7CiAJaWYgKHJlZ25vID49IE1BWF9CUEZfUkVHKSB7CkBAIC01NjMsOCArNTIyLDggQEAKIC8qIGNoZWNrX3N0YWNrX3JlYWQvd3JpdGUgZnVuY3Rpb25zIHRyYWNrIHNwaWxsL2ZpbGwgb2YgcmVnaXN0ZXJzLAogICogc3RhY2sgYm91bmRhcnkgYW5kIGFsaWdubWVudCBhcmUgY2hlY2tlZCBpbiBjaGVja19tZW1fYWNjZXNzKCkKICAqLwotc3RhdGljIGludCBjaGVja19zdGFja193cml0ZShzdHJ1Y3QgdmVyaWZpZXJfc3RhdGUgKnN0YXRlLCBpbnQgb2ZmLCBpbnQgc2l6ZSwKLQkJCSAgICAgaW50IHZhbHVlX3JlZ25vKQorc3RhdGljIGludCBjaGVja19zdGFja193cml0ZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlICpzdGF0ZSwgaW50IG9mZiwKKwkJCSAgICAgaW50IHNpemUsIGludCB2YWx1ZV9yZWdubykKIHsKIAlpbnQgaTsKIAkvKiBjYWxsZXIgY2hlY2tlZCB0aGF0IG9mZiAlIHNpemUgPT0gMCBhbmQgLU1BWF9CUEZfU1RBQ0sgPD0gb2ZmIDwgMCwKQEAgLTU4OSw3ICs1NDgsNyBAQAogCX0gZWxzZSB7CiAJCS8qIHJlZ3VsYXIgd3JpdGUgb2YgZGF0YSBpbnRvIHN0YWNrICovCiAJCXN0YXRlLT5zcGlsbGVkX3JlZ3NbKE1BWF9CUEZfU1RBQ0sgKyBvZmYpIC8gQlBGX1JFR19TSVpFXSA9Ci0JCQkoc3RydWN0IHJlZ19zdGF0ZSkge307CisJCQkoc3RydWN0IGJwZl9yZWdfc3RhdGUpIHt9OwogCiAJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCiAJCQlzdGF0ZS0+c3RhY2tfc2xvdF90eXBlW01BWF9CUEZfU1RBQ0sgKyBvZmYgKyBpXSA9IFNUQUNLX01JU0M7CkBAIC01OTcsNyArNTU2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjaGVja19zdGFja19yZWFkKHN0cnVjdCB2ZXJpZmllcl9zdGF0ZSAqc3RhdGUsIGludCBvZmYsIGludCBzaXplLAorc3RhdGljIGludCBjaGVja19zdGFja19yZWFkKHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnN0YXRlLCBpbnQgb2ZmLCBpbnQgc2l6ZSwKIAkJCSAgICBpbnQgdmFsdWVfcmVnbm8pCiB7CiAJdTggKnNsb3RfdHlwZTsKQEAgLTYzOCw3ICs1OTcsNyBAQAogfQogCiAvKiBjaGVjayByZWFkL3dyaXRlIGludG8gbWFwIGVsZW1lbnQgcmV0dXJuZWQgYnkgYnBmX21hcF9sb29rdXBfZWxlbSgpICovCi1zdGF0aWMgaW50IGNoZWNrX21hcF9hY2Nlc3Moc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCB1MzIgcmVnbm8sIGludCBvZmYsCitzdGF0aWMgaW50IGNoZWNrX21hcF9hY2Nlc3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIHJlZ25vLCBpbnQgb2ZmLAogCQkJICAgIGludCBzaXplKQogewogCXN0cnVjdCBicGZfbWFwICptYXAgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzW3JlZ25vXS5tYXBfcHRyOwpAQCAtNjUzLDI0ICs2MTIsMzEgQEAKIAogI2RlZmluZSBNQVhfUEFDS0VUX09GRiAweGZmZmYKIAotc3RhdGljIGJvb2wgbWF5X3dyaXRlX3BrdF9kYXRhKGVudW0gYnBmX3Byb2dfdHlwZSB0eXBlKQorc3RhdGljIGJvb2wgbWF5X2FjY2Vzc19kaXJlY3RfcGt0X2RhdGEoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGJwZl9jYWxsX2FyZ19tZXRhICptZXRhKQogewotCXN3aXRjaCAodHlwZSkgeworCXN3aXRjaCAoZW52LT5wcm9nLT50eXBlKSB7CisJY2FzZSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUzoKKwljYXNlIEJQRl9QUk9HX1RZUEVfU0NIRURfQUNUOgogCWNhc2UgQlBGX1BST0dfVFlQRV9YRFA6CisJCWlmIChtZXRhKQorCQkJcmV0dXJuIG1ldGEtPnBrdF9hY2Nlc3M7CisKKwkJZW52LT5zZWVuX2RpcmVjdF93cml0ZSA9IHRydWU7CiAJCXJldHVybiB0cnVlOwogCWRlZmF1bHQ6CiAJCXJldHVybiBmYWxzZTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfcGFja2V0X2FjY2VzcyhzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYsIHUzMiByZWdubywgaW50IG9mZiwKK3N0YXRpYyBpbnQgY2hlY2tfcGFja2V0X2FjY2VzcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgcmVnbm8sIGludCBvZmYsCiAJCQkgICAgICAgaW50IHNpemUpCiB7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVncyA9IGVudi0+Y3VyX3N0YXRlLnJlZ3M7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVnID0gJnJlZ3NbcmVnbm9dOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gZW52LT5jdXJfc3RhdGUucmVnczsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnID0gJnJlZ3NbcmVnbm9dOwogCiAJb2ZmICs9IHJlZy0+b2ZmOwotCWlmIChvZmYgPCAwIHx8IG9mZiArIHNpemUgPiByZWctPnJhbmdlKSB7CisJaWYgKG9mZiA8IDAgfHwgc2l6ZSA8PSAwIHx8IG9mZiArIHNpemUgPiByZWctPnJhbmdlKSB7CiAJCXZlcmJvc2UoImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCwgb2ZmPSVkIHNpemU9JWQsIFIlZChpZD0lZCxvZmY9JWQscj0lZClcbiIsCiAJCQlvZmYsIHNpemUsIHJlZ25vLCByZWctPmlkLCByZWctPm9mZiwgcmVnLT5yYW5nZSk7CiAJCXJldHVybiAtRUFDQ0VTOwpAQCAtNjc5LDkgKzY0NSwxMyBAQAogfQogCiAvKiBjaGVjayBhY2Nlc3MgdG8gJ3N0cnVjdCBicGZfY29udGV4dCcgZmllbGRzICovCi1zdGF0aWMgaW50IGNoZWNrX2N0eF9hY2Nlc3Moc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBpbnQgb2ZmLCBpbnQgc2l6ZSwKK3N0YXRpYyBpbnQgY2hlY2tfY3R4X2FjY2VzcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgb2ZmLCBpbnQgc2l6ZSwKIAkJCSAgICBlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0LCBlbnVtIGJwZl9yZWdfdHlwZSAqcmVnX3R5cGUpCiB7CisJLyogZm9yIGFuYWx5emVyIGN0eCBhY2Nlc3NlcyBhcmUgYWxyZWFkeSB2YWxpZGF0ZWQgYW5kIGNvbnZlcnRlZCAqLworCWlmIChlbnYtPmFuYWx5emVyX29wcykKKwkJcmV0dXJuIDA7CisKIAlpZiAoZW52LT5wcm9nLT5hdXgtPm9wcy0+aXNfdmFsaWRfYWNjZXNzICYmCiAJICAgIGVudi0+cHJvZy0+YXV4LT5vcHMtPmlzX3ZhbGlkX2FjY2VzcyhvZmYsIHNpemUsIHQsIHJlZ190eXBlKSkgewogCQkvKiByZW1lbWJlciB0aGUgb2Zmc2V0IG9mIGxhc3QgYnl0ZSBhY2Nlc3NlZCBpbiBjdHggKi8KQEAgLTY5NCw3ICs2NjQsNyBAQAogCXJldHVybiAtRUFDQ0VTOwogfQogCi1zdGF0aWMgYm9vbCBpc19wb2ludGVyX3ZhbHVlKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgaW50IHJlZ25vKQorc3RhdGljIGJvb2wgaXNfcG9pbnRlcl92YWx1ZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgcmVnbm8pCiB7CiAJaWYgKGVudi0+YWxsb3dfcHRyX2xlYWtzKQogCQlyZXR1cm4gZmFsc2U7CkBAIC03MDgsMjggKzY3OCwxOSBAQAogCX0KIH0KIAotc3RhdGljIGludCBjaGVja19wdHJfYWxpZ25tZW50KHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IHJlZ19zdGF0ZSAqcmVnLAotCQkJICAgICAgIGludCBvZmYsIGludCBzaXplKQorc3RhdGljIGludCBjaGVja19wdHJfYWxpZ25tZW50KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsCisJCQkgICAgICAgc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZywgaW50IG9mZiwgaW50IHNpemUpCiB7Ci0JaWYgKHJlZy0+dHlwZSAhPSBQVFJfVE9fUEFDS0VUKSB7CisJaWYgKHJlZy0+dHlwZSAhPSBQVFJfVE9fUEFDS0VUICYmIHJlZy0+dHlwZSAhPSBQVFJfVE9fTUFQX1ZBTFVFX0FESikgewogCQlpZiAob2ZmICUgc2l6ZSAhPSAwKSB7Ci0JCQl2ZXJib3NlKCJtaXNhbGlnbmVkIGFjY2VzcyBvZmYgJWQgc2l6ZSAlZFxuIiwgb2ZmLCBzaXplKTsKKwkJCXZlcmJvc2UoIm1pc2FsaWduZWQgYWNjZXNzIG9mZiAlZCBzaXplICVkXG4iLAorCQkJCW9mZiwgc2l6ZSk7CiAJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJfSBlbHNlIHsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCi0Jc3dpdGNoIChlbnYtPnByb2ctPnR5cGUpIHsKLQljYXNlIEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTOgotCWNhc2UgQlBGX1BST0dfVFlQRV9TQ0hFRF9BQ1Q6Ci0JY2FzZSBCUEZfUFJPR19UWVBFX1hEUDoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJdmVyYm9zZSgidmVyaWZpZXIgaXMgbWlzY29uZmlndXJlZFxuIik7Ci0JCXJldHVybiAtRUFDQ0VTOwotCX0KLQogCWlmIChJU19FTkFCTEVEKENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTKSkKIAkJLyogbWlzYWxpZ25lZCBhY2Nlc3MgdG8gcGFja2V0IGlzIG9rIG9uIHg4Nixhcm0sYXJtNjQgKi8KIAkJcmV0dXJuIDA7CkBAIC03NDAsNyArNzAxLDggQEAKIAl9CiAKIAkvKiBza2ItPmRhdGEgaXMgTkVUX0lQX0FMSUdOLWVkICovCi0JaWYgKChORVRfSVBfQUxJR04gKyByZWctPm9mZiArIG9mZikgJSBzaXplICE9IDApIHsKKwlpZiAocmVnLT50eXBlID09IFBUUl9UT19QQUNLRVQgJiYKKwkgICAgKE5FVF9JUF9BTElHTiArIHJlZy0+b2ZmICsgb2ZmKSAlIHNpemUgIT0gMCkgewogCQl2ZXJib3NlKCJtaXNhbGlnbmVkIHBhY2tldCBhY2Nlc3Mgb2ZmICVkKyVkKyVkIHNpemUgJWRcbiIsCiAJCQlORVRfSVBfQUxJR04sIHJlZy0+b2ZmLCBvZmYsIHNpemUpOwogCQlyZXR1cm4gLUVBQ0NFUzsKQEAgLTc1NCwxMiArNzE2LDEyIEBACiAgKiBpZiB0PT13cml0ZSAmJiB2YWx1ZV9yZWdubz09LTEsIHNvbWUgdW5rbm93biB2YWx1ZSBpcyBzdG9yZWQgaW50byBtZW1vcnkKICAqIGlmIHQ9PXJlYWQgJiYgdmFsdWVfcmVnbm89PS0xLCBkb24ndCBjYXJlIHdoYXQgd2UgcmVhZCBmcm9tIG1lbW9yeQogICovCi1zdGF0aWMgaW50IGNoZWNrX21lbV9hY2Nlc3Moc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCB1MzIgcmVnbm8sIGludCBvZmYsCitzdGF0aWMgaW50IGNoZWNrX21lbV9hY2Nlc3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIHJlZ25vLCBpbnQgb2ZmLAogCQkJICAgIGludCBicGZfc2l6ZSwgZW51bSBicGZfYWNjZXNzX3R5cGUgdCwKIAkJCSAgICBpbnQgdmFsdWVfcmVnbm8pCiB7Ci0Jc3RydWN0IHZlcmlmaWVyX3N0YXRlICpzdGF0ZSA9ICZlbnYtPmN1cl9zdGF0ZTsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWcgPSAmc3RhdGUtPnJlZ3NbcmVnbm9dOworCXN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnN0YXRlID0gJmVudi0+Y3VyX3N0YXRlOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcgPSAmc3RhdGUtPnJlZ3NbcmVnbm9dOwogCWludCBzaXplLCBlcnIgPSAwOwogCiAJaWYgKHJlZy0+dHlwZSA9PSBQVFJfVE9fU1RBQ0spCkBAIC03NzMsMTIgKzczNSw1MiBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlpZiAocmVnLT50eXBlID09IFBUUl9UT19NQVBfVkFMVUUpIHsKKwlpZiAocmVnLT50eXBlID09IFBUUl9UT19NQVBfVkFMVUUgfHwKKwkgICAgcmVnLT50eXBlID09IFBUUl9UT19NQVBfVkFMVUVfQURKKSB7CiAJCWlmICh0ID09IEJQRl9XUklURSAmJiB2YWx1ZV9yZWdubyA+PSAwICYmCiAJCSAgICBpc19wb2ludGVyX3ZhbHVlKGVudiwgdmFsdWVfcmVnbm8pKSB7CiAJCQl2ZXJib3NlKCJSJWQgbGVha3MgYWRkciBpbnRvIG1hcFxuIiwgdmFsdWVfcmVnbm8pOwogCQkJcmV0dXJuIC1FQUNDRVM7CiAJCX0KKworCQkvKiBJZiB3ZSBhZGp1c3RlZCB0aGUgcmVnaXN0ZXIgdG8gdGhpcyBtYXAgdmFsdWUgYXQgYWxsIHRoZW4gd2UKKwkJICogbmVlZCB0byBjaGFuZ2Ugb2ZmIGFuZCBzaXplIHRvIG1pbl92YWx1ZSBhbmQgbWF4X3ZhbHVlCisJCSAqIHJlc3BlY3RpdmVseSB0byBtYWtlIHN1cmUgb3VyIHRoZW9yZXRpY2FsIGFjY2VzcyB3aWxsIGJlCisJCSAqIHNhZmUuCisJCSAqLworCQlpZiAocmVnLT50eXBlID09IFBUUl9UT19NQVBfVkFMVUVfQURKKSB7CisJCQlpZiAobG9nX2xldmVsKQorCQkJCXByaW50X3ZlcmlmaWVyX3N0YXRlKHN0YXRlKTsKKwkJCWVudi0+dmFybGVuX21hcF92YWx1ZV9hY2Nlc3MgPSB0cnVlOworCQkJLyogVGhlIG1pbmltdW0gdmFsdWUgaXMgb25seSBpbXBvcnRhbnQgd2l0aCBzaWduZWQKKwkJCSAqIGNvbXBhcmlzb25zIHdoZXJlIHdlIGNhbid0IGFzc3VtZSB0aGUgZmxvb3Igb2YgYQorCQkJICogdmFsdWUgaXMgMC4gIElmIHdlIGFyZSB1c2luZyBzaWduZWQgdmFyaWFibGVzIGZvciBvdXIKKwkJCSAqIGluZGV4J2VzIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2hhdGV2ZXIgd2UgdXNlCisJCQkgKiB3aWxsIGhhdmUgYSBzZXQgZmxvb3Igd2l0aGluIG91ciByYW5nZS4KKwkJCSAqLworCQkJaWYgKChzNjQpcmVnLT5taW5fdmFsdWUgPCAwKSB7CisJCQkJdmVyYm9zZSgiUiVkIG1pbiB2YWx1ZSBpcyBuZWdhdGl2ZSwgZWl0aGVyIHVzZSB1bnNpZ25lZCBpbmRleCBvciBkbyBhIGlmIChpbmRleCA+PTApIGNoZWNrLlxuIiwKKwkJCQkJcmVnbm8pOworCQkJCXJldHVybiAtRUFDQ0VTOworCQkJfQorCQkJZXJyID0gY2hlY2tfbWFwX2FjY2VzcyhlbnYsIHJlZ25vLCByZWctPm1pbl92YWx1ZSArIG9mZiwKKwkJCQkJICAgICAgIHNpemUpOworCQkJaWYgKGVycikgeworCQkJCXZlcmJvc2UoIlIlZCBtaW4gdmFsdWUgaXMgb3V0c2lkZSBvZiB0aGUgYXJyYXkgcmFuZ2VcbiIsCisJCQkJCXJlZ25vKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCisJCQkvKiBJZiB3ZSBoYXZlbid0IHNldCBhIG1heCB2YWx1ZSB0aGVuIHdlIG5lZWQgdG8gYmFpbAorCQkJICogc2luY2Ugd2UgY2FuJ3QgYmUgc3VyZSB3ZSB3b24ndCBkbyBiYWQgdGhpbmdzLgorCQkJICovCisJCQlpZiAocmVnLT5tYXhfdmFsdWUgPT0gQlBGX1JFR0lTVEVSX01BWF9SQU5HRSkgeworCQkJCXZlcmJvc2UoIlIlZCB1bmJvdW5kZWQgbWVtb3J5IGFjY2VzcywgbWFrZSBzdXJlIHRvIGJvdW5kcyBjaGVjayBhbnkgYXJyYXkgYWNjZXNzIGludG8gYSBtYXBcbiIsCisJCQkJCXJlZ25vKTsKKwkJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCX0KKwkJCW9mZiArPSByZWctPm1heF92YWx1ZTsKKwkJfQogCQllcnIgPSBjaGVja19tYXBfYWNjZXNzKGVudiwgcmVnbm8sIG9mZiwgc2l6ZSk7CiAJCWlmICghZXJyICYmIHQgPT0gQlBGX1JFQUQgJiYgdmFsdWVfcmVnbm8gPj0gMCkKIAkJCW1hcmtfcmVnX3Vua25vd25fdmFsdWUoc3RhdGUtPnJlZ3MsIHZhbHVlX3JlZ25vKTsKQEAgLTc5NCw5ICs3OTYsOCBAQAogCQllcnIgPSBjaGVja19jdHhfYWNjZXNzKGVudiwgb2ZmLCBzaXplLCB0LCAmcmVnX3R5cGUpOwogCQlpZiAoIWVyciAmJiB0ID09IEJQRl9SRUFEICYmIHZhbHVlX3JlZ25vID49IDApIHsKIAkJCW1hcmtfcmVnX3Vua25vd25fdmFsdWUoc3RhdGUtPnJlZ3MsIHZhbHVlX3JlZ25vKTsKLQkJCWlmIChlbnYtPmFsbG93X3B0cl9sZWFrcykKLQkJCQkvKiBub3RlIHRoYXQgcmVnLltpZHxvZmZ8cmFuZ2VdID09IDAgKi8KLQkJCQlzdGF0ZS0+cmVnc1t2YWx1ZV9yZWdub10udHlwZSA9IHJlZ190eXBlOworCQkJLyogbm90ZSB0aGF0IHJlZy5baWR8b2ZmfHJhbmdlXSA9PSAwICovCisJCQlzdGF0ZS0+cmVnc1t2YWx1ZV9yZWdub10udHlwZSA9IHJlZ190eXBlOwogCQl9CiAKIAl9IGVsc2UgaWYgKHJlZy0+dHlwZSA9PSBGUkFNRV9QVFIgfHwgcmVnLT50eXBlID09IFBUUl9UT19TVEFDSykgewpAQCAtODE2LDcgKzgxNyw3IEBACiAJCQllcnIgPSBjaGVja19zdGFja19yZWFkKHN0YXRlLCBvZmYsIHNpemUsIHZhbHVlX3JlZ25vKTsKIAkJfQogCX0gZWxzZSBpZiAoc3RhdGUtPnJlZ3NbcmVnbm9dLnR5cGUgPT0gUFRSX1RPX1BBQ0tFVCkgewotCQlpZiAodCA9PSBCUEZfV1JJVEUgJiYgIW1heV93cml0ZV9wa3RfZGF0YShlbnYtPnByb2ctPnR5cGUpKSB7CisJCWlmICh0ID09IEJQRl9XUklURSAmJiAhbWF5X2FjY2Vzc19kaXJlY3RfcGt0X2RhdGEoZW52LCBOVUxMKSkgewogCQkJdmVyYm9zZSgiY2Fubm90IHdyaXRlIGludG8gcGFja2V0XG4iKTsKIAkJCXJldHVybiAtRUFDQ0VTOwogCQl9CkBAIC04NDUsOSArODQ2LDkgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGNoZWNrX3hhZGQoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCitzdGF0aWMgaW50IGNoZWNrX3hhZGQoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKQogewotCXN0cnVjdCByZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gZW52LT5jdXJfc3RhdGUucmVnczsKIAlpbnQgZXJyOwogCiAJaWYgKChCUEZfU0laRShpbnNuLT5jb2RlKSAhPSBCUEZfVyAmJiBCUEZfU0laRShpbnNuLT5jb2RlKSAhPSBCUEZfRFcpIHx8CkBAIC04ODEsMTIgKzg4MiwxMiBAQAogICogYnl0ZXMgZnJvbSB0aGF0IHBvaW50ZXIsIG1ha2Ugc3VyZSB0aGF0IGl0J3Mgd2l0aGluIHN0YWNrIGJvdW5kYXJ5CiAgKiBhbmQgYWxsIGVsZW1lbnRzIG9mIHN0YWNrIGFyZSBpbml0aWFsaXplZAogICovCi1zdGF0aWMgaW50IGNoZWNrX3N0YWNrX2JvdW5kYXJ5KHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgaW50IHJlZ25vLAorc3RhdGljIGludCBjaGVja19zdGFja19ib3VuZGFyeShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgcmVnbm8sCiAJCQkJaW50IGFjY2Vzc19zaXplLCBib29sIHplcm9fc2l6ZV9hbGxvd2VkLAogCQkJCXN0cnVjdCBicGZfY2FsbF9hcmdfbWV0YSAqbWV0YSkKIHsKLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhdGUgKnN0YXRlID0gJmVudi0+Y3VyX3N0YXRlOwotCXN0cnVjdCByZWdfc3RhdGUgKnJlZ3MgPSBzdGF0ZS0+cmVnczsKKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlICpzdGF0ZSA9ICZlbnYtPmN1cl9zdGF0ZTsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVncyA9IHN0YXRlLT5yZWdzOwogCWludCBvZmYsIGk7CiAKIAlpZiAocmVnc1tyZWdub10udHlwZSAhPSBQVFJfVE9fU1RBQ0spIHsKQEAgLTkyNSwxOCArOTI2LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfZnVuY19hcmcoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCB1MzIgcmVnbm8sCitzdGF0aWMgaW50IGNoZWNrX2Z1bmNfYXJnKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiByZWdubywKIAkJCSAgZW51bSBicGZfYXJnX3R5cGUgYXJnX3R5cGUsCiAJCQkgIHN0cnVjdCBicGZfY2FsbF9hcmdfbWV0YSAqbWV0YSkKIHsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWcgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzICsgcmVnbm87Ci0JZW51bSBicGZfcmVnX3R5cGUgZXhwZWN0ZWRfdHlwZTsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVncyA9IGVudi0+Y3VyX3N0YXRlLnJlZ3MsICpyZWcgPSAmcmVnc1tyZWdub107CisJZW51bSBicGZfcmVnX3R5cGUgZXhwZWN0ZWRfdHlwZSwgdHlwZSA9IHJlZy0+dHlwZTsKIAlpbnQgZXJyID0gMDsKIAogCWlmIChhcmdfdHlwZSA9PSBBUkdfRE9OVENBUkUpCiAJCXJldHVybiAwOwogCi0JaWYgKHJlZy0+dHlwZSA9PSBOT1RfSU5JVCkgeworCWlmICh0eXBlID09IE5PVF9JTklUKSB7CiAJCXZlcmJvc2UoIlIlZCAhcmVhZF9va1xuIiwgcmVnbm8pOwogCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CkBAIC05NDksMTYgKzk1MCwyOSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwlpZiAodHlwZSA9PSBQVFJfVE9fUEFDS0VUICYmICFtYXlfYWNjZXNzX2RpcmVjdF9wa3RfZGF0YShlbnYsIG1ldGEpKSB7CisJCXZlcmJvc2UoImhlbHBlciBhY2Nlc3MgdG8gdGhlIHBhY2tldCBpcyBub3QgYWxsb3dlZFxuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKwogCWlmIChhcmdfdHlwZSA9PSBBUkdfUFRSX1RPX01BUF9LRVkgfHwKIAkgICAgYXJnX3R5cGUgPT0gQVJHX1BUUl9UT19NQVBfVkFMVUUpIHsKIAkJZXhwZWN0ZWRfdHlwZSA9IFBUUl9UT19TVEFDSzsKKwkJaWYgKHR5cGUgIT0gUFRSX1RPX1BBQ0tFVCAmJiB0eXBlICE9IGV4cGVjdGVkX3R5cGUpCisJCQlnb3RvIGVycl90eXBlOwogCX0gZWxzZSBpZiAoYXJnX3R5cGUgPT0gQVJHX0NPTlNUX1NUQUNLX1NJWkUgfHwKIAkJICAgYXJnX3R5cGUgPT0gQVJHX0NPTlNUX1NUQUNLX1NJWkVfT1JfWkVSTykgewogCQlleHBlY3RlZF90eXBlID0gQ09OU1RfSU1NOworCQlpZiAodHlwZSAhPSBleHBlY3RlZF90eXBlKQorCQkJZ290byBlcnJfdHlwZTsKIAl9IGVsc2UgaWYgKGFyZ190eXBlID09IEFSR19DT05TVF9NQVBfUFRSKSB7CiAJCWV4cGVjdGVkX3R5cGUgPSBDT05TVF9QVFJfVE9fTUFQOworCQlpZiAodHlwZSAhPSBleHBlY3RlZF90eXBlKQorCQkJZ290byBlcnJfdHlwZTsKIAl9IGVsc2UgaWYgKGFyZ190eXBlID09IEFSR19QVFJfVE9fQ1RYKSB7CiAJCWV4cGVjdGVkX3R5cGUgPSBQVFJfVE9fQ1RYOworCQlpZiAodHlwZSAhPSBleHBlY3RlZF90eXBlKQorCQkJZ290byBlcnJfdHlwZTsKIAl9IGVsc2UgaWYgKGFyZ190eXBlID09IEFSR19QVFJfVE9fU1RBQ0sgfHwKIAkJICAgYXJnX3R5cGUgPT0gQVJHX1BUUl9UT19SQVdfU1RBQ0spIHsKIAkJZXhwZWN0ZWRfdHlwZSA9IFBUUl9UT19TVEFDSzsKQEAgLTk2NiwyMCArOTgwLDE2IEBACiAJCSAqIHBhc3NlZCBpbiBhcyBhcmd1bWVudCwgaXQncyBhIENPTlNUX0lNTSB0eXBlLiBGaW5hbCB0ZXN0CiAJCSAqIGhhcHBlbnMgZHVyaW5nIHN0YWNrIGJvdW5kYXJ5IGNoZWNraW5nLgogCQkgKi8KLQkJaWYgKHJlZy0+dHlwZSA9PSBDT05TVF9JTU0gJiYgcmVnLT5pbW0gPT0gMCkKLQkJCWV4cGVjdGVkX3R5cGUgPSBDT05TVF9JTU07CisJCWlmICh0eXBlID09IENPTlNUX0lNTSAmJiByZWctPmltbSA9PSAwKQorCQkJLyogZmluYWwgdGVzdCBpbiBjaGVja19zdGFja19ib3VuZGFyeSgpICovOworCQllbHNlIGlmICh0eXBlICE9IFBUUl9UT19QQUNLRVQgJiYgdHlwZSAhPSBleHBlY3RlZF90eXBlKQorCQkJZ290byBlcnJfdHlwZTsKIAkJbWV0YS0+cmF3X21vZGUgPSBhcmdfdHlwZSA9PSBBUkdfUFRSX1RPX1JBV19TVEFDSzsKIAl9IGVsc2UgewogCQl2ZXJib3NlKCJ1bnN1cHBvcnRlZCBhcmdfdHlwZSAlZFxuIiwgYXJnX3R5cGUpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlpZiAocmVnLT50eXBlICE9IGV4cGVjdGVkX3R5cGUpIHsKLQkJdmVyYm9zZSgiUiVkIHR5cGU9JXMgZXhwZWN0ZWQ9JXNcbiIsIHJlZ25vLAotCQkJcmVnX3R5cGVfc3RyW3JlZy0+dHlwZV0sIHJlZ190eXBlX3N0cltleHBlY3RlZF90eXBlXSk7Ci0JCXJldHVybiAtRUFDQ0VTOwotCX0KLQogCWlmIChhcmdfdHlwZSA9PSBBUkdfQ09OU1RfTUFQX1BUUikgewogCQkvKiBicGZfbWFwX3h4eChtYXBfcHRyKSBjYWxsOiByZW1lbWJlciB0aGF0IG1hcF9wdHIgKi8KIAkJbWV0YS0+bWFwX3B0ciA9IHJlZy0+bWFwX3B0cjsKQEAgLTk5Nyw4ICsxMDA3LDEzIEBACiAJCQl2ZXJib3NlKCJpbnZhbGlkIG1hcF9wdHIgdG8gYWNjZXNzIG1hcC0+a2V5XG4iKTsKIAkJCXJldHVybiAtRUFDQ0VTOwogCQl9Ci0JCWVyciA9IGNoZWNrX3N0YWNrX2JvdW5kYXJ5KGVudiwgcmVnbm8sIG1ldGEtPm1hcF9wdHItPmtleV9zaXplLAotCQkJCQkgICBmYWxzZSwgTlVMTCk7CisJCWlmICh0eXBlID09IFBUUl9UT19QQUNLRVQpCisJCQllcnIgPSBjaGVja19wYWNrZXRfYWNjZXNzKGVudiwgcmVnbm8sIDAsCisJCQkJCQkgIG1ldGEtPm1hcF9wdHItPmtleV9zaXplKTsKKwkJZWxzZQorCQkJZXJyID0gY2hlY2tfc3RhY2tfYm91bmRhcnkoZW52LCByZWdubywKKwkJCQkJCSAgIG1ldGEtPm1hcF9wdHItPmtleV9zaXplLAorCQkJCQkJICAgZmFsc2UsIE5VTEwpOwogCX0gZWxzZSBpZiAoYXJnX3R5cGUgPT0gQVJHX1BUUl9UT19NQVBfVkFMVUUpIHsKIAkJLyogYnBmX21hcF94eHgoLi4uLCBtYXBfcHRyLCAuLi4sIHZhbHVlKSBjYWxsOgogCQkgKiBjaGVjayBbdmFsdWUsIHZhbHVlICsgbWFwLT52YWx1ZV9zaXplKSB2YWxpZGl0eQpAQCAtMTAwOCw5ICsxMDIzLDEzIEBACiAJCQl2ZXJib3NlKCJpbnZhbGlkIG1hcF9wdHIgdG8gYWNjZXNzIG1hcC0+dmFsdWVcbiIpOwogCQkJcmV0dXJuIC1FQUNDRVM7CiAJCX0KLQkJZXJyID0gY2hlY2tfc3RhY2tfYm91bmRhcnkoZW52LCByZWdubywKLQkJCQkJICAgbWV0YS0+bWFwX3B0ci0+dmFsdWVfc2l6ZSwKLQkJCQkJICAgZmFsc2UsIE5VTEwpOworCQlpZiAodHlwZSA9PSBQVFJfVE9fUEFDS0VUKQorCQkJZXJyID0gY2hlY2tfcGFja2V0X2FjY2VzcyhlbnYsIHJlZ25vLCAwLAorCQkJCQkJICBtZXRhLT5tYXBfcHRyLT52YWx1ZV9zaXplKTsKKwkJZWxzZQorCQkJZXJyID0gY2hlY2tfc3RhY2tfYm91bmRhcnkoZW52LCByZWdubywKKwkJCQkJCSAgIG1ldGEtPm1hcF9wdHItPnZhbHVlX3NpemUsCisJCQkJCQkgICBmYWxzZSwgTlVMTCk7CiAJfSBlbHNlIGlmIChhcmdfdHlwZSA9PSBBUkdfQ09OU1RfU1RBQ0tfU0laRSB8fAogCQkgICBhcmdfdHlwZSA9PSBBUkdfQ09OU1RfU1RBQ0tfU0laRV9PUl9aRVJPKSB7CiAJCWJvb2wgemVyb19zaXplX2FsbG93ZWQgPSAoYXJnX3R5cGUgPT0gQVJHX0NPTlNUX1NUQUNLX1NJWkVfT1JfWkVSTyk7CkBAIC0xMDI0LDExICsxMDQzLDE4IEBACiAJCQl2ZXJib3NlKCJBUkdfQ09OU1RfU1RBQ0tfU0laRSBjYW5ub3QgYmUgZmlyc3QgYXJndW1lbnRcbiIpOwogCQkJcmV0dXJuIC1FQUNDRVM7CiAJCX0KLQkJZXJyID0gY2hlY2tfc3RhY2tfYm91bmRhcnkoZW52LCByZWdubyAtIDEsIHJlZy0+aW1tLAotCQkJCQkgICB6ZXJvX3NpemVfYWxsb3dlZCwgbWV0YSk7CisJCWlmIChyZWdzW3JlZ25vIC0gMV0udHlwZSA9PSBQVFJfVE9fUEFDS0VUKQorCQkJZXJyID0gY2hlY2tfcGFja2V0X2FjY2VzcyhlbnYsIHJlZ25vIC0gMSwgMCwgcmVnLT5pbW0pOworCQllbHNlCisJCQllcnIgPSBjaGVja19zdGFja19ib3VuZGFyeShlbnYsIHJlZ25vIC0gMSwgcmVnLT5pbW0sCisJCQkJCQkgICB6ZXJvX3NpemVfYWxsb3dlZCwgbWV0YSk7CiAJfQogCiAJcmV0dXJuIGVycjsKK2Vycl90eXBlOgorCXZlcmJvc2UoIlIlZCB0eXBlPSVzIGV4cGVjdGVkPSVzXG4iLCByZWdubywKKwkJcmVnX3R5cGVfc3RyW3R5cGVdLCByZWdfdHlwZV9zdHJbZXhwZWN0ZWRfdHlwZV0pOworCXJldHVybiAtRUFDQ0VTOwogfQogCiBzdGF0aWMgaW50IGNoZWNrX21hcF9mdW5jX2NvbXBhdGliaWxpdHkoc3RydWN0IGJwZl9tYXAgKm1hcCwgaW50IGZ1bmNfaWQpCkBAIC0xMDUyLDcgKzEwNzgsOCBAQAogCQkJZ290byBlcnJvcjsKIAkJYnJlYWs7CiAJY2FzZSBCUEZfTUFQX1RZUEVfQ0dST1VQX0FSUkFZOgotCQlpZiAoZnVuY19pZCAhPSBCUEZfRlVOQ19za2JfaW5fY2dyb3VwKQorCQlpZiAoZnVuY19pZCAhPSBCUEZfRlVOQ19za2JfdW5kZXJfY2dyb3VwICYmCisJCSAgICBmdW5jX2lkICE9IEJQRl9GVU5DX2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXApCiAJCQlnb3RvIGVycm9yOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMTA3NCw3ICsxMTAxLDggQEAKIAkJaWYgKG1hcC0+bWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX1NUQUNLX1RSQUNFKQogCQkJZ290byBlcnJvcjsKIAkJYnJlYWs7Ci0JY2FzZSBCUEZfRlVOQ19za2JfaW5fY2dyb3VwOgorCWNhc2UgQlBGX0ZVTkNfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cDoKKwljYXNlIEJQRl9GVU5DX3NrYl91bmRlcl9jZ3JvdXA6CiAJCWlmIChtYXAtPm1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9DR1JPVVBfQVJSQVkpCiAJCQlnb3RvIGVycm9yOwogCQlicmVhazsKQEAgLTExMDcsMTAgKzExMzUsMTAgQEAKIAlyZXR1cm4gY291bnQgPiAxID8gLUVJTlZBTCA6IDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNsZWFyX2FsbF9wa3RfcG9pbnRlcnMoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52KQorc3RhdGljIHZvaWQgY2xlYXJfYWxsX3BrdF9wb2ludGVycyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQogewotCXN0cnVjdCB2ZXJpZmllcl9zdGF0ZSAqc3RhdGUgPSAmZW52LT5jdXJfc3RhdGU7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVncyA9IHN0YXRlLT5yZWdzLCAqcmVnOworCXN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnN0YXRlID0gJmVudi0+Y3VyX3N0YXRlOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gc3RhdGUtPnJlZ3MsICpyZWc7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0JQRl9SRUc7IGkrKykKQEAgLTExMzAsMTIgKzExNTgsMTIgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfY2FsbChzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYsIGludCBmdW5jX2lkKQorc3RhdGljIGludCBjaGVja19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBmdW5jX2lkKQogewotCXN0cnVjdCB2ZXJpZmllcl9zdGF0ZSAqc3RhdGUgPSAmZW52LT5jdXJfc3RhdGU7CisJc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSAqc3RhdGUgPSAmZW52LT5jdXJfc3RhdGU7CiAJY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvICpmbiA9IE5VTEw7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVncyA9IHN0YXRlLT5yZWdzOwotCXN0cnVjdCByZWdfc3RhdGUgKnJlZzsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVncyA9IHN0YXRlLT5yZWdzOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWc7CiAJc3RydWN0IGJwZl9jYWxsX2FyZ19tZXRhIG1ldGE7CiAJYm9vbCBjaGFuZ2VzX2RhdGE7CiAJaW50IGksIGVycjsKQEAgLTExNjMsNiArMTE5MSw3IEBACiAJY2hhbmdlc19kYXRhID0gYnBmX2hlbHBlcl9jaGFuZ2VzX3NrYl9kYXRhKGZuLT5mdW5jKTsKIAogCW1lbXNldCgmbWV0YSwgMCwgc2l6ZW9mKG1ldGEpKTsKKwltZXRhLnBrdF9hY2Nlc3MgPSBmbi0+cGt0X2FjY2VzczsKIAogCS8qIFdlIG9ubHkgc3VwcG9ydCBvbmUgYXJnIGJlaW5nIGluIHJhdyBtb2RlIGF0IHRoZSBtb21lbnQsIHdoaWNoCiAJICogaXMgc3VmZmljaWVudCBmb3IgdGhlIGhlbHBlciBmdW5jdGlvbnMgd2UgaGF2ZSByaWdodCBub3cuCkBAIC0xMjEzLDYgKzEyNDIsNyBAQAogCQlyZWdzW0JQRl9SRUdfMF0udHlwZSA9IE5PVF9JTklUOwogCX0gZWxzZSBpZiAoZm4tPnJldF90eXBlID09IFJFVF9QVFJfVE9fTUFQX1ZBTFVFX09SX05VTEwpIHsKIAkJcmVnc1tCUEZfUkVHXzBdLnR5cGUgPSBQVFJfVE9fTUFQX1ZBTFVFX09SX05VTEw7CisJCXJlZ3NbQlBGX1JFR18wXS5tYXhfdmFsdWUgPSByZWdzW0JQRl9SRUdfMF0ubWluX3ZhbHVlID0gMDsKIAkJLyogcmVtZW1iZXIgbWFwX3B0ciwgc28gdGhhdCBjaGVja19tYXBfYWNjZXNzKCkKIAkJICogY2FuIGNoZWNrICd2YWx1ZV9zaXplJyBib3VuZGFyeSBvZiBtZW1vcnkgYWNjZXNzCiAJCSAqIHRvIG1hcCBlbGVtZW50IHJldHVybmVkIGZyb20gYnBmX21hcF9sb29rdXBfZWxlbSgpCkBAIC0xMjM3LDEyICsxMjY3LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfcGFja2V0X3B0cl9hZGQoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCitzdGF0aWMgaW50IGNoZWNrX3BhY2tldF9wdHJfYWRkKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsCisJCQkJc3RydWN0IGJwZl9pbnNuICppbnNuKQogewotCXN0cnVjdCByZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOwotCXN0cnVjdCByZWdfc3RhdGUgKmRzdF9yZWcgPSAmcmVnc1tpbnNuLT5kc3RfcmVnXTsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpzcmNfcmVnID0gJnJlZ3NbaW5zbi0+c3JjX3JlZ107Ci0Jc3RydWN0IHJlZ19zdGF0ZSB0bXBfcmVnOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gZW52LT5jdXJfc3RhdGUucmVnczsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqZHN0X3JlZyA9ICZyZWdzW2luc24tPmRzdF9yZWddOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpzcmNfcmVnID0gJnJlZ3NbaW5zbi0+c3JjX3JlZ107CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgdG1wX3JlZzsKIAlzMzIgaW1tOwogCiAJaWYgKEJQRl9TUkMoaW5zbi0+Y29kZSkgPT0gQlBGX0spIHsKQEAgLTEzMDEsNyArMTMzMiw3IEBACiAJCS8qIGRzdF9yZWcgc3RheXMgYXMgcGt0X3B0ciB0eXBlIGFuZCBzaW5jZSBzb21lIHBvc2l0aXZlCiAJCSAqIGludGVnZXIgdmFsdWUgd2FzIGFkZGVkIHRvIHRoZSBwb2ludGVyLCBpbmNyZW1lbnQgaXRzICdpZCcKIAkJICovCi0JCWRzdF9yZWctPmlkKys7CisJCWRzdF9yZWctPmlkID0gKytlbnYtPmlkX2dlbjsKIAogCQkvKiBzb21ldGhpbmcgd2FzIGFkZGVkIHRvIHBrdF9wdHIsIHNldCByYW5nZSBhbmQgb2ZmIHRvIHplcm8gKi8KIAkJZHN0X3JlZy0+b2ZmID0gMDsKQEAgLTEzMTAsMTAgKzEzNDEsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBldmFsdWF0ZV9yZWdfYWx1KHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKQorc3RhdGljIGludCBldmFsdWF0ZV9yZWdfYWx1KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbikKIHsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzID0gZW52LT5jdXJfc3RhdGUucmVnczsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpkc3RfcmVnID0gJnJlZ3NbaW5zbi0+ZHN0X3JlZ107CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpkc3RfcmVnID0gJnJlZ3NbaW5zbi0+ZHN0X3JlZ107CiAJdTggb3Bjb2RlID0gQlBGX09QKGluc24tPmNvZGUpOwogCXM2NCBpbW1fbG9nMjsKIApAQCAtMTMyMyw3ICsxMzU0LDcgQEAKIAkgKi8KIAogCWlmIChCUEZfU1JDKGluc24tPmNvZGUpID09IEJQRl9YKSB7Ci0JCXN0cnVjdCByZWdfc3RhdGUgKnNyY19yZWcgPSAmcmVnc1tpbnNuLT5zcmNfcmVnXTsKKwkJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnNyY19yZWcgPSAmcmVnc1tpbnNuLT5zcmNfcmVnXTsKIAogCQlpZiAoc3JjX3JlZy0+dHlwZSA9PSBVTktOT1dOX1ZBTFVFICYmIHNyY19yZWctPmltbSA+IDAgJiYKIAkJICAgIGRzdF9yZWctPmltbSAmJiBvcGNvZGUgPT0gQlBGX0FERCkgewpAQCAtMTQxMiwxMSArMTQ0MywxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGV2YWx1YXRlX3JlZ19pbW1fYWx1KHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKQorc3RhdGljIGludCBldmFsdWF0ZV9yZWdfaW1tX2FsdShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAorCQkJCXN0cnVjdCBicGZfaW5zbiAqaW5zbikKIHsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzID0gZW52LT5jdXJfc3RhdGUucmVnczsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpkc3RfcmVnID0gJnJlZ3NbaW5zbi0+ZHN0X3JlZ107Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqc3JjX3JlZyA9ICZyZWdzW2luc24tPnNyY19yZWddOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gZW52LT5jdXJfc3RhdGUucmVnczsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqZHN0X3JlZyA9ICZyZWdzW2luc24tPmRzdF9yZWddOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpzcmNfcmVnID0gJnJlZ3NbaW5zbi0+c3JjX3JlZ107CiAJdTggb3Bjb2RlID0gQlBGX09QKGluc24tPmNvZGUpOwogCiAJLyogZHN0X3JlZy0+dHlwZSA9PSBDT05TVF9JTU0gaGVyZSwgc2ltdWxhdGUgZXhlY3V0aW9uIG9mICdhZGQnIGluc24uCkBAIC0xNDMyLDEwICsxNDY0LDExMCBAQAogCXJldHVybiAwOwogfQogCi0vKiBjaGVjayB2YWxpZGl0eSBvZiAzMi1iaXQgYW5kIDY0LWJpdCBhcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KLXN0YXRpYyBpbnQgY2hlY2tfYWx1X29wKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKQorc3RhdGljIHZvaWQgY2hlY2tfcmVnX292ZXJmbG93KHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcpCiB7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVncyA9IGVudi0+Y3VyX3N0YXRlLnJlZ3MsICpkc3RfcmVnOworCWlmIChyZWctPm1heF92YWx1ZSA+IEJQRl9SRUdJU1RFUl9NQVhfUkFOR0UpCisJCXJlZy0+bWF4X3ZhbHVlID0gQlBGX1JFR0lTVEVSX01BWF9SQU5HRTsKKwlpZiAoKHM2NClyZWctPm1pbl92YWx1ZSA8IEJQRl9SRUdJU1RFUl9NSU5fUkFOR0UpCisJCXJlZy0+bWluX3ZhbHVlID0gQlBGX1JFR0lTVEVSX01JTl9SQU5HRTsKK30KKworc3RhdGljIHZvaWQgYWRqdXN0X3JlZ19taW5fbWF4X3ZhbHMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKKwkJCQkgICAgc3RydWN0IGJwZl9pbnNuICppbnNuKQoreworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gZW52LT5jdXJfc3RhdGUucmVncywgKmRzdF9yZWc7CisJdTY0IG1pbl92YWwgPSBCUEZfUkVHSVNURVJfTUlOX1JBTkdFLCBtYXhfdmFsID0gQlBGX1JFR0lTVEVSX01BWF9SQU5HRTsKKwlib29sIG1pbl9zZXQgPSBmYWxzZSwgbWF4X3NldCA9IGZhbHNlOworCXU4IG9wY29kZSA9IEJQRl9PUChpbnNuLT5jb2RlKTsKKworCWRzdF9yZWcgPSAmcmVnc1tpbnNuLT5kc3RfcmVnXTsKKwlpZiAoQlBGX1NSQyhpbnNuLT5jb2RlKSA9PSBCUEZfWCkgeworCQljaGVja19yZWdfb3ZlcmZsb3coJnJlZ3NbaW5zbi0+c3JjX3JlZ10pOworCQltaW5fdmFsID0gcmVnc1tpbnNuLT5zcmNfcmVnXS5taW5fdmFsdWU7CisJCW1heF92YWwgPSByZWdzW2luc24tPnNyY19yZWddLm1heF92YWx1ZTsKKworCQkvKiBJZiB0aGUgc291cmNlIHJlZ2lzdGVyIGlzIGEgcmFuZG9tIHBvaW50ZXIgdGhlbiB0aGUKKwkJICogbWluX3ZhbHVlL21heF92YWx1ZSB2YWx1ZXMgcmVwcmVzZW50IHRoZSByYW5nZSBvZiB0aGUga25vd24KKwkJICogYWNjZXNzZXMgaW50byB0aGF0IHZhbHVlLCBub3QgdGhlIGFjdHVhbCBtaW4vbWF4IHZhbHVlIG9mIHRoZQorCQkgKiByZWdpc3RlciBpdHNlbGYuICBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byByZXNldCB0aGUgcmVnIHJhbmdlCisJCSAqIHZhbHVlcyBzbyB3ZSBrbm93IGl0IGlzIG5vdCBzYWZlIHRvIGxvb2sgYXQuCisJCSAqLworCQlpZiAocmVnc1tpbnNuLT5zcmNfcmVnXS50eXBlICE9IENPTlNUX0lNTSAmJgorCQkgICAgcmVnc1tpbnNuLT5zcmNfcmVnXS50eXBlICE9IFVOS05PV05fVkFMVUUpIHsKKwkJCW1pbl92YWwgPSBCUEZfUkVHSVNURVJfTUlOX1JBTkdFOworCQkJbWF4X3ZhbCA9IEJQRl9SRUdJU1RFUl9NQVhfUkFOR0U7CisJCX0KKwl9IGVsc2UgaWYgKGluc24tPmltbSA8IEJQRl9SRUdJU1RFUl9NQVhfUkFOR0UgJiYKKwkJICAgKHM2NClpbnNuLT5pbW0gPiBCUEZfUkVHSVNURVJfTUlOX1JBTkdFKSB7CisJCW1pbl92YWwgPSBtYXhfdmFsID0gaW5zbi0+aW1tOworCQltaW5fc2V0ID0gbWF4X3NldCA9IHRydWU7CisJfQorCisJLyogV2UgZG9uJ3Qga25vdyBhbnl0aGluZyBhYm91dCB3aGF0IHdhcyBkb25lIHRvIHRoaXMgcmVnaXN0ZXIsIG1hcmsgaXQKKwkgKiBhcyB1bmtub3duLgorCSAqLworCWlmIChtaW5fdmFsID09IEJQRl9SRUdJU1RFUl9NSU5fUkFOR0UgJiYKKwkgICAgbWF4X3ZhbCA9PSBCUEZfUkVHSVNURVJfTUFYX1JBTkdFKSB7CisJCXJlc2V0X3JlZ19yYW5nZV92YWx1ZXMocmVncywgaW5zbi0+ZHN0X3JlZyk7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgQlBGX0FERDoKKwkJZHN0X3JlZy0+bWluX3ZhbHVlICs9IG1pbl92YWw7CisJCWRzdF9yZWctPm1heF92YWx1ZSArPSBtYXhfdmFsOworCQlicmVhazsKKwljYXNlIEJQRl9TVUI6CisJCWRzdF9yZWctPm1pbl92YWx1ZSAtPSBtaW5fdmFsOworCQlkc3RfcmVnLT5tYXhfdmFsdWUgLT0gbWF4X3ZhbDsKKwkJYnJlYWs7CisJY2FzZSBCUEZfTVVMOgorCQlkc3RfcmVnLT5taW5fdmFsdWUgKj0gbWluX3ZhbDsKKwkJZHN0X3JlZy0+bWF4X3ZhbHVlICo9IG1heF92YWw7CisJCWJyZWFrOworCWNhc2UgQlBGX0FORDoKKwkJLyogJiBpcyBzcGVjaWFsIHNpbmNlIGl0IGNvdWxkIGVuZCB1cCB3aXRoIDAgYml0cyBzZXQuICovCisJCWRzdF9yZWctPm1pbl92YWx1ZSAmPSBtaW5fdmFsOworCQlkc3RfcmVnLT5tYXhfdmFsdWUgPSBtYXhfdmFsOworCQlicmVhazsKKwljYXNlIEJQRl9MU0g6CisJCS8qIEdvdHRhIGhhdmUgc3BlY2lhbCBvdmVyZmxvdyBsb2dpYyBoZXJlLCBpZiB3ZSdyZSBzaGlmdGluZworCQkgKiBtb3JlIHRoYW4gTUFYX1JBTkdFIHRoZW4ganVzdCBhc3N1bWUgd2UgaGF2ZSBhbiBpbnZhbGlkCisJCSAqIHJhbmdlLgorCQkgKi8KKwkJaWYgKG1pbl92YWwgPiBpbG9nMihCUEZfUkVHSVNURVJfTUFYX1JBTkdFKSkKKwkJCWRzdF9yZWctPm1pbl92YWx1ZSA9IEJQRl9SRUdJU1RFUl9NSU5fUkFOR0U7CisJCWVsc2UKKwkJCWRzdF9yZWctPm1pbl92YWx1ZSA8PD0gbWluX3ZhbDsKKworCQlpZiAobWF4X3ZhbCA+IGlsb2cyKEJQRl9SRUdJU1RFUl9NQVhfUkFOR0UpKQorCQkJZHN0X3JlZy0+bWF4X3ZhbHVlID0gQlBGX1JFR0lTVEVSX01BWF9SQU5HRTsKKwkJZWxzZQorCQkJZHN0X3JlZy0+bWF4X3ZhbHVlIDw8PSBtYXhfdmFsOworCQlicmVhazsKKwljYXNlIEJQRl9SU0g6CisJCWRzdF9yZWctPm1pbl92YWx1ZSA+Pj0gbWluX3ZhbDsKKwkJZHN0X3JlZy0+bWF4X3ZhbHVlID4+PSBtYXhfdmFsOworCQlicmVhazsKKwljYXNlIEJQRl9NT0Q6CisJCS8qICUgaXMgc3BlY2lhbCBzaW5jZSBpdCBpcyBhbiB1bnNpZ25lZCBtb2R1bHVzLCBzbyB0aGUgZmxvb3IKKwkJICogd2lsbCBhbHdheXMgYmUgMC4KKwkJICovCisJCWRzdF9yZWctPm1pbl92YWx1ZSA9IDA7CisJCWRzdF9yZWctPm1heF92YWx1ZSA9IG1heF92YWwgLSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXNldF9yZWdfcmFuZ2VfdmFsdWVzKHJlZ3MsIGluc24tPmRzdF9yZWcpOworCQlicmVhazsKKwl9CisKKwljaGVja19yZWdfb3ZlcmZsb3coZHN0X3JlZyk7Cit9CisKKy8qIGNoZWNrIHZhbGlkaXR5IG9mIDMyLWJpdCBhbmQgNjQtYml0IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLworc3RhdGljIGludCBjaGVja19hbHVfb3Aoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKQoreworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gZW52LT5jdXJfc3RhdGUucmVncywgKmRzdF9yZWc7CiAJdTggb3Bjb2RlID0gQlBGX09QKGluc24tPmNvZGUpOwogCWludCBlcnI7CiAKQEAgLTE0OTUsNiArMTYyNywxMSBAQAogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAorCQkvKiB3ZSBhcmUgc2V0dGluZyBvdXIgcmVnaXN0ZXIgdG8gc29tZXRoaW5nIG5ldywgd2UgbmVlZCB0bworCQkgKiByZXNldCBpdHMgcmFuZ2UgdmFsdWVzLgorCQkgKi8KKwkJcmVzZXRfcmVnX3JhbmdlX3ZhbHVlcyhyZWdzLCBpbnNuLT5kc3RfcmVnKTsKKwogCQlpZiAoQlBGX1NSQyhpbnNuLT5jb2RlKSA9PSBCUEZfWCkgewogCQkJaWYgKEJQRl9DTEFTUyhpbnNuLT5jb2RlKSA9PSBCUEZfQUxVNjQpIHsKIAkJCQkvKiBjYXNlOiBSMSA9IFIyCkBAIC0xNTE2LDYgKzE2NTMsOCBAQAogCQkJICovCiAJCQlyZWdzW2luc24tPmRzdF9yZWddLnR5cGUgPSBDT05TVF9JTU07CiAJCQlyZWdzW2luc24tPmRzdF9yZWddLmltbSA9IGluc24tPmltbTsKKwkJCXJlZ3NbaW5zbi0+ZHN0X3JlZ10ubWF4X3ZhbHVlID0gaW5zbi0+aW1tOworCQkJcmVnc1tpbnNuLT5kc3RfcmVnXS5taW5fdmFsdWUgPSBpbnNuLT5pbW07CiAJCX0KIAogCX0gZWxzZSBpZiAob3Bjb2RlID4gQlBGX0VORCkgewpAQCAtMTU2OCw2ICsxNzA3LDkgQEAKIAogCQlkc3RfcmVnID0gJnJlZ3NbaW5zbi0+ZHN0X3JlZ107CiAKKwkJLyogZmlyc3Qgd2Ugd2FudCB0byBhZGp1c3Qgb3VyIHJhbmdlcy4gKi8KKwkJYWRqdXN0X3JlZ19taW5fbWF4X3ZhbHMoZW52LCBpbnNuKTsKKwogCQkvKiBwYXR0ZXJuIG1hdGNoICdicGZfYWRkIFJ4LCBpbW0nIGluc3RydWN0aW9uICovCiAJCWlmIChvcGNvZGUgPT0gQlBGX0FERCAmJiBCUEZfQ0xBU1MoaW5zbi0+Y29kZSkgPT0gQlBGX0FMVTY0ICYmCiAJCSAgICBkc3RfcmVnLT50eXBlID09IEZSQU1FX1BUUiAmJiBCUEZfU1JDKGluc24tPmNvZGUpID09IEJQRl9LKSB7CkBAIC0xNjAyLDI4ICsxNzQ0LDU4IEBACiAJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJfQogCi0JCS8qIG1hcmsgZGVzdCBvcGVyYW5kICovCi0JCW1hcmtfcmVnX3Vua25vd25fdmFsdWUocmVncywgaW5zbi0+ZHN0X3JlZyk7CisJCS8qIElmIHdlIGRpZCBwb2ludGVyIG1hdGggb24gYSBtYXAgdmFsdWUgdGhlbiBqdXN0IHNldCBpdCB0byBvdXIKKwkJICogUFRSX1RPX01BUF9WQUxVRV9BREogdHlwZSBzbyB3ZSBjYW4gZGVhbCB3aXRoIGFueSBzdG9yZXMgb3IKKwkJICogbG9hZHMgdG8gdGhpcyByZWdpc3RlciBhcHByb3ByaWF0ZWx5LCBvdGhlcndpc2UganVzdCBtYXJrIHRoZQorCQkgKiByZWdpc3RlciBhcyB1bmtub3duLgorCQkgKi8KKwkJaWYgKGVudi0+YWxsb3dfcHRyX2xlYWtzICYmCisJCSAgICAoZHN0X3JlZy0+dHlwZSA9PSBQVFJfVE9fTUFQX1ZBTFVFIHx8CisJCSAgICAgZHN0X3JlZy0+dHlwZSA9PSBQVFJfVE9fTUFQX1ZBTFVFX0FESikpCisJCQlkc3RfcmVnLT50eXBlID0gUFRSX1RPX01BUF9WQUxVRV9BREo7CisJCWVsc2UKKwkJCW1hcmtfcmVnX3Vua25vd25fdmFsdWUocmVncywgaW5zbi0+ZHN0X3JlZyk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGZpbmRfZ29vZF9wa3RfcG9pbnRlcnMoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LAotCQkJCSAgIHN0cnVjdCByZWdfc3RhdGUgKmRzdF9yZWcpCitzdGF0aWMgdm9pZCBmaW5kX2dvb2RfcGt0X3BvaW50ZXJzKHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnN0YXRlLAorCQkJCSAgIHN0cnVjdCBicGZfcmVnX3N0YXRlICpkc3RfcmVnKQogewotCXN0cnVjdCB2ZXJpZmllcl9zdGF0ZSAqc3RhdGUgPSAmZW52LT5jdXJfc3RhdGU7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVncyA9IHN0YXRlLT5yZWdzLCAqcmVnOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gc3RhdGUtPnJlZ3MsICpyZWc7CiAJaW50IGk7Ci0JLyogcjIgPSByMzsKLQkgKiByMiArPSA4Ci0JICogaWYgKHIyID4gcGt0X2VuZCkgZ290byBzb21ld2hlcmUKLQkgKiByMiA9PSBkc3RfcmVnLCBwa3RfZW5kID09IHNyY19yZWcsCi0JICogcjI9cGt0KGlkPW4sb2ZmPTgscj0wKQotCSAqIHIzPXBrdChpZD1uLG9mZj0wLHI9MCkKLQkgKiBmaW5kIHJlZ2lzdGVyIHIzIGFuZCBtYXJrIGl0cyByYW5nZSBhcyByMz1wa3QoaWQ9bixvZmY9MCxyPTgpCi0JICogc28gdGhhdCByYW5nZSBvZiBieXRlcyBbcjMsIHIzICsgOCkgaXMgc2FmZSB0byBhY2Nlc3MKKworCS8qIExMVk0gY2FuIGdlbmVyYXRlIHR3byBraW5kIG9mIGNoZWNrczoKKwkgKgorCSAqIFR5cGUgMToKKwkgKgorCSAqICAgcjIgPSByMzsKKwkgKiAgIHIyICs9IDg7CisJICogICBpZiAocjIgPiBwa3RfZW5kKSBnb3RvIDxoYW5kbGUgZXhjZXB0aW9uPgorCSAqICAgPGFjY2VzcyBva2F5PgorCSAqCisJICogICBXaGVyZToKKwkgKiAgICAgcjIgPT0gZHN0X3JlZywgcGt0X2VuZCA9PSBzcmNfcmVnCisJICogICAgIHIyPXBrdChpZD1uLG9mZj04LHI9MCkKKwkgKiAgICAgcjM9cGt0KGlkPW4sb2ZmPTAscj0wKQorCSAqCisJICogVHlwZSAyOgorCSAqCisJICogICByMiA9IHIzOworCSAqICAgcjIgKz0gODsKKwkgKiAgIGlmIChwa3RfZW5kID49IHIyKSBnb3RvIDxhY2Nlc3Mgb2theT4KKwkgKiAgIDxoYW5kbGUgZXhjZXB0aW9uPgorCSAqCisJICogICBXaGVyZToKKwkgKiAgICAgcGt0X2VuZCA9PSBkc3RfcmVnLCByMiA9PSBzcmNfcmVnCisJICogICAgIHIyPXBrdChpZD1uLG9mZj04LHI9MCkKKwkgKiAgICAgcjM9cGt0KGlkPW4sb2ZmPTAscj0wKQorCSAqCisJICogRmluZCByZWdpc3RlciByMyBhbmQgbWFyayBpdHMgcmFuZ2UgYXMgcjM9cGt0KGlkPW4sb2ZmPTAscj04KQorCSAqIHNvIHRoYXQgcmFuZ2Ugb2YgYnl0ZXMgW3IzLCByMyArIDgpIGlzIHNhZmUgdG8gYWNjZXNzLgogCSAqLworCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CUEZfUkVHOyBpKyspCiAJCWlmIChyZWdzW2ldLnR5cGUgPT0gUFRSX1RPX1BBQ0tFVCAmJiByZWdzW2ldLmlkID09IGRzdF9yZWctPmlkKQogCQkJcmVnc1tpXS5yYW5nZSA9IGRzdF9yZWctPm9mZjsKQEAgLTE2MzcsMTEgKzE4MDksMTA5IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGNoZWNrX2NvbmRfam1wX29wKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwKKy8qIEFkanVzdHMgdGhlIHJlZ2lzdGVyIG1pbi9tYXggdmFsdWVzIGluIHRoZSBjYXNlIHRoYXQgdGhlIGRzdF9yZWcgaXMgdGhlCisgKiB2YXJpYWJsZSByZWdpc3RlciB0aGF0IHdlIGFyZSB3b3JraW5nIG9uLCBhbmQgc3JjX3JlZyBpcyBhIGNvbnN0YW50IG9yIHdlJ3JlCisgKiBzaW1wbHkgZG9pbmcgYSBCUEZfSyBjaGVjay4KKyAqLworc3RhdGljIHZvaWQgcmVnX3NldF9taW5fbWF4KHN0cnVjdCBicGZfcmVnX3N0YXRlICp0cnVlX3JlZywKKwkJCSAgICBzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqZmFsc2VfcmVnLCB1NjQgdmFsLAorCQkJICAgIHU4IG9wY29kZSkKK3sKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgQlBGX0pFUToKKwkJLyogSWYgdGhpcyBpcyBmYWxzZSB0aGVuIHdlIGtub3cgbm90aGluZyBKb24gU25vdywgYnV0IGlmIGl0IGlzCisJCSAqIHRydWUgdGhlbiB3ZSBrbm93IGZvciBzdXJlLgorCQkgKi8KKwkJdHJ1ZV9yZWctPm1heF92YWx1ZSA9IHRydWVfcmVnLT5taW5fdmFsdWUgPSB2YWw7CisJCWJyZWFrOworCWNhc2UgQlBGX0pORToKKwkJLyogSWYgdGhpcyBpcyB0cnVlIHdlIGtub3cgbm90aGluZyBKb24gU25vdywgYnV0IGlmIGl0IGlzIGZhbHNlCisJCSAqIHdlIGtub3cgdGhlIHZhbHVlIGZvciBzdXJlOworCQkgKi8KKwkJZmFsc2VfcmVnLT5tYXhfdmFsdWUgPSBmYWxzZV9yZWctPm1pbl92YWx1ZSA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSkdUOgorCQkvKiBVbnNpZ25lZCBjb21wYXJpc29uLCB0aGUgbWluaW11bSB2YWx1ZSBpcyAwLiAqLworCQlmYWxzZV9yZWctPm1pbl92YWx1ZSA9IDA7CisJY2FzZSBCUEZfSlNHVDoKKwkJLyogSWYgdGhpcyBpcyBmYWxzZSB0aGVuIHdlIGtub3cgdGhlIG1heGltdW0gdmFsIGlzIHZhbCwKKwkJICogb3RoZXJ3aXNlIHdlIGtub3cgdGhlIG1pbiB2YWwgaXMgdmFsKzEuCisJCSAqLworCQlmYWxzZV9yZWctPm1heF92YWx1ZSA9IHZhbDsKKwkJdHJ1ZV9yZWctPm1pbl92YWx1ZSA9IHZhbCArIDE7CisJCWJyZWFrOworCWNhc2UgQlBGX0pHRToKKwkJLyogVW5zaWduZWQgY29tcGFyaXNvbiwgdGhlIG1pbmltdW0gdmFsdWUgaXMgMC4gKi8KKwkJZmFsc2VfcmVnLT5taW5fdmFsdWUgPSAwOworCWNhc2UgQlBGX0pTR0U6CisJCS8qIElmIHRoaXMgaXMgZmFsc2UgdGhlbiB3ZSBrbm93IHRoZSBtYXhpbXVtIHZhbHVlIGlzIHZhbCAtIDEsCisJCSAqIG90aGVyd2lzZSB3ZSBrbm93IHRoZSBtaW1pbXVtIHZhbHVlIGlzIHZhbC4KKwkJICovCisJCWZhbHNlX3JlZy0+bWF4X3ZhbHVlID0gdmFsIC0gMTsKKwkJdHJ1ZV9yZWctPm1pbl92YWx1ZSA9IHZhbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJY2hlY2tfcmVnX292ZXJmbG93KGZhbHNlX3JlZyk7CisJY2hlY2tfcmVnX292ZXJmbG93KHRydWVfcmVnKTsKK30KKworLyogU2FtZSBhcyBhYm92ZSwgYnV0IGZvciB0aGUgY2FzZSB0aGF0IGRzdF9yZWcgaXMgYSBDT05TVF9JTU0gcmVnIGFuZCBzcmNfcmVnCisgKiBpcyB0aGUgdmFyaWFibGUgcmVnLgorICovCitzdGF0aWMgdm9pZCByZWdfc2V0X21pbl9tYXhfaW52KHN0cnVjdCBicGZfcmVnX3N0YXRlICp0cnVlX3JlZywKKwkJCQlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqZmFsc2VfcmVnLCB1NjQgdmFsLAorCQkJCXU4IG9wY29kZSkKK3sKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgQlBGX0pFUToKKwkJLyogSWYgdGhpcyBpcyBmYWxzZSB0aGVuIHdlIGtub3cgbm90aGluZyBKb24gU25vdywgYnV0IGlmIGl0IGlzCisJCSAqIHRydWUgdGhlbiB3ZSBrbm93IGZvciBzdXJlLgorCQkgKi8KKwkJdHJ1ZV9yZWctPm1heF92YWx1ZSA9IHRydWVfcmVnLT5taW5fdmFsdWUgPSB2YWw7CisJCWJyZWFrOworCWNhc2UgQlBGX0pORToKKwkJLyogSWYgdGhpcyBpcyB0cnVlIHdlIGtub3cgbm90aGluZyBKb24gU25vdywgYnV0IGlmIGl0IGlzIGZhbHNlCisJCSAqIHdlIGtub3cgdGhlIHZhbHVlIGZvciBzdXJlOworCQkgKi8KKwkJZmFsc2VfcmVnLT5tYXhfdmFsdWUgPSBmYWxzZV9yZWctPm1pbl92YWx1ZSA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSkdUOgorCQkvKiBVbnNpZ25lZCBjb21wYXJpc29uLCB0aGUgbWluaW11bSB2YWx1ZSBpcyAwLiAqLworCQl0cnVlX3JlZy0+bWluX3ZhbHVlID0gMDsKKwljYXNlIEJQRl9KU0dUOgorCQkvKgorCQkgKiBJZiB0aGlzIGlzIGZhbHNlLCB0aGVuIHRoZSB2YWwgaXMgPD0gdGhlIHJlZ2lzdGVyLCBpZiBpdCBpcworCQkgKiB0cnVlIHRoZSByZWdpc3RlciA8PSB0byB0aGUgdmFsLgorCQkgKi8KKwkJZmFsc2VfcmVnLT5taW5fdmFsdWUgPSB2YWw7CisJCXRydWVfcmVnLT5tYXhfdmFsdWUgPSB2YWwgLSAxOworCQlicmVhazsKKwljYXNlIEJQRl9KR0U6CisJCS8qIFVuc2lnbmVkIGNvbXBhcmlzb24sIHRoZSBtaW5pbXVtIHZhbHVlIGlzIDAuICovCisJCXRydWVfcmVnLT5taW5fdmFsdWUgPSAwOworCWNhc2UgQlBGX0pTR0U6CisJCS8qIElmIHRoaXMgaXMgZmFsc2UgdGhlbiBjb25zdGFudCA8IHJlZ2lzdGVyLCBpZiBpdCBpcyB0cnVlIHRoZW4KKwkJICogdGhlIHJlZ2lzdGVyIDwgY29uc3RhbnQuCisJCSAqLworCQlmYWxzZV9yZWctPm1pbl92YWx1ZSA9IHZhbCArIDE7CisJCXRydWVfcmVnLT5tYXhfdmFsdWUgPSB2YWw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWNoZWNrX3JlZ19vdmVyZmxvdyhmYWxzZV9yZWcpOworCWNoZWNrX3JlZ19vdmVyZmxvdyh0cnVlX3JlZyk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfY29uZF9qbXBfb3Aoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKIAkJCSAgICAgc3RydWN0IGJwZl9pbnNuICppbnNuLCBpbnQgKmluc25faWR4KQogewotCXN0cnVjdCByZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzLCAqZHN0X3JlZzsKLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhdGUgKm90aGVyX2JyYW5jaDsKKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlICpvdGhlcl9icmFuY2gsICp0aGlzX2JyYW5jaCA9ICZlbnYtPmN1cl9zdGF0ZTsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVncyA9IHRoaXNfYnJhbmNoLT5yZWdzLCAqZHN0X3JlZzsKIAl1OCBvcGNvZGUgPSBCUEZfT1AoaW5zbi0+Y29kZSk7CiAJaW50IGVycjsKIApAQCAtMTcwMyw3ICsxOTczLDI0IEBACiAJaWYgKCFvdGhlcl9icmFuY2gpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JLyogZGV0ZWN0IGlmIFIgPT0gMCB3aGVyZSBSIGlzIHJldHVybmVkIHZhbHVlIGZyb20gYnBmX21hcF9sb29rdXBfZWxlbSgpICovCisJLyogZGV0ZWN0IGlmIHdlIGFyZSBjb21wYXJpbmcgYWdhaW5zdCBhIGNvbnN0YW50IHZhbHVlIHNvIHdlIGNhbiBhZGp1c3QKKwkgKiBvdXIgbWluL21heCB2YWx1ZXMgZm9yIG91ciBkc3QgcmVnaXN0ZXIuCisJICovCisJaWYgKEJQRl9TUkMoaW5zbi0+Y29kZSkgPT0gQlBGX1gpIHsKKwkJaWYgKHJlZ3NbaW5zbi0+c3JjX3JlZ10udHlwZSA9PSBDT05TVF9JTU0pCisJCQlyZWdfc2V0X21pbl9tYXgoJm90aGVyX2JyYW5jaC0+cmVnc1tpbnNuLT5kc3RfcmVnXSwKKwkJCQkJZHN0X3JlZywgcmVnc1tpbnNuLT5zcmNfcmVnXS5pbW0sCisJCQkJCW9wY29kZSk7CisJCWVsc2UgaWYgKGRzdF9yZWctPnR5cGUgPT0gQ09OU1RfSU1NKQorCQkJcmVnX3NldF9taW5fbWF4X2ludigmb3RoZXJfYnJhbmNoLT5yZWdzW2luc24tPnNyY19yZWddLAorCQkJCQkgICAgJnJlZ3NbaW5zbi0+c3JjX3JlZ10sIGRzdF9yZWctPmltbSwKKwkJCQkJICAgIG9wY29kZSk7CisJfSBlbHNlIHsKKwkJcmVnX3NldF9taW5fbWF4KCZvdGhlcl9icmFuY2gtPnJlZ3NbaW5zbi0+ZHN0X3JlZ10sCisJCQkJCWRzdF9yZWcsIGluc24tPmltbSwgb3Bjb2RlKTsKKwl9CisKKwkvKiBkZXRlY3QgaWYgUiA9PSAwIHdoZXJlIFIgaXMgcmV0dXJuZWQgZnJvbSBicGZfbWFwX2xvb2t1cF9lbGVtKCkgKi8KIAlpZiAoQlBGX1NSQyhpbnNuLT5jb2RlKSA9PSBCUEZfSyAmJgogCSAgICBpbnNuLT5pbW0gPT0gMCAmJiAob3Bjb2RlID09IEJQRl9KRVEgfHwgb3Bjb2RlID09IEJQRl9KTkUpICYmCiAJICAgIGRzdF9yZWctPnR5cGUgPT0gUFRSX1RPX01BUF9WQUxVRV9PUl9OVUxMKSB7CkBAIC0xNzIyLDEzICsyMDA5LDE3IEBACiAJfSBlbHNlIGlmIChCUEZfU1JDKGluc24tPmNvZGUpID09IEJQRl9YICYmIG9wY29kZSA9PSBCUEZfSkdUICYmCiAJCSAgIGRzdF9yZWctPnR5cGUgPT0gUFRSX1RPX1BBQ0tFVCAmJgogCQkgICByZWdzW2luc24tPnNyY19yZWddLnR5cGUgPT0gUFRSX1RPX1BBQ0tFVF9FTkQpIHsKLQkJZmluZF9nb29kX3BrdF9wb2ludGVycyhlbnYsIGRzdF9yZWcpOworCQlmaW5kX2dvb2RfcGt0X3BvaW50ZXJzKHRoaXNfYnJhbmNoLCBkc3RfcmVnKTsKKwl9IGVsc2UgaWYgKEJQRl9TUkMoaW5zbi0+Y29kZSkgPT0gQlBGX1ggJiYgb3Bjb2RlID09IEJQRl9KR0UgJiYKKwkJICAgZHN0X3JlZy0+dHlwZSA9PSBQVFJfVE9fUEFDS0VUX0VORCAmJgorCQkgICByZWdzW2luc24tPnNyY19yZWddLnR5cGUgPT0gUFRSX1RPX1BBQ0tFVCkgeworCQlmaW5kX2dvb2RfcGt0X3BvaW50ZXJzKG90aGVyX2JyYW5jaCwgJnJlZ3NbaW5zbi0+c3JjX3JlZ10pOwogCX0gZWxzZSBpZiAoaXNfcG9pbnRlcl92YWx1ZShlbnYsIGluc24tPmRzdF9yZWcpKSB7CiAJCXZlcmJvc2UoIlIlZCBwb2ludGVyIGNvbXBhcmlzb24gcHJvaGliaXRlZFxuIiwgaW5zbi0+ZHN0X3JlZyk7CiAJCXJldHVybiAtRUFDQ0VTOwogCX0KIAlpZiAobG9nX2xldmVsKQotCQlwcmludF92ZXJpZmllcl9zdGF0ZSgmZW52LT5jdXJfc3RhdGUpOworCQlwcmludF92ZXJpZmllcl9zdGF0ZSh0aGlzX2JyYW5jaCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3NDEsOSArMjAzMiw5IEBACiB9CiAKIC8qIHZlcmlmeSBCUEZfTERfSU1NNjQgaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyBpbnQgY2hlY2tfbGRfaW1tKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKQorc3RhdGljIGludCBjaGVja19sZF9pbW0oc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKQogewotCXN0cnVjdCByZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gZW52LT5jdXJfc3RhdGUucmVnczsKIAlpbnQgZXJyOwogCiAJaWYgKEJQRl9TSVpFKGluc24tPmNvZGUpICE9IEJQRl9EVykgewpAQCAtMTc1OSw5ICsyMDUwLDE5IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmIChpbnNuLT5zcmNfcmVnID09IDApCi0JCS8qIGdlbmVyaWMgbW92ZSA2NC1iaXQgaW1tZWRpYXRlIGludG8gYSByZWdpc3RlciAqLworCWlmIChpbnNuLT5zcmNfcmVnID09IDApIHsKKwkJLyogZ2VuZXJpYyBtb3ZlIDY0LWJpdCBpbW1lZGlhdGUgaW50byBhIHJlZ2lzdGVyLAorCQkgKiBvbmx5IGFuYWx5emVyIG5lZWRzIHRvIGNvbGxlY3QgdGhlIGxkX2ltbSB2YWx1ZS4KKwkJICovCisJCXU2NCBpbW0gPSAoKHU2NCkoaW5zbiArIDEpLT5pbW0gPDwgMzIpIHwgKHUzMilpbnNuLT5pbW07CisKKwkJaWYgKCFlbnYtPmFuYWx5emVyX29wcykKKwkJCXJldHVybiAwOworCisJCXJlZ3NbaW5zbi0+ZHN0X3JlZ10udHlwZSA9IENPTlNUX0lNTTsKKwkJcmVnc1tpbnNuLT5kc3RfcmVnXS5pbW0gPSBpbW07CiAJCXJldHVybiAwOworCX0KIAogCS8qIHJlcGxhY2VfbWFwX2ZkX3dpdGhfbWFwX3B0cigpIHNob3VsZCBoYXZlIGNhdWdodCBiYWQgbGRfaW1tNjQgKi8KIAlCVUdfT04oaW5zbi0+c3JjX3JlZyAhPSBCUEZfUFNFVURPX01BUF9GRCk7CkBAIC0xNzk4LDExICsyMDk5LDExIEBACiAgKiBPdXRwdXQ6CiAgKiAgIFIwIC0gOC8xNi8zMi1iaXQgc2tiIGRhdGEgY29udmVydGVkIHRvIGNwdSBlbmRpYW5uZXNzCiAgKi8KLXN0YXRpYyBpbnQgY2hlY2tfbGRfYWJzKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKQorc3RhdGljIGludCBjaGVja19sZF9hYnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKQogewotCXN0cnVjdCByZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gZW52LT5jdXJfc3RhdGUucmVnczsKIAl1OCBtb2RlID0gQlBGX01PREUoaW5zbi0+Y29kZSk7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVnOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWc7CiAJaW50IGksIGVycjsKIAogCWlmICghbWF5X2FjY2Vzc19za2IoZW52LT5wcm9nLT50eXBlKSkgewpAQCAtMTg4OCw3ICsyMTg5LDcgQEAKIAlCUkFOQ0ggPSAyLAogfTsKIAotI2RlZmluZSBTVEFURV9MSVNUX01BUksgKChzdHJ1Y3QgdmVyaWZpZXJfc3RhdGVfbGlzdCAqKSAtMUwpCisjZGVmaW5lIFNUQVRFX0xJU1RfTUFSSyAoKHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGVfbGlzdCAqKSAtMUwpCiAKIHN0YXRpYyBpbnQgKmluc25fc3RhY2s7CS8qIHN0YWNrIG9mIGluc25zIHRvIHByb2Nlc3MgKi8KIHN0YXRpYyBpbnQgY3VyX3N0YWNrOwkvKiBjdXJyZW50IHN0YWNrIGluZGV4ICovCkBAIC0xODk5LDcgKzIyMDAsNyBAQAogICogdyAtIG5leHQgaW5zdHJ1Y3Rpb24KICAqIGUgLSBlZGdlCiAgKi8KLXN0YXRpYyBpbnQgcHVzaF9pbnNuKGludCB0LCBpbnQgdywgaW50IGUsIHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudikKK3N0YXRpYyBpbnQgcHVzaF9pbnNuKGludCB0LCBpbnQgdywgaW50IGUsIHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpCiB7CiAJaWYgKGUgPT0gRkFMTFRIUk9VR0ggJiYgaW5zbl9zdGF0ZVt0XSA+PSAoRElTQ09WRVJFRCB8IEZBTExUSFJPVUdIKSkKIAkJcmV0dXJuIDA7CkBAIC0xOTQwLDcgKzIyNDEsNyBAQAogLyogbm9uLXJlY3Vyc2l2ZSBkZXB0aC1maXJzdC1zZWFyY2ggdG8gZGV0ZWN0IGxvb3BzIGluIEJQRiBwcm9ncmFtCiAgKiBsb29wID09IGJhY2stZWRnZSBpbiBkaXJlY3RlZCBncmFwaAogICovCi1zdGF0aWMgaW50IGNoZWNrX2NmZyhzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYpCitzdGF0aWMgaW50IGNoZWNrX2NmZyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQogewogCXN0cnVjdCBicGZfaW5zbiAqaW5zbnMgPSBlbnYtPnByb2ctPmluc25zaTsKIAlpbnQgaW5zbl9jbnQgPSBlbnYtPnByb2ctPmxlbjsKQEAgLTIwNDksNyArMjM1MCw4IEBACiAvKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgcmVkdWNlIHRoZSBudW1iZXIgb2YgZXhwbG9yZWQgaW5zbnMKICAqIGZyb20gfjE0MGsgdG8gfjgwayBmb3IgdWx0cmEgbGFyZ2UgcHJvZ3JhbXMgdGhhdCB1c2UgYSBsb3Qgb2YgcHRyX3RvX3BhY2tldAogICovCi1zdGF0aWMgYm9vbCBjb21wYXJlX3B0cnNfdG9fcGFja2V0KHN0cnVjdCByZWdfc3RhdGUgKm9sZCwgc3RydWN0IHJlZ19zdGF0ZSAqY3VyKQorc3RhdGljIGJvb2wgY29tcGFyZV9wdHJzX3RvX3BhY2tldChzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqb2xkLAorCQkJCSAgIHN0cnVjdCBicGZfcmVnX3N0YXRlICpjdXIpCiB7CiAJaWYgKG9sZC0+aWQgIT0gY3VyLT5pZCkKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMjEyNCw5ICsyNDI2LDExIEBACiAgKiB3aGVyZWFzIHJlZ2lzdGVyIHR5cGUgaW4gY3VycmVudCBzdGF0ZSBpcyBtZWFuaW5nZnVsLCBpdCBtZWFucyB0aGF0CiAgKiB0aGUgY3VycmVudCBzdGF0ZSB3aWxsIHJlYWNoICdicGZfZXhpdCcgaW5zdHJ1Y3Rpb24gc2FmZWx5CiAgKi8KLXN0YXRpYyBib29sIHN0YXRlc19lcXVhbChzdHJ1Y3QgdmVyaWZpZXJfc3RhdGUgKm9sZCwgc3RydWN0IHZlcmlmaWVyX3N0YXRlICpjdXIpCitzdGF0aWMgYm9vbCBzdGF0ZXNfZXF1YWwoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKKwkJCSBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlICpvbGQsCisJCQkgc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSAqY3VyKQogewotCXN0cnVjdCByZWdfc3RhdGUgKnJvbGQsICpyY3VyOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyb2xkLCAqcmN1cjsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfQlBGX1JFRzsgaSsrKSB7CkBAIC0yMTM2LDYgKzI0NDAsMTMgQEAKIAkJaWYgKG1lbWNtcChyb2xkLCByY3VyLCBzaXplb2YoKnJvbGQpKSA9PSAwKQogCQkJY29udGludWU7CiAKKwkJLyogSWYgdGhlIHJhbmdlcyB3ZXJlIG5vdCB0aGUgc2FtZSwgYnV0IGV2ZXJ5dGhpbmcgZWxzZSB3YXMgYW5kCisJCSAqIHdlIGRpZG4ndCBkbyBhIHZhcmlhYmxlIGFjY2VzcyBpbnRvIGEgbWFwIHRoZW4gd2UgYXJlIGEtb2suCisJCSAqLworCQlpZiAoIWVudi0+dmFybGVuX21hcF92YWx1ZV9hY2Nlc3MgJiYKKwkJICAgIHJvbGQtPnR5cGUgPT0gcmN1ci0+dHlwZSAmJiByb2xkLT5pbW0gPT0gcmN1ci0+aW1tKQorCQkJY29udGludWU7CisKIAkJaWYgKHJvbGQtPnR5cGUgPT0gTk9UX0lOSVQgfHwKIAkJICAgIChyb2xkLT50eXBlID09IFVOS05PV05fVkFMVUUgJiYgcmN1ci0+dHlwZSAhPSBOT1RfSU5JVCkpCiAJCQljb250aW51ZTsKQEAgLTIxNjYsOSArMjQ3Nyw5IEBACiAJCQkgKiB0aGUgc2FtZSwgY2hlY2sgdGhhdCBzdG9yZWQgcG9pbnRlcnMgdHlwZXMKIAkJCSAqIGFyZSB0aGUgc2FtZSBhcyB3ZWxsLgogCQkJICogRXg6IGV4cGxvcmVkIHNhZmUgcGF0aCBjb3VsZCBoYXZlIHN0b3JlZAotCQkJICogKHN0cnVjdCByZWdfc3RhdGUpIHsudHlwZSA9IFBUUl9UT19TVEFDSywgLmltbSA9IC04fQorCQkJICogKGJwZl9yZWdfc3RhdGUpIHsudHlwZSA9IFBUUl9UT19TVEFDSywgLmltbSA9IC04fQogCQkJICogYnV0IGN1cnJlbnQgcGF0aCBoYXMgc3RvcmVkOgotCQkJICogKHN0cnVjdCByZWdfc3RhdGUpIHsudHlwZSA9IFBUUl9UT19TVEFDSywgLmltbSA9IC0xNn0KKwkJCSAqIChicGZfcmVnX3N0YXRlKSB7LnR5cGUgPSBQVFJfVE9fU1RBQ0ssIC5pbW0gPSAtMTZ9CiAJCQkgKiBzdWNoIHZlcmlmaWVyIHN0YXRlcyBhcmUgbm90IGVxdWl2YWxlbnQuCiAJCQkgKiByZXR1cm4gZmFsc2UgdG8gY29udGludWUgdmVyaWZpY2F0aW9uIG9mIHRoaXMgcGF0aAogCQkJICovCkBAIC0yMTc5LDEwICsyNDkwLDEwIEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbnQgaXNfc3RhdGVfdmlzaXRlZChzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYsIGludCBpbnNuX2lkeCkKK3N0YXRpYyBpbnQgaXNfc3RhdGVfdmlzaXRlZChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgaW5zbl9pZHgpCiB7Ci0Jc3RydWN0IHZlcmlmaWVyX3N0YXRlX2xpc3QgKm5ld19zbDsKLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhdGVfbGlzdCAqc2w7CisJc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZV9saXN0ICpuZXdfc2w7CisJc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZV9saXN0ICpzbDsKIAogCXNsID0gZW52LT5leHBsb3JlZF9zdGF0ZXNbaW5zbl9pZHhdOwogCWlmICghc2wpCkBAIC0yMTkyLDcgKzI1MDMsNyBAQAogCQlyZXR1cm4gMDsKIAogCXdoaWxlIChzbCAhPSBTVEFURV9MSVNUX01BUkspIHsKLQkJaWYgKHN0YXRlc19lcXVhbCgmc2wtPnN0YXRlLCAmZW52LT5jdXJfc3RhdGUpKQorCQlpZiAoc3RhdGVzX2VxdWFsKGVudiwgJnNsLT5zdGF0ZSwgJmVudi0+Y3VyX3N0YXRlKSkKIAkJCS8qIHJlYWNoZWQgZXF1aXZhbGVudCByZWdpc3Rlci9zdGFjayBzdGF0ZSwKIAkJCSAqIHBydW5lIHRoZSBzZWFyY2gKIAkJCSAqLwpAQCAtMjIwNiw3ICsyNTE3LDcgQEAKIAkgKiBpdCB3aWxsIGJlIHJlamVjdGVkLiBTaW5jZSB0aGVyZSBhcmUgbm8gbG9vcHMsIHdlIHdvbid0IGJlCiAJICogc2VlaW5nIHRoaXMgJ2luc25faWR4JyBpbnN0cnVjdGlvbiBhZ2FpbiBvbiB0aGUgd2F5IHRvIGJwZl9leGl0CiAJICovCi0JbmV3X3NsID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZlcmlmaWVyX3N0YXRlX2xpc3QpLCBHRlBfVVNFUik7CisJbmV3X3NsID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZV9saXN0KSwgR0ZQX1VTRVIpOwogCWlmICghbmV3X3NsKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMjIxNywxMSArMjUyOCwyMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRvX2NoZWNrKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudikKK3N0YXRpYyBpbnQgZXh0X2FuYWx5emVyX2luc25faG9vayhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAorCQkJCSAgaW50IGluc25faWR4LCBpbnQgcHJldl9pbnNuX2lkeCkKIHsKLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhdGUgKnN0YXRlID0gJmVudi0+Y3VyX3N0YXRlOworCWlmICghZW52LT5hbmFseXplcl9vcHMgfHwgIWVudi0+YW5hbHl6ZXJfb3BzLT5pbnNuX2hvb2spCisJCXJldHVybiAwOworCisJcmV0dXJuIGVudi0+YW5hbHl6ZXJfb3BzLT5pbnNuX2hvb2soZW52LCBpbnNuX2lkeCwgcHJldl9pbnNuX2lkeCk7Cit9CisKK3N0YXRpYyBpbnQgZG9fY2hlY2soc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudikKK3sKKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlICpzdGF0ZSA9ICZlbnYtPmN1cl9zdGF0ZTsKIAlzdHJ1Y3QgYnBmX2luc24gKmluc25zID0gZW52LT5wcm9nLT5pbnNuc2k7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVncyA9IHN0YXRlLT5yZWdzOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gc3RhdGUtPnJlZ3M7CiAJaW50IGluc25fY250ID0gZW52LT5wcm9nLT5sZW47CiAJaW50IGluc25faWR4LCBwcmV2X2luc25faWR4ID0gMDsKIAlpbnQgaW5zbl9wcm9jZXNzZWQgPSAwOwpAQCAtMjIyOSw2ICsyNTQ5LDcgQEAKIAogCWluaXRfcmVnX3N0YXRlKHJlZ3MpOwogCWluc25faWR4ID0gMDsKKwllbnYtPnZhcmxlbl9tYXBfdmFsdWVfYWNjZXNzID0gZmFsc2U7CiAJZm9yICg7OykgewogCQlzdHJ1Y3QgYnBmX2luc24gKmluc247CiAJCXU4IGNsYXNzOwpAQCAtMjI3NSwxMyArMjU5NiwxNyBAQAogCQkJcHJpbnRfYnBmX2luc24oaW5zbik7CiAJCX0KIAorCQllcnIgPSBleHRfYW5hbHl6ZXJfaW5zbl9ob29rKGVudiwgaW5zbl9pZHgsIHByZXZfaW5zbl9pZHgpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwogCQlpZiAoY2xhc3MgPT0gQlBGX0FMVSB8fCBjbGFzcyA9PSBCUEZfQUxVNjQpIHsKIAkJCWVyciA9IGNoZWNrX2FsdV9vcChlbnYsIGluc24pOwogCQkJaWYgKGVycikKIAkJCQlyZXR1cm4gZXJyOwogCiAJCX0gZWxzZSBpZiAoY2xhc3MgPT0gQlBGX0xEWCkgewotCQkJZW51bSBicGZfcmVnX3R5cGUgc3JjX3JlZ190eXBlOworCQkJZW51bSBicGZfcmVnX3R5cGUgKnByZXZfc3JjX3R5cGUsIHNyY19yZWdfdHlwZTsKIAogCQkJLyogY2hlY2sgZm9yIHJlc2VydmVkIGZpZWxkcyBpcyBhbHJlYWR5IGRvbmUgKi8KIApAQCAtMjMwNSwyMSArMjYzMCwyNSBAQAogCQkJaWYgKGVycikKIAkJCQlyZXR1cm4gZXJyOwogCi0JCQlpZiAoQlBGX1NJWkUoaW5zbi0+Y29kZSkgIT0gQlBGX1cpIHsKKwkJCXJlc2V0X3JlZ19yYW5nZV92YWx1ZXMocmVncywgaW5zbi0+ZHN0X3JlZyk7CisJCQlpZiAoQlBGX1NJWkUoaW5zbi0+Y29kZSkgIT0gQlBGX1cgJiYKKwkJCSAgICBCUEZfU0laRShpbnNuLT5jb2RlKSAhPSBCUEZfRFcpIHsKIAkJCQlpbnNuX2lkeCsrOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQlpZiAoaW5zbi0+aW1tID09IDApIHsKKwkJCXByZXZfc3JjX3R5cGUgPSAmZW52LT5pbnNuX2F1eF9kYXRhW2luc25faWR4XS5wdHJfdHlwZTsKKworCQkJaWYgKCpwcmV2X3NyY190eXBlID09IE5PVF9JTklUKSB7CiAJCQkJLyogc2F3IGEgdmFsaWQgaW5zbgogCQkJCSAqIGRzdF9yZWcgPSAqKHUzMiAqKShzcmNfcmVnICsgb2ZmKQotCQkJCSAqIHVzZSByZXNlcnZlZCAnaW1tJyBmaWVsZCB0byBtYXJrIHRoaXMgaW5zbgorCQkJCSAqIHNhdmUgdHlwZSB0byB2YWxpZGF0ZSBpbnRlcnNlY3RpbmcgcGF0aHMKIAkJCQkgKi8KLQkJCQlpbnNuLT5pbW0gPSBzcmNfcmVnX3R5cGU7CisJCQkJKnByZXZfc3JjX3R5cGUgPSBzcmNfcmVnX3R5cGU7CiAKLQkJCX0gZWxzZSBpZiAoc3JjX3JlZ190eXBlICE9IGluc24tPmltbSAmJgorCQkJfSBlbHNlIGlmIChzcmNfcmVnX3R5cGUgIT0gKnByZXZfc3JjX3R5cGUgJiYKIAkJCQkgICAoc3JjX3JlZ190eXBlID09IFBUUl9UT19DVFggfHwKLQkJCQkgICAgaW5zbi0+aW1tID09IFBUUl9UT19DVFgpKSB7CisJCQkJICAgICpwcmV2X3NyY190eXBlID09IFBUUl9UT19DVFgpKSB7CiAJCQkJLyogQUJ1c2VyIHByb2dyYW0gaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZSBpbnNuCiAJCQkJICogZHN0X3JlZyA9ICoodTMyKikgKHNyY19yZWcgKyBvZmYpCiAJCQkJICogd2l0aCBkaWZmZXJlbnQgcG9pbnRlciB0eXBlczoKQEAgLTIzMzIsNyArMjY2MSw3IEBACiAJCQl9CiAKIAkJfSBlbHNlIGlmIChjbGFzcyA9PSBCUEZfU1RYKSB7Ci0JCQllbnVtIGJwZl9yZWdfdHlwZSBkc3RfcmVnX3R5cGU7CisJCQllbnVtIGJwZl9yZWdfdHlwZSAqcHJldl9kc3RfdHlwZSwgZHN0X3JlZ190eXBlOwogCiAJCQlpZiAoQlBGX01PREUoaW5zbi0+Y29kZSkgPT0gQlBGX1hBREQpIHsKIAkJCQllcnIgPSBjaGVja194YWRkKGVudiwgaW5zbik7CkBAIC0yMzYwLDExICsyNjg5LDEzIEBACiAJCQlpZiAoZXJyKQogCQkJCXJldHVybiBlcnI7CiAKLQkJCWlmIChpbnNuLT5pbW0gPT0gMCkgewotCQkJCWluc24tPmltbSA9IGRzdF9yZWdfdHlwZTsKLQkJCX0gZWxzZSBpZiAoZHN0X3JlZ190eXBlICE9IGluc24tPmltbSAmJgorCQkJcHJldl9kc3RfdHlwZSA9ICZlbnYtPmluc25fYXV4X2RhdGFbaW5zbl9pZHhdLnB0cl90eXBlOworCisJCQlpZiAoKnByZXZfZHN0X3R5cGUgPT0gTk9UX0lOSVQpIHsKKwkJCQkqcHJldl9kc3RfdHlwZSA9IGRzdF9yZWdfdHlwZTsKKwkJCX0gZWxzZSBpZiAoZHN0X3JlZ190eXBlICE9ICpwcmV2X2RzdF90eXBlICYmCiAJCQkJICAgKGRzdF9yZWdfdHlwZSA9PSBQVFJfVE9fQ1RYIHx8Ci0JCQkJICAgIGluc24tPmltbSA9PSBQVFJfVE9fQ1RYKSkgeworCQkJCSAgICAqcHJldl9kc3RfdHlwZSA9PSBQVFJfVE9fQ1RYKSkgewogCQkJCXZlcmJvc2UoInNhbWUgaW5zbiBjYW5ub3QgYmUgdXNlZCB3aXRoIGRpZmZlcmVudCBwb2ludGVyc1xuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CkBAIC0yNDcwLDYgKzI4MDEsNyBAQAogCQkJCXZlcmJvc2UoImludmFsaWQgQlBGX0xEIG1vZGVcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQorCQkJcmVzZXRfcmVnX3JhbmdlX3ZhbHVlcyhyZWdzLCBpbnNuLT5kc3RfcmVnKTsKIAkJfSBlbHNlIHsKIAkJCXZlcmJvc2UoInVua25vd24gaW5zbiBjbGFzcyAlZFxuIiwgY2xhc3MpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yNDgyLDE0ICsyODE0LDI4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgY2hlY2tfbWFwX3Byb2dfY29tcGF0aWJpbGl0eShzdHJ1Y3QgYnBmX21hcCAqbWFwLAorCQkJCQlzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCisKK3sKKwlpZiAocHJvZy0+dHlwZSA9PSBCUEZfUFJPR19UWVBFX1BFUkZfRVZFTlQgJiYKKwkgICAgKG1hcC0+bWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX0hBU0ggfHwKKwkgICAgIG1hcC0+bWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9IQVNIKSAmJgorCSAgICAobWFwLT5tYXBfZmxhZ3MgJiBCUEZfRl9OT19QUkVBTExPQykpIHsKKwkJdmVyYm9zZSgicGVyZl9ldmVudCBwcm9ncmFtcyBjYW4gb25seSB1c2UgcHJlYWxsb2NhdGVkIGhhc2ggbWFwXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCiAvKiBsb29rIGZvciBwc2V1ZG8gZUJQRiBpbnN0cnVjdGlvbnMgdGhhdCBhY2Nlc3MgbWFwIEZEcyBhbmQKICAqIHJlcGxhY2UgdGhlbSB3aXRoIGFjdHVhbCBtYXAgcG9pbnRlcnMKICAqLwotc3RhdGljIGludCByZXBsYWNlX21hcF9mZF93aXRoX21hcF9wdHIoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52KQorc3RhdGljIGludCByZXBsYWNlX21hcF9mZF93aXRoX21hcF9wdHIoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudikKIHsKIAlzdHJ1Y3QgYnBmX2luc24gKmluc24gPSBlbnYtPnByb2ctPmluc25zaTsKIAlpbnQgaW5zbl9jbnQgPSBlbnYtPnByb2ctPmxlbjsKLQlpbnQgaSwgajsKKwlpbnQgaSwgaiwgZXJyOwogCiAJZm9yIChpID0gMDsgaSA8IGluc25fY250OyBpKyssIGluc24rKykgewogCQlpZiAoQlBGX0NMQVNTKGluc24tPmNvZGUpID09IEJQRl9MRFggJiYKQEAgLTI1MzMsNiArMjg3OSwxMiBAQAogCQkJCXJldHVybiBQVFJfRVJSKG1hcCk7CiAJCQl9CiAKKwkJCWVyciA9IGNoZWNrX21hcF9wcm9nX2NvbXBhdGliaWxpdHkobWFwLCBlbnYtPnByb2cpOworCQkJaWYgKGVycikgeworCQkJCWZkcHV0KGYpOworCQkJCXJldHVybiBlcnI7CisJCQl9CisKIAkJCS8qIHN0b3JlIG1hcCBwb2ludGVyIGluc2lkZSBCUEZfTERfSU1NNjQgaW5zdHJ1Y3Rpb24gKi8KIAkJCWluc25bMF0uaW1tID0gKHUzMikgKHVuc2lnbmVkIGxvbmcpIG1hcDsKIAkJCWluc25bMV0uaW1tID0gKCh1NjQpICh1bnNpZ25lZCBsb25nKSBtYXApID4+IDMyOwpAQCAtMjU3Niw3ICsyOTI4LDcgQEAKIH0KIAogLyogZHJvcCByZWZjbnQgb2YgbWFwcyB1c2VkIGJ5IHRoZSByZWplY3RlZCBwcm9ncmFtICovCi1zdGF0aWMgdm9pZCByZWxlYXNlX21hcHMoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52KQorc3RhdGljIHZvaWQgcmVsZWFzZV9tYXBzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpCiB7CiAJaW50IGk7CiAKQEAgLTI1ODUsNyArMjkzNyw3IEBACiB9CiAKIC8qIGNvbnZlcnQgcHNldWRvIEJQRl9MRF9JTU02NCBpbnRvIGdlbmVyaWMgQlBGX0xEX0lNTTY0ICovCi1zdGF0aWMgdm9pZCBjb252ZXJ0X3BzZXVkb19sZF9pbW02NChzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYpCitzdGF0aWMgdm9pZCBjb252ZXJ0X3BzZXVkb19sZF9pbW02NChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQogewogCXN0cnVjdCBicGZfaW5zbiAqaW5zbiA9IGVudi0+cHJvZy0+aW5zbnNpOwogCWludCBpbnNuX2NudCA9IGVudi0+cHJvZy0+bGVuOwpAQCAtMjU5OSw2MiArMjk1MSw3NCBAQAogLyogY29udmVydCBsb2FkIGluc3RydWN0aW9ucyB0aGF0IGFjY2VzcyBmaWVsZHMgb2YgJ3N0cnVjdCBfX3NrX2J1ZmYnCiAgKiBpbnRvIHNlcXVlbmNlIG9mIGluc3RydWN0aW9ucyB0aGF0IGFjY2VzcyBmaWVsZHMgb2YgJ3N0cnVjdCBza19idWZmJwogICovCi1zdGF0aWMgaW50IGNvbnZlcnRfY3R4X2FjY2Vzc2VzKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudikKK3N0YXRpYyBpbnQgY29udmVydF9jdHhfYWNjZXNzZXMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudikKIHsKLQlzdHJ1Y3QgYnBmX2luc24gKmluc24gPSBlbnYtPnByb2ctPmluc25zaTsKLQlpbnQgaW5zbl9jbnQgPSBlbnYtPnByb2ctPmxlbjsKLQlzdHJ1Y3QgYnBmX2luc24gaW5zbl9idWZbMTZdOworCWNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzICpvcHMgPSBlbnYtPnByb2ctPmF1eC0+b3BzOworCWNvbnN0IGludCBpbnNuX2NudCA9IGVudi0+cHJvZy0+bGVuOworCXN0cnVjdCBicGZfaW5zbiBpbnNuX2J1ZlsxNl0sICppbnNuOwogCXN0cnVjdCBicGZfcHJvZyAqbmV3X3Byb2c7CiAJZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZTsKLQlpbnQgaTsKKwlpbnQgaSwgY250LCBkZWx0YSA9IDA7CiAKLQlpZiAoIWVudi0+cHJvZy0+YXV4LT5vcHMtPmNvbnZlcnRfY3R4X2FjY2VzcykKKwlpZiAob3BzLT5nZW5fcHJvbG9ndWUpIHsKKwkJY250ID0gb3BzLT5nZW5fcHJvbG9ndWUoaW5zbl9idWYsIGVudi0+c2Vlbl9kaXJlY3Rfd3JpdGUsCisJCQkJCWVudi0+cHJvZyk7CisJCWlmIChjbnQgPj0gQVJSQVlfU0laRShpbnNuX2J1ZikpIHsKKwkJCXZlcmJvc2UoImJwZiB2ZXJpZmllciBpcyBtaXNjb25maWd1cmVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgaWYgKGNudCkgeworCQkJbmV3X3Byb2cgPSBicGZfcGF0Y2hfaW5zbl9zaW5nbGUoZW52LT5wcm9nLCAwLAorCQkJCQkJCSBpbnNuX2J1ZiwgY250KTsKKwkJCWlmICghbmV3X3Byb2cpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQllbnYtPnByb2cgPSBuZXdfcHJvZzsKKwkJCWRlbHRhICs9IGNudCAtIDE7CisJCX0KKwl9CisKKwlpZiAoIW9wcy0+Y29udmVydF9jdHhfYWNjZXNzKQogCQlyZXR1cm4gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBpbnNuX2NudDsgaSsrLCBpbnNuKyspIHsKLQkJdTMyIGluc25fZGVsdGEsIGNudDsKKwlpbnNuID0gZW52LT5wcm9nLT5pbnNuc2kgKyBkZWx0YTsKIAotCQlpZiAoaW5zbi0+Y29kZSA9PSAoQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfVykpCisJZm9yIChpID0gMDsgaSA8IGluc25fY250OyBpKyssIGluc24rKykgeworCQlpZiAoaW5zbi0+Y29kZSA9PSAoQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfVykgfHwKKwkJICAgIGluc24tPmNvZGUgPT0gKEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX0RXKSkKIAkJCXR5cGUgPSBCUEZfUkVBRDsKLQkJZWxzZSBpZiAoaW5zbi0+Y29kZSA9PSAoQlBGX1NUWCB8IEJQRl9NRU0gfCBCUEZfVykpCisJCWVsc2UgaWYgKGluc24tPmNvZGUgPT0gKEJQRl9TVFggfCBCUEZfTUVNIHwgQlBGX1cpIHx8CisJCQkgaW5zbi0+Y29kZSA9PSAoQlBGX1NUWCB8IEJQRl9NRU0gfCBCUEZfRFcpKQogCQkJdHlwZSA9IEJQRl9XUklURTsKIAkJZWxzZQogCQkJY29udGludWU7CiAKLQkJaWYgKGluc24tPmltbSAhPSBQVFJfVE9fQ1RYKSB7Ci0JCQkvKiBjbGVhciBpbnRlcm5hbCBtYXJrICovCi0JCQlpbnNuLT5pbW0gPSAwOworCQlpZiAoZW52LT5pbnNuX2F1eF9kYXRhW2ldLnB0cl90eXBlICE9IFBUUl9UT19DVFgpCiAJCQljb250aW51ZTsKLQkJfQogCi0JCWNudCA9IGVudi0+cHJvZy0+YXV4LT5vcHMtPgotCQkJY29udmVydF9jdHhfYWNjZXNzKHR5cGUsIGluc24tPmRzdF9yZWcsIGluc24tPnNyY19yZWcsCi0JCQkJCSAgIGluc24tPm9mZiwgaW5zbl9idWYsIGVudi0+cHJvZyk7CisJCWNudCA9IG9wcy0+Y29udmVydF9jdHhfYWNjZXNzKHR5cGUsIGluc24tPmRzdF9yZWcsIGluc24tPnNyY19yZWcsCisJCQkJCSAgICAgIGluc24tPm9mZiwgaW5zbl9idWYsIGVudi0+cHJvZyk7CiAJCWlmIChjbnQgPT0gMCB8fCBjbnQgPj0gQVJSQVlfU0laRShpbnNuX2J1ZikpIHsKIAkJCXZlcmJvc2UoImJwZiB2ZXJpZmllciBpcyBtaXNjb25maWd1cmVkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJbmV3X3Byb2cgPSBicGZfcGF0Y2hfaW5zbl9zaW5nbGUoZW52LT5wcm9nLCBpLCBpbnNuX2J1ZiwgY250KTsKKwkJbmV3X3Byb2cgPSBicGZfcGF0Y2hfaW5zbl9zaW5nbGUoZW52LT5wcm9nLCBpICsgZGVsdGEsIGluc25fYnVmLAorCQkJCQkJIGNudCk7CiAJCWlmICghbmV3X3Byb2cpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQlpbnNuX2RlbHRhID0gY250IC0gMTsKKwkJZGVsdGEgKz0gY250IC0gMTsKIAogCQkvKiBrZWVwIHdhbGtpbmcgbmV3IHByb2dyYW0gYW5kIHNraXAgaW5zbnMgd2UganVzdCBpbnNlcnRlZCAqLwogCQllbnYtPnByb2cgPSBuZXdfcHJvZzsKLQkJaW5zbiAgICAgID0gbmV3X3Byb2ctPmluc25zaSArIGkgKyBpbnNuX2RlbHRhOwotCi0JCWluc25fY250ICs9IGluc25fZGVsdGE7Ci0JCWkgICAgICAgICs9IGluc25fZGVsdGE7CisJCWluc24gICAgICA9IG5ld19wcm9nLT5pbnNuc2kgKyBpICsgZGVsdGE7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGZyZWVfc3RhdGVzKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudikKK3N0YXRpYyB2b2lkIGZyZWVfc3RhdGVzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpCiB7Ci0Jc3RydWN0IHZlcmlmaWVyX3N0YXRlX2xpc3QgKnNsLCAqc2xuOworCXN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGVfbGlzdCAqc2wsICpzbG47CiAJaW50IGk7CiAKIAlpZiAoIWVudi0+ZXhwbG9yZWRfc3RhdGVzKQpAQCAtMjY3NywxOSArMzA0MSwyNCBAQAogaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0cikKIHsKIAljaGFyIF9fdXNlciAqbG9nX3VidWYgPSBOVUxMOwotCXN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudjsKKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52OwogCWludCByZXQgPSAtRUlOVkFMOwogCiAJaWYgKCgqcHJvZyktPmxlbiA8PSAwIHx8ICgqcHJvZyktPmxlbiA+IEJQRl9NQVhJTlNOUykKIAkJcmV0dXJuIC1FMkJJRzsKIAotCS8qICdzdHJ1Y3QgdmVyaWZpZXJfZW52JyBjYW4gYmUgZ2xvYmFsLCBidXQgc2luY2UgaXQncyBub3Qgc21hbGwsCisJLyogJ3N0cnVjdCBicGZfdmVyaWZpZXJfZW52JyBjYW4gYmUgZ2xvYmFsLCBidXQgc2luY2UgaXQncyBub3Qgc21hbGwsCiAJICogYWxsb2NhdGUvZnJlZSBpdCBldmVyeSB0aW1lIGJwZl9jaGVjaygpIGlzIGNhbGxlZAogCSAqLwotCWVudiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZXJpZmllcl9lbnYpLCBHRlBfS0VSTkVMKTsKKwllbnYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiksIEdGUF9LRVJORUwpOwogCWlmICghZW52KQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWVudi0+aW5zbl9hdXhfZGF0YSA9IHZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicGZfaW5zbl9hdXhfZGF0YSkgKgorCQkJCSAgICAgKCpwcm9nKS0+bGVuKTsKKwlyZXQgPSAtRU5PTUVNOworCWlmICghZW52LT5pbnNuX2F1eF9kYXRhKQorCQlnb3RvIGVycl9mcmVlX2VudjsKIAllbnYtPnByb2cgPSAqcHJvZzsKIAogCS8qIGdyYWIgdGhlIG11dGV4IHRvIHByb3RlY3QgZmV3IGdsb2JhbHMgdXNlZCBieSB2ZXJpZmllciAqLwpAQCAtMjcwOCwxMiArMzA3NywxMiBAQAogCQkvKiBsb2dfKiB2YWx1ZXMgaGF2ZSB0byBiZSBzYW5lICovCiAJCWlmIChsb2dfc2l6ZSA8IDEyOCB8fCBsb2dfc2l6ZSA+IFVJTlRfTUFYID4+IDggfHwKIAkJICAgIGxvZ19sZXZlbCA9PSAwIHx8IGxvZ191YnVmID09IE5VTEwpCi0JCQlnb3RvIGZyZWVfZW52OworCQkJZ290byBlcnJfdW5sb2NrOwogCiAJCXJldCA9IC1FTk9NRU07CiAJCWxvZ19idWYgPSB2bWFsbG9jKGxvZ19zaXplKTsKIAkJaWYgKCFsb2dfYnVmKQotCQkJZ290byBmcmVlX2VudjsKKwkJCWdvdG8gZXJyX3VubG9jazsKIAl9IGVsc2UgewogCQlsb2dfbGV2ZWwgPSAwOwogCX0KQEAgLTI3MjMsNyArMzA5Miw3IEBACiAJCWdvdG8gc2tpcF9mdWxsX2NoZWNrOwogCiAJZW52LT5leHBsb3JlZF9zdGF0ZXMgPSBrY2FsbG9jKGVudi0+cHJvZy0+bGVuLAotCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHZlcmlmaWVyX3N0YXRlX2xpc3QgKiksCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlX2xpc3QgKiksCiAJCQkJICAgICAgIEdGUF9VU0VSKTsKIAlyZXQgPSAtRU5PTUVNOwogCWlmICghZW52LT5leHBsb3JlZF9zdGF0ZXMpCkBAIC0yNzgyLDE0ICszMTUxLDY3IEBACiBmcmVlX2xvZ19idWY6CiAJaWYgKGxvZ19sZXZlbCkKIAkJdmZyZWUobG9nX2J1Zik7Ci1mcmVlX2VudjoKIAlpZiAoIWVudi0+cHJvZy0+YXV4LT51c2VkX21hcHMpCiAJCS8qIGlmIHdlIGRpZG4ndCBjb3B5IG1hcCBwb2ludGVycyBpbnRvIGJwZl9wcm9nX2luZm8sIHJlbGVhc2UKIAkJICogdGhlbSBub3cuIE90aGVyd2lzZSBmcmVlX2JwZl9wcm9nX2luZm8oKSB3aWxsIHJlbGVhc2UgdGhlbS4KIAkJICovCiAJCXJlbGVhc2VfbWFwcyhlbnYpOwogCSpwcm9nID0gZW52LT5wcm9nOwotCWtmcmVlKGVudik7CitlcnJfdW5sb2NrOgogCW11dGV4X3VubG9jaygmYnBmX3ZlcmlmaWVyX2xvY2spOworCXZmcmVlKGVudi0+aW5zbl9hdXhfZGF0YSk7CitlcnJfZnJlZV9lbnY6CisJa2ZyZWUoZW52KTsKIAlyZXR1cm4gcmV0OwogfQorCitpbnQgYnBmX2FuYWx5emVyKHN0cnVjdCBicGZfcHJvZyAqcHJvZywgY29uc3Qgc3RydWN0IGJwZl9leHRfYW5hbHl6ZXJfb3BzICpvcHMsCisJCSB2b2lkICpwcml2KQoreworCXN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnY7CisJaW50IHJldDsKKworCWVudiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbnYpCisJCXJldHVybiAtRU5PTUVNOworCisJZW52LT5pbnNuX2F1eF9kYXRhID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IGJwZl9pbnNuX2F1eF9kYXRhKSAqCisJCQkJICAgICBwcm9nLT5sZW4pOworCXJldCA9IC1FTk9NRU07CisJaWYgKCFlbnYtPmluc25fYXV4X2RhdGEpCisJCWdvdG8gZXJyX2ZyZWVfZW52OworCWVudi0+cHJvZyA9IHByb2c7CisJZW52LT5hbmFseXplcl9vcHMgPSBvcHM7CisJZW52LT5hbmFseXplcl9wcml2ID0gcHJpdjsKKworCS8qIGdyYWIgdGhlIG11dGV4IHRvIHByb3RlY3QgZmV3IGdsb2JhbHMgdXNlZCBieSB2ZXJpZmllciAqLworCW11dGV4X2xvY2soJmJwZl92ZXJpZmllcl9sb2NrKTsKKworCWxvZ19sZXZlbCA9IDA7CisKKwllbnYtPmV4cGxvcmVkX3N0YXRlcyA9IGtjYWxsb2MoZW52LT5wcm9nLT5sZW4sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlX2xpc3QgKiksCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCXJldCA9IC1FTk9NRU07CisJaWYgKCFlbnYtPmV4cGxvcmVkX3N0YXRlcykKKwkJZ290byBza2lwX2Z1bGxfY2hlY2s7CisKKwlyZXQgPSBjaGVja19jZmcoZW52KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBza2lwX2Z1bGxfY2hlY2s7CisKKwllbnYtPmFsbG93X3B0cl9sZWFrcyA9IGNhcGFibGUoQ0FQX1NZU19BRE1JTik7CisKKwlyZXQgPSBkb19jaGVjayhlbnYpOworCitza2lwX2Z1bGxfY2hlY2s6CisJd2hpbGUgKHBvcF9zdGFjayhlbnYsIE5VTEwpID49IDApOworCWZyZWVfc3RhdGVzKGVudik7CisKKwltdXRleF91bmxvY2soJmJwZl92ZXJpZmllcl9sb2NrKTsKKwl2ZnJlZShlbnYtPmluc25fYXV4X2RhdGEpOworZXJyX2ZyZWVfZW52OgorCWtmcmVlKGVudik7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJwZl9hbmFseXplcik7CmRpZmYgLS1naXQgYS9rZXJuZWwvY2dyb3VwLmMgYi9rZXJuZWwvY2dyb3VwLmMKaW5kZXggZDFjNTFiNy4uOWJhMjgzMTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jZ3JvdXAuYworKysgYi9rZXJuZWwvY2dyb3VwLmMKQEAgLTM0NDYsOSArMzQ0NiwyOCBAQAogCSAqIEV4Y2VwdCBmb3IgdGhlIHJvb3QsIHN1YnRyZWVfY29udHJvbCBtdXN0IGJlIHplcm8gZm9yIGEgY2dyb3VwCiAJICogd2l0aCB0YXNrcyBzbyB0aGF0IGNoaWxkIGNncm91cHMgZG9uJ3QgY29tcGV0ZSBhZ2FpbnN0IHRhc2tzLgogCSAqLwotCWlmIChlbmFibGUgJiYgY2dyb3VwX3BhcmVudChjZ3JwKSAmJiAhbGlzdF9lbXB0eSgmY2dycC0+Y3NldF9saW5rcykpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dF91bmxvY2s7CisJaWYgKGVuYWJsZSAmJiBjZ3JvdXBfcGFyZW50KGNncnApKSB7CisJCXN0cnVjdCBjZ3JwX2NzZXRfbGluayAqbGluazsKKworCQkvKgorCQkgKiBCZWNhdXNlIG5hbWVzcGFjZXMgcGluIGNzZXRzIHRvbywgQGNncnAtPmNzZXRfbGlua3MKKwkJICogbWlnaHQgbm90IGJlIGVtcHR5IGV2ZW4gd2hlbiBAY2dycCBpcyBlbXB0eS4gIFdhbGsgYW5kCisJCSAqIHZlcmlmeSBlYWNoIGNzZXQuCisJCSAqLworCQlzcGluX2xvY2tfaXJxKCZjc3Nfc2V0X2xvY2spOworCisJCXJldCA9IDA7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobGluaywgJmNncnAtPmNzZXRfbGlua3MsIGNzZXRfbGluaykgeworCQkJaWYgKGNzc19zZXRfcG9wdWxhdGVkKGxpbmstPmNzZXQpKSB7CisJCQkJcmV0ID0gLUVCVVNZOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxKCZjc3Nfc2V0X2xvY2spOworCisJCWlmIChyZXQpCisJCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCiAJLyogc2F2ZSBhbmQgdXBkYXRlIGNvbnRyb2wgbWFza3MgYW5kIHByZXBhcmUgY3NzZXMgKi8KQEAgLTM4OTksNyArMzkxOCw5IEBACiAgKiBjZ3JvdXBfdGFza19jb3VudCAtIGNvdW50IHRoZSBudW1iZXIgb2YgdGFza3MgaW4gYSBjZ3JvdXAuCiAgKiBAY2dycDogdGhlIGNncm91cCBpbiBxdWVzdGlvbgogICoKLSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRhc2tzIGluIHRoZSBjZ3JvdXAuCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0YXNrcyBpbiB0aGUgY2dyb3VwLiAgVGhlIHJldHVybmVkIG51bWJlciBjYW4gYmUKKyAqIGhpZ2hlciB0aGFuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHRhc2tzIGR1ZSB0byBjc3Nfc2V0IHJlZmVyZW5jZXMgZnJvbQorICogbmFtZXNwYWNlIHJvb3RzIGFuZCB0ZW1wb3JhcnkgdXNhZ2VzLgogICovCiBzdGF0aWMgaW50IGNncm91cF90YXNrX2NvdW50KGNvbnN0IHN0cnVjdCBjZ3JvdXAgKmNncnApCiB7CkBAIC01NjA2LDYgKzU2MjcsMTIgQEAKIAlCVUdfT04oY2dyb3VwX2luaXRfY2Z0eXBlcyhOVUxMLCBjZ3JvdXBfZGZsX2Jhc2VfZmlsZXMpKTsKIAlCVUdfT04oY2dyb3VwX2luaXRfY2Z0eXBlcyhOVUxMLCBjZ3JvdXBfbGVnYWN5X2Jhc2VfZmlsZXMpKTsKIAorCS8qCisJICogVGhlIGxhdGVuY3kgb2YgdGhlIHN5bmNocm9uaXplX3NjaGVkKCkgaXMgdG9vIGhpZ2ggZm9yIGNncm91cHMsCisJICogYXZvaWQgaXQgYXQgdGhlIGNvc3Qgb2YgZm9yY2luZyBhbGwgcmVhZGVycyBpbnRvIHRoZSBzbG93IHBhdGguCisJICovCisJcmN1X3N5bmNfZW50ZXJfc3RhcnQoJmNncm91cF90aHJlYWRncm91cF9yd3NlbS5yc3MpOworCiAJZ2V0X3VzZXJfbnMoaW5pdF9jZ3JvdXBfbnMudXNlcl9ucyk7CiAKIAltdXRleF9sb2NrKCZjZ3JvdXBfbXV0ZXgpOwpAQCAtNjI3MCw2ICs2Mjk3LDEyIEBACiAJaWYgKGNncm91cF9za19hbGxvY19kaXNhYmxlZCkKIAkJcmV0dXJuOwogCisJLyogU29ja2V0IGNsb25lIHBhdGggKi8KKwlpZiAoc2tjZC0+dmFsKSB7CisJCWNncm91cF9nZXQoc29ja19jZ3JvdXBfcHRyKHNrY2QpKTsKKwkJcmV0dXJuOworCX0KKwogCXJjdV9yZWFkX2xvY2soKTsKIAogCXdoaWxlICh0cnVlKSB7CmRpZmYgLS1naXQgYS9rZXJuZWwvY29uZmlncy90aW55LmNvbmZpZyBiL2tlcm5lbC9jb25maWdzL3RpbnkuY29uZmlnCmluZGV4IGMyZGU1NmEuLjdmYTBjNGEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jb25maWdzL3RpbnkuY29uZmlnCisrKyBiL2tlcm5lbC9jb25maWdzL3RpbnkuY29uZmlnCkBAIC0xLDQgKzEsMTIgQEAKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9QRVJGT1JNQU5DRSBpcyBub3Qgc2V0CiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorIyBDT05GSUdfS0VSTkVMX0daSVAgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19LRVJORUxfWFo9eQorIyBDT05GSUdfS0VSTkVMX0xaTyBpcyBub3Qgc2V0CisjIENPTkZJR19LRVJORUxfTFo0IGlzIG5vdCBzZXQKIENPTkZJR19PUFRJTUlaRV9JTkxJTklORz15CisjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogQ09ORklHX1NMT0I9eQpkaWZmIC0tZ2l0IGEva2VybmVsL2NwdS5jIGIva2VybmVsL2NwdS5jCmluZGV4IDM0MWJmODAuLjVkZjIwZDYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcHUuYworKysgYi9rZXJuZWwvY3B1LmMKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc21wYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3Bvd2VyLmg+CiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKQEAgLTM3LDggKzM5LDkgQEAKICAqIEB0aHJlYWQ6CVBvaW50ZXIgdG8gdGhlIGhvdHBsdWcgdGhyZWFkCiAgKiBAc2hvdWxkX3J1bjoJVGhyZWFkIHNob3VsZCBleGVjdXRlCiAgKiBAcm9sbGJhY2s6CVBlcmZvcm0gYSByb2xsYmFjawotICogQGNiX3N0YXQ6CVRoZSBzdGF0ZSBmb3IgYSBzaW5nbGUgY2FsbGJhY2sgKGluc3RhbGwvdW5pbnN0YWxsKQotICogQGNiOgkJU2luZ2xlIGNhbGxiYWNrIGZ1bmN0aW9uIChpbnN0YWxsL3VuaW5zdGFsbCkKKyAqIEBzaW5nbGU6CVNpbmdsZSBjYWxsYmFjayBpbnZvY2F0aW9uCisgKiBAYnJpbmd1cDoJU2luZ2xlIGNhbGxiYWNrIGJyaW5ndXAgb3IgdGVhcmRvd24gc2VsZWN0b3IKKyAqIEBjYl9zdGF0ZToJVGhlIHN0YXRlIGZvciBhIHNpbmdsZSBjYWxsYmFjayAoaW5zdGFsbC91bmluc3RhbGwpCiAgKiBAcmVzdWx0OglSZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgogICogQGRvbmU6CVNpZ25hbCBjb21wbGV0aW9uIHRvIHRoZSBpc3N1ZXIgb2YgdGhlIHRhc2sKICAqLwpAQCAtNDksOCArNTIsMTAgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRocmVhZDsKIAlib29sCQkJc2hvdWxkX3J1bjsKIAlib29sCQkJcm9sbGJhY2s7CisJYm9vbAkJCXNpbmdsZTsKKwlib29sCQkJYnJpbmd1cDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZQkqbm9kZTsKIAllbnVtIGNwdWhwX3N0YXRlCWNiX3N0YXRlOwotCWludAkJCSgqY2IpKHVuc2lnbmVkIGludCBjcHUpOwogCWludAkJCXJlc3VsdDsKIAlzdHJ1Y3QgY29tcGxldGlvbglkb25lOwogI2VuZGlmCkBAIC02OCwzNSArNzMsMTAzIEBACiAgKiBAY2FudF9zdG9wOglCcmluZ3VwL3RlYXJkb3duIGNhbid0IGJlIHN0b3BwZWQgYXQgdGhpcyBzdGVwCiAgKi8KIHN0cnVjdCBjcHVocF9zdGVwIHsKLQljb25zdCBjaGFyCSpuYW1lOwotCWludAkJKCpzdGFydHVwKSh1bnNpZ25lZCBpbnQgY3B1KTsKLQlpbnQJCSgqdGVhcmRvd24pKHVuc2lnbmVkIGludCBjcHUpOwotCWJvb2wJCXNraXBfb25lcnI7Ci0JYm9vbAkJY2FudF9zdG9wOworCWNvbnN0IGNoYXIJCSpuYW1lOworCXVuaW9uIHsKKwkJaW50CQkoKnNpbmdsZSkodW5zaWduZWQgaW50IGNwdSk7CisJCWludAkJKCptdWx0aSkodW5zaWduZWQgaW50IGNwdSwKKwkJCQkJIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKTsKKwl9IHN0YXJ0dXA7CisJdW5pb24geworCQlpbnQJCSgqc2luZ2xlKSh1bnNpZ25lZCBpbnQgY3B1KTsKKwkJaW50CQkoKm11bHRpKSh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQkgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpOworCX0gdGVhcmRvd247CisJc3RydWN0IGhsaXN0X2hlYWQJbGlzdDsKKwlib29sCQkJc2tpcF9vbmVycjsKKwlib29sCQkJY2FudF9zdG9wOworCWJvb2wJCQltdWx0aV9pbnN0YW5jZTsKIH07CiAKIHN0YXRpYyBERUZJTkVfTVVURVgoY3B1aHBfc3RhdGVfbXV0ZXgpOwogc3RhdGljIHN0cnVjdCBjcHVocF9zdGVwIGNwdWhwX2JwX3N0YXRlc1tdOwogc3RhdGljIHN0cnVjdCBjcHVocF9zdGVwIGNwdWhwX2FwX3N0YXRlc1tdOwogCitzdGF0aWMgYm9vbCBjcHVocF9pc19hcF9zdGF0ZShlbnVtIGNwdWhwX3N0YXRlIHN0YXRlKQoreworCS8qCisJICogVGhlIGV4dHJhIGNoZWNrIGZvciBDUFVIUF9URUFSRE9XTl9DUFUgaXMgb25seSBmb3IgZG9jdW1lbnRhdGlvbgorCSAqIHB1cnBvc2VzIGFzIHRoYXQgc3RhdGUgaXMgaGFuZGxlZCBleHBsaWNpdGx5IGluIGNwdV9kb3duLgorCSAqLworCXJldHVybiBzdGF0ZSA+IENQVUhQX0JSSU5HVVBfQ1BVICYmIHN0YXRlICE9IENQVUhQX1RFQVJET1dOX0NQVTsKK30KKworc3RhdGljIHN0cnVjdCBjcHVocF9zdGVwICpjcHVocF9nZXRfc3RlcChlbnVtIGNwdWhwX3N0YXRlIHN0YXRlKQoreworCXN0cnVjdCBjcHVocF9zdGVwICpzcDsKKworCXNwID0gY3B1aHBfaXNfYXBfc3RhdGUoc3RhdGUpID8gY3B1aHBfYXBfc3RhdGVzIDogY3B1aHBfYnBfc3RhdGVzOworCXJldHVybiBzcCArIHN0YXRlOworfQorCiAvKioKICAqIGNwdWhwX2ludm9rZV9jYWxsYmFjayBfIEludm9rZSB0aGUgY2FsbGJhY2tzIGZvciBhIGdpdmVuIHN0YXRlCiAgKiBAY3B1OglUaGUgY3B1IGZvciB3aGljaCB0aGUgY2FsbGJhY2sgc2hvdWxkIGJlIGludm9rZWQKICAqIEBzdGVwOglUaGUgc3RlcCBpbiB0aGUgc3RhdGUgbWFjaGluZQotICogQGNiOgkJVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGludm9rZQorICogQGJyaW5ndXA6CVRydWUgaWYgdGhlIGJyaW5ndXAgY2FsbGJhY2sgc2hvdWxkIGJlIGludm9rZWQKICAqCi0gKiBDYWxsZWQgZnJvbSBjcHUgaG90cGx1ZyBhbmQgZnJvbSB0aGUgc3RhdGUgcmVnaXN0ZXIgbWFjaGluZXJ5CisgKiBDYWxsZWQgZnJvbSBjcHUgaG90cGx1ZyBhbmQgZnJvbSB0aGUgc3RhdGUgcmVnaXN0ZXIgbWFjaGluZXJ5LgogICovCi1zdGF0aWMgaW50IGNwdWhwX2ludm9rZV9jYWxsYmFjayh1bnNpZ25lZCBpbnQgY3B1LCBlbnVtIGNwdWhwX3N0YXRlIHN0ZXAsCi0JCQkJIGludCAoKmNiKSh1bnNpZ25lZCBpbnQpKQorc3RhdGljIGludCBjcHVocF9pbnZva2VfY2FsbGJhY2sodW5zaWduZWQgaW50IGNwdSwgZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSwKKwkJCQkgYm9vbCBicmluZ3VwLCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKIHsKIAlzdHJ1Y3QgY3B1aHBfY3B1X3N0YXRlICpzdCA9IHBlcl9jcHVfcHRyKCZjcHVocF9zdGF0ZSwgY3B1KTsKLQlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY3B1aHBfc3RlcCAqc3RlcCA9IGNwdWhwX2dldF9zdGVwKHN0YXRlKTsKKwlpbnQgKCpjYm0pKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKTsKKwlpbnQgKCpjYikodW5zaWduZWQgaW50IGNwdSk7CisJaW50IHJldCwgY250OwogCi0JaWYgKGNiKSB7Ci0JCXRyYWNlX2NwdWhwX2VudGVyKGNwdSwgc3QtPnRhcmdldCwgc3RlcCwgY2IpOworCWlmICghc3RlcC0+bXVsdGlfaW5zdGFuY2UpIHsKKwkJY2IgPSBicmluZ3VwID8gc3RlcC0+c3RhcnR1cC5zaW5nbGUgOiBzdGVwLT50ZWFyZG93bi5zaW5nbGU7CisJCWlmICghY2IpCisJCQlyZXR1cm4gMDsKKwkJdHJhY2VfY3B1aHBfZW50ZXIoY3B1LCBzdC0+dGFyZ2V0LCBzdGF0ZSwgY2IpOwogCQlyZXQgPSBjYihjcHUpOwotCQl0cmFjZV9jcHVocF9leGl0KGNwdSwgc3QtPnN0YXRlLCBzdGVwLCByZXQpOworCQl0cmFjZV9jcHVocF9leGl0KGNwdSwgc3QtPnN0YXRlLCBzdGF0ZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJY2JtID0gYnJpbmd1cCA/IHN0ZXAtPnN0YXJ0dXAubXVsdGkgOiBzdGVwLT50ZWFyZG93bi5tdWx0aTsKKwlpZiAoIWNibSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTaW5nbGUgaW52b2NhdGlvbiBmb3IgaW5zdGFuY2UgYWRkL3JlbW92ZSAqLworCWlmIChub2RlKSB7CisJCXRyYWNlX2NwdWhwX211bHRpX2VudGVyKGNwdSwgc3QtPnRhcmdldCwgc3RhdGUsIGNibSwgbm9kZSk7CisJCXJldCA9IGNibShjcHUsIG5vZGUpOworCQl0cmFjZV9jcHVocF9leGl0KGNwdSwgc3QtPnN0YXRlLCBzdGF0ZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBTdGF0ZSB0cmFuc2l0aW9uLiBJbnZva2Ugb24gYWxsIGluc3RhbmNlcyAqLworCWNudCA9IDA7CisJaGxpc3RfZm9yX2VhY2gobm9kZSwgJnN0ZXAtPmxpc3QpIHsKKwkJdHJhY2VfY3B1aHBfbXVsdGlfZW50ZXIoY3B1LCBzdC0+dGFyZ2V0LCBzdGF0ZSwgY2JtLCBub2RlKTsKKwkJcmV0ID0gY2JtKGNwdSwgbm9kZSk7CisJCXRyYWNlX2NwdWhwX2V4aXQoY3B1LCBzdC0+c3RhdGUsIHN0YXRlLCByZXQpOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisJCWNudCsrOworCX0KKwlyZXR1cm4gMDsKK2VycjoKKwkvKiBSb2xsYmFjayB0aGUgaW5zdGFuY2VzIGlmIG9uZSBmYWlsZWQgKi8KKwljYm0gPSAhYnJpbmd1cCA/IHN0ZXAtPnN0YXJ0dXAubXVsdGkgOiBzdGVwLT50ZWFyZG93bi5tdWx0aTsKKwlpZiAoIWNibSkKKwkJcmV0dXJuIHJldDsKKworCWhsaXN0X2Zvcl9lYWNoKG5vZGUsICZzdGVwLT5saXN0KSB7CisJCWlmICghY250LS0pCisJCQlicmVhazsKKwkJY2JtKGNwdSwgbm9kZSk7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC0yNjAsMTAgKzMzMywxNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3B1X2hvdHBsdWdfZGlzYWJsZSk7CiAKK3N0YXRpYyB2b2lkIF9fY3B1X2hvdHBsdWdfZW5hYmxlKHZvaWQpCit7CisJaWYgKFdBUk5fT05DRSghY3B1X2hvdHBsdWdfZGlzYWJsZWQsICJVbmJhbGFuY2VkIGNwdSBob3RwbHVnIGVuYWJsZVxuIikpCisJCXJldHVybjsKKwljcHVfaG90cGx1Z19kaXNhYmxlZC0tOworfQorCiB2b2lkIGNwdV9ob3RwbHVnX2VuYWJsZSh2b2lkKQogewogCWNwdV9tYXBzX3VwZGF0ZV9iZWdpbigpOwotCVdBUk5fT04oLS1jcHVfaG90cGx1Z19kaXNhYmxlZCA8IDApOworCV9fY3B1X2hvdHBsdWdfZW5hYmxlKCk7CiAJY3B1X21hcHNfdXBkYXRlX2RvbmUoKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwdV9ob3RwbHVnX2VuYWJsZSk7CkBAIC0zMzAsMTIgKzQxMCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbm90aWZ5X3N0YXJ0aW5nKHVuc2lnbmVkIGludCBjcHUpCi17Ci0JY3B1X25vdGlmeShDUFVfU1RBUlRJTkcsIGNwdSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgYnJpbmd1cF93YWl0X2Zvcl9hcCh1bnNpZ25lZCBpbnQgY3B1KQogewogCXN0cnVjdCBjcHVocF9jcHVfc3RhdGUgKnN0ID0gcGVyX2NwdV9wdHIoJmNwdWhwX3N0YXRlLCBjcHUpOwpAQCAtMzQ5LDggKzQyMywxNiBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSA9IGlkbGVfdGhyZWFkX2dldChjcHUpOwogCWludCByZXQ7CiAKKwkvKgorCSAqIFNvbWUgYXJjaGl0ZWN0dXJlcyBoYXZlIHRvIHdhbGsgdGhlIGlycSBkZXNjcmlwdG9ycyB0bworCSAqIHNldHVwIHRoZSB2ZWN0b3Igc3BhY2UgZm9yIHRoZSBjcHUgd2hpY2ggY29tZXMgb25saW5lLgorCSAqIFByZXZlbnQgaXJxIGFsbG9jL2ZyZWUgYWNyb3NzIHRoZSBicmluZ3VwLgorCSAqLworCWlycV9sb2NrX3NwYXJzZSgpOworCiAJLyogQXJjaC1zcGVjaWZpYyBlbmFibGluZyBjb2RlLiAqLwogCXJldCA9IF9fY3B1X3VwKGNwdSwgaWRsZSk7CisJaXJxX3VubG9ja19zcGFyc2UoKTsKIAlpZiAocmV0KSB7CiAJCWNwdV9ub3RpZnkoQ1BVX1VQX0NBTkNFTEVELCBjcHUpOwogCQlyZXR1cm4gcmV0OwpAQCAtMzYzLDYyICs0NDUsNTUgQEAKIC8qCiAgKiBIb3RwbHVnIHN0YXRlIG1hY2hpbmUgcmVsYXRlZCBmdW5jdGlvbnMKICAqLwotc3RhdGljIHZvaWQgdW5kb19jcHVfZG93bih1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgY3B1aHBfY3B1X3N0YXRlICpzdCwKLQkJCSAgc3RydWN0IGNwdWhwX3N0ZXAgKnN0ZXBzKQorc3RhdGljIHZvaWQgdW5kb19jcHVfZG93bih1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgY3B1aHBfY3B1X3N0YXRlICpzdCkKIHsKIAlmb3IgKHN0LT5zdGF0ZSsrOyBzdC0+c3RhdGUgPCBzdC0+dGFyZ2V0OyBzdC0+c3RhdGUrKykgewotCQlzdHJ1Y3QgY3B1aHBfc3RlcCAqc3RlcCA9IHN0ZXBzICsgc3QtPnN0YXRlOworCQlzdHJ1Y3QgY3B1aHBfc3RlcCAqc3RlcCA9IGNwdWhwX2dldF9zdGVwKHN0LT5zdGF0ZSk7CiAKIAkJaWYgKCFzdGVwLT5za2lwX29uZXJyKQotCQkJY3B1aHBfaW52b2tlX2NhbGxiYWNrKGNwdSwgc3QtPnN0YXRlLCBzdGVwLT5zdGFydHVwKTsKKwkJCWNwdWhwX2ludm9rZV9jYWxsYmFjayhjcHUsIHN0LT5zdGF0ZSwgdHJ1ZSwgTlVMTCk7CiAJfQogfQogCiBzdGF0aWMgaW50IGNwdWhwX2Rvd25fY2FsbGJhY2tzKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBjcHVocF9jcHVfc3RhdGUgKnN0LAotCQkJCXN0cnVjdCBjcHVocF9zdGVwICpzdGVwcywgZW51bSBjcHVocF9zdGF0ZSB0YXJnZXQpCisJCQkJZW51bSBjcHVocF9zdGF0ZSB0YXJnZXQpCiB7CiAJZW51bSBjcHVocF9zdGF0ZSBwcmV2X3N0YXRlID0gc3QtPnN0YXRlOwogCWludCByZXQgPSAwOwogCiAJZm9yICg7IHN0LT5zdGF0ZSA+IHRhcmdldDsgc3QtPnN0YXRlLS0pIHsKLQkJc3RydWN0IGNwdWhwX3N0ZXAgKnN0ZXAgPSBzdGVwcyArIHN0LT5zdGF0ZTsKLQotCQlyZXQgPSBjcHVocF9pbnZva2VfY2FsbGJhY2soY3B1LCBzdC0+c3RhdGUsIHN0ZXAtPnRlYXJkb3duKTsKKwkJcmV0ID0gY3B1aHBfaW52b2tlX2NhbGxiYWNrKGNwdSwgc3QtPnN0YXRlLCBmYWxzZSwgTlVMTCk7CiAJCWlmIChyZXQpIHsKIAkJCXN0LT50YXJnZXQgPSBwcmV2X3N0YXRlOwotCQkJdW5kb19jcHVfZG93bihjcHUsIHN0LCBzdGVwcyk7CisJCQl1bmRvX2NwdV9kb3duKGNwdSwgc3QpOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgdW5kb19jcHVfdXAodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGNwdWhwX2NwdV9zdGF0ZSAqc3QsCi0JCQlzdHJ1Y3QgY3B1aHBfc3RlcCAqc3RlcHMpCitzdGF0aWMgdm9pZCB1bmRvX2NwdV91cCh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgY3B1aHBfY3B1X3N0YXRlICpzdCkKIHsKIAlmb3IgKHN0LT5zdGF0ZS0tOyBzdC0+c3RhdGUgPiBzdC0+dGFyZ2V0OyBzdC0+c3RhdGUtLSkgewotCQlzdHJ1Y3QgY3B1aHBfc3RlcCAqc3RlcCA9IHN0ZXBzICsgc3QtPnN0YXRlOworCQlzdHJ1Y3QgY3B1aHBfc3RlcCAqc3RlcCA9IGNwdWhwX2dldF9zdGVwKHN0LT5zdGF0ZSk7CiAKIAkJaWYgKCFzdGVwLT5za2lwX29uZXJyKQotCQkJY3B1aHBfaW52b2tlX2NhbGxiYWNrKGNwdSwgc3QtPnN0YXRlLCBzdGVwLT50ZWFyZG93bik7CisJCQljcHVocF9pbnZva2VfY2FsbGJhY2soY3B1LCBzdC0+c3RhdGUsIGZhbHNlLCBOVUxMKTsKIAl9CiB9CiAKIHN0YXRpYyBpbnQgY3B1aHBfdXBfY2FsbGJhY2tzKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBjcHVocF9jcHVfc3RhdGUgKnN0LAotCQkJICAgICAgc3RydWN0IGNwdWhwX3N0ZXAgKnN0ZXBzLCBlbnVtIGNwdWhwX3N0YXRlIHRhcmdldCkKKwkJCSAgICAgIGVudW0gY3B1aHBfc3RhdGUgdGFyZ2V0KQogewogCWVudW0gY3B1aHBfc3RhdGUgcHJldl9zdGF0ZSA9IHN0LT5zdGF0ZTsKIAlpbnQgcmV0ID0gMDsKIAogCXdoaWxlIChzdC0+c3RhdGUgPCB0YXJnZXQpIHsKLQkJc3RydWN0IGNwdWhwX3N0ZXAgKnN0ZXA7Ci0KIAkJc3QtPnN0YXRlKys7Ci0JCXN0ZXAgPSBzdGVwcyArIHN0LT5zdGF0ZTsKLQkJcmV0ID0gY3B1aHBfaW52b2tlX2NhbGxiYWNrKGNwdSwgc3QtPnN0YXRlLCBzdGVwLT5zdGFydHVwKTsKKwkJcmV0ID0gY3B1aHBfaW52b2tlX2NhbGxiYWNrKGNwdSwgc3QtPnN0YXRlLCB0cnVlLCBOVUxMKTsKIAkJaWYgKHJldCkgewogCQkJc3QtPnRhcmdldCA9IHByZXZfc3RhdGU7Ci0JCQl1bmRvX2NwdV91cChjcHUsIHN0LCBzdGVwcyk7CisJCQl1bmRvX2NwdV91cChjcHUsIHN0KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNDQ3LDEzICs1MjIsMTMgQEAKIHsKIAllbnVtIGNwdWhwX3N0YXRlIHRhcmdldCA9IG1heCgoaW50KXN0LT50YXJnZXQsIENQVUhQX1RFQVJET1dOX0NQVSk7CiAKLQlyZXR1cm4gY3B1aHBfZG93bl9jYWxsYmFja3MoY3B1LCBzdCwgY3B1aHBfYXBfc3RhdGVzLCB0YXJnZXQpOworCXJldHVybiBjcHVocF9kb3duX2NhbGxiYWNrcyhjcHUsIHN0LCB0YXJnZXQpOwogfQogCiAvKiBFeGVjdXRlIHRoZSBvbmxpbmUgc3RhcnR1cCBjYWxsYmFja3MuIFVzZWQgdG8gYmUgQ1BVX09OTElORSAqLwogc3RhdGljIGludCBjcHVocF9hcF9vbmxpbmUodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGNwdWhwX2NwdV9zdGF0ZSAqc3QpCiB7Ci0JcmV0dXJuIGNwdWhwX3VwX2NhbGxiYWNrcyhjcHUsIHN0LCBjcHVocF9hcF9zdGF0ZXMsIHN0LT50YXJnZXQpOworCXJldHVybiBjcHVocF91cF9jYWxsYmFja3MoY3B1LCBzdCwgc3QtPnRhcmdldCk7CiB9CiAKIC8qCkBAIC00NzYsMTggKzU1MSwyMCBAQAogCXN0LT5zaG91bGRfcnVuID0gZmFsc2U7CiAKIAkvKiBTaW5nbGUgY2FsbGJhY2sgaW52b2NhdGlvbiBmb3IgW3VuXWluc3RhbGwgPyAqLwotCWlmIChzdC0+Y2IpIHsKKwlpZiAoc3QtPnNpbmdsZSkgewogCQlpZiAoc3QtPmNiX3N0YXRlIDwgQ1BVSFBfQVBfT05MSU5FKSB7CiAJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCQkJcmV0ID0gY3B1aHBfaW52b2tlX2NhbGxiYWNrKGNwdSwgc3QtPmNiX3N0YXRlLCBzdC0+Y2IpOworCQkJcmV0ID0gY3B1aHBfaW52b2tlX2NhbGxiYWNrKGNwdSwgc3QtPmNiX3N0YXRlLAorCQkJCQkJICAgIHN0LT5icmluZ3VwLCBzdC0+bm9kZSk7CiAJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJCX0gZWxzZSB7Ci0JCQlyZXQgPSBjcHVocF9pbnZva2VfY2FsbGJhY2soY3B1LCBzdC0+Y2Jfc3RhdGUsIHN0LT5jYik7CisJCQlyZXQgPSBjcHVocF9pbnZva2VfY2FsbGJhY2soY3B1LCBzdC0+Y2Jfc3RhdGUsCisJCQkJCQkgICAgc3QtPmJyaW5ndXAsIHN0LT5ub2RlKTsKIAkJfQogCX0gZWxzZSBpZiAoc3QtPnJvbGxiYWNrKSB7CiAJCUJVR19PTihzdC0+c3RhdGUgPCBDUFVIUF9BUF9PTkxJTkVfSURMRSk7CiAKLQkJdW5kb19jcHVfZG93bihjcHUsIHN0LCBjcHVocF9hcF9zdGF0ZXMpOworCQl1bmRvX2NwdV9kb3duKGNwdSwgc3QpOwogCQkvKgogCQkgKiBUaGlzIGlzIGEgbW9tZW50YXJ5IHdvcmthcm91bmQgdG8ga2VlcCB0aGUgbm90aWZpZXIgdXNlcnMKIAkJICogaGFwcHkuIFdpbGwgZ28gYXdheSBvbmNlIHdlIGdvdCByaWQgb2YgdGhlIG5vdGlmaWVycy4KQEAgLTUwOSw4ICs1ODYsOSBAQAogfQogCiAvKiBJbnZva2UgYSBzaW5nbGUgY2FsbGJhY2sgb24gYSByZW1vdGUgY3B1ICovCi1zdGF0aWMgaW50IGNwdWhwX2ludm9rZV9hcF9jYWxsYmFjayhpbnQgY3B1LCBlbnVtIGNwdWhwX3N0YXRlIHN0YXRlLAotCQkJCSAgICBpbnQgKCpjYikodW5zaWduZWQgaW50KSkKK3N0YXRpYyBpbnQKK2NwdWhwX2ludm9rZV9hcF9jYWxsYmFjayhpbnQgY3B1LCBlbnVtIGNwdWhwX3N0YXRlIHN0YXRlLCBib29sIGJyaW5ndXAsCisJCQkgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCiB7CiAJc3RydWN0IGNwdWhwX2NwdV9zdGF0ZSAqc3QgPSBwZXJfY3B1X3B0cigmY3B1aHBfc3RhdGUsIGNwdSk7CiAKQEAgLTUyMiwxMCArNjAwLDEzIEBACiAJICogd2UgaW52b2tlIHRoZSB0aHJlYWQgZnVuY3Rpb24gZGlyZWN0bHkuCiAJICovCiAJaWYgKCFzdC0+dGhyZWFkKQotCQlyZXR1cm4gY3B1aHBfaW52b2tlX2NhbGxiYWNrKGNwdSwgc3RhdGUsIGNiKTsKKwkJcmV0dXJuIGNwdWhwX2ludm9rZV9jYWxsYmFjayhjcHUsIHN0YXRlLCBicmluZ3VwLCBub2RlKTsKIAogCXN0LT5jYl9zdGF0ZSA9IHN0YXRlOwotCXN0LT5jYiA9IGNiOworCXN0LT5zaW5nbGUgPSB0cnVlOworCXN0LT5icmluZ3VwID0gYnJpbmd1cDsKKwlzdC0+bm9kZSA9IG5vZGU7CisKIAkvKgogCSAqIE1ha2Ugc3VyZSB0aGUgYWJvdmUgc3RvcmVzIGFyZSB2aXNpYmxlIGJlZm9yZSBzaG91bGRfcnVuIGJlY29tZXMKIAkgKiB0cnVlLiBQYWlyZWQgd2l0aCB0aGUgbWIoKSBhYm92ZSBpbiBjcHVocF90aHJlYWRfZnVuKCkKQEAgLTU0MSw3ICs2MjIsNyBAQAogc3RhdGljIHZvaWQgX19jcHVocF9raWNrX2FwX3dvcmsoc3RydWN0IGNwdWhwX2NwdV9zdGF0ZSAqc3QpCiB7CiAJc3QtPnJlc3VsdCA9IDA7Ci0Jc3QtPmNiID0gTlVMTDsKKwlzdC0+c2luZ2xlID0gZmFsc2U7CiAJLyoKIAkgKiBNYWtlIHN1cmUgdGhlIGFib3ZlIHN0b3JlcyBhcmUgdmlzaWJsZSBiZWZvcmUgc2hvdWxkX3J1biBiZWNvbWVzCiAJICogdHJ1ZS4gUGFpcmVkIHdpdGggdGhlIG1iKCkgYWJvdmUgaW4gY3B1aHBfdGhyZWFkX2Z1bigpCkBAIC02NzQsMTIgKzc1NSw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBub3RpZnlfZHlpbmcodW5zaWduZWQgaW50IGNwdSkKLXsKLQljcHVfbm90aWZ5KENQVV9EWUlORywgY3B1KTsKLQlyZXR1cm4gMDsKLX0KLQogLyogVGFrZSB0aGlzIENQVSBkb3duLiAqLwogc3RhdGljIGludCB0YWtlX2NwdV9kb3duKHZvaWQgKl9wYXJhbSkKIHsKQEAgLTY5MiwxMiArNzY3LDE2IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKKwkvKgorCSAqIFdlIGdldCBoZXJlIHdoaWxlIHdlIGFyZSBpbiBDUFVIUF9URUFSRE9XTl9DUFUgc3RhdGUgYW5kIHdlIG11c3Qgbm90CisJICogZG8gdGhpcyBzdGVwIGFnYWluLgorCSAqLworCVdBUk5fT04oc3QtPnN0YXRlICE9IENQVUhQX1RFQVJET1dOX0NQVSk7CisJc3QtPnN0YXRlLS07CiAJLyogSW52b2tlIHRoZSBmb3JtZXIgQ1BVX0RZSU5HIGNhbGxiYWNrcyAqLwotCWZvciAoOyBzdC0+c3RhdGUgPiB0YXJnZXQ7IHN0LT5zdGF0ZS0tKSB7Ci0JCXN0cnVjdCBjcHVocF9zdGVwICpzdGVwID0gY3B1aHBfYXBfc3RhdGVzICsgc3QtPnN0YXRlOworCWZvciAoOyBzdC0+c3RhdGUgPiB0YXJnZXQ7IHN0LT5zdGF0ZS0tKQorCQljcHVocF9pbnZva2VfY2FsbGJhY2soY3B1LCBzdC0+c3RhdGUsIGZhbHNlLCBOVUxMKTsKIAotCQljcHVocF9pbnZva2VfY2FsbGJhY2soY3B1LCBzdC0+c3RhdGUsIHN0ZXAtPnRlYXJkb3duKTsKLQl9CiAJLyogR2l2ZSB1cCB0aW1la2VlcGluZyBkdXRpZXMgKi8KIAl0aWNrX2hhbmRvdmVyX2RvX3RpbWVyKCk7CiAJLyogUGFyayB0aGUgc3RvcHBlciB0aHJlYWQgKi8KQEAgLTczNCw3ICs4MTMsNyBAQAogCUJVR19PTihjcHVfb25saW5lKGNwdSkpOwogCiAJLyoKLQkgKiBUaGUgbWlncmF0aW9uX2NhbGwoKSBDUFVfRFlJTkcgY2FsbGJhY2sgd2lsbCBoYXZlIHJlbW92ZWQgYWxsCisJICogVGhlIENQVUhQX0FQX1NDSEVEX01JR1JBVEVfRFlJTkcgY2FsbGJhY2sgd2lsbCBoYXZlIHJlbW92ZWQgYWxsCiAJICogcnVubmFibGUgdGFza3MgZnJvbSB0aGUgY3B1LCB0aGVyZSdzIG9ubHkgdGhlIGlkbGUgdGFzayBsZWZ0IG5vdwogCSAqIHRoYXQgdGhlIG1pZ3JhdGlvbiB0aHJlYWQgaXMgZG9uZSBkb2luZyB0aGUgc3RvcF9tYWNoaW5lIHRoaW5nLgogCSAqCkBAIC03ODcsNyArODY2LDYgQEAKICNkZWZpbmUgbm90aWZ5X2Rvd25fcHJlcGFyZQlOVUxMCiAjZGVmaW5lIHRha2Vkb3duX2NwdQkJTlVMTAogI2RlZmluZSBub3RpZnlfZGVhZAkJTlVMTAotI2RlZmluZSBub3RpZnlfZHlpbmcJCU5VTEwKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCkBAIC04MzYsNyArOTE0LDcgQEAKIAkgKiBUaGUgQVAgYnJvdWdodCBpdHNlbGYgZG93biB0byBDUFVIUF9URUFSRE9XTl9DUFUuIFNvIHdlIG5lZWQKIAkgKiB0byBkbyB0aGUgZnVydGhlciBjbGVhbnVwcy4KIAkgKi8KLQlyZXQgPSBjcHVocF9kb3duX2NhbGxiYWNrcyhjcHUsIHN0LCBjcHVocF9icF9zdGF0ZXMsIHRhcmdldCk7CisJcmV0ID0gY3B1aHBfZG93bl9jYWxsYmFja3MoY3B1LCBzdCwgdGFyZ2V0KTsKIAlpZiAocmV0ICYmIHN0LT5zdGF0ZSA+IENQVUhQX1RFQVJET1dOX0NQVSAmJiBzdC0+c3RhdGUgPCBwcmV2X3N0YXRlKSB7CiAJCXN0LT50YXJnZXQgPSBwcmV2X3N0YXRlOwogCQlzdC0+cm9sbGJhY2sgPSB0cnVlOwpAQCAtODc3LDEwICs5NTUsOSBAQAogI2VuZGlmIC8qQ09ORklHX0hPVFBMVUdfQ1BVKi8KIAogLyoqCi0gKiBub3RpZnlfY3B1X3N0YXJ0aW5nKGNwdSkgLSBjYWxsIHRoZSBDUFVfU1RBUlRJTkcgbm90aWZpZXJzCisgKiBub3RpZnlfY3B1X3N0YXJ0aW5nKGNwdSkgLSBJbnZva2UgdGhlIGNhbGxiYWNrcyBvbiB0aGUgc3RhcnRpbmcgQ1BVCiAgKiBAY3B1OiBjcHUgdGhhdCBqdXN0IHN0YXJ0ZWQKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSBjcHVfY2hhaW4gbm90aWZpZXJzIHdpdGggQ1BVX1NUQVJUSU5HLgogICogSXQgbXVzdCBiZSBjYWxsZWQgYnkgdGhlIGFyY2ggY29kZSBvbiB0aGUgbmV3IGNwdSwgYmVmb3JlIHRoZSBuZXcgY3B1CiAgKiBlbmFibGVzIGludGVycnVwdHMgYW5kIGJlZm9yZSB0aGUgImJvb3QiIGNwdSByZXR1cm5zIGZyb20gX19jcHVfdXAoKS4KICAqLwpAQCAtODg5LDEyICs5NjYsMTAgQEAKIAlzdHJ1Y3QgY3B1aHBfY3B1X3N0YXRlICpzdCA9IHBlcl9jcHVfcHRyKCZjcHVocF9zdGF0ZSwgY3B1KTsKIAllbnVtIGNwdWhwX3N0YXRlIHRhcmdldCA9IG1pbigoaW50KXN0LT50YXJnZXQsIENQVUhQX0FQX09OTElORSk7CiAKKwlyY3VfY3B1X3N0YXJ0aW5nKGNwdSk7CS8qIEVuYWJsZXMgUkNVIHVzYWdlIG9uIHRoaXMgQ1BVLiAqLwogCXdoaWxlIChzdC0+c3RhdGUgPCB0YXJnZXQpIHsKLQkJc3RydWN0IGNwdWhwX3N0ZXAgKnN0ZXA7Ci0KIAkJc3QtPnN0YXRlKys7Ci0JCXN0ZXAgPSBjcHVocF9hcF9zdGF0ZXMgKyBzdC0+c3RhdGU7Ci0JCWNwdWhwX2ludm9rZV9jYWxsYmFjayhjcHUsIHN0LT5zdGF0ZSwgc3RlcC0+c3RhcnR1cCk7CisJCWNwdWhwX2ludm9rZV9jYWxsYmFjayhjcHUsIHN0LT5zdGF0ZSwgdHJ1ZSwgTlVMTCk7CiAJfQogfQogCkBAIC05NzksNyArMTA1NCw3IEBACiAJICogcmVzcG9uc2libGUgZm9yIGJyaW5naW5nIGl0IHVwIHRvIHRoZSB0YXJnZXQgc3RhdGUuCiAJICovCiAJdGFyZ2V0ID0gbWluKChpbnQpdGFyZ2V0LCBDUFVIUF9CUklOR1VQX0NQVSk7Ci0JcmV0ID0gY3B1aHBfdXBfY2FsbGJhY2tzKGNwdSwgc3QsIGNwdWhwX2JwX3N0YXRlcywgdGFyZ2V0KTsKKwlyZXQgPSBjcHVocF91cF9jYWxsYmFja3MoY3B1LCBzdCwgdGFyZ2V0KTsKIG91dDoKIAljcHVfaG90cGx1Z19kb25lKCk7CiAJcmV0dXJuIHJldDsKQEAgLTEwMjQsMTIgKzEwOTksMTMgQEAKICNpZmRlZiBDT05GSUdfUE1fU0xFRVBfU01QCiBzdGF0aWMgY3B1bWFza192YXJfdCBmcm96ZW5fY3B1czsKIAotaW50IGRpc2FibGVfbm9uYm9vdF9jcHVzKHZvaWQpCitpbnQgZnJlZXplX3NlY29uZGFyeV9jcHVzKGludCBwcmltYXJ5KQogewotCWludCBjcHUsIGZpcnN0X2NwdSwgZXJyb3IgPSAwOworCWludCBjcHUsIGVycm9yID0gMDsKIAogCWNwdV9tYXBzX3VwZGF0ZV9iZWdpbigpOwotCWZpcnN0X2NwdSA9IGNwdW1hc2tfZmlyc3QoY3B1X29ubGluZV9tYXNrKTsKKwlpZiAoIWNwdV9vbmxpbmUocHJpbWFyeSkpCisJCXByaW1hcnkgPSBjcHVtYXNrX2ZpcnN0KGNwdV9vbmxpbmVfbWFzayk7CiAJLyoKIAkgKiBXZSB0YWtlIGRvd24gYWxsIG9mIHRoZSBub24tYm9vdCBDUFVzIGluIG9uZSBzaG90IHRvIGF2b2lkIHJhY2VzCiAJICogd2l0aCB0aGUgdXNlcnNwYWNlIHRyeWluZyB0byB1c2UgdGhlIENQVSBob3RwbHVnIGF0IHRoZSBzYW1lIHRpbWUKQEAgLTEwMzgsNyArMTExNCw3IEBACiAKIAlwcl9pbmZvKCJEaXNhYmxpbmcgbm9uLWJvb3QgQ1BVcyAuLi5cbiIpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7Ci0JCWlmIChjcHUgPT0gZmlyc3RfY3B1KQorCQlpZiAoY3B1ID09IHByaW1hcnkpCiAJCQljb250aW51ZTsKIAkJdHJhY2Vfc3VzcGVuZF9yZXN1bWUoVFBTKCJDUFVfT0ZGIiksIGNwdSwgdHJ1ZSk7CiAJCWVycm9yID0gX2NwdV9kb3duKGNwdSwgMSwgQ1BVSFBfT0ZGTElORSk7CkBAIC0xMDgxLDcgKzExNTcsNyBAQAogCiAJLyogQWxsb3cgZXZlcnlvbmUgdG8gdXNlIHRoZSBDUFUgaG90cGx1ZyBhZ2FpbiAqLwogCWNwdV9tYXBzX3VwZGF0ZV9iZWdpbigpOwotCVdBUk5fT04oLS1jcHVfaG90cGx1Z19kaXNhYmxlZCA8IDApOworCV9fY3B1X2hvdHBsdWdfZW5hYmxlKCk7CiAJaWYgKGNwdW1hc2tfZW1wdHkoZnJvemVuX2NwdXMpKQogCQlnb3RvIG91dDsKIApAQCAtMTE3MCw0MCArMTI0Niw1MCBAQAogc3RhdGljIHN0cnVjdCBjcHVocF9zdGVwIGNwdWhwX2JwX3N0YXRlc1tdID0gewogCVtDUFVIUF9PRkZMSU5FXSA9IHsKIAkJLm5hbWUJCQk9ICJvZmZsaW5lIiwKLQkJLnN0YXJ0dXAJCT0gTlVMTCwKLQkJLnRlYXJkb3duCQk9IE5VTEwsCisJCS5zdGFydHVwLnNpbmdsZQkJPSBOVUxMLAorCQkudGVhcmRvd24uc2luZ2xlCT0gTlVMTCwKIAl9LAogI2lmZGVmIENPTkZJR19TTVAKIAlbQ1BVSFBfQ1JFQVRFX1RIUkVBRFNdPSB7Ci0JCS5uYW1lCQkJPSAidGhyZWFkczpjcmVhdGUiLAotCQkuc3RhcnR1cAkJPSBzbXBib290X2NyZWF0ZV90aHJlYWRzLAotCQkudGVhcmRvd24JCT0gTlVMTCwKKwkJLm5hbWUJCQk9ICJ0aHJlYWRzOnByZXBhcmUiLAorCQkuc3RhcnR1cC5zaW5nbGUJCT0gc21wYm9vdF9jcmVhdGVfdGhyZWFkcywKKwkJLnRlYXJkb3duLnNpbmdsZQk9IE5VTEwsCiAJCS5jYW50X3N0b3AJCT0gdHJ1ZSwKIAl9LAogCVtDUFVIUF9QRVJGX1BSRVBBUkVdID0gewotCQkubmFtZSA9ICJwZXJmIHByZXBhcmUiLAotCQkuc3RhcnR1cCA9IHBlcmZfZXZlbnRfaW5pdF9jcHUsCi0JCS50ZWFyZG93biA9IHBlcmZfZXZlbnRfZXhpdF9jcHUsCisJCS5uYW1lCQkJPSAicGVyZjpwcmVwYXJlIiwKKwkJLnN0YXJ0dXAuc2luZ2xlCQk9IHBlcmZfZXZlbnRfaW5pdF9jcHUsCisJCS50ZWFyZG93bi5zaW5nbGUJPSBwZXJmX2V2ZW50X2V4aXRfY3B1LAogCX0sCiAJW0NQVUhQX1dPUktRVUVVRV9QUkVQXSA9IHsKLQkJLm5hbWUgPSAid29ya3F1ZXVlIHByZXBhcmUiLAotCQkuc3RhcnR1cCA9IHdvcmtxdWV1ZV9wcmVwYXJlX2NwdSwKLQkJLnRlYXJkb3duID0gTlVMTCwKKwkJLm5hbWUJCQk9ICJ3b3JrcXVldWU6cHJlcGFyZSIsCisJCS5zdGFydHVwLnNpbmdsZQkJPSB3b3JrcXVldWVfcHJlcGFyZV9jcHUsCisJCS50ZWFyZG93bi5zaW5nbGUJPSBOVUxMLAogCX0sCiAJW0NQVUhQX0hSVElNRVJTX1BSRVBBUkVdID0gewotCQkubmFtZSA9ICJocnRpbWVycyBwcmVwYXJlIiwKLQkJLnN0YXJ0dXAgPSBocnRpbWVyc19wcmVwYXJlX2NwdSwKLQkJLnRlYXJkb3duID0gaHJ0aW1lcnNfZGVhZF9jcHUsCisJCS5uYW1lCQkJPSAiaHJ0aW1lcnM6cHJlcGFyZSIsCisJCS5zdGFydHVwLnNpbmdsZQkJPSBocnRpbWVyc19wcmVwYXJlX2NwdSwKKwkJLnRlYXJkb3duLnNpbmdsZQk9IGhydGltZXJzX2RlYWRfY3B1LAogCX0sCiAJW0NQVUhQX1NNUENGRF9QUkVQQVJFXSA9IHsKLQkJLm5hbWUgPSAiU01QQ0ZEIHByZXBhcmUiLAotCQkuc3RhcnR1cCA9IHNtcGNmZF9wcmVwYXJlX2NwdSwKLQkJLnRlYXJkb3duID0gc21wY2ZkX2RlYWRfY3B1LAorCQkubmFtZQkJCT0gInNtcGNmZDpwcmVwYXJlIiwKKwkJLnN0YXJ0dXAuc2luZ2xlCQk9IHNtcGNmZF9wcmVwYXJlX2NwdSwKKwkJLnRlYXJkb3duLnNpbmdsZQk9IHNtcGNmZF9kZWFkX2NwdSwKKwl9LAorCVtDUFVIUF9SRUxBWV9QUkVQQVJFXSA9IHsKKwkJLm5hbWUJCQk9ICJyZWxheTpwcmVwYXJlIiwKKwkJLnN0YXJ0dXAuc2luZ2xlCQk9IHJlbGF5X3ByZXBhcmVfY3B1LAorCQkudGVhcmRvd24uc2luZ2xlCT0gTlVMTCwKKwl9LAorCVtDUFVIUF9TTEFCX1BSRVBBUkVdID0geworCQkubmFtZQkJCT0gInNsYWI6cHJlcGFyZSIsCisJCS5zdGFydHVwLnNpbmdsZQkJPSBzbGFiX3ByZXBhcmVfY3B1LAorCQkudGVhcmRvd24uc2luZ2xlCT0gc2xhYl9kZWFkX2NwdSwKIAl9LAogCVtDUFVIUF9SQ1VUUkVFX1BSRVBdID0gewotCQkubmFtZSA9ICJSQ1UtdHJlZSBwcmVwYXJlIiwKLQkJLnN0YXJ0dXAgPSByY3V0cmVlX3ByZXBhcmVfY3B1LAotCQkudGVhcmRvd24gPSByY3V0cmVlX2RlYWRfY3B1LAorCQkubmFtZQkJCT0gIlJDVS90cmVlOnByZXBhcmUiLAorCQkuc3RhcnR1cC5zaW5nbGUJCT0gcmN1dHJlZV9wcmVwYXJlX2NwdSwKKwkJLnRlYXJkb3duLnNpbmdsZQk9IHJjdXRyZWVfZGVhZF9jcHUsCiAJfSwKIAkvKgogCSAqIFByZXBhcmF0b3J5IGFuZCBkZWFkIG5vdGlmaWVycy4gV2lsbCBiZSByZXBsYWNlZCBvbmNlIHRoZSBub3RpZmllcnMKQEAgLTEyMTEsOCArMTI5Nyw4IEBACiAJICovCiAJW0NQVUhQX05PVElGWV9QUkVQQVJFXSA9IHsKIAkJLm5hbWUJCQk9ICJub3RpZnk6cHJlcGFyZSIsCi0JCS5zdGFydHVwCQk9IG5vdGlmeV9wcmVwYXJlLAotCQkudGVhcmRvd24JCT0gbm90aWZ5X2RlYWQsCisJCS5zdGFydHVwLnNpbmdsZQkJPSBub3RpZnlfcHJlcGFyZSwKKwkJLnRlYXJkb3duLnNpbmdsZQk9IG5vdGlmeV9kZWFkLAogCQkuc2tpcF9vbmVycgkJPSB0cnVlLAogCQkuY2FudF9zdG9wCQk9IHRydWUsCiAJfSwKQEAgLTEyMjIsMjAgKzEzMDgsMjEgQEAKIAkgKiBvdGhlcndpc2UgYSBSQ1Ugc3RhbGwgb2NjdXJzLgogCSAqLwogCVtDUFVIUF9USU1FUlNfREVBRF0gPSB7Ci0JCS5uYW1lID0gInRpbWVycyBkZWFkIiwKLQkJLnN0YXJ0dXAgPSBOVUxMLAotCQkudGVhcmRvd24gPSB0aW1lcnNfZGVhZF9jcHUsCisJCS5uYW1lCQkJPSAidGltZXJzOmRlYWQiLAorCQkuc3RhcnR1cC5zaW5nbGUJCT0gTlVMTCwKKwkJLnRlYXJkb3duLnNpbmdsZQk9IHRpbWVyc19kZWFkX2NwdSwKIAl9LAogCS8qIEtpY2tzIHRoZSBwbHVnZ2VkIGNwdSBpbnRvIGxpZmUgKi8KIAlbQ1BVSFBfQlJJTkdVUF9DUFVdID0gewogCQkubmFtZQkJCT0gImNwdTpicmluZ3VwIiwKLQkJLnN0YXJ0dXAJCT0gYnJpbmd1cF9jcHUsCi0JCS50ZWFyZG93bgkJPSBOVUxMLAorCQkuc3RhcnR1cC5zaW5nbGUJCT0gYnJpbmd1cF9jcHUsCisJCS50ZWFyZG93bi5zaW5nbGUJPSBOVUxMLAogCQkuY2FudF9zdG9wCQk9IHRydWUsCiAJfSwKIAlbQ1BVSFBfQVBfU01QQ0ZEX0RZSU5HXSA9IHsKLQkJLnN0YXJ0dXAgPSBOVUxMLAotCQkudGVhcmRvd24gPSBzbXBjZmRfZHlpbmdfY3B1LAorCQkubmFtZQkJCT0gInNtcGNmZDpkeWluZyIsCisJCS5zdGFydHVwLnNpbmdsZQkJPSBOVUxMLAorCQkudGVhcmRvd24uc2luZ2xlCT0gc21wY2ZkX2R5aW5nX2NwdSwKIAl9LAogCS8qCiAJICogSGFuZGxlZCBvbiBjb250cm9sbCBwcm9jZXNzb3IgdW50aWwgdGhlIHBsdWdnZWQgcHJvY2Vzc29yIG1hbmFnZXMKQEAgLTEyNDMsOCArMTMzMCw4IEBACiAJICovCiAJW0NQVUhQX1RFQVJET1dOX0NQVV0gPSB7CiAJCS5uYW1lCQkJPSAiY3B1OnRlYXJkb3duIiwKLQkJLnN0YXJ0dXAJCT0gTlVMTCwKLQkJLnRlYXJkb3duCQk9IHRha2Vkb3duX2NwdSwKKwkJLnN0YXJ0dXAuc2luZ2xlCQk9IE5VTEwsCisJCS50ZWFyZG93bi5zaW5nbGUJPSB0YWtlZG93bl9jcHUsCiAJCS5jYW50X3N0b3AJCT0gdHJ1ZSwKIAl9LAogI2Vsc2UKQEAgLTEyNzAsMjQgKzEzNTcsMTMgQEAKIAkvKiBGaXJzdCBzdGF0ZSBpcyBzY2hlZHVsZXIgY29udHJvbC4gSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgKi8KIAlbQ1BVSFBfQVBfU0NIRURfU1RBUlRJTkddID0gewogCQkubmFtZQkJCT0gInNjaGVkOnN0YXJ0aW5nIiwKLQkJLnN0YXJ0dXAJCT0gc2NoZWRfY3B1X3N0YXJ0aW5nLAotCQkudGVhcmRvd24JCT0gc2NoZWRfY3B1X2R5aW5nLAorCQkuc3RhcnR1cC5zaW5nbGUJCT0gc2NoZWRfY3B1X3N0YXJ0aW5nLAorCQkudGVhcmRvd24uc2luZ2xlCT0gc2NoZWRfY3B1X2R5aW5nLAogCX0sCiAJW0NQVUhQX0FQX1JDVVRSRUVfRFlJTkddID0gewotCQkuc3RhcnR1cCA9IE5VTEwsCi0JCS50ZWFyZG93biA9IHJjdXRyZWVfZHlpbmdfY3B1LAotCX0sCi0JLyoKLQkgKiBMb3cgbGV2ZWwgc3RhcnR1cC90ZWFyZG93biBub3RpZmllcnMuIFJ1biB3aXRoIGludGVycnVwdHMKLQkgKiBkaXNhYmxlZC4gV2lsbCBiZSByZW1vdmVkIG9uY2UgdGhlIG5vdGlmaWVycyBhcmUgY29udmVydGVkIHRvCi0JICogc3RhdGVzLgotCSAqLwotCVtDUFVIUF9BUF9OT1RJRllfU1RBUlRJTkddID0gewotCQkubmFtZQkJCT0gIm5vdGlmeTpzdGFydGluZyIsCi0JCS5zdGFydHVwCQk9IG5vdGlmeV9zdGFydGluZywKLQkJLnRlYXJkb3duCQk9IG5vdGlmeV9keWluZywKLQkJLnNraXBfb25lcnIJCT0gdHJ1ZSwKLQkJLmNhbnRfc3RvcAkJPSB0cnVlLAorCQkubmFtZQkJCT0gIlJDVS90cmVlOmR5aW5nIiwKKwkJLnN0YXJ0dXAuc2luZ2xlCQk9IE5VTEwsCisJCS50ZWFyZG93bi5zaW5nbGUJPSByY3V0cmVlX2R5aW5nX2NwdSwKIAl9LAogCS8qIEVudHJ5IHN0YXRlIG9uIHN0YXJ0aW5nLiBJbnRlcnJ1cHRzIGVuYWJsZWQgZnJvbSBoZXJlIG9uLiBUcmFuc2llbnQKIAkgKiBzdGF0ZSBmb3Igc3luY2hyb25zaXphdGlvbiAqLwpAQCAtMTI5NiwyNCArMTM3MiwyNCBAQAogCX0sCiAJLyogSGFuZGxlIHNtcGJvb3QgdGhyZWFkcyBwYXJrL3VucGFyayAqLwogCVtDUFVIUF9BUF9TTVBCT09UX1RIUkVBRFNdID0gewotCQkubmFtZQkJCT0gInNtcGJvb3Q6dGhyZWFkcyIsCi0JCS5zdGFydHVwCQk9IHNtcGJvb3RfdW5wYXJrX3RocmVhZHMsCi0JCS50ZWFyZG93bgkJPSBOVUxMLAorCQkubmFtZQkJCT0gInNtcGJvb3QvdGhyZWFkczpvbmxpbmUiLAorCQkuc3RhcnR1cC5zaW5nbGUJCT0gc21wYm9vdF91bnBhcmtfdGhyZWFkcywKKwkJLnRlYXJkb3duLnNpbmdsZQk9IE5VTEwsCiAJfSwKIAlbQ1BVSFBfQVBfUEVSRl9PTkxJTkVdID0gewotCQkubmFtZSA9ICJwZXJmIG9ubGluZSIsCi0JCS5zdGFydHVwID0gcGVyZl9ldmVudF9pbml0X2NwdSwKLQkJLnRlYXJkb3duID0gcGVyZl9ldmVudF9leGl0X2NwdSwKKwkJLm5hbWUJCQk9ICJwZXJmOm9ubGluZSIsCisJCS5zdGFydHVwLnNpbmdsZQkJPSBwZXJmX2V2ZW50X2luaXRfY3B1LAorCQkudGVhcmRvd24uc2luZ2xlCT0gcGVyZl9ldmVudF9leGl0X2NwdSwKIAl9LAogCVtDUFVIUF9BUF9XT1JLUVVFVUVfT05MSU5FXSA9IHsKLQkJLm5hbWUgPSAid29ya3F1ZXVlIG9ubGluZSIsCi0JCS5zdGFydHVwID0gd29ya3F1ZXVlX29ubGluZV9jcHUsCi0JCS50ZWFyZG93biA9IHdvcmtxdWV1ZV9vZmZsaW5lX2NwdSwKKwkJLm5hbWUJCQk9ICJ3b3JrcXVldWU6b25saW5lIiwKKwkJLnN0YXJ0dXAuc2luZ2xlCQk9IHdvcmtxdWV1ZV9vbmxpbmVfY3B1LAorCQkudGVhcmRvd24uc2luZ2xlCT0gd29ya3F1ZXVlX29mZmxpbmVfY3B1LAogCX0sCiAJW0NQVUhQX0FQX1JDVVRSRUVfT05MSU5FXSA9IHsKLQkJLm5hbWUgPSAiUkNVLXRyZWUgb25saW5lIiwKLQkJLnN0YXJ0dXAgPSByY3V0cmVlX29ubGluZV9jcHUsCi0JCS50ZWFyZG93biA9IHJjdXRyZWVfb2ZmbGluZV9jcHUsCisJCS5uYW1lCQkJPSAiUkNVL3RyZWU6b25saW5lIiwKKwkJLnN0YXJ0dXAuc2luZ2xlCQk9IHJjdXRyZWVfb25saW5lX2NwdSwKKwkJLnRlYXJkb3duLnNpbmdsZQk9IHJjdXRyZWVfb2ZmbGluZV9jcHUsCiAJfSwKIAogCS8qCkBAIC0xMzIyLDggKzEzOTgsOCBAQAogCSAqLwogCVtDUFVIUF9BUF9OT1RJRllfT05MSU5FXSA9IHsKIAkJLm5hbWUJCQk9ICJub3RpZnk6b25saW5lIiwKLQkJLnN0YXJ0dXAJCT0gbm90aWZ5X29ubGluZSwKLQkJLnRlYXJkb3duCQk9IG5vdGlmeV9kb3duX3ByZXBhcmUsCisJCS5zdGFydHVwLnNpbmdsZQkJPSBub3RpZnlfb25saW5lLAorCQkudGVhcmRvd24uc2luZ2xlCT0gbm90aWZ5X2Rvd25fcHJlcGFyZSwKIAkJLnNraXBfb25lcnIJCT0gdHJ1ZSwKIAl9LAogI2VuZGlmCkBAIC0xMzM1LDE2ICsxNDExLDE2IEBACiAJLyogTGFzdCBzdGF0ZSBpcyBzY2hlZHVsZXIgY29udHJvbCBzZXR0aW5nIHRoZSBjcHUgYWN0aXZlICovCiAJW0NQVUhQX0FQX0FDVElWRV0gPSB7CiAJCS5uYW1lCQkJPSAic2NoZWQ6YWN0aXZlIiwKLQkJLnN0YXJ0dXAJCT0gc2NoZWRfY3B1X2FjdGl2YXRlLAotCQkudGVhcmRvd24JCT0gc2NoZWRfY3B1X2RlYWN0aXZhdGUsCisJCS5zdGFydHVwLnNpbmdsZQkJPSBzY2hlZF9jcHVfYWN0aXZhdGUsCisJCS50ZWFyZG93bi5zaW5nbGUJPSBzY2hlZF9jcHVfZGVhY3RpdmF0ZSwKIAl9LAogI2VuZGlmCiAKIAkvKiBDUFUgaXMgZnVsbHkgdXAgYW5kIHJ1bm5pbmcuICovCiAJW0NQVUhQX09OTElORV0gPSB7CiAJCS5uYW1lCQkJPSAib25saW5lIiwKLQkJLnN0YXJ0dXAJCT0gTlVMTCwKLQkJLnRlYXJkb3duCQk9IE5VTEwsCisJCS5zdGFydHVwLnNpbmdsZQkJPSBOVUxMLAorCQkudGVhcmRvd24uc2luZ2xlCT0gTlVMTCwKIAl9LAogfTsKIApAQCAtMTM1Niw1NCArMTQzMiw0MiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgYm9vbCBjcHVocF9pc19hcF9zdGF0ZShlbnVtIGNwdWhwX3N0YXRlIHN0YXRlKQotewotCS8qCi0JICogVGhlIGV4dHJhIGNoZWNrIGZvciBDUFVIUF9URUFSRE9XTl9DUFUgaXMgb25seSBmb3IgZG9jdW1lbnRhdGlvbgotCSAqIHB1cnBvc2VzIGFzIHRoYXQgc3RhdGUgaXMgaGFuZGxlZCBleHBsaWNpdGVseSBpbiBjcHVfZG93bi4KLQkgKi8KLQlyZXR1cm4gc3RhdGUgPiBDUFVIUF9CUklOR1VQX0NQVSAmJiBzdGF0ZSAhPSBDUFVIUF9URUFSRE9XTl9DUFU7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY3B1aHBfc3RlcCAqY3B1aHBfZ2V0X3N0ZXAoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSkKLXsKLQlzdHJ1Y3QgY3B1aHBfc3RlcCAqc3A7Ci0KLQlzcCA9IGNwdWhwX2lzX2FwX3N0YXRlKHN0YXRlKSA/IGNwdWhwX2FwX3N0YXRlcyA6IGNwdWhwX2JwX3N0YXRlczsKLQlyZXR1cm4gc3AgKyBzdGF0ZTsKLX0KLQogc3RhdGljIHZvaWQgY3B1aHBfc3RvcmVfY2FsbGJhY2tzKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUsCiAJCQkJICBjb25zdCBjaGFyICpuYW1lLAogCQkJCSAgaW50ICgqc3RhcnR1cCkodW5zaWduZWQgaW50IGNwdSksCi0JCQkJICBpbnQgKCp0ZWFyZG93bikodW5zaWduZWQgaW50IGNwdSkpCisJCQkJICBpbnQgKCp0ZWFyZG93bikodW5zaWduZWQgaW50IGNwdSksCisJCQkJICBib29sIG11bHRpX2luc3RhbmNlKQogewogCS8qIChVbilJbnN0YWxsIHRoZSBjYWxsYmFja3MgZm9yIGZ1cnRoZXIgY3B1IGhvdHBsdWcgb3BlcmF0aW9ucyAqLwogCXN0cnVjdCBjcHVocF9zdGVwICpzcDsKIAogCW11dGV4X2xvY2soJmNwdWhwX3N0YXRlX211dGV4KTsKIAlzcCA9IGNwdWhwX2dldF9zdGVwKHN0YXRlKTsKLQlzcC0+c3RhcnR1cCA9IHN0YXJ0dXA7Ci0Jc3AtPnRlYXJkb3duID0gdGVhcmRvd247CisJc3AtPnN0YXJ0dXAuc2luZ2xlID0gc3RhcnR1cDsKKwlzcC0+dGVhcmRvd24uc2luZ2xlID0gdGVhcmRvd247CiAJc3AtPm5hbWUgPSBuYW1lOworCXNwLT5tdWx0aV9pbnN0YW5jZSA9IG11bHRpX2luc3RhbmNlOworCUlOSVRfSExJU1RfSEVBRCgmc3AtPmxpc3QpOwogCW11dGV4X3VubG9jaygmY3B1aHBfc3RhdGVfbXV0ZXgpOwogfQogCiBzdGF0aWMgdm9pZCAqY3B1aHBfZ2V0X3RlYXJkb3duX2NiKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUpCiB7Ci0JcmV0dXJuIGNwdWhwX2dldF9zdGVwKHN0YXRlKS0+dGVhcmRvd247CisJcmV0dXJuIGNwdWhwX2dldF9zdGVwKHN0YXRlKS0+dGVhcmRvd24uc2luZ2xlOwogfQogCiAvKgogICogQ2FsbCB0aGUgc3RhcnR1cC90ZWFyZG93biBmdW5jdGlvbiBmb3IgYSBzdGVwIGVpdGhlciBvbiB0aGUgQVAgb3IKICAqIG9uIHRoZSBjdXJyZW50IENQVS4KICAqLwotc3RhdGljIGludCBjcHVocF9pc3N1ZV9jYWxsKGludCBjcHUsIGVudW0gY3B1aHBfc3RhdGUgc3RhdGUsCi0JCQkgICAgaW50ICgqY2IpKHVuc2lnbmVkIGludCksIGJvb2wgYnJpbmd1cCkKK3N0YXRpYyBpbnQgY3B1aHBfaXNzdWVfY2FsbChpbnQgY3B1LCBlbnVtIGNwdWhwX3N0YXRlIHN0YXRlLCBib29sIGJyaW5ndXAsCisJCQkgICAgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCiB7CisJc3RydWN0IGNwdWhwX3N0ZXAgKnNwID0gY3B1aHBfZ2V0X3N0ZXAoc3RhdGUpOwogCWludCByZXQ7CiAKLQlpZiAoIWNiKQorCWlmICgoYnJpbmd1cCAmJiAhc3AtPnN0YXJ0dXAuc2luZ2xlKSB8fAorCSAgICAoIWJyaW5ndXAgJiYgIXNwLT50ZWFyZG93bi5zaW5nbGUpKQogCQlyZXR1cm4gMDsKIAkvKgogCSAqIFRoZSBub24gQVAgYm91bmQgY2FsbGJhY2tzIGNhbiBmYWlsIG9uIGJyaW5ndXAuIE9uIHRlYXJkb3duCkBAIC0xNDExLDExICsxNDc1LDExIEBACiAJICovCiAjaWZkZWYgQ09ORklHX1NNUAogCWlmIChjcHVocF9pc19hcF9zdGF0ZShzdGF0ZSkpCi0JCXJldCA9IGNwdWhwX2ludm9rZV9hcF9jYWxsYmFjayhjcHUsIHN0YXRlLCBjYik7CisJCXJldCA9IGNwdWhwX2ludm9rZV9hcF9jYWxsYmFjayhjcHUsIHN0YXRlLCBicmluZ3VwLCBub2RlKTsKIAllbHNlCi0JCXJldCA9IGNwdWhwX2ludm9rZV9jYWxsYmFjayhjcHUsIHN0YXRlLCBjYik7CisJCXJldCA9IGNwdWhwX2ludm9rZV9jYWxsYmFjayhjcHUsIHN0YXRlLCBicmluZ3VwLCBub2RlKTsKICNlbHNlCi0JcmV0ID0gY3B1aHBfaW52b2tlX2NhbGxiYWNrKGNwdSwgc3RhdGUsIGNiKTsKKwlyZXQgPSBjcHVocF9pbnZva2VfY2FsbGJhY2soY3B1LCBzdGF0ZSwgYnJpbmd1cCwgbm9kZSk7CiAjZW5kaWYKIAlCVUdfT04ocmV0ICYmICFicmluZ3VwKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTQyNywxMyArMTQ5MSwxMCBAQAogICogTm90ZTogVGhlIHRlYXJkb3duIGNhbGxiYWNrcyBmb3Igcm9sbGJhY2sgYXJlIG5vdCBhbGxvd2VkIHRvIGZhaWwhCiAgKi8KIHN0YXRpYyB2b2lkIGNwdWhwX3JvbGxiYWNrX2luc3RhbGwoaW50IGZhaWxlZGNwdSwgZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSwKLQkJCQkgICBpbnQgKCp0ZWFyZG93bikodW5zaWduZWQgaW50IGNwdSkpCisJCQkJICAgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCiB7CiAJaW50IGNwdTsKIAotCWlmICghdGVhcmRvd24pCi0JCXJldHVybjsKLQogCS8qIFJvbGwgYmFjayB0aGUgYWxyZWFkeSBleGVjdXRlZCBzdGVwcyBvbiB0aGUgb3RoZXIgY3B1cyAqLwogCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgewogCQlzdHJ1Y3QgY3B1aHBfY3B1X3N0YXRlICpzdCA9IHBlcl9jcHVfcHRyKCZjcHVocF9zdGF0ZSwgY3B1KTsKQEAgLTE0NDQsNyArMTUwNSw3IEBACiAKIAkJLyogRGlkIHdlIGludm9rZSB0aGUgc3RhcnR1cCBjYWxsIG9uIHRoYXQgY3B1ID8gKi8KIAkJaWYgKGNwdXN0YXRlID49IHN0YXRlKQotCQkJY3B1aHBfaXNzdWVfY2FsbChjcHUsIHN0YXRlLCB0ZWFyZG93biwgZmFsc2UpOworCQkJY3B1aHBfaXNzdWVfY2FsbChjcHUsIHN0YXRlLCBmYWxzZSwgbm9kZSk7CiAJfQogfQogCkBAIC0xNDcxLDYgKzE1MzIsNTIgQEAKIAlyZXR1cm4gLUVOT1NQQzsKIH0KIAoraW50IF9fY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlLAorCQkJICAgICAgIGJvb2wgaW52b2tlKQoreworCXN0cnVjdCBjcHVocF9zdGVwICpzcDsKKwlpbnQgY3B1OworCWludCByZXQ7CisKKwlzcCA9IGNwdWhwX2dldF9zdGVwKHN0YXRlKTsKKwlpZiAoc3AtPm11bHRpX2luc3RhbmNlID09IGZhbHNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdldF9vbmxpbmVfY3B1cygpOworCisJaWYgKCFpbnZva2UgfHwgIXNwLT5zdGFydHVwLm11bHRpKQorCQlnb3RvIGFkZF9ub2RlOworCisJLyoKKwkgKiBUcnkgdG8gY2FsbCB0aGUgc3RhcnR1cCBjYWxsYmFjayBmb3IgZWFjaCBwcmVzZW50IGNwdQorCSAqIGRlcGVuZGluZyBvbiB0aGUgaG90cGx1ZyBzdGF0ZSBvZiB0aGUgY3B1LgorCSAqLworCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgeworCQlzdHJ1Y3QgY3B1aHBfY3B1X3N0YXRlICpzdCA9IHBlcl9jcHVfcHRyKCZjcHVocF9zdGF0ZSwgY3B1KTsKKwkJaW50IGNwdXN0YXRlID0gc3QtPnN0YXRlOworCisJCWlmIChjcHVzdGF0ZSA8IHN0YXRlKQorCQkJY29udGludWU7CisKKwkJcmV0ID0gY3B1aHBfaXNzdWVfY2FsbChjcHUsIHN0YXRlLCB0cnVlLCBub2RlKTsKKwkJaWYgKHJldCkgeworCQkJaWYgKHNwLT50ZWFyZG93bi5tdWx0aSkKKwkJCQljcHVocF9yb2xsYmFja19pbnN0YWxsKGNwdSwgc3RhdGUsIG5vZGUpOworCQkJZ290byBlcnI7CisJCX0KKwl9CithZGRfbm9kZToKKwlyZXQgPSAwOworCW11dGV4X2xvY2soJmNwdWhwX3N0YXRlX211dGV4KTsKKwlobGlzdF9hZGRfaGVhZChub2RlLCAmc3AtPmxpc3QpOworCW11dGV4X3VubG9jaygmY3B1aHBfc3RhdGVfbXV0ZXgpOworCitlcnI6CisJcHV0X29ubGluZV9jcHVzKCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlKTsKKwogLyoqCiAgKiBfX2NwdWhwX3NldHVwX3N0YXRlIC0gU2V0dXAgdGhlIGNhbGxiYWNrcyBmb3IgYW4gaG90cGx1ZyBtYWNoaW5lIHN0YXRlCiAgKiBAc3RhdGU6CVRoZSBzdGF0ZSB0byBzZXR1cApAQCAtMTQ4NCw3ICsxNTkxLDggQEAKIGludCBfX2NwdWhwX3NldHVwX3N0YXRlKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUsCiAJCQljb25zdCBjaGFyICpuYW1lLCBib29sIGludm9rZSwKIAkJCWludCAoKnN0YXJ0dXApKHVuc2lnbmVkIGludCBjcHUpLAotCQkJaW50ICgqdGVhcmRvd24pKHVuc2lnbmVkIGludCBjcHUpKQorCQkJaW50ICgqdGVhcmRvd24pKHVuc2lnbmVkIGludCBjcHUpLAorCQkJYm9vbCBtdWx0aV9pbnN0YW5jZSkKIHsKIAlpbnQgY3B1LCByZXQgPSAwOwogCWludCBkeW5fc3RhdGUgPSAwOwpAQCAtMTUwMyw3ICsxNjExLDcgQEAKIAkJc3RhdGUgPSByZXQ7CiAJfQogCi0JY3B1aHBfc3RvcmVfY2FsbGJhY2tzKHN0YXRlLCBuYW1lLCBzdGFydHVwLCB0ZWFyZG93bik7CisJY3B1aHBfc3RvcmVfY2FsbGJhY2tzKHN0YXRlLCBuYW1lLCBzdGFydHVwLCB0ZWFyZG93biwgbXVsdGlfaW5zdGFuY2UpOwogCiAJaWYgKCFpbnZva2UgfHwgIXN0YXJ0dXApCiAJCWdvdG8gb3V0OwpAQCAtMTUxOSwxMCArMTYyNywxMSBAQAogCQlpZiAoY3B1c3RhdGUgPCBzdGF0ZSkKIAkJCWNvbnRpbnVlOwogCi0JCXJldCA9IGNwdWhwX2lzc3VlX2NhbGwoY3B1LCBzdGF0ZSwgc3RhcnR1cCwgdHJ1ZSk7CisJCXJldCA9IGNwdWhwX2lzc3VlX2NhbGwoY3B1LCBzdGF0ZSwgdHJ1ZSwgTlVMTCk7CiAJCWlmIChyZXQpIHsKLQkJCWNwdWhwX3JvbGxiYWNrX2luc3RhbGwoY3B1LCBzdGF0ZSwgdGVhcmRvd24pOwotCQkJY3B1aHBfc3RvcmVfY2FsbGJhY2tzKHN0YXRlLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJCWlmICh0ZWFyZG93bikKKwkJCQljcHVocF9yb2xsYmFja19pbnN0YWxsKGNwdSwgc3RhdGUsIE5VTEwpOworCQkJY3B1aHBfc3RvcmVfY2FsbGJhY2tzKHN0YXRlLCBOVUxMLCBOVUxMLCBOVUxMLCBmYWxzZSk7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KQEAgLTE1MzQsNiArMTY0Myw0MiBAQAogfQogRVhQT1JUX1NZTUJPTChfX2NwdWhwX3NldHVwX3N0YXRlKTsKIAoraW50IF9fY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUsCisJCQkJICBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgYm9vbCBpbnZva2UpCit7CisJc3RydWN0IGNwdWhwX3N0ZXAgKnNwID0gY3B1aHBfZ2V0X3N0ZXAoc3RhdGUpOworCWludCBjcHU7CisKKwlCVUdfT04oY3B1aHBfY2JfY2hlY2soc3RhdGUpKTsKKworCWlmICghc3AtPm11bHRpX2luc3RhbmNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdldF9vbmxpbmVfY3B1cygpOworCWlmICghaW52b2tlIHx8ICFjcHVocF9nZXRfdGVhcmRvd25fY2Ioc3RhdGUpKQorCQlnb3RvIHJlbW92ZTsKKwkvKgorCSAqIENhbGwgdGhlIHRlYXJkb3duIGNhbGxiYWNrIGZvciBlYWNoIHByZXNlbnQgY3B1IGRlcGVuZGluZworCSAqIG9uIHRoZSBob3RwbHVnIHN0YXRlIG9mIHRoZSBjcHUuIFRoaXMgZnVuY3Rpb24gaXMgbm90CisJICogYWxsb3dlZCB0byBmYWlsIGN1cnJlbnRseSEKKwkgKi8KKwlmb3JfZWFjaF9wcmVzZW50X2NwdShjcHUpIHsKKwkJc3RydWN0IGNwdWhwX2NwdV9zdGF0ZSAqc3QgPSBwZXJfY3B1X3B0cigmY3B1aHBfc3RhdGUsIGNwdSk7CisJCWludCBjcHVzdGF0ZSA9IHN0LT5zdGF0ZTsKKworCQlpZiAoY3B1c3RhdGUgPj0gc3RhdGUpCisJCQljcHVocF9pc3N1ZV9jYWxsKGNwdSwgc3RhdGUsIGZhbHNlLCBub2RlKTsKKwl9CisKK3JlbW92ZToKKwltdXRleF9sb2NrKCZjcHVocF9zdGF0ZV9tdXRleCk7CisJaGxpc3RfZGVsKG5vZGUpOworCW11dGV4X3VubG9jaygmY3B1aHBfc3RhdGVfbXV0ZXgpOworCXB1dF9vbmxpbmVfY3B1cygpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX2NwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZSk7CiAvKioKICAqIF9fY3B1aHBfcmVtb3ZlX3N0YXRlIC0gUmVtb3ZlIHRoZSBjYWxsYmFja3MgZm9yIGFuIGhvdHBsdWcgbWFjaGluZSBzdGF0ZQogICogQHN0YXRlOglUaGUgc3RhdGUgdG8gcmVtb3ZlCkBAIC0xNTQ1LDE0ICsxNjkwLDIxIEBACiAgKi8KIHZvaWQgX19jcHVocF9yZW1vdmVfc3RhdGUoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSwgYm9vbCBpbnZva2UpCiB7Ci0JaW50ICgqdGVhcmRvd24pKHVuc2lnbmVkIGludCBjcHUpID0gY3B1aHBfZ2V0X3RlYXJkb3duX2NiKHN0YXRlKTsKKwlzdHJ1Y3QgY3B1aHBfc3RlcCAqc3AgPSBjcHVocF9nZXRfc3RlcChzdGF0ZSk7CiAJaW50IGNwdTsKIAogCUJVR19PTihjcHVocF9jYl9jaGVjayhzdGF0ZSkpOwogCiAJZ2V0X29ubGluZV9jcHVzKCk7CiAKLQlpZiAoIWludm9rZSB8fCAhdGVhcmRvd24pCisJaWYgKHNwLT5tdWx0aV9pbnN0YW5jZSkgeworCQlXQVJOKCFobGlzdF9lbXB0eSgmc3AtPmxpc3QpLAorCQkgICAgICJFcnJvcjogUmVtb3Zpbmcgc3RhdGUgJWQgd2hpY2ggaGFzIGluc3RhbmNlcyBsZWZ0LlxuIiwKKwkJICAgICBzdGF0ZSk7CisJCWdvdG8gcmVtb3ZlOworCX0KKworCWlmICghaW52b2tlIHx8ICFjcHVocF9nZXRfdGVhcmRvd25fY2Ioc3RhdGUpKQogCQlnb3RvIHJlbW92ZTsKIAogCS8qCkBAIC0xNTY1LDEwICsxNzE3LDEwIEBACiAJCWludCBjcHVzdGF0ZSA9IHN0LT5zdGF0ZTsKIAogCQlpZiAoY3B1c3RhdGUgPj0gc3RhdGUpCi0JCQljcHVocF9pc3N1ZV9jYWxsKGNwdSwgc3RhdGUsIHRlYXJkb3duLCBmYWxzZSk7CisJCQljcHVocF9pc3N1ZV9jYWxsKGNwdSwgc3RhdGUsIGZhbHNlLCBOVUxMKTsKIAl9CiByZW1vdmU6Ci0JY3B1aHBfc3RvcmVfY2FsbGJhY2tzKHN0YXRlLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwljcHVocF9zdG9yZV9jYWxsYmFja3Moc3RhdGUsIE5VTEwsIE5VTEwsIE5VTEwsIGZhbHNlKTsKIAlwdXRfb25saW5lX2NwdXMoKTsKIH0KIEVYUE9SVF9TWU1CT0woX19jcHVocF9yZW1vdmVfc3RhdGUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2NwdXNldC5jIGIva2VybmVsL2NwdXNldC5jCmluZGV4IGM3ZmQyNzcuLjJiNGMyMGEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcHVzZXQuYworKysgYi9rZXJuZWwvY3B1c2V0LmMKQEAgLTMyNSw4ICszMjUsNyBAQAogLyoKICAqIFJldHVybiBpbiBwbWFzayB0aGUgcG9ydGlvbiBvZiBhIGNwdXNldHMncyBjcHVzX2FsbG93ZWQgdGhhdAogICogYXJlIG9ubGluZS4gIElmIG5vbmUgYXJlIG9ubGluZSwgd2FsayB1cCB0aGUgY3B1c2V0IGhpZXJhcmNoeQotICogdW50aWwgd2UgZmluZCBvbmUgdGhhdCBkb2VzIGhhdmUgc29tZSBvbmxpbmUgY3B1cy4gIFRoZSB0b3AKLSAqIGNwdXNldCBhbHdheXMgaGFzIHNvbWUgY3B1cyBvbmxpbmUuCisgKiB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IGRvZXMgaGF2ZSBzb21lIG9ubGluZSBjcHVzLgogICoKICAqIE9uZSB3YXkgb3IgYW5vdGhlciwgd2UgZ3VhcmFudGVlIHRvIHJldHVybiBzb21lIG5vbi1lbXB0eSBzdWJzZXQKICAqIG9mIGNwdV9vbmxpbmVfbWFzay4KQEAgLTMzNSw4ICszMzQsMjAgQEAKICAqLwogc3RhdGljIHZvaWQgZ3VhcmFudGVlX29ubGluZV9jcHVzKHN0cnVjdCBjcHVzZXQgKmNzLCBzdHJ1Y3QgY3B1bWFzayAqcG1hc2spCiB7Ci0Jd2hpbGUgKCFjcHVtYXNrX2ludGVyc2VjdHMoY3MtPmVmZmVjdGl2ZV9jcHVzLCBjcHVfb25saW5lX21hc2spKQorCXdoaWxlICghY3B1bWFza19pbnRlcnNlY3RzKGNzLT5lZmZlY3RpdmVfY3B1cywgY3B1X29ubGluZV9tYXNrKSkgewogCQljcyA9IHBhcmVudF9jcyhjcyk7CisJCWlmICh1bmxpa2VseSghY3MpKSB7CisJCQkvKgorCQkJICogVGhlIHRvcCBjcHVzZXQgZG9lc24ndCBoYXZlIGFueSBvbmxpbmUgY3B1IGFzIGEKKwkJCSAqIGNvbnNlcXVlbmNlIG9mIGEgcmFjZSBiZXR3ZWVuIGNwdXNldF9ob3RwbHVnX3dvcmsKKwkJCSAqIGFuZCBjcHUgaG90cGx1ZyBub3RpZmllci4gIEJ1dCB3ZSBrbm93IHRoZSB0b3AKKwkJCSAqIGNwdXNldCdzIGVmZmVjdGl2ZV9jcHVzIGlzIG9uIGl0cyB3YXkgdG8gdG8gYmUKKwkJCSAqIGlkZW50aWNhbCB0byBjcHVfb25saW5lX21hc2suCisJCQkgKi8KKwkJCWNwdW1hc2tfY29weShwbWFzaywgY3B1X29ubGluZV9tYXNrKTsKKwkJCXJldHVybjsKKwkJfQorCX0KIAljcHVtYXNrX2FuZChwbWFzaywgY3MtPmVmZmVjdGl2ZV9jcHVzLCBjcHVfb25saW5lX21hc2spOwogfQogCkBAIC0yMDY5LDYgKzIwODAsMjAgQEAKIAltdXRleF91bmxvY2soJmNwdXNldF9tdXRleCk7CiB9CiAKKy8qCisgKiBNYWtlIHN1cmUgdGhlIG5ldyB0YXNrIGNvbmZvcm0gdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgaXRzIHBhcmVudCwKKyAqIHdoaWNoIGNvdWxkIGhhdmUgYmVlbiBjaGFuZ2VkIGJ5IGNwdXNldCBqdXN0IGFmdGVyIGl0IGluaGVyaXRzIHRoZQorICogc3RhdGUgZnJvbSB0aGUgcGFyZW50IGFuZCBiZWZvcmUgaXQgc2l0cyBvbiB0aGUgY2dyb3VwJ3MgdGFzayBsaXN0LgorICovCitzdGF0aWMgdm9pZCBjcHVzZXRfZm9yayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJaWYgKHRhc2tfY3NzX2lzX3Jvb3QodGFzaywgY3B1c2V0X2NncnBfaWQpKQorCQlyZXR1cm47CisKKwlzZXRfY3B1c19hbGxvd2VkX3B0cih0YXNrLCAmY3VycmVudC0+Y3B1c19hbGxvd2VkKTsKKwl0YXNrLT5tZW1zX2FsbG93ZWQgPSBjdXJyZW50LT5tZW1zX2FsbG93ZWQ7Cit9CisKIHN0cnVjdCBjZ3JvdXBfc3Vic3lzIGNwdXNldF9jZ3JwX3N1YnN5cyA9IHsKIAkuY3NzX2FsbG9jCT0gY3B1c2V0X2Nzc19hbGxvYywKIAkuY3NzX29ubGluZQk9IGNwdXNldF9jc3Nfb25saW5lLApAQCAtMjA3OSw2ICsyMTA0LDcgQEAKIAkuYXR0YWNoCQk9IGNwdXNldF9hdHRhY2gsCiAJLnBvc3RfYXR0YWNoCT0gY3B1c2V0X3Bvc3RfYXR0YWNoLAogCS5iaW5kCQk9IGNwdXNldF9iaW5kLAorCS5mb3JrCQk9IGNwdXNldF9mb3JrLAogCS5sZWdhY3lfY2Z0eXBlcwk9IGZpbGVzLAogCS5lYXJseV9pbml0CT0gdHJ1ZSwKIH07CmRpZmYgLS1naXQgYS9rZXJuZWwvZXZlbnRzL2NvcmUuYyBiL2tlcm5lbC9ldmVudHMvY29yZS5jCmluZGV4IDE5MDNiOGYuLmM2ZTQ3ZTkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ldmVudHMvY29yZS5jCisrKyBiL2tlcm5lbC9ldmVudHMvY29yZS5jCkBAIC0yNDIsMTggKzI0Miw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgZXZlbnRfZnVuY3Rpb25fbG9jYWwoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBldmVudF9mIGZ1bmMsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGV2ZW50X2Z1bmN0aW9uX3N0cnVjdCBlZnMgPSB7Ci0JCS5ldmVudCA9IGV2ZW50LAotCQkuZnVuYyA9IGZ1bmMsCi0JCS5kYXRhID0gZGF0YSwKLQl9OwotCi0JaW50IHJldCA9IGV2ZW50X2Z1bmN0aW9uKCZlZnMpOwotCVdBUk5fT05fT05DRShyZXQpOwotfQotCiBzdGF0aWMgdm9pZCBldmVudF9mdW5jdGlvbl9jYWxsKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgZXZlbnRfZiBmdW5jLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCA9IGV2ZW50LT5jdHg7CkBAIC0zMDMsNiArMjkxLDU0IEBACiAJcmF3X3NwaW5fdW5sb2NrX2lycSgmY3R4LT5sb2NrKTsKIH0KIAorLyoKKyAqIFNpbWlsYXIgdG8gZXZlbnRfZnVuY3Rpb25fY2FsbCgpICsgZXZlbnRfZnVuY3Rpb24oKSwgYnV0IGhhcmQgYXNzdW1lcyBJUlFzCisgKiBhcmUgYWxyZWFkeSBkaXNhYmxlZCBhbmQgd2UncmUgb24gdGhlIHJpZ2h0IENQVS4KKyAqLworc3RhdGljIHZvaWQgZXZlbnRfZnVuY3Rpb25fbG9jYWwoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBldmVudF9mIGZ1bmMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4ID0gZXZlbnQtPmN0eDsKKwlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4ID0gX19nZXRfY3B1X2NvbnRleHQoY3R4KTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBSRUFEX09OQ0UoY3R4LT50YXNrKTsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICp0YXNrX2N0eCA9IE5VTEw7CisKKwlXQVJOX09OX09OQ0UoIWlycXNfZGlzYWJsZWQoKSk7CisKKwlpZiAodGFzaykgeworCQlpZiAodGFzayA9PSBUQVNLX1RPTUJTVE9ORSkKKwkJCXJldHVybjsKKworCQl0YXNrX2N0eCA9IGN0eDsKKwl9CisKKwlwZXJmX2N0eF9sb2NrKGNwdWN0eCwgdGFza19jdHgpOworCisJdGFzayA9IGN0eC0+dGFzazsKKwlpZiAodGFzayA9PSBUQVNLX1RPTUJTVE9ORSkKKwkJZ290byB1bmxvY2s7CisKKwlpZiAodGFzaykgeworCQkvKgorCQkgKiBXZSBtdXN0IGJlIGVpdGhlciBpbmFjdGl2ZSBvciBhY3RpdmUgYW5kIHRoZSByaWdodCB0YXNrLAorCQkgKiBvdGhlcndpc2Ugd2UncmUgc2NyZXdlZCwgc2luY2Ugd2UgY2Fubm90IElQSSB0byBzb21ld2hlcmUKKwkJICogZWxzZS4KKwkJICovCisJCWlmIChjdHgtPmlzX2FjdGl2ZSkgeworCQkJaWYgKFdBUk5fT05fT05DRSh0YXNrICE9IGN1cnJlbnQpKQorCQkJCWdvdG8gdW5sb2NrOworCisJCQlpZiAoV0FSTl9PTl9PTkNFKGNwdWN0eC0+dGFza19jdHggIT0gY3R4KSkKKwkJCQlnb3RvIHVubG9jazsKKwkJfQorCX0gZWxzZSB7CisJCVdBUk5fT05fT05DRSgmY3B1Y3R4LT5jdHggIT0gY3R4KTsKKwl9CisKKwlmdW5jKGV2ZW50LCBjcHVjdHgsIGN0eCwgZGF0YSk7Cit1bmxvY2s6CisJcGVyZl9jdHhfdW5sb2NrKGNwdWN0eCwgdGFza19jdHgpOworfQorCiAjZGVmaW5lIFBFUkZfRkxBR19BTEwgKFBFUkZfRkxBR19GRF9OT19HUk9VUCB8XAogCQkgICAgICAgUEVSRl9GTEFHX0ZEX09VVFBVVCAgfFwKIAkJICAgICAgIFBFUkZfRkxBR19QSURfQ0dST1VQIHxcCkBAIC0xNDM5LDggKzE0NzUsNyBAQAogCWlmIChldmVudC0+Z3JvdXBfbGVhZGVyID09IGV2ZW50KSB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAKLQkJaWYgKGlzX3NvZnR3YXJlX2V2ZW50KGV2ZW50KSkKLQkJCWV2ZW50LT5ncm91cF9mbGFncyB8PSBQRVJGX0dST1VQX1NPRlRXQVJFOworCQlldmVudC0+Z3JvdXBfY2FwcyA9IGV2ZW50LT5ldmVudF9jYXBzOwogCiAJCWxpc3QgPSBjdHhfZ3JvdXBfbGlzdChldmVudCwgY3R4KTsKIAkJbGlzdF9hZGRfdGFpbCgmZXZlbnQtPmdyb3VwX2VudHJ5LCBsaXN0KTsKQEAgLTE1OTQsOSArMTYyOSw3IEBACiAKIAlXQVJOX09OX09OQ0UoZ3JvdXBfbGVhZGVyLT5jdHggIT0gZXZlbnQtPmN0eCk7CiAKLQlpZiAoZ3JvdXBfbGVhZGVyLT5ncm91cF9mbGFncyAmIFBFUkZfR1JPVVBfU09GVFdBUkUgJiYKLQkJCSFpc19zb2Z0d2FyZV9ldmVudChldmVudCkpCi0JCWdyb3VwX2xlYWRlci0+Z3JvdXBfZmxhZ3MgJj0gflBFUkZfR1JPVVBfU09GVFdBUkU7CisJZ3JvdXBfbGVhZGVyLT5ncm91cF9jYXBzICY9IGV2ZW50LT5ldmVudF9jYXBzOwogCiAJbGlzdF9hZGRfdGFpbCgmZXZlbnQtPmdyb3VwX2VudHJ5LCAmZ3JvdXBfbGVhZGVyLT5zaWJsaW5nX2xpc3QpOwogCWdyb3VwX2xlYWRlci0+bnJfc2libGluZ3MrKzsKQEAgLTE2ODcsNyArMTcyMCw3IEBACiAJCXNpYmxpbmctPmdyb3VwX2xlYWRlciA9IHNpYmxpbmc7CiAKIAkJLyogSW5oZXJpdCBncm91cCBmbGFncyBmcm9tIHRoZSBwcmV2aW91cyBsZWFkZXIgKi8KLQkJc2libGluZy0+Z3JvdXBfZmxhZ3MgPSBldmVudC0+Z3JvdXBfZmxhZ3M7CisJCXNpYmxpbmctPmdyb3VwX2NhcHMgPSBldmVudC0+Z3JvdXBfY2FwczsKIAogCQlXQVJOX09OX09OQ0Uoc2libGluZy0+Y3R4ICE9IGV2ZW50LT5jdHgpOwogCX0KQEAgLTE3OTYsNiArMTgyOSw4IEBACiAJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50OwogCWludCBzdGF0ZSA9IGdyb3VwX2V2ZW50LT5zdGF0ZTsKIAorCXBlcmZfcG11X2Rpc2FibGUoY3R4LT5wbXUpOworCiAJZXZlbnRfc2NoZWRfb3V0KGdyb3VwX2V2ZW50LCBjcHVjdHgsIGN0eCk7CiAKIAkvKgpAQCAtMTgwNCw2ICsxODM5LDggQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2ZW50LCAmZ3JvdXBfZXZlbnQtPnNpYmxpbmdfbGlzdCwgZ3JvdXBfZW50cnkpCiAJCWV2ZW50X3NjaGVkX291dChldmVudCwgY3B1Y3R4LCBjdHgpOwogCisJcGVyZl9wbXVfZW5hYmxlKGN0eC0+cG11KTsKKwogCWlmIChzdGF0ZSA9PSBQRVJGX0VWRU5UX1NUQVRFX0FDVElWRSAmJiBncm91cF9ldmVudC0+YXR0ci5leGNsdXNpdmUpCiAJCWNwdWN0eC0+ZXhjbHVzaXZlID0gMDsKIH0KQEAgLTIxMDksNyArMjE0Niw3IEBACiAJLyoKIAkgKiBHcm91cHMgY29uc2lzdGluZyBlbnRpcmVseSBvZiBzb2Z0d2FyZSBldmVudHMgY2FuIGFsd2F5cyBnbyBvbi4KIAkgKi8KLQlpZiAoZXZlbnQtPmdyb3VwX2ZsYWdzICYgUEVSRl9HUk9VUF9TT0ZUV0FSRSkKKwlpZiAoZXZlbnQtPmdyb3VwX2NhcHMgJiBQRVJGX0VWX0NBUF9TT0ZUV0FSRSkKIAkJcmV0dXJuIDE7CiAJLyoKIAkgKiBJZiBhbiBleGNsdXNpdmUgZ3JvdXAgaXMgYWxyZWFkeSBvbiwgbm8gb3RoZXIgaGFyZHdhcmUKQEAgLTI0NTUsMTYgKzI0OTIsMTYgQEAKIAkgKiB3aGlsZSByZXN0YXJ0aW5nLgogCSAqLwogCWlmIChzZC0+cmVzdGFydCkKLQkJZXZlbnQtPnBtdS0+c3RhcnQoZXZlbnQsIFBFUkZfRUZfU1RBUlQpOworCQlldmVudC0+cG11LT5zdGFydChldmVudCwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwZXJmX2V2ZW50X3Jlc3RhcnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQorc3RhdGljIGludCBwZXJmX2V2ZW50X3N0b3Aoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgcmVzdGFydCkKIHsKIAlzdHJ1Y3Qgc3RvcF9ldmVudF9kYXRhIHNkID0gewogCQkuZXZlbnQJCT0gZXZlbnQsCi0JCS5yZXN0YXJ0CT0gMSwKKwkJLnJlc3RhcnQJPSByZXN0YXJ0LAogCX07CiAJaW50IHJldCA9IDA7CiAKQEAgLTI4MDEsMTkgKzI4MzgsMzYgQEAKIAl9CiB9CiAKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbGlzdF9oZWFkLCBzY2hlZF9jYl9saXN0KTsKKwogdm9pZCBwZXJmX3NjaGVkX2NiX2RlYyhzdHJ1Y3QgcG11ICpwbXUpCiB7CisJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCA9IHRoaXNfY3B1X3B0cihwbXUtPnBtdV9jcHVfY29udGV4dCk7CisKIAl0aGlzX2NwdV9kZWMocGVyZl9zY2hlZF9jYl91c2FnZXMpOworCisJaWYgKCEtLWNwdWN0eC0+c2NoZWRfY2JfdXNhZ2UpCisJCWxpc3RfZGVsKCZjcHVjdHgtPnNjaGVkX2NiX2VudHJ5KTsKIH0KIAorCiB2b2lkIHBlcmZfc2NoZWRfY2JfaW5jKHN0cnVjdCBwbXUgKnBtdSkKIHsKKwlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4ID0gdGhpc19jcHVfcHRyKHBtdS0+cG11X2NwdV9jb250ZXh0KTsKKworCWlmICghY3B1Y3R4LT5zY2hlZF9jYl91c2FnZSsrKQorCQlsaXN0X2FkZCgmY3B1Y3R4LT5zY2hlZF9jYl9lbnRyeSwgdGhpc19jcHVfcHRyKCZzY2hlZF9jYl9saXN0KSk7CisKIAl0aGlzX2NwdV9pbmMocGVyZl9zY2hlZF9jYl91c2FnZXMpOwogfQogCiAvKgogICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyB0aGUgY29udGV4dCBzd2l0Y2ggY2FsbGJhY2sgdG8gdGhlIGxvd2VyIGNvZGUKICAqIGxheWVyLiBJdCBpcyBpbnZva2VkIE9OTFkgd2hlbiB0aGUgY29udGV4dCBzd2l0Y2ggY2FsbGJhY2sgaXMgZW5hYmxlZC4KKyAqCisgKiBUaGlzIGNhbGxiYWNrIGlzIHJlbGV2YW50IGV2ZW4gdG8gcGVyLWNwdSBldmVudHM7IGZvciBleGFtcGxlIG11bHRpIGV2ZW50CisgKiBQRUJTIHJlcXVpcmVzIHRoaXMgdG8gcHJvdmlkZSBQSUQvVElEIGluZm9ybWF0aW9uLiBUaGlzIHJlcXVpcmVzIHdlIGZsdXNoCisgKiBhbGwgcXVldWVkIFBFQlMgcmVjb3JkcyBiZWZvcmUgd2UgY29udGV4dCBzd2l0Y2ggdG8gYSBuZXcgdGFzay4KICAqLwogc3RhdGljIHZvaWQgcGVyZl9wbXVfc2NoZWRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYsCiAJCQkJc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0LApAQCAtMjgyMSwzNCArMjg3NSwyNCBAQAogewogCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHg7CiAJc3RydWN0IHBtdSAqcG11OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAocHJldiA9PSBuZXh0KQogCQlyZXR1cm47CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcHVjdHgsIHRoaXNfY3B1X3B0cigmc2NoZWRfY2JfbGlzdCksIHNjaGVkX2NiX2VudHJ5KSB7CisJCXBtdSA9IGNwdWN0eC0+dW5pcXVlX3BtdTsgLyogc29mdHdhcmUgUE1VcyB3aWxsIG5vdCBoYXZlIHNjaGVkX3Rhc2sgKi8KIAotCXJjdV9yZWFkX2xvY2soKTsKKwkJaWYgKFdBUk5fT05fT05DRSghcG11LT5zY2hlZF90YXNrKSkKKwkJCWNvbnRpbnVlOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocG11LCAmcG11cywgZW50cnkpIHsKLQkJaWYgKHBtdS0+c2NoZWRfdGFzaykgewotCQkJY3B1Y3R4ID0gdGhpc19jcHVfcHRyKHBtdS0+cG11X2NwdV9jb250ZXh0KTsKKwkJcGVyZl9jdHhfbG9jayhjcHVjdHgsIGNwdWN0eC0+dGFza19jdHgpOworCQlwZXJmX3BtdV9kaXNhYmxlKHBtdSk7CiAKLQkJCXBlcmZfY3R4X2xvY2soY3B1Y3R4LCBjcHVjdHgtPnRhc2tfY3R4KTsKKwkJcG11LT5zY2hlZF90YXNrKGNwdWN0eC0+dGFza19jdHgsIHNjaGVkX2luKTsKIAotCQkJcGVyZl9wbXVfZGlzYWJsZShwbXUpOwotCi0JCQlwbXUtPnNjaGVkX3Rhc2soY3B1Y3R4LT50YXNrX2N0eCwgc2NoZWRfaW4pOwotCi0JCQlwZXJmX3BtdV9lbmFibGUocG11KTsKLQotCQkJcGVyZl9jdHhfdW5sb2NrKGNwdWN0eCwgY3B1Y3R4LT50YXNrX2N0eCk7Ci0JCX0KKwkJcGVyZl9wbXVfZW5hYmxlKHBtdSk7CisJCXBlcmZfY3R4X3VubG9jayhjcHVjdHgsIGNwdWN0eC0+dGFza19jdHgpOwogCX0KLQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBwZXJmX2V2ZW50X3N3aXRjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCkBAIC0zMzgwLDYgKzM0MjQsMjIgQEAKIAlpbnQgcmV0OwogfTsKIAorc3RhdGljIGludCBmaW5kX2NwdV90b19yZWFkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGxvY2FsX2NwdSkKK3sKKwlpbnQgZXZlbnRfY3B1ID0gZXZlbnQtPm9uY3B1OworCXUxNiBsb2NhbF9wa2csIGV2ZW50X3BrZzsKKworCWlmIChldmVudC0+Z3JvdXBfY2FwcyAmIFBFUkZfRVZfQ0FQX1JFQURfQUNUSVZFX1BLRykgeworCQlldmVudF9wa2cgPSAgdG9wb2xvZ3lfcGh5c2ljYWxfcGFja2FnZV9pZChldmVudF9jcHUpOworCQlsb2NhbF9wa2cgPSAgdG9wb2xvZ3lfcGh5c2ljYWxfcGFja2FnZV9pZChsb2NhbF9jcHUpOworCisJCWlmIChldmVudF9wa2cgPT0gbG9jYWxfcGtnKQorCQkJcmV0dXJuIGxvY2FsX2NwdTsKKwl9CisKKwlyZXR1cm4gZXZlbnRfY3B1OworfQorCiAvKgogICogQ3Jvc3MgQ1BVIGNhbGwgdG8gcmVhZCB0aGUgaGFyZHdhcmUgZXZlbnQKICAqLwpAQCAtMzUwMSw3ICszNTYxLDcgQEAKIAogc3RhdGljIGludCBwZXJmX2V2ZW50X3JlYWQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBib29sIGdyb3VwKQogewotCWludCByZXQgPSAwOworCWludCByZXQgPSAwLCBjcHVfdG9fcmVhZCwgbG9jYWxfY3B1OwogCiAJLyoKIAkgKiBJZiBldmVudCBpcyBlbmFibGVkIGFuZCBjdXJyZW50bHkgYWN0aXZlIG9uIGEgQ1BVLCB1cGRhdGUgdGhlCkBAIC0zNTEzLDggKzM1NzMsMjIgQEAKIAkJCS5ncm91cCA9IGdyb3VwLAogCQkJLnJldCA9IDAsCiAJCX07Ci0JCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShldmVudC0+b25jcHUsCi0JCQkJCSBfX3BlcmZfZXZlbnRfcmVhZCwgJmRhdGEsIDEpOworCisJCWxvY2FsX2NwdSA9IGdldF9jcHUoKTsKKwkJY3B1X3RvX3JlYWQgPSBmaW5kX2NwdV90b19yZWFkKGV2ZW50LCBsb2NhbF9jcHUpOworCQlwdXRfY3B1KCk7CisKKwkJLyoKKwkJICogUHVycG9zZWx5IGlnbm9yZSB0aGUgc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKCkgcmV0dXJuCisJCSAqIHZhbHVlLgorCQkgKgorCQkgKiBJZiBldmVudC0+b25jcHUgaXNuJ3QgYSB2YWxpZCBDUFUgaXQgbWVhbnMgdGhlIGV2ZW50IGdvdAorCQkgKiBzY2hlZHVsZWQgb3V0IGFuZCB0aGF0IHdpbGwgaGF2ZSB1cGRhdGVkIHRoZSBldmVudCBjb3VudC4KKwkJICoKKwkJICogVGhlcmVmb3JlLCBlaXRoZXIgd2F5LCB3ZSdsbCBoYXZlIGFuIHVwLXRvLWRhdGUgZXZlbnQgY291bnQKKwkJICogYWZ0ZXIgdGhpcy4KKwkJICovCisJCSh2b2lkKXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHVfdG9fcmVhZCwgX19wZXJmX2V2ZW50X3JlYWQsICZkYXRhLCAxKTsKIAkJcmV0ID0gZGF0YS5yZXQ7CiAJfSBlbHNlIGlmIChldmVudC0+c3RhdGUgPT0gUEVSRl9FVkVOVF9TVEFURV9JTkFDVElWRSkgewogCQlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHggPSBldmVudC0+Y3R4OwpAQCAtMzg4NCw3ICszOTU4LDcgQEAKIAogc3RhdGljIGJvb2wgZXhjbHVzaXZlX2V2ZW50X21hdGNoKHN0cnVjdCBwZXJmX2V2ZW50ICplMSwgc3RydWN0IHBlcmZfZXZlbnQgKmUyKQogewotCWlmICgoZTEtPnBtdS0+Y2FwYWJpbGl0aWVzICYgUEVSRl9QTVVfQ0FQX0VYQ0xVU0lWRSkgJiYKKwlpZiAoKGUxLT5wbXUgPT0gZTItPnBtdSkgJiYKIAkgICAgKGUxLT5jcHUgPT0gZTItPmNwdSB8fAogCSAgICAgZTEtPmNwdSA9PSAtMSB8fAogCSAgICAgZTItPmNwdSA9PSAtMSkpCkBAIC00ODAwLDYgKzQ4NzQsMTkgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmItPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAl9CiAKKwkvKgorCSAqIEF2b2lkIHJhY2luZyB3aXRoIHBlcmZfbW1hcF9jbG9zZShBVVgpOiBzdG9wIHRoZSBldmVudAorCSAqIGJlZm9yZSBzd2l6emxpbmcgdGhlIGV2ZW50OjpyYiBwb2ludGVyOyBpZiBpdCdzIGdldHRpbmcKKwkgKiB1bm1hcHBlZCwgaXRzIGF1eF9tbWFwX2NvdW50IHdpbGwgYmUgMCBhbmQgaXQgd29uJ3QKKwkgKiByZXN0YXJ0LiBTZWUgdGhlIGNvbW1lbnQgaW4gX19wZXJmX3BtdV9vdXRwdXRfc3RvcCgpLgorCSAqCisJICogRGF0YSB3aWxsIGluZXZpdGFibHkgYmUgbG9zdCB3aGVuIHNldF9vdXRwdXQgaXMgZG9uZSBpbgorCSAqIG1pZC1haXIsIGJ1dCB0aGVuIGFnYWluLCB3aG9ldmVyIGRvZXMgaXQgbGlrZSB0aGlzIGlzCisJICogbm90IGluIGZvciB0aGUgZGF0YSBhbnl3YXkuCisJICovCisJaWYgKGhhc19hdXgoZXZlbnQpKQorCQlwZXJmX2V2ZW50X3N0b3AoZXZlbnQsIDApOworCiAJcmN1X2Fzc2lnbl9wb2ludGVyKGV2ZW50LT5yYiwgcmIpOwogCiAJaWYgKG9sZF9yYikgewpAQCAtNTI5Miw5ICs1Mzc5LDEwIEBACiAJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncywgdTY0IG1hc2spCiB7CiAJaW50IGJpdDsKKwlERUNMQVJFX0JJVE1BUChfbWFzaywgNjQpOwogCi0JZm9yX2VhY2hfc2V0X2JpdChiaXQsIChjb25zdCB1bnNpZ25lZCBsb25nICopICZtYXNrLAotCQkJIHNpemVvZihtYXNrKSAqIEJJVFNfUEVSX0JZVEUpIHsKKwliaXRtYXBfZnJvbV91NjQoX21hc2ssIG1hc2spOworCWZvcl9lYWNoX3NldF9iaXQoYml0LCBfbWFzaywgc2l6ZW9mKG1hc2spICogQklUU19QRVJfQllURSkgewogCQl1NjQgdmFsOwogCiAJCXZhbCA9IHBlcmZfcmVnX3ZhbHVlKHJlZ3MsIGJpdCk7CkBAIC02MDc1LDcgKzYxNjMsNyBAQAogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZmgtPmxvY2ssIGZsYWdzKTsKIAogCWlmIChyZXN0YXJ0KQotCQlwZXJmX2V2ZW50X3Jlc3RhcnQoZXZlbnQpOworCQlwZXJmX2V2ZW50X3N0b3AoZXZlbnQsIDEpOwogfQogCiB2b2lkIHBlcmZfZXZlbnRfZXhlYyh2b2lkKQpAQCAtNjExOSw3ICs2MjA3LDEzIEBACiAKIAkvKgogCSAqIEluIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGl0IHdpbGwgYmUgdGhlIHBhcmVudCB0aGF0IGxpbmtzIHRvIHRoZQotCSAqIHJpbmctYnVmZmVyLCBidXQgaXQgd2lsbCBiZSB0aGUgY2hpbGQgdGhhdCdzIGFjdHVhbGx5IHVzaW5nIGl0OgorCSAqIHJpbmctYnVmZmVyLCBidXQgaXQgd2lsbCBiZSB0aGUgY2hpbGQgdGhhdCdzIGFjdHVhbGx5IHVzaW5nIGl0LgorCSAqCisJICogV2UgYXJlIHVzaW5nIGV2ZW50OjpyYiB0byBkZXRlcm1pbmUgaWYgdGhlIGV2ZW50IHNob3VsZCBiZSBzdG9wcGVkLAorCSAqIGhvd2V2ZXIgdGhpcyBtYXkgcmFjZSB3aXRoIHJpbmdfYnVmZmVyX2F0dGFjaCgpICh0aHJvdWdoIHNldF9vdXRwdXQpLAorCSAqIHdoaWNoIHdpbGwgbWFrZSB1cyBza2lwIHRoZSBldmVudCB0aGF0IGFjdHVhbGx5IG5lZWRzIHRvIGJlIHN0b3BwZWQuCisJICogU28gcmluZ19idWZmZXJfYXR0YWNoKCkgaGFzIHRvIHN0b3AgYW4gYXV4IGV2ZW50IGJlZm9yZSByZS1hc3NpZ25pbmcKKwkgKiBpdHMgcmIgcG9pbnRlci4KIAkgKi8KIAlpZiAocmN1X2RlcmVmZXJlbmNlKHBhcmVudC0+cmIpID09IHJiKQogCQlyby0+ZXJyID0gX19wZXJmX2V2ZW50X3N0b3AoJnNkKTsKQEAgLTYxMjksNyArNjIyMyw3IEBACiB7CiAJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gaW5mbzsKIAlzdHJ1Y3QgcG11ICpwbXUgPSBldmVudC0+cG11OwotCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHggPSBnZXRfY3B1X3B0cihwbXUtPnBtdV9jcHVfY29udGV4dCk7CisJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCA9IHRoaXNfY3B1X3B0cihwbXUtPnBtdV9jcHVfY29udGV4dCk7CiAJc3RydWN0IHJlbW90ZV9vdXRwdXQgcm8gPSB7CiAJCS5yYgk9IGV2ZW50LT5yYiwKIAl9OwpAQCAtNjU4NCwxNSArNjY3OCw2IEBACiB9CiAKIC8qCi0gKiBXaGV0aGVyIHRoaXMgQGZpbHRlciBkZXBlbmRzIG9uIGEgZHluYW1pYyBvYmplY3Qgd2hpY2ggaXMgbm90IGxvYWRlZAotICogeWV0IG9yIGl0cyBsb2FkIGFkZHJlc3NlcyBhcmUgbm90IGtub3duLgotICovCi1zdGF0aWMgYm9vbCBwZXJmX2FkZHJfZmlsdGVyX25lZWRzX21tYXAoc3RydWN0IHBlcmZfYWRkcl9maWx0ZXIgKmZpbHRlcikKLXsKLQlyZXR1cm4gZmlsdGVyLT5maWx0ZXIgJiYgZmlsdGVyLT5pbm9kZTsKLX0KLQotLyoKICAqIENoZWNrIHdoZXRoZXIgaW5vZGUgYW5kIGFkZHJlc3MgcmFuZ2UgbWF0Y2ggZmlsdGVyIGNyaXRlcmlhLgogICovCiBzdGF0aWMgYm9vbCBwZXJmX2FkZHJfZmlsdGVyX21hdGNoKHN0cnVjdCBwZXJmX2FkZHJfZmlsdGVyICpmaWx0ZXIsCkBAIC02NjQyLDcgKzY3MjcsNyBAQAogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZmgtPmxvY2ssIGZsYWdzKTsKIAogCWlmIChyZXN0YXJ0KQotCQlwZXJmX2V2ZW50X3Jlc3RhcnQoZXZlbnQpOworCQlwZXJmX2V2ZW50X3N0b3AoZXZlbnQsIDEpOwogfQogCiAvKgpAQCAtNjY1Myw2ICs2NzM4LDEzIEBACiAJc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4OwogCWludCBjdHhuOwogCisJLyoKKwkgKiBEYXRhIHRyYWNpbmcgaXNuJ3Qgc3VwcG9ydGVkIHlldCBhbmQgYXMgc3VjaCB0aGVyZSBpcyBubyBuZWVkCisJICogdG8ga2VlcCB0cmFjayBvZiBhbnl0aGluZyB0aGF0IGlzbid0IHJlbGF0ZWQgdG8gZXhlY3V0YWJsZSBjb2RlOgorCSAqLworCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDKSkKKwkJcmV0dXJuOworCiAJcmN1X3JlYWRfbG9jaygpOwogCWZvcl9lYWNoX3Rhc2tfY29udGV4dF9ucihjdHhuKSB7CiAJCWN0eCA9IHJjdV9kZXJlZmVyZW5jZShjdXJyZW50LT5wZXJmX2V2ZW50X2N0eHBbY3R4bl0pOwpAQCAtNjk4Nyw3ICs3MDc5LDcgQEAKIAkJaXJxX3dvcmtfcXVldWUoJmV2ZW50LT5wZW5kaW5nKTsKIAl9CiAKLQlldmVudC0+b3ZlcmZsb3dfaGFuZGxlcihldmVudCwgZGF0YSwgcmVncyk7CisJUkVBRF9PTkNFKGV2ZW50LT5vdmVyZmxvd19oYW5kbGVyKShldmVudCwgZGF0YSwgcmVncyk7CiAKIAlpZiAoKnBlcmZfZXZlbnRfZmFzeW5jKGV2ZW50KSAmJiBldmVudC0+cGVuZGluZ19raWxsKSB7CiAJCWV2ZW50LT5wZW5kaW5nX3dha2V1cCA9IDE7CkBAIC03NjAyLDExICs3Njk0LDgzIEBACiAJZnRyYWNlX3Byb2ZpbGVfZnJlZV9maWx0ZXIoZXZlbnQpOwogfQogCisjaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMCitzdGF0aWMgdm9pZCBicGZfb3ZlcmZsb3dfaGFuZGxlcihzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCisJCQkJIHN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhICpkYXRhLAorCQkJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYnBmX3BlcmZfZXZlbnRfZGF0YV9rZXJuIGN0eCA9IHsKKwkJLmRhdGEgPSBkYXRhLAorCQkucmVncyA9IHJlZ3MsCisJfTsKKwlpbnQgcmV0ID0gMDsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCWlmICh1bmxpa2VseShfX3RoaXNfY3B1X2luY19yZXR1cm4oYnBmX3Byb2dfYWN0aXZlKSAhPSAxKSkKKwkJZ290byBvdXQ7CisJcmN1X3JlYWRfbG9jaygpOworCXJldCA9IEJQRl9QUk9HX1JVTihldmVudC0+cHJvZywgKHZvaWQgKikmY3R4KTsKKwlyY3VfcmVhZF91bmxvY2soKTsKK291dDoKKwlfX3RoaXNfY3B1X2RlYyhicGZfcHJvZ19hY3RpdmUpOworCXByZWVtcHRfZW5hYmxlKCk7CisJaWYgKCFyZXQpCisJCXJldHVybjsKKworCWV2ZW50LT5vcmlnX292ZXJmbG93X2hhbmRsZXIoZXZlbnQsIGRhdGEsIHJlZ3MpOworfQorCitzdGF0aWMgaW50IHBlcmZfZXZlbnRfc2V0X2JwZl9oYW5kbGVyKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdTMyIHByb2dfZmQpCit7CisJc3RydWN0IGJwZl9wcm9nICpwcm9nOworCisJaWYgKGV2ZW50LT5vdmVyZmxvd19oYW5kbGVyX2NvbnRleHQpCisJCS8qIGh3IGJyZWFrcG9pbnQgb3Iga2VybmVsIGNvdW50ZXIgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZXZlbnQtPnByb2cpCisJCXJldHVybiAtRUVYSVNUOworCisJcHJvZyA9IGJwZl9wcm9nX2dldF90eXBlKHByb2dfZmQsIEJQRl9QUk9HX1RZUEVfUEVSRl9FVkVOVCk7CisJaWYgKElTX0VSUihwcm9nKSkKKwkJcmV0dXJuIFBUUl9FUlIocHJvZyk7CisKKwlldmVudC0+cHJvZyA9IHByb2c7CisJZXZlbnQtPm9yaWdfb3ZlcmZsb3dfaGFuZGxlciA9IFJFQURfT05DRShldmVudC0+b3ZlcmZsb3dfaGFuZGxlcik7CisJV1JJVEVfT05DRShldmVudC0+b3ZlcmZsb3dfaGFuZGxlciwgYnBmX292ZXJmbG93X2hhbmRsZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwZXJmX2V2ZW50X2ZyZWVfYnBmX2hhbmRsZXIoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBicGZfcHJvZyAqcHJvZyA9IGV2ZW50LT5wcm9nOworCisJaWYgKCFwcm9nKQorCQlyZXR1cm47CisKKwlXUklURV9PTkNFKGV2ZW50LT5vdmVyZmxvd19oYW5kbGVyLCBldmVudC0+b3JpZ19vdmVyZmxvd19oYW5kbGVyKTsKKwlldmVudC0+cHJvZyA9IE5VTEw7CisJYnBmX3Byb2dfcHV0KHByb2cpOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgcGVyZl9ldmVudF9zZXRfYnBmX2hhbmRsZXIoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB1MzIgcHJvZ19mZCkKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CitzdGF0aWMgdm9pZCBwZXJmX2V2ZW50X2ZyZWVfYnBmX2hhbmRsZXIoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgcGVyZl9ldmVudF9zZXRfYnBmX3Byb2coc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB1MzIgcHJvZ19mZCkKIHsKIAlib29sIGlzX2twcm9iZSwgaXNfdHJhY2Vwb2ludDsKIAlzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7CiAKKwlpZiAoZXZlbnQtPmF0dHIudHlwZSA9PSBQRVJGX1RZUEVfSEFSRFdBUkUgfHwKKwkgICAgZXZlbnQtPmF0dHIudHlwZSA9PSBQRVJGX1RZUEVfU09GVFdBUkUpCisJCXJldHVybiBwZXJmX2V2ZW50X3NldF9icGZfaGFuZGxlcihldmVudCwgcHJvZ19mZCk7CisKIAlpZiAoZXZlbnQtPmF0dHIudHlwZSAhPSBQRVJGX1RZUEVfVFJBQ0VQT0lOVCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTc2NDcsNiArNzgxMSw4IEBACiB7CiAJc3RydWN0IGJwZl9wcm9nICpwcm9nOwogCisJcGVyZl9ldmVudF9mcmVlX2JwZl9oYW5kbGVyKGV2ZW50KTsKKwogCWlmICghZXZlbnQtPnRwX2V2ZW50KQogCQlyZXR1cm47CiAKQEAgLTc4MDUsNyArNzk3MSwxMSBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZmlsdGVyLCAmaWZoLT5saXN0LCBlbnRyeSkgewogCQlldmVudC0+YWRkcl9maWx0ZXJzX29mZnNbY291bnRdID0gMDsKIAotCQlpZiAocGVyZl9hZGRyX2ZpbHRlcl9uZWVkc19tbWFwKGZpbHRlcikpCisJCS8qCisJCSAqIEFkanVzdCBiYXNlIG9mZnNldCBpZiB0aGUgZmlsdGVyIGlzIGFzc29jaWF0ZWQgdG8gYSBiaW5hcnkKKwkJICogdGhhdCBuZWVkcyB0byBiZSBtYXBwZWQ6CisJCSAqLworCQlpZiAoZmlsdGVyLT5pbm9kZSkKIAkJCWV2ZW50LT5hZGRyX2ZpbHRlcnNfb2Zmc1tjb3VudF0gPQogCQkJCXBlcmZfYWRkcl9maWx0ZXJfYXBwbHkoZmlsdGVyLCBtbSk7CiAKQEAgLTc4MjAsNyArNzk5MCw3IEBACiAJbW1wdXQobW0pOwogCiByZXN0YXJ0OgotCXBlcmZfZXZlbnRfcmVzdGFydChldmVudCk7CisJcGVyZl9ldmVudF9zdG9wKGV2ZW50LCAxKTsKIH0KIAogLyoKQEAgLTc5MzYsOCArODEwNiwxMCBAQAogCQkJCQlnb3RvIGZhaWw7CiAJCQl9CiAKLQkJCWlmICh0b2tlbiA9PSBJRl9TUkNfRklMRSkgewotCQkJCWZpbGVuYW1lID0gbWF0Y2hfc3RyZHVwKCZhcmdzWzJdKTsKKwkJCWlmICh0b2tlbiA9PSBJRl9TUkNfRklMRSB8fCB0b2tlbiA9PSBJRl9TUkNfRklMRUFERFIpIHsKKwkJCQlpbnQgZnBvcyA9IGZpbHRlci0+cmFuZ2UgPyAyIDogMTsKKworCQkJCWZpbGVuYW1lID0gbWF0Y2hfc3RyZHVwKCZhcmdzW2Zwb3NdKTsKIAkJCQlpZiAoIWZpbGVuYW1lKSB7CiAJCQkJCXJldCA9IC1FTk9NRU07CiAJCQkJCWdvdG8gZmFpbDsKQEAgLTg5NTcsNiArOTEyOSwxOSBAQAogCWlmICghb3ZlcmZsb3dfaGFuZGxlciAmJiBwYXJlbnRfZXZlbnQpIHsKIAkJb3ZlcmZsb3dfaGFuZGxlciA9IHBhcmVudF9ldmVudC0+b3ZlcmZsb3dfaGFuZGxlcjsKIAkJY29udGV4dCA9IHBhcmVudF9ldmVudC0+b3ZlcmZsb3dfaGFuZGxlcl9jb250ZXh0OworI2lmIGRlZmluZWQoQ09ORklHX0JQRl9TWVNDQUxMKSAmJiBkZWZpbmVkKENPTkZJR19FVkVOVF9UUkFDSU5HKQorCQlpZiAob3ZlcmZsb3dfaGFuZGxlciA9PSBicGZfb3ZlcmZsb3dfaGFuZGxlcikgeworCQkJc3RydWN0IGJwZl9wcm9nICpwcm9nID0gYnBmX3Byb2dfaW5jKHBhcmVudF9ldmVudC0+cHJvZyk7CisKKwkJCWlmIChJU19FUlIocHJvZykpIHsKKwkJCQllcnIgPSBQVFJfRVJSKHByb2cpOworCQkJCWdvdG8gZXJyX25zOworCQkJfQorCQkJZXZlbnQtPnByb2cgPSBwcm9nOworCQkJZXZlbnQtPm9yaWdfb3ZlcmZsb3dfaGFuZGxlciA9CisJCQkJcGFyZW50X2V2ZW50LT5vcmlnX292ZXJmbG93X2hhbmRsZXI7CisJCX0KKyNlbmRpZgogCX0KIAogCWlmIChvdmVyZmxvd19oYW5kbGVyKSB7CkBAIC05NDM3LDYgKzk2MjIsOSBAQAogCQkJZ290byBlcnJfYWxsb2M7CiAJfQogCisJaWYgKHBtdS0+dGFza19jdHhfbnIgPT0gcGVyZl9zd19jb250ZXh0KQorCQlldmVudC0+ZXZlbnRfY2FwcyB8PSBQRVJGX0VWX0NBUF9TT0ZUV0FSRTsKKwogCWlmIChncm91cF9sZWFkZXIgJiYKIAkgICAgKGlzX3NvZnR3YXJlX2V2ZW50KGV2ZW50KSAhPSBpc19zb2Z0d2FyZV9ldmVudChncm91cF9sZWFkZXIpKSkgewogCQlpZiAoaXNfc29mdHdhcmVfZXZlbnQoZXZlbnQpKSB7CkBAIC05NDUwLDcgKzk2MzgsNyBAQAogCQkJICovCiAJCQlwbXUgPSBncm91cF9sZWFkZXItPnBtdTsKIAkJfSBlbHNlIGlmIChpc19zb2Z0d2FyZV9ldmVudChncm91cF9sZWFkZXIpICYmCi0JCQkgICAoZ3JvdXBfbGVhZGVyLT5ncm91cF9mbGFncyAmIFBFUkZfR1JPVVBfU09GVFdBUkUpKSB7CisJCQkgICAoZ3JvdXBfbGVhZGVyLT5ncm91cF9jYXBzICYgUEVSRl9FVl9DQVBfU09GVFdBUkUpKSB7CiAJCQkvKgogCQkJICogSW4gY2FzZSB0aGUgZ3JvdXAgaXMgYSBwdXJlIHNvZnR3YXJlIGdyb3VwLCBhbmQgd2UKIAkJCSAqIHRyeSB0byBhZGQgYSBoYXJkd2FyZSBldmVudCwgbW92ZSB0aGUgd2hvbGUgZ3JvdXAgdG8KQEAgLTEwMzg1LDYgKzEwNTczLDggQEAKIAogCQlJTklUX0xJU1RfSEVBRCgmcGVyX2NwdShwbXVfc2JfZXZlbnRzLmxpc3QsIGNwdSkpOwogCQlyYXdfc3Bpbl9sb2NrX2luaXQoJnBlcl9jcHUocG11X3NiX2V2ZW50cy5sb2NrLCBjcHUpKTsKKworCQlJTklUX0xJU1RfSEVBRCgmcGVyX2NwdShzY2hlZF9jYl9saXN0LCBjcHUpKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9ldmVudHMvcmluZ19idWZmZXIuYyBiL2tlcm5lbC9ldmVudHMvcmluZ19idWZmZXIuYwppbmRleCBhZTliOTBkLi4yNTdmYTQ2IDEwMDY0NAotLS0gYS9rZXJuZWwvZXZlbnRzL3JpbmdfYnVmZmVyLmMKKysrIGIva2VybmVsL2V2ZW50cy9yaW5nX2J1ZmZlci5jCkBAIC0zMzAsMTUgKzMzMCwyMiBAQAogCWlmICghcmIpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKCFyYl9oYXNfYXV4KHJiKSB8fCAhYXRvbWljX2luY19ub3RfemVybygmcmItPmF1eF9yZWZjb3VudCkpCisJaWYgKCFyYl9oYXNfYXV4KHJiKSkKIAkJZ290byBlcnI7CiAKIAkvKgotCSAqIElmIHJiOjphdXhfbW1hcF9jb3VudCBpcyB6ZXJvIChhbmQgcmJfaGFzX2F1eCgpIGFib3ZlIHdlbnQgdGhyb3VnaCksCi0JICogdGhlIGF1eCBidWZmZXIgaXMgaW4gcGVyZl9tbWFwX2Nsb3NlKCksIGFib3V0IHRvIGdldCBmcmVlZC4KKwkgKiBJZiBhdXhfbW1hcF9jb3VudCBpcyB6ZXJvLCB0aGUgYXV4IGJ1ZmZlciBpcyBpbiBwZXJmX21tYXBfY2xvc2UoKSwKKwkgKiBhYm91dCB0byBnZXQgZnJlZWQsIHNvIHdlIGxlYXZlIGltbWVkaWF0ZWx5LgorCSAqCisJICogQ2hlY2tpbmcgcmI6OmF1eF9tbWFwX2NvdW50IGFuZCByYjo6cmVmY291bnQgaGFzIHRvIGJlIGRvbmUgaW4KKwkgKiB0aGUgc2FtZSBvcmRlciwgc2VlIHBlcmZfbW1hcF9jbG9zZS4gT3RoZXJ3aXNlIHdlIGVuZCB1cCBmcmVlaW5nCisJICogYXV4IHBhZ2VzIGluIHRoaXMgcGF0aCwgd2hpY2ggaXMgYSBidWcsIGJlY2F1c2UgaW5fYXRvbWljKCkuCiAJICovCiAJaWYgKCFhdG9taWNfcmVhZCgmcmItPmF1eF9tbWFwX2NvdW50KSkKLQkJZ290byBlcnJfcHV0OworCQlnb3RvIGVycjsKKworCWlmICghYXRvbWljX2luY19ub3RfemVybygmcmItPmF1eF9yZWZjb3VudCkpCisJCWdvdG8gZXJyOwogCiAJLyoKIAkgKiBOZXN0aW5nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIEFVWCBhcmVhLCBtYWtlIHN1cmUgbmVzdGVkCmRpZmYgLS1naXQgYS9rZXJuZWwvZXZlbnRzL3Vwcm9iZXMuYyBiL2tlcm5lbC9ldmVudHMvdXByb2Jlcy5jCmluZGV4IGI3YTUyNWEuLmQ0MTI5YmIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ldmVudHMvdXByb2Jlcy5jCisrKyBiL2tlcm5lbC9ldmVudHMvdXByb2Jlcy5jCkBAIC0xNTAsNyArMTUwLDcgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUZBVUxUIG9uIGZhaWx1cmUuCiAgKi8KIHN0YXRpYyBpbnQgX19yZXBsYWNlX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHBhZ2UgKmtwYWdlKQorCQkJCXN0cnVjdCBwYWdlICpvbGRfcGFnZSwgc3RydWN0IHBhZ2UgKm5ld19wYWdlKQogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLT52bV9tbTsKIAlzcGlubG9ja190ICpwdGw7CkBAIC0xNjEsNDggKzE2MSw0OSBAQAogCWNvbnN0IHVuc2lnbmVkIGxvbmcgbW11bl9lbmQgICA9IGFkZHIgKyBQQUdFX1NJWkU7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOwogCi0JZXJyID0gbWVtX2Nncm91cF90cnlfY2hhcmdlKGtwYWdlLCB2bWEtPnZtX21tLCBHRlBfS0VSTkVMLCAmbWVtY2csCisJZXJyID0gbWVtX2Nncm91cF90cnlfY2hhcmdlKG5ld19wYWdlLCB2bWEtPnZtX21tLCBHRlBfS0VSTkVMLCAmbWVtY2csCiAJCQlmYWxzZSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCS8qIEZvciB0cnlfdG9fZnJlZV9zd2FwKCkgYW5kIG11bmxvY2tfdm1hX3BhZ2UoKSBiZWxvdyAqLwotCWxvY2tfcGFnZShwYWdlKTsKKwlsb2NrX3BhZ2Uob2xkX3BhZ2UpOwogCiAJbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQobW0sIG1tdW5fc3RhcnQsIG1tdW5fZW5kKTsKIAllcnIgPSAtRUFHQUlOOwotCXB0ZXAgPSBwYWdlX2NoZWNrX2FkZHJlc3MocGFnZSwgbW0sIGFkZHIsICZwdGwsIDApOwotCWlmICghcHRlcCkKKwlwdGVwID0gcGFnZV9jaGVja19hZGRyZXNzKG9sZF9wYWdlLCBtbSwgYWRkciwgJnB0bCwgMCk7CisJaWYgKCFwdGVwKSB7CisJCW1lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZShuZXdfcGFnZSwgbWVtY2csIGZhbHNlKTsKIAkJZ290byB1bmxvY2s7CisJfQogCi0JZ2V0X3BhZ2Uoa3BhZ2UpOwotCXBhZ2VfYWRkX25ld19hbm9uX3JtYXAoa3BhZ2UsIHZtYSwgYWRkciwgZmFsc2UpOwotCW1lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZShrcGFnZSwgbWVtY2csIGZhbHNlLCBmYWxzZSk7Ci0JbHJ1X2NhY2hlX2FkZF9hY3RpdmVfb3JfdW5ldmljdGFibGUoa3BhZ2UsIHZtYSk7CisJZ2V0X3BhZ2UobmV3X3BhZ2UpOworCXBhZ2VfYWRkX25ld19hbm9uX3JtYXAobmV3X3BhZ2UsIHZtYSwgYWRkciwgZmFsc2UpOworCW1lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZShuZXdfcGFnZSwgbWVtY2csIGZhbHNlLCBmYWxzZSk7CisJbHJ1X2NhY2hlX2FkZF9hY3RpdmVfb3JfdW5ldmljdGFibGUobmV3X3BhZ2UsIHZtYSk7CiAKLQlpZiAoIVBhZ2VBbm9uKHBhZ2UpKSB7Ci0JCWRlY19tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyX2ZpbGUocGFnZSkpOworCWlmICghUGFnZUFub24ob2xkX3BhZ2UpKSB7CisJCWRlY19tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyX2ZpbGUob2xkX3BhZ2UpKTsKIAkJaW5jX21tX2NvdW50ZXIobW0sIE1NX0FOT05QQUdFUyk7CiAJfQogCiAJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHIsIHB0ZV9wZm4oKnB0ZXApKTsKIAlwdGVwX2NsZWFyX2ZsdXNoX25vdGlmeSh2bWEsIGFkZHIsIHB0ZXApOwotCXNldF9wdGVfYXRfbm90aWZ5KG1tLCBhZGRyLCBwdGVwLCBta19wdGUoa3BhZ2UsIHZtYS0+dm1fcGFnZV9wcm90KSk7CisJc2V0X3B0ZV9hdF9ub3RpZnkobW0sIGFkZHIsIHB0ZXAsIG1rX3B0ZShuZXdfcGFnZSwgdm1hLT52bV9wYWdlX3Byb3QpKTsKIAotCXBhZ2VfcmVtb3ZlX3JtYXAocGFnZSwgZmFsc2UpOwotCWlmICghcGFnZV9tYXBwZWQocGFnZSkpCi0JCXRyeV90b19mcmVlX3N3YXAocGFnZSk7CisJcGFnZV9yZW1vdmVfcm1hcChvbGRfcGFnZSwgZmFsc2UpOworCWlmICghcGFnZV9tYXBwZWQob2xkX3BhZ2UpKQorCQl0cnlfdG9fZnJlZV9zd2FwKG9sZF9wYWdlKTsKIAlwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7CiAKIAlpZiAodm1hLT52bV9mbGFncyAmIFZNX0xPQ0tFRCkKLQkJbXVubG9ja192bWFfcGFnZShwYWdlKTsKLQlwdXRfcGFnZShwYWdlKTsKKwkJbXVubG9ja192bWFfcGFnZShvbGRfcGFnZSk7CisJcHV0X3BhZ2Uob2xkX3BhZ2UpOwogCiAJZXJyID0gMDsKICB1bmxvY2s6Ci0JbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlKGtwYWdlLCBtZW1jZywgZmFsc2UpOwogCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZChtbSwgbW11bl9zdGFydCwgbW11bl9lbmQpOwotCXVubG9ja19wYWdlKHBhZ2UpOworCXVubG9ja19wYWdlKG9sZF9wYWdlKTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCAyZjk3NGFlLi4xZTFkOTEzIDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCisrKyBiL2tlcm5lbC9leGl0LmMKQEAgLTcyNSw3ICs3MjUsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3N0YWNrX3VzYWdlKHZvaWQpIHt9CiAjZW5kaWYKIAotdm9pZCBkb19leGl0KGxvbmcgY29kZSkKK3ZvaWQgX19ub3JldHVybiBkb19leGl0KGxvbmcgY29kZSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAJaW50IGdyb3VwX2RlYWQ7CkBAIC04NDgsMTIgKzg0OCw3IEBACiAJVEFTS1NfUkNVKHByZWVtcHRfZW5hYmxlKCkpOwogCWV4aXRfbm90aWZ5KHRzaywgZ3JvdXBfZGVhZCk7CiAJcHJvY19leGl0X2Nvbm5lY3Rvcih0c2spOwotI2lmZGVmIENPTkZJR19OVU1BCi0JdGFza19sb2NrKHRzayk7Ci0JbXBvbF9wdXQodHNrLT5tZW1wb2xpY3kpOwotCXRzay0+bWVtcG9saWN5ID0gTlVMTDsKLQl0YXNrX3VubG9jayh0c2spOwotI2VuZGlmCisJbXBvbF9wdXRfdGFza19wb2xpY3kodHNrKTsKICNpZmRlZiBDT05GSUdfRlVURVgKIAlpZiAodW5saWtlbHkoY3VycmVudC0+cGlfc3RhdGVfY2FjaGUpKQogCQlrZnJlZShjdXJyZW50LT5waV9zdGF0ZV9jYWNoZSk7CkBAIC04ODcsMjkgKzg4Miw3IEBACiAJZXhpdF9yY3UoKTsKIAlUQVNLU19SQ1UoX19zcmN1X3JlYWRfdW5sb2NrKCZ0YXNrc19yY3VfZXhpdF9zcmN1LCB0YXNrc19yY3VfaSkpOwogCi0JLyoKLQkgKiBUaGUgc2V0dGluZyBvZiBUQVNLX1JVTk5JTkcgYnkgdHJ5X3RvX3dha2VfdXAoKSBtYXkgYmUgZGVsYXllZAotCSAqIHdoZW4gdGhlIGZvbGxvd2luZyB0d28gY29uZGl0aW9ucyBiZWNvbWUgdHJ1ZS4KLQkgKiAgIC0gVGhlcmUgaXMgcmFjZSBjb25kaXRpb24gb2YgbW1hcF9zZW0gKEl0IGlzIGFjcXVpcmVkIGJ5Ci0JICogICAgIGV4aXRfbW0oKSksIGFuZAotCSAqICAgLSBTTUkgb2NjdXJzIGJlZm9yZSBzZXR0aW5nIFRBU0tfUlVOSU5ORy4KLQkgKiAgICAgKG9yIGh5cGVydmlzb3Igb2YgdmlydHVhbCBtYWNoaW5lIHN3aXRjaGVzIHRvIG90aGVyIGd1ZXN0KQotCSAqICBBcyBhIHJlc3VsdCwgd2UgbWF5IGJlY29tZSBUQVNLX1JVTk5JTkcgYWZ0ZXIgYmVjb21pbmcgVEFTS19ERUFECi0JICoKLQkgKiBUbyBhdm9pZCBpdCwgd2UgaGF2ZSB0byB3YWl0IGZvciByZWxlYXNpbmcgdHNrLT5waV9sb2NrIHdoaWNoCi0JICogaXMgaGVsZCBieSB0cnlfdG9fd2FrZV91cCgpCi0JICovCi0Jc21wX21iKCk7Ci0JcmF3X3NwaW5fdW5sb2NrX3dhaXQoJnRzay0+cGlfbG9jayk7Ci0KLQkvKiBjYXVzZXMgZmluYWwgcHV0X3Rhc2tfc3RydWN0IGluIGZpbmlzaF90YXNrX3N3aXRjaCgpLiAqLwotCXRzay0+c3RhdGUgPSBUQVNLX0RFQUQ7Ci0JdHNrLT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsJLyogdGVsbCBmcmVlemVyIHRvIGlnbm9yZSB1cyAqLwotCXNjaGVkdWxlKCk7Ci0JQlVHKCk7Ci0JLyogQXZvaWQgIm5vcmV0dXJuIGZ1bmN0aW9uIGRvZXMgcmV0dXJuIi4gICovCi0JZm9yICg7OykKLQkJY3B1X3JlbGF4KCk7CS8qIEZvciB3aGVuIEJVRyBpcyBudWxsICovCisJZG9fdGFza19kZWFkKCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkb19leGl0KTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggNTJlNzI1ZDQuLmMwNjBjN2UgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mb3JrLmMKKysrIGIva2VybmVsL2ZvcmsuYwpAQCAtMTU4LDE5ICsxNTgsODMgQEAKICAqIEFsbG9jYXRlIHBhZ2VzIGlmIFRIUkVBRF9TSVpFIGlzID49IFBBR0VfU0laRSwgb3RoZXJ3aXNlIHVzZSBhCiAgKiBrbWVtY2FjaGUgYmFzZWQgYWxsb2NhdG9yLgogICovCi0jIGlmIFRIUkVBRF9TSVpFID49IFBBR0VfU0laRQotc3RhdGljIHVuc2lnbmVkIGxvbmcgKmFsbG9jX3RocmVhZF9zdGFja19ub2RlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAotCQkJCQkJICBpbnQgbm9kZSkKKyMgaWYgVEhSRUFEX1NJWkUgPj0gUEFHRV9TSVpFIHx8IGRlZmluZWQoQ09ORklHX1ZNQVBfU1RBQ0spCisKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworLyoKKyAqIHZtYWxsb2MoKSBpcyBhIGJpdCBzbG93LCBhbmQgY2FsbGluZyB2ZnJlZSgpIGVub3VnaCB0aW1lcyB3aWxsIGZvcmNlIGEgVExCCisgKiBmbHVzaC4gIFRyeSB0byBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIGNhbGxzIGJ5IGNhY2hpbmcgc3RhY2tzLgorICovCisjZGVmaW5lIE5SX0NBQ0hFRF9TVEFDS1MgMgorc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB2bV9zdHJ1Y3QgKiwgY2FjaGVkX3N0YWNrc1tOUl9DQUNIRURfU1RBQ0tTXSk7CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgKmFsbG9jX3RocmVhZF9zdGFja19ub2RlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgbm9kZSkKIHsKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworCXZvaWQgKnN0YWNrOworCWludCBpOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ0FDSEVEX1NUQUNLUzsgaSsrKSB7CisJCXN0cnVjdCB2bV9zdHJ1Y3QgKnMgPSB0aGlzX2NwdV9yZWFkKGNhY2hlZF9zdGFja3NbaV0pOworCisJCWlmICghcykKKwkJCWNvbnRpbnVlOworCQl0aGlzX2NwdV93cml0ZShjYWNoZWRfc3RhY2tzW2ldLCBOVUxMKTsKKworCQl0c2stPnN0YWNrX3ZtX2FyZWEgPSBzOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCXJldHVybiBzLT5hZGRyOworCX0KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwlzdGFjayA9IF9fdm1hbGxvY19ub2RlX3JhbmdlKFRIUkVBRF9TSVpFLCBUSFJFQURfU0laRSwKKwkJCQkgICAgIFZNQUxMT0NfU1RBUlQsIFZNQUxMT0NfRU5ELAorCQkJCSAgICAgVEhSRUFESU5GT19HRlAgfCBfX0dGUF9ISUdITUVNLAorCQkJCSAgICAgUEFHRV9LRVJORUwsCisJCQkJICAgICAwLCBub2RlLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCisJLyoKKwkgKiBXZSBjYW4ndCBjYWxsIGZpbmRfdm1fYXJlYSgpIGluIGludGVycnVwdCBjb250ZXh0LCBhbmQKKwkgKiBmcmVlX3RocmVhZF9zdGFjaygpIGNhbiBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQsCisJICogc28gY2FjaGUgdGhlIHZtX3N0cnVjdC4KKwkgKi8KKwlpZiAoc3RhY2spCisJCXRzay0+c3RhY2tfdm1fYXJlYSA9IGZpbmRfdm1fYXJlYShzdGFjayk7CisJcmV0dXJuIHN0YWNrOworI2Vsc2UKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobm9kZSwgVEhSRUFESU5GT19HRlAsCiAJCQkJCSAgICAgVEhSRUFEX1NJWkVfT1JERVIpOwogCiAJcmV0dXJuIHBhZ2UgPyBwYWdlX2FkZHJlc3MocGFnZSkgOiBOVUxMOworI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3RocmVhZF9zdGFjayh1bnNpZ25lZCBsb25nICpzdGFjaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3RocmVhZF9zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKLQlfX2ZyZWVfcGFnZXModmlydF90b19wYWdlKHN0YWNrKSwgVEhSRUFEX1NJWkVfT1JERVIpOworI2lmZGVmIENPTkZJR19WTUFQX1NUQUNLCisJaWYgKHRhc2tfc3RhY2tfdm1fYXJlYSh0c2spKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCWludCBpOworCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJZm9yIChpID0gMDsgaSA8IE5SX0NBQ0hFRF9TVEFDS1M7IGkrKykgeworCQkJaWYgKHRoaXNfY3B1X3JlYWQoY2FjaGVkX3N0YWNrc1tpXSkpCisJCQkJY29udGludWU7CisKKwkJCXRoaXNfY3B1X3dyaXRlKGNhY2hlZF9zdGFja3NbaV0sIHRzay0+c3RhY2tfdm1fYXJlYSk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJCXZmcmVlKHRzay0+c3RhY2spOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKwlfX2ZyZWVfcGFnZXModmlydF90b19wYWdlKHRzay0+c3RhY2spLCBUSFJFQURfU0laRV9PUkRFUik7CiB9CiAjIGVsc2UKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqdGhyZWFkX3N0YWNrX2NhY2hlOwpAQCAtMTgxLDkgKzI0NSw5IEBACiAJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2Nfbm9kZSh0aHJlYWRfc3RhY2tfY2FjaGUsIFRIUkVBRElORk9fR0ZQLCBub2RlKTsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV90aHJlYWRfc3RhY2sodW5zaWduZWQgbG9uZyAqc3RhY2spCitzdGF0aWMgdm9pZCBmcmVlX3RocmVhZF9zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKLQlrbWVtX2NhY2hlX2ZyZWUodGhyZWFkX3N0YWNrX2NhY2hlLCBzdGFjayk7CisJa21lbV9jYWNoZV9mcmVlKHRocmVhZF9zdGFja19jYWNoZSwgdHNrLT5zdGFjayk7CiB9CiAKIHZvaWQgdGhyZWFkX3N0YWNrX2NhY2hlX2luaXQodm9pZCkKQEAgLTIxMywyNCArMjc3LDc2IEBACiAvKiBTTEFCIGNhY2hlIGZvciBtbV9zdHJ1Y3Qgc3RydWN0dXJlcyAodHNrLT5tbSkgKi8KIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqbW1fY2FjaGVwOwogCi1zdGF0aWMgdm9pZCBhY2NvdW50X2tlcm5lbF9zdGFjayh1bnNpZ25lZCBsb25nICpzdGFjaywgaW50IGFjY291bnQpCitzdGF0aWMgdm9pZCBhY2NvdW50X2tlcm5lbF9zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGFjY291bnQpCiB7Ci0JLyogQWxsIHN0YWNrIHBhZ2VzIGFyZSBpbiB0aGUgc2FtZSB6b25lIGFuZCBiZWxvbmcgdG8gdGhlIHNhbWUgbWVtY2cuICovCi0Jc3RydWN0IHBhZ2UgKmZpcnN0X3BhZ2UgPSB2aXJ0X3RvX3BhZ2Uoc3RhY2spOworCXZvaWQgKnN0YWNrID0gdGFza19zdGFja19wYWdlKHRzayk7CisJc3RydWN0IHZtX3N0cnVjdCAqdm0gPSB0YXNrX3N0YWNrX3ZtX2FyZWEodHNrKTsKIAotCW1vZF96b25lX3BhZ2Vfc3RhdGUocGFnZV96b25lKGZpcnN0X3BhZ2UpLCBOUl9LRVJORUxfU1RBQ0tfS0IsCi0JCQkgICAgVEhSRUFEX1NJWkUgLyAxMDI0ICogYWNjb3VudCk7CisJQlVJTERfQlVHX09OKElTX0VOQUJMRUQoQ09ORklHX1ZNQVBfU1RBQ0spICYmIFBBR0VfU0laRSAlIDEwMjQgIT0gMCk7CiAKLQltZW1jZ19rbWVtX3VwZGF0ZV9wYWdlX3N0YXQoCi0JCWZpcnN0X3BhZ2UsIE1FTUNHX0tFUk5FTF9TVEFDS19LQiwKLQkJYWNjb3VudCAqIChUSFJFQURfU0laRSAvIDEwMjQpKTsKKwlpZiAodm0pIHsKKwkJaW50IGk7CisKKwkJQlVHX09OKHZtLT5ucl9wYWdlcyAhPSBUSFJFQURfU0laRSAvIFBBR0VfU0laRSk7CisKKwkJZm9yIChpID0gMDsgaSA8IFRIUkVBRF9TSVpFIC8gUEFHRV9TSVpFOyBpKyspIHsKKwkJCW1vZF96b25lX3BhZ2Vfc3RhdGUocGFnZV96b25lKHZtLT5wYWdlc1tpXSksCisJCQkJCSAgICBOUl9LRVJORUxfU1RBQ0tfS0IsCisJCQkJCSAgICBQQUdFX1NJWkUgLyAxMDI0ICogYWNjb3VudCk7CisJCX0KKworCQkvKiBBbGwgc3RhY2sgcGFnZXMgYmVsb25nIHRvIHRoZSBzYW1lIG1lbWNnLiAqLworCQltZW1jZ19rbWVtX3VwZGF0ZV9wYWdlX3N0YXQodm0tPnBhZ2VzWzBdLCBNRU1DR19LRVJORUxfU1RBQ0tfS0IsCisJCQkJCSAgICBhY2NvdW50ICogKFRIUkVBRF9TSVpFIC8gMTAyNCkpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEFsbCBzdGFjayBwYWdlcyBhcmUgaW4gdGhlIHNhbWUgem9uZSBhbmQgYmVsb25nIHRvIHRoZQorCQkgKiBzYW1lIG1lbWNnLgorCQkgKi8KKwkJc3RydWN0IHBhZ2UgKmZpcnN0X3BhZ2UgPSB2aXJ0X3RvX3BhZ2Uoc3RhY2spOworCisJCW1vZF96b25lX3BhZ2Vfc3RhdGUocGFnZV96b25lKGZpcnN0X3BhZ2UpLCBOUl9LRVJORUxfU1RBQ0tfS0IsCisJCQkJICAgIFRIUkVBRF9TSVpFIC8gMTAyNCAqIGFjY291bnQpOworCisJCW1lbWNnX2ttZW1fdXBkYXRlX3BhZ2Vfc3RhdChmaXJzdF9wYWdlLCBNRU1DR19LRVJORUxfU1RBQ0tfS0IsCisJCQkJCSAgICBhY2NvdW50ICogKFRIUkVBRF9TSVpFIC8gMTAyNCkpOworCX0KIH0KIAorc3RhdGljIHZvaWQgcmVsZWFzZV90YXNrX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCWFjY291bnRfa2VybmVsX3N0YWNrKHRzaywgLTEpOworCWFyY2hfcmVsZWFzZV90aHJlYWRfc3RhY2sodHNrLT5zdGFjayk7CisJZnJlZV90aHJlYWRfc3RhY2sodHNrKTsKKwl0c2stPnN0YWNrID0gTlVMTDsKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworCXRzay0+c3RhY2tfdm1fYXJlYSA9IE5VTEw7CisjZW5kaWYKK30KKworI2lmZGVmIENPTkZJR19USFJFQURfSU5GT19JTl9UQVNLCit2b2lkIHB1dF90YXNrX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZ0c2stPnN0YWNrX3JlZmNvdW50KSkKKwkJcmVsZWFzZV90YXNrX3N0YWNrKHRzayk7Cit9CisjZW5kaWYKKwogdm9pZCBmcmVlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7Ci0JYWNjb3VudF9rZXJuZWxfc3RhY2sodHNrLT5zdGFjaywgLTEpOwotCWFyY2hfcmVsZWFzZV90aHJlYWRfc3RhY2sodHNrLT5zdGFjayk7Ci0JZnJlZV90aHJlYWRfc3RhY2sodHNrLT5zdGFjayk7CisjaWZuZGVmIENPTkZJR19USFJFQURfSU5GT19JTl9UQVNLCisJLyoKKwkgKiBUaGUgdGFzayBpcyBmaW5hbGx5IGRvbmUgd2l0aCBib3RoIHRoZSBzdGFjayBhbmQgdGhyZWFkX2luZm8sCisJICogc28gZnJlZSBib3RoLgorCSAqLworCXJlbGVhc2VfdGFza19zdGFjayh0c2spOworI2Vsc2UKKwkvKgorCSAqIElmIHRoZSB0YXNrIGhhZCBhIHNlcGFyYXRlIHN0YWNrIGFsbG9jYXRpb24sIGl0IHNob3VsZCBiZSBnb25lCisJICogYnkgbm93LgorCSAqLworCVdBUk5fT05fT05DRShhdG9taWNfcmVhZCgmdHNrLT5zdGFja19yZWZjb3VudCkgIT0gMCk7CisjZW5kaWYKIAlydF9tdXRleF9kZWJ1Z190YXNrX2ZyZWUodHNrKTsKIAlmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHRzayk7CiAJcHV0X3NlY2NvbXBfZmlsdGVyKHRzayk7CkBAIC0zNDIsNiArNDU4LDcgQEAKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKIAl1bnNpZ25lZCBsb25nICpzdGFjazsKKwlzdHJ1Y3Qgdm1fc3RydWN0ICpzdGFja192bV9hcmVhOwogCWludCBlcnI7CiAKIAlpZiAobm9kZSA9PSBOVU1BX05PX05PREUpCkBAIC0zNTQsMTEgKzQ3MSwyNiBAQAogCWlmICghc3RhY2spCiAJCWdvdG8gZnJlZV90c2s7CiAKKwlzdGFja192bV9hcmVhID0gdGFza19zdGFja192bV9hcmVhKHRzayk7CisKIAllcnIgPSBhcmNoX2R1cF90YXNrX3N0cnVjdCh0c2ssIG9yaWcpOworCisJLyoKKwkgKiBhcmNoX2R1cF90YXNrX3N0cnVjdCgpIGNsb2JiZXJzIHRoZSBzdGFjay1yZWxhdGVkIGZpZWxkcy4gIE1ha2UKKwkgKiBzdXJlIHRoZXkncmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzaW5nIGFueSBzdGFjay1yZWxhdGVkCisJICogZnVuY3Rpb25zIGFnYWluLgorCSAqLworCXRzay0+c3RhY2sgPSBzdGFjazsKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworCXRzay0+c3RhY2tfdm1fYXJlYSA9IHN0YWNrX3ZtX2FyZWE7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSworCWF0b21pY19zZXQoJnRzay0+c3RhY2tfcmVmY291bnQsIDEpOworI2VuZGlmCisKIAlpZiAoZXJyKQogCQlnb3RvIGZyZWVfc3RhY2s7CiAKLQl0c2stPnN0YWNrID0gc3RhY2s7CiAjaWZkZWYgQ09ORklHX1NFQ0NPTVAKIAkvKgogCSAqIFdlIG11c3QgaGFuZGxlIHNldHRpbmcgdXAgc2VjY29tcCBmaWx0ZXJzIG9uY2Ugd2UncmUgdW5kZXIKQEAgLTM5MCwxNCArNTIyLDE0IEBACiAJdHNrLT50YXNrX2ZyYWcucGFnZSA9IE5VTEw7CiAJdHNrLT53YWtlX3EubmV4dCA9IE5VTEw7CiAKLQlhY2NvdW50X2tlcm5lbF9zdGFjayhzdGFjaywgMSk7CisJYWNjb3VudF9rZXJuZWxfc3RhY2sodHNrLCAxKTsKIAogCWtjb3ZfdGFza19pbml0KHRzayk7CiAKIAlyZXR1cm4gdHNrOwogCiBmcmVlX3N0YWNrOgotCWZyZWVfdGhyZWFkX3N0YWNrKHN0YWNrKTsKKwlmcmVlX3RocmVhZF9zdGFjayh0c2spOwogZnJlZV90c2s6CiAJZnJlZV90YXNrX3N0cnVjdCh0c2spOwogCXJldHVybiBOVUxMOwpAQCAtNzk5LDYgKzkzMSwyOSBAQAogRVhQT1JUX1NZTUJPTChnZXRfbW1fZXhlX2ZpbGUpOwogCiAvKioKKyAqIGdldF90YXNrX2V4ZV9maWxlIC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzaydzIGV4ZWN1dGFibGUgZmlsZQorICoKKyAqIFJldHVybnMgJU5VTEwgaWYgdGFzaydzIG1tIChpZiBhbnkpIGhhcyBubyBhc3NvY2lhdGVkIGV4ZWN1dGFibGUgZmlsZSBvcgorICogdGhpcyBpcyBhIGtlcm5lbCB0aHJlYWQgd2l0aCBib3Jyb3dlZCBtbSAoc2VlIHRoZSBjb21tZW50IGFib3ZlIGdldF90YXNrX21tKS4KKyAqIFVzZXIgbXVzdCByZWxlYXNlIGZpbGUgdmlhIGZwdXQoKS4KKyAqLworc3RydWN0IGZpbGUgKmdldF90YXNrX2V4ZV9maWxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlzdHJ1Y3QgZmlsZSAqZXhlX2ZpbGUgPSBOVUxMOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCisJdGFza19sb2NrKHRhc2spOworCW1tID0gdGFzay0+bW07CisJaWYgKG1tKSB7CisJCWlmICghKHRhc2stPmZsYWdzICYgUEZfS1RIUkVBRCkpCisJCQlleGVfZmlsZSA9IGdldF9tbV9leGVfZmlsZShtbSk7CisJfQorCXRhc2tfdW5sb2NrKHRhc2spOworCXJldHVybiBleGVfZmlsZTsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X3Rhc2tfZXhlX2ZpbGUpOworCisvKioKICAqIGdldF90YXNrX21tIC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzaydzIG1tCiAgKgogICogUmV0dXJucyAlTlVMTCBpZiB0aGUgdGFzayBoYXMgbm8gbW0uICBDaGVja3MgUEZfS1RIUkVBRCAobWVhbmluZwpAQCAtOTEzLDE0ICsxMDY4LDEyIEBACiAJZGVhY3RpdmF0ZV9tbSh0c2ssIG1tKTsKIAogCS8qCi0JICogSWYgd2UncmUgZXhpdGluZyBub3JtYWxseSwgY2xlYXIgYSB1c2VyLXNwYWNlIHRpZCBmaWVsZCBpZgotCSAqIHJlcXVlc3RlZC4gIFdlIGxlYXZlIHRoaXMgYWxvbmUgd2hlbiBkeWluZyBieSBzaWduYWwsIHRvIGxlYXZlCi0JICogdGhlIHZhbHVlIGludGFjdCBpbiBhIGNvcmUgZHVtcCwgYW5kIHRvIHNhdmUgdGhlIHVubmVjZXNzYXJ5Ci0JICogdHJvdWJsZSwgc2F5LCBhIGtpbGxlZCB2Zm9yayBwYXJlbnQgc2hvdWxkbid0IHRvdWNoIHRoaXMgbW0uCi0JICogVXNlcmxhbmQgb25seSB3YW50cyB0aGlzIGRvbmUgZm9yIGEgc3lzX2V4aXQuCisJICogU2lnbmFsIHVzZXJzcGFjZSBpZiB3ZSdyZSBub3QgZXhpdGluZyB3aXRoIGEgY29yZSBkdW1wCisJICogYmVjYXVzZSB3ZSB3YW50IHRvIGxlYXZlIHRoZSB2YWx1ZSBpbnRhY3QgZm9yIGRlYnVnZ2luZworCSAqIHB1cnBvc2VzLgogCSAqLwogCWlmICh0c2stPmNsZWFyX2NoaWxkX3RpZCkgewotCQlpZiAoISh0c2stPmZsYWdzICYgUEZfU0lHTkFMRUQpICYmCisJCWlmICghKHRzay0+c2lnbmFsLT5mbGFncyAmIFNJR05BTF9HUk9VUF9DT1JFRFVNUCkgJiYKIAkJICAgIGF0b21pY19yZWFkKCZtbS0+bW1fdXNlcnMpID4gMSkgewogCQkJLyoKIAkJCSAqIFdlIGRvbid0IGNoZWNrIHRoZSBlcnJvciBjb2RlIC0gaWYgdXNlcnNwYWNlIGhhcwpAQCAtMTQwNCw3ICsxNTU3LDYgQEAKIAlwLT5yZWFsX3N0YXJ0X3RpbWUgPSBrdGltZV9nZXRfYm9vdF9ucygpOwogCXAtPmlvX2NvbnRleHQgPSBOVUxMOwogCXAtPmF1ZGl0X2NvbnRleHQgPSBOVUxMOwotCXRocmVhZGdyb3VwX2NoYW5nZV9iZWdpbihjdXJyZW50KTsKIAljZ3JvdXBfZm9yayhwKTsKICNpZmRlZiBDT05GSUdfTlVNQQogCXAtPm1lbXBvbGljeSA9IG1wb2xfZHVwKHAtPm1lbXBvbGljeSk7CkBAIC0xNTU2LDYgKzE3MDgsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZwLT50aHJlYWRfZ3JvdXApOwogCXAtPnRhc2tfd29ya3MgPSBOVUxMOwogCisJdGhyZWFkZ3JvdXBfY2hhbmdlX2JlZ2luKGN1cnJlbnQpOwogCS8qCiAJICogRW5zdXJlIHRoYXQgdGhlIGNncm91cCBzdWJzeXN0ZW0gcG9saWNpZXMgYWxsb3cgdGhlIG5ldyBwcm9jZXNzIHRvIGJlCiAJICogZm9ya2VkLiBJdCBzaG91bGQgYmUgbm90ZWQgdGhlIHRoZSBuZXcgcHJvY2VzcydzIGNzc19zZXQgY2FuIGJlIGNoYW5nZWQKQEAgLTE2NTYsNiArMTgwOSw3IEBACiBiYWRfZm9ya19jYW5jZWxfY2dyb3VwOgogCWNncm91cF9jYW5jZWxfZm9yayhwKTsKIGJhZF9mb3JrX2ZyZWVfcGlkOgorCXRocmVhZGdyb3VwX2NoYW5nZV9lbmQoY3VycmVudCk7CiAJaWYgKHBpZCAhPSAmaW5pdF9zdHJ1Y3RfcGlkKQogCQlmcmVlX3BpZChwaWQpOwogYmFkX2ZvcmtfY2xlYW51cF90aHJlYWQ6CkBAIC0xNjg4LDEyICsxODQyLDEyIEBACiAJbXBvbF9wdXQocC0+bWVtcG9saWN5KTsKIGJhZF9mb3JrX2NsZWFudXBfdGhyZWFkZ3JvdXBfbG9jazoKICNlbmRpZgotCXRocmVhZGdyb3VwX2NoYW5nZV9lbmQoY3VycmVudCk7CiAJZGVsYXlhY2N0X3Rza19mcmVlKHApOwogYmFkX2ZvcmtfY2xlYW51cF9jb3VudDoKIAlhdG9taWNfZGVjKCZwLT5jcmVkLT51c2VyLT5wcm9jZXNzZXMpOwogCWV4aXRfY3JlZHMocCk7CiBiYWRfZm9ya19mcmVlOgorCXB1dF90YXNrX3N0YWNrKHApOwogCWZyZWVfdGFzayhwKTsKIGZvcmtfb3V0OgogCXJldHVybiBFUlJfUFRSKHJldHZhbCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvZnV0ZXguYyBiL2tlcm5lbC9mdXRleC5jCmluZGV4IDQ2Y2IzYTMuLjJjNGJlNDYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mdXRleC5jCisrKyBiL2tlcm5lbC9mdXRleC5jCkBAIC0zODEsOCArMzgxLDEyIEBACiAjZW5kaWYKIH0KIAotLyoKLSAqIFdlIGhhc2ggb24gdGhlIGtleXMgcmV0dXJuZWQgZnJvbSBnZXRfZnV0ZXhfa2V5IChzZWUgYmVsb3cpLgorLyoqCisgKiBoYXNoX2Z1dGV4IC0gUmV0dXJuIHRoZSBoYXNoIGJ1Y2tldCBpbiB0aGUgZ2xvYmFsIGhhc2gKKyAqIEBrZXk6CVBvaW50ZXIgdG8gdGhlIGZ1dGV4IGtleSBmb3Igd2hpY2ggdGhlIGhhc2ggaXMgY2FsY3VsYXRlZAorICoKKyAqIFdlIGhhc2ggb24gdGhlIGtleXMgcmV0dXJuZWQgZnJvbSBnZXRfZnV0ZXhfa2V5IChzZWUgYmVsb3cpIGFuZCByZXR1cm4gdGhlCisgKiBjb3JyZXNwb25kaW5nIGhhc2ggYnVja2V0IGluIHRoZSBnbG9iYWwgaGFzaC4KICAqLwogc3RhdGljIHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGFzaF9mdXRleCh1bmlvbiBmdXRleF9rZXkgKmtleSkKIHsKQEAgLTM5Miw3ICszOTYsMTIgQEAKIAlyZXR1cm4gJmZ1dGV4X3F1ZXVlc1toYXNoICYgKGZ1dGV4X2hhc2hzaXplIC0gMSldOwogfQogCi0vKgorCisvKioKKyAqIG1hdGNoX2Z1dGV4IC0gQ2hlY2sgd2hldGhlciB0d28gZnV0ZXgga2V5cyBhcmUgZXF1YWwKKyAqIEBrZXkxOglQb2ludGVyIHRvIGtleTEKKyAqIEBrZXkyOglQb2ludGVyIHRvIGtleTIKKyAqCiAgKiBSZXR1cm4gMSBpZiB0d28gZnV0ZXhfa2V5cyBhcmUgZXF1YWwsIDAgb3RoZXJ3aXNlLgogICovCiBzdGF0aWMgaW5saW5lIGludCBtYXRjaF9mdXRleCh1bmlvbiBmdXRleF9rZXkgKmtleTEsIHVuaW9uIGZ1dGV4X2tleSAqa2V5MikKZGlmZiAtLWdpdCBhL2tlcm5lbC9odW5nX3Rhc2suYyBiL2tlcm5lbC9odW5nX3Rhc2suYwppbmRleCBkMjM0MDIyLi40MzJjM2Q3IDEwMDY0NAotLS0gYS9rZXJuZWwvaHVuZ190YXNrLmMKKysrIGIva2VybmVsL2h1bmdfdGFzay5jCkBAIC0xMTcsNyArMTE3LDcgQEAKIAlwcl9lcnIoIlwiZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9odW5nX3Rhc2tfdGltZW91dF9zZWNzXCIiCiAJCSIgZGlzYWJsZXMgdGhpcyBtZXNzYWdlLlxuIik7CiAJc2NoZWRfc2hvd190YXNrKHQpOwotCWRlYnVnX3Nob3dfaGVsZF9sb2Nrcyh0KTsKKwlkZWJ1Z19zaG93X2FsbF9sb2NrcygpOwogCiAJdG91Y2hfbm1pX3dhdGNoZG9nKCk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvYWZmaW5pdHkuYyBiL2tlcm5lbC9pcnEvYWZmaW5pdHkuYwppbmRleCBmNjg5NTkzLi4xN2Y1MWQ2MyAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9hZmZpbml0eS5jCisrKyBiL2tlcm5lbC9pcnEvYWZmaW5pdHkuYwpAQCAtNCw1OCArNCwxNTEgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKLXN0YXRpYyBpbnQgZ2V0X2ZpcnN0X3NpYmxpbmcodW5zaWduZWQgaW50IGNwdSkKK3N0YXRpYyB2b2lkIGlycV9zcHJlYWRfaW5pdF9vbmUoc3RydWN0IGNwdW1hc2sgKmlycW1zaywgc3RydWN0IGNwdW1hc2sgKm5tc2ssCisJCQkJaW50IGNwdXNfcGVyX3ZlYykKIHsKLQl1bnNpZ25lZCBpbnQgcmV0OworCWNvbnN0IHN0cnVjdCBjcHVtYXNrICpzaWJsbXNrOworCWludCBjcHUsIHNpYmw7CiAKLQlyZXQgPSBjcHVtYXNrX2ZpcnN0KHRvcG9sb2d5X3NpYmxpbmdfY3B1bWFzayhjcHUpKTsKLQlpZiAocmV0IDwgbnJfY3B1X2lkcykKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gY3B1OworCWZvciAoIDsgY3B1c19wZXJfdmVjID4gMDsgKSB7CisJCWNwdSA9IGNwdW1hc2tfZmlyc3Qobm1zayk7CisKKwkJLyogU2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBJJ20gdG9vIGxhenkgdG8gdGhpbmsgYWJvdXQgaXQgKi8KKwkJaWYgKGNwdSA+PSBucl9jcHVfaWRzKQorCQkJcmV0dXJuOworCisJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgbm1zayk7CisJCWNwdW1hc2tfc2V0X2NwdShjcHUsIGlycW1zayk7CisJCWNwdXNfcGVyX3ZlYy0tOworCisJCS8qIElmIHRoZSBjcHUgaGFzIHNpYmxpbmdzLCB1c2UgdGhlbSBmaXJzdCAqLworCQlzaWJsbXNrID0gdG9wb2xvZ3lfc2libGluZ19jcHVtYXNrKGNwdSk7CisJCWZvciAoc2libCA9IC0xOyBjcHVzX3Blcl92ZWMgPiAwOyApIHsKKwkJCXNpYmwgPSBjcHVtYXNrX25leHQoc2libCwgc2libG1zayk7CisJCQlpZiAoc2libCA+PSBucl9jcHVfaWRzKQorCQkJCWJyZWFrOworCQkJaWYgKCFjcHVtYXNrX3Rlc3RfYW5kX2NsZWFyX2NwdShzaWJsLCBubXNrKSkKKwkJCQljb250aW51ZTsKKwkJCWNwdW1hc2tfc2V0X2NwdShzaWJsLCBpcnFtc2spOworCQkJY3B1c19wZXJfdmVjLS07CisJCX0KKwl9CiB9CiAKLS8qCi0gKiBUYWtlIGEgbWFwIG9mIG9ubGluZSBDUFVzIGFuZCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBpbnRlcnJ1cHQgdmVjdG9ycwotICogYW5kIGdlbmVyYXRlIGFuIG91dHB1dCBjcHVtYXNrIHN1aXRhYmxlIGZvciBzcHJlYWRpbmcgTVNJL01TSS1YIHZlY3RvcnMKLSAqIHNvIHRoYXQgdGhleSBhcmUgZGlzdHJpYnV0ZWQgYXMgZ29vZCBhcyBwb3NzaWJsZSBhcm91bmQgdGhlIENQVXMuICBJZgotICogbW9yZSB2ZWN0b3JzIHRoYW4gQ1BVcyBhcmUgYXZhaWxhYmxlIHdlJ2xsIG1hcCBvbmUgdG8gZWFjaCBDUFUsCi0gKiBvdGhlcndpc2Ugd2UgbWFwIG9uZSB0byB0aGUgZmlyc3Qgc2libGluZyBvZiBlYWNoIHNvY2tldC4KLSAqCi0gKiBJZiB0aGVyZSBhcmUgbW9yZSB2ZWN0b3JzIHRoYW4gQ1BVcyB3ZSB3aWxsIHN0aWxsIG9ubHkgaGF2ZSBvbmUgYml0Ci0gKiBzZXQgcGVyIENQVSwgYnV0IGludGVycnVwdCBjb2RlIHdpbGwga2VlcCBvbiBhc3NpZ25pbmcgdGhlIHZlY3RvcnMgZnJvbQotICogdGhlIHN0YXJ0IG9mIHRoZSBiaXRtYXAgdW50aWwgd2UgcnVuIG91dCBvZiB2ZWN0b3JzLgotICovCi1zdHJ1Y3QgY3B1bWFzayAqaXJxX2NyZWF0ZV9hZmZpbml0eV9tYXNrKHVuc2lnbmVkIGludCAqbnJfdmVjcykKK3N0YXRpYyBpbnQgZ2V0X25vZGVzX2luX2NwdW1hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIG5vZGVtYXNrX3QgKm5vZGVtc2spCiB7Ci0Jc3RydWN0IGNwdW1hc2sgKmFmZmluaXR5X21hc2s7Ci0JdW5zaWduZWQgaW50IG1heF92ZWNzID0gKm5yX3ZlY3M7CisJaW50IG4sIG5vZGVzOwogCi0JaWYgKG1heF92ZWNzID09IDEpCi0JCXJldHVybiBOVUxMOwotCi0JYWZmaW5pdHlfbWFzayA9IGt6YWxsb2MoY3B1bWFza19zaXplKCksIEdGUF9LRVJORUwpOwotCWlmICghYWZmaW5pdHlfbWFzaykgewotCQkqbnJfdmVjcyA9IDE7Ci0JCXJldHVybiBOVUxMOworCS8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBzdXBwbGllZCBhZmZpbml0eSBtYXNrICovCisJZm9yIChuID0gMCwgbm9kZXMgPSAwOyBuIDwgbnVtX29ubGluZV9ub2RlcygpOyBuKyspIHsKKwkJaWYgKGNwdW1hc2tfaW50ZXJzZWN0cyhtYXNrLCBjcHVtYXNrX29mX25vZGUobikpKSB7CisJCQlub2RlX3NldChuLCAqbm9kZW1zayk7CisJCQlub2RlcysrOworCQl9CiAJfQorCXJldHVybiBub2RlczsKK30KIAotCWlmIChtYXhfdmVjcyA+PSBudW1fb25saW5lX2NwdXMoKSkgewotCQljcHVtYXNrX2NvcHkoYWZmaW5pdHlfbWFzaywgY3B1X29ubGluZV9tYXNrKTsKLQkJKm5yX3ZlY3MgPSBudW1fb25saW5lX2NwdXMoKTsKLQl9IGVsc2UgewotCQl1bnNpZ25lZCBpbnQgdmVjcyA9IDAsIGNwdTsKKy8qKgorICogaXJxX2NyZWF0ZV9hZmZpbml0eV9tYXNrcyAtIENyZWF0ZSBhZmZpbml0eSBtYXNrcyBmb3IgbXVsdGlxdWV1ZSBzcHJlYWRpbmcKKyAqIEBhZmZpbml0eToJCVRoZSBhZmZpbml0eSBtYXNrIHRvIHNwcmVhZC4gSWYgTlVMTCBjcHVfb25saW5lX21hc2sKKyAqCQkJaXMgdXNlZAorICogQG52ZWNzOgkJVGhlIG51bWJlciBvZiB2ZWN0b3JzCisgKgorICogUmV0dXJucyB0aGUgbWFza3MgcG9pbnRlciBvciBOVUxMIGlmIGFsbG9jYXRpb24gZmFpbGVkLgorICovCitzdHJ1Y3QgY3B1bWFzayAqaXJxX2NyZWF0ZV9hZmZpbml0eV9tYXNrcyhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYWZmaW5pdHksCisJCQkJCSAgaW50IG52ZWMpCit7CisJaW50IG4sIG5vZGVzLCB2ZWNzX3Blcl9ub2RlLCBjcHVzX3Blcl92ZWMsIGV4dHJhX3ZlY3MsIGN1cnZlYyA9IDA7CisJbm9kZW1hc2tfdCBub2RlbXNrID0gTk9ERV9NQVNLX05PTkU7CisJc3RydWN0IGNwdW1hc2sgKm1hc2tzOworCWNwdW1hc2tfdmFyX3Qgbm1zazsKIAotCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewotCQkJaWYgKGNwdSA9PSBnZXRfZmlyc3Rfc2libGluZyhjcHUpKSB7Ci0JCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgYWZmaW5pdHlfbWFzayk7Ci0JCQkJdmVjcysrOwotCQkJfQorCWlmICghemFsbG9jX2NwdW1hc2tfdmFyKCZubXNrLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIE5VTEw7CiAKLQkJCWlmICgtLW1heF92ZWNzID09IDApCisJbWFza3MgPSBremFsbG9jKG52ZWMgKiBzaXplb2YoKm1hc2tzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtYXNrcykKKwkJZ290byBvdXQ7CisKKwkvKiBTdGFiaWxpemUgdGhlIGNwdW1hc2tzICovCisJZ2V0X29ubGluZV9jcHVzKCk7CisJLyogSWYgdGhlIHN1cHBsaWVkIGFmZmluaXR5IG1hc2sgaXMgTlVMTCwgdXNlIGNwdSBvbmxpbmUgbWFzayAqLworCWlmICghYWZmaW5pdHkpCisJCWFmZmluaXR5ID0gY3B1X29ubGluZV9tYXNrOworCisJbm9kZXMgPSBnZXRfbm9kZXNfaW5fY3B1bWFzayhhZmZpbml0eSwgJm5vZGVtc2spOworCisJLyoKKwkgKiBJZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBtYXNrIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUKKwkgKiBudW1iZXIgb2YgdmVjdG9ycyB3ZSBqdXN0IHNwcmVhZCB0aGUgdmVjdG9ycyBhY3Jvc3MgdGhlIG5vZGVzLgorCSAqLworCWlmIChudmVjIDw9IG5vZGVzKSB7CisJCWZvcl9lYWNoX25vZGVfbWFzayhuLCBub2RlbXNrKSB7CisJCQljcHVtYXNrX2NvcHkobWFza3MgKyBjdXJ2ZWMsIGNwdW1hc2tfb2Zfbm9kZShuKSk7CisJCQlpZiAoKytjdXJ2ZWMgPT0gbnZlYykKIAkJCQlicmVhazsKIAkJfQotCQkqbnJfdmVjcyA9IHZlY3M7CisJCWdvdG8gb3V0b25sOwogCX0KIAotCXJldHVybiBhZmZpbml0eV9tYXNrOworCS8qIFNwcmVhZCB0aGUgdmVjdG9ycyBwZXIgbm9kZSAqLworCXZlY3NfcGVyX25vZGUgPSBudmVjIC8gbm9kZXM7CisJLyogQWNjb3VudCBmb3Igcm91bmRpbmcgZXJyb3JzICovCisJZXh0cmFfdmVjcyA9IG52ZWMgLSAobm9kZXMgKiB2ZWNzX3Blcl9ub2RlKTsKKworCWZvcl9lYWNoX25vZGVfbWFzayhuLCBub2RlbXNrKSB7CisJCWludCBuY3B1cywgdiwgdmVjc190b19hc3NpZ24gPSB2ZWNzX3Blcl9ub2RlOworCisJCS8qIEdldCB0aGUgY3B1cyBvbiB0aGlzIG5vZGUgd2hpY2ggYXJlIGluIHRoZSBtYXNrICovCisJCWNwdW1hc2tfYW5kKG5tc2ssIGFmZmluaXR5LCBjcHVtYXNrX29mX25vZGUobikpOworCisJCS8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGNwdXMgcGVyIHZlY3RvciAqLworCQluY3B1cyA9IGNwdW1hc2tfd2VpZ2h0KG5tc2spOworCisJCWZvciAodiA9IDA7IGN1cnZlYyA8IG52ZWMgJiYgdiA8IHZlY3NfdG9fYXNzaWduOyBjdXJ2ZWMrKywgdisrKSB7CisJCQljcHVzX3Blcl92ZWMgPSBuY3B1cyAvIHZlY3NfdG9fYXNzaWduOworCisJCQkvKiBBY2NvdW50IGZvciBleHRyYSB2ZWN0b3JzIHRvIGNvbXBlbnNhdGUgcm91bmRpbmcgZXJyb3JzICovCisJCQlpZiAoZXh0cmFfdmVjcykgeworCQkJCWNwdXNfcGVyX3ZlYysrOworCQkJCWlmICghLS1leHRyYV92ZWNzKQorCQkJCQl2ZWNzX3Blcl9ub2RlKys7CisJCQl9CisJCQlpcnFfc3ByZWFkX2luaXRfb25lKG1hc2tzICsgY3VydmVjLCBubXNrLCBjcHVzX3Blcl92ZWMpOworCQl9CisKKwkJaWYgKGN1cnZlYyA+PSBudmVjKQorCQkJYnJlYWs7CisJfQorCitvdXRvbmw6CisJcHV0X29ubGluZV9jcHVzKCk7CitvdXQ6CisJZnJlZV9jcHVtYXNrX3ZhcihubXNrKTsKKwlyZXR1cm4gbWFza3M7Cit9CisKKy8qKgorICogaXJxX2NhbGNfYWZmaW5pdHlfdmVjdG9ycyAtIENhbGN1bGF0ZSB0byBvcHRpbWFsIG51bWJlciBvZiB2ZWN0b3JzIGZvciBhIGdpdmVuIGFmZmluaXR5IG1hc2sKKyAqIEBhZmZpbml0eToJCVRoZSBhZmZpbml0eSBtYXNrIHRvIHNwcmVhZC4gSWYgTlVMTCBjcHVfb25saW5lX21hc2sKKyAqCQkJaXMgdXNlZAorICogQG1heHZlYzoJCVRoZSBtYXhpbXVtIG51bWJlciBvZiB2ZWN0b3JzIGF2YWlsYWJsZQorICovCitpbnQgaXJxX2NhbGNfYWZmaW5pdHlfdmVjdG9ycyhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYWZmaW5pdHksIGludCBtYXh2ZWMpCit7CisJaW50IGNwdXMsIHJldDsKKworCS8qIFN0YWJpbGl6ZSB0aGUgY3B1bWFza3MgKi8KKwlnZXRfb25saW5lX2NwdXMoKTsKKwkvKiBJZiB0aGUgc3VwcGxpZWQgYWZmaW5pdHkgbWFzayBpcyBOVUxMLCB1c2UgY3B1IG9ubGluZSBtYXNrICovCisJaWYgKCFhZmZpbml0eSkKKwkJYWZmaW5pdHkgPSBjcHVfb25saW5lX21hc2s7CisKKwljcHVzID0gY3B1bWFza193ZWlnaHQoYWZmaW5pdHkpOworCXJldCA9IChjcHVzIDwgbWF4dmVjKSA/IGNwdXMgOiBtYXh2ZWM7CisKKwlwdXRfb25saW5lX2NwdXMoKTsKKwlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9jaGlwLmMgYi9rZXJuZWwvaXJxL2NoaXAuYwppbmRleCBiNGMxYmM3Li5iZTNjMzRlIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2NoaXAuYworKysgYi9rZXJuZWwvaXJxL2NoaXAuYwpAQCAtNzYsNyArNzYsNiBAQAogCWlmICghZGVzYykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0eXBlICY9IElSUV9UWVBFX1NFTlNFX01BU0s7CiAJcmV0ID0gX19pcnFfc2V0X3RyaWdnZXIoZGVzYywgdHlwZSk7CiAJaXJxX3B1dF9kZXNjX2J1c3VubG9jayhkZXNjLCBmbGFncyk7CiAJcmV0dXJuIHJldDsKQEAgLTc1Niw3ICs3NTUsNiBAQAogewogCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kZXNjX2dldF9jaGlwKGRlc2MpOwogCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbiA9IGRlc2MtPmFjdGlvbjsKLQl2b2lkICpkZXZfaWQgPSByYXdfY3B1X3B0cihhY3Rpb24tPnBlcmNwdV9kZXZfaWQpOwogCXVuc2lnbmVkIGludCBpcnEgPSBpcnFfZGVzY19nZXRfaXJxKGRlc2MpOwogCWlycXJldHVybl90IHJlczsKIApAQCAtNzY1LDE1ICs3NjMsMjYgQEAKIAlpZiAoY2hpcC0+aXJxX2FjaykKIAkJY2hpcC0+aXJxX2FjaygmZGVzYy0+aXJxX2RhdGEpOwogCi0JdHJhY2VfaXJxX2hhbmRsZXJfZW50cnkoaXJxLCBhY3Rpb24pOwotCXJlcyA9IGFjdGlvbi0+aGFuZGxlcihpcnEsIGRldl9pZCk7Ci0JdHJhY2VfaXJxX2hhbmRsZXJfZXhpdChpcnEsIGFjdGlvbiwgcmVzKTsKKwlpZiAobGlrZWx5KGFjdGlvbikpIHsKKwkJdHJhY2VfaXJxX2hhbmRsZXJfZW50cnkoaXJxLCBhY3Rpb24pOworCQlyZXMgPSBhY3Rpb24tPmhhbmRsZXIoaXJxLCByYXdfY3B1X3B0cihhY3Rpb24tPnBlcmNwdV9kZXZfaWQpKTsKKwkJdHJhY2VfaXJxX2hhbmRsZXJfZXhpdChpcnEsIGFjdGlvbiwgcmVzKTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCQlib29sIGVuYWJsZWQgPSBjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgZGVzYy0+cGVyY3B1X2VuYWJsZWQpOworCisJCWlmIChlbmFibGVkKQorCQkJaXJxX3BlcmNwdV9kaXNhYmxlKGRlc2MsIGNwdSk7CisKKwkJcHJfZXJyX29uY2UoIlNwdXJpb3VzJXMgcGVyY3B1IElSUSV1IG9uIENQVSV1XG4iLAorCQkJICAgIGVuYWJsZWQgPyAiIGFuZCB1bm1hc2tlZCIgOiAiIiwgaXJxLCBjcHUpOworCX0KIAogCWlmIChjaGlwLT5pcnFfZW9pKQogCQljaGlwLT5pcnFfZW9pKCZkZXNjLT5pcnFfZGF0YSk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBfX2lycV9kb19zZXRfaGFuZGxlcihzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGUsCiAJCSAgICAgaW50IGlzX2NoYWluZWQsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CkBAIC04MjAsNiArODI5LDIxIEBACiAJZGVzYy0+bmFtZSA9IG5hbWU7CiAKIAlpZiAoaGFuZGxlICE9IGhhbmRsZV9iYWRfaXJxICYmIGlzX2NoYWluZWQpIHsKKwkJdW5zaWduZWQgaW50IHR5cGUgPSBpcnFkX2dldF90cmlnZ2VyX3R5cGUoJmRlc2MtPmlycV9kYXRhKTsKKworCQkvKgorCQkgKiBXZSdyZSBhYm91dCB0byBzdGFydCB0aGlzIGludGVycnVwdCBpbW1lZGlhdGVseSwKKwkJICogaGVuY2UgdGhlIG5lZWQgdG8gc2V0IHRoZSB0cmlnZ2VyIGNvbmZpZ3VyYXRpb24uCisJCSAqIEJ1dCB0aGUgLnNldF90eXBlIGNhbGxiYWNrIG1heSBoYXZlIG92ZXJyaWRkZW4gdGhlCisJCSAqIGZsb3cgaGFuZGxlciwgaWdub3JpbmcgdGhhdCB3ZSdyZSBkZWFsaW5nIHdpdGggYQorCQkgKiBjaGFpbmVkIGludGVycnVwdC4gUmVzZXQgaXQgaW1tZWRpYXRlbHkgYmVjYXVzZSB3ZQorCQkgKiBkbyBrbm93IGJldHRlci4KKwkJICovCisJCWlmICh0eXBlICE9IElSUV9UWVBFX05PTkUpIHsKKwkJCV9faXJxX3NldF90cmlnZ2VyKGRlc2MsIHR5cGUpOworCQkJZGVzYy0+aGFuZGxlX2lycSA9IGhhbmRsZTsKKwkJfQorCiAJCWlycV9zZXR0aW5nc19zZXRfbm9wcm9iZShkZXNjKTsKIAkJaXJxX3NldHRpbmdzX3NldF9ub3JlcXVlc3QoZGVzYyk7CiAJCWlycV9zZXR0aW5nc19zZXRfbm90aHJlYWQoZGVzYyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2dlbmVyaWMtY2hpcC5jIGIva2VybmVsL2lycS9nZW5lcmljLWNoaXAuYwppbmRleCBhYmQyODZhLi5lZTMyODcwIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2dlbmVyaWMtY2hpcC5jCisrKyBiL2tlcm5lbC9pcnEvZ2VuZXJpYy1jaGlwLmMKQEAgLTI2MCw5ICsyNjAsOSBAQAogfQogCiAvKioKLSAqIGlycV9hbGxvY19kb21haW5fZ2VuZXJpY19jaGlwIC0gQWxsb2NhdGUgZ2VuZXJpYyBjaGlwcyBmb3IgYW4gaXJxIGRvbWFpbgorICogX19pcnFfYWxsb2NfZG9tYWluX2dlbmVyaWNfY2hpcCAtIEFsbG9jYXRlIGdlbmVyaWMgY2hpcHMgZm9yIGFuIGlycSBkb21haW4KICAqIEBkOgkJCWlycSBkb21haW4gZm9yIHdoaWNoIHRvIGFsbG9jYXRlIGNoaXBzCi0gKiBAaXJxc19wZXJfY2hpcDoJTnVtYmVyIG9mIGludGVycnVwdHMgZWFjaCBjaGlwIGhhbmRsZXMKKyAqIEBpcnFzX3Blcl9jaGlwOglOdW1iZXIgb2YgaW50ZXJydXB0cyBlYWNoIGNoaXAgaGFuZGxlcyAobWF4IDMyKQogICogQG51bV9jdDoJCU51bWJlciBvZiBpcnFfY2hpcF90eXBlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcwogICogQG5hbWU6CQlOYW1lIG9mIHRoZSBpcnEgY2hpcAogICogQGhhbmRsZXI6CQlEZWZhdWx0IGZsb3cgaGFuZGxlciBhc3NvY2lhdGVkIHdpdGggdGhlc2UgY2hpcHMKQEAgLTI3MCwxMSArMjcwLDExIEBACiAgKiBAc2V0OgkJSVJRXyogYml0cyB0byBzZXQgaW4gdGhlIG1hcHBpbmcgZnVuY3Rpb24KICAqIEBnY2ZsYWdzOgkJR2VuZXJpYyBjaGlwIHNwZWNpZmljIHNldHVwIGZsYWdzCiAgKi8KLWludCBpcnFfYWxsb2NfZG9tYWluX2dlbmVyaWNfY2hpcHMoc3RydWN0IGlycV9kb21haW4gKmQsIGludCBpcnFzX3Blcl9jaGlwLAotCQkJCSAgIGludCBudW1fY3QsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgaXJxX2Zsb3dfaGFuZGxlcl90IGhhbmRsZXIsCi0JCQkJICAgdW5zaWduZWQgaW50IGNsciwgdW5zaWduZWQgaW50IHNldCwKLQkJCQkgICBlbnVtIGlycV9nY19mbGFncyBnY2ZsYWdzKQoraW50IF9faXJxX2FsbG9jX2RvbWFpbl9nZW5lcmljX2NoaXBzKHN0cnVjdCBpcnFfZG9tYWluICpkLCBpbnQgaXJxc19wZXJfY2hpcCwKKwkJCQkgICAgIGludCBudW1fY3QsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICBpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlciwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjbHIsIHVuc2lnbmVkIGludCBzZXQsCisJCQkJICAgICBlbnVtIGlycV9nY19mbGFncyBnY2ZsYWdzKQogewogCXN0cnVjdCBpcnFfZG9tYWluX2NoaXBfZ2VuZXJpYyAqZGdjOwogCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYzsKQEAgLTMyNiw3ICszMjYsMjEgQEAKIAlkLT5uYW1lID0gbmFtZTsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGlycV9hbGxvY19kb21haW5fZ2VuZXJpY19jaGlwcyk7CitFWFBPUlRfU1lNQk9MX0dQTChfX2lycV9hbGxvY19kb21haW5fZ2VuZXJpY19jaGlwcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqCitfX2lycV9nZXRfZG9tYWluX2dlbmVyaWNfY2hpcChzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwgdW5zaWduZWQgaW50IGh3X2lycSkKK3sKKwlzdHJ1Y3QgaXJxX2RvbWFpbl9jaGlwX2dlbmVyaWMgKmRnYyA9IGQtPmdjOworCWludCBpZHg7CisKKwlpZiAoIWRnYykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisJaWR4ID0gaHdfaXJxIC8gZGdjLT5pcnFzX3Blcl9jaGlwOworCWlmIChpZHggPj0gZGdjLT5udW1fY2hpcHMpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCXJldHVybiBkZ2MtPmdjW2lkeF07Cit9CiAKIC8qKgogICogaXJxX2dldF9kb21haW5fZ2VuZXJpY19jaGlwIC0gR2V0IGEgcG9pbnRlciB0byB0aGUgZ2VuZXJpYyBjaGlwIG9mIGEgaHdfaXJxCkBAIC0zMzYsMTUgKzM1MCw5IEBACiBzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqCiBpcnFfZ2V0X2RvbWFpbl9nZW5lcmljX2NoaXAoc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGludCBod19pcnEpCiB7Ci0Jc3RydWN0IGlycV9kb21haW5fY2hpcF9nZW5lcmljICpkZ2MgPSBkLT5nYzsKLQlpbnQgaWR4OworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IF9faXJxX2dldF9kb21haW5fZ2VuZXJpY19jaGlwKGQsIGh3X2lycSk7CiAKLQlpZiAoIWRnYykKLQkJcmV0dXJuIE5VTEw7Ci0JaWR4ID0gaHdfaXJxIC8gZGdjLT5pcnFzX3Blcl9jaGlwOwotCWlmIChpZHggPj0gZGdjLT5udW1fY2hpcHMpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBkZ2MtPmdjW2lkeF07CisJcmV0dXJuICFJU19FUlIoZ2MpID8gZ2MgOiBOVUxMOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXJxX2dldF9kb21haW5fZ2VuZXJpY19jaGlwKTsKIApAQCAtMzY4LDEzICszNzYsOSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGlkeDsKIAotCWlmICghZC0+Z2MpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWR4ID0gaHdfaXJxIC8gZGdjLT5pcnFzX3Blcl9jaGlwOwotCWlmIChpZHggPj0gZGdjLT5udW1fY2hpcHMpCi0JCXJldHVybiAtRUlOVkFMOwotCWdjID0gZGdjLT5nY1tpZHhdOworCWdjID0gX19pcnFfZ2V0X2RvbWFpbl9nZW5lcmljX2NoaXAoZCwgaHdfaXJxKTsKKwlpZiAoSVNfRVJSKGdjKSkKKwkJcmV0dXJuIFBUUl9FUlIoZ2MpOwogCiAJaWR4ID0gaHdfaXJxICUgZGdjLT5pcnFzX3Blcl9jaGlwOwogCkBAIC00MDksMTAgKzQxMywzMCBAQAogCWlycV9tb2RpZnlfc3RhdHVzKHZpcnEsIGRnYy0+aXJxX2ZsYWdzX3RvX2NsZWFyLCBkZ2MtPmlycV9mbGFnc190b19zZXQpOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoaXJxX21hcF9nZW5lcmljX2NoaXApOworCitzdGF0aWMgdm9pZCBpcnFfdW5tYXBfZ2VuZXJpY19jaGlwKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEgPSBpcnFfZG9tYWluX2dldF9pcnFfZGF0YShkLCB2aXJxKTsKKwlzdHJ1Y3QgaXJxX2RvbWFpbl9jaGlwX2dlbmVyaWMgKmRnYyA9IGQtPmdjOworCXVuc2lnbmVkIGludCBod19pcnEgPSBkYXRhLT5od2lycTsKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2M7CisJaW50IGlycV9pZHg7CisKKwlnYyA9IGlycV9nZXRfZG9tYWluX2dlbmVyaWNfY2hpcChkLCBod19pcnEpOworCWlmICghZ2MpCisJCXJldHVybjsKKworCWlycV9pZHggPSBod19pcnEgJSBkZ2MtPmlycXNfcGVyX2NoaXA7CisKKwljbGVhcl9iaXQoaXJxX2lkeCwgJmdjLT5pbnN0YWxsZWQpOworCWlycV9kb21haW5fc2V0X2luZm8oZCwgdmlycSwgaHdfaXJxLCAmbm9faXJxX2NoaXAsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkgICAgTlVMTCk7CisKK30KIAogc3RydWN0IGlycV9kb21haW5fb3BzIGlycV9nZW5lcmljX2NoaXBfb3BzID0gewogCS5tYXAJPSBpcnFfbWFwX2dlbmVyaWNfY2hpcCwKKwkudW5tYXAgID0gaXJxX3VubWFwX2dlbmVyaWNfY2hpcCwKIAkueGxhdGUJPSBpcnFfZG9tYWluX3hsYXRlX29uZXR3b2NlbGwsCiB9OwogRVhQT1JUX1NZTUJPTF9HUEwoaXJxX2dlbmVyaWNfY2hpcF9vcHMpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9pcnFkZXNjLmMgYi9rZXJuZWwvaXJxL2lycWRlc2MuYwppbmRleCBhNjIzYjQ0Li4wMGJiMGFlIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2lycWRlc2MuYworKysgYi9rZXJuZWwvaXJxL2lycWRlc2MuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JhZGl4LXRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogCiAjaW5jbHVkZSAiaW50ZXJuYWxzLmgiCiAKQEAgLTEyMyw2ICsxMjQsMTgxIEBACiAKICNpZmRlZiBDT05GSUdfU1BBUlNFX0lSUQogCitzdGF0aWMgdm9pZCBpcnFfa29ial9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKTsKKworI2lmZGVmIENPTkZJR19TWVNGUworc3RhdGljIHN0cnVjdCBrb2JqZWN0ICppcnFfa29ial9iYXNlOworCisjZGVmaW5lIElSUV9BVFRSX1JPKF9uYW1lKSBcCitzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIF9uYW1lIyNfYXR0ciA9IF9fQVRUUl9STyhfbmFtZSkKKworc3RhdGljIHNzaXplX3QgcGVyX2NwdV9jb3VudF9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBpcnFfZGVzYywga29iaik7CisJaW50IGNwdSwgaXJxID0gZGVzYy0+aXJxX2RhdGEuaXJxOworCXNzaXplX3QgcmV0ID0gMDsKKwljaGFyICpwID0gIiI7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXVuc2lnbmVkIGludCBjID0ga3N0YXRfaXJxc19jcHUoaXJxLCBjcHUpOworCisJCXJldCArPSBzY25wcmludGYoYnVmICsgcmV0LCBQQUdFX1NJWkUgLSByZXQsICIlcyV1IiwgcCwgYyk7CisJCXAgPSAiLCI7CisJfQorCisJcmV0ICs9IHNjbnByaW50ZihidWYgKyByZXQsIFBBR0VfU0laRSAtIHJldCwgIlxuIik7CisJcmV0dXJuIHJldDsKK30KK0lSUV9BVFRSX1JPKHBlcl9jcHVfY291bnQpOworCitzdGF0aWMgc3NpemVfdCBjaGlwX25hbWVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgaXJxX2Rlc2MsIGtvYmopOworCXNzaXplX3QgcmV0ID0gMDsKKworCXJhd19zcGluX2xvY2tfaXJxKCZkZXNjLT5sb2NrKTsKKwlpZiAoZGVzYy0+aXJxX2RhdGEuY2hpcCAmJiBkZXNjLT5pcnFfZGF0YS5jaGlwLT5uYW1lKSB7CisJCXJldCA9IHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLAorCQkJCWRlc2MtPmlycV9kYXRhLmNoaXAtPm5hbWUpOworCX0KKwlyYXdfc3Bpbl91bmxvY2tfaXJxKCZkZXNjLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitJUlFfQVRUUl9STyhjaGlwX25hbWUpOworCitzdGF0aWMgc3NpemVfdCBod2lycV9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGlycV9kZXNjLCBrb2JqKTsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwlyYXdfc3Bpbl9sb2NrX2lycSgmZGVzYy0+bG9jayk7CisJaWYgKGRlc2MtPmlycV9kYXRhLmRvbWFpbikKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgKGludClkZXNjLT5pcnFfZGF0YS5od2lycSk7CisJcmF3X3NwaW5fdW5sb2NrX2lycSgmZGVzYy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorSVJRX0FUVFJfUk8oaHdpcnEpOworCitzdGF0aWMgc3NpemVfdCB0eXBlX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBpcnFfZGVzYywga29iaik7CisJc3NpemVfdCByZXQgPSAwOworCisJcmF3X3NwaW5fbG9ja19pcnEoJmRlc2MtPmxvY2spOworCXJldCA9IHNwcmludGYoYnVmLCAiJXNcbiIsCisJCSAgICAgIGlycWRfaXNfbGV2ZWxfdHlwZSgmZGVzYy0+aXJxX2RhdGEpID8gImxldmVsIiA6ICJlZGdlIik7CisJcmF3X3NwaW5fdW5sb2NrX2lycSgmZGVzYy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworCit9CitJUlFfQVRUUl9STyh0eXBlKTsKKworc3RhdGljIHNzaXplX3QgbmFtZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgaXJxX2Rlc2MsIGtvYmopOworCXNzaXplX3QgcmV0ID0gMDsKKworCXJhd19zcGluX2xvY2tfaXJxKCZkZXNjLT5sb2NrKTsKKwlpZiAoZGVzYy0+bmFtZSkKKwkJcmV0ID0gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGRlc2MtPm5hbWUpOworCXJhd19zcGluX3VubG9ja19pcnEoJmRlc2MtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KK0lSUV9BVFRSX1JPKG5hbWUpOworCitzdGF0aWMgc3NpemVfdCBhY3Rpb25zX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBpcnFfZGVzYywga29iaik7CisJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uOworCXNzaXplX3QgcmV0ID0gMDsKKwljaGFyICpwID0gIiI7CisKKwlyYXdfc3Bpbl9sb2NrX2lycSgmZGVzYy0+bG9jayk7CisJZm9yIChhY3Rpb24gPSBkZXNjLT5hY3Rpb247IGFjdGlvbiAhPSBOVUxMOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpIHsKKwkJcmV0ICs9IHNjbnByaW50ZihidWYgKyByZXQsIFBBR0VfU0laRSAtIHJldCwgIiVzJXMiLAorCQkJCSBwLCBhY3Rpb24tPm5hbWUpOworCQlwID0gIiwiOworCX0KKwlyYXdfc3Bpbl91bmxvY2tfaXJxKCZkZXNjLT5sb2NrKTsKKworCWlmIChyZXQpCisJCXJldCArPSBzY25wcmludGYoYnVmICsgcmV0LCBQQUdFX1NJWkUgLSByZXQsICJcbiIpOworCisJcmV0dXJuIHJldDsKK30KK0lSUV9BVFRSX1JPKGFjdGlvbnMpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaXJxX2F0dHJzW10gPSB7CisJJnBlcl9jcHVfY291bnRfYXR0ci5hdHRyLAorCSZjaGlwX25hbWVfYXR0ci5hdHRyLAorCSZod2lycV9hdHRyLmF0dHIsCisJJnR5cGVfYXR0ci5hdHRyLAorCSZuYW1lX2F0dHIuYXR0ciwKKwkmYWN0aW9uc19hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgaXJxX2tvYmpfdHlwZSA9IHsKKwkucmVsZWFzZQk9IGlycV9rb2JqX3JlbGVhc2UsCisJLnN5c2ZzX29wcwk9ICZrb2JqX3N5c2ZzX29wcywKKwkuZGVmYXVsdF9hdHRycwk9IGlycV9hdHRycywKK307CisKK3N0YXRpYyB2b2lkIGlycV9zeXNmc19hZGQoaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCWlmIChpcnFfa29ial9iYXNlKSB7CisJCS8qCisJCSAqIENvbnRpbnVlIGV2ZW4gaW4gY2FzZSBvZiBmYWlsdXJlIGFzIHRoaXMgaXMgbm90aGluZworCQkgKiBjcnVjaWFsLgorCQkgKi8KKwkJaWYgKGtvYmplY3RfYWRkKCZkZXNjLT5rb2JqLCBpcnFfa29ial9iYXNlLCAiJWQiLCBpcnEpKQorCQkJcHJfd2FybigiRmFpbGVkIHRvIGFkZCBrb2JqZWN0IGZvciBpcnEgJWRcbiIsIGlycSk7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBpcnFfc3lzZnNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKwlpbnQgaXJxOworCisJLyogUHJldmVudCBjb25jdXJyZW50IGlycSBhbGxvYy9mcmVlICovCisJaXJxX2xvY2tfc3BhcnNlKCk7CisKKwlpcnFfa29ial9iYXNlID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgiaXJxIiwga2VybmVsX2tvYmopOworCWlmICghaXJxX2tvYmpfYmFzZSkgeworCQlpcnFfdW5sb2NrX3NwYXJzZSgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBBZGQgdGhlIGFscmVhZHkgYWxsb2NhdGVkIGludGVycnVwdHMgKi8KKwlmb3JfZWFjaF9pcnFfZGVzYyhpcnEsIGRlc2MpCisJCWlycV9zeXNmc19hZGQoaXJxLCBkZXNjKTsKKwlpcnFfdW5sb2NrX3NwYXJzZSgpOworCisJcmV0dXJuIDA7Cit9Citwb3N0Y29yZV9pbml0Y2FsbChpcnFfc3lzZnNfaW5pdCk7CisKKyNlbHNlIC8qICFDT05GSUdfU1lTRlMgKi8KKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgaXJxX2tvYmpfdHlwZSA9IHsKKwkucmVsZWFzZQk9IGlycV9rb2JqX3JlbGVhc2UsCit9OworCitzdGF0aWMgdm9pZCBpcnFfc3lzZnNfYWRkKGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykge30KKworI2VuZGlmIC8qIENPTkZJR19TWVNGUyAqLworCiBzdGF0aWMgUkFESVhfVFJFRShpcnFfZGVzY190cmVlLCBHRlBfS0VSTkVMKTsKIAogc3RhdGljIHZvaWQgaXJxX2luc2VydF9kZXNjKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKQEAgLTE4Nyw2ICszNjMsNyBAQAogCiAJZGVzY19zZXRfZGVmYXVsdHMoaXJxLCBkZXNjLCBub2RlLCBhZmZpbml0eSwgb3duZXIpOwogCWlycWRfc2V0KCZkZXNjLT5pcnFfZGF0YSwgZmxhZ3MpOworCWtvYmplY3RfaW5pdCgmZGVzYy0+a29iaiwgJmlycV9rb2JqX3R5cGUpOwogCiAJcmV0dXJuIGRlc2M7CiAKQEAgLTE5NywxNSArMzc0LDIyIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIGRlbGF5ZWRfZnJlZV9kZXNjKHN0cnVjdCByY3VfaGVhZCAqcmhwKQorc3RhdGljIHZvaWQgaXJxX2tvYmpfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBjb250YWluZXJfb2YocmhwLCBzdHJ1Y3QgaXJxX2Rlc2MsIHJjdSk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBpcnFfZGVzYywga29iaik7CiAKIAlmcmVlX21hc2tzKGRlc2MpOwogCWZyZWVfcGVyY3B1KGRlc2MtPmtzdGF0X2lycXMpOwogCWtmcmVlKGRlc2MpOwogfQogCitzdGF0aWMgdm9pZCBkZWxheWVkX2ZyZWVfZGVzYyhzdHJ1Y3QgcmN1X2hlYWQgKnJocCkKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBjb250YWluZXJfb2YocmhwLCBzdHJ1Y3QgaXJxX2Rlc2MsIHJjdSk7CisKKwlrb2JqZWN0X3B1dCgmZGVzYy0+a29iaik7Cit9CisKIHN0YXRpYyB2b2lkIGZyZWVfZGVzYyh1bnNpZ25lZCBpbnQgaXJxKQogewogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CkBAIC0yMTcsOCArNDAxLDEyIEBACiAJICoga3N0YXRfaXJxX3VzcigpLiBPbmNlIHdlIGRlbGV0ZWQgdGhlIGRlc2NyaXB0b3IgZnJvbSB0aGUKIAkgKiBzcGFyc2UgdHJlZSB3ZSBjYW4gZnJlZSBpdC4gQWNjZXNzIGluIHByb2Mgd2lsbCBmYWlsIHRvCiAJICogbG9va3VwIHRoZSBkZXNjcmlwdG9yLgorCSAqCisJICogVGhlIHN5c2ZzIGVudHJ5IG11c3QgYmUgc2VyaWFsaXplZCBhZ2FpbnN0IGEgY29uY3VycmVudAorCSAqIGlycV9zeXNmc19pbml0KCkgYXMgd2VsbC4KIAkgKi8KIAltdXRleF9sb2NrKCZzcGFyc2VfaXJxX2xvY2spOworCWtvYmplY3RfZGVsKCZkZXNjLT5rb2JqKTsKIAlkZWxldGVfaXJxX2Rlc2MoaXJxKTsKIAltdXRleF91bmxvY2soJnNwYXJzZV9pcnFfbG9jayk7CiAKQEAgLTIzNiwzMSArNDI0LDMxIEBACiAJY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2sgPSBOVUxMOwogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0JaW50IGksIGNwdSA9IC0xOworCWludCBpOwogCi0JaWYgKGFmZmluaXR5ICYmIGNwdW1hc2tfZW1wdHkoYWZmaW5pdHkpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBWYWxpZGF0ZSBhZmZpbml0eSBtYXNrKHMpICovCisJaWYgKGFmZmluaXR5KSB7CisJCWZvciAoaSA9IDAsIG1hc2sgPSBhZmZpbml0eTsgaSA8IGNudDsgaSsrLCBtYXNrKyspIHsKKwkJCWlmIChjcHVtYXNrX2VtcHR5KG1hc2spKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQogCiAJZmxhZ3MgPSBhZmZpbml0eSA/IElSUURfQUZGSU5JVFlfTUFOQUdFRCA6IDA7CisJbWFzayA9IE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKIAkJaWYgKGFmZmluaXR5KSB7Ci0JCQljcHUgPSBjcHVtYXNrX25leHQoY3B1LCBhZmZpbml0eSk7Ci0JCQlpZiAoY3B1ID49IG5yX2NwdV9pZHMpCi0JCQkJY3B1ID0gY3B1bWFza19maXJzdChhZmZpbml0eSk7Ci0JCQlub2RlID0gY3B1X3RvX25vZGUoY3B1KTsKLQotCQkJLyoKLQkJCSAqIEZvciBzaW5nbGUgYWxsb2NhdGlvbnMgd2UgdXNlIHRoZSBjYWxsZXIgcHJvdmlkZWQKLQkJCSAqIG1hc2sgb3RoZXJ3aXNlIHdlIHVzZSB0aGUgbWFzayBvZiB0aGUgdGFyZ2V0IGNwdQotCQkJICovCi0JCQltYXNrID0gY250ID09IDEgPyBhZmZpbml0eSA6IGNwdW1hc2tfb2YoY3B1KTsKKwkJCW5vZGUgPSBjcHVfdG9fbm9kZShjcHVtYXNrX2ZpcnN0KGFmZmluaXR5KSk7CisJCQltYXNrID0gYWZmaW5pdHk7CisJCQlhZmZpbml0eSsrOwogCQl9CiAJCWRlc2MgPSBhbGxvY19kZXNjKHN0YXJ0ICsgaSwgbm9kZSwgZmxhZ3MsIG1hc2ssIG93bmVyKTsKIAkJaWYgKCFkZXNjKQogCQkJZ290byBlcnI7CiAJCW11dGV4X2xvY2soJnNwYXJzZV9pcnFfbG9jayk7CiAJCWlycV9pbnNlcnRfZGVzYyhzdGFydCArIGksIGRlc2MpOworCQlpcnFfc3lzZnNfYWRkKHN0YXJ0ICsgaSwgZGVzYyk7CiAJCW11dGV4X3VubG9jaygmc3BhcnNlX2lycV9sb2NrKTsKIAl9CiAJcmV0dXJuIHN0YXJ0OwpAQCAtNDgxLDkgKzY2OSw5IEBACiAgKiBAY250OglOdW1iZXIgb2YgY29uc2VjdXRpdmUgaXJxcyB0byBhbGxvY2F0ZS4KICAqIEBub2RlOglQcmVmZXJyZWQgbm9kZSBvbiB3aGljaCB0aGUgaXJxIGRlc2NyaXB0b3Igc2hvdWxkIGJlIGFsbG9jYXRlZAogICogQG93bmVyOglPd25pbmcgbW9kdWxlIChjYW4gYmUgTlVMTCkKLSAqIEBhZmZpbml0eToJT3B0aW9uYWwgcG9pbnRlciB0byBhbiBhZmZpbml0eSBtYXNrIHdoaWNoIGhpbnRzIHdoZXJlIHRoZQotICoJCWlycSBkZXNjcmlwdG9ycyBzaG91bGQgYmUgYWxsb2NhdGVkIGFuZCB3aGljaCBkZWZhdWx0Ci0gKgkJYWZmaW5pdGllcyB0byB1c2UKKyAqIEBhZmZpbml0eToJT3B0aW9uYWwgcG9pbnRlciB0byBhbiBhZmZpbml0eSBtYXNrIGFycmF5IG9mIHNpemUgQGNudCB3aGljaAorICoJCWhpbnRzIHdoZXJlIHRoZSBpcnEgZGVzY3JpcHRvcnMgc2hvdWxkIGJlIGFsbG9jYXRlZCBhbmQgd2hpY2gKKyAqCQlkZWZhdWx0IGFmZmluaXRpZXMgdG8gdXNlCiAgKgogICogUmV0dXJucyB0aGUgZmlyc3QgaXJxIG51bWJlciBvciBlcnJvciBjb2RlCiAgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaXJxZG9tYWluLmMgYi9rZXJuZWwvaXJxL2lycWRvbWFpbi5jCmluZGV4IDQ3NTJiNDMuLjhjMGEwYWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvaXJxZG9tYWluLmMKKysrIGIva2VybmVsL2lycS9pcnFkb21haW4uYwpAQCAtODAsNyArODAsNyBAQAogCiAvKioKICAqIF9faXJxX2RvbWFpbl9hZGQoKSAtIEFsbG9jYXRlIGEgbmV3IGlycV9kb21haW4gZGF0YSBzdHJ1Y3R1cmUKLSAqIEBvZl9ub2RlOiBvcHRpb25hbCBkZXZpY2UtdHJlZSBub2RlIG9mIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcgorICogQGZ3bm9kZTogZmlybXdhcmUgbm9kZSBmb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVyCiAgKiBAc2l6ZTogU2l6ZSBvZiBsaW5lYXIgbWFwOyAwIGZvciByYWRpeCBtYXBwaW5nIG9ubHkKICAqIEBod2lycV9tYXg6IE1heGltdW0gbnVtYmVyIG9mIGludGVycnVwdHMgc3VwcG9ydGVkIGJ5IGNvbnRyb2xsZXIKICAqIEBkaXJlY3RfbWF4OiBNYXhpbXVtIHZhbHVlIG9mIGRpcmVjdCBtYXBzOyBVc2UgfjAgZm9yIG5vIGxpbWl0OyAwIGZvciBubwpAQCAtOTYsMTAgKzk2LDggQEAKIAkJCQkgICAgY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzICpvcHMsCiAJCQkJICAgIHZvaWQgKmhvc3RfZGF0YSkKIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUgPSB0b19vZl9ub2RlKGZ3bm9kZSk7CiAJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7Ci0KLQlvZl9ub2RlID0gdG9fb2Zfbm9kZShmd25vZGUpOwogCiAJZG9tYWluID0ga3phbGxvY19ub2RlKHNpemVvZigqZG9tYWluKSArIChzaXplb2YodW5zaWduZWQgaW50KSAqIHNpemUpLAogCQkJICAgICAgR0ZQX0tFUk5FTCwgb2Zfbm9kZV90b19uaWQob2Zfbm9kZSkpOwpAQCAtODY4LDcgKzg2NiwxMCBAQAogCWlmIChXQVJOX09OKGludHNpemUgPCAxKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJKm91dF9od2lycSA9IGludHNwZWNbMF07Ci0JKm91dF90eXBlID0gKGludHNpemUgPiAxKSA/IGludHNwZWNbMV0gOiBJUlFfVFlQRV9OT05FOworCWlmIChpbnRzaXplID4gMSkKKwkJKm91dF90eXBlID0gaW50c3BlY1sxXSAmIElSUV9UWVBFX1NFTlNFX01BU0s7CisJZWxzZQorCQkqb3V0X3R5cGUgPSBJUlFfVFlQRV9OT05FOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXJxX2RvbWFpbl94bGF0ZV9vbmV0d29jZWxsKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvbWFuYWdlLmMgYi9rZXJuZWwvaXJxL21hbmFnZS5jCmluZGV4IDczYTJiNzguLjBjNWYxYTUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvbWFuYWdlLmMKKysrIGIva2VybmVsL2lycS9tYW5hZ2UuYwpAQCAtNjY5LDggKzY2OSw2IEBACiAJCXJldHVybiAwOwogCX0KIAotCWZsYWdzICY9IElSUV9UWVBFX1NFTlNFX01BU0s7Ci0KIAlpZiAoY2hpcC0+ZmxhZ3MgJiBJUlFDSElQX1NFVF9UWVBFX01BU0tFRCkgewogCQlpZiAoIWlycWRfaXJxX21hc2tlZCgmZGVzYy0+aXJxX2RhdGEpKQogCQkJbWFza19pcnEoZGVzYyk7CkBAIC02NzgsNyArNjc2LDggQEAKIAkJCXVubWFzayA9IDE7CiAJfQogCi0JLyogY2FsbGVyIG1hc2tlZCBvdXQgYWxsIGV4Y2VwdCB0cmlnZ2VyIG1vZGUgZmxhZ3MgKi8KKwkvKiBNYXNrIGFsbCBmbGFncyBleGNlcHQgdHJpZ2dlciBtb2RlICovCisJZmxhZ3MgJj0gSVJRX1RZUEVfU0VOU0VfTUFTSzsKIAlyZXQgPSBjaGlwLT5pcnFfc2V0X3R5cGUoJmRlc2MtPmlycV9kYXRhLCBmbGFncyk7CiAKIAlzd2l0Y2ggKHJldCkgewpAQCAtMTY4MSw4ICsxNjgwLDEwIEBACiAJYWN0aW9uLT5kZXZfaWQgPSBkZXZfaWQ7CiAKIAlyZXR2YWwgPSBpcnFfY2hpcF9wbV9nZXQoJmRlc2MtPmlycV9kYXRhKTsKLQlpZiAocmV0dmFsIDwgMCkKKwlpZiAocmV0dmFsIDwgMCkgeworCQlrZnJlZShhY3Rpb24pOwogCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWNoaXBfYnVzX2xvY2soZGVzYyk7CiAJcmV0dmFsID0gX19zZXR1cF9pcnEoaXJxLCBkZXNjLCBhY3Rpb24pOwpAQCAtMTk4NSw4ICsxOTg2LDEwIEBACiAJYWN0aW9uLT5wZXJjcHVfZGV2X2lkID0gZGV2X2lkOwogCiAJcmV0dmFsID0gaXJxX2NoaXBfcG1fZ2V0KCZkZXNjLT5pcnFfZGF0YSk7Ci0JaWYgKHJldHZhbCA8IDApCisJaWYgKHJldHZhbCA8IDApIHsKKwkJa2ZyZWUoYWN0aW9uKTsKIAkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAljaGlwX2J1c19sb2NrKGRlc2MpOwogCXJldHZhbCA9IF9fc2V0dXBfaXJxKGlycSwgZGVzYywgYWN0aW9uKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvbXNpLmMgYi9rZXJuZWwvaXJxL21zaS5jCmluZGV4IDE5ZTlkZmIuLjhhM2U4NzI3IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL21zaS5jCisrKyBiL2tlcm5lbC9pcnEvbXNpLmMKQEAgLTE4LDIwICsxOCw0MiBAQAogLyogVGVtcGFyb3J5IHNvbHV0aW9uIGZvciBidWlsZGluZywgd2lsbCBiZSByZW1vdmVkIGxhdGVyICovCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKLXN0cnVjdCBtc2lfZGVzYyAqYWxsb2NfbXNpX2VudHJ5KHN0cnVjdCBkZXZpY2UgKmRldikKKy8qKgorICogYWxsb2NfbXNpX2VudHJ5IC0gQWxsb2NhdGUgYW4gaW5pdGlhbGl6ZSBtc2lfZW50cnkKKyAqIEBkZXY6CVBvaW50ZXIgdG8gdGhlIGRldmljZSBmb3Igd2hpY2ggdGhpcyBpcyBhbGxvY2F0ZWQKKyAqIEBudmVjOglUaGUgbnVtYmVyIG9mIHZlY3RvcnMgdXNlZCBpbiB0aGlzIGVudHJ5CisgKiBAYWZmaW5pdHk6CU9wdGlvbmFsIHBvaW50ZXIgdG8gYW4gYWZmaW5pdHkgbWFzayBhcnJheSBzaXplIG9mIEBudmVjCisgKgorICogSWYgQGFmZmluaXR5IGlzIG5vdCBOVUxMIHRoZW4gYSBhbiBhZmZpbml0eSBhcnJheVtAbnZlY10gaXMgYWxsb2NhdGVkCisgKiBhbmQgdGhlIGFmZmluaXR5IG1hc2tzIGZyb20gQGFmZmluaXR5IGFyZSBjb3BpZWQuCisgKi8KK3N0cnVjdCBtc2lfZGVzYyAqCithbGxvY19tc2lfZW50cnkoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbnZlYywgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmFmZmluaXR5KQogewotCXN0cnVjdCBtc2lfZGVzYyAqZGVzYyA9IGt6YWxsb2Moc2l6ZW9mKCpkZXNjKSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IG1zaV9kZXNjICpkZXNjOworCisJZGVzYyA9IGt6YWxsb2Moc2l6ZW9mKCpkZXNjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXNjKQogCQlyZXR1cm4gTlVMTDsKIAogCUlOSVRfTElTVF9IRUFEKCZkZXNjLT5saXN0KTsKIAlkZXNjLT5kZXYgPSBkZXY7CisJZGVzYy0+bnZlY191c2VkID0gbnZlYzsKKwlpZiAoYWZmaW5pdHkpIHsKKwkJZGVzYy0+YWZmaW5pdHkgPSBrbWVtZHVwKGFmZmluaXR5LAorCQkJbnZlYyAqIHNpemVvZigqZGVzYy0+YWZmaW5pdHkpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkZXNjLT5hZmZpbml0eSkgeworCQkJa2ZyZWUoZGVzYyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KIAogCXJldHVybiBkZXNjOwogfQogCiB2b2lkIGZyZWVfbXNpX2VudHJ5KHN0cnVjdCBtc2lfZGVzYyAqZW50cnkpCiB7CisJa2ZyZWUoZW50cnktPmFmZmluaXR5KTsKIAlrZnJlZShlbnRyeSk7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9rZXhlY19maWxlLmMgYi9rZXJuZWwva2V4ZWNfZmlsZS5jCmluZGV4IDUwM2JjMmQuLjAzN2MzMjEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rZXhlY19maWxlLmMKKysrIGIva2VybmVsL2tleGVjX2ZpbGUuYwpAQCAtODg3LDcgKzg4NywxMCBAQAogCXJldHVybiAwOwogb3V0OgogCXZmcmVlKHBpLT5zZWNoZHJzKTsKKwlwaS0+c2VjaGRycyA9IE5VTEw7CisKIAl2ZnJlZShwaS0+cHVyZ2F0b3J5X2J1Zik7CisJcGktPnB1cmdhdG9yeV9idWYgPSBOVUxMOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9rdGhyZWFkLmMgYi9rZXJuZWwva3RocmVhZC5jCmluZGV4IDlmZjE3M2QuLjRhYjRjMzcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rdGhyZWFkLmMKKysrIGIva2VybmVsL2t0aHJlYWQuYwpAQCAtNjQsNyArNjQsNyBAQAogc3RhdGljIHN0cnVjdCBrdGhyZWFkICp0b19saXZlX2t0aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICprKQogewogCXN0cnVjdCBjb21wbGV0aW9uICp2Zm9yayA9IEFDQ0VTU19PTkNFKGstPnZmb3JrX2RvbmUpOwotCWlmIChsaWtlbHkodmZvcmspKQorCWlmIChsaWtlbHkodmZvcmspICYmIHRyeV9nZXRfdGFza19zdGFjayhrKSkKIAkJcmV0dXJuIF9fdG9fa3RocmVhZCh2Zm9yayk7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC00MjUsOCArNDI1LDEwIEBACiB7CiAJc3RydWN0IGt0aHJlYWQgKmt0aHJlYWQgPSB0b19saXZlX2t0aHJlYWQoayk7CiAKLQlpZiAoa3RocmVhZCkKKwlpZiAoa3RocmVhZCkgewogCQlfX2t0aHJlYWRfdW5wYXJrKGssIGt0aHJlYWQpOworCQlwdXRfdGFza19zdGFjayhrKTsKKwl9CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrdGhyZWFkX3VucGFyayk7CiAKQEAgLTQ1NSw2ICs0NTcsNyBAQAogCQkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmt0aHJlYWQtPnBhcmtlZCk7CiAJCQl9CiAJCX0KKwkJcHV0X3Rhc2tfc3RhY2soayk7CiAJCXJldCA9IDA7CiAJfQogCXJldHVybiByZXQ7CkBAIC00OTAsNiArNDkzLDcgQEAKIAkJX19rdGhyZWFkX3VucGFyayhrLCBrdGhyZWFkKTsKIAkJd2FrZV91cF9wcm9jZXNzKGspOwogCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZrdGhyZWFkLT5leGl0ZWQpOworCQlwdXRfdGFza19zdGFjayhrKTsKIAl9CiAJcmV0ID0gay0+ZXhpdF9jb2RlOwogCXB1dF90YXNrX3N0cnVjdChrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NraW5nL01ha2VmaWxlIGIva2VybmVsL2xvY2tpbmcvTWFrZWZpbGUKaW5kZXggMzEzMjJhNC4uNmY4OGUzNSAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tpbmcvTWFrZWZpbGUKKysrIGIva2VybmVsL2xvY2tpbmcvTWFrZWZpbGUKQEAgLTE4LDcgKzE4LDYgQEAKIGVuZGlmCiBvYmotJChDT05GSUdfU01QKSArPSBzcGlubG9jay5vCiBvYmotJChDT05GSUdfTE9DS19TUElOX09OX09XTkVSKSArPSBvc3FfbG9jay5vCi1vYmotJChDT05GSUdfU01QKSArPSBsZ2xvY2subwogb2JqLSQoQ09ORklHX1BST1ZFX0xPQ0tJTkcpICs9IHNwaW5sb2NrLm8KIG9iai0kKENPTkZJR19RVUVVRURfU1BJTkxPQ0tTKSArPSBxc3BpbmxvY2subwogb2JqLSQoQ09ORklHX1JUX01VVEVYRVMpICs9IHJ0bXV0ZXgubwpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tpbmcvbGdsb2NrLmMgYi9rZXJuZWwvbG9ja2luZy9sZ2xvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUxY2ZjZC4uMDAwMDAwMAotLS0gYS9rZXJuZWwvbG9ja2luZy9sZ2xvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKiBTZWUgaW5jbHVkZS9saW51eC9sZ2xvY2suaCBmb3IgZGVzY3JpcHRpb24gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9sZ2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9jcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLQotLyoKLSAqIE5vdGUgdGhlcmUgaXMgbm8gdW5pbml0LCBzbyBsZ2xvY2tzIGNhbm5vdCBiZSBkZWZpbmVkIGluCi0gKiBtb2R1bGVzIChidXQgaXQncyBmaW5lIHRvIHVzZSB0aGVtIGZyb20gdGhlcmUpCi0gKiBDb3VsZCBiZSBhZGRlZCB0aG91Z2gsIGp1c3QgdW5kbyBsZ19sb2NrX2luaXQKLSAqLwotCi12b2lkIGxnX2xvY2tfaW5pdChzdHJ1Y3QgbGdsb2NrICpsZywgY2hhciAqbmFtZSkKLXsKLQlMT0NLREVQX0lOSVRfTUFQKCZsZy0+bG9ja19kZXBfbWFwLCBuYW1lLCAmbGctPmxvY2tfa2V5LCAwKTsKLX0KLUVYUE9SVF9TWU1CT0wobGdfbG9ja19pbml0KTsKLQotdm9pZCBsZ19sb2NhbF9sb2NrKHN0cnVjdCBsZ2xvY2sgKmxnKQotewotCWFyY2hfc3BpbmxvY2tfdCAqbG9jazsKLQotCXByZWVtcHRfZGlzYWJsZSgpOwotCWxvY2tfYWNxdWlyZV9zaGFyZWQoJmxnLT5sb2NrX2RlcF9tYXAsIDAsIDAsIE5VTEwsIF9SRVRfSVBfKTsKLQlsb2NrID0gdGhpc19jcHVfcHRyKGxnLT5sb2NrKTsKLQlhcmNoX3NwaW5fbG9jayhsb2NrKTsKLX0KLUVYUE9SVF9TWU1CT0wobGdfbG9jYWxfbG9jayk7Ci0KLXZvaWQgbGdfbG9jYWxfdW5sb2NrKHN0cnVjdCBsZ2xvY2sgKmxnKQotewotCWFyY2hfc3BpbmxvY2tfdCAqbG9jazsKLQotCWxvY2tfcmVsZWFzZSgmbGctPmxvY2tfZGVwX21hcCwgMSwgX1JFVF9JUF8pOwotCWxvY2sgPSB0aGlzX2NwdV9wdHIobGctPmxvY2spOwotCWFyY2hfc3Bpbl91bmxvY2sobG9jayk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKLX0KLUVYUE9SVF9TWU1CT0wobGdfbG9jYWxfdW5sb2NrKTsKLQotdm9pZCBsZ19sb2NhbF9sb2NrX2NwdShzdHJ1Y3QgbGdsb2NrICpsZywgaW50IGNwdSkKLXsKLQlhcmNoX3NwaW5sb2NrX3QgKmxvY2s7Ci0KLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlsb2NrX2FjcXVpcmVfc2hhcmVkKCZsZy0+bG9ja19kZXBfbWFwLCAwLCAwLCBOVUxMLCBfUkVUX0lQXyk7Ci0JbG9jayA9IHBlcl9jcHVfcHRyKGxnLT5sb2NrLCBjcHUpOwotCWFyY2hfc3Bpbl9sb2NrKGxvY2spOwotfQotRVhQT1JUX1NZTUJPTChsZ19sb2NhbF9sb2NrX2NwdSk7Ci0KLXZvaWQgbGdfbG9jYWxfdW5sb2NrX2NwdShzdHJ1Y3QgbGdsb2NrICpsZywgaW50IGNwdSkKLXsKLQlhcmNoX3NwaW5sb2NrX3QgKmxvY2s7Ci0KLQlsb2NrX3JlbGVhc2UoJmxnLT5sb2NrX2RlcF9tYXAsIDEsIF9SRVRfSVBfKTsKLQlsb2NrID0gcGVyX2NwdV9wdHIobGctPmxvY2ssIGNwdSk7Ci0JYXJjaF9zcGluX3VubG9jayhsb2NrKTsKLQlwcmVlbXB0X2VuYWJsZSgpOwotfQotRVhQT1JUX1NZTUJPTChsZ19sb2NhbF91bmxvY2tfY3B1KTsKLQotdm9pZCBsZ19kb3VibGVfbG9jayhzdHJ1Y3QgbGdsb2NrICpsZywgaW50IGNwdTEsIGludCBjcHUyKQotewotCUJVR19PTihjcHUxID09IGNwdTIpOwotCi0JLyogbG9jayBpbiBjcHUgb3JkZXIsIGp1c3QgbGlrZSBsZ19nbG9iYWxfbG9jayAqLwotCWlmIChjcHUyIDwgY3B1MSkKLQkJc3dhcChjcHUxLCBjcHUyKTsKLQotCXByZWVtcHRfZGlzYWJsZSgpOwotCWxvY2tfYWNxdWlyZV9zaGFyZWQoJmxnLT5sb2NrX2RlcF9tYXAsIDAsIDAsIE5VTEwsIF9SRVRfSVBfKTsKLQlhcmNoX3NwaW5fbG9jayhwZXJfY3B1X3B0cihsZy0+bG9jaywgY3B1MSkpOwotCWFyY2hfc3Bpbl9sb2NrKHBlcl9jcHVfcHRyKGxnLT5sb2NrLCBjcHUyKSk7Ci19Ci0KLXZvaWQgbGdfZG91YmxlX3VubG9jayhzdHJ1Y3QgbGdsb2NrICpsZywgaW50IGNwdTEsIGludCBjcHUyKQotewotCWxvY2tfcmVsZWFzZSgmbGctPmxvY2tfZGVwX21hcCwgMSwgX1JFVF9JUF8pOwotCWFyY2hfc3Bpbl91bmxvY2socGVyX2NwdV9wdHIobGctPmxvY2ssIGNwdTEpKTsKLQlhcmNoX3NwaW5fdW5sb2NrKHBlcl9jcHVfcHRyKGxnLT5sb2NrLCBjcHUyKSk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKLX0KLQotdm9pZCBsZ19nbG9iYWxfbG9jayhzdHJ1Y3QgbGdsb2NrICpsZykKLXsKLQlpbnQgaTsKLQotCXByZWVtcHRfZGlzYWJsZSgpOwotCWxvY2tfYWNxdWlyZV9leGNsdXNpdmUoJmxnLT5sb2NrX2RlcF9tYXAsIDAsIDAsIE5VTEwsIF9SRVRfSVBfKTsKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQlhcmNoX3NwaW5sb2NrX3QgKmxvY2s7Ci0JCWxvY2sgPSBwZXJfY3B1X3B0cihsZy0+bG9jaywgaSk7Ci0JCWFyY2hfc3Bpbl9sb2NrKGxvY2spOwotCX0KLX0KLUVYUE9SVF9TWU1CT0wobGdfZ2xvYmFsX2xvY2spOwotCi12b2lkIGxnX2dsb2JhbF91bmxvY2soc3RydWN0IGxnbG9jayAqbGcpCi17Ci0JaW50IGk7Ci0KLQlsb2NrX3JlbGVhc2UoJmxnLT5sb2NrX2RlcF9tYXAsIDEsIF9SRVRfSVBfKTsKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQlhcmNoX3NwaW5sb2NrX3QgKmxvY2s7Ci0JCWxvY2sgPSBwZXJfY3B1X3B0cihsZy0+bG9jaywgaSk7Ci0JCWFyY2hfc3Bpbl91bmxvY2sobG9jayk7Ci0JfQotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGxnX2dsb2JhbF91bmxvY2spOwpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tpbmcvcGVyY3B1LXJ3c2VtLmMgYi9rZXJuZWwvbG9ja2luZy9wZXJjcHUtcndzZW0uYwppbmRleCBiZWMwYjY0Li5jZTE4MjU5IDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2luZy9wZXJjcHUtcndzZW0uYworKysgYi9rZXJuZWwvbG9ja2luZy9wZXJjcHUtcndzZW0uYwpAQCAtOCwxNTIgKzgsMTg2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogCi1pbnQgX19wZXJjcHVfaW5pdF9yd3NlbShzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqYnJ3LAoraW50IF9fcGVyY3B1X2luaXRfcndzZW0oc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKnNlbSwKIAkJCWNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqcndzZW1fa2V5KQogewotCWJydy0+ZmFzdF9yZWFkX2N0ciA9IGFsbG9jX3BlcmNwdShpbnQpOwotCWlmICh1bmxpa2VseSghYnJ3LT5mYXN0X3JlYWRfY3RyKSkKKwlzZW0tPnJlYWRfY291bnQgPSBhbGxvY19wZXJjcHUoaW50KTsKKwlpZiAodW5saWtlbHkoIXNlbS0+cmVhZF9jb3VudCkpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogLT5yd19zZW0gcmVwcmVzZW50cyB0aGUgd2hvbGUgcGVyY3B1X3J3X3NlbWFwaG9yZSBmb3IgbG9ja2RlcCAqLwotCV9faW5pdF9yd3NlbSgmYnJ3LT5yd19zZW0sIG5hbWUsIHJ3c2VtX2tleSk7Ci0JcmN1X3N5bmNfaW5pdCgmYnJ3LT5yc3MsIFJDVV9TQ0hFRF9TWU5DKTsKLQlhdG9taWNfc2V0KCZicnctPnNsb3dfcmVhZF9jdHIsIDApOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJydy0+d3JpdGVfd2FpdHEpOworCXJjdV9zeW5jX2luaXQoJnNlbS0+cnNzLCBSQ1VfU0NIRURfU1lOQyk7CisJX19pbml0X3J3c2VtKCZzZW0tPnJ3X3NlbSwgbmFtZSwgcndzZW1fa2V5KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZW0tPndyaXRlcik7CisJc2VtLT5yZWFkZXJzX2Jsb2NrID0gMDsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKF9fcGVyY3B1X2luaXRfcndzZW0pOwogCi12b2lkIHBlcmNwdV9mcmVlX3J3c2VtKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpicncpCit2b2lkIHBlcmNwdV9mcmVlX3J3c2VtKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpzZW0pCiB7CiAJLyoKIAkgKiBYWFg6IHRlbXBvcmFyeSBrbHVkZ2UuIFRoZSBlcnJvciBwYXRoIGluIGFsbG9jX3N1cGVyKCkKIAkgKiBhc3N1bWVzIHRoYXQgcGVyY3B1X2ZyZWVfcndzZW0oKSBpcyBzYWZlIGFmdGVyIGt6YWxsb2MoKS4KIAkgKi8KLQlpZiAoIWJydy0+ZmFzdF9yZWFkX2N0cikKKwlpZiAoIXNlbS0+cmVhZF9jb3VudCkKIAkJcmV0dXJuOwogCi0JcmN1X3N5bmNfZHRvcigmYnJ3LT5yc3MpOwotCWZyZWVfcGVyY3B1KGJydy0+ZmFzdF9yZWFkX2N0cik7Ci0JYnJ3LT5mYXN0X3JlYWRfY3RyID0gTlVMTDsgLyogY2F0Y2ggdXNlIGFmdGVyIGZyZWUgYnVncyAqLworCXJjdV9zeW5jX2R0b3IoJnNlbS0+cnNzKTsKKwlmcmVlX3BlcmNwdShzZW0tPnJlYWRfY291bnQpOworCXNlbS0+cmVhZF9jb3VudCA9IE5VTEw7IC8qIGNhdGNoIHVzZSBhZnRlciBmcmVlIGJ1Z3MgKi8KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBlcmNwdV9mcmVlX3J3c2VtKTsKIAotLyoKLSAqIFRoaXMgaXMgdGhlIGZhc3QtcGF0aCBmb3IgZG93bl9yZWFkL3VwX3JlYWQuIElmIGl0IHN1Y2NlZWRzIHdlIHJlbHkKLSAqIG9uIHRoZSBiYXJyaWVycyBwcm92aWRlZCBieSByY3Vfc3luY19lbnRlci9leGl0OyBzZWUgdGhlIGNvbW1lbnRzIGluCi0gKiBwZXJjcHVfZG93bl93cml0ZSgpIGFuZCBwZXJjcHVfdXBfd3JpdGUoKS4KLSAqCi0gKiBJZiB0aGlzIGhlbHBlciBmYWlscyB0aGUgY2FsbGVycyByZWx5IG9uIHRoZSBub3JtYWwgcndfc2VtYXBob3JlIGFuZAotICogYXRvbWljX2RlY19hbmRfdGVzdCgpLCBzbyBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0aGUgbmVjZXNzYXJ5IGJhcnJpZXJzLgotICovCi1zdGF0aWMgYm9vbCB1cGRhdGVfZmFzdF9jdHIoc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKmJydywgdW5zaWduZWQgaW50IHZhbCkKLXsKLQlib29sIHN1Y2Nlc3M7Ci0KLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlzdWNjZXNzID0gcmN1X3N5bmNfaXNfaWRsZSgmYnJ3LT5yc3MpOwotCWlmIChsaWtlbHkoc3VjY2VzcykpCi0JCV9fdGhpc19jcHVfYWRkKCpicnctPmZhc3RfcmVhZF9jdHIsIHZhbCk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKLQotCXJldHVybiBzdWNjZXNzOwotfQotCi0vKgotICogTGlrZSB0aGUgbm9ybWFsIGRvd25fcmVhZCgpIHRoaXMgaXMgbm90IHJlY3Vyc2l2ZSwgdGhlIHdyaXRlciBjYW4KLSAqIGNvbWUgYWZ0ZXIgdGhlIGZpcnN0IHBlcmNwdV9kb3duX3JlYWQoKSBhbmQgY3JlYXRlIHRoZSBkZWFkbG9jay4KLSAqCi0gKiBOb3RlOiByZXR1cm5zIHdpdGggbG9ja19pc19oZWxkKGJydy0+cndfc2VtKSA9PSBUIGZvciBsb2NrZGVwLAotICogcGVyY3B1X3VwX3JlYWQoKSBkb2VzIHJ3c2VtX3JlbGVhc2UoKS4gVGhpcyBwYWlycyB3aXRoIHRoZSB1c2FnZQotICogb2YgLT5yd19zZW0gaW4gcGVyY3B1X2Rvd24vdXBfd3JpdGUoKS4KLSAqLwotdm9pZCBwZXJjcHVfZG93bl9yZWFkKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpicncpCi17Ci0JbWlnaHRfc2xlZXAoKTsKLQlyd3NlbV9hY3F1aXJlX3JlYWQoJmJydy0+cndfc2VtLmRlcF9tYXAsIDAsIDAsIF9SRVRfSVBfKTsKLQotCWlmIChsaWtlbHkodXBkYXRlX2Zhc3RfY3RyKGJydywgKzEpKSkKLQkJcmV0dXJuOwotCi0JLyogQXZvaWQgcndzZW1fYWNxdWlyZV9yZWFkKCkgYW5kIHJ3c2VtX3JlbGVhc2UoKSAqLwotCV9fZG93bl9yZWFkKCZicnctPnJ3X3NlbSk7Ci0JYXRvbWljX2luYygmYnJ3LT5zbG93X3JlYWRfY3RyKTsKLQlfX3VwX3JlYWQoJmJydy0+cndfc2VtKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHBlcmNwdV9kb3duX3JlYWQpOwotCi1pbnQgcGVyY3B1X2Rvd25fcmVhZF90cnlsb2NrKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpicncpCi17Ci0JaWYgKHVubGlrZWx5KCF1cGRhdGVfZmFzdF9jdHIoYnJ3LCArMSkpKSB7Ci0JCWlmICghX19kb3duX3JlYWRfdHJ5bG9jaygmYnJ3LT5yd19zZW0pKQotCQkJcmV0dXJuIDA7Ci0JCWF0b21pY19pbmMoJmJydy0+c2xvd19yZWFkX2N0cik7Ci0JCV9fdXBfcmVhZCgmYnJ3LT5yd19zZW0pOwotCX0KLQotCXJ3c2VtX2FjcXVpcmVfcmVhZCgmYnJ3LT5yd19zZW0uZGVwX21hcCwgMCwgMSwgX1JFVF9JUF8pOwotCXJldHVybiAxOwotfQotCi12b2lkIHBlcmNwdV91cF9yZWFkKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpicncpCi17Ci0JcndzZW1fcmVsZWFzZSgmYnJ3LT5yd19zZW0uZGVwX21hcCwgMSwgX1JFVF9JUF8pOwotCi0JaWYgKGxpa2VseSh1cGRhdGVfZmFzdF9jdHIoYnJ3LCAtMSkpKQotCQlyZXR1cm47Ci0KLQkvKiBmYWxzZS1wb3NpdGl2ZSBpcyBwb3NzaWJsZSBidXQgaGFybWxlc3MgKi8KLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYnJ3LT5zbG93X3JlYWRfY3RyKSkKLQkJd2FrZV91cF9hbGwoJmJydy0+d3JpdGVfd2FpdHEpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwocGVyY3B1X3VwX3JlYWQpOwotCi1zdGF0aWMgaW50IGNsZWFyX2Zhc3RfY3RyKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpicncpCi17Ci0JdW5zaWduZWQgaW50IHN1bSA9IDA7Ci0JaW50IGNwdTsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJc3VtICs9IHBlcl9jcHUoKmJydy0+ZmFzdF9yZWFkX2N0ciwgY3B1KTsKLQkJcGVyX2NwdSgqYnJ3LT5mYXN0X3JlYWRfY3RyLCBjcHUpID0gMDsKLQl9Ci0KLQlyZXR1cm4gc3VtOwotfQotCi12b2lkIHBlcmNwdV9kb3duX3dyaXRlKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpicncpCitpbnQgX19wZXJjcHVfZG93bl9yZWFkKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpzZW0sIGludCB0cnkpCiB7CiAJLyoKLQkgKiBNYWtlIHJjdV9zeW5jX2lzX2lkbGUoKSA9PSBGIGFuZCB0aHVzIGRpc2FibGUgdGhlIGZhc3QtcGF0aCBpbgotCSAqIHBlcmNwdV9kb3duX3JlYWQoKSBhbmQgcGVyY3B1X3VwX3JlYWQoKSwgYW5kIHdhaXQgZm9yIGdwIHBhc3MuCisJICogRHVlIHRvIGhhdmluZyBwcmVlbXB0aW9uIGRpc2FibGVkIHRoZSBkZWNyZW1lbnQgaGFwcGVucyBvbgorCSAqIHRoZSBzYW1lIENQVSBhcyB0aGUgaW5jcmVtZW50LCBhdm9pZGluZyB0aGUKKwkgKiBpbmNyZW1lbnQtb24tb25lLUNQVS1hbmQtZGVjcmVtZW50LW9uLWFub3RoZXIgcHJvYmxlbS4KIAkgKgotCSAqIFRoZSBsYXR0ZXIgc3luY2hyb25pc2VzIHVzIHdpdGggdGhlIHByZWNlZGluZyByZWFkZXJzIHdoaWNoIHVzZWQKLQkgKiB0aGUgZmFzdC1wYXN0LCBzbyB3ZSBjYW4gbm90IG1pc3MgdGhlIHJlc3VsdCBvZiBfX3RoaXNfY3B1X2FkZCgpCi0JICogb3IgYW55dGhpbmcgZWxzZSBpbnNpZGUgdGhlaXIgY3JpdGljaWFsIHNlY3Rpb25zLgorCSAqIElmIHRoZSByZWFkZXIgbWlzc2VzIHRoZSB3cml0ZXIncyBhc3NpZ25tZW50IG9mIHJlYWRlcnNfYmxvY2ssIHRoZW4KKwkgKiB0aGUgd3JpdGVyIGlzIGd1YXJhbnRlZWQgdG8gc2VlIHRoZSByZWFkZXIncyBpbmNyZW1lbnQuCisJICoKKwkgKiBDb252ZXJzZWx5LCBhbnkgcmVhZGVycyB0aGF0IGluY3JlbWVudCB0aGVpciBzZW0tPnJlYWRfY291bnQgYWZ0ZXIKKwkgKiB0aGUgd3JpdGVyIGxvb2tzIGFyZSBndWFyYW50ZWVkIHRvIHNlZSB0aGUgcmVhZGVyc19ibG9jayB2YWx1ZSwKKwkgKiB3aGljaCBpbiB0dXJuIG1lYW5zIHRoYXQgdGhleSBhcmUgZ3VhcmFudGVlZCB0byBpbW1lZGlhdGVseQorCSAqIGRlY3JlbWVudCB0aGVpciBzZW0tPnJlYWRfY291bnQsIHNvIHRoYXQgaXQgZG9lc24ndCBtYXR0ZXIgdGhhdCB0aGUKKwkgKiB3cml0ZXIgbWlzc2VkIHRoZW0uCiAJICovCi0JcmN1X3N5bmNfZW50ZXIoJmJydy0+cnNzKTsKIAotCS8qIGV4Y2x1ZGUgb3RoZXIgd3JpdGVycywgYW5kIGJsb2NrIHRoZSBuZXcgcmVhZGVycyBjb21wbGV0ZWx5ICovCi0JZG93bl93cml0ZSgmYnJ3LT5yd19zZW0pOworCXNtcF9tYigpOyAvKiBBIG1hdGNoZXMgRCAqLwogCi0JLyogbm9ib2R5IGNhbiB1c2UgZmFzdF9yZWFkX2N0ciwgbW92ZSBpdHMgc3VtIGludG8gc2xvd19yZWFkX2N0ciAqLwotCWF0b21pY19hZGQoY2xlYXJfZmFzdF9jdHIoYnJ3KSwgJmJydy0+c2xvd19yZWFkX2N0cik7CisJLyoKKwkgKiBJZiAhcmVhZGVyc19ibG9jayB0aGUgY3JpdGljYWwgc2VjdGlvbiBzdGFydHMgaGVyZSwgbWF0Y2hlZCBieSB0aGUKKwkgKiByZWxlYXNlIGluIHBlcmNwdV91cF93cml0ZSgpLgorCSAqLworCWlmIChsaWtlbHkoIXNtcF9sb2FkX2FjcXVpcmUoJnNlbS0+cmVhZGVyc19ibG9jaykpKQorCQlyZXR1cm4gMTsKIAotCS8qIHdhaXQgZm9yIGFsbCByZWFkZXJzIHRvIGNvbXBsZXRlIHRoZWlyIHBlcmNwdV91cF9yZWFkKCkgKi8KLQl3YWl0X2V2ZW50KGJydy0+d3JpdGVfd2FpdHEsICFhdG9taWNfcmVhZCgmYnJ3LT5zbG93X3JlYWRfY3RyKSk7CisJLyoKKwkgKiBQZXIgdGhlIGFib3ZlIGNvbW1lbnQ7IHdlIHN0aWxsIGhhdmUgcHJlZW1wdGlvbiBkaXNhYmxlZCBhbmQKKwkgKiB3aWxsIHRodXMgZGVjcmVtZW50IG9uIHRoZSBzYW1lIENQVSBhcyB3ZSBpbmNyZW1lbnRlZC4KKwkgKi8KKwlfX3BlcmNwdV91cF9yZWFkKHNlbSk7CisKKwlpZiAodHJ5KQorCQlyZXR1cm4gMDsKKworCS8qCisJICogV2UgZWl0aGVyIGNhbGwgc2NoZWR1bGUoKSBpbiB0aGUgd2FpdCwgb3Igd2UnbGwgZmFsbCB0aHJvdWdoCisJICogYW5kIHJlc2NoZWR1bGUgb24gdGhlIHByZWVtcHRfZW5hYmxlKCkgaW4gcGVyY3B1X2Rvd25fcmVhZCgpLgorCSAqLworCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKKworCS8qCisJICogQXZvaWQgbG9ja2RlcCBmb3IgdGhlIGRvd24vdXBfcmVhZCgpIHdlIGFscmVhZHkgaGF2ZSB0aGVtLgorCSAqLworCV9fZG93bl9yZWFkKCZzZW0tPnJ3X3NlbSk7CisJdGhpc19jcHVfaW5jKCpzZW0tPnJlYWRfY291bnQpOworCV9fdXBfcmVhZCgmc2VtLT5yd19zZW0pOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX3BlcmNwdV9kb3duX3JlYWQpOworCit2b2lkIF9fcGVyY3B1X3VwX3JlYWQoc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlzbXBfbWIoKTsgLyogQiBtYXRjaGVzIEMgKi8KKwkvKgorCSAqIEluIG90aGVyIHdvcmRzLCBpZiB0aGV5IHNlZSBvdXIgZGVjcmVtZW50IChwcmVzdW1hYmx5IHRvIGFnZ3JlZ2F0ZQorCSAqIHplcm8sIGFzIHRoYXQgaXMgdGhlIG9ubHkgdGltZSBpdCBtYXR0ZXJzKSB0aGV5IHdpbGwgYWxzbyBzZWUgb3VyCisJICogY3JpdGljYWwgc2VjdGlvbi4KKwkgKi8KKwlfX3RoaXNfY3B1X2RlYygqc2VtLT5yZWFkX2NvdW50KTsKKworCS8qIFByb2Qgd3JpdGVyIHRvIHJlY2hlY2sgcmVhZGVyc19hY3RpdmUgKi8KKwl3YWtlX3VwKCZzZW0tPndyaXRlcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX3BlcmNwdV91cF9yZWFkKTsKKworI2RlZmluZSBwZXJfY3B1X3N1bSh2YXIpCQkJCQkJXAorKHsJCQkJCQkJCQlcCisJdHlwZW9mKHZhcikgX19zdW0gPSAwOwkJCQkJCVwKKwlpbnQgY3B1OwkJCQkJCQlcCisJY29tcGlsZXRpbWVfYXNzZXJ0X2F0b21pY190eXBlKF9fc3VtKTsJCQkJXAorCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCQkJCQlcCisJCV9fc3VtICs9IHBlcl9jcHUodmFyLCBjcHUpOwkJCQlcCisJX19zdW07CQkJCQkJCQlcCit9KQorCisvKgorICogUmV0dXJuIHRydWUgaWYgdGhlIG1vZHVsYXIgc3VtIG9mIHRoZSBzZW0tPnJlYWRfY291bnQgcGVyLUNQVSB2YXJpYWJsZSBpcworICogemVyby4gIElmIHRoaXMgc3VtIGlzIHplcm8sIHRoZW4gaXQgaXMgc3RhYmxlIGR1ZSB0byB0aGUgZmFjdCB0aGF0IGlmIGFueQorICogbmV3bHkgYXJyaXZpbmcgcmVhZGVycyBpbmNyZW1lbnQgYSBnaXZlbiBjb3VudGVyLCB0aGV5IHdpbGwgaW1tZWRpYXRlbHkKKyAqIGRlY3JlbWVudCB0aGF0IHNhbWUgY291bnRlci4KKyAqLworc3RhdGljIGJvb2wgcmVhZGVyc19hY3RpdmVfY2hlY2soc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlpZiAocGVyX2NwdV9zdW0oKnNlbS0+cmVhZF9jb3VudCkgIT0gMCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBJZiB3ZSBvYnNlcnZlZCB0aGUgZGVjcmVtZW50OyBlbnN1cmUgd2Ugc2VlIHRoZSBlbnRpcmUgY3JpdGljYWwKKwkgKiBzZWN0aW9uLgorCSAqLworCisJc21wX21iKCk7IC8qIEMgbWF0Y2hlcyBCICovCisKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBwZXJjcHVfZG93bl93cml0ZShzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqc2VtKQoreworCS8qIE5vdGlmeSByZWFkZXJzIHRvIHRha2UgdGhlIHNsb3cgcGF0aC4gKi8KKwlyY3Vfc3luY19lbnRlcigmc2VtLT5yc3MpOworCisJZG93bl93cml0ZSgmc2VtLT5yd19zZW0pOworCisJLyoKKwkgKiBOb3RpZnkgbmV3IHJlYWRlcnMgdG8gYmxvY2s7IHVwIHVudGlsIG5vdywgYW5kIHRodXMgdGhyb3VnaG91dCB0aGUKKwkgKiBsb25naXNoIHJjdV9zeW5jX2VudGVyKCkgYWJvdmUsIG5ldyByZWFkZXJzIGNvdWxkIHN0aWxsIGNvbWUgaW4uCisJICovCisJV1JJVEVfT05DRShzZW0tPnJlYWRlcnNfYmxvY2ssIDEpOworCisJc21wX21iKCk7IC8qIEQgbWF0Y2hlcyBBICovCisKKwkvKgorCSAqIElmIHRoZXkgZG9uJ3Qgc2VlIG91ciB3cml0ZXIgb2YgcmVhZGVyc19ibG9jaywgdGhlbiB3ZSBhcmUKKwkgKiBndWFyYW50ZWVkIHRvIHNlZSB0aGVpciBzZW0tPnJlYWRfY291bnQgaW5jcmVtZW50LCBhbmQgdGhlcmVmb3JlCisJICogd2lsbCB3YWl0IGZvciB0aGVtLgorCSAqLworCisJLyogV2FpdCBmb3IgYWxsIG5vdyBhY3RpdmUgcmVhZGVycyB0byBjb21wbGV0ZS4gKi8KKwl3YWl0X2V2ZW50KHNlbS0+d3JpdGVyLCByZWFkZXJzX2FjdGl2ZV9jaGVjayhzZW0pKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBlcmNwdV9kb3duX3dyaXRlKTsKIAotdm9pZCBwZXJjcHVfdXBfd3JpdGUoc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKmJydykKK3ZvaWQgcGVyY3B1X3VwX3dyaXRlKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpzZW0pCiB7Ci0JLyogcmVsZWFzZSB0aGUgbG9jaywgYnV0IHRoZSByZWFkZXJzIGNhbid0IHVzZSB0aGUgZmFzdC1wYXRoICovCi0JdXBfd3JpdGUoJmJydy0+cndfc2VtKTsKIAkvKgotCSAqIEVuYWJsZSB0aGUgZmFzdC1wYXRoIGluIHBlcmNwdV9kb3duX3JlYWQoKSBhbmQgcGVyY3B1X3VwX3JlYWQoKQotCSAqIGJ1dCBvbmx5IGFmdGVyIGFub3RoZXIgZ3AgcGFzczsgdGhpcyBhZGRzIHRoZSBuZWNlc3NhcnkgYmFycmllcgotCSAqIHRvIGVuc3VyZSB0aGUgcmVhZGVyIGNhbid0IG1pc3MgdGhlIGNoYW5nZXMgZG9uZSBieSB1cy4KKwkgKiBTaWduYWwgdGhlIHdyaXRlciBpcyBkb25lLCBubyBmYXN0IHBhdGggeWV0LgorCSAqCisJICogT25lIHJlYXNvbiB0aGF0IHdlIGNhbm5vdCBqdXN0IGltbWVkaWF0ZWx5IGZsaXAgdG8gcmVhZGVyc19mYXN0IGlzCisJICogdGhhdCBuZXcgcmVhZGVycyBtaWdodCBmYWlsIHRvIHNlZSB0aGUgcmVzdWx0cyBvZiB0aGlzIHdyaXRlcidzCisJICogY3JpdGljYWwgc2VjdGlvbi4KKwkgKgorCSAqIFRoZXJlZm9yZSB3ZSBmb3JjZSBpdCB0aHJvdWdoIHRoZSBzbG93IHBhdGggd2hpY2ggZ3VhcmFudGVlcyBhbgorCSAqIGFjcXVpcmUgYW5kIHRoZXJlYnkgZ3VhcmFudGVlcyB0aGUgY3JpdGljYWwgc2VjdGlvbidzIGNvbnNpc3RlbmN5LgogCSAqLwotCXJjdV9zeW5jX2V4aXQoJmJydy0+cnNzKTsKKwlzbXBfc3RvcmVfcmVsZWFzZSgmc2VtLT5yZWFkZXJzX2Jsb2NrLCAwKTsKKworCS8qCisJICogUmVsZWFzZSB0aGUgd3JpdGUgbG9jaywgdGhpcyB3aWxsIGFsbG93IHJlYWRlcnMgYmFjayBpbiB0aGUgZ2FtZS4KKwkgKi8KKwl1cF93cml0ZSgmc2VtLT5yd19zZW0pOworCisJLyoKKwkgKiBPbmNlIHRoaXMgY29tcGxldGVzIChhdCBsZWFzdCBvbmUgUkNVLXNjaGVkIGdyYWNlIHBlcmlvZCBoZW5jZSkgdGhlCisJICogcmVhZGVyIGZhc3QgcGF0aCB3aWxsIGJlIGF2YWlsYWJsZSBhZ2Fpbi4gU2FmZSB0byB1c2Ugb3V0c2lkZSB0aGUKKwkgKiBleGNsdXNpdmUgd3JpdGUgbG9jayBiZWNhdXNlIGl0cyBjb3VudGluZy4KKwkgKi8KKwlyY3Vfc3luY19leGl0KCZzZW0tPnJzcyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwZXJjcHVfdXBfd3JpdGUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tpbmcvcXNwaW5sb2NrX3BhcmF2aXJ0LmggYi9rZXJuZWwvbG9ja2luZy9xc3BpbmxvY2tfcGFyYXZpcnQuaAppbmRleCA4YTk5YWJmLi5lM2I1NTIwIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2luZy9xc3BpbmxvY2tfcGFyYXZpcnQuaAorKysgYi9rZXJuZWwvbG9ja2luZy9xc3BpbmxvY2tfcGFyYXZpcnQuaApAQCAtNzAsMTEgKzcwLDE0IEBACiBzdGF0aWMgaW5saW5lIGJvb2wgcHZfcXVldWVkX3NwaW5fc3RlYWxfbG9jayhzdHJ1Y3QgcXNwaW5sb2NrICpsb2NrKQogewogCXN0cnVjdCBfX3FzcGlubG9jayAqbCA9ICh2b2lkICopbG9jazsKLQlpbnQgcmV0ID0gIShhdG9taWNfcmVhZCgmbG9jay0+dmFsKSAmIF9RX0xPQ0tFRF9QRU5ESU5HX01BU0spICYmCi0JCSAgIChjbXB4Y2hnKCZsLT5sb2NrZWQsIDAsIF9RX0xPQ0tFRF9WQUwpID09IDApOwogCi0JcXN0YXRfaW5jKHFzdGF0X3B2X2xvY2tfc3RlYWxpbmcsIHJldCk7Ci0JcmV0dXJuIHJldDsKKwlpZiAoIShhdG9taWNfcmVhZCgmbG9jay0+dmFsKSAmIF9RX0xPQ0tFRF9QRU5ESU5HX01BU0spICYmCisJICAgIChjbXB4Y2hnKCZsLT5sb2NrZWQsIDAsIF9RX0xPQ0tFRF9WQUwpID09IDApKSB7CisJCXFzdGF0X2luYyhxc3RhdF9wdl9sb2NrX3N0ZWFsaW5nLCB0cnVlKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOwogfQogCiAvKgpAQCAtMjU3LDcgKzI2MCw2IEBACiBzdGF0aWMgaW5saW5lIGJvb2wKIHB2X3dhaXRfZWFybHkoc3RydWN0IHB2X25vZGUgKnByZXYsIGludCBsb29wKQogewotCiAJaWYgKChsb29wICYgUFZfUFJFVl9DSEVDS19NQVNLKSAhPSAwKQogCQlyZXR1cm4gZmFsc2U7CiAKQEAgLTI4NiwxMiArMjg4LDEwIEBACiB7CiAJc3RydWN0IHB2X25vZGUgKnBuID0gKHN0cnVjdCBwdl9ub2RlICopbm9kZTsKIAlzdHJ1Y3QgcHZfbm9kZSAqcHAgPSAoc3RydWN0IHB2X25vZGUgKilwcmV2OwotCWludCB3YWl0Y250ID0gMDsKIAlpbnQgbG9vcDsKIAlib29sIHdhaXRfZWFybHk7CiAKLQkvKiB3YWl0Y250IHByb2Nlc3Npbmcgd2lsbCBiZSBjb21waWxlZCBvdXQgaWYgIVFVRVVFRF9MT0NLX1NUQVQgKi8KLQlmb3IgKDs7IHdhaXRjbnQrKykgeworCWZvciAoOzspIHsKIAkJZm9yICh3YWl0X2Vhcmx5ID0gZmFsc2UsIGxvb3AgPSBTUElOX1RIUkVTSE9MRDsgbG9vcDsgbG9vcC0tKSB7CiAJCQlpZiAoUkVBRF9PTkNFKG5vZGUtPmxvY2tlZCkpCiAJCQkJcmV0dXJuOwpAQCAtMzE1LDcgKzMxNSw2IEBACiAKIAkJaWYgKCFSRUFEX09OQ0Uobm9kZS0+bG9ja2VkKSkgewogCQkJcXN0YXRfaW5jKHFzdGF0X3B2X3dhaXRfbm9kZSwgdHJ1ZSk7Ci0JCQlxc3RhdF9pbmMocXN0YXRfcHZfd2FpdF9hZ2Fpbiwgd2FpdGNudCk7CiAJCQlxc3RhdF9pbmMocXN0YXRfcHZfd2FpdF9lYXJseSwgd2FpdF9lYXJseSk7CiAJCQlwdl93YWl0KCZwbi0+c3RhdGUsIHZjcHVfaGFsdGVkKTsKIAkJfQpAQCAtNDU2LDEyICs0NTUsOSBAQAogCQlwdl93YWl0KCZsLT5sb2NrZWQsIF9RX1NMT1dfVkFMKTsKIAogCQkvKgotCQkgKiBUaGUgdW5sb2NrZXIgc2hvdWxkIGhhdmUgZnJlZWQgdGhlIGxvY2sgYmVmb3JlIGtpY2tpbmcgdGhlCi0JCSAqIENQVS4gU28gaWYgdGhlIGxvY2sgaXMgc3RpbGwgbm90IGZyZWUsIGl0IGlzIGEgc3B1cmlvdXMKLQkJICogd2FrZXVwIG9yIGFub3RoZXIgdkNQVSBoYXMgc3RvbGVuIHRoZSBsb2NrLiBUaGUgY3VycmVudAotCQkgKiB2Q1BVIHNob3VsZCBzcGluIGFnYWluLgorCQkgKiBCZWNhdXNlIG9mIGxvY2sgc3RlYWxpbmcsIHRoZSBxdWV1ZSBoZWFkIHZDUFUgbWF5IG5vdCBiZQorCQkgKiBhYmxlIHRvIGFjcXVpcmUgdGhlIGxvY2sgYmVmb3JlIGl0IGhhcyB0byB3YWl0IGFnYWluLgogCQkgKi8KLQkJcXN0YXRfaW5jKHFzdGF0X3B2X3NwdXJpb3VzX3dha2V1cCwgUkVBRF9PTkNFKGwtPmxvY2tlZCkpOwogCX0KIAogCS8qCkBAIC01NDQsNyArNTQwLDcgQEAKIAkgKiB1bmhhc2guIE90aGVyd2lzZSBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIEBsb2NrCiAJICogZW50cmllcywgd2hpY2ggd291bGQgYmUgQkFELgogCSAqLwotCWxvY2tlZCA9IGNtcHhjaGcoJmwtPmxvY2tlZCwgX1FfTE9DS0VEX1ZBTCwgMCk7CisJbG9ja2VkID0gY21weGNoZ19yZWxlYXNlKCZsLT5sb2NrZWQsIF9RX0xPQ0tFRF9WQUwsIDApOwogCWlmIChsaWtlbHkobG9ja2VkID09IF9RX0xPQ0tFRF9WQUwpKQogCQlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NraW5nL3FzcGlubG9ja19zdGF0LmggYi9rZXJuZWwvbG9ja2luZy9xc3BpbmxvY2tfc3RhdC5oCmluZGV4IGI5ZDAzMTUuLmViMGE1OTkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9sb2NraW5nL3FzcGlubG9ja19zdGF0LmgKKysrIGIva2VybmVsL2xvY2tpbmcvcXNwaW5sb2NrX3N0YXQuaApAQCAtMjQsOCArMjQsOCBAQAogICogICBwdl9sYXRlbmN5X3dha2UJLSBhdmVyYWdlIGxhdGVuY3kgKG5zKSBmcm9tIHZDUFUga2ljayB0byB3YWtldXAKICAqICAgcHZfbG9ja19zbG93cGF0aAktICMgb2YgbG9ja2luZyBvcGVyYXRpb25zIHZpYSB0aGUgc2xvd3BhdGgKICAqICAgcHZfbG9ja19zdGVhbGluZwktICMgb2YgbG9jayBzdGVhbGluZyBvcGVyYXRpb25zCi0gKiAgIHB2X3NwdXJpb3VzX3dha2V1cAktICMgb2Ygc3B1cmlvdXMgd2FrZXVwcwotICogICBwdl93YWl0X2FnYWluCS0gIyBvZiB2Q1BVIHdhaXQncyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgdkNQVSBraWNrCisgKiAgIHB2X3NwdXJpb3VzX3dha2V1cAktICMgb2Ygc3B1cmlvdXMgd2FrZXVwcyBpbiBub24taGVhZCB2Q1BVcworICogICBwdl93YWl0X2FnYWluCS0gIyBvZiB3YWl0J3MgYWZ0ZXIgYSBxdWV1ZSBoZWFkIHZDUFUga2ljawogICogICBwdl93YWl0X2Vhcmx5CS0gIyBvZiBlYXJseSB2Q1BVIHdhaXQncwogICogICBwdl93YWl0X2hlYWQJLSAjIG9mIHZDUFUgd2FpdCdzIGF0IHRoZSBxdWV1ZSBoZWFkCiAgKiAgIHB2X3dhaXRfbm9kZQktICMgb2YgdkNQVSB3YWl0J3MgYXQgYSBub24taGVhZCBxdWV1ZSBub2RlCmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2luZy9yd3NlbS14YWRkLmMgYi9rZXJuZWwvbG9ja2luZy9yd3NlbS14YWRkLmMKaW5kZXggNDQ3ZTA4ZC4uMjMzN2I0YiAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tpbmcvcndzZW0teGFkZC5jCisrKyBiL2tlcm5lbC9sb2NraW5nL3J3c2VtLXhhZGQuYwpAQCAtMTIxLDE2ICsxMjEsMTkgQEAKICAqIC0gd29rZW4gcHJvY2VzcyBibG9ja3MgYXJlIGRpc2NhcmRlZCBmcm9tIHRoZSBsaXN0IGFmdGVyIGhhdmluZyB0YXNrIHplcm9lZAogICogLSB3cml0ZXJzIGFyZSBvbmx5IG1hcmtlZCB3b2tlbiBpZiBkb3duZ3JhZGluZyBpcyBmYWxzZQogICovCi1zdGF0aWMgc3RydWN0IHJ3X3NlbWFwaG9yZSAqCi1fX3J3c2VtX21hcmtfd2FrZShzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0sCi0JCSAgZW51bSByd3NlbV93YWtlX3R5cGUgd2FrZV90eXBlLCBzdHJ1Y3Qgd2FrZV9xX2hlYWQgKndha2VfcSkKK3N0YXRpYyB2b2lkIF9fcndzZW1fbWFya193YWtlKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSwKKwkJCSAgICAgIGVudW0gcndzZW1fd2FrZV90eXBlIHdha2VfdHlwZSwKKwkJCSAgICAgIHN0cnVjdCB3YWtlX3FfaGVhZCAqd2FrZV9xKQogewotCXN0cnVjdCByd3NlbV93YWl0ZXIgKndhaXRlcjsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OwotCWxvbmcgb2xkY291bnQsIHdva2VuLCBsb29wLCBhZGp1c3RtZW50OworCXN0cnVjdCByd3NlbV93YWl0ZXIgKndhaXRlciwgKnRtcDsKKwlsb25nIG9sZGNvdW50LCB3b2tlbiA9IDAsIGFkanVzdG1lbnQgPSAwOwogCi0Jd2FpdGVyID0gbGlzdF9lbnRyeShzZW0tPndhaXRfbGlzdC5uZXh0LCBzdHJ1Y3QgcndzZW1fd2FpdGVyLCBsaXN0KTsKKwkvKgorCSAqIFRha2UgYSBwZWVrIGF0IHRoZSBxdWV1ZSBoZWFkIHdhaXRlciBzdWNoIHRoYXQgd2UgY2FuIGRldGVybWluZQorCSAqIHRoZSB3YWtldXAocykgdG8gcGVyZm9ybS4KKwkgKi8KKwl3YWl0ZXIgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzZW0tPndhaXRfbGlzdCwgc3RydWN0IHJ3c2VtX3dhaXRlciwgbGlzdCk7CisKIAlpZiAod2FpdGVyLT50eXBlID09IFJXU0VNX1dBSVRJTkdfRk9SX1dSSVRFKSB7CiAJCWlmICh3YWtlX3R5cGUgPT0gUldTRU1fV0FLRV9BTlkpIHsKIAkJCS8qCkBAIC0xNDIsMTkgKzE0NSwxOSBAQAogCQkJICovCiAJCQl3YWtlX3FfYWRkKHdha2VfcSwgd2FpdGVyLT50YXNrKTsKIAkJfQotCQlnb3RvIG91dDsKKworCQlyZXR1cm47CiAJfQogCi0JLyogV3JpdGVycyBtaWdodCBzdGVhbCB0aGUgbG9jayBiZWZvcmUgd2UgZ3JhbnQgaXQgdG8gdGhlIG5leHQgcmVhZGVyLgorCS8qCisJICogV3JpdGVycyBtaWdodCBzdGVhbCB0aGUgbG9jayBiZWZvcmUgd2UgZ3JhbnQgaXQgdG8gdGhlIG5leHQgcmVhZGVyLgogCSAqIFdlIHByZWZlciB0byBkbyB0aGUgZmlyc3QgcmVhZGVyIGdyYW50IGJlZm9yZSBjb3VudGluZyByZWFkZXJzCiAJICogc28gd2UgY2FuIGJhaWwgb3V0IGVhcmx5IGlmIGEgd3JpdGVyIHN0b2xlIHRoZSBsb2NrLgogCSAqLwotCWFkanVzdG1lbnQgPSAwOwogCWlmICh3YWtlX3R5cGUgIT0gUldTRU1fV0FLRV9SRUFEX09XTkVEKSB7CiAJCWFkanVzdG1lbnQgPSBSV1NFTV9BQ1RJVkVfUkVBRF9CSUFTOwogIHRyeV9yZWFkZXJfZ3JhbnQ6CiAJCW9sZGNvdW50ID0gYXRvbWljX2xvbmdfZmV0Y2hfYWRkKGFkanVzdG1lbnQsICZzZW0tPmNvdW50KTsKLQogCQlpZiAodW5saWtlbHkob2xkY291bnQgPCBSV1NFTV9XQUlUSU5HX0JJQVMpKSB7CiAJCQkvKgogCQkJICogSWYgdGhlIGNvdW50IGlzIHN0aWxsIGxlc3MgdGhhbiBSV1NFTV9XQUlUSU5HX0JJQVMKQEAgLTE2NCw3ICsxNjcsOCBAQAogCQkJICovCiAJCQlpZiAoYXRvbWljX2xvbmdfYWRkX3JldHVybigtYWRqdXN0bWVudCwgJnNlbS0+Y291bnQpIDwKIAkJCSAgICBSV1NFTV9XQUlUSU5HX0JJQVMpCi0JCQkJZ290byBvdXQ7CisJCQkJcmV0dXJuOworCiAJCQkvKiBMYXN0IGFjdGl2ZSBsb2NrZXIgbGVmdC4gUmV0cnkgd2FraW5nIHJlYWRlcnMuICovCiAJCQlnb3RvIHRyeV9yZWFkZXJfZ3JhbnQ7CiAJCX0KQEAgLTE3NiwzOCArMTgwLDIzIEBACiAJCXJ3c2VtX3NldF9yZWFkZXJfb3duZWQoc2VtKTsKIAl9CiAKLQkvKiBHcmFudCBhbiBpbmZpbml0ZSBudW1iZXIgb2YgcmVhZCBsb2NrcyB0byB0aGUgcmVhZGVycyBhdCB0aGUgZnJvbnQKLQkgKiBvZiB0aGUgcXVldWUuICBOb3RlIHdlIGluY3JlbWVudCB0aGUgJ2FjdGl2ZSBwYXJ0JyBvZiB0aGUgY291bnQgYnkKLQkgKiB0aGUgbnVtYmVyIG9mIHJlYWRlcnMgYmVmb3JlIHdha2luZyBhbnkgcHJvY2Vzc2VzIHVwLgorCS8qCisJICogR3JhbnQgYW4gaW5maW5pdGUgbnVtYmVyIG9mIHJlYWQgbG9ja3MgdG8gdGhlIHJlYWRlcnMgYXQgdGhlIGZyb250CisJICogb2YgdGhlIHF1ZXVlLiBXZSBrbm93IHRoYXQgd29rZW4gd2lsbCBiZSBhdCBsZWFzdCAxIGFzIHdlIGFjY291bnRlZAorCSAqIGZvciBhYm92ZS4gTm90ZSB3ZSBpbmNyZW1lbnQgdGhlICdhY3RpdmUgcGFydCcgb2YgdGhlIGNvdW50IGJ5IHRoZQorCSAqIG51bWJlciBvZiByZWFkZXJzIGJlZm9yZSB3YWtpbmcgYW55IHByb2Nlc3NlcyB1cC4KIAkgKi8KLQl3b2tlbiA9IDA7Ci0JZG8gewotCQl3b2tlbisrOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3YWl0ZXIsIHRtcCwgJnNlbS0+d2FpdF9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCi0JCWlmICh3YWl0ZXItPmxpc3QubmV4dCA9PSAmc2VtLT53YWl0X2xpc3QpCisJCWlmICh3YWl0ZXItPnR5cGUgPT0gUldTRU1fV0FJVElOR19GT1JfV1JJVEUpCiAJCQlicmVhazsKIAotCQl3YWl0ZXIgPSBsaXN0X2VudHJ5KHdhaXRlci0+bGlzdC5uZXh0LAotCQkJCQlzdHJ1Y3QgcndzZW1fd2FpdGVyLCBsaXN0KTsKLQotCX0gd2hpbGUgKHdhaXRlci0+dHlwZSAhPSBSV1NFTV9XQUlUSU5HX0ZPUl9XUklURSk7Ci0KLQlhZGp1c3RtZW50ID0gd29rZW4gKiBSV1NFTV9BQ1RJVkVfUkVBRF9CSUFTIC0gYWRqdXN0bWVudDsKLQlpZiAod2FpdGVyLT50eXBlICE9IFJXU0VNX1dBSVRJTkdfRk9SX1dSSVRFKQotCQkvKiBoaXQgZW5kIG9mIGxpc3QgYWJvdmUgKi8KLQkJYWRqdXN0bWVudCAtPSBSV1NFTV9XQUlUSU5HX0JJQVM7Ci0KLQlpZiAoYWRqdXN0bWVudCkKLQkJYXRvbWljX2xvbmdfYWRkKGFkanVzdG1lbnQsICZzZW0tPmNvdW50KTsKLQotCW5leHQgPSBzZW0tPndhaXRfbGlzdC5uZXh0OwotCWxvb3AgPSB3b2tlbjsKLQlkbyB7Ci0JCXdhaXRlciA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IHJ3c2VtX3dhaXRlciwgbGlzdCk7Ci0JCW5leHQgPSB3YWl0ZXItPmxpc3QubmV4dDsKKwkJd29rZW4rKzsKIAkJdHNrID0gd2FpdGVyLT50YXNrOwogCiAJCXdha2VfcV9hZGQod2FrZV9xLCB0c2spOworCQlsaXN0X2RlbCgmd2FpdGVyLT5saXN0KTsKIAkJLyoKIAkJICogRW5zdXJlIHRoYXQgdGhlIGxhc3Qgb3BlcmF0aW9uIGlzIHNldHRpbmcgdGhlIHJlYWRlcgogCQkgKiB3YWl0ZXIgdG8gbmlsIHN1Y2ggdGhhdCByd3NlbV9kb3duX3JlYWRfZmFpbGVkKCkgY2Fubm90CkBAIC0yMTUsMTMgKzIwNCwxNiBAQAogCQkgKiB0byB0aGUgdGFzayB0byB3YWtldXAuCiAJCSAqLwogCQlzbXBfc3RvcmVfcmVsZWFzZSgmd2FpdGVyLT50YXNrLCBOVUxMKTsKLQl9IHdoaWxlICgtLWxvb3ApOworCX0KIAotCXNlbS0+d2FpdF9saXN0Lm5leHQgPSBuZXh0OwotCW5leHQtPnByZXYgPSAmc2VtLT53YWl0X2xpc3Q7CisJYWRqdXN0bWVudCA9IHdva2VuICogUldTRU1fQUNUSVZFX1JFQURfQklBUyAtIGFkanVzdG1lbnQ7CisJaWYgKGxpc3RfZW1wdHkoJnNlbS0+d2FpdF9saXN0KSkgeworCQkvKiBoaXQgZW5kIG9mIGxpc3QgYWJvdmUgKi8KKwkJYWRqdXN0bWVudCAtPSBSV1NFTV9XQUlUSU5HX0JJQVM7CisJfQogCi0gb3V0OgotCXJldHVybiBzZW07CisJaWYgKGFkanVzdG1lbnQpCisJCWF0b21pY19sb25nX2FkZChhZGp1c3RtZW50LCAmc2VtLT5jb3VudCk7CiB9CiAKIC8qCkBAIC0yMzUsNyArMjI3LDYgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAJV0FLRV9RKHdha2VfcSk7CiAKLQkvKiBzZXQgdXAgbXkgb3duIHN0eWxlIG9mIHdhaXRxdWV1ZSAqLwogCXdhaXRlci50YXNrID0gdHNrOwogCXdhaXRlci50eXBlID0gUldTRU1fV0FJVElOR19GT1JfUkVBRDsKIApAQCAtMjQ3LDcgKzIzOCw4IEBACiAJLyogd2UncmUgbm93IHdhaXRpbmcgb24gdGhlIGxvY2ssIGJ1dCBubyBsb25nZXIgYWN0aXZlbHkgbG9ja2luZyAqLwogCWNvdW50ID0gYXRvbWljX2xvbmdfYWRkX3JldHVybihhZGp1c3RtZW50LCAmc2VtLT5jb3VudCk7CiAKLQkvKiBJZiB0aGVyZSBhcmUgbm8gYWN0aXZlIGxvY2tzLCB3YWtlIHRoZSBmcm9udCBxdWV1ZWQgcHJvY2VzcyhlcykuCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgbm8gYWN0aXZlIGxvY2tzLCB3YWtlIHRoZSBmcm9udCBxdWV1ZWQgcHJvY2VzcyhlcykuCiAJICoKIAkgKiBJZiB0aGVyZSBhcmUgbm8gd3JpdGVycyBhbmQgd2UgYXJlIGZpcnN0IGluIHRoZSBxdWV1ZSwKIAkgKiB3YWtlIG91ciBvd24gd2FpdGVyIHRvIGpvaW4gdGhlIGV4aXN0aW5nIGFjdGl2ZSByZWFkZXJzICEKQEAgLTI1NSw3ICsyNDcsNyBAQAogCWlmIChjb3VudCA9PSBSV1NFTV9XQUlUSU5HX0JJQVMgfHwKIAkgICAgKGNvdW50ID4gUldTRU1fV0FJVElOR19CSUFTICYmCiAJICAgICBhZGp1c3RtZW50ICE9IC1SV1NFTV9BQ1RJVkVfUkVBRF9CSUFTKSkKLQkJc2VtID0gX19yd3NlbV9tYXJrX3dha2Uoc2VtLCBSV1NFTV9XQUtFX0FOWSwgJndha2VfcSk7CisJCV9fcndzZW1fbWFya193YWtlKHNlbSwgUldTRU1fV0FLRV9BTlksICZ3YWtlX3EpOwogCiAJcmF3X3NwaW5fdW5sb2NrX2lycSgmc2VtLT53YWl0X2xvY2spOwogCXdha2VfdXBfcSgmd2FrZV9xKTsKQEAgLTUwNSw3ICs0OTcsNyBAQAogCQlpZiAoY291bnQgPiBSV1NFTV9XQUlUSU5HX0JJQVMpIHsKIAkJCVdBS0VfUSh3YWtlX3EpOwogCi0JCQlzZW0gPSBfX3J3c2VtX21hcmtfd2FrZShzZW0sIFJXU0VNX1dBS0VfUkVBREVSUywgJndha2VfcSk7CisJCQlfX3J3c2VtX21hcmtfd2FrZShzZW0sIFJXU0VNX1dBS0VfUkVBREVSUywgJndha2VfcSk7CiAJCQkvKgogCQkJICogVGhlIHdha2V1cCBpcyBub3JtYWxseSBjYWxsZWQgX2FmdGVyXyB0aGUgd2FpdF9sb2NrCiAJCQkgKiBpcyByZWxlYXNlZCwgYnV0IGdpdmVuIHRoYXQgd2UgYXJlIHByb2FjdGl2ZWx5IHdha2luZwpAQCAtNjE0LDkgKzYwNiw4IEBACiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZzZW0tPndhaXRfbG9jaywgZmxhZ3MpOwogbG9ja2VkOgogCi0JLyogZG8gbm90aGluZyBpZiBsaXN0IGVtcHR5ICovCiAJaWYgKCFsaXN0X2VtcHR5KCZzZW0tPndhaXRfbGlzdCkpCi0JCXNlbSA9IF9fcndzZW1fbWFya193YWtlKHNlbSwgUldTRU1fV0FLRV9BTlksICZ3YWtlX3EpOworCQlfX3J3c2VtX21hcmtfd2FrZShzZW0sIFJXU0VNX1dBS0VfQU5ZLCAmd2FrZV9xKTsKIAogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZW0tPndhaXRfbG9jaywgZmxhZ3MpOwogCXdha2VfdXBfcSgmd2FrZV9xKTsKQEAgLTYzOCw5ICs2MjksOCBAQAogCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZzZW0tPndhaXRfbG9jaywgZmxhZ3MpOwogCi0JLyogZG8gbm90aGluZyBpZiBsaXN0IGVtcHR5ICovCiAJaWYgKCFsaXN0X2VtcHR5KCZzZW0tPndhaXRfbGlzdCkpCi0JCXNlbSA9IF9fcndzZW1fbWFya193YWtlKHNlbSwgUldTRU1fV0FLRV9SRUFEX09XTkVELCAmd2FrZV9xKTsKKwkJX19yd3NlbV9tYXJrX3dha2Uoc2VtLCBSV1NFTV9XQUtFX1JFQURfT1dORUQsICZ3YWtlX3EpOwogCiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbS0+d2FpdF9sb2NrLCBmbGFncyk7CiAJd2FrZV91cF9xKCZ3YWtlX3EpOwpkaWZmIC0tZ2l0IGEva2VybmVsL21lbXJlbWFwLmMgYi9rZXJuZWwvbWVtcmVtYXAuYwppbmRleCAyNTFkMTZiLi5iNTAxZTM5IDEwMDY0NAotLS0gYS9rZXJuZWwvbWVtcmVtYXAuYworKysgYi9rZXJuZWwvbWVtcmVtYXAuYwpAQCAtMjQ3LDYgKzI0Nyw3IEBACiAJYWxpZ25fc3RhcnQgPSByZXMtPnN0YXJ0ICYgfihTRUNUSU9OX1NJWkUgLSAxKTsKIAlhbGlnbl9zaXplID0gQUxJR04ocmVzb3VyY2Vfc2l6ZShyZXMpLCBTRUNUSU9OX1NJWkUpOwogCWFyY2hfcmVtb3ZlX21lbW9yeShhbGlnbl9zdGFydCwgYWxpZ25fc2l6ZSk7CisJdW50cmFja19wZm4oTlVMTCwgUEhZU19QRk4oYWxpZ25fc3RhcnQpLCBhbGlnbl9zaXplKTsKIAlwZ21hcF9yYWRpeF9yZWxlYXNlKHJlcyk7CiAJZGV2X1dBUk5fT05DRShkZXYsIHBnbWFwLT5hbHRtYXAgJiYgcGdtYXAtPmFsdG1hcC0+YWxsb2MsCiAJCQkiJXM6IGZhaWxlZCB0byBmcmVlIGFsbCByZXNlcnZlZCBwYWdlc1xuIiwgX19mdW5jX18pOwpAQCAtMjgyLDYgKzI4Myw3IEBACiAJCXN0cnVjdCBwZXJjcHVfcmVmICpyZWYsIHN0cnVjdCB2bWVtX2FsdG1hcCAqYWx0bWFwKQogewogCXJlc291cmNlX3NpemVfdCBrZXksIGFsaWduX3N0YXJ0LCBhbGlnbl9zaXplLCBhbGlnbl9lbmQ7CisJcGdwcm90X3QgcGdwcm90ID0gUEFHRV9LRVJORUw7CiAJc3RydWN0IGRldl9wYWdlbWFwICpwZ21hcDsKIAlzdHJ1Y3QgcGFnZV9tYXAgKnBhZ2VfbWFwOwogCWludCBlcnJvciwgbmlkLCBpc19yYW07CkBAIC0zNTEsNiArMzUzLDExIEBACiAJaWYgKG5pZCA8IDApCiAJCW5pZCA9IG51bWFfbWVtX2lkKCk7CiAKKwllcnJvciA9IHRyYWNrX3Bmbl9yZW1hcChOVUxMLCAmcGdwcm90LCBQSFlTX1BGTihhbGlnbl9zdGFydCksIDAsCisJCQlhbGlnbl9zaXplKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX3Bmbl9yZW1hcDsKKwogCWVycm9yID0gYXJjaF9hZGRfbWVtb3J5KG5pZCwgYWxpZ25fc3RhcnQsIGFsaWduX3NpemUsIHRydWUpOwogCWlmIChlcnJvcikKIAkJZ290byBlcnJfYWRkX21lbW9yeTsKQEAgLTM3MSw2ICszNzgsOCBAQAogCXJldHVybiBfX3ZhKHJlcy0+c3RhcnQpOwogCiAgZXJyX2FkZF9tZW1vcnk6CisJdW50cmFja19wZm4oTlVMTCwgUEhZU19QRk4oYWxpZ25fc3RhcnQpLCBhbGlnbl9zaXplKTsKKyBlcnJfcGZuX3JlbWFwOgogIGVycl9yYWRpeDoKIAlwZ21hcF9yYWRpeF9yZWxlYXNlKHJlcyk7CiAJZGV2cmVzX2ZyZWUocGFnZV9tYXApOwpkaWZmIC0tZ2l0IGEva2VybmVsL3BhZGF0YS5jIGIva2VybmVsL3BhZGF0YS5jCmluZGV4IDk5MzI3ODguLjc4NDhmMDUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wYWRhdGEuYworKysgYi9rZXJuZWwvcGFkYXRhLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIE1BWF9PQkpfTlVNIDEwMDAKIApAQCAtNzY5LDUyICs3NzAsNDMgQEAKIAkJY3B1bWFza190ZXN0X2NwdShjcHUsIHBpbnN0LT5jcHVtYXNrLmNiY3B1KTsKIH0KIAotCi1zdGF0aWMgaW50IHBhZGF0YV9jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IHBhZGF0YV9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQogewotCWludCBlcnI7CiAJc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3Q7Ci0JaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CisJaW50IHJldDsKIAotCXBpbnN0ID0gY29udGFpbmVyX29mKG5mYiwgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSwgY3B1X25vdGlmaWVyKTsKKwlwaW5zdCA9IGhsaXN0X2VudHJ5X3NhZmUobm9kZSwgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSwgbm9kZSk7CisJaWYgKCFwaW5zdF9oYXNfY3B1KHBpbnN0LCBjcHUpKQorCQlyZXR1cm4gMDsKIAotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX09OTElORV9GUk9aRU46Ci0JY2FzZSBDUFVfRE9XTl9GQUlMRUQ6Ci0JY2FzZSBDUFVfRE9XTl9GQUlMRURfRlJPWkVOOgotCQlpZiAoIXBpbnN0X2hhc19jcHUocGluc3QsIGNwdSkpCi0JCQlicmVhazsKLQkJbXV0ZXhfbG9jaygmcGluc3QtPmxvY2spOwotCQllcnIgPSBfX3BhZGF0YV9hZGRfY3B1KHBpbnN0LCBjcHUpOwotCQltdXRleF91bmxvY2soJnBpbnN0LT5sb2NrKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKGVycik7Ci0JCWJyZWFrOwotCi0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCWNhc2UgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU46Ci0JY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6Ci0JY2FzZSBDUFVfVVBfQ0FOQ0VMRURfRlJPWkVOOgotCQlpZiAoIXBpbnN0X2hhc19jcHUocGluc3QsIGNwdSkpCi0JCQlicmVhazsKLQkJbXV0ZXhfbG9jaygmcGluc3QtPmxvY2spOwotCQllcnIgPSBfX3BhZGF0YV9yZW1vdmVfY3B1KHBpbnN0LCBjcHUpOwotCQltdXRleF91bmxvY2soJnBpbnN0LT5sb2NrKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKGVycik7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBOT1RJRllfT0s7CisJbXV0ZXhfbG9jaygmcGluc3QtPmxvY2spOworCXJldCA9IF9fcGFkYXRhX2FkZF9jcHUocGluc3QsIGNwdSk7CisJbXV0ZXhfdW5sb2NrKCZwaW5zdC0+bG9jayk7CisJcmV0dXJuIHJldDsKIH0KKworc3RhdGljIGludCBwYWRhdGFfY3B1X3ByZXBfZG93bih1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDsKKwlpbnQgcmV0OworCisJcGluc3QgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UsIG5vZGUpOworCWlmICghcGluc3RfaGFzX2NwdShwaW5zdCwgY3B1KSkKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZwaW5zdC0+bG9jayk7CisJcmV0ID0gX19wYWRhdGFfcmVtb3ZlX2NwdShwaW5zdCwgY3B1KTsKKwltdXRleF91bmxvY2soJnBpbnN0LT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgZW51bSBjcHVocF9zdGF0ZSBocF9vbmxpbmU7CiAjZW5kaWYKIAogc3RhdGljIHZvaWQgX19wYWRhdGFfZnJlZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCkKIHsKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLQl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmcGluc3QtPmNwdV9ub3RpZmllcik7CisJY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlX25vY2FsbHMoaHBfb25saW5lLCAmcGluc3QtPm5vZGUpOwogI2VuZGlmCiAKIAlwYWRhdGFfc3RvcChwaW5zdCk7CkBAIC0xMDEyLDExICsxMDA0LDggQEAKIAltdXRleF9pbml0KCZwaW5zdC0+bG9jayk7CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLQlwaW5zdC0+Y3B1X25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBwYWRhdGFfY3B1X2NhbGxiYWNrOwotCXBpbnN0LT5jcHVfbm90aWZpZXIucHJpb3JpdHkgPSAwOwotCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmcGluc3QtPmNwdV9ub3RpZmllcik7CisJY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlX25vY2FsbHMoaHBfb25saW5lLCAmcGluc3QtPm5vZGUpOwogI2VuZGlmCi0KIAlyZXR1cm4gcGluc3Q7CiAKIGVycl9mcmVlX21hc2tzOgpAQCAtMTAzOSwzICsxMDI4LDI2IEBACiAJa29iamVjdF9wdXQoJnBpbnN0LT5rb2JqKTsKIH0KIEVYUE9SVF9TWU1CT0wocGFkYXRhX2ZyZWUpOworCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisKK3N0YXRpYyBfX2luaXQgaW50IHBhZGF0YV9kcml2ZXJfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9tdWx0aShDUFVIUF9BUF9PTkxJTkVfRFlOLCAicGFkYXRhOm9ubGluZSIsCisJCQkJICAgICAgcGFkYXRhX2NwdV9vbmxpbmUsCisJCQkJICAgICAgcGFkYXRhX2NwdV9wcmVwX2Rvd24pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWhwX29ubGluZSA9IHJldDsKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KHBhZGF0YV9kcml2ZXJfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBwYWRhdGFfZHJpdmVyX2V4aXQodm9pZCkKK3sKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoaHBfb25saW5lKTsKK30KK21vZHVsZV9leGl0KHBhZGF0YV9kcml2ZXJfZXhpdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9LY29uZmlnIGIva2VybmVsL3Bvd2VyL0tjb25maWcKaW5kZXggNjhkM2ViYy4uZTg1MTdiNiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL0tjb25maWcKKysrIGIva2VybmVsL3Bvd2VyL0tjb25maWcKQEAgLTE4Niw3ICsxODYsNyBAQAogCiBjb25maWcgRFBNX1dBVENIRE9HCiAJYm9vbCAiRGV2aWNlIHN1c3BlbmQvcmVzdW1lIHdhdGNoZG9nIgotCWRlcGVuZHMgb24gUE1fREVCVUcgJiYgUFNUT1JFCisJZGVwZW5kcyBvbiBQTV9ERUJVRyAmJiBQU1RPUkUgJiYgRVhQRVJUCiAJLS0taGVscC0tLQogCSAgU2V0cyB1cCBhIHdhdGNoZG9nIHRpbWVyIHRvIGNhcHR1cmUgZHJpdmVycyB0aGF0IGFyZQogCSAgbG9ja2VkIHVwIGF0dGVtcHRpbmcgdG8gc3VzcGVuZC9yZXN1bWUgYSBkZXZpY2UuCkBAIC0xOTcsNyArMTk3LDcgQEAKIGNvbmZpZyBEUE1fV0FUQ0hET0dfVElNRU9VVAogCWludCAiV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzIgogCXJhbmdlIDEgMTIwCi0JZGVmYXVsdCA2MAorCWRlZmF1bHQgMTIwCiAJZGVwZW5kcyBvbiBEUE1fV0FUQ0hET0cKIAogY29uZmlnIFBNX1RSQUNFCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMgYi9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMKaW5kZXggMzNjNzliNi4uYjI2ZGJjNCAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jCisrKyBiL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYwpAQCAtMzA2LDggKzMwNiwxMCBAQAogCWlmIChlcnJvcikKIAkJcHJpbnRrKEtFUk5fRVJSICJQTTogRXJyb3IgJWQgY3JlYXRpbmcgaGliZXJuYXRpb24gaW1hZ2VcbiIsCiAJCQllcnJvcik7Ci0JaWYgKCFpbl9zdXNwZW5kKQorCWlmICghaW5fc3VzcGVuZCkgewogCQlldmVudHNfY2hlY2tfZW5hYmxlZCA9IGZhbHNlOworCQljbGVhcl9mcmVlX3BhZ2VzKCk7CisJfQogCiAJcGxhdGZvcm1fbGVhdmUocGxhdGZvcm1fbW9kZSk7CiAKQEAgLTExODksMjIgKzExOTEsNiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBwYWdlX3BvaXNvbl9ub2hpYmVybmF0ZV9zZXR1cChjaGFyICpzdHIpCi17Ci0jaWZkZWYgQ09ORklHX1BBR0VfUE9JU09OSU5HX1pFUk8KLQkvKgotCSAqIFRoZSB6ZXJvaW5nIG9wdGlvbiBmb3IgcGFnZSBwb2lzb24gc2tpcHMgdGhlIGNoZWNrcyBvbiBhbGxvYy4KLQkgKiBzaW5jZSBoaWJlcm5hdGlvbiBkb2Vzbid0IHNhdmUgZnJlZSBwYWdlcyB0aGVyZSdzIG5vIHdheSB0bwotCSAqIGd1YXJhbnRlZSB0aGUgcGFnZXMgd2lsbCBzdGlsbCBiZSB6ZXJvZWQuCi0JICovCi0JaWYgKCFzdHJjbXAoc3RyLCAib24iKSkgewotCQlwcl9pbmZvKCJEaXNhYmxpbmcgaGliZXJuYXRpb24gZHVlIHRvIHBhZ2UgcG9pc29uaW5nXG4iKTsKLQkJcmV0dXJuIG5vaGliZXJuYXRlX3NldHVwKHN0cik7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIDE7Ci19Ci0KIF9fc2V0dXAoIm5vcmVzdW1lIiwgbm9yZXN1bWVfc2V0dXApOwogX19zZXR1cCgicmVzdW1lX29mZnNldD0iLCByZXN1bWVfb2Zmc2V0X3NldHVwKTsKIF9fc2V0dXAoInJlc3VtZT0iLCByZXN1bWVfc2V0dXApOwpAQCAtMTIxMiw0ICsxMTk4LDMgQEAKIF9fc2V0dXAoInJlc3VtZXdhaXQiLCByZXN1bWV3YWl0X3NldHVwKTsKIF9fc2V0dXAoInJlc3VtZWRlbGF5PSIsIHJlc3VtZWRlbGF5X3NldHVwKTsKIF9fc2V0dXAoIm5vaGliZXJuYXRlIiwgbm9oaWJlcm5hdGVfc2V0dXApOwotX19zZXR1cCgicGFnZV9wb2lzb249IiwgcGFnZV9wb2lzb25fbm9oaWJlcm5hdGVfc2V0dXApOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL21haW4uYyBiL2tlcm5lbC9wb3dlci9tYWluLmMKaW5kZXggNWVhNTBiMS4uMjgxYTY5NyAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL21haW4uYworKysgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCkBAIC02NDQsNiArNjQ0LDcgQEAKIAkJcmV0dXJuIGVycm9yOwogCWhpYmVybmF0ZV9pbWFnZV9zaXplX2luaXQoKTsKIAloaWJlcm5hdGVfcmVzZXJ2ZWRfc2l6ZV9pbml0KCk7CisJcG1fc3RhdGVzX2luaXQoKTsKIAlwb3dlcl9rb2JqID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgicG93ZXIiLCBOVUxMKTsKIAlpZiAoIXBvd2VyX2tvYmopCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3Bvd2VyLmggYi9rZXJuZWwvcG93ZXIvcG93ZXIuaAppbmRleCAyNDJkOGI4Li41NmQxZDBkIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvcG93ZXIuaAorKysgYi9rZXJuZWwvcG93ZXIvcG93ZXIuaApAQCAtMTEwLDYgKzExMCw4IEBACiBleHRlcm4gdm9pZCBmcmVlX2Jhc2ljX21lbW9yeV9iaXRtYXBzKHZvaWQpOwogZXh0ZXJuIGludCBoaWJlcm5hdGVfcHJlYWxsb2NhdGVfbWVtb3J5KHZvaWQpOwogCitleHRlcm4gdm9pZCBjbGVhcl9mcmVlX3BhZ2VzKHZvaWQpOworCiAvKioKICAqCUF1eGlsaWFyeSBzdHJ1Y3R1cmUgdXNlZCBmb3IgcmVhZGluZyB0aGUgc25hcHNob3QgaW1hZ2UgZGF0YSBhbmQKICAqCW1ldGFkYXRhIGZyb20gYW5kIHdyaXRpbmcgdGhlbSB0byB0aGUgbGlzdCBvZiBwYWdlIGJhY2t1cCBlbnRyaWVzCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvcW9zLmMgYi9rZXJuZWwvcG93ZXIvcW9zLmMKaW5kZXggOTdiMGRmNy4uMTY4ZmY0NCAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3Fvcy5jCisrKyBiL2tlcm5lbC9wb3dlci9xb3MuYwpAQCAtNDgyLDcgKzQ4MiwxNiBAQAogCQlyZXR1cm47CiAJfQogCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZyZXEtPndvcmspOworCS8qCisJICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIHZlcnkgZWFybHkgZHVyaW5nIGJvb3QsIGZvciBleGFtcGxlLAorCSAqIGZyb20gb2ZfY2xrX2luaXQoKSwgd2hlcmUgaXJxIG5lZWRzIHRvIHN0YXkgZGlzYWJsZWQuCisJICogY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCkgYXNzdW1lcyB0aGF0IGlycSBpcyBlbmFibGVkIG9uCisJICogaW52b2NhdGlvbiBhbmQgcmUtZW5hYmxlcyBpdCBvbiByZXR1cm4uICBBdm9pZCBjYWxsaW5nIGl0IHVudGlsCisJICogd29ya3F1ZXVlIGlzIGluaXRpYWxpemVkLgorCSAqLworCWlmIChrZXZlbnRkX3VwKCkpCisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcmVxLT53b3JrKTsKKwogCV9fcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KHJlcSwgbmV3X3ZhbHVlKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBtX3Fvc191cGRhdGVfcmVxdWVzdCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuYyBiL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCmluZGV4IDlhMDE3OGMuLjRmMGYwNjAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCisrKyBiL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCkBAIC04MzUsOSArODM1LDkgQEAKICAqLwogc3RhdGljIGJvb2wgcnRyZWVfbmV4dF9ub2RlKHN0cnVjdCBtZW1vcnlfYml0bWFwICpibSkKIHsKLQlibS0+Y3VyLm5vZGUgPSBsaXN0X2VudHJ5KGJtLT5jdXIubm9kZS0+bGlzdC5uZXh0LAotCQkJCSAgc3RydWN0IHJ0cmVlX25vZGUsIGxpc3QpOwotCWlmICgmYm0tPmN1ci5ub2RlLT5saXN0ICE9ICZibS0+Y3VyLnpvbmUtPmxlYXZlcykgeworCWlmICghbGlzdF9pc19sYXN0KCZibS0+Y3VyLm5vZGUtPmxpc3QsICZibS0+Y3VyLnpvbmUtPmxlYXZlcykpIHsKKwkJYm0tPmN1ci5ub2RlID0gbGlzdF9lbnRyeShibS0+Y3VyLm5vZGUtPmxpc3QubmV4dCwKKwkJCQkJICBzdHJ1Y3QgcnRyZWVfbm9kZSwgbGlzdCk7CiAJCWJtLT5jdXIubm9kZV9wZm4gKz0gQk1fQklUU19QRVJfQkxPQ0s7CiAJCWJtLT5jdXIubm9kZV9iaXQgID0gMDsKIAkJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwpAQCAtODQ1LDkgKzg0NSw5IEBACiAJfQogCiAJLyogTm8gbW9yZSBub2RlcywgZ290byBuZXh0IHpvbmUgKi8KLQlibS0+Y3VyLnpvbmUgPSBsaXN0X2VudHJ5KGJtLT5jdXIuem9uZS0+bGlzdC5uZXh0LAorCWlmICghbGlzdF9pc19sYXN0KCZibS0+Y3VyLnpvbmUtPmxpc3QsICZibS0+em9uZXMpKSB7CisJCWJtLT5jdXIuem9uZSA9IGxpc3RfZW50cnkoYm0tPmN1ci56b25lLT5saXN0Lm5leHQsCiAJCQkJICBzdHJ1Y3QgbWVtX3pvbmVfYm1fcnRyZWUsIGxpc3QpOwotCWlmICgmYm0tPmN1ci56b25lLT5saXN0ICE9ICZibS0+em9uZXMpIHsKIAkJYm0tPmN1ci5ub2RlID0gbGlzdF9lbnRyeShibS0+Y3VyLnpvbmUtPmxlYXZlcy5uZXh0LAogCQkJCQkgIHN0cnVjdCBydHJlZV9ub2RlLCBsaXN0KTsKIAkJYm0tPmN1ci5ub2RlX3BmbiA9IDA7CkBAIC0xMTMyLDYgKzExMzIsMjggQEAKIAlwcl9kZWJ1ZygiUE06IEJhc2ljIG1lbW9yeSBiaXRtYXBzIGZyZWVkXG4iKTsKIH0KIAordm9pZCBjbGVhcl9mcmVlX3BhZ2VzKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BBR0VfUE9JU09OSU5HX1pFUk8KKwlzdHJ1Y3QgbWVtb3J5X2JpdG1hcCAqYm0gPSBmcmVlX3BhZ2VzX21hcDsKKwl1bnNpZ25lZCBsb25nIHBmbjsKKworCWlmIChXQVJOX09OKCEoZnJlZV9wYWdlc19tYXApKSkKKwkJcmV0dXJuOworCisJbWVtb3J5X2JtX3Bvc2l0aW9uX3Jlc2V0KGJtKTsKKwlwZm4gPSBtZW1vcnlfYm1fbmV4dF9wZm4oYm0pOworCXdoaWxlIChwZm4gIT0gQk1fRU5EX09GX01BUCkgeworCQlpZiAocGZuX3ZhbGlkKHBmbikpCisJCQljbGVhcl9oaWdocGFnZShwZm5fdG9fcGFnZShwZm4pKTsKKworCQlwZm4gPSBtZW1vcnlfYm1fbmV4dF9wZm4oYm0pOworCX0KKwltZW1vcnlfYm1fcG9zaXRpb25fcmVzZXQoYm0pOworCXByX2luZm8oIlBNOiBmcmVlIHBhZ2VzIGNsZWFyZWQgYWZ0ZXIgcmVzdG9yZVxuIik7CisjZW5kaWYgLyogUEFHRV9QT0lTT05JTkdfWkVSTyAqLworfQorCiAvKioKICAqIHNuYXBzaG90X2FkZGl0aW9uYWxfcGFnZXMgLSBFc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIGV4dHJhIHBhZ2VzIG5lZWRlZC4KICAqIEB6b25lOiBNZW1vcnkgem9uZSB0byBjYXJyeSBvdXQgdGhlIGNvbXB1dGF0aW9uIGZvci4KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMgYi9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jCmluZGV4IDBhY2FiOWQuLjFlN2Y1ZGEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMKKysrIGIva2VybmVsL3Bvd2VyL3N1c3BlbmQuYwpAQCAtMTE4LDEwICsxMTgsMTggQEAKICAqLwogc3RhdGljIGJvb2wgcmVsYXRpdmVfc3RhdGVzOwogCit2b2lkIF9faW5pdCBwbV9zdGF0ZXNfaW5pdCh2b2lkKQoreworCS8qCisJICogZnJlZXplIHN0YXRlIHNob3VsZCBiZSBzdXBwb3J0ZWQgZXZlbiB3aXRob3V0IGFueSBzdXNwZW5kX29wcywKKwkgKiBpbml0aWFsaXplIHBtX3N0YXRlcyBhY2NvcmRpbmdseSBoZXJlCisJICovCisJcG1fc3RhdGVzW1BNX1NVU1BFTkRfRlJFRVpFXSA9IHBtX2xhYmVsc1tyZWxhdGl2ZV9zdGF0ZXMgPyAwIDogMl07Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IHNsZWVwX3N0YXRlc19zZXR1cChjaGFyICpzdHIpCiB7CiAJcmVsYXRpdmVfc3RhdGVzID0gIXN0cm5jbXAoc3RyLCAiMSIsIDEpOwotCXBtX3N0YXRlc1tQTV9TVVNQRU5EX0ZSRUVaRV0gPSBwbV9sYWJlbHNbcmVsYXRpdmVfc3RhdGVzID8gMCA6IDJdOwogCXJldHVybiAxOwogfQogCkBAIC0yMTEsNyArMjE5LDcgQEAKIHsKIAlpZiAoc3RhdGUgPT0gUE1fU1VTUEVORF9GUkVFWkUgJiYgZnJlZXplX29wcyAmJiBmcmVlemVfb3BzLT5iZWdpbikKIAkJcmV0dXJuIGZyZWV6ZV9vcHMtPmJlZ2luKCk7Ci0JZWxzZSBpZiAoc3VzcGVuZF9vcHMtPmJlZ2luKQorCWVsc2UgaWYgKHN1c3BlbmRfb3BzICYmIHN1c3BlbmRfb3BzLT5iZWdpbikKIAkJcmV0dXJuIHN1c3BlbmRfb3BzLT5iZWdpbihzdGF0ZSk7CiAJZWxzZQogCQlyZXR1cm4gMDsKQEAgLTIyMSw3ICsyMjksNyBAQAogewogCWlmIChzdGF0ZSA9PSBQTV9TVVNQRU5EX0ZSRUVaRSAmJiBmcmVlemVfb3BzICYmIGZyZWV6ZV9vcHMtPmVuZCkKIAkJZnJlZXplX29wcy0+ZW5kKCk7Ci0JZWxzZSBpZiAoc3VzcGVuZF9vcHMtPmVuZCkKKwllbHNlIGlmIChzdXNwZW5kX29wcyAmJiBzdXNwZW5kX29wcy0+ZW5kKQogCQlzdXNwZW5kX29wcy0+ZW5kKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcmludGsvYnJhaWxsZS5jIGIva2VybmVsL3ByaW50ay9icmFpbGxlLmMKaW5kZXggMjc2NzYyZi4uZDU3NjBjNCAxMDA2NDQKLS0tIGEva2VybmVsL3ByaW50ay9icmFpbGxlLmMKKysrIGIva2VybmVsL3ByaW50ay9icmFpbGxlLmMKQEAgLTksMTAgKzksMTAgQEAKIAogY2hhciAqX2JyYWlsbGVfY29uc29sZV9zZXR1cChjaGFyICoqc3RyLCBjaGFyICoqYnJsX29wdGlvbnMpCiB7Ci0JaWYgKCFtZW1jbXAoKnN0ciwgImJybCwiLCA0KSkgeworCWlmICghc3RybmNtcCgqc3RyLCAiYnJsLCIsIDQpKSB7CiAJCSpicmxfb3B0aW9ucyA9ICIiOwogCQkqc3RyICs9IDQ7Ci0JfSBlbHNlIGlmICghbWVtY21wKHN0ciwgImJybD0iLCA0KSkgeworCX0gZWxzZSBpZiAoIXN0cm5jbXAoKnN0ciwgImJybD0iLCA0KSkgewogCQkqYnJsX29wdGlvbnMgPSAqc3RyICsgNDsKIAkJKnN0ciA9IHN0cmNocigqYnJsX29wdGlvbnMsICcsJyk7CiAJCWlmICghKnN0cikKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcmludGsvbm1pLmMgYi9rZXJuZWwvcHJpbnRrL25taS5jCmluZGV4IGI2OWViOGEuLjE2YmFiNDcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wcmludGsvbm1pLmMKKysrIGIva2VybmVsL3ByaW50ay9ubWkuYwpAQCAtOTksMjcgKzk5LDMzIEBACiAJcmV0dXJuIGFkZDsKIH0KIAotLyoKLSAqIHByaW50ayBvbmUgbGluZSBmcm9tIHRoZSB0ZW1wb3JhcnkgYnVmZmVyIGZyb20gQHN0YXJ0IGluZGV4IHVudGlsCi0gKiBhbmQgaW5jbHVkaW5nIHRoZSBAZW5kIGluZGV4LgotICovCi1zdGF0aWMgdm9pZCBwcmludF9ubWlfc2VxX2xpbmUoc3RydWN0IG5taV9zZXFfYnVmICpzLCBpbnQgc3RhcnQsIGludCBlbmQpCitzdGF0aWMgdm9pZCBwcmludGtfbm1pX2ZsdXNoX2xpbmUoY29uc3QgY2hhciAqdGV4dCwgaW50IGxlbikKIHsKLQljb25zdCBjaGFyICpidWYgPSBzLT5idWZmZXIgKyBzdGFydDsKLQogCS8qCiAJICogVGhlIGJ1ZmZlcnMgYXJlIGZsdXNoZWQgaW4gTk1JIG9ubHkgb24gcGFuaWMuICBUaGUgbWVzc2FnZXMgbXVzdAogCSAqIGdvIG9ubHkgaW50byB0aGUgcmluZyBidWZmZXIgYXQgdGhpcyBzdGFnZS4gIENvbnNvbGVzIHdpbGwgZ2V0CiAJICogZXhwbGljaXRseSBjYWxsZWQgbGF0ZXIgd2hlbiBhIGNyYXNoZHVtcCBpcyBub3QgZ2VuZXJhdGVkLgogCSAqLwogCWlmIChpbl9ubWkoKSkKLQkJcHJpbnRrX2RlZmVycmVkKCIlLipzIiwgKGVuZCAtIHN0YXJ0KSArIDEsIGJ1Zik7CisJCXByaW50a19kZWZlcnJlZCgiJS4qcyIsIGxlbiwgdGV4dCk7CiAJZWxzZQotCQlwcmludGsoIiUuKnMiLCAoZW5kIC0gc3RhcnQpICsgMSwgYnVmKTsKKwkJcHJpbnRrKCIlLipzIiwgbGVuLCB0ZXh0KTsKIAogfQogCiAvKgorICogcHJpbnRrIG9uZSBsaW5lIGZyb20gdGhlIHRlbXBvcmFyeSBidWZmZXIgZnJvbSBAc3RhcnQgaW5kZXggdW50aWwKKyAqIGFuZCBpbmNsdWRpbmcgdGhlIEBlbmQgaW5kZXguCisgKi8KK3N0YXRpYyB2b2lkIHByaW50a19ubWlfZmx1c2hfc2VxX2xpbmUoc3RydWN0IG5taV9zZXFfYnVmICpzLAorCQkJCQlpbnQgc3RhcnQsIGludCBlbmQpCit7CisJY29uc3QgY2hhciAqYnVmID0gcy0+YnVmZmVyICsgc3RhcnQ7CisKKwlwcmludGtfbm1pX2ZsdXNoX2xpbmUoYnVmLCAoZW5kIC0gc3RhcnQpICsgMSk7Cit9CisKKy8qCiAgKiBGbHVzaCBkYXRhIGZyb20gdGhlIGFzc29jaWF0ZWQgcGVyX0NQVSBidWZmZXIuIFRoZSBmdW5jdGlvbgogICogY2FuIGJlIGNhbGxlZCBlaXRoZXIgdmlhIElSUSB3b3JrIG9yIGluZGVwZW5kZW50bHkuCiAgKi8KQEAgLTE1MCw5ICsxNTYsMTEgQEAKIAkgKiB0aGUgYnVmZmVyIGFuIHVuZXhwZWN0ZWQgd2F5LiBJZiB3ZSBwcmludGVkIHNvbWV0aGluZyB0aGVuCiAJICogQGxlbiBtdXN0IG9ubHkgaW5jcmVhc2UuCiAJICovCi0JaWYgKGkgJiYgaSA+PSBsZW4pCi0JCXByX2VycigicHJpbnRrX25taV9mbHVzaDogaW50ZXJuYWwgZXJyb3I6IGk9JWQgPj0gbGVuPSV6dVxuIiwKLQkJICAgICAgIGksIGxlbik7CisJaWYgKGkgJiYgaSA+PSBsZW4pIHsKKwkJY29uc3QgY2hhciAqbXNnID0gInByaW50a19ubWlfZmx1c2g6IGludGVybmFsIGVycm9yXG4iOworCisJCXByaW50a19ubWlfZmx1c2hfbGluZShtc2csIHN0cmxlbihtc2cpKTsKKwl9CiAKIAlpZiAoIWxlbikKIAkJZ290byBvdXQ7IC8qIFNvbWVvbmUgZWxzZSBoYXMgYWxyZWFkeSBmbHVzaGVkIHRoZSBidWZmZXIuICovCkBAIC0xNjYsMTQgKzE3NCwxNCBAQAogCS8qIFByaW50IGxpbmUgYnkgbGluZS4gKi8KIAlmb3IgKDsgaSA8IHNpemU7IGkrKykgewogCQlpZiAocy0+YnVmZmVyW2ldID09ICdcbicpIHsKLQkJCXByaW50X25taV9zZXFfbGluZShzLCBsYXN0X2ksIGkpOworCQkJcHJpbnRrX25taV9mbHVzaF9zZXFfbGluZShzLCBsYXN0X2ksIGkpOwogCQkJbGFzdF9pID0gaSArIDE7CiAJCX0KIAl9CiAJLyogQ2hlY2sgaWYgdGhlcmUgd2FzIGEgcGFydGlhbCBsaW5lLiAqLwogCWlmIChsYXN0X2kgPCBzaXplKSB7Ci0JCXByaW50X25taV9zZXFfbGluZShzLCBsYXN0X2ksIHNpemUgLSAxKTsKLQkJcHJfY29udCgiXG4iKTsKKwkJcHJpbnRrX25taV9mbHVzaF9zZXFfbGluZShzLCBsYXN0X2ksIHNpemUgLSAxKTsKKwkJcHJpbnRrX25taV9mbHVzaF9saW5lKCJcbiIsIHN0cmxlbigiXG4iKSk7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvcmN1cGVyZi5jIGIva2VybmVsL3JjdS9yY3VwZXJmLmMKaW5kZXggZDM4YWIwOC4uMTIzY2NiZCAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS9yY3VwZXJmLmMKKysrIGIva2VybmVsL3JjdS9yY3VwZXJmLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAogI2RlZmluZSBQRVJGX0ZMQUcgIi1wZXJmOiIKICNkZWZpbmUgUEVSRk9VVF9TVFJJTkcocykgXAotCXByX2FsZXJ0KCIlcyIgUEVSRl9GTEFHIHMgIlxuIiwgcGVyZl90eXBlKQorCXByX2FsZXJ0KCIlcyIgUEVSRl9GTEFHICIgJXNcbiIsIHBlcmZfdHlwZSwgcykKICNkZWZpbmUgVkVSQk9TRV9QRVJGT1VUX1NUUklORyhzKSBcCiAJZG8geyBpZiAodmVyYm9zZSkgcHJfYWxlcnQoIiVzIiBQRVJGX0ZMQUcgIiAlc1xuIiwgcGVyZl90eXBlLCBzKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgVkVSQk9TRV9QRVJGT1VUX0VSUlNUUklORyhzKSBcCkBAIC00MDAsOSArNDAwLDggQEAKIAkJCXNwLnNjaGVkX3ByaW9yaXR5ID0gMDsKIAkJCXNjaGVkX3NldHNjaGVkdWxlcl9ub2NoZWNrKGN1cnJlbnQsCiAJCQkJCQkgICBTQ0hFRF9OT1JNQUwsICZzcCk7Ci0JCQlwcl9hbGVydCgiJXMiIFBFUkZfRkxBRwotCQkJCSAicmN1X3BlcmZfd3JpdGVyICVsZCBoYXMgJWQgbWVhc3VyZW1lbnRzXG4iLAotCQkJCSBwZXJmX3R5cGUsIG1lLCBNSU5fTUVBUyk7CisJCQlwcl9hbGVydCgiJXMlcyByY3VfcGVyZl93cml0ZXIgJWxkIGhhcyAlZCBtZWFzdXJlbWVudHNcbiIsCisJCQkJIHBlcmZfdHlwZSwgUEVSRl9GTEFHLCBtZSwgTUlOX01FQVMpOwogCQkJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZuX3JjdV9wZXJmX3dyaXRlcl9maW5pc2hlZCkgPj0KIAkJCSAgICBucmVhbHdyaXRlcnMpIHsKIAkJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMTApOwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS9yY3V0b3J0dXJlLmMgYi9rZXJuZWwvcmN1L3JjdXRvcnR1cmUuYwppbmRleCA5NzFlMmIxLi5iZjA4ZmVlIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1L3JjdXRvcnR1cmUuYworKysgYi9rZXJuZWwvcmN1L3JjdXRvcnR1cmUuYwpAQCAtMTIzOCw2ICsxMjM4LDcgQEAKIAlsb25nIHBpcGVzdW1tYXJ5W1JDVV9UT1JUVVJFX1BJUEVfTEVOICsgMV0gPSB7IDAgfTsKIAlsb25nIGJhdGNoc3VtbWFyeVtSQ1VfVE9SVFVSRV9QSVBFX0xFTiArIDFdID0geyAwIH07CiAJc3RhdGljIHVuc2lnbmVkIGxvbmcgcnRjdl9zbmFwID0gVUxPTkdfTUFYOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqd3RwOwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewogCQlmb3IgKGkgPSAwOyBpIDwgUkNVX1RPUlRVUkVfUElQRV9MRU4gKyAxOyBpKyspIHsKQEAgLTEyNTgsOCArMTI1OSw5IEBACiAJCWF0b21pY19yZWFkKCZuX3JjdV90b3J0dXJlX2FsbG9jKSwKIAkJYXRvbWljX3JlYWQoJm5fcmN1X3RvcnR1cmVfYWxsb2NfZmFpbCksCiAJCWF0b21pY19yZWFkKCZuX3JjdV90b3J0dXJlX2ZyZWUpKTsKLQlwcl9jb250KCJydG1iZTogJWQgcnRia2U6ICVsZCBydGJyZTogJWxkICIsCisJcHJfY29udCgicnRtYmU6ICVkIHJ0YmU6ICVsZCBydGJrZTogJWxkIHJ0YnJlOiAlbGQgIiwKIAkJYXRvbWljX3JlYWQoJm5fcmN1X3RvcnR1cmVfbWJlcnJvciksCisJCW5fcmN1X3RvcnR1cmVfYmFycmllcl9lcnJvciwKIAkJbl9yY3VfdG9ydHVyZV9ib29zdF9rdHJlcnJvciwKIAkJbl9yY3VfdG9ydHVyZV9ib29zdF9ydGVycm9yKTsKIAlwcl9jb250KCJydGJmOiAlbGQgcnRiOiAlbGQgbnQ6ICVsZCAiLApAQCAtMTMxMiwxMCArMTMxNCwxMiBAQAogCiAJCXJjdXRvcnR1cmVfZ2V0X2dwX2RhdGEoY3VyX29wcy0+dHR5cGUsCiAJCQkJICAgICAgICZmbGFncywgJmdwbnVtLCAmY29tcGxldGVkKTsKLQkJcHJfYWxlcnQoIj8/PyBXcml0ZXIgc3RhbGwgc3RhdGUgJXMoJWQpIGclbHUgYyVsdSBmJSN4XG4iLAorCQl3dHAgPSBSRUFEX09OQ0Uod3JpdGVyX3Rhc2spOworCQlwcl9hbGVydCgiPz8/IFdyaXRlciBzdGFsbCBzdGF0ZSAlcyglZCkgZyVsdSBjJWx1IGYlI3ggLT5zdGF0ZSAlI2x4XG4iLAogCQkJIHJjdV90b3J0dXJlX3dyaXRlcl9zdGF0ZV9nZXRuYW1lKCksCiAJCQkgcmN1X3RvcnR1cmVfd3JpdGVyX3N0YXRlLAotCQkJIGdwbnVtLCBjb21wbGV0ZWQsIGZsYWdzKTsKKwkJCSBncG51bSwgY29tcGxldGVkLCBmbGFncywKKwkJCSB3dHAgPT0gTlVMTCA/IH4wVUwgOiB3dHAtPnN0YXRlKTsKIAkJc2hvd19yY3VfZ3Bfa3RocmVhZHMoKTsKIAkJcmN1X2Z0cmFjZV9kdW1wKERVTVBfQUxMKTsKIAl9CkBAIC0xMzYyLDEyICsxMzY2LDEyIEBACiAJCSBvbm9mZl9pbnRlcnZhbCwgb25vZmZfaG9sZG9mZik7CiB9CiAKLXN0YXRpYyB2b2lkIHJjdXRvcnR1cmVfYm9vc3Rlcl9jbGVhbnVwKGludCBjcHUpCitzdGF0aWMgaW50IHJjdXRvcnR1cmVfYm9vc3Rlcl9jbGVhbnVwKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0OwogCiAJaWYgKGJvb3N0X3Rhc2tzW2NwdV0gPT0gTlVMTCkKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAltdXRleF9sb2NrKCZib29zdF9tdXRleCk7CiAJdCA9IGJvb3N0X3Rhc2tzW2NwdV07CiAJYm9vc3RfdGFza3NbY3B1XSA9IE5VTEw7CkBAIC0xMzc1LDkgKzEzNzksMTAgQEAKIAogCS8qIFRoaXMgbXVzdCBiZSBvdXRzaWRlIG9mIHRoZSBtdXRleCwgb3RoZXJ3aXNlIGRlYWRsb2NrISAqLwogCXRvcnR1cmVfc3RvcF9rdGhyZWFkKHJjdV90b3J0dXJlX2Jvb3N0LCB0KTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByY3V0b3J0dXJlX2Jvb3N0ZXJfaW5pdChpbnQgY3B1KQorc3RhdGljIGludCByY3V0b3J0dXJlX2Jvb3N0ZXJfaW5pdCh1bnNpZ25lZCBpbnQgY3B1KQogewogCWludCByZXR2YWw7CiAKQEAgLTE1NzcsMjggKzE1ODIsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCByY3V0b3J0dXJlX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAotCQkJCSB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKLXsKLQlsb25nIGNwdSA9IChsb25nKWhjcHU7Ci0KLQlzd2l0Y2ggKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgotCQkodm9pZClyY3V0b3J0dXJlX2Jvb3N0ZXJfaW5pdChjcHUpOwotCQlicmVhazsKLQljYXNlIENQVV9ET1dOX1BSRVBBUkU6Ci0JCXJjdXRvcnR1cmVfYm9vc3Rlcl9jbGVhbnVwKGNwdSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gTk9USUZZX09LOwotfQotCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHJjdXRvcnR1cmVfY3B1X25iID0gewotCS5ub3RpZmllcl9jYWxsID0gcmN1dG9ydHVyZV9jcHVfbm90aWZ5LAotfTsKK3N0YXRpYyBlbnVtIGNwdWhwX3N0YXRlIHJjdXRvcl9ocDsKIAogc3RhdGljIHZvaWQKIHJjdV90b3J0dXJlX2NsZWFudXAodm9pZCkKQEAgLTE2MzgsMTEgKzE2MjIsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBuY2JmbG9vZGVyczsgaSsrKQogCQl0b3J0dXJlX3N0b3Bfa3RocmVhZChyY3VfdG9ydHVyZV9jYmZsb29kLCBjYmZsb29kX3Rhc2tbaV0pOwogCWlmICgodGVzdF9ib29zdCA9PSAxICYmIGN1cl9vcHMtPmNhbl9ib29zdCkgfHwKLQkgICAgdGVzdF9ib29zdCA9PSAyKSB7Ci0JCXVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZyY3V0b3J0dXJlX2NwdV9uYik7Ci0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQotCQkJcmN1dG9ydHVyZV9ib29zdGVyX2NsZWFudXAoaSk7Ci0JfQorCSAgICB0ZXN0X2Jvb3N0ID09IDIpCisJCWNwdWhwX3JlbW92ZV9zdGF0ZShyY3V0b3JfaHApOwogCiAJLyoKIAkgKiBXYWl0IGZvciBhbGwgUkNVIGNhbGxiYWNrcyB0byBmaXJlLCB0aGVuIGRvIGZsYXZvci1zcGVjaWZpYwpAQCAtMTg2OSwxNCArMTg1MCwxMyBAQAogCSAgICB0ZXN0X2Jvb3N0ID09IDIpIHsKIAogCQlib29zdF9zdGFydHRpbWUgPSBqaWZmaWVzICsgdGVzdF9ib29zdF9pbnRlcnZhbCAqIEhaOwotCQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnJjdXRvcnR1cmVfY3B1X25iKTsKLQkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJCWlmIChjcHVfaXNfb2ZmbGluZShpKSkKLQkJCQljb250aW51ZTsgIC8qIEhldXJpc3RpYzogQ1BVIGNhbiBnbyBvZmZsaW5lLiAqLwotCQkJZmlyc3RlcnIgPSByY3V0b3J0dXJlX2Jvb3N0ZXJfaW5pdChpKTsKLQkJCWlmIChmaXJzdGVycikKLQkJCQlnb3RvIHVud2luZDsKLQkJfQorCisJCWZpcnN0ZXJyID0gY3B1aHBfc2V0dXBfc3RhdGUoQ1BVSFBfQVBfT05MSU5FX0RZTiwgIlJDVV9UT1JUVVJFIiwKKwkJCQkJICAgICByY3V0b3J0dXJlX2Jvb3N0ZXJfaW5pdCwKKwkJCQkJICAgICByY3V0b3J0dXJlX2Jvb3N0ZXJfY2xlYW51cCk7CisJCWlmIChmaXJzdGVyciA8IDApCisJCQlnb3RvIHVud2luZDsKKwkJcmN1dG9yX2hwID0gZmlyc3RlcnI7CiAJfQogCWZpcnN0ZXJyID0gdG9ydHVyZV9zaHV0ZG93bl9pbml0KHNodXRkb3duX3NlY3MsIHJjdV90b3J0dXJlX2NsZWFudXApOwogCWlmIChmaXJzdGVycikKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3Uvc3luYy5jIGIva2VybmVsL3JjdS9zeW5jLmMKaW5kZXggYmU5MjJjOS4uNTBkMTg2MSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS9zeW5jLmMKKysrIGIva2VybmVsL3JjdS9zeW5jLmMKQEAgLTY4LDYgKzY4LDggQEAKIAlSQ1VfTE9DS0RFUF9XQVJOKCFncF9vcHNbcnNwLT5ncF90eXBlXS5oZWxkKCksCiAJCQkgInN1c3BpY2lvdXMgcmN1X3N5bmNfaXNfaWRsZSgpIHVzYWdlIik7CiB9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHJjdV9zeW5jX2xvY2tkZXBfYXNzZXJ0KTsKICNlbmRpZgogCiAvKioKQEAgLTgzLDYgKzg1LDE4IEBACiB9CiAKIC8qKgorICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgcmN1X3N5bmNfaW5pdCgpIGFuZCBiZWZvcmUgZmlyc3QgdXNlLgorICoKKyAqIEVuc3VyZXMgcmN1X3N5bmNfaXNfaWRsZSgpIHJldHVybnMgZmFsc2UgYW5kIHJjdV9zeW5jX3tlbnRlcixleGl0fSgpCisgKiBwYWlycyB0dXJuIGludG8gTk8tT1BzLgorICovCit2b2lkIHJjdV9zeW5jX2VudGVyX3N0YXJ0KHN0cnVjdCByY3Vfc3luYyAqcnNwKQoreworCXJzcC0+Z3BfY291bnQrKzsKKwlyc3AtPmdwX3N0YXRlID0gR1BfUEFTU0VEOworfQorCisvKioKICAqIHJjdV9zeW5jX2VudGVyKCkgLSBGb3JjZSByZWFkZXJzIG9udG8gc2xvd3BhdGgKICAqIEByc3A6IFBvaW50ZXIgdG8gcmN1X3N5bmMgc3RydWN0dXJlIHRvIHVzZSBmb3Igc3luY2hyb25pemF0aW9uCiAgKgpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS90cmVlLmMgYi9rZXJuZWwvcmN1L3RyZWUuYwppbmRleCA1ZDgwOTI1Li43ZTJlMDM4IDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1L3RyZWUuYworKysgYi9rZXJuZWwvcmN1L3RyZWUuYwpAQCAtNDEsNyArNDEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CkBAIC02MCw3ICs1OSw2IEBACiAjaW5jbHVkZSAidHJlZS5oIgogI2luY2x1ZGUgInJjdS5oIgogCi1NT0RVTEVfQUxJQVMoInJjdXRyZWUiKTsKICNpZmRlZiBNT0RVTEVfUEFSQU1fUFJFRklYCiAjdW5kZWYgTU9EVUxFX1BBUkFNX1BSRUZJWAogI2VuZGlmCkBAIC0xODQ4LDYgKzE4NDYsNyBAQAogCQkJICAgICAgc3RydWN0IHJjdV9kYXRhICpyZHApCiB7CiAJYm9vbCByZXQ7CisJYm9vbCBuZWVkX2dwOwogCiAJLyogSGFuZGxlIHRoZSBlbmRzIG9mIGFueSBwcmVjZWRpbmcgZ3JhY2UgcGVyaW9kcyBmaXJzdC4gKi8KIAlpZiAocmRwLT5jb21wbGV0ZWQgPT0gcm5wLT5jb21wbGV0ZWQgJiYKQEAgLTE4NzQsOSArMTg3MywxMCBAQAogCQkgKi8KIAkJcmRwLT5ncG51bSA9IHJucC0+Z3BudW07CiAJCXRyYWNlX3JjdV9ncmFjZV9wZXJpb2QocnNwLT5uYW1lLCByZHAtPmdwbnVtLCBUUFMoImNwdXN0YXJ0IikpOwotCQlyZHAtPmNwdV9ub19xcy5iLm5vcm0gPSB0cnVlOworCQluZWVkX2dwID0gISEocm5wLT5xc21hc2sgJiByZHAtPmdycG1hc2spOworCQlyZHAtPmNwdV9ub19xcy5iLm5vcm0gPSBuZWVkX2dwOwogCQlyZHAtPnJjdV9xc19jdHJfc25hcCA9IF9fdGhpc19jcHVfcmVhZChyY3VfcXNfY3RyKTsKLQkJcmRwLT5jb3JlX25lZWRzX3FzID0gISEocm5wLT5xc21hc2sgJiByZHAtPmdycG1hc2spOworCQlyZHAtPmNvcmVfbmVlZHNfcXMgPSBuZWVkX2dwOwogCQl6ZXJvX2NwdV9zdGFsbF90aWNrcyhyZHApOwogCQlXUklURV9PTkNFKHJkcC0+Z3B3cmFwLCBmYWxzZSk7CiAJfQpAQCAtMjM0NCw3ICsyMzQ0LDcgQEAKIAlXQVJOX09OX09OQ0UoIXJjdV9ncF9pbl9wcm9ncmVzcyhyc3ApKTsKIAlXUklURV9PTkNFKHJzcC0+Z3BfZmxhZ3MsIFJFQURfT05DRShyc3AtPmdwX2ZsYWdzKSB8IFJDVV9HUF9GTEFHX0ZRUyk7CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmVfcmN1X25vZGUocmN1X2dldF9yb290KHJzcCksIGZsYWdzKTsKLQlzd2FrZV91cCgmcnNwLT5ncF93cSk7ICAvKiBNZW1vcnkgYmFycmllciBpbXBsaWVkIGJ5IHN3YWtlX3VwKCkgcGF0aC4gKi8KKwlyY3VfZ3Bfa3RocmVhZF93YWtlKHJzcCk7CiB9CiAKIC8qCkBAIC0yOTcwLDcgKzI5NzAsNyBAQAogCX0KIAlXUklURV9PTkNFKHJzcC0+Z3BfZmxhZ3MsIFJFQURfT05DRShyc3AtPmdwX2ZsYWdzKSB8IFJDVV9HUF9GTEFHX0ZRUyk7CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmVfcmN1X25vZGUocm5wX29sZCwgZmxhZ3MpOwotCXN3YWtlX3VwKCZyc3AtPmdwX3dxKTsgLyogTWVtb3J5IGJhcnJpZXIgaW1wbGllZCBieSBzd2FrZV91cCgpIHBhdGguICovCisJcmN1X2dwX2t0aHJlYWRfd2FrZShyc3ApOwogfQogCiAvKgpAQCAtMzc5Miw4ICszNzkyLDYgQEAKIAlybnAgPSByZHAtPm15bm9kZTsKIAltYXNrID0gcmRwLT5ncnBtYXNrOwogCXJhd19zcGluX2xvY2tfcmN1X25vZGUocm5wKTsJCS8qIGlycXMgYWxyZWFkeSBkaXNhYmxlZC4gKi8KLQlybnAtPnFzbWFza2luaXRuZXh0IHw9IG1hc2s7Ci0Jcm5wLT5leHBtYXNraW5pdG5leHQgfD0gbWFzazsKIAlpZiAoIXJkcC0+YmVlbm9ubGluZSkKIAkJV1JJVEVfT05DRShyc3AtPm5jcHVzLCBSRUFEX09OQ0UocnNwLT5uY3B1cykgKyAxKTsKIAlyZHAtPmJlZW5vbmxpbmUgPSB0cnVlOwkgLyogV2UgaGF2ZSBub3cgYmVlbiBvbmxpbmUuICovCkBAIC0zODYwLDYgKzM4NTgsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIE1hcmsgdGhlIHNwZWNpZmllZCBDUFUgYXMgYmVpbmcgb25saW5lIHNvIHRoYXQgc3Vic2VxdWVudCBncmFjZSBwZXJpb2RzCisgKiAoYm90aCBleHBlZGl0ZWQgYW5kIG5vcm1hbCkgd2lsbCB3YWl0IG9uIGl0LiAgTm90ZSB0aGF0IHRoaXMgbWVhbnMgdGhhdAorICogaW5jb21pbmcgQ1BVcyBhcmUgbm90IGFsbG93ZWQgdG8gdXNlIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMKKyAqIHVudGlsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAgRmFpbGluZyB0byBvYnNlcnZlIHRoaXMgcmVzdHJpY3Rpb24KKyAqIHdpbGwgcmVzdWx0IGluIGxvY2tkZXAgc3BsYXRzLgorICovCit2b2lkIHJjdV9jcHVfc3RhcnRpbmcodW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwlzdHJ1Y3QgcmN1X2RhdGEgKnJkcDsKKwlzdHJ1Y3QgcmN1X25vZGUgKnJucDsKKwlzdHJ1Y3QgcmN1X3N0YXRlICpyc3A7CisKKwlmb3JfZWFjaF9yY3VfZmxhdm9yKHJzcCkgeworCQlyZHAgPSB0aGlzX2NwdV9wdHIocnNwLT5yZGEpOworCQlybnAgPSByZHAtPm15bm9kZTsKKwkJbWFzayA9IHJkcC0+Z3JwbWFzazsKKwkJcmF3X3NwaW5fbG9ja19pcnFzYXZlX3JjdV9ub2RlKHJucCwgZmxhZ3MpOworCQlybnAtPnFzbWFza2luaXRuZXh0IHw9IG1hc2s7CisJCXJucC0+ZXhwbWFza2luaXRuZXh0IHw9IG1hc2s7CisJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlX3JjdV9ub2RlKHJucCwgZmxhZ3MpOworCX0KK30KKwogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogLyoKICAqIFRoZSBDUFUgaXMgZXhpdGluZyB0aGUgaWRsZSBsb29wIGludG8gdGhlIGFyY2hfY3B1X2lkbGVfZGVhZCgpCkBAIC00MjA5LDggKzQyMzMsMTAgQEAKIAkgKiBvciB0aGUgc2NoZWR1bGVyIGFyZSBvcGVyYXRpb25hbC4KIAkgKi8KIAlwbV9ub3RpZmllcihyY3VfcG1fbm90aWZ5LCAwKTsKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQlyY3V0cmVlX3ByZXBhcmVfY3B1KGNwdSk7CisJCXJjdV9jcHVfc3RhcnRpbmcoY3B1KTsKKwl9CiB9CiAKICNpbmNsdWRlICJ0cmVlX2V4cC5oIgpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS90cmVlLmggYi9rZXJuZWwvcmN1L3RyZWUuaAppbmRleCBmNzE0Zjg3Li5lOTlhNTIzIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1L3RyZWUuaAorKysgYi9rZXJuZWwvcmN1L3RyZWUuaApAQCAtNDAwLDYgKzQwMCw3IEBACiAjaWZkZWYgQ09ORklHX1JDVV9GQVNUX05PX0haCiAJc3RydWN0IHJjdV9oZWFkIG9vbV9oZWFkOwogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0ZBU1RfTk9fSFogKi8KKwlhdG9taWNfbG9uZ190IGV4cF93b3JrZG9uZTA7CS8qICMgZG9uZSBieSB3b3JrcXVldWUuICovCiAJYXRvbWljX2xvbmdfdCBleHBfd29ya2RvbmUxOwkvKiAjIGRvbmUgYnkgb3RoZXJzICMxLiAqLwogCWF0b21pY19sb25nX3QgZXhwX3dvcmtkb25lMjsJLyogIyBkb25lIGJ5IG90aGVycyAjMi4gKi8KIAlhdG9taWNfbG9uZ190IGV4cF93b3JrZG9uZTM7CS8qICMgZG9uZSBieSBvdGhlcnMgIzMuICovCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3RyZWVfZXhwLmggYi9rZXJuZWwvcmN1L3RyZWVfZXhwLmgKaW5kZXggNmQ4NmFiNi4uMjQzNDNlYiAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90cmVlX2V4cC5oCisrKyBiL2tlcm5lbC9yY3UvdHJlZV9leHAuaApAQCAtMzU5LDcgKzM1OSw4IEBACiAJCQlzdHJ1Y3QgcmN1X2R5bnRpY2tzICpyZHRwID0gJnBlcl9jcHUocmN1X2R5bnRpY2tzLCBjcHUpOwogCiAJCQlpZiAocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSA9PSBjcHUgfHwKLQkJCSAgICAhKGF0b21pY19hZGRfcmV0dXJuKDAsICZyZHRwLT5keW50aWNrcykgJiAweDEpKQorCQkJICAgICEoYXRvbWljX2FkZF9yZXR1cm4oMCwgJnJkdHAtPmR5bnRpY2tzKSAmIDB4MSkgfHwKKwkJCSAgICAhKHJucC0+cXNtYXNraW5pdG5leHQgJiByZHAtPmdycG1hc2spKQogCQkJCW1hc2tfb2ZsX3Rlc3QgfD0gcmRwLT5ncnBtYXNrOwogCQl9CiAJCW1hc2tfb2ZsX2lwaSA9IHJucC0+ZXhwbWFzayAmIH5tYXNrX29mbF90ZXN0OwpAQCAtMzg0LDE3ICszODUsMTYgQEAKIAkJCQltYXNrX29mbF9pcGkgJj0gfm1hc2s7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQkvKiBGYWlsZWQsIHJhY2VkIHdpdGggb2ZmbGluZS4gKi8KKwkJCS8qIEZhaWxlZCwgcmFjZWQgd2l0aCBDUFUgaG90cGx1ZyBvcGVyYXRpb24uICovCiAJCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmVfcmN1X25vZGUocm5wLCBmbGFncyk7Ci0JCQlpZiAoY3B1X29ubGluZShjcHUpICYmCisJCQlpZiAoKHJucC0+cXNtYXNraW5pdG5leHQgJiBtYXNrKSAmJgogCQkJICAgIChybnAtPmV4cG1hc2sgJiBtYXNrKSkgeworCQkJCS8qIE9ubGluZSwgc28gZGVsYXkgZm9yIGEgYml0IGFuZCB0cnkgYWdhaW4uICovCiAJCQkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmVfcmN1X25vZGUocm5wLCBmbGFncyk7CiAJCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7Ci0JCQkJaWYgKGNwdV9vbmxpbmUoY3B1KSAmJgotCQkJCSAgICAocm5wLT5leHBtYXNrICYgbWFzaykpCi0JCQkJCWdvdG8gcmV0cnlfaXBpOwotCQkJCXJhd19zcGluX2xvY2tfaXJxc2F2ZV9yY3Vfbm9kZShybnAsIGZsYWdzKTsKKwkJCQlnb3RvIHJldHJ5X2lwaTsKIAkJCX0KKwkJCS8qIENQVSByZWFsbHkgaXMgb2ZmbGluZSwgc28gd2UgY2FuIGlnbm9yZSBpdC4gKi8KIAkJCWlmICghKHJucC0+ZXhwbWFzayAmIG1hc2spKQogCQkJCW1hc2tfb2ZsX2lwaSAmPSB+bWFzazsKIAkJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlX3JjdV9ub2RlKHJucCwgZmxhZ3MpOwpAQCAtNDI3LDEyICs0MjcsMTAgQEAKIAkJCQlqaWZmaWVzX3N0YWxsKTsKIAkJaWYgKHJldCA+IDAgfHwgc3luY19yY3VfcHJlZW1wdF9leHBfZG9uZShybnBfcm9vdCkpCiAJCQlyZXR1cm47Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQkvKiBIaXQgYSBzaWduYWwsIGRpc2FibGUgQ1BVIHN0YWxsIHdhcm5pbmdzLiAqLwotCQkJc3dhaXRfZXZlbnQocnNwLT5leHBlZGl0ZWRfd3EsCi0JCQkJICAgc3luY19yY3VfcHJlZW1wdF9leHBfZG9uZShybnBfcm9vdCkpOwotCQkJcmV0dXJuOwotCQl9CisJCVdBUk5fT04ocmV0IDwgMCk7ICAvKiB3b3JrcXVldWVzIHNob3VsZCBub3QgYmUgc2lnbmFsZWQuICovCisJCWlmIChyY3VfY3B1X3N0YWxsX3N1cHByZXNzKQorCQkJY29udGludWU7CisJCXBhbmljX29uX3JjdV9zdGFsbCgpOwogCQlwcl9lcnIoIklORk86ICVzIGRldGVjdGVkIGV4cGVkaXRlZCBzdGFsbHMgb24gQ1BVcy90YXNrczogeyIsCiAJCSAgICAgICByc3AtPm5hbWUpOwogCQluZGV0ZWN0ZWQgPSAwOwpAQCAtNTAwLDcgKzQ5OCw2IEBACiAJICogbmV4dCBHUCwgdG8gcHJvY2VlZC4KIAkgKi8KIAltdXRleF9sb2NrKCZyc3AtPmV4cF93YWtlX211dGV4KTsKLQltdXRleF91bmxvY2soJnJzcC0+ZXhwX211dGV4KTsKIAogCXJjdV9mb3JfZWFjaF9ub2RlX2JyZWFkdGhfZmlyc3QocnNwLCBybnApIHsKIAkJaWYgKFVMT05HX0NNUF9MVChSRUFEX09OQ0Uocm5wLT5leHBfc2VxX3JxKSwgcykpIHsKQEAgLTUxNiw2ICs1MTMsNzAgQEAKIAltdXRleF91bmxvY2soJnJzcC0+ZXhwX3dha2VfbXV0ZXgpOwogfQogCisvKiBMZXQgdGhlIHdvcmtxdWV1ZSBoYW5kbGVyIGtub3cgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby4gKi8KK3N0cnVjdCByY3VfZXhwX3dvcmsgeworCXNtcF9jYWxsX2Z1bmNfdCByZXdfZnVuYzsKKwlzdHJ1Y3QgcmN1X3N0YXRlICpyZXdfcnNwOworCXVuc2lnbmVkIGxvbmcgcmV3X3M7CisJc3RydWN0IHdvcmtfc3RydWN0IHJld193b3JrOworfTsKKworLyoKKyAqIFdvcmstcXVldWUgaGFuZGxlciB0byBkcml2ZSBhbiBleHBlZGl0ZWQgZ3JhY2UgcGVyaW9kIGZvcndhcmQuCisgKi8KK3N0YXRpYyB2b2lkIHdhaXRfcmN1X2V4cF9ncChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndwKQoreworCXN0cnVjdCByY3VfZXhwX3dvcmsgKnJld3A7CisKKwkvKiBJbml0aWFsaXplIHRoZSByY3Vfbm9kZSB0cmVlIGluIHByZXBhcmF0aW9uIGZvciB0aGUgd2FpdC4gKi8KKwlyZXdwID0gY29udGFpbmVyX29mKHdwLCBzdHJ1Y3QgcmN1X2V4cF93b3JrLCByZXdfd29yayk7CisJc3luY19yY3VfZXhwX3NlbGVjdF9jcHVzKHJld3AtPnJld19yc3AsIHJld3AtPnJld19mdW5jKTsKKworCS8qIFdhaXQgYW5kIGNsZWFuIHVwLCBpbmNsdWRpbmcgd2FraW5nIGV2ZXJ5b25lLiAqLworCXJjdV9leHBfd2FpdF93YWtlKHJld3AtPnJld19yc3AsIHJld3AtPnJld19zKTsKK30KKworLyoKKyAqIEdpdmVuIGFuIHJjdV9zdGF0ZSBwb2ludGVyIGFuZCBhIHNtcF9jYWxsX2Z1bmN0aW9uKCkgaGFuZGxlciwga2ljaworICogb2ZmIHRoZSBzcGVjaWZpZWQgZmxhdm9yIG9mIGV4cGVkaXRlZCBncmFjZSBwZXJpb2QuCisgKi8KK3N0YXRpYyB2b2lkIF9zeW5jaHJvbml6ZV9yY3VfZXhwZWRpdGVkKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwKKwkJCQkgICAgICAgc21wX2NhbGxfZnVuY190IGZ1bmMpCit7CisJc3RydWN0IHJjdV9kYXRhICpyZHA7CisJc3RydWN0IHJjdV9leHBfd29yayByZXc7CisJc3RydWN0IHJjdV9ub2RlICpybnA7CisJdW5zaWduZWQgbG9uZyBzOworCisJLyogSWYgZXhwZWRpdGVkIGdyYWNlIHBlcmlvZHMgYXJlIHByb2hpYml0ZWQsIGZhbGwgYmFjayB0byBub3JtYWwuICovCisJaWYgKHJjdV9ncF9pc19ub3JtYWwoKSkgeworCQl3YWl0X3JjdV9ncChyc3AtPmNhbGwpOworCQlyZXR1cm47CisJfQorCisJLyogVGFrZSBhIHNuYXBzaG90IG9mIHRoZSBzZXF1ZW5jZSBudW1iZXIuICAqLworCXMgPSByY3VfZXhwX2dwX3NlcV9zbmFwKHJzcCk7CisJaWYgKGV4cF9mdW5uZWxfbG9jayhyc3AsIHMpKQorCQlyZXR1cm47ICAvKiBTb21lb25lIGVsc2UgZGlkIG91ciB3b3JrIGZvciB1cy4gKi8KKworCS8qIE1hcnNoYWxsIGFyZ3VtZW50cyBhbmQgc2NoZWR1bGUgdGhlIGV4cGVkaXRlZCBncmFjZSBwZXJpb2QuICovCisJcmV3LnJld19mdW5jID0gZnVuYzsKKwlyZXcucmV3X3JzcCA9IHJzcDsKKwlyZXcucmV3X3MgPSBzOworCUlOSVRfV09SS19PTlNUQUNLKCZyZXcucmV3X3dvcmssIHdhaXRfcmN1X2V4cF9ncCk7CisJc2NoZWR1bGVfd29yaygmcmV3LnJld193b3JrKTsKKworCS8qIFdhaXQgZm9yIGV4cGVkaXRlZCBncmFjZSBwZXJpb2QgdG8gY29tcGxldGUuICovCisJcmRwID0gcGVyX2NwdV9wdHIocnNwLT5yZGEsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCXJucCA9IHJjdV9nZXRfcm9vdChyc3ApOworCXdhaXRfZXZlbnQocm5wLT5leHBfd3FbKHMgPj4gMSkgJiAweDNdLAorCQkgICBzeW5jX2V4cF93b3JrX2RvbmUocnNwLAorCQkJCSAgICAgICZyZHAtPmV4cF93b3JrZG9uZTAsIHMpKTsKKworCS8qIExldCB0aGUgbmV4dCBleHBlZGl0ZWQgZ3JhY2UgcGVyaW9kIHN0YXJ0LiAqLworCW11dGV4X3VubG9jaygmcnNwLT5leHBfbXV0ZXgpOworfQorCiAvKioKICAqIHN5bmNocm9uaXplX3NjaGVkX2V4cGVkaXRlZCAtIEJydXRlLWZvcmNlIFJDVS1zY2hlZCBncmFjZSBwZXJpb2QKICAqCkBAIC01MzQsMjkgKzU5NSwxMyBAQAogICovCiB2b2lkIHN5bmNocm9uaXplX3NjaGVkX2V4cGVkaXRlZCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgczsKIAlzdHJ1Y3QgcmN1X3N0YXRlICpyc3AgPSAmcmN1X3NjaGVkX3N0YXRlOwogCiAJLyogSWYgb25seSBvbmUgQ1BVLCB0aGlzIGlzIGF1dG9tYXRpY2FsbHkgYSBncmFjZSBwZXJpb2QuICovCiAJaWYgKHJjdV9ibG9ja2luZ19pc19ncCgpKQogCQlyZXR1cm47CiAKLQkvKiBJZiBleHBlZGl0ZWQgZ3JhY2UgcGVyaW9kcyBhcmUgcHJvaGliaXRlZCwgZmFsbCBiYWNrIHRvIG5vcm1hbC4gKi8KLQlpZiAocmN1X2dwX2lzX25vcm1hbCgpKSB7Ci0JCXdhaXRfcmN1X2dwKGNhbGxfcmN1X3NjaGVkKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFRha2UgYSBzbmFwc2hvdCBvZiB0aGUgc2VxdWVuY2UgbnVtYmVyLiAgKi8KLQlzID0gcmN1X2V4cF9ncF9zZXFfc25hcChyc3ApOwotCWlmIChleHBfZnVubmVsX2xvY2socnNwLCBzKSkKLQkJcmV0dXJuOyAgLyogU29tZW9uZSBlbHNlIGRpZCBvdXIgd29yayBmb3IgdXMuICovCi0KLQkvKiBJbml0aWFsaXplIHRoZSByY3Vfbm9kZSB0cmVlIGluIHByZXBhcmF0aW9uIGZvciB0aGUgd2FpdC4gKi8KLQlzeW5jX3JjdV9leHBfc2VsZWN0X2NwdXMocnNwLCBzeW5jX3NjaGVkX2V4cF9oYW5kbGVyKTsKLQotCS8qIFdhaXQgYW5kIGNsZWFuIHVwLCBpbmNsdWRpbmcgd2FraW5nIGV2ZXJ5b25lLiAqLwotCXJjdV9leHBfd2FpdF93YWtlKHJzcCwgcyk7CisJX3N5bmNocm9uaXplX3JjdV9leHBlZGl0ZWQocnNwLCBzeW5jX3NjaGVkX2V4cF9oYW5kbGVyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHN5bmNocm9uaXplX3NjaGVkX2V4cGVkaXRlZCk7CiAKQEAgLTYyMCwyMyArNjY1LDggQEAKIHZvaWQgc3luY2hyb25pemVfcmN1X2V4cGVkaXRlZCh2b2lkKQogewogCXN0cnVjdCByY3Vfc3RhdGUgKnJzcCA9IHJjdV9zdGF0ZV9wOwotCXVuc2lnbmVkIGxvbmcgczsKIAotCS8qIElmIGV4cGVkaXRlZCBncmFjZSBwZXJpb2RzIGFyZSBwcm9oaWJpdGVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsLiAqLwotCWlmIChyY3VfZ3BfaXNfbm9ybWFsKCkpIHsKLQkJd2FpdF9yY3VfZ3AoY2FsbF9yY3UpOwotCQlyZXR1cm47Ci0JfQotCi0JcyA9IHJjdV9leHBfZ3Bfc2VxX3NuYXAocnNwKTsKLQlpZiAoZXhwX2Z1bm5lbF9sb2NrKHJzcCwgcykpCi0JCXJldHVybjsgIC8qIFNvbWVvbmUgZWxzZSBkaWQgb3VyIHdvcmsgZm9yIHVzLiAqLwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgcmN1X25vZGUgdHJlZSBpbiBwcmVwYXJhdGlvbiBmb3IgdGhlIHdhaXQuICovCi0Jc3luY19yY3VfZXhwX3NlbGVjdF9jcHVzKHJzcCwgc3luY19yY3VfZXhwX2hhbmRsZXIpOwotCi0JLyogV2FpdCBmb3IgLT5ibGtkX3Rhc2tzIGxpc3RzIHRvIGRyYWluLCB0aGVuIHdha2UgZXZlcnlvbmUgdXAuICovCi0JcmN1X2V4cF93YWl0X3dha2UocnNwLCBzKTsKKwlfc3luY2hyb25pemVfcmN1X2V4cGVkaXRlZChyc3AsIHN5bmNfcmN1X2V4cF9oYW5kbGVyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHN5bmNocm9uaXplX3JjdV9leHBlZGl0ZWQpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3RyZWVfcGx1Z2luLmggYi9rZXJuZWwvcmN1L3RyZWVfcGx1Z2luLmgKaW5kZXggMDA4MmZjZS4uODVjNWE4OCAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90cmVlX3BsdWdpbi5oCisrKyBiL2tlcm5lbC9yY3UvdHJlZV9wbHVnaW4uaApAQCAtMjE3Myw2ICsyMTczLDcgQEAKIAkJCQljbCsrOwogCQkJYysrOwogCQkJbG9jYWxfYmhfZW5hYmxlKCk7CisJCQljb25kX3Jlc2NoZWRfcmN1X3FzKCk7CiAJCQlsaXN0ID0gbmV4dDsKIAkJfQogCQl0cmFjZV9yY3VfYmF0Y2hfZW5kKHJkcC0+cnNwLT5uYW1lLCBjLCAhIWxpc3QsIDAsIDAsIDEpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS90cmVlX3RyYWNlLmMgYi9rZXJuZWwvcmN1L3RyZWVfdHJhY2UuYwppbmRleCA4Njc4MmY5YS4uYjFmMjg5NyAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90cmVlX3RyYWNlLmMKKysrIGIva2VybmVsL3JjdS90cmVlX3RyYWNlLmMKQEAgLTE4NSwxNiArMTg1LDE3IEBACiAJaW50IGNwdTsKIAlzdHJ1Y3QgcmN1X3N0YXRlICpyc3AgPSAoc3RydWN0IHJjdV9zdGF0ZSAqKW0tPnByaXZhdGU7CiAJc3RydWN0IHJjdV9kYXRhICpyZHA7Ci0JdW5zaWduZWQgbG9uZyBzMSA9IDAsIHMyID0gMCwgczMgPSAwOworCXVuc2lnbmVkIGxvbmcgczAgPSAwLCBzMSA9IDAsIHMyID0gMCwgczMgPSAwOwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewogCQlyZHAgPSBwZXJfY3B1X3B0cihyc3AtPnJkYSwgY3B1KTsKKwkJczAgKz0gYXRvbWljX2xvbmdfcmVhZCgmcmRwLT5leHBfd29ya2RvbmUwKTsKIAkJczEgKz0gYXRvbWljX2xvbmdfcmVhZCgmcmRwLT5leHBfd29ya2RvbmUxKTsKIAkJczIgKz0gYXRvbWljX2xvbmdfcmVhZCgmcmRwLT5leHBfd29ya2RvbmUyKTsKIAkJczMgKz0gYXRvbWljX2xvbmdfcmVhZCgmcmRwLT5leHBfd29ya2RvbmUzKTsKIAl9Ci0Jc2VxX3ByaW50ZihtLCAicz0lbHUgd2QxPSVsdSB3ZDI9JWx1IHdkMz0lbHUgbj0lbHUgZW5xPSVkIHNjPSVsdVxuIiwKLQkJICAgcnNwLT5leHBlZGl0ZWRfc2VxdWVuY2UsIHMxLCBzMiwgczMsCisJc2VxX3ByaW50ZihtLCAicz0lbHUgd2QwPSVsdSB3ZDE9JWx1IHdkMj0lbHUgd2QzPSVsdSBuPSVsdSBlbnE9JWQgc2M9JWx1XG4iLAorCQkgICByc3AtPmV4cGVkaXRlZF9zZXF1ZW5jZSwgczAsIHMxLCBzMiwgczMsCiAJCSAgIGF0b21pY19sb25nX3JlYWQoJnJzcC0+ZXhwZWRpdGVkX25vcm1hbCksCiAJCSAgIGF0b21pY19yZWFkKCZyc3AtPmV4cGVkaXRlZF9uZWVkX3FzKSwKIAkJICAgcnNwLT5leHBlZGl0ZWRfc2VxdWVuY2UgLyAyKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvdXBkYXRlLmMgYi9rZXJuZWwvcmN1L3VwZGF0ZS5jCmluZGV4IGYwZDgzMjIuLmYxOTI3MWRjIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1L3VwZGF0ZS5jCisrKyBiL2tlcm5lbC9yY3UvdXBkYXRlLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAKQEAgLTU0LDcgKzU0LDYgQEAKIAogI2luY2x1ZGUgInJjdS5oIgogCi1NT0RVTEVfQUxJQVMoInJjdXBkYXRlIik7CiAjaWZkZWYgTU9EVUxFX1BBUkFNX1BSRUZJWAogI3VuZGVmIE1PRFVMRV9QQVJBTV9QUkVGSVgKICNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL3JlbGF5LmMgYi9rZXJuZWwvcmVsYXkuYwppbmRleCBkNzk3NTAyLi5mYzliNGE0IDEwMDY0NAotLS0gYS9rZXJuZWwvcmVsYXkuYworKysgYi9rZXJuZWwvcmVsYXkuYwpAQCAtMjE0LDcgKzIxNCw3IEBACiAJCQlfX2ZyZWVfcGFnZShidWYtPnBhZ2VfYXJyYXlbaV0pOwogCQlyZWxheV9mcmVlX3BhZ2VfYXJyYXkoYnVmLT5wYWdlX2FycmF5KTsKIAl9Ci0JY2hhbi0+YnVmW2J1Zi0+Y3B1XSA9IE5VTEw7CisJKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgYnVmLT5jcHUpID0gTlVMTDsKIAlrZnJlZShidWYtPnBhZGRpbmcpOwogCWtmcmVlKGJ1Zik7CiAJa3JlZl9wdXQoJmNoYW4tPmtyZWYsIHJlbGF5X2Rlc3Ryb3lfY2hhbm5lbCk7CkBAIC0zODIsMjAgKzM4MiwyMSBAQAogICovCiB2b2lkIHJlbGF5X3Jlc2V0KHN0cnVjdCByY2hhbiAqY2hhbikKIHsKKwlzdHJ1Y3QgcmNoYW5fYnVmICpidWY7CiAJdW5zaWduZWQgaW50IGk7CiAKIAlpZiAoIWNoYW4pCiAJCXJldHVybjsKIAotCWlmIChjaGFuLT5pc19nbG9iYWwgJiYgY2hhbi0+YnVmWzBdKSB7Ci0JCV9fcmVsYXlfcmVzZXQoY2hhbi0+YnVmWzBdLCAwKTsKKwlpZiAoY2hhbi0+aXNfZ2xvYmFsICYmIChidWYgPSAqcGVyX2NwdV9wdHIoY2hhbi0+YnVmLCAwKSkpIHsKKwkJX19yZWxheV9yZXNldChidWYsIDApOwogCQlyZXR1cm47CiAJfQogCiAJbXV0ZXhfbG9jaygmcmVsYXlfY2hhbm5lbHNfbXV0ZXgpOwogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQotCQlpZiAoY2hhbi0+YnVmW2ldKQotCQkJX19yZWxheV9yZXNldChjaGFuLT5idWZbaV0sIDApOworCQlpZiAoKGJ1ZiA9ICpwZXJfY3B1X3B0cihjaGFuLT5idWYsIGkpKSkKKwkJCV9fcmVsYXlfcmVzZXQoYnVmLCAwKTsKIAltdXRleF91bmxvY2soJnJlbGF5X2NoYW5uZWxzX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlbGF5X3Jlc2V0KTsKQEAgLTQ0MCw3ICs0NDEsNyBAQAogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAogIAlpZiAoY2hhbi0+aXNfZ2xvYmFsKQotCQlyZXR1cm4gY2hhbi0+YnVmWzBdOworCQlyZXR1cm4gKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgMCk7CiAKIAlidWYgPSByZWxheV9jcmVhdGVfYnVmKGNoYW4pOwogCWlmICghYnVmKQpAQCAtNDY0LDcgKzQ2NSw3IEBACiAgCV9fcmVsYXlfcmVzZXQoYnVmLCAxKTsKIAogIAlpZihjaGFuLT5pc19nbG9iYWwpIHsKLSAJCWNoYW4tPmJ1ZlswXSA9IGJ1ZjsKKwkJKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgMCkgPSBidWY7CiAgCQlidWYtPmNwdSA9IDA7CiAgIAl9CiAKQEAgLTUxMiw0NiArNTEzLDI1IEBACiAJY2hhbi0+Y2IgPSBjYjsKIH0KIAotLyoqCi0gKiAJcmVsYXlfaG90Y3B1X2NhbGxiYWNrIC0gQ1BVIGhvdHBsdWcgY2FsbGJhY2sKLSAqIAlAbmI6IG5vdGlmaWVyIGJsb2NrCi0gKiAJQGFjdGlvbjogaG90cGx1ZyBhY3Rpb24gdG8gdGFrZQotICogCUBoY3B1OiBDUFUgbnVtYmVyCi0gKgotICogCVJldHVybnMgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBvZiB0aGUgb3BlcmF0aW9uLiAoJU5PVElGWV9PSywgJU5PVElGWV9CQUQpCi0gKi8KLXN0YXRpYyBpbnQgcmVsYXlfaG90Y3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCi0JCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sCi0JCQkJdm9pZCAqaGNwdSkKK2ludCByZWxheV9wcmVwYXJlX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQogewotCXVuc2lnbmVkIGludCBob3RjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OwogCXN0cnVjdCByY2hhbiAqY2hhbjsKKwlzdHJ1Y3QgcmNoYW5fYnVmICpidWY7CiAKLQlzd2l0Y2goYWN0aW9uKSB7Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRToKLQljYXNlIENQVV9VUF9QUkVQQVJFX0ZST1pFTjoKLQkJbXV0ZXhfbG9jaygmcmVsYXlfY2hhbm5lbHNfbXV0ZXgpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW4sICZyZWxheV9jaGFubmVscywgbGlzdCkgewotCQkJaWYgKGNoYW4tPmJ1Zltob3RjcHVdKQotCQkJCWNvbnRpbnVlOwotCQkJY2hhbi0+YnVmW2hvdGNwdV0gPSByZWxheV9vcGVuX2J1ZihjaGFuLCBob3RjcHUpOwotCQkJaWYoIWNoYW4tPmJ1Zltob3RjcHVdKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSJyZWxheV9ob3RjcHVfY2FsbGJhY2s6IGNwdSAlZCBidWZmZXIgIgotCQkJCQkiY3JlYXRpb24gZmFpbGVkXG4iLCBob3RjcHUpOwotCQkJCW11dGV4X3VubG9jaygmcmVsYXlfY2hhbm5lbHNfbXV0ZXgpOwotCQkJCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKC1FTk9NRU0pOwotCQkJfQorCW11dGV4X2xvY2soJnJlbGF5X2NoYW5uZWxzX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW4sICZyZWxheV9jaGFubmVscywgbGlzdCkgeworCQlpZiAoKGJ1ZiA9ICpwZXJfY3B1X3B0cihjaGFuLT5idWYsIGNwdSkpKQorCQkJY29udGludWU7CisJCWJ1ZiA9IHJlbGF5X29wZW5fYnVmKGNoYW4sIGNwdSk7CisJCWlmICghYnVmKSB7CisJCQlwcl9lcnIoInJlbGF5OiBjcHUgJWQgYnVmZmVyIGNyZWF0aW9uIGZhaWxlZFxuIiwgY3B1KTsKKwkJCW11dGV4X3VubG9jaygmcmVsYXlfY2hhbm5lbHNfbXV0ZXgpOworCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KLQkJbXV0ZXhfdW5sb2NrKCZyZWxheV9jaGFubmVsc19tdXRleCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX0RFQUQ6Ci0JY2FzZSBDUFVfREVBRF9GUk9aRU46Ci0JCS8qIE5vIG5lZWQgdG8gZmx1c2ggdGhlIGNwdSA6IHdpbGwgYmUgZmx1c2hlZCB1cG9uCi0JCSAqIGZpbmFsIHJlbGF5X2ZsdXNoKCkgY2FsbC4gKi8KLQkJYnJlYWs7CisJCSpwZXJfY3B1X3B0cihjaGFuLT5idWYsIGNwdSkgPSBidWY7CiAJfQotCXJldHVybiBOT1RJRllfT0s7CisJbXV0ZXhfdW5sb2NrKCZyZWxheV9jaGFubmVsc19tdXRleCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtNTgzLDYgKzU2Myw3IEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAJc3RydWN0IHJjaGFuICpjaGFuOworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZjsKIAogCWlmICghKHN1YmJ1Zl9zaXplICYmIG5fc3ViYnVmcykpCiAJCXJldHVybiBOVUxMOwpAQCAtNTkzLDYgKzU3NCw3IEBACiAJaWYgKCFjaGFuKQogCQlyZXR1cm4gTlVMTDsKIAorCWNoYW4tPmJ1ZiA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcmNoYW5fYnVmICopOwogCWNoYW4tPnZlcnNpb24gPSBSRUxBWUZTX0NIQU5ORUxfVkVSU0lPTjsKIAljaGFuLT5uX3N1YmJ1ZnMgPSBuX3N1YmJ1ZnM7CiAJY2hhbi0+c3ViYnVmX3NpemUgPSBzdWJidWZfc2l6ZTsKQEAgLTYwOCw5ICs1OTAsMTAgQEAKIAogCW11dGV4X2xvY2soJnJlbGF5X2NoYW5uZWxzX211dGV4KTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKLQkJY2hhbi0+YnVmW2ldID0gcmVsYXlfb3Blbl9idWYoY2hhbiwgaSk7Ci0JCWlmICghY2hhbi0+YnVmW2ldKQorCQlidWYgPSByZWxheV9vcGVuX2J1ZihjaGFuLCBpKTsKKwkJaWYgKCFidWYpCiAJCQlnb3RvIGZyZWVfYnVmczsKKwkJKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgaSkgPSBidWY7CiAJfQogCWxpc3RfYWRkKCZjaGFuLT5saXN0LCAmcmVsYXlfY2hhbm5lbHMpOwogCW11dGV4X3VubG9jaygmcmVsYXlfY2hhbm5lbHNfbXV0ZXgpOwpAQCAtNjE5LDggKzYwMiw4IEBACiAKIGZyZWVfYnVmczoKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQlpZiAoY2hhbi0+YnVmW2ldKQotCQkJcmVsYXlfY2xvc2VfYnVmKGNoYW4tPmJ1ZltpXSk7CisJCWlmICgoYnVmID0gKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgaSkpKQorCQkJcmVsYXlfY2xvc2VfYnVmKGJ1Zik7CiAJfQogCiAJa3JlZl9wdXQoJmNoYW4tPmtyZWYsIHJlbGF5X2Rlc3Ryb3lfY2hhbm5lbCk7CkBAIC02NjYsNiArNjQ5LDcgQEAKIAl1bnNpZ25lZCBpbnQgaSwgY3Vycl9jcHU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmOwogCXN0cnVjdCByY2hhbl9wZXJjcHVfYnVmX2Rpc3BhdGNoZXIgZGlzcDsKIAogCWlmICghY2hhbiB8fCAhYmFzZV9maWxlbmFtZSkKQEAgLTY4NCwxMCArNjY4LDExIEBACiAKIAlpZiAoY2hhbi0+aXNfZ2xvYmFsKSB7CiAJCWVyciA9IC1FSU5WQUw7Ci0JCWlmICghV0FSTl9PTl9PTkNFKCFjaGFuLT5idWZbMF0pKSB7Ci0JCQlkZW50cnkgPSByZWxheV9jcmVhdGVfYnVmX2ZpbGUoY2hhbiwgY2hhbi0+YnVmWzBdLCAwKTsKKwkJYnVmID0gKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgMCk7CisJCWlmICghV0FSTl9PTl9PTkNFKCFidWYpKSB7CisJCQlkZW50cnkgPSByZWxheV9jcmVhdGVfYnVmX2ZpbGUoY2hhbiwgYnVmLCAwKTsKIAkJCWlmIChkZW50cnkgJiYgIVdBUk5fT05fT05DRSghY2hhbi0+aXNfZ2xvYmFsKSkgewotCQkJCXJlbGF5X3NldF9idWZfZGVudHJ5KGNoYW4tPmJ1ZlswXSwgZGVudHJ5KTsKKwkJCQlyZWxheV9zZXRfYnVmX2RlbnRyeShidWYsIGRlbnRyeSk7CiAJCQkJZXJyID0gMDsKIAkJCX0KIAkJfQpAQCAtNzAyLDEzICs2ODcsMTQgQEAKIAkgKiBvbiBhbGwgY3VycmVudGx5IG9ubGluZSBDUFVzLgogCSAqLwogCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewotCQlpZiAodW5saWtlbHkoIWNoYW4tPmJ1ZltpXSkpIHsKKwkJYnVmID0gKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgaSk7CisJCWlmICh1bmxpa2VseSghYnVmKSkgewogCQkJV0FSTl9PTkNFKDEsIEtFUk5fRVJSICJDUFUgaGFzIG5vIGJ1ZmZlciFcbiIpOwogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQl9CiAKLQkJZGVudHJ5ID0gcmVsYXlfY3JlYXRlX2J1Zl9maWxlKGNoYW4sIGNoYW4tPmJ1ZltpXSwgaSk7CisJCWRlbnRyeSA9IHJlbGF5X2NyZWF0ZV9idWZfZmlsZShjaGFuLCBidWYsIGkpOwogCQlpZiAodW5saWtlbHkoIWRlbnRyeSkpIHsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlicmVhazsKQEAgLTcxNiwxMCArNzAyLDEwIEBACiAKIAkJaWYgKGN1cnJfY3B1ID09IGkpIHsKIAkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJCXJlbGF5X3NldF9idWZfZGVudHJ5KGNoYW4tPmJ1ZltpXSwgZGVudHJ5KTsKKwkJCXJlbGF5X3NldF9idWZfZGVudHJ5KGJ1ZiwgZGVudHJ5KTsKIAkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJfSBlbHNlIHsKLQkJCWRpc3AuYnVmID0gY2hhbi0+YnVmW2ldOworCQkJZGlzcC5idWYgPSBidWY7CiAJCQlkaXNwLmRlbnRyeSA9IGRlbnRyeTsKIAkJCXNtcF9tYigpOwogCQkJLyogcmVsYXlfY2hhbm5lbHNfbXV0ZXggbXVzdCBiZSBoZWxkLCBzbyB3YWl0LiAqLwpAQCAtODIyLDExICs4MDgsMTAgQEAKIAlpZiAoIWNoYW4pCiAJCXJldHVybjsKIAotCWlmIChjcHUgPj0gTlJfQ1BVUyB8fCAhY2hhbi0+YnVmW2NwdV0gfHwKLQkJCQkJc3ViYnVmc19jb25zdW1lZCA+IGNoYW4tPm5fc3ViYnVmcykKKwlidWYgPSAqcGVyX2NwdV9wdHIoY2hhbi0+YnVmLCBjcHUpOworCWlmIChjcHUgPj0gTlJfQ1BVUyB8fCAhYnVmIHx8IHN1YmJ1ZnNfY29uc3VtZWQgPiBjaGFuLT5uX3N1YmJ1ZnMpCiAJCXJldHVybjsKIAotCWJ1ZiA9IGNoYW4tPmJ1ZltjcHVdOwogCWlmIChzdWJidWZzX2NvbnN1bWVkID4gYnVmLT5zdWJidWZzX3Byb2R1Y2VkIC0gYnVmLT5zdWJidWZzX2NvbnN1bWVkKQogCQlidWYtPnN1YmJ1ZnNfY29uc3VtZWQgPSBidWYtPnN1YmJ1ZnNfcHJvZHVjZWQ7CiAJZWxzZQpAQCAtODQyLDE4ICs4MjcsMTkgQEAKICAqLwogdm9pZCByZWxheV9jbG9zZShzdHJ1Y3QgcmNoYW4gKmNoYW4pCiB7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmOwogCXVuc2lnbmVkIGludCBpOwogCiAJaWYgKCFjaGFuKQogCQlyZXR1cm47CiAKIAltdXRleF9sb2NrKCZyZWxheV9jaGFubmVsc19tdXRleCk7Ci0JaWYgKGNoYW4tPmlzX2dsb2JhbCAmJiBjaGFuLT5idWZbMF0pCi0JCXJlbGF5X2Nsb3NlX2J1ZihjaGFuLT5idWZbMF0pOworCWlmIChjaGFuLT5pc19nbG9iYWwgJiYgKGJ1ZiA9ICpwZXJfY3B1X3B0cihjaGFuLT5idWYsIDApKSkKKwkJcmVsYXlfY2xvc2VfYnVmKGJ1Zik7CiAJZWxzZQogCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKLQkJCWlmIChjaGFuLT5idWZbaV0pCi0JCQkJcmVsYXlfY2xvc2VfYnVmKGNoYW4tPmJ1ZltpXSk7CisJCQlpZiAoKGJ1ZiA9ICpwZXJfY3B1X3B0cihjaGFuLT5idWYsIGkpKSkKKwkJCQlyZWxheV9jbG9zZV9idWYoYnVmKTsKIAogCWlmIChjaGFuLT5sYXN0X3Rvb2JpZykKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAicmVsYXk6IG9uZSBvciBtb3JlIGl0ZW1zIG5vdCBsb2dnZWQgIgpAQCAtODc0LDIwICs4NjAsMjEgQEAKICAqLwogdm9pZCByZWxheV9mbHVzaChzdHJ1Y3QgcmNoYW4gKmNoYW4pCiB7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmOwogCXVuc2lnbmVkIGludCBpOwogCiAJaWYgKCFjaGFuKQogCQlyZXR1cm47CiAKLQlpZiAoY2hhbi0+aXNfZ2xvYmFsICYmIGNoYW4tPmJ1ZlswXSkgewotCQlyZWxheV9zd2l0Y2hfc3ViYnVmKGNoYW4tPmJ1ZlswXSwgMCk7CisJaWYgKGNoYW4tPmlzX2dsb2JhbCAmJiAoYnVmID0gKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgMCkpKSB7CisJCXJlbGF5X3N3aXRjaF9zdWJidWYoYnVmLCAwKTsKIAkJcmV0dXJuOwogCX0KIAogCW11dGV4X2xvY2soJnJlbGF5X2NoYW5uZWxzX211dGV4KTsKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKLQkJaWYgKGNoYW4tPmJ1ZltpXSkKLQkJCXJlbGF5X3N3aXRjaF9zdWJidWYoY2hhbi0+YnVmW2ldLCAwKTsKKwkJaWYgKChidWYgPSAqcGVyX2NwdV9wdHIoY2hhbi0+YnVmLCBpKSkpCisJCQlyZWxheV9zd2l0Y2hfc3ViYnVmKGJ1ZiwgMCk7CiAJbXV0ZXhfdW5sb2NrKCZyZWxheV9jaGFubmVsc19tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZWxheV9mbHVzaCk7CkBAIC0xMzc3LDEyICsxMzY0LDMgQEAKIAkuc3BsaWNlX3JlYWQJPSByZWxheV9maWxlX3NwbGljZV9yZWFkLAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKHJlbGF5X2ZpbGVfb3BlcmF0aW9ucyk7Ci0KLXN0YXRpYyBfX2luaXQgaW50IHJlbGF5X2luaXQodm9pZCkKLXsKLQotCWhvdGNwdV9ub3RpZmllcihyZWxheV9ob3RjcHVfY2FsbGJhY2ssIDApOwotCXJldHVybiAwOwotfQotCi1lYXJseV9pbml0Y2FsbChyZWxheV9pbml0KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9jb3JlLmMgYi9rZXJuZWwvc2NoZWQvY29yZS5jCmluZGV4IDJhOTA2ZjIuLjk0NzMyZDEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9jb3JlLmMKKysrIGIva2VybmVsL3NjaGVkL2NvcmUuYwpAQCAtNTgxLDYgKzU4MSw4IEBACiAJICogSWYgbmVlZGVkIHdlIGNhbiBzdGlsbCBvcHRpbWl6ZSB0aGF0IGxhdGVyIHdpdGggYW4KIAkgKiBlbXB0eSBJUlEuCiAJICovCisJaWYgKGNwdV9pc19vZmZsaW5lKGNwdSkpCisJCXJldHVybiB0cnVlOyAgLyogRG9uJ3QgdHJ5IHRvIHdha2Ugb2ZmbGluZSBDUFVzLiAqLwogCWlmICh0aWNrX25vaHpfZnVsbF9jcHUoY3B1KSkgewogCQlpZiAoY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSB8fAogCQkgICAgdGlja19ub2h6X3RpY2tfc3RvcHBlZCgpKQpAQCAtNTkxLDYgKzU5MywxMSBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorLyoKKyAqIFdha2UgdXAgdGhlIHNwZWNpZmllZCBDUFUuICBJZiB0aGUgQ1BVIGlzIGdvaW5nIG9mZmxpbmUsIGl0IGlzIHRoZQorICogY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZGVhbCB3aXRoIHRoZSBsb3N0IHdha2V1cCwgZm9yIGV4YW1wbGUsCisgKiBieSBob29raW5nIGludG8gdGhlIENQVV9ERUFEIG5vdGlmaWVyIGxpa2UgdGltZXJzIGFuZCBocnRpbWVycyBkby4KKyAqLwogdm9pZCB3YWtlX3VwX25vaHpfY3B1KGludCBjcHUpCiB7CiAJaWYgKCF3YWtlX3VwX2Z1bGxfbm9oel9jcHUoY3B1KSkKQEAgLTEwNjMsOCArMTA3MCwxMiBAQAogCSAqIGhvbGRpbmcgcnEtPmxvY2ssIGlmIHAtPm9uX3JxID09IDAgaXQgY2Fubm90IGdldCBlbnF1ZXVlZCBiZWNhdXNlCiAJICogd2UncmUgaG9sZGluZyBwLT5waV9sb2NrLgogCSAqLwotCWlmICh0YXNrX3JxKHApID09IHJxICYmIHRhc2tfb25fcnFfcXVldWVkKHApKQotCQlycSA9IF9fbWlncmF0ZV90YXNrKHJxLCBwLCBhcmctPmRlc3RfY3B1KTsKKwlpZiAodGFza19ycShwKSA9PSBycSkgeworCQlpZiAodGFza19vbl9ycV9xdWV1ZWQocCkpCisJCQlycSA9IF9fbWlncmF0ZV90YXNrKHJxLCBwLCBhcmctPmRlc3RfY3B1KTsKKwkJZWxzZQorCQkJcC0+d2FrZV9jcHUgPSBhcmctPmRlc3RfY3B1OworCX0KIAlyYXdfc3Bpbl91bmxvY2soJnJxLT5sb2NrKTsKIAlyYXdfc3Bpbl91bmxvY2soJnAtPnBpX2xvY2spOwogCkBAIC0xMTA1LDEwICsxMTE2LDEwIEBACiAKIAlwLT5zY2hlZF9jbGFzcy0+c2V0X2NwdXNfYWxsb3dlZChwLCBuZXdfbWFzayk7CiAKLQlpZiAocnVubmluZykKLQkJcC0+c2NoZWRfY2xhc3MtPnNldF9jdXJyX3Rhc2socnEpOwogCWlmIChxdWV1ZWQpCiAJCWVucXVldWVfdGFzayhycSwgcCwgRU5RVUVVRV9SRVNUT1JFKTsKKwlpZiAocnVubmluZykKKwkJc2V0X2N1cnJfdGFzayhycSwgcCk7CiB9CiAKIC8qCkBAIC0xMjY1LDcgKzEyNzYsNyBAQAogCQkvKgogCQkgKiBUYXNrIGlzbid0IHJ1bm5pbmcgYW55bW9yZTsgbWFrZSBpdCBhcHBlYXIgbGlrZSB3ZSBtaWdyYXRlZAogCQkgKiBpdCBiZWZvcmUgaXQgd2VudCB0byBzbGVlcC4gVGhpcyBtZWFucyBvbiB3YWtldXAgd2UgbWFrZSB0aGUKLQkJICogcHJldmlvdXMgY3B1IG91ciB0YXJnZXIgaW5zdGVhZCBvZiB3aGVyZSBpdCByZWFsbHkgaXMuCisJCSAqIHByZXZpb3VzIGNwdSBvdXIgdGFyZ2V0IGluc3RlYWQgb2Ygd2hlcmUgaXQgcmVhbGx5IGlzLgogCQkgKi8KIAkJcC0+d2FrZV9jcHUgPSBjcHU7CiAJfQpAQCAtMTYyOSwyMyArMTY0MCwyNSBAQAogc3RhdGljIHZvaWQKIHR0d3Vfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBjcHUsIGludCB3YWtlX2ZsYWdzKQogewotI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCi0Jc3RydWN0IHJxICpycSA9IHRoaXNfcnEoKTsKKwlzdHJ1Y3QgcnEgKnJxOworCisJaWYgKCFzY2hlZHN0YXRfZW5hYmxlZCgpKQorCQlyZXR1cm47CisKKwlycSA9IHRoaXNfcnEoKTsKIAogI2lmZGVmIENPTkZJR19TTVAKLQlpbnQgdGhpc19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQlpZiAoY3B1ID09IHRoaXNfY3B1KSB7Ci0JCXNjaGVkc3RhdF9pbmMocnEsIHR0d3VfbG9jYWwpOwotCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19sb2NhbCk7CisJaWYgKGNwdSA9PSBycS0+Y3B1KSB7CisJCXNjaGVkc3RhdF9pbmMocnEtPnR0d3VfbG9jYWwpOworCQlzY2hlZHN0YXRfaW5jKHAtPnNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19sb2NhbCk7CiAJfSBlbHNlIHsKIAkJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CiAKLQkJc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfcmVtb3RlKTsKKwkJc2NoZWRzdGF0X2luYyhwLT5zZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfcmVtb3RlKTsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQlmb3JfZWFjaF9kb21haW4odGhpc19jcHUsIHNkKSB7CisJCWZvcl9lYWNoX2RvbWFpbihycS0+Y3B1LCBzZCkgewogCQkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBzY2hlZF9kb21haW5fc3BhbihzZCkpKSB7Ci0JCQkJc2NoZWRzdGF0X2luYyhzZCwgdHR3dV93YWtlX3JlbW90ZSk7CisJCQkJc2NoZWRzdGF0X2luYyhzZC0+dHR3dV93YWtlX3JlbW90ZSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTE2NTMsMTcgKzE2NjYsMTQgQEAKIAl9CiAKIAlpZiAod2FrZV9mbGFncyAmIFdGX01JR1JBVEVEKQotCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19taWdyYXRlKTsKLQorCQlzY2hlZHN0YXRfaW5jKHAtPnNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19taWdyYXRlKTsKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKLQlzY2hlZHN0YXRfaW5jKHJxLCB0dHd1X2NvdW50KTsKLQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwcyk7CisJc2NoZWRzdGF0X2luYyhycS0+dHR3dV9jb3VudCk7CisJc2NoZWRzdGF0X2luYyhwLT5zZS5zdGF0aXN0aWNzLm5yX3dha2V1cHMpOwogCiAJaWYgKHdha2VfZmxhZ3MgJiBXRl9TWU5DKQotCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19zeW5jKTsKLQotI2VuZGlmIC8qIENPTkZJR19TQ0hFRFNUQVRTICovCisJCXNjaGVkc3RhdF9pbmMocC0+c2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3N5bmMpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdHR3dV9hY3RpdmF0ZShzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBlbl9mbGFncykKQEAgLTIwMTYsNiArMjAyNiwyOCBAQAogCXN1Y2Nlc3MgPSAxOyAvKiB3ZSdyZSBnb2luZyB0byBjaGFuZ2UgLT5zdGF0ZSAqLwogCWNwdSA9IHRhc2tfY3B1KHApOwogCisJLyoKKwkgKiBFbnN1cmUgd2UgbG9hZCBwLT5vbl9ycSBfYWZ0ZXJfIHAtPnN0YXRlLCBvdGhlcndpc2UgaXQgd291bGQKKwkgKiBiZSBwb3NzaWJsZSB0bywgZmFsc2VseSwgb2JzZXJ2ZSBwLT5vbl9ycSA9PSAwIGFuZCBnZXQgc3R1Y2sKKwkgKiBpbiBzbXBfY29uZF9sb2FkX2FjcXVpcmUoKSBiZWxvdy4KKwkgKgorCSAqIHNjaGVkX3R0d3VfcGVuZGluZygpICAgICAgICAgICAgICAgICB0cnlfdG9fd2FrZV91cCgpCisJICogICBbU10gcC0+b25fcnEgPSAxOyAgICAgICAgICAgICAgICAgIFtMXSBQLT5zdGF0ZQorCSAqICAgICAgIFVOTE9DSyBycS0+bG9jayAgLS0tLS0uCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICoJCQkJICstLS0gICBSTUIKKwkgKiBzY2hlZHVsZSgpICAgICAgICAgICAgICAgICAgIC8KKwkgKiAgICAgICBMT0NLIHJxLT5sb2NrICAgIC0tLS0tJworCSAqICAgICAgIFVOTE9DSyBycS0+bG9jaworCSAqCisJICogW3Rhc2sgcF0KKwkgKiAgIFtTXSBwLT5zdGF0ZSA9IFVOSU5URVJSVVBUSUJMRSAgICAgW0xdIHAtPm9uX3JxCisJICoKKwkgKiBQYWlycyB3aXRoIHRoZSBVTkxPQ0srTE9DSyBvbiBycS0+bG9jayBmcm9tIHRoZQorCSAqIGxhc3Qgd2FrZXVwIG9mIG91ciB0YXNrIGFuZCB0aGUgc2NoZWR1bGUgdGhhdCBnb3Qgb3VyIHRhc2sKKwkgKiBjdXJyZW50LgorCSAqLworCXNtcF9ybWIoKTsKIAlpZiAocC0+b25fcnEgJiYgdHR3dV9yZW1vdGUocCwgd2FrZV9mbGFncykpCiAJCWdvdG8gc3RhdDsKIApAQCAtMjA2Miw4ICsyMDk0LDcgQEAKIAogCXR0d3VfcXVldWUocCwgY3B1LCB3YWtlX2ZsYWdzKTsKIHN0YXQ6Ci0JaWYgKHNjaGVkc3RhdF9lbmFibGVkKCkpCi0JCXR0d3Vfc3RhdChwLCBjcHUsIHdha2VfZmxhZ3MpOworCXR0d3Vfc3RhdChwLCBjcHUsIHdha2VfZmxhZ3MpOwogb3V0OgogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5waV9sb2NrLCBmbGFncyk7CiAKQEAgLTIwNzMsNiArMjEwNCw3IEBACiAvKioKICAqIHRyeV90b193YWtlX3VwX2xvY2FsIC0gdHJ5IHRvIHdha2UgdXAgYSBsb2NhbCB0YXNrIHdpdGggcnEgbG9jayBoZWxkCiAgKiBAcDogdGhlIHRocmVhZCB0byBiZSBhd2FrZW5lZAorICogQGNvb2tpZTogY29udGV4dCdzIGNvb2tpZSBmb3IgcGlubmluZwogICoKICAqIFB1dCBAcCBvbiB0aGUgcnVuLXF1ZXVlIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUuIFRoZSBjYWxsZXIgbXVzdAogICogZW5zdXJlIHRoYXQgdGhpc19ycSgpIGlzIGxvY2tlZCwgQHAgaXMgYm91bmQgdG8gdGhpc19ycSgpIGFuZCBub3QKQEAgLTIxMTEsOCArMjE0Myw3IEBACiAJCXR0d3VfYWN0aXZhdGUocnEsIHAsIEVOUVVFVUVfV0FLRVVQKTsKIAogCXR0d3VfZG9fd2FrZXVwKHJxLCBwLCAwLCBjb29raWUpOwotCWlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKQotCQl0dHd1X3N0YXQocCwgc21wX3Byb2Nlc3Nvcl9pZCgpLCAwKTsKKwl0dHd1X3N0YXQocCwgc21wX3Byb2Nlc3Nvcl9pZCgpLCAwKTsKIG91dDoKIAlyYXdfc3Bpbl91bmxvY2soJnAtPnBpX2xvY2spOwogfQpAQCAtMjc1MCw2ICsyNzgxLDEwIEBACiAJCSAqIHRhc2sgYW5kIHB1dCB0aGVtIGJhY2sgb24gdGhlIGZyZWUgbGlzdC4KIAkJICovCiAJCWtwcm9iZV9mbHVzaF90YXNrKHByZXYpOworCisJCS8qIFRhc2sgaXMgZG9uZSB3aXRoIGl0cyBzdGFjay4gKi8KKwkJcHV0X3Rhc2tfc3RhY2socHJldik7CisKIAkJcHV0X3Rhc2tfc3RydWN0KHByZXYpOwogCX0KIApAQCAtMzE3MCw2ICszMjA1LDkgQEAKICAqLwogc3RhdGljIG5vaW5saW5lIHZvaWQgX19zY2hlZHVsZV9idWcoc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQogeworCS8qIFNhdmUgdGhpcyBiZWZvcmUgY2FsbGluZyBwcmludGsoKSwgc2luY2UgdGhhdCB3aWxsIGNsb2JiZXIgaXQgKi8KKwl1bnNpZ25lZCBsb25nIHByZWVtcHRfZGlzYWJsZV9pcCA9IGdldF9wcmVlbXB0X2Rpc2FibGVfaXAoY3VycmVudCk7CisKIAlpZiAob29wc19pbl9wcm9ncmVzcykKIAkJcmV0dXJuOwogCkBAIC0zMTgwLDEzICszMjE4LDEyIEBACiAJcHJpbnRfbW9kdWxlcygpOwogCWlmIChpcnFzX2Rpc2FibGVkKCkpCiAJCXByaW50X2lycXRyYWNlX2V2ZW50cyhwcmV2KTsKLSNpZmRlZiBDT05GSUdfREVCVUdfUFJFRU1QVAotCWlmIChpbl9hdG9taWNfcHJlZW1wdF9vZmYoKSkgeworCWlmIChJU19FTkFCTEVEKENPTkZJR19ERUJVR19QUkVFTVBUKQorCSAgICAmJiBpbl9hdG9taWNfcHJlZW1wdF9vZmYoKSkgewogCQlwcl9lcnIoIlByZWVtcHRpb24gZGlzYWJsZWQgYXQ6Iik7Ci0JCXByaW50X2lwX3N5bShjdXJyZW50LT5wcmVlbXB0X2Rpc2FibGVfaXApOworCQlwcmludF9pcF9zeW0ocHJlZW1wdF9kaXNhYmxlX2lwKTsKIAkJcHJfY29udCgiXG4iKTsKIAl9Ci0jZW5kaWYKIAlpZiAocGFuaWNfb25fd2FybikKIAkJcGFuaWMoInNjaGVkdWxpbmcgd2hpbGUgYXRvbWljXG4iKTsKIApAQCAtMzIxMiw3ICszMjQ5LDcgQEAKIAogCXByb2ZpbGVfaGl0KFNDSEVEX1BST0ZJTElORywgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIAotCXNjaGVkc3RhdF9pbmModGhpc19ycSgpLCBzY2hlZF9jb3VudCk7CisJc2NoZWRzdGF0X2luYyh0aGlzX3JxKCktPnNjaGVkX2NvdW50KTsKIH0KIAogLyoKQEAgLTMzMDUsMTcgKzMzNDIsNiBAQAogCXJxID0gY3B1X3JxKGNwdSk7CiAJcHJldiA9IHJxLT5jdXJyOwogCi0JLyoKLQkgKiBkb19leGl0KCkgY2FsbHMgc2NoZWR1bGUoKSB3aXRoIHByZWVtcHRpb24gZGlzYWJsZWQgYXMgYW4gZXhjZXB0aW9uOwotCSAqIGhvd2V2ZXIgd2UgbXVzdCBmaXggdGhhdCB1cCwgb3RoZXJ3aXNlIHRoZSBuZXh0IHRhc2sgd2lsbCBzZWUgYW4KLQkgKiBpbmNvbnNpc3RlbnQgKGhpZ2hlcikgcHJlZW1wdCBjb3VudC4KLQkgKgotCSAqIEl0IGFsc28gYXZvaWRzIHRoZSBiZWxvdyBzY2hlZHVsZV9kZWJ1ZygpIHRlc3QgZnJvbSBjb21wbGFpbmluZwotCSAqIGFib3V0IHRoaXMuCi0JICovCi0JaWYgKHVubGlrZWx5KHByZXYtPnN0YXRlID09IFRBU0tfREVBRCkpCi0JCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWRfbm90cmFjZSgpOwotCiAJc2NoZWR1bGVfZGVidWcocHJldik7CiAKIAlpZiAoc2NoZWRfZmVhdChIUlRJQ0spKQpAQCAtMzM4MSw3ICszNDA3LDMzIEBACiAKIAliYWxhbmNlX2NhbGxiYWNrKHJxKTsKIH0KLVNUQUNLX0ZSQU1FX05PTl9TVEFOREFSRChfX3NjaGVkdWxlKTsgLyogc3dpdGNoX3RvKCkgKi8KKwordm9pZCBfX25vcmV0dXJuIGRvX3Rhc2tfZGVhZCh2b2lkKQoreworCS8qCisJICogVGhlIHNldHRpbmcgb2YgVEFTS19SVU5OSU5HIGJ5IHRyeV90b193YWtlX3VwKCkgbWF5IGJlIGRlbGF5ZWQKKwkgKiB3aGVuIHRoZSBmb2xsb3dpbmcgdHdvIGNvbmRpdGlvbnMgYmVjb21lIHRydWUuCisJICogICAtIFRoZXJlIGlzIHJhY2UgY29uZGl0aW9uIG9mIG1tYXBfc2VtIChJdCBpcyBhY3F1aXJlZCBieQorCSAqICAgICBleGl0X21tKCkpLCBhbmQKKwkgKiAgIC0gU01JIG9jY3VycyBiZWZvcmUgc2V0dGluZyBUQVNLX1JVTklOTkcuCisJICogICAgIChvciBoeXBlcnZpc29yIG9mIHZpcnR1YWwgbWFjaGluZSBzd2l0Y2hlcyB0byBvdGhlciBndWVzdCkKKwkgKiAgQXMgYSByZXN1bHQsIHdlIG1heSBiZWNvbWUgVEFTS19SVU5OSU5HIGFmdGVyIGJlY29taW5nIFRBU0tfREVBRAorCSAqCisJICogVG8gYXZvaWQgaXQsIHdlIGhhdmUgdG8gd2FpdCBmb3IgcmVsZWFzaW5nIHRzay0+cGlfbG9jayB3aGljaAorCSAqIGlzIGhlbGQgYnkgdHJ5X3RvX3dha2VfdXAoKQorCSAqLworCXNtcF9tYigpOworCXJhd19zcGluX3VubG9ja193YWl0KCZjdXJyZW50LT5waV9sb2NrKTsKKworCS8qIGNhdXNlcyBmaW5hbCBwdXRfdGFza19zdHJ1Y3QgaW4gZmluaXNoX3Rhc2tfc3dpdGNoKCkuICovCisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0RFQUQpOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwkvKiB0ZWxsIGZyZWV6ZXIgdG8gaWdub3JlIHVzICovCisJX19zY2hlZHVsZShmYWxzZSk7CisJQlVHKCk7CisJLyogQXZvaWQgIm5vcmV0dXJuIGZ1bmN0aW9uIGRvZXMgcmV0dXJuIi4gICovCisJZm9yICg7OykKKwkJY3B1X3JlbGF4KCk7CS8qIEZvciB3aGVuIEJVRyBpcyBudWxsICovCit9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF9zdWJtaXRfd29yayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKQEAgLTM2NjUsMTAgKzM3MTcsMTAgQEAKIAogCXAtPnByaW8gPSBwcmlvOwogCi0JaWYgKHJ1bm5pbmcpCi0JCXAtPnNjaGVkX2NsYXNzLT5zZXRfY3Vycl90YXNrKHJxKTsKIAlpZiAocXVldWVkKQogCQllbnF1ZXVlX3Rhc2socnEsIHAsIHF1ZXVlX2ZsYWcpOworCWlmIChydW5uaW5nKQorCQlzZXRfY3Vycl90YXNrKHJxLCBwKTsKIAogCWNoZWNrX2NsYXNzX2NoYW5nZWQocnEsIHAsIHByZXZfY2xhc3MsIG9sZHByaW8pOwogb3V0X3VubG9jazoKQEAgLTM2ODIsNyArMzczNCw4IEBACiAKIHZvaWQgc2V0X3VzZXJfbmljZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGxvbmcgbmljZSkKIHsKLQlpbnQgb2xkX3ByaW8sIGRlbHRhLCBxdWV1ZWQ7CisJYm9vbCBxdWV1ZWQsIHJ1bm5pbmc7CisJaW50IG9sZF9wcmlvLCBkZWx0YTsKIAlzdHJ1Y3QgcnFfZmxhZ3MgcmY7CiAJc3RydWN0IHJxICpycTsKIApAQCAtMzcwNCw4ICszNzU3LDExIEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAJcXVldWVkID0gdGFza19vbl9ycV9xdWV1ZWQocCk7CisJcnVubmluZyA9IHRhc2tfY3VycmVudChycSwgcCk7CiAJaWYgKHF1ZXVlZCkKIAkJZGVxdWV1ZV90YXNrKHJxLCBwLCBERVFVRVVFX1NBVkUpOworCWlmIChydW5uaW5nKQorCQlwdXRfcHJldl90YXNrKHJxLCBwKTsKIAogCXAtPnN0YXRpY19wcmlvID0gTklDRV9UT19QUklPKG5pY2UpOwogCXNldF9sb2FkX3dlaWdodChwKTsKQEAgLTM3MjIsNiArMzc3OCw4IEBACiAJCWlmIChkZWx0YSA8IDAgfHwgKGRlbHRhID4gMCAmJiB0YXNrX3J1bm5pbmcocnEsIHApKSkKIAkJCXJlc2NoZWRfY3VycihycSk7CiAJfQorCWlmIChydW5uaW5nKQorCQlzZXRfY3Vycl90YXNrKHJxLCBwKTsKIG91dF91bmxvY2s6CiAJdGFza19ycV91bmxvY2socnEsIHAsICZyZik7CiB9CkBAIC00MjIxLDggKzQyNzksNiBAQAogCXByZXZfY2xhc3MgPSBwLT5zY2hlZF9jbGFzczsKIAlfX3NldHNjaGVkdWxlcihycSwgcCwgYXR0ciwgcGkpOwogCi0JaWYgKHJ1bm5pbmcpCi0JCXAtPnNjaGVkX2NsYXNzLT5zZXRfY3Vycl90YXNrKHJxKTsKIAlpZiAocXVldWVkKSB7CiAJCS8qCiAJCSAqIFdlIGVucXVldWUgdG8gdGFpbCB3aGVuIHRoZSBwcmlvcml0eSBvZiBhIHRhc2sgaXMKQEAgLTQyMzMsNiArNDI4OSw4IEBACiAKIAkJZW5xdWV1ZV90YXNrKHJxLCBwLCBxdWV1ZV9mbGFncyk7CiAJfQorCWlmIChydW5uaW5nKQorCQlzZXRfY3Vycl90YXNrKHJxLCBwKTsKIAogCWNoZWNrX2NsYXNzX2NoYW5nZWQocnEsIHAsIHByZXZfY2xhc3MsIG9sZHByaW8pOwogCXByZWVtcHRfZGlzYWJsZSgpOyAvKiBhdm9pZCBycSBmcm9tIGdvaW5nIGF3YXkgb24gdXMgKi8KQEAgLTQ4MjQsNyArNDg4Miw3IEBACiB7CiAJc3RydWN0IHJxICpycSA9IHRoaXNfcnFfbG9jaygpOwogCi0Jc2NoZWRzdGF0X2luYyhycSwgeWxkX2NvdW50KTsKKwlzY2hlZHN0YXRfaW5jKHJxLT55bGRfY291bnQpOwogCWN1cnJlbnQtPnNjaGVkX2NsYXNzLT55aWVsZF90YXNrKHJxKTsKIAogCS8qCkBAIC00ODQxLDYgKzQ4OTksNyBAQAogCXJldHVybiAwOwogfQogCisjaWZuZGVmIENPTkZJR19QUkVFTVBUCiBpbnQgX19zY2hlZCBfY29uZF9yZXNjaGVkKHZvaWQpCiB7CiAJaWYgKHNob3VsZF9yZXNjaGVkKDApKSB7CkBAIC00ODUwLDYgKzQ5MDksNyBAQAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChfY29uZF9yZXNjaGVkKTsKKyNlbmRpZgogCiAvKgogICogX19jb25kX3Jlc2NoZWRfbG9jaygpIC0gaWYgYSByZXNjaGVkdWxlIGlzIHBlbmRpbmcsIGRyb3AgdGhlIGdpdmVuIGxvY2ssCkBAIC00OTc1LDcgKzUwMzUsNyBAQAogCiAJeWllbGRlZCA9IGN1cnItPnNjaGVkX2NsYXNzLT55aWVsZF90b190YXNrKHJxLCBwLCBwcmVlbXB0KTsKIAlpZiAoeWllbGRlZCkgewotCQlzY2hlZHN0YXRfaW5jKHJxLCB5bGRfY291bnQpOworCQlzY2hlZHN0YXRfaW5jKHJxLT55bGRfY291bnQpOwogCQkvKgogCQkgKiBNYWtlIHAncyBDUFUgcmVzY2hlZHVsZTsgcGlja19uZXh0X2VudGl0eSB0YWtlcyBjYXJlIG9mCiAJCSAqIGZhaXJuZXNzLgpAQCAtNTM5NSwxMCArNTQ1NSwxMCBAQAogCiAJcC0+bnVtYV9wcmVmZXJyZWRfbmlkID0gbmlkOwogCi0JaWYgKHJ1bm5pbmcpCi0JCXAtPnNjaGVkX2NsYXNzLT5zZXRfY3Vycl90YXNrKHJxKTsKIAlpZiAocXVldWVkKQogCQllbnF1ZXVlX3Rhc2socnEsIHAsIEVOUVVFVUVfUkVTVE9SRSk7CisJaWYgKHJ1bm5pbmcpCisJCXNldF9jdXJyX3Rhc2socnEsIHApOwogCXRhc2tfcnFfdW5sb2NrKHJxLCBwLCAmcmYpOwogfQogI2VuZGlmIC8qIENPTkZJR19OVU1BX0JBTEFOQ0lORyAqLwpAQCAtNTY5NSw2ICs1NzU1LDggQEAKIAl9CiB9CiAjZWxzZSAvKiAhQ09ORklHX1NDSEVEX0RFQlVHICovCisKKyMgZGVmaW5lIHNjaGVkX2RlYnVnX2VuYWJsZWQgMAogIyBkZWZpbmUgc2NoZWRfZG9tYWluX2RlYnVnKHNkLCBjcHUpIGRvIHsgfSB3aGlsZSAoMCkKIHN0YXRpYyBpbmxpbmUgYm9vbCBzY2hlZF9kZWJ1Zyh2b2lkKQogewpAQCAtNTcxMyw2ICs1Nzc1LDcgQEAKIAkJCSBTRF9CQUxBTkNFX0ZPUksgfAogCQkJIFNEX0JBTEFOQ0VfRVhFQyB8CiAJCQkgU0RfU0hBUkVfQ1BVQ0FQQUNJVFkgfAorCQkJIFNEX0FTWU1fQ1BVQ0FQQUNJVFkgfAogCQkJIFNEX1NIQVJFX1BLR19SRVNPVVJDRVMgfAogCQkJIFNEX1NIQVJFX1BPV0VSRE9NQUlOKSkgewogCQlpZiAoc2QtPmdyb3VwcyAhPSBzZC0+Z3JvdXBzLT5uZXh0KQpAQCAtNTc0Myw2ICs1ODA2LDcgQEAKIAkJCQlTRF9CQUxBTkNFX05FV0lETEUgfAogCQkJCVNEX0JBTEFOQ0VfRk9SSyB8CiAJCQkJU0RfQkFMQU5DRV9FWEVDIHwKKwkJCQlTRF9BU1lNX0NQVUNBUEFDSVRZIHwKIAkJCQlTRF9TSEFSRV9DUFVDQVBBQ0lUWSB8CiAJCQkJU0RfU0hBUkVfUEtHX1JFU09VUkNFUyB8CiAJCQkJU0RfUFJFRkVSX1NJQkxJTkcgfApAQCAtNTg4NywxMCArNTk1MSw4IEBACiAJfSB3aGlsZSAoc2cgIT0gZmlyc3QpOwogfQogCi1zdGF0aWMgdm9pZCBmcmVlX3NjaGVkX2RvbWFpbihzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfc2NoZWRfZG9tYWluKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkKQogewotCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHNjaGVkX2RvbWFpbiwgcmN1KTsKLQogCS8qCiAJICogSWYgaXRzIGFuIG92ZXJsYXBwaW5nIGRvbWFpbiBpdCBoYXMgcHJpdmF0ZSBncm91cHMsIGl0ZXJhdGUgYW5kCiAJICogbnVrZSB0aGVtIGFsbC4KQEAgLTU5MDEsMTggKzU5NjMsMjYgQEAKIAkJa2ZyZWUoc2QtPmdyb3Vwcy0+c2djKTsKIAkJa2ZyZWUoc2QtPmdyb3Vwcyk7CiAJfQorCWlmIChzZC0+c2hhcmVkICYmIGF0b21pY19kZWNfYW5kX3Rlc3QoJnNkLT5zaGFyZWQtPnJlZikpCisJCWtmcmVlKHNkLT5zaGFyZWQpOwogCWtmcmVlKHNkKTsKIH0KIAotc3RhdGljIHZvaWQgZGVzdHJveV9zY2hlZF9kb21haW4oc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCitzdGF0aWMgdm9pZCBkZXN0cm95X3NjaGVkX2RvbWFpbnNfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KQogewotCWNhbGxfcmN1KCZzZC0+cmN1LCBmcmVlX3NjaGVkX2RvbWFpbik7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3Qgc2NoZWRfZG9tYWluLCByY3UpOworCisJd2hpbGUgKHNkKSB7CisJCXN0cnVjdCBzY2hlZF9kb21haW4gKnBhcmVudCA9IHNkLT5wYXJlbnQ7CisJCWRlc3Ryb3lfc2NoZWRfZG9tYWluKHNkKTsKKwkJc2QgPSBwYXJlbnQ7CisJfQogfQogCi1zdGF0aWMgdm9pZCBkZXN0cm95X3NjaGVkX2RvbWFpbnMoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCitzdGF0aWMgdm9pZCBkZXN0cm95X3NjaGVkX2RvbWFpbnMoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QpCiB7Ci0JZm9yICg7IHNkOyBzZCA9IHNkLT5wYXJlbnQpCi0JCWRlc3Ryb3lfc2NoZWRfZG9tYWluKHNkLCBjcHUpOworCWlmIChzZCkKKwkJY2FsbF9yY3UoJnNkLT5yY3UsIGRlc3Ryb3lfc2NoZWRfZG9tYWluc19yY3UpOwogfQogCiAvKgpAQCAtNTkyNywxNCArNTk5NywxNCBAQAogREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiAqLCBzZF9sbGMpOwogREVGSU5FX1BFUl9DUFUoaW50LCBzZF9sbGNfc2l6ZSk7CiBERUZJTkVfUEVSX0NQVShpbnQsIHNkX2xsY19pZCk7CitERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc2NoZWRfZG9tYWluX3NoYXJlZCAqLCBzZF9sbGNfc2hhcmVkKTsKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW4gKiwgc2RfbnVtYSk7Ci1ERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc2NoZWRfZG9tYWluICosIHNkX2J1c3kpOwogREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiAqLCBzZF9hc3ltKTsKIAogc3RhdGljIHZvaWQgdXBkYXRlX3RvcF9jYWNoZV9kb21haW4oaW50IGNwdSkKIHsKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluX3NoYXJlZCAqc2RzID0gTlVMTDsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKLQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpidXN5X3NkID0gTlVMTDsKIAlpbnQgaWQgPSBjcHU7CiAJaW50IHNpemUgPSAxOwogCkBAIC01OTQyLDEzICs2MDEyLDEzIEBACiAJaWYgKHNkKSB7CiAJCWlkID0gY3B1bWFza19maXJzdChzY2hlZF9kb21haW5fc3BhbihzZCkpOwogCQlzaXplID0gY3B1bWFza193ZWlnaHQoc2NoZWRfZG9tYWluX3NwYW4oc2QpKTsKLQkJYnVzeV9zZCA9IHNkLT5wYXJlbnQ7IC8qIHNkX2J1c3kgKi8KKwkJc2RzID0gc2QtPnNoYXJlZDsKIAl9Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKHBlcl9jcHUoc2RfYnVzeSwgY3B1KSwgYnVzeV9zZCk7CiAKIAlyY3VfYXNzaWduX3BvaW50ZXIocGVyX2NwdShzZF9sbGMsIGNwdSksIHNkKTsKIAlwZXJfY3B1KHNkX2xsY19zaXplLCBjcHUpID0gc2l6ZTsKIAlwZXJfY3B1KHNkX2xsY19pZCwgY3B1KSA9IGlkOworCXJjdV9hc3NpZ25fcG9pbnRlcihwZXJfY3B1KHNkX2xsY19zaGFyZWQsIGNwdSksIHNkcyk7CiAKIAlzZCA9IGxvd2VzdF9mbGFnX2RvbWFpbihjcHUsIFNEX05VTUEpOwogCXJjdV9hc3NpZ25fcG9pbnRlcihwZXJfY3B1KHNkX251bWEsIGNwdSksIHNkKTsKQEAgLTU5ODQsNyArNjA1NCw3IEBACiAJCQkgKi8KIAkJCWlmIChwYXJlbnQtPmZsYWdzICYgU0RfUFJFRkVSX1NJQkxJTkcpCiAJCQkJdG1wLT5mbGFncyB8PSBTRF9QUkVGRVJfU0lCTElORzsKLQkJCWRlc3Ryb3lfc2NoZWRfZG9tYWluKHBhcmVudCwgY3B1KTsKKwkJCWRlc3Ryb3lfc2NoZWRfZG9tYWluKHBhcmVudCk7CiAJCX0gZWxzZQogCQkJdG1wID0gdG1wLT5wYXJlbnQ7CiAJfQpAQCAtNTk5Miw3ICs2MDYyLDcgQEAKIAlpZiAoc2QgJiYgc2RfZGVnZW5lcmF0ZShzZCkpIHsKIAkJdG1wID0gc2Q7CiAJCXNkID0gc2QtPnBhcmVudDsKLQkJZGVzdHJveV9zY2hlZF9kb21haW4odG1wLCBjcHUpOworCQlkZXN0cm95X3NjaGVkX2RvbWFpbih0bXApOwogCQlpZiAoc2QpCiAJCQlzZC0+Y2hpbGQgPSBOVUxMOwogCX0KQEAgLTYwMDIsNyArNjA3Miw3IEBACiAJcnFfYXR0YWNoX3Jvb3QocnEsIHJkKTsKIAl0bXAgPSBycS0+c2Q7CiAJcmN1X2Fzc2lnbl9wb2ludGVyKHJxLT5zZCwgc2QpOwotCWRlc3Ryb3lfc2NoZWRfZG9tYWlucyh0bXAsIGNwdSk7CisJZGVzdHJveV9zY2hlZF9kb21haW5zKHRtcCk7CiAKIAl1cGRhdGVfdG9wX2NhY2hlX2RvbWFpbihjcHUpOwogfQpAQCAtNjI0NSw3ICs2MzE1LDYgQEAKIAkJcmV0dXJuOwogCiAJdXBkYXRlX2dyb3VwX2NhcGFjaXR5KHNkLCBjcHUpOwotCWF0b21pY19zZXQoJnNnLT5zZ2MtPm5yX2J1c3lfY3B1cywgc2ctPmdyb3VwX3dlaWdodCk7CiB9CiAKIC8qCkBAIC02MzMzLDYgKzY0MDIsOSBAQAogCVdBUk5fT05fT05DRSgqcGVyX2NwdV9wdHIoc2RkLT5zZCwgY3B1KSAhPSBzZCk7CiAJKnBlcl9jcHVfcHRyKHNkZC0+c2QsIGNwdSkgPSBOVUxMOwogCisJaWYgKGF0b21pY19yZWFkKCYoKnBlcl9jcHVfcHRyKHNkZC0+c2RzLCBjcHUpKS0+cmVmKSkKKwkJKnBlcl9jcHVfcHRyKHNkZC0+c2RzLCBjcHUpID0gTlVMTDsKKwogCWlmIChhdG9taWNfcmVhZCgmKCpwZXJfY3B1X3B0cihzZGQtPnNnLCBjcHUpKS0+cmVmKSkKIAkJKnBlcl9jcHVfcHRyKHNkZC0+c2csIGNwdSkgPSBOVUxMOwogCkBAIC02MzUyLDI2ICs2NDI0LDM3IEBACiAvKgogICogU0RfZmxhZ3MgYWxsb3dlZCBpbiB0b3BvbG9neSBkZXNjcmlwdGlvbnMuCiAgKgotICogU0RfU0hBUkVfQ1BVQ0FQQUNJVFkgICAgICAtIGRlc2NyaWJlcyBTTVQgdG9wb2xvZ2llcwotICogU0RfU0hBUkVfUEtHX1JFU09VUkNFUyAtIGRlc2NyaWJlcyBzaGFyZWQgY2FjaGVzCi0gKiBTRF9OVU1BICAgICAgICAgICAgICAgIC0gZGVzY3JpYmVzIE5VTUEgdG9wb2xvZ2llcwotICogU0RfU0hBUkVfUE9XRVJET01BSU4gICAtIGRlc2NyaWJlcyBzaGFyZWQgcG93ZXIgZG9tYWluCisgKiBUaGVzZSBmbGFncyBhcmUgcHVyZWx5IGRlc2NyaXB0aXZlIG9mIHRoZSB0b3BvbG9neSBhbmQgZG8gbm90IHByZXNjcmliZQorICogYmVoYXZpb3VyLiBCZWhhdmlvdXIgaXMgYXJ0aWZpY2lhbCBhbmQgbWFwcGVkIGluIHRoZSBiZWxvdyBzZF9pbml0KCkKKyAqIGZ1bmN0aW9uOgogICoKLSAqIE9kZCBvbmUgb3V0OgotICogU0RfQVNZTV9QQUNLSU5HICAgICAgICAtIGRlc2NyaWJlcyBTTVQgcXVpcmtzCisgKiAgIFNEX1NIQVJFX0NQVUNBUEFDSVRZICAgLSBkZXNjcmliZXMgU01UIHRvcG9sb2dpZXMKKyAqICAgU0RfU0hBUkVfUEtHX1JFU09VUkNFUyAtIGRlc2NyaWJlcyBzaGFyZWQgY2FjaGVzCisgKiAgIFNEX05VTUEgICAgICAgICAgICAgICAgLSBkZXNjcmliZXMgTlVNQSB0b3BvbG9naWVzCisgKiAgIFNEX1NIQVJFX1BPV0VSRE9NQUlOICAgLSBkZXNjcmliZXMgc2hhcmVkIHBvd2VyIGRvbWFpbgorICogICBTRF9BU1lNX0NQVUNBUEFDSVRZICAgIC0gZGVzY3JpYmVzIG1peGVkIGNhcGFjaXR5IHRvcG9sb2dpZXMKKyAqCisgKiBPZGQgb25lIG91dCwgd2hpY2ggYmVzaWRlIGRlc2NyaWJpbmcgdGhlIHRvcG9sb2d5IGhhcyBhIHF1aXJrIGFsc28KKyAqIHByZXNjcmliZXMgdGhlIGRlc2lyZWQgYmVoYXZpb3VyIHRoYXQgZ29lcyBhbG9uZyB3aXRoIGl0OgorICoKKyAqICAgU0RfQVNZTV9QQUNLSU5HICAgICAgICAtIGRlc2NyaWJlcyBTTVQgcXVpcmtzCiAgKi8KICNkZWZpbmUgVE9QT0xPR1lfU0RfRkxBR1MJCVwKIAkoU0RfU0hBUkVfQ1BVQ0FQQUNJVFkgfAkJXAogCSBTRF9TSEFSRV9QS0dfUkVTT1VSQ0VTIHwJXAogCSBTRF9OVU1BIHwJCQlcCiAJIFNEX0FTWU1fUEFDS0lORyB8CQlcCisJIFNEX0FTWU1fQ1BVQ0FQQUNJVFkgfAkJXAogCSBTRF9TSEFSRV9QT1dFUkRPTUFJTikKIAogc3RhdGljIHN0cnVjdCBzY2hlZF9kb21haW4gKgotc2RfaW5pdChzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xldmVsICp0bCwgaW50IGNwdSkKK3NkX2luaXQoc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCAqdGwsCisJY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXAsCisJc3RydWN0IHNjaGVkX2RvbWFpbiAqY2hpbGQsIGludCBjcHUpCiB7Ci0Jc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSAqcGVyX2NwdV9wdHIodGwtPmRhdGEuc2QsIGNwdSk7Ci0JaW50IHNkX3dlaWdodCwgc2RfZmxhZ3MgPSAwOworCXN0cnVjdCBzZF9kYXRhICpzZGQgPSAmdGwtPmRhdGE7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSAqcGVyX2NwdV9wdHIoc2RkLT5zZCwgY3B1KTsKKwlpbnQgc2RfaWQsIHNkX3dlaWdodCwgc2RfZmxhZ3MgPSAwOwogCiAjaWZkZWYgQ09ORklHX05VTUEKIAkvKgpAQCAtNjQyMCwxNSArNjUwMywyNiBAQAogCQkuc210X2dhaW4JCT0gMCwKIAkJLm1heF9uZXdpZGxlX2xiX2Nvc3QJPSAwLAogCQkubmV4dF9kZWNheV9tYXhfbGJfY29zdAk9IGppZmZpZXMsCisJCS5jaGlsZAkJCT0gY2hpbGQsCiAjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCiAJCS5uYW1lCQkJPSB0bC0+bmFtZSwKICNlbmRpZgogCX07CiAKKwljcHVtYXNrX2FuZChzY2hlZF9kb21haW5fc3BhbihzZCksIGNwdV9tYXAsIHRsLT5tYXNrKGNwdSkpOworCXNkX2lkID0gY3B1bWFza19maXJzdChzY2hlZF9kb21haW5fc3BhbihzZCkpOworCiAJLyoKIAkgKiBDb252ZXJ0IHRvcG9sb2dpY2FsIHByb3BlcnRpZXMgaW50byBiZWhhdmlvdXIuCiAJICovCiAKKwlpZiAoc2QtPmZsYWdzICYgU0RfQVNZTV9DUFVDQVBBQ0lUWSkgeworCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICp0ID0gc2Q7CisKKwkJZm9yX2VhY2hfbG93ZXJfZG9tYWluKHQpCisJCQl0LT5mbGFncyB8PSBTRF9CQUxBTkNFX1dBS0U7CisJfQorCiAJaWYgKHNkLT5mbGFncyAmIFNEX1NIQVJFX0NQVUNBUEFDSVRZKSB7CiAJCXNkLT5mbGFncyB8PSBTRF9QUkVGRVJfU0lCTElORzsKIAkJc2QtPmltYmFsYW5jZV9wY3QgPSAxMTA7CkBAIC02NDYwLDcgKzY1NTQsMTcgQEAKIAkJc2QtPmlkbGVfaWR4ID0gMTsKIAl9CiAKLQlzZC0+cHJpdmF0ZSA9ICZ0bC0+ZGF0YTsKKwkvKgorCSAqIEZvciBhbGwgbGV2ZWxzIHNoYXJpbmcgY2FjaGU7IGNvbm5lY3QgYSBzY2hlZF9kb21haW5fc2hhcmVkCisJICogaW5zdGFuY2UuCisJICovCisJaWYgKHNkLT5mbGFncyAmIFNEX1NIQVJFX1BLR19SRVNPVVJDRVMpIHsKKwkJc2QtPnNoYXJlZCA9ICpwZXJfY3B1X3B0cihzZGQtPnNkcywgc2RfaWQpOworCQlhdG9taWNfaW5jKCZzZC0+c2hhcmVkLT5yZWYpOworCQlhdG9taWNfc2V0KCZzZC0+c2hhcmVkLT5ucl9idXN5X2NwdXMsIHNkX3dlaWdodCk7CisJfQorCisJc2QtPnByaXZhdGUgPSBzZGQ7CiAKIAlyZXR1cm4gc2Q7CiB9CkBAIC02NDg3LDYgKzY1OTEsOSBAQAogCiB2b2lkIHNldF9zY2hlZF90b3BvbG9neShzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xldmVsICp0bCkKIHsKKwlpZiAoV0FSTl9PTl9PTkNFKHNjaGVkX3NtcF9pbml0aWFsaXplZCkpCisJCXJldHVybjsKKwogCXNjaGVkX2RvbWFpbl90b3BvbG9neSA9IHRsOwogfQogCkBAIC02NzY3LDYgKzY4NzQsMTAgQEAKIAkJaWYgKCFzZGQtPnNkKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKKwkJc2RkLT5zZHMgPSBhbGxvY19wZXJjcHUoc3RydWN0IHNjaGVkX2RvbWFpbl9zaGFyZWQgKik7CisJCWlmICghc2RkLT5zZHMpCisJCQlyZXR1cm4gLUVOT01FTTsKKwogCQlzZGQtPnNnID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBzY2hlZF9ncm91cCAqKTsKIAkJaWYgKCFzZGQtPnNnKQogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC02Nzc3LDYgKzY4ODgsNyBAQAogCiAJCWZvcl9lYWNoX2NwdShqLCBjcHVfbWFwKSB7CiAJCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKKwkJCXN0cnVjdCBzY2hlZF9kb21haW5fc2hhcmVkICpzZHM7CiAJCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnOwogCQkJc3RydWN0IHNjaGVkX2dyb3VwX2NhcGFjaXR5ICpzZ2M7CiAKQEAgLTY3ODcsNiArNjg5OSwxMyBAQAogCiAJCQkqcGVyX2NwdV9wdHIoc2RkLT5zZCwgaikgPSBzZDsKIAorCQkJc2RzID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZG9tYWluX3NoYXJlZCksCisJCQkJCUdGUF9LRVJORUwsIGNwdV90b19ub2RlKGopKTsKKwkJCWlmICghc2RzKQorCQkJCXJldHVybiAtRU5PTUVNOworCisJCQkqcGVyX2NwdV9wdHIoc2RkLT5zZHMsIGopID0gc2RzOworCiAJCQlzZyA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IHNjaGVkX2dyb3VwKSArIGNwdW1hc2tfc2l6ZSgpLAogCQkJCQlHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShqKSk7CiAJCQlpZiAoIXNnKQpAQCAtNjgyNiw2ICs2OTQ1LDggQEAKIAkJCQlrZnJlZSgqcGVyX2NwdV9wdHIoc2RkLT5zZCwgaikpOwogCQkJfQogCisJCQlpZiAoc2RkLT5zZHMpCisJCQkJa2ZyZWUoKnBlcl9jcHVfcHRyKHNkZC0+c2RzLCBqKSk7CiAJCQlpZiAoc2RkLT5zZykKIAkJCQlrZnJlZSgqcGVyX2NwdV9wdHIoc2RkLT5zZywgaikpOwogCQkJaWYgKHNkZC0+c2djKQpAQCAtNjgzMyw2ICs2OTU0LDggQEAKIAkJfQogCQlmcmVlX3BlcmNwdShzZGQtPnNkKTsKIAkJc2RkLT5zZCA9IE5VTEw7CisJCWZyZWVfcGVyY3B1KHNkZC0+c2RzKTsKKwkJc2RkLT5zZHMgPSBOVUxMOwogCQlmcmVlX3BlcmNwdShzZGQtPnNnKTsKIAkJc2RkLT5zZyA9IE5VTEw7CiAJCWZyZWVfcGVyY3B1KHNkZC0+c2djKTsKQEAgLTY4NDQsMTYgKzY5NjcsMTIgQEAKIAkJY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXAsIHN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqYXR0ciwKIAkJc3RydWN0IHNjaGVkX2RvbWFpbiAqY2hpbGQsIGludCBjcHUpCiB7Ci0Jc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSBzZF9pbml0KHRsLCBjcHUpOwotCWlmICghc2QpCi0JCXJldHVybiBjaGlsZDsKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCA9IHNkX2luaXQodGwsIGNwdV9tYXAsIGNoaWxkLCBjcHUpOwogCi0JY3B1bWFza19hbmQoc2NoZWRfZG9tYWluX3NwYW4oc2QpLCBjcHVfbWFwLCB0bC0+bWFzayhjcHUpKTsKIAlpZiAoY2hpbGQpIHsKIAkJc2QtPmxldmVsID0gY2hpbGQtPmxldmVsICsgMTsKIAkJc2NoZWRfZG9tYWluX2xldmVsX21heCA9IG1heChzY2hlZF9kb21haW5fbGV2ZWxfbWF4LCBzZC0+bGV2ZWwpOwogCQljaGlsZC0+cGFyZW50ID0gc2Q7Ci0JCXNkLT5jaGlsZCA9IGNoaWxkOwogCiAJCWlmICghY3B1bWFza19zdWJzZXQoc2NoZWRfZG9tYWluX3NwYW4oY2hpbGQpLAogCQkJCSAgICBzY2hlZF9kb21haW5fc3BhbihzZCkpKSB7CkBAIC02ODg0LDYgKzcwMDMsNyBAQAogCWVudW0gc19hbGxvYyBhbGxvY19zdGF0ZTsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKIAlzdHJ1Y3Qgc19kYXRhIGQ7CisJc3RydWN0IHJxICpycSA9IE5VTEw7CiAJaW50IGksIHJldCA9IC1FTk9NRU07CiAKIAlhbGxvY19zdGF0ZSA9IF9fdmlzaXRfZG9tYWluX2FsbG9jYXRpb25faGVsbCgmZCwgY3B1X21hcCk7CkBAIC02OTM0LDExICs3MDU0LDIyIEBACiAJLyogQXR0YWNoIHRoZSBkb21haW5zICovCiAJcmN1X3JlYWRfbG9jaygpOwogCWZvcl9lYWNoX2NwdShpLCBjcHVfbWFwKSB7CisJCXJxID0gY3B1X3JxKGkpOwogCQlzZCA9ICpwZXJfY3B1X3B0cihkLnNkLCBpKTsKKworCQkvKiBVc2UgUkVBRF9PTkNFKCkvV1JJVEVfT05DRSgpIHRvIGF2b2lkIGxvYWQvc3RvcmUgdGVhcmluZzogKi8KKwkJaWYgKHJxLT5jcHVfY2FwYWNpdHlfb3JpZyA+IFJFQURfT05DRShkLnJkLT5tYXhfY3B1X2NhcGFjaXR5KSkKKwkJCVdSSVRFX09OQ0UoZC5yZC0+bWF4X2NwdV9jYXBhY2l0eSwgcnEtPmNwdV9jYXBhY2l0eV9vcmlnKTsKKwogCQljcHVfYXR0YWNoX2RvbWFpbihzZCwgZC5yZCwgaSk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCisJaWYgKHJxICYmIHNjaGVkX2RlYnVnX2VuYWJsZWQpIHsKKwkJcHJfaW5mbygic3BhbjogJSpwYmwgKG1heCBjcHVfY2FwYWNpdHkgPSAlbHUpXG4iLAorCQkJY3B1bWFza19wcl9hcmdzKGNwdV9tYXApLCBycS0+cmQtPm1heF9jcHVfY2FwYWNpdHkpOworCX0KKwogCXJldCA9IDA7CiBlcnJvcjoKIAlfX2ZyZWVfZG9tYWluX2FsbG9jcygmZCwgYWxsb2Nfc3RhdGUsIGNwdV9tYXApOwpAQCAtNzI5Nyw2ICs3NDI4LDIyIEBACiB9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKK0RFRklORV9TVEFUSUNfS0VZX0ZBTFNFKHNjaGVkX3NtdF9wcmVzZW50KTsKKworc3RhdGljIHZvaWQgc2NoZWRfaW5pdF9zbXQodm9pZCkKK3sKKwkvKgorCSAqIFdlJ3ZlIGVudW1lcmF0ZWQgYWxsIENQVXMgYW5kIHdpbGwgYXNzdW1lIHRoYXQgaWYgYW55IENQVQorCSAqIGhhcyBTTVQgc2libGluZ3MsIENQVTAgd2lsbCB0b28uCisJICovCisJaWYgKGNwdW1hc2tfd2VpZ2h0KGNwdV9zbXRfbWFzaygwKSkgPiAxKQorCQlzdGF0aWNfYnJhbmNoX2VuYWJsZSgmc2NoZWRfc210X3ByZXNlbnQpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF9pbml0X3NtdCh2b2lkKSB7IH0KKyNlbmRpZgorCiB2b2lkIF9faW5pdCBzY2hlZF9pbml0X3NtcCh2b2lkKQogewogCWNwdW1hc2tfdmFyX3Qgbm9uX2lzb2xhdGVkX2NwdXM7CkBAIC03MzI2LDYgKzc0NzMsOSBAQAogCiAJaW5pdF9zY2hlZF9ydF9jbGFzcygpOwogCWluaXRfc2NoZWRfZGxfY2xhc3MoKTsKKworCXNjaGVkX2luaXRfc210KCk7CisKIAlzY2hlZF9zbXBfaW5pdGlhbGl6ZWQgPSB0cnVlOwogfQogCkBAIC03MzYzLDYgKzc1MTMsNyBAQAogI2VuZGlmCiAKIERFQ0xBUkVfUEVSX0NQVShjcHVtYXNrX3Zhcl90LCBsb2FkX2JhbGFuY2VfbWFzayk7CitERUNMQVJFX1BFUl9DUFUoY3B1bWFza192YXJfdCwgc2VsZWN0X2lkbGVfbWFzayk7CiAKIHZvaWQgX19pbml0IHNjaGVkX2luaXQodm9pZCkKIHsKQEAgLTczOTksNiArNzU1MCw4IEBACiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKIAkJcGVyX2NwdShsb2FkX2JhbGFuY2VfbWFzaywgaSkgPSAoY3B1bWFza192YXJfdClremFsbG9jX25vZGUoCiAJCQljcHVtYXNrX3NpemUoKSwgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoaSkpOworCQlwZXJfY3B1KHNlbGVjdF9pZGxlX21hc2ssIGkpID0gKGNwdW1hc2tfdmFyX3Qpa3phbGxvY19ub2RlKAorCQkJY3B1bWFza19zaXplKCksIEdGUF9LRVJORUwsIGNwdV90b19ub2RlKGkpKTsKIAl9CiAjZW5kaWYgLyogQ09ORklHX0NQVU1BU0tfT0ZGU1RBQ0sgKi8KIApAQCAtNzUwMSwxMCArNzY1NCw2IEBACiAKIAlzZXRfbG9hZF93ZWlnaHQoJmluaXRfdGFzayk7CiAKLSNpZmRlZiBDT05GSUdfUFJFRU1QVF9OT1RJRklFUlMKLQlJTklUX0hMSVNUX0hFQUQoJmluaXRfdGFzay5wcmVlbXB0X25vdGlmaWVycyk7Ci0jZW5kaWYKLQogCS8qCiAJICogVGhlIGJvb3QgaWRsZSB0aHJlYWQgZG9lcyBsYXp5IE1NVSBzd2l0Y2hpbmcgYXMgd2VsbDoKIAkgKi8KQEAgLTc1MTIsMTEgKzc2NjEsNiBAQAogCWVudGVyX2xhenlfdGxiKCZpbml0X21tLCBjdXJyZW50KTsKIAogCS8qCi0JICogRHVyaW5nIGVhcmx5IGJvb3R1cCB3ZSBwcmV0ZW5kIHRvIGJlIGEgbm9ybWFsIHRhc2s6Ci0JICovCi0JY3VycmVudC0+c2NoZWRfY2xhc3MgPSAmZmFpcl9zY2hlZF9jbGFzczsKLQotCS8qCiAJICogTWFrZSB1cyB0aGUgaWRsZSB0aHJlYWQuIFRlY2huaWNhbGx5LCBzY2hlZHVsZSgpIHNob3VsZCBub3QgYmUKIAkgKiBjYWxsZWQgZnJvbSB0aGlzIHRocmVhZCwgaG93ZXZlciBzb21ld2hlcmUgYmVsb3cgaXQgbWlnaHQgYmUsCiAJICogYnV0IGJlY2F1c2Ugd2UgYXJlIHRoZSBpZGxlIHRocmVhZCwgd2UganVzdCBwaWNrIHVwIHJ1bm5pbmcgYWdhaW4KQEAgLTc1NzAsNiArNzcxNCw3IEBACiB2b2lkIF9fX21pZ2h0X3NsZWVwKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnQgcHJlZW1wdF9vZmZzZXQpCiB7CiAJc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldl9qaWZmeTsJLyogcmF0ZWxpbWl0aW5nICovCisJdW5zaWduZWQgbG9uZyBwcmVlbXB0X2Rpc2FibGVfaXA7CiAKIAlyY3Vfc2xlZXBfY2hlY2soKTsgLyogV0FSTl9PTl9PTkNFKCkgYnkgZGVmYXVsdCwgbm8gcmF0ZSBsaW1pdCByZXFkLiAqLwogCWlmICgocHJlZW1wdF9jb3VudF9lcXVhbHMocHJlZW1wdF9vZmZzZXQpICYmICFpcnFzX2Rpc2FibGVkKCkgJiYKQEAgLTc1ODAsNiArNzcyNSw5IEBACiAJCXJldHVybjsKIAlwcmV2X2ppZmZ5ID0gamlmZmllczsKIAorCS8qIFNhdmUgdGhpcyBiZWZvcmUgY2FsbGluZyBwcmludGsoKSwgc2luY2UgdGhhdCB3aWxsIGNsb2JiZXIgaXQgKi8KKwlwcmVlbXB0X2Rpc2FibGVfaXAgPSBnZXRfcHJlZW1wdF9kaXNhYmxlX2lwKGN1cnJlbnQpOworCiAJcHJpbnRrKEtFUk5fRVJSCiAJCSJCVUc6IHNsZWVwaW5nIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIGludmFsaWQgY29udGV4dCBhdCAlczolZFxuIiwKIAkJCWZpbGUsIGxpbmUpOwpAQCAtNzU5NCwxNCArNzc0MiwxNCBAQAogCWRlYnVnX3Nob3dfaGVsZF9sb2NrcyhjdXJyZW50KTsKIAlpZiAoaXJxc19kaXNhYmxlZCgpKQogCQlwcmludF9pcnF0cmFjZV9ldmVudHMoY3VycmVudCk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1BSRUVNUFQKLQlpZiAoIXByZWVtcHRfY291bnRfZXF1YWxzKHByZWVtcHRfb2Zmc2V0KSkgeworCWlmIChJU19FTkFCTEVEKENPTkZJR19ERUJVR19QUkVFTVBUKQorCSAgICAmJiAhcHJlZW1wdF9jb3VudF9lcXVhbHMocHJlZW1wdF9vZmZzZXQpKSB7CiAJCXByX2VycigiUHJlZW1wdGlvbiBkaXNhYmxlZCBhdDoiKTsKLQkJcHJpbnRfaXBfc3ltKGN1cnJlbnQtPnByZWVtcHRfZGlzYWJsZV9pcCk7CisJCXByaW50X2lwX3N5bShwcmVlbXB0X2Rpc2FibGVfaXApOwogCQlwcl9jb250KCJcbiIpOwogCX0KLSNlbmRpZgogCWR1bXBfc3RhY2soKTsKKwlhZGRfdGFpbnQoVEFJTlRfV0FSTiwgTE9DS0RFUF9TVElMTF9PSyk7CiB9CiBFWFBPUlRfU1lNQk9MKF9fX21pZ2h0X3NsZWVwKTsKICNlbmRpZgpAQCAtNzYyMiwxMiArNzc3MCwxMCBAQAogCQlpZiAocC0+ZmxhZ3MgJiBQRl9LVEhSRUFEKQogCQkJY29udGludWU7CiAKLQkJcC0+c2UuZXhlY19zdGFydAkJPSAwOwotI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCi0JCXAtPnNlLnN0YXRpc3RpY3Mud2FpdF9zdGFydAk9IDA7Ci0JCXAtPnNlLnN0YXRpc3RpY3Muc2xlZXBfc3RhcnQJPSAwOwotCQlwLT5zZS5zdGF0aXN0aWNzLmJsb2NrX3N0YXJ0CT0gMDsKLSNlbmRpZgorCQlwLT5zZS5leGVjX3N0YXJ0ID0gMDsKKwkJc2NoZWRzdGF0X3NldChwLT5zZS5zdGF0aXN0aWNzLndhaXRfc3RhcnQsICAwKTsKKwkJc2NoZWRzdGF0X3NldChwLT5zZS5zdGF0aXN0aWNzLnNsZWVwX3N0YXJ0LCAwKTsKKwkJc2NoZWRzdGF0X3NldChwLT5zZS5zdGF0aXN0aWNzLmJsb2NrX3N0YXJ0LCAwKTsKIAogCQlpZiAoIWRsX3Rhc2socCkgJiYgIXJ0X3Rhc2socCkpIHsKIAkJCS8qCkBAIC03Njg4LDcgKzc4MzQsNyBAQAogICoKICAqIE9OTFkgVkFMSUQgV0hFTiBUSEUgV0hPTEUgU1lTVEVNIElTIFNUT1BQRUQhCiAgKi8KLXZvaWQgc2V0X2N1cnJfdGFzayhpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit2b2lkIGlhNjRfc2V0X2N1cnJfdGFzayhpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJY3B1X2N1cnIoY3B1KSA9IHA7CiB9CkBAIC03ODE5LDEwICs3OTY1LDEwIEBACiAKIAlzY2hlZF9jaGFuZ2VfZ3JvdXAodHNrLCBUQVNLX01PVkVfR1JPVVApOwogCi0JaWYgKHVubGlrZWx5KHJ1bm5pbmcpKQotCQl0c2stPnNjaGVkX2NsYXNzLT5zZXRfY3Vycl90YXNrKHJxKTsKIAlpZiAocXVldWVkKQogCQllbnF1ZXVlX3Rhc2socnEsIHRzaywgRU5RVUVVRV9SRVNUT1JFIHwgRU5RVUVVRV9NT1ZFKTsKKwlpZiAodW5saWtlbHkocnVubmluZykpCisJCXNldF9jdXJyX3Rhc2socnEsIHRzayk7CiAKIAl0YXNrX3JxX3VubG9jayhycSwgdHNrLCAmcmYpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2NwdWRlYWRsaW5lLmMgYi9rZXJuZWwvc2NoZWQvY3B1ZGVhZGxpbmUuYwppbmRleCBkNDE4NDQ5Li5lNzMxMTkwIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvY3B1ZGVhZGxpbmUuYworKysgYi9rZXJuZWwvc2NoZWQvY3B1ZGVhZGxpbmUuYwpAQCAtMzEsNTYgKzMxLDgxIEBACiAJcmV0dXJuIChpIDw8IDEpICsgMjsKIH0KIAotc3RhdGljIHZvaWQgY3B1ZGxfZXhjaGFuZ2Uoc3RydWN0IGNwdWRsICpjcCwgaW50IGEsIGludCBiKQorc3RhdGljIHZvaWQgY3B1ZGxfaGVhcGlmeV9kb3duKHN0cnVjdCBjcHVkbCAqY3AsIGludCBpZHgpCiB7Ci0JaW50IGNwdV9hID0gY3AtPmVsZW1lbnRzW2FdLmNwdSwgY3B1X2IgPSBjcC0+ZWxlbWVudHNbYl0uY3B1OworCWludCBsLCByLCBsYXJnZXN0OwogCi0Jc3dhcChjcC0+ZWxlbWVudHNbYV0uY3B1LCBjcC0+ZWxlbWVudHNbYl0uY3B1KTsKLQlzd2FwKGNwLT5lbGVtZW50c1thXS5kbCAsIGNwLT5lbGVtZW50c1tiXS5kbCApOworCWludCBvcmlnX2NwdSA9IGNwLT5lbGVtZW50c1tpZHhdLmNwdTsKKwl1NjQgb3JpZ19kbCA9IGNwLT5lbGVtZW50c1tpZHhdLmRsOwogCi0Jc3dhcChjcC0+ZWxlbWVudHNbY3B1X2FdLmlkeCwgY3AtPmVsZW1lbnRzW2NwdV9iXS5pZHgpOworCWlmIChsZWZ0X2NoaWxkKGlkeCkgPj0gY3AtPnNpemUpCisJCXJldHVybjsKKworCS8qIGFkYXB0ZWQgZnJvbSBsaWIvcHJpb19oZWFwLmMgKi8KKwl3aGlsZSgxKSB7CisJCXU2NCBsYXJnZXN0X2RsOworCQlsID0gbGVmdF9jaGlsZChpZHgpOworCQlyID0gcmlnaHRfY2hpbGQoaWR4KTsKKwkJbGFyZ2VzdCA9IGlkeDsKKwkJbGFyZ2VzdF9kbCA9IG9yaWdfZGw7CisKKwkJaWYgKChsIDwgY3AtPnNpemUpICYmIGRsX3RpbWVfYmVmb3JlKG9yaWdfZGwsCisJCQkJCQljcC0+ZWxlbWVudHNbbF0uZGwpKSB7CisJCQlsYXJnZXN0ID0gbDsKKwkJCWxhcmdlc3RfZGwgPSBjcC0+ZWxlbWVudHNbbF0uZGw7CisJCX0KKwkJaWYgKChyIDwgY3AtPnNpemUpICYmIGRsX3RpbWVfYmVmb3JlKGxhcmdlc3RfZGwsCisJCQkJCQljcC0+ZWxlbWVudHNbcl0uZGwpKQorCQkJbGFyZ2VzdCA9IHI7CisKKwkJaWYgKGxhcmdlc3QgPT0gaWR4KQorCQkJYnJlYWs7CisKKwkJLyogcHVsbCBsYXJnZXN0IGNoaWxkIG9udG8gaWR4ICovCisJCWNwLT5lbGVtZW50c1tpZHhdLmNwdSA9IGNwLT5lbGVtZW50c1tsYXJnZXN0XS5jcHU7CisJCWNwLT5lbGVtZW50c1tpZHhdLmRsID0gY3AtPmVsZW1lbnRzW2xhcmdlc3RdLmRsOworCQljcC0+ZWxlbWVudHNbY3AtPmVsZW1lbnRzW2lkeF0uY3B1XS5pZHggPSBpZHg7CisJCWlkeCA9IGxhcmdlc3Q7CisJfQorCS8qIGFjdHVhbCBwdXNoIGRvd24gb2Ygc2F2ZWQgb3JpZ2luYWwgdmFsdWVzIG9yaWdfKiAqLworCWNwLT5lbGVtZW50c1tpZHhdLmNwdSA9IG9yaWdfY3B1OworCWNwLT5lbGVtZW50c1tpZHhdLmRsID0gb3JpZ19kbDsKKwljcC0+ZWxlbWVudHNbY3AtPmVsZW1lbnRzW2lkeF0uY3B1XS5pZHggPSBpZHg7Cit9CisKK3N0YXRpYyB2b2lkIGNwdWRsX2hlYXBpZnlfdXAoc3RydWN0IGNwdWRsICpjcCwgaW50IGlkeCkKK3sKKwlpbnQgcDsKKworCWludCBvcmlnX2NwdSA9IGNwLT5lbGVtZW50c1tpZHhdLmNwdTsKKwl1NjQgb3JpZ19kbCA9IGNwLT5lbGVtZW50c1tpZHhdLmRsOworCisJaWYgKGlkeCA9PSAwKQorCQlyZXR1cm47CisKKwlkbyB7CisJCXAgPSBwYXJlbnQoaWR4KTsKKwkJaWYgKGRsX3RpbWVfYmVmb3JlKG9yaWdfZGwsIGNwLT5lbGVtZW50c1twXS5kbCkpCisJCQlicmVhazsKKwkJLyogcHVsbCBwYXJlbnQgb250byBpZHggKi8KKwkJY3AtPmVsZW1lbnRzW2lkeF0uY3B1ID0gY3AtPmVsZW1lbnRzW3BdLmNwdTsKKwkJY3AtPmVsZW1lbnRzW2lkeF0uZGwgPSBjcC0+ZWxlbWVudHNbcF0uZGw7CisJCWNwLT5lbGVtZW50c1tjcC0+ZWxlbWVudHNbaWR4XS5jcHVdLmlkeCA9IGlkeDsKKwkJaWR4ID0gcDsKKwl9IHdoaWxlIChpZHggIT0gMCk7CisJLyogYWN0dWFsIHB1c2ggdXAgb2Ygc2F2ZWQgb3JpZ2luYWwgdmFsdWVzIG9yaWdfKiAqLworCWNwLT5lbGVtZW50c1tpZHhdLmNwdSA9IG9yaWdfY3B1OworCWNwLT5lbGVtZW50c1tpZHhdLmRsID0gb3JpZ19kbDsKKwljcC0+ZWxlbWVudHNbY3AtPmVsZW1lbnRzW2lkeF0uY3B1XS5pZHggPSBpZHg7CiB9CiAKIHN0YXRpYyB2b2lkIGNwdWRsX2hlYXBpZnkoc3RydWN0IGNwdWRsICpjcCwgaW50IGlkeCkKIHsKLQlpbnQgbCwgciwgbGFyZ2VzdDsKLQotCS8qIGFkYXB0ZWQgZnJvbSBsaWIvcHJpb19oZWFwLmMgKi8KLQl3aGlsZSgxKSB7Ci0JCWwgPSBsZWZ0X2NoaWxkKGlkeCk7Ci0JCXIgPSByaWdodF9jaGlsZChpZHgpOwotCQlsYXJnZXN0ID0gaWR4OwotCi0JCWlmICgobCA8IGNwLT5zaXplKSAmJiBkbF90aW1lX2JlZm9yZShjcC0+ZWxlbWVudHNbaWR4XS5kbCwKLQkJCQkJCQljcC0+ZWxlbWVudHNbbF0uZGwpKQotCQkJbGFyZ2VzdCA9IGw7Ci0JCWlmICgociA8IGNwLT5zaXplKSAmJiBkbF90aW1lX2JlZm9yZShjcC0+ZWxlbWVudHNbbGFyZ2VzdF0uZGwsCi0JCQkJCQkJY3AtPmVsZW1lbnRzW3JdLmRsKSkKLQkJCWxhcmdlc3QgPSByOwotCQlpZiAobGFyZ2VzdCA9PSBpZHgpCi0JCQlicmVhazsKLQotCQkvKiBQdXNoIGlkeCBkb3duIHRoZSBoZWFwIG9uZSBsZXZlbCBhbmQgYnVtcCBvbmUgdXAgKi8KLQkJY3B1ZGxfZXhjaGFuZ2UoY3AsIGxhcmdlc3QsIGlkeCk7Ci0JCWlkeCA9IGxhcmdlc3Q7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjcHVkbF9jaGFuZ2Vfa2V5KHN0cnVjdCBjcHVkbCAqY3AsIGludCBpZHgsIHU2NCBuZXdfZGwpCi17Ci0JV0FSTl9PTihpZHggPT0gSURYX0lOVkFMSUQgfHwgIWNwdV9wcmVzZW50KGlkeCkpOwotCi0JaWYgKGRsX3RpbWVfYmVmb3JlKG5ld19kbCwgY3AtPmVsZW1lbnRzW2lkeF0uZGwpKSB7Ci0JCWNwLT5lbGVtZW50c1tpZHhdLmRsID0gbmV3X2RsOwotCQljcHVkbF9oZWFwaWZ5KGNwLCBpZHgpOwotCX0gZWxzZSB7Ci0JCWNwLT5lbGVtZW50c1tpZHhdLmRsID0gbmV3X2RsOwotCQl3aGlsZSAoaWR4ID4gMCAmJiBkbF90aW1lX2JlZm9yZShjcC0+ZWxlbWVudHNbcGFyZW50KGlkeCldLmRsLAotCQkJCQljcC0+ZWxlbWVudHNbaWR4XS5kbCkpIHsKLQkJCWNwdWRsX2V4Y2hhbmdlKGNwLCBpZHgsIHBhcmVudChpZHgpKTsKLQkJCWlkeCA9IHBhcmVudChpZHgpOwotCQl9Ci0JfQorCWlmIChpZHggPiAwICYmIGRsX3RpbWVfYmVmb3JlKGNwLT5lbGVtZW50c1twYXJlbnQoaWR4KV0uZGwsCisJCQkJY3AtPmVsZW1lbnRzW2lkeF0uZGwpKQorCQljcHVkbF9oZWFwaWZ5X3VwKGNwLCBpZHgpOworCWVsc2UKKwkJY3B1ZGxfaGVhcGlmeV9kb3duKGNwLCBpZHgpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBjcHVkbF9tYXhpbXVtKHN0cnVjdCBjcHVkbCAqY3ApCkBAIC0xMjAsNiArMTQ1LDQ1IEBACiB9CiAKIC8qCisgKiBjcHVkbF9jbGVhciAtIHJlbW92ZSBhIGNwdSBmcm9tIHRoZSBjcHVkbCBtYXgtaGVhcAorICogQGNwOiB0aGUgY3B1ZGwgbWF4LWhlYXAgY29udGV4dAorICogQGNwdTogdGhlIHRhcmdldCBjcHUKKyAqCisgKiBOb3RlczogYXNzdW1lcyBjcHVfcnEoY3B1KS0+bG9jayBpcyBsb2NrZWQKKyAqCisgKiBSZXR1cm5zOiAodm9pZCkKKyAqLwordm9pZCBjcHVkbF9jbGVhcihzdHJ1Y3QgY3B1ZGwgKmNwLCBpbnQgY3B1KQoreworCWludCBvbGRfaWR4LCBuZXdfY3B1OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlXQVJOX09OKCFjcHVfcHJlc2VudChjcHUpKTsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmY3AtPmxvY2ssIGZsYWdzKTsKKworCW9sZF9pZHggPSBjcC0+ZWxlbWVudHNbY3B1XS5pZHg7CisJaWYgKG9sZF9pZHggPT0gSURYX0lOVkFMSUQpIHsKKwkJLyoKKwkJICogTm90aGluZyB0byByZW1vdmUgaWYgb2xkX2lkeCB3YXMgaW52YWxpZC4KKwkJICogVGhpcyBjb3VsZCBoYXBwZW4gaWYgYSBycV9vZmZsaW5lX2RsIGlzCisJCSAqIGNhbGxlZCBmb3IgYSBDUFUgd2l0aG91dCAtZGwgdGFza3MgcnVubmluZy4KKwkJICovCisJfSBlbHNlIHsKKwkJbmV3X2NwdSA9IGNwLT5lbGVtZW50c1tjcC0+c2l6ZSAtIDFdLmNwdTsKKwkJY3AtPmVsZW1lbnRzW29sZF9pZHhdLmRsID0gY3AtPmVsZW1lbnRzW2NwLT5zaXplIC0gMV0uZGw7CisJCWNwLT5lbGVtZW50c1tvbGRfaWR4XS5jcHUgPSBuZXdfY3B1OworCQljcC0+c2l6ZS0tOworCQljcC0+ZWxlbWVudHNbbmV3X2NwdV0uaWR4ID0gb2xkX2lkeDsKKwkJY3AtPmVsZW1lbnRzW2NwdV0uaWR4ID0gSURYX0lOVkFMSUQ7CisJCWNwdWRsX2hlYXBpZnkoY3AsIG9sZF9pZHgpOworCisJCWNwdW1hc2tfc2V0X2NwdShjcHUsIGNwLT5mcmVlX2NwdXMpOworCX0KKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3AtPmxvY2ssIGZsYWdzKTsKK30KKworLyoKICAqIGNwdWRsX3NldCAtIHVwZGF0ZSB0aGUgY3B1ZGwgbWF4LWhlYXAKICAqIEBjcDogdGhlIGNwdWRsIG1heC1oZWFwIGNvbnRleHQKICAqIEBjcHU6IHRoZSB0YXJnZXQgY3B1CkBAIC0xMjksNTUgKzE5MywyOCBAQAogICoKICAqIFJldHVybnM6ICh2b2lkKQogICovCi12b2lkIGNwdWRsX3NldChzdHJ1Y3QgY3B1ZGwgKmNwLCBpbnQgY3B1LCB1NjQgZGwsIGludCBpc192YWxpZCkKK3ZvaWQgY3B1ZGxfc2V0KHN0cnVjdCBjcHVkbCAqY3AsIGludCBjcHUsIHU2NCBkbCkKIHsKLQlpbnQgb2xkX2lkeCwgbmV3X2NwdTsKKwlpbnQgb2xkX2lkeDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJV0FSTl9PTighY3B1X3ByZXNlbnQoY3B1KSk7CiAKIAlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmNwLT5sb2NrLCBmbGFncyk7CisKIAlvbGRfaWR4ID0gY3AtPmVsZW1lbnRzW2NwdV0uaWR4OwotCWlmICghaXNfdmFsaWQpIHsKLQkJLyogcmVtb3ZlIGl0ZW0gKi8KLQkJaWYgKG9sZF9pZHggPT0gSURYX0lOVkFMSUQpIHsKLQkJCS8qCi0JCQkgKiBOb3RoaW5nIHRvIHJlbW92ZSBpZiBvbGRfaWR4IHdhcyBpbnZhbGlkLgotCQkJICogVGhpcyBjb3VsZCBoYXBwZW4gaWYgYSBycV9vZmZsaW5lX2RsIGlzCi0JCQkgKiBjYWxsZWQgZm9yIGEgQ1BVIHdpdGhvdXQgLWRsIHRhc2tzIHJ1bm5pbmcuCi0JCQkgKi8KLQkJCWdvdG8gb3V0OwotCQl9Ci0JCW5ld19jcHUgPSBjcC0+ZWxlbWVudHNbY3AtPnNpemUgLSAxXS5jcHU7Ci0JCWNwLT5lbGVtZW50c1tvbGRfaWR4XS5kbCA9IGNwLT5lbGVtZW50c1tjcC0+c2l6ZSAtIDFdLmRsOwotCQljcC0+ZWxlbWVudHNbb2xkX2lkeF0uY3B1ID0gbmV3X2NwdTsKLQkJY3AtPnNpemUtLTsKLQkJY3AtPmVsZW1lbnRzW25ld19jcHVdLmlkeCA9IG9sZF9pZHg7Ci0JCWNwLT5lbGVtZW50c1tjcHVdLmlkeCA9IElEWF9JTlZBTElEOwotCQl3aGlsZSAob2xkX2lkeCA+IDAgJiYgZGxfdGltZV9iZWZvcmUoCi0JCQkJY3AtPmVsZW1lbnRzW3BhcmVudChvbGRfaWR4KV0uZGwsCi0JCQkJY3AtPmVsZW1lbnRzW29sZF9pZHhdLmRsKSkgewotCQkJY3B1ZGxfZXhjaGFuZ2UoY3AsIG9sZF9pZHgsIHBhcmVudChvbGRfaWR4KSk7Ci0JCQlvbGRfaWR4ID0gcGFyZW50KG9sZF9pZHgpOwotCQl9Ci0JCWNwdW1hc2tfc2V0X2NwdShjcHUsIGNwLT5mcmVlX2NwdXMpOwotICAgICAgICAgICAgICAgIGNwdWRsX2hlYXBpZnkoY3AsIG9sZF9pZHgpOwotCi0JCWdvdG8gb3V0OwotCX0KLQogCWlmIChvbGRfaWR4ID09IElEWF9JTlZBTElEKSB7Ci0JCWNwLT5zaXplKys7Ci0JCWNwLT5lbGVtZW50c1tjcC0+c2l6ZSAtIDFdLmRsID0gZGw7Ci0JCWNwLT5lbGVtZW50c1tjcC0+c2l6ZSAtIDFdLmNwdSA9IGNwdTsKLQkJY3AtPmVsZW1lbnRzW2NwdV0uaWR4ID0gY3AtPnNpemUgLSAxOwotCQljcHVkbF9jaGFuZ2Vfa2V5KGNwLCBjcC0+c2l6ZSAtIDEsIGRsKTsKKwkJaW50IG5ld19pZHggPSBjcC0+c2l6ZSsrOworCQljcC0+ZWxlbWVudHNbbmV3X2lkeF0uZGwgPSBkbDsKKwkJY3AtPmVsZW1lbnRzW25ld19pZHhdLmNwdSA9IGNwdTsKKwkJY3AtPmVsZW1lbnRzW2NwdV0uaWR4ID0gbmV3X2lkeDsKKwkJY3B1ZGxfaGVhcGlmeV91cChjcCwgbmV3X2lkeCk7CiAJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgY3AtPmZyZWVfY3B1cyk7CiAJfSBlbHNlIHsKLQkJY3B1ZGxfY2hhbmdlX2tleShjcCwgb2xkX2lkeCwgZGwpOworCQljcC0+ZWxlbWVudHNbb2xkX2lkeF0uZGwgPSBkbDsKKwkJY3B1ZGxfaGVhcGlmeShjcCwgb2xkX2lkeCk7CiAJfQogCi1vdXQ6CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwLT5sb2NrLCBmbGFncyk7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9jcHVkZWFkbGluZS5oIGIva2VybmVsL3NjaGVkL2NwdWRlYWRsaW5lLmgKaW5kZXggZmNiZGY4My4uZjdkYThjNSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2NwdWRlYWRsaW5lLmgKKysrIGIva2VybmVsL3NjaGVkL2NwdWRlYWRsaW5lLmgKQEAgLTIzLDcgKzIzLDggQEAKICNpZmRlZiBDT05GSUdfU01QCiBpbnQgY3B1ZGxfZmluZChzdHJ1Y3QgY3B1ZGwgKmNwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCiAJICAgICAgIHN0cnVjdCBjcHVtYXNrICpsYXRlcl9tYXNrKTsKLXZvaWQgY3B1ZGxfc2V0KHN0cnVjdCBjcHVkbCAqY3AsIGludCBjcHUsIHU2NCBkbCwgaW50IGlzX3ZhbGlkKTsKK3ZvaWQgY3B1ZGxfc2V0KHN0cnVjdCBjcHVkbCAqY3AsIGludCBjcHUsIHU2NCBkbCk7Cit2b2lkIGNwdWRsX2NsZWFyKHN0cnVjdCBjcHVkbCAqY3AsIGludCBjcHUpOwogaW50IGNwdWRsX2luaXQoc3RydWN0IGNwdWRsICpjcCk7CiB2b2lkIGNwdWRsX3NldF9mcmVlY3B1KHN0cnVjdCBjcHVkbCAqY3AsIGludCBjcHUpOwogdm9pZCBjcHVkbF9jbGVhcl9mcmVlY3B1KHN0cnVjdCBjcHVkbCAqY3AsIGludCBjcHUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2NwdWZyZXEuYyBiL2tlcm5lbC9zY2hlZC9jcHVmcmVxLmMKaW5kZXggMTE0MTk1NC4uZGJjNTE0NCAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2NwdWZyZXEuYworKysgYi9rZXJuZWwvc2NoZWQvY3B1ZnJlcS5jCkBAIC0zMyw3ICszMyw3IEBACiAgKi8KIHZvaWQgY3B1ZnJlcV9hZGRfdXBkYXRlX3V0aWxfaG9vayhpbnQgY3B1LCBzdHJ1Y3QgdXBkYXRlX3V0aWxfZGF0YSAqZGF0YSwKIAkJCXZvaWQgKCpmdW5jKShzdHJ1Y3QgdXBkYXRlX3V0aWxfZGF0YSAqZGF0YSwgdTY0IHRpbWUsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIHV0aWwsIHVuc2lnbmVkIGxvbmcgbWF4KSkKKwkJCQkgICAgIHVuc2lnbmVkIGludCBmbGFncykpCiB7CiAJaWYgKFdBUk5fT04oIWRhdGEgfHwgIWZ1bmMpKQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvY3B1ZnJlcV9zY2hlZHV0aWwuYyBiL2tlcm5lbC9zY2hlZC9jcHVmcmVxX3NjaGVkdXRpbC5jCmluZGV4IGE4NDY0MWIuLjY5ZTA2ODkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9jcHVmcmVxX3NjaGVkdXRpbC5jCisrKyBiL2tlcm5lbC9zY2hlZC9jcHVmcmVxX3NjaGVkdXRpbC5jCkBAIC0xMiw3ICsxMiw2IEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9wb3dlci5oPgogCkBAIC00OCwxMSArNDcsMTQgQEAKIAlzdHJ1Y3Qgc3Vnb3ZfcG9saWN5ICpzZ19wb2xpY3k7CiAKIAl1bnNpZ25lZCBpbnQgY2FjaGVkX3Jhd19mcmVxOworCXVuc2lnbmVkIGxvbmcgaW93YWl0X2Jvb3N0OworCXVuc2lnbmVkIGxvbmcgaW93YWl0X2Jvb3N0X21heDsKKwl1NjQgbGFzdF91cGRhdGU7CiAKIAkvKiBUaGUgZmllbGRzIGJlbG93IGFyZSBvbmx5IG5lZWRlZCB3aGVuIHNoYXJpbmcgYSBwb2xpY3kuICovCiAJdW5zaWduZWQgbG9uZyB1dGlsOwogCXVuc2lnbmVkIGxvbmcgbWF4OwotCXU2NCBsYXN0X3VwZGF0ZTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiB9OwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHN1Z292X2NwdSwgc3Vnb3ZfY3B1KTsKQEAgLTE0NCwyNCArMTQ2LDc1IEBACiAJcmV0dXJuIGNwdWZyZXFfZHJpdmVyX3Jlc29sdmVfZnJlcShwb2xpY3ksIGZyZXEpOwogfQogCitzdGF0aWMgdm9pZCBzdWdvdl9nZXRfdXRpbCh1bnNpZ25lZCBsb25nICp1dGlsLCB1bnNpZ25lZCBsb25nICptYXgpCit7CisJc3RydWN0IHJxICpycSA9IHRoaXNfcnEoKTsKKwl1bnNpZ25lZCBsb25nIGNmc19tYXg7CisKKwljZnNfbWF4ID0gYXJjaF9zY2FsZV9jcHVfY2FwYWNpdHkoTlVMTCwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCSp1dGlsID0gbWluKHJxLT5jZnMuYXZnLnV0aWxfYXZnLCBjZnNfbWF4KTsKKwkqbWF4ID0gY2ZzX21heDsKK30KKworc3RhdGljIHZvaWQgc3Vnb3Zfc2V0X2lvd2FpdF9ib29zdChzdHJ1Y3Qgc3Vnb3ZfY3B1ICpzZ19jcHUsIHU2NCB0aW1lLAorCQkJCSAgIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpZiAoZmxhZ3MgJiBTQ0hFRF9DUFVGUkVRX0lPV0FJVCkgeworCQlzZ19jcHUtPmlvd2FpdF9ib29zdCA9IHNnX2NwdS0+aW93YWl0X2Jvb3N0X21heDsKKwl9IGVsc2UgaWYgKHNnX2NwdS0+aW93YWl0X2Jvb3N0KSB7CisJCXM2NCBkZWx0YV9ucyA9IHRpbWUgLSBzZ19jcHUtPmxhc3RfdXBkYXRlOworCisJCS8qIENsZWFyIGlvd2FpdF9ib29zdCBpZiB0aGUgQ1BVIGFwcHJlYXJzIHRvIGhhdmUgYmVlbiBpZGxlLiAqLworCQlpZiAoZGVsdGFfbnMgPiBUSUNLX05TRUMpCisJCQlzZ19jcHUtPmlvd2FpdF9ib29zdCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdWdvdl9pb3dhaXRfYm9vc3Qoc3RydWN0IHN1Z292X2NwdSAqc2dfY3B1LCB1bnNpZ25lZCBsb25nICp1dGlsLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm1heCkKK3sKKwl1bnNpZ25lZCBsb25nIGJvb3N0X3V0aWwgPSBzZ19jcHUtPmlvd2FpdF9ib29zdDsKKwl1bnNpZ25lZCBsb25nIGJvb3N0X21heCA9IHNnX2NwdS0+aW93YWl0X2Jvb3N0X21heDsKKworCWlmICghYm9vc3RfdXRpbCkKKwkJcmV0dXJuOworCisJaWYgKCp1dGlsICogYm9vc3RfbWF4IDwgKm1heCAqIGJvb3N0X3V0aWwpIHsKKwkJKnV0aWwgPSBib29zdF91dGlsOworCQkqbWF4ID0gYm9vc3RfbWF4OworCX0KKwlzZ19jcHUtPmlvd2FpdF9ib29zdCA+Pj0gMTsKK30KKwogc3RhdGljIHZvaWQgc3Vnb3ZfdXBkYXRlX3NpbmdsZShzdHJ1Y3QgdXBkYXRlX3V0aWxfZGF0YSAqaG9vaywgdTY0IHRpbWUsCi0JCQkJdW5zaWduZWQgbG9uZyB1dGlsLCB1bnNpZ25lZCBsb25nIG1heCkKKwkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHN1Z292X2NwdSAqc2dfY3B1ID0gY29udGFpbmVyX29mKGhvb2ssIHN0cnVjdCBzdWdvdl9jcHUsIHVwZGF0ZV91dGlsKTsKIAlzdHJ1Y3Qgc3Vnb3ZfcG9saWN5ICpzZ19wb2xpY3kgPSBzZ19jcHUtPnNnX3BvbGljeTsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSA9IHNnX3BvbGljeS0+cG9saWN5OworCXVuc2lnbmVkIGxvbmcgdXRpbCwgbWF4OwogCXVuc2lnbmVkIGludCBuZXh0X2Y7CiAKKwlzdWdvdl9zZXRfaW93YWl0X2Jvb3N0KHNnX2NwdSwgdGltZSwgZmxhZ3MpOworCXNnX2NwdS0+bGFzdF91cGRhdGUgPSB0aW1lOworCiAJaWYgKCFzdWdvdl9zaG91bGRfdXBkYXRlX2ZyZXEoc2dfcG9saWN5LCB0aW1lKSkKIAkJcmV0dXJuOwogCi0JbmV4dF9mID0gdXRpbCA9PSBVTE9OR19NQVggPyBwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEgOgotCQkJZ2V0X25leHRfZnJlcShzZ19jcHUsIHV0aWwsIG1heCk7CisJaWYgKGZsYWdzICYgU0NIRURfQ1BVRlJFUV9SVF9ETCkgeworCQluZXh0X2YgPSBwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXE7CisJfSBlbHNlIHsKKwkJc3Vnb3ZfZ2V0X3V0aWwoJnV0aWwsICZtYXgpOworCQlzdWdvdl9pb3dhaXRfYm9vc3Qoc2dfY3B1LCAmdXRpbCwgJm1heCk7CisJCW5leHRfZiA9IGdldF9uZXh0X2ZyZXEoc2dfY3B1LCB1dGlsLCBtYXgpOworCX0KIAlzdWdvdl91cGRhdGVfY29tbWl0KHNnX3BvbGljeSwgdGltZSwgbmV4dF9mKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBzdWdvdl9uZXh0X2ZyZXFfc2hhcmVkKHN0cnVjdCBzdWdvdl9jcHUgKnNnX2NwdSwKLQkJCQkJICAgdW5zaWduZWQgbG9uZyB1dGlsLCB1bnNpZ25lZCBsb25nIG1heCkKKwkJCQkJICAgdW5zaWduZWQgbG9uZyB1dGlsLCB1bnNpZ25lZCBsb25nIG1heCwKKwkJCQkJICAgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCBzdWdvdl9wb2xpY3kgKnNnX3BvbGljeSA9IHNnX2NwdS0+c2dfcG9saWN5OwogCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5ID0gc2dfcG9saWN5LT5wb2xpY3k7CkBAIC0xNjksOSArMjIyLDExIEBACiAJdTY0IGxhc3RfZnJlcV91cGRhdGVfdGltZSA9IHNnX3BvbGljeS0+bGFzdF9mcmVxX3VwZGF0ZV90aW1lOwogCXVuc2lnbmVkIGludCBqOwogCi0JaWYgKHV0aWwgPT0gVUxPTkdfTUFYKQorCWlmIChmbGFncyAmIFNDSEVEX0NQVUZSRVFfUlRfREwpCiAJCXJldHVybiBtYXhfZjsKIAorCXN1Z292X2lvd2FpdF9ib29zdChzZ19jcHUsICZ1dGlsLCAmbWF4KTsKKwogCWZvcl9lYWNoX2NwdShqLCBwb2xpY3ktPmNwdXMpIHsKIAkJc3RydWN0IHN1Z292X2NwdSAqal9zZ19jcHU7CiAJCXVuc2lnbmVkIGxvbmcgal91dGlsLCBqX21heDsKQEAgLTE4Niw0MSArMjQxLDUwIEBACiAJCSAqIGZyZXF1ZW5jeSB1cGRhdGUgYW5kIHRoZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiB0aGUgbGFzdCB1cGRhdGUKIAkJICogb2YgdGhlIENQVSB1dGlsaXphdGlvbiBhbmQgdGhlIGxhc3QgZnJlcXVlbmN5IHVwZGF0ZSBpcyBsb25nCiAJCSAqIGVub3VnaCwgZG9uJ3QgdGFrZSB0aGUgQ1BVIGludG8gYWNjb3VudCBhcyBpdCBwcm9iYWJseSBpcwotCQkgKiBpZGxlIG5vdy4KKwkJICogaWRsZSBub3cgKGFuZCBjbGVhciBpb3dhaXRfYm9vc3QgZm9yIGl0KS4KIAkJICovCiAJCWRlbHRhX25zID0gbGFzdF9mcmVxX3VwZGF0ZV90aW1lIC0gal9zZ19jcHUtPmxhc3RfdXBkYXRlOwotCQlpZiAoZGVsdGFfbnMgPiBUSUNLX05TRUMpCisJCWlmIChkZWx0YV9ucyA+IFRJQ0tfTlNFQykgeworCQkJal9zZ19jcHUtPmlvd2FpdF9ib29zdCA9IDA7CiAJCQljb250aW51ZTsKLQotCQlqX3V0aWwgPSBqX3NnX2NwdS0+dXRpbDsKLQkJaWYgKGpfdXRpbCA9PSBVTE9OR19NQVgpCisJCX0KKwkJaWYgKGpfc2dfY3B1LT5mbGFncyAmIFNDSEVEX0NQVUZSRVFfUlRfREwpCiAJCQlyZXR1cm4gbWF4X2Y7CiAKKwkJal91dGlsID0gal9zZ19jcHUtPnV0aWw7CiAJCWpfbWF4ID0gal9zZ19jcHUtPm1heDsKIAkJaWYgKGpfdXRpbCAqIG1heCA+IGpfbWF4ICogdXRpbCkgewogCQkJdXRpbCA9IGpfdXRpbDsKIAkJCW1heCA9IGpfbWF4OwogCQl9CisKKwkJc3Vnb3ZfaW93YWl0X2Jvb3N0KGpfc2dfY3B1LCAmdXRpbCwgJm1heCk7CiAJfQogCiAJcmV0dXJuIGdldF9uZXh0X2ZyZXEoc2dfY3B1LCB1dGlsLCBtYXgpOwogfQogCiBzdGF0aWMgdm9pZCBzdWdvdl91cGRhdGVfc2hhcmVkKHN0cnVjdCB1cGRhdGVfdXRpbF9kYXRhICpob29rLCB1NjQgdGltZSwKLQkJCQl1bnNpZ25lZCBsb25nIHV0aWwsIHVuc2lnbmVkIGxvbmcgbWF4KQorCQkJCXVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc3Vnb3ZfY3B1ICpzZ19jcHUgPSBjb250YWluZXJfb2YoaG9vaywgc3RydWN0IHN1Z292X2NwdSwgdXBkYXRlX3V0aWwpOwogCXN0cnVjdCBzdWdvdl9wb2xpY3kgKnNnX3BvbGljeSA9IHNnX2NwdS0+c2dfcG9saWN5OworCXVuc2lnbmVkIGxvbmcgdXRpbCwgbWF4OwogCXVuc2lnbmVkIGludCBuZXh0X2Y7CiAKKwlzdWdvdl9nZXRfdXRpbCgmdXRpbCwgJm1heCk7CisKIAlyYXdfc3Bpbl9sb2NrKCZzZ19wb2xpY3ktPnVwZGF0ZV9sb2NrKTsKIAogCXNnX2NwdS0+dXRpbCA9IHV0aWw7CiAJc2dfY3B1LT5tYXggPSBtYXg7CisJc2dfY3B1LT5mbGFncyA9IGZsYWdzOworCisJc3Vnb3Zfc2V0X2lvd2FpdF9ib29zdChzZ19jcHUsIHRpbWUsIGZsYWdzKTsKIAlzZ19jcHUtPmxhc3RfdXBkYXRlID0gdGltZTsKIAogCWlmIChzdWdvdl9zaG91bGRfdXBkYXRlX2ZyZXEoc2dfcG9saWN5LCB0aW1lKSkgewotCQluZXh0X2YgPSBzdWdvdl9uZXh0X2ZyZXFfc2hhcmVkKHNnX2NwdSwgdXRpbCwgbWF4KTsKKwkJbmV4dF9mID0gc3Vnb3ZfbmV4dF9mcmVxX3NoYXJlZChzZ19jcHUsIHV0aWwsIG1heCwgZmxhZ3MpOwogCQlzdWdvdl91cGRhdGVfY29tbWl0KHNnX3BvbGljeSwgdGltZSwgbmV4dF9mKTsKIAl9CiAKQEAgLTQ0NCwxMCArNTA4LDEzIEBACiAKIAkJc2dfY3B1LT5zZ19wb2xpY3kgPSBzZ19wb2xpY3k7CiAJCWlmIChwb2xpY3lfaXNfc2hhcmVkKHBvbGljeSkpIHsKLQkJCXNnX2NwdS0+dXRpbCA9IFVMT05HX01BWDsKKwkJCXNnX2NwdS0+dXRpbCA9IDA7CiAJCQlzZ19jcHUtPm1heCA9IDA7CisJCQlzZ19jcHUtPmZsYWdzID0gU0NIRURfQ1BVRlJFUV9SVDsKIAkJCXNnX2NwdS0+bGFzdF91cGRhdGUgPSAwOwogCQkJc2dfY3B1LT5jYWNoZWRfcmF3X2ZyZXEgPSAwOworCQkJc2dfY3B1LT5pb3dhaXRfYm9vc3QgPSAwOworCQkJc2dfY3B1LT5pb3dhaXRfYm9vc3RfbWF4ID0gcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxOwogCQkJY3B1ZnJlcV9hZGRfdXBkYXRlX3V0aWxfaG9vayhjcHUsICZzZ19jcHUtPnVwZGF0ZV91dGlsLAogCQkJCQkJICAgICBzdWdvdl91cGRhdGVfc2hhcmVkKTsKIAkJfSBlbHNlIHsKQEAgLTQ5NSwyOCArNTYyLDE1IEBACiAJLmxpbWl0cyA9IHN1Z292X2xpbWl0cywKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHN1Z292X21vZHVsZV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZ292ZXJub3IoJnNjaGVkdXRpbF9nb3YpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc3Vnb3ZfbW9kdWxlX2V4aXQodm9pZCkKLXsKLQljcHVmcmVxX3VucmVnaXN0ZXJfZ292ZXJub3IoJnNjaGVkdXRpbF9nb3YpOwotfQotCi1NT0RVTEVfQVVUSE9SKCJSYWZhZWwgSi4gV3lzb2NraSA8cmFmYWVsLmoud3lzb2NraUBpbnRlbC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlV0aWxpemF0aW9uLWJhc2VkIENQVSBmcmVxdWVuY3kgc2VsZWN0aW9uIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfU0NIRURVVElMCiBzdHJ1Y3QgY3B1ZnJlcV9nb3Zlcm5vciAqY3B1ZnJlcV9kZWZhdWx0X2dvdmVybm9yKHZvaWQpCiB7CiAJcmV0dXJuICZzY2hlZHV0aWxfZ292OwogfQotCi1mc19pbml0Y2FsbChzdWdvdl9tb2R1bGVfaW5pdCk7Ci0jZWxzZQotbW9kdWxlX2luaXQoc3Vnb3ZfbW9kdWxlX2luaXQpOwogI2VuZGlmCi1tb2R1bGVfZXhpdChzdWdvdl9tb2R1bGVfZXhpdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHN1Z292X3JlZ2lzdGVyKHZvaWQpCit7CisJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZ292ZXJub3IoJnNjaGVkdXRpbF9nb3YpOworfQorZnNfaW5pdGNhbGwoc3Vnb3ZfcmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2NwdXRpbWUuYyBiL2tlcm5lbC9zY2hlZC9jcHV0aW1lLmMKaW5kZXggOTg1ODI2Ni4uNWViZWUzMSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2NwdXRpbWUuYworKysgYi9rZXJuZWwvc2NoZWQvY3B1dGltZS5jCkBAIC0yMywxMCArMjMsOCBAQAogICogdGFzayB3aGVuIGlycSBpcyBpbiBwcm9ncmVzcyB3aGlsZSB3ZSByZWFkIHJxLT5jbG9jay4gVGhhdCBpcyBhIHdvcnRoeQogICogY29tcHJvbWlzZSBpbiBwbGFjZSBvZiBoYXZpbmcgbG9ja3Mgb24gZWFjaCBpcnEgaW4gYWNjb3VudF9zeXN0ZW1fdGltZS4KICAqLwotREVGSU5FX1BFUl9DUFUodTY0LCBjcHVfaGFyZGlycV90aW1lKTsKLURFRklORV9QRVJfQ1BVKHU2NCwgY3B1X3NvZnRpcnFfdGltZSk7CitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaXJxdGltZSwgY3B1X2lycXRpbWUpOwogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUodTY0LCBpcnFfc3RhcnRfdGltZSk7CiBzdGF0aWMgaW50IHNjaGVkX2Nsb2NrX2lycXRpbWU7CiAKIHZvaWQgZW5hYmxlX3NjaGVkX2Nsb2NrX2lycXRpbWUodm9pZCkKQEAgLTM5LDE2ICszNywxMyBAQAogCXNjaGVkX2Nsb2NrX2lycXRpbWUgPSAwOwogfQogCi0jaWZuZGVmIENPTkZJR182NEJJVAotREVGSU5FX1BFUl9DUFUoc2VxY291bnRfdCwgaXJxX3RpbWVfc2VxKTsKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KLQogLyoKICAqIENhbGxlZCBiZWZvcmUgaW5jcmVtZW50aW5nIHByZWVtcHRfY291bnQgb24ge3NvZnQsfWlycV9lbnRlcgogICogYW5kIGJlZm9yZSBkZWNyZW1lbnRpbmcgcHJlZW1wdF9jb3VudCBvbiB7c29mdCx9aXJxX2V4aXQuCiAgKi8KIHZvaWQgaXJxdGltZV9hY2NvdW50X2lycShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIpCiB7CisJc3RydWN0IGlycXRpbWUgKmlycXRpbWUgPSB0aGlzX2NwdV9wdHIoJmNwdV9pcnF0aW1lKTsKIAlzNjQgZGVsdGE7CiAJaW50IGNwdTsKIApAQCAtNTYsMTAgKzUxLDEwIEBACiAJCXJldHVybjsKIAogCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlkZWx0YSA9IHNjaGVkX2Nsb2NrX2NwdShjcHUpIC0gX190aGlzX2NwdV9yZWFkKGlycV9zdGFydF90aW1lKTsKLQlfX3RoaXNfY3B1X2FkZChpcnFfc3RhcnRfdGltZSwgZGVsdGEpOworCWRlbHRhID0gc2NoZWRfY2xvY2tfY3B1KGNwdSkgLSBpcnF0aW1lLT5pcnFfc3RhcnRfdGltZTsKKwlpcnF0aW1lLT5pcnFfc3RhcnRfdGltZSArPSBkZWx0YTsKIAotCWlycV90aW1lX3dyaXRlX2JlZ2luKCk7CisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmaXJxdGltZS0+c3luYyk7CiAJLyoKIAkgKiBXZSBkbyBub3QgYWNjb3VudCBmb3Igc29mdGlycSB0aW1lIGZyb20ga3NvZnRpcnFkIGhlcmUuCiAJICogV2Ugd2FudCB0byBjb250aW51ZSBhY2NvdW50aW5nIHNvZnRpcnEgdGltZSB0byBrc29mdGlycWQgdGhyZWFkCkBAIC02Nyw0MiArNjIsMzYgQEAKIAkgKiB0aGF0IGRvIG5vdCBjb25zdW1lIGFueSB0aW1lLCBidXQgc3RpbGwgd2FudHMgdG8gcnVuLgogCSAqLwogCWlmIChoYXJkaXJxX2NvdW50KCkpCi0JCV9fdGhpc19jcHVfYWRkKGNwdV9oYXJkaXJxX3RpbWUsIGRlbHRhKTsKKwkJaXJxdGltZS0+aGFyZGlycV90aW1lICs9IGRlbHRhOwogCWVsc2UgaWYgKGluX3NlcnZpbmdfc29mdGlycSgpICYmIGN1cnIgIT0gdGhpc19jcHVfa3NvZnRpcnFkKCkpCi0JCV9fdGhpc19jcHVfYWRkKGNwdV9zb2Z0aXJxX3RpbWUsIGRlbHRhKTsKKwkJaXJxdGltZS0+c29mdGlycV90aW1lICs9IGRlbHRhOwogCi0JaXJxX3RpbWVfd3JpdGVfZW5kKCk7CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJmlycXRpbWUtPnN5bmMpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXJxdGltZV9hY2NvdW50X2lycSk7CiAKLXN0YXRpYyBjcHV0aW1lX3QgaXJxdGltZV9hY2NvdW50X2hpX3VwZGF0ZShjcHV0aW1lX3QgbWF4dGltZSkKK3N0YXRpYyBjcHV0aW1lX3QgaXJxdGltZV9hY2NvdW50X3VwZGF0ZSh1NjQgaXJxdGltZSwgaW50IGlkeCwgY3B1dGltZV90IG1heHRpbWUpCiB7CiAJdTY0ICpjcHVzdGF0ID0ga2NwdXN0YXRfdGhpc19jcHUtPmNwdXN0YXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAljcHV0aW1lX3QgaXJxX2NwdXRpbWU7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaXJxX2NwdXRpbWUgPSBuc2Vjc190b19jcHV0aW1lNjQodGhpc19jcHVfcmVhZChjcHVfaGFyZGlycV90aW1lKSkgLQotCQkgICAgICBjcHVzdGF0W0NQVVRJTUVfSVJRXTsKKwlpcnFfY3B1dGltZSA9IG5zZWNzX3RvX2NwdXRpbWU2NChpcnF0aW1lKSAtIGNwdXN0YXRbaWR4XTsKIAlpcnFfY3B1dGltZSA9IG1pbihpcnFfY3B1dGltZSwgbWF4dGltZSk7Ci0JY3B1c3RhdFtDUFVUSU1FX0lSUV0gKz0gaXJxX2NwdXRpbWU7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWNwdXN0YXRbaWR4XSArPSBpcnFfY3B1dGltZTsKKwogCXJldHVybiBpcnFfY3B1dGltZTsKIH0KIAorc3RhdGljIGNwdXRpbWVfdCBpcnF0aW1lX2FjY291bnRfaGlfdXBkYXRlKGNwdXRpbWVfdCBtYXh0aW1lKQoreworCXJldHVybiBpcnF0aW1lX2FjY291bnRfdXBkYXRlKF9fdGhpc19jcHVfcmVhZChjcHVfaXJxdGltZS5oYXJkaXJxX3RpbWUpLAorCQkJCSAgICAgIENQVVRJTUVfSVJRLCBtYXh0aW1lKTsKK30KKwogc3RhdGljIGNwdXRpbWVfdCBpcnF0aW1lX2FjY291bnRfc2lfdXBkYXRlKGNwdXRpbWVfdCBtYXh0aW1lKQogewotCXU2NCAqY3B1c3RhdCA9IGtjcHVzdGF0X3RoaXNfY3B1LT5jcHVzdGF0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JY3B1dGltZV90IHNvZnRpcnFfY3B1dGltZTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlzb2Z0aXJxX2NwdXRpbWUgPSBuc2Vjc190b19jcHV0aW1lNjQodGhpc19jcHVfcmVhZChjcHVfc29mdGlycV90aW1lKSkgLQotCQkJICBjcHVzdGF0W0NQVVRJTUVfU09GVElSUV07Ci0Jc29mdGlycV9jcHV0aW1lID0gbWluKHNvZnRpcnFfY3B1dGltZSwgbWF4dGltZSk7Ci0JY3B1c3RhdFtDUFVUSU1FX1NPRlRJUlFdICs9IHNvZnRpcnFfY3B1dGltZTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuIHNvZnRpcnFfY3B1dGltZTsKKwlyZXR1cm4gaXJxdGltZV9hY2NvdW50X3VwZGF0ZShfX3RoaXNfY3B1X3JlYWQoY3B1X2lycXRpbWUuc29mdGlycV90aW1lKSwKKwkJCQkgICAgICBDUFVUSU1FX1NPRlRJUlEsIG1heHRpbWUpOwogfQogCiAjZWxzZSAvKiBDT05GSUdfSVJRX1RJTUVfQUNDT1VOVElORyAqLwpAQCAtMjYzLDYgKzI1MiwxMSBAQAogCQljcHVzdGF0W0NQVVRJTUVfSURMRV0gKz0gKF9fZm9yY2UgdTY0KSBjcHV0aW1lOwogfQogCisvKgorICogV2hlbiBhIGd1ZXN0IGlzIGludGVycnVwdGVkIGZvciBhIGxvbmdlciBhbW91bnQgb2YgdGltZSwgbWlzc2VkIGNsb2NrCisgKiB0aWNrcyBhcmUgbm90IHJlZGVsaXZlcmVkIGxhdGVyLiBEdWUgdG8gdGhhdCwgdGhpcyBmdW5jdGlvbiBtYXkgb24KKyAqIG9jY2FzaW9uIGFjY291bnQgbW9yZSB0aW1lIHRoYW4gdGhlIGNhbGxpbmcgZnVuY3Rpb25zIHRoaW5rIGVsYXBzZWQuCisgKi8KIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgY3B1dGltZV90IHN0ZWFsX2FjY291bnRfcHJvY2Vzc190aW1lKGNwdXRpbWVfdCBtYXh0aW1lKQogewogI2lmZGVmIENPTkZJR19QQVJBVklSVApAQCAtMjkwLDYgKzI4NCw5IEBACiB7CiAJY3B1dGltZV90IGFjY291bnRlZDsKIAorCS8qIFNoYWxsIGJlIGNvbnZlcnRlZCB0byBhIGxvY2tkZXAtZW5hYmxlZCBsaWdodHdlaWdodCBjaGVjayAqLworCVdBUk5fT05fT05DRSghaXJxc19kaXNhYmxlZCgpKTsKKwogCWFjY291bnRlZCA9IHN0ZWFsX2FjY291bnRfcHJvY2Vzc190aW1lKG1heCk7CiAKIAlpZiAoYWNjb3VudGVkIDwgbWF4KQpAQCAtMzAxLDYgKzI5OCwyNiBAQAogCXJldHVybiBhY2NvdW50ZWQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfNjRCSVQKK3N0YXRpYyBpbmxpbmUgdTY0IHJlYWRfc3VtX2V4ZWNfcnVudGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCit7CisJcmV0dXJuIHQtPnNlLnN1bV9leGVjX3J1bnRpbWU7Cit9CisjZWxzZQorc3RhdGljIHU2NCByZWFkX3N1bV9leGVjX3J1bnRpbWUoc3RydWN0IHRhc2tfc3RydWN0ICp0KQoreworCXU2NCBuczsKKwlzdHJ1Y3QgcnFfZmxhZ3MgcmY7CisJc3RydWN0IHJxICpycTsKKworCXJxID0gdGFza19ycV9sb2NrKHQsICZyZik7CisJbnMgPSB0LT5zZS5zdW1fZXhlY19ydW50aW1lOworCXRhc2tfcnFfdW5sb2NrKHJxLCB0LCAmcmYpOworCisJcmV0dXJuIG5zOworfQorI2VuZGlmCisKIC8qCiAgKiBBY2N1bXVsYXRlIHJhdyBjcHV0aW1lIHZhbHVlcyBvZiBkZWFkIHRhc2tzIChzaWctPlt1c110aW1lKSBhbmQgbGl2ZQogICogdGFza3MgKHN1bSBvbiBncm91cCBpdGVyYXRpb24pIGJlbG9uZ2luZyB0byBAdHNrJ3MgZ3JvdXAuCkBAIC0zMTMsNiArMzMwLDE3IEBACiAJdW5zaWduZWQgaW50IHNlcSwgbmV4dHNlcTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJLyoKKwkgKiBVcGRhdGUgY3VycmVudCB0YXNrIHJ1bnRpbWUgdG8gYWNjb3VudCBwZW5kaW5nIHRpbWUgc2luY2UgbGFzdAorCSAqIHNjaGVkdWxlciBhY3Rpb24gb3IgdGhyZWFkX2dyb3VwX2NwdXRpbWUoKSBjYWxsLiBUaGlzIHRocmVhZCBncm91cAorCSAqIG1pZ2h0IGhhdmUgb3RoZXIgcnVubmluZyB0YXNrcyBvbiBkaWZmZXJlbnQgQ1BVcywgYnV0IHVwZGF0aW5nCisJICogdGhlaXIgcnVudGltZSBjYW4gYWZmZWN0IHN5c2NhbGwgcGVyZm9ybWFuY2UsIHNvIHdlIHNraXAgYWNjb3VudAorCSAqIHRob3NlIHBlbmRpbmcgdGltZXMgYW5kIHJlbHkgb25seSBvbiB2YWx1ZXMgdXBkYXRlZCBvbiB0aWNrIG9yCisJICogb3RoZXIgc2NoZWR1bGVyIGFjdGlvbi4KKwkgKi8KKwlpZiAoc2FtZV90aHJlYWRfZ3JvdXAoY3VycmVudCwgdHNrKSkKKwkJKHZvaWQpIHRhc2tfc2NoZWRfcnVudGltZShjdXJyZW50KTsKKwogCXJjdV9yZWFkX2xvY2soKTsKIAkvKiBBdHRlbXB0IGEgbG9ja2xlc3MgcmVhZCBvbiB0aGUgZmlyc3Qgcm91bmQuICovCiAJbmV4dHNlcSA9IDA7CkBAIC0zMjcsNyArMzU1LDcgQEAKIAkJCXRhc2tfY3B1dGltZSh0LCAmdXRpbWUsICZzdGltZSk7CiAJCQl0aW1lcy0+dXRpbWUgKz0gdXRpbWU7CiAJCQl0aW1lcy0+c3RpbWUgKz0gc3RpbWU7Ci0JCQl0aW1lcy0+c3VtX2V4ZWNfcnVudGltZSArPSB0YXNrX3NjaGVkX3J1bnRpbWUodCk7CisJCQl0aW1lcy0+c3VtX2V4ZWNfcnVudGltZSArPSByZWFkX3N1bV9leGVjX3J1bnRpbWUodCk7CiAJCX0KIAkJLyogSWYgbG9ja2xlc3MgYWNjZXNzIGZhaWxlZCwgdGFrZSB0aGUgbG9jay4gKi8KIAkJbmV4dHNlcSA9IDE7CkBAIC0zNzEsNyArMzk5LDcgQEAKIAkgKiBpZGxlLCBvciBwb3RlbnRpYWxseSB1c2VyIG9yIHN5c3RlbSB0aW1lLiBEdWUgdG8gcm91bmRpbmcsCiAJICogb3RoZXIgdGltZSBjYW4gZXhjZWVkIHRpY2tzIG9jY2FzaW9uYWxseS4KIAkgKi8KLQlvdGhlciA9IGFjY291bnRfb3RoZXJfdGltZShjcHV0aW1lKTsKKwlvdGhlciA9IGFjY291bnRfb3RoZXJfdGltZShVTE9OR19NQVgpOwogCWlmIChvdGhlciA+PSBjcHV0aW1lKQogCQlyZXR1cm47CiAJY3B1dGltZSAtPSBvdGhlcjsKQEAgLTQ4Niw3ICs1MTQsNyBAQAogCX0KIAogCWNwdXRpbWUgPSBjcHV0aW1lX29uZV9qaWZmeTsKLQlzdGVhbCA9IHN0ZWFsX2FjY291bnRfcHJvY2Vzc190aW1lKGNwdXRpbWUpOworCXN0ZWFsID0gc3RlYWxfYWNjb3VudF9wcm9jZXNzX3RpbWUoVUxPTkdfTUFYKTsKIAogCWlmIChzdGVhbCA+PSBjcHV0aW1lKQogCQlyZXR1cm47CkBAIC01MTYsNyArNTQ0LDcgQEAKIAl9CiAKIAljcHV0aW1lID0gamlmZmllc190b19jcHV0aW1lKHRpY2tzKTsKLQlzdGVhbCA9IHN0ZWFsX2FjY291bnRfcHJvY2Vzc190aW1lKGNwdXRpbWUpOworCXN0ZWFsID0gc3RlYWxfYWNjb3VudF9wcm9jZXNzX3RpbWUoVUxPTkdfTUFYKTsKIAogCWlmIChzdGVhbCA+PSBjcHV0aW1lKQogCQlyZXR1cm47CkBAIC02MTQsMTkgKzY0MiwyNSBAQAogCXN0aW1lID0gY3Vyci0+c3RpbWU7CiAJdXRpbWUgPSBjdXJyLT51dGltZTsKIAotCWlmICh1dGltZSA9PSAwKSB7Ci0JCXN0aW1lID0gcnRpbWU7CisJLyoKKwkgKiBJZiBlaXRoZXIgc3RpbWUgb3IgYm90aCBzdGltZSBhbmQgdXRpbWUgYXJlIDAsIGFzc3VtZSBhbGwgcnVudGltZSBpcworCSAqIHVzZXJzcGFjZS4gT25jZSBhIHRhc2sgZ2V0cyBzb21lIHRpY2tzLCB0aGUgbW9ub3RvbmljeSBjb2RlIGF0CisJICogJ3VwZGF0ZScgd2lsbCBlbnN1cmUgdGhpbmdzIGNvbnZlcmdlIHRvIHRoZSBvYnNlcnZlZCByYXRpby4KKwkgKi8KKwlpZiAoc3RpbWUgPT0gMCkgeworCQl1dGltZSA9IHJ0aW1lOwogCQlnb3RvIHVwZGF0ZTsKIAl9CiAKLQlpZiAoc3RpbWUgPT0gMCkgewotCQl1dGltZSA9IHJ0aW1lOworCWlmICh1dGltZSA9PSAwKSB7CisJCXN0aW1lID0gcnRpbWU7CiAJCWdvdG8gdXBkYXRlOwogCX0KIAogCXN0aW1lID0gc2NhbGVfc3RpbWUoKF9fZm9yY2UgdTY0KXN0aW1lLCAoX19mb3JjZSB1NjQpcnRpbWUsCiAJCQkgICAgKF9fZm9yY2UgdTY0KShzdGltZSArIHV0aW1lKSk7CiAKK3VwZGF0ZToKIAkvKgogCSAqIE1ha2Ugc3VyZSBzdGltZSBkb2Vzbid0IGdvIGJhY2t3YXJkczsgdGhpcyBwcmVzZXJ2ZXMgbW9ub3RvbmljaXR5CiAJICogZm9yIHV0aW1lIGJlY2F1c2UgcnRpbWUgaXMgbW9ub3RvbmljLgpAQCAtNjQ5LDcgKzY4Myw2IEBACiAJCXN0aW1lID0gcnRpbWUgLSB1dGltZTsKIAl9CiAKLXVwZGF0ZToKIAlwcmV2LT5zdGltZSA9IHN0aW1lOwogCXByZXYtPnV0aW1lID0gdXRpbWU7CiBvdXQ6CkBAIC02OTQsNiArNzI3LDEzIEBACiAJdW5zaWduZWQgbG9uZyBub3cgPSBSRUFEX09OQ0UoamlmZmllcyk7CiAJY3B1dGltZV90IGRlbHRhLCBvdGhlcjsKIAorCS8qCisJICogVW5saWtlIHRpY2sgYmFzZWQgdGltaW5nLCB2dGltZSBiYXNlZCB0aW1pbmcgbmV2ZXIgaGFzIGxvc3QKKwkgKiB0aWNrcywgYW5kIG5vIG5lZWQgZm9yIHN0ZWFsIHRpbWUgYWNjb3VudGluZyB0byBtYWtlIHVwIGZvcgorCSAqIGxvc3QgdGlja3MuIFZ0aW1lIGFjY291bnRzIGEgcm91bmRlZCB2ZXJzaW9uIG9mIGFjdHVhbAorCSAqIGVsYXBzZWQgdGltZS4gTGltaXQgYWNjb3VudF9vdGhlcl90aW1lIHRvIHByZXZlbnQgcm91bmRpbmcKKwkgKiBlcnJvcnMgZnJvbSBjYXVzaW5nIGVsYXBzZWQgdnRpbWUgdG8gZ28gbmVnYXRpdmUuCisJICovCiAJZGVsdGEgPSBqaWZmaWVzX3RvX2NwdXRpbWUobm93IC0gdHNrLT52dGltZV9zbmFwKTsKIAlvdGhlciA9IGFjY291bnRfb3RoZXJfdGltZShkZWx0YSk7CiAJV0FSTl9PTl9PTkNFKHRzay0+dnRpbWVfc25hcF93aGVuY2UgPT0gVlRJTUVfSU5BQ1RJVkUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2RlYWRsaW5lLmMgYi9rZXJuZWwvc2NoZWQvZGVhZGxpbmUuYwppbmRleCAxY2U4ODY3Li4zN2UyNDQ5IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvZGVhZGxpbmUuYworKysgYi9rZXJuZWwvc2NoZWQvZGVhZGxpbmUuYwpAQCAtMjQzLDEwICsyNDMsOCBAQAogc3RhdGljIHN0cnVjdCBycSAqZGxfdGFza19vZmZsaW5lX21pZ3JhdGlvbihzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJc3RydWN0IHJxICpsYXRlcl9ycSA9IE5VTEw7Ci0JYm9vbCBmYWxsYmFjayA9IGZhbHNlOwogCiAJbGF0ZXJfcnEgPSBmaW5kX2xvY2tfbGF0ZXJfcnEocCwgcnEpOwotCiAJaWYgKCFsYXRlcl9ycSkgewogCQlpbnQgY3B1OwogCkBAIC0yNTQsNyArMjUyLDYgQEAKIAkJICogSWYgd2UgY2Fubm90IHByZWVtcHQgYW55IHJxLCBmYWxsIGJhY2sgdG8gcGljayBhbnkKIAkJICogb25saW5lIGNwdS4KIAkJICovCi0JCWZhbGxiYWNrID0gdHJ1ZTsKIAkJY3B1ID0gY3B1bWFza19hbnlfYW5kKGNwdV9hY3RpdmVfbWFzaywgdHNrX2NwdXNfYWxsb3dlZChwKSk7CiAJCWlmIChjcHUgPj0gbnJfY3B1X2lkcykgewogCQkJLyoKQEAgLTI3NCwxNiArMjcxLDcgQEAKIAkJZG91YmxlX2xvY2tfYmFsYW5jZShycSwgbGF0ZXJfcnEpOwogCX0KIAotCS8qCi0JICogQnkgbm93IHRoZSB0YXNrIGlzIHJlcGxlbmlzaGVkIGFuZCBlbnF1ZXVlZDsgbWlncmF0ZSBpdC4KLQkgKi8KLQlkZWFjdGl2YXRlX3Rhc2socnEsIHAsIDApOwogCXNldF90YXNrX2NwdShwLCBsYXRlcl9ycS0+Y3B1KTsKLQlhY3RpdmF0ZV90YXNrKGxhdGVyX3JxLCBwLCAwKTsKLQotCWlmICghZmFsbGJhY2spCi0JCXJlc2NoZWRfY3VycihsYXRlcl9ycSk7Ci0KIAlkb3VibGVfdW5sb2NrX2JhbGFuY2UobGF0ZXJfcnEsIHJxKTsKIAogCXJldHVybiBsYXRlcl9ycTsKQEAgLTM0NiwxMiArMzM0LDEyIEBACiAgKiBvbmUsIGFuZCB0byAodHJ5IHRvISkgcmVjb25jaWxlIGl0c2VsZiB3aXRoIGl0cyBvd24gc2NoZWR1bGluZwogICogcGFyYW1ldGVycy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIHNldHVwX25ld19kbF9lbnRpdHkoc3RydWN0IHNjaGVkX2RsX2VudGl0eSAqZGxfc2UsCi0JCQkJICAgICAgIHN0cnVjdCBzY2hlZF9kbF9lbnRpdHkgKnBpX3NlKQorc3RhdGljIGlubGluZSB2b2lkIHNldHVwX25ld19kbF9lbnRpdHkoc3RydWN0IHNjaGVkX2RsX2VudGl0eSAqZGxfc2UpCiB7CiAJc3RydWN0IGRsX3JxICpkbF9ycSA9IGRsX3JxX29mX3NlKGRsX3NlKTsKIAlzdHJ1Y3QgcnEgKnJxID0gcnFfb2ZfZGxfcnEoZGxfcnEpOwogCisJV0FSTl9PTihkbF9zZS0+ZGxfYm9vc3RlZCk7CiAJV0FSTl9PTihkbF90aW1lX2JlZm9yZShycV9jbG9jayhycSksIGRsX3NlLT5kZWFkbGluZSkpOwogCiAJLyoKQEAgLTM2Nyw4ICszNTUsOCBAQAogCSAqIGZ1dHVyZTsgaW4gZmFjdCwgd2UgbXVzdCBjb25zaWRlciBleGVjdXRpb24gb3ZlcmhlYWRzICh0aW1lCiAJICogc3BlbnQgb24gaGFyZGlycSBjb250ZXh0LCBldGMuKS4KIAkgKi8KLQlkbF9zZS0+ZGVhZGxpbmUgPSBycV9jbG9jayhycSkgKyBwaV9zZS0+ZGxfZGVhZGxpbmU7Ci0JZGxfc2UtPnJ1bnRpbWUgPSBwaV9zZS0+ZGxfcnVudGltZTsKKwlkbF9zZS0+ZGVhZGxpbmUgPSBycV9jbG9jayhycSkgKyBkbF9zZS0+ZGxfZGVhZGxpbmU7CisJZGxfc2UtPnJ1bnRpbWUgPSBkbF9zZS0+ZGxfcnVudGltZTsKIH0KIAogLyoKQEAgLTY0MSw2ICs2MjksMjQgQEAKIAkJZ290byB1bmxvY2s7CiAJfQogCisjaWZkZWYgQ09ORklHX1NNUAorCWlmICh1bmxpa2VseSghcnEtPm9ubGluZSkpIHsKKwkJLyoKKwkJICogSWYgdGhlIHJ1bnF1ZXVlIGlzIG5vIGxvbmdlciBhdmFpbGFibGUsIG1pZ3JhdGUgdGhlCisJCSAqIHRhc2sgZWxzZXdoZXJlLiBUaGlzIG5lY2Vzc2FyaWx5IGNoYW5nZXMgcnEuCisJCSAqLworCQlsb2NrZGVwX3VucGluX2xvY2soJnJxLT5sb2NrLCByZi5jb29raWUpOworCQlycSA9IGRsX3Rhc2tfb2ZmbGluZV9taWdyYXRpb24ocnEsIHApOworCQlyZi5jb29raWUgPSBsb2NrZGVwX3Bpbl9sb2NrKCZycS0+bG9jayk7CisKKwkJLyoKKwkJICogTm93IHRoYXQgdGhlIHRhc2sgaGFzIGJlZW4gbWlncmF0ZWQgdG8gdGhlIG5ldyBSUSBhbmQgd2UKKwkJICogaGF2ZSB0aGF0IGxvY2tlZCwgcHJvY2VlZCBhcyBub3JtYWwgYW5kIGVucXVldWUgdGhlIHRhc2sKKwkJICogdGhlcmUuCisJCSAqLworCX0KKyNlbmRpZgorCiAJZW5xdWV1ZV90YXNrX2RsKHJxLCBwLCBFTlFVRVVFX1JFUExFTklTSCk7CiAJaWYgKGRsX3Rhc2socnEtPmN1cnIpKQogCQljaGVja19wcmVlbXB0X2N1cnJfZGwocnEsIHAsIDApOwpAQCAtNjQ5LDIyICs2NTUsNiBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCS8qCi0JICogUGVyZm9ybSBiYWxhbmNpbmcgb3BlcmF0aW9ucyBoZXJlOyBhZnRlciB0aGUgcmVwbGVuaXNobWVudHMuICBXZQotCSAqIGNhbm5vdCBkcm9wIHJxLT5sb2NrIGJlZm9yZSB0aGlzLCBvdGhlcndpc2UgdGhlIGFzc2VydGlvbiBpbgotCSAqIHN0YXJ0X2RsX3RpbWVyKCkgYWJvdXQgbm90IG1pc3NpbmcgdXBkYXRlcyBpcyBub3QgdHJ1ZS4KLQkgKgotCSAqIElmIHdlIGZpbmQgdGhhdCB0aGUgcnEgdGhlIHRhc2sgd2FzIG9uIGlzIG5vIGxvbmdlciBhdmFpbGFibGUsIHdlCi0JICogbmVlZCB0byBzZWxlY3QgYSBuZXcgcnEuCi0JICoKLQkgKiBYWFggZmlndXJlIG91dCBpZiBzZWxlY3RfdGFza19ycV9kbCgpIGRlYWxzIHdpdGggb2ZmbGluZSBjcHVzLgotCSAqLwotCWlmICh1bmxpa2VseSghcnEtPm9ubGluZSkpIHsKLQkJbG9ja2RlcF91bnBpbl9sb2NrKCZycS0+bG9jaywgcmYuY29va2llKTsKLQkJcnEgPSBkbF90YXNrX29mZmxpbmVfbWlncmF0aW9uKHJxLCBwKTsKLQkJcmYuY29va2llID0gbG9ja2RlcF9waW5fbG9jaygmcnEtPmxvY2spOwotCX0KLQotCS8qCiAJICogUXVldWVpbmcgdGhpcyB0YXNrIGJhY2sgbWlnaHQgaGF2ZSBvdmVybG9hZGVkIHJxLCBjaGVjayBpZiB3ZSBuZWVkCiAJICogdG8ga2ljayBzb21lb25lIGF3YXkuCiAJICovCkBAIC03MzUsOSArNzI1LDggQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIGtpY2sgY3B1ZnJlcSAoc2VlIHRoZSBjb21tZW50IGluIGxpbnV4L2NwdWZyZXEuaCkuICovCi0JaWYgKGNwdV9vZihycSkgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQotCQljcHVmcmVxX3RyaWdnZXJfdXBkYXRlKHJxX2Nsb2NrKHJxKSk7CisJLyoga2ljayBjcHVmcmVxIChzZWUgdGhlIGNvbW1lbnQgaW4ga2VybmVsL3NjaGVkL3NjaGVkLmgpLiAqLworCWNwdWZyZXFfdXBkYXRlX3RoaXNfY3B1KHJxLCBTQ0hFRF9DUFVGUkVRX0RMKTsKIAogCXNjaGVkc3RhdF9zZXQoY3Vyci0+c2Uuc3RhdGlzdGljcy5leGVjX21heCwKIAkJICAgICAgbWF4KGN1cnItPnNlLnN0YXRpc3RpY3MuZXhlY19tYXgsIGRlbHRhX2V4ZWMpKTsKQEAgLTc5OCw3ICs3ODcsNyBAQAogCWlmIChkbF9ycS0+ZWFybGllc3RfZGwuY3VyciA9PSAwIHx8CiAJICAgIGRsX3RpbWVfYmVmb3JlKGRlYWRsaW5lLCBkbF9ycS0+ZWFybGllc3RfZGwuY3VycikpIHsKIAkJZGxfcnEtPmVhcmxpZXN0X2RsLmN1cnIgPSBkZWFkbGluZTsKLQkJY3B1ZGxfc2V0KCZycS0+cmQtPmNwdWRsLCBycS0+Y3B1LCBkZWFkbGluZSwgMSk7CisJCWNwdWRsX3NldCgmcnEtPnJkLT5jcHVkbCwgcnEtPmNwdSwgZGVhZGxpbmUpOwogCX0KIH0KIApAQCAtODEzLDE0ICs4MDIsMTQgQEAKIAlpZiAoIWRsX3JxLT5kbF9ucl9ydW5uaW5nKSB7CiAJCWRsX3JxLT5lYXJsaWVzdF9kbC5jdXJyID0gMDsKIAkJZGxfcnEtPmVhcmxpZXN0X2RsLm5leHQgPSAwOwotCQljcHVkbF9zZXQoJnJxLT5yZC0+Y3B1ZGwsIHJxLT5jcHUsIDAsIDApOworCQljcHVkbF9jbGVhcigmcnEtPnJkLT5jcHVkbCwgcnEtPmNwdSk7CiAJfSBlbHNlIHsKIAkJc3RydWN0IHJiX25vZGUgKmxlZnRtb3N0ID0gZGxfcnEtPnJiX2xlZnRtb3N0OwogCQlzdHJ1Y3Qgc2NoZWRfZGxfZW50aXR5ICplbnRyeTsKIAogCQllbnRyeSA9IHJiX2VudHJ5KGxlZnRtb3N0LCBzdHJ1Y3Qgc2NoZWRfZGxfZW50aXR5LCByYl9ub2RlKTsKIAkJZGxfcnEtPmVhcmxpZXN0X2RsLmN1cnIgPSBlbnRyeS0+ZGVhZGxpbmU7Ci0JCWNwdWRsX3NldCgmcnEtPnJkLT5jcHVkbCwgcnEtPmNwdSwgZW50cnktPmRlYWRsaW5lLCAxKTsKKwkJY3B1ZGxfc2V0KCZycS0+cmQtPmNwdWRsLCBycS0+Y3B1LCBlbnRyeS0+ZGVhZGxpbmUpOwogCX0KIH0KIApAQCAtMTY3MSw3ICsxNjYwLDcgQEAKIAogCWNwdWRsX3NldF9mcmVlY3B1KCZycS0+cmQtPmNwdWRsLCBycS0+Y3B1KTsKIAlpZiAocnEtPmRsLmRsX25yX3J1bm5pbmcgPiAwKQotCQljcHVkbF9zZXQoJnJxLT5yZC0+Y3B1ZGwsIHJxLT5jcHUsIHJxLT5kbC5lYXJsaWVzdF9kbC5jdXJyLCAxKTsKKwkJY3B1ZGxfc2V0KCZycS0+cmQtPmNwdWRsLCBycS0+Y3B1LCBycS0+ZGwuZWFybGllc3RfZGwuY3Vycik7CiB9CiAKIC8qIEFzc3VtZXMgcnEtPmxvY2sgaXMgaGVsZCAqLwpAQCAtMTY4MCw3ICsxNjY5LDcgQEAKIAlpZiAocnEtPmRsLm92ZXJsb2FkZWQpCiAJCWRsX2NsZWFyX292ZXJsb2FkKHJxKTsKIAotCWNwdWRsX3NldCgmcnEtPnJkLT5jcHVkbCwgcnEtPmNwdSwgMCwgMCk7CisJY3B1ZGxfY2xlYXIoJnJxLT5yZC0+Y3B1ZGwsIHJxLT5jcHUpOwogCWNwdWRsX2NsZWFyX2ZyZWVjcHUoJnJxLT5yZC0+Y3B1ZGwsIHJxLT5jcHUpOwogfQogCkBAIC0xNzIzLDEwICsxNzEyLDIwIEBACiAgKi8KIHN0YXRpYyB2b2lkIHN3aXRjaGVkX3RvX2RsKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKLQlpZiAoZGxfdGltZV9iZWZvcmUocC0+ZGwuZGVhZGxpbmUsIHJxX2Nsb2NrKHJxKSkpCi0JCXNldHVwX25ld19kbF9lbnRpdHkoJnAtPmRsLCAmcC0+ZGwpOwogCi0JaWYgKHRhc2tfb25fcnFfcXVldWVkKHApICYmIHJxLT5jdXJyICE9IHApIHsKKwkvKiBJZiBwIGlzIG5vdCBxdWV1ZWQgd2Ugd2lsbCB1cGRhdGUgaXRzIHBhcmFtZXRlcnMgYXQgbmV4dCB3YWtldXAuICovCisJaWYgKCF0YXNrX29uX3JxX3F1ZXVlZChwKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZiBwIGlzIGJvb3N0ZWQgd2UgYWxyZWFkeSB1cGRhdGVkIGl0cyBwYXJhbXMgaW4KKwkgKiBydF9tdXRleF9zZXRwcmlvKCktPmVucXVldWVfdGFzayguLi4sIEVOUVVFVUVfUkVQTEVOSVNIKSwKKwkgKiBwJ3MgZGVhZGxpbmUgYmVpbmcgbm93IGFscmVhZHkgYWZ0ZXIgcnFfY2xvY2socnEpLgorCSAqLworCWlmIChkbF90aW1lX2JlZm9yZShwLT5kbC5kZWFkbGluZSwgcnFfY2xvY2socnEpKSkKKwkJc2V0dXBfbmV3X2RsX2VudGl0eSgmcC0+ZGwpOworCisJaWYgKHJxLT5jdXJyICE9IHApIHsKICNpZmRlZiBDT05GSUdfU01QCiAJCWlmICh0c2tfbnJfY3B1c19hbGxvd2VkKHApID4gMSAmJiBycS0+ZGwub3ZlcmxvYWRlZCkKIAkJCXF1ZXVlX3B1c2hfdGFza3MocnEpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2RlYnVnLmMgYi9rZXJuZWwvc2NoZWQvZGVidWcuYwppbmRleCAyYTBhOTk5Li4xMzkzNTg4IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvZGVidWcuYworKysgYi9rZXJuZWwvc2NoZWQvZGVidWcuYwpAQCAtMzY5LDggKzM2OSwxMiBAQAogCiAjZGVmaW5lIFAoRikgXAogCVNFUV9wcmludGYobSwgIiAgLiUtMzBzOiAlbGxkXG4iLCAjRiwgKGxvbmcgbG9uZylGKQorI2RlZmluZSBQX1NDSEVEU1RBVChGKSBcCisJU0VRX3ByaW50ZihtLCAiICAuJS0zMHM6ICVsbGRcbiIsICNGLCAobG9uZyBsb25nKXNjaGVkc3RhdF92YWwoRikpCiAjZGVmaW5lIFBOKEYpIFwKIAlTRVFfcHJpbnRmKG0sICIgIC4lLTMwczogJWxsZC4lMDZsZFxuIiwgI0YsIFNQTElUX05TKChsb25nIGxvbmcpRikpCisjZGVmaW5lIFBOX1NDSEVEU1RBVChGKSBcCisJU0VRX3ByaW50ZihtLCAiICAuJS0zMHM6ICVsbGQuJTA2bGRcbiIsICNGLCBTUExJVF9OUygobG9uZyBsb25nKXNjaGVkc3RhdF92YWwoRikpKQogCiAJaWYgKCFzZSkKIAkJcmV0dXJuOwpAQCAtMzc4LDI2ICszODIsMjcgQEAKIAlQTihzZS0+ZXhlY19zdGFydCk7CiAJUE4oc2UtPnZydW50aW1lKTsKIAlQTihzZS0+c3VtX2V4ZWNfcnVudGltZSk7Ci0jaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKIAlpZiAoc2NoZWRzdGF0X2VuYWJsZWQoKSkgewotCQlQTihzZS0+c3RhdGlzdGljcy53YWl0X3N0YXJ0KTsKLQkJUE4oc2UtPnN0YXRpc3RpY3Muc2xlZXBfc3RhcnQpOwotCQlQTihzZS0+c3RhdGlzdGljcy5ibG9ja19zdGFydCk7Ci0JCVBOKHNlLT5zdGF0aXN0aWNzLnNsZWVwX21heCk7Ci0JCVBOKHNlLT5zdGF0aXN0aWNzLmJsb2NrX21heCk7Ci0JCVBOKHNlLT5zdGF0aXN0aWNzLmV4ZWNfbWF4KTsKLQkJUE4oc2UtPnN0YXRpc3RpY3Muc2xpY2VfbWF4KTsKLQkJUE4oc2UtPnN0YXRpc3RpY3Mud2FpdF9tYXgpOwotCQlQTihzZS0+c3RhdGlzdGljcy53YWl0X3N1bSk7Ci0JCVAoc2UtPnN0YXRpc3RpY3Mud2FpdF9jb3VudCk7CisJCVBOX1NDSEVEU1RBVChzZS0+c3RhdGlzdGljcy53YWl0X3N0YXJ0KTsKKwkJUE5fU0NIRURTVEFUKHNlLT5zdGF0aXN0aWNzLnNsZWVwX3N0YXJ0KTsKKwkJUE5fU0NIRURTVEFUKHNlLT5zdGF0aXN0aWNzLmJsb2NrX3N0YXJ0KTsKKwkJUE5fU0NIRURTVEFUKHNlLT5zdGF0aXN0aWNzLnNsZWVwX21heCk7CisJCVBOX1NDSEVEU1RBVChzZS0+c3RhdGlzdGljcy5ibG9ja19tYXgpOworCQlQTl9TQ0hFRFNUQVQoc2UtPnN0YXRpc3RpY3MuZXhlY19tYXgpOworCQlQTl9TQ0hFRFNUQVQoc2UtPnN0YXRpc3RpY3Muc2xpY2VfbWF4KTsKKwkJUE5fU0NIRURTVEFUKHNlLT5zdGF0aXN0aWNzLndhaXRfbWF4KTsKKwkJUE5fU0NIRURTVEFUKHNlLT5zdGF0aXN0aWNzLndhaXRfc3VtKTsKKwkJUF9TQ0hFRFNUQVQoc2UtPnN0YXRpc3RpY3Mud2FpdF9jb3VudCk7CiAJfQotI2VuZGlmCiAJUChzZS0+bG9hZC53ZWlnaHQpOwogI2lmZGVmIENPTkZJR19TTVAKIAlQKHNlLT5hdmcubG9hZF9hdmcpOwogCVAoc2UtPmF2Zy51dGlsX2F2Zyk7CiAjZW5kaWYKKworI3VuZGVmIFBOX1NDSEVEU1RBVAogI3VuZGVmIFBOCisjdW5kZWYgUF9TQ0hFRFNUQVQKICN1bmRlZiBQCiB9CiAjZW5kaWYKQEAgLTQyOSw5ICs0MzQsOSBAQAogCQlwLT5wcmlvKTsKIAogCVNFUV9wcmludGYobSwgIiU5TGQuJTA2bGQgJTlMZC4lMDZsZCAlOUxkLiUwNmxkIiwKLQkJU1BMSVRfTlMoc2NoZWRzdGF0X3ZhbChwLCBzZS5zdGF0aXN0aWNzLndhaXRfc3VtKSksCisJCVNQTElUX05TKHNjaGVkc3RhdF92YWxfb3JfemVybyhwLT5zZS5zdGF0aXN0aWNzLndhaXRfc3VtKSksCiAJCVNQTElUX05TKHAtPnNlLnN1bV9leGVjX3J1bnRpbWUpLAotCQlTUExJVF9OUyhzY2hlZHN0YXRfdmFsKHAsIHNlLnN0YXRpc3RpY3Muc3VtX3NsZWVwX3J1bnRpbWUpKSk7CisJCVNQTElUX05TKHNjaGVkc3RhdF92YWxfb3JfemVybyhwLT5zZS5zdGF0aXN0aWNzLnN1bV9zbGVlcF9ydW50aW1lKSkpOwogCiAjaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HCiAJU0VRX3ByaW50ZihtLCAiICVkICVkIiwgdGFza19ub2RlKHApLCB0YXNrX251bWFfZ3JvdXBfaWQocCkpOwpAQCAtNjI2LDkgKzYzMSw3IEBACiAjdW5kZWYgUDY0CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCi0jZGVmaW5lIFAobikgU0VRX3ByaW50ZihtLCAiICAuJS0zMHM6ICVkXG4iLCAjbiwgcnEtPm4pOwotCisjZGVmaW5lIFAobikgU0VRX3ByaW50ZihtLCAiICAuJS0zMHM6ICVkXG4iLCAjbiwgc2NoZWRzdGF0X3ZhbChycS0+bikpOwogCWlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKSB7CiAJCVAoeWxkX2NvdW50KTsKIAkJUChzY2hlZF9jb3VudCk7CkBAIC02MzYsOSArNjM5LDggQEAKIAkJUCh0dHd1X2NvdW50KTsKIAkJUCh0dHd1X2xvY2FsKTsKIAl9Ci0KICN1bmRlZiBQCi0jZW5kaWYKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZzY2hlZF9kZWJ1Z19sb2NrLCBmbGFncyk7CiAJcHJpbnRfY2ZzX3N0YXRzKG0sIGNwdSk7CiAJcHJpbnRfcnRfc3RhdHMobSwgY3B1KTsKQEAgLTg2OCwxMCArODcwLDE0IEBACiAJU0VRX3ByaW50ZihtLCAiJS00NXM6JTIxTGRcbiIsICNGLCAobG9uZyBsb25nKUYpCiAjZGVmaW5lIFAoRikgXAogCVNFUV9wcmludGYobSwgIiUtNDVzOiUyMUxkXG4iLCAjRiwgKGxvbmcgbG9uZylwLT5GKQorI2RlZmluZSBQX1NDSEVEU1RBVChGKSBcCisJU0VRX3ByaW50ZihtLCAiJS00NXM6JTIxTGRcbiIsICNGLCAobG9uZyBsb25nKXNjaGVkc3RhdF92YWwocC0+RikpCiAjZGVmaW5lIF9fUE4oRikgXAogCVNFUV9wcmludGYobSwgIiUtNDVzOiUxNExkLiUwNmxkXG4iLCAjRiwgU1BMSVRfTlMoKGxvbmcgbG9uZylGKSkKICNkZWZpbmUgUE4oRikgXAogCVNFUV9wcmludGYobSwgIiUtNDVzOiUxNExkLiUwNmxkXG4iLCAjRiwgU1BMSVRfTlMoKGxvbmcgbG9uZylwLT5GKSkKKyNkZWZpbmUgUE5fU0NIRURTVEFUKEYpIFwKKwlTRVFfcHJpbnRmKG0sICIlLTQ1czolMTRMZC4lMDZsZFxuIiwgI0YsIFNQTElUX05TKChsb25nIGxvbmcpc2NoZWRzdGF0X3ZhbChwLT5GKSkpCiAKIAlQTihzZS5leGVjX3N0YXJ0KTsKIAlQTihzZS52cnVudGltZSk7CkBAIC04ODEsMzcgKzg4NywzNiBAQAogCiAJUChzZS5ucl9taWdyYXRpb25zKTsKIAotI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCiAJaWYgKHNjaGVkc3RhdF9lbmFibGVkKCkpIHsKIAkJdTY0IGF2Z19hdG9tLCBhdmdfcGVyX2NwdTsKIAotCQlQTihzZS5zdGF0aXN0aWNzLnN1bV9zbGVlcF9ydW50aW1lKTsKLQkJUE4oc2Uuc3RhdGlzdGljcy53YWl0X3N0YXJ0KTsKLQkJUE4oc2Uuc3RhdGlzdGljcy5zbGVlcF9zdGFydCk7Ci0JCVBOKHNlLnN0YXRpc3RpY3MuYmxvY2tfc3RhcnQpOwotCQlQTihzZS5zdGF0aXN0aWNzLnNsZWVwX21heCk7Ci0JCVBOKHNlLnN0YXRpc3RpY3MuYmxvY2tfbWF4KTsKLQkJUE4oc2Uuc3RhdGlzdGljcy5leGVjX21heCk7Ci0JCVBOKHNlLnN0YXRpc3RpY3Muc2xpY2VfbWF4KTsKLQkJUE4oc2Uuc3RhdGlzdGljcy53YWl0X21heCk7Ci0JCVBOKHNlLnN0YXRpc3RpY3Mud2FpdF9zdW0pOwotCQlQKHNlLnN0YXRpc3RpY3Mud2FpdF9jb3VudCk7Ci0JCVBOKHNlLnN0YXRpc3RpY3MuaW93YWl0X3N1bSk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5pb3dhaXRfY291bnQpOwotCQlQKHNlLnN0YXRpc3RpY3MubnJfbWlncmF0aW9uc19jb2xkKTsKLQkJUChzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2FmZmluZSk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5ucl9mYWlsZWRfbWlncmF0aW9uc19ydW5uaW5nKTsKLQkJUChzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2hvdCk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5ucl9mb3JjZWRfbWlncmF0aW9ucyk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzKTsKLQkJUChzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc3luYyk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX21pZ3JhdGUpOwotCQlQKHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19sb2NhbCk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3JlbW90ZSk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX2FmZmluZSk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX2FmZmluZV9hdHRlbXB0cyk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3Bhc3NpdmUpOwotCQlQKHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19pZGxlKTsKKwkJUE5fU0NIRURTVEFUKHNlLnN0YXRpc3RpY3Muc3VtX3NsZWVwX3J1bnRpbWUpOworCQlQTl9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy53YWl0X3N0YXJ0KTsKKwkJUE5fU0NIRURTVEFUKHNlLnN0YXRpc3RpY3Muc2xlZXBfc3RhcnQpOworCQlQTl9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ibG9ja19zdGFydCk7CisJCVBOX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLnNsZWVwX21heCk7CisJCVBOX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLmJsb2NrX21heCk7CisJCVBOX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLmV4ZWNfbWF4KTsKKwkJUE5fU0NIRURTVEFUKHNlLnN0YXRpc3RpY3Muc2xpY2VfbWF4KTsKKwkJUE5fU0NIRURTVEFUKHNlLnN0YXRpc3RpY3Mud2FpdF9tYXgpOworCQlQTl9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy53YWl0X3N1bSk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3Mud2FpdF9jb3VudCk7CisJCVBOX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLmlvd2FpdF9zdW0pOworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLmlvd2FpdF9jb3VudCk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3MubnJfbWlncmF0aW9uc19jb2xkKTsKKwkJUF9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ucl9mYWlsZWRfbWlncmF0aW9uc19hZmZpbmUpOworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX3J1bm5pbmcpOworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2hvdCk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3MubnJfZm9yY2VkX21pZ3JhdGlvbnMpOworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHMpOworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc3luYyk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19taWdyYXRlKTsKKwkJUF9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX2xvY2FsKTsKKwkJUF9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3JlbW90ZSk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19hZmZpbmUpOworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfYWZmaW5lX2F0dGVtcHRzKTsKKwkJUF9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3Bhc3NpdmUpOworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfaWRsZSk7CiAKIAkJYXZnX2F0b20gPSBwLT5zZS5zdW1fZXhlY19ydW50aW1lOwogCQlpZiAobnJfc3dpdGNoZXMpCkBAIC05MzAsNyArOTM1LDcgQEAKIAkJX19QTihhdmdfYXRvbSk7CiAJCV9fUE4oYXZnX3Blcl9jcHUpOwogCX0KLSNlbmRpZgorCiAJX19QKG5yX3N3aXRjaGVzKTsKIAlTRVFfcHJpbnRmKG0sICIlLTQ1czolMjFMZFxuIiwKIAkJICAgIm5yX3ZvbHVudGFyeV9zd2l0Y2hlcyIsIChsb25nIGxvbmcpcC0+bnZjc3cpOwpAQCAtOTQ3LDggKzk1MiwxMCBAQAogI2VuZGlmCiAJUChwb2xpY3kpOwogCVAocHJpbyk7CisjdW5kZWYgUE5fU0NIRURTVEFUCiAjdW5kZWYgUE4KICN1bmRlZiBfX1BOCisjdW5kZWYgUF9TQ0hFRFNUQVQKICN1bmRlZiBQCiAjdW5kZWYgX19QCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9mYWlyLmMgYi9rZXJuZWwvc2NoZWQvZmFpci5jCmluZGV4IDAzOWRlMzQuLjUwMmU5NWEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9mYWlyLmMKKysrIGIva2VybmVsL3NjaGVkL2ZhaXIuYwpAQCAtMTE0LDYgKzExNCwxMiBAQAogdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9jZnNfYmFuZHdpZHRoX3NsaWNlID0gNTAwMFVMOwogI2VuZGlmCiAKKy8qCisgKiBUaGUgbWFyZ2luIHVzZWQgd2hlbiBjb21wYXJpbmcgdXRpbGl6YXRpb24gd2l0aCBDUFUgY2FwYWNpdHk6CisgKiB1dGlsICogMTAyNCA8IGNhcGFjaXR5ICogbWFyZ2luCisgKi8KK3Vuc2lnbmVkIGludCBjYXBhY2l0eV9tYXJnaW4gPSAxMjgwOyAvKiB+MjAlICovCisKIHN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfbG9hZF9hZGQoc3RydWN0IGxvYWRfd2VpZ2h0ICpsdywgdW5zaWduZWQgbG9uZyBpbmMpCiB7CiAJbHctPndlaWdodCArPSBpbmM7CkBAIC0yNTYsOSArMjYyLDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2tfb2Yoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCiB7Ci0jaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCi0JV0FSTl9PTl9PTkNFKCFlbnRpdHlfaXNfdGFzayhzZSkpOwotI2VuZGlmCisJU0NIRURfV0FSTl9PTighZW50aXR5X2lzX3Rhc2soc2UpKTsKIAlyZXR1cm4gY29udGFpbmVyX29mKHNlLCBzdHJ1Y3QgdGFza19zdHJ1Y3QsIHNlKTsKIH0KIApAQCAtNDU2LDE3ICs0NjAsMjMgQEAKIAogc3RhdGljIHZvaWQgdXBkYXRlX21pbl92cnVudGltZShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEpCiB7CisJc3RydWN0IHNjaGVkX2VudGl0eSAqY3VyciA9IGNmc19ycS0+Y3VycjsKKwogCXU2NCB2cnVudGltZSA9IGNmc19ycS0+bWluX3ZydW50aW1lOwogCi0JaWYgKGNmc19ycS0+Y3VycikKLQkJdnJ1bnRpbWUgPSBjZnNfcnEtPmN1cnItPnZydW50aW1lOworCWlmIChjdXJyKSB7CisJCWlmIChjdXJyLT5vbl9ycSkKKwkJCXZydW50aW1lID0gY3Vyci0+dnJ1bnRpbWU7CisJCWVsc2UKKwkJCWN1cnIgPSBOVUxMOworCX0KIAogCWlmIChjZnNfcnEtPnJiX2xlZnRtb3N0KSB7CiAJCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlID0gcmJfZW50cnkoY2ZzX3JxLT5yYl9sZWZ0bW9zdCwKIAkJCQkJCSAgIHN0cnVjdCBzY2hlZF9lbnRpdHksCiAJCQkJCQkgICBydW5fbm9kZSk7CiAKLQkJaWYgKCFjZnNfcnEtPmN1cnIpCisJCWlmICghY3VycikKIAkJCXZydW50aW1lID0gc2UtPnZydW50aW1lOwogCQllbHNlCiAJCQl2cnVudGltZSA9IG1pbl92cnVudGltZSh2cnVudGltZSwgc2UtPnZydW50aW1lKTsKQEAgLTY1Niw3ICs2NjYsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIGludCBzZWxlY3RfaWRsZV9zaWJsaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IGNwdSk7CitzdGF0aWMgaW50IHNlbGVjdF9pZGxlX3NpYmxpbmcoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgcHJldl9jcHUsIGludCBjcHUpOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgdGFza19oX2xvYWQoc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIAogLyoKQEAgLTcyNiw3ICs3MzYsNiBAQAogCXN0cnVjdCBzY2hlZF9hdmcgKnNhID0gJnNlLT5hdmc7CiAJbG9uZyBjYXAgPSAobG9uZykoU0NIRURfQ0FQQUNJVFlfU0NBTEUgLSBjZnNfcnEtPmF2Zy51dGlsX2F2ZykgLyAyOwogCXU2NCBub3cgPSBjZnNfcnFfY2xvY2tfdGFzayhjZnNfcnEpOwotCWludCB0Z191cGRhdGU7CiAKIAlpZiAoY2FwID4gMCkgewogCQlpZiAoY2ZzX3JxLT5hdmcudXRpbF9hdmcgIT0gMCkgewpAQCAtNzU5LDEwICs3NjgsOSBAQAogCQl9CiAJfQogCi0JdGdfdXBkYXRlID0gdXBkYXRlX2Nmc19ycV9sb2FkX2F2Zyhub3csIGNmc19ycSwgZmFsc2UpOworCXVwZGF0ZV9jZnNfcnFfbG9hZF9hdmcobm93LCBjZnNfcnEsIGZhbHNlKTsKIAlhdHRhY2hfZW50aXR5X2xvYWRfYXZnKGNmc19ycSwgc2UpOwotCWlmICh0Z191cGRhdGUpCi0JCXVwZGF0ZV90Z19sb2FkX2F2ZyhjZnNfcnEsIGZhbHNlKTsKKwl1cGRhdGVfdGdfbG9hZF9hdmcoY2ZzX3JxLCBmYWxzZSk7CiB9CiAKICNlbHNlIC8qICFDT05GSUdfU01QICovCkBAIC03OTksNyArODA3LDcgQEAKIAkJICAgICAgbWF4KGRlbHRhX2V4ZWMsIGN1cnItPnN0YXRpc3RpY3MuZXhlY19tYXgpKTsKIAogCWN1cnItPnN1bV9leGVjX3J1bnRpbWUgKz0gZGVsdGFfZXhlYzsKLQlzY2hlZHN0YXRfYWRkKGNmc19ycSwgZXhlY19jbG9jaywgZGVsdGFfZXhlYyk7CisJc2NoZWRzdGF0X2FkZChjZnNfcnEtPmV4ZWNfY2xvY2ssIGRlbHRhX2V4ZWMpOwogCiAJY3Vyci0+dnJ1bnRpbWUgKz0gY2FsY19kZWx0YV9mYWlyKGRlbHRhX2V4ZWMsIGN1cnIpOwogCXVwZGF0ZV9taW5fdnJ1bnRpbWUoY2ZzX3JxKTsKQEAgLTgyMCwyNiArODI4LDM0IEBACiAJdXBkYXRlX2N1cnIoY2ZzX3JxX29mKCZycS0+Y3Vyci0+c2UpKTsKIH0KIAotI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCiBzdGF0aWMgaW5saW5lIHZvaWQKIHVwZGF0ZV9zdGF0c193YWl0X3N0YXJ0KHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCiB7Ci0JdTY0IHdhaXRfc3RhcnQgPSBycV9jbG9jayhycV9vZihjZnNfcnEpKTsKKwl1NjQgd2FpdF9zdGFydCwgcHJldl93YWl0X3N0YXJ0OworCisJaWYgKCFzY2hlZHN0YXRfZW5hYmxlZCgpKQorCQlyZXR1cm47CisKKwl3YWl0X3N0YXJ0ID0gcnFfY2xvY2socnFfb2YoY2ZzX3JxKSk7CisJcHJldl93YWl0X3N0YXJ0ID0gc2NoZWRzdGF0X3ZhbChzZS0+c3RhdGlzdGljcy53YWl0X3N0YXJ0KTsKIAogCWlmIChlbnRpdHlfaXNfdGFzayhzZSkgJiYgdGFza19vbl9ycV9taWdyYXRpbmcodGFza19vZihzZSkpICYmCi0JICAgIGxpa2VseSh3YWl0X3N0YXJ0ID4gc2UtPnN0YXRpc3RpY3Mud2FpdF9zdGFydCkpCi0JCXdhaXRfc3RhcnQgLT0gc2UtPnN0YXRpc3RpY3Mud2FpdF9zdGFydDsKKwkgICAgbGlrZWx5KHdhaXRfc3RhcnQgPiBwcmV2X3dhaXRfc3RhcnQpKQorCQl3YWl0X3N0YXJ0IC09IHByZXZfd2FpdF9zdGFydDsKIAotCXNlLT5zdGF0aXN0aWNzLndhaXRfc3RhcnQgPSB3YWl0X3N0YXJ0OworCXNjaGVkc3RhdF9zZXQoc2UtPnN0YXRpc3RpY3Mud2FpdF9zdGFydCwgd2FpdF9zdGFydCk7CiB9CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIHVwZGF0ZV9zdGF0c193YWl0X2VuZChzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEsIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAl1NjQgZGVsdGE7CiAKLQlkZWx0YSA9IHJxX2Nsb2NrKHJxX29mKGNmc19ycSkpIC0gc2UtPnN0YXRpc3RpY3Mud2FpdF9zdGFydDsKKwlpZiAoIXNjaGVkc3RhdF9lbmFibGVkKCkpCisJCXJldHVybjsKKworCWRlbHRhID0gcnFfY2xvY2socnFfb2YoY2ZzX3JxKSkgLSBzY2hlZHN0YXRfdmFsKHNlLT5zdGF0aXN0aWNzLndhaXRfc3RhcnQpOwogCiAJaWYgKGVudGl0eV9pc190YXNrKHNlKSkgewogCQlwID0gdGFza19vZihzZSk7CkBAIC04NDksMzUgKzg2NSwxMTQgQEAKIAkJCSAqIHRpbWUgc3RhbXAgY2FuIGJlIGFkanVzdGVkIHRvIGFjY3VtdWxhdGUgd2FpdCB0aW1lCiAJCQkgKiBwcmlvciB0byBtaWdyYXRpb24uCiAJCQkgKi8KLQkJCXNlLT5zdGF0aXN0aWNzLndhaXRfc3RhcnQgPSBkZWx0YTsKKwkJCXNjaGVkc3RhdF9zZXQoc2UtPnN0YXRpc3RpY3Mud2FpdF9zdGFydCwgZGVsdGEpOwogCQkJcmV0dXJuOwogCQl9CiAJCXRyYWNlX3NjaGVkX3N0YXRfd2FpdChwLCBkZWx0YSk7CiAJfQogCi0Jc2UtPnN0YXRpc3RpY3Mud2FpdF9tYXggPSBtYXgoc2UtPnN0YXRpc3RpY3Mud2FpdF9tYXgsIGRlbHRhKTsKLQlzZS0+c3RhdGlzdGljcy53YWl0X2NvdW50Kys7Ci0Jc2UtPnN0YXRpc3RpY3Mud2FpdF9zdW0gKz0gZGVsdGE7Ci0Jc2UtPnN0YXRpc3RpY3Mud2FpdF9zdGFydCA9IDA7CisJc2NoZWRzdGF0X3NldChzZS0+c3RhdGlzdGljcy53YWl0X21heCwKKwkJICAgICAgbWF4KHNjaGVkc3RhdF92YWwoc2UtPnN0YXRpc3RpY3Mud2FpdF9tYXgpLCBkZWx0YSkpOworCXNjaGVkc3RhdF9pbmMoc2UtPnN0YXRpc3RpY3Mud2FpdF9jb3VudCk7CisJc2NoZWRzdGF0X2FkZChzZS0+c3RhdGlzdGljcy53YWl0X3N1bSwgZGVsdGEpOworCXNjaGVkc3RhdF9zZXQoc2UtPnN0YXRpc3RpY3Mud2FpdF9zdGFydCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordXBkYXRlX3N0YXRzX2VucXVldWVfc2xlZXBlcihzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEsIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gTlVMTDsKKwl1NjQgc2xlZXBfc3RhcnQsIGJsb2NrX3N0YXJ0OworCisJaWYgKCFzY2hlZHN0YXRfZW5hYmxlZCgpKQorCQlyZXR1cm47CisKKwlzbGVlcF9zdGFydCA9IHNjaGVkc3RhdF92YWwoc2UtPnN0YXRpc3RpY3Muc2xlZXBfc3RhcnQpOworCWJsb2NrX3N0YXJ0ID0gc2NoZWRzdGF0X3ZhbChzZS0+c3RhdGlzdGljcy5ibG9ja19zdGFydCk7CisKKwlpZiAoZW50aXR5X2lzX3Rhc2soc2UpKQorCQl0c2sgPSB0YXNrX29mKHNlKTsKKworCWlmIChzbGVlcF9zdGFydCkgeworCQl1NjQgZGVsdGEgPSBycV9jbG9jayhycV9vZihjZnNfcnEpKSAtIHNsZWVwX3N0YXJ0OworCisJCWlmICgoczY0KWRlbHRhIDwgMCkKKwkJCWRlbHRhID0gMDsKKworCQlpZiAodW5saWtlbHkoZGVsdGEgPiBzY2hlZHN0YXRfdmFsKHNlLT5zdGF0aXN0aWNzLnNsZWVwX21heCkpKQorCQkJc2NoZWRzdGF0X3NldChzZS0+c3RhdGlzdGljcy5zbGVlcF9tYXgsIGRlbHRhKTsKKworCQlzY2hlZHN0YXRfc2V0KHNlLT5zdGF0aXN0aWNzLnNsZWVwX3N0YXJ0LCAwKTsKKwkJc2NoZWRzdGF0X2FkZChzZS0+c3RhdGlzdGljcy5zdW1fc2xlZXBfcnVudGltZSwgZGVsdGEpOworCisJCWlmICh0c2spIHsKKwkJCWFjY291bnRfc2NoZWR1bGVyX2xhdGVuY3kodHNrLCBkZWx0YSA+PiAxMCwgMSk7CisJCQl0cmFjZV9zY2hlZF9zdGF0X3NsZWVwKHRzaywgZGVsdGEpOworCQl9CisJfQorCWlmIChibG9ja19zdGFydCkgeworCQl1NjQgZGVsdGEgPSBycV9jbG9jayhycV9vZihjZnNfcnEpKSAtIGJsb2NrX3N0YXJ0OworCisJCWlmICgoczY0KWRlbHRhIDwgMCkKKwkJCWRlbHRhID0gMDsKKworCQlpZiAodW5saWtlbHkoZGVsdGEgPiBzY2hlZHN0YXRfdmFsKHNlLT5zdGF0aXN0aWNzLmJsb2NrX21heCkpKQorCQkJc2NoZWRzdGF0X3NldChzZS0+c3RhdGlzdGljcy5ibG9ja19tYXgsIGRlbHRhKTsKKworCQlzY2hlZHN0YXRfc2V0KHNlLT5zdGF0aXN0aWNzLmJsb2NrX3N0YXJ0LCAwKTsKKwkJc2NoZWRzdGF0X2FkZChzZS0+c3RhdGlzdGljcy5zdW1fc2xlZXBfcnVudGltZSwgZGVsdGEpOworCisJCWlmICh0c2spIHsKKwkJCWlmICh0c2stPmluX2lvd2FpdCkgeworCQkJCXNjaGVkc3RhdF9hZGQoc2UtPnN0YXRpc3RpY3MuaW93YWl0X3N1bSwgZGVsdGEpOworCQkJCXNjaGVkc3RhdF9pbmMoc2UtPnN0YXRpc3RpY3MuaW93YWl0X2NvdW50KTsKKwkJCQl0cmFjZV9zY2hlZF9zdGF0X2lvd2FpdCh0c2ssIGRlbHRhKTsKKwkJCX0KKworCQkJdHJhY2Vfc2NoZWRfc3RhdF9ibG9ja2VkKHRzaywgZGVsdGEpOworCisJCQkvKgorCQkJICogQmxvY2tpbmcgdGltZSBpcyBpbiB1bml0cyBvZiBuYW5vc2Vjcywgc28gc2hpZnQgYnkKKwkJCSAqIDIwIHRvIGdldCBhIG1pbGxpc2Vjb25kcy1yYW5nZSBlc3RpbWF0aW9uIG9mIHRoZQorCQkJICogYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgdGFzayBzcGVudCBzbGVlcGluZzoKKwkJCSAqLworCQkJaWYgKHVubGlrZWx5KHByb2Zfb24gPT0gU0xFRVBfUFJPRklMSU5HKSkgeworCQkJCXByb2ZpbGVfaGl0cyhTTEVFUF9QUk9GSUxJTkcsCisJCQkJCQkodm9pZCAqKWdldF93Y2hhbih0c2spLAorCQkJCQkJZGVsdGEgPj4gMjApOworCQkJfQorCQkJYWNjb3VudF9zY2hlZHVsZXJfbGF0ZW5jeSh0c2ssIGRlbHRhID4+IDEwLCAwKTsKKwkJfQorCX0KIH0KIAogLyoKICAqIFRhc2sgaXMgYmVpbmcgZW5xdWV1ZWQgLSB1cGRhdGUgc3RhdHM6CiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotdXBkYXRlX3N0YXRzX2VucXVldWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKK3VwZGF0ZV9zdGF0c19lbnF1ZXVlKHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHNjaGVkX2VudGl0eSAqc2UsIGludCBmbGFncykKIHsKKwlpZiAoIXNjaGVkc3RhdF9lbmFibGVkKCkpCisJCXJldHVybjsKKwogCS8qCiAJICogQXJlIHdlIGVucXVldWVpbmcgYSB3YWl0aW5nIHRhc2s/IChmb3IgY3VycmVudCB0YXNrcwogCSAqIGEgZGVxdWV1ZS9lbnF1ZXVlIGV2ZW50IGlzIGEgTk9QKQogCSAqLwogCWlmIChzZSAhPSBjZnNfcnEtPmN1cnIpCiAJCXVwZGF0ZV9zdGF0c193YWl0X3N0YXJ0KGNmc19ycSwgc2UpOworCisJaWYgKGZsYWdzICYgRU5RVUVVRV9XQUtFVVApCisJCXVwZGF0ZV9zdGF0c19lbnF1ZXVlX3NsZWVwZXIoY2ZzX3JxLCBzZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogdXBkYXRlX3N0YXRzX2RlcXVldWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSwgaW50IGZsYWdzKQogeworCisJaWYgKCFzY2hlZHN0YXRfZW5hYmxlZCgpKQorCQlyZXR1cm47CisKIAkvKgogCSAqIE1hcmsgdGhlIGVuZCBvZiB0aGUgd2FpdCBwZXJpb2QgaWYgZGVxdWV1ZWluZyBhCiAJICogd2FpdGluZyB0YXNrOgpAQCAtODg1LDM5ICs5ODAsMTcgQEAKIAlpZiAoc2UgIT0gY2ZzX3JxLT5jdXJyKQogCQl1cGRhdGVfc3RhdHNfd2FpdF9lbmQoY2ZzX3JxLCBzZSk7CiAKLQlpZiAoZmxhZ3MgJiBERVFVRVVFX1NMRUVQKSB7Ci0JCWlmIChlbnRpdHlfaXNfdGFzayhzZSkpIHsKLQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gdGFza19vZihzZSk7CisJaWYgKChmbGFncyAmIERFUVVFVUVfU0xFRVApICYmIGVudGl0eV9pc190YXNrKHNlKSkgeworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IHRhc2tfb2Yoc2UpOwogCi0JCQlpZiAodHNrLT5zdGF0ZSAmIFRBU0tfSU5URVJSVVBUSUJMRSkKLQkJCQlzZS0+c3RhdGlzdGljcy5zbGVlcF9zdGFydCA9IHJxX2Nsb2NrKHJxX29mKGNmc19ycSkpOwotCQkJaWYgKHRzay0+c3RhdGUgJiBUQVNLX1VOSU5URVJSVVBUSUJMRSkKLQkJCQlzZS0+c3RhdGlzdGljcy5ibG9ja19zdGFydCA9IHJxX2Nsb2NrKHJxX29mKGNmc19ycSkpOwotCQl9CisJCWlmICh0c2stPnN0YXRlICYgVEFTS19JTlRFUlJVUFRJQkxFKQorCQkJc2NoZWRzdGF0X3NldChzZS0+c3RhdGlzdGljcy5zbGVlcF9zdGFydCwKKwkJCQkgICAgICBycV9jbG9jayhycV9vZihjZnNfcnEpKSk7CisJCWlmICh0c2stPnN0YXRlICYgVEFTS19VTklOVEVSUlVQVElCTEUpCisJCQlzY2hlZHN0YXRfc2V0KHNlLT5zdGF0aXN0aWNzLmJsb2NrX3N0YXJ0LAorCQkJCSAgICAgIHJxX2Nsb2NrKHJxX29mKGNmc19ycSkpKTsKIAl9Ci0KIH0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQKLXVwZGF0ZV9zdGF0c193YWl0X3N0YXJ0KHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotdXBkYXRlX3N0YXRzX3dhaXRfZW5kKHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotdXBkYXRlX3N0YXRzX2VucXVldWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKLXsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi11cGRhdGVfc3RhdHNfZGVxdWV1ZShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEsIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlLCBpbnQgZmxhZ3MpCi17Ci19Ci0jZW5kaWYKIAogLyoKICAqIFdlIGFyZSBwaWNraW5nIGEgbmV3IGN1cnJlbnQgdGFzayAtIHVwZGF0ZSBpdHMgc3RhdHM6CkBAIC0xNTEzLDggKzE1ODYsMTYgQEAKIAkgKiBPbmUgaWRsZSBDUFUgcGVyIG5vZGUgaXMgZXZhbHVhdGVkIGZvciBhIHRhc2sgbnVtYSBtb3ZlLgogCSAqIENhbGwgc2VsZWN0X2lkbGVfc2libGluZyB0byBtYXliZSBmaW5kIGEgYmV0dGVyIG9uZS4KIAkgKi8KLQlpZiAoIWN1cikKLQkJZW52LT5kc3RfY3B1ID0gc2VsZWN0X2lkbGVfc2libGluZyhlbnYtPnAsIGVudi0+ZHN0X2NwdSk7CisJaWYgKCFjdXIpIHsKKwkJLyoKKwkJICogc2VsZWN0X2lkbGVfc2libGluZ3MoKSB1c2VzIGFuIHBlci1jcHUgY3B1bWFzayB0aGF0CisJCSAqIGNhbiBiZSB1c2VkIGZyb20gSVJRIGNvbnRleHQuCisJCSAqLworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQllbnYtPmRzdF9jcHUgPSBzZWxlY3RfaWRsZV9zaWJsaW5nKGVudi0+cCwgZW52LT5zcmNfY3B1LAorCQkJCQkJICAgZW52LT5kc3RfY3B1KTsKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCX0KIAogYXNzaWduOgogCXRhc2tfbnVtYV9hc3NpZ24oZW52LCBjdXIsIGltcCk7CkBAIC0yMjkyLDcgKzIzNzMsNyBAQAogCXVuc2lnbmVkIGxvbmcgbnJfcHRlX3VwZGF0ZXMgPSAwOwogCWxvbmcgcGFnZXMsIHZpcnRwYWdlczsKIAotCVdBUk5fT05fT05DRShwICE9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QsIG51bWFfd29yaykpOworCVNDSEVEX1dBUk5fT04ocCAhPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHRhc2tfc3RydWN0LCBudW1hX3dvcmspKTsKIAogCXdvcmstPm5leHQgPSB3b3JrOyAvKiBwcm90ZWN0IGFnYWluc3QgZG91YmxlIGFkZCAqLwogCS8qCkBAIC0yODAzLDkgKzI4ODQsMjEgQEAKIH0KIAogI2lmZGVmIENPTkZJR19GQUlSX0dST1VQX1NDSEVECi0vKgotICogVXBkYXRpbmcgdGcncyBsb2FkX2F2ZyBpcyBuZWNlc3NhcnkgYmVmb3JlIHVwZGF0ZV9jZnNfc2hhcmUgKHdoaWNoIGlzIGRvbmUpCi0gKiBhbmQgZWZmZWN0aXZlX2xvYWQgKHdoaWNoIGlzIG5vdCBkb25lIGJlY2F1c2UgaXQgaXMgdG9vIGNvc3RseSkuCisvKioKKyAqIHVwZGF0ZV90Z19sb2FkX2F2ZyAtIHVwZGF0ZSB0aGUgdGcncyBsb2FkIGF2ZworICogQGNmc19ycTogdGhlIGNmc19ycSB3aG9zZSBhdmcgY2hhbmdlZAorICogQGZvcmNlOiB1cGRhdGUgcmVnYXJkbGVzcyBvZiBob3cgc21hbGwgdGhlIGRpZmZlcmVuY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uICdlbnN1cmVzJzogdGctPmxvYWRfYXZnIDo9IFxTdW0gdGctPmNmc19ycVtdLT5hdmcubG9hZC4KKyAqIEhvd2V2ZXIsIGJlY2F1c2UgdGctPmxvYWRfYXZnIGlzIGEgZ2xvYmFsIHZhbHVlIHRoZXJlIGFyZSBwZXJmb3JtYW5jZQorICogY29uc2lkZXJhdGlvbnMuCisgKgorICogSW4gb3JkZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGxvb2sgYXQgdGhlIG90aGVyIGNmc19ycSdzLCB3ZSB1c2UgYQorICogZGlmZmVyZW50aWFsIHVwZGF0ZSB3aGVyZSB3ZSBzdG9yZSB0aGUgbGFzdCB2YWx1ZSB3ZSBwcm9wYWdhdGVkLiBUaGlzIGluCisgKiB0dXJuIGFsbG93cyBza2lwcGluZyB1cGRhdGVzIGlmIHRoZSBkaWZmZXJlbnRpYWwgaXMgJ3NtYWxsJy4KKyAqCisgKiBVcGRhdGluZyB0ZydzIGxvYWRfYXZnIGlzIG5lY2Vzc2FyeSBiZWZvcmUgdXBkYXRlX2Nmc19zaGFyZSgpICh3aGljaCBpcworICogZG9uZSkgYW5kIGVmZmVjdGl2ZV9sb2FkKCkgKHdoaWNoIGlzIG5vdCBkb25lIGJlY2F1c2UgaXQgaXMgdG9vIGNvc3RseSkuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfdGdfbG9hZF9hdmcoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBpbnQgZm9yY2UpCiB7CkBAIC0yODc1LDEyICsyOTY4LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGNmc19ycV91dGlsX2NoYW5nZShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEpCiB7Ci0Jc3RydWN0IHJxICpycSA9IHJxX29mKGNmc19ycSk7Ci0JaW50IGNwdSA9IGNwdV9vZihycSk7Ci0KLQlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSAmJiAmcnEtPmNmcyA9PSBjZnNfcnEpIHsKLQkJdW5zaWduZWQgbG9uZyBtYXggPSBycS0+Y3B1X2NhcGFjaXR5X29yaWc7Ci0KKwlpZiAoJnRoaXNfcnEoKS0+Y2ZzID09IGNmc19ycSkgewogCQkvKgogCQkgKiBUaGVyZSBhcmUgYSBmZXcgYm91bmRhcnkgY2FzZXMgdGhpcyBtaWdodCBtaXNzIGJ1dCBpdCBzaG91bGQKIAkJICogZ2V0IGNhbGxlZCBvZnRlbiBlbm91Z2ggdGhhdCB0aGF0IHNob3VsZCAoaG9wZWZ1bGx5KSBub3QgYmUKQEAgLTI4OTcsOCArMjk4NSw3IEBACiAJCSAqCiAJCSAqIFNlZSBjcHVfdXRpbCgpLgogCQkgKi8KLQkJY3B1ZnJlcV91cGRhdGVfdXRpbChycV9jbG9jayhycSksCi0JCQkJICAgIG1pbihjZnNfcnEtPmF2Zy51dGlsX2F2ZywgbWF4KSwgbWF4KTsKKwkJY3B1ZnJlcV91cGRhdGVfdXRpbChycV9vZihjZnNfcnEpLCAwKTsKIAl9CiB9CiAKQEAgLTI5MzEsMTAgKzMwMTgsMTAgQEAKICAqCiAgKiBjZnNfcnEtPmF2ZyBpcyB1c2VkIGZvciB0YXNrX2hfbG9hZCgpIGFuZCB1cGRhdGVfY2ZzX3NoYXJlKCkgZm9yIGV4YW1wbGUuCiAgKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBsb2FkIGRlY2F5ZWQgb3Igd2UgcmVtb3ZlZCB1dGlsaXphdGlvbi4gSXQgaXMgZXhwZWN0ZWQKLSAqIHRoYXQgb25lIGNhbGxzIHVwZGF0ZV90Z19sb2FkX2F2ZygpIG9uIHRoaXMgY29uZGl0aW9uLCBidXQgYWZ0ZXIgeW91J3ZlCi0gKiBtb2RpZmllZCB0aGUgY2ZzX3JxIGF2ZyAoYXR0YWNoL2RldGFjaCksIHN1Y2ggdGhhdCB3ZSBwcm9wYWdhdGUgdGhlIG5ldwotICogYXZnIHVwLgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBsb2FkIGRlY2F5ZWQgb3Igd2UgcmVtb3ZlZCBsb2FkLgorICoKKyAqIFNpbmNlIGJvdGggdGhlc2UgY29uZGl0aW9ucyBpbmRpY2F0ZSBhIGNoYW5nZWQgY2ZzX3JxLT5hdmcubG9hZCB3ZSBzaG91bGQKKyAqIGNhbGwgdXBkYXRlX3RnX2xvYWRfYXZnKCkgd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS4KICAqLwogc3RhdGljIGlubGluZSBpbnQKIHVwZGF0ZV9jZnNfcnFfbG9hZF9hdmcodTY0IG5vdywgc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBib29sIHVwZGF0ZV9mcmVxKQpAQCAtMzE1OSwxMCArMzI0Niw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfbG9hZF9hdmcoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UsIGludCBub3RfdXNlZCkKIHsKLQlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEgPSBjZnNfcnFfb2Yoc2UpOwotCXN0cnVjdCBycSAqcnEgPSBycV9vZihjZnNfcnEpOwotCi0JY3B1ZnJlcV90cmlnZ2VyX3VwZGF0ZShycV9jbG9jayhycSkpOworCWNwdWZyZXFfdXBkYXRlX3V0aWwocnFfb2YoY2ZzX3JxX29mKHNlKSksIDApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTMxODMsNjggKzMyNjcsNiBAQAogCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCi1zdGF0aWMgdm9pZCBlbnF1ZXVlX3NsZWVwZXIoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKLXsKLSNpZmRlZiBDT05GSUdfU0NIRURTVEFUUwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gTlVMTDsKLQotCWlmIChlbnRpdHlfaXNfdGFzayhzZSkpCi0JCXRzayA9IHRhc2tfb2Yoc2UpOwotCi0JaWYgKHNlLT5zdGF0aXN0aWNzLnNsZWVwX3N0YXJ0KSB7Ci0JCXU2NCBkZWx0YSA9IHJxX2Nsb2NrKHJxX29mKGNmc19ycSkpIC0gc2UtPnN0YXRpc3RpY3Muc2xlZXBfc3RhcnQ7Ci0KLQkJaWYgKChzNjQpZGVsdGEgPCAwKQotCQkJZGVsdGEgPSAwOwotCi0JCWlmICh1bmxpa2VseShkZWx0YSA+IHNlLT5zdGF0aXN0aWNzLnNsZWVwX21heCkpCi0JCQlzZS0+c3RhdGlzdGljcy5zbGVlcF9tYXggPSBkZWx0YTsKLQotCQlzZS0+c3RhdGlzdGljcy5zbGVlcF9zdGFydCA9IDA7Ci0JCXNlLT5zdGF0aXN0aWNzLnN1bV9zbGVlcF9ydW50aW1lICs9IGRlbHRhOwotCi0JCWlmICh0c2spIHsKLQkJCWFjY291bnRfc2NoZWR1bGVyX2xhdGVuY3kodHNrLCBkZWx0YSA+PiAxMCwgMSk7Ci0JCQl0cmFjZV9zY2hlZF9zdGF0X3NsZWVwKHRzaywgZGVsdGEpOwotCQl9Ci0JfQotCWlmIChzZS0+c3RhdGlzdGljcy5ibG9ja19zdGFydCkgewotCQl1NjQgZGVsdGEgPSBycV9jbG9jayhycV9vZihjZnNfcnEpKSAtIHNlLT5zdGF0aXN0aWNzLmJsb2NrX3N0YXJ0OwotCi0JCWlmICgoczY0KWRlbHRhIDwgMCkKLQkJCWRlbHRhID0gMDsKLQotCQlpZiAodW5saWtlbHkoZGVsdGEgPiBzZS0+c3RhdGlzdGljcy5ibG9ja19tYXgpKQotCQkJc2UtPnN0YXRpc3RpY3MuYmxvY2tfbWF4ID0gZGVsdGE7Ci0KLQkJc2UtPnN0YXRpc3RpY3MuYmxvY2tfc3RhcnQgPSAwOwotCQlzZS0+c3RhdGlzdGljcy5zdW1fc2xlZXBfcnVudGltZSArPSBkZWx0YTsKLQotCQlpZiAodHNrKSB7Ci0JCQlpZiAodHNrLT5pbl9pb3dhaXQpIHsKLQkJCQlzZS0+c3RhdGlzdGljcy5pb3dhaXRfc3VtICs9IGRlbHRhOwotCQkJCXNlLT5zdGF0aXN0aWNzLmlvd2FpdF9jb3VudCsrOwotCQkJCXRyYWNlX3NjaGVkX3N0YXRfaW93YWl0KHRzaywgZGVsdGEpOwotCQkJfQotCi0JCQl0cmFjZV9zY2hlZF9zdGF0X2Jsb2NrZWQodHNrLCBkZWx0YSk7Ci0KLQkJCS8qCi0JCQkgKiBCbG9ja2luZyB0aW1lIGlzIGluIHVuaXRzIG9mIG5hbm9zZWNzLCBzbyBzaGlmdCBieQotCQkJICogMjAgdG8gZ2V0IGEgbWlsbGlzZWNvbmRzLXJhbmdlIGVzdGltYXRpb24gb2YgdGhlCi0JCQkgKiBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSB0YXNrIHNwZW50IHNsZWVwaW5nOgotCQkJICovCi0JCQlpZiAodW5saWtlbHkocHJvZl9vbiA9PSBTTEVFUF9QUk9GSUxJTkcpKSB7Ci0JCQkJcHJvZmlsZV9oaXRzKFNMRUVQX1BST0ZJTElORywKLQkJCQkJCSh2b2lkICopZ2V0X3djaGFuKHRzayksCi0JCQkJCQlkZWx0YSA+PiAyMCk7Ci0JCQl9Ci0JCQlhY2NvdW50X3NjaGVkdWxlcl9sYXRlbmN5KHRzaywgZGVsdGEgPj4gMTAsIDApOwotCQl9Ci0JfQotI2VuZGlmCi19Ci0KIHN0YXRpYyB2b2lkIGNoZWNrX3NwcmVhZChzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEsIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKQogewogI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRwpAQCAtMzI1NCw3ICszMjc2LDcgQEAKIAkJZCA9IC1kOwogCiAJaWYgKGQgPiAzKnN5c2N0bF9zY2hlZF9sYXRlbmN5KQotCQlzY2hlZHN0YXRfaW5jKGNmc19ycSwgbnJfc3ByZWFkX292ZXIpOworCQlzY2hlZHN0YXRfaW5jKGNmc19ycS0+bnJfc3ByZWFkX292ZXIpOwogI2VuZGlmCiB9CiAKQEAgLTMzNzEsMTcgKzMzOTMsMTIgQEAKIAlhY2NvdW50X2VudGl0eV9lbnF1ZXVlKGNmc19ycSwgc2UpOwogCXVwZGF0ZV9jZnNfc2hhcmVzKGNmc19ycSk7CiAKLQlpZiAoZmxhZ3MgJiBFTlFVRVVFX1dBS0VVUCkgeworCWlmIChmbGFncyAmIEVOUVVFVUVfV0FLRVVQKQogCQlwbGFjZV9lbnRpdHkoY2ZzX3JxLCBzZSwgMCk7Ci0JCWlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKQotCQkJZW5xdWV1ZV9zbGVlcGVyKGNmc19ycSwgc2UpOwotCX0KIAogCWNoZWNrX3NjaGVkc3RhdF9yZXF1aXJlZCgpOwotCWlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKSB7Ci0JCXVwZGF0ZV9zdGF0c19lbnF1ZXVlKGNmc19ycSwgc2UpOwotCQljaGVja19zcHJlYWQoY2ZzX3JxLCBzZSk7Ci0JfQorCXVwZGF0ZV9zdGF0c19lbnF1ZXVlKGNmc19ycSwgc2UsIGZsYWdzKTsKKwljaGVja19zcHJlYWQoY2ZzX3JxLCBzZSk7CiAJaWYgKCFjdXJyKQogCQlfX2VucXVldWVfZW50aXR5KGNmc19ycSwgc2UpOwogCXNlLT5vbl9ycSA9IDE7CkBAIC0zNDQ4LDggKzM0NjUsNyBAQAogCXVwZGF0ZV9jdXJyKGNmc19ycSk7CiAJZGVxdWV1ZV9lbnRpdHlfbG9hZF9hdmcoY2ZzX3JxLCBzZSk7CiAKLQlpZiAoc2NoZWRzdGF0X2VuYWJsZWQoKSkKLQkJdXBkYXRlX3N0YXRzX2RlcXVldWUoY2ZzX3JxLCBzZSwgZmxhZ3MpOworCXVwZGF0ZV9zdGF0c19kZXF1ZXVlKGNmc19ycSwgc2UsIGZsYWdzKTsKIAogCWNsZWFyX2J1ZGRpZXMoY2ZzX3JxLCBzZSk7CiAKQEAgLTM0NTksOSArMzQ3NSwxMCBAQAogCWFjY291bnRfZW50aXR5X2RlcXVldWUoY2ZzX3JxLCBzZSk7CiAKIAkvKgotCSAqIE5vcm1hbGl6ZSB0aGUgZW50aXR5IGFmdGVyIHVwZGF0aW5nIHRoZSBtaW5fdnJ1bnRpbWUgYmVjYXVzZSB0aGUKLQkgKiB1cGRhdGUgY2FuIHJlZmVyIHRvIHRoZSAtPmN1cnIgaXRlbSBhbmQgd2UgbmVlZCB0byByZWZsZWN0IHRoaXMKLQkgKiBtb3ZlbWVudCBpbiBvdXIgbm9ybWFsaXplZCBwb3NpdGlvbi4KKwkgKiBOb3JtYWxpemUgYWZ0ZXIgdXBkYXRlX2N1cnIoKTsgd2hpY2ggd2lsbCBhbHNvIGhhdmUgbW92ZWQKKwkgKiBtaW5fdnJ1bnRpbWUgaWYgQHNlIGlzIHRoZSBvbmUgaG9sZGluZyBpdCBiYWNrLiBCdXQgYmVmb3JlIGRvaW5nCisJICogdXBkYXRlX21pbl92cnVudGltZSgpIGFnYWluLCB3aGljaCB3aWxsIGRpc2NvdW50IEBzZSdzIHBvc2l0aW9uIGFuZAorCSAqIGNhbiBtb3ZlIG1pbl92cnVudGltZSBmb3J3YXJkIHN0aWxsIG1vcmUuCiAJICovCiAJaWYgKCEoZmxhZ3MgJiBERVFVRVVFX1NMRUVQKSkKIAkJc2UtPnZydW50aW1lIC09IGNmc19ycS0+bWluX3ZydW50aW1lOwpAQCAtMzQ2OSw4ICszNDg2LDE2IEBACiAJLyogcmV0dXJuIGV4Y2VzcyBydW50aW1lIG9uIGxhc3QgZGVxdWV1ZSAqLwogCXJldHVybl9jZnNfcnFfcnVudGltZShjZnNfcnEpOwogCi0JdXBkYXRlX21pbl92cnVudGltZShjZnNfcnEpOwogCXVwZGF0ZV9jZnNfc2hhcmVzKGNmc19ycSk7CisKKwkvKgorCSAqIE5vdyBhZHZhbmNlIG1pbl92cnVudGltZSBpZiBAc2Ugd2FzIHRoZSBlbnRpdHkgaG9sZGluZyBpdCBiYWNrLAorCSAqIGV4Y2VwdCB3aGVuOiBERVFVRVVFX1NBVkUgJiYgIURFUVVFVUVfTU9WRSwgaW4gdGhpcyBjYXNlIHdlJ2xsIGJlCisJICogcHV0IGJhY2sgb24sIGFuZCBpZiB3ZSBhZHZhbmNlIG1pbl92cnVudGltZSwgd2UnbGwgYmUgcGxhY2VkIGJhY2sKKwkgKiBmdXJ0aGVyIHRoYW4gd2Ugc3RhcnRlZCAtLSBpZS4gd2UnbGwgYmUgcGVuYWxpemVkLgorCSAqLworCWlmICgoZmxhZ3MgJiAoREVRVUVVRV9TQVZFIHwgREVRVUVVRV9NT1ZFKSkgPT0gREVRVUVVRV9TQVZFKQorCQl1cGRhdGVfbWluX3ZydW50aW1lKGNmc19ycSk7CiB9CiAKIC8qCkBAIC0zNTIzLDI1ICszNTQ4LDI1IEBACiAJCSAqIGEgQ1BVLiBTbyBhY2NvdW50IGZvciB0aGUgdGltZSBpdCBzcGVudCB3YWl0aW5nIG9uIHRoZQogCQkgKiBydW5xdWV1ZS4KIAkJICovCi0JCWlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKQotCQkJdXBkYXRlX3N0YXRzX3dhaXRfZW5kKGNmc19ycSwgc2UpOworCQl1cGRhdGVfc3RhdHNfd2FpdF9lbmQoY2ZzX3JxLCBzZSk7CiAJCV9fZGVxdWV1ZV9lbnRpdHkoY2ZzX3JxLCBzZSk7CiAJCXVwZGF0ZV9sb2FkX2F2ZyhzZSwgMSk7CiAJfQogCiAJdXBkYXRlX3N0YXRzX2N1cnJfc3RhcnQoY2ZzX3JxLCBzZSk7CiAJY2ZzX3JxLT5jdXJyID0gc2U7Ci0jaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKKwogCS8qCiAJICogVHJhY2sgb3VyIG1heGltdW0gc2xpY2UgbGVuZ3RoLCBpZiB0aGUgQ1BVJ3MgbG9hZCBpcyBhdAogCSAqIGxlYXN0IHR3aWNlIHRoYXQgb2Ygb3VyIG93biB3ZWlnaHQgKGkuZS4gZG9udCB0cmFjayBpdAogCSAqIHdoZW4gdGhlcmUgYXJlIG9ubHkgbGVzc2VyLXdlaWdodCB0YXNrcyBhcm91bmQpOgogCSAqLwogCWlmIChzY2hlZHN0YXRfZW5hYmxlZCgpICYmIHJxX29mKGNmc19ycSktPmxvYWQud2VpZ2h0ID49IDIqc2UtPmxvYWQud2VpZ2h0KSB7Ci0JCXNlLT5zdGF0aXN0aWNzLnNsaWNlX21heCA9IG1heChzZS0+c3RhdGlzdGljcy5zbGljZV9tYXgsCi0JCQlzZS0+c3VtX2V4ZWNfcnVudGltZSAtIHNlLT5wcmV2X3N1bV9leGVjX3J1bnRpbWUpOworCQlzY2hlZHN0YXRfc2V0KHNlLT5zdGF0aXN0aWNzLnNsaWNlX21heCwKKwkJCW1heCgodTY0KXNjaGVkc3RhdF92YWwoc2UtPnN0YXRpc3RpY3Muc2xpY2VfbWF4KSwKKwkJCSAgICBzZS0+c3VtX2V4ZWNfcnVudGltZSAtIHNlLT5wcmV2X3N1bV9leGVjX3J1bnRpbWUpKTsKIAl9Ci0jZW5kaWYKKwogCXNlLT5wcmV2X3N1bV9leGVjX3J1bnRpbWUgPSBzZS0+c3VtX2V4ZWNfcnVudGltZTsKIH0KIApAQCAtMzYyMCwxMyArMzY0NSwxMCBAQAogCS8qIHRocm90dGxlIGNmc19ycXMgZXhjZWVkaW5nIHJ1bnRpbWUgKi8KIAljaGVja19jZnNfcnFfcnVudGltZShjZnNfcnEpOwogCi0JaWYgKHNjaGVkc3RhdF9lbmFibGVkKCkpIHsKLQkJY2hlY2tfc3ByZWFkKGNmc19ycSwgcHJldik7Ci0JCWlmIChwcmV2LT5vbl9ycSkKLQkJCXVwZGF0ZV9zdGF0c193YWl0X3N0YXJ0KGNmc19ycSwgcHJldik7Ci0JfQorCWNoZWNrX3NwcmVhZChjZnNfcnEsIHByZXYpOwogCiAJaWYgKHByZXYtPm9uX3JxKSB7CisJCXVwZGF0ZV9zdGF0c193YWl0X3N0YXJ0KGNmc19ycSwgcHJldik7CiAJCS8qIFB1dCAnY3VycmVudCcgYmFjayBpbnRvIHRoZSB0cmVlLiAqLwogCQlfX2VucXVldWVfZW50aXR5KGNmc19ycSwgcHJldik7CiAJCS8qIGluICFvbl9ycSBjYXNlLCB1cGRhdGUgb2NjdXJyZWQgYXQgZGVxdWV1ZSAqLwpAQCAtNDQ1Niw5ICs0NDc4LDkgQEAKIAlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSA9ICZwLT5zZTsKIAlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEgPSBjZnNfcnFfb2Yoc2UpOwogCi0JV0FSTl9PTih0YXNrX3JxKHApICE9IHJxKTsKKwlTQ0hFRF9XQVJOX09OKHRhc2tfcnEocCkgIT0gcnEpOwogCi0JaWYgKGNmc19ycS0+bnJfcnVubmluZyA+IDEpIHsKKwlpZiAocnEtPmNmcy5oX25yX3J1bm5pbmcgPiAxKSB7CiAJCXU2NCBzbGljZSA9IHNjaGVkX3NsaWNlKGNmc19ycSwgc2UpOwogCQl1NjQgcmFuID0gc2UtPnN1bV9leGVjX3J1bnRpbWUgLSBzZS0+cHJldl9zdW1fZXhlY19ydW50aW1lOwogCQlzNjQgZGVsdGEgPSBzbGljZSAtIHJhbjsKQEAgLTQ1MDksNiArNDUzMSwxNCBAQAogCXN0cnVjdCBjZnNfcnEgKmNmc19ycTsKIAlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSA9ICZwLT5zZTsKIAorCS8qCisJICogSWYgaW5faW93YWl0IGlzIHNldCwgdGhlIGNvZGUgYmVsb3cgbWF5IG5vdCB0cmlnZ2VyIGFueSBjcHVmcmVxCisJICogdXRpbGl6YXRpb24gdXBkYXRlcywgc28gZG8gaXQgaGVyZSBleHBsaWNpdGx5IHdpdGggdGhlIElPV0FJVCBmbGFnCisJICogcGFzc2VkLgorCSAqLworCWlmIChwLT5pbl9pb3dhaXQpCisJCWNwdWZyZXFfdXBkYXRlX3RoaXNfY3B1KHJxLCBTQ0hFRF9DUFVGUkVRX0lPV0FJVCk7CisKIAlmb3JfZWFjaF9zY2hlZF9lbnRpdHkoc2UpIHsKIAkJaWYgKHNlLT5vbl9ycSkKIAkJCWJyZWFrOwpAQCAtNDYwNSw2ICs0NjM1LDExIEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCisKKy8qIFdvcmtpbmcgY3B1bWFzayBmb3I6IGxvYWRfYmFsYW5jZSwgbG9hZF9iYWxhbmNlX25ld2lkbGUuICovCitERUZJTkVfUEVSX0NQVShjcHVtYXNrX3Zhcl90LCBsb2FkX2JhbGFuY2VfbWFzayk7CitERUZJTkVfUEVSX0NQVShjcHVtYXNrX3Zhcl90LCBzZWxlY3RfaWRsZV9tYXNrKTsKKwogI2lmZGVmIENPTkZJR19OT19IWl9DT01NT04KIC8qCiAgKiBwZXIgcnEgJ2xvYWQnIGFycnJheSBjcmFwOyBYWFgga2lsbCB0aGlzLgpAQCAtNTAwNiw5ICs1MDQxLDkgQEAKIAkJICogd2wgPSBTICogcydfaTsgc2VlICgyKQogCQkgKi8KIAkJaWYgKFcgPiAwICYmIHcgPCBXKQotCQkJd2wgPSAodyAqIChsb25nKXRnLT5zaGFyZXMpIC8gVzsKKwkJCXdsID0gKHcgKiAobG9uZylzY2FsZV9sb2FkX2Rvd24odGctPnNoYXJlcykpIC8gVzsKIAkJZWxzZQotCQkJd2wgPSB0Zy0+c2hhcmVzOworCQkJd2wgPSBzY2FsZV9sb2FkX2Rvd24odGctPnNoYXJlcyk7CiAKIAkJLyoKIAkJICogUGVyIHRoZSBhYm92ZSwgd2wgaXMgdGhlIG5ldyBzZS0+bG9hZC53ZWlnaHQgdmFsdWU7IHNpbmNlCkBAIC01MDkxLDE4ICs1MTI2LDE4IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgd2FrZV9hZmZpbmUoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHN5bmMpCitzdGF0aWMgaW50IHdha2VfYWZmaW5lKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCisJCSAgICAgICBpbnQgcHJldl9jcHUsIGludCBzeW5jKQogewogCXM2NCB0aGlzX2xvYWQsIGxvYWQ7CiAJczY0IHRoaXNfZWZmX2xvYWQsIHByZXZfZWZmX2xvYWQ7Ci0JaW50IGlkeCwgdGhpc19jcHUsIHByZXZfY3B1OworCWludCBpZHgsIHRoaXNfY3B1OwogCXN0cnVjdCB0YXNrX2dyb3VwICp0ZzsKIAl1bnNpZ25lZCBsb25nIHdlaWdodDsKIAlpbnQgYmFsYW5jZWQ7CiAKIAlpZHgJICA9IHNkLT53YWtlX2lkeDsKIAl0aGlzX2NwdSAgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JcHJldl9jcHUgID0gdGFza19jcHUocCk7CiAJbG9hZAkgID0gc291cmNlX2xvYWQocHJldl9jcHUsIGlkeCk7CiAJdGhpc19sb2FkID0gdGFyZ2V0X2xvYWQodGhpc19jcHUsIGlkeCk7CiAKQEAgLTUxNDYsMTMgKzUxODEsMTMgQEAKIAogCWJhbGFuY2VkID0gdGhpc19lZmZfbG9hZCA8PSBwcmV2X2VmZl9sb2FkOwogCi0Jc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfYWZmaW5lX2F0dGVtcHRzKTsKKwlzY2hlZHN0YXRfaW5jKHAtPnNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19hZmZpbmVfYXR0ZW1wdHMpOwogCiAJaWYgKCFiYWxhbmNlZCkKIAkJcmV0dXJuIDA7CiAKLQlzY2hlZHN0YXRfaW5jKHNkLCB0dHd1X21vdmVfYWZmaW5lKTsKLQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19hZmZpbmUpOworCXNjaGVkc3RhdF9pbmMoc2QtPnR0d3VfbW92ZV9hZmZpbmUpOworCXNjaGVkc3RhdF9pbmMocC0+c2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX2FmZmluZSk7CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTUyMjgsNiArNTI2MywxMCBAQAogCWludCBzaGFsbG93ZXN0X2lkbGVfY3B1ID0gLTE7CiAJaW50IGk7CiAKKwkvKiBDaGVjayBpZiB3ZSBoYXZlIGFueSBjaG9pY2U6ICovCisJaWYgKGdyb3VwLT5ncm91cF93ZWlnaHQgPT0gMSkKKwkJcmV0dXJuIGNwdW1hc2tfZmlyc3Qoc2NoZWRfZ3JvdXBfY3B1cyhncm91cCkpOworCiAJLyogVHJhdmVyc2Ugb25seSB0aGUgYWxsb3dlZCBDUFVzICovCiAJZm9yX2VhY2hfY3B1X2FuZChpLCBzY2hlZF9ncm91cF9jcHVzKGdyb3VwKSwgdHNrX2NwdXNfYWxsb3dlZChwKSkgewogCQlpZiAoaWRsZV9jcHUoaSkpIHsKQEAgLTUyNjUsNjQgKzUzMDQsMjM3IEBACiB9CiAKIC8qCi0gKiBUcnkgYW5kIGxvY2F0ZSBhbiBpZGxlIENQVSBpbiB0aGUgc2NoZWRfZG9tYWluLgorICogSW1wbGVtZW50IGEgZm9yX2VhY2hfY3B1KCkgdmFyaWFudCB0aGF0IHN0YXJ0cyB0aGUgc2NhbiBhdCBhIGdpdmVuIGNwdQorICogKEBzdGFydCksIGFuZCB3cmFwcyBhcm91bmQuCisgKgorICogVGhpcyBpcyB1c2VkIHRvIHNjYW4gZm9yIGlkbGUgQ1BVczsgc3VjaCB0aGF0IG5vdCBhbGwgQ1BVcyBsb29raW5nIGZvciBhbgorICogaWRsZSBDUFUgZmluZCB0aGUgc2FtZSBDUFUuIFRoZSBkb3duLXNpZGUgaXMgdGhhdCB0YXNrcyB0ZW5kIHRvIGN5Y2xlCisgKiB0aHJvdWdoIHRoZSBMTEMgZG9tYWluLgorICoKKyAqIEVzcGVjaWFsbHkgdGJlbmNoIGlzIGZvdW5kIHNlbnNpdGl2ZSB0byB0aGlzLgogICovCi1zdGF0aWMgaW50IHNlbGVjdF9pZGxlX3NpYmxpbmcoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgdGFyZ2V0KQorCitzdGF0aWMgaW50IGNwdW1hc2tfbmV4dF93cmFwKGludCBuLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywgaW50IHN0YXJ0LCBpbnQgKndyYXBwZWQpCit7CisJaW50IG5leHQ7CisKK2FnYWluOgorCW5leHQgPSBmaW5kX25leHRfYml0KGNwdW1hc2tfYml0cyhtYXNrKSwgbnJfY3B1bWFza19iaXRzLCBuKzEpOworCisJaWYgKCp3cmFwcGVkKSB7CisJCWlmIChuZXh0ID49IHN0YXJ0KQorCQkJcmV0dXJuIG5yX2NwdW1hc2tfYml0czsKKwl9IGVsc2UgeworCQlpZiAobmV4dCA+PSBucl9jcHVtYXNrX2JpdHMpIHsKKwkJCSp3cmFwcGVkID0gMTsKKwkJCW4gPSAtMTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwl9CisKKwlyZXR1cm4gbmV4dDsKK30KKworI2RlZmluZSBmb3JfZWFjaF9jcHVfd3JhcChjcHUsIG1hc2ssIHN0YXJ0LCB3cmFwKQkJCQlcCisJZm9yICgod3JhcCkgPSAwLCAoY3B1KSA9IChzdGFydCktMTsJCQkJCVwKKwkJKGNwdSkgPSBjcHVtYXNrX25leHRfd3JhcCgoY3B1KSwgKG1hc2spLCAoc3RhcnQpLCAmKHdyYXApKSwJXAorCQkoY3B1KSA8IG5yX2NwdW1hc2tfYml0czsgKQorCisjaWZkZWYgQ09ORklHX1NDSEVEX1NNVAorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2lkbGVfY29yZXMoaW50IGNwdSwgaW50IHZhbCkKK3sKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluX3NoYXJlZCAqc2RzOworCisJc2RzID0gcmN1X2RlcmVmZXJlbmNlKHBlcl9jcHUoc2RfbGxjX3NoYXJlZCwgY3B1KSk7CisJaWYgKHNkcykKKwkJV1JJVEVfT05DRShzZHMtPmhhc19pZGxlX2NvcmVzLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgdGVzdF9pZGxlX2NvcmVzKGludCBjcHUsIGJvb2wgZGVmKQoreworCXN0cnVjdCBzY2hlZF9kb21haW5fc2hhcmVkICpzZHM7CisKKwlzZHMgPSByY3VfZGVyZWZlcmVuY2UocGVyX2NwdShzZF9sbGNfc2hhcmVkLCBjcHUpKTsKKwlpZiAoc2RzKQorCQlyZXR1cm4gUkVBRF9PTkNFKHNkcy0+aGFzX2lkbGVfY29yZXMpOworCisJcmV0dXJuIGRlZjsKK30KKworLyoKKyAqIFNjYW5zIHRoZSBsb2NhbCBTTVQgbWFzayB0byBzZWUgaWYgdGhlIGVudGlyZSBjb3JlIGlzIGlkbGUsIGFuZCByZWNvcmRzIHRoaXMKKyAqIGluZm9ybWF0aW9uIGluIHNkX2xsY19zaGFyZWQtPmhhc19pZGxlX2NvcmVzLgorICoKKyAqIFNpbmNlIFNNVCBzaWJsaW5ncyBzaGFyZSBhbGwgY2FjaGUgbGV2ZWxzLCBpbnNwZWN0aW5nIHRoaXMgbGltaXRlZCByZW1vdGUKKyAqIHN0YXRlIHNob3VsZCBiZSBmYWlybHkgY2hlYXAuCisgKi8KK3ZvaWQgX191cGRhdGVfaWRsZV9jb3JlKHN0cnVjdCBycSAqcnEpCit7CisJaW50IGNvcmUgPSBjcHVfb2YocnEpOworCWludCBjcHU7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKHRlc3RfaWRsZV9jb3Jlcyhjb3JlLCB0cnVlKSkKKwkJZ290byB1bmxvY2s7CisKKwlmb3JfZWFjaF9jcHUoY3B1LCBjcHVfc210X21hc2soY29yZSkpIHsKKwkJaWYgKGNwdSA9PSBjb3JlKQorCQkJY29udGludWU7CisKKwkJaWYgKCFpZGxlX2NwdShjcHUpKQorCQkJZ290byB1bmxvY2s7CisJfQorCisJc2V0X2lkbGVfY29yZXMoY29yZSwgMSk7Cit1bmxvY2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKKy8qCisgKiBTY2FuIHRoZSBlbnRpcmUgTExDIGRvbWFpbiBmb3IgaWRsZSBjb3JlczsgdGhpcyBkeW5hbWljYWxseSBzd2l0Y2hlcyBvZmYgaWYKKyAqIHRoZXJlIGFyZSBubyBpZGxlIGNvcmVzIGxlZnQgaW4gdGhlIHN5c3RlbTsgdHJhY2tlZCB0aHJvdWdoCisgKiBzZF9sbGMtPnNoYXJlZC0+aGFzX2lkbGVfY29yZXMgYW5kIGVuYWJsZWQgdGhyb3VnaCB1cGRhdGVfaWRsZV9jb3JlKCkgYWJvdmUuCisgKi8KK3N0YXRpYyBpbnQgc2VsZWN0X2lkbGVfY29yZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgdGFyZ2V0KQoreworCXN0cnVjdCBjcHVtYXNrICpjcHVzID0gdGhpc19jcHVfY3B1bWFza192YXJfcHRyKHNlbGVjdF9pZGxlX21hc2spOworCWludCBjb3JlLCBjcHUsIHdyYXA7CisKKwlpZiAoIXN0YXRpY19icmFuY2hfbGlrZWx5KCZzY2hlZF9zbXRfcHJlc2VudCkpCisJCXJldHVybiAtMTsKKworCWlmICghdGVzdF9pZGxlX2NvcmVzKHRhcmdldCwgZmFsc2UpKQorCQlyZXR1cm4gLTE7CisKKwljcHVtYXNrX2FuZChjcHVzLCBzY2hlZF9kb21haW5fc3BhbihzZCksIHRza19jcHVzX2FsbG93ZWQocCkpOworCisJZm9yX2VhY2hfY3B1X3dyYXAoY29yZSwgY3B1cywgdGFyZ2V0LCB3cmFwKSB7CisJCWJvb2wgaWRsZSA9IHRydWU7CisKKwkJZm9yX2VhY2hfY3B1KGNwdSwgY3B1X3NtdF9tYXNrKGNvcmUpKSB7CisJCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIGNwdXMpOworCQkJaWYgKCFpZGxlX2NwdShjcHUpKQorCQkJCWlkbGUgPSBmYWxzZTsKKwkJfQorCisJCWlmIChpZGxlKQorCQkJcmV0dXJuIGNvcmU7CisJfQorCisJLyoKKwkgKiBGYWlsZWQgdG8gZmluZCBhbiBpZGxlIGNvcmU7IHN0b3AgbG9va2luZyBmb3Igb25lLgorCSAqLworCXNldF9pZGxlX2NvcmVzKHRhcmdldCwgMCk7CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBTY2FuIHRoZSBsb2NhbCBTTVQgbWFzayBmb3IgaWRsZSBDUFVzLgorICovCitzdGF0aWMgaW50IHNlbGVjdF9pZGxlX3NtdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgdGFyZ2V0KQoreworCWludCBjcHU7CisKKwlpZiAoIXN0YXRpY19icmFuY2hfbGlrZWx5KCZzY2hlZF9zbXRfcHJlc2VudCkpCisJCXJldHVybiAtMTsKKworCWZvcl9lYWNoX2NwdShjcHUsIGNwdV9zbXRfbWFzayh0YXJnZXQpKSB7CisJCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsIHRza19jcHVzX2FsbG93ZWQocCkpKQorCQkJY29udGludWU7CisJCWlmIChpZGxlX2NwdShjcHUpKQorCQkJcmV0dXJuIGNwdTsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKyNlbHNlIC8qIENPTkZJR19TQ0hFRF9TTVQgKi8KKworc3RhdGljIGlubGluZSBpbnQgc2VsZWN0X2lkbGVfY29yZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgdGFyZ2V0KQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2VsZWN0X2lkbGVfc210KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCB0YXJnZXQpCit7CisJcmV0dXJuIC0xOworfQorCisjZW5kaWYgLyogQ09ORklHX1NDSEVEX1NNVCAqLworCisvKgorICogU2NhbiB0aGUgTExDIGRvbWFpbiBmb3IgaWRsZSBDUFVzOyB0aGlzIGlzIGR5bmFtaWNhbGx5IHJlZ3VsYXRlZCBieQorICogY29tcGFyaW5nIHRoZSBhdmVyYWdlIHNjYW4gY29zdCAodHJhY2tlZCBpbiBzZC0+YXZnX3NjYW5fY29zdCkgYWdhaW5zdCB0aGUKKyAqIGF2ZXJhZ2UgaWRsZSB0aW1lIGZvciB0aGlzIHJxIChhcyBmb3VuZCBpbiBycS0+YXZnX2lkbGUpLgorICovCitzdGF0aWMgaW50IHNlbGVjdF9pZGxlX2NwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgdGFyZ2V0KQoreworCXN0cnVjdCBzY2hlZF9kb21haW4gKnRoaXNfc2QgPSByY3VfZGVyZWZlcmVuY2UoKnRoaXNfY3B1X3B0cigmc2RfbGxjKSk7CisJdTY0IGF2Z19pZGxlID0gdGhpc19ycSgpLT5hdmdfaWRsZTsKKwl1NjQgYXZnX2Nvc3QgPSB0aGlzX3NkLT5hdmdfc2Nhbl9jb3N0OworCXU2NCB0aW1lLCBjb3N0OworCXM2NCBkZWx0YTsKKwlpbnQgY3B1LCB3cmFwOworCisJLyoKKwkgKiBEdWUgdG8gbGFyZ2UgdmFyaWFuY2Ugd2UgbmVlZCBhIGxhcmdlIGZ1enogZmFjdG9yOyBoYWNrYmVuY2ggaW4KKwkgKiBwYXJ0aWN1bGFybHkgaXMgc2Vuc2l0aXZlIGhlcmUuCisJICovCisJaWYgKChhdmdfaWRsZSAvIDUxMikgPCBhdmdfY29zdCkKKwkJcmV0dXJuIC0xOworCisJdGltZSA9IGxvY2FsX2Nsb2NrKCk7CisKKwlmb3JfZWFjaF9jcHVfd3JhcChjcHUsIHNjaGVkX2RvbWFpbl9zcGFuKHNkKSwgdGFyZ2V0LCB3cmFwKSB7CisJCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsIHRza19jcHVzX2FsbG93ZWQocCkpKQorCQkJY29udGludWU7CisJCWlmIChpZGxlX2NwdShjcHUpKQorCQkJYnJlYWs7CisJfQorCisJdGltZSA9IGxvY2FsX2Nsb2NrKCkgLSB0aW1lOworCWNvc3QgPSB0aGlzX3NkLT5hdmdfc2Nhbl9jb3N0OworCWRlbHRhID0gKHM2NCkodGltZSAtIGNvc3QpIC8gODsKKwl0aGlzX3NkLT5hdmdfc2Nhbl9jb3N0ICs9IGRlbHRhOworCisJcmV0dXJuIGNwdTsKK30KKworLyoKKyAqIFRyeSBhbmQgbG9jYXRlIGFuIGlkbGUgY29yZS90aHJlYWQgaW4gdGhlIExMQyBjYWNoZSBkb21haW4uCisgKi8KK3N0YXRpYyBpbnQgc2VsZWN0X2lkbGVfc2libGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBwcmV2LCBpbnQgdGFyZ2V0KQogewogCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwotCXN0cnVjdCBzY2hlZF9ncm91cCAqc2c7Ci0JaW50IGkgPSB0YXNrX2NwdShwKTsKKwlpbnQgaTsKIAogCWlmIChpZGxlX2NwdSh0YXJnZXQpKQogCQlyZXR1cm4gdGFyZ2V0OwogCiAJLyoKLQkgKiBJZiB0aGUgcHJldm91cyBjcHUgaXMgY2FjaGUgYWZmaW5lIGFuZCBpZGxlLCBkb24ndCBiZSBzdHVwaWQuCisJICogSWYgdGhlIHByZXZpb3VzIGNwdSBpcyBjYWNoZSBhZmZpbmUgYW5kIGlkbGUsIGRvbid0IGJlIHN0dXBpZC4KIAkgKi8KLQlpZiAoaSAhPSB0YXJnZXQgJiYgY3B1c19zaGFyZV9jYWNoZShpLCB0YXJnZXQpICYmIGlkbGVfY3B1KGkpKQorCWlmIChwcmV2ICE9IHRhcmdldCAmJiBjcHVzX3NoYXJlX2NhY2hlKHByZXYsIHRhcmdldCkgJiYgaWRsZV9jcHUocHJldikpCisJCXJldHVybiBwcmV2OworCisJc2QgPSByY3VfZGVyZWZlcmVuY2UocGVyX2NwdShzZF9sbGMsIHRhcmdldCkpOworCWlmICghc2QpCisJCXJldHVybiB0YXJnZXQ7CisKKwlpID0gc2VsZWN0X2lkbGVfY29yZShwLCBzZCwgdGFyZ2V0KTsKKwlpZiAoKHVuc2lnbmVkKWkgPCBucl9jcHVtYXNrX2JpdHMpCiAJCXJldHVybiBpOwogCi0JLyoKLQkgKiBPdGhlcndpc2UsIGl0ZXJhdGUgdGhlIGRvbWFpbnMgYW5kIGZpbmQgYW4gZWxpZ2libGUgaWRsZSBjcHUuCi0JICoKLQkgKiBBIGNvbXBsZXRlbHkgaWRsZSBzY2hlZCBncm91cCBhdCBoaWdoZXIgZG9tYWlucyBpcyBtb3JlCi0JICogZGVzaXJhYmxlIHRoYW4gYW4gaWRsZSBncm91cCBhdCBhIGxvd2VyIGxldmVsLCBiZWNhdXNlIGxvd2VyCi0JICogZG9tYWlucyBoYXZlIHNtYWxsZXIgZ3JvdXBzIGFuZCB1c3VhbGx5IHNoYXJlIGhhcmR3YXJlCi0JICogcmVzb3VyY2VzIHdoaWNoIGNhdXNlcyB0YXNrcyB0byBjb250ZW5kIG9uIHRoZW0sIGUuZy4geDg2Ci0JICogaHlwZXJ0aHJlYWQgc2libGluZ3MgaW4gdGhlIGxvd2VzdCBkb21haW4gKFNNVCkgY2FuIGNvbnRlbmQKLQkgKiBvbiB0aGUgc2hhcmVkIGNwdSBwaXBlbGluZS4KLQkgKgotCSAqIEhvd2V2ZXIsIHdoaWxlIHdlIHByZWZlciBpZGxlIGdyb3VwcyBhdCBoaWdoZXIgZG9tYWlucwotCSAqIGZpbmRpbmcgYW4gaWRsZSBjcHUgYXQgdGhlIGxvd2VzdCBkb21haW4gaXMgc3RpbGwgYmV0dGVyIHRoYW4KLQkgKiByZXR1cm5pbmcgJ3RhcmdldCcsIHdoaWNoIHdlJ3ZlIGFscmVhZHkgZXN0YWJsaXNoZWQsIGlzbid0Ci0JICogaWRsZS4KLQkgKi8KLQlzZCA9IHJjdV9kZXJlZmVyZW5jZShwZXJfY3B1KHNkX2xsYywgdGFyZ2V0KSk7Ci0JZm9yX2VhY2hfbG93ZXJfZG9tYWluKHNkKSB7Ci0JCXNnID0gc2QtPmdyb3VwczsKLQkJZG8gewotCQkJaWYgKCFjcHVtYXNrX2ludGVyc2VjdHMoc2NoZWRfZ3JvdXBfY3B1cyhzZyksCi0JCQkJCQl0c2tfY3B1c19hbGxvd2VkKHApKSkKLQkJCQlnb3RvIG5leHQ7CisJaSA9IHNlbGVjdF9pZGxlX2NwdShwLCBzZCwgdGFyZ2V0KTsKKwlpZiAoKHVuc2lnbmVkKWkgPCBucl9jcHVtYXNrX2JpdHMpCisJCXJldHVybiBpOwogCi0JCQkvKiBFbnN1cmUgdGhlIGVudGlyZSBncm91cCBpcyBpZGxlICovCi0JCQlmb3JfZWFjaF9jcHUoaSwgc2NoZWRfZ3JvdXBfY3B1cyhzZykpIHsKLQkJCQlpZiAoaSA9PSB0YXJnZXQgfHwgIWlkbGVfY3B1KGkpKQotCQkJCQlnb3RvIG5leHQ7Ci0JCQl9CisJaSA9IHNlbGVjdF9pZGxlX3NtdChwLCBzZCwgdGFyZ2V0KTsKKwlpZiAoKHVuc2lnbmVkKWkgPCBucl9jcHVtYXNrX2JpdHMpCisJCXJldHVybiBpOwogCi0JCQkvKgotCQkJICogSXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggY3B1IHdlIHBpY2ssIHRoZQotCQkJICogd2hvbGUgZ3JvdXAgaXMgaWRsZS4KLQkJCSAqLwotCQkJdGFyZ2V0ID0gY3B1bWFza19maXJzdF9hbmQoc2NoZWRfZ3JvdXBfY3B1cyhzZyksCi0JCQkJCXRza19jcHVzX2FsbG93ZWQocCkpOwotCQkJZ290byBkb25lOwotbmV4dDoKLQkJCXNnID0gc2ctPm5leHQ7Ci0JCX0gd2hpbGUgKHNnICE9IHNkLT5ncm91cHMpOwotCX0KLWRvbmU6CiAJcmV0dXJuIHRhcmdldDsKIH0KIApAQCAtNTM2MCw2ICs1NTcyLDMyIEBACiAJcmV0dXJuICh1dGlsID49IGNhcGFjaXR5KSA/IGNhcGFjaXR5IDogdXRpbDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgdGFza191dGlsKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gcC0+c2UuYXZnLnV0aWxfYXZnOworfQorCisvKgorICogRGlzYWJsZSBXQUtFX0FGRklORSBpbiB0aGUgY2FzZSB3aGVyZSB0YXNrIEBwIGRvZXNuJ3QgZml0IGluIHRoZQorICogY2FwYWNpdHkgb2YgZWl0aGVyIHRoZSB3YWtpbmcgQ1BVIEBjcHUgb3IgdGhlIHByZXZpb3VzIENQVSBAcHJldl9jcHUuCisgKgorICogSW4gdGhhdCBjYXNlIFdBS0VfQUZGSU5FIGRvZXNuJ3QgbWFrZSBzZW5zZSBhbmQgd2UnbGwgbGV0CisgKiBCQUxBTkNFX1dBS0Ugc29ydCB0aGluZ3Mgb3V0LgorICovCitzdGF0aWMgaW50IHdha2VfY2FwKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IGNwdSwgaW50IHByZXZfY3B1KQoreworCWxvbmcgbWluX2NhcCwgbWF4X2NhcDsKKworCW1pbl9jYXAgPSBtaW4oY2FwYWNpdHlfb3JpZ19vZihwcmV2X2NwdSksIGNhcGFjaXR5X29yaWdfb2YoY3B1KSk7CisJbWF4X2NhcCA9IGNwdV9ycShjcHUpLT5yZC0+bWF4X2NwdV9jYXBhY2l0eTsKKworCS8qIE1pbmltdW0gY2FwYWNpdHkgaXMgY2xvc2UgdG8gbWF4LCBubyBuZWVkIHRvIGFib3J0IHdha2VfYWZmaW5lICovCisJaWYgKG1heF9jYXAgLSBtaW5fY2FwIDwgbWF4X2NhcCA+PiAzKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBtaW5fY2FwICogMTAyNCA8IHRhc2tfdXRpbChwKSAqIGNhcGFjaXR5X21hcmdpbjsKK30KKwogLyoKICAqIHNlbGVjdF90YXNrX3JxX2ZhaXI6IFNlbGVjdCB0YXJnZXQgcnVucXVldWUgZm9yIHRoZSB3YWtpbmcgdGFzayBpbiBkb21haW5zCiAgKiB0aGF0IGhhdmUgdGhlICdzZF9mbGFnJyBmbGFnIHNldC4gSW4gcHJhY3RpY2UsIHRoaXMgaXMgU0RfQkFMQU5DRV9XQUtFLApAQCAtNTM4Myw3ICs1NjIxLDggQEAKIAogCWlmIChzZF9mbGFnICYgU0RfQkFMQU5DRV9XQUtFKSB7CiAJCXJlY29yZF93YWtlZShwKTsKLQkJd2FudF9hZmZpbmUgPSAhd2FrZV93aWRlKHApICYmIGNwdW1hc2tfdGVzdF9jcHUoY3B1LCB0c2tfY3B1c19hbGxvd2VkKHApKTsKKwkJd2FudF9hZmZpbmUgPSAhd2FrZV93aWRlKHApICYmICF3YWtlX2NhcChwLCBjcHUsIHByZXZfY3B1KQorCQkJICAgICAgJiYgY3B1bWFza190ZXN0X2NwdShjcHUsIHRza19jcHVzX2FsbG93ZWQocCkpOwogCX0KIAogCXJjdV9yZWFkX2xvY2soKTsKQEAgLTU0MDksMTMgKzU2NDgsMTMgQEAKIAogCWlmIChhZmZpbmVfc2QpIHsKIAkJc2QgPSBOVUxMOyAvKiBQcmVmZXIgd2FrZV9hZmZpbmUgb3ZlciBiYWxhbmNlIGZsYWdzICovCi0JCWlmIChjcHUgIT0gcHJldl9jcHUgJiYgd2FrZV9hZmZpbmUoYWZmaW5lX3NkLCBwLCBzeW5jKSkKKwkJaWYgKGNwdSAhPSBwcmV2X2NwdSAmJiB3YWtlX2FmZmluZShhZmZpbmVfc2QsIHAsIHByZXZfY3B1LCBzeW5jKSkKIAkJCW5ld19jcHUgPSBjcHU7CiAJfQogCiAJaWYgKCFzZCkgewogCQlpZiAoc2RfZmxhZyAmIFNEX0JBTEFOQ0VfV0FLRSkgLyogWFhYIGFsd2F5cyA/ICovCi0JCQluZXdfY3B1ID0gc2VsZWN0X2lkbGVfc2libGluZyhwLCBuZXdfY3B1KTsKKwkJCW5ld19jcHUgPSBzZWxlY3RfaWRsZV9zaWJsaW5nKHAsIHByZXZfY3B1LCBuZXdfY3B1KTsKIAogCX0gZWxzZSB3aGlsZSAoc2QpIHsKIAkJc3RydWN0IHNjaGVkX2dyb3VwICpncm91cDsKQEAgLTU5MzksNyArNjE3OCw3IEBACiAgKgogICogVGhlIGFkamFjZW5jeSBtYXRyaXggb2YgdGhlIHJlc3VsdGluZyBncmFwaCBpcyBnaXZlbiBieToKICAqCi0gKiAgICAgICAgICAgICBsb2dfMiBuICAgICAKKyAqICAgICAgICAgICAgIGxvZ18yIG4KICAqICAgQV9pLGogPSBcVW5pb24gICAgIChpICUgMl5rID09IDApICYmIGkgLyAyXihrKzEpID09IGogLyAyXihrKzEpICAoNikKICAqICAgICAgICAgICAgIGsgPSAwCiAgKgpAQCAtNTk4NSw3ICs2MjI0LDcgQEAKICAqCiAgKiBbWFhYIHdyaXRlIG1vcmUgb24gaG93IHdlIHNvbHZlIHRoaXMuLiBfYWZ0ZXJfIG1lcmdpbmcgcGp0J3MgcGF0Y2hlcyB0aGF0CiAgKiAgICAgIHJld3JpdGUgYWxsIG9mIHRoaXMgb25jZSBhZ2Fpbi5dCi0gKi8gCisgKi8KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgX19yZWFkX21vc3RseSBtYXhfbG9hZF9iYWxhbmNlX2ludGVydmFsID0gSFovMTA7CiAKQEAgLTYxMzMsNyArNjM3Miw3IEBACiAJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGVudi0+ZHN0X2NwdSwgdHNrX2NwdXNfYWxsb3dlZChwKSkpIHsKIAkJaW50IGNwdTsKIAotCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfZmFpbGVkX21pZ3JhdGlvbnNfYWZmaW5lKTsKKwkJc2NoZWRzdGF0X2luYyhwLT5zZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2FmZmluZSk7CiAKIAkJZW52LT5mbGFncyB8PSBMQkZfU09NRV9QSU5ORUQ7CiAKQEAgLTYxNjQsNyArNjQwMyw3IEBACiAJZW52LT5mbGFncyAmPSB+TEJGX0FMTF9QSU5ORUQ7CiAKIAlpZiAodGFza19ydW5uaW5nKGVudi0+c3JjX3JxLCBwKSkgewotCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfZmFpbGVkX21pZ3JhdGlvbnNfcnVubmluZyk7CisJCXNjaGVkc3RhdF9pbmMocC0+c2Uuc3RhdGlzdGljcy5ucl9mYWlsZWRfbWlncmF0aW9uc19ydW5uaW5nKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC02MTgxLDEzICs2NDIwLDEzIEBACiAJaWYgKHRza19jYWNoZV9ob3QgPD0gMCB8fAogCSAgICBlbnYtPnNkLT5ucl9iYWxhbmNlX2ZhaWxlZCA+IGVudi0+c2QtPmNhY2hlX25pY2VfdHJpZXMpIHsKIAkJaWYgKHRza19jYWNoZV9ob3QgPT0gMSkgewotCQkJc2NoZWRzdGF0X2luYyhlbnYtPnNkLCBsYl9ob3RfZ2FpbmVkW2Vudi0+aWRsZV0pOwotCQkJc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX2ZvcmNlZF9taWdyYXRpb25zKTsKKwkJCXNjaGVkc3RhdF9pbmMoZW52LT5zZC0+bGJfaG90X2dhaW5lZFtlbnYtPmlkbGVdKTsKKwkJCXNjaGVkc3RhdF9pbmMocC0+c2Uuc3RhdGlzdGljcy5ucl9mb3JjZWRfbWlncmF0aW9ucyk7CiAJCX0KIAkJcmV0dXJuIDE7CiAJfQogCi0Jc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2hvdCk7CisJc2NoZWRzdGF0X2luYyhwLT5zZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2hvdCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYyMjcsNyArNjQ2Niw3IEBACiAJCSAqIHNvIHdlIGNhbiBzYWZlbHkgY29sbGVjdCBzdGF0cyBoZXJlIHJhdGhlciB0aGFuCiAJCSAqIGluc2lkZSBkZXRhY2hfdGFza3MoKS4KIAkJICovCi0JCXNjaGVkc3RhdF9pbmMoZW52LT5zZCwgbGJfZ2FpbmVkW2Vudi0+aWRsZV0pOworCQlzY2hlZHN0YXRfaW5jKGVudi0+c2QtPmxiX2dhaW5lZFtlbnYtPmlkbGVdKTsKIAkJcmV0dXJuIHA7CiAJfQogCXJldHVybiBOVUxMOwpAQCAtNjMxOSw3ICs2NTU4LDcgQEAKIAkgKiBzbyB3ZSBjYW4gc2FmZWx5IGNvbGxlY3QgZGV0YWNoX29uZV90YXNrKCkgc3RhdHMgaGVyZSByYXRoZXIKIAkgKiB0aGFuIGluc2lkZSBkZXRhY2hfb25lX3Rhc2soKS4KIAkgKi8KLQlzY2hlZHN0YXRfYWRkKGVudi0+c2QsIGxiX2dhaW5lZFtlbnYtPmlkbGVdLCBkZXRhY2hlZCk7CisJc2NoZWRzdGF0X2FkZChlbnYtPnNkLT5sYl9nYWluZWRbZW52LT5pZGxlXSwgZGV0YWNoZWQpOwogCiAJcmV0dXJuIGRldGFjaGVkOwogfQpAQCAtNjY0Nyw3ICs2ODg2LDcgQEAKIAkJLyoKIAkJICogIVNEX09WRVJMQVAgZG9tYWlucyBjYW4gYXNzdW1lIHRoYXQgY2hpbGQgZ3JvdXBzCiAJCSAqIHNwYW4gdGhlIGN1cnJlbnQgZ3JvdXAuCi0JCSAqLyAKKwkJICovCiAKIAkJZ3JvdXAgPSBjaGlsZC0+Z3JvdXBzOwogCQlkbyB7CkBAIC03MTQ3LDcgKzczODYsNyBAQAogCQlsb2FkX2Fib3ZlX2NhcGFjaXR5ID0gYnVzaWVzdC0+c3VtX25yX3J1bm5pbmcgKiBTQ0hFRF9DQVBBQ0lUWV9TQ0FMRTsKIAkJaWYgKGxvYWRfYWJvdmVfY2FwYWNpdHkgPiBidXNpZXN0LT5ncm91cF9jYXBhY2l0eSkgewogCQkJbG9hZF9hYm92ZV9jYXBhY2l0eSAtPSBidXNpZXN0LT5ncm91cF9jYXBhY2l0eTsKLQkJCWxvYWRfYWJvdmVfY2FwYWNpdHkgKj0gTklDRV8wX0xPQUQ7CisJCQlsb2FkX2Fib3ZlX2NhcGFjaXR5ICo9IHNjYWxlX2xvYWRfZG93bihOSUNFXzBfTE9BRCk7CiAJCQlsb2FkX2Fib3ZlX2NhcGFjaXR5IC89IGJ1c2llc3QtPmdyb3VwX2NhcGFjaXR5OwogCQl9IGVsc2UKIAkJCWxvYWRfYWJvdmVfY2FwYWNpdHkgPSB+MFVMOwpAQCAtNzM1NCw5ICs3NTkzLDYgQEAKICAqLwogI2RlZmluZSBNQVhfUElOTkVEX0lOVEVSVkFMCTUxMgogCi0vKiBXb3JraW5nIGNwdW1hc2sgZm9yIGxvYWRfYmFsYW5jZSBhbmQgbG9hZF9iYWxhbmNlX25ld2lkbGUuICovCi1ERUZJTkVfUEVSX0NQVShjcHVtYXNrX3Zhcl90LCBsb2FkX2JhbGFuY2VfbWFzayk7Ci0KIHN0YXRpYyBpbnQgbmVlZF9hY3RpdmVfYmFsYW5jZShzdHJ1Y3QgbGJfZW52ICplbnYpCiB7CiAJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSBlbnYtPnNkOwpAQCAtNzQ2MCw3ICs3Njk2LDcgQEAKIAogCWNwdW1hc2tfY29weShjcHVzLCBjcHVfYWN0aXZlX21hc2spOwogCi0Jc2NoZWRzdGF0X2luYyhzZCwgbGJfY291bnRbaWRsZV0pOworCXNjaGVkc3RhdF9pbmMoc2QtPmxiX2NvdW50W2lkbGVdKTsKIAogcmVkbzoKIAlpZiAoIXNob3VsZF93ZV9iYWxhbmNlKCZlbnYpKSB7CkBAIC03NDcwLDE5ICs3NzA2LDE5IEBACiAKIAlncm91cCA9IGZpbmRfYnVzaWVzdF9ncm91cCgmZW52KTsKIAlpZiAoIWdyb3VwKSB7Ci0JCXNjaGVkc3RhdF9pbmMoc2QsIGxiX25vYnVzeWdbaWRsZV0pOworCQlzY2hlZHN0YXRfaW5jKHNkLT5sYl9ub2J1c3lnW2lkbGVdKTsKIAkJZ290byBvdXRfYmFsYW5jZWQ7CiAJfQogCiAJYnVzaWVzdCA9IGZpbmRfYnVzaWVzdF9xdWV1ZSgmZW52LCBncm91cCk7CiAJaWYgKCFidXNpZXN0KSB7Ci0JCXNjaGVkc3RhdF9pbmMoc2QsIGxiX25vYnVzeXFbaWRsZV0pOworCQlzY2hlZHN0YXRfaW5jKHNkLT5sYl9ub2J1c3lxW2lkbGVdKTsKIAkJZ290byBvdXRfYmFsYW5jZWQ7CiAJfQogCiAJQlVHX09OKGJ1c2llc3QgPT0gZW52LmRzdF9ycSk7CiAKLQlzY2hlZHN0YXRfYWRkKHNkLCBsYl9pbWJhbGFuY2VbaWRsZV0sIGVudi5pbWJhbGFuY2UpOworCXNjaGVkc3RhdF9hZGQoc2QtPmxiX2ltYmFsYW5jZVtpZGxlXSwgZW52LmltYmFsYW5jZSk7CiAKIAllbnYuc3JjX2NwdSA9IGJ1c2llc3QtPmNwdTsKIAllbnYuc3JjX3JxID0gYnVzaWVzdDsKQEAgLTc1ODksNyArNzgyNSw3IEBACiAJfQogCiAJaWYgKCFsZF9tb3ZlZCkgewotCQlzY2hlZHN0YXRfaW5jKHNkLCBsYl9mYWlsZWRbaWRsZV0pOworCQlzY2hlZHN0YXRfaW5jKHNkLT5sYl9mYWlsZWRbaWRsZV0pOwogCQkvKgogCQkgKiBJbmNyZW1lbnQgdGhlIGZhaWx1cmUgY291bnRlciBvbmx5IG9uIHBlcmlvZGljIGJhbGFuY2UuCiAJCSAqIFdlIGRvIG5vdCB3YW50IG5ld2lkbGUgYmFsYW5jZSwgd2hpY2ggY2FuIGJlIHZlcnkKQEAgLTc2NzIsNyArNzkwOCw3IEBACiAJICogd2UgY2FuJ3QgbWlncmF0ZSB0aGVtLiBMZXQgdGhlIGltYmFsYW5jZSBmbGFnIHNldCBzbyBwYXJlbnQgbGV2ZWwKIAkgKiBjYW4gdHJ5IHRvIG1pZ3JhdGUgdGhlbS4KIAkgKi8KLQlzY2hlZHN0YXRfaW5jKHNkLCBsYl9iYWxhbmNlZFtpZGxlXSk7CisJc2NoZWRzdGF0X2luYyhzZC0+bGJfYmFsYW5jZWRbaWRsZV0pOwogCiAJc2QtPm5yX2JhbGFuY2VfZmFpbGVkID0gMDsKIApAQCAtNzcwNCwxMSArNzk0MCwxMiBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXVwZGF0ZV9uZXh0X2JhbGFuY2Uoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHVfYnVzeSwgdW5zaWduZWQgbG9uZyAqbmV4dF9iYWxhbmNlKQordXBkYXRlX25leHRfYmFsYW5jZShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgdW5zaWduZWQgbG9uZyAqbmV4dF9iYWxhbmNlKQogewogCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwsIG5leHQ7CiAKLQlpbnRlcnZhbCA9IGdldF9zZF9iYWxhbmNlX2ludGVydmFsKHNkLCBjcHVfYnVzeSk7CisJLyogdXNlZCBieSBpZGxlIGJhbGFuY2UsIHNvIGNwdV9idXN5ID0gMCAqLworCWludGVydmFsID0gZ2V0X3NkX2JhbGFuY2VfaW50ZXJ2YWwoc2QsIDApOwogCW5leHQgPSBzZC0+bGFzdF9iYWxhbmNlICsgaW50ZXJ2YWw7CiAKIAlpZiAodGltZV9hZnRlcigqbmV4dF9iYWxhbmNlLCBuZXh0KSkKQEAgLTc3MzgsNyArNzk3NSw3IEBACiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJc2QgPSByY3VfZGVyZWZlcmVuY2VfY2hlY2tfc2NoZWRfZG9tYWluKHRoaXNfcnEtPnNkKTsKIAkJaWYgKHNkKQotCQkJdXBkYXRlX25leHRfYmFsYW5jZShzZCwgMCwgJm5leHRfYmFsYW5jZSk7CisJCQl1cGRhdGVfbmV4dF9iYWxhbmNlKHNkLCAmbmV4dF9iYWxhbmNlKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkJZ290byBvdXQ7CkBAIC03NzU2LDcgKzc5OTMsNyBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKHRoaXNfcnEtPmF2Z19pZGxlIDwgY3Vycl9jb3N0ICsgc2QtPm1heF9uZXdpZGxlX2xiX2Nvc3QpIHsKLQkJCXVwZGF0ZV9uZXh0X2JhbGFuY2Uoc2QsIDAsICZuZXh0X2JhbGFuY2UpOworCQkJdXBkYXRlX25leHRfYmFsYW5jZShzZCwgJm5leHRfYmFsYW5jZSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC03Nzc0LDcgKzgwMTEsNyBAQAogCQkJY3Vycl9jb3N0ICs9IGRvbWFpbl9jb3N0OwogCQl9CiAKLQkJdXBkYXRlX25leHRfYmFsYW5jZShzZCwgMCwgJm5leHRfYmFsYW5jZSk7CisJCXVwZGF0ZV9uZXh0X2JhbGFuY2Uoc2QsICZuZXh0X2JhbGFuY2UpOwogCiAJCS8qCiAJCSAqIFN0b3Agc2VhcmNoaW5nIGZvciB0YXNrcyB0byBwdWxsIGlmIHRoZXJlIGFyZQpAQCAtNzg2NCwxNSArODEwMSwxNSBAQAogCQkJLmlkbGUJCT0gQ1BVX0lETEUsCiAJCX07CiAKLQkJc2NoZWRzdGF0X2luYyhzZCwgYWxiX2NvdW50KTsKKwkJc2NoZWRzdGF0X2luYyhzZC0+YWxiX2NvdW50KTsKIAogCQlwID0gZGV0YWNoX29uZV90YXNrKCZlbnYpOwogCQlpZiAocCkgewotCQkJc2NoZWRzdGF0X2luYyhzZCwgYWxiX3B1c2hlZCk7CisJCQlzY2hlZHN0YXRfaW5jKHNkLT5hbGJfcHVzaGVkKTsKIAkJCS8qIEFjdGl2ZSBiYWxhbmNpbmcgZG9uZSwgcmVzZXQgdGhlIGZhaWx1cmUgY291bnRlci4gKi8KIAkJCXNkLT5ucl9iYWxhbmNlX2ZhaWxlZCA9IDA7CiAJCX0gZWxzZSB7Ci0JCQlzY2hlZHN0YXRfaW5jKHNkLCBhbGJfZmFpbGVkKTsKKwkJCXNjaGVkc3RhdF9pbmMoc2QtPmFsYl9mYWlsZWQpOwogCQl9CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtNzk2NCwxMyArODIwMSwxMyBAQAogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0Jc2QgPSByY3VfZGVyZWZlcmVuY2UocGVyX2NwdShzZF9idXN5LCBjcHUpKTsKKwlzZCA9IHJjdV9kZXJlZmVyZW5jZShwZXJfY3B1KHNkX2xsYywgY3B1KSk7CiAKIAlpZiAoIXNkIHx8ICFzZC0+bm9oel9pZGxlKQogCQlnb3RvIHVubG9jazsKIAlzZC0+bm9oel9pZGxlID0gMDsKIAotCWF0b21pY19pbmMoJnNkLT5ncm91cHMtPnNnYy0+bnJfYnVzeV9jcHVzKTsKKwlhdG9taWNfaW5jKCZzZC0+c2hhcmVkLT5ucl9idXN5X2NwdXMpOwogdW5sb2NrOgogCXJjdV9yZWFkX3VubG9jaygpOwogfQpAQCAtNzk4MSwxMyArODIxOCwxMyBAQAogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0Jc2QgPSByY3VfZGVyZWZlcmVuY2UocGVyX2NwdShzZF9idXN5LCBjcHUpKTsKKwlzZCA9IHJjdV9kZXJlZmVyZW5jZShwZXJfY3B1KHNkX2xsYywgY3B1KSk7CiAKIAlpZiAoIXNkIHx8IHNkLT5ub2h6X2lkbGUpCiAJCWdvdG8gdW5sb2NrOwogCXNkLT5ub2h6X2lkbGUgPSAxOwogCi0JYXRvbWljX2RlYygmc2QtPmdyb3Vwcy0+c2djLT5ucl9idXN5X2NwdXMpOworCWF0b21pY19kZWMoJnNkLT5zaGFyZWQtPm5yX2J1c3lfY3B1cyk7CiB1bmxvY2s6CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CkBAIC04MjE0LDggKzg0NTEsOCBAQAogc3RhdGljIGlubGluZSBib29sIG5vaHpfa2lja19uZWVkZWQoc3RydWN0IHJxICpycSkKIHsKIAl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJc3RydWN0IHNjaGVkX2RvbWFpbl9zaGFyZWQgKnNkczsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKLQlzdHJ1Y3Qgc2NoZWRfZ3JvdXBfY2FwYWNpdHkgKnNnYzsKIAlpbnQgbnJfYnVzeSwgY3B1ID0gcnEtPmNwdTsKIAlib29sIGtpY2sgPSBmYWxzZTsKIApAQCAtODI0MywxMSArODQ4MCwxMyBAQAogCQlyZXR1cm4gdHJ1ZTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlzZCA9IHJjdV9kZXJlZmVyZW5jZShwZXJfY3B1KHNkX2J1c3ksIGNwdSkpOwotCWlmIChzZCkgewotCQlzZ2MgPSBzZC0+Z3JvdXBzLT5zZ2M7Ci0JCW5yX2J1c3kgPSBhdG9taWNfcmVhZCgmc2djLT5ucl9idXN5X2NwdXMpOwotCisJc2RzID0gcmN1X2RlcmVmZXJlbmNlKHBlcl9jcHUoc2RfbGxjX3NoYXJlZCwgY3B1KSk7CisJaWYgKHNkcykgeworCQkvKgorCQkgKiBYWFg6IHdyaXRlIGEgY29oZXJlbnQgY29tbWVudCBvbiB3aHkgd2UgZG8gdGhpcy4KKwkJICogU2VlIGFsc286IGh0dHA6Ly9sa21sLmtlcm5lbC5vcmcvci8yMDExMTIwMjAxMDgzMi42MDIyMDM0MTFAc2JzaWRkaGEtZGVzay5zYy5pbnRlbC5jb20KKwkJICovCisJCW5yX2J1c3kgPSBhdG9taWNfcmVhZCgmc2RzLT5ucl9idXN5X2NwdXMpOwogCQlpZiAobnJfYnVzeSA+IDEpIHsKIAkJCWtpY2sgPSB0cnVlOwogCQkJZ290byB1bmxvY2s7CkBAIC04NDQxLDcgKzg2ODAsNiBAQAogCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlID0gJnAtPnNlOwogCXN0cnVjdCBjZnNfcnEgKmNmc19ycSA9IGNmc19ycV9vZihzZSk7CiAJdTY0IG5vdyA9IGNmc19ycV9jbG9ja190YXNrKGNmc19ycSk7Ci0JaW50IHRnX3VwZGF0ZTsKIAogCWlmICghdnJ1bnRpbWVfbm9ybWFsaXplZChwKSkgewogCQkvKgpAQCAtODQ1MywxMCArODY5MSw5IEBACiAJfQogCiAJLyogQ2F0Y2ggdXAgd2l0aCB0aGUgY2ZzX3JxIGFuZCByZW1vdmUgb3VyIGxvYWQgd2hlbiB3ZSBsZWF2ZSAqLwotCXRnX3VwZGF0ZSA9IHVwZGF0ZV9jZnNfcnFfbG9hZF9hdmcobm93LCBjZnNfcnEsIGZhbHNlKTsKKwl1cGRhdGVfY2ZzX3JxX2xvYWRfYXZnKG5vdywgY2ZzX3JxLCBmYWxzZSk7CiAJZGV0YWNoX2VudGl0eV9sb2FkX2F2ZyhjZnNfcnEsIHNlKTsKLQlpZiAodGdfdXBkYXRlKQotCQl1cGRhdGVfdGdfbG9hZF9hdmcoY2ZzX3JxLCBmYWxzZSk7CisJdXBkYXRlX3RnX2xvYWRfYXZnKGNmc19ycSwgZmFsc2UpOwogfQogCiBzdGF0aWMgdm9pZCBhdHRhY2hfdGFza19jZnNfcnEoc3RydWN0IHRhc2tfc3RydWN0ICpwKQpAQCAtODQ2NCw3ICs4NzAxLDYgQEAKIAlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSA9ICZwLT5zZTsKIAlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEgPSBjZnNfcnFfb2Yoc2UpOwogCXU2NCBub3cgPSBjZnNfcnFfY2xvY2tfdGFzayhjZnNfcnEpOwotCWludCB0Z191cGRhdGU7CiAKICNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAogCS8qCkBAIC04NDc1LDEwICs4NzExLDkgQEAKICNlbmRpZgogCiAJLyogU3luY2hyb25pemUgdGFzayB3aXRoIGl0cyBjZnNfcnEgKi8KLQl0Z191cGRhdGUgPSB1cGRhdGVfY2ZzX3JxX2xvYWRfYXZnKG5vdywgY2ZzX3JxLCBmYWxzZSk7CisJdXBkYXRlX2Nmc19ycV9sb2FkX2F2Zyhub3csIGNmc19ycSwgZmFsc2UpOwogCWF0dGFjaF9lbnRpdHlfbG9hZF9hdmcoY2ZzX3JxLCBzZSk7Ci0JaWYgKHRnX3VwZGF0ZSkKLQkJdXBkYXRlX3RnX2xvYWRfYXZnKGNmc19ycSwgZmFsc2UpOworCXVwZGF0ZV90Z19sb2FkX2F2ZyhjZnNfcnEsIGZhbHNlKTsKIAogCWlmICghdnJ1bnRpbWVfbm9ybWFsaXplZChwKSkKIAkJc2UtPnZydW50aW1lICs9IGNmc19ycS0+bWluX3ZydW50aW1lOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2lkbGVfdGFzay5jIGIva2VybmVsL3NjaGVkL2lkbGVfdGFzay5jCmluZGV4IDJjZTU0NTguLjU0MDVkM2YgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9pZGxlX3Rhc2suYworKysgYi9rZXJuZWwvc2NoZWQvaWRsZV90YXNrLmMKQEAgLTI3LDggKzI3LDggQEAKIHBpY2tfbmV4dF90YXNrX2lkbGUoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LCBzdHJ1Y3QgcGluX2Nvb2tpZSBjb29raWUpCiB7CiAJcHV0X3ByZXZfdGFzayhycSwgcHJldik7Ci0KLQlzY2hlZHN0YXRfaW5jKHJxLCBzY2hlZF9nb2lkbGUpOworCXVwZGF0ZV9pZGxlX2NvcmUocnEpOworCXNjaGVkc3RhdF9pbmMocnEtPnNjaGVkX2dvaWRsZSk7CiAJcmV0dXJuIHJxLT5pZGxlOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvcnQuYyBiL2tlcm5lbC9zY2hlZC9ydC5jCmluZGV4IGQ1NjkwYjcuLjI1MTZiOGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9ydC5jCisrKyBiL2tlcm5lbC9zY2hlZC9ydC5jCkBAIC05NTcsOSArOTU3LDggQEAKIAlpZiAodW5saWtlbHkoKHM2NClkZWx0YV9leGVjIDw9IDApKQogCQlyZXR1cm47CiAKLQkvKiBLaWNrIGNwdWZyZXEgKHNlZSB0aGUgY29tbWVudCBpbiBsaW51eC9jcHVmcmVxLmgpLiAqLwotCWlmIChjcHVfb2YocnEpID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKLQkJY3B1ZnJlcV90cmlnZ2VyX3VwZGF0ZShycV9jbG9jayhycSkpOworCS8qIEtpY2sgY3B1ZnJlcSAoc2VlIHRoZSBjb21tZW50IGluIGtlcm5lbC9zY2hlZC9zY2hlZC5oKS4gKi8KKwljcHVmcmVxX3VwZGF0ZV90aGlzX2NwdShycSwgU0NIRURfQ1BVRlJFUV9SVCk7CiAKIAlzY2hlZHN0YXRfc2V0KGN1cnItPnNlLnN0YXRpc3RpY3MuZXhlY19tYXgsCiAJCSAgICAgIG1heChjdXJyLT5zZS5zdGF0aXN0aWNzLmV4ZWNfbWF4LCBkZWx0YV9leGVjKSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvc2NoZWQuaCBiL2tlcm5lbC9zY2hlZC9zY2hlZC5oCmluZGV4IGM2NGZjNTEuLjA1NWY5MzUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9zY2hlZC5oCisrKyBiL2tlcm5lbC9zY2hlZC9zY2hlZC5oCkBAIC0yLDYgKzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC91NjRfc3RhdHNfc3luYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkL2RlYWRsaW5lLmg+CiAjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CkBAIC0xNSw2ICsxNiwxMiBAQAogI2luY2x1ZGUgImNwdWRlYWRsaW5lLmgiCiAjaW5jbHVkZSAiY3B1YWNjdC5oIgogCisjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCisjZGVmaW5lIFNDSEVEX1dBUk5fT04oeCkJV0FSTl9PTkNFKHgsICN4KQorI2Vsc2UKKyNkZWZpbmUgU0NIRURfV0FSTl9PTih4KQkoKHZvaWQpKHgpKQorI2VuZGlmCisKIHN0cnVjdCBycTsKIHN0cnVjdCBjcHVpZGxlX3N0YXRlOwogCkBAIC01NjUsNiArNTcyLDggQEAKIAkgKi8KIAljcHVtYXNrX3Zhcl90IHJ0b19tYXNrOwogCXN0cnVjdCBjcHVwcmkgY3B1cHJpOworCisJdW5zaWduZWQgbG9uZyBtYXhfY3B1X2NhcGFjaXR5OwogfTsKIAogZXh0ZXJuIHN0cnVjdCByb290X2RvbWFpbiBkZWZfcm9vdF9kb21haW47CkBAIC01OTcsNyArNjA2LDYgQEAKICNpZmRlZiBDT05GSUdfU01QCiAJdW5zaWduZWQgbG9uZyBsYXN0X2xvYWRfdXBkYXRlX3RpY2s7CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwotCXU2NCBub2h6X3N0YW1wOwogCXVuc2lnbmVkIGxvbmcgbm9oel9mbGFnczsKICNlbmRpZiAvKiBDT05GSUdfTk9fSFpfQ09NTU9OICovCiAjaWZkZWYgQ09ORklHX05PX0haX0ZVTEwKQEAgLTcyMyw2ICs3MzEsMjMgQEAKICNlbmRpZgogfQogCisKKyNpZmRlZiBDT05GSUdfU0NIRURfU01UCisKK2V4dGVybiBzdHJ1Y3Qgc3RhdGljX2tleV9mYWxzZSBzY2hlZF9zbXRfcHJlc2VudDsKKworZXh0ZXJuIHZvaWQgX191cGRhdGVfaWRsZV9jb3JlKHN0cnVjdCBycSAqcnEpOworCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2lkbGVfY29yZShzdHJ1Y3QgcnEgKnJxKQoreworCWlmIChzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZzY2hlZF9zbXRfcHJlc2VudCkpCisJCV9fdXBkYXRlX2lkbGVfY29yZShycSk7Cit9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2lkbGVfY29yZShzdHJ1Y3QgcnEgKnJxKSB7IH0KKyNlbmRpZgorCiBERUNMQVJFX1BFUl9DUFVfU0hBUkVEX0FMSUdORUQoc3RydWN0IHJxLCBydW5xdWV1ZXMpOwogCiAjZGVmaW5lIGNwdV9ycShjcHUpCQkoJnBlcl9jcHUocnVucXVldWVzLCAoY3B1KSkpCkBAIC04NTcsOCArODgyLDggQEAKIERFQ0xBUkVfUEVSX0NQVShzdHJ1Y3Qgc2NoZWRfZG9tYWluICosIHNkX2xsYyk7CiBERUNMQVJFX1BFUl9DUFUoaW50LCBzZF9sbGNfc2l6ZSk7CiBERUNMQVJFX1BFUl9DUFUoaW50LCBzZF9sbGNfaWQpOworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW5fc2hhcmVkICosIHNkX2xsY19zaGFyZWQpOwogREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW4gKiwgc2RfbnVtYSk7Ci1ERUNMQVJFX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiAqLCBzZF9idXN5KTsKIERFQ0xBUkVfUEVSX0NQVShzdHJ1Y3Qgc2NoZWRfZG9tYWluICosIHNkX2FzeW0pOwogCiBzdHJ1Y3Qgc2NoZWRfZ3JvdXBfY2FwYWNpdHkgewpAQCAtODcwLDEwICs4OTUsNiBAQAogCXVuc2lnbmVkIGludCBjYXBhY2l0eTsKIAl1bnNpZ25lZCBsb25nIG5leHRfdXBkYXRlOwogCWludCBpbWJhbGFuY2U7IC8qIFhYWCB1bnJlbGF0ZWQgdG8gY2FwYWNpdHkgYnV0IHNoYXJlZCBncm91cCBzdGF0ZSAqLwotCS8qCi0JICogTnVtYmVyIG9mIGJ1c3kgY3B1cyBpbiB0aGlzIGdyb3VwLgotCSAqLwotCWF0b21pY190IG5yX2J1c3lfY3B1czsKIAogCXVuc2lnbmVkIGxvbmcgY3B1bWFza1swXTsgLyogaXRlcmF0aW9uIG1hc2sgKi8KIH07CkBAIC0xMDAwLDcgKzEwMjEsMTEgQEAKIAkgKiBwZXItdGFzayBkYXRhIGhhdmUgYmVlbiBjb21wbGV0ZWQgYnkgdGhpcyBtb21lbnQuCiAJICovCiAJc21wX3dtYigpOworI2lmZGVmIENPTkZJR19USFJFQURfSU5GT19JTl9UQVNLCisJcC0+Y3B1ID0gY3B1OworI2Vsc2UKIAl0YXNrX3RocmVhZF9pbmZvKHApLT5jcHUgPSBjcHU7CisjZW5kaWYKIAlwLT53YWtlX2NwdSA9IGNwdTsKICNlbmRpZgogfQpAQCAtMTI2MCw2ICsxMjg1LDExIEBACiAJcHJldi0+c2NoZWRfY2xhc3MtPnB1dF9wcmV2X3Rhc2socnEsIHByZXYpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2N1cnJfdGFzayhzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIpCit7CisJY3Vyci0+c2NoZWRfY2xhc3MtPnNldF9jdXJyX3Rhc2socnEpOworfQorCiAjZGVmaW5lIHNjaGVkX2NsYXNzX2hpZ2hlc3QgKCZzdG9wX3NjaGVkX2NsYXNzKQogI2RlZmluZSBmb3JfZWFjaF9jbGFzcyhjbGFzcykgXAogICAgZm9yIChjbGFzcyA9IHNjaGVkX2NsYXNzX2hpZ2hlc3Q7IGNsYXNzOyBjbGFzcyA9IGNsYXNzLT5uZXh0KQpAQCAtMTI5MCw3ICsxMzIwLDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqaWRsZV9nZXRfc3RhdGUoc3RydWN0IHJxICpycSkKIHsKLQlXQVJOX09OKCFyY3VfcmVhZF9sb2NrX2hlbGQoKSk7CisJU0NIRURfV0FSTl9PTighcmN1X3JlYWRfbG9ja19oZWxkKCkpOwogCXJldHVybiBycS0+aWRsZV9zdGF0ZTsKIH0KICNlbHNlCkBAIC0xNzEwLDUyICsxNzQwLDI4IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19JUlFfVElNRV9BQ0NPVU5USU5HCitzdHJ1Y3QgaXJxdGltZSB7CisJdTY0CQkJaGFyZGlycV90aW1lOworCXU2NAkJCXNvZnRpcnFfdGltZTsKKwl1NjQJCQlpcnFfc3RhcnRfdGltZTsKKwlzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMJc3luYzsKK307CiAKLURFQ0xBUkVfUEVSX0NQVSh1NjQsIGNwdV9oYXJkaXJxX3RpbWUpOwotREVDTEFSRV9QRVJfQ1BVKHU2NCwgY3B1X3NvZnRpcnFfdGltZSk7Ci0KLSNpZm5kZWYgQ09ORklHXzY0QklUCi1ERUNMQVJFX1BFUl9DUFUoc2VxY291bnRfdCwgaXJxX3RpbWVfc2VxKTsKLQotc3RhdGljIGlubGluZSB2b2lkIGlycV90aW1lX3dyaXRlX2JlZ2luKHZvaWQpCi17Ci0JX190aGlzX2NwdV9pbmMoaXJxX3RpbWVfc2VxLnNlcXVlbmNlKTsKLQlzbXBfd21iKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpcnFfdGltZV93cml0ZV9lbmQodm9pZCkKLXsKLQlzbXBfd21iKCk7Ci0JX190aGlzX2NwdV9pbmMoaXJxX3RpbWVfc2VxLnNlcXVlbmNlKTsKLX0KK0RFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgaXJxdGltZSwgY3B1X2lycXRpbWUpOwogCiBzdGF0aWMgaW5saW5lIHU2NCBpcnFfdGltZV9yZWFkKGludCBjcHUpCiB7Ci0JdTY0IGlycV90aW1lOwotCXVuc2lnbmVkIHNlcTsKKwlzdHJ1Y3QgaXJxdGltZSAqaXJxdGltZSA9ICZwZXJfY3B1KGNwdV9pcnF0aW1lLCBjcHUpOworCXVuc2lnbmVkIGludCBzZXE7CisJdTY0IHRvdGFsOwogCiAJZG8gewotCQlzZXEgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZwZXJfY3B1KGlycV90aW1lX3NlcSwgY3B1KSk7Ci0JCWlycV90aW1lID0gcGVyX2NwdShjcHVfc29mdGlycV90aW1lLCBjcHUpICsKLQkJCSAgIHBlcl9jcHUoY3B1X2hhcmRpcnFfdGltZSwgY3B1KTsKLQl9IHdoaWxlIChyZWFkX3NlcWNvdW50X3JldHJ5KCZwZXJfY3B1KGlycV90aW1lX3NlcSwgY3B1KSwgc2VxKSk7CisJCXNlcSA9IF9fdTY0X3N0YXRzX2ZldGNoX2JlZ2luKCZpcnF0aW1lLT5zeW5jKTsKKwkJdG90YWwgPSBpcnF0aW1lLT5zb2Z0aXJxX3RpbWUgKyBpcnF0aW1lLT5oYXJkaXJxX3RpbWU7CisJfSB3aGlsZSAoX191NjRfc3RhdHNfZmV0Y2hfcmV0cnkoJmlycXRpbWUtPnN5bmMsIHNlcSkpOwogCi0JcmV0dXJuIGlycV90aW1lOworCXJldHVybiB0b3RhbDsKIH0KLSNlbHNlIC8qIENPTkZJR182NEJJVCAqLwotc3RhdGljIGlubGluZSB2b2lkIGlycV90aW1lX3dyaXRlX2JlZ2luKHZvaWQpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpcnFfdGltZV93cml0ZV9lbmQodm9pZCkKLXsKLX0KLQotc3RhdGljIGlubGluZSB1NjQgaXJxX3RpbWVfcmVhZChpbnQgY3B1KQotewotCXJldHVybiBwZXJfY3B1KGNwdV9zb2Z0aXJxX3RpbWUsIGNwdSkgKyBwZXJfY3B1KGNwdV9oYXJkaXJxX3RpbWUsIGNwdSk7Ci19Ci0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAjZW5kaWYgLyogQ09ORklHX0lSUV9USU1FX0FDQ09VTlRJTkcgKi8KIAogI2lmZGVmIENPTkZJR19DUFVfRlJFUQpAQCAtMTc2MywyNyArMTc2OSwxMyBAQAogCiAvKioKICAqIGNwdWZyZXFfdXBkYXRlX3V0aWwgLSBUYWtlIGEgbm90ZSBhYm91dCBDUFUgdXRpbGl6YXRpb24gY2hhbmdlcy4KLSAqIEB0aW1lOiBDdXJyZW50IHRpbWUuCi0gKiBAdXRpbDogQ3VycmVudCB1dGlsaXphdGlvbi4KLSAqIEBtYXg6IFV0aWxpemF0aW9uIGNlaWxpbmcuCisgKiBAcnE6IFJ1bnF1ZXVlIHRvIGNhcnJ5IG91dCB0aGUgdXBkYXRlIGZvci4KKyAqIEBmbGFnczogVXBkYXRlIHJlYXNvbiBmbGFncy4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgc2NoZWR1bGVyIG9uIGV2ZXJ5IGludm9jYXRpb24gb2YKLSAqIHVwZGF0ZV9sb2FkX2F2ZygpIG9uIHRoZSBDUFUgd2hvc2UgdXRpbGl6YXRpb24gaXMgYmVpbmcgdXBkYXRlZC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBzY2hlZHVsZXIgb24gdGhlIENQVSB3aG9zZSB1dGlsaXphdGlvbiBpcworICogYmVpbmcgdXBkYXRlZC4KICAqCiAgKiBJdCBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBSQ1Utc2NoZWQgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV91cGRhdGVfdXRpbCh1NjQgdGltZSwgdW5zaWduZWQgbG9uZyB1dGlsLCB1bnNpZ25lZCBsb25nIG1heCkKLXsKLSAgICAgICBzdHJ1Y3QgdXBkYXRlX3V0aWxfZGF0YSAqZGF0YTsKLQotICAgICAgIGRhdGEgPSByY3VfZGVyZWZlcmVuY2Vfc2NoZWQoKnRoaXNfY3B1X3B0cigmY3B1ZnJlcV91cGRhdGVfdXRpbF9kYXRhKSk7Ci0gICAgICAgaWYgKGRhdGEpCi0gICAgICAgICAgICAgICBkYXRhLT5mdW5jKGRhdGEsIHRpbWUsIHV0aWwsIG1heCk7Ci19Ci0KLS8qKgotICogY3B1ZnJlcV90cmlnZ2VyX3VwZGF0ZSAtIFRyaWdnZXIgQ1BVIHBlcmZvcm1hbmNlIHN0YXRlIGV2YWx1YXRpb24gaWYgbmVlZGVkLgotICogQHRpbWU6IEN1cnJlbnQgdGltZS4KICAqCiAgKiBUaGUgd2F5IGNwdWZyZXEgaXMgY3VycmVudGx5IGFycmFuZ2VkIHJlcXVpcmVzIGl0IHRvIGV2YWx1YXRlIHRoZSBDUFUKICAqIHBlcmZvcm1hbmNlIHN0YXRlIChmcmVxdWVuY3kvdm9sdGFnZSkgb24gYSByZWd1bGFyIGJhc2lzIHRvIHByZXZlbnQgaXQgZnJvbQpAQCAtMTc5NywxMyArMTc4OSwyMyBAQAogICogYnV0IHRoYXQgcmVhbGx5IGlzIGEgYmFuZC1haWQuICBHb2luZyBmb3J3YXJkIGl0IHNob3VsZCBiZSByZXBsYWNlZCB3aXRoCiAgKiBzb2x1dGlvbnMgdGFyZ2V0ZWQgbW9yZSBzcGVjaWZpY2FsbHkgYXQgUlQgYW5kIERMIHRhc2tzLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV90cmlnZ2VyX3VwZGF0ZSh1NjQgdGltZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVmcmVxX3VwZGF0ZV91dGlsKHN0cnVjdCBycSAqcnEsIHVuc2lnbmVkIGludCBmbGFncykKIHsKLQljcHVmcmVxX3VwZGF0ZV91dGlsKHRpbWUsIFVMT05HX01BWCwgMCk7CisJc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGE7CisKKwlkYXRhID0gcmN1X2RlcmVmZXJlbmNlX3NjaGVkKCp0aGlzX2NwdV9wdHIoJmNwdWZyZXFfdXBkYXRlX3V0aWxfZGF0YSkpOworCWlmIChkYXRhKQorCQlkYXRhLT5mdW5jKGRhdGEsIHJxX2Nsb2NrKHJxKSwgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV91cGRhdGVfdGhpc19jcHUoc3RydWN0IHJxICpycSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCWlmIChjcHVfb2YocnEpID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJY3B1ZnJlcV91cGRhdGVfdXRpbChycSwgZmxhZ3MpOwogfQogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBjcHVmcmVxX3VwZGF0ZV91dGlsKHU2NCB0aW1lLCB1bnNpZ25lZCBsb25nIHV0aWwsIHVuc2lnbmVkIGxvbmcgbWF4KSB7fQotc3RhdGljIGlubGluZSB2b2lkIGNwdWZyZXFfdHJpZ2dlcl91cGRhdGUodTY0IHRpbWUpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV91cGRhdGVfdXRpbChzdHJ1Y3QgcnEgKnJxLCB1bnNpZ25lZCBpbnQgZmxhZ3MpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV91cGRhdGVfdGhpc19jcHUoc3RydWN0IHJxICpycSwgdW5zaWduZWQgaW50IGZsYWdzKSB7fQogI2VuZGlmIC8qIENPTkZJR19DUFVfRlJFUSAqLwogCiAjaWZkZWYgYXJjaF9zY2FsZV9mcmVxX2NhcGFjaXR5CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvc3RhdHMuaCBiL2tlcm5lbC9zY2hlZC9zdGF0cy5oCmluZGV4IDc4OTU1Y2IuLjM0NjU5YTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9zdGF0cy5oCisrKyBiL2tlcm5lbC9zY2hlZC9zdGF0cy5oCkBAIC0yOSwxMSArMjksMTIgQEAKIAlpZiAocnEpCiAJCXJxLT5ycV9zY2hlZF9pbmZvLnJ1bl9kZWxheSArPSBkZWx0YTsKIH0KLSMgZGVmaW5lIHNjaGVkc3RhdF9lbmFibGVkKCkJCXN0YXRpY19icmFuY2hfdW5saWtlbHkoJnNjaGVkX3NjaGVkc3RhdHMpCi0jIGRlZmluZSBzY2hlZHN0YXRfaW5jKHJxLCBmaWVsZCkJZG8geyBpZiAoc2NoZWRzdGF0X2VuYWJsZWQoKSkgeyAocnEpLT5maWVsZCsrOyB9IH0gd2hpbGUgKDApCi0jIGRlZmluZSBzY2hlZHN0YXRfYWRkKHJxLCBmaWVsZCwgYW10KQlkbyB7IGlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKSB7IChycSktPmZpZWxkICs9IChhbXQpOyB9IH0gd2hpbGUgKDApCi0jIGRlZmluZSBzY2hlZHN0YXRfc2V0KHZhciwgdmFsKQlkbyB7IGlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKSB7IHZhciA9ICh2YWwpOyB9IH0gd2hpbGUgKDApCi0jIGRlZmluZSBzY2hlZHN0YXRfdmFsKHJxLCBmaWVsZCkJKChzY2hlZHN0YXRfZW5hYmxlZCgpKSA/IChycSktPmZpZWxkIDogMCkKKyNkZWZpbmUgc2NoZWRzdGF0X2VuYWJsZWQoKQkJc3RhdGljX2JyYW5jaF91bmxpa2VseSgmc2NoZWRfc2NoZWRzdGF0cykKKyNkZWZpbmUgc2NoZWRzdGF0X2luYyh2YXIpCQlkbyB7IGlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKSB7IHZhcisrOyB9IH0gd2hpbGUgKDApCisjZGVmaW5lIHNjaGVkc3RhdF9hZGQodmFyLCBhbXQpCQlkbyB7IGlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKSB7IHZhciArPSAoYW10KTsgfSB9IHdoaWxlICgwKQorI2RlZmluZSBzY2hlZHN0YXRfc2V0KHZhciwgdmFsKQkJZG8geyBpZiAoc2NoZWRzdGF0X2VuYWJsZWQoKSkgeyB2YXIgPSAodmFsKTsgfSB9IHdoaWxlICgwKQorI2RlZmluZSBzY2hlZHN0YXRfdmFsKHZhcikJCSh2YXIpCisjZGVmaW5lIHNjaGVkc3RhdF92YWxfb3JfemVybyh2YXIpCSgoc2NoZWRzdGF0X2VuYWJsZWQoKSkgPyAodmFyKSA6IDApCiAKICNlbHNlIC8qICFDT05GSUdfU0NIRURTVEFUUyAqLwogc3RhdGljIGlubGluZSB2b2lkCkBAIC00NSwxMiArNDYsMTMgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogcnFfc2NoZWRfaW5mb19kZXBhcnQoc3RydWN0IHJxICpycSwgdW5zaWduZWQgbG9uZyBsb25nIGRlbHRhKQoge30KLSMgZGVmaW5lIHNjaGVkc3RhdF9lbmFibGVkKCkJCTAKLSMgZGVmaW5lIHNjaGVkc3RhdF9pbmMocnEsIGZpZWxkKQlkbyB7IH0gd2hpbGUgKDApCi0jIGRlZmluZSBzY2hlZHN0YXRfYWRkKHJxLCBmaWVsZCwgYW10KQlkbyB7IH0gd2hpbGUgKDApCi0jIGRlZmluZSBzY2hlZHN0YXRfc2V0KHZhciwgdmFsKQlkbyB7IH0gd2hpbGUgKDApCi0jIGRlZmluZSBzY2hlZHN0YXRfdmFsKHJxLCBmaWVsZCkJMAotI2VuZGlmCisjZGVmaW5lIHNjaGVkc3RhdF9lbmFibGVkKCkJCTAKKyNkZWZpbmUgc2NoZWRzdGF0X2luYyh2YXIpCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNjaGVkc3RhdF9hZGQodmFyLCBhbXQpCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNjaGVkc3RhdF9zZXQodmFyLCB2YWwpCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNjaGVkc3RhdF92YWwodmFyKQkJMAorI2RlZmluZSBzY2hlZHN0YXRfdmFsX29yX3plcm8odmFyKQkwCisjZW5kaWYgLyogQ09ORklHX1NDSEVEU1RBVFMgKi8KIAogI2lmZGVmIENPTkZJR19TQ0hFRF9JTkZPCiBzdGF0aWMgaW5saW5lIHZvaWQgc2NoZWRfaW5mb19yZXNldF9kZXF1ZXVlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvd2FpdC5jIGIva2VybmVsL3NjaGVkL3dhaXQuYwppbmRleCBmMTVkNmI2Li40ZjcwNTM1IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvd2FpdC5jCisrKyBiL2tlcm5lbC9zY2hlZC93YWl0LmMKQEAgLTE5NiwyNyArMTk2LDQ4IEBACiB9CiBFWFBPUlRfU1lNQk9MKHByZXBhcmVfdG9fd2FpdF9leGNsdXNpdmUpOwogCit2b2lkIGluaXRfd2FpdF9lbnRyeSh3YWl0X3F1ZXVlX3QgKndhaXQsIGludCBmbGFncykKK3sKKwl3YWl0LT5mbGFncyA9IGZsYWdzOworCXdhaXQtPnByaXZhdGUgPSBjdXJyZW50OworCXdhaXQtPmZ1bmMgPSBhdXRvcmVtb3ZlX3dha2VfZnVuY3Rpb247CisJSU5JVF9MSVNUX0hFQUQoJndhaXQtPnRhc2tfbGlzdCk7Cit9CitFWFBPUlRfU1lNQk9MKGluaXRfd2FpdF9lbnRyeSk7CisKIGxvbmcgcHJlcGFyZV90b193YWl0X2V2ZW50KHdhaXRfcXVldWVfaGVhZF90ICpxLCB3YWl0X3F1ZXVlX3QgKndhaXQsIGludCBzdGF0ZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHNpZ25hbF9wZW5kaW5nX3N0YXRlKHN0YXRlLCBjdXJyZW50KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCXdhaXQtPnByaXZhdGUgPSBjdXJyZW50OwotCXdhaXQtPmZ1bmMgPSBhdXRvcmVtb3ZlX3dha2VfZnVuY3Rpb247CisJbG9uZyByZXQgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnEtPmxvY2ssIGZsYWdzKTsKLQlpZiAobGlzdF9lbXB0eSgmd2FpdC0+dGFza19saXN0KSkgewotCQlpZiAod2FpdC0+ZmxhZ3MgJiBXUV9GTEFHX0VYQ0xVU0lWRSkKLQkJCV9fYWRkX3dhaXRfcXVldWVfdGFpbChxLCB3YWl0KTsKLQkJZWxzZQotCQkJX19hZGRfd2FpdF9xdWV1ZShxLCB3YWl0KTsKKwlpZiAodW5saWtlbHkoc2lnbmFsX3BlbmRpbmdfc3RhdGUoc3RhdGUsIGN1cnJlbnQpKSkgeworCQkvKgorCQkgKiBFeGNsdXNpdmUgd2FpdGVyIG11c3Qgbm90IGZhaWwgaWYgaXQgd2FzIHNlbGVjdGVkIGJ5IHdha2V1cCwKKwkJICogaXQgc2hvdWxkICJjb25zdW1lIiB0aGUgY29uZGl0aW9uIHdlIHdlcmUgd2FpdGluZyBmb3IuCisJCSAqCisJCSAqIFRoZSBjYWxsZXIgd2lsbCByZWNoZWNrIHRoZSBjb25kaXRpb24gYW5kIHJldHVybiBzdWNjZXNzIGlmCisJCSAqIHdlIHdlcmUgYWxyZWFkeSB3b2tlbiB1cCwgd2UgY2FuIG5vdCBtaXNzIHRoZSBldmVudCBiZWNhdXNlCisJCSAqIHdha2V1cCBsb2Nrcy91bmxvY2tzIHRoZSBzYW1lIHEtPmxvY2suCisJCSAqCisJCSAqIEJ1dCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHNldC1jb25kaXRpb24gKyB3YWtldXAgYWZ0ZXIgdGhhdAorCQkgKiBjYW4ndCBzZWUgdXMsIGl0IHNob3VsZCB3YWtlIHVwIGFub3RoZXIgZXhjbHVzaXZlIHdhaXRlciBpZgorCQkgKiB3ZSBmYWlsLgorCQkgKi8KKwkJbGlzdF9kZWxfaW5pdCgmd2FpdC0+dGFza19saXN0KTsKKwkJcmV0ID0gLUVSRVNUQVJUU1lTOworCX0gZWxzZSB7CisJCWlmIChsaXN0X2VtcHR5KCZ3YWl0LT50YXNrX2xpc3QpKSB7CisJCQlpZiAod2FpdC0+ZmxhZ3MgJiBXUV9GTEFHX0VYQ0xVU0lWRSkKKwkJCQlfX2FkZF93YWl0X3F1ZXVlX3RhaWwocSwgd2FpdCk7CisJCQllbHNlCisJCQkJX19hZGRfd2FpdF9xdWV1ZShxLCB3YWl0KTsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShzdGF0ZSk7CiAJfQotCXNldF9jdXJyZW50X3N0YXRlKHN0YXRlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5sb2NrLCBmbGFncyk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChwcmVwYXJlX3RvX3dhaXRfZXZlbnQpOwogCkBAIC0yNTUsMzkgKzI3Niw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGZpbmlzaF93YWl0KTsKIAotLyoqCi0gKiBhYm9ydF9leGNsdXNpdmVfd2FpdCAtIGFib3J0IGV4Y2x1c2l2ZSB3YWl0aW5nIGluIGEgcXVldWUKLSAqIEBxOiB3YWl0cXVldWUgd2FpdGVkIG9uCi0gKiBAd2FpdDogd2FpdCBkZXNjcmlwdG9yCi0gKiBAbW9kZTogcnVuc3RhdGUgb2YgdGhlIHdhaXRlciB0byBiZSB3b2tlbgotICogQGtleToga2V5IHRvIGlkZW50aWZ5IGEgd2FpdCBiaXQgcXVldWUgb3IgJU5VTEwKLSAqCi0gKiBTZXRzIGN1cnJlbnQgdGhyZWFkIGJhY2sgdG8gcnVubmluZyBzdGF0ZSBhbmQgcmVtb3ZlcwotICogdGhlIHdhaXQgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiB3YWl0cXVldWUgaWYgc3RpbGwKLSAqIHF1ZXVlZC4KLSAqCi0gKiBXYWtlcyB1cCB0aGUgbmV4dCB3YWl0ZXIgaWYgdGhlIGNhbGxlciBpcyBjb25jdXJyZW50bHkKLSAqIHdva2VuIHVwIHRocm91Z2ggdGhlIHF1ZXVlLgotICoKLSAqIFRoaXMgcHJldmVudHMgd2FpdGVyIHN0YXJ2YXRpb24gd2hlcmUgYW4gZXhjbHVzaXZlIHdhaXRlcgotICogYWJvcnRzIGFuZCBpcyB3b2tlbiB1cCBjb25jdXJyZW50bHkgYW5kIG5vIG9uZSB3YWtlcyB1cAotICogdGhlIG5leHQgd2FpdGVyLgotICovCi12b2lkIGFib3J0X2V4Y2x1c2l2ZV93YWl0KHdhaXRfcXVldWVfaGVhZF90ICpxLCB3YWl0X3F1ZXVlX3QgKndhaXQsCi0JCQl1bnNpZ25lZCBpbnQgbW9kZSwgdm9pZCAqa2V5KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnEtPmxvY2ssIGZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHkoJndhaXQtPnRhc2tfbGlzdCkpCi0JCWxpc3RfZGVsX2luaXQoJndhaXQtPnRhc2tfbGlzdCk7Ci0JZWxzZSBpZiAod2FpdHF1ZXVlX2FjdGl2ZShxKSkKLQkJX193YWtlX3VwX2xvY2tlZF9rZXkocSwgbW9kZSwga2V5KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5sb2NrLCBmbGFncyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGFib3J0X2V4Y2x1c2l2ZV93YWl0KTsKLQogaW50IGF1dG9yZW1vdmVfd2FrZV9mdW5jdGlvbih3YWl0X3F1ZXVlX3QgKndhaXQsIHVuc2lnbmVkIG1vZGUsIGludCBzeW5jLCB2b2lkICprZXkpCiB7CiAJaW50IHJldCA9IGRlZmF1bHRfd2FrZV9mdW5jdGlvbih3YWl0LCBtb2RlLCBzeW5jLCBrZXkpOwpAQCAtNDI1LDIwICs0MTMsMjkgQEAKIF9fd2FpdF9vbl9iaXRfbG9jayh3YWl0X3F1ZXVlX2hlYWRfdCAqd3EsIHN0cnVjdCB3YWl0X2JpdF9xdWV1ZSAqcSwKIAkJCXdhaXRfYml0X2FjdGlvbl9mICphY3Rpb24sIHVuc2lnbmVkIG1vZGUpCiB7Ci0JZG8gewotCQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCisJZm9yICg7OykgewogCQlwcmVwYXJlX3RvX3dhaXRfZXhjbHVzaXZlKHdxLCAmcS0+d2FpdCwgbW9kZSk7Ci0JCWlmICghdGVzdF9iaXQocS0+a2V5LmJpdF9uciwgcS0+a2V5LmZsYWdzKSkKLQkJCWNvbnRpbnVlOwotCQlyZXQgPSBhY3Rpb24oJnEtPmtleSwgbW9kZSk7Ci0JCWlmICghcmV0KQotCQkJY29udGludWU7Ci0JCWFib3J0X2V4Y2x1c2l2ZV93YWl0KHdxLCAmcS0+d2FpdCwgbW9kZSwgJnEtPmtleSk7Ci0JCXJldHVybiByZXQ7Ci0JfSB3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChxLT5rZXkuYml0X25yLCBxLT5rZXkuZmxhZ3MpKTsKLQlmaW5pc2hfd2FpdCh3cSwgJnEtPndhaXQpOwotCXJldHVybiAwOworCQlpZiAodGVzdF9iaXQocS0+a2V5LmJpdF9uciwgcS0+a2V5LmZsYWdzKSkgeworCQkJcmV0ID0gYWN0aW9uKCZxLT5rZXksIG1vZGUpOworCQkJLyoKKwkJCSAqIFNlZSB0aGUgY29tbWVudCBpbiBwcmVwYXJlX3RvX3dhaXRfZXZlbnQoKS4KKwkJCSAqIGZpbmlzaF93YWl0KCkgZG9lcyBub3QgbmVjZXNzYXJpbHkgdGFrZXMgd3EtPmxvY2ssCisJCQkgKiBidXQgdGVzdF9hbmRfc2V0X2JpdCgpIGltcGxpZXMgbWIoKSB3aGljaCBwYWlycyB3aXRoCisJCQkgKiBzbXBfbWJfX2FmdGVyX2F0b21pYygpIGJlZm9yZSB3YWtlX3VwX3BhZ2UoKS4KKwkJCSAqLworCQkJaWYgKHJldCkKKwkJCQlmaW5pc2hfd2FpdCh3cSwgJnEtPndhaXQpOworCQl9CisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChxLT5rZXkuYml0X25yLCBxLT5rZXkuZmxhZ3MpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlmaW5pc2hfd2FpdCh3cSwgJnEtPndhaXQpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAocmV0KSB7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQogfQogRVhQT1JUX1NZTUJPTChfX3dhaXRfb25fYml0X2xvY2spOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvc2VjY29tcC5jIGIva2VybmVsL3NlY2NvbXAuYwppbmRleCBlZjZjNmMzLi4wZGI3YzhhIDEwMDY0NAotLS0gYS9rZXJuZWwvc2VjY29tcC5jCisrKyBiL2tlcm5lbC9zZWNjb21wLmMKQEAgLTYwNSwxMiArNjA1LDE2IEBACiAJCXB0cmFjZV9ldmVudChQVFJBQ0VfRVZFTlRfU0VDQ09NUCwgZGF0YSk7CiAJCS8qCiAJCSAqIFRoZSBkZWxpdmVyeSBvZiBhIGZhdGFsIHNpZ25hbCBkdXJpbmcgZXZlbnQKLQkJICogbm90aWZpY2F0aW9uIG1heSBzaWxlbnRseSBza2lwIHRyYWNlciBub3RpZmljYXRpb24uCi0JCSAqIFRlcm1pbmF0aW5nIHRoZSB0YXNrIG5vdyBhdm9pZHMgZXhlY3V0aW5nIGEgc3lzdGVtCi0JCSAqIGNhbGwgdGhhdCBtYXkgbm90IGJlIGludGVuZGVkLgorCQkgKiBub3RpZmljYXRpb24gbWF5IHNpbGVudGx5IHNraXAgdHJhY2VyIG5vdGlmaWNhdGlvbiwKKwkJICogd2hpY2ggY291bGQgbGVhdmUgdXMgd2l0aCBhIHBvdGVudGlhbGx5IHVubW9kaWZpZWQKKwkJICogc3lzY2FsbCB0aGF0IHRoZSB0cmFjZXIgd291bGQgaGF2ZSBsaWtlZCB0byBoYXZlCisJCSAqIGNoYW5nZWQuIFNpbmNlIHRoZSBwcm9jZXNzIGlzIGFib3V0IHRvIGRpZSwgd2UganVzdAorCQkgKiBmb3JjZSB0aGUgc3lzY2FsbCB0byBiZSBza2lwcGVkIGFuZCBsZXQgdGhlIHNpZ25hbAorCQkgKiBraWxsIHRoZSBwcm9jZXNzIGFuZCBjb3JyZWN0bHkgaGFuZGxlIGFueSB0cmFjZXIgZXhpdAorCQkgKiBub3RpZmljYXRpb25zLgogCQkgKi8KIAkJaWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJZG9fZXhpdChTSUdTWVMpOworCQkJZ290byBza2lwOwogCQkvKiBDaGVjayBpZiB0aGUgdHJhY2VyIGZvcmNlZCB0aGUgc3lzY2FsbCB0byBiZSBza2lwcGVkLiAqLwogCQl0aGlzX3N5c2NhbGwgPSBzeXNjYWxsX2dldF9ucihjdXJyZW50LCB0YXNrX3B0X3JlZ3MoY3VycmVudCkpOwogCQlpZiAodGhpc19zeXNjYWxsIDwgMCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCBhZjIxYWZjLi43NTc2MWFjIDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC0zMDQ0LDYgKzMwNDQsMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0woa2VybmVsX3NpZ2FjdGlvbik7CiAKK3ZvaWQgX193ZWFrIHNpZ2FjdGlvbl9jb21wYXRfYWJpKHN0cnVjdCBrX3NpZ2FjdGlvbiAqYWN0LAorCQlzdHJ1Y3Qga19zaWdhY3Rpb24gKm9hY3QpCit7Cit9CisKIGludCBkb19zaWdhY3Rpb24oaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICphY3QsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqb2FjdCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAgPSBjdXJyZW50LCAqdDsKQEAgLTMwNTksNiArMzA2NCw4IEBACiAJaWYgKG9hY3QpCiAJCSpvYWN0ID0gKms7CiAKKwlzaWdhY3Rpb25fY29tcGF0X2FiaShhY3QsIG9hY3QpOworCiAJaWYgKGFjdCkgewogCQlzaWdkZWxzZXRtYXNrKCZhY3QtPnNhLnNhX21hc2ssCiAJCQkgICAgICBzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc21wLmMgYi9rZXJuZWwvc21wLmMKaW5kZXggM2FhNjQyZC4uYmJhM2IyMCAxMDA2NDQKLS0tIGEva2VybmVsL3NtcC5jCisrKyBiL2tlcm5lbC9zbXAuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaHlwZXJ2aXNvci5oPgogCiAjaW5jbHVkZSAic21wYm9vdC5oIgogCkBAIC03MjQsMyArNzI1LDU0IEBACiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHdha2VfdXBfYWxsX2lkbGVfY3B1cyk7CisKKy8qKgorICogc21wX2NhbGxfb25fY3B1IC0gQ2FsbCBhIGZ1bmN0aW9uIG9uIGEgc3BlY2lmaWMgY3B1CisgKgorICogVXNlZCB0byBjYWxsIGEgZnVuY3Rpb24gb24gYSBzcGVjaWZpYyBjcHUgYW5kIHdhaXQgZm9yIGl0IHRvIHJldHVybi4KKyAqIE9wdGlvbmFsbHkgbWFrZSBzdXJlIHRoZSBjYWxsIGlzIGRvbmUgb24gYSBzcGVjaWZpZWQgcGh5c2ljYWwgY3B1IHZpYSB2Y3B1CisgKiBwaW5uaW5nIGluIG9yZGVyIHRvIHN1cHBvcnQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLgorICovCitzdHJ1Y3Qgc21wX2NhbGxfb25fY3B1X3N0cnVjdCB7CisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJc3RydWN0IGNvbXBsZXRpb24JZG9uZTsKKwlpbnQJCQkoKmZ1bmMpKHZvaWQgKik7CisJdm9pZAkJCSpkYXRhOworCWludAkJCXJldDsKKwlpbnQJCQljcHU7Cit9OworCitzdGF0aWMgdm9pZCBzbXBfY2FsbF9vbl9jcHVfY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBzbXBfY2FsbF9vbl9jcHVfc3RydWN0ICpzc2NzOworCisJc3NjcyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc21wX2NhbGxfb25fY3B1X3N0cnVjdCwgd29yayk7CisJaWYgKHNzY3MtPmNwdSA+PSAwKQorCQloeXBlcnZpc29yX3Bpbl92Y3B1KHNzY3MtPmNwdSk7CisJc3Njcy0+cmV0ID0gc3Njcy0+ZnVuYyhzc2NzLT5kYXRhKTsKKwlpZiAoc3Njcy0+Y3B1ID49IDApCisJCWh5cGVydmlzb3JfcGluX3ZjcHUoLTEpOworCisJY29tcGxldGUoJnNzY3MtPmRvbmUpOworfQorCitpbnQgc21wX2NhbGxfb25fY3B1KHVuc2lnbmVkIGludCBjcHUsIGludCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKnBhciwgYm9vbCBwaHlzKQoreworCXN0cnVjdCBzbXBfY2FsbF9vbl9jcHVfc3RydWN0IHNzY3MgPSB7CisJCS5kb25lID0gQ09NUExFVElPTl9JTklUSUFMSVpFUl9PTlNUQUNLKHNzY3MuZG9uZSksCisJCS5mdW5jID0gZnVuYywKKwkJLmRhdGEgPSBwYXIsCisJCS5jcHUgID0gcGh5cyA/IGNwdSA6IC0xLAorCX07CisKKwlJTklUX1dPUktfT05TVEFDSygmc3Njcy53b3JrLCBzbXBfY2FsbF9vbl9jcHVfY2FsbGJhY2spOworCisJaWYgKGNwdSA+PSBucl9jcHVfaWRzIHx8ICFjcHVfb25saW5lKGNwdSkpCisJCXJldHVybiAtRU5YSU87CisKKwlxdWV1ZV93b3JrX29uKGNwdSwgc3lzdGVtX3dxLCAmc3Njcy53b3JrKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZzc2NzLmRvbmUpOworCisJcmV0dXJuIHNzY3MucmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc21wX2NhbGxfb25fY3B1KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zbXBib290LmMgYi9rZXJuZWwvc21wYm9vdC5jCmluZGV4IDEzYmM0M2QuLmZjMGQ4MjcwIDEwMDY0NAotLS0gYS9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2tlcm5lbC9zbXBib290LmMKQEAgLTEyMiwxMiArMTIyLDEyIEBACiAKIAkJaWYgKGt0aHJlYWRfc2hvdWxkX3BhcmsoKSkgewogCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCQkJcHJlZW1wdF9lbmFibGUoKTsKIAkJCWlmIChodC0+cGFyayAmJiB0ZC0+c3RhdHVzID09IEhQX1RIUkVBRF9BQ1RJVkUpIHsKIAkJCQlCVUdfT04odGQtPmNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCQkJCWh0LT5wYXJrKHRkLT5jcHUpOwogCQkJCXRkLT5zdGF0dXMgPSBIUF9USFJFQURfUEFSS0VEOwogCQkJfQorCQkJcHJlZW1wdF9lbmFibGUoKTsKIAkJCWt0aHJlYWRfcGFya21lKCk7CiAJCQkvKiBXZSBtaWdodCBoYXZlIGJlZW4gd29rZW4gZm9yIHN0b3AgKi8KIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRpcnEuYyBiL2tlcm5lbC9zb2Z0aXJxLmMKaW5kZXggMTdjYWY0Yi4uNjY3NjI2NCAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRpcnEuYworKysgYi9rZXJuZWwvc29mdGlycS5jCkBAIC03OCw2ICs3OCwxNyBAQAogfQogCiAvKgorICogSWYga3NvZnRpcnFkIGlzIHNjaGVkdWxlZCwgd2UgZG8gbm90IHdhbnQgdG8gcHJvY2VzcyBwZW5kaW5nIHNvZnRpcnFzCisgKiByaWdodCBub3cuIExldCBrc29mdGlycWQgaGFuZGxlIHRoaXMgYXQgaXRzIG93biByYXRlLCB0byBnZXQgZmFpcm5lc3MuCisgKi8KK3N0YXRpYyBib29sIGtzb2Z0aXJxZF9ydW5uaW5nKHZvaWQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBfX3RoaXNfY3B1X3JlYWQoa3NvZnRpcnFkKTsKKworCXJldHVybiB0c2sgJiYgKHRzay0+c3RhdGUgPT0gVEFTS19SVU5OSU5HKTsKK30KKworLyoKICAqIHByZWVtcHRfY291bnQgYW5kIFNPRlRJUlFfT0ZGU0VUIHVzYWdlOgogICogLSBwcmVlbXB0X2NvdW50IGlzIGNoYW5nZWQgYnkgU09GVElSUV9PRkZTRVQgb24gZW50ZXJpbmcgb3IgbGVhdmluZwogICogICBzb2Z0aXJxIHByb2Nlc3NpbmcuCkBAIC0zMTMsNyArMzI0LDcgQEAKIAogCXBlbmRpbmcgPSBsb2NhbF9zb2Z0aXJxX3BlbmRpbmcoKTsKIAotCWlmIChwZW5kaW5nKQorCWlmIChwZW5kaW5nICYmICFrc29mdGlycWRfcnVubmluZygpKQogCQlkb19zb2Z0aXJxX293bl9zdGFjaygpOwogCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtMzQwLDYgKzM1MSw5IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbnZva2Vfc29mdGlycSh2b2lkKQogeworCWlmIChrc29mdGlycWRfcnVubmluZygpKQorCQlyZXR1cm47CisKIAlpZiAoIWZvcmNlX2lycXRocmVhZHMpIHsKICNpZmRlZiBDT05GSUdfSEFWRV9JUlFfRVhJVF9PTl9JUlFfU1RBQ0sKIAkJLyoKQEAgLTcwMCw3ICs3MTQsNyBAQAogCUJVRygpOwogfQogCi1zdGF0aWMgdm9pZCB0YWtlb3Zlcl90YXNrbGV0cyh1bnNpZ25lZCBpbnQgY3B1KQorc3RhdGljIGludCB0YWtlb3Zlcl90YXNrbGV0cyh1bnNpZ25lZCBpbnQgY3B1KQogewogCS8qIENQVSBpcyBkZWFkLCBzbyBubyBsb2NrIG5lZWRlZC4gKi8KIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwpAQCAtNzIzLDI3ICs3MzcsMTIgQEAKIAlyYWlzZV9zb2Z0aXJxX2lycW9mZihISV9TT0ZUSVJRKTsKIAogCWxvY2FsX2lycV9lbmFibGUoKTsKKwlyZXR1cm4gMDsKIH0KKyNlbHNlCisjZGVmaW5lIHRha2VvdmVyX3Rhc2tsZXRzCU5VTEwKICNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KIAotc3RhdGljIGludCBjcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAotCQkJdm9pZCAqaGNwdSkKLXsKLQlzd2l0Y2ggKGFjdGlvbikgewotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCWNhc2UgQ1BVX0RFQUQ6Ci0JY2FzZSBDUFVfREVBRF9GUk9aRU46Ci0JCXRha2VvdmVyX3Rhc2tsZXRzKCh1bnNpZ25lZCBsb25nKWhjcHUpOwotCQlicmVhazsKLSNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjcHVfbmZiID0gewotCS5ub3RpZmllcl9jYWxsID0gY3B1X2NhbGxiYWNrCi19OwotCiBzdGF0aWMgc3RydWN0IHNtcF9ob3RwbHVnX3RocmVhZCBzb2Z0aXJxX3RocmVhZHMgPSB7CiAJLnN0b3JlCQkJPSAma3NvZnRpcnFkLAogCS50aHJlYWRfc2hvdWxkX3J1bgk9IGtzb2Z0aXJxZF9zaG91bGRfcnVuLApAQCAtNzUzLDggKzc1Miw4IEBACiAKIHN0YXRpYyBfX2luaXQgaW50IHNwYXduX2tzb2Z0aXJxZCh2b2lkKQogewotCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmY3B1X25mYik7Ci0KKwljcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX1NPRlRJUlFfREVBRCwgInNvZnRpcnE6ZGVhZCIsIE5VTEwsCisJCQkJICB0YWtlb3Zlcl90YXNrbGV0cyk7CiAJQlVHX09OKHNtcGJvb3RfcmVnaXN0ZXJfcGVyY3B1X3RocmVhZCgmc29mdGlycV90aHJlYWRzKSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zdG9wX21hY2hpbmUuYyBiL2tlcm5lbC9zdG9wX21hY2hpbmUuYwppbmRleCA0YTFjYTVmLi5lYzlhYjJmIDEwMDY0NAotLS0gYS9rZXJuZWwvc3RvcF9tYWNoaW5lLmMKKysrIGIva2VybmVsL3N0b3BfbWFjaGluZS5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBib290Lmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+Ci0jaW5jbHVkZSA8bGludXgvbGdsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbm1pLmg+CiAKIC8qCkBAIC00NywxMyArNDYsOSBAQAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfc3RvcHBlciwgY3B1X3N0b3BwZXIpOwogc3RhdGljIGJvb2wgc3RvcF9tYWNoaW5lX2luaXRpYWxpemVkID0gZmFsc2U7CiAKLS8qCi0gKiBBdm9pZHMgYSByYWNlIGJldHdlZW4gc3RvcF90d29fY3B1cyBhbmQgZ2xvYmFsIHN0b3BfY3B1cywgd2hlcmUKLSAqIHRoZSBzdG9wcGVycyBjb3VsZCBnZXQgcXVldWVkIHVwIGluIHJldmVyc2Ugb3JkZXIsIGxlYWRpbmcgdG8KLSAqIHN5c3RlbSBkZWFkbG9jay4gVXNpbmcgYW4gbGdsb2NrIG1lYW5zIHN0b3BfdHdvX2NwdXMgcmVtYWlucwotICogcmVsYXRpdmVseSBjaGVhcC4KLSAqLwotREVGSU5FX1NUQVRJQ19MR0xPQ0soc3RvcF9jcHVzX2xvY2spOworLyogc3RhdGljIGRhdGEgZm9yIHN0b3BfY3B1cyAqLworc3RhdGljIERFRklORV9NVVRFWChzdG9wX2NwdXNfbXV0ZXgpOworc3RhdGljIGJvb2wgc3RvcF9jcHVzX2luX3Byb2dyZXNzOwogCiBzdGF0aWMgdm9pZCBjcHVfc3RvcF9pbml0X2RvbmUoc3RydWN0IGNwdV9zdG9wX2RvbmUgKmRvbmUsIHVuc2lnbmVkIGludCBucl90b2RvKQogewpAQCAtMTI2LDYgKzEyMSwxMSBAQAogCWNwdV9zdG9wX2luaXRfZG9uZSgmZG9uZSwgMSk7CiAJaWYgKCFjcHVfc3RvcF9xdWV1ZV93b3JrKGNwdSwgJndvcmspKQogCQlyZXR1cm4gLUVOT0VOVDsKKwkvKgorCSAqIEluIGNhc2UgQGNwdSA9PSBzbXBfcHJvY2Nlc3Nvcl9pZCgpIHdlIGNhbiBhdm9pZCBhIHNsZWVwK3dha2V1cAorCSAqIGN5Y2xlIGJ5IGRvaW5nIGEgcHJlZW1wdGlvbjoKKwkgKi8KKwljb25kX3Jlc2NoZWQoKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkb25lLmNvbXBsZXRpb24pOwogCXJldHVybiBkb25lLnJldDsKIH0KQEAgLTIzMCwxNCArMjMwLDI2IEBACiAJc3RydWN0IGNwdV9zdG9wcGVyICpzdG9wcGVyMSA9IHBlcl9jcHVfcHRyKCZjcHVfc3RvcHBlciwgY3B1MSk7CiAJc3RydWN0IGNwdV9zdG9wcGVyICpzdG9wcGVyMiA9IHBlcl9jcHVfcHRyKCZjcHVfc3RvcHBlciwgY3B1Mik7CiAJaW50IGVycjsKLQotCWxnX2RvdWJsZV9sb2NrKCZzdG9wX2NwdXNfbG9jaywgY3B1MSwgY3B1Mik7CityZXRyeToKIAlzcGluX2xvY2tfaXJxKCZzdG9wcGVyMS0+bG9jayk7CiAJc3Bpbl9sb2NrX25lc3RlZCgmc3RvcHBlcjItPmxvY2ssIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKIAogCWVyciA9IC1FTk9FTlQ7CiAJaWYgKCFzdG9wcGVyMS0+ZW5hYmxlZCB8fCAhc3RvcHBlcjItPmVuYWJsZWQpCiAJCWdvdG8gdW5sb2NrOworCS8qCisJICogRW5zdXJlIHRoYXQgaWYgd2UgcmFjZSB3aXRoIF9fc3RvcF9jcHVzKCkgdGhlIHN0b3BwZXJzIHdvbid0IGdldAorCSAqIHF1ZXVlZCB1cCBpbiByZXZlcnNlIG9yZGVyIGxlYWRpbmcgdG8gc3lzdGVtIGRlYWRsb2NrLgorCSAqCisJICogV2UgY2FuJ3QgbWlzcyBzdG9wX2NwdXNfaW5fcHJvZ3Jlc3MgaWYgcXVldWVfc3RvcF9jcHVzX3dvcmsoKSBoYXMKKwkgKiBxdWV1ZWQgYSB3b3JrIG9uIGNwdTEgYnV0IG5vdCBvbiBjcHUyLCB3ZSBob2xkIGJvdGggbG9ja3MuCisJICoKKwkgKiBJdCBjYW4gYmUgZmFsc2VseSB0cnVlIGJ1dCBpdCBpcyBzYWZlIHRvIHNwaW4gdW50aWwgaXQgaXMgY2xlYXJlZCwKKwkgKiBxdWV1ZV9zdG9wX2NwdXNfd29yaygpIGRvZXMgZXZlcnl0aGluZyB1bmRlciBwcmVlbXB0X2Rpc2FibGUoKS4KKwkgKi8KKwllcnIgPSAtRURFQURMSzsKKwlpZiAodW5saWtlbHkoc3RvcF9jcHVzX2luX3Byb2dyZXNzKSkKKwkJCWdvdG8gdW5sb2NrOwogCiAJZXJyID0gMDsKIAlfX2NwdV9zdG9wX3F1ZXVlX3dvcmsoc3RvcHBlcjEsIHdvcmsxKTsKQEAgLTI0NSw4ICsyNTcsMTIgQEAKIHVubG9jazoKIAlzcGluX3VubG9jaygmc3RvcHBlcjItPmxvY2spOwogCXNwaW5fdW5sb2NrX2lycSgmc3RvcHBlcjEtPmxvY2spOwotCWxnX2RvdWJsZV91bmxvY2soJnN0b3BfY3B1c19sb2NrLCBjcHUxLCBjcHUyKTsKIAorCWlmICh1bmxpa2VseShlcnIgPT0gLUVERUFETEspKSB7CisJCXdoaWxlIChzdG9wX2NwdXNfaW5fcHJvZ3Jlc3MpCisJCQljcHVfcmVsYXgoKTsKKwkJZ290byByZXRyeTsKKwl9CiAJcmV0dXJuIGVycjsKIH0KIC8qKgpAQCAtMzE2LDkgKzMzMiw2IEBACiAJcmV0dXJuIGNwdV9zdG9wX3F1ZXVlX3dvcmsoY3B1LCB3b3JrX2J1Zik7CiB9CiAKLS8qIHN0YXRpYyBkYXRhIGZvciBzdG9wX2NwdXMgKi8KLXN0YXRpYyBERUZJTkVfTVVURVgoc3RvcF9jcHVzX211dGV4KTsKLQogc3RhdGljIGJvb2wgcXVldWVfc3RvcF9jcHVzX3dvcmsoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssCiAJCQkJIGNwdV9zdG9wX2ZuX3QgZm4sIHZvaWQgKmFyZywKIAkJCQkgc3RydWN0IGNwdV9zdG9wX2RvbmUgKmRvbmUpCkBAIC0zMzIsNyArMzQ1LDggQEAKIAkgKiBwcmVlbXB0ZWQgYnkgYSBzdG9wcGVyIHdoaWNoIG1pZ2h0IHdhaXQgZm9yIG90aGVyIHN0b3BwZXJzCiAJICogdG8gZW50ZXIgQGZuIHdoaWNoIGNhbiBsZWFkIHRvIGRlYWRsb2NrLgogCSAqLwotCWxnX2dsb2JhbF9sb2NrKCZzdG9wX2NwdXNfbG9jayk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJc3RvcF9jcHVzX2luX3Byb2dyZXNzID0gdHJ1ZTsKIAlmb3JfZWFjaF9jcHUoY3B1LCBjcHVtYXNrKSB7CiAJCXdvcmsgPSAmcGVyX2NwdShjcHVfc3RvcHBlci5zdG9wX3dvcmssIGNwdSk7CiAJCXdvcmstPmZuID0gZm47CkBAIC0zNDEsNyArMzU1LDggQEAKIAkJaWYgKGNwdV9zdG9wX3F1ZXVlX3dvcmsoY3B1LCB3b3JrKSkKIAkJCXF1ZXVlZCA9IHRydWU7CiAJfQotCWxnX2dsb2JhbF91bmxvY2soJnN0b3BfY3B1c19sb2NrKTsKKwlzdG9wX2NwdXNfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogCiAJcmV0dXJuIHF1ZXVlZDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuYwppbmRleCBiNDNkMGIyLi5hMTNiYmRhIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzY3RsLmMKKysrIGIva2VybmVsL3N5c2N0bC5jCkBAIC0yMTQwLDYgKzIxNDAsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkb19wcm9jX2RvdWludHZlY19jb252KGJvb2wgKm5lZ3AsIHVuc2lnbmVkIGxvbmcgKmx2YWxwLAorCQkJCSBpbnQgKnZhbHAsCisJCQkJIGludCB3cml0ZSwgdm9pZCAqZGF0YSkKK3sKKwlpZiAod3JpdGUpIHsKKwkJaWYgKCpuZWdwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCSp2YWxwID0gKmx2YWxwOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCB2YWwgPSAqdmFscDsKKwkJKmx2YWxwID0gKHVuc2lnbmVkIGxvbmcpdmFsOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IGNoYXIgcHJvY193c3BhY2Vfc2VwW10gPSB7ICcgJywgJ1x0JywgJ1xuJyB9OwogCiBzdGF0aWMgaW50IF9fZG9fcHJvY19kb2ludHZlYyh2b2lkICp0YmxfZGF0YSwgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsCkBAIC0yMjU5LDggKzIyNzQsMjcgQEAKIGludCBwcm9jX2RvaW50dmVjKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCSAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7Ci0gICAgcmV0dXJuIGRvX3Byb2NfZG9pbnR2ZWModGFibGUsd3JpdGUsYnVmZmVyLGxlbnAscHBvcywKLQkJICAgIAkgICAgTlVMTCxOVUxMKTsKKwlyZXR1cm4gZG9fcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcywgTlVMTCwgTlVMTCk7Cit9CisKKy8qKgorICogcHJvY19kb3VpbnR2ZWMgLSByZWFkIGEgdmVjdG9yIG9mIHVuc2lnbmVkIGludGVnZXJzCisgKiBAdGFibGU6IHRoZSBzeXNjdGwgdGFibGUKKyAqIEB3cml0ZTogJVRSVUUgaWYgdGhpcyBpcyBhIHdyaXRlIHRvIHRoZSBzeXNjdGwgZmlsZQorICogQGJ1ZmZlcjogdGhlIHVzZXIgYnVmZmVyCisgKiBAbGVucDogdGhlIHNpemUgb2YgdGhlIHVzZXIgYnVmZmVyCisgKiBAcHBvczogZmlsZSBwb3NpdGlvbgorICoKKyAqIFJlYWRzL3dyaXRlcyB1cCB0byB0YWJsZS0+bWF4bGVuL3NpemVvZih1bnNpZ25lZCBpbnQpIHVuc2lnbmVkIGludGVnZXIKKyAqIHZhbHVlcyBmcm9tL3RvIHRoZSB1c2VyIGJ1ZmZlciwgdHJlYXRlZCBhcyBhbiBBU0NJSSBzdHJpbmcuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBwcm9jX2RvdWludHZlYyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQkgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiBkb19wcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zLAorCQkJCWRvX3Byb2NfZG91aW50dmVjX2NvbnYsIE5VTEwpOwogfQogCiAvKgpAQCAtMjg1OCw2ICsyODkyLDEyIEBACiAJcmV0dXJuIC1FTk9TWVM7CiB9CiAKK2ludCBwcm9jX2RvdWludHZlYyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQkgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiAtRU5PU1lTOworfQorCiBpbnQgcHJvY19kb2ludHZlY19taW5tYXgoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewpAQCAtMjkwMyw2ICsyOTQzLDcgQEAKICAqIGV4Y2VwdGlvbiBncmFudGVkIDotKQogICovCiBFWFBPUlRfU1lNQk9MKHByb2NfZG9pbnR2ZWMpOworRVhQT1JUX1NZTUJPTChwcm9jX2RvdWludHZlYyk7CiBFWFBPUlRfU1lNQk9MKHByb2NfZG9pbnR2ZWNfamlmZmllcyk7CiBFWFBPUlRfU1lNQk9MKHByb2NfZG9pbnR2ZWNfbWlubWF4KTsKIEVYUE9SVF9TWU1CT0wocHJvY19kb2ludHZlY191c2VyaHpfamlmZmllcyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwppbmRleCA2YTVhMzEwLi43ZTRmYWQ3IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCisrKyBiL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKQEAgLTYwMCw5ICs2MDAsMTggQEAKIAkJICovCiAJCWlmICghKGNzLT5mbGFncyAmIENMT0NLX1NPVVJDRV9WQUxJRF9GT1JfSFJFUykgJiYgb25lc2hvdCkgewogCQkJLyogT3ZlcnJpZGUgY2xvY2tzb3VyY2UgY2Fubm90IGJlIHVzZWQuICovCi0JCQlwcl93YXJuKCJPdmVycmlkZSBjbG9ja3NvdXJjZSAlcyBpcyBub3QgSFJUIGNvbXBhdGlibGUgLSBjYW5ub3Qgc3dpdGNoIHdoaWxlIGluIEhSVC9OT0haIG1vZGVcbiIsCi0JCQkJY3MtPm5hbWUpOwotCQkJb3ZlcnJpZGVfbmFtZVswXSA9IDA7CisJCQlpZiAoY3MtPmZsYWdzICYgQ0xPQ0tfU09VUkNFX1VOU1RBQkxFKSB7CisJCQkJcHJfd2FybigiT3ZlcnJpZGUgY2xvY2tzb3VyY2UgJXMgaXMgdW5zdGFibGUgYW5kIG5vdCBIUlQgY29tcGF0aWJsZSAtIGNhbm5vdCBzd2l0Y2ggd2hpbGUgaW4gSFJUL05PSFogbW9kZVxuIiwKKwkJCQkJY3MtPm5hbWUpOworCQkJCW92ZXJyaWRlX25hbWVbMF0gPSAwOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFRoZSBvdmVycmlkZSBjYW5ub3QgYmUgY3VycmVudGx5IHZlcmlmaWVkLgorCQkJCSAqIERlZmVycmluZyB0byBsZXQgdGhlIHdhdGNoZG9nIGNoZWNrLgorCQkJCSAqLworCQkJCXByX2luZm8oIk92ZXJyaWRlIGNsb2Nrc291cmNlICVzIGlzIG5vdCBjdXJyZW50bHkgSFJUIGNvbXBhdGlibGUgLSBkZWZlcnJpbmdcbiIsCisJCQkJCWNzLT5uYW1lKTsKKwkJCX0KIAkJfSBlbHNlCiAJCQkvKiBPdmVycmlkZSBjbG9ja3NvdXJjZSBjYW4gYmUgdXNlZC4gKi8KIAkJCWJlc3QgPSBjczsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2hydGltZXIuYyBiL2tlcm5lbC90aW1lL2hydGltZXIuYwppbmRleCA5YmE3YzgyLi5iYjVlYzQyIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9ocnRpbWVyLmMKKysrIGIva2VybmVsL3RpbWUvaHJ0aW1lci5jCkBAIC0zMDcsNyArMzA3LDcgQEAKICAqLwoga3RpbWVfdCBrdGltZV9hZGRfc2FmZShjb25zdCBrdGltZV90IGxocywgY29uc3Qga3RpbWVfdCByaHMpCiB7Ci0Ja3RpbWVfdCByZXMgPSBrdGltZV9hZGQobGhzLCByaHMpOworCWt0aW1lX3QgcmVzID0ga3RpbWVfYWRkX3Vuc2FmZShsaHMsIHJocyk7CiAKIAkvKgogCSAqIFdlIHVzZSBLVElNRV9TRUNfTUFYIGhlcmUsIHRoZSBtYXhpbXVtIHRpbWVvdXQgd2hpY2ggd2UgY2FuCkBAIC03MDMsNyArNzAzLDcgQEAKIHN0YXRpYyBERUNMQVJFX1dPUksoaHJ0aW1lcl93b3JrLCBjbG9ja193YXNfc2V0X3dvcmspOwogCiAvKgotICogQ2FsbGVkIGZyb20gdGltZWtlZXBpbmcgYW5kIHJlc3VtZSBjb2RlIHRvIHJlcHJvZ3JhbW0gdGhlIGhydGltZXIKKyAqIENhbGxlZCBmcm9tIHRpbWVrZWVwaW5nIGFuZCByZXN1bWUgY29kZSB0byByZXByb2dyYW0gdGhlIGhydGltZXIKICAqIGludGVycnVwdCBkZXZpY2Ugb24gYWxsIGNwdXMuCiAgKi8KIHZvaWQgY2xvY2tfd2FzX3NldF9kZWxheWVkKHZvaWQpCkBAIC0xMjQxLDcgKzEyNDEsNyBAQAogCiAJLyoKIAkgKiBOb3RlOiBXZSBjbGVhciB0aGUgcnVubmluZyBzdGF0ZSBhZnRlciBlbnF1ZXVlX2hydGltZXIgYW5kCi0JICogd2UgZG8gbm90IHJlcHJvZ3JhbW0gdGhlIGV2ZW50IGhhcmR3YXJlLiBIYXBwZW5zIGVpdGhlciBpbgorCSAqIHdlIGRvIG5vdCByZXByb2dyYW0gdGhlIGV2ZW50IGhhcmR3YXJlLiBIYXBwZW5zIGVpdGhlciBpbgogCSAqIGhydGltZXJfc3RhcnRfcmFuZ2VfbnMoKSBvciBpbiBocnRpbWVyX2ludGVycnVwdCgpCiAJICoKIAkgKiBOb3RlOiBCZWNhdXNlIHdlIGRyb3BwZWQgdGhlIGNwdV9iYXNlLT5sb2NrIGFib3ZlLApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGljay1zY2hlZC5jIGIva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCmluZGV4IDIwNGZkYzguLjNiY2I2MWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYworKysgYi9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmMKQEAgLTE4NiwxMCArMTg2LDEzIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgYm9vbCBjYW5fc3RvcF9mdWxsX3RpY2soc3RydWN0IHRpY2tfc2NoZWQgKnRzKQorc3RhdGljIGJvb2wgY2FuX3N0b3BfZnVsbF90aWNrKGludCBjcHUsIHN0cnVjdCB0aWNrX3NjaGVkICp0cykKIHsKIAlXQVJOX09OX09OQ0UoIWlycXNfZGlzYWJsZWQoKSk7CiAKKwlpZiAodW5saWtlbHkoIWNwdV9vbmxpbmUoY3B1KSkpCisJCXJldHVybiBmYWxzZTsKKwogCWlmIChjaGVja190aWNrX2RlcGVuZGVuY3koJnRpY2tfZGVwX21hc2spKQogCQlyZXR1cm4gZmFsc2U7CiAKQEAgLTg0Myw3ICs4NDYsNyBAQAogCWlmICghdHMtPnRpY2tfc3RvcHBlZCAmJiB0cy0+bm9oel9tb2RlID09IE5PSFpfTU9ERV9JTkFDVElWRSkKIAkJcmV0dXJuOwogCi0JaWYgKGNhbl9zdG9wX2Z1bGxfdGljayh0cykpCisJaWYgKGNhbl9zdG9wX2Z1bGxfdGljayhjcHUsIHRzKSkKIAkJdGlja19ub2h6X3N0b3Bfc2NoZWRfdGljayh0cywga3RpbWVfZ2V0KCksIGNwdSk7CiAJZWxzZSBpZiAodHMtPnRpY2tfc3RvcHBlZCkKIAkJdGlja19ub2h6X3Jlc3RhcnRfc2NoZWRfdGljayh0cywga3RpbWVfZ2V0KCkpOwpAQCAtOTA4LDEwICs5MTEsMTEgQEAKIAlrdGltZV90IG5vdywgZXhwaXJlczsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCisJbm93ID0gdGlja19ub2h6X3N0YXJ0X2lkbGUodHMpOworCiAJaWYgKGNhbl9zdG9wX2lkbGVfdGljayhjcHUsIHRzKSkgewogCQlpbnQgd2FzX3N0b3BwZWQgPSB0cy0+dGlja19zdG9wcGVkOwogCi0JCW5vdyA9IHRpY2tfbm9oel9zdGFydF9pZGxlKHRzKTsKIAkJdHMtPmlkbGVfY2FsbHMrKzsKIAogCQlleHBpcmVzID0gdGlja19ub2h6X3N0b3Bfc2NoZWRfdGljayh0cywgbm93LCBjcHUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGltZS5jIGIva2VybmVsL3RpbWUvdGltZS5jCmluZGV4IDY2N2I5MzMuLmJkNjJmYjggMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpbWUuYworKysgYi9rZXJuZWwvdGltZS90aW1lLmMKQEAgLTc4MCw3ICs3ODAsNyBAQAogewogCXN0cnVjdCB0aW1lc3BlYzY0IHJlczsKIAotCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjNjQoJnJlcywgbGhzLnR2X3NlYyArIHJocy50dl9zZWMsCisJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWM2NCgmcmVzLCAodGltZXU2NF90KSBsaHMudHZfc2VjICsgcmhzLnR2X3NlYywKIAkJCWxocy50dl9uc2VjICsgcmhzLnR2X25zZWMpOwogCiAJaWYgKHVubGlrZWx5KHJlcy50dl9zZWMgPCBsaHMudHZfc2VjIHx8IHJlcy50dl9zZWMgPCByaHMudHZfc2VjKSkgewpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKaW5kZXggM2I2NTc0Ni4uZTA3ZmIwOSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYworKysgYi9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCkBAIC00MDEsNyArNDAxLDEwIEBACiAJZG8gewogCQlzZXEgPSByYXdfcmVhZF9zZXFjb3VudF9sYXRjaCgmdGtmLT5zZXEpOwogCQl0a3IgPSB0a2YtPmJhc2UgKyAoc2VxICYgMHgwMSk7Ci0JCW5vdyA9IGt0aW1lX3RvX25zKHRrci0+YmFzZSkgKyB0aW1la2VlcGluZ19nZXRfbnModGtyKTsKKwkJbm93ID0ga3RpbWVfdG9fbnModGtyLT5iYXNlKTsKKworCQlub3cgKz0gY2xvY2tzb3VyY2VfZGVsdGEodGtyLT5yZWFkKHRrci0+Y2xvY2spLAorCQkJCQkgdGtyLT5jeWNsZV9sYXN0LCB0a3ItPm1hc2spOwogCX0gd2hpbGUgKHJlYWRfc2VxY291bnRfcmV0cnkoJnRrZi0+c2VxLCBzZXEpKTsKIAogCXJldHVybiBub3c7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1la2VlcGluZ19kZWJ1Zy5jIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmdfZGVidWcuYwppbmRleCBmNmJkNjUyLi5jYTlmYjgwIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1la2VlcGluZ19kZWJ1Zy5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nX2RlYnVnLmMKQEAgLTIzLDcgKzIzLDkgQEAKIAogI2luY2x1ZGUgInRpbWVrZWVwaW5nX2ludGVybmFsLmgiCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2xlZXBfdGltZV9iaW5bMzJdID0gezB9OworI2RlZmluZSBOVU1fQklOUyAzMgorCitzdGF0aWMgdW5zaWduZWQgaW50IHNsZWVwX3RpbWVfYmluW05VTV9CSU5TXSA9IHswfTsKIAogc3RhdGljIGludCB0a19kZWJ1Z19zaG93X3NsZWVwX3RpbWUoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpkYXRhKQogewpAQCAtNjksNiArNzEsMTEgQEAKIAogdm9pZCB0a19kZWJ1Z19hY2NvdW50X3NsZWVwX3RpbWUoc3RydWN0IHRpbWVzcGVjNjQgKnQpCiB7Ci0Jc2xlZXBfdGltZV9iaW5bZmxzKHQtPnR2X3NlYyldKys7CisJLyogQ2FwIGJpbiBpbmRleCBzbyB3ZSBkb24ndCBvdmVyZmxvdyB0aGUgYXJyYXkgKi8KKwlpbnQgYmluID0gbWluKGZscyh0LT50dl9zZWMpLCBOVU1fQklOUy0xKTsKKworCXNsZWVwX3RpbWVfYmluW2Jpbl0rKzsKKwlwcl9pbmZvKCJTdXNwZW5kZWQgZm9yICVsbGQuJTAzbHUgc2Vjb25kc1xuIiwgKHM2NCl0LT50dl9zZWMsCisJCQl0LT50dl9uc2VjIC8gTlNFQ19QRVJfTVNFQyk7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90b3J0dXJlLmMgYi9rZXJuZWwvdG9ydHVyZS5jCmluZGV4IDc1OTYxYjMuLjBkODg3ZWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90b3J0dXJlLmMKKysrIGIva2VybmVsL3RvcnR1cmUuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHJhY2VfY2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxsaW51eC90b3J0dXJlLmg+CiAKQEAgLTQ0Niw5ICs0NDcsOCBAQAogICogVmFyaWFibGVzIGZvciBhdXRvLXNodXRkb3duLiAgVGhpcyBhbGxvd3MgImxpZ2h0cyBvdXQiIHRvcnR1cmUgcnVucwogICogdG8gYmUgZnVsbHkgc2NyaXB0ZWQuCiAgKi8KLXN0YXRpYyBpbnQgc2h1dGRvd25fc2VjczsJCS8qIGRlc2lyZWQgdGVzdCBkdXJhdGlvbiBpbiBzZWNvbmRzLiAqLwogc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc2h1dGRvd25fdGFzazsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNodXRkb3duX3RpbWU7CS8qIGppZmZpZXMgdG8gc3lzdGVtIHNodXRkb3duLiAqLworc3RhdGljIGt0aW1lX3Qgc2h1dGRvd25fdGltZTsJCS8qIHRpbWUgdG8gc3lzdGVtIHNodXRkb3duLiAqLwogc3RhdGljIHZvaWQgKCp0b3J0dXJlX3NodXRkb3duX2hvb2spKHZvaWQpOwogCiAvKgpAQCAtNDcxLDIwICs0NzEsMjAgQEAKICAqLwogc3RhdGljIGludCB0b3J0dXJlX3NodXRkb3duKHZvaWQgKmFyZykKIHsKLQlsb25nIGRlbHRhOwotCXVuc2lnbmVkIGxvbmcgamlmZmllc19zbmFwOworCWt0aW1lX3Qga3RpbWVfc25hcDsKIAogCVZFUkJPU0VfVE9ST1VUX1NUUklORygidG9ydHVyZV9zaHV0ZG93biB0YXNrIHN0YXJ0ZWQiKTsKLQlqaWZmaWVzX3NuYXAgPSBqaWZmaWVzOwotCXdoaWxlIChVTE9OR19DTVBfTFQoamlmZmllc19zbmFwLCBzaHV0ZG93bl90aW1lKSAmJgorCWt0aW1lX3NuYXAgPSBrdGltZV9nZXQoKTsKKwl3aGlsZSAoa3RpbWVfYmVmb3JlKGt0aW1lX3NuYXAsIHNodXRkb3duX3RpbWUpICYmCiAJICAgICAgICF0b3J0dXJlX211c3Rfc3RvcCgpKSB7Ci0JCWRlbHRhID0gc2h1dGRvd25fdGltZSAtIGppZmZpZXNfc25hcDsKIAkJaWYgKHZlcmJvc2UpCiAJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRwotCQkJCSAidG9ydHVyZV9zaHV0ZG93biB0YXNrOiAlbHUgamlmZmllcyByZW1haW5pbmdcbiIsCi0JCQkJIHRvcnR1cmVfdHlwZSwgZGVsdGEpOwotCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoZGVsdGEpOwotCQlqaWZmaWVzX3NuYXAgPSBqaWZmaWVzOworCQkJCSAidG9ydHVyZV9zaHV0ZG93biB0YXNrOiAlbGx1IG1zIHJlbWFpbmluZ1xuIiwKKwkJCQkgdG9ydHVyZV90eXBlLAorCQkJCSBrdGltZV9tc19kZWx0YShzaHV0ZG93bl90aW1lLCBrdGltZV9zbmFwKSk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX2hydGltZW91dCgmc2h1dGRvd25fdGltZSwgSFJUSU1FUl9NT0RFX0FCUyk7CisJCWt0aW1lX3NuYXAgPSBrdGltZV9nZXQoKTsKIAl9CiAJaWYgKHRvcnR1cmVfbXVzdF9zdG9wKCkpIHsKIAkJdG9ydHVyZV9rdGhyZWFkX3N0b3BwaW5nKCJ0b3J0dXJlX3NodXRkb3duIik7CkBAIC01MTEsMTAgKzUxMSw5IEBACiB7CiAJaW50IHJldCA9IDA7CiAKLQlzaHV0ZG93bl9zZWNzID0gc3NlY3M7CiAJdG9ydHVyZV9zaHV0ZG93bl9ob29rID0gY2xlYW51cDsKLQlpZiAoc2h1dGRvd25fc2VjcyA+IDApIHsKLQkJc2h1dGRvd25fdGltZSA9IGppZmZpZXMgKyBzaHV0ZG93bl9zZWNzICogSFo7CisJaWYgKHNzZWNzID4gMCkgeworCQlzaHV0ZG93bl90aW1lID0ga3RpbWVfYWRkKGt0aW1lX2dldCgpLCBrdGltZV9zZXQoc3NlY3MsIDApKTsKIAkJcmV0ID0gdG9ydHVyZV9jcmVhdGVfa3RocmVhZCh0b3J0dXJlX3NodXRkb3duLCBOVUxMLAogCQkJCQkgICAgIHNodXRkb3duX3Rhc2spOwogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9LY29uZmlnIGIva2VybmVsL3RyYWNlL0tjb25maWcKaW5kZXggZjRiODZlOC4uYmEzMzI2NyAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL0tjb25maWcKKysrIGIva2VybmVsL3RyYWNlL0tjb25maWcKQEAgLTI0LDExICsyNCw2IEBACiAJaGVscAogCSAgU2VlIERvY3VtZW50YXRpb24vdHJhY2UvZnRyYWNlLWRlc2lnbi50eHQKIAotY29uZmlnIEhBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVAotCWJvb2wKLQloZWxwCi0JICBTZWUgRG9jdW1lbnRhdGlvbi90cmFjZS9mdHJhY2UtZGVzaWduLnR4dAotCiBjb25maWcgSEFWRV9EWU5BTUlDX0ZUUkFDRQogCWJvb2wKIAloZWxwCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvYmxrdHJhY2UuYyBiL2tlcm5lbC90cmFjZS9ibGt0cmFjZS5jCmluZGV4IDc1OThlNmMuLmRiYWZjNWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS9ibGt0cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS9ibGt0cmFjZS5jCkBAIC0yMjMsNyArMjIzLDcgQEAKIAl3aGF0IHw9IE1BU0tfVENfQklUKG9wX2ZsYWdzLCBNRVRBKTsKIAl3aGF0IHw9IE1BU0tfVENfQklUKG9wX2ZsYWdzLCBQUkVGTFVTSCk7CiAJd2hhdCB8PSBNQVNLX1RDX0JJVChvcF9mbGFncywgRlVBKTsKLQlpZiAob3AgPT0gUkVRX09QX0RJU0NBUkQpCisJaWYgKG9wID09IFJFUV9PUF9ESVNDQVJEIHx8IG9wID09IFJFUV9PUF9TRUNVUkVfRVJBU0UpCiAJCXdoYXQgfD0gQkxLX1RDX0FDVChCTEtfVENfRElTQ0FSRCk7CiAJaWYgKG9wID09IFJFUV9PUF9GTFVTSCkKIAkJd2hhdCB8PSBCTEtfVENfQUNUKEJMS19UQ19GTFVTSCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvYnBmX3RyYWNlLmMgYi9rZXJuZWwvdHJhY2UvYnBmX3RyYWNlLmMKaW5kZXggYjIwNDM4Zi4uNWRjYjk5MiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL2JwZl90cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS9icGZfdHJhY2UuYwpAQCAtMSw0ICsxLDUgQEAKIC8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IFBMVU1ncmlkLCBodHRwOi8vcGx1bWdyaWQuY29tCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgRmFjZWJvb2sKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCkBAIC04LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgorI2luY2x1ZGUgPGxpbnV4L2JwZl9wZXJmX2V2ZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CkBAIC01OSwxMSArNjEsOSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodHJhY2VfY2FsbF9icGYpOwogCi1zdGF0aWMgdTY0IGJwZl9wcm9iZV9yZWFkKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMyhicGZfcHJvYmVfcmVhZCwgdm9pZCAqLCBkc3QsIHUzMiwgc2l6ZSwgY29uc3Qgdm9pZCAqLCB1bnNhZmVfcHRyKQogewotCXZvaWQgKmRzdCA9ICh2b2lkICopIChsb25nKSByMTsKLQlpbnQgcmV0LCBzaXplID0gKGludCkgcjI7Ci0Jdm9pZCAqdW5zYWZlX3B0ciA9ICh2b2lkICopIChsb25nKSByMzsKKwlpbnQgcmV0OwogCiAJcmV0ID0gcHJvYmVfa2VybmVsX3JlYWQoZHN0LCB1bnNhZmVfcHRyLCBzaXplKTsKIAlpZiAodW5saWtlbHkocmV0IDwgMCkpCkBAIC04MSwxMiArODEsOSBAQAogCS5hcmczX3R5cGUJPSBBUkdfQU5ZVEhJTkcsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9wcm9iZV93cml0ZV91c2VyKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMyhicGZfcHJvYmVfd3JpdGVfdXNlciwgdm9pZCAqLCB1bnNhZmVfcHRyLCBjb25zdCB2b2lkICosIHNyYywKKwkgICB1MzIsIHNpemUpCiB7Ci0Jdm9pZCAqdW5zYWZlX3B0ciA9ICh2b2lkICopIChsb25nKSByMTsKLQl2b2lkICpzcmMgPSAodm9pZCAqKSAobG9uZykgcjI7Ci0JaW50IHNpemUgPSAoaW50KSByMzsKLQogCS8qCiAJICogRW5zdXJlIHdlJ3JlIGluIHVzZXIgY29udGV4dCB3aGljaCBpcyBzYWZlIGZvciB0aGUgaGVscGVyIHRvCiAJICogcnVuLiBUaGlzIGhlbHBlciBoYXMgbm8gYnVzaW5lc3MgaW4gYSBrdGhyZWFkLgpAQCAtMTI4LDkgKzEyNSw5IEBACiAgKiBsaW1pdGVkIHRyYWNlX3ByaW50aygpCiAgKiBvbmx5ICVkICV1ICV4ICVsZCAlbHUgJWx4ICVsbGQgJWxsdSAlbGx4ICVwICVzIGNvbnZlcnNpb24gc3BlY2lmaWVycyBhbGxvd2VkCiAgKi8KLXN0YXRpYyB1NjQgYnBmX3RyYWNlX3ByaW50ayh1NjQgcjEsIHU2NCBmbXRfc2l6ZSwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzUoYnBmX3RyYWNlX3ByaW50aywgY2hhciAqLCBmbXQsIHUzMiwgZm10X3NpemUsIHU2NCwgYXJnMSwKKwkgICB1NjQsIGFyZzIsIHU2NCwgYXJnMykKIHsKLQljaGFyICpmbXQgPSAoY2hhciAqKSAobG9uZykgcjE7CiAJYm9vbCBzdHJfc2VlbiA9IGZhbHNlOwogCWludCBtb2RbM10gPSB7fTsKIAlpbnQgZm10X2NudCA9IDA7CkBAIC0xNzYsMTYgKzE3MywxNiBAQAogCiAJCQkJc3dpdGNoIChmbXRfY250KSB7CiAJCQkJY2FzZSAxOgotCQkJCQl1bnNhZmVfYWRkciA9IHIzOwotCQkJCQlyMyA9IChsb25nKSBidWY7CisJCQkJCXVuc2FmZV9hZGRyID0gYXJnMTsKKwkJCQkJYXJnMSA9IChsb25nKSBidWY7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMjoKLQkJCQkJdW5zYWZlX2FkZHIgPSByNDsKLQkJCQkJcjQgPSAobG9uZykgYnVmOworCQkJCQl1bnNhZmVfYWRkciA9IGFyZzI7CisJCQkJCWFyZzIgPSAobG9uZykgYnVmOwogCQkJCQlicmVhazsKIAkJCQljYXNlIDM6Ci0JCQkJCXVuc2FmZV9hZGRyID0gcjU7Ci0JCQkJCXI1ID0gKGxvbmcpIGJ1ZjsKKwkJCQkJdW5zYWZlX2FkZHIgPSBhcmczOworCQkJCQlhcmczID0gKGxvbmcpIGJ1ZjsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCWJ1ZlswXSA9IDA7CkBAIC0yMDcsOSArMjA0LDkgQEAKIAl9CiAKIAlyZXR1cm4gX190cmFjZV9wcmludGsoMS8qIGZha2UgaXAgd2lsbCBub3QgYmUgcHJpbnRlZCAqLywgZm10LAotCQkJICAgICAgbW9kWzBdID09IDIgPyByMyA6IG1vZFswXSA9PSAxID8gKGxvbmcpIHIzIDogKHUzMikgcjMsCi0JCQkgICAgICBtb2RbMV0gPT0gMiA/IHI0IDogbW9kWzFdID09IDEgPyAobG9uZykgcjQgOiAodTMyKSByNCwKLQkJCSAgICAgIG1vZFsyXSA9PSAyID8gcjUgOiBtb2RbMl0gPT0gMSA/IChsb25nKSByNSA6ICh1MzIpIHI1KTsKKwkJCSAgICAgIG1vZFswXSA9PSAyID8gYXJnMSA6IG1vZFswXSA9PSAxID8gKGxvbmcpIGFyZzEgOiAodTMyKSBhcmcxLAorCQkJICAgICAgbW9kWzFdID09IDIgPyBhcmcyIDogbW9kWzFdID09IDEgPyAobG9uZykgYXJnMiA6ICh1MzIpIGFyZzIsCisJCQkgICAgICBtb2RbMl0gPT0gMiA/IGFyZzMgOiBtb2RbMl0gPT0gMSA/IChsb25nKSBhcmczIDogKHUzMikgYXJnMyk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX3RyYWNlX3ByaW50a19wcm90byA9IHsKQEAgLTIzMSw5ICsyMjgsOCBAQAogCXJldHVybiAmYnBmX3RyYWNlX3ByaW50a19wcm90bzsKIH0KIAotc3RhdGljIHU2NCBicGZfcGVyZl9ldmVudF9yZWFkKHU2NCByMSwgdTY0IGZsYWdzLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMihicGZfcGVyZl9ldmVudF9yZWFkLCBzdHJ1Y3QgYnBmX21hcCAqLCBtYXAsIHU2NCwgZmxhZ3MpCiB7Ci0Jc3RydWN0IGJwZl9tYXAgKm1hcCA9IChzdHJ1Y3QgYnBmX21hcCAqKSAodW5zaWduZWQgbG9uZykgcjE7CiAJc3RydWN0IGJwZl9hcnJheSAqYXJyYXkgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2FycmF5LCBtYXApOwogCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJdTY0IGluZGV4ID0gZmxhZ3MgJiBCUEZfRl9JTkRFWF9NQVNLOwpAQCAtMzEwLDExICszMDYsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdTY0IGJwZl9wZXJmX2V2ZW50X291dHB1dCh1NjQgcjEsIHU2NCByMiwgdTY0IGZsYWdzLCB1NjQgcjQsIHU2NCBzaXplKQorQlBGX0NBTExfNShicGZfcGVyZl9ldmVudF9vdXRwdXQsIHN0cnVjdCBwdF9yZWdzICosIHJlZ3MsIHN0cnVjdCBicGZfbWFwICosIG1hcCwKKwkgICB1NjQsIGZsYWdzLCB2b2lkICosIGRhdGEsIHU2NCwgc2l6ZSkKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKShsb25nKSByMTsKLQlzdHJ1Y3QgYnBmX21hcCAqbWFwICA9IChzdHJ1Y3QgYnBmX21hcCAqKShsb25nKSByMjsKLQl2b2lkICpkYXRhID0gKHZvaWQgKikobG9uZykgcjQ7CiAJc3RydWN0IHBlcmZfcmF3X3JlY29yZCByYXcgPSB7CiAJCS5mcmFnID0gewogCQkJLnNpemUgPSBzaXplLApAQCAtMzY1LDcgKzM1OSw3IEBACiAJcmV0dXJuIF9fYnBmX3BlcmZfZXZlbnRfb3V0cHV0KHJlZ3MsIG1hcCwgZmxhZ3MsICZyYXcpOwogfQogCi1zdGF0aWMgdTY0IGJwZl9nZXRfY3VycmVudF90YXNrKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMChicGZfZ2V0X2N1cnJlbnRfdGFzaykKIHsKIAlyZXR1cm4gKGxvbmcpIGN1cnJlbnQ7CiB9CkBAIC0zNzYsNiArMzcwLDMxIEBACiAJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCiB9OwogCitCUEZfQ0FMTF8yKGJwZl9jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwLCBzdHJ1Y3QgYnBmX21hcCAqLCBtYXAsIHUzMiwgaWR4KQoreworCXN0cnVjdCBicGZfYXJyYXkgKmFycmF5ID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9hcnJheSwgbWFwKTsKKwlzdHJ1Y3QgY2dyb3VwICpjZ3JwOworCisJaWYgKHVubGlrZWx5KGluX2ludGVycnVwdCgpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHVubGlrZWx5KGlkeCA+PSBhcnJheS0+bWFwLm1heF9lbnRyaWVzKSkKKwkJcmV0dXJuIC1FMkJJRzsKKworCWNncnAgPSBSRUFEX09OQ0UoYXJyYXktPnB0cnNbaWR4XSk7CisJaWYgKHVubGlrZWx5KCFjZ3JwKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlyZXR1cm4gdGFza191bmRlcl9jZ3JvdXBfaGllcmFyY2h5KGN1cnJlbnQsIGNncnApOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwX3Byb3RvID0geworCS5mdW5jICAgICAgICAgICA9IGJwZl9jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwLAorCS5ncGxfb25seSAgICAgICA9IGZhbHNlLAorCS5yZXRfdHlwZSAgICAgICA9IFJFVF9JTlRFR0VSLAorCS5hcmcxX3R5cGUgICAgICA9IEFSR19DT05TVF9NQVBfUFRSLAorCS5hcmcyX3R5cGUgICAgICA9IEFSR19BTllUSElORywKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gKnRyYWNpbmdfZnVuY19wcm90byhlbnVtIGJwZl9mdW5jX2lkIGZ1bmNfaWQpCiB7CiAJc3dpdGNoIChmdW5jX2lkKSB7CkBAIC00MDcsNiArNDI2LDEwIEBACiAJCXJldHVybiAmYnBmX3BlcmZfZXZlbnRfcmVhZF9wcm90bzsKIAljYXNlIEJQRl9GVU5DX3Byb2JlX3dyaXRlX3VzZXI6CiAJCXJldHVybiBicGZfZ2V0X3Byb2JlX3dyaXRlX3Byb3RvKCk7CisJY2FzZSBCUEZfRlVOQ19jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwOgorCQlyZXR1cm4gJmJwZl9jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwX3Byb3RvOworCWNhc2UgQlBGX0ZVTkNfZ2V0X3ByYW5kb21fdTMyOgorCQlyZXR1cm4gJmJwZl9nZXRfcHJhbmRvbV91MzJfcHJvdG87CiAJZGVmYXVsdDoKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtNDQ3LDE2ICs0NzAsMTcgQEAKIAkudHlwZQk9IEJQRl9QUk9HX1RZUEVfS1BST0JFLAogfTsKIAotc3RhdGljIHU2NCBicGZfcGVyZl9ldmVudF9vdXRwdXRfdHAodTY0IHIxLCB1NjQgcjIsIHU2NCBpbmRleCwgdTY0IHI0LCB1NjQgc2l6ZSkKK0JQRl9DQUxMXzUoYnBmX3BlcmZfZXZlbnRfb3V0cHV0X3RwLCB2b2lkICosIHRwX2J1ZmYsIHN0cnVjdCBicGZfbWFwICosIG1hcCwKKwkgICB1NjQsIGZsYWdzLCB2b2lkICosIGRhdGEsIHU2NCwgc2l6ZSkKIHsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9ICooc3RydWN0IHB0X3JlZ3MgKiopdHBfYnVmZjsKKwogCS8qCiAJICogcjEgcG9pbnRzIHRvIHBlcmYgdHJhY2Vwb2ludCBidWZmZXIgd2hlcmUgZmlyc3QgOCBieXRlcyBhcmUgaGlkZGVuCiAJICogZnJvbSBicGYgcHJvZ3JhbSBhbmQgY29udGFpbiBhIHBvaW50ZXIgdG8gJ3N0cnVjdCBwdF9yZWdzJy4gRmV0Y2ggaXQKLQkgKiBmcm9tIHRoZXJlIGFuZCBjYWxsIHRoZSBzYW1lIGJwZl9wZXJmX2V2ZW50X291dHB1dCgpIGhlbHBlcgorCSAqIGZyb20gdGhlcmUgYW5kIGNhbGwgdGhlIHNhbWUgYnBmX3BlcmZfZXZlbnRfb3V0cHV0KCkgaGVscGVyIGlubGluZS4KIAkgKi8KLQl1NjQgY3R4ID0gKihsb25nICopKHVpbnRwdHJfdClyMTsKLQotCXJldHVybiBicGZfcGVyZl9ldmVudF9vdXRwdXQoY3R4LCByMiwgaW5kZXgsIHI0LCBzaXplKTsKKwlyZXR1cm4gX19fX2JwZl9wZXJmX2V2ZW50X291dHB1dChyZWdzLCBtYXAsIGZsYWdzLCBkYXRhLCBzaXplKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfcGVyZl9ldmVudF9vdXRwdXRfcHJvdG9fdHAgPSB7CkBAIC00NzAsMTEgKzQ5NCwxOCBAQAogCS5hcmc1X3R5cGUJPSBBUkdfQ09OU1RfU1RBQ0tfU0laRSwKIH07CiAKLXN0YXRpYyB1NjQgYnBmX2dldF9zdGFja2lkX3RwKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMyhicGZfZ2V0X3N0YWNraWRfdHAsIHZvaWQgKiwgdHBfYnVmZiwgc3RydWN0IGJwZl9tYXAgKiwgbWFwLAorCSAgIHU2NCwgZmxhZ3MpCiB7Ci0JdTY0IGN0eCA9ICoobG9uZyAqKSh1aW50cHRyX3QpcjE7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSAqKHN0cnVjdCBwdF9yZWdzICoqKXRwX2J1ZmY7CiAKLQlyZXR1cm4gYnBmX2dldF9zdGFja2lkKGN0eCwgcjIsIHIzLCByNCwgcjUpOworCS8qCisJICogU2FtZSBjb21tZW50IGFzIGluIGJwZl9wZXJmX2V2ZW50X291dHB1dF90cCgpLCBvbmx5IHRoYXQgdGhpcyB0aW1lCisJICogdGhlIG90aGVyIGhlbHBlcidzIGZ1bmN0aW9uIGJvZHkgY2Fubm90IGJlIGlubGluZWQgZHVlIHRvIGJlaW5nCisJICogZXh0ZXJuYWwsIHRodXMgd2UgbmVlZCB0byBjYWxsIHJhdyBoZWxwZXIgZnVuY3Rpb24uCisJICovCisJcmV0dXJuIGJwZl9nZXRfc3RhY2tpZCgodW5zaWduZWQgbG9uZykgcmVncywgKHVuc2lnbmVkIGxvbmcpIG1hcCwKKwkJCSAgICAgICBmbGFncywgMCwgMCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX2dldF9zdGFja2lkX3Byb3RvX3RwID0gewpAQCAtNTIwLDEwICs1NTEsNjkgQEAKIAkudHlwZQk9IEJQRl9QUk9HX1RZUEVfVFJBQ0VQT0lOVCwKIH07CiAKK3N0YXRpYyBib29sIHBlX3Byb2dfaXNfdmFsaWRfYWNjZXNzKGludCBvZmYsIGludCBzaXplLCBlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlLAorCQkJCSAgICBlbnVtIGJwZl9yZWdfdHlwZSAqcmVnX3R5cGUpCit7CisJaWYgKG9mZiA8IDAgfHwgb2ZmID49IHNpemVvZihzdHJ1Y3QgYnBmX3BlcmZfZXZlbnRfZGF0YSkpCisJCXJldHVybiBmYWxzZTsKKwlpZiAodHlwZSAhPSBCUEZfUkVBRCkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChvZmYgJSBzaXplICE9IDApCisJCXJldHVybiBmYWxzZTsKKwlpZiAob2ZmID09IG9mZnNldG9mKHN0cnVjdCBicGZfcGVyZl9ldmVudF9kYXRhLCBzYW1wbGVfcGVyaW9kKSkgeworCQlpZiAoc2l6ZSAhPSBzaXplb2YodTY0KSkKKwkJCXJldHVybiBmYWxzZTsKKwl9IGVsc2UgeworCQlpZiAoc2l6ZSAhPSBzaXplb2YobG9uZykpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdTMyIHBlX3Byb2dfY29udmVydF9jdHhfYWNjZXNzKGVudW0gYnBmX2FjY2Vzc190eXBlIHR5cGUsIGludCBkc3RfcmVnLAorCQkJCSAgICAgIGludCBzcmNfcmVnLCBpbnQgY3R4X29mZiwKKwkJCQkgICAgICBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmLAorCQkJCSAgICAgIHN0cnVjdCBicGZfcHJvZyAqcHJvZykKK3sKKwlzdHJ1Y3QgYnBmX2luc24gKmluc24gPSBpbnNuX2J1ZjsKKworCXN3aXRjaCAoY3R4X29mZikgeworCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IGJwZl9wZXJmX2V2ZW50X2RhdGEsIHNhbXBsZV9wZXJpb2QpOgorCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhLCBwZXJpb2QpICE9IHNpemVvZih1NjQpKTsKKworCQkqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0ZJRUxEX1NJWkVPRihzdHJ1Y3QgYnBmX3BlcmZfZXZlbnRfZGF0YV9rZXJuLAorCQkJCQkJICAgICAgIGRhdGEpLCBkc3RfcmVnLCBzcmNfcmVnLAorCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBicGZfcGVyZl9ldmVudF9kYXRhX2tlcm4sIGRhdGEpKTsKKwkJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9EVywgZHN0X3JlZywgZHN0X3JlZywKKwkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSwgcGVyaW9kKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfRklFTERfU0laRU9GKHN0cnVjdCBicGZfcGVyZl9ldmVudF9kYXRhX2tlcm4sCisJCQkJCQkgICAgICAgcmVncyksIGRzdF9yZWcsIHNyY19yZWcsCisJCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IGJwZl9wZXJmX2V2ZW50X2RhdGFfa2VybiwgcmVncykpOworCQkqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX1NJWkVPRihsb25nKSwgZHN0X3JlZywgZHN0X3JlZywgY3R4X29mZik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBpbnNuIC0gaW5zbl9idWY7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX29wcyBwZXJmX2V2ZW50X3Byb2dfb3BzID0geworCS5nZXRfZnVuY19wcm90bwkJPSB0cF9wcm9nX2Z1bmNfcHJvdG8sCisJLmlzX3ZhbGlkX2FjY2Vzcwk9IHBlX3Byb2dfaXNfdmFsaWRfYWNjZXNzLAorCS5jb252ZXJ0X2N0eF9hY2Nlc3MJPSBwZV9wcm9nX2NvbnZlcnRfY3R4X2FjY2VzcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYnBmX3Byb2dfdHlwZV9saXN0IHBlcmZfZXZlbnRfdGwgPSB7CisJLm9wcwk9ICZwZXJmX2V2ZW50X3Byb2dfb3BzLAorCS50eXBlCT0gQlBGX1BST0dfVFlQRV9QRVJGX0VWRU5ULAorfTsKKwogc3RhdGljIGludCBfX2luaXQgcmVnaXN0ZXJfa3Byb2JlX3Byb2dfb3BzKHZvaWQpCiB7CiAJYnBmX3JlZ2lzdGVyX3Byb2dfdHlwZSgma3Byb2JlX3RsKTsKIAlicGZfcmVnaXN0ZXJfcHJvZ190eXBlKCZ0cmFjZXBvaW50X3RsKTsKKwlicGZfcmVnaXN0ZXJfcHJvZ190eXBlKCZwZXJmX2V2ZW50X3RsKTsKIAlyZXR1cm4gMDsKIH0KIGxhdGVfaW5pdGNhbGwocmVnaXN0ZXJfa3Byb2JlX3Byb2dfb3BzKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKaW5kZXggZGFkZTRjOS4uMzc4MjRkOSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKQEAgLTQxMjMsNiArNDEyMywzMCBAQAogCSJcdFx0XHQgIHRyYWNlc1xuIgogI2VuZGlmCiAjZW5kaWYgLyogQ09ORklHX1NUQUNLX1RSQUNFUiAqLworI2lmZGVmIENPTkZJR19LUFJPQkVfRVZFTlQKKwkiICBrcHJvYmVfZXZlbnRzXHRcdC0gQWRkL3JlbW92ZS9zaG93IHRoZSBrZXJuZWwgZHluYW1pYyBldmVudHNcbiIKKwkiXHRcdFx0ICBXcml0ZSBpbnRvIHRoaXMgZmlsZSB0byBkZWZpbmUvdW5kZWZpbmUgbmV3IHRyYWNlIGV2ZW50cy5cbiIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19VUFJPQkVfRVZFTlQKKwkiICB1cHJvYmVfZXZlbnRzXHRcdC0gQWRkL3JlbW92ZS9zaG93IHRoZSB1c2Vyc3BhY2UgZHluYW1pYyBldmVudHNcbiIKKwkiXHRcdFx0ICBXcml0ZSBpbnRvIHRoaXMgZmlsZSB0byBkZWZpbmUvdW5kZWZpbmUgbmV3IHRyYWNlIGV2ZW50cy5cbiIKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0tQUk9CRV9FVkVOVCkgfHwgZGVmaW5lZChDT05GSUdfVVBST0JFX0VWRU5UKQorCSJcdCAgYWNjZXB0czogZXZlbnQtZGVmaW5pdGlvbnMgKG9uZSBkZWZpbml0aW9uIHBlciBsaW5lKVxuIgorCSJcdCAgIEZvcm1hdDogcHxyWzpbPGdyb3VwPi9dPGV2ZW50Pl0gPHBsYWNlPiBbPGFyZ3M+XVxuIgorCSJcdCAgICAgICAgICAgLTpbPGdyb3VwPi9dPGV2ZW50PlxuIgorI2lmZGVmIENPTkZJR19LUFJPQkVfRVZFTlQKKwkiXHQgICAgcGxhY2U6IFs8bW9kdWxlPjpdPHN5bWJvbD5bKzxvZmZzZXQ+XXw8bWVtYWRkcj5cbiIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19VUFJPQkVfRVZFTlQKKwkiXHQgICAgcGxhY2U6IDxwYXRoPjo8b2Zmc2V0PlxuIgorI2VuZGlmCisJIlx0ICAgICBhcmdzOiA8bmFtZT49ZmV0Y2hhcmdbOnR5cGVdXG4iCisJIlx0IGZldGNoYXJnOiAlPHJlZ2lzdGVyPiwgQDxhZGRyZXNzPiwgQDxzeW1ib2w+Wyt8LTxvZmZzZXQ+XSxcbiIKKwkiXHQgICAgICAgICAgICRzdGFjazxpbmRleD4sICRzdGFjaywgJHJldHZhbCwgJGNvbW1cbiIKKwkiXHQgICAgIHR5cGU6IHM4LzE2LzMyLzY0LCB1OC8xNi8zMi82NCwgeDgvMTYvMzIvNjQsIHN0cmluZyxcbiIKKwkiXHQgICAgICAgICAgIGI8Yml0LXdpZHRoPkA8Yml0LW9mZnNldD4vPGNvbnRhaW5lci1zaXplPlxuIgorI2VuZGlmCiAJIiAgZXZlbnRzL1x0XHQtIERpcmVjdG9yeSBjb250YWluaW5nIGFsbCB0cmFjZSBldmVudCBzdWJzeXN0ZW1zOlxuIgogCSIgICAgICBlbmFibGVcdFx0LSBXcml0ZSAwLzEgdG8gZW5hYmxlL2Rpc2FibGUgdHJhY2luZyBvZiBhbGwgZXZlbnRzXG4iCiAJIiAgZXZlbnRzLzxzeXN0ZW0+L1x0LSBEaXJlY3RvcnkgY29udGFpbmluZyBhbGwgdHJhY2UgZXZlbnRzIGZvciA8c3lzdGVtPjpcbiIKQEAgLTUxMjQsMTkgKzUxNDgsMjAgQEAKIAlzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJc3NpemVfdCBzcmV0OwogCi0JLyogcmV0dXJuIGFueSBsZWZ0b3ZlciBkYXRhICovCi0Jc3JldCA9IHRyYWNlX3NlcV90b191c2VyKCZpdGVyLT5zZXEsIHVidWYsIGNudCk7Ci0JaWYgKHNyZXQgIT0gLUVCVVNZKQotCQlyZXR1cm4gc3JldDsKLQotCXRyYWNlX3NlcV9pbml0KCZpdGVyLT5zZXEpOwotCiAJLyoKIAkgKiBBdm9pZCBtb3JlIHRoYW4gb25lIGNvbnN1bWVyIG9uIGEgc2luZ2xlIGZpbGUgZGVzY3JpcHRvcgogCSAqIFRoaXMgaXMganVzdCBhIG1hdHRlciBvZiB0cmFjZXMgY29oZXJlbmN5LCB0aGUgcmluZyBidWZmZXIgaXRzZWxmCiAJICogaXMgcHJvdGVjdGVkLgogCSAqLwogCW11dGV4X2xvY2soJml0ZXItPm11dGV4KTsKKworCS8qIHJldHVybiBhbnkgbGVmdG92ZXIgZGF0YSAqLworCXNyZXQgPSB0cmFjZV9zZXFfdG9fdXNlcigmaXRlci0+c2VxLCB1YnVmLCBjbnQpOworCWlmIChzcmV0ICE9IC1FQlVTWSkKKwkJZ290byBvdXQ7CisKKwl0cmFjZV9zZXFfaW5pdCgmaXRlci0+c2VxKTsKKwogCWlmIChpdGVyLT50cmFjZS0+cmVhZCkgewogCQlzcmV0ID0gaXRlci0+dHJhY2UtPnJlYWQoaXRlciwgZmlscCwgdWJ1ZiwgY250LCBwcG9zKTsKIAkJaWYgKHNyZXQpCkBAIC02MTYzLDkgKzYxODgsNiBAQAogCQlyZXR1cm4gLUVCVVNZOwogI2VuZGlmCiAKLQlpZiAoc3BsaWNlX2dyb3dfc3BkKHBpcGUsICZzcGQpKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCWlmICgqcHBvcyAmIChQQUdFX1NJWkUgLSAxKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTYxNzUsNiArNjE5Nyw5IEBACiAJCWxlbiAmPSBQQUdFX01BU0s7CiAJfQogCisJaWYgKHNwbGljZV9ncm93X3NwZChwaXBlLCAmc3BkKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKICBhZ2FpbjoKIAl0cmFjZV9hY2Nlc3NfbG9jayhpdGVyLT5jcHVfZmlsZSk7CiAJZW50cmllcyA9IHJpbmdfYnVmZmVyX2VudHJpZXNfY3B1KGl0ZXItPnRyYWNlX2J1ZmZlci0+YnVmZmVyLCBpdGVyLT5jcHVfZmlsZSk7CkBAIC02MjMyLDE5ICs2MjU3LDIxIEBACiAJLyogZGlkIHdlIHJlYWQgYW55dGhpbmc/ICovCiAJaWYgKCFzcGQubnJfcGFnZXMpIHsKIAkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIG91dDsKIAorCQlyZXQgPSAtRUFHQUlOOwogCQlpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fCAoZmxhZ3MgJiBTUExJQ0VfRl9OT05CTE9DSykpCi0JCQlyZXR1cm4gLUVBR0FJTjsKKwkJCWdvdG8gb3V0OwogCiAJCXJldCA9IHdhaXRfb25fcGlwZShpdGVyLCB0cnVlKTsKIAkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIG91dDsKIAogCQlnb3RvIGFnYWluOwogCX0KIAogCXJldCA9IHNwbGljZV90b19waXBlKHBpcGUsICZzcGQpOworb3V0OgogCXNwbGljZV9zaHJpbmtfc3BkKCZzcGQpOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9mdW5jdGlvbnNfZ3JhcGguYyBiL2tlcm5lbC90cmFjZS90cmFjZV9mdW5jdGlvbnNfZ3JhcGguYwppbmRleCA3MzYzY2NmLi4wY2JlMzhhIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zX2dyYXBoLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2Z1bmN0aW9uc19ncmFwaC5jCkBAIC0xMTksNyArMTE5LDcgQEAKIC8qIEFkZCBhIGZ1bmN0aW9uIHJldHVybiBhZGRyZXNzIHRvIHRoZSB0cmFjZSBzdGFjayBvbiB0aHJlYWQgaW5mby4qLwogaW50CiBmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2UodW5zaWduZWQgbG9uZyByZXQsIHVuc2lnbmVkIGxvbmcgZnVuYywgaW50ICpkZXB0aCwKLQkJCSB1bnNpZ25lZCBsb25nIGZyYW1lX3BvaW50ZXIpCisJCQkgdW5zaWduZWQgbG9uZyBmcmFtZV9wb2ludGVyLCB1bnNpZ25lZCBsb25nICpyZXRwKQogewogCXVuc2lnbmVkIGxvbmcgbG9uZyBjYWxsdGltZTsKIAlpbnQgaW5kZXg7CkBAIC0xNzEsNyArMTcxLDEyIEBACiAJY3VycmVudC0+cmV0X3N0YWNrW2luZGV4XS5mdW5jID0gZnVuYzsKIAljdXJyZW50LT5yZXRfc3RhY2tbaW5kZXhdLmNhbGx0aW1lID0gY2FsbHRpbWU7CiAJY3VycmVudC0+cmV0X3N0YWNrW2luZGV4XS5zdWJ0aW1lID0gMDsKKyNpZmRlZiBIQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1QKIAljdXJyZW50LT5yZXRfc3RhY2tbaW5kZXhdLmZwID0gZnJhbWVfcG9pbnRlcjsKKyNlbmRpZgorI2lmZGVmIEhBVkVfRlVOQ1RJT05fR1JBUEhfUkVUX0FERFJfUFRSCisJY3VycmVudC0+cmV0X3N0YWNrW2luZGV4XS5yZXRwID0gcmV0cDsKKyNlbmRpZgogCSpkZXB0aCA9IGN1cnJlbnQtPmN1cnJfcmV0X3N0YWNrOwogCiAJcmV0dXJuIDA7CkBAIC0yMDQsNyArMjA5LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmIGRlZmluZWQoQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVCkgJiYgIWRlZmluZWQoQ0NfVVNJTkdfRkVOVFJZKQorI2lmZGVmIEhBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVAogCS8qCiAJICogVGhlIGFyY2ggbWF5IGNob29zZSB0byByZWNvcmQgdGhlIGZyYW1lIHBvaW50ZXIgdXNlZAogCSAqIGFuZCBjaGVjayBpdCBoZXJlIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHdoYXQgd2UgZXhwZWN0IGl0CkBAIC0yNzksNiArMjg0LDY0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiBmdHJhY2VfZ3JhcGhfcmV0X2FkZHIgLSBjb252ZXJ0IGEgcG90ZW50aWFsbHkgbW9kaWZpZWQgc3RhY2sgcmV0dXJuIGFkZHJlc3MKKyAqCQkJICAgdG8gaXRzIG9yaWdpbmFsIHZhbHVlCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGJ5IHN0YWNrIHVud2luZGluZyBjb2RlIHRvIGNvbnZlcnQgYSBmb3VuZCBzdGFjaworICogcmV0dXJuIGFkZHJlc3MgKCdyZXQnKSB0byBpdHMgb3JpZ2luYWwgdmFsdWUsIGluIGNhc2UgdGhlIGZ1bmN0aW9uIGdyYXBoCisgKiB0cmFjZXIgaGFzIG1vZGlmaWVkIGl0IHRvIGJlICdyZXR1cm5fdG9faGFuZGxlcicuICBJZiB0aGUgYWRkcmVzcyBoYXNuJ3QKKyAqIGJlZW4gbW9kaWZpZWQsIHRoZSB1bmNoYW5nZWQgdmFsdWUgb2YgJ3JldCcgaXMgcmV0dXJuZWQuCisgKgorICogJ2lkeCcgaXMgYSBzdGF0ZSB2YXJpYWJsZSB3aGljaCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYnkgdGhlIGNhbGxlciB0byB6ZXJvCisgKiBiZWZvcmUgdGhlIGZpcnN0IGNhbGwuCisgKgorICogJ3JldHAnIGlzIGEgcG9pbnRlciB0byB0aGUgcmV0dXJuIGFkZHJlc3Mgb24gdGhlIHN0YWNrLiAgSXQncyBpZ25vcmVkIGlmCisgKiB0aGUgYXJjaCBkb2Vzbid0IGhhdmUgSEFWRV9GVU5DVElPTl9HUkFQSF9SRVRfQUREUl9QVFIgZGVmaW5lZC4KKyAqLworI2lmZGVmIEhBVkVfRlVOQ1RJT05fR1JBUEhfUkVUX0FERFJfUFRSCit1bnNpZ25lZCBsb25nIGZ0cmFjZV9ncmFwaF9yZXRfYWRkcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCAqaWR4LAorCQkJCSAgICB1bnNpZ25lZCBsb25nIHJldCwgdW5zaWduZWQgbG9uZyAqcmV0cCkKK3sKKwlpbnQgaW5kZXggPSB0YXNrLT5jdXJyX3JldF9zdGFjazsKKwlpbnQgaTsKKworCWlmIChyZXQgIT0gKHVuc2lnbmVkIGxvbmcpcmV0dXJuX3RvX2hhbmRsZXIpCisJCXJldHVybiByZXQ7CisKKwlpZiAoaW5kZXggPCAtMSkKKwkJaW5kZXggKz0gRlRSQUNFX05PVFJBQ0VfREVQVEg7CisKKwlpZiAoaW5kZXggPCAwKQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8PSBpbmRleDsgaSsrKQorCQlpZiAodGFzay0+cmV0X3N0YWNrW2ldLnJldHAgPT0gcmV0cCkKKwkJCXJldHVybiB0YXNrLT5yZXRfc3RhY2tbaV0ucmV0OworCisJcmV0dXJuIHJldDsKK30KKyNlbHNlIC8qICFIQVZFX0ZVTkNUSU9OX0dSQVBIX1JFVF9BRERSX1BUUiAqLwordW5zaWduZWQgbG9uZyBmdHJhY2VfZ3JhcGhfcmV0X2FkZHIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgKmlkeCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyByZXQsIHVuc2lnbmVkIGxvbmcgKnJldHApCit7CisJaW50IHRhc2tfaWR4OworCisJaWYgKHJldCAhPSAodW5zaWduZWQgbG9uZylyZXR1cm5fdG9faGFuZGxlcikKKwkJcmV0dXJuIHJldDsKKworCXRhc2tfaWR4ID0gdGFzay0+Y3Vycl9yZXRfc3RhY2s7CisKKwlpZiAoIXRhc2stPnJldF9zdGFjayB8fCB0YXNrX2lkeCA8ICppZHgpCisJCXJldHVybiByZXQ7CisKKwl0YXNrX2lkeCAtPSAqaWR4OworCSgqaWR4KSsrOworCisJcmV0dXJuIHRhc2stPnJldF9zdGFja1t0YXNrX2lkeF0ucmV0OworfQorI2VuZGlmIC8qIEhBVkVfRlVOQ1RJT05fR1JBUEhfUkVUX0FERFJfUFRSICovCisKIGludCBfX3RyYWNlX2dyYXBoX2VudHJ5KHN0cnVjdCB0cmFjZV9hcnJheSAqdHIsCiAJCQkJc3RydWN0IGZ0cmFjZV9ncmFwaF9lbnQgKnRyYWNlLAogCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMKaW5kZXggOWFlZGIwYi4uZWI2YzlmMSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2twcm9iZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9rcHJvYmUuYwpAQCAtMjUzLDYgKzI1MywxMCBAQAogCUFTU0lHTl9GRVRDSF9UWVBFKHMxNiwgdTE2LCAxKSwKIAlBU1NJR05fRkVUQ0hfVFlQRShzMzIsIHUzMiwgMSksCiAJQVNTSUdOX0ZFVENIX1RZUEUoczY0LCB1NjQsIDEpLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHg4LCAgdTgsICB1OCwgIDApLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHgxNiwgdTE2LCB1MTYsIDApLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHgzMiwgdTMyLCB1MzIsIDApLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHg2NCwgdTY0LCB1NjQsIDApLAogCiAJQVNTSUdOX0ZFVENIX1RZUEVfRU5ECiB9OwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfcHJvYmUuYwppbmRleCA3NGU4MGE1Li44YzA1NTNkIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfcHJvYmUuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfcHJvYmUuYwpAQCAtMzYsMjQgKzM2LDI4IEBACiB9OwogCiAvKiBQcmludGluZyAgaW4gYmFzaWMgdHlwZSBmdW5jdGlvbiB0ZW1wbGF0ZSAqLwotI2RlZmluZSBERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHR5cGUsIGZtdCkJCQkJXAotaW50IFBSSU5UX1RZUEVfRlVOQ19OQU1FKHR5cGUpKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNvbnN0IGNoYXIgKm5hbWUsCVwKKyNkZWZpbmUgREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyh0bmFtZSwgdHlwZSwgZm10KQkJCVwKK2ludCBQUklOVF9UWVBFX0ZVTkNfTkFNRSh0bmFtZSkoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqbmFtZSwJXAogCQkJCXZvaWQgKmRhdGEsIHZvaWQgKmVudCkJCQlcCiB7CQkJCQkJCQkJXAogCXRyYWNlX3NlcV9wcmludGYocywgIiAlcz0iIGZtdCwgbmFtZSwgKih0eXBlICopZGF0YSk7CQlcCiAJcmV0dXJuICF0cmFjZV9zZXFfaGFzX292ZXJmbG93ZWQocyk7CQkJCVwKIH0JCQkJCQkJCQlcCi1jb25zdCBjaGFyIFBSSU5UX1RZUEVfRk1UX05BTUUodHlwZSlbXSA9IGZtdDsJCQkJXAotTk9LUFJPQkVfU1lNQk9MKFBSSU5UX1RZUEVfRlVOQ19OQU1FKHR5cGUpKTsKK2NvbnN0IGNoYXIgUFJJTlRfVFlQRV9GTVRfTkFNRSh0bmFtZSlbXSA9IGZtdDsJCQkJXAorTk9LUFJPQkVfU1lNQk9MKFBSSU5UX1RZUEVfRlVOQ19OQU1FKHRuYW1lKSk7CiAKLURFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkModTggLCAiMHgleCIpCi1ERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHUxNiwgIjB4JXgiKQotREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyh1MzIsICIweCV4IikKLURFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkModTY0LCAiMHglTHgiKQotREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyhzOCwgICIlZCIpCi1ERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHMxNiwgIiVkIikKLURFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoczMyLCAiJWQiKQotREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyhzNjQsICIlTGQiKQorREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyh1OCwgIHU4LCAgIiV1IikKK0RFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkModTE2LCB1MTYsICIldSIpCitERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHUzMiwgdTMyLCAiJXUiKQorREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyh1NjQsIHU2NCwgIiVMdSIpCitERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHM4LCAgczgsICAiJWQiKQorREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyhzMTYsIHMxNiwgIiVkIikKK0RFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoczMyLCBzMzIsICIlZCIpCitERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHM2NCwgczY0LCAiJUxkIikKK0RFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoeDgsICB1OCwgICIweCV4IikKK0RFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoeDE2LCB1MTYsICIweCV4IikKK0RFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoeDMyLCB1MzIsICIweCV4IikKK0RFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoeDY0LCB1NjQsICIweCVMeCIpCiAKIC8qIFByaW50IHR5cGUgZnVuY3Rpb24gZm9yIHN0cmluZyB0eXBlICovCiBpbnQgUFJJTlRfVFlQRV9GVU5DX05BTUUoc3RyaW5nKShzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpuYW1lLApkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmggYi9rZXJuZWwvdHJhY2UvdHJhY2VfcHJvYmUuaAppbmRleCA0NTQwMGNhLi4wYzBhZTU0IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfcHJvYmUuaAorKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfcHJvYmUuaApAQCAtMTQ5LDYgKzE0OSwxMSBAQAogREVDTEFSRV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoczE2KTsKIERFQ0xBUkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHMzMik7CiBERUNMQVJFX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyhzNjQpOworREVDTEFSRV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoeDgpOworREVDTEFSRV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoeDE2KTsKK0RFQ0xBUkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHgzMik7CitERUNMQVJFX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyh4NjQpOworCiBERUNMQVJFX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyhzdHJpbmcpOwogCiAjZGVmaW5lIEZFVENIX0ZVTkNfTkFNRShtZXRob2QsIHR5cGUpCWZldGNoXyMjbWV0aG9kIyNfIyN0eXBlCkBAIC0yMDMsNyArMjA4LDcgQEAKIERFRklORV9GRVRDSF8jI21ldGhvZCh1NjQpCiAKIC8qIERlZmF1bHQgKHVuc2lnbmVkIGxvbmcpIGZldGNoIHR5cGUgKi8KLSNkZWZpbmUgX19ERUZBVUxUX0ZFVENIX1RZUEUodCkgdSMjdAorI2RlZmluZSBfX0RFRkFVTFRfRkVUQ0hfVFlQRSh0KSB4IyN0CiAjZGVmaW5lIF9ERUZBVUxUX0ZFVENIX1RZUEUodCkgX19ERUZBVUxUX0ZFVENIX1RZUEUodCkKICNkZWZpbmUgREVGQVVMVF9GRVRDSF9UWVBFIF9ERUZBVUxUX0ZFVENIX1RZUEUoQklUU19QRVJfTE9ORykKICNkZWZpbmUgREVGQVVMVF9GRVRDSF9UWVBFX1NUUiBfX3N0cmluZ2lmeShERUZBVUxUX0ZFVENIX1RZUEUpCkBAIC0yMzQsNiArMjM5LDEwIEBACiAjZGVmaW5lIEFTU0lHTl9GRVRDSF9UWVBFKHB0eXBlLCBmdHlwZSwgc2lnbikJCQlcCiAJX19BU1NJR05fRkVUQ0hfVFlQRSgjcHR5cGUsIHB0eXBlLCBmdHlwZSwgc2l6ZW9mKGZ0eXBlKSwgc2lnbiwgI3B0eXBlKQogCisvKiBJZiBwdHlwZSBpcyBhbiBhbGlhcyBvZiBhdHlwZSwgdXNlIHRoaXMgbWFjcm8gKHNob3cgYXR5cGUgaW4gZm9ybWF0KSAqLworI2RlZmluZSBBU1NJR05fRkVUQ0hfVFlQRV9BTElBUyhwdHlwZSwgYXR5cGUsIGZ0eXBlLCBzaWduKQkJXAorCV9fQVNTSUdOX0ZFVENIX1RZUEUoI3B0eXBlLCBwdHlwZSwgZnR5cGUsIHNpemVvZihmdHlwZSksIHNpZ24sICNhdHlwZSkKKwogI2RlZmluZSBBU1NJR05fRkVUQ0hfVFlQRV9FTkQge30KIAogI2RlZmluZSBGRVRDSF9UWVBFX1NUUklORwkwCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfdXByb2JlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfdXByb2JlLmMKaW5kZXggYzUzNDg1NC4uN2E2ODczMiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3Vwcm9iZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV91cHJvYmUuYwpAQCAtMjExLDYgKzIxMSwxMCBAQAogCUFTU0lHTl9GRVRDSF9UWVBFKHMxNiwgdTE2LCAxKSwKIAlBU1NJR05fRkVUQ0hfVFlQRShzMzIsIHUzMiwgMSksCiAJQVNTSUdOX0ZFVENIX1RZUEUoczY0LCB1NjQsIDEpLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHg4LCAgdTgsICB1OCwgIDApLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHgxNiwgdTE2LCB1MTYsIDApLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHgzMiwgdTMyLCB1MzIsIDApLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHg2NCwgdTY0LCB1NjQsIDApLAogCiAJQVNTSUdOX0ZFVENIX1RZUEVfRU5ECiB9OwpkaWZmIC0tZ2l0IGEva2VybmVsL3VwLmMgYi9rZXJuZWwvdXAuYwppbmRleCAxNzYwYmYzLi5lZTgxYWM5IDEwMDY0NAotLS0gYS9rZXJuZWwvdXAuYworKysgYi9rZXJuZWwvdXAuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9oeXBlcnZpc29yLmg+CiAKIGludCBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoaW50IGNwdSwgdm9pZCAoKmZ1bmMpICh2b2lkICppbmZvKSwgdm9pZCAqaW5mbywKIAkJCQlpbnQgd2FpdCkKQEAgLTgyLDMgKzgzLDIwIEBACiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KIEVYUE9SVF9TWU1CT0wob25fZWFjaF9jcHVfY29uZCk7CisKK2ludCBzbXBfY2FsbF9vbl9jcHUodW5zaWduZWQgaW50IGNwdSwgaW50ICgqZnVuYykodm9pZCAqKSwgdm9pZCAqcGFyLCBib29sIHBoeXMpCit7CisJaW50IHJldDsKKworCWlmIChjcHUgIT0gMCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmIChwaHlzKQorCQloeXBlcnZpc29yX3Bpbl92Y3B1KDApOworCXJldCA9IGZ1bmMocGFyKTsKKwlpZiAocGh5cykKKwkJaHlwZXJ2aXNvcl9waW5fdmNwdSgtMSk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc21wX2NhbGxfb25fY3B1KTsKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcKaW5kZXggMjMwN2Q3Yy4uY2FiNzQwNSAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcuZGVidWcKKysrIGIvbGliL0tjb25maWcuZGVidWcKQEAgLTgyMSw3ICs4MjEsNyBAQAogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBrZXJuZWwgdG8gZGV0ZWN0ICJodW5nIHRhc2tzIiwKIAkgIHdoaWNoIGFyZSBidWdzIHRoYXQgY2F1c2UgdGhlIHRhc2sgdG8gYmUgc3R1Y2sgaW4KLQkgIHVuaW50ZXJydXB0aWJsZSAiRCIgc3RhdGUgaW5kZWZpbml0aWxleS4KKwkgIHVuaW50ZXJydXB0aWJsZSAiRCIgc3RhdGUgaW5kZWZpbml0ZWx5LgogCiAJICBXaGVuIGEgaHVuZyB0YXNrIGlzIGRldGVjdGVkLCB0aGUga2VybmVsIHdpbGwgcHJpbnQgdGhlCiAJICBjdXJyZW50IHN0YWNrIHRyYWNlICh3aGljaCB5b3Ugc2hvdWxkIHJlcG9ydCksIGJ1dCB0aGUKQEAgLTE2ODYsMjQgKzE2ODYsNiBAQAogCSAgRW5hYmxlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgTGF0ZW5jeVRPUCB0b29sCiAJICB0byBmaW5kIG91dCB3aGljaCB1c2Vyc3BhY2UgaXMgYmxvY2tpbmcgb24gd2hhdCBrZXJuZWwgb3BlcmF0aW9ucy4KIAotY29uZmlnIEFSQ0hfSEFTX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTCi0JYm9vbAotCi1jb25maWcgREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1MKLQlib29sICJTdHJpY3QgdXNlciBjb3B5IHNpemUgY2hlY2tzIgotCWRlcGVuZHMgb24gQVJDSF9IQVNfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1MKLQlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiAhVFJBQ0VfQlJBTkNIX1BST0ZJTElORwotCWhlbHAKLQkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHR1cm5zIGEgY2VydGFpbiBzZXQgb2Ygc2FuaXR5IGNoZWNrcyBmb3IgdXNlcgotCSAgY29weSBvcGVyYXRpb25zIGludG8gY29tcGlsZSB0aW1lIGZhaWx1cmVzLgotCi0JICBUaGUgY29weV9mcm9tX3VzZXIoKSBldGMgY2hlY2tzIGFyZSB0aGVyZSB0byBoZWxwIHRlc3QgaWYgdGhlcmUKLQkgIGFyZSBzdWZmaWNpZW50IHNlY3VyaXR5IGNoZWNrcyBvbiB0aGUgbGVuZ3RoIGFyZ3VtZW50IG9mCi0JICB0aGUgY29weSBvcGVyYXRpb24sIGJ5IGhhdmluZyBnY2MgcHJvdmUgdGhhdCB0aGUgYXJndW1lbnQgaXMKLQkgIHdpdGhpbiBib3VuZHMuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KIHNvdXJjZSBrZXJuZWwvdHJhY2UvS2NvbmZpZwogCiBtZW51ICJSdW50aW1lIFRlc3RpbmciCmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZy51YnNhbiBiL2xpYi9LY29uZmlnLnVic2FuCmluZGV4IDM5NDk0YWYuLmJjNmU2NTEgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnLnVic2FuCisrKyBiL2xpYi9LY29uZmlnLnVic2FuCkBAIC0xLDYgKzEsOSBAQAogY29uZmlnIEFSQ0hfSEFTX1VCU0FOX1NBTklUSVpFX0FMTAogCWJvb2wKIAorY29uZmlnIEFSQ0hfV0FOVFNfVUJTQU5fTk9fTlVMTAorCWRlZl9ib29sIG4KKwogY29uZmlnIFVCU0FOCiAJYm9vbCAiVW5kZWZpbmVkIGJlaGF2aW91ciBzYW5pdHkgY2hlY2tlciIKIAloZWxwCkBAIC0zNCwzICszNywxMSBAQAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBkZXRlY3Rpb24gb2YgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3Nlcy4KIAkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIG9uIGFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0IHVuYWxpZ25lZAogCSAgYWNjZXNzZXMgbWF5IHByb2R1Y2UgYSBsb3Qgb2YgZmFsc2UgcG9zaXRpdmVzLgorCitjb25maWcgVUJTQU5fTlVMTAorCWJvb2wgIkVuYWJsZSBjaGVja2luZyBvZiBudWxsIHBvaW50ZXJzIgorCWRlcGVuZHMgb24gVUJTQU4KKwlkZWZhdWx0IHkgaWYgIUFSQ0hfV0FOVFNfVUJTQU5fTk9fTlVMTAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgZGV0ZWN0aW9uIG9mIG1lbW9yeSBhY2Nlc3NlcyB2aWEgYQorCSAgbnVsbCBwb2ludGVyLgpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlIGIvbGliL01ha2VmaWxlCmluZGV4IGNmYTY4ZWIuLmRmNzQ3ZTUgMTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZQorKysgYi9saWIvTWFrZWZpbGUKQEAgLTIyLDkgKzIyLDggQEAKIAkgc2hhMS5vIGNoYWNoYTIwLm8gbWQ1Lm8gaXJxX3JlZ3MubyBhcmd2X3NwbGl0Lm8gXAogCSBmbGV4X3Byb3BvcnRpb25zLm8gcmF0ZWxpbWl0Lm8gc2hvd19tZW0ubyBcCiAJIGlzX3NpbmdsZV90aHJlYWRlZC5vIHBsaXN0Lm8gZGVjb21wcmVzcy5vIGtvYmplY3RfdWV2ZW50Lm8gXAotCSBlYXJseWNwaW8ubyBzZXFfYnVmLm8gbm1pX2JhY2t0cmFjZS5vIG5vZGVtYXNrLm8KKwkgZWFybHljcGlvLm8gc2VxX2J1Zi5vIG5taV9iYWNrdHJhY2UubyBub2RlbWFzay5vIHdpbl9taW5tYXgubwogCi1vYmotJChDT05GSUdfQVJDSF9IQVNfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1MpICs9IHVzZXJjb3B5Lm8KIGxpYi0kKENPTkZJR19NTVUpICs9IGlvcmVtYXAubwogbGliLSQoQ09ORklHX1NNUCkgKz0gY3B1bWFzay5vCiBsaWItJChDT05GSUdfSEFTX0RNQSkgKz0gZG1hLW5vb3AubwpkaWZmIC0tZ2l0IGEvbGliL2NwdS1ub3RpZmllci1lcnJvci1pbmplY3QuYyBiL2xpYi9jcHUtbm90aWZpZXItZXJyb3ItaW5qZWN0LmMKaW5kZXggNzA3Y2EyNC4uMGUyYzlhMSAxMDA2NDQKLS0tIGEvbGliL2NwdS1ub3RpZmllci1lcnJvci1pbmplY3QuYworKysgYi9saWIvY3B1LW5vdGlmaWVyLWVycm9yLWluamVjdC5jCkBAIC04LDE2ICs4LDQ3IEBACiBtb2R1bGVfcGFyYW0ocHJpb3JpdHksIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHByaW9yaXR5LCAic3BlY2lmeSBjcHUgbm90aWZpZXIgcHJpb3JpdHkiKTsKIAorI2RlZmluZSBVUF9QUkVQQVJFIDAKKyNkZWZpbmUgVVBfUFJFUEFSRV9GUk9aRU4gMAorI2RlZmluZSBET1dOX1BSRVBBUkUgMAorI2RlZmluZSBET1dOX1BSRVBBUkVfRlJPWkVOIDAKKwogc3RhdGljIHN0cnVjdCBub3RpZmllcl9lcnJfaW5qZWN0IGNwdV9ub3RpZmllcl9lcnJfaW5qZWN0ID0gewogCS5hY3Rpb25zID0gewotCQl7IE5PVElGSUVSX0VSUl9JTkpFQ1RfQUNUSU9OKENQVV9VUF9QUkVQQVJFKSB9LAotCQl7IE5PVElGSUVSX0VSUl9JTkpFQ1RfQUNUSU9OKENQVV9VUF9QUkVQQVJFX0ZST1pFTikgfSwKLQkJeyBOT1RJRklFUl9FUlJfSU5KRUNUX0FDVElPTihDUFVfRE9XTl9QUkVQQVJFKSB9LAotCQl7IE5PVElGSUVSX0VSUl9JTkpFQ1RfQUNUSU9OKENQVV9ET1dOX1BSRVBBUkVfRlJPWkVOKSB9LAorCQl7IE5PVElGSUVSX0VSUl9JTkpFQ1RfQUNUSU9OKFVQX1BSRVBBUkUpIH0sCisJCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oVVBfUFJFUEFSRV9GUk9aRU4pIH0sCisJCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oRE9XTl9QUkVQQVJFKSB9LAorCQl7IE5PVElGSUVSX0VSUl9JTkpFQ1RfQUNUSU9OKERPV05fUFJFUEFSRV9GUk9aRU4pIH0sCiAJCXt9CiAJfQogfTsKIAorc3RhdGljIGludCBub3RmX2Vycl9oYW5kbGUoc3RydWN0IG5vdGlmaWVyX2Vycl9pbmplY3RfYWN0aW9uICphY3Rpb24pCit7CisJaW50IHJldDsKKworCXJldCA9IGFjdGlvbi0+ZXJyb3I7CisJaWYgKHJldCkKKwkJcHJfaW5mbygiSW5qZWN0aW5nIGVycm9yICglZCkgdG8gJXNcbiIsIHJldCwgYWN0aW9uLT5uYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG5vdGZfZXJyX2lual91cF9wcmVwYXJlKHVuc2lnbmVkIGludCBjcHUpCit7CisJaWYgKCFjcHVocF90YXNrc19mcm96ZW4pCisJCXJldHVybiBub3RmX2Vycl9oYW5kbGUoJmNwdV9ub3RpZmllcl9lcnJfaW5qZWN0LmFjdGlvbnNbMF0pOworCWVsc2UKKwkJcmV0dXJuIG5vdGZfZXJyX2hhbmRsZSgmY3B1X25vdGlmaWVyX2Vycl9pbmplY3QuYWN0aW9uc1sxXSk7Cit9CisKK3N0YXRpYyBpbnQgbm90Zl9lcnJfaW5qX2RlYWQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlpZiAoIWNwdWhwX3Rhc2tzX2Zyb3plbikKKwkJcmV0dXJuIG5vdGZfZXJyX2hhbmRsZSgmY3B1X25vdGlmaWVyX2Vycl9pbmplY3QuYWN0aW9uc1syXSk7CisJZWxzZQorCQlyZXR1cm4gbm90Zl9lcnJfaGFuZGxlKCZjcHVfbm90aWZpZXJfZXJyX2luamVjdC5hY3Rpb25zWzNdKTsKK30KKwogc3RhdGljIHN0cnVjdCBkZW50cnkgKmRpcjsKIAogc3RhdGljIGludCBlcnJfaW5qZWN0X2luaXQodm9pZCkKQEAgLTI5LDcgKzYwLDEwIEBACiAJaWYgKElTX0VSUihkaXIpKQogCQlyZXR1cm4gUFRSX0VSUihkaXIpOwogCi0JZXJyID0gcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZjcHVfbm90aWZpZXJfZXJyX2luamVjdC5uYik7CisJZXJyID0gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9OT1RGX0VSUl9JTkpfUFJFUEFSRSwKKwkJCQkJImNwdS1lcnItbm90aWY6cHJlcGFyZSIsCisJCQkJCW5vdGZfZXJyX2lual91cF9wcmVwYXJlLAorCQkJCQlub3RmX2Vycl9pbmpfZGVhZCk7CiAJaWYgKGVycikKIAkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRpcik7CiAKQEAgLTM4LDcgKzcyLDcgQEAKIAogc3RhdGljIHZvaWQgZXJyX2luamVjdF9leGl0KHZvaWQpCiB7Ci0JdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJmNwdV9ub3RpZmllcl9lcnJfaW5qZWN0Lm5iKTsKKwljcHVocF9yZW1vdmVfc3RhdGVfbm9jYWxscyhDUFVIUF9OT1RGX0VSUl9JTkpfUFJFUEFSRSk7CiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRpcik7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9kbWEtZGVidWcuYyBiL2xpYi9kbWEtZGVidWcuYwppbmRleCBmY2ZhMTkzLi4wNmYwMmY2IDEwMDY0NAotLS0gYS9saWIvZG1hLWRlYnVnLmMKKysrIGIvbGliL2RtYS1kZWJ1Zy5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RhY2t0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1kZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CkBAIC0xMTY0LDExICsxMTY1LDMyIEBACiAJcHV0X2hhc2hfYnVja2V0KGJ1Y2tldCwgJmZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgY2hlY2tfZm9yX3N0YWNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3N0YXRpYyB2b2lkIGNoZWNrX2Zvcl9zdGFjayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IHBhZ2UgKnBhZ2UsIHNpemVfdCBvZmZzZXQpCiB7Ci0JaWYgKG9iamVjdF9pc19vbl9zdGFjayhhZGRyKSkKLQkJZXJyX3ByaW50ayhkZXYsIE5VTEwsICJETUEtQVBJOiBkZXZpY2UgZHJpdmVyIG1hcHMgbWVtb3J5IGZyb20gIgotCQkJCSJzdGFjayBbYWRkcj0lcF1cbiIsIGFkZHIpOworCXZvaWQgKmFkZHI7CisJc3RydWN0IHZtX3N0cnVjdCAqc3RhY2tfdm1fYXJlYSA9IHRhc2tfc3RhY2tfdm1fYXJlYShjdXJyZW50KTsKKworCWlmICghc3RhY2tfdm1fYXJlYSkgeworCQkvKiBTdGFjayBpcyBkaXJlY3QtbWFwcGVkLiAqLworCQlpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpCisJCQlyZXR1cm47CisJCWFkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSkgKyBvZmZzZXQ7CisJCWlmIChvYmplY3RfaXNfb25fc3RhY2soYWRkcikpCisJCQllcnJfcHJpbnRrKGRldiwgTlVMTCwgIkRNQS1BUEk6IGRldmljZSBkcml2ZXIgbWFwcyBtZW1vcnkgZnJvbSBzdGFjayBbYWRkcj0lcF1cbiIsIGFkZHIpOworCX0gZWxzZSB7CisJCS8qIFN0YWNrIGlzIHZtYWxsb2NlZC4gKi8KKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IHN0YWNrX3ZtX2FyZWEtPm5yX3BhZ2VzOyBpKyspIHsKKwkJCWlmIChwYWdlICE9IHN0YWNrX3ZtX2FyZWEtPnBhZ2VzW2ldKQorCQkJCWNvbnRpbnVlOworCisJCQlhZGRyID0gKHU4ICopY3VycmVudC0+c3RhY2sgKyBpICogUEFHRV9TSVpFICsgb2Zmc2V0OworCQkJZXJyX3ByaW50ayhkZXYsIE5VTEwsICJETUEtQVBJOiBkZXZpY2UgZHJpdmVyIG1hcHMgbWVtb3J5IGZyb20gc3RhY2sgW3Byb2JhYmxlIGFkZHI9JXBdXG4iLCBhZGRyKTsKKwkJCWJyZWFrOworCQl9CisJfQogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgb3ZlcmxhcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgdm9pZCAqc3RhcnQsIHZvaWQgKmVuZCkKQEAgLTEyOTEsMTAgKzEzMTMsMTEgQEAKIAlpZiAobWFwX3NpbmdsZSkKIAkJZW50cnktPnR5cGUgPSBkbWFfZGVidWdfc2luZ2xlOwogCisJY2hlY2tfZm9yX3N0YWNrKGRldiwgcGFnZSwgb2Zmc2V0KTsKKwogCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpIHsKIAkJdm9pZCAqYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldDsKIAotCQljaGVja19mb3Jfc3RhY2soZGV2LCBhZGRyKTsKIAkJY2hlY2tfZm9yX2lsbGVnYWxfYXJlYShkZXYsIGFkZHIsIHNpemUpOwogCX0KIApAQCAtMTM4Niw4ICsxNDA5LDkgQEAKIAkJZW50cnktPnNnX2NhbGxfZW50cyAgID0gbmVudHM7CiAJCWVudHJ5LT5zZ19tYXBwZWRfZW50cyA9IG1hcHBlZF9lbnRzOwogCisJCWNoZWNrX2Zvcl9zdGFjayhkZXYsIHNnX3BhZ2UocyksIHMtPm9mZnNldCk7CisKIAkJaWYgKCFQYWdlSGlnaE1lbShzZ19wYWdlKHMpKSkgewotCQkJY2hlY2tfZm9yX3N0YWNrKGRldiwgc2dfdmlydChzKSk7CiAJCQljaGVja19mb3JfaWxsZWdhbF9hcmVhKGRldiwgc2dfdmlydChzKSwgc2dfZG1hX2xlbihzKSk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvbGliL2lvdl9pdGVyLmMgYi9saWIvaW92X2l0ZXIuYwppbmRleCA5ZThjNzM4Li43ZTMxMzhjIDEwMDY0NAotLS0gYS9saWIvaW92X2l0ZXIuYworKysgYi9saWIvaW92X2l0ZXIuYwpAQCAtMjkxLDMzICsyOTEsMTMgQEAKIH0KIAogLyoKLSAqIEZhdWx0IGluIHRoZSBmaXJzdCBpb3ZlYyBvZiB0aGUgZ2l2ZW4gaW92X2l0ZXIsIHRvIGEgbWF4aW11bSBsZW5ndGgKLSAqIG9mIGJ5dGVzLiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3Igbm9uLXplcm8gaWYgdGhlIG1lbW9yeSBjb3VsZCBub3QgYmUKLSAqIGFjY2Vzc2VkIChpZS4gYmVjYXVzZSBpdCBpcyBhbiBpbnZhbGlkIGFkZHJlc3MpLgotICoKLSAqIHdyaXRldi1pbnRlbnNpdmUgY29kZSBtYXkgd2FudCB0aGlzIHRvIHByZWZhdWx0IHNldmVyYWwgaW92ZWNzIC0tIHRoYXQKLSAqIHdvdWxkIGJlIHBvc3NpYmxlIChjYWxsZXJzIG11c3Qgbm90IHJlbHkgb24gdGhlIGZhY3QgdGhhdCBfb25seV8gdGhlCi0gKiBmaXJzdCBpb3ZlYyB3aWxsIGJlIGZhdWx0ZWQgd2l0aCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbikuCi0gKi8KLWludCBpb3ZfaXRlcl9mYXVsdF9pbl9yZWFkYWJsZShzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCBieXRlcykKLXsKLQlpZiAoIShpLT50eXBlICYgKElURVJfQlZFQ3xJVEVSX0tWRUMpKSkgewotCQljaGFyIF9fdXNlciAqYnVmID0gaS0+aW92LT5pb3ZfYmFzZSArIGktPmlvdl9vZmZzZXQ7Ci0JCWJ5dGVzID0gbWluKGJ5dGVzLCBpLT5pb3YtPmlvdl9sZW4gLSBpLT5pb3Zfb2Zmc2V0KTsKLQkJcmV0dXJuIGZhdWx0X2luX3BhZ2VzX3JlYWRhYmxlKGJ1ZiwgYnl0ZXMpOwotCX0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaW92X2l0ZXJfZmF1bHRfaW5fcmVhZGFibGUpOwotCi0vKgogICogRmF1bHQgaW4gb25lIG9yIG1vcmUgaW92ZWNzIG9mIHRoZSBnaXZlbiBpb3ZfaXRlciwgdG8gYSBtYXhpbXVtIGxlbmd0aCBvZgogICogYnl0ZXMuICBGb3IgZWFjaCBpb3ZlYywgZmF1bHQgaW4gZWFjaCBwYWdlIHRoYXQgY29uc3RpdHV0ZXMgdGhlIGlvdmVjLgogICoKICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG9yIG5vbi16ZXJvIGlmIHRoZSBtZW1vcnkgY291bGQgbm90IGJlIGFjY2Vzc2VkIChpLmUuCiAgKiBiZWNhdXNlIGl0IGlzIGFuIGludmFsaWQgYWRkcmVzcykuCiAgKi8KLWludCBpb3ZfaXRlcl9mYXVsdF9pbl9tdWx0aXBhZ2VzX3JlYWRhYmxlKHN0cnVjdCBpb3ZfaXRlciAqaSwgc2l6ZV90IGJ5dGVzKQoraW50IGlvdl9pdGVyX2ZhdWx0X2luX3JlYWRhYmxlKHN0cnVjdCBpb3ZfaXRlciAqaSwgc2l6ZV90IGJ5dGVzKQogewogCXNpemVfdCBza2lwID0gaS0+aW92X29mZnNldDsKIAljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdjsKQEAgLTMzNCw3ICszMTQsNyBAQAogCX0KIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woaW92X2l0ZXJfZmF1bHRfaW5fbXVsdGlwYWdlc19yZWFkYWJsZSk7CitFWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2ZhdWx0X2luX3JlYWRhYmxlKTsKIAogdm9pZCBpb3ZfaXRlcl9pbml0KHN0cnVjdCBpb3ZfaXRlciAqaSwgaW50IGRpcmVjdGlvbiwKIAkJCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsCmRpZmYgLS1naXQgYS9saWIvaXJxX3BvbGwuYyBiL2xpYi9pcnFfcG9sbC5jCmluZGV4IDgzNmY3ZGIuLjJiZTU1NjkgMTAwNjQ0Ci0tLSBhL2xpYi9pcnFfcG9sbC5jCisrKyBiL2xpYi9pcnFfcG9sbC5jCkBAIC0xODQsMzAgKzE4NCwyMSBAQAogfQogRVhQT1JUX1NZTUJPTChpcnFfcG9sbF9pbml0KTsKIAotc3RhdGljIGludCBpcnFfcG9sbF9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKLQkJCQkgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IGlycV9wb2xsX2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJLyoKIAkgKiBJZiBhIENQVSBnb2VzIGF3YXksIHNwbGljZSBpdHMgZW50cmllcyB0byB0aGUgY3VycmVudCBDUFUKIAkgKiBhbmQgdHJpZ2dlciBhIHJ1biBvZiB0aGUgc29mdGlycQogCSAqLwotCWlmIChhY3Rpb24gPT0gQ1BVX0RFQUQgfHwgYWN0aW9uID09IENQVV9ERUFEX0ZST1pFTikgewotCQlpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpIGhjcHU7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlsaXN0X3NwbGljZV9pbml0KCZwZXJfY3B1KGJsa19jcHVfaW9wb2xsLCBjcHUpLAorCQkJIHRoaXNfY3B1X3B0cigmYmxrX2NwdV9pb3BvbGwpKTsKKwlfX3JhaXNlX3NvZnRpcnFfaXJxb2ZmKElSUV9QT0xMX1NPRlRJUlEpOworCWxvY2FsX2lycV9lbmFibGUoKTsKIAotCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCQlsaXN0X3NwbGljZV9pbml0KCZwZXJfY3B1KGJsa19jcHVfaW9wb2xsLCBjcHUpLAotCQkJCSB0aGlzX2NwdV9wdHIoJmJsa19jcHVfaW9wb2xsKSk7Ci0JCV9fcmFpc2Vfc29mdGlycV9pcnFvZmYoSVJRX1BPTExfU09GVElSUSk7Ci0JCWxvY2FsX2lycV9lbmFibGUoKTsKLQl9Ci0KLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGlycV9wb2xsX2NwdV9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbAk9IGlycV9wb2xsX2NwdV9ub3RpZnksCi19OwotCiBzdGF0aWMgX19pbml0IGludCBpcnFfcG9sbF9zZXR1cCh2b2lkKQogewogCWludCBpOwpAQCAtMjE2LDcgKzIwNyw4IEBACiAJCUlOSVRfTElTVF9IRUFEKCZwZXJfY3B1KGJsa19jcHVfaW9wb2xsLCBpKSk7CiAKIAlvcGVuX3NvZnRpcnEoSVJRX1BPTExfU09GVElSUSwgaXJxX3BvbGxfc29mdGlycSk7Ci0JcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZpcnFfcG9sbF9jcHVfbm90aWZpZXIpOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfSVJRX1BPTExfREVBRCwgImlycV9wb2xsOmRlYWQiLCBOVUxMLAorCQkJCSAgaXJxX3BvbGxfY3B1X2RlYWQpOwogCXJldHVybiAwOwogfQogc3Vic3lzX2luaXRjYWxsKGlycV9wb2xsX3NldHVwKTsKZGlmZiAtLWdpdCBhL2xpYi9yYWRpeC10cmVlLmMgYi9saWIvcmFkaXgtdHJlZS5jCmluZGV4IDFiN2JmNzMuLjhlNmQ1NTIgMTAwNjQ0Ci0tLSBhL2xpYi9yYWRpeC10cmVlLmMKKysrIGIvbGliL3JhZGl4LXRyZWUuYwpAQCAtMTA1LDEwICsxMDUsMTAgQEAKIAogI2lmZGVmIENPTkZJR19SQURJWF9UUkVFX01VTFRJT1JERVIKIAlpZiAocmFkaXhfdHJlZV9pc19pbnRlcm5hbF9ub2RlKGVudHJ5KSkgewotCQl1bnNpZ25lZCBsb25nIHNpYm9mZiA9IGdldF9zbG90X29mZnNldChwYXJlbnQsIGVudHJ5KTsKLQkJaWYgKHNpYm9mZiA8IFJBRElYX1RSRUVfTUFQX1NJWkUpIHsKLQkJCW9mZnNldCA9IHNpYm9mZjsKLQkJCWVudHJ5ID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhwYXJlbnQtPnNsb3RzW29mZnNldF0pOworCQlpZiAoaXNfc2libGluZ19lbnRyeShwYXJlbnQsIGVudHJ5KSkgeworCQkJdm9pZCAqKnNpYmVudHJ5ID0gKHZvaWQgKiopIGVudHJ5X3RvX25vZGUoZW50cnkpOworCQkJb2Zmc2V0ID0gZ2V0X3Nsb3Rfb2Zmc2V0KHBhcmVudCwgc2liZW50cnkpOworCQkJZW50cnkgPSByY3VfZGVyZWZlcmVuY2VfcmF3KCpzaWJlbnRyeSk7CiAJCX0KIAl9CiAjZW5kaWYKQEAgLTE1ODMsMTUgKzE1ODMsMTAgQEAKIH0KIEVYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV9kZWxldGUpOwogCi1zdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpyYWRpeF90cmVlX3JlcGxhY2VfY2xlYXJfdGFncygKLQkJCXN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCi0JCQl1bnNpZ25lZCBsb25nIGluZGV4LCB2b2lkICplbnRyeSkKK3ZvaWQgcmFkaXhfdHJlZV9jbGVhcl90YWdzKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCisJCQkgICBzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlLAorCQkJICAgdm9pZCAqKnNsb3QpCiB7Ci0Jc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZTsKLQl2b2lkICoqc2xvdDsKLQotCV9fcmFkaXhfdHJlZV9sb29rdXAocm9vdCwgaW5kZXgsICZub2RlLCAmc2xvdCk7Ci0KIAlpZiAobm9kZSkgewogCQl1bnNpZ25lZCBpbnQgdGFnLCBvZmZzZXQgPSBnZXRfc2xvdF9vZmZzZXQobm9kZSwgc2xvdCk7CiAJCWZvciAodGFnID0gMDsgdGFnIDwgUkFESVhfVFJFRV9NQVhfVEFHUzsgdGFnKyspCkBAIC0xNjAwLDkgKzE1OTUsNiBAQAogCQkvKiBDbGVhciByb290IG5vZGUgdGFncyAqLwogCQlyb290LT5nZnBfbWFzayAmPSBfX0dGUF9CSVRTX01BU0s7CiAJfQotCi0JcmFkaXhfdHJlZV9yZXBsYWNlX3Nsb3Qoc2xvdCwgZW50cnkpOwotCXJldHVybiBub2RlOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2xpYi9yYWlkNi8uZ2l0aWdub3JlIGIvbGliL3JhaWQ2Ly5naXRpZ25vcmUKaW5kZXggMGE3ZTQ5NC4uZjAxYjFjYiAxMDA2NDQKLS0tIGEvbGliL3JhaWQ2Ly5naXRpZ25vcmUKKysrIGIvbGliL3JhaWQ2Ly5naXRpZ25vcmUKQEAgLTMsMyArMyw0IEBACiBpbnQqLmMKIHRhYmxlcy5jCiBuZW9uPy5jCitzMzkwdng/LmMKZGlmZiAtLWdpdCBhL2xpYi9yYWlkNi9NYWtlZmlsZSBiL2xpYi9yYWlkNi9NYWtlZmlsZQppbmRleCAzYjEwYTQ4Li4yOWY1MDNlIDEwMDY0NAotLS0gYS9saWIvcmFpZDYvTWFrZWZpbGUKKysrIGIvbGliL3JhaWQ2L01ha2VmaWxlCkBAIC03LDYgKzcsNyBAQAogcmFpZDZfcHEtJChDT05GSUdfQUxUSVZFQykgKz0gYWx0aXZlYzEubyBhbHRpdmVjMi5vIGFsdGl2ZWM0Lm8gYWx0aXZlYzgubwogcmFpZDZfcHEtJChDT05GSUdfS0VSTkVMX01PREVfTkVPTikgKz0gbmVvbi5vIG5lb24xLm8gbmVvbjIubyBuZW9uNC5vIG5lb244Lm8KIHJhaWQ2X3BxLSQoQ09ORklHX1RJTEVHWCkgKz0gdGlsZWd4OC5vCityYWlkNl9wcS0kKENPTkZJR19TMzkwKSArPSBzMzkwdng4Lm8gcmVjb3ZfczM5MHhjLm8KIAogaG9zdHByb2dzLXkJKz0gbWt0YWJsZXMKIApAQCAtMTE2LDYgKzExNywxMSBAQAogJChvYmopL3RpbGVneDguYzogICAkKHNyYykvdGlsZWd4LnVjICQoc3JjKS91bnJvbGwuYXdrIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsdW5yb2xsKQogCit0YXJnZXRzICs9IHMzOTB2eDguYworJChvYmopL3MzOTB2eDguYzogICBVTlJPTEwgOj0gOAorJChvYmopL3MzOTB2eDguYzogICAkKHNyYykvczM5MHZ4LnVjICQoc3JjKS91bnJvbGwuYXdrIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsdW5yb2xsKQorCiBxdWlldF9jbWRfbWt0YWJsZSA9IFRBQkxFICAgJEAKICAgICAgIGNtZF9ta3RhYmxlID0gJChvYmopL21rdGFibGVzID4gJEAgfHwgKCBybSAtZiAkQCAmJiBleGl0IDEgKQogCmRpZmYgLS1naXQgYS9saWIvcmFpZDYvYWxnb3MuYyBiL2xpYi9yYWlkNi9hbGdvcy5jCmluZGV4IDk3NWM2ZTAuLjU5MmZmNDkgMTAwNjQ0Ci0tLSBhL2xpYi9yYWlkNi9hbGdvcy5jCisrKyBiL2xpYi9yYWlkNi9hbGdvcy5jCkBAIC02OSw2ICs2OSw5IEBACiAjaWYgZGVmaW5lZChDT05GSUdfVElMRUdYKQogCSZyYWlkNl90aWxlZ3g4LAogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfUzM5MCkKKwkmcmFpZDZfczM5MHZ4OCwKKyNlbmRpZgogCSZyYWlkNl9pbnR4MSwKIAkmcmFpZDZfaW50eDIsCiAJJnJhaWQ2X2ludHg0LApAQCAtOTUsNiArOTgsOSBAQAogI2lmZGVmIENPTkZJR19BU19TU1NFMwogCSZyYWlkNl9yZWNvdl9zc3NlMywKICNlbmRpZgorI2lmZGVmIENPTkZJR19TMzkwCisJJnJhaWQ2X3JlY292X3MzOTB4YywKKyNlbmRpZgogCSZyYWlkNl9yZWNvdl9pbnR4MSwKIAlOVUxMCiB9OwpkaWZmIC0tZ2l0IGEvbGliL3JhaWQ2L3JlY292X3MzOTB4Yy5jIGIvbGliL3JhaWQ2L3JlY292X3MzOTB4Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNDJkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmFpZDYvcmVjb3ZfczM5MHhjLmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBSQUlELTYgZGF0YSByZWNvdmVyeSBpbiBkdWFsIGZhaWx1cmUgbW9kZSBiYXNlZCBvbiB0aGUgWEMgaW5zdHJ1Y3Rpb24uCisgKgorICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDE2CisgKiBBdXRob3Iocyk6IE1hcnRpbiBTY2h3aWRlZnNreSA8c2Nod2lkZWZza3lAZGUuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFpZC9wcS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgeG9yX2Jsb2NrKHU4ICpwMSwgdTggKnAyKQoreworCXR5cGVkZWYgc3RydWN0IHsgdTggX1syNTZdOyB9IGFkZHJ0eXBlOworCisJYXNtIHZvbGF0aWxlKAorCQkiCXhjCTAoMjU2LCVbcDFdKSwwKCVbcDJdKVxuIgorCQk6ICIrbSIgKCooYWRkcnR5cGUgKikgcDEpIDogIm0iICgqKGFkZHJ0eXBlICopIHAyKSwKKwkJICBbcDFdICJhIiAocDEpLCBbcDJdICJhIiAocDIpIDogImNjIik7Cit9CisKKy8qIFJlY292ZXIgdHdvIGZhaWxlZCBkYXRhIGJsb2Nrcy4gKi8KK3N0YXRpYyB2b2lkIHJhaWQ2XzJkYXRhX3JlY292X3MzOTB4YyhpbnQgZGlza3MsIHNpemVfdCBieXRlcywgaW50IGZhaWxhLAorCQlpbnQgZmFpbGIsIHZvaWQgKipwdHJzKQoreworCXU4ICpwLCAqcSwgKmRwLCAqZHE7CisJY29uc3QgdTggKnBibXVsOwkvKiBQIG11bHRpcGxpZXIgdGFibGUgZm9yIEIgZGF0YSAqLworCWNvbnN0IHU4ICpxbXVsOwkJLyogUSBtdWx0aXBsaWVyIHRhYmxlIChmb3IgYm90aCkgKi8KKwlpbnQgaTsKKworCXAgPSAodTggKilwdHJzW2Rpc2tzLTJdOworCXEgPSAodTggKilwdHJzW2Rpc2tzLTFdOworCisJLyogQ29tcHV0ZSBzeW5kcm9tZSB3aXRoIHplcm8gZm9yIHRoZSBtaXNzaW5nIGRhdGEgcGFnZXMKKwkgICBVc2UgdGhlIGRlYWQgZGF0YSBwYWdlcyBhcyB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IKKwkgICBkZWx0YSBwIGFuZCBkZWx0YSBxICovCisJZHAgPSAodTggKilwdHJzW2ZhaWxhXTsKKwlwdHJzW2ZhaWxhXSA9ICh2b2lkICopcmFpZDZfZW1wdHlfemVyb19wYWdlOworCXB0cnNbZGlza3MtMl0gPSBkcDsKKwlkcSA9ICh1OCAqKXB0cnNbZmFpbGJdOworCXB0cnNbZmFpbGJdID0gKHZvaWQgKilyYWlkNl9lbXB0eV96ZXJvX3BhZ2U7CisJcHRyc1tkaXNrcy0xXSA9IGRxOworCisJcmFpZDZfY2FsbC5nZW5fc3luZHJvbWUoZGlza3MsIGJ5dGVzLCBwdHJzKTsKKworCS8qIFJlc3RvcmUgcG9pbnRlciB0YWJsZSAqLworCXB0cnNbZmFpbGFdICAgPSBkcDsKKwlwdHJzW2ZhaWxiXSAgID0gZHE7CisJcHRyc1tkaXNrcy0yXSA9IHA7CisJcHRyc1tkaXNrcy0xXSA9IHE7CisKKwkvKiBOb3csIHBpY2sgdGhlIHByb3BlciBkYXRhIHRhYmxlcyAqLworCXBibXVsID0gcmFpZDZfZ2ZtdWxbcmFpZDZfZ2ZleGlbZmFpbGItZmFpbGFdXTsKKwlxbXVsICA9IHJhaWQ2X2dmbXVsW3JhaWQ2X2dmaW52W3JhaWQ2X2dmZXhwW2ZhaWxhXV5yYWlkNl9nZmV4cFtmYWlsYl1dXTsKKworCS8qIE5vdyBkbyBpdC4uLiAqLworCXdoaWxlIChieXRlcykgeworCQl4b3JfYmxvY2soZHAsIHApOworCQl4b3JfYmxvY2soZHEsIHEpOworCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCQlkcVtpXSA9IHBibXVsW2RwW2ldXSBeIHFtdWxbZHFbaV1dOworCQl4b3JfYmxvY2soZHAsIGRxKTsKKwkJcCArPSAyNTY7CisJCXEgKz0gMjU2OworCQlkcCArPSAyNTY7CisJCWRxICs9IDI1NjsKKwkJYnl0ZXMgLT0gMjU2OworCX0KK30KKworLyogUmVjb3ZlciBmYWlsdXJlIG9mIG9uZSBkYXRhIGJsb2NrIHBsdXMgdGhlIFAgYmxvY2sgKi8KK3N0YXRpYyB2b2lkIHJhaWQ2X2RhdGFwX3JlY292X3MzOTB4YyhpbnQgZGlza3MsIHNpemVfdCBieXRlcywgaW50IGZhaWxhLAorCQl2b2lkICoqcHRycykKK3sKKwl1OCAqcCwgKnEsICpkcTsKKwljb25zdCB1OCAqcW11bDsJCS8qIFEgbXVsdGlwbGllciB0YWJsZSAqLworCWludCBpOworCisJcCA9ICh1OCAqKXB0cnNbZGlza3MtMl07CisJcSA9ICh1OCAqKXB0cnNbZGlza3MtMV07CisKKwkvKiBDb21wdXRlIHN5bmRyb21lIHdpdGggemVybyBmb3IgdGhlIG1pc3NpbmcgZGF0YSBwYWdlCisJICAgVXNlIHRoZSBkZWFkIGRhdGEgcGFnZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgZGVsdGEgcSAqLworCWRxID0gKHU4ICopcHRyc1tmYWlsYV07CisJcHRyc1tmYWlsYV0gPSAodm9pZCAqKXJhaWQ2X2VtcHR5X3plcm9fcGFnZTsKKwlwdHJzW2Rpc2tzLTFdID0gZHE7CisKKwlyYWlkNl9jYWxsLmdlbl9zeW5kcm9tZShkaXNrcywgYnl0ZXMsIHB0cnMpOworCisJLyogUmVzdG9yZSBwb2ludGVyIHRhYmxlICovCisJcHRyc1tmYWlsYV0gICA9IGRxOworCXB0cnNbZGlza3MtMV0gPSBxOworCisJLyogTm93LCBwaWNrIHRoZSBwcm9wZXIgZGF0YSB0YWJsZXMgKi8KKwlxbXVsICA9IHJhaWQ2X2dmbXVsW3JhaWQ2X2dmaW52W3JhaWQ2X2dmZXhwW2ZhaWxhXV1dOworCisJLyogTm93IGRvIGl0Li4uICovCisJd2hpbGUgKGJ5dGVzKSB7CisJCXhvcl9ibG9jayhkcSwgcSk7CisJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCWRxW2ldID0gcW11bFtkcVtpXV07CisJCXhvcl9ibG9jayhwLCBkcSk7CisJCXAgKz0gMjU2OworCQlxICs9IDI1NjsKKwkJZHEgKz0gMjU2OworCQlieXRlcyAtPSAyNTY7CisJfQorfQorCisKK2NvbnN0IHN0cnVjdCByYWlkNl9yZWNvdl9jYWxscyByYWlkNl9yZWNvdl9zMzkweGMgPSB7CisJLmRhdGEyID0gcmFpZDZfMmRhdGFfcmVjb3ZfczM5MHhjLAorCS5kYXRhcCA9IHJhaWQ2X2RhdGFwX3JlY292X3MzOTB4YywKKwkudmFsaWQgPSBOVUxMLAorCS5uYW1lID0gInMzOTB4YyIsCisJLnByaW9yaXR5ID0gMSwKK307CmRpZmYgLS1naXQgYS9saWIvcmFpZDYvczM5MHZ4LnVjIGIvbGliL3JhaWQ2L3MzOTB2eC51YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjQ1MTkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JhaWQ2L3MzOTB2eC51YwpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIHJhaWQ2X3Z4JCMuYworICoKKyAqICQjLXdheSB1bnJvbGxlZCBSQUlENiBnZW4veG9yIGZ1bmN0aW9ucyBmb3IgczM5MAorICogYmFzZWQgb24gdGhlIHZlY3RvciBmYWNpbGl0eQorICoKKyAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAxNgorICogQXV0aG9yKHMpOiBNYXJ0aW4gU2Nod2lkZWZza3kgPHNjaHdpZGVmc2t5QGRlLmlibS5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBvc3Rwcm9jZXNzZWQgdXNpbmcgdW5yb2xsLmF3ay4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcmFpZC9wcS5oPgorI2luY2x1ZGUgPGFzbS9mcHUvYXBpLmg+CisKK2FzbSgiLmluY2x1ZGUgXCJhc20vdngtaW5zbi5oXCJcbiIpOworCisjZGVmaW5lIE5TSVpFIDE2CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBMT0FEX0NPTlNUKHZvaWQpCit7CisJYXNtIHZvbGF0aWxlKCJWUkVQSUIgJXYyNCw3Iik7CisJYXNtIHZvbGF0aWxlKCJWUkVQSUIgJXYyNSwweDFkIik7Cit9CisKKy8qCisgKiBUaGUgU0hMQllURSgpIG9wZXJhdGlvbiBzaGlmdHMgZWFjaCBvZiB0aGUgMTYgYnl0ZXMgaW4KKyAqIHZlY3RvciByZWdpc3RlciB5IGxlZnQgYnkgMSBiaXQgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluCisgKiB2ZWN0b3IgcmVnaXN0ZXIgeC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIFNITEJZVEUoaW50IHgsIGludCB5KQoreworCWFzbSB2b2xhdGlsZSAoIlZBQiAlMCwlMSwlMSIgOiA6ICJpIiAoeCksICJpIiAoeSkpOworfQorCisvKgorICogRm9yIGVhY2ggb2YgdGhlIDE2IGJ5dGVzIGluIHRoZSB2ZWN0b3IgcmVnaXN0ZXIgeSB0aGUgTUFTSygpCisgKiBvcGVyYXRpb24gcmV0dXJucyAweEZGIGlmIHRoZSBoaWdoIGJpdCBvZiB0aGUgYnl0ZSBpcyAxLAorICogb3IgMHgwMCBpZiB0aGUgaGlnaCBiaXQgaXMgMC4gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gdmVjdG9yCisgKiByZWdpc3RlciB4LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgTUFTSyhpbnQgeCwgaW50IHkpCit7CisJYXNtIHZvbGF0aWxlICgiVkVTUkFWQgklMCwlMSwyNCIgOiA6ICJpIiAoeCksICJpIiAoeSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgQU5EKGludCB4LCBpbnQgeSwgaW50IHopCit7CisJYXNtIHZvbGF0aWxlICgiVk4gJTAsJTEsJTIiIDogOiAiaSIgKHgpLCAiaSIgKHkpLCAiaSIgKHopKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIFhPUihpbnQgeCwgaW50IHksIGludCB6KQoreworCWFzbSB2b2xhdGlsZSAoIlZYICUwLCUxLCUyIiA6IDogImkiICh4KSwgImkiICh5KSwgImkiICh6KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBMT0FEX0RBVEEoaW50IHgsIGludCBuLCB1OCAqcHRyKQoreworCXR5cGVkZWYgc3RydWN0IHsgdTggX1sxNipuXTsgfSBhZGRydHlwZTsKKwlyZWdpc3RlciBhZGRydHlwZSAqX19wdHIgYXNtKCIxIikgPSAoYWRkcnR5cGUgKikgcHRyOworCisJYXNtIHZvbGF0aWxlICgiVkxNICUyLCUzLDAsJXIxIgorCQkgICAgICA6IDogIm0iICgqX19wdHIpLCAiYSIgKF9fcHRyKSwgImkiICh4KSwgImkiICh4ICsgbiAtIDEpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIFNUT1JFX0RBVEEoaW50IHgsIGludCBuLCB1OCAqcHRyKQoreworCXR5cGVkZWYgc3RydWN0IHsgdTggX1sxNipuXTsgfSBhZGRydHlwZTsKKwlyZWdpc3RlciBhZGRydHlwZSAqX19wdHIgYXNtKCIxIikgPSAoYWRkcnR5cGUgKikgcHRyOworCisJYXNtIHZvbGF0aWxlICgiVlNUTSAlMiwlMywwLDEiCisJCSAgICAgIDogIj1tIiAoKl9fcHRyKSA6ICJhIiAoX19wdHIpLCAiaSIgKHgpLCAiaSIgKHggKyBuIC0gMSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgQ09QWV9WRUMoaW50IHgsIGludCB5KQoreworCWFzbSB2b2xhdGlsZSAoIlZMUiAlMCwlMSIgOiA6ICJpIiAoeCksICJpIiAoeSkpOworfQorCitzdGF0aWMgdm9pZCByYWlkNl9zMzkwdngkI19nZW5fc3luZHJvbWUoaW50IGRpc2tzLCBzaXplX3QgYnl0ZXMsIHZvaWQgKipwdHJzKQoreworCXN0cnVjdCBrZXJuZWxfZnB1IHZ4c3RhdGU7CisJdTggKipkcHRyLCAqcCwgKnE7CisJaW50IGQsIHosIHowOworCisJa2VybmVsX2ZwdV9iZWdpbigmdnhzdGF0ZSwgS0VSTkVMX1ZYUik7CisJTE9BRF9DT05TVCgpOworCisJZHB0ciA9ICh1OCAqKikgcHRyczsKKwl6MCA9IGRpc2tzIC0gMzsJCS8qIEhpZ2hlc3QgZGF0YSBkaXNrICovCisJcCA9IGRwdHJbejAgKyAxXTsJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW3owICsgMl07CS8qIFJTIHN5bmRyb21lICovCisKKwlmb3IgKGQgPSAwOyBkIDwgYnl0ZXM7IGQgKz0gJCMqTlNJWkUpIHsKKwkJTE9BRF9EQVRBKDAsJCMsJmRwdHJbejBdW2RdKTsKKwkJQ09QWV9WRUMoOCskJCwwKyQkKTsKKwkJZm9yICh6ID0gejAgLSAxOyB6ID49IDA7IHotLSkgeworCQkJTUFTSygxNiskJCw4KyQkKTsKKwkJCUFORCgxNiskJCwxNiskJCwyNSk7CisJCQlTSExCWVRFKDgrJCQsOCskJCk7CisJCQlYT1IoOCskJCw4KyQkLDE2KyQkKTsKKwkJCUxPQURfREFUQSgxNiwkIywmZHB0clt6XVtkXSk7CisJCQlYT1IoMCskJCwwKyQkLDE2KyQkKTsKKwkJCVhPUig4KyQkLDgrJCQsMTYrJCQpOworCQl9CisJCVNUT1JFX0RBVEEoMCwkIywmcFtkXSk7CisJCVNUT1JFX0RBVEEoOCwkIywmcVtkXSk7CisJfQorCWtlcm5lbF9mcHVfZW5kKCZ2eHN0YXRlLCBLRVJORUxfVlhSKTsKK30KKworc3RhdGljIHZvaWQgcmFpZDZfczM5MHZ4JCNfeG9yX3N5bmRyb21lKGludCBkaXNrcywgaW50IHN0YXJ0LCBpbnQgc3RvcCwKKwkJCQkJc2l6ZV90IGJ5dGVzLCB2b2lkICoqcHRycykKK3sKKwlzdHJ1Y3Qga2VybmVsX2ZwdSB2eHN0YXRlOworCXU4ICoqZHB0ciwgKnAsICpxOworCWludCBkLCB6LCB6MDsKKworCWRwdHIgPSAodTggKiopIHB0cnM7CisJejAgPSBzdG9wOwkJLyogUC9RIHJpZ2h0IHNpZGUgb3B0aW1pemF0aW9uICovCisJcCA9IGRwdHJbZGlza3MgLSAyXTsJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW2Rpc2tzIC0gMV07CS8qIFJTIHN5bmRyb21lICovCisKKwlrZXJuZWxfZnB1X2JlZ2luKCZ2eHN0YXRlLCBLRVJORUxfVlhSKTsKKwlMT0FEX0NPTlNUKCk7CisKKwlmb3IgKGQgPSAwOyBkIDwgYnl0ZXM7IGQgKz0gJCMqTlNJWkUpIHsKKwkJLyogUC9RIGRhdGEgcGFnZXMgKi8KKwkJTE9BRF9EQVRBKDAsJCMsJmRwdHJbejBdW2RdKTsKKwkJQ09QWV9WRUMoOCskJCwwKyQkKTsKKwkJZm9yICh6ID0gejAgLSAxOyB6ID49IHN0YXJ0OyB6LS0pIHsKKwkJCU1BU0soMTYrJCQsOCskJCk7CisJCQlBTkQoMTYrJCQsMTYrJCQsMjUpOworCQkJU0hMQllURSg4KyQkLDgrJCQpOworCQkJWE9SKDgrJCQsOCskJCwxNiskJCk7CisJCQlMT0FEX0RBVEEoMTYsJCMsJmRwdHJbel1bZF0pOworCQkJWE9SKDArJCQsMCskJCwxNiskJCk7CisJCQlYT1IoOCskJCw4KyQkLDE2KyQkKTsKKwkJfQorCQkvKiBQL1EgbGVmdCBzaWRlIG9wdGltaXphdGlvbiAqLworCQlmb3IgKHogPSBzdGFydCAtIDE7IHogPj0gMDsgei0tKSB7CisJCQlNQVNLKDE2KyQkLDgrJCQpOworCQkJQU5EKDE2KyQkLDE2KyQkLDI1KTsKKwkJCVNITEJZVEUoOCskJCw4KyQkKTsKKwkJCVhPUig4KyQkLDgrJCQsMTYrJCQpOworCQl9CisJCUxPQURfREFUQSgxNiwkIywmcFtkXSk7CisJCVhPUigxNiskJCwxNiskJCwwKyQkKTsKKwkJU1RPUkVfREFUQSgxNiwkIywmcFtkXSk7CisJCUxPQURfREFUQSgxNiwkIywmcVtkXSk7CisJCVhPUigxNiskJCwxNiskJCw4KyQkKTsKKwkJU1RPUkVfREFUQSgxNiwkIywmcVtkXSk7CisJfQorCWtlcm5lbF9mcHVfZW5kKCZ2eHN0YXRlLCBLRVJORUxfVlhSKTsKK30KKworc3RhdGljIGludCByYWlkNl9zMzkwdngkI192YWxpZCh2b2lkKQoreworCXJldHVybiBNQUNISU5FX0hBU19WWDsKK30KKworY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X3MzOTB2eCQjID0geworCXJhaWQ2X3MzOTB2eCQjX2dlbl9zeW5kcm9tZSwKKwlyYWlkNl9zMzkwdngkI194b3Jfc3luZHJvbWUsCisJcmFpZDZfczM5MHZ4JCNfdmFsaWQsCisJInZ4MTI4eCQjIiwKKwkxCit9OwpkaWZmIC0tZ2l0IGEvbGliL3JhbmRvbTMyLmMgYi9saWIvcmFuZG9tMzIuYwppbmRleCA2OWVkNTkzLi45MTU5ODJiIDEwMDY0NAotLS0gYS9saWIvcmFuZG9tMzIuYworKysgYi9saWIvcmFuZG9tMzIuYwpAQCAtODEsNyArODEsNyBAQAogCXUzMiByZXM7CiAKIAlyZXMgPSBwcmFuZG9tX3UzMl9zdGF0ZShzdGF0ZSk7Ci0JcHV0X2NwdV92YXIoc3RhdGUpOworCXB1dF9jcHVfdmFyKG5ldF9yYW5kX3N0YXRlKTsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xMjgsNyArMTI4LDcgQEAKIAlzdHJ1Y3Qgcm5kX3N0YXRlICpzdGF0ZSA9ICZnZXRfY3B1X3ZhcihuZXRfcmFuZF9zdGF0ZSk7CiAKIAlwcmFuZG9tX2J5dGVzX3N0YXRlKHN0YXRlLCBidWYsIGJ5dGVzKTsKLQlwdXRfY3B1X3ZhcihzdGF0ZSk7CisJcHV0X2NwdV92YXIobmV0X3JhbmRfc3RhdGUpOwogfQogRVhQT1JUX1NZTUJPTChwcmFuZG9tX2J5dGVzKTsKIApkaWZmIC0tZ2l0IGEvbGliL3JoYXNodGFibGUuYyBiL2xpYi9yaGFzaHRhYmxlLmMKaW5kZXggNWQ4NDVmZi4uMzJkMGFkMCAxMDA2NDQKLS0tIGEvbGliL3JoYXNodGFibGUuYworKysgYi9saWIvcmhhc2h0YWJsZS5jCkBAIC0zMCw3ICszMCw3IEBACiAKICNkZWZpbmUgSEFTSF9ERUZBVUxUX1NJWkUJNjRVTAogI2RlZmluZSBIQVNIX01JTl9TSVpFCQk0VQotI2RlZmluZSBCVUNLRVRfTE9DS1NfUEVSX0NQVSAgIDEyOFVMCisjZGVmaW5lIEJVQ0tFVF9MT0NLU19QRVJfQ1BVCTMyVUwKIAogc3RhdGljIHUzMiBoZWFkX2hhc2hmbihzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCiAJCSAgICAgICBjb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwsCkBAIC03MCwyMSArNzAsMjUgQEAKIAl1bnNpZ25lZCBpbnQgbnJfcGNwdXMgPSBudW1fcG9zc2libGVfY3B1cygpOwogI2VuZGlmCiAKLQlucl9wY3B1cyA9IG1pbl90KHVuc2lnbmVkIGludCwgbnJfcGNwdXMsIDMyVUwpOworCW5yX3BjcHVzID0gbWluX3QodW5zaWduZWQgaW50LCBucl9wY3B1cywgNjRVTCk7CiAJc2l6ZSA9IHJvdW5kdXBfcG93X29mX3R3byhucl9wY3B1cyAqIGh0LT5wLmxvY2tzX211bCk7CiAKIAkvKiBOZXZlciBhbGxvY2F0ZSBtb3JlIHRoYW4gMC41IGxvY2tzIHBlciBidWNrZXQgKi8KIAlzaXplID0gbWluX3QodW5zaWduZWQgaW50LCBzaXplLCB0YmwtPnNpemUgPj4gMSk7CiAKIAlpZiAoc2l6ZW9mKHNwaW5sb2NrX3QpICE9IDApIHsKKwkJdGJsLT5sb2NrcyA9IE5VTEw7CiAjaWZkZWYgQ09ORklHX05VTUEKIAkJaWYgKHNpemUgKiBzaXplb2Yoc3BpbmxvY2tfdCkgPiBQQUdFX1NJWkUgJiYKIAkJICAgIGdmcCA9PSBHRlBfS0VSTkVMKQogCQkJdGJsLT5sb2NrcyA9IHZtYWxsb2Moc2l6ZSAqIHNpemVvZihzcGlubG9ja190KSk7Ci0JCWVsc2UKICNlbmRpZgotCQl0YmwtPmxvY2tzID0ga21hbGxvY19hcnJheShzaXplLCBzaXplb2Yoc3BpbmxvY2tfdCksCi0JCQkJCSAgIGdmcCk7CisJCWlmIChnZnAgIT0gR0ZQX0tFUk5FTCkKKwkJCWdmcCB8PSBfX0dGUF9OT1dBUk4gfCBfX0dGUF9OT1JFVFJZOworCisJCWlmICghdGJsLT5sb2NrcykKKwkJCXRibC0+bG9ja3MgPSBrbWFsbG9jX2FycmF5KHNpemUsIHNpemVvZihzcGlubG9ja190KSwKKwkJCQkJCSAgIGdmcCk7CiAJCWlmICghdGJsLT5sb2NrcykKIAkJCXJldHVybiAtRU5PTUVNOwogCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQpAQCAtMzIxLDEyICszMjUsMTQgQEAKIHN0YXRpYyBpbnQgcmhhc2h0YWJsZV9zaHJpbmsoc3RydWN0IHJoYXNodGFibGUgKmh0KQogewogCXN0cnVjdCBidWNrZXRfdGFibGUgKm5ld190YmwsICpvbGRfdGJsID0gcmh0X2RlcmVmZXJlbmNlKGh0LT50YmwsIGh0KTsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgbmVsZW1zID0gYXRvbWljX3JlYWQoJmh0LT5uZWxlbXMpOworCXVuc2lnbmVkIGludCBzaXplID0gMDsKIAlpbnQgZXJyOwogCiAJQVNTRVJUX1JIVF9NVVRFWChodCk7CiAKLQlzaXplID0gcm91bmR1cF9wb3dfb2ZfdHdvKGF0b21pY19yZWFkKCZodC0+bmVsZW1zKSAqIDMgLyAyKTsKKwlpZiAobmVsZW1zKQorCQlzaXplID0gcm91bmR1cF9wb3dfb2ZfdHdvKG5lbGVtcyAqIDMgLyAyKTsKIAlpZiAoc2l6ZSA8IGh0LT5wLm1pbl9zaXplKQogCQlzaXplID0gaHQtPnAubWluX3NpemU7CiAKQEAgLTM3MiwyMiArMzc4LDggQEAKIAkJc2NoZWR1bGVfd29yaygmaHQtPnJ1bl93b3JrKTsKIH0KIAotc3RhdGljIGJvb2wgcmhhc2h0YWJsZV9jaGVja19lbGFzdGljaXR5KHN0cnVjdCByaGFzaHRhYmxlICpodCwKLQkJCQkJc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsLAotCQkJCQl1bnNpZ25lZCBpbnQgaGFzaCkKLXsKLQl1bnNpZ25lZCBpbnQgZWxhc3RpY2l0eSA9IGh0LT5lbGFzdGljaXR5OwotCXN0cnVjdCByaGFzaF9oZWFkICpoZWFkOwotCi0Jcmh0X2Zvcl9lYWNoKGhlYWQsIHRibCwgaGFzaCkKLQkJaWYgKCEtLWVsYXN0aWNpdHkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxzZTsKLX0KLQotaW50IHJoYXNodGFibGVfaW5zZXJ0X3JlaGFzaChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCi0JCQkgICAgIHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCkKK3N0YXRpYyBpbnQgcmhhc2h0YWJsZV9pbnNlcnRfcmVoYXNoKHN0cnVjdCByaGFzaHRhYmxlICpodCwKKwkJCQkgICAgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsKQogewogCXN0cnVjdCBidWNrZXRfdGFibGUgKm9sZF90Ymw7CiAJc3RydWN0IGJ1Y2tldF90YWJsZSAqbmV3X3RibDsKQEAgLTQzMyw2MSArNDI1LDE3MiBAQAogCiAJcmV0dXJuIGVycjsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHJoYXNodGFibGVfaW5zZXJ0X3JlaGFzaCk7CiAKLXN0cnVjdCBidWNrZXRfdGFibGUgKnJoYXNodGFibGVfaW5zZXJ0X3Nsb3coc3RydWN0IHJoYXNodGFibGUgKmh0LAotCQkJCQkgICAgY29uc3Qgdm9pZCAqa2V5LAotCQkJCQkgICAgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKLQkJCQkJICAgIHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCkKK3N0YXRpYyB2b2lkICpyaGFzaHRhYmxlX2xvb2t1cF9vbmUoc3RydWN0IHJoYXNodGFibGUgKmh0LAorCQkJCSAgIHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCwgdW5zaWduZWQgaW50IGhhc2gsCisJCQkJICAgY29uc3Qgdm9pZCAqa2V5LCBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqKQogeworCXN0cnVjdCByaGFzaHRhYmxlX2NvbXBhcmVfYXJnIGFyZyA9IHsKKwkJLmh0ID0gaHQsCisJCS5rZXkgPSBrZXksCisJfTsKKwlzdHJ1Y3Qgcmhhc2hfaGVhZCBfX3JjdSAqKnBwcmV2OwogCXN0cnVjdCByaGFzaF9oZWFkICpoZWFkOwotCXVuc2lnbmVkIGludCBoYXNoOwotCWludCBlcnI7CisJaW50IGVsYXN0aWNpdHk7CiAKLQl0YmwgPSByaGFzaHRhYmxlX2xhc3RfdGFibGUoaHQsIHRibCk7Ci0JaGFzaCA9IGhlYWRfaGFzaGZuKGh0LCB0YmwsIG9iaik7Ci0Jc3Bpbl9sb2NrX25lc3RlZChyaHRfYnVja2V0X2xvY2sodGJsLCBoYXNoKSwgU0lOR0xFX0RFUFRIX05FU1RJTkcpOworCWVsYXN0aWNpdHkgPSBodC0+ZWxhc3RpY2l0eTsKKwlwcHJldiA9ICZ0YmwtPmJ1Y2tldHNbaGFzaF07CisJcmh0X2Zvcl9lYWNoKGhlYWQsIHRibCwgaGFzaCkgeworCQlzdHJ1Y3QgcmhsaXN0X2hlYWQgKmxpc3Q7CisJCXN0cnVjdCByaGxpc3RfaGVhZCAqcGxpc3Q7CiAKLQllcnIgPSAtRUVYSVNUOwotCWlmIChrZXkgJiYgcmhhc2h0YWJsZV9sb29rdXBfZmFzdChodCwga2V5LCBodC0+cCkpCi0JCWdvdG8gZXhpdDsKKwkJZWxhc3RpY2l0eS0tOworCQlpZiAoIWtleSB8fAorCQkgICAgKGh0LT5wLm9ial9jbXBmbiA/CisJCSAgICAgaHQtPnAub2JqX2NtcGZuKCZhcmcsIHJodF9vYmooaHQsIGhlYWQpKSA6CisJCSAgICAgcmhhc2h0YWJsZV9jb21wYXJlKCZhcmcsIHJodF9vYmooaHQsIGhlYWQpKSkpCisJCQljb250aW51ZTsKIAotCWVyciA9IC1FMkJJRzsKKwkJaWYgKCFodC0+cmhsaXN0KQorCQkJcmV0dXJuIHJodF9vYmooaHQsIGhlYWQpOworCisJCWxpc3QgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgcmhsaXN0X2hlYWQsIHJoZWFkKTsKKwkJcGxpc3QgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHJobGlzdF9oZWFkLCByaGVhZCk7CisKKwkJUkNVX0lOSVRfUE9JTlRFUihsaXN0LT5uZXh0LCBwbGlzdCk7CisJCWhlYWQgPSByaHRfZGVyZWZlcmVuY2VfYnVja2V0KGhlYWQtPm5leHQsIHRibCwgaGFzaCk7CisJCVJDVV9JTklUX1BPSU5URVIobGlzdC0+cmhlYWQubmV4dCwgaGVhZCk7CisJCXJjdV9hc3NpZ25fcG9pbnRlcigqcHByZXYsIG9iaik7CisKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGVsYXN0aWNpdHkgPD0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CisKKwlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKK30KKworc3RhdGljIHN0cnVjdCBidWNrZXRfdGFibGUgKnJoYXNodGFibGVfaW5zZXJ0X29uZShzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkJCQkgIHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCwKKwkJCQkJCSAgdW5zaWduZWQgaW50IGhhc2gsCisJCQkJCQkgIHN0cnVjdCByaGFzaF9oZWFkICpvYmosCisJCQkJCQkgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqbmV3X3RibDsKKwlzdHJ1Y3Qgcmhhc2hfaGVhZCAqaGVhZDsKKworCWlmICghSVNfRVJSX09SX05VTEwoZGF0YSkpCisJCXJldHVybiBFUlJfUFRSKC1FRVhJU1QpOworCisJaWYgKFBUUl9FUlIoZGF0YSkgIT0gLUVBR0FJTiAmJiBQVFJfRVJSKGRhdGEpICE9IC1FTk9FTlQpCisJCXJldHVybiBFUlJfQ0FTVChkYXRhKTsKKworCW5ld190YmwgPSByY3VfZGVyZWZlcmVuY2UodGJsLT5mdXR1cmVfdGJsKTsKKwlpZiAobmV3X3RibCkKKwkJcmV0dXJuIG5ld190Ymw7CisKKwlpZiAoUFRSX0VSUihkYXRhKSAhPSAtRU5PRU5UKQorCQlyZXR1cm4gRVJSX0NBU1QoZGF0YSk7CisKIAlpZiAodW5saWtlbHkocmh0X2dyb3dfYWJvdmVfbWF4KGh0LCB0YmwpKSkKLQkJZ290byBleGl0OworCQlyZXR1cm4gRVJSX1BUUigtRTJCSUcpOwogCi0JZXJyID0gLUVBR0FJTjsKLQlpZiAocmhhc2h0YWJsZV9jaGVja19lbGFzdGljaXR5KGh0LCB0YmwsIGhhc2gpIHx8Ci0JICAgIHJodF9ncm93X2Fib3ZlXzEwMChodCwgdGJsKSkKLQkJZ290byBleGl0OwotCi0JZXJyID0gMDsKKwlpZiAodW5saWtlbHkocmh0X2dyb3dfYWJvdmVfMTAwKGh0LCB0YmwpKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CiAKIAloZWFkID0gcmh0X2RlcmVmZXJlbmNlX2J1Y2tldCh0YmwtPmJ1Y2tldHNbaGFzaF0sIHRibCwgaGFzaCk7CiAKIAlSQ1VfSU5JVF9QT0lOVEVSKG9iai0+bmV4dCwgaGVhZCk7CisJaWYgKGh0LT5yaGxpc3QpIHsKKwkJc3RydWN0IHJobGlzdF9oZWFkICpsaXN0OworCisJCWxpc3QgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgcmhsaXN0X2hlYWQsIHJoZWFkKTsKKwkJUkNVX0lOSVRfUE9JTlRFUihsaXN0LT5uZXh0LCBOVUxMKTsKKwl9CiAKIAlyY3VfYXNzaWduX3BvaW50ZXIodGJsLT5idWNrZXRzW2hhc2hdLCBvYmopOwogCiAJYXRvbWljX2luYygmaHQtPm5lbGVtcyk7CisJaWYgKHJodF9ncm93X2Fib3ZlXzc1KGh0LCB0YmwpKQorCQlzY2hlZHVsZV93b3JrKCZodC0+cnVuX3dvcmspOwogCi1leGl0OgotCXNwaW5fdW5sb2NrKHJodF9idWNrZXRfbG9jayh0YmwsIGhhc2gpKTsKKwlyZXR1cm4gTlVMTDsKK30KIAotCWlmIChlcnIgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZSBpZiAoZXJyID09IC1FQUdBSU4pCi0JCXJldHVybiB0Ymw7Ci0JZWxzZQotCQlyZXR1cm4gRVJSX1BUUihlcnIpOworc3RhdGljIHZvaWQgKnJoYXNodGFibGVfdHJ5X2luc2VydChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSwKKwkJCQkgICBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqKQoreworCXN0cnVjdCBidWNrZXRfdGFibGUgKm5ld190Ymw7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOworCXVuc2lnbmVkIGludCBoYXNoOworCXNwaW5sb2NrX3QgKmxvY2s7CisJdm9pZCAqZGF0YTsKKworCXRibCA9IHJjdV9kZXJlZmVyZW5jZShodC0+dGJsKTsKKworCS8qIEFsbCBpbnNlcnRpb25zIG11c3QgZ3JhYiB0aGUgb2xkZXN0IHRhYmxlIGNvbnRhaW5pbmcKKwkgKiB0aGUgaGFzaGVkIGJ1Y2tldCB0aGF0IGlzIHlldCB0byBiZSByZWhhc2hlZC4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCWhhc2ggPSByaHRfaGVhZF9oYXNoZm4oaHQsIHRibCwgb2JqLCBodC0+cCk7CisJCWxvY2sgPSByaHRfYnVja2V0X2xvY2sodGJsLCBoYXNoKTsKKwkJc3Bpbl9sb2NrX2JoKGxvY2spOworCisJCWlmICh0YmwtPnJlaGFzaCA8PSBoYXNoKQorCQkJYnJlYWs7CisKKwkJc3Bpbl91bmxvY2tfYmgobG9jayk7CisJCXRibCA9IHJjdV9kZXJlZmVyZW5jZSh0YmwtPmZ1dHVyZV90YmwpOworCX0KKworCWRhdGEgPSByaGFzaHRhYmxlX2xvb2t1cF9vbmUoaHQsIHRibCwgaGFzaCwga2V5LCBvYmopOworCW5ld190YmwgPSByaGFzaHRhYmxlX2luc2VydF9vbmUoaHQsIHRibCwgaGFzaCwgb2JqLCBkYXRhKTsKKwlpZiAoUFRSX0VSUihuZXdfdGJsKSAhPSAtRUVYSVNUKQorCQlkYXRhID0gRVJSX0NBU1QobmV3X3RibCk7CisKKwl3aGlsZSAoIUlTX0VSUl9PUl9OVUxMKG5ld190YmwpKSB7CisJCXRibCA9IG5ld190Ymw7CisJCWhhc2ggPSByaHRfaGVhZF9oYXNoZm4oaHQsIHRibCwgb2JqLCBodC0+cCk7CisJCXNwaW5fbG9ja19uZXN0ZWQocmh0X2J1Y2tldF9sb2NrKHRibCwgaGFzaCksCisJCQkJIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKworCQlkYXRhID0gcmhhc2h0YWJsZV9sb29rdXBfb25lKGh0LCB0YmwsIGhhc2gsIGtleSwgb2JqKTsKKwkJbmV3X3RibCA9IHJoYXNodGFibGVfaW5zZXJ0X29uZShodCwgdGJsLCBoYXNoLCBvYmosIGRhdGEpOworCQlpZiAoUFRSX0VSUihuZXdfdGJsKSAhPSAtRUVYSVNUKQorCQkJZGF0YSA9IEVSUl9DQVNUKG5ld190YmwpOworCisJCXNwaW5fdW5sb2NrKHJodF9idWNrZXRfbG9jayh0YmwsIGhhc2gpKTsKKwl9CisKKwlzcGluX3VubG9ja19iaChsb2NrKTsKKworCWlmIChQVFJfRVJSKGRhdGEpID09IC1FQUdBSU4pCisJCWRhdGEgPSBFUlJfUFRSKHJoYXNodGFibGVfaW5zZXJ0X3JlaGFzaChodCwgdGJsKSA/OgorCQkJICAgICAgIC1FQUdBSU4pOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3ZvaWQgKnJoYXNodGFibGVfaW5zZXJ0X3Nsb3coc3RydWN0IHJoYXNodGFibGUgKmh0LCBjb25zdCB2b2lkICprZXksCisJCQkgICAgIHN0cnVjdCByaGFzaF9oZWFkICpvYmopCit7CisJdm9pZCAqZGF0YTsKKworCWRvIHsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlkYXRhID0gcmhhc2h0YWJsZV90cnlfaW5zZXJ0KGh0LCBrZXksIG9iaik7CisJCXJjdV9yZWFkX3VubG9jaygpOworCX0gd2hpbGUgKFBUUl9FUlIoZGF0YSkgPT0gLUVBR0FJTik7CisKKwlyZXR1cm4gZGF0YTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJoYXNodGFibGVfaW5zZXJ0X3Nsb3cpOwogCiAvKioKLSAqIHJoYXNodGFibGVfd2Fsa19pbml0IC0gSW5pdGlhbGlzZSBhbiBpdGVyYXRvcgorICogcmhhc2h0YWJsZV93YWxrX2VudGVyIC0gSW5pdGlhbGlzZSBhbiBpdGVyYXRvcgogICogQGh0OgkJVGFibGUgdG8gd2FsayBvdmVyCiAgKiBAaXRlcjoJSGFzaCB0YWJsZSBJdGVyYXRvcgotICogQGdmcDoJR0ZQIGZsYWdzIGZvciBhbGxvY2F0aW9ucwogICoKICAqIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgYSBoYXNoIHRhYmxlIHdhbGsuCiAgKgpAQCAtNTAyLDMwICs2MDUsMjIgQEAKICAqIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwIHNvIHlvdSBtdXN0IG5vdCBjYWxsIGl0IGZyb20gaW50ZXJydXB0CiAgKiBjb250ZXh0IG9yIHdpdGggc3BpbiBsb2NrcyBoZWxkLgogICoKLSAqIFlvdSBtdXN0IGNhbGwgcmhhc2h0YWJsZV93YWxrX2V4aXQgaWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zCi0gKiBzdWNjZXNzZnVsbHkuCisgKiBZb3UgbXVzdCBjYWxsIHJoYXNodGFibGVfd2Fsa19leGl0IGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KICAqLwotaW50IHJoYXNodGFibGVfd2Fsa19pbml0KHN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IHJoYXNodGFibGVfaXRlciAqaXRlciwKLQkJCSBnZnBfdCBnZnApCit2b2lkIHJoYXNodGFibGVfd2Fsa19lbnRlcihzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKml0ZXIpCiB7CiAJaXRlci0+aHQgPSBodDsKIAlpdGVyLT5wID0gTlVMTDsKIAlpdGVyLT5zbG90ID0gMDsKIAlpdGVyLT5za2lwID0gMDsKIAotCWl0ZXItPndhbGtlciA9IGttYWxsb2Moc2l6ZW9mKCppdGVyLT53YWxrZXIpLCBnZnApOwotCWlmICghaXRlci0+d2Fsa2VyKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCXNwaW5fbG9jaygmaHQtPmxvY2spOwotCWl0ZXItPndhbGtlci0+dGJsID0KKwlpdGVyLT53YWxrZXIudGJsID0KIAkJcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChodC0+dGJsLCBsb2NrZGVwX2lzX2hlbGQoJmh0LT5sb2NrKSk7Ci0JbGlzdF9hZGQoJml0ZXItPndhbGtlci0+bGlzdCwgJml0ZXItPndhbGtlci0+dGJsLT53YWxrZXJzKTsKKwlsaXN0X2FkZCgmaXRlci0+d2Fsa2VyLmxpc3QsICZpdGVyLT53YWxrZXIudGJsLT53YWxrZXJzKTsKIAlzcGluX3VubG9jaygmaHQtPmxvY2spOwotCi0JcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChyaGFzaHRhYmxlX3dhbGtfaW5pdCk7CitFWFBPUlRfU1lNQk9MX0dQTChyaGFzaHRhYmxlX3dhbGtfZW50ZXIpOwogCiAvKioKICAqIHJoYXNodGFibGVfd2Fsa19leGl0IC0gRnJlZSBhbiBpdGVyYXRvcgpAQCAtNTM2LDEwICs2MzEsOSBAQAogdm9pZCByaGFzaHRhYmxlX3dhbGtfZXhpdChzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICppdGVyKQogewogCXNwaW5fbG9jaygmaXRlci0+aHQtPmxvY2spOwotCWlmIChpdGVyLT53YWxrZXItPnRibCkKLQkJbGlzdF9kZWwoJml0ZXItPndhbGtlci0+bGlzdCk7CisJaWYgKGl0ZXItPndhbGtlci50YmwpCisJCWxpc3RfZGVsKCZpdGVyLT53YWxrZXIubGlzdCk7CiAJc3Bpbl91bmxvY2soJml0ZXItPmh0LT5sb2NrKTsKLQlrZnJlZShpdGVyLT53YWxrZXIpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmhhc2h0YWJsZV93YWxrX2V4aXQpOwogCkBAIC01NjUsMTIgKzY1OSwxMiBAQAogCXJjdV9yZWFkX2xvY2soKTsKIAogCXNwaW5fbG9jaygmaHQtPmxvY2spOwotCWlmIChpdGVyLT53YWxrZXItPnRibCkKLQkJbGlzdF9kZWwoJml0ZXItPndhbGtlci0+bGlzdCk7CisJaWYgKGl0ZXItPndhbGtlci50YmwpCisJCWxpc3RfZGVsKCZpdGVyLT53YWxrZXIubGlzdCk7CiAJc3Bpbl91bmxvY2soJmh0LT5sb2NrKTsKIAotCWlmICghaXRlci0+d2Fsa2VyLT50YmwpIHsKLQkJaXRlci0+d2Fsa2VyLT50YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KGh0LT50YmwsIGh0KTsKKwlpZiAoIWl0ZXItPndhbGtlci50YmwpIHsKKwkJaXRlci0+d2Fsa2VyLnRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UoaHQtPnRibCwgaHQpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKQEAgLTU5MiwxMiArNjg2LDE3IEBACiAgKi8KIHZvaWQgKnJoYXNodGFibGVfd2Fsa19uZXh0KHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKml0ZXIpCiB7Ci0Jc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsID0gaXRlci0+d2Fsa2VyLT50Ymw7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsID0gaXRlci0+d2Fsa2VyLnRibDsKKwlzdHJ1Y3QgcmhsaXN0X2hlYWQgKmxpc3QgPSBpdGVyLT5saXN0OwogCXN0cnVjdCByaGFzaHRhYmxlICpodCA9IGl0ZXItPmh0OwogCXN0cnVjdCByaGFzaF9oZWFkICpwID0gaXRlci0+cDsKKwlib29sIHJobGlzdCA9IGh0LT5yaGxpc3Q7CiAKIAlpZiAocCkgewotCQlwID0gcmh0X2RlcmVmZXJlbmNlX2J1Y2tldF9yY3UocC0+bmV4dCwgdGJsLCBpdGVyLT5zbG90KTsKKwkJaWYgKCFyaGxpc3QgfHwgIShsaXN0ID0gcmN1X2RlcmVmZXJlbmNlKGxpc3QtPm5leHQpKSkgeworCQkJcCA9IHJjdV9kZXJlZmVyZW5jZShwLT5uZXh0KTsKKwkJCWxpc3QgPSBjb250YWluZXJfb2YocCwgc3RydWN0IHJobGlzdF9oZWFkLCByaGVhZCk7CisJCX0KIAkJZ290byBuZXh0OwogCX0KIApAQCAtNjA1LDYgKzcwNCwxOCBAQAogCQlpbnQgc2tpcCA9IGl0ZXItPnNraXA7CiAKIAkJcmh0X2Zvcl9lYWNoX3JjdShwLCB0YmwsIGl0ZXItPnNsb3QpIHsKKwkJCWlmIChyaGxpc3QpIHsKKwkJCQlsaXN0ID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCByaGxpc3RfaGVhZCwKKwkJCQkJCSAgICByaGVhZCk7CisJCQkJZG8geworCQkJCQlpZiAoIXNraXApCisJCQkJCQlnb3RvIG5leHQ7CisJCQkJCXNraXAtLTsKKwkJCQkJbGlzdCA9IHJjdV9kZXJlZmVyZW5jZShsaXN0LT5uZXh0KTsKKwkJCQl9IHdoaWxlIChsaXN0KTsKKworCQkJCWNvbnRpbnVlOworCQkJfQogCQkJaWYgKCFza2lwKQogCQkJCWJyZWFrOwogCQkJc2tpcC0tOwpAQCAtNjE0LDcgKzcyNSw4IEBACiAJCWlmICghcmh0X2lzX2FfbnVsbHMocCkpIHsKIAkJCWl0ZXItPnNraXArKzsKIAkJCWl0ZXItPnAgPSBwOwotCQkJcmV0dXJuIHJodF9vYmooaHQsIHApOworCQkJaXRlci0+bGlzdCA9IGxpc3Q7CisJCQlyZXR1cm4gcmh0X29iaihodCwgcmhsaXN0ID8gJmxpc3QtPnJoZWFkIDogcCk7CiAJCX0KIAogCQlpdGVyLT5za2lwID0gMDsKQEAgLTYyNSw4ICs3MzcsOCBAQAogCS8qIEVuc3VyZSB3ZSBzZWUgYW55IG5ldyB0YWJsZXMuICovCiAJc21wX3JtYigpOwogCi0JaXRlci0+d2Fsa2VyLT50YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KHRibC0+ZnV0dXJlX3RibCwgaHQpOwotCWlmIChpdGVyLT53YWxrZXItPnRibCkgeworCWl0ZXItPndhbGtlci50YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KHRibC0+ZnV0dXJlX3RibCwgaHQpOworCWlmIChpdGVyLT53YWxrZXIudGJsKSB7CiAJCWl0ZXItPnNsb3QgPSAwOwogCQlpdGVyLT5za2lwID0gMDsKIAkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CkBAIC02NDYsNyArNzU4LDcgQEAKIAlfX3JlbGVhc2VzKFJDVSkKIHsKIAlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQ7Ci0Jc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsID0gaXRlci0+d2Fsa2VyLT50Ymw7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsID0gaXRlci0+d2Fsa2VyLnRibDsKIAogCWlmICghdGJsKQogCQlnb3RvIG91dDsKQEAgLTY1NSw5ICs3NjcsOSBAQAogCiAJc3Bpbl9sb2NrKCZodC0+bG9jayk7CiAJaWYgKHRibC0+cmVoYXNoIDwgdGJsLT5zaXplKQotCQlsaXN0X2FkZCgmaXRlci0+d2Fsa2VyLT5saXN0LCAmdGJsLT53YWxrZXJzKTsKKwkJbGlzdF9hZGQoJml0ZXItPndhbGtlci5saXN0LCAmdGJsLT53YWxrZXJzKTsKIAllbHNlCi0JCWl0ZXItPndhbGtlci0+dGJsID0gTlVMTDsKKwkJaXRlci0+d2Fsa2VyLnRibCA9IE5VTEw7CiAJc3Bpbl91bmxvY2soJmh0LT5sb2NrKTsKIAogCWl0ZXItPnAgPSBOVUxMOwpAQCAtODAzLDYgKzkxNSw0OCBAQAogRVhQT1JUX1NZTUJPTF9HUEwocmhhc2h0YWJsZV9pbml0KTsKIAogLyoqCisgKiByaGx0YWJsZV9pbml0IC0gaW5pdGlhbGl6ZSBhIG5ldyBoYXNoIGxpc3QgdGFibGUKKyAqIEBobHQ6CWhhc2ggbGlzdCB0YWJsZSB0byBiZSBpbml0aWFsaXplZAorICogQHBhcmFtczoJY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKgorICogSW5pdGlhbGl6ZXMgYSBuZXcgaGFzaCBsaXN0IHRhYmxlLgorICoKKyAqIFNlZSBkb2N1bWVudGF0aW9uIGZvciByaGFzaHRhYmxlX2luaXQuCisgKi8KK2ludCByaGx0YWJsZV9pbml0KHN0cnVjdCByaGx0YWJsZSAqaGx0LCBjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgKnBhcmFtcykKK3sKKwlpbnQgZXJyOworCisJLyogTm8gcmhsaXN0IE5VTExzIG1hcmtpbmcgZm9yIG5vdy4gKi8KKwlpZiAocGFyYW1zLT5udWxsc19iYXNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IHJoYXNodGFibGVfaW5pdCgmaGx0LT5odCwgcGFyYW1zKTsKKwlobHQtPmh0LnJobGlzdCA9IHRydWU7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJobHRhYmxlX2luaXQpOworCitzdGF0aWMgdm9pZCByaGFzaHRhYmxlX2ZyZWVfb25lKHN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKKwkJCQl2b2lkICgqZnJlZV9mbikodm9pZCAqcHRyLCB2b2lkICphcmcpLAorCQkJCXZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcmhsaXN0X2hlYWQgKmxpc3Q7CisKKwlpZiAoIWh0LT5yaGxpc3QpIHsKKwkJZnJlZV9mbihyaHRfb2JqKGh0LCBvYmopLCBhcmcpOworCQlyZXR1cm47CisJfQorCisJbGlzdCA9IGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCByaGxpc3RfaGVhZCwgcmhlYWQpOworCWRvIHsKKwkJb2JqID0gJmxpc3QtPnJoZWFkOworCQlsaXN0ID0gcmh0X2RlcmVmZXJlbmNlKGxpc3QtPm5leHQsIGh0KTsKKwkJZnJlZV9mbihyaHRfb2JqKGh0LCBvYmopLCBhcmcpOworCX0gd2hpbGUgKGxpc3QpOworfQorCisvKioKICAqIHJoYXNodGFibGVfZnJlZV9hbmRfZGVzdHJveSAtIGZyZWUgZWxlbWVudHMgYW5kIGRlc3Ryb3kgaGFzaCB0YWJsZQogICogQGh0OgkJdGhlIGhhc2ggdGFibGUgdG8gZGVzdHJveQogICogQGZyZWVfZm46CWNhbGxiYWNrIHRvIHJlbGVhc2UgcmVzb3VyY2VzIG9mIGVsZW1lbnQKQEAgLTgzOSw3ICs5OTMsNyBAQAogCQkJICAgICBwb3MgPSBuZXh0LAogCQkJICAgICBuZXh0ID0gIXJodF9pc19hX251bGxzKHBvcykgPwogCQkJCQlyaHRfZGVyZWZlcmVuY2UocG9zLT5uZXh0LCBodCkgOiBOVUxMKQotCQkJCWZyZWVfZm4ocmh0X29iaihodCwgcG9zKSwgYXJnKTsKKwkJCQlyaGFzaHRhYmxlX2ZyZWVfb25lKGh0LCBwb3MsIGZyZWVfZm4sIGFyZyk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2xpYi9zeXNjYWxsLmMgYi9saWIvc3lzY2FsbC5jCmluZGV4IGUzMGUwMzkuLjYzMjM5ZTAgMTAwNjQ0Ci0tLSBhL2xpYi9zeXNjYWxsLmMKKysrIGIvbGliL3N5c2NhbGwuYwpAQCAtNyw5ICs3LDE5IEBACiAJCQkgICB1bnNpZ25lZCBsb25nIGFyZ3NbNl0sIHVuc2lnbmVkIGludCBtYXhhcmdzLAogCQkJICAgdW5zaWduZWQgbG9uZyAqc3AsIHVuc2lnbmVkIGxvbmcgKnBjKQogewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKHRhcmdldCk7Ci0JaWYgKHVubGlrZWx5KCFyZWdzKSkKKwlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKKworCWlmICghdHJ5X2dldF90YXNrX3N0YWNrKHRhcmdldCkpIHsKKwkJLyogVGFzayBoYXMgbm8gc3RhY2ssIHNvIHRoZSB0YXNrIGlzbid0IGluIGEgc3lzY2FsbC4gKi8KKwkJKmNhbGxubyA9IC0xOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZWdzID0gdGFza19wdF9yZWdzKHRhcmdldCk7CisJaWYgKHVubGlrZWx5KCFyZWdzKSkgeworCQlwdXRfdGFza19zdGFjayh0YXJnZXQpOwogCQlyZXR1cm4gLUVBR0FJTjsKKwl9CiAKIAkqc3AgPSB1c2VyX3N0YWNrX3BvaW50ZXIocmVncyk7CiAJKnBjID0gaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKTsKQEAgLTE4LDYgKzI4LDcgQEAKIAlpZiAoKmNhbGxubyAhPSAtMUwgJiYgbWF4YXJncyA+IDApCiAJCXN5c2NhbGxfZ2V0X2FyZ3VtZW50cyh0YXJnZXQsIHJlZ3MsIDAsIG1heGFyZ3MsIGFyZ3MpOwogCisJcHV0X3Rhc2tfc3RhY2sodGFyZ2V0KTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL3Rlc3RfYnBmLmMgYi9saWIvdGVzdF9icGYuYwppbmRleCA5M2Y0NTAxLi45NDM0NmI0IDEwMDY0NAotLS0gYS9saWIvdGVzdF9icGYuYworKysgYi9saWIvdGVzdF9icGYuYwpAQCAtNTQ4NSw2ICs1NDg1LDcgQEAKIAlza2ItPmhhc2ggPSBTS0JfSEFTSDsKIAlza2ItPnF1ZXVlX21hcHBpbmcgPSBTS0JfUVVFVUVfTUFQOwogCXNrYi0+dmxhbl90Y2kgPSBTS0JfVkxBTl9UQ0k7CisJc2tiLT52bGFuX3Byb3RvID0gaHRvbnMoRVRIX1BfSVApOwogCXNrYi0+ZGV2ID0gJmRldjsKIAlza2ItPmRldi0+aWZpbmRleCA9IFNLQl9ERVZfSUZJTkRFWDsKIAlza2ItPmRldi0+dHlwZSA9IFNLQl9ERVZfVFlQRTsKZGlmZiAtLWdpdCBhL2xpYi90ZXN0X2hhc2guYyBiL2xpYi90ZXN0X2hhc2guYwppbmRleCA2NmM1ZmM4Li5jYWMyMGM1IDEwMDY0NAotLS0gYS9saWIvdGVzdF9oYXNoLmMKKysrIGIvbGliL3Rlc3RfaGFzaC5jCkBAIC0xNDMsNyArMTQzLDcgQEAKIHRlc3RfaGFzaF9pbml0KHZvaWQpCiB7CiAJY2hhciBidWZbU0laRSsxXTsKLQl1MzIgc3RyaW5nX29yID0gMCwgaGFzaF9vclsyXVszM10gPSB7IDAgfTsKKwl1MzIgc3RyaW5nX29yID0gMCwgaGFzaF9vclsyXVszM10gPSB7IHsgMCwgfSB9OwogCXVuc2lnbmVkIHRlc3RzID0gMDsKIAl1bnNpZ25lZCBsb25nIGxvbmcgaDY0ID0gMDsKIAlpbnQgaSwgajsKQEAgLTIxOSwyMSArMjE5LDI3IEBACiAJfQogCiAJLyogSXNzdWUgbm90aWNlcyBhYm91dCBza2lwcGVkIHRlc3RzLiAqLwotI2lmbmRlZiBIQVZFX0FSQ0hfX0hBU0hfMzIKLQlwcl9pbmZvKCJfX2hhc2hfMzIoKSBoYXMgbm8gYXJjaCBpbXBsZW1lbnRhdGlvbiB0byB0ZXN0LiIpOwotI2VsaWYgSEFWRV9BUkNIX19IQVNIXzMyICE9IDEKKyNpZmRlZiBIQVZFX0FSQ0hfX0hBU0hfMzIKKyNpZiBIQVZFX0FSQ0hfX0hBU0hfMzIgIT0gMQogCXByX2luZm8oIl9faGFzaF8zMigpIGlzIGFyY2gtc3BlY2lmaWM7IG5vdCBjb21wYXJlZCB0byBnZW5lcmljLiIpOwogI2VuZGlmCi0jaWZuZGVmIEhBVkVfQVJDSF9IQVNIXzMyCi0JcHJfaW5mbygiaGFzaF8zMigpIGhhcyBubyBhcmNoIGltcGxlbWVudGF0aW9uIHRvIHRlc3QuIik7Ci0jZWxpZiBIQVZFX0FSQ0hfSEFTSF8zMiAhPSAxCisjZWxzZQorCXByX2luZm8oIl9faGFzaF8zMigpIGhhcyBubyBhcmNoIGltcGxlbWVudGF0aW9uIHRvIHRlc3QuIik7CisjZW5kaWYKKyNpZmRlZiBIQVZFX0FSQ0hfSEFTSF8zMgorI2lmIEhBVkVfQVJDSF9IQVNIXzMyICE9IDEKIAlwcl9pbmZvKCJoYXNoXzMyKCkgaXMgYXJjaC1zcGVjaWZpYzsgbm90IGNvbXBhcmVkIHRvIGdlbmVyaWMuIik7CiAjZW5kaWYKLSNpZm5kZWYgSEFWRV9BUkNIX0hBU0hfNjQKLQlwcl9pbmZvKCJoYXNoXzY0KCkgaGFzIG5vIGFyY2ggaW1wbGVtZW50YXRpb24gdG8gdGVzdC4iKTsKLSNlbGlmIEhBVkVfQVJDSF9IQVNIXzY0ICE9IDEKKyNlbHNlCisJcHJfaW5mbygiaGFzaF8zMigpIGhhcyBubyBhcmNoIGltcGxlbWVudGF0aW9uIHRvIHRlc3QuIik7CisjZW5kaWYKKyNpZmRlZiBIQVZFX0FSQ0hfSEFTSF82NAorI2lmIEhBVkVfQVJDSF9IQVNIXzY0ICE9IDEKIAlwcl9pbmZvKCJoYXNoXzY0KCkgaXMgYXJjaC1zcGVjaWZpYzsgbm90IGNvbXBhcmVkIHRvIGdlbmVyaWMuIik7CiAjZW5kaWYKKyNlbHNlCisJcHJfaW5mbygiaGFzaF82NCgpIGhhcyBubyBhcmNoIGltcGxlbWVudGF0aW9uIHRvIHRlc3QuIik7CisjZW5kaWYKIAogCXByX25vdGljZSgiJXUgdGVzdHMgcGFzc2VkLiIsIHRlc3RzKTsKIApkaWZmIC0tZ2l0IGEvbGliL3Rlc3Rfcmhhc2h0YWJsZS5jIGIvbGliL3Rlc3Rfcmhhc2h0YWJsZS5jCmluZGV4IDI5N2ZkYjUuLjY0ZTg5OWIgMTAwNjQ0Ci0tLSBhL2xpYi90ZXN0X3JoYXNodGFibGUuYworKysgYi9saWIvdGVzdF9yaGFzaHRhYmxlLmMKQEAgLTM4LDcgKzM4LDcgQEAKIAogc3RhdGljIGludCBtYXhfc2l6ZSA9IDA7CiBtb2R1bGVfcGFyYW0obWF4X3NpemUsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHJ1bnMsICJNYXhpbXVtIHRhYmxlIHNpemUgKGRlZmF1bHQ6IGNhbGN1bGF0ZWQpIik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9zaXplLCAiTWF4aW11bSB0YWJsZSBzaXplIChkZWZhdWx0OiBjYWxjdWxhdGVkKSIpOwogCiBzdGF0aWMgYm9vbCBzaHJpbmtpbmcgPSBmYWxzZTsKIG1vZHVsZV9wYXJhbShzaHJpbmtpbmcsIGJvb2wsIDApOwpkaWZmIC0tZ2l0IGEvbGliL3VjczJfc3RyaW5nLmMgYi9saWIvdWNzMl9zdHJpbmcuYwppbmRleCBmMGIzMjNhLi5hZThkMjQ5IDEwMDY0NAotLS0gYS9saWIvdWNzMl9zdHJpbmcuYworKysgYi9saWIvdWNzMl9zdHJpbmcuYwpAQCAtNTYsNyArNTYsNyBAQAogCXVuc2lnbmVkIGxvbmcgaTsKIAl1bnNpZ25lZCBsb25nIGogPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IHVjczJfc3RybGVuKHNyYyk7IGkrKykgeworCWZvciAoaSA9IDA7IHNyY1tpXTsgaSsrKSB7CiAJCXUxNiBjID0gc3JjW2ldOwogCiAJCWlmIChjID49IDB4ODAwKQpkaWZmIC0tZ2l0IGEvbGliL3VzZXJjb3B5LmMgYi9saWIvdXNlcmNvcHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY1YjFkZC4uMDAwMDAwMAotLS0gYS9saWIvdXNlcmNvcHkuYworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLQotdm9pZCBjb3B5X2Zyb21fdXNlcl9vdmVyZmxvdyh2b2lkKQotewotCVdBUk4oMSwgIkJ1ZmZlciBvdmVyZmxvdyBkZXRlY3RlZCFcbiIpOwotfQotRVhQT1JUX1NZTUJPTChjb3B5X2Zyb21fdXNlcl9vdmVyZmxvdyk7CmRpZmYgLS1naXQgYS9saWIvd2luX21pbm1heC5jIGIvbGliL3dpbl9taW5tYXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODQyMGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3dpbl9taW5tYXguYwpAQCAtMCwwICsxLDk4IEBACisvKioKKyAqIGxpYi9taW5tYXguYzogd2luZG93ZWQgbWluL21heCB0cmFja2VyCisgKgorICogS2F0aGxlZW4gTmljaG9scycgYWxnb3JpdGhtIGZvciB0cmFja2luZyB0aGUgbWluaW11bSAob3IgbWF4aW11bSkKKyAqIHZhbHVlIG9mIGEgZGF0YSBzdHJlYW0gb3ZlciBzb21lIGZpeGVkIHRpbWUgaW50ZXJ2YWwuICAoRS5nLiwKKyAqIHRoZSBtaW5pbXVtIFJUVCBvdmVyIHRoZSBwYXN0IGZpdmUgbWludXRlcy4pIEl0IHVzZXMgY29uc3RhbnQKKyAqIHNwYWNlIGFuZCBjb25zdGFudCB0aW1lIHBlciB1cGRhdGUgeWV0IGFsbW9zdCBhbHdheXMgZGVsaXZlcnMKKyAqIHRoZSBzYW1lIG1pbmltdW0gYXMgYW4gaW1wbGVtZW50YXRpb24gdGhhdCBoYXMgdG8ga2VlcCBhbGwgdGhlCisgKiBkYXRhIGluIHRoZSB3aW5kb3cuCisgKgorICogVGhlIGFsZ29yaXRobSBrZWVwcyB0cmFjayBvZiB0aGUgYmVzdCwgMm5kIGJlc3QgJiAzcmQgYmVzdCBtaW4KKyAqIHZhbHVlcywgbWFpbnRhaW5pbmcgYW4gaW52YXJpYW50IHRoYXQgdGhlIG1lYXN1cmVtZW50IHRpbWUgb2YKKyAqIHRoZSBuJ3RoIGJlc3QgPj0gbi0xJ3RoIGJlc3QuIEl0IGFsc28gbWFrZXMgc3VyZSB0aGF0IHRoZSB0aHJlZQorICogdmFsdWVzIGFyZSB3aWRlbHkgc2VwYXJhdGVkIGluIHRoZSB0aW1lIHdpbmRvdyBzaW5jZSB0aGF0IGJvdW5kcworICogdGhlIHdvcnNlIGNhc2UgZXJyb3Igd2hlbiB0aGF0IGRhdGEgaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nCisgKiBvdmVyIHRoZSB3aW5kb3cuCisgKgorICogVXBvbiBnZXR0aW5nIGEgbmV3IG1pbiwgd2UgY2FuIGZvcmdldCBldmVyeXRoaW5nIGVhcmxpZXIgYmVjYXVzZQorICogaXQgaGFzIG5vIHZhbHVlIC0gdGhlIG5ldyBtaW4gaXMgPD0gZXZlcnl0aGluZyBlbHNlIGluIHRoZSB3aW5kb3cKKyAqIGJ5IGRlZmluaXRpb24gYW5kIGl0J3MgdGhlIG1vc3QgcmVjZW50LiBTbyB3ZSByZXN0YXJ0IGZyZXNoIG9uCisgKiBldmVyeSBuZXcgbWluIGFuZCBvdmVyd3JpdGVzIDJuZCAmIDNyZCBjaG9pY2VzLiBUaGUgc2FtZSBwcm9wZXJ0eQorICogaG9sZHMgZm9yIDJuZCAmIDNyZCBiZXN0LgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvd2luX21pbm1heC5oPgorCisvKiBBcyB0aW1lIGFkdmFuY2VzLCB1cGRhdGUgdGhlIDFzdCwgMm5kLCBhbmQgM3JkIGNob2ljZXMuICovCitzdGF0aWMgdTMyIG1pbm1heF9zdWJ3aW5fdXBkYXRlKHN0cnVjdCBtaW5tYXggKm0sIHUzMiB3aW4sCisJCQkJY29uc3Qgc3RydWN0IG1pbm1heF9zYW1wbGUgKnZhbCkKK3sKKwl1MzIgZHQgPSB2YWwtPnQgLSBtLT5zWzBdLnQ7CisKKwlpZiAodW5saWtlbHkoZHQgPiB3aW4pKSB7CisJCS8qCisJCSAqIFBhc3NlZCBlbnRpcmUgd2luZG93IHdpdGhvdXQgYSBuZXcgdmFsIHNvIG1ha2UgMm5kCisJCSAqIGNob2ljZSB0aGUgbmV3IHZhbCAmIDNyZCBjaG9pY2UgdGhlIG5ldyAybmQgY2hvaWNlLgorCQkgKiB3ZSBtYXkgaGF2ZSB0byBpdGVyYXRlIHRoaXMgc2luY2Ugb3VyIDJuZCBjaG9pY2UKKwkJICogbWF5IGFsc28gYmUgb3V0c2lkZSB0aGUgd2luZG93ICh3ZSBjaGVja2VkIG9uIGVudHJ5CisJCSAqIHRoYXQgdGhlIHRoaXJkIGNob2ljZSB3YXMgaW4gdGhlIHdpbmRvdykuCisJCSAqLworCQltLT5zWzBdID0gbS0+c1sxXTsKKwkJbS0+c1sxXSA9IG0tPnNbMl07CisJCW0tPnNbMl0gPSAqdmFsOworCQlpZiAodW5saWtlbHkodmFsLT50IC0gbS0+c1swXS50ID4gd2luKSkgeworCQkJbS0+c1swXSA9IG0tPnNbMV07CisJCQltLT5zWzFdID0gbS0+c1syXTsKKwkJCW0tPnNbMl0gPSAqdmFsOworCQl9CisJfSBlbHNlIGlmICh1bmxpa2VseShtLT5zWzFdLnQgPT0gbS0+c1swXS50KSAmJiBkdCA+IHdpbi80KSB7CisJCS8qCisJCSAqIFdlJ3ZlIHBhc3NlZCBhIHF1YXJ0ZXIgb2YgdGhlIHdpbmRvdyB3aXRob3V0IGEgbmV3IHZhbAorCQkgKiBzbyB0YWtlIGEgMm5kIGNob2ljZSBmcm9tIHRoZSAybmQgcXVhcnRlciBvZiB0aGUgd2luZG93LgorCQkgKi8KKwkJbS0+c1syXSA9IG0tPnNbMV0gPSAqdmFsOworCX0gZWxzZSBpZiAodW5saWtlbHkobS0+c1syXS50ID09IG0tPnNbMV0udCkgJiYgZHQgPiB3aW4vMikgeworCQkvKgorCQkgKiBXZSd2ZSBwYXNzZWQgaGFsZiB0aGUgd2luZG93IHdpdGhvdXQgZmluZGluZyBhIG5ldyB2YWwKKwkJICogc28gdGFrZSBhIDNyZCBjaG9pY2UgZnJvbSB0aGUgbGFzdCBoYWxmIG9mIHRoZSB3aW5kb3cKKwkJICovCisJCW0tPnNbMl0gPSAqdmFsOworCX0KKwlyZXR1cm4gbS0+c1swXS52OworfQorCisvKiBDaGVjayBpZiBuZXcgbWVhc3VyZW1lbnQgdXBkYXRlcyB0aGUgMXN0LCAybmQgb3IgM3JkIGNob2ljZSBtYXguICovCit1MzIgbWlubWF4X3J1bm5pbmdfbWF4KHN0cnVjdCBtaW5tYXggKm0sIHUzMiB3aW4sIHUzMiB0LCB1MzIgbWVhcykKK3sKKwlzdHJ1Y3QgbWlubWF4X3NhbXBsZSB2YWwgPSB7IC50ID0gdCwgLnYgPSBtZWFzIH07CisKKwlpZiAodW5saWtlbHkodmFsLnYgPj0gbS0+c1swXS52KSB8fAkgIC8qIGZvdW5kIG5ldyBtYXg/ICovCisJICAgIHVubGlrZWx5KHZhbC50IC0gbS0+c1syXS50ID4gd2luKSkJICAvKiBub3RoaW5nIGxlZnQgaW4gd2luZG93PyAqLworCQlyZXR1cm4gbWlubWF4X3Jlc2V0KG0sIHQsIG1lYXMpOyAgLyogZm9yZ2V0IGVhcmxpZXIgc2FtcGxlcyAqLworCisJaWYgKHVubGlrZWx5KHZhbC52ID49IG0tPnNbMV0udikpCisJCW0tPnNbMl0gPSBtLT5zWzFdID0gdmFsOworCWVsc2UgaWYgKHVubGlrZWx5KHZhbC52ID49IG0tPnNbMl0udikpCisJCW0tPnNbMl0gPSB2YWw7CisKKwlyZXR1cm4gbWlubWF4X3N1Yndpbl91cGRhdGUobSwgd2luLCAmdmFsKTsKK30KK0VYUE9SVF9TWU1CT0wobWlubWF4X3J1bm5pbmdfbWF4KTsKKworLyogQ2hlY2sgaWYgbmV3IG1lYXN1cmVtZW50IHVwZGF0ZXMgdGhlIDFzdCwgMm5kIG9yIDNyZCBjaG9pY2UgbWluLiAqLwordTMyIG1pbm1heF9ydW5uaW5nX21pbihzdHJ1Y3QgbWlubWF4ICptLCB1MzIgd2luLCB1MzIgdCwgdTMyIG1lYXMpCit7CisJc3RydWN0IG1pbm1heF9zYW1wbGUgdmFsID0geyAudCA9IHQsIC52ID0gbWVhcyB9OworCisJaWYgKHVubGlrZWx5KHZhbC52IDw9IG0tPnNbMF0udikgfHwJICAvKiBmb3VuZCBuZXcgbWluPyAqLworCSAgICB1bmxpa2VseSh2YWwudCAtIG0tPnNbMl0udCA+IHdpbikpCSAgLyogbm90aGluZyBsZWZ0IGluIHdpbmRvdz8gKi8KKwkJcmV0dXJuIG1pbm1heF9yZXNldChtLCB0LCBtZWFzKTsgIC8qIGZvcmdldCBlYXJsaWVyIHNhbXBsZXMgKi8KKworCWlmICh1bmxpa2VseSh2YWwudiA8PSBtLT5zWzFdLnYpKQorCQltLT5zWzJdID0gbS0+c1sxXSA9IHZhbDsKKwllbHNlIGlmICh1bmxpa2VseSh2YWwudiA8PSBtLT5zWzJdLnYpKQorCQltLT5zWzJdID0gdmFsOworCisJcmV0dXJuIG1pbm1heF9zdWJ3aW5fdXBkYXRlKG0sIHdpbiwgJnZhbCk7Cit9CmRpZmYgLS1naXQgYS9tbS9LY29uZmlnIGIvbW0vS2NvbmZpZwppbmRleCA3OGEyM2M1Li5iZTBlZTExIDEwMDY0NAotLS0gYS9tbS9LY29uZmlnCisrKyBiL21tL0tjb25maWcKQEAgLTI2Miw3ICsyNjIsMTQgQEAKIAlzZWxlY3QgTUlHUkFUSU9OCiAJZGVwZW5kcyBvbiBNTVUKIAloZWxwCi0JICBBbGxvd3MgdGhlIGNvbXBhY3Rpb24gb2YgbWVtb3J5IGZvciB0aGUgYWxsb2NhdGlvbiBvZiBodWdlIHBhZ2VzLgorICAgICAgICAgIENvbXBhY3Rpb24gaXMgdGhlIG9ubHkgbWVtb3J5IG1hbmFnZW1lbnQgY29tcG9uZW50IHRvIGZvcm0KKyAgICAgICAgICBoaWdoIG9yZGVyIChsYXJnZXIgcGh5c2ljYWxseSBjb250aWd1b3VzKSBtZW1vcnkgYmxvY2tzCisgICAgICAgICAgcmVsaWFibHkuIFRoZSBwYWdlIGFsbG9jYXRvciByZWxpZXMgb24gY29tcGFjdGlvbiBoZWF2aWx5IGFuZAorICAgICAgICAgIHRoZSBsYWNrIG9mIHRoZSBmZWF0dXJlIGNhbiBsZWFkIHRvIHVuZXhwZWN0ZWQgT09NIGtpbGxlcgorICAgICAgICAgIGludm9jYXRpb25zIGZvciBoaWdoIG9yZGVyIG1lbW9yeSByZXF1ZXN0cy4gWW91IHNob3VsZG4ndAorICAgICAgICAgIGRpc2FibGUgdGhpcyBvcHRpb24gdW5sZXNzIHRoZXJlIHJlYWxseSBpcyBhIHN0cm9uZyByZWFzb24gZm9yCisgICAgICAgICAgaXQgYW5kIHRoZW4gd2Ugd291bGQgYmUgcmVhbGx5IGludGVyZXN0ZWQgdG8gaGVhciBhYm91dCB0aGF0IGF0CisgICAgICAgICAgbGludXgtbW1Aa3ZhY2sub3JnLgogCiAjCiAjIHN1cHBvcnQgZm9yIHBhZ2UgbWlncmF0aW9uCmRpZmYgLS1naXQgYS9tbS9LY29uZmlnLmRlYnVnIGIvbW0vS2NvbmZpZy5kZWJ1ZwppbmRleCAyMmY0Y2Q5Li5hZmNjNTUwIDEwMDY0NAotLS0gYS9tbS9LY29uZmlnLmRlYnVnCisrKyBiL21tL0tjb25maWcuZGVidWcKQEAgLTc2LDggKzc2LDYgQEAKIAkgICBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIHdyaXRlIHplcm9zIHdoZW4gR0ZQX1pFUk8gaXMgdXNlZCBvbgogCSAgIGFsbG9jYXRpb24uCiAKLQkgICBFbmFibGluZyBwYWdlIHBvaXNvbmluZyB3aXRoIHRoaXMgb3B0aW9uIHdpbGwgZGlzYWJsZSBoaWJlcm5hdGlvbgotCiAJICAgSWYgdW5zdXJlLCBzYXkgTgogCWJvb2wKIApkaWZmIC0tZ2l0IGEvbW0vZGVidWcuYyBiL21tL2RlYnVnLmMKaW5kZXggODg2NWJmYi4uNzRjN2NhZSAxMDA2NDQKLS0tIGEvbW0vZGVidWcuYworKysgYi9tbS9kZWJ1Zy5jCkBAIC00Miw5ICs0MiwxMSBAQAogCiB2b2lkIF9fZHVtcF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBjb25zdCBjaGFyICpyZWFzb24pCiB7CisJaW50IG1hcGNvdW50ID0gUGFnZVNsYWIocGFnZSkgPyAwIDogcGFnZV9tYXBjb3VudChwYWdlKTsKKwogCXByX2VtZXJnKCJwYWdlOiVwIGNvdW50OiVkIG1hcGNvdW50OiVkIG1hcHBpbmc6JXAgaW5kZXg6JSNseCIsCi0JCSAgcGFnZSwgcGFnZV9yZWZfY291bnQocGFnZSksIHBhZ2VfbWFwY291bnQocGFnZSksCi0JCSAgcGFnZS0+bWFwcGluZywgcGFnZS0+aW5kZXgpOworCQkgIHBhZ2UsIHBhZ2VfcmVmX2NvdW50KHBhZ2UpLCBtYXBjb3VudCwKKwkJICBwYWdlLT5tYXBwaW5nLCBwYWdlX3RvX3Bnb2ZmKHBhZ2UpKTsKIAlpZiAoUGFnZUNvbXBvdW5kKHBhZ2UpKQogCQlwcl9jb250KCIgY29tcG91bmRfbWFwY291bnQ6ICVkIiwgY29tcG91bmRfbWFwY291bnQocGFnZSkpOwogCXByX2NvbnQoIlxuIik7CmRpZmYgLS1naXQgYS9tbS9maWxlbWFwLmMgYi9tbS9maWxlbWFwLmMKaW5kZXggMmYxMTc1ZS4uNjhmMTgxMyAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcC5jCisrKyBiL21tL2ZpbGVtYXAuYwpAQCAtMTEwLDM2ICsxMTAsOTQgQEAKICAqICAgLT50YXNrbGlzdF9sb2NrICAgICAgICAgICAgKG1lbW9yeV9mYWlsdXJlLCBjb2xsZWN0X3Byb2NzX2FvKQogICovCiAKK3N0YXRpYyBpbnQgcGFnZV9jYWNoZV90cmVlX2luc2VydChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQkgIHN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICoqc2hhZG93cCkKK3sKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlOworCXZvaWQgKipzbG90OworCWludCBlcnJvcjsKKworCWVycm9yID0gX19yYWRpeF90cmVlX2NyZWF0ZSgmbWFwcGluZy0+cGFnZV90cmVlLCBwYWdlLT5pbmRleCwgMCwKKwkJCQkgICAgJm5vZGUsICZzbG90KTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlpZiAoKnNsb3QpIHsKKwkJdm9pZCAqcDsKKworCQlwID0gcmFkaXhfdHJlZV9kZXJlZl9zbG90X3Byb3RlY3RlZChzbG90LCAmbWFwcGluZy0+dHJlZV9sb2NrKTsKKwkJaWYgKCFyYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KHApKQorCQkJcmV0dXJuIC1FRVhJU1Q7CisKKwkJbWFwcGluZy0+bnJleGNlcHRpb25hbC0tOworCQlpZiAoIWRheF9tYXBwaW5nKG1hcHBpbmcpKSB7CisJCQlpZiAoc2hhZG93cCkKKwkJCQkqc2hhZG93cCA9IHA7CisJCQlpZiAobm9kZSkKKwkJCQl3b3JraW5nc2V0X25vZGVfc2hhZG93c19kZWMobm9kZSk7CisJCX0gZWxzZSB7CisJCQkvKiBEQVggY2FuIHJlcGxhY2UgZW1wdHkgbG9ja2VkIGVudHJ5IHdpdGggYSBob2xlICovCisJCQlXQVJOX09OX09OQ0UocCAhPQorCQkJCSh2b2lkICopKFJBRElYX1RSRUVfRVhDRVBUSU9OQUxfRU5UUlkgfAorCQkJCQkgUkFESVhfREFYX0VOVFJZX0xPQ0spKTsKKwkJCS8qIERBWCBhY2NvdW50cyBleGNlcHRpb25hbCBlbnRyaWVzIGFzIG5vcm1hbCBwYWdlcyAqLworCQkJaWYgKG5vZGUpCisJCQkJd29ya2luZ3NldF9ub2RlX3BhZ2VzX2RlYyhub2RlKTsKKwkJCS8qIFdha2V1cCB3YWl0ZXJzIGZvciBleGNlcHRpb25hbCBlbnRyeSBsb2NrICovCisJCQlkYXhfd2FrZV9tYXBwaW5nX2VudHJ5X3dhaXRlcihtYXBwaW5nLCBwYWdlLT5pbmRleCwKKwkJCQkJCSAgICAgIGZhbHNlKTsKKwkJfQorCX0KKwlyYWRpeF90cmVlX3JlcGxhY2Vfc2xvdChzbG90LCBwYWdlKTsKKwltYXBwaW5nLT5ucnBhZ2VzKys7CisJaWYgKG5vZGUpIHsKKwkJd29ya2luZ3NldF9ub2RlX3BhZ2VzX2luYyhub2RlKTsKKwkJLyoKKwkJICogRG9uJ3QgdHJhY2sgbm9kZSB0aGF0IGNvbnRhaW5zIGFjdHVhbCBwYWdlcy4KKwkJICoKKwkJICogQXZvaWQgYWNxdWlyaW5nIHRoZSBsaXN0X2xydSBsb2NrIGlmIGFscmVhZHkKKwkJICogdW50cmFja2VkLiAgVGhlIGxpc3RfZW1wdHkoKSB0ZXN0IGlzIHNhZmUgYXMKKwkJICogbm9kZS0+cHJpdmF0ZV9saXN0IGlzIHByb3RlY3RlZCBieQorCQkgKiBtYXBwaW5nLT50cmVlX2xvY2suCisJCSAqLworCQlpZiAoIWxpc3RfZW1wdHkoJm5vZGUtPnByaXZhdGVfbGlzdCkpCisJCQlsaXN0X2xydV9kZWwoJndvcmtpbmdzZXRfc2hhZG93X25vZGVzLAorCQkJCSAgICAgJm5vZGUtPnByaXZhdGVfbGlzdCk7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBwYWdlX2NhY2hlX3RyZWVfZGVsZXRlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCQkJCSAgIHN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICpzaGFkb3cpCiB7Ci0Jc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZTsKIAlpbnQgaSwgbnIgPSBQYWdlSHVnZShwYWdlKSA/IDEgOiBocGFnZV9ucl9wYWdlcyhwYWdlKTsKIAogCVZNX0JVR19PTl9QQUdFKCFQYWdlTG9ja2VkKHBhZ2UpLCBwYWdlKTsKIAlWTV9CVUdfT05fUEFHRShQYWdlVGFpbChwYWdlKSwgcGFnZSk7CiAJVk1fQlVHX09OX1BBR0UobnIgIT0gMSAmJiBzaGFkb3csIHBhZ2UpOwogCi0JaWYgKHNoYWRvdykgewotCQltYXBwaW5nLT5ucmV4Y2VwdGlvbmFsICs9IG5yOwotCQkvKgotCQkgKiBNYWtlIHN1cmUgdGhlIG5yZXhjZXB0aW9uYWwgdXBkYXRlIGlzIGNvbW1pdHRlZCBiZWZvcmUKLQkJICogdGhlIG5ycGFnZXMgdXBkYXRlIHNvIHRoYXQgZmluYWwgdHJ1bmNhdGUgcmFjaW5nCi0JCSAqIHdpdGggcmVjbGFpbSBkb2VzIG5vdCBzZWUgYm90aCBjb3VudGVycyAwIGF0IHRoZQotCQkgKiBzYW1lIHRpbWUgYW5kIG1pc3MgYSBzaGFkb3cgZW50cnkuCi0JCSAqLwotCQlzbXBfd21iKCk7Ci0JfQotCW1hcHBpbmctPm5ycGFnZXMgLT0gbnI7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgewotCQlub2RlID0gcmFkaXhfdHJlZV9yZXBsYWNlX2NsZWFyX3RhZ3MoJm1hcHBpbmctPnBhZ2VfdHJlZSwKLQkJCQlwYWdlLT5pbmRleCArIGksIHNoYWRvdyk7CisJCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGU7CisJCXZvaWQgKipzbG90OworCisJCV9fcmFkaXhfdHJlZV9sb29rdXAoJm1hcHBpbmctPnBhZ2VfdHJlZSwgcGFnZS0+aW5kZXggKyBpLAorCQkJCSAgICAmbm9kZSwgJnNsb3QpOworCisJCXJhZGl4X3RyZWVfY2xlYXJfdGFncygmbWFwcGluZy0+cGFnZV90cmVlLCBub2RlLCBzbG90KTsKKwogCQlpZiAoIW5vZGUpIHsKIAkJCVZNX0JVR19PTl9QQUdFKG5yICE9IDEsIHBhZ2UpOwotCQkJcmV0dXJuOworCQkJLyoKKwkJCSAqIFdlIG5lZWQgYSBub2RlIHRvIHByb3Blcmx5IGFjY291bnQgc2hhZG93CisJCQkgKiBlbnRyaWVzLiBEb24ndCBwbGFudCBhbnkgd2l0aG91dC4gWFhYCisJCQkgKi8KKwkJCXNoYWRvdyA9IE5VTEw7CiAJCX0KIAorCQlyYWRpeF90cmVlX3JlcGxhY2Vfc2xvdChzbG90LCBzaGFkb3cpOworCisJCWlmICghbm9kZSkKKwkJCWJyZWFrOworCiAJCXdvcmtpbmdzZXRfbm9kZV9wYWdlc19kZWMobm9kZSk7CiAJCWlmIChzaGFkb3cpCiAJCQl3b3JraW5nc2V0X25vZGVfc2hhZG93c19pbmMobm9kZSk7CkBAIC0xNjMsNiArMjIxLDE4IEBACiAJCQkJCSZub2RlLT5wcml2YXRlX2xpc3QpOwogCQl9CiAJfQorCisJaWYgKHNoYWRvdykgeworCQltYXBwaW5nLT5ucmV4Y2VwdGlvbmFsICs9IG5yOworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhlIG5yZXhjZXB0aW9uYWwgdXBkYXRlIGlzIGNvbW1pdHRlZCBiZWZvcmUKKwkJICogdGhlIG5ycGFnZXMgdXBkYXRlIHNvIHRoYXQgZmluYWwgdHJ1bmNhdGUgcmFjaW5nCisJCSAqIHdpdGggcmVjbGFpbSBkb2VzIG5vdCBzZWUgYm90aCBjb3VudGVycyAwIGF0IHRoZQorCQkgKiBzYW1lIHRpbWUgYW5kIG1pc3MgYSBzaGFkb3cgZW50cnkuCisJCSAqLworCQlzbXBfd21iKCk7CisJfQorCW1hcHBpbmctPm5ycGFnZXMgLT0gbnI7CiB9CiAKIC8qCkBAIC01NjEsOSArNjMxLDggQEAKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWFwcGluZy0+dHJlZV9sb2NrLCBmbGFncyk7CiAJCV9fZGVsZXRlX2Zyb21fcGFnZV9jYWNoZShvbGQsIE5VTEwpOwotCQllcnJvciA9IHJhZGl4X3RyZWVfaW5zZXJ0KCZtYXBwaW5nLT5wYWdlX3RyZWUsIG9mZnNldCwgbmV3KTsKKwkJZXJyb3IgPSBwYWdlX2NhY2hlX3RyZWVfaW5zZXJ0KG1hcHBpbmcsIG5ldywgTlVMTCk7CiAJCUJVR19PTihlcnJvcik7Ci0JCW1hcHBpbmctPm5ycGFnZXMrKzsKIAogCQkvKgogCQkgKiBodWdldGxiIHBhZ2VzIGRvIG5vdCBwYXJ0aWNpcGF0ZSBpbiBwYWdlIGNhY2hlIGFjY291bnRpbmcuCkBAIC01ODQsNjIgKzY1Myw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZXBsYWNlX3BhZ2VfY2FjaGVfcGFnZSk7CiAKLXN0YXRpYyBpbnQgcGFnZV9jYWNoZV90cmVlX2luc2VydChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKLQkJCQkgIHN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICoqc2hhZG93cCkKLXsKLQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlOwotCXZvaWQgKipzbG90OwotCWludCBlcnJvcjsKLQotCWVycm9yID0gX19yYWRpeF90cmVlX2NyZWF0ZSgmbWFwcGluZy0+cGFnZV90cmVlLCBwYWdlLT5pbmRleCwgMCwKLQkJCQkgICAgJm5vZGUsICZzbG90KTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQlpZiAoKnNsb3QpIHsKLQkJdm9pZCAqcDsKLQotCQlwID0gcmFkaXhfdHJlZV9kZXJlZl9zbG90X3Byb3RlY3RlZChzbG90LCAmbWFwcGluZy0+dHJlZV9sb2NrKTsKLQkJaWYgKCFyYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KHApKQotCQkJcmV0dXJuIC1FRVhJU1Q7Ci0KLQkJbWFwcGluZy0+bnJleGNlcHRpb25hbC0tOwotCQlpZiAoIWRheF9tYXBwaW5nKG1hcHBpbmcpKSB7Ci0JCQlpZiAoc2hhZG93cCkKLQkJCQkqc2hhZG93cCA9IHA7Ci0JCQlpZiAobm9kZSkKLQkJCQl3b3JraW5nc2V0X25vZGVfc2hhZG93c19kZWMobm9kZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBEQVggY2FuIHJlcGxhY2UgZW1wdHkgbG9ja2VkIGVudHJ5IHdpdGggYSBob2xlICovCi0JCQlXQVJOX09OX09OQ0UocCAhPQotCQkJCSh2b2lkICopKFJBRElYX1RSRUVfRVhDRVBUSU9OQUxfRU5UUlkgfAotCQkJCQkgUkFESVhfREFYX0VOVFJZX0xPQ0spKTsKLQkJCS8qIERBWCBhY2NvdW50cyBleGNlcHRpb25hbCBlbnRyaWVzIGFzIG5vcm1hbCBwYWdlcyAqLwotCQkJaWYgKG5vZGUpCi0JCQkJd29ya2luZ3NldF9ub2RlX3BhZ2VzX2RlYyhub2RlKTsKLQkJCS8qIFdha2V1cCB3YWl0ZXJzIGZvciBleGNlcHRpb25hbCBlbnRyeSBsb2NrICovCi0JCQlkYXhfd2FrZV9tYXBwaW5nX2VudHJ5X3dhaXRlcihtYXBwaW5nLCBwYWdlLT5pbmRleCwKLQkJCQkJCSAgICAgIGZhbHNlKTsKLQkJfQotCX0KLQlyYWRpeF90cmVlX3JlcGxhY2Vfc2xvdChzbG90LCBwYWdlKTsKLQltYXBwaW5nLT5ucnBhZ2VzKys7Ci0JaWYgKG5vZGUpIHsKLQkJd29ya2luZ3NldF9ub2RlX3BhZ2VzX2luYyhub2RlKTsKLQkJLyoKLQkJICogRG9uJ3QgdHJhY2sgbm9kZSB0aGF0IGNvbnRhaW5zIGFjdHVhbCBwYWdlcy4KLQkJICoKLQkJICogQXZvaWQgYWNxdWlyaW5nIHRoZSBsaXN0X2xydSBsb2NrIGlmIGFscmVhZHkKLQkJICogdW50cmFja2VkLiAgVGhlIGxpc3RfZW1wdHkoKSB0ZXN0IGlzIHNhZmUgYXMKLQkJICogbm9kZS0+cHJpdmF0ZV9saXN0IGlzIHByb3RlY3RlZCBieQotCQkgKiBtYXBwaW5nLT50cmVlX2xvY2suCi0JCSAqLwotCQlpZiAoIWxpc3RfZW1wdHkoJm5vZGUtPnByaXZhdGVfbGlzdCkpCi0JCQlsaXN0X2xydV9kZWwoJndvcmtpbmdzZXRfc2hhZG93X25vZGVzLAotCQkJCSAgICAgJm5vZGUtPnByaXZhdGVfbGlzdCk7Ci0JfQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IF9fYWRkX3RvX3BhZ2VfY2FjaGVfbG9ja2VkKHN0cnVjdCBwYWdlICpwYWdlLAogCQkJCSAgICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCQkJCSAgICAgIHBnb2ZmX3Qgb2Zmc2V0LCBnZnBfdCBnZnBfbWFzaywKZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jCmluZGV4IDIzNzNmMGEuLjI4MzU4M2YgMTAwNjQ0Ci0tLSBhL21tL2h1Z2VfbWVtb3J5LmMKKysrIGIvbW0vaHVnZV9tZW1vcnkuYwpAQCAtMTA3OCw3ICsxMDc4LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlwYWdlID0gcG1kX3BhZ2UoKnBtZCk7Ci0JVk1fQlVHX09OX1BBR0UoIVBhZ2VIZWFkKHBhZ2UpLCBwYWdlKTsKKwlWTV9CVUdfT05fUEFHRSghUGFnZUhlYWQocGFnZSkgJiYgIWlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSksIHBhZ2UpOwogCWlmIChmbGFncyAmIEZPTExfVE9VQ0gpCiAJCXRvdWNoX3BtZCh2bWEsIGFkZHIsIHBtZCk7CiAJaWYgKChmbGFncyAmIEZPTExfTUxPQ0spICYmICh2bWEtPnZtX2ZsYWdzICYgVk1fTE9DS0VEKSkgewpAQCAtMTExNiw3ICsxMTE2LDcgQEAKIAl9CiBza2lwX21sb2NrOgogCXBhZ2UgKz0gKGFkZHIgJiB+SFBBR0VfUE1EX01BU0spID4+IFBBR0VfU0hJRlQ7Ci0JVk1fQlVHX09OX1BBR0UoIVBhZ2VDb21wb3VuZChwYWdlKSwgcGFnZSk7CisJVk1fQlVHX09OX1BBR0UoIVBhZ2VDb21wb3VuZChwYWdlKSAmJiAhaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSwgcGFnZSk7CiAJaWYgKGZsYWdzICYgRk9MTF9HRVQpCiAJCWdldF9wYWdlKHBhZ2UpOwogCkBAIC0xMTM4LDkgKzExMzgsNiBAQAogCWJvb2wgd2FzX3dyaXRhYmxlOwogCWludCBmbGFncyA9IDA7CiAKLQkvKiBBIFBST1RfTk9ORSBmYXVsdCBzaG91bGQgbm90IGVuZCB1cCBoZXJlICovCi0JQlVHX09OKCEodm1hLT52bV9mbGFncyAmIChWTV9SRUFEIHwgVk1fRVhFQyB8IFZNX1dSSVRFKSkpOwotCiAJZmUtPnB0bCA9IHBtZF9sb2NrKHZtYS0+dm1fbW0sIGZlLT5wbWQpOwogCWlmICh1bmxpa2VseSghcG1kX3NhbWUocG1kLCAqZmUtPnBtZCkpKQogCQlnb3RvIG91dF91bmxvY2s7CkBAIC0xMTY4LDcgKzExNjUsNyBAQAogCX0KIAogCS8qIFNlZSBzaW1pbGFyIGNvbW1lbnQgaW4gZG9fbnVtYV9wYWdlIGZvciBleHBsYW5hdGlvbiAqLwotCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCisJaWYgKCFwbWRfd3JpdGUocG1kKSkKIAkJZmxhZ3MgfD0gVE5GX05PX0dST1VQOwogCiAJLyoKQEAgLTE1MTIsNyArMTUwOSw3IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJcGd0YWJsZV90IHBndGFibGU7CiAJcG1kX3QgX3BtZDsKLQlib29sIHlvdW5nLCB3cml0ZSwgZGlydHk7CisJYm9vbCB5b3VuZywgd3JpdGUsIGRpcnR5LCBzb2Z0X2RpcnR5OwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAlpbnQgaTsKIApAQCAtMTU0Niw2ICsxNTQzLDcgQEAKIAl3cml0ZSA9IHBtZF93cml0ZSgqcG1kKTsKIAl5b3VuZyA9IHBtZF95b3VuZygqcG1kKTsKIAlkaXJ0eSA9IHBtZF9kaXJ0eSgqcG1kKTsKKwlzb2Z0X2RpcnR5ID0gcG1kX3NvZnRfZGlydHkoKnBtZCk7CiAKIAlwbWRwX2h1Z2Vfc3BsaXRfcHJlcGFyZSh2bWEsIGhhZGRyLCBwbWQpOwogCXBndGFibGUgPSBwZ3RhYmxlX3RyYW5zX2h1Z2Vfd2l0aGRyYXcobW0sIHBtZCk7CkBAIC0xNTYyLDYgKzE1NjAsOCBAQAogCQkJc3dwX2VudHJ5X3Qgc3dwX2VudHJ5OwogCQkJc3dwX2VudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnkocGFnZSArIGksIHdyaXRlKTsKIAkJCWVudHJ5ID0gc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkpOworCQkJaWYgKHNvZnRfZGlydHkpCisJCQkJZW50cnkgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShlbnRyeSk7CiAJCX0gZWxzZSB7CiAJCQllbnRyeSA9IG1rX3B0ZShwYWdlICsgaSwgdm1hLT52bV9wYWdlX3Byb3QpOwogCQkJZW50cnkgPSBtYXliZV9ta3dyaXRlKGVudHJ5LCB2bWEpOwpAQCAtMTU2OSw2ICsxNTY5LDggQEAKIAkJCQllbnRyeSA9IHB0ZV93cnByb3RlY3QoZW50cnkpOwogCQkJaWYgKCF5b3VuZykKIAkJCQllbnRyeSA9IHB0ZV9ta29sZChlbnRyeSk7CisJCQlpZiAoc29mdF9kaXJ0eSkKKwkJCQllbnRyeSA9IHB0ZV9ta3NvZnRfZGlydHkoZW50cnkpOwogCQl9CiAJCWlmIChkaXJ0eSkKIAkJCVNldFBhZ2VEaXJ0eShwYWdlICsgaSk7CmRpZmYgLS1naXQgYS9tbS9raHVnZXBhZ2VkLmMgYi9tbS9raHVnZXBhZ2VkLmMKaW5kZXggNzljNTJkMC4uNzI4ZDc3OSAxMDA2NDQKLS0tIGEvbW0va2h1Z2VwYWdlZC5jCisrKyBiL21tL2todWdlcGFnZWQuYwpAQCAtODM4LDcgKzgzOCw4IEBACiAgKiB2YWx1ZSAoc2NhbiBjb2RlKS4KICAqLwogCi1zdGF0aWMgaW50IGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCitzdGF0aWMgaW50IGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKnZtYXApCiB7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAJdW5zaWduZWQgbG9uZyBoc3RhcnQsIGhlbmQ7CkBAIC04NDYsNyArODQ3LDcgQEAKIAlpZiAodW5saWtlbHkoa2h1Z2VwYWdlZF90ZXN0X2V4aXQobW0pKSkKIAkJcmV0dXJuIFNDQU5fQU5ZX1BST0NFU1M7CiAKLQl2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcmVzcyk7CisJKnZtYXAgPSB2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcmVzcyk7CiAJaWYgKCF2bWEpCiAJCXJldHVybiBTQ0FOX1ZNQV9OVUxMOwogCkBAIC04ODEsNiArODgyLDExIEBACiAJCS5wbWQgPSBwbWQsCiAJfTsKIAorCS8qIHdlIG9ubHkgZGVjaWRlIHRvIHN3YXBpbiwgaWYgdGhlcmUgaXMgZW5vdWdoIHlvdW5nIHB0ZXMgKi8KKwlpZiAocmVmZXJlbmNlZCA8IEhQQUdFX1BNRF9OUi8yKSB7CisJCXRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4obW0sIHN3YXBwZWRfaW4sIHJlZmVyZW5jZWQsIDApOworCQlyZXR1cm4gZmFsc2U7CisJfQogCWZlLnB0ZSA9IHB0ZV9vZmZzZXRfbWFwKHBtZCwgYWRkcmVzcyk7CiAJZm9yICg7IGZlLmFkZHJlc3MgPCBhZGRyZXNzICsgSFBBR0VfUE1EX05SKlBBR0VfU0laRTsKIAkJCWZlLnB0ZSsrLCBmZS5hZGRyZXNzICs9IFBBR0VfU0laRSkgewpAQCAtODg4LDE3ICs4OTQsMTIgQEAKIAkJaWYgKCFpc19zd2FwX3B0ZShwdGV2YWwpKQogCQkJY29udGludWU7CiAJCXN3YXBwZWRfaW4rKzsKLQkJLyogd2Ugb25seSBkZWNpZGUgdG8gc3dhcGluLCBpZiB0aGVyZSBpcyBlbm91Z2ggeW91bmcgcHRlcyAqLwotCQlpZiAocmVmZXJlbmNlZCA8IEhQQUdFX1BNRF9OUi8yKSB7Ci0JCQl0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKG1tLCBzd2FwcGVkX2luLCByZWZlcmVuY2VkLCAwKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQogCQlyZXQgPSBkb19zd2FwX3BhZ2UoJmZlLCBwdGV2YWwpOwogCiAJCS8qIGRvX3N3YXBfcGFnZSByZXR1cm5zIFZNX0ZBVUxUX1JFVFJZIHdpdGggcmVsZWFzZWQgbW1hcF9zZW0gKi8KIAkJaWYgKHJldCAmIFZNX0ZBVUxUX1JFVFJZKSB7CiAJCQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JCQlpZiAoaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUobW0sIGFkZHJlc3MpKSB7CisJCQlpZiAoaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUobW0sIGFkZHJlc3MsICZmZS52bWEpKSB7CiAJCQkJLyogdm1hIGlzIG5vIGxvbmdlciBhdmFpbGFibGUsIGRvbid0IGNvbnRpbnVlIHRvIHN3YXBpbiAqLwogCQkJCXRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4obW0sIHN3YXBwZWRfaW4sIHJlZmVyZW5jZWQsIDApOwogCQkJCXJldHVybiBmYWxzZTsKQEAgLTkyMyw3ICs5MjQsNiBAQAogc3RhdGljIHZvaWQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKIAkJCQkgICBzdHJ1Y3QgcGFnZSAqKmhwYWdlLAotCQkJCSAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCSAgIGludCBub2RlLCBpbnQgcmVmZXJlbmNlZCkKIHsKIAlwbWRfdCAqcG1kLCBfcG1kOwpAQCAtOTMzLDYgKzkzMyw3IEBACiAJc3BpbmxvY2tfdCAqcG1kX3B0bCwgKnB0ZV9wdGw7CiAJaW50IGlzb2xhdGVkID0gMCwgcmVzdWx0ID0gMDsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAJdW5zaWduZWQgbG9uZyBtbXVuX3N0YXJ0OwkvKiBGb3IgbW11X25vdGlmaWVycyAqLwogCXVuc2lnbmVkIGxvbmcgbW11bl9lbmQ7CQkvKiBGb3IgbW11X25vdGlmaWVycyAqLwogCWdmcF90IGdmcDsKQEAgLTk2MSw3ICs5NjIsNyBAQAogCX0KIAogCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKLQlyZXN1bHQgPSBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShtbSwgYWRkcmVzcyk7CisJcmVzdWx0ID0gaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUobW0sIGFkZHJlc3MsICZ2bWEpOwogCWlmIChyZXN1bHQpIHsKIAkJbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlKG5ld19wYWdlLCBtZW1jZywgdHJ1ZSk7CiAJCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CkBAIC05OTQsNyArOTk1LDcgQEAKIAkgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICsgUEdfbG9jay4KIAkgKi8KIAlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwotCXJlc3VsdCA9IGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKG1tLCBhZGRyZXNzKTsKKwlyZXN1bHQgPSBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShtbSwgYWRkcmVzcywgJnZtYSk7CiAJaWYgKHJlc3VsdCkKIAkJZ290byBvdXQ7CiAJLyogY2hlY2sgaWYgdGhlIHBtZCBpcyBzdGlsbCB2YWxpZCAqLwpAQCAtMTIwMiw3ICsxMjAzLDcgQEAKIAlpZiAocmV0KSB7CiAJCW5vZGUgPSBraHVnZXBhZ2VkX2ZpbmRfdGFyZ2V0X25vZGUoKTsKIAkJLyogY29sbGFwc2VfaHVnZV9wYWdlIHdpbGwgcmV0dXJuIHdpdGggdGhlIG1tYXBfc2VtIHJlbGVhc2VkICovCi0JCWNvbGxhcHNlX2h1Z2VfcGFnZShtbSwgYWRkcmVzcywgaHBhZ2UsIHZtYSwgbm9kZSwgcmVmZXJlbmNlZCk7CisJCWNvbGxhcHNlX2h1Z2VfcGFnZShtbSwgYWRkcmVzcywgaHBhZ2UsIG5vZGUsIHJlZmVyZW5jZWQpOwogCX0KIG91dDoKIAl0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKG1tLCBwYWdlLCB3cml0YWJsZSwgcmVmZXJlbmNlZCwKZGlmZiAtLWdpdCBhL21tL2tzbS5jIGIvbW0va3NtLmMKaW5kZXggNzNkNDNiYS4uNTA0ODA4MyAxMDA2NDQKLS0tIGEvbW0va3NtLmMKKysrIGIvbW0va3NtLmMKQEAgLTI4Myw3ICsyODMsOCBAQAogewogCXN0cnVjdCBybWFwX2l0ZW0gKnJtYXBfaXRlbTsKIAotCXJtYXBfaXRlbSA9IGttZW1fY2FjaGVfemFsbG9jKHJtYXBfaXRlbV9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJcm1hcF9pdGVtID0ga21lbV9jYWNoZV96YWxsb2Mocm1hcF9pdGVtX2NhY2hlLCBHRlBfS0VSTkVMIHwKKwkJCQkJCV9fR0ZQX05PUkVUUlkgfCBfX0dGUF9OT1dBUk4pOwogCWlmIChybWFwX2l0ZW0pCiAJCWtzbV9ybWFwX2l0ZW1zKys7CiAJcmV0dXJuIHJtYXBfaXRlbTsKZGlmZiAtLWdpdCBhL21tL21lbWNvbnRyb2wuYyBiL21tL21lbWNvbnRyb2wuYwppbmRleCAyZmYwMjg5Li40YmU1MThkIDEwMDY0NAotLS0gYS9tbS9tZW1jb250cm9sLmMKKysrIGIvbW0vbWVtY29udHJvbC5jCkBAIC0xNzQwLDE3ICsxNzQwLDIyIEBACiBzdGF0aWMgYm9vbCBjb25zdW1lX3N0b2NrKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgaW50IG5yX3BhZ2VzKQogewogCXN0cnVjdCBtZW1jZ19zdG9ja19wY3AgKnN0b2NrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJYm9vbCByZXQgPSBmYWxzZTsKIAogCWlmIChucl9wYWdlcyA+IENIQVJHRV9CQVRDSCkKIAkJcmV0dXJuIHJldDsKIAotCXN0b2NrID0gJmdldF9jcHVfdmFyKG1lbWNnX3N0b2NrKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzdG9jayA9IHRoaXNfY3B1X3B0cigmbWVtY2dfc3RvY2spOwogCWlmIChtZW1jZyA9PSBzdG9jay0+Y2FjaGVkICYmIHN0b2NrLT5ucl9wYWdlcyA+PSBucl9wYWdlcykgewogCQlzdG9jay0+bnJfcGFnZXMgLT0gbnJfcGFnZXM7CiAJCXJldCA9IHRydWU7CiAJfQotCXB1dF9jcHVfdmFyKG1lbWNnX3N0b2NrKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE3NzEsMTUgKzE3NzYsMTggQEAKIAlzdG9jay0+Y2FjaGVkID0gTlVMTDsKIH0KIAotLyoKLSAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgdW5kZXIgcHJlZW1wdCBkaXNhYmxlZCBvciBtdXN0IGJlIGNhbGxlZCBieQotICogYSB0aHJlYWQgd2hpY2ggaXMgcGlubmVkIHRvIGxvY2FsIGNwdS4KLSAqLwogc3RhdGljIHZvaWQgZHJhaW5fbG9jYWxfc3RvY2soc3RydWN0IHdvcmtfc3RydWN0ICpkdW1teSkKIHsKLQlzdHJ1Y3QgbWVtY2dfc3RvY2tfcGNwICpzdG9jayA9IHRoaXNfY3B1X3B0cigmbWVtY2dfc3RvY2spOworCXN0cnVjdCBtZW1jZ19zdG9ja19wY3AgKnN0b2NrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzdG9jayA9IHRoaXNfY3B1X3B0cigmbWVtY2dfc3RvY2spOwogCWRyYWluX3N0b2NrKHN0b2NrKTsKIAljbGVhcl9iaXQoRkxVU0hJTkdfQ0FDSEVEX0NIQVJHRSwgJnN0b2NrLT5mbGFncyk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIC8qCkBAIC0xNzg4LDE0ICsxNzk2LDE5IEBACiAgKi8KIHN0YXRpYyB2b2lkIHJlZmlsbF9zdG9jayhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGludCBucl9wYWdlcykKIHsKLQlzdHJ1Y3QgbWVtY2dfc3RvY2tfcGNwICpzdG9jayA9ICZnZXRfY3B1X3ZhcihtZW1jZ19zdG9jayk7CisJc3RydWN0IG1lbWNnX3N0b2NrX3BjcCAqc3RvY2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXN0b2NrID0gdGhpc19jcHVfcHRyKCZtZW1jZ19zdG9jayk7CiAJaWYgKHN0b2NrLT5jYWNoZWQgIT0gbWVtY2cpIHsgLyogcmVzZXQgaWYgbmVjZXNzYXJ5ICovCiAJCWRyYWluX3N0b2NrKHN0b2NrKTsKIAkJc3RvY2stPmNhY2hlZCA9IG1lbWNnOwogCX0KIAlzdG9jay0+bnJfcGFnZXMgKz0gbnJfcGFnZXM7Ci0JcHV0X2NwdV92YXIobWVtY2dfc3RvY2spOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiAvKgpAQCAtNDA4MiwyNCArNDA5NSw2IEBACiAJYXRvbWljX2FkZChuLCAmbWVtY2ctPmlkLnJlZik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2Nncm91cF9pZF9nZXRfb25saW5lKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKLXsKLQl3aGlsZSAoIWF0b21pY19pbmNfbm90X3plcm8oJm1lbWNnLT5pZC5yZWYpKSB7Ci0JCS8qCi0JCSAqIFRoZSByb290IGNncm91cCBjYW5ub3QgYmUgZGVzdHJveWVkLCBzbyBpdCdzIHJlZmNvdW50IG11c3QKLQkJICogYWx3YXlzIGJlID49IDEuCi0JCSAqLwotCQlpZiAoV0FSTl9PTl9PTkNFKG1lbWNnID09IHJvb3RfbWVtX2Nncm91cCkpIHsKLQkJCVZNX0JVR19PTigxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCW1lbWNnID0gcGFyZW50X21lbV9jZ3JvdXAobWVtY2cpOwotCQlpZiAoIW1lbWNnKQotCQkJbWVtY2cgPSByb290X21lbV9jZ3JvdXA7Ci0JfQotCXJldHVybiBtZW1jZzsKLX0KLQogc3RhdGljIHZvaWQgbWVtX2Nncm91cF9pZF9wdXRfbWFueShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGludCBuKQogewogCWlmIChhdG9taWNfc3ViX2FuZF90ZXN0KG4sICZtZW1jZy0+aWQucmVmKSkgewpAQCAtNTgyMSw2ICs1ODE2LDI0IEBACiBzdWJzeXNfaW5pdGNhbGwobWVtX2Nncm91cF9pbml0KTsKIAogI2lmZGVmIENPTkZJR19NRU1DR19TV0FQCitzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbV9jZ3JvdXBfaWRfZ2V0X29ubGluZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCit7CisJd2hpbGUgKCFhdG9taWNfaW5jX25vdF96ZXJvKCZtZW1jZy0+aWQucmVmKSkgeworCQkvKgorCQkgKiBUaGUgcm9vdCBjZ3JvdXAgY2Fubm90IGJlIGRlc3Ryb3llZCwgc28gaXQncyByZWZjb3VudCBtdXN0CisJCSAqIGFsd2F5cyBiZSA+PSAxLgorCQkgKi8KKwkJaWYgKFdBUk5fT05fT05DRShtZW1jZyA9PSByb290X21lbV9jZ3JvdXApKSB7CisJCQlWTV9CVUdfT04oMSk7CisJCQlicmVhazsKKwkJfQorCQltZW1jZyA9IHBhcmVudF9tZW1fY2dyb3VwKG1lbWNnKTsKKwkJaWYgKCFtZW1jZykKKwkJCW1lbWNnID0gcm9vdF9tZW1fY2dyb3VwOworCX0KKwlyZXR1cm4gbWVtY2c7Cit9CisKIC8qKgogICogbWVtX2Nncm91cF9zd2Fwb3V0IC0gdHJhbnNmZXIgYSBtZW1zdyBjaGFyZ2UgdG8gc3dhcAogICogQHBhZ2U6IHBhZ2Ugd2hvc2UgbWVtc3cgY2hhcmdlIHRvIHRyYW5zZmVyCmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jCmluZGV4IDgzYmU5OWQuLmYxYTY4MDQgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS5jCisrKyBiL21tL21lbW9yeS5jCkBAIC0zMzUxLDkgKzMzNTEsNiBAQAogCWJvb2wgd2FzX3dyaXRhYmxlID0gcHRlX3dyaXRlKHB0ZSk7CiAJaW50IGZsYWdzID0gMDsKIAotCS8qIEEgUFJPVF9OT05FIGZhdWx0IHNob3VsZCBub3QgZW5kIHVwIGhlcmUgKi8KLQlCVUdfT04oISh2bWEtPnZtX2ZsYWdzICYgKFZNX1JFQUQgfCBWTV9FWEVDIHwgVk1fV1JJVEUpKSk7Ci0KIAkvKgogCSogVGhlICJwdGUiIGF0IHRoaXMgcG9pbnQgY2Fubm90IGJlIHVzZWQgc2FmZWx5IHdpdGhvdXQKIAkqIHZhbGlkYXRpb24gdGhyb3VnaCBwdGVfdW5tYXBfc2FtZSgpLiBJdCdzIG9mIE5VTUEgdHlwZSBidXQKQEAgLTMzOTgsNyArMzM5NSw3IEBACiAJICogcHRlX2RpcnR5IGhhcyB1bnByZWRpY3RhYmxlIGJlaGF2aW91ciBiZXR3ZWVuIFBURSBzY2FuIHVwZGF0ZXMsCiAJICogYmFja2dyb3VuZCB3cml0ZWJhY2ssIGRpcnR5IGJhbGFuY2luZyBhbmQgYXBwbGljYXRpb24gYmVoYXZpb3VyLgogCSAqLwotCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCisJaWYgKCFwdGVfd3JpdGUocHRlKSkKIAkJZmxhZ3MgfD0gVE5GX05PX0dST1VQOwogCiAJLyoKQEAgLTM0NTgsNiArMzQ1NSwxMSBAQAogCXJldHVybiBWTV9GQVVMVF9GQUxMQkFDSzsKIH0KIAorc3RhdGljIGlubGluZSBib29sIHZtYV9pc19hY2Nlc3NpYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXJldHVybiB2bWEtPnZtX2ZsYWdzICYgKFZNX1JFQUQgfCBWTV9FWEVDIHwgVk1fV1JJVEUpOworfQorCiAvKgogICogVGhlc2Ugcm91dGluZXMgYWxzbyBuZWVkIHRvIGhhbmRsZSBzdHVmZiBsaWtlIG1hcmtpbmcgcGFnZXMgZGlydHkKICAqIGFuZC9vciBhY2Nlc3NlZCBmb3IgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGRvIGl0IGluIGhhcmR3YXJlIChtb3N0CkBAIC0zNTI0LDcgKzM1MjYsNyBAQAogCWlmICghcHRlX3ByZXNlbnQoZW50cnkpKQogCQlyZXR1cm4gZG9fc3dhcF9wYWdlKGZlLCBlbnRyeSk7CiAKLQlpZiAocHRlX3Byb3Rub25lKGVudHJ5KSkKKwlpZiAocHRlX3Byb3Rub25lKGVudHJ5KSAmJiB2bWFfaXNfYWNjZXNzaWJsZShmZS0+dm1hKSkKIAkJcmV0dXJuIGRvX251bWFfcGFnZShmZSwgZW50cnkpOwogCiAJZmUtPnB0bCA9IHB0ZV9sb2NrcHRyKGZlLT52bWEtPnZtX21tLCBmZS0+cG1kKTsKQEAgLTM1OTAsNyArMzU5Miw3IEBACiAKIAkJYmFycmllcigpOwogCQlpZiAocG1kX3RyYW5zX2h1Z2Uob3JpZ19wbWQpIHx8IHBtZF9kZXZtYXAob3JpZ19wbWQpKSB7Ci0JCQlpZiAocG1kX3Byb3Rub25lKG9yaWdfcG1kKSkKKwkJCWlmIChwbWRfcHJvdG5vbmUob3JpZ19wbWQpICYmIHZtYV9pc19hY2Nlc3NpYmxlKHZtYSkpCiAJCQkJcmV0dXJuIGRvX2h1Z2VfcG1kX251bWFfcGFnZSgmZmUsIG9yaWdfcG1kKTsKIAogCQkJaWYgKChmZS5mbGFncyAmIEZBVUxUX0ZMQUdfV1JJVEUpICYmCmRpZmYgLS1naXQgYS9tbS9tZW1vcnlfaG90cGx1Zy5jIGIvbW0vbWVtb3J5X2hvdHBsdWcuYwppbmRleCA0MTI2NmRjLi45ZDI5YmEwIDEwMDY0NAotLS0gYS9tbS9tZW1vcnlfaG90cGx1Zy5jCisrKyBiL21tL21lbW9yeV9ob3RwbHVnLmMKQEAgLTE1NTUsOCArMTU1NSw4IEBACiB7CiAJZ2ZwX3QgZ2ZwX21hc2sgPSBHRlBfVVNFUiB8IF9fR0ZQX01PVkFCTEU7CiAJaW50IG5pZCA9IHBhZ2VfdG9fbmlkKHBhZ2UpOwotCW5vZGVtYXNrX3Qgbm1hc2sgPSBub2RlX29ubGluZV9tYXA7Ci0Jc3RydWN0IHBhZ2UgKm5ld19wYWdlOworCW5vZGVtYXNrX3Qgbm1hc2sgPSBub2RlX3N0YXRlc1tOX01FTU9SWV07CisJc3RydWN0IHBhZ2UgKm5ld19wYWdlID0gTlVMTDsKIAogCS8qCiAJICogVE9ETzogYWxsb2NhdGUgYSBkZXN0aW5hdGlvbiBodWdlcGFnZSBmcm9tIGEgbmVhcmVzdCBuZWlnaGJvciBub2RlLApAQCAtMTU2OCwxMSArMTU2OCwxMyBAQAogCQkJCQluZXh0X25vZGVfaW4obmlkLCBubWFzaykpOwogCiAJbm9kZV9jbGVhcihuaWQsIG5tYXNrKTsKKwogCWlmIChQYWdlSGlnaE1lbShwYWdlKQogCSAgICB8fCAoem9uZV9pZHgocGFnZV96b25lKHBhZ2UpKSA9PSBaT05FX01PVkFCTEUpKQogCQlnZnBfbWFzayB8PSBfX0dGUF9ISUdITUVNOwogCi0JbmV3X3BhZ2UgPSBfX2FsbG9jX3BhZ2VzX25vZGVtYXNrKGdmcF9tYXNrLCAwLAorCWlmICghbm9kZXNfZW1wdHkobm1hc2spKQorCQluZXdfcGFnZSA9IF9fYWxsb2NfcGFnZXNfbm9kZW1hc2soZ2ZwX21hc2ssIDAsCiAJCQkJCW5vZGVfem9uZWxpc3QobmlkLCBnZnBfbWFzayksICZubWFzayk7CiAJaWYgKCFuZXdfcGFnZSkKIAkJbmV3X3BhZ2UgPSBfX2FsbG9jX3BhZ2VzKGdmcF9tYXNrLCAwLApkaWZmIC0tZ2l0IGEvbW0vbWVtcG9saWN5LmMgYi9tbS9tZW1wb2xpY3kuYwppbmRleCBkOGM0ZTM4Li4yZGE3MmE1IDEwMDY0NAotLS0gYS9tbS9tZW1wb2xpY3kuYworKysgYi9tbS9tZW1wb2xpY3kuYwpAQCAtMjMzNiw2ICsyMzM2LDIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoKKyAqIERyb3AgdGhlIChwb3NzaWJseSBmaW5hbCkgcmVmZXJlbmNlIHRvIHRhc2stPm1lbXBvbGljeS4gIEl0IG5lZWRzIHRvIGJlCisgKiBkcm9wcGVkIGFmdGVyIHRhc2stPm1lbXBvbGljeSBpcyBzZXQgdG8gTlVMTCBzbyB0aGF0IGFueSBhbGxvY2F0aW9uIGRvbmUgYXMKKyAqIHBhcnQgb2YgaXRzIGttZW1fY2FjaGVfZnJlZSgpLCBzdWNoIGFzIGJ5IEtBU0FOLCBkb2Vzbid0IHJlZmVyZW5jZSBhIGZyZWVkCisgKiBwb2xpY3kuCisgKi8KK3ZvaWQgbXBvbF9wdXRfdGFza19wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXN0cnVjdCBtZW1wb2xpY3kgKnBvbDsKKworCXRhc2tfbG9jayh0YXNrKTsKKwlwb2wgPSB0YXNrLT5tZW1wb2xpY3k7CisJdGFzay0+bWVtcG9saWN5ID0gTlVMTDsKKwl0YXNrX3VubG9jayh0YXNrKTsKKwltcG9sX3B1dChwb2wpOworfQorCiBzdGF0aWMgdm9pZCBzcF9kZWxldGUoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBzdHJ1Y3Qgc3Bfbm9kZSAqbikKIHsKIAlwcl9kZWJ1ZygiZGVsZXRpbmcgJWx4LWwlbHhcbiIsIG4tPnN0YXJ0LCBuLT5lbmQpOwpkaWZmIC0tZ2l0IGEvbW0vbW1hcC5jIGIvbW0vbW1hcC5jCmluZGV4IGNhOWQ5MWIuLjdhMDcwN2EgMTAwNjQ0Ci0tLSBhL21tL21tYXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTg4LDYgKzg4LDExIEBACiAgKgkJdzogKG5vKSBubwl3OiAobm8pIG5vCXc6IChjb3B5KSBjb3B5CXc6IChubykgbm8KICAqCQl4OiAobm8pIG5vCXg6IChubykgeWVzCXg6IChubykgeWVzCXg6ICh5ZXMpIHllcwogICoKKyAqIE9uIGFybTY0LCBQUk9UX0VYRUMgaGFzIHRoZSBmb2xsb3dpbmcgYmVoYXZpb3VyIGZvciBib3RoIE1BUF9TSEFSRUQgYW5kCisgKiBNQVBfUFJJVkFURToKKyAqCQkJCQkJCQlyOiAobm8pIG5vCisgKgkJCQkJCQkJdzogKG5vKSBubworICoJCQkJCQkJCXg6ICh5ZXMpIHllcwogICovCiBwZ3Byb3RfdCBwcm90ZWN0aW9uX21hcFsxNl0gPSB7CiAJX19QMDAwLCBfX1AwMDEsIF9fUDAxMCwgX19QMDExLCBfX1AxMDAsIF9fUDEwMSwgX19QMTEwLCBfX1AxMTEsCkBAIC0zMDYzLDYgKzMwNjgsMTQgQEAKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogCitib29sIHZtYV9pc19zcGVjaWFsX21hcHBpbmcoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJY29uc3Qgc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZyAqc20pCit7CisJcmV0dXJuIHZtYS0+dm1fcHJpdmF0ZV9kYXRhID09IHNtICYmCisJCSh2bWEtPnZtX29wcyA9PSAmc3BlY2lhbF9tYXBwaW5nX3Ztb3BzIHx8CisJCSB2bWEtPnZtX29wcyA9PSAmbGVnYWN5X3NwZWNpYWxfbWFwcGluZ192bW9wcyk7Cit9CisKIC8qCiAgKiBDYWxsZWQgd2l0aCBtbS0+bW1hcF9zZW0gaGVsZCBmb3Igd3JpdGluZy4KICAqIEluc2VydCBhIG5ldyB2bWEgY292ZXJpbmcgdGhlIGdpdmVuIHJlZ2lvbiwgd2l0aCB0aGUgZ2l2ZW4gZmxhZ3MuCmRpZmYgLS1naXQgYS9tbS9wYWdlLXdyaXRlYmFjay5jIGIvbW0vcGFnZS13cml0ZWJhY2suYwppbmRleCBmNGNkN2Q4Li4yOGQ2ZjM2IDEwMDY0NAotLS0gYS9tbS9wYWdlLXdyaXRlYmFjay5jCisrKyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKQEAgLTIwODAsMjYgKzIwODAsMTIgQEAKIAkJcmF0ZWxpbWl0X3BhZ2VzID0gMTY7CiB9CiAKLXN0YXRpYyBpbnQKLXJhdGVsaW1pdF9oYW5kbGVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sCi0JCSAgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgcGFnZV93cml0ZWJhY2tfY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1KQogewotCi0Jc3dpdGNoIChhY3Rpb24gJiB+Q1BVX1RBU0tTX0ZST1pFTikgewotCWNhc2UgQ1BVX09OTElORToKLQljYXNlIENQVV9ERUFEOgotCQl3cml0ZWJhY2tfc2V0X3JhdGVsaW1pdCgpOwotCQlyZXR1cm4gTk9USUZZX09LOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBOT1RJRllfRE9ORTsKLQl9CisJd3JpdGViYWNrX3NldF9yYXRlbGltaXQoKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayByYXRlbGltaXRfbmIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwJPSByYXRlbGltaXRfaGFuZGxlciwKLQkubmV4dAkJPSBOVUxMLAotfTsKLQogLyoKICAqIENhbGxlZCBlYXJseSBvbiB0byB0dW5lIHRoZSBwYWdlIHdyaXRlYmFjayBkaXJ0eSBsaW1pdHMuCiAgKgpAQCAtMjEyMiw4ICsyMTA4LDEwIEBACiB7CiAJQlVHX09OKHdiX2RvbWFpbl9pbml0KCZnbG9iYWxfd2JfZG9tYWluLCBHRlBfS0VSTkVMKSk7CiAKLQl3cml0ZWJhY2tfc2V0X3JhdGVsaW1pdCgpOwotCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmcmF0ZWxpbWl0X25iKTsKKwljcHVocF9zZXR1cF9zdGF0ZShDUFVIUF9BUF9PTkxJTkVfRFlOLCAibW0vd3JpdGViYWNrOm9ubGluZSIsCisJCQkgIHBhZ2Vfd3JpdGViYWNrX2NwdV9vbmxpbmUsIE5VTEwpOworCWNwdWhwX3NldHVwX3N0YXRlKENQVUhQX01NX1dSSVRFQkFDS19ERUFELCAibW0vd3JpdGViYWNrOmRlYWQiLCBOVUxMLAorCQkJICBwYWdlX3dyaXRlYmFja19jcHVfb25saW5lKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jLmMgYi9tbS9wYWdlX2FsbG9jLmMKaW5kZXggM2ZiZTczYS4uYTIyMTRjNiAxMDA2NDQKLS0tIGEvbW0vcGFnZV9hbGxvYy5jCisrKyBiL21tL3BhZ2VfYWxsb2MuYwpAQCAtMzEzNyw1NCArMzEzNyw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbAotc2hvdWxkX2NvbXBhY3RfcmV0cnkoc3RydWN0IGFsbG9jX2NvbnRleHQgKmFjLCBpbnQgb3JkZXIsIGludCBhbGxvY19mbGFncywKLQkJICAgICBlbnVtIGNvbXBhY3RfcmVzdWx0IGNvbXBhY3RfcmVzdWx0LAotCQkgICAgIGVudW0gY29tcGFjdF9wcmlvcml0eSAqY29tcGFjdF9wcmlvcml0eSwKLQkJICAgICBpbnQgY29tcGFjdGlvbl9yZXRyaWVzKQotewotCWludCBtYXhfcmV0cmllcyA9IE1BWF9DT01QQUNUX1JFVFJJRVM7Ci0KLQlpZiAoIW9yZGVyKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKgotCSAqIGNvbXBhY3Rpb24gY29uc2lkZXJzIGFsbCB0aGUgem9uZSBhcyBkZXNwZXJhdGVseSBvdXQgb2YgbWVtb3J5Ci0JICogc28gaXQgZG9lc24ndCByZWFsbHkgbWFrZSBtdWNoIHNlbnNlIHRvIHJldHJ5IGV4Y2VwdCB3aGVuIHRoZQotCSAqIGZhaWx1cmUgY291bGQgYmUgY2F1c2VkIGJ5IGluc3VmZmljaWVudCBwcmlvcml0eQotCSAqLwotCWlmIChjb21wYWN0aW9uX2ZhaWxlZChjb21wYWN0X3Jlc3VsdCkpIHsKLQkJaWYgKCpjb21wYWN0X3ByaW9yaXR5ID4gTUlOX0NPTVBBQ1RfUFJJT1JJVFkpIHsKLQkJCSgqY29tcGFjdF9wcmlvcml0eSktLTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIG1ha2Ugc3VyZSB0aGUgY29tcGFjdGlvbiB3YXNuJ3QgZGVmZXJyZWQgb3IgZGlkbid0IGJhaWwgb3V0IGVhcmx5Ci0JICogZHVlIHRvIGxvY2tzIGNvbnRlbnRpb24gYmVmb3JlIHdlIGRlY2xhcmUgdGhhdCB3ZSBzaG91bGQgZ2l2ZSB1cC4KLQkgKiBCdXQgZG8gbm90IHJldHJ5IGlmIHRoZSBnaXZlbiB6b25lbGlzdCBpcyBub3Qgc3VpdGFibGUgZm9yCi0JICogY29tcGFjdGlvbi4KLQkgKi8KLQlpZiAoY29tcGFjdGlvbl93aXRoZHJhd24oY29tcGFjdF9yZXN1bHQpKQotCQlyZXR1cm4gY29tcGFjdGlvbl96b25lbGlzdF9zdWl0YWJsZShhYywgb3JkZXIsIGFsbG9jX2ZsYWdzKTsKLQotCS8qCi0JICogIWNvc3RseSByZXF1ZXN0cyBhcmUgbXVjaCBtb3JlIGltcG9ydGFudCB0aGFuIF9fR0ZQX1JFUEVBVAotCSAqIGNvc3RseSBvbmVzIGJlY2F1c2UgdGhleSBhcmUgZGUgZmFjdG8gbm9mYWlsIGFuZCBpbnZva2UgT09NCi0JICoga2lsbGVyIHRvIG1vdmUgb24gd2hpbGUgY29zdGx5IGNhbiBmYWlsIGFuZCB1c2VycyBhcmUgcmVhZHkKLQkgKiB0byBjb3BlIHdpdGggdGhhdC4gMS80IHJldHJpZXMgaXMgcmF0aGVyIGFyYml0cmFyeSBidXQgd2UKLQkgKiB3b3VsZCBuZWVkIG11Y2ggbW9yZSBkZXRhaWxlZCBmZWVkYmFjayBmcm9tIGNvbXBhY3Rpb24gdG8KLQkgKiBtYWtlIGEgYmV0dGVyIGRlY2lzaW9uLgotCSAqLwotCWlmIChvcmRlciA+IFBBR0VfQUxMT0NfQ09TVExZX09SREVSKQotCQltYXhfcmV0cmllcyAvPSA0OwotCWlmIChjb21wYWN0aW9uX3JldHJpZXMgPD0gbWF4X3JldHJpZXMpCi0JCXJldHVybiB0cnVlOwotCi0JcmV0dXJuIGZhbHNlOwotfQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKgogX19hbGxvY19wYWdlc19kaXJlY3RfY29tcGFjdChnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyLApAQCAtMzE5NSw2ICszMTQ3LDggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorI2VuZGlmIC8qIENPTkZJR19DT01QQUNUSU9OICovCisKIHN0YXRpYyBpbmxpbmUgYm9vbAogc2hvdWxkX2NvbXBhY3RfcmV0cnkoc3RydWN0IGFsbG9jX2NvbnRleHQgKmFjLCB1bnNpZ25lZCBpbnQgb3JkZXIsIGludCBhbGxvY19mbGFncywKIAkJICAgICBlbnVtIGNvbXBhY3RfcmVzdWx0IGNvbXBhY3RfcmVzdWx0LApAQCAtMzIyMSw3ICszMTc1LDYgQEAKIAl9CiAJcmV0dXJuIGZhbHNlOwogfQotI2VuZGlmIC8qIENPTkZJR19DT01QQUNUSU9OICovCiAKIC8qIFBlcmZvcm0gZGlyZWN0IHN5bmNocm9ub3VzIHBhZ2UgcmVjbGFpbSAqLwogc3RhdGljIGludApAQCAtNDQwNyw3ICs0MzYwLDcgQEAKIAlkbyB7CiAJCXpvbmVfdHlwZS0tOwogCQl6b25lID0gcGdkYXQtPm5vZGVfem9uZXMgKyB6b25lX3R5cGU7Ci0JCWlmIChwb3B1bGF0ZWRfem9uZSh6b25lKSkgeworCQlpZiAobWFuYWdlZF96b25lKHpvbmUpKSB7CiAJCQl6b25lcmVmX3NldF96b25lKHpvbmUsCiAJCQkJJnpvbmVsaXN0LT5fem9uZXJlZnNbbnJfem9uZXMrK10pOwogCQkJY2hlY2tfaGlnaGVzdF96b25lKHpvbmVfdHlwZSk7CkBAIC00NjQ1LDcgKzQ1OTgsNyBAQAogCQlmb3IgKGogPSAwOyBqIDwgbnJfbm9kZXM7IGorKykgewogCQkJbm9kZSA9IG5vZGVfb3JkZXJbal07CiAJCQl6ID0gJk5PREVfREFUQShub2RlKS0+bm9kZV96b25lc1t6b25lX3R5cGVdOwotCQkJaWYgKHBvcHVsYXRlZF96b25lKHopKSB7CisJCQlpZiAobWFuYWdlZF96b25lKHopKSB7CiAJCQkJem9uZXJlZl9zZXRfem9uZSh6LAogCQkJCQkmem9uZWxpc3QtPl96b25lcmVmc1twb3MrK10pOwogCQkJCWNoZWNrX2hpZ2hlc3Rfem9uZSh6b25lX3R5cGUpOwpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9pby5jIGIvbW0vcGFnZV9pby5jCmluZGV4IDE2YmQ4MmZhLi5lYWZlNWRkIDEwMDY0NAotLS0gYS9tbS9wYWdlX2lvLmMKKysrIGIvbW0vcGFnZV9pby5jCkBAIC0yNjQsNiArMjY0LDcgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBwYWdlX3N3YXBfaW5mbyhwYWdlKTsKIAorCUJVR19PTighUGFnZVN3YXBDYWNoZShwYWdlKSk7CiAJaWYgKHNpcy0+ZmxhZ3MgJiBTV1BfRklMRSkgewogCQlzdHJ1Y3Qga2lvY2Iga2lvY2I7CiAJCXN0cnVjdCBmaWxlICpzd2FwX2ZpbGUgPSBzaXMtPnN3YXBfZmlsZTsKQEAgLTMzNyw2ICszMzgsNyBAQAogCWludCByZXQgPSAwOwogCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBwYWdlX3N3YXBfaW5mbyhwYWdlKTsKIAorCUJVR19PTighUGFnZVN3YXBDYWNoZShwYWdlKSk7CiAJVk1fQlVHX09OX1BBR0UoIVBhZ2VMb2NrZWQocGFnZSksIHBhZ2UpOwogCVZNX0JVR19PTl9QQUdFKFBhZ2VVcHRvZGF0ZShwYWdlKSwgcGFnZSk7CiAJaWYgKGZyb250c3dhcF9sb2FkKHBhZ2UpID09IDApIHsKQEAgLTM4Niw2ICszODgsNyBAQAogCiAJaWYgKHNpcy0+ZmxhZ3MgJiBTV1BfRklMRSkgewogCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHNpcy0+c3dhcF9maWxlLT5mX21hcHBpbmc7CisJCUJVR19PTighUGFnZVN3YXBDYWNoZShwYWdlKSk7CiAJCXJldHVybiBtYXBwaW5nLT5hX29wcy0+c2V0X3BhZ2VfZGlydHkocGFnZSk7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIF9fc2V0X3BhZ2VfZGlydHlfbm9fd3JpdGViYWNrKHBhZ2UpOwpkaWZmIC0tZ2l0IGEvbW0vcmVhZGFoZWFkLmMgYi9tbS9yZWFkYWhlYWQuYwppbmRleCA2NWVjMjg4Li5jOGE5NTViIDEwMDY0NAotLS0gYS9tbS9yZWFkYWhlYWQuYworKysgYi9tbS9yZWFkYWhlYWQuYwpAQCAtOCw2ICs4LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGF4Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CkBAIC01NDQsNiArNTQ1LDE0IEBACiAJaWYgKCFtYXBwaW5nIHx8ICFtYXBwaW5nLT5hX29wcykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKgorCSAqIFJlYWRhaGVhZCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIERBWCBpbm9kZXMsIGJ1dCB3ZSBkb24ndCB3YW50IGl0CisJICogdG8gcmVwb3J0IGEgZmFpbHVyZSBlaXRoZXIuICBJbnN0ZWFkLCB3ZSBqdXN0IHJldHVybiBzdWNjZXNzIGFuZAorCSAqIGRvbid0IGRvIGFueSB3b3JrLgorCSAqLworCWlmIChkYXhfbWFwcGluZyhtYXBwaW5nKSkKKwkJcmV0dXJuIDA7CisKIAlyZXR1cm4gZm9yY2VfcGFnZV9jYWNoZV9yZWFkYWhlYWQobWFwcGluZywgZmlscCwgaW5kZXgsIG5yKTsKIH0KIApkaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmMKaW5kZXggZmQ4YjJiNS4uOTcxZmM4MyAxMDA2NDQKLS0tIGEvbW0vc2htZW0uYworKysgYi9tbS9zaG1lbS5jCkBAIC0yNzAsNyArMjcwLDcgQEAKIAkJaW5mby0+YWxsb2NlZCAtPSBwYWdlczsKIAkJc2htZW1fcmVjYWxjX2lub2RlKGlub2RlKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCisJCXNobWVtX3VuYWNjdF9ibG9ja3MoaW5mby0+ZmxhZ3MsIHBhZ2VzKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAlwZXJjcHVfY291bnRlcl9hZGQoJnNiaW5mby0+dXNlZF9ibG9ja3MsIHBhZ2VzKTsKQEAgLTI5MSw2ICsyOTEsNyBAQAogCiAJaWYgKHNiaW5mby0+bWF4X2Jsb2NrcykKIAkJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmluZm8tPnVzZWRfYmxvY2tzLCBwYWdlcyk7CisJc2htZW1fdW5hY2N0X2Jsb2NrcyhpbmZvLT5mbGFncywgcGFnZXMpOwogfQogCiAvKgpAQCAtMTk4MCw3ICsxOTgxLDcgQEAKIAkJCQlyZXR1cm4gYWRkcjsKIAkJCXNiID0gc2htX21udC0+bW50X3NiOwogCQl9Ci0JCWlmIChTSE1FTV9TQihzYiktPmh1Z2UgIT0gU0hNRU1fSFVHRV9ORVZFUikKKwkJaWYgKFNITUVNX1NCKHNiKS0+aHVnZSA9PSBTSE1FTV9IVUdFX05FVkVSKQogCQkJcmV0dXJuIGFkZHI7CiAJfQogCmRpZmYgLS1naXQgYS9tbS9zbGFiLmMgYi9tbS9zbGFiLmMKaW5kZXggYjY3MjcxMC4uMDkwZmIyNiAxMDA2NDQKLS0tIGEvbW0vc2xhYi5jCisrKyBiL21tL3NsYWIuYwpAQCAtODg2LDYgKzg4Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZiAoZGVmaW5lZChDT05GSUdfTlVNQSkgJiYgZGVmaW5lZChDT05GSUdfTUVNT1JZX0hPVFBMVUcpKSB8fCBkZWZpbmVkKENPTkZJR19TTVApCiAvKgogICogQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBub2RlIGZvciBhIG5vZGUgb24gZWFjaCBzbGFiIGNhY2hlLCB1c2VkIGZvcgogICogZWl0aGVyIG1lbW9yeSBvciBjcHUgaG90cGx1Zy4gIElmIG1lbW9yeSBpcyBiZWluZyBob3QtYWRkZWQsIHRoZSBrbWVtX2NhY2hlX25vZGUKQEAgLTkwOCw2ICs5MDksNyBAQAogCiAJcmV0dXJuIDA7CiB9CisjZW5kaWYKIAogc3RhdGljIGludCBzZXR1cF9rbWVtX2NhY2hlX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKIAkJCQlpbnQgbm9kZSwgZ2ZwX3QgZ2ZwLCBib29sIGZvcmNlX2NoYW5nZSkKQEAgLTk3NSw2ICs5NzcsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfU01QCisKIHN0YXRpYyB2b2lkIGNwdXVwX2NhbmNlbGVkKGxvbmcgY3B1KQogewogCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXA7CkBAIC0xMDc1LDY1ICsxMDc5LDU0IEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXN0YXRpYyBpbnQgY3B1dXBfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQoraW50IHNsYWJfcHJlcGFyZV9jcHUodW5zaWduZWQgaW50IGNwdSkKIHsKLQlsb25nIGNwdSA9IChsb25nKWhjcHU7Ci0JaW50IGVyciA9IDA7CisJaW50IGVycjsKIAotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRToKLQljYXNlIENQVV9VUF9QUkVQQVJFX0ZST1pFTjoKLQkJbXV0ZXhfbG9jaygmc2xhYl9tdXRleCk7Ci0JCWVyciA9IGNwdXVwX3ByZXBhcmUoY3B1KTsKLQkJbXV0ZXhfdW5sb2NrKCZzbGFiX211dGV4KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX09OTElORV9GUk9aRU46Ci0JCXN0YXJ0X2NwdV90aW1lcihjcHUpOwotCQlicmVhazsKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLSAgCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKLSAgCWNhc2UgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU46Ci0JCS8qCi0JCSAqIFNodXRkb3duIGNhY2hlIHJlYXBlci4gTm90ZSB0aGF0IHRoZSBzbGFiX211dGV4IGlzCi0JCSAqIGhlbGQgc28gdGhhdCBpZiBjYWNoZV9yZWFwKCkgaXMgaW52b2tlZCBpdCBjYW5ub3QgZG8KLQkJICogYW55dGhpbmcgZXhwZW5zaXZlIGJ1dCB3aWxsIG9ubHkgbW9kaWZ5IHJlYXBfd29yawotCQkgKiBhbmQgcmVzY2hlZHVsZSB0aGUgdGltZXIuCi0JCSovCi0JCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcGVyX2NwdShzbGFiX3JlYXBfd29yaywgY3B1KSk7Ci0JCS8qIE5vdyB0aGUgY2FjaGVfcmVhcGVyIGlzIGd1YXJhbnRlZWQgdG8gYmUgbm90IHJ1bm5pbmcuICovCi0JCXBlcl9jcHUoc2xhYl9yZWFwX3dvcmssIGNwdSkud29yay5mdW5jID0gTlVMTDsKLSAgCQlicmVhazsKLSAgCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgotICAJY2FzZSBDUFVfRE9XTl9GQUlMRURfRlJPWkVOOgotCQlzdGFydF9jcHVfdGltZXIoY3B1KTsKLSAgCQlicmVhazsKLQljYXNlIENQVV9ERUFEOgotCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgotCQkvKgotCQkgKiBFdmVuIGlmIGFsbCB0aGUgY3B1cyBvZiBhIG5vZGUgYXJlIGRvd24sIHdlIGRvbid0IGZyZWUgdGhlCi0JCSAqIGttZW1fY2FjaGVfbm9kZSBvZiBhbnkgY2FjaGUuIFRoaXMgdG8gYXZvaWQgYSByYWNlIGJldHdlZW4KLQkJICogY3B1X2Rvd24sIGFuZCBhIGttYWxsb2MgYWxsb2NhdGlvbiBmcm9tIGFub3RoZXIgY3B1IGZvcgotCQkgKiBtZW1vcnkgZnJvbSB0aGUgbm9kZSBvZiB0aGUgY3B1IGdvaW5nIGRvd24uICBUaGUgbm9kZQotCQkgKiBzdHJ1Y3R1cmUgaXMgdXN1YWxseSBhbGxvY2F0ZWQgZnJvbSBrbWVtX2NhY2hlX2NyZWF0ZSgpIGFuZAotCQkgKiBnZXRzIGRlc3Ryb3llZCBhdCBrbWVtX2NhY2hlX2Rlc3Ryb3koKS4KLQkJICovCi0JCS8qIGZhbGwgdGhyb3VnaCAqLwotI2VuZGlmCi0JY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6Ci0JY2FzZSBDUFVfVVBfQ0FOQ0VMRURfRlJPWkVOOgotCQltdXRleF9sb2NrKCZzbGFiX211dGV4KTsKLQkJY3B1dXBfY2FuY2VsZWQoY3B1KTsKLQkJbXV0ZXhfdW5sb2NrKCZzbGFiX211dGV4KTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKGVycik7CisJbXV0ZXhfbG9jaygmc2xhYl9tdXRleCk7CisJZXJyID0gY3B1dXBfcHJlcGFyZShjcHUpOworCW11dGV4X3VubG9jaygmc2xhYl9tdXRleCk7CisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjcHVjYWNoZV9ub3RpZmllciA9IHsKLQkmY3B1dXBfY2FsbGJhY2ssIE5VTEwsIDAKLX07CisvKgorICogVGhpcyBpcyBjYWxsZWQgZm9yIGEgZmFpbGVkIG9ubGluZSBhdHRlbXB0IGFuZCBmb3IgYSBzdWNjZXNzZnVsCisgKiBvZmZsaW5lLgorICoKKyAqIEV2ZW4gaWYgYWxsIHRoZSBjcHVzIG9mIGEgbm9kZSBhcmUgZG93biwgd2UgZG9uJ3QgZnJlZSB0aGUKKyAqIGttZW1fbGlzdDMgb2YgYW55IGNhY2hlLiBUaGlzIHRvIGF2b2lkIGEgcmFjZSBiZXR3ZWVuIGNwdV9kb3duLCBhbmQKKyAqIGEga21hbGxvYyBhbGxvY2F0aW9uIGZyb20gYW5vdGhlciBjcHUgZm9yIG1lbW9yeSBmcm9tIHRoZSBub2RlIG9mCisgKiB0aGUgY3B1IGdvaW5nIGRvd24uICBUaGUgbGlzdDMgc3RydWN0dXJlIGlzIHVzdWFsbHkgYWxsb2NhdGVkIGZyb20KKyAqIGttZW1fY2FjaGVfY3JlYXRlKCkgYW5kIGdldHMgZGVzdHJveWVkIGF0IGttZW1fY2FjaGVfZGVzdHJveSgpLgorICovCitpbnQgc2xhYl9kZWFkX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQoreworCW11dGV4X2xvY2soJnNsYWJfbXV0ZXgpOworCWNwdXVwX2NhbmNlbGVkKGNwdSk7CisJbXV0ZXhfdW5sb2NrKCZzbGFiX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHNsYWJfb25saW5lX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0YXJ0X2NwdV90aW1lcihjcHUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsYWJfb2ZmbGluZV9jcHUodW5zaWduZWQgaW50IGNwdSkKK3sKKwkvKgorCSAqIFNodXRkb3duIGNhY2hlIHJlYXBlci4gTm90ZSB0aGF0IHRoZSBzbGFiX211dGV4IGlzIGhlbGQgc28KKwkgKiB0aGF0IGlmIGNhY2hlX3JlYXAoKSBpcyBpbnZva2VkIGl0IGNhbm5vdCBkbyBhbnl0aGluZworCSAqIGV4cGVuc2l2ZSBidXQgd2lsbCBvbmx5IG1vZGlmeSByZWFwX3dvcmsgYW5kIHJlc2NoZWR1bGUgdGhlCisJICogdGltZXIuCisJICovCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwZXJfY3B1KHNsYWJfcmVhcF93b3JrLCBjcHUpKTsKKwkvKiBOb3cgdGhlIGNhY2hlX3JlYXBlciBpcyBndWFyYW50ZWVkIHRvIGJlIG5vdCBydW5uaW5nLiAqLworCXBlcl9jcHUoc2xhYl9yZWFwX3dvcmssIGNwdSkud29yay5mdW5jID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KIAogI2lmIGRlZmluZWQoQ09ORklHX05VTUEpICYmIGRlZmluZWQoQ09ORklHX01FTU9SWV9IT1RQTFVHKQogLyoKQEAgLTEzMzYsMTIgKzEzMjksNiBAQAogCS8qIERvbmUhICovCiAJc2xhYl9zdGF0ZSA9IEZVTEw7CiAKLQkvKgotCSAqIFJlZ2lzdGVyIGEgY3B1IHN0YXJ0dXAgbm90aWZpZXIgY2FsbGJhY2sgdGhhdCBpbml0aWFsaXplcwotCSAqIGNwdV9jYWNoZV9nZXQgZm9yIGFsbCBuZXcgY3B1cwotCSAqLwotCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmY3B1Y2FjaGVfbm90aWZpZXIpOwotCiAjaWZkZWYgQ09ORklHX05VTUEKIAkvKgogCSAqIFJlZ2lzdGVyIGEgbWVtb3J5IGhvdHBsdWcgY2FsbGJhY2sgdGhhdCBpbml0aWFsaXplcyBhbmQgZnJlZXMKQEAgLTEzNTgsMTMgKzEzNDUsMTQgQEAKIAogc3RhdGljIGludCBfX2luaXQgY3B1Y2FjaGVfaW5pdCh2b2lkKQogewotCWludCBjcHU7CisJaW50IHJldDsKIAogCS8qCiAJICogUmVnaXN0ZXIgdGhlIHRpbWVycyB0aGF0IHJldHVybiB1bm5lZWRlZCBwYWdlcyB0byB0aGUgcGFnZSBhbGxvY2F0b3IKIAkgKi8KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKLQkJc3RhcnRfY3B1X3RpbWVyKGNwdSk7CisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGUoQ1BVSFBfQVBfT05MSU5FX0RZTiwgIlNMQUIgb25saW5lIiwKKwkJCQlzbGFiX29ubGluZV9jcHUsIHNsYWJfb2ZmbGluZV9jcHUpOworCVdBUk5fT04ocmV0IDwgMCk7CiAKIAkvKiBEb25lISAqLwogCXNsYWJfc3RhdGUgPSBGVUxMOwpkaWZmIC0tZ2l0IGEvbW0vc2x1Yi5jIGIvbW0vc2x1Yi5jCmluZGV4IDlhZGFlNTguLjJiM2U3NDAgMTAwNjQ0Ci0tLSBhL21tL3NsdWIuYworKysgYi9tbS9zbHViLmMKQEAgLTE5NCwxMCArMTk0LDYgQEAKICNkZWZpbmUgX19PQkpFQ1RfUE9JU09OCQkweDgwMDAwMDAwVUwgLyogUG9pc29uIG9iamVjdCAqLwogI2RlZmluZSBfX0NNUFhDSEdfRE9VQkxFCTB4NDAwMDAwMDBVTCAvKiBVc2UgY21weGNoZ19kb3VibGUgKi8KIAotI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgc2xhYl9ub3RpZmllcjsKLSNlbmRpZgotCiAvKgogICogVHJhY2tpbmcgdXNlciBvZiBhIHNsYWIuCiAgKi8KQEAgLTIzMDUsNiArMjMwMSwyNSBAQAogfQogCiAvKgorICogVXNlIHRoZSBjcHUgbm90aWZpZXIgdG8gaW5zdXJlIHRoYXQgdGhlIGNwdSBzbGFicyBhcmUgZmx1c2hlZCB3aGVuCisgKiBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyBpbnQgc2x1Yl9jcHVfZGVhZCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBrbWVtX2NhY2hlICpzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltdXRleF9sb2NrKCZzbGFiX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHMsICZzbGFiX2NhY2hlcywgbGlzdCkgeworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCV9fZmx1c2hfY3B1X3NsYWIocywgY3B1KTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KKwltdXRleF91bmxvY2soJnNsYWJfbXV0ZXgpOworCXJldHVybiAwOworfQorCisvKgogICogQ2hlY2sgaWYgdGhlIG9iamVjdHMgaW4gYSBwZXIgY3B1IHN0cnVjdHVyZSBmaXQgbnVtYQogICogbG9jYWxpdHkgZXhwZWN0YXRpb25zLgogICovCkBAIC00MTQ0LDkgKzQxNTksOCBAQAogCS8qIFNldHVwIHJhbmRvbSBmcmVlbGlzdHMgZm9yIGVhY2ggY2FjaGUgKi8KIAlpbml0X2ZyZWVsaXN0X3JhbmRvbWl6YXRpb24oKTsKIAotI2lmZGVmIENPTkZJR19TTVAKLQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnNsYWJfbm90aWZpZXIpOwotI2VuZGlmCisJY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9TTFVCX0RFQUQsICJzbHViOmRlYWQiLCBOVUxMLAorCQkJCSAgc2x1Yl9jcHVfZGVhZCk7CiAKIAlwcl9pbmZvKCJTTFVCOiBIV2FsaWduPSVkLCBPcmRlcj0lZC0lZCwgTWluT2JqZWN0cz0lZCwgQ1BVcz0lZCwgTm9kZXM9JWRcbiIsCiAJCWNhY2hlX2xpbmVfc2l6ZSgpLApAQCAtNDIxMCw0MyArNDIyNCw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotI2lmZGVmIENPTkZJR19TTVAKLS8qCi0gKiBVc2UgdGhlIGNwdSBub3RpZmllciB0byBpbnN1cmUgdGhhdCB0aGUgY3B1IHNsYWJzIGFyZSBmbHVzaGVkIHdoZW4KLSAqIG5lY2Vzc2FyeS4KLSAqLwotc3RhdGljIGludCBzbGFiX2NwdXVwX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAotCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKLXsKLQlsb25nIGNwdSA9IChsb25nKWhjcHU7Ci0Jc3RydWN0IGttZW1fY2FjaGUgKnM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6Ci0JY2FzZSBDUFVfVVBfQ0FOQ0VMRURfRlJPWkVOOgotCWNhc2UgQ1BVX0RFQUQ6Ci0JY2FzZSBDUFVfREVBRF9GUk9aRU46Ci0JCW11dGV4X2xvY2soJnNsYWJfbXV0ZXgpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHMsICZzbGFiX2NhY2hlcywgbGlzdCkgewotCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQkJX19mbHVzaF9jcHVfc2xhYihzLCBjcHUpOwotCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQl9Ci0JCW11dGV4X3VubG9jaygmc2xhYl9tdXRleCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gTk9USUZZX09LOwotfQotCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNsYWJfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBzbGFiX2NwdXVwX2NhbGxiYWNrCi19OwotCi0jZW5kaWYKLQogdm9pZCAqX19rbWFsbG9jX3RyYWNrX2NhbGxlcihzaXplX3Qgc2l6ZSwgZ2ZwX3QgZ2ZwZmxhZ3MsIHVuc2lnbmVkIGxvbmcgY2FsbGVyKQogewogCXN0cnVjdCBrbWVtX2NhY2hlICpzOwpkaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmMKaW5kZXggNzhjZmEyOS4uMjY1N2FjYyAxMDA2NDQKLS0tIGEvbW0vc3dhcGZpbGUuYworKysgYi9tbS9zd2FwZmlsZS5jCkBAIC0yNzI0LDcgKzI3MjQsNiBAQAogc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnBhZ2Vfc3dhcF9pbmZvKHN0cnVjdCBwYWdlICpwYWdlKQogewogCXN3cF9lbnRyeV90IHN3YXAgPSB7IC52YWwgPSBwYWdlX3ByaXZhdGUocGFnZSkgfTsKLQlCVUdfT04oIVBhZ2VTd2FwQ2FjaGUocGFnZSkpOwogCXJldHVybiBzd2FwX2luZm9bc3dwX3R5cGUoc3dhcCldOwogfQogCmRpZmYgLS1naXQgYS9tbS91c2VyY29weS5jIGIvbW0vdXNlcmNvcHkuYwppbmRleCA4ZWJhZTkxLi4zYzhkYTBhIDEwMDY0NAotLS0gYS9tbS91c2VyY29weS5jCisrKyBiL21tL3VzZXJjb3B5LmMKQEAgLTgzLDcgKzgzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGNoZWNrX2hpZ2ggPSBjaGVja19sb3cgKyBuOwogCiAJLyogRG9lcyBub3Qgb3ZlcmxhcCBpZiBlbnRpcmVseSBhYm92ZSBvciBlbnRpcmVseSBiZWxvdy4gKi8KLQlpZiAoY2hlY2tfbG93ID49IGhpZ2ggfHwgY2hlY2tfaGlnaCA8IGxvdykKKwlpZiAoY2hlY2tfbG93ID49IGhpZ2ggfHwgY2hlY2tfaGlnaCA8PSBsb3cpCiAJCXJldHVybiBmYWxzZTsKIAogCXJldHVybiB0cnVlOwpAQCAtMTI0LDcgKzEyNCw3IEBACiBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNoZWNrX2JvZ3VzX2FkZHJlc3MoY29uc3Qgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJLyogUmVqZWN0IGlmIG9iamVjdCB3cmFwcyBwYXN0IGVuZCBvZiBtZW1vcnkuICovCi0JaWYgKHB0ciArIG4gPCBwdHIpCisJaWYgKCh1bnNpZ25lZCBsb25nKXB0ciArIG4gPCAodW5zaWduZWQgbG9uZylwdHIpCiAJCXJldHVybiAiPHdyYXBwZWQgYWRkcmVzcz4iOwogCiAJLyogUmVqZWN0IGlmIE5VTEwgb3IgWkVSTy1hbGxvY2F0aW9uLiAqLwpAQCAtMTM0LDMxICsxMzQsMTYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjaGVja19oZWFwX29iamVjdChjb25zdCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgbiwKLQkJCQkJICAgIGJvb2wgdG9fdXNlcikKKy8qIENoZWNrcyBmb3IgYWxsb2NzIHRoYXQgYXJlIG1hcmtlZCBpbiBzb21lIHdheSBhcyBzcGFubmluZyBtdWx0aXBsZSBwYWdlcy4gKi8KK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqY2hlY2tfcGFnZV9zcGFuKGNvbnN0IHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBuLAorCQkJCQkgIHN0cnVjdCBwYWdlICpwYWdlLCBib29sIHRvX3VzZXIpCiB7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UsICplbmRwYWdlOworI2lmZGVmIENPTkZJR19IQVJERU5FRF9VU0VSQ09QWV9QQUdFU1BBTgogCWNvbnN0IHZvaWQgKmVuZCA9IHB0ciArIG4gLSAxOworCXN0cnVjdCBwYWdlICplbmRwYWdlOwogCWJvb2wgaXNfcmVzZXJ2ZWQsIGlzX2NtYTsKIAogCS8qCi0JICogU29tZSBhcmNoaXRlY3R1cmVzIChhcm02NCkgcmV0dXJuIHRydWUgZm9yIHZpcnRfYWRkcl92YWxpZCgpIG9uCi0JICogdm1hbGxvY2VkIGFkZHJlc3Nlcy4gV29yayBhcm91bmQgdGhpcyBieSBjaGVja2luZyBmb3Igdm1hbGxvYwotCSAqIGZpcnN0LgotCSAqLwotCWlmIChpc192bWFsbG9jX2FkZHIocHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoIXZpcnRfYWRkcl92YWxpZChwdHIpKQotCQlyZXR1cm4gTlVMTDsKLQotCXBhZ2UgPSB2aXJ0X3RvX2hlYWRfcGFnZShwdHIpOwotCi0JLyogQ2hlY2sgc2xhYiBhbGxvY2F0b3IgZm9yIGZsYWdzIGFuZCBzaXplLiAqLwotCWlmIChQYWdlU2xhYihwYWdlKSkKLQkJcmV0dXJuIF9fY2hlY2tfaGVhcF9vYmplY3QocHRyLCBuLCBwYWdlKTsKLQotCS8qCiAJICogU29tZXRpbWVzIHRoZSBrZXJuZWwgZGF0YSByZWdpb25zIGFyZSBub3QgbWFya2VkIFJlc2VydmVkIChzZWUKIAkgKiBjaGVjayBiZWxvdykuIEFuZCBzb21ldGltZXMgW19zZGF0YSxfZWRhdGEpIGRvZXMgbm90IGNvdmVyCiAJICogcm9kYXRhIGFuZC9vciBic3MsIHNvIGNoZWNrIGVhY2ggcmFuZ2UgZXhwbGljaXRseS4KQEAgLTE4Niw3ICsxNzEsNyBAQAogCQkgICAoKHVuc2lnbmVkIGxvbmcpZW5kICYgKHVuc2lnbmVkIGxvbmcpUEFHRV9NQVNLKSkpCiAJCXJldHVybiBOVUxMOwogCi0JLyogQWxsb3cgaWYgc3RhcnQgYW5kIGVuZCBhcmUgaW5zaWRlIHRoZSBzYW1lIGNvbXBvdW5kIHBhZ2UuICovCisJLyogQWxsb3cgaWYgZnVsbHkgaW5zaWRlIHRoZSBzYW1lIGNvbXBvdW5kIChfX0dGUF9DT01QKSBwYWdlLiAqLwogCWVuZHBhZ2UgPSB2aXJ0X3RvX2hlYWRfcGFnZShlbmQpOwogCWlmIChsaWtlbHkoZW5kcGFnZSA9PSBwYWdlKSkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xOTksMjAgKzE4NCw0NyBAQAogCWlzX3Jlc2VydmVkID0gUGFnZVJlc2VydmVkKHBhZ2UpOwogCWlzX2NtYSA9IGlzX21pZ3JhdGVfY21hX3BhZ2UocGFnZSk7CiAJaWYgKCFpc19yZXNlcnZlZCAmJiAhaXNfY21hKQotCQlnb3RvIHJlamVjdDsKKwkJcmV0dXJuICI8c3BhbnMgbXVsdGlwbGUgcGFnZXM+IjsKIAogCWZvciAocHRyICs9IFBBR0VfU0laRTsgcHRyIDw9IGVuZDsgcHRyICs9IFBBR0VfU0laRSkgewogCQlwYWdlID0gdmlydF90b19oZWFkX3BhZ2UocHRyKTsKIAkJaWYgKGlzX3Jlc2VydmVkICYmICFQYWdlUmVzZXJ2ZWQocGFnZSkpCi0JCQlnb3RvIHJlamVjdDsKKwkJCXJldHVybiAiPHNwYW5zIFJlc2VydmVkIGFuZCBub24tUmVzZXJ2ZWQgcGFnZXM+IjsKIAkJaWYgKGlzX2NtYSAmJiAhaXNfbWlncmF0ZV9jbWFfcGFnZShwYWdlKSkKLQkJCWdvdG8gcmVqZWN0OworCQkJcmV0dXJuICI8c3BhbnMgQ01BIGFuZCBub24tQ01BIHBhZ2VzPiI7CiAJfQorI2VuZGlmCiAKIAlyZXR1cm4gTlVMTDsKK30KIAotcmVqZWN0OgotCXJldHVybiAiPHNwYW5zIG11bHRpcGxlIHBhZ2VzPiI7CitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNoZWNrX2hlYXBfb2JqZWN0KGNvbnN0IHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBuLAorCQkJCQkgICAgYm9vbCB0b191c2VyKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJLyoKKwkgKiBTb21lIGFyY2hpdGVjdHVyZXMgKGFybTY0KSByZXR1cm4gdHJ1ZSBmb3IgdmlydF9hZGRyX3ZhbGlkKCkgb24KKwkgKiB2bWFsbG9jZWQgYWRkcmVzc2VzLiBXb3JrIGFyb3VuZCB0aGlzIGJ5IGNoZWNraW5nIGZvciB2bWFsbG9jCisJICogZmlyc3QuCisJICoKKwkgKiBXZSBhbHNvIG5lZWQgdG8gY2hlY2sgZm9yIG1vZHVsZSBhZGRyZXNzZXMgZXhwbGljaXRseSBzaW5jZSB3ZQorCSAqIG1heSBjb3B5IHN0YXRpYyBkYXRhIGZyb20gbW9kdWxlcyB0byB1c2Vyc3BhY2UKKwkgKi8KKwlpZiAoaXNfdm1hbGxvY19vcl9tb2R1bGVfYWRkcihwdHIpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghdmlydF9hZGRyX3ZhbGlkKHB0cikpCisJCXJldHVybiBOVUxMOworCisJcGFnZSA9IHZpcnRfdG9faGVhZF9wYWdlKHB0cik7CisKKwkvKiBDaGVjayBzbGFiIGFsbG9jYXRvciBmb3IgZmxhZ3MgYW5kIHNpemUuICovCisJaWYgKFBhZ2VTbGFiKHBhZ2UpKQorCQlyZXR1cm4gX19jaGVja19oZWFwX29iamVjdChwdHIsIG4sIHBhZ2UpOworCisJLyogVmVyaWZ5IG9iamVjdCBkb2VzIG5vdCBpbmNvcnJlY3RseSBzcGFuIG11bHRpcGxlIHBhZ2VzLiAqLworCXJldHVybiBjaGVja19wYWdlX3NwYW4ocHRyLCBuLCBwYWdlLCB0b191c2VyKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL21tL3Ztc2Nhbi5jIGIvbW0vdm1zY2FuLmMKaW5kZXggMzc0ZDk1ZC4uMGZlOGI3MSAxMDA2NDQKLS0tIGEvbW0vdm1zY2FuLmMKKysrIGIvbW0vdm1zY2FuLmMKQEAgLTE2NjUsNyArMTY2NSw3IEBACiAKIAlmb3IgKHppZCA9IHNjLT5yZWNsYWltX2lkeDsgemlkID49IDA7IHppZC0tKSB7CiAJCXpvbmUgPSAmcGdkYXQtPm5vZGVfem9uZXNbemlkXTsKLQkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKKwkJaWYgKCFtYW5hZ2VkX3pvbmUoem9uZSkpCiAJCQljb250aW51ZTsKIAogCQlpZiAoem9uZV9wYWdlX3N0YXRlX3NuYXBzaG90KHpvbmUsIE5SX1pPTkVfTFJVX0JBU0UgKwpAQCAtMjAzNiw3ICsyMDM2LDcgQEAKIAkJc3RydWN0IHpvbmUgKnpvbmUgPSAmcGdkYXQtPm5vZGVfem9uZXNbemlkXTsKIAkJdW5zaWduZWQgbG9uZyBpbmFjdGl2ZV96b25lLCBhY3RpdmVfem9uZTsKIAotCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQorCQlpZiAoIW1hbmFnZWRfem9uZSh6b25lKSkKIAkJCWNvbnRpbnVlOwogCiAJCWluYWN0aXZlX3pvbmUgPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwKQEAgLTIxNzEsNyArMjE3MSw3IEBACiAKIAkJZm9yICh6ID0gMDsgeiA8IE1BWF9OUl9aT05FUzsgeisrKSB7CiAJCQlzdHJ1Y3Qgem9uZSAqem9uZSA9ICZwZ2RhdC0+bm9kZV96b25lc1t6XTsKLQkJCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpCisJCQlpZiAoIW1hbmFnZWRfem9uZSh6b25lKSkKIAkJCQljb250aW51ZTsKIAogCQkJdG90YWxfaGlnaF93bWFyayArPSBoaWdoX3dtYXJrX3BhZ2VzKHpvbmUpOwpAQCAtMjMwMywyMyArMjMwMyw2IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHX0FSQ0hfV0FOVF9CQVRDSEVEX1VOTUFQX1RMQl9GTFVTSAotc3RhdGljIHZvaWQgaW5pdF90bGJfdWJjKHZvaWQpCi17Ci0JLyoKLQkgKiBUaGlzIGRlbGliZXJhdGVseSBkb2VzIG5vdCBjbGVhciB0aGUgY3B1bWFzayBhcyBpdCdzIGV4cGVuc2l2ZQotCSAqIGFuZCB1bm5lY2Vzc2FyeS4gSWYgdGhlcmUgaGFwcGVucyB0byBiZSBkYXRhIGluIHRoZXJlIHRoZW4gdGhlCi0JICogZmlyc3QgU1dBUF9DTFVTVEVSX01BWCBwYWdlcyB3aWxsIHNlbmQgYW4gdW5uZWNlc3NhcnkgSVBJIGFuZAotCSAqIHRoZW4gd2lsbCBiZSBjbGVhcmVkLgotCSAqLwotCWN1cnJlbnQtPnRsYl91YmMuZmx1c2hfcmVxdWlyZWQgPSBmYWxzZTsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdF90bGJfdWJjKHZvaWQpCi17Ci19Ci0jZW5kaWYgLyogQ09ORklHX0FSQ0hfV0FOVF9CQVRDSEVEX1VOTUFQX1RMQl9GTFVTSCAqLwotCiAvKgogICogVGhpcyBpcyBhIGJhc2ljIHBlci1ub2RlIHBhZ2UgZnJlZXIuICBVc2VkIGJ5IGJvdGgga3N3YXBkIGFuZCBkaXJlY3QgcmVjbGFpbS4KICAqLwpAQCAtMjM1NSw4ICsyMzM4LDYgQEAKIAlzY2FuX2FkanVzdGVkID0gKGdsb2JhbF9yZWNsYWltKHNjKSAmJiAhY3VycmVudF9pc19rc3dhcGQoKSAmJgogCQkJIHNjLT5wcmlvcml0eSA9PSBERUZfUFJJT1JJVFkpOwogCi0JaW5pdF90bGJfdWJjKCk7Ci0KIAlibGtfc3RhcnRfcGx1ZygmcGx1Zyk7CiAJd2hpbGUgKG5yW0xSVV9JTkFDVElWRV9BTk9OXSB8fCBucltMUlVfQUNUSVZFX0ZJTEVdIHx8CiAJCQkJCW5yW0xSVV9JTkFDVElWRV9GSUxFXSkgewpAQCAtMjUxMCw3ICsyNDkxLDcgQEAKIAkvKiBJZiBjb21wYWN0aW9uIHdvdWxkIGdvIGFoZWFkIG9yIHRoZSBhbGxvY2F0aW9uIHdvdWxkIHN1Y2NlZWQsIHN0b3AgKi8KIAlmb3IgKHogPSAwOyB6IDw9IHNjLT5yZWNsYWltX2lkeDsgeisrKSB7CiAJCXN0cnVjdCB6b25lICp6b25lID0gJnBnZGF0LT5ub2RlX3pvbmVzW3pdOwotCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQorCQlpZiAoIW1hbmFnZWRfem9uZSh6b25lKSkKIAkJCWNvbnRpbnVlOwogCiAJCXN3aXRjaCAoY29tcGFjdGlvbl9zdWl0YWJsZSh6b25lLCBzYy0+b3JkZXIsIDAsIHNjLT5yZWNsYWltX2lkeCkpIHsKQEAgLTI4NDAsNyArMjgyMSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDw9IFpPTkVfTk9STUFMOyBpKyspIHsKIAkJem9uZSA9ICZwZ2RhdC0+bm9kZV96b25lc1tpXTsKLQkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSB8fAorCQlpZiAoIW1hbmFnZWRfem9uZSh6b25lKSB8fAogCQkgICAgcGdkYXRfcmVjbGFpbWFibGVfcGFnZXMocGdkYXQpID09IDApCiAJCQljb250aW51ZTsKIApAQCAtMzE0MSw3ICszMTIyLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDw9IGNsYXNzem9uZV9pZHg7IGkrKykgewogCQlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBnZGF0LT5ub2RlX3pvbmVzICsgaTsKIAotCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQorCQlpZiAoIW1hbmFnZWRfem9uZSh6b25lKSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmICghem9uZV9iYWxhbmNlZCh6b25lLCBvcmRlciwgY2xhc3N6b25lX2lkeCkpCkBAIC0zMTY5LDcgKzMxNTAsNyBAQAogCXNjLT5ucl90b19yZWNsYWltID0gMDsKIAlmb3IgKHogPSAwOyB6IDw9IHNjLT5yZWNsYWltX2lkeDsgeisrKSB7CiAJCXpvbmUgPSBwZ2RhdC0+bm9kZV96b25lcyArIHo7Ci0JCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpCisJCWlmICghbWFuYWdlZF96b25lKHpvbmUpKQogCQkJY29udGludWU7CiAKIAkJc2MtPm5yX3RvX3JlY2xhaW0gKz0gbWF4KGhpZ2hfd21hcmtfcGFnZXMoem9uZSksIFNXQVBfQ0xVU1RFUl9NQVgpOwpAQCAtMzI0Miw3ICszMjIzLDcgQEAKIAkJaWYgKGJ1ZmZlcl9oZWFkc19vdmVyX2xpbWl0KSB7CiAJCQlmb3IgKGkgPSBNQVhfTlJfWk9ORVMgLSAxOyBpID49IDA7IGktLSkgewogCQkJCXpvbmUgPSBwZ2RhdC0+bm9kZV96b25lcyArIGk7Ci0JCQkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKKwkJCQlpZiAoIW1hbmFnZWRfem9uZSh6b25lKSkKIAkJCQkJY29udGludWU7CiAKIAkJCQlzYy5yZWNsYWltX2lkeCA9IGk7CkBAIC0zMjYyLDcgKzMyNDMsNyBAQAogCQkgKi8KIAkJZm9yIChpID0gY2xhc3N6b25lX2lkeDsgaSA+PSAwOyBpLS0pIHsKIAkJCXpvbmUgPSBwZ2RhdC0+bm9kZV96b25lcyArIGk7Ci0JCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQorCQkJaWYgKCFtYW5hZ2VkX3pvbmUoem9uZSkpCiAJCQkJY29udGludWU7CiAKIAkJCWlmICh6b25lX2JhbGFuY2VkKHpvbmUsIHNjLm9yZGVyLCBjbGFzc3pvbmVfaWR4KSkKQEAgLTM1MDgsNyArMzQ4OSw3IEBACiAJcGdfZGF0YV90ICpwZ2RhdDsKIAlpbnQgejsKIAotCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpCisJaWYgKCFtYW5hZ2VkX3pvbmUoem9uZSkpCiAJCXJldHVybjsKIAogCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZCh6b25lLCBHRlBfS0VSTkVMIHwgX19HRlBfSEFSRFdBTEwpKQpAQCAtMzUyMiw3ICszNTAzLDcgQEAKIAkvKiBPbmx5IHdha2Uga3N3YXBkIGlmIGFsbCB6b25lcyBhcmUgdW5iYWxhbmNlZCAqLwogCWZvciAoeiA9IDA7IHogPD0gY2xhc3N6b25lX2lkeDsgeisrKSB7CiAJCXpvbmUgPSBwZ2RhdC0+bm9kZV96b25lcyArIHo7Ci0JCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpCisJCWlmICghbWFuYWdlZF96b25lKHpvbmUpKQogCQkJY29udGludWU7CiAKIAkJaWYgKHpvbmVfYmFsYW5jZWQoem9uZSwgb3JkZXIsIGNsYXNzem9uZV9pZHgpKQpkaWZmIC0tZ2l0IGEvbW0vd29ya2luZ3NldC5jIGIvbW0vd29ya2luZ3NldC5jCmluZGV4IDY5NTUxY2YuLjYxNzQ3NWYgMTAwNjQ0Ci0tLSBhL21tL3dvcmtpbmdzZXQuYworKysgYi9tbS93b3JraW5nc2V0LmMKQEAgLTQxOCwyMSArNDE4LDE5IEBACiAJICogbm8gcGFnZXMsIHNvIHdlIGV4cGVjdCB0byBiZSBhYmxlIHRvIHJlbW92ZSB0aGVtIGFsbCBhbmQKIAkgKiBkZWxldGUgYW5kIGZyZWUgdGhlIGVtcHR5IG5vZGUgYWZ0ZXJ3YXJkcy4KIAkgKi8KLQotCUJVR19PTighbm9kZS0+Y291bnQpOwotCUJVR19PTihub2RlLT5jb3VudCAmIFJBRElYX1RSRUVfQ09VTlRfTUFTSyk7CisJQlVHX09OKCF3b3JraW5nc2V0X25vZGVfc2hhZG93cyhub2RlKSk7CisJQlVHX09OKHdvcmtpbmdzZXRfbm9kZV9wYWdlcyhub2RlKSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgUkFESVhfVFJFRV9NQVBfU0laRTsgaSsrKSB7CiAJCWlmIChub2RlLT5zbG90c1tpXSkgewogCQkJQlVHX09OKCFyYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KG5vZGUtPnNsb3RzW2ldKSk7CiAJCQlub2RlLT5zbG90c1tpXSA9IE5VTEw7Ci0JCQlCVUdfT04obm9kZS0+Y291bnQgPCAoMVUgPDwgUkFESVhfVFJFRV9DT1VOVF9TSElGVCkpOwotCQkJbm9kZS0+Y291bnQgLT0gMVUgPDwgUkFESVhfVFJFRV9DT1VOVF9TSElGVDsKKwkJCXdvcmtpbmdzZXRfbm9kZV9zaGFkb3dzX2RlYyhub2RlKTsKIAkJCUJVR19PTighbWFwcGluZy0+bnJleGNlcHRpb25hbCk7CiAJCQltYXBwaW5nLT5ucmV4Y2VwdGlvbmFsLS07CiAJCX0KIAl9Ci0JQlVHX09OKG5vZGUtPmNvdW50KTsKKwlCVUdfT04od29ya2luZ3NldF9ub2RlX3NoYWRvd3Mobm9kZSkpOwogCWluY19ub2RlX3N0YXRlKHBhZ2VfcGdkYXQodmlydF90b19wYWdlKG5vZGUpKSwgV09SS0lOR1NFVF9OT0RFUkVDTEFJTSk7CiAJaWYgKCFfX3JhZGl4X3RyZWVfZGVsZXRlX25vZGUoJm1hcHBpbmctPnBhZ2VfdHJlZSwgbm9kZSkpCiAJCUJVRygpOwpkaWZmIC0tZ2l0IGEvbmV0LzZsb3dwYW4vbmRpc2MuYyBiL25ldC82bG93cGFuL25kaXNjLmMKaW5kZXggODY0NTBiNy4uOTQxZGYyZiAxMDA2NDQKLS0tIGEvbmV0LzZsb3dwYW4vbmRpc2MuYworKysgYi9uZXQvNmxvd3Bhbi9uZGlzYy5jCkBAIC0xMDEsOCArMTAxLDYgQEAKIAkJaWVlZTgwMjE1NF9iZTE2X3RvX2xlMTYoJm5laWdoLT5zaG9ydF9hZGRyLCBsbGFkZHJfc2hvcnQpOwogCQlpZiAoIWxvd3Bhbl84MDIxNTRfaXNfdmFsaWRfc3JjX3Nob3J0X2FkZHIobmVpZ2gtPnNob3J0X2FkZHIpKQogCQkJbmVpZ2gtPnNob3J0X2FkZHIgPSBjcHVfdG9fbGUxNihJRUVFODAyMTU0X0FERFJfU0hPUlRfVU5TUEVDKTsKLQl9IGVsc2UgewotCQluZWlnaC0+c2hvcnRfYWRkciA9IGNwdV90b19sZTE2KElFRUU4MDIxNTRfQUREUl9TSE9SVF9VTlNQRUMpOwogCX0KIAl3cml0ZV91bmxvY2tfYmgoJm4tPmxvY2spOwogfQpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW4uYyBiL25ldC84MDIxcS92bGFuLmMKaW5kZXggODJhMTE2Yi4uOGRlMTM4ZCAxMDA2NDQKLS0tIGEvbmV0LzgwMjFxL3ZsYW4uYworKysgYi9uZXQvODAyMXEvdmxhbi5jCkBAIC0xNjksNyArMTY5LDcgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXRfdW5pbml0X212cnA7CiAKLQl2bGFuLT5uZXN0X2xldmVsID0gZGV2X2dldF9uZXN0X2xldmVsKHJlYWxfZGV2LCBpc192bGFuX2RldikgKyAxOworCXZsYW4tPm5lc3RfbGV2ZWwgPSBkZXZfZ2V0X25lc3RfbGV2ZWwocmVhbF9kZXYpICsgMTsKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXRfdW5pbml0X212cnA7CmRpZmYgLS1naXQgYS9uZXQvS2NvbmZpZyBiL25ldC9LY29uZmlnCmluZGV4IGMyY2RiY2UuLjdiNmNkMzQgMTAwNjQ0Ci0tLSBhL25ldC9LY29uZmlnCisrKyBiL25ldC9LY29uZmlnCkBAIC0zNjksNiArMzY5LDcgQEAKIHNvdXJjZSAibmV0L2JsdWV0b290aC9LY29uZmlnIgogc291cmNlICJuZXQvcnhycGMvS2NvbmZpZyIKIHNvdXJjZSAibmV0L2tjbS9LY29uZmlnIgorc291cmNlICJuZXQvc3RycGFyc2VyL0tjb25maWciCiAKIGNvbmZpZyBGSUJfUlVMRVMKIAlib29sCmRpZmYgLS1naXQgYS9uZXQvTWFrZWZpbGUgYi9uZXQvTWFrZWZpbGUKaW5kZXggOWJkMjBiYi4uNGNhZmFhMiAxMDA2NDQKLS0tIGEvbmV0L01ha2VmaWxlCisrKyBiL25ldC9NYWtlZmlsZQpAQCAtMzUsNiArMzUsNyBAQAogb2JqLSQoQ09ORklHX1NVTlJQQykJCSs9IHN1bnJwYy8KIG9iai0kKENPTkZJR19BRl9SWFJQQykJCSs9IHJ4cnBjLwogb2JqLSQoQ09ORklHX0FGX0tDTSkJCSs9IGtjbS8KK29iai0kKENPTkZJR19TVFJFQU1fUEFSU0VSKQkrPSBzdHJwYXJzZXIvCiBvYmotJChDT05GSUdfQVRNKQkJKz0gYXRtLwogb2JqLSQoQ09ORklHX0wyVFApCQkrPSBsMnRwLwogb2JqLSQoQ09ORklHX0RFQ05FVCkJCSs9IGRlY25ldC8KZGlmZiAtLWdpdCBhL25ldC9hcHBsZXRhbGsvZGRwLmMgYi9uZXQvYXBwbGV0YWxrL2RkcC5jCmluZGV4IGYwNjY3ODEuLjEwZDJiZGMgMTAwNjQ0Ci0tLSBhL25ldC9hcHBsZXRhbGsvZGRwLmMKKysrIGIvbmV0L2FwcGxldGFsay9kZHAuYwpAQCAtMTI3OCw3ICsxMjc4LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBERFApIHx8IGRlZmluZWQoQ09ORklHX0lQRERQX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUEREUCkKIHN0YXRpYyBfX2lubGluZV9fIGludCBpc19pcF9vdmVyX2RkcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXJldHVybiBza2ItPmRhdGFbMTJdID09IDIyOwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9sZWMuYyBiL25ldC9hdG0vbGVjLmMKaW5kZXggZTU3NGE3ZS4uNWQyNjkzOCAxMDA2NDQKLS0tIGEvbmV0L2F0bS9sZWMuYworKysgYi9uZXQvYXRtL2xlYy5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvYXRtbGVjLmg+CiAKIC8qIFByb3h5IExFQyBrbm93cyBhYm91dCBicmlkZ2luZyAqLwotI2lmIGRlZmluZWQoQ09ORklHX0JSSURHRSkgfHwgZGVmaW5lZChDT05GSUdfQlJJREdFX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19CUklER0UpCiAjaW5jbHVkZSAiLi4vYnJpZGdlL2JyX3ByaXZhdGUuaCIKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgYnJpZGdlX3VsYV9sZWNbXSA9IHsgMHgwMSwgMHg4MCwgMHhjMiwgMHgwMCwgMHgwMCB9OwpAQCAtMTIxLDcgKzEyMSw3IEBACiAvKiBEZXZpY2Ugc3RydWN0dXJlcyAqLwogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfbGVjW01BWF9MRUNfSVRGXTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0JSSURHRSkgfHwgZGVmaW5lZChDT05GSUdfQlJJREdFX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19CUklER0UpCiBzdGF0aWMgdm9pZCBsZWNfaGFuZGxlX2JyaWRnZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWNoYXIgKmJ1ZmY7CkBAIC0xNTUsNyArMTU1LDcgQEAKIAkJc2stPnNrX2RhdGFfcmVhZHkoc2spOwogCX0KIH0KLSNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19CUklER0UpIHx8IGRlZmluZWQoQ09ORklHX0JSSURHRV9NT0RVTEUpICovCisjZW5kaWYgLyogSVNfRU5BQkxFRChDT05GSUdfQlJJREdFKSAqLwogCiAvKgogICogT3Blbi9pbml0aWFsaXplIHRoZSBuZXRkZXZpY2UuIFRoaXMgaXMgY2FsbGVkIChpbiB0aGUgY3VycmVudCBrZXJuZWwpCkBAIC0yMjIsNyArMjIyLDcgQEAKIAlwcl9kZWJ1Zygic2tidWZmIGhlYWQ6JWx4IGRhdGE6JWx4IHRhaWw6JWx4IGVuZDolbHhcbiIsCiAJCSAobG9uZylza2ItPmhlYWQsIChsb25nKXNrYi0+ZGF0YSwgKGxvbmcpc2tiX3RhaWxfcG9pbnRlcihza2IpLAogCQkgKGxvbmcpc2tiX2VuZF9wb2ludGVyKHNrYikpOwotI2lmIGRlZmluZWQoQ09ORklHX0JSSURHRSkgfHwgZGVmaW5lZChDT05GSUdfQlJJREdFX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19CUklER0UpCiAJaWYgKG1lbWNtcChza2ItPmRhdGEsIGJyaWRnZV91bGFfbGVjLCBzaXplb2YoYnJpZGdlX3VsYV9sZWMpKSA9PSAwKQogCQlsZWNfaGFuZGxlX2JyaWRnZShza2IsIGRldik7CiAjZW5kaWYKQEAgLTQyNiw3ICs0MjYsNyBAQAogCQkgICAgKHVuc2lnbmVkIHNob3J0KSgweGZmZmYgJiBtZXNnLT5jb250ZW50Lm5vcm1hbC5mbGFnKTsKIAkJYnJlYWs7CiAJY2FzZSBsX3Nob3VsZF9icmlkZ2U6Ci0jaWYgZGVmaW5lZChDT05GSUdfQlJJREdFKSB8fCBkZWZpbmVkKENPTkZJR19CUklER0VfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0JSSURHRSkKIAl7CiAJCXByX2RlYnVnKCIlczogYnJpZGdlIHplcHBlbGluIGFza3MgYWJvdXQgJXBNXG4iLAogCQkJIGRldi0+bmFtZSwgbWVzZy0+Y29udGVudC5wcm94eS5tYWNfYWRkcik7CkBAIC00NTIsNyArNDUyLDcgQEAKIAkJCXNrLT5za19kYXRhX3JlYWR5KHNrKTsKIAkJfQogCX0KLSNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19CUklER0UpIHx8IGRlZmluZWQoQ09ORklHX0JSSURHRV9NT0RVTEUpICovCisjZW5kaWYgLyogSVNfRU5BQkxFRChDT05GSUdfQlJJREdFKSAqLwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcl9pbmZvKCIlczogVW5rbm93biBtZXNzYWdlIHR5cGUgJWRcbiIsIGRldi0+bmFtZSwgbWVzZy0+dHlwZSk7CmRpZmYgLS1naXQgYS9uZXQvYXRtL21wYy5jIGIvbmV0L2F0bS9tcGMuYwppbmRleCAwZTk4MjIyLi4zYjNiMWEyIDEwMDY0NAotLS0gYS9uZXQvYXRtL21wYy5jCisrKyBiL25ldC9hdG0vbXBjLmMKQEAgLTEwMDcsNyArMTAwNyw3IEBACiAJaWYgKCFuZXRfZXEoZGV2X25ldChkZXYpLCAmaW5pdF9uZXQpKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKLQlpZiAoZGV2LT5uYW1lID09IE5VTEwgfHwgc3RybmNtcChkZXYtPm5hbWUsICJsZWMiLCAzKSkKKwlpZiAoc3RybmNtcChkZXYtPm5hbWUsICJsZWMiLCAzKSkKIAkJcmV0dXJuIE5PVElGWV9ET05FOyAvKiB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGxlYzpzICovCiAKIAlzd2l0Y2ggKGV2ZW50KSB7CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9LY29uZmlnIGIvbmV0L2JhdG1hbi1hZHYvS2NvbmZpZwppbmRleCA4MzNiYjE0Li5mMjA3NDJjIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9LY29uZmlnCisrKyBiL25ldC9iYXRtYW4tYWR2L0tjb25maWcKQEAgLTczLDEwICs3MywyMSBAQAogCSAgcmVkdWNlIHRoZSBhaXIgb3ZlcmhlYWQgd2hpbGUgaW1wcm92aW5nIHRoZSByZWxpYWJpbGl0eSBvZgogCSAgbXVsdGljYXN0IG1lc3NhZ2VzLgogCi1jb25maWcgQkFUTUFOX0FEVl9ERUJVRwotCWJvb2wgIkIuQS5ULk0uQS5OLiBkZWJ1Z2dpbmciCitjb25maWcgQkFUTUFOX0FEVl9ERUJVR0ZTCisJYm9vbCAiYmF0bWFuLWFkdiBkZWJ1Z2ZzIGVudHJpZXMiCiAJZGVwZW5kcyBvbiBCQVRNQU5fQURWCiAJZGVwZW5kcyBvbiBERUJVR19GUworCWRlZmF1bHQgeQorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRvIGV4cG9ydCByb3V0aW5nIHJlbGF0ZWQgZGVidWcgdGFibGVzIHZpYSBkZWJ1Z2ZzLgorCSAgVGhlIGluZm9ybWF0aW9uIGZvciBlYWNoIHNvZnQtaW50ZXJmYWNlIGFuZCB1c2VkIGhhcmQtaW50ZXJmYWNlIGNhbiBiZQorCSAgZm91bmQgdW5kZXIgYmF0bWFuX2Fkdi8KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIEJBVE1BTl9BRFZfREVCVUcKKwlib29sICJCLkEuVC5NLkEuTi4gZGVidWdnaW5nIgorCWRlcGVuZHMgb24gQkFUTUFOX0FEVl9ERUJVR0ZTCiAJaGVscAogCSAgVGhpcyBpcyBhbiBvcHRpb24gZm9yIHVzZSBieSBkZXZlbG9wZXJzOyBtb3N0IHBlb3BsZSBzaG91bGQKIAkgIHNheSBOIGhlcmUuIFRoaXMgZW5hYmxlcyBjb21waWxhdGlvbiBvZiBzdXBwb3J0IGZvcgpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvTWFrZWZpbGUgYi9uZXQvYmF0bWFuLWFkdi9NYWtlZmlsZQppbmRleCBhODNmYzZjLi5mNzI0ZDNjIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9NYWtlZmlsZQorKysgYi9uZXQvYmF0bWFuLWFkdi9NYWtlZmlsZQpAQCAtMjQsMTQgKzI0LDE0IEBACiBiYXRtYW4tYWR2LSQoQ09ORklHX0JBVE1BTl9BRFZfQkFUTUFOX1YpICs9IGJhdF92X29nbS5vCiBiYXRtYW4tYWR2LXkgKz0gYml0YXJyYXkubwogYmF0bWFuLWFkdi0kKENPTkZJR19CQVRNQU5fQURWX0JMQSkgKz0gYnJpZGdlX2xvb3BfYXZvaWRhbmNlLm8KLWJhdG1hbi1hZHYtJChDT05GSUdfREVCVUdfRlMpICs9IGRlYnVnZnMubworYmF0bWFuLWFkdi0kKENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMpICs9IGRlYnVnZnMubwogYmF0bWFuLWFkdi0kKENPTkZJR19CQVRNQU5fQURWX0RBVCkgKz0gZGlzdHJpYnV0ZWQtYXJwLXRhYmxlLm8KIGJhdG1hbi1hZHYteSArPSBmcmFnbWVudGF0aW9uLm8KIGJhdG1hbi1hZHYteSArPSBnYXRld2F5X2NsaWVudC5vCiBiYXRtYW4tYWR2LXkgKz0gZ2F0ZXdheV9jb21tb24ubwogYmF0bWFuLWFkdi15ICs9IGhhcmQtaW50ZXJmYWNlLm8KIGJhdG1hbi1hZHYteSArPSBoYXNoLm8KLWJhdG1hbi1hZHYteSArPSBpY21wX3NvY2tldC5vCitiYXRtYW4tYWR2LSQoQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUykgKz0gaWNtcF9zb2NrZXQubwogYmF0bWFuLWFkdi0kKENPTkZJR19CQVRNQU5fQURWX0RFQlVHKSArPSBsb2cubwogYmF0bWFuLWFkdi15ICs9IG1haW4ubwogYmF0bWFuLWFkdi0kKENPTkZJR19CQVRNQU5fQURWX01DQVNUKSArPSBtdWx0aWNhc3QubwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvYmF0X2FsZ28uYyBiL25ldC9iYXRtYW4tYWR2L2JhdF9hbGdvLmMKaW5kZXggODFkYmJmNS4uNjIzZDA0MyAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvYmF0X2FsZ28uYworKysgYi9uZXQvYmF0bWFuLWFkdi9iYXRfYWxnby5jCkBAIC0yMCwxMiArMjAsMTggQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvYmF0bWFuX2Fkdi5oPgogCiAjaW5jbHVkZSAiYmF0X2FsZ28uaCIKKyNpbmNsdWRlICJuZXRsaW5rLmgiCiAKIGNoYXIgYmF0YWR2X3JvdXRpbmdfYWxnb1syMF0gPSAiQkFUTUFOX0lWIjsKIHN0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBiYXRhZHZfYWxnb19saXN0OwpAQCAtOTUsNiArMTAxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIGludCBiYXRhZHZfYWxnb19zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewogCXN0cnVjdCBiYXRhZHZfYWxnb19vcHMgKmJhdF9hbGdvX29wczsKQEAgLTEwNyw2ICsxMTQsNyBAQAogCiAJcmV0dXJuIDA7CiB9CisjZW5kaWYKIAogc3RhdGljIGludCBiYXRhZHZfcGFyYW1fc2V0X3JhKGNvbnN0IGNoYXIgKnZhbCwgY29uc3Qgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCiB7CkBAIC0xMzgsMyArMTQ2LDY1IEBACiAKIG1vZHVsZV9wYXJhbV9jYihyb3V0aW5nX2FsZ28sICZiYXRhZHZfcGFyYW1fb3BzX3JhLCAmYmF0YWR2X3BhcmFtX3N0cmluZ19yYSwKIAkJMDY0NCk7CisKKy8qKgorICogYmF0YWR2X2FsZ29fZHVtcF9lbnRyeSAtIGZpbGwgaW4gaW5mb3JtYXRpb24gYWJvdXQgb25lIHN1cHBvcnRlZCByb3V0aW5nCisgKiAgYWxnb3JpdGhtCisgKiBAbXNnOiBuZXRsaW5rIG1lc3NhZ2UgdG8gYmUgc2VudCBiYWNrCisgKiBAcG9ydGlkOiBQb3J0IHRvIHJlcGx5IHRvCisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbWVzc2FnZQorICogQGJhdF9hbGdvX29wczogQWxnb3JpdGhtIHRvIGJlIGR1bXBlZAorICoKKyAqIFJldHVybjogRXJyb3IgbnVtYmVyLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBiYXRhZHZfYWxnb19kdW1wX2VudHJ5KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkJICBzdHJ1Y3QgYmF0YWR2X2FsZ29fb3BzICpiYXRfYWxnb19vcHMpCit7CisJdm9pZCAqaGRyOworCisJaGRyID0gZ2VubG1zZ19wdXQobXNnLCBwb3J0aWQsIHNlcSwgJmJhdGFkdl9uZXRsaW5rX2ZhbWlseSwKKwkJCSAgTkxNX0ZfTVVMVEksIEJBVEFEVl9DTURfR0VUX1JPVVRJTkdfQUxHT1MpOworCWlmICghaGRyKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJaWYgKG5sYV9wdXRfc3RyaW5nKG1zZywgQkFUQURWX0FUVFJfQUxHT19OQU1FLCBiYXRfYWxnb19vcHMtPm5hbWUpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKwlyZXR1cm4gMDsKKworIG5sYV9wdXRfZmFpbHVyZToKKwlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworLyoqCisgKiBiYXRhZHZfYWxnb19kdW1wIC0gZmlsbCBpbiBpbmZvcm1hdGlvbiBhYm91dCBzdXBwb3J0ZWQgcm91dGluZworICogIGFsZ29yaXRobXMKKyAqIEBtc2c6IG5ldGxpbmsgbWVzc2FnZSB0byBiZSBzZW50IGJhY2sKKyAqIEBjYjogUGFyYW1ldGVycyB0byB0aGUgbmV0bGluayByZXF1ZXN0CisgKgorICogUmV0dXJuOiBMZW5ndGggb2YgcmVwbHkgbWVzc2FnZS4KKyAqLworaW50IGJhdGFkdl9hbGdvX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCWludCBwb3J0aWQgPSBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZDsKKwlzdHJ1Y3QgYmF0YWR2X2FsZ29fb3BzICpiYXRfYWxnb19vcHM7CisJaW50IHNraXAgPSBjYi0+YXJnc1swXTsKKwlpbnQgaSA9IDA7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShiYXRfYWxnb19vcHMsICZiYXRhZHZfYWxnb19saXN0LCBsaXN0KSB7CisJCWlmIChpKysgPCBza2lwKQorCQkJY29udGludWU7CisKKwkJaWYgKGJhdGFkdl9hbGdvX2R1bXBfZW50cnkobXNnLCBwb3J0aWQsIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkJCQkJICAgYmF0X2FsZ29fb3BzKSkgeworCQkJaS0tOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwljYi0+YXJnc1swXSA9IGk7CisKKwlyZXR1cm4gbXNnLT5sZW47Cit9CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9iYXRfYWxnby5oIGIvbmV0L2JhdG1hbi1hZHYvYmF0X2FsZ28uaAppbmRleCA4NjBkNzczLi4zYjViNjljIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9iYXRfYWxnby5oCisrKyBiL25ldC9iYXRtYW4tYWR2L2JhdF9hbGdvLmgKQEAgLTIyLDcgKzIyLDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKK3N0cnVjdCBuZXRsaW5rX2NhbGxiYWNrOwogc3RydWN0IHNlcV9maWxlOworc3RydWN0IHNrX2J1ZmY7CiAKIGV4dGVybiBjaGFyIGJhdGFkdl9yb3V0aW5nX2FsZ29bXTsKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGJhdGFkdl9oYXJkaWZfbGlzdDsKQEAgLTMxLDUgKzMzLDYgQEAKIGludCBiYXRhZHZfYWxnb19yZWdpc3RlcihzdHJ1Y3QgYmF0YWR2X2FsZ29fb3BzICpiYXRfYWxnb19vcHMpOwogaW50IGJhdGFkdl9hbGdvX3NlbGVjdChzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LCBjaGFyICpuYW1lKTsKIGludCBiYXRhZHZfYWxnb19zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKK2ludCBiYXRhZHZfYWxnb19kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7CiAKICNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfQkFUX0FMR09fSF8gKi8KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2JhdF9pdl9vZ20uYyBiL25ldC9iYXRtYW4tYWR2L2JhdF9pdl9vZ20uYwppbmRleCAxOWIwYWJkLi5lMmQxOGQwIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9iYXRfaXZfb2dtLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvYmF0X2l2X29nbS5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CkBAIC00OCwxMiArNDksMTcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvYmF0bWFuX2Fkdi5oPgogCiAjaW5jbHVkZSAiYmF0X2FsZ28uaCIKICNpbmNsdWRlICJiaXRhcnJheS5oIgorI2luY2x1ZGUgImdhdGV3YXlfY2xpZW50LmgiCiAjaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJoYXNoLmgiCiAjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAibmV0bGluay5oIgogI2luY2x1ZGUgIm5ldHdvcmstY29kaW5nLmgiCiAjaW5jbHVkZSAib3JpZ2luYXRvci5oIgogI2luY2x1ZGUgInBhY2tldC5oIgpAQCAtMzE4LDE3ICszMjQsMTggQEAKIAlpZiAoIW9yaWdfbm9kZS0+YmF0X2l2LmJjYXN0X293bl9zdW0pCiAJCWdvdG8gZnJlZV9vcmlnX25vZGU7CiAKKwlrcmVmX2dldCgmb3JpZ19ub2RlLT5yZWZjb3VudCk7CiAJaGFzaF9hZGRlZCA9IGJhdGFkdl9oYXNoX2FkZChiYXRfcHJpdi0+b3JpZ19oYXNoLCBiYXRhZHZfY29tcGFyZV9vcmlnLAogCQkJCSAgICAgYmF0YWR2X2Nob29zZV9vcmlnLCBvcmlnX25vZGUsCiAJCQkJICAgICAmb3JpZ19ub2RlLT5oYXNoX2VudHJ5KTsKIAlpZiAoaGFzaF9hZGRlZCAhPSAwKQotCQlnb3RvIGZyZWVfb3JpZ19ub2RlOworCQlnb3RvIGZyZWVfb3JpZ19ub2RlX2hhc2g7CiAKIAlyZXR1cm4gb3JpZ19ub2RlOwogCi1mcmVlX29yaWdfbm9kZToKLQkvKiBmcmVlIHR3aWNlLCBhcyBiYXRhZHZfb3JpZ19ub2RlX25ldyBzZXRzIHJlZmNvdW50IHRvIDIgKi8KK2ZyZWVfb3JpZ19ub2RlX2hhc2g6CiAJYmF0YWR2X29yaWdfbm9kZV9wdXQob3JpZ19ub2RlKTsKK2ZyZWVfb3JpZ19ub2RlOgogCWJhdGFkdl9vcmlnX25vZGVfcHV0KG9yaWdfbm9kZSk7CiAKIAlyZXR1cm4gTlVMTDsKQEAgLTUyOCwzNiArNTM1LDI1IEBACiBzdGF0aWMgdm9pZCBiYXRhZHZfaXZfb2dtX2VtaXQoc3RydWN0IGJhdGFkdl9mb3J3X3BhY2tldCAqZm9yd19wYWNrZXQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2U7Ci0Jc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdjsKLQlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKnByaW1hcnlfaWYgPSBOVUxMOwogCiAJaWYgKCFmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcpIHsKIAkJcHJfZXJyKCJFcnJvciAtIGNhbid0IGZvcndhcmQgcGFja2V0OiBpbmNvbWluZyBpZmFjZSBub3Qgc3BlY2lmaWVkXG4iKTsKLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAl9CiAKIAlzb2Z0X2lmYWNlID0gZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5zb2Z0X2lmYWNlOwotCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7CiAKIAlpZiAoV0FSTl9PTighZm9yd19wYWNrZXQtPmlmX291dGdvaW5nKSkKLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAogCWlmIChXQVJOX09OKGZvcndfcGFja2V0LT5pZl9vdXRnb2luZy0+c29mdF9pZmFjZSAhPSBzb2Z0X2lmYWNlKSkKLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAogCWlmIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPmlmX3N0YXR1cyAhPSBCQVRBRFZfSUZfQUNUSVZFKQotCQlnb3RvIG91dDsKLQotCXByaW1hcnlfaWYgPSBiYXRhZHZfcHJpbWFyeV9pZl9nZXRfc2VsZWN0ZWQoYmF0X3ByaXYpOwotCWlmICghcHJpbWFyeV9pZikKLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAogCS8qIG9ubHkgZm9yIG9uZSBzcGVjaWZpYyBvdXRnb2luZyBpbnRlcmZhY2UgKi8KIAliYXRhZHZfaXZfb2dtX3NlbmRfdG9faWYoZm9yd19wYWNrZXQsIGZvcndfcGFja2V0LT5pZl9vdXRnb2luZyk7Ci0KLW91dDoKLQlpZiAocHJpbWFyeV9pZikKLQkJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7CiB9CiAKIC8qKgpAQCAtNjg1LDE5ICs2ODEsMTIgQEAKIAlzdHJ1Y3QgYmF0YWR2X2ZvcndfcGFja2V0ICpmb3J3X3BhY2tldF9hZ2dyOwogCXVuc2lnbmVkIGNoYXIgKnNrYl9idWZmOwogCXVuc2lnbmVkIGludCBza2Jfc2l6ZTsKKwlhdG9taWNfdCAqcXVldWVfbGVmdCA9IG93bl9wYWNrZXQgPyBOVUxMIDogJmJhdF9wcml2LT5iYXRtYW5fcXVldWVfbGVmdDsKIAotCS8qIG93biBwYWNrZXQgc2hvdWxkIGFsd2F5cyBiZSBzY2hlZHVsZWQgKi8KLQlpZiAoIW93bl9wYWNrZXQpIHsKLQkJaWYgKCFiYXRhZHZfYXRvbWljX2RlY19ub3RfemVybygmYmF0X3ByaXYtPmJhdG1hbl9xdWV1ZV9sZWZ0KSkgewotCQkJYmF0YWR2X2RiZyhCQVRBRFZfREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkJICAgImJhdG1hbiBwYWNrZXQgcXVldWUgZnVsbFxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlmb3J3X3BhY2tldF9hZ2dyID0ga21hbGxvYyhzaXplb2YoKmZvcndfcGFja2V0X2FnZ3IpLCBHRlBfQVRPTUlDKTsKKwlmb3J3X3BhY2tldF9hZ2dyID0gYmF0YWR2X2ZvcndfcGFja2V0X2FsbG9jKGlmX2luY29taW5nLCBpZl9vdXRnb2luZywKKwkJCQkJCSAgICBxdWV1ZV9sZWZ0LCBiYXRfcHJpdik7CiAJaWYgKCFmb3J3X3BhY2tldF9hZ2dyKQotCQlnb3RvIG91dF9ub21lbTsKKwkJcmV0dXJuOwogCiAJaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+YWdncmVnYXRlZF9vZ21zKSAmJgogCSAgICBwYWNrZXRfbGVuIDwgQkFUQURWX01BWF9BR0dSRUdBVElPTl9CWVRFUykKQEAgLTcwOCw4ICs2OTcsMTEgQEAKIAlza2Jfc2l6ZSArPSBFVEhfSExFTjsKIAogCWZvcndfcGFja2V0X2FnZ3ItPnNrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24oTlVMTCwgc2tiX3NpemUpOwotCWlmICghZm9yd19wYWNrZXRfYWdnci0+c2tiKQotCQlnb3RvIG91dF9mcmVlX2ZvcndfcGFja2V0OworCWlmICghZm9yd19wYWNrZXRfYWdnci0+c2tiKSB7CisJCWJhdGFkdl9mb3J3X3BhY2tldF9mcmVlKGZvcndfcGFja2V0X2FnZ3IpOworCQlyZXR1cm47CisJfQorCiAJZm9yd19wYWNrZXRfYWdnci0+c2tiLT5wcmlvcml0eSA9IFRDX1BSSU9fQ09OVFJPTDsKIAlza2JfcmVzZXJ2ZShmb3J3X3BhY2tldF9hZ2dyLT5za2IsIEVUSF9ITEVOKTsKIApAQCAtNzE3LDEyICs3MDksNyBAQAogCWZvcndfcGFja2V0X2FnZ3ItPnBhY2tldF9sZW4gPSBwYWNrZXRfbGVuOwogCW1lbWNweShza2JfYnVmZiwgcGFja2V0X2J1ZmYsIHBhY2tldF9sZW4pOwogCi0Ja3JlZl9nZXQoJmlmX2luY29taW5nLT5yZWZjb3VudCk7Ci0Ja3JlZl9nZXQoJmlmX291dGdvaW5nLT5yZWZjb3VudCk7CiAJZm9yd19wYWNrZXRfYWdnci0+b3duID0gb3duX3BhY2tldDsKLQlmb3J3X3BhY2tldF9hZ2dyLT5pZl9pbmNvbWluZyA9IGlmX2luY29taW5nOwotCWZvcndfcGFja2V0X2FnZ3ItPmlmX291dGdvaW5nID0gaWZfb3V0Z29pbmc7Ci0JZm9yd19wYWNrZXRfYWdnci0+bnVtX3BhY2tldHMgPSAwOwogCWZvcndfcGFja2V0X2FnZ3ItPmRpcmVjdF9saW5rX2ZsYWdzID0gQkFUQURWX05PX0ZMQUdTOwogCWZvcndfcGFja2V0X2FnZ3ItPnNlbmRfdGltZSA9IHNlbmRfdGltZTsKIApAQCAtNzQxLDEzICs3MjgsNiBAQAogCXF1ZXVlX2RlbGF5ZWRfd29yayhiYXRhZHZfZXZlbnRfd29ya3F1ZXVlLAogCQkJICAgJmZvcndfcGFja2V0X2FnZ3ItPmRlbGF5ZWRfd29yaywKIAkJCSAgIHNlbmRfdGltZSAtIGppZmZpZXMpOwotCi0JcmV0dXJuOwotb3V0X2ZyZWVfZm9yd19wYWNrZXQ6Ci0Ja2ZyZWUoZm9yd19wYWNrZXRfYWdncik7Ci1vdXRfbm9tZW06Ci0JaWYgKCFvd25fcGFja2V0KQotCQlhdG9taWNfaW5jKCZiYXRfcHJpdi0+YmF0bWFuX3F1ZXVlX2xlZnQpOwogfQogCiAvKiBhZ2dyZWdhdGUgYSBuZXcgcGFja2V0IGludG8gdGhlIGV4aXN0aW5nIG9nbSBwYWNrZXQgKi8KQEAgLTE4MzAsMTAgKzE4MTAsNiBAQAogCQliYXRhZHZfaXZfb2dtX3NjaGVkdWxlKGZvcndfcGFja2V0LT5pZl9pbmNvbWluZyk7CiAKIG91dDoKLQkvKiBkb24ndCBjb3VudCBvd24gcGFja2V0ICovCi0JaWYgKCFmb3J3X3BhY2tldC0+b3duKQotCQlhdG9taWNfaW5jKCZiYXRfcHJpdi0+YmF0bWFuX3F1ZXVlX2xlZnQpOwotCiAJYmF0YWR2X2ZvcndfcGFja2V0X2ZyZWUoZm9yd19wYWNrZXQpOwogfQogCkBAIC0xODc5LDYgKzE4NTUsNyBAQAogCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKIH0KIAorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIC8qKgogICogYmF0YWR2X2l2X29nbV9vcmlnX3ByaW50X25laWdoIC0gcHJpbnQgbmVpZ2hib3JzIGZvciB0aGUgb3JpZ2luYXRvciB0YWJsZQogICogQG9yaWdfbm9kZTogdGhlIG9yaWdfbm9kZSBmb3Igd2hpY2ggdGhlIG5laWdoYm9ycyBhcmUgcHJpbnRlZApAQCAtMTk3Niw4ICsxOTUzLDIzOSBAQAogCWlmIChiYXRtYW5fY291bnQgPT0gMCkKIAkJc2VxX3B1dHMoc2VxLCAiTm8gYmF0bWFuIG5vZGVzIGluIHJhbmdlIC4uLlxuIik7CiB9CisjZW5kaWYKIAogLyoqCisgKiBiYXRhZHZfaXZfb2dtX25laWdoX2dldF90cV9hdmcgLSBHZXQgdGhlIFRRIGF2ZXJhZ2UgZm9yIGEgbmVpZ2hib3VyIG9uIGEKKyAqICBnaXZlbiBvdXRnb2luZyBpbnRlcmZhY2UuCisgKiBAbmVpZ2hfbm9kZTogTmVpZ2hib3VyIG9mIGludGVyZXN0CisgKiBAaWZfb3V0Z29pbmc6IE91dGdvaW5nIGludGVyZmFjZSBvZiBpbnRlcmVzdAorICogQHRxX2F2ZzogUG9pbnRlciBvZiB3aGVyZSB0byBzdG9yZSB0aGUgVFEgYXZlcmFnZQorICoKKyAqIFJldHVybjogRmFsc2UgaWYgbm8gYXZlcmFnZSBUUSBhdmFpbGFibGUsIG90aGVyd2lzZSB0cnVlLgorICovCitzdGF0aWMgYm9vbAorYmF0YWR2X2l2X29nbV9uZWlnaF9nZXRfdHFfYXZnKHN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nLAorCQkJICAgICAgIHU4ICp0cV9hdmcpCit7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKm5faWZpbmZvOworCisJbl9pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChuZWlnaF9ub2RlLCBpZl9vdXRnb2luZyk7CisJaWYgKCFuX2lmaW5mbykKKwkJcmV0dXJuIGZhbHNlOworCisJKnRxX2F2ZyA9IG5faWZpbmZvLT5iYXRfaXYudHFfYXZnOworCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KG5faWZpbmZvKTsKKworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIGJhdGFkdl9pdl9vZ21fb3JpZ19kdW1wX3N1YmVudHJ5IC0gRHVtcCBhbiBvcmlnaW5hdG9yIHN1YmVudHJ5IGludG8gYQorICogIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAaWZfb3V0Z29pbmc6IExpbWl0IGR1bXAgdG8gZW50cmllcyB3aXRoIHRoaXMgb3V0Z29pbmcgaW50ZXJmYWNlCisgKiBAb3JpZ19ub2RlOiBPcmlnaW5hdG9yIHRvIGR1bXAKKyAqIEBuZWlnaF9ub2RlOiBTaW5nbGUgaG9wcyBuZWlnaGJvdXIKKyAqIEBiZXN0OiBJcyB0aGUgYmVzdCBvcmlnaW5hdG9yCisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorYmF0YWR2X2l2X29nbV9vcmlnX2R1bXBfc3ViZW50cnkoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCQkgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCQkgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZywKKwkJCQkgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSwKKwkJCQkgc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpuZWlnaF9ub2RlLAorCQkJCSBib29sIGJlc3QpCit7CisJdm9pZCAqaGRyOworCXU4IHRxX2F2ZzsKKwl1bnNpZ25lZCBpbnQgbGFzdF9zZWVuX21zZWNzOworCisJbGFzdF9zZWVuX21zZWNzID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gb3JpZ19ub2RlLT5sYXN0X3NlZW4pOworCisJaWYgKCFiYXRhZHZfaXZfb2dtX25laWdoX2dldF90cV9hdmcobmVpZ2hfbm9kZSwgaWZfb3V0Z29pbmcsICZ0cV9hdmcpKQorCQlyZXR1cm4gMDsKKworCWlmIChpZl9vdXRnb2luZyAhPSBCQVRBRFZfSUZfREVGQVVMVCAmJgorCSAgICBpZl9vdXRnb2luZyAhPSBuZWlnaF9ub2RlLT5pZl9pbmNvbWluZykKKwkJcmV0dXJuIDA7CisKKwloZHIgPSBnZW5sbXNnX3B1dChtc2csIHBvcnRpZCwgc2VxLCAmYmF0YWR2X25ldGxpbmtfZmFtaWx5LAorCQkJICBOTE1fRl9NVUxUSSwgQkFUQURWX0NNRF9HRVRfT1JJR0lOQVRPUlMpOworCWlmICghaGRyKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlpZiAobmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX09SSUdfQUREUkVTUywgRVRIX0FMRU4sCisJCSAgICBvcmlnX25vZGUtPm9yaWcpIHx8CisJICAgIG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9ORUlHSF9BRERSRVNTLCBFVEhfQUxFTiwKKwkJICAgIG5laWdoX25vZGUtPmFkZHIpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfSEFSRF9JRklOREVYLAorCQkJbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmctPm5ldF9kZXYtPmlmaW5kZXgpIHx8CisJICAgIG5sYV9wdXRfdTgobXNnLCBCQVRBRFZfQVRUUl9UUSwgdHFfYXZnKSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX0xBU1RfU0VFTl9NU0VDUywKKwkJCWxhc3Rfc2Vlbl9tc2VjcykpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKGJlc3QgJiYgbmxhX3B1dF9mbGFnKG1zZywgQkFUQURWX0FUVFJfRkxBR19CRVNUKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisJcmV0dXJuIDA7CisKKyBubGFfcHV0X2ZhaWx1cmU6CisJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKKy8qKgorICogYmF0YWR2X2l2X29nbV9vcmlnX2R1bXBfZW50cnkgLSBEdW1wIGFuIG9yaWdpbmF0b3IgZW50cnkgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAaWZfb3V0Z29pbmc6IExpbWl0IGR1bXAgdG8gZW50cmllcyB3aXRoIHRoaXMgb3V0Z29pbmcgaW50ZXJmYWNlCisgKiBAb3JpZ19ub2RlOiBPcmlnaW5hdG9yIHRvIGR1bXAKKyAqIEBzdWJfczogTnVtYmVyIG9mIHN1YiBlbnRyaWVzIHRvIHNraXAKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhlIGNhbGxlciBob2xkcyByY3VfcmVhZF9sb2NrKCkuCisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorYmF0YWR2X2l2X29nbV9vcmlnX2R1bXBfZW50cnkoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSAgICAgIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkgICAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nLAorCQkJICAgICAgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSwgaW50ICpzdWJfcykKK3sKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKm5laWdoX25vZGVfYmVzdDsKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKm5laWdoX25vZGU7CisJaW50IHN1YiA9IDA7CisJYm9vbCBiZXN0OworCXU4IHRxX2F2Z19iZXN0OworCisJbmVpZ2hfbm9kZV9iZXN0ID0gYmF0YWR2X29yaWdfcm91dGVyX2dldChvcmlnX25vZGUsIGlmX291dGdvaW5nKTsKKwlpZiAoIW5laWdoX25vZGVfYmVzdCkKKwkJZ290byBvdXQ7CisKKwlpZiAoIWJhdGFkdl9pdl9vZ21fbmVpZ2hfZ2V0X3RxX2F2ZyhuZWlnaF9ub2RlX2Jlc3QsIGlmX291dGdvaW5nLAorCQkJCQkgICAgJnRxX2F2Z19iZXN0KSkKKwkJZ290byBvdXQ7CisKKwlpZiAodHFfYXZnX2Jlc3QgPT0gMCkKKwkJZ290byBvdXQ7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobmVpZ2hfbm9kZSwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgeworCQlpZiAoc3ViKysgPCAqc3ViX3MpCisJCQljb250aW51ZTsKKworCQliZXN0ID0gKG5laWdoX25vZGUgPT0gbmVpZ2hfbm9kZV9iZXN0KTsKKworCQlpZiAoYmF0YWR2X2l2X29nbV9vcmlnX2R1bXBfc3ViZW50cnkobXNnLCBwb3J0aWQsIHNlcSwKKwkJCQkJCSAgICAgYmF0X3ByaXYsIGlmX291dGdvaW5nLAorCQkJCQkJICAgICBvcmlnX25vZGUsIG5laWdoX25vZGUsCisJCQkJCQkgICAgIGJlc3QpKSB7CisJCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQobmVpZ2hfbm9kZV9iZXN0KTsKKworCQkJKnN1Yl9zID0gc3ViIC0gMTsKKwkJCXJldHVybiAtRU1TR1NJWkU7CisJCX0KKwl9CisKKyBvdXQ6CisJaWYgKG5laWdoX25vZGVfYmVzdCkKKwkJYmF0YWR2X25laWdoX25vZGVfcHV0KG5laWdoX25vZGVfYmVzdCk7CisKKwkqc3ViX3MgPSAwOworCXJldHVybiAwOworfQorCisvKioKKyAqIGJhdGFkdl9pdl9vZ21fb3JpZ19kdW1wX2J1Y2tldCAtIER1bXAgYW4gb3JpZ2luYXRvciBidWNrZXQgaW50byBhCisgKiAgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBpZl9vdXRnb2luZzogTGltaXQgZHVtcCB0byBlbnRyaWVzIHdpdGggdGhpcyBvdXRnb2luZyBpbnRlcmZhY2UKKyAqIEBoZWFkOiBCdWNrZXQgdG8gYmUgZHVtcGVkCisgKiBAaWR4X3M6IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHNraXBwZWQKKyAqIEBzdWI6IE51bWJlciBvZiBzdWIgZW50cmllcyB0byBiZSBza2lwcGVkCisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorYmF0YWR2X2l2X29nbV9vcmlnX2R1bXBfYnVja2V0KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkgICAgICAgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nLAorCQkJICAgICAgIHN0cnVjdCBobGlzdF9oZWFkICpoZWFkLCBpbnQgKmlkeF9zLCBpbnQgKnN1YikKK3sKKwlzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlOworCWludCBpZHggPSAwOworCisJcmN1X3JlYWRfbG9jaygpOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShvcmlnX25vZGUsIGhlYWQsIGhhc2hfZW50cnkpIHsKKwkJaWYgKGlkeCsrIDwgKmlkeF9zKQorCQkJY29udGludWU7CisKKwkJaWYgKGJhdGFkdl9pdl9vZ21fb3JpZ19kdW1wX2VudHJ5KG1zZywgcG9ydGlkLCBzZXEsIGJhdF9wcml2LAorCQkJCQkJICBpZl9vdXRnb2luZywgb3JpZ19ub2RlLAorCQkJCQkJICBzdWIpKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCSppZHhfcyA9IGlkeCAtIDE7CisJCQlyZXR1cm4gLUVNU0dTSVpFOworCQl9CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJKmlkeF9zID0gMDsKKwkqc3ViID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBiYXRhZHZfaXZfb2dtX29yaWdfZHVtcCAtIER1bXAgdGhlIG9yaWdpbmF0b3JzIGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAY2I6IENvbnRyb2wgYmxvY2sgY29udGFpbmluZyBhZGRpdGlvbmFsIG9wdGlvbnMKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGlmX291dGdvaW5nOiBMaW1pdCBkdW1wIHRvIGVudHJpZXMgd2l0aCB0aGlzIG91dGdvaW5nIGludGVyZmFjZQorICovCitzdGF0aWMgdm9pZAorYmF0YWR2X2l2X29nbV9vcmlnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAorCQkJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcpCit7CisJc3RydWN0IGJhdGFkdl9oYXNodGFibGUgKmhhc2ggPSBiYXRfcHJpdi0+b3JpZ19oYXNoOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCWludCBidWNrZXQgPSBjYi0+YXJnc1swXTsKKwlpbnQgaWR4ID0gY2ItPmFyZ3NbMV07CisJaW50IHN1YiA9IGNiLT5hcmdzWzJdOworCWludCBwb3J0aWQgPSBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZDsKKworCXdoaWxlIChidWNrZXQgPCBoYXNoLT5zaXplKSB7CisJCWhlYWQgPSAmaGFzaC0+dGFibGVbYnVja2V0XTsKKworCQlpZiAoYmF0YWR2X2l2X29nbV9vcmlnX2R1bXBfYnVja2V0KG1zZywgcG9ydGlkLAorCQkJCQkJICAgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCQkJICAgYmF0X3ByaXYsIGlmX291dGdvaW5nLCBoZWFkLAorCQkJCQkJICAgJmlkeCwgJnN1YikpCisJCQlicmVhazsKKworCQlidWNrZXQrKzsKKwl9CisKKwljYi0+YXJnc1swXSA9IGJ1Y2tldDsKKwljYi0+YXJnc1sxXSA9IGlkeDsKKwljYi0+YXJnc1syXSA9IHN1YjsKK30KKworI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKKy8qKgogICogYmF0YWR2X2l2X2hhcmRpZl9uZWlnaF9wcmludCAtIHByaW50IGEgc2luZ2xlIGhvcCBuZWlnaGJvdXIgbm9kZQogICogQHNlcTogbmVpZ2hib3VyIHRhYmxlIHNlcV9maWxlIHN0cnVjdAogICogQGhhcmRpZl9uZWlnaDogaGFyZGlmIG5laWdoYm91ciBpbmZvcm1hdGlvbgpAQCAtMjAyNyw2ICsyMjM1LDE4MiBAQAogCWlmIChiYXRtYW5fY291bnQgPT0gMCkKIAkJc2VxX3B1dHMoc2VxLCAiTm8gYmF0bWFuIG5vZGVzIGluIHJhbmdlIC4uLlxuIik7CiB9CisjZW5kaWYKKworLyoqCisgKiBiYXRhZHZfaXZfb2dtX25laWdoX2RpZmYgLSBjYWxjdWxhdGUgdHEgZGlmZmVyZW5jZSBvZiB0d28gbmVpZ2hib3JzCisgKiBAbmVpZ2gxOiB0aGUgZmlyc3QgbmVpZ2hib3Igb2JqZWN0IG9mIHRoZSBjb21wYXJpc29uCisgKiBAaWZfb3V0Z29pbmcxOiBvdXRnb2luZyBpbnRlcmZhY2UgZm9yIHRoZSBmaXJzdCBuZWlnaGJvcgorICogQG5laWdoMjogdGhlIHNlY29uZCBuZWlnaGJvciBvYmplY3Qgb2YgdGhlIGNvbXBhcmlzb24KKyAqIEBpZl9vdXRnb2luZzI6IG91dGdvaW5nIGludGVyZmFjZSBmb3IgdGhlIHNlY29uZCBuZWlnaGJvcgorICogQGRpZmY6IHBvaW50ZXIgdG8gaW50ZWdlciByZWNlaXZpbmcgdGhlIGNhbGN1bGF0ZWQgZGlmZmVyZW5jZQorICoKKyAqIFRoZSBjb250ZW50IG9mICpAZGlmZiBpcyBvbmx5IHZhbGlkIHdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUuCisgKiBJdCBpcyBsZXNzLCBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gMCBpZiB0aGUgbWV0cmljIHZpYSBuZWlnaDEgaXMgbG93ZXIsCisgKiB0aGUgc2FtZSBhcyBvciBoaWdoZXIgdGhhbiB0aGUgbWV0cmljIHZpYSBuZWlnaDIKKyAqCisgKiBSZXR1cm46IHRydWUgd2hlbiB0aGUgZGlmZmVyZW5jZSBjb3VsZCBiZSBjYWxjdWxhdGVkLCBmYWxzZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGJvb2wgYmF0YWR2X2l2X29nbV9uZWlnaF9kaWZmKHN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqbmVpZ2gxLAorCQkJCSAgICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZzEsCisJCQkJICAgICBzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKm5laWdoMiwKKwkJCQkgICAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcyLAorCQkJCSAgICAgaW50ICpkaWZmKQoreworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpuZWlnaDFfaWZpbmZvLCAqbmVpZ2gyX2lmaW5mbzsKKwl1OCB0cTEsIHRxMjsKKwlib29sIHJldCA9IHRydWU7CisKKwluZWlnaDFfaWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQobmVpZ2gxLCBpZl9vdXRnb2luZzEpOworCW5laWdoMl9pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChuZWlnaDIsIGlmX291dGdvaW5nMik7CisKKwlpZiAoIW5laWdoMV9pZmluZm8gfHwgIW5laWdoMl9pZmluZm8pIHsKKwkJcmV0ID0gZmFsc2U7CisJCWdvdG8gb3V0OworCX0KKworCXRxMSA9IG5laWdoMV9pZmluZm8tPmJhdF9pdi50cV9hdmc7CisJdHEyID0gbmVpZ2gyX2lmaW5mby0+YmF0X2l2LnRxX2F2ZzsKKwkqZGlmZiA9IChpbnQpdHExIC0gKGludCl0cTI7CisKK291dDoKKwlpZiAobmVpZ2gxX2lmaW5mbykKKwkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQobmVpZ2gxX2lmaW5mbyk7CisJaWYgKG5laWdoMl9pZmluZm8pCisJCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KG5laWdoMl9pZmluZm8pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBiYXRhZHZfaXZfb2dtX25laWdoX2R1bXBfbmVpZ2ggLSBEdW1wIGEgbmVpZ2hib3VyIGludG8gYSBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGhhcmRpZl9uZWlnaDogTmVpZ2hib3VyIHRvIGJlIGR1bXBlZAorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl9pdl9vZ21fbmVpZ2hfZHVtcF9uZWlnaChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJICAgICAgIHN0cnVjdCBiYXRhZHZfaGFyZGlmX25laWdoX25vZGUgKmhhcmRpZl9uZWlnaCkKK3sKKwl2b2lkICpoZHI7CisJdW5zaWduZWQgaW50IGxhc3Rfc2Vlbl9tc2VjczsKKworCWxhc3Rfc2Vlbl9tc2VjcyA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIGhhcmRpZl9uZWlnaC0+bGFzdF9zZWVuKTsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgcG9ydGlkLCBzZXEsICZiYXRhZHZfbmV0bGlua19mYW1pbHksCisJCQkgIE5MTV9GX01VTFRJLCBCQVRBRFZfQ01EX0dFVF9ORUlHSEJPUlMpOworCWlmICghaGRyKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlpZiAobmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX05FSUdIX0FERFJFU1MsIEVUSF9BTEVOLAorCQkgICAgaGFyZGlmX25laWdoLT5hZGRyKSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX0hBUkRfSUZJTkRFWCwKKwkJCWhhcmRpZl9uZWlnaC0+aWZfaW5jb21pbmctPm5ldF9kZXYtPmlmaW5kZXgpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfTEFTVF9TRUVOX01TRUNTLAorCQkJbGFzdF9zZWVuX21zZWNzKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisJcmV0dXJuIDA7CisKKyBubGFfcHV0X2ZhaWx1cmU6CisJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKKy8qKgorICogYmF0YWR2X2l2X29nbV9uZWlnaF9kdW1wX2hhcmRpZiAtIER1bXAgdGhlIG5laWdoYm91cnMgb2YgYSBoYXJkIGludGVyZmFjZQorICogIGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGhhcmRfaWZhY2U6IEhhcmQgaW50ZXJmYWNlIHRvIGR1bXAgdGhlIG5laWdoYm91cnMgZm9yCisgKiBAaWR4X3M6IE51bWJlciBvZiBlbnRyaWVzIHRvIHNraXAKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhlIGNhbGxlciBob2xkcyByY3VfcmVhZF9sb2NrKCkuCisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorYmF0YWR2X2l2X29nbV9uZWlnaF9kdW1wX2hhcmRpZihzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkX2lmYWNlLAorCQkJCWludCAqaWR4X3MpCit7CisJc3RydWN0IGJhdGFkdl9oYXJkaWZfbmVpZ2hfbm9kZSAqaGFyZGlmX25laWdoOworCWludCBpZHggPSAwOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGhhcmRpZl9uZWlnaCwKKwkJCQkgJmhhcmRfaWZhY2UtPm5laWdoX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGlkeCsrIDwgKmlkeF9zKQorCQkJY29udGludWU7CisKKwkJaWYgKGJhdGFkdl9pdl9vZ21fbmVpZ2hfZHVtcF9uZWlnaChtc2csIHBvcnRpZCwgc2VxLAorCQkJCQkJICAgaGFyZGlmX25laWdoKSkgeworCQkJKmlkeF9zID0gaWR4IC0gMTsKKwkJCXJldHVybiAtRU1TR1NJWkU7CisJCX0KKwl9CisKKwkqaWR4X3MgPSAwOworCXJldHVybiAwOworfQorCisvKioKKyAqIGJhdGFkdl9pdl9vZ21fbmVpZ2hfZHVtcCAtIER1bXAgdGhlIG5laWdoYm91cnMgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBjYjogQ29udHJvbCBibG9jayBjb250YWluaW5nIGFkZGl0aW9uYWwgb3B0aW9ucworICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAc2luZ2xlX2hhcmRpZjogTGltaXQgZHVtcCB0byB0aGlzIGhhcmQgaW50ZXJmYWFjZQorICovCitzdGF0aWMgdm9pZAorYmF0YWR2X2l2X29nbV9uZWlnaF9kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJCSBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqc2luZ2xlX2hhcmRpZikKK3sKKwlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRfaWZhY2U7CisJaW50IGlfaGFyZGlmID0gMDsKKwlpbnQgaV9oYXJkaWZfcyA9IGNiLT5hcmdzWzBdOworCWludCBpZHggPSBjYi0+YXJnc1sxXTsKKwlpbnQgcG9ydGlkID0gTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQ7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKHNpbmdsZV9oYXJkaWYpIHsKKwkJaWYgKGlfaGFyZGlmX3MgPT0gMCkgeworCQkJaWYgKGJhdGFkdl9pdl9vZ21fbmVpZ2hfZHVtcF9oYXJkaWYobXNnLCBwb3J0aWQsCisJCQkJCQkJICAgIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkJCQkJCQkgICAgYmF0X3ByaXYsCisJCQkJCQkJICAgIHNpbmdsZV9oYXJkaWYsCisJCQkJCQkJICAgICZpZHgpID09IDApCisJCQkJaV9oYXJkaWYrKzsKKwkJfQorCX0gZWxzZSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGhhcmRfaWZhY2UsICZiYXRhZHZfaGFyZGlmX2xpc3QsCisJCQkJCWxpc3QpIHsKKwkJCWlmIChoYXJkX2lmYWNlLT5zb2Z0X2lmYWNlICE9IGJhdF9wcml2LT5zb2Z0X2lmYWNlKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoaV9oYXJkaWYrKyA8IGlfaGFyZGlmX3MpCisJCQkJY29udGludWU7CisKKwkJCWlmIChiYXRhZHZfaXZfb2dtX25laWdoX2R1bXBfaGFyZGlmKG1zZywgcG9ydGlkLAorCQkJCQkJCSAgICBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJCQkJICAgIGJhdF9wcml2LAorCQkJCQkJCSAgICBoYXJkX2lmYWNlLCAmaWR4KSkgeworCQkJCWlfaGFyZGlmLS07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwljYi0+YXJnc1swXSA9IGlfaGFyZGlmOworCWNiLT5hcmdzWzFdID0gaWR4OworfQogCiAvKioKICAqIGJhdGFkdl9pdl9vZ21fbmVpZ2hfY21wIC0gY29tcGFyZSB0aGUgbWV0cmljcyBvZiB0d28gbmVpZ2hib3JzCkBAIC0yMDQzLDI3ICsyNDI3LDEzIEBACiAJCQkJICAgc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpuZWlnaDIsCiAJCQkJICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZzIpCiB7Ci0Jc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKm5laWdoMV9pZmluZm8sICpuZWlnaDJfaWZpbmZvOwotCXU4IHRxMSwgdHEyOworCWJvb2wgcmV0OwogCWludCBkaWZmOwogCi0JbmVpZ2gxX2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KG5laWdoMSwgaWZfb3V0Z29pbmcxKTsKLQluZWlnaDJfaWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQobmVpZ2gyLCBpZl9vdXRnb2luZzIpOwotCi0JaWYgKCFuZWlnaDFfaWZpbmZvIHx8ICFuZWlnaDJfaWZpbmZvKSB7Ci0JCWRpZmYgPSAwOwotCQlnb3RvIG91dDsKLQl9Ci0KLQl0cTEgPSBuZWlnaDFfaWZpbmZvLT5iYXRfaXYudHFfYXZnOwotCXRxMiA9IG5laWdoMl9pZmluZm8tPmJhdF9pdi50cV9hdmc7Ci0JZGlmZiA9IHRxMSAtIHRxMjsKLQotb3V0OgotCWlmIChuZWlnaDFfaWZpbmZvKQotCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChuZWlnaDFfaWZpbmZvKTsKLQlpZiAobmVpZ2gyX2lmaW5mbykKLQkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQobmVpZ2gyX2lmaW5mbyk7CisJcmV0ID0gYmF0YWR2X2l2X29nbV9uZWlnaF9kaWZmKG5laWdoMSwgaWZfb3V0Z29pbmcxLCBuZWlnaDIsCisJCQkJICAgICAgIGlmX291dGdvaW5nMiwgJmRpZmYpOworCWlmICghcmV0KQorCQlyZXR1cm4gMDsKIAogCXJldHVybiBkaWZmOwogfQpAQCAtMjA4NSwyOSArMjQ1NSwxNSBAQAogCQkJICAgc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpuZWlnaDIsCiAJCQkgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nMikKIHsKLQlzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqbmVpZ2gxX2lmaW5mbywgKm5laWdoMl9pZmluZm87Ci0JdTggdHExLCB0cTI7CiAJYm9vbCByZXQ7CisJaW50IGRpZmY7CiAKLQluZWlnaDFfaWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQobmVpZ2gxLCBpZl9vdXRnb2luZzEpOwotCW5laWdoMl9pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChuZWlnaDIsIGlmX291dGdvaW5nMik7CisJcmV0ID0gYmF0YWR2X2l2X29nbV9uZWlnaF9kaWZmKG5laWdoMSwgaWZfb3V0Z29pbmcxLCBuZWlnaDIsCisJCQkJICAgICAgIGlmX291dGdvaW5nMiwgJmRpZmYpOworCWlmICghcmV0KQorCQlyZXR1cm4gZmFsc2U7CiAKLQkvKiB3ZSBjYW4ndCBzYXkgdGhhdCB0aGUgbWV0cmljIGlzIGJldHRlciAqLwotCWlmICghbmVpZ2gxX2lmaW5mbyB8fCAhbmVpZ2gyX2lmaW5mbykgewotCQlyZXQgPSBmYWxzZTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JdHExID0gbmVpZ2gxX2lmaW5mby0+YmF0X2l2LnRxX2F2ZzsKLQl0cTIgPSBuZWlnaDJfaWZpbmZvLT5iYXRfaXYudHFfYXZnOwotCXJldCA9ICh0cTEgLSB0cTIpID4gLUJBVEFEVl9UUV9TSU1JTEFSSVRZX1RIUkVTSE9MRDsKLQotb3V0OgotCWlmIChuZWlnaDFfaWZpbmZvKQotCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChuZWlnaDFfaWZpbmZvKTsKLQlpZiAobmVpZ2gyX2lmaW5mbykKLQkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQobmVpZ2gyX2lmaW5mbyk7Ci0KKwlyZXQgPSBkaWZmID4gLUJBVEFEVl9UUV9TSU1JTEFSSVRZX1RIUkVTSE9MRDsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMTE3LDYgKzI0NzMsMzI1IEBACiAJYmF0YWR2X2l2X29nbV9zY2hlZHVsZShoYXJkX2lmYWNlKTsKIH0KIAorc3RhdGljIHN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqCitiYXRhZHZfaXZfZ3dfZ2V0X2Jlc3RfZ3dfbm9kZShzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2KQoreworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqcm91dGVyOworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpyb3V0ZXJfaWZpbmZvOworCXN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZSwgKmN1cnJfZ3cgPSBOVUxMOworCXU2NCBtYXhfZ3dfZmFjdG9yID0gMDsKKwl1NjQgdG1wX2d3X2ZhY3RvciA9IDA7CisJdTggbWF4X3RxID0gMDsKKwl1OCB0cV9hdmc7CisJc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZ3dfbm9kZSwgJmJhdF9wcml2LT5ndy5saXN0LCBsaXN0KSB7CisJCW9yaWdfbm9kZSA9IGd3X25vZGUtPm9yaWdfbm9kZTsKKwkJcm91dGVyID0gYmF0YWR2X29yaWdfcm91dGVyX2dldChvcmlnX25vZGUsIEJBVEFEVl9JRl9ERUZBVUxUKTsKKwkJaWYgKCFyb3V0ZXIpCisJCQljb250aW51ZTsKKworCQlyb3V0ZXJfaWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQocm91dGVyLAorCQkJCQkJCUJBVEFEVl9JRl9ERUZBVUxUKTsKKwkJaWYgKCFyb3V0ZXJfaWZpbmZvKQorCQkJZ290byBuZXh0OworCisJCWlmICgha3JlZl9nZXRfdW5sZXNzX3plcm8oJmd3X25vZGUtPnJlZmNvdW50KSkKKwkJCWdvdG8gbmV4dDsKKworCQl0cV9hdmcgPSByb3V0ZXJfaWZpbmZvLT5iYXRfaXYudHFfYXZnOworCisJCXN3aXRjaCAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ndy5zZWxfY2xhc3MpKSB7CisJCWNhc2UgMTogLyogZmFzdCBjb25uZWN0aW9uICovCisJCQl0bXBfZ3dfZmFjdG9yID0gdHFfYXZnICogdHFfYXZnOworCQkJdG1wX2d3X2ZhY3RvciAqPSBnd19ub2RlLT5iYW5kd2lkdGhfZG93bjsKKwkJCXRtcF9nd19mYWN0b3IgKj0gMTAwICogMTAwOworCQkJdG1wX2d3X2ZhY3RvciA+Pj0gMTg7CisKKwkJCWlmICgodG1wX2d3X2ZhY3RvciA+IG1heF9nd19mYWN0b3IpIHx8CisJCQkgICAgKCh0bXBfZ3dfZmFjdG9yID09IG1heF9nd19mYWN0b3IpICYmCisJCQkgICAgICh0cV9hdmcgPiBtYXhfdHEpKSkgeworCQkJCWlmIChjdXJyX2d3KQorCQkJCQliYXRhZHZfZ3dfbm9kZV9wdXQoY3Vycl9ndyk7CisJCQkJY3Vycl9ndyA9IGd3X25vZGU7CisJCQkJa3JlZl9nZXQoJmN1cnJfZ3ctPnJlZmNvdW50KTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6IC8qIDI6ICBzdGFibGUgY29ubmVjdGlvbiAodXNlIGJlc3Qgc3RhdGlzdGljKQorCQkJICAqIDM6ICBmYXN0LXN3aXRjaCAodXNlIGJlc3Qgc3RhdGlzdGljIGJ1dCBjaGFuZ2UgYXMKKwkJCSAgKiAgICAgc29vbiBhcyBhIGJldHRlciBnYXRld2F5IGFwcGVhcnMpCisJCQkgICogWFg6IGxhdGUtc3dpdGNoICh1c2UgYmVzdCBzdGF0aXN0aWMgYnV0IGNoYW5nZSBhcworCQkJICAqICAgICBzb29uIGFzIGEgYmV0dGVyIGdhdGV3YXkgYXBwZWFycyB3aGljaCBoYXMKKwkJCSAgKiAgICAgJHJvdXRpbmdfY2xhc3MgbW9yZSB0cSBwb2ludHMpCisJCQkgICovCisJCQlpZiAodHFfYXZnID4gbWF4X3RxKSB7CisJCQkJaWYgKGN1cnJfZ3cpCisJCQkJCWJhdGFkdl9nd19ub2RlX3B1dChjdXJyX2d3KTsKKwkJCQljdXJyX2d3ID0gZ3dfbm9kZTsKKwkJCQlrcmVmX2dldCgmY3Vycl9ndy0+cmVmY291bnQpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlpZiAodHFfYXZnID4gbWF4X3RxKQorCQkJbWF4X3RxID0gdHFfYXZnOworCisJCWlmICh0bXBfZ3dfZmFjdG9yID4gbWF4X2d3X2ZhY3RvcikKKwkJCW1heF9nd19mYWN0b3IgPSB0bXBfZ3dfZmFjdG9yOworCisJCWJhdGFkdl9nd19ub2RlX3B1dChnd19ub2RlKTsKKworbmV4dDoKKwkJYmF0YWR2X25laWdoX25vZGVfcHV0KHJvdXRlcik7CisJCWlmIChyb3V0ZXJfaWZpbmZvKQorCQkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQocm91dGVyX2lmaW5mbyk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIGN1cnJfZ3c7Cit9CisKK3N0YXRpYyBib29sIGJhdGFkdl9pdl9nd19pc19lbGlnaWJsZShzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJCSAgICAgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKmN1cnJfZ3dfb3JpZywKKwkJCQkgICAgIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUpCit7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKnJvdXRlcl9vcmlnX2lmaW5mbyA9IE5VTEw7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKnJvdXRlcl9nd19pZmluZm8gPSBOVUxMOworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqcm91dGVyX2d3ID0gTlVMTDsKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKnJvdXRlcl9vcmlnID0gTlVMTDsKKwl1OCBnd190cV9hdmcsIG9yaWdfdHFfYXZnOworCWJvb2wgcmV0ID0gZmFsc2U7CisKKwkvKiBkeW5hbWljIHJlLWVsZWN0aW9uIGlzIHBlcmZvcm1lZCBvbmx5IG9uIGZhc3Qgb3IgbGF0ZSBzd2l0Y2ggKi8KKwlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ndy5zZWxfY2xhc3MpIDw9IDIpCisJCXJldHVybiBmYWxzZTsKKworCXJvdXRlcl9ndyA9IGJhdGFkdl9vcmlnX3JvdXRlcl9nZXQoY3Vycl9nd19vcmlnLCBCQVRBRFZfSUZfREVGQVVMVCk7CisJaWYgKCFyb3V0ZXJfZ3cpIHsKKwkJcmV0ID0gdHJ1ZTsKKwkJZ290byBvdXQ7CisJfQorCisJcm91dGVyX2d3X2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KHJvdXRlcl9ndywKKwkJCQkJCSAgIEJBVEFEVl9JRl9ERUZBVUxUKTsKKwlpZiAoIXJvdXRlcl9nd19pZmluZm8pIHsKKwkJcmV0ID0gdHJ1ZTsKKwkJZ290byBvdXQ7CisJfQorCisJcm91dGVyX29yaWcgPSBiYXRhZHZfb3JpZ19yb3V0ZXJfZ2V0KG9yaWdfbm9kZSwgQkFUQURWX0lGX0RFRkFVTFQpOworCWlmICghcm91dGVyX29yaWcpCisJCWdvdG8gb3V0OworCisJcm91dGVyX29yaWdfaWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQocm91dGVyX29yaWcsCisJCQkJCQkgICAgIEJBVEFEVl9JRl9ERUZBVUxUKTsKKwlpZiAoIXJvdXRlcl9vcmlnX2lmaW5mbykKKwkJZ290byBvdXQ7CisKKwlnd190cV9hdmcgPSByb3V0ZXJfZ3dfaWZpbmZvLT5iYXRfaXYudHFfYXZnOworCW9yaWdfdHFfYXZnID0gcm91dGVyX29yaWdfaWZpbmZvLT5iYXRfaXYudHFfYXZnOworCisJLyogdGhlIFRRIHZhbHVlIGhhcyB0byBiZSBiZXR0ZXIgKi8KKwlpZiAob3JpZ190cV9hdmcgPCBnd190cV9hdmcpCisJCWdvdG8gb3V0OworCisJLyogaWYgdGhlIHJvdXRpbmcgY2xhc3MgaXMgZ3JlYXRlciB0aGFuIDMgdGhlIHZhbHVlIHRlbGxzIHVzIGhvdyBtdWNoCisJICogZ3JlYXRlciB0aGUgVFEgdmFsdWUgb2YgdGhlIG5ldyBnYXRld2F5IG11c3QgYmUKKwkgKi8KKwlpZiAoKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3cuc2VsX2NsYXNzKSA+IDMpICYmCisJICAgIChvcmlnX3RxX2F2ZyAtIGd3X3RxX2F2ZyA8IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3cuc2VsX2NsYXNzKSkpCisJCWdvdG8gb3V0OworCisJYmF0YWR2X2RiZyhCQVRBRFZfREJHX0JBVE1BTiwgYmF0X3ByaXYsCisJCSAgICJSZXN0YXJ0aW5nIGdhdGV3YXkgc2VsZWN0aW9uOiBiZXR0ZXIgZ2F0ZXdheSBmb3VuZCAodHEgY3VycjogJWksIHRxIG5ldzogJWkpXG4iLAorCQkgICBnd190cV9hdmcsIG9yaWdfdHFfYXZnKTsKKworCXJldCA9IHRydWU7CitvdXQ6CisJaWYgKHJvdXRlcl9nd19pZmluZm8pCisJCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KHJvdXRlcl9nd19pZmluZm8pOworCWlmIChyb3V0ZXJfb3JpZ19pZmluZm8pCisJCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KHJvdXRlcl9vcmlnX2lmaW5mbyk7CisJaWYgKHJvdXRlcl9ndykKKwkJYmF0YWR2X25laWdoX25vZGVfcHV0KHJvdXRlcl9ndyk7CisJaWYgKHJvdXRlcl9vcmlnKQorCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQocm91dGVyX29yaWcpOworCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKKy8qIGZhaWxzIGlmIG9yaWdfbm9kZSBoYXMgbm8gcm91dGVyICovCitzdGF0aWMgaW50IGJhdGFkdl9pdl9nd193cml0ZV9idWZmZXJfdGV4dChzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJCQkgIHN0cnVjdCBzZXFfZmlsZSAqc2VxLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZSkKK3sKKwlzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmN1cnJfZ3c7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpyb3V0ZXI7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKnJvdXRlcl9pZmluZm8gPSBOVUxMOworCWludCByZXQgPSAtMTsKKworCXJvdXRlciA9IGJhdGFkdl9vcmlnX3JvdXRlcl9nZXQoZ3dfbm9kZS0+b3JpZ19ub2RlLCBCQVRBRFZfSUZfREVGQVVMVCk7CisJaWYgKCFyb3V0ZXIpCisJCWdvdG8gb3V0OworCisJcm91dGVyX2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KHJvdXRlciwgQkFUQURWX0lGX0RFRkFVTFQpOworCWlmICghcm91dGVyX2lmaW5mbykKKwkJZ290byBvdXQ7CisKKwljdXJyX2d3ID0gYmF0YWR2X2d3X2dldF9zZWxlY3RlZF9nd19ub2RlKGJhdF9wcml2KTsKKworCXNlcV9wcmludGYoc2VxLCAiJXMgJXBNICglM2kpICVwTSBbJTEwc106ICV1LiV1LyV1LiV1IE1CaXRcbiIsCisJCSAgIChjdXJyX2d3ID09IGd3X25vZGUgPyAiPT4iIDogIiAgIiksCisJCSAgIGd3X25vZGUtPm9yaWdfbm9kZS0+b3JpZywKKwkJICAgcm91dGVyX2lmaW5mby0+YmF0X2l2LnRxX2F2Zywgcm91dGVyLT5hZGRyLAorCQkgICByb3V0ZXItPmlmX2luY29taW5nLT5uZXRfZGV2LT5uYW1lLAorCQkgICBnd19ub2RlLT5iYW5kd2lkdGhfZG93biAvIDEwLAorCQkgICBnd19ub2RlLT5iYW5kd2lkdGhfZG93biAlIDEwLAorCQkgICBnd19ub2RlLT5iYW5kd2lkdGhfdXAgLyAxMCwKKwkJICAgZ3dfbm9kZS0+YmFuZHdpZHRoX3VwICUgMTApOworCXJldCA9IHNlcV9oYXNfb3ZlcmZsb3dlZChzZXEpID8gLTEgOiAwOworCisJaWYgKGN1cnJfZ3cpCisJCWJhdGFkdl9nd19ub2RlX3B1dChjdXJyX2d3KTsKK291dDoKKwlpZiAocm91dGVyX2lmaW5mbykKKwkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQocm91dGVyX2lmaW5mbyk7CisJaWYgKHJvdXRlcikKKwkJYmF0YWR2X25laWdoX25vZGVfcHV0KHJvdXRlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYmF0YWR2X2l2X2d3X3ByaW50KHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkgICAgICAgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlOworCWludCBnd19jb3VudCA9IDA7CisKKwlzZXFfcHV0cyhzZXEsCisJCSAiICAgICAgR2F0ZXdheSAgICAgICgjLzI1NSkgICAgICAgICAgIE5leHRob3AgW291dGdvaW5nSUZdOiBhZHZlcnRpc2VkIHVwbGluayBiYW5kd2lkdGhcbiIpOworCisJcmN1X3JlYWRfbG9jaygpOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShnd19ub2RlLCAmYmF0X3ByaXYtPmd3Lmxpc3QsIGxpc3QpIHsKKwkJLyogZmFpbHMgaWYgb3JpZ19ub2RlIGhhcyBubyByb3V0ZXIgKi8KKwkJaWYgKGJhdGFkdl9pdl9nd193cml0ZV9idWZmZXJfdGV4dChiYXRfcHJpdiwgc2VxLCBnd19ub2RlKSA8IDApCisJCQljb250aW51ZTsKKworCQlnd19jb3VudCsrOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmIChnd19jb3VudCA9PSAwKQorCQlzZXFfcHV0cyhzZXEsICJObyBnYXRld2F5cyBpbiByYW5nZSAuLi5cbiIpOworfQorI2VuZGlmCisKKy8qKgorICogYmF0YWR2X2l2X2d3X2R1bXBfZW50cnkgLSBEdW1wIGEgZ2F0ZXdheSBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBnd19ub2RlOiBHYXRld2F5IHRvIGJlIGR1bXBlZAorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgYmF0YWR2X2l2X2d3X2R1bXBfZW50cnkoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCQkgICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJCSAgIHN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZSkKK3sKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqcm91dGVyX2lmaW5mbyA9IE5VTEw7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpyb3V0ZXI7CisJc3RydWN0IGJhdGFkdl9nd19ub2RlICpjdXJyX2d3OworCWludCByZXQgPSAtRUlOVkFMOworCXZvaWQgKmhkcjsKKworCXJvdXRlciA9IGJhdGFkdl9vcmlnX3JvdXRlcl9nZXQoZ3dfbm9kZS0+b3JpZ19ub2RlLCBCQVRBRFZfSUZfREVGQVVMVCk7CisJaWYgKCFyb3V0ZXIpCisJCWdvdG8gb3V0OworCisJcm91dGVyX2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KHJvdXRlciwgQkFUQURWX0lGX0RFRkFVTFQpOworCWlmICghcm91dGVyX2lmaW5mbykKKwkJZ290byBvdXQ7CisKKwljdXJyX2d3ID0gYmF0YWR2X2d3X2dldF9zZWxlY3RlZF9nd19ub2RlKGJhdF9wcml2KTsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgcG9ydGlkLCBzZXEsICZiYXRhZHZfbmV0bGlua19mYW1pbHksCisJCQkgIE5MTV9GX01VTFRJLCBCQVRBRFZfQ01EX0dFVF9HQVRFV0FZUyk7CisJaWYgKCFoZHIpIHsKKwkJcmV0ID0gLUVOT0JVRlM7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IC1FTVNHU0laRTsKKworCWlmIChjdXJyX2d3ID09IGd3X25vZGUpCisJCWlmIChubGFfcHV0X2ZsYWcobXNnLCBCQVRBRFZfQVRUUl9GTEFHX0JFU1QpKSB7CisJCQlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJaWYgKG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9PUklHX0FERFJFU1MsIEVUSF9BTEVOLAorCQkgICAgZ3dfbm9kZS0+b3JpZ19ub2RlLT5vcmlnKSB8fAorCSAgICBubGFfcHV0X3U4KG1zZywgQkFUQURWX0FUVFJfVFEsIHJvdXRlcl9pZmluZm8tPmJhdF9pdi50cV9hdmcpIHx8CisJICAgIG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9ST1VURVIsIEVUSF9BTEVOLAorCQkgICAgcm91dGVyLT5hZGRyKSB8fAorCSAgICBubGFfcHV0X3N0cmluZyhtc2csIEJBVEFEVl9BVFRSX0hBUkRfSUZOQU1FLAorCQkJICAgcm91dGVyLT5pZl9pbmNvbWluZy0+bmV0X2Rldi0+bmFtZSkgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9CQU5EV0lEVEhfRE9XTiwKKwkJCWd3X25vZGUtPmJhbmR3aWR0aF9kb3duKSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX0JBTkRXSURUSF9VUCwKKwkJCWd3X25vZGUtPmJhbmR3aWR0aF91cCkpIHsKKwkJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCQlnb3RvIG91dDsKKwl9CisKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisJcmV0ID0gMDsKKworb3V0OgorCWlmIChyb3V0ZXJfaWZpbmZvKQorCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChyb3V0ZXJfaWZpbmZvKTsKKwlpZiAocm91dGVyKQorCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQocm91dGVyKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGJhdGFkdl9pdl9nd19kdW1wIC0gRHVtcCBnYXRld2F5cyBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQGNiOiBDb250cm9sIGJsb2NrIGNvbnRhaW5pbmcgYWRkaXRpb25hbCBvcHRpb25zCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqLworc3RhdGljIHZvaWQgYmF0YWR2X2l2X2d3X2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAorCQkJICAgICAgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdikKK3sKKwlpbnQgcG9ydGlkID0gTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQ7CisJc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlOworCWludCBpZHhfc2tpcCA9IGNiLT5hcmdzWzBdOworCWludCBpZHggPSAwOworCisJcmN1X3JlYWRfbG9jaygpOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShnd19ub2RlLCAmYmF0X3ByaXYtPmd3Lmxpc3QsIGxpc3QpIHsKKwkJaWYgKGlkeCsrIDwgaWR4X3NraXApCisJCQljb250aW51ZTsKKworCQlpZiAoYmF0YWR2X2l2X2d3X2R1bXBfZW50cnkobXNnLCBwb3J0aWQsIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkJCQkJICAgIGJhdF9wcml2LCBnd19ub2RlKSkgeworCQkJaWR4X3NraXAgPSBpZHggLSAxOworCQkJZ290byB1bmxvY2s7CisJCX0KKwl9CisKKwlpZHhfc2tpcCA9IGlkeDsKK3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWNiLT5hcmdzWzBdID0gaWR4X3NraXA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgYmF0YWR2X2FsZ29fb3BzIGJhdGFkdl9iYXRtYW5faXYgX19yZWFkX21vc3RseSA9IHsKIAkubmFtZSA9ICJCQVRNQU5fSVYiLAogCS5pZmFjZSA9IHsKQEAgLTIxMjksMTQgKzI4MDQsMjggQEAKIAkubmVpZ2ggPSB7CiAJCS5jbXAgPSBiYXRhZHZfaXZfb2dtX25laWdoX2NtcCwKIAkJLmlzX3NpbWlsYXJfb3JfYmV0dGVyID0gYmF0YWR2X2l2X29nbV9uZWlnaF9pc19zb2IsCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogCQkucHJpbnQgPSBiYXRhZHZfaXZfbmVpZ2hfcHJpbnQsCisjZW5kaWYKKwkJLmR1bXAgPSBiYXRhZHZfaXZfb2dtX25laWdoX2R1bXAsCiAJfSwKIAkub3JpZyA9IHsKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiAJCS5wcmludCA9IGJhdGFkdl9pdl9vZ21fb3JpZ19wcmludCwKKyNlbmRpZgorCQkuZHVtcCA9IGJhdGFkdl9pdl9vZ21fb3JpZ19kdW1wLAogCQkuZnJlZSA9IGJhdGFkdl9pdl9vZ21fb3JpZ19mcmVlLAogCQkuYWRkX2lmID0gYmF0YWR2X2l2X29nbV9vcmlnX2FkZF9pZiwKIAkJLmRlbF9pZiA9IGJhdGFkdl9pdl9vZ21fb3JpZ19kZWxfaWYsCiAJfSwKKwkuZ3cgPSB7CisJCS5nZXRfYmVzdF9nd19ub2RlID0gYmF0YWR2X2l2X2d3X2dldF9iZXN0X2d3X25vZGUsCisJCS5pc19lbGlnaWJsZSA9IGJhdGFkdl9pdl9nd19pc19lbGlnaWJsZSwKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCisJCS5wcmludCA9IGJhdGFkdl9pdl9nd19wcmludCwKKyNlbmRpZgorCQkuZHVtcCA9IGJhdGFkdl9pdl9nd19kdW1wLAorCX0sCiB9OwogCiBpbnQgX19pbml0IGJhdGFkdl9pdl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9iYXRfdi5jIGIvbmV0L2JhdG1hbi1hZHYvYmF0X3YuYwppbmRleCAwMzY2Y2JmLi5lNzlmNmYwIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9iYXRfdi5jCisrKyBiL25ldC9iYXRtYW4tYWR2L2JhdF92LmMKQEAgLTIxLDI0ICsyMSwzOCBAQAogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9iYXRtYW5fYWR2Lmg+CiAKICNpbmNsdWRlICJiYXRfYWxnby5oIgogI2luY2x1ZGUgImJhdF92X2VscC5oIgogI2luY2x1ZGUgImJhdF92X29nbS5oIgorI2luY2x1ZGUgImdhdGV3YXlfY2xpZW50LmgiCisjaW5jbHVkZSAiZ2F0ZXdheV9jb21tb24uaCIKICNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgogI2luY2x1ZGUgImhhc2guaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJuZXRsaW5rLmgiCiAjaW5jbHVkZSAib3JpZ2luYXRvci5oIgogI2luY2x1ZGUgInBhY2tldC5oIgogCitzdHJ1Y3Qgc2tfYnVmZjsKKwogc3RhdGljIHZvaWQgYmF0YWR2X3ZfaWZhY2VfYWN0aXZhdGUoc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkX2lmYWNlKQogewogCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihoYXJkX2lmYWNlLT5zb2Z0X2lmYWNlKTsKQEAgLTExNSw2ICsxMjksNyBAQAogCQkgIGJhdGFkdl92X2VscF90aHJvdWdocHV0X21ldHJpY191cGRhdGUpOwogfQogCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogLyoqCiAgKiBiYXRhZHZfdl9vcmlnX3ByaW50X25laWdoIC0gcHJpbnQgbmVpZ2hib3JzIGZvciB0aGUgb3JpZ2luYXRvciB0YWJsZQogICogQG9yaWdfbm9kZTogdGhlIG9yaWdfbm9kZSBmb3Igd2hpY2ggdGhlIG5laWdoYm9ycyBhcmUgcHJpbnRlZApAQCAtMTk4LDggKzIxMywxNDIgQEAKIAlpZiAoYmF0bWFuX2NvdW50ID09IDApCiAJCXNlcV9wdXRzKHNlcSwgIk5vIGJhdG1hbiBub2RlcyBpbiByYW5nZSAuLi5cbiIpOwogfQorI2VuZGlmCiAKIC8qKgorICogYmF0YWR2X3ZfbmVpZ2hfZHVtcF9uZWlnaCAtIER1bXAgYSBuZWlnaGJvdXIgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGhhcmRpZl9uZWlnaDogTmVpZ2hib3VyIHRvIGR1bXAKKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CitiYXRhZHZfdl9uZWlnaF9kdW1wX25laWdoKHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkgIHN0cnVjdCBiYXRhZHZfaGFyZGlmX25laWdoX25vZGUgKmhhcmRpZl9uZWlnaCkKK3sKKwl2b2lkICpoZHI7CisJdW5zaWduZWQgaW50IGxhc3Rfc2Vlbl9tc2VjczsKKwl1MzIgdGhyb3VnaHB1dDsKKworCWxhc3Rfc2Vlbl9tc2VjcyA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIGhhcmRpZl9uZWlnaC0+bGFzdF9zZWVuKTsKKwl0aHJvdWdocHV0ID0gZXdtYV90aHJvdWdocHV0X3JlYWQoJmhhcmRpZl9uZWlnaC0+YmF0X3YudGhyb3VnaHB1dCk7CisJdGhyb3VnaHB1dCA9IHRocm91Z2hwdXQgKiAxMDA7CisKKwloZHIgPSBnZW5sbXNnX3B1dChtc2csIHBvcnRpZCwgc2VxLCAmYmF0YWR2X25ldGxpbmtfZmFtaWx5LCBOTE1fRl9NVUxUSSwKKwkJCSAgQkFUQURWX0NNRF9HRVRfTkVJR0hCT1JTKTsKKwlpZiAoIWhkcikKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJaWYgKG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9ORUlHSF9BRERSRVNTLCBFVEhfQUxFTiwKKwkJICAgIGhhcmRpZl9uZWlnaC0+YWRkcikgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9IQVJEX0lGSU5ERVgsCisJCQloYXJkaWZfbmVpZ2gtPmlmX2luY29taW5nLT5uZXRfZGV2LT5pZmluZGV4KSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX0xBU1RfU0VFTl9NU0VDUywKKwkJCWxhc3Rfc2Vlbl9tc2VjcykgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9USFJPVUdIUFVULCB0aHJvdWdocHV0KSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisJcmV0dXJuIDA7CisKKyBubGFfcHV0X2ZhaWx1cmU6CisJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKKy8qKgorICogYmF0YWR2X3ZfbmVpZ2hfZHVtcF9oYXJkaWYgLSBEdW1wIHRoZSAgbmVpZ2hib3VycyBvZiBhIGhhcmQgaW50ZXJmYWNlICBpbnRvCisgKiAgYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGhhcmRfaWZhY2U6IFRoZSBoYXJkIGludGVyZmFjZSB0byBiZSBkdW1wZWQKKyAqIEBpZHhfczogRW50cmllcyB0byBiZSBza2lwcGVkCisgKgorICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoZSBjYWxsZXIgaG9sZHMgcmN1X3JlYWRfbG9jaygpLgorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl92X25laWdoX2R1bXBfaGFyZGlmKHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkgICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkX2lmYWNlLAorCQkJICAgaW50ICppZHhfcykKK3sKKwlzdHJ1Y3QgYmF0YWR2X2hhcmRpZl9uZWlnaF9ub2RlICpoYXJkaWZfbmVpZ2g7CisJaW50IGlkeCA9IDA7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaGFyZGlmX25laWdoLAorCQkJCSAmaGFyZF9pZmFjZS0+bmVpZ2hfbGlzdCwgbGlzdCkgeworCQlpZiAoaWR4KysgPCAqaWR4X3MpCisJCQljb250aW51ZTsKKworCQlpZiAoYmF0YWR2X3ZfbmVpZ2hfZHVtcF9uZWlnaChtc2csIHBvcnRpZCwgc2VxLCBoYXJkaWZfbmVpZ2gpKSB7CisJCQkqaWR4X3MgPSBpZHggLSAxOworCQkJcmV0dXJuIC1FTVNHU0laRTsKKwkJfQorCX0KKworCSppZHhfcyA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYmF0YWR2X3ZfbmVpZ2hfZHVtcCAtIER1bXAgdGhlIG5laWdoYm91cnMgb2YgYSBoYXJkIGludGVyZmFjZSAgaW50byBhCisgKiAgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQGNiOiBDb250cm9sIGJsb2NrIGNvbnRhaW5pbmcgYWRkaXRpb25hbCBvcHRpb25zCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBzaW5nbGVfaGFyZGlmOiBMaW1pdCBkdW1waW5nIHRvIHRoaXMgaGFyZCBpbnRlcmZhY2UKKyAqLworc3RhdGljIHZvaWQKK2JhdGFkdl92X25laWdoX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAorCQkgICAgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJICAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqc2luZ2xlX2hhcmRpZikKK3sKKwlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRfaWZhY2U7CisJaW50IGlfaGFyZGlmID0gMDsKKwlpbnQgaV9oYXJkaWZfcyA9IGNiLT5hcmdzWzBdOworCWludCBpZHggPSBjYi0+YXJnc1sxXTsKKwlpbnQgcG9ydGlkID0gTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQ7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKHNpbmdsZV9oYXJkaWYpIHsKKwkJaWYgKGlfaGFyZGlmX3MgPT0gMCkgeworCQkJaWYgKGJhdGFkdl92X25laWdoX2R1bXBfaGFyZGlmKG1zZywgcG9ydGlkLAorCQkJCQkJICAgICAgIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkJCQkJCSAgICAgICBiYXRfcHJpdiwgc2luZ2xlX2hhcmRpZiwKKwkJCQkJCSAgICAgICAmaWR4KSA9PSAwKQorCQkJCWlfaGFyZGlmKys7CisJCX0KKwl9IGVsc2UgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShoYXJkX2lmYWNlLCAmYmF0YWR2X2hhcmRpZl9saXN0LCBsaXN0KSB7CisJCQlpZiAoaGFyZF9pZmFjZS0+c29mdF9pZmFjZSAhPSBiYXRfcHJpdi0+c29mdF9pZmFjZSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGlfaGFyZGlmKysgPCBpX2hhcmRpZl9zKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoYmF0YWR2X3ZfbmVpZ2hfZHVtcF9oYXJkaWYobXNnLCBwb3J0aWQsCisJCQkJCQkgICAgICAgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCQkJICAgICAgIGJhdF9wcml2LCBoYXJkX2lmYWNlLAorCQkJCQkJICAgICAgICZpZHgpKSB7CisJCQkJaV9oYXJkaWYtLTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWNiLT5hcmdzWzBdID0gaV9oYXJkaWY7CisJY2ItPmFyZ3NbMV0gPSBpZHg7Cit9CisKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCisvKioKICAqIGJhdGFkdl92X29yaWdfcHJpbnQgLSBwcmludCB0aGUgb3JpZ2luYXRvciB0YWJsZQogICogQGJhdF9wcml2OiB0aGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCiAgKiBAc2VxOiBkZWJ1Z2ZzIHRhYmxlIHNlcV9maWxlIHN0cnVjdApAQCAtMjY1LDYgKzQxNCwyMDUgQEAKIAlpZiAoYmF0bWFuX2NvdW50ID09IDApCiAJCXNlcV9wdXRzKHNlcSwgIk5vIGJhdG1hbiBub2RlcyBpbiByYW5nZSAuLi5cbiIpOwogfQorI2VuZGlmCisKKy8qKgorICogYmF0YWR2X3Zfb3JpZ19kdW1wX3N1YmVudHJ5IC0gRHVtcCBhbiBvcmlnaW5hdG9yIHN1YmVudHJ5IGludG8gYQorICogIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAaWZfb3V0Z29pbmc6IExpbWl0IGR1bXAgdG8gZW50cmllcyB3aXRoIHRoaXMgb3V0Z29pbmcgaW50ZXJmYWNlCisgKiBAb3JpZ19ub2RlOiBPcmlnaW5hdG9yIHRvIGR1bXAKKyAqIEBuZWlnaF9ub2RlOiBTaW5nbGUgaG9wcyBuZWlnaGJvdXIKKyAqIEBiZXN0OiBJcyB0aGUgYmVzdCBvcmlnaW5hdG9yCisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorYmF0YWR2X3Zfb3JpZ19kdW1wX3N1YmVudHJ5KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkgICAgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCSAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nLAorCQkJICAgIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUsCisJCQkgICAgc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpuZWlnaF9ub2RlLAorCQkJICAgIGJvb2wgYmVzdCkKK3sKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqbl9pZmluZm87CisJdW5zaWduZWQgaW50IGxhc3Rfc2Vlbl9tc2VjczsKKwl1MzIgdGhyb3VnaHB1dDsKKwl2b2lkICpoZHI7CisKKwluX2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KG5laWdoX25vZGUsIGlmX291dGdvaW5nKTsKKwlpZiAoIW5faWZpbmZvKQorCQlyZXR1cm4gMDsKKworCXRocm91Z2hwdXQgPSBuX2lmaW5mby0+YmF0X3YudGhyb3VnaHB1dCAqIDEwMDsKKworCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KG5faWZpbmZvKTsKKworCWxhc3Rfc2Vlbl9tc2VjcyA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIG9yaWdfbm9kZS0+bGFzdF9zZWVuKTsKKworCWlmIChpZl9vdXRnb2luZyAhPSBCQVRBRFZfSUZfREVGQVVMVCAmJgorCSAgICBpZl9vdXRnb2luZyAhPSBuZWlnaF9ub2RlLT5pZl9pbmNvbWluZykKKwkJcmV0dXJuIDA7CisKKwloZHIgPSBnZW5sbXNnX3B1dChtc2csIHBvcnRpZCwgc2VxLCAmYmF0YWR2X25ldGxpbmtfZmFtaWx5LCBOTE1fRl9NVUxUSSwKKwkJCSAgQkFUQURWX0NNRF9HRVRfT1JJR0lOQVRPUlMpOworCWlmICghaGRyKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlpZiAobmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX09SSUdfQUREUkVTUywgRVRIX0FMRU4sIG9yaWdfbm9kZS0+b3JpZykgfHwKKwkgICAgbmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX05FSUdIX0FERFJFU1MsIEVUSF9BTEVOLAorCQkgICAgbmVpZ2hfbm9kZS0+YWRkcikgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9IQVJEX0lGSU5ERVgsCisJCQluZWlnaF9ub2RlLT5pZl9pbmNvbWluZy0+bmV0X2Rldi0+aWZpbmRleCkgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9USFJPVUdIUFVULCB0aHJvdWdocHV0KSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX0xBU1RfU0VFTl9NU0VDUywKKwkJCWxhc3Rfc2Vlbl9tc2VjcykpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKGJlc3QgJiYgbmxhX3B1dF9mbGFnKG1zZywgQkFUQURWX0FUVFJfRkxBR19CRVNUKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisJcmV0dXJuIDA7CisKKyBubGFfcHV0X2ZhaWx1cmU6CisJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKKy8qKgorICogYmF0YWR2X3Zfb3JpZ19kdW1wX2VudHJ5IC0gRHVtcCBhbiBvcmlnaW5hdG9yIGVudHJ5IGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGlmX291dGdvaW5nOiBMaW1pdCBkdW1wIHRvIGVudHJpZXMgd2l0aCB0aGlzIG91dGdvaW5nIGludGVyZmFjZQorICogQG9yaWdfbm9kZTogT3JpZ2luYXRvciB0byBkdW1wCisgKiBAc3ViX3M6IE51bWJlciBvZiBzdWIgZW50cmllcyB0byBza2lwCisgKgorICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoZSBjYWxsZXIgaG9sZHMgcmN1X3JlYWRfbG9jaygpLgorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl92X29yaWdfZHVtcF9lbnRyeShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZywKKwkJCSBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlLCBpbnQgKnN1Yl9zKQoreworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZV9iZXN0OworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZTsKKwlpbnQgc3ViID0gMDsKKwlib29sIGJlc3Q7CisKKwluZWlnaF9ub2RlX2Jlc3QgPSBiYXRhZHZfb3JpZ19yb3V0ZXJfZ2V0KG9yaWdfbm9kZSwgaWZfb3V0Z29pbmcpOworCWlmICghbmVpZ2hfbm9kZV9iZXN0KQorCQlnb3RvIG91dDsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShuZWlnaF9ub2RlLCAmb3JpZ19ub2RlLT5uZWlnaF9saXN0LCBsaXN0KSB7CisJCWlmIChzdWIrKyA8ICpzdWJfcykKKwkJCWNvbnRpbnVlOworCisJCWJlc3QgPSAobmVpZ2hfbm9kZSA9PSBuZWlnaF9ub2RlX2Jlc3QpOworCisJCWlmIChiYXRhZHZfdl9vcmlnX2R1bXBfc3ViZW50cnkobXNnLCBwb3J0aWQsIHNlcSwgYmF0X3ByaXYsCisJCQkJCQlpZl9vdXRnb2luZywgb3JpZ19ub2RlLAorCQkJCQkJbmVpZ2hfbm9kZSwgYmVzdCkpIHsKKwkJCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChuZWlnaF9ub2RlX2Jlc3QpOworCisJCQkqc3ViX3MgPSBzdWIgLSAxOworCQkJcmV0dXJuIC1FTVNHU0laRTsKKwkJfQorCX0KKworIG91dDoKKwlpZiAobmVpZ2hfbm9kZV9iZXN0KQorCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQobmVpZ2hfbm9kZV9iZXN0KTsKKworCSpzdWJfcyA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYmF0YWR2X3Zfb3JpZ19kdW1wX2J1Y2tldCAtIER1bXAgYW4gb3JpZ2luYXRvciBidWNrZXQgaW50byBhCisgKiAgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBpZl9vdXRnb2luZzogTGltaXQgZHVtcCB0byBlbnRyaWVzIHdpdGggdGhpcyBvdXRnb2luZyBpbnRlcmZhY2UKKyAqIEBoZWFkOiBCdWNrZXQgdG8gYmUgZHVtcGVkCisgKiBAaWR4X3M6IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHNraXBwZWQKKyAqIEBzdWI6IE51bWJlciBvZiBzdWIgZW50cmllcyB0byBiZSBza2lwcGVkCisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorYmF0YWR2X3Zfb3JpZ19kdW1wX2J1Y2tldChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nLAorCQkJICBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCwgaW50ICppZHhfcywgaW50ICpzdWIpCit7CisJc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZTsKKwlpbnQgaWR4ID0gMDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uob3JpZ19ub2RlLCBoZWFkLCBoYXNoX2VudHJ5KSB7CisJCWlmIChpZHgrKyA8ICppZHhfcykKKwkJCWNvbnRpbnVlOworCisJCWlmIChiYXRhZHZfdl9vcmlnX2R1bXBfZW50cnkobXNnLCBwb3J0aWQsIHNlcSwgYmF0X3ByaXYsCisJCQkJCSAgICAgaWZfb3V0Z29pbmcsIG9yaWdfbm9kZSwgc3ViKSkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQkqaWR4X3MgPSBpZHggLSAxOworCQkJcmV0dXJuIC1FTVNHU0laRTsKKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCSppZHhfcyA9IDA7CisJKnN1YiA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYmF0YWR2X3Zfb3JpZ19kdW1wIC0gRHVtcCB0aGUgb3JpZ2luYXRvcnMgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBjYjogQ29udHJvbCBibG9jayBjb250YWluaW5nIGFkZGl0aW9uYWwgb3B0aW9ucworICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAaWZfb3V0Z29pbmc6IExpbWl0IGR1bXAgdG8gZW50cmllcyB3aXRoIHRoaXMgb3V0Z29pbmcgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyB2b2lkCitiYXRhZHZfdl9vcmlnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAorCQkgICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nKQoreworCXN0cnVjdCBiYXRhZHZfaGFzaHRhYmxlICpoYXNoID0gYmF0X3ByaXYtPm9yaWdfaGFzaDsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwlpbnQgYnVja2V0ID0gY2ItPmFyZ3NbMF07CisJaW50IGlkeCA9IGNiLT5hcmdzWzFdOworCWludCBzdWIgPSBjYi0+YXJnc1syXTsKKwlpbnQgcG9ydGlkID0gTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQ7CisKKwl3aGlsZSAoYnVja2V0IDwgaGFzaC0+c2l6ZSkgeworCQloZWFkID0gJmhhc2gtPnRhYmxlW2J1Y2tldF07CisKKwkJaWYgKGJhdGFkdl92X29yaWdfZHVtcF9idWNrZXQobXNnLCBwb3J0aWQsCisJCQkJCSAgICAgIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkJCQkJICAgICAgYmF0X3ByaXYsIGlmX291dGdvaW5nLCBoZWFkLCAmaWR4LAorCQkJCQkgICAgICAmc3ViKSkKKwkJCWJyZWFrOworCisJCWJ1Y2tldCsrOworCX0KKworCWNiLT5hcmdzWzBdID0gYnVja2V0OworCWNiLT5hcmdzWzFdID0gaWR4OworCWNiLT5hcmdzWzJdID0gc3ViOworfQogCiBzdGF0aWMgaW50IGJhdGFkdl92X25laWdoX2NtcChzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKm5laWdoMSwKIAkJCSAgICAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcxLApAQCAtMzIwLDYgKzY2OCwzNjUgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgc3NpemVfdCBiYXRhZHZfdl9zdG9yZV9zZWxfY2xhc3Moc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCQkJY2hhciAqYnVmZiwgc2l6ZV90IGNvdW50KQoreworCXUzMiBvbGRfY2xhc3MsIGNsYXNzOworCisJaWYgKCFiYXRhZHZfcGFyc2VfdGhyb3VnaHB1dChiYXRfcHJpdi0+c29mdF9pZmFjZSwgYnVmZiwKKwkJCQkgICAgICJCLkEuVC5NLkEuTi4gViBHVyBzZWxlY3Rpb24gY2xhc3MiLAorCQkJCSAgICAgJmNsYXNzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvbGRfY2xhc3MgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmd3LnNlbF9jbGFzcyk7CisJYXRvbWljX3NldCgmYmF0X3ByaXYtPmd3LnNlbF9jbGFzcywgY2xhc3MpOworCisJaWYgKG9sZF9jbGFzcyAhPSBjbGFzcykKKwkJYmF0YWR2X2d3X3Jlc2VsZWN0KGJhdF9wcml2KTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgYmF0YWR2X3Zfc2hvd19zZWxfY2xhc3Moc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwgY2hhciAqYnVmZikKK3sKKwl1MzIgY2xhc3MgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmd3LnNlbF9jbGFzcyk7CisKKwlyZXR1cm4gc3ByaW50ZihidWZmLCAiJXUuJXUgTUJpdFxuIiwgY2xhc3MgLyAxMCwgY2xhc3MgJSAxMCk7Cit9CisKKy8qKgorICogYmF0YWR2X3ZfZ3dfdGhyb3VnaHB1dF9nZXQgLSByZXRyaWV2ZSB0aGUgR1ctYmFuZHdpZHRoIGZvciBhIGdpdmVuIEdXCisgKiBAZ3dfbm9kZTogdGhlIEdXIHRvIHJldHJpZXZlIHRoZSBtZXRyaWMgZm9yCisgKiBAYnc6IHRoZSBwb2ludGVyIHdoZXJlIHRoZSBtZXRyaWMgd2lsbCBiZSBzdG9yZWQuIFRoZSBtZXRyaWMgaXMgY29tcHV0ZWQgYXMKKyAqICB0aGUgbWluaW11bSBiZXR3ZWVuIHRoZSBHVyBhZHZlcnRpc2VkIHRocm91Z2hwdXQgYW5kIHRoZSBwYXRoIHRocm91Z2hwdXQgdG8KKyAqICBpdCBpbiB0aGUgbWVzaAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgYmF0YWR2X3ZfZ3dfdGhyb3VnaHB1dF9nZXQoc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlLCB1MzIgKmJ3KQoreworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpyb3V0ZXJfaWZpbmZvID0gTlVMTDsKKwlzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlOworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqcm91dGVyOworCWludCByZXQgPSAtMTsKKworCW9yaWdfbm9kZSA9IGd3X25vZGUtPm9yaWdfbm9kZTsKKwlyb3V0ZXIgPSBiYXRhZHZfb3JpZ19yb3V0ZXJfZ2V0KG9yaWdfbm9kZSwgQkFUQURWX0lGX0RFRkFVTFQpOworCWlmICghcm91dGVyKQorCQlnb3RvIG91dDsKKworCXJvdXRlcl9pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChyb3V0ZXIsIEJBVEFEVl9JRl9ERUZBVUxUKTsKKwlpZiAoIXJvdXRlcl9pZmluZm8pCisJCWdvdG8gb3V0OworCisJLyogdGhlIEdXIG1ldHJpYyBpcyBjb21wdXRlZCBhcyB0aGUgbWluaW11bSBiZXR3ZWVuIHRoZSBwYXRoIHRocm91Z2hwdXQKKwkgKiB0byByZWFjaCB0aGUgR1cgaXRzZWxmIGFuZCB0aGUgYWR2ZXJ0aXNlZCBiYW5kd2lkdGguCisJICogVGhpcyBnaXZlcyB1cyBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSBlZmZlY3RpdmUgdGhyb3VnaHB1dCB0aGF0IHRoZQorCSAqIGNsaWVudCBjYW4gZXhwZWN0IHZpYSB0aGlzIHBhcnRpY3VsYXIgR1cgbm9kZQorCSAqLworCSpidyA9IHJvdXRlcl9pZmluZm8tPmJhdF92LnRocm91Z2hwdXQ7CisJKmJ3ID0gbWluX3QodTMyLCAqYncsIGd3X25vZGUtPmJhbmR3aWR0aF9kb3duKTsKKworCXJldCA9IDA7CitvdXQ6CisJaWYgKHJvdXRlcikKKwkJYmF0YWR2X25laWdoX25vZGVfcHV0KHJvdXRlcik7CisJaWYgKHJvdXRlcl9pZmluZm8pCisJCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KHJvdXRlcl9pZmluZm8pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBiYXRhZHZfdl9nd19nZXRfYmVzdF9nd19ub2RlIC0gcmV0cmlldmUgdGhlIGJlc3QgR1cgbm9kZQorICogQGJhdF9wcml2OiB0aGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKgorICogUmV0dXJuOiB0aGUgR1cgbm9kZSBoYXZpbmcgdGhlIGJlc3QgR1ctbWV0cmljLCBOVUxMIGlmIG5vIEdXIGlzIGtub3duCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKgorYmF0YWR2X3ZfZ3dfZ2V0X2Jlc3RfZ3dfbm9kZShzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2KQoreworCXN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZSwgKmN1cnJfZ3cgPSBOVUxMOworCXUzMiBtYXhfYncgPSAwLCBidzsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZ3dfbm9kZSwgJmJhdF9wcml2LT5ndy5saXN0LCBsaXN0KSB7CisJCWlmICgha3JlZl9nZXRfdW5sZXNzX3plcm8oJmd3X25vZGUtPnJlZmNvdW50KSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChiYXRhZHZfdl9nd190aHJvdWdocHV0X2dldChnd19ub2RlLCAmYncpIDwgMCkKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoY3Vycl9ndyAmJiAoYncgPD0gbWF4X2J3KSkKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoY3Vycl9ndykKKwkJCWJhdGFkdl9nd19ub2RlX3B1dChjdXJyX2d3KTsKKworCQljdXJyX2d3ID0gZ3dfbm9kZTsKKwkJa3JlZl9nZXQoJmN1cnJfZ3ctPnJlZmNvdW50KTsKKwkJbWF4X2J3ID0gYnc7CisKK25leHQ6CisJCWJhdGFkdl9nd19ub2RlX3B1dChnd19ub2RlKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gY3Vycl9ndzsKK30KKworLyoqCisgKiBiYXRhZHZfdl9nd19pc19lbGlnaWJsZSAtIGNoZWNrIGlmIGEgb3JpZ2luYXRvciB3b3VsZCBiZSBzZWxlY3RlZCBhcyBHVworICogQGJhdF9wcml2OiB0aGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAY3Vycl9nd19vcmlnOiBvcmlnaW5hdG9yIHJlcHJlc2VudGluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIEdXCisgKiBAb3JpZ19ub2RlOiB0aGUgb3JpZ2luYXRvciByZXByZXNlbnRpbmcgdGhlIG5ldyBjYW5kaWRhdGUKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgb3JpZ19ub2RlIGNhbiBiZSBzZWxlY3RlZCBhcyBjdXJyZW50IEdXLCBmYWxzZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGJvb2wgYmF0YWR2X3ZfZ3dfaXNfZWxpZ2libGUoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCQkgICAgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKmN1cnJfZ3dfb3JpZywKKwkJCQkgICAgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSkKK3sKKwlzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmN1cnJfZ3cgPSBOVUxMLCAqb3JpZ19ndyA9IE5VTEw7CisJdTMyIGd3X3Rocm91Z2hwdXQsIG9yaWdfdGhyb3VnaHB1dCwgdGhyZXNob2xkOworCWJvb2wgcmV0ID0gZmFsc2U7CisKKwl0aHJlc2hvbGQgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmd3LnNlbF9jbGFzcyk7CisKKwljdXJyX2d3ID0gYmF0YWR2X2d3X25vZGVfZ2V0KGJhdF9wcml2LCBjdXJyX2d3X29yaWcpOworCWlmICghY3Vycl9ndykgeworCQlyZXQgPSB0cnVlOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYmF0YWR2X3ZfZ3dfdGhyb3VnaHB1dF9nZXQoY3Vycl9ndywgJmd3X3Rocm91Z2hwdXQpIDwgMCkgeworCQlyZXQgPSB0cnVlOworCQlnb3RvIG91dDsKKwl9CisKKwlvcmlnX2d3ID0gYmF0YWR2X2d3X25vZGVfZ2V0KGJhdF9wcml2LCBvcmlnX25vZGUpOworCWlmICghb3JpZ19ub2RlKQorCQlnb3RvIG91dDsKKworCWlmIChiYXRhZHZfdl9nd190aHJvdWdocHV0X2dldChvcmlnX2d3LCAmb3JpZ190aHJvdWdocHV0KSA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKG9yaWdfdGhyb3VnaHB1dCA8IGd3X3Rocm91Z2hwdXQpCisJCWdvdG8gb3V0OworCisJaWYgKChvcmlnX3Rocm91Z2hwdXQgLSBnd190aHJvdWdocHV0KSA8IHRocmVzaG9sZCkKKwkJZ290byBvdXQ7CisKKwliYXRhZHZfZGJnKEJBVEFEVl9EQkdfQkFUTUFOLCBiYXRfcHJpdiwKKwkJICAgIlJlc3RhcnRpbmcgZ2F0ZXdheSBzZWxlY3Rpb246IGJldHRlciBnYXRld2F5IGZvdW5kICh0aHJvdWdocHV0IGN1cnI6ICV1LCB0aHJvdWdocHV0IG5ldzogJXUpXG4iLAorCQkgICBnd190aHJvdWdocHV0LCBvcmlnX3Rocm91Z2hwdXQpOworCisJcmV0ID0gdHJ1ZTsKK291dDoKKwlpZiAoY3Vycl9ndykKKwkJYmF0YWR2X2d3X25vZGVfcHV0KGN1cnJfZ3cpOworCWlmIChvcmlnX2d3KQorCQliYXRhZHZfZ3dfbm9kZV9wdXQob3JpZ19ndyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUworLyogZmFpbHMgaWYgb3JpZ19ub2RlIGhhcyBubyByb3V0ZXIgKi8KK3N0YXRpYyBpbnQgYmF0YWR2X3ZfZ3dfd3JpdGVfYnVmZmVyX3RleHQoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCQkJIHN0cnVjdCBzZXFfZmlsZSAqc2VxLAorCQkJCQkgY29uc3Qgc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlKQoreworCXN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqY3Vycl9ndzsKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKnJvdXRlcjsKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqcm91dGVyX2lmaW5mbyA9IE5VTEw7CisJaW50IHJldCA9IC0xOworCisJcm91dGVyID0gYmF0YWR2X29yaWdfcm91dGVyX2dldChnd19ub2RlLT5vcmlnX25vZGUsIEJBVEFEVl9JRl9ERUZBVUxUKTsKKwlpZiAoIXJvdXRlcikKKwkJZ290byBvdXQ7CisKKwlyb3V0ZXJfaWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQocm91dGVyLCBCQVRBRFZfSUZfREVGQVVMVCk7CisJaWYgKCFyb3V0ZXJfaWZpbmZvKQorCQlnb3RvIG91dDsKKworCWN1cnJfZ3cgPSBiYXRhZHZfZ3dfZ2V0X3NlbGVjdGVkX2d3X25vZGUoYmF0X3ByaXYpOworCisJc2VxX3ByaW50ZihzZXEsICIlcyAlcE0gKCU5dS4lMXUpICVwTSBbJTEwc106ICV1LiV1LyV1LiV1IE1CaXRcbiIsCisJCSAgIChjdXJyX2d3ID09IGd3X25vZGUgPyAiPT4iIDogIiAgIiksCisJCSAgIGd3X25vZGUtPm9yaWdfbm9kZS0+b3JpZywKKwkJICAgcm91dGVyX2lmaW5mby0+YmF0X3YudGhyb3VnaHB1dCAvIDEwLAorCQkgICByb3V0ZXJfaWZpbmZvLT5iYXRfdi50aHJvdWdocHV0ICUgMTAsIHJvdXRlci0+YWRkciwKKwkJICAgcm91dGVyLT5pZl9pbmNvbWluZy0+bmV0X2Rldi0+bmFtZSwKKwkJICAgZ3dfbm9kZS0+YmFuZHdpZHRoX2Rvd24gLyAxMCwKKwkJICAgZ3dfbm9kZS0+YmFuZHdpZHRoX2Rvd24gJSAxMCwKKwkJICAgZ3dfbm9kZS0+YmFuZHdpZHRoX3VwIC8gMTAsCisJCSAgIGd3X25vZGUtPmJhbmR3aWR0aF91cCAlIDEwKTsKKwlyZXQgPSBzZXFfaGFzX292ZXJmbG93ZWQoc2VxKSA/IC0xIDogMDsKKworCWlmIChjdXJyX2d3KQorCQliYXRhZHZfZ3dfbm9kZV9wdXQoY3Vycl9ndyk7CitvdXQ6CisJaWYgKHJvdXRlcl9pZmluZm8pCisJCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KHJvdXRlcl9pZmluZm8pOworCWlmIChyb3V0ZXIpCisJCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChyb3V0ZXIpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYmF0YWR2X3ZfZ3dfcHJpbnQgLSBwcmludCB0aGUgZ2F0ZXdheSBsaXN0CisgKiBAYmF0X3ByaXY6IHRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBzZXE6IGdhdGV3YXkgdGFibGUgc2VxX2ZpbGUgc3RydWN0CisgKi8KK3N0YXRpYyB2b2lkIGJhdGFkdl92X2d3X3ByaW50KHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkgICAgICBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGU7CisJaW50IGd3X2NvdW50ID0gMDsKKworCXNlcV9wdXRzKHNlcSwKKwkJICIgICAgICBHYXRld2F5ICAgICAgICAoIHRocm91Z2hwdXQpICAgICAgICAgICBOZXh0aG9wIFtvdXRnb2luZ0lGXTogYWR2ZXJ0aXNlZCB1cGxpbmsgYmFuZHdpZHRoXG4iKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZ3dfbm9kZSwgJmJhdF9wcml2LT5ndy5saXN0LCBsaXN0KSB7CisJCS8qIGZhaWxzIGlmIG9yaWdfbm9kZSBoYXMgbm8gcm91dGVyICovCisJCWlmIChiYXRhZHZfdl9nd193cml0ZV9idWZmZXJfdGV4dChiYXRfcHJpdiwgc2VxLCBnd19ub2RlKSA8IDApCisJCQljb250aW51ZTsKKworCQlnd19jb3VudCsrOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmIChnd19jb3VudCA9PSAwKQorCQlzZXFfcHV0cyhzZXEsICJObyBnYXRld2F5cyBpbiByYW5nZSAuLi5cbiIpOworfQorI2VuZGlmCisKKy8qKgorICogYmF0YWR2X3ZfZ3dfZHVtcF9lbnRyeSAtIER1bXAgYSBnYXRld2F5IGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGd3X25vZGU6IEdhdGV3YXkgdG8gYmUgZHVtcGVkCisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBiYXRhZHZfdl9nd19kdW1wX2VudHJ5KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkJICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJCSAgc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlKQoreworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpyb3V0ZXJfaWZpbmZvID0gTlVMTDsKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKnJvdXRlcjsKKwlzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmN1cnJfZ3c7CisJaW50IHJldCA9IC1FSU5WQUw7CisJdm9pZCAqaGRyOworCisJcm91dGVyID0gYmF0YWR2X29yaWdfcm91dGVyX2dldChnd19ub2RlLT5vcmlnX25vZGUsIEJBVEFEVl9JRl9ERUZBVUxUKTsKKwlpZiAoIXJvdXRlcikKKwkJZ290byBvdXQ7CisKKwlyb3V0ZXJfaWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQocm91dGVyLCBCQVRBRFZfSUZfREVGQVVMVCk7CisJaWYgKCFyb3V0ZXJfaWZpbmZvKQorCQlnb3RvIG91dDsKKworCWN1cnJfZ3cgPSBiYXRhZHZfZ3dfZ2V0X3NlbGVjdGVkX2d3X25vZGUoYmF0X3ByaXYpOworCisJaGRyID0gZ2VubG1zZ19wdXQobXNnLCBwb3J0aWQsIHNlcSwgJmJhdGFkdl9uZXRsaW5rX2ZhbWlseSwKKwkJCSAgTkxNX0ZfTVVMVEksIEJBVEFEVl9DTURfR0VUX0dBVEVXQVlTKTsKKwlpZiAoIWhkcikgeworCQlyZXQgPSAtRU5PQlVGUzsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gLUVNU0dTSVpFOworCisJaWYgKGN1cnJfZ3cgPT0gZ3dfbm9kZSkgeworCQlpZiAobmxhX3B1dF9mbGFnKG1zZywgQkFUQURWX0FUVFJfRkxBR19CRVNUKSkgeworCQkJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAobmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX09SSUdfQUREUkVTUywgRVRIX0FMRU4sCisJCSAgICBnd19ub2RlLT5vcmlnX25vZGUtPm9yaWcpKSB7CisJCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfVEhST1VHSFBVVCwKKwkJCXJvdXRlcl9pZmluZm8tPmJhdF92LnRocm91Z2hwdXQpKSB7CisJCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9ST1VURVIsIEVUSF9BTEVOLCByb3V0ZXItPmFkZHIpKSB7CisJCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKG5sYV9wdXRfc3RyaW5nKG1zZywgQkFUQURWX0FUVFJfSEFSRF9JRk5BTUUsCisJCQkgICByb3V0ZXItPmlmX2luY29taW5nLT5uZXRfZGV2LT5uYW1lKSkgeworCQlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX0JBTkRXSURUSF9ET1dOLAorCQkJZ3dfbm9kZS0+YmFuZHdpZHRoX2Rvd24pKSB7CisJCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfQkFORFdJRFRIX1VQLCBnd19ub2RlLT5iYW5kd2lkdGhfdXApKSB7CisJCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwkJZ290byBvdXQ7CisJfQorCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCXJldCA9IDA7CisKK291dDoKKwlpZiAocm91dGVyX2lmaW5mbykKKwkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQocm91dGVyX2lmaW5mbyk7CisJaWYgKHJvdXRlcikKKwkJYmF0YWR2X25laWdoX25vZGVfcHV0KHJvdXRlcik7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBiYXRhZHZfdl9nd19kdW1wIC0gRHVtcCBnYXRld2F5cyBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQGNiOiBDb250cm9sIGJsb2NrIGNvbnRhaW5pbmcgYWRkaXRpb25hbCBvcHRpb25zCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqLworc3RhdGljIHZvaWQgYmF0YWR2X3ZfZ3dfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCQkgICAgIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYpCit7CisJaW50IHBvcnRpZCA9IE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkOworCXN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZTsKKwlpbnQgaWR4X3NraXAgPSBjYi0+YXJnc1swXTsKKwlpbnQgaWR4ID0gMDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZ3dfbm9kZSwgJmJhdF9wcml2LT5ndy5saXN0LCBsaXN0KSB7CisJCWlmIChpZHgrKyA8IGlkeF9za2lwKQorCQkJY29udGludWU7CisKKwkJaWYgKGJhdGFkdl92X2d3X2R1bXBfZW50cnkobXNnLCBwb3J0aWQsIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkJCQkJICAgYmF0X3ByaXYsIGd3X25vZGUpKSB7CisJCQlpZHhfc2tpcCA9IGlkeCAtIDE7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCX0KKworCWlkeF9za2lwID0gaWR4OwordW5sb2NrOgorCXJjdV9yZWFkX3VubG9jaygpOworCisJY2ItPmFyZ3NbMF0gPSBpZHhfc2tpcDsKK30KKwogc3RhdGljIHN0cnVjdCBiYXRhZHZfYWxnb19vcHMgYmF0YWR2X2JhdG1hbl92IF9fcmVhZF9tb3N0bHkgPSB7CiAJLm5hbWUgPSAiQkFUTUFOX1YiLAogCS5pZmFjZSA9IHsKQEAgLTMzMywxMCArMTA0MCwyNiBAQAogCQkuaGFyZGlmX2luaXQgPSBiYXRhZHZfdl9oYXJkaWZfbmVpZ2hfaW5pdCwKIAkJLmNtcCA9IGJhdGFkdl92X25laWdoX2NtcCwKIAkJLmlzX3NpbWlsYXJfb3JfYmV0dGVyID0gYmF0YWR2X3ZfbmVpZ2hfaXNfc29iLAorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIAkJLnByaW50ID0gYmF0YWR2X3ZfbmVpZ2hfcHJpbnQsCisjZW5kaWYKKwkJLmR1bXAgPSBiYXRhZHZfdl9uZWlnaF9kdW1wLAogCX0sCiAJLm9yaWcgPSB7CisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogCQkucHJpbnQgPSBiYXRhZHZfdl9vcmlnX3ByaW50LAorI2VuZGlmCisJCS5kdW1wID0gYmF0YWR2X3Zfb3JpZ19kdW1wLAorCX0sCisJLmd3ID0geworCQkuc3RvcmVfc2VsX2NsYXNzID0gYmF0YWR2X3Zfc3RvcmVfc2VsX2NsYXNzLAorCQkuc2hvd19zZWxfY2xhc3MgPSBiYXRhZHZfdl9zaG93X3NlbF9jbGFzcywKKwkJLmdldF9iZXN0X2d3X25vZGUgPSBiYXRhZHZfdl9nd19nZXRfYmVzdF9nd19ub2RlLAorCQkuaXNfZWxpZ2libGUgPSBiYXRhZHZfdl9nd19pc19lbGlnaWJsZSwKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCisJCS5wcmludCA9IGJhdGFkdl92X2d3X3ByaW50LAorI2VuZGlmCisJCS5kdW1wID0gYmF0YWR2X3ZfZ3dfZHVtcCwKIAl9LAogfTsKIApAQCAtMzYzLDcgKzEwODYsMTYgQEAKICAqLwogaW50IGJhdGFkdl92X21lc2hfaW5pdChzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2KQogewotCXJldHVybiBiYXRhZHZfdl9vZ21faW5pdChiYXRfcHJpdik7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBiYXRhZHZfdl9vZ21faW5pdChiYXRfcHJpdik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBzZXQgZGVmYXVsdCB0aHJvdWdocHV0IGRpZmZlcmVuY2UgdGhyZXNob2xkIHRvIDVNYnBzICovCisJYXRvbWljX3NldCgmYmF0X3ByaXYtPmd3LnNlbF9jbGFzcywgNTApOworCisJcmV0dXJuIDA7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvYmF0X3ZfZWxwLmMgYi9uZXQvYmF0bWFuLWFkdi9iYXRfdl9lbHAuYwppbmRleCA3ZDE3MDAxLi5lZTA4NTQwIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9iYXRfdl9lbHAuYworKysgYi9uZXQvYmF0bWFuLWFkdi9iYXRfdl9lbHAuYwpAQCAtMzM1LDcgKzMzNSw3IEBACiAJCWdvdG8gb3V0OwogCiAJc2tiX3Jlc2VydmUoaGFyZF9pZmFjZS0+YmF0X3YuZWxwX3NrYiwgRVRIX0hMRU4gKyBORVRfSVBfQUxJR04pOwotCWVscF9idWZmID0gc2tiX3B1c2goaGFyZF9pZmFjZS0+YmF0X3YuZWxwX3NrYiwgQkFUQURWX0VMUF9ITEVOKTsKKwllbHBfYnVmZiA9IHNrYl9wdXQoaGFyZF9pZmFjZS0+YmF0X3YuZWxwX3NrYiwgQkFUQURWX0VMUF9ITEVOKTsKIAllbHBfcGFja2V0ID0gKHN0cnVjdCBiYXRhZHZfZWxwX3BhY2tldCAqKWVscF9idWZmOwogCW1lbXNldChlbHBfcGFja2V0LCAwLCBCQVRBRFZfRUxQX0hMRU4pOwogCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9iYXRfdl9vZ20uYyBiL25ldC9iYXRtYW4tYWR2L2JhdF92X29nbS5jCmluZGV4IDZmYmJhNGUuLjFhZWVhZGMgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2JhdF92X29nbS5jCisrKyBiL25ldC9iYXRtYW4tYWR2L2JhdF92X29nbS5jCkBAIC03MywxMyArNzMsMTIgQEAKIAlpZiAoIW9yaWdfbm9kZSkKIAkJcmV0dXJuIE5VTEw7CiAKKwlrcmVmX2dldCgmb3JpZ19ub2RlLT5yZWZjb3VudCk7CiAJaGFzaF9hZGRlZCA9IGJhdGFkdl9oYXNoX2FkZChiYXRfcHJpdi0+b3JpZ19oYXNoLCBiYXRhZHZfY29tcGFyZV9vcmlnLAogCQkJCSAgICAgYmF0YWR2X2Nob29zZV9vcmlnLCBvcmlnX25vZGUsCiAJCQkJICAgICAmb3JpZ19ub2RlLT5oYXNoX2VudHJ5KTsKIAlpZiAoaGFzaF9hZGRlZCAhPSAwKSB7Ci0JCS8qIG9yaWdfbm9kZS0+cmVmY291bnRlciBpcyBpbml0aWFsaXNlZCB0byAyIGJ5Ci0JCSAqIGJhdGFkdl9vcmlnX25vZGVfbmV3KCkKLQkJICovCisJCS8qIHJlbW92ZSByZWZjbnQgZm9yIG5ld2x5IGNyZWF0ZWQgb3JpZ19ub2RlIGFuZCBoYXNoIGVudHJ5ICovCiAJCWJhdGFkdl9vcmlnX25vZGVfcHV0KG9yaWdfbm9kZSk7CiAJCWJhdGFkdl9vcmlnX25vZGVfcHV0KG9yaWdfbm9kZSk7CiAJCW9yaWdfbm9kZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9icmlkZ2VfbG9vcF9hdm9pZGFuY2UuYyBiL25ldC9iYXRtYW4tYWR2L2JyaWRnZV9sb29wX2F2b2lkYW5jZS5jCmluZGV4IGFkMmZmZTEuLmU3ZjY5MGIgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2JyaWRnZV9sb29wX2F2b2lkYW5jZS5jCisrKyBiL25ldC9iYXRtYW4tYWR2L2JyaWRnZV9sb29wX2F2b2lkYW5jZS5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KQEAgLTQ1LDEyICs0NiwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPG5ldC9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvYmF0bWFuX2Fkdi5oPgogCiAjaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJoYXNoLmgiCiAjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAibmV0bGluay5oIgogI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKICNpbmNsdWRlICJwYWNrZXQuaCIKKyNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgogI2luY2x1ZGUgInN5c2ZzLmgiCiAjaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKIApAQCAtNTE5LDExICs1MjYsOSBAQAogCWF0b21pY19zZXQoJmVudHJ5LT53YWl0X3BlcmlvZHMsIDApOwogCWV0aGVyX2FkZHJfY29weShlbnRyeS0+b3JpZywgb3JpZyk7CiAJSU5JVF9XT1JLKCZlbnRyeS0+cmVwb3J0X3dvcmssIGJhdGFkdl9ibGFfbG9vcGRldGVjdF9yZXBvcnQpOwotCi0JLyogb25lIGZvciB0aGUgaGFzaCwgb25lIGZvciByZXR1cm5pbmcgKi8KIAlrcmVmX2luaXQoJmVudHJ5LT5yZWZjb3VudCk7Ci0Ja3JlZl9nZXQoJmVudHJ5LT5yZWZjb3VudCk7CiAKKwlrcmVmX2dldCgmZW50cnktPnJlZmNvdW50KTsKIAloYXNoX2FkZGVkID0gYmF0YWR2X2hhc2hfYWRkKGJhdF9wcml2LT5ibGEuYmFja2JvbmVfaGFzaCwKIAkJCQkgICAgIGJhdGFkdl9jb21wYXJlX2JhY2tib25lX2d3LAogCQkJCSAgICAgYmF0YWR2X2Nob29zZV9iYWNrYm9uZV9ndywgZW50cnksCkBAIC03MTEsMTIgKzcxNiwxMyBAQAogCQljbGFpbS0+bGFzdHRpbWUgPSBqaWZmaWVzOwogCQlrcmVmX2dldCgmYmFja2JvbmVfZ3ctPnJlZmNvdW50KTsKIAkJY2xhaW0tPmJhY2tib25lX2d3ID0gYmFja2JvbmVfZ3c7Ci0KIAkJa3JlZl9pbml0KCZjbGFpbS0+cmVmY291bnQpOwotCQlrcmVmX2dldCgmY2xhaW0tPnJlZmNvdW50KTsKKwogCQliYXRhZHZfZGJnKEJBVEFEVl9EQkdfQkxBLCBiYXRfcHJpdiwKIAkJCSAgICJibGFfYWRkX2NsYWltKCk6IGFkZGluZyBuZXcgZW50cnkgJXBNLCB2aWQgJWQgdG8gaGFzaCAuLi5cbiIsCiAJCQkgICBtYWMsIEJBVEFEVl9QUklOVF9WSUQodmlkKSk7CisKKwkJa3JlZl9nZXQoJmNsYWltLT5yZWZjb3VudCk7CiAJCWhhc2hfYWRkZWQgPSBiYXRhZHZfaGFzaF9hZGQoYmF0X3ByaXYtPmJsYS5jbGFpbV9oYXNoLAogCQkJCQkgICAgIGJhdGFkdl9jb21wYXJlX2NsYWltLAogCQkJCQkgICAgIGJhdGFkdl9jaG9vc2VfY2xhaW0sIGNsYWltLApAQCAtMTE0OCw3ICsxMTU0LDcgQEAKIAogCS8qIExldCB0aGUgbG9vcGRldGVjdCBmcmFtZXMgb24gdGhlIG1lc2ggaW4gYW55IGNhc2UuICovCiAJaWYgKGJsYV9kc3QtPnR5cGUgPT0gQkFUQURWX0NMQUlNX1RZUEVfTE9PUERFVEVDVCkKLQkJcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKIAogCS8qIGNoZWNrIGlmIGl0IGlzIGEgY2xhaW0gZnJhbWUuICovCiAJcmV0ID0gYmF0YWR2X2NoZWNrX2NsYWltX2dyb3VwKGJhdF9wcml2LCBwcmltYXJ5X2lmLCBod19zcmMsIGh3X2RzdCwKQEAgLTE5OTAsNiArMTk5Niw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIC8qKgogICogYmF0YWR2X2JsYV9jbGFpbV90YWJsZV9zZXFfcHJpbnRfdGV4dCAtIHByaW50IHRoZSBjbGFpbSB0YWJsZSBpbiBhIHNlcSBmaWxlCiAgKiBAc2VxOiBzZXEgZmlsZSB0byBwcmludCBvbgpAQCAtMjA1MCw4ICsyMDU3LDE3MiBAQAogCQliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgogCiAvKioKKyAqIGJhdGFkdl9ibGFfY2xhaW1fZHVtcF9lbnRyeSAtIGR1bXAgb25lIGVudHJ5IG9mIHRoZSBjbGFpbSB0YWJsZQorICogdG8gYSBuZXRsaW5rIHNvY2tldAorICogQG1zZzogYnVmZmVyIGZvciB0aGUgbWVzc2FnZQorICogQHBvcnRpZDogbmV0bGluayBwb3J0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAcHJpbWFyeV9pZjogcHJpbWFyeSBpbnRlcmZhY2UKKyAqIEBjbGFpbTogZW50cnkgdG8gZHVtcAorICoKKyAqIFJldHVybjogMCBvciBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50CitiYXRhZHZfYmxhX2NsYWltX2R1bXBfZW50cnkoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKnByaW1hcnlfaWYsCisJCQkgICAgc3RydWN0IGJhdGFkdl9ibGFfY2xhaW0gKmNsYWltKQoreworCXU4ICpwcmltYXJ5X2FkZHIgPSBwcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkcjsKKwl1MTYgYmFja2JvbmVfY3JjOworCWJvb2wgaXNfb3duOworCXZvaWQgKmhkcjsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgcG9ydGlkLCBzZXEsICZiYXRhZHZfbmV0bGlua19mYW1pbHksCisJCQkgIE5MTV9GX01VTFRJLCBCQVRBRFZfQ01EX0dFVF9CTEFfQ0xBSU0pOworCWlmICghaGRyKSB7CisJCXJldCA9IC1FTk9CVUZTOworCQlnb3RvIG91dDsKKwl9CisKKwlpc19vd24gPSBiYXRhZHZfY29tcGFyZV9ldGgoY2xhaW0tPmJhY2tib25lX2d3LT5vcmlnLAorCQkJCSAgICBwcmltYXJ5X2FkZHIpOworCisJc3Bpbl9sb2NrX2JoKCZjbGFpbS0+YmFja2JvbmVfZ3ctPmNyY19sb2NrKTsKKwliYWNrYm9uZV9jcmMgPSBjbGFpbS0+YmFja2JvbmVfZ3ctPmNyYzsKKwlzcGluX3VubG9ja19iaCgmY2xhaW0tPmJhY2tib25lX2d3LT5jcmNfbG9jayk7CisKKwlpZiAoaXNfb3duKQorCQlpZiAobmxhX3B1dF9mbGFnKG1zZywgQkFUQURWX0FUVFJfQkxBX09XTikpIHsKKwkJCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwlpZiAobmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX0JMQV9BRERSRVNTLCBFVEhfQUxFTiwgY2xhaW0tPmFkZHIpIHx8CisJICAgIG5sYV9wdXRfdTE2KG1zZywgQkFUQURWX0FUVFJfQkxBX1ZJRCwgY2xhaW0tPnZpZCkgfHwKKwkgICAgbmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX0JMQV9CQUNLQk9ORSwgRVRIX0FMRU4sCisJCSAgICBjbGFpbS0+YmFja2JvbmVfZ3ctPm9yaWcpIHx8CisJICAgIG5sYV9wdXRfdTE2KG1zZywgQkFUQURWX0FUVFJfQkxBX0NSQywKKwkJCWJhY2tib25lX2NyYykpIHsKKwkJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCQlnb3RvIG91dDsKKwl9CisKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisJcmV0ID0gMDsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYmF0YWR2X2JsYV9jbGFpbV9kdW1wX2J1Y2tldCAtIGR1bXAgb25lIGJ1Y2tldCBvZiB0aGUgY2xhaW0gdGFibGUKKyAqIHRvIGEgbmV0bGluayBzb2NrZXQKKyAqIEBtc2c6IGJ1ZmZlciBmb3IgdGhlIG1lc3NhZ2UKKyAqIEBwb3J0aWQ6IG5ldGxpbmsgcG9ydAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQHByaW1hcnlfaWY6IHByaW1hcnkgaW50ZXJmYWNlCisgKiBAaGVhZDogYnVja2V0IHRvIGR1bXAKKyAqIEBpZHhfc2tpcDogSG93IG1hbnkgZW50cmllcyB0byBza2lwCisgKgorICogUmV0dXJuOiBhbHdheXMgMC4KKyAqLworc3RhdGljIGludAorYmF0YWR2X2JsYV9jbGFpbV9kdW1wX2J1Y2tldChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJICAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKnByaW1hcnlfaWYsCisJCQkgICAgIHN0cnVjdCBobGlzdF9oZWFkICpoZWFkLCBpbnQgKmlkeF9za2lwKQoreworCXN0cnVjdCBiYXRhZHZfYmxhX2NsYWltICpjbGFpbTsKKwlpbnQgaWR4ID0gMDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2xhaW0sIGhlYWQsIGhhc2hfZW50cnkpIHsKKwkJaWYgKGlkeCsrIDwgKmlkeF9za2lwKQorCQkJY29udGludWU7CisJCWlmIChiYXRhZHZfYmxhX2NsYWltX2R1bXBfZW50cnkobXNnLCBwb3J0aWQsIHNlcSwKKwkJCQkJCXByaW1hcnlfaWYsIGNsYWltKSkgeworCQkJKmlkeF9za2lwID0gaWR4IC0gMTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisJfQorCisJKmlkeF9za2lwID0gaWR4OwordW5sb2NrOgorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGJhdGFkdl9ibGFfY2xhaW1fZHVtcCAtIGR1bXAgY2xhaW0gdGFibGUgdG8gYSBuZXRsaW5rIHNvY2tldAorICogQG1zZzogYnVmZmVyIGZvciB0aGUgbWVzc2FnZQorICogQGNiOiBjYWxsYmFjayBzdHJ1Y3R1cmUgY29udGFpbmluZyBhcmd1bWVudHMKKyAqCisgKiBSZXR1cm46IG1lc3NhZ2UgbGVuZ3RoLgorICovCitpbnQgYmF0YWR2X2JsYV9jbGFpbV9kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKnByaW1hcnlfaWYgPSBOVUxMOworCWludCBwb3J0aWQgPSBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZDsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChjYi0+c2tiLT5zayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2U7CisJc3RydWN0IGJhdGFkdl9oYXNodGFibGUgKmhhc2g7CisJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdjsKKwlpbnQgYnVja2V0ID0gY2ItPmFyZ3NbMF07CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisJaW50IGlkeCA9IGNiLT5hcmdzWzFdOworCWludCBpZmluZGV4OworCWludCByZXQgPSAwOworCisJaWZpbmRleCA9IGJhdGFkdl9uZXRsaW5rX2dldF9pZmluZGV4KGNiLT5ubGgsCisJCQkJCSAgICAgQkFUQURWX0FUVFJfTUVTSF9JRklOREVYKTsKKwlpZiAoIWlmaW5kZXgpCisJCXJldHVybiAtRUlOVkFMOworCisJc29mdF9pZmFjZSA9IGRldl9nZXRfYnlfaW5kZXgobmV0LCBpZmluZGV4KTsKKwlpZiAoIXNvZnRfaWZhY2UgfHwgIWJhdGFkdl9zb2Z0aWZfaXNfdmFsaWQoc29mdF9pZmFjZSkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKKwloYXNoID0gYmF0X3ByaXYtPmJsYS5jbGFpbV9oYXNoOworCisJcHJpbWFyeV9pZiA9IGJhdGFkdl9wcmltYXJ5X2lmX2dldF9zZWxlY3RlZChiYXRfcHJpdik7CisJaWYgKCFwcmltYXJ5X2lmIHx8IHByaW1hcnlfaWYtPmlmX3N0YXR1cyAhPSBCQVRBRFZfSUZfQUNUSVZFKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKworCXdoaWxlIChidWNrZXQgPCBoYXNoLT5zaXplKSB7CisJCWhlYWQgPSAmaGFzaC0+dGFibGVbYnVja2V0XTsKKworCQlpZiAoYmF0YWR2X2JsYV9jbGFpbV9kdW1wX2J1Y2tldChtc2csIHBvcnRpZCwKKwkJCQkJCSBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJCQkgcHJpbWFyeV9pZiwgaGVhZCwgJmlkeCkpCisJCQlicmVhazsKKwkJYnVja2V0Kys7CisJfQorCisJY2ItPmFyZ3NbMF0gPSBidWNrZXQ7CisJY2ItPmFyZ3NbMV0gPSBpZHg7CisKKwlyZXQgPSBtc2ctPmxlbjsKKworb3V0OgorCWlmIChwcmltYXJ5X2lmKQorCQliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKKworCWlmIChzb2Z0X2lmYWNlKQorCQlkZXZfcHV0KHNvZnRfaWZhY2UpOworCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKKy8qKgogICogYmF0YWR2X2JsYV9iYWNrYm9uZV90YWJsZV9zZXFfcHJpbnRfdGV4dCAtIHByaW50IHRoZSBiYWNrYm9uZSB0YWJsZSBpbiBhIHNlcQogICogIGZpbGUKICAqIEBzZXE6IHNlcSBmaWxlIHRvIHByaW50IG9uCkBAIC0yMTE0LDMgKzIyODUsMTY4IEBACiAJCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOwogCXJldHVybiAwOwogfQorI2VuZGlmCisKKy8qKgorICogYmF0YWR2X2JsYV9iYWNrYm9uZV9kdW1wX2VudHJ5IC0gZHVtcCBvbmUgZW50cnkgb2YgdGhlIGJhY2tib25lIHRhYmxlCisgKiB0byBhIG5ldGxpbmsgc29ja2V0CisgKiBAbXNnOiBidWZmZXIgZm9yIHRoZSBtZXNzYWdlCisgKiBAcG9ydGlkOiBuZXRsaW5rIHBvcnQKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBwcmltYXJ5X2lmOiBwcmltYXJ5IGludGVyZmFjZQorICogQGJhY2tib25lX2d3OiBlbnRyeSB0byBkdW1wCisgKgorICogUmV0dXJuOiAwIG9yIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl9ibGFfYmFja2JvbmVfZHVtcF9lbnRyeShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJICAgICAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqcHJpbWFyeV9pZiwKKwkJCSAgICAgICBzdHJ1Y3QgYmF0YWR2X2JsYV9iYWNrYm9uZV9ndyAqYmFja2JvbmVfZ3cpCit7CisJdTggKnByaW1hcnlfYWRkciA9IHByaW1hcnlfaWYtPm5ldF9kZXYtPmRldl9hZGRyOworCXUxNiBiYWNrYm9uZV9jcmM7CisJYm9vbCBpc19vd247CisJaW50IG1zZWNzOworCXZvaWQgKmhkcjsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgcG9ydGlkLCBzZXEsICZiYXRhZHZfbmV0bGlua19mYW1pbHksCisJCQkgIE5MTV9GX01VTFRJLCBCQVRBRFZfQ01EX0dFVF9CTEFfQkFDS0JPTkUpOworCWlmICghaGRyKSB7CisJCXJldCA9IC1FTk9CVUZTOworCQlnb3RvIG91dDsKKwl9CisKKwlpc19vd24gPSBiYXRhZHZfY29tcGFyZV9ldGgoYmFja2JvbmVfZ3ctPm9yaWcsIHByaW1hcnlfYWRkcik7CisKKwlzcGluX2xvY2tfYmgoJmJhY2tib25lX2d3LT5jcmNfbG9jayk7CisJYmFja2JvbmVfY3JjID0gYmFja2JvbmVfZ3ctPmNyYzsKKwlzcGluX3VubG9ja19iaCgmYmFja2JvbmVfZ3ctPmNyY19sb2NrKTsKKworCW1zZWNzID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gYmFja2JvbmVfZ3ctPmxhc3R0aW1lKTsKKworCWlmIChpc19vd24pCisJCWlmIChubGFfcHV0X2ZsYWcobXNnLCBCQVRBRFZfQVRUUl9CTEFfT1dOKSkgeworCQkJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCQkJZ290byBvdXQ7CisJCX0KKworCWlmIChubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfQkxBX0JBQ0tCT05FLCBFVEhfQUxFTiwKKwkJICAgIGJhY2tib25lX2d3LT5vcmlnKSB8fAorCSAgICBubGFfcHV0X3UxNihtc2csIEJBVEFEVl9BVFRSX0JMQV9WSUQsIGJhY2tib25lX2d3LT52aWQpIHx8CisJICAgIG5sYV9wdXRfdTE2KG1zZywgQkFUQURWX0FUVFJfQkxBX0NSQywKKwkJCWJhY2tib25lX2NyYykgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9MQVNUX1NFRU5fTVNFQ1MsIG1zZWNzKSkgeworCQlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJCWdvdG8gb3V0OworCX0KKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKwlyZXQgPSAwOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBiYXRhZHZfYmxhX2JhY2tib25lX2R1bXBfYnVja2V0IC0gZHVtcCBvbmUgYnVja2V0IG9mIHRoZSBiYWNrYm9uZSB0YWJsZQorICogdG8gYSBuZXRsaW5rIHNvY2tldAorICogQG1zZzogYnVmZmVyIGZvciB0aGUgbWVzc2FnZQorICogQHBvcnRpZDogbmV0bGluayBwb3J0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAcHJpbWFyeV9pZjogcHJpbWFyeSBpbnRlcmZhY2UKKyAqIEBoZWFkOiBidWNrZXQgdG8gZHVtcAorICogQGlkeF9za2lwOiBIb3cgbWFueSBlbnRyaWVzIHRvIHNraXAKKyAqCisgKiBSZXR1cm46IGFsd2F5cyAwLgorICovCitzdGF0aWMgaW50CitiYXRhZHZfYmxhX2JhY2tib25lX2R1bXBfYnVja2V0KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpwcmltYXJ5X2lmLAorCQkJCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkLCBpbnQgKmlkeF9za2lwKQoreworCXN0cnVjdCBiYXRhZHZfYmxhX2JhY2tib25lX2d3ICpiYWNrYm9uZV9ndzsKKwlpbnQgaWR4ID0gMDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmFja2JvbmVfZ3csIGhlYWQsIGhhc2hfZW50cnkpIHsKKwkJaWYgKGlkeCsrIDwgKmlkeF9za2lwKQorCQkJY29udGludWU7CisJCWlmIChiYXRhZHZfYmxhX2JhY2tib25lX2R1bXBfZW50cnkobXNnLCBwb3J0aWQsIHNlcSwKKwkJCQkJCSAgIHByaW1hcnlfaWYsIGJhY2tib25lX2d3KSkgeworCQkJKmlkeF9za2lwID0gaWR4IC0gMTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisJfQorCisJKmlkeF9za2lwID0gaWR4OwordW5sb2NrOgorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGJhdGFkdl9ibGFfYmFja2JvbmVfZHVtcCAtIGR1bXAgYmFja2JvbmUgdGFibGUgdG8gYSBuZXRsaW5rIHNvY2tldAorICogQG1zZzogYnVmZmVyIGZvciB0aGUgbWVzc2FnZQorICogQGNiOiBjYWxsYmFjayBzdHJ1Y3R1cmUgY29udGFpbmluZyBhcmd1bWVudHMKKyAqCisgKiBSZXR1cm46IG1lc3NhZ2UgbGVuZ3RoLgorICovCitpbnQgYmF0YWR2X2JsYV9iYWNrYm9uZV9kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKnByaW1hcnlfaWYgPSBOVUxMOworCWludCBwb3J0aWQgPSBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZDsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChjYi0+c2tiLT5zayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2U7CisJc3RydWN0IGJhdGFkdl9oYXNodGFibGUgKmhhc2g7CisJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdjsKKwlpbnQgYnVja2V0ID0gY2ItPmFyZ3NbMF07CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisJaW50IGlkeCA9IGNiLT5hcmdzWzFdOworCWludCBpZmluZGV4OworCWludCByZXQgPSAwOworCisJaWZpbmRleCA9IGJhdGFkdl9uZXRsaW5rX2dldF9pZmluZGV4KGNiLT5ubGgsCisJCQkJCSAgICAgQkFUQURWX0FUVFJfTUVTSF9JRklOREVYKTsKKwlpZiAoIWlmaW5kZXgpCisJCXJldHVybiAtRUlOVkFMOworCisJc29mdF9pZmFjZSA9IGRldl9nZXRfYnlfaW5kZXgobmV0LCBpZmluZGV4KTsKKwlpZiAoIXNvZnRfaWZhY2UgfHwgIWJhdGFkdl9zb2Z0aWZfaXNfdmFsaWQoc29mdF9pZmFjZSkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKKwloYXNoID0gYmF0X3ByaXYtPmJsYS5iYWNrYm9uZV9oYXNoOworCisJcHJpbWFyeV9pZiA9IGJhdGFkdl9wcmltYXJ5X2lmX2dldF9zZWxlY3RlZChiYXRfcHJpdik7CisJaWYgKCFwcmltYXJ5X2lmIHx8IHByaW1hcnlfaWYtPmlmX3N0YXR1cyAhPSBCQVRBRFZfSUZfQUNUSVZFKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKworCXdoaWxlIChidWNrZXQgPCBoYXNoLT5zaXplKSB7CisJCWhlYWQgPSAmaGFzaC0+dGFibGVbYnVja2V0XTsKKworCQlpZiAoYmF0YWR2X2JsYV9iYWNrYm9uZV9kdW1wX2J1Y2tldChtc2csIHBvcnRpZCwKKwkJCQkJCSAgICBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJCQkgICAgcHJpbWFyeV9pZiwgaGVhZCwgJmlkeCkpCisJCQlicmVhazsKKwkJYnVja2V0Kys7CisJfQorCisJY2ItPmFyZ3NbMF0gPSBidWNrZXQ7CisJY2ItPmFyZ3NbMV0gPSBpZHg7CisKKwlyZXQgPSBtc2ctPmxlbjsKKworb3V0OgorCWlmIChwcmltYXJ5X2lmKQorCQliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKKworCWlmIChzb2Z0X2lmYWNlKQorCQlkZXZfcHV0KHNvZnRfaWZhY2UpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2JyaWRnZV9sb29wX2F2b2lkYW5jZS5oIGIvbmV0L2JhdG1hbi1hZHYvYnJpZGdlX2xvb3BfYXZvaWRhbmNlLmgKaW5kZXggMGYwMWRhZS4uMWFlOTNlNCAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvYnJpZGdlX2xvb3BfYXZvaWRhbmNlLmgKKysrIGIvbmV0L2JhdG1hbi1hZHYvYnJpZGdlX2xvb3BfYXZvaWRhbmNlLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiBzdHJ1Y3QgbmV0X2RldmljZTsKK3N0cnVjdCBuZXRsaW5rX2NhbGxiYWNrOwogc3RydWN0IHNlcV9maWxlOwogc3RydWN0IHNrX2J1ZmY7CiAKQEAgLTM1LDggKzM2LDEwIEBACiAJCQkgICAgICAgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSwKIAkJCSAgICAgICBpbnQgaGRyX3NpemUpOwogaW50IGJhdGFkdl9ibGFfY2xhaW1fdGFibGVfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CitpbnQgYmF0YWR2X2JsYV9jbGFpbV9kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7CiBpbnQgYmF0YWR2X2JsYV9iYWNrYm9uZV90YWJsZV9zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKIAkJCQkJICAgICB2b2lkICpvZmZzZXQpOworaW50IGJhdGFkdl9ibGFfYmFja2JvbmVfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwogYm9vbCBiYXRhZHZfYmxhX2lzX2JhY2tib25lX2d3X29yaWcoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwgdTggKm9yaWcsCiAJCQkJICAgIHVuc2lnbmVkIHNob3J0IHZpZCk7CiBib29sIGJhdGFkdl9ibGFfY2hlY2tfYmNhc3RfZHVwbGlzdChzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LApAQCAtNDcsNyArNTAsNyBAQAogdm9pZCBiYXRhZHZfYmxhX3N0YXR1c191cGRhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwogaW50IGJhdGFkdl9ibGFfaW5pdChzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2KTsKIHZvaWQgYmF0YWR2X2JsYV9mcmVlKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYpOwotCitpbnQgYmF0YWR2X2JsYV9jbGFpbV9kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7CiAjZGVmaW5lIEJBVEFEVl9CTEFfQ1JDX0lOSVQJMAogI2Vsc2UgLyogaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfQkxBICovCiAKQEAgLTExMiw2ICsxMTUsMTggQEAKIHsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgYmF0YWR2X2JsYV9jbGFpbV9kdW1wKHN0cnVjdCBza19idWZmICptc2csCisJCQkJCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJhdGFkdl9ibGFfYmFja2JvbmVfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLAorCQkJCQkgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCiAjZW5kaWYgLyogaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfQkxBICovCiAKICNlbmRpZiAvKiBpZm5kZWYgX05FVF9CQVRNQU5fQURWX0JMQV9IXyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvZGVidWdmcy5jIGIvbmV0L2JhdG1hbi1hZHYvZGVidWdmcy5jCmluZGV4IDFkNjhiNmUuLmI0ZmZiYTdkZCAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvZGVidWdmcy5jCisrKyBiL25ldC9iYXRtYW4tYWR2L2RlYnVnZnMuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KIAogI2luY2x1ZGUgImJhdF9hbGdvLmgiCiAjaW5jbHVkZSAiYnJpZGdlX2xvb3BfYXZvaWRhbmNlLmgiCkBAIC0zMDUsMTIgKzMwNiwxNiBAQAogICovCiBpbnQgYmF0YWR2X2RlYnVnZnNfYWRkX2hhcmRpZihzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRfaWZhY2UpCiB7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChoYXJkX2lmYWNlLT5uZXRfZGV2KTsKIAlzdHJ1Y3QgYmF0YWR2X2RlYnVnaW5mbyAqKmJhdF9kZWJ1ZzsKIAlzdHJ1Y3QgZGVudHJ5ICpmaWxlOwogCiAJaWYgKCFiYXRhZHZfZGVidWdmcykKIAkJZ290byBvdXQ7CiAKKwlpZiAobmV0ICE9ICZpbml0X25ldCkKKwkJcmV0dXJuIDA7CisKIAloYXJkX2lmYWNlLT5kZWJ1Z19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoaGFyZF9pZmFjZS0+bmV0X2Rldi0+bmFtZSwKIAkJCQkJCSAgIGJhdGFkdl9kZWJ1Z2ZzKTsKIAlpZiAoIWhhcmRfaWZhY2UtPmRlYnVnX2RpcikKQEAgLTM0MSw2ICszNDYsMTEgQEAKICAqLwogdm9pZCBiYXRhZHZfZGVidWdmc19kZWxfaGFyZGlmKHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZF9pZmFjZSkKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGhhcmRfaWZhY2UtPm5ldF9kZXYpOworCisJaWYgKG5ldCAhPSAmaW5pdF9uZXQpCisJCXJldHVybjsKKwogCWlmIChiYXRhZHZfZGVidWdmcykgewogCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoaGFyZF9pZmFjZS0+ZGVidWdfZGlyKTsKIAkJaGFyZF9pZmFjZS0+ZGVidWdfZGlyID0gTlVMTDsKQEAgLTM1MSwxMSArMzYxLDE1IEBACiB7CiAJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGJhdGFkdl9kZWJ1Z2luZm8gKipiYXRfZGVidWc7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOwogCXN0cnVjdCBkZW50cnkgKmZpbGU7CiAKIAlpZiAoIWJhdGFkdl9kZWJ1Z2ZzKQogCQlnb3RvIG91dDsKIAorCWlmIChuZXQgIT0gJmluaXRfbmV0KQorCQlyZXR1cm4gMDsKKwogCWJhdF9wcml2LT5kZWJ1Z19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZGV2LT5uYW1lLCBiYXRhZHZfZGVidWdmcyk7CiAJaWYgKCFiYXRfcHJpdi0+ZGVidWdfZGlyKQogCQlnb3RvIG91dDsKQEAgLTM5Miw2ICs0MDYsMTAgQEAKIHZvaWQgYmF0YWR2X2RlYnVnZnNfZGVsX21lc2hpZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKKworCWlmIChuZXQgIT0gJmluaXRfbmV0KQorCQlyZXR1cm47CiAKIAliYXRhZHZfZGVidWdfbG9nX2NsZWFudXAoYmF0X3ByaXYpOwogCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9kZWJ1Z2ZzLmggYi9uZXQvYmF0bWFuLWFkdi9kZWJ1Z2ZzLmgKaW5kZXggMWFiNGUyZTYuLmM2OGZmM2QgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2RlYnVnZnMuaAorKysgYi9uZXQvYmF0bWFuLWFkdi9kZWJ1Z2ZzLmgKQEAgLTI2LDcgKzI2LDcgQEAKIAogI2RlZmluZSBCQVRBRFZfREVCVUdGU19TVUJESVIgImJhdG1hbl9hZHYiCiAKLSNpZiBJU19FTkFCTEVEKENPTkZJR19ERUJVR19GUykKKyNpZiBJU19FTkFCTEVEKENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMpCiAKIHZvaWQgYmF0YWR2X2RlYnVnZnNfaW5pdCh2b2lkKTsKIHZvaWQgYmF0YWR2X2RlYnVnZnNfZGVzdHJveSh2b2lkKTsKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2Rpc3RyaWJ1dGVkLWFycC10YWJsZS5jIGIvbmV0L2JhdG1hbi1hZHYvZGlzdHJpYnV0ZWQtYXJwLXRhYmxlLmMKaW5kZXggYjFjYzhiZi4uZTI1N2VmZCAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvZGlzdHJpYnV0ZWQtYXJwLXRhYmxlLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvZGlzdHJpYnV0ZWQtYXJwLXRhYmxlLmMKQEAgLTM0Myw4ICszNDMsOCBAQAogCWV0aGVyX2FkZHJfY29weShkYXRfZW50cnktPm1hY19hZGRyLCBtYWNfYWRkcik7CiAJZGF0X2VudHJ5LT5sYXN0X3VwZGF0ZSA9IGppZmZpZXM7CiAJa3JlZl9pbml0KCZkYXRfZW50cnktPnJlZmNvdW50KTsKLQlrcmVmX2dldCgmZGF0X2VudHJ5LT5yZWZjb3VudCk7CiAKKwlrcmVmX2dldCgmZGF0X2VudHJ5LT5yZWZjb3VudCk7CiAJaGFzaF9hZGRlZCA9IGJhdGFkdl9oYXNoX2FkZChiYXRfcHJpdi0+ZGF0Lmhhc2gsIGJhdGFkdl9jb21wYXJlX2RhdCwKIAkJCQkgICAgIGJhdGFkdl9oYXNoX2RhdCwgZGF0X2VudHJ5LAogCQkJCSAgICAgJmRhdF9lbnRyeS0+aGFzaF9lbnRyeSk7CkBAIC03OTUsNiArNzk1LDcgQEAKIAliYXRhZHZfZGF0X2hhc2hfZnJlZShiYXRfcHJpdik7CiB9CiAKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiAvKioKICAqIGJhdGFkdl9kYXRfY2FjaGVfc2VxX3ByaW50X3RleHQgLSBwcmludCB0aGUgbG9jYWwgREFUIGhhc2ggdGFibGUKICAqIEBzZXE6IHNlcSBmaWxlIHRvIHByaW50IG9uCkBAIC04NDYsNiArODQ3LDcgQEAKIAkJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7CiAJcmV0dXJuIDA7CiB9CisjZW5kaWYKIAogLyoqCiAgKiBiYXRhZHZfYXJwX2dldF90eXBlIC0gcGFyc2UgYW4gQVJQIHBhY2tldCBhbmQgZ2V0cyB0aGUgdHlwZQpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jbGllbnQuYyBiL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmMKaW5kZXggNjNhODA1ZC4uZGUwNTVkNiAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jbGllbnQuYworKysgYi9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NsaWVudC5jCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CkBAIC0zMSw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KQEAgLTM5LDEzICs0MSwxNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2JhdG1hbl9hZHYuaD4KIAogI2luY2x1ZGUgImdhdGV3YXlfY29tbW9uLmgiCiAjaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJuZXRsaW5rLmgiCiAjaW5jbHVkZSAib3JpZ2luYXRvci5oIgogI2luY2x1ZGUgInBhY2tldC5oIgogI2luY2x1ZGUgInJvdXRpbmcuaCIKKyNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgogI2luY2x1ZGUgInN5c2ZzLmgiCiAjaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKIApAQCAtODAsMTIgKzg2LDEyIEBACiAgKiBiYXRhZHZfZ3dfbm9kZV9wdXQgLSBkZWNyZW1lbnQgdGhlIGd3X25vZGUgcmVmY291bnRlciBhbmQgcG9zc2libHkgcmVsZWFzZSBpdAogICogQGd3X25vZGU6IGdhdGV3YXkgbm9kZSB0byBmcmVlCiAgKi8KLXN0YXRpYyB2b2lkIGJhdGFkdl9nd19ub2RlX3B1dChzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGUpCit2b2lkIGJhdGFkdl9nd19ub2RlX3B1dChzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGUpCiB7CiAJa3JlZl9wdXQoJmd3X25vZGUtPnJlZmNvdW50LCBiYXRhZHZfZ3dfbm9kZV9yZWxlYXNlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqCitzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKgogYmF0YWR2X2d3X2dldF9zZWxlY3RlZF9nd19ub2RlKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYpCiB7CiAJc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlOwpAQCAtMTY0LDg2ICsxNzAsNiBAQAogCWF0b21pY19zZXQoJmJhdF9wcml2LT5ndy5yZXNlbGVjdCwgMSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKgotYmF0YWR2X2d3X2dldF9iZXN0X2d3X25vZGUoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdikKLXsKLQlzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKnJvdXRlcjsKLQlzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqcm91dGVyX2lmaW5mbzsKLQlzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGUsICpjdXJyX2d3ID0gTlVMTDsKLQl1NjQgbWF4X2d3X2ZhY3RvciA9IDA7Ci0JdTY0IHRtcF9nd19mYWN0b3IgPSAwOwotCXU4IG1heF90cSA9IDA7Ci0JdTggdHFfYXZnOwotCXN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGd3X25vZGUsICZiYXRfcHJpdi0+Z3cubGlzdCwgbGlzdCkgewotCQlvcmlnX25vZGUgPSBnd19ub2RlLT5vcmlnX25vZGU7Ci0JCXJvdXRlciA9IGJhdGFkdl9vcmlnX3JvdXRlcl9nZXQob3JpZ19ub2RlLCBCQVRBRFZfSUZfREVGQVVMVCk7Ci0JCWlmICghcm91dGVyKQotCQkJY29udGludWU7Ci0KLQkJcm91dGVyX2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KHJvdXRlciwKLQkJCQkJCQlCQVRBRFZfSUZfREVGQVVMVCk7Ci0JCWlmICghcm91dGVyX2lmaW5mbykKLQkJCWdvdG8gbmV4dDsKLQotCQlpZiAoIWtyZWZfZ2V0X3VubGVzc196ZXJvKCZnd19ub2RlLT5yZWZjb3VudCkpCi0JCQlnb3RvIG5leHQ7Ci0KLQkJdHFfYXZnID0gcm91dGVyX2lmaW5mby0+YmF0X2l2LnRxX2F2ZzsKLQotCQlzd2l0Y2ggKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3cuc2VsX2NsYXNzKSkgewotCQljYXNlIDE6IC8qIGZhc3QgY29ubmVjdGlvbiAqLwotCQkJdG1wX2d3X2ZhY3RvciA9IHRxX2F2ZyAqIHRxX2F2ZzsKLQkJCXRtcF9nd19mYWN0b3IgKj0gZ3dfbm9kZS0+YmFuZHdpZHRoX2Rvd247Ci0JCQl0bXBfZ3dfZmFjdG9yICo9IDEwMCAqIDEwMDsKLQkJCXRtcF9nd19mYWN0b3IgPj49IDE4OwotCi0JCQlpZiAoKHRtcF9nd19mYWN0b3IgPiBtYXhfZ3dfZmFjdG9yKSB8fAotCQkJICAgICgodG1wX2d3X2ZhY3RvciA9PSBtYXhfZ3dfZmFjdG9yKSAmJgotCQkJICAgICAodHFfYXZnID4gbWF4X3RxKSkpIHsKLQkJCQlpZiAoY3Vycl9ndykKLQkJCQkJYmF0YWR2X2d3X25vZGVfcHV0KGN1cnJfZ3cpOwotCQkJCWN1cnJfZ3cgPSBnd19ub2RlOwotCQkJCWtyZWZfZ2V0KCZjdXJyX2d3LT5yZWZjb3VudCk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OiAvKiAyOiAgc3RhYmxlIGNvbm5lY3Rpb24gKHVzZSBiZXN0IHN0YXRpc3RpYykKLQkJCSAgKiAzOiAgZmFzdC1zd2l0Y2ggKHVzZSBiZXN0IHN0YXRpc3RpYyBidXQgY2hhbmdlIGFzCi0JCQkgICogICAgIHNvb24gYXMgYSBiZXR0ZXIgZ2F0ZXdheSBhcHBlYXJzKQotCQkJICAqIFhYOiBsYXRlLXN3aXRjaCAodXNlIGJlc3Qgc3RhdGlzdGljIGJ1dCBjaGFuZ2UgYXMKLQkJCSAgKiAgICAgc29vbiBhcyBhIGJldHRlciBnYXRld2F5IGFwcGVhcnMgd2hpY2ggaGFzCi0JCQkgICogICAgICRyb3V0aW5nX2NsYXNzIG1vcmUgdHEgcG9pbnRzKQotCQkJICAqLwotCQkJaWYgKHRxX2F2ZyA+IG1heF90cSkgewotCQkJCWlmIChjdXJyX2d3KQotCQkJCQliYXRhZHZfZ3dfbm9kZV9wdXQoY3Vycl9ndyk7Ci0JCQkJY3Vycl9ndyA9IGd3X25vZGU7Ci0JCQkJa3JlZl9nZXQoJmN1cnJfZ3ctPnJlZmNvdW50KTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHRxX2F2ZyA+IG1heF90cSkKLQkJCW1heF90cSA9IHRxX2F2ZzsKLQotCQlpZiAodG1wX2d3X2ZhY3RvciA+IG1heF9nd19mYWN0b3IpCi0JCQltYXhfZ3dfZmFjdG9yID0gdG1wX2d3X2ZhY3RvcjsKLQotCQliYXRhZHZfZ3dfbm9kZV9wdXQoZ3dfbm9kZSk7Ci0KLW5leHQ6Ci0JCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChyb3V0ZXIpOwotCQlpZiAocm91dGVyX2lmaW5mbykKLQkJCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KHJvdXRlcl9pZmluZm8pOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiBjdXJyX2d3OwotfQotCiAvKioKICAqIGJhdGFkdl9nd19jaGVja19jbGllbnRfc3RvcCAtIGNoZWNrIGlmIGNsaWVudCBtb2RlIGhhcyBiZWVuIHN3aXRjaGVkIG9mZgogICogQGJhdF9wcml2OiB0aGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCkBAIC0yODcsMTIgKzIxMywxOSBAQAogCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmd3Lm1vZGUpICE9IEJBVEFEVl9HV19NT0RFX0NMSUVOVCkKIAkJZ290byBvdXQ7CiAKKwlpZiAoIWJhdF9wcml2LT5hbGdvX29wcy0+Z3cuZ2V0X2Jlc3RfZ3dfbm9kZSkKKwkJZ290byBvdXQ7CisKIAljdXJyX2d3ID0gYmF0YWR2X2d3X2dldF9zZWxlY3RlZF9nd19ub2RlKGJhdF9wcml2KTsKIAogCWlmICghYmF0YWR2X2F0b21pY19kZWNfbm90X3plcm8oJmJhdF9wcml2LT5ndy5yZXNlbGVjdCkgJiYgY3Vycl9ndykKIAkJZ290byBvdXQ7CiAKLQluZXh0X2d3ID0gYmF0YWR2X2d3X2dldF9iZXN0X2d3X25vZGUoYmF0X3ByaXYpOworCS8qIGlmIGd3LnJlc2VsZWN0IGlzIHNldCB0byAxIGl0IG1lYW5zIHRoYXQgYSBwcmV2aW91cyBjYWxsIHRvCisJICogZ3cuaXNfZWxpZ2libGUoKSBzYWlkIHRoYXQgd2UgaGF2ZSBhIG5ldyBiZXN0IEdXLCB0aGVyZWZvcmUgaXQgY2FuCisJICogbm93IGJlIHBpY2tlZCBmcm9tIHRoZSBsaXN0IGFuZCBzZWxlY3RlZAorCSAqLworCW5leHRfZ3cgPSBiYXRfcHJpdi0+YWxnb19vcHMtPmd3LmdldF9iZXN0X2d3X25vZGUoYmF0X3ByaXYpOwogCiAJaWYgKGN1cnJfZ3cgPT0gbmV4dF9ndykKIAkJZ290byBvdXQ7CkBAIC0zNjAsNzAgKzI5MywzMSBAQAogdm9pZCBiYXRhZHZfZ3dfY2hlY2tfZWxlY3Rpb24oc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKIAkJCSAgICAgIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUpCiB7Ci0Jc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKnJvdXRlcl9vcmlnX3RxID0gTlVMTDsKLQlzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqcm91dGVyX2d3X3RxID0gTlVMTDsKIAlzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqY3Vycl9nd19vcmlnOwotCXN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqcm91dGVyX2d3ID0gTlVMTDsKLQlzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKnJvdXRlcl9vcmlnID0gTlVMTDsKLQl1OCBnd190cV9hdmcsIG9yaWdfdHFfYXZnOworCisJLyogYWJvcnQgaW1tZWRpYXRlbHkgaWYgdGhlIHJvdXRpbmcgYWxnb3JpdGhtIGRvZXMgbm90IHN1cHBvcnQgZ2F0ZXdheQorCSAqIGVsZWN0aW9uCisJICovCisJaWYgKCFiYXRfcHJpdi0+YWxnb19vcHMtPmd3LmlzX2VsaWdpYmxlKQorCQlyZXR1cm47CiAKIAljdXJyX2d3X29yaWcgPSBiYXRhZHZfZ3dfZ2V0X3NlbGVjdGVkX29yaWcoYmF0X3ByaXYpOwogCWlmICghY3Vycl9nd19vcmlnKQogCQlnb3RvIHJlc2VsZWN0OwogCi0Jcm91dGVyX2d3ID0gYmF0YWR2X29yaWdfcm91dGVyX2dldChjdXJyX2d3X29yaWcsIEJBVEFEVl9JRl9ERUZBVUxUKTsKLQlpZiAoIXJvdXRlcl9ndykKLQkJZ290byByZXNlbGVjdDsKLQotCXJvdXRlcl9nd190cSA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KHJvdXRlcl9ndywKLQkJCQkJICAgICAgIEJBVEFEVl9JRl9ERUZBVUxUKTsKLQlpZiAoIXJvdXRlcl9nd190cSkKLQkJZ290byByZXNlbGVjdDsKLQogCS8qIHRoaXMgbm9kZSBhbHJlYWR5IGlzIHRoZSBnYXRld2F5ICovCiAJaWYgKGN1cnJfZ3dfb3JpZyA9PSBvcmlnX25vZGUpCiAJCWdvdG8gb3V0OwogCi0Jcm91dGVyX29yaWcgPSBiYXRhZHZfb3JpZ19yb3V0ZXJfZ2V0KG9yaWdfbm9kZSwgQkFUQURWX0lGX0RFRkFVTFQpOwotCWlmICghcm91dGVyX29yaWcpCisJaWYgKCFiYXRfcHJpdi0+YWxnb19vcHMtPmd3LmlzX2VsaWdpYmxlKGJhdF9wcml2LCBjdXJyX2d3X29yaWcsCisJCQkJCQlvcmlnX25vZGUpKQogCQlnb3RvIG91dDsKIAotCXJvdXRlcl9vcmlnX3RxID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQocm91dGVyX29yaWcsCi0JCQkJCQkgQkFUQURWX0lGX0RFRkFVTFQpOwotCWlmICghcm91dGVyX29yaWdfdHEpCi0JCWdvdG8gb3V0OwotCi0JZ3dfdHFfYXZnID0gcm91dGVyX2d3X3RxLT5iYXRfaXYudHFfYXZnOwotCW9yaWdfdHFfYXZnID0gcm91dGVyX29yaWdfdHEtPmJhdF9pdi50cV9hdmc7Ci0KLQkvKiB0aGUgVFEgdmFsdWUgaGFzIHRvIGJlIGJldHRlciAqLwotCWlmIChvcmlnX3RxX2F2ZyA8IGd3X3RxX2F2ZykKLQkJZ290byBvdXQ7Ci0KLQkvKiBpZiB0aGUgcm91dGluZyBjbGFzcyBpcyBncmVhdGVyIHRoYW4gMyB0aGUgdmFsdWUgdGVsbHMgdXMgaG93IG11Y2gKLQkgKiBncmVhdGVyIHRoZSBUUSB2YWx1ZSBvZiB0aGUgbmV3IGdhdGV3YXkgbXVzdCBiZQotCSAqLwotCWlmICgoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ndy5zZWxfY2xhc3MpID4gMykgJiYKLQkgICAgKG9yaWdfdHFfYXZnIC0gZ3dfdHFfYXZnIDwgYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ndy5zZWxfY2xhc3MpKSkKLQkJZ290byBvdXQ7Ci0KLQliYXRhZHZfZGJnKEJBVEFEVl9EQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJICAgIlJlc3RhcnRpbmcgZ2F0ZXdheSBzZWxlY3Rpb246IGJldHRlciBnYXRld2F5IGZvdW5kICh0cSBjdXJyOiAlaSwgdHEgbmV3OiAlaSlcbiIsCi0JCSAgIGd3X3RxX2F2Zywgb3JpZ190cV9hdmcpOwotCiByZXNlbGVjdDoKIAliYXRhZHZfZ3dfcmVzZWxlY3QoYmF0X3ByaXYpOwogb3V0OgogCWlmIChjdXJyX2d3X29yaWcpCiAJCWJhdGFkdl9vcmlnX25vZGVfcHV0KGN1cnJfZ3dfb3JpZyk7Ci0JaWYgKHJvdXRlcl9ndykKLQkJYmF0YWR2X25laWdoX25vZGVfcHV0KHJvdXRlcl9ndyk7Ci0JaWYgKHJvdXRlcl9vcmlnKQotCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQocm91dGVyX29yaWcpOwotCWlmIChyb3V0ZXJfZ3dfdHEpCi0JCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KHJvdXRlcl9nd190cSk7Ci0JaWYgKHJvdXRlcl9vcmlnX3RxKQotCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChyb3V0ZXJfb3JpZ190cSk7CiB9CiAKIC8qKgpAQCAtNDQ1LDE0ICszMzksMTUgQEAKIAlpZiAoIWd3X25vZGUpCiAJCXJldHVybjsKIAotCWtyZWZfZ2V0KCZvcmlnX25vZGUtPnJlZmNvdW50KTsKKwlrcmVmX2luaXQoJmd3X25vZGUtPnJlZmNvdW50KTsKIAlJTklUX0hMSVNUX05PREUoJmd3X25vZGUtPmxpc3QpOworCWtyZWZfZ2V0KCZvcmlnX25vZGUtPnJlZmNvdW50KTsKIAlnd19ub2RlLT5vcmlnX25vZGUgPSBvcmlnX25vZGU7CiAJZ3dfbm9kZS0+YmFuZHdpZHRoX2Rvd24gPSBudG9obChnYXRld2F5LT5iYW5kd2lkdGhfZG93bik7CiAJZ3dfbm9kZS0+YmFuZHdpZHRoX3VwID0gbnRvaGwoZ2F0ZXdheS0+YmFuZHdpZHRoX3VwKTsKLQlrcmVmX2luaXQoJmd3X25vZGUtPnJlZmNvdW50KTsKIAogCXNwaW5fbG9ja19iaCgmYmF0X3ByaXYtPmd3Lmxpc3RfbG9jayk7CisJa3JlZl9nZXQoJmd3X25vZGUtPnJlZmNvdW50KTsKIAlobGlzdF9hZGRfaGVhZF9yY3UoJmd3X25vZGUtPmxpc3QsICZiYXRfcHJpdi0+Z3cubGlzdCk7CiAJc3Bpbl91bmxvY2tfYmgoJmJhdF9wcml2LT5ndy5saXN0X2xvY2spOwogCkBAIC00NjMsNiArMzU4LDkgQEAKIAkJICAgbnRvaGwoZ2F0ZXdheS0+YmFuZHdpZHRoX2Rvd24pICUgMTAsCiAJCSAgIG50b2hsKGdhdGV3YXktPmJhbmR3aWR0aF91cCkgLyAxMCwKIAkJICAgbnRvaGwoZ2F0ZXdheS0+YmFuZHdpZHRoX3VwKSAlIDEwKTsKKworCS8qIGRvbid0IHJldHVybiByZWZlcmVuY2UgdG8gbmV3IGd3X25vZGUgKi8KKwliYXRhZHZfZ3dfbm9kZV9wdXQoZ3dfbm9kZSk7CiB9CiAKIC8qKgpAQCAtNDcyLDkgKzM3MCw4IEBACiAgKgogICogUmV0dXJuOiBnYXRld2F5IG5vZGUgaWYgZm91bmQgb3IgTlVMTCBvdGhlcndpc2UuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKgotYmF0YWR2X2d3X25vZGVfZ2V0KHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCi0JCSAgIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUpCitzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmJhdGFkdl9nd19ub2RlX2dldChzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJCQkgIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUpCiB7CiAJc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlX3RtcCwgKmd3X25vZGUgPSBOVUxMOwogCkBAIC01ODUsODEgKzQ4Miw4NyBAQAogCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+Z3cubGlzdF9sb2NrKTsKIH0KIAotLyogZmFpbHMgaWYgb3JpZ19ub2RlIGhhcyBubyByb3V0ZXIgKi8KLXN0YXRpYyBpbnQgYmF0YWR2X3dyaXRlX2J1ZmZlcl90ZXh0KHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCi0JCQkJICAgIHN0cnVjdCBzZXFfZmlsZSAqc2VxLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGUpCi17Ci0Jc3RydWN0IGJhdGFkdl9nd19ub2RlICpjdXJyX2d3OwotCXN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqcm91dGVyOwotCXN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpyb3V0ZXJfaWZpbmZvID0gTlVMTDsKLQlpbnQgcmV0ID0gLTE7Ci0KLQlyb3V0ZXIgPSBiYXRhZHZfb3JpZ19yb3V0ZXJfZ2V0KGd3X25vZGUtPm9yaWdfbm9kZSwgQkFUQURWX0lGX0RFRkFVTFQpOwotCWlmICghcm91dGVyKQotCQlnb3RvIG91dDsKLQotCXJvdXRlcl9pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChyb3V0ZXIsIEJBVEFEVl9JRl9ERUZBVUxUKTsKLQlpZiAoIXJvdXRlcl9pZmluZm8pCi0JCWdvdG8gb3V0OwotCi0JY3Vycl9ndyA9IGJhdGFkdl9nd19nZXRfc2VsZWN0ZWRfZ3dfbm9kZShiYXRfcHJpdik7Ci0KLQlzZXFfcHJpbnRmKHNlcSwgIiVzICVwTSAoJTNpKSAlcE0gWyUxMHNdOiAldS4ldS8ldS4ldSBNQml0XG4iLAotCQkgICAoY3Vycl9ndyA9PSBnd19ub2RlID8gIj0+IiA6ICIgICIpLAotCQkgICBnd19ub2RlLT5vcmlnX25vZGUtPm9yaWcsCi0JCSAgIHJvdXRlcl9pZmluZm8tPmJhdF9pdi50cV9hdmcsIHJvdXRlci0+YWRkciwKLQkJICAgcm91dGVyLT5pZl9pbmNvbWluZy0+bmV0X2Rldi0+bmFtZSwKLQkJICAgZ3dfbm9kZS0+YmFuZHdpZHRoX2Rvd24gLyAxMCwKLQkJICAgZ3dfbm9kZS0+YmFuZHdpZHRoX2Rvd24gJSAxMCwKLQkJICAgZ3dfbm9kZS0+YmFuZHdpZHRoX3VwIC8gMTAsCi0JCSAgIGd3X25vZGUtPmJhbmR3aWR0aF91cCAlIDEwKTsKLQlyZXQgPSBzZXFfaGFzX292ZXJmbG93ZWQoc2VxKSA/IC0xIDogMDsKLQotCWlmIChjdXJyX2d3KQotCQliYXRhZHZfZ3dfbm9kZV9wdXQoY3Vycl9ndyk7Ci1vdXQ6Ci0JaWYgKHJvdXRlcl9pZmluZm8pCi0JCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KHJvdXRlcl9pZmluZm8pOwotCWlmIChyb3V0ZXIpCi0JCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChyb3V0ZXIpOwotCXJldHVybiByZXQ7Ci19Ci0KKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiBpbnQgYmF0YWR2X2d3X2NsaWVudF9zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopc2VxLT5wcml2YXRlOwogCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIAlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKnByaW1hcnlfaWY7Ci0Jc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlOwotCWludCBnd19jb3VudCA9IDA7CiAKIAlwcmltYXJ5X2lmID0gYmF0YWR2X3NlcV9wcmludF90ZXh0X3ByaW1hcnlfaWZfZ2V0KHNlcSk7CiAJaWYgKCFwcmltYXJ5X2lmKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIDA7CiAKLQlzZXFfcHJpbnRmKHNlcSwKLQkJICAgIiAgICAgIEdhdGV3YXkgICAgICAoIy8yNTUpICAgICAgICAgICBOZXh0aG9wIFtvdXRnb2luZ0lGXTogYWR2ZXJ0aXNlZCB1cGxpbmsgYmFuZHdpZHRoIC4uLiBbQi5BLlQuTS5BLk4uIGFkdiAlcywgTWFpbklGL01BQzogJXMvJXBNICglcyldXG4iLAorCXNlcV9wcmludGYoc2VxLCAiW0IuQS5ULk0uQS5OLiBhZHYgJXMsIE1haW5JRi9NQUM6ICVzLyVwTSAoJXMgJXMpXVxuIiwKIAkJICAgQkFUQURWX1NPVVJDRV9WRVJTSU9OLCBwcmltYXJ5X2lmLT5uZXRfZGV2LT5uYW1lLAotCQkgICBwcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgbmV0X2Rldi0+bmFtZSk7CisJCSAgIHByaW1hcnlfaWYtPm5ldF9kZXYtPmRldl9hZGRyLCBuZXRfZGV2LT5uYW1lLAorCQkgICBiYXRfcHJpdi0+YWxnb19vcHMtPm5hbWUpOwogCi0JcmN1X3JlYWRfbG9jaygpOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShnd19ub2RlLCAmYmF0X3ByaXYtPmd3Lmxpc3QsIGxpc3QpIHsKLQkJLyogZmFpbHMgaWYgb3JpZ19ub2RlIGhhcyBubyByb3V0ZXIgKi8KLQkJaWYgKGJhdGFkdl93cml0ZV9idWZmZXJfdGV4dChiYXRfcHJpdiwgc2VxLCBnd19ub2RlKSA8IDApCi0JCQljb250aW51ZTsKKwliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKIAotCQlnd19jb3VudCsrOworCWlmICghYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5wcmludCkgeworCQlzZXFfcHV0cyhzZXEsCisJCQkgIk5vIHByaW50aW5nIGZ1bmN0aW9uIGZvciB0aGlzIHJvdXRpbmcgcHJvdG9jb2xcbiIpOworCQlyZXR1cm4gMDsKIAl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlpZiAoZ3dfY291bnQgPT0gMCkKLQkJc2VxX3B1dHMoc2VxLCAiTm8gZ2F0ZXdheXMgaW4gcmFuZ2UgLi4uXG4iKTsKKwliYXRfcHJpdi0+YWxnb19vcHMtPmd3LnByaW50KGJhdF9wcml2LCBzZXEpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoqCisgKiBiYXRhZHZfZ3dfZHVtcCAtIER1bXAgZ2F0ZXdheXMgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBjYjogQ29udHJvbCBibG9jayBjb250YWluaW5nIGFkZGl0aW9uYWwgb3B0aW9ucworICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgbGVuZ3RoIG9mIG1lc3NhZ2UKKyAqLworaW50IGJhdGFkdl9nd19kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKnByaW1hcnlfaWYgPSBOVUxMOworCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KGNiLT5za2ItPnNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZTsKKwlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2OworCWludCBpZmluZGV4OworCWludCByZXQ7CisKKwlpZmluZGV4ID0gYmF0YWR2X25ldGxpbmtfZ2V0X2lmaW5kZXgoY2ItPm5saCwKKwkJCQkJICAgICBCQVRBRFZfQVRUUl9NRVNIX0lGSU5ERVgpOworCWlmICghaWZpbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzb2Z0X2lmYWNlID0gZGV2X2dldF9ieV9pbmRleChuZXQsIGlmaW5kZXgpOworCWlmICghc29mdF9pZmFjZSB8fCAhYmF0YWR2X3NvZnRpZl9pc192YWxpZChzb2Z0X2lmYWNlKSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwliYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfaWZhY2UpOworCisJcHJpbWFyeV9pZiA9IGJhdGFkdl9wcmltYXJ5X2lmX2dldF9zZWxlY3RlZChiYXRfcHJpdik7CisJaWYgKCFwcmltYXJ5X2lmIHx8IHByaW1hcnlfaWYtPmlmX3N0YXR1cyAhPSBCQVRBRFZfSUZfQUNUSVZFKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5kdW1wKSB7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwliYXRfcHJpdi0+YWxnb19vcHMtPmd3LmR1bXAobXNnLCBjYiwgYmF0X3ByaXYpOworCisJcmV0ID0gbXNnLT5sZW47CiAKIG91dDoKIAlpZiAocHJpbWFyeV9pZikKIAkJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7Ci0JcmV0dXJuIDA7CisJaWYgKHNvZnRfaWZhY2UpCisJCWRldl9wdXQoc29mdF9pZmFjZSk7CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmggYi9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NsaWVudC5oCmluZGV4IDU4MmRkOGMuLjg1OTE2NmQgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmgKKysrIGIvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jbGllbnQuaApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIHN0cnVjdCBiYXRhZHZfdHZsdl9nYXRld2F5X2RhdGE7CitzdHJ1Y3QgbmV0bGlua19jYWxsYmFjazsKIHN0cnVjdCBzZXFfZmlsZTsKIHN0cnVjdCBza19idWZmOwogCkBAIC0zOSwxMCArNDAsMTYgQEAKIHZvaWQgYmF0YWR2X2d3X25vZGVfZGVsZXRlKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCiAJCQkgICBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlKTsKIHZvaWQgYmF0YWR2X2d3X25vZGVfZnJlZShzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2KTsKK3ZvaWQgYmF0YWR2X2d3X25vZGVfcHV0KHN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZSk7CitzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKgorYmF0YWR2X2d3X2dldF9zZWxlY3RlZF9nd19ub2RlKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYpOwogaW50IGJhdGFkdl9nd19jbGllbnRfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CitpbnQgYmF0YWR2X2d3X2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKIGJvb2wgYmF0YWR2X2d3X291dF9vZl9yYW5nZShzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGVudW0gYmF0YWR2X2RoY3BfcmVjaXBpZW50CiBiYXRhZHZfZ3dfZGhjcF9yZWNpcGllbnRfZ2V0KHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCAqaGVhZGVyX2xlbiwKIAkJCSAgICAgdTggKmNoYWRkcik7CitzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmJhdGFkdl9nd19ub2RlX2dldChzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJCQkgIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUpOwogCiAjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0dBVEVXQVlfQ0xJRU5UX0hfICovCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NvbW1vbi5jIGIvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jb21tb24uYwppbmRleCBkN2JjNmE4Li4yMTE4NDgxIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NvbW1vbi5jCisrKyBiL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY29tbW9uLmMKQEAgLTI0MSwxMCArMjQxLDkgQEAKIAogCWJhdGFkdl9nd19ub2RlX3VwZGF0ZShiYXRfcHJpdiwgb3JpZywgJmdhdGV3YXkpOwogCi0JLyogcmVzdGFydCBnYXRld2F5IHNlbGVjdGlvbiBpZiBmYXN0IG9yIGxhdGUgc3dpdGNoaW5nIHdhcyBlbmFibGVkICovCisJLyogcmVzdGFydCBnYXRld2F5IHNlbGVjdGlvbiAqLwogCWlmICgoZ2F0ZXdheS5iYW5kd2lkdGhfZG93biAhPSAwKSAmJgotCSAgICAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ndy5tb2RlKSA9PSBCQVRBRFZfR1dfTU9ERV9DTElFTlQpICYmCi0JICAgIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmd3LnNlbF9jbGFzcykgPiAyKSkKKwkgICAgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3cubW9kZSkgPT0gQkFUQURWX0dXX01PREVfQ0xJRU5UKSkKIAkJYmF0YWR2X2d3X2NoZWNrX2VsZWN0aW9uKGJhdF9wcml2LCBvcmlnKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuYyBiL25ldC9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmMKaW5kZXggMWY5MDgwOC4uMDhjZTM2MSAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuYworKysgYi9uZXQvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5jCkBAIC0zNSw3ICszNSw4IEBACiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KKyNpbmNsdWRlIDxuZXQvcnRuZXRsaW5rLmg+CiAKICNpbmNsdWRlICJiYXRfdi5oIgogI2luY2x1ZGUgImJyaWRnZV9sb29wX2F2b2lkYW5jZS5oIgpAQCAtODUsMjUgKzg2LDU1IEBACiB9CiAKIC8qKgorICogYmF0YWR2X2dldGxpbmtfbmV0IC0gcmV0dXJuIGxpbmsgbmV0IG5hbWVzcGFjZSAob2YgdXNlIGZhbGxiYWNrKQorICogQG5ldGRldjogbmV0X2RldmljZSB0byBjaGVjaworICogQGZhbGxiYWNrX25ldDogcmV0dXJuIGluIGNhc2UgZ2V0X2xpbmtfbmV0IGlzIG5vdCBhdmFpbGFibGUgZm9yIEBuZXRkZXYKKyAqCisgKiBSZXR1cm46IHJlc3VsdCBvZiBydG5sX2xpbmtfb3BzLT5nZXRfbGlua19uZXQgb3IgQGZhbGxiYWNrX25ldAorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldCAqYmF0YWR2X2dldGxpbmtfbmV0KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0ICpmYWxsYmFja19uZXQpCit7CisJaWYgKCFuZXRkZXYtPnJ0bmxfbGlua19vcHMpCisJCXJldHVybiBmYWxsYmFja19uZXQ7CisKKwlpZiAoIW5ldGRldi0+cnRubF9saW5rX29wcy0+Z2V0X2xpbmtfbmV0KQorCQlyZXR1cm4gZmFsbGJhY2tfbmV0OworCisJcmV0dXJuIG5ldGRldi0+cnRubF9saW5rX29wcy0+Z2V0X2xpbmtfbmV0KG5ldGRldik7Cit9CisKKy8qKgogICogYmF0YWR2X211dHVhbF9wYXJlbnRzIC0gY2hlY2sgaWYgdHdvIGRldmljZXMgYXJlIGVhY2ggb3RoZXJzIHBhcmVudAotICogQGRldjE6IDFzdCBuZXRfZGV2aWNlCi0gKiBAZGV2MjogMm5kIG5ldF9kZXZpY2UKKyAqIEBkZXYxOiAxc3QgbmV0IGRldgorICogQG5ldDE6IDFzdCBkZXZpY2VzIG5ldG5zCisgKiBAZGV2MjogMm5kIG5ldCBkZXYKKyAqIEBuZXQyOiAybmQgZGV2aWNlcyBuZXRucwogICoKICAqIHZldGggZGV2aWNlcyBjb21lIGluIHBhaXJzIGFuZCBlYWNoIGlzIHRoZSBwYXJlbnQgb2YgdGhlIG90aGVyIQogICoKICAqIFJldHVybjogdHJ1ZSBpZiB0aGUgZGV2aWNlcyBhcmUgZWFjaCBvdGhlcnMgcGFyZW50LCBvdGhlcndpc2UgZmFsc2UKICAqLwogc3RhdGljIGJvb2wgYmF0YWR2X211dHVhbF9wYXJlbnRzKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYxLAotCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldjIpCisJCQkJICBjb25zdCBzdHJ1Y3QgbmV0ICpuZXQxLAorCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldjIsCisJCQkJICBjb25zdCBzdHJ1Y3QgbmV0ICpuZXQyKQogewogCWludCBkZXYxX3BhcmVudF9pZmxpbmsgPSBkZXZfZ2V0X2lmbGluayhkZXYxKTsKIAlpbnQgZGV2Ml9wYXJlbnRfaWZsaW5rID0gZGV2X2dldF9pZmxpbmsoZGV2Mik7CisJY29uc3Qgc3RydWN0IG5ldCAqZGV2MV9wYXJlbnRfbmV0OworCWNvbnN0IHN0cnVjdCBuZXQgKmRldjJfcGFyZW50X25ldDsKKworCWRldjFfcGFyZW50X25ldCA9IGJhdGFkdl9nZXRsaW5rX25ldChkZXYxLCBuZXQxKTsKKwlkZXYyX3BhcmVudF9uZXQgPSBiYXRhZHZfZ2V0bGlua19uZXQoZGV2MiwgbmV0Mik7CiAKIAlpZiAoIWRldjFfcGFyZW50X2lmbGluayB8fCAhZGV2Ml9wYXJlbnRfaWZsaW5rKQogCQlyZXR1cm4gZmFsc2U7CiAKIAlyZXR1cm4gKGRldjFfcGFyZW50X2lmbGluayA9PSBkZXYyLT5pZmluZGV4KSAmJgotCSAgICAgICAoZGV2Ml9wYXJlbnRfaWZsaW5rID09IGRldjEtPmlmaW5kZXgpOworCSAgICAgICAoZGV2Ml9wYXJlbnRfaWZsaW5rID09IGRldjEtPmlmaW5kZXgpICYmCisJICAgICAgIG5ldF9lcShkZXYxX3BhcmVudF9uZXQsIG5ldDIpICYmCisJICAgICAgIG5ldF9lcShkZXYyX3BhcmVudF9uZXQsIG5ldDEpOwogfQogCiAvKioKQEAgLTEyMSw4ICsxNTIsOSBAQAogICovCiBzdGF0aWMgYm9vbCBiYXRhZHZfaXNfb25fYmF0bWFuX2lmYWNlKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpwYXJlbnRfZGV2OwogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQobmV0X2Rldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKnBhcmVudF9kZXY7CisJY29uc3Qgc3RydWN0IG5ldCAqcGFyZW50X25ldDsKIAlib29sIHJldDsKIAogCS8qIGNoZWNrIGlmIHRoaXMgaXMgYSBiYXRtYW4tYWR2IG1lc2ggaW50ZXJmYWNlICovCkBAIC0xMzQsMTMgKzE2NiwxNiBAQAogCSAgICBkZXZfZ2V0X2lmbGluayhuZXRfZGV2KSA9PSBuZXRfZGV2LT5pZmluZGV4KQogCQlyZXR1cm4gZmFsc2U7CiAKKwlwYXJlbnRfbmV0ID0gYmF0YWR2X2dldGxpbmtfbmV0KG5ldF9kZXYsIG5ldCk7CisKIAkvKiByZWN1cnNlIG92ZXIgdGhlIHBhcmVudCBkZXZpY2UgKi8KLQlwYXJlbnRfZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KG5ldCwgZGV2X2dldF9pZmxpbmsobmV0X2RldikpOworCXBhcmVudF9kZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgoKHN0cnVjdCBuZXQgKilwYXJlbnRfbmV0LAorCQkJCQlkZXZfZ2V0X2lmbGluayhuZXRfZGV2KSk7CiAJLyogaWYgd2UgZ290IGEgTlVMTCBwYXJlbnRfZGV2IHRoZXJlIGlzIHNvbWV0aGluZyBicm9rZW4uLiAqLwogCWlmIChXQVJOKCFwYXJlbnRfZGV2LCAiQ2Fubm90IGZpbmQgcGFyZW50IGRldmljZSIpKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAoYmF0YWR2X211dHVhbF9wYXJlbnRzKG5ldF9kZXYsIHBhcmVudF9kZXYpKQorCWlmIChiYXRhZHZfbXV0dWFsX3BhcmVudHMobmV0X2RldiwgbmV0LCBwYXJlbnRfZGV2LCBwYXJlbnRfbmV0KSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJcmV0ID0gYmF0YWR2X2lzX29uX2JhdG1hbl9pZmFjZShwYXJlbnRfZGV2KTsKQEAgLTYyNSwyNSArNjYwLDYgQEAKIAkJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7CiB9CiAKLS8qKgotICogYmF0YWR2X2hhcmRpZl9yZW1vdmVfaW50ZXJmYWNlX2ZpbmlzaCAtIGNsZWFucyB1cCB0aGUgcmVtYWlucyBvZiBhIGhhcmRpZgotICogQHdvcms6IHdvcmsgcXVldWUgaXRlbQotICoKLSAqIEZyZWUgdGhlIHBhcnRzIG9mIHRoZSBoYXJkIGludGVyZmFjZSB3aGljaCBjYW4gbm90IGJlIHJlbW92ZWQgdW5kZXIKLSAqIHJ0bmwgbG9jayAodG8gcHJldmVudCBkZWFkbG9jayBzaXR1YXRpb25zKS4KLSAqLwotc3RhdGljIHZvaWQgYmF0YWR2X2hhcmRpZl9yZW1vdmVfaW50ZXJmYWNlX2ZpbmlzaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkX2lmYWNlOwotCi0JaGFyZF9pZmFjZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UsCi0JCQkJICBjbGVhbnVwX3dvcmspOwotCi0JYmF0YWR2X2RlYnVnZnNfZGVsX2hhcmRpZihoYXJkX2lmYWNlKTsKLQliYXRhZHZfc3lzZnNfZGVsX2hhcmRpZigmaGFyZF9pZmFjZS0+aGFyZGlmX29iaik7Ci0JYmF0YWR2X2hhcmRpZl9wdXQoaGFyZF9pZmFjZSk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKgogYmF0YWR2X2hhcmRpZl9hZGRfaW50ZXJmYWNlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQogewpAQCAtNjc2LDEwICs2OTIsOSBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJmhhcmRfaWZhY2UtPmxpc3QpOwogCUlOSVRfSExJU1RfSEVBRCgmaGFyZF9pZmFjZS0+bmVpZ2hfbGlzdCk7Ci0JSU5JVF9XT1JLKCZoYXJkX2lmYWNlLT5jbGVhbnVwX3dvcmssCi0JCSAgYmF0YWR2X2hhcmRpZl9yZW1vdmVfaW50ZXJmYWNlX2ZpbmlzaCk7CiAKIAlzcGluX2xvY2tfaW5pdCgmaGFyZF9pZmFjZS0+bmVpZ2hfbGlzdF9sb2NrKTsKKwlrcmVmX2luaXQoJmhhcmRfaWZhY2UtPnJlZmNvdW50KTsKIAogCWhhcmRfaWZhY2UtPm51bV9iY2FzdHMgPSBCQVRBRFZfTlVNX0JDQVNUU19ERUZBVUxUOwogCWlmIChiYXRhZHZfaXNfd2lmaV9uZXRkZXYobmV0X2RldikpCkBAIC02ODcsMTEgKzcwMiw4IEBACiAKIAliYXRhZHZfdl9oYXJkaWZfaW5pdChoYXJkX2lmYWNlKTsKIAotCS8qIGV4dHJhIHJlZmVyZW5jZSBmb3IgcmV0dXJuICovCi0Ja3JlZl9pbml0KCZoYXJkX2lmYWNlLT5yZWZjb3VudCk7Ci0Ja3JlZl9nZXQoJmhhcmRfaWZhY2UtPnJlZmNvdW50KTsKLQogCWJhdGFkdl9jaGVja19rbm93bl9tYWNfYWRkcihoYXJkX2lmYWNlLT5uZXRfZGV2KTsKKwlrcmVmX2dldCgmaGFyZF9pZmFjZS0+cmVmY291bnQpOwogCWxpc3RfYWRkX3RhaWxfcmN1KCZoYXJkX2lmYWNlLT5saXN0LCAmYmF0YWR2X2hhcmRpZl9saXN0KTsKIAogCXJldHVybiBoYXJkX2lmYWNlOwpAQCAtNzEzLDEzICs3MjUsMTUgQEAKIAkvKiBmaXJzdCBkZWFjdGl2YXRlIGludGVyZmFjZSAqLwogCWlmIChoYXJkX2lmYWNlLT5pZl9zdGF0dXMgIT0gQkFUQURWX0lGX05PVF9JTl9VU0UpCiAJCWJhdGFkdl9oYXJkaWZfZGlzYWJsZV9pbnRlcmZhY2UoaGFyZF9pZmFjZSwKLQkJCQkJCUJBVEFEVl9JRl9DTEVBTlVQX0FVVE8pOworCQkJCQkJQkFUQURWX0lGX0NMRUFOVVBfS0VFUCk7CiAKIAlpZiAoaGFyZF9pZmFjZS0+aWZfc3RhdHVzICE9IEJBVEFEVl9JRl9OT1RfSU5fVVNFKQogCQlyZXR1cm47CiAKIAloYXJkX2lmYWNlLT5pZl9zdGF0dXMgPSBCQVRBRFZfSUZfVE9fQkVfUkVNT1ZFRDsKLQlxdWV1ZV93b3JrKGJhdGFkdl9ldmVudF93b3JrcXVldWUsICZoYXJkX2lmYWNlLT5jbGVhbnVwX3dvcmspOworCWJhdGFkdl9kZWJ1Z2ZzX2RlbF9oYXJkaWYoaGFyZF9pZmFjZSk7CisJYmF0YWR2X3N5c2ZzX2RlbF9oYXJkaWYoJmhhcmRfaWZhY2UtPmhhcmRpZl9vYmopOworCWJhdGFkdl9oYXJkaWZfcHV0KGhhcmRfaWZhY2UpOwogfQogCiB2b2lkIGJhdGFkdl9oYXJkaWZfcmVtb3ZlX2ludGVyZmFjZXModm9pZCkKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2ljbXBfc29ja2V0LmggYi9uZXQvYmF0bWFuLWFkdi9pY21wX3NvY2tldC5oCmluZGV4IDYxOGQ1ZGUuLmU0NGE3ZGEgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2ljbXBfc29ja2V0LmgKKysrIGIvbmV0L2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuaApAQCAtMjYsOSArMjYsMjUgQEAKIAogI2RlZmluZSBCQVRBRFZfSUNNUF9TT0NLRVQgInNvY2tldCIKIAotdm9pZCBiYXRhZHZfc29ja2V0X2luaXQodm9pZCk7CiBpbnQgYmF0YWR2X3NvY2tldF9zZXR1cChzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2KTsKKworI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKKwordm9pZCBiYXRhZHZfc29ja2V0X2luaXQodm9pZCk7CiB2b2lkIGJhdGFkdl9zb2NrZXRfcmVjZWl2ZV9wYWNrZXQoc3RydWN0IGJhdGFkdl9pY21wX2hlYWRlciAqaWNtcGgsCiAJCQkJICBzaXplX3QgaWNtcF9sZW4pOwogCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmF0YWR2X3NvY2tldF9pbml0KHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYmF0YWR2X3NvY2tldF9yZWNlaXZlX3BhY2tldChzdHJ1Y3QgYmF0YWR2X2ljbXBfaGVhZGVyICppY21waCwgc2l6ZV90IGljbXBfbGVuKQoreworfQorCisjZW5kaWYKKwogI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9JQ01QX1NPQ0tFVF9IXyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvbWFpbi5jIGIvbmV0L2JhdG1hbi1hZHYvbWFpbi5jCmluZGV4IGZlNGM1ZTIuLjJjMDE3YWIgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L21haW4uYworKysgYi9uZXQvYmF0bWFuLWFkdi9tYWluLmMKQEAgLTgyLDYgKzgyLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGJhdGFkdl9pbml0KHZvaWQpCiB7CisJaW50IHJldDsKKworCXJldCA9IGJhdGFkdl90dF9jYWNoZV9pbml0KCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKIAlJTklUX0xJU1RfSEVBRCgmYmF0YWR2X2hhcmRpZl9saXN0KTsKIAliYXRhZHZfYWxnb19pbml0KCk7CiAKQEAgLTkzLDkgKzk5LDggQEAKIAliYXRhZHZfdHBfbWV0ZXJfaW5pdCgpOwogCiAJYmF0YWR2X2V2ZW50X3dvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJiYXRfZXZlbnRzIik7Ci0KIAlpZiAoIWJhdGFkdl9ldmVudF93b3JrcXVldWUpCi0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIGVycl9jcmVhdGVfd3E7CiAKIAliYXRhZHZfc29ja2V0X2luaXQoKTsKIAliYXRhZHZfZGVidWdmc19pbml0KCk7CkBAIC0xMDgsNiArMTEzLDExIEBACiAJCUJBVEFEVl9TT1VSQ0VfVkVSU0lPTiwgQkFUQURWX0NPTVBBVF9WRVJTSU9OKTsKIAogCXJldHVybiAwOworCitlcnJfY3JlYXRlX3dxOgorCWJhdGFkdl90dF9jYWNoZV9kZXN0cm95KCk7CisKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGJhdGFkdl9leGl0KHZvaWQpCkBAIC0xMjMsNiArMTMzLDggQEAKIAliYXRhZHZfZXZlbnRfd29ya3F1ZXVlID0gTlVMTDsKIAogCXJjdV9iYXJyaWVyKCk7CisKKwliYXRhZHZfdHRfY2FjaGVfZGVzdHJveSgpOwogfQogCiBpbnQgYmF0YWR2X21lc2hfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSkKQEAgLTI3MCw2ICsyODIsNyBAQAogCXJldHVybiBpc19teV9tYWM7CiB9CiAKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiAvKioKICAqIGJhdGFkdl9zZXFfcHJpbnRfdGV4dF9wcmltYXJ5X2lmX2dldCAtIGNhbGxlZCBmcm9tIGRlYnVnZnMgdGFibGUgcHJpbnRpbmcKICAqICBmdW5jdGlvbiB0aGF0IHJlcXVpcmVzIHRoZSBwcmltYXJ5IGludGVyZmFjZQpAQCAtMzA1LDYgKzMxOCw3IEBACiBvdXQ6CiAJcmV0dXJuIHByaW1hcnlfaWY7CiB9CisjZW5kaWYKIAogLyoqCiAgKiBiYXRhZHZfbWF4X2hlYWRlcl9sZW4gLSBjYWxjdWxhdGUgbWF4aW11bSBlbmNhcHN1bGF0aW9uIG92ZXJoZWFkIGZvciBhCkBAIC02MzgsMyArNjUyLDQgQEAKIE1PRFVMRV9ERVNDUklQVElPTihCQVRBRFZfRFJJVkVSX0RFU0MpOwogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoQkFUQURWX0RSSVZFUl9ERVZJQ0UpOwogTU9EVUxFX1ZFUlNJT04oQkFUQURWX1NPVVJDRV9WRVJTSU9OKTsKK01PRFVMRV9BTElBU19SVE5MX0xJTksoImJhdGFkdiIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvbWFpbi5oIGIvbmV0L2JhdG1hbi1hZHYvbWFpbi5oCmluZGV4IDA2YTg2MDguLjA5YWYyMWUgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L21haW4uaAorKysgYi9uZXQvYmF0bWFuLWFkdi9tYWluLmgKQEAgLTI0LDcgKzI0LDcgQEAKICNkZWZpbmUgQkFUQURWX0RSSVZFUl9ERVZJQ0UgImJhdG1hbi1hZHYiCiAKICNpZm5kZWYgQkFUQURWX1NPVVJDRV9WRVJTSU9OCi0jZGVmaW5lIEJBVEFEVl9TT1VSQ0VfVkVSU0lPTiAiMjAxNi4zIgorI2RlZmluZSBCQVRBRFZfU09VUkNFX1ZFUlNJT04gIjIwMTYuNCIKICNlbmRpZgogCiAvKiBCLkEuVC5NLkEuTi4gcGFyYW1ldGVycyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvbXVsdGljYXN0LmMgYi9uZXQvYmF0bWFuLWFkdi9tdWx0aWNhc3QuYwppbmRleCBjYzkxNTA3Li4xMzY2MWY0IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9tdWx0aWNhc3QuYworKysgYi9uZXQvYmF0bWFuLWFkdi9tdWx0aWNhc3QuYwpAQCAtNTI4LDcgKzUyOCw3IEBACiAJfQogCiAJcmV0dXJuICEobWNhc3RfZGF0YS5mbGFncyAmCi0JCSAoQkFUQURWX01DQVNUX1dBTlRfQUxMX0lQVjQgKyBCQVRBRFZfTUNBU1RfV0FOVF9BTExfSVBWNikpOworCQkgKEJBVEFEVl9NQ0FTVF9XQU5UX0FMTF9JUFY0IHwgQkFUQURWX01DQVNUX1dBTlRfQUxMX0lQVjYpKTsKIH0KIAogLyoqCkBAIC0xMTM0LDYgKzExMzQsNyBAQAogCQkJCSAgICAgQkFUQURWX1RWTFZfSEFORExFUl9PR01fQ0lGTk9URk5EKTsKIH0KIAorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIC8qKgogICogYmF0YWR2X21jYXN0X2ZsYWdzX3ByaW50X2hlYWRlciAtIHByaW50IG93biBtY2FzdCBmbGFncyB0byBkZWJ1Z2ZzIHRhYmxlCiAgKiBAYmF0X3ByaXY6IHRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KQEAgLTEyMzQsNiArMTIzNSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgogCiAvKioKICAqIGJhdGFkdl9tY2FzdF9mcmVlIC0gZnJlZSB0aGUgbXVsdGljYXN0IG9wdGltaXphdGlvbnMgc3RydWN0dXJlcwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvbmV0bGluay5jIGIvbmV0L2JhdG1hbi1hZHYvbmV0bGluay5jCmluZGV4IDIzMWY4ZWEuLjY0Y2I2YWMgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L25ldGxpbmsuYworKysgYi9uZXQvYmF0bWFuLWFkdi9uZXRsaW5rLmMKQEAgLTE4LDYgKzE4LDggQEAKICNpbmNsdWRlICJuZXRsaW5rLmgiCiAjaW5jbHVkZSAibWFpbi5oIgogCisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZ2VuZXRsaW5rLmg+CkBAIC0yNiwyNCArMjgsMzMgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CisjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPHVhcGkvbGludXgvYmF0bWFuX2Fkdi5oPgogCisjaW5jbHVkZSAiYmF0X2FsZ28uaCIKKyNpbmNsdWRlICJicmlkZ2VfbG9vcF9hdm9pZGFuY2UuaCIKKyNpbmNsdWRlICJnYXRld2F5X2NsaWVudC5oIgogI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAib3JpZ2luYXRvci5oIgorI2luY2x1ZGUgInBhY2tldC5oIgogI2luY2x1ZGUgInNvZnQtaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAidHBfbWV0ZXIuaCIKKyNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgogCi1zdHJ1Y3Qgc2tfYnVmZjsKLQotc3RhdGljIHN0cnVjdCBnZW5sX2ZhbWlseSBiYXRhZHZfbmV0bGlua19mYW1pbHkgPSB7CitzdHJ1Y3QgZ2VubF9mYW1pbHkgYmF0YWR2X25ldGxpbmtfZmFtaWx5ID0gewogCS5pZCA9IEdFTkxfSURfR0VORVJBVEUsCiAJLmhkcnNpemUgPSAwLAogCS5uYW1lID0gQkFUQURWX05MX05BTUUsCiAJLnZlcnNpb24gPSAxLAogCS5tYXhhdHRyID0gQkFUQURWX0FUVFJfTUFYLAorCS5uZXRuc29rID0gdHJ1ZSwKIH07CiAKIC8qIG11bHRpY2FzdCBncm91cHMgKi8KQEAgLTUxLDExICs2MiwxMSBAQAogCUJBVEFEVl9OTF9NQ0dSUF9UUE1FVEVSLAogfTsKIAotc3RhdGljIHN0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCBiYXRhZHZfbmV0bGlua19tY2dycHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2VubF9tdWx0aWNhc3RfZ3JvdXAgYmF0YWR2X25ldGxpbmtfbWNncnBzW10gPSB7CiAJW0JBVEFEVl9OTF9NQ0dSUF9UUE1FVEVSXSA9IHsgLm5hbWUgPSBCQVRBRFZfTkxfTUNBU1RfR1JPVVBfVFBNRVRFUiB9LAogfTsKIAotc3RhdGljIHN0cnVjdCBubGFfcG9saWN5IGJhdGFkdl9uZXRsaW5rX3BvbGljeVtOVU1fQkFUQURWX0FUVFJdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IGJhdGFkdl9uZXRsaW5rX3BvbGljeVtOVU1fQkFUQURWX0FUVFJdID0gewogCVtCQVRBRFZfQVRUUl9WRVJTSU9OXQkJPSB7IC50eXBlID0gTkxBX1NUUklORyB9LAogCVtCQVRBRFZfQVRUUl9BTEdPX05BTUVdCQk9IHsgLnR5cGUgPSBOTEFfU1RSSU5HIH0sCiAJW0JBVEFEVl9BVFRSX01FU0hfSUZJTkRFWF0JPSB7IC50eXBlID0gTkxBX1UzMiB9LApAQCAtNjksOSArODAsNDQgQEAKIAlbQkFUQURWX0FUVFJfVFBNRVRFUl9URVNUX1RJTUVdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKIAlbQkFUQURWX0FUVFJfVFBNRVRFUl9CWVRFU10JPSB7IC50eXBlID0gTkxBX1U2NCB9LAogCVtCQVRBRFZfQVRUUl9UUE1FVEVSX0NPT0tJRV0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtCQVRBRFZfQVRUUl9BQ1RJVkVdCQk9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorCVtCQVRBRFZfQVRUUl9UVF9BRERSRVNTXQk9IHsgLmxlbiA9IEVUSF9BTEVOIH0sCisJW0JBVEFEVl9BVFRSX1RUX1RUVk5dCQk9IHsgLnR5cGUgPSBOTEFfVTggfSwKKwlbQkFUQURWX0FUVFJfVFRfTEFTVF9UVFZOXQk9IHsgLnR5cGUgPSBOTEFfVTggfSwKKwlbQkFUQURWX0FUVFJfVFRfQ1JDMzJdCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW0JBVEFEVl9BVFRSX1RUX1ZJRF0JCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKKwlbQkFUQURWX0FUVFJfVFRfRkxBR1NdCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW0JBVEFEVl9BVFRSX0ZMQUdfQkVTVF0JCT0geyAudHlwZSA9IE5MQV9GTEFHIH0sCisJW0JBVEFEVl9BVFRSX0xBU1RfU0VFTl9NU0VDU10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtCQVRBRFZfQVRUUl9ORUlHSF9BRERSRVNTXQk9IHsgLmxlbiA9IEVUSF9BTEVOIH0sCisJW0JBVEFEVl9BVFRSX1RRXQkJPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW0JBVEFEVl9BVFRSX1RIUk9VR0hQVVRdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbQkFUQURWX0FUVFJfQkFORFdJRFRIX1VQXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW0JBVEFEVl9BVFRSX0JBTkRXSURUSF9ET1dOXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW0JBVEFEVl9BVFRSX1JPVVRFUl0JCT0geyAubGVuID0gRVRIX0FMRU4gfSwKKwlbQkFUQURWX0FUVFJfQkxBX09XTl0JCT0geyAudHlwZSA9IE5MQV9GTEFHIH0sCisJW0JBVEFEVl9BVFRSX0JMQV9BRERSRVNTXQk9IHsgLmxlbiA9IEVUSF9BTEVOIH0sCisJW0JBVEFEVl9BVFRSX0JMQV9WSURdCQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW0JBVEFEVl9BVFRSX0JMQV9CQUNLQk9ORV0JPSB7IC5sZW4gPSBFVEhfQUxFTiB9LAorCVtCQVRBRFZfQVRUUl9CTEFfQ1JDXQkJPSB7IC50eXBlID0gTkxBX1UxNiB9LAogfTsKIAogLyoqCisgKiBiYXRhZHZfbmV0bGlua19nZXRfaWZpbmRleCAtIEV4dHJhY3QgYW4gaW50ZXJmYWNlIGluZGV4IGZyb20gYSBtZXNzYWdlCisgKiBAbmxoOiBNZXNzYWdlIGhlYWRlcgorICogQGF0dHJ0eXBlOiBBdHRyaWJ1dGUgd2hpY2ggaG9sZHMgYW4gaW50ZXJmYWNlIGluZGV4CisgKgorICogUmV0dXJuOiBpbnRlcmZhY2UgaW5kZXgsIG9yIDAuCisgKi8KK2ludAorYmF0YWR2X25ldGxpbmtfZ2V0X2lmaW5kZXgoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsIGludCBhdHRydHlwZSkKK3sKKwlzdHJ1Y3QgbmxhdHRyICphdHRyID0gbmxtc2dfZmluZF9hdHRyKG5saCwgR0VOTF9IRFJMRU4sIGF0dHJ0eXBlKTsKKworCXJldHVybiBhdHRyID8gbmxhX2dldF91MzIoYXR0cikgOiAwOworfQorCisvKioKICAqIGJhdGFkdl9uZXRsaW5rX21lc2hfaW5mb19wdXQgLSBmaWxsIGluIGdlbmVyaWMgaW5mb3JtYXRpb24gYWJvdXQgbWVzaAogICogIGludGVyZmFjZQogICogQG1zZzogbmV0bGluayBtZXNzYWdlIHRvIGJlIHNlbnQgYmFjawpAQCAtOTMsOSArMTM5LDE3IEBACiAJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfTUVTSF9JRklOREVYLCBzb2Z0X2lmYWNlLT5pZmluZGV4KSB8fAogCSAgICBubGFfcHV0X3N0cmluZyhtc2csIEJBVEFEVl9BVFRSX01FU0hfSUZOQU1FLCBzb2Z0X2lmYWNlLT5uYW1lKSB8fAogCSAgICBubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfTUVTSF9BRERSRVNTLCBFVEhfQUxFTiwKLQkJICAgIHNvZnRfaWZhY2UtPmRldl9hZGRyKSkKKwkJICAgIHNvZnRfaWZhY2UtPmRldl9hZGRyKSB8fAorCSAgICBubGFfcHV0X3U4KG1zZywgQkFUQURWX0FUVFJfVFRfVFRWTiwKKwkJICAgICAgICh1OClhdG9taWNfcmVhZCgmYmF0X3ByaXYtPnR0LnZuKSkpCiAJCWdvdG8gb3V0OwogCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfQkxBCisJaWYgKG5sYV9wdXRfdTE2KG1zZywgQkFUQURWX0FUVFJfQkxBX0NSQywKKwkJCW50b2hzKGJhdF9wcml2LT5ibGEuY2xhaW1fZGVzdC5ncm91cCkpKQorCQlnb3RvIG91dDsKKyNlbmRpZgorCiAJcHJpbWFyeV9pZiA9IGJhdGFkdl9wcmltYXJ5X2lmX2dldF9zZWxlY3RlZChiYXRfcHJpdik7CiAJaWYgKHByaW1hcnlfaWYgJiYgcHJpbWFyeV9pZi0+aWZfc3RhdHVzID09IEJBVEFEVl9JRl9BQ1RJVkUpIHsKIAkJaGFyZF9pZmFjZSA9IHByaW1hcnlfaWYtPm5ldF9kZXY7CkBAIC0zODAsNiArNDM0LDEwNiBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qKgorICogYmF0YWR2X25ldGxpbmtfZHVtcF9oYXJkaWZfZW50cnkgLSBEdW1wIG9uZSBoYXJkIGludGVyZmFjZSBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAaGFyZF9pZmFjZTogSGFyZCBpbnRlcmZhY2UgdG8gZHVtcAorICoKKyAqIFJldHVybjogZXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl9uZXRsaW5rX2R1bXBfaGFyZGlmX2VudHJ5KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkJIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZF9pZmFjZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IGhhcmRfaWZhY2UtPm5ldF9kZXY7CisJdm9pZCAqaGRyOworCisJaGRyID0gZ2VubG1zZ19wdXQobXNnLCBwb3J0aWQsIHNlcSwgJmJhdGFkdl9uZXRsaW5rX2ZhbWlseSwgTkxNX0ZfTVVMVEksCisJCQkgIEJBVEFEVl9DTURfR0VUX0hBUkRJRlMpOworCWlmICghaGRyKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJaWYgKG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfSEFSRF9JRklOREVYLAorCQkJbmV0X2Rldi0+aWZpbmRleCkgfHwKKwkgICAgbmxhX3B1dF9zdHJpbmcobXNnLCBCQVRBRFZfQVRUUl9IQVJEX0lGTkFNRSwKKwkJCSAgIG5ldF9kZXYtPm5hbWUpIHx8CisJICAgIG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9IQVJEX0FERFJFU1MsIEVUSF9BTEVOLAorCQkgICAgbmV0X2Rldi0+ZGV2X2FkZHIpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWlmIChoYXJkX2lmYWNlLT5pZl9zdGF0dXMgPT0gQkFUQURWX0lGX0FDVElWRSkgeworCQlpZiAobmxhX3B1dF9mbGFnKG1zZywgQkFUQURWX0FUVFJfQUNUSVZFKSkKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCX0KKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKwlyZXR1cm4gMDsKKworIG5sYV9wdXRfZmFpbHVyZToKKwlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworLyoqCisgKiBiYXRhZHZfbmV0bGlua19kdW1wX2hhcmRpZnMgLSBEdW1wIGFsbCBoYXJkIGludGVyZmFjZSBpbnRvIGEgbWVzc2FnZXMKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBjYjogUGFyYW1ldGVycyBmcm9tIHF1ZXJ5CisgKgorICogUmV0dXJuOiBlcnJvciBjb2RlLCBvciBsZW5ndGggb2YgcmVwbHkgbWVzc2FnZSBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl9uZXRsaW5rX2R1bXBfaGFyZGlmcyhzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoY2ItPnNrYi0+c2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlOworCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZF9pZmFjZTsKKwlpbnQgaWZpbmRleDsKKwlpbnQgcG9ydGlkID0gTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQ7CisJaW50IHNlcSA9IGNiLT5ubGgtPm5sbXNnX3NlcTsKKwlpbnQgc2tpcCA9IGNiLT5hcmdzWzBdOworCWludCBpID0gMDsKKworCWlmaW5kZXggPSBiYXRhZHZfbmV0bGlua19nZXRfaWZpbmRleChjYi0+bmxoLAorCQkJCQkgICAgIEJBVEFEVl9BVFRSX01FU0hfSUZJTkRFWCk7CisJaWYgKCFpZmluZGV4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNvZnRfaWZhY2UgPSBkZXZfZ2V0X2J5X2luZGV4KG5ldCwgaWZpbmRleCk7CisJaWYgKCFzb2Z0X2lmYWNlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghYmF0YWR2X3NvZnRpZl9pc192YWxpZChzb2Z0X2lmYWNlKSkgeworCQlkZXZfcHV0KHNvZnRfaWZhY2UpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShoYXJkX2lmYWNlLCAmYmF0YWR2X2hhcmRpZl9saXN0LCBsaXN0KSB7CisJCWlmIChoYXJkX2lmYWNlLT5zb2Z0X2lmYWNlICE9IHNvZnRfaWZhY2UpCisJCQljb250aW51ZTsKKworCQlpZiAoaSsrIDwgc2tpcCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChiYXRhZHZfbmV0bGlua19kdW1wX2hhcmRpZl9lbnRyeShtc2csIHBvcnRpZCwgc2VxLAorCQkJCQkJICAgICBoYXJkX2lmYWNlKSkgeworCQkJaS0tOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWRldl9wdXQoc29mdF9pZmFjZSk7CisKKwljYi0+YXJnc1swXSA9IGk7CisKKwlyZXR1cm4gbXNnLT5sZW47Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZ2VubF9vcHMgYmF0YWR2X25ldGxpbmtfb3BzW10gPSB7CiAJewogCQkuY21kID0gQkFUQURWX0NNRF9HRVRfTUVTSF9JTkZPLApAQCAtMzk5LDYgKzU1Myw2MSBAQAogCQkucG9saWN5ID0gYmF0YWR2X25ldGxpbmtfcG9saWN5LAogCQkuZG9pdCA9IGJhdGFkdl9uZXRsaW5rX3RwX21ldGVyX2NhbmNlbCwKIAl9LAorCXsKKwkJLmNtZCA9IEJBVEFEVl9DTURfR0VUX1JPVVRJTkdfQUxHT1MsCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeSA9IGJhdGFkdl9uZXRsaW5rX3BvbGljeSwKKwkJLmR1bXBpdCA9IGJhdGFkdl9hbGdvX2R1bXAsCisJfSwKKwl7CisJCS5jbWQgPSBCQVRBRFZfQ01EX0dFVF9IQVJESUZTLAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJCS5wb2xpY3kgPSBiYXRhZHZfbmV0bGlua19wb2xpY3ksCisJCS5kdW1waXQgPSBiYXRhZHZfbmV0bGlua19kdW1wX2hhcmRpZnMsCisJfSwKKwl7CisJCS5jbWQgPSBCQVRBRFZfQ01EX0dFVF9UUkFOU1RBQkxFX0xPQ0FMLAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJCS5wb2xpY3kgPSBiYXRhZHZfbmV0bGlua19wb2xpY3ksCisJCS5kdW1waXQgPSBiYXRhZHZfdHRfbG9jYWxfZHVtcCwKKwl9LAorCXsKKwkJLmNtZCA9IEJBVEFEVl9DTURfR0VUX1RSQU5TVEFCTEVfR0xPQkFMLAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJCS5wb2xpY3kgPSBiYXRhZHZfbmV0bGlua19wb2xpY3ksCisJCS5kdW1waXQgPSBiYXRhZHZfdHRfZ2xvYmFsX2R1bXAsCisJfSwKKwl7CisJCS5jbWQgPSBCQVRBRFZfQ01EX0dFVF9PUklHSU5BVE9SUywKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkucG9saWN5ID0gYmF0YWR2X25ldGxpbmtfcG9saWN5LAorCQkuZHVtcGl0ID0gYmF0YWR2X29yaWdfZHVtcCwKKwl9LAorCXsKKwkJLmNtZCA9IEJBVEFEVl9DTURfR0VUX05FSUdIQk9SUywKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkucG9saWN5ID0gYmF0YWR2X25ldGxpbmtfcG9saWN5LAorCQkuZHVtcGl0ID0gYmF0YWR2X2hhcmRpZl9uZWlnaF9kdW1wLAorCX0sCisJeworCQkuY21kID0gQkFUQURWX0NNRF9HRVRfR0FURVdBWVMsCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeSA9IGJhdGFkdl9uZXRsaW5rX3BvbGljeSwKKwkJLmR1bXBpdCA9IGJhdGFkdl9nd19kdW1wLAorCX0sCisJeworCQkuY21kID0gQkFUQURWX0NNRF9HRVRfQkxBX0NMQUlNLAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJCS5wb2xpY3kgPSBiYXRhZHZfbmV0bGlua19wb2xpY3ksCisJCS5kdW1waXQgPSBiYXRhZHZfYmxhX2NsYWltX2R1bXAsCisJfSwKKwl7CisJCS5jbWQgPSBCQVRBRFZfQ01EX0dFVF9CTEFfQkFDS0JPTkUsCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeSA9IGJhdGFkdl9uZXRsaW5rX3BvbGljeSwKKwkJLmR1bXBpdCA9IGJhdGFkdl9ibGFfYmFja2JvbmVfZHVtcCwKKwl9LAorCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L25ldGxpbmsuaCBiL25ldC9iYXRtYW4tYWR2L25ldGxpbmsuaAppbmRleCA5NDU2NTNhLi41MmViMTYyIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9uZXRsaW5rLmgKKysrIGIvbmV0L2JhdG1hbi1hZHYvbmV0bGluay5oCkBAIC0yMSwxMiArMjEsMTggQEAKICNpbmNsdWRlICJtYWluLmgiCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKworc3RydWN0IG5sbXNnaGRyOwogCiB2b2lkIGJhdGFkdl9uZXRsaW5rX3JlZ2lzdGVyKHZvaWQpOwogdm9pZCBiYXRhZHZfbmV0bGlua191bnJlZ2lzdGVyKHZvaWQpOworaW50IGJhdGFkdl9uZXRsaW5rX2dldF9pZmluZGV4KGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLCBpbnQgYXR0cnR5cGUpOwogCiBpbnQgYmF0YWR2X25ldGxpbmtfdHBtZXRlcl9ub3RpZnkoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwgY29uc3QgdTggKmRzdCwKIAkJCQkgIHU4IHJlc3VsdCwgdTMyIHRlc3RfdGltZSwgdTY0IHRvdGFsX2J5dGVzLAogCQkJCSAgdTMyIGNvb2tpZSk7CiAKK2V4dGVybiBzdHJ1Y3QgZ2VubF9mYW1pbHkgYmF0YWR2X25ldGxpbmtfZmFtaWx5OworCiAjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX05FVExJTktfSF8gKi8KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L25ldHdvcmstY29kaW5nLmMgYi9uZXQvYmF0bWFuLWFkdi9uZXR3b3JrLWNvZGluZy5jCmluZGV4IDI5M2VmNGYuLmUzYmFmNjkgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L25ldHdvcmstY29kaW5nLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvbmV0d29yay1jb2RpbmcuYwpAQCAtODU2LDE0ICs4NTYsMTIgQEAKIAlpZiAoIW5jX25vZGUpCiAJCXJldHVybiBOVUxMOwogCi0Ja3JlZl9nZXQoJm9yaWdfbmVpZ2hfbm9kZS0+cmVmY291bnQpOwotCiAJLyogSW5pdGlhbGl6ZSBuY19ub2RlICovCiAJSU5JVF9MSVNUX0hFQUQoJm5jX25vZGUtPmxpc3QpOwotCWV0aGVyX2FkZHJfY29weShuY19ub2RlLT5hZGRyLCBvcmlnX25vZGUtPm9yaWcpOwotCW5jX25vZGUtPm9yaWdfbm9kZSA9IG9yaWdfbmVpZ2hfbm9kZTsKIAlrcmVmX2luaXQoJm5jX25vZGUtPnJlZmNvdW50KTsKLQlrcmVmX2dldCgmbmNfbm9kZS0+cmVmY291bnQpOworCWV0aGVyX2FkZHJfY29weShuY19ub2RlLT5hZGRyLCBvcmlnX25vZGUtPm9yaWcpOworCWtyZWZfZ2V0KCZvcmlnX25laWdoX25vZGUtPnJlZmNvdW50KTsKKwluY19ub2RlLT5vcmlnX25vZGUgPSBvcmlnX25laWdoX25vZGU7CiAKIAkvKiBTZWxlY3QgaW5nb2luZyBvciBvdXRnb2luZyBjb2Rpbmcgbm9kZSAqLwogCWlmIChpbl9jb2RpbmcpIHsKQEAgLTg3OSw2ICs4NzcsNyBAQAogCiAJLyogQWRkIG5jX25vZGUgdG8gb3JpZ19ub2RlICovCiAJc3Bpbl9sb2NrX2JoKGxvY2spOworCWtyZWZfZ2V0KCZuY19ub2RlLT5yZWZjb3VudCk7CiAJbGlzdF9hZGRfdGFpbF9yY3UoJm5jX25vZGUtPmxpc3QsIGxpc3QpOwogCXNwaW5fdW5sb2NrX2JoKGxvY2spOwogCkBAIC05NzksNyArOTc4LDYgQEAKIAlJTklUX0xJU1RfSEVBRCgmbmNfcGF0aC0+cGFja2V0X2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZuY19wYXRoLT5wYWNrZXRfbGlzdF9sb2NrKTsKIAlrcmVmX2luaXQoJm5jX3BhdGgtPnJlZmNvdW50KTsKLQlrcmVmX2dldCgmbmNfcGF0aC0+cmVmY291bnQpOwogCW5jX3BhdGgtPmxhc3RfdmFsaWQgPSBqaWZmaWVzOwogCWV0aGVyX2FkZHJfY29weShuY19wYXRoLT5uZXh0X2hvcCwgZHN0KTsKIAlldGhlcl9hZGRyX2NvcHkobmNfcGF0aC0+cHJldl9ob3AsIHNyYyk7CkBAIC05ODksNiArOTg3LDcgQEAKIAkJICAgbmNfcGF0aC0+bmV4dF9ob3ApOwogCiAJLyogQWRkIG5jX3BhdGggdG8gaGFzaCB0YWJsZSAqLworCWtyZWZfZ2V0KCZuY19wYXRoLT5yZWZjb3VudCk7CiAJaGFzaF9hZGRlZCA9IGJhdGFkdl9oYXNoX2FkZChoYXNoLCBiYXRhZHZfbmNfaGFzaF9jb21wYXJlLAogCQkJCSAgICAgYmF0YWR2X25jX2hhc2hfY2hvb3NlLCAmbmNfcGF0aF9rZXksCiAJCQkJICAgICAmbmNfcGF0aC0+aGFzaF9lbnRyeSk7CkBAIC0xODgyLDYgKzE4ODEsNyBAQAogCWJhdGFkdl9oYXNoX2Rlc3Ryb3koYmF0X3ByaXYtPm5jLmRlY29kaW5nX2hhc2gpOwogfQogCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogLyoqCiAgKiBiYXRhZHZfbmNfbm9kZXNfc2VxX3ByaW50X3RleHQgLSBwcmludCB0aGUgbmMgbm9kZSBpbmZvcm1hdGlvbgogICogQHNlcTogc2VxIGZpbGUgdG8gcHJpbnQgb24KQEAgLTE5ODEsMyArMTk4MSw0IEBACiBvdXQ6CiAJcmV0dXJuIC1FTk9NRU07CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L29yaWdpbmF0b3IuYyBiL25ldC9iYXRtYW4tYWR2L29yaWdpbmF0b3IuYwppbmRleCAzOTQwYjVkLi41ZjNiZmM0IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvb3JpZ2luYXRvci5jCkBAIC0yOCwxMSArMjgsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvYmF0bWFuX2Fkdi5oPgogCiAjaW5jbHVkZSAiYmF0X2FsZ28uaCIKICNpbmNsdWRlICJkaXN0cmlidXRlZC1hcnAtdGFibGUuaCIKQEAgLTQyLDggKzQ2LDEwIEBACiAjaW5jbHVkZSAiaGFzaC5oIgogI2luY2x1ZGUgImxvZy5oIgogI2luY2x1ZGUgIm11bHRpY2FzdC5oIgorI2luY2x1ZGUgIm5ldGxpbmsuaCIKICNpbmNsdWRlICJuZXR3b3JrLWNvZGluZy5oIgogI2luY2x1ZGUgInJvdXRpbmcuaCIKKyNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgogI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCiAKIC8qIGhhc2ggY2xhc3Mga2V5cyAqLwpAQCAtMTI3LDkgKzEzMyw5IEBACiAJCWdvdG8gb3V0OwogCiAJa3JlZl9pbml0KCZ2bGFuLT5yZWZjb3VudCk7Ci0Ja3JlZl9nZXQoJnZsYW4tPnJlZmNvdW50KTsKIAl2bGFuLT52aWQgPSB2aWQ7CiAKKwlrcmVmX2dldCgmdmxhbi0+cmVmY291bnQpOwogCWhsaXN0X2FkZF9oZWFkX3JjdSgmdmxhbi0+bGlzdCwgJm9yaWdfbm9kZS0+dmxhbl9saXN0KTsKIAogb3V0OgpAQCAtMzgwLDYgKzM4Niw3IEBACiAJb3JpZ19pZmluZm8tPmlmX291dGdvaW5nID0gaWZfb3V0Z29pbmc7CiAJSU5JVF9ITElTVF9OT0RFKCZvcmlnX2lmaW5mby0+bGlzdCk7CiAJa3JlZl9pbml0KCZvcmlnX2lmaW5mby0+cmVmY291bnQpOworCiAJa3JlZl9nZXQoJm9yaWdfaWZpbmZvLT5yZWZjb3VudCk7CiAJaGxpc3RfYWRkX2hlYWRfcmN1KCZvcmlnX2lmaW5mby0+bGlzdCwKIAkJCSAgICZvcmlnX25vZGUtPmlmaW5mb19saXN0KTsKQEAgLTQ1Myw5ICs0NjAsOSBAQAogCiAJSU5JVF9ITElTVF9OT0RFKCZuZWlnaF9pZmluZm8tPmxpc3QpOwogCWtyZWZfaW5pdCgmbmVpZ2hfaWZpbmZvLT5yZWZjb3VudCk7Ci0Ja3JlZl9nZXQoJm5laWdoX2lmaW5mby0+cmVmY291bnQpOwogCW5laWdoX2lmaW5mby0+aWZfb3V0Z29pbmcgPSBpZl9vdXRnb2luZzsKIAorCWtyZWZfZ2V0KCZuZWlnaF9pZmluZm8tPnJlZmNvdW50KTsKIAlobGlzdF9hZGRfaGVhZF9yY3UoJm5laWdoX2lmaW5mby0+bGlzdCwgJm5laWdoLT5pZmluZm9fbGlzdCk7CiAKIG91dDoKQEAgLTY0Nyw4ICs2NTQsOCBAQAogCiAJLyogZXh0cmEgcmVmZXJlbmNlIGZvciByZXR1cm4gKi8KIAlrcmVmX2luaXQoJm5laWdoX25vZGUtPnJlZmNvdW50KTsKLQlrcmVmX2dldCgmbmVpZ2hfbm9kZS0+cmVmY291bnQpOwogCisJa3JlZl9nZXQoJm5laWdoX25vZGUtPnJlZmNvdW50KTsKIAlobGlzdF9hZGRfaGVhZF9yY3UoJm5laWdoX25vZGUtPmxpc3QsICZvcmlnX25vZGUtPm5laWdoX2xpc3QpOwogCiAJYmF0YWR2X2RiZyhCQVRBRFZfREJHX0JBVE1BTiwgb3JpZ19ub2RlLT5iYXRfcHJpdiwKQEAgLTY4Niw2ICs2OTMsNyBAQAogCXJldHVybiBiYXRhZHZfbmVpZ2hfbm9kZV9jcmVhdGUob3JpZ19ub2RlLCBoYXJkX2lmYWNlLCBuZWlnaF9hZGRyKTsKIH0KIAorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIC8qKgogICogYmF0YWR2X2hhcmRpZl9uZWlnaF9zZXFfcHJpbnRfdGV4dCAtIHByaW50IHRoZSBzaW5nbGUgaG9wIG5laWdoYm91ciBsaXN0CiAgKiBAc2VxOiBuZWlnaGJvdXIgdGFibGUgc2VxX2ZpbGUgc3RydWN0CkBAIC03MTksNiArNzI3LDg0IEBACiAJYmF0X3ByaXYtPmFsZ29fb3BzLT5uZWlnaC5wcmludChiYXRfcHJpdiwgc2VxKTsKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgorCisvKioKKyAqIGJhdGFkdl9oYXJkaWZfbmVpZ2hfZHVtcCAtIER1bXAgdG8gbmV0bGluayB0aGUgbmVpZ2hib3IgaW5mb3MgZm9yIGEgc3BlY2lmaWMKKyAqICBvdXRnb2luZyBpbnRlcmZhY2UKKyAqIEBtc2c6IG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAY2I6IHBhcmFtZXRlcnMgZm9yIHRoZSBkdW1wCisgKgorICogUmV0dXJuOiAwIG9yIGVycm9yIHZhbHVlCisgKi8KK2ludCBiYXRhZHZfaGFyZGlmX25laWdoX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KGNiLT5za2ItPnNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqaGFyZF9pZmFjZSA9IE5VTEw7CisJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkaWYgPSBCQVRBRFZfSUZfREVGQVVMVDsKKwlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2OworCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqcHJpbWFyeV9pZiA9IE5VTEw7CisJaW50IHJldDsKKwlpbnQgaWZpbmRleCwgaGFyZF9pZmluZGV4OworCisJaWZpbmRleCA9IGJhdGFkdl9uZXRsaW5rX2dldF9pZmluZGV4KGNiLT5ubGgsIEJBVEFEVl9BVFRSX01FU0hfSUZJTkRFWCk7CisJaWYgKCFpZmluZGV4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNvZnRfaWZhY2UgPSBkZXZfZ2V0X2J5X2luZGV4KG5ldCwgaWZpbmRleCk7CisJaWYgKCFzb2Z0X2lmYWNlIHx8ICFiYXRhZHZfc29mdGlmX2lzX3ZhbGlkKHNvZnRfaWZhY2UpKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7CisKKwlwcmltYXJ5X2lmID0gYmF0YWR2X3ByaW1hcnlfaWZfZ2V0X3NlbGVjdGVkKGJhdF9wcml2KTsKKwlpZiAoIXByaW1hcnlfaWYgfHwgcHJpbWFyeV9pZi0+aWZfc3RhdHVzICE9IEJBVEFEVl9JRl9BQ1RJVkUpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJaGFyZF9pZmluZGV4ID0gYmF0YWR2X25ldGxpbmtfZ2V0X2lmaW5kZXgoY2ItPm5saCwKKwkJCQkJCSAgQkFUQURWX0FUVFJfSEFSRF9JRklOREVYKTsKKwlpZiAoaGFyZF9pZmluZGV4KSB7CisJCWhhcmRfaWZhY2UgPSBkZXZfZ2V0X2J5X2luZGV4KG5ldCwgaGFyZF9pZmluZGV4KTsKKwkJaWYgKGhhcmRfaWZhY2UpCisJCQloYXJkaWYgPSBiYXRhZHZfaGFyZGlmX2dldF9ieV9uZXRkZXYoaGFyZF9pZmFjZSk7CisKKwkJaWYgKCFoYXJkaWYpIHsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChoYXJkaWYtPnNvZnRfaWZhY2UgIT0gc29mdF9pZmFjZSkgeworCQkJcmV0ID0gLUVOT0VOVDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKCFiYXRfcHJpdi0+YWxnb19vcHMtPm5laWdoLmR1bXApIHsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KKworCWJhdF9wcml2LT5hbGdvX29wcy0+bmVpZ2guZHVtcChtc2csIGNiLCBiYXRfcHJpdiwgaGFyZGlmKTsKKworCXJldCA9IG1zZy0+bGVuOworCisgb3V0OgorCWlmIChoYXJkaWYpCisJCWJhdGFkdl9oYXJkaWZfcHV0KGhhcmRpZik7CisJaWYgKGhhcmRfaWZhY2UpCisJCWRldl9wdXQoaGFyZF9pZmFjZSk7CisJaWYgKHByaW1hcnlfaWYpCisJCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOworCWlmIChzb2Z0X2lmYWNlKQorCQlkZXZfcHV0KHNvZnRfaWZhY2UpOworCisJcmV0dXJuIHJldDsKK30KIAogLyoqCiAgKiBiYXRhZHZfb3JpZ19pZmluZm9fcmVsZWFzZSAtIHJlbGVhc2Ugb3JpZ19pZmluZm8gZnJvbSBsaXN0cyBhbmQgcXVldWUgZm9yCkBAIC05MDUsNyArOTkxLDYgQEAKIAogCS8qIGV4dHJhIHJlZmVyZW5jZSBmb3IgcmV0dXJuICovCiAJa3JlZl9pbml0KCZvcmlnX25vZGUtPnJlZmNvdW50KTsKLQlrcmVmX2dldCgmb3JpZ19ub2RlLT5yZWZjb3VudCk7CiAKIAlvcmlnX25vZGUtPmJhdF9wcml2ID0gYmF0X3ByaXY7CiAJZXRoZXJfYWRkcl9jb3B5KG9yaWdfbm9kZS0+b3JpZywgYWRkcik7CkBAIC0xMjU2LDYgKzEzNDEsNyBAQAogCV9iYXRhZHZfcHVyZ2Vfb3JpZyhiYXRfcHJpdik7CiB9CiAKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiBpbnQgYmF0YWR2X29yaWdfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKQEAgLTEzMjksNiArMTQxNSw4NCBAQAogCQliYXRhZHZfaGFyZGlmX3B1dChoYXJkX2lmYWNlKTsKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgorCisvKioKKyAqIGJhdGFkdl9vcmlnX2R1bXAgLSBEdW1wIHRvIG5ldGxpbmsgdGhlIG9yaWdpbmF0b3IgaW5mb3MgZm9yIGEgc3BlY2lmaWMKKyAqICBvdXRnb2luZyBpbnRlcmZhY2UKKyAqIEBtc2c6IG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAY2I6IHBhcmFtZXRlcnMgZm9yIHRoZSBkdW1wCisgKgorICogUmV0dXJuOiAwIG9yIGVycm9yIHZhbHVlCisgKi8KK2ludCBiYXRhZHZfb3JpZ19kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChjYi0+c2tiLT5zayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2U7CisJc3RydWN0IG5ldF9kZXZpY2UgKmhhcmRfaWZhY2UgPSBOVUxMOworCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZGlmID0gQkFUQURWX0lGX0RFRkFVTFQ7CisJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdjsKKwlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKnByaW1hcnlfaWYgPSBOVUxMOworCWludCByZXQ7CisJaW50IGlmaW5kZXgsIGhhcmRfaWZpbmRleDsKKworCWlmaW5kZXggPSBiYXRhZHZfbmV0bGlua19nZXRfaWZpbmRleChjYi0+bmxoLCBCQVRBRFZfQVRUUl9NRVNIX0lGSU5ERVgpOworCWlmICghaWZpbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzb2Z0X2lmYWNlID0gZGV2X2dldF9ieV9pbmRleChuZXQsIGlmaW5kZXgpOworCWlmICghc29mdF9pZmFjZSB8fCAhYmF0YWR2X3NvZnRpZl9pc192YWxpZChzb2Z0X2lmYWNlKSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwliYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfaWZhY2UpOworCisJcHJpbWFyeV9pZiA9IGJhdGFkdl9wcmltYXJ5X2lmX2dldF9zZWxlY3RlZChiYXRfcHJpdik7CisJaWYgKCFwcmltYXJ5X2lmIHx8IHByaW1hcnlfaWYtPmlmX3N0YXR1cyAhPSBCQVRBRFZfSUZfQUNUSVZFKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKworCWhhcmRfaWZpbmRleCA9IGJhdGFkdl9uZXRsaW5rX2dldF9pZmluZGV4KGNiLT5ubGgsCisJCQkJCQkgIEJBVEFEVl9BVFRSX0hBUkRfSUZJTkRFWCk7CisJaWYgKGhhcmRfaWZpbmRleCkgeworCQloYXJkX2lmYWNlID0gZGV2X2dldF9ieV9pbmRleChuZXQsIGhhcmRfaWZpbmRleCk7CisJCWlmIChoYXJkX2lmYWNlKQorCQkJaGFyZGlmID0gYmF0YWR2X2hhcmRpZl9nZXRfYnlfbmV0ZGV2KGhhcmRfaWZhY2UpOworCisJCWlmICghaGFyZGlmKSB7CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoaGFyZGlmLT5zb2Z0X2lmYWNlICE9IHNvZnRfaWZhY2UpIHsKKwkJCXJldCA9IC1FTk9FTlQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmICghYmF0X3ByaXYtPmFsZ29fb3BzLT5vcmlnLmR1bXApIHsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KKworCWJhdF9wcml2LT5hbGdvX29wcy0+b3JpZy5kdW1wKG1zZywgY2IsIGJhdF9wcml2LCBoYXJkaWYpOworCisJcmV0ID0gbXNnLT5sZW47CisKKyBvdXQ6CisJaWYgKGhhcmRpZikKKwkJYmF0YWR2X2hhcmRpZl9wdXQoaGFyZGlmKTsKKwlpZiAoaGFyZF9pZmFjZSkKKwkJZGV2X3B1dChoYXJkX2lmYWNlKTsKKwlpZiAocHJpbWFyeV9pZikKKwkJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7CisJaWYgKHNvZnRfaWZhY2UpCisJCWRldl9wdXQoc29mdF9pZmFjZSk7CisKKwlyZXR1cm4gcmV0OworfQogCiBpbnQgYmF0YWR2X29yaWdfaGFzaF9hZGRfaWYoc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkX2lmYWNlLAogCQkJICAgIGludCBtYXhfaWZfbnVtKQpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvb3JpZ2luYXRvci5oIGIvbmV0L2JhdG1hbi1hZHYvb3JpZ2luYXRvci5oCmluZGV4IDU2NjMwNmIuLmViYzU2MTggMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L29yaWdpbmF0b3IuaAorKysgYi9uZXQvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmgKQEAgLTMxLDcgKzMxLDkgQEAKIAogI2luY2x1ZGUgImhhc2guaCIKIAorc3RydWN0IG5ldGxpbmtfY2FsbGJhY2s7CiBzdHJ1Y3Qgc2VxX2ZpbGU7CitzdHJ1Y3Qgc2tfYnVmZjsKIAogYm9vbCBiYXRhZHZfY29tcGFyZV9vcmlnKGNvbnN0IHN0cnVjdCBobGlzdF9ub2RlICpub2RlLCBjb25zdCB2b2lkICpkYXRhMik7CiBpbnQgYmF0YWR2X29yaWdpbmF0b3JfaW5pdChzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2KTsKQEAgLTYxLDYgKzYzLDcgQEAKIAkJCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcpOwogdm9pZCBiYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqbmVpZ2hfaWZpbmZvKTsKIAoraW50IGJhdGFkdl9oYXJkaWZfbmVpZ2hfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwogaW50IGJhdGFkdl9oYXJkaWZfbmVpZ2hfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CiAKIHN0cnVjdCBiYXRhZHZfb3JpZ19pZmluZm8gKgpAQCAtNzIsNiArNzUsNyBAQAogdm9pZCBiYXRhZHZfb3JpZ19pZmluZm9fcHV0KHN0cnVjdCBiYXRhZHZfb3JpZ19pZmluZm8gKm9yaWdfaWZpbmZvKTsKIAogaW50IGJhdGFkdl9vcmlnX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOworaW50IGJhdGFkdl9vcmlnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKIGludCBiYXRhZHZfb3JpZ19oYXJkaWZfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CiBpbnQgYmF0YWR2X29yaWdfaGFzaF9hZGRfaWYoc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkX2lmYWNlLAogCQkJICAgIGludCBtYXhfaWZfbnVtKTsKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L3BhY2tldC5oIGIvbmV0L2JhdG1hbi1hZHYvcGFja2V0LmgKaW5kZXggNmIwMTFmZi4uNmFmYzBiOCAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvcGFja2V0LmgKKysrIGIvbmV0L2JhdG1hbi1hZHYvcGFja2V0LmgKQEAgLTEyOSw0MiArMTI5LDYgQEAKIH07CiAKIC8qKgotICogZW51bSBiYXRhZHZfdHRfY2xpZW50X2ZsYWdzIC0gVFQgY2xpZW50IHNwZWNpZmljIGZsYWdzCi0gKiBAQkFUQURWX1RUX0NMSUVOVF9ERUw6IHRoZSBjbGllbnQgaGFzIHRvIGJlIGRlbGV0ZWQgZnJvbSB0aGUgdGFibGUKLSAqIEBCQVRBRFZfVFRfQ0xJRU5UX1JPQU06IHRoZSBjbGllbnQgcm9hbWVkIHRvL2Zyb20gYW5vdGhlciBub2RlIGFuZCB0aGUgbmV3Ci0gKiAgdXBkYXRlIHRlbGxpbmcgaXRzIG5ldyByZWFsIGxvY2F0aW9uIGhhcyBub3QgYmVlbiByZWNlaXZlZC9zZW50IHlldAotICogQEJBVEFEVl9UVF9DTElFTlRfV0lGSTogdGhpcyBjbGllbnQgaXMgY29ubmVjdGVkIHRocm91Z2ggYSB3aWZpIGludGVyZmFjZS4KLSAqICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgYnkgdGhlICJBUCBJc29sYXRpb24iIGZlYXR1cmUKLSAqIEBCQVRBRFZfVFRfQ0xJRU5UX0lTT0xBOiB0aGlzIGNsaWVudCBpcyBjb25zaWRlcmVkICJpc29sYXRlZCIuIFRoaXMKLSAqICBpbmZvcm1hdGlvbiBpcyB1c2VkIGJ5IHRoZSBFeHRlbmRlZCBJc29sYXRpb24gZmVhdHVyZQotICogQEJBVEFEVl9UVF9DTElFTlRfTk9QVVJHRTogdGhpcyBjbGllbnQgc2hvdWxkIG5ldmVyIGJlIHJlbW92ZWQgZnJvbSB0aGUgdGFibGUKLSAqIEBCQVRBRFZfVFRfQ0xJRU5UX05FVzogdGhpcyBjbGllbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGxvY2FsIHRhYmxlIGJ1dCBoYXMKLSAqICBub3QgYmVlbiBhbm5vdW5jZWQgeWV0Ci0gKiBAQkFUQURWX1RUX0NMSUVOVF9QRU5ESU5HOiB0aGlzIGNsaWVudCBpcyBtYXJrZWQgZm9yIHJlbW92YWwgYnV0IGl0IGlzIGtlcHQKLSAqICBpbiB0aGUgdGFibGUgZm9yIG9uZSBtb3JlIG9yaWdpbmF0b3IgaW50ZXJ2YWwgZm9yIGNvbnNpc3RlbmN5IHB1cnBvc2VzCi0gKiBAQkFUQURWX1RUX0NMSUVOVF9URU1QOiB0aGlzIGdsb2JhbCBjbGllbnQgaGFzIGJlZW4gZGV0ZWN0ZWQgdG8gYmUgcGFydCBvZgotICogIHRoZSBuZXR3b3JrIGJ1dCBubyBubm9kZSBoYXMgYWxyZWFkeSBhbm5vdW5jZWQgaXQKLSAqCi0gKiBCaXRzIGZyb20gMCB0byA3IGFyZSBjYWxsZWQgX3JlbW90ZSBmbGFnc18gYmVjYXVzZSB0aGV5IGFyZSBzZW50IG9uIHRoZSB3aXJlLgotICogQml0cyBmcm9tIDggdG8gMTUgYXJlIGNhbGxlZCBfbG9jYWwgZmxhZ3NfIGJlY2F1c2UgdGhleSBhcmUgdXNlZCBmb3IgbG9jYWwKLSAqIGNvbXB1dGF0aW9ucyBvbmx5LgotICoKLSAqIEJpdHMgZnJvbSA0IHRvIDcgLSBhIHN1YnNldCBvZiByZW1vdGUgZmxhZ3MgLSBhcmUgZW5zdXJlZCB0byBiZSBpbiBzeW5jIHdpdGgKLSAqIHRoZSBvdGhlciBub2RlcyBpbiB0aGUgbmV0d29yay4gVG8gYWNoaWV2ZSB0aGlzIGdvYWwgdGhlc2UgZmxhZ3MgYXJlIGluY2x1ZGVkCi0gKiBpbiB0aGUgVFQgQ1JDIGNvbXB1dGF0aW9uLgotICovCi1lbnVtIGJhdGFkdl90dF9jbGllbnRfZmxhZ3MgewotCUJBVEFEVl9UVF9DTElFTlRfREVMICAgICA9IEJJVCgwKSwKLQlCQVRBRFZfVFRfQ0xJRU5UX1JPQU0gICAgPSBCSVQoMSksCi0JQkFUQURWX1RUX0NMSUVOVF9XSUZJICAgID0gQklUKDQpLAotCUJBVEFEVl9UVF9DTElFTlRfSVNPTEEJID0gQklUKDUpLAotCUJBVEFEVl9UVF9DTElFTlRfTk9QVVJHRSA9IEJJVCg4KSwKLQlCQVRBRFZfVFRfQ0xJRU5UX05FVyAgICAgPSBCSVQoOSksCi0JQkFUQURWX1RUX0NMSUVOVF9QRU5ESU5HID0gQklUKDEwKSwKLQlCQVRBRFZfVFRfQ0xJRU5UX1RFTVAJID0gQklUKDExKSwKLX07Ci0KLS8qKgogICogZW51bSBiYXRhZHZfdmxhbl9mbGFncyAtIGZsYWdzIGZvciB0aGUgZm91ciBNU0Igb2YgYW55IHZsYW4gSUQgZmllbGQKICAqIEBCQVRBRFZfVkxBTl9IQVNfVEFHOiB3aGV0aGVyIHRoZSBmaWVsZCBjb250YWlucyBhIHZhbGlkIHZsYW4gdGFnIG9yIG5vdAogICovCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9yb3V0aW5nLmMgYi9uZXQvYmF0bWFuLWFkdi9yb3V0aW5nLmMKaW5kZXggNzYwMmMwMC4uN2U4ZGM2NCAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvcm91dGluZy5jCisrKyBiL25ldC9iYXRtYW4tYWR2L3JvdXRpbmcuYwpAQCAtNzQsMTEgKzc0LDIzIEBACiAJaWYgKCFvcmlnX2lmaW5mbykKIAkJcmV0dXJuOwogCi0JcmN1X3JlYWRfbG9jaygpOwotCWN1cnJfcm91dGVyID0gcmN1X2RlcmVmZXJlbmNlKG9yaWdfaWZpbmZvLT5yb3V0ZXIpOwotCWlmIChjdXJyX3JvdXRlciAmJiAha3JlZl9nZXRfdW5sZXNzX3plcm8oJmN1cnJfcm91dGVyLT5yZWZjb3VudCkpCi0JCWN1cnJfcm91dGVyID0gTlVMTDsKLQlyY3VfcmVhZF91bmxvY2soKTsKKwlzcGluX2xvY2tfYmgoJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdF9sb2NrKTsKKwkvKiBjdXJyX3JvdXRlciB1c2VkIGVhcmxpZXIgbWF5IG5vdCBiZSB0aGUgY3VycmVudCBvcmlnX2lmaW5mby0+cm91dGVyCisJICogYW55bW9yZSBiZWNhdXNlIGl0IHdhcyBkZXJlZmVyZW5jZWQgb3V0c2lkZSBvZiB0aGUgbmVpZ2hfbGlzdF9sb2NrCisJICogcHJvdGVjdGVkIHJlZ2lvbi4gQWZ0ZXIgdGhlIG5ldyBiZXN0IG5laWdoYm9yIGhhcyByZXBsYWNlIHRoZSBjdXJyZW50CisJICogYmVzdCBuZWlnaGJvciB0aGUgcmVmZXJlbmNlIGNvdW50ZXIgbmVlZHMgdG8gZGVjcmVhc2UuIENvbnNlcXVlbnRseSwKKwkgKiB0aGUgY29kZSBuZWVkcyB0byBlbnN1cmUgdGhlIGN1cnJfcm91dGVyIHZhcmlhYmxlIGNvbnRhaW5zIGEgcG9pbnRlcgorCSAqIHRvIHRoZSByZXBsYWNlZCBiZXN0IG5laWdoYm9yLgorCSAqLworCWN1cnJfcm91dGVyID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChvcmlnX2lmaW5mby0+cm91dGVyLCB0cnVlKTsKKworCS8qIGluY3JlYXNlIHJlZmNvdW50IG9mIG5ldyBiZXN0IG5laWdoYm9yICovCisJaWYgKG5laWdoX25vZGUpCisJCWtyZWZfZ2V0KCZuZWlnaF9ub2RlLT5yZWZjb3VudCk7CisKKwlyY3VfYXNzaWduX3BvaW50ZXIob3JpZ19pZmluZm8tPnJvdXRlciwgbmVpZ2hfbm9kZSk7CisJc3Bpbl91bmxvY2tfYmgoJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdF9sb2NrKTsKKwliYXRhZHZfb3JpZ19pZmluZm9fcHV0KG9yaWdfaWZpbmZvKTsKIAogCS8qIHJvdXRlIGRlbGV0ZWQgKi8KIAlpZiAoKGN1cnJfcm91dGVyKSAmJiAoIW5laWdoX25vZGUpKSB7CkBAIC0xMDAsMjcgKzExMiw2IEBACiAJCQkgICBjdXJyX3JvdXRlci0+YWRkcik7CiAJfQogCi0JaWYgKGN1cnJfcm91dGVyKQotCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQoY3Vycl9yb3V0ZXIpOwotCi0Jc3Bpbl9sb2NrX2JoKCZvcmlnX25vZGUtPm5laWdoX2xpc3RfbG9jayk7Ci0JLyogY3Vycl9yb3V0ZXIgdXNlZCBlYXJsaWVyIG1heSBub3QgYmUgdGhlIGN1cnJlbnQgb3JpZ19pZmluZm8tPnJvdXRlcgotCSAqIGFueW1vcmUgYmVjYXVzZSBpdCB3YXMgZGVyZWZlcmVuY2VkIG91dHNpZGUgb2YgdGhlIG5laWdoX2xpc3RfbG9jawotCSAqIHByb3RlY3RlZCByZWdpb24uIEFmdGVyIHRoZSBuZXcgYmVzdCBuZWlnaGJvciBoYXMgcmVwbGFjZSB0aGUgY3VycmVudAotCSAqIGJlc3QgbmVpZ2hib3IgdGhlIHJlZmVyZW5jZSBjb3VudGVyIG5lZWRzIHRvIGRlY3JlYXNlLiBDb25zZXF1ZW50bHksCi0JICogdGhlIGNvZGUgbmVlZHMgdG8gZW5zdXJlIHRoZSBjdXJyX3JvdXRlciB2YXJpYWJsZSBjb250YWlucyBhIHBvaW50ZXIKLQkgKiB0byB0aGUgcmVwbGFjZWQgYmVzdCBuZWlnaGJvci4KLQkgKi8KLQljdXJyX3JvdXRlciA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQob3JpZ19pZmluZm8tPnJvdXRlciwgdHJ1ZSk7Ci0KLQkvKiBpbmNyZWFzZSByZWZjb3VudCBvZiBuZXcgYmVzdCBuZWlnaGJvciAqLwotCWlmIChuZWlnaF9ub2RlKQotCQlrcmVmX2dldCgmbmVpZ2hfbm9kZS0+cmVmY291bnQpOwotCi0JcmN1X2Fzc2lnbl9wb2ludGVyKG9yaWdfaWZpbmZvLT5yb3V0ZXIsIG5laWdoX25vZGUpOwotCXNwaW5fdW5sb2NrX2JoKCZvcmlnX25vZGUtPm5laWdoX2xpc3RfbG9jayk7Ci0JYmF0YWR2X29yaWdfaWZpbmZvX3B1dChvcmlnX2lmaW5mbyk7Ci0KIAkvKiBkZWNyZWFzZSByZWZjb3VudCBvZiBwcmV2aW91cyBiZXN0IG5laWdoYm9yICovCiAJaWYgKGN1cnJfcm91dGVyKQogCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQoY3Vycl9yb3V0ZXIpOwpAQCAtNDcwLDYgKzQ2MSwyOSBAQAogfQogCiAvKioKKyAqIGJhdGFkdl9sYXN0X2JvbmRpbmdfZ2V0IC0gR2V0IGxhc3RfYm9uZGluZ19jYW5kaWRhdGUgb2Ygb3JpZ19ub2RlCisgKiBAb3JpZ19ub2RlOiBvcmlnaW5hdG9yIG5vZGUgd2hvc2UgbGFzdCBib25kaW5nIGNhbmRpZGF0ZSBzaG91bGQgYmUgcmV0cmlldmVkCisgKgorICogUmV0dXJuOiBsYXN0IGJvbmRpbmcgY2FuZGlkYXRlIG9mIHJvdXRlciBvciBOVUxMIGlmIG5vdCBmb3VuZAorICoKKyAqIFRoZSBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCByZWZjb3VudGVyIGluY3JlYXNlZCBieSAxLgorICovCitzdGF0aWMgc3RydWN0IGJhdGFkdl9vcmlnX2lmaW5mbyAqCitiYXRhZHZfbGFzdF9ib25kaW5nX2dldChzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlKQoreworCXN0cnVjdCBiYXRhZHZfb3JpZ19pZmluZm8gKmxhc3RfYm9uZGluZ19jYW5kaWRhdGU7CisKKwlzcGluX2xvY2tfYmgoJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdF9sb2NrKTsKKwlsYXN0X2JvbmRpbmdfY2FuZGlkYXRlID0gb3JpZ19ub2RlLT5sYXN0X2JvbmRpbmdfY2FuZGlkYXRlOworCisJaWYgKGxhc3RfYm9uZGluZ19jYW5kaWRhdGUpCisJCWtyZWZfZ2V0KCZsYXN0X2JvbmRpbmdfY2FuZGlkYXRlLT5yZWZjb3VudCk7CisJc3Bpbl91bmxvY2tfYmgoJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdF9sb2NrKTsKKworCXJldHVybiBsYXN0X2JvbmRpbmdfY2FuZGlkYXRlOworfQorCisvKioKICAqIGJhdGFkdl9sYXN0X2JvbmRpbmdfcmVwbGFjZSAtIFJlcGxhY2UgbGFzdF9ib25kaW5nX2NhbmRpZGF0ZSBvZiBvcmlnX25vZGUKICAqIEBvcmlnX25vZGU6IG9yaWdpbmF0b3Igbm9kZSB3aG9zZSBib25kaW5nIGNhbmRpZGF0ZXMgc2hvdWxkIGJlIHJlcGxhY2VkCiAgKiBAbmV3X2NhbmRpZGF0ZTogbmV3IGJvbmRpbmcgY2FuZGlkYXRlIG9yIE5VTEwKQEAgLTUzOSw3ICs1NTMsNyBAQAogCSAqIHJvdXRlciAtIG9idmlvdXNseSB0aGVyZSBhcmUgbm8gb3RoZXIgY2FuZGlkYXRlcy4KIAkgKi8KIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbGFzdF9jYW5kaWRhdGUgPSBvcmlnX25vZGUtPmxhc3RfYm9uZGluZ19jYW5kaWRhdGU7CisJbGFzdF9jYW5kaWRhdGUgPSBiYXRhZHZfbGFzdF9ib25kaW5nX2dldChvcmlnX25vZGUpOwogCWlmIChsYXN0X2NhbmRpZGF0ZSkKIAkJbGFzdF9jYW5kX3JvdXRlciA9IHJjdV9kZXJlZmVyZW5jZShsYXN0X2NhbmRpZGF0ZS0+cm91dGVyKTsKIApAQCAtNjMxLDYgKzY0NSw5IEBACiAJCWJhdGFkdl9vcmlnX2lmaW5mb19wdXQobmV4dF9jYW5kaWRhdGUpOwogCX0KIAorCWlmIChsYXN0X2NhbmRpZGF0ZSkKKwkJYmF0YWR2X29yaWdfaWZpbmZvX3B1dChsYXN0X2NhbmRpZGF0ZSk7CisKIAlyZXR1cm4gcm91dGVyOwogfQogCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9zZW5kLmMgYi9uZXQvYmF0bWFuLWFkdi9zZW5kLmMKaW5kZXggNjE5MTE1OS4uOGQ0ZTFmNSAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvc2VuZC5jCisrKyBiL25ldC9iYXRtYW4tYWR2L3NlbmQuYwpAQCAtMzE1LDggKzMxNSw3IEBACiAgKgogICogV3JhcCB0aGUgZ2l2ZW4gc2tiIGludG8gYSBiYXRtYW4tYWR2IHVuaWNhc3Qgb3IgdW5pY2FzdC00YWRkciBoZWFkZXIKICAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIEJBVEFEVl9VTklDQVNUIG9yIEJBVEFEVl9VTklDQVNUXzRBRERSIHdhcyBzdXBwbGllZAotICogYXMgcGFja2V0X3R5cGUuIFRoZW4gc2VuZCB0aGlzIGZyYW1lIHRvIHRoZSBnaXZlbiBvcmlnX25vZGUgYW5kIHJlbGVhc2UgYQotICogcmVmZXJlbmNlIHRvIHRoaXMgb3JpZ19ub2RlLgorICogYXMgcGFja2V0X3R5cGUuIFRoZW4gc2VuZCB0aGlzIGZyYW1lIHRvIHRoZSBnaXZlbiBvcmlnX25vZGUuCiAgKgogICogUmV0dXJuOiBORVRfWE1JVF9EUk9QIGluIGNhc2Ugb2YgZXJyb3Igb3IgTkVUX1hNSVRfU1VDQ0VTUyBvdGhlcndpc2UuCiAgKi8KQEAgLTM3MCw4ICszNjksNiBAQAogCQlyZXQgPSBORVRfWE1JVF9TVUNDRVNTOwogCiBvdXQ6Ci0JaWYgKG9yaWdfbm9kZSkKLQkJYmF0YWR2X29yaWdfbm9kZV9wdXQob3JpZ19ub2RlKTsKIAlpZiAocmV0ID09IE5FVF9YTUlUX0RST1ApCiAJCWtmcmVlX3NrYihza2IpOwogCXJldHVybiByZXQ7CkBAIC00MDMsNiArNDAwLDcgQEAKIAlzdHJ1Y3QgZXRoaGRyICpldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKIAlzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlOwogCXU4ICpzcmMsICpkc3Q7CisJaW50IHJldDsKIAogCXNyYyA9IGV0aGhkci0+aF9zb3VyY2U7CiAJZHN0ID0gZXRoaGRyLT5oX2Rlc3Q7CkBAIC00MTQsOCArNDEyLDEzIEBACiAJfQogCW9yaWdfbm9kZSA9IGJhdGFkdl90cmFuc3RhYmxlX3NlYXJjaChiYXRfcHJpdiwgc3JjLCBkc3QsIHZpZCk7CiAKLQlyZXR1cm4gYmF0YWR2X3NlbmRfc2tiX3VuaWNhc3QoYmF0X3ByaXYsIHNrYiwgcGFja2V0X3R5cGUsCi0JCQkJICAgICAgIHBhY2tldF9zdWJ0eXBlLCBvcmlnX25vZGUsIHZpZCk7CisJcmV0ID0gYmF0YWR2X3NlbmRfc2tiX3VuaWNhc3QoYmF0X3ByaXYsIHNrYiwgcGFja2V0X3R5cGUsCisJCQkJICAgICAgcGFja2V0X3N1YnR5cGUsIG9yaWdfbm9kZSwgdmlkKTsKKworCWlmIChvcmlnX25vZGUpCisJCWJhdGFkdl9vcmlnX25vZGVfcHV0KG9yaWdfbm9kZSk7CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTQzMywxMiArNDM2LDI1IEBACiAJCQkgICB1bnNpZ25lZCBzaG9ydCB2aWQpCiB7CiAJc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZTsKKwlpbnQgcmV0OwogCiAJb3JpZ19ub2RlID0gYmF0YWR2X2d3X2dldF9zZWxlY3RlZF9vcmlnKGJhdF9wcml2KTsKLQlyZXR1cm4gYmF0YWR2X3NlbmRfc2tiX3VuaWNhc3QoYmF0X3ByaXYsIHNrYiwgQkFUQURWX1VOSUNBU1RfNEFERFIsCi0JCQkJICAgICAgIEJBVEFEVl9QX0RBVEEsIG9yaWdfbm9kZSwgdmlkKTsKKwlyZXQgPSBiYXRhZHZfc2VuZF9za2JfdW5pY2FzdChiYXRfcHJpdiwgc2tiLCBCQVRBRFZfVU5JQ0FTVF80QUREUiwKKwkJCQkgICAgICBCQVRBRFZfUF9EQVRBLCBvcmlnX25vZGUsIHZpZCk7CisKKwlpZiAob3JpZ19ub2RlKQorCQliYXRhZHZfb3JpZ19ub2RlX3B1dChvcmlnX25vZGUpOworCisJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiBiYXRhZHZfZm9yd19wYWNrZXRfZnJlZSAtIGZyZWUgYSBmb3J3YXJkaW5nIHBhY2tldAorICogQGZvcndfcGFja2V0OiBUaGUgcGFja2V0IHRvIGZyZWUKKyAqCisgKiBUaGlzIGZyZWVzIGEgZm9yd2FyZGluZyBwYWNrZXQgYW5kIHJlbGVhc2VzIGFueSByZXNvdXJjZXMgaXQgbWlnaHQKKyAqIGhhdmUgY2xhaW1lZC4KKyAqLwogdm9pZCBiYXRhZHZfZm9yd19wYWNrZXRfZnJlZShzdHJ1Y3QgYmF0YWR2X2ZvcndfcGFja2V0ICpmb3J3X3BhY2tldCkKIHsKIAlrZnJlZV9za2IoZm9yd19wYWNrZXQtPnNrYik7CkBAIC00NDYsOSArNDYyLDczIEBACiAJCWJhdGFkdl9oYXJkaWZfcHV0KGZvcndfcGFja2V0LT5pZl9pbmNvbWluZyk7CiAJaWYgKGZvcndfcGFja2V0LT5pZl9vdXRnb2luZykKIAkJYmF0YWR2X2hhcmRpZl9wdXQoZm9yd19wYWNrZXQtPmlmX291dGdvaW5nKTsKKwlpZiAoZm9yd19wYWNrZXQtPnF1ZXVlX2xlZnQpCisJCWF0b21pY19pbmMoZm9yd19wYWNrZXQtPnF1ZXVlX2xlZnQpOwogCWtmcmVlKGZvcndfcGFja2V0KTsKIH0KIAorLyoqCisgKiBiYXRhZHZfZm9yd19wYWNrZXRfYWxsb2MgLSBhbGxvY2F0ZSBhIGZvcndhcmRpbmcgcGFja2V0CisgKiBAaWZfaW5jb21pbmc6IFRoZSAob3B0aW9uYWwpIGlmX2luY29taW5nIHRvIGJlIGdyYWJiZWQKKyAqIEBpZl9vdXRnb2luZzogVGhlIChvcHRpb25hbCkgaWZfb3V0Z29pbmcgdG8gYmUgZ3JhYmJlZAorICogQHF1ZXVlX2xlZnQ6IFRoZSAob3B0aW9uYWwpIHF1ZXVlIGNvdW50ZXIgdG8gZGVjcmVhc2UKKyAqIEBiYXRfcHJpdjogVGhlIGJhdF9wcml2IGZvciB0aGUgbWVzaCBvZiB0aGlzIGZvcndfcGFja2V0CisgKgorICogQWxsb2NhdGVzIGEgZm9yd2FyZGluZyBwYWNrZXQgYW5kIHRyaWVzIHRvIGdldCBhIHJlZmVyZW5jZSB0byB0aGUKKyAqIChvcHRpb25hbCkgaWZfaW5jb21pbmcsIGlmX291dGdvaW5nIGFuZCBxdWV1ZV9sZWZ0LiBJZiBxdWV1ZV9sZWZ0CisgKiBpcyBOVUxMIHRoZW4gYmF0X3ByaXYgaXMgb3B0aW9uYWwsIHRvby4KKyAqCisgKiBSZXR1cm46IEFuIGFsbG9jYXRlZCBmb3J3YXJkaW5nIHBhY2tldCBvbiBzdWNjZXNzLCBOVUxMIG90aGVyd2lzZS4KKyAqLworc3RydWN0IGJhdGFkdl9mb3J3X3BhY2tldCAqCitiYXRhZHZfZm9yd19wYWNrZXRfYWxsb2Moc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9pbmNvbWluZywKKwkJCSBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nLAorCQkJIGF0b21pY190ICpxdWV1ZV9sZWZ0LAorCQkJIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYpCit7CisJc3RydWN0IGJhdGFkdl9mb3J3X3BhY2tldCAqZm9yd19wYWNrZXQ7CisJY29uc3QgY2hhciAqcW5hbWU7CisKKwlpZiAocXVldWVfbGVmdCAmJiAhYmF0YWR2X2F0b21pY19kZWNfbm90X3plcm8ocXVldWVfbGVmdCkpIHsKKwkJcW5hbWUgPSAidW5rbm93biI7CisKKwkJaWYgKHF1ZXVlX2xlZnQgPT0gJmJhdF9wcml2LT5iY2FzdF9xdWV1ZV9sZWZ0KQorCQkJcW5hbWUgPSAiYmNhc3QiOworCisJCWlmIChxdWV1ZV9sZWZ0ID09ICZiYXRfcHJpdi0+YmF0bWFuX3F1ZXVlX2xlZnQpCisJCQlxbmFtZSA9ICJiYXRtYW4iOworCisJCWJhdGFkdl9kYmcoQkFUQURWX0RCR19CQVRNQU4sIGJhdF9wcml2LAorCQkJICAgIiVzIHF1ZXVlIGlzIGZ1bGxcbiIsIHFuYW1lKTsKKworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmb3J3X3BhY2tldCA9IGttYWxsb2Moc2l6ZW9mKCpmb3J3X3BhY2tldCksIEdGUF9BVE9NSUMpOworCWlmICghZm9yd19wYWNrZXQpCisJCWdvdG8gZXJyOworCisJaWYgKGlmX2luY29taW5nKQorCQlrcmVmX2dldCgmaWZfaW5jb21pbmctPnJlZmNvdW50KTsKKworCWlmIChpZl9vdXRnb2luZykKKwkJa3JlZl9nZXQoJmlmX291dGdvaW5nLT5yZWZjb3VudCk7CisKKwlmb3J3X3BhY2tldC0+c2tiID0gTlVMTDsKKwlmb3J3X3BhY2tldC0+cXVldWVfbGVmdCA9IHF1ZXVlX2xlZnQ7CisJZm9yd19wYWNrZXQtPmlmX2luY29taW5nID0gaWZfaW5jb21pbmc7CisJZm9yd19wYWNrZXQtPmlmX291dGdvaW5nID0gaWZfb3V0Z29pbmc7CisJZm9yd19wYWNrZXQtPm51bV9wYWNrZXRzID0gMDsKKworCXJldHVybiBmb3J3X3BhY2tldDsKKworZXJyOgorCWlmIChxdWV1ZV9sZWZ0KQorCQlhdG9taWNfaW5jKHF1ZXVlX2xlZnQpOworCisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyB2b2lkCiBfYmF0YWR2X2FkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdChzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAogCQkJCSBzdHJ1Y3QgYmF0YWR2X2ZvcndfcGFja2V0ICpmb3J3X3BhY2tldCwKQEAgLTQ4NywyNCArNTY3LDIwIEBACiAJc3RydWN0IGJhdGFkdl9iY2FzdF9wYWNrZXQgKmJjYXN0X3BhY2tldDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiOwogCi0JaWYgKCFiYXRhZHZfYXRvbWljX2RlY19ub3RfemVybygmYmF0X3ByaXYtPmJjYXN0X3F1ZXVlX2xlZnQpKSB7Ci0JCWJhdGFkdl9kYmcoQkFUQURWX0RCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJICAgImJjYXN0IHBhY2tldCBxdWV1ZSBmdWxsXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCiAJcHJpbWFyeV9pZiA9IGJhdGFkdl9wcmltYXJ5X2lmX2dldF9zZWxlY3RlZChiYXRfcHJpdik7CiAJaWYgKCFwcmltYXJ5X2lmKQotCQlnb3RvIG91dF9hbmRfaW5jOworCQlnb3RvIGVycjsKIAotCWZvcndfcGFja2V0ID0ga21hbGxvYyhzaXplb2YoKmZvcndfcGFja2V0KSwgR0ZQX0FUT01JQyk7Ci0KKwlmb3J3X3BhY2tldCA9IGJhdGFkdl9mb3J3X3BhY2tldF9hbGxvYyhwcmltYXJ5X2lmLCBOVUxMLAorCQkJCQkgICAgICAgJmJhdF9wcml2LT5iY2FzdF9xdWV1ZV9sZWZ0LAorCQkJCQkgICAgICAgYmF0X3ByaXYpOworCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOwogCWlmICghZm9yd19wYWNrZXQpCi0JCWdvdG8gb3V0X2FuZF9pbmM7CisJCWdvdG8gZXJyOwogCiAJbmV3c2tiID0gc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKTsKIAlpZiAoIW5ld3NrYikKLQkJZ290byBwYWNrZXRfZnJlZTsKKwkJZ290byBlcnJfcGFja2V0X2ZyZWU7CiAKIAkvKiBhcyB3ZSBoYXZlIGEgY29weSBub3csIGl0IGlzIHNhZmUgdG8gZGVjcmVhc2UgdGhlIFRUTCAqLwogCWJjYXN0X3BhY2tldCA9IChzdHJ1Y3QgYmF0YWR2X2JjYXN0X3BhY2tldCAqKW5ld3NrYi0+ZGF0YTsKQEAgLTUxMywxMSArNTg5LDYgQEAKIAlza2JfcmVzZXRfbWFjX2hlYWRlcihuZXdza2IpOwogCiAJZm9yd19wYWNrZXQtPnNrYiA9IG5ld3NrYjsKLQlmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcgPSBwcmltYXJ5X2lmOwotCWZvcndfcGFja2V0LT5pZl9vdXRnb2luZyA9IE5VTEw7Ci0KLQkvKiBob3cgb2Z0ZW4gZGlkIHdlIHNlbmQgdGhlIGJjYXN0IHBhY2tldCA/ICovCi0JZm9yd19wYWNrZXQtPm51bV9wYWNrZXRzID0gMDsKIAogCUlOSVRfREVMQVlFRF9XT1JLKCZmb3J3X3BhY2tldC0+ZGVsYXllZF93b3JrLAogCQkJICBiYXRhZHZfc2VuZF9vdXRzdGFuZGluZ19iY2FzdF9wYWNrZXQpOwpAQCAtNTI1LDEzICs1OTYsOSBAQAogCV9iYXRhZHZfYWRkX2JjYXN0X3BhY2tldF90b19saXN0KGJhdF9wcml2LCBmb3J3X3BhY2tldCwgZGVsYXkpOwogCXJldHVybiBORVRERVZfVFhfT0s7CiAKLXBhY2tldF9mcmVlOgotCWtmcmVlKGZvcndfcGFja2V0KTsKLW91dF9hbmRfaW5jOgotCWF0b21pY19pbmMoJmJhdF9wcml2LT5iY2FzdF9xdWV1ZV9sZWZ0KTsKLW91dDoKLQlpZiAocHJpbWFyeV9pZikKLQkJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7CitlcnJfcGFja2V0X2ZyZWU6CisJYmF0YWR2X2ZvcndfcGFja2V0X2ZyZWUoZm9yd19wYWNrZXQpOworZXJyOgogCXJldHVybiBORVRERVZfVFhfQlVTWTsKIH0KIApAQCAtNTkyLDcgKzY1OSw2IEBACiAKIG91dDoKIAliYXRhZHZfZm9yd19wYWNrZXRfZnJlZShmb3J3X3BhY2tldCk7Ci0JYXRvbWljX2luYygmYmF0X3ByaXYtPmJjYXN0X3F1ZXVlX2xlZnQpOwogfQogCiB2b2lkCkBAIC02MzMsOSArNjk5LDYgQEAKIAogCQlpZiAocGVuZGluZykgewogCQkJaGxpc3RfZGVsKCZmb3J3X3BhY2tldC0+bGlzdCk7Ci0JCQlpZiAoIWZvcndfcGFja2V0LT5vd24pCi0JCQkJYXRvbWljX2luYygmYmF0X3ByaXYtPmJjYXN0X3F1ZXVlX2xlZnQpOwotCiAJCQliYXRhZHZfZm9yd19wYWNrZXRfZnJlZShmb3J3X3BhY2tldCk7CiAJCX0KIAl9CkBAIC02NjMsOSArNzI2LDYgQEAKIAogCQlpZiAocGVuZGluZykgewogCQkJaGxpc3RfZGVsKCZmb3J3X3BhY2tldC0+bGlzdCk7Ci0JCQlpZiAoIWZvcndfcGFja2V0LT5vd24pCi0JCQkJYXRvbWljX2luYygmYmF0X3ByaXYtPmJhdG1hbl9xdWV1ZV9sZWZ0KTsKLQogCQkJYmF0YWR2X2ZvcndfcGFja2V0X2ZyZWUoZm9yd19wYWNrZXQpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvc2VuZC5oIGIvbmV0L2JhdG1hbi1hZHYvc2VuZC5oCmluZGV4IDdjZWNiNzUuLjk5OWY3ODYgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L3NlbmQuaAorKysgYi9uZXQvYmF0bWFuLWFkdi9zZW5kLmgKQEAgLTI4LDYgKzI4LDEyIEBACiBzdHJ1Y3Qgc2tfYnVmZjsKIAogdm9pZCBiYXRhZHZfZm9yd19wYWNrZXRfZnJlZShzdHJ1Y3QgYmF0YWR2X2ZvcndfcGFja2V0ICpmb3J3X3BhY2tldCk7CitzdHJ1Y3QgYmF0YWR2X2ZvcndfcGFja2V0ICoKK2JhdGFkdl9mb3J3X3BhY2tldF9hbGxvYyhzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX2luY29taW5nLAorCQkJIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcsCisJCQkgYXRvbWljX3QgKnF1ZXVlX2xlZnQsCisJCQkgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdik7CisKIGludCBiYXRhZHZfc2VuZF9za2JfdG9fb3JpZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUsCiAJCQkgICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpyZWN2X2lmKTsKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmMgYi9uZXQvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5jCmluZGV4IDc1MjdjMDYuLjQ5ZTE2YjYgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KQEAgLTQ2LDcgKzQ3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAjaW5jbHVkZSAiYmF0X2FsZ28uaCIKICNpbmNsdWRlICJicmlkZ2VfbG9vcF9hdm9pZGFuY2UuaCIKQEAgLTU3LDYgKzU3LDcgQEAKICNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgogI2luY2x1ZGUgIm11bHRpY2FzdC5oIgogI2luY2x1ZGUgIm5ldHdvcmstY29kaW5nLmgiCisjaW5jbHVkZSAib3JpZ2luYXRvci5oIgogI2luY2x1ZGUgInBhY2tldC5oIgogI2luY2x1ZGUgInNlbmQuaCIKICNpbmNsdWRlICJzeXNmcy5oIgpAQCAtMzc3LDYgKzM3OCw4IEBACiBkcm9wcGVkX2ZyZWVkOgogCWJhdGFkdl9pbmNfY291bnRlcihiYXRfcHJpdiwgQkFUQURWX0NOVF9UWF9EUk9QUEVEKTsKIGVuZDoKKwlpZiAobWNhc3Rfc2luZ2xlX29yaWcpCisJCWJhdGFkdl9vcmlnX25vZGVfcHV0KG1jYXN0X3NpbmdsZV9vcmlnKTsKIAlpZiAocHJpbWFyeV9pZikKIAkJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKQEAgLTU5MSw2ICs1OTQsNyBAQAogCX0KIAogCXNwaW5fbG9ja19iaCgmYmF0X3ByaXYtPnNvZnRpZl92bGFuX2xpc3RfbG9jayk7CisJa3JlZl9nZXQoJnZsYW4tPnJlZmNvdW50KTsKIAlobGlzdF9hZGRfaGVhZF9yY3UoJnZsYW4tPmxpc3QsICZiYXRfcHJpdi0+c29mdGlmX3ZsYW5fbGlzdCk7CiAJc3Bpbl91bmxvY2tfYmgoJmJhdF9wcml2LT5zb2Z0aWZfdmxhbl9saXN0X2xvY2spOwogCkBAIC02MDEsNiArNjA1LDkgQEAKIAkJCSAgICBiYXRfcHJpdi0+c29mdF9pZmFjZS0+ZGV2X2FkZHIsIHZpZCwKIAkJCSAgICBCQVRBRFZfTlVMTF9JRklOREVYLCBCQVRBRFZfTk9fTUFSSyk7CiAKKwkvKiBkb24ndCByZXR1cm4gcmVmZXJlbmNlIHRvIG5ldyBzb2Z0aWZfdmxhbiAqLworCWJhdGFkdl9zb2Z0aWZfdmxhbl9wdXQodmxhbik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzQ3LDM0ICs3NTQsNiBAQAogfQogCiAvKioKLSAqIGJhdGFkdl9zb2Z0aWZfZGVzdHJveV9maW5pc2ggLSBjbGVhbnMgdXAgdGhlIHJlbWFpbnMgb2YgYSBzb2Z0aWYKLSAqIEB3b3JrOiB3b3JrIHF1ZXVlIGl0ZW0KLSAqCi0gKiBGcmVlIHRoZSBwYXJ0cyBvZiB0aGUgc29mdCBpbnRlcmZhY2Ugd2hpY2ggY2FuIG5vdCBiZSByZW1vdmVkIHVuZGVyCi0gKiBydG5sIGxvY2sgKHRvIHByZXZlbnQgZGVhZGxvY2sgc2l0dWF0aW9ucykuCi0gKi8KLXN0YXRpYyB2b2lkIGJhdGFkdl9zb2Z0aWZfZGVzdHJveV9maW5pc2goc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBiYXRhZHZfc29mdGlmX3ZsYW4gKnZsYW47Ci0Jc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZTsKLQotCWJhdF9wcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBiYXRhZHZfcHJpdiwKLQkJCQljbGVhbnVwX3dvcmspOwotCXNvZnRfaWZhY2UgPSBiYXRfcHJpdi0+c29mdF9pZmFjZTsKLQotCS8qIGRlc3Ryb3kgdGhlICJ1bnRhZ2dlZCIgVkxBTiAqLwotCXZsYW4gPSBiYXRhZHZfc29mdGlmX3ZsYW5fZ2V0KGJhdF9wcml2LCBCQVRBRFZfTk9fRkxBR1MpOwotCWlmICh2bGFuKSB7Ci0JCWJhdGFkdl9zb2Z0aWZfZGVzdHJveV92bGFuKGJhdF9wcml2LCB2bGFuKTsKLQkJYmF0YWR2X3NvZnRpZl92bGFuX3B1dCh2bGFuKTsKLQl9Ci0KLQliYXRhZHZfc3lzZnNfZGVsX21lc2hpZihzb2Z0X2lmYWNlKTsKLQl1bnJlZ2lzdGVyX25ldGRldihzb2Z0X2lmYWNlKTsKLX0KLQotLyoqCiAgKiBiYXRhZHZfc29mdGlmX2luaXRfbGF0ZSAtIGxhdGUgc3RhZ2UgaW5pdGlhbGl6YXRpb24gb2Ygc29mdCBpbnRlcmZhY2UKICAqIEBkZXY6IHJlZ2lzdGVyZWQgbmV0d29yayBkZXZpY2UgdG8gbW9kaWZ5CiAgKgpAQCAtNzkxLDcgKzc3MCw2IEBACiAKIAliYXRfcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJYmF0X3ByaXYtPnNvZnRfaWZhY2UgPSBkZXY7Ci0JSU5JVF9XT1JLKCZiYXRfcHJpdi0+Y2xlYW51cF93b3JrLCBiYXRhZHZfc29mdGlmX2Rlc3Ryb3lfZmluaXNoKTsKIAogCS8qIGJhdGFkdl9pbnRlcmZhY2Vfc3RhdHMoKSBuZWVkcyB0byBiZSBhdmFpbGFibGUgYXMgc29vbiBhcwogCSAqIHJlZ2lzdGVyX25ldGRldmljZSgpIGhhcyBiZWVuIGNhbGxlZApAQCAtMTAyOCw4ICsxMDA2LDE5IEBACiB2b2lkIGJhdGFkdl9zb2Z0aWZfZGVzdHJveV9zeXNmcyhzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSkKIHsKIAlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7CisJc3RydWN0IGJhdGFkdl9zb2Z0aWZfdmxhbiAqdmxhbjsKIAotCXF1ZXVlX3dvcmsoYmF0YWR2X2V2ZW50X3dvcmtxdWV1ZSwgJmJhdF9wcml2LT5jbGVhbnVwX3dvcmspOworCUFTU0VSVF9SVE5MKCk7CisKKwkvKiBkZXN0cm95IHRoZSAidW50YWdnZWQiIFZMQU4gKi8KKwl2bGFuID0gYmF0YWR2X3NvZnRpZl92bGFuX2dldChiYXRfcHJpdiwgQkFUQURWX05PX0ZMQUdTKTsKKwlpZiAodmxhbikgeworCQliYXRhZHZfc29mdGlmX2Rlc3Ryb3lfdmxhbihiYXRfcHJpdiwgdmxhbik7CisJCWJhdGFkdl9zb2Z0aWZfdmxhbl9wdXQodmxhbik7CisJfQorCisJYmF0YWR2X3N5c2ZzX2RlbF9tZXNoaWYoc29mdF9pZmFjZSk7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Uoc29mdF9pZmFjZSk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvc3lzZnMuYyBiL25ldC9iYXRtYW4tYWR2L3N5c2ZzLmMKaW5kZXggZmU5Y2E5NC4uMDJkOTZmMiAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvc3lzZnMuYworKysgYi9uZXQvYmF0bWFuLWFkdi9zeXNmcy5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKICNpbmNsdWRlICJicmlkZ2VfbG9vcF9hdm9pZGFuY2UuaCIKICNpbmNsdWRlICJkaXN0cmlidXRlZC1hcnAtdGFibGUuaCIKQEAgLTQyOCw2ICs0MjksMTMgQEAKIAlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2ID0gYmF0YWR2X2tvYmpfdG9fYmF0cHJpdihrb2JqKTsKIAlpbnQgYnl0ZXNfd3JpdHRlbjsKIAorCS8qIEdXIG1vZGUgaXMgbm90IGF2YWlsYWJsZSBpZiB0aGUgcm91dGluZyBhbGdvcml0aG0gaW4gdXNlIGRvZXMgbm90CisJICogaW1wbGVtZW50IHRoZSBHVyBBUEkKKwkgKi8KKwlpZiAoIWJhdF9wcml2LT5hbGdvX29wcy0+Z3cuZ2V0X2Jlc3RfZ3dfbm9kZSB8fAorCSAgICAhYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5pc19lbGlnaWJsZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKIAlzd2l0Y2ggKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3cubW9kZSkpIHsKIAljYXNlIEJBVEFEVl9HV19NT0RFX0NMSUVOVDoKIAkJYnl0ZXNfd3JpdHRlbiA9IHNwcmludGYoYnVmZiwgIiVzXG4iLApAQCAtNDU1LDYgKzQ2MywxMyBAQAogCWNoYXIgKmN1cnJfZ3dfbW9kZV9zdHI7CiAJaW50IGd3X21vZGVfdG1wID0gLTE7CiAKKwkvKiB0b2dnbGluZyBHVyBtb2RlIGlzIGFsbG93ZWQgb25seSBpZiB0aGUgcm91dGluZyBhbGdvcml0aG0gaW4gdXNlCisJICogcHJvdmlkZXMgdGhlIEdXIEFQSQorCSAqLworCWlmICghYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5nZXRfYmVzdF9nd19ub2RlIHx8CisJICAgICFiYXRfcHJpdi0+YWxnb19vcHMtPmd3LmlzX2VsaWdpYmxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChidWZmW2NvdW50IC0gMV0gPT0gJ1xuJykKIAkJYnVmZltjb3VudCAtIDFdID0gJ1wwJzsKIApAQCAtNTE0LDYgKzUyOSw1MCBAQAogCXJldHVybiBjb3VudDsKIH0KIAorc3RhdGljIHNzaXplX3QgYmF0YWR2X3Nob3dfZ3dfc2VsX2NsYXNzKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWZmKQoreworCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYgPSBiYXRhZHZfa29ial90b19iYXRwcml2KGtvYmopOworCisJLyogR1cgc2VsZWN0aW9uIGNsYXNzIGlzIG5vdCBhdmFpbGFibGUgaWYgdGhlIHJvdXRpbmcgYWxnb3JpdGhtIGluIHVzZQorCSAqIGRvZXMgbm90IGltcGxlbWVudCB0aGUgR1cgQVBJCisJICovCisJaWYgKCFiYXRfcHJpdi0+YWxnb19vcHMtPmd3LmdldF9iZXN0X2d3X25vZGUgfHwKKwkgICAgIWJhdF9wcml2LT5hbGdvX29wcy0+Z3cuaXNfZWxpZ2libGUpCisJCXJldHVybiAtRU5PRU5UOworCisJaWYgKGJhdF9wcml2LT5hbGdvX29wcy0+Z3cuc2hvd19zZWxfY2xhc3MpCisJCXJldHVybiBiYXRfcHJpdi0+YWxnb19vcHMtPmd3LnNob3dfc2VsX2NsYXNzKGJhdF9wcml2LCBidWZmKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZmYsICIlaVxuIiwgYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ndy5zZWxfY2xhc3MpKTsKK30KKworc3RhdGljIHNzaXplX3QgYmF0YWR2X3N0b3JlX2d3X3NlbF9jbGFzcyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZmYsCisJCQkJCSBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiA9IGJhdGFkdl9rb2JqX3RvX2JhdHByaXYoa29iaik7CisKKwkvKiBzZXR0aW5nIHRoZSBHVyBzZWxlY3Rpb24gY2xhc3MgaXMgYWxsb3dlZCBvbmx5IGlmIHRoZSByb3V0aW5nCisJICogYWxnb3JpdGhtIGluIHVzZSBpbXBsZW1lbnRzIHRoZSBHVyBBUEkKKwkgKi8KKwlpZiAoIWJhdF9wcml2LT5hbGdvX29wcy0+Z3cuZ2V0X2Jlc3RfZ3dfbm9kZSB8fAorCSAgICAhYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5pc19lbGlnaWJsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYnVmZltjb3VudCAtIDFdID09ICdcbicpCisJCWJ1ZmZbY291bnQgLSAxXSA9ICdcMCc7CisKKwlpZiAoYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5zdG9yZV9zZWxfY2xhc3MpCisJCXJldHVybiBiYXRfcHJpdi0+YWxnb19vcHMtPmd3LnN0b3JlX3NlbF9jbGFzcyhiYXRfcHJpdiwgYnVmZiwKKwkJCQkJCQkgICAgICBjb3VudCk7CisKKwlyZXR1cm4gX19iYXRhZHZfc3RvcmVfdWludF9hdHRyKGJ1ZmYsIGNvdW50LCAxLCBCQVRBRFZfVFFfTUFYX1ZBTFVFLAorCQkJCQliYXRhZHZfcG9zdF9nd19yZXNlbGVjdCwgYXR0ciwKKwkJCQkJJmJhdF9wcml2LT5ndy5zZWxfY2xhc3MsCisJCQkJCWJhdF9wcml2LT5zb2Z0X2lmYWNlKTsKK30KKwogc3RhdGljIHNzaXplX3QgYmF0YWR2X3Nob3dfZ3dfYndpZHRoKHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkJCSAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmZikKIHsKQEAgLTYyNSw4ICs2ODQsOCBAQAogCQkgICAgIDIgKiBCQVRBRFZfSklUVEVSLCBJTlRfTUFYLCBOVUxMKTsKIEJBVEFEVl9BVFRSX1NJRl9VSU5UKGhvcF9wZW5hbHR5LCBob3BfcGVuYWx0eSwgU19JUlVHTyB8IFNfSVdVU1IsIDAsCiAJCSAgICAgQkFUQURWX1RRX01BWF9WQUxVRSwgTlVMTCk7Ci1CQVRBRFZfQVRUUl9TSUZfVUlOVChnd19zZWxfY2xhc3MsIGd3LnNlbF9jbGFzcywgU19JUlVHTyB8IFNfSVdVU1IsIDEsCi0JCSAgICAgQkFUQURWX1RRX01BWF9WQUxVRSwgYmF0YWR2X3Bvc3RfZ3dfcmVzZWxlY3QpOworc3RhdGljIEJBVEFEVl9BVFRSKGd3X3NlbF9jbGFzcywgU19JUlVHTyB8IFNfSVdVU1IsIGJhdGFkdl9zaG93X2d3X3NlbF9jbGFzcywKKwkJICAgYmF0YWR2X3N0b3JlX2d3X3NlbF9jbGFzcyk7CiBzdGF0aWMgQkFUQURWX0FUVFIoZ3dfYmFuZHdpZHRoLCBTX0lSVUdPIHwgU19JV1VTUiwgYmF0YWR2X3Nob3dfZ3dfYndpZHRoLAogCQkgICBiYXRhZHZfc3RvcmVfZ3dfYndpZHRoKTsKICNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9NQ0FTVApAQCAtNzEyLDYgKzc3MSw4IEBACiAJZm9yIChiYXRfYXR0ciA9IGJhdGFkdl9tZXNoX2F0dHJzOyAqYmF0X2F0dHI7ICsrYmF0X2F0dHIpCiAJCXN5c2ZzX3JlbW92ZV9maWxlKGJhdF9wcml2LT5tZXNoX29iaiwgJigoKmJhdF9hdHRyKS0+YXR0cikpOwogCisJa29iamVjdF91ZXZlbnQoYmF0X3ByaXYtPm1lc2hfb2JqLCBLT0JKX1JFTU9WRSk7CisJa29iamVjdF9kZWwoYmF0X3ByaXYtPm1lc2hfb2JqKTsKIAlrb2JqZWN0X3B1dChiYXRfcHJpdi0+bWVzaF9vYmopOwogCWJhdF9wcml2LT5tZXNoX29iaiA9IE5VTEw7CiBvdXQ6CkBAIC03MjYsNiArNzg3LDggQEAKIAlmb3IgKGJhdF9hdHRyID0gYmF0YWR2X21lc2hfYXR0cnM7ICpiYXRfYXR0cjsgKytiYXRfYXR0cikKIAkJc3lzZnNfcmVtb3ZlX2ZpbGUoYmF0X3ByaXYtPm1lc2hfb2JqLCAmKCgqYmF0X2F0dHIpLT5hdHRyKSk7CiAKKwlrb2JqZWN0X3VldmVudChiYXRfcHJpdi0+bWVzaF9vYmosIEtPQkpfUkVNT1ZFKTsKKwlrb2JqZWN0X2RlbChiYXRfcHJpdi0+bWVzaF9vYmopOwogCWtvYmplY3RfcHV0KGJhdF9wcml2LT5tZXNoX29iaik7CiAJYmF0X3ByaXYtPm1lc2hfb2JqID0gTlVMTDsKIH0KQEAgLTc4MSw2ICs4NDQsMTAgQEAKIAlmb3IgKGJhdF9hdHRyID0gYmF0YWR2X3ZsYW5fYXR0cnM7ICpiYXRfYXR0cjsgKytiYXRfYXR0cikKIAkJc3lzZnNfcmVtb3ZlX2ZpbGUodmxhbi0+a29iaiwgJigoKmJhdF9hdHRyKS0+YXR0cikpOwogCisJaWYgKHZsYW4tPmtvYmogIT0gYmF0X3ByaXYtPm1lc2hfb2JqKSB7CisJCWtvYmplY3RfdWV2ZW50KHZsYW4tPmtvYmosIEtPQkpfUkVNT1ZFKTsKKwkJa29iamVjdF9kZWwodmxhbi0+a29iaik7CisJfQogCWtvYmplY3RfcHV0KHZsYW4tPmtvYmopOwogCXZsYW4tPmtvYmogPSBOVUxMOwogb3V0OgpAQCAtODAwLDYgKzg2NywxMCBAQAogCWZvciAoYmF0X2F0dHIgPSBiYXRhZHZfdmxhbl9hdHRyczsgKmJhdF9hdHRyOyArK2JhdF9hdHRyKQogCQlzeXNmc19yZW1vdmVfZmlsZSh2bGFuLT5rb2JqLCAmKCgqYmF0X2F0dHIpLT5hdHRyKSk7CiAKKwlpZiAodmxhbi0+a29iaiAhPSBiYXRfcHJpdi0+bWVzaF9vYmopIHsKKwkJa29iamVjdF91ZXZlbnQodmxhbi0+a29iaiwgS09CSl9SRU1PVkUpOworCQlrb2JqZWN0X2RlbCh2bGFuLT5rb2JqKTsKKwl9CiAJa29iamVjdF9wdXQodmxhbi0+a29iaik7CiAJdmxhbi0+a29iaiA9IE5VTEw7CiB9CkBAIC04MjgsMzEgKzg5OSwzMSBAQAogCXJldHVybiBsZW5ndGg7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGJhdGFkdl9zdG9yZV9tZXNoX2lmYWNlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCSAgICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWZmLAotCQkJCSAgICAgICBzaXplX3QgY291bnQpCisvKioKKyAqIGJhdGFkdl9zdG9yZV9tZXNoX2lmYWNlX2ZpbmlzaCAtIHN0b3JlIG5ldyBoYXJkaWYgbWVzaF9pZmFjZSBzdGF0ZQorICogQG5ldF9kZXY6IG5ldGRldmljZSB0byBhZGQvcmVtb3ZlIHRvL2Zyb20gYmF0bWFuLWFkdiBzb2Z0LWludGVyZmFjZQorICogQGlmbmFtZTogbmFtZSBvZiBzb2Z0LWludGVyZmFjZSB0byBtb2RpZnkKKyAqCisgKiBDaGFuZ2VzIHRoZSBwYXJ0cyBvZiB0aGUgaGFyZCtzb2Z0IGludGVyZmFjZSB3aGljaCBjYW4gbm90IGJlIG1vZGlmaWVkIHVuZGVyCisgKiBzeXNmcyBsb2NrICh0byBwcmV2ZW50IGRlYWRsb2NrIHNpdHVhdGlvbnMpLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAwIDwgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGJhdGFkdl9zdG9yZV9tZXNoX2lmYWNlX2ZpbmlzaChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKKwkJCQkJICBjaGFyIGlmbmFtZVtJRk5BTVNJWl0pCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBiYXRhZHZfa29ial90b19uZXRkZXYoa29iaik7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChuZXRfZGV2KTsKIAlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRfaWZhY2U7Ci0JaW50IHN0YXR1c190bXAgPSAtMTsKLQlpbnQgcmV0ID0gY291bnQ7CisJaW50IHN0YXR1c190bXA7CisJaW50IHJldCA9IDA7CisKKwlBU1NFUlRfUlROTCgpOwogCiAJaGFyZF9pZmFjZSA9IGJhdGFkdl9oYXJkaWZfZ2V0X2J5X25ldGRldihuZXRfZGV2KTsKIAlpZiAoIWhhcmRfaWZhY2UpCi0JCXJldHVybiBjb3VudDsKKwkJcmV0dXJuIDA7CiAKLQlpZiAoYnVmZltjb3VudCAtIDFdID09ICdcbicpCi0JCWJ1ZmZbY291bnQgLSAxXSA9ICdcMCc7Ci0KLQlpZiAoc3RybGVuKGJ1ZmYpID49IElGTkFNU0laKSB7Ci0JCXByX2VycigiSW52YWxpZCBwYXJhbWV0ZXIgZm9yICdtZXNoX2lmYWNlJyBzZXR0aW5nIHJlY2VpdmVkOiBpbnRlcmZhY2UgbmFtZSB0b28gbG9uZyAnJXMnXG4iLAotCQkgICAgICAgYnVmZik7Ci0JCWJhdGFkdl9oYXJkaWZfcHV0KGhhcmRfaWZhY2UpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoc3RybmNtcChidWZmLCAibm9uZSIsIDQpID09IDApCisJaWYgKHN0cm5jbXAoaWZuYW1lLCAibm9uZSIsIDQpID09IDApCiAJCXN0YXR1c190bXAgPSBCQVRBRFZfSUZfTk9UX0lOX1VTRTsKIAllbHNlCiAJCXN0YXR1c190bXAgPSBCQVRBRFZfSUZfSV9XQU5UX1lPVTsKQEAgLTg2MSwxNSArOTMyLDEzIEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKChoYXJkX2lmYWNlLT5zb2Z0X2lmYWNlKSAmJgotCSAgICAoc3RybmNtcChoYXJkX2lmYWNlLT5zb2Z0X2lmYWNlLT5uYW1lLCBidWZmLCBJRk5BTVNJWikgPT0gMCkpCisJICAgIChzdHJuY21wKGhhcmRfaWZhY2UtPnNvZnRfaWZhY2UtPm5hbWUsIGlmbmFtZSwgSUZOQU1TSVopID09IDApKQogCQlnb3RvIG91dDsKIAotCXJ0bmxfbG9jaygpOwotCiAJaWYgKHN0YXR1c190bXAgPT0gQkFUQURWX0lGX05PVF9JTl9VU0UpIHsKIAkJYmF0YWR2X2hhcmRpZl9kaXNhYmxlX2ludGVyZmFjZShoYXJkX2lmYWNlLAogCQkJCQkJQkFUQURWX0lGX0NMRUFOVVBfQVVUTyk7Ci0JCWdvdG8gdW5sb2NrOworCQlnb3RvIG91dDsKIAl9CiAKIAkvKiBpZiB0aGUgaW50ZXJmYWNlIGFscmVhZHkgaXMgaW4gdXNlICovCkBAIC04NzcsMTUgKzk0Niw3MSBAQAogCQliYXRhZHZfaGFyZGlmX2Rpc2FibGVfaW50ZXJmYWNlKGhhcmRfaWZhY2UsCiAJCQkJCQlCQVRBRFZfSUZfQ0xFQU5VUF9BVVRPKTsKIAotCXJldCA9IGJhdGFkdl9oYXJkaWZfZW5hYmxlX2ludGVyZmFjZShoYXJkX2lmYWNlLCBuZXQsIGJ1ZmYpOwotCi11bmxvY2s6Ci0JcnRubF91bmxvY2soKTsKKwlyZXQgPSBiYXRhZHZfaGFyZGlmX2VuYWJsZV9pbnRlcmZhY2UoaGFyZF9pZmFjZSwgbmV0LCBpZm5hbWUpOwogb3V0OgogCWJhdGFkdl9oYXJkaWZfcHV0KGhhcmRfaWZhY2UpOwogCXJldHVybiByZXQ7CiB9CiAKKy8qKgorICogYmF0YWR2X3N0b3JlX21lc2hfaWZhY2Vfd29yayAtIHN0b3JlIG5ldyBoYXJkaWYgbWVzaF9pZmFjZSBzdGF0ZQorICogQHdvcms6IHdvcmsgcXVldWUgaXRlbQorICoKKyAqIENoYW5nZXMgdGhlIHBhcnRzIG9mIHRoZSBoYXJkK3NvZnQgaW50ZXJmYWNlIHdoaWNoIGNhbiBub3QgYmUgbW9kaWZpZWQgdW5kZXIKKyAqIHN5c2ZzIGxvY2sgKHRvIHByZXZlbnQgZGVhZGxvY2sgc2l0dWF0aW9ucykuCisgKi8KK3N0YXRpYyB2b2lkIGJhdGFkdl9zdG9yZV9tZXNoX2lmYWNlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBiYXRhZHZfc3RvcmVfbWVzaF93b3JrICpzdG9yZV93b3JrOworCWludCByZXQ7CisKKwlzdG9yZV93b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBiYXRhZHZfc3RvcmVfbWVzaF93b3JrLCB3b3JrKTsKKworCXJ0bmxfbG9jaygpOworCXJldCA9IGJhdGFkdl9zdG9yZV9tZXNoX2lmYWNlX2ZpbmlzaChzdG9yZV93b3JrLT5uZXRfZGV2LAorCQkJCQkgICAgIHN0b3JlX3dvcmstPnNvZnRfaWZhY2VfbmFtZSk7CisJcnRubF91bmxvY2soKTsKKworCWlmIChyZXQgPCAwKQorCQlwcl9lcnIoIkZhaWxlZCB0byBzdG9yZSBuZXcgbWVzaF9pZmFjZSBzdGF0ZSAlcyBmb3IgJXM6ICVkXG4iLAorCQkgICAgICAgc3RvcmVfd29yay0+c29mdF9pZmFjZV9uYW1lLCBzdG9yZV93b3JrLT5uZXRfZGV2LT5uYW1lLAorCQkgICAgICAgcmV0KTsKKworCWRldl9wdXQoc3RvcmVfd29yay0+bmV0X2Rldik7CisJa2ZyZWUoc3RvcmVfd29yayk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJhdGFkdl9zdG9yZV9tZXNoX2lmYWNlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWZmLAorCQkJCSAgICAgICBzaXplX3QgY291bnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBiYXRhZHZfa29ial90b19uZXRkZXYoa29iaik7CisJc3RydWN0IGJhdGFkdl9zdG9yZV9tZXNoX3dvcmsgKnN0b3JlX3dvcms7CisKKwlpZiAoYnVmZltjb3VudCAtIDFdID09ICdcbicpCisJCWJ1ZmZbY291bnQgLSAxXSA9ICdcMCc7CisKKwlpZiAoc3RybGVuKGJ1ZmYpID49IElGTkFNU0laKSB7CisJCXByX2VycigiSW52YWxpZCBwYXJhbWV0ZXIgZm9yICdtZXNoX2lmYWNlJyBzZXR0aW5nIHJlY2VpdmVkOiBpbnRlcmZhY2UgbmFtZSB0b28gbG9uZyAnJXMnXG4iLAorCQkgICAgICAgYnVmZik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0b3JlX3dvcmsgPSBrbWFsbG9jKHNpemVvZigqc3RvcmVfd29yayksIEdGUF9LRVJORUwpOworCWlmICghc3RvcmVfd29yaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXZfaG9sZChuZXRfZGV2KTsKKwlJTklUX1dPUksoJnN0b3JlX3dvcmstPndvcmssIGJhdGFkdl9zdG9yZV9tZXNoX2lmYWNlX3dvcmspOworCXN0b3JlX3dvcmstPm5ldF9kZXYgPSBuZXRfZGV2OworCXN0cmxjcHkoc3RvcmVfd29yay0+c29mdF9pZmFjZV9uYW1lLCBidWZmLAorCQlzaXplb2Yoc3RvcmVfd29yay0+c29mdF9pZmFjZV9uYW1lKSk7CisKKwlxdWV1ZV93b3JrKGJhdGFkdl9ldmVudF93b3JrcXVldWUsICZzdG9yZV93b3JrLT53b3JrKTsKKworCXJldHVybiBjb3VudDsKK30KKwogc3RhdGljIHNzaXplX3QgYmF0YWR2X3Nob3dfaWZhY2Vfc3RhdHVzKHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkJCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWZmKQogewpAQCAtMTA0OCw2ICsxMTczLDggQEAKIAogdm9pZCBiYXRhZHZfc3lzZnNfZGVsX2hhcmRpZihzdHJ1Y3Qga29iamVjdCAqKmhhcmRpZl9vYmopCiB7CisJa29iamVjdF91ZXZlbnQoKmhhcmRpZl9vYmosIEtPQkpfUkVNT1ZFKTsKKwlrb2JqZWN0X2RlbCgqaGFyZGlmX29iaik7CiAJa29iamVjdF9wdXQoKmhhcmRpZl9vYmopOwogCSpoYXJkaWZfb2JqID0gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmMgYi9uZXQvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5jCmluZGV4IDdlNmRmN2EuLjdmNjYzMDkgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuYwpAQCAtMjIsMTIgKzIyLDE0IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzJjLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvamhhc2guaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zNSwyNSArMzcsMzkgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9iYXRtYW5fYWR2Lmg+CiAKICNpbmNsdWRlICJicmlkZ2VfbG9vcF9hdm9pZGFuY2UuaCIKICNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgogI2luY2x1ZGUgImhhc2guaCIKICNpbmNsdWRlICJsb2cuaCIKICNpbmNsdWRlICJtdWx0aWNhc3QuaCIKKyNpbmNsdWRlICJuZXRsaW5rLmgiCiAjaW5jbHVkZSAib3JpZ2luYXRvci5oIgogI2luY2x1ZGUgInBhY2tldC5oIgogI2luY2x1ZGUgInNvZnQtaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAidHZsdi5oIgogCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmJhdGFkdl90bF9jYWNoZSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpiYXRhZHZfdGdfY2FjaGUgX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqYmF0YWR2X3R0X29yaWdfY2FjaGUgX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqYmF0YWR2X3R0X2NoYW5nZV9jYWNoZSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpiYXRhZHZfdHRfcmVxX2NhY2hlIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmJhdGFkdl90dF9yb2FtX2NhY2hlIF9fcmVhZF9tb3N0bHk7CisKIC8qIGhhc2ggY2xhc3Mga2V5cyAqLwogc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBiYXRhZHZfdHRfbG9jYWxfaGFzaF9sb2NrX2NsYXNzX2tleTsKIHN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgYmF0YWR2X3R0X2dsb2JhbF9oYXNoX2xvY2tfY2xhc3Nfa2V5OwpAQCAtMjA1LDYgKzIyMSwyMCBAQAogfQogCiAvKioKKyAqIGJhdGFkdl90dF9sb2NhbF9lbnRyeV9mcmVlX3JjdSAtIGZyZWUgdGhlIHR0X2xvY2FsX2VudHJ5CisgKiBAcmN1OiByY3UgcG9pbnRlciBvZiB0aGUgdHRfbG9jYWxfZW50cnkKKyAqLworc3RhdGljIHZvaWQgYmF0YWR2X3R0X2xvY2FsX2VudHJ5X2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KQoreworCXN0cnVjdCBiYXRhZHZfdHRfbG9jYWxfZW50cnkgKnR0X2xvY2FsX2VudHJ5OworCisJdHRfbG9jYWxfZW50cnkgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgYmF0YWR2X3R0X2xvY2FsX2VudHJ5LAorCQkJCSAgICAgIGNvbW1vbi5yY3UpOworCisJa21lbV9jYWNoZV9mcmVlKGJhdGFkdl90bF9jYWNoZSwgdHRfbG9jYWxfZW50cnkpOworfQorCisvKioKICAqIGJhdGFkdl90dF9sb2NhbF9lbnRyeV9yZWxlYXNlIC0gcmVsZWFzZSB0dF9sb2NhbF9lbnRyeSBmcm9tIGxpc3RzIGFuZCBxdWV1ZQogICogIGZvciBmcmVlIGFmdGVyIHJjdSBncmFjZSBwZXJpb2QKICAqIEByZWY6IGtyZWYgcG9pbnRlciBvZiB0aGUgbmNfbm9kZQpAQCAtMjE4LDcgKzI0OCw3IEBACiAKIAliYXRhZHZfc29mdGlmX3ZsYW5fcHV0KHR0X2xvY2FsX2VudHJ5LT52bGFuKTsKIAotCWtmcmVlX3JjdSh0dF9sb2NhbF9lbnRyeSwgY29tbW9uLnJjdSk7CisJY2FsbF9yY3UoJnR0X2xvY2FsX2VudHJ5LT5jb21tb24ucmN1LCBiYXRhZHZfdHRfbG9jYWxfZW50cnlfZnJlZV9yY3UpOwogfQogCiAvKioKQEAgLTIzNCw2ICsyNjQsMjAgQEAKIH0KIAogLyoqCisgKiBiYXRhZHZfdHRfZ2xvYmFsX2VudHJ5X2ZyZWVfcmN1IC0gZnJlZSB0aGUgdHRfZ2xvYmFsX2VudHJ5CisgKiBAcmN1OiByY3UgcG9pbnRlciBvZiB0aGUgdHRfZ2xvYmFsX2VudHJ5CisgKi8KK3N0YXRpYyB2b2lkIGJhdGFkdl90dF9nbG9iYWxfZW50cnlfZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IGJhdGFkdl90dF9nbG9iYWxfZW50cnkgKnR0X2dsb2JhbF9lbnRyeTsKKworCXR0X2dsb2JhbF9lbnRyeSA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBiYXRhZHZfdHRfZ2xvYmFsX2VudHJ5LAorCQkJCSAgICAgICBjb21tb24ucmN1KTsKKworCWttZW1fY2FjaGVfZnJlZShiYXRhZHZfdGdfY2FjaGUsIHR0X2dsb2JhbF9lbnRyeSk7Cit9CisKKy8qKgogICogYmF0YWR2X3R0X2dsb2JhbF9lbnRyeV9yZWxlYXNlIC0gcmVsZWFzZSB0dF9nbG9iYWxfZW50cnkgZnJvbSBsaXN0cyBhbmQgcXVldWUKICAqICBmb3IgZnJlZSBhZnRlciByY3UgZ3JhY2UgcGVyaW9kCiAgKiBAcmVmOiBrcmVmIHBvaW50ZXIgb2YgdGhlIG5jX25vZGUKQEAgLTI0Niw3ICsyOTAsOCBAQAogCQkJCSAgICAgICBjb21tb24ucmVmY291bnQpOwogCiAJYmF0YWR2X3R0X2dsb2JhbF9kZWxfb3JpZ19saXN0KHR0X2dsb2JhbF9lbnRyeSk7Ci0Ja2ZyZWVfcmN1KHR0X2dsb2JhbF9lbnRyeSwgY29tbW9uLnJjdSk7CisKKwljYWxsX3JjdSgmdHRfZ2xvYmFsX2VudHJ5LT5jb21tb24ucmN1LCBiYXRhZHZfdHRfZ2xvYmFsX2VudHJ5X2ZyZWVfcmN1KTsKIH0KIAogLyoqCkBAIC0zODQsNiArNDI5LDE5IEBACiB9CiAKIC8qKgorICogYmF0YWR2X3R0X29yaWdfbGlzdF9lbnRyeV9mcmVlX3JjdSAtIGZyZWUgdGhlIG9yaWdfZW50cnkKKyAqIEByY3U6IHJjdSBwb2ludGVyIG9mIHRoZSBvcmlnX2VudHJ5CisgKi8KK3N0YXRpYyB2b2lkIGJhdGFkdl90dF9vcmlnX2xpc3RfZW50cnlfZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IGJhdGFkdl90dF9vcmlnX2xpc3RfZW50cnkgKm9yaWdfZW50cnk7CisKKwlvcmlnX2VudHJ5ID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IGJhdGFkdl90dF9vcmlnX2xpc3RfZW50cnksIHJjdSk7CisKKwlrbWVtX2NhY2hlX2ZyZWUoYmF0YWR2X3R0X29yaWdfY2FjaGUsIG9yaWdfZW50cnkpOworfQorCisvKioKICAqIGJhdGFkdl90dF9vcmlnX2xpc3RfZW50cnlfcmVsZWFzZSAtIHJlbGVhc2UgdHQgb3JpZyBlbnRyeSBmcm9tIGxpc3RzIGFuZAogICogIHF1ZXVlIGZvciBmcmVlIGFmdGVyIHJjdSBncmFjZSBwZXJpb2QKICAqIEByZWY6IGtyZWYgcG9pbnRlciBvZiB0aGUgdHQgb3JpZyBlbnRyeQpAQCAtMzk2LDcgKzQ1NCw3IEBACiAJCQkJICByZWZjb3VudCk7CiAKIAliYXRhZHZfb3JpZ19ub2RlX3B1dChvcmlnX2VudHJ5LT5vcmlnX25vZGUpOwotCWtmcmVlX3JjdShvcmlnX2VudHJ5LCByY3UpOworCWNhbGxfcmN1KCZvcmlnX2VudHJ5LT5yY3UsIGJhdGFkdl90dF9vcmlnX2xpc3RfZW50cnlfZnJlZV9yY3UpOwogfQogCiAvKioKQEAgLTQyNiw3ICs0ODQsNyBAQAogCWJvb2wgZXZlbnRfcmVtb3ZlZCA9IGZhbHNlOwogCWJvb2wgZGVsX29wX3JlcXVlc3RlZCwgZGVsX29wX2VudHJ5OwogCi0JdHRfY2hhbmdlX25vZGUgPSBrbWFsbG9jKHNpemVvZigqdHRfY2hhbmdlX25vZGUpLCBHRlBfQVRPTUlDKTsKKwl0dF9jaGFuZ2Vfbm9kZSA9IGttZW1fY2FjaGVfYWxsb2MoYmF0YWR2X3R0X2NoYW5nZV9jYWNoZSwgR0ZQX0FUT01JQyk7CiAJaWYgKCF0dF9jaGFuZ2Vfbm9kZSkKIAkJcmV0dXJuOwogCkBAIC00NjcsOCArNTI1LDggQEAKIAkJY29udGludWU7CiBkZWw6CiAJCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7Ci0JCWtmcmVlKGVudHJ5KTsKLQkJa2ZyZWUodHRfY2hhbmdlX25vZGUpOworCQlrbWVtX2NhY2hlX2ZyZWUoYmF0YWR2X3R0X2NoYW5nZV9jYWNoZSwgZW50cnkpOworCQlrbWVtX2NhY2hlX2ZyZWUoYmF0YWR2X3R0X2NoYW5nZV9jYWNoZSwgdHRfY2hhbmdlX25vZGUpOwogCQlldmVudF9yZW1vdmVkID0gdHJ1ZTsKIAkJZ290byB1bmxvY2s7CiAJfQpAQCAtNjQ2LDcgKzcwNCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXR0X2xvY2FsID0ga21hbGxvYyhzaXplb2YoKnR0X2xvY2FsKSwgR0ZQX0FUT01JQyk7CisJdHRfbG9jYWwgPSBrbWVtX2NhY2hlX2FsbG9jKGJhdGFkdl90bF9jYWNoZSwgR0ZQX0FUT01JQyk7CiAJaWYgKCF0dF9sb2NhbCkKIAkJZ290byBvdXQ7CiAKQEAgLTY1Niw3ICs3MTQsNyBAQAogCQluZXRfcmF0ZWxpbWl0ZWRfZnVuY3Rpb24oYmF0YWR2X2luZm8sIHNvZnRfaWZhY2UsCiAJCQkJCSAiYWRkaW5nIFRUIGxvY2FsIGVudHJ5ICVwTSB0byBub24tZXhpc3RlbnQgVkxBTiAlZFxuIiwKIAkJCQkJIGFkZHIsIEJBVEFEVl9QUklOVF9WSUQodmlkKSk7Ci0JCWtmcmVlKHR0X2xvY2FsKTsKKwkJa21lbV9jYWNoZV9mcmVlKGJhdGFkdl90bF9jYWNoZSwgdHRfbG9jYWwpOwogCQl0dF9sb2NhbCA9IE5VTEw7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTY3Niw3ICs3MzQsNiBAQAogCWlmIChiYXRhZHZfaXNfd2lmaV9uZXRkZXYoaW5fZGV2KSkKIAkJdHRfbG9jYWwtPmNvbW1vbi5mbGFncyB8PSBCQVRBRFZfVFRfQ0xJRU5UX1dJRkk7CiAJa3JlZl9pbml0KCZ0dF9sb2NhbC0+Y29tbW9uLnJlZmNvdW50KTsKLQlrcmVmX2dldCgmdHRfbG9jYWwtPmNvbW1vbi5yZWZjb3VudCk7CiAJdHRfbG9jYWwtPmxhc3Rfc2VlbiA9IGppZmZpZXM7CiAJdHRfbG9jYWwtPmNvbW1vbi5hZGRlZF9hdCA9IHR0X2xvY2FsLT5sYXN0X3NlZW47CiAJdHRfbG9jYWwtPnZsYW4gPSB2bGFuOwpAQCAtNjg4LDYgKzc0NSw3IEBACiAJICAgIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGFkZHIpKQogCQl0dF9sb2NhbC0+Y29tbW9uLmZsYWdzIHw9IEJBVEFEVl9UVF9DTElFTlRfTk9QVVJHRTsKIAorCWtyZWZfZ2V0KCZ0dF9sb2NhbC0+Y29tbW9uLnJlZmNvdW50KTsKIAloYXNoX2FkZGVkID0gYmF0YWR2X2hhc2hfYWRkKGJhdF9wcml2LT50dC5sb2NhbF9oYXNoLCBiYXRhZHZfY29tcGFyZV90dCwKIAkJCQkgICAgIGJhdGFkdl9jaG9vc2VfdHQsICZ0dF9sb2NhbC0+Y29tbW9uLAogCQkJCSAgICAgJnR0X2xvY2FsLT5jb21tb24uaGFzaF9lbnRyeSk7CkBAIC05NTksNyArMTAxNyw3IEBACiAJCQl0dF9kaWZmX2VudHJpZXNfY291bnQrKzsKIAkJfQogCQlsaXN0X2RlbCgmZW50cnktPmxpc3QpOwotCQlrZnJlZShlbnRyeSk7CisJCWttZW1fY2FjaGVfZnJlZShiYXRhZHZfdHRfY2hhbmdlX2NhY2hlLCBlbnRyeSk7CiAJfQogCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+dHQuY2hhbmdlc19saXN0X2xvY2spOwogCkBAIC05ODksNiArMTA0Nyw3IEBACiAJa2ZyZWUodHRfZGF0YSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiBpbnQgYmF0YWR2X3R0X2xvY2FsX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilzZXEtPnByaXZhdGU7CkBAIC0xMDU2LDYgKzExMTUsMTY1IEBACiAJCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOwogCXJldHVybiAwOwogfQorI2VuZGlmCisKKy8qKgorICogYmF0YWR2X3R0X2xvY2FsX2R1bXBfZW50cnkgLSBEdW1wIG9uZSBUVCBsb2NhbCBlbnRyeSBpbnRvIGEgbWVzc2FnZQorICogQG1zZyA6TmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBjb21tb246IHR0IGxvY2FsICYgdHQgZ2xvYmFsIGNvbW1vbiBkYXRhCisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorYmF0YWR2X3R0X2xvY2FsX2R1bXBfZW50cnkoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSAgIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkgICBzdHJ1Y3QgYmF0YWR2X3R0X2NvbW1vbl9lbnRyeSAqY29tbW9uKQoreworCXZvaWQgKmhkcjsKKwlzdHJ1Y3QgYmF0YWR2X3NvZnRpZl92bGFuICp2bGFuOworCXN0cnVjdCBiYXRhZHZfdHRfbG9jYWxfZW50cnkgKmxvY2FsOworCXVuc2lnbmVkIGludCBsYXN0X3NlZW5fbXNlY3M7CisJdTMyIGNyYzsKKworCWxvY2FsID0gY29udGFpbmVyX29mKGNvbW1vbiwgc3RydWN0IGJhdGFkdl90dF9sb2NhbF9lbnRyeSwgY29tbW9uKTsKKwlsYXN0X3NlZW5fbXNlY3MgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBsb2NhbC0+bGFzdF9zZWVuKTsKKworCXZsYW4gPSBiYXRhZHZfc29mdGlmX3ZsYW5fZ2V0KGJhdF9wcml2LCBjb21tb24tPnZpZCk7CisJaWYgKCF2bGFuKQorCQlyZXR1cm4gMDsKKworCWNyYyA9IHZsYW4tPnR0LmNyYzsKKworCWJhdGFkdl9zb2Z0aWZfdmxhbl9wdXQodmxhbik7CisKKwloZHIgPSBnZW5sbXNnX3B1dChtc2csIHBvcnRpZCwgc2VxLCAmYmF0YWR2X25ldGxpbmtfZmFtaWx5LAorCQkJICBOTE1fRl9NVUxUSSwKKwkJCSAgQkFUQURWX0NNRF9HRVRfVFJBTlNUQUJMRV9MT0NBTCk7CisJaWYgKCFoZHIpCisJCXJldHVybiAtRU5PQlVGUzsKKworCWlmIChubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfVFRfQUREUkVTUywgRVRIX0FMRU4sIGNvbW1vbi0+YWRkcikgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9UVF9DUkMzMiwgY3JjKSB8fAorCSAgICBubGFfcHV0X3UxNihtc2csIEJBVEFEVl9BVFRSX1RUX1ZJRCwgY29tbW9uLT52aWQpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfVFRfRkxBR1MsIGNvbW1vbi0+ZmxhZ3MpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWlmICghKGNvbW1vbi0+ZmxhZ3MgJiBCQVRBRFZfVFRfQ0xJRU5UX05PUFVSR0UpICYmCisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfTEFTVF9TRUVOX01TRUNTLCBsYXN0X3NlZW5fbXNlY3MpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKwlyZXR1cm4gMDsKKworIG5sYV9wdXRfZmFpbHVyZToKKwlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworLyoqCisgKiBiYXRhZHZfdHRfbG9jYWxfZHVtcF9idWNrZXQgLSBEdW1wIG9uZSBUVCBsb2NhbCBidWNrZXQgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAaGVhZDogUG9pbnRlciB0byB0aGUgbGlzdCBjb250YWluaW5nIHRoZSBsb2NhbCB0dCBlbnRyaWVzCisgKiBAaWR4X3M6IE51bWJlciBvZiBlbnRyaWVzIHRvIHNraXAKKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CitiYXRhZHZfdHRfbG9jYWxfZHVtcF9idWNrZXQoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSAgICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJICAgIHN0cnVjdCBobGlzdF9oZWFkICpoZWFkLCBpbnQgKmlkeF9zKQoreworCXN0cnVjdCBiYXRhZHZfdHRfY29tbW9uX2VudHJ5ICpjb21tb247CisJaW50IGlkeCA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNvbW1vbiwgaGVhZCwgaGFzaF9lbnRyeSkgeworCQlpZiAoaWR4KysgPCAqaWR4X3MpCisJCQljb250aW51ZTsKKworCQlpZiAoYmF0YWR2X3R0X2xvY2FsX2R1bXBfZW50cnkobXNnLCBwb3J0aWQsIHNlcSwgYmF0X3ByaXYsCisJCQkJCSAgICAgICBjb21tb24pKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCSppZHhfcyA9IGlkeCAtIDE7CisJCQlyZXR1cm4gLUVNU0dTSVpFOworCQl9CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJKmlkeF9zID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBiYXRhZHZfdHRfbG9jYWxfZHVtcCAtIER1bXAgVFQgbG9jYWwgZW50cmllcyBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQGNiOiBQYXJhbWV0ZXJzIGZyb20gcXVlcnkKKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitpbnQgYmF0YWR2X3R0X2xvY2FsX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KGNiLT5za2ItPnNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZTsKKwlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2OworCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqcHJpbWFyeV9pZiA9IE5VTEw7CisJc3RydWN0IGJhdGFkdl9oYXNodGFibGUgKmhhc2g7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisJaW50IHJldDsKKwlpbnQgaWZpbmRleDsKKwlpbnQgYnVja2V0ID0gY2ItPmFyZ3NbMF07CisJaW50IGlkeCA9IGNiLT5hcmdzWzFdOworCWludCBwb3J0aWQgPSBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZDsKKworCWlmaW5kZXggPSBiYXRhZHZfbmV0bGlua19nZXRfaWZpbmRleChjYi0+bmxoLCBCQVRBRFZfQVRUUl9NRVNIX0lGSU5ERVgpOworCWlmICghaWZpbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzb2Z0X2lmYWNlID0gZGV2X2dldF9ieV9pbmRleChuZXQsIGlmaW5kZXgpOworCWlmICghc29mdF9pZmFjZSB8fCAhYmF0YWR2X3NvZnRpZl9pc192YWxpZChzb2Z0X2lmYWNlKSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwliYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfaWZhY2UpOworCisJcHJpbWFyeV9pZiA9IGJhdGFkdl9wcmltYXJ5X2lmX2dldF9zZWxlY3RlZChiYXRfcHJpdik7CisJaWYgKCFwcmltYXJ5X2lmIHx8IHByaW1hcnlfaWYtPmlmX3N0YXR1cyAhPSBCQVRBRFZfSUZfQUNUSVZFKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKworCWhhc2ggPSBiYXRfcHJpdi0+dHQubG9jYWxfaGFzaDsKKworCXdoaWxlIChidWNrZXQgPCBoYXNoLT5zaXplKSB7CisJCWhlYWQgPSAmaGFzaC0+dGFibGVbYnVja2V0XTsKKworCQlpZiAoYmF0YWR2X3R0X2xvY2FsX2R1bXBfYnVja2V0KG1zZywgcG9ydGlkLCBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJCQliYXRfcHJpdiwgaGVhZCwgJmlkeCkpCisJCQlicmVhazsKKworCQlidWNrZXQrKzsKKwl9CisKKwlyZXQgPSBtc2ctPmxlbjsKKworIG91dDoKKwlpZiAocHJpbWFyeV9pZikKKwkJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7CisJaWYgKHNvZnRfaWZhY2UpCisJCWRldl9wdXQoc29mdF9pZmFjZSk7CisKKwljYi0+YXJnc1swXSA9IGJ1Y2tldDsKKwljYi0+YXJnc1sxXSA9IGlkeDsKKworCXJldHVybiByZXQ7Cit9CiAKIHN0YXRpYyB2b2lkCiBiYXRhZHZfdHRfbG9jYWxfc2V0X3BlbmRpbmcoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKQEAgLTEyNTksNyArMTQ3Nyw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBzYWZlLCAmYmF0X3ByaXYtPnR0LmNoYW5nZXNfbGlzdCwKIAkJCQkgbGlzdCkgewogCQlsaXN0X2RlbCgmZW50cnktPmxpc3QpOwotCQlrZnJlZShlbnRyeSk7CisJCWttZW1fY2FjaGVfZnJlZShiYXRhZHZfdHRfY2hhbmdlX2NhY2hlLCBlbnRyeSk7CiAJfQogCiAJYXRvbWljX3NldCgmYmF0X3ByaXYtPnR0LmxvY2FsX2NoYW5nZXMsIDApOwpAQCAtMTM0MSw3ICsxNTU5LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jb3JpZ19lbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCpvcmlnX2VudHJ5KSwgR0ZQX0FUT01JQyk7CisJb3JpZ19lbnRyeSA9IGttZW1fY2FjaGVfemFsbG9jKGJhdGFkdl90dF9vcmlnX2NhY2hlLCBHRlBfQVRPTUlDKTsKIAlpZiAoIW9yaWdfZW50cnkpCiAJCWdvdG8gb3V0OwogCkBAIC0xMzUxLDkgKzE1NjksOSBAQAogCW9yaWdfZW50cnktPm9yaWdfbm9kZSA9IG9yaWdfbm9kZTsKIAlvcmlnX2VudHJ5LT50dHZuID0gdHR2bjsKIAlrcmVmX2luaXQoJm9yaWdfZW50cnktPnJlZmNvdW50KTsKLQlrcmVmX2dldCgmb3JpZ19lbnRyeS0+cmVmY291bnQpOwogCiAJc3Bpbl9sb2NrX2JoKCZ0dF9nbG9iYWwtPmxpc3RfbG9jayk7CisJa3JlZl9nZXQoJm9yaWdfZW50cnktPnJlZmNvdW50KTsKIAlobGlzdF9hZGRfaGVhZF9yY3UoJm9yaWdfZW50cnktPmxpc3QsCiAJCQkgICAmdHRfZ2xvYmFsLT5vcmlnX2xpc3QpOwogCXNwaW5fdW5sb2NrX2JoKCZ0dF9nbG9iYWwtPmxpc3RfbG9jayk7CkBAIC0xNDExLDcgKzE2MjksOCBAQAogCQlnb3RvIG91dDsKIAogCWlmICghdHRfZ2xvYmFsX2VudHJ5KSB7Ci0JCXR0X2dsb2JhbF9lbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCp0dF9nbG9iYWxfZW50cnkpLCBHRlBfQVRPTUlDKTsKKwkJdHRfZ2xvYmFsX2VudHJ5ID0ga21lbV9jYWNoZV96YWxsb2MoYmF0YWR2X3RnX2NhY2hlLAorCQkJCQkJICAgIEdGUF9BVE9NSUMpOwogCQlpZiAoIXR0X2dsb2JhbF9lbnRyeSkKIAkJCWdvdG8gb3V0OwogCkBAIC0xNDI4LDEzICsxNjQ3LDEzIEBACiAJCWlmIChmbGFncyAmIEJBVEFEVl9UVF9DTElFTlRfUk9BTSkKIAkJCXR0X2dsb2JhbF9lbnRyeS0+cm9hbV9hdCA9IGppZmZpZXM7CiAJCWtyZWZfaW5pdCgmY29tbW9uLT5yZWZjb3VudCk7Ci0JCWtyZWZfZ2V0KCZjb21tb24tPnJlZmNvdW50KTsKIAkJY29tbW9uLT5hZGRlZF9hdCA9IGppZmZpZXM7CiAKIAkJSU5JVF9ITElTVF9IRUFEKCZ0dF9nbG9iYWxfZW50cnktPm9yaWdfbGlzdCk7CiAJCWF0b21pY19zZXQoJnR0X2dsb2JhbF9lbnRyeS0+b3JpZ19saXN0X2NvdW50LCAwKTsKIAkJc3Bpbl9sb2NrX2luaXQoJnR0X2dsb2JhbF9lbnRyeS0+bGlzdF9sb2NrKTsKIAorCQlrcmVmX2dldCgmY29tbW9uLT5yZWZjb3VudCk7CiAJCWhhc2hfYWRkZWQgPSBiYXRhZHZfaGFzaF9hZGQoYmF0X3ByaXYtPnR0Lmdsb2JhbF9oYXNoLAogCQkJCQkgICAgIGJhdGFkdl9jb21wYXJlX3R0LAogCQkJCQkgICAgIGJhdGFkdl9jaG9vc2VfdHQsIGNvbW1vbiwKQEAgLTE1NzksNiArMTc5OCw3IEBACiAJcmV0dXJuIGJlc3RfZW50cnk7CiB9CiAKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiAvKioKICAqIGJhdGFkdl90dF9nbG9iYWxfcHJpbnRfZW50cnkgLSBwcmludCBhbGwgb3JpZyBub2RlcyB3aG8gYW5ub3VuY2UgdGhlIGFkZHJlc3MKICAqICBmb3IgdGhpcyBnbG9iYWwgZW50cnkKQEAgLTE3MDIsNiArMTkyMiwyMTkgQEAKIAkJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7CiAJcmV0dXJuIDA7CiB9CisjZW5kaWYKKworLyoqCisgKiBiYXRhZHZfdHRfZ2xvYmFsX2R1bXBfc3ViZW50cnkgLSBEdW1wIGFsbCBUVCBsb2NhbCBlbnRyaWVzIGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBjb21tb246IHR0IGxvY2FsICYgdHQgZ2xvYmFsIGNvbW1vbiBkYXRhCisgKiBAb3JpZzogT3JpZ2luYXRvciBub2RlIGFubm91bmNpbmcgYSBub24tbWVzaCBjbGllbnQKKyAqIEBiZXN0OiBJcyB0aGUgYmVzdCBvcmlnaW5hdG9yIGZvciB0aGUgVFQgZW50cnkKKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CitiYXRhZHZfdHRfZ2xvYmFsX2R1bXBfc3ViZW50cnkoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSAgICAgICBzdHJ1Y3QgYmF0YWR2X3R0X2NvbW1vbl9lbnRyeSAqY29tbW9uLAorCQkJICAgICAgIHN0cnVjdCBiYXRhZHZfdHRfb3JpZ19saXN0X2VudHJ5ICpvcmlnLAorCQkJICAgICAgIGJvb2wgYmVzdCkKK3sKKwl2b2lkICpoZHI7CisJc3RydWN0IGJhdGFkdl9vcmlnX25vZGVfdmxhbiAqdmxhbjsKKwl1OCBsYXN0X3R0dm47CisJdTMyIGNyYzsKKworCXZsYW4gPSBiYXRhZHZfb3JpZ19ub2RlX3ZsYW5fZ2V0KG9yaWctPm9yaWdfbm9kZSwKKwkJCQkJIGNvbW1vbi0+dmlkKTsKKwlpZiAoIXZsYW4pCisJCXJldHVybiAwOworCisJY3JjID0gdmxhbi0+dHQuY3JjOworCisJYmF0YWR2X29yaWdfbm9kZV92bGFuX3B1dCh2bGFuKTsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgcG9ydGlkLCBzZXEsICZiYXRhZHZfbmV0bGlua19mYW1pbHksCisJCQkgIE5MTV9GX01VTFRJLAorCQkJICBCQVRBRFZfQ01EX0dFVF9UUkFOU1RBQkxFX0dMT0JBTCk7CisJaWYgKCFoZHIpCisJCXJldHVybiAtRU5PQlVGUzsKKworCWxhc3RfdHR2biA9IGF0b21pY19yZWFkKCZvcmlnLT5vcmlnX25vZGUtPmxhc3RfdHR2bik7CisKKwlpZiAobmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX1RUX0FERFJFU1MsIEVUSF9BTEVOLCBjb21tb24tPmFkZHIpIHx8CisJICAgIG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9PUklHX0FERFJFU1MsIEVUSF9BTEVOLAorCQkgICAgb3JpZy0+b3JpZ19ub2RlLT5vcmlnKSB8fAorCSAgICBubGFfcHV0X3U4KG1zZywgQkFUQURWX0FUVFJfVFRfVFRWTiwgb3JpZy0+dHR2bikgfHwKKwkgICAgbmxhX3B1dF91OChtc2csIEJBVEFEVl9BVFRSX1RUX0xBU1RfVFRWTiwgbGFzdF90dHZuKSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX1RUX0NSQzMyLCBjcmMpIHx8CisJICAgIG5sYV9wdXRfdTE2KG1zZywgQkFUQURWX0FUVFJfVFRfVklELCBjb21tb24tPnZpZCkgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9UVF9GTEFHUywgY29tbW9uLT5mbGFncykpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKGJlc3QgJiYgbmxhX3B1dF9mbGFnKG1zZywgQkFUQURWX0FUVFJfRkxBR19CRVNUKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisJcmV0dXJuIDA7CisKKyBubGFfcHV0X2ZhaWx1cmU6CisJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKKy8qKgorICogYmF0YWR2X3R0X2dsb2JhbF9kdW1wX2VudHJ5IC0gRHVtcCBvbmUgVFQgZ2xvYmFsIGVudHJ5IGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGNvbW1vbjogdHQgbG9jYWwgJiB0dCBnbG9iYWwgY29tbW9uIGRhdGEKKyAqIEBzdWJfczogTnVtYmVyIG9mIGVudHJpZXMgdG8gc2tpcAorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGUgY2FsbGVyIGhvbGRzIHJjdV9yZWFkX2xvY2soKS4KKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CitiYXRhZHZfdHRfZ2xvYmFsX2R1bXBfZW50cnkoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSAgICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJICAgIHN0cnVjdCBiYXRhZHZfdHRfY29tbW9uX2VudHJ5ICpjb21tb24sIGludCAqc3ViX3MpCit7CisJc3RydWN0IGJhdGFkdl90dF9vcmlnX2xpc3RfZW50cnkgKm9yaWdfZW50cnksICpiZXN0X2VudHJ5OworCXN0cnVjdCBiYXRhZHZfdHRfZ2xvYmFsX2VudHJ5ICpnbG9iYWw7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisJaW50IHN1YiA9IDA7CisJYm9vbCBiZXN0OworCisJZ2xvYmFsID0gY29udGFpbmVyX29mKGNvbW1vbiwgc3RydWN0IGJhdGFkdl90dF9nbG9iYWxfZW50cnksIGNvbW1vbik7CisJYmVzdF9lbnRyeSA9IGJhdGFkdl90cmFuc3RhYmxlX2Jlc3Rfb3JpZyhiYXRfcHJpdiwgZ2xvYmFsKTsKKwloZWFkID0gJmdsb2JhbC0+b3JpZ19saXN0OworCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG9yaWdfZW50cnksIGhlYWQsIGxpc3QpIHsKKwkJaWYgKHN1YisrIDwgKnN1Yl9zKQorCQkJY29udGludWU7CisKKwkJYmVzdCA9IChvcmlnX2VudHJ5ID09IGJlc3RfZW50cnkpOworCisJCWlmIChiYXRhZHZfdHRfZ2xvYmFsX2R1bXBfc3ViZW50cnkobXNnLCBwb3J0aWQsIHNlcSwgY29tbW9uLAorCQkJCQkJICAgb3JpZ19lbnRyeSwgYmVzdCkpIHsKKwkJCSpzdWJfcyA9IHN1YiAtIDE7CisJCQlyZXR1cm4gLUVNU0dTSVpFOworCQl9CisJfQorCisJKnN1Yl9zID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBiYXRhZHZfdHRfZ2xvYmFsX2R1bXBfYnVja2V0IC0gRHVtcCBvbmUgVFQgbG9jYWwgYnVja2V0IGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGhlYWQ6IFBvaW50ZXIgdG8gdGhlIGxpc3QgY29udGFpbmluZyB0aGUgZ2xvYmFsIHR0IGVudHJpZXMKKyAqIEBpZHhfczogTnVtYmVyIG9mIGVudHJpZXMgdG8gc2tpcAorICogQHN1YjogTnVtYmVyIG9mIGVudHJpZXMgdG8gc2tpcAorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl90dF9nbG9iYWxfZHVtcF9idWNrZXQoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSAgICAgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCSAgICAgc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQsIGludCAqaWR4X3MsIGludCAqc3ViKQoreworCXN0cnVjdCBiYXRhZHZfdHRfY29tbW9uX2VudHJ5ICpjb21tb247CisJaW50IGlkeCA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNvbW1vbiwgaGVhZCwgaGFzaF9lbnRyeSkgeworCQlpZiAoaWR4KysgPCAqaWR4X3MpCisJCQljb250aW51ZTsKKworCQlpZiAoYmF0YWR2X3R0X2dsb2JhbF9kdW1wX2VudHJ5KG1zZywgcG9ydGlkLCBzZXEsIGJhdF9wcml2LAorCQkJCQkJY29tbW9uLCBzdWIpKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCSppZHhfcyA9IGlkeCAtIDE7CisJCQlyZXR1cm4gLUVNU0dTSVpFOworCQl9CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJKmlkeF9zID0gMDsKKwkqc3ViID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBiYXRhZHZfdHRfZ2xvYmFsX2R1bXAgLSAgRHVtcCBUVCBnbG9iYWwgZW50cmllcyBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQGNiOiBQYXJhbWV0ZXJzIGZyb20gcXVlcnkKKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIGxlbmd0aCBvZiBtZXNzYWdlIG9uIHN1Y2Nlc3MKKyAqLworaW50IGJhdGFkdl90dF9nbG9iYWxfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoY2ItPnNrYi0+c2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlOworCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXY7CisJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpwcmltYXJ5X2lmID0gTlVMTDsKKwlzdHJ1Y3QgYmF0YWR2X2hhc2h0YWJsZSAqaGFzaDsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwlpbnQgcmV0OworCWludCBpZmluZGV4OworCWludCBidWNrZXQgPSBjYi0+YXJnc1swXTsKKwlpbnQgaWR4ID0gY2ItPmFyZ3NbMV07CisJaW50IHN1YiA9IGNiLT5hcmdzWzJdOworCWludCBwb3J0aWQgPSBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZDsKKworCWlmaW5kZXggPSBiYXRhZHZfbmV0bGlua19nZXRfaWZpbmRleChjYi0+bmxoLCBCQVRBRFZfQVRUUl9NRVNIX0lGSU5ERVgpOworCWlmICghaWZpbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzb2Z0X2lmYWNlID0gZGV2X2dldF9ieV9pbmRleChuZXQsIGlmaW5kZXgpOworCWlmICghc29mdF9pZmFjZSB8fCAhYmF0YWR2X3NvZnRpZl9pc192YWxpZChzb2Z0X2lmYWNlKSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwliYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfaWZhY2UpOworCisJcHJpbWFyeV9pZiA9IGJhdGFkdl9wcmltYXJ5X2lmX2dldF9zZWxlY3RlZChiYXRfcHJpdik7CisJaWYgKCFwcmltYXJ5X2lmIHx8IHByaW1hcnlfaWYtPmlmX3N0YXR1cyAhPSBCQVRBRFZfSUZfQUNUSVZFKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKworCWhhc2ggPSBiYXRfcHJpdi0+dHQuZ2xvYmFsX2hhc2g7CisKKwl3aGlsZSAoYnVja2V0IDwgaGFzaC0+c2l6ZSkgeworCQloZWFkID0gJmhhc2gtPnRhYmxlW2J1Y2tldF07CisKKwkJaWYgKGJhdGFkdl90dF9nbG9iYWxfZHVtcF9idWNrZXQobXNnLCBwb3J0aWQsCisJCQkJCQkgY2ItPm5saC0+bmxtc2dfc2VxLCBiYXRfcHJpdiwKKwkJCQkJCSBoZWFkLCAmaWR4LCAmc3ViKSkKKwkJCWJyZWFrOworCisJCWJ1Y2tldCsrOworCX0KKworCXJldCA9IG1zZy0+bGVuOworCisgb3V0OgorCWlmIChwcmltYXJ5X2lmKQorCQliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKKwlpZiAoc29mdF9pZmFjZSkKKwkJZGV2X3B1dChzb2Z0X2lmYWNlKTsKKworCWNiLT5hcmdzWzBdID0gYnVja2V0OworCWNiLT5hcmdzWzFdID0gaWR4OworCWNiLT5hcmdzWzJdID0gc3ViOworCisJcmV0dXJuIHJldDsKK30KIAogLyoqCiAgKiBfYmF0YWR2X3R0X2dsb2JhbF9kZWxfb3JpZ19lbnRyeSAtIHJlbW92ZSBhbmQgZnJlZSBhbiBvcmlnX2VudHJ5CkBAIC0yMjgwLDcgKzI3MTMsNyBAQAogCiAJdHRfcmVxX25vZGUgPSBjb250YWluZXJfb2YocmVmLCBzdHJ1Y3QgYmF0YWR2X3R0X3JlcV9ub2RlLCByZWZjb3VudCk7CiAKLQlrZnJlZSh0dF9yZXFfbm9kZSk7CisJa21lbV9jYWNoZV9mcmVlKGJhdGFkdl90dF9yZXFfY2FjaGUsIHR0X3JlcV9ub2RlKTsKIH0KIAogLyoqCkBAIC0yMzY3LDcgKzI4MDAsNyBAQAogCQkJZ290byB1bmxvY2s7CiAJfQogCi0JdHRfcmVxX25vZGUgPSBrbWFsbG9jKHNpemVvZigqdHRfcmVxX25vZGUpLCBHRlBfQVRPTUlDKTsKKwl0dF9yZXFfbm9kZSA9IGttZW1fY2FjaGVfYWxsb2MoYmF0YWR2X3R0X3JlcV9jYWNoZSwgR0ZQX0FUT01JQyk7CiAJaWYgKCF0dF9yZXFfbm9kZSkKIAkJZ290byB1bmxvY2s7CiAKQEAgLTMxMDQsNyArMzUzNyw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobm9kZSwgc2FmZSwgJmJhdF9wcml2LT50dC5yb2FtX2xpc3QsIGxpc3QpIHsKIAkJbGlzdF9kZWwoJm5vZGUtPmxpc3QpOwotCQlrZnJlZShub2RlKTsKKwkJa21lbV9jYWNoZV9mcmVlKGJhdGFkdl90dF9yb2FtX2NhY2hlLCBub2RlKTsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPnR0LnJvYW1fbGlzdF9sb2NrKTsKQEAgLTMxMjEsNyArMzU1NCw3IEBACiAJCQljb250aW51ZTsKIAogCQlsaXN0X2RlbCgmbm9kZS0+bGlzdCk7Ci0JCWtmcmVlKG5vZGUpOworCQlrbWVtX2NhY2hlX2ZyZWUoYmF0YWR2X3R0X3JvYW1fY2FjaGUsIG5vZGUpOwogCX0KIAlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPnR0LnJvYW1fbGlzdF9sb2NrKTsKIH0KQEAgLTMxNjIsNyArMzU5NSw4IEBACiAJfQogCiAJaWYgKCFyZXQpIHsKLQkJdHRfcm9hbV9ub2RlID0ga21hbGxvYyhzaXplb2YoKnR0X3JvYW1fbm9kZSksIEdGUF9BVE9NSUMpOworCQl0dF9yb2FtX25vZGUgPSBrbWVtX2NhY2hlX2FsbG9jKGJhdGFkdl90dF9yb2FtX2NhY2hlLAorCQkJCQkJR0ZQX0FUT01JQyk7CiAJCWlmICghdHRfcm9hbV9ub2RlKQogCQkJZ290byB1bmxvY2s7CiAKQEAgLTM4NjUsMyArNDI5OSw4NSBAQAogCiAJcmV0dXJuIHJldDsKIH0KKworLyoqCisgKiBiYXRhZHZfdHRfY2FjaGVfaW5pdCAtIEluaXRpYWxpemUgdHQgbWVtb3J5IG9iamVjdCBjYWNoZQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIG51bWJlciBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK2ludCBfX2luaXQgYmF0YWR2X3R0X2NhY2hlX2luaXQodm9pZCkKK3sKKwlzaXplX3QgdGxfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmF0YWR2X3R0X2xvY2FsX2VudHJ5KTsKKwlzaXplX3QgdGdfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmF0YWR2X3R0X2dsb2JhbF9lbnRyeSk7CisJc2l6ZV90IHR0X29yaWdfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmF0YWR2X3R0X29yaWdfbGlzdF9lbnRyeSk7CisJc2l6ZV90IHR0X2NoYW5nZV9zaXplID0gc2l6ZW9mKHN0cnVjdCBiYXRhZHZfdHRfY2hhbmdlX25vZGUpOworCXNpemVfdCB0dF9yZXFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmF0YWR2X3R0X3JlcV9ub2RlKTsKKwlzaXplX3QgdHRfcm9hbV9zaXplID0gc2l6ZW9mKHN0cnVjdCBiYXRhZHZfdHRfcm9hbV9ub2RlKTsKKworCWJhdGFkdl90bF9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJiYXRhZHZfdGxfY2FjaGUiLCB0bF9zaXplLCAwLAorCQkJCQkgICAgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKKwlpZiAoIWJhdGFkdl90bF9jYWNoZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwliYXRhZHZfdGdfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiYmF0YWR2X3RnX2NhY2hlIiwgdGdfc2l6ZSwgMCwKKwkJCQkJICAgIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7CisJaWYgKCFiYXRhZHZfdGdfY2FjaGUpCisJCWdvdG8gZXJyX3R0X3RsX2Rlc3Ryb3k7CisKKwliYXRhZHZfdHRfb3JpZ19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJiYXRhZHZfdHRfb3JpZ19jYWNoZSIsCisJCQkJCQkgdHRfb3JpZ19zaXplLCAwLAorCQkJCQkJIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7CisJaWYgKCFiYXRhZHZfdHRfb3JpZ19jYWNoZSkKKwkJZ290byBlcnJfdHRfdGdfZGVzdHJveTsKKworCWJhdGFkdl90dF9jaGFuZ2VfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiYmF0YWR2X3R0X2NoYW5nZV9jYWNoZSIsCisJCQkJCQkgICB0dF9jaGFuZ2Vfc2l6ZSwgMCwKKwkJCQkJCSAgIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7CisJaWYgKCFiYXRhZHZfdHRfY2hhbmdlX2NhY2hlKQorCQlnb3RvIGVycl90dF9vcmlnX2Rlc3Ryb3k7CisKKwliYXRhZHZfdHRfcmVxX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImJhdGFkdl90dF9yZXFfY2FjaGUiLAorCQkJCQkJdHRfcmVxX3NpemUsIDAsCisJCQkJCQlTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOworCWlmICghYmF0YWR2X3R0X3JlcV9jYWNoZSkKKwkJZ290byBlcnJfdHRfY2hhbmdlX2Rlc3Ryb3k7CisKKwliYXRhZHZfdHRfcm9hbV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJiYXRhZHZfdHRfcm9hbV9jYWNoZSIsCisJCQkJCQkgdHRfcm9hbV9zaXplLCAwLAorCQkJCQkJIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7CisJaWYgKCFiYXRhZHZfdHRfcm9hbV9jYWNoZSkKKwkJZ290byBlcnJfdHRfcmVxX2Rlc3Ryb3k7CisKKwlyZXR1cm4gMDsKKworZXJyX3R0X3JlcV9kZXN0cm95OgorCWttZW1fY2FjaGVfZGVzdHJveShiYXRhZHZfdHRfcmVxX2NhY2hlKTsKKwliYXRhZHZfdHRfcmVxX2NhY2hlID0gTlVMTDsKK2Vycl90dF9jaGFuZ2VfZGVzdHJveToKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koYmF0YWR2X3R0X2NoYW5nZV9jYWNoZSk7CisJYmF0YWR2X3R0X2NoYW5nZV9jYWNoZSA9IE5VTEw7CitlcnJfdHRfb3JpZ19kZXN0cm95OgorCWttZW1fY2FjaGVfZGVzdHJveShiYXRhZHZfdHRfb3JpZ19jYWNoZSk7CisJYmF0YWR2X3R0X29yaWdfY2FjaGUgPSBOVUxMOworZXJyX3R0X3RnX2Rlc3Ryb3k6CisJa21lbV9jYWNoZV9kZXN0cm95KGJhdGFkdl90Z19jYWNoZSk7CisJYmF0YWR2X3RnX2NhY2hlID0gTlVMTDsKK2Vycl90dF90bF9kZXN0cm95OgorCWttZW1fY2FjaGVfZGVzdHJveShiYXRhZHZfdGxfY2FjaGUpOworCWJhdGFkdl90bF9jYWNoZSA9IE5VTEw7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoqCisgKiBiYXRhZHZfdHRfY2FjaGVfZGVzdHJveSAtIERlc3Ryb3kgdHQgbWVtb3J5IG9iamVjdCBjYWNoZQorICovCit2b2lkIGJhdGFkdl90dF9jYWNoZV9kZXN0cm95KHZvaWQpCit7CisJa21lbV9jYWNoZV9kZXN0cm95KGJhdGFkdl90bF9jYWNoZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KGJhdGFkdl90Z19jYWNoZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KGJhdGFkdl90dF9vcmlnX2NhY2hlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koYmF0YWR2X3R0X2NoYW5nZV9jYWNoZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KGJhdGFkdl90dF9yZXFfY2FjaGUpOworCWttZW1fY2FjaGVfZGVzdHJveShiYXRhZHZfdHRfcm9hbV9jYWNoZSk7Cit9CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5oIGIvbmV0L2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuaAppbmRleCA3YzdlMmMwLi43ODNmZGJhIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5oCisrKyBiL25ldC9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmgKQEAgLTIyLDggKzIyLDEwIEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCitzdHJ1Y3QgbmV0bGlua19jYWxsYmFjazsKIHN0cnVjdCBuZXRfZGV2aWNlOwogc3RydWN0IHNlcV9maWxlOworc3RydWN0IHNrX2J1ZmY7CiAKIGludCBiYXRhZHZfdHRfaW5pdChzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2KTsKIGJvb2wgYmF0YWR2X3R0X2xvY2FsX2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSwgY29uc3QgdTggKmFkZHIsCkBAIC0zMyw2ICszNSw4IEBACiAJCQkgICBjb25zdCBjaGFyICptZXNzYWdlLCBib29sIHJvYW1pbmcpOwogaW50IGJhdGFkdl90dF9sb2NhbF9zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKIGludCBiYXRhZHZfdHRfZ2xvYmFsX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOworaW50IGJhdGFkdl90dF9sb2NhbF9kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7CitpbnQgYmF0YWR2X3R0X2dsb2JhbF9kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7CiB2b2lkIGJhdGFkdl90dF9nbG9iYWxfZGVsX29yaWcoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKIAkJCSAgICAgICBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlLAogCQkJICAgICAgIHMzMiBtYXRjaF92aWQsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpOwpAQCAtNTksNCArNjMsNyBAQAogYm9vbCBiYXRhZHZfdHRfZ2xvYmFsX2lzX2lzb2xhdGVkKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCiAJCQkJICBjb25zdCB1OCAqYWRkciwgdW5zaWduZWQgc2hvcnQgdmlkKTsKIAoraW50IGJhdGFkdl90dF9jYWNoZV9pbml0KHZvaWQpOwordm9pZCBiYXRhZHZfdHRfY2FjaGVfZGVzdHJveSh2b2lkKTsKKwogI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9UUkFOU0xBVElPTl9UQUJMRV9IXyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvdHZsdi5jIGIvbmV0L2JhdG1hbi1hZHYvdHZsdi5jCmluZGV4IDNkMWNmMGYuLjc3NjU0ZjAgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L3R2bHYuYworKysgYi9uZXQvYmF0bWFuLWFkdi90dmx2LmMKQEAgLTI1Nyw4ICsyNTcsMTMgQEAKIAlzcGluX2xvY2tfYmgoJmJhdF9wcml2LT50dmx2LmNvbnRhaW5lcl9saXN0X2xvY2spOwogCXR2bHZfb2xkID0gYmF0YWR2X3R2bHZfY29udGFpbmVyX2dldChiYXRfcHJpdiwgdHlwZSwgdmVyc2lvbik7CiAJYmF0YWR2X3R2bHZfY29udGFpbmVyX3JlbW92ZShiYXRfcHJpdiwgdHZsdl9vbGQpOworCisJa3JlZl9nZXQoJnR2bHZfbmV3LT5yZWZjb3VudCk7CiAJaGxpc3RfYWRkX2hlYWQoJnR2bHZfbmV3LT5saXN0LCAmYmF0X3ByaXYtPnR2bHYuY29udGFpbmVyX2xpc3QpOwogCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+dHZsdi5jb250YWluZXJfbGlzdF9sb2NrKTsKKworCS8qIGRvbid0IHJldHVybiByZWZlcmVuY2UgdG8gbmV3IHR2bHZfY29udGFpbmVyICovCisJYmF0YWR2X3R2bHZfY29udGFpbmVyX3B1dCh0dmx2X25ldyk7CiB9CiAKIC8qKgpAQCAtNTQyLDggKzU0NywxMiBAQAogCUlOSVRfSExJU1RfTk9ERSgmdHZsdl9oYW5kbGVyLT5saXN0KTsKIAogCXNwaW5fbG9ja19iaCgmYmF0X3ByaXYtPnR2bHYuaGFuZGxlcl9saXN0X2xvY2spOworCWtyZWZfZ2V0KCZ0dmx2X2hhbmRsZXItPnJlZmNvdW50KTsKIAlobGlzdF9hZGRfaGVhZF9yY3UoJnR2bHZfaGFuZGxlci0+bGlzdCwgJmJhdF9wcml2LT50dmx2LmhhbmRsZXJfbGlzdCk7CiAJc3Bpbl91bmxvY2tfYmgoJmJhdF9wcml2LT50dmx2LmhhbmRsZXJfbGlzdF9sb2NrKTsKKworCS8qIGRvbid0IHJldHVybiByZWZlcmVuY2UgdG8gbmV3IHR2bHZfaGFuZGxlciAqLworCWJhdGFkdl90dmx2X2hhbmRsZXJfcHV0KHR2bHZfaGFuZGxlcik7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvdHlwZXMuaCBiL25ldC9iYXRtYW4tYWR2L3R5cGVzLmgKaW5kZXggYTY0NTIyYy4uYjNkZDFhMyAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvdHlwZXMuaAorKysgYi9uZXQvYmF0bWFuLWFkdi90eXBlcy5oCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+IC8qIGZvciBsaW51eC93YWl0LmggKi8KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC0xMzIsNyArMTMzLDYgQEAKICAqIEByY3U6IHN0cnVjdCB1c2VkIGZvciBmcmVlaW5nIGluIGFuIFJDVS1zYWZlIG1hbm5lcgogICogQGJhdF9pdjogcGVyIGhhcmQtaW50ZXJmYWNlIEIuQS5ULk0uQS5OLiBJViBkYXRhCiAgKiBAYmF0X3Y6IHBlciBoYXJkLWludGVyZmFjZSBCLkEuVC5NLkEuTi4gViBkYXRhCi0gKiBAY2xlYW51cF93b3JrOiB3b3JrIHF1ZXVlIGNhbGxiYWNrIGl0ZW0gZm9yIGhhcmQtaW50ZXJmYWNlIGRlaW5pdAogICogQGRlYnVnX2RpcjogZGVudHJ5IGZvciBuYyBzdWJkaXIgaW4gYmF0bWFuLWFkdiBkaXJlY3RvcnkgaW4gZGVidWdmcwogICogQG5laWdoX2xpc3Q6IGxpc3Qgb2YgdW5pcXVlIHNpbmdsZSBob3AgbmVpZ2hib3JzIHZpYSB0aGlzIGludGVyZmFjZQogICogQG5laWdoX2xpc3RfbG9jazogbG9jayBwcm90ZWN0aW5nIG5laWdoX2xpc3QKQEAgLTE1Miw3ICsxNTIsNiBAQAogI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0JBVE1BTl9WCiAJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlX2JhdF92IGJhdF92OwogI2VuZGlmCi0Jc3RydWN0IHdvcmtfc3RydWN0IGNsZWFudXBfd29yazsKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19kaXI7CiAJc3RydWN0IGhsaXN0X2hlYWQgbmVpZ2hfbGlzdDsKIAkvKiBuZWlnaF9saXN0X2xvY2sgcHJvdGVjdHM6IG5laWdoX2xpc3QgKi8KQEAgLTEwMTUsNyArMTAxNCw2IEBACiAgKiBAZm9yd19iY2FzdF9saXN0X2xvY2s6IGxvY2sgcHJvdGVjdGluZyBmb3J3X2JjYXN0X2xpc3QKICAqIEB0cF9saXN0X2xvY2s6IHNwaW5sb2NrIHByb3RlY3RpbmcgQHRwX2xpc3QKICAqIEBvcmlnX3dvcms6IHdvcmsgcXVldWUgY2FsbGJhY2sgaXRlbSBmb3Igb3JpZyBub2RlIHB1cmdpbmcKLSAqIEBjbGVhbnVwX3dvcms6IHdvcmsgcXVldWUgY2FsbGJhY2sgaXRlbSBmb3Igc29mdC1pbnRlcmZhY2UgZGVpbml0CiAgKiBAcHJpbWFyeV9pZjogb25lIG9mIHRoZSBoYXJkLWludGVyZmFjZXMgYXNzaWduZWQgdG8gdGhpcyBtZXNoIGludGVyZmFjZQogICogIGJlY29tZXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlCiAgKiBAYWxnb19vcHM6IHJvdXRpbmcgYWxnb3JpdGhtIHVzZWQgYnkgdGhpcyBtZXNoIGludGVyZmFjZQpAQCAtMTA3NCw3ICsxMDcyLDYgQEAKIAlzcGlubG9ja190IHRwX2xpc3RfbG9jazsgLyogcHJvdGVjdHMgdHBfbGlzdCAqLwogCWF0b21pY190IHRwX251bTsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIG9yaWdfd29yazsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2xlYW51cF93b3JrOwogCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSBfX3JjdSAqcHJpbWFyeV9pZjsgIC8qIHJjdSBwcm90ZWN0ZWQgcG9pbnRlciAqLwogCXN0cnVjdCBiYXRhZHZfYWxnb19vcHMgKmFsZ29fb3BzOwogCXN0cnVjdCBobGlzdF9oZWFkIHNvZnRpZl92bGFuX2xpc3Q7CkBAIC0xMzc5LDYgKzEzNzYsNyBAQAogICogIGxvY2FsbHkgZ2VuZXJhdGVkIHBhY2tldAogICogQGlmX291dGdvaW5nOiBwYWNrZXQgd2hlcmUgdGhlIHBhY2tldCBzaG91bGQgYmUgc2VudCB0bywgb3IgTlVMTCBpZgogICogIHVuc3BlY2lmaWVkCisgKiBAcXVldWVfbGVmdDogVGhlIHF1ZXVlIChjb3VudGVyKSB0aGlzIHBhY2tldCB3YXMgYXBwbGllZCB0bwogICovCiBzdHJ1Y3QgYmF0YWR2X2ZvcndfcGFja2V0IHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSBsaXN0OwpAQCAtMTM5MSwxMSArMTM4OSwxMyBAQAogCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVsYXllZF93b3JrOwogCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfaW5jb21pbmc7CiAJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZzsKKwlhdG9taWNfdCAqcXVldWVfbGVmdDsKIH07CiAKIC8qKgogICogc3RydWN0IGJhdGFkdl9hbGdvX2lmYWNlX29wcyAtIG1lc2ggYWxnb3JpdGhtIGNhbGxiYWNrcyAoaW50ZXJmYWNlIHNwZWNpZmljKQogICogQGFjdGl2YXRlOiBzdGFydCByb3V0aW5nIG1lY2hhbmlzbXMgd2hlbiBoYXJkLWludGVyZmFjZSBpcyBicm91Z2h0IHVwCisgKiAgKG9wdGlvbmFsKQogICogQGVuYWJsZTogaW5pdCByb3V0aW5nIGluZm8gd2hlbiBoYXJkLWludGVyZmFjZSBpcyBlbmFibGVkCiAgKiBAZGlzYWJsZTogZGUtaW5pdCByb3V0aW5nIGluZm8gd2hlbiBoYXJkLWludGVyZmFjZSBpcyBkaXNhYmxlZAogICogQHVwZGF0ZV9tYWM6IChyZS0paW5pdCBtYWMgYWRkcmVzc2VzIG9mIHRoZSBwcm90b2NvbCBpbmZvcm1hdGlvbgpAQCAtMTQxMywxMSArMTQxMywxMyBAQAogLyoqCiAgKiBzdHJ1Y3QgYmF0YWR2X2FsZ29fbmVpZ2hfb3BzIC0gbWVzaCBhbGdvcml0aG0gY2FsbGJhY2tzIChuZWlnaGJvdXIgc3BlY2lmaWMpCiAgKiBAaGFyZGlmX2luaXQ6IGNhbGxlZCBvbiBjcmVhdGlvbiBvZiBzaW5nbGUgaG9wIGVudHJ5CisgKiAgKG9wdGlvbmFsKQogICogQGNtcDogY29tcGFyZSB0aGUgbWV0cmljcyBvZiB0d28gbmVpZ2hib3JzIGZvciB0aGVpciByZXNwZWN0aXZlIG91dGdvaW5nCiAgKiAgaW50ZXJmYWNlcwogICogQGlzX3NpbWlsYXJfb3JfYmV0dGVyOiBjaGVjayBpZiBuZWlnaDEgaXMgZXF1YWxseSBzaW1pbGFyIG9yIGJldHRlciB0aGFuCiAgKiAgbmVpZ2gyIGZvciB0aGVpciByZXNwZWN0aXZlIG91dGdvaW5nIGludGVyZmFjZSBmcm9tIHRoZSBtZXRyaWMgcHJvc3BlY3RpdmUKICAqIEBwcmludDogcHJpbnQgdGhlIHNpbmdsZSBob3AgbmVpZ2hib3IgbGlzdCAob3B0aW9uYWwpCisgKiBAZHVtcDogZHVtcCBuZWlnaGJvcnMgdG8gYSBuZXRsaW5rIHNvY2tldCAob3B0aW9uYWwpCiAgKi8KIHN0cnVjdCBiYXRhZHZfYWxnb19uZWlnaF9vcHMgewogCXZvaWQgKCpoYXJkaWZfaW5pdCkoc3RydWN0IGJhdGFkdl9oYXJkaWZfbmVpZ2hfbm9kZSAqbmVpZ2gpOwpAQCAtMTQyOSwyNiArMTQzMSw2NCBAQAogCQkJCSAgICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZzEsCiAJCQkJICAgICBzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKm5laWdoMiwKIAkJCQkgICAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcyKTsKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiAJdm9pZCAoKnByaW50KShzdHJ1Y3QgYmF0YWR2X3ByaXYgKnByaXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKTsKKyNlbmRpZgorCXZvaWQgKCpkdW1wKShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCSAgICAgc3RydWN0IGJhdGFkdl9wcml2ICpwcml2LAorCQkgICAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZF9pZmFjZSk7CiB9OwogCiAvKioKICAqIHN0cnVjdCBiYXRhZHZfYWxnb19vcmlnX29wcyAtIG1lc2ggYWxnb3JpdGhtIGNhbGxiYWNrcyAob3JpZ2luYXRvciBzcGVjaWZpYykKICAqIEBmcmVlOiBmcmVlIHRoZSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoZSByb3V0aW5nIGFsZ29yaXRobSBmb3IgYW4gb3JpZ19ub2RlCi0gKiAgb2JqZWN0CisgKiAgb2JqZWN0IChvcHRpb25hbCkKICAqIEBhZGRfaWY6IGFzayB0aGUgcm91dGluZyBhbGdvcml0aG0gdG8gYXBwbHkgdGhlIG5lZWRlZCBjaGFuZ2VzIHRvIHRoZQotICogIG9yaWdfbm9kZSBkdWUgdG8gYSBuZXcgaGFyZC1pbnRlcmZhY2UgYmVpbmcgYWRkZWQgaW50byB0aGUgbWVzaAorICogIG9yaWdfbm9kZSBkdWUgdG8gYSBuZXcgaGFyZC1pbnRlcmZhY2UgYmVpbmcgYWRkZWQgaW50byB0aGUgbWVzaCAob3B0aW9uYWwpCiAgKiBAZGVsX2lmOiBhc2sgdGhlIHJvdXRpbmcgYWxnb3JpdGhtIHRvIGFwcGx5IHRoZSBuZWVkZWQgY2hhbmdlcyB0byB0aGUKLSAqICBvcmlnX25vZGUgZHVlIHRvIGFuIGhhcmQtaW50ZXJmYWNlIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgbWVzaAorICogIG9yaWdfbm9kZSBkdWUgdG8gYW4gaGFyZC1pbnRlcmZhY2UgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBtZXNoIChvcHRpb25hbCkKICAqIEBwcmludDogcHJpbnQgdGhlIG9yaWdpbmF0b3IgdGFibGUgKG9wdGlvbmFsKQorICogQGR1bXA6IGR1bXAgb3JpZ2luYXRvcnMgdG8gYSBuZXRsaW5rIHNvY2tldCAob3B0aW9uYWwpCiAgKi8KIHN0cnVjdCBiYXRhZHZfYWxnb19vcmlnX29wcyB7CiAJdm9pZCAoKmZyZWUpKHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUpOwogCWludCAoKmFkZF9pZikoc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSwgaW50IG1heF9pZl9udW0pOwogCWludCAoKmRlbF9pZikoc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSwgaW50IG1heF9pZl9udW0sCiAJCSAgICAgIGludCBkZWxfaWZfbnVtKTsKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiAJdm9pZCAoKnByaW50KShzdHJ1Y3QgYmF0YWR2X3ByaXYgKnByaXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxLAogCQkgICAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRfaWZhY2UpOworI2VuZGlmCisJdm9pZCAoKmR1bXApKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJICAgICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKnByaXYsCisJCSAgICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkX2lmYWNlKTsKK307CisKKy8qKgorICogc3RydWN0IGJhdGFkdl9hbGdvX2d3X29wcyAtIG1lc2ggYWxnb3JpdGhtIGNhbGxiYWNrcyAoR1cgc3BlY2lmaWMpCisgKiBAc3RvcmVfc2VsX2NsYXNzOiBwYXJzZSBhbmQgc3RvcmVzIGEgbmV3IEdXIHNlbGVjdGlvbiBjbGFzcyAob3B0aW9uYWwpCisgKiBAc2hvd19zZWxfY2xhc3M6IHByaW50cyB0aGUgY3VycmVudCBHVyBzZWxlY3Rpb24gY2xhc3MgKG9wdGlvbmFsKQorICogQGdldF9iZXN0X2d3X25vZGU6IHNlbGVjdCB0aGUgYmVzdCBHVyBmcm9tIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBub2RlcworICogIChvcHRpb25hbCkKKyAqIEBpc19lbGlnaWJsZTogY2hlY2sgaWYgYSBuZXdseSBkaXNjb3ZlcmVkIEdXIGlzIGEgcG90ZW50aWFsIGNhbmRpZGF0ZSBmb3IKKyAqICB0aGUgZWxlY3Rpb24gYXMgYmVzdCBHVyAob3B0aW9uYWwpCisgKiBAcHJpbnQ6IHByaW50IHRoZSBnYXRld2F5IHRhYmxlIChvcHRpb25hbCkKKyAqIEBkdW1wOiBkdW1wIGdhdGV3YXlzIHRvIGEgbmV0bGluayBzb2NrZXQgKG9wdGlvbmFsKQorICovCitzdHJ1Y3QgYmF0YWR2X2FsZ29fZ3dfb3BzIHsKKwlzc2l6ZV90ICgqc3RvcmVfc2VsX2NsYXNzKShzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LCBjaGFyICpidWZmLAorCQkJCSAgIHNpemVfdCBjb3VudCk7CisJc3NpemVfdCAoKnNob3dfc2VsX2NsYXNzKShzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LCBjaGFyICpidWZmKTsKKwlzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKigqZ2V0X2Jlc3RfZ3dfbm9kZSkKKwkJKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYpOworCWJvb2wgKCppc19lbGlnaWJsZSkoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCSAgICBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqY3Vycl9nd19vcmlnLAorCQkJICAgIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUpOworI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKKwl2b2lkICgqcHJpbnQpKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKTsKKyNlbmRpZgorCXZvaWQgKCpkdW1wKShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCSAgICAgc3RydWN0IGJhdGFkdl9wcml2ICpwcml2KTsKIH07CiAKIC8qKgpAQCAtMTQ1OCw2ICsxNDk4LDcgQEAKICAqIEBpZmFjZTogY2FsbGJhY2tzIHJlbGF0ZWQgdG8gaW50ZXJmYWNlIGhhbmRsaW5nCiAgKiBAbmVpZ2g6IGNhbGxiYWNrcyByZWxhdGVkIHRvIG5laWdoYm9ycyBoYW5kbGluZwogICogQG9yaWc6IGNhbGxiYWNrcyByZWxhdGVkIHRvIG9yaWdpbmF0b3JzIGhhbmRsaW5nCisgKiBAZ3c6IGNhbGxiYWNrcyByZWxhdGVkIHRvIEdXIG1vZGUKICAqLwogc3RydWN0IGJhdGFkdl9hbGdvX29wcyB7CiAJc3RydWN0IGhsaXN0X25vZGUgbGlzdDsKQEAgLTE0NjUsNiArMTUwNiw3IEBACiAJc3RydWN0IGJhdGFkdl9hbGdvX2lmYWNlX29wcyBpZmFjZTsKIAlzdHJ1Y3QgYmF0YWR2X2FsZ29fbmVpZ2hfb3BzIG5laWdoOwogCXN0cnVjdCBiYXRhZHZfYWxnb19vcmlnX29wcyBvcmlnOworCXN0cnVjdCBiYXRhZHZfYWxnb19nd19vcHMgZ3c7CiB9OwogCiAvKioKQEAgLTE1NjQsNCArMTYwNiwxNyBAQAogCUJBVEFEVl9UVkxWX0hBTkRMRVJfT0dNX0NBTExFRCA9IEJJVCgyKSwKIH07CiAKKy8qKgorICogc3RydWN0IGJhdGFkdl9zdG9yZV9tZXNoX3dvcmsgLSBXb3JrIHF1ZXVlIGl0ZW0gdG8gZGV0YWNoIGFkZC9kZWwgaW50ZXJmYWNlCisgKiAgZnJvbSBzeXNmcyBsb2NrcworICogQG5ldF9kZXY6IG5ldGRldmljZSB0byBhZGQvcmVtb3ZlIHRvL2Zyb20gYmF0bWFuLWFkdiBzb2Z0LWludGVyZmFjZQorICogQHNvZnRfaWZhY2VfbmFtZTogbmFtZSBvZiBzb2Z0LWludGVyZmFjZSB0byBtb2RpZnkKKyAqIEB3b3JrOiB3b3JrIHF1ZXVlIGl0ZW0KKyAqLworc3RydWN0IGJhdGFkdl9zdG9yZV9tZXNoX3dvcmsgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OworCWNoYXIgc29mdF9pZmFjZV9uYW1lW0lGTkFNU0laXTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKK307CisKICNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMgYi9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jCmluZGV4IGVjZTQ1ZTAuLjFhZmYyZGEgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMKKysrIGIvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYwpAQCAtMjYsMTEgKzI2LDEzIEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CiAjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgogCiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAKKyNpbmNsdWRlICJsZWRzLmgiCiAjaW5jbHVkZSAic2VsZnRlc3QuaCIKIAogLyogQmx1ZXRvb3RoIHNvY2tldHMgKi8KQEAgLTI1MCw3ICsyNTIsNyBAQAogCiAJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CiAKLQlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfVFJVTkMpCisJaWYgKGZsYWdzICYgTVNHX1RSVU5DKQogCQljb3BpZWQgPSBza2JsZW47CiAKIAlyZXR1cm4gZXJyID8gOiBjb3BpZWQ7CkBAIC03MTIsMTMgKzcxNCwxNiBAQAogc3RydWN0IGRlbnRyeSAqYnRfZGVidWdmczsKIEVYUE9SVF9TWU1CT0xfR1BMKGJ0X2RlYnVnZnMpOwogCisjZGVmaW5lIFZFUlNJT04gX19zdHJpbmdpZnkoQlRfU1VCU1lTX1ZFUlNJT04pICIuIiBcCisJCV9fc3RyaW5naWZ5KEJUX1NVQlNZU19SRVZJU0lPTikKKwogc3RhdGljIGludCBfX2luaXQgYnRfaW5pdCh2b2lkKQogewogCWludCBlcnI7CiAKIAlzb2NrX3NrYl9jYl9jaGVja19zaXplKHNpemVvZihzdHJ1Y3QgYnRfc2tiX2NiKSk7CiAKLQlCVF9JTkZPKCJDb3JlIHZlciAlcyIsIEJUX1NVQlNZU19WRVJTSU9OKTsKKwlCVF9JTkZPKCJDb3JlIHZlciAlcyIsIFZFUlNJT04pOwogCiAJZXJyID0gYnRfc2VsZnRlc3QoKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTcyNiw2ICs3MzEsOCBAQAogCiAJYnRfZGVidWdmcyA9IGRlYnVnZnNfY3JlYXRlX2RpcigiYmx1ZXRvb3RoIiwgTlVMTCk7CiAKKwlidF9sZWRzX2luaXQoKTsKKwogCWVyciA9IGJ0X3N5c2ZzX2luaXQoKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKQEAgLTc4NSw2ICs3OTIsOCBAQAogCiAJYnRfc3lzZnNfY2xlYW51cCgpOwogCisJYnRfbGVkc19jbGVhbnVwKCk7CisKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoYnRfZGVidWdmcyk7CiB9CiAKQEAgLTc5Miw3ICs4MDEsNyBAQAogbW9kdWxlX2V4aXQoYnRfZXhpdCk7CiAKIE1PRFVMRV9BVVRIT1IoIk1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQmx1ZXRvb3RoIENvcmUgdmVyICIgQlRfU1VCU1lTX1ZFUlNJT04pOwotTU9EVUxFX1ZFUlNJT04oQlRfU1VCU1lTX1ZFUlNJT04pOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCbHVldG9vdGggQ29yZSB2ZXIgIiBWRVJTSU9OKTsKK01PRFVMRV9WRVJTSU9OKFZFUlNJT04pOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTX05FVFBST1RPKFBGX0JMVUVUT09USCk7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMKaW5kZXggZGRmODQzMi4uM2FjODllOSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYwpAQCAtMTU2Miw2ICsxNTYyLDcgQEAKIAlhdXRvX29mZiA9IGhjaV9kZXZfdGVzdF9hbmRfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfQVVUT19PRkYpOwogCiAJaWYgKCFhdXRvX29mZiAmJiBoZGV2LT5kZXZfdHlwZSA9PSBIQ0lfUFJJTUFSWSAmJgorCSAgICAhaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1VTRVJfQ0hBTk5FTCkgJiYKIAkgICAgaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX01HTVQpKQogCQlfX21nbXRfcG93ZXJfb2ZmKGhkZXYpOwogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9yZXF1ZXN0LmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9yZXF1ZXN0LmMKaW5kZXggYzA0NWIzYy4uYzgxMzU2OCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfcmVxdWVzdC5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX3JlcXVlc3QuYwpAQCAtMjYyLDYgKzI2Miw4IEBACiAJCWJyZWFrOwogCX0KIAorCWtmcmVlX3NrYihoZGV2LT5yZXFfc2tiKTsKKwloZGV2LT5yZXFfc2tiID0gTlVMTDsKIAloZGV2LT5yZXFfc3RhdHVzID0gaGRldi0+cmVxX3Jlc3VsdCA9IDA7CiAKIAlCVF9EQkcoIiVzIGVuZDogZXJyICVkIiwgaGRldi0+bmFtZSwgZXJyKTsKQEAgLTk2OSwxNCArOTcxLDE0IEBACiAJaGNpX3JlcV9hZGQocmVxLCBIQ0lfT1BfTEVfU0VUX0FEVl9FTkFCTEUsIHNpemVvZihlbmFibGUpLCAmZW5hYmxlKTsKIH0KIAotc3RhdGljIHU4IGNyZWF0ZV9kZWZhdWx0X3NjYW5fcnNwX2RhdGEoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4ICpwdHIpCitzdGF0aWMgdTggYXBwZW5kX2xvY2FsX25hbWUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4ICpwdHIsIHU4IGFkX2xlbikKIHsKLQl1OCBhZF9sZW4gPSAwOwogCXNpemVfdCBuYW1lX2xlbjsKKwlpbnQgbWF4X2xlbjsKIAorCW1heF9sZW4gPSBIQ0lfTUFYX0FEX0xFTkdUSCAtIGFkX2xlbiAtIDI7CiAJbmFtZV9sZW4gPSBzdHJsZW4oaGRldi0+ZGV2X25hbWUpOwotCWlmIChuYW1lX2xlbiA+IDApIHsKLQkJc2l6ZV90IG1heF9sZW4gPSBIQ0lfTUFYX0FEX0xFTkdUSCAtIGFkX2xlbiAtIDI7CisJaWYgKG5hbWVfbGVuID4gMCAmJiBtYXhfbGVuID4gMCkgewogCiAJCWlmIChuYW1lX2xlbiA+IG1heF9sZW4pIHsKIAkJCW5hbWVfbGVuID0gbWF4X2xlbjsKQEAgLTk5NSwyMiArOTk3LDQyIEBACiAJcmV0dXJuIGFkX2xlbjsKIH0KIAorc3RhdGljIHU4IGNyZWF0ZV9kZWZhdWx0X3NjYW5fcnNwX2RhdGEoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4ICpwdHIpCit7CisJcmV0dXJuIGFwcGVuZF9sb2NhbF9uYW1lKGhkZXYsIHB0ciwgMCk7Cit9CisKIHN0YXRpYyB1OCBjcmVhdGVfaW5zdGFuY2Vfc2Nhbl9yc3BfZGF0YShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggaW5zdGFuY2UsCiAJCQkJCXU4ICpwdHIpCiB7CiAJc3RydWN0IGFkdl9pbmZvICphZHZfaW5zdGFuY2U7CisJdTMyIGluc3RhbmNlX2ZsYWdzOworCXU4IHNjYW5fcnNwX2xlbiA9IDA7CiAKIAlhZHZfaW5zdGFuY2UgPSBoY2lfZmluZF9hZHZfaW5zdGFuY2UoaGRldiwgaW5zdGFuY2UpOwogCWlmICghYWR2X2luc3RhbmNlKQogCQlyZXR1cm4gMDsKIAotCS8qIFRPRE86IFNldCB0aGUgYXBwcm9wcmlhdGUgZW50cmllcyBiYXNlZCBvbiBhZHZlcnRpc2luZyBpbnN0YW5jZSBmbGFncwotCSAqIGhlcmUgb25jZSBmbGFncyBvdGhlciB0aGFuIDAgYXJlIHN1cHBvcnRlZC4KLQkgKi8KKwlpbnN0YW5jZV9mbGFncyA9IGFkdl9pbnN0YW5jZS0+ZmxhZ3M7CisKKwlpZiAoKGluc3RhbmNlX2ZsYWdzICYgTUdNVF9BRFZfRkxBR19BUFBFQVJBTkNFKSAmJiBoZGV2LT5hcHBlYXJhbmNlKSB7CisJCXB0clswXSA9IDM7CisJCXB0clsxXSA9IEVJUl9BUFBFQVJBTkNFOworCQlwdXRfdW5hbGlnbmVkX2xlMTYoaGRldi0+YXBwZWFyYW5jZSwgcHRyICsgMik7CisJCXNjYW5fcnNwX2xlbiArPSA0OworCQlwdHIgKz0gNDsKKwl9CisKIAltZW1jcHkocHRyLCBhZHZfaW5zdGFuY2UtPnNjYW5fcnNwX2RhdGEsCiAJICAgICAgIGFkdl9pbnN0YW5jZS0+c2Nhbl9yc3BfbGVuKTsKIAotCXJldHVybiBhZHZfaW5zdGFuY2UtPnNjYW5fcnNwX2xlbjsKKwlzY2FuX3JzcF9sZW4gKz0gYWR2X2luc3RhbmNlLT5zY2FuX3JzcF9sZW47CisJcHRyICs9IGFkdl9pbnN0YW5jZS0+c2Nhbl9yc3BfbGVuOworCisJaWYgKGluc3RhbmNlX2ZsYWdzICYgTUdNVF9BRFZfRkxBR19MT0NBTF9OQU1FKQorCQlzY2FuX3JzcF9sZW4gPSBhcHBlbmRfbG9jYWxfbmFtZShoZGV2LCBwdHIsIHNjYW5fcnNwX2xlbik7CisKKwlyZXR1cm4gc2Nhbl9yc3BfbGVuOwogfQogCiB2b2lkIF9faGNpX3JlcV91cGRhdGVfc2Nhbl9yc3BfZGF0YShzdHJ1Y3QgaGNpX3JlcXVlc3QgKnJlcSwgdTggaW5zdGFuY2UpCkBAIC0xMTkyLDcgKzEyMTQsNyBAQAogCiAJaGNpX3JlcV9pbml0KCZyZXEsIGhkZXYpOwogCi0JaGNpX3JlcV9jbGVhcl9hZHZfaW5zdGFuY2UoaGRldiwgJnJlcSwgaW5zdGFuY2UsIGZhbHNlKTsKKwloY2lfcmVxX2NsZWFyX2Fkdl9pbnN0YW5jZShoZGV2LCBOVUxMLCAmcmVxLCBpbnN0YW5jZSwgZmFsc2UpOwogCiAJaWYgKGxpc3RfZW1wdHkoJmhkZXYtPmFkdl9pbnN0YW5jZXMpKQogCQlfX2hjaV9yZXFfZGlzYWJsZV9hZHZlcnRpc2luZygmcmVxKTsKQEAgLTEyODIsOCArMTMwNCw5IEBACiAgKiAgIHNldHRpbmcuCiAgKiAtIGZvcmNlID09IGZhbHNlOiBPbmx5IGluc3RhbmNlcyB0aGF0IGhhdmUgYSB0aW1lb3V0IHdpbGwgYmUgcmVtb3ZlZC4KICAqLwotdm9pZCBoY2lfcmVxX2NsZWFyX2Fkdl9pbnN0YW5jZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IGhjaV9yZXF1ZXN0ICpyZXEsCi0JCQkJdTggaW5zdGFuY2UsIGJvb2wgZm9yY2UpCit2b2lkIGhjaV9yZXFfY2xlYXJfYWR2X2luc3RhbmNlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkJc3RydWN0IGhjaV9yZXF1ZXN0ICpyZXEsIHU4IGluc3RhbmNlLAorCQkJCWJvb2wgZm9yY2UpCiB7CiAJc3RydWN0IGFkdl9pbmZvICphZHZfaW5zdGFuY2UsICpuLCAqbmV4dF9pbnN0YW5jZSA9IE5VTEw7CiAJaW50IGVycjsKQEAgLTEzMDksNyArMTMzMiw3IEBACiAJCQlyZW1faW5zdCA9IGFkdl9pbnN0YW5jZS0+aW5zdGFuY2U7CiAJCQllcnIgPSBoY2lfcmVtb3ZlX2Fkdl9pbnN0YW5jZShoZGV2LCByZW1faW5zdCk7CiAJCQlpZiAoIWVycikKLQkJCQltZ210X2FkdmVydGlzaW5nX3JlbW92ZWQoTlVMTCwgaGRldiwgcmVtX2luc3QpOworCQkJCW1nbXRfYWR2ZXJ0aXNpbmdfcmVtb3ZlZChzaywgaGRldiwgcmVtX2luc3QpOwogCQl9CiAJfSBlbHNlIHsKIAkJYWR2X2luc3RhbmNlID0gaGNpX2ZpbmRfYWR2X2luc3RhbmNlKGhkZXYsIGluc3RhbmNlKTsKQEAgLTEzMjMsNyArMTM0Niw3IEBACiAKIAkJCWVyciA9IGhjaV9yZW1vdmVfYWR2X2luc3RhbmNlKGhkZXYsIGluc3RhbmNlKTsKIAkJCWlmICghZXJyKQotCQkJCW1nbXRfYWR2ZXJ0aXNpbmdfcmVtb3ZlZChOVUxMLCBoZGV2LCBpbnN0YW5jZSk7CisJCQkJbWdtdF9hZHZlcnRpc2luZ19yZW1vdmVkKHNrLCBoZGV2LCBpbnN0YW5jZSk7CiAJCX0KIAl9CiAKQEAgLTE3MTQsNyArMTczNyw3IEBACiAJCQkgKiBmdW5jdGlvbi4gVG8gYmUgc2FmZSBoYXJkLWNvZGUgb25lIG9mIHRoZQogCQkJICogdmFsdWVzIHRoYXQncyBzdWl0YWJsZSBmb3IgU0NPLgogCQkJICovCi0JCQlyZWoucmVhc29uID0gSENJX0VSUk9SX1JFTU9URV9MT1dfUkVTT1VSQ0VTOworCQkJcmVqLnJlYXNvbiA9IEhDSV9FUlJPUl9SRUpfTElNSVRFRF9SRVNPVVJDRVM7CiAKIAkJCWhjaV9yZXFfYWRkKHJlcSwgSENJX09QX1JFSkVDVF9TWU5DX0NPTk5fUkVRLAogCQkJCSAgICBzaXplb2YocmVqKSwgJnJlaik7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9yZXF1ZXN0LmggYi9uZXQvYmx1ZXRvb3RoL2hjaV9yZXF1ZXN0LmgKaW5kZXggYjJkMDQ0Yi4uYWMxZTExMCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfcmVxdWVzdC5oCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX3JlcXVlc3QuaApAQCAtNzMsOCArNzMsOSBAQAogCiBpbnQgX19oY2lfcmVxX3NjaGVkdWxlX2Fkdl9pbnN0YW5jZShzdHJ1Y3QgaGNpX3JlcXVlc3QgKnJlcSwgdTggaW5zdGFuY2UsCiAJCQkJICAgIGJvb2wgZm9yY2UpOwotdm9pZCBoY2lfcmVxX2NsZWFyX2Fkdl9pbnN0YW5jZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IGhjaV9yZXF1ZXN0ICpyZXEsCi0JCQkJdTggaW5zdGFuY2UsIGJvb2wgZm9yY2UpOwordm9pZCBoY2lfcmVxX2NsZWFyX2Fkdl9pbnN0YW5jZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNvY2sgKnNrLAorCQkJCXN0cnVjdCBoY2lfcmVxdWVzdCAqcmVxLCB1OCBpbnN0YW5jZSwKKwkJCQlib29sIGZvcmNlKTsKIAogdm9pZCBfX2hjaV9yZXFfdXBkYXRlX2NsYXNzKHN0cnVjdCBoY2lfcmVxdWVzdCAqcmVxKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfc29jay5jIGIvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCmluZGV4IDZlZjhhMDEuLjQ4Zjk0NzEgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMKQEAgLTI2LDYgKzI2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CkBAIC0zOCw2ICszOSw4IEBACiBzdGF0aWMgTElTVF9IRUFEKG1nbXRfY2hhbl9saXN0KTsKIHN0YXRpYyBERUZJTkVfTVVURVgobWdtdF9jaGFuX2xpc3RfbG9jayk7CiAKK3N0YXRpYyBERUZJTkVfSURBKHNvY2tfY29va2llX2lkYSk7CisKIHN0YXRpYyBhdG9taWNfdCBtb25pdG9yX3Byb21pc2MgPSBBVE9NSUNfSU5JVCgwKTsKIAogLyogLS0tLS0gSENJIHNvY2tldCBpbnRlcmZhY2UgLS0tLS0gKi8KQEAgLTUyLDYgKzU1LDggQEAKIAlfX3UzMiAgICAgICAgICAgICBjbXNnX21hc2s7CiAJdW5zaWduZWQgc2hvcnQgICAgY2hhbm5lbDsKIAl1bnNpZ25lZCBsb25nICAgICBmbGFnczsKKwlfX3UzMiAgICAgICAgICAgICBjb29raWU7CisJY2hhciAgICAgICAgICAgICAgY29tbVtUQVNLX0NPTU1fTEVOXTsKIH07CiAKIHZvaWQgaGNpX3NvY2tfc2V0X2ZsYWcoc3RydWN0IHNvY2sgKnNrLCBpbnQgbnIpCkBAIC03NCw2ICs3OSwzOCBAQAogCXJldHVybiBoY2lfcGkoc2spLT5jaGFubmVsOwogfQogCit1MzIgaGNpX3NvY2tfZ2V0X2Nvb2tpZShzdHJ1Y3Qgc29jayAqc2spCit7CisJcmV0dXJuIGhjaV9waShzayktPmNvb2tpZTsKK30KKworc3RhdGljIGJvb2wgaGNpX3NvY2tfZ2VuX2Nvb2tpZShzdHJ1Y3Qgc29jayAqc2spCit7CisJaW50IGlkID0gaGNpX3BpKHNrKS0+Y29va2llOworCisJaWYgKCFpZCkgeworCQlpZCA9IGlkYV9zaW1wbGVfZ2V0KCZzb2NrX2Nvb2tpZV9pZGEsIDEsIDAsIEdGUF9LRVJORUwpOworCQlpZiAoaWQgPCAwKQorCQkJaWQgPSAweGZmZmZmZmZmOworCisJCWhjaV9waShzayktPmNvb2tpZSA9IGlkOworCQlnZXRfdGFza19jb21tKGhjaV9waShzayktPmNvbW0sIGN1cnJlbnQpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9zb2NrX2ZyZWVfY29va2llKHN0cnVjdCBzb2NrICpzaykKK3sKKwlpbnQgaWQgPSBoY2lfcGkoc2spLT5jb29raWU7CisKKwlpZiAoaWQpIHsKKwkJaGNpX3BpKHNrKS0+Y29va2llID0gMHhmZmZmZmZmZjsKKwkJaWRhX3NpbXBsZV9yZW1vdmUoJnNvY2tfY29va2llX2lkYSwgaWQpOworCX0KK30KKwogc3RhdGljIGlubGluZSBpbnQgaGNpX3Rlc3RfYml0KGludCBuciwgY29uc3Qgdm9pZCAqYWRkcikKIHsKIAlyZXR1cm4gKigoY29uc3QgX191MzIgKikgYWRkciArIChuciA+PiA1KSkgJiAoKF9fdTMyKSAxIDw8IChuciAmIDMxKSk7CkBAIC0zMDUsNiArMzQyLDYwIEBACiAJa2ZyZWVfc2tiKHNrYl9jb3B5KTsKIH0KIAordm9pZCBoY2lfc2VuZF9tb25pdG9yX2N0cmxfZXZlbnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHUxNiBldmVudCwKKwkJCQkgdm9pZCAqZGF0YSwgdTE2IGRhdGFfbGVuLCBrdGltZV90IHRzdGFtcCwKKwkJCQkgaW50IGZsYWcsIHN0cnVjdCBzb2NrICpza2lwX3NrKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlfX2xlMTYgaW5kZXg7CisKKwlpZiAoaGRldikKKwkJaW5kZXggPSBjcHVfdG9fbGUxNihoZGV2LT5pZCk7CisJZWxzZQorCQlpbmRleCA9IGNwdV90b19sZTE2KE1HTVRfSU5ERVhfTk9ORSk7CisKKwlyZWFkX2xvY2soJmhjaV9za19saXN0LmxvY2spOworCisJc2tfZm9yX2VhY2goc2ssICZoY2lfc2tfbGlzdC5oZWFkKSB7CisJCXN0cnVjdCBoY2lfbW9uX2hkciAqaGRyOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCWlmIChoY2lfcGkoc2spLT5jaGFubmVsICE9IEhDSV9DSEFOTkVMX0NPTlRST0wpCisJCQljb250aW51ZTsKKworCQkvKiBJZ25vcmUgc29ja2V0IHdpdGhvdXQgdGhlIGZsYWcgc2V0ICovCisJCWlmICghaGNpX3NvY2tfdGVzdF9mbGFnKHNrLCBmbGFnKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIFNraXAgdGhlIG9yaWdpbmFsIHNvY2tldCAqLworCQlpZiAoc2sgPT0gc2tpcF9zaykKKwkJCWNvbnRpbnVlOworCisJCXNrYiA9IGJ0X3NrYl9hbGxvYyg2ICsgZGF0YV9sZW4sIEdGUF9BVE9NSUMpOworCQlpZiAoIXNrYikKKwkJCWNvbnRpbnVlOworCisJCXB1dF91bmFsaWduZWRfbGUzMihoY2lfcGkoc2spLT5jb29raWUsIHNrYl9wdXQoc2tiLCA0KSk7CisJCXB1dF91bmFsaWduZWRfbGUxNihldmVudCwgc2tiX3B1dChza2IsIDIpKTsKKworCQlpZiAoZGF0YSkKKwkJCW1lbWNweShza2JfcHV0KHNrYiwgZGF0YV9sZW4pLCBkYXRhLCBkYXRhX2xlbik7CisKKwkJc2tiLT50c3RhbXAgPSB0c3RhbXA7CisKKwkJaGRyID0gKHZvaWQgKilza2JfcHVzaChza2IsIEhDSV9NT05fSERSX1NJWkUpOworCQloZHItPm9wY29kZSA9IGNwdV90b19sZTE2KEhDSV9NT05fQ1RSTF9FVkVOVCk7CisJCWhkci0+aW5kZXggPSBpbmRleDsKKwkJaGRyLT5sZW4gPSBjcHVfdG9fbGUxNihza2ItPmxlbiAtIEhDSV9NT05fSERSX1NJWkUpOworCisJCWhjaV9zZW5kX3RvX2NoYW5uZWwoSENJX0NIQU5ORUxfTU9OSVRPUiwgc2tiLAorCQkJCSAgICBIQ0lfU09DS19UUlVTVEVELCBOVUxMKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorCisJcmVhZF91bmxvY2soJmhjaV9za19saXN0LmxvY2spOworfQorCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNyZWF0ZV9tb25pdG9yX2V2ZW50KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgZXZlbnQpCiB7CiAJc3RydWN0IGhjaV9tb25faGRyICpoZHI7CkBAIC0zODQsNiArNDc1LDEyOSBAQAogCXJldHVybiBza2I7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY3JlYXRlX21vbml0b3JfY3RybF9vcGVuKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgaGNpX21vbl9oZHIgKmhkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUxNiBmb3JtYXQ7CisJdTggdmVyWzNdOworCXUzMiBmbGFnczsKKworCS8qIE5vIG1lc3NhZ2UgbmVlZGVkIHdoZW4gY29va2llIGlzIG5vdCBwcmVzZW50ICovCisJaWYgKCFoY2lfcGkoc2spLT5jb29raWUpCisJCXJldHVybiBOVUxMOworCisJc3dpdGNoIChoY2lfcGkoc2spLT5jaGFubmVsKSB7CisJY2FzZSBIQ0lfQ0hBTk5FTF9SQVc6CisJCWZvcm1hdCA9IDB4MDAwMDsKKwkJdmVyWzBdID0gQlRfU1VCU1lTX1ZFUlNJT047CisJCXB1dF91bmFsaWduZWRfbGUxNihCVF9TVUJTWVNfUkVWSVNJT04sIHZlciArIDEpOworCQlicmVhazsKKwljYXNlIEhDSV9DSEFOTkVMX1VTRVI6CisJCWZvcm1hdCA9IDB4MDAwMTsKKwkJdmVyWzBdID0gQlRfU1VCU1lTX1ZFUlNJT047CisJCXB1dF91bmFsaWduZWRfbGUxNihCVF9TVUJTWVNfUkVWSVNJT04sIHZlciArIDEpOworCQlicmVhazsKKwljYXNlIEhDSV9DSEFOTkVMX0NPTlRST0w6CisJCWZvcm1hdCA9IDB4MDAwMjsKKwkJbWdtdF9maWxsX3ZlcnNpb25faW5mbyh2ZXIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBObyBtZXNzYWdlIGZvciB1bnN1cHBvcnRlZCBmb3JtYXQgKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2tiID0gYnRfc2tiX2FsbG9jKDE0ICsgVEFTS19DT01NX0xFTiAsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWZsYWdzID0gaGNpX3NvY2tfdGVzdF9mbGFnKHNrLCBIQ0lfU09DS19UUlVTVEVEKSA/IDB4MSA6IDB4MDsKKworCXB1dF91bmFsaWduZWRfbGUzMihoY2lfcGkoc2spLT5jb29raWUsIHNrYl9wdXQoc2tiLCA0KSk7CisJcHV0X3VuYWxpZ25lZF9sZTE2KGZvcm1hdCwgc2tiX3B1dChza2IsIDIpKTsKKwltZW1jcHkoc2tiX3B1dChza2IsIHNpemVvZih2ZXIpKSwgdmVyLCBzaXplb2YodmVyKSk7CisJcHV0X3VuYWxpZ25lZF9sZTMyKGZsYWdzLCBza2JfcHV0KHNrYiwgNCkpOworCSpza2JfcHV0KHNrYiwgMSkgPSBUQVNLX0NPTU1fTEVOOworCW1lbWNweShza2JfcHV0KHNrYiwgVEFTS19DT01NX0xFTiksIGhjaV9waShzayktPmNvbW0sIFRBU0tfQ09NTV9MRU4pOworCisJX19uZXRfdGltZXN0YW1wKHNrYik7CisKKwloZHIgPSAodm9pZCAqKXNrYl9wdXNoKHNrYiwgSENJX01PTl9IRFJfU0laRSk7CisJaGRyLT5vcGNvZGUgPSBjcHVfdG9fbGUxNihIQ0lfTU9OX0NUUkxfT1BFTik7CisJaWYgKGhjaV9waShzayktPmhkZXYpCisJCWhkci0+aW5kZXggPSBjcHVfdG9fbGUxNihoY2lfcGkoc2spLT5oZGV2LT5pZCk7CisJZWxzZQorCQloZHItPmluZGV4ID0gY3B1X3RvX2xlMTYoSENJX0RFVl9OT05FKTsKKwloZHItPmxlbiA9IGNwdV90b19sZTE2KHNrYi0+bGVuIC0gSENJX01PTl9IRFJfU0laRSk7CisKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNyZWF0ZV9tb25pdG9yX2N0cmxfY2xvc2Uoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBoY2lfbW9uX2hkciAqaGRyOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKiBObyBtZXNzYWdlIG5lZWRlZCB3aGVuIGNvb2tpZSBpcyBub3QgcHJlc2VudCAqLworCWlmICghaGNpX3BpKHNrKS0+Y29va2llKQorCQlyZXR1cm4gTlVMTDsKKworCXN3aXRjaCAoaGNpX3BpKHNrKS0+Y2hhbm5lbCkgeworCWNhc2UgSENJX0NIQU5ORUxfUkFXOgorCWNhc2UgSENJX0NIQU5ORUxfVVNFUjoKKwljYXNlIEhDSV9DSEFOTkVMX0NPTlRST0w6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIE5vIG1lc3NhZ2UgZm9yIHVuc3VwcG9ydGVkIGZvcm1hdCAqLworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlza2IgPSBidF9za2JfYWxsb2MoNCwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJcHV0X3VuYWxpZ25lZF9sZTMyKGhjaV9waShzayktPmNvb2tpZSwgc2tiX3B1dChza2IsIDQpKTsKKworCV9fbmV0X3RpbWVzdGFtcChza2IpOworCisJaGRyID0gKHZvaWQgKilza2JfcHVzaChza2IsIEhDSV9NT05fSERSX1NJWkUpOworCWhkci0+b3Bjb2RlID0gY3B1X3RvX2xlMTYoSENJX01PTl9DVFJMX0NMT1NFKTsKKwlpZiAoaGNpX3BpKHNrKS0+aGRldikKKwkJaGRyLT5pbmRleCA9IGNwdV90b19sZTE2KGhjaV9waShzayktPmhkZXYtPmlkKTsKKwllbHNlCisJCWhkci0+aW5kZXggPSBjcHVfdG9fbGUxNihIQ0lfREVWX05PTkUpOworCWhkci0+bGVuID0gY3B1X3RvX2xlMTYoc2tiLT5sZW4gLSBIQ0lfTU9OX0hEUl9TSVpFKTsKKworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY3JlYXRlX21vbml0b3JfY3RybF9jb21tYW5kKHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4LAorCQkJCQkJICAgdTE2IG9wY29kZSwgdTE2IGxlbiwKKwkJCQkJCSAgIGNvbnN0IHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGNpX21vbl9oZHIgKmhkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gYnRfc2tiX2FsbG9jKDYgKyBsZW4sIEdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCXB1dF91bmFsaWduZWRfbGUzMihoY2lfcGkoc2spLT5jb29raWUsIHNrYl9wdXQoc2tiLCA0KSk7CisJcHV0X3VuYWxpZ25lZF9sZTE2KG9wY29kZSwgc2tiX3B1dChza2IsIDIpKTsKKworCWlmIChidWYpCisJCW1lbWNweShza2JfcHV0KHNrYiwgbGVuKSwgYnVmLCBsZW4pOworCisJX19uZXRfdGltZXN0YW1wKHNrYik7CisKKwloZHIgPSAodm9pZCAqKXNrYl9wdXNoKHNrYiwgSENJX01PTl9IRFJfU0laRSk7CisJaGRyLT5vcGNvZGUgPSBjcHVfdG9fbGUxNihIQ0lfTU9OX0NUUkxfQ09NTUFORCk7CisJaGRyLT5pbmRleCA9IGNwdV90b19sZTE2KGluZGV4KTsKKwloZHItPmxlbiA9IGNwdV90b19sZTE2KHNrYi0+bGVuIC0gSENJX01PTl9IRFJfU0laRSk7CisKKwlyZXR1cm4gc2tiOworfQorCiBzdGF0aWMgdm9pZCBfX3ByaW50ZigyLCAzKQogc2VuZF9tb25pdG9yX25vdGUoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKQEAgLTQ1OCw2ICs2NzIsMjYgQEAKIAlyZWFkX3VubG9jaygmaGNpX2Rldl9saXN0X2xvY2spOwogfQogCitzdGF0aWMgdm9pZCBzZW5kX21vbml0b3JfY29udHJvbF9yZXBsYXkoc3RydWN0IHNvY2sgKm1vbl9zaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlyZWFkX2xvY2soJmhjaV9za19saXN0LmxvY2spOworCisJc2tfZm9yX2VhY2goc2ssICZoY2lfc2tfbGlzdC5oZWFkKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gY3JlYXRlX21vbml0b3JfY3RybF9vcGVuKHNrKTsKKwkJaWYgKCFza2IpCisJCQljb250aW51ZTsKKworCQlpZiAoc29ja19xdWV1ZV9yY3Zfc2tiKG1vbl9zaywgc2tiKSkKKwkJCWtmcmVlX3NrYihza2IpOworCX0KKworCXJlYWRfdW5sb2NrKCZoY2lfc2tfbGlzdC5sb2NrKTsKK30KKwogLyogR2VuZXJhdGUgaW50ZXJuYWwgc3RhY2sgZXZlbnQgKi8KIHN0YXRpYyB2b2lkIGhjaV9zaV9ldmVudChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgaW50IHR5cGUsIGludCBkbGVuLCB2b2lkICpkYXRhKQogewpAQCAtNTg1LDYgKzgxOSw3IEBACiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCUJUX0RCRygic29jayAlcCBzayAlcCIsIHNvY2ssIHNrKTsKIApAQCAtNTkzLDggKzgyOCwyNCBAQAogCiAJaGRldiA9IGhjaV9waShzayktPmhkZXY7CiAKLQlpZiAoaGNpX3BpKHNrKS0+Y2hhbm5lbCA9PSBIQ0lfQ0hBTk5FTF9NT05JVE9SKQorCXN3aXRjaCAoaGNpX3BpKHNrKS0+Y2hhbm5lbCkgeworCWNhc2UgSENJX0NIQU5ORUxfTU9OSVRPUjoKIAkJYXRvbWljX2RlYygmbW9uaXRvcl9wcm9taXNjKTsKKwkJYnJlYWs7CisJY2FzZSBIQ0lfQ0hBTk5FTF9SQVc6CisJY2FzZSBIQ0lfQ0hBTk5FTF9VU0VSOgorCWNhc2UgSENJX0NIQU5ORUxfQ09OVFJPTDoKKwkJLyogU2VuZCBldmVudCB0byBtb25pdG9yICovCisJCXNrYiA9IGNyZWF0ZV9tb25pdG9yX2N0cmxfY2xvc2Uoc2spOworCQlpZiAoc2tiKSB7CisJCQloY2lfc2VuZF90b19jaGFubmVsKEhDSV9DSEFOTkVMX01PTklUT1IsIHNrYiwKKwkJCQkJICAgIEhDSV9TT0NLX1RSVVNURUQsIE5VTEwpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KKworCQloY2lfc29ja19mcmVlX2Nvb2tpZShzayk7CisJCWJyZWFrOworCX0KIAogCWJ0X3NvY2tfdW5saW5rKCZoY2lfc2tfbGlzdCwgc2spOwogCkBAIC03MjEsNiArOTcyLDI3IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKKwkvKiBXaGVuIGNhbGxpbmcgYW4gaW9jdGwgb24gYW4gdW5ib3VuZCByYXcgc29ja2V0LCB0aGVuIGVuc3VyZQorCSAqIHRoYXQgdGhlIG1vbml0b3IgZ2V0cyBpbmZvcm1lZC4gRW5zdXJlIHRoYXQgdGhlIHJlc3VsdGluZyBldmVudAorCSAqIGlzIG9ubHkgc2VuZCBvbmNlIGJ5IGNoZWNraW5nIGlmIHRoZSBjb29raWUgZXhpc3RzIG9yIG5vdC4gVGhlCisJICogc29ja2V0IGNvb2tpZSB3aWxsIGJlIG9ubHkgZXZlciBnZW5lcmF0ZWQgb25jZSBmb3IgdGhlIGxpZmV0aW1lCisJICogb2YgYSBnaXZlbiBzb2NrZXQuCisJICovCisJaWYgKGhjaV9zb2NrX2dlbl9jb29raWUoc2spKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJaWYgKGNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQloY2lfc29ja19zZXRfZmxhZyhzaywgSENJX1NPQ0tfVFJVU1RFRCk7CisKKwkJLyogU2VuZCBldmVudCB0byBtb25pdG9yICovCisJCXNrYiA9IGNyZWF0ZV9tb25pdG9yX2N0cmxfb3Blbihzayk7CisJCWlmIChza2IpIHsKKwkJCWhjaV9zZW5kX3RvX2NoYW5uZWwoSENJX0NIQU5ORUxfTU9OSVRPUiwgc2tiLAorCQkJCQkgICAgSENJX1NPQ0tfVFJVU1RFRCwgTlVMTCk7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJfQorCX0KKwogCXJlbGVhc2Vfc29jayhzayk7CiAKIAlzd2l0Y2ggKGNtZCkgewpAQCAtNzg0LDYgKzEwNTYsNyBAQAogCXN0cnVjdCBzb2NrYWRkcl9oY2kgaGFkZHI7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGxlbiwgZXJyID0gMDsKIAogCUJUX0RCRygic29jayAlcCBzayAlcCIsIHNvY2ssIHNrKTsKQEAgLTgyMiw3ICsxMDk1LDM1IEBACiAJCQlhdG9taWNfaW5jKCZoZGV2LT5wcm9taXNjKTsKIAkJfQogCisJCWhjaV9waShzayktPmNoYW5uZWwgPSBoYWRkci5oY2lfY2hhbm5lbDsKKworCQlpZiAoIWhjaV9zb2NrX2dlbl9jb29raWUoc2spKSB7CisJCQkvKiBJbiB0aGUgY2FzZSB3aGVuIGEgY29va2llIGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQsCisJCQkgKiB0aGVuIHRoZXJlIGhhcyBiZWVuIGFscmVhZHkgYW4gaW9jdGwgaXNzdWVkIGFnYWluc3QKKwkJCSAqIGFuIHVuYm91bmQgc29ja2V0IGFuZCB3aXRoIHRoYXQgdHJpZ2dlcmQgYW4gb3BlbgorCQkJICogbm90aWZpY2F0aW9uLiBTZW5kIGEgY2xvc2Ugbm90aWZpY2F0aW9uIGZpcnN0IHRvCisJCQkgKiBhbGxvdyB0aGUgc3RhdGUgdHJhbnNpdGlvbiB0byBib3VuZGVkLgorCQkJICovCisJCQlza2IgPSBjcmVhdGVfbW9uaXRvcl9jdHJsX2Nsb3NlKHNrKTsKKwkJCWlmIChza2IpIHsKKwkJCQloY2lfc2VuZF90b19jaGFubmVsKEhDSV9DSEFOTkVMX01PTklUT1IsIHNrYiwKKwkJCQkJCSAgICBIQ0lfU09DS19UUlVTVEVELCBOVUxMKTsKKwkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCX0KKwkJfQorCisJCWlmIChjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJaGNpX3NvY2tfc2V0X2ZsYWcoc2ssIEhDSV9TT0NLX1RSVVNURUQpOworCiAJCWhjaV9waShzayktPmhkZXYgPSBoZGV2OworCisJCS8qIFNlbmQgZXZlbnQgdG8gbW9uaXRvciAqLworCQlza2IgPSBjcmVhdGVfbW9uaXRvcl9jdHJsX29wZW4oc2spOworCQlpZiAoc2tiKSB7CisJCQloY2lfc2VuZF90b19jaGFubmVsKEhDSV9DSEFOTkVMX01PTklUT1IsIHNrYiwKKwkJCQkJICAgIEhDSV9TT0NLX1RSVVNURUQsIE5VTEwpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEhDSV9DSEFOTkVMX1VTRVI6CkBAIC04ODQsOSArMTE4NSwzOCBAQAogCQkJfQogCQl9CiAKLQkJYXRvbWljX2luYygmaGRldi0+cHJvbWlzYyk7CisJCWhjaV9waShzayktPmNoYW5uZWwgPSBoYWRkci5oY2lfY2hhbm5lbDsKKworCQlpZiAoIWhjaV9zb2NrX2dlbl9jb29raWUoc2spKSB7CisJCQkvKiBJbiB0aGUgY2FzZSB3aGVuIGEgY29va2llIGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQsCisJCQkgKiB0aGlzIHNvY2tldCB3aWxsIHRyYW5zaXRpb24gZnJvbSBhIHJhdyBzb2NrZXQgaW50bworCQkJICogYW4gdXNlciBjaGFubmVsIHNvY2tldC4gRm9yIGEgY2xlYW4gdHJhbnNpdGlvbiwgc2VuZAorCQkJICogdGhlIGNsb3NlIG5vdGlmaWNhdGlvbiBmaXJzdC4KKwkJCSAqLworCQkJc2tiID0gY3JlYXRlX21vbml0b3JfY3RybF9jbG9zZShzayk7CisJCQlpZiAoc2tiKSB7CisJCQkJaGNpX3NlbmRfdG9fY2hhbm5lbChIQ0lfQ0hBTk5FTF9NT05JVE9SLCBza2IsCisJCQkJCQkgICAgSENJX1NPQ0tfVFJVU1RFRCwgTlVMTCk7CisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQl9CisJCX0KKworCQkvKiBUaGUgdXNlciBjaGFubmVsIGlzIHJlc3RyaWN0ZWQgdG8gQ0FQX05FVF9BRE1JTgorCQkgKiBjYXBhYmlsaXRpZXMgYW5kIHdpdGggdGhhdCBpbXBsaWNpdGx5IHRydXN0ZWQuCisJCSAqLworCQloY2lfc29ja19zZXRfZmxhZyhzaywgSENJX1NPQ0tfVFJVU1RFRCk7CiAKIAkJaGNpX3BpKHNrKS0+aGRldiA9IGhkZXY7CisKKwkJLyogU2VuZCBldmVudCB0byBtb25pdG9yICovCisJCXNrYiA9IGNyZWF0ZV9tb25pdG9yX2N0cmxfb3Blbihzayk7CisJCWlmIChza2IpIHsKKwkJCWhjaV9zZW5kX3RvX2NoYW5uZWwoSENJX0NIQU5ORUxfTU9OSVRPUiwgc2tiLAorCQkJCQkgICAgSENJX1NPQ0tfVFJVU1RFRCwgTlVMTCk7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJfQorCisJCWF0b21pY19pbmMoJmhkZXYtPnByb21pc2MpOwogCQlicmVhazsKIAogCWNhc2UgSENJX0NIQU5ORUxfTU9OSVRPUjoKQEAgLTkwMCw2ICsxMjMwLDggQEAKIAkJCWdvdG8gZG9uZTsKIAkJfQogCisJCWhjaV9waShzayktPmNoYW5uZWwgPSBoYWRkci5oY2lfY2hhbm5lbDsKKwogCQkvKiBUaGUgbW9uaXRvciBpbnRlcmZhY2UgaXMgcmVzdHJpY3RlZCB0byBDQVBfTkVUX1JBVwogCQkgKiBjYXBhYmlsaXRpZXMgYW5kIHdpdGggdGhhdCBpbXBsaWNpdGx5IHRydXN0ZWQuCiAJCSAqLwpAQCAtOTA4LDkgKzEyNDAsMTAgQEAKIAkJc2VuZF9tb25pdG9yX25vdGUoc2ssICJMaW51eCB2ZXJzaW9uICVzICglcykiLAogCQkJCSAgaW5pdF91dHNuYW1lKCktPnJlbGVhc2UsCiAJCQkJICBpbml0X3V0c25hbWUoKS0+bWFjaGluZSk7Ci0JCXNlbmRfbW9uaXRvcl9ub3RlKHNrLCAiQmx1ZXRvb3RoIHN1YnN5c3RlbSB2ZXJzaW9uICVzIiwKLQkJCQkgIEJUX1NVQlNZU19WRVJTSU9OKTsKKwkJc2VuZF9tb25pdG9yX25vdGUoc2ssICJCbHVldG9vdGggc3Vic3lzdGVtIHZlcnNpb24gJXUuJXUiLAorCQkJCSAgQlRfU1VCU1lTX1ZFUlNJT04sIEJUX1NVQlNZU19SRVZJU0lPTik7CiAJCXNlbmRfbW9uaXRvcl9yZXBsYXkoc2spOworCQlzZW5kX21vbml0b3JfY29udHJvbF9yZXBsYXkoc2spOwogCiAJCWF0b21pY19pbmMoJm1vbml0b3JfcHJvbWlzYyk7CiAJCWJyZWFrOwpAQCAtOTI1LDYgKzEyNTgsOCBAQAogCQkJZXJyID0gLUVQRVJNOwogCQkJZ290byBkb25lOwogCQl9CisKKwkJaGNpX3BpKHNrKS0+Y2hhbm5lbCA9IGhhZGRyLmhjaV9jaGFubmVsOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC05NDYsNiArMTI4MSw4IEBACiAJCWlmIChjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCQkJaGNpX3NvY2tfc2V0X2ZsYWcoc2ssIEhDSV9TT0NLX1RSVVNURUQpOwogCisJCWhjaV9waShzayktPmNoYW5uZWwgPSBoYWRkci5oY2lfY2hhbm5lbDsKKwogCQkvKiBBdCB0aGUgbW9tZW50IHRoZSBpbmRleCBhbmQgdW5jb25maWd1cmVkIGluZGV4IGV2ZW50cwogCQkgKiBhcmUgZW5hYmxlZCB1bmNvbmRpdGlvbmFsbHkuIFNldHRpbmcgdGhlbSBvbiBlYWNoCiAJCSAqIHNvY2tldCB3aGVuIGJpbmRpbmcga2VlcHMgdGhpcyBmdW5jdGlvbmFsaXR5LiBUaGV5CkBAIC05NTYsMTYgKzEyOTMsNDAgQEAKIAkJICogcmVjZWl2ZWQgYnkgdW50cnVzdGVkIHVzZXJzLiBFeGFtcGxlIGZvciBzdWNoIGV2ZW50cwogCQkgKiBhcmUgY2hhbmdlcyB0byBzZXR0aW5ncywgY2xhc3Mgb2YgZGV2aWNlLCBuYW1lIGV0Yy4KIAkJICovCi0JCWlmIChoYWRkci5oY2lfY2hhbm5lbCA9PSBIQ0lfQ0hBTk5FTF9DT05UUk9MKSB7CisJCWlmIChoY2lfcGkoc2spLT5jaGFubmVsID09IEhDSV9DSEFOTkVMX0NPTlRST0wpIHsKKwkJCWlmICghaGNpX3NvY2tfZ2VuX2Nvb2tpZShzaykpIHsKKwkJCQkvKiBJbiB0aGUgY2FzZSB3aGVuIGEgY29va2llIGhhcyBhbHJlYWR5IGJlZW4KKwkJCQkgKiBhc3NpZ25lZCwgdGhpcyBzb2NrZXQgd2lsbCB0cmFuc3Rpb24gZnJvbQorCQkJCSAqIGEgcmF3IHNvY2tldCBpbnRvIGEgY29udHJvbCBzb2NrZXQuIFRvCisJCQkJICogYWxsb3cgZm9yIGEgY2xlYW4gdHJhbnN0aW9uLCBzZW5kIHRoZQorCQkJCSAqIGNsb3NlIG5vdGlmaWNhdGlvbiBmaXJzdC4KKwkJCQkgKi8KKwkJCQlza2IgPSBjcmVhdGVfbW9uaXRvcl9jdHJsX2Nsb3NlKHNrKTsKKwkJCQlpZiAoc2tiKSB7CisJCQkJCWhjaV9zZW5kX3RvX2NoYW5uZWwoSENJX0NIQU5ORUxfTU9OSVRPUiwgc2tiLAorCQkJCQkJCSAgICBIQ0lfU09DS19UUlVTVEVELCBOVUxMKTsKKwkJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQkJfQorCQkJfQorCisJCQkvKiBTZW5kIGV2ZW50IHRvIG1vbml0b3IgKi8KKwkJCXNrYiA9IGNyZWF0ZV9tb25pdG9yX2N0cmxfb3Blbihzayk7CisJCQlpZiAoc2tiKSB7CisJCQkJaGNpX3NlbmRfdG9fY2hhbm5lbChIQ0lfQ0hBTk5FTF9NT05JVE9SLCBza2IsCisJCQkJCQkgICAgSENJX1NPQ0tfVFJVU1RFRCwgTlVMTCk7CisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQl9CisKIAkJCWhjaV9zb2NrX3NldF9mbGFnKHNrLCBIQ0lfTUdNVF9JTkRFWF9FVkVOVFMpOwogCQkJaGNpX3NvY2tfc2V0X2ZsYWcoc2ssIEhDSV9NR01UX1VOQ09ORl9JTkRFWF9FVkVOVFMpOwotCQkJaGNpX3NvY2tfc2V0X2ZsYWcoc2ssIEhDSV9NR01UX0dFTkVSSUNfRVZFTlRTKTsKKwkJCWhjaV9zb2NrX3NldF9mbGFnKHNrLCBIQ0lfTUdNVF9PUFRJT05fRVZFTlRTKTsKKwkJCWhjaV9zb2NrX3NldF9mbGFnKHNrLCBIQ0lfTUdNVF9TRVRUSU5HX0VWRU5UUyk7CisJCQloY2lfc29ja19zZXRfZmxhZyhzaywgSENJX01HTVRfREVWX0NMQVNTX0VWRU5UUyk7CisJCQloY2lfc29ja19zZXRfZmxhZyhzaywgSENJX01HTVRfTE9DQUxfTkFNRV9FVkVOVFMpOwogCQl9CiAJCWJyZWFrOwogCX0KIAotCi0JaGNpX3BpKHNrKS0+Y2hhbm5lbCA9IGhhZGRyLmhjaV9jaGFubmVsOwogCXNrLT5za19zdGF0ZSA9IEJUX0JPVU5EOwogCiBkb25lOgpAQCAtMTA5MSw3ICsxNDUyLDcgQEAKIAogCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOwogCi0JaWYgKG1zZy0+bXNnX2ZsYWdzICYgTVNHX1RSVU5DKQorCWlmIChmbGFncyAmIE1TR19UUlVOQykKIAkJY29waWVkID0gc2tibGVuOwogCiAJcmV0dXJuIGVyciA/IDogY29waWVkOwpAQCAtMTEzMyw2ICsxNDk0LDE5IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKKwlpZiAoY2hhbi0+Y2hhbm5lbCA9PSBIQ0lfQ0hBTk5FTF9DT05UUk9MKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJLyogU2VuZCBldmVudCB0byBtb25pdG9yICovCisJCXNrYiA9IGNyZWF0ZV9tb25pdG9yX2N0cmxfY29tbWFuZChzaywgaW5kZXgsIG9wY29kZSwgbGVuLAorCQkJCQkJICBidWYgKyBzaXplb2YoKmhkcikpOworCQlpZiAoc2tiKSB7CisJCQloY2lfc2VuZF90b19jaGFubmVsKEhDSV9DSEFOTkVMX01PTklUT1IsIHNrYiwKKwkJCQkJICAgIEhDSV9TT0NLX1RSVVNURUQsIE5VTEwpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KKwl9CisKIAlpZiAob3Bjb2RlID49IGNoYW4tPmhhbmRsZXJfY291bnQgfHwKIAkgICAgY2hhbi0+aGFuZGxlcnNbb3Bjb2RlXS5mdW5jID09IE5VTEwpIHsKIAkJQlRfREJHKCJVbmtub3duIG9wICV1Iiwgb3Bjb2RlKTsKQEAgLTE0NDAsNiArMTgxNCw5IEBACiAKIAlCVF9EQkcoInNrICVwLCBvcHQgJWQiLCBzaywgb3B0bmFtZSk7CiAKKwlpZiAobGV2ZWwgIT0gU09MX0hDSSkKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwogCWxvY2tfc29jayhzayk7CiAKIAlpZiAoaGNpX3BpKHNrKS0+Y2hhbm5lbCAhPSBIQ0lfQ0hBTk5FTF9SQVcpIHsKQEAgLTE1MjMsNiArMTkwMCw5IEBACiAKIAlCVF9EQkcoInNrICVwLCBvcHQgJWQiLCBzaywgb3B0bmFtZSk7CiAKKwlpZiAobGV2ZWwgIT0gU09MX0hDSSkKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwogCWlmIChnZXRfdXNlcihsZW4sIG9wdGxlbikpCiAJCXJldHVybiAtRUZBVUxUOwogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX2NvcmUuYyBiL25ldC9ibHVldG9vdGgvbDJjYXBfY29yZS5jCmluZGV4IDU0Y2ViMWYuLmQ0Y2FkMjliMCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKQEAgLTMyLDYgKzMyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMxNi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgogCiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CkBAIC01ODM1LDYgKzU4MzYsOSBAQAogCQlpZiAoY2hhbi0+c2R1KQogCQkJYnJlYWs7CiAKKwkJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgTDJDQVBfU0RVTEVOX1NJWkUpKQorCQkJYnJlYWs7CisKIAkJY2hhbi0+c2R1X2xlbiA9IGdldF91bmFsaWduZWRfbGUxNihza2ItPmRhdGEpOwogCQlza2JfcHVsbChza2IsIEwyQ0FQX1NEVUxFTl9TSVpFKTsKIApAQCAtNjYxMCw2ICs2NjE0LDEwIEBACiAJCWdvdG8gZHJvcDsKIAl9CiAKKwlpZiAoKGNoYW4tPm1vZGUgPT0gTDJDQVBfTU9ERV9FUlRNIHx8CisJICAgICBjaGFuLT5tb2RlID09IEwyQ0FQX01PREVfU1RSRUFNSU5HKSAmJiBza19maWx0ZXIoY2hhbi0+ZGF0YSwgc2tiKSkKKwkJZ290byBkcm9wOworCiAJaWYgKCFjb250cm9sLT5zZnJhbWUpIHsKIAkJaW50IGVycjsKIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suYwppbmRleCAxODQyMTQxLi5hOGJhNzUyIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suYworKysgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suYwpAQCAtMTAxOSw3ICsxMDE5LDcgQEAKIAkJZ290byBkb25lOwogCiAJaWYgKHBpLT5yeF9idXN5X3NrYikgewotCQlpZiAoIXNvY2tfcXVldWVfcmN2X3NrYihzaywgcGktPnJ4X2J1c3lfc2tiKSkKKwkJaWYgKCFfX3NvY2tfcXVldWVfcmN2X3NrYihzaywgcGktPnJ4X2J1c3lfc2tiKSkKIAkJCXBpLT5yeF9idXN5X3NrYiA9IE5VTEw7CiAJCWVsc2UKIAkJCWdvdG8gZG9uZTsKQEAgLTEyNzAsNyArMTI3MCwxNyBAQAogCQlnb3RvIGRvbmU7CiAJfQogCi0JZXJyID0gc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpOworCWlmIChjaGFuLT5tb2RlICE9IEwyQ0FQX01PREVfRVJUTSAmJgorCSAgICBjaGFuLT5tb2RlICE9IEwyQ0FQX01PREVfU1RSRUFNSU5HKSB7CisJCS8qIEV2ZW4gaWYgbm8gZmlsdGVyIGlzIGF0dGFjaGVkLCB3ZSBjb3VsZCBwb3RlbnRpYWxseQorCQkgKiBnZXQgZXJyb3JzIGZyb20gc2VjdXJpdHkgbW9kdWxlcywgZXRjLgorCQkgKi8KKwkJZXJyID0gc2tfZmlsdGVyKHNrLCBza2IpOworCQlpZiAoZXJyKQorCQkJZ290byBkb25lOworCX0KKworCWVyciA9IF9fc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpOwogCiAJLyogRm9yIEVSVE0sIGhhbmRsZSBvbmUgc2tiIHRoYXQgZG9lc24ndCBmaXQgaW50byB0aGUgcmVjdgogCSAqIGJ1ZmZlci4gIFRoaXMgaXMgaW1wb3J0YW50IHRvIGRvIGJlY2F1c2UgdGhlIGRhdGEgZnJhbWVzCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2xlZHMuYyBiL25ldC9ibHVldG9vdGgvbGVkcy5jCmluZGV4IDgzMTljODQuLmNiNjcwYjUgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvbGVkcy5jCisrKyBiL25ldC9ibHVldG9vdGgvbGVkcy5jCkBAIC0xMSw2ICsxMSw4IEBACiAKICNpbmNsdWRlICJsZWRzLmgiCiAKK0RFRklORV9MRURfVFJJR0dFUihidF9wb3dlcl9sZWRfdHJpZ2dlcik7CisKIHN0cnVjdCBoY2lfYmFzaWNfbGVkX3RyaWdnZXIgewogCXN0cnVjdCBsZWRfdHJpZ2dlcglsZWRfdHJpZ2dlcjsKIAlzdHJ1Y3QgaGNpX2RldgkJKmhkZXY7CkBAIC0yNCw2ICsyNiwyMSBAQAogCWlmIChoZGV2LT5wb3dlcl9sZWQpCiAJCWxlZF90cmlnZ2VyX2V2ZW50KGhkZXYtPnBvd2VyX2xlZCwKIAkJCQkgIGVuYWJsZWQgPyBMRURfRlVMTCA6IExFRF9PRkYpOworCisJaWYgKCFlbmFibGVkKSB7CisJCXN0cnVjdCBoY2lfZGV2ICpkOworCisJCXJlYWRfbG9jaygmaGNpX2Rldl9saXN0X2xvY2spOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmhjaV9kZXZfbGlzdCwgbGlzdCkgeworCQkJaWYgKHRlc3RfYml0KEhDSV9VUCwgJmQtPmZsYWdzKSkKKwkJCQllbmFibGVkID0gdHJ1ZTsKKwkJfQorCisJCXJlYWRfdW5sb2NrKCZoY2lfZGV2X2xpc3RfbG9jayk7CisJfQorCisJbGVkX3RyaWdnZXJfZXZlbnQoYnRfcG93ZXJfbGVkX3RyaWdnZXIsIGVuYWJsZWQgPyBMRURfRlVMTCA6IExFRF9PRkYpOwogfQogCiBzdGF0aWMgdm9pZCBwb3dlcl9hY3RpdmF0ZShzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldikKQEAgLTcyLDMgKzg5LDEzIEBACiAJLyogaW5pdGlhbGl6ZSBwb3dlcl9sZWQgKi8KIAloZGV2LT5wb3dlcl9sZWQgPSBsZWRfYWxsb2NhdGVfYmFzaWMoaGRldiwgcG93ZXJfYWN0aXZhdGUsICJwb3dlciIpOwogfQorCit2b2lkIGJ0X2xlZHNfaW5pdCh2b2lkKQoreworCWxlZF90cmlnZ2VyX3JlZ2lzdGVyX3NpbXBsZSgiYmx1ZXRvb3RoLXBvd2VyIiwgJmJ0X3Bvd2VyX2xlZF90cmlnZ2VyKTsKK30KKwordm9pZCBidF9sZWRzX2NsZWFudXAodm9pZCkKK3sKKwlsZWRfdHJpZ2dlcl91bnJlZ2lzdGVyX3NpbXBsZShidF9wb3dlcl9sZWRfdHJpZ2dlcik7Cit9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2xlZHMuaCBiL25ldC9ibHVldG9vdGgvbGVkcy5oCmluZGV4IGE5YzRkNmUuLjA4NzI1YTIgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvbGVkcy5oCisrKyBiL25ldC9ibHVldG9vdGgvbGVkcy5oCkBAIC03LDEwICs3LDIwIEBACiAgKi8KIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0JUX0xFRFMpCisKIHZvaWQgaGNpX2xlZHNfdXBkYXRlX3Bvd2VyZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJvb2wgZW5hYmxlZCk7CiB2b2lkIGhjaV9sZWRzX2luaXQoc3RydWN0IGhjaV9kZXYgKmhkZXYpOworCit2b2lkIGJ0X2xlZHNfaW5pdCh2b2lkKTsKK3ZvaWQgYnRfbGVkc19jbGVhbnVwKHZvaWQpOworCiAjZWxzZQorCiBzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2xlZHNfdXBkYXRlX3Bvd2VyZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsCiAJCQkJCSAgIGJvb2wgZW5hYmxlZCkge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfbGVkc19pbml0KHN0cnVjdCBoY2lfZGV2ICpoZGV2KSB7fQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnRfbGVkc19pbml0KHZvaWQpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgYnRfbGVkc19jbGVhbnVwKHZvaWQpIHt9CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9tZ210LmMgYi9uZXQvYmx1ZXRvb3RoL21nbXQuYwppbmRleCA3NjM5MjkwLi4xOWI4YTVlIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL21nbXQuYworKysgYi9uZXQvYmx1ZXRvb3RoL21nbXQuYwpAQCAtMzgsNyArMzgsNyBAQAogI2luY2x1ZGUgIm1nbXRfdXRpbC5oIgogCiAjZGVmaW5lIE1HTVRfVkVSU0lPTgkxCi0jZGVmaW5lIE1HTVRfUkVWSVNJT04JMTMKKyNkZWZpbmUgTUdNVF9SRVZJU0lPTgkxNAogCiBzdGF0aWMgY29uc3QgdTE2IG1nbXRfY29tbWFuZHNbXSA9IHsKIAlNR01UX09QX1JFQURfSU5ERVhfTElTVCwKQEAgLTEwNCw2ICsxMDQsOCBAQAogCU1HTVRfT1BfUkVNT1ZFX0FEVkVSVElTSU5HLAogCU1HTVRfT1BfR0VUX0FEVl9TSVpFX0lORk8sCiAJTUdNVF9PUF9TVEFSVF9MSU1JVEVEX0RJU0NPVkVSWSwKKwlNR01UX09QX1JFQURfRVhUX0lORk8sCisJTUdNVF9PUF9TRVRfQVBQRUFSQU5DRSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MTYgbWdtdF9ldmVudHNbXSA9IHsKQEAgLTE0MSw2ICsxNDMsNyBAQAogCU1HTVRfRVZfTE9DQUxfT09CX0RBVEFfVVBEQVRFRCwKIAlNR01UX0VWX0FEVkVSVElTSU5HX0FEREVELAogCU1HTVRfRVZfQURWRVJUSVNJTkdfUkVNT1ZFRCwKKwlNR01UX0VWX0VYVF9JTkZPX0NIQU5HRUQsCiB9OwogCiBzdGF0aWMgY29uc3QgdTE2IG1nbXRfdW50cnVzdGVkX2NvbW1hbmRzW10gPSB7CkBAIC0xNDksNiArMTUyLDcgQEAKIAlNR01UX09QX1JFQURfVU5DT05GX0lOREVYX0xJU1QsCiAJTUdNVF9PUF9SRUFEX0NPTkZJR19JTkZPLAogCU1HTVRfT1BfUkVBRF9FWFRfSU5ERVhfTElTVCwKKwlNR01UX09QX1JFQURfRVhUX0lORk8sCiB9OwogCiBzdGF0aWMgY29uc3QgdTE2IG1nbXRfdW50cnVzdGVkX2V2ZW50c1tdID0gewpAQCAtMTYyLDYgKzE2Niw3IEBACiAJTUdNVF9FVl9ORVdfQ09ORklHX09QVElPTlMsCiAJTUdNVF9FVl9FWFRfSU5ERVhfQURERUQsCiAJTUdNVF9FVl9FWFRfSU5ERVhfUkVNT1ZFRCwKKwlNR01UX0VWX0VYVF9JTkZPX0NIQU5HRUQsCiB9OwogCiAjZGVmaW5lIENBQ0hFX1RJTUVPVVQJbXNlY3NfdG9famlmZmllcygyICogMTAwMCkKQEAgLTI1NiwxMyArMjYxLDYgQEAKIAkJCSAgICAgICBmbGFnLCBza2lwX3NrKTsKIH0KIAotc3RhdGljIGludCBtZ210X2dlbmVyaWNfZXZlbnQodTE2IGV2ZW50LCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAqZGF0YSwKLQkJCSAgICAgIHUxNiBsZW4sIHN0cnVjdCBzb2NrICpza2lwX3NrKQotewotCXJldHVybiBtZ210X3NlbmRfZXZlbnQoZXZlbnQsIGhkZXYsIEhDSV9DSEFOTkVMX0NPTlRST0wsIGRhdGEsIGxlbiwKLQkJCSAgICAgICBIQ0lfTUdNVF9HRU5FUklDX0VWRU5UUywgc2tpcF9zayk7Ci19Ci0KIHN0YXRpYyBpbnQgbWdtdF9ldmVudCh1MTYgZXZlbnQsIHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB2b2lkICpkYXRhLCB1MTYgbGVuLAogCQkgICAgICBzdHJ1Y3Qgc29jayAqc2tpcF9zaykKIHsKQEAgLTI3OCw2ICsyNzYsMTQgQEAKIAkJcmV0dXJuIEFERFJfTEVfREVWX1JBTkRPTTsKIH0KIAordm9pZCBtZ210X2ZpbGxfdmVyc2lvbl9pbmZvKHZvaWQgKnZlcikKK3sKKwlzdHJ1Y3QgbWdtdF9ycF9yZWFkX3ZlcnNpb24gKnJwID0gdmVyOworCisJcnAtPnZlcnNpb24gPSBNR01UX1ZFUlNJT047CisJcnAtPnJldmlzaW9uID0gY3B1X3RvX2xlMTYoTUdNVF9SRVZJU0lPTik7Cit9CisKIHN0YXRpYyBpbnQgcmVhZF92ZXJzaW9uKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGhjaV9kZXYgKmhkZXYsIHZvaWQgKmRhdGEsCiAJCQl1MTYgZGF0YV9sZW4pCiB7CkBAIC0yODUsOCArMjkxLDcgQEAKIAogCUJUX0RCRygic29jayAlcCIsIHNrKTsKIAotCXJwLnZlcnNpb24gPSBNR01UX1ZFUlNJT047Ci0JcnAucmV2aXNpb24gPSBjcHVfdG9fbGUxNihNR01UX1JFVklTSU9OKTsKKwltZ210X2ZpbGxfdmVyc2lvbl9pbmZvKCZycCk7CiAKIAlyZXR1cm4gbWdtdF9jbWRfY29tcGxldGUoc2ssIE1HTVRfSU5ERVhfTk9ORSwgTUdNVF9PUF9SRUFEX1ZFUlNJT04sIDAsCiAJCQkJICZycCwgc2l6ZW9mKHJwKSk7CkBAIC01NzIsOCArNTc3LDggQEAKIHsKIAlfX2xlMzIgb3B0aW9ucyA9IGdldF9taXNzaW5nX29wdGlvbnMoaGRldik7CiAKLQlyZXR1cm4gbWdtdF9nZW5lcmljX2V2ZW50KE1HTVRfRVZfTkVXX0NPTkZJR19PUFRJT05TLCBoZGV2LCAmb3B0aW9ucywKLQkJCQkgIHNpemVvZihvcHRpb25zKSwgc2tpcCk7CisJcmV0dXJuIG1nbXRfbGltaXRlZF9ldmVudChNR01UX0VWX05FV19DT05GSUdfT1BUSU9OUywgaGRldiwgJm9wdGlvbnMsCisJCQkJICBzaXplb2Yob3B0aW9ucyksIEhDSV9NR01UX09QVElPTl9FVkVOVFMsIHNraXApOwogfQogCiBzdGF0aWMgaW50IHNlbmRfb3B0aW9uc19yc3Aoc3RydWN0IHNvY2sgKnNrLCB1MTYgb3Bjb2RlLCBzdHJ1Y3QgaGNpX2RldiAqaGRldikKQEAgLTg2Miw2ICs4NjcsMTA3IEBACiAJCQkJIHNpemVvZihycCkpOwogfQogCitzdGF0aWMgaW5saW5lIHUxNiBlaXJfYXBwZW5kX2RhdGEodTggKmVpciwgdTE2IGVpcl9sZW4sIHU4IHR5cGUsIHU4ICpkYXRhLAorCQkJCSAgdTggZGF0YV9sZW4pCit7CisJZWlyW2Vpcl9sZW4rK10gPSBzaXplb2YodHlwZSkgKyBkYXRhX2xlbjsKKwllaXJbZWlyX2xlbisrXSA9IHR5cGU7CisJbWVtY3B5KCZlaXJbZWlyX2xlbl0sIGRhdGEsIGRhdGFfbGVuKTsKKwllaXJfbGVuICs9IGRhdGFfbGVuOworCisJcmV0dXJuIGVpcl9sZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGVpcl9hcHBlbmRfbGUxNih1OCAqZWlyLCB1MTYgZWlyX2xlbiwgdTggdHlwZSwgdTE2IGRhdGEpCit7CisJZWlyW2Vpcl9sZW4rK10gPSBzaXplb2YodHlwZSkgKyBzaXplb2YoZGF0YSk7CisJZWlyW2Vpcl9sZW4rK10gPSB0eXBlOworCXB1dF91bmFsaWduZWRfbGUxNihkYXRhLCAmZWlyW2Vpcl9sZW5dKTsKKwllaXJfbGVuICs9IHNpemVvZihkYXRhKTsKKworCXJldHVybiBlaXJfbGVuOworfQorCitzdGF0aWMgdTE2IGFwcGVuZF9laXJfZGF0YV90b19idWYoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4ICplaXIpCit7CisJdTE2IGVpcl9sZW4gPSAwOworCXNpemVfdCBuYW1lX2xlbjsKKworCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQlJFRFJfRU5BQkxFRCkpCisJCWVpcl9sZW4gPSBlaXJfYXBwZW5kX2RhdGEoZWlyLCBlaXJfbGVuLCBFSVJfQ0xBU1NfT0ZfREVWLAorCQkJCQkgIGhkZXYtPmRldl9jbGFzcywgMyk7CisKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX0VOQUJMRUQpKQorCQllaXJfbGVuID0gZWlyX2FwcGVuZF9sZTE2KGVpciwgZWlyX2xlbiwgRUlSX0FQUEVBUkFOQ0UsCisJCQkJCSAgaGRldi0+YXBwZWFyYW5jZSk7CisKKwluYW1lX2xlbiA9IHN0cmxlbihoZGV2LT5kZXZfbmFtZSk7CisJZWlyX2xlbiA9IGVpcl9hcHBlbmRfZGF0YShlaXIsIGVpcl9sZW4sIEVJUl9OQU1FX0NPTVBMRVRFLAorCQkJCSAgaGRldi0+ZGV2X25hbWUsIG5hbWVfbGVuKTsKKworCW5hbWVfbGVuID0gc3RybGVuKGhkZXYtPnNob3J0X25hbWUpOworCWVpcl9sZW4gPSBlaXJfYXBwZW5kX2RhdGEoZWlyLCBlaXJfbGVuLCBFSVJfTkFNRV9TSE9SVCwKKwkJCQkgIGhkZXYtPnNob3J0X25hbWUsIG5hbWVfbGVuKTsKKworCXJldHVybiBlaXJfbGVuOworfQorCitzdGF0aWMgaW50IHJlYWRfZXh0X2NvbnRyb2xsZXJfaW5mbyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBoY2lfZGV2ICpoZGV2LAorCQkJCSAgICB2b2lkICpkYXRhLCB1MTYgZGF0YV9sZW4pCit7CisJY2hhciBidWZbNTEyXTsKKwlzdHJ1Y3QgbWdtdF9ycF9yZWFkX2V4dF9pbmZvICpycCA9ICh2b2lkICopYnVmOworCXUxNiBlaXJfbGVuOworCisJQlRfREJHKCJzb2NrICVwICVzIiwgc2ssIGhkZXYtPm5hbWUpOworCisJbWVtc2V0KCZidWYsIDAsIHNpemVvZihidWYpKTsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCWJhY3B5KCZycC0+YmRhZGRyLCAmaGRldi0+YmRhZGRyKTsKKworCXJwLT52ZXJzaW9uID0gaGRldi0+aGNpX3ZlcjsKKwlycC0+bWFudWZhY3R1cmVyID0gY3B1X3RvX2xlMTYoaGRldi0+bWFudWZhY3R1cmVyKTsKKworCXJwLT5zdXBwb3J0ZWRfc2V0dGluZ3MgPSBjcHVfdG9fbGUzMihnZXRfc3VwcG9ydGVkX3NldHRpbmdzKGhkZXYpKTsKKwlycC0+Y3VycmVudF9zZXR0aW5ncyA9IGNwdV90b19sZTMyKGdldF9jdXJyZW50X3NldHRpbmdzKGhkZXYpKTsKKworCisJZWlyX2xlbiA9IGFwcGVuZF9laXJfZGF0YV90b19idWYoaGRldiwgcnAtPmVpcik7CisJcnAtPmVpcl9sZW4gPSBjcHVfdG9fbGUxNihlaXJfbGVuKTsKKworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCisJLyogSWYgdGhpcyBjb21tYW5kIGlzIGNhbGxlZCBhdCBsZWFzdCBvbmNlLCB0aGVuIHRoZSBldmVudHMKKwkgKiBmb3IgY2xhc3Mgb2YgZGV2aWNlIGFuZCBsb2NhbCBuYW1lIGNoYW5nZXMgYXJlIGRpc2FibGVkCisJICogYW5kIG9ubHkgdGhlIG5ldyBleHRlbmRlZCBjb250cm9sbGVyIGluZm9ybWF0aW9uIGV2ZW50CisJICogaXMgdXNlZC4KKwkgKi8KKwloY2lfc29ja19zZXRfZmxhZyhzaywgSENJX01HTVRfRVhUX0lORk9fRVZFTlRTKTsKKwloY2lfc29ja19jbGVhcl9mbGFnKHNrLCBIQ0lfTUdNVF9ERVZfQ0xBU1NfRVZFTlRTKTsKKwloY2lfc29ja19jbGVhcl9mbGFnKHNrLCBIQ0lfTUdNVF9MT0NBTF9OQU1FX0VWRU5UUyk7CisKKwlyZXR1cm4gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1JFQURfRVhUX0lORk8sIDAsIHJwLAorCQkJCSBzaXplb2YoKnJwKSArIGVpcl9sZW4pOworfQorCitzdGF0aWMgaW50IGV4dF9pbmZvX2NoYW5nZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBzb2NrICpza2lwKQoreworCWNoYXIgYnVmWzUxMl07CisJc3RydWN0IG1nbXRfZXZfZXh0X2luZm9fY2hhbmdlZCAqZXYgPSAodm9pZCAqKWJ1ZjsKKwl1MTYgZWlyX2xlbjsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKworCWVpcl9sZW4gPSBhcHBlbmRfZWlyX2RhdGFfdG9fYnVmKGhkZXYsIGV2LT5laXIpOworCWV2LT5laXJfbGVuID0gY3B1X3RvX2xlMTYoZWlyX2xlbik7CisKKwlyZXR1cm4gbWdtdF9saW1pdGVkX2V2ZW50KE1HTVRfRVZfRVhUX0lORk9fQ0hBTkdFRCwgaGRldiwgZXYsCisJCQkJICBzaXplb2YoKmV2KSArIGVpcl9sZW4sCisJCQkJICBIQ0lfTUdNVF9FWFRfSU5GT19FVkVOVFMsIHNraXApOworfQorCiBzdGF0aWMgaW50IHNlbmRfc2V0dGluZ3NfcnNwKHN0cnVjdCBzb2NrICpzaywgdTE2IG9wY29kZSwgc3RydWN0IGhjaV9kZXYgKmhkZXYpCiB7CiAJX19sZTMyIHNldHRpbmdzID0gY3B1X3RvX2xlMzIoZ2V0X2N1cnJlbnRfc2V0dGluZ3MoaGRldikpOwpAQCAtOTIyLDcgKzEwMjgsNyBAQAogCQloY2lfcmVxX2FkZCgmcmVxLCBIQ0lfT1BfV1JJVEVfU0NBTl9FTkFCTEUsIDEsICZzY2FuKTsKIAl9CiAKLQloY2lfcmVxX2NsZWFyX2Fkdl9pbnN0YW5jZShoZGV2LCBOVUxMLCAweDAwLCBmYWxzZSk7CisJaGNpX3JlcV9jbGVhcl9hZHZfaW5zdGFuY2UoaGRldiwgTlVMTCwgTlVMTCwgMHgwMCwgZmFsc2UpOwogCiAJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9BRFYpKQogCQlfX2hjaV9yZXFfZGlzYWJsZV9hZHZlcnRpc2luZygmcmVxKTsKQEAgLTEwMDAsOCArMTEwNiw4IEBACiB7CiAJX19sZTMyIGV2ID0gY3B1X3RvX2xlMzIoZ2V0X2N1cnJlbnRfc2V0dGluZ3MoaGRldikpOwogCi0JcmV0dXJuIG1nbXRfZ2VuZXJpY19ldmVudChNR01UX0VWX05FV19TRVRUSU5HUywgaGRldiwgJmV2LAotCQkJCSAgc2l6ZW9mKGV2KSwgc2tpcCk7CisJcmV0dXJuIG1nbXRfbGltaXRlZF9ldmVudChNR01UX0VWX05FV19TRVRUSU5HUywgaGRldiwgJmV2LAorCQkJCSAgc2l6ZW9mKGV2KSwgSENJX01HTVRfU0VUVElOR19FVkVOVFMsIHNraXApOwogfQogCiBpbnQgbWdtdF9uZXdfc2V0dGluZ3Moc3RydWN0IGhjaV9kZXYgKmhkZXYpCkBAIC0xNjkwLDcgKzE3OTYsNyBAQAogCWVuYWJsZWQgPSBsbXBfaG9zdF9sZV9jYXBhYmxlKGhkZXYpOwogCiAJaWYgKCF2YWwpCi0JCWhjaV9yZXFfY2xlYXJfYWR2X2luc3RhbmNlKGhkZXYsIE5VTEwsIDB4MDAsIHRydWUpOworCQloY2lfcmVxX2NsZWFyX2Fkdl9pbnN0YW5jZShoZGV2LCBOVUxMLCBOVUxMLCAweDAwLCB0cnVlKTsKIAogCWlmICghaGRldl9pc19wb3dlcmVkKGhkZXYpIHx8IHZhbCA9PSBlbmFibGVkKSB7CiAJCWJvb2wgY2hhbmdlZCA9IGZhbHNlOwpAQCAtMjQzNSw2ICsyNTQxLDggQEAKIAlpZiAoIWNtZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwljbWQtPmNtZF9jb21wbGV0ZSA9IGFkZHJfY21kX2NvbXBsZXRlOworCiAJZXJyID0gaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9QSU5fQ09ERV9ORUdfUkVQTFksCiAJCQkgICBzaXplb2YoY3AtPmFkZHIuYmRhZGRyKSwgJmNwLT5hZGRyLmJkYWRkcik7CiAJaWYgKGVyciA8IDApCkBAIC0yNTEzLDggKzI2MjEsOCBAQAogCUJUX0RCRygiIik7CiAKIAlpZiAoY3AtPmlvX2NhcGFiaWxpdHkgPiBTTVBfSU9fS0VZQk9BUkRfRElTUExBWSkKLQkJcmV0dXJuIG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfSU9fQ0FQQUJJTElUWSwKLQkJCQkJIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLCBOVUxMLCAwKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0lPX0NBUEFCSUxJVFksCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIApAQCAtMjkzMiw2ICszMDQwLDM1IEBACiAJCQkJIEhDSV9PUF9VU0VSX1BBU1NLRVlfTkVHX1JFUExZLCAwKTsKIH0KIAorc3RhdGljIHZvaWQgYWR2X2V4cGlyZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTMyIGZsYWdzKQoreworCXN0cnVjdCBhZHZfaW5mbyAqYWR2X2luc3RhbmNlOworCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CisJaW50IGVycjsKKworCWFkdl9pbnN0YW5jZSA9IGhjaV9maW5kX2Fkdl9pbnN0YW5jZShoZGV2LCBoZGV2LT5jdXJfYWR2X2luc3RhbmNlKTsKKwlpZiAoIWFkdl9pbnN0YW5jZSkKKwkJcmV0dXJuOworCisJLyogc3RvcCBpZiBjdXJyZW50IGluc3RhbmNlIGRvZXNuJ3QgbmVlZCB0byBiZSBjaGFuZ2VkICovCisJaWYgKCEoYWR2X2luc3RhbmNlLT5mbGFncyAmIGZsYWdzKSkKKwkJcmV0dXJuOworCisJY2FuY2VsX2Fkdl90aW1lb3V0KGhkZXYpOworCisJYWR2X2luc3RhbmNlID0gaGNpX2dldF9uZXh0X2luc3RhbmNlKGhkZXYsIGFkdl9pbnN0YW5jZS0+aW5zdGFuY2UpOworCWlmICghYWR2X2luc3RhbmNlKQorCQlyZXR1cm47CisKKwloY2lfcmVxX2luaXQoJnJlcSwgaGRldik7CisJZXJyID0gX19oY2lfcmVxX3NjaGVkdWxlX2Fkdl9pbnN0YW5jZSgmcmVxLCBhZHZfaW5zdGFuY2UtPmluc3RhbmNlLAorCQkJCQkgICAgICB0cnVlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm47CisKKwloY2lfcmVxX3J1bigmcmVxLCBOVUxMKTsKK30KKwogc3RhdGljIHZvaWQgc2V0X25hbWVfY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IHN0YXR1cywgdTE2IG9wY29kZSkKIHsKIAlzdHJ1Y3QgbWdtdF9jcF9zZXRfbG9jYWxfbmFtZSAqY3A7CkBAIC0yOTQ3LDEzICszMDg0LDE3IEBACiAKIAljcCA9IGNtZC0+cGFyYW07CiAKLQlpZiAoc3RhdHVzKQorCWlmIChzdGF0dXMpIHsKIAkJbWdtdF9jbWRfc3RhdHVzKGNtZC0+c2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9MT0NBTF9OQU1FLAogCQkJICAgICAgICBtZ210X3N0YXR1cyhzdGF0dXMpKTsKLQllbHNlCisJfSBlbHNlIHsKIAkJbWdtdF9jbWRfY29tcGxldGUoY21kLT5zaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0xPQ0FMX05BTUUsIDAsCiAJCQkJICBjcCwgc2l6ZW9mKCpjcCkpOwogCisJCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTEVfQURWKSkKKwkJCWFkdl9leHBpcmUoaGRldiwgTUdNVF9BRFZfRkxBR19MT0NBTF9OQU1FKTsKKwl9CisKIAltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CiAKIHVubG9jazoKQEAgLTI5OTMsOCArMzEzNCw5IEBACiAJCWlmIChlcnIgPCAwKQogCQkJZ290byBmYWlsZWQ7CiAKLQkJZXJyID0gbWdtdF9nZW5lcmljX2V2ZW50KE1HTVRfRVZfTE9DQUxfTkFNRV9DSEFOR0VELCBoZGV2LAotCQkJCQkgZGF0YSwgbGVuLCBzayk7CisJCWVyciA9IG1nbXRfbGltaXRlZF9ldmVudChNR01UX0VWX0xPQ0FMX05BTUVfQ0hBTkdFRCwgaGRldiwgZGF0YSwKKwkJCQkJIGxlbiwgSENJX01HTVRfTE9DQUxfTkFNRV9FVkVOVFMsIHNrKTsKKwkJZXh0X2luZm9fY2hhbmdlZChoZGV2LCBzayk7CiAKIAkJZ290byBmYWlsZWQ7CiAJfQpAQCAtMzAxNyw3ICszMTU5LDcgQEAKIAkvKiBUaGUgbmFtZSBpcyBzdG9yZWQgaW4gdGhlIHNjYW4gcmVzcG9uc2UgZGF0YSBhbmQgc28KIAkgKiBubyBuZWVkIHRvIHVkcGF0ZSB0aGUgYWR2ZXJ0aXNpbmcgZGF0YSBoZXJlLgogCSAqLwotCWlmIChsbXBfbGVfY2FwYWJsZShoZGV2KSkKKwlpZiAobG1wX2xlX2NhcGFibGUoaGRldikgJiYgaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0FEVkVSVElTSU5HKSkKIAkJX19oY2lfcmVxX3VwZGF0ZV9zY2FuX3JzcF9kYXRhKCZyZXEsIGhkZXYtPmN1cl9hZHZfaW5zdGFuY2UpOwogCiAJZXJyID0gaGNpX3JlcV9ydW4oJnJlcSwgc2V0X25hbWVfY29tcGxldGUpOwpAQCAtMzAyOSw2ICszMTcxLDQwIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBzZXRfYXBwZWFyYW5jZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB2b2lkICpkYXRhLAorCQkJICB1MTYgbGVuKQoreworCXN0cnVjdCBtZ210X2NwX3NldF9hcHBlYXJhbmNlICpjcCA9IGRhdGE7CisJdTE2IGFwcGVyYW5jZTsKKwlpbnQgZXJyOworCisJQlRfREJHKCIiKTsKKworCWlmICghbG1wX2xlX2NhcGFibGUoaGRldikpCisJCXJldHVybiBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9BUFBFQVJBTkNFLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVEKTsKKworCWFwcGVyYW5jZSA9IGxlMTZfdG9fY3B1KGNwLT5hcHBlYXJhbmNlKTsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCWlmIChoZGV2LT5hcHBlYXJhbmNlICE9IGFwcGVyYW5jZSkgeworCQloZGV2LT5hcHBlYXJhbmNlID0gYXBwZXJhbmNlOworCisJCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTEVfQURWKSkKKwkJCWFkdl9leHBpcmUoaGRldiwgTUdNVF9BRFZfRkxBR19BUFBFQVJBTkNFKTsKKworCQlleHRfaW5mb19jaGFuZ2VkKGhkZXYsIHNrKTsKKwl9CisKKwllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0FQUEVBUkFOQ0UsIDAsIE5VTEwsCisJCQkJMCk7CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKKworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyB2b2lkIHJlYWRfbG9jYWxfb29iX2RhdGFfY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IHN0YXR1cywKIAkJCQkgICAgICAgICB1MTYgb3Bjb2RlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtNDg2OSw3ICs1MDQ1LDcgQEAKIAlpbnQgZXJyOwogCiAJbWVtc2V0KCZycCwgMCwgc2l6ZW9mKHJwKSk7Ci0JbWVtY3B5KCZycC5hZGRyLCAmY21kLT5wYXJhbSwgc2l6ZW9mKHJwLmFkZHIpKTsKKwltZW1jcHkoJnJwLmFkZHIsIGNtZC0+cGFyYW0sIHNpemVvZihycC5hZGRyKSk7CiAKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGNvbXBsZXRlOwpAQCAtNTUwMSwxNyArNTY3Nyw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGlubGluZSB1MTYgZWlyX2FwcGVuZF9kYXRhKHU4ICplaXIsIHUxNiBlaXJfbGVuLCB1OCB0eXBlLCB1OCAqZGF0YSwKLQkJCQkgIHU4IGRhdGFfbGVuKQotewotCWVpcltlaXJfbGVuKytdID0gc2l6ZW9mKHR5cGUpICsgZGF0YV9sZW47Ci0JZWlyW2Vpcl9sZW4rK10gPSB0eXBlOwotCW1lbWNweSgmZWlyW2Vpcl9sZW5dLCBkYXRhLCBkYXRhX2xlbik7Ci0JZWlyX2xlbiArPSBkYXRhX2xlbjsKLQotCXJldHVybiBlaXJfbGVuOwotfQotCiBzdGF0aWMgdm9pZCByZWFkX2xvY2FsX29vYl9leHRfZGF0YV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggc3RhdHVzLAogCQkJCQkgICAgIHUxNiBvcGNvZGUsIHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC01ODE1LDYgKzU5ODAsOCBAQAogCWZsYWdzIHw9IE1HTVRfQURWX0ZMQUdfRElTQ09WOwogCWZsYWdzIHw9IE1HTVRfQURWX0ZMQUdfTElNSVRFRF9ESVNDT1Y7CiAJZmxhZ3MgfD0gTUdNVF9BRFZfRkxBR19NQU5BR0VEX0ZMQUdTOworCWZsYWdzIHw9IE1HTVRfQURWX0ZMQUdfQVBQRUFSQU5DRTsKKwlmbGFncyB8PSBNR01UX0FEVl9GTEFHX0xPQ0FMX05BTUU7CiAKIAlpZiAoaGRldi0+YWR2X3R4X3Bvd2VyICE9IEhDSV9UWF9QT1dFUl9JTlZBTElEKQogCQlmbGFncyB8PSBNR01UX0FEVl9GTEFHX1RYX1BPV0VSOwpAQCAtNTg3MSwyOCArNjAzOCw1OSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBib29sIHRsdl9kYXRhX2lzX3ZhbGlkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1MzIgYWR2X2ZsYWdzLCB1OCAqZGF0YSwKLQkJCSAgICAgIHU4IGxlbiwgYm9vbCBpc19hZHZfZGF0YSkKK3N0YXRpYyB1OCB0bHZfZGF0YV9tYXhfbGVuKHUzMiBhZHZfZmxhZ3MsIGJvb2wgaXNfYWR2X2RhdGEpCiB7CiAJdTggbWF4X2xlbiA9IEhDSV9NQVhfQURfTEVOR1RIOwotCWludCBpLCBjdXJfbGVuOwotCWJvb2wgZmxhZ3NfbWFuYWdlZCA9IGZhbHNlOwotCWJvb2wgdHhfcG93ZXJfbWFuYWdlZCA9IGZhbHNlOwogCiAJaWYgKGlzX2Fkdl9kYXRhKSB7CiAJCWlmIChhZHZfZmxhZ3MgJiAoTUdNVF9BRFZfRkxBR19ESVNDT1YgfAogCQkJCSBNR01UX0FEVl9GTEFHX0xJTUlURURfRElTQ09WIHwKLQkJCQkgTUdNVF9BRFZfRkxBR19NQU5BR0VEX0ZMQUdTKSkgewotCQkJZmxhZ3NfbWFuYWdlZCA9IHRydWU7CisJCQkJIE1HTVRfQURWX0ZMQUdfTUFOQUdFRF9GTEFHUykpCiAJCQltYXhfbGVuIC09IDM7Ci0JCX0KIAotCQlpZiAoYWR2X2ZsYWdzICYgTUdNVF9BRFZfRkxBR19UWF9QT1dFUikgewotCQkJdHhfcG93ZXJfbWFuYWdlZCA9IHRydWU7CisJCWlmIChhZHZfZmxhZ3MgJiBNR01UX0FEVl9GTEFHX1RYX1BPV0VSKQogCQkJbWF4X2xlbiAtPSAzOwotCQl9CisJfSBlbHNlIHsKKwkJLyogYXQgbGVhc3QgMSBieXRlIG9mIG5hbWUgc2hvdWxkIGZpdCBpbiAqLworCQlpZiAoYWR2X2ZsYWdzICYgTUdNVF9BRFZfRkxBR19MT0NBTF9OQU1FKQorCQkJbWF4X2xlbiAtPSAzOworCisJCWlmIChhZHZfZmxhZ3MgJiAoTUdNVF9BRFZfRkxBR19BUFBFQVJBTkNFKSkKKwkJCW1heF9sZW4gLT0gNDsKIAl9CiAKKwlyZXR1cm4gbWF4X2xlbjsKK30KKworc3RhdGljIGJvb2wgZmxhZ3NfbWFuYWdlZCh1MzIgYWR2X2ZsYWdzKQoreworCXJldHVybiBhZHZfZmxhZ3MgJiAoTUdNVF9BRFZfRkxBR19ESVNDT1YgfAorCQkJICAgIE1HTVRfQURWX0ZMQUdfTElNSVRFRF9ESVNDT1YgfAorCQkJICAgIE1HTVRfQURWX0ZMQUdfTUFOQUdFRF9GTEFHUyk7Cit9CisKK3N0YXRpYyBib29sIHR4X3Bvd2VyX21hbmFnZWQodTMyIGFkdl9mbGFncykKK3sKKwlyZXR1cm4gYWR2X2ZsYWdzICYgTUdNVF9BRFZfRkxBR19UWF9QT1dFUjsKK30KKworc3RhdGljIGJvb2wgbmFtZV9tYW5hZ2VkKHUzMiBhZHZfZmxhZ3MpCit7CisJcmV0dXJuIGFkdl9mbGFncyAmIE1HTVRfQURWX0ZMQUdfTE9DQUxfTkFNRTsKK30KKworc3RhdGljIGJvb2wgYXBwZWFyYW5jZV9tYW5hZ2VkKHUzMiBhZHZfZmxhZ3MpCit7CisJcmV0dXJuIGFkdl9mbGFncyAmIE1HTVRfQURWX0ZMQUdfQVBQRUFSQU5DRTsKK30KKworc3RhdGljIGJvb2wgdGx2X2RhdGFfaXNfdmFsaWQodTMyIGFkdl9mbGFncywgdTggKmRhdGEsIHU4IGxlbiwgYm9vbCBpc19hZHZfZGF0YSkKK3sKKwlpbnQgaSwgY3VyX2xlbjsKKwl1OCBtYXhfbGVuOworCisJbWF4X2xlbiA9IHRsdl9kYXRhX21heF9sZW4oYWR2X2ZsYWdzLCBpc19hZHZfZGF0YSk7CisKIAlpZiAobGVuID4gbWF4X2xlbikKIAkJcmV0dXJuIGZhbHNlOwogCkBAIC01OTAwLDEwICs2MDk4LDIxIEBACiAJZm9yIChpID0gMCwgY3VyX2xlbiA9IDA7IGkgPCBsZW47IGkgKz0gKGN1cl9sZW4gKyAxKSkgewogCQljdXJfbGVuID0gZGF0YVtpXTsKIAotCQlpZiAoZmxhZ3NfbWFuYWdlZCAmJiBkYXRhW2kgKyAxXSA9PSBFSVJfRkxBR1MpCisJCWlmIChkYXRhW2kgKyAxXSA9PSBFSVJfRkxBR1MgJiYKKwkJICAgICghaXNfYWR2X2RhdGEgfHwgZmxhZ3NfbWFuYWdlZChhZHZfZmxhZ3MpKSkKIAkJCXJldHVybiBmYWxzZTsKIAotCQlpZiAodHhfcG93ZXJfbWFuYWdlZCAmJiBkYXRhW2kgKyAxXSA9PSBFSVJfVFhfUE9XRVIpCisJCWlmIChkYXRhW2kgKyAxXSA9PSBFSVJfVFhfUE9XRVIgJiYgdHhfcG93ZXJfbWFuYWdlZChhZHZfZmxhZ3MpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWlmIChkYXRhW2kgKyAxXSA9PSBFSVJfTkFNRV9DT01QTEVURSAmJiBuYW1lX21hbmFnZWQoYWR2X2ZsYWdzKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpZiAoZGF0YVtpICsgMV0gPT0gRUlSX05BTUVfU0hPUlQgJiYgbmFtZV9tYW5hZ2VkKGFkdl9mbGFncykpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJaWYgKGRhdGFbaSArIDFdID09IEVJUl9BUFBFQVJBTkNFICYmCisJCSAgICBhcHBlYXJhbmNlX21hbmFnZWQoYWR2X2ZsYWdzKSkKIAkJCXJldHVybiBmYWxzZTsKIAogCQkvKiBJZiB0aGUgY3VycmVudCBmaWVsZCBsZW5ndGggd291bGQgZXhjZWVkIHRoZSB0b3RhbCBkYXRhCkBAIC02MDI3LDggKzYyMzYsOCBAQAogCQlnb3RvIHVubG9jazsKIAl9CiAKLQlpZiAoIXRsdl9kYXRhX2lzX3ZhbGlkKGhkZXYsIGZsYWdzLCBjcC0+ZGF0YSwgY3AtPmFkdl9kYXRhX2xlbiwgdHJ1ZSkgfHwKLQkgICAgIXRsdl9kYXRhX2lzX3ZhbGlkKGhkZXYsIGZsYWdzLCBjcC0+ZGF0YSArIGNwLT5hZHZfZGF0YV9sZW4sCisJaWYgKCF0bHZfZGF0YV9pc192YWxpZChmbGFncywgY3AtPmRhdGEsIGNwLT5hZHZfZGF0YV9sZW4sIHRydWUpIHx8CisJICAgICF0bHZfZGF0YV9pc192YWxpZChmbGFncywgY3AtPmRhdGEgKyBjcC0+YWR2X2RhdGFfbGVuLAogCQkJICAgICAgIGNwLT5zY2FuX3JzcF9sZW4sIGZhbHNlKSkgewogCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX0FERF9BRFZFUlRJU0lORywKIAkJCQkgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CkBAIC02MTc1LDcgKzYzODQsNyBAQAogCiAJaGNpX3JlcV9pbml0KCZyZXEsIGhkZXYpOwogCi0JaGNpX3JlcV9jbGVhcl9hZHZfaW5zdGFuY2UoaGRldiwgJnJlcSwgY3AtPmluc3RhbmNlLCB0cnVlKTsKKwloY2lfcmVxX2NsZWFyX2Fkdl9pbnN0YW5jZShoZGV2LCBzaywgJnJlcSwgY3AtPmluc3RhbmNlLCB0cnVlKTsKIAogCWlmIChsaXN0X2VtcHR5KCZoZGV2LT5hZHZfaW5zdGFuY2VzKSkKIAkJX19oY2lfcmVxX2Rpc2FibGVfYWR2ZXJ0aXNpbmcoJnJlcSk7CkBAIC02MjExLDIzICs2NDIwLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdTggdGx2X2RhdGFfbWF4X2xlbih1MzIgYWR2X2ZsYWdzLCBib29sIGlzX2Fkdl9kYXRhKQotewotCXU4IG1heF9sZW4gPSBIQ0lfTUFYX0FEX0xFTkdUSDsKLQotCWlmIChpc19hZHZfZGF0YSkgewotCQlpZiAoYWR2X2ZsYWdzICYgKE1HTVRfQURWX0ZMQUdfRElTQ09WIHwKLQkJCQkgTUdNVF9BRFZfRkxBR19MSU1JVEVEX0RJU0NPViB8Ci0JCQkJIE1HTVRfQURWX0ZMQUdfTUFOQUdFRF9GTEFHUykpCi0JCQltYXhfbGVuIC09IDM7Ci0KLQkJaWYgKGFkdl9mbGFncyAmIE1HTVRfQURWX0ZMQUdfVFhfUE9XRVIpCi0JCQltYXhfbGVuIC09IDM7Ci0JfQotCi0JcmV0dXJuIG1heF9sZW47Ci19Ci0KIHN0YXRpYyBpbnQgZ2V0X2Fkdl9zaXplX2luZm8oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwKIAkJCSAgICAgdm9pZCAqZGF0YSwgdTE2IGRhdGFfbGVuKQogewpAQCAtNjM1Niw2ICs2NTQ4LDkgQEAKIAl7IHJlbW92ZV9hZHZlcnRpc2luZywJICAgTUdNVF9SRU1PVkVfQURWRVJUSVNJTkdfU0laRSB9LAogCXsgZ2V0X2Fkdl9zaXplX2luZm8sICAgICAgIE1HTVRfR0VUX0FEVl9TSVpFX0lORk9fU0laRSB9LAogCXsgc3RhcnRfbGltaXRlZF9kaXNjb3ZlcnksIE1HTVRfU1RBUlRfRElTQ09WRVJZX1NJWkUgfSwKKwl7IHJlYWRfZXh0X2NvbnRyb2xsZXJfaW5mbyxNR01UX1JFQURfRVhUX0lORk9fU0laRSwKKwkJCQkJCUhDSV9NR01UX1VOVFJVU1RFRCB9LAorCXsgc2V0X2FwcGVhcmFuY2UsCSAgIE1HTVRfU0VUX0FQUEVBUkFOQ0VfU0laRSB9LAogfTsKIAogdm9pZCBtZ210X2luZGV4X2FkZGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQpAQCAtNjQ5NCw5ICs2Njg5LDEyIEBACiAKIAltZ210X3BlbmRpbmdfZm9yZWFjaCgwLCBoZGV2LCBjbWRfY29tcGxldGVfcnNwLCAmc3RhdHVzKTsKIAotCWlmIChtZW1jbXAoaGRldi0+ZGV2X2NsYXNzLCB6ZXJvX2NvZCwgc2l6ZW9mKHplcm9fY29kKSkgIT0gMCkKLQkJbWdtdF9nZW5lcmljX2V2ZW50KE1HTVRfRVZfQ0xBU1NfT0ZfREVWX0NIQU5HRUQsIGhkZXYsCi0JCQkJICAgemVyb19jb2QsIHNpemVvZih6ZXJvX2NvZCksIE5VTEwpOworCWlmIChtZW1jbXAoaGRldi0+ZGV2X2NsYXNzLCB6ZXJvX2NvZCwgc2l6ZW9mKHplcm9fY29kKSkgIT0gMCkgeworCQltZ210X2xpbWl0ZWRfZXZlbnQoTUdNVF9FVl9DTEFTU19PRl9ERVZfQ0hBTkdFRCwgaGRldiwKKwkJCQkgICB6ZXJvX2NvZCwgc2l6ZW9mKHplcm9fY29kKSwKKwkJCQkgICBIQ0lfTUdNVF9ERVZfQ0xBU1NfRVZFTlRTLCBOVUxMKTsKKwkJZXh0X2luZm9fY2hhbmdlZChoZGV2LCBOVUxMKTsKKwl9CiAKIAluZXdfc2V0dGluZ3MoaGRldiwgbWF0Y2guc2spOwogCkBAIC03MDkyLDkgKzcyOTAsMTEgQEAKIAltZ210X3BlbmRpbmdfZm9yZWFjaChNR01UX09QX0FERF9VVUlELCBoZGV2LCBza19sb29rdXAsICZtYXRjaCk7CiAJbWdtdF9wZW5kaW5nX2ZvcmVhY2goTUdNVF9PUF9SRU1PVkVfVVVJRCwgaGRldiwgc2tfbG9va3VwLCAmbWF0Y2gpOwogCi0JaWYgKCFzdGF0dXMpCi0JCW1nbXRfZ2VuZXJpY19ldmVudChNR01UX0VWX0NMQVNTX09GX0RFVl9DSEFOR0VELCBoZGV2LAotCQkJCSAgIGRldl9jbGFzcywgMywgTlVMTCk7CisJaWYgKCFzdGF0dXMpIHsKKwkJbWdtdF9saW1pdGVkX2V2ZW50KE1HTVRfRVZfQ0xBU1NfT0ZfREVWX0NIQU5HRUQsIGhkZXYsIGRldl9jbGFzcywKKwkJCQkgICAzLCBIQ0lfTUdNVF9ERVZfQ0xBU1NfRVZFTlRTLCBOVUxMKTsKKwkJZXh0X2luZm9fY2hhbmdlZChoZGV2LCBOVUxMKTsKKwl9CiAKIAlpZiAobWF0Y2guc2spCiAJCXNvY2tfcHV0KG1hdGNoLnNrKTsKQEAgLTcxMjMsOCArNzMyMyw5IEBACiAJCQlyZXR1cm47CiAJfQogCi0JbWdtdF9nZW5lcmljX2V2ZW50KE1HTVRfRVZfTE9DQUxfTkFNRV9DSEFOR0VELCBoZGV2LCAmZXYsIHNpemVvZihldiksCi0JCQkgICBjbWQgPyBjbWQtPnNrIDogTlVMTCk7CisJbWdtdF9saW1pdGVkX2V2ZW50KE1HTVRfRVZfTE9DQUxfTkFNRV9DSEFOR0VELCBoZGV2LCAmZXYsIHNpemVvZihldiksCisJCQkgICBIQ0lfTUdNVF9MT0NBTF9OQU1FX0VWRU5UUywgY21kID8gY21kLT5zayA6IE5VTEwpOworCWV4dF9pbmZvX2NoYW5nZWQoaGRldiwgY21kID8gY21kLT5zayA6IE5VTEwpOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgaGFzX3V1aWQodTggKnV1aWQsIHUxNiB1dWlkX2NvdW50LCB1OCAoKnV1aWRzKVsxNl0pCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL21nbXRfdXRpbC5jIGIvbmV0L2JsdWV0b290aC9tZ210X3V0aWwuYwppbmRleCA4YzMwYzdlLi5jOTMzYmQwIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL21nbXRfdXRpbC5jCisrKyBiL25ldC9ibHVldG9vdGgvbWdtdF91dGlsLmMKQEAgLTIxLDEyICsyMSw0MSBAQAogICAgU09GVFdBUkUgSVMgRElTQ0xBSU1FRC4KICovCiAKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9tb24uaD4KICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL21nbXQuaD4KIAogI2luY2x1ZGUgIm1nbXRfdXRpbC5oIgogCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNyZWF0ZV9tb25pdG9yX2N0cmxfZXZlbnQoX19sZTE2IGluZGV4LCB1MzIgY29va2llLAorCQkJCQkJIHUxNiBvcGNvZGUsIHUxNiBsZW4sIHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGNpX21vbl9oZHIgKmhkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gYnRfc2tiX2FsbG9jKDYgKyBsZW4sIEdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCXB1dF91bmFsaWduZWRfbGUzMihjb29raWUsIHNrYl9wdXQoc2tiLCA0KSk7CisJcHV0X3VuYWxpZ25lZF9sZTE2KG9wY29kZSwgc2tiX3B1dChza2IsIDIpKTsKKworCWlmIChidWYpCisJCW1lbWNweShza2JfcHV0KHNrYiwgbGVuKSwgYnVmLCBsZW4pOworCisJX19uZXRfdGltZXN0YW1wKHNrYik7CisKKwloZHIgPSAodm9pZCAqKXNrYl9wdXNoKHNrYiwgSENJX01PTl9IRFJfU0laRSk7CisJaGRyLT5vcGNvZGUgPSBjcHVfdG9fbGUxNihIQ0lfTU9OX0NUUkxfRVZFTlQpOworCWhkci0+aW5kZXggPSBpbmRleDsKKwloZHItPmxlbiA9IGNwdV90b19sZTE2KHNrYi0+bGVuIC0gSENJX01PTl9IRFJfU0laRSk7CisKKwlyZXR1cm4gc2tiOworfQorCiBpbnQgbWdtdF9zZW5kX2V2ZW50KHUxNiBldmVudCwgc3RydWN0IGhjaV9kZXYgKmhkZXYsIHVuc2lnbmVkIHNob3J0IGNoYW5uZWwsCiAJCSAgICB2b2lkICpkYXRhLCB1MTYgZGF0YV9sZW4sIGludCBmbGFnLCBzdHJ1Y3Qgc29jayAqc2tpcF9zaykKIHsKQEAgLTUyLDE0ICs4MSwxOCBAQAogCV9fbmV0X3RpbWVzdGFtcChza2IpOwogCiAJaGNpX3NlbmRfdG9fY2hhbm5lbChjaGFubmVsLCBza2IsIGZsYWcsIHNraXBfc2spOwotCWtmcmVlX3NrYihza2IpOwogCisJaWYgKGNoYW5uZWwgPT0gSENJX0NIQU5ORUxfQ09OVFJPTCkKKwkJaGNpX3NlbmRfbW9uaXRvcl9jdHJsX2V2ZW50KGhkZXYsIGV2ZW50LCBkYXRhLCBkYXRhX2xlbiwKKwkJCQkJICAgIHNrYl9nZXRfa3RpbWUoc2tiKSwgZmxhZywgc2tpcF9zayk7CisKKwlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gMDsKIH0KIAogaW50IG1nbXRfY21kX3N0YXR1cyhzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdTE2IGNtZCwgdTggc3RhdHVzKQogewotCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm1za2I7CiAJc3RydWN0IG1nbXRfaGRyICpoZHI7CiAJc3RydWN0IG1nbXRfZXZfY21kX3N0YXR1cyAqZXY7CiAJaW50IGVycjsKQEAgLTgwLDE3ICsxMTMsMzAgQEAKIAlldi0+c3RhdHVzID0gc3RhdHVzOwogCWV2LT5vcGNvZGUgPSBjcHVfdG9fbGUxNihjbWQpOwogCisJbXNrYiA9IGNyZWF0ZV9tb25pdG9yX2N0cmxfZXZlbnQoaGRyLT5pbmRleCwgaGNpX3NvY2tfZ2V0X2Nvb2tpZShzayksCisJCQkJCSBNR01UX0VWX0NNRF9TVEFUVVMsIHNpemVvZigqZXYpLCBldik7CisJaWYgKG1za2IpCisJCXNrYi0+dHN0YW1wID0gbXNrYi0+dHN0YW1wOworCWVsc2UKKwkJX19uZXRfdGltZXN0YW1wKHNrYik7CisKIAllcnIgPSBzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CiAJaWYgKGVyciA8IDApCiAJCWtmcmVlX3NrYihza2IpOwogCisJaWYgKG1za2IpIHsKKwkJaGNpX3NlbmRfdG9fY2hhbm5lbChIQ0lfQ0hBTk5FTF9NT05JVE9SLCBtc2tiLAorCQkJCSAgICBIQ0lfU09DS19UUlVTVEVELCBOVUxMKTsKKwkJa2ZyZWVfc2tiKG1za2IpOworCX0KKwogCXJldHVybiBlcnI7CiB9CiAKIGludCBtZ210X2NtZF9jb21wbGV0ZShzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdTE2IGNtZCwgdTggc3RhdHVzLAogCQkgICAgICB2b2lkICpycCwgc2l6ZV90IHJwX2xlbikKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBza19idWZmICpza2IsICptc2tiOwogCXN0cnVjdCBtZ210X2hkciAqaGRyOwogCXN0cnVjdCBtZ210X2V2X2NtZF9jb21wbGV0ZSAqZXY7CiAJaW50IGVycjsKQEAgLTExNCwxMCArMTYwLDI0IEBACiAJaWYgKHJwKQogCQltZW1jcHkoZXYtPmRhdGEsIHJwLCBycF9sZW4pOwogCisJbXNrYiA9IGNyZWF0ZV9tb25pdG9yX2N0cmxfZXZlbnQoaGRyLT5pbmRleCwgaGNpX3NvY2tfZ2V0X2Nvb2tpZShzayksCisJCQkJCSBNR01UX0VWX0NNRF9DT01QTEVURSwKKwkJCQkJIHNpemVvZigqZXYpICsgcnBfbGVuLCBldik7CisJaWYgKG1za2IpCisJCXNrYi0+dHN0YW1wID0gbXNrYi0+dHN0YW1wOworCWVsc2UKKwkJX19uZXRfdGltZXN0YW1wKHNrYik7CisKIAllcnIgPSBzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CiAJaWYgKGVyciA8IDApCiAJCWtmcmVlX3NrYihza2IpOwogCisJaWYgKG1za2IpIHsKKwkJaGNpX3NlbmRfdG9fY2hhbm5lbChIQ0lfQ0hBTk5FTF9NT05JVE9SLCBtc2tiLAorCQkJCSAgICBIQ0lfU09DS19UUlVTVEVELCBOVUxMKTsKKwkJa2ZyZWVfc2tiKG1za2IpOworCX0KKwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvc21wLmMgYi9uZXQvYmx1ZXRvb3RoL3NtcC5jCmluZGV4IDRjMWExNmEuLjQzZmFmMmEgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvc21wLmMKKysrIGIvbmV0L2JsdWV0b290aC9zbXAuYwpAQCAtMzM4Nyw3ICszMzg3LDEwIEBACiAJaWYgKCFsbXBfc2NfY2FwYWJsZShoZGV2KSkgewogCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJmb3JjZV9icmVkcl9zbXAiLCAwNjQ0LCBoZGV2LT5kZWJ1Z2ZzLAogCQkJCSAgICBoZGV2LCAmZm9yY2VfYnJlZHJfc21wX2ZvcHMpOwotCQlyZXR1cm4gMDsKKworCQkvKiBGbGFnIGNhbiBiZSBhbHJlYWR5IHNldCBoZXJlIChkdWUgdG8gcG93ZXIgdG9nZ2xlKSAqLworCQlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9GT1JDRV9CUkVEUl9TTVApKQorCQkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKFdBUk5fT04oaGRldi0+c21wX2JyZWRyX2RhdGEpKSB7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL01ha2VmaWxlIGIvbmV0L2JyaWRnZS9NYWtlZmlsZQppbmRleCBhMWNkYTVkLi4wYWVmYzAxIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL01ha2VmaWxlCisrKyBiL25ldC9icmlkZ2UvTWFrZWZpbGUKQEAgLTIwLDQgKzIwLDYgQEAKIAogYnJpZGdlLSQoQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklORykgKz0gYnJfdmxhbi5vCiAKK2JyaWRnZS0kKENPTkZJR19ORVRfU1dJVENIREVWKSArPSBicl9zd2l0Y2hkZXYubworCiBvYmotJChDT05GSUdfTkVURklMVEVSKSArPSBuZXRmaWx0ZXIvCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyLmMgYi9uZXQvYnJpZGdlL2JyLmMKaW5kZXggM2FkZGMwNS4uODg5ZTU2NCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9ici5jCisrKyBiL25ldC9icmlkZ2UvYnIuYwpAQCAtMjI3LDkgKzIyNywxMSBAQAogCWJyX2ZkYl90ZXN0X2FkZHJfaG9vayA9IGJyX2ZkYl90ZXN0X2FkZHI7CiAjZW5kaWYKIAotCXByX2luZm8oImJyaWRnZTogYXV0b21hdGljIGZpbHRlcmluZyB2aWEgYXJwL2lwL2lwNnRhYmxlcyBoYXMgYmVlbiAiCi0JCSJkZXByZWNhdGVkLiBVcGRhdGUgeW91ciBzY3JpcHRzIHRvIGxvYWQgYnJfbmV0ZmlsdGVyIGlmIHlvdSAiCisjaWYgSVNfTU9EVUxFKENPTkZJR19CUklER0VfTkVURklMVEVSKQorCXByX2luZm8oImJyaWRnZTogZmlsdGVyaW5nIHZpYSBhcnAvaXAvaXA2dGFibGVzIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgIgorCQkiYnkgZGVmYXVsdC4gVXBkYXRlIHlvdXIgc2NyaXB0cyB0byBsb2FkIGJyX25ldGZpbHRlciBpZiB5b3UgIgogCQkibmVlZCB0aGlzLlxuIik7CisjZW5kaWYKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2RldmljZS5jIGIvbmV0L2JyaWRnZS9icl9kZXZpY2UuYwppbmRleCAwOWYyNjk0Li44OWE2ODdmIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2RldmljZS5jCisrKyBiL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMKQEAgLTYyLDEwICs2MiwxMCBAQAogCQlnb3RvIG91dDsKIAogCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihkZXN0KSkgewotCQlicl9mbG9vZChiciwgc2tiLCBmYWxzZSwgZmFsc2UsIHRydWUpOworCQlicl9mbG9vZChiciwgc2tiLCBCUl9QS1RfQlJPQURDQVNULCBmYWxzZSwgdHJ1ZSk7CiAJfSBlbHNlIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSkgewogCQlpZiAodW5saWtlbHkobmV0cG9sbF90eF9ydW5uaW5nKGRldikpKSB7Ci0JCQlicl9mbG9vZChiciwgc2tiLCBmYWxzZSwgZmFsc2UsIHRydWUpOworCQkJYnJfZmxvb2QoYnIsIHNrYiwgQlJfUEtUX01VTFRJQ0FTVCwgZmFsc2UsIHRydWUpOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJaWYgKGJyX211bHRpY2FzdF9yY3YoYnIsIE5VTEwsIHNrYiwgdmlkKSkgewpAQCAtNzgsMTEgKzc4LDExIEBACiAJCSAgICBicl9tdWx0aWNhc3RfcXVlcmllcl9leGlzdHMoYnIsIGV0aF9oZHIoc2tiKSkpCiAJCQlicl9tdWx0aWNhc3RfZmxvb2QobWRzdCwgc2tiLCBmYWxzZSwgdHJ1ZSk7CiAJCWVsc2UKLQkJCWJyX2Zsb29kKGJyLCBza2IsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisJCQlicl9mbG9vZChiciwgc2tiLCBCUl9QS1RfTVVMVElDQVNULCBmYWxzZSwgdHJ1ZSk7CiAJfSBlbHNlIGlmICgoZHN0ID0gX19icl9mZGJfZ2V0KGJyLCBkZXN0LCB2aWQpKSAhPSBOVUxMKSB7CiAJCWJyX2ZvcndhcmQoZHN0LT5kc3QsIHNrYiwgZmFsc2UsIHRydWUpOwogCX0gZWxzZSB7Ci0JCWJyX2Zsb29kKGJyLCBza2IsIHRydWUsIGZhbHNlLCB0cnVlKTsKKwkJYnJfZmxvb2QoYnIsIHNrYiwgQlJfUEtUX1VOSUNBU1QsIGZhbHNlLCB0cnVlKTsKIAl9CiBvdXQ6CiAJcmN1X3JlYWRfdW5sb2NrKCk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2ZkYi5jIGIvbmV0L2JyaWRnZS9icl9mZGIuYwppbmRleCBjMTgwODBhLi42YjQzYzhjIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2ZkYi5jCisrKyBiL25ldC9icmlkZ2UvYnJfZmRiLmMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCiAJLyogSWYgb2xkIGVudHJ5IHdhcyB1bmFzc29jaWF0ZWQgd2l0aCBhbnkgcG9ydCwgdGhlbiBkZWxldGUgaXQuICovCiAJZiA9IF9fYnJfZmRiX2dldChiciwgYnItPmRldi0+ZGV2X2FkZHIsIDApOwotCWlmIChmICYmIGYtPmlzX2xvY2FsICYmICFmLT5kc3QpCisJaWYgKGYgJiYgZi0+aXNfbG9jYWwgJiYgIWYtPmRzdCAmJiAhZi0+YWRkZWRfYnlfdXNlcikKIAkJZmRiX2RlbGV0ZV9sb2NhbChiciwgTlVMTCwgZik7CiAKIAlmZGJfaW5zZXJ0KGJyLCBOVUxMLCBuZXdhZGRyLCAwKTsKQEAgLTI4Miw3ICsyODIsNyBAQAogCQlpZiAoIWJyX3ZsYW5fc2hvdWxkX3VzZSh2KSkKIAkJCWNvbnRpbnVlOwogCQlmID0gX19icl9mZGJfZ2V0KGJyLCBici0+ZGV2LT5kZXZfYWRkciwgdi0+dmlkKTsKLQkJaWYgKGYgJiYgZi0+aXNfbG9jYWwgJiYgIWYtPmRzdCkKKwkJaWYgKGYgJiYgZi0+aXNfbG9jYWwgJiYgIWYtPmRzdCAmJiAhZi0+YWRkZWRfYnlfdXNlcikKIAkJCWZkYl9kZWxldGVfbG9jYWwoYnIsIE5VTEwsIGYpOwogCQlmZGJfaW5zZXJ0KGJyLCBOVUxMLCBuZXdhZGRyLCB2LT52aWQpOwogCX0KQEAgLTcxMCwyNCArNzEwLDI3IEBACiAJCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmZpbHRlcl9kZXYsCi0JCWludCBpZHgpCisJCWludCAqaWR4KQogewogCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVyciA9IDA7CiAJaW50IGk7CiAKIAlpZiAoIShkZXYtPnByaXZfZmxhZ3MgJiBJRkZfRUJSSURHRSkpCiAJCWdvdG8gb3V0OwogCi0JaWYgKCFmaWx0ZXJfZGV2KQotCQlpZHggPSBuZG9fZGZsdF9mZGJfZHVtcChza2IsIGNiLCBkZXYsIE5VTEwsIGlkeCk7CisJaWYgKCFmaWx0ZXJfZGV2KSB7CisJCWVyciA9IG5kb19kZmx0X2ZkYl9kdW1wKHNrYiwgY2IsIGRldiwgTlVMTCwgaWR4KTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dDsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgQlJfSEFTSF9TSVpFOyBpKyspIHsKIAkJc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmOwogCiAJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShmLCAmYnItPmhhc2hbaV0sIGhsaXN0KSB7Ci0JCQlpbnQgZXJyOwogCi0JCQlpZiAoaWR4IDwgY2ItPmFyZ3NbMF0pCisJCQlpZiAoKmlkeCA8IGNiLT5hcmdzWzJdKQogCQkJCWdvdG8gc2tpcDsKIAogCQkJaWYgKGZpbHRlcl9kZXYgJiYKQEAgLTc1MCwzNCArNzUzLDM3IEBACiAJCQkJCSAgICBjYi0+bmxoLT5ubG1zZ19zZXEsCiAJCQkJCSAgICBSVE1fTkVXTkVJR0gsCiAJCQkJCSAgICBOTE1fRl9NVUxUSSk7Ci0JCQlpZiAoZXJyIDwgMCkgewotCQkJCWNiLT5hcmdzWzFdID0gZXJyOwotCQkJCWJyZWFrOwotCQkJfQorCQkJaWYgKGVyciA8IDApCisJCQkJZ290byBvdXQ7CiBza2lwOgotCQkJKytpZHg7CisJCQkqaWR4ICs9IDE7CiAJCX0KIAl9CiAKIG91dDoKLQlyZXR1cm4gaWR4OworCXJldHVybiBlcnI7CiB9CiAKIC8qIFVwZGF0ZSAoY3JlYXRlIG9yIHJlcGxhY2UpIGZvcndhcmRpbmcgZGF0YWJhc2UgZW50cnkgKi8KLXN0YXRpYyBpbnQgZmRiX2FkZF9lbnRyeShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpzb3VyY2UsIGNvbnN0IF9fdTggKmFkZHIsCi0JCQkgX191MTYgc3RhdGUsIF9fdTE2IGZsYWdzLCBfX3UxNiB2aWQpCitzdGF0aWMgaW50IGZkYl9hZGRfZW50cnkoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpzb3VyY2UsCisJCQkgY29uc3QgX191OCAqYWRkciwgX191MTYgc3RhdGUsIF9fdTE2IGZsYWdzLCBfX3UxNiB2aWQpCiB7Ci0Jc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gc291cmNlLT5icjsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCA9ICZici0+aGFzaFticl9tYWNfaGFzaChhZGRyLCB2aWQpXTsKIAlzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYjsKIAlib29sIG1vZGlmaWVkID0gZmFsc2U7CiAKIAkvKiBJZiB0aGUgcG9ydCBjYW5ub3QgbGVhcm4gYWxsb3cgb25seSBsb2NhbCBhbmQgc3RhdGljIGVudHJpZXMgKi8KLQlpZiAoIShzdGF0ZSAmIE5VRF9QRVJNQU5FTlQpICYmICEoc3RhdGUgJiBOVURfTk9BUlApICYmCisJaWYgKHNvdXJjZSAmJiAhKHN0YXRlICYgTlVEX1BFUk1BTkVOVCkgJiYgIShzdGF0ZSAmIE5VRF9OT0FSUCkgJiYKIAkgICAgIShzb3VyY2UtPnN0YXRlID09IEJSX1NUQVRFX0xFQVJOSU5HIHx8CiAJICAgICAgc291cmNlLT5zdGF0ZSA9PSBCUl9TVEFURV9GT1JXQVJESU5HKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAorCWlmICghc291cmNlICYmICEoc3RhdGUgJiBOVURfUEVSTUFORU5UKSkgeworCQlwcl9pbmZvKCJicmlkZ2U6IFJUTV9ORVdORUlHSCAlcyB3aXRob3V0IE5VRF9QRVJNQU5FTlRcbiIsCisJCQlici0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJZmRiID0gZmRiX2ZpbmQoaGVhZCwgYWRkciwgdmlkKTsKIAlpZiAoZmRiID09IE5VTEwpIHsKIAkJaWYgKCEoZmxhZ3MgJiBOTE1fRl9DUkVBVEUpKQpAQCAtODMyLDIyICs4MzgsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2JyX2ZkYl9hZGQoc3RydWN0IG5kbXNnICpuZG0sIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCi0JICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIHUxNiBubGhfZmxhZ3MsIHUxNiB2aWQpCitzdGF0aWMgaW50IF9fYnJfZmRiX2FkZChzdHJ1Y3QgbmRtc2cgKm5kbSwgc3RydWN0IG5ldF9icmlkZ2UgKmJyLAorCQkJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwKKwkJCXUxNiBubGhfZmxhZ3MsIHUxNiB2aWQpCiB7CiAJaW50IGVyciA9IDA7CiAKIAlpZiAobmRtLT5uZG1fZmxhZ3MgJiBOVEZfVVNFKSB7CisJCWlmICghcCkgeworCQkJcHJfaW5mbygiYnJpZGdlOiBSVE1fTkVXTkVJR0ggJXMgd2l0aCBOVEZfVVNFIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJYnItPmRldi0+bmFtZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCQlsb2NhbF9iaF9kaXNhYmxlKCk7CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJYnJfZmRiX3VwZGF0ZShwLT5iciwgcCwgYWRkciwgdmlkLCB0cnVlKTsKKwkJYnJfZmRiX3VwZGF0ZShiciwgcCwgYWRkciwgdmlkLCB0cnVlKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCWxvY2FsX2JoX2VuYWJsZSgpOwogCX0gZWxzZSB7Ci0JCXNwaW5fbG9ja19iaCgmcC0+YnItPmhhc2hfbG9jayk7Ci0JCWVyciA9IGZkYl9hZGRfZW50cnkocCwgYWRkciwgbmRtLT5uZG1fc3RhdGUsCisJCXNwaW5fbG9ja19iaCgmYnItPmhhc2hfbG9jayk7CisJCWVyciA9IGZkYl9hZGRfZW50cnkoYnIsIHAsIGFkZHIsIG5kbS0+bmRtX3N0YXRlLAogCQkJCSAgICBubGhfZmxhZ3MsIHZpZCk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZwLT5ici0+aGFzaF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmJyLT5oYXNoX2xvY2spOwogCX0KIAogCXJldHVybiBlcnI7CkBAIC04ODQsNiArODk2LDcgQEAKIAkJCQlkZXYtPm5hbWUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KKwkJYnIgPSBwLT5icjsKIAkJdmcgPSBuYnBfdmxhbl9ncm91cChwKTsKIAl9CiAKQEAgLTg5NSwxNSArOTA4LDkgQEAKIAkJfQogCiAJCS8qIFZJRCB3YXMgc3BlY2lmaWVkLCBzbyB1c2UgaXQuICovCi0JCWlmIChkZXYtPnByaXZfZmxhZ3MgJiBJRkZfRUJSSURHRSkKLQkJCWVyciA9IGJyX2ZkYl9pbnNlcnQoYnIsIE5VTEwsIGFkZHIsIHZpZCk7Ci0JCWVsc2UKLQkJCWVyciA9IF9fYnJfZmRiX2FkZChuZG0sIHAsIGFkZHIsIG5saF9mbGFncywgdmlkKTsKKwkJZXJyID0gX19icl9mZGJfYWRkKG5kbSwgYnIsIHAsIGFkZHIsIG5saF9mbGFncywgdmlkKTsKIAl9IGVsc2UgewotCQlpZiAoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0VCUklER0UpCi0JCQllcnIgPSBicl9mZGJfaW5zZXJ0KGJyLCBOVUxMLCBhZGRyLCAwKTsKLQkJZWxzZQotCQkJZXJyID0gX19icl9mZGJfYWRkKG5kbSwgcCwgYWRkciwgbmxoX2ZsYWdzLCAwKTsKKwkJZXJyID0gX19icl9mZGJfYWRkKG5kbSwgYnIsIHAsIGFkZHIsIG5saF9mbGFncywgMCk7CiAJCWlmIChlcnIgfHwgIXZnIHx8ICF2Zy0+bnVtX3ZsYW5zKQogCQkJZ290byBvdXQ7CiAKQEAgLTkxNCwxMSArOTIxLDcgQEAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2LCAmdmctPnZsYW5fbGlzdCwgdmxpc3QpIHsKIAkJCWlmICghYnJfdmxhbl9zaG91bGRfdXNlKHYpKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKGRldi0+cHJpdl9mbGFncyAmIElGRl9FQlJJREdFKQotCQkJCWVyciA9IGJyX2ZkYl9pbnNlcnQoYnIsIE5VTEwsIGFkZHIsIHYtPnZpZCk7Ci0JCQllbHNlCi0JCQkJZXJyID0gX19icl9mZGJfYWRkKG5kbSwgcCwgYWRkciwgbmxoX2ZsYWdzLAotCQkJCQkJICAgdi0+dmlkKTsKKwkJCWVyciA9IF9fYnJfZmRiX2FkZChuZG0sIGJyLCBwLCBhZGRyLCBubGhfZmxhZ3MsIHYtPnZpZCk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gb3V0OwogCQl9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2ZvcndhcmQuYyBiL25ldC9icmlkZ2UvYnJfZm9yd2FyZC5jCmluZGV4IDYzYTgzZDguLjdjYjQxYWUgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfZm9yd2FyZC5jCisrKyBiL25ldC9icmlkZ2UvYnJfZm9yd2FyZC5jCkBAIC0yOSw3ICsyOSw4IEBACiAKIAl2ZyA9IG5icF92bGFuX2dyb3VwX3JjdShwKTsKIAlyZXR1cm4gKChwLT5mbGFncyAmIEJSX0hBSVJQSU5fTU9ERSkgfHwgc2tiLT5kZXYgIT0gcC0+ZGV2KSAmJgotCQlicl9hbGxvd2VkX2VncmVzcyh2Zywgc2tiKSAmJiBwLT5zdGF0ZSA9PSBCUl9TVEFURV9GT1JXQVJESU5HOworCQlicl9hbGxvd2VkX2VncmVzcyh2Zywgc2tiKSAmJiBwLT5zdGF0ZSA9PSBCUl9TVEFURV9GT1JXQVJESU5HICYmCisJCW5icF9zd2l0Y2hkZXZfYWxsb3dlZF9lZ3Jlc3MocCwgc2tiKTsKIH0KIAogaW50IGJyX2Rldl9xdWV1ZV9wdXNoX3htaXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCkBAIC0xNzUsNyArMTc2LDcgQEAKIAogLyogY2FsbGVkIHVuZGVyIHJjdV9yZWFkX2xvY2sgKi8KIHZvaWQgYnJfZmxvb2Qoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgICAgIGJvb2wgdW5pY2FzdCwgYm9vbCBsb2NhbF9yY3YsIGJvb2wgbG9jYWxfb3JpZykKKwkgICAgICBlbnVtIGJyX3BrdF90eXBlIHBrdF90eXBlLCBib29sIGxvY2FsX3JjdiwgYm9vbCBsb2NhbF9vcmlnKQogewogCXU4IGlnbXBfdHlwZSA9IGJyX211bHRpY2FzdF9pZ21wX3R5cGUoc2tiKTsKIAlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwcmV2ID0gTlVMTDsKQEAgLTE4Myw3ICsxODQsMTAgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHAsICZici0+cG9ydF9saXN0LCBsaXN0KSB7CiAJCS8qIERvIG5vdCBmbG9vZCB1bmljYXN0IHRyYWZmaWMgdG8gcG9ydHMgdGhhdCB0dXJuIGl0IG9mZiAqLwotCQlpZiAodW5pY2FzdCAmJiAhKHAtPmZsYWdzICYgQlJfRkxPT0QpKQorCQlpZiAocGt0X3R5cGUgPT0gQlJfUEtUX1VOSUNBU1QgJiYgIShwLT5mbGFncyAmIEJSX0ZMT09EKSkKKwkJCWNvbnRpbnVlOworCQlpZiAocGt0X3R5cGUgPT0gQlJfUEtUX01VTFRJQ0FTVCAmJgorCQkgICAgIShwLT5mbGFncyAmIEJSX01DQVNUX0ZMT09EKSkKIAkJCWNvbnRpbnVlOwogCiAJCS8qIERvIG5vdCBmbG9vZCB0byBwb3J0cyB0aGF0IGVuYWJsZSBwcm94eSBBUlAgKi8KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfaWYuYyBiL25ldC9icmlkZ2UvYnJfaWYuYwppbmRleCBmMmZlZGUwLi5lZDBkZDMzIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2lmLmMKKysrIGIvbmV0L2JyaWRnZS9icl9pZi5jCkBAIC0zNjIsNyArMzYyLDcgQEAKIAlwLT5wYXRoX2Nvc3QgPSBwb3J0X2Nvc3QoZGV2KTsKIAlwLT5wcmlvcml0eSA9IDB4ODAwMCA+PiBCUl9QT1JUX0JJVFM7CiAJcC0+cG9ydF9ubyA9IGluZGV4OwotCXAtPmZsYWdzID0gQlJfTEVBUk5JTkcgfCBCUl9GTE9PRDsKKwlwLT5mbGFncyA9IEJSX0xFQVJOSU5HIHwgQlJfRkxPT0QgfCBCUl9NQ0FTVF9GTE9PRDsKIAlicl9pbml0X3BvcnQocCk7CiAJYnJfc2V0X3N0YXRlKHAsIEJSX1NUQVRFX0RJU0FCTEVEKTsKIAlicl9zdHBfcG9ydF90aW1lcl9pbml0KHApOwpAQCAtNTQ1LDYgKzU0NSwxMCBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyNTsKIAorCWVyciA9IG5icF9zd2l0Y2hkZXZfbWFya19zZXQocCk7CisJaWYgKGVycikKKwkJZ290byBlcnI2OworCiAJZGV2X2Rpc2FibGVfbHJvKGRldik7CiAKIAlsaXN0X2FkZF9yY3UoJnAtPmxpc3QsICZici0+cG9ydF9saXN0KTsKQEAgLTU2Niw3ICs1NzAsNyBAQAogCWVyciA9IG5icF92bGFuX2luaXQocCk7CiAJaWYgKGVycikgewogCQluZXRkZXZfZXJyKGRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIHZsYW4gZmlsdGVyaW5nIG9uIHRoaXMgcG9ydFxuIik7Ci0JCWdvdG8gZXJyNjsKKwkJZ290byBlcnI3OwogCX0KIAogCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOwpAQCAtNTg5LDEyICs1OTMsMTIgQEAKIAogCXJldHVybiAwOwogCi1lcnI2OgorZXJyNzoKIAlsaXN0X2RlbF9yY3UoJnAtPmxpc3QpOwogCWJyX2ZkYl9kZWxldGVfYnlfcG9ydChiciwgcCwgMCwgMSk7CiAJbmJwX3VwZGF0ZV9wb3J0X2NvdW50KGJyKTsKK2VycjY6CiAJbmV0ZGV2X3VwcGVyX2Rldl91bmxpbmsoZGV2LCBici0+ZGV2KTsKLQogZXJyNToKIAlkZXYtPnByaXZfZmxhZ3MgJj0gfklGRl9CUklER0VfUE9SVDsKIAluZXRkZXZfcnhfaGFuZGxlcl91bnJlZ2lzdGVyKGRldik7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lucHV0LmMgYi9uZXQvYnJpZGdlL2JyX2lucHV0LmMKaW5kZXggOGU0ODYyMC4uODU1YjcyZiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pbnB1dC5jCisrKyBiL25ldC9icmlkZ2UvYnJfaW5wdXQuYwpAQCAtODAsMTMgKzgwLDEwIEBACiAKIAlCUl9JTlBVVF9TS0JfQ0Ioc2tiKS0+cHJveHlhcnBfcmVwbGllZCA9IGZhbHNlOwogCi0JaWYgKGRldi0+ZmxhZ3MgJiBJRkZfTk9BUlApCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX05PQVJQKSB8fAorCSAgICAhcHNrYl9tYXlfcHVsbChza2IsIGFycF9oZHJfbGVuKGRldikpKQogCQlyZXR1cm47CiAKLQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBhcnBfaGRyX2xlbihkZXYpKSkgewotCQlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKLQkJcmV0dXJuOwotCX0KIAlwYXJwID0gYXJwX2hkcihza2IpOwogCiAJaWYgKHBhcnAtPmFyX3BybyAhPSBodG9ucyhFVEhfUF9JUCkgfHwKQEAgLTEzMSwxMSArMTI4LDEyIEBACiAvKiBub3RlOiBhbHJlYWR5IGNhbGxlZCB3aXRoIHJjdV9yZWFkX2xvY2sgKi8KIGludCBicl9oYW5kbGVfZnJhbWVfZmluaXNoKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWJvb2wgbG9jYWxfcmN2ID0gZmFsc2UsIG1jYXN0X2hpdCA9IGZhbHNlLCB1bmljYXN0ID0gdHJ1ZTsKIAlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwID0gYnJfcG9ydF9nZXRfcmN1KHNrYi0+ZGV2KTsKIAljb25zdCB1bnNpZ25lZCBjaGFyICpkZXN0ID0gZXRoX2hkcihza2IpLT5oX2Rlc3Q7CisJZW51bSBicl9wa3RfdHlwZSBwa3RfdHlwZSA9IEJSX1BLVF9VTklDQVNUOwogCXN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZHN0ID0gTlVMTDsKIAlzdHJ1Y3QgbmV0X2JyaWRnZV9tZGJfZW50cnkgKm1kc3Q7CisJYm9vbCBsb2NhbF9yY3YsIG1jYXN0X2hpdCA9IGZhbHNlOwogCXN0cnVjdCBuZXRfYnJpZGdlICpicjsKIAl1MTYgdmlkID0gMDsKIApAQCAtMTQ1LDI5ICsxNDMsMzYgQEAKIAlpZiAoIWJyX2FsbG93ZWRfaW5ncmVzcyhwLT5iciwgbmJwX3ZsYW5fZ3JvdXBfcmN1KHApLCBza2IsICZ2aWQpKQogCQlnb3RvIG91dDsKIAorCW5icF9zd2l0Y2hkZXZfZnJhbWVfbWFyayhwLCBza2IpOworCiAJLyogaW5zZXJ0IGludG8gZm9yd2FyZGluZyBkYXRhYmFzZSBhZnRlciBmaWx0ZXJpbmcgdG8gYXZvaWQgc3Bvb2ZpbmcgKi8KIAliciA9IHAtPmJyOwogCWlmIChwLT5mbGFncyAmIEJSX0xFQVJOSU5HKQogCQlicl9mZGJfdXBkYXRlKGJyLCBwLCBldGhfaGRyKHNrYiktPmhfc291cmNlLCB2aWQsIGZhbHNlKTsKIAotCWlmICghaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZGVzdCkgJiYgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGVzdCkgJiYKLQkgICAgYnJfbXVsdGljYXN0X3JjdihiciwgcCwgc2tiLCB2aWQpKQotCQlnb3RvIGRyb3A7CisJbG9jYWxfcmN2ID0gISEoYnItPmRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyk7CisJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpKSB7CisJCS8qIGJ5IGRlZmluaXRpb24gdGhlIGJyb2FkY2FzdCBpcyBhbHNvIGEgbXVsdGljYXN0IGFkZHJlc3MgKi8KKwkJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRlc3QpKSB7CisJCQlwa3RfdHlwZSA9IEJSX1BLVF9CUk9BRENBU1Q7CisJCQlsb2NhbF9yY3YgPSB0cnVlOworCQl9IGVsc2UgeworCQkJcGt0X3R5cGUgPSBCUl9QS1RfTVVMVElDQVNUOworCQkJaWYgKGJyX211bHRpY2FzdF9yY3YoYnIsIHAsIHNrYiwgdmlkKSkKKwkJCQlnb3RvIGRyb3A7CisJCX0KKwl9CiAKIAlpZiAocC0+c3RhdGUgPT0gQlJfU1RBVEVfTEVBUk5JTkcpCiAJCWdvdG8gZHJvcDsKIAogCUJSX0lOUFVUX1NLQl9DQihza2IpLT5icmRldiA9IGJyLT5kZXY7CiAKLQlsb2NhbF9yY3YgPSAhIShici0+ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKTsKLQogCWlmIChJU19FTkFCTEVEKENPTkZJR19JTkVUKSAmJiBza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0FSUCkpCiAJCWJyX2RvX3Byb3h5X2FycChza2IsIGJyLCB2aWQsIHApOwogCi0JaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRlc3QpKSB7Ci0JCWxvY2FsX3JjdiA9IHRydWU7Ci0JCXVuaWNhc3QgPSBmYWxzZTsKLQl9IGVsc2UgaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpKSB7CisJc3dpdGNoIChwa3RfdHlwZSkgeworCWNhc2UgQlJfUEtUX01VTFRJQ0FTVDoKIAkJbWRzdCA9IGJyX21kYl9nZXQoYnIsIHNrYiwgdmlkKTsKIAkJaWYgKChtZHN0IHx8IEJSX0lOUFVUX1NLQl9DQl9NUk9VVEVSU19PTkxZKHNrYikpICYmCiAJCSAgICBicl9tdWx0aWNhc3RfcXVlcmllcl9leGlzdHMoYnIsIGV0aF9oZHIoc2tiKSkpIHsKQEAgLTE4MSwxOCArMTg2LDIyIEBACiAJCQlsb2NhbF9yY3YgPSB0cnVlOwogCQkJYnItPmRldi0+c3RhdHMubXVsdGljYXN0Kys7CiAJCX0KLQkJdW5pY2FzdCA9IGZhbHNlOwotCX0gZWxzZSBpZiAoKGRzdCA9IF9fYnJfZmRiX2dldChiciwgZGVzdCwgdmlkKSkgJiYgZHN0LT5pc19sb2NhbCkgewotCQkvKiBEbyBub3QgZm9yd2FyZCB0aGUgcGFja2V0IHNpbmNlIGl0J3MgbG9jYWwuICovCi0JCXJldHVybiBicl9wYXNzX2ZyYW1lX3VwKHNrYik7CisJCWJyZWFrOworCWNhc2UgQlJfUEtUX1VOSUNBU1Q6CisJCWRzdCA9IF9fYnJfZmRiX2dldChiciwgZGVzdCwgdmlkKTsKKwlkZWZhdWx0OgorCQlicmVhazsKIAl9CiAKIAlpZiAoZHN0KSB7CisJCWlmIChkc3QtPmlzX2xvY2FsKQorCQkJcmV0dXJuIGJyX3Bhc3NfZnJhbWVfdXAoc2tiKTsKKwogCQlkc3QtPnVzZWQgPSBqaWZmaWVzOwogCQlicl9mb3J3YXJkKGRzdC0+ZHN0LCBza2IsIGxvY2FsX3JjdiwgZmFsc2UpOwogCX0gZWxzZSB7CiAJCWlmICghbWNhc3RfaGl0KQotCQkJYnJfZmxvb2QoYnIsIHNrYiwgdW5pY2FzdCwgbG9jYWxfcmN2LCBmYWxzZSk7CisJCQlicl9mbG9vZChiciwgc2tiLCBwa3RfdHlwZSwgbG9jYWxfcmN2LCBmYWxzZSk7CiAJCWVsc2UKIAkJCWJyX211bHRpY2FzdF9mbG9vZChtZHN0LCBza2IsIGxvY2FsX3JjdiwgZmFsc2UpOwogCX0KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbXVsdGljYXN0LmMgYi9uZXQvYnJpZGdlL2JyX211bHRpY2FzdC5jCmluZGV4IGE1NDIzYTEuLmM1ZmVhOTMgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfbXVsdGljYXN0LmMKKysrIGIvbmV0L2JyaWRnZS9icl9tdWx0aWNhc3QuYwpAQCAtMTEzOCw3ICsxMTM4LDcgQEAKIAkJfSBlbHNlIHsKIAkJCWVyciA9IGJyX2lwNl9tdWx0aWNhc3RfYWRkX2dyb3VwKGJyLCBwb3J0LAogCQkJCQkJCSAmZ3JlYy0+Z3JlY19tY2EsIHZpZCk7Ci0JCQlpZiAoIWVycikKKwkJCWlmIChlcnIpCiAJCQkJYnJlYWs7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlcl9ob29rcy5jIGIvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXJfaG9va3MuYwppbmRleCA3N2U3ZjY5Li4yZmU5MzQ1IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlcl9ob29rcy5jCisrKyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyX2hvb2tzLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9pbl9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxuZXQvaXAuaD4KQEAgLTM5NSwxMSArMzk2LDEwIEBACiAJCQkJc2tiLT5kZXYgPSBuZl9icmlkZ2UtPnBoeXNpbmRldjsKIAkJCQluZl9icmlkZ2VfdXBkYXRlX3Byb3RvY29sKHNrYik7CiAJCQkJbmZfYnJpZGdlX3B1c2hfZW5jYXBfaGVhZGVyKHNrYik7Ci0JCQkJTkZfSE9PS19USFJFU0goTkZQUk9UT19CUklER0UsCi0JCQkJCSAgICAgICBORl9CUl9QUkVfUk9VVElORywKLQkJCQkJICAgICAgIG5ldCwgc2ssIHNrYiwgc2tiLT5kZXYsIE5VTEwsCi0JCQkJCSAgICAgICBicl9uZl9wcmVfcm91dGluZ19maW5pc2hfYnJpZGdlLAotCQkJCQkgICAgICAgMSk7CisJCQkJYnJfbmZfaG9va190aHJlc2goTkZfQlJfUFJFX1JPVVRJTkcsCisJCQkJCQkgIG5ldCwgc2ssIHNrYiwgc2tiLT5kZXYsCisJCQkJCQkgIE5VTEwsCisJCQkJCQkgIGJyX25mX3ByZV9yb3V0aW5nX2ZpbmlzaCk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlldGhlcl9hZGRyX2NvcHkoZXRoX2hkcihza2IpLT5oX2Rlc3QsIGRldi0+ZGV2X2FkZHIpOwpAQCAtNDE3LDEwICs0MTcsOCBAQAogCXNrYi0+ZGV2ID0gbmZfYnJpZGdlLT5waHlzaW5kZXY7CiAJbmZfYnJpZGdlX3VwZGF0ZV9wcm90b2NvbChza2IpOwogCW5mX2JyaWRnZV9wdXNoX2VuY2FwX2hlYWRlcihza2IpOwotCU5GX0hPT0tfVEhSRVNIKE5GUFJPVE9fQlJJREdFLCBORl9CUl9QUkVfUk9VVElORywgbmV0LCBzaywgc2tiLAotCQkgICAgICAgc2tiLT5kZXYsIE5VTEwsCi0JCSAgICAgICBicl9oYW5kbGVfZnJhbWVfZmluaXNoLCAxKTsKLQorCWJyX25mX2hvb2tfdGhyZXNoKE5GX0JSX1BSRV9ST1VUSU5HLCBuZXQsIHNrLCBza2IsIHNrYi0+ZGV2LCBOVUxMLAorCQkJICBicl9oYW5kbGVfZnJhbWVfZmluaXNoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTkyLDYgKzk5MCw0MyBAQAogCS5ub3RpZmllcl9jYWxsID0gYnJuZl9kZXZpY2VfZXZlbnQsCiB9OwogCisvKiByZWN1cnNpdmVseSBpbnZva2VzIG5mX2hvb2tfc2xvdyAoYWdhaW4pLCBza2lwcGluZyBhbHJlYWR5LWNhbGxlZAorICogaG9va3MgKDwgTkZfQlJfUFJJX0JSTkYpLgorICoKKyAqIENhbGxlZCB3aXRoIHJjdSByZWFkIGxvY2sgaGVsZC4KKyAqLworaW50IGJyX25mX2hvb2tfdGhyZXNoKHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3QgbmV0ICpuZXQsCisJCSAgICAgIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2LAorCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LAorCQkgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3QgbmV0ICosIHN0cnVjdCBzb2NrICosCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlzdHJ1Y3QgbmZfaG9va19lbnRyeSAqZWxlbTsKKwlzdHJ1Y3QgbmZfaG9va19zdGF0ZSBzdGF0ZTsKKwlpbnQgcmV0OworCisJZWxlbSA9IHJjdV9kZXJlZmVyZW5jZShuZXQtPm5mLmhvb2tzW05GUFJPVE9fQlJJREdFXVtob29rXSk7CisKKwl3aGlsZSAoZWxlbSAmJiAoZWxlbS0+b3BzLnByaW9yaXR5IDw9IE5GX0JSX1BSSV9CUk5GKSkKKwkJZWxlbSA9IHJjdV9kZXJlZmVyZW5jZShlbGVtLT5uZXh0KTsKKworCWlmICghZWxlbSkKKwkJcmV0dXJuIG9rZm4obmV0LCBzaywgc2tiKTsKKworCS8qIFdlIG1heSBhbHJlYWR5IGhhdmUgdGhpcywgYnV0IHJlYWQtbG9ja3MgbmVzdCBhbnl3YXkgKi8KKwlyY3VfcmVhZF9sb2NrKCk7CisJbmZfaG9va19zdGF0ZV9pbml0KCZzdGF0ZSwgZWxlbSwgaG9vaywgTkZfQlJfUFJJX0JSTkYgKyAxLAorCQkJICAgTkZQUk9UT19CUklER0UsIGluZGV2LCBvdXRkZXYsIHNrLCBuZXQsIG9rZm4pOworCisJcmV0ID0gbmZfaG9va19zbG93KHNrYiwgJnN0YXRlKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlpZiAocmV0ID09IDEpCisJCXJldCA9IG9rZm4obmV0LCBzaywgc2tiKTsKKworCXJldHVybiByZXQ7Cit9CisKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiBzdGF0aWMKIGludCBicm5mX3N5c2N0bF9jYWxsX3RhYmxlcyhzdHJ1Y3QgY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyX2lwdjYuYyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyX2lwdjYuYwppbmRleCA1ZTU5YTg0Li41OTg5NjYxIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlcl9pcHY2LmMKKysrIGIvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXJfaXB2Ni5jCkBAIC0xODcsMTAgKzE4Nyw5IEBACiAJCQlza2ItPmRldiA9IG5mX2JyaWRnZS0+cGh5c2luZGV2OwogCQkJbmZfYnJpZGdlX3VwZGF0ZV9wcm90b2NvbChza2IpOwogCQkJbmZfYnJpZGdlX3B1c2hfZW5jYXBfaGVhZGVyKHNrYik7Ci0JCQlORl9IT09LX1RIUkVTSChORlBST1RPX0JSSURHRSwgTkZfQlJfUFJFX1JPVVRJTkcsCi0JCQkJICAgICAgIG5ldCwgc2ssIHNrYiwgc2tiLT5kZXYsIE5VTEwsCi0JCQkJICAgICAgIGJyX25mX3ByZV9yb3V0aW5nX2ZpbmlzaF9icmlkZ2UsCi0JCQkJICAgICAgIDEpOworCQkJYnJfbmZfaG9va190aHJlc2goTkZfQlJfUFJFX1JPVVRJTkcsCisJCQkJCSAgbmV0LCBzaywgc2tiLCBza2ItPmRldiwgTlVMTCwKKwkJCQkJICBicl9uZl9wcmVfcm91dGluZ19maW5pc2hfYnJpZGdlKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWV0aGVyX2FkZHJfY29weShldGhfaGRyKHNrYiktPmhfZGVzdCwgZGV2LT5kZXZfYWRkcik7CkBAIC0yMDcsOSArMjA2LDggQEAKIAlza2ItPmRldiA9IG5mX2JyaWRnZS0+cGh5c2luZGV2OwogCW5mX2JyaWRnZV91cGRhdGVfcHJvdG9jb2woc2tiKTsKIAluZl9icmlkZ2VfcHVzaF9lbmNhcF9oZWFkZXIoc2tiKTsKLQlORl9IT09LX1RIUkVTSChORlBST1RPX0JSSURHRSwgTkZfQlJfUFJFX1JPVVRJTkcsIG5ldCwgc2ssIHNrYiwKLQkJICAgICAgIHNrYi0+ZGV2LCBOVUxMLAotCQkgICAgICAgYnJfaGFuZGxlX2ZyYW1lX2ZpbmlzaCwgMSk7CisJYnJfbmZfaG9va190aHJlc2goTkZfQlJfUFJFX1JPVVRJTkcsIG5ldCwgc2ssIHNrYiwKKwkJCSAgc2tiLT5kZXYsIE5VTEwsIGJyX2hhbmRsZV9mcmFtZV9maW5pc2gpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGxpbmsuYyBiL25ldC9icmlkZ2UvYnJfbmV0bGluay5jCmluZGV4IGYyYTI5ZTQuLmU5OTAzN2MgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfbmV0bGluay5jCisrKyBiL25ldC9icmlkZ2UvYnJfbmV0bGluay5jCkBAIC0xNjksMTAgKzE2OSwxNSBAQAogCSAgICBubGFfcHV0X3UzMihza2IsIElGTEFfQlJQT1JUX0NPU1QsIHAtPnBhdGhfY29zdCkgfHwKIAkgICAgbmxhX3B1dF91OChza2IsIElGTEFfQlJQT1JUX01PREUsIG1vZGUpIHx8CiAJICAgIG5sYV9wdXRfdTgoc2tiLCBJRkxBX0JSUE9SVF9HVUFSRCwgISEocC0+ZmxhZ3MgJiBCUl9CUERVX0dVQVJEKSkgfHwKLQkgICAgbmxhX3B1dF91OChza2IsIElGTEFfQlJQT1JUX1BST1RFQ1QsICEhKHAtPmZsYWdzICYgQlJfUk9PVF9CTE9DSykpIHx8Ci0JICAgIG5sYV9wdXRfdTgoc2tiLCBJRkxBX0JSUE9SVF9GQVNUX0xFQVZFLCAhIShwLT5mbGFncyAmIEJSX01VTFRJQ0FTVF9GQVNUX0xFQVZFKSkgfHwKKwkgICAgbmxhX3B1dF91OChza2IsIElGTEFfQlJQT1JUX1BST1RFQ1QsCisJCSAgICAgICAhIShwLT5mbGFncyAmIEJSX1JPT1RfQkxPQ0spKSB8fAorCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9CUlBPUlRfRkFTVF9MRUFWRSwKKwkJICAgICAgICEhKHAtPmZsYWdzICYgQlJfTVVMVElDQVNUX0ZBU1RfTEVBVkUpKSB8fAogCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9CUlBPUlRfTEVBUk5JTkcsICEhKHAtPmZsYWdzICYgQlJfTEVBUk5JTkcpKSB8fAotCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9CUlBPUlRfVU5JQ0FTVF9GTE9PRCwgISEocC0+ZmxhZ3MgJiBCUl9GTE9PRCkpIHx8CisJICAgIG5sYV9wdXRfdTgoc2tiLCBJRkxBX0JSUE9SVF9VTklDQVNUX0ZMT09ELAorCQkgICAgICAgISEocC0+ZmxhZ3MgJiBCUl9GTE9PRCkpIHx8CisJICAgIG5sYV9wdXRfdTgoc2tiLCBJRkxBX0JSUE9SVF9NQ0FTVF9GTE9PRCwKKwkJICAgICAgICEhKHAtPmZsYWdzICYgQlJfTUNBU1RfRkxPT0QpKSB8fAogCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9CUlBPUlRfUFJPWFlBUlAsICEhKHAtPmZsYWdzICYgQlJfUFJPWFlBUlApKSB8fAogCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9CUlBPUlRfUFJPWFlBUlBfV0lGSSwKIAkJICAgICAgICEhKHAtPmZsYWdzICYgQlJfUFJPWFlBUlBfV0lGSSkpIHx8CkBAIC02MzAsNiArNjM1LDcgQEAKIAlicl9zZXRfcG9ydF9mbGFnKHAsIHRiLCBJRkxBX0JSUE9SVF9QUk9URUNULCBCUl9ST09UX0JMT0NLKTsKIAlicl9zZXRfcG9ydF9mbGFnKHAsIHRiLCBJRkxBX0JSUE9SVF9MRUFSTklORywgQlJfTEVBUk5JTkcpOwogCWJyX3NldF9wb3J0X2ZsYWcocCwgdGIsIElGTEFfQlJQT1JUX1VOSUNBU1RfRkxPT0QsIEJSX0ZMT09EKTsKKwlicl9zZXRfcG9ydF9mbGFnKHAsIHRiLCBJRkxBX0JSUE9SVF9NQ0FTVF9GTE9PRCwgQlJfTUNBU1RfRkxPT0QpOwogCWJyX3NldF9wb3J0X2ZsYWcocCwgdGIsIElGTEFfQlJQT1JUX1BST1hZQVJQLCBCUl9QUk9YWUFSUCk7CiAJYnJfc2V0X3BvcnRfZmxhZyhwLCB0YiwgSUZMQV9CUlBPUlRfUFJPWFlBUlBfV0lGSSwgQlJfUFJPWFlBUlBfV0lGSSk7CiAKQEAgLTEyNDUsMTQgKzEyNTEsMzAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNpemVfdCBicmlkZ2VfZ2V0X2xpbmt4c3RhdHNfc2l6ZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHNpemVfdCBicl9nZXRfbGlua3hzdGF0c19zaXplKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhdHRyKQogewotCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCA9IE5VTEw7CiAJc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cCAqdmc7CiAJc3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdjsKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnI7CiAJaW50IG51bXZscyA9IDA7CiAKLQl2ZyA9IGJyX3ZsYW5fZ3JvdXAoYnIpOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgSUZMQV9TVEFUU19MSU5LX1hTVEFUUzoKKwkJYnIgPSBuZXRkZXZfcHJpdihkZXYpOworCQl2ZyA9IGJyX3ZsYW5fZ3JvdXAoYnIpOworCQlicmVhazsKKwljYXNlIElGTEFfU1RBVFNfTElOS19YU1RBVFNfU0xBVkU6CisJCXAgPSBicl9wb3J0X2dldF9ydG5sKGRldik7CisJCWlmICghcCkKKwkJCXJldHVybiAwOworCQliciA9IHAtPmJyOworCQl2ZyA9IG5icF92bGFuX2dyb3VwKHApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKIAlpZiAodmcpIHsKIAkJLyogd2UgbmVlZCB0byBjb3VudCBhbGwsIGV2ZW4gcGxhY2Vob2xkZXIgZW50cmllcyAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHYsICZ2Zy0+dmxhbl9saXN0LCB2bGlzdCkKQEAgLTEyNjQsNDUgKzEyODYsNDIgQEAKIAkgICAgICAgbmxhX3RvdGFsX3NpemUoMCk7CiB9CiAKLXN0YXRpYyBzaXplX3QgYnJwb3J0X2dldF9saW5reHN0YXRzX3NpemUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgYnJfZmlsbF9saW5reHN0YXRzKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgaW50ICpwcml2aWR4LCBpbnQgYXR0cikKIHsKLQlyZXR1cm4gbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBicl9tY2FzdF9zdGF0cykpICsKLQkgICAgICAgbmxhX3RvdGFsX3NpemUoMCk7Ci19Ci0KLXN0YXRpYyBzaXplX3QgYnJfZ2V0X2xpbmt4c3RhdHNfc2l6ZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYXR0cikKLXsKLQlzaXplX3QgcmV0c2l6ZSA9IDA7CisJc3RydWN0IG5sYXR0ciAqbmxhIF9fbWF5YmVfdW51c2VkOworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAgPSBOVUxMOworCXN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnOworCXN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnY7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyOworCXN0cnVjdCBubGF0dHIgKm5lc3Q7CisJaW50IHZsX2lkeCA9IDA7CiAKIAlzd2l0Y2ggKGF0dHIpIHsKIAljYXNlIElGTEFfU1RBVFNfTElOS19YU1RBVFM6Ci0JCXJldHNpemUgPSBicmlkZ2VfZ2V0X2xpbmt4c3RhdHNfc2l6ZShkZXYpOworCQliciA9IG5ldGRldl9wcml2KGRldik7CisJCXZnID0gYnJfdmxhbl9ncm91cChicik7CiAJCWJyZWFrOwogCWNhc2UgSUZMQV9TVEFUU19MSU5LX1hTVEFUU19TTEFWRToKLQkJcmV0c2l6ZSA9IGJycG9ydF9nZXRfbGlua3hzdGF0c19zaXplKGRldik7CisJCXAgPSBicl9wb3J0X2dldF9ydG5sKGRldik7CisJCWlmICghcCkKKwkJCXJldHVybiAwOworCQliciA9IHAtPmJyOworCQl2ZyA9IG5icF92bGFuX2dyb3VwKHApOwogCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZXR1cm4gcmV0c2l6ZTsKLX0KLQotc3RhdGljIGludCBicmlkZ2VfZmlsbF9saW5reHN0YXRzKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgaW50ICpwcml2aWR4KQotewotCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG5sYXR0ciAqbmxhIF9fbWF5YmVfdW51c2VkOwotCXN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnOwotCXN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnY7Ci0Jc3RydWN0IG5sYXR0ciAqbmVzdDsKLQlpbnQgdmxfaWR4ID0gMDsKLQogCW5lc3QgPSBubGFfbmVzdF9zdGFydChza2IsIExJTktfWFNUQVRTX1RZUEVfQlJJREdFKTsKIAlpZiAoIW5lc3QpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAKLQl2ZyA9IGJyX3ZsYW5fZ3JvdXAoYnIpOwogCWlmICh2ZykgeworCQl1MTYgcHZpZDsKKworCQlwdmlkID0gYnJfZ2V0X3B2aWQodmcpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHYsICZ2Zy0+dmxhbl9saXN0LCB2bGlzdCkgewogCQkJc3RydWN0IGJyaWRnZV92bGFuX3hzdGF0cyB2eGk7CiAJCQlzdHJ1Y3QgYnJfdmxhbl9zdGF0cyBzdGF0czsKQEAgLTEzMTEsNiArMTMzMCw5IEBACiAJCQkJY29udGludWU7CiAJCQltZW1zZXQoJnZ4aSwgMCwgc2l6ZW9mKHZ4aSkpOwogCQkJdnhpLnZpZCA9IHYtPnZpZDsKKwkJCXZ4aS5mbGFncyA9IHYtPmZsYWdzOworCQkJaWYgKHYtPnZpZCA9PSBwdmlkKQorCQkJCXZ4aS5mbGFncyB8PSBCUklER0VfVkxBTl9JTkZPX1BWSUQ7CiAJCQlicl92bGFuX2dldF9zdGF0cyh2LCAmc3RhdHMpOwogCQkJdnhpLnJ4X2J5dGVzID0gc3RhdHMucnhfYnl0ZXM7CiAJCQl2eGkucnhfcGFja2V0cyA9IHN0YXRzLnJ4X3BhY2tldHM7CkBAIC0xMzI5LDcgKzEzNTEsNyBAQAogCQkJCQlCUklER0VfWFNUQVRTX1BBRCk7CiAJCWlmICghbmxhKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0JCWJyX211bHRpY2FzdF9nZXRfc3RhdHMoYnIsIE5VTEwsIG5sYV9kYXRhKG5sYSkpOworCQlicl9tdWx0aWNhc3RfZ2V0X3N0YXRzKGJyLCBwLCBubGFfZGF0YShubGEpKTsKIAl9CiAjZW5kaWYKIAlubGFfbmVzdF9lbmQoc2tiLCBuZXN0KTsKQEAgLTEzNDQsNTIgKzEzNjYsNiBAQAogCXJldHVybiAtRU1TR1NJWkU7CiB9CiAKLXN0YXRpYyBpbnQgYnJwb3J0X2ZpbGxfbGlua3hzdGF0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgIGludCAqcHJpdmlkeCkKLXsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwID0gYnJfcG9ydF9nZXRfcnRubChkZXYpOwotCXN0cnVjdCBubGF0dHIgKm5sYSBfX21heWJlX3VudXNlZDsKLQlzdHJ1Y3QgbmxhdHRyICpuZXN0OwotCi0JaWYgKCFwKQotCQlyZXR1cm4gMDsKLQotCW5lc3QgPSBubGFfbmVzdF9zdGFydChza2IsIExJTktfWFNUQVRTX1RZUEVfQlJJREdFKTsKLQlpZiAoIW5lc3QpCi0JCXJldHVybiAtRU1TR1NJWkU7Ci0jaWZkZWYgQ09ORklHX0JSSURHRV9JR01QX1NOT09QSU5HCi0JbmxhID0gbmxhX3Jlc2VydmVfNjRiaXQoc2tiLCBCUklER0VfWFNUQVRTX01DQVNULAotCQkJCXNpemVvZihzdHJ1Y3QgYnJfbWNhc3Rfc3RhdHMpLAotCQkJCUJSSURHRV9YU1RBVFNfUEFEKTsKLQlpZiAoIW5sYSkgewotCQlubGFfbmVzdF9lbmQoc2tiLCBuZXN0KTsKLQkJcmV0dXJuIC1FTVNHU0laRTsKLQl9Ci0JYnJfbXVsdGljYXN0X2dldF9zdGF0cyhwLT5iciwgcCwgbmxhX2RhdGEobmxhKSk7Ci0jZW5kaWYKLQlubGFfbmVzdF9lbmQoc2tiLCBuZXN0KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJyX2ZpbGxfbGlua3hzdGF0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgaW50ICpwcml2aWR4LCBpbnQgYXR0cikKLXsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQotCXN3aXRjaCAoYXR0cikgewotCWNhc2UgSUZMQV9TVEFUU19MSU5LX1hTVEFUUzoKLQkJcmV0ID0gYnJpZGdlX2ZpbGxfbGlua3hzdGF0cyhza2IsIGRldiwgcHJpdmlkeCk7Ci0JCWJyZWFrOwotCWNhc2UgSUZMQV9TVEFUU19MSU5LX1hTVEFUU19TTEFWRToKLQkJcmV0ID0gYnJwb3J0X2ZpbGxfbGlua3hzdGF0cyhza2IsIGRldiwgcHJpdmlkeCk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcnRubF9hZl9vcHMgYnJfYWZfb3BzIF9fcmVhZF9tb3N0bHkgPSB7CiAJLmZhbWlseQkJCT0gQUZfQlJJREdFLAogCS5nZXRfbGlua19hZl9zaXplCT0gYnJfZ2V0X2xpbmtfYWZfc2l6ZV9maWx0ZXJlZCwKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oIGIvbmV0L2JyaWRnZS9icl9wcml2YXRlLmgKaW5kZXggYWFjMmE2ZS4uMWI2MzE3NyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9wcml2YXRlLmgKKysrIGIvbmV0L2JyaWRnZS9icl9wcml2YXRlLmgKQEAgLTI1MSw2ICsyNTEsOSBAQAogI2lmZGVmIENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkcKIAlzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwCV9fcmN1ICp2bGdycDsKICNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfU1dJVENIREVWCisJaW50CQkJCW9mZmxvYWRfZndkX21hcms7CisjZW5kaWYKIH07CiAKICNkZWZpbmUgYnJfYXV0b19wb3J0KHApICgocCktPmZsYWdzICYgQlJfQVVUT19NQVNLKQpAQCAtMzU5LDYgKzM2MiwxMSBAQAogCXN0cnVjdCB0aW1lcl9saXN0CQlnY190aW1lcjsKIAlzdHJ1Y3Qga29iamVjdAkJCSppZm9iajsKIAl1MzIJCQkJYXV0b19jbnQ7CisKKyNpZmRlZiBDT05GSUdfTkVUX1NXSVRDSERFVgorCWludCBvZmZsb2FkX2Z3ZF9tYXJrOworI2VuZGlmCisKICNpZmRlZiBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HCiAJc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cAlfX3JjdSAqdmxncnA7CiAJdTgJCQkJdmxhbl9lbmFibGVkOwpAQCAtMzgxLDYgKzM4OSwxMCBAQAogI2lmZGVmIENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkcKIAlib29sIHZsYW5fZmlsdGVyZWQ7CiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19ORVRfU1dJVENIREVWCisJaW50IG9mZmxvYWRfZndkX21hcms7CisjZW5kaWYKIH07CiAKICNkZWZpbmUgQlJfSU5QVVRfU0tCX0NCKF9fc2tiKQkoKHN0cnVjdCBicl9pbnB1dF9za2JfY2IgKikoX19za2IpLT5jYikKQEAgLTQ5Niw3ICs1MDgsNyBAQAogaW50IGJyX2ZkYl9hZGQoc3RydWN0IG5kbXNnICpubGgsIHN0cnVjdCBubGF0dHIgKnRiW10sIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIHUxNiB2aWQsIHUxNiBubGhfZmxhZ3MpOwogaW50IGJyX2ZkYl9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKLQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmZkZXYsIGludCBpZHgpOworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZmRldiwgaW50ICppZHgpOwogaW50IGJyX2ZkYl9zeW5jX3N0YXRpYyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApOwogdm9pZCBicl9mZGJfdW5zeW5jX3N0YXRpYyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApOwogaW50IGJyX2ZkYl9leHRlcm5hbF9sZWFybl9hZGQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLApAQCAtNTA1LDEyICs1MTcsMTcgQEAKIAkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIHUxNiB2aWQpOwogCiAvKiBicl9mb3J3YXJkLmMgKi8KK2VudW0gYnJfcGt0X3R5cGUgeworCUJSX1BLVF9VTklDQVNULAorCUJSX1BLVF9NVUxUSUNBU1QsCisJQlJfUEtUX0JST0FEQ0FTVAorfTsKIGludCBicl9kZXZfcXVldWVfcHVzaF94bWl0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHZvaWQgYnJfZm9yd2FyZChjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICp0bywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJYm9vbCBsb2NhbF9yY3YsIGJvb2wgbG9jYWxfb3JpZyk7CiBpbnQgYnJfZm9yd2FyZF9maW5pc2goc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZCBicl9mbG9vZChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBza19idWZmICpza2IsCi0JICAgICAgYm9vbCB1bmljYXN0LCBib29sIGxvY2FsX3JjdiwgYm9vbCBsb2NhbF9vcmlnKTsKKwkgICAgICBlbnVtIGJyX3BrdF90eXBlIHBrdF90eXBlLCBib29sIGxvY2FsX3JjdiwgYm9vbCBsb2NhbF9vcmlnKTsKIAogLyogYnJfaWYuYyAqLwogdm9pZCBicl9wb3J0X2NhcnJpZXJfY2hlY2soc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCk7CkBAIC0xMDM0LDQgKzEwNTEsMjkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBicl9zeXNmc19kZWxicihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7IHJldHVybjsgfQogI2VuZGlmIC8qIENPTkZJR19TWVNGUyAqLwogCisvKiBicl9zd2l0Y2hkZXYuYyAqLworI2lmZGVmIENPTkZJR19ORVRfU1dJVENIREVWCitpbnQgbmJwX3N3aXRjaGRldl9tYXJrX3NldChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKTsKK3ZvaWQgbmJwX3N3aXRjaGRldl9mcmFtZV9tYXJrKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2Jvb2wgbmJwX3N3aXRjaGRldl9hbGxvd2VkX2VncmVzcyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAorCQkJCSAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgbmJwX3N3aXRjaGRldl9tYXJrX3NldChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmJwX3N3aXRjaGRldl9mcmFtZV9tYXJrKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCisJCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgbmJwX3N3aXRjaGRldl9hbGxvd2VkX2VncmVzcyhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAorCQkJCQkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZiAvKiBDT05GSUdfTkVUX1NXSVRDSERFViAqLworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfc3RwX2lmLmMgYi9uZXQvYnJpZGdlL2JyX3N0cF9pZi5jCmluZGV4IDM0MWNhYTAuLmQ4YWQ3M2IzIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3N0cF9pZi5jCisrKyBiL25ldC9icmlkZ2UvYnJfc3RwX2lmLmMKQEAgLTEzNCwxNyArMTM0LDM2IEBACiAJCWJyX2JlY29tZV9yb290X2JyaWRnZShicik7CiB9CiAKK3N0YXRpYyBpbnQgYnJfc3RwX2NhbGxfdXNlcihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIGNoYXIgKmFyZykKK3sKKwljaGFyICphcmd2W10gPSB7IEJSX1NUUF9QUk9HLCBici0+ZGV2LT5uYW1lLCBhcmcsIE5VTEwgfTsKKwljaGFyICplbnZwW10gPSB7IE5VTEwgfTsKKwlpbnQgcmM7CisKKwkvKiBjYWxsIHVzZXJzcGFjZSBTVFAgYW5kIHJlcG9ydCBwcm9ncmFtIGVycm9ycyAqLworCXJjID0gY2FsbF91c2VybW9kZWhlbHBlcihCUl9TVFBfUFJPRywgYXJndiwgZW52cCwgVU1IX1dBSVRfUFJPQyk7CisJaWYgKHJjID4gMCkgeworCQlpZiAocmMgJiAweGZmKQorCQkJYnJfZGVidWcoYnIsIEJSX1NUUF9QUk9HICIgcmVjZWl2ZWQgc2lnbmFsICVkXG4iLAorCQkJCSByYyAmIDB4N2YpOworCQllbHNlCisJCQlicl9kZWJ1ZyhiciwgQlJfU1RQX1BST0cgIiBleGl0ZWQgd2l0aCBjb2RlICVkXG4iLAorCQkJCSAocmMgPj4gOCkgJiAweGZmKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKIHN0YXRpYyB2b2lkIGJyX3N0cF9zdGFydChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpCiB7Ci0JaW50IHI7Ci0JY2hhciAqYXJndltdID0geyBCUl9TVFBfUFJPRywgYnItPmRldi0+bmFtZSwgInN0YXJ0IiwgTlVMTCB9OwotCWNoYXIgKmVudnBbXSA9IHsgTlVMTCB9OwogCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7CisJaW50IGVyciA9IC1FTk9FTlQ7CiAKIAlpZiAobmV0X2VxKGRldl9uZXQoYnItPmRldiksICZpbml0X25ldCkpCi0JCXIgPSBjYWxsX3VzZXJtb2RlaGVscGVyKEJSX1NUUF9QUk9HLCBhcmd2LCBlbnZwLCBVTUhfV0FJVF9QUk9DKTsKLQllbHNlCi0JCXIgPSAtRU5PRU5UOworCQllcnIgPSBicl9zdHBfY2FsbF91c2VyKGJyLCAic3RhcnQiKTsKKworCWlmIChlcnIgJiYgZXJyICE9IC1FTk9FTlQpCisJCWJyX2VycihiciwgImZhaWxlZCB0byBzdGFydCB1c2Vyc3BhY2UgU1RQICglZClcbiIsIGVycik7CiAKIAlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKIApAQCAtMTUzLDkgKzE3MiwxMCBAQAogCWVsc2UgaWYgKGJyLT5icmlkZ2VfZm9yd2FyZF9kZWxheSA+IEJSX01BWF9GT1JXQVJEX0RFTEFZKQogCQlfX2JyX3NldF9mb3J3YXJkX2RlbGF5KGJyLCBCUl9NQVhfRk9SV0FSRF9ERUxBWSk7CiAKLQlpZiAociA9PSAwKSB7CisJaWYgKCFlcnIpIHsKIAkJYnItPnN0cF9lbmFibGVkID0gQlJfVVNFUl9TVFA7CiAJCWJyX2RlYnVnKGJyLCAidXNlcnNwYWNlIFNUUCBzdGFydGVkXG4iKTsKKwogCQkvKiBTdG9wIGhlbGxvIGFuZCBob2xkIHRpbWVycyAqLwogCQlkZWxfdGltZXIoJmJyLT5oZWxsb190aW1lcik7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpCkBAIC0xNzMsMTQgKzE5MywxMyBAQAogCiBzdGF0aWMgdm9pZCBicl9zdHBfc3RvcChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpCiB7Ci0JaW50IHI7Ci0JY2hhciAqYXJndltdID0geyBCUl9TVFBfUFJPRywgYnItPmRldi0+bmFtZSwgInN0b3AiLCBOVUxMIH07Ci0JY2hhciAqZW52cFtdID0geyBOVUxMIH07CiAJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKKwlpbnQgZXJyOwogCiAJaWYgKGJyLT5zdHBfZW5hYmxlZCA9PSBCUl9VU0VSX1NUUCkgewotCQlyID0gY2FsbF91c2VybW9kZWhlbHBlcihCUl9TVFBfUFJPRywgYXJndiwgZW52cCwgVU1IX1dBSVRfUFJPQyk7Ci0JCWJyX2luZm8oYnIsICJ1c2Vyc3BhY2UgU1RQIHN0b3BwZWQsIHJldHVybiBjb2RlICVkXG4iLCByKTsKKwkJZXJyID0gYnJfc3RwX2NhbGxfdXNlcihiciwgInN0b3AiKTsKKwkJaWYgKGVycikKKwkJCWJyX2VycihiciwgImZhaWxlZCB0byBzdG9wIHVzZXJzcGFjZSBTVFAgKCVkKVxuIiwgZXJyKTsKIAogCQkvKiBUbyBzdGFydCB0aW1lcnMgb24gYW55IHBvcnRzIGxlZnQgaW4gYmxvY2tpbmcgKi8KIAkJbW9kX3RpbWVyKCZici0+aGVsbG9fdGltZXIsIGppZmZpZXMgKyBici0+aGVsbG9fdGltZSk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N3aXRjaGRldi5jIGIvbmV0L2JyaWRnZS9icl9zd2l0Y2hkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDA5N2I5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JyaWRnZS9icl9zd2l0Y2hkZXYuYwpAQCAtMCwwICsxLDU3IEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zd2l0Y2hkZXYuaD4KKworI2luY2x1ZGUgImJyX3ByaXZhdGUuaCIKKworc3RhdGljIGludCBicl9zd2l0Y2hkZXZfbWFya19nZXQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7CisKKwkvKiBkZXYgaXMgeWV0IHRvIGJlIGFkZGVkIHRvIHRoZSBwb3J0IGxpc3QuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgeworCQlpZiAoc3dpdGNoZGV2X3BvcnRfc2FtZV9wYXJlbnRfaWQoZGV2LCBwLT5kZXYpKQorCQkJcmV0dXJuIHAtPm9mZmxvYWRfZndkX21hcms7CisJfQorCisJcmV0dXJuICsrYnItPm9mZmxvYWRfZndkX21hcms7Cit9CisKK2ludCBuYnBfc3dpdGNoZGV2X21hcmtfc2V0KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApCit7CisJc3RydWN0IHN3aXRjaGRldl9hdHRyIGF0dHIgPSB7CisJCS5vcmlnX2RldiA9IHAtPmRldiwKKwkJLmlkID0gU1dJVENIREVWX0FUVFJfSURfUE9SVF9QQVJFTlRfSUQsCisJfTsKKwlpbnQgZXJyOworCisJQVNTRVJUX1JUTkwoKTsKKworCWVyciA9IHN3aXRjaGRldl9wb3J0X2F0dHJfZ2V0KHAtPmRldiwgJmF0dHIpOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gZXJyOworCX0KKworCXAtPm9mZmxvYWRfZndkX21hcmsgPSBicl9zd2l0Y2hkZXZfbWFya19nZXQocC0+YnIsIHAtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBuYnBfc3dpdGNoZGV2X2ZyYW1lX21hcmsoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKHNrYi0+b2ZmbG9hZF9md2RfbWFyayAmJiAhV0FSTl9PTl9PTkNFKCFwLT5vZmZsb2FkX2Z3ZF9tYXJrKSkKKwkJQlJfSU5QVVRfU0tCX0NCKHNrYiktPm9mZmxvYWRfZndkX21hcmsgPSBwLT5vZmZsb2FkX2Z3ZF9tYXJrOworfQorCitib29sIG5icF9zd2l0Y2hkZXZfYWxsb3dlZF9lZ3Jlc3MoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuICFza2ItPm9mZmxvYWRfZndkX21hcmsgfHwKKwkgICAgICAgQlJfSU5QVVRfU0tCX0NCKHNrYiktPm9mZmxvYWRfZndkX21hcmsgIT0gcC0+b2ZmbG9hZF9md2RfbWFyazsKK30KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfc3lzZnNfaWYuYyBiL25ldC9icmlkZ2UvYnJfc3lzZnNfaWYuYwppbmRleCAxZTA0ZDRkLi5lNjU3MjU4IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3N5c2ZzX2lmLmMKKysrIGIvbmV0L2JyaWRnZS9icl9zeXNmc19pZi5jCkBAIC0xNzEsNiArMTcxLDcgQEAKIEJSUE9SVF9BVFRSX0ZMQUcodW5pY2FzdF9mbG9vZCwgQlJfRkxPT0QpOwogQlJQT1JUX0FUVFJfRkxBRyhwcm94eWFycCwgQlJfUFJPWFlBUlApOwogQlJQT1JUX0FUVFJfRkxBRyhwcm94eWFycF93aWZpLCBCUl9QUk9YWUFSUF9XSUZJKTsKK0JSUE9SVF9BVFRSX0ZMQUcobXVsdGljYXN0X2Zsb29kLCBCUl9NQ0FTVF9GTE9PRCk7CiAKICNpZmRlZiBDT05GSUdfQlJJREdFX0lHTVBfU05PT1BJTkcKIHN0YXRpYyBzc2l6ZV90IHNob3dfbXVsdGljYXN0X3JvdXRlcihzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBjaGFyICpidWYpCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKaW5kZXggMTUyMzAwZC4uOWExMTA4NiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYwpAQCAtOTEsNyArOTEsNyBAQAogCWlmIChsb2dpbmZvLT50eXBlID09IE5GX0xPR19UWVBFX0xPRykKIAkJYml0bWFzayA9IGxvZ2luZm8tPnUubG9nLmxvZ2ZsYWdzOwogCWVsc2UKLQkJYml0bWFzayA9IE5GX0xPR19NQVNLOworCQliaXRtYXNrID0gTkZfTE9HX0RFRkFVTFRfTUFTSzsKIAogCWlmICgoYml0bWFzayAmIEVCVF9MT0dfSVApICYmIGV0aF9oZHIoc2tiKS0+aF9wcm90byA9PQogCSAgIGh0b25zKEVUSF9QX0lQKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3JlZGlyZWN0LmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfcmVkaXJlY3QuYwppbmRleCAyMDM5NjQ5OS4uMmU3YzRmOSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3JlZGlyZWN0LmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3JlZGlyZWN0LmMKQEAgLTI0LDcgKzI0LDcgQEAKIAkJcmV0dXJuIEVCVF9EUk9QOwogCiAJaWYgKHBhci0+aG9va251bSAhPSBORl9CUl9CUk9VVElORykKLQkJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCisJCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfdGhyZXNoICovCiAJCWV0aGVyX2FkZHJfY29weShldGhfaGRyKHNrYiktPmhfZGVzdCwKIAkJCQlicl9wb3J0X2dldF9yY3UocGFyLT5pbiktPmJyLT5kZXYtPmRldl9hZGRyKTsKIAllbHNlCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlcy5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZXMuYwppbmRleCBjY2VhYzViLi5mNWMxMWJiIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlcy5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVzLmMKQEAgLTE0Niw3ICsxNDYsNyBAQAogCQlyZXR1cm4gMTsKIAlpZiAoTkZfSU5WRihlLCBFQlRfSU9VVCwgZWJ0X2Rldl9jaGVjayhlLT5vdXQsIG91dCkpKQogCQlyZXR1cm4gMTsKLQkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3Nsb3cgKi8KKwkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3RocmVzaCAqLwogCWlmIChpbiAmJiAocCA9IGJyX3BvcnRfZ2V0X3JjdShpbikpICE9IE5VTEwgJiYKIAkgICAgTkZfSU5WRihlLCBFQlRfSUxPR0lDQUxJTiwKIAkJICAgIGVidF9kZXZfY2hlY2soZS0+bG9naWNhbF9pbiwgcC0+YnItPmRldikpKQpAQCAtMzY4LDYgKzM2OCw4IEBACiAKIAltYXRjaCA9IHh0X2ZpbmRfbWF0Y2goTkZQUk9UT19CUklER0UsIG0tPnUubmFtZSwgMCk7CiAJaWYgKElTX0VSUihtYXRjaCkgfHwgbWF0Y2gtPmZhbWlseSAhPSBORlBST1RPX0JSSURHRSkgeworCQlpZiAoIUlTX0VSUihtYXRjaCkpCisJCQltb2R1bGVfcHV0KG1hdGNoLT5tZSk7CiAJCXJlcXVlc3RfbW9kdWxlKCJlYnRfJXMiLCBtLT51Lm5hbWUpOwogCQltYXRjaCA9IHh0X2ZpbmRfbWF0Y2goTkZQUk9UT19CUklER0UsIG0tPnUubmFtZSwgMCk7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZfbG9nX2JyaWRnZS5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZfbG9nX2JyaWRnZS5jCmluZGV4IDVkOTk1M2EuLjE2NjNkZjUgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL25mX2xvZ19icmlkZ2UuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9uZl9sb2dfYnJpZGdlLmMKQEAgLTUwLDggKzUwLDcgQEAKIAogc3RhdGljIGludCBfX25ldF9pbml0IG5mX2xvZ19icmlkZ2VfbmV0X2luaXQoc3RydWN0IG5ldCAqbmV0KQogewotCW5mX2xvZ19zZXQobmV0LCBORlBST1RPX0JSSURHRSwgJm5mX2JyaWRnZV9sb2dnZXIpOwotCXJldHVybiAwOworCXJldHVybiBuZl9sb2dfc2V0KG5ldCwgTkZQUk9UT19CUklER0UsICZuZl9icmlkZ2VfbG9nZ2VyKTsKIH0KIAogc3RhdGljIHZvaWQgX19uZXRfZXhpdCBuZl9sb2dfYnJpZGdlX25ldF9leGl0KHN0cnVjdCBuZXQgKm5ldCkKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL25mX3RhYmxlc19icmlkZ2UuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL25mX3RhYmxlc19icmlkZ2UuYwppbmRleCBhNzhjNGUyLi45N2FmZGMwIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9uZl90YWJsZXNfYnJpZGdlLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZfdGFibGVzX2JyaWRnZS5jCkBAIC0xMyw3OSArMTMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXMuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19icmlkZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY0Lmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXNfaXB2Ni5oPgogCi1pbnQgbmZ0X2JyaWRnZV9pcGhkcl92YWxpZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBpcGhkciAqaXBoOwotCXUzMiBsZW47Ci0KLQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSkpCi0JCXJldHVybiAwOwotCi0JaXBoID0gaXBfaGRyKHNrYik7Ci0JaWYgKGlwaC0+aWhsIDwgNSB8fCBpcGgtPnZlcnNpb24gIT0gNCkKLQkJcmV0dXJuIDA7Ci0KLQlsZW4gPSBudG9ocyhpcGgtPnRvdF9sZW4pOwotCWlmIChza2ItPmxlbiA8IGxlbikKLQkJcmV0dXJuIDA7Ci0JZWxzZSBpZiAobGVuIDwgKGlwaC0+aWhsKjQpKQotCQlyZXR1cm4gMDsKLQotCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGlwaC0+aWhsKjQpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobmZ0X2JyaWRnZV9pcGhkcl92YWxpZGF0ZSk7Ci0KLWludCBuZnRfYnJpZGdlX2lwNmhkcl92YWxpZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBpcHY2aGRyICpoZHI7Ci0JdTMyIHBrdF9sZW47Ci0KLQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSkKLQkJcmV0dXJuIDA7Ci0KLQloZHIgPSBpcHY2X2hkcihza2IpOwotCWlmIChoZHItPnZlcnNpb24gIT0gNikKLQkJcmV0dXJuIDA7Ci0KLQlwa3RfbGVuID0gbnRvaHMoaGRyLT5wYXlsb2FkX2xlbik7Ci0JaWYgKHBrdF9sZW4gKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpID4gc2tiLT5sZW4pCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChuZnRfYnJpZGdlX2lwNmhkcl92YWxpZGF0ZSk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBuZnRfYnJpZGdlX3NldF9wa3RpbmZvX2lwdjQoc3RydWN0IG5mdF9wa3RpbmZvICpwa3QsCi0JCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQotewotCWlmIChuZnRfYnJpZGdlX2lwaGRyX3ZhbGlkYXRlKHNrYikpCi0JCW5mdF9zZXRfcGt0aW5mb19pcHY0KHBrdCwgc2tiLCBzdGF0ZSk7Ci0JZWxzZQotCQluZnRfc2V0X3BrdGluZm8ocGt0LCBza2IsIHN0YXRlKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG5mdF9icmlkZ2Vfc2V0X3BrdGluZm9faXB2NihzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCwKLQkJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCi17Ci0jaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKLQlpZiAobmZ0X2JyaWRnZV9pcDZoZHJfdmFsaWRhdGUoc2tiKSAmJgotCSAgICBuZnRfc2V0X3BrdGluZm9faXB2Nihwa3QsIHNrYiwgc3RhdGUpID09IDApCi0JCXJldHVybjsKLSNlbmRpZgotCW5mdF9zZXRfcGt0aW5mbyhwa3QsIHNrYiwgc3RhdGUpOwotfQotCiBzdGF0aWMgdW5zaWduZWQgaW50CiBuZnRfZG9fY2hhaW5fYnJpZGdlKHZvaWQgKnByaXYsCiAJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtOTUsMTMgKzI3LDEzIEBACiAKIAlzd2l0Y2ggKGV0aF9oZHIoc2tiKS0+aF9wcm90bykgewogCWNhc2UgaHRvbnMoRVRIX1BfSVApOgotCQluZnRfYnJpZGdlX3NldF9wa3RpbmZvX2lwdjQoJnBrdCwgc2tiLCBzdGF0ZSk7CisJCW5mdF9zZXRfcGt0aW5mb19pcHY0X3ZhbGlkYXRlKCZwa3QsIHNrYiwgc3RhdGUpOwogCQlicmVhazsKIAljYXNlIGh0b25zKEVUSF9QX0lQVjYpOgotCQluZnRfYnJpZGdlX3NldF9wa3RpbmZvX2lwdjYoJnBrdCwgc2tiLCBzdGF0ZSk7CisJCW5mdF9zZXRfcGt0aW5mb19pcHY2X3ZhbGlkYXRlKCZwa3QsIHNrYiwgc3RhdGUpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQluZnRfc2V0X3BrdGluZm8oJnBrdCwgc2tiLCBzdGF0ZSk7CisJCW5mdF9zZXRfcGt0aW5mb191bnNwZWMoJnBrdCwgc2tiLCBzdGF0ZSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMjA3LDEyICsxMzksMjAgQEAKIAlpbnQgcmV0OwogCiAJbmZfcmVnaXN0ZXJfYWZpbmZvKCZuZl9icl9hZmluZm8pOwotCW5mdF9yZWdpc3Rlcl9jaGFpbl90eXBlKCZmaWx0ZXJfYnJpZGdlKTsKKwlyZXQgPSBuZnRfcmVnaXN0ZXJfY2hhaW5fdHlwZSgmZmlsdGVyX2JyaWRnZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyMTsKKwogCXJldCA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm5mX3RhYmxlc19icmlkZ2VfbmV0X29wcyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJbmZ0X3VucmVnaXN0ZXJfY2hhaW5fdHlwZSgmZmlsdGVyX2JyaWRnZSk7Ci0JCW5mX3VucmVnaXN0ZXJfYWZpbmZvKCZuZl9icl9hZmluZm8pOwotCX0KKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnIyOworCisJcmV0dXJuIHJldDsKKworZXJyMjoKKwluZnRfdW5yZWdpc3Rlcl9jaGFpbl90eXBlKCZmaWx0ZXJfYnJpZGdlKTsKK2VycjE6CisJbmZfdW5yZWdpc3Rlcl9hZmluZm8oJm5mX2JyX2FmaW5mbyk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZ0X21ldGFfYnJpZGdlLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9uZnRfbWV0YV9icmlkZ2UuYwppbmRleCA0YjkwMWQ5Li5hZDQ3YTkyIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9uZnRfbWV0YV9icmlkZ2UuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9uZnRfbWV0YV9icmlkZ2UuYwpAQCAtODYsNiArODYsNyBAQAogCS5pbml0CQk9IG5mdF9tZXRhX3NldF9pbml0LAogCS5kZXN0cm95CT0gbmZ0X21ldGFfc2V0X2Rlc3Ryb3ksCiAJLmR1bXAJCT0gbmZ0X21ldGFfc2V0X2R1bXAsCisJLnZhbGlkYXRlCT0gbmZ0X21ldGFfc2V0X3ZhbGlkYXRlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfZXhwcl9vcHMgKgpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9icmlkZ2UuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL25mdF9yZWplY3RfYnJpZGdlLmMKaW5kZXggMGI3N2ZmYi4uNGIzZGY2YiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9icmlkZ2UuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9uZnRfcmVqZWN0X2JyaWRnZS5jCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZnRfcmVqZWN0Lmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXNfYnJpZGdlLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9pcHY0L25mX3JlamVjdC5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2Ni9uZl9yZWplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgpAQCAtMzcsNiArMzYsMzAgQEAKIAlza2JfcHVsbChuc2tiLCBFVEhfSExFTik7CiB9CiAKK3N0YXRpYyBpbnQgbmZ0X2JyaWRnZV9pcGhkcl92YWxpZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcGhkciAqaXBoOworCXUzMiBsZW47CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSkpCisJCXJldHVybiAwOworCisJaXBoID0gaXBfaGRyKHNrYik7CisJaWYgKGlwaC0+aWhsIDwgNSB8fCBpcGgtPnZlcnNpb24gIT0gNCkKKwkJcmV0dXJuIDA7CisKKwlsZW4gPSBudG9ocyhpcGgtPnRvdF9sZW4pOworCWlmIChza2ItPmxlbiA8IGxlbikKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAobGVuIDwgKGlwaC0+aWhsKjQpKQorCQlyZXR1cm4gMDsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGlwaC0+aWhsKjQpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCiAvKiBXZSBjYW5ub3QgdXNlIG9sZHNrYi0+ZGV2LCBpdCBjYW4gYmUgZWl0aGVyIGJyaWRnZSBkZXZpY2UgKE5GX0JSSURHRSBJTlBVVCkKICAqIG9yIHRoZSBicmlkZ2UgcG9ydCAoTkZfQlJJREdFIFBSRVJPVVRJTkcpLgogICovCkBAIC0xNDMsNiArMTY2LDI1IEBACiAJYnJfZm9yd2FyZChicl9wb3J0X2dldF9yY3UoZGV2KSwgbnNrYiwgZmFsc2UsIHRydWUpOwogfQogCitzdGF0aWMgaW50IG5mdF9icmlkZ2VfaXA2aGRyX3ZhbGlkYXRlKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwdjZoZHIgKmhkcjsKKwl1MzIgcGt0X2xlbjsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpKQorCQlyZXR1cm4gMDsKKworCWhkciA9IGlwdjZfaGRyKHNrYik7CisJaWYgKGhkci0+dmVyc2lvbiAhPSA2KQorCQlyZXR1cm4gMDsKKworCXBrdF9sZW4gPSBudG9ocyhoZHItPnBheWxvYWRfbGVuKTsKKwlpZiAocGt0X2xlbiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgPiBza2ItPmxlbikKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKwogc3RhdGljIHZvaWQgbmZ0X3JlamVjdF9icl9zZW5kX3Y2X3RjcF9yZXNldChzdHJ1Y3QgbmV0ICpuZXQsCiAJCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqb2xkc2tiLAogCQkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldi5jIGIvbmV0L2NvcmUvZGV2LmMKaW5kZXggNGNlMDdkYy4uZjFmZTI2ZiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2LmMKKysrIGIvbmV0L2NvcmUvZGV2LmMKQEAgLTMzNTUsMTYgKzMzNTUsNiBAQAogCWVsc2UKIAkJc2tiX2RzdF9mb3JjZShza2IpOwogCi0jaWZkZWYgQ09ORklHX05FVF9TV0lUQ0hERVYKLQkvKiBEb24ndCBmb3J3YXJkIGlmIG9mZmxvYWQgZGV2aWNlIGFscmVhZHkgZm9yd2FyZGVkICovCi0JaWYgKHNrYi0+b2ZmbG9hZF9md2RfbWFyayAmJgotCSAgICBza2ItPm9mZmxvYWRfZndkX21hcmsgPT0gZGV2LT5vZmZsb2FkX2Z3ZF9tYXJrKSB7Ci0JCWNvbnN1bWVfc2tiKHNrYik7Ci0JCXJjID0gTkVUX1hNSVRfU1VDQ0VTUzsKLQkJZ290byBvdXQ7Ci0JfQotI2VuZGlmCi0KIAl0eHEgPSBuZXRkZXZfcGlja190eChkZXYsIHNrYiwgYWNjZWxfcHJpdik7CiAJcSA9IHJjdV9kZXJlZmVyZW5jZV9iaCh0eHEtPnFkaXNjKTsKIApAQCAtMzkxNCw4ICszOTA0LDcgQEAKIAl9CiB9CiAKLSNpZiAoZGVmaW5lZChDT05GSUdfQlJJREdFKSB8fCBkZWZpbmVkKENPTkZJR19CUklER0VfTU9EVUxFKSkgJiYgXAotICAgIChkZWZpbmVkKENPTkZJR19BVE1fTEFORSkgfHwgZGVmaW5lZChDT05GSUdfQVRNX0xBTkVfTU9EVUxFKSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19CUklER0UpICYmIElTX0VOQUJMRUQoQ09ORklHX0FUTV9MQU5FKQogLyogVGhpcyBob29rIGlzIGRlZmluZWQgaGVyZSBmb3IgQVRNIExBTkUgKi8KIGludCAoKmJyX2ZkYl90ZXN0X2FkZHJfaG9vaykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICAgdW5zaWduZWQgY2hhciAqYWRkcikgX19yZWFkX21vc3RseTsKQEAgLTM5NzUsNiArMzk2NCwyMiBAQAogfQogCiAvKioKKyAqCW5ldGRldl9pc19yeF9oYW5kbGVyX2J1c3kgLSBjaGVjayBpZiByZWNlaXZlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZAorICoJQGRldjogZGV2aWNlIHRvIGNoZWNrCisgKgorICoJQ2hlY2sgaWYgYSByZWNlaXZlIGhhbmRsZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGRldmljZS4KKyAqCVJldHVybiB0cnVlIGlmIHRoZXJlIG9uZS4KKyAqCisgKglUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgcnRubF9tdXRleC4KKyAqLworYm9vbCBuZXRkZXZfaXNfcnhfaGFuZGxlcl9idXN5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJQVNTRVJUX1JUTkwoKTsKKwlyZXR1cm4gZGV2ICYmIHJ0bmxfZGVyZWZlcmVuY2UoZGV2LT5yeF9oYW5kbGVyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5ldGRldl9pc19yeF9oYW5kbGVyX2J1c3kpOworCisvKioKICAqCW5ldGRldl9yeF9oYW5kbGVyX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgcmVjZWl2ZSBoYW5kbGVyCiAgKglAZGV2OiBkZXZpY2UgdG8gcmVnaXN0ZXIgYSBoYW5kbGVyIGZvcgogICoJQHJ4X2hhbmRsZXI6IHJlY2VpdmUgaGFuZGxlciB0byByZWdpc3RlcgpAQCAtNDA1MCwxMiArNDA1NSwxNyBAQAogewogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfSU5HUkVTUwogCWlmIChuZl9ob29rX2luZ3Jlc3NfYWN0aXZlKHNrYikpIHsKKwkJaW50IGluZ3Jlc3NfcmV0dmFsOworCiAJCWlmICgqcHRfcHJldikgewogCQkJKnJldCA9IGRlbGl2ZXJfc2tiKHNrYiwgKnB0X3ByZXYsIG9yaWdfZGV2KTsKIAkJCSpwdF9wcmV2ID0gTlVMTDsKIAkJfQogCi0JCXJldHVybiBuZl9ob29rX2luZ3Jlc3Moc2tiKTsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlpbmdyZXNzX3JldHZhbCA9IG5mX2hvb2tfaW5ncmVzcyhza2IpOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIGluZ3Jlc3NfcmV0dmFsOwogCX0KICNlbmRpZiAvKiBDT05GSUdfTkVURklMVEVSX0lOR1JFU1MgKi8KIAlyZXR1cm4gMDsKQEAgLTQyOTIsMzIgKzQzMDIsNTMgQEAKIH0KIEVYUE9SVF9TWU1CT0wobmV0aWZfcmVjZWl2ZV9za2IpOwogCi0vKiBOZXR3b3JrIGRldmljZSBpcyBnb2luZyBhd2F5LCBmbHVzaCBhbnkgcGFja2V0cyBzdGlsbCBwZW5kaW5nCi0gKiBDYWxsZWQgd2l0aCBpcnFzIGRpc2FibGVkLgotICovCi1zdGF0aWMgdm9pZCBmbHVzaF9iYWNrbG9nKHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYXJnOwotCXN0cnVjdCBzb2Z0bmV0X2RhdGEgKnNkID0gdGhpc19jcHVfcHRyKCZzb2Z0bmV0X2RhdGEpOwotCXN0cnVjdCBza19idWZmICpza2IsICp0bXA7CitERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgd29ya19zdHJ1Y3QsIGZsdXNoX3dvcmtzKTsKIAorLyogTmV0d29yayBkZXZpY2UgaXMgZ29pbmcgYXdheSwgZmx1c2ggYW55IHBhY2tldHMgc3RpbGwgcGVuZGluZyAqLworc3RhdGljIHZvaWQgZmx1c2hfYmFja2xvZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnRtcDsKKwlzdHJ1Y3Qgc29mdG5ldF9kYXRhICpzZDsKKworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwlzZCA9IHRoaXNfY3B1X3B0cigmc29mdG5ldF9kYXRhKTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJcnBzX2xvY2soc2QpOwogCXNrYl9xdWV1ZV93YWxrX3NhZmUoJnNkLT5pbnB1dF9wa3RfcXVldWUsIHNrYiwgdG1wKSB7Ci0JCWlmIChza2ItPmRldiA9PSBkZXYpIHsKKwkJaWYgKHNrYi0+ZGV2LT5yZWdfc3RhdGUgPT0gTkVUUkVHX1VOUkVHSVNURVJJTkcpIHsKIAkJCV9fc2tiX3VubGluayhza2IsICZzZC0+aW5wdXRfcGt0X3F1ZXVlKTsKIAkJCWtmcmVlX3NrYihza2IpOwogCQkJaW5wdXRfcXVldWVfaGVhZF9pbmNyKHNkKTsKIAkJfQogCX0KIAlycHNfdW5sb2NrKHNkKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKIAlza2JfcXVldWVfd2Fsa19zYWZlKCZzZC0+cHJvY2Vzc19xdWV1ZSwgc2tiLCB0bXApIHsKLQkJaWYgKHNrYi0+ZGV2ID09IGRldikgeworCQlpZiAoc2tiLT5kZXYtPnJlZ19zdGF0ZSA9PSBORVRSRUdfVU5SRUdJU1RFUklORykgewogCQkJX19za2JfdW5saW5rKHNrYiwgJnNkLT5wcm9jZXNzX3F1ZXVlKTsKIAkJCWtmcmVlX3NrYihza2IpOwogCQkJaW5wdXRfcXVldWVfaGVhZF9pbmNyKHNkKTsKIAkJfQogCX0KKwlsb2NhbF9iaF9lbmFibGUoKTsKK30KKworc3RhdGljIHZvaWQgZmx1c2hfYWxsX2JhY2tsb2dzKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNwdTsKKworCWdldF9vbmxpbmVfY3B1cygpOworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCXF1ZXVlX3dvcmtfb24oY3B1LCBzeXN0ZW1faGlnaHByaV93cSwKKwkJCSAgICAgIHBlcl9jcHVfcHRyKCZmbHVzaF93b3JrcywgY3B1KSk7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJZmx1c2hfd29yayhwZXJfY3B1X3B0cigmZmx1c2hfd29ya3MsIGNwdSkpOworCisJcHV0X29ubGluZV9jcHVzKCk7CiB9CiAKIHN0YXRpYyBpbnQgbmFwaV9ncm9fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTQ4MDUsOCArNDgzNiw5IEBACiAKIHN0YXRpYyBpbnQgcHJvY2Vzc19iYWNrbG9nKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IHF1b3RhKQogewotCWludCB3b3JrID0gMDsKIAlzdHJ1Y3Qgc29mdG5ldF9kYXRhICpzZCA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3Qgc29mdG5ldF9kYXRhLCBiYWNrbG9nKTsKKwlib29sIGFnYWluID0gdHJ1ZTsKKwlpbnQgd29yayA9IDA7CiAKIAkvKiBDaGVjayBpZiB3ZSBoYXZlIHBlbmRpbmcgaXBpLCBpdHMgYmV0dGVyIHRvIHNlbmQgdGhlbSBub3csCiAJICogbm90IHdhaXRpbmcgbmV0X3J4X2FjdGlvbigpIGVuZC4KQEAgLTQ4MTcsMjMgKzQ4NDksMjAgQEAKIAl9CiAKIAluYXBpLT53ZWlnaHQgPSB3ZWlnaHRfcDsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCXdoaWxlICgxKSB7CisJd2hpbGUgKGFnYWluKSB7CiAJCXN0cnVjdCBza19idWZmICpza2I7CiAKIAkJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZzZC0+cHJvY2Vzc19xdWV1ZSkpKSB7CiAJCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJCQlfX25ldGlmX3JlY2VpdmVfc2tiKHNrYik7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJCQlpbnB1dF9xdWV1ZV9oZWFkX2luY3Ioc2QpOwotCQkJaWYgKCsrd29yayA+PSBxdW90YSkgewotCQkJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJCWlmICgrK3dvcmsgPj0gcXVvdGEpCiAJCQkJcmV0dXJuIHdvcms7Ci0JCQl9CisKIAkJfQogCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJCXJwc19sb2NrKHNkKTsKIAkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmc2QtPmlucHV0X3BrdF9xdWV1ZSkpIHsKIAkJCS8qCkBAIC00ODQ1LDE2ICs0ODc0LDE0IEBACiAJCQkgKiBhbmQgd2UgZG9udCBuZWVkIGFuIHNtcF9tYigpIG1lbW9yeSBiYXJyaWVyLgogCQkJICovCiAJCQluYXBpLT5zdGF0ZSA9IDA7Ci0JCQlycHNfdW5sb2NrKHNkKTsKLQotCQkJYnJlYWs7CisJCQlhZ2FpbiA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJc2tiX3F1ZXVlX3NwbGljZV90YWlsX2luaXQoJnNkLT5pbnB1dF9wa3RfcXVldWUsCisJCQkJCQkgICAmc2QtPnByb2Nlc3NfcXVldWUpOwogCQl9Ci0KLQkJc2tiX3F1ZXVlX3NwbGljZV90YWlsX2luaXQoJnNkLT5pbnB1dF9wa3RfcXVldWUsCi0JCQkJCSAgICZzZC0+cHJvY2Vzc19xdWV1ZSk7CiAJCXJwc191bmxvY2soc2QpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJfQotCWxvY2FsX2lycV9lbmFibGUoKTsKIAogCXJldHVybiB3b3JrOwogfQpAQCAtNTU2Miw2ICs1NTg5LDcgQEAKIAogc3RhdGljIGludCBfX25ldGRldl9hZGphY2VudF9kZXZfaW5zZXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICphZGpfZGV2LAorCQkJCQl1MTYgcmVmX25yLAogCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpkZXZfbGlzdCwKIAkJCQkJdm9pZCAqcHJpdmF0ZSwgYm9vbCBtYXN0ZXIpCiB7CkBAIC01NTcxLDcgKzU1OTksNyBAQAogCWFkaiA9IF9fbmV0ZGV2X2ZpbmRfYWRqKGFkal9kZXYsIGRldl9saXN0KTsKIAogCWlmIChhZGopIHsKLQkJYWRqLT5yZWZfbnIrKzsKKwkJYWRqLT5yZWZfbnIgKz0gcmVmX25yOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTU1ODEsNyArNTYwOSw3IEBACiAKIAlhZGotPmRldiA9IGFkal9kZXY7CiAJYWRqLT5tYXN0ZXIgPSBtYXN0ZXI7Ci0JYWRqLT5yZWZfbnIgPSAxOworCWFkai0+cmVmX25yID0gcmVmX25yOwogCWFkai0+cHJpdmF0ZSA9IHByaXZhdGU7CiAJZGV2X2hvbGQoYWRqX2Rldik7CiAKQEAgLTU2MjAsNiArNTY0OCw3IEBACiAKIHN0YXRpYyB2b2lkIF9fbmV0ZGV2X2FkamFjZW50X2Rldl9yZW1vdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICphZGpfZGV2LAorCQkJCQkgdTE2IHJlZl9uciwKIAkJCQkJIHN0cnVjdCBsaXN0X2hlYWQgKmRldl9saXN0KQogewogCXN0cnVjdCBuZXRkZXZfYWRqYWNlbnQgKmFkajsKQEAgLTU2MzIsMTAgKzU2NjEsMTAgQEAKIAkJQlVHKCk7CiAJfQogCi0JaWYgKGFkai0+cmVmX25yID4gMSkgewotCQlwcl9kZWJ1ZygiJXMgdG8gJXMgcmVmX25yLS0gPSAlZFxuIiwgZGV2LT5uYW1lLCBhZGpfZGV2LT5uYW1lLAotCQkJIGFkai0+cmVmX25yLTEpOwotCQlhZGotPnJlZl9uci0tOworCWlmIChhZGotPnJlZl9uciA+IHJlZl9ucikgeworCQlwcl9kZWJ1ZygiJXMgdG8gJXMgcmVmX25yLSVkID0gJWRcbiIsIGRldi0+bmFtZSwgYWRqX2Rldi0+bmFtZSwKKwkJCSByZWZfbnIsIGFkai0+cmVmX25yLXJlZl9ucik7CisJCWFkai0+cmVmX25yIC09IHJlZl9ucjsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTY1NCwyMSArNTY4MywyMiBAQAogCiBzdGF0aWMgaW50IF9fbmV0ZGV2X2FkamFjZW50X2Rldl9saW5rX2xpc3RzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqdXBwZXJfZGV2LAorCQkJCQkgICAgdTE2IHJlZl9uciwKIAkJCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKnVwX2xpc3QsCiAJCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkb3duX2xpc3QsCiAJCQkJCSAgICB2b2lkICpwcml2YXRlLCBib29sIG1hc3RlcikKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gX19uZXRkZXZfYWRqYWNlbnRfZGV2X2luc2VydChkZXYsIHVwcGVyX2RldiwgdXBfbGlzdCwgcHJpdmF0ZSwKLQkJCQkJICAgbWFzdGVyKTsKKwlyZXQgPSBfX25ldGRldl9hZGphY2VudF9kZXZfaW5zZXJ0KGRldiwgdXBwZXJfZGV2LCByZWZfbnIsIHVwX2xpc3QsCisJCQkJCSAgIHByaXZhdGUsIG1hc3Rlcik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IF9fbmV0ZGV2X2FkamFjZW50X2Rldl9pbnNlcnQodXBwZXJfZGV2LCBkZXYsIGRvd25fbGlzdCwgcHJpdmF0ZSwKLQkJCQkJICAgZmFsc2UpOworCXJldCA9IF9fbmV0ZGV2X2FkamFjZW50X2Rldl9pbnNlcnQodXBwZXJfZGV2LCBkZXYsIHJlZl9uciwgZG93bl9saXN0LAorCQkJCQkgICBwcml2YXRlLCBmYWxzZSk7CiAJaWYgKHJldCkgewotCQlfX25ldGRldl9hZGphY2VudF9kZXZfcmVtb3ZlKGRldiwgdXBwZXJfZGV2LCB1cF9saXN0KTsKKwkJX19uZXRkZXZfYWRqYWNlbnRfZGV2X3JlbW92ZShkZXYsIHVwcGVyX2RldiwgcmVmX25yLCB1cF9saXN0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTU2NzYsOSArNTcwNiwxMCBAQAogfQogCiBzdGF0aWMgaW50IF9fbmV0ZGV2X2FkamFjZW50X2Rldl9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKnVwcGVyX2RldikKKwkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqdXBwZXJfZGV2LAorCQkJCSAgICAgIHUxNiByZWZfbnIpCiB7Ci0JcmV0dXJuIF9fbmV0ZGV2X2FkamFjZW50X2Rldl9saW5rX2xpc3RzKGRldiwgdXBwZXJfZGV2LAorCXJldHVybiBfX25ldGRldl9hZGphY2VudF9kZXZfbGlua19saXN0cyhkZXYsIHVwcGVyX2RldiwgcmVmX25yLAogCQkJCQkJJmRldi0+YWxsX2Fkal9saXN0LnVwcGVyLAogCQkJCQkJJnVwcGVyX2Rldi0+YWxsX2Fkal9saXN0Lmxvd2VyLAogCQkJCQkJTlVMTCwgZmFsc2UpOwpAQCAtNTY4NiwxNyArNTcxNywxOSBAQAogCiBzdGF0aWMgdm9pZCBfX25ldGRldl9hZGphY2VudF9kZXZfdW5saW5rX2xpc3RzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqdXBwZXJfZGV2LAorCQkJCQkgICAgICAgdTE2IHJlZl9uciwKIAkJCQkJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnVwX2xpc3QsCiAJCQkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkb3duX2xpc3QpCiB7Ci0JX19uZXRkZXZfYWRqYWNlbnRfZGV2X3JlbW92ZShkZXYsIHVwcGVyX2RldiwgdXBfbGlzdCk7Ci0JX19uZXRkZXZfYWRqYWNlbnRfZGV2X3JlbW92ZSh1cHBlcl9kZXYsIGRldiwgZG93bl9saXN0KTsKKwlfX25ldGRldl9hZGphY2VudF9kZXZfcmVtb3ZlKGRldiwgdXBwZXJfZGV2LCByZWZfbnIsIHVwX2xpc3QpOworCV9fbmV0ZGV2X2FkamFjZW50X2Rldl9yZW1vdmUodXBwZXJfZGV2LCBkZXYsIHJlZl9uciwgZG93bl9saXN0KTsKIH0KIAogc3RhdGljIHZvaWQgX19uZXRkZXZfYWRqYWNlbnRfZGV2X3VubGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKnVwcGVyX2RldikKKwkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICp1cHBlcl9kZXYsCisJCQkJCSB1MTYgcmVmX25yKQogewotCV9fbmV0ZGV2X2FkamFjZW50X2Rldl91bmxpbmtfbGlzdHMoZGV2LCB1cHBlcl9kZXYsCisJX19uZXRkZXZfYWRqYWNlbnRfZGV2X3VubGlua19saXN0cyhkZXYsIHVwcGVyX2RldiwgcmVmX25yLAogCQkJCQkgICAmZGV2LT5hbGxfYWRqX2xpc3QudXBwZXIsCiAJCQkJCSAgICZ1cHBlcl9kZXYtPmFsbF9hZGpfbGlzdC5sb3dlcik7CiB9CkBAIC01NzA1LDE3ICs1NzM4LDE3IEBACiAJCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqdXBwZXJfZGV2LAogCQkJCQkJdm9pZCAqcHJpdmF0ZSwgYm9vbCBtYXN0ZXIpCiB7Ci0JaW50IHJldCA9IF9fbmV0ZGV2X2FkamFjZW50X2Rldl9saW5rKGRldiwgdXBwZXJfZGV2KTsKKwlpbnQgcmV0ID0gX19uZXRkZXZfYWRqYWNlbnRfZGV2X2xpbmsoZGV2LCB1cHBlcl9kZXYsIDEpOwogCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IF9fbmV0ZGV2X2FkamFjZW50X2Rldl9saW5rX2xpc3RzKGRldiwgdXBwZXJfZGV2LAorCXJldCA9IF9fbmV0ZGV2X2FkamFjZW50X2Rldl9saW5rX2xpc3RzKGRldiwgdXBwZXJfZGV2LCAxLAogCQkJCQkgICAgICAgJmRldi0+YWRqX2xpc3QudXBwZXIsCiAJCQkJCSAgICAgICAmdXBwZXJfZGV2LT5hZGpfbGlzdC5sb3dlciwKIAkJCQkJICAgICAgIHByaXZhdGUsIG1hc3Rlcik7CiAJaWYgKHJldCkgewotCQlfX25ldGRldl9hZGphY2VudF9kZXZfdW5saW5rKGRldiwgdXBwZXJfZGV2KTsKKwkJX19uZXRkZXZfYWRqYWNlbnRfZGV2X3VubGluayhkZXYsIHVwcGVyX2RldiwgMSk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC01NzI1LDggKzU3NTgsOCBAQAogc3RhdGljIHZvaWQgX19uZXRkZXZfYWRqYWNlbnRfZGV2X3VubGlua19uZWlnaGJvdXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICp1cHBlcl9kZXYpCiB7Ci0JX19uZXRkZXZfYWRqYWNlbnRfZGV2X3VubGluayhkZXYsIHVwcGVyX2Rldik7Ci0JX19uZXRkZXZfYWRqYWNlbnRfZGV2X3VubGlua19saXN0cyhkZXYsIHVwcGVyX2RldiwKKwlfX25ldGRldl9hZGphY2VudF9kZXZfdW5saW5rKGRldiwgdXBwZXJfZGV2LCAxKTsKKwlfX25ldGRldl9hZGphY2VudF9kZXZfdW5saW5rX2xpc3RzKGRldiwgdXBwZXJfZGV2LCAxLAogCQkJCQkgICAmZGV2LT5hZGpfbGlzdC51cHBlciwKIAkJCQkJICAgJnVwcGVyX2Rldi0+YWRqX2xpc3QubG93ZXIpOwogfQpAQCAtNTc3OSw3ICs1ODEyLDcgQEAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShqLCAmdXBwZXJfZGV2LT5hbGxfYWRqX2xpc3QudXBwZXIsIGxpc3QpIHsKIAkJCXByX2RlYnVnKCJJbnRlcmxpbmtpbmcgJXMgd2l0aCAlcywgbm9uLW5laWdoYm91clxuIiwKIAkJCQkgaS0+ZGV2LT5uYW1lLCBqLT5kZXYtPm5hbWUpOwotCQkJcmV0ID0gX19uZXRkZXZfYWRqYWNlbnRfZGV2X2xpbmsoaS0+ZGV2LCBqLT5kZXYpOworCQkJcmV0ID0gX19uZXRkZXZfYWRqYWNlbnRfZGV2X2xpbmsoaS0+ZGV2LCBqLT5kZXYsIGktPnJlZl9ucik7CiAJCQlpZiAocmV0KQogCQkJCWdvdG8gcm9sbGJhY2tfbWVzaDsKIAkJfQpAQCAtNTc4OSw3ICs1ODIyLDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZ1cHBlcl9kZXYtPmFsbF9hZGpfbGlzdC51cHBlciwgbGlzdCkgewogCQlwcl9kZWJ1ZygibGlua2luZyAlcydzIHVwcGVyIGRldmljZSAlcyB3aXRoICVzXG4iLAogCQkJIHVwcGVyX2Rldi0+bmFtZSwgaS0+ZGV2LT5uYW1lLCBkZXYtPm5hbWUpOwotCQlyZXQgPSBfX25ldGRldl9hZGphY2VudF9kZXZfbGluayhkZXYsIGktPmRldik7CisJCXJldCA9IF9fbmV0ZGV2X2FkamFjZW50X2Rldl9saW5rKGRldiwgaS0+ZGV2LCBpLT5yZWZfbnIpOwogCQlpZiAocmV0KQogCQkJZ290byByb2xsYmFja191cHBlcl9tZXNoOwogCX0KQEAgLTU3OTgsNyArNTgzMSw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmZGV2LT5hbGxfYWRqX2xpc3QubG93ZXIsIGxpc3QpIHsKIAkJcHJfZGVidWcoImxpbmtpbmcgJXMncyBsb3dlciBkZXZpY2UgJXMgd2l0aCAlc1xuIiwgZGV2LT5uYW1lLAogCQkJIGktPmRldi0+bmFtZSwgdXBwZXJfZGV2LT5uYW1lKTsKLQkJcmV0ID0gX19uZXRkZXZfYWRqYWNlbnRfZGV2X2xpbmsoaS0+ZGV2LCB1cHBlcl9kZXYpOworCQlyZXQgPSBfX25ldGRldl9hZGphY2VudF9kZXZfbGluayhpLT5kZXYsIHVwcGVyX2RldiwgaS0+cmVmX25yKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gcm9sbGJhY2tfbG93ZXJfbWVzaDsKIAl9CkBAIC01ODE2LDcgKzU4NDksNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJmRldi0+YWxsX2Fkal9saXN0Lmxvd2VyLCBsaXN0KSB7CiAJCWlmIChpID09IHRvX2kpCiAJCQlicmVhazsKLQkJX19uZXRkZXZfYWRqYWNlbnRfZGV2X3VubGluayhpLT5kZXYsIHVwcGVyX2Rldik7CisJCV9fbmV0ZGV2X2FkamFjZW50X2Rldl91bmxpbmsoaS0+ZGV2LCB1cHBlcl9kZXYsIGktPnJlZl9ucik7CiAJfQogCiAJaSA9IE5VTEw7CkBAIC01ODI2LDcgKzU4NTksNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJnVwcGVyX2Rldi0+YWxsX2Fkal9saXN0LnVwcGVyLCBsaXN0KSB7CiAJCWlmIChpID09IHRvX2kpCiAJCQlicmVhazsKLQkJX19uZXRkZXZfYWRqYWNlbnRfZGV2X3VubGluayhkZXYsIGktPmRldik7CisJCV9fbmV0ZGV2X2FkamFjZW50X2Rldl91bmxpbmsoZGV2LCBpLT5kZXYsIGktPnJlZl9ucik7CiAJfQogCiAJaSA9IGogPSBOVUxMOwpAQCAtNTgzOCw3ICs1ODcxLDcgQEAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShqLCAmdXBwZXJfZGV2LT5hbGxfYWRqX2xpc3QudXBwZXIsIGxpc3QpIHsKIAkJCWlmIChpID09IHRvX2kgJiYgaiA9PSB0b19qKQogCQkJCWJyZWFrOwotCQkJX19uZXRkZXZfYWRqYWNlbnRfZGV2X3VubGluayhpLT5kZXYsIGotPmRldik7CisJCQlfX25ldGRldl9hZGphY2VudF9kZXZfdW5saW5rKGktPmRldiwgai0+ZGV2LCBpLT5yZWZfbnIpOwogCQl9CiAJCWlmIChpID09IHRvX2kpCiAJCQlicmVhazsKQEAgLTU5MTgsMTYgKzU5NTEsMTYgQEAKIAkgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZkZXYtPmFsbF9hZGpfbGlzdC5sb3dlciwgbGlzdCkKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShqLCAmdXBwZXJfZGV2LT5hbGxfYWRqX2xpc3QudXBwZXIsIGxpc3QpCi0JCQlfX25ldGRldl9hZGphY2VudF9kZXZfdW5saW5rKGktPmRldiwgai0+ZGV2KTsKKwkJCV9fbmV0ZGV2X2FkamFjZW50X2Rldl91bmxpbmsoaS0+ZGV2LCBqLT5kZXYsIGktPnJlZl9ucik7CiAKIAkvKiByZW1vdmUgYWxzbyB0aGUgZGV2aWNlcyBpdHNlbGYgZnJvbSBsb3dlci91cHBlciBkZXZpY2UKIAkgKiBsaXN0CiAJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmZGV2LT5hbGxfYWRqX2xpc3QubG93ZXIsIGxpc3QpCi0JCV9fbmV0ZGV2X2FkamFjZW50X2Rldl91bmxpbmsoaS0+ZGV2LCB1cHBlcl9kZXYpOworCQlfX25ldGRldl9hZGphY2VudF9kZXZfdW5saW5rKGktPmRldiwgdXBwZXJfZGV2LCBpLT5yZWZfbnIpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmdXBwZXJfZGV2LT5hbGxfYWRqX2xpc3QudXBwZXIsIGxpc3QpCi0JCV9fbmV0ZGV2X2FkamFjZW50X2Rldl91bmxpbmsoZGV2LCBpLT5kZXYpOworCQlfX25ldGRldl9hZGphY2VudF9kZXZfdW5saW5rKGRldiwgaS0+ZGV2LCBpLT5yZWZfbnIpOwogCiAJY2FsbF9uZXRkZXZpY2Vfbm90aWZpZXJzX2luZm8oTkVUREVWX0NIQU5HRVVQUEVSLCBkZXYsCiAJCQkJICAgICAgJmNoYW5nZXVwcGVyX2luZm8uaW5mbyk7CkBAIC02MDQ1LDggKzYwNzgsNyBAQAogRVhQT1JUX1NZTUJPTChuZXRkZXZfbG93ZXJfZGV2X2dldF9wcml2YXRlKTsKIAogCi1pbnQgZGV2X2dldF9uZXN0X2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgICAgICBib29sICgqdHlwZV9jaGVjaykoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikpCitpbnQgZGV2X2dldF9uZXN0X2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmxvd2VyID0gTlVMTDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwpAQCAtNjA1NiwxNSArNjA4OCwxMiBAQAogCUFTU0VSVF9SVE5MKCk7CiAKIAluZXRkZXZfZm9yX2VhY2hfbG93ZXJfZGV2KGRldiwgbG93ZXIsIGl0ZXIpIHsKLQkJbmVzdCA9IGRldl9nZXRfbmVzdF9sZXZlbChsb3dlciwgdHlwZV9jaGVjayk7CisJCW5lc3QgPSBkZXZfZ2V0X25lc3RfbGV2ZWwobG93ZXIpOwogCQlpZiAobWF4X25lc3QgPCBuZXN0KQogCQkJbWF4X25lc3QgPSBuZXN0OwogCX0KIAotCWlmICh0eXBlX2NoZWNrKGRldikpCi0JCW1heF9uZXN0Kys7Ci0KLQlyZXR1cm4gbWF4X25lc3Q7CisJcmV0dXJuIG1heF9uZXN0ICsgMTsKIH0KIEVYUE9SVF9TWU1CT0woZGV2X2dldF9uZXN0X2xldmVsKTsKIApAQCAtNjcxMSw4ICs2NzQwLDggQEAKIAkJdW5saXN0X25ldGRldmljZShkZXYpOwogCiAJCWRldi0+cmVnX3N0YXRlID0gTkVUUkVHX1VOUkVHSVNURVJJTkc7Ci0JCW9uX2VhY2hfY3B1KGZsdXNoX2JhY2tsb2csIGRldiwgMSk7CiAJfQorCWZsdXNoX2FsbF9iYWNrbG9ncygpOwogCiAJc3luY2hyb25pemVfbmV0KCk7CiAKQEAgLTc2MjksNiArNzY1OCw5IEBACiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+YWxsX2Fkal9saXN0Lmxvd2VyKTsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5wdHlwZV9hbGwpOwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPnB0eXBlX3NwZWNpZmljKTsKKyNpZmRlZiBDT05GSUdfTkVUX1NDSEVECisJaGFzaF9pbml0KGRldi0+cWRpc2NfaGFzaCk7CisjZW5kaWYKIAlkZXYtPnByaXZfZmxhZ3MgPSBJRkZfWE1JVF9EU1RfUkVMRUFTRSB8IElGRl9YTUlUX0RTVF9SRUxFQVNFX1BFUk07CiAJc2V0dXAoZGV2KTsKIApAQCAtODI3NCw4ICs4MzA2LDExIEBACiAJICovCiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmZsdXNoID0gcGVyX2NwdV9wdHIoJmZsdXNoX3dvcmtzLCBpKTsKIAkJc3RydWN0IHNvZnRuZXRfZGF0YSAqc2QgPSAmcGVyX2NwdShzb2Z0bmV0X2RhdGEsIGkpOwogCisJCUlOSVRfV09SSyhmbHVzaCwgZmx1c2hfYmFja2xvZyk7CisKIAkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2QtPmlucHV0X3BrdF9xdWV1ZSk7CiAJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNkLT5wcm9jZXNzX3F1ZXVlKTsKIAkJSU5JVF9MSVNUX0hFQUQoJnNkLT5wb2xsX2xpc3QpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZHJvcF9tb25pdG9yLmMgYi9uZXQvY29yZS9kcm9wX21vbml0b3IuYwppbmRleCBkNmIzYjU3Li43MmNmYjBjIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kcm9wX21vbml0b3IuYworKysgYi9uZXQvY29yZS9kcm9wX21vbml0b3IuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJcmV0dXJuIHNrYjsKIH0KIAotc3RhdGljIHN0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCBkcm9wbW9uX21jZ3Jwc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCBkcm9wbW9uX21jZ3Jwc1tdID0gewogCXsgLm5hbWUgPSAiZXZlbnRzIiwgfSwKIH07CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2ZpbHRlci5jIGIvbmV0L2NvcmUvZmlsdGVyLmMKaW5kZXggNTcwODk5OS4uMDAzNTFjZCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZmlsdGVyLmMKKysrIGIvbmV0L2NvcmUvZmlsdGVyLmMKQEAgLTk0LDE0ICs5NCwxMyBAQAogfQogRVhQT1JUX1NZTUJPTChza19maWx0ZXJfdHJpbV9jYXApOwogCi1zdGF0aWMgdTY0IF9fc2tiX2dldF9wYXlfb2Zmc2V0KHU2NCBjdHgsIHU2NCBhLCB1NjQgeCwgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8xKF9fc2tiX2dldF9wYXlfb2Zmc2V0LCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IpCiB7Ci0JcmV0dXJuIHNrYl9nZXRfcG9mZigoc3RydWN0IHNrX2J1ZmYgKikodW5zaWduZWQgbG9uZykgY3R4KTsKKwlyZXR1cm4gc2tiX2dldF9wb2ZmKHNrYik7CiB9CiAKLXN0YXRpYyB1NjQgX19za2JfZ2V0X25sYXR0cih1NjQgY3R4LCB1NjQgYSwgdTY0IHgsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMyhfX3NrYl9nZXRfbmxhdHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsIHUzMiwgYSwgdTMyLCB4KQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikodW5zaWduZWQgbG9uZykgY3R4OwogCXN0cnVjdCBubGF0dHIgKm5sYTsKIAogCWlmIChza2JfaXNfbm9ubGluZWFyKHNrYikpCkBAIC0xMjAsOSArMTE5LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHU2NCBfX3NrYl9nZXRfbmxhdHRyX25lc3QodTY0IGN0eCwgdTY0IGEsIHU2NCB4LCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzMoX19za2JfZ2V0X25sYXR0cl9uZXN0LCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsIHUzMiwgYSwgdTMyLCB4KQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikodW5zaWduZWQgbG9uZykgY3R4OwogCXN0cnVjdCBubGF0dHIgKm5sYTsKIAogCWlmIChza2JfaXNfbm9ubGluZWFyKHNrYikpCkBAIC0xNDUsNyArMTQzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHU2NCBfX2dldF9yYXdfY3B1X2lkKHU2NCBjdHgsIHU2NCBhLCB1NjQgeCwgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8wKF9fZ2V0X3Jhd19jcHVfaWQpCiB7CiAJcmV0dXJuIHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiB9CkBAIC0yMzMsOSArMjMxLDggQEAKIAljYXNlIFNLRl9BRF9PRkYgKyBTS0ZfQURfSEFUWVBFOgogCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBuZXRfZGV2aWNlLCBpZmluZGV4KSAhPSA0KTsKIAkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmV0X2RldmljZSwgdHlwZSkgIT0gMik7Ci0JCUJVSUxEX0JVR19PTihieXRlc190b19icGZfc2l6ZShGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGRldikpIDwgMCk7CiAKLQkJKmluc24rKyA9IEJQRl9MRFhfTUVNKGJ5dGVzX3RvX2JwZl9zaXplKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgZGV2KSksCisJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCBkZXYpLAogCQkJCSAgICAgIEJQRl9SRUdfVE1QLCBCUEZfUkVHX0NUWCwKIAkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgZGV2KSk7CiAJCS8qIGlmICh0bXAgIT0gMCkgZ290byBwYyArIDEgKi8KQEAgLTEzNTAsNjEgKzEzNDcsNTggQEAKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBicGZfc2NyYXRjaHBhZCwgYnBmX3NwKTsKIAorc3RhdGljIGlubGluZSBpbnQgX19icGZfdHJ5X21ha2Vfd3JpdGFibGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICB1bnNpZ25lZCBpbnQgd3JpdGVfbGVuKQoreworCXJldHVybiBza2JfZW5zdXJlX3dyaXRhYmxlKHNrYiwgd3JpdGVfbGVuKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgYnBmX3RyeV9tYWtlX3dyaXRhYmxlKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCXVuc2lnbmVkIGludCB3cml0ZV9sZW4pCiB7Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gX19icGZfdHJ5X21ha2Vfd3JpdGFibGUoc2tiLCB3cml0ZV9sZW4pOwogCi0JaWYgKCFza2JfY2xvbmVkKHNrYikpCi0JCXJldHVybiAwOwotCWlmIChza2JfY2xvbmVfd3JpdGFibGUoc2tiLCB3cml0ZV9sZW4pKQotCQlyZXR1cm4gMDsKLQllcnIgPSBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFlcnIpCi0JCWJwZl9jb21wdXRlX2RhdGFfZW5kKHNrYik7CisJYnBmX2NvbXB1dGVfZGF0YV9lbmQoc2tiKTsKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdTY0IGJwZl9za2Jfc3RvcmVfYnl0ZXModTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgZmxhZ3MpCitzdGF0aWMgaW50IGJwZl90cnlfbWFrZV9oZWFkX3dyaXRhYmxlKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGJwZl9zY3JhdGNocGFkICpzcCA9IHRoaXNfY3B1X3B0cigmYnBmX3NwKTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIChsb25nKSByMTsKLQlpbnQgb2Zmc2V0ID0gKGludCkgcjI7Ci0Jdm9pZCAqZnJvbSA9ICh2b2lkICopIChsb25nKSByMzsKLQl1bnNpZ25lZCBpbnQgbGVuID0gKHVuc2lnbmVkIGludCkgcjQ7CisJcmV0dXJuIGJwZl90cnlfbWFrZV93cml0YWJsZShza2IsIHNrYl9oZWFkbGVuKHNrYikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnBmX3B1c2hfbWFjX3Jjc3VtKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKHNrYl9hdF90Y19pbmdyZXNzKHNrYikpCisJCXNrYl9wb3N0cHVzaF9yY3N1bShza2IsIHNrYl9tYWNfaGVhZGVyKHNrYiksIHNrYi0+bWFjX2xlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBicGZfcHVsbF9tYWNfcmNzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoc2tiX2F0X3RjX2luZ3Jlc3Moc2tiKSkKKwkJc2tiX3Bvc3RwdWxsX3Jjc3VtKHNrYiwgc2tiX21hY19oZWFkZXIoc2tiKSwgc2tiLT5tYWNfbGVuKTsKK30KKworQlBGX0NBTExfNShicGZfc2tiX3N0b3JlX2J5dGVzLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsIHUzMiwgb2Zmc2V0LAorCSAgIGNvbnN0IHZvaWQgKiwgZnJvbSwgdTMyLCBsZW4sIHU2NCwgZmxhZ3MpCit7CiAJdm9pZCAqcHRyOwogCiAJaWYgKHVubGlrZWx5KGZsYWdzICYgfihCUEZfRl9SRUNPTVBVVEVfQ1NVTSB8IEJQRl9GX0lOVkFMSURBVEVfSEFTSCkpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIGJwZiB2ZXJpZmllciBndWFyYW50ZWVzIHRoYXQ6Ci0JICogJ2Zyb20nIHBvaW50ZXIgcG9pbnRzIHRvIGJwZiBwcm9ncmFtIHN0YWNrCi0JICogJ2xlbicgYnl0ZXMgb2YgaXQgd2VyZSBpbml0aWFsaXplZAotCSAqICdsZW4nID4gMAotCSAqICdza2InIGlzIGEgdmFsaWQgcG9pbnRlciB0byAnc3RydWN0IHNrX2J1ZmYnCi0JICoKLQkgKiBzbyBjaGVjayBmb3IgaW52YWxpZCAnb2Zmc2V0JyBhbmQgdG9vIGxhcmdlICdsZW4nCi0JICovCi0JaWYgKHVubGlrZWx5KCh1MzIpIG9mZnNldCA+IDB4ZmZmZiB8fCBsZW4gPiBzaXplb2Yoc3AtPmJ1ZmYpKSkKKwlpZiAodW5saWtlbHkob2Zmc2V0ID4gMHhmZmZmKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJaWYgKHVubGlrZWx5KGJwZl90cnlfbWFrZV93cml0YWJsZShza2IsIG9mZnNldCArIGxlbikpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgbGVuLCBzcC0+YnVmZik7Ci0JaWYgKHVubGlrZWx5KCFwdHIpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQorCXB0ciA9IHNrYi0+ZGF0YSArIG9mZnNldDsKIAlpZiAoZmxhZ3MgJiBCUEZfRl9SRUNPTVBVVEVfQ1NVTSkKLQkJc2tiX3Bvc3RwdWxsX3Jjc3VtKHNrYiwgcHRyLCBsZW4pOworCQlfX3NrYl9wb3N0cHVsbF9yY3N1bShza2IsIHB0ciwgbGVuLCBvZmZzZXQpOwogCiAJbWVtY3B5KHB0ciwgZnJvbSwgbGVuKTsKIAotCWlmIChwdHIgPT0gc3AtPmJ1ZmYpCi0JCS8qIHNrYl9zdG9yZV9iaXRzIGNhbm5vdCByZXR1cm4gLUVGQVVMVCBoZXJlICovCi0JCXNrYl9zdG9yZV9iaXRzKHNrYiwgb2Zmc2V0LCBwdHIsIGxlbik7Ci0KIAlpZiAoZmxhZ3MgJiBCUEZfRl9SRUNPTVBVVEVfQ1NVTSkKLQkJc2tiX3Bvc3RwdXNoX3Jjc3VtKHNrYiwgcHRyLCBsZW4pOworCQlfX3NrYl9wb3N0cHVzaF9yY3N1bShza2IsIHB0ciwgbGVuLCBvZmZzZXQpOwogCWlmIChmbGFncyAmIEJQRl9GX0lOVkFMSURBVEVfSEFTSCkKIAkJc2tiX2NsZWFyX2hhc2goc2tiKTsKIApAQCAtMTQyMiwxNSArMTQxNiwxMiBAQAogCS5hcmc1X3R5cGUJPSBBUkdfQU5ZVEhJTkcsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9za2JfbG9hZF9ieXRlcyh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzQoYnBmX3NrYl9sb2FkX2J5dGVzLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsIHUzMiwgb2Zmc2V0LAorCSAgIHZvaWQgKiwgdG8sIHUzMiwgbGVuKQogewotCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IgPSAoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKikodW5zaWduZWQgbG9uZykgcjE7Ci0JaW50IG9mZnNldCA9IChpbnQpIHIyOwotCXZvaWQgKnRvID0gKHZvaWQgKikodW5zaWduZWQgbG9uZykgcjM7Ci0JdW5zaWduZWQgaW50IGxlbiA9ICh1bnNpZ25lZCBpbnQpIHI0OwogCXZvaWQgKnB0cjsKIAotCWlmICh1bmxpa2VseSgodTMyKSBvZmZzZXQgPiAweGZmZmYpKQorCWlmICh1bmxpa2VseShvZmZzZXQgPiAweGZmZmYpKQogCQlnb3RvIGVycl9jbGVhcjsKIAogCXB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgbGVuLCB0byk7CkBAIC0xNDU1LDIzICsxNDQ2LDQxIEBACiAJLmFyZzRfdHlwZQk9IEFSR19DT05TVF9TVEFDS19TSVpFLAogfTsKIAotc3RhdGljIHU2NCBicGZfbDNfY3N1bV9yZXBsYWNlKHU2NCByMSwgdTY0IHIyLCB1NjQgZnJvbSwgdTY0IHRvLCB1NjQgZmxhZ3MpCitCUEZfQ0FMTF8yKGJwZl9za2JfcHVsbF9kYXRhLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsIHUzMiwgbGVuKQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgKGxvbmcpIHIxOwotCWludCBvZmZzZXQgPSAoaW50KSByMjsKLQlfX3N1bTE2IHN1bSwgKnB0cjsKKwkvKiBJZGVhIGlzIHRoZSBmb2xsb3dpbmc6IHNob3VsZCB0aGUgbmVlZGVkIGRpcmVjdCByZWFkL3dyaXRlCisJICogdGVzdCBmYWlsIGR1cmluZyBydW50aW1lLCB3ZSBjYW4gcHVsbCBpbiBtb3JlIGRhdGEgYW5kIHJlZG8KKwkgKiBhZ2Fpbiwgc2luY2UgaW1wbGljaXRseSwgd2UgaW52YWxpZGF0ZSBwcmV2aW91cyBjaGVja3MgaGVyZS4KKwkgKgorCSAqIE9yLCBzaW5jZSB3ZSBrbm93IGhvdyBtdWNoIHdlIG5lZWQgdG8gbWFrZSByZWFkL3dyaXRlYWJsZSwKKwkgKiB0aGlzIGNhbiBiZSBkb25lIG9uY2UgYXQgdGhlIHByb2dyYW0gYmVnaW5uaW5nIGZvciBkaXJlY3QKKwkgKiBhY2Nlc3MgY2FzZS4gQnkgdGhpcyB3ZSBvdmVyY29tZSBsaW1pdGF0aW9ucyBvZiBvbmx5IGN1cnJlbnQKKwkgKiBoZWFkcm9vbSBiZWluZyBhY2Nlc3NpYmxlLgorCSAqLworCXJldHVybiBicGZfdHJ5X21ha2Vfd3JpdGFibGUoc2tiLCBsZW4gPyA6IHNrYl9oZWFkbGVuKHNrYikpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9za2JfcHVsbF9kYXRhX3Byb3RvID0geworCS5mdW5jCQk9IGJwZl9za2JfcHVsbF9kYXRhLAorCS5ncGxfb25seQk9IGZhbHNlLAorCS5yZXRfdHlwZQk9IFJFVF9JTlRFR0VSLAorCS5hcmcxX3R5cGUJPSBBUkdfUFRSX1RPX0NUWCwKKwkuYXJnMl90eXBlCT0gQVJHX0FOWVRISU5HLAorfTsKKworQlBGX0NBTExfNShicGZfbDNfY3N1bV9yZXBsYWNlLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsIHUzMiwgb2Zmc2V0LAorCSAgIHU2NCwgZnJvbSwgdTY0LCB0bywgdTY0LCBmbGFncykKK3sKKwlfX3N1bTE2ICpwdHI7CiAKIAlpZiAodW5saWtlbHkoZmxhZ3MgJiB+KEJQRl9GX0hEUl9GSUVMRF9NQVNLKSkpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICh1bmxpa2VseSgodTMyKSBvZmZzZXQgPiAweGZmZmYpKQorCWlmICh1bmxpa2VseShvZmZzZXQgPiAweGZmZmYgfHwgb2Zmc2V0ICYgMSkpCiAJCXJldHVybiAtRUZBVUxUOwotCWlmICh1bmxpa2VseShicGZfdHJ5X21ha2Vfd3JpdGFibGUoc2tiLCBvZmZzZXQgKyBzaXplb2Yoc3VtKSkpKQorCWlmICh1bmxpa2VseShicGZfdHJ5X21ha2Vfd3JpdGFibGUoc2tiLCBvZmZzZXQgKyBzaXplb2YoKnB0cikpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihzdW0pLCAmc3VtKTsKLQlpZiAodW5saWtlbHkoIXB0cikpCi0JCXJldHVybiAtRUZBVUxUOwotCisJcHRyID0gKF9fc3VtMTYgKikoc2tiLT5kYXRhICsgb2Zmc2V0KTsKIAlzd2l0Y2ggKGZsYWdzICYgQlBGX0ZfSERSX0ZJRUxEX01BU0spIHsKIAljYXNlIDA6CiAJCWlmICh1bmxpa2VseShmcm9tICE9IDApKQpAQCAtMTQ4OSwxMCArMTQ5OCw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChwdHIgPT0gJnN1bSkKLQkJLyogc2tiX3N0b3JlX2JpdHMgZ3VhcmFudGVlZCB0byBub3QgcmV0dXJuIC1FRkFVTFQgaGVyZSAqLwotCQlza2Jfc3RvcmVfYml0cyhza2IsIG9mZnNldCwgcHRyLCBzaXplb2Yoc3VtKSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTUwNywyNSArMTUxMiwyMiBAQAogCS5hcmc1X3R5cGUJPSBBUkdfQU5ZVEhJTkcsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9sNF9jc3VtX3JlcGxhY2UodTY0IHIxLCB1NjQgcjIsIHU2NCBmcm9tLCB1NjQgdG8sIHU2NCBmbGFncykKK0JQRl9DQUxMXzUoYnBmX2w0X2NzdW1fcmVwbGFjZSwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLCB1MzIsIG9mZnNldCwKKwkgICB1NjQsIGZyb20sIHU2NCwgdG8sIHU2NCwgZmxhZ3MpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAobG9uZykgcjE7CiAJYm9vbCBpc19wc2V1ZG8gPSBmbGFncyAmIEJQRl9GX1BTRVVET19IRFI7CiAJYm9vbCBpc19tbXplcm8gPSBmbGFncyAmIEJQRl9GX01BUktfTUFOR0xFRF8wOwotCWludCBvZmZzZXQgPSAoaW50KSByMjsKLQlfX3N1bTE2IHN1bSwgKnB0cjsKKwlfX3N1bTE2ICpwdHI7CiAKIAlpZiAodW5saWtlbHkoZmxhZ3MgJiB+KEJQRl9GX01BUktfTUFOR0xFRF8wIHwgQlBGX0ZfUFNFVURPX0hEUiB8CiAJCQkgICAgICAgQlBGX0ZfSERSX0ZJRUxEX01BU0spKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHVubGlrZWx5KCh1MzIpIG9mZnNldCA+IDB4ZmZmZikpCisJaWYgKHVubGlrZWx5KG9mZnNldCA+IDB4ZmZmZiB8fCBvZmZzZXQgJiAxKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKHVubGlrZWx5KGJwZl90cnlfbWFrZV93cml0YWJsZShza2IsIG9mZnNldCArIHNpemVvZihzdW0pKSkpCisJaWYgKHVubGlrZWx5KGJwZl90cnlfbWFrZV93cml0YWJsZShza2IsIG9mZnNldCArIHNpemVvZigqcHRyKSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKHN1bSksICZzdW0pOwotCWlmICh1bmxpa2VseSghcHRyKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJcHRyID0gKF9fc3VtMTYgKikoc2tiLT5kYXRhICsgb2Zmc2V0KTsKIAlpZiAoaXNfbW16ZXJvICYmICEqcHRyKQogCQlyZXR1cm4gMDsKIApAQCAtMTU0OCwxMCArMTU1MCw2IEBACiAKIAlpZiAoaXNfbW16ZXJvICYmICEqcHRyKQogCQkqcHRyID0gQ1NVTV9NQU5HTEVEXzA7Ci0JaWYgKHB0ciA9PSAmc3VtKQotCQkvKiBza2Jfc3RvcmVfYml0cyBndWFyYW50ZWVkIHRvIG5vdCByZXR1cm4gLUVGQVVMVCBoZXJlICovCi0JCXNrYl9zdG9yZV9iaXRzKHNrYiwgb2Zmc2V0LCBwdHIsIHNpemVvZihzdW0pKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xNTY2LDEyICsxNTY0LDExIEBACiAJLmFyZzVfdHlwZQk9IEFSR19BTllUSElORywKIH07CiAKLXN0YXRpYyB1NjQgYnBmX2NzdW1fZGlmZih1NjQgcjEsIHU2NCBmcm9tX3NpemUsIHU2NCByMywgdTY0IHRvX3NpemUsIHU2NCBzZWVkKQorQlBGX0NBTExfNShicGZfY3N1bV9kaWZmLCBfX2JlMzIgKiwgZnJvbSwgdTMyLCBmcm9tX3NpemUsCisJICAgX19iZTMyICosIHRvLCB1MzIsIHRvX3NpemUsIF9fd3N1bSwgc2VlZCkKIHsKIAlzdHJ1Y3QgYnBmX3NjcmF0Y2hwYWQgKnNwID0gdGhpc19jcHVfcHRyKCZicGZfc3ApOwotCXU2NCBkaWZmX3NpemUgPSBmcm9tX3NpemUgKyB0b19zaXplOwotCV9fYmUzMiAqZnJvbSA9IChfX2JlMzIgKikgKGxvbmcpIHIxOwotCV9fYmUzMiAqdG8gICA9IChfX2JlMzIgKikgKGxvbmcpIHIzOworCXUzMiBkaWZmX3NpemUgPSBmcm9tX3NpemUgKyB0b19zaXplOwogCWludCBpLCBqID0gMDsKIAogCS8qIFRoaXMgaXMgcXVpdGUgZmxleGlibGUsIHNvbWUgZXhhbXBsZXM6CkBAIC0xNTk3LDYgKzE1OTQsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfY3N1bV9kaWZmX3Byb3RvID0gewogCS5mdW5jCQk9IGJwZl9jc3VtX2RpZmYsCiAJLmdwbF9vbmx5CT0gZmFsc2UsCisJLnBrdF9hY2Nlc3MJPSB0cnVlLAogCS5yZXRfdHlwZQk9IFJFVF9JTlRFR0VSLAogCS5hcmcxX3R5cGUJPSBBUkdfUFRSX1RPX1NUQUNLLAogCS5hcmcyX3R5cGUJPSBBUkdfQ09OU1RfU1RBQ0tfU0laRV9PUl9aRVJPLApAQCAtMTYwNSwxMSArMTYwMywyOCBAQAogCS5hcmc1X3R5cGUJPSBBUkdfQU5ZVEhJTkcsCiB9OwogCitCUEZfQ0FMTF8yKGJwZl9jc3VtX3VwZGF0ZSwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLCBfX3dzdW0sIGNzdW0pCit7CisJLyogVGhlIGludGVyZmFjZSBpcyB0byBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggYnBmX2NzdW1fZGlmZigpCisJICogZm9yIGRpcmVjdCBwYWNrZXQgd3JpdGVzLiBjc3VtIHJvdGF0aW9uIGZvciBhbGlnbm1lbnQgYXMgd2VsbAorCSAqIGFzIGVtdWxhdGluZyBjc3VtX3N1YigpIGNhbiBiZSBkb25lIGZyb20gdGhlIGVCUEYgcHJvZ3JhbS4KKwkgKi8KKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpCisJCXJldHVybiAoc2tiLT5jc3VtID0gY3N1bV9hZGQoc2tiLT5jc3VtLCBjc3VtKSk7CisKKwlyZXR1cm4gLUVOT1RTVVBQOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9jc3VtX3VwZGF0ZV9wcm90byA9IHsKKwkuZnVuYwkJPSBicGZfY3N1bV91cGRhdGUsCisJLmdwbF9vbmx5CT0gZmFsc2UsCisJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCisJLmFyZzFfdHlwZQk9IEFSR19QVFJfVE9fQ1RYLAorCS5hcmcyX3R5cGUJPSBBUkdfQU5ZVEhJTkcsCit9OworCiBzdGF0aWMgaW5saW5lIGludCBfX2JwZl9yeF9za2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpZiAoc2tiX2F0X3RjX2luZ3Jlc3Moc2tiKSkKLQkJc2tiX3Bvc3RwdXNoX3Jjc3VtKHNrYiwgc2tiX21hY19oZWFkZXIoc2tiKSwgc2tiLT5tYWNfbGVuKTsKLQogCXJldHVybiBkZXZfZm9yd2FyZF9za2IoZGV2LCBza2IpOwogfQogCkBAIC0xNjMyLDEwICsxNjQ3LDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHU2NCBicGZfY2xvbmVfcmVkaXJlY3QodTY0IHIxLCB1NjQgaWZpbmRleCwgdTY0IGZsYWdzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzMoYnBmX2Nsb25lX3JlZGlyZWN0LCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsIHUzMiwgaWZpbmRleCwgdTY0LCBmbGFncykKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIChsb25nKSByMTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBza19idWZmICpjbG9uZTsKKwlpbnQgcmV0OwogCiAJaWYgKHVubGlrZWx5KGZsYWdzICYgfihCUEZfRl9JTkdSRVNTKSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTY0NCwxMiArMTY2MCwyNSBAQAogCWlmICh1bmxpa2VseSghZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlza2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKLQlpZiAodW5saWtlbHkoIXNrYikpCisJY2xvbmUgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAodW5saWtlbHkoIWNsb25lKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwkvKiBGb3IgZGlyZWN0IHdyaXRlLCB3ZSBuZWVkIHRvIGtlZXAgdGhlIGludmFyaWFudCB0aGF0IHRoZSBza2JzCisJICogd2UncmUgZGVhbGluZyB3aXRoIG5lZWQgdG8gYmUgdW5jbG9uZWQuIFNob3VsZCB1bmNsb25pbmcgZmFpbAorCSAqIGhlcmUsIHdlIG5lZWQgdG8gZnJlZSB0aGUganVzdCBnZW5lcmF0ZWQgY2xvbmUgdG8gdW5jbG9uZSBvbmNlCisJICogYWdhaW4uCisJICovCisJcmV0ID0gYnBmX3RyeV9tYWtlX2hlYWRfd3JpdGFibGUoc2tiKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlrZnJlZV9za2IoY2xvbmUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlicGZfcHVzaF9tYWNfcmNzdW0oY2xvbmUpOworCiAJcmV0dXJuIGZsYWdzICYgQlBGX0ZfSU5HUkVTUyA/Ci0JICAgICAgIF9fYnBmX3J4X3NrYihkZXYsIHNrYikgOiBfX2JwZl90eF9za2IoZGV2LCBza2IpOworCSAgICAgICBfX2JwZl9yeF9za2IoZGV2LCBjbG9uZSkgOiBfX2JwZl90eF9za2IoZGV2LCBjbG9uZSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX2Nsb25lX3JlZGlyZWN0X3Byb3RvID0gewpAQCAtMTY2OCw3ICsxNjk3LDcgQEAKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCByZWRpcmVjdF9pbmZvLCByZWRpcmVjdF9pbmZvKTsKIAotc3RhdGljIHU2NCBicGZfcmVkaXJlY3QodTY0IGlmaW5kZXgsIHU2NCBmbGFncywgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzIoYnBmX3JlZGlyZWN0LCB1MzIsIGlmaW5kZXgsIHU2NCwgZmxhZ3MpCiB7CiAJc3RydWN0IHJlZGlyZWN0X2luZm8gKnJpID0gdGhpc19jcHVfcHRyKCZyZWRpcmVjdF9pbmZvKTsKIApAQCAtMTY5Myw2ICsxNzIyLDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJYnBmX3B1c2hfbWFjX3Jjc3VtKHNrYik7CisKIAlyZXR1cm4gcmktPmZsYWdzICYgQlBGX0ZfSU5HUkVTUyA/CiAJICAgICAgIF9fYnBmX3J4X3NrYihkZXYsIHNrYikgOiBfX2JwZl90eF9za2IoZGV2LCBza2IpOwogfQpAQCAtMTcwNSw5ICsxNzM2LDkgQEAKIAkuYXJnMl90eXBlICAgICAgPSBBUkdfQU5ZVEhJTkcsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9nZXRfY2dyb3VwX2NsYXNzaWQodTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8xKGJwZl9nZXRfY2dyb3VwX2NsYXNzaWQsIGNvbnN0IHN0cnVjdCBza19idWZmICosIHNrYikKIHsKLQlyZXR1cm4gdGFza19nZXRfY2xhc3NpZCgoc3RydWN0IHNrX2J1ZmYgKikgKHVuc2lnbmVkIGxvbmcpIHIxKTsKKwlyZXR1cm4gdGFza19nZXRfY2xhc3NpZChza2IpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9nZXRfY2dyb3VwX2NsYXNzaWRfcHJvdG8gPSB7CkBAIC0xNzE3LDkgKzE3NDgsOSBAQAogCS5hcmcxX3R5cGUgICAgICA9IEFSR19QVFJfVE9fQ1RYLAogfTsKIAotc3RhdGljIHU2NCBicGZfZ2V0X3JvdXRlX3JlYWxtKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMShicGZfZ2V0X3JvdXRlX3JlYWxtLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IpCiB7Ci0JcmV0dXJuIGRzdF90Y2xhc3NpZCgoc3RydWN0IHNrX2J1ZmYgKikgKHVuc2lnbmVkIGxvbmcpIHIxKTsKKwlyZXR1cm4gZHN0X3RjbGFzc2lkKHNrYik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX2dldF9yb3V0ZV9yZWFsbV9wcm90byA9IHsKQEAgLTE3MjksMTQgKzE3NjAsMTQgQEAKIAkuYXJnMV90eXBlICAgICAgPSBBUkdfUFRSX1RPX0NUWCwKIH07CiAKLXN0YXRpYyB1NjQgYnBmX2dldF9oYXNoX3JlY2FsYyh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzEoYnBmX2dldF9oYXNoX3JlY2FsYywgc3RydWN0IHNrX2J1ZmYgKiwgc2tiKQogewogCS8qIElmIHNrYl9jbGVhcl9oYXNoKCkgd2FzIGNhbGxlZCBkdWUgdG8gbWFuZ2xpbmcsIHdlIGNhbgogCSAqIHRyaWdnZXIgU1cgcmVjYWxjdWxhdGlvbiBoZXJlLiBMYXRlciBhY2Nlc3MgdG8gaGFzaAogCSAqIGNhbiB0aGVuIHVzZSB0aGUgaW5saW5lIHNrYi0+aGFzaCB2aWEgY29udGV4dCBkaXJlY3RseQogCSAqIGluc3RlYWQgb2YgY2FsbGluZyB0aGlzIGhlbHBlciBhZ2Fpbi4KIAkgKi8KLQlyZXR1cm4gc2tiX2dldF9oYXNoKChzdHJ1Y3Qgc2tfYnVmZiAqKSAodW5zaWduZWQgbG9uZykgcjEpOworCXJldHVybiBza2JfZ2V0X2hhc2goc2tiKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfZ2V0X2hhc2hfcmVjYWxjX3Byb3RvID0gewpAQCAtMTc0NiwxNyArMTc3NywzNSBAQAogCS5hcmcxX3R5cGUJPSBBUkdfUFRSX1RPX0NUWCwKIH07CiAKLXN0YXRpYyB1NjQgYnBmX3NrYl92bGFuX3B1c2godTY0IHIxLCB1NjQgcjIsIHU2NCB2bGFuX3RjaSwgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8xKGJwZl9zZXRfaGFzaF9pbnZhbGlkLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAobG9uZykgcjE7Ci0JX19iZTE2IHZsYW5fcHJvdG8gPSAoX19mb3JjZSBfX2JlMTYpIHIyOworCS8qIEFmdGVyIGFsbCBkaXJlY3QgcGFja2V0IHdyaXRlLCB0aGlzIGNhbiBiZSB1c2VkIG9uY2UgZm9yCisJICogdHJpZ2dlcmluZyBhIGxhenkgcmVjYWxjIG9uIG5leHQgc2tiX2dldF9oYXNoKCkgaW52b2NhdGlvbi4KKwkgKi8KKwlza2JfY2xlYXJfaGFzaChza2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9zZXRfaGFzaF9pbnZhbGlkX3Byb3RvID0geworCS5mdW5jCQk9IGJwZl9zZXRfaGFzaF9pbnZhbGlkLAorCS5ncGxfb25seQk9IGZhbHNlLAorCS5yZXRfdHlwZQk9IFJFVF9JTlRFR0VSLAorCS5hcmcxX3R5cGUJPSBBUkdfUFRSX1RPX0NUWCwKK307CisKK0JQRl9DQUxMXzMoYnBmX3NrYl92bGFuX3B1c2gsIHN0cnVjdCBza19idWZmICosIHNrYiwgX19iZTE2LCB2bGFuX3Byb3RvLAorCSAgIHUxNiwgdmxhbl90Y2kpCit7CiAJaW50IHJldDsKIAogCWlmICh1bmxpa2VseSh2bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFRKSAmJgogCQkgICAgIHZsYW5fcHJvdG8gIT0gaHRvbnMoRVRIX1BfODAyMUFEKSkpCiAJCXZsYW5fcHJvdG8gPSBodG9ucyhFVEhfUF84MDIxUSk7CiAKKwlicGZfcHVzaF9tYWNfcmNzdW0oc2tiKTsKIAlyZXQgPSBza2Jfdmxhbl9wdXNoKHNrYiwgdmxhbl9wcm90bywgdmxhbl90Y2kpOworCWJwZl9wdWxsX21hY19yY3N1bShza2IpOworCiAJYnBmX2NvbXB1dGVfZGF0YV9lbmQoc2tiKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTc3MSwxMiArMTgyMCwxNCBAQAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGJwZl9za2Jfdmxhbl9wdXNoX3Byb3RvKTsKIAotc3RhdGljIHU2NCBicGZfc2tiX3ZsYW5fcG9wKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMShicGZfc2tiX3ZsYW5fcG9wLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAobG9uZykgcjE7CiAJaW50IHJldDsKIAorCWJwZl9wdXNoX21hY19yY3N1bShza2IpOwogCXJldCA9IHNrYl92bGFuX3BvcChza2IpOworCWJwZl9wdWxsX21hY19yY3N1bShza2IpOworCiAJYnBmX2NvbXB1dGVfZGF0YV9lbmQoc2tiKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTk0NSwxMCArMTk5Niw5IEBACiAJcmV0dXJuIC1FTk9UU1VQUDsKIH0KIAotc3RhdGljIHU2NCBicGZfc2tiX2NoYW5nZV9wcm90byh1NjQgcjEsIHU2NCByMiwgdTY0IGZsYWdzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzMoYnBmX3NrYl9jaGFuZ2VfcHJvdG8sIHN0cnVjdCBza19idWZmICosIHNrYiwgX19iZTE2LCBwcm90bywKKwkgICB1NjQsIGZsYWdzKQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgKGxvbmcpIHIxOwotCV9fYmUxNiBwcm90byA9IChfX2ZvcmNlIF9fYmUxNikgcjI7CiAJaW50IHJldDsKIAogCWlmICh1bmxpa2VseShmbGFncykpCkBAIC0xOTg1LDE0ICsyMDM1LDExIEBACiAJLmFyZzNfdHlwZQk9IEFSR19BTllUSElORywKIH07CiAKLXN0YXRpYyB1NjQgYnBmX3NrYl9jaGFuZ2VfdHlwZSh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzIoYnBmX3NrYl9jaGFuZ2VfdHlwZSwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLCB1MzIsIHBrdF90eXBlKQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgKGxvbmcpIHIxOwotCXUzMiBwa3RfdHlwZSA9IHIyOwotCiAJLyogV2Ugb25seSBhbGxvdyBhIHJlc3RyaWN0ZWQgc3Vic2V0IHRvIGJlIGNoYW5nZWQgZm9yIG5vdy4gKi8KLQlpZiAodW5saWtlbHkoc2tiLT5wa3RfdHlwZSA+IFBBQ0tFVF9PVEhFUkhPU1QgfHwKLQkJICAgICBwa3RfdHlwZSA+IFBBQ0tFVF9PVEhFUkhPU1QpKQorCWlmICh1bmxpa2VseSghc2tiX3BrdF90eXBlX29rKHNrYi0+cGt0X3R5cGUpIHx8CisJCSAgICAgIXNrYl9wa3RfdHlwZV9vayhwa3RfdHlwZSkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNrYi0+cGt0X3R5cGUgPSBwa3RfdHlwZTsKQEAgLTIwMDcsMTkgKzIwNTQsMTAwIEBACiAJLmFyZzJfdHlwZQk9IEFSR19BTllUSElORywKIH07CiAKK3N0YXRpYyB1MzIgX19icGZfc2tiX21pbl9sZW4oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MzIgbWluX2xlbiA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOworCisJaWYgKHNrYl90cmFuc3BvcnRfaGVhZGVyX3dhc19zZXQoc2tiKSkKKwkJbWluX2xlbiA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCisJCW1pbl9sZW4gPSBza2JfY2hlY2tzdW1fc3RhcnRfb2Zmc2V0KHNrYikgKworCQkJICBza2ItPmNzdW1fb2Zmc2V0ICsgc2l6ZW9mKF9fc3VtMTYpOworCXJldHVybiBtaW5fbGVuOworfQorCitzdGF0aWMgdTMyIF9fYnBmX3NrYl9tYXhfbGVuKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+ZGV2LT5tdHUgKyBza2ItPmRldi0+aGFyZF9oZWFkZXJfbGVuOworfQorCitzdGF0aWMgaW50IGJwZl9za2JfZ3Jvd19yY3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbmV3X2xlbikKK3sKKwl1bnNpZ25lZCBpbnQgb2xkX2xlbiA9IHNrYi0+bGVuOworCWludCByZXQ7CisKKwlyZXQgPSBfX3NrYl9ncm93X3Jjc3VtKHNrYiwgbmV3X2xlbik7CisJaWYgKCFyZXQpCisJCW1lbXNldChza2ItPmRhdGEgKyBvbGRfbGVuLCAwLCBuZXdfbGVuIC0gb2xkX2xlbik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBicGZfc2tiX3RyaW1fcmNzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IG5ld19sZW4pCit7CisJcmV0dXJuIF9fc2tiX3RyaW1fcmNzdW0oc2tiLCBuZXdfbGVuKTsKK30KKworQlBGX0NBTExfMyhicGZfc2tiX2NoYW5nZV90YWlsLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsIHUzMiwgbmV3X2xlbiwKKwkgICB1NjQsIGZsYWdzKQoreworCXUzMiBtYXhfbGVuID0gX19icGZfc2tiX21heF9sZW4oc2tiKTsKKwl1MzIgbWluX2xlbiA9IF9fYnBmX3NrYl9taW5fbGVuKHNrYik7CisJaW50IHJldDsKKworCWlmICh1bmxpa2VseShmbGFncyB8fCBuZXdfbGVuID4gbWF4X2xlbiB8fCBuZXdfbGVuIDwgbWluX2xlbikpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChza2ItPmVuY2Fwc3VsYXRpb24pCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwkvKiBUaGUgYmFzaWMgaWRlYSBvZiB0aGlzIGhlbHBlciBpcyB0aGF0IGl0J3MgcGVyZm9ybWluZyB0aGUKKwkgKiBuZWVkZWQgd29yayB0byBlaXRoZXIgZ3JvdyBvciB0cmltIGFuIHNrYiwgYW5kIGVCUEYgcHJvZ3JhbQorCSAqIHJld3JpdGVzIHRoZSByZXN0IHZpYSBoZWxwZXJzIGxpa2UgYnBmX3NrYl9zdG9yZV9ieXRlcygpLAorCSAqIGJwZl9sWF9jc3VtX3JlcGxhY2UoKSBhbmQgb3RoZXJzIHJhdGhlciB0aGFuIHBhc3NpbmcgYSByYXcKKwkgKiBidWZmZXIgaGVyZS4gVGhpcyBvbmUgaXMgYSBzbG93IHBhdGggaGVscGVyIGFuZCBpbnRlbmRlZAorCSAqIGZvciByZXBsaWVzIHdpdGggY29udHJvbCBtZXNzYWdlcy4KKwkgKgorCSAqIExpa2UgaW4gYnBmX3NrYl9jaGFuZ2VfcHJvdG8oKSwgd2Ugd2FudCB0byBrZWVwIHRoaXMgcmF0aGVyCisJICogbWluaW1hbCBhbmQgd2l0aG91dCBwcm90b2NvbCBzcGVjaWZpY3Mgc28gdGhhdCB3ZSBhcmUgYWJsZQorCSAqIHRvIHNlcGFyYXRlIGNvbmNlcm5zIGFzIGluIGJwZl9za2Jfc3RvcmVfYnl0ZXMoKSBzaG91bGQgb25seQorCSAqIGJlIHRoZSBvbmUgcmVzcG9uc2libGUgZm9yIHdyaXRpbmcgYnVmZmVycy4KKwkgKgorCSAqIEl0J3MgcmVhbGx5IGV4cGVjdGVkIHRvIGJlIGEgc2xvdyBwYXRoIG9wZXJhdGlvbiBoZXJlIGZvcgorCSAqIGNvbnRyb2wgbWVzc2FnZSByZXBsaWVzLCBzbyB3ZSdyZSBpbXBsaWNpdGx5IGxpbmVhcml6aW5nLAorCSAqIHVuY2xvbmluZyBhbmQgZHJvcCBvZmZsb2FkcyBmcm9tIHRoZSBza2IgYnkgdGhpcy4KKwkgKi8KKwlyZXQgPSBfX2JwZl90cnlfbWFrZV93cml0YWJsZShza2IsIHNrYi0+bGVuKTsKKwlpZiAoIXJldCkgeworCQlpZiAobmV3X2xlbiA+IHNrYi0+bGVuKQorCQkJcmV0ID0gYnBmX3NrYl9ncm93X3Jjc3VtKHNrYiwgbmV3X2xlbik7CisJCWVsc2UgaWYgKG5ld19sZW4gPCBza2ItPmxlbikKKwkJCXJldCA9IGJwZl9za2JfdHJpbV9yY3N1bShza2IsIG5ld19sZW4pOworCQlpZiAoIXJldCAmJiBza2JfaXNfZ3NvKHNrYikpCisJCQlza2JfZ3NvX3Jlc2V0KHNrYik7CisJfQorCisJYnBmX2NvbXB1dGVfZGF0YV9lbmQoc2tiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9za2JfY2hhbmdlX3RhaWxfcHJvdG8gPSB7CisJLmZ1bmMJCT0gYnBmX3NrYl9jaGFuZ2VfdGFpbCwKKwkuZ3BsX29ubHkJPSBmYWxzZSwKKwkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKKwkuYXJnMV90eXBlCT0gQVJHX1BUUl9UT19DVFgsCisJLmFyZzJfdHlwZQk9IEFSR19BTllUSElORywKKwkuYXJnM190eXBlCT0gQVJHX0FOWVRISU5HLAorfTsKKwogYm9vbCBicGZfaGVscGVyX2NoYW5nZXNfc2tiX2RhdGEodm9pZCAqZnVuYykKIHsKLQlpZiAoZnVuYyA9PSBicGZfc2tiX3ZsYW5fcHVzaCkKLQkJcmV0dXJuIHRydWU7Ci0JaWYgKGZ1bmMgPT0gYnBmX3NrYl92bGFuX3BvcCkKLQkJcmV0dXJuIHRydWU7Ci0JaWYgKGZ1bmMgPT0gYnBmX3NrYl9zdG9yZV9ieXRlcykKLQkJcmV0dXJuIHRydWU7Ci0JaWYgKGZ1bmMgPT0gYnBmX3NrYl9jaGFuZ2VfcHJvdG8pCi0JCXJldHVybiB0cnVlOwotCWlmIChmdW5jID09IGJwZl9sM19jc3VtX3JlcGxhY2UpCi0JCXJldHVybiB0cnVlOwotCWlmIChmdW5jID09IGJwZl9sNF9jc3VtX3JlcGxhY2UpCisJaWYgKGZ1bmMgPT0gYnBmX3NrYl92bGFuX3B1c2ggfHwKKwkgICAgZnVuYyA9PSBicGZfc2tiX3ZsYW5fcG9wIHx8CisJICAgIGZ1bmMgPT0gYnBmX3NrYl9zdG9yZV9ieXRlcyB8fAorCSAgICBmdW5jID09IGJwZl9za2JfY2hhbmdlX3Byb3RvIHx8CisJICAgIGZ1bmMgPT0gYnBmX3NrYl9jaGFuZ2VfdGFpbCB8fAorCSAgICBmdW5jID09IGJwZl9za2JfcHVsbF9kYXRhIHx8CisJICAgIGZ1bmMgPT0gYnBmX2wzX2NzdW1fcmVwbGFjZSB8fAorCSAgICBmdW5jID09IGJwZl9sNF9jc3VtX3JlcGxhY2UpCiAJCXJldHVybiB0cnVlOwogCiAJcmV0dXJuIGZhbHNlOwpAQCAtMjAzOCwxMyArMjE2NiwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdTY0IGJwZl9za2JfZXZlbnRfb3V0cHV0KHU2NCByMSwgdTY0IHIyLCB1NjQgZmxhZ3MsIHU2NCByNCwKLQkJCQl1NjQgbWV0YV9zaXplKQorQlBGX0NBTExfNShicGZfc2tiX2V2ZW50X291dHB1dCwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLCBzdHJ1Y3QgYnBmX21hcCAqLCBtYXAsCisJICAgdTY0LCBmbGFncywgdm9pZCAqLCBtZXRhLCB1NjQsIG1ldGFfc2l6ZSkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopKGxvbmcpIHIxOwotCXN0cnVjdCBicGZfbWFwICptYXAgPSAoc3RydWN0IGJwZl9tYXAgKikobG9uZykgcjI7CiAJdTY0IHNrYl9zaXplID0gKGZsYWdzICYgQlBGX0ZfQ1RYTEVOX01BU0spID4+IDMyOwotCXZvaWQgKm1ldGEgPSAodm9pZCAqKShsb25nKSByNDsKIAogCWlmICh1bmxpa2VseShmbGFncyAmIH4oQlBGX0ZfQ1RYTEVOX01BU0sgfCBCUEZfRl9JTkRFWF9NQVNLKSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjA3MSwxMCArMjE5Niw5IEBACiAJcmV0dXJuIGZsYWdzICYgQlBGX0ZfVFVOSU5GT19JUFY2ID8gQUZfSU5FVDYgOiBBRl9JTkVUOwogfQogCi1zdGF0aWMgdTY0IGJwZl9za2JfZ2V0X3R1bm5lbF9rZXkodTY0IHIxLCB1NjQgcjIsIHU2NCBzaXplLCB1NjQgZmxhZ3MsIHU2NCByNSkKK0JQRl9DQUxMXzQoYnBmX3NrYl9nZXRfdHVubmVsX2tleSwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLCBzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkgKiwgdG8sCisJICAgdTMyLCBzaXplLCB1NjQsIGZsYWdzKQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgKGxvbmcpIHIxOwotCXN0cnVjdCBicGZfdHVubmVsX2tleSAqdG8gPSAoc3RydWN0IGJwZl90dW5uZWxfa2V5ICopIChsb25nKSByMjsKIAljb25zdCBzdHJ1Y3QgaXBfdHVubmVsX2luZm8gKmluZm8gPSBza2JfdHVubmVsX2luZm8oc2tiKTsKIAl1OCBjb21wYXRbc2l6ZW9mKHN0cnVjdCBicGZfdHVubmVsX2tleSldOwogCXZvaWQgKnRvX29yaWcgPSB0bzsKQEAgLTIxMzksMTAgKzIyNjMsOCBAQAogCS5hcmc0X3R5cGUJPSBBUkdfQU5ZVEhJTkcsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9za2JfZ2V0X3R1bm5lbF9vcHQodTY0IHIxLCB1NjQgcjIsIHU2NCBzaXplLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzMoYnBmX3NrYl9nZXRfdHVubmVsX29wdCwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLCB1OCAqLCB0bywgdTMyLCBzaXplKQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgKGxvbmcpIHIxOwotCXU4ICp0byA9ICh1OCAqKSAobG9uZykgcjI7CiAJY29uc3Qgc3RydWN0IGlwX3R1bm5lbF9pbmZvICppbmZvID0gc2tiX3R1bm5lbF9pbmZvKHNrYik7CiAJaW50IGVycjsKIApAQCAtMjE3NywxMCArMjI5OSw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWV0YWRhdGFfZHN0IF9fcGVyY3B1ICptZF9kc3Q7CiAKLXN0YXRpYyB1NjQgYnBmX3NrYl9zZXRfdHVubmVsX2tleSh1NjQgcjEsIHU2NCByMiwgdTY0IHNpemUsIHU2NCBmbGFncywgdTY0IHI1KQorQlBGX0NBTExfNChicGZfc2tiX3NldF90dW5uZWxfa2V5LCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsCisJICAgY29uc3Qgc3RydWN0IGJwZl90dW5uZWxfa2V5ICosIGZyb20sIHUzMiwgc2l6ZSwgdTY0LCBmbGFncykKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIChsb25nKSByMTsKLQlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkgKmZyb20gPSAoc3RydWN0IGJwZl90dW5uZWxfa2V5ICopIChsb25nKSByMjsKIAlzdHJ1Y3QgbWV0YWRhdGFfZHN0ICptZCA9IHRoaXNfY3B1X3B0cihtZF9kc3QpOwogCXU4IGNvbXBhdFtzaXplb2Yoc3RydWN0IGJwZl90dW5uZWxfa2V5KV07CiAJc3RydWN0IGlwX3R1bm5lbF9pbmZvICppbmZvOwpAQCAtMjE5OCw3ICsyMzE5LDcgQEAKIAkJCSAqLwogCQkJbWVtY3B5KGNvbXBhdCwgZnJvbSwgc2l6ZSk7CiAJCQltZW1zZXQoY29tcGF0ICsgc2l6ZSwgMCwgc2l6ZW9mKGNvbXBhdCkgLSBzaXplKTsKLQkJCWZyb20gPSAoc3RydWN0IGJwZl90dW5uZWxfa2V5ICopY29tcGF0OworCQkJZnJvbSA9IChjb25zdCBzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkgKikgY29tcGF0OwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIyNDgsMTAgKzIzNjksOSBAQAogCS5hcmc0X3R5cGUJPSBBUkdfQU5ZVEhJTkcsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9za2Jfc2V0X3R1bm5lbF9vcHQodTY0IHIxLCB1NjQgcjIsIHU2NCBzaXplLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzMoYnBmX3NrYl9zZXRfdHVubmVsX29wdCwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLAorCSAgIGNvbnN0IHU4ICosIGZyb20sIHUzMiwgc2l6ZSkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIChsb25nKSByMTsKLQl1OCAqZnJvbSA9ICh1OCAqKSAobG9uZykgcjI7CiAJc3RydWN0IGlwX3R1bm5lbF9pbmZvICppbmZvID0gc2tiX3R1bm5lbF9pbmZvKHNrYik7CiAJY29uc3Qgc3RydWN0IG1ldGFkYXRhX2RzdCAqbWQgPSB0aGlzX2NwdV9wdHIobWRfZHN0KTsKIApAQCAtMjI5NywzOSArMjQxNyw2NiBAQAogCX0KIH0KIAotI2lmZGVmIENPTkZJR19TT0NLX0NHUk9VUF9EQVRBCi1zdGF0aWMgdTY0IGJwZl9za2JfaW5fY2dyb3VwKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMyhicGZfc2tiX3VuZGVyX2Nncm91cCwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLCBzdHJ1Y3QgYnBmX21hcCAqLCBtYXAsCisJICAgdTMyLCBpZHgpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKShsb25nKXIxOwotCXN0cnVjdCBicGZfbWFwICptYXAgPSAoc3RydWN0IGJwZl9tYXAgKikobG9uZylyMjsKIAlzdHJ1Y3QgYnBmX2FycmF5ICphcnJheSA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfYXJyYXksIG1hcCk7CiAJc3RydWN0IGNncm91cCAqY2dycDsKIAlzdHJ1Y3Qgc29jayAqc2s7Ci0JdTMyIGkgPSAodTMyKXIzOwogCi0Jc2sgPSBza2ItPnNrOworCXNrID0gc2tiX3RvX2Z1bGxfc2soc2tiKTsKIAlpZiAoIXNrIHx8ICFza19mdWxsc29jayhzaykpCiAJCXJldHVybiAtRU5PRU5UOwotCi0JaWYgKHVubGlrZWx5KGkgPj0gYXJyYXktPm1hcC5tYXhfZW50cmllcykpCisJaWYgKHVubGlrZWx5KGlkeCA+PSBhcnJheS0+bWFwLm1heF9lbnRyaWVzKSkKIAkJcmV0dXJuIC1FMkJJRzsKIAotCWNncnAgPSBSRUFEX09OQ0UoYXJyYXktPnB0cnNbaV0pOworCWNncnAgPSBSRUFEX09OQ0UoYXJyYXktPnB0cnNbaWR4XSk7CiAJaWYgKHVubGlrZWx5KCFjZ3JwKSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKLQlyZXR1cm4gY2dyb3VwX2lzX2Rlc2NlbmRhbnQoc29ja19jZ3JvdXBfcHRyKCZzay0+c2tfY2dycF9kYXRhKSwgY2dycCk7CisJcmV0dXJuIHNrX3VuZGVyX2Nncm91cF9oaWVyYXJjaHkoc2ssIGNncnApOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9za2JfaW5fY2dyb3VwX3Byb3RvID0gewotCS5mdW5jCQk9IGJwZl9za2JfaW5fY2dyb3VwLAorc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfc2tiX3VuZGVyX2Nncm91cF9wcm90byA9IHsKKwkuZnVuYwkJPSBicGZfc2tiX3VuZGVyX2Nncm91cCwKIAkuZ3BsX29ubHkJPSBmYWxzZSwKIAkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKIAkuYXJnMV90eXBlCT0gQVJHX1BUUl9UT19DVFgsCiAJLmFyZzJfdHlwZQk9IEFSR19DT05TVF9NQVBfUFRSLAogCS5hcmczX3R5cGUJPSBBUkdfQU5ZVEhJTkcsCiB9OwotI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJwZl94ZHBfY29weSh2b2lkICpkc3RfYnVmZiwgY29uc3Qgdm9pZCAqc3JjX2J1ZmYsCisJCQkJICB1bnNpZ25lZCBsb25nIG9mZiwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJbWVtY3B5KGRzdF9idWZmLCBzcmNfYnVmZiArIG9mZiwgbGVuKTsKKwlyZXR1cm4gMDsKK30KKworQlBGX0NBTExfNShicGZfeGRwX2V2ZW50X291dHB1dCwgc3RydWN0IHhkcF9idWZmICosIHhkcCwgc3RydWN0IGJwZl9tYXAgKiwgbWFwLAorCSAgIHU2NCwgZmxhZ3MsIHZvaWQgKiwgbWV0YSwgdTY0LCBtZXRhX3NpemUpCit7CisJdTY0IHhkcF9zaXplID0gKGZsYWdzICYgQlBGX0ZfQ1RYTEVOX01BU0spID4+IDMyOworCisJaWYgKHVubGlrZWx5KGZsYWdzICYgfihCUEZfRl9DVFhMRU5fTUFTSyB8IEJQRl9GX0lOREVYX01BU0spKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHVubGlrZWx5KHhkcF9zaXplID4gKHVuc2lnbmVkIGxvbmcpKHhkcC0+ZGF0YV9lbmQgLSB4ZHAtPmRhdGEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gYnBmX2V2ZW50X291dHB1dChtYXAsIGZsYWdzLCBtZXRhLCBtZXRhX3NpemUsIHhkcCwgeGRwX3NpemUsCisJCQkJYnBmX3hkcF9jb3B5KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfeGRwX2V2ZW50X291dHB1dF9wcm90byA9IHsKKwkuZnVuYwkJPSBicGZfeGRwX2V2ZW50X291dHB1dCwKKwkuZ3BsX29ubHkJPSB0cnVlLAorCS5yZXRfdHlwZQk9IFJFVF9JTlRFR0VSLAorCS5hcmcxX3R5cGUJPSBBUkdfUFRSX1RPX0NUWCwKKwkuYXJnMl90eXBlCT0gQVJHX0NPTlNUX01BUF9QVFIsCisJLmFyZzNfdHlwZQk9IEFSR19BTllUSElORywKKwkuYXJnNF90eXBlCT0gQVJHX1BUUl9UT19TVEFDSywKKwkuYXJnNV90eXBlCT0gQVJHX0NPTlNUX1NUQUNLX1NJWkUsCit9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvICoKIHNrX2ZpbHRlcl9mdW5jX3Byb3RvKGVudW0gYnBmX2Z1bmNfaWQgZnVuY19pZCkKQEAgLTIzNjUsOCArMjUxMiwxMiBAQAogCQlyZXR1cm4gJmJwZl9za2Jfc3RvcmVfYnl0ZXNfcHJvdG87CiAJY2FzZSBCUEZfRlVOQ19za2JfbG9hZF9ieXRlczoKIAkJcmV0dXJuICZicGZfc2tiX2xvYWRfYnl0ZXNfcHJvdG87CisJY2FzZSBCUEZfRlVOQ19za2JfcHVsbF9kYXRhOgorCQlyZXR1cm4gJmJwZl9za2JfcHVsbF9kYXRhX3Byb3RvOwogCWNhc2UgQlBGX0ZVTkNfY3N1bV9kaWZmOgogCQlyZXR1cm4gJmJwZl9jc3VtX2RpZmZfcHJvdG87CisJY2FzZSBCUEZfRlVOQ19jc3VtX3VwZGF0ZToKKwkJcmV0dXJuICZicGZfY3N1bV91cGRhdGVfcHJvdG87CiAJY2FzZSBCUEZfRlVOQ19sM19jc3VtX3JlcGxhY2U6CiAJCXJldHVybiAmYnBmX2wzX2NzdW1fcmVwbGFjZV9wcm90bzsKIAljYXNlIEJQRl9GVU5DX2w0X2NzdW1fcmVwbGFjZToKQEAgLTIzODMsNiArMjUzNCw4IEBACiAJCXJldHVybiAmYnBmX3NrYl9jaGFuZ2VfcHJvdG9fcHJvdG87CiAJY2FzZSBCUEZfRlVOQ19za2JfY2hhbmdlX3R5cGU6CiAJCXJldHVybiAmYnBmX3NrYl9jaGFuZ2VfdHlwZV9wcm90bzsKKwljYXNlIEJQRl9GVU5DX3NrYl9jaGFuZ2VfdGFpbDoKKwkJcmV0dXJuICZicGZfc2tiX2NoYW5nZV90YWlsX3Byb3RvOwogCWNhc2UgQlBGX0ZVTkNfc2tiX2dldF90dW5uZWxfa2V5OgogCQlyZXR1cm4gJmJwZl9za2JfZ2V0X3R1bm5lbF9rZXlfcHJvdG87CiAJY2FzZSBCUEZfRlVOQ19za2Jfc2V0X3R1bm5lbF9rZXk6CkBAIC0yMzk3LDE0ICsyNTUwLDE0IEBACiAJCXJldHVybiAmYnBmX2dldF9yb3V0ZV9yZWFsbV9wcm90bzsKIAljYXNlIEJQRl9GVU5DX2dldF9oYXNoX3JlY2FsYzoKIAkJcmV0dXJuICZicGZfZ2V0X2hhc2hfcmVjYWxjX3Byb3RvOworCWNhc2UgQlBGX0ZVTkNfc2V0X2hhc2hfaW52YWxpZDoKKwkJcmV0dXJuICZicGZfc2V0X2hhc2hfaW52YWxpZF9wcm90bzsKIAljYXNlIEJQRl9GVU5DX3BlcmZfZXZlbnRfb3V0cHV0OgogCQlyZXR1cm4gJmJwZl9za2JfZXZlbnRfb3V0cHV0X3Byb3RvOwogCWNhc2UgQlBGX0ZVTkNfZ2V0X3NtcF9wcm9jZXNzb3JfaWQ6CiAJCXJldHVybiAmYnBmX2dldF9zbXBfcHJvY2Vzc29yX2lkX3Byb3RvOwotI2lmZGVmIENPTkZJR19TT0NLX0NHUk9VUF9EQVRBCi0JY2FzZSBCUEZfRlVOQ19za2JfaW5fY2dyb3VwOgotCQlyZXR1cm4gJmJwZl9za2JfaW5fY2dyb3VwX3Byb3RvOwotI2VuZGlmCisJY2FzZSBCUEZfRlVOQ19za2JfdW5kZXJfY2dyb3VwOgorCQlyZXR1cm4gJmJwZl9za2JfdW5kZXJfY2dyb3VwX3Byb3RvOwogCWRlZmF1bHQ6CiAJCXJldHVybiBza19maWx0ZXJfZnVuY19wcm90byhmdW5jX2lkKTsKIAl9CkBAIC0yNDEzLDcgKzI1NjYsMTQgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gKgogeGRwX2Z1bmNfcHJvdG8oZW51bSBicGZfZnVuY19pZCBmdW5jX2lkKQogewotCXJldHVybiBza19maWx0ZXJfZnVuY19wcm90byhmdW5jX2lkKTsKKwlzd2l0Y2ggKGZ1bmNfaWQpIHsKKwljYXNlIEJQRl9GVU5DX3BlcmZfZXZlbnRfb3V0cHV0OgorCQlyZXR1cm4gJmJwZl94ZHBfZXZlbnRfb3V0cHV0X3Byb3RvOworCWNhc2UgQlBGX0ZVTkNfZ2V0X3NtcF9wcm9jZXNzb3JfaWQ6CisJCXJldHVybiAmYnBmX2dldF9zbXBfcHJvY2Vzc29yX2lkX3Byb3RvOworCWRlZmF1bHQ6CisJCXJldHVybiBza19maWx0ZXJfZnVuY19wcm90byhmdW5jX2lkKTsKKwl9CiB9CiAKIHN0YXRpYyBib29sIF9faXNfdmFsaWRfYWNjZXNzKGludCBvZmYsIGludCBzaXplLCBlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlKQpAQCAtMjQ1Myw2ICsyNjEzLDQ1IEBACiAJcmV0dXJuIF9faXNfdmFsaWRfYWNjZXNzKG9mZiwgc2l6ZSwgdHlwZSk7CiB9CiAKK3N0YXRpYyBpbnQgdGNfY2xzX2FjdF9wcm9sb2d1ZShzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmLCBib29sIGRpcmVjdF93cml0ZSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCit7CisJc3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7CisKKwlpZiAoIWRpcmVjdF93cml0ZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBpZiAoIXNrYi0+Y2xvbmVkKQorCSAqICAgICAgIGdvdG8gc3RhcnQ7CisJICoKKwkgKiAoRmFzdC1wYXRoLCBvdGhlcndpc2UgYXBwcm94aW1hdGlvbiB0aGF0IHdlIG1pZ2h0IGJlCisJICogIGEgY2xvbmUsIGRvIHRoZSByZXN0IGluIGhlbHBlci4pCisJICovCisJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9CLCBCUEZfUkVHXzYsIEJQRl9SRUdfMSwgQ0xPTkVEX09GRlNFVCgpKTsKKwkqaW5zbisrID0gQlBGX0FMVTMyX0lNTShCUEZfQU5ELCBCUEZfUkVHXzYsIENMT05FRF9NQVNLKTsKKwkqaW5zbisrID0gQlBGX0pNUF9JTU0oQlBGX0pFUSwgQlBGX1JFR182LCAwLCA3KTsKKworCS8qIHJldCA9IGJwZl9za2JfcHVsbF9kYXRhKHNrYiwgMCk7ICovCisJKmluc24rKyA9IEJQRl9NT1Y2NF9SRUcoQlBGX1JFR182LCBCUEZfUkVHXzEpOworCSppbnNuKysgPSBCUEZfQUxVNjRfUkVHKEJQRl9YT1IsIEJQRl9SRUdfMiwgQlBGX1JFR18yKTsKKwkqaW5zbisrID0gQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwKKwkJCSAgICAgICBCUEZfRlVOQ19za2JfcHVsbF9kYXRhKTsKKwkvKiBpZiAoIXJldCkKKwkgKiAgICAgIGdvdG8gcmVzdG9yZTsKKwkgKiByZXR1cm4gVENfQUNUX1NIT1Q7CisJICovCisJKmluc24rKyA9IEJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgMik7CisJKmluc24rKyA9IEJQRl9BTFUzMl9JTU0oQlBGX01PViwgQlBGX1JFR18wLCBUQ19BQ1RfU0hPVCk7CisJKmluc24rKyA9IEJQRl9FWElUX0lOU04oKTsKKworCS8qIHJlc3RvcmU6ICovCisJKmluc24rKyA9IEJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzYpOworCS8qIHN0YXJ0OiAqLworCSppbnNuKysgPSBwcm9nLT5pbnNuc2lbMF07CisKKwlyZXR1cm4gaW5zbiAtIGluc25fYnVmOworfQorCiBzdGF0aWMgYm9vbCB0Y19jbHNfYWN0X2lzX3ZhbGlkX2FjY2VzcyhpbnQgb2ZmLCBpbnQgc2l6ZSwKIAkJCQkgICAgICAgZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSwKIAkJCQkgICAgICAgZW51bSBicGZfcmVnX3R5cGUgKnJlZ190eXBlKQpAQCAtMjQ5MCw3ICsyNjg5LDcgQEAKIAkJcmV0dXJuIGZhbHNlOwogCWlmIChvZmYgJSBzaXplICE9IDApCiAJCXJldHVybiBmYWxzZTsKLQlpZiAoc2l6ZSAhPSA0KQorCWlmIChzaXplICE9IHNpemVvZihfX3UzMikpCiAJCXJldHVybiBmYWxzZTsKIAogCXJldHVybiB0cnVlOwpAQCAtMjUyMSwxMCArMjcyMCwxMCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYnBmX3dhcm5faW52YWxpZF94ZHBfYWN0aW9uKTsKIAotc3RhdGljIHUzMiBicGZfbmV0X2NvbnZlcnRfY3R4X2FjY2VzcyhlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlLCBpbnQgZHN0X3JlZywKLQkJCQkgICAgICBpbnQgc3JjX3JlZywgaW50IGN0eF9vZmYsCi0JCQkJICAgICAgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZiwKLQkJCQkgICAgICBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCitzdGF0aWMgdTMyIHNrX2ZpbHRlcl9jb252ZXJ0X2N0eF9hY2Nlc3MoZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSwgaW50IGRzdF9yZWcsCisJCQkJCWludCBzcmNfcmVnLCBpbnQgY3R4X29mZiwKKwkJCQkJc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZiwKKwkJCQkJc3RydWN0IGJwZl9wcm9nICpwcm9nKQogewogCXN0cnVjdCBicGZfaW5zbiAqaW5zbiA9IGluc25fYnVmOwogCkBAIC0yNTcxLDcgKzI3NzAsNyBAQAogCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgaWZpbmRleCk6CiAJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IG5ldF9kZXZpY2UsIGlmaW5kZXgpICE9IDQpOwogCi0JCSppbnNuKysgPSBCUEZfTERYX01FTShieXRlc190b19icGZfc2l6ZShGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGRldikpLAorCQkqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0ZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgZGV2KSwKIAkJCQkgICAgICBkc3RfcmVnLCBzcmNfcmVnLAogCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBkZXYpKTsKIAkJKmluc24rKyA9IEJQRl9KTVBfSU1NKEJQRl9KRVEsIGRzdF9yZWcsIDAsIDEpOwpAQCAtMjYxMiw3ICsyODExLDcgQEAKIAkJCQkJICBkc3RfcmVnLCBzcmNfcmVnLCBpbnNuKTsKIAogCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgY2JbMF0pIC4uLgotCQlvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBjYls0XSk6CisJICAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBjYls0XSk6CiAJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHFkaXNjX3NrYl9jYiwgZGF0YSkgPCAyMCk7CiAKIAkJcHJvZy0+Y2JfYWNjZXNzID0gMTsKQEAgLTI2MzYsNyArMjgzNSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKToKLQkJKmluc24rKyA9IEJQRl9MRFhfTUVNKGJ5dGVzX3RvX2JwZl9zaXplKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgZGF0YSkpLAorCQkqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0ZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgZGF0YSksCiAJCQkJICAgICAgZHN0X3JlZywgc3JjX3JlZywKIAkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgZGF0YSkpOwogCQlicmVhazsKQEAgLTI2NDUsOCArMjg0NCw4IEBACiAJCWN0eF9vZmYgLT0gb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpOwogCQljdHhfb2ZmICs9IG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBjYik7CiAJCWN0eF9vZmYgKz0gb2Zmc2V0b2Yoc3RydWN0IGJwZl9za2JfZGF0YV9lbmQsIGRhdGFfZW5kKTsKLQkJKmluc24rKyA9IEJQRl9MRFhfTUVNKGJ5dGVzX3RvX2JwZl9zaXplKHNpemVvZih2b2lkICopKSwKLQkJCQkgICAgICBkc3RfcmVnLCBzcmNfcmVnLCBjdHhfb2ZmKTsKKwkJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9TSVpFT0Yodm9pZCAqKSwgZHN0X3JlZywgc3JjX3JlZywKKwkJCQkgICAgICBjdHhfb2ZmKTsKIAkJYnJlYWs7CiAKIAljYXNlIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIHRjX2luZGV4KToKQEAgLTI2NzIsNiArMjg3MSwzMSBAQAogCXJldHVybiBpbnNuIC0gaW5zbl9idWY7CiB9CiAKK3N0YXRpYyB1MzIgdGNfY2xzX2FjdF9jb252ZXJ0X2N0eF9hY2Nlc3MoZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSwgaW50IGRzdF9yZWcsCisJCQkJCSBpbnQgc3JjX3JlZywgaW50IGN0eF9vZmYsCisJCQkJCSBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmLAorCQkJCQkgc3RydWN0IGJwZl9wcm9nICpwcm9nKQoreworCXN0cnVjdCBicGZfaW5zbiAqaW5zbiA9IGluc25fYnVmOworCisJc3dpdGNoIChjdHhfb2ZmKSB7CisJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBpZmluZGV4KToKKwkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmV0X2RldmljZSwgaWZpbmRleCkgIT0gNCk7CisKKwkJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9GSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGRldiksCisJCQkJICAgICAgZHN0X3JlZywgc3JjX3JlZywKKwkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgZGV2KSk7CisJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfVywgZHN0X3JlZywgZHN0X3JlZywKKwkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgbmV0X2RldmljZSwgaWZpbmRleCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gc2tfZmlsdGVyX2NvbnZlcnRfY3R4X2FjY2Vzcyh0eXBlLCBkc3RfcmVnLCBzcmNfcmVnLAorCQkJCQkJICAgIGN0eF9vZmYsIGluc25fYnVmLCBwcm9nKTsKKwl9CisKKwlyZXR1cm4gaW5zbiAtIGluc25fYnVmOworfQorCiBzdGF0aWMgdTMyIHhkcF9jb252ZXJ0X2N0eF9hY2Nlc3MoZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSwgaW50IGRzdF9yZWcsCiAJCQkJICBpbnQgc3JjX3JlZywgaW50IGN0eF9vZmYsCiAJCQkJICBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmLApAQCAtMjY4MSwxMiArMjkwNSwxMiBAQAogCiAJc3dpdGNoIChjdHhfb2ZmKSB7CiAJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgeGRwX21kLCBkYXRhKToKLQkJKmluc24rKyA9IEJQRl9MRFhfTUVNKGJ5dGVzX3RvX2JwZl9zaXplKEZJRUxEX1NJWkVPRihzdHJ1Y3QgeGRwX2J1ZmYsIGRhdGEpKSwKKwkJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9GSUVMRF9TSVpFT0Yoc3RydWN0IHhkcF9idWZmLCBkYXRhKSwKIAkJCQkgICAgICBkc3RfcmVnLCBzcmNfcmVnLAogCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCB4ZHBfYnVmZiwgZGF0YSkpOwogCQlicmVhazsKIAljYXNlIG9mZnNldG9mKHN0cnVjdCB4ZHBfbWQsIGRhdGFfZW5kKToKLQkJKmluc24rKyA9IEJQRl9MRFhfTUVNKGJ5dGVzX3RvX2JwZl9zaXplKEZJRUxEX1NJWkVPRihzdHJ1Y3QgeGRwX2J1ZmYsIGRhdGFfZW5kKSksCisJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfRklFTERfU0laRU9GKHN0cnVjdCB4ZHBfYnVmZiwgZGF0YV9lbmQpLAogCQkJCSAgICAgIGRzdF9yZWcsIHNyY19yZWcsCiAJCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHhkcF9idWZmLCBkYXRhX2VuZCkpOwogCQlicmVhazsKQEAgLTI2OTgsMTMgKzI5MjIsMTQgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX29wcyBza19maWx0ZXJfb3BzID0gewogCS5nZXRfZnVuY19wcm90bwkJPSBza19maWx0ZXJfZnVuY19wcm90bywKIAkuaXNfdmFsaWRfYWNjZXNzCT0gc2tfZmlsdGVyX2lzX3ZhbGlkX2FjY2VzcywKLQkuY29udmVydF9jdHhfYWNjZXNzCT0gYnBmX25ldF9jb252ZXJ0X2N0eF9hY2Nlc3MsCisJLmNvbnZlcnRfY3R4X2FjY2Vzcwk9IHNrX2ZpbHRlcl9jb252ZXJ0X2N0eF9hY2Nlc3MsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl92ZXJpZmllcl9vcHMgdGNfY2xzX2FjdF9vcHMgPSB7CiAJLmdldF9mdW5jX3Byb3RvCQk9IHRjX2Nsc19hY3RfZnVuY19wcm90bywKIAkuaXNfdmFsaWRfYWNjZXNzCT0gdGNfY2xzX2FjdF9pc192YWxpZF9hY2Nlc3MsCi0JLmNvbnZlcnRfY3R4X2FjY2Vzcwk9IGJwZl9uZXRfY29udmVydF9jdHhfYWNjZXNzLAorCS5jb252ZXJ0X2N0eF9hY2Nlc3MJPSB0Y19jbHNfYWN0X2NvbnZlcnRfY3R4X2FjY2VzcywKKwkuZ2VuX3Byb2xvZ3VlCQk9IHRjX2Nsc19hY3RfcHJvbG9ndWUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl92ZXJpZmllcl9vcHMgeGRwX29wcyA9IHsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Zsb3dfZGlzc2VjdG9yLmMgYi9uZXQvY29yZS9mbG93X2Rpc3NlY3Rvci5jCmluZGV4IDYxYWQ0M2YuLjFhN2I4MGYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Zsb3dfZGlzc2VjdG9yLmMKKysrIGIvbmV0L2NvcmUvZmxvd19kaXNzZWN0b3IuYwpAQCAtNiw2ICs2LDggQEAKICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvZ3JlLmg+CisjaW5jbHVkZSA8bmV0L3BwdHAuaD4KICNpbmNsdWRlIDxsaW51eC9pZ21wLmg+CiAjaW5jbHVkZSA8bGludXgvaWNtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjdHAuaD4KQEAgLTExNiwxMyArMTE4LDE2IEBACiAJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9hZGRycyAqa2V5X2FkZHJzOwogCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfcG9ydHMgKmtleV9wb3J0czsKIAlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3RhZ3MgKmtleV90YWdzOworCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfdmxhbiAqa2V5X3ZsYW47CiAJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9rZXlpZCAqa2V5X2tleWlkOworCWJvb2wgc2tpcF92bGFuID0gZmFsc2U7CiAJdTggaXBfcHJvdG8gPSAwOwogCWJvb2wgcmV0ID0gZmFsc2U7CiAKIAlpZiAoIWRhdGEpIHsKIAkJZGF0YSA9IHNrYi0+ZGF0YTsKLQkJcHJvdG8gPSBza2ItPnByb3RvY29sOworCQlwcm90byA9IHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikgPworCQkJIHNrYi0+dmxhbl9wcm90byA6IHNrYi0+cHJvdG9jb2w7CiAJCW5ob2ZmID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CiAJCWhsZW4gPSBza2JfaGVhZGxlbihza2IpOwogCX0KQEAgLTI0MSwyMyArMjQ2LDQ1IEBACiAJY2FzZSBodG9ucyhFVEhfUF84MDIxQUQpOgogCWNhc2UgaHRvbnMoRVRIX1BfODAyMVEpOiB7CiAJCWNvbnN0IHN0cnVjdCB2bGFuX2hkciAqdmxhbjsKLQkJc3RydWN0IHZsYW5faGRyIF92bGFuOwogCi0JCXZsYW4gPSBfX3NrYl9oZWFkZXJfcG9pbnRlcihza2IsIG5ob2ZmLCBzaXplb2YoX3ZsYW4pLCBkYXRhLCBobGVuLCAmX3ZsYW4pOwotCQlpZiAoIXZsYW4pCi0JCQlnb3RvIG91dF9iYWQ7CisJCWlmIChza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKQorCQkJcHJvdG8gPSBza2ItPnByb3RvY29sOwogCi0JCWlmIChkaXNzZWN0b3JfdXNlc19rZXkoZmxvd19kaXNzZWN0b3IsCi0JCQkJICAgICAgIEZMT1dfRElTU0VDVE9SX0tFWV9WTEFOSUQpKSB7Ci0JCQlrZXlfdGFncyA9IHNrYl9mbG93X2Rpc3NlY3Rvcl90YXJnZXQoZmxvd19kaXNzZWN0b3IsCi0JCQkJCQkJICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfVkxBTklELAotCQkJCQkJCSAgICAgdGFyZ2V0X2NvbnRhaW5lcik7CisJCWlmICghc2tiX3ZsYW5fdGFnX3ByZXNlbnQoc2tiKSB8fAorCQkgICAgcHJvdG8gPT0gY3B1X3RvX2JlMTYoRVRIX1BfODAyMVEpIHx8CisJCSAgICBwcm90byA9PSBjcHVfdG9fYmUxNihFVEhfUF84MDIxQUQpKSB7CisJCQlzdHJ1Y3Qgdmxhbl9oZHIgX3ZsYW47CiAKLQkJCWtleV90YWdzLT52bGFuX2lkID0gc2tiX3ZsYW5fdGFnX2dldF9pZChza2IpOworCQkJdmxhbiA9IF9fc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgbmhvZmYsIHNpemVvZihfdmxhbiksCisJCQkJCQkgICAgZGF0YSwgaGxlbiwgJl92bGFuKTsKKwkJCWlmICghdmxhbikKKwkJCQlnb3RvIG91dF9iYWQ7CisJCQlwcm90byA9IHZsYW4tPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG87CisJCQluaG9mZiArPSBzaXplb2YoKnZsYW4pOworCQkJaWYgKHNraXBfdmxhbikKKwkJCQlnb3RvIGFnYWluOwogCQl9CiAKLQkJcHJvdG8gPSB2bGFuLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvOwotCQluaG9mZiArPSBzaXplb2YoKnZsYW4pOworCQlza2lwX3ZsYW4gPSB0cnVlOworCQlpZiAoZGlzc2VjdG9yX3VzZXNfa2V5KGZsb3dfZGlzc2VjdG9yLAorCQkJCSAgICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfVkxBTikpIHsKKwkJCWtleV92bGFuID0gc2tiX2Zsb3dfZGlzc2VjdG9yX3RhcmdldChmbG93X2Rpc3NlY3RvciwKKwkJCQkJCQkgICAgIEZMT1dfRElTU0VDVE9SX0tFWV9WTEFOLAorCQkJCQkJCSAgICAgdGFyZ2V0X2NvbnRhaW5lcik7CisKKwkJCWlmIChza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKSB7CisJCQkJa2V5X3ZsYW4tPnZsYW5faWQgPSBza2Jfdmxhbl90YWdfZ2V0X2lkKHNrYik7CisJCQkJa2V5X3ZsYW4tPnZsYW5fcHJpb3JpdHkgPQorCQkJCQkoc2tiX3ZsYW5fdGFnX2dldF9wcmlvKHNrYikgPj4gVkxBTl9QUklPX1NISUZUKTsKKwkJCX0gZWxzZSB7CisJCQkJa2V5X3ZsYW4tPnZsYW5faWQgPSBudG9ocyh2bGFuLT5oX3ZsYW5fVENJKSAmCisJCQkJCVZMQU5fVklEX01BU0s7CisJCQkJa2V5X3ZsYW4tPnZsYW5fcHJpb3JpdHkgPQorCQkJCQkobnRvaHModmxhbi0+aF92bGFuX1RDSSkgJgorCQkJCQkgVkxBTl9QUklPX01BU0spID4+IFZMQU5fUFJJT19TSElGVDsKKwkJCX0KKwkJfQorCiAJCWdvdG8gYWdhaW47CiAJfQogCWNhc2UgaHRvbnMoRVRIX1BfUFBQX1NFUyk6IHsKQEAgLTMzOCwzMiArMzY1LDQyIEBACiBpcF9wcm90b19hZ2FpbjoKIAlzd2l0Y2ggKGlwX3Byb3RvKSB7CiAJY2FzZSBJUFBST1RPX0dSRTogewotCQlzdHJ1Y3QgZ3JlX2hkciB7Ci0JCQlfX2JlMTYgZmxhZ3M7Ci0JCQlfX2JlMTYgcHJvdG87Ci0JCX0gKmhkciwgX2hkcjsKKwkJc3RydWN0IGdyZV9iYXNlX2hkciAqaGRyLCBfaGRyOworCQl1MTYgZ3JlX3ZlcjsKKwkJaW50IG9mZnNldCA9IDA7CiAKIAkJaGRyID0gX19za2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBuaG9mZiwgc2l6ZW9mKF9oZHIpLCBkYXRhLCBobGVuLCAmX2hkcik7CiAJCWlmICghaGRyKQogCQkJZ290byBvdXRfYmFkOwotCQkvKgotCQkgKiBPbmx5IGxvb2sgaW5zaWRlIEdSRSBpZiB2ZXJzaW9uIHplcm8gYW5kIG5vCi0JCSAqIHJvdXRpbmcKLQkJICovCi0JCWlmIChoZHItPmZsYWdzICYgKEdSRV9WRVJTSU9OIHwgR1JFX1JPVVRJTkcpKQorCisJCS8qIE9ubHkgbG9vayBpbnNpZGUgR1JFIHdpdGhvdXQgcm91dGluZyAqLworCQlpZiAoaGRyLT5mbGFncyAmIEdSRV9ST1VUSU5HKQogCQkJYnJlYWs7CiAKLQkJcHJvdG8gPSBoZHItPnByb3RvOwotCQluaG9mZiArPSA0OworCQkvKiBPbmx5IGxvb2sgaW5zaWRlIEdSRSBmb3IgdmVyc2lvbiAwIGFuZCAxICovCisJCWdyZV92ZXIgPSBudG9ocyhoZHItPmZsYWdzICYgR1JFX1ZFUlNJT04pOworCQlpZiAoZ3JlX3ZlciA+IDEpCisJCQlicmVhazsKKworCQlwcm90byA9IGhkci0+cHJvdG9jb2w7CisJCWlmIChncmVfdmVyKSB7CisJCQkvKiBWZXJzaW9uMSBtdXN0IGJlIFBQVFAsIGFuZCBjaGVjayB0aGUgZmxhZ3MgKi8KKwkJCWlmICghKHByb3RvID09IEdSRV9QUk9UT19QUFAgJiYgKGhkci0+ZmxhZ3MgJiBHUkVfS0VZKSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBncmVfYmFzZV9oZHIpOworCiAJCWlmIChoZHItPmZsYWdzICYgR1JFX0NTVU0pCi0JCQluaG9mZiArPSA0OworCQkJb2Zmc2V0ICs9IHNpemVvZigoKHN0cnVjdCBncmVfZnVsbF9oZHIgKikwKS0+Y3N1bSkgKworCQkJCSAgc2l6ZW9mKCgoc3RydWN0IGdyZV9mdWxsX2hkciAqKTApLT5yZXNlcnZlZDEpOworCiAJCWlmIChoZHItPmZsYWdzICYgR1JFX0tFWSkgewogCQkJY29uc3QgX19iZTMyICprZXlpZDsKIAkJCV9fYmUzMiBfa2V5aWQ7CiAKLQkJCWtleWlkID0gX19za2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBuaG9mZiwgc2l6ZW9mKF9rZXlpZCksCisJCQlrZXlpZCA9IF9fc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgbmhvZmYgKyBvZmZzZXQsIHNpemVvZihfa2V5aWQpLAogCQkJCQkJICAgICBkYXRhLCBobGVuLCAmX2tleWlkKTsKLQogCQkJaWYgKCFrZXlpZCkKIAkJCQlnb3RvIG91dF9iYWQ7CiAKQEAgLTM3MiwzMiArNDA5LDY1IEBACiAJCQkJa2V5X2tleWlkID0gc2tiX2Zsb3dfZGlzc2VjdG9yX3RhcmdldChmbG93X2Rpc3NlY3RvciwKIAkJCQkJCQkJICAgICAgRkxPV19ESVNTRUNUT1JfS0VZX0dSRV9LRVlJRCwKIAkJCQkJCQkJICAgICAgdGFyZ2V0X2NvbnRhaW5lcik7Ci0JCQkJa2V5X2tleWlkLT5rZXlpZCA9ICprZXlpZDsKKwkJCQlpZiAoZ3JlX3ZlciA9PSAwKQorCQkJCQlrZXlfa2V5aWQtPmtleWlkID0gKmtleWlkOworCQkJCWVsc2UKKwkJCQkJa2V5X2tleWlkLT5rZXlpZCA9ICprZXlpZCAmIEdSRV9QUFRQX0tFWV9NQVNLOwogCQkJfQotCQkJbmhvZmYgKz0gNDsKKwkJCW9mZnNldCArPSBzaXplb2YoKChzdHJ1Y3QgZ3JlX2Z1bGxfaGRyICopMCktPmtleSk7CiAJCX0KKwogCQlpZiAoaGRyLT5mbGFncyAmIEdSRV9TRVEpCi0JCQluaG9mZiArPSA0OwotCQlpZiAocHJvdG8gPT0gaHRvbnMoRVRIX1BfVEVCKSkgewotCQkJY29uc3Qgc3RydWN0IGV0aGhkciAqZXRoOwotCQkJc3RydWN0IGV0aGhkciBfZXRoOworCQkJb2Zmc2V0ICs9IHNpemVvZigoKHN0cnVjdCBwcHRwX2dyZV9oZWFkZXIgKikwKS0+c2VxKTsKIAotCQkJZXRoID0gX19za2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBuaG9mZiwKLQkJCQkJCSAgIHNpemVvZihfZXRoKSwKLQkJCQkJCSAgIGRhdGEsIGhsZW4sICZfZXRoKTsKLQkJCWlmICghZXRoKQorCQlpZiAoZ3JlX3ZlciA9PSAwKSB7CisJCQlpZiAocHJvdG8gPT0gaHRvbnMoRVRIX1BfVEVCKSkgeworCQkJCWNvbnN0IHN0cnVjdCBldGhoZHIgKmV0aDsKKwkJCQlzdHJ1Y3QgZXRoaGRyIF9ldGg7CisKKwkJCQlldGggPSBfX3NrYl9oZWFkZXJfcG9pbnRlcihza2IsIG5ob2ZmICsgb2Zmc2V0LAorCQkJCQkJCSAgIHNpemVvZihfZXRoKSwKKwkJCQkJCQkgICBkYXRhLCBobGVuLCAmX2V0aCk7CisJCQkJaWYgKCFldGgpCisJCQkJCWdvdG8gb3V0X2JhZDsKKwkJCQlwcm90byA9IGV0aC0+aF9wcm90bzsKKwkJCQlvZmZzZXQgKz0gc2l6ZW9mKCpldGgpOworCisJCQkJLyogQ2FwIGhlYWRlcnMgdGhhdCB3ZSBhY2Nlc3MgdmlhIHBvaW50ZXJzIGF0IHRoZQorCQkJCSAqIGVuZCBvZiB0aGUgRXRoZXJuZXQgaGVhZGVyIGFzIG91ciBtYXhpbXVtIGFsaWdubWVudAorCQkJCSAqIGF0IHRoYXQgcG9pbnQgaXMgb25seSAyIGJ5dGVzLgorCQkJCSAqLworCQkJCWlmIChORVRfSVBfQUxJR04pCisJCQkJCWhsZW4gPSAobmhvZmYgKyBvZmZzZXQpOworCQkJfQorCQl9IGVsc2UgeyAvKiB2ZXJzaW9uIDEsIG11c3QgYmUgUFBUUCAqLworCQkJdTggX3BwcF9oZHJbUFBQX0hEUkxFTl07CisJCQl1OCAqcHBwX2hkcjsKKworCQkJaWYgKGhkci0+ZmxhZ3MgJiBHUkVfQUNLKQorCQkJCW9mZnNldCArPSBzaXplb2YoKChzdHJ1Y3QgcHB0cF9ncmVfaGVhZGVyICopMCktPmFjayk7CisKKwkJCXBwcF9oZHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBuaG9mZiArIG9mZnNldCwKKwkJCQkJCSAgICAgc2l6ZW9mKF9wcHBfaGRyKSwgX3BwcF9oZHIpOworCQkJaWYgKCFwcHBfaGRyKQogCQkJCWdvdG8gb3V0X2JhZDsKLQkJCXByb3RvID0gZXRoLT5oX3Byb3RvOwotCQkJbmhvZmYgKz0gc2l6ZW9mKCpldGgpOwogCi0JCQkvKiBDYXAgaGVhZGVycyB0aGF0IHdlIGFjY2VzcyB2aWEgcG9pbnRlcnMgYXQgdGhlCi0JCQkgKiBlbmQgb2YgdGhlIEV0aGVybmV0IGhlYWRlciBhcyBvdXIgbWF4aW11bSBhbGlnbm1lbnQKLQkJCSAqIGF0IHRoYXQgcG9pbnQgaXMgb25seSAyIGJ5dGVzLgotCQkJICovCi0JCQlpZiAoTkVUX0lQX0FMSUdOKQotCQkJCWhsZW4gPSBuaG9mZjsKKwkJCXN3aXRjaCAoUFBQX1BST1RPQ09MKHBwcF9oZHIpKSB7CisJCQljYXNlIFBQUF9JUDoKKwkJCQlwcm90byA9IGh0b25zKEVUSF9QX0lQKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUFBQX0lQVjY6CisJCQkJcHJvdG8gPSBodG9ucyhFVEhfUF9JUFY2KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyogQ291bGQgcHJvYmFibHkgY2F0Y2ggc29tZSBtb3JlIGxpa2UgTVBMUyAqLworCQkJCWJyZWFrOworCQkJfQorCisJCQlvZmZzZXQgKz0gUFBQX0hEUkxFTjsKIAkJfQogCisJCW5ob2ZmICs9IG9mZnNldDsKIAkJa2V5X2NvbnRyb2wtPmZsYWdzIHw9IEZMT1dfRElTX0VOQ0FQU1VMQVRJT047CiAJCWlmIChmbGFncyAmIEZMT1dfRElTU0VDVE9SX0ZfU1RPUF9BVF9FTkNBUCkKIAkJCWdvdG8gb3V0X2dvb2Q7CkBAIC02ODAsMTEgKzc1MCwxMyBAQAogdm9pZCBfX3NrYl9nZXRfaGFzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBmbG93X2tleXMga2V5czsKKwl1MzIgaGFzaDsKIAogCV9fZmxvd19oYXNoX3NlY3JldF9pbml0KCk7CiAKLQlfX3NrYl9zZXRfc3dfaGFzaChza2IsIF9fX3NrYl9nZXRfaGFzaChza2IsICZrZXlzLCBoYXNocm5kKSwKLQkJCSAgZmxvd19rZXlzX2hhdmVfbDQoJmtleXMpKTsKKwloYXNoID0gX19fc2tiX2dldF9oYXNoKHNrYiwgJmtleXMsIGhhc2hybmQpOworCisJX19za2Jfc2V0X3N3X2hhc2goc2tiLCBoYXNoLCBmbG93X2tleXNfaGF2ZV9sNCgma2V5cykpOwogfQogRVhQT1JUX1NZTUJPTChfX3NrYl9nZXRfaGFzaCk7CiAKQEAgLTg3Miw4ICs5NDQsOCBAQAogCQkub2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGZsb3dfa2V5cywgcG9ydHMpLAogCX0sCiAJewotCQkua2V5X2lkID0gRkxPV19ESVNTRUNUT1JfS0VZX1ZMQU5JRCwKLQkJLm9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBmbG93X2tleXMsIHRhZ3MpLAorCQkua2V5X2lkID0gRkxPV19ESVNTRUNUT1JfS0VZX1ZMQU4sCisJCS5vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgZmxvd19rZXlzLCB2bGFuKSwKIAl9LAogCXsKIAkJLmtleV9pZCA9IEZMT1dfRElTU0VDVE9SX0tFWV9GTE9XX0xBQkVMLApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbHd0dW5uZWwuYyBiL25ldC9jb3JlL2x3dHVubmVsLmMKaW5kZXggNjY5ZWNjOS4uZTVmODRjMiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbHd0dW5uZWwuYworKysgYi9uZXQvY29yZS9sd3R1bm5lbC5jCkBAIC0yNTEsNiArMjUxLDQxIEBACiB9CiBFWFBPUlRfU1lNQk9MKGx3dHVubmVsX291dHB1dCk7CiAKK2ludCBsd3R1bm5lbF94bWl0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiX2RzdChza2IpOworCWNvbnN0IHN0cnVjdCBsd3R1bm5lbF9lbmNhcF9vcHMgKm9wczsKKwlzdHJ1Y3QgbHd0dW5uZWxfc3RhdGUgKmx3dHN0YXRlOworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKCFkc3QpCisJCWdvdG8gZHJvcDsKKworCWx3dHN0YXRlID0gZHN0LT5sd3RzdGF0ZTsKKworCWlmIChsd3RzdGF0ZS0+dHlwZSA9PSBMV1RVTk5FTF9FTkNBUF9OT05FIHx8CisJICAgIGx3dHN0YXRlLT50eXBlID4gTFdUVU5ORUxfRU5DQVBfTUFYKQorCQlyZXR1cm4gMDsKKworCXJldCA9IC1FT1BOT1RTVVBQOworCXJjdV9yZWFkX2xvY2soKTsKKwlvcHMgPSByY3VfZGVyZWZlcmVuY2UobHd0dW5fZW5jYXBzW2x3dHN0YXRlLT50eXBlXSk7CisJaWYgKGxpa2VseShvcHMgJiYgb3BzLT54bWl0KSkKKwkJcmV0ID0gb3BzLT54bWl0KHNrYik7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAocmV0ID09IC1FT1BOT1RTVVBQKQorCQlnb3RvIGRyb3A7CisKKwlyZXR1cm4gcmV0OworCitkcm9wOgorCWtmcmVlX3NrYihza2IpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wobHd0dW5uZWxfeG1pdCk7CisKIGludCBsd3R1bm5lbF9pbnB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYl9kc3Qoc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25laWdoYm91ci5jIGIvbmV0L2NvcmUvbmVpZ2hib3VyLmMKaW5kZXggY2YyNmUwNGM0Li4yYWU5MjlmIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZWlnaGJvdXIuYworKysgYi9uZXQvY29yZS9uZWlnaGJvdXIuYwpAQCAtMTE0OCw3ICsxMTQ4LDggQEAKIAkJCX0gZWxzZQogCQkJCWdvdG8gb3V0OwogCQl9IGVsc2UgewotCQkJaWYgKGxsYWRkciA9PSBuZWlnaC0+aGEgJiYgbmV3ID09IE5VRF9TVEFMRSkKKwkJCWlmIChsbGFkZHIgPT0gbmVpZ2gtPmhhICYmIG5ldyA9PSBOVURfU1RBTEUgJiYKKwkJCSAgICAhKGZsYWdzICYgTkVJR0hfVVBEQVRFX0ZfQURNSU4pKQogCQkJCW5ldyA9IG9sZDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldF9uYW1lc3BhY2UuYyBiL25ldC9jb3JlL25ldF9uYW1lc3BhY2UuYwppbmRleCAyYzJlYjFiLi40MmJkZGEwIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMKKysrIGIvbmV0L2NvcmUvbmV0X25hbWVzcGFjZS5jCkBAIC0zNyw2ICszNyw4IEBACiB9OwogRVhQT1JUX1NZTUJPTChpbml0X25ldCk7CiAKK3N0YXRpYyBib29sIGluaXRfbmV0X2luaXRpYWxpemVkOworCiAjZGVmaW5lIElOSVRJQUxfTkVUX0dFTl9QVFJTCTEzIC8qICsxIGZvciBsZW4gKzIgZm9yIHJjdV9oZWFkICovCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2dlbl9wdHJzID0gSU5JVElBTF9ORVRfR0VOX1BUUlM7CkBAIC0yMTMsMzEgKzIxNSwyOSBAQAogICovCiBpbnQgcGVlcm5ldDJpZF9hbGxvYyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZXQgKnBlZXIpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlib29sIGFsbG9jOwogCWludCBpZDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZuZXQtPm5zaWRfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19iaCgmbmV0LT5uc2lkX2xvY2spOwogCWFsbG9jID0gYXRvbWljX3JlYWQoJnBlZXItPmNvdW50KSA9PSAwID8gZmFsc2UgOiB0cnVlOwogCWlkID0gX19wZWVybmV0MmlkX2FsbG9jKG5ldCwgcGVlciwgJmFsbG9jKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXQtPm5zaWRfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPm5zaWRfbG9jayk7CiAJaWYgKGFsbG9jICYmIGlkID49IDApCiAJCXJ0bmxfbmV0X25vdGlmeWlkKG5ldCwgUlRNX05FV05TSUQsIGlkKTsKIAlyZXR1cm4gaWQ7CiB9Ci1FWFBPUlRfU1lNQk9MKHBlZXJuZXQyaWRfYWxsb2MpOwogCiAvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMsIGlmIGFzc2lnbmVkLCB0aGUgaWQgb2YgYSBwZWVyIG5ldG5zLiAqLwogaW50IHBlZXJuZXQyaWQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmV0ICpwZWVyKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGlkOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm5ldC0+bnNpZF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2JoKCZuZXQtPm5zaWRfbG9jayk7CiAJaWQgPSBfX3BlZXJuZXQyaWQobmV0LCBwZWVyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXQtPm5zaWRfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPm5zaWRfbG9jayk7CiAJcmV0dXJuIGlkOwogfQorRVhQT1JUX1NZTUJPTChwZWVybmV0MmlkKTsKIAogLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaXMgdGhlIHBlZXIgbmV0bnMgaGFzIGFuIGlkIGFzc2lnbmVkIGludG8gdGhlCiAgKiBjdXJyZW50IG5ldG5zLgpAQCAtMjQ5LDE4ICsyNDksMTcgQEAKIAogc3RydWN0IG5ldCAqZ2V0X25ldF9uc19ieV9pZChzdHJ1Y3QgbmV0ICpuZXQsIGludCBpZCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBuZXQgKnBlZXI7CiAKIAlpZiAoaWQgPCAwKQogCQlyZXR1cm4gTlVMTDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0LT5uc2lkX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+bnNpZF9sb2NrKTsKIAlwZWVyID0gaWRyX2ZpbmQoJm5ldC0+bmV0bnNfaWRzLCBpZCk7CiAJaWYgKHBlZXIpCiAJCWdldF9uZXQocGVlcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0LT5uc2lkX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT5uc2lkX2xvY2spOwogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIHBlZXI7CkBAIC00MDQsMTcgKzQwMywxNyBAQAogCQlmb3JfZWFjaF9uZXQodG1wKSB7CiAJCQlpbnQgaWQ7CiAKLQkJCXNwaW5fbG9ja19pcnEoJnRtcC0+bnNpZF9sb2NrKTsKKwkJCXNwaW5fbG9ja19iaCgmdG1wLT5uc2lkX2xvY2spOwogCQkJaWQgPSBfX3BlZXJuZXQyaWQodG1wLCBuZXQpOwogCQkJaWYgKGlkID49IDApCiAJCQkJaWRyX3JlbW92ZSgmdG1wLT5uZXRuc19pZHMsIGlkKTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmdG1wLT5uc2lkX2xvY2spOworCQkJc3Bpbl91bmxvY2tfYmgoJnRtcC0+bnNpZF9sb2NrKTsKIAkJCWlmIChpZCA+PSAwKQogCQkJCXJ0bmxfbmV0X25vdGlmeWlkKHRtcCwgUlRNX0RFTE5TSUQsIGlkKTsKIAkJfQotCQlzcGluX2xvY2tfaXJxKCZuZXQtPm5zaWRfbG9jayk7CisJCXNwaW5fbG9ja19iaCgmbmV0LT5uc2lkX2xvY2spOwogCQlpZHJfZGVzdHJveSgmbmV0LT5uZXRuc19pZHMpOwotCQlzcGluX3VubG9ja19pcnEoJm5ldC0+bnNpZF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJm5ldC0+bnNpZF9sb2NrKTsKIAogCX0KIAlydG5sX3VubG9jaygpOwpAQCAtNTMxLDcgKzUzMCw3IEBACiAJLmV4aXQgPSBuZXRfbnNfbmV0X2V4aXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgcnRubF9uZXRfcG9saWN5W05FVE5TQV9NQVggKyAxXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBydG5sX25ldF9wb2xpY3lbTkVUTlNBX01BWCArIDFdID0gewogCVtORVROU0FfTk9ORV0JCT0geyAudHlwZSA9IE5MQV9VTlNQRUMgfSwKIAlbTkVUTlNBX05TSURdCQk9IHsgLnR5cGUgPSBOTEFfUzMyIH0sCiAJW05FVE5TQV9QSURdCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCkBAIC01NDIsNyArNTQxLDYgQEAKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKIAlzdHJ1Y3QgbmxhdHRyICp0YltORVROU0FfTUFYICsgMV07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbmV0ICpwZWVyOwogCWludCBuc2lkLCBlcnI7CiAKQEAgLTU2MywxNSArNTYxLDE1IEBACiAJaWYgKElTX0VSUihwZWVyKSkKIAkJcmV0dXJuIFBUUl9FUlIocGVlcik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0LT5uc2lkX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+bnNpZF9sb2NrKTsKIAlpZiAoX19wZWVybmV0MmlkKG5ldCwgcGVlcikgPj0gMCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXQtPm5zaWRfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19iaCgmbmV0LT5uc2lkX2xvY2spOwogCQllcnIgPSAtRUVYSVNUOwogCQlnb3RvIG91dDsKIAl9CiAKIAllcnIgPSBhbGxvY19uZXRpZChuZXQsIHBlZXIsIG5zaWQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5ldC0+bnNpZF9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfYmgoJm5ldC0+bnNpZF9sb2NrKTsKIAlpZiAoZXJyID49IDApIHsKIAkJcnRubF9uZXRfbm90aWZ5aWQobmV0LCBSVE1fTkVXTlNJRCwgZXJyKTsKIAkJZXJyID0gMDsKQEAgLTY5MywxMSArNjkxLDEwIEBACiAJCS5pZHggPSAwLAogCQkuc19pZHggPSBjYi0+YXJnc1swXSwKIAl9OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0LT5uc2lkX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+bnNpZF9sb2NrKTsKIAlpZHJfZm9yX2VhY2goJm5ldC0+bmV0bnNfaWRzLCBydG5sX25ldF9kdW1waWRfb25lLCAmbmV0X2NiKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXQtPm5zaWRfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPm5zaWRfbG9jayk7CiAKIAljYi0+YXJnc1swXSA9IG5ldF9jYi5pZHg7CiAJcmV0dXJuIHNrYi0+bGVuOwpAQCAtNzUwLDYgKzc0Nyw4IEBACiAJaWYgKHNldHVwX25ldCgmaW5pdF9uZXQsICZpbml0X3VzZXJfbnMpKQogCQlwYW5pYygiQ291bGQgbm90IHNldHVwIHRoZSBpbml0aWFsIG5ldHdvcmsgbmFtZXNwYWNlIik7CiAKKwlpbml0X25ldF9pbml0aWFsaXplZCA9IHRydWU7CisKIAlydG5sX2xvY2soKTsKIAlsaXN0X2FkZF90YWlsX3JjdSgmaW5pdF9uZXQubGlzdCwgJm5ldF9uYW1lc3BhY2VfbGlzdCk7CiAJcnRubF91bmxvY2soKTsKQEAgLTgxMSwxNSArODEwLDI0IEBACiBzdGF0aWMgaW50IF9fcmVnaXN0ZXJfcGVybmV0X29wZXJhdGlvbnMoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKIAkJCQkJc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zICpvcHMpCiB7CisJaWYgKCFpbml0X25ldF9pbml0aWFsaXplZCkgeworCQlsaXN0X2FkZF90YWlsKCZvcHMtPmxpc3QsIGxpc3QpOworCQlyZXR1cm4gMDsKKwl9CisKIAlyZXR1cm4gb3BzX2luaXQob3BzLCAmaW5pdF9uZXQpOwogfQogCiBzdGF0aWMgdm9pZCBfX3VucmVnaXN0ZXJfcGVybmV0X29wZXJhdGlvbnMoc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zICpvcHMpCiB7Ci0JTElTVF9IRUFEKG5ldF9leGl0X2xpc3QpOwotCWxpc3RfYWRkKCZpbml0X25ldC5leGl0X2xpc3QsICZuZXRfZXhpdF9saXN0KTsKLQlvcHNfZXhpdF9saXN0KG9wcywgJm5ldF9leGl0X2xpc3QpOwotCW9wc19mcmVlX2xpc3Qob3BzLCAmbmV0X2V4aXRfbGlzdCk7CisJaWYgKCFpbml0X25ldF9pbml0aWFsaXplZCkgeworCQlsaXN0X2RlbCgmb3BzLT5saXN0KTsKKwl9IGVsc2UgeworCQlMSVNUX0hFQUQobmV0X2V4aXRfbGlzdCk7CisJCWxpc3RfYWRkKCZpbml0X25ldC5leGl0X2xpc3QsICZuZXRfZXhpdF9saXN0KTsKKwkJb3BzX2V4aXRfbGlzdChvcHMsICZuZXRfZXhpdF9saXN0KTsKKwkJb3BzX2ZyZWVfbGlzdChvcHMsICZuZXRfZXhpdF9saXN0KTsKKwl9CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfTkVUX05TICovCmRpZmYgLS1naXQgYS9uZXQvY29yZS9wa3RnZW4uYyBiL25ldC9jb3JlL3BrdGdlbi5jCmluZGV4IGJiZDExOGIuLjUyMTlhOWUgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3BrdGdlbi5jCisrKyBiL25ldC9jb3JlL3BrdGdlbi5jCkBAIC0yMjg2LDcgKzIyODYsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3BrdF9vdmVyaGVhZChzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikKIHsKLQlwa3RfZGV2LT5wa3Rfb3ZlcmhlYWQgPSBMTF9SRVNFUlZFRF9TUEFDRShwa3RfZGV2LT5vZGV2KTsKKwlwa3RfZGV2LT5wa3Rfb3ZlcmhlYWQgPSAwOwogCXBrdF9kZXYtPnBrdF9vdmVyaGVhZCArPSBwa3RfZGV2LT5ucl9sYWJlbHMqc2l6ZW9mKHUzMik7CiAJcGt0X2Rldi0+cGt0X292ZXJoZWFkICs9IFZMQU5fVEFHX1NJWkUocGt0X2Rldik7CiAJcGt0X2Rldi0+cGt0X292ZXJoZWFkICs9IFNWTEFOX1RBR19TSVpFKHBrdF9kZXYpOwpAQCAtMjc3NywxMyArMjc3NywxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnBrdGdlbl9hbGxvY19za2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYsCi0JCQkJCXVuc2lnbmVkIGludCBleHRyYWxlbikKKwkJCQkJc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpCiB7CisJdW5zaWduZWQgaW50IGV4dHJhbGVuID0gTExfUkVTRVJWRURfU1BBQ0UoZGV2KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgc2l6ZSA9IHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSArIDY0ICsgZXh0cmFsZW4gKwotCQkJICAgIHBrdF9kZXYtPnBrdF9vdmVyaGVhZDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKIAorCXNpemUgPSBwa3RfZGV2LT5jdXJfcGt0X3NpemUgKyA2NCArIGV4dHJhbGVuICsgcGt0X2Rldi0+cGt0X292ZXJoZWFkOwogCWlmIChwa3RfZGV2LT5mbGFncyAmIEZfTk9ERSkgewogCQlpbnQgbm9kZSA9IHBrdF9kZXYtPm5vZGUgPj0gMCA/IHBrdF9kZXYtPm5vZGUgOiBudW1hX25vZGVfaWQoKTsKIApAQCAtMjc5Niw4ICsyNzk2LDkgQEAKIAkJIHNrYiA9IF9fbmV0ZGV2X2FsbG9jX3NrYihkZXYsIHNpemUsIEdGUF9OT1dBSVQpOwogCX0KIAorCS8qIHRoZSBjYWxsZXIgcHJlLWZldGNoZXMgZnJvbSBza2ItPmRhdGEgYW5kIHJlc2VydmVzIGZvciB0aGUgbWFjIGhkciAqLwogCWlmIChsaWtlbHkoc2tiKSkKLQkJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKKwkJc2tiX3Jlc2VydmUoc2tiLCBleHRyYWxlbiAtIDE2KTsKIAogCXJldHVybiBza2I7CiB9CkBAIC0yODMwLDE2ICsyODMxLDE0IEBACiAJbW9kX2N1cl9oZWFkZXJzKHBrdF9kZXYpOwogCXF1ZXVlX21hcCA9IHBrdF9kZXYtPmN1cl9xdWV1ZV9tYXA7CiAKLQlkYXRhbGVuID0gKG9kZXYtPmhhcmRfaGVhZGVyX2xlbiArIDE2KSAmIH4weGY7Ci0KLQlza2IgPSBwa3RnZW5fYWxsb2Nfc2tiKG9kZXYsIHBrdF9kZXYsIGRhdGFsZW4pOworCXNrYiA9IHBrdGdlbl9hbGxvY19za2Iob2RldiwgcGt0X2Rldik7CiAJaWYgKCFza2IpIHsKIAkJc3ByaW50Zihwa3RfZGV2LT5yZXN1bHQsICJObyBtZW1vcnkiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJcHJlZmV0Y2h3KHNrYi0+ZGF0YSk7Ci0Jc2tiX3Jlc2VydmUoc2tiLCBkYXRhbGVuKTsKKwlza2JfcmVzZXJ2ZShza2IsIDE2KTsKIAogCS8qICBSZXNlcnZlIGZvciBldGhlcm5ldCBhbmQgSVAgaGVhZGVyICAqLwogCWV0aCA9IChfX3U4ICopIHNrYl9wdXNoKHNrYiwgMTQpOwpAQCAtMjk1OSw3ICsyOTU4LDcgQEAKIAltb2RfY3VyX2hlYWRlcnMocGt0X2Rldik7CiAJcXVldWVfbWFwID0gcGt0X2Rldi0+Y3VyX3F1ZXVlX21hcDsKIAotCXNrYiA9IHBrdGdlbl9hbGxvY19za2Iob2RldiwgcGt0X2RldiwgMTYpOworCXNrYiA9IHBrdGdlbl9hbGxvY19za2Iob2RldiwgcGt0X2Rldik7CiAJaWYgKCFza2IpIHsKIAkJc3ByaW50Zihwa3RfZGV2LT5yZXN1bHQsICJObyBtZW1vcnkiKTsKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9ydG5ldGxpbmsuYyBiL25ldC9jb3JlL3J0bmV0bGluay5jCmluZGV4IDE4OWNjNzguLmIwNmQyZjQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3J0bmV0bGluay5jCisrKyBiL25ldC9jb3JlL3J0bmV0bGluay5jCkBAIC03MDQsNiArNzA0LDggQEAKIAkJCX0gZWxzZSBpZiAoaSA9PSBSVEFYX0ZFQVRVUkVTIC0gMSkgewogCQkJCXUzMiB1c2VyX2ZlYXR1cmVzID0gbWV0cmljc1tpXSAmIFJUQVhfRkVBVFVSRV9NQVNLOwogCisJCQkJaWYgKCF1c2VyX2ZlYXR1cmVzKQorCQkJCQljb250aW51ZTsKIAkJCQlCVUlMRF9CVUdfT04oUlRBWF9GRUFUVVJFX01BU0sgJiBEU1RfRkVBVFVSRV9NQVNLKTsKIAkJCQlpZiAobmxhX3B1dF91MzIoc2tiLCBpICsgMSwgdXNlcl9mZWF0dXJlcykpCiAJCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwpAQCAtODQxLDcgKzg0MywxMCBAQAogCQlzaXplICs9IG5sYV90b3RhbF9zaXplKG51bV92ZnMgKiBzaXplb2Yoc3RydWN0IG5sYXR0cikpOwogCQlzaXplICs9IG51bV92ZnMgKgogCQkJKG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgaWZsYV92Zl9tYWMpKSArCi0JCQkgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3ZsYW4pKSArCisJCQkgbmxhX3RvdGFsX3NpemUoTUFYX1ZMQU5fTElTVF9MRU4gKgorCQkJCQlzaXplb2Yoc3RydWN0IG5sYXR0cikpICsKKwkJCSBubGFfdG90YWxfc2l6ZShNQVhfVkxBTl9MSVNUX0xFTiAqCisJCQkJCXNpemVvZihzdHJ1Y3QgaWZsYV92Zl92bGFuX2luZm8pKSArCiAJCQkgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3Nwb29mY2hrKSkgKwogCQkJIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgaWZsYV92Zl9yYXRlKSkgKwogCQkJIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgaWZsYV92Zl9saW5rX3N0YXRlKSkgKwpAQCAtMTEwOSwxNCArMTExNCwxNSBAQAogCQkJCQkgICAgICAgc3RydWN0IG5sYXR0ciAqdmZpbmZvKQogewogCXN0cnVjdCBpZmxhX3ZmX3Jzc19xdWVyeV9lbiB2Zl9yc3NfcXVlcnlfZW47CisJc3RydWN0IG5sYXR0ciAqdmYsICp2ZnN0YXRzLCAqdmZ2bGFubGlzdDsKIAlzdHJ1Y3QgaWZsYV92Zl9saW5rX3N0YXRlIHZmX2xpbmtzdGF0ZTsKKwlzdHJ1Y3QgaWZsYV92Zl92bGFuX2luZm8gdmZfdmxhbl9pbmZvOwogCXN0cnVjdCBpZmxhX3ZmX3Nwb29mY2hrIHZmX3Nwb29mY2hrOwogCXN0cnVjdCBpZmxhX3ZmX3R4X3JhdGUgdmZfdHhfcmF0ZTsKIAlzdHJ1Y3QgaWZsYV92Zl9zdGF0cyB2Zl9zdGF0czsKIAlzdHJ1Y3QgaWZsYV92Zl90cnVzdCB2Zl90cnVzdDsKIAlzdHJ1Y3QgaWZsYV92Zl92bGFuIHZmX3ZsYW47CiAJc3RydWN0IGlmbGFfdmZfcmF0ZSB2Zl9yYXRlOwotCXN0cnVjdCBubGF0dHIgKnZmLCAqdmZzdGF0czsKIAlzdHJ1Y3QgaWZsYV92Zl9tYWMgdmZfbWFjOwogCXN0cnVjdCBpZmxhX3ZmX2luZm8gaXZpOwogCkBAIC0xMTMzLDExICsxMTM5LDE0IEBACiAJICogSUZMQV9WRl9MSU5LX1NUQVRFX0FVVE8gd2hpY2ggZXF1YWxzIHplcm8KIAkgKi8KIAlpdmkubGlua3N0YXRlID0gMDsKKwkvKiBWTEFOIFByb3RvY29sIGJ5IGRlZmF1bHQgaXMgODAyLjFRICovCisJaXZpLnZsYW5fcHJvdG8gPSBodG9ucyhFVEhfUF84MDIxUSk7CiAJaWYgKGRldi0+bmV0ZGV2X29wcy0+bmRvX2dldF92Zl9jb25maWcoZGV2LCB2ZnNfbnVtLCAmaXZpKSkKIAkJcmV0dXJuIDA7CiAKIAl2Zl9tYWMudmYgPQogCQl2Zl92bGFuLnZmID0KKwkJdmZfdmxhbl9pbmZvLnZmID0KIAkJdmZfcmF0ZS52ZiA9CiAJCXZmX3R4X3JhdGUudmYgPQogCQl2Zl9zcG9vZmNoay52ZiA9CkBAIC0xMTQ4LDYgKzExNTcsOSBAQAogCW1lbWNweSh2Zl9tYWMubWFjLCBpdmkubWFjLCBzaXplb2YoaXZpLm1hYykpOwogCXZmX3ZsYW4udmxhbiA9IGl2aS52bGFuOwogCXZmX3ZsYW4ucW9zID0gaXZpLnFvczsKKwl2Zl92bGFuX2luZm8udmxhbiA9IGl2aS52bGFuOworCXZmX3ZsYW5faW5mby5xb3MgPSBpdmkucW9zOworCXZmX3ZsYW5faW5mby52bGFuX3Byb3RvID0gaXZpLnZsYW5fcHJvdG87CiAJdmZfdHhfcmF0ZS5yYXRlID0gaXZpLm1heF90eF9yYXRlOwogCXZmX3JhdGUubWluX3R4X3JhdGUgPSBpdmkubWluX3R4X3JhdGU7CiAJdmZfcmF0ZS5tYXhfdHhfcmF0ZSA9IGl2aS5tYXhfdHhfcmF0ZTsKQEAgLTExNTYsMTAgKzExNjgsOCBAQAogCXZmX3Jzc19xdWVyeV9lbi5zZXR0aW5nID0gaXZpLnJzc19xdWVyeV9lbjsKIAl2Zl90cnVzdC5zZXR0aW5nID0gaXZpLnRydXN0ZWQ7CiAJdmYgPSBubGFfbmVzdF9zdGFydChza2IsIElGTEFfVkZfSU5GTyk7Ci0JaWYgKCF2ZikgewotCQlubGFfbmVzdF9jYW5jZWwoc2tiLCB2ZmluZm8pOwotCQlyZXR1cm4gLUVNU0dTSVpFOwotCX0KKwlpZiAoIXZmKQorCQlnb3RvIG5sYV9wdXRfdmZpbmZvX2ZhaWx1cmU7CiAJaWYgKG5sYV9wdXQoc2tiLCBJRkxBX1ZGX01BQywgc2l6ZW9mKHZmX21hYyksICZ2Zl9tYWMpIHx8CiAJICAgIG5sYV9wdXQoc2tiLCBJRkxBX1ZGX1ZMQU4sIHNpemVvZih2Zl92bGFuKSwgJnZmX3ZsYW4pIHx8CiAJICAgIG5sYV9wdXQoc2tiLCBJRkxBX1ZGX1JBVEUsIHNpemVvZih2Zl9yYXRlKSwKQEAgLTExNzUsMTcgKzExODUsMjMgQEAKIAkJICAgICZ2Zl9yc3NfcXVlcnlfZW4pIHx8CiAJICAgIG5sYV9wdXQoc2tiLCBJRkxBX1ZGX1RSVVNULAogCQkgICAgc2l6ZW9mKHZmX3RydXN0KSwgJnZmX3RydXN0KSkKLQkJcmV0dXJuIC1FTVNHU0laRTsKKwkJZ290byBubGFfcHV0X3ZmX2ZhaWx1cmU7CisJdmZ2bGFubGlzdCA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgSUZMQV9WRl9WTEFOX0xJU1QpOworCWlmICghdmZ2bGFubGlzdCkKKwkJZ290byBubGFfcHV0X3ZmX2ZhaWx1cmU7CisJaWYgKG5sYV9wdXQoc2tiLCBJRkxBX1ZGX1ZMQU5fSU5GTywgc2l6ZW9mKHZmX3ZsYW5faW5mbyksCisJCSAgICAmdmZfdmxhbl9pbmZvKSkgeworCQlubGFfbmVzdF9jYW5jZWwoc2tiLCB2ZnZsYW5saXN0KTsKKwkJZ290byBubGFfcHV0X3ZmX2ZhaWx1cmU7CisJfQorCW5sYV9uZXN0X2VuZChza2IsIHZmdmxhbmxpc3QpOwogCW1lbXNldCgmdmZfc3RhdHMsIDAsIHNpemVvZih2Zl9zdGF0cykpOwogCWlmIChkZXYtPm5ldGRldl9vcHMtPm5kb19nZXRfdmZfc3RhdHMpCiAJCWRldi0+bmV0ZGV2X29wcy0+bmRvX2dldF92Zl9zdGF0cyhkZXYsIHZmc19udW0sCiAJCQkJCQkmdmZfc3RhdHMpOwogCXZmc3RhdHMgPSBubGFfbmVzdF9zdGFydChza2IsIElGTEFfVkZfU1RBVFMpOwotCWlmICghdmZzdGF0cykgewotCQlubGFfbmVzdF9jYW5jZWwoc2tiLCB2Zik7Ci0JCW5sYV9uZXN0X2NhbmNlbChza2IsIHZmaW5mbyk7Ci0JCXJldHVybiAtRU1TR1NJWkU7Ci0JfQorCWlmICghdmZzdGF0cykKKwkJZ290byBubGFfcHV0X3ZmX2ZhaWx1cmU7CiAJaWYgKG5sYV9wdXRfdTY0XzY0Yml0KHNrYiwgSUZMQV9WRl9TVEFUU19SWF9QQUNLRVRTLAogCQkJICAgICAgdmZfc3RhdHMucnhfcGFja2V0cywgSUZMQV9WRl9TVEFUU19QQUQpIHx8CiAJICAgIG5sYV9wdXRfdTY0XzY0Yml0KHNrYiwgSUZMQV9WRl9TVEFUU19UWF9QQUNLRVRTLApAQCAtMTE5NywxMSArMTIxMywxOSBAQAogCSAgICBubGFfcHV0X3U2NF82NGJpdChza2IsIElGTEFfVkZfU1RBVFNfQlJPQURDQVNULAogCQkJICAgICAgdmZfc3RhdHMuYnJvYWRjYXN0LCBJRkxBX1ZGX1NUQVRTX1BBRCkgfHwKIAkgICAgbmxhX3B1dF91NjRfNjRiaXQoc2tiLCBJRkxBX1ZGX1NUQVRTX01VTFRJQ0FTVCwKLQkJCSAgICAgIHZmX3N0YXRzLm11bHRpY2FzdCwgSUZMQV9WRl9TVEFUU19QQUQpKQotCQlyZXR1cm4gLUVNU0dTSVpFOworCQkJICAgICAgdmZfc3RhdHMubXVsdGljYXN0LCBJRkxBX1ZGX1NUQVRTX1BBRCkpIHsKKwkJbmxhX25lc3RfY2FuY2VsKHNrYiwgdmZzdGF0cyk7CisJCWdvdG8gbmxhX3B1dF92Zl9mYWlsdXJlOworCX0KIAlubGFfbmVzdF9lbmQoc2tiLCB2ZnN0YXRzKTsKIAlubGFfbmVzdF9lbmQoc2tiLCB2Zik7CiAJcmV0dXJuIDA7CisKK25sYV9wdXRfdmZfZmFpbHVyZToKKwlubGFfbmVzdF9jYW5jZWwoc2tiLCB2Zik7CitubGFfcHV0X3ZmaW5mb19mYWlsdXJlOgorCW5sYV9uZXN0X2NhbmNlbChza2IsIHZmaW5mbyk7CisJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAogc3RhdGljIGludCBydG5sX2ZpbGxfbGlua19pZm1hcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTQ0Niw2ICsxNDcwLDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBpZmxhX3ZmX3BvbGljeVtJRkxBX1ZGX01BWCsxXSA9IHsKIAlbSUZMQV9WRl9NQUNdCQk9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgaWZsYV92Zl9tYWMpIH0sCiAJW0lGTEFfVkZfVkxBTl0JCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3ZsYW4pIH0sCisJW0lGTEFfVkZfVkxBTl9MSVNUXSAgICAgPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAogCVtJRkxBX1ZGX1RYX1JBVEVdCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3R4X3JhdGUpIH0sCiAJW0lGTEFfVkZfU1BPT0ZDSEtdCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3Nwb29mY2hrKSB9LAogCVtJRkxBX1ZGX1JBVEVdCQk9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgaWZsYV92Zl9yYXRlKSB9LApAQCAtMTcwMiw3ICsxNzI3LDM3IEBACiAJCWVyciA9IC1FT1BOT1RTVVBQOwogCQlpZiAob3BzLT5uZG9fc2V0X3ZmX3ZsYW4pCiAJCQllcnIgPSBvcHMtPm5kb19zZXRfdmZfdmxhbihkZXYsIGl2di0+dmYsIGl2di0+dmxhbiwKLQkJCQkJCSAgIGl2di0+cW9zKTsKKwkJCQkJCSAgIGl2di0+cW9zLAorCQkJCQkJICAgaHRvbnMoRVRIX1BfODAyMVEpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCWlmICh0YltJRkxBX1ZGX1ZMQU5fTElTVF0pIHsKKwkJc3RydWN0IGlmbGFfdmZfdmxhbl9pbmZvICppdnZsW01BWF9WTEFOX0xJU1RfTEVOXTsKKwkJc3RydWN0IG5sYXR0ciAqYXR0cjsKKwkJaW50IHJlbSwgbGVuID0gMDsKKworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJaWYgKCFvcHMtPm5kb19zZXRfdmZfdmxhbikKKwkJCXJldHVybiBlcnI7CisKKwkJbmxhX2Zvcl9lYWNoX25lc3RlZChhdHRyLCB0YltJRkxBX1ZGX1ZMQU5fTElTVF0sIHJlbSkgeworCQkJaWYgKG5sYV90eXBlKGF0dHIpICE9IElGTEFfVkZfVkxBTl9JTkZPIHx8CisJCQkgICAgbmxhX2xlbihhdHRyKSA8IE5MQV9IRFJMRU4pIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmIChsZW4gPj0gTUFYX1ZMQU5fTElTVF9MRU4pCisJCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQkJaXZ2bFtsZW5dID0gbmxhX2RhdGEoYXR0cik7CisKKwkJCWxlbisrOworCQl9CisJCWlmIChsZW4gPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWVyciA9IG9wcy0+bmRvX3NldF92Zl92bGFuKGRldiwgaXZ2bFswXS0+dmYsIGl2dmxbMF0tPnZsYW4sCisJCQkJCSAgIGl2dmxbMF0tPnFvcywgaXZ2bFswXS0+dmxhbl9wcm90byk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9CkBAIC0zMDY2LDcgKzMxMjEsNyBAQAogCXNlcSA9IGNiLT5ubGgtPm5sbXNnX3NlcTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaGEsICZsaXN0LT5saXN0LCBsaXN0KSB7Ci0JCWlmICgqaWR4IDwgY2ItPmFyZ3NbMF0pCisJCWlmICgqaWR4IDwgY2ItPmFyZ3NbMl0pCiAJCQlnb3RvIHNraXA7CiAKIAkJZXJyID0gbmxtc2dfcG9wdWxhdGVfZmRiX2ZpbGwoc2tiLCBkZXYsIGhhLT5hZGRyLCAwLApAQCAtMzA5MywxOSArMzE0OCwxOCBAQAogCQkgICAgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCiAJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpmaWx0ZXJfZGV2LAotCQkgICAgICBpbnQgaWR4KQorCQkgICAgICBpbnQgKmlkeCkKIHsKIAlpbnQgZXJyOwogCiAJbmV0aWZfYWRkcl9sb2NrX2JoKGRldik7Ci0JZXJyID0gbmxtc2dfcG9wdWxhdGVfZmRiKHNrYiwgY2IsIGRldiwgJmlkeCwgJmRldi0+dWMpOworCWVyciA9IG5sbXNnX3BvcHVsYXRlX2ZkYihza2IsIGNiLCBkZXYsIGlkeCwgJmRldi0+dWMpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCW5sbXNnX3BvcHVsYXRlX2ZkYihza2IsIGNiLCBkZXYsICZpZHgsICZkZXYtPm1jKTsKKwlubG1zZ19wb3B1bGF0ZV9mZGIoc2tiLCBjYiwgZGV2LCBpZHgsICZkZXYtPm1jKTsKIG91dDoKIAluZXRpZl9hZGRyX3VubG9ja19iaChkZXYpOwotCWNiLT5hcmdzWzFdID0gZXJyOwotCXJldHVybiBpZHg7CisJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0wobmRvX2RmbHRfZmRiX2R1bXApOwogCkBAIC0zMTE4LDkgKzMxNzIsMTMgQEAKIAljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKmNvcHMgPSBOVUxMOwogCXN0cnVjdCBpZmluZm9tc2cgKmlmbSA9IG5sbXNnX2RhdGEoY2ItPm5saCk7CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CiAJaW50IGJycG9ydF9pZHggPSAwOwogCWludCBicl9pZHggPSAwOwotCWludCBpZHggPSAwOworCWludCBoLCBzX2g7CisJaW50IGlkeCA9IDAsIHNfaWR4OworCWludCBlcnIgPSAwOworCWludCBmaWR4ID0gMDsKIAogCWlmIChubG1zZ19wYXJzZShjYi0+bmxoLCBzaXplb2Yoc3RydWN0IGlmaW5mb21zZyksIHRiLCBJRkxBX01BWCwKIAkJCWlmbGFfcG9saWN5KSA9PSAwKSB7CkBAIC0zMTM4LDQ5ICszMTk2LDcxIEBACiAJCW9wcyA9IGJyX2Rldi0+bmV0ZGV2X29wczsKIAl9CiAKLQljYi0+YXJnc1sxXSA9IDA7Ci0JZm9yX2VhY2hfbmV0ZGV2KG5ldCwgZGV2KSB7Ci0JCWlmIChicnBvcnRfaWR4ICYmIChkZXYtPmlmaW5kZXggIT0gYnJwb3J0X2lkeCkpCi0JCQljb250aW51ZTsKKwlzX2ggPSBjYi0+YXJnc1swXTsKKwlzX2lkeCA9IGNiLT5hcmdzWzFdOwogCi0JCWlmICghYnJfaWR4KSB7IC8qIHVzZXIgZGlkIG5vdCBzcGVjaWZ5IGEgc3BlY2lmaWMgYnJpZGdlICovCi0JCQlpZiAoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0JSSURHRV9QT1JUKSB7Ci0JCQkJYnJfZGV2ID0gbmV0ZGV2X21hc3Rlcl91cHBlcl9kZXZfZ2V0KGRldik7Ci0JCQkJY29wcyA9IGJyX2Rldi0+bmV0ZGV2X29wczsKKwlmb3IgKGggPSBzX2g7IGggPCBORVRERVZfSEFTSEVOVFJJRVM7IGgrKywgc19pZHggPSAwKSB7CisJCWlkeCA9IDA7CisJCWhlYWQgPSAmbmV0LT5kZXZfaW5kZXhfaGVhZFtoXTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCBoZWFkLCBpbmRleF9obGlzdCkgeworCisJCQlpZiAoYnJwb3J0X2lkeCAmJiAoZGV2LT5pZmluZGV4ICE9IGJycG9ydF9pZHgpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIWJyX2lkeCkgeyAvKiB1c2VyIGRpZCBub3Qgc3BlY2lmeSBhIHNwZWNpZmljIGJyaWRnZSAqLworCQkJCWlmIChkZXYtPnByaXZfZmxhZ3MgJiBJRkZfQlJJREdFX1BPUlQpIHsKKwkJCQkJYnJfZGV2ID0gbmV0ZGV2X21hc3Rlcl91cHBlcl9kZXZfZ2V0KGRldik7CisJCQkJCWNvcHMgPSBicl9kZXYtPm5ldGRldl9vcHM7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoZGV2ICE9IGJyX2RldiAmJgorCQkJCSAgICAhKGRldi0+cHJpdl9mbGFncyAmIElGRl9CUklER0VfUE9SVCkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJaWYgKGJyX2RldiAhPSBuZXRkZXZfbWFzdGVyX3VwcGVyX2Rldl9nZXQoZGV2KSAmJgorCQkJCSAgICAhKGRldi0+cHJpdl9mbGFncyAmIElGRl9FQlJJREdFKSkKKwkJCQkJY29udGludWU7CisJCQkJY29wcyA9IG9wczsKIAkJCX0KIAotCQl9IGVsc2UgewotCQkJaWYgKGRldiAhPSBicl9kZXYgJiYKLQkJCSAgICAhKGRldi0+cHJpdl9mbGFncyAmIElGRl9CUklER0VfUE9SVCkpCi0JCQkJY29udGludWU7CisJCQlpZiAoaWR4IDwgc19pZHgpCisJCQkJZ290byBjb250OwogCi0JCQlpZiAoYnJfZGV2ICE9IG5ldGRldl9tYXN0ZXJfdXBwZXJfZGV2X2dldChkZXYpICYmCi0JCQkgICAgIShkZXYtPnByaXZfZmxhZ3MgJiBJRkZfRUJSSURHRSkpCi0JCQkJY29udGludWU7CisJCQlpZiAoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0JSSURHRV9QT1JUKSB7CisJCQkJaWYgKGNvcHMgJiYgY29wcy0+bmRvX2ZkYl9kdW1wKSB7CisJCQkJCWVyciA9IGNvcHMtPm5kb19mZGJfZHVtcChza2IsIGNiLAorCQkJCQkJCQlicl9kZXYsIGRldiwKKwkJCQkJCQkJJmZpZHgpOworCQkJCQlpZiAoZXJyID09IC1FTVNHU0laRSkKKwkJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KIAotCQkJY29wcyA9IG9wczsKKwkJCWlmIChkZXYtPm5ldGRldl9vcHMtPm5kb19mZGJfZHVtcCkKKwkJCQllcnIgPSBkZXYtPm5ldGRldl9vcHMtPm5kb19mZGJfZHVtcChza2IsIGNiLAorCQkJCQkJCQkgICAgZGV2LCBOVUxMLAorCQkJCQkJCQkgICAgJmZpZHgpOworCQkJZWxzZQorCQkJCWVyciA9IG5kb19kZmx0X2ZkYl9kdW1wKHNrYiwgY2IsIGRldiwgTlVMTCwKKwkJCQkJCQkmZmlkeCk7CisJCQlpZiAoZXJyID09IC1FTVNHU0laRSkKKwkJCQlnb3RvIG91dDsKKworCQkJY29wcyA9IE5VTEw7CisKKwkJCS8qIHJlc2V0IGZkYiBvZmZzZXQgdG8gMCBmb3IgcmVzdCBvZiB0aGUgaW50ZXJmYWNlcyAqLworCQkJY2ItPmFyZ3NbMl0gPSAwOworCQkJZmlkeCA9IDA7Citjb250OgorCQkJaWR4Kys7CiAJCX0KLQotCQlpZiAoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0JSSURHRV9QT1JUKSB7Ci0JCQlpZiAoY29wcyAmJiBjb3BzLT5uZG9fZmRiX2R1bXApCi0JCQkJaWR4ID0gY29wcy0+bmRvX2ZkYl9kdW1wKHNrYiwgY2IsIGJyX2RldiwgZGV2LAotCQkJCQkJCSBpZHgpOwotCQl9Ci0JCWlmIChjYi0+YXJnc1sxXSA9PSAtRU1TR1NJWkUpCi0JCQlicmVhazsKLQotCQlpZiAoZGV2LT5uZXRkZXZfb3BzLT5uZG9fZmRiX2R1bXApCi0JCQlpZHggPSBkZXYtPm5ldGRldl9vcHMtPm5kb19mZGJfZHVtcChza2IsIGNiLCBkZXYsIE5VTEwsCi0JCQkJCQkJICAgIGlkeCk7Ci0JCWVsc2UKLQkJCWlkeCA9IG5kb19kZmx0X2ZkYl9kdW1wKHNrYiwgY2IsIGRldiwgTlVMTCwgaWR4KTsKLQkJaWYgKGNiLT5hcmdzWzFdID09IC1FTVNHU0laRSkKLQkJCWJyZWFrOwotCi0JCWNvcHMgPSBOVUxMOwogCX0KIAotCWNiLT5hcmdzWzBdID0gaWR4Oworb3V0OgorCWNiLT5hcmdzWzBdID0gaDsKKwljYi0+YXJnc1sxXSA9IGlkeDsKKwljYi0+YXJnc1syXSA9IGZpZHg7CisKIAlyZXR1cm4gc2tiLT5sZW47CiB9CiAKQEAgLTM1NTAsNiArMzYzMCw5MSBAQAogCSAgICAgICAoIWlkeGF0dHIgfHwgaWR4YXR0ciA9PSBhdHRyaWQpOwogfQogCisjZGVmaW5lIElGTEFfT0ZGTE9BRF9YU1RBVFNfRklSU1QgKElGTEFfT0ZGTE9BRF9YU1RBVFNfVU5TUEVDICsgMSkKK3N0YXRpYyBpbnQgcnRubF9nZXRfb2ZmbG9hZF9zdGF0c19hdHRyX3NpemUoaW50IGF0dHJfaWQpCit7CisJc3dpdGNoIChhdHRyX2lkKSB7CisJY2FzZSBJRkxBX09GRkxPQURfWFNUQVRTX0NQVV9ISVQ6CisJCXJldHVybiBzaXplb2Yoc3RydWN0IHJ0bmxfbGlua19zdGF0czY0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydG5sX2dldF9vZmZsb2FkX3N0YXRzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBpbnQgKnByaXZpZHgpCit7CisJc3RydWN0IG5sYXR0ciAqYXR0ciA9IE5VTEw7CisJaW50IGF0dHJfaWQsIHNpemU7CisJdm9pZCAqYXR0cl9kYXRhOworCWludCBlcnI7CisKKwlpZiAoIShkZXYtPm5ldGRldl9vcHMgJiYgZGV2LT5uZXRkZXZfb3BzLT5uZG9faGFzX29mZmxvYWRfc3RhdHMgJiYKKwkgICAgICBkZXYtPm5ldGRldl9vcHMtPm5kb19nZXRfb2ZmbG9hZF9zdGF0cykpCisJCXJldHVybiAtRU5PREFUQTsKKworCWZvciAoYXR0cl9pZCA9IElGTEFfT0ZGTE9BRF9YU1RBVFNfRklSU1Q7CisJICAgICBhdHRyX2lkIDw9IElGTEFfT0ZGTE9BRF9YU1RBVFNfTUFYOyBhdHRyX2lkKyspIHsKKwkJaWYgKGF0dHJfaWQgPCAqcHJpdmlkeCkKKwkJCWNvbnRpbnVlOworCisJCXNpemUgPSBydG5sX2dldF9vZmZsb2FkX3N0YXRzX2F0dHJfc2l6ZShhdHRyX2lkKTsKKwkJaWYgKCFzaXplKQorCQkJY29udGludWU7CisKKwkJaWYgKCFkZXYtPm5ldGRldl9vcHMtPm5kb19oYXNfb2ZmbG9hZF9zdGF0cyhhdHRyX2lkKSkKKwkJCWNvbnRpbnVlOworCisJCWF0dHIgPSBubGFfcmVzZXJ2ZV82NGJpdChza2IsIGF0dHJfaWQsIHNpemUsCisJCQkJCSBJRkxBX09GRkxPQURfWFNUQVRTX1VOU1BFQyk7CisJCWlmICghYXR0cikKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJCWF0dHJfZGF0YSA9IG5sYV9kYXRhKGF0dHIpOworCQltZW1zZXQoYXR0cl9kYXRhLCAwLCBzaXplKTsKKwkJZXJyID0gZGV2LT5uZXRkZXZfb3BzLT5uZG9fZ2V0X29mZmxvYWRfc3RhdHMoYXR0cl9pZCwgZGV2LAorCQkJCQkJCSAgICAgYXR0cl9kYXRhKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZ2V0X29mZmxvYWRfc3RhdHNfZmFpbHVyZTsKKwl9CisKKwlpZiAoIWF0dHIpCisJCXJldHVybiAtRU5PREFUQTsKKworCSpwcml2aWR4ID0gMDsKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCWVyciA9IC1FTVNHU0laRTsKK2dldF9vZmZsb2FkX3N0YXRzX2ZhaWx1cmU6CisJKnByaXZpZHggPSBhdHRyX2lkOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcnRubF9nZXRfb2ZmbG9hZF9zdGF0c19zaXplKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IG5sYV9zaXplID0gMDsKKwlpbnQgYXR0cl9pZDsKKwlpbnQgc2l6ZTsKKworCWlmICghKGRldi0+bmV0ZGV2X29wcyAmJiBkZXYtPm5ldGRldl9vcHMtPm5kb19oYXNfb2ZmbG9hZF9zdGF0cyAmJgorCSAgICAgIGRldi0+bmV0ZGV2X29wcy0+bmRvX2dldF9vZmZsb2FkX3N0YXRzKSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGF0dHJfaWQgPSBJRkxBX09GRkxPQURfWFNUQVRTX0ZJUlNUOworCSAgICAgYXR0cl9pZCA8PSBJRkxBX09GRkxPQURfWFNUQVRTX01BWDsgYXR0cl9pZCsrKSB7CisJCWlmICghZGV2LT5uZXRkZXZfb3BzLT5uZG9faGFzX29mZmxvYWRfc3RhdHMoYXR0cl9pZCkpCisJCQljb250aW51ZTsKKwkJc2l6ZSA9IHJ0bmxfZ2V0X29mZmxvYWRfc3RhdHNfYXR0cl9zaXplKGF0dHJfaWQpOworCQlubGFfc2l6ZSArPSBubGFfdG90YWxfc2l6ZV82NGJpdChzaXplKTsKKwl9CisKKwlpZiAobmxhX3NpemUgIT0gMCkKKwkJbmxhX3NpemUgKz0gbmxhX3RvdGFsX3NpemUoMCk7CisKKwlyZXR1cm4gbmxhX3NpemU7Cit9CisKIHN0YXRpYyBpbnQgcnRubF9maWxsX3N0YXRzaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICAgIGludCB0eXBlLCB1MzIgcGlkLCB1MzIgc2VxLCB1MzIgY2hhbmdlLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgaW50IGZpbHRlcl9tYXNrLApAQCAtMzU1OSw2ICszNzI0LDcgQEAKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKIAlzdHJ1Y3QgbmxhdHRyICphdHRyOwogCWludCBzX3ByaXZpZHggPSAqcHJpdmlkeDsKKwlpbnQgZXJyOwogCiAJQVNTRVJUX1JUTkwoKTsKIApAQCAtMzU4Nyw4ICszNzUzLDYgQEAKIAkJY29uc3Qgc3RydWN0IHJ0bmxfbGlua19vcHMgKm9wcyA9IGRldi0+cnRubF9saW5rX29wczsKIAogCQlpZiAob3BzICYmIG9wcy0+ZmlsbF9saW5reHN0YXRzKSB7Ci0JCQlpbnQgZXJyOwotCiAJCQkqaWR4YXR0ciA9IElGTEFfU1RBVFNfTElOS19YU1RBVFM7CiAJCQlhdHRyID0gbmxhX25lc3Rfc3RhcnQoc2tiLAogCQkJCQkgICAgICBJRkxBX1NUQVRTX0xJTktfWFNUQVRTKTsKQEAgLTM2MTIsOCArMzc3Niw2IEBACiAJCWlmIChtYXN0ZXIpCiAJCQlvcHMgPSBtYXN0ZXItPnJ0bmxfbGlua19vcHM7CiAJCWlmIChvcHMgJiYgb3BzLT5maWxsX2xpbmt4c3RhdHMpIHsKLQkJCWludCBlcnI7Ci0KIAkJCSppZHhhdHRyID0gSUZMQV9TVEFUU19MSU5LX1hTVEFUU19TTEFWRTsKIAkJCWF0dHIgPSBubGFfbmVzdF9zdGFydChza2IsCiAJCQkJCSAgICAgIElGTEFfU1RBVFNfTElOS19YU1RBVFNfU0xBVkUpOwpAQCAtMzYyOCw2ICszNzkwLDI0IEBACiAJCX0KIAl9CiAKKwlpZiAoc3RhdHNfYXR0cl92YWxpZChmaWx0ZXJfbWFzaywgSUZMQV9TVEFUU19MSU5LX09GRkxPQURfWFNUQVRTLAorCQkJICAgICAqaWR4YXR0cikpIHsKKwkJKmlkeGF0dHIgPSBJRkxBX1NUQVRTX0xJTktfT0ZGTE9BRF9YU1RBVFM7CisJCWF0dHIgPSBubGFfbmVzdF9zdGFydChza2IsIElGTEFfU1RBVFNfTElOS19PRkZMT0FEX1hTVEFUUyk7CisJCWlmICghYXR0cikKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJCWVyciA9IHJ0bmxfZ2V0X29mZmxvYWRfc3RhdHMoc2tiLCBkZXYsIHByaXZpZHgpOworCQlpZiAoZXJyID09IC1FTk9EQVRBKQorCQkJbmxhX25lc3RfY2FuY2VsKHNrYiwgYXR0cik7CisJCWVsc2UKKwkJCW5sYV9uZXN0X2VuZChza2IsIGF0dHIpOworCisJCWlmIChlcnIgJiYgZXJyICE9IC1FTk9EQVRBKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJCSppZHhhdHRyID0gMDsKKwl9CisKIAlubG1zZ19lbmQoc2tiLCBubGgpOwogCiAJcmV0dXJuIDA7CkBAIC0zNjQyLDEwICszODIyLDYgQEAKIAlyZXR1cm4gLUVNU0dTSVpFOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgaWZsYV9zdGF0c19wb2xpY3lbSUZMQV9TVEFUU19NQVggKyAxXSA9IHsKLQlbSUZMQV9TVEFUU19MSU5LXzY0XQk9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQpIH0sCi19OwotCiBzdGF0aWMgc2l6ZV90IGlmX25sbXNnX3N0YXRzX3NpemUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgIHUzMiBmaWx0ZXJfbWFzaykKIHsKQEAgLTM2ODUsNiArMzg2MSw5IEBACiAJCX0KIAl9CiAKKwlpZiAoc3RhdHNfYXR0cl92YWxpZChmaWx0ZXJfbWFzaywgSUZMQV9TVEFUU19MSU5LX09GRkxPQURfWFNUQVRTLCAwKSkKKwkJc2l6ZSArPSBydG5sX2dldF9vZmZsb2FkX3N0YXRzX3NpemUoZGV2KTsKKwogCXJldHVybiBzaXplOwogfQogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9za2J1ZmYuYyBiL25ldC9jb3JlL3NrYnVmZi5jCmluZGV4IDM4NjRiNGI2Li5jYmQxOWQyIDEwMDY0NAotLS0gYS9uZXQvY29yZS9za2J1ZmYuYworKysgYi9uZXQvY29yZS9za2J1ZmYuYwpAQCAtMjQ0NSw2ICsyNDQ1LDI1IEBACiBFWFBPUlRfU1lNQk9MKHNrYl9xdWV1ZV9wdXJnZSk7CiAKIC8qKgorICoJc2tiX3JidHJlZV9wdXJnZSAtIGVtcHR5IGEgc2tiIHJidHJlZQorICoJQHJvb3Q6IHJvb3Qgb2YgdGhlIHJidHJlZSB0byBlbXB0eQorICoKKyAqCURlbGV0ZSBhbGwgYnVmZmVycyBvbiBhbiAmc2tfYnVmZiByYnRyZWUuIEVhY2ggYnVmZmVyIGlzIHJlbW92ZWQgZnJvbQorICoJdGhlIGxpc3QgYW5kIG9uZSByZWZlcmVuY2UgZHJvcHBlZC4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB0YWtlCisgKglhbnkgbG9jay4gU3luY2hyb25pemF0aW9uIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoZSBjYWxsZXIgKGUuZy4sIFRDUAorICoJb3V0LW9mLW9yZGVyIHF1ZXVlIGlzIHByb3RlY3RlZCBieSB0aGUgc29ja2V0IGxvY2spLgorICovCit2b2lkIHNrYl9yYnRyZWVfcHVyZ2Uoc3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5leHQ7CisKKwlyYnRyZWVfcG9zdG9yZGVyX2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2tiLCBuZXh0LCByb290LCByYm5vZGUpCisJCWtmcmVlX3NrYihza2IpOworCisJKnJvb3QgPSBSQl9ST09UOworfQorCisvKioKICAqCXNrYl9xdWV1ZV9oZWFkIC0gcXVldWUgYSBidWZmZXIgYXQgdGhlIGxpc3QgaGVhZAogICoJQGxpc3Q6IGxpc3QgdG8gdXNlCiAgKglAbmV3c2s6IGJ1ZmZlciB0byBxdWV1ZQpAQCAtMzA3OCwxMSArMzA5NywzMSBAQAogCXNnID0gISEoZmVhdHVyZXMgJiBORVRJRl9GX1NHKTsKIAljc3VtID0gISFjYW5fY2hlY2tzdW1fcHJvdG9jb2woZmVhdHVyZXMsIHByb3RvKTsKIAotCS8qIEdTTyBwYXJ0aWFsIG9ubHkgcmVxdWlyZXMgdGhhdCB3ZSB0cmltIG9mZiBhbnkgZXhjZXNzIHRoYXQKLQkgKiBkb2Vzbid0IGZpdCBpbnRvIGFuIE1TUyBzaXplZCBibG9jaywgc28gdGFrZSBjYXJlIG9mIHRoYXQKLQkgKiBub3cuCi0JICovCi0JaWYgKHNnICYmIGNzdW0gJiYgKGZlYXR1cmVzICYgTkVUSUZfRl9HU09fUEFSVElBTCkpIHsKKwlpZiAoc2cgJiYgY3N1bSAmJiAobXNzICE9IEdTT19CWV9GUkFHUykpICB7CisJCWlmICghKGZlYXR1cmVzICYgTkVUSUZfRl9HU09fUEFSVElBTCkpIHsKKwkJCXN0cnVjdCBza19idWZmICppdGVyOworCisJCQlpZiAoIWxpc3Rfc2tiIHx8CisJCQkgICAgIW5ldF9nc29fb2soZmVhdHVyZXMsIHNrYl9zaGluZm8oaGVhZF9za2IpLT5nc29fdHlwZSkpCisJCQkJZ290byBub3JtYWw7CisKKwkJCS8qIFNwbGl0IHRoZSBidWZmZXIgYXQgdGhlIGZyYWdfbGlzdCBwb2ludGVyLgorCQkJICogVGhpcyBpcyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGFsbAorCQkJICogYnVmZmVycyBpbiB0aGUgY2hhaW4gZXhjbHVkaW5nIHRoZSBsYXN0CisJCQkgKiBjb250YWluaW5nIHRoZSBzYW1lIGFtb3VudCBvZiBkYXRhLgorCQkJICovCisJCQlza2Jfd2Fsa19mcmFncyhoZWFkX3NrYiwgaXRlcikgeworCQkJCWlmIChza2JfaGVhZGxlbihpdGVyKSkKKwkJCQkJZ290byBub3JtYWw7CisKKwkJCQlsZW4gLT0gaXRlci0+bGVuOworCQkJfQorCQl9CisKKwkJLyogR1NPIHBhcnRpYWwgb25seSByZXF1aXJlcyB0aGF0IHdlIHRyaW0gb2ZmIGFueSBleGNlc3MgdGhhdAorCQkgKiBkb2Vzbid0IGZpdCBpbnRvIGFuIE1TUyBzaXplZCBibG9jaywgc28gdGFrZSBjYXJlIG9mIHRoYXQKKwkJICogbm93LgorCQkgKi8KIAkJcGFydGlhbF9zZWdzID0gbGVuIC8gbXNzOwogCQlpZiAocGFydGlhbF9zZWdzID4gMSkKIAkJCW1zcyAqPSBwYXJ0aWFsX3NlZ3M7CkBAIC0zMDkwLDYgKzMxMjksNyBAQAogCQkJcGFydGlhbF9zZWdzID0gMDsKIAl9CiAKK25vcm1hbDoKIAloZWFkcm9vbSA9IHNrYl9oZWFkcm9vbShoZWFkX3NrYik7CiAJcG9zID0gc2tiX2hlYWRsZW4oaGVhZF9za2IpOwogCkBAIC0zMjgxLDIxICszMzIxLDI5IEBACiAJICovCiAJc2Vncy0+cHJldiA9IHRhaWw7CiAKLQkvKiBVcGRhdGUgR1NPIGluZm8gb24gZmlyc3Qgc2tiIGluIHBhcnRpYWwgc2VxdWVuY2UuICovCiAJaWYgKHBhcnRpYWxfc2VncykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqaXRlcjsKIAkJaW50IHR5cGUgPSBza2Jfc2hpbmZvKGhlYWRfc2tiKS0+Z3NvX3R5cGU7CisJCXVuc2lnbmVkIHNob3J0IGdzb19zaXplID0gc2tiX3NoaW5mbyhoZWFkX3NrYiktPmdzb19zaXplOwogCiAJCS8qIFVwZGF0ZSB0eXBlIHRvIGFkZCBwYXJ0aWFsIGFuZCB0aGVuIHJlbW92ZSBkb2RneSBpZiBzZXQgKi8KLQkJdHlwZSB8PSBTS0JfR1NPX1BBUlRJQUw7CisJCXR5cGUgfD0gKGZlYXR1cmVzICYgTkVUSUZfRl9HU09fUEFSVElBTCkgLyBORVRJRl9GX0dTT19QQVJUSUFMICogU0tCX0dTT19QQVJUSUFMOwogCQl0eXBlICY9IH5TS0JfR1NPX0RPREdZOwogCiAJCS8qIFVwZGF0ZSBHU08gaW5mbyBhbmQgcHJlcGFyZSB0byBzdGFydCB1cGRhdGluZyBoZWFkZXJzIG9uCiAJCSAqIG91ciB3YXkgYmFjayBkb3duIHRoZSBzdGFjayBvZiBwcm90b2NvbHMuCiAJCSAqLwotCQlza2Jfc2hpbmZvKHNlZ3MpLT5nc29fc2l6ZSA9IHNrYl9zaGluZm8oaGVhZF9za2IpLT5nc29fc2l6ZTsKLQkJc2tiX3NoaW5mbyhzZWdzKS0+Z3NvX3NlZ3MgPSBwYXJ0aWFsX3NlZ3M7Ci0JCXNrYl9zaGluZm8oc2VncyktPmdzb190eXBlID0gdHlwZTsKLQkJU0tCX0dTT19DQihzZWdzKS0+ZGF0YV9vZmZzZXQgPSBza2JfaGVhZHJvb20oc2VncykgKyBkb2Zmc2V0OworCQlmb3IgKGl0ZXIgPSBzZWdzOyBpdGVyOyBpdGVyID0gaXRlci0+bmV4dCkgeworCQkJc2tiX3NoaW5mbyhpdGVyKS0+Z3NvX3NpemUgPSBnc29fc2l6ZTsKKwkJCXNrYl9zaGluZm8oaXRlciktPmdzb19zZWdzID0gcGFydGlhbF9zZWdzOworCQkJc2tiX3NoaW5mbyhpdGVyKS0+Z3NvX3R5cGUgPSB0eXBlOworCQkJU0tCX0dTT19DQihpdGVyKS0+ZGF0YV9vZmZzZXQgPSBza2JfaGVhZHJvb20oaXRlcikgKyBkb2Zmc2V0OworCQl9CisKKwkJaWYgKHRhaWwtPmxlbiAtIGRvZmZzZXQgPD0gZ3NvX3NpemUpCisJCQlza2Jfc2hpbmZvKHRhaWwpLT5nc29fc2l6ZSA9IDA7CisJCWVsc2UgaWYgKHRhaWwgIT0gc2VncykKKwkJCXNrYl9zaGluZm8odGFpbCktPmdzb19zZWdzID0gRElWX1JPVU5EX1VQKHRhaWwtPmxlbiAtIGRvZmZzZXQsIGdzb19zaXplKTsKIAl9CiAKIAkvKiBGb2xsb3dpbmcgcGVybWl0cyBjb3JyZWN0IGJhY2twcmVzc3VyZSwgZm9yIHByb3RvY29scwpAQCAtNDQ3NCwxNyArNDUyMiwyNCBAQAogfQogRVhQT1JUX1NZTUJPTChza2JfZW5zdXJlX3dyaXRhYmxlKTsKIAotLyogcmVtb3ZlIFZMQU4gaGVhZGVyIGZyb20gcGFja2V0IGFuZCB1cGRhdGUgY3N1bSBhY2NvcmRpbmdseS4gKi8KLXN0YXRpYyBpbnQgX19za2Jfdmxhbl9wb3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2ICp2bGFuX3RjaSkKKy8qIHJlbW92ZSBWTEFOIGhlYWRlciBmcm9tIHBhY2tldCBhbmQgdXBkYXRlIGNzdW0gYWNjb3JkaW5nbHkuCisgKiBleHBlY3RzIGEgbm9uIHNrYl92bGFuX3RhZ19wcmVzZW50IHNrYiB3aXRoIGEgdmxhbiB0YWcgcGF5bG9hZAorICovCitpbnQgX19za2Jfdmxhbl9wb3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2ICp2bGFuX3RjaSkKIHsKIAlzdHJ1Y3Qgdmxhbl9oZHIgKnZoZHI7Ci0JdW5zaWduZWQgaW50IG9mZnNldCA9IHNrYi0+ZGF0YSAtIHNrYl9tYWNfaGVhZGVyKHNrYik7CisJaW50IG9mZnNldCA9IHNrYi0+ZGF0YSAtIHNrYl9tYWNfaGVhZGVyKHNrYik7CiAJaW50IGVycjsKIAotCV9fc2tiX3B1c2goc2tiLCBvZmZzZXQpOworCWlmIChXQVJOX09OQ0Uob2Zmc2V0LAorCQkgICAgICAiX19za2Jfdmxhbl9wb3AgZ290IHNrYiB3aXRoIHNrYi0+ZGF0YSBub3QgYXQgbWFjIGhlYWRlciAob2Zmc2V0ICVkKVxuIiwKKwkJICAgICAgb2Zmc2V0KSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAllcnIgPSBza2JfZW5zdXJlX3dyaXRhYmxlKHNrYiwgVkxBTl9FVEhfSExFTik7CiAJaWYgKHVubGlrZWx5KGVycikpCi0JCWdvdG8gcHVsbDsKKwkJcmV0dXJuIGVycjsKIAogCXNrYl9wb3N0cHVsbF9yY3N1bShza2IsIHNrYi0+ZGF0YSArICgyICogRVRIX0FMRU4pLCBWTEFOX0hMRU4pOwogCkBAIC00NTAxLDEyICs0NTU2LDE0IEBACiAJCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBFVEhfSExFTik7CiAKIAlza2JfcmVzZXRfbWFjX2xlbihza2IpOwotcHVsbDoKLQlfX3NrYl9wdWxsKHNrYiwgb2Zmc2V0KTsKIAogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MKF9fc2tiX3ZsYW5fcG9wKTsKIAorLyogUG9wIGEgdmxhbiB0YWcgZWl0aGVyIGZyb20gaHdhY2NlbCBvciBmcm9tIHBheWxvYWQuCisgKiBFeHBlY3RzIHNrYi0+ZGF0YSBhdCBtYWMgaGVhZGVyLgorICovCiBpbnQgc2tiX3ZsYW5fcG9wKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJdTE2IHZsYW5fdGNpOwpAQCAtNDUxNiw5ICs0NTczLDcgQEAKIAlpZiAobGlrZWx5KHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpKSB7CiAJCXNrYi0+dmxhbl90Y2kgPSAwOwogCX0gZWxzZSB7Ci0JCWlmICh1bmxpa2VseSgoc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF84MDIxUSkgJiYKLQkJCSAgICAgIHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfODAyMUFEKSkgfHwKLQkJCSAgICAgc2tiLT5sZW4gPCBWTEFOX0VUSF9ITEVOKSkKKwkJaWYgKHVubGlrZWx5KCFldGhfdHlwZV92bGFuKHNrYi0+cHJvdG9jb2wpKSkKIAkJCXJldHVybiAwOwogCiAJCWVyciA9IF9fc2tiX3ZsYW5fcG9wKHNrYiwgJnZsYW5fdGNpKTsKQEAgLTQ1MjYsOSArNDU4MSw3IEBACiAJCQlyZXR1cm4gZXJyOwogCX0KIAkvKiBtb3ZlIG5leHQgdmxhbiB0YWcgdG8gaHcgYWNjZWwgdGFnICovCi0JaWYgKGxpa2VseSgoc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF84MDIxUSkgJiYKLQkJICAgIHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfODAyMUFEKSkgfHwKLQkJICAgc2tiLT5sZW4gPCBWTEFOX0VUSF9ITEVOKSkKKwlpZiAobGlrZWx5KCFldGhfdHlwZV92bGFuKHNrYi0+cHJvdG9jb2wpKSkKIAkJcmV0dXJuIDA7CiAKIAl2bGFuX3Byb3RvID0gc2tiLT5wcm90b2NvbDsKQEAgLTQ1NDEsMjkgKzQ1OTQsMzAgQEAKIH0KIEVYUE9SVF9TWU1CT0woc2tiX3ZsYW5fcG9wKTsKIAorLyogUHVzaCBhIHZsYW4gdGFnIGVpdGhlciBpbnRvIGh3YWNjZWwgb3IgaW50byBwYXlsb2FkIChpZiBod2FjY2VsIHRhZyBwcmVzZW50KS4KKyAqIEV4cGVjdHMgc2tiLT5kYXRhIGF0IG1hYyBoZWFkZXIuCisgKi8KIGludCBza2Jfdmxhbl9wdXNoKHN0cnVjdCBza19idWZmICpza2IsIF9fYmUxNiB2bGFuX3Byb3RvLCB1MTYgdmxhbl90Y2kpCiB7CiAJaWYgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpIHsKLQkJdW5zaWduZWQgaW50IG9mZnNldCA9IHNrYi0+ZGF0YSAtIHNrYl9tYWNfaGVhZGVyKHNrYik7CisJCWludCBvZmZzZXQgPSBza2ItPmRhdGEgLSBza2JfbWFjX2hlYWRlcihza2IpOwogCQlpbnQgZXJyOwogCi0JCS8qIF9fdmxhbl9pbnNlcnRfdGFnIGV4cGVjdCBza2ItPmRhdGEgcG9pbnRpbmcgdG8gbWFjIGhlYWRlci4KLQkJICogU28gY2hhbmdlIHNrYi0+ZGF0YSBiZWZvcmUgY2FsbGluZyBpdCBhbmQgY2hhbmdlIGJhY2sgdG8KLQkJICogb3JpZ2luYWwgcG9zaXRpb24gbGF0ZXIKLQkJICovCi0JCV9fc2tiX3B1c2goc2tiLCBvZmZzZXQpOworCQlpZiAoV0FSTl9PTkNFKG9mZnNldCwKKwkJCSAgICAgICJza2Jfdmxhbl9wdXNoIGdvdCBza2Igd2l0aCBza2ItPmRhdGEgbm90IGF0IG1hYyBoZWFkZXIgKG9mZnNldCAlZClcbiIsCisJCQkgICAgICBvZmZzZXQpKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCiAJCWVyciA9IF9fdmxhbl9pbnNlcnRfdGFnKHNrYiwgc2tiLT52bGFuX3Byb3RvLAogCQkJCQlza2Jfdmxhbl90YWdfZ2V0KHNrYikpOwotCQlpZiAoZXJyKSB7Ci0JCQlfX3NrYl9wdWxsKHNrYiwgb2Zmc2V0KTsKKwkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7Ci0JCX0KIAogCQlza2ItPnByb3RvY29sID0gc2tiLT52bGFuX3Byb3RvOwogCQlza2ItPm1hY19sZW4gKz0gVkxBTl9ITEVOOwogCiAJCXNrYl9wb3N0cHVzaF9yY3N1bShza2IsIHNrYi0+ZGF0YSArICgyICogRVRIX0FMRU4pLCBWTEFOX0hMRU4pOwotCQlfX3NrYl9wdWxsKHNrYiwgb2Zmc2V0KTsKIAl9CiAJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIHZsYW5fcHJvdG8sIHZsYW5fdGNpKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NvY2suYyBiL25ldC9jb3JlL3NvY2suYwppbmRleCAyNWRhYjhiLi4wMzhlNjYwIDEwMDY0NAotLS0gYS9uZXQvY29yZS9zb2NrLmMKKysrIGIvbmV0L2NvcmUvc29jay5jCkBAIC0xMzE1LDI0ICsxMzE1LDYgQEAKICNlbmRpZgogfQogCi12b2lkIHNrX3Byb3RfY2xlYXJfcG9ydGFkZHJfbnVsbHMoc3RydWN0IHNvY2sgKnNrLCBpbnQgc2l6ZSkKLXsKLQl1bnNpZ25lZCBsb25nIG51bGxzMSwgbnVsbHMyOwotCi0JbnVsbHMxID0gb2Zmc2V0b2Yoc3RydWN0IHNvY2ssIF9fc2tfY29tbW9uLnNrY19ub2RlLm5leHQpOwotCW51bGxzMiA9IG9mZnNldG9mKHN0cnVjdCBzb2NrLCBfX3NrX2NvbW1vbi5za2NfcG9ydGFkZHJfbm9kZS5uZXh0KTsKLQlpZiAobnVsbHMxID4gbnVsbHMyKQotCQlzd2FwKG51bGxzMSwgbnVsbHMyKTsKLQotCWlmIChudWxsczEgIT0gMCkKLQkJbWVtc2V0KChjaGFyICopc2ssIDAsIG51bGxzMSk7Ci0JbWVtc2V0KChjaGFyICopc2sgKyBudWxsczEgKyBzaXplb2Yodm9pZCAqKSwgMCwKLQkgICAgICAgbnVsbHMyIC0gbnVsbHMxIC0gc2l6ZW9mKHZvaWQgKikpOwotCW1lbXNldCgoY2hhciAqKXNrICsgbnVsbHMyICsgc2l6ZW9mKHZvaWQgKiksIDAsCi0JICAgICAgIHNpemUgLSBudWxsczIgLSBzaXplb2Yodm9pZCAqKSk7Ci19Ci1FWFBPUlRfU1lNQk9MKHNrX3Byb3RfY2xlYXJfcG9ydGFkZHJfbnVsbHMpOwotCiBzdGF0aWMgc3RydWN0IHNvY2sgKnNrX3Byb3RfYWxsb2Moc3RydWN0IHByb3RvICpwcm90LCBnZnBfdCBwcmlvcml0eSwKIAkJaW50IGZhbWlseSkKIHsKQEAgLTEzNDQsMTIgKzEzMjYsOCBAQAogCQlzayA9IGttZW1fY2FjaGVfYWxsb2Moc2xhYiwgcHJpb3JpdHkgJiB+X19HRlBfWkVSTyk7CiAJCWlmICghc2spCiAJCQlyZXR1cm4gc2s7Ci0JCWlmIChwcmlvcml0eSAmIF9fR0ZQX1pFUk8pIHsKLQkJCWlmIChwcm90LT5jbGVhcl9zaykKLQkJCQlwcm90LT5jbGVhcl9zayhzaywgcHJvdC0+b2JqX3NpemUpOwotCQkJZWxzZQotCQkJCXNrX3Byb3RfY2xlYXJfbnVsbHMoc2ssIHByb3QtPm9ial9zaXplKTsKLQkJfQorCQlpZiAocHJpb3JpdHkgJiBfX0dGUF9aRVJPKQorCQkJc2tfcHJvdF9jbGVhcl9udWxscyhzaywgcHJvdC0+b2JqX3NpemUpOwogCX0gZWxzZQogCQlzayA9IGttYWxsb2MocHJvdC0+b2JqX3NpemUsIHByaW9yaXR5KTsKIApAQCAtMTM2Miw3ICsxMzQwLDYgQEAKIAkJaWYgKCF0cnlfbW9kdWxlX2dldChwcm90LT5vd25lcikpCiAJCQlnb3RvIG91dF9mcmVlX3NlYzsKIAkJc2tfdHhfcXVldWVfY2xlYXIoc2spOwotCQljZ3JvdXBfc2tfYWxsb2MoJnNrLT5za19jZ3JwX2RhdGEpOwogCX0KIAogCXJldHVybiBzazsKQEAgLTE0MjIsNiArMTM5OSw3IEBACiAJCXNvY2tfbmV0X3NldChzaywgbmV0KTsKIAkJYXRvbWljX3NldCgmc2stPnNrX3dtZW1fYWxsb2MsIDEpOwogCisJCWNncm91cF9za19hbGxvYygmc2stPnNrX2NncnBfZGF0YSk7CiAJCXNvY2tfdXBkYXRlX2NsYXNzaWQoJnNrLT5za19jZ3JwX2RhdGEpOwogCQlzb2NrX3VwZGF0ZV9uZXRwcmlvaWR4KCZzay0+c2tfY2dycF9kYXRhKTsKIAl9CkBAIC0xNTY2LDYgKzE1NDQsOSBAQAogCQluZXdzay0+c2tfcHJpb3JpdHkgPSAwOwogCQluZXdzay0+c2tfaW5jb21pbmdfY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIAkJYXRvbWljNjRfc2V0KCZuZXdzay0+c2tfY29va2llLCAwKTsKKworCQljZ3JvdXBfc2tfYWxsb2MoJm5ld3NrLT5za19jZ3JwX2RhdGEpOworCiAJCS8qCiAJCSAqIEJlZm9yZSB1cGRhdGluZyBza19yZWZjbnQsIHdlIG11c3QgY29tbWl0IHByaW9yIGNoYW5nZXMgdG8gbWVtb3J5CiAJCSAqIChEb2N1bWVudGF0aW9uL1JDVS9yY3VsaXN0X251bGxzLnR4dCBmb3IgZGV0YWlscykKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3N0cmVhbS5jIGIvbmV0L2NvcmUvc3RyZWFtLmMKaW5kZXggMTU5NTE2YS4uMTA4NmM4YiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc3RyZWFtLmMKKysrIGIvbmV0L2NvcmUvc3RyZWFtLmMKQEAgLTQzLDcgKzQzLDYgQEAKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQogfQotRVhQT1JUX1NZTUJPTChza19zdHJlYW1fd3JpdGVfc3BhY2UpOwogCiAvKioKICAqIHNrX3N0cmVhbV93YWl0X2Nvbm5lY3QgLSBXYWl0IGZvciBhIHNvY2tldCB0byBnZXQgaW50byB0aGUgY29ubmVjdGVkIHN0YXRlCmRpZmYgLS1naXQgYS9uZXQvZHNhL0tjb25maWcgYi9uZXQvZHNhL0tjb25maWcKaW5kZXggZmY3NzM2Zi4uOTZlNDdjNSAxMDA2NDQKLS0tIGEvbmV0L2RzYS9LY29uZmlnCisrKyBiL25ldC9kc2EvS2NvbmZpZwpAQCAtMzgsNCArMzgsNyBAQAogY29uZmlnIE5FVF9EU0FfVEFHX1RSQUlMRVIKIAlib29sCiAKK2NvbmZpZyBORVRfRFNBX1RBR19RQ0EKKwlib29sCisKIGVuZGlmCmRpZmYgLS1naXQgYS9uZXQvZHNhL01ha2VmaWxlIGIvbmV0L2RzYS9NYWtlZmlsZQppbmRleCA4YWY0ZGVkLi5hMzM4MGVkIDEwMDY0NAotLS0gYS9uZXQvZHNhL01ha2VmaWxlCisrKyBiL25ldC9kc2EvTWFrZWZpbGUKQEAgLTcsMyArNyw0IEBACiBkc2FfY29yZS0kKENPTkZJR19ORVRfRFNBX1RBR19EU0EpICs9IHRhZ19kc2EubwogZHNhX2NvcmUtJChDT05GSUdfTkVUX0RTQV9UQUdfRURTQSkgKz0gdGFnX2Vkc2EubwogZHNhX2NvcmUtJChDT05GSUdfTkVUX0RTQV9UQUdfVFJBSUxFUikgKz0gdGFnX3RyYWlsZXIubworZHNhX2NvcmUtJChDT05GSUdfTkVUX0RTQV9UQUdfUUNBKSArPSB0YWdfcWNhLm8KZGlmZiAtLWdpdCBhL25ldC9kc2EvZHNhLmMgYi9uZXQvZHNhL2RzYS5jCmluZGV4IDdlNjhiYzYuLmE2OTAyYzEgMTAwNjQ0Ci0tLSBhL25ldC9kc2EvZHNhLmMKKysrIGIvbmV0L2RzYS9kc2EuYwpAQCAtNTQsNiArNTQsOSBAQAogI2lmZGVmIENPTkZJR19ORVRfRFNBX1RBR19CUkNNCiAJW0RTQV9UQUdfUFJPVE9fQlJDTV0gPSAmYnJjbV9uZXRkZXZfb3BzLAogI2VuZGlmCisjaWZkZWYgQ09ORklHX05FVF9EU0FfVEFHX1FDQQorCVtEU0FfVEFHX1BST1RPX1FDQV0gPSAmcWNhX25ldGRldl9vcHMsCisjZW5kaWYKIAlbRFNBX1RBR19QUk9UT19OT05FXSA9ICZub25lX29wcywKIH07CiAKQEAgLTYxLDI3ICs2NCwyNyBAQAogc3RhdGljIERFRklORV9NVVRFWChkc2Ffc3dpdGNoX2RyaXZlcnNfbXV0ZXgpOwogc3RhdGljIExJU1RfSEVBRChkc2Ffc3dpdGNoX2RyaXZlcnMpOwogCi12b2lkIHJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyICpkcnYpCit2b2lkIHJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoc3RydWN0IGRzYV9zd2l0Y2hfb3BzICpvcHMpCiB7CiAJbXV0ZXhfbG9jaygmZHNhX3N3aXRjaF9kcml2ZXJzX211dGV4KTsKLQlsaXN0X2FkZF90YWlsKCZkcnYtPmxpc3QsICZkc2Ffc3dpdGNoX2RyaXZlcnMpOworCWxpc3RfYWRkX3RhaWwoJm9wcy0+bGlzdCwgJmRzYV9zd2l0Y2hfZHJpdmVycyk7CiAJbXV0ZXhfdW5sb2NrKCZkc2Ffc3dpdGNoX2RyaXZlcnNfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfc3dpdGNoX2RyaXZlcik7CiAKLXZvaWQgdW5yZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKHN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciAqZHJ2KQordm9pZCB1bnJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoc3RydWN0IGRzYV9zd2l0Y2hfb3BzICpvcHMpCiB7CiAJbXV0ZXhfbG9jaygmZHNhX3N3aXRjaF9kcml2ZXJzX211dGV4KTsKLQlsaXN0X2RlbF9pbml0KCZkcnYtPmxpc3QpOworCWxpc3RfZGVsX2luaXQoJm9wcy0+bGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZkc2Ffc3dpdGNoX2RyaXZlcnNfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodW5yZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKTsKIAotc3RhdGljIHN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciAqCitzdGF0aWMgc3RydWN0IGRzYV9zd2l0Y2hfb3BzICoKIGRzYV9zd2l0Y2hfcHJvYmUoc3RydWN0IGRldmljZSAqcGFyZW50LCBzdHJ1Y3QgZGV2aWNlICpob3N0X2RldiwgaW50IHN3X2FkZHIsCiAJCSBjb25zdCBjaGFyICoqX25hbWUsIHZvaWQgKipwcml2KQogewotCXN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciAqcmV0OworCXN0cnVjdCBkc2Ffc3dpdGNoX29wcyAqcmV0OwogCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJY29uc3QgY2hhciAqbmFtZTsKIApAQCAtOTAsMTMgKzkzLDEzIEBACiAKIAltdXRleF9sb2NrKCZkc2Ffc3dpdGNoX2RyaXZlcnNfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRzYV9zd2l0Y2hfZHJpdmVycykgewotCQlzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKmRydjsKKwkJc3RydWN0IGRzYV9zd2l0Y2hfb3BzICpvcHM7CiAKLQkJZHJ2ID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIsIGxpc3QpOworCQlvcHMgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBkc2Ffc3dpdGNoX29wcywgbGlzdCk7CiAKLQkJbmFtZSA9IGRydi0+cHJvYmUocGFyZW50LCBob3N0X2Rldiwgc3dfYWRkciwgcHJpdik7CisJCW5hbWUgPSBvcHMtPnByb2JlKHBhcmVudCwgaG9zdF9kZXYsIHN3X2FkZHIsIHByaXYpOwogCQlpZiAobmFtZSAhPSBOVUxMKSB7Ci0JCQlyZXQgPSBkcnY7CisJCQlyZXQgPSBvcHM7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTExNyw3ICsxMjAsNyBAQAogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCB0ZW1wLCByZXQ7CiAKLQlyZXQgPSBkcy0+ZHJ2LT5nZXRfdGVtcChkcywgJnRlbXApOworCXJldCA9IGRzLT5vcHMtPmdldF90ZW1wKGRzLCAmdGVtcCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTEzMSw3ICsxMzQsNyBAQAogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCB0ZW1wLCByZXQ7CiAKLQlyZXQgPSBkcy0+ZHJ2LT5nZXRfdGVtcF9saW1pdChkcywgJnRlbXApOworCXJldCA9IGRzLT5vcHMtPmdldF90ZW1wX2xpbWl0KGRzLCAmdGVtcCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTE0OSw3ICsxNTIsNyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gZHMtPmRydi0+c2V0X3RlbXBfbGltaXQoZHMsIERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApKTsKKwlyZXQgPSBkcy0+b3BzLT5zZXRfdGVtcF9saW1pdChkcywgRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgMTAwMCkpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xNjQsNyArMTY3LDcgQEAKIAlib29sIGFsYXJtOwogCWludCByZXQ7CiAKLQlyZXQgPSBkcy0+ZHJ2LT5nZXRfdGVtcF9hbGFybShkcywgJmFsYXJtKTsKKwlyZXQgPSBkcy0+b3BzLT5nZXRfdGVtcF9hbGFybShkcywgJmFsYXJtKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTg0LDE1ICsxODcsMTUgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyICpkcnYgPSBkcy0+ZHJ2OworCXN0cnVjdCBkc2Ffc3dpdGNoX29wcyAqb3BzID0gZHMtPm9wczsKIAl1bW9kZV90IG1vZGUgPSBhdHRyLT5tb2RlOwogCiAJaWYgKGluZGV4ID09IDEpIHsKLQkJaWYgKCFkcnYtPmdldF90ZW1wX2xpbWl0KQorCQlpZiAoIW9wcy0+Z2V0X3RlbXBfbGltaXQpCiAJCQltb2RlID0gMDsKLQkJZWxzZSBpZiAoIWRydi0+c2V0X3RlbXBfbGltaXQpCisJCWVsc2UgaWYgKCFvcHMtPnNldF90ZW1wX2xpbWl0KQogCQkJbW9kZSAmPSB+U19JV1VTUjsKLQl9IGVsc2UgaWYgKGluZGV4ID09IDIgJiYgIWRydi0+Z2V0X3RlbXBfYWxhcm0pIHsKKwl9IGVsc2UgaWYgKGluZGV4ID09IDIgJiYgIW9wcy0+Z2V0X3RlbXBfYWxhcm0pIHsKIAkJbW9kZSA9IDA7CiAJfQogCXJldHVybiBtb2RlOwpAQCAtMjI4LDggKzIzMSw4IEBACiAKIAkJZ2VucGh5X2NvbmZpZ19pbml0KHBoeWRldik7CiAJCWdlbnBoeV9yZWFkX3N0YXR1cyhwaHlkZXYpOwotCQlpZiAoZHMtPmRydi0+YWRqdXN0X2xpbmspCi0JCQlkcy0+ZHJ2LT5hZGp1c3RfbGluayhkcywgcG9ydCwgcGh5ZGV2KTsKKwkJaWYgKGRzLT5vcHMtPmFkanVzdF9saW5rKQorCQkJZHMtPm9wcy0+YWRqdXN0X2xpbmsoZHMsIHBvcnQsIHBoeWRldik7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zMDMsNyArMzA2LDcgQEAKIAogc3RhdGljIGludCBkc2Ffc3dpdGNoX3NldHVwX29uZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKIHsKLQlzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKmRydiA9IGRzLT5kcnY7CisJc3RydWN0IGRzYV9zd2l0Y2hfb3BzICpvcHMgPSBkcy0+b3BzOwogCXN0cnVjdCBkc2Ffc3dpdGNoX3RyZWUgKmRzdCA9IGRzLT5kc3Q7CiAJc3RydWN0IGRzYV9jaGlwX2RhdGEgKmNkID0gZHMtPmNkOwogCWJvb2wgdmFsaWRfbmFtZV9mb3VuZCA9IGZhbHNlOwpAQCAtMzU0LDcgKzM1NywxMCBAQAogCSAqIHN3aXRjaC4KIAkgKi8KIAlpZiAoZHN0LT5jcHVfc3dpdGNoID09IGluZGV4KSB7Ci0JCWRzdC0+dGFnX29wcyA9IGRzYV9yZXNvbHZlX3RhZ19wcm90b2NvbChkcnYtPnRhZ19wcm90b2NvbCk7CisJCWVudW0gZHNhX3RhZ19wcm90b2NvbCB0YWdfcHJvdG9jb2w7CisKKwkJdGFnX3Byb3RvY29sID0gb3BzLT5nZXRfdGFnX3Byb3RvY29sKGRzKTsKKwkJZHN0LT50YWdfb3BzID0gZHNhX3Jlc29sdmVfdGFnX3Byb3RvY29sKHRhZ19wcm90b2NvbCk7CiAJCWlmIChJU19FUlIoZHN0LT50YWdfb3BzKSkgewogCQkJcmV0ID0gUFRSX0VSUihkc3QtPnRhZ19vcHMpOwogCQkJZ290byBvdXQ7CkBAIC0zNjgsMTUgKzM3NCwxNyBAQAogCS8qCiAJICogRG8gYmFzaWMgcmVnaXN0ZXIgc2V0dXAuCiAJICovCi0JcmV0ID0gZHJ2LT5zZXR1cChkcyk7CisJcmV0ID0gb3BzLT5zZXR1cChkcyk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gZHJ2LT5zZXRfYWRkcihkcywgZHN0LT5tYXN0ZXJfbmV0ZGV2LT5kZXZfYWRkcik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OworCWlmIChvcHMtPnNldF9hZGRyKSB7CisJCXJldCA9IG9wcy0+c2V0X2FkZHIoZHMsIGRzdC0+bWFzdGVyX25ldGRldi0+ZGV2X2FkZHIpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCX0KIAotCWlmICghZHMtPnNsYXZlX21paV9idXMgJiYgZHJ2LT5waHlfcmVhZCkgeworCWlmICghZHMtPnNsYXZlX21paV9idXMgJiYgb3BzLT5waHlfcmVhZCkgewogCQlkcy0+c2xhdmVfbWlpX2J1cyA9IGRldm1fbWRpb2J1c19hbGxvYyhwYXJlbnQpOwogCQlpZiAoIWRzLT5zbGF2ZV9taWlfYnVzKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwpAQCAtNDIzLDcgKzQzMSw3IEBACiAJICogcmVnaXN0ZXIgd2l0aCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1YnN5c3RlbS4KIAkgKiBUcmVhdCByZWdpc3RyYXRpb24gZXJyb3IgYXMgbm9uLWZhdGFsIGFuZCBpZ25vcmUgaXQuCiAJICovCi0JaWYgKGRydi0+Z2V0X3RlbXApIHsKKwlpZiAob3BzLT5nZXRfdGVtcCkgewogCQljb25zdCBjaGFyICpuZXRuYW1lID0gbmV0ZGV2X25hbWUoZHN0LT5tYXN0ZXJfbmV0ZGV2KTsKIAkJY2hhciBobmFtZVtJRk5BTVNJWiArIDFdOwogCQlpbnQgaSwgajsKQEAgLTQ1NCw3ICs0NjIsNyBAQAogCQkgc3RydWN0IGRldmljZSAqcGFyZW50LCBzdHJ1Y3QgZGV2aWNlICpob3N0X2RldikKIHsKIAlzdHJ1Y3QgZHNhX2NoaXBfZGF0YSAqY2QgPSBkc3QtPnBkLT5jaGlwICsgaW5kZXg7Ci0Jc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyICpkcnY7CisJc3RydWN0IGRzYV9zd2l0Y2hfb3BzICpvcHM7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzOwogCWludCByZXQ7CiAJY29uc3QgY2hhciAqbmFtZTsKQEAgLTQ2Myw4ICs0NzEsOCBAQAogCS8qCiAJICogUHJvYmUgZm9yIHN3aXRjaCBtb2RlbC4KIAkgKi8KLQlkcnYgPSBkc2Ffc3dpdGNoX3Byb2JlKHBhcmVudCwgaG9zdF9kZXYsIGNkLT5zd19hZGRyLCAmbmFtZSwgJnByaXYpOwotCWlmIChkcnYgPT0gTlVMTCkgeworCW9wcyA9IGRzYV9zd2l0Y2hfcHJvYmUocGFyZW50LCBob3N0X2RldiwgY2QtPnN3X2FkZHIsICZuYW1lLCAmcHJpdik7CisJaWYgKCFvcHMpIHsKIAkJbmV0ZGV2X2Vycihkc3QtPm1hc3Rlcl9uZXRkZXYsICJbJWRdOiBjb3VsZCBub3QgZGV0ZWN0IGF0dGFjaGVkIHN3aXRjaFxuIiwKIAkJCSAgIGluZGV4KTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CkBAIC00ODMsNyArNDkxLDcgQEAKIAlkcy0+ZHN0ID0gZHN0OwogCWRzLT5pbmRleCA9IGluZGV4OwogCWRzLT5jZCA9IGNkOwotCWRzLT5kcnYgPSBkcnY7CisJZHMtPm9wcyA9IG9wczsKIAlkcy0+cHJpdiA9IHByaXY7CiAJZHMtPmRldiA9IHBhcmVudDsKIApAQCAtNTM4LDEyICs1NDYsMTIgQEAKIAkJZHMtPmRzYV9wb3J0X21hc2sgfD0gfigxIDw8IHBvcnQpOwogCX0KIAotCWlmIChkcy0+c2xhdmVfbWlpX2J1cyAmJiBkcy0+ZHJ2LT5waHlfcmVhZCkKKwlpZiAoZHMtPnNsYXZlX21paV9idXMgJiYgZHMtPm9wcy0+cGh5X3JlYWQpCiAJCW1kaW9idXNfdW5yZWdpc3Rlcihkcy0+c2xhdmVfbWlpX2J1cyk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKLXN0YXRpYyBpbnQgZHNhX3N3aXRjaF9zdXNwZW5kKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK2ludCBkc2Ffc3dpdGNoX3N1c3BlbmQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewogCWludCBpLCByZXQgPSAwOwogCkBAIC01NTcsMTggKzU2NSwxOSBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAoZHMtPmRydi0+c3VzcGVuZCkKLQkJcmV0ID0gZHMtPmRydi0+c3VzcGVuZChkcyk7CisJaWYgKGRzLT5vcHMtPnN1c3BlbmQpCisJCXJldCA9IGRzLT5vcHMtPnN1c3BlbmQoZHMpOwogCiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGRzYV9zd2l0Y2hfc3VzcGVuZCk7CiAKLXN0YXRpYyBpbnQgZHNhX3N3aXRjaF9yZXN1bWUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoraW50IGRzYV9zd2l0Y2hfcmVzdW1lKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKIAlpbnQgaSwgcmV0ID0gMDsKIAotCWlmIChkcy0+ZHJ2LT5yZXN1bWUpCi0JCXJldCA9IGRzLT5kcnYtPnJlc3VtZShkcyk7CisJaWYgKGRzLT5vcHMtPnJlc3VtZSkKKwkJcmV0ID0gZHMtPm9wcy0+cmVzdW1lKGRzKTsKIAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC01ODUsNiArNTk0LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZHNhX3N3aXRjaF9yZXN1bWUpOwogI2VuZGlmCiAKIC8qIHBsYXRmb3JtIGRyaXZlciBpbml0IGFuZCBjbGVhbnVwICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTA4Niw3ICsxMDk2LDYgQEAKIHN0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhkc2FfcG1fb3BzLCBkc2Ffc3VzcGVuZCwgZHNhX3Jlc3VtZSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGRzYV9vZl9tYXRjaF90YWJsZVtdID0gewotCXsgLmNvbXBhdGlibGUgPSAiYnJjbSxiY203NDQ1LXN3aXRjaC12NC4wIiB9LAogCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCxkc2EiLCB9LAogCXt9CiB9OwpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9kc2EyLmMgYi9uZXQvZHNhL2RzYTIuYwppbmRleCBmMzBiYWQ5Li5mOGE3ZDlhIDEwMDY0NAotLS0gYS9uZXQvZHNhL2RzYTIuYworKysgYi9uZXQvZHNhL2RzYTIuYwpAQCAtMjk0LDI1ICsyOTQsMjMgQEAKIAlpbnQgZXJyOwogCiAJLyogSW5pdGlhbGl6ZSBkcy0+cGh5c19taWlfbWFzayBiZWZvcmUgcmVnaXN0ZXJpbmcgdGhlIHNsYXZlIE1ESU8gYnVzCi0JICogZHJpdmVyIGFuZCBiZWZvcmUgZHJ2LT5zZXR1cCgpIGhhcyBydW4sIHNpbmNlIHRoZSBzd2l0Y2ggZHJpdmVycyBhbmQKKwkgKiBkcml2ZXIgYW5kIGJlZm9yZSBvcHMtPnNldHVwKCkgaGFzIHJ1biwgc2luY2UgdGhlIHN3aXRjaCBkcml2ZXJzIGFuZAogCSAqIHRoZSBzbGF2ZSBNRElPIGJ1cyBkcml2ZXIgcmVseSBvbiB0aGVzZSB2YWx1ZXMgZm9yIHByb2JpbmcgUEhZCiAJICogZGV2aWNlcyBvciBub3QKIAkgKi8KIAlkcy0+cGh5c19taWlfbWFzayA9IGRzLT5lbmFibGVkX3BvcnRfbWFzazsKIAotCWVyciA9IGRzLT5kcnYtPnNldHVwKGRzKTsKKwllcnIgPSBkcy0+b3BzLT5zZXR1cChkcyk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQllcnIgPSBkcy0+ZHJ2LT5zZXRfYWRkcihkcywgZHN0LT5tYXN0ZXJfbmV0ZGV2LT5kZXZfYWRkcik7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7CisJaWYgKGRzLT5vcHMtPnNldF9hZGRyKSB7CisJCWVyciA9IGRzLT5vcHMtPnNldF9hZGRyKGRzLCBkc3QtPm1hc3Rlcl9uZXRkZXYtPmRldl9hZGRyKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KIAotCWVyciA9IGRzLT5kcnYtPnNldF9hZGRyKGRzLCBkc3QtPm1hc3Rlcl9uZXRkZXYtPmRldl9hZGRyKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWlmICghZHMtPnNsYXZlX21paV9idXMgJiYgZHMtPmRydi0+cGh5X3JlYWQpIHsKKwlpZiAoIWRzLT5zbGF2ZV9taWlfYnVzICYmIGRzLT5vcHMtPnBoeV9yZWFkKSB7CiAJCWRzLT5zbGF2ZV9taWlfYnVzID0gZGV2bV9tZGlvYnVzX2FsbG9jKGRzLT5kZXYpOwogCQlpZiAoIWRzLT5zbGF2ZV9taWlfYnVzKQogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC0zNzQsNyArMzcyLDcgQEAKIAkJZHNhX3VzZXJfcG9ydF91bmFwcGx5KHBvcnQsIGluZGV4LCBkcyk7CiAJfQogCi0JaWYgKGRzLT5zbGF2ZV9taWlfYnVzICYmIGRzLT5kcnYtPnBoeV9yZWFkKQorCWlmIChkcy0+c2xhdmVfbWlpX2J1cyAmJiBkcy0+b3BzLT5waHlfcmVhZCkKIAkJbWRpb2J1c191bnJlZ2lzdGVyKGRzLT5zbGF2ZV9taWlfYnVzKTsKIH0KIApAQCAtNDQzLDYgKzQ0MSw3IEBACiAJCQkgc3RydWN0IGRzYV9zd2l0Y2hfdHJlZSAqZHN0LAogCQkJIHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKKwllbnVtIGRzYV90YWdfcHJvdG9jb2wgdGFnX3Byb3RvY29sOwogCXN0cnVjdCBuZXRfZGV2aWNlICpldGhlcm5ldF9kZXY7CiAJc3RydWN0IGRldmljZV9ub2RlICpldGhlcm5ldDsKIApAQCAtNDY1LDcgKzQ2NCw4IEBACiAJCWRzdC0+Y3B1X3BvcnQgPSBpbmRleDsKIAl9CiAKLQlkc3QtPnRhZ19vcHMgPSBkc2FfcmVzb2x2ZV90YWdfcHJvdG9jb2woZHMtPmRydi0+dGFnX3Byb3RvY29sKTsKKwl0YWdfcHJvdG9jb2wgPSBkcy0+b3BzLT5nZXRfdGFnX3Byb3RvY29sKGRzKTsKKwlkc3QtPnRhZ19vcHMgPSBkc2FfcmVzb2x2ZV90YWdfcHJvdG9jb2wodGFnX3Byb3RvY29sKTsKIAlpZiAoSVNfRVJSKGRzdC0+dGFnX29wcykpIHsKIAkJZGV2X3dhcm4oZHMtPmRldiwgIk5vIHRhZ2dlciBmb3IgdGhpcyBzd2l0Y2hcbiIpOwogCQlyZXR1cm4gUFRSX0VSUihkc3QtPnRhZ19vcHMpOwpAQCAtNTQxLDcgKzU0MSw3IEBACiAKIAkJZHMtPnBvcnRzW3JlZ10uZG4gPSBwb3J0OwogCi0JCS8qIEluaXRpYWxpemUgZW5hYmxlZF9wb3J0X21hc2sgbm93IGZvciBkcnYtPnNldHVwKCkKKwkJLyogSW5pdGlhbGl6ZSBlbmFibGVkX3BvcnRfbWFzayBub3cgZm9yIG9wcy0+c2V0dXAoKQogCQkgKiB0byBoYXZlIGFjY2VzcyB0byBhIGNvcnJlY3QgdmFsdWUsIGp1c3QgbGlrZSB3aGF0CiAJCSAqIG5ldC9kc2EvZHNhLmM6OmRzYV9zd2l0Y2hfc2V0dXBfb25lIGRvZXMuCiAJCSAqLwpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9kc2FfcHJpdi5oIGIvbmV0L2RzYS9kc2FfcHJpdi5oCmluZGV4IDAwMDc3YTkuLjZjZmQ3MzggMTAwNjQ0Ci0tLSBhL25ldC9kc2EvZHNhX3ByaXYuaAorKysgYi9uZXQvZHNhL2RzYV9wcml2LmgKQEAgLTgxLDUgKzgxLDcgQEAKIC8qIHRhZ19icmNtLmMgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgZHNhX2RldmljZV9vcHMgYnJjbV9uZXRkZXZfb3BzOwogCisvKiB0YWdfcWNhLmMgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgZHNhX2RldmljZV9vcHMgcWNhX25ldGRldl9vcHM7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9zbGF2ZS5jIGIvbmV0L2RzYS9zbGF2ZS5jCmluZGV4IGZjOTE5NjcuLjZiMTI4MmMgMTAwNjQ0Ci0tLSBhL25ldC9kc2Evc2xhdmUuYworKysgYi9uZXQvZHNhL3NsYXZlLmMKQEAgLTI4LDcgKzI4LDcgQEAKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBidXMtPnByaXY7CiAKIAlpZiAoZHMtPnBoeXNfbWlpX21hc2sgJiAoMSA8PCBhZGRyKSkKLQkJcmV0dXJuIGRzLT5kcnYtPnBoeV9yZWFkKGRzLCBhZGRyLCByZWcpOworCQlyZXR1cm4gZHMtPm9wcy0+cGh5X3JlYWQoZHMsIGFkZHIsIHJlZyk7CiAKIAlyZXR1cm4gMHhmZmZmOwogfQpAQCAtMzgsNyArMzgsNyBAQAogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGJ1cy0+cHJpdjsKIAogCWlmIChkcy0+cGh5c19taWlfbWFzayAmICgxIDw8IGFkZHIpKQotCQlyZXR1cm4gZHMtPmRydi0+cGh5X3dyaXRlKGRzLCBhZGRyLCByZWcsIHZhbCk7CisJCXJldHVybiBkcy0+b3BzLT5waHlfd3JpdGUoZHMsIGFkZHIsIHJlZywgdmFsKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjksNiArNjksMzAgQEAKIAlyZXR1cm4gISFwLT5icmlkZ2VfZGV2OwogfQogCitzdGF0aWMgdm9pZCBkc2FfcG9ydF9zZXRfc3RwX3N0YXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIHU4IHN0YXRlKQoreworCXN0cnVjdCBkc2FfcG9ydCAqZHAgPSAmZHMtPnBvcnRzW3BvcnRdOworCisJaWYgKGRzLT5vcHMtPnBvcnRfc3RwX3N0YXRlX3NldCkKKwkJZHMtPm9wcy0+cG9ydF9zdHBfc3RhdGVfc2V0KGRzLCBwb3J0LCBzdGF0ZSk7CisKKwlpZiAoZHMtPm9wcy0+cG9ydF9mYXN0X2FnZSkgeworCQkvKiBGYXN0IGFnZSBGREIgZW50cmllcyBvciBmbHVzaCBhcHByb3ByaWF0ZSBmb3J3YXJkaW5nIGRhdGFiYXNlCisJCSAqIGZvciB0aGUgZ2l2ZW4gcG9ydCwgaWYgd2UgYXJlIG1vdmluZyBpdCBmcm9tIExlYXJuaW5nIG9yCisJCSAqIEZvcndhcmRpbmcgc3RhdGUsIHRvIERpc2FibGVkIG9yIEJsb2NraW5nIG9yIExpc3RlbmluZyBzdGF0ZS4KKwkJICovCisKKwkJaWYgKChkcC0+c3RwX3N0YXRlID09IEJSX1NUQVRFX0xFQVJOSU5HIHx8CisJCSAgICAgZHAtPnN0cF9zdGF0ZSA9PSBCUl9TVEFURV9GT1JXQVJESU5HKSAmJgorCQkgICAgKHN0YXRlID09IEJSX1NUQVRFX0RJU0FCTEVEIHx8CisJCSAgICAgc3RhdGUgPT0gQlJfU1RBVEVfQkxPQ0tJTkcgfHwKKwkJICAgICBzdGF0ZSA9PSBCUl9TVEFURV9MSVNURU5JTkcpKQorCQkJZHMtPm9wcy0+cG9ydF9mYXN0X2FnZShkcywgcG9ydCk7CisJfQorCisJZHAtPnN0cF9zdGF0ZSA9IHN0YXRlOworfQorCiBzdGF0aWMgaW50IGRzYV9zbGF2ZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTk4LDE0ICsxMjIsMTMgQEAKIAkJCWdvdG8gY2xlYXJfYWxsbXVsdGk7CiAJfQogCi0JaWYgKGRzLT5kcnYtPnBvcnRfZW5hYmxlKSB7Ci0JCWVyciA9IGRzLT5kcnYtPnBvcnRfZW5hYmxlKGRzLCBwLT5wb3J0LCBwLT5waHkpOworCWlmIChkcy0+b3BzLT5wb3J0X2VuYWJsZSkgeworCQllcnIgPSBkcy0+b3BzLT5wb3J0X2VuYWJsZShkcywgcC0+cG9ydCwgcC0+cGh5KTsKIAkJaWYgKGVycikKIAkJCWdvdG8gY2xlYXJfcHJvbWlzYzsKIAl9CiAKLQlpZiAoZHMtPmRydi0+cG9ydF9zdHBfc3RhdGVfc2V0KQotCQlkcy0+ZHJ2LT5wb3J0X3N0cF9zdGF0ZV9zZXQoZHMsIHAtPnBvcnQsIHN0cF9zdGF0ZSk7CisJZHNhX3BvcnRfc2V0X3N0cF9zdGF0ZShkcywgcC0+cG9ydCwgc3RwX3N0YXRlKTsKIAogCWlmIChwLT5waHkpCiAJCXBoeV9zdGFydChwLT5waHkpOwpAQCAtMTQ0LDExICsxNjcsMTAgQEAKIAlpZiAoIWV0aGVyX2FkZHJfZXF1YWwoZGV2LT5kZXZfYWRkciwgbWFzdGVyLT5kZXZfYWRkcikpCiAJCWRldl91Y19kZWwobWFzdGVyLCBkZXYtPmRldl9hZGRyKTsKIAotCWlmIChkcy0+ZHJ2LT5wb3J0X2Rpc2FibGUpCi0JCWRzLT5kcnYtPnBvcnRfZGlzYWJsZShkcywgcC0+cG9ydCwgcC0+cGh5KTsKKwlpZiAoZHMtPm9wcy0+cG9ydF9kaXNhYmxlKQorCQlkcy0+b3BzLT5wb3J0X2Rpc2FibGUoZHMsIHAtPnBvcnQsIHAtPnBoeSk7CiAKLQlpZiAoZHMtPmRydi0+cG9ydF9zdHBfc3RhdGVfc2V0KQotCQlkcy0+ZHJ2LT5wb3J0X3N0cF9zdGF0ZV9zZXQoZHMsIHAtPnBvcnQsIEJSX1NUQVRFX0RJU0FCTEVEKTsKKwlkc2FfcG9ydF9zZXRfc3RwX3N0YXRlKGRzLCBwLT5wb3J0LCBCUl9TVEFURV9ESVNBQkxFRCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwOSwxMyArMjMxLDEzIEBACiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OwogCiAJaWYgKHN3aXRjaGRldl90cmFuc19waF9wcmVwYXJlKHRyYW5zKSkgewotCQlpZiAoIWRzLT5kcnYtPnBvcnRfdmxhbl9wcmVwYXJlIHx8ICFkcy0+ZHJ2LT5wb3J0X3ZsYW5fYWRkKQorCQlpZiAoIWRzLT5vcHMtPnBvcnRfdmxhbl9wcmVwYXJlIHx8ICFkcy0+b3BzLT5wb3J0X3ZsYW5fYWRkKQogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JCXJldHVybiBkcy0+ZHJ2LT5wb3J0X3ZsYW5fcHJlcGFyZShkcywgcC0+cG9ydCwgdmxhbiwgdHJhbnMpOworCQlyZXR1cm4gZHMtPm9wcy0+cG9ydF92bGFuX3ByZXBhcmUoZHMsIHAtPnBvcnQsIHZsYW4sIHRyYW5zKTsKIAl9CiAKLQlkcy0+ZHJ2LT5wb3J0X3ZsYW5fYWRkKGRzLCBwLT5wb3J0LCB2bGFuLCB0cmFucyk7CisJZHMtPm9wcy0+cG9ydF92bGFuX2FkZChkcywgcC0+cG9ydCwgdmxhbiwgdHJhbnMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMjYsMTAgKzI0OCwxMCBAQAogCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OwogCi0JaWYgKCFkcy0+ZHJ2LT5wb3J0X3ZsYW5fZGVsKQorCWlmICghZHMtPm9wcy0+cG9ydF92bGFuX2RlbCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JcmV0dXJuIGRzLT5kcnYtPnBvcnRfdmxhbl9kZWwoZHMsIHAtPnBvcnQsIHZsYW4pOworCXJldHVybiBkcy0+b3BzLT5wb3J0X3ZsYW5fZGVsKGRzLCBwLT5wb3J0LCB2bGFuKTsKIH0KIAogc3RhdGljIGludCBkc2Ffc2xhdmVfcG9ydF92bGFuX2R1bXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTIzOSw4ICsyNjEsOCBAQAogCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OwogCi0JaWYgKGRzLT5kcnYtPnBvcnRfdmxhbl9kdW1wKQotCQlyZXR1cm4gZHMtPmRydi0+cG9ydF92bGFuX2R1bXAoZHMsIHAtPnBvcnQsIHZsYW4sIGNiKTsKKwlpZiAoZHMtPm9wcy0+cG9ydF92bGFuX2R1bXApCisJCXJldHVybiBkcy0+b3BzLT5wb3J0X3ZsYW5fZHVtcChkcywgcC0+cG9ydCwgdmxhbiwgY2IpOwogCiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQpAQCAtMjUzLDEzICsyNzUsMTMgQEAKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CiAKIAlpZiAoc3dpdGNoZGV2X3RyYW5zX3BoX3ByZXBhcmUodHJhbnMpKSB7Ci0JCWlmICghZHMtPmRydi0+cG9ydF9mZGJfcHJlcGFyZSB8fCAhZHMtPmRydi0+cG9ydF9mZGJfYWRkKQorCQlpZiAoIWRzLT5vcHMtPnBvcnRfZmRiX3ByZXBhcmUgfHwgIWRzLT5vcHMtPnBvcnRfZmRiX2FkZCkKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCQlyZXR1cm4gZHMtPmRydi0+cG9ydF9mZGJfcHJlcGFyZShkcywgcC0+cG9ydCwgZmRiLCB0cmFucyk7CisJCXJldHVybiBkcy0+b3BzLT5wb3J0X2ZkYl9wcmVwYXJlKGRzLCBwLT5wb3J0LCBmZGIsIHRyYW5zKTsKIAl9CiAKLQlkcy0+ZHJ2LT5wb3J0X2ZkYl9hZGQoZHMsIHAtPnBvcnQsIGZkYiwgdHJhbnMpOworCWRzLT5vcHMtPnBvcnRfZmRiX2FkZChkcywgcC0+cG9ydCwgZmRiLCB0cmFucyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI3MSw4ICsyOTMsOCBAQAogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKIAlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CiAKLQlpZiAoZHMtPmRydi0+cG9ydF9mZGJfZGVsKQotCQlyZXQgPSBkcy0+ZHJ2LT5wb3J0X2ZkYl9kZWwoZHMsIHAtPnBvcnQsIGZkYik7CisJaWYgKGRzLT5vcHMtPnBvcnRfZmRiX2RlbCkKKwkJcmV0ID0gZHMtPm9wcy0+cG9ydF9mZGJfZGVsKGRzLCBwLT5wb3J0LCBmZGIpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI4NCw4ICszMDYsNTIgQEAKIAlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKIAotCWlmIChkcy0+ZHJ2LT5wb3J0X2ZkYl9kdW1wKQotCQlyZXR1cm4gZHMtPmRydi0+cG9ydF9mZGJfZHVtcChkcywgcC0+cG9ydCwgZmRiLCBjYik7CisJaWYgKGRzLT5vcHMtPnBvcnRfZmRiX2R1bXApCisJCXJldHVybiBkcy0+b3BzLT5wb3J0X2ZkYl9kdW1wKGRzLCBwLT5wb3J0LCBmZGIsIGNiKTsKKworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGludCBkc2Ffc2xhdmVfcG9ydF9tZGJfYWRkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X21kYiAqbWRiLAorCQkJCSAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CisKKwlpZiAoc3dpdGNoZGV2X3RyYW5zX3BoX3ByZXBhcmUodHJhbnMpKSB7CisJCWlmICghZHMtPm9wcy0+cG9ydF9tZGJfcHJlcGFyZSB8fCAhZHMtPm9wcy0+cG9ydF9tZGJfYWRkKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJCXJldHVybiBkcy0+b3BzLT5wb3J0X21kYl9wcmVwYXJlKGRzLCBwLT5wb3J0LCBtZGIsIHRyYW5zKTsKKwl9CisKKwlkcy0+b3BzLT5wb3J0X21kYl9hZGQoZHMsIHAtPnBvcnQsIG1kYiwgdHJhbnMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNhX3NsYXZlX3BvcnRfbWRiX2RlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9tZGIgKm1kYikKK3sKKwlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKKworCWlmIChkcy0+b3BzLT5wb3J0X21kYl9kZWwpCisJCXJldHVybiBkcy0+b3BzLT5wb3J0X21kYl9kZWwoZHMsIHAtPnBvcnQsIG1kYik7CisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbnQgZHNhX3NsYXZlX3BvcnRfbWRiX2R1bXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X21kYiAqbWRiLAorCQkJCSAgIHN3aXRjaGRldl9vYmpfZHVtcF9jYl90ICpjYikKK3sKKwlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKKworCWlmIChkcy0+b3BzLT5wb3J0X21kYl9kdW1wKQorCQlyZXR1cm4gZHMtPm9wcy0+cG9ydF9tZGJfZHVtcChkcywgcC0+cG9ydCwgbWRiLCBjYik7CiAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CkBAIC0zMDgsOSArMzc0LDkgQEAKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CiAKIAlpZiAoc3dpdGNoZGV2X3RyYW5zX3BoX3ByZXBhcmUodHJhbnMpKQotCQlyZXR1cm4gZHMtPmRydi0+cG9ydF9zdHBfc3RhdGVfc2V0ID8gMCA6IC1FT1BOT1RTVVBQOworCQlyZXR1cm4gZHMtPm9wcy0+cG9ydF9zdHBfc3RhdGVfc2V0ID8gMCA6IC1FT1BOT1RTVVBQOwogCi0JZHMtPmRydi0+cG9ydF9zdHBfc3RhdGVfc2V0KGRzLCBwLT5wb3J0LCBhdHRyLT51LnN0cF9zdGF0ZSk7CisJZHNhX3BvcnRfc2V0X3N0cF9zdGF0ZShkcywgcC0+cG9ydCwgYXR0ci0+dS5zdHBfc3RhdGUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMjYsOCArMzkyLDggQEAKIAlpZiAoc3dpdGNoZGV2X3RyYW5zX3BoX3ByZXBhcmUodHJhbnMpKQogCQlyZXR1cm4gMDsKIAotCWlmIChkcy0+ZHJ2LT5wb3J0X3ZsYW5fZmlsdGVyaW5nKQotCQlyZXR1cm4gZHMtPmRydi0+cG9ydF92bGFuX2ZpbHRlcmluZyhkcywgcC0+cG9ydCwKKwlpZiAoZHMtPm9wcy0+cG9ydF92bGFuX2ZpbHRlcmluZykKKwkJcmV0dXJuIGRzLT5vcHMtPnBvcnRfdmxhbl9maWx0ZXJpbmcoZHMsIHAtPnBvcnQsCiAJCQkJCQkgICAgYXR0ci0+dS52bGFuX2ZpbHRlcmluZyk7CiAKIAlyZXR1cm4gMDsKQEAgLTM2NSw4ICs0MzEsOCBAQAogCWRzLT5wb3J0c1twLT5wb3J0XS5hZ2VpbmdfdGltZSA9IGFnZWluZ190aW1lOwogCWFnZWluZ190aW1lID0gZHNhX2Zhc3Rlc3RfYWdlaW5nX3RpbWUoZHMsIGFnZWluZ190aW1lKTsKIAotCWlmIChkcy0+ZHJ2LT5zZXRfYWdlaW5nX3RpbWUpCi0JCXJldHVybiBkcy0+ZHJ2LT5zZXRfYWdlaW5nX3RpbWUoZHMsIGFnZWluZ190aW1lKTsKKwlpZiAoZHMtPm9wcy0+c2V0X2FnZWluZ190aW1lKQorCQlyZXR1cm4gZHMtPm9wcy0+c2V0X2FnZWluZ190aW1lKGRzLCBhZ2VpbmdfdGltZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQxMiw2ICs0NzgsMTAgQEAKIAkJCQkJICAgICBTV0lUQ0hERVZfT0JKX1BPUlRfRkRCKG9iaiksCiAJCQkJCSAgICAgdHJhbnMpOwogCQlicmVhazsKKwljYXNlIFNXSVRDSERFVl9PQkpfSURfUE9SVF9NREI6CisJCWVyciA9IGRzYV9zbGF2ZV9wb3J0X21kYl9hZGQoZGV2LCBTV0lUQ0hERVZfT0JKX1BPUlRfTURCKG9iaiksCisJCQkJCSAgICAgdHJhbnMpOworCQlicmVhazsKIAljYXNlIFNXSVRDSERFVl9PQkpfSURfUE9SVF9WTEFOOgogCQllcnIgPSBkc2Ffc2xhdmVfcG9ydF92bGFuX2FkZChkZXYsCiAJCQkJCSAgICAgIFNXSVRDSERFVl9PQkpfUE9SVF9WTEFOKG9iaiksCkBAIC00MzUsNiArNTA1LDkgQEAKIAkJZXJyID0gZHNhX3NsYXZlX3BvcnRfZmRiX2RlbChkZXYsCiAJCQkJCSAgICAgU1dJVENIREVWX09CSl9QT1JUX0ZEQihvYmopKTsKIAkJYnJlYWs7CisJY2FzZSBTV0lUQ0hERVZfT0JKX0lEX1BPUlRfTURCOgorCQllcnIgPSBkc2Ffc2xhdmVfcG9ydF9tZGJfZGVsKGRldiwgU1dJVENIREVWX09CSl9QT1JUX01EQihvYmopKTsKKwkJYnJlYWs7CiAJY2FzZSBTV0lUQ0hERVZfT0JKX0lEX1BPUlRfVkxBTjoKIAkJZXJyID0gZHNhX3NsYXZlX3BvcnRfdmxhbl9kZWwoZGV2LAogCQkJCQkgICAgICBTV0lUQ0hERVZfT0JKX1BPUlRfVkxBTihvYmopKTsKQEAgLTQ1OSw2ICs1MzIsMTAgQEAKIAkJCQkJICAgICAgU1dJVENIREVWX09CSl9QT1JUX0ZEQihvYmopLAogCQkJCQkgICAgICBjYik7CiAJCWJyZWFrOworCWNhc2UgU1dJVENIREVWX09CSl9JRF9QT1JUX01EQjoKKwkJZXJyID0gZHNhX3NsYXZlX3BvcnRfbWRiX2R1bXAoZGV2LCBTV0lUQ0hERVZfT0JKX1BPUlRfTURCKG9iaiksCisJCQkJCSAgICAgIGNiKTsKKwkJYnJlYWs7CiAJY2FzZSBTV0lUQ0hERVZfT0JKX0lEX1BPUlRfVkxBTjoKIAkJZXJyID0gZHNhX3NsYXZlX3BvcnRfdmxhbl9kdW1wKGRldiwKIAkJCQkJICAgICAgIFNXSVRDSERFVl9PQkpfUE9SVF9WTEFOKG9iaiksCkBAIC00ODEsOCArNTU4LDggQEAKIAogCXAtPmJyaWRnZV9kZXYgPSBicjsKIAotCWlmIChkcy0+ZHJ2LT5wb3J0X2JyaWRnZV9qb2luKQotCQlyZXQgPSBkcy0+ZHJ2LT5wb3J0X2JyaWRnZV9qb2luKGRzLCBwLT5wb3J0LCBicik7CisJaWYgKGRzLT5vcHMtPnBvcnRfYnJpZGdlX2pvaW4pCisJCXJldCA9IGRzLT5vcHMtPnBvcnRfYnJpZGdlX2pvaW4oZHMsIHAtPnBvcnQsIGJyKTsKIAogCXJldHVybiByZXQgPT0gLUVPUE5PVFNVUFAgPyAwIDogcmV0OwogfQpAQCAtNDkzLDE2ICs1NzAsMTUgQEAKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CiAKIAotCWlmIChkcy0+ZHJ2LT5wb3J0X2JyaWRnZV9sZWF2ZSkKLQkJZHMtPmRydi0+cG9ydF9icmlkZ2VfbGVhdmUoZHMsIHAtPnBvcnQpOworCWlmIChkcy0+b3BzLT5wb3J0X2JyaWRnZV9sZWF2ZSkKKwkJZHMtPm9wcy0+cG9ydF9icmlkZ2VfbGVhdmUoZHMsIHAtPnBvcnQpOwogCiAJcC0+YnJpZGdlX2RldiA9IE5VTEw7CiAKIAkvKiBQb3J0IGxlZnQgdGhlIGJyaWRnZSwgcHV0IGluIEJSX1NUQVRFX0RJU0FCTEVEIGJ5IHRoZSBicmlkZ2UgbGF5ZXIsCiAJICogc28gYWxsb3cgaXQgdG8gYmUgaW4gQlJfU1RBVEVfRk9SV0FSRElORyB0byBiZSBrZXB0IGZ1bmN0aW9uYWwKIAkgKi8KLQlpZiAoZHMtPmRydi0+cG9ydF9zdHBfc3RhdGVfc2V0KQotCQlkcy0+ZHJ2LT5wb3J0X3N0cF9zdGF0ZV9zZXQoZHMsIHAtPnBvcnQsIEJSX1NUQVRFX0ZPUldBUkRJTkcpOworCWRzYV9wb3J0X3NldF9zdHBfc3RhdGUoZHMsIHAtPnBvcnQsIEJSX1NUQVRFX0ZPUldBUkRJTkcpOwogfQogCiBzdGF0aWMgaW50IGRzYV9zbGF2ZV9wb3J0X2F0dHJfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC02MDUsOCArNjgxLDggQEAKIAlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKIAotCWlmIChkcy0+ZHJ2LT5nZXRfcmVnc19sZW4pCi0JCXJldHVybiBkcy0+ZHJ2LT5nZXRfcmVnc19sZW4oZHMsIHAtPnBvcnQpOworCWlmIChkcy0+b3BzLT5nZXRfcmVnc19sZW4pCisJCXJldHVybiBkcy0+b3BzLT5nZXRfcmVnc19sZW4oZHMsIHAtPnBvcnQpOwogCiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQpAQCAtNjE3LDggKzY5Myw4IEBACiAJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CiAKLQlpZiAoZHMtPmRydi0+Z2V0X3JlZ3MpCi0JCWRzLT5kcnYtPmdldF9yZWdzKGRzLCBwLT5wb3J0LCByZWdzLCBfcCk7CisJaWYgKGRzLT5vcHMtPmdldF9yZWdzKQorCQlkcy0+b3BzLT5nZXRfcmVncyhkcywgcC0+cG9ydCwgcmVncywgX3ApOwogfQogCiBzdGF0aWMgaW50IGRzYV9zbGF2ZV9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC02NTEsOCArNzI3LDggQEAKIAlpZiAoZHMtPmNkICYmIGRzLT5jZC0+ZWVwcm9tX2xlbikKIAkJcmV0dXJuIGRzLT5jZC0+ZWVwcm9tX2xlbjsKIAotCWlmIChkcy0+ZHJ2LT5nZXRfZWVwcm9tX2xlbikKLQkJcmV0dXJuIGRzLT5kcnYtPmdldF9lZXByb21fbGVuKGRzKTsKKwlpZiAoZHMtPm9wcy0+Z2V0X2VlcHJvbV9sZW4pCisJCXJldHVybiBkcy0+b3BzLT5nZXRfZWVwcm9tX2xlbihkcyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY2Myw4ICs3MzksOCBAQAogCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OwogCi0JaWYgKGRzLT5kcnYtPmdldF9lZXByb20pCi0JCXJldHVybiBkcy0+ZHJ2LT5nZXRfZWVwcm9tKGRzLCBlZXByb20sIGRhdGEpOworCWlmIChkcy0+b3BzLT5nZXRfZWVwcm9tKQorCQlyZXR1cm4gZHMtPm9wcy0+Z2V0X2VlcHJvbShkcywgZWVwcm9tLCBkYXRhKTsKIAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KQEAgLTY3NSw4ICs3NTEsOCBAQAogCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OwogCi0JaWYgKGRzLT5kcnYtPnNldF9lZXByb20pCi0JCXJldHVybiBkcy0+ZHJ2LT5zZXRfZWVwcm9tKGRzLCBlZXByb20sIGRhdGEpOworCWlmIChkcy0+b3BzLT5zZXRfZWVwcm9tKQorCQlyZXR1cm4gZHMtPm9wcy0+c2V0X2VlcHJvbShkcywgZWVwcm9tLCBkYXRhKTsKIAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KQEAgLTY5NCw4ICs3NzAsOCBAQAogCQlzdHJuY3B5KGRhdGEgKyBsZW4sICJ0eF9ieXRlcyIsIGxlbik7CiAJCXN0cm5jcHkoZGF0YSArIDIgKiBsZW4sICJyeF9wYWNrZXRzIiwgbGVuKTsKIAkJc3RybmNweShkYXRhICsgMyAqIGxlbiwgInJ4X2J5dGVzIiwgbGVuKTsKLQkJaWYgKGRzLT5kcnYtPmdldF9zdHJpbmdzICE9IE5VTEwpCi0JCQlkcy0+ZHJ2LT5nZXRfc3RyaW5ncyhkcywgcC0+cG9ydCwgZGF0YSArIDQgKiBsZW4pOworCQlpZiAoZHMtPm9wcy0+Z2V0X3N0cmluZ3MpCisJCQlkcy0+b3BzLT5nZXRfc3RyaW5ncyhkcywgcC0+cG9ydCwgZGF0YSArIDQgKiBsZW4pOwogCX0KIH0KIApAQCAtNzE0LDggKzc5MCw4IEBACiAJCWRzdC0+bWFzdGVyX2V0aHRvb2xfb3BzLmdldF9ldGh0b29sX3N0YXRzKGRldiwgc3RhdHMsIGRhdGEpOwogCX0KIAotCWlmIChkcy0+ZHJ2LT5nZXRfZXRodG9vbF9zdGF0cykKLQkJZHMtPmRydi0+Z2V0X2V0aHRvb2xfc3RhdHMoZHMsIGNwdV9wb3J0LCBkYXRhICsgY291bnQpOworCWlmIChkcy0+b3BzLT5nZXRfZXRodG9vbF9zdGF0cykKKwkJZHMtPm9wcy0+Z2V0X2V0aHRvb2xfc3RhdHMoZHMsIGNwdV9wb3J0LCBkYXRhICsgY291bnQpOwogfQogCiBzdGF0aWMgaW50IGRzYV9jcHVfcG9ydF9nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3NldCkKQEAgLTcyNyw4ICs4MDMsOCBAQAogCWlmIChkc3QtPm1hc3Rlcl9ldGh0b29sX29wcy5nZXRfc3NldF9jb3VudCkKIAkJY291bnQgKz0gZHN0LT5tYXN0ZXJfZXRodG9vbF9vcHMuZ2V0X3NzZXRfY291bnQoZGV2LCBzc2V0KTsKIAotCWlmIChzc2V0ID09IEVUSF9TU19TVEFUUyAmJiBkcy0+ZHJ2LT5nZXRfc3NldF9jb3VudCkKLQkJY291bnQgKz0gZHMtPmRydi0+Z2V0X3NzZXRfY291bnQoZHMpOworCWlmIChzc2V0ID09IEVUSF9TU19TVEFUUyAmJiBkcy0+b3BzLT5nZXRfc3NldF9jb3VudCkKKwkJY291bnQgKz0gZHMtPm9wcy0+Z2V0X3NzZXRfY291bnQoZHMpOwogCiAJcmV0dXJuIGNvdW50OwogfQpAQCAtNzU1LDE0ICs4MzEsMTQgQEAKIAkJZHN0LT5tYXN0ZXJfZXRodG9vbF9vcHMuZ2V0X3N0cmluZ3MoZGV2LCBzdHJpbmdzZXQsIGRhdGEpOwogCX0KIAotCWlmIChzdHJpbmdzZXQgPT0gRVRIX1NTX1NUQVRTICYmIGRzLT5kcnYtPmdldF9zdHJpbmdzKSB7CisJaWYgKHN0cmluZ3NldCA9PSBFVEhfU1NfU1RBVFMgJiYgZHMtPm9wcy0+Z2V0X3N0cmluZ3MpIHsKIAkJbmRhdGEgPSBkYXRhICsgbWNvdW50ICogbGVuOwogCQkvKiBUaGlzIGZ1bmN0aW9uIGNvcGllcyBFVEhfR1NUUklOR1NfTEVOIGJ5dGVzLCB3ZSB3aWxsIG1hbmdsZQogCQkgKiB0aGUgb3V0cHV0IGFmdGVyIHRvIHByZXBlbmQgb3VyIENQVSBwb3J0IHByZWZpeCB3ZQogCQkgKiBjb25zdHJ1Y3RlZCBlYXJsaWVyCiAJCSAqLwotCQlkcy0+ZHJ2LT5nZXRfc3RyaW5ncyhkcywgY3B1X3BvcnQsIG5kYXRhKTsKLQkJY291bnQgPSBkcy0+ZHJ2LT5nZXRfc3NldF9jb3VudChkcyk7CisJCWRzLT5vcHMtPmdldF9zdHJpbmdzKGRzLCBjcHVfcG9ydCwgbmRhdGEpOworCQljb3VudCA9IGRzLT5vcHMtPmdldF9zc2V0X2NvdW50KGRzKTsKIAkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJCW1lbW1vdmUobmRhdGEgKyAoaSAqIGxlbiArIHNpemVvZihwZngpKSwKIAkJCQluZGF0YSArIGkgKiBsZW4sIGxlbiAtIHNpemVvZihwZngpKTsKQEAgLTc4Miw4ICs4NTgsOCBAQAogCWRhdGFbMV0gPSBkZXYtPnN0YXRzLnR4X2J5dGVzOwogCWRhdGFbMl0gPSBkZXYtPnN0YXRzLnJ4X3BhY2tldHM7CiAJZGF0YVszXSA9IGRldi0+c3RhdHMucnhfYnl0ZXM7Ci0JaWYgKGRzLT5kcnYtPmdldF9ldGh0b29sX3N0YXRzICE9IE5VTEwpCi0JCWRzLT5kcnYtPmdldF9ldGh0b29sX3N0YXRzKGRzLCBwLT5wb3J0LCBkYXRhICsgNCk7CisJaWYgKGRzLT5vcHMtPmdldF9ldGh0b29sX3N0YXRzKQorCQlkcy0+b3BzLT5nZXRfZXRodG9vbF9zdGF0cyhkcywgcC0+cG9ydCwgZGF0YSArIDQpOwogfQogCiBzdGF0aWMgaW50IGRzYV9zbGF2ZV9nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3NldCkKQEAgLTc5NSw4ICs4NzEsOCBAQAogCQlpbnQgY291bnQ7CiAKIAkJY291bnQgPSA0OwotCQlpZiAoZHMtPmRydi0+Z2V0X3NzZXRfY291bnQgIT0gTlVMTCkKLQkJCWNvdW50ICs9IGRzLT5kcnYtPmdldF9zc2V0X2NvdW50KGRzKTsKKwkJaWYgKGRzLT5vcHMtPmdldF9zc2V0X2NvdW50KQorCQkJY291bnQgKz0gZHMtPm9wcy0+Z2V0X3NzZXRfY291bnQoZHMpOwogCiAJCXJldHVybiBjb3VudDsKIAl9CkBAIC04MDksOCArODg1LDggQEAKIAlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKIAotCWlmIChkcy0+ZHJ2LT5nZXRfd29sKQotCQlkcy0+ZHJ2LT5nZXRfd29sKGRzLCBwLT5wb3J0LCB3KTsKKwlpZiAoZHMtPm9wcy0+Z2V0X3dvbCkKKwkJZHMtPm9wcy0+Z2V0X3dvbChkcywgcC0+cG9ydCwgdyk7CiB9CiAKIHN0YXRpYyBpbnQgZHNhX3NsYXZlX3NldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqdykKQEAgLTgxOSw4ICs4OTUsOCBAQAogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKIAlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CiAKLQlpZiAoZHMtPmRydi0+c2V0X3dvbCkKLQkJcmV0ID0gZHMtPmRydi0+c2V0X3dvbChkcywgcC0+cG9ydCwgdyk7CisJaWYgKGRzLT5vcHMtPnNldF93b2wpCisJCXJldCA9IGRzLT5vcHMtPnNldF93b2woZHMsIHAtPnBvcnQsIHcpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTgzMSwxMCArOTA3LDEwIEBACiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OwogCWludCByZXQ7CiAKLQlpZiAoIWRzLT5kcnYtPnNldF9lZWUpCisJaWYgKCFkcy0+b3BzLT5zZXRfZWVlKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlyZXQgPSBkcy0+ZHJ2LT5zZXRfZWVlKGRzLCBwLT5wb3J0LCBwLT5waHksIGUpOworCXJldCA9IGRzLT5vcHMtPnNldF9lZWUoZHMsIHAtPnBvcnQsIHAtPnBoeSwgZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtODUwLDEwICs5MjYsMTAgQEAKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CiAJaW50IHJldDsKIAotCWlmICghZHMtPmRydi0+Z2V0X2VlZSkKKwlpZiAoIWRzLT5vcHMtPmdldF9lZWUpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCXJldCA9IGRzLT5kcnYtPmdldF9lZWUoZHMsIHAtPnBvcnQsIGUpOworCXJldCA9IGRzLT5vcHMtPmdldF9lZWUoZHMsIHAtPnBvcnQsIGUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTk4OCw4ICsxMDY0LDggQEAKIAkJcC0+b2xkX3BhdXNlID0gcC0+cGh5LT5wYXVzZTsKIAl9CiAKLQlpZiAoZHMtPmRydi0+YWRqdXN0X2xpbmsgJiYgc3RhdHVzX2NoYW5nZWQpCi0JCWRzLT5kcnYtPmFkanVzdF9saW5rKGRzLCBwLT5wb3J0LCBwLT5waHkpOworCWlmIChkcy0+b3BzLT5hZGp1c3RfbGluayAmJiBzdGF0dXNfY2hhbmdlZCkKKwkJZHMtPm9wcy0+YWRqdXN0X2xpbmsoZHMsIHAtPnBvcnQsIHAtPnBoeSk7CiAKIAlpZiAoc3RhdHVzX2NoYW5nZWQpCiAJCXBoeV9wcmludF9zdGF0dXMocC0+cGh5KTsKQEAgLTEwMDQsOCArMTA4MCw4IEBACiAJaWYgKGRldikgewogCQlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAkJZHMgPSBwLT5wYXJlbnQ7Ci0JCWlmIChkcy0+ZHJ2LT5maXhlZF9saW5rX3VwZGF0ZSkKLQkJCWRzLT5kcnYtPmZpeGVkX2xpbmtfdXBkYXRlKGRzLCBwLT5wb3J0LCBzdGF0dXMpOworCQlpZiAoZHMtPm9wcy0+Zml4ZWRfbGlua191cGRhdGUpCisJCQlkcy0+b3BzLT5maXhlZF9saW5rX3VwZGF0ZShkcywgcC0+cG9ydCwgc3RhdHVzKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTEwNjIsOCArMTEzOCw4IEBACiAJCXBoeV9kbiA9IHBvcnRfZG47CiAJfQogCi0JaWYgKGRzLT5kcnYtPmdldF9waHlfZmxhZ3MpCi0JCXBoeV9mbGFncyA9IGRzLT5kcnYtPmdldF9waHlfZmxhZ3MoZHMsIHAtPnBvcnQpOworCWlmIChkcy0+b3BzLT5nZXRfcGh5X2ZsYWdzKQorCQlwaHlfZmxhZ3MgPSBkcy0+b3BzLT5nZXRfcGh5X2ZsYWdzKGRzLCBwLT5wb3J0KTsKIAogCWlmIChwaHlfZG4pIHsKIAkJaW50IHBoeV9pZCA9IG9mX21kaW9fcGFyc2VfYWRkcigmc2xhdmVfZGV2LT5kZXYsIHBoeV9kbik7CmRpZmYgLS1naXQgYS9uZXQvZHNhL3RhZ19xY2EuYyBiL25ldC9kc2EvdGFnX3FjYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOTBjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvZHNhL3RhZ19xY2EuYwpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlICJkc2FfcHJpdi5oIgorCisjZGVmaW5lIFFDQV9IRFJfTEVOCTIKKyNkZWZpbmUgUUNBX0hEUl9WRVJTSU9OCTB4MgorCisjZGVmaW5lIFFDQV9IRFJfUkVDVl9WRVJTSU9OX01BU0sJR0VOTUFTSygxNSwgMTQpCisjZGVmaW5lIFFDQV9IRFJfUkVDVl9WRVJTSU9OX1MJCTE0CisjZGVmaW5lIFFDQV9IRFJfUkVDVl9QUklPUklUWV9NQVNLCUdFTk1BU0soMTMsIDExKQorI2RlZmluZSBRQ0FfSERSX1JFQ1ZfUFJJT1JJVFlfUwkJMTEKKyNkZWZpbmUgUUNBX0hEUl9SRUNWX1RZUEVfTUFTSwkJR0VOTUFTSygxMCwgNikKKyNkZWZpbmUgUUNBX0hEUl9SRUNWX1RZUEVfUwkJNgorI2RlZmluZSBRQ0FfSERSX1JFQ1ZfRlJBTUVfSVNfVEFHR0VECUJJVCgzKQorI2RlZmluZSBRQ0FfSERSX1JFQ1ZfU09VUkNFX1BPUlRfTUFTSwlHRU5NQVNLKDIsIDApCisKKyNkZWZpbmUgUUNBX0hEUl9YTUlUX1ZFUlNJT05fTUFTSwlHRU5NQVNLKDE1LCAxNCkKKyNkZWZpbmUgUUNBX0hEUl9YTUlUX1ZFUlNJT05fUwkJMTQKKyNkZWZpbmUgUUNBX0hEUl9YTUlUX1BSSU9SSVRZX01BU0sJR0VOTUFTSygxMywgMTEpCisjZGVmaW5lIFFDQV9IRFJfWE1JVF9QUklPUklUWV9TCQkxMQorI2RlZmluZSBRQ0FfSERSX1hNSVRfQ09OVFJPTF9NQVNLCUdFTk1BU0soMTAsIDgpCisjZGVmaW5lIFFDQV9IRFJfWE1JVF9DT05UUk9MX1MJCTgKKyNkZWZpbmUgUUNBX0hEUl9YTUlUX0ZST01fQ1BVCQlCSVQoNykKKyNkZWZpbmUgUUNBX0hEUl9YTUlUX0RQX0JJVF9NQVNLCUdFTk1BU0soNiwgMCkKKworc3RhdGljIHN0cnVjdCBza19idWZmICpxY2FfdGFnX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiAqcGhkciwgaGRyOworCisJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCWlmIChza2JfY293X2hlYWQoc2tiLCAwKSA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlza2JfcHVzaChza2IsIFFDQV9IRFJfTEVOKTsKKworCW1lbW1vdmUoc2tiLT5kYXRhLCBza2ItPmRhdGEgKyBRQ0FfSERSX0xFTiwgMiAqIEVUSF9BTEVOKTsKKwlwaGRyID0gKHUxNiAqKShza2ItPmRhdGEgKyAyICogRVRIX0FMRU4pOworCisJLyogU2V0IHRoZSB2ZXJzaW9uIGZpZWxkLCBhbmQgc2V0IGRlc3RpbmF0aW9uIHBvcnQgaW5mb3JtYXRpb24gKi8KKwloZHIgPSBRQ0FfSERSX1ZFUlNJT04gPDwgUUNBX0hEUl9YTUlUX1ZFUlNJT05fUyB8CisJCVFDQV9IRFJfWE1JVF9GUk9NX0NQVSB8CisJCUJJVChwLT5wb3J0KTsKKworCSpwaGRyID0gaHRvbnMoaGRyKTsKKworCXJldHVybiBza2I7CisKK291dF9mcmVlOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHFjYV90YWdfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0LCBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpCit7CisJc3RydWN0IGRzYV9zd2l0Y2hfdHJlZSAqZHN0ID0gZGV2LT5kc2FfcHRyOworCXN0cnVjdCBkc2Ffc3dpdGNoICpkczsKKwl1OCB2ZXI7CisJaW50IHBvcnQ7CisJX19iZTE2ICpwaGRyLCBoZHI7CisKKwlpZiAodW5saWtlbHkoIWRzdCkpCisJCWdvdG8gb3V0X2Ryb3A7CisKKwlza2IgPSBza2JfdW5zaGFyZShza2IsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlnb3RvIG91dDsKKworCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIFFDQV9IRFJfTEVOKSkpCisJCWdvdG8gb3V0X2Ryb3A7CisKKwkvKiBUaGUgUUNBIGhlYWRlciBpcyBhZGRlZCBieSB0aGUgc3dpdGNoIGJldHdlZW4gc3JjIGFkZHIgYW5kIEV0aGVydHlwZQorCSAqIEF0IHRoaXMgcG9pbnQsIHNrYi0+ZGF0YSBwb2ludHMgdG8gZXRoZXJ0eXBlIHNvIGhlYWRlciBzaG91bGQgYmUKKwkgKiByaWdodCBiZWZvcmUKKwkgKi8KKwlwaGRyID0gKF9fYmUxNiAqKShza2ItPmRhdGEgLSAyKTsKKwloZHIgPSBudG9ocygqcGhkcik7CisKKwkvKiBNYWtlIHN1cmUgdGhlIHZlcnNpb24gaXMgY29ycmVjdCAqLworCXZlciA9IChoZHIgJiBRQ0FfSERSX1JFQ1ZfVkVSU0lPTl9NQVNLKSA+PiBRQ0FfSERSX1JFQ1ZfVkVSU0lPTl9TOworCWlmICh1bmxpa2VseSh2ZXIgIT0gUUNBX0hEUl9WRVJTSU9OKSkKKwkJZ290byBvdXRfZHJvcDsKKworCS8qIFJlbW92ZSBRQ0EgdGFnIGFuZCByZWNhbGN1bGF0ZSBjaGVja3N1bSAqLworCXNrYl9wdWxsX3Jjc3VtKHNrYiwgUUNBX0hEUl9MRU4pOworCW1lbW1vdmUoc2tiLT5kYXRhIC0gRVRIX0hMRU4sIHNrYi0+ZGF0YSAtIEVUSF9ITEVOIC0gUUNBX0hEUl9MRU4sCisJCUVUSF9ITEVOIC0gUUNBX0hEUl9MRU4pOworCisJLyogVGhpcyBwcm90b2NvbCBkb2Vzbid0IHN1cHBvcnQgY2FzY2FkaW5nIG11bHRpcGxlIHN3aXRjaGVzIHNvIGl0J3MKKwkgKiBzYWZlIHRvIGFzc3VtZSB0aGUgc3dpdGNoIGlzIGZpcnN0IGluIHRoZSB0cmVlCisJICovCisJZHMgPSBkc3QtPmRzWzBdOworCWlmICghZHMpCisJCWdvdG8gb3V0X2Ryb3A7CisKKwkvKiBHZXQgc291cmNlIHBvcnQgaW5mb3JtYXRpb24gKi8KKwlwb3J0ID0gKGhkciAmIFFDQV9IRFJfUkVDVl9TT1VSQ0VfUE9SVF9NQVNLKTsKKwlpZiAoIWRzLT5wb3J0c1twb3J0XS5uZXRkZXYpCisJCWdvdG8gb3V0X2Ryb3A7CisKKwkvKiBVcGRhdGUgc2tiICYgZm9yd2FyZCB0aGUgZnJhbWUgYWNjb3JkaW5nbHkgKi8KKwlza2JfcHVzaChza2IsIEVUSF9ITEVOKTsKKwlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CisJc2tiLT5kZXYgPSBkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2OworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsKKworCXNrYi0+ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJc2tiLT5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworCitvdXRfZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IGRzYV9kZXZpY2Vfb3BzIHFjYV9uZXRkZXZfb3BzID0geworCS54bWl0CT0gcWNhX3RhZ194bWl0LAorCS5yY3YJPSBxY2FfdGFnX3JjdiwKK307CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9LY29uZmlnIGIvbmV0L2lwdjQvS2NvbmZpZwppbmRleCA1MGQ2YTliLi4zMDBiMDY4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9LY29uZmlnCisrKyBiL25ldC9pcHY0L0tjb25maWcKQEAgLTY0MCw2ICs2NDAsMjEgQEAKIAkgIEQuQS4gSGF5ZXMgYW5kIEcuIEFybWl0YWdlLiAiUmV2aXNpdGluZyBUQ1AgY29uZ2VzdGlvbiBjb250cm9sIHVzaW5nCiAJICBkZWxheSBncmFkaWVudHMuIiBJbiBOZXR3b3JraW5nIDIwMTEuIFByZXByaW50OiBodHRwOi8vZ29vLmdsL05vM3ZkZwogCitjb25maWcgVENQX0NPTkdfQkJSCisJdHJpc3RhdGUgIkJCUiBUQ1AiCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCisJQkJSIChCb3R0bGVuZWNrIEJhbmR3aWR0aCBhbmQgUlRUKSBUQ1AgY29uZ2VzdGlvbiBjb250cm9sIGFpbXMgdG8KKwltYXhpbWl6ZSBuZXR3b3JrIHV0aWxpemF0aW9uIGFuZCBtaW5pbWl6ZSBxdWV1ZXMuIEl0IGJ1aWxkcyBhbiBleHBsaWNpdAorCW1vZGVsIG9mIHRoZSB0aGUgYm90dGxlbmVjayBkZWxpdmVyeSByYXRlIGFuZCBwYXRoIHJvdW5kLXRyaXAKKwlwcm9wYWdhdGlvbiBkZWxheS4gSXQgdG9sZXJhdGVzIHBhY2tldCBsb3NzIGFuZCBkZWxheSB1bnJlbGF0ZWQgdG8KKwljb25nZXN0aW9uLiBJdCBjYW4gb3BlcmF0ZSBvdmVyIExBTiwgV0FOLCBjZWxsdWxhciwgd2lmaSwgb3IgY2FibGUKKwltb2RlbSBsaW5rcy4gSXQgY2FuIGNvZXhpc3Qgd2l0aCBmbG93cyB0aGF0IHVzZSBsb3NzLWJhc2VkIGNvbmdlc3Rpb24KKwljb250cm9sLCBhbmQgY2FuIG9wZXJhdGUgd2l0aCBzaGFsbG93IGJ1ZmZlcnMsIGRlZXAgYnVmZmVycywKKwlidWZmZXJibG9hdCwgcG9saWNlcnMsIG9yIEFRTSBzY2hlbWVzIHRoYXQgZG8gbm90IHByb3ZpZGUgYSBkZWxheQorCXNpZ25hbC4gSXQgcmVxdWlyZXMgdGhlIGZxICgiRmFpciBRdWV1ZSIpIHBhY2luZyBwYWNrZXQgc2NoZWR1bGVyLgorCiBjaG9pY2UKIAlwcm9tcHQgIkRlZmF1bHQgVENQIGNvbmdlc3Rpb24gY29udHJvbCIKIAlkZWZhdWx0IERFRkFVTFRfQ1VCSUMKQEAgLTY3NCw2ICs2ODksOSBAQAogCWNvbmZpZyBERUZBVUxUX0NERwogCQlib29sICJDREciIGlmIFRDUF9DT05HX0NERz15CiAKKwljb25maWcgREVGQVVMVF9CQlIKKwkJYm9vbCAiQkJSIiBpZiBUQ1BfQ09OR19CQlI9eQorCiAJY29uZmlnIERFRkFVTFRfUkVOTwogCQlib29sICJSZW5vIgogZW5kY2hvaWNlCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9NYWtlZmlsZSBiL25ldC9pcHY0L01ha2VmaWxlCmluZGV4IDI0NjI5YjYuLmJjNmE2YzggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L01ha2VmaWxlCisrKyBiL25ldC9pcHY0L01ha2VmaWxlCkBAIC04LDcgKzgsNyBAQAogCSAgICAgaW5ldF90aW1ld2FpdF9zb2NrLm8gaW5ldF9jb25uZWN0aW9uX3NvY2subyBcCiAJICAgICB0Y3AubyB0Y3BfaW5wdXQubyB0Y3Bfb3V0cHV0Lm8gdGNwX3RpbWVyLm8gdGNwX2lwdjQubyBcCiAJICAgICB0Y3BfbWluaXNvY2tzLm8gdGNwX2NvbmcubyB0Y3BfbWV0cmljcy5vIHRjcF9mYXN0b3Blbi5vIFwKLQkgICAgIHRjcF9yZWNvdmVyeS5vIFwKKwkgICAgIHRjcF9yYXRlLm8gdGNwX3JlY292ZXJ5Lm8gXAogCSAgICAgdGNwX29mZmxvYWQubyBkYXRhZ3JhbS5vIHJhdy5vIHVkcC5vIHVkcGxpdGUubyBcCiAJICAgICB1ZHBfb2ZmbG9hZC5vIGFycC5vIGljbXAubyBkZXZpbmV0Lm8gYWZfaW5ldC5vIGlnbXAubyBcCiAJICAgICBmaWJfZnJvbnRlbmQubyBmaWJfc2VtYW50aWNzLm8gZmliX3RyaWUubyBcCkBAIC00MSw2ICs0MSw3IEBACiBvYmotJChDT05GSUdfSU5FVF9UQ1BfRElBRykgKz0gdGNwX2RpYWcubwogb2JqLSQoQ09ORklHX0lORVRfVURQX0RJQUcpICs9IHVkcF9kaWFnLm8KIG9iai0kKENPTkZJR19ORVRfVENQUFJPQkUpICs9IHRjcF9wcm9iZS5vCitvYmotJChDT05GSUdfVENQX0NPTkdfQkJSKSArPSB0Y3BfYmJyLm8KIG9iai0kKENPTkZJR19UQ1BfQ09OR19CSUMpICs9IHRjcF9iaWMubwogb2JqLSQoQ09ORklHX1RDUF9DT05HX0NERykgKz0gdGNwX2NkZy5vCiBvYmotJChDT05GSUdfVENQX0NPTkdfQ1VCSUMpICs9IHRjcF9jdWJpYy5vCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9hZl9pbmV0LmMgYi9uZXQvaXB2NC9hZl9pbmV0LmMKaW5kZXggNTU1MTNlNi4uMWVmZmM5OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvYWZfaW5ldC5jCisrKyBiL25ldC9pcHY0L2FmX2luZXQuYwpAQCAtMjExLDI0ICsyMTEsMTkgQEAKIAkgKiB3ZSBjYW4gb25seSBhbGxvdyB0aGUgYmFja2xvZyB0byBiZSBhZGp1c3RlZC4KIAkgKi8KIAlpZiAob2xkX3N0YXRlICE9IFRDUF9MSVNURU4pIHsKLQkJLyogQ2hlY2sgc3BlY2lhbCBzZXR1cHMgZm9yIHRlc3RpbmcgcHVycG9zZSB0byBlbmFibGUgVEZPIHcvbwotCQkgKiByZXF1aXJpbmcgVENQX0ZBU1RPUEVOIHNvY2tvcHQuCisJCS8qIEVuYWJsZSBURk8gdy9vIHJlcXVpcmluZyBUQ1BfRkFTVE9QRU4gc29ja2V0IG9wdGlvbi4KIAkJICogTm90ZSB0aGF0IG9ubHkgVENQIHNvY2tldHMgKFNPQ0tfU1RSRUFNKSB3aWxsIHJlYWNoIGhlcmUuCi0JCSAqIEFsc28gZmFzdG9wZW5xIG1heSBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJlY2F1c2UgdGhpcwotCQkgKiBzb2NrZXQgd2FzIGluIFRDUF9MSVNURU4gc3RhdGUgcHJldmlvdXNseSBidXQgd2FzCi0JCSAqIHNodXRkb3duKCkgKHJhdGhlciB0aGFuIGNsb3NlKCkpLgorCQkgKiBBbHNvIGZhc3RvcGVuIGJhY2tsb2cgbWF5IGFscmVhZHkgYmVlbiBzZXQgdmlhIHRoZSBvcHRpb24KKwkJICogYmVjYXVzZSB0aGUgc29ja2V0IHdhcyBpbiBUQ1BfTElTVEVOIHN0YXRlIHByZXZpb3VzbHkgYnV0CisJCSAqIHdhcyBzaHV0ZG93bigpIHJhdGhlciB0aGFuIGNsb3NlKCkuCiAJCSAqLwotCQlpZiAoKHN5c2N0bF90Y3BfZmFzdG9wZW4gJiBURk9fU0VSVkVSX0VOQUJMRSkgIT0gMCAmJgorCQlpZiAoKHN5c2N0bF90Y3BfZmFzdG9wZW4gJiBURk9fU0VSVkVSX1dPX1NPQ0tPUFQxKSAmJgorCQkgICAgKHN5c2N0bF90Y3BfZmFzdG9wZW4gJiBURk9fU0VSVkVSX0VOQUJMRSkgJiYKIAkJICAgICFpbmV0X2NzayhzayktPmljc2tfYWNjZXB0X3F1ZXVlLmZhc3RvcGVucS5tYXhfcWxlbikgewotCQkJaWYgKChzeXNjdGxfdGNwX2Zhc3RvcGVuICYgVEZPX1NFUlZFUl9XT19TT0NLT1BUMSkgIT0gMCkKLQkJCQlmYXN0b3Blbl9xdWV1ZV90dW5lKHNrLCBiYWNrbG9nKTsKLQkJCWVsc2UgaWYgKChzeXNjdGxfdGNwX2Zhc3RvcGVuICYKLQkJCQkgIFRGT19TRVJWRVJfV09fU09DS09QVDIpICE9IDApCi0JCQkJZmFzdG9wZW5fcXVldWVfdHVuZShzaywKLQkJCQkgICAgKCh1aW50KXN5c2N0bF90Y3BfZmFzdG9wZW4pID4+IDE2KTsKLQorCQkJZmFzdG9wZW5fcXVldWVfdHVuZShzaywgYmFja2xvZyk7CiAJCQl0Y3BfZmFzdG9wZW5faW5pdF9rZXlfb25jZSh0cnVlKTsKIAkJfQorCiAJCWVyciA9IGluZXRfY3NrX2xpc3Rlbl9zdGFydChzaywgYmFja2xvZyk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKQEAgLTkyMSw2ICs5MTYsOCBAQAogCS5tbWFwCQkgICA9IHNvY2tfbm9fbW1hcCwKIAkuc2VuZHBhZ2UJICAgPSBpbmV0X3NlbmRwYWdlLAogCS5zcGxpY2VfcmVhZAkgICA9IHRjcF9zcGxpY2VfcmVhZCwKKwkucmVhZF9zb2NrCSAgID0gdGNwX3JlYWRfc29jaywKKwkucGVla19sZW4JICAgPSB0Y3BfcGVla19sZW4sCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfc2V0c29ja29wdCA9IGNvbXBhdF9zb2NrX2NvbW1vbl9zZXRzb2Nrb3B0LAogCS5jb21wYXRfZ2V0c29ja29wdCA9IGNvbXBhdF9zb2NrX2NvbW1vbl9nZXRzb2Nrb3B0LApAQCAtMTE5NSw3ICsxMTkyLDcgQEAKIHN0cnVjdCBza19idWZmICppbmV0X2dzb19zZWdtZW50KHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewotCWJvb2wgdWRwZnJhZyA9IGZhbHNlLCBmaXhlZGlkID0gZmFsc2UsIGVuY2FwOworCWJvb2wgdWRwZnJhZyA9IGZhbHNlLCBmaXhlZGlkID0gZmFsc2UsIGdzb19wYXJ0aWFsLCBlbmNhcDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2VncyA9IEVSUl9QVFIoLUVJTlZBTCk7CiAJY29uc3Qgc3RydWN0IG5ldF9vZmZsb2FkICpvcHM7CiAJdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CkBAIC0xMjQ4LDYgKzEyNDUsOCBAQAogCWlmIChJU19FUlJfT1JfTlVMTChzZWdzKSkKIAkJZ290byBvdXQ7CiAKKwlnc29fcGFydGlhbCA9ICEhKHNrYl9zaGluZm8oc2VncyktPmdzb190eXBlICYgU0tCX0dTT19QQVJUSUFMKTsKKwogCXNrYiA9IHNlZ3M7CiAJZG8gewogCQlpcGggPSAoc3RydWN0IGlwaGRyICopKHNrYl9tYWNfaGVhZGVyKHNrYikgKyBuaG9mZik7CkBAIC0xMjYyLDkgKzEyNjEsMTMgQEAKIAkJCQlpcGgtPmlkID0gaHRvbnMoaWQpOwogCQkJCWlkICs9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3M7CiAJCQl9Ci0JCQl0b3RfbGVuID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSArCi0JCQkJICBTS0JfR1NPX0NCKHNrYiktPmRhdGFfb2Zmc2V0ICsKLQkJCQkgIHNrYi0+aGVhZCAtICh1bnNpZ25lZCBjaGFyICopaXBoOworCisJCQlpZiAoZ3NvX3BhcnRpYWwpCisJCQkJdG90X2xlbiA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgKworCQkJCQkgIFNLQl9HU09fQ0Ioc2tiKS0+ZGF0YV9vZmZzZXQgKworCQkJCQkgIHNrYi0+aGVhZCAtICh1bnNpZ25lZCBjaGFyICopaXBoOworCQkJZWxzZQorCQkJCXRvdF9sZW4gPSBza2ItPmxlbiAtIG5ob2ZmOwogCQl9IGVsc2UgewogCQkJaWYgKCFmaXhlZGlkKQogCQkJCWlwaC0+aWQgPSBodG9ucyhpZCsrKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2RldmluZXQuYyBiL25ldC9pcHY0L2RldmluZXQuYwppbmRleCA0MTVlMTE3Li4wNjJhNjdjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9kZXZpbmV0LmMKKysrIGIvbmV0L2lwdjQvZGV2aW5ldC5jCkBAIC0yMjMyLDcgKzIyMzIsNyBAQAogfTsKIAogc3RhdGljIGludCBfX2RldmluZXRfc3lzY3RsX3JlZ2lzdGVyKHN0cnVjdCBuZXQgKm5ldCwgY2hhciAqZGV2X25hbWUsCi0JCQkJCXN0cnVjdCBpcHY0X2RldmNvbmYgKnApCisJCQkJICAgICBpbnQgaWZpbmRleCwgc3RydWN0IGlwdjRfZGV2Y29uZiAqcCkKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgZGV2aW5ldF9zeXNjdGxfdGFibGUgKnQ7CkBAIC0yMjU1LDYgKzIyNTUsOCBAQAogCQlnb3RvIGZyZWU7CiAKIAlwLT5zeXNjdGwgPSB0OworCisJaW5ldF9uZXRjb25mX25vdGlmeV9kZXZjb25mKG5ldCwgTkVUQ09ORkFfQUxMLCBpZmluZGV4LCBwKTsKIAlyZXR1cm4gMDsKIAogZnJlZToKQEAgLTIyODYsNyArMjI4OCw3IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAllcnIgPSBfX2RldmluZXRfc3lzY3RsX3JlZ2lzdGVyKGRldl9uZXQoaWRldi0+ZGV2KSwgaWRldi0+ZGV2LT5uYW1lLAotCQkJCQkmaWRldi0+Y25mKTsKKwkJCQkJaWRldi0+ZGV2LT5pZmluZGV4LCAmaWRldi0+Y25mKTsKIAlpZiAoZXJyKQogCQluZWlnaF9zeXNjdGxfdW5yZWdpc3RlcihpZGV2LT5hcnBfcGFybXMpOwogCXJldHVybiBlcnI7CkBAIC0yMzQ3LDExICsyMzQ5LDEyIEBACiAJfQogCiAjaWZkZWYgQ09ORklHX1NZU0NUTAotCWVyciA9IF9fZGV2aW5ldF9zeXNjdGxfcmVnaXN0ZXIobmV0LCAiYWxsIiwgYWxsKTsKKwllcnIgPSBfX2RldmluZXRfc3lzY3RsX3JlZ2lzdGVyKG5ldCwgImFsbCIsIE5FVENPTkZBX0lGSU5ERVhfQUxMLCBhbGwpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycl9yZWdfYWxsOwogCi0JZXJyID0gX19kZXZpbmV0X3N5c2N0bF9yZWdpc3RlcihuZXQsICJkZWZhdWx0IiwgZGZsdCk7CisJZXJyID0gX19kZXZpbmV0X3N5c2N0bF9yZWdpc3RlcihuZXQsICJkZWZhdWx0IiwKKwkJCQkJTkVUQ09ORkFfSUZJTkRFWF9ERUZBVUxULCBkZmx0KTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJfcmVnX2RmbHQ7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jIGIvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMKaW5kZXggZWYyZWJlYi4uYzNiODA0NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMKKysrIGIvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMKQEAgLTkzLDkgKzkzLDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBSVF9UQUJMRV9MT0NBTDoKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldC0+aXB2NC5maWJfbG9jYWwsIHRiKTsKLQkJYnJlYWs7CiAJY2FzZSBSVF9UQUJMRV9NQUlOOgogCQlyY3VfYXNzaWduX3BvaW50ZXIobmV0LT5pcHY0LmZpYl9tYWluLCB0Yik7CiAJCWJyZWFrOwpAQCAtMTM3LDkgKzEzNCw2IEBACiB7CiAjaWZkZWYgQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUwogCXN3aXRjaCAobmV3LT50Yl9pZCkgewotCWNhc2UgUlRfVEFCTEVfTE9DQUw6Ci0JCXJjdV9hc3NpZ25fcG9pbnRlcihuZXQtPmlwdjQuZmliX2xvY2FsLCBuZXcpOwotCQlicmVhazsKIAljYXNlIFJUX1RBQkxFX01BSU46CiAJCXJjdV9hc3NpZ25fcG9pbnRlcihuZXQtPmlwdjQuZmliX21haW4sIG5ldyk7CiAJCWJyZWFrOwpAQCAtMTg4LDI2ICsxODIsMTMgQEAKIAkJc3RydWN0IGZpYl90YWJsZSAqdGI7CiAKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0YiwgdG1wLCBoZWFkLCB0Yl9obGlzdCkKLQkJCWZsdXNoZWQgKz0gZmliX3RhYmxlX2ZsdXNoKHRiKTsKKwkJCWZsdXNoZWQgKz0gZmliX3RhYmxlX2ZsdXNoKG5ldCwgdGIpOwogCX0KIAogCWlmIChmbHVzaGVkKQogCQlydF9jYWNoZV9mbHVzaChuZXQpOwogfQogCi12b2lkIGZpYl9mbHVzaF9leHRlcm5hbChzdHJ1Y3QgbmV0ICpuZXQpCi17Ci0Jc3RydWN0IGZpYl90YWJsZSAqdGI7Ci0Jc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7Ci0JdW5zaWduZWQgaW50IGg7Ci0KLQlmb3IgKGggPSAwOyBoIDwgRklCX1RBQkxFX0hBU0hTWjsgaCsrKSB7Ci0JCWhlYWQgPSAmbmV0LT5pcHY0LmZpYl90YWJsZV9oYXNoW2hdOwotCQlobGlzdF9mb3JfZWFjaF9lbnRyeSh0YiwgaGVhZCwgdGJfaGxpc3QpCi0JCQlmaWJfdGFibGVfZmx1c2hfZXh0ZXJuYWwodGIpOwotCX0KLX0KLQogLyoKICAqIEZpbmQgYWRkcmVzcyB0eXBlIGFzIGlmIG9ubHkgImRldiIgd2FzIHByZXNlbnQgaW4gdGhlIHN5c3RlbS4gSWYKICAqIG9uX2RldiBpcyBOVUxMIHRoZW4gYWxsIGludGVyZmFjZXMgYXJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4KQEAgLTUwOSw2ICs0OTAsNyBAQAogCQlpZiAoIWRldikKIAkJCXJldHVybiAtRU5PREVWOwogCQljZmctPmZjX29pZiA9IGRldi0+aWZpbmRleDsKKwkJY2ZnLT5mY190YWJsZSA9IGwzbWRldl9maWJfdGFibGUoZGV2KTsKIAkJaWYgKGNvbG9uKSB7CiAJCQlzdHJ1Y3QgaW5faWZhZGRyICppZmE7CiAJCQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBfX2luX2Rldl9nZXRfcnRubChkZXYpOwpAQCAtNTk1LDEzICs1NzcsMTMgQEAKIAkJCWlmIChjbWQgPT0gU0lPQ0RFTFJUKSB7CiAJCQkJdGIgPSBmaWJfZ2V0X3RhYmxlKG5ldCwgY2ZnLmZjX3RhYmxlKTsKIAkJCQlpZiAodGIpCi0JCQkJCWVyciA9IGZpYl90YWJsZV9kZWxldGUodGIsICZjZmcpOworCQkJCQllcnIgPSBmaWJfdGFibGVfZGVsZXRlKG5ldCwgdGIsICZjZmcpOwogCQkJCWVsc2UKIAkJCQkJZXJyID0gLUVTUkNIOwogCQkJfSBlbHNlIHsKIAkJCQl0YiA9IGZpYl9uZXdfdGFibGUobmV0LCBjZmcuZmNfdGFibGUpOwogCQkJCWlmICh0YikKLQkJCQkJZXJyID0gZmliX3RhYmxlX2luc2VydCh0YiwgJmNmZyk7CisJCQkJCWVyciA9IGZpYl90YWJsZV9pbnNlcnQobmV0LCB0YiwgJmNmZyk7CiAJCQkJZWxzZQogCQkJCQllcnIgPSAtRU5PQlVGUzsKIAkJCX0KQEAgLTcyNCw3ICs3MDYsNyBAQAogCQlnb3RvIGVycm91dDsKIAl9CiAKLQllcnIgPSBmaWJfdGFibGVfZGVsZXRlKHRiLCAmY2ZnKTsKKwllcnIgPSBmaWJfdGFibGVfZGVsZXRlKG5ldCwgdGIsICZjZmcpOwogZXJyb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC03NDYsNyArNzI4LDcgQEAKIAkJZ290byBlcnJvdXQ7CiAJfQogCi0JZXJyID0gZmliX3RhYmxlX2luc2VydCh0YiwgJmNmZyk7CisJZXJyID0gZmliX3RhYmxlX2luc2VydChuZXQsIHRiLCAmY2ZnKTsKIGVycm91dDoKIAlyZXR1cm4gZXJyOwogfQpAQCAtODMzLDkgKzgxNSw5IEBACiAJCWNmZy5mY19zY29wZSA9IFJUX1NDT1BFX0hPU1Q7CiAKIAlpZiAoY21kID09IFJUTV9ORVdST1VURSkKLQkJZmliX3RhYmxlX2luc2VydCh0YiwgJmNmZyk7CisJCWZpYl90YWJsZV9pbnNlcnQobmV0LCB0YiwgJmNmZyk7CiAJZWxzZQotCQlmaWJfdGFibGVfZGVsZXRlKHRiLCAmY2ZnKTsKKwkJZmliX3RhYmxlX2RlbGV0ZShuZXQsIHRiLCAmY2ZnKTsKIH0KIAogdm9pZCBmaWJfYWRkX2lmYWRkcihzdHJ1Y3QgaW5faWZhZGRyICppZmEpCkBAIC0xMDI3LDcgKzEwMDksNyBAQAogCQkJICogRmlyc3Qgb2YgYWxsLCB3ZSBzY2FuIGZpYl9pbmZvIGxpc3Qgc2VhcmNoaW5nCiAJCQkgKiBmb3Igc3RyYXkgbmV4dGhvcCBlbnRyaWVzLCB0aGVuIGlnbml0ZSBmaWJfZmx1c2guCiAJCQkgKi8KLQkJCWlmIChmaWJfc3luY19kb3duX2FkZHIoZGV2X25ldChkZXYpLCBpZmEtPmlmYV9sb2NhbCkpCisJCQlpZiAoZmliX3N5bmNfZG93bl9hZGRyKGRldiwgaWZhLT5pZmFfbG9jYWwpKQogCQkJCWZpYl9mbHVzaChkZXZfbmV0KGRldikpOwogCQl9CiAJfQpAQCAtMTI0OSw3ICsxMjMxLDYgQEAKIAogCXJ0bmxfbG9jaygpOwogI2lmZGVmIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVMKLQlSQ1VfSU5JVF9QT0lOVEVSKG5ldC0+aXB2NC5maWJfbG9jYWwsIE5VTEwpOwogCVJDVV9JTklUX1BPSU5URVIobmV0LT5pcHY0LmZpYl9tYWluLCBOVUxMKTsKIAlSQ1VfSU5JVF9QT0lOVEVSKG5ldC0+aXB2NC5maWJfZGVmYXVsdCwgTlVMTCk7CiAjZW5kaWYKQEAgLTEyNjAsNyArMTI0MSw3IEBACiAKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0YiwgdG1wLCBoZWFkLCB0Yl9obGlzdCkgewogCQkJaGxpc3RfZGVsKCZ0Yi0+dGJfaGxpc3QpOwotCQkJZmliX3RhYmxlX2ZsdXNoKHRiKTsKKwkJCWZpYl90YWJsZV9mbHVzaChuZXQsIHRiKTsKIAkJCWZpYl9mcmVlX3RhYmxlKHRiKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl9ydWxlcy5jIGIvbmV0L2lwdjQvZmliX3J1bGVzLmMKaW5kZXggNmU5ZWE2OS4uMmU1MDA2MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3J1bGVzLmMKKysrIGIvbmV0L2lwdjQvZmliX3J1bGVzLmMKQEAgLTU2LDYgKzU2LDkgQEAKIAl9OwogCWludCBlcnI7CiAKKwkvKiB1cGRhdGUgZmxvdyBpZiBvaWYgb3IgaWlmIHBvaW50IHRvIGRldmljZSBlbnNsYXZlZCB0byBsM21kZXYgKi8KKwlsM21kZXZfdXBkYXRlX2Zsb3cobmV0LCBmbG93aTRfdG9fZmxvd2koZmxwKSk7CisKIAllcnIgPSBmaWJfcnVsZXNfbG9va3VwKG5ldC0+aXB2NC5ydWxlc19vcHMsIGZsb3dpNF90b19mbG93aShmbHApLCAwLCAmYXJnKTsKICNpZmRlZiBDT05GSUdfSVBfUk9VVEVfQ0xBU1NJRAogCWlmIChhcmcucnVsZSkKQEAgLTE2MSw2ICsxNjQsMTQgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGludCBjYWxsX2ZpYl9ydWxlX25vdGlmaWVycyhzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJICAgZW51bSBmaWJfZXZlbnRfdHlwZSBldmVudF90eXBlKQoreworCXN0cnVjdCBmaWJfbm90aWZpZXJfaW5mbyBpbmZvOworCisJcmV0dXJuIGNhbGxfZmliX25vdGlmaWVycyhuZXQsIGV2ZW50X3R5cGUsICZpbmZvKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IGZpYjRfcnVsZV9wb2xpY3lbRlJBX01BWCsxXSA9IHsKIAlGUkFfR0VORVJJQ19QT0xJQ1ksCiAJW0ZSQV9GTE9XXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCkBAIC0yMTcsNyArMjI4LDcgQEAKIAlydWxlNC0+dG9zID0gZnJoLT50b3M7CiAKIAluZXQtPmlwdjQuZmliX2hhc19jdXN0b21fcnVsZXMgPSB0cnVlOwotCWZpYl9mbHVzaF9leHRlcm5hbChydWxlLT5mcl9uZXQpOworCWNhbGxfZmliX3J1bGVfbm90aWZpZXJzKG5ldCwgRklCX0VWRU5UX1JVTEVfQUREKTsKIAogCWVyciA9IDA7CiBlcnJvdXQ6CkBAIC0yMzksNyArMjUwLDcgQEAKIAkJbmV0LT5pcHY0LmZpYl9udW1fdGNsYXNzaWRfdXNlcnMtLTsKICNlbmRpZgogCW5ldC0+aXB2NC5maWJfaGFzX2N1c3RvbV9ydWxlcyA9IHRydWU7Ci0JZmliX2ZsdXNoX2V4dGVybmFsKHJ1bGUtPmZyX25ldCk7CisJY2FsbF9maWJfcnVsZV9ub3RpZmllcnMobmV0LCBGSUJfRVZFTlRfUlVMRV9ERUwpOwogZXJyb3V0OgogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMgYi9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMKaW5kZXggNTM5ZmEyNi4uMzg4ZDNlMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3NlbWFudGljcy5jCisrKyBiL25ldC9pcHY0L2ZpYl9zZW1hbnRpY3MuYwpAQCAtMTA1Nyw2ICsxMDU3LDcgQEAKIAlmaS0+ZmliX3ByaW9yaXR5ID0gY2ZnLT5mY19wcmlvcml0eTsKIAlmaS0+ZmliX3ByZWZzcmMgPSBjZmctPmZjX3ByZWZzcmM7CiAJZmktPmZpYl90eXBlID0gY2ZnLT5mY190eXBlOworCWZpLT5maWJfdGJfaWQgPSBjZmctPmZjX3RhYmxlOwogCiAJZmktPmZpYl9uaHMgPSBuaHM7CiAJY2hhbmdlX25leHRob3BzKGZpKSB7CkBAIC0xMzM3LDE4ICsxMzM4LDIxIEBACiAgKiAgIHJlZmVycmluZyB0byBpdC4KICAqIC0gZGV2aWNlIHdlbnQgZG93biAtPiB3ZSBtdXN0IHNodXRkb3duIGFsbCBuZXh0aG9wcyBnb2luZyB2aWEgaXQuCiAgKi8KLWludCBmaWJfc3luY19kb3duX2FkZHIoc3RydWN0IG5ldCAqbmV0LCBfX2JlMzIgbG9jYWwpCitpbnQgZmliX3N5bmNfZG93bl9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUzMiBsb2NhbCkKIHsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBpbnQgaGFzaCA9IGZpYl9sYWRkcl9oYXNoZm4obG9jYWwpOwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gJmZpYl9pbmZvX2xhZGRyaGFzaFtoYXNoXTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGRldik7CisJaW50IHRiX2lkID0gbDNtZGV2X2ZpYl90YWJsZShkZXYpOwogCXN0cnVjdCBmaWJfaW5mbyAqZmk7CiAKIAlpZiAoIWZpYl9pbmZvX2xhZGRyaGFzaCB8fCBsb2NhbCA9PSAwKQogCQlyZXR1cm4gMDsKIAogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGZpLCBoZWFkLCBmaWJfbGhhc2gpIHsKLQkJaWYgKCFuZXRfZXEoZmktPmZpYl9uZXQsIG5ldCkpCisJCWlmICghbmV0X2VxKGZpLT5maWJfbmV0LCBuZXQpIHx8CisJCSAgICBmaS0+ZmliX3RiX2lkICE9IHRiX2lkKQogCQkJY29udGludWU7CiAJCWlmIChmaS0+ZmliX3ByZWZzcmMgPT0gbG9jYWwpIHsKIAkJCWZpLT5maWJfZmxhZ3MgfD0gUlROSF9GX0RFQUQ7CkBAIC0xNTc2LDcgKzE1ODAsOCBAQAogCiAJCXJjdV9yZWFkX2xvY2tfYmgoKTsKIAotCQluID0gX19pcHY0X25laWdoX2xvb2t1cF9ub3JlZihuaC0+bmhfZGV2LCBuaC0+bmhfZ3cpOworCQluID0gX19pcHY0X25laWdoX2xvb2t1cF9ub3JlZihuaC0+bmhfZGV2LAorCQkJCQkgICAgICAoX19mb3JjZSB1MzIpbmgtPm5oX2d3KTsKIAkJaWYgKG4pCiAJCQlzdGF0ZSA9IG4tPm51ZF9zdGF0ZTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZmliX3RyaWUuYyBiL25ldC9pcHY0L2ZpYl90cmllLmMKaW5kZXggZDA3ZmMwNy4uMzFjZWYzNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3RyaWUuYworKysgYi9uZXQvaXB2NC9maWJfdHJpZS5jCkBAIC03Myw2ICs3Myw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CkBAIC04MCwxMCArODEsNDcgQEAKICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvaXBfZmliLmg+Ci0jaW5jbHVkZSA8bmV0L3N3aXRjaGRldi5oPgogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9maWIuaD4KICNpbmNsdWRlICJmaWJfbG9va3VwLmgiCiAKK3N0YXRpYyBCTE9DS0lOR19OT1RJRklFUl9IRUFEKGZpYl9jaGFpbik7CisKK2ludCByZWdpc3Rlcl9maWJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmZpYl9jaGFpbiwgbmIpOworfQorRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9maWJfbm90aWZpZXIpOworCitpbnQgdW5yZWdpc3Rlcl9maWJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmZmliX2NoYWluLCBuYik7Cit9CitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfZmliX25vdGlmaWVyKTsKKworaW50IGNhbGxfZmliX25vdGlmaWVycyhzdHJ1Y3QgbmV0ICpuZXQsIGVudW0gZmliX2V2ZW50X3R5cGUgZXZlbnRfdHlwZSwKKwkJICAgICAgIHN0cnVjdCBmaWJfbm90aWZpZXJfaW5mbyAqaW5mbykKK3sKKwlpbmZvLT5uZXQgPSBuZXQ7CisJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmZpYl9jaGFpbiwgZXZlbnRfdHlwZSwgaW5mbyk7Cit9CisKK3N0YXRpYyBpbnQgY2FsbF9maWJfZW50cnlfbm90aWZpZXJzKHN0cnVjdCBuZXQgKm5ldCwKKwkJCQkgICAgZW51bSBmaWJfZXZlbnRfdHlwZSBldmVudF90eXBlLCB1MzIgZHN0LAorCQkJCSAgICBpbnQgZHN0X2xlbiwgc3RydWN0IGZpYl9pbmZvICpmaSwKKwkJCQkgICAgdTggdG9zLCB1OCB0eXBlLCB1MzIgdGJfaWQsIHUzMiBubGZsYWdzKQoreworCXN0cnVjdCBmaWJfZW50cnlfbm90aWZpZXJfaW5mbyBpbmZvID0geworCQkuZHN0ID0gZHN0LAorCQkuZHN0X2xlbiA9IGRzdF9sZW4sCisJCS5maSA9IGZpLAorCQkudG9zID0gdG9zLAorCQkudHlwZSA9IHR5cGUsCisJCS50Yl9pZCA9IHRiX2lkLAorCQkubmxmbGFncyA9IG5sZmxhZ3MsCisJfTsKKwlyZXR1cm4gY2FsbF9maWJfbm90aWZpZXJzKG5ldCwgZXZlbnRfdHlwZSwgJmluZm8uaW5mbyk7Cit9CisKICNkZWZpbmUgTUFYX1NUQVRfREVQVEggMzIKIAogI2RlZmluZSBLRVlMRU5HVEgJKDgqc2l6ZW9mKHRfa2V5KSkKQEAgLTI0OSw3ICsyODcsNyBAQAogICogaW5kZXggaW50byB0aGUgcGFyZW50J3MgY2hpbGQgYXJyYXkuIFRoYXQgaXMsIHRoZXkgd2lsbCBiZSB1c2VkIHRvIGZpbmQKICAqICduJyBhbW9uZyB0cCdzIGNoaWxkcmVuLgogICoKLSAqIFRoZSBiaXRzIGZyb20gKG4tPnBvcyArIG4tPmJpdHMpIHRvICh0bi0+cG9zIC0gMSkgLSAiUyIgLSBhcmUgc2tpcHBlZCBiaXRzCisgKiBUaGUgYml0cyBmcm9tIChuLT5wb3MgKyBuLT5iaXRzKSB0byAodHAtPnBvcyAtIDEpIC0gIlMiIC0gYXJlIHNraXBwZWQgYml0cwogICogZm9yIHRoZSBub2RlIG4uCiAgKgogICogQWxsIHRoZSBiaXRzIHdlIGhhdmUgc2VlbiBzbyBmYXIgYXJlIHNpZ25pZmljYW50IHRvIHRoZSBub2RlIG4uIFRoZSByZXN0CkBAIC0yNTgsNyArMjk2LDcgQEAKICAqIFRoZSBiaXRzIGZyb20gKG4tPnBvcykgdG8gKG4tPnBvcyArIG4tPmJpdHMgLSAxKSAtICJDIiAtIGFyZSB0aGUgaW5kZXggaW50bwogICogbidzIGNoaWxkIGFycmF5LCBhbmQgd2lsbCBvZiBjb3Vyc2UgYmUgZGlmZmVyZW50IGZvciBlYWNoIGNoaWxkLgogICoKLSAqIFRoZSByZXN0IG9mIHRoZSBiaXRzLCBmcm9tIDAgdG8gKG4tPnBvcyArIG4tPmJpdHMpLCBhcmUgY29tcGxldGVseSB1bmtub3duCisgKiBUaGUgcmVzdCBvZiB0aGUgYml0cywgZnJvbSAwIHRvIChuLT5wb3MgLTEpIC0gInUiIC0gYXJlIGNvbXBsZXRlbHkgdW5rbm93bgogICogYXQgdGhpcyBwb2ludC4KICAqLwogCkBAIC0xMDc2LDEyICsxMTE0LDEzIEBACiB9CiAKIC8qIENhbGxlciBtdXN0IGhvbGQgUlROTC4gKi8KLWludCBmaWJfdGFibGVfaW5zZXJ0KHN0cnVjdCBmaWJfdGFibGUgKnRiLCBzdHJ1Y3QgZmliX2NvbmZpZyAqY2ZnKQoraW50IGZpYl90YWJsZV9pbnNlcnQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmliX3RhYmxlICp0YiwKKwkJICAgICBzdHJ1Y3QgZmliX2NvbmZpZyAqY2ZnKQogewogCXN0cnVjdCB0cmllICp0ID0gKHN0cnVjdCB0cmllICopdGItPnRiX2RhdGE7CiAJc3RydWN0IGZpYl9hbGlhcyAqZmEsICpuZXdfZmE7CiAJc3RydWN0IGtleV92ZWN0b3IgKmwsICp0cDsKLQl1bnNpZ25lZCBpbnQgbmxmbGFncyA9IDA7CisJdTE2IG5sZmxhZ3MgPSBOTE1fRl9FWENMOwogCXN0cnVjdCBmaWJfaW5mbyAqZmk7CiAJdTggcGxlbiA9IGNmZy0+ZmNfZHN0X2xlbjsKIAl1OCBzbGVuID0gS0VZTEVOR1RIIC0gcGxlbjsKQEAgLTExMjYsNiArMTE2NSw4IEBACiAJCWlmIChjZmctPmZjX25sZmxhZ3MgJiBOTE1fRl9FWENMKQogCQkJZ290byBvdXQ7CiAKKwkJbmxmbGFncyAmPSB+TkxNX0ZfRVhDTDsKKwogCQkvKiBXZSBoYXZlIDIgZ29hbHM6CiAJCSAqIDEuIEZpbmQgZXhhY3QgbWF0Y2ggZm9yIHR5cGUsIHNjb3BlLCBmaWJfaW5mbyB0byBhdm9pZAogCQkgKiBkdXBsaWNhdGUgcm91dGVzCkBAIC0xMTUxLDYgKzExOTIsNyBAQAogCQkJc3RydWN0IGZpYl9pbmZvICpmaV9kcm9wOwogCQkJdTggc3RhdGU7CiAKKwkJCW5sZmxhZ3MgfD0gTkxNX0ZfUkVQTEFDRTsKIAkJCWZhID0gZmFfZmlyc3Q7CiAJCQlpZiAoZmFfbWF0Y2gpIHsKIAkJCQlpZiAoZmEgPT0gZmFfbWF0Y2gpCkBAIC0xMTcyLDE3ICsxMjE0LDYgQEAKIAkJCW5ld19mYS0+dGJfaWQgPSB0Yi0+dGJfaWQ7CiAJCQluZXdfZmEtPmZhX2RlZmF1bHQgPSAtMTsKIAotCQkJZXJyID0gc3dpdGNoZGV2X2ZpYl9pcHY0X2FkZChrZXksIHBsZW4sIGZpLAotCQkJCQkJICAgICBuZXdfZmEtPmZhX3RvcywKLQkJCQkJCSAgICAgY2ZnLT5mY190eXBlLAotCQkJCQkJICAgICBjZmctPmZjX25sZmxhZ3MsCi0JCQkJCQkgICAgIHRiLT50Yl9pZCk7Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJc3dpdGNoZGV2X2ZpYl9pcHY0X2Fib3J0KGZpKTsKLQkJCQlrbWVtX2NhY2hlX2ZyZWUoZm5fYWxpYXNfa21lbSwgbmV3X2ZhKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQogCQkJaGxpc3RfcmVwbGFjZV9yY3UoJmZhLT5mYV9saXN0LCAmbmV3X2ZhLT5mYV9saXN0KTsKIAogCQkJYWxpYXNfZnJlZV9tZW1fcmN1KGZhKTsKQEAgLTExOTAsOCArMTIyMSwxMyBAQAogCQkJZmliX3JlbGVhc2VfaW5mbyhmaV9kcm9wKTsKIAkJCWlmIChzdGF0ZSAmIEZBX1NfQUNDRVNTRUQpCiAJCQkJcnRfY2FjaGVfZmx1c2goY2ZnLT5mY19ubGluZm8ubmxfbmV0KTsKKworCQkJY2FsbF9maWJfZW50cnlfbm90aWZpZXJzKG5ldCwgRklCX0VWRU5UX0VOVFJZX0FERCwKKwkJCQkJCSBrZXksIHBsZW4sIGZpLAorCQkJCQkJIG5ld19mYS0+ZmFfdG9zLCBjZmctPmZjX3R5cGUsCisJCQkJCQkgdGItPnRiX2lkLCBjZmctPmZjX25sZmxhZ3MpOwogCQkJcnRtc2dfZmliKFJUTV9ORVdST1VURSwgaHRvbmwoa2V5KSwgbmV3X2ZhLCBwbGVuLAotCQkJCXRiLT50Yl9pZCwgJmNmZy0+ZmNfbmxpbmZvLCBOTE1fRl9SRVBMQUNFKTsKKwkJCQl0Yi0+dGJfaWQsICZjZmctPmZjX25saW5mbywgbmxmbGFncyk7CiAKIAkJCWdvdG8gc3VjY2VlZGVkOwogCQl9CkBAIC0xMjAzLDcgKzEyMzksNyBAQAogCQkJZ290byBvdXQ7CiAKIAkJaWYgKGNmZy0+ZmNfbmxmbGFncyAmIE5MTV9GX0FQUEVORCkKLQkJCW5sZmxhZ3MgPSBOTE1fRl9BUFBFTkQ7CisJCQlubGZsYWdzIHw9IE5MTV9GX0FQUEVORDsKIAkJZWxzZQogCQkJZmEgPSBmYV9maXJzdDsKIAl9CkBAIC0xMjExLDYgKzEyNDcsNyBAQAogCWlmICghKGNmZy0+ZmNfbmxmbGFncyAmIE5MTV9GX0NSRUFURSkpCiAJCWdvdG8gb3V0OwogCisJbmxmbGFncyB8PSBOTE1fRl9DUkVBVEU7CiAJZXJyID0gLUVOT0JVRlM7CiAJbmV3X2ZhID0ga21lbV9jYWNoZV9hbGxvYyhmbl9hbGlhc19rbWVtLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ld19mYSkKQEAgLTEyMjQsMzAgKzEyNjEsMjIgQEAKIAluZXdfZmEtPnRiX2lkID0gdGItPnRiX2lkOwogCW5ld19mYS0+ZmFfZGVmYXVsdCA9IC0xOwogCi0JLyogKE9wdGlvbmFsbHkpIG9mZmxvYWQgZmliIGVudHJ5IHRvIHN3aXRjaCBoYXJkd2FyZS4gKi8KLQllcnIgPSBzd2l0Y2hkZXZfZmliX2lwdjRfYWRkKGtleSwgcGxlbiwgZmksIHRvcywgY2ZnLT5mY190eXBlLAotCQkJCSAgICAgY2ZnLT5mY19ubGZsYWdzLCB0Yi0+dGJfaWQpOwotCWlmIChlcnIpIHsKLQkJc3dpdGNoZGV2X2ZpYl9pcHY0X2Fib3J0KGZpKTsKLQkJZ290byBvdXRfZnJlZV9uZXdfZmE7Ci0JfQotCiAJLyogSW5zZXJ0IG5ldyBlbnRyeSB0byB0aGUgbGlzdC4gKi8KIAllcnIgPSBmaWJfaW5zZXJ0X2FsaWFzKHQsIHRwLCBsLCBuZXdfZmEsIGZhLCBrZXkpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0X3N3X2ZpYl9kZWw7CisJCWdvdG8gb3V0X2ZyZWVfbmV3X2ZhOwogCiAJaWYgKCFwbGVuKQogCQl0Yi0+dGJfbnVtX2RlZmF1bHQrKzsKIAogCXJ0X2NhY2hlX2ZsdXNoKGNmZy0+ZmNfbmxpbmZvLm5sX25ldCk7CisJY2FsbF9maWJfZW50cnlfbm90aWZpZXJzKG5ldCwgRklCX0VWRU5UX0VOVFJZX0FERCwga2V5LCBwbGVuLCBmaSwgdG9zLAorCQkJCSBjZmctPmZjX3R5cGUsIHRiLT50Yl9pZCwgY2ZnLT5mY19ubGZsYWdzKTsKIAlydG1zZ19maWIoUlRNX05FV1JPVVRFLCBodG9ubChrZXkpLCBuZXdfZmEsIHBsZW4sIG5ld19mYS0+dGJfaWQsCiAJCSAgJmNmZy0+ZmNfbmxpbmZvLCBubGZsYWdzKTsKIHN1Y2NlZWRlZDoKIAlyZXR1cm4gMDsKIAotb3V0X3N3X2ZpYl9kZWw6Ci0Jc3dpdGNoZGV2X2ZpYl9pcHY0X2RlbChrZXksIHBsZW4sIGZpLCB0b3MsIGNmZy0+ZmNfdHlwZSwgdGItPnRiX2lkKTsKIG91dF9mcmVlX25ld19mYToKIAlrbWVtX2NhY2hlX2ZyZWUoZm5fYWxpYXNfa21lbSwgbmV3X2ZhKTsKIG91dDoKQEAgLTE0ODYsNyArMTUxNSw4IEBACiB9CiAKIC8qIENhbGxlciBtdXN0IGhvbGQgUlROTC4gKi8KLWludCBmaWJfdGFibGVfZGVsZXRlKHN0cnVjdCBmaWJfdGFibGUgKnRiLCBzdHJ1Y3QgZmliX2NvbmZpZyAqY2ZnKQoraW50IGZpYl90YWJsZV9kZWxldGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmliX3RhYmxlICp0YiwKKwkJICAgICBzdHJ1Y3QgZmliX2NvbmZpZyAqY2ZnKQogewogCXN0cnVjdCB0cmllICp0ID0gKHN0cnVjdCB0cmllICopIHRiLT50Yl9kYXRhOwogCXN0cnVjdCBmaWJfYWxpYXMgKmZhLCAqZmFfdG9fZGVsZXRlOwpAQCAtMTUzOSw5ICsxNTY5LDkgQEAKIAlpZiAoIWZhX3RvX2RlbGV0ZSkKIAkJcmV0dXJuIC1FU1JDSDsKIAotCXN3aXRjaGRldl9maWJfaXB2NF9kZWwoa2V5LCBwbGVuLCBmYV90b19kZWxldGUtPmZhX2luZm8sIHRvcywKLQkJCSAgICAgICBjZmctPmZjX3R5cGUsIHRiLT50Yl9pZCk7Ci0KKwljYWxsX2ZpYl9lbnRyeV9ub3RpZmllcnMobmV0LCBGSUJfRVZFTlRfRU5UUllfREVMLCBrZXksIHBsZW4sCisJCQkJIGZhX3RvX2RlbGV0ZS0+ZmFfaW5mbywgdG9zLCBjZmctPmZjX3R5cGUsCisJCQkJIHRiLT50Yl9pZCwgMCk7CiAJcnRtc2dfZmliKFJUTV9ERUxST1VURSwgaHRvbmwoa2V5KSwgZmFfdG9fZGVsZXRlLCBwbGVuLCB0Yi0+dGJfaWQsCiAJCSAgJmNmZy0+ZmNfbmxpbmZvLCAwKTsKIApAQCAtMTczMCw4MiArMTc2MCw4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qIENhbGxlciBtdXN0IGhvbGQgUlROTCAqLwotdm9pZCBmaWJfdGFibGVfZmx1c2hfZXh0ZXJuYWwoc3RydWN0IGZpYl90YWJsZSAqdGIpCi17Ci0Jc3RydWN0IHRyaWUgKnQgPSAoc3RydWN0IHRyaWUgKil0Yi0+dGJfZGF0YTsKLQlzdHJ1Y3Qga2V5X3ZlY3RvciAqcG4gPSB0LT5rdjsKLQl1bnNpZ25lZCBsb25nIGNpbmRleCA9IDE7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKnRtcDsKLQlzdHJ1Y3QgZmliX2FsaWFzICpmYTsKLQotCS8qIHdhbGsgdHJpZSBpbiByZXZlcnNlIG9yZGVyICovCi0JZm9yICg7OykgewotCQl1bnNpZ25lZCBjaGFyIHNsZW4gPSAwOwotCQlzdHJ1Y3Qga2V5X3ZlY3RvciAqbjsKLQotCQlpZiAoIShjaW5kZXgtLSkpIHsKLQkJCXRfa2V5IHBrZXkgPSBwbi0+a2V5OwotCi0JCQkvKiBjYW5ub3QgcmVzaXplIHRoZSB0cmllIHZlY3RvciAqLwotCQkJaWYgKElTX1RSSUUocG4pKQotCQkJCWJyZWFrOwotCi0JCQkvKiByZXNpemUgY29tcGxldGVkIG5vZGUgKi8KLQkJCXBuID0gcmVzaXplKHQsIHBuKTsKLQkJCWNpbmRleCA9IGdldF9pbmRleChwa2V5LCBwbik7Ci0KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogZ3JhYiB0aGUgbmV4dCBhdmFpbGFibGUgbm9kZSAqLwotCQluID0gZ2V0X2NoaWxkKHBuLCBjaW5kZXgpOwotCQlpZiAoIW4pCi0JCQljb250aW51ZTsKLQotCQlpZiAoSVNfVE5PREUobikpIHsKLQkJCS8qIHJlY29yZCBwbiBhbmQgY2luZGV4IGZvciBsZWFmIHdhbGtpbmcgKi8KLQkJCXBuID0gbjsKLQkJCWNpbmRleCA9IDF1bCA8PCBuLT5iaXRzOwotCi0JCQljb250aW51ZTsKLQkJfQotCi0JCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmEsIHRtcCwgJm4tPmxlYWYsIGZhX2xpc3QpIHsKLQkJCXN0cnVjdCBmaWJfaW5mbyAqZmkgPSBmYS0+ZmFfaW5mbzsKLQotCQkJLyogaWYgYWxpYXMgd2FzIGNsb25lZCB0byBsb2NhbCB0aGVuIHdlIGp1c3QKLQkJCSAqIG5lZWQgdG8gcmVtb3ZlIHRoZSBsb2NhbCBjb3B5IGZyb20gbWFpbgotCQkJICovCi0JCQlpZiAodGItPnRiX2lkICE9IGZhLT50Yl9pZCkgewotCQkJCWhsaXN0X2RlbF9yY3UoJmZhLT5mYV9saXN0KTsKLQkJCQlhbGlhc19mcmVlX21lbV9yY3UoZmEpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKiByZWNvcmQgbG9jYWwgc2xlbiAqLwotCQkJc2xlbiA9IGZhLT5mYV9zbGVuOwotCi0JCQlpZiAoIWZpIHx8ICEoZmktPmZpYl9mbGFncyAmIFJUTkhfRl9PRkZMT0FEKSkKLQkJCQljb250aW51ZTsKLQotCQkJc3dpdGNoZGV2X2ZpYl9pcHY0X2RlbChuLT5rZXksIEtFWUxFTkdUSCAtIGZhLT5mYV9zbGVuLAotCQkJCQkgICAgICAgZmksIGZhLT5mYV90b3MsIGZhLT5mYV90eXBlLAotCQkJCQkgICAgICAgdGItPnRiX2lkKTsKLQkJfQotCi0JCS8qIHVwZGF0ZSBsZWFmIHNsZW4gKi8KLQkJbi0+c2xlbiA9IHNsZW47Ci0KLQkJaWYgKGhsaXN0X2VtcHR5KCZuLT5sZWFmKSkgewotCQkJcHV0X2NoaWxkX3Jvb3QocG4sIG4tPmtleSwgTlVMTCk7Ci0JCQlub2RlX2ZyZWUobik7Ci0JCX0KLQl9Ci19Ci0KIC8qIENhbGxlciBtdXN0IGhvbGQgUlROTC4gKi8KLWludCBmaWJfdGFibGVfZmx1c2goc3RydWN0IGZpYl90YWJsZSAqdGIpCitpbnQgZmliX3RhYmxlX2ZsdXNoKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGZpYl90YWJsZSAqdGIpCiB7CiAJc3RydWN0IHRyaWUgKnQgPSAoc3RydWN0IHRyaWUgKil0Yi0+dGJfZGF0YTsKIAlzdHJ1Y3Qga2V5X3ZlY3RvciAqcG4gPSB0LT5rdjsKQEAgLTE4NTQsOSArMTgxMCwxMSBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQlzd2l0Y2hkZXZfZmliX2lwdjRfZGVsKG4tPmtleSwgS0VZTEVOR1RIIC0gZmEtPmZhX3NsZW4sCi0JCQkJCSAgICAgICBmaSwgZmEtPmZhX3RvcywgZmEtPmZhX3R5cGUsCi0JCQkJCSAgICAgICB0Yi0+dGJfaWQpOworCQkJY2FsbF9maWJfZW50cnlfbm90aWZpZXJzKG5ldCwgRklCX0VWRU5UX0VOVFJZX0RFTCwKKwkJCQkJCSBuLT5rZXksCisJCQkJCQkgS0VZTEVOR1RIIC0gZmEtPmZhX3NsZW4sCisJCQkJCQkgZmksIGZhLT5mYV90b3MsIGZhLT5mYV90eXBlLAorCQkJCQkJIHRiLT50Yl9pZCwgMCk7CiAJCQlobGlzdF9kZWxfcmN1KCZmYS0+ZmFfbGlzdCk7CiAJCQlmaWJfcmVsZWFzZV9pbmZvKGZhLT5mYV9pbmZvKTsKIAkJCWFsaWFzX2ZyZWVfbWVtX3JjdShmYSk7CkBAIC0yNDUyLDkgKzI0MTAsNyBAQAogc3RhdGljIHN0cnVjdCBrZXlfdmVjdG9yICpmaWJfcm91dGVfZ2V0X2lkeChzdHJ1Y3QgZmliX3JvdXRlX2l0ZXIgKml0ZXIsCiAJCQkJCSAgICBsb2ZmX3QgcG9zKQogewotCXN0cnVjdCBmaWJfdGFibGUgKnRiID0gaXRlci0+bWFpbl90YjsKIAlzdHJ1Y3Qga2V5X3ZlY3RvciAqbCwgKip0cCA9ICZpdGVyLT50bm9kZTsKLQlzdHJ1Y3QgdHJpZSAqdDsKIAl0X2tleSBrZXk7CiAKIAkvKiB1c2UgY2FjaGUgbG9jYXRpb24gb2YgbmV4dC10by1maW5kIGtleSAqLwpAQCAtMjQ2Miw4ICsyNDE4LDYgQEAKIAkJcG9zIC09IGl0ZXItPnBvczsKIAkJa2V5ID0gaXRlci0+a2V5OwogCX0gZWxzZSB7Ci0JCXQgPSAoc3RydWN0IHRyaWUgKil0Yi0+dGJfZGF0YTsKLQkJaXRlci0+dG5vZGUgPSB0LT5rdjsKIAkJaXRlci0+cG9zID0gMDsKIAkJa2V5ID0gMDsKIAl9CkBAIC0yNTA0LDEyICsyNDU4LDEyIEBACiAJCXJldHVybiBOVUxMOwogCiAJaXRlci0+bWFpbl90YiA9IHRiOworCXQgPSAoc3RydWN0IHRyaWUgKil0Yi0+dGJfZGF0YTsKKwlpdGVyLT50bm9kZSA9IHQtPmt2OwogCiAJaWYgKCpwb3MgIT0gMCkKIAkJcmV0dXJuIGZpYl9yb3V0ZV9nZXRfaWR4KGl0ZXIsICpwb3MpOwogCi0JdCA9IChzdHJ1Y3QgdHJpZSAqKXRiLT50Yl9kYXRhOwotCWl0ZXItPnRub2RlID0gdC0+a3Y7CiAJaXRlci0+cG9zID0gMDsKIAlpdGVyLT5rZXkgPSAwOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9mb3UuYyBiL25ldC9pcHY0L2ZvdS5jCmluZGV4IDMyMWQ1N2YuLmNmNTBmN2UgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZvdS5jCisrKyBiL25ldC9pcHY0L2ZvdS5jCkBAIC02MzEsNyArNjMxLDcgQEAKIAkubmV0bnNvawk9IHRydWUsCiB9OwogCi1zdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgZm91X25sX3BvbGljeVtGT1VfQVRUUl9NQVggKyAxXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBmb3VfbmxfcG9saWN5W0ZPVV9BVFRSX01BWCArIDFdID0gewogCVtGT1VfQVRUUl9QT1JUXSA9IHsgLnR5cGUgPSBOTEFfVTE2LCB9LAogCVtGT1VfQVRUUl9BRl0gPSB7IC50eXBlID0gTkxBX1U4LCB9LAogCVtGT1VfQVRUUl9JUFBST1RPXSA9IHsgLnR5cGUgPSBOTEFfVTgsIH0sCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9ncmVfb2ZmbG9hZC5jIGIvbmV0L2lwdjQvZ3JlX29mZmxvYWQuYwppbmRleCBlY2QxZTA5Li45NmUwZWZlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9ncmVfb2ZmbG9hZC5jCisrKyBiL25ldC9pcHY0L2dyZV9vZmZsb2FkLmMKQEAgLTI0LDcgKzI0LDcgQEAKIAlfX2JlMTYgcHJvdG9jb2wgPSBza2ItPnByb3RvY29sOwogCXUxNiBtYWNfbGVuID0gc2tiLT5tYWNfbGVuOwogCWludCBncmVfb2Zmc2V0LCBvdXRlcl9obGVuOwotCWJvb2wgbmVlZF9jc3VtLCB1Zm87CisJYm9vbCBuZWVkX2NzdW0sIHVmbywgZ3NvX3BhcnRpYWw7CiAKIAlpZiAoIXNrYi0+ZW5jYXBzdWxhdGlvbikKIAkJZ290byBvdXQ7CkBAIC02OSw2ICs2OSw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWdzb19wYXJ0aWFsID0gISEoc2tiX3NoaW5mbyhzZWdzKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1BBUlRJQUwpOworCiAJb3V0ZXJfaGxlbiA9IHNrYl90bmxfaGVhZGVyX2xlbihza2IpOwogCWdyZV9vZmZzZXQgPSBvdXRlcl9obGVuIC0gdG5sX2hsZW47CiAJc2tiID0gc2VnczsKQEAgLTk2LDcgKzk4LDcgQEAKIAkJZ3JlaCA9IChzdHJ1Y3QgZ3JlX2Jhc2VfaGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAkJcGNzdW0gPSAoX19zdW0xNiAqKShncmVoICsgMSk7CiAKLQkJaWYgKHNrYl9pc19nc28oc2tiKSkgeworCQlpZiAoZ3NvX3BhcnRpYWwpIHsKIAkJCXVuc2lnbmVkIGludCBwYXJ0aWFsX2FkajsKIAogCQkJLyogQWRqdXN0IGNoZWNrc3VtIHRvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lnbXAuYyBiL25ldC9pcHY0L2lnbXAuYwppbmRleCA5YjRjYTg3Li42MDZjYzNlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pZ21wLmMKKysrIGIvbmV0L2lwdjQvaWdtcC5jCkBAIC00NzIsNiArNDcyLDE1IEBACiAJCQljb250aW51ZTsKIAkJfQogCisJCS8qIEJhc2VkIG9uIFJGQzMzNzYgNS4xLiBTaG91bGQgbm90IHNlbmQgc291cmNlLWxpc3QgY2hhbmdlCisJCSAqIHJlY29yZHMgd2hlbiB0aGVyZSBpcyBhIGZpbHRlciBtb2RlIGNoYW5nZS4KKwkJICovCisJCWlmICgoKGdkZWxldGVkICYmIHBtYy0+c2Ztb2RlID09IE1DQVNUX0VYQ0xVREUpIHx8CisJCSAgICAgKCFnZGVsZXRlZCAmJiBwbWMtPmNyY291bnQpKSAmJgorCQkgICAgKHR5cGUgPT0gSUdNUFYzX0FMTE9XX05FV19TT1VSQ0VTIHx8CisJCSAgICAgdHlwZSA9PSBJR01QVjNfQkxPQ0tfT0xEX1NPVVJDRVMpICYmIHBzZi0+c2ZfY3Jjb3VudCkKKwkJCWdvdG8gZGVjcmVhc2Vfc2ZfY3Jjb3VudDsKKwogCQkvKiBjbGVhciBtYXJrcyBvbiBxdWVyeSByZXNwb25zZXMgKi8KIAkJaWYgKGlzcXVlcnkpCiAJCQlwc2YtPnNmX2dzcmVzcCA9IDA7CkBAIC00OTksNiArNTA4LDcgQEAKIAkJc2NvdW50Kys7IHN0b3RhbCsrOwogCQlpZiAoKHR5cGUgPT0gSUdNUFYzX0FMTE9XX05FV19TT1VSQ0VTIHx8CiAJCSAgICAgdHlwZSA9PSBJR01QVjNfQkxPQ0tfT0xEX1NPVVJDRVMpICYmIHBzZi0+c2ZfY3Jjb3VudCkgeworZGVjcmVhc2Vfc2ZfY3Jjb3VudDoKIAkJCXBzZi0+c2ZfY3Jjb3VudC0tOwogCQkJaWYgKChzZGVsZXRlZCB8fCBnZGVsZXRlZCkgJiYgcHNmLT5zZl9jcmNvdW50ID09IDApIHsKIAkJCQlpZiAocHNmX3ByZXYpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X2RpYWcuYyBiL25ldC9pcHY0L2luZXRfZGlhZy5jCmluZGV4IDM4YzJjNDcuLmU0ZDE2ZmMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRfZGlhZy5jCisrKyBiL25ldC9pcHY0L2luZXRfZGlhZy5jCkBAIC00NSw2ICs0NSw3IEBACiAJdTE2IGZhbWlseTsKIAl1MTYgdXNlcmxvY2tzOwogCXUzMiBpZmluZGV4OworCXUzMiBtYXJrOwogfTsKIAogc3RhdGljIERFRklORV9NVVRFWChpbmV0X2RpYWdfdGFibGVfbXV0ZXgpOwpAQCAtOTgsNiArOTksNyBAQAogCQkrIG5sYV90b3RhbF9zaXplKDEpIC8qIElORVRfRElBR19TSFVURE9XTiAqLwogCQkrIG5sYV90b3RhbF9zaXplKDEpIC8qIElORVRfRElBR19UT1MgKi8KIAkJKyBubGFfdG90YWxfc2l6ZSgxKSAvKiBJTkVUX0RJQUdfVENMQVNTICovCisJCSsgbmxhX3RvdGFsX3NpemUoNCkgLyogSU5FVF9ESUFHX01BUksgKi8KIAkJKyBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19tZW1pbmZvKSkKIAkJKyBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19tc2cpKQogCQkrIG5sYV90b3RhbF9zaXplKFNLX01FTUlORk9fVkFSUyAqIHNpemVvZih1MzIpKQpAQCAtMTA4LDcgKzExMCw4IEBACiAKIGludCBpbmV0X2RpYWdfbXNnX2F0dHJzX2ZpbGwoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICBzdHJ1Y3QgaW5ldF9kaWFnX21zZyAqciwgaW50IGV4dCwKLQkJCSAgICAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zKQorCQkJICAgICBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnMsCisJCQkgICAgIGJvb2wgbmV0X2FkbWluKQogewogCWNvbnN0IHN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIApAQCAtMTM1LDYgKzEzOCw5IEBACiAJfQogI2VuZGlmCiAKKwlpZiAobmV0X2FkbWluICYmIG5sYV9wdXRfdTMyKHNrYiwgSU5FVF9ESUFHX01BUkssIHNrLT5za19tYXJrKSkKKwkJZ290byBlcnJvdXQ7CisKIAlyLT5pZGlhZ191aWQgPSBmcm9tX2t1aWRfbXVuZ2VkKHVzZXJfbnMsIHNvY2tfaV91aWQoc2spKTsKIAlyLT5pZGlhZ19pbm9kZSA9IHNvY2tfaV9pbm8oc2spOwogCkBAIC0xNDgsNyArMTU0LDggQEAKIAkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnJlcSwKIAkJICAgICAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zLAogCQkgICAgICB1MzIgcG9ydGlkLCB1MzIgc2VxLCB1MTYgbmxtc2dfZmxhZ3MsCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCkKKwkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoLAorCQkgICAgICBib29sIG5ldF9hZG1pbikKIHsKIAljb25zdCBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzICpjYV9vcHM7CiAJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyICpoYW5kbGVyOwpAQCAtMTc0LDcgKzE4MSw3IEBACiAJci0+aWRpYWdfdGltZXIgPSAwOwogCXItPmlkaWFnX3JldHJhbnMgPSAwOwogCi0JaWYgKGluZXRfZGlhZ19tc2dfYXR0cnNfZmlsbChzaywgc2tiLCByLCBleHQsIHVzZXJfbnMpKQorCWlmIChpbmV0X2RpYWdfbXNnX2F0dHJzX2ZpbGwoc2ssIHNrYiwgciwgZXh0LCB1c2VyX25zLCBuZXRfYWRtaW4pKQogCQlnb3RvIGVycm91dDsKIAogCWlmIChleHQgJiAoMSA8PCAoSU5FVF9ESUFHX01FTUlORk8gLSAxKSkpIHsKQEAgLTI3MywxMCArMjgwLDExIEBACiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqcmVxLAogCQkJICAgICAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zLAogCQkJICAgICAgdTMyIHBvcnRpZCwgdTMyIHNlcSwgdTE2IG5sbXNnX2ZsYWdzLAotCQkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoKQorCQkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoLAorCQkJICAgICAgYm9vbCBuZXRfYWRtaW4pCiB7Ci0JcmV0dXJuIGluZXRfc2tfZGlhZ19maWxsKHNrLCBpbmV0X2NzayhzayksIHNrYiwgcmVxLAotCQkJCSB1c2VyX25zLCBwb3J0aWQsIHNlcSwgbmxtc2dfZmxhZ3MsIHVubGgpOworCXJldHVybiBpbmV0X3NrX2RpYWdfZmlsbChzaywgaW5ldF9jc2soc2spLCBza2IsIHJlcSwgdXNlcl9ucywKKwkJCQkgcG9ydGlkLCBzZXEsIG5sbXNnX2ZsYWdzLCB1bmxoLCBuZXRfYWRtaW4pOwogfQogCiBzdGF0aWMgaW50IGluZXRfdHdza19kaWFnX2ZpbGwoc3RydWN0IHNvY2sgKnNrLApAQCAtMzE4LDggKzMyNiw5IEBACiAKIHN0YXRpYyBpbnQgaW5ldF9yZXFfZGlhZ19maWxsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIHUzMiBwb3J0aWQsIHUzMiBzZXEsIHUxNiBubG1zZ19mbGFncywKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCkKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCwgYm9vbCBuZXRfYWRtaW4pCiB7CisJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxc2sgPSBpbmV0X3JlcXNrKHNrKTsKIAlzdHJ1Y3QgaW5ldF9kaWFnX21zZyAqcjsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKIAlsb25nIHRtbzsKQEAgLTMzMyw3ICszNDIsNyBAQAogCWluZXRfZGlhZ19tc2dfY29tbW9uX2ZpbGwociwgc2spOwogCXItPmlkaWFnX3N0YXRlID0gVENQX1NZTl9SRUNWOwogCXItPmlkaWFnX3RpbWVyID0gMTsKLQlyLT5pZGlhZ19yZXRyYW5zID0gaW5ldF9yZXFzayhzayktPm51bV9yZXRyYW5zOworCXItPmlkaWFnX3JldHJhbnMgPSByZXFzay0+bnVtX3JldHJhbnM7CiAKIAlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGluZXRfcmVxdWVzdF9zb2NrLCBpcl9jb29raWUpICE9CiAJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IHNvY2ssIHNrX2Nvb2tpZSkpOwpAQCAtMzQ1LDYgKzM1NCwxMCBAQAogCXItPmlkaWFnX3VpZAk9IDA7CiAJci0+aWRpYWdfaW5vZGUJPSAwOwogCisJaWYgKG5ldF9hZG1pbiAmJiBubGFfcHV0X3UzMihza2IsIElORVRfRElBR19NQVJLLAorCQkJCSAgICAgaW5ldF9yc2socmVxc2spLT5pcl9tYXJrKSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwogCW5sbXNnX2VuZChza2IsIG5saCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0zNTMsNyArMzY2LDcgQEAKIAkJCWNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyLAogCQkJc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zLAogCQkJdTMyIHBvcnRpZCwgdTMyIHNlcSwgdTE2IG5sbXNnX2ZsYWdzLAotCQkJY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoKQorCQkJY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoLCBib29sIG5ldF9hZG1pbikKIHsKIAlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9USU1FX1dBSVQpCiAJCXJldHVybiBpbmV0X3R3c2tfZGlhZ19maWxsKHNrLCBza2IsIHBvcnRpZCwgc2VxLApAQCAtMzYxLDEwICszNzQsMTAgQEAKIAogCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX05FV19TWU5fUkVDVikKIAkJcmV0dXJuIGluZXRfcmVxX2RpYWdfZmlsbChzaywgc2tiLCBwb3J0aWQsIHNlcSwKLQkJCQkJICBubG1zZ19mbGFncywgdW5saCk7CisJCQkJCSAgbmxtc2dfZmxhZ3MsIHVubGgsIG5ldF9hZG1pbik7CiAKIAlyZXR1cm4gaW5ldF9jc2tfZGlhZ19maWxsKHNrLCBza2IsIHIsIHVzZXJfbnMsIHBvcnRpZCwgc2VxLAotCQkJCSAgbmxtc2dfZmxhZ3MsIHVubGgpOworCQkJCSAgbmxtc2dfZmxhZ3MsIHVubGgsIG5ldF9hZG1pbik7CiB9CiAKIHN0cnVjdCBzb2NrICppbmV0X2RpYWdfZmluZF9vbmVfaWNzayhzdHJ1Y3QgbmV0ICpuZXQsCkBAIC00MzQsNyArNDQ3LDggQEAKIAllcnIgPSBza19kaWFnX2ZpbGwoc2ssIHJlcCwgcmVxLAogCQkJICAgc2tfdXNlcl9ucyhORVRMSU5LX0NCKGluX3NrYikuc2spLAogCQkJICAgTkVUTElOS19DQihpbl9za2IpLnBvcnRpZCwKLQkJCSAgIG5saC0+bmxtc2dfc2VxLCAwLCBubGgpOworCQkJICAgbmxoLT5ubG1zZ19zZXEsIDAsIG5saCwKKwkJCSAgIG5ldGxpbmtfbmV0X2NhcGFibGUoaW5fc2tiLCBDQVBfTkVUX0FETUlOKSk7CiAJaWYgKGVyciA8IDApIHsKIAkJV0FSTl9PTihlcnIgPT0gLUVNU0dTSVpFKTsKIAkJbmxtc2dfZnJlZShyZXApOwpAQCAtNTgwLDYgKzU5NCwxNCBAQAogCQkJCXllcyA9IDA7CiAJCQlicmVhazsKIAkJfQorCQljYXNlIElORVRfRElBR19CQ19NQVJLX0NPTkQ6IHsKKwkJCXN0cnVjdCBpbmV0X2RpYWdfbWFya2NvbmQgKmNvbmQ7CisKKwkJCWNvbmQgPSAoc3RydWN0IGluZXRfZGlhZ19tYXJrY29uZCAqKShvcCArIDEpOworCQkJaWYgKChlbnRyeS0+bWFyayAmIGNvbmQtPm1hc2spICE9IGNvbmQtPm1hcmspCisJCQkJeWVzID0gMDsKKwkJCWJyZWFrOworCQl9CiAJCX0KIAogCQlpZiAoeWVzKSB7CkBAIC02MjQsNiArNjQ2LDEyIEBACiAJZW50cnkuZHBvcnQgPSBudG9ocyhpbmV0LT5pbmV0X2Rwb3J0KTsKIAllbnRyeS5pZmluZGV4ID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKIAllbnRyeS51c2VybG9ja3MgPSBza19mdWxsc29jayhzaykgPyBzay0+c2tfdXNlcmxvY2tzIDogMDsKKwlpZiAoc2tfZnVsbHNvY2soc2spKQorCQllbnRyeS5tYXJrID0gc2stPnNrX21hcms7CisJZWxzZSBpZiAoc2stPnNrX3N0YXRlID09IFRDUF9ORVdfU1lOX1JFQ1YpCisJCWVudHJ5Lm1hcmsgPSBpbmV0X3JzayhpbmV0X3JlcXNrKHNrKSktPmlyX21hcms7CisJZWxzZQorCQllbnRyeS5tYXJrID0gMDsKIAogCXJldHVybiBpbmV0X2RpYWdfYmNfcnVuKGJjLCAmZW50cnkpOwogfQpAQCAtNzA2LDEwICs3MzQsMjUgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGludCBpbmV0X2RpYWdfYmNfYXVkaXQoY29uc3Qgdm9pZCAqYnl0ZWNvZGUsIGludCBieXRlY29kZV9sZW4pCitzdGF0aWMgYm9vbCB2YWxpZF9tYXJrY29uZChjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wICpvcCwgaW50IGxlbiwKKwkJCSAgIGludCAqbWluX2xlbikKIHsKLQljb25zdCB2b2lkICpiYyA9IGJ5dGVjb2RlOwotCWludCAgbGVuID0gYnl0ZWNvZGVfbGVuOworCSptaW5fbGVuICs9IHNpemVvZihzdHJ1Y3QgaW5ldF9kaWFnX21hcmtjb25kKTsKKwlyZXR1cm4gbGVuID49ICptaW5fbGVuOworfQorCitzdGF0aWMgaW50IGluZXRfZGlhZ19iY19hdWRpdChjb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyLAorCQkJICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlib29sIG5ldF9hZG1pbiA9IG5ldGxpbmtfbmV0X2NhcGFibGUoc2tiLCBDQVBfTkVUX0FETUlOKTsKKwljb25zdCB2b2lkICpieXRlY29kZSwgKmJjOworCWludCBieXRlY29kZV9sZW4sIGxlbjsKKworCWlmICghYXR0ciB8fCBubGFfbGVuKGF0dHIpIDwgc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3ApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ5dGVjb2RlID0gYmMgPSBubGFfZGF0YShhdHRyKTsKKwlsZW4gPSBieXRlY29kZV9sZW4gPSBubGFfbGVuKGF0dHIpOwogCiAJd2hpbGUgKGxlbiA+IDApIHsKIAkJaW50IG1pbl9sZW4gPSBzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19iY19vcCk7CkBAIC03MzIsNiArNzc1LDEyIEBACiAJCQlpZiAoIXZhbGlkX3BvcnRfY29tcGFyaXNvbihiYywgbGVuLCAmbWluX2xlbikpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlicmVhazsKKwkJY2FzZSBJTkVUX0RJQUdfQkNfTUFSS19DT05EOgorCQkJaWYgKCFuZXRfYWRtaW4pCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCWlmICghdmFsaWRfbWFya2NvbmQoYmMsIGxlbiwgJm1pbl9sZW4pKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CiAJCWNhc2UgSU5FVF9ESUFHX0JDX0FVVE86CiAJCWNhc2UgSU5FVF9ESUFHX0JDX0pNUDoKIAkJY2FzZSBJTkVUX0RJQUdfQkNfTk9QOgpAQCAtNzYwLDcgKzgwOSw4IEBACiAJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogCQkJICAgICAgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnIsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICpiYykKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKmJjLAorCQkJICAgICAgYm9vbCBuZXRfYWRtaW4pCiB7CiAJaWYgKCFpbmV0X2RpYWdfYmNfc2soYmMsIHNrKSkKIAkJcmV0dXJuIDA7CkBAIC03NjgsNyArODE4LDggQEAKIAlyZXR1cm4gaW5ldF9jc2tfZGlhZ19maWxsKHNrLCBza2IsIHIsCiAJCQkJICBza191c2VyX25zKE5FVExJTktfQ0IoY2ItPnNrYikuc2spLAogCQkJCSAgTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQsCi0JCQkJICBjYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLCBjYi0+bmxoKTsKKwkJCQkgIGNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksIGNiLT5ubGgsCisJCQkJICBuZXRfYWRtaW4pOwogfQogCiBzdGF0aWMgdm9pZCB0d3NrX2J1aWxkX2Fzc2VydCh2b2lkKQpAQCAtODA0LDYgKzg1NSw3IEBACiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CiAJaW50IGksIG51bSwgc19pLCBzX251bTsKIAl1MzIgaWRpYWdfc3RhdGVzID0gci0+aWRpYWdfc3RhdGVzOworCWJvb2wgbmV0X2FkbWluID0gbmV0bGlua19uZXRfY2FwYWJsZShjYi0+c2tiLCBDQVBfTkVUX0FETUlOKTsKIAogCWlmIChpZGlhZ19zdGF0ZXMgJiBUQ1BGX1NZTl9SRUNWKQogCQlpZGlhZ19zdGF0ZXMgfD0gVENQRl9ORVdfU1lOX1JFQ1Y7CkBAIC04NDQsNyArODk2LDggQEAKIAkJCQkgICAgY2ItPmFyZ3NbM10gPiAwKQogCQkJCQlnb3RvIG5leHRfbGlzdGVuOwogCi0JCQkJaWYgKGluZXRfY3NrX2RpYWdfZHVtcChzaywgc2tiLCBjYiwgciwgYmMpIDwgMCkgeworCQkJCWlmIChpbmV0X2Nza19kaWFnX2R1bXAoc2ssIHNrYiwgY2IsIHIsCisJCQkJCQkgICAgICAgYmMsIG5ldF9hZG1pbikgPCAwKSB7CiAJCQkJCXNwaW5fdW5sb2NrX2JoKCZpbGItPmxvY2spOwogCQkJCQlnb3RvIGRvbmU7CiAJCQkJfQpAQCAtOTEyLDcgKzk2NSw3IEBACiAJCQkJCSAgIHNrX3VzZXJfbnMoTkVUTElOS19DQihjYi0+c2tiKS5zayksCiAJCQkJCSAgIE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkLAogCQkJCQkgICBjYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLAotCQkJCQkgICBjYi0+bmxoKTsKKwkJCQkJICAgY2ItPm5saCwgbmV0X2FkbWluKTsKIAkJCWlmIChyZXMgPCAwKSB7CiAJCQkJc3Bpbl91bmxvY2tfYmgobG9jayk7CiAJCQkJZ290byBkb25lOwpAQCAtMTAyMCwxMyArMTA3MywxMyBAQAogCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRFVNUCkgewogCQlpZiAobmxtc2dfYXR0cmxlbihubGgsIGhkcmxlbikpIHsKIAkJCXN0cnVjdCBubGF0dHIgKmF0dHI7CisJCQlpbnQgZXJyOwogCiAJCQlhdHRyID0gbmxtc2dfZmluZF9hdHRyKG5saCwgaGRybGVuLAogCQkJCQkgICAgICAgSU5FVF9ESUFHX1JFUV9CWVRFQ09ERSk7Ci0JCQlpZiAoIWF0dHIgfHwKLQkJCSAgICBubGFfbGVuKGF0dHIpIDwgc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3ApIHx8Ci0JCQkgICAgaW5ldF9kaWFnX2JjX2F1ZGl0KG5sYV9kYXRhKGF0dHIpLCBubGFfbGVuKGF0dHIpKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWVyciA9IGluZXRfZGlhZ19iY19hdWRpdChhdHRyLCBza2IpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOwogCQl9CiAJCXsKIAkJCXN0cnVjdCBuZXRsaW5rX2R1bXBfY29udHJvbCBjID0gewpAQCAtMTA1MSwxMyArMTEwNCwxMyBAQAogCSAgICBoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0RVTVApIHsKIAkJaWYgKG5sbXNnX2F0dHJsZW4oaCwgaGRybGVuKSkgewogCQkJc3RydWN0IG5sYXR0ciAqYXR0cjsKKwkJCWludCBlcnI7CiAKIAkJCWF0dHIgPSBubG1zZ19maW5kX2F0dHIoaCwgaGRybGVuLAogCQkJCQkgICAgICAgSU5FVF9ESUFHX1JFUV9CWVRFQ09ERSk7Ci0JCQlpZiAoIWF0dHIgfHwKLQkJCSAgICBubGFfbGVuKGF0dHIpIDwgc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3ApIHx8Ci0JCQkgICAgaW5ldF9kaWFnX2JjX2F1ZGl0KG5sYV9kYXRhKGF0dHIpLCBubGFfbGVuKGF0dHIpKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWVyciA9IGluZXRfZGlhZ19iY19hdWRpdChhdHRyLCBza2IpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOwogCQl9CiAJCXsKIAkJCXN0cnVjdCBuZXRsaW5rX2R1bXBfY29udHJvbCBjID0gewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfZ3JlLmMgYi9uZXQvaXB2NC9pcF9ncmUuYwppbmRleCA1YjE0ODFiLi41NzZmNzA1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9ncmUuYworKysgYi9uZXQvaXB2NC9pcF9ncmUuYwpAQCAtMjQ2LDI1ICsyNDYsNiBAQAogCWlwZ3JlX2Vycihza2IsIGluZm8sICZ0cGkpOwogfQogCi1zdGF0aWMgX19iZTY0IGtleV90b190dW5uZWxfaWQoX19iZTMyIGtleSkKLXsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQlyZXR1cm4gKF9fZm9yY2UgX19iZTY0KSgoX19mb3JjZSB1MzIpa2V5KTsKLSNlbHNlCi0JcmV0dXJuIChfX2ZvcmNlIF9fYmU2NCkoKF9fZm9yY2UgdTY0KWtleSA8PCAzMik7Ci0jZW5kaWYKLX0KLQotLyogUmV0dXJucyB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBhIF9fYmU2NC4gKi8KLXN0YXRpYyBfX2JlMzIgdHVubmVsX2lkX3RvX2tleShfX2JlNjQgeCkKLXsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQlyZXR1cm4gKF9fZm9yY2UgX19iZTMyKXg7Ci0jZWxzZQotCXJldHVybiAoX19mb3JjZSBfX2JlMzIpKChfX2ZvcmNlIHU2NCl4ID4+IDMyKTsKLSNlbmRpZgotfQotCiBzdGF0aWMgaW50IF9faXBncmVfcmN2KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0bmxfcHRrX2luZm8gKnRwaSwKIAkJICAgICAgIHN0cnVjdCBpcF90dW5uZWxfbmV0ICppdG4sIGludCBoZHJfbGVuLCBib29sIHJhd19wcm90bykKIHsKQEAgLTI5MCw3ICsyNzEsNyBAQAogCQkJX19iZTY0IHR1bl9pZDsKIAogCQkJZmxhZ3MgPSB0cGktPmZsYWdzICYgKFRVTk5FTF9DU1VNIHwgVFVOTkVMX0tFWSk7Ci0JCQl0dW5faWQgPSBrZXlfdG9fdHVubmVsX2lkKHRwaS0+a2V5KTsKKwkJCXR1bl9pZCA9IGtleTMyX3RvX3R1bm5lbF9pZCh0cGktPmtleSk7CiAJCQl0dW5fZHN0ID0gaXBfdHVuX3J4X2RzdChza2IsIGZsYWdzLCB0dW5faWQsIDApOwogCQkJaWYgKCF0dW5fZHN0KQogCQkJCXJldHVybiBQQUNLRVRfUkVKRUNUOwpAQCAtMzcwLDcgKzM1MSw2IEBACiAJCQkgdHVubmVsLT5wYXJtcy5vX2ZsYWdzLCBwcm90bywgdHVubmVsLT5wYXJtcy5vX2tleSwKIAkJCSBodG9ubCh0dW5uZWwtPm9fc2Vxbm8pKTsKIAotCXNrYl9zZXRfaW5uZXJfcHJvdG9jb2woc2tiLCBwcm90byk7CiAJaXBfdHVubmVsX3htaXQoc2tiLCBkZXYsIHRubF9wYXJhbXMsIHRubF9wYXJhbXMtPnByb3RvY29sKTsKIH0KIApAQCAtNDQ3LDcgKzQyNyw3IEBACiAKIAlmbGFncyA9IHR1bl9pbmZvLT5rZXkudHVuX2ZsYWdzICYgKFRVTk5FTF9DU1VNIHwgVFVOTkVMX0tFWSk7CiAJZ3JlX2J1aWxkX2hlYWRlcihza2IsIHR1bm5lbF9obGVuLCBmbGFncywgcHJvdG8sCi0JCQkgdHVubmVsX2lkX3RvX2tleSh0dW5faW5mby0+a2V5LnR1bl9pZCksIDApOworCQkJIHR1bm5lbF9pZF90b19rZXkzMih0dW5faW5mby0+a2V5LnR1bl9pZCksIDApOwogCiAJZGYgPSBrZXktPnR1bl9mbGFncyAmIFRVTk5FTF9ET05UX0ZSQUdNRU5UID8gIGh0b25zKElQX0RGKSA6IDA7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2lucHV0LmMgYi9uZXQvaXB2NC9pcF9pbnB1dC5jCmluZGV4IDRiMzUxYWYuLmQ2ZmVhYmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2lucHV0LmMKKysrIGIvbmV0L2lwdjQvaXBfaW5wdXQuYwpAQCAtMzEyLDYgKzMxMiw3IEBACiB7CiAJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAlzdHJ1Y3QgcnRhYmxlICpydDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CiAKIAkvKiBpZiBpbmdyZXNzIGRldmljZSBpcyBlbnNsYXZlZCB0byBhbiBMMyBtYXN0ZXIgZGV2aWNlIHBhc3MgdGhlCiAJICogc2tiIHRvIGl0cyBoYW5kbGVyIGZvciBwcm9jZXNzaW5nCkBAIC0zNDEsNyArMzQyLDcgQEAKIAkgKi8KIAlpZiAoIXNrYl92YWxpZF9kc3Qoc2tiKSkgewogCQlpbnQgZXJyID0gaXBfcm91dGVfaW5wdXRfbm9yZWYoc2tiLCBpcGgtPmRhZGRyLCBpcGgtPnNhZGRyLAotCQkJCQkgICAgICAgaXBoLT50b3MsIHNrYi0+ZGV2KTsKKwkJCQkJICAgICAgIGlwaC0+dG9zLCBkZXYpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewogCQkJaWYgKGVyciA9PSAtRVhERVYpCiAJCQkJX19ORVRfSU5DX1NUQVRTKG5ldCwgTElOVVhfTUlCX0lQUlBGSUxURVIpOwpAQCAtMzcwLDcgKzM3MSw3IEBACiAJCV9fSVBfVVBEX1BPX1NUQVRTKG5ldCwgSVBTVEFUU19NSUJfSU5CQ0FTVCwgc2tiLT5sZW4pOwogCX0gZWxzZSBpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfQlJPQURDQVNUIHx8CiAJCSAgIHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX01VTFRJQ0FTVCkgewotCQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBfX2luX2Rldl9nZXRfcmN1KHNrYi0+ZGV2KTsKKwkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gX19pbl9kZXZfZ2V0X3JjdShkZXYpOwogCiAJCS8qIFJGQyAxMTIyIDMuMy42OgogCQkgKgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwppbmRleCBkZGUzN2ZiLi4wNWQxMDU4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9vdXRwdXQuYworKysgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwpAQCAtNzMsNiArNzMsNyBAQAogI2luY2x1ZGUgPG5ldC9pY21wLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bmV0L2luZXRwZWVyLmg+CisjaW5jbHVkZSA8bmV0L2x3dHVubmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaWdtcC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oPgpAQCAtOTgsNiArOTksMTQgQEAKIAogCWlwaC0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuKTsKIAlpcF9zZW5kX2NoZWNrKGlwaCk7CisKKwkvKiBpZiBlZ3Jlc3MgZGV2aWNlIGlzIGVuc2xhdmVkIHRvIGFuIEwzIG1hc3RlciBkZXZpY2UgcGFzcyB0aGUKKwkgKiBza2IgdG8gaXRzIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcKKwkgKi8KKwlza2IgPSBsM21kZXZfaXBfb3V0KHNrLCBza2IpOworCWlmICh1bmxpa2VseSghc2tiKSkKKwkJcmV0dXJuIDA7CisKIAlyZXR1cm4gbmZfaG9vayhORlBST1RPX0lQVjQsIE5GX0lORVRfTE9DQUxfT1VULAogCQkgICAgICAgbmV0LCBzaywgc2tiLCBOVUxMLCBza2JfZHN0KHNrYiktPmRldiwKIAkJICAgICAgIGRzdF9vdXRwdXQpOwpAQCAtMTk3LDYgKzIwNiwxMyBAQAogCQlza2IgPSBza2IyOwogCX0KIAorCWlmIChsd3R1bm5lbF94bWl0X3JlZGlyZWN0KGRzdC0+bHd0c3RhdGUpKSB7CisJCWludCByZXMgPSBsd3R1bm5lbF94bWl0KHNrYik7CisKKwkJaWYgKHJlcyA8IDAgfHwgcmVzID09IExXVFVOTkVMX1hNSVRfRE9ORSkKKwkJCXJldHVybiByZXM7CisJfQorCiAJcmN1X3JlYWRfbG9ja19iaCgpOwogCW5leHRob3AgPSAoX19mb3JjZSB1MzIpIHJ0X25leHRob3AocnQsIGlwX2hkcihza2IpLT5kYWRkcik7CiAJbmVpZ2ggPSBfX2lwdjRfbmVpZ2hfbG9va3VwX25vcmVmKGRldiwgbmV4dGhvcCk7CkBAIC00ODIsNyArNDk4LDcgQEAKIAl0by0+dGNfaW5kZXggPSBmcm9tLT50Y19pbmRleDsKICNlbmRpZgogCW5mX2NvcHkodG8sIGZyb20pOwotI2lmIGRlZmluZWQoQ09ORklHX0lQX1ZTKSB8fCBkZWZpbmVkKENPTkZJR19JUF9WU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBfVlMpCiAJdG8tPmlwdnNfcHJvcGVydHkgPSBmcm9tLT5pcHZzX3Byb3BlcnR5OwogI2VuZGlmCiAJc2tiX2NvcHlfc2VjbWFyayh0bywgZnJvbSk7CkBAIC0xNTY2LDggKzE1ODIsNyBAQAogCX0KIAogCW9pZiA9IGFyZy0+Ym91bmRfZGV2X2lmOwotCWlmICghb2lmICYmIG5ldGlmX2luZGV4X2lzX2wzX21hc3RlcihuZXQsIHNrYi0+c2tiX2lpZikpCi0JCW9pZiA9IHNrYi0+c2tiX2lpZjsKKwlvaWYgPSBvaWYgPyA6IHNrYi0+c2tiX2lpZjsKIAogCWZsb3dpNF9pbml0X291dHB1dCgmZmw0LCBvaWYsCiAJCQkgICBJUDRfUkVQTFlfTUFSSyhuZXQsIHNrYi0+bWFyayksCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jIGIvbmV0L2lwdjQvaXBfc29ja2dsdWUuYwppbmRleCA3MWE1MmY0ZC4uYWY0OTE5NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfc29ja2dsdWUuYworKysgYi9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCkBAIC0yODQsOSArMjg0LDEyIEBACiAJCQlpcGMtPnR0bCA9IHZhbDsKIAkJCWJyZWFrOwogCQljYXNlIElQX1RPUzoKLQkJCWlmIChjbXNnLT5jbXNnX2xlbiAhPSBDTVNHX0xFTihzaXplb2YoaW50KSkpCisJCQlpZiAoY21zZy0+Y21zZ19sZW4gPT0gQ01TR19MRU4oc2l6ZW9mKGludCkpKQorCQkJCXZhbCA9ICooaW50ICopQ01TR19EQVRBKGNtc2cpOworCQkJZWxzZSBpZiAoY21zZy0+Y21zZ19sZW4gPT0gQ01TR19MRU4oc2l6ZW9mKHU4KSkpCisJCQkJdmFsID0gKih1OCAqKUNNU0dfREFUQShjbXNnKTsKKwkJCWVsc2UKIAkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCXZhbCA9ICooaW50ICopQ01TR19EQVRBKGNtc2cpOwogCQkJaWYgKHZhbCA8IDAgfHwgdmFsID4gMjU1KQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJaXBjLT50b3MgPSB2YWw7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF90dW5uZWwuYyBiL25ldC9pcHY0L2lwX3R1bm5lbC5jCmluZGV4IDk1NjQ5ZWIuLjU3MTlkNmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3R1bm5lbC5jCisrKyBiL25ldC9pcHY0L2lwX3R1bm5lbC5jCkBAIC01NSw2ICs1NSw3IEBACiAjaW5jbHVkZSA8bmV0L25ldG5zL2dlbmVyaWMuaD4KICNpbmNsdWRlIDxuZXQvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldC9kc3RfbWV0YWRhdGEuaD4KIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KQEAgLTU0Niw2ICs1NDcsODEgQEAKIAlyZXR1cm4gMDsKIH0KIAordm9pZCBpcF9tZF90dW5uZWxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBwcm90bykKK3sKKwlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWwgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBoZWFkcm9vbSA9IHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCXN0cnVjdCBpcF90dW5uZWxfaW5mbyAqdHVuX2luZm87CisJY29uc3Qgc3RydWN0IGlwX3R1bm5lbF9rZXkgKmtleTsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlubmVyX2lwaDsKKwlzdHJ1Y3QgcnRhYmxlICpydDsKKwlzdHJ1Y3QgZmxvd2k0IGZsNDsKKwlfX2JlMTYgZGYgPSAwOworCXU4IHRvcywgdHRsOworCisJdHVuX2luZm8gPSBza2JfdHVubmVsX2luZm8oc2tiKTsKKwlpZiAodW5saWtlbHkoIXR1bl9pbmZvIHx8ICEodHVuX2luZm8tPm1vZGUgJiBJUF9UVU5ORUxfSU5GT19UWCkgfHwKKwkJICAgICBpcF90dW5uZWxfaW5mb19hZih0dW5faW5mbykgIT0gQUZfSU5FVCkpCisJCWdvdG8gdHhfZXJyb3I7CisJa2V5ID0gJnR1bl9pbmZvLT5rZXk7CisJbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2YoSVBDQihza2IpLT5vcHQpKTsKKwlpbm5lcl9pcGggPSAoY29uc3Qgc3RydWN0IGlwaGRyICopc2tiX2lubmVyX25ldHdvcmtfaGVhZGVyKHNrYik7CisJdG9zID0ga2V5LT50b3M7CisJaWYgKHRvcyA9PSAxKSB7CisJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKKwkJCXRvcyA9IGlubmVyX2lwaC0+dG9zOworCQllbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKQorCQkJdG9zID0gaXB2Nl9nZXRfZHNmaWVsZCgoY29uc3Qgc3RydWN0IGlwdjZoZHIgKilpbm5lcl9pcGgpOworCX0KKwlpbml0X3R1bm5lbF9mbG93KCZmbDQsIHByb3RvLCBrZXktPnUuaXB2NC5kc3QsIGtleS0+dS5pcHY0LnNyYywgMCwKKwkJCSBSVF9UT1ModG9zKSwgdHVubmVsLT5wYXJtcy5saW5rKTsKKwlpZiAodHVubmVsLT5lbmNhcC50eXBlICE9IFRVTk5FTF9FTkNBUF9OT05FKQorCQlnb3RvIHR4X2Vycm9yOworCXJ0ID0gaXBfcm91dGVfb3V0cHV0X2tleSh0dW5uZWwtPm5ldCwgJmZsNCk7CisJaWYgKElTX0VSUihydCkpIHsKKwkJZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQlnb3RvIHR4X2Vycm9yOworCX0KKwlpZiAocnQtPmRzdC5kZXYgPT0gZGV2KSB7CisJCWlwX3J0X3B1dChydCk7CisJCWRldi0+c3RhdHMuY29sbGlzaW9ucysrOworCQlnb3RvIHR4X2Vycm9yOworCX0KKwl0b3MgPSBpcF90dW5uZWxfZWNuX2VuY2FwKHRvcywgaW5uZXJfaXBoLCBza2IpOworCXR0bCA9IGtleS0+dHRsOworCWlmICh0dGwgPT0gMCkgeworCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCisJCQl0dGwgPSBpbm5lcl9pcGgtPnR0bDsKKwkJZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSkKKwkJCXR0bCA9ICgoY29uc3Qgc3RydWN0IGlwdjZoZHIgKilpbm5lcl9pcGgpLT5ob3BfbGltaXQ7CisJCWVsc2UKKwkJCXR0bCA9IGlwNF9kc3RfaG9wbGltaXQoJnJ0LT5kc3QpOworCX0KKwlpZiAoa2V5LT50dW5fZmxhZ3MgJiBUVU5ORUxfRE9OVF9GUkFHTUVOVCkKKwkJZGYgPSBodG9ucyhJUF9ERik7CisJZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCisJCWRmID0gaW5uZXJfaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKTsKKwloZWFkcm9vbSArPSBMTF9SRVNFUlZFRF9TUEFDRShydC0+ZHN0LmRldikgKyBydC0+ZHN0LmhlYWRlcl9sZW47CisJaWYgKGhlYWRyb29tID4gZGV2LT5uZWVkZWRfaGVhZHJvb20pCisJCWRldi0+bmVlZGVkX2hlYWRyb29tID0gaGVhZHJvb207CisKKwlpZiAoc2tiX2Nvd19oZWFkKHNrYiwgZGV2LT5uZWVkZWRfaGVhZHJvb20pKSB7CisJCWlwX3J0X3B1dChydCk7CisJCWdvdG8gdHhfZHJvcHBlZDsKKwl9CisJaXB0dW5uZWxfeG1pdChOVUxMLCBydCwgc2tiLCBmbDQuc2FkZHIsIGZsNC5kYWRkciwgcHJvdG8sIGtleS0+dG9zLAorCQkgICAgICBrZXktPnR0bCwgZGYsICFuZXRfZXEodHVubmVsLT5uZXQsIGRldl9uZXQoZGV2KSkpOworCXJldHVybjsKK3R4X2Vycm9yOgorCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJZ290byBrZnJlZTsKK3R4X2Ryb3BwZWQ6CisJZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CitrZnJlZToKKwlrZnJlZV9za2Ioc2tiKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlwX21kX3R1bm5lbF94bWl0KTsKKwogdm9pZCBpcF90dW5uZWxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkgICAgY29uc3Qgc3RydWN0IGlwaGRyICp0bmxfcGFyYW1zLCB1OCBwcm90b2NvbCkKIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX3R1bm5lbF9jb3JlLmMgYi9uZXQvaXB2NC9pcF90dW5uZWxfY29yZS5jCmluZGV4IDlkODQ3YzMuLjc3N2JjMTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3R1bm5lbF9jb3JlLmMKKysrIGIvbmV0L2lwdjQvaXBfdHVubmVsX2NvcmUuYwpAQCAtNjksMTMgKzY5LDE1IEBACiAKIAlza2Jfc2NydWJfcGFja2V0KHNrYiwgeG5ldCk7CiAKLQlza2JfY2xlYXJfaGFzaChza2IpOworCXNrYl9jbGVhcl9oYXNoX2lmX25vdF9sNChza2IpOwogCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT5kc3QpOwogCW1lbXNldChJUENCKHNrYiksIDAsIHNpemVvZigqSVBDQihza2IpKSk7CiAKLQlpZiAoc2tiX2lpZiAmJiBwcm90byA9PSBJUFBST1RPX1VEUCkgewotCQkvKiBBcnJpdmVkIGZyb20gYW4gaW5ncmVzcyBpbnRlcmZhY2UgYW5kIGdvdCB1ZHAgZW5jYXB1c2xhdGVkLgotCQkgKiBUaGUgZW5jYXBzdWxhdGVkIG5ldHdvcmsgc2VnbWVudCBsZW5ndGggbWF5IGV4Y2VlZCBkc3QgbXR1LgorCWlmIChza2JfaWlmICYmICEoZGYgJiBodG9ucyhJUF9ERikpKSB7CisJCS8qIEFycml2ZWQgZnJvbSBhbiBpbmdyZXNzIGludGVyZmFjZSwgZ290IGVuY2Fwc3VsYXRlZCwgd2l0aAorCQkgKiBmcmFnbWVudGF0aW9uIG9mIGVuY2FwdWxhdGluZyBmcmFtZXMgYWxsb3dlZC4KKwkJICogSWYgc2tiIGlzIGdzbywgdGhlIHJlc3VsdGluZyBlbmNhcHN1bGF0ZWQgbmV0d29yayBzZWdtZW50cworCQkgKiBtYXkgZXhjZWVkIGRzdCBtdHUuCiAJCSAqIEFsbG93IElQIEZyYWdtZW50YXRpb24gb2Ygc2VnbWVudHMuCiAJCSAqLwogCQlJUENCKHNrYiktPmZsYWdzIHw9IElQU0tCX0ZSQUdfU0VHUzsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX3Z0aS5jIGIvbmV0L2lwdjQvaXBfdnRpLmMKaW5kZXggYTkxNzkwMy4uNWQ3OTQ0ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfdnRpLmMKKysrIGIvbmV0L2lwdjQvaXBfdnRpLmMKQEAgLTg4LDYgKzg4LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBwY3B1X3N3X25ldHN0YXRzICp0c3RhdHM7CiAJc3RydWN0IHhmcm1fc3RhdGUgKng7CisJc3RydWN0IHhmcm1fbW9kZSAqaW5uZXJfbW9kZTsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWwgPSBYRlJNX1RVTk5FTF9TS0JfQ0Ioc2tiKS0+dHVubmVsLmlwNDsKIAl1MzIgb3JpZ19tYXJrID0gc2tiLT5tYXJrOwogCWludCByZXQ7CkBAIC0xMDUsNyArMTA2LDE5IEBACiAJfQogCiAJeCA9IHhmcm1faW5wdXRfc3RhdGUoc2tiKTsKLQlmYW1pbHkgPSB4LT5pbm5lcl9tb2RlLT5hZmluZm8tPmZhbWlseTsKKworCWlubmVyX21vZGUgPSB4LT5pbm5lcl9tb2RlOworCisJaWYgKHgtPnNlbC5mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCWlubmVyX21vZGUgPSB4ZnJtX2lwMmlubmVyX21vZGUoeCwgWEZSTV9NT0RFX1NLQl9DQihza2IpLT5wcm90b2NvbCk7CisJCWlmIChpbm5lcl9tb2RlID09IE5VTEwpIHsKKwkJCVhGUk1fSU5DX1NUQVRTKGRldl9uZXQoc2tiLT5kZXYpLAorCQkJCSAgICAgICBMSU5VWF9NSUJfWEZSTUlOU1RBVEVNT0RFRVJST1IpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlmYW1pbHkgPSBpbm5lcl9tb2RlLT5hZmluZm8tPmZhbWlseTsKIAogCXNrYi0+bWFyayA9IGJlMzJfdG9fY3B1KHR1bm5lbC0+cGFybXMuaV9rZXkpOwogCXJldCA9IHhmcm1fcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0lOLCBza2IsIGZhbWlseSk7CkBAIC01NTcsNiArNTcwLDMzIEBACiAJLmdldF9saW5rX25ldAk9IGlwX3R1bm5lbF9nZXRfbGlua19uZXQsCiB9OwogCitzdGF0aWMgYm9vbCBpc192dGlfdHVubmVsKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+bmV0ZGV2X29wcyA9PSAmdnRpX25ldGRldl9vcHM7Cit9CisKK3N0YXRpYyBpbnQgdnRpX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5ldGRldl9ub3RpZmllcl9pbmZvX3RvX2RldihwdHIpOworCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIWlzX3Z0aV90dW5uZWwoZGV2KSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX0RPV046CisJCWlmICghbmV0X2VxKHR1bm5lbC0+bmV0LCBkZXZfbmV0KGRldikpKQorCQkJeGZybV9nYXJiYWdlX2NvbGxlY3QodHVubmVsLT5uZXQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHZ0aV9ub3RpZmllcl9ibG9jayBfX3JlYWRfbW9zdGx5ID0geworCS5ub3RpZmllcl9jYWxsID0gdnRpX2RldmljZV9ldmVudCwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IHZ0aV9pbml0KHZvaWQpCiB7CiAJY29uc3QgY2hhciAqbXNnOwpAQCAtNTY0LDYgKzYwNCw4IEBACiAKIAlwcl9pbmZvKCJJUHY0IG92ZXIgSVBzZWMgdHVubmVsaW5nIGRyaXZlclxuIik7CiAKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnZ0aV9ub3RpZmllcl9ibG9jayk7CisKIAltc2cgPSAidHVubmVsIGRldmljZSI7CiAJZXJyID0gcmVnaXN0ZXJfcGVybmV0X2RldmljZSgmdnRpX25ldF9vcHMpOwogCWlmIChlcnIgPCAwKQpAQCAtNTk2LDYgKzYzOCw3IEBACiB4ZnJtX3Byb3RvX2VzcF9mYWlsZWQ6CiAJdW5yZWdpc3Rlcl9wZXJuZXRfZGV2aWNlKCZ2dGlfbmV0X29wcyk7CiBwZXJuZXRfZGV2X2ZhaWxlZDoKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmdnRpX25vdGlmaWVyX2Jsb2NrKTsKIAlwcl9lcnIoInZ0aSBpbml0OiBmYWlsZWQgdG8gcmVnaXN0ZXIgJXNcbiIsIG1zZyk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTYwNyw2ICs2NTAsNyBAQAogCXhmcm00X3Byb3RvY29sX2RlcmVnaXN0ZXIoJnZ0aV9haDRfcHJvdG9jb2wsIElQUFJPVE9fQUgpOwogCXhmcm00X3Byb3RvY29sX2RlcmVnaXN0ZXIoJnZ0aV9lc3A0X3Byb3RvY29sLCBJUFBST1RPX0VTUCk7CiAJdW5yZWdpc3Rlcl9wZXJuZXRfZGV2aWNlKCZ2dGlfbmV0X29wcyk7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnZ0aV9ub3RpZmllcl9ibG9jayk7CiB9CiAKIG1vZHVsZV9pbml0KHZ0aV9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwY29uZmlnLmMgYi9uZXQvaXB2NC9pcGNvbmZpZy5jCmluZGV4IDFkNzFjNDAuLjA3MWE3ODUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwY29uZmlnLmMKKysrIGIvbmV0L2lwdjQvaXBjb25maWcuYwpAQCAtODUsNyArODUsNiBAQAogLyogRGVmaW5lIHRoZSB0aW1lb3V0IGZvciB3YWl0aW5nIGZvciBhIERIQ1AvQk9PVFAvUkFSUCByZXBseSAqLwogI2RlZmluZSBDT05GX09QRU5fUkVUUklFUyAJMgkvKiAoUmUpb3BlbiBkZXZpY2VzIHR3aWNlICovCiAjZGVmaW5lIENPTkZfU0VORF9SRVRSSUVTIAk2CS8qIFNlbmQgc2l4IHJlcXVlc3RzIHBlciBvcGVuICovCi0jZGVmaW5lIENPTkZfSU5URVJfVElNRU9VVAkoSFopCS8qIEludGVyLWRldmljZSB0aW1lb3V0OiAxIHNlY29uZCAqLwogI2RlZmluZSBDT05GX0JBU0VfVElNRU9VVAkoSFoqMikJLyogSW5pdGlhbCB0aW1lb3V0OiAyIHNlY29uZHMgKi8KICNkZWZpbmUgQ09ORl9USU1FT1VUX1JBTkRPTQkoSFopCS8qIE1heGltdW0gYW1vdW50IG9mIHJhbmRvbWl6YXRpb24gKi8KICNkZWZpbmUgQ09ORl9USU1FT1VUX01VTFQJKjcvNAkvKiBSYXRlIG9mIHRpbWVvdXQgZ3Jvd3RoICovCkBAIC0xODgsNyArMTg3LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaWNfZGV2aWNlICppY19maXJzdF9kZXYgX19pbml0ZGF0YTsJLyogTGlzdCBvZiBvcGVuIGRldmljZSAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICppY19kZXYgX19pbml0ZGF0YTsJCS8qIFNlbGVjdGVkIGRldmljZSAqLworc3RhdGljIHN0cnVjdCBpY19kZXZpY2UgKmljX2RldiBfX2luaXRkYXRhOwkJLyogU2VsZWN0ZWQgZGV2aWNlICovCiAKIHN0YXRpYyBib29sIF9faW5pdCBpY19pc19pbml0X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtMzA3LDcgKzMwNiw3IEBACiAJd2hpbGUgKChkID0gbmV4dCkpIHsKIAkJbmV4dCA9IGQtPm5leHQ7CiAJCWRldiA9IGQtPmRldjsKLQkJaWYgKGRldiAhPSBpY19kZXYgJiYgIW5ldGRldl91c2VzX2RzYShkZXYpKSB7CisJCWlmICgoIWljX2RldiB8fCBkZXYgIT0gaWNfZGV2LT5kZXYpICYmICFuZXRkZXZfdXNlc19kc2EoZGV2KSkgewogCQkJcHJfZGVidWcoIklQLUNvbmZpZzogRG93bmluZyAlc1xuIiwgZGV2LT5uYW1lKTsKIAkJCWRldl9jaGFuZ2VfZmxhZ3MoZGV2LCBkLT5mbGFncyk7CiAJCX0KQEAgLTM3Miw3ICszNzEsNyBAQAogCWludCBlcnI7CiAKIAltZW1zZXQoJmlyLCAwLCBzaXplb2YoaXIpKTsKLQlzdHJjcHkoaXIuaWZyX2lmcm4uaWZybl9uYW1lLCBpY19kZXYtPm5hbWUpOworCXN0cmNweShpci5pZnJfaWZybi5pZnJuX25hbWUsIGljX2Rldi0+ZGV2LT5uYW1lKTsKIAlzZXRfc29ja2FkZHIoc2luLCBpY19teWFkZHIsIDApOwogCWlmICgoZXJyID0gaWNfZGV2aW5ldF9pb2N0bChTSU9DU0lGQUREUiwgJmlyKSkgPCAwKSB7CiAJCXByX2VycigiSVAtQ29uZmlnOiBVbmFibGUgdG8gc2V0IGludGVyZmFjZSBhZGRyZXNzICglZClcbiIsCkBAIC0zOTYsNyArMzk1LDcgQEAKIAkgKiBvdXQsIHdlJ2xsIHRyeSB0byBtdWRkbGUgYWxvbmcuCiAJICovCiAJaWYgKGljX2Rldl9tdHUgIT0gMCkgewotCQlzdHJjcHkoaXIuaWZyX25hbWUsIGljX2Rldi0+bmFtZSk7CisJCXN0cmNweShpci5pZnJfbmFtZSwgaWNfZGV2LT5kZXYtPm5hbWUpOwogCQlpci5pZnJfbXR1ID0gaWNfZGV2X210dTsKIAkJaWYgKChlcnIgPSBpY19kZXZfaW9jdGwoU0lPQ1NJRk1UVSwgJmlyKSkgPCAwKQogCQkJcHJfZXJyKCJJUC1Db25maWc6IFVuYWJsZSB0byBzZXQgaW50ZXJmYWNlIG10dSB0byAlZCAoJWQpXG4iLApAQCAtNTY4LDcgKzU2Nyw3IEBACiAJCWdvdG8gZHJvcF91bmxvY2s7CiAKIAkvKiBXZSBoYXZlIGEgd2lubmVyISAqLwotCWljX2RldiA9IGRldjsKKwlpY19kZXYgPSBkOwogCWlmIChpY19teWFkZHIgPT0gTk9ORSkKIAkJaWNfbXlhZGRyID0gdGlwOwogCWljX3NlcnZhZGRyID0gc2lwOwpAQCAtNjU1LDggKzY1NCw2IEBACiAJLmZ1bmMgPQlpY19ib290cF9yZWN2LAogfTsKIAotc3RhdGljIF9fYmUzMiBpY19kZXZfeGlkOwkJLyogRGV2aWNlIHVuZGVyIGNvbmZpZ3VyYXRpb24gKi8KLQogLyoKICAqICBJbml0aWFsaXplIERIQ1AvQk9PVFAgZXh0ZW5zaW9uIGZpZWxkcyBpbiB0aGUgcmVxdWVzdC4KICAqLwpAQCAtNjY2LDE0ICs2NjMsMTQgQEAKICNpZmRlZiBJUENPTkZJR19ESENQCiAKIHN0YXRpYyB2b2lkIF9faW5pdAotaWNfZGhjcF9pbml0X29wdGlvbnModTggKm9wdGlvbnMpCitpY19kaGNwX2luaXRfb3B0aW9ucyh1OCAqb3B0aW9ucywgc3RydWN0IGljX2RldmljZSAqZCkKIHsKIAl1OCBtdCA9ICgoaWNfc2VydmFkZHIgPT0gTk9ORSkKIAkJID8gREhDUERJU0NPVkVSIDogREhDUFJFUVVFU1QpOwogCXU4ICplID0gb3B0aW9uczsKIAlpbnQgbGVuOwogCi0JcHJfZGVidWcoIkRIQ1A6IFNlbmRpbmcgbWVzc2FnZSB0eXBlICVkXG4iLCBtdCk7CisJcHJfZGVidWcoIkRIQ1A6IFNlbmRpbmcgbWVzc2FnZSB0eXBlICVkICglcylcbiIsIG10LCBkLT5kZXYtPm5hbWUpOwogCiAJbWVtY3B5KGUsIGljX2Jvb3RwX2Nvb2tpZSwgNCk7CS8qIFJGQzEwNDggTWFnaWMgQ29va2llICovCiAJZSArPSA0OwpAQCAtODU3LDcgKzg1NCw3IEBACiAJLyogYWRkIERIQ1Agb3B0aW9ucyBvciBCT09UUCBleHRlbnNpb25zICovCiAjaWZkZWYgSVBDT05GSUdfREhDUAogCWlmIChpY19wcm90b19lbmFibGVkICYgSUNfVVNFX0RIQ1ApCi0JCWljX2RoY3BfaW5pdF9vcHRpb25zKGItPmV4dGVuKTsKKwkJaWNfZGhjcF9pbml0X29wdGlvbnMoYi0+ZXh0ZW4sIGQpOwogCWVsc2UKICNlbmRpZgogCQlpY19ib290cF9pbml0X2V4dChiLT5leHRlbik7CkBAIC0xMDMzLDE0ICsxMDMwLDggQEAKIAkvKiBJcyBpdCBhIHJlcGx5IHRvIG91ciBCT09UUCByZXF1ZXN0PyAqLwogCWlmIChiLT5vcCAhPSBCT09UUF9SRVBMWSB8fAogCSAgICBiLT54aWQgIT0gZC0+eGlkKSB7Ci0JCW5ldF9lcnJfcmF0ZWxpbWl0ZWQoIkRIQ1AvQk9PVFA6IFJlcGx5IG5vdCBmb3IgdXMsIG9wWyV4XSB4aWRbJXhdXG4iLAotCQkJCSAgICBiLT5vcCwgYi0+eGlkKTsKLQkJZ290byBkcm9wX3VubG9jazsKLQl9Ci0KLQkvKiBJcyBpdCBhIHJlcGx5IGZvciB0aGUgZGV2aWNlIHdlIGFyZSBjb25maWd1cmluZz8gKi8KLQlpZiAoYi0+eGlkICE9IGljX2Rldl94aWQpIHsKLQkJbmV0X2Vycl9yYXRlbGltaXRlZCgiREhDUC9CT09UUDogSWdub3JpbmcgZGVsYXllZCBwYWNrZXRcbiIpOworCQluZXRfZXJyX3JhdGVsaW1pdGVkKCJESENQL0JPT1RQOiBSZXBseSBub3QgZm9yIHVzIG9uICVzLCBvcFsleF0geGlkWyV4XVxuIiwKKwkJCQkgICAgZC0+ZGV2LT5uYW1lLCBiLT5vcCwgYi0+eGlkKTsKIAkJZ290byBkcm9wX3VubG9jazsKIAl9CiAKQEAgLTEwNzUsNyArMTA2Niw3IEBACiAJCQkJfQogCQkJfQogCi0JCQlwcl9kZWJ1ZygiREhDUDogR290IG1lc3NhZ2UgdHlwZSAlZFxuIiwgbXQpOworCQkJcHJfZGVidWcoIkRIQ1A6IEdvdCBtZXNzYWdlIHR5cGUgJWQgKCVzKVxuIiwgbXQsIGQtPmRldi0+bmFtZSk7CiAKIAkJCXN3aXRjaCAobXQpIHsKIAkJCWNhc2UgREhDUE9GRkVSOgpAQCAtMTEzMCw3ICsxMTIxLDcgQEAKIAl9CiAKIAkvKiBXZSBoYXZlIGEgd2lubmVyISAqLwotCWljX2RldiA9IGRldjsKKwlpY19kZXYgPSBkOwogCWljX215YWRkciA9IGItPnlvdXJfaXA7CiAJaWNfc2VydmFkZHIgPSBiLT5zZXJ2ZXJfaXA7CiAJaWNfYWRkcnNlcnZhZGRyID0gYi0+aXBoLnNhZGRyOwpAQCAtMTIyNSw5ICsxMjE2LDYgQEAKIAl0aW1lb3V0ID0gQ09ORl9CQVNFX1RJTUVPVVQgKyAodGltZW91dCAlICh1bnNpZ25lZCBpbnQpIENPTkZfVElNRU9VVF9SQU5ET00pOwogCWZvciAoOzspIHsKICNpZmRlZiBJUENPTkZJR19CT09UUAotCQkvKiBUcmFjayB0aGUgZGV2aWNlIHdlIGFyZSBjb25maWd1cmluZyAqLwotCQlpY19kZXZfeGlkID0gZC0+eGlkOwotCiAJCWlmIChkb19ib290cCAmJiAoZC0+YWJsZSAmIElDX0JPT1RQKSkKIAkJCWljX2Jvb3RwX3NlbmRfaWYoZCwgamlmZmllcyAtIHN0YXJ0X2ppZmZpZXMpOwogI2VuZGlmCkBAIC0xMjM2LDE1ICsxMjI0LDE5IEBACiAJCQlpY19yYXJwX3NlbmRfaWYoZCk7CiAjZW5kaWYKIAotCQlqaWZmID0gamlmZmllcyArIChkLT5uZXh0ID8gQ09ORl9JTlRFUl9USU1FT1VUIDogdGltZW91dCk7Ci0JCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBqaWZmKSAmJiAhaWNfZ290X3JlcGx5KQotCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJCWlmICghZC0+bmV4dCkgeworCQkJamlmZiA9IGppZmZpZXMgKyB0aW1lb3V0OworCQkJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGppZmYpICYmICFpY19nb3RfcmVwbHkpCisJCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJCX0KICNpZmRlZiBJUENPTkZJR19ESENQCiAJCS8qIERIQ1AgaXNuJ3QgZG9uZSB1bnRpbCB3ZSBnZXQgYSBESENQQUNLLiAqLwogCQlpZiAoKGljX2dvdF9yZXBseSAmIElDX0JPT1RQKSAmJgogCQkgICAgKGljX3Byb3RvX2VuYWJsZWQgJiBJQ19VU0VfREhDUCkgJiYKIAkJICAgIGljX2RoY3BfbXNndHlwZSAhPSBESENQQUNLKSB7CiAJCQlpY19nb3RfcmVwbHkgPSAwOworCQkJLyogY29udGludWUgb24gZGV2aWNlIHRoYXQgZ290IHRoZSByZXBseSAqLworCQkJZCA9IGljX2RldjsKIAkJCXByX2NvbnQoIiwiKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0xNDg3LDcgKzE0NzksNyBAQAogI2VuZGlmIC8qIElQQ09ORklHX0RZTkFNSUMgKi8KIAl9IGVsc2UgewogCQkvKiBEZXZpY2Ugc2VsZWN0ZWQgbWFudWFsbHkgb3Igb25seSBvbmUgZGV2aWNlIC0+IHVzZSBpdCAqLwotCQlpY19kZXYgPSBpY19maXJzdF9kZXYtPmRldjsKKwkJaWNfZGV2ID0gaWNfZmlyc3RfZGV2OwogCX0KIAogCWFkZHIgPSByb290X25mc19wYXJzZV9hZGRyKHJvb3Rfc2VydmVyX3BhdGgpOwpAQCAtMTUwMSwxNCArMTQ5Myw2IEBACiAJCXJldHVybiAtMTsKIAogCS8qCi0JICogQ2xvc2UgYWxsIG5ldHdvcmsgZGV2aWNlcyBleGNlcHQgdGhlIGRldmljZSB3ZSd2ZQotCSAqIGF1dG9jb25maWd1cmVkIGFuZCBzZXQgdXAgcm91dGVzLgotCSAqLwotCWljX2Nsb3NlX2RldnMoKTsKLQlpZiAoaWNfc2V0dXBfaWYoKSA8IDAgfHwgaWNfc2V0dXBfcm91dGVzKCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLQkvKgogCSAqIFJlY29yZCB3aGljaCBwcm90b2NvbCB3YXMgYWN0dWFsbHkgdXNlZC4KIAkgKi8KICNpZmRlZiBJUENPTkZJR19EWU5BTUlDCkBAIC0xNTIyLDcgKzE1MDYsNyBAQAogCXByX2luZm8oIklQLUNvbmZpZzogQ29tcGxldGU6XG4iKTsKIAogCXByX2luZm8oIiAgICAgZGV2aWNlPSVzLCBod2FkZHI9JSpwaEMsIGlwYWRkcj0lcEk0LCBtYXNrPSVwSTQsIGd3PSVwSTRcbiIsCi0JCWljX2Rldi0+bmFtZSwgaWNfZGV2LT5hZGRyX2xlbiwgaWNfZGV2LT5kZXZfYWRkciwKKwkJaWNfZGV2LT5kZXYtPm5hbWUsIGljX2Rldi0+ZGV2LT5hZGRyX2xlbiwgaWNfZGV2LT5kZXYtPmRldl9hZGRyLAogCQkmaWNfbXlhZGRyLCAmaWNfbmV0bWFzaywgJmljX2dhdGV3YXkpOwogCXByX2luZm8oIiAgICAgaG9zdD0lcywgZG9tYWluPSVzLCBuaXMtZG9tYWluPSVzXG4iLAogCQl1dHNuYW1lKCktPm5vZGVuYW1lLCBpY19kb21haW4sIHV0c25hbWUoKS0+ZG9tYWlubmFtZSk7CkBAIC0xNTQyLDcgKzE1MjYsMTggQEAKIAlwcl9jb250KCJcbiIpOwogI2VuZGlmIC8qICFTSUxFTlQgKi8KIAotCXJldHVybiAwOworCS8qCisJICogQ2xvc2UgYWxsIG5ldHdvcmsgZGV2aWNlcyBleGNlcHQgdGhlIGRldmljZSB3ZSd2ZQorCSAqIGF1dG9jb25maWd1cmVkIGFuZCBzZXQgdXAgcm91dGVzLgorCSAqLworCWlmIChpY19zZXR1cF9pZigpIDwgMCB8fCBpY19zZXR1cF9yb3V0ZXMoKSA8IDApCisJCWVyciA9IC0xOworCWVsc2UKKwkJZXJyID0gMDsKKworCWljX2Nsb3NlX2RldnMoKTsKKworCXJldHVybiBlcnI7CiB9CiAKIGxhdGVfaW5pdGNhbGwoaXBfYXV0b19jb25maWcpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBpcC5jIGIvbmV0L2lwdjQvaXBpcC5jCmluZGV4IDRhZTNmOGUuLmM5MzkyNTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwaXAuYworKysgYi9uZXQvaXB2NC9pcGlwLmMKQEAgLTExNSw2ICsxMTUsNyBAQAogI2luY2x1ZGUgPG5ldC94ZnJtLmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvbmV0bnMvZ2VuZXJpYy5oPgorI2luY2x1ZGUgPG5ldC9kc3RfbWV0YWRhdGEuaD4KIAogc3RhdGljIGJvb2wgbG9nX2Vjbl9lcnJvciA9IHRydWU7CiBtb2R1bGVfcGFyYW0obG9nX2Vjbl9lcnJvciwgYm9vbCwgMDY0NCk7CkBAIC0xOTMsNiArMTk0LDcgQEAKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KHNrYi0+ZGV2KTsKIAlzdHJ1Y3QgaXBfdHVubmVsX25ldCAqaXRuID0gbmV0X2dlbmVyaWMobmV0LCBpcGlwX25ldF9pZCk7CisJc3RydWN0IG1ldGFkYXRhX2RzdCAqdHVuX2RzdCA9IE5VTEw7CiAJc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsOwogCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoOwogCkBAIC0yMTYsNyArMjE4LDEyIEBACiAJCQl0cGkgPSAmaXBpcF90cGk7CiAJCWlmIChpcHR1bm5lbF9wdWxsX2hlYWRlcihza2IsIDAsIHRwaS0+cHJvdG8sIGZhbHNlKSkKIAkJCWdvdG8gZHJvcDsKLQkJcmV0dXJuIGlwX3R1bm5lbF9yY3YodHVubmVsLCBza2IsIHRwaSwgTlVMTCwgbG9nX2Vjbl9lcnJvcik7CisJCWlmICh0dW5uZWwtPmNvbGxlY3RfbWQpIHsKKwkJCXR1bl9kc3QgPSBpcF90dW5fcnhfZHN0KHNrYiwgMCwgMCwgMCk7CisJCQlpZiAoIXR1bl9kc3QpCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIGlwX3R1bm5lbF9yY3YodHVubmVsLCBza2IsIHRwaSwgdHVuX2RzdCwgbG9nX2Vjbl9lcnJvcik7CiAJfQogCiAJcmV0dXJuIC0xOwpAQCAtMjcwLDcgKzI3NywxMCBAQAogCiAJc2tiX3NldF9pbm5lcl9pcHByb3RvKHNrYiwgaXBwcm90byk7CiAKLQlpcF90dW5uZWxfeG1pdChza2IsIGRldiwgdGlwaCwgaXBwcm90byk7CisJaWYgKHR1bm5lbC0+Y29sbGVjdF9tZCkKKwkJaXBfbWRfdHVubmVsX3htaXQoc2tiLCBkZXYsIGlwcHJvdG8pOworCWVsc2UKKwkJaXBfdHVubmVsX3htaXQoc2tiLCBkZXYsIHRpcGgsIGlwcHJvdG8pOwogCXJldHVybiBORVRERVZfVFhfT0s7CiAKIHR4X2Vycm9yOgpAQCAtMzgwLDEzICszOTAsMTQgQEAKIH0KIAogc3RhdGljIHZvaWQgaXBpcF9uZXRsaW5rX3Bhcm1zKHN0cnVjdCBubGF0dHIgKmRhdGFbXSwKLQkJCSAgICAgICBzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnBhcm1zKQorCQkJICAgICAgIHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcGFybXMsIGJvb2wgKmNvbGxlY3RfbWQpCiB7CiAJbWVtc2V0KHBhcm1zLCAwLCBzaXplb2YoKnBhcm1zKSk7CiAKIAlwYXJtcy0+aXBoLnZlcnNpb24gPSA0OwogCXBhcm1zLT5pcGgucHJvdG9jb2wgPSBJUFBST1RPX0lQSVA7CiAJcGFybXMtPmlwaC5paGwgPSA1OworCSpjb2xsZWN0X21kID0gZmFsc2U7CiAKIAlpZiAoIWRhdGEpCiAJCXJldHVybjsKQEAgLTQxNCw2ICs0MjUsOSBAQAogCiAJaWYgKCFkYXRhW0lGTEFfSVBUVU5fUE1UVURJU0NdIHx8IG5sYV9nZXRfdTgoZGF0YVtJRkxBX0lQVFVOX1BNVFVESVNDXSkpCiAJCXBhcm1zLT5pcGguZnJhZ19vZmYgPSBodG9ucyhJUF9ERik7CisKKwlpZiAoZGF0YVtJRkxBX0lQVFVOX0NPTExFQ1RfTUVUQURBVEFdKQorCQkqY29sbGVjdF9tZCA9IHRydWU7CiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gRU5DQVAgYXR0cmlidXRlcyBhcmUgcHJlc2VudCBpbiB0aGUgbmwgbXNnICovCkBAIC00NTMsMTggKzQ2NywxOCBAQAogc3RhdGljIGludCBpcGlwX25ld2xpbmsoc3RydWN0IG5ldCAqc3JjX25ldCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBubGF0dHIgKnRiW10sIHN0cnVjdCBubGF0dHIgKmRhdGFbXSkKIHsKKwlzdHJ1Y3QgaXBfdHVubmVsICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gcDsKIAlzdHJ1Y3QgaXBfdHVubmVsX2VuY2FwIGlwZW5jYXA7CiAKIAlpZiAoaXBpcF9uZXRsaW5rX2VuY2FwX3Bhcm1zKGRhdGEsICZpcGVuY2FwKSkgewotCQlzdHJ1Y3QgaXBfdHVubmVsICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAkJaW50IGVyciA9IGlwX3R1bm5lbF9lbmNhcF9zZXR1cCh0LCAmaXBlbmNhcCk7CiAKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCX0KIAotCWlwaXBfbmV0bGlua19wYXJtcyhkYXRhLCAmcCk7CisJaXBpcF9uZXRsaW5rX3Bhcm1zKGRhdGEsICZwLCAmdC0+Y29sbGVjdF9tZCk7CiAJcmV0dXJuIGlwX3R1bm5lbF9uZXdsaW5rKGRldiwgdGIsICZwKTsKIH0KIApAQCAtNDczLDYgKzQ4Nyw3IEBACiB7CiAJc3RydWN0IGlwX3R1bm5lbF9wYXJtIHA7CiAJc3RydWN0IGlwX3R1bm5lbF9lbmNhcCBpcGVuY2FwOworCWJvb2wgY29sbGVjdF9tZDsKIAogCWlmIChpcGlwX25ldGxpbmtfZW5jYXBfcGFybXMoZGF0YSwgJmlwZW5jYXApKSB7CiAJCXN0cnVjdCBpcF90dW5uZWwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtNDgyLDcgKzQ5Nyw5IEBACiAJCQlyZXR1cm4gZXJyOwogCX0KIAotCWlwaXBfbmV0bGlua19wYXJtcyhkYXRhLCAmcCk7CisJaXBpcF9uZXRsaW5rX3Bhcm1zKGRhdGEsICZwLCAmY29sbGVjdF9tZCk7CisJaWYgKGNvbGxlY3RfbWQpCisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKCgoZGV2LT5mbGFncyAmIElGRl9QT0lOVE9QT0lOVCkgJiYgIXAuaXBoLmRhZGRyKSB8fAogCSAgICAoIShkZXYtPmZsYWdzICYgSUZGX1BPSU5UT1BPSU5UKSAmJiBwLmlwaC5kYWRkcikpCkBAIC01MTYsNiArNTMzLDggQEAKIAkJbmxhX3RvdGFsX3NpemUoMikgKwogCQkvKiBJRkxBX0lQVFVOX0VOQ0FQX0RQT1JUICovCiAJCW5sYV90b3RhbF9zaXplKDIpICsKKwkJLyogSUZMQV9JUFRVTl9DT0xMRUNUX01FVEFEQVRBICovCisJCW5sYV90b3RhbF9zaXplKDApICsKIAkJMDsKIH0KIApAQCAtNTQ0LDYgKzU2Myw5IEBACiAJCQl0dW5uZWwtPmVuY2FwLmZsYWdzKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKKwlpZiAodHVubmVsLT5jb2xsZWN0X21kKQorCQlpZiAobmxhX3B1dF9mbGFnKHNrYiwgSUZMQV9JUFRVTl9DT0xMRUNUX01FVEFEQVRBKSkKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCXJldHVybiAwOwogCiBubGFfcHV0X2ZhaWx1cmU6CkBAIC01NjIsNiArNTg0LDcgQEAKIAlbSUZMQV9JUFRVTl9FTkNBUF9GTEFHU10JPSB7IC50eXBlID0gTkxBX1UxNiB9LAogCVtJRkxBX0lQVFVOX0VOQ0FQX1NQT1JUXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiAJW0lGTEFfSVBUVU5fRU5DQVBfRFBPUlRdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKKwlbSUZMQV9JUFRVTl9DT0xMRUNUX01FVEFEQVRBXQk9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfb3BzIGlwaXBfbGlua19vcHMgX19yZWFkX21vc3RseSA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwbXIuYyBiL25ldC9pcHY0L2lwbXIuYwppbmRleCAyNjI1MzMyLi41ZjAwNmUxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcG1yLmMKKysrIGIvbmV0L2lwdjQvaXBtci5jCkBAIC0yMDc2LDYgKzIwNzYsNyBAQAogCXN0cnVjdCBydGFfbWZjX3N0YXRzIG1mY3M7CiAJc3RydWN0IG5sYXR0ciAqbXBfYXR0cjsKIAlzdHJ1Y3QgcnRuZXh0aG9wICpuaHA7CisJdW5zaWduZWQgbG9uZyBsYXN0dXNlOwogCWludCBjdDsKIAogCS8qIElmIGNhY2hlIGlzIHVucmVzb2x2ZWQsIGRvbid0IHRyeSB0byBwYXJzZSBJSUYgYW5kIE9JRiAqLwpAQCAtMjEwNSwxMiArMjEwNiwxNCBAQAogCiAJbmxhX25lc3RfZW5kKHNrYiwgbXBfYXR0cik7CiAKKwlsYXN0dXNlID0gUkVBRF9PTkNFKGMtPm1mY191bi5yZXMubGFzdHVzZSk7CisJbGFzdHVzZSA9IHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgbGFzdHVzZSkgPyBqaWZmaWVzIC0gbGFzdHVzZSA6IDA7CisKIAltZmNzLm1mY3NfcGFja2V0cyA9IGMtPm1mY191bi5yZXMucGt0OwogCW1mY3MubWZjc19ieXRlcyA9IGMtPm1mY191bi5yZXMuYnl0ZXM7CiAJbWZjcy5tZmNzX3dyb25nX2lmID0gYy0+bWZjX3VuLnJlcy53cm9uZ19pZjsKIAlpZiAobmxhX3B1dF82NGJpdChza2IsIFJUQV9NRkNfU1RBVFMsIHNpemVvZihtZmNzKSwgJm1mY3MsIFJUQV9QQUQpIHx8Ci0JICAgIG5sYV9wdXRfdTY0XzY0Yml0KHNrYiwgUlRBX0VYUElSRVMsCi0JCQkgICAgICBqaWZmaWVzX3RvX2Nsb2NrX3QoYy0+bWZjX3VuLnJlcy5sYXN0dXNlKSwKKwkgICAgbmxhX3B1dF91NjRfNjRiaXQoc2tiLCBSVEFfRVhQSVJFUywgamlmZmllc190b19jbG9ja190KGxhc3R1c2UpLAogCQkJICAgICAgUlRBX1BBRCkpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAKQEAgLTIxMjAsNyArMjEyMyw3IEBACiAKIGludCBpcG1yX2dldF9yb3V0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgIF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAotCQkgICBzdHJ1Y3QgcnRtc2cgKnJ0bSwgaW50IG5vd2FpdCkKKwkJICAgc3RydWN0IHJ0bXNnICpydG0sIGludCBub3dhaXQsIHUzMiBwb3J0aWQpCiB7CiAJc3RydWN0IG1mY19jYWNoZSAqY2FjaGU7CiAJc3RydWN0IG1yX3RhYmxlICptcnQ7CkBAIC0yMTY1LDYgKzIxNjgsNyBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAorCQlORVRMSU5LX0NCKHNrYjIpLnBvcnRpZCA9IHBvcnRpZDsKIAkJc2tiX3B1c2goc2tiMiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOwogCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiMik7CiAJCWlwaCA9IGlwX2hkcihza2IyKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggYzE4N2M2MC4uZDYxMzMwOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTI1LDE3ICsyNSw2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCi0JYm9vbCAicHJvYy9zeXNjdGwgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBjb25uZWN0aW9uIHRyYWNraW5nIgotCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLX1BST0NGUyAmJiBORl9DT05OVFJBQ0tfSVBWNAotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgL3Byb2MgYW5kIHN5c2N0bCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZAotCSAgbGF5ZXIgMyBkZXBlbmRlbnQgY29ubmVjdGlvbiB0cmFja2luZy4gVGhpcyBpcyBuZWVkZWQgdG8ga2VlcAotCSAgb2xkIHByb2dyYW1zIHRoYXQgaGF2ZSBub3QgYmVlbiBhZGFwdGVkIHRvIHRoZSBuZXcgbmFtZXMgd29ya2luZy4KLQotCSAgSWYgdW5zdXJlLCBzYXkgWS4KLQogaWYgTkZfVEFCTEVTCiAKIGNvbmZpZyBORl9UQUJMRVNfSVBWNApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IDg3YjA3M2QuLjg1MzMyOGYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTQsMTEgKzQsNiBAQAogCiAjIG9iamVjdHMgZm9yIGwzIGluZGVwZW5kZW50IGNvbm50cmFjawogbmZfY29ubnRyYWNrX2lwdjQteQk6PSAgbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5vIG5mX2Nvbm50cmFja19wcm90b19pY21wLm8KLWlmZXEgKCQoQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCkseSkKLWlmZXEgKCQoQ09ORklHX1BST0NfRlMpLHkpCi1uZl9jb25udHJhY2tfaXB2NC1vYmpzCSs9IG5mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfY29tcGF0Lm8KLWVuZGlmCi1lbmRpZgogCiAjIGNvbm5lY3Rpb24gdHJhY2tpbmcKIG9iai0kKENPTkZJR19ORl9DT05OVFJBQ0tfSVBWNCkgKz0gbmZfY29ubnRyYWNrX2lwdjQubwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCmluZGV4IGY5OTM1NDUuLjdjMDBjZTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogCS51ID0gewogCQkubG9nID0gewogCQkJLmxldmVsID0gNCwKLQkJCS5sb2dmbGFncyA9IE5GX0xPR19NQVNLLAorCQkJLmxvZ2ZsYWdzID0gTkZfTE9HX0RFRkFVTFRfTUFTSywKIAkJfSwKIAl9LAogfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5jCmluZGV4IGFlMWE3MWEuLjcxM2MwOWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYwpAQCAtMTEwLDcgKzExMCw3IEBACiAJaWYgKCFoZWxwKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCi0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCisJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggKi8KIAloZWxwZXIgPSByY3VfZGVyZWZlcmVuY2UoaGVscC0+aGVscGVyKTsKIAlpZiAoIWhlbHBlcikKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKQEAgLTIwMiw0NyArMjAyLDYgQEAKIAl9LAogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1NZU0NUTCkgJiYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKQotc3RhdGljIGludCBsb2dfaW52YWxpZF9wcm90b19taW4gPSAwOwotc3RhdGljIGludCBsb2dfaW52YWxpZF9wcm90b19tYXggPSAyNTU7Ci0KLXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIGlwX2N0X3N5c2N0bF90YWJsZVtdID0gewotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19tYXgiLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19jb3VudCIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA0NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX2J1Y2tldHMiLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNDQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19jaGVja3N1bSIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX2xvZ19pbnZhbGlkIiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbWlubWF4LAotCQkuZXh0cmExCQk9ICZsb2dfaW52YWxpZF9wcm90b19taW4sCi0JCS5leHRyYTIJCT0gJmxvZ19pbnZhbGlkX3Byb3RvX21heCwKLQl9LAotCXsgfQotfTsKLSNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICYmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQgKi8KLQogLyogRmFzdCBmdW5jdGlvbiBmb3IgdGhvc2Ugd2hvIGRvbid0IHdhbnQgdG8gcGFyc2UgL3Byb2MgKGFuZCBJIGRvbid0CiAgICBibGFtZSB0aGVtKS4gKi8KIC8qIFJldmVyc2luZyB0aGUgc29ja2V0J3MgZHN0L3NyYyBwb2ludCBvZiB2aWV3IGdpdmVzIHVzIHRoZSByZXBseQpAQCAtMzUwLDIwICszMDksNiBAQAogCiBzdGF0aWMgaW50IGlwdjRfaW5pdF9uZXQoc3RydWN0IG5ldCAqbmV0KQogewotI2lmIGRlZmluZWQoQ09ORklHX1NZU0NUTCkgJiYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKQotCXN0cnVjdCBuZl9pcF9uZXQgKmluID0gJm5ldC0+Y3QubmZfY3RfcHJvdG87Ci0JaW4tPmN0bF90YWJsZSA9IGttZW1kdXAoaXBfY3Rfc3lzY3RsX3RhYmxlLAotCQkJCXNpemVvZihpcF9jdF9zeXNjdGxfdGFibGUpLAotCQkJCUdGUF9LRVJORUwpOwotCWlmICghaW4tPmN0bF90YWJsZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpbi0+Y3RsX3RhYmxlWzBdLmRhdGEgPSAmbmZfY29ubnRyYWNrX21heDsKLQlpbi0+Y3RsX3RhYmxlWzFdLmRhdGEgPSAmbmV0LT5jdC5jb3VudDsKLQlpbi0+Y3RsX3RhYmxlWzJdLmRhdGEgPSAmbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOwotCWluLT5jdGxfdGFibGVbM10uZGF0YSA9ICZuZXQtPmN0LnN5c2N0bF9jaGVja3N1bTsKLQlpbi0+Y3RsX3RhYmxlWzRdLmRhdGEgPSAmbmV0LT5jdC5zeXNjdGxfbG9nX2ludmFsaWQ7Ci0jZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzgwLDkgKzMyNSw2IEBACiAJLm5sYXR0cl90b190dXBsZSA9IGlwdjRfbmxhdHRyX3RvX3R1cGxlLAogCS5ubGFfcG9saWN5CSA9IGlwdjRfbmxhX3BvbGljeSwKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1NZU0NUTCkgJiYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKQotCS5jdGxfdGFibGVfcGF0aCAgPSAibmV0L2lwdjQvbmV0ZmlsdGVyIiwKLSNlbmRpZgogCS5pbml0X25ldAkgPSBpcHY0X2luaXRfbmV0LAogCS5tZQkJID0gVEhJU19NT0RVTEUsCiB9OwpAQCAtNDkyLDE2ICs0MzQsNyBAQAogCQlnb3RvIGNsZWFudXBfaWNtcHY0OwogCX0KIAotI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCkKLQlyZXQgPSBuZl9jb25udHJhY2tfaXB2NF9jb21wYXRfaW5pdCgpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGNsZWFudXBfcHJvdG87Ci0jZW5kaWYKIAlyZXR1cm4gcmV0OwotI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCkKLSBjbGVhbnVwX3Byb3RvOgotCW5mX2N0X2wzcHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NCk7Ci0jZW5kaWYKICBjbGVhbnVwX2ljbXB2NDoKIAluZl9jdF9sNHByb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX2ljbXApOwogIGNsZWFudXBfdWRwNDoKQEAgLTUyMCw5ICs0NTMsNiBAQAogc3RhdGljIHZvaWQgX19leGl0IG5mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfZmluaSh2b2lkKQogewogCXN5bmNocm9uaXplX25ldCgpOwotI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCkKLQluZl9jb25udHJhY2tfaXB2NF9jb21wYXRfZmluaSgpOwotI2VuZGlmCiAJbmZfY3RfbDNwcm90b191bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDNwcm90b19pcHY0KTsKIAluZl9jdF9sNHByb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX2ljbXApOwogCW5mX2N0X2w0cHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fdWRwNCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NF9jb21wYXQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0X2NvbXBhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzkyMzcxLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0X2NvbXBhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8qIGlwX2Nvbm50cmFjayBwcm9jIGNvbXBhdCAtIGJhc2VkIG9uIGlwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKLSAqCi0gKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCi0gKiAoQykgMjAwMi0yMDA2IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Ci0gKiAoQykgMjAwNi0yMDEwIFBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgotI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+Ci0jaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuaD4KLSNpbmNsdWRlIDxsaW51eC9yY3VsaXN0X251bGxzLmg+Ci0jaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+Ci0KLXN0cnVjdCBjdF9pdGVyX3N0YXRlIHsKLQlzdHJ1Y3Qgc2VxX25ldF9wcml2YXRlIHA7Ci0Jc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhhc2g7Ci0JdW5zaWduZWQgaW50IGh0YWJsZV9zaXplOwotCXVuc2lnbmVkIGludCBidWNrZXQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IGhsaXN0X251bGxzX25vZGUgKmN0X2dldF9maXJzdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKLXsKLQlzdHJ1Y3QgY3RfaXRlcl9zdGF0ZSAqc3QgPSBzZXEtPnByaXZhdGU7Ci0Jc3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47Ci0KLQlmb3IgKHN0LT5idWNrZXQgPSAwOwotCSAgICAgc3QtPmJ1Y2tldCA8IHN0LT5odGFibGVfc2l6ZTsKLQkgICAgIHN0LT5idWNrZXQrKykgewotCQluID0gcmN1X2RlcmVmZXJlbmNlKAotCQkJaGxpc3RfbnVsbHNfZmlyc3RfcmN1KCZzdC0+aGFzaFtzdC0+YnVja2V0XSkpOwotCQlpZiAoIWlzX2FfbnVsbHMobikpCi0JCQlyZXR1cm4gbjsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqY3RfZ2V0X25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsCi0JCQkJICAgICAgc3RydWN0IGhsaXN0X251bGxzX25vZGUgKmhlYWQpCi17Ci0Jc3RydWN0IGN0X2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwotCi0JaGVhZCA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9udWxsc19uZXh0X3JjdShoZWFkKSk7Ci0Jd2hpbGUgKGlzX2FfbnVsbHMoaGVhZCkpIHsKLQkJaWYgKGxpa2VseShnZXRfbnVsbHNfdmFsdWUoaGVhZCkgPT0gc3QtPmJ1Y2tldCkpIHsKLQkJCWlmICgrK3N0LT5idWNrZXQgPj0gc3QtPmh0YWJsZV9zaXplKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWhlYWQgPSByY3VfZGVyZWZlcmVuY2UoCi0JCQlobGlzdF9udWxsc19maXJzdF9yY3UoJnN0LT5oYXNoW3N0LT5idWNrZXRdKSk7Ci0JfQotCXJldHVybiBoZWFkOwotfQotCi1zdGF0aWMgc3RydWN0IGhsaXN0X251bGxzX25vZGUgKmN0X2dldF9pZHgoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCi17Ci0Jc3RydWN0IGhsaXN0X251bGxzX25vZGUgKmhlYWQgPSBjdF9nZXRfZmlyc3Qoc2VxKTsKLQotCWlmIChoZWFkKQotCQl3aGlsZSAocG9zICYmIChoZWFkID0gY3RfZ2V0X25leHQoc2VxLCBoZWFkKSkpCi0JCQlwb3MtLTsKLQlyZXR1cm4gcG9zID8gTlVMTCA6IGhlYWQ7Ci19Ci0KLXN0YXRpYyB2b2lkICpjdF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQotCV9fYWNxdWlyZXMoUkNVKQotewotCXN0cnVjdCBjdF9pdGVyX3N0YXRlICpzdCA9IHNlcS0+cHJpdmF0ZTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQotCW5mX2Nvbm50cmFja19nZXRfaHQoJnN0LT5oYXNoLCAmc3QtPmh0YWJsZV9zaXplKTsKLQlyZXR1cm4gY3RfZ2V0X2lkeChzZXEsICpwb3MpOwotfQotCi1zdGF0aWMgdm9pZCAqY3Rfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKLXsKLQkoKnBvcykrKzsKLQlyZXR1cm4gY3RfZ2V0X25leHQocywgdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGN0X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKLQlfX3JlbGVhc2VzKFJDVSkKLXsKLQlyY3VfcmVhZF91bmxvY2soKTsKLX0KLQotI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfU0VDTUFSSwotc3RhdGljIHZvaWQgY3Rfc2hvd19zZWNjdHgoc3RydWN0IHNlcV9maWxlICpzLCBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0JaW50IHJldDsKLQl1MzIgbGVuOwotCWNoYXIgKnNlY2N0eDsKLQotCXJldCA9IHNlY3VyaXR5X3NlY2lkX3RvX3NlY2N0eChjdC0+c2VjbWFyaywgJnNlY2N0eCwgJmxlbik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuOwotCi0Jc2VxX3ByaW50ZihzLCAic2VjY3R4PSVzICIsIHNlY2N0eCk7Ci0KLQlzZWN1cml0eV9yZWxlYXNlX3NlY2N0eChzZWNjdHgsIGxlbik7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGN0X3Nob3dfc2VjY3R4KHN0cnVjdCBzZXFfZmlsZSAqcywgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQotewotfQotI2VuZGlmCi0KLXN0YXRpYyBib29sIGN0X3NlcV9zaG91bGRfc2tpcChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldCAqbmV0LAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaGFzaCkKLXsKLQkvKiB3ZSBvbmx5IHdhbnQgdG8gcHJpbnQgRElSX09SSUdJTkFMICovCi0JaWYgKE5GX0NUX0RJUkVDVElPTihoYXNoKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlpZiAobmZfY3RfbDNudW0oY3QpICE9IEFGX0lORVQpCi0JCXJldHVybiB0cnVlOwotCi0JaWYgKCFuZXRfZXEobmZfY3RfbmV0KGN0KSwgbmV0KSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQgY3Rfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaGFzaCA9IHY7Ci0Jc3RydWN0IG5mX2Nvbm4gKmN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoYXNoKTsKLQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG87Ci0JY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvOwotCWludCByZXQgPSAwOwotCi0JTkZfQ1RfQVNTRVJUKGN0KTsKLQlpZiAoY3Rfc2VxX3Nob3VsZF9za2lwKGN0LCBzZXFfZmlsZV9uZXQocyksIGhhc2gpKQotCQlyZXR1cm4gMDsKLQotCWlmICh1bmxpa2VseSghYXRvbWljX2luY19ub3RfemVybygmY3QtPmN0X2dlbmVyYWwudXNlKSkpCi0JCXJldHVybiAwOwotCi0JLyogY2hlY2sgaWYgd2UgcmFjZWQgdy4gb2JqZWN0IHJldXNlICovCi0JaWYgKCFuZl9jdF9pc19jb25maXJtZWQoY3QpIHx8Ci0JICAgIGN0X3NlcV9zaG91bGRfc2tpcChjdCwgc2VxX2ZpbGVfbmV0KHMpLCBoYXNoKSkKLQkJZ290byByZWxlYXNlOwotCi0JbDNwcm90byA9IF9fbmZfY3RfbDNwcm90b19maW5kKG5mX2N0X2wzbnVtKGN0KSk7Ci0JTkZfQ1RfQVNTRVJUKGwzcHJvdG8pOwotCWw0cHJvdG8gPSBfX25mX2N0X2w0cHJvdG9fZmluZChuZl9jdF9sM251bShjdCksIG5mX2N0X3Byb3RvbnVtKGN0KSk7Ci0JTkZfQ1RfQVNTRVJUKGw0cHJvdG8pOwotCi0JcmV0ID0gLUVOT1NQQzsKLQlzZXFfcHJpbnRmKHMsICIlLThzICV1ICVsZCAiLAotCQkgICBsNHByb3RvLT5uYW1lLCBuZl9jdF9wcm90b251bShjdCksCi0JCSAgIHRpbWVyX3BlbmRpbmcoJmN0LT50aW1lb3V0KQotCQkgICA/IChsb25nKShjdC0+dGltZW91dC5leHBpcmVzIC0gamlmZmllcykvSFogOiAwKTsKLQotCWlmIChsNHByb3RvLT5wcmludF9jb25udHJhY2spCi0JCWw0cHJvdG8tPnByaW50X2Nvbm50cmFjayhzLCBjdCk7Ci0KLQlpZiAoc2VxX2hhc19vdmVyZmxvd2VkKHMpKQotCQlnb3RvIHJlbGVhc2U7Ci0KLQlwcmludF90dXBsZShzLCAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLAotCQkgICAgbDNwcm90bywgbDRwcm90byk7Ci0KLQlpZiAoc2VxX2hhc19vdmVyZmxvd2VkKHMpKQotCQlnb3RvIHJlbGVhc2U7Ci0KLQlpZiAoc2VxX3ByaW50X2FjY3QocywgY3QsIElQX0NUX0RJUl9PUklHSU5BTCkpCi0JCWdvdG8gcmVsZWFzZTsKLQotCWlmICghKHRlc3RfYml0KElQU19TRUVOX1JFUExZX0JJVCwgJmN0LT5zdGF0dXMpKSkKLQkJc2VxX3ByaW50ZihzLCAiW1VOUkVQTElFRF0gIik7Ci0KLQlwcmludF90dXBsZShzLCAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLAotCQkgICAgbDNwcm90bywgbDRwcm90byk7Ci0KLQlpZiAoc2VxX2hhc19vdmVyZmxvd2VkKHMpKQotCQlnb3RvIHJlbGVhc2U7Ci0KLQlpZiAoc2VxX3ByaW50X2FjY3QocywgY3QsIElQX0NUX0RJUl9SRVBMWSkpCi0JCWdvdG8gcmVsZWFzZTsKLQotCWlmICh0ZXN0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjdC0+c3RhdHVzKSkKLQkJc2VxX3ByaW50ZihzLCAiW0FTU1VSRURdICIpOwotCi0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19NQVJLCi0Jc2VxX3ByaW50ZihzLCAibWFyaz0ldSAiLCBjdC0+bWFyayk7Ci0jZW5kaWYKLQotCWN0X3Nob3dfc2VjY3R4KHMsIGN0KTsKLQotCXNlcV9wcmludGYocywgInVzZT0ldVxuIiwgYXRvbWljX3JlYWQoJmN0LT5jdF9nZW5lcmFsLnVzZSkpOwotCi0JaWYgKHNlcV9oYXNfb3ZlcmZsb3dlZChzKSkKLQkJZ290byByZWxlYXNlOwotCi0JcmV0ID0gMDsKLXJlbGVhc2U6Ci0JbmZfY3RfcHV0KGN0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGN0X3NlcV9vcHMgPSB7Ci0JLnN0YXJ0ID0gY3Rfc2VxX3N0YXJ0LAotCS5uZXh0ICA9IGN0X3NlcV9uZXh0LAotCS5zdG9wICA9IGN0X3NlcV9zdG9wLAotCS5zaG93ICA9IGN0X3NlcV9zaG93Ci19OwotCi1zdGF0aWMgaW50IGN0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNlcV9vcGVuX25ldChpbm9kZSwgZmlsZSwgJmN0X3NlcV9vcHMsCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBjdF9pdGVyX3N0YXRlKSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGN0X2ZpbGVfb3BzID0gewotCS5vd25lciAgID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgPSBjdF9vcGVuLAotCS5yZWFkICAgID0gc2VxX3JlYWQsCi0JLmxsc2VlayAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9uZXQsCi19OwotCi0vKiBleHBlY3RzICovCi1zdHJ1Y3QgY3RfZXhwZWN0X2l0ZXJfc3RhdGUgewotCXN0cnVjdCBzZXFfbmV0X3ByaXZhdGUgcDsKLQl1bnNpZ25lZCBpbnQgYnVja2V0OwotfTsKLQotc3RhdGljIHN0cnVjdCBobGlzdF9ub2RlICpjdF9leHBlY3RfZ2V0X2ZpcnN0KHN0cnVjdCBzZXFfZmlsZSAqc2VxKQotewotCXN0cnVjdCBjdF9leHBlY3RfaXRlcl9zdGF0ZSAqc3QgPSBzZXEtPnByaXZhdGU7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm47Ci0KLQlmb3IgKHN0LT5idWNrZXQgPSAwOyBzdC0+YnVja2V0IDwgbmZfY3RfZXhwZWN0X2hzaXplOyBzdC0+YnVja2V0KyspIHsKLQkJbiA9IHJjdV9kZXJlZmVyZW5jZSgKLQkJCWhsaXN0X2ZpcnN0X3JjdSgmbmZfY3RfZXhwZWN0X2hhc2hbc3QtPmJ1Y2tldF0pKTsKLQkJaWYgKG4pCi0JCQlyZXR1cm4gbjsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaGxpc3Rfbm9kZSAqY3RfZXhwZWN0X2dldF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLAotCQkJCQkgICAgIHN0cnVjdCBobGlzdF9ub2RlICpoZWFkKQotewotCXN0cnVjdCBjdF9leHBlY3RfaXRlcl9zdGF0ZSAqc3QgPSBzZXEtPnByaXZhdGU7Ci0KLQloZWFkID0gcmN1X2RlcmVmZXJlbmNlKGhsaXN0X25leHRfcmN1KGhlYWQpKTsKLQl3aGlsZSAoaGVhZCA9PSBOVUxMKSB7Ci0JCWlmICgrK3N0LT5idWNrZXQgPj0gbmZfY3RfZXhwZWN0X2hzaXplKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWhlYWQgPSByY3VfZGVyZWZlcmVuY2UoCi0JCQlobGlzdF9maXJzdF9yY3UoJm5mX2N0X2V4cGVjdF9oYXNoW3N0LT5idWNrZXRdKSk7Ci0JfQotCXJldHVybiBoZWFkOwotfQotCi1zdGF0aWMgc3RydWN0IGhsaXN0X25vZGUgKmN0X2V4cGVjdF9nZXRfaWR4KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgcG9zKQotewotCXN0cnVjdCBobGlzdF9ub2RlICpoZWFkID0gY3RfZXhwZWN0X2dldF9maXJzdChzZXEpOwotCi0JaWYgKGhlYWQpCi0JCXdoaWxlIChwb3MgJiYgKGhlYWQgPSBjdF9leHBlY3RfZ2V0X25leHQoc2VxLCBoZWFkKSkpCi0JCQlwb3MtLTsKLQlyZXR1cm4gcG9zID8gTlVMTCA6IGhlYWQ7Ci19Ci0KLXN0YXRpYyB2b2lkICpleHBfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKLQlfX2FjcXVpcmVzKFJDVSkKLXsKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JcmV0dXJuIGN0X2V4cGVjdF9nZXRfaWR4KHNlcSwgKnBvcyk7Ci19Ci0KLXN0YXRpYyB2b2lkICpleHBfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQotewotCSgqcG9zKSsrOwotCXJldHVybiBjdF9leHBlY3RfZ2V0X25leHQoc2VxLCB2KTsKLX0KLQotc3RhdGljIHZvaWQgZXhwX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQotCV9fcmVsZWFzZXMoUkNVKQotewotCXJjdV9yZWFkX3VubG9jaygpOwotfQotCi1zdGF0aWMgaW50IGV4cF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCi17Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cDsKLQljb25zdCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbiA9IHY7Ci0KLQlleHAgPSBobGlzdF9lbnRyeShuLCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCwgaG5vZGUpOwotCi0JaWYgKCFuZXRfZXEobmZfY3RfbmV0KGV4cC0+bWFzdGVyKSwgc2VxX2ZpbGVfbmV0KHMpKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZXhwLT50dXBsZS5zcmMubDNudW0gIT0gQUZfSU5FVCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZXhwLT50aW1lb3V0LmZ1bmN0aW9uKQotCQlzZXFfcHJpbnRmKHMsICIlbGQgIiwgdGltZXJfcGVuZGluZygmZXhwLT50aW1lb3V0KQotCQkJICAgPyAobG9uZykoZXhwLT50aW1lb3V0LmV4cGlyZXMgLSBqaWZmaWVzKS9IWiA6IDApOwotCWVsc2UKLQkJc2VxX3ByaW50ZihzLCAiLSAiKTsKLQotCXNlcV9wcmludGYocywgInByb3RvPSV1ICIsIGV4cC0+dHVwbGUuZHN0LnByb3RvbnVtKTsKLQotCXByaW50X3R1cGxlKHMsICZleHAtPnR1cGxlLAotCQkgICAgX19uZl9jdF9sM3Byb3RvX2ZpbmQoZXhwLT50dXBsZS5zcmMubDNudW0pLAotCQkgICAgX19uZl9jdF9sNHByb3RvX2ZpbmQoZXhwLT50dXBsZS5zcmMubDNudW0sCi0JCQkJCSBleHAtPnR1cGxlLmRzdC5wcm90b251bSkpOwotCXNlcV9wdXRjKHMsICdcbicpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZXhwX3NlcV9vcHMgPSB7Ci0JLnN0YXJ0ID0gZXhwX3NlcV9zdGFydCwKLQkubmV4dCA9IGV4cF9zZXFfbmV4dCwKLQkuc3RvcCA9IGV4cF9zZXFfc3RvcCwKLQkuc2hvdyA9IGV4cF9zZXFfc2hvdwotfTsKLQotc3RhdGljIGludCBleHBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2VxX29wZW5fbmV0KGlub2RlLCBmaWxlLCAmZXhwX3NlcV9vcHMsCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBjdF9leHBlY3RfaXRlcl9zdGF0ZSkpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcF9leHBfZmlsZV9vcHMgPSB7Ci0JLm93bmVyICAgPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICA9IGV4cF9vcGVuLAotCS5yZWFkICAgID0gc2VxX3JlYWQsCi0JLmxsc2VlayAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9uZXQsCi19OwotCi1zdGF0aWMgdm9pZCAqY3RfY3B1X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IG5ldCAqbmV0ID0gc2VxX2ZpbGVfbmV0KHNlcSk7Ci0JaW50IGNwdTsKLQotCWlmICgqcG9zID09IDApCi0JCXJldHVybiBTRVFfU1RBUlRfVE9LRU47Ci0KLQlmb3IgKGNwdSA9ICpwb3MtMTsgY3B1IDwgbnJfY3B1X2lkczsgKytjcHUpIHsKLQkJaWYgKCFjcHVfcG9zc2libGUoY3B1KSkKLQkJCWNvbnRpbnVlOwotCQkqcG9zID0gY3B1KzE7Ci0JCXJldHVybiBwZXJfY3B1X3B0cihuZXQtPmN0LnN0YXQsIGNwdSk7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkICpjdF9jcHVfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBuZXQgKm5ldCA9IHNlcV9maWxlX25ldChzZXEpOwotCWludCBjcHU7Ci0KLQlmb3IgKGNwdSA9ICpwb3M7IGNwdSA8IG5yX2NwdV9pZHM7ICsrY3B1KSB7Ci0JCWlmICghY3B1X3Bvc3NpYmxlKGNwdSkpCi0JCQljb250aW51ZTsKLQkJKnBvcyA9IGNwdSsxOwotCQlyZXR1cm4gcGVyX2NwdV9wdHIobmV0LT5jdC5zdGF0LCBjcHUpOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBjdF9jcHVfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCi17Ci19Ci0KLXN0YXRpYyBpbnQgY3RfY3B1X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQotewotCXN0cnVjdCBuZXQgKm5ldCA9IHNlcV9maWxlX25ldChzZXEpOwotCXVuc2lnbmVkIGludCBucl9jb25udHJhY2tzID0gYXRvbWljX3JlYWQoJm5ldC0+Y3QuY291bnQpOwotCWNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfc3RhdCAqc3QgPSB2OwotCi0JaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7Ci0JCXNlcV9wcmludGYoc2VxLCAiZW50cmllcyAgc2VhcmNoZWQgZm91bmQgbmV3IGludmFsaWQgaWdub3JlIGRlbGV0ZSBkZWxldGVfbGlzdCBpbnNlcnQgaW5zZXJ0X2ZhaWxlZCBkcm9wIGVhcmx5X2Ryb3AgaWNtcF9lcnJvciAgZXhwZWN0X25ldyBleHBlY3RfY3JlYXRlIGV4cGVjdF9kZWxldGUgc2VhcmNoX3Jlc3RhcnRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzZXFfcHJpbnRmKHNlcSwgIiUwOHggICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggIgotCQkJIiUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAgJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKLQkJICAgbnJfY29ubnRyYWNrcywKLQkJICAgc3QtPnNlYXJjaGVkLAotCQkgICBzdC0+Zm91bmQsCi0JCSAgIHN0LT5uZXcsCi0JCSAgIHN0LT5pbnZhbGlkLAotCQkgICBzdC0+aWdub3JlLAotCQkgICBzdC0+ZGVsZXRlLAotCQkgICBzdC0+ZGVsZXRlX2xpc3QsCi0JCSAgIHN0LT5pbnNlcnQsCi0JCSAgIHN0LT5pbnNlcnRfZmFpbGVkLAotCQkgICBzdC0+ZHJvcCwKLQkJICAgc3QtPmVhcmx5X2Ryb3AsCi0JCSAgIHN0LT5lcnJvciwKLQotCQkgICBzdC0+ZXhwZWN0X25ldywKLQkJICAgc3QtPmV4cGVjdF9jcmVhdGUsCi0JCSAgIHN0LT5leHBlY3RfZGVsZXRlLAotCQkgICBzdC0+c2VhcmNoX3Jlc3RhcnQKLQkJKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjdF9jcHVfc2VxX29wcyA9IHsKLQkuc3RhcnQgID0gY3RfY3B1X3NlcV9zdGFydCwKLQkubmV4dCAgID0gY3RfY3B1X3NlcV9uZXh0LAotCS5zdG9wICAgPSBjdF9jcHVfc2VxX3N0b3AsCi0JLnNob3cgICA9IGN0X2NwdV9zZXFfc2hvdywKLX07Ci0KLXN0YXRpYyBpbnQgY3RfY3B1X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzZXFfb3Blbl9uZXQoaW5vZGUsIGZpbGUsICZjdF9jcHVfc2VxX29wcywKLQkJCSAgICBzaXplb2Yoc3RydWN0IHNlcV9uZXRfcHJpdmF0ZSkpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjdF9jcHVfc2VxX2ZvcHMgPSB7Ci0JLm93bmVyICAgPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICA9IGN0X2NwdV9zZXFfb3BlbiwKLQkucmVhZCAgICA9IHNlcV9yZWFkLAotCS5sbHNlZWsgID0gc2VxX2xzZWVrLAotCS5yZWxlYXNlID0gc2VxX3JlbGVhc2VfbmV0LAotfTsKLQotc3RhdGljIGludCBfX25ldF9pbml0IGlwX2Nvbm50cmFja19uZXRfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jLCAqcHJvY19leHAsICpwcm9jX3N0YXQ7Ci0KLQlwcm9jID0gcHJvY19jcmVhdGUoImlwX2Nvbm50cmFjayIsIDA0NDAsIG5ldC0+cHJvY19uZXQsICZjdF9maWxlX29wcyk7Ci0JaWYgKCFwcm9jKQotCQlnb3RvIGVycjE7Ci0KLQlwcm9jX2V4cCA9IHByb2NfY3JlYXRlKCJpcF9jb25udHJhY2tfZXhwZWN0IiwgMDQ0MCwgbmV0LT5wcm9jX25ldCwKLQkJCSAgICAgICAmaXBfZXhwX2ZpbGVfb3BzKTsKLQlpZiAoIXByb2NfZXhwKQotCQlnb3RvIGVycjI7Ci0KLQlwcm9jX3N0YXQgPSBwcm9jX2NyZWF0ZSgiaXBfY29ubnRyYWNrIiwgU19JUlVHTywKLQkJCQluZXQtPnByb2NfbmV0X3N0YXQsICZjdF9jcHVfc2VxX2ZvcHMpOwotCWlmICghcHJvY19zdGF0KQotCQlnb3RvIGVycjM7Ci0JcmV0dXJuIDA7Ci0KLWVycjM6Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImlwX2Nvbm50cmFja19leHBlY3QiLCBuZXQtPnByb2NfbmV0KTsKLWVycjI6Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImlwX2Nvbm50cmFjayIsIG5ldC0+cHJvY19uZXQpOwotZXJyMToKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIHZvaWQgX19uZXRfZXhpdCBpcF9jb25udHJhY2tfbmV0X2V4aXQoc3RydWN0IG5ldCAqbmV0KQotewotCXJlbW92ZV9wcm9jX2VudHJ5KCJpcF9jb25udHJhY2siLCBuZXQtPnByb2NfbmV0X3N0YXQpOwotCXJlbW92ZV9wcm9jX2VudHJ5KCJpcF9jb25udHJhY2tfZXhwZWN0IiwgbmV0LT5wcm9jX25ldCk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImlwX2Nvbm50cmFjayIsIG5ldC0+cHJvY19uZXQpOwotfQotCi1zdGF0aWMgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIGlwX2Nvbm50cmFja19uZXRfb3BzID0gewotCS5pbml0ID0gaXBfY29ubnRyYWNrX25ldF9pbml0LAotCS5leGl0ID0gaXBfY29ubnRyYWNrX25ldF9leGl0LAotfTsKLQotaW50IF9faW5pdCBuZl9jb25udHJhY2tfaXB2NF9jb21wYXRfaW5pdCh2b2lkKQotewotCXJldHVybiByZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZpcF9jb25udHJhY2tfbmV0X29wcyk7Ci19Ci0KLXZvaWQgX19leGl0IG5mX2Nvbm50cmFja19pcHY0X2NvbXBhdF9maW5pKHZvaWQpCi17Ci0JdW5yZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZpcF9jb25udHJhY2tfbmV0X29wcyk7Ci19CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCmluZGV4IGM1NjdlMWIuLmQwNzViM2MgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAkJcmV0dXJuIC1ORl9BQ0NFUFQ7CiAJfQogCi0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCisJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggKi8KIAlpbm5lcnByb3RvID0gX19uZl9jdF9sNHByb3RvX2ZpbmQoUEZfSU5FVCwgb3JpZ3R1cGxlLmRzdC5wcm90b251bSk7CiAKIAkvKiBPcmRpbmFyaWx5LCB3ZSdkIGV4cGVjdCB0aGUgaW52ZXJ0ZWQgdHVwbGVwcm90bywgYnV0IGl0J3MKQEAgLTMyNywxNyArMzI3LDYgQEAKIAl9LAogCXsgfQogfTsKLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCi1zdGF0aWMgc3RydWN0IGN0bF90YWJsZSBpY21wX2NvbXBhdF9zeXNjdGxfdGFibGVbXSA9IHsKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfaWNtcF90aW1lb3V0IiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsgfQotfTsKLSNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUICovCiAjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwogCiBzdGF0aWMgaW50IGljbXBfa21lbWR1cF9zeXNjdGxfdGFibGUoc3RydWN0IG5mX3Byb3RvX25ldCAqcG4sCkBAIC0zNTUsNDAgKzM0NCwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGljbXBfa21lbWR1cF9jb21wYXRfc3lzY3RsX3RhYmxlKHN0cnVjdCBuZl9wcm90b19uZXQgKnBuLAotCQkJCQkgICAgc3RydWN0IG5mX2ljbXBfbmV0ICppbikKLXsKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAotCXBuLT5jdGxfY29tcGF0X3RhYmxlID0ga21lbWR1cChpY21wX2NvbXBhdF9zeXNjdGxfdGFibGUsCi0JCQkJICAgICAgIHNpemVvZihpY21wX2NvbXBhdF9zeXNjdGxfdGFibGUpLAotCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIXBuLT5jdGxfY29tcGF0X3RhYmxlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzBdLmRhdGEgPSAmaW4tPnRpbWVvdXQ7Ci0jZW5kaWYKLSNlbmRpZgotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGljbXBfaW5pdF9uZXQoc3RydWN0IG5ldCAqbmV0LCB1X2ludDE2X3QgcHJvdG8pCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgbmZfaWNtcF9uZXQgKmluID0gaWNtcF9wZXJuZXQobmV0KTsKIAlzdHJ1Y3QgbmZfcHJvdG9fbmV0ICpwbiA9ICZpbi0+cG47CiAKIAlpbi0+dGltZW91dCA9IG5mX2N0X2ljbXBfdGltZW91dDsKIAotCXJldCA9IGljbXBfa21lbWR1cF9jb21wYXRfc3lzY3RsX3RhYmxlKHBuLCBpbik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBpY21wX2ttZW1kdXBfc3lzY3RsX3RhYmxlKHBuLCBpbik7Ci0JaWYgKHJldCA8IDApCi0JCW5mX2N0X2tmcmVlX2NvbXBhdF9zeXNjdGxfdGFibGUocG4pOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gaWNtcF9rbWVtZHVwX3N5c2N0bF90YWJsZShwbiwgaW4pOwogfQogCiBzdGF0aWMgc3RydWN0IG5mX3Byb3RvX25ldCAqaWNtcF9nZXRfbmV0X3Byb3RvKHN0cnVjdCBuZXQgKm5ldCkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9kdXBfaXB2NC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2R1cF9pcHY0LmMKaW5kZXggY2ViMTg3My4uY2Y5ODZlMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2R1cF9pcHY0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2R1cF9pcHY0LmMKQEAgLTc0LDIxICs3NCwxOSBAQAogCW5mX2Nvbm50cmFja19nZXQoc2tiLT5uZmN0KTsKICNlbmRpZgogCS8qCi0JICogSWYgd2UgYXJlIGluIFBSRVJPVVRJTkcvSU5QVVQsIHRoZSBjaGVja3N1bSBtdXN0IGJlIHJlY2FsY3VsYXRlZAotCSAqIHNpbmNlIHRoZSBsZW5ndGggY291bGQgaGF2ZSBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIGRlZnJhZ21lbnRhdGlvbi4KLQkgKgotCSAqIFdlIGFsc28gZGVjcmVhc2UgdGhlIFRUTCB0byBtaXRpZ2F0ZSBwb3RlbnRpYWwgbG9vcHMgYmV0d2VlbiB0d28KLQkgKiBob3N0cy4KKwkgKiBJZiB3ZSBhcmUgaW4gUFJFUk9VVElORy9JTlBVVCwgZGVjcmVhc2UgdGhlIFRUTCB0byBtaXRpZ2F0ZSBwb3RlbnRpYWwKKwkgKiBsb29wcyBiZXR3ZWVuIHR3byBob3N0cy4KIAkgKgogCSAqIFNldCAlSVBfREYgc28gdGhhdCB0aGUgb3JpZ2luYWwgc291cmNlIGlzIG5vdGlmaWVkIG9mIGEgcG90ZW50aWFsbHkKIAkgKiBkZWNyZWFzZWQgTVRVIG9uIHRoZSBjbG9uZSByb3V0ZS4gSVB2NiBkb2VzIHRoaXMgdG9vLgorCSAqCisJICogSVAgaGVhZGVyIGNoZWNrc3VtIHdpbGwgYmUgcmVjYWxjdWxhdGVkIGF0IGlwX2xvY2FsX291dC4KIAkgKi8KIAlpcGggPSBpcF9oZHIoc2tiKTsKIAlpcGgtPmZyYWdfb2ZmIHw9IGh0b25zKElQX0RGKTsKIAlpZiAoaG9va251bSA9PSBORl9JTkVUX1BSRV9ST1VUSU5HIHx8CiAJICAgIGhvb2tudW0gPT0gTkZfSU5FVF9MT0NBTF9JTikKIAkJLS1pcGgtPnR0bDsKLQlpcF9zZW5kX2NoZWNrKGlwaCk7CiAKIAlpZiAobmZfZHVwX2lwdjRfcm91dGUobmV0LCBza2IsIGd3LCBvaWYpKSB7CiAJCV9fdGhpc19jcHVfd3JpdGUobmZfc2tiX2R1cGxpY2F0ZWQsIHRydWUpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2xvZ19hcnAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9sb2dfYXJwLmMKaW5kZXggZTdhZDk1MC4uYjI0Nzk1ZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2xvZ19hcnAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbG9nX2FycC5jCkBAIC0zMCw3ICszMCw3IEBACiAJLnUgPSB7CiAJCS5sb2cgPSB7CiAJCQkubGV2ZWwJICA9IExPR0xFVkVMX05PVElDRSwKLQkJCS5sb2dmbGFncyA9IE5GX0xPR19NQVNLLAorCQkJLmxvZ2ZsYWdzID0gTkZfTE9HX0RFRkFVTFRfTUFTSywKIAkJfSwKIAl9LAogfTsKQEAgLTYyLDcgKzYyLDcgQEAKIAkvKiBJZiBpdCdzIGZvciBFdGhlcm5ldCBhbmQgdGhlIGxlbmd0aHMgYXJlIE9LLCB0aGVuIGxvZyB0aGUgQVJQCiAJICogcGF5bG9hZC4KIAkgKi8KLQlpZiAoYWgtPmFyX2hyZCAhPSBodG9ucygxKSB8fAorCWlmIChhaC0+YXJfaHJkICE9IGh0b25zKEFSUEhSRF9FVEhFUikgfHwKIAkgICAgYWgtPmFyX2hsbiAhPSBFVEhfQUxFTiB8fAogCSAgICBhaC0+YXJfcGxuICE9IHNpemVvZihfX2JlMzIpKQogCQlyZXR1cm47CkBAIC0xMTEsOCArMTExLDcgQEAKIAogc3RhdGljIGludCBfX25ldF9pbml0IG5mX2xvZ19hcnBfbmV0X2luaXQoc3RydWN0IG5ldCAqbmV0KQogewotCW5mX2xvZ19zZXQobmV0LCBORlBST1RPX0FSUCwgJm5mX2FycF9sb2dnZXIpOwotCXJldHVybiAwOworCXJldHVybiBuZl9sb2dfc2V0KG5ldCwgTkZQUk9UT19BUlAsICZuZl9hcnBfbG9nZ2VyKTsKIH0KIAogc3RhdGljIHZvaWQgX19uZXRfZXhpdCBuZl9sb2dfYXJwX25ldF9leGl0KHN0cnVjdCBuZXQgKm5ldCkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9sb2dfaXB2NC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2xvZ19pcHY0LmMKaW5kZXggMDc2YWFkZC4uODU2NjQ4OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2xvZ19pcHY0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2xvZ19pcHY0LmMKQEAgLTI5LDcgKzI5LDcgQEAKIAkudSA9IHsKIAkJLmxvZyA9IHsKIAkJCS5sZXZlbAkgID0gTE9HTEVWRUxfTk9USUNFLAotCQkJLmxvZ2ZsYWdzID0gTkZfTE9HX01BU0ssCisJCQkubG9nZmxhZ3MgPSBORl9MT0dfREVGQVVMVF9NQVNLLAogCQl9LAogCX0sCiB9OwpAQCAtNDYsNyArNDYsNyBAQAogCWlmIChpbmZvLT50eXBlID09IE5GX0xPR19UWVBFX0xPRykKIAkJbG9nZmxhZ3MgPSBpbmZvLT51LmxvZy5sb2dmbGFnczsKIAllbHNlCi0JCWxvZ2ZsYWdzID0gTkZfTE9HX01BU0s7CisJCWxvZ2ZsYWdzID0gTkZfTE9HX0RFRkFVTFRfTUFTSzsKIAogCWloID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBob2ZmLCBzaXplb2YoX2lwaCksICZfaXBoKTsKIAlpZiAoaWggPT0gTlVMTCkgewpAQCAtNzYsNyArNzYsNyBAQAogCWlmIChudG9ocyhpaC0+ZnJhZ19vZmYpICYgSVBfT0ZGU0VUKQogCQluZl9sb2dfYnVmX2FkZChtLCAiRlJBRzoldSAiLCBudG9ocyhpaC0+ZnJhZ19vZmYpICYgSVBfT0ZGU0VUKTsKIAotCWlmICgobG9nZmxhZ3MgJiBYVF9MT0dfSVBPUFQpICYmCisJaWYgKChsb2dmbGFncyAmIE5GX0xPR19JUE9QVCkgJiYKIAkgICAgaWgtPmlobCAqIDQgPiBzaXplb2Yoc3RydWN0IGlwaGRyKSkgewogCQljb25zdCB1bnNpZ25lZCBjaGFyICpvcDsKIAkJdW5zaWduZWQgY2hhciBfb3B0WzQgKiAxNSAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpXTsKQEAgLTI1MCw3ICsyNTAsNyBAQAogCX0KIAogCS8qIE1heCBsZW5ndGg6IDE1ICJVSUQ9NDI5NDk2NzI5NSAiICovCi0JaWYgKChsb2dmbGFncyAmIFhUX0xPR19VSUQpICYmICFpcGhvZmYpCisJaWYgKChsb2dmbGFncyAmIE5GX0xPR19VSUQpICYmICFpcGhvZmYpCiAJCW5mX2xvZ19kdW1wX3NrX3VpZF9naWQobSwgc2tiLT5zayk7CiAKIAkvKiBNYXggbGVuZ3RoOiAxNiAiTUFSSz0weEZGRkZGRkZGICIgKi8KQEAgLTI4Miw3ICsyODIsNyBAQAogCWlmIChpbmZvLT50eXBlID09IE5GX0xPR19UWVBFX0xPRykKIAkJbG9nZmxhZ3MgPSBpbmZvLT51LmxvZy5sb2dmbGFnczsKIAotCWlmICghKGxvZ2ZsYWdzICYgWFRfTE9HX01BQ0RFQ09ERSkpCisJaWYgKCEobG9nZmxhZ3MgJiBORl9MT0dfTUFDREVDT0RFKSkKIAkJZ290byBmYWxsYmFjazsKIAogCXN3aXRjaCAoZGV2LT50eXBlKSB7CkBAIC0zNDcsOCArMzQ3LDcgQEAKIAogc3RhdGljIGludCBfX25ldF9pbml0IG5mX2xvZ19pcHY0X25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKIHsKLQluZl9sb2dfc2V0KG5ldCwgTkZQUk9UT19JUFY0LCAmbmZfaXBfbG9nZ2VyKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gbmZfbG9nX3NldChuZXQsIE5GUFJPVE9fSVBWNCwgJm5mX2lwX2xvZ2dlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fbmV0X2V4aXQgbmZfbG9nX2lwdjRfbmV0X2V4aXQoc3RydWN0IG5ldCAqbmV0KQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19ncmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fZ3JlLmMKaW5kZXggOTQxNDkyMy4uZWRmMDUwMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19ncmUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2dyZS5jCkBAIC04OCw4ICs4OCw4IEBACiAJICAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCiAJICAgICAgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUpCiB7Ci0JY29uc3Qgc3RydWN0IGdyZV9oZHIgKmdyZWg7Ci0Jc3RydWN0IGdyZV9oZHJfcHB0cCAqcGdyZWg7CisJY29uc3Qgc3RydWN0IGdyZV9iYXNlX2hkciAqZ3JlaDsKKwlzdHJ1Y3QgcHB0cF9ncmVfaGVhZGVyICpwZ3JlaDsKIAogCS8qIHBncmVoIGluY2x1ZGVzIHR3byBvcHRpb25hbCAzMmJpdCBmaWVsZHMgd2hpY2ggYXJlIG5vdCByZXF1aXJlZAogCSAqIHRvIGJlIHRoZXJlLiAgVGhhdCdzIHdoZXJlIHRoZSBtYWdpYyAnOCcgY29tZXMgZnJvbSAqLwpAQCAtOTcsMTggKzk3LDE5IEBACiAJCXJldHVybiBmYWxzZTsKIAogCWdyZWggPSAodm9pZCAqKXNrYi0+ZGF0YSArIGhkcm9mZjsKLQlwZ3JlaCA9IChzdHJ1Y3QgZ3JlX2hkcl9wcHRwICopZ3JlaDsKKwlwZ3JlaCA9IChzdHJ1Y3QgcHB0cF9ncmVfaGVhZGVyICopZ3JlaDsKIAogCS8qIHdlIG9ubHkgaGF2ZSBkZXN0aW5hdGlvbiBtYW5pcCBvZiBhIHBhY2tldCwgc2luY2UgJ3NvdXJjZSBrZXknCiAJICogaXMgbm90IHByZXNlbnQgaW4gdGhlIHBhY2tldCBpdHNlbGYgKi8KIAlpZiAobWFuaXB0eXBlICE9IE5GX05BVF9NQU5JUF9EU1QpCiAJCXJldHVybiB0cnVlOwotCXN3aXRjaCAoZ3JlaC0+dmVyc2lvbikgewotCWNhc2UgR1JFX1ZFUlNJT05fMTcwMToKKworCXN3aXRjaCAoZ3JlaC0+ZmxhZ3MgJiBHUkVfVkVSU0lPTikgeworCWNhc2UgR1JFX1ZFUlNJT05fMDoKIAkJLyogV2UgZG8gbm90IGN1cnJlbnRseSBOQVQgYW55IEdSRXYwIHBhY2tldHMuCiAJCSAqIFRyeSB0byBiZWhhdmUgbGlrZSAibmZfbmF0X3Byb3RvX3Vua25vd24iICovCiAJCWJyZWFrOwotCWNhc2UgR1JFX1ZFUlNJT05fUFBUUDoKKwljYXNlIEdSRV9WRVJTSU9OXzE6CiAJCXByX2RlYnVnKCJjYWxsX2lkIC0+IDB4JTA0eFxuIiwgbnRvaHModHVwbGUtPmRzdC51LmdyZS5rZXkpKTsKIAkJcGdyZWgtPmNhbGxfaWQgPSB0dXBsZS0+ZHN0LnUuZ3JlLmtleTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfdGFibGVzX2FycC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX3RhYmxlc19hcnAuYwppbmRleCBjZDg0ZDQyLi44MDVjOGRkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfdGFibGVzX2FycC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl90YWJsZXNfYXJwLmMKQEAgLTIxLDcgKzIxLDcgQEAKIHsKIAlzdHJ1Y3QgbmZ0X3BrdGluZm8gcGt0OwogCi0JbmZ0X3NldF9wa3RpbmZvKCZwa3QsIHNrYiwgc3RhdGUpOworCW5mdF9zZXRfcGt0aW5mb191bnNwZWMoJnBrdCwgc2tiLCBzdGF0ZSk7CiAKIAlyZXR1cm4gbmZ0X2RvX2NoYWluKCZwa3QsIHByaXYpOwogfQpAQCAtODAsNyArODAsMTAgQEAKIHsKIAlpbnQgcmV0OwogCi0JbmZ0X3JlZ2lzdGVyX2NoYWluX3R5cGUoJmZpbHRlcl9hcnApOworCXJldCA9IG5mdF9yZWdpc3Rlcl9jaGFpbl90eXBlKCZmaWx0ZXJfYXJwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwogCXJldCA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm5mX3RhYmxlc19hcnBfbmV0X29wcyk7CiAJaWYgKHJldCA8IDApCiAJCW5mdF91bnJlZ2lzdGVyX2NoYWluX3R5cGUoJmZpbHRlcl9hcnApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjQuYwppbmRleCBlNDRiYTNiLi4yODQwYTI5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjQuYwpAQCAtMTAzLDcgKzEwMywxMCBAQAogewogCWludCByZXQ7CiAKLQluZnRfcmVnaXN0ZXJfY2hhaW5fdHlwZSgmZmlsdGVyX2lwdjQpOworCXJldCA9IG5mdF9yZWdpc3Rlcl9jaGFpbl90eXBlKCZmaWx0ZXJfaXB2NCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKIAlyZXQgPSByZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZuZl90YWJsZXNfaXB2NF9uZXRfb3BzKTsKIAlpZiAocmV0IDwgMCkKIAkJbmZ0X3VucmVnaXN0ZXJfY2hhaW5fdHlwZSgmZmlsdGVyX2lwdjQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mdF9jaGFpbl9yb3V0ZV9pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X2NoYWluX3JvdXRlX2lwdjQuYwppbmRleCAyMzc1YjBhLi4zMDQ5M2JlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X2NoYWluX3JvdXRlX2lwdjQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X2NoYWluX3JvdXRlX2lwdjQuYwpAQCAtMzEsNiArMzEsNyBAQAogCV9fYmUzMiBzYWRkciwgZGFkZHI7CiAJdV9pbnQ4X3QgdG9zOwogCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoOworCWludCBlcnI7CiAKIAkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KIAlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKSB8fApAQCAtNDYsMTUgKzQ3LDE3IEBACiAJdG9zID0gaXBoLT50b3M7CiAKIAlyZXQgPSBuZnRfZG9fY2hhaW4oJnBrdCwgcHJpdik7Ci0JaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9RVUVVRSkgeworCWlmIChyZXQgIT0gTkZfRFJPUCAmJiByZXQgIT0gTkZfU1RPTEVOKSB7CiAJCWlwaCA9IGlwX2hkcihza2IpOwogCiAJCWlmIChpcGgtPnNhZGRyICE9IHNhZGRyIHx8CiAJCSAgICBpcGgtPmRhZGRyICE9IGRhZGRyIHx8CiAJCSAgICBza2ItPm1hcmsgIT0gbWFyayB8fAotCQkgICAgaXBoLT50b3MgIT0gdG9zKQotCQkJaWYgKGlwX3JvdXRlX21lX2hhcmRlcihzdGF0ZS0+bmV0LCBza2IsIFJUTl9VTlNQRUMpKQotCQkJCXJldCA9IE5GX0RST1A7CisJCSAgICBpcGgtPnRvcyAhPSB0b3MpIHsKKwkJCWVyciA9IGlwX3JvdXRlX21lX2hhcmRlcihzdGF0ZS0+bmV0LCBza2IsIFJUTl9VTlNQRUMpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0ID0gTkZfRFJPUF9FUlIoZXJyKTsKKwkJfQogCX0KIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mdF9yZWplY3RfaXB2NC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mdF9yZWplY3RfaXB2NC5jCmluZGV4IGMyNGY0MWMuLjJjMjU1M2IgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZnRfcmVqZWN0X2lwdjQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pcHY0LmMKQEAgLTQ2LDYgKzQ2LDcgQEAKIAkuZXZhbAkJPSBuZnRfcmVqZWN0X2lwdjRfZXZhbCwKIAkuaW5pdAkJPSBuZnRfcmVqZWN0X2luaXQsCiAJLmR1bXAJCT0gbmZ0X3JlamVjdF9kdW1wLAorCS52YWxpZGF0ZQk9IG5mdF9yZWplY3RfdmFsaWRhdGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X3JlamVjdF9pcHY0X3R5cGUgX19yZWFkX21vc3RseSA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3Byb2MuYyBiL25ldC9pcHY0L3Byb2MuYwppbmRleCA5ZjY2NWI2Li43MTQzY2ExIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9wcm9jLmMKKysrIGIvbmV0L2lwdjQvcHJvYy5jCkBAIC00Niw2ICs0Niw4IEBACiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcmF3Lmg+CiAKKyNkZWZpbmUgVENQVURQX01JQl9NQVggbWF4X3QodTMyLCBVRFBfTUlCX01BWCwgVENQX01JQl9NQVgpCisKIC8qCiAgKglSZXBvcnQgc29ja2V0IGFsbG9jYXRpb24gc3RhdGlzdGljcyBbbWVhQHV0dS5maV0KICAqLwpAQCAtMjU3LDYgKzI1OSw3IEBACiAJU05NUF9NSUJfSVRFTSgiVENQU3B1cmlvdXNSVE9zIiwgTElOVVhfTUlCX1RDUFNQVVJJT1VTUlRPUyksCiAJU05NUF9NSUJfSVRFTSgiVENQTUQ1Tm90Rm91bmQiLCBMSU5VWF9NSUJfVENQTUQ1Tk9URk9VTkQpLAogCVNOTVBfTUlCX0lURU0oIlRDUE1ENVVuZXhwZWN0ZWQiLCBMSU5VWF9NSUJfVENQTUQ1VU5FWFBFQ1RFRCksCisJU05NUF9NSUJfSVRFTSgiVENQTUQ1RmFpbHVyZSIsIExJTlVYX01JQl9UQ1BNRDVGQUlMVVJFKSwKIAlTTk1QX01JQl9JVEVNKCJUQ1BTYWNrU2hpZnRlZCIsIExJTlVYX01JQl9TQUNLU0hJRlRFRCksCiAJU05NUF9NSUJfSVRFTSgiVENQU2Fja01lcmdlZCIsIExJTlVYX01JQl9TQUNLTUVSR0VEKSwKIAlTTk1QX01JQl9JVEVNKCJUQ1BTYWNrU2hpZnRGYWxsYmFjayIsIExJTlVYX01JQl9TQUNLU0hJRlRGQUxMQkFDSyksCkBAIC0zNTUsMjIgKzM1OCwyMiBAQAogCWF0b21pY19sb25nX3QgKnB0ciA9IG5ldC0+bWliLmljbXBtc2dfc3RhdGlzdGljcy0+bWliczsKIAogCXNlcV9wdXRzKHNlcSwgIlxuSWNtcDogSW5Nc2dzIEluRXJyb3JzIEluQ3N1bUVycm9ycyIpOwotCWZvciAoaSA9IDA7IGljbXBtaWJtYXBbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJZm9yIChpID0gMDsgaWNtcG1pYm1hcFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiIEluJXMiLCBpY21wbWlibWFwW2ldLm5hbWUpOwogCXNlcV9wdXRzKHNlcSwgIiBPdXRNc2dzIE91dEVycm9ycyIpOwotCWZvciAoaSA9IDA7IGljbXBtaWJtYXBbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJZm9yIChpID0gMDsgaWNtcG1pYm1hcFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiIE91dCVzIiwgaWNtcG1pYm1hcFtpXS5uYW1lKTsKIAlzZXFfcHJpbnRmKHNlcSwgIlxuSWNtcDogJWx1ICVsdSAlbHUiLAogCQlzbm1wX2ZvbGRfZmllbGQobmV0LT5taWIuaWNtcF9zdGF0aXN0aWNzLCBJQ01QX01JQl9JTk1TR1MpLAogCQlzbm1wX2ZvbGRfZmllbGQobmV0LT5taWIuaWNtcF9zdGF0aXN0aWNzLCBJQ01QX01JQl9JTkVSUk9SUyksCiAJCXNubXBfZm9sZF9maWVsZChuZXQtPm1pYi5pY21wX3N0YXRpc3RpY3MsIElDTVBfTUlCX0NTVU1FUlJPUlMpKTsKLQlmb3IgKGkgPSAwOyBpY21wbWlibWFwW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCWZvciAoaSA9IDA7IGljbXBtaWJtYXBbaV0ubmFtZTsgaSsrKQogCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUiLAogCQkJICAgYXRvbWljX2xvbmdfcmVhZChwdHIgKyBpY21wbWlibWFwW2ldLmluZGV4KSk7CiAJc2VxX3ByaW50ZihzZXEsICIgJWx1ICVsdSIsCiAJCXNubXBfZm9sZF9maWVsZChuZXQtPm1pYi5pY21wX3N0YXRpc3RpY3MsIElDTVBfTUlCX09VVE1TR1MpLAogCQlzbm1wX2ZvbGRfZmllbGQobmV0LT5taWIuaWNtcF9zdGF0aXN0aWNzLCBJQ01QX01JQl9PVVRFUlJPUlMpKTsKLQlmb3IgKGkgPSAwOyBpY21wbWlibWFwW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCWZvciAoaSA9IDA7IGljbXBtaWJtYXBbaV0ubmFtZTsgaSsrKQogCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUiLAogCQkJICAgYXRvbWljX2xvbmdfcmVhZChwdHIgKyAoaWNtcG1pYm1hcFtpXS5pbmRleCB8IDB4MTAwKSkpOwogfQpAQCAtMzc4LDE0ICszODEsMTYgQEAKIC8qCiAgKglDYWxsZWQgZnJvbSB0aGUgUFJPQ2ZzIG1vZHVsZS4gVGhpcyBvdXRwdXRzIC9wcm9jL25ldC9zbm1wLgogICovCi1zdGF0aWMgaW50IHNubXBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCitzdGF0aWMgaW50IHNubXBfc2VxX3Nob3dfaXBzdGF0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKLQlpbnQgaTsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXEtPnByaXZhdGU7CisJdTY0IGJ1ZmY2NFtJUFNUQVRTX01JQl9NQVhdOworCWludCBpOworCisJbWVtc2V0KGJ1ZmY2NCwgMCwgSVBTVEFUU19NSUJfTUFYICogc2l6ZW9mKHU2NCkpOwogCiAJc2VxX3B1dHMoc2VxLCAiSXA6IEZvcndhcmRpbmcgRGVmYXVsdFRUTCIpOwotCi0JZm9yIChpID0gMDsgc25tcDRfaXBzdGF0c19saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCWZvciAoaSA9IDA7IHNubXA0X2lwc3RhdHNfbGlzdFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVzIiwgc25tcDRfaXBzdGF0c19saXN0W2ldLm5hbWUpOwogCiAJc2VxX3ByaW50ZihzZXEsICJcbklwOiAlZCAlZCIsCkBAIC0zOTMsNTQgKzM5OCw3NCBAQAogCQkgICBuZXQtPmlwdjQuc3lzY3RsX2lwX2RlZmF1bHRfdHRsKTsKIAogCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaXBzdGF0c19taWIsIG1pYnMpICE9IDApOwotCWZvciAoaSA9IDA7IHNubXA0X2lwc3RhdHNfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKLQkJc2VxX3ByaW50ZihzZXEsICIgJWxsdSIsCi0JCQkgICBzbm1wX2ZvbGRfZmllbGQ2NChuZXQtPm1pYi5pcF9zdGF0aXN0aWNzLAotCQkJCQkgICAgIHNubXA0X2lwc3RhdHNfbGlzdFtpXS5lbnRyeSwKLQkJCQkJICAgICBvZmZzZXRvZihzdHJ1Y3QgaXBzdGF0c19taWIsIHN5bmNwKSkpOworCXNubXBfZ2V0X2NwdV9maWVsZDY0X2JhdGNoKGJ1ZmY2NCwgc25tcDRfaXBzdGF0c19saXN0LAorCQkJCSAgIG5ldC0+bWliLmlwX3N0YXRpc3RpY3MsCisJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGlwc3RhdHNfbWliLCBzeW5jcCkpOworCWZvciAoaSA9IDA7IHNubXA0X2lwc3RhdHNfbGlzdFtpXS5uYW1lOyBpKyspCisJCXNlcV9wcmludGYoc2VxLCAiICVsbHUiLCBidWZmNjRbaV0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25tcF9zZXFfc2hvd190Y3BfdWRwKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXVuc2lnbmVkIGxvbmcgYnVmZltUQ1BVRFBfTUlCX01BWF07CisJc3RydWN0IG5ldCAqbmV0ID0gc2VxLT5wcml2YXRlOworCWludCBpOworCisJbWVtc2V0KGJ1ZmYsIDAsIFRDUFVEUF9NSUJfTUFYICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKworCXNlcV9wdXRzKHNlcSwgIlxuVGNwOiIpOworCWZvciAoaSA9IDA7IHNubXA0X3RjcF9saXN0W2ldLm5hbWU7IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIgJXMiLCBzbm1wNF90Y3BfbGlzdFtpXS5uYW1lKTsKKworCXNlcV9wdXRzKHNlcSwgIlxuVGNwOiIpOworCXNubXBfZ2V0X2NwdV9maWVsZF9iYXRjaChidWZmLCBzbm1wNF90Y3BfbGlzdCwKKwkJCQkgbmV0LT5taWIudGNwX3N0YXRpc3RpY3MpOworCWZvciAoaSA9IDA7IHNubXA0X3RjcF9saXN0W2ldLm5hbWU7IGkrKykgeworCQkvKiBNYXhDb25uIGZpZWxkIGlzIHNpZ25lZCwgUkZDIDIwMTIgKi8KKwkJaWYgKHNubXA0X3RjcF9saXN0W2ldLmVudHJ5ID09IFRDUF9NSUJfTUFYQ09OTikKKwkJCXNlcV9wcmludGYoc2VxLCAiICVsZCIsIGJ1ZmZbaV0pOworCQllbHNlCisJCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUiLCBidWZmW2ldKTsKKwl9CisKKwltZW1zZXQoYnVmZiwgMCwgVENQVURQX01JQl9NQVggKiBzaXplb2YodW5zaWduZWQgbG9uZykpOworCisJc25tcF9nZXRfY3B1X2ZpZWxkX2JhdGNoKGJ1ZmYsIHNubXA0X3VkcF9saXN0LAorCQkJCSBuZXQtPm1pYi51ZHBfc3RhdGlzdGljcyk7CisJc2VxX3B1dHMoc2VxLCAiXG5VZHA6Iik7CisJZm9yIChpID0gMDsgc25tcDRfdWRwX2xpc3RbaV0ubmFtZTsgaSsrKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAlcyIsIHNubXA0X3VkcF9saXN0W2ldLm5hbWUpOworCXNlcV9wdXRzKHNlcSwgIlxuVWRwOiIpOworCWZvciAoaSA9IDA7IHNubXA0X3VkcF9saXN0W2ldLm5hbWU7IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwgYnVmZltpXSk7CisKKwltZW1zZXQoYnVmZiwgMCwgVENQVURQX01JQl9NQVggKiBzaXplb2YodW5zaWduZWQgbG9uZykpOworCisJLyogdGhlIFVEUCBhbmQgVURQLUxpdGUgTUlCcyBhcmUgdGhlIHNhbWUgKi8KKwlzZXFfcHV0cyhzZXEsICJcblVkcExpdGU6Iik7CisJc25tcF9nZXRfY3B1X2ZpZWxkX2JhdGNoKGJ1ZmYsIHNubXA0X3VkcF9saXN0LAorCQkJCSBuZXQtPm1pYi51ZHBsaXRlX3N0YXRpc3RpY3MpOworCWZvciAoaSA9IDA7IHNubXA0X3VkcF9saXN0W2ldLm5hbWU7IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIgJXMiLCBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lKTsKKwlzZXFfcHV0cyhzZXEsICJcblVkcExpdGU6Iik7CisJZm9yIChpID0gMDsgc25tcDRfdWRwX2xpc3RbaV0ubmFtZTsgaSsrKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUiLCBidWZmW2ldKTsKKworCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25tcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzbm1wX3NlcV9zaG93X2lwc3RhdHMoc2VxLCB2KTsKIAogCWljbXBfcHV0KHNlcSk7CS8qIFJGQyAyMDExIGNvbXBhdGliaWxpdHkgKi8KIAlpY21wbXNnX3B1dChzZXEpOwogCi0Jc2VxX3B1dHMoc2VxLCAiXG5UY3A6Iik7Ci0JZm9yIChpID0gMDsgc25tcDRfdGNwX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCi0JCXNlcV9wcmludGYoc2VxLCAiICVzIiwgc25tcDRfdGNwX2xpc3RbaV0ubmFtZSk7CisJc25tcF9zZXFfc2hvd190Y3BfdWRwKHNlcSwgdik7CiAKLQlzZXFfcHV0cyhzZXEsICJcblRjcDoiKTsKLQlmb3IgKGkgPSAwOyBzbm1wNF90Y3BfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykgewotCQkvKiBNYXhDb25uIGZpZWxkIGlzIHNpZ25lZCwgUkZDIDIwMTIgKi8KLQkJaWYgKHNubXA0X3RjcF9saXN0W2ldLmVudHJ5ID09IFRDUF9NSUJfTUFYQ09OTikKLQkJCXNlcV9wcmludGYoc2VxLCAiICVsZCIsCi0JCQkJICAgc25tcF9mb2xkX2ZpZWxkKG5ldC0+bWliLnRjcF9zdGF0aXN0aWNzLAotCQkJCQkJICAgc25tcDRfdGNwX2xpc3RbaV0uZW50cnkpKTsKLQkJZWxzZQotCQkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwKLQkJCQkgICBzbm1wX2ZvbGRfZmllbGQobmV0LT5taWIudGNwX3N0YXRpc3RpY3MsCi0JCQkJCQkgICBzbm1wNF90Y3BfbGlzdFtpXS5lbnRyeSkpOwotCX0KLQotCXNlcV9wdXRzKHNlcSwgIlxuVWRwOiIpOwotCWZvciAoaSA9IDA7IHNubXA0X3VkcF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQotCQlzZXFfcHJpbnRmKHNlcSwgIiAlcyIsIHNubXA0X3VkcF9saXN0W2ldLm5hbWUpOwotCi0Jc2VxX3B1dHMoc2VxLCAiXG5VZHA6Iik7Ci0JZm9yIChpID0gMDsgc25tcDRfdWRwX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCi0JCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCi0JCQkgICBzbm1wX2ZvbGRfZmllbGQobmV0LT5taWIudWRwX3N0YXRpc3RpY3MsCi0JCQkJCSAgIHNubXA0X3VkcF9saXN0W2ldLmVudHJ5KSk7Ci0KLQkvKiB0aGUgVURQIGFuZCBVRFAtTGl0ZSBNSUJzIGFyZSB0aGUgc2FtZSAqLwotCXNlcV9wdXRzKHNlcSwgIlxuVWRwTGl0ZToiKTsKLQlmb3IgKGkgPSAwOyBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKLQkJc2VxX3ByaW50ZihzZXEsICIgJXMiLCBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lKTsKLQotCXNlcV9wdXRzKHNlcSwgIlxuVWRwTGl0ZToiKTsKLQlmb3IgKGkgPSAwOyBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKLQkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwKLQkJCSAgIHNubXBfZm9sZF9maWVsZChuZXQtPm1pYi51ZHBsaXRlX3N0YXRpc3RpY3MsCi0JCQkJCSAgIHNubXA0X3VkcF9saXN0W2ldLmVudHJ5KSk7Ci0KLQlzZXFfcHV0YyhzZXEsICdcbicpOwogCXJldHVybiAwOwogfQogCkBAIC00NjgsMjEgKzQ5MywyMSBAQAogCXN0cnVjdCBuZXQgKm5ldCA9IHNlcS0+cHJpdmF0ZTsKIAogCXNlcV9wdXRzKHNlcSwgIlRjcEV4dDoiKTsKLQlmb3IgKGkgPSAwOyBzbm1wNF9uZXRfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwlmb3IgKGkgPSAwOyBzbm1wNF9uZXRfbGlzdFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVzIiwgc25tcDRfbmV0X2xpc3RbaV0ubmFtZSk7CiAKIAlzZXFfcHV0cyhzZXEsICJcblRjcEV4dDoiKTsKLQlmb3IgKGkgPSAwOyBzbm1wNF9uZXRfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwlmb3IgKGkgPSAwOyBzbm1wNF9uZXRfbGlzdFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCiAJCQkgICBzbm1wX2ZvbGRfZmllbGQobmV0LT5taWIubmV0X3N0YXRpc3RpY3MsCiAJCQkJCSAgIHNubXA0X25ldF9saXN0W2ldLmVudHJ5KSk7CiAKIAlzZXFfcHV0cyhzZXEsICJcbklwRXh0OiIpOwotCWZvciAoaSA9IDA7IHNubXA0X2lwZXh0c3RhdHNfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwlmb3IgKGkgPSAwOyBzbm1wNF9pcGV4dHN0YXRzX2xpc3RbaV0ubmFtZTsgaSsrKQogCQlzZXFfcHJpbnRmKHNlcSwgIiAlcyIsIHNubXA0X2lwZXh0c3RhdHNfbGlzdFtpXS5uYW1lKTsKIAogCXNlcV9wdXRzKHNlcSwgIlxuSXBFeHQ6Iik7Ci0JZm9yIChpID0gMDsgc25tcDRfaXBleHRzdGF0c19saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCWZvciAoaSA9IDA7IHNubXA0X2lwZXh0c3RhdHNfbGlzdFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVsbHUiLAogCQkJICAgc25tcF9mb2xkX2ZpZWxkNjQobmV0LT5taWIuaXBfc3RhdGlzdGljcywKIAkJCQkJICAgICBzbm1wNF9pcGV4dHN0YXRzX2xpc3RbaV0uZW50cnksCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9yYXcuYyBiL25ldC9pcHY0L3Jhdy5jCmluZGV4IDQzOGY1MGMuLjkwYTg1YzkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3Jhdy5jCisrKyBiL25ldC9pcHY0L3Jhdy5jCkBAIC02MDYsMTIgKzYwNiw2IEBACiAJCQkgICAgKGluZXQtPmhkcmluY2wgPyBGTE9XSV9GTEFHX0tOT1dOX05IIDogMCksCiAJCQkgICBkYWRkciwgc2FkZHIsIDAsIDApOwogCi0JaWYgKCFzYWRkciAmJiBpcGMub2lmKSB7Ci0JCWVyciA9IGwzbWRldl9nZXRfc2FkZHIobmV0LCBpcGMub2lmLCAmZmw0KTsKLQkJaWYgKGVyciA8IDApCi0JCQlnb3RvIGRvbmU7Ci0JfQotCiAJaWYgKCFpbmV0LT5oZHJpbmNsKSB7CiAJCXJmdi5tc2cgPSBtc2c7CiAJCXJmdi5obGVuID0gMDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3JvdXRlLmMgYi9uZXQvaXB2NC9yb3V0ZS5jCmluZGV4IGExZjI4MzAuLmYyYmU2ODkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3JvdXRlLmMKKysrIGIvbmV0L2lwdjQvcm91dGUuYwpAQCAtNDc2LDEyICs0NzYsMTggQEAKIAlhdG9taWNfdCAqcF9pZCA9IGlwX2lkZW50cyArIGhhc2ggJSBJUF9JREVOVFNfU1o7CiAJdTMyIG9sZCA9IEFDQ0VTU19PTkNFKCpwX3RzdGFtcCk7CiAJdTMyIG5vdyA9ICh1MzIpamlmZmllczsKLQl1MzIgZGVsdGEgPSAwOworCXUzMiBuZXcsIGRlbHRhID0gMDsKIAogCWlmIChvbGQgIT0gbm93ICYmIGNtcHhjaGcocF90c3RhbXAsIG9sZCwgbm93KSA9PSBvbGQpCiAJCWRlbHRhID0gcHJhbmRvbV91MzJfbWF4KG5vdyAtIG9sZCk7CiAKLQlyZXR1cm4gYXRvbWljX2FkZF9yZXR1cm4oc2VncyArIGRlbHRhLCBwX2lkKSAtIHNlZ3M7CisJLyogRG8gbm90IHVzZSBhdG9taWNfYWRkX3JldHVybigpIGFzIGl0IG1ha2VzIFVCU0FOIHVuaGFwcHkgKi8KKwlkbyB7CisJCW9sZCA9ICh1MzIpYXRvbWljX3JlYWQocF9pZCk7CisJCW5ldyA9IG9sZCArIGRlbHRhICsgc2VnczsKKwl9IHdoaWxlIChhdG9taWNfY21weGNoZyhwX2lkLCBvbGQsIG5ldykgIT0gb2xkKTsKKworCXJldHVybiBuZXcgLSBzZWdzOwogfQogRVhQT1JUX1NZTUJPTChpcF9pZGVudHNfcmVzZXJ2ZSk7CiAKQEAgLTEyNDYsNyArMTI1Miw5IEBACiAJCQltdHUgPSA1NzY7CiAJfQogCi0JcmV0dXJuIG1pbl90KHVuc2lnbmVkIGludCwgbXR1LCBJUF9NQVhfTVRVKTsKKwltdHUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIG10dSwgSVBfTUFYX01UVSk7CisKKwlyZXR1cm4gbXR1IC0gbHd0dW5uZWxfaGVhZHJvb20oZHN0LT5sd3RzdGF0ZSwgbXR1KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWJfbmhfZXhjZXB0aW9uICpmaW5kX2V4Y2VwdGlvbihzdHJ1Y3QgZmliX25oICpuaCwgX19iZTMyIGRhZGRyKQpAQCAtMTgyOSw3ICsxODM3LDcgQEAKIAkgKglOb3cgd2UgYXJlIHJlYWR5IHRvIHJvdXRlIHBhY2tldC4KIAkgKi8KIAlmbDQuZmxvd2k0X29pZiA9IDA7Ci0JZmw0LmZsb3dpNF9paWYgPSBsM21kZXZfZmliX29pZl9yY3UoZGV2KTsKKwlmbDQuZmxvd2k0X2lpZiA9IGRldi0+aWZpbmRleDsKIAlmbDQuZmxvd2k0X21hcmsgPSBza2ItPm1hcms7CiAJZmw0LmZsb3dpNF90b3MgPSB0b3M7CiAJZmw0LmZsb3dpNF9zY29wZSA9IFJUX1NDT1BFX1VOSVZFUlNFOwpAQCAtMjAxNiw3ICsyMDI0LDkgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIAlpZiAobGlrZWx5KCFJTl9ERVZfUk9VVEVfTE9DQUxORVQoaW5fZGV2KSkpCi0JCWlmIChpcHY0X2lzX2xvb3BiYWNrKGZsNC0+c2FkZHIpICYmICEoZGV2X291dC0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKQorCQlpZiAoaXB2NF9pc19sb29wYmFjayhmbDQtPnNhZGRyKSAmJgorCQkgICAgIShkZXZfb3V0LT5mbGFncyAmIElGRl9MT09QQkFDSykgJiYKKwkJICAgICFuZXRpZl9pc19sM19tYXN0ZXIoZGV2X291dCkpCiAJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCWlmIChpcHY0X2lzX2xiY2FzdChmbDQtPmRhZGRyKSkKQEAgLTIxNDYsNyArMjE1Niw2IEBACiAJdW5zaWduZWQgaW50IGZsYWdzID0gMDsKIAlzdHJ1Y3QgZmliX3Jlc3VsdCByZXM7CiAJc3RydWN0IHJ0YWJsZSAqcnRoOwotCWludCBtYXN0ZXJfaWR4OwogCWludCBvcmlnX29pZjsKIAlpbnQgZXJyID0gLUVORVRVTlJFQUNIOwogCkBAIC0yMTU2LDkgKzIxNjUsNiBAQAogCiAJb3JpZ19vaWYgPSBmbDQtPmZsb3dpNF9vaWY7CiAKLQltYXN0ZXJfaWR4ID0gbDNtZGV2X21hc3Rlcl9pZmluZGV4X2J5X2luZGV4KG5ldCwgZmw0LT5mbG93aTRfb2lmKTsKLQlpZiAobWFzdGVyX2lkeCkKLQkJZmw0LT5mbG93aTRfb2lmID0gbWFzdGVyX2lkeDsKIAlmbDQtPmZsb3dpNF9paWYgPSBMT09QQkFDS19JRklOREVYOwogCWZsNC0+Zmxvd2k0X3RvcyA9IHRvcyAmIElQVE9TX1JUX01BU0s7CiAJZmw0LT5mbG93aTRfc2NvcGUgPSAoKHRvcyAmIFJUT19PTkxJTkspID8KQEAgLTIyNDIsMTAgKzIyNDgsNiBAQAogCQkJCWZsNC0+c2FkZHIgPSBpbmV0X3NlbGVjdF9hZGRyKGRldl9vdXQsIDAsCiAJCQkJCQkJICAgICAgUlRfU0NPUEVfSE9TVCk7CiAJCX0KLQotCQlydGggPSBsM21kZXZfZ2V0X3J0YWJsZShkZXZfb3V0LCBmbDQpOwotCQlpZiAocnRoKQotCQkJZ290byBvdXQ7CiAJfQogCiAJaWYgKCFmbDQtPmRhZGRyKSB7CkBAIC0yMjYzLDggKzIyNjUsNyBAQAogCWlmIChlcnIpIHsKIAkJcmVzLmZpID0gTlVMTDsKIAkJcmVzLnRhYmxlID0gTlVMTDsKLQkJaWYgKGZsNC0+Zmxvd2k0X29pZiAmJgotCQkgICAgIW5ldGlmX2luZGV4X2lzX2wzX21hc3RlcihuZXQsIGZsNC0+Zmxvd2k0X29pZikpIHsKKwkJaWYgKGZsNC0+Zmxvd2k0X29pZikgewogCQkJLyogQXBwYXJlbnRseSwgcm91dGluZyB0YWJsZXMgYXJlIHdyb25nLiBBc3N1bWUsCiAJCQkgICB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBvbiBsaW5rLgogCkBAIC0yMzAwLDcgKzIzMDEsOSBAQAogCQkJZWxzZQogCQkJCWZsNC0+c2FkZHIgPSBmbDQtPmRhZGRyOwogCQl9Ci0JCWRldl9vdXQgPSBuZXQtPmxvb3BiYWNrX2RldjsKKworCQkvKiBMMyBtYXN0ZXIgZGV2aWNlIGlzIHRoZSBsb29wYmFjayBmb3IgdGhhdCBkb21haW4gKi8KKwkJZGV2X291dCA9IGwzbWRldl9tYXN0ZXJfZGV2X3JjdShkZXZfb3V0KSA/IDogbmV0LT5sb29wYmFja19kZXY7CiAJCWZsNC0+Zmxvd2k0X29pZiA9IGRldl9vdXQtPmlmaW5kZXg7CiAJCWZsYWdzIHw9IFJUQ0ZfTE9DQUw7CiAJCWdvdG8gbWFrZV9yb3V0ZTsKQEAgLTI0OTcsNyArMjUwMCw4IEBACiAJCSAgICBJUFY0X0RFVkNPTkZfQUxMKG5ldCwgTUNfRk9SV0FSRElORykpIHsKIAkJCWludCBlcnIgPSBpcG1yX2dldF9yb3V0ZShuZXQsIHNrYiwKIAkJCQkJCSBmbDQtPnNhZGRyLCBmbDQtPmRhZGRyLAotCQkJCQkJIHIsIG5vd2FpdCk7CisJCQkJCQkgciwgbm93YWl0LCBwb3J0aWQpOworCiAJCQlpZiAoZXJyIDw9IDApIHsKIAkJCQlpZiAoIW5vd2FpdCkgewogCQkJCQlpZiAoZXJyID09IDApCkBAIC0yNTc1LDkgKzI1NzksNiBAQAogCWZsNC5mbG93aTRfb2lmID0gdGJbUlRBX09JRl0gPyBubGFfZ2V0X3UzMih0YltSVEFfT0lGXSkgOiAwOwogCWZsNC5mbG93aTRfbWFyayA9IG1hcms7CiAKLQlpZiAobmV0aWZfaW5kZXhfaXNfbDNfbWFzdGVyKG5ldCwgZmw0LmZsb3dpNF9vaWYpKQotCQlmbDQuZmxvd2k0X2ZsYWdzID0gRkxPV0lfRkxBR19MM01ERVZfU1JDIHwgRkxPV0lfRkxBR19TS0lQX05IX09JRjsKLQogCWlmIChpaWYpIHsKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwLmMgYi9uZXQvaXB2NC90Y3AuYwppbmRleCAwMzJhOTZkLi5mMjUzZTUwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3AuYworKysgYi9uZXQvaXB2NC90Y3AuYwpAQCAtMzgwLDE0ICszODAsMTQgQEAKIAlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAKLQlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOworCXRwLT5vdXRfb2Zfb3JkZXJfcXVldWUgPSBSQl9ST09UOwogCXRjcF9pbml0X3htaXRfdGltZXJzKHNrKTsKIAl0Y3BfcHJlcXVldWVfaW5pdCh0cCk7CiAJSU5JVF9MSVNUX0hFQUQoJnRwLT50c3Ffbm9kZSk7CiAKIAlpY3NrLT5pY3NrX3J0byA9IFRDUF9USU1FT1VUX0lOSVQ7CiAJdHAtPm1kZXZfdXMgPSBqaWZmaWVzX3RvX3VzZWNzKFRDUF9USU1FT1VUX0lOSVQpOwotCXRwLT5ydHRfbWluWzBdLnJ0dCA9IH4wVTsKKwltaW5tYXhfcmVzZXQoJnRwLT5ydHRfbWluLCB0Y3BfdGltZV9zdGFtcCwgfjBVKTsKIAogCS8qIFNvIG1hbnkgVENQIGltcGxlbWVudGF0aW9ucyBvdXQgdGhlcmUgKGluY29ycmVjdGx5KSBjb3VudCB0aGUKIAkgKiBpbml0aWFsIFNZTiBmcmFtZSBpbiB0aGVpciBkZWxheWVkLUFDSyBhbmQgY29uZ2VzdGlvbiBjb250cm9sCkBAIC0zOTYsNiArMzk2LDkgQEAKIAkgKi8KIAl0cC0+c25kX2N3bmQgPSBUQ1BfSU5JVF9DV05EOwogCisJLyogVGhlcmUncyBhIGJ1YmJsZSBpbiB0aGUgcGlwZSB1bnRpbCBhdCBsZWFzdCB0aGUgZmlyc3QgQUNLLiAqLworCXRwLT5hcHBfbGltaXRlZCA9IH4wVTsKKwogCS8qIFNlZSBkcmFmdC1zdGV2ZW5zLXRjcGNhLXNwZWMtMDEgZm9yIGRpc2N1c3Npb24gb2YgdGhlCiAJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlc2UgdmFsdWVzLgogCSAqLwpAQCAtMTAxNCwyMyArMTAxNyw0MCBAQAogCQkJCQlmbGFncyk7CiAKIAlsb2NrX3NvY2soc2spOworCisJdGNwX3JhdGVfY2hlY2tfYXBwX2xpbWl0ZWQoc2spOyAgLyogaXMgc2VuZGluZyBhcHBsaWNhdGlvbi1saW1pdGVkPyAqLworCiAJcmVzID0gZG9fdGNwX3NlbmRwYWdlcyhzaywgcGFnZSwgb2Zmc2V0LCBzaXplLCBmbGFncyk7CiAJcmVsZWFzZV9zb2NrKHNrKTsKIAlyZXR1cm4gcmVzOwogfQogRVhQT1JUX1NZTUJPTCh0Y3Bfc2VuZHBhZ2UpOwogCi1zdGF0aWMgaW5saW5lIGludCBzZWxlY3Rfc2l6ZShjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIGJvb2wgc2cpCisvKiBEbyBub3QgYm90aGVyIHVzaW5nIGEgcGFnZSBmcmFnIGZvciB2ZXJ5IHNtYWxsIGZyYW1lcy4KKyAqIEJ1dCB1c2UgdGhpcyBoZXVyaXN0aWMgb25seSBmb3IgdGhlIGZpcnN0IHNrYiBpbiB3cml0ZSBxdWV1ZS4KKyAqCisgKiBIYXZpbmcgbm8gcGF5bG9hZCBpbiBza2ItPmhlYWQgYWxsb3dzIGJldHRlciBTQUNLIHNoaWZ0aW5nCisgKiBpbiB0Y3Bfc2hpZnRfc2tiX2RhdGEoKSwgcmVkdWNpbmcgc2Fjay9yYWNrIG92ZXJoZWFkLCBiZWNhdXNlCisgKiB3cml0ZSBxdWV1ZSBoYXMgbGVzcyBza2JzLgorICogRWFjaCBza2IgY2FuIGhvbGQgdXAgdG8gTUFYX1NLQl9GUkFHUyAqIDMyS2J5dGVzLCBvciB+MC41IE1CLgorICogVGhpcyBhbHNvIHNwZWVkcyB1cCB0c29fZnJhZ21lbnQoKSwgc2luY2UgaXQgd29udCBmYWxsYmFjaworICogdG8gdGNwX2ZyYWdtZW50KCkuCisgKi8KK3N0YXRpYyBpbnQgbGluZWFyX3BheWxvYWRfc3ooYm9vbCBmaXJzdF9za2IpCit7CisJaWYgKGZpcnN0X3NrYikKKwkJcmV0dXJuIFNLQl9XSVRIX09WRVJIRUFEKDIwNDggLSBNQVhfVENQX0hFQURFUik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VsZWN0X3NpemUoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCBib29sIHNnLCBib29sIGZpcnN0X3NrYikKIHsKIAljb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlpbnQgdG1wID0gdHAtPm1zc19jYWNoZTsKIAogCWlmIChzZykgewogCQlpZiAoc2tfY2FuX2dzbyhzaykpIHsKLQkJCS8qIFNtYWxsIGZyYW1lcyB3b250IHVzZSBhIGZ1bGwgcGFnZToKLQkJCSAqIFBheWxvYWQgd2lsbCBpbW1lZGlhdGVseSBmb2xsb3cgdGNwIGhlYWRlci4KLQkJCSAqLwotCQkJdG1wID0gU0tCX1dJVEhfT1ZFUkhFQUQoMjA0OCAtIE1BWF9UQ1BfSEVBREVSKTsKKwkJCXRtcCA9IGxpbmVhcl9wYXlsb2FkX3N6KGZpcnN0X3NrYik7CiAJCX0gZWxzZSB7CiAJCQlpbnQgcGdicmVhayA9IFNLQl9NQVhfSEVBRChNQVhfVENQX0hFQURFUik7CiAKQEAgLTExMDEsNiArMTEyMSw4IEBACiAKIAl0aW1lbyA9IHNvY2tfc25kdGltZW8oc2ssIGZsYWdzICYgTVNHX0RPTlRXQUlUKTsKIAorCXRjcF9yYXRlX2NoZWNrX2FwcF9saW1pdGVkKHNrKTsgIC8qIGlzIHNlbmRpbmcgYXBwbGljYXRpb24tbGltaXRlZD8gKi8KKwogCS8qIFdhaXQgZm9yIGEgY29ubmVjdGlvbiB0byBmaW5pc2guIE9uZSBleGNlcHRpb24gaXMgVENQIEZhc3QgT3BlbgogCSAqIChwYXNzaXZlIHNpZGUpIHdoZXJlIGRhdGEgaXMgYWxsb3dlZCB0byBiZSBzZW50IGJlZm9yZSBhIGNvbm5lY3Rpb24KIAkgKiBpcyBmdWxseSBlc3RhYmxpc2hlZC4KQEAgLTExNjEsNiArMTE4Myw4IEBACiAJCX0KIAogCQlpZiAoY29weSA8PSAwIHx8ICF0Y3Bfc2tiX2Nhbl9jb2xsYXBzZV90byhza2IpKSB7CisJCQlib29sIGZpcnN0X3NrYjsKKwogbmV3X3NlZ21lbnQ6CiAJCQkvKiBBbGxvY2F0ZSBuZXcgc2VnbWVudC4gSWYgdGhlIGludGVyZmFjZSBpcyBTRywKIAkJCSAqIGFsbG9jYXRlIHNrYiBmaXR0aW5nIHRvIHNpbmdsZSBwYWdlLgpAQCAtMTE3MiwxMCArMTE5NiwxMSBAQAogCQkJCXByb2Nlc3NfYmFja2xvZyA9IGZhbHNlOwogCQkJCWdvdG8gcmVzdGFydDsKIAkJCX0KKwkJCWZpcnN0X3NrYiA9IHNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3dyaXRlX3F1ZXVlKTsKIAkJCXNrYiA9IHNrX3N0cmVhbV9hbGxvY19za2Ioc2ssCi0JCQkJCQkgIHNlbGVjdF9zaXplKHNrLCBzZyksCisJCQkJCQkgIHNlbGVjdF9zaXplKHNrLCBzZywgZmlyc3Rfc2tiKSwKIAkJCQkJCSAgc2stPnNrX2FsbG9jYXRpb24sCi0JCQkJCQkgIHNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3dyaXRlX3F1ZXVlKSk7CisJCQkJCQkgIGZpcnN0X3NrYik7CiAJCQlpZiAoIXNrYikKIAkJCQlnb3RvIHdhaXRfZm9yX21lbW9yeTsKIApAQCAtMTU3MCw2ICsxNTk1LDEyIEBACiB9CiBFWFBPUlRfU1lNQk9MKHRjcF9yZWFkX3NvY2spOwogCitpbnQgdGNwX3BlZWtfbGVuKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJcmV0dXJuIHRjcF9pbnEoc29jay0+c2spOworfQorRVhQT1JUX1NZTUJPTCh0Y3BfcGVla19sZW4pOworCiAvKgogICoJVGhpcyByb3V0aW5lIGNvcGllcyBmcm9tIGEgc29jayBzdHJ1Y3QgaW50byB0aGUgdXNlciBidWZmZXIuCiAgKgpAQCAtMjIzNyw3ICsyMjY4LDcgQEAKIAl0Y3BfY2xlYXJfeG1pdF90aW1lcnMoc2spOwogCV9fc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CiAJdGNwX3dyaXRlX3F1ZXVlX3B1cmdlKHNrKTsKLQlfX3NrYl9xdWV1ZV9wdXJnZSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CisJc2tiX3JidHJlZV9wdXJnZSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CiAKIAlpbmV0LT5pbmV0X2Rwb3J0ID0gMDsKIApAQCAtMjY4MSw3ICsyNzEyLDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsgLyogaWZmIHNrX3R5cGUgPT0gU09DS19TVFJFQU0gKi8KIAljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7Ci0JdTMyIG5vdyA9IHRjcF90aW1lX3N0YW1wOworCXUzMiBub3cgPSB0Y3BfdGltZV9zdGFtcCwgaW50djsKIAl1bnNpZ25lZCBpbnQgc3RhcnQ7CiAJaW50IG5vdHNlbnRfYnl0ZXM7CiAJdTY0IHJhdGU2NDsKQEAgLTI3NzEsNiArMjgwMiwxNSBAQAogCWluZm8tPnRjcGlfbWluX3J0dCA9IHRjcF9taW5fcnR0KHRwKTsKIAlpbmZvLT50Y3BpX2RhdGFfc2Vnc19pbiA9IHRwLT5kYXRhX3NlZ3NfaW47CiAJaW5mby0+dGNwaV9kYXRhX3NlZ3Nfb3V0ID0gdHAtPmRhdGFfc2Vnc19vdXQ7CisKKwlpbmZvLT50Y3BpX2RlbGl2ZXJ5X3JhdGVfYXBwX2xpbWl0ZWQgPSB0cC0+cmF0ZV9hcHBfbGltaXRlZCA/IDEgOiAwOworCXJhdGUgPSBSRUFEX09OQ0UodHAtPnJhdGVfZGVsaXZlcmVkKTsKKwlpbnR2ID0gUkVBRF9PTkNFKHRwLT5yYXRlX2ludGVydmFsX3VzKTsKKwlpZiAocmF0ZSAmJiBpbnR2KSB7CisJCXJhdGU2NCA9ICh1NjQpcmF0ZSAqIHRwLT5tc3NfY2FjaGUgKiBVU0VDX1BFUl9TRUM7CisJCWRvX2RpdihyYXRlNjQsIGludHYpOworCQlwdXRfdW5hbGlnbmVkKHJhdGU2NCwgJmluZm8tPnRjcGlfZGVsaXZlcnlfcmF0ZSk7CisJfQogfQogRVhQT1JUX1NZTUJPTF9HUEwodGNwX2dldF9pbmZvKTsKIApAQCAtMzA5MiwyMyArMzEzMiw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKHRjcF9nZXRfbWQ1c2lnX3Bvb2wpOwogCi1pbnQgdGNwX21kNV9oYXNoX2hlYWRlcihzdHJ1Y3QgdGNwX21kNXNpZ19wb29sICpocCwKLQkJCWNvbnN0IHN0cnVjdCB0Y3BoZHIgKnRoKQotewotCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKLQlzdHJ1Y3QgdGNwaGRyIGhkcjsKLQotCS8qIFdlIGFyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGNwaGRyLCBtYWtlIGEgbG9jYWwgY29weSAqLwotCW1lbWNweSgmaGRyLCB0aCwgc2l6ZW9mKGhkcikpOwotCWhkci5jaGVjayA9IDA7Ci0KLQkvKiBvcHRpb25zIGFyZW4ndCBpbmNsdWRlZCBpbiB0aGUgaGFzaCAqLwotCXNnX2luaXRfb25lKCZzZywgJmhkciwgc2l6ZW9mKGhkcikpOwotCWFoYXNoX3JlcXVlc3Rfc2V0X2NyeXB0KGhwLT5tZDVfcmVxLCAmc2csIE5VTEwsIHNpemVvZihoZHIpKTsKLQlyZXR1cm4gY3J5cHRvX2FoYXNoX3VwZGF0ZShocC0+bWQ1X3JlcSk7Ci19Ci1FWFBPUlRfU1lNQk9MKHRjcF9tZDVfaGFzaF9oZWFkZXIpOwotCiBpbnQgdGNwX21kNV9oYXNoX3NrYl9kYXRhKHN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKmhwLAogCQkJICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaGVhZGVyX2xlbikKIHsKQEAgLTMxOTMsNyArMzIxNiw2IEBACiAJCQlsb2NhbF9iaF9lbmFibGUoKTsKIAkJCXJldHVybiAwOwogCQl9Ci0JCXNvY2tfZ2VuX3B1dChzayk7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKQEAgLTMyMjIsNyArMzI0NCw2IEBACiAJYmhfdW5sb2NrX3NvY2soc2spOwogCWxvY2FsX2JoX2VuYWJsZSgpOwogCXJlbGVhc2Vfc29jayhzayk7Ci0Jc29ja19wdXQoc2spOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodGNwX2Fib3J0KTsKQEAgLTMyNTcsMTEgKzMyNzgsMTIgQEAKIAogdm9pZCBfX2luaXQgdGNwX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGxpbWl0OwogCWludCBtYXhfcnNoYXJlLCBtYXhfd3NoYXJlLCBjbnQ7CisJdW5zaWduZWQgbG9uZyBsaW1pdDsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCXNvY2tfc2tiX2NiX2NoZWNrX3NpemUoc2l6ZW9mKHN0cnVjdCB0Y3Bfc2tiX2NiKSk7CisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgdGNwX3NrYl9jYikgPgorCQkgICAgIEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgY2IpKTsKIAogCXBlcmNwdV9jb3VudGVyX2luaXQoJnRjcF9zb2NrZXRzX2FsbG9jYXRlZCwgMCwgR0ZQX0tFUk5FTCk7CiAJcGVyY3B1X2NvdW50ZXJfaW5pdCgmdGNwX29ycGhhbl9jb3VudCwgMCwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfYmJyLmMgYi9uZXQvaXB2NC90Y3BfYmJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhNjZjMgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3RjcF9iYnIuYwpAQCAtMCwwICsxLDg5NiBAQAorLyogQm90dGxlbmVjayBCYW5kd2lkdGggYW5kIFJUVCAoQkJSKSBjb25nZXN0aW9uIGNvbnRyb2wKKyAqCisgKiBCQlIgY29uZ2VzdGlvbiBjb250cm9sIGNvbXB1dGVzIHRoZSBzZW5kaW5nIHJhdGUgYmFzZWQgb24gdGhlIGRlbGl2ZXJ5CisgKiByYXRlICh0aHJvdWdocHV0KSBlc3RpbWF0ZWQgZnJvbSBBQ0tzLiBJbiBhIG51dHNoZWxsOgorICoKKyAqICAgT24gZWFjaCBBQ0ssIHVwZGF0ZSBvdXIgbW9kZWwgb2YgdGhlIG5ldHdvcmsgcGF0aDoKKyAqICAgICAgYm90dGxlbmVja19iYW5kd2lkdGggPSB3aW5kb3dlZF9tYXgoZGVsaXZlcmVkIC8gZWxhcHNlZCwgMTAgcm91bmQgdHJpcHMpCisgKiAgICAgIG1pbl9ydHQgPSB3aW5kb3dlZF9taW4ocnR0LCAxMCBzZWNvbmRzKQorICogICBwYWNpbmdfcmF0ZSA9IHBhY2luZ19nYWluICogYm90dGxlbmVja19iYW5kd2lkdGgKKyAqICAgY3duZCA9IG1heChjd25kX2dhaW4gKiBib3R0bGVuZWNrX2JhbmR3aWR0aCAqIG1pbl9ydHQsIDQpCisgKgorICogVGhlIGNvcmUgYWxnb3JpdGhtIGRvZXMgbm90IHJlYWN0IGRpcmVjdGx5IHRvIHBhY2tldCBsb3NzZXMgb3IgZGVsYXlzLAorICogYWx0aG91Z2ggQkJSIG1heSBhZGp1c3QgdGhlIHNpemUgb2YgbmV4dCBzZW5kIHBlciBBQ0sgd2hlbiBsb3NzIGlzCisgKiBvYnNlcnZlZCwgb3IgYWRqdXN0IHRoZSBzZW5kaW5nIHJhdGUgaWYgaXQgZXN0aW1hdGVzIHRoZXJlIGlzIGEKKyAqIHRyYWZmaWMgcG9saWNlciwgaW4gb3JkZXIgdG8ga2VlcCB0aGUgZHJvcCByYXRlIHJlYXNvbmFibGUuCisgKgorICogQkJSIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW46CisgKiAgICJCQlI6IENvbmdlc3Rpb24tQmFzZWQgQ29uZ2VzdGlvbiBDb250cm9sIiwKKyAqICAgTmVhbCBDYXJkd2VsbCwgWXVjaHVuZyBDaGVuZywgQy4gU3RlcGhlbiBHdW5uLCBTb2hlaWwgSGFzc2FzIFllZ2FuZWgsCisgKiAgIFZhbiBKYWNvYnNvbi4gQUNNIFF1ZXVlLCBWb2wuIDE0IE5vLiA1LCBTZXB0ZW1iZXItT2N0b2JlciAyMDE2LgorICoKKyAqIFRoZXJlIGlzIGEgcHVibGljIGUtbWFpbCBsaXN0IGZvciBkaXNjdXNzaW5nIEJCUiBkZXZlbG9wbWVudCBhbmQgdGVzdGluZzoKKyAqICAgaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9mb3J1bS8jIWZvcnVtL2Jici1kZXYKKyAqCisgKiBOT1RFOiBCQlIgKm11c3QqIGJlIHVzZWQgd2l0aCB0aGUgZnEgcWRpc2MgKCJtYW4gdGMtZnEiKSB3aXRoIHBhY2luZyBlbmFibGVkLAorICogc2luY2UgcGFjaW5nIGlzIGludGVncmFsIHRvIHRoZSBCQlIgZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbi4KKyAqIEJCUiB3aXRob3V0IHBhY2luZyB3b3VsZCBub3QgZnVuY3Rpb24gcHJvcGVybHksIGFuZCBtYXkgaW5jdXIgdW5uZWNlc3NhcnkKKyAqIGhpZ2ggcGFja2V0IGxvc3MgcmF0ZXMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldF9kaWFnLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpbl9taW5tYXguaD4KKworLyogU2NhbGUgZmFjdG9yIGZvciByYXRlIGluIHBrdC91U2VjIHVuaXQgdG8gYXZvaWQgdHJ1bmNhdGlvbiBpbiBiYW5kd2lkdGgKKyAqIGVzdGltYXRpb24uIFRoZSByYXRlIHVuaXQgfj0gKDE1MDAgYnl0ZXMgLyAxIHVzZWMgLyAyXjI0KSB+PSA3MTUgYnBzLgorICogVGhpcyBoYW5kbGVzIGJhbmR3aWR0aHMgZnJvbSAwLjA2cHBzICg3MTVicHMpIHRvIDI1Nk1wcHMgKDNUYnBzKSBpbiBhIHUzMi4KKyAqIFNpbmNlIHRoZSBtaW5pbXVtIHdpbmRvdyBpcyA+PTQgcGFja2V0cywgdGhlIGxvd2VyIGJvdW5kIGlzbid0CisgKiBhbiBpc3N1ZS4gVGhlIHVwcGVyIGJvdW5kIGlzbid0IGFuIGlzc3VlIHdpdGggZXhpc3RpbmcgdGVjaG5vbG9naWVzLgorICovCisjZGVmaW5lIEJXX1NDQUxFIDI0CisjZGVmaW5lIEJXX1VOSVQgKDEgPDwgQldfU0NBTEUpCisKKyNkZWZpbmUgQkJSX1NDQUxFIDgJLyogc2NhbGluZyBmYWN0b3IgZm9yIGZyYWN0aW9ucyBpbiBCQlIgKGUuZy4gZ2FpbnMpICovCisjZGVmaW5lIEJCUl9VTklUICgxIDw8IEJCUl9TQ0FMRSkKKworLyogQkJSIGhhcyB0aGUgZm9sbG93aW5nIG1vZGVzIGZvciBkZWNpZGluZyBob3cgZmFzdCB0byBzZW5kOiAqLworZW51bSBiYnJfbW9kZSB7CisJQkJSX1NUQVJUVVAsCS8qIHJhbXAgdXAgc2VuZGluZyByYXRlIHJhcGlkbHkgdG8gZmlsbCBwaXBlICovCisJQkJSX0RSQUlOLAkvKiBkcmFpbiBhbnkgcXVldWUgY3JlYXRlZCBkdXJpbmcgc3RhcnR1cCAqLworCUJCUl9QUk9CRV9CVywJLyogZGlzY292ZXIsIHNoYXJlIGJ3OiBwYWNlIGFyb3VuZCBlc3RpbWF0ZWQgYncgKi8KKwlCQlJfUFJPQkVfUlRULAkvKiBjdXQgY3duZCB0byBtaW4gdG8gcHJvYmUgbWluX3J0dCAqLworfTsKKworLyogQkJSIGNvbmdlc3Rpb24gY29udHJvbCBibG9jayAqLworc3RydWN0IGJiciB7CisJdTMyCW1pbl9ydHRfdXM7CSAgICAgICAgLyogbWluIFJUVCBpbiBtaW5fcnR0X3dpbl9zZWMgd2luZG93ICovCisJdTMyCW1pbl9ydHRfc3RhbXA7CSAgICAgICAgLyogdGltZXN0YW1wIG9mIG1pbl9ydHRfdXMgKi8KKwl1MzIJcHJvYmVfcnR0X2RvbmVfc3RhbXA7ICAgLyogZW5kIHRpbWUgZm9yIEJCUl9QUk9CRV9SVFQgbW9kZSAqLworCXN0cnVjdCBtaW5tYXggYnc7CS8qIE1heCByZWNlbnQgZGVsaXZlcnkgcmF0ZSBpbiBwa3RzL3VTIDw8IDI0ICovCisJdTMyCXJ0dF9jbnQ7CSAgICAvKiBjb3VudCBvZiBwYWNrZXQtdGltZWQgcm91bmRzIGVsYXBzZWQgKi8KKwl1MzIgICAgIG5leHRfcnR0X2RlbGl2ZXJlZDsgLyogc2NiLT50eC5kZWxpdmVyZWQgYXQgZW5kIG9mIHJvdW5kICovCisJc3RydWN0IHNrYl9tc3RhbXAgY3ljbGVfbXN0YW1wOyAgLyogdGltZSBvZiB0aGlzIGN5Y2xlIHBoYXNlIHN0YXJ0ICovCisJdTMyICAgICBtb2RlOjMsCQkgICAgIC8qIGN1cnJlbnQgYmJyX21vZGUgaW4gc3RhdGUgbWFjaGluZSAqLworCQlwcmV2X2NhX3N0YXRlOjMsICAgICAvKiBDQSBzdGF0ZSBvbiBwcmV2aW91cyBBQ0sgKi8KKwkJcGFja2V0X2NvbnNlcnZhdGlvbjoxLCAgLyogdXNlIHBhY2tldCBjb25zZXJ2YXRpb24/ICovCisJCXJlc3RvcmVfY3duZDoxLAkgICAgIC8qIGRlY2lkZWQgdG8gcmV2ZXJ0IGN3bmQgdG8gb2xkIHZhbHVlICovCisJCXJvdW5kX3N0YXJ0OjEsCSAgICAgLyogc3RhcnQgb2YgcGFja2V0LXRpbWVkIHR4LT5hY2sgcm91bmQ/ICovCisJCXRzb19zZWdzX2dvYWw6NywgICAgIC8qIHNlZ21lbnRzIHdlIHdhbnQgaW4gZWFjaCBza2Igd2Ugc2VuZCAqLworCQlpZGxlX3Jlc3RhcnQ6MSwJICAgICAvKiByZXN0YXJ0aW5nIGFmdGVyIGlkbGU/ICovCisJCXByb2JlX3J0dF9yb3VuZF9kb25lOjEsICAvKiBhIEJCUl9QUk9CRV9SVFQgcm91bmQgYXQgNCBwa3RzPyAqLworCQl1bnVzZWQ6NSwKKwkJbHRfaXNfc2FtcGxpbmc6MSwgICAgLyogdGFraW5nIGxvbmctdGVybSAoIkxUIikgc2FtcGxlcyBub3c/ICovCisJCWx0X3J0dF9jbnQ6NywJICAgICAvKiByb3VuZCB0cmlwcyBpbiBsb25nLXRlcm0gaW50ZXJ2YWwgKi8KKwkJbHRfdXNlX2J3OjE7CSAgICAgLyogdXNlIGx0X2J3IGFzIG91ciBidyBlc3RpbWF0ZT8gKi8KKwl1MzIJbHRfYnc7CQkgICAgIC8qIExUIGVzdCBkZWxpdmVyeSByYXRlIGluIHBrdHMvdVMgPDwgMjQgKi8KKwl1MzIJbHRfbGFzdF9kZWxpdmVyZWQ7ICAgLyogTFQgaW50dmwgc3RhcnQ6IHRwLT5kZWxpdmVyZWQgKi8KKwl1MzIJbHRfbGFzdF9zdGFtcDsJICAgICAvKiBMVCBpbnR2bCBzdGFydDogdHAtPmRlbGl2ZXJlZF9tc3RhbXAgKi8KKwl1MzIJbHRfbGFzdF9sb3N0OwkgICAgIC8qIExUIGludHZsIHN0YXJ0OiB0cC0+bG9zdCAqLworCXUzMglwYWNpbmdfZ2FpbjoxMCwJLyogY3VycmVudCBnYWluIGZvciBzZXR0aW5nIHBhY2luZyByYXRlICovCisJCWN3bmRfZ2FpbjoxMCwJLyogY3VycmVudCBnYWluIGZvciBzZXR0aW5nIGN3bmQgKi8KKwkJZnVsbF9id19jbnQ6MywJLyogbnVtYmVyIG9mIHJvdW5kcyB3aXRob3V0IGxhcmdlIGJ3IGdhaW5zICovCisJCWN5Y2xlX2lkeDozLAkvKiBjdXJyZW50IGluZGV4IGluIHBhY2luZ19nYWluIGN5Y2xlIGFycmF5ICovCisJCXVudXNlZF9iOjY7CisJdTMyCXByaW9yX2N3bmQ7CS8qIHByaW9yIGN3bmQgdXBvbiBlbnRlcmluZyBsb3NzIHJlY292ZXJ5ICovCisJdTMyCWZ1bGxfYnc7CS8qIHJlY2VudCBidywgdG8gZXN0aW1hdGUgaWYgcGlwZSBpcyBmdWxsICovCit9OworCisjZGVmaW5lIENZQ0xFX0xFTgk4CS8qIG51bWJlciBvZiBwaGFzZXMgaW4gYSBwYWNpbmcgZ2FpbiBjeWNsZSAqLworCisvKiBXaW5kb3cgbGVuZ3RoIG9mIGJ3IGZpbHRlciAoaW4gcm91bmRzKTogKi8KK3N0YXRpYyBjb25zdCBpbnQgYmJyX2J3X3J0dHMgPSBDWUNMRV9MRU4gKyAyOworLyogV2luZG93IGxlbmd0aCBvZiBtaW5fcnR0IGZpbHRlciAoaW4gc2VjKTogKi8KK3N0YXRpYyBjb25zdCB1MzIgYmJyX21pbl9ydHRfd2luX3NlYyA9IDEwOworLyogTWluaW11bSB0aW1lIChpbiBtcykgc3BlbnQgYXQgYmJyX2N3bmRfbWluX3RhcmdldCBpbiBCQlJfUFJPQkVfUlRUIG1vZGU6ICovCitzdGF0aWMgY29uc3QgdTMyIGJicl9wcm9iZV9ydHRfbW9kZV9tcyA9IDIwMDsKKy8qIFNraXAgVFNPIGJlbG93IHRoZSBmb2xsb3dpbmcgYmFuZHdpZHRoIChiaXRzL3NlYyk6ICovCitzdGF0aWMgY29uc3QgaW50IGJicl9taW5fdHNvX3JhdGUgPSAxMjAwMDAwOworCisvKiBXZSB1c2UgYSBoaWdoX2dhaW4gdmFsdWUgb2YgMi9sbigyKSBiZWNhdXNlIGl0J3MgdGhlIHNtYWxsZXN0IHBhY2luZyBnYWluCisgKiB0aGF0IHdpbGwgYWxsb3cgYSBzbW9vdGhseSBpbmNyZWFzaW5nIHBhY2luZyByYXRlIHRoYXQgd2lsbCBkb3VibGUgZWFjaCBSVFQKKyAqIGFuZCBzZW5kIHRoZSBzYW1lIG51bWJlciBvZiBwYWNrZXRzIHBlciBSVFQgdGhhdCBhbiB1bi1wYWNlZCwgc2xvdy1zdGFydGluZworICogUmVubyBvciBDVUJJQyBmbG93IHdvdWxkOgorICovCitzdGF0aWMgY29uc3QgaW50IGJicl9oaWdoX2dhaW4gID0gQkJSX1VOSVQgKiAyODg1IC8gMTAwMCArIDE7CisvKiBUaGUgcGFjaW5nIGdhaW4gb2YgMS9oaWdoX2dhaW4gaW4gQkJSX0RSQUlOIGlzIGNhbGN1bGF0ZWQgdG8gdHlwaWNhbGx5IGRyYWluCisgKiB0aGUgcXVldWUgY3JlYXRlZCBpbiBCQlJfU1RBUlRVUCBpbiBhIHNpbmdsZSByb3VuZDoKKyAqLworc3RhdGljIGNvbnN0IGludCBiYnJfZHJhaW5fZ2FpbiA9IEJCUl9VTklUICogMTAwMCAvIDI4ODU7CisvKiBUaGUgZ2FpbiBmb3IgZGVyaXZpbmcgc3RlYWR5LXN0YXRlIGN3bmQgdG9sZXJhdGVzIGRlbGF5ZWQvc3RyZXRjaGVkIEFDS3M6ICovCitzdGF0aWMgY29uc3QgaW50IGJicl9jd25kX2dhaW4gID0gQkJSX1VOSVQgKiAyOworLyogVGhlIHBhY2luZ19nYWluIHZhbHVlcyBmb3IgdGhlIFBST0JFX0JXIGdhaW4gY3ljbGUsIHRvIGRpc2NvdmVyL3NoYXJlIGJ3OiAqLworc3RhdGljIGNvbnN0IGludCBiYnJfcGFjaW5nX2dhaW5bXSA9IHsKKwlCQlJfVU5JVCAqIDUgLyA0LAkvKiBwcm9iZSBmb3IgbW9yZSBhdmFpbGFibGUgYncgKi8KKwlCQlJfVU5JVCAqIDMgLyA0LAkvKiBkcmFpbiBxdWV1ZSBhbmQvb3IgeWllbGQgYncgdG8gb3RoZXIgZmxvd3MgKi8KKwlCQlJfVU5JVCwgQkJSX1VOSVQsIEJCUl9VTklULAkvKiBjcnVpc2UgYXQgMS4wKmJ3IHRvIHV0aWxpemUgcGlwZSwgKi8KKwlCQlJfVU5JVCwgQkJSX1VOSVQsIEJCUl9VTklUCS8qIHdpdGhvdXQgY3JlYXRpbmcgZXhjZXNzIHF1ZXVlLi4uICovCit9OworLyogUmFuZG9taXplIHRoZSBzdGFydGluZyBnYWluIGN5Y2xpbmcgcGhhc2Ugb3ZlciBOIHBoYXNlczogKi8KK3N0YXRpYyBjb25zdCB1MzIgYmJyX2N5Y2xlX3JhbmQgPSA3OworCisvKiBUcnkgdG8ga2VlcCBhdCBsZWFzdCB0aGlzIG1hbnkgcGFja2V0cyBpbiBmbGlnaHQsIGlmIHRoaW5ncyBnbyBzbW9vdGhseS4gRm9yCisgKiBzbW9vdGggZnVuY3Rpb25pbmcsIGEgc2xpZGluZyB3aW5kb3cgcHJvdG9jb2wgQUNLaW5nIGV2ZXJ5IG90aGVyIHBhY2tldAorICogbmVlZHMgYXQgbGVhc3QgNCBwYWNrZXRzIGluIGZsaWdodDoKKyAqLworc3RhdGljIGNvbnN0IHUzMiBiYnJfY3duZF9taW5fdGFyZ2V0ID0gNDsKKworLyogVG8gZXN0aW1hdGUgaWYgQkJSX1NUQVJUVVAgbW9kZSAoaS5lLiBoaWdoX2dhaW4pIGhhcyBmaWxsZWQgcGlwZS4uLiAqLworLyogSWYgYncgaGFzIGluY3JlYXNlZCBzaWduaWZpY2FudGx5ICgxLjI1eCksIHRoZXJlIG1heSBiZSBtb3JlIGJ3IGF2YWlsYWJsZTogKi8KK3N0YXRpYyBjb25zdCB1MzIgYmJyX2Z1bGxfYndfdGhyZXNoID0gQkJSX1VOSVQgKiA1IC8gNDsKKy8qIEJ1dCBhZnRlciAzIHJvdW5kcyB3L28gc2lnbmlmaWNhbnQgYncgZ3Jvd3RoLCBlc3RpbWF0ZSBwaXBlIGlzIGZ1bGw6ICovCitzdGF0aWMgY29uc3QgdTMyIGJicl9mdWxsX2J3X2NudCA9IDM7CisKKy8qICJsb25nLXRlcm0iICgiTFQiKSBiYW5kd2lkdGggZXN0aW1hdG9yIHBhcmFtZXRlcnMuLi4gKi8KKy8qIFRoZSBtaW5pbXVtIG51bWJlciBvZiByb3VuZHMgaW4gYW4gTFQgYncgc2FtcGxpbmcgaW50ZXJ2YWw6ICovCitzdGF0aWMgY29uc3QgdTMyIGJicl9sdF9pbnR2bF9taW5fcnR0cyA9IDQ7CisvKiBJZiBsb3N0L2RlbGl2ZXJlZCByYXRpbyA+IDIwJSwgaW50ZXJ2YWwgaXMgImxvc3N5IiBhbmQgd2UgbWF5IGJlIHBvbGljZWQ6ICovCitzdGF0aWMgY29uc3QgdTMyIGJicl9sdF9sb3NzX3RocmVzaCA9IDUwOworLyogSWYgMiBpbnRlcnZhbHMgaGF2ZSBhIGJ3IHJhdGlvIDw9IDEvOCwgdGhlaXIgYncgaXMgImNvbnNpc3RlbnQiOiAqLworc3RhdGljIGNvbnN0IHUzMiBiYnJfbHRfYndfcmF0aW8gPSBCQlJfVU5JVCAvIDg7CisvKiBJZiAyIGludGVydmFscyBoYXZlIGEgYncgZGlmZiA8PSA0IEtiaXQvc2VjIHRoZWlyIGJ3IGlzICJjb25zaXN0ZW50IjogKi8KK3N0YXRpYyBjb25zdCB1MzIgYmJyX2x0X2J3X2RpZmYgPSA0MDAwIC8gODsKKy8qIElmIHdlIGVzdGltYXRlIHdlJ3JlIHBvbGljZWQsIHVzZSBsdF9idyBmb3IgdGhpcyBtYW55IHJvdW5kIHRyaXBzOiAqLworc3RhdGljIGNvbnN0IHUzMiBiYnJfbHRfYndfbWF4X3J0dHMgPSA0ODsKKworLyogRG8gd2UgZXN0aW1hdGUgdGhhdCBTVEFSVFVQIGZpbGxlZCB0aGUgcGlwZT8gKi8KK3N0YXRpYyBib29sIGJicl9mdWxsX2J3X3JlYWNoZWQoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQoreworCWNvbnN0IHN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCXJldHVybiBiYnItPmZ1bGxfYndfY250ID49IGJicl9mdWxsX2J3X2NudDsKK30KKworLyogUmV0dXJuIHRoZSB3aW5kb3dlZCBtYXggcmVjZW50IGJhbmR3aWR0aCBzYW1wbGUsIGluIHBrdHMvdVMgPDwgQldfU0NBTEUuICovCitzdGF0aWMgdTMyIGJicl9tYXhfYncoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCXJldHVybiBtaW5tYXhfZ2V0KCZiYnItPmJ3KTsKK30KKworLyogUmV0dXJuIHRoZSBlc3RpbWF0ZWQgYmFuZHdpZHRoIG9mIHRoZSBwYXRoLCBpbiBwa3RzL3VTIDw8IEJXX1NDQUxFLiAqLworc3RhdGljIHUzMiBiYnJfYncoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCXJldHVybiBiYnItPmx0X3VzZV9idyA/IGJici0+bHRfYncgOiBiYnJfbWF4X2J3KHNrKTsKK30KKworLyogUmV0dXJuIHJhdGUgaW4gYnl0ZXMgcGVyIHNlY29uZCwgb3B0aW9uYWxseSB3aXRoIGEgZ2Fpbi4KKyAqIFRoZSBvcmRlciBoZXJlIGlzIGNob3NlbiBjYXJlZnVsbHkgdG8gYXZvaWQgb3ZlcmZsb3cgb2YgdTY0LiBUaGlzIHNob3VsZAorICogd29yayBmb3IgaW5wdXQgcmF0ZXMgb2YgdXAgdG8gMi45VGJpdC9zZWMgYW5kIGdhaW4gb2YgMi44OXguCisgKi8KK3N0YXRpYyB1NjQgYmJyX3JhdGVfYnl0ZXNfcGVyX3NlYyhzdHJ1Y3Qgc29jayAqc2ssIHU2NCByYXRlLCBpbnQgZ2FpbikKK3sKKwlyYXRlICo9IHRjcF9tc3NfdG9fbXR1KHNrLCB0Y3Bfc2soc2spLT5tc3NfY2FjaGUpOworCXJhdGUgKj0gZ2FpbjsKKwlyYXRlID4+PSBCQlJfU0NBTEU7CisJcmF0ZSAqPSBVU0VDX1BFUl9TRUM7CisJcmV0dXJuIHJhdGUgPj4gQldfU0NBTEU7Cit9CisKKy8qIFBhY2UgdXNpbmcgY3VycmVudCBidyBlc3RpbWF0ZSBhbmQgYSBnYWluIGZhY3Rvci4gSW4gb3JkZXIgdG8gaGVscCBkcml2ZSB0aGUKKyAqIG5ldHdvcmsgdG93YXJkIGxvd2VyIHF1ZXVlcyB3aGlsZSBtYWludGFpbmluZyBoaWdoIHV0aWxpemF0aW9uIGFuZCBsb3cKKyAqIGxhdGVuY3ksIHRoZSBhdmVyYWdlIHBhY2luZyByYXRlIGFpbXMgdG8gYmUgc2xpZ2h0bHkgKH4xJSkgbG93ZXIgdGhhbiB0aGUKKyAqIGVzdGltYXRlZCBiYW5kd2lkdGguIFRoaXMgaXMgYW4gaW1wb3J0YW50IGFzcGVjdCBvZiB0aGUgZGVzaWduLiBJbiB0aGlzCisgKiBpbXBsZW1lbnRhdGlvbiB0aGlzIHNsaWdodGx5IGxvd2VyIHBhY2luZyByYXRlIGlzIGFjaGlldmVkIGltcGxpY2l0bHkgYnkgbm90CisgKiBpbmNsdWRpbmcgbGluay1sYXllciBoZWFkZXJzIGluIHRoZSBwYWNrZXQgc2l6ZSB1c2VkIGZvciB0aGUgcGFjaW5nIHJhdGUuCisgKi8KK3N0YXRpYyB2b2lkIGJicl9zZXRfcGFjaW5nX3JhdGUoc3RydWN0IHNvY2sgKnNrLCB1MzIgYncsIGludCBnYWluKQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKwl1NjQgcmF0ZSA9IGJ3OworCisJcmF0ZSA9IGJicl9yYXRlX2J5dGVzX3Blcl9zZWMoc2ssIHJhdGUsIGdhaW4pOworCXJhdGUgPSBtaW5fdCh1NjQsIHJhdGUsIHNrLT5za19tYXhfcGFjaW5nX3JhdGUpOworCWlmIChiYnItPm1vZGUgIT0gQkJSX1NUQVJUVVAgfHwgcmF0ZSA+IHNrLT5za19wYWNpbmdfcmF0ZSkKKwkJc2stPnNrX3BhY2luZ19yYXRlID0gcmF0ZTsKK30KKworLyogUmV0dXJuIGNvdW50IG9mIHNlZ21lbnRzIHdlIHdhbnQgaW4gdGhlIHNrYnMgd2Ugc2VuZCwgb3IgMCBmb3IgZGVmYXVsdC4gKi8KK3N0YXRpYyB1MzIgYmJyX3Rzb19zZWdzX2dvYWwoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCXJldHVybiBiYnItPnRzb19zZWdzX2dvYWw7Cit9CisKK3N0YXRpYyB2b2lkIGJicl9zZXRfdHNvX3NlZ3NfZ29hbChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCXUzMiBtaW5fc2VnczsKKworCW1pbl9zZWdzID0gc2stPnNrX3BhY2luZ19yYXRlIDwgKGJicl9taW5fdHNvX3JhdGUgPj4gMykgPyAxIDogMjsKKwliYnItPnRzb19zZWdzX2dvYWwgPSBtaW4odGNwX3Rzb19hdXRvc2l6ZShzaywgdHAtPm1zc19jYWNoZSwgbWluX3NlZ3MpLAorCQkJCSAweDdGVSk7Cit9CisKKy8qIFNhdmUgImxhc3Qga25vd24gZ29vZCIgY3duZCBzbyB3ZSBjYW4gcmVzdG9yZSBpdCBhZnRlciBsb3NzZXMgb3IgUFJPQkVfUlRUICovCitzdGF0aWMgdm9pZCBiYnJfc2F2ZV9jd25kKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisKKwlpZiAoYmJyLT5wcmV2X2NhX3N0YXRlIDwgVENQX0NBX1JlY292ZXJ5ICYmIGJici0+bW9kZSAhPSBCQlJfUFJPQkVfUlRUKQorCQliYnItPnByaW9yX2N3bmQgPSB0cC0+c25kX2N3bmQ7ICAvKiB0aGlzIGN3bmQgaXMgZ29vZCBlbm91Z2ggKi8KKwllbHNlICAvKiBsb3NzIHJlY292ZXJ5IG9yIEJCUl9QUk9CRV9SVFQgaGF2ZSB0ZW1wb3JhcmlseSBjdXQgY3duZCAqLworCQliYnItPnByaW9yX2N3bmQgPSBtYXgoYmJyLT5wcmlvcl9jd25kLCB0cC0+c25kX2N3bmQpOworfQorCitzdGF0aWMgdm9pZCBiYnJfY3duZF9ldmVudChzdHJ1Y3Qgc29jayAqc2ssIGVudW0gdGNwX2NhX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCWlmIChldmVudCA9PSBDQV9FVkVOVF9UWF9TVEFSVCAmJiB0cC0+YXBwX2xpbWl0ZWQpIHsKKwkJYmJyLT5pZGxlX3Jlc3RhcnQgPSAxOworCQkvKiBBdm9pZCBwb2ludGxlc3MgYnVmZmVyIG92ZXJmbG93czogcGFjZSBhdCBlc3QuIGJ3IGlmIHdlIGRvbid0CisJCSAqIG5lZWQgbW9yZSBzcGVlZCAod2UncmUgcmVzdGFydGluZyBmcm9tIGlkbGUgYW5kIGFwcC1saW1pdGVkKS4KKwkJICovCisJCWlmIChiYnItPm1vZGUgPT0gQkJSX1BST0JFX0JXKQorCQkJYmJyX3NldF9wYWNpbmdfcmF0ZShzaywgYmJyX2J3KHNrKSwgQkJSX1VOSVQpOworCX0KK30KKworLyogRmluZCB0YXJnZXQgY3duZC4gUmlnaHQtc2l6ZSB0aGUgY3duZCBiYXNlZCBvbiBtaW4gUlRUIGFuZCB0aGUKKyAqIGVzdGltYXRlZCBib3R0bGVuZWNrIGJhbmR3aWR0aDoKKyAqCisgKiBjd25kID0gYncgKiBtaW5fcnR0ICogZ2FpbiA9IEJEUCAqIGdhaW4KKyAqCisgKiBUaGUga2V5IGZhY3RvciwgZ2FpbiwgY29udHJvbHMgdGhlIGFtb3VudCBvZiBxdWV1ZS4gV2hpbGUgYSBzbWFsbCBnYWluCisgKiBidWlsZHMgYSBzbWFsbGVyIHF1ZXVlLCBpdCBiZWNvbWVzIG1vcmUgdnVsbmVyYWJsZSB0byBub2lzZSBpbiBSVFQKKyAqIG1lYXN1cmVtZW50cyAoZS5nLiwgZGVsYXllZCBBQ0tzIG9yIG90aGVyIEFDSyBjb21wcmVzc2lvbiBlZmZlY3RzKS4gVGhpcworICogbm9pc2UgbWF5IGNhdXNlIEJCUiB0byB1bmRlci1lc3RpbWF0ZSB0aGUgcmF0ZS4KKyAqCisgKiBUbyBhY2hpZXZlIGZ1bGwgcGVyZm9ybWFuY2UgaW4gaGlnaC1zcGVlZCBwYXRocywgd2UgYnVkZ2V0IGVub3VnaCBjd25kIHRvCisgKiBmaXQgZnVsbC1zaXplZCBza2JzIGluLWZsaWdodCBvbiBib3RoIGVuZCBob3N0cyB0byBmdWxseSB1dGlsaXplIHRoZSBwYXRoOgorICogICAtIG9uZSBza2IgaW4gc2VuZGluZyBob3N0IFFkaXNjLAorICogICAtIG9uZSBza2IgaW4gc2VuZGluZyBob3N0IFRTTy9HU08gZW5naW5lCisgKiAgIC0gb25lIHNrYiBiZWluZyByZWNlaXZlZCBieSByZWNlaXZlciBob3N0IExSTy9HUk8vZGVsYXllZC1BQ0sgZW5naW5lCisgKiBEb24ndCB3b3JyeSwgYXQgbG93IHJhdGVzIChiYnJfbWluX3Rzb19yYXRlKSB0aGlzIHdvbid0IGJsb2F0IGN3bmQgYmVjYXVzZQorICogaW4gc3VjaCBjYXNlcyB0c29fc2Vnc19nb2FsIGlzIDEuIFRoZSBtaW5pbXVtIGN3bmQgaXMgNCBwYWNrZXRzLAorICogd2hpY2ggYWxsb3dzIDIgb3V0c3RhbmRpbmcgMi1wYWNrZXQgc2VxdWVuY2VzLCB0byB0cnkgdG8ga2VlcCBwaXBlCisgKiBmdWxsIGV2ZW4gd2l0aCBBQ0stZXZlcnktb3RoZXItcGFja2V0IGRlbGF5ZWQgQUNLcy4KKyAqLworc3RhdGljIHUzMiBiYnJfdGFyZ2V0X2N3bmQoc3RydWN0IHNvY2sgKnNrLCB1MzIgYncsIGludCBnYWluKQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKwl1MzIgY3duZDsKKwl1NjQgdzsKKworCS8qIElmIHdlJ3ZlIG5ldmVyIGhhZCBhIHZhbGlkIFJUVCBzYW1wbGUsIGNhcCBjd25kIGF0IHRoZSBpbml0aWFsCisJICogZGVmYXVsdC4gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBub3QgdXNpbmcgVENQCisJICogdGltZXN0YW1wcyBhbmQgaGFzIHJldHJhbnNtaXR0ZWQgYWxsIG9mIHRoZSBTWU4vU1lOQUNLL2RhdGEgcGFja2V0cworCSAqIEFDS2VkIHNvIGZhci4gSW4gdGhpcyBjYXNlLCBhbiBSVE8gY2FuIGN1dCBjd25kIHRvIDEsIGluIHdoaWNoCisJICogY2FzZSB3ZSBuZWVkIHRvIHNsb3ctc3RhcnQgdXAgdG93YXJkIHNvbWV0aGluZyBzYWZlOiBUQ1BfSU5JVF9DV05ELgorCSAqLworCWlmICh1bmxpa2VseShiYnItPm1pbl9ydHRfdXMgPT0gfjBVKSkJIC8qIG5vIHZhbGlkIFJUVCBzYW1wbGVzIHlldD8gKi8KKwkJcmV0dXJuIFRDUF9JTklUX0NXTkQ7ICAvKiBiZSBzYWZlOiBjYXAgYXQgZGVmYXVsdCBpbml0aWFsIGN3bmQqLworCisJdyA9ICh1NjQpYncgKiBiYnItPm1pbl9ydHRfdXM7CisKKwkvKiBBcHBseSBhIGdhaW4gdG8gdGhlIGdpdmVuIHZhbHVlLCB0aGVuIHJlbW92ZSB0aGUgQldfU0NBTEUgc2hpZnQuICovCisJY3duZCA9ICgoKHcgKiBnYWluKSA+PiBCQlJfU0NBTEUpICsgQldfVU5JVCAtIDEpIC8gQldfVU5JVDsKKworCS8qIEFsbG93IGVub3VnaCBmdWxsLXNpemVkIHNrYnMgaW4gZmxpZ2h0IHRvIHV0aWxpemUgZW5kIHN5c3RlbXMuICovCisJY3duZCArPSAzICogYmJyLT50c29fc2Vnc19nb2FsOworCisJLyogUmVkdWNlIGRlbGF5ZWQgQUNLcyBieSByb3VuZGluZyB1cCBjd25kIHRvIHRoZSBuZXh0IGV2ZW4gbnVtYmVyLiAqLworCWN3bmQgPSAoY3duZCArIDEpICYgfjFVOworCisJcmV0dXJuIGN3bmQ7Cit9CisKKy8qIEFuIG9wdGltaXphdGlvbiBpbiBCQlIgdG8gcmVkdWNlIGxvc3NlczogT24gdGhlIGZpcnN0IHJvdW5kIG9mIHJlY292ZXJ5LCB3ZQorICogZm9sbG93IHRoZSBwYWNrZXQgY29uc2VydmF0aW9uIHByaW5jaXBsZTogc2VuZCBQIHBhY2tldHMgcGVyIFAgcGFja2V0cyBhY2tlZC4KKyAqIEFmdGVyIHRoYXQsIHdlIHNsb3ctc3RhcnQgYW5kIHNlbmQgYXQgbW9zdCAyKlAgcGFja2V0cyBwZXIgUCBwYWNrZXRzIGFja2VkLgorICogQWZ0ZXIgcmVjb3ZlcnkgZmluaXNoZXMsIG9yIHVwb24gdW5kbywgd2UgcmVzdG9yZSB0aGUgY3duZCB3ZSBoYWQgd2hlbgorICogcmVjb3Zlcnkgc3RhcnRlZCAoY2FwcGVkIGJ5IHRoZSB0YXJnZXQgY3duZCBiYXNlZCBvbiBlc3RpbWF0ZWQgQkRQKS4KKyAqCisgKiBUT0RPKHljaGVuZy9uY2FyZHdlbGwpOiBpbXBsZW1lbnQgYSByYXRlLWJhc2VkIGFwcHJvYWNoLgorICovCitzdGF0aWMgYm9vbCBiYnJfc2V0X2N3bmRfdG9fcmVjb3Zlcl9vcl9yZXN0b3JlKAorCXN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHJhdGVfc2FtcGxlICpycywgdTMyIGFja2VkLCB1MzIgKm5ld19jd25kKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKwl1OCBwcmV2X3N0YXRlID0gYmJyLT5wcmV2X2NhX3N0YXRlLCBzdGF0ZSA9IGluZXRfY3NrKHNrKS0+aWNza19jYV9zdGF0ZTsKKwl1MzIgY3duZCA9IHRwLT5zbmRfY3duZDsKKworCS8qIEFuIEFDSyBmb3IgUCBwa3RzIHNob3VsZCByZWxlYXNlIGF0IG1vc3QgMipQIHBhY2tldHMuIFdlIGRvIHRoaXMKKwkgKiBpbiB0d28gc3RlcHMuIEZpcnN0LCBoZXJlIHdlIGRlZHVjdCB0aGUgbnVtYmVyIG9mIGxvc3QgcGFja2V0cy4KKwkgKiBUaGVuLCBpbiBiYnJfc2V0X2N3bmQoKSB3ZSBzbG93IHN0YXJ0IHVwIHRvd2FyZCB0aGUgdGFyZ2V0IGN3bmQuCisJICovCisJaWYgKHJzLT5sb3NzZXMgPiAwKQorCQljd25kID0gbWF4X3QoczMyLCBjd25kIC0gcnMtPmxvc3NlcywgMSk7CisKKwlpZiAoc3RhdGUgPT0gVENQX0NBX1JlY292ZXJ5ICYmIHByZXZfc3RhdGUgIT0gVENQX0NBX1JlY292ZXJ5KSB7CisJCS8qIFN0YXJ0aW5nIDFzdCByb3VuZCBvZiBSZWNvdmVyeSwgc28gZG8gcGFja2V0IGNvbnNlcnZhdGlvbi4gKi8KKwkJYmJyLT5wYWNrZXRfY29uc2VydmF0aW9uID0gMTsKKwkJYmJyLT5uZXh0X3J0dF9kZWxpdmVyZWQgPSB0cC0+ZGVsaXZlcmVkOyAgLyogc3RhcnQgcm91bmQgbm93ICovCisJCS8qIEN1dCB1bnVzZWQgY3duZCBmcm9tIGFwcCBiZWhhdmlvciwgVFNRLCBvciBUU08gZGVmZXJyYWw6ICovCisJCWN3bmQgPSB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApICsgYWNrZWQ7CisJfSBlbHNlIGlmIChwcmV2X3N0YXRlID49IFRDUF9DQV9SZWNvdmVyeSAmJiBzdGF0ZSA8IFRDUF9DQV9SZWNvdmVyeSkgeworCQkvKiBFeGl0aW5nIGxvc3MgcmVjb3Zlcnk7IHJlc3RvcmUgY3duZCBzYXZlZCBiZWZvcmUgcmVjb3ZlcnkuICovCisJCWJici0+cmVzdG9yZV9jd25kID0gMTsKKwkJYmJyLT5wYWNrZXRfY29uc2VydmF0aW9uID0gMDsKKwl9CisJYmJyLT5wcmV2X2NhX3N0YXRlID0gc3RhdGU7CisKKwlpZiAoYmJyLT5yZXN0b3JlX2N3bmQpIHsKKwkJLyogUmVzdG9yZSBjd25kIGFmdGVyIGV4aXRpbmcgbG9zcyByZWNvdmVyeSBvciBQUk9CRV9SVFQuICovCisJCWN3bmQgPSBtYXgoY3duZCwgYmJyLT5wcmlvcl9jd25kKTsKKwkJYmJyLT5yZXN0b3JlX2N3bmQgPSAwOworCX0KKworCWlmIChiYnItPnBhY2tldF9jb25zZXJ2YXRpb24pIHsKKwkJKm5ld19jd25kID0gbWF4KGN3bmQsIHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCkgKyBhY2tlZCk7CisJCXJldHVybiB0cnVlOwkvKiB5ZXMsIHVzaW5nIHBhY2tldCBjb25zZXJ2YXRpb24gKi8KKwl9CisJKm5ld19jd25kID0gY3duZDsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIFNsb3ctc3RhcnQgdXAgdG93YXJkIHRhcmdldCBjd25kIChpZiBidyBlc3RpbWF0ZSBpcyBncm93aW5nLCBvciBwYWNrZXQgbG9zcworICogaGFzIGRyYXduIHVzIGRvd24gYmVsb3cgdGFyZ2V0KSwgb3Igc25hcCBkb3duIHRvIHRhcmdldCBpZiB3ZSdyZSBhYm92ZSBpdC4KKyAqLworc3RhdGljIHZvaWQgYmJyX3NldF9jd25kKHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHJhdGVfc2FtcGxlICpycywKKwkJCSB1MzIgYWNrZWQsIHUzMiBidywgaW50IGdhaW4pCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCXUzMiBjd25kID0gMCwgdGFyZ2V0X2N3bmQgPSAwOworCisJaWYgKCFhY2tlZCkKKwkJcmV0dXJuOworCisJaWYgKGJicl9zZXRfY3duZF90b19yZWNvdmVyX29yX3Jlc3RvcmUoc2ssIHJzLCBhY2tlZCwgJmN3bmQpKQorCQlnb3RvIGRvbmU7CisKKwkvKiBJZiB3ZSdyZSBiZWxvdyB0YXJnZXQgY3duZCwgc2xvdyBzdGFydCBjd25kIHRvd2FyZCB0YXJnZXQgY3duZC4gKi8KKwl0YXJnZXRfY3duZCA9IGJicl90YXJnZXRfY3duZChzaywgYncsIGdhaW4pOworCWlmIChiYnJfZnVsbF9id19yZWFjaGVkKHNrKSkgIC8qIG9ubHkgY3V0IGN3bmQgaWYgd2UgZmlsbGVkIHRoZSBwaXBlICovCisJCWN3bmQgPSBtaW4oY3duZCArIGFja2VkLCB0YXJnZXRfY3duZCk7CisJZWxzZSBpZiAoY3duZCA8IHRhcmdldF9jd25kIHx8IHRwLT5kZWxpdmVyZWQgPCBUQ1BfSU5JVF9DV05EKQorCQljd25kID0gY3duZCArIGFja2VkOworCWN3bmQgPSBtYXgoY3duZCwgYmJyX2N3bmRfbWluX3RhcmdldCk7CisKK2RvbmU6CisJdHAtPnNuZF9jd25kID0gbWluKGN3bmQsIHRwLT5zbmRfY3duZF9jbGFtcCk7CS8qIGFwcGx5IGdsb2JhbCBjYXAgKi8KKwlpZiAoYmJyLT5tb2RlID09IEJCUl9QUk9CRV9SVFQpICAvKiBkcmFpbiBxdWV1ZSwgcmVmcmVzaCBtaW5fcnR0ICovCisJCXRwLT5zbmRfY3duZCA9IG1pbih0cC0+c25kX2N3bmQsIGJicl9jd25kX21pbl90YXJnZXQpOworfQorCisvKiBFbmQgY3ljbGUgcGhhc2UgaWYgaXQncyB0aW1lIGFuZC9vciB3ZSBoaXQgdGhlIHBoYXNlJ3MgaW4tZmxpZ2h0IHRhcmdldC4gKi8KK3N0YXRpYyBib29sIGJicl9pc19uZXh0X2N5Y2xlX3BoYXNlKHN0cnVjdCBzb2NrICpzaywKKwkJCQkgICAgY29uc3Qgc3RydWN0IHJhdGVfc2FtcGxlICpycykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisJYm9vbCBpc19mdWxsX2xlbmd0aCA9CisJCXNrYl9tc3RhbXBfdXNfZGVsdGEoJnRwLT5kZWxpdmVyZWRfbXN0YW1wLCAmYmJyLT5jeWNsZV9tc3RhbXApID4KKwkJYmJyLT5taW5fcnR0X3VzOworCXUzMiBpbmZsaWdodCwgYnc7CisKKwkvKiBUaGUgcGFjaW5nX2dhaW4gb2YgMS4wIHBhY2VzIGF0IHRoZSBlc3RpbWF0ZWQgYncgdG8gdHJ5IHRvIGZ1bGx5CisJICogdXNlIHRoZSBwaXBlIHdpdGhvdXQgaW5jcmVhc2luZyB0aGUgcXVldWUuCisJICovCisJaWYgKGJici0+cGFjaW5nX2dhaW4gPT0gQkJSX1VOSVQpCisJCXJldHVybiBpc19mdWxsX2xlbmd0aDsJCS8qIGp1c3QgdXNlIHdhbGwgY2xvY2sgdGltZSAqLworCisJaW5mbGlnaHQgPSBycy0+cHJpb3JfaW5fZmxpZ2h0OyAgLyogd2hhdCB3YXMgaW4tZmxpZ2h0IGJlZm9yZSBBQ0s/ICovCisJYncgPSBiYnJfbWF4X2J3KHNrKTsKKworCS8qIEEgcGFjaW5nX2dhaW4gPiAxLjAgcHJvYmVzIGZvciBidyBieSB0cnlpbmcgdG8gcmFpc2UgaW5mbGlnaHQgdG8gYXQKKwkgKiBsZWFzdCBwYWNpbmdfZ2FpbipCRFA7IHRoaXMgbWF5IHRha2UgbW9yZSB0aGFuIG1pbl9ydHQgaWYgbWluX3J0dCBpcworCSAqIHNtYWxsIChlLmcuIG9uIGEgTEFOKS4gV2UgZG8gbm90IHBlcnNpc3QgaWYgcGFja2V0cyBhcmUgbG9zdCwgc2luY2UKKwkgKiBhIHBhdGggd2l0aCBzbWFsbCBidWZmZXJzIG1heSBub3QgaG9sZCB0aGF0IG11Y2guCisJICovCisJaWYgKGJici0+cGFjaW5nX2dhaW4gPiBCQlJfVU5JVCkKKwkJcmV0dXJuIGlzX2Z1bGxfbGVuZ3RoICYmCisJCQkocnMtPmxvc3NlcyB8fCAgLyogcGVyaGFwcyBwYWNpbmdfZ2FpbipCRFAgd29uJ3QgZml0ICovCisJCQkgaW5mbGlnaHQgPj0gYmJyX3RhcmdldF9jd25kKHNrLCBidywgYmJyLT5wYWNpbmdfZ2FpbikpOworCisJLyogQSBwYWNpbmdfZ2FpbiA8IDEuMCB0cmllcyB0byBkcmFpbiBleHRyYSBxdWV1ZSB3ZSBhZGRlZCBpZiBidworCSAqIHByb2JpbmcgZGlkbid0IGZpbmQgbW9yZSBidy4gSWYgaW5mbGlnaHQgZmFsbHMgdG8gbWF0Y2ggQkRQIHRoZW4gd2UKKwkgKiBlc3RpbWF0ZSBxdWV1ZSBpcyBkcmFpbmVkOyBwZXJzaXN0aW5nIHdvdWxkIHVuZGVydXRpbGl6ZSB0aGUgcGlwZS4KKwkgKi8KKwlyZXR1cm4gaXNfZnVsbF9sZW5ndGggfHwKKwkJaW5mbGlnaHQgPD0gYmJyX3RhcmdldF9jd25kKHNrLCBidywgQkJSX1VOSVQpOworfQorCitzdGF0aWMgdm9pZCBiYnJfYWR2YW5jZV9jeWNsZV9waGFzZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCisJYmJyLT5jeWNsZV9pZHggPSAoYmJyLT5jeWNsZV9pZHggKyAxKSAmIChDWUNMRV9MRU4gLSAxKTsKKwliYnItPmN5Y2xlX21zdGFtcCA9IHRwLT5kZWxpdmVyZWRfbXN0YW1wOworCWJici0+cGFjaW5nX2dhaW4gPSBiYnJfcGFjaW5nX2dhaW5bYmJyLT5jeWNsZV9pZHhdOworfQorCisvKiBHYWluIGN5Y2xpbmc6IGN5Y2xlIHBhY2luZyBnYWluIHRvIGNvbnZlcmdlIHRvIGZhaXIgc2hhcmUgb2YgYXZhaWxhYmxlIGJ3LiAqLworc3RhdGljIHZvaWQgYmJyX3VwZGF0ZV9jeWNsZV9waGFzZShzdHJ1Y3Qgc29jayAqc2ssCisJCQkJICAgY29uc3Qgc3RydWN0IHJhdGVfc2FtcGxlICpycykKK3sKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisKKwlpZiAoKGJici0+bW9kZSA9PSBCQlJfUFJPQkVfQlcpICYmICFiYnItPmx0X3VzZV9idyAmJgorCSAgICBiYnJfaXNfbmV4dF9jeWNsZV9waGFzZShzaywgcnMpKQorCQliYnJfYWR2YW5jZV9jeWNsZV9waGFzZShzayk7Cit9CisKK3N0YXRpYyB2b2lkIGJicl9yZXNldF9zdGFydHVwX21vZGUoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCWJici0+bW9kZSA9IEJCUl9TVEFSVFVQOworCWJici0+cGFjaW5nX2dhaW4gPSBiYnJfaGlnaF9nYWluOworCWJici0+Y3duZF9nYWluCSA9IGJicl9oaWdoX2dhaW47Cit9CisKK3N0YXRpYyB2b2lkIGJicl9yZXNldF9wcm9iZV9id19tb2RlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisKKwliYnItPm1vZGUgPSBCQlJfUFJPQkVfQlc7CisJYmJyLT5wYWNpbmdfZ2FpbiA9IEJCUl9VTklUOworCWJici0+Y3duZF9nYWluID0gYmJyX2N3bmRfZ2FpbjsKKwliYnItPmN5Y2xlX2lkeCA9IENZQ0xFX0xFTiAtIDEgLSBwcmFuZG9tX3UzMl9tYXgoYmJyX2N5Y2xlX3JhbmQpOworCWJicl9hZHZhbmNlX2N5Y2xlX3BoYXNlKHNrKTsJLyogZmxpcCB0byBuZXh0IHBoYXNlIG9mIGdhaW4gY3ljbGUgKi8KK30KKworc3RhdGljIHZvaWQgYmJyX3Jlc2V0X21vZGUoc3RydWN0IHNvY2sgKnNrKQoreworCWlmICghYmJyX2Z1bGxfYndfcmVhY2hlZChzaykpCisJCWJicl9yZXNldF9zdGFydHVwX21vZGUoc2spOworCWVsc2UKKwkJYmJyX3Jlc2V0X3Byb2JlX2J3X21vZGUoc2spOworfQorCisvKiBTdGFydCBhIG5ldyBsb25nLXRlcm0gc2FtcGxpbmcgaW50ZXJ2YWwuICovCitzdGF0aWMgdm9pZCBiYnJfcmVzZXRfbHRfYndfc2FtcGxpbmdfaW50ZXJ2YWwoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCWJici0+bHRfbGFzdF9zdGFtcCA9IHRwLT5kZWxpdmVyZWRfbXN0YW1wLnN0YW1wX2ppZmZpZXM7CisJYmJyLT5sdF9sYXN0X2RlbGl2ZXJlZCA9IHRwLT5kZWxpdmVyZWQ7CisJYmJyLT5sdF9sYXN0X2xvc3QgPSB0cC0+bG9zdDsKKwliYnItPmx0X3J0dF9jbnQgPSAwOworfQorCisvKiBDb21wbGV0ZWx5IHJlc2V0IGxvbmctdGVybSBiYW5kd2lkdGggc2FtcGxpbmcuICovCitzdGF0aWMgdm9pZCBiYnJfcmVzZXRfbHRfYndfc2FtcGxpbmcoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCWJici0+bHRfYncgPSAwOworCWJici0+bHRfdXNlX2J3ID0gMDsKKwliYnItPmx0X2lzX3NhbXBsaW5nID0gZmFsc2U7CisJYmJyX3Jlc2V0X2x0X2J3X3NhbXBsaW5nX2ludGVydmFsKHNrKTsKK30KKworLyogTG9uZy10ZXJtIGJ3IHNhbXBsaW5nIGludGVydmFsIGlzIGRvbmUuIEVzdGltYXRlIHdoZXRoZXIgd2UncmUgcG9saWNlZC4gKi8KK3N0YXRpYyB2b2lkIGJicl9sdF9id19pbnRlcnZhbF9kb25lKHN0cnVjdCBzb2NrICpzaywgdTMyIGJ3KQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKwl1MzIgZGlmZjsKKworCWlmIChiYnItPmx0X2J3KSB7ICAvKiBkbyB3ZSBoYXZlIGJ3IGZyb20gYSBwcmV2aW91cyBpbnRlcnZhbD8gKi8KKwkJLyogSXMgbmV3IGJ3IGNsb3NlIHRvIHRoZSBsdF9idyBmcm9tIHRoZSBwcmV2aW91cyBpbnRlcnZhbD8gKi8KKwkJZGlmZiA9IGFicyhidyAtIGJici0+bHRfYncpOworCQlpZiAoKGRpZmYgKiBCQlJfVU5JVCA8PSBiYnJfbHRfYndfcmF0aW8gKiBiYnItPmx0X2J3KSB8fAorCQkgICAgKGJicl9yYXRlX2J5dGVzX3Blcl9zZWMoc2ssIGRpZmYsIEJCUl9VTklUKSA8PQorCQkgICAgIGJicl9sdF9id19kaWZmKSkgeworCQkJLyogQWxsIGNyaXRlcmlhIGFyZSBtZXQ7IGVzdGltYXRlIHdlJ3JlIHBvbGljZWQuICovCisJCQliYnItPmx0X2J3ID0gKGJ3ICsgYmJyLT5sdF9idykgPj4gMTsgIC8qIGF2ZyAyIGludHZscyAqLworCQkJYmJyLT5sdF91c2VfYncgPSAxOworCQkJYmJyLT5wYWNpbmdfZ2FpbiA9IEJCUl9VTklUOyAgLyogdHJ5IHRvIGF2b2lkIGRyb3BzICovCisJCQliYnItPmx0X3J0dF9jbnQgPSAwOworCQkJcmV0dXJuOworCQl9CisJfQorCWJici0+bHRfYncgPSBidzsKKwliYnJfcmVzZXRfbHRfYndfc2FtcGxpbmdfaW50ZXJ2YWwoc2spOworfQorCisvKiBUb2tlbi1idWNrZXQgdHJhZmZpYyBwb2xpY2VycyBhcmUgY29tbW9uIChzZWUgIkFuIEludGVybmV0LVdpZGUgQW5hbHlzaXMgb2YKKyAqIFRyYWZmaWMgUG9saWNpbmciLCBTSUdDT01NIDIwMTYpLiBCQlIgZGV0ZWN0cyB0b2tlbi1idWNrZXQgcG9saWNlcnMgYW5kCisgKiBleHBsaWNpdGx5IG1vZGVscyB0aGVpciBwb2xpY2VkIHJhdGUsIHRvIHJlZHVjZSB1bm5lY2Vzc2FyeSBsb3NzZXMuIFdlCisgKiBlc3RpbWF0ZSB0aGF0IHdlJ3JlIHBvbGljZWQgaWYgd2Ugc2VlIDIgY29uc2VjdXRpdmUgc2FtcGxpbmcgaW50ZXJ2YWxzIHdpdGgKKyAqIGNvbnNpc3RlbnQgdGhyb3VnaHB1dCBhbmQgaGlnaCBwYWNrZXQgbG9zcy4gSWYgd2UgdGhpbmsgd2UncmUgYmVpbmcgcG9saWNlZCwKKyAqIHNldCBsdF9idyB0byB0aGUgImxvbmctdGVybSIgYXZlcmFnZSBkZWxpdmVyeSByYXRlIGZyb20gdGhvc2UgMiBpbnRlcnZhbHMuCisgKi8KK3N0YXRpYyB2b2lkIGJicl9sdF9id19zYW1wbGluZyhzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCByYXRlX3NhbXBsZSAqcnMpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCXUzMiBsb3N0LCBkZWxpdmVyZWQ7CisJdTY0IGJ3OworCXMzMiB0OworCisJaWYgKGJici0+bHRfdXNlX2J3KSB7CS8qIGFscmVhZHkgdXNpbmcgbG9uZy10ZXJtIHJhdGUsIGx0X2J3PyAqLworCQlpZiAoYmJyLT5tb2RlID09IEJCUl9QUk9CRV9CVyAmJiBiYnItPnJvdW5kX3N0YXJ0ICYmCisJCSAgICArK2Jici0+bHRfcnR0X2NudCA+PSBiYnJfbHRfYndfbWF4X3J0dHMpIHsKKwkJCWJicl9yZXNldF9sdF9id19zYW1wbGluZyhzayk7ICAgIC8qIHN0b3AgdXNpbmcgbHRfYncgKi8KKwkJCWJicl9yZXNldF9wcm9iZV9id19tb2RlKHNrKTsgIC8qIHJlc3RhcnQgZ2FpbiBjeWNsaW5nICovCisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIFdhaXQgZm9yIHRoZSBmaXJzdCBsb3NzIGJlZm9yZSBzYW1wbGluZywgdG8gbGV0IHRoZSBwb2xpY2VyIGV4aGF1c3QKKwkgKiBpdHMgdG9rZW5zIGFuZCBlc3RpbWF0ZSB0aGUgc3RlYWR5LXN0YXRlIHJhdGUgYWxsb3dlZCBieSB0aGUgcG9saWNlci4KKwkgKiBTdGFydGluZyBzYW1wbGVzIGVhcmxpZXIgaW5jbHVkZXMgYnVyc3RzIHRoYXQgb3Zlci1lc3RpbWF0ZSB0aGUgYncuCisJICovCisJaWYgKCFiYnItPmx0X2lzX3NhbXBsaW5nKSB7CisJCWlmICghcnMtPmxvc3NlcykKKwkJCXJldHVybjsKKwkJYmJyX3Jlc2V0X2x0X2J3X3NhbXBsaW5nX2ludGVydmFsKHNrKTsKKwkJYmJyLT5sdF9pc19zYW1wbGluZyA9IHRydWU7CisJfQorCisJLyogVG8gYXZvaWQgdW5kZXJlc3RpbWF0ZXMsIHJlc2V0IHNhbXBsaW5nIGlmIHdlIHJ1biBvdXQgb2YgZGF0YS4gKi8KKwlpZiAocnMtPmlzX2FwcF9saW1pdGVkKSB7CisJCWJicl9yZXNldF9sdF9id19zYW1wbGluZyhzayk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYmJyLT5yb3VuZF9zdGFydCkKKwkJYmJyLT5sdF9ydHRfY250Kys7CS8qIGNvdW50IHJvdW5kIHRyaXBzIGluIHRoaXMgaW50ZXJ2YWwgKi8KKwlpZiAoYmJyLT5sdF9ydHRfY250IDwgYmJyX2x0X2ludHZsX21pbl9ydHRzKQorCQlyZXR1cm47CQkvKiBzYW1wbGluZyBpbnRlcnZhbCBuZWVkcyB0byBiZSBsb25nZXIgKi8KKwlpZiAoYmJyLT5sdF9ydHRfY250ID4gNCAqIGJicl9sdF9pbnR2bF9taW5fcnR0cykgeworCQliYnJfcmVzZXRfbHRfYndfc2FtcGxpbmcoc2spOyAgLyogaW50ZXJ2YWwgaXMgdG9vIGxvbmcgKi8KKwkJcmV0dXJuOworCX0KKworCS8qIEVuZCBzYW1wbGluZyBpbnRlcnZhbCB3aGVuIGEgcGFja2V0IGlzIGxvc3QsIHNvIHdlIGVzdGltYXRlIHRoZQorCSAqIHBvbGljZXIgdG9rZW5zIHdlcmUgZXhoYXVzdGVkLiBTdG9wcGluZyB0aGUgc2FtcGxpbmcgYmVmb3JlIHRoZQorCSAqIHRva2VucyBhcmUgZXhoYXVzdGVkIHVuZGVyLWVzdGltYXRlcyB0aGUgcG9saWNlZCByYXRlLgorCSAqLworCWlmICghcnMtPmxvc3NlcykKKwkJcmV0dXJuOworCisJLyogQ2FsY3VsYXRlIHBhY2tldHMgbG9zdCBhbmQgZGVsaXZlcmVkIGluIHNhbXBsaW5nIGludGVydmFsLiAqLworCWxvc3QgPSB0cC0+bG9zdCAtIGJici0+bHRfbGFzdF9sb3N0OworCWRlbGl2ZXJlZCA9IHRwLT5kZWxpdmVyZWQgLSBiYnItPmx0X2xhc3RfZGVsaXZlcmVkOworCS8qIElzIGxvc3MgcmF0ZSAobG9zdC9kZWxpdmVyZWQpID49IGx0X2xvc3NfdGhyZXNoPyBJZiBub3QsIHdhaXQuICovCisJaWYgKCFkZWxpdmVyZWQgfHwgKGxvc3QgPDwgQkJSX1NDQUxFKSA8IGJicl9sdF9sb3NzX3RocmVzaCAqIGRlbGl2ZXJlZCkKKwkJcmV0dXJuOworCisJLyogRmluZCBhdmVyYWdlIGRlbGl2ZXJ5IHJhdGUgaW4gdGhpcyBzYW1wbGluZyBpbnRlcnZhbC4gKi8KKwl0ID0gKHMzMikodHAtPmRlbGl2ZXJlZF9tc3RhbXAuc3RhbXBfamlmZmllcyAtIGJici0+bHRfbGFzdF9zdGFtcCk7CisJaWYgKHQgPCAxKQorCQlyZXR1cm47CQkvKiBpbnRlcnZhbCBpcyBsZXNzIHRoYW4gb25lIGppZmZ5LCBzbyB3YWl0ICovCisJdCA9IGppZmZpZXNfdG9fdXNlY3ModCk7CisJLyogSW50ZXJ2YWwgbG9uZyBlbm91Z2ggZm9yIGppZmZpZXNfdG9fdXNlY3MoKSB0byByZXR1cm4gYSBib2d1cyAwPyAqLworCWlmICh0IDwgMSkgeworCQliYnJfcmVzZXRfbHRfYndfc2FtcGxpbmcoc2spOyAgLyogaW50ZXJ2YWwgdG9vIGxvbmc7IHJlc2V0ICovCisJCXJldHVybjsKKwl9CisJYncgPSAodTY0KWRlbGl2ZXJlZCAqIEJXX1VOSVQ7CisJZG9fZGl2KGJ3LCB0KTsKKwliYnJfbHRfYndfaW50ZXJ2YWxfZG9uZShzaywgYncpOworfQorCisvKiBFc3RpbWF0ZSB0aGUgYmFuZHdpZHRoIGJhc2VkIG9uIGhvdyBmYXN0IHBhY2tldHMgYXJlIGRlbGl2ZXJlZCAqLworc3RhdGljIHZvaWQgYmJyX3VwZGF0ZV9idyhzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCByYXRlX3NhbXBsZSAqcnMpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCXU2NCBidzsKKworCWJici0+cm91bmRfc3RhcnQgPSAwOworCWlmIChycy0+ZGVsaXZlcmVkIDwgMCB8fCBycy0+aW50ZXJ2YWxfdXMgPD0gMCkKKwkJcmV0dXJuOyAvKiBOb3QgYSB2YWxpZCBvYnNlcnZhdGlvbiAqLworCisJLyogU2VlIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIG5leHQgUlRUICovCisJaWYgKCFiZWZvcmUocnMtPnByaW9yX2RlbGl2ZXJlZCwgYmJyLT5uZXh0X3J0dF9kZWxpdmVyZWQpKSB7CisJCWJici0+bmV4dF9ydHRfZGVsaXZlcmVkID0gdHAtPmRlbGl2ZXJlZDsKKwkJYmJyLT5ydHRfY250Kys7CisJCWJici0+cm91bmRfc3RhcnQgPSAxOworCQliYnItPnBhY2tldF9jb25zZXJ2YXRpb24gPSAwOworCX0KKworCWJicl9sdF9id19zYW1wbGluZyhzaywgcnMpOworCisJLyogRGl2aWRlIGRlbGl2ZXJlZCBieSB0aGUgaW50ZXJ2YWwgdG8gZmluZCBhIChsb3dlciBib3VuZCkgYm90dGxlbmVjaworCSAqIGJhbmR3aWR0aCBzYW1wbGUuIERlbGl2ZXJlZCBpcyBpbiBwYWNrZXRzIGFuZCBpbnRlcnZhbF91cyBpbiB1UyBhbmQKKwkgKiByYXRpbyB3aWxsIGJlIDw8MSBmb3IgbW9zdCBjb25uZWN0aW9ucy4gU28gZGVsaXZlcmVkIGlzIGZpcnN0IHNjYWxlZC4KKwkgKi8KKwlidyA9ICh1NjQpcnMtPmRlbGl2ZXJlZCAqIEJXX1VOSVQ7CisJZG9fZGl2KGJ3LCBycy0+aW50ZXJ2YWxfdXMpOworCisJLyogSWYgdGhpcyBzYW1wbGUgaXMgYXBwbGljYXRpb24tbGltaXRlZCwgaXQgaXMgbGlrZWx5IHRvIGhhdmUgYSB2ZXJ5CisJICogbG93IGRlbGl2ZXJlZCBjb3VudCB0aGF0IHJlcHJlc2VudHMgYXBwbGljYXRpb24gYmVoYXZpb3IgcmF0aGVyIHRoYW4KKwkgKiB0aGUgYXZhaWxhYmxlIG5ldHdvcmsgcmF0ZS4gU3VjaCBhIHNhbXBsZSBjb3VsZCBkcmFnIGRvd24gZXN0aW1hdGVkCisJICogYncsIGNhdXNpbmcgbmVlZGxlc3Mgc2xvdy1kb3duLiBUaHVzLCB0byBjb250aW51ZSB0byBzZW5kIGF0IHRoZQorCSAqIGxhc3QgbWVhc3VyZWQgbmV0d29yayByYXRlLCB3ZSBmaWx0ZXIgb3V0IGFwcC1saW1pdGVkIHNhbXBsZXMgdW5sZXNzCisJICogdGhleSBkZXNjcmliZSB0aGUgcGF0aCBidyBhdCBsZWFzdCBhcyB3ZWxsIGFzIG91ciBidyBtb2RlbC4KKwkgKgorCSAqIFNvIHRoZSBnb2FsIGR1cmluZyBhcHAtbGltaXRlZCBwaGFzZSBpcyB0byBwcm9jZWVkIHdpdGggdGhlIGJlc3QKKwkgKiBuZXR3b3JrIHJhdGUgbm8gbWF0dGVyIGhvdyBsb25nLiBXZSBhdXRvbWF0aWNhbGx5IGxlYXZlIHRoaXMKKwkgKiBwaGFzZSB3aGVuIGFwcCB3cml0ZXMgZmFzdGVyIHRoYW4gdGhlIG5ldHdvcmsgY2FuIGRlbGl2ZXIgOikKKwkgKi8KKwlpZiAoIXJzLT5pc19hcHBfbGltaXRlZCB8fCBidyA+PSBiYnJfbWF4X2J3KHNrKSkgeworCQkvKiBJbmNvcnBvcmF0ZSBuZXcgc2FtcGxlIGludG8gb3VyIG1heCBidyBmaWx0ZXIuICovCisJCW1pbm1heF9ydW5uaW5nX21heCgmYmJyLT5idywgYmJyX2J3X3J0dHMsIGJici0+cnR0X2NudCwgYncpOworCX0KK30KKworLyogRXN0aW1hdGUgd2hlbiB0aGUgcGlwZSBpcyBmdWxsLCB1c2luZyB0aGUgY2hhbmdlIGluIGRlbGl2ZXJ5IHJhdGU6IEJCUgorICogZXN0aW1hdGVzIHRoYXQgU1RBUlRVUCBmaWxsZWQgdGhlIHBpcGUgaWYgdGhlIGVzdGltYXRlZCBidyBoYXNuJ3QgY2hhbmdlZCBieQorICogYXQgbGVhc3QgYmJyX2Z1bGxfYndfdGhyZXNoICgyNSUpIGFmdGVyIGJicl9mdWxsX2J3X2NudCAoMykgbm9uLWFwcC1saW1pdGVkCisgKiByb3VuZHMuIFdoeSAzIHJvdW5kczogMTogcndpbiBhdXRvdHVuaW5nIGdyb3dzIHRoZSByd2luLCAyOiB3ZSBmaWxsIHRoZQorICogaGlnaGVyIHJ3aW4sIDM6IHdlIGdldCBoaWdoZXIgZGVsaXZlcnkgcmF0ZSBzYW1wbGVzLiBPciB0cmFuc2llbnQKKyAqIGNyb3NzLXRyYWZmaWMgb3IgcmFkaW8gbm9pc2UgY2FuIGdvIGF3YXkuIENVQklDIEh5c3RhcnQgc2hhcmVzIGEgc2ltaWxhcgorICogZGVzaWduIGdvYWwsIGJ1dCB1c2VzIGRlbGF5IGFuZCBpbnRlci1BQ0sgc3BhY2luZyBpbnN0ZWFkIG9mIGJhbmR3aWR0aC4KKyAqLworc3RhdGljIHZvaWQgYmJyX2NoZWNrX2Z1bGxfYndfcmVhY2hlZChzdHJ1Y3Qgc29jayAqc2ssCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHJhdGVfc2FtcGxlICpycykKK3sKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisJdTMyIGJ3X3RocmVzaDsKKworCWlmIChiYnJfZnVsbF9id19yZWFjaGVkKHNrKSB8fCAhYmJyLT5yb3VuZF9zdGFydCB8fCBycy0+aXNfYXBwX2xpbWl0ZWQpCisJCXJldHVybjsKKworCWJ3X3RocmVzaCA9ICh1NjQpYmJyLT5mdWxsX2J3ICogYmJyX2Z1bGxfYndfdGhyZXNoID4+IEJCUl9TQ0FMRTsKKwlpZiAoYmJyX21heF9idyhzaykgPj0gYndfdGhyZXNoKSB7CisJCWJici0+ZnVsbF9idyA9IGJicl9tYXhfYncoc2spOworCQliYnItPmZ1bGxfYndfY250ID0gMDsKKwkJcmV0dXJuOworCX0KKwkrK2Jici0+ZnVsbF9id19jbnQ7Cit9CisKKy8qIElmIHBpcGUgaXMgcHJvYmFibHkgZnVsbCwgZHJhaW4gdGhlIHF1ZXVlIGFuZCB0aGVuIGVudGVyIHN0ZWFkeS1zdGF0ZS4gKi8KK3N0YXRpYyB2b2lkIGJicl9jaGVja19kcmFpbihzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCByYXRlX3NhbXBsZSAqcnMpCit7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCisJaWYgKGJici0+bW9kZSA9PSBCQlJfU1RBUlRVUCAmJiBiYnJfZnVsbF9id19yZWFjaGVkKHNrKSkgeworCQliYnItPm1vZGUgPSBCQlJfRFJBSU47CS8qIGRyYWluIHF1ZXVlIHdlIGNyZWF0ZWQgKi8KKwkJYmJyLT5wYWNpbmdfZ2FpbiA9IGJicl9kcmFpbl9nYWluOwkvKiBwYWNlIHNsb3cgdG8gZHJhaW4gKi8KKwkJYmJyLT5jd25kX2dhaW4gPSBiYnJfaGlnaF9nYWluOwkvKiBtYWludGFpbiBjd25kICovCisJfQkvKiBmYWxsIHRocm91Z2ggdG8gY2hlY2sgaWYgaW4tZmxpZ2h0IGlzIGFscmVhZHkgc21hbGw6ICovCisJaWYgKGJici0+bW9kZSA9PSBCQlJfRFJBSU4gJiYKKwkgICAgdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRjcF9zayhzaykpIDw9CisJICAgIGJicl90YXJnZXRfY3duZChzaywgYmJyX21heF9idyhzayksIEJCUl9VTklUKSkKKwkJYmJyX3Jlc2V0X3Byb2JlX2J3X21vZGUoc2spOyAgLyogd2UgZXN0aW1hdGUgcXVldWUgaXMgZHJhaW5lZCAqLworfQorCisvKiBUaGUgZ29hbCBvZiBQUk9CRV9SVFQgbW9kZSBpcyB0byBoYXZlIEJCUiBmbG93cyBjb29wZXJhdGl2ZWx5IGFuZAorICogcGVyaW9kaWNhbGx5IGRyYWluIHRoZSBib3R0bGVuZWNrIHF1ZXVlLCB0byBjb252ZXJnZSB0byBtZWFzdXJlIHRoZSB0cnVlCisgKiBtaW5fcnR0ICh1bmxvYWRlZCBwcm9wYWdhdGlvbiBkZWxheSkuIFRoaXMgYWxsb3dzIHRoZSBmbG93cyB0byBrZWVwIHF1ZXVlcworICogc21hbGwgKHJlZHVjaW5nIHF1ZXVpbmcgZGVsYXkgYW5kIHBhY2tldCBsb3NzKSBhbmQgYWNoaWV2ZSBmYWlybmVzcyBhbW9uZworICogQkJSIGZsb3dzLgorICoKKyAqIFRoZSBtaW5fcnR0IGZpbHRlciB3aW5kb3cgaXMgMTAgc2Vjb25kcy4gV2hlbiB0aGUgbWluX3J0dCBlc3RpbWF0ZSBleHBpcmVzLAorICogd2UgZW50ZXIgUFJPQkVfUlRUIG1vZGUgYW5kIGNhcCB0aGUgY3duZCBhdCBiYnJfY3duZF9taW5fdGFyZ2V0PTQgcGFja2V0cy4KKyAqIEFmdGVyIGF0IGxlYXN0IGJicl9wcm9iZV9ydHRfbW9kZV9tcz0yMDBtcyBhbmQgYXQgbGVhc3Qgb25lIHBhY2tldC10aW1lZAorICogcm91bmQgdHJpcCBlbGFwc2VkIHdpdGggdGhhdCBmbGlnaHQgc2l6ZSA8PSA0LCB3ZSBsZWF2ZSBQUk9CRV9SVFQgbW9kZSBhbmQKKyAqIHJlLWVudGVyIHRoZSBwcmV2aW91cyBtb2RlLiBCQlIgdXNlcyAyMDBtcyB0byBhcHByb3hpbWF0ZWx5IGJvdW5kIHRoZQorICogcGVyZm9ybWFuY2UgcGVuYWx0eSBvZiBQUk9CRV9SVFQncyBjd25kIGNhcHBpbmcgdG8gcm91Z2hseSAyJSAoMjAwbXMvMTBzKS4KKyAqCisgKiBOb3RlIHRoYXQgZmxvd3MgbmVlZCBvbmx5IHBheSAyJSBpZiB0aGV5IGFyZSBidXN5IHNlbmRpbmcgb3ZlciB0aGUgbGFzdCAxMAorICogc2Vjb25kcy4gSW50ZXJhY3RpdmUgYXBwbGljYXRpb25zIChlLmcuLCBXZWIsIFJQQ3MsIHZpZGVvIGNodW5rcykgb2Z0ZW4gaGF2ZQorICogbmF0dXJhbCBzaWxlbmNlcyBvciBsb3ctcmF0ZSBwZXJpb2RzIHdpdGhpbiAxMCBzZWNvbmRzIHdoZXJlIHRoZSByYXRlIGlzIGxvdworICogZW5vdWdoIGZvciBsb25nIGVub3VnaCB0byBkcmFpbiBpdHMgcXVldWUgaW4gdGhlIGJvdHRsZW5lY2suIFdlIHBpY2sgdXAKKyAqIHRoZXNlIG1pbiBSVFQgbWVhc3VyZW1lbnRzIG9wcG9ydHVuaXN0aWNhbGx5IHdpdGggb3VyIG1pbl9ydHQgZmlsdGVyLiA6LSkKKyAqLworc3RhdGljIHZvaWQgYmJyX3VwZGF0ZV9taW5fcnR0KHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHJhdGVfc2FtcGxlICpycykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisJYm9vbCBmaWx0ZXJfZXhwaXJlZDsKKworCS8qIFRyYWNrIG1pbiBSVFQgc2VlbiBpbiB0aGUgbWluX3J0dF93aW5fc2VjIGZpbHRlciB3aW5kb3c6ICovCisJZmlsdGVyX2V4cGlyZWQgPSBhZnRlcih0Y3BfdGltZV9zdGFtcCwKKwkJCSAgICAgICBiYnItPm1pbl9ydHRfc3RhbXAgKyBiYnJfbWluX3J0dF93aW5fc2VjICogSFopOworCWlmIChycy0+cnR0X3VzID49IDAgJiYKKwkgICAgKHJzLT5ydHRfdXMgPD0gYmJyLT5taW5fcnR0X3VzIHx8IGZpbHRlcl9leHBpcmVkKSkgeworCQliYnItPm1pbl9ydHRfdXMgPSBycy0+cnR0X3VzOworCQliYnItPm1pbl9ydHRfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKKwl9CisKKwlpZiAoYmJyX3Byb2JlX3J0dF9tb2RlX21zID4gMCAmJiBmaWx0ZXJfZXhwaXJlZCAmJgorCSAgICAhYmJyLT5pZGxlX3Jlc3RhcnQgJiYgYmJyLT5tb2RlICE9IEJCUl9QUk9CRV9SVFQpIHsKKwkJYmJyLT5tb2RlID0gQkJSX1BST0JFX1JUVDsgIC8qIGRpcCwgZHJhaW4gcXVldWUgKi8KKwkJYmJyLT5wYWNpbmdfZ2FpbiA9IEJCUl9VTklUOworCQliYnItPmN3bmRfZ2FpbiA9IEJCUl9VTklUOworCQliYnJfc2F2ZV9jd25kKHNrKTsgIC8qIG5vdGUgY3duZCBzbyB3ZSBjYW4gcmVzdG9yZSBpdCAqLworCQliYnItPnByb2JlX3J0dF9kb25lX3N0YW1wID0gMDsKKwl9CisKKwlpZiAoYmJyLT5tb2RlID09IEJCUl9QUk9CRV9SVFQpIHsKKwkJLyogSWdub3JlIGxvdyByYXRlIHNhbXBsZXMgZHVyaW5nIHRoaXMgbW9kZS4gKi8KKwkJdHAtPmFwcF9saW1pdGVkID0KKwkJCSh0cC0+ZGVsaXZlcmVkICsgdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSkgPyA6IDE7CisJCS8qIE1haW50YWluIG1pbiBwYWNrZXRzIGluIGZsaWdodCBmb3IgbWF4KDIwMCBtcywgMSByb3VuZCkuICovCisJCWlmICghYmJyLT5wcm9iZV9ydHRfZG9uZV9zdGFtcCAmJgorCQkgICAgdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSA8PSBiYnJfY3duZF9taW5fdGFyZ2V0KSB7CisJCQliYnItPnByb2JlX3J0dF9kb25lX3N0YW1wID0gdGNwX3RpbWVfc3RhbXAgKworCQkJCW1zZWNzX3RvX2ppZmZpZXMoYmJyX3Byb2JlX3J0dF9tb2RlX21zKTsKKwkJCWJici0+cHJvYmVfcnR0X3JvdW5kX2RvbmUgPSAwOworCQkJYmJyLT5uZXh0X3J0dF9kZWxpdmVyZWQgPSB0cC0+ZGVsaXZlcmVkOworCQl9IGVsc2UgaWYgKGJici0+cHJvYmVfcnR0X2RvbmVfc3RhbXApIHsKKwkJCWlmIChiYnItPnJvdW5kX3N0YXJ0KQorCQkJCWJici0+cHJvYmVfcnR0X3JvdW5kX2RvbmUgPSAxOworCQkJaWYgKGJici0+cHJvYmVfcnR0X3JvdW5kX2RvbmUgJiYKKwkJCSAgICBhZnRlcih0Y3BfdGltZV9zdGFtcCwgYmJyLT5wcm9iZV9ydHRfZG9uZV9zdGFtcCkpIHsKKwkJCQliYnItPm1pbl9ydHRfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKKwkJCQliYnItPnJlc3RvcmVfY3duZCA9IDE7ICAvKiBzbmFwIHRvIHByaW9yX2N3bmQgKi8KKwkJCQliYnJfcmVzZXRfbW9kZShzayk7CisJCQl9CisJCX0KKwl9CisJYmJyLT5pZGxlX3Jlc3RhcnQgPSAwOworfQorCitzdGF0aWMgdm9pZCBiYnJfdXBkYXRlX21vZGVsKHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHJhdGVfc2FtcGxlICpycykKK3sKKwliYnJfdXBkYXRlX2J3KHNrLCBycyk7CisJYmJyX3VwZGF0ZV9jeWNsZV9waGFzZShzaywgcnMpOworCWJicl9jaGVja19mdWxsX2J3X3JlYWNoZWQoc2ssIHJzKTsKKwliYnJfY2hlY2tfZHJhaW4oc2ssIHJzKTsKKwliYnJfdXBkYXRlX21pbl9ydHQoc2ssIHJzKTsKK30KKworc3RhdGljIHZvaWQgYmJyX21haW4oc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3QgcmF0ZV9zYW1wbGUgKnJzKQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKwl1MzIgYnc7CisKKwliYnJfdXBkYXRlX21vZGVsKHNrLCBycyk7CisKKwlidyA9IGJicl9idyhzayk7CisJYmJyX3NldF9wYWNpbmdfcmF0ZShzaywgYncsIGJici0+cGFjaW5nX2dhaW4pOworCWJicl9zZXRfdHNvX3NlZ3NfZ29hbChzayk7CisJYmJyX3NldF9jd25kKHNrLCBycywgcnMtPmFja2VkX3NhY2tlZCwgYncsIGJici0+Y3duZF9nYWluKTsKK30KKworc3RhdGljIHZvaWQgYmJyX2luaXQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKwl1NjQgYnc7CisKKwliYnItPnByaW9yX2N3bmQgPSAwOworCWJici0+dHNvX3NlZ3NfZ29hbCA9IDA7CSAvKiBkZWZhdWx0IHNlZ3MgcGVyIHNrYiB1bnRpbCBmaXJzdCBBQ0sgKi8KKwliYnItPnJ0dF9jbnQgPSAwOworCWJici0+bmV4dF9ydHRfZGVsaXZlcmVkID0gMDsKKwliYnItPnByZXZfY2Ffc3RhdGUgPSBUQ1BfQ0FfT3BlbjsKKwliYnItPnBhY2tldF9jb25zZXJ2YXRpb24gPSAwOworCisJYmJyLT5wcm9iZV9ydHRfZG9uZV9zdGFtcCA9IDA7CisJYmJyLT5wcm9iZV9ydHRfcm91bmRfZG9uZSA9IDA7CisJYmJyLT5taW5fcnR0X3VzID0gdGNwX21pbl9ydHQodHApOworCWJici0+bWluX3J0dF9zdGFtcCA9IHRjcF90aW1lX3N0YW1wOworCisJbWlubWF4X3Jlc2V0KCZiYnItPmJ3LCBiYnItPnJ0dF9jbnQsIDApOyAgLyogaW5pdCBtYXggYncgdG8gMCAqLworCisJLyogSW5pdGlhbGl6ZSBwYWNpbmcgcmF0ZSB0bzogaGlnaF9nYWluICogaW5pdF9jd25kIC8gUlRULiAqLworCWJ3ID0gKHU2NCl0cC0+c25kX2N3bmQgKiBCV19VTklUOworCWRvX2RpdihidywgKHRwLT5zcnR0X3VzID4+IDMpID8gOiBVU0VDX1BFUl9NU0VDKTsKKwlzay0+c2tfcGFjaW5nX3JhdGUgPSAwOwkJLyogZm9yY2UgYW4gdXBkYXRlIG9mIHNrX3BhY2luZ19yYXRlICovCisJYmJyX3NldF9wYWNpbmdfcmF0ZShzaywgYncsIGJicl9oaWdoX2dhaW4pOworCisJYmJyLT5yZXN0b3JlX2N3bmQgPSAwOworCWJici0+cm91bmRfc3RhcnQgPSAwOworCWJici0+aWRsZV9yZXN0YXJ0ID0gMDsKKwliYnItPmZ1bGxfYncgPSAwOworCWJici0+ZnVsbF9id19jbnQgPSAwOworCWJici0+Y3ljbGVfbXN0YW1wLnY2NCA9IDA7CisJYmJyLT5jeWNsZV9pZHggPSAwOworCWJicl9yZXNldF9sdF9id19zYW1wbGluZyhzayk7CisJYmJyX3Jlc2V0X3N0YXJ0dXBfbW9kZShzayk7Cit9CisKK3N0YXRpYyB1MzIgYmJyX3NuZGJ1Zl9leHBhbmQoc3RydWN0IHNvY2sgKnNrKQoreworCS8qIFByb3Zpc2lvbiAzICogY3duZCBzaW5jZSBCQlIgbWF5IHNsb3ctc3RhcnQgZXZlbiBkdXJpbmcgcmVjb3ZlcnkuICovCisJcmV0dXJuIDM7Cit9CisKKy8qIEluIHRoZW9yeSBCQlIgZG9lcyBub3QgbmVlZCB0byB1bmRvIHRoZSBjd25kIHNpbmNlIGl0IGRvZXMgbm90CisgKiBhbHdheXMgcmVkdWNlIGN3bmQgb24gbG9zc2VzIChzZWUgYmJyX21haW4oKSkuIEtlZXAgaXQgZm9yIG5vdy4KKyAqLworc3RhdGljIHUzMiBiYnJfdW5kb19jd25kKHN0cnVjdCBzb2NrICpzaykKK3sKKwlyZXR1cm4gdGNwX3NrKHNrKS0+c25kX2N3bmQ7Cit9CisKKy8qIEVudGVyaW5nIGxvc3MgcmVjb3ZlcnksIHNvIHNhdmUgY3duZCBmb3Igd2hlbiB3ZSBleGl0IG9yIHVuZG8gcmVjb3ZlcnkuICovCitzdGF0aWMgdTMyIGJicl9zc3RocmVzaChzdHJ1Y3Qgc29jayAqc2spCit7CisJYmJyX3NhdmVfY3duZChzayk7CisJcmV0dXJuIFRDUF9JTkZJTklURV9TU1RIUkVTSDsJIC8qIEJCUiBkb2VzIG5vdCB1c2Ugc3N0aHJlc2ggKi8KK30KKworc3RhdGljIHNpemVfdCBiYnJfZ2V0X2luZm8oc3RydWN0IHNvY2sgKnNrLCB1MzIgZXh0LCBpbnQgKmF0dHIsCisJCQkgICB1bmlvbiB0Y3BfY2NfaW5mbyAqaW5mbykKK3sKKwlpZiAoZXh0ICYgKDEgPDwgKElORVRfRElBR19CQlJJTkZPIC0gMSkpIHx8CisJICAgIGV4dCAmICgxIDw8IChJTkVUX0RJQUdfVkVHQVNJTkZPIC0gMSkpKSB7CisJCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCQlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisJCXU2NCBidyA9IGJicl9idyhzayk7CisKKwkJYncgPSBidyAqIHRwLT5tc3NfY2FjaGUgKiBVU0VDX1BFUl9TRUMgPj4gQldfU0NBTEU7CisJCW1lbXNldCgmaW5mby0+YmJyLCAwLCBzaXplb2YoaW5mby0+YmJyKSk7CisJCWluZm8tPmJici5iYnJfYndfbG8JCT0gKHUzMilidzsKKwkJaW5mby0+YmJyLmJicl9id19oaQkJPSAodTMyKShidyA+PiAzMik7CisJCWluZm8tPmJici5iYnJfbWluX3J0dAkJPSBiYnItPm1pbl9ydHRfdXM7CisJCWluZm8tPmJici5iYnJfcGFjaW5nX2dhaW4JPSBiYnItPnBhY2luZ19nYWluOworCQlpbmZvLT5iYnIuYmJyX2N3bmRfZ2FpbgkJPSBiYnItPmN3bmRfZ2FpbjsKKwkJKmF0dHIgPSBJTkVUX0RJQUdfQkJSSU5GTzsKKwkJcmV0dXJuIHNpemVvZihpbmZvLT5iYnIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmJyX3NldF9zdGF0ZShzdHJ1Y3Qgc29jayAqc2ssIHU4IG5ld19zdGF0ZSkKK3sKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisKKwlpZiAobmV3X3N0YXRlID09IFRDUF9DQV9Mb3NzKSB7CisJCXN0cnVjdCByYXRlX3NhbXBsZSBycyA9IHsgLmxvc3NlcyA9IDEgfTsKKworCQliYnItPnByZXZfY2Ffc3RhdGUgPSBUQ1BfQ0FfTG9zczsKKwkJYmJyLT5mdWxsX2J3ID0gMDsKKwkJYmJyLT5yb3VuZF9zdGFydCA9IDE7CS8qIHRyZWF0IFJUTyBsaWtlIGVuZCBvZiBhIHJvdW5kICovCisJCWJicl9sdF9id19zYW1wbGluZyhzaywgJnJzKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHRjcF9iYnJfY29uZ19vcHMgX19yZWFkX21vc3RseSA9IHsKKwkuZmxhZ3MJCT0gVENQX0NPTkdfTk9OX1JFU1RSSUNURUQsCisJLm5hbWUJCT0gImJiciIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pbml0CQk9IGJicl9pbml0LAorCS5jb25nX2NvbnRyb2wJPSBiYnJfbWFpbiwKKwkuc25kYnVmX2V4cGFuZAk9IGJicl9zbmRidWZfZXhwYW5kLAorCS51bmRvX2N3bmQJPSBiYnJfdW5kb19jd25kLAorCS5jd25kX2V2ZW50CT0gYmJyX2N3bmRfZXZlbnQsCisJLnNzdGhyZXNoCT0gYmJyX3NzdGhyZXNoLAorCS50c29fc2Vnc19nb2FsCT0gYmJyX3Rzb19zZWdzX2dvYWwsCisJLmdldF9pbmZvCT0gYmJyX2dldF9pbmZvLAorCS5zZXRfc3RhdGUJPSBiYnJfc2V0X3N0YXRlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYmJyX3JlZ2lzdGVyKHZvaWQpCit7CisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYmJyKSA+IElDU0tfQ0FfUFJJVl9TSVpFKTsKKwlyZXR1cm4gdGNwX3JlZ2lzdGVyX2Nvbmdlc3Rpb25fY29udHJvbCgmdGNwX2Jicl9jb25nX29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBiYnJfdW5yZWdpc3Rlcih2b2lkKQoreworCXRjcF91bnJlZ2lzdGVyX2Nvbmdlc3Rpb25fY29udHJvbCgmdGNwX2Jicl9jb25nX29wcyk7Cit9CisKK21vZHVsZV9pbml0KGJicl9yZWdpc3Rlcik7Cittb2R1bGVfZXhpdChiYnJfdW5yZWdpc3Rlcik7CisKK01PRFVMRV9BVVRIT1IoIlZhbiBKYWNvYnNvbiA8dmFuakBnb29nbGUuY29tPiIpOworTU9EVUxFX0FVVEhPUigiTmVhbCBDYXJkd2VsbCA8bmNhcmR3ZWxsQGdvb2dsZS5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJZdWNodW5nIENoZW5nIDx5Y2hlbmdAZ29vZ2xlLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIlNvaGVpbCBIYXNzYXMgWWVnYW5laCA8c29oZWlsQGdvb2dsZS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRDUCBCQlIgKEJvdHRsZW5lY2sgQmFuZHdpZHRoIGFuZCBSVFQpIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfY2RnLmMgYi9uZXQvaXB2NC90Y3BfY2RnLmMKaW5kZXggMDM3MjViMi4uMzViMjgwMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2NkZy5jCisrKyBiL25ldC9pcHY0L3RjcF9jZGcuYwpAQCAtNTYsNyArNTYsNyBAQAogbW9kdWxlX3BhcmFtKHVzZV90b2xlcmFuY2UsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyh1c2VfdG9sZXJhbmNlLCAidXNlIGxvc3MgdG9sZXJhbmNlIGhldXJpc3RpYyIpOwogCi1zdHJ1Y3QgbWlubWF4IHsKK3N0cnVjdCBjZGdfbWlubWF4IHsKIAl1bmlvbiB7CiAJCXN0cnVjdCB7CiAJCQlzMzIgbWluOwpAQCAtNzQsMTAgKzc0LDEwIEBACiB9OwogCiBzdHJ1Y3QgY2RnIHsKLQlzdHJ1Y3QgbWlubWF4IHJ0dDsKLQlzdHJ1Y3QgbWlubWF4IHJ0dF9wcmV2OwotCXN0cnVjdCBtaW5tYXggKmdyYWRpZW50czsKLQlzdHJ1Y3QgbWlubWF4IGdzdW07CisJc3RydWN0IGNkZ19taW5tYXggcnR0OworCXN0cnVjdCBjZGdfbWlubWF4IHJ0dF9wcmV2OworCXN0cnVjdCBjZGdfbWlubWF4ICpncmFkaWVudHM7CisJc3RydWN0IGNkZ19taW5tYXggZ3N1bTsKIAlib29sIGdmaWxsZWQ7CiAJdTggIHRhaWw7CiAJdTggIHN0YXRlOwpAQCAtMzUzLDcgKzM1Myw3IEBACiB7CiAJc3RydWN0IGNkZyAqY2EgPSBpbmV0X2Nza19jYShzayk7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0Jc3RydWN0IG1pbm1heCAqZ3JhZGllbnRzOworCXN0cnVjdCBjZGdfbWlubWF4ICpncmFkaWVudHM7CiAKIAlzd2l0Y2ggKGV2KSB7CiAJY2FzZSBDQV9FVkVOVF9DV05EX1JFU1RBUlQ6CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfY29uZy5jIGIvbmV0L2lwdjQvdGNwX2NvbmcuYwppbmRleCA4ODJjYWE0Li4xMjk0YWY0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfY29uZy5jCisrKyBiL25ldC9pcHY0L3RjcF9jb25nLmMKQEAgLTY5LDcgKzY5LDcgQEAKIAlpbnQgcmV0ID0gMDsKIAogCS8qIGFsbCBhbGdvcml0aG1zIG11c3QgaW1wbGVtZW50IHNzdGhyZXNoIGFuZCBjb25nX2F2b2lkIG9wcyAqLwotCWlmICghY2EtPnNzdGhyZXNoIHx8ICFjYS0+Y29uZ19hdm9pZCkgeworCWlmICghY2EtPnNzdGhyZXNoIHx8ICEoY2EtPmNvbmdfYXZvaWQgfHwgY2EtPmNvbmdfY29udHJvbCkpIHsKIAkJcHJfZXJyKCIlcyBkb2VzIG5vdCBpbXBsZW1lbnQgcmVxdWlyZWQgb3BzXG4iLCBjYS0+bmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9kaWFnLmMgYi9uZXQvaXB2NC90Y3BfZGlhZy5jCmluZGV4IDRkNjEwOTMuLmE3NDhjNzQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9kaWFnLmMKKysrIGIvbmV0L2lwdjQvdGNwX2RpYWcuYwpAQCAtNTQsMTEgKzU0LDE2IEBACiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoaW5fc2tiLT5zayk7CiAJc3RydWN0IHNvY2sgKnNrID0gaW5ldF9kaWFnX2ZpbmRfb25lX2ljc2sobmV0LCAmdGNwX2hhc2hpbmZvLCByZXEpOworCWludCBlcnI7CiAKIAlpZiAoSVNfRVJSKHNrKSkKIAkJcmV0dXJuIFBUUl9FUlIoc2spOwogCi0JcmV0dXJuIHNvY2tfZGlhZ19kZXN0cm95KHNrLCBFQ09OTkFCT1JURUQpOworCWVyciA9IHNvY2tfZGlhZ19kZXN0cm95KHNrLCBFQ09OTkFCT1JURUQpOworCisJc29ja19nZW5fcHV0KHNrKTsKKworCXJldHVybiBlcnI7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2Zhc3RvcGVuLmMgYi9uZXQvaXB2NC90Y3BfZmFzdG9wZW4uYwppbmRleCA1NGQ5ZjliLi40ZTc3N2EzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfZmFzdG9wZW4uYworKysgYi9uZXQvaXB2NC90Y3BfZmFzdG9wZW4uYwpAQCAtMTUwLDYgKzE1MCw3IEBACiAJdHAtPnNlZ3NfaW4gPSAwOwogCXRjcF9zZWdzX2luKHRwLCBza2IpOwogCV9fc2tiX3B1bGwoc2tiLCB0Y3BfaGRybGVuKHNrYikpOworCXNrX2ZvcmNlZF9tZW1fc2NoZWR1bGUoc2ssIHNrYi0+dHJ1ZXNpemUpOwogCXNrYl9zZXRfb3duZXJfcihza2IsIHNrKTsKIAogCVRDUF9TS0JfQ0Ioc2tiKS0+c2VxKys7CkBAIC0yMjYsNiArMjI3LDcgQEAKIAl0Y3BfZmFzdG9wZW5fYWRkX3NrYihjaGlsZCwgc2tiKTsKIAogCXRjcF9yc2socmVxKS0+cmN2X254dCA9IHRwLT5yY3Zfbnh0OworCXRwLT5yY3Zfd3VwID0gdHAtPnJjdl9ueHQ7CiAJLyogdGNwX2Nvbm5fcmVxdWVzdCgpIGlzIHNlbmRpbmcgdGhlIFNZTkFDSywKIAkgKiBhbmQgcXVldWVzIHRoZSBjaGlsZCBpbnRvIGxpc3RlbmVyIGFjY2VwdCBxdWV1ZS4KIAkgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9pbnB1dC5jIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKaW5kZXggM2ViZjQ1Yi4uYTI3YjljMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lucHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKQEAgLTI4OSw2ICsyODksNyBAQAogc3RhdGljIHZvaWQgdGNwX3NuZGJ1Zl9leHBhbmQoc3RydWN0IHNvY2sgKnNrKQogewogCWNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCWNvbnN0IHN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgKmNhX29wcyA9IGluZXRfY3NrKHNrKS0+aWNza19jYV9vcHM7CiAJaW50IHNuZG1lbSwgcGVyX21zczsKIAl1MzIgbnJfc2VnczsKIApAQCAtMzA5LDcgKzMxMCw4IEBACiAJICogQ3ViaWMgbmVlZHMgMS43IGZhY3Rvciwgcm91bmRlZCB0byAyIHRvIGluY2x1ZGUKIAkgKiBleHRyYSBjdXNoaW9uIChhcHBsaWNhdGlvbiBtaWdodCByZWFjdCBzbG93bHkgdG8gUE9MTE9VVCkKIAkgKi8KLQlzbmRtZW0gPSAyICogbnJfc2VncyAqIHBlcl9tc3M7CisJc25kbWVtID0gY2Ffb3BzLT5zbmRidWZfZXhwYW5kID8gY2Ffb3BzLT5zbmRidWZfZXhwYW5kKHNrKSA6IDI7CisJc25kbWVtICo9IG5yX3NlZ3MgKiBwZXJfbXNzOwogCiAJaWYgKHNrLT5za19zbmRidWYgPCBzbmRtZW0pCiAJCXNrLT5za19zbmRidWYgPSBtaW4oc25kbWVtLCBzeXNjdGxfdGNwX3dtZW1bMl0pOwpAQCAtODk5LDEyICs5MDEsMjkgQEAKIAkJdHAtPnJldHJhbnNtaXRfaGlnaCA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKIH0KIAorLyogU3VtIHRoZSBudW1iZXIgb2YgcGFja2V0cyBvbiB0aGUgd2lyZSB3ZSBoYXZlIG1hcmtlZCBhcyBsb3N0LgorICogVGhlcmUgYXJlIHR3byBjYXNlcyB3ZSBjYXJlIGFib3V0IGhlcmU6CisgKiBhKSBQYWNrZXQgaGFzbid0IGJlZW4gbWFya2VkIGxvc3QgKG5vciByZXRyYW5zbWl0dGVkKSwKKyAqICAgIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCBsb3NzLgorICogYikgUGFja2V0IGhhcyBiZWVuIG1hcmtlZCBib3RoIGxvc3QgYW5kIHJldHJhbnNtaXR0ZWQsCisgKiAgICBhbmQgdGhpcyBtZWFucyB3ZSB0aGluayBpdCB3YXMgbG9zdCBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgdGNwX3N1bV9sb3N0KHN0cnVjdCB0Y3Bfc29jayAqdHAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJX191OCBzYWNrZWQgPSBUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZDsKKworCWlmICghKHNhY2tlZCAmIFRDUENCX0xPU1QpIHx8CisJICAgICgoc2Fja2VkICYgVENQQ0JfTE9TVCkgJiYgKHNhY2tlZCAmIFRDUENCX1NBQ0tFRF9SRVRSQU5TKSkpCisJCXRwLT5sb3N0ICs9IHRjcF9za2JfcGNvdW50KHNrYik7Cit9CisKIHN0YXRpYyB2b2lkIHRjcF9za2JfbWFya19sb3N0KHN0cnVjdCB0Y3Bfc29jayAqdHAsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaWYgKCEoVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJiAoVENQQ0JfTE9TVHxUQ1BDQl9TQUNLRURfQUNLRUQpKSkgewogCQl0Y3BfdmVyaWZ5X3JldHJhbnNtaXRfaGludCh0cCwgc2tiKTsKIAogCQl0cC0+bG9zdF9vdXQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwkJdGNwX3N1bV9sb3N0KHRwLCBza2IpOwogCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCB8PSBUQ1BDQl9MT1NUOwogCX0KIH0KQEAgLTkxMyw2ICs5MzIsNyBAQAogewogCXRjcF92ZXJpZnlfcmV0cmFuc21pdF9oaW50KHRwLCBza2IpOwogCisJdGNwX3N1bV9sb3N0KHRwLCBza2IpOwogCWlmICghKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICYgKFRDUENCX0xPU1R8VENQQ0JfU0FDS0VEX0FDS0VEKSkpIHsKIAkJdHAtPmxvc3Rfb3V0ICs9IHRjcF9za2JfcGNvdW50KHNrYik7CiAJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkIHw9IFRDUENCX0xPU1Q7CkBAIC0xMDk0LDYgKzExMTQsNyBAQAogCSAqLwogCXN0cnVjdCBza2JfbXN0YW1wIGZpcnN0X3NhY2t0OwogCXN0cnVjdCBza2JfbXN0YW1wIGxhc3Rfc2Fja3Q7CisJc3RydWN0IHJhdGVfc2FtcGxlICpyYXRlOwogCWludAlmbGFnOwogfTsKIApAQCAtMTI2MSw2ICsxMjgyLDcgQEAKIAl0Y3Bfc2Fja3RhZ19vbmUoc2ssIHN0YXRlLCBUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCwKIAkJCXN0YXJ0X3NlcSwgZW5kX3NlcSwgZHVwX3NhY2ssIHBjb3VudCwKIAkJCSZza2ItPnNrYl9tc3RhbXApOworCXRjcF9yYXRlX3NrYl9kZWxpdmVyZWQoc2ssIHNrYiwgc3RhdGUtPnJhdGUpOwogCiAJaWYgKHNrYiA9PSB0cC0+bG9zdF9za2JfaGludCkKIAkJdHAtPmxvc3RfY250X2hpbnQgKz0gcGNvdW50OwpAQCAtMTMxMSw2ICsxMzMzLDkgQEAKIAkJdGNwX2FkdmFuY2VfaGlnaGVzdF9zYWNrKHNrLCBza2IpOwogCiAJdGNwX3NrYl9jb2xsYXBzZV90c3RhbXAocHJldiwgc2tiKTsKKwlpZiAodW5saWtlbHkoVENQX1NLQl9DQihwcmV2KS0+dHguZGVsaXZlcmVkX21zdGFtcC52NjQpKQorCQlUQ1BfU0tCX0NCKHByZXYpLT50eC5kZWxpdmVyZWRfbXN0YW1wLnY2NCA9IDA7CisKIAl0Y3BfdW5saW5rX3dyaXRlX3F1ZXVlKHNrYiwgc2spOwogCXNrX3dtZW1fZnJlZV9za2Ioc2ssIHNrYik7CiAKQEAgLTE1NDAsNiArMTU2NSw3IEBACiAJCQkJCQlkdXBfc2FjaywKIAkJCQkJCXRjcF9za2JfcGNvdW50KHNrYiksCiAJCQkJCQkmc2tiLT5za2JfbXN0YW1wKTsKKwkJCXRjcF9yYXRlX3NrYl9kZWxpdmVyZWQoc2ssIHNrYiwgc3RhdGUtPnJhdGUpOwogCiAJCQlpZiAoIWJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwKIAkJCQkgICAgdGNwX2hpZ2hlc3Rfc2Fja19zZXEodHApKSkKQEAgLTE2MjIsOCArMTY0OCwxMCBAQAogCiAJZm91bmRfZHVwX3NhY2sgPSB0Y3BfY2hlY2tfZHNhY2soc2ssIGFja19za2IsIHNwX3dpcmUsCiAJCQkJCSBudW1fc2Fja3MsIHByaW9yX3NuZF91bmEpOwotCWlmIChmb3VuZF9kdXBfc2FjaykKKwlpZiAoZm91bmRfZHVwX3NhY2spIHsKIAkJc3RhdGUtPmZsYWcgfD0gRkxBR19EU0FDS0lOR19BQ0s7CisJCXRwLT5kZWxpdmVyZWQrKzsgLyogQSBzcHVyaW91cyByZXRyYW5zbWlzc2lvbiBpcyBkZWxpdmVyZWQgKi8KKwl9CiAKIAkvKiBFbGltaW5hdGUgdG9vIG9sZCBBQ0tzLCBidXQgdGFrZSBpbnRvCiAJICogYWNjb3VudCBtb3JlIG9yIGxlc3MgZnJlc2ggb25lcywgdGhleSBjYW4KQEAgLTE4OTAsNiArMTkxOCw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlib29sIG5ld19yZWNvdmVyeSA9IGljc2stPmljc2tfY2Ffc3RhdGUgPCBUQ1BfQ0FfUmVjb3Zlcnk7CiAJYm9vbCBpc19yZW5lZzsJCQkvKiBpcyByZWNlaXZlciByZW5lZ2luZyBvbiBTQUNLcz8gKi8KKwlib29sIG1hcmtfbG9zdDsKIAogCS8qIFJlZHVjZSBzc3RocmVzaCBpZiBpdCBoYXMgbm90IHlldCBiZWVuIG1hZGUgaW5zaWRlIHRoaXMgd2luZG93LiAqLwogCWlmIChpY3NrLT5pY3NrX2NhX3N0YXRlIDw9IFRDUF9DQV9EaXNvcmRlciB8fApAQCAtMTkyMyw4ICsxOTUyLDEyIEBACiAJCWlmIChza2IgPT0gdGNwX3NlbmRfaGVhZChzaykpCiAJCQlicmVhazsKIAorCQltYXJrX2xvc3QgPSAoIShUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmIFRDUENCX1NBQ0tFRF9BQ0tFRCkgfHwKKwkJCSAgICAgaXNfcmVuZWcpOworCQlpZiAobWFya19sb3N0KQorCQkJdGNwX3N1bV9sb3N0KHRwLCBza2IpOwogCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmPSAoflRDUENCX1RBR0JJVFMpfFRDUENCX1NBQ0tFRF9BQ0tFRDsKLQkJaWYgKCEoVENQX1NLQl9DQihza2IpLT5zYWNrZWQmVENQQ0JfU0FDS0VEX0FDS0VEKSB8fCBpc19yZW5lZykgeworCQlpZiAobWFya19sb3N0KSB7CiAJCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmPSB+VENQQ0JfU0FDS0VEX0FDS0VEOwogCQkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgfD0gVENQQ0JfTE9TVDsKIAkJCXRwLT5sb3N0X291dCArPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwpAQCAtMjMyOSwxMCArMjM2Miw5IEBACiAJfQogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJZWxzZSBpZiAoc2stPnNrX2ZhbWlseSA9PSBBRl9JTkVUNikgewotCQlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CiAJCXByX2RlYnVnKCJVbmRvICVzICVwSTYvJXUgYyV1IGwldSBzcyV1LyV1IHAldVxuIiwKIAkJCSBtc2csCi0JCQkgJm5wLT5kYWRkciwgbnRvaHMoaW5ldC0+aW5ldF9kcG9ydCksCisJCQkgJnNrLT5za192Nl9kYWRkciwgbnRvaHMoaW5ldC0+aW5ldF9kcG9ydCksCiAJCQkgdHAtPnNuZF9jd25kLCB0Y3BfbGVmdF9vdXQodHApLAogCQkJIHRwLT5zbmRfc3N0aHJlc2gsIHRwLT5wcmlvcl9zc3RocmVzaCwKIAkJCSB0cC0+cGFja2V0c19vdXQpOwpAQCAtMjUwMyw2ICsyNTM1LDkgQEAKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAorCWlmIChpbmV0X2NzayhzayktPmljc2tfY2Ffb3BzLT5jb25nX2NvbnRyb2wpCisJCXJldHVybjsKKwogCS8qIFJlc2V0IGN3bmQgdG8gc3N0aHJlc2ggaW4gQ1dSIG9yIFJlY292ZXJ5ICh1bmxlc3MgaXQncyB1bmRvbmUpICovCiAJaWYgKGluZXRfY3NrKHNrKS0+aWNza19jYV9zdGF0ZSA9PSBUQ1BfQ0FfQ1dSIHx8CiAJICAgICh0cC0+dW5kb19tYXJrZXIgJiYgdHAtPnNuZF9zc3RocmVzaCA8IFRDUF9JTkZJTklURV9TU1RIUkVTSCkpIHsKQEAgLTI4NzksNjcgKzI5MTQsMTMgQEAKIAkqcmV4bWl0ID0gUkVYTUlUX0xPU1Q7CiB9CiAKLS8qIEthdGhsZWVuIE5pY2hvbHMnIGFsZ29yaXRobSBmb3IgdHJhY2tpbmcgdGhlIG1pbmltdW0gdmFsdWUgb2YKLSAqIGEgZGF0YSBzdHJlYW0gb3ZlciBzb21lIGZpeGVkIHRpbWUgaW50ZXJ2YWwuIChFLmcuLCB0aGUgbWluaW11bQotICogUlRUIG92ZXIgdGhlIHBhc3QgZml2ZSBtaW51dGVzLikgSXQgdXNlcyBjb25zdGFudCBzcGFjZSBhbmQgY29uc3RhbnQKLSAqIHRpbWUgcGVyIHVwZGF0ZSB5ZXQgYWxtb3N0IGFsd2F5cyBkZWxpdmVycyB0aGUgc2FtZSBtaW5pbXVtIGFzIGFuCi0gKiBpbXBsZW1lbnRhdGlvbiB0aGF0IGhhcyB0byBrZWVwIGFsbCB0aGUgZGF0YSBpbiB0aGUgd2luZG93LgotICoKLSAqIFRoZSBhbGdvcml0aG0ga2VlcHMgdHJhY2sgb2YgdGhlIGJlc3QsIDJuZCBiZXN0ICYgM3JkIGJlc3QgbWluCi0gKiB2YWx1ZXMsIG1haW50YWluaW5nIGFuIGludmFyaWFudCB0aGF0IHRoZSBtZWFzdXJlbWVudCB0aW1lIG9mIHRoZQotICogbid0aCBiZXN0ID49IG4tMSd0aCBiZXN0LiBJdCBhbHNvIG1ha2VzIHN1cmUgdGhhdCB0aGUgdGhyZWUgdmFsdWVzCi0gKiBhcmUgd2lkZWx5IHNlcGFyYXRlZCBpbiB0aGUgdGltZSB3aW5kb3cgc2luY2UgdGhhdCBib3VuZHMgdGhlIHdvcnNlCi0gKiBjYXNlIGVycm9yIHdoZW4gdGhhdCBkYXRhIGlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBvdmVyIHRoZSB3aW5kb3cuCi0gKgotICogVXBvbiBnZXR0aW5nIGEgbmV3IG1pbiwgd2UgY2FuIGZvcmdldCBldmVyeXRoaW5nIGVhcmxpZXIgYmVjYXVzZSBpdAotICogaGFzIG5vIHZhbHVlIC0gdGhlIG5ldyBtaW4gaXMgPD0gZXZlcnl0aGluZyBlbHNlIGluIHRoZSB3aW5kb3cgYnkKLSAqIGRlZmluaXRpb24gYW5kIGl0J3MgdGhlIG1vc3QgcmVjZW50LiBTbyB3ZSByZXN0YXJ0IGZyZXNoIG9uIGV2ZXJ5IG5ldyBtaW4KLSAqIGFuZCBvdmVyd3JpdGVzIDJuZCAmIDNyZCBjaG9pY2VzLiBUaGUgc2FtZSBwcm9wZXJ0eSBob2xkcyBmb3IgMm5kICYgM3JkCi0gKiBiZXN0LgotICovCiBzdGF0aWMgdm9pZCB0Y3BfdXBkYXRlX3J0dF9taW4oc3RydWN0IHNvY2sgKnNrLCB1MzIgcnR0X3VzKQogewotCWNvbnN0IHUzMiBub3cgPSB0Y3BfdGltZV9zdGFtcCwgd2xlbiA9IHN5c2N0bF90Y3BfbWluX3J0dF93bGVuICogSFo7Ci0Jc3RydWN0IHJ0dF9tZWFzICptID0gdGNwX3NrKHNrKS0+cnR0X21pbjsKLQlzdHJ1Y3QgcnR0X21lYXMgcnR0bSA9IHsKLQkJLnJ0dCA9IGxpa2VseShydHRfdXMpID8gcnR0X3VzIDogamlmZmllc190b191c2VjcygxKSwKLQkJLnRzID0gbm93LAotCX07Ci0JdTMyIGVsYXBzZWQ7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJdTMyIHdsZW4gPSBzeXNjdGxfdGNwX21pbl9ydHRfd2xlbiAqIEhaOwogCi0JLyogQ2hlY2sgaWYgdGhlIG5ldyBtZWFzdXJlbWVudCB1cGRhdGVzIHRoZSAxc3QsIDJuZCwgb3IgM3JkIGNob2ljZXMgKi8KLQlpZiAodW5saWtlbHkocnR0bS5ydHQgPD0gbVswXS5ydHQpKQotCQltWzBdID0gbVsxXSA9IG1bMl0gPSBydHRtOwotCWVsc2UgaWYgKHJ0dG0ucnR0IDw9IG1bMV0ucnR0KQotCQltWzFdID0gbVsyXSA9IHJ0dG07Ci0JZWxzZSBpZiAocnR0bS5ydHQgPD0gbVsyXS5ydHQpCi0JCW1bMl0gPSBydHRtOwotCi0JZWxhcHNlZCA9IG5vdyAtIG1bMF0udHM7Ci0JaWYgKHVubGlrZWx5KGVsYXBzZWQgPiB3bGVuKSkgewotCQkvKiBQYXNzZWQgZW50aXJlIHdpbmRvdyB3aXRob3V0IGEgbmV3IG1pbiBzbyBtYWtlIDJuZCBjaG9pY2UKLQkJICogdGhlIG5ldyBtaW4gJiAzcmQgY2hvaWNlIHRoZSBuZXcgMm5kLiBTbyBmb3J0aCBhbmQgc28gb24uCi0JCSAqLwotCQltWzBdID0gbVsxXTsKLQkJbVsxXSA9IG1bMl07Ci0JCW1bMl0gPSBydHRtOwotCQlpZiAobm93IC0gbVswXS50cyA+IHdsZW4pIHsKLQkJCW1bMF0gPSBtWzFdOwotCQkJbVsxXSA9IHJ0dG07Ci0JCQlpZiAobm93IC0gbVswXS50cyA+IHdsZW4pCi0JCQkJbVswXSA9IHJ0dG07Ci0JCX0KLQl9IGVsc2UgaWYgKG1bMV0udHMgPT0gbVswXS50cyAmJiBlbGFwc2VkID4gd2xlbiAvIDQpIHsKLQkJLyogUGFzc2VkIGEgcXVhcnRlciBvZiB0aGUgd2luZG93IHdpdGhvdXQgYSBuZXcgbWluIHNvCi0JCSAqIHRha2UgMm5kIGNob2ljZSBmcm9tIHRoZSAybmQgcXVhcnRlciBvZiB0aGUgd2luZG93LgotCQkgKi8KLQkJbVsyXSA9IG1bMV0gPSBydHRtOwotCX0gZWxzZSBpZiAobVsyXS50cyA9PSBtWzFdLnRzICYmIGVsYXBzZWQgPiB3bGVuIC8gMikgewotCQkvKiBQYXNzZWQgaGFsZiB0aGUgd2luZG93IHdpdGhvdXQgYSBuZXcgbWluIHNvIHRha2UgdGhlIDNyZAotCQkgKiBjaG9pY2UgZnJvbSB0aGUgbGFzdCBoYWxmIG9mIHRoZSB3aW5kb3cuCi0JCSAqLwotCQltWzJdID0gcnR0bTsKLQl9CisJbWlubWF4X3J1bm5pbmdfbWluKCZ0cC0+cnR0X21pbiwgd2xlbiwgdGNwX3RpbWVfc3RhbXAsCisJCQkgICBydHRfdXMgPyA6IGppZmZpZXNfdG9fdXNlY3MoMSkpOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgdGNwX2Fja191cGRhdGVfcnR0KHN0cnVjdCBzb2NrICpzaywgY29uc3QgaW50IGZsYWcsCkBAIC0zMTAyLDEwICszMDgzLDExIEBACiAgKi8KIHN0YXRpYyBpbnQgdGNwX2NsZWFuX3J0eF9xdWV1ZShzdHJ1Y3Qgc29jayAqc2ssIGludCBwcmlvcl9mYWNrZXRzLAogCQkJICAgICAgIHUzMiBwcmlvcl9zbmRfdW5hLCBpbnQgKmFja2VkLAotCQkJICAgICAgIHN0cnVjdCB0Y3Bfc2Fja3RhZ19zdGF0ZSAqc2FjaykKKwkJCSAgICAgICBzdHJ1Y3QgdGNwX3NhY2t0YWdfc3RhdGUgKnNhY2ssCisJCQkgICAgICAgc3RydWN0IHNrYl9tc3RhbXAgKm5vdykKIHsKIAljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7Ci0Jc3RydWN0IHNrYl9tc3RhbXAgZmlyc3RfYWNrdCwgbGFzdF9hY2t0LCBub3c7CisJc3RydWN0IHNrYl9tc3RhbXAgZmlyc3RfYWNrdCwgbGFzdF9hY2t0OwogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXUzMiBwcmlvcl9zYWNrZWQgPSB0cC0+c2Fja2VkX291dDsKIAl1MzIgcmVvcmQgPSB0cC0+cGFja2V0c19vdXQ7CkBAIC0zMTM3LDcgKzMxMTksNiBAQAogCQkJYWNrZWRfcGNvdW50ID0gdGNwX3Rzb19hY2tlZChzaywgc2tiKTsKIAkJCWlmICghYWNrZWRfcGNvdW50KQogCQkJCWJyZWFrOwotCiAJCQlmdWxseV9hY2tlZCA9IGZhbHNlOwogCQl9IGVsc2UgewogCQkJLyogU3BlZWR1cCB0Y3BfdW5saW5rX3dyaXRlX3F1ZXVlKCkgYW5kIG5leHQgbG9vcCAqLwpAQCAtMzE3Myw2ICszMTU0LDcgQEAKIAogCQl0cC0+cGFja2V0c19vdXQgLT0gYWNrZWRfcGNvdW50OwogCQlwa3RzX2Fja2VkICs9IGFja2VkX3Bjb3VudDsKKwkJdGNwX3JhdGVfc2tiX2RlbGl2ZXJlZChzaywgc2tiLCBzYWNrLT5yYXRlKTsKIAogCQkvKiBJbml0aWFsIG91dGdvaW5nIFNZTidzIGdldCBwdXQgb250byB0aGUgd3JpdGVfcXVldWUKIAkJICoganVzdCBsaWtlIGFueXRoaW5nIGVsc2Ugd2UgdHJhbnNtaXQuICBJdCBpcyBub3QKQEAgLTMyMDUsMTYgKzMxODcsMTUgQEAKIAlpZiAoc2tiICYmIChUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmIFRDUENCX1NBQ0tFRF9BQ0tFRCkpCiAJCWZsYWcgfD0gRkxBR19TQUNLX1JFTkVHSU5HOwogCi0Jc2tiX21zdGFtcF9nZXQoJm5vdyk7CiAJaWYgKGxpa2VseShmaXJzdF9hY2t0LnY2NCkgJiYgIShmbGFnICYgRkxBR19SRVRSQU5TX0RBVEFfQUNLRUQpKSB7Ci0JCXNlcV9ydHRfdXMgPSBza2JfbXN0YW1wX3VzX2RlbHRhKCZub3csICZmaXJzdF9hY2t0KTsKLQkJY2FfcnR0X3VzID0gc2tiX21zdGFtcF91c19kZWx0YSgmbm93LCAmbGFzdF9hY2t0KTsKKwkJc2VxX3J0dF91cyA9IHNrYl9tc3RhbXBfdXNfZGVsdGEobm93LCAmZmlyc3RfYWNrdCk7CisJCWNhX3J0dF91cyA9IHNrYl9tc3RhbXBfdXNfZGVsdGEobm93LCAmbGFzdF9hY2t0KTsKIAl9CiAJaWYgKHNhY2stPmZpcnN0X3NhY2t0LnY2NCkgewotCQlzYWNrX3J0dF91cyA9IHNrYl9tc3RhbXBfdXNfZGVsdGEoJm5vdywgJnNhY2stPmZpcnN0X3NhY2t0KTsKLQkJY2FfcnR0X3VzID0gc2tiX21zdGFtcF91c19kZWx0YSgmbm93LCAmc2Fjay0+bGFzdF9zYWNrdCk7CisJCXNhY2tfcnR0X3VzID0gc2tiX21zdGFtcF91c19kZWx0YShub3csICZzYWNrLT5maXJzdF9zYWNrdCk7CisJCWNhX3J0dF91cyA9IHNrYl9tc3RhbXBfdXNfZGVsdGEobm93LCAmc2Fjay0+bGFzdF9zYWNrdCk7CiAJfQotCisJc2Fjay0+cmF0ZS0+cnR0X3VzID0gY2FfcnR0X3VzOyAvKiBSVFQgb2YgbGFzdCAoUylBQ0tlZCBwYWNrZXQsIG9yIC0xICovCiAJcnR0X3VwZGF0ZSA9IHRjcF9hY2tfdXBkYXRlX3J0dChzaywgZmxhZywgc2VxX3J0dF91cywgc2Fja19ydHRfdXMsCiAJCQkJCWNhX3J0dF91cyk7CiAKQEAgLTMyNDIsNyArMzIyMyw3IEBACiAJCXRwLT5mYWNrZXRzX291dCAtPSBtaW4ocGt0c19hY2tlZCwgdHAtPmZhY2tldHNfb3V0KTsKIAogCX0gZWxzZSBpZiAoc2tiICYmIHJ0dF91cGRhdGUgJiYgc2Fja19ydHRfdXMgPj0gMCAmJgotCQkgICBzYWNrX3J0dF91cyA+IHNrYl9tc3RhbXBfdXNfZGVsdGEoJm5vdywgJnNrYi0+c2tiX21zdGFtcCkpIHsKKwkJICAgc2Fja19ydHRfdXMgPiBza2JfbXN0YW1wX3VzX2RlbHRhKG5vdywgJnNrYi0+c2tiX21zdGFtcCkpIHsKIAkJLyogRG8gbm90IHJlLWFybSBSVE8gaWYgdGhlIHNhY2sgUlRUIGlzIG1lYXN1cmVkIGZyb20gZGF0YSBzZW50CiAJCSAqIGFmdGVyIHdoZW4gdGhlIGhlYWQgd2FzIGxhc3QgKHJlKXRyYW5zbWl0dGVkLiBPdGhlcndpc2UgdGhlCiAJCSAqIHRpbWVvdXQgbWF5IGNvbnRpbnVlIHRvIGV4dGVuZCBpbiBsb3NzIHJlY292ZXJ5LgpAQCAtMzMzMyw4ICszMzE0LDE1IEBACiAgKiBpbmZvcm1hdGlvbi4gQWxsIHRyYW5zbWlzc2lvbiBvciByZXRyYW5zbWlzc2lvbiBhcmUgZGVsYXllZCBhZnRlcndhcmRzLgogICovCiBzdGF0aWMgdm9pZCB0Y3BfY29uZ19jb250cm9sKHN0cnVjdCBzb2NrICpzaywgdTMyIGFjaywgdTMyIGFja2VkX3NhY2tlZCwKLQkJCSAgICAgaW50IGZsYWcpCisJCQkgICAgIGludCBmbGFnLCBjb25zdCBzdHJ1Y3QgcmF0ZV9zYW1wbGUgKnJzKQogeworCWNvbnN0IHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKKworCWlmIChpY3NrLT5pY3NrX2NhX29wcy0+Y29uZ19jb250cm9sKSB7CisJCWljc2stPmljc2tfY2Ffb3BzLT5jb25nX2NvbnRyb2woc2ssIHJzKTsKKwkJcmV0dXJuOworCX0KKwogCWlmICh0Y3BfaW5fY3duZF9yZWR1Y3Rpb24oc2spKSB7CiAJCS8qIFJlZHVjZSBjd25kIGlmIHN0YXRlIG1hbmRhdGVzICovCiAJCXRjcF9jd25kX3JlZHVjdGlvbihzaywgYWNrZWRfc2Fja2VkLCBmbGFnKTsKQEAgLTM1NzksMTcgKzM1NjcsMjEgQEAKIAlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IHRjcF9zYWNrdGFnX3N0YXRlIHNhY2tfc3RhdGU7CisJc3RydWN0IHJhdGVfc2FtcGxlIHJzID0geyAucHJpb3JfZGVsaXZlcmVkID0gMCB9OwogCXUzMiBwcmlvcl9zbmRfdW5hID0gdHAtPnNuZF91bmE7CiAJdTMyIGFja19zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKIAl1MzIgYWNrID0gVENQX1NLQl9DQihza2IpLT5hY2tfc2VxOwogCWJvb2wgaXNfZHVwYWNrID0gZmFsc2U7CiAJdTMyIHByaW9yX2ZhY2tldHM7CiAJaW50IHByaW9yX3BhY2tldHMgPSB0cC0+cGFja2V0c19vdXQ7Ci0JdTMyIHByaW9yX2RlbGl2ZXJlZCA9IHRwLT5kZWxpdmVyZWQ7CisJdTMyIGRlbGl2ZXJlZCA9IHRwLT5kZWxpdmVyZWQ7CisJdTMyIGxvc3QgPSB0cC0+bG9zdDsKIAlpbnQgYWNrZWQgPSAwOyAvKiBOdW1iZXIgb2YgcGFja2V0cyBuZXdseSBhY2tlZCAqLwogCWludCByZXhtaXQgPSBSRVhNSVRfTk9ORTsgLyogRmxhZyB0byAocmUpdHJhbnNtaXQgdG8gcmVjb3ZlciBsb3NzZXMgKi8KKwlzdHJ1Y3Qgc2tiX21zdGFtcCBub3c7CiAKIAlzYWNrX3N0YXRlLmZpcnN0X3NhY2t0LnY2NCA9IDA7CisJc2Fja19zdGF0ZS5yYXRlID0gJnJzOwogCiAJLyogV2UgdmVyeSBsaWtlbHkgd2lsbCBuZWVkIHRvIGFjY2VzcyB3cml0ZSBxdWV1ZSBoZWFkLiAqLwogCXByZWZldGNodyhzay0+c2tfd3JpdGVfcXVldWUubmV4dCk7CkBAIC0zNjEyLDYgKzM2MDQsOCBAQAogCWlmIChhZnRlcihhY2ssIHRwLT5zbmRfbnh0KSkKIAkJZ290byBpbnZhbGlkX2FjazsKIAorCXNrYl9tc3RhbXBfZ2V0KCZub3cpOworCiAJaWYgKGljc2stPmljc2tfcGVuZGluZyA9PSBJQ1NLX1RJTUVfRUFSTFlfUkVUUkFOUyB8fAogCSAgICBpY3NrLT5pY3NrX3BlbmRpbmcgPT0gSUNTS19USU1FX0xPU1NfUFJPQkUpCiAJCXRjcF9yZWFybV9ydG8oc2spOwpAQCAtMzYyMiw2ICszNjE2LDcgQEAKIAl9CiAKIAlwcmlvcl9mYWNrZXRzID0gdHAtPmZhY2tldHNfb3V0OworCXJzLnByaW9yX2luX2ZsaWdodCA9IHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCk7CiAKIAkvKiB0c19yZWNlbnQgdXBkYXRlIG11c3QgYmUgbWFkZSBhZnRlciB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBwYWNrZXQKIAkgKiBpcyBpbiB3aW5kb3cuCkBAIC0zNjc3LDcgKzM2NzIsNyBAQAogCiAJLyogU2VlIGlmIHdlIGNhbiB0YWtlIGFueXRoaW5nIG9mZiBvZiB0aGUgcmV0cmFuc21pdCBxdWV1ZS4gKi8KIAlmbGFnIHw9IHRjcF9jbGVhbl9ydHhfcXVldWUoc2ssIHByaW9yX2ZhY2tldHMsIHByaW9yX3NuZF91bmEsICZhY2tlZCwKLQkJCQkgICAgJnNhY2tfc3RhdGUpOworCQkJCSAgICAmc2Fja19zdGF0ZSwgJm5vdyk7CiAKIAlpZiAodGNwX2Fja19pc19kdWJpb3VzKHNrLCBmbGFnKSkgewogCQlpc19kdXBhY2sgPSAhKGZsYWcgJiAoRkxBR19TTkRfVU5BX0FEVkFOQ0VEIHwgRkxBR19OT1RfRFVQKSk7CkBAIC0zNjk0LDcgKzM2ODksMTAgQEAKIAogCWlmIChpY3NrLT5pY3NrX3BlbmRpbmcgPT0gSUNTS19USU1FX1JFVFJBTlMpCiAJCXRjcF9zY2hlZHVsZV9sb3NzX3Byb2JlKHNrKTsKLQl0Y3BfY29uZ19jb250cm9sKHNrLCBhY2ssIHRwLT5kZWxpdmVyZWQgLSBwcmlvcl9kZWxpdmVyZWQsIGZsYWcpOworCWRlbGl2ZXJlZCA9IHRwLT5kZWxpdmVyZWQgLSBkZWxpdmVyZWQ7CS8qIGZyZXNobHkgQUNLZWQgb3IgU0FDS2VkICovCisJbG9zdCA9IHRwLT5sb3N0IC0gbG9zdDsJCQkvKiBmcmVzaGx5IG1hcmtlZCBsb3N0ICovCisJdGNwX3JhdGVfZ2VuKHNrLCBkZWxpdmVyZWQsIGxvc3QsICZub3csICZycyk7CisJdGNwX2NvbmdfY29udHJvbChzaywgYWNrLCBkZWxpdmVyZWQsIGZsYWcsICZycyk7CiAJdGNwX3htaXRfcmVjb3Zlcnkoc2ssIHJleG1pdCk7CiAJcmV0dXJuIDE7CiAKQEAgLTQxMDgsNyArNDEwNiw3IEBACiAJLyogSXQgX2lzXyBwb3NzaWJsZSwgdGhhdCB3ZSBoYXZlIHNvbWV0aGluZyBvdXQtb2Ytb3JkZXIgX2FmdGVyXyBGSU4uCiAJICogUHJvYmFibHksIHdlIHNob3VsZCByZXNldCBpbiB0aGlzIGNhc2UuIEZvciBub3cgZHJvcCB0aGVtLgogCSAqLwotCV9fc2tiX3F1ZXVlX3B1cmdlKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKKwlza2JfcmJ0cmVlX3B1cmdlKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKIAlpZiAodGNwX2lzX3NhY2sodHApKQogCQl0Y3Bfc2Fja19yZXNldCgmdHAtPnJ4X29wdCk7CiAJc2tfbWVtX3JlY2xhaW0oc2spOwpAQCAtNDI2OCw3ICs0MjY2LDcgQEAKIAlpbnQgdGhpc19zYWNrOwogCiAJLyogRW1wdHkgb2ZvIHF1ZXVlLCBoZW5jZSwgYWxsIHRoZSBTQUNLcyBhcmUgZWF0ZW4uIENsZWFyLiAqLwotCWlmIChza2JfcXVldWVfZW1wdHkoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpKSB7CisJaWYgKFJCX0VNUFRZX1JPT1QoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpKSB7CiAJCXRwLT5yeF9vcHQubnVtX3NhY2tzID0gMDsKIAkJcmV0dXJuOwogCX0KQEAgLTQzNDQsMTAgKzQzNDIsMTMgQEAKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlfX3UzMiBkc2Fja19oaWdoID0gdHAtPnJjdl9ueHQ7CisJYm9vbCBmaW4sIGZyYWdzdG9sZW4sIGVhdGVuOwogCXN0cnVjdCBza19idWZmICpza2IsICp0YWlsOwotCWJvb2wgZnJhZ3N0b2xlbiwgZWF0ZW47CisJc3RydWN0IHJiX25vZGUgKnA7CiAKLQl3aGlsZSAoKHNrYiA9IHNrYl9wZWVrKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgIT0gTlVMTCkgeworCXAgPSByYl9maXJzdCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CisJd2hpbGUgKHApIHsKKwkJc2tiID0gcmJfZW50cnkocCwgc3RydWN0IHNrX2J1ZmYsIHJibm9kZSk7CiAJCWlmIChhZnRlcihUQ1BfU0tCX0NCKHNrYiktPnNlcSwgdHAtPnJjdl9ueHQpKQogCQkJYnJlYWs7CiAKQEAgLTQzNTcsOSArNDM1OCwxMCBAQAogCQkJCWRzYWNrX2hpZ2ggPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CiAJCQl0Y3BfZHNhY2tfZXh0ZW5kKHNrLCBUQ1BfU0tCX0NCKHNrYiktPnNlcSwgZHNhY2spOwogCQl9CisJCXAgPSByYl9uZXh0KHApOworCQlyYl9lcmFzZSgmc2tiLT5yYm5vZGUsICZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKIAotCQlfX3NrYl91bmxpbmsoc2tiLCAmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7Ci0JCWlmICghYWZ0ZXIoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxLCB0cC0+cmN2X254dCkpIHsKKwkJaWYgKHVubGlrZWx5KCFhZnRlcihUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEsIHRwLT5yY3Zfbnh0KSkpIHsKIAkJCVNPQ0tfREVCVUcoc2ssICJvZm8gcGFja2V0IHdhcyBhbHJlYWR5IHJlY2VpdmVkXG4iKTsKIAkJCXRjcF9kcm9wKHNrLCBza2IpOwogCQkJY29udGludWU7CkBAIC00MzcxLDEyICs0MzczLDE5IEBACiAJCXRhaWwgPSBza2JfcGVla190YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CiAJCWVhdGVuID0gdGFpbCAmJiB0Y3BfdHJ5X2NvYWxlc2NlKHNrLCB0YWlsLCBza2IsICZmcmFnc3RvbGVuKTsKIAkJdGNwX3Jjdl9ueHRfdXBkYXRlKHRwLCBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEpOworCQlmaW4gPSBUQ1BfU0tCX0NCKHNrYiktPnRjcF9mbGFncyAmIFRDUEhEUl9GSU47CiAJCWlmICghZWF0ZW4pCiAJCQlfX3NrYl9xdWV1ZV90YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKLQkJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+dGNwX2ZsYWdzICYgVENQSERSX0ZJTikKLQkJCXRjcF9maW4oc2spOwotCQlpZiAoZWF0ZW4pCisJCWVsc2UKIAkJCWtmcmVlX3NrYl9wYXJ0aWFsKHNrYiwgZnJhZ3N0b2xlbik7CisKKwkJaWYgKHVubGlrZWx5KGZpbikpIHsKKwkJCXRjcF9maW4oc2spOworCQkJLyogdGNwX2ZpbigpIHB1cmdlcyB0cC0+b3V0X29mX29yZGVyX3F1ZXVlLAorCQkJICogc28gd2UgbXVzdCBlbmQgdGhpcyBsb29wIHJpZ2h0IG5vdy4KKwkJCSAqLworCQkJYnJlYWs7CisJCX0KIAl9CiB9CiAKQEAgLTQzOTIsMTIgKzQ0MDEsOSBAQAogCQlpZiAodGNwX3BydW5lX3F1ZXVlKHNrKSA8IDApCiAJCQlyZXR1cm4gLTE7CiAKLQkJaWYgKCFza19ybWVtX3NjaGVkdWxlKHNrLCBza2IsIHNpemUpKSB7CisJCXdoaWxlICghc2tfcm1lbV9zY2hlZHVsZShzaywgc2tiLCBzaXplKSkgewogCQkJaWYgKCF0Y3BfcHJ1bmVfb2ZvX3F1ZXVlKHNrKSkKIAkJCQlyZXR1cm4gLTE7Ci0KLQkJCWlmICghc2tfcm1lbV9zY2hlZHVsZShzaywgc2tiLCBzaXplKSkKLQkJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CkBAIC00NDA2LDggKzQ0MTIsMTAgQEAKIHN0YXRpYyB2b2lkIHRjcF9kYXRhX3F1ZXVlX29mbyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IHJiX25vZGUgKipwLCAqcSwgKnBhcmVudDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMTsKIAl1MzIgc2VxLCBlbmRfc2VxOworCWJvb2wgZnJhZ3N0b2xlbjsKIAogCXRjcF9lY25fY2hlY2tfY2UodHAsIHNrYik7CiAKQEAgLTQ0MjIsODggKzQ0MzAsOTIgQEAKIAlpbmV0X2Nza19zY2hlZHVsZV9hY2soc2spOwogCiAJTkVUX0lOQ19TVEFUUyhzb2NrX25ldChzayksIExJTlVYX01JQl9UQ1BPRk9RVUVVRSk7CisJc2VxID0gVENQX1NLQl9DQihza2IpLT5zZXE7CisJZW5kX3NlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKIAlTT0NLX0RFQlVHKHNrLCAib3V0IG9mIG9yZGVyIHNlZ21lbnQ6IHJjdl9uZXh0ICVYIHNlcSAlWCAtICVYXG4iLAotCQkgICB0cC0+cmN2X254dCwgVENQX1NLQl9DQihza2IpLT5zZXEsIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSk7CisJCSAgIHRwLT5yY3Zfbnh0LCBzZXEsIGVuZF9zZXEpOwogCi0Jc2tiMSA9IHNrYl9wZWVrX3RhaWwoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOwotCWlmICghc2tiMSkgeworCXAgPSAmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZS5yYl9ub2RlOworCWlmIChSQl9FTVBUWV9ST09UKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgewogCQkvKiBJbml0aWFsIG91dCBvZiBvcmRlciBzZWdtZW50LCBidWlsZCAxIFNBQ0suICovCiAJCWlmICh0Y3BfaXNfc2Fjayh0cCkpIHsKIAkJCXRwLT5yeF9vcHQubnVtX3NhY2tzID0gMTsKLQkJCXRwLT5zZWxlY3RpdmVfYWNrc1swXS5zdGFydF9zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKLQkJCXRwLT5zZWxlY3RpdmVfYWNrc1swXS5lbmRfc2VxID0KLQkJCQkJCVRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKKwkJCXRwLT5zZWxlY3RpdmVfYWNrc1swXS5zdGFydF9zZXEgPSBzZXE7CisJCQl0cC0+c2VsZWN0aXZlX2Fja3NbMF0uZW5kX3NlcSA9IGVuZF9zZXE7CiAJCX0KLQkJX19za2JfcXVldWVfaGVhZCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSwgc2tiKTsKKwkJcmJfbGlua19ub2RlKCZza2ItPnJibm9kZSwgTlVMTCwgcCk7CisJCXJiX2luc2VydF9jb2xvcigmc2tiLT5yYm5vZGUsICZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKKwkJdHAtPm9vb19sYXN0X3NrYiA9IHNrYjsKIAkJZ290byBlbmQ7CiAJfQogCi0Jc2VxID0gVENQX1NLQl9DQihza2IpLT5zZXE7Ci0JZW5kX3NlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKLQotCWlmIChzZXEgPT0gVENQX1NLQl9DQihza2IxKS0+ZW5kX3NlcSkgewotCQlib29sIGZyYWdzdG9sZW47Ci0KLQkJaWYgKCF0Y3BfdHJ5X2NvYWxlc2NlKHNrLCBza2IxLCBza2IsICZmcmFnc3RvbGVuKSkgewotCQkJX19za2JfcXVldWVfYWZ0ZXIoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsIHNrYjEsIHNrYik7Ci0JCX0gZWxzZSB7Ci0JCQl0Y3BfZ3Jvd193aW5kb3coc2ssIHNrYik7Ci0JCQlrZnJlZV9za2JfcGFydGlhbChza2IsIGZyYWdzdG9sZW4pOwotCQkJc2tiID0gTlVMTDsKLQkJfQotCi0JCWlmICghdHAtPnJ4X29wdC5udW1fc2Fja3MgfHwKLQkJICAgIHRwLT5zZWxlY3RpdmVfYWNrc1swXS5lbmRfc2VxICE9IHNlcSkKLQkJCWdvdG8gYWRkX3NhY2s7Ci0KLQkJLyogQ29tbW9uIGNhc2U6IGRhdGEgYXJyaXZlIGluIG9yZGVyIGFmdGVyIGhvbGUuICovCi0JCXRwLT5zZWxlY3RpdmVfYWNrc1swXS5lbmRfc2VxID0gZW5kX3NlcTsKLQkJZ290byBlbmQ7CisJLyogSW4gdGhlIHR5cGljYWwgY2FzZSwgd2UgYXJlIGFkZGluZyBhbiBza2IgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KKwkgKiBVc2Ugb2Ygb29vX2xhc3Rfc2tiIGF2b2lkcyB0aGUgTyhMb2coTikpIHJidHJlZSBsb29rdXAuCisJICovCisJaWYgKHRjcF90cnlfY29hbGVzY2Uoc2ssIHRwLT5vb29fbGFzdF9za2IsIHNrYiwgJmZyYWdzdG9sZW4pKSB7Citjb2FsZXNjZV9kb25lOgorCQl0Y3BfZ3Jvd193aW5kb3coc2ssIHNrYik7CisJCWtmcmVlX3NrYl9wYXJ0aWFsKHNrYiwgZnJhZ3N0b2xlbik7CisJCXNrYiA9IE5VTEw7CisJCWdvdG8gYWRkX3NhY2s7CisJfQorCS8qIENhbiBhdm9pZCBhbiByYnRyZWUgbG9va3VwIGlmIHdlIGFyZSBhZGRpbmcgc2tiIGFmdGVyIG9vb19sYXN0X3NrYiAqLworCWlmICghYmVmb3JlKHNlcSwgVENQX1NLQl9DQih0cC0+b29vX2xhc3Rfc2tiKS0+ZW5kX3NlcSkpIHsKKwkJcGFyZW50ID0gJnRwLT5vb29fbGFzdF9za2ItPnJibm9kZTsKKwkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCQlnb3RvIGluc2VydDsKIAl9CiAKLQkvKiBGaW5kIHBsYWNlIHRvIGluc2VydCB0aGlzIHNlZ21lbnQuICovCi0Jd2hpbGUgKDEpIHsKLQkJaWYgKCFhZnRlcihUQ1BfU0tCX0NCKHNrYjEpLT5zZXEsIHNlcSkpCi0JCQlicmVhazsKLQkJaWYgKHNrYl9xdWV1ZV9pc19maXJzdCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSwgc2tiMSkpIHsKLQkJCXNrYjEgPSBOVUxMOwotCQkJYnJlYWs7CisJLyogRmluZCBwbGFjZSB0byBpbnNlcnQgdGhpcyBzZWdtZW50LiBIYW5kbGUgb3ZlcmxhcHMgb24gdGhlIHdheS4gKi8KKwlwYXJlbnQgPSBOVUxMOworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJc2tiMSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHNrX2J1ZmYsIHJibm9kZSk7CisJCWlmIChiZWZvcmUoc2VxLCBUQ1BfU0tCX0NCKHNrYjEpLT5zZXEpKSB7CisJCQlwID0gJnBhcmVudC0+cmJfbGVmdDsKKwkJCWNvbnRpbnVlOwogCQl9Ci0JCXNrYjEgPSBza2JfcXVldWVfcHJldigmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSwgc2tiMSk7CisJCWlmIChiZWZvcmUoc2VxLCBUQ1BfU0tCX0NCKHNrYjEpLT5lbmRfc2VxKSkgeworCQkJaWYgKCFhZnRlcihlbmRfc2VxLCBUQ1BfU0tCX0NCKHNrYjEpLT5lbmRfc2VxKSkgeworCQkJCS8qIEFsbCB0aGUgYml0cyBhcmUgcHJlc2VudC4gRHJvcC4gKi8KKwkJCQlORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwKKwkJCQkJICAgICAgTElOVVhfTUlCX1RDUE9GT01FUkdFKTsKKwkJCQlfX2tmcmVlX3NrYihza2IpOworCQkJCXNrYiA9IE5VTEw7CisJCQkJdGNwX2RzYWNrX3NldChzaywgc2VxLCBlbmRfc2VxKTsKKwkJCQlnb3RvIGFkZF9zYWNrOworCQkJfQorCQkJaWYgKGFmdGVyKHNlcSwgVENQX1NLQl9DQihza2IxKS0+c2VxKSkgeworCQkJCS8qIFBhcnRpYWwgb3ZlcmxhcC4gKi8KKwkJCQl0Y3BfZHNhY2tfc2V0KHNrLCBzZXEsIFRDUF9TS0JfQ0Ioc2tiMSktPmVuZF9zZXEpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBza2IncyBzZXEgPT0gc2tiMSdzIHNlcSBhbmQgc2tiIGNvdmVycyBza2IxLgorCQkJCSAqIFJlcGxhY2Ugc2tiMSB3aXRoIHNrYi4KKwkJCQkgKi8KKwkJCQlyYl9yZXBsYWNlX25vZGUoJnNrYjEtPnJibm9kZSwgJnNrYi0+cmJub2RlLAorCQkJCQkJJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOworCQkJCXRjcF9kc2Fja19leHRlbmQoc2ssCisJCQkJCQkgVENQX1NLQl9DQihza2IxKS0+c2VxLAorCQkJCQkJIFRDUF9TS0JfQ0Ioc2tiMSktPmVuZF9zZXEpOworCQkJCU5FVF9JTkNfU1RBVFMoc29ja19uZXQoc2spLAorCQkJCQkgICAgICBMSU5VWF9NSUJfVENQT0ZPTUVSR0UpOworCQkJCV9fa2ZyZWVfc2tiKHNrYjEpOworCQkJCWdvdG8gbWVyZ2VfcmlnaHQ7CisJCQl9CisJCX0gZWxzZSBpZiAodGNwX3RyeV9jb2FsZXNjZShzaywgc2tiMSwgc2tiLCAmZnJhZ3N0b2xlbikpIHsKKwkJCWdvdG8gY29hbGVzY2VfZG9uZTsKKwkJfQorCQlwID0gJnBhcmVudC0+cmJfcmlnaHQ7CiAJfQoraW5zZXJ0OgorCS8qIEluc2VydCBzZWdtZW50IGludG8gUkIgdHJlZS4gKi8KKwlyYl9saW5rX25vZGUoJnNrYi0+cmJub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmc2tiLT5yYm5vZGUsICZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKIAotCS8qIERvIHNrYiBvdmVybGFwIHRvIHByZXZpb3VzIG9uZT8gKi8KLQlpZiAoc2tiMSAmJiBiZWZvcmUoc2VxLCBUQ1BfU0tCX0NCKHNrYjEpLT5lbmRfc2VxKSkgewotCQlpZiAoIWFmdGVyKGVuZF9zZXEsIFRDUF9TS0JfQ0Ioc2tiMSktPmVuZF9zZXEpKSB7Ci0JCQkvKiBBbGwgdGhlIGJpdHMgYXJlIHByZXNlbnQuIERyb3AuICovCi0JCQlORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUE9GT01FUkdFKTsKLQkJCXRjcF9kcm9wKHNrLCBza2IpOwotCQkJc2tiID0gTlVMTDsKLQkJCXRjcF9kc2Fja19zZXQoc2ssIHNlcSwgZW5kX3NlcSk7Ci0JCQlnb3RvIGFkZF9zYWNrOwotCQl9Ci0JCWlmIChhZnRlcihzZXEsIFRDUF9TS0JfQ0Ioc2tiMSktPnNlcSkpIHsKLQkJCS8qIFBhcnRpYWwgb3ZlcmxhcC4gKi8KLQkJCXRjcF9kc2Fja19zZXQoc2ssIHNlcSwKLQkJCQkgICAgICBUQ1BfU0tCX0NCKHNrYjEpLT5lbmRfc2VxKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChza2JfcXVldWVfaXNfZmlyc3QoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsCi0JCQkJCSAgICAgICBza2IxKSkKLQkJCQlza2IxID0gTlVMTDsKLQkJCWVsc2UKLQkJCQlza2IxID0gc2tiX3F1ZXVlX3ByZXYoCi0JCQkJCSZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlLAotCQkJCQlza2IxKTsKLQkJfQotCX0KLQlpZiAoIXNrYjEpCi0JCV9fc2tiX3F1ZXVlX2hlYWQoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsIHNrYik7Ci0JZWxzZQotCQlfX3NrYl9xdWV1ZV9hZnRlcigmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSwgc2tiMSwgc2tiKTsKLQotCS8qIEFuZCBjbGVhbiBzZWdtZW50cyBjb3ZlcmVkIGJ5IG5ldyBvbmUgYXMgd2hvbGUuICovCi0Jd2hpbGUgKCFza2JfcXVldWVfaXNfbGFzdCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSwgc2tiKSkgewotCQlza2IxID0gc2tiX3F1ZXVlX25leHQoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsIHNrYik7CittZXJnZV9yaWdodDoKKwkvKiBSZW1vdmUgb3RoZXIgc2VnbWVudHMgY292ZXJlZCBieSBza2IuICovCisJd2hpbGUgKChxID0gcmJfbmV4dCgmc2tiLT5yYm5vZGUpKSAhPSBOVUxMKSB7CisJCXNrYjEgPSByYl9lbnRyeShxLCBzdHJ1Y3Qgc2tfYnVmZiwgcmJub2RlKTsKIAogCQlpZiAoIWFmdGVyKGVuZF9zZXEsIFRDUF9TS0JfQ0Ioc2tiMSktPnNlcSkpCiAJCQlicmVhazsKQEAgLTQ1MTIsMTIgKzQ1MjQsMTUgQEAKIAkJCQkJIGVuZF9zZXEpOwogCQkJYnJlYWs7CiAJCX0KLQkJX19za2JfdW5saW5rKHNrYjEsICZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKKwkJcmJfZXJhc2UoJnNrYjEtPnJibm9kZSwgJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOwogCQl0Y3BfZHNhY2tfZXh0ZW5kKHNrLCBUQ1BfU0tCX0NCKHNrYjEpLT5zZXEsCiAJCQkJIFRDUF9TS0JfQ0Ioc2tiMSktPmVuZF9zZXEpOwogCQlORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUE9GT01FUkdFKTsKIAkJdGNwX2Ryb3Aoc2ssIHNrYjEpOwogCX0KKwkvKiBJZiB0aGVyZSBpcyBubyBza2IgYWZ0ZXIgdXMsIHdlIGFyZSB0aGUgbGFzdF9za2IgISAqLworCWlmICghcSkKKwkJdHAtPm9vb19sYXN0X3NrYiA9IHNrYjsKIAogYWRkX3NhY2s6CiAJaWYgKHRjcF9pc19zYWNrKHRwKSkKQEAgLTQ2NTQsMTMgKzQ2NjksMTMgQEAKIAkJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+dGNwX2ZsYWdzICYgVENQSERSX0ZJTikKIAkJCXRjcF9maW4oc2spOwogCi0JCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgeworCQlpZiAoIVJCX0VNUFRZX1JPT1QoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpKSB7CiAJCQl0Y3Bfb2ZvX3F1ZXVlKHNrKTsKIAogCQkJLyogUkZDMjU4MS4gNC4yLiBTSE9VTEQgc2VuZCBpbW1lZGlhdGUgQUNLLCB3aGVuCiAJCQkgKiBnYXAgaW4gcXVldWUgaXMgZmlsbGVkLgogCQkJICovCi0JCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkKKwkJCWlmIChSQl9FTVBUWV9ST09UKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkKIAkJCQlpbmV0X2NzayhzayktPmljc2tfYWNrLnBpbmdwb25nID0gMDsKIAkJfQogCkBAIC00NzE0LDQ4ICs0NzI5LDc2IEBACiAJdGNwX2RhdGFfcXVldWVfb2ZvKHNrLCBza2IpOwogfQogCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnRjcF9jb2xsYXBzZV9vbmUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQorc3RhdGljIHN0cnVjdCBza19idWZmICp0Y3Bfc2tiX25leHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dCA9IE5VTEw7CisJaWYgKGxpc3QpCisJCXJldHVybiAhc2tiX3F1ZXVlX2lzX2xhc3QobGlzdCwgc2tiKSA/IHNrYi0+bmV4dCA6IE5VTEw7CiAKLQlpZiAoIXNrYl9xdWV1ZV9pc19sYXN0KGxpc3QsIHNrYikpCi0JCW5leHQgPSBza2JfcXVldWVfbmV4dChsaXN0LCBza2IpOworCXJldHVybiByYl9lbnRyeV9zYWZlKHJiX25leHQoJnNrYi0+cmJub2RlKSwgc3RydWN0IHNrX2J1ZmYsIHJibm9kZSk7Cit9CiAKLQlfX3NrYl91bmxpbmsoc2tiLCBsaXN0KTsKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdGNwX2NvbGxhcHNlX29uZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCXN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QsCisJCQkJCXN0cnVjdCByYl9yb290ICpyb290KQoreworCXN0cnVjdCBza19idWZmICpuZXh0ID0gdGNwX3NrYl9uZXh0KHNrYiwgbGlzdCk7CisKKwlpZiAobGlzdCkKKwkJX19za2JfdW5saW5rKHNrYiwgbGlzdCk7CisJZWxzZQorCQlyYl9lcmFzZSgmc2tiLT5yYm5vZGUsIHJvb3QpOworCiAJX19rZnJlZV9za2Ioc2tiKTsKIAlORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUFJDVkNPTExBUFNFRCk7CiAKIAlyZXR1cm4gbmV4dDsKIH0KIAorLyogSW5zZXJ0IHNrYiBpbnRvIHJiIHRyZWUsIG9yZGVyZWQgYnkgVENQX1NLQl9DQihza2IpLT5zZXEgKi8KK3N0YXRpYyB2b2lkIHRjcF9yYnRyZWVfaW5zZXJ0KHN0cnVjdCByYl9yb290ICpyb290LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZyb290LT5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2IxOworCisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQlza2IxID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3Qgc2tfYnVmZiwgcmJub2RlKTsKKwkJaWYgKGJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwgVENQX1NLQl9DQihza2IxKS0+c2VxKSkKKwkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OworCQllbHNlCisJCQlwID0gJnBhcmVudC0+cmJfcmlnaHQ7CisJfQorCXJiX2xpbmtfbm9kZSgmc2tiLT5yYm5vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZza2ItPnJibm9kZSwgcm9vdCk7Cit9CisKIC8qIENvbGxhcHNlIGNvbnRpZ3VvdXMgc2VxdWVuY2Ugb2Ygc2ticyBoZWFkLi50YWlsIHdpdGgKICAqIHNlcXVlbmNlIG51bWJlcnMgc3RhcnQuLmVuZC4KICAqCi0gKiBJZiB0YWlsIGlzIE5VTEwsIHRoaXMgbWVhbnMgdW50aWwgdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAqIElmIHRhaWwgaXMgTlVMTCwgdGhpcyBtZWFucyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBxdWV1ZS4KICAqCiAgKiBTZWdtZW50cyB3aXRoIEZJTi9TWU4gYXJlIG5vdCBjb2xsYXBzZWQgKG9ubHkgYmVjYXVzZSB0aGlzCiAgKiBzaW1wbGlmaWVzIGNvZGUpCiAgKi8KIHN0YXRpYyB2b2lkCi10Y3BfY29sbGFwc2Uoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0LAotCSAgICAgc3RydWN0IHNrX2J1ZmYgKmhlYWQsIHN0cnVjdCBza19idWZmICp0YWlsLAotCSAgICAgdTMyIHN0YXJ0LCB1MzIgZW5kKQordGNwX2NvbGxhcHNlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCwgc3RydWN0IHJiX3Jvb3QgKnJvb3QsCisJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqaGVhZCwgc3RydWN0IHNrX2J1ZmYgKnRhaWwsIHUzMiBzdGFydCwgdTMyIGVuZCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gaGVhZCwgKm47CisJc3RydWN0IHNrX2J1ZmZfaGVhZCB0bXA7CiAJYm9vbCBlbmRfb2Zfc2ticzsKIAogCS8qIEZpcnN0LCBjaGVjayB0aGF0IHF1ZXVlIGlzIGNvbGxhcHNpYmxlIGFuZCBmaW5kCi0JICogdGhlIHBvaW50IHdoZXJlIGNvbGxhcHNpbmcgY2FuIGJlIHVzZWZ1bC4gKi8KLQlza2IgPSBoZWFkOworCSAqIHRoZSBwb2ludCB3aGVyZSBjb2xsYXBzaW5nIGNhbiBiZSB1c2VmdWwuCisJICovCiByZXN0YXJ0OgotCWVuZF9vZl9za2JzID0gdHJ1ZTsKLQlza2JfcXVldWVfd2Fsa19mcm9tX3NhZmUobGlzdCwgc2tiLCBuKSB7Ci0JCWlmIChza2IgPT0gdGFpbCkKLQkJCWJyZWFrOworCWZvciAoZW5kX29mX3NrYnMgPSB0cnVlOyBza2IgIT0gTlVMTCAmJiBza2IgIT0gdGFpbDsgc2tiID0gbikgeworCQluID0gdGNwX3NrYl9uZXh0KHNrYiwgbGlzdCk7CisKIAkJLyogTm8gbmV3IGJpdHM/IEl0IGlzIHBvc3NpYmxlIG9uIG9mbyBxdWV1ZS4gKi8KIAkJaWYgKCFiZWZvcmUoc3RhcnQsIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSkpIHsKLQkJCXNrYiA9IHRjcF9jb2xsYXBzZV9vbmUoc2ssIHNrYiwgbGlzdCk7CisJCQlza2IgPSB0Y3BfY29sbGFwc2Vfb25lKHNrLCBza2IsIGxpc3QsIHJvb3QpOwogCQkJaWYgKCFza2IpCiAJCQkJYnJlYWs7CiAJCQlnb3RvIHJlc3RhcnQ7CkBAIC00NzczLDEzICs0ODE2LDEwIEBACiAJCQlicmVhazsKIAkJfQogCi0JCWlmICghc2tiX3F1ZXVlX2lzX2xhc3QobGlzdCwgc2tiKSkgewotCQkJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBza2JfcXVldWVfbmV4dChsaXN0LCBza2IpOwotCQkJaWYgKG5leHQgIT0gdGFpbCAmJgotCQkJICAgIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSAhPSBUQ1BfU0tCX0NCKG5leHQpLT5zZXEpIHsKLQkJCQllbmRfb2Zfc2ticyA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQorCQlpZiAobiAmJiBuICE9IHRhaWwgJiYKKwkJICAgIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSAhPSBUQ1BfU0tCX0NCKG4pLT5zZXEpIHsKKwkJCWVuZF9vZl9za2JzID0gZmFsc2U7CisJCQlicmVhazsKIAkJfQogCiAJCS8qIERlY2lkZWQgdG8gc2tpcCB0aGlzLCBhZHZhbmNlIHN0YXJ0IHNlcS4gKi8KQEAgLTQ3ODksMTcgKzQ4MjksMjIgQEAKIAkgICAgKFRDUF9TS0JfQ0Ioc2tiKS0+dGNwX2ZsYWdzICYgKFRDUEhEUl9TWU4gfCBUQ1BIRFJfRklOKSkpCiAJCXJldHVybjsKIAorCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdG1wKTsKKwogCXdoaWxlIChiZWZvcmUoc3RhcnQsIGVuZCkpIHsKIAkJaW50IGNvcHkgPSBtaW5fdChpbnQsIFNLQl9NQVhfT1JERVIoMCwgMCksIGVuZCAtIHN0YXJ0KTsKIAkJc3RydWN0IHNrX2J1ZmYgKm5za2I7CiAKIAkJbnNrYiA9IGFsbG9jX3NrYihjb3B5LCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFuc2tiKQotCQkJcmV0dXJuOworCQkJYnJlYWs7CiAKIAkJbWVtY3B5KG5za2ItPmNiLCBza2ItPmNiLCBzaXplb2Yoc2tiLT5jYikpOwogCQlUQ1BfU0tCX0NCKG5za2IpLT5zZXEgPSBUQ1BfU0tCX0NCKG5za2IpLT5lbmRfc2VxID0gc3RhcnQ7Ci0JCV9fc2tiX3F1ZXVlX2JlZm9yZShsaXN0LCBza2IsIG5za2IpOworCQlpZiAobGlzdCkKKwkJCV9fc2tiX3F1ZXVlX2JlZm9yZShsaXN0LCBza2IsIG5za2IpOworCQllbHNlCisJCQlfX3NrYl9xdWV1ZV90YWlsKCZ0bXAsIG5za2IpOyAvKiBkZWZlciByYnRyZWUgaW5zZXJ0aW9uICovCiAJCXNrYl9zZXRfb3duZXJfcihuc2tiLCBzayk7CiAKIAkJLyogQ29weSBkYXRhLCByZWxlYXNpbmcgY29sbGFwc2VkIHNrYnMuICovCkBAIC00ODE3LDE0ICs0ODYyLDE3IEBACiAJCQkJc3RhcnQgKz0gc2l6ZTsKIAkJCX0KIAkJCWlmICghYmVmb3JlKHN0YXJ0LCBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEpKSB7Ci0JCQkJc2tiID0gdGNwX2NvbGxhcHNlX29uZShzaywgc2tiLCBsaXN0KTsKKwkJCQlza2IgPSB0Y3BfY29sbGFwc2Vfb25lKHNrLCBza2IsIGxpc3QsIHJvb3QpOwogCQkJCWlmICghc2tiIHx8CiAJCQkJICAgIHNrYiA9PSB0YWlsIHx8CiAJCQkJICAgIChUQ1BfU0tCX0NCKHNrYiktPnRjcF9mbGFncyAmIChUQ1BIRFJfU1lOIHwgVENQSERSX0ZJTikpKQotCQkJCQlyZXR1cm47CisJCQkJCWdvdG8gZW5kOwogCQkJfQogCQl9CiAJfQorZW5kOgorCXNrYl9xdWV1ZV93YWxrX3NhZmUoJnRtcCwgc2tiLCBuKQorCQl0Y3BfcmJ0cmVlX2luc2VydChyb290LCBza2IpOwogfQogCiAvKiBDb2xsYXBzZSBvZm8gcXVldWUuIEFsZ29yaXRobTogc2VsZWN0IGNvbnRpZ3VvdXMgc2VxdWVuY2Ugb2Ygc2ticwpAQCAtNDgzMyw3MCArNDg4MSw4NiBAQAogc3RhdGljIHZvaWQgdGNwX2NvbGxhcHNlX29mb19xdWV1ZShzdHJ1Y3Qgc29jayAqc2spCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrYl9wZWVrKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqaGVhZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqaGVhZDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcDsKIAl1MzIgc3RhcnQsIGVuZDsKIAotCWlmICghc2tiKQorCXAgPSByYl9maXJzdCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CisJc2tiID0gcmJfZW50cnlfc2FmZShwLCBzdHJ1Y3Qgc2tfYnVmZiwgcmJub2RlKTsKK25ld19yYW5nZToKKwlpZiAoIXNrYikgeworCQlwID0gcmJfbGFzdCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CisJCS8qIE5vdGU6IFRoaXMgaXMgcG9zc2libGUgcCBpcyBOVUxMIGhlcmUuIFdlIGRvIG5vdAorCQkgKiB1c2UgcmJfZW50cnlfc2FmZSgpLCBhcyBvb29fbGFzdF9za2IgaXMgdmFsaWQgb25seQorCQkgKiBpZiByYnRyZWUgaXMgbm90IGVtcHR5LgorCQkgKi8KKwkJdHAtPm9vb19sYXN0X3NrYiA9IHJiX2VudHJ5KHAsIHN0cnVjdCBza19idWZmLCByYm5vZGUpOwogCQlyZXR1cm47Ci0KKwl9CiAJc3RhcnQgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKIAllbmQgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7Ci0JaGVhZCA9IHNrYjsKIAotCWZvciAoOzspIHsKLQkJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBOVUxMOworCWZvciAoaGVhZCA9IHNrYjs7KSB7CisJCXNrYiA9IHRjcF9za2JfbmV4dChza2IsIE5VTEwpOwogCi0JCWlmICghc2tiX3F1ZXVlX2lzX2xhc3QoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsIHNrYikpCi0JCQluZXh0ID0gc2tiX3F1ZXVlX25leHQoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsIHNrYik7Ci0JCXNrYiA9IG5leHQ7Ci0KLQkJLyogU2VnbWVudCBpcyB0ZXJtaW5hdGVkIHdoZW4gd2Ugc2VlIGdhcCBvciB3aGVuCi0JCSAqIHdlIGFyZSBhdCB0aGUgZW5kIG9mIGFsbCB0aGUgcXVldWUuICovCisJCS8qIFJhbmdlIGlzIHRlcm1pbmF0ZWQgd2hlbiB3ZSBzZWUgYSBnYXAgb3Igd2hlbgorCQkgKiB3ZSBhcmUgYXQgdGhlIHF1ZXVlIGVuZC4KKwkJICovCiAJCWlmICghc2tiIHx8CiAJCSAgICBhZnRlcihUQ1BfU0tCX0NCKHNrYiktPnNlcSwgZW5kKSB8fAogCQkgICAgYmVmb3JlKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSwgc3RhcnQpKSB7Ci0JCQl0Y3BfY29sbGFwc2Uoc2ssICZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlLAorCQkJdGNwX2NvbGxhcHNlKHNrLCBOVUxMLCAmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSwKIAkJCQkgICAgIGhlYWQsIHNrYiwgc3RhcnQsIGVuZCk7Ci0JCQloZWFkID0gc2tiOwotCQkJaWYgKCFza2IpCi0JCQkJYnJlYWs7Ci0JCQkvKiBTdGFydCBuZXcgc2VnbWVudCAqLwotCQkJc3RhcnQgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKLQkJCWVuZCA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKLQkJfSBlbHNlIHsKLQkJCWlmIChiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsIHN0YXJ0KSkKLQkJCQlzdGFydCA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOwotCQkJaWYgKGFmdGVyKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSwgZW5kKSkKLQkJCQllbmQgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CisJCQlnb3RvIG5ld19yYW5nZTsKIAkJfQorCisJCWlmICh1bmxpa2VseShiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsIHN0YXJ0KSkpCisJCQlzdGFydCA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOworCQlpZiAoYWZ0ZXIoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxLCBlbmQpKQorCQkJZW5kID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOwogCX0KIH0KIAogLyoKLSAqIFB1cmdlIHRoZSBvdXQtb2Ytb3JkZXIgcXVldWUuCi0gKiBSZXR1cm4gdHJ1ZSBpZiBxdWV1ZSB3YXMgcHJ1bmVkLgorICogQ2xlYW4gdGhlIG91dC1vZi1vcmRlciBxdWV1ZSB0byBtYWtlIHJvb20uCisgKiBXZSBkcm9wIGhpZ2ggc2VxdWVuY2VzIHBhY2tldHMgdG8gOgorICogMSkgTGV0IGEgY2hhbmNlIGZvciBob2xlcyB0byBiZSBmaWxsZWQuCisgKiAyKSBub3QgYWRkIHRvbyBiaWcgbGF0ZW5jaWVzIGlmIHRob3VzYW5kcyBvZiBwYWNrZXRzIHNpdCB0aGVyZS4KKyAqICAgIChCdXQgaWYgYXBwbGljYXRpb24gc2hyaW5rcyBTT19SQ1ZCVUYsIHdlIGNvdWxkIHN0aWxsIGVuZCB1cAorICogICAgIGZyZWVpbmcgd2hvbGUgcXVldWUgaGVyZSkKKyAqCisgKiBSZXR1cm4gdHJ1ZSBpZiBxdWV1ZSBoYXMgc2hydW5rLgogICovCiBzdGF0aWMgYm9vbCB0Y3BfcHJ1bmVfb2ZvX3F1ZXVlKHN0cnVjdCBzb2NrICpzaykKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKLQlib29sIHJlcyA9IGZhbHNlOworCXN0cnVjdCByYl9ub2RlICpub2RlLCAqcHJldjsKIAotCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgewotCQlORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX09GT1BSVU5FRCk7Ci0JCV9fc2tiX3F1ZXVlX3B1cmdlKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKKwlpZiAoUkJfRU1QVFlfUk9PVCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpCisJCXJldHVybiBmYWxzZTsKIAotCQkvKiBSZXNldCBTQUNLIHN0YXRlLiAgQSBjb25mb3JtaW5nIFNBQ0sgaW1wbGVtZW50YXRpb24gd2lsbAotCQkgKiBkbyB0aGUgc2FtZSBhdCBhIHRpbWVvdXQgYmFzZWQgcmV0cmFuc21pdC4gIFdoZW4gYSBjb25uZWN0aW9uCi0JCSAqIGlzIGluIGEgc2FkIHN0YXRlIGxpa2UgdGhpcywgd2UgY2FyZSBvbmx5IGFib3V0IGludGVncml0eQotCQkgKiBvZiB0aGUgY29ubmVjdGlvbiBub3QgcGVyZm9ybWFuY2UuCi0JCSAqLwotCQlpZiAodHAtPnJ4X29wdC5zYWNrX29rKQotCQkJdGNwX3NhY2tfcmVzZXQoJnRwLT5yeF9vcHQpOworCU5FVF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBMSU5VWF9NSUJfT0ZPUFJVTkVEKTsKKwlub2RlID0gJnRwLT5vb29fbGFzdF9za2ItPnJibm9kZTsKKwlkbyB7CisJCXByZXYgPSByYl9wcmV2KG5vZGUpOworCQlyYl9lcmFzZShub2RlLCAmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CisJCXRjcF9kcm9wKHNrLCByYl9lbnRyeShub2RlLCBzdHJ1Y3Qgc2tfYnVmZiwgcmJub2RlKSk7CiAJCXNrX21lbV9yZWNsYWltKHNrKTsKLQkJcmVzID0gdHJ1ZTsKLQl9Ci0JcmV0dXJuIHJlczsKKwkJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPD0gc2stPnNrX3JjdmJ1ZiAmJgorCQkgICAgIXRjcF91bmRlcl9tZW1vcnlfcHJlc3N1cmUoc2spKQorCQkJYnJlYWs7CisJCW5vZGUgPSBwcmV2OworCX0gd2hpbGUgKG5vZGUpOworCXRwLT5vb29fbGFzdF9za2IgPSByYl9lbnRyeShwcmV2LCBzdHJ1Y3Qgc2tfYnVmZiwgcmJub2RlKTsKKworCS8qIFJlc2V0IFNBQ0sgc3RhdGUuICBBIGNvbmZvcm1pbmcgU0FDSyBpbXBsZW1lbnRhdGlvbiB3aWxsCisJICogZG8gdGhlIHNhbWUgYXQgYSB0aW1lb3V0IGJhc2VkIHJldHJhbnNtaXQuICBXaGVuIGEgY29ubmVjdGlvbgorCSAqIGlzIGluIGEgc2FkIHN0YXRlIGxpa2UgdGhpcywgd2UgY2FyZSBvbmx5IGFib3V0IGludGVncml0eQorCSAqIG9mIHRoZSBjb25uZWN0aW9uIG5vdCBwZXJmb3JtYW5jZS4KKwkgKi8KKwlpZiAodHAtPnJ4X29wdC5zYWNrX29rKQorCQl0Y3Bfc2Fja19yZXNldCgmdHAtPnJ4X29wdCk7CisJcmV0dXJuIHRydWU7CiB9CiAKIC8qIFJlZHVjZSBhbGxvY2F0ZWQgbWVtb3J5IGlmIHdlIGNhbiwgdHJ5aW5nIHRvIGdldApAQCAtNDkyMSw3ICs0OTg1LDcgQEAKIAogCXRjcF9jb2xsYXBzZV9vZm9fcXVldWUoc2spOwogCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpCi0JCXRjcF9jb2xsYXBzZShzaywgJnNrLT5za19yZWNlaXZlX3F1ZXVlLAorCQl0Y3BfY29sbGFwc2Uoc2ssICZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgTlVMTCwKIAkJCSAgICAgc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSwKIAkJCSAgICAgTlVMTCwKIAkJCSAgICAgdHAtPmNvcGllZF9zZXEsIHRwLT5yY3Zfbnh0KTsKQEAgLTUwMjYsNyArNTA5MCw3IEBACiAJICAgIC8qIFdlIEFDSyBlYWNoIGZyYW1lIG9yLi4uICovCiAJICAgIHRjcF9pbl9xdWlja2Fja19tb2RlKHNrKSB8fAogCSAgICAvKiBXZSBoYXZlIG91dCBvZiBvcmRlciBkYXRhLiAqLwotCSAgICAob2ZvX3Bvc3NpYmxlICYmIHNrYl9wZWVrKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkpIHsKKwkgICAgKG9mb19wb3NzaWJsZSAmJiAhUkJfRU1QVFlfUk9PVCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpKSB7CiAJCS8qIFRoZW4gYWNrIGl0IG5vdyAqLwogCQl0Y3Bfc2VuZF9hY2soc2spOwogCX0gZWxzZSB7CkBAIC01ODg1LDcgKzU5NDksNyBAQAogCQkgKiBzbyByZWxlYXNlIGl0LgogCQkgKi8KIAkJaWYgKHJlcSkgewotCQkJdHAtPnRvdGFsX3JldHJhbnMgPSByZXEtPm51bV9yZXRyYW5zOworCQkJaW5ldF9jc2soc2spLT5pY3NrX3JldHJhbnNtaXRzID0gMDsKIAkJCXJlcXNrX2Zhc3RvcGVuX3JlbW92ZShzaywgcmVxLCBmYWxzZSk7CiAJCX0gZWxzZSB7CiAJCQkvKiBNYWtlIHN1cmUgc29ja2V0IGlzIHJvdXRlZCwgZm9yIGNvcnJlY3QgbWV0cmljcy4gKi8KQEAgLTU5MjcsNyArNTk5MSw4IEBACiAJCX0gZWxzZQogCQkJdGNwX2luaXRfbWV0cmljcyhzayk7CiAKLQkJdGNwX3VwZGF0ZV9wYWNpbmdfcmF0ZShzayk7CisJCWlmICghaW5ldF9jc2soc2spLT5pY3NrX2NhX29wcy0+Y29uZ19jb250cm9sKQorCQkJdGNwX3VwZGF0ZV9wYWNpbmdfcmF0ZShzayk7CiAKIAkJLyogUHJldmVudCBzcHVyaW91cyB0Y3BfY3duZF9yZXN0YXJ0KCkgb24gZmlyc3QgZGF0YSBwYWNrZXQgKi8KIAkJdHAtPmxzbmR0aW1lID0gdGNwX3RpbWVfc3RhbXA7CkBAIC02MjYwLDYgKzYzMjUsNyBAQAogCiAJdG1wX29wdC50c3RhbXBfb2sgPSB0bXBfb3B0LnNhd190c3RhbXA7CiAJdGNwX29wZW5yZXFfaW5pdChyZXEsICZ0bXBfb3B0LCBza2IsIHNrKTsKKwlpbmV0X3JzayhyZXEpLT5ub19zcmNjaGVjayA9IGluZXRfc2soc2spLT50cmFuc3BhcmVudDsKIAogCS8qIE5vdGU6IHRjcF92Nl9pbml0X3JlcSgpIG1pZ2h0IG92ZXJyaWRlIGlyX2lpZiBmb3IgbGluayBsb2NhbHMgKi8KIAlpbmV0X3JzayhyZXEpLT5pcl9paWYgPSBpbmV0X3JlcXVlc3RfYm91bmRfZGV2X2lmKHNrLCBza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lwdjQuYyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKaW5kZXggMzJiMDQ4ZS4uN2FjMzdjMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lwdjQuYworKysgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCkBAIC04MTQsOCArODE0LDE0IEBACiAJdTMyIHNlcSA9IChzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgPyB0Y3BfcnNrKHJlcSktPnNudF9pc24gKyAxIDoKIAkJCQkJICAgICB0Y3Bfc2soc2spLT5zbmRfbnh0OwogCisJLyogUkZDIDczMjMgMi4zCisJICogVGhlIHdpbmRvdyBmaWVsZCAoU0VHLldORCkgb2YgZXZlcnkgb3V0Z29pbmcgc2VnbWVudCwgd2l0aCB0aGUKKwkgKiBleGNlcHRpb24gb2YgPFNZTj4gc2VnbWVudHMsIE1VU1QgYmUgcmlnaHQtc2hpZnRlZCBieQorCSAqIFJjdi5XaW5kLlNoaWZ0IGJpdHM6CisJICovCiAJdGNwX3Y0X3NlbmRfYWNrKHNvY2tfbmV0KHNrKSwgc2tiLCBzZXEsCi0JCQl0Y3BfcnNrKHJlcSktPnJjdl9ueHQsIHJlcS0+cnNrX3Jjdl93bmQsCisJCQl0Y3BfcnNrKHJlcSktPnJjdl9ueHQsCisJCQlyZXEtPnJza19yY3Zfd25kID4+IGluZXRfcnNrKHJlcSktPnJjdl93c2NhbGUsCiAJCQl0Y3BfdGltZV9zdGFtcCwKIAkJCXJlcS0+dHNfcmVjZW50LAogCQkJMCwKQEAgLTExNjksNiArMTE3NSw3IEBACiAJCQkJICAgICAgTlVMTCwgc2tiKTsKIAogCWlmIChnZW5oYXNoIHx8IG1lbWNtcChoYXNoX2xvY2F0aW9uLCBuZXdoYXNoLCAxNikgIT0gMCkgeworCQlORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUE1ENUZBSUxVUkUpOwogCQluZXRfaW5mb19yYXRlbGltaXRlZCgiTUQ1IEhhc2ggZmFpbGVkIGZvciAoJXBJNCwgJWQpLT4oJXBJNCwgJWQpJXNcbiIsCiAJCQkJICAgICAmaXBoLT5zYWRkciwgbnRvaHModGgtPnNvdXJjZSksCiAJCQkJICAgICAmaXBoLT5kYWRkciwgbnRvaHModGgtPmRlc3QpLApAQCAtMTE4OSw3ICsxMTk2LDYgQEAKIAogCXNrX3Jjdl9zYWRkcl9zZXQocmVxX3RvX3NrKHJlcSksIGlwX2hkcihza2IpLT5kYWRkcik7CiAJc2tfZGFkZHJfc2V0KHJlcV90b19zayhyZXEpLCBpcF9oZHIoc2tiKS0+c2FkZHIpOwotCWlyZXEtPm5vX3NyY2NoZWNrID0gaW5ldF9zayhza19saXN0ZW5lciktPnRyYW5zcGFyZW50OwogCWlyZXEtPm9wdCA9IHRjcF92NF9zYXZlX29wdGlvbnMoc2tiKTsKIH0KIApAQCAtMTUzMSw2ICsxNTM3LDM0IEBACiB9CiBFWFBPUlRfU1lNQk9MKHRjcF9wcmVxdWV1ZSk7CiAKK2Jvb2wgdGNwX2FkZF9iYWNrbG9nKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MzIgbGltaXQgPSBzay0+c2tfcmN2YnVmICsgc2stPnNrX3NuZGJ1ZjsKKworCS8qIE9ubHkgc29ja2V0IG93bmVyIGNhbiB0cnkgdG8gY29sbGFwc2UvcHJ1bmUgcnggcXVldWVzCisJICogdG8gcmVkdWNlIG1lbW9yeSBvdmVyaGVhZCwgc28gYWRkIGEgbGl0dGxlIGhlYWRyb29tIGhlcmUuCisJICogRmV3IHNvY2tldHMgYmFja2xvZyBhcmUgcG9zc2libHkgY29uY3VycmVudGx5IG5vbiBlbXB0eS4KKwkgKi8KKwlsaW1pdCArPSA2NCoxMDI0OworCisJLyogSW4gY2FzZSBhbGwgZGF0YSB3YXMgcHVsbGVkIGZyb20gc2tiIGZyYWdzIChpbiBfX3Bza2JfcHVsbF90YWlsKCkpLAorCSAqIHdlIGNhbiBmaXggc2tiLT50cnVlc2l6ZSB0byBpdHMgcmVhbCB2YWx1ZSB0byBhdm9pZCBmdXR1cmUgZHJvcHMuCisJICogVGhpcyBpcyB2YWxpZCBiZWNhdXNlIHNrYiBpcyBub3QgeWV0IGNoYXJnZWQgdG8gdGhlIHNvY2tldC4KKwkgKiBJdCBoYXMgYmVlbiBub3RpY2VkIHB1cmUgU0FDSyBwYWNrZXRzIHdlcmUgc29tZXRpbWVzIGRyb3BwZWQKKwkgKiAoaWYgY29va2VkIGJ5IGRyaXZlcnMgd2l0aG91dCBjb3B5YnJlYWsgZmVhdHVyZSkuCisJICovCisJaWYgKCFza2ItPmRhdGFfbGVuKQorCQlza2ItPnRydWVzaXplID0gU0tCX1RSVUVTSVpFKHNrYl9lbmRfb2Zmc2V0KHNrYikpOworCisJaWYgKHVubGlrZWx5KHNrX2FkZF9iYWNrbG9nKHNrLCBza2IsIGxpbWl0KSkpIHsKKwkJYmhfdW5sb2NrX3NvY2soc2spOworCQlfX05FVF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBMSU5VWF9NSUJfVENQQkFDS0xPR0RST1ApOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorRVhQT1JUX1NZTUJPTCh0Y3BfYWRkX2JhY2tsb2cpOworCiAvKgogICoJRnJvbSB0Y3BfaW5wdXQuYwogICovCkBAIC0xNjAyLDYgKzE2MzYsNyBAQAogCiAJCXNrID0gcmVxLT5yc2tfbGlzdGVuZXI7CiAJCWlmICh1bmxpa2VseSh0Y3BfdjRfaW5ib3VuZF9tZDVfaGFzaChzaywgc2tiKSkpIHsKKwkJCXNrX2Ryb3BzX2FkZChzaywgc2tiKTsKIAkJCXJlcXNrX3B1dChyZXEpOwogCQkJZ290byBkaXNjYXJkX2l0OwogCQl9CkBAIC0xNjYwLDEwICsxNjk1LDcgQEAKIAlpZiAoIXNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKIAkJaWYgKCF0Y3BfcHJlcXVldWUoc2ssIHNrYikpCiAJCQlyZXQgPSB0Y3BfdjRfZG9fcmN2KHNrLCBza2IpOwotCX0gZWxzZSBpZiAodW5saWtlbHkoc2tfYWRkX2JhY2tsb2coc2ssIHNrYiwKLQkJCQkJICAgc2stPnNrX3JjdmJ1ZiArIHNrLT5za19zbmRidWYpKSkgewotCQliaF91bmxvY2tfc29jayhzayk7Ci0JCV9fTkVUX0lOQ19TVEFUUyhuZXQsIExJTlVYX01JQl9UQ1BCQUNLTE9HRFJPUCk7CisJfSBlbHNlIGlmICh0Y3BfYWRkX2JhY2tsb2coc2ssIHNrYikpIHsKIAkJZ290byBkaXNjYXJkX2FuZF9yZWxzZTsKIAl9CiAJYmhfdW5sb2NrX3NvY2soc2spOwpAQCAtMTgxMiw3ICsxODQ0LDcgQEAKIAl0Y3Bfd3JpdGVfcXVldWVfcHVyZ2Uoc2spOwogCiAJLyogQ2xlYW5zIHVwIG91ciwgaG9wZWZ1bGx5IGVtcHR5LCBvdXRfb2Zfb3JkZXJfcXVldWUuICovCi0JX19za2JfcXVldWVfcHVyZ2UoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOworCXNrYl9yYnRyZWVfcHVyZ2UoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOwogCiAjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKIAkvKiBDbGVhbiB1cCB0aGUgTUQ1IGtleSBsaXN0LCBpZiBhbnkgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9tZXRyaWNzLmMgYi9uZXQvaXB2NC90Y3BfbWV0cmljcy5jCmluZGV4IGI2MTc4MjYuLmJmMWYzYjIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9tZXRyaWNzLmMKKysrIGIvbmV0L2lwdjQvdGNwX21ldHJpY3MuYwpAQCAtNzUxLDcgKzc1MSw3IEBACiAJLm5ldG5zb2sJPSB0cnVlLAogfTsKIAotc3RhdGljIHN0cnVjdCBubGFfcG9saWN5IHRjcF9tZXRyaWNzX25sX3BvbGljeVtUQ1BfTUVUUklDU19BVFRSX01BWCArIDFdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHRjcF9tZXRyaWNzX25sX3BvbGljeVtUQ1BfTUVUUklDU19BVFRSX01BWCArIDFdID0gewogCVtUQ1BfTUVUUklDU19BVFRSX0FERFJfSVBWNF0JPSB7IC50eXBlID0gTkxBX1UzMiwgfSwKIAlbVENQX01FVFJJQ1NfQVRUUl9BRERSX0lQVjZdCT0geyAudHlwZSA9IE5MQV9CSU5BUlksCiAJCQkJCSAgICAubGVuID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksIH0sCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMgYi9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMKaW5kZXggNGI5NWVjNC4uNjIzNGViYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jCisrKyBiL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAKIAkJbmV3dHAtPnNydHRfdXMgPSAwOwogCQluZXd0cC0+bWRldl91cyA9IGppZmZpZXNfdG9fdXNlY3MoVENQX1RJTUVPVVRfSU5JVCk7Ci0JCW5ld3RwLT5ydHRfbWluWzBdLnJ0dCA9IH4wVTsKKwkJbWlubWF4X3Jlc2V0KCZuZXd0cC0+cnR0X21pbiwgdGNwX3RpbWVfc3RhbXAsIH4wVSk7CiAJCW5ld2ljc2stPmljc2tfcnRvID0gVENQX1RJTUVPVVRfSU5JVDsKIAogCQluZXd0cC0+cGFja2V0c19vdXQgPSAwOwpAQCAtNDg3LDggKzQ4NywxMCBAQAogCQluZXd0cC0+c25kX2N3bmQgPSBUQ1BfSU5JVF9DV05EOwogCQluZXd0cC0+c25kX2N3bmRfY250ID0gMDsKIAorCQkvKiBUaGVyZSdzIGEgYnViYmxlIGluIHRoZSBwaXBlIHVudGlsIGF0IGxlYXN0IHRoZSBmaXJzdCBBQ0suICovCisJCW5ld3RwLT5hcHBfbGltaXRlZCA9IH4wVTsKKwogCQl0Y3BfaW5pdF94bWl0X3RpbWVycyhuZXdzayk7Ci0JCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbmV3dHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CiAJCW5ld3RwLT53cml0ZV9zZXEgPSBuZXd0cC0+cHVzaGVkX3NlcSA9IHRyZXEtPnNudF9pc24gKyAxOwogCiAJCW5ld3RwLT5yeF9vcHQuc2F3X3RzdGFtcCA9IDA7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3Bfb2ZmbG9hZC5jIGIvbmV0L2lwdjQvdGNwX29mZmxvYWQuYwppbmRleCA1YzU5NjQ5Li5iYzY4ZGEzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3Bfb2ZmbG9hZC5jCisrKyBiL25ldC9pcHY0L3RjcF9vZmZsb2FkLmMKQEAgLTkwLDEyICs5MCw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCS8qIEdTTyBwYXJ0aWFsIG9ubHkgcmVxdWlyZXMgc3BsaXR0aW5nIHRoZSBmcmFtZSBpbnRvIGFuIE1TUwotCSAqIG11bHRpcGxlIGFuZCBwb3NzaWJseSBhIHJlbWFpbmRlci4gIFNvIHVwZGF0ZSB0aGUgbXNzIG5vdy4KLQkgKi8KLQlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX0dTT19QQVJUSUFMKQotCQltc3MgPSBza2ItPmxlbiAtIChza2ItPmxlbiAlIG1zcyk7Ci0KIAljb3B5X2Rlc3RydWN0b3IgPSBnc29fc2tiLT5kZXN0cnVjdG9yID09IHRjcF93ZnJlZTsKIAlvb29fb2theSA9IGdzb19za2ItPm9vb19va2F5OwogCS8qIEFsbCBzZWdtZW50cyBidXQgdGhlIGZpcnN0IHNob3VsZCBoYXZlIG9vb19va2F5IGNsZWFyZWQgKi8KQEAgLTEwOCw2ICsxMDIsMTMgQEAKIAkvKiBPbmx5IGZpcnN0IHNlZ21lbnQgbWlnaHQgaGF2ZSBvb29fb2theSBzZXQgKi8KIAlzZWdzLT5vb29fb2theSA9IG9vb19va2F5OwogCisJLyogR1NPIHBhcnRpYWwgYW5kIGZyYWdfbGlzdCBzZWdtZW50YXRpb24gb25seSByZXF1aXJlcyBzcGxpdHRpbmcKKwkgKiB0aGUgZnJhbWUgaW50byBhbiBNU1MgbXVsdGlwbGUgYW5kIHBvc3NpYmx5IGEgcmVtYWluZGVyLCBib3RoCisJICogY2FzZXMgcmV0dXJuIGEgR1NPIHNrYi4gU28gdXBkYXRlIHRoZSBtc3Mgbm93LgorCSAqLworCWlmIChza2JfaXNfZ3NvKHNlZ3MpKQorCQltc3MgKj0gc2tiX3NoaW5mbyhzZWdzKS0+Z3NvX3NlZ3M7CisKIAlkZWx0YSA9IGh0b25sKG9sZGxlbiArICh0aGxlbiArIG1zcykpOwogCiAJc2tiID0gc2VnczsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9vdXRwdXQuYyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwppbmRleCBiZGFlZjdmLi44OTZlOWRmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX291dHB1dC5jCkBAIC03MzQsOSArNzM0LDE2IEBACiB7CiAJaWYgKCgxIDw8IHNrLT5za19zdGF0ZSkgJgogCSAgICAoVENQRl9FU1RBQkxJU0hFRCB8IFRDUEZfRklOX1dBSVQxIHwgVENQRl9DTE9TSU5HIHwKLQkgICAgIFRDUEZfQ0xPU0VfV0FJVCAgfCBUQ1BGX0xBU1RfQUNLKSkKLQkJdGNwX3dyaXRlX3htaXQoc2ssIHRjcF9jdXJyZW50X21zcyhzayksIHRjcF9zayhzayktPm5vbmFnbGUsCisJICAgICBUQ1BGX0NMT1NFX1dBSVQgIHwgVENQRl9MQVNUX0FDSykpIHsKKwkJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKKwkJaWYgKHRwLT5sb3N0X291dCA+IHRwLT5yZXRyYW5zX291dCAmJgorCQkgICAgdHAtPnNuZF9jd25kID4gdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSkKKwkJCXRjcF94bWl0X3JldHJhbnNtaXRfcXVldWUoc2spOworCisJCXRjcF93cml0ZV94bWl0KHNrLCB0Y3BfY3VycmVudF9tc3Moc2spLCB0cC0+bm9uYWdsZSwKIAkJCSAgICAgICAwLCBHRlBfQVRPTUlDKTsKKwl9CiB9CiAvKgogICogT25lIHRhc2tsZXQgcGVyIGNwdSB0cmllcyB0byBzZW5kIG1vcmUgc2ticy4KQEAgLTkxOCw2ICs5MjUsNyBAQAogCQlza2JfbXN0YW1wX2dldCgmc2tiLT5za2JfbXN0YW1wKTsKIAkJVENQX1NLQl9DQihza2IpLT50eC5pbl9mbGlnaHQgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEKIAkJCS0gdHAtPnNuZF91bmE7CisJCXRjcF9yYXRlX3NrYl9zZW50KHNrLCBza2IpOwogCiAJCWlmICh1bmxpa2VseShza2JfY2xvbmVkKHNrYikpKQogCQkJc2tiID0gcHNrYl9jb3B5KHNrYiwgZ2ZwX21hc2spOwpAQCAtMTIxMyw2ICsxMjIxLDkgQEAKIAl0Y3Bfc2V0X3NrYl90c29fc2Vncyhza2IsIG1zc19ub3cpOwogCXRjcF9zZXRfc2tiX3Rzb19zZWdzKGJ1ZmYsIG1zc19ub3cpOwogCisJLyogVXBkYXRlIGRlbGl2ZXJlZCBpbmZvIGZvciB0aGUgbmV3IHNlZ21lbnQgKi8KKwlUQ1BfU0tCX0NCKGJ1ZmYpLT50eCA9IFRDUF9TS0JfQ0Ioc2tiKS0+dHg7CisKIAkvKiBJZiB0aGlzIHBhY2tldCBoYXMgYmVlbiBzZW50IG91dCBhbHJlYWR5LCB3ZSBtdXN0CiAJICogYWRqdXN0IHRoZSB2YXJpb3VzIHBhY2tldCBjb3VudGVycy4KIAkgKi8KQEAgLTEzNTgsNiArMTM2OSw3IEBACiAJfQogCXJldHVybiBtdHU7CiB9CitFWFBPUlRfU1lNQk9MKHRjcF9tc3NfdG9fbXR1KTsKIAogLyogTVRVIHByb2JpbmcgaW5pdCBwZXIgc29ja2V0ICovCiB2b2lkIHRjcF9tdHVwX2luaXQoc3RydWN0IHNvY2sgKnNrKQpAQCAtMTU0NSw3ICsxNTU3LDggQEAKIC8qIFJldHVybiBob3cgbWFueSBzZWdzIHdlJ2QgbGlrZSBvbiBhIFRTTyBwYWNrZXQsCiAgKiB0byBzZW5kIG9uZSBUU08gcGFja2V0IHBlciBtcwogICovCi1zdGF0aWMgdTMyIHRjcF90c29fYXV0b3NpemUoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgbXNzX25vdykKK3UzMiB0Y3BfdHNvX2F1dG9zaXplKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IG1zc19ub3csCisJCSAgICAgaW50IG1pbl90c29fc2VncykKIHsKIAl1MzIgYnl0ZXMsIHNlZ3M7CiAKQEAgLTE1NTcsMTAgKzE1NzAsMjMgQEAKIAkgKiBUaGlzIHByZXNlcnZlcyBBQ0sgY2xvY2tpbmcgYW5kIGlzIGNvbnNpc3RlbnQKIAkgKiB3aXRoIHRjcF90c29fc2hvdWxkX2RlZmVyKCkgaGV1cmlzdGljLgogCSAqLwotCXNlZ3MgPSBtYXhfdCh1MzIsIGJ5dGVzIC8gbXNzX25vdywgc3lzY3RsX3RjcF9taW5fdHNvX3NlZ3MpOworCXNlZ3MgPSBtYXhfdCh1MzIsIGJ5dGVzIC8gbXNzX25vdywgbWluX3Rzb19zZWdzKTsKIAogCXJldHVybiBtaW5fdCh1MzIsIHNlZ3MsIHNrLT5za19nc29fbWF4X3NlZ3MpOwogfQorRVhQT1JUX1NZTUJPTCh0Y3BfdHNvX2F1dG9zaXplKTsKKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMgd2Ugd2FudCBpbiB0aGUgc2tiIHdlIGFyZSB0cmFuc21pdHRpbmcuCisgKiBTZWUgaWYgY29uZ2VzdGlvbiBjb250cm9sIG1vZHVsZSB3YW50cyB0byBkZWNpZGU7IG90aGVyd2lzZSwgYXV0b3NpemUuCisgKi8KK3N0YXRpYyB1MzIgdGNwX3Rzb19zZWdzKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IG1zc19ub3cpCit7CisJY29uc3Qgc3RydWN0IHRjcF9jb25nZXN0aW9uX29wcyAqY2Ffb3BzID0gaW5ldF9jc2soc2spLT5pY3NrX2NhX29wczsKKwl1MzIgdHNvX3NlZ3MgPSBjYV9vcHMtPnRzb19zZWdzX2dvYWwgPyBjYV9vcHMtPnRzb19zZWdzX2dvYWwoc2spIDogMDsKKworCXJldHVybiB0c29fc2VncyA/IDoKKwkJdGNwX3Rzb19hdXRvc2l6ZShzaywgbXNzX25vdywgc3lzY3RsX3RjcF9taW5fdHNvX3NlZ3MpOworfQogCiAvKiBSZXR1cm5zIHRoZSBwb3J0aW9uIG9mIHNrYiB3aGljaCBjYW4gYmUgc2VudCByaWdodCBhd2F5ICovCiBzdGF0aWMgdW5zaWduZWQgaW50IHRjcF9tc3Nfc3BsaXRfcG9pbnQoY29uc3Qgc3RydWN0IHNvY2sgKnNrLApAQCAtMTk2NiwxMiArMTk5MiwxNCBAQAogCWxlbiA9IDA7CiAJdGNwX2Zvcl93cml0ZV9xdWV1ZV9mcm9tX3NhZmUoc2tiLCBuZXh0LCBzaykgewogCQljb3B5ID0gbWluX3QoaW50LCBza2ItPmxlbiwgcHJvYmVfc2l6ZSAtIGxlbik7Ci0JCWlmIChuc2tiLT5pcF9zdW1tZWQpCisJCWlmIChuc2tiLT5pcF9zdW1tZWQpIHsKIAkJCXNrYl9jb3B5X2JpdHMoc2tiLCAwLCBza2JfcHV0KG5za2IsIGNvcHkpLCBjb3B5KTsKLQkJZWxzZQotCQkJbnNrYi0+Y3N1bSA9IHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMoc2tiLCAwLAotCQkJCQkJCSAgICBza2JfcHV0KG5za2IsIGNvcHkpLAotCQkJCQkJCSAgICBjb3B5LCBuc2tiLT5jc3VtKTsKKwkJfSBlbHNlIHsKKwkJCV9fd3N1bSBjc3VtID0gc2tiX2NvcHlfYW5kX2NzdW1fYml0cyhza2IsIDAsCisJCQkJCQkJICAgICBza2JfcHV0KG5za2IsIGNvcHkpLAorCQkJCQkJCSAgICAgY29weSwgMCk7CisJCQluc2tiLT5jc3VtID0gY3N1bV9ibG9ja19hZGQobnNrYi0+Y3N1bSwgY3N1bSwgbGVuKTsKKwkJfQogCiAJCWlmIChza2ItPmxlbiA8PSBjb3B5KSB7CiAJCQkvKiBXZSd2ZSBlYXRlbiBhbGwgdGhlIGRhdGEgZnJvbSB0aGlzIHNrYi4KQEAgLTIwMjAsNiArMjA0OCwzOSBAQAogCXJldHVybiAtMTsKIH0KIAorLyogVENQIFNtYWxsIFF1ZXVlcyA6CisgKiBDb250cm9sIG51bWJlciBvZiBwYWNrZXRzIGluIHFkaXNjL2RldmljZXMgdG8gdHdvIHBhY2tldHMgLyBvciB+MSBtcy4KKyAqIChUaGVzZSBsaW1pdHMgYXJlIGRvdWJsZWQgZm9yIHJldHJhbnNtaXRzKQorICogVGhpcyBhbGxvd3MgZm9yIDoKKyAqICAtIGJldHRlciBSVFQgZXN0aW1hdGlvbiBhbmQgQUNLIHNjaGVkdWxpbmcKKyAqICAtIGZhc3RlciByZWNvdmVyeQorICogIC0gaGlnaCByYXRlcworICogQWxhcywgc29tZSBkcml2ZXJzIC8gc3Vic3lzdGVtcyByZXF1aXJlIGEgZmFpciBhbW91bnQKKyAqIG9mIHF1ZXVlZCBieXRlcyB0byBlbnN1cmUgbGluZSByYXRlLgorICogT25lIGV4YW1wbGUgaXMgd2lmaSBhZ2dyZWdhdGlvbiAoODAyLjExIEFNUERVKQorICovCitzdGF0aWMgYm9vbCB0Y3Bfc21hbGxfcXVldWVfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgdW5zaWduZWQgaW50IGZhY3RvcikKK3sKKwl1bnNpZ25lZCBpbnQgbGltaXQ7CisKKwlsaW1pdCA9IG1heCgyICogc2tiLT50cnVlc2l6ZSwgc2stPnNrX3BhY2luZ19yYXRlID4+IDEwKTsKKwlsaW1pdCA9IG1pbl90KHUzMiwgbGltaXQsIHN5c2N0bF90Y3BfbGltaXRfb3V0cHV0X2J5dGVzKTsKKwlsaW1pdCA8PD0gZmFjdG9yOworCisJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgPiBsaW1pdCkgeworCQlzZXRfYml0KFRTUV9USFJPVFRMRUQsICZ0Y3Bfc2soc2spLT50c3FfZmxhZ3MpOworCQkvKiBJdCBpcyBwb3NzaWJsZSBUWCBjb21wbGV0aW9uIGFscmVhZHkgaGFwcGVuZWQKKwkJICogYmVmb3JlIHdlIHNldCBUU1FfVEhST1RUTEVELCBzbyB3ZSBtdXN0CisJCSAqIHRlc3QgYWdhaW4gdGhlIGNvbmRpdGlvbi4KKwkJICovCisJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7CisJCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpID4gbGltaXQpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCiAvKiBUaGlzIHJvdXRpbmUgd3JpdGVzIHBhY2tldHMgdG8gdGhlIG5ldHdvcmsuICBJdCBhZHZhbmNlcyB0aGUKICAqIHNlbmRfaGVhZC4gIFRoaXMgaGFwcGVucyBhcyBpbmNvbWluZyBhY2tzIG9wZW4gdXAgdGhlIHJlbW90ZQogICogd2luZG93IGZvciB1cy4KQEAgLTIwNTcsNyArMjExOCw3IEBACiAJCX0KIAl9CiAKLQltYXhfc2VncyA9IHRjcF90c29fYXV0b3NpemUoc2ssIG1zc19ub3cpOworCW1heF9zZWdzID0gdGNwX3Rzb19zZWdzKHNrLCBtc3Nfbm93KTsKIAl3aGlsZSAoKHNrYiA9IHRjcF9zZW5kX2hlYWQoc2spKSkgewogCQl1bnNpZ25lZCBpbnQgbGltaXQ7CiAKQEAgLTIxMDYsMjkgKzIxNjcsOCBAQAogCQkgICAgdW5saWtlbHkodHNvX2ZyYWdtZW50KHNrLCBza2IsIGxpbWl0LCBtc3Nfbm93LCBnZnApKSkKIAkJCWJyZWFrOwogCi0JCS8qIFRDUCBTbWFsbCBRdWV1ZXMgOgotCQkgKiBDb250cm9sIG51bWJlciBvZiBwYWNrZXRzIGluIHFkaXNjL2RldmljZXMgdG8gdHdvIHBhY2tldHMgLyBvciB+MSBtcy4KLQkJICogVGhpcyBhbGxvd3MgZm9yIDoKLQkJICogIC0gYmV0dGVyIFJUVCBlc3RpbWF0aW9uIGFuZCBBQ0sgc2NoZWR1bGluZwotCQkgKiAgLSBmYXN0ZXIgcmVjb3ZlcnkKLQkJICogIC0gaGlnaCByYXRlcwotCQkgKiBBbGFzLCBzb21lIGRyaXZlcnMgLyBzdWJzeXN0ZW1zIHJlcXVpcmUgYSBmYWlyIGFtb3VudAotCQkgKiBvZiBxdWV1ZWQgYnl0ZXMgdG8gZW5zdXJlIGxpbmUgcmF0ZS4KLQkJICogT25lIGV4YW1wbGUgaXMgd2lmaSBhZ2dyZWdhdGlvbiAoODAyLjExIEFNUERVKQotCQkgKi8KLQkJbGltaXQgPSBtYXgoMiAqIHNrYi0+dHJ1ZXNpemUsIHNrLT5za19wYWNpbmdfcmF0ZSA+PiAxMCk7Ci0JCWxpbWl0ID0gbWluX3QodTMyLCBsaW1pdCwgc3lzY3RsX3RjcF9saW1pdF9vdXRwdXRfYnl0ZXMpOwotCi0JCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpID4gbGltaXQpIHsKLQkJCXNldF9iaXQoVFNRX1RIUk9UVExFRCwgJnRwLT50c3FfZmxhZ3MpOwotCQkJLyogSXQgaXMgcG9zc2libGUgVFggY29tcGxldGlvbiBhbHJlYWR5IGhhcHBlbmVkCi0JCQkgKiBiZWZvcmUgd2Ugc2V0IFRTUV9USFJPVFRMRUQsIHNvIHdlIG11c3QKLQkJCSAqIHRlc3QgYWdhaW4gdGhlIGNvbmRpdGlvbi4KLQkJCSAqLwotCQkJc21wX21iX19hZnRlcl9hdG9taWMoKTsKLQkJCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpID4gbGltaXQpCi0JCQkJYnJlYWs7Ci0JCX0KKwkJaWYgKHRjcF9zbWFsbF9xdWV1ZV9jaGVjayhzaywgc2tiLCAwKSkKKwkJCWJyZWFrOwogCiAJCWlmICh1bmxpa2VseSh0Y3BfdHJhbnNtaXRfc2tiKHNrLCBza2IsIDEsIGdmcCkpKQogCQkJYnJlYWs7CkBAIC0yNjA1LDcgKzI2NDUsOCBAQAogCSAqIGNvcHlpbmcgb3ZlcmhlYWQ6IGZyYWdtZW50YXRpb24sIHR1bm5lbGluZywgbWFuZ2xpbmcgZXRjLgogCSAqLwogCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpID4KLQkgICAgbWluKHNrLT5za193bWVtX3F1ZXVlZCArIChzay0+c2tfd21lbV9xdWV1ZWQgPj4gMiksIHNrLT5za19zbmRidWYpKQorCSAgICBtaW5fdCh1MzIsIHNrLT5za193bWVtX3F1ZXVlZCArIChzay0+c2tfd21lbV9xdWV1ZWQgPj4gMiksCisJCSAgc2stPnNrX3NuZGJ1ZikpCiAJCXJldHVybiAtRUFHQUlOOwogCiAJaWYgKHNrYl9zdGlsbF9pbl9ob3N0X3F1ZXVlKHNrLCBza2IpKQpAQCAtMjc3NCw5ICsyODE1LDkgQEAKIAkJbGFzdF9sb3N0ID0gdHAtPnNuZF91bmE7CiAJfQogCi0JbWF4X3NlZ3MgPSB0Y3BfdHNvX2F1dG9zaXplKHNrLCB0Y3BfY3VycmVudF9tc3Moc2spKTsKKwltYXhfc2VncyA9IHRjcF90c29fc2VncyhzaywgdGNwX2N1cnJlbnRfbXNzKHNrKSk7CiAJdGNwX2Zvcl93cml0ZV9xdWV1ZV9mcm9tKHNrYiwgc2spIHsKLQkJX191OCBzYWNrZWQgPSBUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZDsKKwkJX191OCBzYWNrZWQ7CiAJCWludCBzZWdzOwogCiAJCWlmIChza2IgPT0gdGNwX3NlbmRfaGVhZChzaykpCkBAIC0yNzg4LDYgKzI4MjksNyBAQAogCQlzZWdzID0gdHAtPnNuZF9jd25kIC0gdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKTsKIAkJaWYgKHNlZ3MgPD0gMCkKIAkJCXJldHVybjsKKwkJc2Fja2VkID0gVENQX1NLQl9DQihza2IpLT5zYWNrZWQ7CiAJCS8qIEluIGNhc2UgdGNwX3NoaWZ0X3NrYl9kYXRhKCkgaGF2ZSBhZ2dyZWdhdGVkIGxhcmdlIHNrYnMsCiAJCSAqIHdlIG5lZWQgdG8gbWFrZSBzdXJlIG5vdCBzZW5kaW5nIHRvbyBiaWdzIFRTTyBwYWNrZXRzCiAJCSAqLwpAQCAtMjgyNywxMCArMjg2OSwxMyBAQAogCQlpZiAoc2Fja2VkICYgKFRDUENCX1NBQ0tFRF9BQ0tFRHxUQ1BDQl9TQUNLRURfUkVUUkFOUykpCiAJCQljb250aW51ZTsKIAorCQlpZiAodGNwX3NtYWxsX3F1ZXVlX2NoZWNrKHNrLCBza2IsIDEpKQorCQkJcmV0dXJuOworCiAJCWlmICh0Y3BfcmV0cmFuc21pdF9za2Ioc2ssIHNrYiwgc2VncykpCiAJCQlyZXR1cm47CiAKLQkJTkVUX0lOQ19TVEFUUyhzb2NrX25ldChzayksIG1pYl9pZHgpOworCQlORVRfQUREX1NUQVRTKHNvY2tfbmV0KHNrKSwgbWliX2lkeCwgdGNwX3NrYl9wY291bnQoc2tiKSk7CiAKIAkJaWYgKHRjcF9pbl9jd25kX3JlZHVjdGlvbihzaykpCiAJCQl0cC0+cHJyX291dCArPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwpAQCAtMzU2Nyw2ICszNjEyLDggQEAKIAlpZiAoIXJlcykgewogCQlfX1RDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBUQ1BfTUlCX1JFVFJBTlNTRUdTKTsKIAkJX19ORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUFNZTlJFVFJBTlMpOworCQlpZiAodW5saWtlbHkodGNwX3Bhc3NpdmVfZmFzdG9wZW4oc2spKSkKKwkJCXRjcF9zayhzayktPnRvdGFsX3JldHJhbnMrKzsKIAl9CiAJcmV0dXJuIHJlczsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9yYXRlLmMgYi9uZXQvaXB2NC90Y3BfcmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZTE1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC90Y3BfcmF0ZS5jCkBAIC0wLDAgKzEsMTg2IEBACisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisvKiBUaGUgYmFuZHdpZHRoIGVzdGltYXRvciBlc3RpbWF0ZXMgdGhlIHJhdGUgYXQgd2hpY2ggdGhlIG5ldHdvcmsKKyAqIGNhbiBjdXJyZW50bHkgZGVsaXZlciBvdXRib3VuZCBkYXRhIHBhY2tldHMgZm9yIHRoaXMgZmxvdy4gQXQgYSBoaWdoCisgKiBsZXZlbCwgaXQgb3BlcmF0ZXMgYnkgdGFraW5nIGEgZGVsaXZlcnkgcmF0ZSBzYW1wbGUgZm9yIGVhY2ggQUNLLgorICoKKyAqIEEgcmF0ZSBzYW1wbGUgcmVjb3JkcyB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgbmV0d29yayBkZWxpdmVyZWQgcGFja2V0cworICogZm9yIHRoaXMgZmxvdywgY2FsY3VsYXRlZCBvdmVyIHRoZSB0aW1lIGludGVydmFsIGJldHdlZW4gdGhlIHRyYW5zbWlzc2lvbgorICogb2YgYSBkYXRhIHBhY2tldCBhbmQgdGhlIGFja25vd2xlZGdtZW50IG9mIHRoYXQgcGFja2V0LgorICoKKyAqIFNwZWNpZmljYWxseSwgb3ZlciB0aGUgaW50ZXJ2YWwgYmV0d2VlbiBlYWNoIHRyYW5zbWl0IGFuZCBjb3JyZXNwb25kaW5nIEFDSywKKyAqIHRoZSBlc3RpbWF0b3IgZ2VuZXJhdGVzIGEgZGVsaXZlcnkgcmF0ZSBzYW1wbGUuIFR5cGljYWxseSBpdCB1c2VzIHRoZSByYXRlCisgKiBhdCB3aGljaCBwYWNrZXRzIHdlcmUgYWNrbm93bGVkZ2VkLiBIb3dldmVyLCB0aGUgYXBwcm9hY2ggb2YgdXNpbmcgb25seSB0aGUKKyAqIGFja25vd2xlZGdtZW50IHJhdGUgZmFjZXMgYSBjaGFsbGVuZ2UgdW5kZXIgdGhlIHByZXZhbGVudCBBQ0sgZGVjaW1hdGlvbiBvcgorICogY29tcHJlc3Npb246IHBhY2tldHMgY2FuIHRlbXBvcmFyaWx5IGFwcGVhciB0byBiZSBkZWxpdmVyZWQgbXVjaCBxdWlja2VyCisgKiB0aGFuIHRoZSBib3R0bGVuZWNrIHJhdGUuIFNpbmNlIGl0IGlzIHBoeXNpY2FsbHkgaW1wb3NzaWJsZSB0byBkbyB0aGF0IGluIGEKKyAqIHN1c3RhaW5lZCBmYXNoaW9uLCB3aGVuIHRoZSBlc3RpbWF0b3Igbm90aWNlcyB0aGF0IHRoZSBBQ0sgcmF0ZSBpcyBmYXN0ZXIKKyAqIHRoYW4gdGhlIHRyYW5zbWl0IHJhdGUsIGl0IHVzZXMgdGhlIGxhdHRlcjoKKyAqCisgKiAgICBzZW5kX3JhdGUgPSAjcGt0c19kZWxpdmVyZWQvKGxhc3Rfc25kX3RpbWUgLSBmaXJzdF9zbmRfdGltZSkKKyAqICAgIGFja19yYXRlICA9ICNwa3RzX2RlbGl2ZXJlZC8obGFzdF9hY2tfdGltZSAtIGZpcnN0X2Fja190aW1lKQorICogICAgYncgPSBtaW4oc2VuZF9yYXRlLCBhY2tfcmF0ZSkKKyAqCisgKiBOb3RpY2UgdGhlIGVzdGltYXRvciBlc3NlbnRpYWxseSBlc3RpbWF0ZXMgdGhlIGdvb2RwdXQsIG5vdCBhbHdheXMgdGhlCisgKiBuZXR3b3JrIGJvdHRsZW5lY2sgbGluayByYXRlIHdoZW4gdGhlIHNlbmRpbmcgb3IgcmVjZWl2aW5nIGlzIGxpbWl0ZWQgYnkKKyAqIG90aGVyIGZhY3RvcnMgbGlrZSBhcHBsaWNhdGlvbnMgb3IgcmVjZWl2ZXIgd2luZG93IGxpbWl0cy4gIFRoZSBlc3RpbWF0b3IKKyAqIGRlbGliZXJhdGVseSBhdm9pZHMgdXNpbmcgdGhlIGludGVyLXBhY2tldCBzcGFjaW5nIGFwcHJvYWNoIGJlY2F1c2UgdGhhdAorICogYXBwcm9hY2ggcmVxdWlyZXMgYSBsYXJnZSBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgc29waGlzdGljYXRlZCBmaWx0ZXJpbmcuCisgKgorICogVENQIGZsb3dzIGNhbiBvZnRlbiBiZSBhcHBsaWNhdGlvbi1saW1pdGVkIGluIHJlcXVlc3QvcmVzcG9uc2Ugd29ya2xvYWRzLgorICogVGhlIGVzdGltYXRvciBtYXJrcyBhIGJhbmR3aWR0aCBzYW1wbGUgYXMgYXBwbGljYXRpb24tbGltaXRlZCBpZiB0aGVyZQorICogd2FzIHNvbWUgbW9tZW50IGR1cmluZyB0aGUgc2FtcGxlZCB3aW5kb3cgb2YgcGFja2V0cyB3aGVuIHRoZXJlIHdhcyBubyBkYXRhCisgKiByZWFkeSB0byBzZW5kIGluIHRoZSB3cml0ZSBxdWV1ZS4KKyAqLworCisvKiBTbmFwc2hvdCB0aGUgY3VycmVudCBkZWxpdmVyeSBpbmZvcm1hdGlvbiBpbiB0aGUgc2tiLCB0byBnZW5lcmF0ZQorICogYSByYXRlIHNhbXBsZSBsYXRlciB3aGVuIHRoZSBza2IgaXMgKHMpYWNrZWQgaW4gdGNwX3JhdGVfc2tiX2RlbGl2ZXJlZCgpLgorICovCit2b2lkIHRjcF9yYXRlX3NrYl9zZW50KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKworCSAvKiBJbiBnZW5lcmFsIHdlIG5lZWQgdG8gc3RhcnQgZGVsaXZlcnkgcmF0ZSBzYW1wbGVzIGZyb20gdGhlCisJICAqIHRpbWUgd2UgcmVjZWl2ZWQgdGhlIG1vc3QgcmVjZW50IEFDSywgdG8gZW5zdXJlIHdlIGluY2x1ZGUKKwkgICogdGhlIGZ1bGwgdGltZSB0aGUgbmV0d29yayBuZWVkcyB0byBkZWxpdmVyIGFsbCBpbi1mbGlnaHQKKwkgICogcGFja2V0cy4gSWYgdGhlcmUgYXJlIG5vIHBhY2tldHMgaW4gZmxpZ2h0IHlldCwgdGhlbiB3ZQorCSAgKiBrbm93IHRoYXQgYW55IEFDS3MgYWZ0ZXIgbm93IGluZGljYXRlIHRoYXQgdGhlIG5ldHdvcmsgd2FzCisJICAqIGFibGUgdG8gZGVsaXZlciB0aG9zZSBwYWNrZXRzIGNvbXBsZXRlbHkgaW4gdGhlIHNhbXBsaW5nCisJICAqIGludGVydmFsIGJldHdlZW4gbm93IGFuZCB0aGUgbmV4dCBBQ0suCisJICAqCisJICAqIE5vdGUgdGhhdCB3ZSB1c2UgcGFja2V0c19vdXQgaW5zdGVhZCBvZiB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApCisJICAqIGJlY2F1c2UgdGhlIGxhdHRlciBpcyBhIGd1ZXNzIGJhc2VkIG9uIFJUTyBhbmQgbG9zcy1tYXJraW5nCisJICAqIGhldXJpc3RpY3MuIFdlIGRvbid0IHdhbnQgc3B1cmlvdXMgUlRPcyBvciBsb3NzIG1hcmtpbmdzIHRvIGNhdXNlCisJICAqIGEgc3B1cmlvdXNseSBzbWFsbCB0aW1lIGludGVydmFsLCBjYXVzaW5nIGEgc3B1cmlvdXNseSBoaWdoCisJICAqIGJhbmR3aWR0aCBlc3RpbWF0ZS4KKwkgICovCisJaWYgKCF0cC0+cGFja2V0c19vdXQpIHsKKwkJdHAtPmZpcnN0X3R4X21zdGFtcCAgPSBza2ItPnNrYl9tc3RhbXA7CisJCXRwLT5kZWxpdmVyZWRfbXN0YW1wID0gc2tiLT5za2JfbXN0YW1wOworCX0KKworCVRDUF9TS0JfQ0Ioc2tiKS0+dHguZmlyc3RfdHhfbXN0YW1wCT0gdHAtPmZpcnN0X3R4X21zdGFtcDsKKwlUQ1BfU0tCX0NCKHNrYiktPnR4LmRlbGl2ZXJlZF9tc3RhbXAJPSB0cC0+ZGVsaXZlcmVkX21zdGFtcDsKKwlUQ1BfU0tCX0NCKHNrYiktPnR4LmRlbGl2ZXJlZAkJPSB0cC0+ZGVsaXZlcmVkOworCVRDUF9TS0JfQ0Ioc2tiKS0+dHguaXNfYXBwX2xpbWl0ZWQJPSB0cC0+YXBwX2xpbWl0ZWQgPyAxIDogMDsKK30KKworLyogV2hlbiBhbiBza2IgaXMgc2Fja2VkIG9yIGFja2VkLCB3ZSBmaWxsIGluIHRoZSByYXRlIHNhbXBsZSB3aXRoIHRoZSAocHJpb3IpCisgKiBkZWxpdmVyeSBpbmZvcm1hdGlvbiB3aGVuIHRoZSBza2Igd2FzIGxhc3QgdHJhbnNtaXR0ZWQuCisgKgorICogSWYgYW4gQUNLIChzKWFja3MgbXVsdGlwbGUgc2ticyAoZS5nLiwgc3RyZXRjaGVkLWFja3MpLCB0aGlzIGZ1bmN0aW9uIGlzCisgKiBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFdlIGZhdm9yIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBtb3N0IHJlY2VudGx5CisgKiBzZW50IHNrYiwgaS5lLiwgdGhlIHNrYiB3aXRoIHRoZSBoaWdoZXN0IHByaW9yX2RlbGl2ZXJlZCBjb3VudC4KKyAqLwordm9pZCB0Y3BfcmF0ZV9za2JfZGVsaXZlcmVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICBzdHJ1Y3QgcmF0ZV9zYW1wbGUgKnJzKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCB0Y3Bfc2tiX2NiICpzY2IgPSBUQ1BfU0tCX0NCKHNrYik7CisKKwlpZiAoIXNjYi0+dHguZGVsaXZlcmVkX21zdGFtcC52NjQpCisJCXJldHVybjsKKworCWlmICghcnMtPnByaW9yX2RlbGl2ZXJlZCB8fAorCSAgICBhZnRlcihzY2ItPnR4LmRlbGl2ZXJlZCwgcnMtPnByaW9yX2RlbGl2ZXJlZCkpIHsKKwkJcnMtPnByaW9yX2RlbGl2ZXJlZCAgPSBzY2ItPnR4LmRlbGl2ZXJlZDsKKwkJcnMtPnByaW9yX21zdGFtcCAgICAgPSBzY2ItPnR4LmRlbGl2ZXJlZF9tc3RhbXA7CisJCXJzLT5pc19hcHBfbGltaXRlZCAgID0gc2NiLT50eC5pc19hcHBfbGltaXRlZDsKKwkJcnMtPmlzX3JldHJhbnMJICAgICA9IHNjYi0+c2Fja2VkICYgVENQQ0JfUkVUUkFOUzsKKworCQkvKiBGaW5kIHRoZSBkdXJhdGlvbiBvZiB0aGUgInNlbmQgcGhhc2UiIG9mIHRoaXMgd2luZG93OiAqLworCQlycy0+aW50ZXJ2YWxfdXMgICAgICA9IHNrYl9tc3RhbXBfdXNfZGVsdGEoCisJCQkJCQkmc2tiLT5za2JfbXN0YW1wLAorCQkJCQkJJnNjYi0+dHguZmlyc3RfdHhfbXN0YW1wKTsKKworCQkvKiBSZWNvcmQgc2VuZCB0aW1lIG9mIG1vc3QgcmVjZW50bHkgQUNLZWQgcGFja2V0OiAqLworCQl0cC0+Zmlyc3RfdHhfbXN0YW1wICA9IHNrYi0+c2tiX21zdGFtcDsKKwl9CisJLyogTWFyayBvZmYgdGhlIHNrYiBkZWxpdmVyZWQgb25jZSBpdCdzIHNhY2tlZCB0byBhdm9pZCBiZWluZworCSAqIHVzZWQgYWdhaW4gd2hlbiBpdCdzIGN1bXVsYXRpdmVseSBhY2tlZC4gRm9yIGFja2VkIHBhY2tldHMKKwkgKiB3ZSBkb24ndCBuZWVkIHRvIHJlc2V0IHNpbmNlIGl0J2xsIGJlIGZyZWVkIHNvb24uCisJICovCisJaWYgKHNjYi0+c2Fja2VkICYgVENQQ0JfU0FDS0VEX0FDS0VEKQorCQlzY2ItPnR4LmRlbGl2ZXJlZF9tc3RhbXAudjY0ID0gMDsKK30KKworLyogVXBkYXRlIHRoZSBjb25uZWN0aW9uIGRlbGl2ZXJ5IGluZm9ybWF0aW9uIGFuZCBnZW5lcmF0ZSBhIHJhdGUgc2FtcGxlLiAqLwordm9pZCB0Y3BfcmF0ZV9nZW4oc3RydWN0IHNvY2sgKnNrLCB1MzIgZGVsaXZlcmVkLCB1MzIgbG9zdCwKKwkJICBzdHJ1Y3Qgc2tiX21zdGFtcCAqbm93LCBzdHJ1Y3QgcmF0ZV9zYW1wbGUgKnJzKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXUzMiBzbmRfdXMsIGFja191czsKKworCS8qIENsZWFyIGFwcCBsaW1pdGVkIGlmIGJ1YmJsZSBpcyBhY2tlZCBhbmQgZ29uZS4gKi8KKwlpZiAodHAtPmFwcF9saW1pdGVkICYmIGFmdGVyKHRwLT5kZWxpdmVyZWQsIHRwLT5hcHBfbGltaXRlZCkpCisJCXRwLT5hcHBfbGltaXRlZCA9IDA7CisKKwkvKiBUT0RPOiB0aGVyZSBhcmUgbXVsdGlwbGUgcGxhY2VzIHRocm91Z2hvdXQgdGNwX2FjaygpIHRvIGdldAorCSAqIGN1cnJlbnQgdGltZS4gUmVmYWN0b3IgdGhlIGNvZGUgdXNpbmcgYSBuZXcgInRjcF9hY2t0YWdfc3RhdGUiCisJICogdG8gY2FycnkgY3VycmVudCB0aW1lLCBmbGFncywgc3RhdHMgbGlrZSAidGNwX3NhY2t0YWdfc3RhdGUiLgorCSAqLworCWlmIChkZWxpdmVyZWQpCisJCXRwLT5kZWxpdmVyZWRfbXN0YW1wID0gKm5vdzsKKworCXJzLT5hY2tlZF9zYWNrZWQgPSBkZWxpdmVyZWQ7CS8qIGZyZXNobHkgQUNLZWQgb3IgU0FDS2VkICovCisJcnMtPmxvc3NlcyA9IGxvc3Q7CQkvKiBmcmVzaGx5IG1hcmtlZCBsb3N0ICovCisJLyogUmV0dXJuIGFuIGludmFsaWQgc2FtcGxlIGlmIG5vIHRpbWluZyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuICovCisJaWYgKCFycy0+cHJpb3JfbXN0YW1wLnY2NCkgeworCQlycy0+ZGVsaXZlcmVkID0gLTE7CisJCXJzLT5pbnRlcnZhbF91cyA9IC0xOworCQlyZXR1cm47CisJfQorCXJzLT5kZWxpdmVyZWQgICA9IHRwLT5kZWxpdmVyZWQgLSBycy0+cHJpb3JfZGVsaXZlcmVkOworCisJLyogTW9kZWwgc2VuZGluZyBkYXRhIGFuZCByZWNlaXZpbmcgQUNLcyBhcyBzZXBhcmF0ZSBwaXBlbGluZSBwaGFzZXMKKwkgKiBmb3IgYSB3aW5kb3cuIFVzdWFsbHkgdGhlIEFDSyBwaGFzZSBpcyBsb25nZXIsIGJ1dCB3aXRoIEFDSworCSAqIGNvbXByZXNzaW9uIHRoZSBzZW5kIHBoYXNlIGNhbiBiZSBsb25nZXIuIFRvIGJlIHNhZmUgd2UgdXNlIHRoZQorCSAqIGxvbmdlciBwaGFzZS4KKwkgKi8KKwlzbmRfdXMgPSBycy0+aW50ZXJ2YWxfdXM7CQkJCS8qIHNlbmQgcGhhc2UgKi8KKwlhY2tfdXMgPSBza2JfbXN0YW1wX3VzX2RlbHRhKG5vdywgJnJzLT5wcmlvcl9tc3RhbXApOwkvKiBhY2sgcGhhc2UgKi8KKwlycy0+aW50ZXJ2YWxfdXMgPSBtYXgoc25kX3VzLCBhY2tfdXMpOworCisJLyogTm9ybWFsbHkgd2UgZXhwZWN0IGludGVydmFsX3VzID49IG1pbi1ydHQuCisJICogTm90ZSB0aGF0IHJhdGUgbWF5IHN0aWxsIGJlIG92ZXItZXN0aW1hdGVkIHdoZW4gYSBzcHVyaW91c2x5CisJICogcmV0cmFuc21pc3R0ZWQgc2tiIHdhcyBmaXJzdCAocylhY2tlZCBiZWNhdXNlICJpbnRlcnZhbF91cyIKKwkgKiBpcyB1bmRlci1lc3RpbWF0ZWQgKHVwIHRvIGFuIFJUVCkuIEhvd2V2ZXIgY29udGludW91c2x5CisJICogbWVhc3VyaW5nIHRoZSBkZWxpdmVyeSByYXRlIGR1cmluZyBsb3NzIHJlY292ZXJ5IGlzIGNydWNpYWwKKwkgKiBmb3IgY29ubmVjdGlvbnMgc3VmZmVyIGhlYXZ5IG9yIHByb2xvbmdlZCBsb3NzZXMuCisJICovCisJaWYgKHVubGlrZWx5KHJzLT5pbnRlcnZhbF91cyA8IHRjcF9taW5fcnR0KHRwKSkpIHsKKwkJaWYgKCFycy0+aXNfcmV0cmFucykKKwkJCXByX2RlYnVnKCJ0Y3AgcmF0ZTogJWxkICVkICV1ICV1ICV1XG4iLAorCQkJCSBycy0+aW50ZXJ2YWxfdXMsIHJzLT5kZWxpdmVyZWQsCisJCQkJIGluZXRfY3NrKHNrKS0+aWNza19jYV9zdGF0ZSwKKwkJCQkgdHAtPnJ4X29wdC5zYWNrX29rLCB0Y3BfbWluX3J0dCh0cCkpOworCQlycy0+aW50ZXJ2YWxfdXMgPSAtMTsKKwkJcmV0dXJuOworCX0KKworCS8qIFJlY29yZCB0aGUgbGFzdCBub24tYXBwLWxpbWl0ZWQgb3IgdGhlIGhpZ2hlc3QgYXBwLWxpbWl0ZWQgYncgKi8KKwlpZiAoIXJzLT5pc19hcHBfbGltaXRlZCB8fAorCSAgICAoKHU2NClycy0+ZGVsaXZlcmVkICogdHAtPnJhdGVfaW50ZXJ2YWxfdXMgPj0KKwkgICAgICh1NjQpdHAtPnJhdGVfZGVsaXZlcmVkICogcnMtPmludGVydmFsX3VzKSkgeworCQl0cC0+cmF0ZV9kZWxpdmVyZWQgPSBycy0+ZGVsaXZlcmVkOworCQl0cC0+cmF0ZV9pbnRlcnZhbF91cyA9IHJzLT5pbnRlcnZhbF91czsKKwkJdHAtPnJhdGVfYXBwX2xpbWl0ZWQgPSBycy0+aXNfYXBwX2xpbWl0ZWQ7CisJfQorfQorCisvKiBJZiBhIGdhcCBpcyBkZXRlY3RlZCBiZXR3ZWVuIHNlbmRzLCBtYXJrIHRoZSBzb2NrZXQgYXBwbGljYXRpb24tbGltaXRlZC4gKi8KK3ZvaWQgdGNwX3JhdGVfY2hlY2tfYXBwX2xpbWl0ZWQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJaWYgKC8qIFdlIGhhdmUgbGVzcyB0aGFuIG9uZSBwYWNrZXQgdG8gc2VuZC4gKi8KKwkgICAgdHAtPndyaXRlX3NlcSAtIHRwLT5zbmRfbnh0IDwgdHAtPm1zc19jYWNoZSAmJgorCSAgICAvKiBOb3RoaW5nIGluIHNlbmRpbmcgaG9zdCdzIHFkaXNjIHF1ZXVlcyBvciBOSUMgdHggcXVldWUuICovCisJICAgIHNrX3dtZW1fYWxsb2NfZ2V0KHNrKSA8IFNLQl9UUlVFU0laRSgxKSAmJgorCSAgICAvKiBXZSBhcmUgbm90IGxpbWl0ZWQgYnkgQ1dORC4gKi8KKwkgICAgdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSA8IHRwLT5zbmRfY3duZCAmJgorCSAgICAvKiBBbGwgbG9zdCBwYWNrZXRzIGhhdmUgYmVlbiByZXRyYW5zbWl0dGVkLiAqLworCSAgICB0cC0+bG9zdF9vdXQgPD0gdHAtPnJldHJhbnNfb3V0KQorCQl0cC0+YXBwX2xpbWl0ZWQgPQorCQkJKHRwLT5kZWxpdmVyZWQgKyB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApKSA/IDogMTsKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF90aW1lci5jIGIvbmV0L2lwdjQvdGNwX3RpbWVyLmMKaW5kZXggZDg0OTMwYi4uM2VhMWNmOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX3RpbWVyLmMKKysrIGIvbmV0L2lwdjQvdGNwX3RpbWVyLmMKQEAgLTE5Miw2ICsxOTIsOCBAQAogCQkJaWYgKHRwLT5zeW5fZGF0YSAmJiBpY3NrLT5pY3NrX3JldHJhbnNtaXRzID09IDEpCiAJCQkJTkVUX0lOQ19TVEFUUyhzb2NrX25ldChzayksCiAJCQkJCSAgICAgIExJTlVYX01JQl9UQ1BGQVNUT1BFTkFDVElWRUZBSUwpOworCQl9IGVsc2UgaWYgKCF0cC0+c3luX2RhdGEgJiYgIXRwLT5zeW5fZmFzdG9wZW4pIHsKKwkJCXNrX3JldGhpbmtfdHhoYXNoKHNrKTsKIAkJfQogCQlyZXRyeV91bnRpbCA9IGljc2stPmljc2tfc3luX3JldHJpZXMgPyA6IG5ldC0+aXB2NC5zeXNjdGxfdGNwX3N5bl9yZXRyaWVzOwogCQlzeW5fc2V0ID0gdHJ1ZTsKQEAgLTIxMyw2ICsyMTUsOCBAQAogCQkJdGNwX210dV9wcm9iaW5nKGljc2ssIHNrKTsKIAogCQkJZHN0X25lZ2F0aXZlX2FkdmljZShzayk7CisJCX0gZWxzZSB7CisJCQlza19yZXRoaW5rX3R4aGFzaChzayk7CiAJCX0KIAogCQlyZXRyeV91bnRpbCA9IG5ldC0+aXB2NC5zeXNjdGxfdGNwX3JldHJpZXMyOwpAQCAtMzg0LDYgKzM4OCw3IEBACiAJICovCiAJaW5ldF9ydHhfc3luX2FjayhzaywgcmVxKTsKIAlyZXEtPm51bV90aW1lb3V0Kys7CisJaWNzay0+aWNza19yZXRyYW5zbWl0cysrOwogCWluZXRfY3NrX3Jlc2V0X3htaXRfdGltZXIoc2ssIElDU0tfVElNRV9SRVRSQU5TLAogCQkJICBUQ1BfVElNRU9VVF9JTklUIDw8IHJlcS0+bnVtX3RpbWVvdXQsIFRDUF9SVE9fTUFYKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF95ZWFoLmMgYi9uZXQvaXB2NC90Y3BfeWVhaC5jCmluZGV4IDAyOGViMDQuLjljNWZjOTcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF95ZWFoLmMKKysrIGIvbmV0L2lwdjQvdGNwX3llYWguYwpAQCAtNzYsNyArNzYsNyBAQAogCWlmICghdGNwX2lzX2N3bmRfbGltaXRlZChzaykpCiAJCXJldHVybjsKIAotCWlmICh0cC0+c25kX2N3bmQgPD0gdHAtPnNuZF9zc3RocmVzaCkKKwlpZiAodGNwX2luX3Nsb3dfc3RhcnQodHApKQogCQl0Y3Bfc2xvd19zdGFydCh0cCwgYWNrZWQpOwogCiAJZWxzZSBpZiAoIXllYWgtPmRvaW5nX3Jlbm9fbm93KSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHAuYyBiL25ldC9pcHY0L3VkcC5jCmluZGV4IGU2MWY3Y2QuLjdkOTZkYzIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcC5jCisrKyBiL25ldC9pcHY0L3VkcC5jCkBAIC0xMTQsNiArMTE0LDcgQEAKICNpbmNsdWRlIDxuZXQvYnVzeV9wb2xsLmg+CiAjaW5jbHVkZSAidWRwX2ltcGwuaCIKICNpbmNsdWRlIDxuZXQvc29ja19yZXVzZXBvcnQuaD4KKyNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KIAogc3RydWN0IHVkcF90YWJsZSB1ZHBfdGFibGUgX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0wodWRwX3RhYmxlKTsKQEAgLTEwMjAsMTIgKzEwMjEsNiBAQAogCQkJCSAgIGZsb3dfZmxhZ3MsCiAJCQkJICAgZmFkZHIsIHNhZGRyLCBkcG9ydCwgaW5ldC0+aW5ldF9zcG9ydCk7CiAKLQkJaWYgKCFzYWRkciAmJiBpcGMub2lmKSB7Ci0JCQllcnIgPSBsM21kZXZfZ2V0X3NhZGRyKG5ldCwgaXBjLm9pZiwgZmw0KTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCWdvdG8gb3V0OwotCQl9Ci0KIAkJc2VjdXJpdHlfc2tfY2xhc3NpZnlfZmxvdyhzaywgZmxvd2k0X3RvX2Zsb3dpKGZsNCkpOwogCQlydCA9IGlwX3JvdXRlX291dHB1dF9mbG93KG5ldCwgZmw0LCBzayk7CiAJCWlmIChJU19FUlIocnQpKSB7CkBAIC0xMTgyLDEzICsxMTc3LDEzIEBACiAgKglAc2s6IHNvY2tldAogICoKICAqCURyb3BzIGFsbCBiYWQgY2hlY2tzdW0gZnJhbWVzLCB1bnRpbCBhIHZhbGlkIG9uZSBpcyBmb3VuZC4KLSAqCVJldHVybnMgdGhlIGxlbmd0aCBvZiBmb3VuZCBza2IsIG9yIDAgaWYgbm9uZSBpcyBmb3VuZC4KKyAqCVJldHVybnMgdGhlIGxlbmd0aCBvZiBmb3VuZCBza2IsIG9yIC0xIGlmIG5vbmUgaXMgZm91bmQuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZmlyc3RfcGFja2V0X2xlbmd0aChzdHJ1Y3Qgc29jayAqc2spCitzdGF0aWMgaW50IGZpcnN0X3BhY2tldF9sZW5ndGgoc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCBza19idWZmX2hlYWQgbGlzdF9raWxsLCAqcmN2cSA9ICZzay0+c2tfcmVjZWl2ZV9xdWV1ZTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGludCByZXM7CisJaW50IHJlczsKIAogCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbGlzdF9raWxsKTsKIApAQCAtMTIwMyw3ICsxMTk4LDcgQEAKIAkJX19za2JfdW5saW5rKHNrYiwgcmN2cSk7CiAJCV9fc2tiX3F1ZXVlX3RhaWwoJmxpc3Rfa2lsbCwgc2tiKTsKIAl9Ci0JcmVzID0gc2tiID8gc2tiLT5sZW4gOiAwOworCXJlcyA9IHNrYiA/IHNrYi0+bGVuIDogLTE7CiAJc3Bpbl91bmxvY2tfYmgoJnJjdnEtPmxvY2spOwogCiAJaWYgKCFza2JfcXVldWVfZW1wdHkoJmxpc3Rfa2lsbCkpIHsKQEAgLTEyMzIsNyArMTIyNyw3IEBACiAKIAljYXNlIFNJT0NJTlE6CiAJewotCQl1bnNpZ25lZCBpbnQgYW1vdW50ID0gZmlyc3RfcGFja2V0X2xlbmd0aChzayk7CisJCWludCBhbW91bnQgPSBtYXhfdChpbnQsIDAsIGZpcnN0X3BhY2tldF9sZW5ndGgoc2spKTsKIAogCQlyZXR1cm4gcHV0X3VzZXIoYW1vdW50LCAoaW50IF9fdXNlciAqKWFyZyk7CiAJfQpAQCAtMjE4NCw3ICsyMTc5LDcgQEAKIAogCS8qIENoZWNrIGZvciBmYWxzZSBwb3NpdGl2ZXMgZHVlIHRvIGNoZWNrc3VtIGVycm9ycyAqLwogCWlmICgobWFzayAmIFBPTExSRE5PUk0pICYmICEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spICYmCi0JICAgICEoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKSAmJiAhZmlyc3RfcGFja2V0X2xlbmd0aChzaykpCisJICAgICEoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKSAmJiBmaXJzdF9wYWNrZXRfbGVuZ3RoKHNrKSA9PSAtMSkKIAkJbWFzayAmPSB+KFBPTExJTiB8IFBPTExSRE5PUk0pOwogCiAJcmV0dXJuIG1hc2s7CkBAIC0yMTkyLDYgKzIxODcsMjAgQEAKIH0KIEVYUE9SVF9TWU1CT0wodWRwX3BvbGwpOwogCitpbnQgdWRwX2Fib3J0KHN0cnVjdCBzb2NrICpzaywgaW50IGVycikKK3sKKwlsb2NrX3NvY2soc2spOworCisJc2stPnNrX2VyciA9IGVycjsKKwlzay0+c2tfZXJyb3JfcmVwb3J0KHNrKTsKKwl1ZHBfZGlzY29ubmVjdChzaywgMCk7CisKKwlyZWxlYXNlX3NvY2soc2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1ZHBfYWJvcnQpOworCiBzdHJ1Y3QgcHJvdG8gdWRwX3Byb3QgPSB7CiAJLm5hbWUJCSAgID0gIlVEUCIsCiAJLm93bmVyCQkgICA9IFRISVNfTU9EVUxFLApAQCAtMjIxNiwxMyArMjIyNSwxMiBAQAogCS5zeXNjdGxfd21lbQkgICA9ICZzeXNjdGxfdWRwX3dtZW1fbWluLAogCS5zeXNjdGxfcm1lbQkgICA9ICZzeXNjdGxfdWRwX3JtZW1fbWluLAogCS5vYmpfc2l6ZQkgICA9IHNpemVvZihzdHJ1Y3QgdWRwX3NvY2spLAotCS5zbGFiX2ZsYWdzCSAgID0gU0xBQl9ERVNUUk9ZX0JZX1JDVSwKIAkuaC51ZHBfdGFibGUJICAgPSAmdWRwX3RhYmxlLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X3NldHNvY2tvcHQgPSBjb21wYXRfdWRwX3NldHNvY2tvcHQsCiAJLmNvbXBhdF9nZXRzb2Nrb3B0ID0gY29tcGF0X3VkcF9nZXRzb2Nrb3B0LAogI2VuZGlmCi0JLmNsZWFyX3NrCSAgID0gc2tfcHJvdF9jbGVhcl9wb3J0YWRkcl9udWxscywKKwkuZGlhZ19kZXN0cm95CSAgID0gdWRwX2Fib3J0LAogfTsKIEVYUE9SVF9TWU1CT0wodWRwX3Byb3QpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHBfZGlhZy5jIGIvbmV0L2lwdjQvdWRwX2RpYWcuYwppbmRleCAzZDVjY2Y0Li45YTg5YzEwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHBfZGlhZy5jCisrKyBiL25ldC9pcHY0L3VkcF9kaWFnLmMKQEAgLTIwLDcgKzIwLDcgQEAKIHN0YXRpYyBpbnQgc2tfZGlhZ19kdW1wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJCWNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEsCi0JCQlzdHJ1Y3QgbmxhdHRyICpiYykKKwkJCXN0cnVjdCBubGF0dHIgKmJjLCBib29sIG5ldF9hZG1pbikKIHsKIAlpZiAoIWluZXRfZGlhZ19iY19zayhiYywgc2spKQogCQlyZXR1cm4gMDsKQEAgLTI4LDcgKzI4LDcgQEAKIAlyZXR1cm4gaW5ldF9za19kaWFnX2ZpbGwoc2ssIE5VTEwsIHNrYiwgcmVxLAogCQkJc2tfdXNlcl9ucyhORVRMSU5LX0NCKGNiLT5za2IpLnNrKSwKIAkJCU5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkLAotCQkJY2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwgY2ItPm5saCk7CisJCQljYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLCBjYi0+bmxoLCBuZXRfYWRtaW4pOwogfQogCiBzdGF0aWMgaW50IHVkcF9kdW1wX29uZShzdHJ1Y3QgdWRwX3RhYmxlICp0YmwsIHN0cnVjdCBza19idWZmICppbl9za2IsCkBAIC03Niw3ICs3Niw4IEBACiAJZXJyID0gaW5ldF9za19kaWFnX2ZpbGwoc2ssIE5VTEwsIHJlcCwgcmVxLAogCQkJICAgc2tfdXNlcl9ucyhORVRMSU5LX0NCKGluX3NrYikuc2spLAogCQkJICAgTkVUTElOS19DQihpbl9za2IpLnBvcnRpZCwKLQkJCSAgIG5saC0+bmxtc2dfc2VxLCAwLCBubGgpOworCQkJICAgbmxoLT5ubG1zZ19zZXEsIDAsIG5saCwKKwkJCSAgIG5ldGxpbmtfbmV0X2NhcGFibGUoaW5fc2tiLCBDQVBfTkVUX0FETUlOKSk7CiAJaWYgKGVyciA8IDApIHsKIAkJV0FSTl9PTihlcnIgPT0gLUVNU0dTSVpFKTsKIAkJa2ZyZWVfc2tiKHJlcCk7CkBAIC05Nyw2ICs5OCw3IEBACiAJCSAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogCQkgICAgIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyLCBzdHJ1Y3QgbmxhdHRyICpiYykKIHsKKwlib29sIG5ldF9hZG1pbiA9IG5ldGxpbmtfbmV0X2NhcGFibGUoY2ItPnNrYiwgQ0FQX05FVF9BRE1JTik7CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CiAJaW50IG51bSwgc19udW0sIHNsb3QsIHNfc2xvdDsKIApAQCAtMTMyLDcgKzEzNCw3IEBACiAJCQkgICAgci0+aWQuaWRpYWdfZHBvcnQpCiAJCQkJZ290byBuZXh0OwogCi0JCQlpZiAoc2tfZGlhZ19kdW1wKHNrLCBza2IsIGNiLCByLCBiYykgPCAwKSB7CisJCQlpZiAoc2tfZGlhZ19kdW1wKHNrLCBza2IsIGNiLCByLCBiYywgbmV0X2FkbWluKSA8IDApIHsKIAkJCQlzcGluX3VubG9ja19iaCgmaHNsb3QtPmxvY2spOwogCQkJCWdvdG8gZG9uZTsKIAkJCX0KQEAgLTE2NSwxMiArMTY3LDg4IEBACiAJci0+aWRpYWdfd3F1ZXVlID0gc2tfd21lbV9hbGxvY19nZXQoc2spOwogfQogCisjaWZkZWYgQ09ORklHX0lORVRfRElBR19ERVNUUk9ZCitzdGF0aWMgaW50IF9fdWRwX2RpYWdfZGVzdHJveShzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnJlcSwKKwkJCSAgICAgIHN0cnVjdCB1ZHBfdGFibGUgKnRibCkKK3sKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChpbl9za2ItPnNrKTsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJaW50IGVycjsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCWlmIChyZXEtPnNkaWFnX2ZhbWlseSA9PSBBRl9JTkVUKQorCQlzayA9IF9fdWRwNF9saWJfbG9va3VwKG5ldCwKKwkJCQlyZXEtPmlkLmlkaWFnX2RzdFswXSwgcmVxLT5pZC5pZGlhZ19kcG9ydCwKKwkJCQlyZXEtPmlkLmlkaWFnX3NyY1swXSwgcmVxLT5pZC5pZGlhZ19zcG9ydCwKKwkJCQlyZXEtPmlkLmlkaWFnX2lmLCB0YmwsIE5VTEwpOworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCisJZWxzZSBpZiAocmVxLT5zZGlhZ19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJaWYgKGlwdjZfYWRkcl92NG1hcHBlZCgoc3RydWN0IGluNl9hZGRyICopcmVxLT5pZC5pZGlhZ19kc3QpICYmCisJCSAgICBpcHY2X2FkZHJfdjRtYXBwZWQoKHN0cnVjdCBpbjZfYWRkciAqKXJlcS0+aWQuaWRpYWdfc3JjKSkKKwkJCXNrID0gX191ZHA0X2xpYl9sb29rdXAobmV0LAorCQkJCQlyZXEtPmlkLmlkaWFnX2RzdFszXSwgcmVxLT5pZC5pZGlhZ19kcG9ydCwKKwkJCQkJcmVxLT5pZC5pZGlhZ19zcmNbM10sIHJlcS0+aWQuaWRpYWdfc3BvcnQsCisJCQkJCXJlcS0+aWQuaWRpYWdfaWYsIHRibCwgTlVMTCk7CisKKwkJZWxzZQorCQkJc2sgPSBfX3VkcDZfbGliX2xvb2t1cChuZXQsCisJCQkJCShzdHJ1Y3QgaW42X2FkZHIgKilyZXEtPmlkLmlkaWFnX2RzdCwKKwkJCQkJcmVxLT5pZC5pZGlhZ19kcG9ydCwKKwkJCQkJKHN0cnVjdCBpbjZfYWRkciAqKXJlcS0+aWQuaWRpYWdfc3JjLAorCQkJCQlyZXEtPmlkLmlkaWFnX3Nwb3J0LAorCQkJCQlyZXEtPmlkLmlkaWFnX2lmLCB0YmwsIE5VTEwpOworCX0KKyNlbmRpZgorCWVsc2UgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNrICYmICFhdG9taWNfaW5jX25vdF96ZXJvKCZzay0+c2tfcmVmY250KSkKKwkJc2sgPSBOVUxMOworCisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAoIXNrKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWlmIChzb2NrX2RpYWdfY2hlY2tfY29va2llKHNrLCByZXEtPmlkLmlkaWFnX2Nvb2tpZSkpIHsKKwkJc29ja19wdXQoc2spOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwllcnIgPSBzb2NrX2RpYWdfZGVzdHJveShzaywgRUNPTk5BQk9SVEVEKTsKKworCXNvY2tfcHV0KHNrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdWRwX2RpYWdfZGVzdHJveShzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEpCit7CisJcmV0dXJuIF9fdWRwX2RpYWdfZGVzdHJveShpbl9za2IsIHJlcSwgJnVkcF90YWJsZSk7Cit9CisKK3N0YXRpYyBpbnQgdWRwbGl0ZV9kaWFnX2Rlc3Ryb3koc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwKKwkJCQljb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqcmVxKQoreworCXJldHVybiBfX3VkcF9kaWFnX2Rlc3Ryb3koaW5fc2tiLCByZXEsICZ1ZHBsaXRlX3RhYmxlKTsKK30KKworI2VuZGlmCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX2hhbmRsZXIgdWRwX2RpYWdfaGFuZGxlciA9IHsKIAkuZHVtcAkJID0gdWRwX2RpYWdfZHVtcCwKIAkuZHVtcF9vbmUJID0gdWRwX2RpYWdfZHVtcF9vbmUsCiAJLmlkaWFnX2dldF9pbmZvICA9IHVkcF9kaWFnX2dldF9pbmZvLAogCS5pZGlhZ190eXBlCSA9IElQUFJPVE9fVURQLAogCS5pZGlhZ19pbmZvX3NpemUgPSAwLAorI2lmZGVmIENPTkZJR19JTkVUX0RJQUdfREVTVFJPWQorCS5kZXN0cm95CSA9IHVkcF9kaWFnX2Rlc3Ryb3ksCisjZW5kaWYKIH07CiAKIHN0YXRpYyB2b2lkIHVkcGxpdGVfZGlhZ19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKQEAgLTE5Miw2ICsyNzAsOSBAQAogCS5pZGlhZ19nZXRfaW5mbyAgPSB1ZHBfZGlhZ19nZXRfaW5mbywKIAkuaWRpYWdfdHlwZQkgPSBJUFBST1RPX1VEUExJVEUsCiAJLmlkaWFnX2luZm9fc2l6ZSA9IDAsCisjaWZkZWYgQ09ORklHX0lORVRfRElBR19ERVNUUk9ZCisJLmRlc3Ryb3kJID0gdWRwbGl0ZV9kaWFnX2Rlc3Ryb3ksCisjZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHVkcF9kaWFnX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcF9vZmZsb2FkLmMgYi9uZXQvaXB2NC91ZHBfb2ZmbG9hZC5jCmluZGV4IDgxZjI1M2IuLmY5MzMzYzkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcF9vZmZsb2FkLmMKKysrIGIvbmV0L2lwdjQvdWRwX29mZmxvYWQuYwpAQCAtMjEsNyArMjEsNyBAQAogCV9fYmUxNiBuZXdfcHJvdG9jb2wsIGJvb2wgaXNfaXB2NikKIHsKIAlpbnQgdG5sX2hsZW4gPSBza2JfaW5uZXJfbWFjX2hlYWRlcihza2IpIC0gc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKLQlib29sIHJlbWNzdW0sIG5lZWRfY3N1bSwgb2ZmbG9hZF9jc3VtLCB1Zm87CisJYm9vbCByZW1jc3VtLCBuZWVkX2NzdW0sIG9mZmxvYWRfY3N1bSwgdWZvLCBnc29fcGFydGlhbDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2VncyA9IEVSUl9QVFIoLUVJTlZBTCk7CiAJc3RydWN0IHVkcGhkciAqdWggPSB1ZHBfaGRyKHNrYik7CiAJdTE2IG1hY19vZmZzZXQgPSBza2ItPm1hY19oZWFkZXI7CkBAIC04OCw2ICs4OCw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWdzb19wYXJ0aWFsID0gISEoc2tiX3NoaW5mbyhzZWdzKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1BBUlRJQUwpOworCiAJb3V0ZXJfaGxlbiA9IHNrYl90bmxfaGVhZGVyX2xlbihza2IpOwogCXVkcF9vZmZzZXQgPSBvdXRlcl9obGVuIC0gdG5sX2hsZW47CiAJc2tiID0gc2VnczsKQEAgLTExNyw3ICsxMTksNyBAQAogCQkgKiB3aWxsIGJlIHVzaW5nIGEgbGVuZ3RoIHZhbHVlIGVxdWFsIHRvIG9ubHkgb25lIE1TUyBzaXplZAogCQkgKiBzZWdtZW50IGluc3RlYWQgb2YgdGhlIGVudGlyZSBmcmFtZS4KIAkJICovCi0JCWlmIChza2JfaXNfZ3NvKHNrYikpIHsKKwkJaWYgKGdzb19wYXJ0aWFsKSB7CiAJCQl1aC0+bGVuID0gaHRvbnMoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSArCiAJCQkJCVNLQl9HU09fQ0Ioc2tiKS0+ZGF0YV9vZmZzZXQgKwogCQkJCQlza2ItPmhlYWQgLSAodW5zaWduZWQgY2hhciAqKXVoKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcGxpdGUuYyBiL25ldC9pcHY0L3VkcGxpdGUuYwppbmRleCAzYjNlZmJkLi5hZjgxNzE1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHBsaXRlLmMKKysrIGIvbmV0L2lwdjQvdWRwbGl0ZS5jCkBAIC01NSwxMyArNTUsMTEgQEAKIAkudW5oYXNoCQkgICA9IHVkcF9saWJfdW5oYXNoLAogCS5nZXRfcG9ydAkgICA9IHVkcF92NF9nZXRfcG9ydCwKIAkub2JqX3NpemUJICAgPSBzaXplb2Yoc3RydWN0IHVkcF9zb2NrKSwKLQkuc2xhYl9mbGFncwkgICA9IFNMQUJfREVTVFJPWV9CWV9SQ1UsCiAJLmgudWRwX3RhYmxlCSAgID0gJnVkcGxpdGVfdGFibGUsCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfc2V0c29ja29wdCA9IGNvbXBhdF91ZHBfc2V0c29ja29wdCwKIAkuY29tcGF0X2dldHNvY2tvcHQgPSBjb21wYXRfdWRwX2dldHNvY2tvcHQsCiAjZW5kaWYKLQkuY2xlYXJfc2sJICAgPSBza19wcm90X2NsZWFyX3BvcnRhZGRyX251bGxzLAogfTsKIEVYUE9SVF9TWU1CT0wodWRwbGl0ZV9wcm90KTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfcG9saWN5LmMgYi9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYwppbmRleCBiNjQ0YTIzLi42YTdmZjY5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYworKysgYi9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYwpAQCAtMjksNyArMjksNyBAQAogCW1lbXNldChmbDQsIDAsIHNpemVvZigqZmw0KSk7CiAJZmw0LT5kYWRkciA9IGRhZGRyLT5hNDsKIAlmbDQtPmZsb3dpNF90b3MgPSB0b3M7Ci0JZmw0LT5mbG93aTRfb2lmID0gb2lmOworCWZsNC0+Zmxvd2k0X29pZiA9IGwzbWRldl9tYXN0ZXJfaWZpbmRleF9ieV9pbmRleChuZXQsIG9pZik7CiAJaWYgKHNhZGRyKQogCQlmbDQtPnNhZGRyID0gc2FkZHItPmE0OwogCkBAIC0xMTIsNyArMTEyLDcgQEAKIAlpbnQgb2lmID0gMDsKIAogCWlmIChza2JfZHN0KHNrYikpCi0JCW9pZiA9IGwzbWRldl9maWJfb2lmKHNrYl9kc3Qoc2tiKS0+ZGV2KTsKKwkJb2lmID0gc2tiX2RzdChza2IpLT5kZXYtPmlmaW5kZXg7CiAKIAltZW1zZXQoZmw0LCAwLCBzaXplb2Yoc3RydWN0IGZsb3dpNCkpOwogCWZsNC0+Zmxvd2k0X21hcmsgPSBza2ItPm1hcms7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZGRyY29uZi5jIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwppbmRleCBhYjNlNzk2Li5jYmQ5MzQzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZGRyY29uZi5jCisrKyBiL25ldC9pcHY2L2FkZHJjb25mLmMKQEAgLTExMiw2ICsxMTIsMjcgQEAKIAlyZXR1cm4gKGNzdGFtcCAtIElOSVRJQUxfSklGRklFUykgKiAxMDBVTCAvIEhaOwogfQogCitzdGF0aWMgaW5saW5lIHMzMiByZmMzMzE1X3MxNF9iYWNrb2ZmX2luaXQoczMyIGlydCkKK3sKKwkvKiBtdWx0aXBseSAnaW5pdGlhbCByZXRyYW5zbWlzc2lvbiB0aW1lJyBieSAwLjkgLi4gMS4xICovCisJdTY0IHRtcCA9ICg5MDAwMDAgKyBwcmFuZG9tX3UzMigpICUgMjAwMDAxKSAqICh1NjQpaXJ0OworCWRvX2Rpdih0bXAsIDEwMDAwMDApOworCXJldHVybiAoczMyKXRtcDsKK30KKworc3RhdGljIGlubGluZSBzMzIgcmZjMzMxNV9zMTRfYmFja29mZl91cGRhdGUoczMyIHJ0LCBzMzIgbXJ0KQoreworCS8qIG11bHRpcGx5ICdyZXRyYW5zbWlzc2lvbiB0aW1lb3V0JyBieSAxLjkgLi4gMi4xICovCisJdTY0IHRtcCA9ICgxOTAwMDAwICsgcHJhbmRvbV91MzIoKSAlIDIwMDAwMSkgKiAodTY0KXJ0OworCWRvX2Rpdih0bXAsIDEwMDAwMDApOworCWlmICgoczMyKXRtcCA+IG1ydCkgeworCQkvKiBtdWx0aXBseSAnbWF4aW11bSByZXRyYW5zbWlzc2lvbiB0aW1lJyBieSAwLjkgLi4gMS4xICovCisJCXRtcCA9ICg5MDAwMDAgKyBwcmFuZG9tX3UzMigpICUgMjAwMDAxKSAqICh1NjQpbXJ0OworCQlkb19kaXYodG1wLCAxMDAwMDAwKTsKKwl9CisJcmV0dXJuIChzMzIpdG1wOworfQorCiAjaWZkZWYgQ09ORklHX1NZU0NUTAogc3RhdGljIGludCBhZGRyY29uZl9zeXNjdGxfcmVnaXN0ZXIoc3RydWN0IGluZXQ2X2RldiAqaWRldik7CiBzdGF0aWMgdm9pZCBhZGRyY29uZl9zeXNjdGxfdW5yZWdpc3RlcihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KTsKQEAgLTE4Nyw2ICsyMDgsNyBAQAogCS5kYWRfdHJhbnNtaXRzCQk9IDEsCiAJLnJ0cl9zb2xpY2l0cwkJPSBNQVhfUlRSX1NPTElDSVRBVElPTlMsCiAJLnJ0cl9zb2xpY2l0X2ludGVydmFsCT0gUlRSX1NPTElDSVRBVElPTl9JTlRFUlZBTCwKKwkucnRyX3NvbGljaXRfbWF4X2ludGVydmFsID0gUlRSX1NPTElDSVRBVElPTl9NQVhfSU5URVJWQUwsCiAJLnJ0cl9zb2xpY2l0X2RlbGF5CT0gTUFYX1JUUl9TT0xJQ0lUQVRJT05fREVMQVksCiAJLnVzZV90ZW1wYWRkcgkJPSAwLAogCS50ZW1wX3ZhbGlkX2xmdAkJPSBURU1QX1ZBTElEX0xJRkVUSU1FLApAQCAtMjMyLDYgKzI1NCw3IEBACiAJLmRhZF90cmFuc21pdHMJCT0gMSwKIAkucnRyX3NvbGljaXRzCQk9IE1BWF9SVFJfU09MSUNJVEFUSU9OUywKIAkucnRyX3NvbGljaXRfaW50ZXJ2YWwJPSBSVFJfU09MSUNJVEFUSU9OX0lOVEVSVkFMLAorCS5ydHJfc29saWNpdF9tYXhfaW50ZXJ2YWwgPSBSVFJfU09MSUNJVEFUSU9OX01BWF9JTlRFUlZBTCwKIAkucnRyX3NvbGljaXRfZGVsYXkJPSBNQVhfUlRSX1NPTElDSVRBVElPTl9ERUxBWSwKIAkudXNlX3RlbXBhZGRyCQk9IDAsCiAJLnRlbXBfdmFsaWRfbGZ0CQk9IFRFTVBfVkFMSURfTElGRVRJTUUsCkBAIC03NzgsNyArODAxLDE0IEBACiAJfQogCiAJaWYgKHAgPT0gJm5ldC0+aXB2Ni5kZXZjb25mX2FsbC0+Zm9yd2FyZGluZykgeworCQlpbnQgb2xkX2RmbHQgPSBuZXQtPmlwdjYuZGV2Y29uZl9kZmx0LT5mb3J3YXJkaW5nOworCiAJCW5ldC0+aXB2Ni5kZXZjb25mX2RmbHQtPmZvcndhcmRpbmcgPSBuZXdmOworCQlpZiAoKCFuZXdmKSBeICghb2xkX2RmbHQpKQorCQkJaW5ldDZfbmV0Y29uZl9ub3RpZnlfZGV2Y29uZihuZXQsIE5FVENPTkZBX0ZPUldBUkRJTkcsCisJCQkJCQkgICAgIE5FVENPTkZBX0lGSU5ERVhfREVGQVVMVCwKKwkJCQkJCSAgICAgbmV0LT5pcHY2LmRldmNvbmZfZGZsdCk7CisKIAkJYWRkcmNvbmZfZm9yd2FyZF9jaGFuZ2UobmV0LCBuZXdmKTsKIAkJaWYgKCghbmV3ZikgXiAoIW9sZCkpCiAJCQlpbmV0Nl9uZXRjb25mX25vdGlmeV9kZXZjb25mKG5ldCwgTkVUQ09ORkFfRk9SV0FSRElORywKQEAgLTE4NzIsNyArMTkwMiw2IEBACiAKIHZvaWQgYWRkcmNvbmZfZGFkX2ZhaWx1cmUoc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwKQogewotCXN0cnVjdCBpbjZfYWRkciBhZGRyOwogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBpZnAtPmlkZXY7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChpZnAtPmlkZXYtPmRldik7CiAKQEAgLTE5MzQsMTggKzE5NjMsNiBAQAogCQlpbjZfaWZhX3B1dChpZnAyKTsKIGxvY2tfZXJyZGFkOgogCQlzcGluX2xvY2tfYmgoJmlmcC0+bG9jayk7Ci0JfSBlbHNlIGlmIChpZGV2LT5jbmYuYWNjZXB0X2RhZCA+IDEgJiYgIWlkZXYtPmNuZi5kaXNhYmxlX2lwdjYpIHsKLQkJYWRkci5zNl9hZGRyMzJbMF0gPSBodG9ubCgweGZlODAwMDAwKTsKLQkJYWRkci5zNl9hZGRyMzJbMV0gPSAwOwotCi0JCWlmICghaXB2Nl9nZW5lcmF0ZV9ldWk2NChhZGRyLnM2X2FkZHIgKyA4LCBpZGV2LT5kZXYpICYmCi0JCSAgICBpcHY2X2FkZHJfZXF1YWwoJmlmcC0+YWRkciwgJmFkZHIpKSB7Ci0JCQkvKiBEQUQgZmFpbGVkIGZvciBsaW5rLWxvY2FsIGJhc2VkIG9uIE1BQyBhZGRyZXNzICovCi0JCQlpZGV2LT5jbmYuZGlzYWJsZV9pcHY2ID0gMTsKLQotCQkJcHJfaW5mbygiJXM6IElQdjYgYmVpbmcgZGlzYWJsZWQhXG4iLAotCQkJCWlmcC0+aWRldi0+ZGV2LT5uYW1lKTsKLQkJfQogCX0KIAogZXJyZGFkOgpAQCAtMTk1NCw2ICsxOTcxLDcgQEAKIAlzcGluX3VubG9ja19iaCgmaWZwLT5sb2NrKTsKIAogCWFkZHJjb25mX21vZF9kYWRfd29yayhpZnAsIDApOworCWluNl9pZmFfcHV0KGlmcCk7CiB9CiAKIC8qIEpvaW4gdG8gc29saWNpdGVkIGFkZHIgbXVsdGljYXN0IGdyb3VwLgpAQCAtMzU0Myw3ICszNTYxLDcgQEAKIAkvKiBjb21iaW5lIHRoZSB1c2VyIGNvbmZpZyB3aXRoIGV2ZW50IHRvIGRldGVybWluZSBpZiBwZXJtYW5lbnQKIAkgKiBhZGRyZXNzZXMgYXJlIHRvIGJlIHJlbW92ZWQgZnJvbSBhZGRyZXNzIGhhc2ggdGFibGUKIAkgKi8KLQlrZWVwX2FkZHIgPSAhKGhvdyB8fCBfa2VlcF9hZGRyIDw9IDApOworCWtlZXBfYWRkciA9ICEoaG93IHx8IF9rZWVwX2FkZHIgPD0gMCB8fCBpZGV2LT5jbmYuZGlzYWJsZV9pcHY2KTsKIAogCS8qIFN0ZXAgMjogY2xlYXIgaGFzaCB0YWJsZSAqLwogCWZvciAoaSA9IDA7IGkgPCBJTjZfQUREUl9IU0laRTsgaSsrKSB7CkBAIC0zNTk5LDcgKzM2MTcsNyBAQAogCS8qIHJlLWNvbWJpbmUgdGhlIHVzZXIgY29uZmlnIHdpdGggZXZlbnQgdG8gZGV0ZXJtaW5lIGlmIHBlcm1hbmVudAogCSAqIGFkZHJlc3NlcyBhcmUgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBpbnRlcmZhY2UgbGlzdAogCSAqLwotCWtlZXBfYWRkciA9ICghaG93ICYmIF9rZWVwX2FkZHIgPiAwKTsKKwlrZWVwX2FkZHIgPSAoIWhvdyAmJiBfa2VlcF9hZGRyID4gMCAmJiAhaWRldi0+Y25mLmRpc2FibGVfaXB2Nik7CiAKIAlJTklUX0xJU1RfSEVBRCgmZGVsX2xpc3QpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpZmEsIHRtcCwgJmlkZXYtPmFkZHJfbGlzdCwgaWZfbGlzdCkgewpAQCAtMzY5Miw3ICszNzEwLDcgQEAKIAlpZiAoaWRldi0+aWZfZmxhZ3MgJiBJRl9SQV9SQ1ZEKQogCQlnb3RvIG91dDsKIAotCWlmIChpZGV2LT5yc19wcm9iZXMrKyA8IGlkZXYtPmNuZi5ydHJfc29saWNpdHMpIHsKKwlpZiAoaWRldi0+cnNfcHJvYmVzKysgPCBpZGV2LT5jbmYucnRyX3NvbGljaXRzIHx8IGlkZXYtPmNuZi5ydHJfc29saWNpdHMgPCAwKSB7CiAJCXdyaXRlX3VubG9jaygmaWRldi0+bG9jayk7CiAJCWlmICghaXB2Nl9nZXRfbGxhZGRyKGRldiwgJmxsYWRkciwgSUZBX0ZfVEVOVEFUSVZFKSkKIAkJCW5kaXNjX3NlbmRfcnMoZGV2LCAmbGxhZGRyLApAQCAtMzcwMSwxMSArMzcxOSwxMyBAQAogCQkJZ290byBwdXQ7CiAKIAkJd3JpdGVfbG9jaygmaWRldi0+bG9jayk7CisJCWlkZXYtPnJzX2ludGVydmFsID0gcmZjMzMxNV9zMTRfYmFja29mZl91cGRhdGUoCisJCQlpZGV2LT5yc19pbnRlcnZhbCwgaWRldi0+Y25mLnJ0cl9zb2xpY2l0X21heF9pbnRlcnZhbCk7CiAJCS8qIFRoZSB3YWl0IGFmdGVyIHRoZSBsYXN0IHByb2JlIGNhbiBiZSBzaG9ydGVyICovCiAJCWFkZHJjb25mX21vZF9yc190aW1lcihpZGV2LCAoaWRldi0+cnNfcHJvYmVzID09CiAJCQkJCSAgICAgaWRldi0+Y25mLnJ0cl9zb2xpY2l0cykgPwogCQkJCSAgICAgIGlkZXYtPmNuZi5ydHJfc29saWNpdF9kZWxheSA6Ci0JCQkJICAgICAgaWRldi0+Y25mLnJ0cl9zb2xpY2l0X2ludGVydmFsKTsKKwkJCQkgICAgICBpZGV2LT5yc19pbnRlcnZhbCk7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogTm90ZTogd2UgZG8gbm90IHN1cHBvcnQgZGVwcmVjYXRlZCAiYWxsIG9uLWxpbmsiCkBAIC0zODIxLDYgKzM4NDEsNyBAQAogCQkJCQkJZGFkX3dvcmspOwogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBpZnAtPmlkZXY7CiAJc3RydWN0IGluNl9hZGRyIG1jYWRkcjsKKwlib29sIGRpc2FibGVfaXB2NiA9IGZhbHNlOwogCiAJZW51bSB7CiAJCURBRF9QUk9DRVNTLApAQCAtMzgzNyw2ICszODU4LDI0IEBACiAJfSBlbHNlIGlmIChpZnAtPnN0YXRlID09IElORVQ2X0lGQUREUl9TVEFURV9FUlJEQUQpIHsKIAkJYWN0aW9uID0gREFEX0FCT1JUOwogCQlpZnAtPnN0YXRlID0gSU5FVDZfSUZBRERSX1NUQVRFX1BPU1REQUQ7CisKKwkJaWYgKGlkZXYtPmNuZi5hY2NlcHRfZGFkID4gMSAmJiAhaWRldi0+Y25mLmRpc2FibGVfaXB2NiAmJgorCQkgICAgIShpZnAtPmZsYWdzICYgSUZBX0ZfU1RBQkxFX1BSSVZBQ1kpKSB7CisJCQlzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKKworCQkJYWRkci5zNl9hZGRyMzJbMF0gPSBodG9ubCgweGZlODAwMDAwKTsKKwkJCWFkZHIuczZfYWRkcjMyWzFdID0gMDsKKworCQkJaWYgKCFpcHY2X2dlbmVyYXRlX2V1aTY0KGFkZHIuczZfYWRkciArIDgsIGlkZXYtPmRldikgJiYKKwkJCSAgICBpcHY2X2FkZHJfZXF1YWwoJmlmcC0+YWRkciwgJmFkZHIpKSB7CisJCQkJLyogREFEIGZhaWxlZCBmb3IgbGluay1sb2NhbCBiYXNlZCBvbiBNQUMgKi8KKwkJCQlpZGV2LT5jbmYuZGlzYWJsZV9pcHY2ID0gMTsKKworCQkJCXByX2luZm8oIiVzOiBJUHY2IGJlaW5nIGRpc2FibGVkIVxuIiwKKwkJCQkJaWZwLT5pZGV2LT5kZXYtPm5hbWUpOworCQkJCWRpc2FibGVfaXB2NiA9IHRydWU7CisJCQl9CisJCX0KIAl9CiAJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CiAKQEAgLTM4NDQsNyArMzg4MywxMCBAQAogCQlhZGRyY29uZl9kYWRfYmVnaW4oaWZwKTsKIAkJZ290byBvdXQ7CiAJfSBlbHNlIGlmIChhY3Rpb24gPT0gREFEX0FCT1JUKSB7CisJCWluNl9pZmFfaG9sZChpZnApOwogCQlhZGRyY29uZl9kYWRfc3RvcChpZnAsIDEpOworCQlpZiAoZGlzYWJsZV9pcHY2KQorCQkJYWRkcmNvbmZfaWZkb3duKGlkZXYtPmRldiwgMCk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMzkzMiw3ICszOTc0LDcgQEAKIAlzZW5kX21sZCA9IGlmcC0+c2NvcGUgPT0gSUZBX0xJTksgJiYgaXB2Nl9sb25lbHlfbGxhZGRyKGlmcCk7CiAJc2VuZF9ycyA9IHNlbmRfbWxkICYmCiAJCSAgaXB2Nl9hY2NlcHRfcmEoaWZwLT5pZGV2KSAmJgotCQkgIGlmcC0+aWRldi0+Y25mLnJ0cl9zb2xpY2l0cyA+IDAgJiYKKwkJICBpZnAtPmlkZXYtPmNuZi5ydHJfc29saWNpdHMgIT0gMCAmJgogCQkgIChkZXYtPmZsYWdzJklGRl9MT09QQkFDSykgPT0gMDsKIAlyZWFkX3VubG9ja19iaCgmaWZwLT5pZGV2LT5sb2NrKTsKIApAQCAtMzk1NCwxMCArMzk5NiwxMSBAQAogCiAJCXdyaXRlX2xvY2tfYmgoJmlmcC0+aWRldi0+bG9jayk7CiAJCXNwaW5fbG9jaygmaWZwLT5sb2NrKTsKKwkJaWZwLT5pZGV2LT5yc19pbnRlcnZhbCA9IHJmYzMzMTVfczE0X2JhY2tvZmZfaW5pdCgKKwkJCWlmcC0+aWRldi0+Y25mLnJ0cl9zb2xpY2l0X2ludGVydmFsKTsKIAkJaWZwLT5pZGV2LT5yc19wcm9iZXMgPSAxOwogCQlpZnAtPmlkZXYtPmlmX2ZsYWdzIHw9IElGX1JTX1NFTlQ7Ci0JCWFkZHJjb25mX21vZF9yc190aW1lcihpZnAtPmlkZXYsCi0JCQkJICAgICAgaWZwLT5pZGV2LT5jbmYucnRyX3NvbGljaXRfaW50ZXJ2YWwpOworCQlhZGRyY29uZl9tb2RfcnNfdGltZXIoaWZwLT5pZGV2LCBpZnAtPmlkZXYtPnJzX2ludGVydmFsKTsKIAkJc3Bpbl91bmxvY2soJmlmcC0+bG9jayk7CiAJCXdyaXRlX3VubG9ja19iaCgmaWZwLT5pZGV2LT5sb2NrKTsKIAl9CkBAIC00ODc0LDYgKzQ5MTcsOCBAQAogCWFycmF5W0RFVkNPTkZfUlRSX1NPTElDSVRTXSA9IGNuZi0+cnRyX3NvbGljaXRzOwogCWFycmF5W0RFVkNPTkZfUlRSX1NPTElDSVRfSU5URVJWQUxdID0KIAkJamlmZmllc190b19tc2VjcyhjbmYtPnJ0cl9zb2xpY2l0X2ludGVydmFsKTsKKwlhcnJheVtERVZDT05GX1JUUl9TT0xJQ0lUX01BWF9JTlRFUlZBTF0gPQorCQlqaWZmaWVzX3RvX21zZWNzKGNuZi0+cnRyX3NvbGljaXRfbWF4X2ludGVydmFsKTsKIAlhcnJheVtERVZDT05GX1JUUl9TT0xJQ0lUX0RFTEFZXSA9CiAJCWppZmZpZXNfdG9fbXNlY3MoY25mLT5ydHJfc29saWNpdF9kZWxheSk7CiAJYXJyYXlbREVWQ09ORl9GT1JDRV9NTERfVkVSU0lPTl0gPSBjbmYtPmZvcmNlX21sZF92ZXJzaW9uOwpAQCAtNDk0NCwxOCArNDk4OSwxOCBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19zbm1wNl9maWxsX3N0YXRzZGV2KHU2NCAqc3RhdHMsIGF0b21pY19sb25nX3QgKm1pYiwKLQkJCQkgICAgICBpbnQgaXRlbXMsIGludCBieXRlcykKKwkJCQkJaW50IGJ5dGVzKQogewogCWludCBpOwotCWludCBwYWQgPSBieXRlcyAtIHNpemVvZih1NjQpICogaXRlbXM7CisJaW50IHBhZCA9IGJ5dGVzIC0gc2l6ZW9mKHU2NCkgKiBJQ01QNl9NSUJfTUFYOwogCUJVR19PTihwYWQgPCAwKTsKIAogCS8qIFVzZSBwdXRfdW5hbGlnbmVkKCkgYmVjYXVzZSBzdGF0cyBtYXkgbm90IGJlIGFsaWduZWQgZm9yIHU2NC4gKi8KLQlwdXRfdW5hbGlnbmVkKGl0ZW1zLCAmc3RhdHNbMF0pOwotCWZvciAoaSA9IDE7IGkgPCBpdGVtczsgaSsrKQorCXB1dF91bmFsaWduZWQoSUNNUDZfTUlCX01BWCwgJnN0YXRzWzBdKTsKKwlmb3IgKGkgPSAxOyBpIDwgSUNNUDZfTUlCX01BWDsgaSsrKQogCQlwdXRfdW5hbGlnbmVkKGF0b21pY19sb25nX3JlYWQoJm1pYltpXSksICZzdGF0c1tpXSk7CiAKLQltZW1zZXQoJnN0YXRzW2l0ZW1zXSwgMCwgcGFkKTsKKwltZW1zZXQoJnN0YXRzW0lDTVA2X01JQl9NQVhdLCAwLCBwYWQpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19zbm1wNl9maWxsX3N0YXRzNjQodTY0ICpzdGF0cywgdm9pZCBfX3BlcmNwdSAqbWliLApAQCAtNDk4OCw3ICs1MDMzLDcgQEAKIAkJCQkgICAgIG9mZnNldG9mKHN0cnVjdCBpcHN0YXRzX21pYiwgc3luY3ApKTsKIAkJYnJlYWs7CiAJY2FzZSBJRkxBX0lORVQ2X0lDTVA2U1RBVFM6Ci0JCV9fc25tcDZfZmlsbF9zdGF0c2RldihzdGF0cywgaWRldi0+c3RhdHMuaWNtcHY2ZGV2LT5taWJzLCBJQ01QNl9NSUJfTUFYLCBieXRlcyk7CisJCV9fc25tcDZfZmlsbF9zdGF0c2RldihzdGF0cywgaWRldi0+c3RhdHMuaWNtcHY2ZGV2LT5taWJzLCBieXRlcyk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTUwODIsNyArNTEyNyw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCWlmICghaXB2Nl9hY2NlcHRfcmEoaWRldikpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChpZGV2LT5jbmYucnRyX3NvbGljaXRzIDw9IDApCisJaWYgKGlkZXYtPmNuZi5ydHJfc29saWNpdHMgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl3cml0ZV9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKQEAgLTUxMTEsOCArNTE1NiwxMCBAQAogCiAJaWYgKHVwZGF0ZV9ycykgewogCQlpZGV2LT5pZl9mbGFncyB8PSBJRl9SU19TRU5UOworCQlpZGV2LT5yc19pbnRlcnZhbCA9IHJmYzMzMTVfczE0X2JhY2tvZmZfaW5pdCgKKwkJCWlkZXYtPmNuZi5ydHJfc29saWNpdF9pbnRlcnZhbCk7CiAJCWlkZXYtPnJzX3Byb2JlcyA9IDE7Ci0JCWFkZHJjb25mX21vZF9yc190aW1lcihpZGV2LCBpZGV2LT5jbmYucnRyX3NvbGljaXRfaW50ZXJ2YWwpOworCQlhZGRyY29uZl9tb2RfcnNfdGltZXIoaWRldiwgaWRldi0+cnNfaW50ZXJ2YWwpOwogCX0KIAogCS8qIFdlbGwsIHRoYXQncyBraW5kYSBuYXN0eSAuLi4gKi8KQEAgLTU0NTAsMjAgKzU0OTcsNiBAQAogfQogCiBzdGF0aWMKLWludCBhZGRyY29uZl9zeXNjdGxfaG9wX2xpbWl0KHN0cnVjdCBjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGN0bF90YWJsZSBsY3RsOwotCWludCBtaW5faGwgPSAxLCBtYXhfaGwgPSAyNTU7Ci0KLQlsY3RsID0gKmN0bDsKLQlsY3RsLmV4dHJhMSA9ICZtaW5faGw7Ci0JbGN0bC5leHRyYTIgPSAmbWF4X2hsOwotCi0JcmV0dXJuIHByb2NfZG9pbnR2ZWNfbWlubWF4KCZsY3RsLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKLX0KLQotc3RhdGljCiBpbnQgYWRkcmNvbmZfc3lzY3RsX210dShzdHJ1Y3QgY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwKIAkJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewpAQCAtNTY5Niw2ICs1NzI5LDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgY29uc3QgaW50IG9uZSA9IDE7CitzdGF0aWMgY29uc3QgaW50IHR3b19maXZlX2ZpdmUgPSAyNTU7CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlIGFkZHJjb25mX3N5c2N0bFtdID0gewogCXsKIAkJLnByb2NuYW1lCT0gImZvcndhcmRpbmciLApAQCAtNTcwOSw3ICs1NzQ1LDkgQEAKIAkJLmRhdGEJCT0gJmlwdjZfZGV2Y29uZi5ob3BfbGltaXQsCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBhZGRyY29uZl9zeXNjdGxfaG9wX2xpbWl0LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5leHRyYTEJCT0gKHZvaWQgKikmb25lLAorCQkuZXh0cmEyCQk9ICh2b2lkICopJnR3b19maXZlX2ZpdmUsCiAJfSwKIAl7CiAJCS5wcm9jbmFtZQk9ICJtdHUiLApAQCAtNTc2MSw2ICs1Nzk5LDEzIEBACiAJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMsCiAJfSwKIAl7CisJCS5wcm9jbmFtZQk9ICJyb3V0ZXJfc29saWNpdGF0aW9uX21heF9pbnRlcnZhbCIsCisJCS5kYXRhCQk9ICZpcHY2X2RldmNvbmYucnRyX3NvbGljaXRfbWF4X2ludGVydmFsLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJewogCQkucHJvY25hbWUJPSAicm91dGVyX3NvbGljaXRhdGlvbl9kZWxheSIsCiAJCS5kYXRhCQk9ICZpcHY2X2RldmNvbmYucnRyX3NvbGljaXRfZGVsYXksCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCkBAIC02MDE3LDcgKzYwNjIsNyBAQAogc3RhdGljIGludCBfX2FkZHJjb25mX3N5c2N0bF9yZWdpc3RlcihzdHJ1Y3QgbmV0ICpuZXQsIGNoYXIgKmRldl9uYW1lLAogCQlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2LCBzdHJ1Y3QgaXB2Nl9kZXZjb25mICpwKQogewotCWludCBpOworCWludCBpLCBpZmluZGV4OwogCXN0cnVjdCBjdGxfdGFibGUgKnRhYmxlOwogCWNoYXIgcGF0aFtzaXplb2YoIm5ldC9pcHY2L2NvbmYvIikgKyBJRk5BTVNJWl07CiAKQEAgLTYwMjcsOCArNjA3MiwxNCBAQAogCiAJZm9yIChpID0gMDsgdGFibGVbaV0uZGF0YTsgaSsrKSB7CiAJCXRhYmxlW2ldLmRhdGEgKz0gKGNoYXIgKilwIC0gKGNoYXIgKikmaXB2Nl9kZXZjb25mOwotCQl0YWJsZVtpXS5leHRyYTEgPSBpZGV2OyAvKiBlbWJlZGRlZDsgbm8gcmVmICovCi0JCXRhYmxlW2ldLmV4dHJhMiA9IG5ldDsKKwkJLyogSWYgb25lIG9mIHRoZXNlIGlzIGFscmVhZHkgc2V0LCB0aGVuIGl0IGlzIG5vdCBzYWZlIHRvCisJCSAqIG92ZXJ3cml0ZSBlaXRoZXIgb2YgdGhlbTogdGhpcyBtYWtlcyBwcm9jX2RvaW50dmVjX21pbm1heAorCQkgKiB1c2FibGUuCisJCSAqLworCQlpZiAoIXRhYmxlW2ldLmV4dHJhMSAmJiAhdGFibGVbaV0uZXh0cmEyKSB7CisJCQl0YWJsZVtpXS5leHRyYTEgPSBpZGV2OyAvKiBlbWJlZGRlZDsgbm8gcmVmICovCisJCQl0YWJsZVtpXS5leHRyYTIgPSBuZXQ7CisJCX0KIAl9CiAKIAlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICJuZXQvaXB2Ni9jb25mLyVzIiwgZGV2X25hbWUpOwpAQCAtNjAzNyw2ICs2MDg4LDEzIEBACiAJaWYgKCFwLT5zeXNjdGxfaGVhZGVyKQogCQlnb3RvIGZyZWU7CiAKKwlpZiAoIXN0cmNtcChkZXZfbmFtZSwgImFsbCIpKQorCQlpZmluZGV4ID0gTkVUQ09ORkFfSUZJTkRFWF9BTEw7CisJZWxzZSBpZiAoIXN0cmNtcChkZXZfbmFtZSwgImRlZmF1bHQiKSkKKwkJaWZpbmRleCA9IE5FVENPTkZBX0lGSU5ERVhfREVGQVVMVDsKKwllbHNlCisJCWlmaW5kZXggPSBpZGV2LT5kZXYtPmlmaW5kZXg7CisJaW5ldDZfbmV0Y29uZl9ub3RpZnlfZGV2Y29uZihuZXQsIE5FVENPTkZBX0FMTCwgaWZpbmRleCwgcCk7CiAJcmV0dXJuIDA7CiAKIGZyZWU6CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZl9pbmV0Ni5jIGIvbmV0L2lwdjYvYWZfaW5ldDYuYwppbmRleCBiNDU0MDU1Li40NmFkNjk5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZl9pbmV0Ni5jCisrKyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKQEAgLTU0NSw2ICs1NDUsOCBAQAogCS5tbWFwCQkgICA9IHNvY2tfbm9fbW1hcCwKIAkuc2VuZHBhZ2UJICAgPSBpbmV0X3NlbmRwYWdlLAogCS5zcGxpY2VfcmVhZAkgICA9IHRjcF9zcGxpY2VfcmVhZCwKKwkucmVhZF9zb2NrCSAgID0gdGNwX3JlYWRfc29jaywKKwkucGVla19sZW4JICAgPSB0Y3BfcGVla19sZW4sCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfc2V0c29ja29wdCA9IGNvbXBhdF9zb2NrX2NvbW1vbl9zZXRzb2Nrb3B0LAogCS5jb21wYXRfZ2V0c29ja29wdCA9IGNvbXBhdF9zb2NrX2NvbW1vbl9nZXRzb2Nrb3B0LApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvY2FsaXBzby5jIGIvbmV0L2lwdjYvY2FsaXBzby5jCmluZGV4IGM1M2I5MmMuLjM3YWM5ZGUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2NhbGlwc28uYworKysgYi9uZXQvaXB2Ni9jYWxpcHNvLmMKQEAgLTk1Miw4ICs5NTIsMTAgQEAKIAkJbWVtY3B5KG5ldywgaG9wLCBzdGFydCk7CiAJcmV0X3ZhbCA9IGNhbGlwc29fZ2Vub3B0KCh1bnNpZ25lZCBjaGFyICopbmV3LCBzdGFydCwgYnVmX2xlbiwgZG9pX2RlZiwKIAkJCQkgc2VjYXR0cik7Ci0JaWYgKHJldF92YWwgPCAwKQorCWlmIChyZXRfdmFsIDwgMCkgeworCQlrZnJlZShuZXcpOwogCQlyZXR1cm4gRVJSX1BUUihyZXRfdmFsKTsKKwl9CiAKIAlidWZfbGVuID0gc3RhcnQgKyByZXRfdmFsOwogCS8qIEF0IHRoaXMgcG9pbnQgYnVmX2xlbiBhbGlnbnMgdG8gNG4sIHNvIChidWZfbGVuICYgNCkgcGFkcyB0byA4biAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZmliNl9ydWxlcy5jIGIvbmV0L2lwdjYvZmliNl9ydWxlcy5jCmluZGV4IDU4NTdjMWYuLmVlYTIzYjUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2ZpYjZfcnVsZXMuYworKysgYi9uZXQvaXB2Ni9maWI2X3J1bGVzLmMKQEAgLTM4LDYgKzM4LDkgQEAKIAkJLmZsYWdzID0gRklCX0xPT0tVUF9OT1JFRiwKIAl9OwogCisJLyogdXBkYXRlIGZsb3cgaWYgb2lmIG9yIGlpZiBwb2ludCB0byBkZXZpY2UgZW5zbGF2ZWQgdG8gbDNtZGV2ICovCisJbDNtZGV2X3VwZGF0ZV9mbG93KG5ldCwgZmxvd2k2X3RvX2Zsb3dpKGZsNikpOworCiAJZmliX3J1bGVzX2xvb2t1cChuZXQtPmlwdjYuZmliNl9ydWxlc19vcHMsCiAJCQkgZmxvd2k2X3RvX2Zsb3dpKGZsNiksIGZsYWdzLCAmYXJnKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaWxhL2lsYV9jb21tb24uYyBiL25ldC9pcHY2L2lsYS9pbGFfY29tbW9uLmMKaW5kZXggZWM5ZWZiYy4uYWJhMDk5OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaWxhL2lsYV9jb21tb24uYworKysgYi9uZXQvaXB2Ni9pbGEvaWxhX2NvbW1vbi5jCkBAIC0xNzIsNiArMTcyLDUgQEAKIAogbW9kdWxlX2luaXQoaWxhX2luaXQpOwogbW9kdWxlX2V4aXQoaWxhX2ZpbmkpOwotTU9EVUxFX0FMSUFTX1JUTkxfTFdUKElMQSk7CiBNT0RVTEVfQVVUSE9SKCJUb20gSGVyYmVydCA8dG9tQGhlcmJlcnRsYW5kLmNvbT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lsYS9pbGFfbHd0LmMgYi9uZXQvaXB2Ni9pbGEvaWxhX2x3dC5jCmluZGV4IGM4MzE0YzYuLmU1MGMyN2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lsYS9pbGFfbHd0LmMKKysrIGIvbmV0L2lwdjYvaWxhL2lsYV9sd3QuYwpAQCAtNTEsNyArNTEsNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgaWxhX25sX3BvbGljeVtJTEFfQVRUUl9NQVggKyAxXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBpbGFfbmxfcG9saWN5W0lMQV9BVFRSX01BWCArIDFdID0gewogCVtJTEFfQVRUUl9MT0NBVE9SXSA9IHsgLnR5cGUgPSBOTEFfVTY0LCB9LAogCVtJTEFfQVRUUl9DU1VNX01PREVdID0geyAudHlwZSA9IE5MQV9VOCwgfSwKIH07CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pbGEvaWxhX3hsYXQuYyBiL25ldC9pcHY2L2lsYS9pbGFfeGxhdC5jCmluZGV4IGU2ZWNhNWYuLmU2MDQwMTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lsYS9pbGFfeGxhdC5jCisrKyBiL25ldC9pcHY2L2lsYS9pbGFfeGxhdC5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkucGFyYWxsZWxfb3BzCT0gdHJ1ZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbmxhX3BvbGljeSBpbGFfbmxfcG9saWN5W0lMQV9BVFRSX01BWCArIDFdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IGlsYV9ubF9wb2xpY3lbSUxBX0FUVFJfTUFYICsgMV0gPSB7CiAJW0lMQV9BVFRSX0xPQ0FUT1JdID0geyAudHlwZSA9IE5MQV9VNjQsIH0sCiAJW0lMQV9BVFRSX0xPQ0FUT1JfTUFUQ0hdID0geyAudHlwZSA9IE5MQV9VNjQsIH0sCiAJW0lMQV9BVFRSX0lGSU5ERVhdID0geyAudHlwZSA9IE5MQV9VMzIsIH0sCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfZmliLmMgYi9uZXQvaXB2Ni9pcDZfZmliLmMKaW5kZXggNzcxYmUxZi4uZWY1NDg1MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2ZpYi5jCisrKyBiL25ldC9pcHY2L2lwNl9maWIuYwpAQCAtNzQzLDYgKzc0Myw3IEBACiAJCSAgIChpbmZvLT5ubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfQ1JFQVRFKSk7CiAJaW50IGZvdW5kID0gMDsKIAlib29sIHJ0X2Nhbl9lY21wID0gcnQ2X3F1YWxpZnlfZm9yX2VjbXAocnQpOworCXUxNiBubGZsYWdzID0gTkxNX0ZfRVhDTDsKIAlpbnQgZXJyOwogCiAJaW5zID0gJmZuLT5sZWFmOwpAQCAtNzU5LDYgKzc2MCw4IEBACiAJCQlpZiAoaW5mby0+bmxoICYmCiAJCQkgICAgKGluZm8tPm5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9FWENMKSkKIAkJCQlyZXR1cm4gLUVFWElTVDsKKworCQkJbmxmbGFncyAmPSB+TkxNX0ZfRVhDTDsKIAkJCWlmIChyZXBsYWNlKSB7CiAJCQkJaWYgKHJ0X2Nhbl9lY21wID09IHJ0Nl9xdWFsaWZ5X2Zvcl9lY21wKGl0ZXIpKSB7CiAJCQkJCWZvdW5kKys7CkBAIC04NTYsNiArODU5LDcgQEAKIAkJCXByX3dhcm4oIk5MTV9GX0NSRUFURSBzaG91bGQgYmUgc2V0IHdoZW4gY3JlYXRpbmcgbmV3IHJvdXRlXG4iKTsKIAogYWRkOgorCQlubGZsYWdzIHw9IE5MTV9GX0NSRUFURTsKIAkJZXJyID0gZmliNl9jb21taXRfbWV0cmljcygmcnQtPmRzdCwgbXhjKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CkBAIC04NjQsNyArODY4LDcgQEAKIAkJKmlucyA9IHJ0OwogCQlydC0+cnQ2aV9ub2RlID0gZm47CiAJCWF0b21pY19pbmMoJnJ0LT5ydDZpX3JlZik7Ci0JCWluZXQ2X3J0X25vdGlmeShSVE1fTkVXUk9VVEUsIHJ0LCBpbmZvLCAwKTsKKwkJaW5ldDZfcnRfbm90aWZ5KFJUTV9ORVdST1VURSwgcnQsIGluZm8sIG5sZmxhZ3MpOwogCQlpbmZvLT5ubF9uZXQtPmlwdjYucnQ2X3N0YXRzLT5maWJfcnRfZW50cmllcysrOwogCiAJCWlmICghKGZuLT5mbl9mbGFncyAmIFJUTl9SVElORk8pKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfZ3JlLmMgYi9uZXQvaXB2Ni9pcDZfZ3JlLmMKaW5kZXggNzc2ZDE0NS4uZDdkNmQzYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2dyZS5jCisrKyBiL25ldC9pcHY2L2lwNl9ncmUuYwpAQCAtNjEsMTIgKzYxLDEyIEBACiBtb2R1bGVfcGFyYW0obG9nX2Vjbl9lcnJvciwgYm9vbCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxvZ19lY25fZXJyb3IsICJMb2cgcGFja2V0cyByZWNlaXZlZCB3aXRoIGNvcnJ1cHRlZCBFQ04iKTsKIAotI2RlZmluZSBIQVNIX1NJWkVfU0hJRlQgIDUKLSNkZWZpbmUgSEFTSF9TSVpFICgxIDw8IEhBU0hfU0laRV9TSElGVCkKKyNkZWZpbmUgSVA2X0dSRV9IQVNIX1NJWkVfU0hJRlQgIDUKKyNkZWZpbmUgSVA2X0dSRV9IQVNIX1NJWkUgKDEgPDwgSVA2X0dSRV9IQVNIX1NJWkVfU0hJRlQpCiAKIHN0YXRpYyBpbnQgaXA2Z3JlX25ldF9pZCBfX3JlYWRfbW9zdGx5Owogc3RydWN0IGlwNmdyZV9uZXQgewotCXN0cnVjdCBpcDZfdG5sIF9fcmN1ICp0dW5uZWxzWzRdW0hBU0hfU0laRV07CisJc3RydWN0IGlwNl90bmwgX19yY3UgKnR1bm5lbHNbNF1bSVA2X0dSRV9IQVNIX1NJWkVdOwogCiAJc3RydWN0IG5ldF9kZXZpY2UgKmZiX3R1bm5lbF9kZXY7CiB9OwpAQCAtOTYsMTIgKzk2LDEyIEBACiAgICB3aWxsIG1hdGNoIGZhbGxiYWNrIHR1bm5lbC4KICAqLwogCi0jZGVmaW5lIEhBU0hfS0VZKGtleSkgKCgoX19mb3JjZSB1MzIpa2V5XigoX19mb3JjZSB1MzIpa2V5Pj40KSkmKEhBU0hfU0laRSAtIDEpKQorI2RlZmluZSBIQVNIX0tFWShrZXkpICgoKF9fZm9yY2UgdTMyKWtleV4oKF9fZm9yY2UgdTMyKWtleT4+NCkpJihJUDZfR1JFX0hBU0hfU0laRSAtIDEpKQogc3RhdGljIHUzMiBIQVNIX0FERFIoY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyKQogewogCXUzMiBoYXNoID0gaXB2Nl9hZGRyX2hhc2goYWRkcik7CiAKLQlyZXR1cm4gaGFzaF8zMihoYXNoLCBIQVNIX1NJWkVfU0hJRlQpOworCXJldHVybiBoYXNoXzMyKGhhc2gsIElQNl9HUkVfSEFTSF9TSVpFX1NISUZUKTsKIH0KIAogI2RlZmluZSB0dW5uZWxzX3JfbAl0dW5uZWxzWzNdCkBAIC01MTksOCArNTE5LDYgQEAKIAlncmVfYnVpbGRfaGVhZGVyKHNrYiwgdHVubmVsLT50dW5faGxlbiwgdHVubmVsLT5wYXJtcy5vX2ZsYWdzLAogCQkJIHByb3RvY29sLCB0dW5uZWwtPnBhcm1zLm9fa2V5LCBodG9ubCh0dW5uZWwtPm9fc2Vxbm8pKTsKIAotCXNrYl9zZXRfaW5uZXJfcHJvdG9jb2woc2tiLCBwcm90b2NvbCk7Ci0KIAlyZXR1cm4gaXA2X3RubF94bWl0KHNrYiwgZGV2LCBkc2ZpZWxkLCBmbDYsIGVuY2FwX2xpbWl0LCBwbXR1LAogCQkJICAgIE5FWFRIRFJfR1JFKTsKIH0KQEAgLTY1MCw3ICs2NDgsNiBAQAogCQllbmNhcF9saW1pdCA9IHQtPnBhcm1zLmVuY2FwX2xpbWl0OwogCiAJbWVtY3B5KCZmbDYsICZ0LT5mbC51LmlwNiwgc2l6ZW9mKGZsNikpOwotCWZsNi5mbG93aTZfcHJvdG8gPSBza2ItPnByb3RvY29sOwogCiAJZXJyID0gZ3JlX2hhbmRsZV9vZmZsb2Fkcyhza2IsICEhKHQtPnBhcm1zLm9fZmxhZ3MgJiBUVU5ORUxfQ1NVTSkpOwogCWlmIChlcnIpCkBAIC0xMDg5LDcgKzEwODYsNyBAQAogCiAJZm9yIChwcmlvID0gMDsgcHJpbyA8IDQ7IHByaW8rKykgewogCQlpbnQgaDsKLQkJZm9yIChoID0gMDsgaCA8IEhBU0hfU0laRTsgaCsrKSB7CisJCWZvciAoaCA9IDA7IGggPCBJUDZfR1JFX0hBU0hfU0laRTsgaCsrKSB7CiAJCQlzdHJ1Y3QgaXA2X3RubCAqdDsKIAogCQkJdCA9IHJ0bmxfZGVyZWZlcmVuY2UoaWduLT50dW5uZWxzW3ByaW9dW2hdKTsKQEAgLTEyNDEsNyArMTIzOCw3IEBACiAJCXBhcm1zLT5lbmNhcF9saW1pdCA9IG5sYV9nZXRfdTgoZGF0YVtJRkxBX0dSRV9FTkNBUF9MSU1JVF0pOwogCiAJaWYgKGRhdGFbSUZMQV9HUkVfRkxPV0lORk9dKQotCQlwYXJtcy0+Zmxvd2luZm8gPSBubGFfZ2V0X3UzMihkYXRhW0lGTEFfR1JFX0ZMT1dJTkZPXSk7CisJCXBhcm1zLT5mbG93aW5mbyA9IG5sYV9nZXRfYmUzMihkYXRhW0lGTEFfR1JFX0ZMT1dJTkZPXSk7CiAKIAlpZiAoZGF0YVtJRkxBX0dSRV9GTEFHU10pCiAJCXBhcm1zLT5mbGFncyA9IG5sYV9nZXRfdTMyKGRhdGFbSUZMQV9HUkVfRkxBR1NdKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9vZmZsb2FkLmMgYi9uZXQvaXB2Ni9pcDZfb2ZmbG9hZC5jCmluZGV4IDIyZTkwZTUuLmU3YmZkNTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9vZmZsb2FkLmMKKysrIGIvbmV0L2lwdjYvaXA2X29mZmxvYWQuYwpAQCAtNjksNiArNjksNyBAQAogCWludCBvZmZzZXQgPSAwOwogCWJvb2wgZW5jYXAsIHVkcGZyYWc7CiAJaW50IG5ob2ZmOworCWJvb2wgZ3NvX3BhcnRpYWw7CiAKIAlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAluaG9mZiA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpIC0gc2tiX21hY19oZWFkZXIoc2tiKTsKQEAgLTEwMSw5ICsxMDIsMTEgQEAKIAlpZiAoSVNfRVJSKHNlZ3MpKQogCQlnb3RvIG91dDsKIAorCWdzb19wYXJ0aWFsID0gISEoc2tiX3NoaW5mbyhzZWdzKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1BBUlRJQUwpOworCiAJZm9yIChza2IgPSBzZWdzOyBza2I7IHNrYiA9IHNrYi0+bmV4dCkgewogCQlpcHY2aCA9IChzdHJ1Y3QgaXB2NmhkciAqKShza2JfbWFjX2hlYWRlcihza2IpICsgbmhvZmYpOwotCQlpZiAoc2tiX2lzX2dzbyhza2IpKQorCQlpZiAoZ3NvX3BhcnRpYWwpCiAJCQlwYXlsb2FkX2xlbiA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgKwogCQkJCSAgICAgIFNLQl9HU09fQ0Ioc2tiKS0+ZGF0YV9vZmZzZXQgKwogCQkJCSAgICAgIHNrYi0+aGVhZCAtICh1bnNpZ25lZCBjaGFyICopKGlwdjZoICsgMSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKaW5kZXggMWRmYzQwMi4uNjAwMWU3OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X291dHB1dC5jCisrKyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwpAQCAtNTYsNiArNTYsNyBAQAogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPGxpbnV4L21yb3V0ZTYuaD4KICNpbmNsdWRlIDxuZXQvbDNtZGV2Lmg+CisjaW5jbHVkZSA8bmV0L2x3dHVubmVsLmg+CiAKIHN0YXRpYyBpbnQgaXA2X2ZpbmlzaF9vdXRwdXQyKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMTA0LDYgKzEwNSwxMyBAQAogCQl9CiAJfQogCisJaWYgKGx3dHVubmVsX3htaXRfcmVkaXJlY3QoZHN0LT5sd3RzdGF0ZSkpIHsKKwkJaW50IHJlcyA9IGx3dHVubmVsX3htaXQoc2tiKTsKKworCQlpZiAocmVzIDwgMCB8fCByZXMgPT0gTFdUVU5ORUxfWE1JVF9ET05FKQorCQkJcmV0dXJuIHJlczsKKwl9CisKIAlyY3VfcmVhZF9sb2NrX2JoKCk7CiAJbmV4dGhvcCA9IHJ0Nl9uZXh0aG9wKChzdHJ1Y3QgcnQ2X2luZm8gKilkc3QsICZpcHY2X2hkcihza2IpLT5kYWRkcik7CiAJbmVpZ2ggPSBfX2lwdjZfbmVpZ2hfbG9va3VwX25vcmVmKGRzdC0+ZGV2LCBuZXh0aG9wKTsKQEAgLTIyOCw2ICsyMzYsMTQgQEAKIAlpZiAoKHNrYi0+bGVuIDw9IG10dSkgfHwgc2tiLT5pZ25vcmVfZGYgfHwgc2tiX2lzX2dzbyhza2IpKSB7CiAJCUlQNl9VUERfUE9fU1RBVFMobmV0LCBpcDZfZHN0X2lkZXYoc2tiX2RzdChza2IpKSwKIAkJCSAgICAgIElQU1RBVFNfTUlCX09VVCwgc2tiLT5sZW4pOworCisJCS8qIGlmIGVncmVzcyBkZXZpY2UgaXMgZW5zbGF2ZWQgdG8gYW4gTDMgbWFzdGVyIGRldmljZSBwYXNzIHRoZQorCQkgKiBza2IgdG8gaXRzIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcKKwkJICovCisJCXNrYiA9IGwzbWRldl9pcDZfb3V0KChzdHJ1Y3Qgc29jayAqKXNrLCBza2IpOworCQlpZiAodW5saWtlbHkoIXNrYikpCisJCQlyZXR1cm4gMDsKKwogCQkvKiBob29rcyBzaG91bGQgbmV2ZXIgYXNzdW1lIHNvY2tldCBsb2NrIGlzIGhlbGQuCiAJCSAqIHdlIHByb21vdGUgb3VyIHNvY2tldCB0byBub24gY29uc3QKIAkJICovCkBAIC05MTAsMTMgKzkyNiw2IEBACiAJaW50IGVycjsKIAlpbnQgZmxhZ3MgPSAwOwogCi0JaWYgKGlwdjZfYWRkcl9hbnkoJmZsNi0+c2FkZHIpICYmIGZsNi0+Zmxvd2k2X29pZiAmJgotCSAgICAoISpkc3QgfHwgISgqZHN0KS0+ZXJyb3IpKSB7Ci0JCWVyciA9IGwzbWRldl9nZXRfc2FkZHI2KG5ldCwgc2ssIGZsNik7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dF9lcnI7Ci0JfQotCiAJLyogVGhlIGNvcnJlY3Qgd2F5IHRvIGhhbmRsZSB0aGlzIHdvdWxkIGJlIHRvIGRvCiAJICogaXA2X3JvdXRlX2dldF9zYWRkciwgYW5kIHRoZW4gaXA2X3JvdXRlX291dHB1dDsgaG93ZXZlciwKIAkgKiB0aGUgcm91dGUtc3BlY2lmaWMgcHJlZmVycmVkIHNvdXJjZSBmb3JjZXMgdGhlCkBAIC0xMDA4LDcgKzEwMTcsNyBAQAogb3V0X2Vycl9yZWxlYXNlOgogCWRzdF9yZWxlYXNlKCpkc3QpOwogCSpkc3QgPSBOVUxMOwotb3V0X2VycjoKKwogCWlmIChlcnIgPT0gLUVORVRVTlJFQUNIKQogCQlJUDZfSU5DX1NUQVRTKG5ldCwgTlVMTCwgSVBTVEFUU19NSUJfT1VUTk9ST1VURVMpOwogCXJldHVybiBlcnI7CkBAIC0xMDU0LDggKzEwNjMsNiBAQAogCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCWlmIChmaW5hbF9kc3QpCiAJCWZsNi0+ZGFkZHIgPSAqZmluYWxfZHN0OwotCWlmICghZmw2LT5mbG93aTZfb2lmKQotCQlmbDYtPmZsb3dpNl9vaWYgPSBsM21kZXZfZmliX29pZihkc3QtPmRldik7CiAKIAlyZXR1cm4geGZybV9sb29rdXBfcm91dGUoc29ja19uZXQoc2spLCBkc3QsIGZsb3dpNl90b19mbG93aShmbDYpLCBzaywgMCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfdHVubmVsLmMgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKaW5kZXggN2IwNDgxZS4uNmE2NmFkYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCisrKyBiL25ldC9pcHY2L2lwNl90dW5uZWwuYwpAQCAtNTcsNiArNTcsNyBAQAogI2luY2x1ZGUgPG5ldC9pbmV0X2Vjbi5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L25ldG5zL2dlbmVyaWMuaD4KKyNpbmNsdWRlIDxuZXQvZHN0X21ldGFkYXRhLmg+CiAKIE1PRFVMRV9BVVRIT1IoIlZpbGxlIE51b3J2YWxhIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklQdjYgdHVubmVsaW5nIGRldmljZSIpOwpAQCAtNjQsOCArNjUsOCBAQAogTU9EVUxFX0FMSUFTX1JUTkxfTElOSygiaXA2dG5sIik7CiBNT0RVTEVfQUxJQVNfTkVUREVWKCJpcDZ0bmwwIik7CiAKLSNkZWZpbmUgSEFTSF9TSVpFX1NISUZUICA1Ci0jZGVmaW5lIEhBU0hfU0laRSAoMSA8PCBIQVNIX1NJWkVfU0hJRlQpCisjZGVmaW5lIElQNl9UVU5ORUxfSEFTSF9TSVpFX1NISUZUICA1CisjZGVmaW5lIElQNl9UVU5ORUxfSEFTSF9TSVpFICgxIDw8IElQNl9UVU5ORUxfSEFTSF9TSVpFX1NISUZUKQogCiBzdGF0aWMgYm9vbCBsb2dfZWNuX2Vycm9yID0gdHJ1ZTsKIG1vZHVsZV9wYXJhbShsb2dfZWNuX2Vycm9yLCBib29sLCAwNjQ0KTsKQEAgLTc1LDcgKzc2LDcgQEAKIHsKIAl1MzIgaGFzaCA9IGlwdjZfYWRkcl9oYXNoKGFkZHIxKSBeIGlwdjZfYWRkcl9oYXNoKGFkZHIyKTsKIAotCXJldHVybiBoYXNoXzMyKGhhc2gsIEhBU0hfU0laRV9TSElGVCk7CisJcmV0dXJuIGhhc2hfMzIoaGFzaCwgSVA2X1RVTk5FTF9IQVNIX1NJWkVfU0hJRlQpOwogfQogCiBzdGF0aWMgaW50IGlwNl90bmxfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CkBAIC04Nyw5ICs4OCwxMCBAQAogCS8qIHRoZSBJUHY2IHR1bm5lbCBmYWxsYmFjayBkZXZpY2UgKi8KIAlzdHJ1Y3QgbmV0X2RldmljZSAqZmJfdG5sX2RldjsKIAkvKiBsaXN0cyBmb3Igc3RvcmluZyB0dW5uZWxzIGluIHVzZSAqLwotCXN0cnVjdCBpcDZfdG5sIF9fcmN1ICp0bmxzX3JfbFtIQVNIX1NJWkVdOworCXN0cnVjdCBpcDZfdG5sIF9fcmN1ICp0bmxzX3JfbFtJUDZfVFVOTkVMX0hBU0hfU0laRV07CiAJc3RydWN0IGlwNl90bmwgX19yY3UgKnRubHNfd2NbMV07CiAJc3RydWN0IGlwNl90bmwgX19yY3UgKip0bmxzWzJdOworCXN0cnVjdCBpcDZfdG5sIF9fcmN1ICpjb2xsZWN0X21kX3R1bjsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXA2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTY2LDYgKzE2OCwxMCBAQAogCQkJcmV0dXJuIHQ7CiAJfQogCisJdCA9IHJjdV9kZXJlZmVyZW5jZShpcDZuLT5jb2xsZWN0X21kX3R1bik7CisJaWYgKHQpCisJCXJldHVybiB0OworCiAJdCA9IHJjdV9kZXJlZmVyZW5jZShpcDZuLT50bmxzX3djWzBdKTsKIAlpZiAodCAmJiAodC0+ZGV2LT5mbGFncyAmIElGRl9VUCkpCiAJCXJldHVybiB0OwpAQCAtMjA5LDYgKzIxNSw4IEBACiB7CiAJc3RydWN0IGlwNl90bmwgX19yY3UgKip0cCA9IGlwNl90bmxfYnVja2V0KGlwNm4sICZ0LT5wYXJtcyk7CiAKKwlpZiAodC0+cGFybXMuY29sbGVjdF9tZCkKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGlwNm4tPmNvbGxlY3RfbWRfdHVuLCB0KTsKIAlyY3VfYXNzaWduX3BvaW50ZXIodC0+bmV4dCAsIHJ0bmxfZGVyZWZlcmVuY2UoKnRwKSk7CiAJcmN1X2Fzc2lnbl9wb2ludGVyKCp0cCwgdCk7CiB9CkBAIC0yMjQsNiArMjMyLDkgQEAKIAlzdHJ1Y3QgaXA2X3RubCBfX3JjdSAqKnRwOwogCXN0cnVjdCBpcDZfdG5sICppdGVyOwogCisJaWYgKHQtPnBhcm1zLmNvbGxlY3RfbWQpCisJCXJjdV9hc3NpZ25fcG9pbnRlcihpcDZuLT5jb2xsZWN0X21kX3R1biwgTlVMTCk7CisKIAlmb3IgKHRwID0gaXA2X3RubF9idWNrZXQoaXA2biwgJnQtPnBhcm1zKTsKIAkgICAgIChpdGVyID0gcnRubF9kZXJlZmVyZW5jZSgqdHApKSAhPSBOVUxMOwogCSAgICAgdHAgPSAmaXRlci0+bmV4dCkgewpAQCAtODI5LDYgKzg0MCw5IEBACiAKIAlza2Jfc2NydWJfcGFja2V0KHNrYiwgIW5ldF9lcSh0dW5uZWwtPm5ldCwgZGV2X25ldCh0dW5uZWwtPmRldikpKTsKIAorCWlmICh0dW5fZHN0KQorCQlza2JfZHN0X3NldChza2IsIChzdHJ1Y3QgZHN0X2VudHJ5ICopdHVuX2RzdCk7CisKIAlncm9fY2VsbHNfcmVjZWl2ZSgmdHVubmVsLT5ncm9fY2VsbHMsIHNrYik7CiAJcmV0dXJuIDA7CiAKQEAgLTg2NSw2ICs4NzksNyBAQAogewogCXN0cnVjdCBpcDZfdG5sICp0OwogCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcHY2aCA9IGlwdjZfaGRyKHNrYik7CisJc3RydWN0IG1ldGFkYXRhX2RzdCAqdHVuX2RzdCA9IE5VTEw7CiAJaW50IHJldCA9IC0xOwogCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtODgxLDcgKzg5NiwxMiBAQAogCQkJZ290byBkcm9wOwogCQlpZiAoaXB0dW5uZWxfcHVsbF9oZWFkZXIoc2tiLCAwLCB0cGktPnByb3RvLCBmYWxzZSkpCiAJCQlnb3RvIGRyb3A7Ci0JCXJldCA9IF9faXA2X3RubF9yY3YodCwgc2tiLCB0cGksIE5VTEwsIGRzY3BfZWNuX2RlY2Fwc3VsYXRlLAorCQlpZiAodC0+cGFybXMuY29sbGVjdF9tZCkgeworCQkJdHVuX2RzdCA9IGlwdjZfdHVuX3J4X2RzdChza2IsIDAsIDAsIDApOworCQkJaWYgKCF0dW5fZHN0KQorCQkJCXJldHVybiAwOworCQl9CisJCXJldCA9IF9faXA2X3RubF9yY3YodCwgc2tiLCB0cGksIHR1bl9kc3QsIGRzY3BfZWNuX2RlY2Fwc3VsYXRlLAogCQkJCSAgICBsb2dfZWNuX2Vycm9yKTsKIAl9CiAKQEAgLTEwMTIsOCArMTAzMiwxNiBAQAogCWludCBtdHU7CiAJdW5zaWduZWQgaW50IHBzaF9obGVuID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIHQtPmVuY2FwX2hsZW47CiAJdW5zaWduZWQgaW50IG1heF9oZWFkcm9vbSA9IHBzaF9obGVuOworCXU4IGhvcF9saW1pdDsKIAlpbnQgZXJyID0gLTE7CiAKKwlpZiAodC0+cGFybXMuY29sbGVjdF9tZCkgeworCQlob3BfbGltaXQgPSBza2JfdHVubmVsX2luZm8oc2tiKS0+a2V5LnR0bDsKKwkJZ290byByb3V0ZV9sb29rdXA7CisJfSBlbHNlIHsKKwkJaG9wX2xpbWl0ID0gdC0+cGFybXMuaG9wX2xpbWl0OworCX0KKwogCS8qIE5CTUEgdHVubmVsICovCiAJaWYgKGlwdjZfYWRkcl9hbnkoJnQtPnBhcm1zLnJhZGRyKSkgewogCQlzdHJ1Y3QgaW42X2FkZHIgKmFkZHI2OwpAQCAtMTA0Myw2ICsxMDcxLDcgQEAKIAkJZ290byB0eF9lcnJfbGlua19mYWlsdXJlOwogCiAJaWYgKCFkc3QpIHsKK3JvdXRlX2xvb2t1cDoKIAkJZHN0ID0gaXA2X3JvdXRlX291dHB1dChuZXQsIE5VTEwsIGZsNik7CiAKIAkJaWYgKGRzdC0+ZXJyb3IpCkBAIC0xMDUzLDYgKzEwODIsMTAgQEAKIAkJCWRzdCA9IE5VTEw7CiAJCQlnb3RvIHR4X2Vycl9saW5rX2ZhaWx1cmU7CiAJCX0KKwkJaWYgKHQtPnBhcm1zLmNvbGxlY3RfbWQgJiYKKwkJICAgIGlwdjZfZGV2X2dldF9zYWRkcihuZXQsIGlwNl9kc3RfaWRldihkc3QpLT5kZXYsCisJCQkJICAgICAgICZmbDYtPmRhZGRyLCAwLCAmZmw2LT5zYWRkcikpCisJCQlnb3RvIHR4X2Vycl9saW5rX2ZhaWx1cmU7CiAJCW5kc3QgPSBkc3Q7CiAJfQogCkBAIC0xMDcxLDcgKzExMDQsNyBAQAogCX0KIAlpZiAobXR1IDwgSVBWNl9NSU5fTVRVKQogCQltdHUgPSBJUFY2X01JTl9NVFU7Ci0JaWYgKHNrYl9kc3Qoc2tiKSkKKwlpZiAoc2tiX2RzdChza2IpICYmICF0LT5wYXJtcy5jb2xsZWN0X21kKQogCQlza2JfZHN0KHNrYiktPm9wcy0+dXBkYXRlX3BtdHUoc2tiX2RzdChza2IpLCBOVUxMLCBza2IsIG10dSk7CiAJaWYgKHNrYi0+bGVuID4gbXR1ICYmICFza2JfaXNfZ3NvKHNrYikpIHsKIAkJKnBtdHUgPSBtdHU7CkBAIC0xMTExLDggKzExNDQsMTMgQEAKIAkJc2tiID0gbmV3X3NrYjsKIAl9CiAKLQlpZiAoIWZsNi0+Zmxvd2k2X21hcmsgJiYgbmRzdCkKLQkJZHN0X2NhY2hlX3NldF9pcDYoJnQtPmRzdF9jYWNoZSwgbmRzdCwgJmZsNi0+c2FkZHIpOworCWlmICh0LT5wYXJtcy5jb2xsZWN0X21kKSB7CisJCWlmICh0LT5lbmNhcC50eXBlICE9IFRVTk5FTF9FTkNBUF9OT05FKQorCQkJZ290byB0eF9lcnJfZHN0X3JlbGVhc2U7CisJfSBlbHNlIHsKKwkJaWYgKCFmbDYtPmZsb3dpNl9tYXJrICYmIG5kc3QpCisJCQlkc3RfY2FjaGVfc2V0X2lwNigmdC0+ZHN0X2NhY2hlLCBuZHN0LCAmZmw2LT5zYWRkcik7CisJfQogCXNrYl9kc3Rfc2V0KHNrYiwgZHN0KTsKIAogCWlmIChlbmNhcF9saW1pdCA+PSAwKSB7CkBAIC0xMTM3LDcgKzExNzUsNyBAQAogCWlwdjZoID0gaXB2Nl9oZHIoc2tiKTsKIAlpcDZfZmxvd19oZHIoaXB2NmgsIElORVRfRUNOX2VuY2Fwc3VsYXRlKDAsIGRzZmllbGQpLAogCQkgICAgIGlwNl9tYWtlX2Zsb3dsYWJlbChuZXQsIHNrYiwgZmw2LT5mbG93bGFiZWwsIHRydWUsIGZsNikpOwotCWlwdjZoLT5ob3BfbGltaXQgPSB0LT5wYXJtcy5ob3BfbGltaXQ7CisJaXB2NmgtPmhvcF9saW1pdCA9IGhvcF9saW1pdDsKIAlpcHY2aC0+bmV4dGhkciA9IHByb3RvOwogCWlwdjZoLT5zYWRkciA9IGZsNi0+c2FkZHI7CiAJaXB2NmgtPmRhZGRyID0gZmw2LT5kYWRkcjsKQEAgLTExNzAsMTggKzEyMDgsMzQgQEAKIAlpZiAodHByb3RvICE9IElQUFJPVE9fSVBJUCAmJiB0cHJvdG8gIT0gMCkKIAkJcmV0dXJuIC0xOwogCi0JaWYgKCEodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfSUdOX0VOQ0FQX0xJTUlUKSkKLQkJZW5jYXBfbGltaXQgPSB0LT5wYXJtcy5lbmNhcF9saW1pdDsKLQotCW1lbWNweSgmZmw2LCAmdC0+ZmwudS5pcDYsIHNpemVvZihmbDYpKTsKLQogCWRzZmllbGQgPSBpcHY0X2dldF9kc2ZpZWxkKGlwaCk7CiAKLQlpZiAodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfVVNFX09SSUdfVENMQVNTKQotCQlmbDYuZmxvd2xhYmVsIHw9IGh0b25sKChfX3UzMilpcGgtPnRvcyA8PCBJUFY2X1RDTEFTU19TSElGVCkKLQkJCQkJICAmIElQVjZfVENMQVNTX01BU0s7Ci0JaWYgKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX1VTRV9PUklHX0ZXTUFSSykKLQkJZmw2LmZsb3dpNl9tYXJrID0gc2tiLT5tYXJrOworCWlmICh0LT5wYXJtcy5jb2xsZWN0X21kKSB7CisJCXN0cnVjdCBpcF90dW5uZWxfaW5mbyAqdHVuX2luZm87CisJCWNvbnN0IHN0cnVjdCBpcF90dW5uZWxfa2V5ICprZXk7CisKKwkJdHVuX2luZm8gPSBza2JfdHVubmVsX2luZm8oc2tiKTsKKwkJaWYgKHVubGlrZWx5KCF0dW5faW5mbyB8fCAhKHR1bl9pbmZvLT5tb2RlICYgSVBfVFVOTkVMX0lORk9fVFgpIHx8CisJCQkgICAgIGlwX3R1bm5lbF9pbmZvX2FmKHR1bl9pbmZvKSAhPSBBRl9JTkVUNikpCisJCQlyZXR1cm4gLTE7CisJCWtleSA9ICZ0dW5faW5mby0+a2V5OworCQltZW1zZXQoJmZsNiwgMCwgc2l6ZW9mKGZsNikpOworCQlmbDYuZmxvd2k2X3Byb3RvID0gSVBQUk9UT19JUElQOworCQlmbDYuZGFkZHIgPSBrZXktPnUuaXB2Ni5kc3Q7CisJCWZsNi5mbG93bGFiZWwgPSBrZXktPmxhYmVsOworCX0gZWxzZSB7CisJCWlmICghKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX0lHTl9FTkNBUF9MSU1JVCkpCisJCQllbmNhcF9saW1pdCA9IHQtPnBhcm1zLmVuY2FwX2xpbWl0OworCisJCW1lbWNweSgmZmw2LCAmdC0+ZmwudS5pcDYsIHNpemVvZihmbDYpKTsKKwkJZmw2LmZsb3dpNl9wcm90byA9IElQUFJPVE9fSVBJUDsKKworCQlpZiAodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfVVNFX09SSUdfVENMQVNTKQorCQkJZmw2LmZsb3dsYWJlbCB8PSBodG9ubCgoX191MzIpaXBoLT50b3MgPDwgSVBWNl9UQ0xBU1NfU0hJRlQpCisJCQkJCSAmIElQVjZfVENMQVNTX01BU0s7CisJCWlmICh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19GV01BUkspCisJCQlmbDYuZmxvd2k2X21hcmsgPSBza2ItPm1hcms7CisJfQogCiAJaWYgKGlwdHVubmVsX2hhbmRsZV9vZmZsb2Fkcyhza2IsIFNLQl9HU09fSVBYSVA2KSkKIAkJcmV0dXJuIC0xOwpAQCAtMTIxOSwyOCArMTI3Myw0NyBAQAogCSAgICBpcDZfdG5sX2FkZHJfY29uZmxpY3QodCwgaXB2NmgpKQogCQlyZXR1cm4gLTE7CiAKLQlvZmZzZXQgPSBpcDZfdG5sX3BhcnNlX3Rsdl9lbmNfbGltKHNrYiwgc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpOwotCWlmIChvZmZzZXQgPiAwKSB7Ci0JCXN0cnVjdCBpcHY2X3Rsdl90bmxfZW5jX2xpbSAqdGVsOwotCQl0ZWwgPSAoc3RydWN0IGlwdjZfdGx2X3RubF9lbmNfbGltICopJnNrYl9uZXR3b3JrX2hlYWRlcihza2IpW29mZnNldF07Ci0JCWlmICh0ZWwtPmVuY2FwX2xpbWl0ID09IDApIHsKLQkJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BBUkFNUFJPQiwKLQkJCQkgICAgSUNNUFY2X0hEUl9GSUVMRCwgb2Zmc2V0ICsgMik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZW5jYXBfbGltaXQgPSB0ZWwtPmVuY2FwX2xpbWl0IC0gMTsKLQl9IGVsc2UgaWYgKCEodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfSUdOX0VOQ0FQX0xJTUlUKSkKLQkJZW5jYXBfbGltaXQgPSB0LT5wYXJtcy5lbmNhcF9saW1pdDsKLQotCW1lbWNweSgmZmw2LCAmdC0+ZmwudS5pcDYsIHNpemVvZihmbDYpKTsKLQogCWRzZmllbGQgPSBpcHY2X2dldF9kc2ZpZWxkKGlwdjZoKTsKLQlpZiAodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfVVNFX09SSUdfVENMQVNTKQotCQlmbDYuZmxvd2xhYmVsIHw9ICgqKF9fYmUzMiAqKSBpcHY2aCAmIElQVjZfVENMQVNTX01BU0spOwotCWlmICh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19GTE9XTEFCRUwpCi0JCWZsNi5mbG93bGFiZWwgfD0gaXA2X2Zsb3dsYWJlbChpcHY2aCk7Ci0JaWYgKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX1VTRV9PUklHX0ZXTUFSSykKLQkJZmw2LmZsb3dpNl9tYXJrID0gc2tiLT5tYXJrOworCisJaWYgKHQtPnBhcm1zLmNvbGxlY3RfbWQpIHsKKwkJc3RydWN0IGlwX3R1bm5lbF9pbmZvICp0dW5faW5mbzsKKwkJY29uc3Qgc3RydWN0IGlwX3R1bm5lbF9rZXkgKmtleTsKKworCQl0dW5faW5mbyA9IHNrYl90dW5uZWxfaW5mbyhza2IpOworCQlpZiAodW5saWtlbHkoIXR1bl9pbmZvIHx8ICEodHVuX2luZm8tPm1vZGUgJiBJUF9UVU5ORUxfSU5GT19UWCkgfHwKKwkJCSAgICAgaXBfdHVubmVsX2luZm9fYWYodHVuX2luZm8pICE9IEFGX0lORVQ2KSkKKwkJCXJldHVybiAtMTsKKwkJa2V5ID0gJnR1bl9pbmZvLT5rZXk7CisJCW1lbXNldCgmZmw2LCAwLCBzaXplb2YoZmw2KSk7CisJCWZsNi5mbG93aTZfcHJvdG8gPSBJUFBST1RPX0lQVjY7CisJCWZsNi5kYWRkciA9IGtleS0+dS5pcHY2LmRzdDsKKwkJZmw2LmZsb3dsYWJlbCA9IGtleS0+bGFiZWw7CisJfSBlbHNlIHsKKwkJb2Zmc2V0ID0gaXA2X3RubF9wYXJzZV90bHZfZW5jX2xpbShza2IsIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKTsKKwkJaWYgKG9mZnNldCA+IDApIHsKKwkJCXN0cnVjdCBpcHY2X3Rsdl90bmxfZW5jX2xpbSAqdGVsOworCisJCQl0ZWwgPSAodm9pZCAqKSZza2JfbmV0d29ya19oZWFkZXIoc2tiKVtvZmZzZXRdOworCQkJaWYgKHRlbC0+ZW5jYXBfbGltaXQgPT0gMCkgeworCQkJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BBUkFNUFJPQiwKKwkJCQkJICAgIElDTVBWNl9IRFJfRklFTEQsIG9mZnNldCArIDIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWVuY2FwX2xpbWl0ID0gdGVsLT5lbmNhcF9saW1pdCAtIDE7CisJCX0gZWxzZSBpZiAoISh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9JR05fRU5DQVBfTElNSVQpKSB7CisJCQllbmNhcF9saW1pdCA9IHQtPnBhcm1zLmVuY2FwX2xpbWl0OworCQl9CisKKwkJbWVtY3B5KCZmbDYsICZ0LT5mbC51LmlwNiwgc2l6ZW9mKGZsNikpOworCQlmbDYuZmxvd2k2X3Byb3RvID0gSVBQUk9UT19JUFY2OworCisJCWlmICh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19UQ0xBU1MpCisJCQlmbDYuZmxvd2xhYmVsIHw9ICgqKF9fYmUzMiAqKWlwdjZoICYgSVBWNl9UQ0xBU1NfTUFTSyk7CisJCWlmICh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19GTE9XTEFCRUwpCisJCQlmbDYuZmxvd2xhYmVsIHw9IGlwNl9mbG93bGFiZWwoaXB2NmgpOworCQlpZiAodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfVVNFX09SSUdfRldNQVJLKQorCQkJZmw2LmZsb3dpNl9tYXJrID0gc2tiLT5tYXJrOworCX0KIAogCWlmIChpcHR1bm5lbF9oYW5kbGVfb2ZmbG9hZHMoc2tiLCBTS0JfR1NPX0lQWElQNikpCiAJCXJldHVybiAtMTsKQEAgLTE3MzksNiArMTgxMiwxMCBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJaXA2X3RubF9saW5rX2NvbmZpZyh0KTsKKwlpZiAodC0+cGFybXMuY29sbGVjdF9tZCkgeworCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTkVUTlNfTE9DQUw7CisJCW5ldGlmX2tlZXBfZHN0KGRldik7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0xODA5LDYgKzE4ODYsOSBAQAogCiAJaWYgKGRhdGFbSUZMQV9JUFRVTl9QUk9UT10pCiAJCXBhcm1zLT5wcm90byA9IG5sYV9nZXRfdTgoZGF0YVtJRkxBX0lQVFVOX1BST1RPXSk7CisKKwlpZiAoZGF0YVtJRkxBX0lQVFVOX0NPTExFQ1RfTUVUQURBVEFdKQorCQlwYXJtcy0+Y29sbGVjdF9tZCA9IHRydWU7CiB9CiAKIHN0YXRpYyBib29sIGlwNl90bmxfbmV0bGlua19lbmNhcF9wYXJtcyhzdHJ1Y3QgbmxhdHRyICpkYXRhW10sCkBAIC0xODQ4LDYgKzE5MjgsNyBAQAogCQkJICAgc3RydWN0IG5sYXR0ciAqdGJbXSwgc3RydWN0IG5sYXR0ciAqZGF0YVtdKQogewogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKKwlzdHJ1Y3QgaXA2X3RubF9uZXQgKmlwNm4gPSBuZXRfZ2VuZXJpYyhuZXQsIGlwNl90bmxfbmV0X2lkKTsKIAlzdHJ1Y3QgaXA2X3RubCAqbnQsICp0OwogCXN0cnVjdCBpcF90dW5uZWxfZW5jYXAgaXBlbmNhcDsKIApAQCAtMTg2Miw5ICsxOTQzLDE0IEBACiAKIAlpcDZfdG5sX25ldGxpbmtfcGFybXMoZGF0YSwgJm50LT5wYXJtcyk7CiAKLQl0ID0gaXA2X3RubF9sb2NhdGUobmV0LCAmbnQtPnBhcm1zLCAwKTsKLQlpZiAoIUlTX0VSUih0KSkKLQkJcmV0dXJuIC1FRVhJU1Q7CisJaWYgKG50LT5wYXJtcy5jb2xsZWN0X21kKSB7CisJCWlmIChydG5sX2RlcmVmZXJlbmNlKGlwNm4tPmNvbGxlY3RfbWRfdHVuKSkKKwkJCXJldHVybiAtRUVYSVNUOworCX0gZWxzZSB7CisJCXQgPSBpcDZfdG5sX2xvY2F0ZShuZXQsICZudC0+cGFybXMsIDApOworCQlpZiAoIUlTX0VSUih0KSkKKwkJCXJldHVybiAtRUVYSVNUOworCX0KIAogCXJldHVybiBpcDZfdG5sX2NyZWF0ZTIoZGV2KTsKIH0KQEAgLTE4ODgsNiArMTk3NCw4IEBACiAJCQlyZXR1cm4gZXJyOwogCX0KIAlpcDZfdG5sX25ldGxpbmtfcGFybXMoZGF0YSwgJnApOworCWlmIChwLmNvbGxlY3RfbWQpCisJCXJldHVybiAtRUlOVkFMOwogCiAJdCA9IGlwNl90bmxfbG9jYXRlKG5ldCwgJnAsIDApOwogCWlmICghSVNfRVJSKHQpKSB7CkBAIC0xOTM1LDYgKzIwMjMsOCBAQAogCQlubGFfdG90YWxfc2l6ZSgyKSArCiAJCS8qIElGTEFfSVBUVU5fRU5DQVBfRFBPUlQgKi8KIAkJbmxhX3RvdGFsX3NpemUoMikgKworCQkvKiBJRkxBX0lQVFVOX0NPTExFQ1RfTUVUQURBVEEgKi8KKwkJbmxhX3RvdGFsX3NpemUoMCkgKwogCQkwOwogfQogCkBAIC0xOTUzLDE2ICsyMDQzLDE1IEBACiAJICAgIG5sYV9wdXRfdTgoc2tiLCBJRkxBX0lQVFVOX1BST1RPLCBwYXJtLT5wcm90bykpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JaWYgKG5sYV9wdXRfdTE2KHNrYiwgSUZMQV9JUFRVTl9FTkNBUF9UWVBFLAotCQkJdHVubmVsLT5lbmNhcC50eXBlKSB8fAotCW5sYV9wdXRfYmUxNihza2IsIElGTEFfSVBUVU5fRU5DQVBfU1BPUlQsCi0JCSAgICAgdHVubmVsLT5lbmNhcC5zcG9ydCkgfHwKLQlubGFfcHV0X2JlMTYoc2tiLCBJRkxBX0lQVFVOX0VOQ0FQX0RQT1JULAotCQkgICAgIHR1bm5lbC0+ZW5jYXAuZHBvcnQpIHx8Ci0JbmxhX3B1dF91MTYoc2tiLCBJRkxBX0lQVFVOX0VOQ0FQX0ZMQUdTLAotCQkgICAgdHVubmVsLT5lbmNhcC5mbGFncykpCisJaWYgKG5sYV9wdXRfdTE2KHNrYiwgSUZMQV9JUFRVTl9FTkNBUF9UWVBFLCB0dW5uZWwtPmVuY2FwLnR5cGUpIHx8CisJICAgIG5sYV9wdXRfYmUxNihza2IsIElGTEFfSVBUVU5fRU5DQVBfU1BPUlQsIHR1bm5lbC0+ZW5jYXAuc3BvcnQpIHx8CisJICAgIG5sYV9wdXRfYmUxNihza2IsIElGTEFfSVBUVU5fRU5DQVBfRFBPUlQsIHR1bm5lbC0+ZW5jYXAuZHBvcnQpIHx8CisJICAgIG5sYV9wdXRfdTE2KHNrYiwgSUZMQV9JUFRVTl9FTkNBUF9GTEFHUywgdHVubmVsLT5lbmNhcC5mbGFncykpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCisJaWYgKHBhcm0tPmNvbGxlY3RfbWQpCisJCWlmIChubGFfcHV0X2ZsYWcoc2tiLCBJRkxBX0lQVFVOX0NPTExFQ1RfTUVUQURBVEEpKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJcmV0dXJuIDA7CiAKIG5sYV9wdXRfZmFpbHVyZToKQEAgLTE5OTAsNiArMjA3OSw3IEBACiAJW0lGTEFfSVBUVU5fRU5DQVBfRkxBR1NdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKIAlbSUZMQV9JUFRVTl9FTkNBUF9TUE9SVF0JPSB7IC50eXBlID0gTkxBX1UxNiB9LAogCVtJRkxBX0lQVFVOX0VOQ0FQX0RQT1JUXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW0lGTEFfSVBUVU5fQ09MTEVDVF9NRVRBREFUQV0JPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX29wcyBpcDZfbGlua19vcHMgX19yZWFkX21vc3RseSA9IHsKQEAgLTIwMzEsNyArMjEyMSw3IEBACiAJCWlmIChkZXYtPnJ0bmxfbGlua19vcHMgPT0gJmlwNl9saW5rX29wcykKIAkJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX3F1ZXVlKGRldiwgJmxpc3QpOwogCi0JZm9yIChoID0gMDsgaCA8IEhBU0hfU0laRTsgaCsrKSB7CisJZm9yIChoID0gMDsgaCA8IElQNl9UVU5ORUxfSEFTSF9TSVpFOyBoKyspIHsKIAkJdCA9IHJ0bmxfZGVyZWZlcmVuY2UoaXA2bi0+dG5sc19yX2xbaF0pOwogCQl3aGlsZSAodCkgewogCQkJLyogSWYgZGV2IGlzIGluIHRoZSBzYW1lIG5ldG5zLCBpdCBoYXMgYWxyZWFkeQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X3Z0aS5jIGIvbmV0L2lwdjYvaXA2X3Z0aS5jCmluZGV4IGQ5MGExMWYuLjhhMDJjYTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl92dGkuYworKysgYi9uZXQvaXB2Ni9pcDZfdnRpLmMKQEAgLTUwLDE0ICs1MCwxNCBAQAogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L25ldG5zL2dlbmVyaWMuaD4KIAotI2RlZmluZSBIQVNIX1NJWkVfU0hJRlQgIDUKLSNkZWZpbmUgSEFTSF9TSVpFICgxIDw8IEhBU0hfU0laRV9TSElGVCkKKyNkZWZpbmUgSVA2X1ZUSV9IQVNIX1NJWkVfU0hJRlQgIDUKKyNkZWZpbmUgSVA2X1ZUSV9IQVNIX1NJWkUgKDEgPDwgSVA2X1ZUSV9IQVNIX1NJWkVfU0hJRlQpCiAKIHN0YXRpYyB1MzIgSEFTSChjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIxLCBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIyKQogewogCXUzMiBoYXNoID0gaXB2Nl9hZGRyX2hhc2goYWRkcjEpIF4gaXB2Nl9hZGRyX2hhc2goYWRkcjIpOwogCi0JcmV0dXJuIGhhc2hfMzIoaGFzaCwgSEFTSF9TSVpFX1NISUZUKTsKKwlyZXR1cm4gaGFzaF8zMihoYXNoLCBJUDZfVlRJX0hBU0hfU0laRV9TSElGVCk7CiB9CiAKIHN0YXRpYyBpbnQgdnRpNl9kZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTY5LDcgKzY5LDcgQEAKIAkvKiB0aGUgdnRpNiB0dW5uZWwgZmFsbGJhY2sgZGV2aWNlICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKmZiX3RubF9kZXY7CiAJLyogbGlzdHMgZm9yIHN0b3JpbmcgdHVubmVscyBpbiB1c2UgKi8KLQlzdHJ1Y3QgaXA2X3RubCBfX3JjdSAqdG5sc19yX2xbSEFTSF9TSVpFXTsKKwlzdHJ1Y3QgaXA2X3RubCBfX3JjdSAqdG5sc19yX2xbSVA2X1ZUSV9IQVNIX1NJWkVdOwogCXN0cnVjdCBpcDZfdG5sIF9fcmN1ICp0bmxzX3djWzFdOwogCXN0cnVjdCBpcDZfdG5sIF9fcmN1ICoqdG5sc1syXTsKIH07CkBAIC0zMjEsMTEgKzMyMSw5IEBACiAJCQlnb3RvIGRpc2NhcmQ7CiAJCX0KIAotCQlYRlJNX1RVTk5FTF9TS0JfQ0Ioc2tiKS0+dHVubmVsLmlwNiA9IHQ7Ci0KIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQkJcmV0dXJuIHhmcm02X3Jjdihza2IpOworCQlyZXR1cm4geGZybTZfcmN2X3RubChza2IsIHQpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTM0MCw2ICszMzgsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IHBjcHVfc3dfbmV0c3RhdHMgKnRzdGF0czsKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKKwlzdHJ1Y3QgeGZybV9tb2RlICppbm5lcl9tb2RlOwogCXN0cnVjdCBpcDZfdG5sICp0ID0gWEZSTV9UVU5ORUxfU0tCX0NCKHNrYiktPnR1bm5lbC5pcDY7CiAJdTMyIG9yaWdfbWFyayA9IHNrYi0+bWFyazsKIAlpbnQgcmV0OwpAQCAtMzU3LDcgKzM1NiwxOSBAQAogCX0KIAogCXggPSB4ZnJtX2lucHV0X3N0YXRlKHNrYik7Ci0JZmFtaWx5ID0geC0+aW5uZXJfbW9kZS0+YWZpbmZvLT5mYW1pbHk7CisKKwlpbm5lcl9tb2RlID0geC0+aW5uZXJfbW9kZTsKKworCWlmICh4LT5zZWwuZmFtaWx5ID09IEFGX1VOU1BFQykgeworCQlpbm5lcl9tb2RlID0geGZybV9pcDJpbm5lcl9tb2RlKHgsIFhGUk1fTU9ERV9TS0JfQ0Ioc2tiKS0+cHJvdG9jb2wpOworCQlpZiAoaW5uZXJfbW9kZSA9PSBOVUxMKSB7CisJCQlYRlJNX0lOQ19TVEFUUyhkZXZfbmV0KHNrYi0+ZGV2KSwKKwkJCQkgICAgICAgTElOVVhfTUlCX1hGUk1JTlNUQVRFTU9ERUVSUk9SKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJZmFtaWx5ID0gaW5uZXJfbW9kZS0+YWZpbmZvLT5mYW1pbHk7CiAKIAlza2ItPm1hcmsgPSBiZTMyX3RvX2NwdSh0LT5wYXJtcy5pX2tleSk7CiAJcmV0ID0geGZybV9wb2xpY3lfY2hlY2soTlVMTCwgWEZSTV9QT0xJQ1lfSU4sIHNrYiwgZmFtaWx5KTsKQEAgLTEwNDAsNyArMTA1MSw3IEBACiAJc3RydWN0IGlwNl90bmwgKnQ7CiAJTElTVF9IRUFEKGxpc3QpOwogCi0JZm9yIChoID0gMDsgaCA8IEhBU0hfU0laRTsgaCsrKSB7CisJZm9yIChoID0gMDsgaCA8IElQNl9WVElfSEFTSF9TSVpFOyBoKyspIHsKIAkJdCA9IHJ0bmxfZGVyZWZlcmVuY2UoaXA2bi0+dG5sc19yX2xbaF0pOwogCQl3aGlsZSAodCkgewogCQkJdW5yZWdpc3Rlcl9uZXRkZXZpY2VfcXVldWUodC0+ZGV2LCAmbGlzdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZtci5jIGIvbmV0L2lwdjYvaXA2bXIuYwppbmRleCA2MTIyZjljLi43ZjQyNjViIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZtci5jCisrKyBiL25ldC9pcHY2L2lwNm1yLmMKQEAgLTIyMzksNiArMjIzOSw3IEBACiAJc3RydWN0IHJ0YV9tZmNfc3RhdHMgbWZjczsKIAlzdHJ1Y3QgbmxhdHRyICptcF9hdHRyOwogCXN0cnVjdCBydG5leHRob3AgKm5ocDsKKwl1bnNpZ25lZCBsb25nIGxhc3R1c2U7CiAJaW50IGN0OwogCiAJLyogSWYgY2FjaGUgaXMgdW5yZXNvbHZlZCwgZG9uJ3QgdHJ5IHRvIHBhcnNlIElJRiBhbmQgT0lGICovCkBAIC0yMjY5LDEyICsyMjcwLDE0IEBACiAKIAlubGFfbmVzdF9lbmQoc2tiLCBtcF9hdHRyKTsKIAorCWxhc3R1c2UgPSBSRUFEX09OQ0UoYy0+bWZjX3VuLnJlcy5sYXN0dXNlKTsKKwlsYXN0dXNlID0gdGltZV9hZnRlcl9lcShqaWZmaWVzLCBsYXN0dXNlKSA/IGppZmZpZXMgLSBsYXN0dXNlIDogMDsKKwogCW1mY3MubWZjc19wYWNrZXRzID0gYy0+bWZjX3VuLnJlcy5wa3Q7CiAJbWZjcy5tZmNzX2J5dGVzID0gYy0+bWZjX3VuLnJlcy5ieXRlczsKIAltZmNzLm1mY3Nfd3JvbmdfaWYgPSBjLT5tZmNfdW4ucmVzLndyb25nX2lmOwogCWlmIChubGFfcHV0XzY0Yml0KHNrYiwgUlRBX01GQ19TVEFUUywgc2l6ZW9mKG1mY3MpLCAmbWZjcywgUlRBX1BBRCkgfHwKLQkgICAgbmxhX3B1dF91NjRfNjRiaXQoc2tiLCBSVEFfRVhQSVJFUywKLQkJCSAgICAgIGppZmZpZXNfdG9fY2xvY2tfdChjLT5tZmNfdW4ucmVzLmxhc3R1c2UpLAorCSAgICBubGFfcHV0X3U2NF82NGJpdChza2IsIFJUQV9FWFBJUkVTLCBqaWZmaWVzX3RvX2Nsb2NrX3QobGFzdHVzZSksCiAJCQkgICAgICBSVEFfUEFEKSkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIApAQCAtMjI4Miw4ICsyMjg1LDggQEAKIAlyZXR1cm4gMTsKIH0KIAotaW50IGlwNm1yX2dldF9yb3V0ZShzdHJ1Y3QgbmV0ICpuZXQsCi0JCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgcnRtc2cgKnJ0bSwgaW50IG5vd2FpdCkKK2ludCBpcDZtcl9nZXRfcm91dGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgcnRtc2cgKnJ0bSwKKwkJICAgIGludCBub3dhaXQsIHUzMiBwb3J0aWQpCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgbXI2X3RhYmxlICptcnQ7CkBAIC0yMzI4LDYgKzIzMzEsNyBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAorCQlORVRMSU5LX0NCKHNrYjIpLnBvcnRpZCA9IHBvcnRpZDsKIAkJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiMik7CiAKIAkJc2tiX3B1dChza2IyLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L21jYXN0LmMgYi9uZXQvaXB2Ni9tY2FzdC5jCmluZGV4IGQ2NGVlN2UuLjc1YzFmYzUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L21jYXN0LmMKKysrIGIvbmV0L2lwdjYvbWNhc3QuYwpAQCAtMTczOSw2ICsxNzM5LDE1IEBACiAJCQljb250aW51ZTsKIAkJfQogCisJCS8qIEJhc2VkIG9uIFJGQzM4MTAgNi4xLiBTaG91bGQgbm90IHNlbmQgc291cmNlLWxpc3QgY2hhbmdlCisJCSAqIHJlY29yZHMgd2hlbiB0aGVyZSBpcyBhIGZpbHRlciBtb2RlIGNoYW5nZS4KKwkJICovCisJCWlmICgoKGdkZWxldGVkICYmIHBtYy0+bWNhX3NmbW9kZSA9PSBNQ0FTVF9FWENMVURFKSB8fAorCQkgICAgICghZ2RlbGV0ZWQgJiYgcG1jLT5tY2FfY3Jjb3VudCkpICYmCisJCSAgICAodHlwZSA9PSBNTEQyX0FMTE9XX05FV19TT1VSQ0VTIHx8CisJCSAgICAgdHlwZSA9PSBNTEQyX0JMT0NLX09MRF9TT1VSQ0VTKSAmJiBwc2YtPnNmX2NyY291bnQpCisJCQlnb3RvIGRlY3JlYXNlX3NmX2NyY291bnQ7CisKIAkJLyogY2xlYXIgbWFya3Mgb24gcXVlcnkgcmVzcG9uc2VzICovCiAJCWlmIChpc3F1ZXJ5KQogCQkJcHNmLT5zZl9nc3Jlc3AgPSAwOwpAQCAtMTc2Niw2ICsxNzc1LDcgQEAKIAkJc2NvdW50Kys7IHN0b3RhbCsrOwogCQlpZiAoKHR5cGUgPT0gTUxEMl9BTExPV19ORVdfU09VUkNFUyB8fAogCQkgICAgIHR5cGUgPT0gTUxEMl9CTE9DS19PTERfU09VUkNFUykgJiYgcHNmLT5zZl9jcmNvdW50KSB7CitkZWNyZWFzZV9zZl9jcmNvdW50OgogCQkJcHNmLT5zZl9jcmNvdW50LS07CiAJCQlpZiAoKHNkZWxldGVkIHx8IGdkZWxldGVkKSAmJiBwc2YtPnNmX2NyY291bnQgPT0gMCkgewogCQkJCWlmIChwc2ZfcHJldikKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25kaXNjLmMgYi9uZXQvaXB2Ni9uZGlzYy5jCmluZGV4IGZlNjVjZGMuLmQ4ZTY3MTQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25kaXNjLmMKKysrIGIvbmV0L2lwdjYvbmRpc2MuYwpAQCAtNjcsNyArNjcsNiBAQAogI2luY2x1ZGUgPG5ldC9mbG93Lmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgogI2luY2x1ZGUgPG5ldC9pbmV0X2NvbW1vbi5oPgotI2luY2x1ZGUgPG5ldC9sM21kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KQEAgLTQ1NywxMSArNDU2LDkgQEAKIAogCWlmICghZHN0KSB7CiAJCXN0cnVjdCBmbG93aTYgZmw2OwotCQlpbnQgb2lmID0gbDNtZGV2X2ZpYl9vaWYoc2tiLT5kZXYpOworCQlpbnQgb2lmID0gc2tiLT5kZXYtPmlmaW5kZXg7CiAKIAkJaWNtcHY2X2Zsb3dfaW5pdChzaywgJmZsNiwgdHlwZSwgc2FkZHIsIGRhZGRyLCBvaWYpOwotCQlpZiAob2lmICE9IHNrYi0+ZGV2LT5pZmluZGV4KQotCQkJZmw2LmZsb3dpNl9mbGFncyB8PSBGTE9XSV9GTEFHX0wzTURFVl9TUkM7CiAJCWRzdCA9IGljbXA2X2RzdF9hbGxvYyhza2ItPmRldiwgJmZsNik7CiAJCWlmIChJU19FUlIoZHN0KSkgewogCQkJa2ZyZWVfc2tiKHNrYik7CkBAIC0xNTM4LDcgKzE1MzUsNiBAQAogCWludCByZF9sZW47CiAJdTggaGFfYnVmW01BWF9BRERSX0xFTl0sICpoYSA9IE5VTEwsCiAJICAgb3BzX2RhdGFfYnVmW05ESVNDX09QU19SRURJUkVDVF9EQVRBX1NQQUNFXSwgKm9wc19kYXRhID0gTlVMTDsKLQlpbnQgb2lmID0gbDNtZGV2X2ZpYl9vaWYoZGV2KTsKIAlib29sIHJldDsKIAogCWlmIChpcHY2X2dldF9sbGFkZHIoZGV2LCAmc2FkZHJfYnVmLCBJRkFfRl9URU5UQVRJVkUpKSB7CkBAIC0xNTU1LDEwICsxNTUxLDcgQEAKIAl9CiAKIAlpY21wdjZfZmxvd19pbml0KHNrLCAmZmw2LCBORElTQ19SRURJUkVDVCwKLQkJCSAmc2FkZHJfYnVmLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsIG9pZik7Ci0KLQlpZiAob2lmICE9IHNrYi0+ZGV2LT5pZmluZGV4KQotCQlmbDYuZmxvd2k2X2ZsYWdzIHw9IEZMT1dJX0ZMQUdfTDNNREVWX1NSQzsKKwkJCSAmc2FkZHJfYnVmLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsIGRldi0+aWZpbmRleCk7CiAKIAlkc3QgPSBpcDZfcm91dGVfb3V0cHV0KG5ldCwgTlVMTCwgJmZsNik7CiAJaWYgKGRzdC0+ZXJyb3IpIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCmluZGV4IDU1MmZhYzIuLjU1YWFjZWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYwpAQCAtMTkwLDcgKzE5MCw3IEBACiAJLnUgPSB7CiAJCS5sb2cgPSB7CiAJCQkubGV2ZWwgPSBMT0dMRVZFTF9XQVJOSU5HLAotCQkJLmxvZ2ZsYWdzID0gTkZfTE9HX01BU0ssCisJCQkubG9nZmxhZ3MgPSBORl9MT0dfREVGQVVMVF9NQVNLLAogCQl9LAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMKaW5kZXggMWFhNTg0OC4uOTYzZWUzOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jCkBAIC0xMTUsNyArMTE1LDcgQEAKIAloZWxwID0gbmZjdF9oZWxwKGN0KTsKIAlpZiAoIWhlbHApCiAJCXJldHVybiBORl9BQ0NFUFQ7Ci0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCisJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggKi8KIAloZWxwZXIgPSByY3VfZGVyZWZlcmVuY2UoaGVscC0+aGVscGVyKTsKIAlpZiAoIWhlbHBlcikKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXB2Ni5jCmluZGV4IDY2MGJjMTAuLmY1YTYxYmMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wdjYuYwpAQCAtMTY1LDcgKzE2NSw3IEBACiAJCXJldHVybiAtTkZfQUNDRVBUOwogCX0KIAotCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfc2xvdyAqLworCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfdGhyZXNoICovCiAJaW5wcm90byA9IF9fbmZfY3RfbDRwcm90b19maW5kKFBGX0lORVQ2LCBvcmlndHVwbGUuZHN0LnByb3RvbnVtKTsKIAogCS8qIE9yZGluYXJpbHksIHdlJ2QgZXhwZWN0IHRoZSBpbnZlcnRlZCB0dXBsZXByb3RvLCBidXQgaXQncwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2xvZ19pcHY2LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfbG9nX2lwdjYuYwppbmRleCA4ZGQ4Njk2Li41N2Q4NjA2IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfbG9nX2lwdjYuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfbG9nX2lwdjYuYwpAQCAtMzAsNyArMzAsNyBAQAogCS51ID0gewogCQkubG9nID0gewogCQkJLmxldmVsCSAgPSBMT0dMRVZFTF9OT1RJQ0UsCi0JCQkubG9nZmxhZ3MgPSBORl9MT0dfTUFTSywKKwkJCS5sb2dmbGFncyA9IE5GX0xPR19ERUZBVUxUX01BU0ssCiAJCX0sCiAJfSwKIH07CkBAIC01Miw3ICs1Miw3IEBACiAJaWYgKGluZm8tPnR5cGUgPT0gTkZfTE9HX1RZUEVfTE9HKQogCQlsb2dmbGFncyA9IGluZm8tPnUubG9nLmxvZ2ZsYWdzOwogCWVsc2UKLQkJbG9nZmxhZ3MgPSBORl9MT0dfTUFTSzsKKwkJbG9nZmxhZ3MgPSBORl9MT0dfREVGQVVMVF9NQVNLOwogCiAJaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcDZob2ZmLCBzaXplb2YoX2lwNmgpLCAmX2lwNmgpOwogCWlmIChpaCA9PSBOVUxMKSB7CkBAIC04NCw3ICs4NCw3IEBACiAJCX0KIAogCQkvKiBNYXggbGVuZ3RoOiA0OCAiT1BUICguLi4pICIgKi8KLQkJaWYgKGxvZ2ZsYWdzICYgWFRfTE9HX0lQT1BUKQorCQlpZiAobG9nZmxhZ3MgJiBORl9MT0dfSVBPUFQpCiAJCQluZl9sb2dfYnVmX2FkZChtLCAiT1BUICggIik7CiAKIAkJc3dpdGNoIChjdXJyZW50aGRyKSB7CkBAIC0xMjEsNyArMTIxLDcgQEAKIAkJY2FzZSBJUFBST1RPX1JPVVRJTkc6CiAJCWNhc2UgSVBQUk9UT19IT1BPUFRTOgogCQkJaWYgKGZyYWdtZW50KSB7Ci0JCQkJaWYgKGxvZ2ZsYWdzICYgWFRfTE9HX0lQT1BUKQorCQkJCWlmIChsb2dmbGFncyAmIE5GX0xPR19JUE9QVCkKIAkJCQkJbmZfbG9nX2J1Zl9hZGQobSwgIikiKTsKIAkJCQlyZXR1cm47CiAJCQl9CkBAIC0xMjksNyArMTI5LDcgQEAKIAkJCWJyZWFrOwogCQkvKiBNYXggTGVuZ3RoICovCiAJCWNhc2UgSVBQUk9UT19BSDoKLQkJCWlmIChsb2dmbGFncyAmIFhUX0xPR19JUE9QVCkgeworCQkJaWYgKGxvZ2ZsYWdzICYgTkZfTE9HX0lQT1BUKSB7CiAJCQkJc3RydWN0IGlwX2F1dGhfaGRyIF9haGRyOwogCQkJCWNvbnN0IHN0cnVjdCBpcF9hdXRoX2hkciAqYWg7CiAKQEAgLTE2MSw3ICsxNjEsNyBAQAogCQkJaGRybGVuID0gKGhwLT5oZHJsZW4rMik8PDI7CiAJCQlicmVhazsKIAkJY2FzZSBJUFBST1RPX0VTUDoKLQkJCWlmIChsb2dmbGFncyAmIFhUX0xPR19JUE9QVCkgeworCQkJaWYgKGxvZ2ZsYWdzICYgTkZfTE9HX0lQT1BUKSB7CiAJCQkJc3RydWN0IGlwX2VzcF9oZHIgX2VzcGg7CiAJCQkJY29uc3Qgc3RydWN0IGlwX2VzcF9oZHIgKmVoOwogCkBAIC0xOTQsNyArMTk0LDcgQEAKIAkJCW5mX2xvZ19idWZfYWRkKG0sICJVbmtub3duIEV4dCBIZHIgJXUiLCBjdXJyZW50aGRyKTsKIAkJCXJldHVybjsKIAkJfQotCQlpZiAobG9nZmxhZ3MgJiBYVF9MT0dfSVBPUFQpCisJCWlmIChsb2dmbGFncyAmIE5GX0xPR19JUE9QVCkKIAkJCW5mX2xvZ19idWZfYWRkKG0sICIpICIpOwogCiAJCWN1cnJlbnRoZHIgPSBocC0+bmV4dGhkcjsKQEAgLTI3Nyw3ICsyNzcsNyBAQAogCX0KIAogCS8qIE1heCBsZW5ndGg6IDE1ICJVSUQ9NDI5NDk2NzI5NSAiICovCi0JaWYgKChsb2dmbGFncyAmIFhUX0xPR19VSUQpICYmIHJlY3Vyc2UpCisJaWYgKChsb2dmbGFncyAmIE5GX0xPR19VSUQpICYmIHJlY3Vyc2UpCiAJCW5mX2xvZ19kdW1wX3NrX3VpZF9naWQobSwgc2tiLT5zayk7CiAKIAkvKiBNYXggbGVuZ3RoOiAxNiAiTUFSSz0weEZGRkZGRkZGICIgKi8KQEAgLTI5NSw3ICsyOTUsNyBAQAogCWlmIChpbmZvLT50eXBlID09IE5GX0xPR19UWVBFX0xPRykKIAkJbG9nZmxhZ3MgPSBpbmZvLT51LmxvZy5sb2dmbGFnczsKIAotCWlmICghKGxvZ2ZsYWdzICYgWFRfTE9HX01BQ0RFQ09ERSkpCisJaWYgKCEobG9nZmxhZ3MgJiBORl9MT0dfTUFDREVDT0RFKSkKIAkJZ290byBmYWxsYmFjazsKIAogCXN3aXRjaCAoZGV2LT50eXBlKSB7CkBAIC0zNzksOCArMzc5LDcgQEAKIAogc3RhdGljIGludCBfX25ldF9pbml0IG5mX2xvZ19pcHY2X25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKIHsKLQluZl9sb2dfc2V0KG5ldCwgTkZQUk9UT19JUFY2LCAmbmZfaXA2X2xvZ2dlcik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIG5mX2xvZ19zZXQobmV0LCBORlBST1RPX0lQVjYsICZuZl9pcDZfbG9nZ2VyKTsKIH0KIAogc3RhdGljIHZvaWQgX19uZXRfZXhpdCBuZl9sb2dfaXB2Nl9uZXRfZXhpdChzdHJ1Y3QgbmV0ICpuZXQpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl90YWJsZXNfaXB2Ni5jCmluZGV4IDMwYjIyZjQuLmQ2ZTRiYTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl90YWJsZXNfaXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl90YWJsZXNfaXB2Ni5jCkBAIC0yMiw5ICsyMiw3IEBACiB7CiAJc3RydWN0IG5mdF9wa3RpbmZvIHBrdDsKIAotCS8qIG1hbGZvcm1lZCBwYWNrZXQsIGRyb3AgaXQgKi8KLQlpZiAobmZ0X3NldF9wa3RpbmZvX2lwdjYoJnBrdCwgc2tiLCBzdGF0ZSkgPCAwKQotCQlyZXR1cm4gTkZfRFJPUDsKKwluZnRfc2V0X3BrdGluZm9faXB2NigmcGt0LCBza2IsIHN0YXRlKTsKIAogCXJldHVybiBuZnRfZG9fY2hhaW4oJnBrdCwgcHJpdik7CiB9CkBAIC0xMDIsNyArMTAwLDEwIEBACiB7CiAJaW50IHJldDsKIAotCW5mdF9yZWdpc3Rlcl9jaGFpbl90eXBlKCZmaWx0ZXJfaXB2Nik7CisJcmV0ID0gbmZ0X3JlZ2lzdGVyX2NoYWluX3R5cGUoJmZpbHRlcl9pcHY2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwogCXJldCA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm5mX3RhYmxlc19pcHY2X25ldF9vcHMpOwogCWlmIChyZXQgPCAwKQogCQluZnRfdW5yZWdpc3Rlcl9jaGFpbl90eXBlKCZmaWx0ZXJfaXB2Nik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZ0X2NoYWluX3JvdXRlX2lwdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZnRfY2hhaW5fcm91dGVfaXB2Ni5jCmluZGV4IDcxZDk5NWYuLmYyNzI3NDcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZnRfY2hhaW5fcm91dGVfaXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZnRfY2hhaW5fcm91dGVfaXB2Ni5jCkBAIC0zMSwxMCArMzEsOSBAQAogCXN0cnVjdCBpbjZfYWRkciBzYWRkciwgZGFkZHI7CiAJdV9pbnQ4X3QgaG9wX2xpbWl0OwogCXUzMiBtYXJrLCBmbG93bGFiZWw7CisJaW50IGVycjsKIAotCS8qIG1hbGZvcm1lZCBwYWNrZXQsIGRyb3AgaXQgKi8KLQlpZiAobmZ0X3NldF9wa3RpbmZvX2lwdjYoJnBrdCwgc2tiLCBzdGF0ZSkgPCAwKQotCQlyZXR1cm4gTkZfRFJPUDsKKwluZnRfc2V0X3BrdGluZm9faXB2NigmcGt0LCBza2IsIHN0YXRlKTsKIAogCS8qIHNhdmUgc291cmNlL2Rlc3QgYWRkcmVzcywgbWFyaywgaG9wbGltaXQsIGZsb3dsYWJlbCwgcHJpb3JpdHkgKi8KIAltZW1jcHkoJnNhZGRyLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsIHNpemVvZihzYWRkcikpOwpAQCAtNDYsMTMgKzQ1LDE2IEBACiAJZmxvd2xhYmVsID0gKigodTMyICopaXB2Nl9oZHIoc2tiKSk7CiAKIAlyZXQgPSBuZnRfZG9fY2hhaW4oJnBrdCwgcHJpdik7Ci0JaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9RVUVVRSAmJgorCWlmIChyZXQgIT0gTkZfRFJPUCAmJiByZXQgIT0gTkZfU1RPTEVOICYmCiAJICAgIChtZW1jbXAoJmlwdjZfaGRyKHNrYiktPnNhZGRyLCAmc2FkZHIsIHNpemVvZihzYWRkcikpIHx8CiAJICAgICBtZW1jbXAoJmlwdjZfaGRyKHNrYiktPmRhZGRyLCAmZGFkZHIsIHNpemVvZihkYWRkcikpIHx8CiAJICAgICBza2ItPm1hcmsgIT0gbWFyayB8fAogCSAgICAgaXB2Nl9oZHIoc2tiKS0+aG9wX2xpbWl0ICE9IGhvcF9saW1pdCB8fAotCSAgICAgZmxvd2xhYmVsICE9ICooKHVfaW50MzJfdCAqKWlwdjZfaGRyKHNrYikpKSkKLQkJcmV0dXJuIGlwNl9yb3V0ZV9tZV9oYXJkZXIoc3RhdGUtPm5ldCwgc2tiKSA9PSAwID8gcmV0IDogTkZfRFJPUDsKKwkgICAgIGZsb3dsYWJlbCAhPSAqKCh1X2ludDMyX3QgKilpcHY2X2hkcihza2IpKSkpIHsKKwkJZXJyID0gaXA2X3JvdXRlX21lX2hhcmRlcihzdGF0ZS0+bmV0LCBza2IpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldCA9IE5GX0RST1BfRVJSKGVycik7CisJfQogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZnRfcmVqZWN0X2lwdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZnRfcmVqZWN0X2lwdjYuYwppbmRleCA1MzNjZDU3Li45MmJkYTk5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pcHY2LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mdF9yZWplY3RfaXB2Ni5jCkBAIC00Nyw2ICs0Nyw3IEBACiAJLmV2YWwJCT0gbmZ0X3JlamVjdF9pcHY2X2V2YWwsCiAJLmluaXQJCT0gbmZ0X3JlamVjdF9pbml0LAogCS5kdW1wCQk9IG5mdF9yZWplY3RfZHVtcCwKKwkudmFsaWRhdGUJPSBuZnRfcmVqZWN0X3ZhbGlkYXRlLAogfTsKIAogc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9yZWplY3RfaXB2Nl90eXBlIF9fcmVhZF9tb3N0bHkgPSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9vdXRwdXRfY29yZS5jIGIvbmV0L2lwdjYvb3V0cHV0X2NvcmUuYwppbmRleCA0NjJmMmE3NmIuLjdjY2E4YWMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L291dHB1dF9jb3JlLmMKKysrIGIvbmV0L2lwdjYvb3V0cHV0X2NvcmUuYwpAQCAtMTQ4LDYgKzE0OCwxMyBAQAogCWlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuID0gaHRvbnMobGVuKTsKIAlJUDZDQihza2IpLT5uaG9mZiA9IG9mZnNldG9mKHN0cnVjdCBpcHY2aGRyLCBuZXh0aGRyKTsKIAorCS8qIGlmIGVncmVzcyBkZXZpY2UgaXMgZW5zbGF2ZWQgdG8gYW4gTDMgbWFzdGVyIGRldmljZSBwYXNzIHRoZQorCSAqIHNrYiB0byBpdHMgaGFuZGxlciBmb3IgcHJvY2Vzc2luZworCSAqLworCXNrYiA9IGwzbWRldl9pcDZfb3V0KHNrLCBza2IpOworCWlmICh1bmxpa2VseSghc2tiKSkKKwkJcmV0dXJuIDA7CisKIAlyZXR1cm4gbmZfaG9vayhORlBST1RPX0lQVjYsIE5GX0lORVRfTE9DQUxfT1VULAogCQkgICAgICAgbmV0LCBzaywgc2tiLCBOVUxMLCBza2JfZHN0KHNrYiktPmRldiwKIAkJICAgICAgIGRzdF9vdXRwdXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcGluZy5jIGIvbmV0L2lwdjYvcGluZy5jCmluZGV4IGZlZDQwZDEuLjBlOTgzYjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3BpbmcuYworKysgYi9uZXQvaXB2Ni9waW5nLmMKQEAgLTU1LDcgKzU1LDcgQEAKIAlzdHJ1Y3QgaWNtcDZoZHIgdXNlcl9pY21waDsKIAlpbnQgYWRkcl90eXBlOwogCXN0cnVjdCBpbjZfYWRkciAqZGFkZHI7Ci0JaW50IGlpZiA9IDA7CisJaW50IG9pZiA9IDA7CiAJc3RydWN0IGZsb3dpNiBmbDY7CiAJaW50IGVycjsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CkBAIC03OCwyNSArNzgsMzAgQEAKIAkJaWYgKHUtPnNpbjZfZmFtaWx5ICE9IEFGX0lORVQ2KSB7CiAJCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKIAkJfQotCQlpZiAoc2stPnNrX2JvdW5kX2Rldl9pZiAmJgotCQkgICAgc2stPnNrX2JvdW5kX2Rldl9pZiAhPSB1LT5zaW42X3Njb3BlX2lkKSB7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQogCQlkYWRkciA9ICYodS0+c2luNl9hZGRyKTsKLQkJaWlmID0gdS0+c2luNl9zY29wZV9pZDsKKwkJaWYgKF9faXB2Nl9hZGRyX25lZWRzX3Njb3BlX2lkKGlwdjZfYWRkcl90eXBlKGRhZGRyKSkpCisJCQlvaWYgPSB1LT5zaW42X3Njb3BlX2lkOwogCX0gZWxzZSB7CiAJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQogCQkJcmV0dXJuIC1FREVTVEFERFJSRVE7CiAJCWRhZGRyID0gJnNrLT5za192Nl9kYWRkcjsKIAl9CiAKLQlpZiAoIWlpZikKLQkJaWlmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKKwlpZiAoIW9pZikKKwkJb2lmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKKworCWlmICghb2lmKQorCQlvaWYgPSBucC0+c3RpY2t5X3BrdGluZm8uaXBpNl9pZmluZGV4OworCisJaWYgKCFvaWYgJiYgaXB2Nl9hZGRyX2lzX211bHRpY2FzdChkYWRkcikpCisJCW9pZiA9IG5wLT5tY2FzdF9vaWY7CisJZWxzZSBpZiAoIW9pZikKKwkJb2lmID0gbnAtPnVjYXN0X29pZjsKIAogCWFkZHJfdHlwZSA9IGlwdjZfYWRkcl90eXBlKGRhZGRyKTsKLQlpZiAoX19pcHY2X2FkZHJfbmVlZHNfc2NvcGVfaWQoYWRkcl90eXBlKSAmJiAhaWlmKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoYWRkcl90eXBlICYgSVBWNl9BRERSX01BUFBFRCkKKwlpZiAoKF9faXB2Nl9hZGRyX25lZWRzX3Njb3BlX2lkKGFkZHJfdHlwZSkgJiYgIW9pZikgfHwKKwkgICAgKGFkZHJfdHlwZSAmIElQVjZfQUREUl9NQVBQRUQpIHx8CisJICAgIChvaWYgJiYgc2stPnNrX2JvdW5kX2Rldl9pZiAmJiBvaWYgIT0gc2stPnNrX2JvdW5kX2Rldl9pZikpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogVE9ETzogdXNlIGlwNl9kYXRhZ3JhbV9zZW5kX2N0bCB0byBnZXQgb3B0aW9ucyBmcm9tIGNtc2cgKi8KQEAgLTEwNiwxNiArMTExLDEyIEBACiAJZmw2LmZsb3dpNl9wcm90byA9IElQUFJPVE9fSUNNUFY2OwogCWZsNi5zYWRkciA9IG5wLT5zYWRkcjsKIAlmbDYuZGFkZHIgPSAqZGFkZHI7CisJZmw2LmZsb3dpNl9vaWYgPSBvaWY7CiAJZmw2LmZsb3dpNl9tYXJrID0gc2stPnNrX21hcms7CiAJZmw2LmZsNl9pY21wX3R5cGUgPSB1c2VyX2ljbXBoLmljbXA2X3R5cGU7CiAJZmw2LmZsNl9pY21wX2NvZGUgPSB1c2VyX2ljbXBoLmljbXA2X2NvZGU7CiAJc2VjdXJpdHlfc2tfY2xhc3NpZnlfZmxvdyhzaywgZmxvd2k2X3RvX2Zsb3dpKCZmbDYpKTsKIAotCWlmICghZmw2LmZsb3dpNl9vaWYgJiYgaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmZmw2LmRhZGRyKSkKLQkJZmw2LmZsb3dpNl9vaWYgPSBucC0+bWNhc3Rfb2lmOwotCWVsc2UgaWYgKCFmbDYuZmxvd2k2X29pZikKLQkJZmw2LmZsb3dpNl9vaWYgPSBucC0+dWNhc3Rfb2lmOwotCiAJaXBjNi50Y2xhc3MgPSBucC0+dGNsYXNzOwogCWZsNi5mbG93bGFiZWwgPSBpcDZfbWFrZV9mbG93aW5mbyhpcGM2LnRjbGFzcywgZmw2LmZsb3dsYWJlbCk7CiAKQEAgLTEyNSw4ICsxMjYsMTAgQEAKIAlydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKikgZHN0OwogCiAJbnAgPSBpbmV0Nl9zayhzayk7Ci0JaWYgKCFucCkKLQkJcmV0dXJuIC1FQkFERjsKKwlpZiAoIW5wKSB7CisJCWVyciA9IC1FQkFERjsKKwkJZ290byBkc3RfZXJyX291dDsKKwl9CiAKIAlpZiAoIWZsNi5mbG93aTZfb2lmICYmIGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmZsNi5kYWRkcikpCiAJCWZsNi5mbG93aTZfb2lmID0gbnAtPm1jYXN0X29pZjsKQEAgLTE2Miw2ICsxNjUsOSBAQAogCX0KIAlyZWxlYXNlX3NvY2soc2spOwogCitkc3RfZXJyX291dDoKKwlkc3RfcmVsZWFzZShkc3QpOworCiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcHJvYy5jIGIvbmV0L2lwdjYvcHJvYy5jCmluZGV4IDY3OTI1M2QwLi5jYzhlM2FlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9wcm9jLmMKKysrIGIvbmV0L2lwdjYvcHJvYy5jCkBAIC0zMCw2ICszMCwxMSBAQAogI2luY2x1ZGUgPG5ldC90cmFuc3BfdjYuaD4KICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogCisjZGVmaW5lIE1BWDQoYSwgYiwgYywgZCkgXAorCW1heF90KHUzMiwgbWF4X3QodTMyLCBhLCBiKSwgbWF4X3QodTMyLCBjLCBkKSkKKyNkZWZpbmUgU05NUF9NSUJfTUFYIE1BWDQoVURQX01JQl9NQVgsIFRDUF9NSUJfTUFYLCBcCisJCQlJUFNUQVRTX01JQl9NQVgsIElDTVBfTUlCX01BWCkKKwogc3RhdGljIGludCBzb2Nrc3RhdDZfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gc2VxLT5wcml2YXRlOwpAQCAtMTkxLDI1ICsxOTYsMzQgQEAKIAkJCQlhdG9taWNfbG9uZ190ICpzbWliLAogCQkJCWNvbnN0IHN0cnVjdCBzbm1wX21pYiAqaXRlbWxpc3QpCiB7CisJdW5zaWduZWQgbG9uZyBidWZmW1NOTVBfTUlCX01BWF07CiAJaW50IGk7Ci0JdW5zaWduZWQgbG9uZyB2YWw7CiAKLQlmb3IgKGkgPSAwOyBpdGVtbGlzdFtpXS5uYW1lOyBpKyspIHsKLQkJdmFsID0gcGNwdW1pYiA/Ci0JCQlzbm1wX2ZvbGRfZmllbGQocGNwdW1pYiwgaXRlbWxpc3RbaV0uZW50cnkpIDoKLQkJCWF0b21pY19sb25nX3JlYWQoc21pYiArIGl0ZW1saXN0W2ldLmVudHJ5KTsKLQkJc2VxX3ByaW50ZihzZXEsICIlLTMyc1x0JWx1XG4iLCBpdGVtbGlzdFtpXS5uYW1lLCB2YWwpOworCWlmIChwY3B1bWliKSB7CisJCW1lbXNldChidWZmLCAwLCBzaXplb2YodW5zaWduZWQgbG9uZykgKiBTTk1QX01JQl9NQVgpOworCisJCXNubXBfZ2V0X2NwdV9maWVsZF9iYXRjaChidWZmLCBpdGVtbGlzdCwgcGNwdW1pYik7CisJCWZvciAoaSA9IDA7IGl0ZW1saXN0W2ldLm5hbWU7IGkrKykKKwkJCXNlcV9wcmludGYoc2VxLCAiJS0zMnNcdCVsdVxuIiwKKwkJCQkgICBpdGVtbGlzdFtpXS5uYW1lLCBidWZmW2ldKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpdGVtbGlzdFtpXS5uYW1lOyBpKyspCisJCQlzZXFfcHJpbnRmKHNlcSwgIiUtMzJzXHQlbHVcbiIsIGl0ZW1saXN0W2ldLm5hbWUsCisJCQkJICAgYXRvbWljX2xvbmdfcmVhZChzbWliICsgaXRlbWxpc3RbaV0uZW50cnkpKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIHNubXA2X3NlcV9zaG93X2l0ZW02NChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCBfX3BlcmNwdSAqbWliLAogCQkJCSAgY29uc3Qgc3RydWN0IHNubXBfbWliICppdGVtbGlzdCwgc2l6ZV90IHN5bmNwb2ZmKQogeworCXU2NCBidWZmNjRbU05NUF9NSUJfTUFYXTsKIAlpbnQgaTsKIAorCW1lbXNldChidWZmNjQsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIFNOTVBfTUlCX01BWCk7CisKKwlzbm1wX2dldF9jcHVfZmllbGQ2NF9iYXRjaChidWZmNjQsIGl0ZW1saXN0LCBtaWIsIHN5bmNwb2ZmKTsKIAlmb3IgKGkgPSAwOyBpdGVtbGlzdFtpXS5uYW1lOyBpKyspCi0JCXNlcV9wcmludGYoc2VxLCAiJS0zMnNcdCVsbHVcbiIsIGl0ZW1saXN0W2ldLm5hbWUsCi0JCQkgICBzbm1wX2ZvbGRfZmllbGQ2NChtaWIsIGl0ZW1saXN0W2ldLmVudHJ5LCBzeW5jcG9mZikpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUtMzJzXHQlbGx1XG4iLCBpdGVtbGlzdFtpXS5uYW1lLCBidWZmNjRbaV0pOwogfQogCiBzdGF0aWMgaW50IHNubXA2X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcmF3LmMgYi9uZXQvaXB2Ni9yYXcuYwppbmRleCA1OTBkZDFmLi41NDQwNGYwIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yYXcuYworKysgYi9uZXQvaXB2Ni9yYXcuYwpAQCAtNjUzLDYgKzY1MywxMyBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyb3JfZmF1bHQ7CiAKKwkvKiBpZiBlZ3Jlc3MgZGV2aWNlIGlzIGVuc2xhdmVkIHRvIGFuIEwzIG1hc3RlciBkZXZpY2UgcGFzcyB0aGUKKwkgKiBza2IgdG8gaXRzIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcKKwkgKi8KKwlza2IgPSBsM21kZXZfaXA2X291dChzaywgc2tiKTsKKwlpZiAodW5saWtlbHkoIXNrYikpCisJCXJldHVybiAwOworCiAJSVA2X1VQRF9QT19TVEFUUyhuZXQsIHJ0LT5ydDZpX2lkZXYsIElQU1RBVFNfTUlCX09VVCwgc2tiLT5sZW4pOwogCWVyciA9IE5GX0hPT0soTkZQUk9UT19JUFY2LCBORl9JTkVUX0xPQ0FMX09VVCwgbmV0LCBzaywgc2tiLAogCQkgICAgICBOVUxMLCBydC0+ZHN0LmRldiwgZHN0X291dHB1dCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yb3V0ZS5jIGIvbmV0L2lwdjYvcm91dGUuYwppbmRleCA0OTgxNzU1Li5iZGJjMzhlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yb3V0ZS5jCisrKyBiL25ldC9pcHY2L3JvdXRlLmMKQEAgLTExNDcsMTUgKzExNDcsMTYgQEAKIAlyZXR1cm4gaXA2X3BvbF9yb3V0ZShuZXQsIHRhYmxlLCBmbDYtPmZsb3dpNl9paWYsIGZsNiwgZmxhZ3MpOwogfQogCi1zdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqaXA2X3JvdXRlX2lucHV0X2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJc3RydWN0IGZsb3dpNiAqZmw2LCBpbnQgZmxhZ3MpCitzdHJ1Y3QgZHN0X2VudHJ5ICppcDZfcm91dGVfaW5wdXRfbG9va3VwKHN0cnVjdCBuZXQgKm5ldCwKKwkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZmxvd2k2ICpmbDYsIGludCBmbGFncykKIHsKIAlpZiAocnQ2X25lZWRfc3RyaWN0KCZmbDYtPmRhZGRyKSAmJiBkZXYtPnR5cGUgIT0gQVJQSFJEX1BJTVJFRykKIAkJZmxhZ3MgfD0gUlQ2X0xPT0tVUF9GX0lGQUNFOwogCiAJcmV0dXJuIGZpYjZfcnVsZV9sb29rdXAobmV0LCBmbDYsIGZsYWdzLCBpcDZfcG9sX3JvdXRlX2lucHV0KTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGlwNl9yb3V0ZV9pbnB1dF9sb29rdXApOwogCiB2b2lkIGlwNl9yb3V0ZV9pbnB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMTE2NCw3ICsxMTY1LDcgQEAKIAlpbnQgZmxhZ3MgPSBSVDZfTE9PS1VQX0ZfSEFTX1NBRERSOwogCXN0cnVjdCBpcF90dW5uZWxfaW5mbyAqdHVuX2luZm87CiAJc3RydWN0IGZsb3dpNiBmbDYgPSB7Ci0JCS5mbG93aTZfaWlmID0gbDNtZGV2X2ZpYl9vaWYoc2tiLT5kZXYpLAorCQkuZmxvd2k2X2lpZiA9IHNrYi0+ZGV2LT5pZmluZGV4LAogCQkuZGFkZHIgPSBpcGgtPmRhZGRyLAogCQkuc2FkZHIgPSBpcGgtPnNhZGRyLAogCQkuZmxvd2xhYmVsID0gaXA2X2Zsb3dpbmZvKGlwaCksCkBAIC0xMTg4LDEyICsxMTg5LDE1IEBACiBzdHJ1Y3QgZHN0X2VudHJ5ICppcDZfcm91dGVfb3V0cHV0X2ZsYWdzKHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IHNvY2sgKnNrLAogCQkJCQkgc3RydWN0IGZsb3dpNiAqZmw2LCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IGRzdF9lbnRyeSAqZHN0OwogCWJvb2wgYW55X3NyYzsKIAotCWRzdCA9IGwzbWRldl9nZXRfcnQ2X2RzdChuZXQsIGZsNik7Ci0JaWYgKGRzdCkKLQkJcmV0dXJuIGRzdDsKKwlpZiAocnQ2X25lZWRfc3RyaWN0KCZmbDYtPmRhZGRyKSkgeworCQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CisKKwkJZHN0ID0gbDNtZGV2X2xpbmtfc2NvcGVfbG9va3VwKG5ldCwgZmw2KTsKKwkJaWYgKGRzdCkKKwkJCXJldHVybiBkc3Q7CisJfQogCiAJZmw2LT5mbG93aTZfaWlmID0gTE9PUEJBQ0tfSUZJTkRFWDsKIApAQCAtMTYwNCw3ICsxNjA4LDkgQEAKIAlyY3VfcmVhZF91bmxvY2soKTsKIAogb3V0OgotCXJldHVybiBtaW5fdCh1bnNpZ25lZCBpbnQsIG10dSwgSVA2X01BWF9NVFUpOworCW10dSA9IG1pbl90KHVuc2lnbmVkIGludCwgbXR1LCBJUDZfTUFYX01UVSk7CisKKwlyZXR1cm4gbXR1IC0gbHd0dW5uZWxfaGVhZHJvb20oZHN0LT5sd3RzdGF0ZSwgbXR1KTsKIH0KIAogc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgKmljbXA2X2RzdF9nY19saXN0OwpAQCAtMTk4Niw5ICsxOTkyLDE4IEBACiAJCQlpZiAoIShnd2FfdHlwZSAmIElQVjZfQUREUl9VTklDQVNUKSkKIAkJCQlnb3RvIG91dDsKIAotCQkJaWYgKGNmZy0+ZmNfdGFibGUpCisJCQlpZiAoY2ZnLT5mY190YWJsZSkgewogCQkJCWdydCA9IGlwNl9uaF9sb29rdXBfdGFibGUobmV0LCBjZmcsIGd3X2FkZHIpOwogCisJCQkJaWYgKGdydCkgeworCQkJCQlpZiAoZ3J0LT5ydDZpX2ZsYWdzICYgUlRGX0dBVEVXQVkgfHwKKwkJCQkJICAgIChkZXYgJiYgZGV2ICE9IGdydC0+ZHN0LmRldikpIHsKKwkJCQkJCWlwNl9ydF9wdXQoZ3J0KTsKKwkJCQkJCWdydCA9IE5VTEw7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKIAkJCWlmICghZ3J0KQogCQkJCWdydCA9IHJ0Nl9sb29rdXAobmV0LCBnd19hZGRyLCBOVUxMLAogCQkJCQkJIGNmZy0+ZmNfaWZpbmRleCwgMSk7CkBAIC0yNTU2LDggKzI1NzEsMTYgQEAKIHsKIAl1MzIgdGJfaWQ7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChpZGV2LT5kZXYpOwotCXN0cnVjdCBydDZfaW5mbyAqcnQgPSBpcDZfZHN0X2FsbG9jKG5ldCwgbmV0LT5sb29wYmFja19kZXYsCi0JCQkJCSAgICBEU1RfTk9DT1VOVCk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5ldC0+bG9vcGJhY2tfZGV2OworCXN0cnVjdCBydDZfaW5mbyAqcnQ7CisKKwkvKiB1c2UgTDMgTWFzdGVyIGRldmljZSBhcyBsb29wYmFjayBmb3IgaG9zdCByb3V0ZXMgaWYgZGV2aWNlCisJICogaXMgZW5zbGF2ZWQgYW5kIGFkZHJlc3MgaXMgbm90IGxpbmsgbG9jYWwgb3IgbXVsdGljYXN0CisJICovCisJaWYgKCFydDZfbmVlZF9zdHJpY3QoYWRkcikpCisJCWRldiA9IGwzbWRldl9tYXN0ZXJfZGV2X3JjdShpZGV2LT5kZXYpID8gOiBkZXY7CisKKwlydCA9IGlwNl9kc3RfYWxsb2MobmV0LCBkZXYsIERTVF9OT0NPVU5UKTsKIAlpZiAoIXJ0KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIApAQCAtMzE5Myw3ICszMjE2LDkgQEAKIAlpZiAoaWlmKSB7CiAjaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFCiAJCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZydC0+cnQ2aV9kc3QuYWRkcikpIHsKLQkJCWludCBlcnIgPSBpcDZtcl9nZXRfcm91dGUobmV0LCBza2IsIHJ0bSwgbm93YWl0KTsKKwkJCWludCBlcnIgPSBpcDZtcl9nZXRfcm91dGUobmV0LCBza2IsIHJ0bSwgbm93YWl0LAorCQkJCQkJICBwb3J0aWQpOworCiAJCQlpZiAoZXJyIDw9IDApIHsKIAkJCQlpZiAoIW5vd2FpdCkgewogCQkJCQlpZiAoZXJyID09IDApCkBAIC0zMzM2LDExICszMzYxLDYgQEAKIAl9IGVsc2UgewogCQlmbDYuZmxvd2k2X29pZiA9IG9pZjsKIAotCQlpZiAobmV0aWZfaW5kZXhfaXNfbDNfbWFzdGVyKG5ldCwgb2lmKSkgewotCQkJZmw2LmZsb3dpNl9mbGFncyA9IEZMT1dJX0ZMQUdfTDNNREVWX1NSQyB8Ci0JCQkJCSAgIEZMT1dJX0ZMQUdfU0tJUF9OSF9PSUY7Ci0JCX0KLQogCQlydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKilpcDZfcm91dGVfb3V0cHV0KG5ldCwgTlVMTCwgJmZsNik7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9zaXQuYyBiL25ldC9pcHY2L3NpdC5jCmluZGV4IDE4MmI2YTkuLmIxY2RmODAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3NpdC5jCisrKyBiL25ldC9pcHY2L3NpdC5jCkBAIC02Miw3ICs2Miw3IEBACiAgICBGb3IgY29tbWVudHMgbG9vayBhdCBuZXQvaXB2NC9pcF9ncmUuYyAtLUFOSwogICovCiAKLSNkZWZpbmUgSEFTSF9TSVpFICAxNgorI2RlZmluZSBJUDZfU0lUX0hBU0hfU0laRSAgMTYKICNkZWZpbmUgSEFTSChhZGRyKSAoKChfX2ZvcmNlIHUzMilhZGRyXigoX19mb3JjZSB1MzIpYWRkcj4+NCkpJjB4RikKIAogc3RhdGljIGJvb2wgbG9nX2Vjbl9lcnJvciA9IHRydWU7CkBAIC03OCw5ICs3OCw5IEBACiAKIHN0YXRpYyBpbnQgc2l0X25ldF9pZCBfX3JlYWRfbW9zdGx5Owogc3RydWN0IHNpdF9uZXQgewotCXN0cnVjdCBpcF90dW5uZWwgX19yY3UgKnR1bm5lbHNfcl9sW0hBU0hfU0laRV07Ci0Jc3RydWN0IGlwX3R1bm5lbCBfX3JjdSAqdHVubmVsc19yW0hBU0hfU0laRV07Ci0Jc3RydWN0IGlwX3R1bm5lbCBfX3JjdSAqdHVubmVsc19sW0hBU0hfU0laRV07CisJc3RydWN0IGlwX3R1bm5lbCBfX3JjdSAqdHVubmVsc19yX2xbSVA2X1NJVF9IQVNIX1NJWkVdOworCXN0cnVjdCBpcF90dW5uZWwgX19yY3UgKnR1bm5lbHNfcltJUDZfU0lUX0hBU0hfU0laRV07CisJc3RydWN0IGlwX3R1bm5lbCBfX3JjdSAqdHVubmVsc19sW0lQNl9TSVRfSEFTSF9TSVpFXTsKIAlzdHJ1Y3QgaXBfdHVubmVsIF9fcmN1ICp0dW5uZWxzX3djWzFdOwogCXN0cnVjdCBpcF90dW5uZWwgX19yY3UgKip0dW5uZWxzWzRdOwogCkBAIC0xMTI2LDcgKzExMjYsNyBAQAogfQogI2VuZGlmCiAKLWJvb2wgaXBpcDZfdmFsaWRfaXBfcHJvdG8odTggaXBwcm90bykKK3N0YXRpYyBib29sIGlwaXA2X3ZhbGlkX2lwX3Byb3RvKHU4IGlwcHJvdG8pCiB7CiAJcmV0dXJuIGlwcHJvdG8gPT0gSVBQUk9UT19JUFY2IHx8CiAJCWlwcHJvdG8gPT0gSVBQUk9UT19JUElQIHx8CkBAIC0xNzgzLDcgKzE3ODMsNyBAQAogCiAJZm9yIChwcmlvID0gMTsgcHJpbyA8IDQ7IHByaW8rKykgewogCQlpbnQgaDsKLQkJZm9yIChoID0gMDsgaCA8IEhBU0hfU0laRTsgaCsrKSB7CisJCWZvciAoaCA9IDA7IGggPCBJUDZfU0lUX0hBU0hfU0laRTsgaCsrKSB7CiAJCQlzdHJ1Y3QgaXBfdHVubmVsICp0OwogCiAJCQl0ID0gcnRubF9kZXJlZmVyZW5jZShzaXRuLT50dW5uZWxzW3ByaW9dW2hdKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3RjcF9pcHY2LmMgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCmluZGV4IDMzZGY4YjguLjU0Y2Y3MTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3RjcF9pcHY2LmMKKysrIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwpAQCAtNjcxLDYgKzY3MSw3IEBACiAJCQkJICAgICAgTlVMTCwgc2tiKTsKIAogCWlmIChnZW5oYXNoIHx8IG1lbWNtcChoYXNoX2xvY2F0aW9uLCBuZXdoYXNoLCAxNikgIT0gMCkgeworCQlORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUE1ENUZBSUxVUkUpOwogCQluZXRfaW5mb19yYXRlbGltaXRlZCgiTUQ1IEhhc2ggJXMgZm9yIFslcEk2Y106JXUtPlslcEk2Y106JXVcbiIsCiAJCQkJICAgICBnZW5oYXNoID8gImZhaWxlZCIgOiAibWlzbWF0Y2giLAogCQkJCSAgICAgJmlwNmgtPnNhZGRyLCBudG9ocyh0aC0+c291cmNlKSwKQEAgLTgxNywxMiArODE4LDggQEAKIAlmbDYuZmxvd2k2X3Byb3RvID0gSVBQUk9UT19UQ1A7CiAJaWYgKHJ0Nl9uZWVkX3N0cmljdCgmZmw2LmRhZGRyKSAmJiAhb2lmKQogCQlmbDYuZmxvd2k2X29pZiA9IHRjcF92Nl9paWYoc2tiKTsKLQllbHNlIHsKLQkJaWYgKCFvaWYgJiYgbmV0aWZfaW5kZXhfaXNfbDNfbWFzdGVyKG5ldCwgc2tiLT5za2JfaWlmKSkKLQkJCW9pZiA9IHNrYi0+c2tiX2lpZjsKLQotCQlmbDYuZmxvd2k2X29pZiA9IG9pZjsKLQl9CisJZWxzZQorCQlmbDYuZmxvd2k2X29pZiA9IG9pZiA/IDogc2tiLT5za2JfaWlmOwogCiAJZmw2LmZsb3dpNl9tYXJrID0gSVA2X1JFUExZX01BUksobmV0LCBza2ItPm1hcmspOwogCWZsNi5mbDZfZHBvcnQgPSB0MS0+ZGVzdDsKQEAgLTk0NCw5ICs5NDEsMTUgQEAKIAkvKiBzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTiAtPiBmb3IgcmVndWxhciBUQ1BfU1lOX1JFQ1YKIAkgKiBzay0+c2tfc3RhdGUgPT0gVENQX1NZTl9SRUNWIC0+IGZvciBGYXN0IE9wZW4uCiAJICovCisJLyogUkZDIDczMjMgMi4zCisJICogVGhlIHdpbmRvdyBmaWVsZCAoU0VHLldORCkgb2YgZXZlcnkgb3V0Z29pbmcgc2VnbWVudCwgd2l0aCB0aGUKKwkgKiBleGNlcHRpb24gb2YgPFNZTj4gc2VnbWVudHMsIE1VU1QgYmUgcmlnaHQtc2hpZnRlZCBieQorCSAqIFJjdi5XaW5kLlNoaWZ0IGJpdHM6CisJICovCiAJdGNwX3Y2X3NlbmRfYWNrKHNrLCBza2IsIChzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgPwogCQkJdGNwX3JzayhyZXEpLT5zbnRfaXNuICsgMSA6IHRjcF9zayhzayktPnNuZF9ueHQsCi0JCQl0Y3BfcnNrKHJlcSktPnJjdl9ueHQsIHJlcS0+cnNrX3Jjdl93bmQsCisJCQl0Y3BfcnNrKHJlcSktPnJjdl9ueHQsCisJCQlyZXEtPnJza19yY3Zfd25kID4+IGluZXRfcnNrKHJlcSktPnJjdl93c2NhbGUsCiAJCQl0Y3BfdGltZV9zdGFtcCwgcmVxLT50c19yZWNlbnQsIHNrLT5za19ib3VuZF9kZXZfaWYsCiAJCQl0Y3BfdjZfbWQ1X2RvX2xvb2t1cChzaywgJmlwdjZfaGRyKHNrYiktPmRhZGRyKSwKIAkJCTAsIDApOwpAQCAtMTQwOSw2ICsxNDEyLDcgQEAKIAkJc2sgPSByZXEtPnJza19saXN0ZW5lcjsKIAkJdGNwX3Y2X2ZpbGxfY2Ioc2tiLCBoZHIsIHRoKTsKIAkJaWYgKHRjcF92Nl9pbmJvdW5kX21kNV9oYXNoKHNrLCBza2IpKSB7CisJCQlza19kcm9wc19hZGQoc2ssIHNrYik7CiAJCQlyZXFza19wdXQocmVxKTsKIAkJCWdvdG8gZGlzY2FyZF9pdDsKIAkJfQpAQCAtMTQ2NSwxMCArMTQ2OSw3IEBACiAJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7CiAJCWlmICghdGNwX3ByZXF1ZXVlKHNrLCBza2IpKQogCQkJcmV0ID0gdGNwX3Y2X2RvX3Jjdihzaywgc2tiKTsKLQl9IGVsc2UgaWYgKHVubGlrZWx5KHNrX2FkZF9iYWNrbG9nKHNrLCBza2IsCi0JCQkJCSAgIHNrLT5za19yY3ZidWYgKyBzay0+c2tfc25kYnVmKSkpIHsKLQkJYmhfdW5sb2NrX3NvY2soc2spOwotCQlfX05FVF9JTkNfU1RBVFMobmV0LCBMSU5VWF9NSUJfVENQQkFDS0xPR0RST1ApOworCX0gZWxzZSBpZiAodGNwX2FkZF9iYWNrbG9nKHNrLCBza2IpKSB7CiAJCWdvdG8gZGlzY2FyZF9hbmRfcmVsc2U7CiAJfQogCWJoX3VubG9ja19zb2NrKHNrKTsKQEAgLTE4NjIsMTcgKzE4NjMsNiBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIHRjcF92Nl9jbGVhcl9zayhzdHJ1Y3Qgc29jayAqc2ssIGludCBzaXplKQotewotCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKLQotCS8qIHdlIGRvIG5vdCB3YW50IHRvIGNsZWFyIHBpbmV0NiBmaWVsZCwgYmVjYXVzZSBvZiBSQ1UgbG9va3VwcyAqLwotCXNrX3Byb3RfY2xlYXJfbnVsbHMoc2ssIG9mZnNldG9mKHN0cnVjdCBpbmV0X3NvY2ssIHBpbmV0NikpOwotCi0Jc2l6ZSAtPSBvZmZzZXRvZihzdHJ1Y3QgaW5ldF9zb2NrLCBwaW5ldDYpICsgc2l6ZW9mKGluZXQtPnBpbmV0Nik7Ci0JbWVtc2V0KCZpbmV0LT5waW5ldDYgKyAxLCAwLCBzaXplKTsKLX0KLQogc3RydWN0IHByb3RvIHRjcHY2X3Byb3QgPSB7CiAJLm5hbWUJCQk9ICJUQ1B2NiIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKQEAgLTE5MTQsNyArMTkwNCw2IEBACiAJLmNvbXBhdF9zZXRzb2Nrb3B0CT0gY29tcGF0X3RjcF9zZXRzb2Nrb3B0LAogCS5jb21wYXRfZ2V0c29ja29wdAk9IGNvbXBhdF90Y3BfZ2V0c29ja29wdCwKICNlbmRpZgotCS5jbGVhcl9zawkJPSB0Y3BfdjZfY2xlYXJfc2ssCiAJLmRpYWdfZGVzdHJveQkJPSB0Y3BfYWJvcnQsCiB9OwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni91ZHAuYyBiL25ldC9pcHY2L3VkcC5jCmluZGV4IDgxZTJmOTguLjlhYTdjMWMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3VkcC5jCisrKyBiL25ldC9pcHY2L3VkcC5jCkBAIC0xNDI0LDE3ICsxNDI0LDYgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogCi12b2lkIHVkcF92Nl9jbGVhcl9zayhzdHJ1Y3Qgc29jayAqc2ssIGludCBzaXplKQotewotCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKLQotCS8qIHdlIGRvIG5vdCB3YW50IHRvIGNsZWFyIHBpbmV0NiBmaWVsZCwgYmVjYXVzZSBvZiBSQ1UgbG9va3VwcyAqLwotCXNrX3Byb3RfY2xlYXJfcG9ydGFkZHJfbnVsbHMoc2ssIG9mZnNldG9mKHN0cnVjdCBpbmV0X3NvY2ssIHBpbmV0NikpOwotCi0Jc2l6ZSAtPSBvZmZzZXRvZihzdHJ1Y3QgaW5ldF9zb2NrLCBwaW5ldDYpICsgc2l6ZW9mKGluZXQtPnBpbmV0Nik7Ci0JbWVtc2V0KCZpbmV0LT5waW5ldDYgKyAxLCAwLCBzaXplKTsKLX0KLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0cnVjdCBwcm90byB1ZHB2Nl9wcm90ID0gewpAQCAtMTQ2MCwxMyArMTQ0OSwxMiBAQAogCS5zeXNjdGxfd21lbQkgICA9ICZzeXNjdGxfdWRwX3dtZW1fbWluLAogCS5zeXNjdGxfcm1lbQkgICA9ICZzeXNjdGxfdWRwX3JtZW1fbWluLAogCS5vYmpfc2l6ZQkgICA9IHNpemVvZihzdHJ1Y3QgdWRwNl9zb2NrKSwKLQkuc2xhYl9mbGFncwkgICA9IFNMQUJfREVTVFJPWV9CWV9SQ1UsCiAJLmgudWRwX3RhYmxlCSAgID0gJnVkcF90YWJsZSwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9zZXRzb2Nrb3B0ID0gY29tcGF0X3VkcHY2X3NldHNvY2tvcHQsCiAJLmNvbXBhdF9nZXRzb2Nrb3B0ID0gY29tcGF0X3VkcHY2X2dldHNvY2tvcHQsCiAjZW5kaWYKLQkuY2xlYXJfc2sJICAgPSB1ZHBfdjZfY2xlYXJfc2ssCisJLmRpYWdfZGVzdHJveSAgICAgID0gdWRwX2Fib3J0LAogfTsKIAogc3RhdGljIHN0cnVjdCBpbmV0X3Byb3Rvc3cgdWRwdjZfcHJvdG9zdyA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcF9pbXBsLmggYi9uZXQvaXB2Ni91ZHBfaW1wbC5oCmluZGV4IDA2ODJjMDMuLmY2ZWIxYWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3VkcF9pbXBsLmgKKysrIGIvbmV0L2lwdjYvdWRwX2ltcGwuaApAQCAtMjksOCArMjksNiBAQAogaW50IHVkcHY2X3F1ZXVlX3Jjdl9za2Ioc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHZvaWQgdWRwdjZfZGVzdHJveV9zb2NrKHN0cnVjdCBzb2NrICpzayk7CiAKLXZvaWQgdWRwX3Y2X2NsZWFyX3NrKHN0cnVjdCBzb2NrICpzaywgaW50IHNpemUpOwotCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIGludCB1ZHA2X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwbGl0ZS5jIGIvbmV0L2lwdjYvdWRwbGl0ZS5jCmluZGV4IDljZjA5N2UuLjQ3ZDBkMmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3VkcGxpdGUuYworKysgYi9uZXQvaXB2Ni91ZHBsaXRlLmMKQEAgLTUwLDEzICs1MCwxMSBAQAogCS51bmhhc2gJCSAgID0gdWRwX2xpYl91bmhhc2gsCiAJLmdldF9wb3J0CSAgID0gdWRwX3Y2X2dldF9wb3J0LAogCS5vYmpfc2l6ZQkgICA9IHNpemVvZihzdHJ1Y3QgdWRwNl9zb2NrKSwKLQkuc2xhYl9mbGFncwkgICA9IFNMQUJfREVTVFJPWV9CWV9SQ1UsCiAJLmgudWRwX3RhYmxlCSAgID0gJnVkcGxpdGVfdGFibGUsCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfc2V0c29ja29wdCA9IGNvbXBhdF91ZHB2Nl9zZXRzb2Nrb3B0LAogCS5jb21wYXRfZ2V0c29ja29wdCA9IGNvbXBhdF91ZHB2Nl9nZXRzb2Nrb3B0LAogI2VuZGlmCi0JLmNsZWFyX3NrCSAgID0gdWRwX3Y2X2NsZWFyX3NrLAogfTsKIAogc3RhdGljIHN0cnVjdCBpbmV0X3Byb3Rvc3cgdWRwbGl0ZTZfcHJvdG9zdyA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X2lucHV0LmMgYi9uZXQvaXB2Ni94ZnJtNl9pbnB1dC5jCmluZGV4IDBlYWFiMWYuLmI1Nzg5NTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X2lucHV0LmMKKysrIGIvbmV0L2lwdjYveGZybTZfaW5wdXQuYwpAQCAtMjEsOCArMjEsMTAgQEAKIAlyZXR1cm4geGZybTZfZXh0cmFjdF9oZWFkZXIoc2tiKTsKIH0KIAotaW50IHhmcm02X3Jjdl9zcGkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5leHRoZHIsIF9fYmUzMiBzcGkpCitpbnQgeGZybTZfcmN2X3NwaShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbmV4dGhkciwgX19iZTMyIHNwaSwKKwkJICBzdHJ1Y3QgaXA2X3RubCAqdCkKIHsKKwlYRlJNX1RVTk5FTF9TS0JfQ0Ioc2tiKS0+dHVubmVsLmlwNiA9IHQ7CiAJWEZSTV9TUElfU0tCX0NCKHNrYiktPmZhbWlseSA9IEFGX0lORVQ2OwogCVhGUk1fU1BJX1NLQl9DQihza2IpLT5kYWRkcm9mZiA9IG9mZnNldG9mKHN0cnVjdCBpcHY2aGRyLCBkYWRkcik7CiAJcmV0dXJuIHhmcm1faW5wdXQoc2tiLCBuZXh0aGRyLCBzcGksIDApOwpAQCAtNDgsMTMgKzUwLDE4IEBACiAJcmV0dXJuIC0xOwogfQogCi1pbnQgeGZybTZfcmN2KHN0cnVjdCBza19idWZmICpza2IpCitpbnQgeGZybTZfcmN2X3RubChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXA2X3RubCAqdCkKIHsKIAlyZXR1cm4geGZybTZfcmN2X3NwaShza2IsIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpW0lQNkNCKHNrYiktPm5ob2ZmXSwKLQkJCSAgICAgMCk7CisJCQkgICAgIDAsIHQpOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtNl9yY3ZfdG5sKTsKKworaW50IHhmcm02X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiB4ZnJtNl9yY3ZfdG5sKHNrYiwgTlVMTCk7CiB9CiBFWFBPUlRfU1lNQk9MKHhmcm02X3Jjdik7Ci0KIGludCB4ZnJtNl9pbnB1dF9hZGRyKHN0cnVjdCBza19idWZmICpza2IsIHhmcm1fYWRkcmVzc190ICpkYWRkciwKIAkJICAgICB4ZnJtX2FkZHJlc3NfdCAqc2FkZHIsIHU4IHByb3RvKQogewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfcG9saWN5LmMgYi9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYwppbmRleCA2Y2M5NzAwLi5lMGY3MWMwIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYwpAQCAtMzYsNyArMzYsNyBAQAogCWludCBlcnI7CiAKIAltZW1zZXQoJmZsNiwgMCwgc2l6ZW9mKGZsNikpOwotCWZsNi5mbG93aTZfb2lmID0gb2lmOworCWZsNi5mbG93aTZfb2lmID0gbDNtZGV2X21hc3Rlcl9pZmluZGV4X2J5X2luZGV4KG5ldCwgb2lmKTsKIAlmbDYuZmxvd2k2X2ZsYWdzID0gRkxPV0lfRkxBR19TS0lQX05IX09JRjsKIAltZW1jcHkoJmZsNi5kYWRkciwgZGFkZHIsIHNpemVvZihmbDYuZGFkZHIpKTsKIAlpZiAoc2FkZHIpCkBAIC0xMzQsNyArMTM0LDcgQEAKIAluZXh0aGRyID0gbmhbbmhvZmZdOwogCiAJaWYgKHNrYl9kc3Qoc2tiKSkKLQkJb2lmID0gbDNtZGV2X2ZpYl9vaWYoc2tiX2RzdChza2IpLT5kZXYpOworCQlvaWYgPSBza2JfZHN0KHNrYiktPmRldi0+aWZpbmRleDsKIAogCW1lbXNldChmbDYsIDAsIHNpemVvZihzdHJ1Y3QgZmxvd2k2KSk7CiAJZmw2LT5mbG93aTZfbWFyayA9IHNrYi0+bWFyazsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X3R1bm5lbC5jIGIvbmV0L2lwdjYveGZybTZfdHVubmVsLmMKaW5kZXggNTc0MzA0NC4uZTFjMGJiZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfdHVubmVsLmMKKysrIGIvbmV0L2lwdjYveGZybTZfdHVubmVsLmMKQEAgLTIzNiw3ICsyMzYsNyBAQAogCV9fYmUzMiBzcGk7CiAKIAlzcGkgPSB4ZnJtNl90dW5uZWxfc3BpX2xvb2t1cChuZXQsIChjb25zdCB4ZnJtX2FkZHJlc3NfdCAqKSZpcGgtPnNhZGRyKTsKLQlyZXR1cm4geGZybTZfcmN2X3NwaShza2IsIElQUFJPVE9fSVBWNiwgc3BpKTsKKwlyZXR1cm4geGZybTZfcmN2X3NwaShza2IsIElQUFJPVE9fSVBWNiwgc3BpLCBOVUxMKTsKIH0KIAogc3RhdGljIGludCB4ZnJtNl90dW5uZWxfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LApkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvYWZfaXJkYS5jIGIvbmV0L2lyZGEvYWZfaXJkYS5jCmluZGV4IDhkMmY3YzkuLjM5MWMzY2IgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2FmX2lyZGEuYworKysgYi9uZXQvaXJkYS9hZl9pcmRhLmMKQEAgLTgzMiw3ICs4MzIsNyBAQAogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBpcmRhX3NvY2sgKm5ldywgKnNlbGYgPSBpcmRhX3NrKHNrKTsKIAlzdHJ1Y3Qgc29jayAqbmV3c2s7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAlpbnQgZXJyOwogCiAJZXJyID0gaXJkYV9jcmVhdGUoc29ja19uZXQoc2spLCBuZXdzb2NrLCBzay0+c2tfcHJvdG9jb2wsIDApOwpAQCAtODQ1LDkgKzg0NSw2IEBACiAJaWYgKHNvY2stPnN0YXRlICE9IFNTX1VOQ09OTkVDVEVEKQogCQlnb3RvIG91dDsKIAotCWlmICgoc2sgPSBzb2NrLT5zaykgPT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0KIAllcnIgPSAtRU9QTk9UU1VQUDsKIAlpZiAoKHNrLT5za190eXBlICE9IFNPQ0tfU1RSRUFNKSAmJiAoc2stPnNrX3R5cGUgIT0gU09DS19TRVFQQUNLRVQpICYmCiAJICAgIChzay0+c2tfdHlwZSAhPSBTT0NLX0RHUkFNKSkKQEAgLTkwMCw3ICs4OTcsNiBAQAogCWVyciA9IC1FUEVSTTsgLyogdmFsdWUgZG9lcyBub3Qgc2VlbSB0byBtYWtlIHNlbnNlLiAtYXJuZCAqLwogCWlmICghbmV3LT50c2FwKSB7CiAJCXByX2RlYnVnKCIlcygpLCBkdXAgZmFpbGVkIVxuIiwgX19mdW5jX18pOwotCQlrZnJlZV9za2Ioc2tiKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC05MTksNyArOTE1LDYgQEAKIAkvKiBDbGVhbiB1cCB0aGUgb3JpZ2luYWwgb25lIHRvIGtlZXAgaXQgaW4gbGlzdGVuIHN0YXRlICovCiAJaXJ0dHBfbGlzdGVuKHNlbGYtPnRzYXApOwogCi0Ja2ZyZWVfc2tiKHNrYik7CiAJc2stPnNrX2Fja19iYWNrbG9nLS07CiAKIAluZXdzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKQEAgLTkyNyw2ICs5MjIsNyBAQAogCWlyZGFfY29ubmVjdF9yZXNwb25zZShuZXcpOwogCWVyciA9IDA7CiBvdXQ6CisJa2ZyZWVfc2tiKHNrYik7CiAJcmVsZWFzZV9zb2NrKHNrKTsKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJpYXAuYyBiL25ldC9pcmRhL2lyaWFwLmMKaW5kZXggNGE3YWUzMmEuLjExMzhlYWYgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lyaWFwLmMKKysrIGIvbmV0L2lyZGEvaXJpYXAuYwpAQCAtMTg1LDggKzE4NSwxMiBAQAogCiAJc2VsZi0+bWFnaWMgPSBJQVNfTUFHSUM7CiAJc2VsZi0+bW9kZSA9IG1vZGU7Ci0JaWYgKG1vZGUgPT0gSUFTX0NMSUVOVCkKLQkJaXJpYXBfcmVnaXN0ZXJfbHNhcChzZWxmLCBzbHNhcF9zZWwsIG1vZGUpOworCWlmIChtb2RlID09IElBU19DTElFTlQpIHsKKwkJaWYgKGlyaWFwX3JlZ2lzdGVyX2xzYXAoc2VsZiwgc2xzYXBfc2VsLCBtb2RlKSkgeworCQkJa2ZyZWUoc2VsZik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KIAogCXNlbGYtPmNvbmZpcm0gPSBjYWxsYmFjazsKIAlzZWxmLT5wcml2ID0gcHJpdjsKZGlmZiAtLWdpdCBhL25ldC9rY20vS2NvbmZpZyBiL25ldC9rY20vS2NvbmZpZwppbmRleCA1ZGI5NGQ5Li44N2ZjYTM2IDEwMDY0NAotLS0gYS9uZXQva2NtL0tjb25maWcKKysrIGIvbmV0L2tjbS9LY29uZmlnCkBAIC0zLDYgKzMsNyBAQAogCXRyaXN0YXRlICJLQ00gc29ja2V0cyIKIAlkZXBlbmRzIG9uIElORVQKIAlzZWxlY3QgQlBGX1NZU0NBTEwKKwlzZWxlY3QgU1RSRUFNX1BBUlNFUgogCS0tLWhlbHAtLS0KIAkgIEtDTSAoS2VybmVsIENvbm5lY3Rpb24gTXVsdGlwbGV4b3IpIHNvY2tldHMgcHJvdmlkZSBhIG1ldGhvZAogCSAgZm9yIG11bHRpcGxleGluZyBtZXNzYWdlcyBvZiBhIG1lc3NhZ2UgYmFzZWQgYXBwbGljYXRpb24KZGlmZiAtLWdpdCBhL25ldC9rY20va2NtcHJvYy5jIGIvbmV0L2tjbS9rY21wcm9jLmMKaW5kZXggMTZjMmUwMy4uYmY3NWM5MiAxMDA2NDQKLS0tIGEvbmV0L2tjbS9rY21wcm9jLmMKKysrIGIvbmV0L2tjbS9rY21wcm9jLmMKQEAgLTE1NSw4ICsxNTUsOCBAQAogCXNlcV9wcmludGYoc2VxLAogCQkgICAiICAgcHNvY2stJS01dSAlLTEwbGx1ICUtMTZsbHUgJS0xMGxsdSAlLTE2bGx1ICUtOGQgJS04ZCAlLThkICUtOGQgIiwKIAkJICAgcHNvY2stPmluZGV4LAotCQkgICBwc29jay0+c3RhdHMucnhfbXNncywKLQkJICAgcHNvY2stPnN0YXRzLnJ4X2J5dGVzLAorCQkgICBwc29jay0+c3RycC5zdGF0cy5yeF9tc2dzLAorCQkgICBwc29jay0+c3RycC5zdGF0cy5yeF9ieXRlcywKIAkJICAgcHNvY2stPnN0YXRzLnR4X21zZ3MsCiAJCSAgIHBzb2NrLT5zdGF0cy50eF9ieXRlcywKIAkJICAgcHNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlLnFsZW4sCkBAIC0xNzAsMTQgKzE3MCwyNyBAQAogCWlmIChwc29jay0+dHhfc3RvcHBlZCkKIAkJc2VxX3B1dHMoc2VxLCAiVHhTdG9wICIpOwogCi0JaWYgKHBzb2NrLT5yeF9zdG9wcGVkKQorCWlmIChwc29jay0+c3RycC5yeF9zdG9wcGVkKQogCQlzZXFfcHV0cyhzZXEsICJSeFN0b3AgIik7CiAKIAlpZiAocHNvY2stPnR4X2tjbSkKIAkJc2VxX3ByaW50ZihzZXEsICJSc3ZkLSVkICIsIHBzb2NrLT50eF9rY20tPmluZGV4KTsKIAotCWlmIChwc29jay0+cmVhZHlfcnhfbXNnKQotCQlzZXFfcHV0cyhzZXEsICJSZHlSeCAiKTsKKwlpZiAoIXBzb2NrLT5zdHJwLnJ4X3BhdXNlZCAmJiAhcHNvY2stPnJlYWR5X3J4X21zZykgeworCQlpZiAocHNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlLnFsZW4pIHsKKwkJCWlmIChwc29jay0+c3RycC5yeF9uZWVkX2J5dGVzKQorCQkJCXNlcV9wcmludGYoc2VxLCAiUnhXYWl0PSV1ICIsCisJCQkJCSAgIHBzb2NrLT5zdHJwLnJ4X25lZWRfYnl0ZXMpOworCQkJZWxzZQorCQkJCXNlcV9wcmludGYoc2VxLCAiUnhXYWl0ICIpOworCQl9CisJfSBlbHNlICB7CisJCWlmIChwc29jay0+c3RycC5yeF9wYXVzZWQpCisJCQlzZXFfcHV0cyhzZXEsICJSeFBhdXNlICIpOworCisJCWlmIChwc29jay0+cmVhZHlfcnhfbXNnKQorCQkJc2VxX3B1dHMoc2VxLCAiUmR5UnggIik7CisJfQogCiAJc2VxX3B1dHMoc2VxLCAiXG4iKTsKIH0KQEAgLTI3NSw2ICsyODgsNyBAQAogewogCXN0cnVjdCBrY21fcHNvY2tfc3RhdHMgcHNvY2tfc3RhdHM7CiAJc3RydWN0IGtjbV9tdXhfc3RhdHMgbXV4X3N0YXRzOworCXN0cnVjdCBzdHJwX2FnZ3Jfc3RhdHMgc3RycF9zdGF0czsKIAlzdHJ1Y3Qga2NtX211eCAqbXV4OwogCXN0cnVjdCBrY21fcHNvY2sgKnBzb2NrOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNlcS0+cHJpdmF0ZTsKQEAgLTI4MiwyMCArMjk2LDI4IEBACiAKIAltZW1zZXQoJm11eF9zdGF0cywgMCwgc2l6ZW9mKG11eF9zdGF0cykpOwogCW1lbXNldCgmcHNvY2tfc3RhdHMsIDAsIHNpemVvZihwc29ja19zdGF0cykpOworCW1lbXNldCgmc3RycF9zdGF0cywgMCwgc2l6ZW9mKHN0cnBfc3RhdHMpKTsKIAogCW11dGV4X2xvY2soJmtuZXQtPm11dGV4KTsKIAogCWFnZ3JlZ2F0ZV9tdXhfc3RhdHMoJmtuZXQtPmFnZ3JlZ2F0ZV9tdXhfc3RhdHMsICZtdXhfc3RhdHMpOwogCWFnZ3JlZ2F0ZV9wc29ja19zdGF0cygma25ldC0+YWdncmVnYXRlX3Bzb2NrX3N0YXRzLAogCQkJICAgICAgJnBzb2NrX3N0YXRzKTsKKwlhZ2dyZWdhdGVfc3RycF9zdGF0cygma25ldC0+YWdncmVnYXRlX3N0cnBfc3RhdHMsCisJCQkgICAgICZzdHJwX3N0YXRzKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG11eCwgJmtuZXQtPm11eF9saXN0LCBrY21fbXV4X2xpc3QpIHsKIAkJc3Bpbl9sb2NrX2JoKCZtdXgtPmxvY2spOwogCQlhZ2dyZWdhdGVfbXV4X3N0YXRzKCZtdXgtPnN0YXRzLCAmbXV4X3N0YXRzKTsKIAkJYWdncmVnYXRlX3Bzb2NrX3N0YXRzKCZtdXgtPmFnZ3JlZ2F0ZV9wc29ja19zdGF0cywKIAkJCQkgICAgICAmcHNvY2tfc3RhdHMpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBzb2NrLCAmbXV4LT5wc29ja3MsIHBzb2NrX2xpc3QpCisJCWFnZ3JlZ2F0ZV9zdHJwX3N0YXRzKCZtdXgtPmFnZ3JlZ2F0ZV9zdHJwX3N0YXRzLAorCQkJCSAgICAgJnN0cnBfc3RhdHMpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBzb2NrLCAmbXV4LT5wc29ja3MsIHBzb2NrX2xpc3QpIHsKIAkJCWFnZ3JlZ2F0ZV9wc29ja19zdGF0cygmcHNvY2stPnN0YXRzLCAmcHNvY2tfc3RhdHMpOworCQkJc2F2ZV9zdHJwX3N0YXRzKCZwc29jay0+c3RycCwgJnN0cnBfc3RhdHMpOworCQl9CisKIAkJc3Bpbl91bmxvY2tfYmgoJm11eC0+bG9jayk7CiAJfQogCkBAIC0zMjgsNyArMzUwLDcgQEAKIAkJICAgbXV4X3N0YXRzLnJ4X3JlYWR5X2Ryb3BzKTsKIAogCXNlcV9wcmludGYoc2VxLAotCQkgICAiJS04cyAlLTEwcyAlLTE2cyAlLTEwcyAlLTE2cyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKKwkJICAgIiUtOHMgJS0xMHMgJS0xNnMgJS0xMHMgJS0xNnMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsCiAJCSAgICJQc29jayIsCiAJCSAgICJSWC1Nc2dzIiwKIAkJICAgIlJYLUJ5dGVzIiwKQEAgLTMzNyw2ICszNTksOCBAQAogCQkgICAiUmVzZXJ2ZWQiLAogCQkgICAiVW5yZXNlcnZlZCIsCiAJCSAgICJSWC1BYm9ydHMiLAorCQkgICAiUlgtSW50ciIsCisJCSAgICJSWC1VbnJlY292IiwKIAkJICAgIlJYLU1lbUZhaWwiLAogCQkgICAiUlgtTmVlZE1vciIsCiAJCSAgICJSWC1CYWRMZW4iLApAQCAtMzQ1LDIwICszNjksMjIgQEAKIAkJICAgIlRYLUFib3J0cyIpOwogCiAJc2VxX3ByaW50ZihzZXEsCi0JCSAgICIlLThzICUtMTBsbHUgJS0xNmxsdSAlLTEwbGx1ICUtMTZsbHUgJS0xMGxsdSAlLTEwbGx1ICUtMTB1ICUtMTB1ICUtMTB1ICUtMTB1ICUtMTB1ICUtMTB1ICUtMTB1XG4iLAorCQkgICAiJS04cyAlLTEwbGx1ICUtMTZsbHUgJS0xMGxsdSAlLTE2bGx1ICUtMTBsbHUgJS0xMGxsdSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdVxuIiwKIAkJICAgIiIsCi0JCSAgIHBzb2NrX3N0YXRzLnJ4X21zZ3MsCi0JCSAgIHBzb2NrX3N0YXRzLnJ4X2J5dGVzLAorCQkgICBzdHJwX3N0YXRzLnJ4X21zZ3MsCisJCSAgIHN0cnBfc3RhdHMucnhfYnl0ZXMsCiAJCSAgIHBzb2NrX3N0YXRzLnR4X21zZ3MsCiAJCSAgIHBzb2NrX3N0YXRzLnR4X2J5dGVzLAogCQkgICBwc29ja19zdGF0cy5yZXNlcnZlZCwKIAkJICAgcHNvY2tfc3RhdHMudW5yZXNlcnZlZCwKLQkJICAgcHNvY2tfc3RhdHMucnhfYWJvcnRzLAotCQkgICBwc29ja19zdGF0cy5yeF9tZW1fZmFpbCwKLQkJICAgcHNvY2tfc3RhdHMucnhfbmVlZF9tb3JlX2hkciwKLQkJICAgcHNvY2tfc3RhdHMucnhfYmFkX2hkcl9sZW4sCi0JCSAgIHBzb2NrX3N0YXRzLnJ4X21zZ190b29fYmlnLAotCQkgICBwc29ja19zdGF0cy5yeF9tc2dfdGltZW91dHMsCisJCSAgIHN0cnBfc3RhdHMucnhfYWJvcnRzLAorCQkgICBzdHJwX3N0YXRzLnJ4X2ludGVycnVwdGVkLAorCQkgICBzdHJwX3N0YXRzLnJ4X3VucmVjb3ZfaW50ciwKKwkJICAgc3RycF9zdGF0cy5yeF9tZW1fZmFpbCwKKwkJICAgc3RycF9zdGF0cy5yeF9uZWVkX21vcmVfaGRyLAorCQkgICBzdHJwX3N0YXRzLnJ4X2JhZF9oZHJfbGVuLAorCQkgICBzdHJwX3N0YXRzLnJ4X21zZ190b29fYmlnLAorCQkgICBzdHJwX3N0YXRzLnJ4X21zZ190aW1lb3V0cywKIAkJICAgcHNvY2tfc3RhdHMudHhfYWJvcnRzKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L2tjbS9rY21zb2NrLmMgYi9uZXQva2NtL2tjbXNvY2suYwppbmRleCBjYjM5ZTA1Li5iN2Y4NjlhOCAxMDA2NDQKLS0tIGEvbmV0L2tjbS9rY21zb2NrLmMKKysrIGIvbmV0L2tjbS9rY21zb2NrLmMKQEAgLTEsMyArMSwxMyBAQAorLyoKKyAqIEtlcm5lbCBDb25uZWN0aW9uIE11bHRpcGxleG9yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFRvbSBIZXJiZXJ0IDx0b21AaGVyYmVydGxhbmQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKwogI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZXJycXVldWUuaD4KQEAgLTEzLDEwICsyMywxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPG5ldC9rY20uaD4KICNpbmNsdWRlIDxuZXQvbmV0bnMvZ2VuZXJpYy5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0jaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPHVhcGkvbGludXgva2NtLmg+CiAKIHVuc2lnbmVkIGludCBrY21fbmV0X2lkOwpAQCAtMzUsMzggKzQ1LDEyIEBACiAJcmV0dXJuIChzdHJ1Y3Qga2NtX3R4X21zZyAqKXNrYi0+Y2I7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGtjbV9yeF9tc2cgKmtjbV9yeF9tc2coc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gKHN0cnVjdCBrY21fcnhfbXNnICopKCh2b2lkICopc2tiLT5jYiArCi0JCQkJICAgICBvZmZzZXRvZihzdHJ1Y3QgcWRpc2Nfc2tiX2NiLCBkYXRhKSk7Ci19Ci0KIHN0YXRpYyB2b2lkIHJlcG9ydF9jc2tfZXJyb3Ioc3RydWN0IHNvY2sgKmNzaywgaW50IGVycikKIHsKIAljc2stPnNrX2VyciA9IEVQSVBFOwogCWNzay0+c2tfZXJyb3JfcmVwb3J0KGNzayk7CiB9CiAKLS8qIENhbGxiYWNrIGxvY2sgaGVsZCAqLwotc3RhdGljIHZvaWQga2NtX2Fib3J0X3J4X3Bzb2NrKHN0cnVjdCBrY21fcHNvY2sgKnBzb2NrLCBpbnQgZXJyLAotCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHNvY2sgKmNzayA9IHBzb2NrLT5zazsKLQotCS8qIFVucmVjb3ZlcmFibGUgZXJyb3IgaW4gcmVjZWl2ZSAqLwotCi0JZGVsX3RpbWVyKCZwc29jay0+cnhfbXNnX3RpbWVyKTsKLQotCWlmIChwc29jay0+cnhfc3RvcHBlZCkKLQkJcmV0dXJuOwotCi0JcHNvY2stPnJ4X3N0b3BwZWQgPSAxOwotCUtDTV9TVEFUU19JTkNSKHBzb2NrLT5zdGF0cy5yeF9hYm9ydHMpOwotCi0JLyogUmVwb3J0IGFuIGVycm9yIG9uIHRoZSBsb3dlciBzb2NrZXQgKi8KLQlyZXBvcnRfY3NrX2Vycm9yKGNzaywgZXJyKTsKLX0KLQogc3RhdGljIHZvaWQga2NtX2Fib3J0X3R4X3Bzb2NrKHN0cnVjdCBrY21fcHNvY2sgKnBzb2NrLCBpbnQgZXJyLAogCQkJICAgICAgIGJvb2wgd2FrZXVwX2tjbSkKIHsKQEAgLTEwOSwxMiArOTMsMTMgQEAKIHN0YXRpYyB2b2lkIGtjbV91cGRhdGVfcnhfbXV4X3N0YXRzKHN0cnVjdCBrY21fbXV4ICptdXgsCiAJCQkJICAgIHN0cnVjdCBrY21fcHNvY2sgKnBzb2NrKQogewotCUtDTV9TVEFUU19BREQobXV4LT5zdGF0cy5yeF9ieXRlcywKLQkJICAgICAgcHNvY2stPnN0YXRzLnJ4X2J5dGVzIC0gcHNvY2stPnNhdmVkX3J4X2J5dGVzKTsKKwlTVFJQX1NUQVRTX0FERChtdXgtPnN0YXRzLnJ4X2J5dGVzLAorCQkgICAgICAgcHNvY2stPnN0cnAuc3RhdHMucnhfYnl0ZXMgLQorCQkgICAgICAgcHNvY2stPnNhdmVkX3J4X2J5dGVzKTsKIAltdXgtPnN0YXRzLnJ4X21zZ3MgKz0KLQkJcHNvY2stPnN0YXRzLnJ4X21zZ3MgLSBwc29jay0+c2F2ZWRfcnhfbXNnczsKLQlwc29jay0+c2F2ZWRfcnhfbXNncyA9IHBzb2NrLT5zdGF0cy5yeF9tc2dzOwotCXBzb2NrLT5zYXZlZF9yeF9ieXRlcyA9IHBzb2NrLT5zdGF0cy5yeF9ieXRlczsKKwkJcHNvY2stPnN0cnAuc3RhdHMucnhfbXNncyAtIHBzb2NrLT5zYXZlZF9yeF9tc2dzOworCXBzb2NrLT5zYXZlZF9yeF9tc2dzID0gcHNvY2stPnN0cnAuc3RhdHMucnhfbXNnczsKKwlwc29jay0+c2F2ZWRfcnhfYnl0ZXMgPSBwc29jay0+c3RycC5zdGF0cy5yeF9ieXRlczsKIH0KIAogc3RhdGljIHZvaWQga2NtX3VwZGF0ZV90eF9tdXhfc3RhdHMoc3RydWN0IGtjbV9tdXggKm11eCwKQEAgLTE2NywxMSArMTUyLDExIEBACiAJCSAqLwogCQlsaXN0X2RlbCgmcHNvY2stPnBzb2NrX3JlYWR5X2xpc3QpOwogCQlwc29jay0+cmVhZHlfcnhfbXNnID0gTlVMTDsKLQogCQkvKiBDb21taXQgY2xlYXJpbmcgb2YgcmVhZHlfcnhfbXNnIGZvciBxdWV1aW5nIHdvcmsgKi8KIAkJc21wX21iKCk7CiAKLQkJcXVldWVfd29yayhrY21fd3EsICZwc29jay0+cnhfd29yayk7CisJCXN0cnBfdW5wYXVzZSgmcHNvY2stPnN0cnApOworCQlzdHJwX2NoZWNrX3JjdigmcHNvY2stPnN0cnApOwogCX0KIAogCS8qIEJ1ZmZlciBsaW1pdCBpcyBva2F5IG5vdywgYWRkIHRvIHJlYWR5IGxpc3QgKi8KQEAgLTI4NSw2ICsyNzAsNyBAQAogCiAJaWYgKGxpc3RfZW1wdHkoJm11eC0+a2NtX3J4X3dhaXRlcnMpKSB7CiAJCXBzb2NrLT5yZWFkeV9yeF9tc2cgPSBoZWFkOworCQlzdHJwX3BhdXNlKCZwc29jay0+c3RycCk7CiAJCWxpc3RfYWRkX3RhaWwoJnBzb2NrLT5wc29ja19yZWFkeV9saXN0LAogCQkJICAgICAgJm11eC0+cHNvY2tzX3JlYWR5KTsKIAkJc3Bpbl91bmxvY2tfYmgoJm11eC0+cnhfbG9jayk7CkBAIC0zNTMsMzQ2ICszMzksNjAgQEAKIAlzcGluX3VubG9ja19iaCgmbXV4LT5yeF9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQga2NtX3N0YXJ0X3J4X3RpbWVyKHN0cnVjdCBrY21fcHNvY2sgKnBzb2NrKQotewotCWlmIChwc29jay0+c2stPnNrX3JjdnRpbWVvKQotCQltb2RfdGltZXIoJnBzb2NrLT5yeF9tc2dfdGltZXIsIHBzb2NrLT5zay0+c2tfcmN2dGltZW8pOwotfQotCi0vKiBNYWNybyB0byBpbnZva2UgZmlsdGVyIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBLQ01fUlVOX0ZJTFRFUihwcm9nLCBjdHgpIFwKLQkoKnByb2ctPmJwZl9mdW5jKShjdHgsIHByb2ctPmluc25zaSkKLQotLyogTG93ZXIgc29ja2V0IGxvY2sgaGVsZCAqLwotc3RhdGljIGludCBrY21fdGNwX3JlY3YocmVhZF9kZXNjcmlwdG9yX3QgKmRlc2MsIHN0cnVjdCBza19idWZmICpvcmlnX3NrYiwKLQkJCXVuc2lnbmVkIGludCBvcmlnX29mZnNldCwgc2l6ZV90IG9yaWdfbGVuKQotewotCXN0cnVjdCBrY21fcHNvY2sgKnBzb2NrID0gKHN0cnVjdCBrY21fcHNvY2sgKilkZXNjLT5hcmcuZGF0YTsKLQlzdHJ1Y3Qga2NtX3J4X21zZyAqcnhtOwotCXN0cnVjdCBrY21fc29jayAqa2NtOwotCXN0cnVjdCBza19idWZmICpoZWFkLCAqc2tiOwotCXNpemVfdCBlYXRlbiA9IDAsIGNhbmRfbGVuOwotCXNzaXplX3QgZXh0cmE7Ci0JaW50IGVycjsKLQlib29sIGNsb25lZF9vcmlnID0gZmFsc2U7Ci0KLQlpZiAocHNvY2stPnJlYWR5X3J4X21zZykKLQkJcmV0dXJuIDA7Ci0KLQloZWFkID0gcHNvY2stPnJ4X3NrYl9oZWFkOwotCWlmIChoZWFkKSB7Ci0JCS8qIE1lc3NhZ2UgYWxyZWFkeSBpbiBwcm9ncmVzcyAqLwotCi0JCXJ4bSA9IGtjbV9yeF9tc2coaGVhZCk7Ci0JCWlmICh1bmxpa2VseShyeG0tPmVhcmx5X2VhdGVuKSkgewotCQkJLyogQWxyZWFkeSBzb21lIG51bWJlciBvZiBieXRlcyBvbiB0aGUgcmVjZWl2ZSBzb2NrCi0JCQkgKiBkYXRhIHNhdmVkIGluIHJ4X3NrYl9oZWFkLCBqdXN0IGluZGljYXRlIHRoZXkKLQkJCSAqIGFyZSBjb25zdW1lZC4KLQkJCSAqLwotCQkJZWF0ZW4gPSBvcmlnX2xlbiA8PSByeG0tPmVhcmx5X2VhdGVuID8KLQkJCQlvcmlnX2xlbiA6IHJ4bS0+ZWFybHlfZWF0ZW47Ci0JCQlyeG0tPmVhcmx5X2VhdGVuIC09IGVhdGVuOwotCi0JCQlyZXR1cm4gZWF0ZW47Ci0JCX0KLQotCQlpZiAodW5saWtlbHkob3JpZ19vZmZzZXQpKSB7Ci0JCQkvKiBHZXR0aW5nIGRhdGEgd2l0aCBhIG5vbi16ZXJvIG9mZnNldCB3aGVuIGEgbWVzc2FnZSBpcwotCQkJICogaW4gcHJvZ3Jlc3MgaXMgbm90IGV4cGVjdGVkLiBJZiBpdCBkb2VzIGhhcHBlbiwgd2UKLQkJCSAqIG5lZWQgdG8gY2xvbmUgYW5kIHB1bGwgc2luY2Ugd2UgY2FuJ3QgZGVhbCB3aXRoCi0JCQkgKiBvZmZzZXRzIGluIHRoZSBza2JzIGZvciBhIG1lc3NhZ2UgZXhwZWN0IGluIHRoZSBoZWFkLgotCQkJICovCi0JCQlvcmlnX3NrYiA9IHNrYl9jbG9uZShvcmlnX3NrYiwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoIW9yaWdfc2tiKSB7Ci0JCQkJS0NNX1NUQVRTX0lOQ1IocHNvY2stPnN0YXRzLnJ4X21lbV9mYWlsKTsKLQkJCQlkZXNjLT5lcnJvciA9IC1FTk9NRU07Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoIXBza2JfcHVsbChvcmlnX3NrYiwgb3JpZ19vZmZzZXQpKSB7Ci0JCQkJS0NNX1NUQVRTX0lOQ1IocHNvY2stPnN0YXRzLnJ4X21lbV9mYWlsKTsKLQkJCQlrZnJlZV9za2Iob3JpZ19za2IpOwotCQkJCWRlc2MtPmVycm9yID0gLUVOT01FTTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWNsb25lZF9vcmlnID0gdHJ1ZTsKLQkJCW9yaWdfb2Zmc2V0ID0gMDsKLQkJfQotCi0JCWlmICghcHNvY2stPnJ4X3NrYl9uZXh0cCkgewotCQkJLyogV2UgYXJlIGdvaW5nIHRvIGFwcGVuZCB0byB0aGUgZnJhZ3NfbGlzdCBvZiBoZWFkLgotCQkJICogTmVlZCB0byB1bnNoYXJlIHRoZSBmcmFnX2xpc3QuCi0JCQkgKi8KLQkJCWVyciA9IHNrYl91bmNsb25lKGhlYWQsIEdGUF9BVE9NSUMpOwotCQkJaWYgKGVycikgewotCQkJCUtDTV9TVEFUU19JTkNSKHBzb2NrLT5zdGF0cy5yeF9tZW1fZmFpbCk7Ci0JCQkJZGVzYy0+ZXJyb3IgPSBlcnI7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCWlmICh1bmxpa2VseShza2Jfc2hpbmZvKGhlYWQpLT5mcmFnX2xpc3QpKSB7Ci0JCQkJLyogV2UgY2FuJ3QgYXBwZW5kIHRvIGFuIHNrX2J1ZmYgdGhhdCBhbHJlYWR5Ci0JCQkJICogaGFzIGEgZnJhZ19saXN0LiBXZSBjcmVhdGUgYSBuZXcgaGVhZCwgcG9pbnQKLQkJCQkgKiB0aGUgZnJhZ19saXN0IG9mIHRoYXQgdG8gdGhlIG9sZCBoZWFkLCBhbmQKLQkJCQkgKiB0aGVuIGFyZSBhYmxlIHRvIHVzZSB0aGUgb2xkIGhlYWQtPm5leHQgZm9yCi0JCQkJICogYXBwZW5kaW5nIHRvIHRoZSBtZXNzYWdlLgotCQkJCSAqLwotCQkJCWlmIChXQVJOX09OKGhlYWQtPm5leHQpKSB7Ci0JCQkJCWRlc2MtPmVycm9yID0gLUVJTlZBTDsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCi0JCQkJc2tiID0gYWxsb2Nfc2tiKDAsIEdGUF9BVE9NSUMpOwotCQkJCWlmICghc2tiKSB7Ci0JCQkJCUtDTV9TVEFUU19JTkNSKHBzb2NrLT5zdGF0cy5yeF9tZW1fZmFpbCk7Ci0JCQkJCWRlc2MtPmVycm9yID0gLUVOT01FTTsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCXNrYi0+bGVuID0gaGVhZC0+bGVuOwotCQkJCXNrYi0+ZGF0YV9sZW4gPSBoZWFkLT5sZW47Ci0JCQkJc2tiLT50cnVlc2l6ZSA9IGhlYWQtPnRydWVzaXplOwotCQkJCSprY21fcnhfbXNnKHNrYikgPSAqa2NtX3J4X21zZyhoZWFkKTsKLQkJCQlwc29jay0+cnhfc2tiX25leHRwID0gJmhlYWQtPm5leHQ7Ci0JCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QgPSBoZWFkOwotCQkJCXBzb2NrLT5yeF9za2JfaGVhZCA9IHNrYjsKLQkJCQloZWFkID0gc2tiOwotCQkJfSBlbHNlIHsKLQkJCQlwc29jay0+cnhfc2tiX25leHRwID0KLQkJCQkgICAgJnNrYl9zaGluZm8oaGVhZCktPmZyYWdfbGlzdDsKLQkJCX0KLQkJfQotCX0KLQotCXdoaWxlIChlYXRlbiA8IG9yaWdfbGVuKSB7Ci0JCS8qIEFsd2F5cyBjbG9uZSBzaW5jZSB3ZSB3aWxsIGNvbnN1bWUgc29tZXRoaW5nICovCi0JCXNrYiA9IHNrYl9jbG9uZShvcmlnX3NrYiwgR0ZQX0FUT01JQyk7Ci0JCWlmICghc2tiKSB7Ci0JCQlLQ01fU1RBVFNfSU5DUihwc29jay0+c3RhdHMucnhfbWVtX2ZhaWwpOwotCQkJZGVzYy0+ZXJyb3IgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQljYW5kX2xlbiA9IG9yaWdfbGVuIC0gZWF0ZW47Ci0KLQkJaGVhZCA9IHBzb2NrLT5yeF9za2JfaGVhZDsKLQkJaWYgKCFoZWFkKSB7Ci0JCQloZWFkID0gc2tiOwotCQkJcHNvY2stPnJ4X3NrYl9oZWFkID0gaGVhZDsKLQkJCS8qIFdpbGwgc2V0IHJ4X3NrYl9uZXh0cCBvbiBuZXh0IHBhY2tldCBpZiBuZWVkZWQgKi8KLQkJCXBzb2NrLT5yeF9za2JfbmV4dHAgPSBOVUxMOwotCQkJcnhtID0ga2NtX3J4X21zZyhoZWFkKTsKLQkJCW1lbXNldChyeG0sIDAsIHNpemVvZigqcnhtKSk7Ci0JCQlyeG0tPm9mZnNldCA9IG9yaWdfb2Zmc2V0ICsgZWF0ZW47Ci0JCX0gZWxzZSB7Ci0JCQkvKiBVbmNsb25lIHNpbmNlIHdlIG1heSBiZSBhcHBlbmRpbmcgdG8gYW4gc2tiIHRoYXQgd2UKLQkJCSAqIGFscmVhZHkgc2hhcmUgYSBmcmFnX2xpc3Qgd2l0aC4KLQkJCSAqLwotCQkJZXJyID0gc2tiX3VuY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKLQkJCWlmIChlcnIpIHsKLQkJCQlLQ01fU1RBVFNfSU5DUihwc29jay0+c3RhdHMucnhfbWVtX2ZhaWwpOwotCQkJCWRlc2MtPmVycm9yID0gZXJyOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlyeG0gPSBrY21fcnhfbXNnKGhlYWQpOwotCQkJKnBzb2NrLT5yeF9za2JfbmV4dHAgPSBza2I7Ci0JCQlwc29jay0+cnhfc2tiX25leHRwID0gJnNrYi0+bmV4dDsKLQkJCWhlYWQtPmRhdGFfbGVuICs9IHNrYi0+bGVuOwotCQkJaGVhZC0+bGVuICs9IHNrYi0+bGVuOwotCQkJaGVhZC0+dHJ1ZXNpemUgKz0gc2tiLT50cnVlc2l6ZTsKLQkJfQotCi0JCWlmICghcnhtLT5mdWxsX2xlbikgewotCQkJc3NpemVfdCBsZW47Ci0KLQkJCWxlbiA9IEtDTV9SVU5fRklMVEVSKHBzb2NrLT5icGZfcHJvZywgaGVhZCk7Ci0KLQkJCWlmICghbGVuKSB7Ci0JCQkJLyogTmVlZCBtb3JlIGhlYWRlciB0byBkZXRlcm1pbmUgbGVuZ3RoICovCi0JCQkJaWYgKCFyeG0tPmFjY3VtX2xlbikgewotCQkJCQkvKiBTdGFydCBSWCB0aW1lciBmb3IgbmV3IG1lc3NhZ2UgKi8KLQkJCQkJa2NtX3N0YXJ0X3J4X3RpbWVyKHBzb2NrKTsKLQkJCQl9Ci0JCQkJcnhtLT5hY2N1bV9sZW4gKz0gY2FuZF9sZW47Ci0JCQkJZWF0ZW4gKz0gY2FuZF9sZW47Ci0JCQkJS0NNX1NUQVRTX0lOQ1IocHNvY2stPnN0YXRzLnJ4X25lZWRfbW9yZV9oZHIpOwotCQkJCVdBUk5fT04oZWF0ZW4gIT0gb3JpZ19sZW4pOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChsZW4gPiBwc29jay0+c2stPnNrX3JjdmJ1ZikgewotCQkJCS8qIE1lc3NhZ2UgbGVuZ3RoIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkICovCi0JCQkJS0NNX1NUQVRTX0lOQ1IocHNvY2stPnN0YXRzLnJ4X21zZ190b29fYmlnKTsKLQkJCQlkZXNjLT5lcnJvciA9IC1FTVNHU0laRTsKLQkJCQlwc29jay0+cnhfc2tiX2hlYWQgPSBOVUxMOwotCQkJCWtjbV9hYm9ydF9yeF9wc29jayhwc29jaywgRU1TR1NJWkUsIGhlYWQpOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChsZW4gPD0gKHNzaXplX3QpaGVhZC0+bGVuIC0KLQkJCQkJICBza2ItPmxlbiAtIHJ4bS0+b2Zmc2V0KSB7Ci0JCQkJLyogTGVuZ3RoIG11c3QgYmUgaW50byBuZXcgc2tiIChhbmQgYWxzbwotCQkJCSAqIGdyZWF0ZXIgdGhhbiB6ZXJvKQotCQkJCSAqLwotCQkJCUtDTV9TVEFUU19JTkNSKHBzb2NrLT5zdGF0cy5yeF9iYWRfaGRyX2xlbik7Ci0JCQkJZGVzYy0+ZXJyb3IgPSAtRVBST1RPOwotCQkJCXBzb2NrLT5yeF9za2JfaGVhZCA9IE5VTEw7Ci0JCQkJa2NtX2Fib3J0X3J4X3Bzb2NrKHBzb2NrLCBFUFJPVE8sIGhlYWQpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlyeG0tPmZ1bGxfbGVuID0gbGVuOwotCQl9Ci0KLQkJZXh0cmEgPSAoc3NpemVfdCkocnhtLT5hY2N1bV9sZW4gKyBjYW5kX2xlbikgLSByeG0tPmZ1bGxfbGVuOwotCi0JCWlmIChleHRyYSA8IDApIHsKLQkJCS8qIE1lc3NhZ2Ugbm90IGNvbXBsZXRlIHlldC4gKi8KLQkJCWlmIChyeG0tPmZ1bGxfbGVuIC0gcnhtLT5hY2N1bV9sZW4gPgotCQkJICAgIHRjcF9pbnEocHNvY2stPnNrKSkgewotCQkJCS8qIERvbid0IGhhdmUgdGhlIHdob2xlIG1lc3NhZ2VzIGluIHRoZSBzb2NrZXQKLQkJCQkgKiBidWZmZXIuIFNldCBwc29jay0+cnhfbmVlZF9ieXRlcyB0byB3YWl0IGZvcgotCQkJCSAqIHRoZSByZXN0IG9mIHRoZSBtZXNzYWdlLiBBbHNvLCBzZXQgImVhcmx5Ci0JCQkJICogZWF0ZW4iIHNpbmNlIHdlJ3ZlIGFscmVhZHkgYnVmZmVyZWQgdGhlIHNrYgotCQkJCSAqIGJ1dCBkb24ndCBjb25zdW1lIHlldCBwZXIgdGNwX3JlYWRfc29jay4KLQkJCQkgKi8KLQotCQkJCWlmICghcnhtLT5hY2N1bV9sZW4pIHsKLQkJCQkJLyogU3RhcnQgUlggdGltZXIgZm9yIG5ldyBtZXNzYWdlICovCi0JCQkJCWtjbV9zdGFydF9yeF90aW1lcihwc29jayk7Ci0JCQkJfQotCi0JCQkJcHNvY2stPnJ4X25lZWRfYnl0ZXMgPSByeG0tPmZ1bGxfbGVuIC0KLQkJCQkJCSAgICAgICByeG0tPmFjY3VtX2xlbjsKLQkJCQlyeG0tPmFjY3VtX2xlbiArPSBjYW5kX2xlbjsKLQkJCQlyeG0tPmVhcmx5X2VhdGVuID0gY2FuZF9sZW47Ci0JCQkJS0NNX1NUQVRTX0FERChwc29jay0+c3RhdHMucnhfYnl0ZXMsIGNhbmRfbGVuKTsKLQkJCQlkZXNjLT5jb3VudCA9IDA7IC8qIFN0b3AgcmVhZGluZyBzb2NrZXQgKi8KLQkJCQlicmVhazsKLQkJCX0KLQkJCXJ4bS0+YWNjdW1fbGVuICs9IGNhbmRfbGVuOwotCQkJZWF0ZW4gKz0gY2FuZF9sZW47Ci0JCQlXQVJOX09OKGVhdGVuICE9IG9yaWdfbGVuKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogUG9zaXRpdmUgZXh0cmEgaW5kaWNhdGVzIG9yZSBieXRlcyB0aGFuIG5lZWRlZCBmb3IgdGhlCi0JCSAqIG1lc3NhZ2UKLQkJICovCi0KLQkJV0FSTl9PTihleHRyYSA+IGNhbmRfbGVuKTsKLQotCQllYXRlbiArPSAoY2FuZF9sZW4gLSBleHRyYSk7Ci0KLQkJLyogSHVycmF5LCB3ZSBoYXZlIGEgbmV3IG1lc3NhZ2UhICovCi0JCWRlbF90aW1lcigmcHNvY2stPnJ4X21zZ190aW1lcik7Ci0JCXBzb2NrLT5yeF9za2JfaGVhZCA9IE5VTEw7Ci0JCUtDTV9TVEFUU19JTkNSKHBzb2NrLT5zdGF0cy5yeF9tc2dzKTsKLQotdHJ5X3F1ZXVlOgotCQlrY20gPSByZXNlcnZlX3J4X2tjbShwc29jaywgaGVhZCk7Ci0JCWlmICgha2NtKSB7Ci0JCQkvKiBVbmFibGUgdG8gcmVzZXJ2ZSBhIEtDTSwgbWVzc2FnZSBpcyBoZWxkIGluIHBzb2NrLiAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoa2NtX3F1ZXVlX3Jjdl9za2IoJmtjbS0+c2ssIGhlYWQpKSB7Ci0JCQkvKiBTaG91bGQgbWVhbiBzb2NrZXQgYnVmZmVyIGZ1bGwgKi8KLQkJCXVucmVzZXJ2ZV9yeF9rY20ocHNvY2ssIGZhbHNlKTsKLQkJCWdvdG8gdHJ5X3F1ZXVlOwotCQl9Ci0JfQotCi0JaWYgKGNsb25lZF9vcmlnKQotCQlrZnJlZV9za2Iob3JpZ19za2IpOwotCi0JS0NNX1NUQVRTX0FERChwc29jay0+c3RhdHMucnhfYnl0ZXMsIGVhdGVuKTsKLQotCXJldHVybiBlYXRlbjsKLX0KLQotLyogQ2FsbGVkIHdpdGggbG9jayBoZWxkIG9uIGxvd2VyIHNvY2tldCAqLwotc3RhdGljIGludCBwc29ja190Y3BfcmVhZF9zb2NrKHN0cnVjdCBrY21fcHNvY2sgKnBzb2NrKQotewotCXJlYWRfZGVzY3JpcHRvcl90IGRlc2M7Ci0KLQlkZXNjLmFyZy5kYXRhID0gcHNvY2s7Ci0JZGVzYy5lcnJvciA9IDA7Ci0JZGVzYy5jb3VudCA9IDE7IC8qIGdpdmUgbW9yZSB0aGFuIG9uZSBza2IgcGVyIGNhbGwgKi8KLQotCS8qIHNrIHNob3VsZCBiZSBsb2NrZWQgaGVyZSwgc28gb2theSB0byBkbyB0Y3BfcmVhZF9zb2NrICovCi0JdGNwX3JlYWRfc29jayhwc29jay0+c2ssICZkZXNjLCBrY21fdGNwX3JlY3YpOwotCi0JdW5yZXNlcnZlX3J4X2tjbShwc29jaywgdHJ1ZSk7Ci0KLQlyZXR1cm4gZGVzYy5lcnJvcjsKLX0KLQogLyogTG93ZXIgc29jayBsb2NrIGhlbGQgKi8KLXN0YXRpYyB2b2lkIHBzb2NrX3RjcF9kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaykKK3N0YXRpYyB2b2lkIHBzb2NrX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCBrY21fcHNvY2sgKnBzb2NrOwogCiAJcmVhZF9sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CiAKIAlwc29jayA9IChzdHJ1Y3Qga2NtX3Bzb2NrICopc2stPnNrX3VzZXJfZGF0YTsKLQlpZiAodW5saWtlbHkoIXBzb2NrIHx8IHBzb2NrLT5yeF9zdG9wcGVkKSkKLQkJZ290byBvdXQ7CisJaWYgKGxpa2VseShwc29jaykpCisJCXN0cnBfZGF0YV9yZWFkeSgmcHNvY2stPnN0cnApOwogCi0JaWYgKHBzb2NrLT5yZWFkeV9yeF9tc2cpCi0JCWdvdG8gb3V0OwotCi0JaWYgKHBzb2NrLT5yeF9uZWVkX2J5dGVzKSB7Ci0JCWlmICh0Y3BfaW5xKHNrKSA+PSBwc29jay0+cnhfbmVlZF9ieXRlcykKLQkJCXBzb2NrLT5yeF9uZWVkX2J5dGVzID0gMDsKLQkJZWxzZQotCQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKHBzb2NrX3RjcF9yZWFkX3NvY2socHNvY2spID09IC1FTk9NRU0pCi0JCXF1ZXVlX2RlbGF5ZWRfd29yayhrY21fd3EsICZwc29jay0+cnhfZGVsYXllZF93b3JrLCAwKTsKLQotb3V0OgogCXJlYWRfdW5sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIGRvX3Bzb2NrX3J4X3dvcmsoc3RydWN0IGtjbV9wc29jayAqcHNvY2spCisvKiBDYWxsZWQgd2l0aCBsb3dlciBzb2NrIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGtjbV9yY3Zfc3RycGFyc2VyKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmVhZF9kZXNjcmlwdG9yX3QgcmRfZGVzYzsKLQlzdHJ1Y3Qgc29jayAqY3NrID0gcHNvY2stPnNrOworCXN0cnVjdCBrY21fcHNvY2sgKnBzb2NrID0gY29udGFpbmVyX29mKHN0cnAsIHN0cnVjdCBrY21fcHNvY2ssIHN0cnApOworCXN0cnVjdCBrY21fc29jayAqa2NtOwogCi0JLyogV2UgbmVlZCB0aGUgcmVhZCBsb2NrIHRvIHN5bmNocm9uaXplIHdpdGggcHNvY2tfdGNwX2RhdGFfcmVhZHkuIFdlCi0JICogbmVlZCB0aGUgc29ja2V0IGxvY2sgZm9yIGNhbGxpbmcgdGNwX3JlYWRfc29jay4KLQkgKi8KLQlsb2NrX3NvY2soY3NrKTsKLQlyZWFkX2xvY2tfYmgoJmNzay0+c2tfY2FsbGJhY2tfbG9jayk7Cit0cnlfcXVldWU6CisJa2NtID0gcmVzZXJ2ZV9yeF9rY20ocHNvY2ssIHNrYik7CisJaWYgKCFrY20pIHsKKwkJIC8qIFVuYWJsZSB0byByZXNlcnZlIGEgS0NNLCBtZXNzYWdlIGlzIGhlbGQgaW4gcHNvY2sgYW5kIHN0cnAKKwkJICAqIGlzIHBhdXNlZC4KKwkJICAqLworCQlyZXR1cm47CisJfQogCi0JaWYgKHVubGlrZWx5KGNzay0+c2tfdXNlcl9kYXRhICE9IHBzb2NrKSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAodW5saWtlbHkocHNvY2stPnJ4X3N0b3BwZWQpKQotCQlnb3RvIG91dDsKLQotCWlmIChwc29jay0+cmVhZHlfcnhfbXNnKQotCQlnb3RvIG91dDsKLQotCXJkX2Rlc2MuYXJnLmRhdGEgPSBwc29jazsKLQotCWlmIChwc29ja190Y3BfcmVhZF9zb2NrKHBzb2NrKSA9PSAtRU5PTUVNKQotCQlxdWV1ZV9kZWxheWVkX3dvcmsoa2NtX3dxLCAmcHNvY2stPnJ4X2RlbGF5ZWRfd29yaywgMCk7Ci0KLW91dDoKLQlyZWFkX3VubG9ja19iaCgmY3NrLT5za19jYWxsYmFja19sb2NrKTsKLQlyZWxlYXNlX3NvY2soY3NrKTsKKwlpZiAoa2NtX3F1ZXVlX3Jjdl9za2IoJmtjbS0+c2ssIHNrYikpIHsKKwkJLyogU2hvdWxkIG1lYW4gc29ja2V0IGJ1ZmZlciBmdWxsICovCisJCXVucmVzZXJ2ZV9yeF9rY20ocHNvY2ssIGZhbHNlKTsKKwkJZ290byB0cnlfcXVldWU7CisJfQogfQogCi1zdGF0aWMgdm9pZCBwc29ja19yeF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqdykKK3N0YXRpYyBpbnQga2NtX3BhcnNlX2Z1bmNfc3RycGFyc2VyKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JZG9fcHNvY2tfcnhfd29yayhjb250YWluZXJfb2Yodywgc3RydWN0IGtjbV9wc29jaywgcnhfd29yaykpOworCXN0cnVjdCBrY21fcHNvY2sgKnBzb2NrID0gY29udGFpbmVyX29mKHN0cnAsIHN0cnVjdCBrY21fcHNvY2ssIHN0cnApOworCXN0cnVjdCBicGZfcHJvZyAqcHJvZyA9IHBzb2NrLT5icGZfcHJvZzsKKworCXJldHVybiAoKnByb2ctPmJwZl9mdW5jKShza2IsIHByb2ctPmluc25zaSk7CiB9CiAKLXN0YXRpYyB2b2lkIHBzb2NrX3J4X2RlbGF5ZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpCitzdGF0aWMgaW50IGtjbV9yZWFkX3NvY2tfZG9uZShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwLCBpbnQgZXJyKQogewotCWRvX3Bzb2NrX3J4X3dvcmsoY29udGFpbmVyX29mKHcsIHN0cnVjdCBrY21fcHNvY2ssCi0JCQkJICAgICAgcnhfZGVsYXllZF93b3JrLndvcmspKTsKKwlzdHJ1Y3Qga2NtX3Bzb2NrICpwc29jayA9IGNvbnRhaW5lcl9vZihzdHJwLCBzdHJ1Y3Qga2NtX3Bzb2NrLCBzdHJwKTsKKworCXVucmVzZXJ2ZV9yeF9rY20ocHNvY2ssIHRydWUpOworCisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgcHNvY2tfdGNwX3N0YXRlX2NoYW5nZShzdHJ1Y3Qgc29jayAqc2spCitzdGF0aWMgdm9pZCBwc29ja19zdGF0ZV9jaGFuZ2Uoc3RydWN0IHNvY2sgKnNrKQogewogCS8qIFRDUCBvbmx5IGRvZXMgYSBQT0xMSU4gZm9yIGEgaGFsZiBjbG9zZS4gRG8gYSBQT0xMSFVQIGhlcmUKIAkgKiBzaW5jZSBhcHBsaWNhdGlvbiB3aWxsIG5vcm1hbGx5IG5vdCBwb2xsIHdpdGggUE9MTElOCkBAIC03MDIsNyArNDAyLDcgQEAKIAlyZXBvcnRfY3NrX2Vycm9yKHNrLCBFUElQRSk7CiB9CiAKLXN0YXRpYyB2b2lkIHBzb2NrX3RjcF93cml0ZV9zcGFjZShzdHJ1Y3Qgc29jayAqc2spCitzdGF0aWMgdm9pZCBwc29ja193cml0ZV9zcGFjZShzdHJ1Y3Qgc29jayAqc2spCiB7CiAJc3RydWN0IGtjbV9wc29jayAqcHNvY2s7CiAJc3RydWN0IGtjbV9tdXggKm11eDsKQEAgLTcxMywxNCArNDEzLDEzIEBACiAJcHNvY2sgPSAoc3RydWN0IGtjbV9wc29jayAqKXNrLT5za191c2VyX2RhdGE7CiAJaWYgKHVubGlrZWx5KCFwc29jaykpCiAJCWdvdG8gb3V0OwotCiAJbXV4ID0gcHNvY2stPm11eDsKIAogCXNwaW5fbG9ja19iaCgmbXV4LT5sb2NrKTsKIAogCS8qIENoZWNrIGlmIHRoZSBzb2NrZXQgaXMgcmVzZXJ2ZWQgc28gc29tZW9uZSBpcyB3YWl0aW5nIGZvciBzZW5kaW5nLiAqLwogCWtjbSA9IHBzb2NrLT50eF9rY207Ci0JaWYgKGtjbSkKKwlpZiAoa2NtICYmICF1bmxpa2VseShrY20tPnR4X3N0b3BwZWQpKQogCQlxdWV1ZV93b3JrKGtjbV93cSwgJmtjbS0+dHhfd29yayk7CiAKIAlzcGluX3VubG9ja19iaCgmbXV4LT5sb2NrKTsKQEAgLTE0MTEsNyArMTExMCw3IEBACiAJc3RydWN0IGtjbV9zb2NrICprY20gPSBrY21fc2soc2spOwogCWludCBlcnIgPSAwOwogCWxvbmcgdGltZW87Ci0Jc3RydWN0IGtjbV9yeF9tc2cgKnJ4bTsKKwlzdHJ1Y3Qgc3RycF9yeF9tc2cgKnJ4bTsKIAlpbnQgY29waWVkID0gMDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCkBAIC0xNDI1LDcgKzExMjQsNyBAQAogCiAJLyogT2theSwgaGF2ZSBhIG1lc3NhZ2Ugb24gdGhlIHJlY2VpdmUgcXVldWUgKi8KIAotCXJ4bSA9IGtjbV9yeF9tc2coc2tiKTsKKwlyeG0gPSBzdHJwX3J4X21zZyhza2IpOwogCiAJaWYgKGxlbiA+IHJ4bS0+ZnVsbF9sZW4pCiAJCWxlbiA9IHJ4bS0+ZnVsbF9sZW47CkBAIC0xNDgxLDcgKzExODAsNyBAQAogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBrY21fc29jayAqa2NtID0ga2NtX3NrKHNrKTsKIAlsb25nIHRpbWVvOwotCXN0cnVjdCBrY21fcnhfbXNnICpyeG07CisJc3RydWN0IHN0cnBfcnhfbXNnICpyeG07CiAJaW50IGVyciA9IDA7CiAJc3NpemVfdCBjb3BpZWQ7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTE0OTgsNyArMTE5Nyw3IEBACiAKIAkvKiBPa2F5LCBoYXZlIGEgbWVzc2FnZSBvbiB0aGUgcmVjZWl2ZSBxdWV1ZSAqLwogCi0JcnhtID0ga2NtX3J4X21zZyhza2IpOworCXJ4bSA9IHN0cnBfcnhfbXNnKHNrYik7CiAKIAlpZiAobGVuID4gcnhtLT5mdWxsX2xlbikKIAkJbGVuID0gcnhtLT5mdWxsX2xlbjsKQEAgLTE2NzQsMTUgKzEzNzMsNiBAQAogCXNwaW5fdW5sb2NrX2JoKCZtdXgtPnJ4X2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBrY21fcnhfbXNnX3RpbWVvdXQodW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGtjbV9wc29jayAqcHNvY2sgPSAoc3RydWN0IGtjbV9wc29jayAqKWFyZzsKLQotCS8qIE1lc3NhZ2UgYXNzZW1ibHkgdGltZWQgb3V0ICovCi0JS0NNX1NUQVRTX0lOQ1IocHNvY2stPnN0YXRzLnJ4X21zZ190aW1lb3V0cyk7Ci0Ja2NtX2Fib3J0X3J4X3Bzb2NrKHBzb2NrLCBFVElNRURPVVQsIE5VTEwpOwotfQotCiBzdGF0aWMgaW50IGtjbV9hdHRhY2goc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqY3NvY2ssCiAJCSAgICAgIHN0cnVjdCBicGZfcHJvZyAqcHJvZykKIHsKQEAgLTE2OTIsMTkgKzEzODIsMTMgQEAKIAlzdHJ1Y3Qga2NtX3Bzb2NrICpwc29jayA9IE5VTEwsICp0cHNvY2s7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKIAlpbnQgaW5kZXggPSAwOwotCi0JaWYgKGNzb2NrLT5vcHMtPmZhbWlseSAhPSBQRl9JTkVUICYmCi0JICAgIGNzb2NrLT5vcHMtPmZhbWlseSAhPSBQRl9JTkVUNikKLQkJcmV0dXJuIC1FSU5WQUw7CisJc3RydWN0IHN0cnBfY2FsbGJhY2tzIGNiOworCWludCBlcnI7CiAKIAljc2sgPSBjc29jay0+c2s7CiAJaWYgKCFjc2spCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogT25seSBzdXBwb3J0IFRDUCBmb3Igbm93ICovCi0JaWYgKGNzay0+c2tfcHJvdG9jb2wgIT0gSVBQUk9UT19UQ1ApCi0JCXJldHVybiAtRUlOVkFMOwotCiAJcHNvY2sgPSBrbWVtX2NhY2hlX3phbGxvYyhrY21fcHNvY2twLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBzb2NrKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE3MTMsMTEgKzEzOTcsMTYgQEAKIAlwc29jay0+c2sgPSBjc2s7CiAJcHNvY2stPmJwZl9wcm9nID0gcHJvZzsKIAotCXNldHVwX3RpbWVyKCZwc29jay0+cnhfbXNnX3RpbWVyLCBrY21fcnhfbXNnX3RpbWVvdXQsCi0JCSAgICAodW5zaWduZWQgbG9uZylwc29jayk7CisJY2IucmN2X21zZyA9IGtjbV9yY3Zfc3RycGFyc2VyOworCWNiLmFib3J0X3BhcnNlciA9IE5VTEw7CisJY2IucGFyc2VfbXNnID0ga2NtX3BhcnNlX2Z1bmNfc3RycGFyc2VyOworCWNiLnJlYWRfc29ja19kb25lID0ga2NtX3JlYWRfc29ja19kb25lOwogCi0JSU5JVF9XT1JLKCZwc29jay0+cnhfd29yaywgcHNvY2tfcnhfd29yayk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnBzb2NrLT5yeF9kZWxheWVkX3dvcmssIHBzb2NrX3J4X2RlbGF5ZWRfd29yayk7CisJZXJyID0gc3RycF9pbml0KCZwc29jay0+c3RycCwgY3NrLCAmY2IpOworCWlmIChlcnIpIHsKKwkJa21lbV9jYWNoZV9mcmVlKGtjbV9wc29ja3AsIHBzb2NrKTsKKwkJcmV0dXJuIGVycjsKKwl9CiAKIAlzb2NrX2hvbGQoY3NrKTsKIApAQCAtMTcyNiw5ICsxNDE1LDkgQEAKIAlwc29jay0+c2F2ZV93cml0ZV9zcGFjZSA9IGNzay0+c2tfd3JpdGVfc3BhY2U7CiAJcHNvY2stPnNhdmVfc3RhdGVfY2hhbmdlID0gY3NrLT5za19zdGF0ZV9jaGFuZ2U7CiAJY3NrLT5za191c2VyX2RhdGEgPSBwc29jazsKLQljc2stPnNrX2RhdGFfcmVhZHkgPSBwc29ja190Y3BfZGF0YV9yZWFkeTsKLQljc2stPnNrX3dyaXRlX3NwYWNlID0gcHNvY2tfdGNwX3dyaXRlX3NwYWNlOwotCWNzay0+c2tfc3RhdGVfY2hhbmdlID0gcHNvY2tfdGNwX3N0YXRlX2NoYW5nZTsKKwljc2stPnNrX2RhdGFfcmVhZHkgPSBwc29ja19kYXRhX3JlYWR5OworCWNzay0+c2tfd3JpdGVfc3BhY2UgPSBwc29ja193cml0ZV9zcGFjZTsKKwljc2stPnNrX3N0YXRlX2NoYW5nZSA9IHBzb2NrX3N0YXRlX2NoYW5nZTsKIAl3cml0ZV91bmxvY2tfYmgoJmNzay0+c2tfY2FsbGJhY2tfbG9jayk7CiAKIAkvKiBGaW5pc2hlZCBpbml0aWFsaXphdGlvbiwgbm93IGFkZCB0aGUgcHNvY2sgdG8gdGhlIE1VWC4gKi8KQEAgLTE3NTAsNyArMTQzOSw3IEBACiAJc3Bpbl91bmxvY2tfYmgoJm11eC0+bG9jayk7CiAKIAkvKiBTY2hlZHVsZSBSWCB3b3JrIGluIGNhc2UgdGhlcmUgYXJlIGFscmVhZHkgYnl0ZXMgcXVldWVkICovCi0JcXVldWVfd29yayhrY21fd3EsICZwc29jay0+cnhfd29yayk7CisJc3RycF9jaGVja19yY3YoJnBzb2NrLT5zdHJwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTc5MCw2ICsxNDc5LDggQEAKIAlzdHJ1Y3Qgc29jayAqY3NrID0gcHNvY2stPnNrOwogCXN0cnVjdCBrY21fbXV4ICptdXggPSBwc29jay0+bXV4OwogCisJbG9ja19zb2NrKGNzayk7CisKIAkvKiBTdG9wIGdldHRpbmcgY2FsbGJhY2tzIGZyb20gVENQIHNvY2tldC4gQWZ0ZXIgdGhpcyB0aGVyZSBzaG91bGQKIAkgKiBiZSBubyB3YXkgdG8gcmVzZXJ2ZSBhIGtjbSBmb3IgdGhpcyBwc29jay4KIAkgKi8KQEAgLTE3OTgsNyArMTQ4OSw3IEBACiAJY3NrLT5za19kYXRhX3JlYWR5ID0gcHNvY2stPnNhdmVfZGF0YV9yZWFkeTsKIAljc2stPnNrX3dyaXRlX3NwYWNlID0gcHNvY2stPnNhdmVfd3JpdGVfc3BhY2U7CiAJY3NrLT5za19zdGF0ZV9jaGFuZ2UgPSBwc29jay0+c2F2ZV9zdGF0ZV9jaGFuZ2U7Ci0JcHNvY2stPnJ4X3N0b3BwZWQgPSAxOworCXN0cnBfc3RvcCgmcHNvY2stPnN0cnApOwogCiAJaWYgKFdBUk5fT04ocHNvY2stPnJ4X2tjbSkpIHsKIAkJd3JpdGVfdW5sb2NrX2JoKCZjc2stPnNrX2NhbGxiYWNrX2xvY2spOwpAQCAtMTgyMSwxOCArMTUxMiwxNyBAQAogCiAJd3JpdGVfdW5sb2NrX2JoKCZjc2stPnNrX2NhbGxiYWNrX2xvY2spOwogCi0JZGVsX3RpbWVyX3N5bmMoJnBzb2NrLT5yeF9tc2dfdGltZXIpOwotCWNhbmNlbF93b3JrX3N5bmMoJnBzb2NrLT5yeF93b3JrKTsKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnBzb2NrLT5yeF9kZWxheWVkX3dvcmspOworCS8qIENhbGwgc3RycF9kb25lIHdpdGhvdXQgc29jayBsb2NrICovCisJcmVsZWFzZV9zb2NrKGNzayk7CisJc3RycF9kb25lKCZwc29jay0+c3RycCk7CisJbG9ja19zb2NrKGNzayk7CiAKIAlicGZfcHJvZ19wdXQocHNvY2stPmJwZl9wcm9nKTsKIAotCWtmcmVlX3NrYihwc29jay0+cnhfc2tiX2hlYWQpOwotCXBzb2NrLT5yeF9za2JfaGVhZCA9IE5VTEw7Ci0KIAlzcGluX2xvY2tfYmgoJm11eC0+bG9jayk7CiAKIAlhZ2dyZWdhdGVfcHNvY2tfc3RhdHMoJnBzb2NrLT5zdGF0cywgJm11eC0+YWdncmVnYXRlX3Bzb2NrX3N0YXRzKTsKKwlzYXZlX3N0cnBfc3RhdHMoJnBzb2NrLT5zdHJwLCAmbXV4LT5hZ2dyZWdhdGVfc3RycF9zdGF0cyk7CiAKIAlLQ01fU1RBVFNfSU5DUihtdXgtPnN0YXRzLnBzb2NrX3VuYXR0YWNoKTsKIApAQCAtMTg3NSw2ICsxNTY1LDggQEAKIAkJZnB1dChjc2stPnNrX3NvY2tldC0+ZmlsZSk7CiAJCWttZW1fY2FjaGVfZnJlZShrY21fcHNvY2twLCBwc29jayk7CiAJfQorCisJcmVsZWFzZV9zb2NrKGNzayk7CiB9CiAKIHN0YXRpYyBpbnQga2NtX3VuYXR0YWNoX2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBrY21fdW5hdHRhY2ggKmluZm8pCkBAIC0xOTE1LDYgKzE2MDcsNyBAQAogCiAJCXNwaW5fdW5sb2NrX2JoKCZtdXgtPmxvY2spOwogCisJCS8qIExvd2VyIHNvY2tldCBsb2NrIHNob3VsZCBhbHJlYWR5IGJlIGhlbGQgKi8KIAkJa2NtX3VuYXR0YWNoKHBzb2NrKTsKIAogCQllcnIgPSAwOwpAQCAtMjAyOSw3ICsxNzIyLDcgQEAKIAkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5mbywKIAkJCQkJIHNpemVvZihpbmZvKSkpIHsKIAkJCQllcnIgPSAtRUZBVUxUOwotCQkJCXNvY2tfcmVsZWFzZShuZXdzb2NrKTsKKwkJCQlzeXNfY2xvc2UoaW5mby5mZCk7CiAJCQl9CiAJCX0KIApAQCAtMjA3Miw2ICsxNzY1LDggQEAKIAlhZ2dyZWdhdGVfbXV4X3N0YXRzKCZtdXgtPnN0YXRzLCAma25ldC0+YWdncmVnYXRlX211eF9zdGF0cyk7CiAJYWdncmVnYXRlX3Bzb2NrX3N0YXRzKCZtdXgtPmFnZ3JlZ2F0ZV9wc29ja19zdGF0cywKIAkJCSAgICAgICZrbmV0LT5hZ2dyZWdhdGVfcHNvY2tfc3RhdHMpOworCWFnZ3JlZ2F0ZV9zdHJwX3N0YXRzKCZtdXgtPmFnZ3JlZ2F0ZV9zdHJwX3N0YXRzLAorCQkJICAgICAma25ldC0+YWdncmVnYXRlX3N0cnBfc3RhdHMpOwogCWxpc3RfZGVsX3JjdSgmbXV4LT5rY21fbXV4X2xpc3QpOwogCWtuZXQtPmNvdW50LS07CiAJbXV0ZXhfdW5sb2NrKCZrbmV0LT5tdXRleCk7CkBAIC0yMTUxLDYgKzE4NDYsMTMgQEAKIAkgKiBpdCB3aWxsIGp1c3QgcmV0dXJuLgogCSAqLwogCV9fc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfd3JpdGVfcXVldWUpOworCisJLyogU2V0IHR4X3N0b3BwZWQuIFRoaXMgaXMgY2hlY2tlZCB3aGVuIHBzb2NrIGlzIGJvdW5kIHRvIGEga2NtIGFuZCB3ZQorCSAqIGdldCBhIHdyaXRlc3BhY2UgY2FsbGJhY2suIFRoaXMgcHJldmVudHMgZnVydGhlciB3b3JrIGJlaW5nIHF1ZXVlZAorCSAqIGZyb20gdGhlIGNhbGxiYWNrICh1bmJpbmRpbmcgdGhlIHBzb2NrIG9jY3VycyBhZnRlciBjYW5jZWxpbmcgd29yay4KKwkgKi8KKwlrY20tPnR4X3N0b3BwZWQgPSAxOworCiAJcmVsZWFzZV9zb2NrKHNrKTsKIAogCXNwaW5fbG9ja19iaCgmbXV4LT5sb2NrKTsKZGlmZiAtLWdpdCBhL25ldC9sMnRwL2wydHBfY29yZS5jIGIvbmV0L2wydHAvbDJ0cF9jb3JlLmMKaW5kZXggMWU0MGRhYy4uYTJlZDNiZCAxMDA2NDQKLS0tIGEvbmV0L2wydHAvbDJ0cF9jb3JlLmMKKysrIGIvbmV0L2wydHAvbDJ0cF9jb3JlLmMKQEAgLTE4NTUsNiArMTg1NSw5IEBACiAJCSh2b2lkKWwydHBfdHVubmVsX2RlbGV0ZSh0dW5uZWwpOwogCX0KIAlyY3VfcmVhZF91bmxvY2tfYmgoKTsKKworCWZsdXNoX3dvcmtxdWV1ZShsMnRwX3dxKTsKKwlyY3VfYmFycmllcigpOwogfQogCiBzdGF0aWMgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIGwydHBfbmV0X29wcyA9IHsKZGlmZiAtLWdpdCBhL25ldC9sMnRwL2wydHBfY29yZS5oIGIvbmV0L2wydHAvbDJ0cF9jb3JlLmgKaW5kZXggNTg3MTUzNy4uMjU5OWFmNiAxMDA2NDQKLS0tIGEvbmV0L2wydHAvbDJ0cF9jb3JlLmgKKysrIGIvbmV0L2wydHAvbDJ0cF9jb3JlLmgKQEAgLTEzOSw3ICsxMzksNyBAQAogCXZvaWQgKCpzZXNzaW9uX2Nsb3NlKShzdHJ1Y3QgbDJ0cF9zZXNzaW9uICpzZXNzaW9uKTsKIAl2b2lkICgqcmVmKShzdHJ1Y3QgbDJ0cF9zZXNzaW9uICpzZXNzaW9uKTsKIAl2b2lkICgqZGVyZWYpKHN0cnVjdCBsMnRwX3Nlc3Npb24gKnNlc3Npb24pOwotI2lmIGRlZmluZWQoQ09ORklHX0wyVFBfREVCVUdGUykgfHwgZGVmaW5lZChDT05GSUdfTDJUUF9ERUJVR0ZTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19MMlRQX0RFQlVHRlMpCiAJdm9pZCAoKnNob3cpKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcHJpdik7CiAjZW5kaWYKIAl1aW50OF90CQkJcHJpdlswXTsJLyogcHJpdmF0ZSBkYXRhICovCmRpZmYgLS1naXQgYS9uZXQvbDJ0cC9sMnRwX2V0aC5jIGIvbmV0L2wydHAvbDJ0cF9ldGguYwppbmRleCA1N2ZjNWE0Li45NjVmN2UzIDEwMDY0NAotLS0gYS9uZXQvbDJ0cC9sMnRwX2V0aC5jCisrKyBiL25ldC9sMnRwL2wydHBfZXRoLmMKQEAgLTEyMSw3ICsxMjEsNyBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbDJ0cF9ldGhfbmV0ZGV2X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbDJ0cF9ldGhfbmV0ZGV2X29wcyA9IHsKIAkubmRvX2luaXQJCT0gbDJ0cF9ldGhfZGV2X2luaXQsCiAJLm5kb191bmluaXQJCT0gbDJ0cF9ldGhfZGV2X3VuaW5pdCwKIAkubmRvX3N0YXJ0X3htaXQJCT0gbDJ0cF9ldGhfZGV2X3htaXQsCkBAIC0xOTUsNyArMTk1LDcgQEAKIAl9CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19MMlRQX0RFQlVHRlMpIHx8IGRlZmluZWQoQ09ORklHX0wyVFBfREVCVUdGU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTDJUUF9ERUJVR0ZTKQogc3RhdGljIHZvaWQgbDJ0cF9ldGhfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgbDJ0cF9zZXNzaW9uICpzZXNzaW9uID0gYXJnOwpAQCAtMjY4LDcgKzI2OCw3IEBACiAJcHJpdi0+dHVubmVsX3NvY2sgPSB0dW5uZWwtPnNvY2s7CiAJc2Vzc2lvbi0+cmVjdl9za2IgPSBsMnRwX2V0aF9kZXZfcmVjdjsKIAlzZXNzaW9uLT5zZXNzaW9uX2Nsb3NlID0gbDJ0cF9ldGhfZGVsZXRlOwotI2lmIGRlZmluZWQoQ09ORklHX0wyVFBfREVCVUdGUykgfHwgZGVmaW5lZChDT05GSUdfTDJUUF9ERUJVR0ZTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19MMlRQX0RFQlVHRlMpCiAJc2Vzc2lvbi0+c2hvdyA9IGwydHBfZXRoX3Nob3c7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbmV0L2wydHAvbDJ0cF9uZXRsaW5rLmMgYi9uZXQvbDJ0cC9sMnRwX25ldGxpbmsuYwppbmRleCAxZDAyZThkLi5iZjMxMTc3IDEwMDY0NAotLS0gYS9uZXQvbDJ0cC9sMnRwX25ldGxpbmsuYworKysgYi9uZXQvbDJ0cC9sMnRwX25ldGxpbmsuYwpAQCAtODY3LDcgKzg2Nyw3IEBACiAJcmV0dXJuIHNrYi0+bGVuOwogfQogCi1zdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgbDJ0cF9ubF9wb2xpY3lbTDJUUF9BVFRSX01BWCArIDFdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IGwydHBfbmxfcG9saWN5W0wyVFBfQVRUUl9NQVggKyAxXSA9IHsKIAlbTDJUUF9BVFRSX05PTkVdCQk9IHsgLnR5cGUgPSBOTEFfVU5TUEVDLCB9LAogCVtMMlRQX0FUVFJfUFdfVFlQRV0JCT0geyAudHlwZSA9IE5MQV9VMTYsIH0sCiAJW0wyVFBfQVRUUl9FTkNBUF9UWVBFXQkJPSB7IC50eXBlID0gTkxBX1UxNiwgfSwKZGlmZiAtLWdpdCBhL25ldC9sMnRwL2wydHBfcHBwLmMgYi9uZXQvbDJ0cC9sMnRwX3BwcC5jCmluZGV4IGQ5NTYwYWEuLjQxZDQ3YmYgMTAwNjQ0Ci0tLSBhL25ldC9sMnRwL2wydHBfcHBwLmMKKysrIGIvbmV0L2wydHAvbDJ0cF9wcHAuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgMikpCiAJCXJldHVybiAxOwogCi0JaWYgKChza2ItPmRhdGFbMF0gPT0gMHhmZikgJiYgKHNrYi0+ZGF0YVsxXSA9PSAweDAzKSkKKwlpZiAoKHNrYi0+ZGF0YVswXSA9PSBQUFBfQUxMU1RBVElPTlMpICYmIChza2ItPmRhdGFbMV0gPT0gUFBQX1VJKSkKIAkJc2tiX3B1bGwoc2tiLCAyKTsKIAogCXJldHVybiAwOwpAQCAtMjgyLDcgKzI4Miw2IEBACiBzdGF0aWMgaW50IHBwcG9sMnRwX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbSwKIAkJCSAgICBzaXplX3QgdG90YWxfbGVuKQogewotCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBwcGhbMl0gPSB7IDB4ZmYsIDB4MDMgfTsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBlcnJvcjsKQEAgLTMxMiw3ICszMTEsNyBAQAogCWVycm9yID0gLUVOT01FTTsKIAlza2IgPSBzb2NrX3dtYWxsb2Moc2ssIE5FVF9TS0JfUEFEICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKwogCQkJICAgdWhsZW4gKyBzZXNzaW9uLT5oZHJfbGVuICsKLQkJCSAgIHNpemVvZihwcHBoKSArIHRvdGFsX2xlbiwKKwkJCSAgIDIgKyB0b3RhbF9sZW4sIC8qIDIgYnl0ZXMgZm9yIFBQUF9BTExTVEFUSU9OUyAmIFBQUF9VSSAqLwogCQkJICAgMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFza2IpCiAJCWdvdG8gZXJyb3JfcHV0X3Nlc3NfdHVuOwpAQCAtMzI1LDggKzMyNCw4IEBACiAJc2tiX3Jlc2VydmUoc2tiLCB1aGxlbik7CiAKIAkvKiBBZGQgUFBQIGhlYWRlciAqLwotCXNrYi0+ZGF0YVswXSA9IHBwcGhbMF07Ci0Jc2tiLT5kYXRhWzFdID0gcHBwaFsxXTsKKwlza2ItPmRhdGFbMF0gPSBQUFBfQUxMU1RBVElPTlM7CisJc2tiLT5kYXRhWzFdID0gUFBQX1VJOwogCXNrYl9wdXQoc2tiLCAyKTsKIAogCS8qIENvcHkgdXNlciBkYXRhIGludG8gc2tiICovCkBAIC0zNjksNyArMzY4LDYgQEAKICAqLwogc3RhdGljIGludCBwcHBvbDJ0cF94bWl0KHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdGF0aWMgY29uc3QgdTggcHBwaFsyXSA9IHsgMHhmZiwgMHgwMyB9OwogCXN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKSBjaGFuLT5wcml2YXRlOwogCXN0cnVjdCBzb2NrICpza190dW47CiAJc3RydWN0IGwydHBfc2Vzc2lvbiAqc2Vzc2lvbjsKQEAgLTM5OCwxNCArMzk2LDE0IEBACiAJCSAgIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgLyogSVAgaGVhZGVyICovCiAJCSAgIHVobGVuICsJCS8qIFVEUCBoZWFkZXIgKGlmIEwyVFBfRU5DQVBUWVBFX1VEUCkgKi8KIAkJICAgc2Vzc2lvbi0+aGRyX2xlbiArCS8qIEwyVFAgaGVhZGVyICovCi0JCSAgIHNpemVvZihwcHBoKTsJLyogUFBQIGhlYWRlciAqLworCQkgICAyOwkJCS8qIDIgYnl0ZXMgZm9yIFBQUF9BTExTVEFUSU9OUyAmIFBQUF9VSSAqLwogCWlmIChza2JfY293X2hlYWQoc2tiLCBoZWFkcm9vbSkpCiAJCWdvdG8gYWJvcnRfcHV0X3Nlc3NfdHVuOwogCiAJLyogU2V0dXAgUFBQIGhlYWRlciAqLwotCV9fc2tiX3B1c2goc2tiLCBzaXplb2YocHBwaCkpOwotCXNrYi0+ZGF0YVswXSA9IHBwcGhbMF07Ci0Jc2tiLT5kYXRhWzFdID0gcHBwaFsxXTsKKwlfX3NrYl9wdXNoKHNrYiwgMik7CisJc2tiLT5kYXRhWzBdID0gUFBQX0FMTFNUQVRJT05TOworCXNrYi0+ZGF0YVsxXSA9IFBQUF9VSTsKIAogCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAlsMnRwX3htaXRfc2tiKHNlc3Npb24sIHNrYiwgc2Vzc2lvbi0+aGRyX2xlbik7CkBAIC00NDAsNyArNDM4LDcgQEAKIAlCVUdfT04oc2Vzc2lvbi0+bWFnaWMgIT0gTDJUUF9TRVNTSU9OX01BR0lDKTsKIAogCWlmIChzb2NrKSB7Ci0JCWluZXRfc2h1dGRvd24oc29jaywgMik7CisJCWluZXRfc2h1dGRvd24oc29jaywgU0VORF9TSFVURE9XTik7CiAJCS8qIERvbid0IGxldCB0aGUgc2Vzc2lvbiBnbyBhd2F5IGJlZm9yZSBvdXIgc29ja2V0IGRvZXMgKi8KIAkJbDJ0cF9zZXNzaW9uX2luY19yZWZjb3VudChzZXNzaW9uKTsKIAl9CkBAIC01NTQsNyArNTUyLDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19MMlRQX0RFQlVHRlMpIHx8IGRlZmluZWQoQ09ORklHX0wyVFBfREVCVUdGU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTDJUUF9ERUJVR0ZTKQogc3RhdGljIHZvaWQgcHBwb2wydHBfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgbDJ0cF9zZXNzaW9uICpzZXNzaW9uID0gYXJnOwpAQCAtNzI1LDcgKzcyMyw3IEBACiAKIAlzZXNzaW9uLT5yZWN2X3NrYgk9IHBwcG9sMnRwX3JlY3Y7CiAJc2Vzc2lvbi0+c2Vzc2lvbl9jbG9zZQk9IHBwcG9sMnRwX3Nlc3Npb25fY2xvc2U7Ci0jaWYgZGVmaW5lZChDT05GSUdfTDJUUF9ERUJVR0ZTKSB8fCBkZWZpbmVkKENPTkZJR19MMlRQX0RFQlVHRlNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0wyVFBfREVCVUdGUykKIAlzZXNzaW9uLT5zaG93CQk9IHBwcG9sMnRwX3Nob3c7CiAjZW5kaWYKIApAQCAtODU2LDcgKzg1NCw3IEBACiAJZXJyb3IgPSAtRU5PVENPTk47CiAJaWYgKHNrID09IE5VTEwpCiAJCWdvdG8gZW5kOwotCWlmIChzay0+c2tfc3RhdGUgIT0gUFBQT1hfQ09OTkVDVEVEKQorCWlmICghKHNrLT5za19zdGF0ZSAmIFBQUE9YX0NPTk5FQ1RFRCkpCiAJCWdvdG8gZW5kOwogCiAJZXJyb3IgPSAtRUJBREY7CmRpZmYgLS1naXQgYS9uZXQvbDNtZGV2L2wzbWRldi5jIGIvbmV0L2wzbWRldi9sM21kZXYuYwppbmRleCBjNGExYzNlLi44ZGE4NmNlIDEwMDY0NAotLS0gYS9uZXQvbDNtZGV2L2wzbWRldi5jCisrKyBiL25ldC9sM21kZXYvbDNtZGV2LmMKQEAgLTEwMCwxNSArMTAwLDE0IEBACiBFWFBPUlRfU1lNQk9MX0dQTChsM21kZXZfZmliX3RhYmxlX2J5X2luZGV4KTsKIAogLyoqCi0gKglsM21kZXZfZ2V0X3J0Nl9kc3QgLSBJUHY2IHJvdXRlIGxvb2t1cCBiYXNlZCBvbiBmbG93LiBSZXR1cm5zCi0gKgkJCSAgICAgY2FjaGVkIHJvdXRlIGZvciBMMyBtYXN0ZXIgZGV2aWNlIGlmIHJlbGV2YW50Ci0gKgkJCSAgICAgdG8gZmxvdworICoJbDNtZGV2X2xpbmtfc2NvcGVfbG9va3VwIC0gSVB2NiByb3V0ZSBsb29rdXAgYmFzZWQgb24gZmxvdyBmb3IgbGluaworICoJCQkgICAgIGxvY2FsIGFuZCBtdWx0aWNhc3QgYWRkcmVzc2VzCiAgKglAbmV0OiBuZXR3b3JrIG5hbWVzcGFjZSBmb3IgZGV2aWNlIGluZGV4IGxvb2t1cAogICoJQGZsNjogSVB2NiBmbG93IHN0cnVjdCBmb3IgbG9va3VwCiAgKi8KIAotc3RydWN0IGRzdF9lbnRyeSAqbDNtZGV2X2dldF9ydDZfZHN0KHN0cnVjdCBuZXQgKm5ldCwKLQkJCQkgICAgIHN0cnVjdCBmbG93aTYgKmZsNikKK3N0cnVjdCBkc3RfZW50cnkgKmwzbWRldl9saW5rX3Njb3BlX2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJCSAgIHN0cnVjdCBmbG93aTYgKmZsNikKIHsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBOVUxMOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CkBAIC0xMjEsNzAgKzEyMCwxNSBAQAogCQkJZGV2ID0gbmV0ZGV2X21hc3Rlcl91cHBlcl9kZXZfZ2V0X3JjdShkZXYpOwogCiAJCWlmIChkZXYgJiYgbmV0aWZfaXNfbDNfbWFzdGVyKGRldikgJiYKLQkJICAgIGRldi0+bDNtZGV2X29wcy0+bDNtZGV2X2dldF9ydDZfZHN0KQotCQkJZHN0ID0gZGV2LT5sM21kZXZfb3BzLT5sM21kZXZfZ2V0X3J0Nl9kc3QoZGV2LCBmbDYpOworCQkgICAgZGV2LT5sM21kZXZfb3BzLT5sM21kZXZfbGlua19zY29wZV9sb29rdXApCisJCQlkc3QgPSBkZXYtPmwzbWRldl9vcHMtPmwzbWRldl9saW5rX3Njb3BlX2xvb2t1cChkZXYsIGZsNik7CiAKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQogCiAJcmV0dXJuIGRzdDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGwzbWRldl9nZXRfcnQ2X2RzdCk7Ci0KLS8qKgotICoJbDNtZGV2X2dldF9zYWRkciAtIGdldCBzb3VyY2UgYWRkcmVzcyBmb3IgYSBmbG93IGJhc2VkIG9uIGFuIGludGVyZmFjZQotICoJCQkgICBlbnNsYXZlZCB0byBhbiBMMyBtYXN0ZXIgZGV2aWNlCi0gKglAbmV0OiBuZXR3b3JrIG5hbWVzcGFjZSBmb3IgZGV2aWNlIGluZGV4IGxvb2t1cAotICoJQGlmaW5kZXg6IEludGVyZmFjZSBpbmRleAotICoJQGZsNDogSVB2NCBmbG93IHN0cnVjdAotICovCi0KLWludCBsM21kZXZfZ2V0X3NhZGRyKHN0cnVjdCBuZXQgKm5ldCwgaW50IGlmaW5kZXgsIHN0cnVjdCBmbG93aTQgKmZsNCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCWludCByYyA9IDA7Ci0KLQlpZiAoaWZpbmRleCkgewotCQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQkJZGV2ID0gZGV2X2dldF9ieV9pbmRleF9yY3UobmV0LCBpZmluZGV4KTsKLQkJaWYgKGRldiAmJiBuZXRpZl9pc19sM19zbGF2ZShkZXYpKQotCQkJZGV2ID0gbmV0ZGV2X21hc3Rlcl91cHBlcl9kZXZfZ2V0X3JjdShkZXYpOwotCi0JCWlmIChkZXYgJiYgbmV0aWZfaXNfbDNfbWFzdGVyKGRldikgJiYKLQkJICAgIGRldi0+bDNtZGV2X29wcy0+bDNtZGV2X2dldF9zYWRkcikKLQkJCXJjID0gZGV2LT5sM21kZXZfb3BzLT5sM21kZXZfZ2V0X3NhZGRyKGRldiwgZmw0KTsKLQotCQlyY3VfcmVhZF91bmxvY2soKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChsM21kZXZfZ2V0X3NhZGRyKTsKLQotaW50IGwzbWRldl9nZXRfc2FkZHI2KHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IHNvY2sgKnNrLAotCQkgICAgICBzdHJ1Y3QgZmxvd2k2ICpmbDYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGZsNi0+Zmxvd2k2X29pZikgewotCQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQkJZGV2ID0gZGV2X2dldF9ieV9pbmRleF9yY3UobmV0LCBmbDYtPmZsb3dpNl9vaWYpOwotCQlpZiAoZGV2ICYmIG5ldGlmX2lzX2wzX3NsYXZlKGRldikpCi0JCQlkZXYgPSBuZXRkZXZfbWFzdGVyX3VwcGVyX2Rldl9nZXRfcmN1KGRldik7Ci0KLQkJaWYgKGRldiAmJiBuZXRpZl9pc19sM19tYXN0ZXIoZGV2KSAmJgotCQkgICAgZGV2LT5sM21kZXZfb3BzLT5sM21kZXZfZ2V0X3NhZGRyNikKLQkJCXJjID0gZGV2LT5sM21kZXZfb3BzLT5sM21kZXZfZ2V0X3NhZGRyNihkZXYsIHNrLCBmbDYpOwotCi0JCXJjdV9yZWFkX3VubG9jaygpOwotCX0KLQotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGwzbWRldl9nZXRfc2FkZHI2KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGwzbWRldl9saW5rX3Njb3BlX2xvb2t1cCk7CiAKIC8qKgogICoJbDNtZGV2X2ZpYl9ydWxlX21hdGNoIC0gRGV0ZXJtaW5lIGlmIGZsb3dpIHJlZmVyZW5jZXMgYW4KQEAgLTIyMiwzICsxNjYsMzggQEAKIAogCXJldHVybiByYzsKIH0KKwordm9pZCBsM21kZXZfdXBkYXRlX2Zsb3coc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmxvd2kgKmZsKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGlmaW5kZXg7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlpZiAoZmwtPmZsb3dpX29pZikgeworCQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4X3JjdShuZXQsIGZsLT5mbG93aV9vaWYpOworCQlpZiAoZGV2KSB7CisJCQlpZmluZGV4ID0gbDNtZGV2X21hc3Rlcl9pZmluZGV4X3JjdShkZXYpOworCQkJaWYgKGlmaW5kZXgpIHsKKwkJCQlmbC0+Zmxvd2lfb2lmID0gaWZpbmRleDsKKwkJCQlmbC0+Zmxvd2lfZmxhZ3MgfD0gRkxPV0lfRkxBR19TS0lQX05IX09JRjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChmbC0+Zmxvd2lfaWlmKSB7CisJCWRldiA9IGRldl9nZXRfYnlfaW5kZXhfcmN1KG5ldCwgZmwtPmZsb3dpX2lpZik7CisJCWlmIChkZXYpIHsKKwkJCWlmaW5kZXggPSBsM21kZXZfbWFzdGVyX2lmaW5kZXhfcmN1KGRldik7CisJCQlpZiAoaWZpbmRleCkgeworCQkJCWZsLT5mbG93aV9paWYgPSBpZmluZGV4OworCQkJCWZsLT5mbG93aV9mbGFncyB8PSBGTE9XSV9GTEFHX1NLSVBfTkhfT0lGOworCQkJfQorCQl9CisJfQorCitvdXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChsM21kZXZfdXBkYXRlX2Zsb3cpOwpkaWZmIC0tZ2l0IGEvbmV0L2xsYy9hZl9sbGMuYyBiL25ldC9sbGMvYWZfbGxjLmMKaW5kZXggOGFlM2VkOS4uZGI5MTZjZiAxMDA2NDQKLS0tIGEvbmV0L2xsYy9hZl9sbGMuYworKysgYi9uZXQvbGxjL2FmX2xsYy5jCkBAIC0zOCw3ICszOCw3IEBACiBzdGF0aWMgc3RydWN0IHNvY2thZGRyX2xsYyBsbGNfdWlfYWRkcm51bGw7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHByb3RvX29wcyBsbGNfdWlfb3BzOwogCi1zdGF0aWMgbG9uZyBsbGNfdWlfd2FpdF9mb3JfY29ubihzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW91dCk7CitzdGF0aWMgYm9vbCBsbGNfdWlfd2FpdF9mb3JfY29ubihzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW91dCk7CiBzdGF0aWMgaW50IGxsY191aV93YWl0X2Zvcl9kaXNjKHN0cnVjdCBzb2NrICpzaywgbG9uZyB0aW1lb3V0KTsKIHN0YXRpYyBpbnQgbGxjX3VpX3dhaXRfZm9yX2J1c3lfY29yZShzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW91dCk7CiAKQEAgLTU1MSw3ICs1NTEsNyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGxvbmcgbGxjX3VpX3dhaXRfZm9yX2Nvbm4oc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvdXQpCitzdGF0aWMgYm9vbCBsbGNfdWlfd2FpdF9mb3JfY29ubihzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW91dCkKIHsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2FnZy1yeC5jIGIvbmV0L21hYzgwMjExL2FnZy1yeC5jCmluZGV4IGE5YWZmNjAuLmY2NzQ5ZGMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9hZ2ctcnguYworKysgYi9uZXQvbWFjODAyMTEvYWdnLXJ4LmMKQEAgLTI2MSwxMCArMjYxLDE2IEBACiAJCS50aW1lb3V0ID0gdGltZW91dCwKIAkJLnNzbiA9IHN0YXJ0X3NlcV9udW0sCiAJfTsKLQogCWludCBpLCByZXQgPSAtRU9QTk9UU1VQUDsKIAl1MTYgc3RhdHVzID0gV0xBTl9TVEFUVVNfUkVRVUVTVF9ERUNMSU5FRDsKIAorCWlmICh0aWQgPj0gSUVFRTgwMjExX0ZJUlNUX1RTUEVDX1RTSUQpIHsKKwkJaHRfZGJnKHN0YS0+c2RhdGEsCisJCSAgICAgICAiU1RBICVwTSByZXF1ZXN0cyBCQSBzZXNzaW9uIG9uIHVuc3VwcG9ydGVkIHRpZCAlZFxuIiwKKwkJICAgICAgIHN0YS0+c3RhLmFkZHIsIHRpZCk7CisJCWdvdG8gZW5kX25vX2xvY2s7CisJfQorCiAJaWYgKCFzdGEtPnN0YS5odF9jYXAuaHRfc3VwcG9ydGVkKSB7CiAJCWh0X2RiZyhzdGEtPnNkYXRhLAogCQkgICAgICAgIlNUQSAlcE0gZXJyb25lb3VzbHkgcmVxdWVzdHMgQkEgc2Vzc2lvbiBvbiB0aWQgJWQgdy9vIFFvU1xuIiwKQEAgLTI5OCwxMCArMzA0LDEzIEBACiAJCWJ1Zl9zaXplID0gSUVFRTgwMjExX01BWF9BTVBEVV9CVUY7CiAKIAkvKiBtYWtlIHN1cmUgdGhlIHNpemUgZG9lc24ndCBleGNlZWQgdGhlIG1heGltdW0gc3VwcG9ydGVkIGJ5IHRoZSBodyAqLwotCWlmIChidWZfc2l6ZSA+IGxvY2FsLT5ody5tYXhfcnhfYWdncmVnYXRpb25fc3ViZnJhbWVzKQotCQlidWZfc2l6ZSA9IGxvY2FsLT5ody5tYXhfcnhfYWdncmVnYXRpb25fc3ViZnJhbWVzOworCWlmIChidWZfc2l6ZSA+IHN0YS0+c3RhLm1heF9yeF9hZ2dyZWdhdGlvbl9zdWJmcmFtZXMpCisJCWJ1Zl9zaXplID0gc3RhLT5zdGEubWF4X3J4X2FnZ3JlZ2F0aW9uX3N1YmZyYW1lczsKIAlwYXJhbXMuYnVmX3NpemUgPSBidWZfc2l6ZTsKIAorCWh0X2RiZyhzdGEtPnNkYXRhLCAiQWRkQkEgUmVxIGJ1Zl9zaXplPSVkIGZvciAlcE1cbiIsCisJICAgICAgIGJ1Zl9zaXplLCBzdGEtPnN0YS5hZGRyKTsKKwogCS8qIGV4YW1pbmUgc3RhdGUgbWFjaGluZSAqLwogCW11dGV4X2xvY2soJnN0YS0+YW1wZHVfbWxtZS5tdHgpOwogCkBAIC00MDYsOCArNDE1LDEwIEBACiAJfQogCiBlbmQ6Ci0JaWYgKHN0YXR1cyA9PSBXTEFOX1NUQVRVU19TVUNDRVNTKQorCWlmIChzdGF0dXMgPT0gV0xBTl9TVEFUVVNfU1VDQ0VTUykgewogCQlfX3NldF9iaXQodGlkLCBzdGEtPmFtcGR1X21sbWUuYWdnX3Nlc3Npb25fdmFsaWQpOworCQlfX2NsZWFyX2JpdCh0aWQsIHN0YS0+YW1wZHVfbWxtZS51bmV4cGVjdGVkX2FnZyk7CisJfQogCW11dGV4X3VubG9jaygmc3RhLT5hbXBkdV9tbG1lLm10eCk7CiAKIGVuZF9ub19sb2NrOgpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2FnZy10eC5jIGIvbmV0L21hYzgwMjExL2FnZy10eC5jCmluZGV4IDU2NTBjNDYuLjQ1MzE5Y2MgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9hZ2ctdHguYworKysgYi9uZXQvbWFjODAyMTEvYWdnLXR4LmMKQEAgLTU4NCw2ICs1ODQsOSBAQAogCSAgICBpZWVlODAyMTFfaHdfY2hlY2soJmxvY2FsLT5odywgVFhfQU1QRFVfU0VUVVBfSU5fSFcpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmIChXQVJOX09OKHRpZCA+PSBJRUVFODAyMTFfRklSU1RfVFNQRUNfVFNJRCkpCisJCXJldHVybiAtRUlOVkFMOworCiAJaHRfZGJnKHNkYXRhLCAiT3BlbiBCQSBzZXNzaW9uIHJlcXVlc3RlZCBmb3IgJXBNIHRpZCAldVxuIiwKIAkgICAgICAgcHVic3RhLT5hZGRyLCB0aWQpOwogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvY2ZnLmMgYi9uZXQvbWFjODAyMTEvY2ZnLmMKaW5kZXggNDdlOTlhYjguLmZkNjU0MWYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9jZmcuYworKysgYi9uZXQvbWFjODAyMTEvY2ZnLmMKQEAgLTMsNiArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IDIwMDYtMjAxMAlKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgogICogQ29weXJpZ2h0IDIwMTMtMjAxNSAgSW50ZWwgTW9iaWxlIENvbW11bmljYXRpb25zIEdtYkgKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEludGVsIERldXRzY2hsYW5kIEdtYkgKICAqCiAgKiBUaGlzIGZpbGUgaXMgR1BMdjIgYXMgZm91bmQgaW4gQ09QWUlORy4KICAqLwpAQCAtMzksNyArNDAsNyBAQAogCiAJaWYgKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiAmJiBmbGFncykgewogCQlzZGF0YSA9IElFRUU4MDIxMV9XREVWX1RPX1NVQl9JRih3ZGV2KTsKLQkJc2RhdGEtPnUubW50cl9mbGFncyA9ICpmbGFnczsKKwkJc2RhdGEtPnUubW50ci5mbGFncyA9ICpmbGFnczsKIAl9CiAKIAlyZXR1cm4gd2RldjsKQEAgLTczLDggKzc0LDI5IEBACiAJCXNkYXRhLT51Lm1nZC51c2VfNGFkZHIgPSBwYXJhbXMtPnVzZV80YWRkcjsKIAl9CiAKLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IgJiYgZmxhZ3MpIHsKKwlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpIHsKIAkJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKm1vbml0b3Jfc2RhdGE7CisJCXUzMiBtdV9tbnRyX2NhcF9mbGFnID0gTkw4MDIxMV9FWFRfRkVBVFVSRV9NVV9NSU1PX0FJUl9TTklGRkVSOworCisJCW1vbml0b3Jfc2RhdGEgPSBydG5sX2RlcmVmZXJlbmNlKGxvY2FsLT5tb25pdG9yX3NkYXRhKTsKKwkJaWYgKG1vbml0b3Jfc2RhdGEgJiYKKwkJICAgIHdpcGh5X2V4dF9mZWF0dXJlX2lzc2V0KHdpcGh5LCBtdV9tbnRyX2NhcF9mbGFnKSkgeworCQkJbWVtY3B5KG1vbml0b3Jfc2RhdGEtPnZpZi5ic3NfY29uZi5tdV9ncm91cC5tZW1iZXJzaGlwLAorCQkJICAgICAgIHBhcmFtcy0+dmh0X211bWltb19ncm91cHMsIFdMQU5fTUVNQkVSU0hJUF9MRU4pOworCQkJbWVtY3B5KG1vbml0b3Jfc2RhdGEtPnZpZi5ic3NfY29uZi5tdV9ncm91cC5wb3NpdGlvbiwKKwkJCSAgICAgICBwYXJhbXMtPnZodF9tdW1pbW9fZ3JvdXBzICsgV0xBTl9NRU1CRVJTSElQX0xFTiwKKwkJCSAgICAgICBXTEFOX1VTRVJfUE9TSVRJT05fTEVOKTsKKwkJCW1vbml0b3Jfc2RhdGEtPnZpZi5tdV9taW1vX293bmVyID0gdHJ1ZTsKKwkJCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KG1vbml0b3Jfc2RhdGEsCisJCQkJCQkJIEJTU19DSEFOR0VEX01VX0dST1VQUyk7CisKKwkJCWV0aGVyX2FkZHJfY29weShtb25pdG9yX3NkYXRhLT51Lm1udHIubXVfZm9sbG93X2FkZHIsCisJCQkJCXBhcmFtcy0+bWFjYWRkcik7CisJCX0KKworCQlpZiAoIWZsYWdzKQorCQkJcmV0dXJuIDA7CiAKIAkJaWYgKGllZWU4MDIxMV9zZGF0YV9ydW5uaW5nKHNkYXRhKSkgewogCQkJdTMyIG1hc2sgPSBNT05JVE9SX0ZMQUdfQ09PS19GUkFNRVMgfApAQCAtODksMTEgKzExMSwxMSBAQAogCQkJICoJY29va2VkX21udHJzLCBtb25pdG9yIGFuZCBhbGwgZmlmXyogY291bnRlcnMKIAkJCSAqCXJlY29uZmlndXJlIGhhcmR3YXJlCiAJCQkgKi8KLQkJCWlmICgoKmZsYWdzICYgbWFzaykgIT0gKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBtYXNrKSkKKwkJCWlmICgoKmZsYWdzICYgbWFzaykgIT0gKHNkYXRhLT51Lm1udHIuZmxhZ3MgJiBtYXNrKSkKIAkJCQlyZXR1cm4gLUVCVVNZOwogCiAJCQlpZWVlODAyMTFfYWRqdXN0X21vbml0b3JfZmxhZ3Moc2RhdGEsIC0xKTsKLQkJCXNkYXRhLT51Lm1udHJfZmxhZ3MgPSAqZmxhZ3M7CisJCQlzZGF0YS0+dS5tbnRyLmZsYWdzID0gKmZsYWdzOwogCQkJaWVlZTgwMjExX2FkanVzdF9tb25pdG9yX2ZsYWdzKHNkYXRhLCAxKTsKIAogCQkJaWVlZTgwMjExX2NvbmZpZ3VyZV9maWx0ZXIobG9jYWwpOwpAQCAtMTAzLDcgKzEyNSw3IEBACiAJCQkgKiBhbmQgaWVlZTgwMjExX2RvX29wZW4gdGFrZSBjYXJlIG9mICJldmVyeXRoaW5nIgogCQkJICogbWVudGlvbmVkIGluIHRoZSBjb21tZW50IGFib3ZlLgogCQkJICovCi0JCQlzZGF0YS0+dS5tbnRyX2ZsYWdzID0gKmZsYWdzOworCQkJc2RhdGEtPnUubW50ci5mbGFncyA9ICpmbGFnczsKIAkJfQogCX0KIApAQCAtMTMxLDYgKzE1MywxNDkgQEAKIAlpZWVlODAyMTFfc2RhdGFfc3RvcChJRUVFODAyMTFfV0RFVl9UT19TVUJfSUYod2RldikpOwogfQogCitzdGF0aWMgaW50IGllZWU4MDIxMV9zdGFydF9uYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCSAgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiAqY29uZikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9XREVWX1RPX1NVQl9JRih3ZGV2KTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmc2RhdGEtPmxvY2FsLT5jaGFuY3R4X210eCk7CisJcmV0ID0gaWVlZTgwMjExX2NoZWNrX2NvbWJpbmF0aW9ucyhzZGF0YSwgTlVMTCwgMCwgMCk7CisJbXV0ZXhfdW5sb2NrKCZzZGF0YS0+bG9jYWwtPmNoYW5jdHhfbXR4KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGllZWU4MDIxMV9kb19vcGVuKHdkZXYsIHRydWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBkcnZfc3RhcnRfbmFuKHNkYXRhLT5sb2NhbCwgc2RhdGEsIGNvbmYpOworCWlmIChyZXQpCisJCWllZWU4MDIxMV9zZGF0YV9zdG9wKHNkYXRhKTsKKworCXNkYXRhLT51Lm5hbi5jb25mID0gKmNvbmY7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RvcF9uYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCSAgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX1dERVZfVE9fU1VCX0lGKHdkZXYpOworCisJZHJ2X3N0b3BfbmFuKHNkYXRhLT5sb2NhbCwgc2RhdGEpOworCWllZWU4MDIxMV9zZGF0YV9zdG9wKHNkYXRhKTsKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfbmFuX2NoYW5nZV9jb25mKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgICAgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mLAorCQkJCSAgICAgdTMyIGNoYW5nZXMpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfV0RFVl9UT19TVUJfSUYod2Rldik7CisJc3RydWN0IGNmZzgwMjExX25hbl9jb25mIG5ld19jb25mOworCWludCByZXQgPSAwOworCisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9OQU4pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICghaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQorCQlyZXR1cm4gLUVORVRET1dOOworCisJbmV3X2NvbmYgPSBzZGF0YS0+dS5uYW4uY29uZjsKKworCWlmIChjaGFuZ2VzICYgQ0ZHODAyMTFfTkFOX0NPTkZfQ0hBTkdFRF9QUkVGKQorCQluZXdfY29uZi5tYXN0ZXJfcHJlZiA9IGNvbmYtPm1hc3Rlcl9wcmVmOworCisJaWYgKGNoYW5nZXMgJiBDRkc4MDIxMV9OQU5fQ09ORl9DSEFOR0VEX0RVQUwpCisJCW5ld19jb25mLmR1YWwgPSBjb25mLT5kdWFsOworCisJcmV0ID0gZHJ2X25hbl9jaGFuZ2VfY29uZihzZGF0YS0+bG9jYWwsIHNkYXRhLCAmbmV3X2NvbmYsIGNoYW5nZXMpOworCWlmICghcmV0KQorCQlzZGF0YS0+dS5uYW4uY29uZiA9IG5ld19jb25mOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfYWRkX25hbl9mdW5jKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpuYW5fZnVuYykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9XREVWX1RPX1NVQl9JRih3ZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9OQU4pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICghaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQorCQlyZXR1cm4gLUVORVRET1dOOworCisJc3Bpbl9sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKworCXJldCA9IGlkcl9hbGxvYygmc2RhdGEtPnUubmFuLmZ1bmN0aW9uX2luc3RfaWRzLAorCQkJbmFuX2Z1bmMsIDEsIHNkYXRhLT5sb2NhbC0+aHcubWF4X25hbl9kZV9lbnRyaWVzICsgMSwKKwkJCUdGUF9BVE9NSUMpOworCXNwaW5fdW5sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbmFuX2Z1bmMtPmluc3RhbmNlX2lkID0gcmV0OworCisJV0FSTl9PTihuYW5fZnVuYy0+aW5zdGFuY2VfaWQgPT0gMCk7CisKKwlyZXQgPSBkcnZfYWRkX25hbl9mdW5jKHNkYXRhLT5sb2NhbCwgc2RhdGEsIG5hbl9mdW5jKTsKKwlpZiAocmV0KSB7CisJCXNwaW5fbG9ja19iaCgmc2RhdGEtPnUubmFuLmZ1bmNfbG9jayk7CisJCWlkcl9yZW1vdmUoJnNkYXRhLT51Lm5hbi5mdW5jdGlvbl9pbnN0X2lkcywKKwkJCSAgIG5hbl9mdW5jLT5pbnN0YW5jZV9pZCk7CisJCXNwaW5fdW5sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICoKK2llZWU4MDIxMV9maW5kX25hbl9mdW5jX2J5X2Nvb2tpZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgIHU2NCBjb29raWUpCit7CisJc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpmdW5jOworCWludCBpZDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnNkYXRhLT51Lm5hbi5mdW5jX2xvY2spOworCisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZzZGF0YS0+dS5uYW4uZnVuY3Rpb25faW5zdF9pZHMsIGZ1bmMsIGlkKSB7CisJCWlmIChmdW5jLT5jb29raWUgPT0gY29va2llKQorCQkJcmV0dXJuIGZ1bmM7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9kZWxfbmFuX2Z1bmMoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsIHU2NCBjb29raWUpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfV0RFVl9UT19TVUJfSUYod2Rldik7CisJc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpmdW5jOworCXU4IGluc3RhbmNlX2lkID0gMDsKKworCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOIHx8CisJICAgICFpZWVlODAyMTFfc2RhdGFfcnVubmluZyhzZGF0YSkpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19iaCgmc2RhdGEtPnUubmFuLmZ1bmNfbG9jayk7CisKKwlmdW5jID0gaWVlZTgwMjExX2ZpbmRfbmFuX2Z1bmNfYnlfY29va2llKHNkYXRhLCBjb29raWUpOworCWlmIChmdW5jKQorCQlpbnN0YW5jZV9pZCA9IGZ1bmMtPmluc3RhbmNlX2lkOworCisJc3Bpbl91bmxvY2tfYmgoJnNkYXRhLT51Lm5hbi5mdW5jX2xvY2spOworCisJaWYgKGluc3RhbmNlX2lkKQorCQlkcnZfZGVsX25hbl9mdW5jKHNkYXRhLT5sb2NhbCwgc2RhdGEsIGluc3RhbmNlX2lkKTsKK30KKwogc3RhdGljIGludCBpZWVlODAyMTFfc2V0X25vYWNrX21hcChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgIHUxNiBub2Fja19tYXApCkBAIC0yMzYsNiArNDAxLDcgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKIAljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ6CiAJY2FzZSBOVU1fTkw4MDIxMV9JRlRZUEVTOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKQEAgLTg2OSw3ICsxMDM1LDcgQEAKIAogCS8qIGZyZWUgYWxsIHBvdGVudGlhbGx5IHN0aWxsIGJ1ZmZlcmVkIGJjYXN0IGZyYW1lcyAqLwogCWxvY2FsLT50b3RhbF9wc19idWZmZXJlZCAtPSBza2JfcXVldWVfbGVuKCZzZGF0YS0+dS5hcC5wcy5iY19idWYpOwotCXNrYl9xdWV1ZV9wdXJnZSgmc2RhdGEtPnUuYXAucHMuYmNfYnVmKTsKKwlpZWVlODAyMTFfcHVyZ2VfdHhfcXVldWUoJmxvY2FsLT5odywgJnNkYXRhLT51LmFwLnBzLmJjX2J1Zik7CiAKIAltdXRleF9sb2NrKCZsb2NhbC0+bXR4KTsKIAlpZWVlODAyMTFfdmlmX2NvcHlfY2hhbmN0eF90b192bGFucyhzZGF0YSwgdHJ1ZSk7CkBAIC0yMDE1LDYgKzIxODEsNyBAQAogCQkgICAgICEocmVxLT5mbGFncyAmIE5MODAyMTFfU0NBTl9GTEFHX0FQKSkpCiAJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CkBAIC0yOTQwLDEwICszMTA3LDYgQEAKIAl9CiAKIAljaGFuY3R4ID0gY29udGFpbmVyX29mKGNvbmYsIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCwgY29uZik7Ci0JaWYgKCFjaGFuY3R4KSB7Ci0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQogCiAJY2hfc3dpdGNoLnRpbWVzdGFtcCA9IDA7CiAJY2hfc3dpdGNoLmRldmljZV90aW1lc3RhbXAgPSAwOwpAQCAtMzM2MCw2ICszNTIzLDYzIEBACiAJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKK3ZvaWQgaWVlZTgwMjExX25hbl9mdW5jX3Rlcm1pbmF0ZWQoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgICB1OCBpbnN0X2lkLAorCQkJCSAgIGVudW0gbmw4MDIxMV9uYW5fZnVuY190ZXJtX3JlYXNvbiByZWFzb24sCisJCQkJICAgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gdmlmX3RvX3NkYXRhKHZpZik7CisJc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpmdW5jOworCXU2NCBjb29raWU7CisKKwlpZiAoV0FSTl9PTih2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKworCWZ1bmMgPSBpZHJfZmluZCgmc2RhdGEtPnUubmFuLmZ1bmN0aW9uX2luc3RfaWRzLCBpbnN0X2lkKTsKKwlpZiAoV0FSTl9PTighZnVuYykpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnNkYXRhLT51Lm5hbi5mdW5jX2xvY2spOworCQlyZXR1cm47CisJfQorCisJY29va2llID0gZnVuYy0+Y29va2llOworCWlkcl9yZW1vdmUoJnNkYXRhLT51Lm5hbi5mdW5jdGlvbl9pbnN0X2lkcywgaW5zdF9pZCk7CisKKwlzcGluX3VubG9ja19iaCgmc2RhdGEtPnUubmFuLmZ1bmNfbG9jayk7CisKKwljZmc4MDIxMV9mcmVlX25hbl9mdW5jKGZ1bmMpOworCisJY2ZnODAyMTFfbmFuX2Z1bmNfdGVybWluYXRlZChpZWVlODAyMTFfdmlmX3RvX3dkZXYodmlmKSwgaW5zdF9pZCwKKwkJCQkgICAgIHJlYXNvbiwgY29va2llLCBnZnApOworfQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfbmFuX2Z1bmNfdGVybWluYXRlZCk7CisKK3ZvaWQgaWVlZTgwMjExX25hbl9mdW5jX21hdGNoKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgICBzdHJ1Y3QgY2ZnODAyMTFfbmFuX21hdGNoX3BhcmFtcyAqbWF0Y2gsCisJCQkgICAgICBnZnBfdCBnZnApCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSB2aWZfdG9fc2RhdGEodmlmKTsKKwlzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgKmZ1bmM7CisKKwlpZiAoV0FSTl9PTih2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKworCWZ1bmMgPSBpZHJfZmluZCgmc2RhdGEtPnUubmFuLmZ1bmN0aW9uX2luc3RfaWRzLCAgbWF0Y2gtPmluc3RfaWQpOworCWlmIChXQVJOX09OKCFmdW5jKSkgeworCQlzcGluX3VubG9ja19iaCgmc2RhdGEtPnUubmFuLmZ1bmNfbG9jayk7CisJCXJldHVybjsKKwl9CisJbWF0Y2gtPmNvb2tpZSA9IGZ1bmMtPmNvb2tpZTsKKworCXNwaW5fdW5sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKworCWNmZzgwMjExX25hbl9tYXRjaChpZWVlODAyMTFfdmlmX3RvX3dkZXYodmlmKSwgbWF0Y2gsIGdmcCk7Cit9CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9uYW5fZnVuY19tYXRjaCk7CisKIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9vcHMgbWFjODAyMTFfY29uZmlnX29wcyA9IHsKIAkuYWRkX3ZpcnR1YWxfaW50ZiA9IGllZWU4MDIxMV9hZGRfaWZhY2UsCiAJLmRlbF92aXJ0dWFsX2ludGYgPSBpZWVlODAyMTFfZGVsX2lmYWNlLApAQCAtMzQ0NSw0ICszNjY1LDkgQEAKIAkuc2V0X2FwX2NoYW53aWR0aCA9IGllZWU4MDIxMV9zZXRfYXBfY2hhbndpZHRoLAogCS5hZGRfdHhfdHMgPSBpZWVlODAyMTFfYWRkX3R4X3RzLAogCS5kZWxfdHhfdHMgPSBpZWVlODAyMTFfZGVsX3R4X3RzLAorCS5zdGFydF9uYW4gPSBpZWVlODAyMTFfc3RhcnRfbmFuLAorCS5zdG9wX25hbiA9IGllZWU4MDIxMV9zdG9wX25hbiwKKwkubmFuX2NoYW5nZV9jb25mID0gaWVlZTgwMjExX25hbl9jaGFuZ2VfY29uZiwKKwkuYWRkX25hbl9mdW5jID0gaWVlZTgwMjExX2FkZF9uYW5fZnVuYywKKwkuZGVsX25hbl9mdW5jID0gaWVlZTgwMjExX2RlbF9uYW5fZnVuYywKIH07CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvY2hhbi5jIGIvbmV0L21hYzgwMjExL2NoYW4uYwppbmRleCA3NDE0MmQwLi5lNzVjYmY2IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvY2hhbi5jCisrKyBiL25ldC9tYWM4MDIxMS9jaGFuLmMKQEAgLTI3NCw2ICsyNzQsNyBAQAogCQkJCSAgICBpZWVlODAyMTFfZ2V0X21heF9yZXF1aXJlZF9idyhzZGF0YSkpOwogCQkJYnJlYWs7CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CiAJCQljb250aW51ZTsKIAkJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKIAkJY2FzZSBOTDgwMjExX0lGVFlQRV9XRFM6CkBAIC02NDYsNiArNjQ3LDkgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKmN1cnJfY3R4ID0gTlVMTDsKIAlpbnQgcmV0ID0gMDsKIAorCWlmIChXQVJOX09OKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU4pKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCiAJY29uZiA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoc2RhdGEtPnZpZi5jaGFuY3R4X2NvbmYsCiAJCQkJCSBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5jaGFuY3R4X210eCkpOwogCkBAIC03MTgsNiArNzIyLDcgQEAKIAogCQlzd2l0Y2ggKHNkYXRhLT52aWYudHlwZSkgewogCQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CisJCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCQkJY29udGludWU7CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKIAkJCWlmICghc2RhdGEtPnUubWdkLmFzc29jaWF0ZWQpCkBAIC05ODAsNiArOTg1LDcgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCWNhc2UgTlVNX05MODAyMTFfSUZUWVBFUzoKIAkJV0FSTl9PTigxKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvZGVidWdmcy5jIGIvbmV0L21hYzgwMjExL2RlYnVnZnMuYwppbmRleCAyOTA2YzEwLi5mNTZlMmY0IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvZGVidWdmcy5jCisrKyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzLmMKQEAgLTcxLDEzOCArNzEsNDUgQEAKIERFQlVHRlNfUkVBRE9OTFlfRklMRShyYXRlX2N0cmxfYWxnLCAiJXMiLAogCWxvY2FsLT5yYXRlX2N0cmwgPyBsb2NhbC0+cmF0ZV9jdHJsLT5vcHMtPm5hbWUgOiAiaHcvZHJpdmVyIik7CiAKLXN0cnVjdCBhcW1faW5mbyB7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWw7Ci0Jc2l6ZV90IHNpemU7Ci0Jc2l6ZV90IGxlbjsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlswXTsKLX07Ci0KLSNkZWZpbmUgQVFNX0hEUl9MRU4gMjAwCi0jZGVmaW5lIEFRTV9IV19FTlRSWV9MRU4gNDAKLSNkZWZpbmUgQVFNX1RYUV9FTlRSWV9MRU4gMTEwCi0KLXN0YXRpYyBpbnQgYXFtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBpbm9kZS0+aV9wcml2YXRlOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwotCXN0cnVjdCB0eHFfaW5mbyAqdHhxaTsKLQlzdHJ1Y3QgZnEgKmZxID0gJmxvY2FsLT5mcTsKLQlzdHJ1Y3QgYXFtX2luZm8gKmluZm8gPSBOVUxMOwotCWludCBsZW4gPSAwOwotCWludCBpOwotCi0JaWYgKCFsb2NhbC0+b3BzLT53YWtlX3R4X3F1ZXVlKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQlsZW4gKz0gQVFNX0hEUl9MRU47Ci0JbGVuICs9IDYgKiBBUU1fSFdfRU5UUllfTEVOOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNkYXRhLCAmbG9jYWwtPmludGVyZmFjZXMsIGxpc3QpCi0JCWxlbiArPSBBUU1fVFhRX0VOVFJZX0xFTjsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzdGEsICZsb2NhbC0+c3RhX2xpc3QsIGxpc3QpCi0JCWxlbiArPSBBUU1fVFhRX0VOVFJZX0xFTiAqIEFSUkFZX1NJWkUoc3RhLT5zdGEudHhxKTsKLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCWluZm8gPSB2bWFsbG9jKGxlbik7Ci0JaWYgKCFpbmZvKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNwaW5fbG9ja19iaCgmbG9jYWwtPmZxLmxvY2spOwotCXJjdV9yZWFkX2xvY2soKTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGluZm87Ci0JaW5mby0+bG9jYWwgPSBsb2NhbDsKLQlpbmZvLT5zaXplID0gbGVuOwotCWxlbiA9IDA7Ci0KLQlsZW4gKz0gc2NucHJpbnRmKGluZm8tPmJ1ZiArIGxlbiwgaW5mby0+c2l6ZSAtIGxlbiwKLQkJCSAiKiBod1xuIgotCQkJICJhY2Nlc3MgbmFtZSB2YWx1ZVxuIgotCQkJICJSIGZxX2Zsb3dzX2NudCAldVxuIgotCQkJICJSIGZxX2JhY2tsb2cgJXVcbiIKLQkJCSAiUiBmcV9vdmVybGltaXQgJXVcbiIKLQkJCSAiUiBmcV9jb2xsaXNpb25zICV1XG4iCi0JCQkgIlJXIGZxX2xpbWl0ICV1XG4iCi0JCQkgIlJXIGZxX3F1YW50dW0gJXVcbiIsCi0JCQkgZnEtPmZsb3dzX2NudCwKLQkJCSBmcS0+YmFja2xvZywKLQkJCSBmcS0+b3ZlcmxpbWl0LAotCQkJIGZxLT5jb2xsaXNpb25zLAotCQkJIGZxLT5saW1pdCwKLQkJCSBmcS0+cXVhbnR1bSk7Ci0KLQlsZW4gKz0gc2NucHJpbnRmKGluZm8tPmJ1ZiArIGxlbiwKLQkJCSBpbmZvLT5zaXplIC0gbGVuLAotCQkJICIqIHZpZlxuIgotCQkJICJpZm5hbWUgYWRkciBhYyBiYWNrbG9nLWJ5dGVzIGJhY2tsb2ctcGFja2V0cyBmbG93cyBvdmVybGltaXQgY29sbGlzaW9ucyB0eC1ieXRlcyB0eC1wYWNrZXRzXG4iKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNkYXRhLCAmbG9jYWwtPmludGVyZmFjZXMsIGxpc3QpIHsKLQkJdHhxaSA9IHRvX3R4cV9pbmZvKHNkYXRhLT52aWYudHhxKTsKLQkJbGVuICs9IHNjbnByaW50ZihpbmZvLT5idWYgKyBsZW4sIGluZm8tPnNpemUgLSBsZW4sCi0JCQkJICIlcyAlcE0gJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXVcbiIsCi0JCQkJIHNkYXRhLT5uYW1lLAotCQkJCSBzZGF0YS0+dmlmLmFkZHIsCi0JCQkJIHR4cWktPnR4cS5hYywKLQkJCQkgdHhxaS0+dGluLmJhY2tsb2dfYnl0ZXMsCi0JCQkJIHR4cWktPnRpbi5iYWNrbG9nX3BhY2tldHMsCi0JCQkJIHR4cWktPnRpbi5mbG93cywKLQkJCQkgdHhxaS0+dGluLm92ZXJsaW1pdCwKLQkJCQkgdHhxaS0+dGluLmNvbGxpc2lvbnMsCi0JCQkJIHR4cWktPnRpbi50eF9ieXRlcywKLQkJCQkgdHhxaS0+dGluLnR4X3BhY2tldHMpOwotCX0KLQotCWxlbiArPSBzY25wcmludGYoaW5mby0+YnVmICsgbGVuLAotCQkJIGluZm8tPnNpemUgLSBsZW4sCi0JCQkgIiogc3RhXG4iCi0JCQkgImlmbmFtZSBhZGRyIHRpZCBhYyBiYWNrbG9nLWJ5dGVzIGJhY2tsb2ctcGFja2V0cyBmbG93cyBvdmVybGltaXQgY29sbGlzaW9ucyB0eC1ieXRlcyB0eC1wYWNrZXRzXG4iKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHN0YSwgJmxvY2FsLT5zdGFfbGlzdCwgbGlzdCkgewotCQlzZGF0YSA9IHN0YS0+c2RhdGE7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YS0+c3RhLnR4cSk7IGkrKykgewotCQkJdHhxaSA9IHRvX3R4cV9pbmZvKHN0YS0+c3RhLnR4cVtpXSk7Ci0JCQlsZW4gKz0gc2NucHJpbnRmKGluZm8tPmJ1ZiArIGxlbiwgaW5mby0+c2l6ZSAtIGxlbiwKLQkJCQkJICIlcyAlcE0gJWQgJWQgJXUgJXUgJXUgJXUgJXUgJXUgJXVcbiIsCi0JCQkJCSBzZGF0YS0+bmFtZSwKLQkJCQkJIHN0YS0+c3RhLmFkZHIsCi0JCQkJCSB0eHFpLT50eHEudGlkLAotCQkJCQkgdHhxaS0+dHhxLmFjLAotCQkJCQkgdHhxaS0+dGluLmJhY2tsb2dfYnl0ZXMsCi0JCQkJCSB0eHFpLT50aW4uYmFja2xvZ19wYWNrZXRzLAotCQkJCQkgdHhxaS0+dGluLmZsb3dzLAotCQkJCQkgdHhxaS0+dGluLm92ZXJsaW1pdCwKLQkJCQkJIHR4cWktPnRpbi5jb2xsaXNpb25zLAotCQkJCQkgdHhxaS0+dGluLnR4X2J5dGVzLAotCQkJCQkgdHhxaS0+dGluLnR4X3BhY2tldHMpOwotCQl9Ci0JfQotCi0JaW5mby0+bGVuID0gbGVuOwotCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5mcS5sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFxbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXZmcmVlKGZpbGUtPnByaXZhdGVfZGF0YSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzc2l6ZV90IGFxbV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAogCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAogCQkJc2l6ZV90IGNvdW50LAogCQkJbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBhcW1faW5mbyAqaW5mbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZnEgKmZxID0gJmxvY2FsLT5mcTsKKwljaGFyIGJ1ZlsyMDBdOworCWludCBsZW4gPSAwOworCisJc3Bpbl9sb2NrX2JoKCZsb2NhbC0+ZnEubG9jayk7CisJcmN1X3JlYWRfbG9jaygpOworCisJbGVuID0gc2NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkiYWNjZXNzIG5hbWUgdmFsdWVcbiIKKwkJCSJSIGZxX2Zsb3dzX2NudCAldVxuIgorCQkJIlIgZnFfYmFja2xvZyAldVxuIgorCQkJIlIgZnFfb3ZlcmxpbWl0ICV1XG4iCisJCQkiUiBmcV9vdmVybWVtb3J5ICV1XG4iCisJCQkiUiBmcV9jb2xsaXNpb25zICV1XG4iCisJCQkiUiBmcV9tZW1vcnlfdXNhZ2UgJXVcbiIKKwkJCSJSVyBmcV9tZW1vcnlfbGltaXQgJXVcbiIKKwkJCSJSVyBmcV9saW1pdCAldVxuIgorCQkJIlJXIGZxX3F1YW50dW0gJXVcbiIsCisJCQlmcS0+Zmxvd3NfY250LAorCQkJZnEtPmJhY2tsb2csCisJCQlmcS0+b3Zlcm1lbW9yeSwKKwkJCWZxLT5vdmVybGltaXQsCisJCQlmcS0+Y29sbGlzaW9ucywKKwkJCWZxLT5tZW1vcnlfdXNhZ2UsCisJCQlmcS0+bWVtb3J5X2xpbWl0LAorCQkJZnEtPmxpbWl0LAorCQkJZnEtPnF1YW50dW0pOworCisJcmN1X3JlYWRfdW5sb2NrKCk7CisJc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5mcS5sb2NrKTsKIAogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsCi0JCQkJICAgICAgIGluZm8tPmJ1ZiwgaW5mby0+bGVuKTsKKwkJCQkgICAgICAgYnVmLCBsZW4pOwogfQogCiBzdGF0aWMgc3NpemVfdCBhcW1fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC0yMTAsOCArMTE3LDcgQEAKIAkJCSBzaXplX3QgY291bnQsCiAJCQkgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBhcW1faW5mbyAqaW5mbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGluZm8tPmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWNoYXIgYnVmWzEwMF07CiAJc2l6ZV90IGxlbjsKIApAQCAtMjI4LDYgKzEzNCw4IEBACiAKIAlpZiAoc3NjYW5mKGJ1ZiwgImZxX2xpbWl0ICV1IiwgJmxvY2FsLT5mcS5saW1pdCkgPT0gMSkKIAkJcmV0dXJuIGNvdW50OworCWVsc2UgaWYgKHNzY2FuZihidWYsICJmcV9tZW1vcnlfbGltaXQgJXUiLCAmbG9jYWwtPmZxLm1lbW9yeV9saW1pdCkgPT0gMSkKKwkJcmV0dXJuIGNvdW50OwogCWVsc2UgaWYgKHNzY2FuZihidWYsICJmcV9xdWFudHVtICV1IiwgJmxvY2FsLT5mcS5xdWFudHVtKSA9PSAxKQogCQlyZXR1cm4gY291bnQ7CiAKQEAgLTIzNyw4ICsxNDUsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXFtX29wcyA9IHsKIAkud3JpdGUgPSBhcW1fd3JpdGUsCiAJLnJlYWQgPSBhcW1fcmVhZCwKLQkub3BlbiA9IGFxbV9vcGVuLAotCS5yZWxlYXNlID0gYXFtX3JlbGVhc2UsCisJLm9wZW4gPSBzaW1wbGVfb3BlbiwKIAkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCiB9OwogCkBAIC0zMDIsNiArMjA5LDcgQEAKIAlGTEFHKFVTRVNfUlNTKSwKIAlGTEFHKFRYX0FNU0RVKSwKIAlGTEFHKFRYX0ZSQUdfTElTVCksCisJRkxBRyhSRVBPUlRTX0xPV19BQ0spLAogI3VuZGVmIEZMQUcKIH07CiAKQEAgLTQyOCw3ICszMzYsOSBAQAogCURFQlVHRlNfQUREKGh3ZmxhZ3MpOwogCURFQlVHRlNfQUREKHVzZXJfcG93ZXIpOwogCURFQlVHRlNfQUREKHBvd2VyKTsKLQlERUJVR0ZTX0FERF9NT0RFKGFxbSwgMDYwMCk7CisKKwlpZiAobG9jYWwtPm9wcy0+d2FrZV90eF9xdWV1ZSkKKwkJREVCVUdGU19BRERfTU9ERShhcW0sIDA2MDApOwogCiAJc3RhdHNkID0gZGVidWdmc19jcmVhdGVfZGlyKCJzdGF0aXN0aWNzIiwgcGh5ZCk7CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX25ldGRldi5jIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKaW5kZXggYTViYTczOS4uYmNlYzEyNCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKKysrIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKQEAgLTMwLDcgKzMwLDcgQEAKIAlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcywKIAlzc2l6ZV90ICgqZm9ybWF0KShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICosIGNoYXIgKiwgaW50KSkKIHsKLQljaGFyIGJ1Zls3MF07CisJY2hhciBidWZbMjAwXTsKIAlzc2l6ZV90IHJldCA9IC1FSU5WQUw7CiAKIAlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOwpAQCAtNDg2LDYgKzQ4NiwzOCBAQAogfQogSUVFRTgwMjExX0lGX0ZJTEVfUihudW1fYnVmZmVyZWRfbXVsdGljYXN0KTsKIAorc3RhdGljIHNzaXplX3QgaWVlZTgwMjExX2lmX2ZtdF9hcW0oCisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3QgdHhxX2luZm8gKnR4cWkgPSB0b190eHFfaW5mbyhzZGF0YS0+dmlmLnR4cSk7CisJaW50IGxlbjsKKworCXNwaW5fbG9ja19iaCgmbG9jYWwtPmZxLmxvY2spOworCXJjdV9yZWFkX2xvY2soKTsKKworCWxlbiA9IHNjbnByaW50ZihidWYsCisJCQlidWZsZW4sCisJCQkiYWMgYmFja2xvZy1ieXRlcyBiYWNrbG9nLXBhY2tldHMgbmV3LWZsb3dzIGRyb3BzIG1hcmtzIG92ZXJsaW1pdCBjb2xsaXNpb25zIHR4LWJ5dGVzIHR4LXBhY2tldHNcbiIKKwkJCSIldSAldSAldSAldSAldSAldSAldSAldSAldSAldVxuIiwKKwkJCXR4cWktPnR4cS5hYywKKwkJCXR4cWktPnRpbi5iYWNrbG9nX2J5dGVzLAorCQkJdHhxaS0+dGluLmJhY2tsb2dfcGFja2V0cywKKwkJCXR4cWktPnRpbi5mbG93cywKKwkJCXR4cWktPmNzdGF0cy5kcm9wX2NvdW50LAorCQkJdHhxaS0+Y3N0YXRzLmVjbl9tYXJrLAorCQkJdHhxaS0+dGluLm92ZXJsaW1pdCwKKwkJCXR4cWktPnRpbi5jb2xsaXNpb25zLAorCQkJdHhxaS0+dGluLnR4X2J5dGVzLAorCQkJdHhxaS0+dGluLnR4X3BhY2tldHMpOworCisJcmN1X3JlYWRfdW5sb2NrKCk7CisJc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5mcS5sb2NrKTsKKworCXJldHVybiBsZW47Cit9CitJRUVFODAyMTFfSUZfRklMRV9SKGFxbSk7CisKIC8qIElCU1MgYXR0cmlidXRlcyAqLwogc3RhdGljIHNzaXplX3QgaWVlZTgwMjExX2lmX2ZtdF90c2YoCiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKQEAgLTUyNCw5ICs1NTYsMTUgQEAKIAkJcmV0ID0ga3N0cnRvdWxsKGJ1ZiwgMTAsICZ0c2YpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7Ci0JCWlmICh0c2ZfaXNfZGVsdGEpCi0JCQl0c2YgPSBkcnZfZ2V0X3RzZihsb2NhbCwgc2RhdGEpICsgdHNmX2lzX2RlbHRhICogdHNmOwotCQlpZiAobG9jYWwtPm9wcy0+c2V0X3RzZikgeworCQlpZiAodHNmX2lzX2RlbHRhICYmIGxvY2FsLT5vcHMtPm9mZnNldF90c2YpIHsKKwkJCWRydl9vZmZzZXRfdHNmKGxvY2FsLCBzZGF0YSwgdHNmX2lzX2RlbHRhICogdHNmKTsKKwkJCXdpcGh5X2luZm8obG9jYWwtPmh3LndpcGh5LAorCQkJCSAgICJkZWJ1Z2ZzIG9mZnNldCBUU0YgYnkgJTAxOGxsZFxuIiwKKwkJCQkgICB0c2ZfaXNfZGVsdGEgKiB0c2YpOworCQl9IGVsc2UgaWYgKGxvY2FsLT5vcHMtPnNldF90c2YpIHsKKwkJCWlmICh0c2ZfaXNfZGVsdGEpCisJCQkJdHNmID0gZHJ2X2dldF90c2YobG9jYWwsIHNkYXRhKSArCisJCQkJICAgICAgdHNmX2lzX2RlbHRhICogdHNmOwogCQkJZHJ2X3NldF90c2YobG9jYWwsIHNkYXRhLCB0c2YpOwogCQkJd2lwaHlfaW5mbyhsb2NhbC0+aHcud2lwaHksCiAJCQkJICAgImRlYnVnZnMgc2V0IFRTRiB0byAlIzAxOGxseFxuIiwgdHNmKTsKQEAgLTYxOCw2ICs2NTYsOSBAQAogCURFQlVHRlNfQUREKHJjX3JhdGVpZHhfdmh0X21jc19tYXNrXzJnaHopOwogCURFQlVHRlNfQUREKHJjX3JhdGVpZHhfdmh0X21jc19tYXNrXzVnaHopOwogCURFQlVHRlNfQUREKGh3X3F1ZXVlcyk7CisKKwlpZiAoc2RhdGEtPmxvY2FsLT5vcHMtPndha2VfdHhfcXVldWUpCisJCURFQlVHRlNfQUREKGFxbSk7CiB9CiAKIHN0YXRpYyB2b2lkIGFkZF9zdGFfZmlsZXMoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvZGVidWdmc19zdGEuYyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX3N0YS5jCmluZGV4IGZkMzM0MTMuLmEyZmNkYjQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX3N0YS5jCisrKyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX3N0YS5jCkBAIC0xMzMsNiArMTMzLDU1IEBACiB9CiBTVEFfT1BTKGxhc3Rfc2VxX2N0cmwpOwogCisjZGVmaW5lIEFRTV9UWFFfRU5UUllfTEVOIDEzMAorCitzdGF0aWMgc3NpemVfdCBzdGFfYXFtX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzdGEtPmxvY2FsOworCXNpemVfdCBidWZzeiA9IEFRTV9UWFFfRU5UUllfTEVOKihJRUVFODAyMTFfTlVNX1RJRFMrMSk7CisJY2hhciAqYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCksICpwID0gYnVmOworCXN0cnVjdCB0eHFfaW5mbyAqdHhxaTsKKwlzc2l6ZV90IHJ2OworCWludCBpOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2JoKCZsb2NhbC0+ZnEubG9jayk7CisJcmN1X3JlYWRfbG9jaygpOworCisJcCArPSBzY25wcmludGYocCwKKwkJICAgICAgIGJ1ZnN6K2J1Zi1wLAorCQkgICAgICAgInRpZCBhYyBiYWNrbG9nLWJ5dGVzIGJhY2tsb2ctcGFja2V0cyBuZXctZmxvd3MgZHJvcHMgbWFya3Mgb3ZlcmxpbWl0IGNvbGxpc2lvbnMgdHgtYnl0ZXMgdHgtcGFja2V0c1xuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX05VTV9USURTOyBpKyspIHsKKwkJdHhxaSA9IHRvX3R4cV9pbmZvKHN0YS0+c3RhLnR4cVtpXSk7CisJCXAgKz0gc2NucHJpbnRmKHAsIGJ1ZnN6K2J1Zi1wLAorCQkJICAgICAgICIlZCAlZCAldSAldSAldSAldSAldSAldSAldSAldSAldVxuIiwKKwkJCSAgICAgICB0eHFpLT50eHEudGlkLAorCQkJICAgICAgIHR4cWktPnR4cS5hYywKKwkJCSAgICAgICB0eHFpLT50aW4uYmFja2xvZ19ieXRlcywKKwkJCSAgICAgICB0eHFpLT50aW4uYmFja2xvZ19wYWNrZXRzLAorCQkJICAgICAgIHR4cWktPnRpbi5mbG93cywKKwkJCSAgICAgICB0eHFpLT5jc3RhdHMuZHJvcF9jb3VudCwKKwkJCSAgICAgICB0eHFpLT5jc3RhdHMuZWNuX21hcmssCisJCQkgICAgICAgdHhxaS0+dGluLm92ZXJsaW1pdCwKKwkJCSAgICAgICB0eHFpLT50aW4uY29sbGlzaW9ucywKKwkJCSAgICAgICB0eHFpLT50aW4udHhfYnl0ZXMsCisJCQkgICAgICAgdHhxaS0+dGluLnR4X3BhY2tldHMpOworCX0KKworCXJjdV9yZWFkX3VubG9jaygpOworCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+ZnEubG9jayk7CisKKwlydiA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHAgLSBidWYpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJ2OworfQorU1RBX09QUyhhcW0pOworCiBzdGF0aWMgc3NpemVfdCBzdGFfYWdnX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKIAkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CkBAIC00NzgsNiArNTI3LDkgQEAKIAlERUJVR0ZTX0FERF9DT1VOVEVSKHJ4X2ZyYWdtZW50cywgcnhfc3RhdHMuZnJhZ21lbnRzKTsKIAlERUJVR0ZTX0FERF9DT1VOVEVSKHR4X2ZpbHRlcmVkLCBzdGF0dXNfc3RhdHMuZmlsdGVyZWQpOwogCisJaWYgKGxvY2FsLT5vcHMtPndha2VfdHhfcXVldWUpCisJCURFQlVHRlNfQUREKGFxbSk7CisKIAlpZiAoc2l6ZW9mKHN0YS0+ZHJpdmVyX2J1ZmZlcmVkX3RpZHMpID09IHNpemVvZih1MzIpKQogCQlkZWJ1Z2ZzX2NyZWF0ZV94MzIoImRyaXZlcl9idWZmZXJlZF90aWRzIiwgMDQwMCwKIAkJCQkgICBzdGEtPmRlYnVnZnNfZGlyLApAQCAtNDkyLDEwICs1NDQsNiBAQAogCiB2b2lkIGllZWU4MDIxMV9zdGFfZGVidWdmc19yZW1vdmUoc3RydWN0IHN0YV9pbmZvICpzdGEpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzdGEtPmxvY2FsOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gc3RhLT5zZGF0YTsKLQotCWRydl9zdGFfcmVtb3ZlX2RlYnVnZnMobG9jYWwsIHNkYXRhLCAmc3RhLT5zdGEsIHN0YS0+ZGVidWdmc19kaXIpOwogCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShzdGEtPmRlYnVnZnNfZGlyKTsKIAlzdGEtPmRlYnVnZnNfZGlyID0gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmMgYi9uZXQvbWFjODAyMTEvZHJpdmVyLW9wcy5jCmluZGV4IGMyNThmMTAuLmJiODg2ZTcgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmMKKysrIGIvbmV0L21hYzgwMjExL2RyaXZlci1vcHMuYwpAQCAtNjIsNyArNjIsNyBAQAogCWlmIChXQVJOX09OKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOIHx8CiAJCSAgICAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IgJiYKIAkJICAgICAhaWVlZTgwMjExX2h3X2NoZWNrKCZsb2NhbC0+aHcsIFdBTlRfTU9OSVRPUl9WSUYpICYmCi0JCSAgICAgIShzZGF0YS0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX0FDVElWRSkpKSkKKwkJICAgICAhKHNkYXRhLT51Lm1udHIuZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQUNUSVZFKSkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXRyYWNlX2Rydl9hZGRfaW50ZXJmYWNlKGxvY2FsLCBzZGF0YSk7CkBAIC0yMTUsNiArMjE1LDIxIEBACiAJdHJhY2VfZHJ2X3JldHVybl92b2lkKGxvY2FsKTsKIH0KIAordm9pZCBkcnZfb2Zmc2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkgICAgczY0IG9mZnNldCkKK3sKKwltaWdodF9zbGVlcCgpOworCisJaWYgKCFjaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpKQorCQlyZXR1cm47CisKKwl0cmFjZV9kcnZfb2Zmc2V0X3RzZihsb2NhbCwgc2RhdGEsIG9mZnNldCk7CisJaWYgKGxvY2FsLT5vcHMtPm9mZnNldF90c2YpCisJCWxvY2FsLT5vcHMtPm9mZnNldF90c2YoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsIG9mZnNldCk7CisJdHJhY2VfZHJ2X3JldHVybl92b2lkKGxvY2FsKTsKK30KKwogdm9pZCBkcnZfcmVzZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmggYi9uZXQvbWFjODAyMTEvZHJpdmVyLW9wcy5oCmluZGV4IDE4NDQ3M2MuLjA5Zjc3ZTQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmgKKysrIGIvbmV0L21hYzgwMjExL2RyaXZlci1vcHMuaApAQCAtMTYyLDcgKzE2Miw5IEBACiAJCXJldHVybjsKIAogCWlmIChXQVJOX09OX09OQ0Uoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UgfHwKLQkJCSBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikpCisJCQkgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX05BTiB8fAorCQkJIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiAmJgorCQkJICAhc2RhdGEtPnZpZi5tdV9taW1vX293bmVyKSkpCiAJCXJldHVybjsKIAogCWlmICghY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKSkKQEAgLTQ5OCwyMSArNTAwLDYgQEAKIAkJbG9jYWwtPm9wcy0+c3RhX2FkZF9kZWJ1Z2ZzKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLAogCQkJCQkgICAgc3RhLCBkaXIpOwogfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZHJ2X3N0YV9yZW1vdmVfZGVidWdmcyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKLQkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJCQkgIHN0cnVjdCBkZW50cnkgKmRpcikKLXsKLQltaWdodF9zbGVlcCgpOwotCi0Jc2RhdGEgPSBnZXRfYnNzX3NkYXRhKHNkYXRhKTsKLQljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOwotCi0JaWYgKGxvY2FsLT5vcHMtPnN0YV9yZW1vdmVfZGVidWdmcykKLQkJbG9jYWwtPm9wcy0+c3RhX3JlbW92ZV9kZWJ1Z2ZzKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLAotCQkJCQkgICAgICAgc3RhLCBkaXIpOwotfQogI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkcnZfc3RhX3ByZV9yY3VfcmVtb3ZlKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLApAQCAtNTgyLDYgKzU2OSw5IEBACiB2b2lkIGRydl9zZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCSB1NjQgdHNmKTsKK3ZvaWQgZHJ2X29mZnNldF90c2Yoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJICAgIHM2NCBvZmZzZXQpOwogdm9pZCBkcnZfcmVzZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CiAKQEAgLTEwODgsMTMgKzEwNzgsMTMgQEAKIH0KIAogc3RhdGljIGlubGluZSB1MzIgZHJ2X2dldF9leHBlY3RlZF90aHJvdWdocHV0KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQorCQkJCQkgICAgICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKIHsKIAl1MzIgcmV0ID0gMDsKIAotCXRyYWNlX2Rydl9nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dChzdGEpOwotCWlmIChsb2NhbC0+b3BzLT5nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dCkKLQkJcmV0ID0gbG9jYWwtPm9wcy0+Z2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQoc3RhKTsKKwl0cmFjZV9kcnZfZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQoJnN0YS0+c3RhKTsKKwlpZiAobG9jYWwtPm9wcy0+Z2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQgJiYgc3RhLT51cGxvYWRlZCkKKwkJcmV0ID0gbG9jYWwtPm9wcy0+Z2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQoJmxvY2FsLT5odywgJnN0YS0+c3RhKTsKIAl0cmFjZV9kcnZfcmV0dXJuX3UzMihsb2NhbCwgcmV0KTsKIAogCXJldHVybiByZXQ7CkBAIC0xMTc5LDQgKzExNjksODMgQEAKIAlsb2NhbC0+b3BzLT53YWtlX3R4X3F1ZXVlKCZsb2NhbC0+aHcsICZ0eHEtPnR4cSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGRydl9zdGFydF9uYW4oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mKQoreworCWludCByZXQ7CisKKwltaWdodF9zbGVlcCgpOworCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisKKwl0cmFjZV9kcnZfc3RhcnRfbmFuKGxvY2FsLCBzZGF0YSwgY29uZik7CisJcmV0ID0gbG9jYWwtPm9wcy0+c3RhcnRfbmFuKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLCBjb25mKTsKKwl0cmFjZV9kcnZfcmV0dXJuX2ludChsb2NhbCwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHJ2X3N0b3BfbmFuKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCW1pZ2h0X3NsZWVwKCk7CisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKworCXRyYWNlX2Rydl9zdG9wX25hbihsb2NhbCwgc2RhdGEpOworCWxvY2FsLT5vcHMtPnN0b3BfbmFuKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmKTsKKwl0cmFjZV9kcnZfcmV0dXJuX3ZvaWQobG9jYWwpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkcnZfbmFuX2NoYW5nZV9jb25mKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgICAgICAgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mLAorCQkJCSAgICAgICB1MzIgY2hhbmdlcykKK3sKKwlpbnQgcmV0OworCisJbWlnaHRfc2xlZXAoKTsKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCisJaWYgKCFsb2NhbC0+b3BzLT5uYW5fY2hhbmdlX2NvbmYpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXRyYWNlX2Rydl9uYW5fY2hhbmdlX2NvbmYobG9jYWwsIHNkYXRhLCBjb25mLCBjaGFuZ2VzKTsKKwlyZXQgPSBsb2NhbC0+b3BzLT5uYW5fY2hhbmdlX2NvbmYoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsIGNvbmYsCisJCQkJCSAgY2hhbmdlcyk7CisJdHJhY2VfZHJ2X3JldHVybl9pbnQobG9jYWwsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludCBkcnZfYWRkX25hbl9mdW5jKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuYyAqbmFuX2Z1bmMpCit7CisJaW50IHJldDsKKworCW1pZ2h0X3NsZWVwKCk7CisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKworCWlmICghbG9jYWwtPm9wcy0+YWRkX25hbl9mdW5jKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwl0cmFjZV9kcnZfYWRkX25hbl9mdW5jKGxvY2FsLCBzZGF0YSwgbmFuX2Z1bmMpOworCXJldCA9IGxvY2FsLT5vcHMtPmFkZF9uYW5fZnVuYygmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwgbmFuX2Z1bmMpOworCXRyYWNlX2Rydl9yZXR1cm5faW50KGxvY2FsLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRydl9kZWxfbmFuX2Z1bmMoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgdTggaW5zdGFuY2VfaWQpCit7CisJbWlnaHRfc2xlZXAoKTsKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCisJdHJhY2VfZHJ2X2RlbF9uYW5fZnVuYyhsb2NhbCwgc2RhdGEsIGluc3RhbmNlX2lkKTsKKwlpZiAobG9jYWwtPm9wcy0+ZGVsX25hbl9mdW5jKQorCQlsb2NhbC0+b3BzLT5kZWxfbmFuX2Z1bmMoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsIGluc3RhbmNlX2lkKTsKKwl0cmFjZV9kcnZfcmV0dXJuX3ZvaWQobG9jYWwpOworfQorCiAjZW5kaWYgLyogX19NQUM4MDIxMV9EUklWRVJfT1BTICovCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaCBiL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCmluZGV4IGY1NmQzNDIuLjM0YzJhZGQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCisrKyBiL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCkBAIC0zLDcgKzMsNyBAQAogICogQ29weXJpZ2h0IDIwMDUsIERldmljZXNjYXBlIFNvZnR3YXJlLCBJbmMuCiAgKiBDb3B5cmlnaHQgMjAwNi0yMDA3CUppcmkgQmVuYyA8amJlbmNAc3VzZS5jej4KICAqIENvcHlyaWdodCAyMDA3LTIwMTAJSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KLSAqIENvcHlyaWdodCAyMDEzLTIwMTQgIEludGVsIE1vYmlsZSBDb21tdW5pY2F0aW9ucyBHbWJICisgKiBDb3B5cmlnaHQgMjAxMy0yMDE1ICBJbnRlbCBNb2JpbGUgQ29tbXVuaWNhdGlvbnMgR21iSAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtODYsNiArODYsOCBAQAogCiAjZGVmaW5lIElFRUU4MDIxMV9ERUFVVEhfRlJBTUVfTEVOCSgyNCAvKiBoZHIgKi8gKyAyIC8qIHJlYXNvbiAqLykKIAorI2RlZmluZSBJRUVFODAyMTFfTUFYX05BTl9JTlNUQU5DRV9JRCAyNTUKKwogc3RydWN0IGllZWU4MDIxMV9mcmFnbWVudF9lbnRyeSB7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBza2JfbGlzdDsKIAl1bnNpZ25lZCBsb25nIGZpcnN0X2ZyYWdfdGltZTsKQEAgLTgxMywxNyArODE1LDM5IEBACiAgKiBAZGVmX2Zsb3c6IHVzZWQgYXMgYSBmYWxsYmFjayBmbG93IHdoZW4gYSBwYWNrZXQgZGVzdGluZWQgdG8gQHRpbiBoYXNoZXMgdG8KICAqCWEgZnFfZmxvdyB3aGljaCBpcyBhbHJlYWR5IG93bmVkIGJ5IGEgZGlmZmVyZW50IHRpbgogICogQGRlZl9jdmFyczogY29kZWwgdmFycyBmb3IgQGRlZl9mbG93CisgKiBAZnJhZ3M6IHVzZWQgdG8ga2VlcCBmcmFnbWVudHMgY3JlYXRlZCBhZnRlciBkZXF1ZXVlCiAgKi8KIHN0cnVjdCB0eHFfaW5mbyB7CiAJc3RydWN0IGZxX3RpbiB0aW47CiAJc3RydWN0IGZxX2Zsb3cgZGVmX2Zsb3c7CiAJc3RydWN0IGNvZGVsX3ZhcnMgZGVmX2N2YXJzOworCXN0cnVjdCBjb2RlbF9zdGF0cyBjc3RhdHM7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBmcmFnczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyoga2VlcCBsYXN0ISAqLwogCXN0cnVjdCBpZWVlODAyMTFfdHhxIHR4cTsKIH07CiAKK3N0cnVjdCBpZWVlODAyMTFfaWZfbW50ciB7CisJdTMyIGZsYWdzOworCXU4IG11X2ZvbGxvd19hZGRyW0VUSF9BTEVOXSBfX2FsaWduZWQoMik7Cit9OworCisvKioKKyAqIHN0cnVjdCBpZWVlODAyMTFfaWZfbmFuIC0gTkFOIHN0YXRlCisgKgorICogQGNvbmY6IGN1cnJlbnQgTkFOIGNvbmZpZ3VyYXRpb24KKyAqIEBmdW5jX2lkczogYSBiaXRtYXAgb2YgYXZhaWxhYmxlIGluc3RhbmNlX2lkJ3MKKyAqLworc3RydWN0IGllZWU4MDIxMV9pZl9uYW4geworCXN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiBjb25mOworCisJLyogcHJvdGVjdHMgZnVuY3Rpb25faW5zdF9pZHMgKi8KKwlzcGlubG9ja190IGZ1bmNfbG9jazsKKwlzdHJ1Y3QgaWRyIGZ1bmN0aW9uX2luc3RfaWRzOworfTsKKwogc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCkBAIC05MjIsNyArOTQ2LDggQEAKIAkJc3RydWN0IGllZWU4MDIxMV9pZl9pYnNzIGlic3M7CiAJCXN0cnVjdCBpZWVlODAyMTFfaWZfbWVzaCBtZXNoOwogCQlzdHJ1Y3QgaWVlZTgwMjExX2lmX29jYiBvY2I7Ci0JCXUzMiBtbnRyX2ZsYWdzOworCQlzdHJ1Y3QgaWVlZTgwMjExX2lmX21udHIgbW50cjsKKwkJc3RydWN0IGllZWU4MDIxMV9pZl9uYW4gbmFuOwogCX0gdTsKIAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCkBAIC0xMTEyLDcgKzExMzcsNiBAQAogCXN0cnVjdCBmcSBmcTsKIAlzdHJ1Y3QgY29kZWxfdmFycyAqY3ZhcnM7CiAJc3RydWN0IGNvZGVsX3BhcmFtcyBjcGFyYW1zOwotCXN0cnVjdCBjb2RlbF9zdGF0cyBjc3RhdHM7CiAKIAljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX29wcyAqb3BzOwogCkBAIC0xMjA4LDcgKzEyMzIsNyBAQAogCXNwaW5sb2NrX3QgdGltX2xvY2s7CiAJdW5zaWduZWQgbG9uZyBudW1fc3RhOwogCXN0cnVjdCBsaXN0X2hlYWQgc3RhX2xpc3Q7Ci0Jc3RydWN0IHJoYXNodGFibGUgc3RhX2hhc2g7CisJc3RydWN0IHJobHRhYmxlIHN0YV9oYXNoOwogCXN0cnVjdCB0aW1lcl9saXN0IHN0YV9jbGVhbnVwOwogCWludCBzdGFfZ2VuZXJhdGlvbjsKIApAQCAtMTQ3Niw2ICsxNTAwLDEzIEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZih0eHEsIHN0cnVjdCB0eHFfaW5mbywgdHhxKTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIHR4cV9oYXNfcXVldWUoc3RydWN0IGllZWU4MDIxMV90eHEgKnR4cSkKK3sKKwlzdHJ1Y3QgdHhxX2luZm8gKnR4cWkgPSB0b190eHFfaW5mbyh0eHEpOworCisJcmV0dXJuICEoc2tiX3F1ZXVlX2VtcHR5KCZ0eHFpLT5mcmFncykgJiYgIXR4cWktPnRpbi5iYWNrbG9nX3BhY2tldHMpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfYnNzaWRfbWF0Y2goY29uc3QgdTggKnJhZGRyLCBjb25zdCB1OCAqYWRkcikKIHsKIAlyZXR1cm4gZXRoZXJfYWRkcl9lcXVhbChyYWRkciwgYWRkcikgfHwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pZmFjZS5jIGIvbmV0L21hYzgwMjExL2lmYWNlLmMKaW5kZXggYjEyM2E5ZS4uNjM4ZWMwNyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2lmYWNlLmMKKysrIGIvbmV0L21hYzgwMjExL2lmYWNlLmMKQEAgLTQzLDYgKzQzLDggQEAKICAqIGJ5IGVpdGhlciB0aGUgUlROTCwgdGhlIGlmbGlzdF9tdHggb3IgUkNVLgogICovCiAKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9pZmFjZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKIGJvb2wgX19pZWVlODAyMTFfcmVjYWxjX3R4cG93ZXIoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4X2NvbmYgKmNoYW5jdHhfY29uZjsKQEAgLTE4OCw3ICsxOTAsNyBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKGl0ZXItPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IgJiYKLQkJICAgICEoaXRlci0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX0FDVElWRSkpCisJCSAgICAhKGl0ZXItPnUubW50ci5mbGFncyAmIE1PTklUT1JfRkxBR19BQ1RJVkUpKQogCQkJY29udGludWU7CiAKIAkJbSA9IGl0ZXItPnZpZi5hZGRyOwpAQCAtMjE3LDcgKzIxOSw3IEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IgJiYKLQkgICAgIShzZGF0YS0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX0FDVElWRSkpCisJICAgICEoc2RhdGEtPnUubW50ci5mbGFncyAmIE1PTklUT1JfRkxBR19BQ1RJVkUpKQogCQljaGVja19kdXAgPSBmYWxzZTsKIAogCXJldCA9IGllZWU4MDIxMV92ZXJpZnlfbWFjKHNkYXRhLCBzYS0+c2FfZGF0YSwgY2hlY2tfZHVwKTsKQEAgLTMyNSw2ICszMjcsOSBAQAogCWludCBuX3F1ZXVlcyA9IHNkYXRhLT5sb2NhbC0+aHcucXVldWVzOwogCWludCBpOwogCisJaWYgKGlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU4pCisJCXJldHVybiAwOworCiAJaWYgKGlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfTlVNX0FDUzsgaSsrKSB7CiAJCQlpZiAoV0FSTl9PTl9PTkNFKHNkYXRhLT52aWYuaHdfcXVldWVbaV0gPT0KQEAgLTM1Nyw3ICszNjIsNyBAQAogCQkJCSAgICBjb25zdCBpbnQgb2Zmc2V0KQogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwotCXUzMiBmbGFncyA9IHNkYXRhLT51Lm1udHJfZmxhZ3M7CisJdTMyIGZsYWdzID0gc2RhdGEtPnUubW50ci5mbGFnczsKIAogI2RlZmluZSBBREpVU1QoX2YsIF9zKQlkbyB7CQkJCQlcCiAJaWYgKGZsYWdzICYgTU9OSVRPUl9GTEFHXyMjX2YpCQkJCVwKQEAgLTQ0OCw2ICs0NTMsOSBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAorCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNkYXRhLT5za2JfcXVldWUpOworCUlOSVRfV09SSygmc2RhdGEtPndvcmssIGllZWU4MDIxMV9pZmFjZV93b3JrKTsKKwogCXJldHVybiAwOwogfQogCkBAIC01NDAsNiArNTQ4LDcgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKIAljYXNlIE5MODAyMTFfSUZUWVBFX09DQjoKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAkJLyogbm8gc3BlY2lhbCB0cmVhdG1lbnQgKi8KIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDoKQEAgLTU4OSwxMiArNTk4LDEyIEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgotCQlpZiAoc2RhdGEtPnUubW50cl9mbGFncyAmIE1PTklUT1JfRkxBR19DT09LX0ZSQU1FUykgeworCQlpZiAoc2RhdGEtPnUubW50ci5mbGFncyAmIE1PTklUT1JfRkxBR19DT09LX0ZSQU1FUykgewogCQkJbG9jYWwtPmNvb2tlZF9tbnRycysrOwogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoc2RhdGEtPnUubW50cl9mbGFncyAmIE1PTklUT1JfRkxBR19BQ1RJVkUpIHsKKwkJaWYgKHNkYXRhLT51Lm1udHIuZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQUNUSVZFKSB7CiAJCQlyZXMgPSBkcnZfYWRkX2ludGVyZmFjZShsb2NhbCwgc2RhdGEpOwogCQkJaWYgKHJlcykKIAkJCQlnb3RvIGVycl9zdG9wOwpAQCAtNjQxLDcgKzY1MCw4IEBACiAJCQlsb2NhbC0+ZmlmX3Byb2JlX3JlcSsrOwogCQl9CiAKLQkJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFKQorCQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UgJiYKKwkJICAgIHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9OQU4pCiAJCQljaGFuZ2VkIHw9IGllZWU4MDIxMV9yZXNldF9lcnBfaW5mbyhzZGF0YSk7CiAJCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBjaGFuZ2VkKTsKIApAQCAtNjU1LDYgKzY2NSw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBOTDgwMjExX0lGVFlQRV9XRFM6CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCS8qIG5vdCByZWFjaGVkICovCkBAIC03ODcsNiArNzk4LDcgQEAKIAlzdHJ1Y3QgcHNfZGF0YSAqcHM7CiAJc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNoYW5kZWY7CiAJYm9vbCBjYW5jZWxfc2NhbjsKKwlzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgKmZ1bmM7CiAKIAljbGVhcl9iaXQoU0RBVEFfU1RBVEVfUlVOTklORywgJnNkYXRhLT5zdGF0ZSk7CiAKQEAgLTkyNiw3ICs5MzgsNyBAQAogCQkvKiBubyBuZWVkIHRvIHRlbGwgZHJpdmVyICovCiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKLQkJaWYgKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQ09PS19GUkFNRVMpIHsKKwkJaWYgKHNkYXRhLT51Lm1udHIuZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQ09PS19GUkFNRVMpIHsKIAkJCWxvY2FsLT5jb29rZWRfbW50cnMtLTsKIAkJCWJyZWFrOwogCQl9CkBAIC05MzksNiArOTUxLDE4IEBACiAKIAkJaWVlZTgwMjExX2FkanVzdF9tb25pdG9yX2ZsYWdzKHNkYXRhLCAtMSk7CiAJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgorCQkvKiBjbGVhbiBhbGwgdGhlIGZ1bmN0aW9ucyAqLworCQlzcGluX2xvY2tfYmgoJnNkYXRhLT51Lm5hbi5mdW5jX2xvY2spOworCisJCWlkcl9mb3JfZWFjaF9lbnRyeSgmc2RhdGEtPnUubmFuLmZ1bmN0aW9uX2luc3RfaWRzLCBmdW5jLCBpKSB7CisJCQlpZHJfcmVtb3ZlKCZzZGF0YS0+dS5uYW4uZnVuY3Rpb25faW5zdF9pZHMsIGkpOworCQkJY2ZnODAyMTFfZnJlZV9uYW5fZnVuYyhmdW5jKTsKKwkJfQorCQlpZHJfZGVzdHJveSgmc2RhdGEtPnUubmFuLmZ1bmN0aW9uX2luc3RfaWRzKTsKKworCQlzcGluX3VubG9ja19iaCgmc2RhdGEtPnUubmFuLmZ1bmNfbG9jayk7CisJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKIAkJLyogcmVsaWVzIG9uIHN5bmNocm9uaXplX3JjdSgpIGJlbG93ICovCiAJCVJDVV9JTklUX1BPSU5URVIobG9jYWwtPnAycF9zZGF0YSwgTlVMTCk7CkBAIC0xMDEyLDcgKzEwMzYsNyBAQAogCQlpZWVlODAyMTFfcmVjYWxjX2lkbGUobG9jYWwpOwogCQltdXRleF91bmxvY2soJmxvY2FsLT5tdHgpOwogCi0JCWlmICghKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQUNUSVZFKSkKKwkJaWYgKCEoc2RhdGEtPnUubW50ci5mbGFncyAmIE1PTklUT1JfRkxBR19BQ1RJVkUpKQogCQkJYnJlYWs7CiAKIAkJLyogZmFsbCB0aHJvdWdoICovCkBAIC0xNDQ0LDEyICsxNDY4LDE3IEBACiAJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgogCQlzZGF0YS0+ZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMV9SQURJT1RBUDsKIAkJc2RhdGEtPmRldi0+bmV0ZGV2X29wcyA9ICZpZWVlODAyMTFfbW9uaXRvcmlmX29wczsKLQkJc2RhdGEtPnUubW50cl9mbGFncyA9IE1PTklUT1JfRkxBR19DT05UUk9MIHwKKwkJc2RhdGEtPnUubW50ci5mbGFncyA9IE1PTklUT1JfRkxBR19DT05UUk9MIHwKIAkJCQkgICAgICBNT05JVE9SX0ZMQUdfT1RIRVJfQlNTOwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKIAkJc2RhdGEtPnZpZi5ic3NfY29uZi5ic3NpZCA9IE5VTEw7CiAJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgorCQlpZHJfaW5pdCgmc2RhdGEtPnUubmFuLmZ1bmN0aW9uX2luc3RfaWRzKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnNkYXRhLT51Lm5hbi5mdW5jX2xvY2spOworCQlzZGF0YS0+dmlmLmJzc19jb25mLmJzc2lkID0gc2RhdGEtPnZpZi5hZGRyOworCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgogCQlzZGF0YS0+dmlmLmJzc19jb25mLmJzc2lkID0gc2RhdGEtPnZpZi5hZGRyOwpAQCAtMTcxNyw3ICsxNzQ2LDcgQEAKIAogCUFTU0VSVF9SVE5MKCk7CiAKLQlpZiAodHlwZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFKSB7CisJaWYgKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSB8fCB0eXBlID09IE5MODAyMTFfSUZUWVBFX05BTikgewogCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OwogCiAJCXNkYXRhID0ga3phbGxvYyhzaXplb2YoKnNkYXRhKSArIGxvY2FsLT5ody52aWZfZGF0YV9zaXplLApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21haW4uYyBiL25ldC9tYWM4MDIxMS9tYWluLmMKaW5kZXggZDAwZWE5Yi4uMTA3NWFjMiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21haW4uYworKysgYi9uZXQvbWFjODAyMTEvbWFpbi5jCkBAIC02NjAsNiArNjYwLDkgQEAKIAogCWllZWU4MDIxMV9yb2Nfc2V0dXAobG9jYWwpOwogCisJbG9jYWwtPmh3LnJhZGlvdGFwX3RpbWVzdGFtcC51bml0c19wb3MgPSAtMTsKKwlsb2NhbC0+aHcucmFkaW90YXBfdGltZXN0YW1wLmFjY3VyYWN5ID0gLTE7CisKIAlyZXR1cm4gJmxvY2FsLT5odzsKICBlcnJfZnJlZToKIAl3aXBoeV9mcmVlKHdpcGh5KTsKQEAgLTgxOCw2ICs4MjEsMTEgQEAKIAkgICAgICFsb2NhbC0+b3BzLT50ZGxzX3JlY3ZfY2hhbm5lbF9zd2l0Y2gpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKKwlpZiAoV0FSTl9PTihsb2NhbC0+aHcud2lwaHktPmludGVyZmFjZV9tb2RlcyAmCisJCQlCSVQoTkw4MDIxMV9JRlRZUEVfTkFOKSAmJgorCQkgICAgKCFsb2NhbC0+b3BzLT5zdGFydF9uYW4gfHwgIWxvY2FsLT5vcHMtPnN0b3BfbmFuKSkpCisJCXJldHVybiAtRUlOVkFMOworCiAjaWZkZWYgQ09ORklHX1BNCiAJaWYgKGh3LT53aXBoeS0+d293bGFuICYmICghbG9jYWwtPm9wcy0+c3VzcGVuZCB8fCAhbG9jYWwtPm9wcy0+cmVzdW1lKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDU1LDYgKzEwNjMsOSBAQAogCiAJbG9jYWwtPmR5bmFtaWNfcHNfZm9yY2VkX3RpbWVvdXQgPSAtMTsKIAorCWlmICghbG9jYWwtPmh3Lm1heF9uYW5fZGVfZW50cmllcykKKwkJbG9jYWwtPmh3Lm1heF9uYW5fZGVfZW50cmllcyA9IElFRUU4MDIxMV9NQVhfTkFOX0lOU1RBTkNFX0lEOworCiAJcmVzdWx0ID0gaWVlZTgwMjExX3dlcF9pbml0KGxvY2FsKTsKIAlpZiAocmVzdWx0IDwgMCkKIAkJd2lwaHlfZGVidWcobG9jYWwtPmh3LndpcGh5LCAiRmFpbGVkIHRvIGluaXRpYWxpemUgd2VwOiAlZFxuIiwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tZXNoLmMgYi9uZXQvbWFjODAyMTEvbWVzaC5jCmluZGV4IGM2NjQxMWQuLjQyMTIwZDkgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tZXNoLmMKKysrIGIvbmV0L21hYzgwMjExL21lc2guYwpAQCAtODgxLDIwICs4ODEsMjIgQEAKIAogCW5ldGlmX2NhcnJpZXJfb2ZmKHNkYXRhLT5kZXYpOwogCisJLyogZmx1c2ggU1RBcyBhbmQgbXBhdGhzIG9uIHRoaXMgaWZhY2UgKi8KKwlzdGFfaW5mb19mbHVzaChzZGF0YSk7CisJbWVzaF9wYXRoX2ZsdXNoX2J5X2lmYWNlKHNkYXRhKTsKKwogCS8qIHN0b3AgdGhlIGJlYWNvbiAqLwogCWlmbXNoLT5tZXNoX2lkX2xlbiA9IDA7CiAJc2RhdGEtPnZpZi5ic3NfY29uZi5lbmFibGVfYmVhY29uID0gZmFsc2U7CiAJY2xlYXJfYml0KFNEQVRBX1NUQVRFX09GRkNIQU5ORUxfQkVBQ09OX1NUT1BQRUQsICZzZGF0YS0+c3RhdGUpOwogCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBCU1NfQ0hBTkdFRF9CRUFDT05fRU5BQkxFRCk7CisKKwkvKiByZW1vdmUgYmVhY29uICovCiAJYmNuID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChpZm1zaC0+YmVhY29uLAogCQkJCQlsb2NrZGVwX2lzX2hlbGQoJnNkYXRhLT53ZGV2Lm10eCkpOwogCVJDVV9JTklUX1BPSU5URVIoaWZtc2gtPmJlYWNvbiwgTlVMTCk7CiAJa2ZyZWVfcmN1KGJjbiwgcmN1X2hlYWQpOwogCi0JLyogZmx1c2ggU1RBcyBhbmQgbXBhdGhzIG9uIHRoaXMgaWZhY2UgKi8KLQlzdGFfaW5mb19mbHVzaChzZGF0YSk7Ci0JbWVzaF9wYXRoX2ZsdXNoX2J5X2lmYWNlKHNkYXRhKTsKLQogCS8qIGZyZWUgYWxsIHBvdGVudGlhbGx5IHN0aWxsIGJ1ZmZlcmVkIGdyb3VwLWFkZHJlc3NlZCBmcmFtZXMgKi8KIAlsb2NhbC0+dG90YWxfcHNfYnVmZmVyZWQgLT0gc2tiX3F1ZXVlX2xlbigmaWZtc2gtPnBzLmJjX2J1Zik7CiAJc2tiX3F1ZXVlX3B1cmdlKCZpZm1zaC0+cHMuYmNfYnVmKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tZXNoX2h3bXAuYyBiL25ldC9tYWM4MDIxMS9tZXNoX2h3bXAuYwppbmRleCA4ZjljM2JkLi5iNzQ3Yzk2IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaF9od21wLmMKKysrIGIvbmV0L21hYzgwMjExL21lc2hfaHdtcC5jCkBAIC0zMjYsMjIgKzMyNiwzMyBAQAogCXUzMiB0eF90aW1lLCBlc3RpbWF0ZWRfcmV0eDsKIAl1NjQgcmVzdWx0OwogCi0JaWYgKHN0YS0+bWVzaC0+ZmFpbF9hdmcgPj0gMTAwKQotCQlyZXR1cm4gTUFYX01FVFJJQzsKKwkvKiBUcnkgdG8gZ2V0IHJhdGUgYmFzZWQgb24gSFcvU1cgUkMgYWxnb3JpdGhtLgorCSAqIFJhdGUgaXMgcmV0dXJuZWQgaW4gdW5pdHMgb2YgS2JwcywgY29ycmVjdCB0aGlzCisJICogdG8gY29tcGx5IHdpdGggYWlydGltZSBjYWxjdWxhdGlvbiB1bml0cworCSAqIFJvdW5kIHVwIGluIGNhc2Ugd2UgZ2V0IHJhdGUgPCAxMDBLYnBzCisJICovCisJcmF0ZSA9IERJVl9ST1VORF9VUChzdGFfZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQoc3RhKSwgMTAwKTsKIAotCXN0YV9zZXRfcmF0ZV9pbmZvX3R4KHN0YSwgJnN0YS0+dHhfc3RhdHMubGFzdF9yYXRlLCAmcmluZm8pOwotCXJhdGUgPSBjZmc4MDIxMV9jYWxjdWxhdGVfYml0cmF0ZSgmcmluZm8pOwotCWlmIChXQVJOX09OKCFyYXRlKSkKLQkJcmV0dXJuIE1BWF9NRVRSSUM7CisJaWYgKHJhdGUpIHsKKwkJZXJyID0gMDsKKwl9IGVsc2UgeworCQlpZiAoc3RhLT5tZXNoLT5mYWlsX2F2ZyA+PSAxMDApCisJCQlyZXR1cm4gTUFYX01FVFJJQzsKIAotCWVyciA9IChzdGEtPm1lc2gtPmZhaWxfYXZnIDw8IEFSSVRIX1NISUZUKSAvIDEwMDsKKwkJc3RhX3NldF9yYXRlX2luZm9fdHgoc3RhLCAmc3RhLT50eF9zdGF0cy5sYXN0X3JhdGUsICZyaW5mbyk7CisJCXJhdGUgPSBjZmc4MDIxMV9jYWxjdWxhdGVfYml0cmF0ZSgmcmluZm8pOworCQlpZiAoV0FSTl9PTighcmF0ZSkpCisJCQlyZXR1cm4gTUFYX01FVFJJQzsKKworCQllcnIgPSAoc3RhLT5tZXNoLT5mYWlsX2F2ZyA8PCBBUklUSF9TSElGVCkgLyAxMDA7CisJfQogCiAJLyogYml0cmF0ZSBpcyBpbiB1bml0cyBvZiAxMDAgS2Jwcywgd2hpbGUgd2UgbmVlZCByYXRlIGluIHVuaXRzIG9mCiAJICogMU1icHMuIFRoaXMgd2lsbCBiZSBjb3JyZWN0ZWQgb24gdHhfdGltZSBjb21wdXRhdGlvbi4KIAkgKi8KIAl0eF90aW1lID0gKGRldmljZV9jb25zdGFudCArIDEwICogdGVzdF9mcmFtZV9sZW4gLyByYXRlKTsKIAllc3RpbWF0ZWRfcmV0eCA9ICgoMSA8PCAoMiAqIEFSSVRIX1NISUZUKSkgLyAoc191bml0IC0gZXJyKSk7Ci0JcmVzdWx0ID0gKHR4X3RpbWUgKiBlc3RpbWF0ZWRfcmV0eCkgPj4gKDIgKiBBUklUSF9TSElGVCkgOworCXJlc3VsdCA9ICh0eF90aW1lICogZXN0aW1hdGVkX3JldHgpID4+ICgyICogQVJJVEhfU0hJRlQpOwogCXJldHVybiAodTMyKXJlc3VsdDsKIH0KIApAQCAtNzQ2LDYgKzc1Nyw3IEBACiAJCXN0YSA9IG5leHRfaG9wX2RlcmVmX3Byb3RlY3RlZChtcGF0aCk7CiAJCWlmIChtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfQUNUSVZFICYmCiAJCSAgICBldGhlcl9hZGRyX2VxdWFsKHRhLCBzdGEtPnN0YS5hZGRyKSAmJgorCQkgICAgIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfRklYRUQpICYmCiAJCSAgICAoIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfU05fVkFMSUQpIHx8CiAJCSAgICBTTl9HVCh0YXJnZXRfc24sIG1wYXRoLT5zbikgIHx8IHRhcmdldF9zbiA9PSAwKSkgewogCQkJbXBhdGgtPmZsYWdzICY9IH5NRVNIX1BBVEhfQUNUSVZFOwpAQCAtMTAxMiw3ICsxMDI0LDcgQEAKIAkJZ290byBlbmRkaXNjb3Zlcnk7CiAKIAlzcGluX2xvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKLQlpZiAobXBhdGgtPmZsYWdzICYgTUVTSF9QQVRIX0RFTEVURUQpIHsKKwlpZiAobXBhdGgtPmZsYWdzICYgKE1FU0hfUEFUSF9ERUxFVEVEIHwgTUVTSF9QQVRIX0ZJWEVEKSkgewogCQlzcGluX3VubG9ja19iaCgmbXBhdGgtPnN0YXRlX2xvY2spOwogCQlnb3RvIGVuZGRpc2NvdmVyeTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaF9wYXRodGJsLmMgYi9uZXQvbWFjODAyMTEvbWVzaF9wYXRodGJsLmMKaW5kZXggNmRiMmRkZi4uZjBlNjE3NSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21lc2hfcGF0aHRibC5jCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoX3BhdGh0YmwuYwpAQCAtODI2LDcgKzgyNiw3IEBACiAJbXBhdGgtPm1ldHJpYyA9IDA7CiAJbXBhdGgtPmhvcF9jb3VudCA9IDA7CiAJbXBhdGgtPmV4cF90aW1lID0gMDsKLQltcGF0aC0+ZmxhZ3MgfD0gTUVTSF9QQVRIX0ZJWEVEOworCW1wYXRoLT5mbGFncyA9IE1FU0hfUEFUSF9GSVhFRCB8IE1FU0hfUEFUSF9TTl9WQUxJRDsKIAltZXNoX3BhdGhfYWN0aXZhdGUobXBhdGgpOwogCXNwaW5fdW5sb2NrX2JoKCZtcGF0aC0+c3RhdGVfbG9jayk7CiAJbWVzaF9wYXRoX3R4X3BlbmRpbmcobXBhdGgpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21lc2hfc3luYy5jIGIvbmV0L21hYzgwMjExL21lc2hfc3luYy5jCmluZGV4IDY0YmMyMmEuLmZhY2EyMmMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tZXNoX3N5bmMuYworKysgYi9uZXQvbWFjODAyMTEvbWVzaF9zeW5jLmMKQEAgLTI4LDcgKzI4LDcgQEAKICAqIGNvdWxkIGJlLCBmb3IgaW5zdGFuY2UsIGluIGNhc2UgYSBuZWlnaGJvciBpcyByZXN0YXJ0ZWQgYW5kIGl0cyBUU0YgY291bnRlcgogICogcmVzZXQuCiAgKi8KLSNkZWZpbmUgVE9GRlNFVF9NQVhJTVVNX0FESlVTVE1FTlQgMzAwMDAJCS8qIDMwIG1zICovCisjZGVmaW5lIFRPRkZTRVRfTUFYSU1VTV9BREpVU1RNRU5UIDgwMAkJLyogMC44IG1zICovCiAKIHN0cnVjdCBzeW5jX21ldGhvZCB7CiAJdTggbWV0aG9kOwpAQCAtNzAsOSArNzAsMTMgQEAKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJmlmbXNoLT5zeW5jX29mZnNldF9sb2NrKTsKIAotCXRzZiA9IGRydl9nZXRfdHNmKGxvY2FsLCBzZGF0YSk7Ci0JaWYgKHRzZiAhPSAtMVVMTCkKLQkJZHJ2X3NldF90c2YobG9jYWwsIHNkYXRhLCB0c2YgKyB0c2ZkZWx0YSk7CisJaWYgKGxvY2FsLT5vcHMtPm9mZnNldF90c2YpIHsKKwkJZHJ2X29mZnNldF90c2YobG9jYWwsIHNkYXRhLCB0c2ZkZWx0YSk7CisJfSBlbHNlIHsKKwkJdHNmID0gZHJ2X2dldF90c2YobG9jYWwsIHNkYXRhKTsKKwkJaWYgKHRzZiAhPSAtMVVMTCkKKwkJCWRydl9zZXRfdHNmKGxvY2FsLCBzZGF0YSwgdHNmICsgdHNmZGVsdGEpOworCX0KIH0KIAogc3RhdGljIHZvaWQgbWVzaF9zeW5jX29mZnNldF9yeF9iY25fcHJlc3Aoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWxtZS5jIGIvbmV0L21hYzgwMjExL21sbWUuYwppbmRleCA4ZDQyNmY2Li43NDg2ZjJkIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWxtZS5jCisrKyBiL25ldC9tYWM4MDIxMS9tbG1lLmMKQEAgLTE2NzIsMTEgKzE2NzIsMTUgQEAKIAkJCSAgICAgbm9uX2FjbV9hYysrKQogCQkJCWlmICghKHNkYXRhLT53bW1fYWNtICYgQklUKDcgLSAyICogbm9uX2FjbV9hYykpKQogCQkJCQlicmVhazsKLQkJCS8qIFRoZSBsb29wIHdpbGwgcmVzdWx0IGluIHVzaW5nIEJLIGV2ZW4gaWYgaXQgcmVxdWlyZXMKLQkJCSAqIGFkbWlzc2lvbiBjb250cm9sLCBzdWNoIGNvbmZpZ3VyYXRpb24gbWFrZXMgbm8gc2Vuc2UKLQkJCSAqIGFuZCB3ZSBoYXZlIHRvIHRyYW5zbWl0IHNvbWVob3cgLSB0aGUgQUMgc2VsZWN0aW9uCi0JCQkgKiBkb2VzIHRoZSBzYW1lIHRoaW5nLgorCQkJLyogVXN1YWxseSB0aGUgbG9vcCB3aWxsIHJlc3VsdCBpbiB1c2luZyBCSyBldmVuIGlmIGl0CisJCQkgKiByZXF1aXJlcyBhZG1pc3Npb24gY29udHJvbCwgYnV0IHN1Y2ggYSBjb25maWd1cmF0aW9uCisJCQkgKiBtYWtlcyBubyBzZW5zZSBhbmQgd2UgaGF2ZSB0byB0cmFuc21pdCBzb21laG93IC0gdGhlCisJCQkgKiBBQyBzZWxlY3Rpb24gZG9lcyB0aGUgc2FtZSB0aGluZy4KKwkJCSAqIElmIHdlIHN0YXJ0ZWQgb3V0IHRyeWluZyB0byBkb3duZ3JhZGUgZnJvbSBCSywgdGhlbgorCQkJICogdGhlIGV4dHJhIGNvbmRpdGlvbiBoZXJlIG1pZ2h0IGJlIG5lZWRlZC4KIAkJCSAqLworCQkJaWYgKG5vbl9hY21fYWMgPj0gSUVFRTgwMjExX05VTV9BQ1MpCisJCQkJbm9uX2FjbV9hYyA9IElFRUU4MDIxMV9BQ19CSzsKIAkJCWlmIChkcnZfY29uZl90eChsb2NhbCwgc2RhdGEsIGFjLAogCQkJCQkmc2RhdGEtPnR4X2NvbmZbbm9uX2FjbV9hY10pKQogCQkJCXNkYXRhX2VycihzZGF0YSwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9vZmZjaGFubmVsLmMgYi9uZXQvbWFjODAyMTEvb2ZmY2hhbm5lbC5jCmluZGV4IDU1YTljNWIuLmMzZjYxMGIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9vZmZjaGFubmVsLmMKKysrIGIvbmV0L21hYzgwMjExL29mZmNoYW5uZWwuYwpAQCAtMTI4LDcgKzEyOCw4IEBACiAJCWlmICghaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQogCQkJY29udGludWU7CiAKLQkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFKQorCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UgfHwKKwkJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU4pCiAJCQljb250aW51ZTsKIAogCQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX01PTklUT1IpCkBAIC04MzgsNiArODM5LDcgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CiAJCW5lZWRfb2ZmY2hhbiA9IHRydWU7CiAJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcG0uYyBiL25ldC9tYWM4MDIxMS9wbS5jCmluZGV4IDAwYTQzYTcuLjI4YTNhMDkgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9wbS5jCisrKyBiL25ldC9tYWM4MDIxMS9wbS5jCkBAIC0xNzgsOCArMTc4LDcgQEAKIAlXQVJOX09OKCFsaXN0X2VtcHR5KCZsb2NhbC0+Y2hhbmN0eF9saXN0KSk7CiAKIAkvKiBzdG9wIGhhcmR3YXJlIC0gdGhpcyBtdXN0IHN0b3AgUlggKi8KLQlpZiAobG9jYWwtPm9wZW5fY291bnQpCi0JCWllZWU4MDIxMV9zdG9wX2RldmljZShsb2NhbCk7CisJaWVlZTgwMjExX3N0b3BfZGV2aWNlKGxvY2FsKTsKIAogIHN1c3BlbmQ6CiAJbG9jYWwtPnN1c3BlbmRlZCA9IHRydWU7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcnguYyBiL25ldC9tYWM4MDIxMS9yeC5jCmluZGV4IDJlOGE5MDIuLjYxNzVkYjMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9yeC5jCisrKyBiL25ldC9tYWM4MDIxMS9yeC5jCkBAIC0xODAsNiArMTgwLDExIEBACiAJCWxlbiArPSAxMjsKIAl9CiAKKwlpZiAobG9jYWwtPmh3LnJhZGlvdGFwX3RpbWVzdGFtcC51bml0c19wb3MgPj0gMCkgeworCQlsZW4gPSBBTElHTihsZW4sIDgpOworCQlsZW4gKz0gMTI7CisJfQorCiAJaWYgKHN0YXR1cy0+Y2hhaW5zKSB7CiAJCS8qIGFudGVubmEgYW5kIGFudGVubmEgc2lnbmFsIGZpZWxkcyAqLwogCQlsZW4gKz0gMiAqIGh3ZWlnaHQ4KHN0YXR1cy0+Y2hhaW5zKTsKQEAgLTQ0Nyw2ICs0NTIsMzEgQEAKIAkJcG9zICs9IDI7CiAJfQogCisJaWYgKGxvY2FsLT5ody5yYWRpb3RhcF90aW1lc3RhbXAudW5pdHNfcG9zID49IDApIHsKKwkJdTE2IGFjY3VyYWN5ID0gMDsKKwkJdTggZmxhZ3MgPSBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QX0ZMQUdfMzJCSVQ7CisKKwkJcnRoZHItPml0X3ByZXNlbnQgfD0KKwkJCWNwdV90b19sZTMyKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1RJTUVTVEFNUCk7CisKKwkJLyogZW5zdXJlIDggYnl0ZSBhbGlnbm1lbnQgKi8KKwkJd2hpbGUgKChwb3MgLSAodTggKilydGhkcikgJiA3KQorCQkJcG9zKys7CisKKwkJcHV0X3VuYWxpZ25lZF9sZTY0KHN0YXR1cy0+ZGV2aWNlX3RpbWVzdGFtcCwgcG9zKTsKKwkJcG9zICs9IHNpemVvZih1NjQpOworCisJCWlmIChsb2NhbC0+aHcucmFkaW90YXBfdGltZXN0YW1wLmFjY3VyYWN5ID49IDApIHsKKwkJCWFjY3VyYWN5ID0gbG9jYWwtPmh3LnJhZGlvdGFwX3RpbWVzdGFtcC5hY2N1cmFjeTsKKwkJCWZsYWdzIHw9IElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfRkxBR19BQ0NVUkFDWTsKKwkJfQorCQlwdXRfdW5hbGlnbmVkX2xlMTYoYWNjdXJhY3ksIHBvcyk7CisJCXBvcyArPSBzaXplb2YodTE2KTsKKworCQkqcG9zKysgPSBsb2NhbC0+aHcucmFkaW90YXBfdGltZXN0YW1wLnVuaXRzX3BvczsKKwkJKnBvcysrID0gZmxhZ3M7CisJfQorCiAJZm9yX2VhY2hfc2V0X2JpdChjaGFpbiwgJmNoYWlucywgSUVFRTgwMjExX01BWF9DSEFJTlMpIHsKIAkJKnBvcysrID0gc3RhdHVzLT5jaGFpbl9zaWduYWxbY2hhaW5dOwogCQkqcG9zKysgPSBjaGFpbjsKQEAgLTQ4NSw2ICs1MTUsOSBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpwcmV2X2RldiA9IE5VTEw7CiAJaW50IHByZXNlbnRfZmNzX2xlbiA9IDA7CiAJdW5zaWduZWQgaW50IHJ0YXBfdmVuZG9yX3NwYWNlID0gMDsKKwlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqbW9uaXRvcl9zZGF0YSA9CisJCXJjdV9kZXJlZmVyZW5jZShsb2NhbC0+bW9uaXRvcl9zZGF0YSk7CiAKIAlpZiAodW5saWtlbHkoc3RhdHVzLT5mbGFnICYgUlhfRkxBR19SQURJT1RBUF9WRU5ET1JfREFUQSkpIHsKIAkJc3RydWN0IGllZWU4MDIxMV92ZW5kb3JfcmFkaW90YXAgKnJ0YXAgPSAodm9pZCAqKW9yaWdza2ItPmRhdGE7CkBAIC01NjcsNyArNjAwLDcgQEAKIAkJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKQogCQkJY29udGludWU7CiAKLQkJaWYgKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQ09PS19GUkFNRVMpCisJCWlmIChzZGF0YS0+dS5tbnRyLmZsYWdzICYgTU9OSVRPUl9GTEFHX0NPT0tfRlJBTUVTKQogCQkJY29udGludWU7CiAKIAkJaWYgKCFpZWVlODAyMTFfc2RhdGFfcnVubmluZyhzZGF0YSkpCkBAIC01ODUsNiArNjE4LDIzIEBACiAJCWllZWU4MDIxMV9yeF9zdGF0cyhzZGF0YS0+ZGV2LCBza2ItPmxlbik7CiAJfQogCisJbWdtdCA9ICh2b2lkICopc2tiLT5kYXRhOworCWlmIChtb25pdG9yX3NkYXRhICYmCisJICAgIHNrYi0+bGVuID49IElFRUU4MDIxMV9NSU5fQUNUSU9OX1NJWkUgKyAxICsgVkhUX01VTUlNT19HUk9VUFNfREFUQV9MRU4gJiYKKwkgICAgaWVlZTgwMjExX2lzX2FjdGlvbihtZ210LT5mcmFtZV9jb250cm9sKSAmJgorCSAgICBtZ210LT51LmFjdGlvbi5jYXRlZ29yeSA9PSBXTEFOX0NBVEVHT1JZX1ZIVCAmJgorCSAgICBtZ210LT51LmFjdGlvbi51LnZodF9ncm91cF9ub3RpZi5hY3Rpb25fY29kZSA9PSBXTEFOX1ZIVF9BQ1RJT05fR1JPVVBJRF9NR01UICYmCisJICAgIGlzX3ZhbGlkX2V0aGVyX2FkZHIobW9uaXRvcl9zZGF0YS0+dS5tbnRyLm11X2ZvbGxvd19hZGRyKSAmJgorCSAgICBldGhlcl9hZGRyX2VxdWFsKG1nbXQtPmRhLCBtb25pdG9yX3NkYXRhLT51Lm1udHIubXVfZm9sbG93X2FkZHIpKSB7CisJCXN0cnVjdCBza19idWZmICptdV9za2IgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOworCisJCWlmIChtdV9za2IpIHsKKwkJCW11X3NrYi0+cGt0X3R5cGUgPSBJRUVFODAyMTFfU0RBVEFfUVVFVUVfVFlQRV9GUkFNRTsKKwkJCXNrYl9xdWV1ZV90YWlsKCZtb25pdG9yX3NkYXRhLT5za2JfcXVldWUsIG11X3NrYik7CisJCQlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LCAmbW9uaXRvcl9zZGF0YS0+d29yayk7CisJCX0KKwl9CisKIAlpZiAocHJldl9kZXYpIHsKIAkJc2tiLT5kZXYgPSBwcmV2X2RldjsKIAkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKQEAgLTEwNzIsOCArMTEyMiwxNSBAQAogCXRpZCA9ICppZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKSAmIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLOwogCiAJdGlkX2FnZ19yeCA9IHJjdV9kZXJlZmVyZW5jZShzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0pOwotCWlmICghdGlkX2FnZ19yeCkKKwlpZiAoIXRpZF9hZ2dfcngpIHsKKwkJaWYgKGFja19wb2xpY3kgPT0gSUVFRTgwMjExX1FPU19DVExfQUNLX1BPTElDWV9CTE9DS0FDSyAmJgorCQkgICAgIXRlc3RfYml0KHRpZCwgcngtPnN0YS0+YW1wZHVfbWxtZS5hZ2dfc2Vzc2lvbl92YWxpZCkgJiYKKwkJICAgICF0ZXN0X2FuZF9zZXRfYml0KHRpZCwgcngtPnN0YS0+YW1wZHVfbWxtZS51bmV4cGVjdGVkX2FnZykpCisJCQlpZWVlODAyMTFfc2VuZF9kZWxiYShyeC0+c2RhdGEsIHJ4LT5zdGEtPnN0YS5hZGRyLCB0aWQsCisJCQkJCSAgICAgV0xBTl9CQUNLX1JFQ0lQSUVOVCwKKwkJCQkJICAgICBXTEFOX1JFQVNPTl9RU1RBX1JFUVVJUkVfU0VUVVApOwogCQlnb3RvIGRvbnRfcmVvcmRlcjsKKwl9CiAKIAkvKiBxb3MgbnVsbCBkYXRhIGZyYW1lcyBhcmUgZXhjbHVkZWQgKi8KIAlpZiAodW5saWtlbHkoaGRyLT5mcmFtZV9jb250cm9sICYgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX05VTExGVU5DKSkpCkBAIC0xMjY2LDkgKzEzMjMsNyBAQAogCQlyZXR1cm47CiAKIAlmb3IgKHRpZCA9IDA7IHRpZCA8IEFSUkFZX1NJWkUoc3RhLT5zdGEudHhxKTsgdGlkKyspIHsKLQkJc3RydWN0IHR4cV9pbmZvICp0eHFpID0gdG9fdHhxX2luZm8oc3RhLT5zdGEudHhxW3RpZF0pOwotCi0JCWlmICghdHhxaS0+dGluLmJhY2tsb2dfcGFja2V0cykKKwkJaWYgKHR4cV9oYXNfcXVldWUoc3RhLT5zdGEudHhxW3RpZF0pKQogCQkJc2V0X2JpdCh0aWQsICZzdGEtPnR4cV9idWZmZXJlZF90aWRzKTsKIAkJZWxzZQogCQkJY2xlYXJfYml0KHRpZCwgJnN0YS0+dHhxX2J1ZmZlcmVkX3RpZHMpOwpAQCAtMjUzNSw2ICsyNTkwLDEyIEBACiAKIAkJdGlkID0gbGUxNl90b19jcHUoYmFyX2RhdGEuY29udHJvbCkgPj4gMTI7CiAKKwkJaWYgKCF0ZXN0X2JpdCh0aWQsIHJ4LT5zdGEtPmFtcGR1X21sbWUuYWdnX3Nlc3Npb25fdmFsaWQpICYmCisJCSAgICAhdGVzdF9hbmRfc2V0X2JpdCh0aWQsIHJ4LT5zdGEtPmFtcGR1X21sbWUudW5leHBlY3RlZF9hZ2cpKQorCQkJaWVlZTgwMjExX3NlbmRfZGVsYmEocngtPnNkYXRhLCByeC0+c3RhLT5zdGEuYWRkciwgdGlkLAorCQkJCQkgICAgIFdMQU5fQkFDS19SRUNJUElFTlQsCisJCQkJCSAgICAgV0xBTl9SRUFTT05fUVNUQV9SRVFVSVJFX1NFVFVQKTsKKwogCQl0aWRfYWdnX3J4ID0gcmN1X2RlcmVmZXJlbmNlKHJ4LT5zdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0pOwogCQlpZiAoIXRpZF9hZ2dfcngpCiAJCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOwpAQCAtMzE0Nyw3ICszMjA4LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiB8fAotCQkgICAgIShzZGF0YS0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX0NPT0tfRlJBTUVTKSkKKwkJICAgICEoc2RhdGEtPnUubW50ci5mbGFncyAmIE1PTklUT1JfRkxBR19DT09LX0ZSQU1FUykpCiAJCQljb250aW51ZTsKIAogCQlpZiAocHJldl9kZXYpIHsKQEAgLTM1MjMsNiArMzU4NCw5IEBACiAJCSAgICAgICBpZWVlODAyMTFfaXNfcHJvYmVfcmVxKGhkci0+ZnJhbWVfY29udHJvbCkgfHwKIAkJICAgICAgIGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGhkci0+ZnJhbWVfY29udHJvbCkgfHwKIAkJICAgICAgIGllZWU4MDIxMV9pc19iZWFjb24oaGRyLT5mcmFtZV9jb250cm9sKTsKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKKwkJLyogQ3VycmVudGx5IG5vIGZyYW1lcyBvbiBOQU4gaW50ZXJmYWNlIGFyZSBhbGxvd2VkICovCisJCXJldHVybiBmYWxzZTsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC0zOTQwLDcgKzQwMDQsNyBAQAogCV9fbGUxNiBmYzsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J4X2RhdGEgcng7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqcHJldjsKLQlzdHJ1Y3Qgcmhhc2hfaGVhZCAqdG1wOworCXN0cnVjdCByaGxpc3RfaGVhZCAqdG1wOwogCWludCBlcnIgPSAwOwogCiAJZmMgPSAoKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhKS0+ZnJhbWVfY29udHJvbDsKQEAgLTM5ODMsMTMgKzQwNDcsMTAgQEAKIAkJZ290byBvdXQ7CiAJfSBlbHNlIGlmIChpZWVlODAyMTFfaXNfZGF0YShmYykpIHsKIAkJc3RydWN0IHN0YV9pbmZvICpzdGEsICpwcmV2X3N0YTsKLQkJY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOwogCiAJCXByZXZfc3RhID0gTlVMTDsKIAotCQl0YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KGxvY2FsLT5zdGFfaGFzaC50YmwsICZsb2NhbC0+c3RhX2hhc2gpOwotCi0JCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCB0YmwsIGhkci0+YWRkcjIsIHN0YSwgdG1wKSB7CisJCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCBoZHItPmFkZHIyLCBzdGEsIHRtcCkgewogCQkJaWYgKCFwcmV2X3N0YSkgewogCQkJCXByZXZfc3RhID0gc3RhOwogCQkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3NjYW4uYyBiL25ldC9tYWM4MDIxMS9zY2FuLmMKaW5kZXggMDcwYjQwZi4uMjNkOGFjOCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3NjYW4uYworKysgYi9uZXQvbWFjODAyMTEvc2Nhbi5jCkBAIC00MjAsNyArNDIwLDcgQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGh3X3RvX2xvY2FsKGh3KTsKIAotCXRyYWNlX2FwaV9zY2FuX2NvbXBsZXRlZChsb2NhbCwgaW5mbyk7CisJdHJhY2VfYXBpX3NjYW5fY29tcGxldGVkKGxvY2FsLCBpbmZvLT5hYm9ydGVkKTsKIAogCXNldF9iaXQoU0NBTl9DT01QTEVURUQsICZsb2NhbC0+c2Nhbm5pbmcpOwogCWlmIChpbmZvLT5hYm9ydGVkKQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3N0YV9pbmZvLmMgYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uYwppbmRleCA3NmI3MzdkLi43OGU5ZWNiIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uYworKysgYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uYwpAQCAtNjcsMTIgKzY3LDEwIEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgc3RhX3JodF9wYXJhbXMgPSB7CiAJLm5lbGVtX2hpbnQgPSAzLCAvKiBzdGFydCBzbWFsbCAqLwotCS5pbnNlY3VyZV9lbGFzdGljaXR5ID0gdHJ1ZSwgLyogRGlzYWJsZSBjaGFpbi1sZW5ndGggY2hlY2tzLiAqLwogCS5hdXRvbWF0aWNfc2hyaW5raW5nID0gdHJ1ZSwKIAkuaGVhZF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc3RhX2luZm8sIGhhc2hfbm9kZSksCiAJLmtleV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc3RhX2luZm8sIGFkZHIpLAogCS5rZXlfbGVuID0gRVRIX0FMRU4sCi0JLmhhc2hmbiA9IHN0YV9hZGRyX2hhc2gsCiAJLm1heF9zaXplID0gQ09ORklHX01BQzgwMjExX1NUQV9IQVNIX01BWF9TSVpFLAogfTsKIApAQCAtODAsOCArNzgsOCBAQAogc3RhdGljIGludCBzdGFfaW5mb19oYXNoX2RlbChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJCSAgICAgc3RydWN0IHN0YV9pbmZvICpzdGEpCiB7Ci0JcmV0dXJuIHJoYXNodGFibGVfcmVtb3ZlX2Zhc3QoJmxvY2FsLT5zdGFfaGFzaCwgJnN0YS0+aGFzaF9ub2RlLAotCQkJCSAgICAgIHN0YV9yaHRfcGFyYW1zKTsKKwlyZXR1cm4gcmhsdGFibGVfcmVtb3ZlKCZsb2NhbC0+c3RhX2hhc2gsICZzdGEtPmhhc2hfbm9kZSwKKwkJCSAgICAgICBzdGFfcmh0X3BhcmFtcyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fY2xlYW51cF9zaW5nbGVfc3RhKHN0cnVjdCBzdGFfaW5mbyAqc3RhKQpAQCAtMTU3LDE5ICsxNTUsMjIgQEAKIAlzdGFfaW5mb19mcmVlKGxvY2FsLCBzdGEpOwogfQogCitzdHJ1Y3QgcmhsaXN0X2hlYWQgKnN0YV9pbmZvX2hhc2hfbG9va3VwKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCQkgY29uc3QgdTggKmFkZHIpCit7CisJcmV0dXJuIHJobHRhYmxlX2xvb2t1cCgmbG9jYWwtPnN0YV9oYXNoLCBhZGRyLCBzdGFfcmh0X3BhcmFtcyk7Cit9CisKIC8qIHByb3RlY3RlZCBieSBSQ1UgKi8KIHN0cnVjdCBzdGFfaW5mbyAqc3RhX2luZm9fZ2V0KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJICAgICAgY29uc3QgdTggKmFkZHIpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IHJobGlzdF9oZWFkICp0bXA7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0Jc3RydWN0IHJoYXNoX2hlYWQgKnRtcDsKLQljb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0Ymw7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShsb2NhbC0+c3RhX2hhc2gudGJsLCAmbG9jYWwtPnN0YV9oYXNoKTsKLQotCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCB0YmwsIGFkZHIsIHN0YSwgdG1wKSB7CisJZm9yX2VhY2hfc3RhX2luZm8obG9jYWwsIGFkZHIsIHN0YSwgdG1wKSB7CiAJCWlmIChzdGEtPnNkYXRhID09IHNkYXRhKSB7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCS8qIHRoaXMgaXMgc2FmZSBhcyB0aGUgY2FsbGVyIG11c3QgYWxyZWFkeSBob2xkCkBAIC0xOTAsMTQgKzE5MSwxMSBAQAogCQkJCSAgY29uc3QgdTggKmFkZHIpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IHJobGlzdF9oZWFkICp0bXA7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0Jc3RydWN0IHJoYXNoX2hlYWQgKnRtcDsKLQljb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0Ymw7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShsb2NhbC0+c3RhX2hhc2gudGJsLCAmbG9jYWwtPnN0YV9oYXNoKTsKLQotCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCB0YmwsIGFkZHIsIHN0YSwgdG1wKSB7CisJZm9yX2VhY2hfc3RhX2luZm8obG9jYWwsIGFkZHIsIHN0YSwgdG1wKSB7CiAJCWlmIChzdGEtPnNkYXRhID09IHNkYXRhIHx8CiAJCSAgICAoc3RhLT5zZGF0YS0+YnNzICYmIHN0YS0+c2RhdGEtPmJzcyA9PSBzZGF0YS0+YnNzKSkgewogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0yNjMsOCArMjYxLDggQEAKIHN0YXRpYyBpbnQgc3RhX2luZm9faGFzaF9hZGQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCQkgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhKQogewotCXJldHVybiByaGFzaHRhYmxlX2luc2VydF9mYXN0KCZsb2NhbC0+c3RhX2hhc2gsICZzdGEtPmhhc2hfbm9kZSwKLQkJCQkgICAgICBzdGFfcmh0X3BhcmFtcyk7CisJcmV0dXJuIHJobHRhYmxlX2luc2VydCgmbG9jYWwtPnN0YV9oYXNoLCAmc3RhLT5oYXNoX25vZGUsCisJCQkgICAgICAgc3RhX3JodF9wYXJhbXMpOwogfQogCiBzdGF0aWMgdm9pZCBzdGFfZGVsaXZlcl9wc19mcmFtZXMoc3RydWN0IHdvcmtfc3RydWN0ICp3aykKQEAgLTM0MCw2ICszMzgsOSBAQAogCiAJbWVtY3B5KHN0YS0+YWRkciwgYWRkciwgRVRIX0FMRU4pOwogCW1lbWNweShzdGEtPnN0YS5hZGRyLCBhZGRyLCBFVEhfQUxFTik7CisJc3RhLT5zdGEubWF4X3J4X2FnZ3JlZ2F0aW9uX3N1YmZyYW1lcyA9CisJCWxvY2FsLT5ody5tYXhfcnhfYWdncmVnYXRpb25fc3ViZnJhbWVzOworCiAJc3RhLT5sb2NhbCA9IGxvY2FsOwogCXN0YS0+c2RhdGEgPSBzZGF0YTsKIAlzdGEtPnJ4X3N0YXRzLmxhc3RfcnggPSBqaWZmaWVzOwpAQCAtNDUwLDkgKzQ1MSw5IEBACiAJCSAgICBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihzdGEtPnN0YS5hZGRyKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogU3RyaWN0bHkgc3BlYWtpbmcgdGhpcyBpc24ndCBuZWNlc3NhcnkgYXMgd2UgaG9sZCB0aGUgbXV0ZXgsIGJ1dAotCSAqIHRoZSByaGFzaHRhYmxlIGNvZGUgY2FuJ3QgcmVhbGx5IGRlYWwgd2l0aCB0aGF0IGRpc3RpbmN0aW9uLiBXZQotCSAqIGRvIHJlcXVpcmUgdGhlIG11dGV4IGZvciBjb3JyZWN0bmVzcyB0aG91Z2guCisJLyogVGhlIFJDVSByZWFkIGxvY2sgaXMgcmVxdWlyZWQgYnkgcmhhc2h0YWJsZSBkdWUgdG8KKwkgKiBhc3luY2hyb25vdXMgcmVzaXplL3JlaGFzaC4gIFdlIGFsc28gcmVxdWlyZSB0aGUgbXV0ZXgKKwkgKiBmb3IgY29ycmVjdG5lc3MuCiAJICovCiAJcmN1X3JlYWRfbG9jaygpOwogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnNkYXRhLT5sb2NhbC0+c3RhX210eCk7CkBAIC02ODcsNyArNjg4LDcgQEAKIAl9CiAKIAkvKiBObyBuZWVkIHRvIGRvIGFueXRoaW5nIGlmIHRoZSBkcml2ZXIgZG9lcyBhbGwgKi8KLQlpZiAoaWVlZTgwMjExX2h3X2NoZWNrKCZsb2NhbC0+aHcsIEFQX0xJTktfUFMpKQorCWlmICghbG9jYWwtPm9wcy0+c2V0X3RpbSkKIAkJcmV0dXJuOwogCiAJaWYgKHN0YS0+ZGVhZCkKQEAgLTEwNDAsMTYgKzEwNDEsMTEgQEAKIAkJICByb3VuZF9qaWZmaWVzKGppZmZpZXMgKyBTVEFfSU5GT19DTEVBTlVQX0lOVEVSVkFMKSk7CiB9CiAKLXUzMiBzdGFfYWRkcl9oYXNoKGNvbnN0IHZvaWQgKmtleSwgdTMyIGxlbmd0aCwgdTMyIHNlZWQpCi17Ci0JcmV0dXJuIGpoYXNoKGtleSwgRVRIX0FMRU4sIHNlZWQpOwotfQotCiBpbnQgc3RhX2luZm9faW5pdChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gcmhhc2h0YWJsZV9pbml0KCZsb2NhbC0+c3RhX2hhc2gsICZzdGFfcmh0X3BhcmFtcyk7CisJZXJyID0gcmhsdGFibGVfaW5pdCgmbG9jYWwtPnN0YV9oYXNoLCAmc3RhX3JodF9wYXJhbXMpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTEwNjUsNyArMTA2MSw3IEBACiB2b2lkIHN0YV9pbmZvX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCiB7CiAJZGVsX3RpbWVyX3N5bmMoJmxvY2FsLT5zdGFfY2xlYW51cCk7Ci0Jcmhhc2h0YWJsZV9kZXN0cm95KCZsb2NhbC0+c3RhX2hhc2gpOworCXJobHRhYmxlX2Rlc3Ryb3koJmxvY2FsLT5zdGFfaGFzaCk7CiB9CiAKIApAQCAtMTEzNSwxNyArMTEzMSwxNCBAQAogCQkJCQkJICAgY29uc3QgdTggKmxvY2FsYWRkcikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGh3X3RvX2xvY2FsKGh3KTsKKwlzdHJ1Y3QgcmhsaXN0X2hlYWQgKnRtcDsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKLQlzdHJ1Y3Qgcmhhc2hfaGVhZCAqdG1wOwotCWNvbnN0IHN0cnVjdCBidWNrZXRfdGFibGUgKnRibDsKLQotCXRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UobG9jYWwtPnN0YV9oYXNoLnRibCwgJmxvY2FsLT5zdGFfaGFzaCk7CiAKIAkvKgogCSAqIEp1c3QgcmV0dXJuIGEgcmFuZG9tIHN0YXRpb24gaWYgbG9jYWxhZGRyIGlzIE5VTEwKIAkgKiAuLi4gZmlyc3QgaW4gbGlzdC4KIAkgKi8KLQlmb3JfZWFjaF9zdGFfaW5mbyhsb2NhbCwgdGJsLCBhZGRyLCBzdGEsIHRtcCkgeworCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCBhZGRyLCBzdGEsIHRtcCkgewogCQlpZiAobG9jYWxhZGRyICYmCiAJCSAgICAhZXRoZXJfYWRkcl9lcXVhbChzdGEtPnNkYXRhLT52aWYuYWRkciwgbG9jYWxhZGRyKSkKIAkJCWNvbnRpbnVlOwpAQCAtMTIwOSwxMiArMTIwMiwxMCBAQAogCiAJaWYgKHN0YS0+c3RhLnR4cVswXSkgewogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGEtPnN0YS50eHEpOyBpKyspIHsKLQkJCXN0cnVjdCB0eHFfaW5mbyAqdHhxaSA9IHRvX3R4cV9pbmZvKHN0YS0+c3RhLnR4cVtpXSk7Ci0KLQkJCWlmICghdHhxaS0+dGluLmJhY2tsb2dfcGFja2V0cykKKwkJCWlmICghdHhxX2hhc19xdWV1ZShzdGEtPnN0YS50eHFbaV0pKQogCQkJCWNvbnRpbnVlOwogCi0JCQlkcnZfd2FrZV90eF9xdWV1ZShsb2NhbCwgdHhxaSk7CisJCQlkcnZfd2FrZV90eF9xdWV1ZShsb2NhbCwgdG9fdHhxX2luZm8oc3RhLT5zdGEudHhxW2ldKSk7CiAJCX0KIAl9CiAKQEAgLTE2MTYsNyArMTYwNyw2IEBACiAKIAkJc3RhX2luZm9fcmVjYWxjX3RpbShzdGEpOwogCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGxvbmcgdGlkcyA9IHN0YS0+dHhxX2J1ZmZlcmVkX3RpZHMgJiBkcml2ZXJfcmVsZWFzZV90aWRzOwogCQlpbnQgdGlkOwogCiAJCS8qCkBAIC0xNjQ2LDkgKzE2MzYsOCBAQAogCQkJcmV0dXJuOwogCiAJCWZvciAodGlkID0gMDsgdGlkIDwgQVJSQVlfU0laRShzdGEtPnN0YS50eHEpOyB0aWQrKykgewotCQkJc3RydWN0IHR4cV9pbmZvICp0eHFpID0gdG9fdHhxX2luZm8oc3RhLT5zdGEudHhxW3RpZF0pOwotCi0JCQlpZiAoISh0aWRzICYgQklUKHRpZCkpIHx8IHR4cWktPnRpbi5iYWNrbG9nX3BhY2tldHMpCisJCQlpZiAoIShkcml2ZXJfcmVsZWFzZV90aWRzICYgQklUKHRpZCkpIHx8CisJCQkgICAgdHhxX2hhc19xdWV1ZShzdGEtPnN0YS50eHFbdGlkXSkpCiAJCQkJY29udGludWU7CiAKIAkJCXN0YV9pbmZvX3JlY2FsY190aW0oc3RhKTsKQEAgLTIyNzksMTEgKzIyNjgsNyBAQAogCWlmICh0ZXN0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfVERMU19QRUVSKSkKIAkJc2luZm8tPnN0YV9mbGFncy5zZXQgfD0gQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKTsKIAotCS8qIGNoZWNrIGlmIHRoZSBkcml2ZXIgaGFzIGEgU1cgUkMgaW1wbGVtZW50YXRpb24gKi8KLQlpZiAocmVmICYmIHJlZi0+b3BzLT5nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dCkKLQkJdGhyID0gcmVmLT5vcHMtPmdldF9leHBlY3RlZF90aHJvdWdocHV0KHN0YS0+cmF0ZV9jdHJsX3ByaXYpOwotCWVsc2UKLQkJdGhyID0gZHJ2X2dldF9leHBlY3RlZF90aHJvdWdocHV0KGxvY2FsLCAmc3RhLT5zdGEpOworCXRociA9IHN0YV9nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dChzdGEpOwogCiAJaWYgKHRociAhPSAwKSB7CiAJCXNpbmZvLT5maWxsZWQgfD0gQklUKE5MODAyMTFfU1RBX0lORk9fRVhQRUNURURfVEhST1VHSFBVVCk7CkBAIC0yMjkxLDYgKzIyNzYsMjUgQEAKIAl9CiB9CiAKK3UzMiBzdGFfZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQoc3RydWN0IHN0YV9pbmZvICpzdGEpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBzdGEtPnNkYXRhOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCByYXRlX2NvbnRyb2xfcmVmICpyZWYgPSBOVUxMOworCXUzMiB0aHIgPSAwOworCisJaWYgKHRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9SQVRFX0NPTlRST0wpKQorCQlyZWYgPSBsb2NhbC0+cmF0ZV9jdHJsOworCisJLyogY2hlY2sgaWYgdGhlIGRyaXZlciBoYXMgYSBTVyBSQyBpbXBsZW1lbnRhdGlvbiAqLworCWlmIChyZWYgJiYgcmVmLT5vcHMtPmdldF9leHBlY3RlZF90aHJvdWdocHV0KQorCQl0aHIgPSByZWYtPm9wcy0+Z2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQoc3RhLT5yYXRlX2N0cmxfcHJpdik7CisJZWxzZQorCQl0aHIgPSBkcnZfZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQobG9jYWwsIHN0YSk7CisKKwlyZXR1cm4gdGhyOworfQorCiB1bnNpZ25lZCBsb25nIGllZWU4MDIxMV9zdGFfbGFzdF9hY3RpdmUoc3RydWN0IHN0YV9pbmZvICpzdGEpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9zdGFfcnhfc3RhdHMgKnN0YXRzID0gc3RhX2dldF9sYXN0X3J4X3N0YXRzKHN0YSk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uaCBiL25ldC9tYWM4MDIxMS9zdGFfaW5mby5oCmluZGV4IDc4YjBlZjMuLmVkNWZjYjkgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9zdGFfaW5mby5oCisrKyBiL25ldC9tYWM4MDIxMS9zdGFfaW5mby5oCkBAIC0yMzAsNiArMjMwLDggQEAKICAqIEB0aWRfcnhfc3RvcF9yZXF1ZXN0ZWQ6ICBiaXRtYXAgaW5kaWNhdGluZyB3aGljaCBCQSBzZXNzaW9ucyBwZXIgVElEIHRoZQogICoJZHJpdmVyIHJlcXVlc3RlZCB0byBjbG9zZSB1bnRpbCB0aGUgd29yayBmb3IgaXQgcnVucwogICogQGFnZ19zZXNzaW9uX3ZhbGlkOiBiaXRtYXAgaW5kaWNhdGluZyB3aGljaCBUSUQgaGFzIGEgcnggQkEgc2Vzc2lvbiBvcGVuIG9uCisgKiBAdW5leHBlY3RlZF9hZ2c6IGJpdG1hcCBpbmRpY2F0aW5nIHdoaWNoIFRJRCBhbHJlYWR5IHNlbnQgYSBkZWxCQSBkdWUgdG8KKyAqCXVuZXhwZWN0ZWQgYWdncmVnYXRpb24gcmVsYXRlZCBmcmFtZXMgb3V0c2lkZSBhIHNlc3Npb24KICAqIEB3b3JrOiB3b3JrIHN0cnVjdCBmb3Igc3RhcnRpbmcvc3RvcHBpbmcgYWdncmVnYXRpb24KICAqIEB0aWRfdHg6IGFnZ3JlZ2F0aW9uIGluZm8gZm9yIFR4IHBlciBUSUQKICAqIEB0aWRfc3RhcnRfdHg6IHNlc3Npb25zIHdoZXJlIHN0YXJ0IHdhcyByZXF1ZXN0ZWQKQEAgLTI0NCw2ICsyNDYsNyBAQAogCXVuc2lnbmVkIGxvbmcgdGlkX3J4X3RpbWVyX2V4cGlyZWRbQklUU19UT19MT05HUyhJRUVFODAyMTFfTlVNX1RJRFMpXTsKIAl1bnNpZ25lZCBsb25nIHRpZF9yeF9zdG9wX3JlcXVlc3RlZFtCSVRTX1RPX0xPTkdTKElFRUU4MDIxMV9OVU1fVElEUyldOwogCXVuc2lnbmVkIGxvbmcgYWdnX3Nlc3Npb25fdmFsaWRbQklUU19UT19MT05HUyhJRUVFODAyMTFfTlVNX1RJRFMpXTsKKwl1bnNpZ25lZCBsb25nIHVuZXhwZWN0ZWRfYWdnW0JJVFNfVE9fTE9OR1MoSUVFRTgwMjExX05VTV9USURTKV07CiAJLyogdHggKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIAlzdHJ1Y3QgdGlkX2FtcGR1X3R4IF9fcmN1ICp0aWRfdHhbSUVFRTgwMjExX05VTV9USURTXTsKQEAgLTQ1Miw3ICs0NTUsNyBAQAogCS8qIEdlbmVyYWwgaW5mb3JtYXRpb24sIG1vc3RseSBzdGF0aWMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3QsIGZyZWVfbGlzdDsKIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1X2hlYWQ7Ci0Jc3RydWN0IHJoYXNoX2hlYWQgaGFzaF9ub2RlOworCXN0cnVjdCByaGxpc3RfaGVhZCBoYXNoX25vZGU7CiAJdTggYWRkcltFVEhfQUxFTl07CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CkBAIC02MzUsNiArNjM4LDkgQEAKICAqLwogI2RlZmluZSBTVEFfSU5GT19DTEVBTlVQX0lOVEVSVkFMICgxMCAqIEhaKQogCitzdHJ1Y3QgcmhsaXN0X2hlYWQgKnN0YV9pbmZvX2hhc2hfbG9va3VwKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCQkgY29uc3QgdTggKmFkZHIpOworCiAvKgogICogR2V0IGEgU1RBIGluZm8sIG11c3QgYmUgdW5kZXIgUkNVIHJlYWQgbG9jay4KICAqLwpAQCAtNjQ0LDE3ICs2NTAsOSBAQAogc3RydWN0IHN0YV9pbmZvICpzdGFfaW5mb19nZXRfYnNzKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJCSAgY29uc3QgdTggKmFkZHIpOwogCi11MzIgc3RhX2FkZHJfaGFzaChjb25zdCB2b2lkICprZXksIHUzMiBsZW5ndGgsIHUzMiBzZWVkKTsKLQotI2RlZmluZSBfc3RhX2J1Y2tldF9pZHgoX3RibCwgX2EpCQkJCQlcCi0Jcmh0X2J1Y2tldF9pbmRleChfdGJsLCBzdGFfYWRkcl9oYXNoKF9hLCBFVEhfQUxFTiwgKF90YmwpLT5oYXNoX3JuZCkpCi0KLSNkZWZpbmUgZm9yX2VhY2hfc3RhX2luZm8obG9jYWwsIHRibCwgX2FkZHIsIF9zdGEsIF90bXApCQlcCi0Jcmh0X2Zvcl9lYWNoX2VudHJ5X3JjdShfc3RhLCBfdG1wLCB0YmwsIAkJCVwKLQkJCSAgICAgICBfc3RhX2J1Y2tldF9pZHgodGJsLCBfYWRkciksCQlcCi0JCQkgICAgICAgaGFzaF9ub2RlKQkJCQlcCi0JLyogY29tcGFyZSBhZGRyZXNzIGFuZCBydW4gY29kZSBvbmx5IGlmIGl0IG1hdGNoZXMgKi8JCVwKLQlpZiAoZXRoZXJfYWRkcl9lcXVhbChfc3RhLT5hZGRyLCAoX2FkZHIpKSkKKyNkZWZpbmUgZm9yX2VhY2hfc3RhX2luZm8obG9jYWwsIF9hZGRyLCBfc3RhLCBfdG1wKQkJCVwKKwlyaGxfZm9yX2VhY2hfZW50cnlfcmN1KF9zdGEsIF90bXAsCQkJCVwKKwkJCSAgICAgICBzdGFfaW5mb19oYXNoX2xvb2t1cChsb2NhbCwgX2FkZHIpLCBoYXNoX25vZGUpCiAKIC8qCiAgKiBHZXQgU1RBIGluZm8gYnkgaW5kZXgsIEJST0tFTiEKQEAgLTcxMiw2ICs3MTAsOCBAQAogCQkJICBzdHJ1Y3QgcmF0ZV9pbmZvICpyaW5mbyk7CiB2b2lkIHN0YV9zZXRfc2luZm8oc3RydWN0IHN0YV9pbmZvICpzdGEsIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKTsKIAordTMyIHN0YV9nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dChzdHJ1Y3Qgc3RhX2luZm8gKnN0YSk7CisKIHZvaWQgaWVlZTgwMjExX3N0YV9leHBpcmUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQkgIHVuc2lnbmVkIGxvbmcgZXhwX3RpbWUpOwogdTggc3RhX2luZm9fdHhfc3RyZWFtcyhzdHJ1Y3Qgc3RhX2luZm8gKnN0YSk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvc3RhdHVzLmMgYi9uZXQvbWFjODAyMTEvc3RhdHVzLmMKaW5kZXggYzZkNWM3Mi4uZGRmNzFjNiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3N0YXR1cy5jCisrKyBiL25ldC9tYWM4MDIxMS9zdGF0dXMuYwpAQCAtNTU3LDYgKzU1NywxMiBAQAogc3RhdGljIHZvaWQgaWVlZTgwMjExX2xvc3RfcGFja2V0KHN0cnVjdCBzdGFfaW5mbyAqc3RhLAogCQkJCSAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvKQogeworCS8qIElmIGRyaXZlciByZWxpZXMgb24gaXRzIG93biBhbGdvcml0aG0gZm9yIHN0YXRpb24ga2lja291dCwgc2tpcAorCSAqIG1hYzgwMjExIHBhY2tldCBsb3NzIG1lY2hhbmlzbS4KKwkgKi8KKwlpZiAoaWVlZTgwMjExX2h3X2NoZWNrKCZzdGEtPmxvY2FsLT5odywgUkVQT1JUU19MT1dfQUNLKSkKKwkJcmV0dXJuOworCiAJLyogVGhpcyBwYWNrZXQgd2FzIGFnZ3JlZ2F0ZWQgYnV0IGRvZXNuJ3QgY2Fycnkgc3RhdHVzIGluZm8gKi8KIAlpZiAoKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkgJiYKIAkgICAgIShpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FNUERVKSkKQEAgLTcwOSw3ICs3MTUsNyBAQAogCQkJaWYgKCFpZWVlODAyMTFfc2RhdGFfcnVubmluZyhzZGF0YSkpCiAJCQkJY29udGludWU7CiAKLQkJCWlmICgoc2RhdGEtPnUubW50cl9mbGFncyAmIE1PTklUT1JfRkxBR19DT09LX0ZSQU1FUykgJiYKKwkJCWlmICgoc2RhdGEtPnUubW50ci5mbGFncyAmIE1PTklUT1JfRkxBR19DT09LX0ZSQU1FUykgJiYKIAkJCSAgICAhc2VuZF90b19jb29rZWQpCiAJCQkJY29udGludWU7CiAKQEAgLTc0MCw4ICs3NDYsOCBAQAogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAlfX2xlMTYgZmM7CiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CisJc3RydWN0IHJobGlzdF9oZWFkICp0bXA7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0Jc3RydWN0IHJoYXNoX2hlYWQgKnRtcDsKIAlpbnQgcmV0cnlfY291bnQ7CiAJaW50IHJhdGVzX2lkeDsKIAlib29sIHNlbmRfdG9fY29va2VkOwpAQCAtNzQ5LDcgKzc1NSw2IEBACiAJc3RydWN0IGllZWU4MDIxMV9iYXIgKmJhcjsKIAlpbnQgc2hpZnQgPSAwOwogCWludCB0aWQgPSBJRUVFODAyMTFfTlVNX1RJRFM7Ci0JY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOwogCiAJcmF0ZXNfaWR4ID0gaWVlZTgwMjExX3R4X2dldF9yYXRlcyhodywgaW5mbywgJnJldHJ5X2NvdW50KTsKIApAQCAtNzU4LDkgKzc2Myw3IEBACiAJc2JhbmQgPSBsb2NhbC0+aHcud2lwaHktPmJhbmRzW2luZm8tPmJhbmRdOwogCWZjID0gaGRyLT5mcmFtZV9jb250cm9sOwogCi0JdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShsb2NhbC0+c3RhX2hhc2gudGJsLCAmbG9jYWwtPnN0YV9oYXNoKTsKLQotCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCB0YmwsIGhkci0+YWRkcjEsIHN0YSwgdG1wKSB7CisJZm9yX2VhY2hfc3RhX2luZm8obG9jYWwsIGhkci0+YWRkcjEsIHN0YSwgdG1wKSB7CiAJCS8qIHNraXAgd3JvbmcgdmlydHVhbCBpbnRlcmZhY2UgKi8KIAkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKGhkci0+YWRkcjIsIHN0YS0+c2RhdGEtPnZpZi5hZGRyKSkKIAkJCWNvbnRpbnVlOwpAQCAtNzcxLDYgKzc3NCwxMyBAQAogCQkJY2xlYXJfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9TUCk7CiAKIAkJYWNrZWQgPSAhIShpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FDSyk7CisKKwkJLyogbWVzaCBQZWVyIFNlcnZpY2UgUGVyaW9kIHN1cHBvcnQgKi8KKwkJaWYgKGllZWU4MDIxMV92aWZfaXNfbWVzaCgmc3RhLT5zZGF0YS0+dmlmKSAmJgorCQkgICAgaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkKKwkJCWllZWU4MDIxMV9tcHNwX3RyaWdnZXJfcHJvY2VzcygKKwkJCQlpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKSwgc3RhLCB0cnVlLCBhY2tlZCk7CisKIAkJaWYgKCFhY2tlZCAmJiB0ZXN0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfUFNfU1RBKSkgewogCQkJLyoKIAkJCSAqIFRoZSBTVEEgaXMgaW4gcG93ZXIgc2F2ZSBtb2RlLCBzbyBhc3N1bWUKQEAgLTc4MSwxMyArNzkxLDYgQEAKIAkJCXJldHVybjsKIAkJfQogCi0JCS8qIG1lc2ggUGVlciBTZXJ2aWNlIFBlcmlvZCBzdXBwb3J0ICovCi0JCWlmIChpZWVlODAyMTFfdmlmX2lzX21lc2goJnN0YS0+c2RhdGEtPnZpZikgJiYKLQkJICAgIGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykpCi0JCQlpZWVlODAyMTFfbXBzcF90cmlnZ2VyX3Byb2Nlc3MoCi0JCQkJCWllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpLAotCQkJCQlzdGEsIHRydWUsIGFja2VkKTsKLQogCQlpZiAoaWVlZTgwMjExX2h3X2NoZWNrKCZsb2NhbC0+aHcsIEhBU19SQVRFX0NPTlRST0wpICYmCiAJCSAgICAoaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSkgJiYKIAkJICAgIChyYXRlc19pZHggIT0gLTEpKQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3RkbHMuYyBiL25ldC9tYWM4MDIxMS90ZGxzLmMKaW5kZXggYjVkMjhmMS4uYWZjYTdkMSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3RkbHMuYworKysgYi9uZXQvbWFjODAyMTEvdGRscy5jCkBAIC0zMzMsMTAgKzMzMywxMSBAQAogCWlmICghdWMuY2VudGVyX2ZyZXExKQogCQlyZXR1cm47CiAKLQkvKiBwcm9jZWVkIHRvIGRvd25ncmFkZSB0aGUgY2hhbmRlZiB1bnRpbCB1c2FibGUgb3IgdGhlIHNhbWUgKi8KKwkvKiBwcm9jZWVkIHRvIGRvd25ncmFkZSB0aGUgY2hhbmRlZiB1bnRpbCB1c2FibGUgb3IgdGhlIHNhbWUgYXMgQVAgQlcgKi8KIAl3aGlsZSAodWMud2lkdGggPiBtYXhfd2lkdGggfHwKLQkgICAgICAgIWNmZzgwMjExX3JlZ19jYW5fYmVhY29uX3JlbGF4KHNkYXRhLT5sb2NhbC0+aHcud2lwaHksICZ1YywKLQkJCQkJICAgICAgc2RhdGEtPndkZXYuaWZ0eXBlKSkKKwkgICAgICAgKHVjLndpZHRoID4gc3RhLT50ZGxzX2NoYW5kZWYud2lkdGggJiYKKwkJIWNmZzgwMjExX3JlZ19jYW5fYmVhY29uX3JlbGF4KHNkYXRhLT5sb2NhbC0+aHcud2lwaHksICZ1YywKKwkJCQkJICAgICAgIHNkYXRhLT53ZGV2LmlmdHlwZSkpKQogCQlpZWVlODAyMTFfY2hhbmRlZl9kb3duZ3JhZGUoJnVjKTsKIAogCWlmICghY2ZnODAyMTFfY2hhbmRlZl9pZGVudGljYWwoJnVjLCAmc3RhLT50ZGxzX2NoYW5kZWYpKSB7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdHJhY2UuaCBiL25ldC9tYWM4MDIxMS90cmFjZS5oCmluZGV4IDc3ZTRjNTMuLjkyYTQ3YWYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS90cmFjZS5oCisrKyBiL25ldC9tYWM4MDIxMS90cmFjZS5oCkBAIC05ODQsNiArOTg0LDMyIEBACiAJKQogKTsKIAorVFJBQ0VfRVZFTlQoZHJ2X29mZnNldF90c2YsCisJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCSBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJIHM2NCBvZmZzZXQpLAorCisJVFBfQVJHUyhsb2NhbCwgc2RhdGEsIG9mZnNldCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlMT0NBTF9FTlRSWQorCQlWSUZfRU5UUlkKKwkJX19maWVsZChzNjQsIHRzZl9vZmZzZXQpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlMT0NBTF9BU1NJR047CisJCVZJRl9BU1NJR047CisJCV9fZW50cnktPnRzZl9vZmZzZXQgPSBvZmZzZXQ7CisJKSwKKworCVRQX3ByaW50aygKKwkJTE9DQUxfUFJfRk1UICBWSUZfUFJfRk1UICAiIHRzZiBvZmZzZXQ6JWxsZCIsCisJCUxPQ0FMX1BSX0FSRywgVklGX1BSX0FSRywKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT50c2Zfb2Zmc2V0CisJKQorKTsKKwogREVGSU5FX0VWRU5UKGxvY2FsX3NkYXRhX2V2dCwgZHJ2X3Jlc2V0X3RzZiwKIAlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKSwKQEAgLTE3MDAsNiArMTcyNiwxMzkgQEAKIAkpCiApOwogCitUUkFDRV9FVkVOVChkcnZfc3RhcnRfbmFuLAorCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCSBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2NvbmYgKmNvbmYpLAorCisJVFBfQVJHUyhsb2NhbCwgc2RhdGEsIGNvbmYpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCUxPQ0FMX0VOVFJZCisJCVZJRl9FTlRSWQorCQlfX2ZpZWxkKHU4LCBtYXN0ZXJfcHJlZikKKwkJX19maWVsZCh1OCwgZHVhbCkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCUxPQ0FMX0FTU0lHTjsKKwkJVklGX0FTU0lHTjsKKwkJX19lbnRyeS0+bWFzdGVyX3ByZWYgPSBjb25mLT5tYXN0ZXJfcHJlZjsKKwkJX19lbnRyeS0+ZHVhbCA9IGNvbmYtPmR1YWw7CisJKSwKKworCVRQX3ByaW50aygKKwkJTE9DQUxfUFJfRk1UICBWSUZfUFJfRk1UCisJCSIsIG1hc3RlciBwcmVmZXJlbmNlOiAldSwgZHVhbDogJWQiLAorCQlMT0NBTF9QUl9BUkcsIFZJRl9QUl9BUkcsIF9fZW50cnktPm1hc3Rlcl9wcmVmLAorCQlfX2VudHJ5LT5kdWFsCisJKQorKTsKKworVFJBQ0VfRVZFTlQoZHJ2X3N0b3BfbmFuLAorCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpLAorCisJVFBfQVJHUyhsb2NhbCwgc2RhdGEpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJTE9DQUxfRU5UUlkKKwkJVklGX0VOVFJZCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlMT0NBTF9BU1NJR047CisJCVZJRl9BU1NJR047CisJKSwKKworCVRQX3ByaW50aygKKwkJTE9DQUxfUFJfRk1UICBWSUZfUFJfRk1ULAorCQlMT0NBTF9QUl9BUkcsIFZJRl9QUl9BUkcKKwkpCispOworCitUUkFDRV9FVkVOVChkcnZfbmFuX2NoYW5nZV9jb25mLAorCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCSBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2NvbmYgKmNvbmYsCisJCSB1MzIgY2hhbmdlcyksCisKKwlUUF9BUkdTKGxvY2FsLCBzZGF0YSwgY29uZiwgY2hhbmdlcyksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJTE9DQUxfRU5UUlkKKwkJVklGX0VOVFJZCisJCV9fZmllbGQodTgsIG1hc3Rlcl9wcmVmKQorCQlfX2ZpZWxkKHU4LCBkdWFsKQorCQlfX2ZpZWxkKHUzMiwgY2hhbmdlcykKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCUxPQ0FMX0FTU0lHTjsKKwkJVklGX0FTU0lHTjsKKwkJX19lbnRyeS0+bWFzdGVyX3ByZWYgPSBjb25mLT5tYXN0ZXJfcHJlZjsKKwkJX19lbnRyeS0+ZHVhbCA9IGNvbmYtPmR1YWw7CisJCV9fZW50cnktPmNoYW5nZXMgPSBjaGFuZ2VzOworCSksCisKKwlUUF9wcmludGsoCisJCUxPQ0FMX1BSX0ZNVCAgVklGX1BSX0ZNVAorCQkiLCBtYXN0ZXIgcHJlZmVyZW5jZTogJXUsIGR1YWw6ICVkLCBjaGFuZ2VzOiAweCV4IiwKKwkJTE9DQUxfUFJfQVJHLCBWSUZfUFJfQVJHLCBfX2VudHJ5LT5tYXN0ZXJfcHJlZiwKKwkJX19lbnRyeS0+ZHVhbCwgX19lbnRyeS0+Y2hhbmdlcworCSkKKyk7CisKK1RSQUNFX0VWRU5UKGRydl9hZGRfbmFuX2Z1bmMsCisJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCSBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuYyAqZnVuYyksCisKKwlUUF9BUkdTKGxvY2FsLCBzZGF0YSwgZnVuYyksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJTE9DQUxfRU5UUlkKKwkJVklGX0VOVFJZCisJCV9fZmllbGQodTgsIHR5cGUpCisJCV9fZmllbGQodTgsIGluc3RfaWQpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlMT0NBTF9BU1NJR047CisJCVZJRl9BU1NJR047CisJCV9fZW50cnktPnR5cGUgPSBmdW5jLT50eXBlOworCQlfX2VudHJ5LT5pbnN0X2lkID0gZnVuYy0+aW5zdGFuY2VfaWQ7CisJKSwKKworCVRQX3ByaW50aygKKwkJTE9DQUxfUFJfRk1UICBWSUZfUFJfRk1UCisJCSIsIHR5cGU6ICV1LCBpbnN0X2lkOiAldSIsCisJCUxPQ0FMX1BSX0FSRywgVklGX1BSX0FSRywgX19lbnRyeS0+dHlwZSwgX19lbnRyeS0+aW5zdF9pZAorCSkKKyk7CisKK1RSQUNFX0VWRU5UKGRydl9kZWxfbmFuX2Z1bmMsCisJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCSBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJIHU4IGluc3RhbmNlX2lkKSwKKworCVRQX0FSR1MobG9jYWwsIHNkYXRhLCBpbnN0YW5jZV9pZCksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJTE9DQUxfRU5UUlkKKwkJVklGX0VOVFJZCisJCV9fZmllbGQodTgsIGluc3RhbmNlX2lkKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJTE9DQUxfQVNTSUdOOworCQlWSUZfQVNTSUdOOworCQlfX2VudHJ5LT5pbnN0YW5jZV9pZCA9IGluc3RhbmNlX2lkOworCSksCisKKwlUUF9wcmludGsoCisJCUxPQ0FMX1BSX0ZNVCAgVklGX1BSX0ZNVAorCQkiLCBpbnN0YW5jZV9pZDogJXUiLAorCQlMT0NBTF9QUl9BUkcsIFZJRl9QUl9BUkcsIF9fZW50cnktPmluc3RhbmNlX2lkCisJKQorKTsKKwogLyoKICAqIFRyYWNpbmcgZm9yIEFQSSBjYWxscyB0aGF0IGRyaXZlcnMgY2FsbC4KICAqLwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3R4LmMgYi9uZXQvbWFjODAyMTEvdHguYwppbmRleCA5MTQ2MWM0Li4xYzU2YWJjIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvdHguYworKysgYi9uZXQvbWFjODAyMTEvdHguYwpAQCAtMzY4LDcgKzM2OCw3IEBACiAJCXNrYiA9IHNrYl9kZXF1ZXVlKCZwcy0+YmNfYnVmKTsKIAkJaWYgKHNrYikgewogCQkJcHVyZ2VkKys7Ci0JCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlpZWVlODAyMTFfZnJlZV90eHNrYigmbG9jYWwtPmh3LCBza2IpOwogCQl9CiAJCXRvdGFsICs9IHNrYl9xdWV1ZV9sZW4oJnBzLT5iY19idWYpOwogCX0KQEAgLTQ1MSw3ICs0NTEsNyBAQAogCWlmIChza2JfcXVldWVfbGVuKCZwcy0+YmNfYnVmKSA+PSBBUF9NQVhfQkNfQlVGRkVSKSB7CiAJCXBzX2RiZyh0eC0+c2RhdGEsCiAJCSAgICAgICAiQkMgVFggYnVmZmVyIGZ1bGwgLSBkcm9wcGluZyB0aGUgb2xkZXN0IGZyYW1lXG4iKTsKLQkJZGV2X2tmcmVlX3NrYihza2JfZGVxdWV1ZSgmcHMtPmJjX2J1ZikpOworCQlpZWVlODAyMTFfZnJlZV90eHNrYigmdHgtPmxvY2FsLT5odywgc2tiX2RlcXVldWUoJnBzLT5iY19idWYpKTsKIAl9IGVsc2UKIAkJdHgtPmxvY2FsLT50b3RhbF9wc19idWZmZXJlZCsrOwogCkBAIC04NTMsOCArODUzLDcgQEAKIAl0aWQgPSAqcWMgJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKIAl0eC0+c3RhLT50eF9zdGF0cy5tc2R1W3RpZF0rKzsKIAotCWlmICghdHgtPnN0YS0+c3RhLnR4cVswXSkKLQkJaGRyLT5zZXFfY3RybCA9IGllZWU4MDIxMV90eF9uZXh0X3NlcSh0eC0+c3RhLCB0aWQpOworCWhkci0+c2VxX2N0cmwgPSBpZWVlODAyMTFfdHhfbmV4dF9zZXEodHgtPnN0YSwgdGlkKTsKIAogCXJldHVybiBUWF9DT05USU5VRTsKIH0KQEAgLTEzNDMsNyArMTM0Miw3IEBACiAJbG9jYWwgPSBjb250YWluZXJfb2YoZnEsIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwsIGZxKTsKIAl0eHFpID0gY29udGFpbmVyX29mKHRpbiwgc3RydWN0IHR4cV9pbmZvLCB0aW4pOwogCWNwYXJhbXMgPSAmbG9jYWwtPmNwYXJhbXM7Ci0JY3N0YXRzID0gJmxvY2FsLT5jc3RhdHM7CisJY3N0YXRzID0gJnR4cWktPmNzdGF0czsKIAogCWlmIChmbG93ID09ICZ0eHFpLT5kZWZfZmxvdykKIAkJY3ZhcnMgPSAmdHhxaS0+ZGVmX2N2YXJzOwpAQCAtMTQwMyw2ICsxNDAyLDggQEAKIAlmcV90aW5faW5pdCgmdHhxaS0+dGluKTsKIAlmcV9mbG93X2luaXQoJnR4cWktPmRlZl9mbG93KTsKIAljb2RlbF92YXJzX2luaXQoJnR4cWktPmRlZl9jdmFycyk7CisJY29kZWxfc3RhdHNfaW5pdCgmdHhxaS0+Y3N0YXRzKTsKKwlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnR4cWktPmZyYWdzKTsKIAogCXR4cWktPnR4cS52aWYgPSAmc2RhdGEtPnZpZjsKIApAQCAtMTQyNSw2ICsxNDI2LDcgQEAKIAlzdHJ1Y3QgZnFfdGluICp0aW4gPSAmdHhxaS0+dGluOwogCiAJZnFfdGluX3Jlc2V0KGZxLCB0aW4sIGZxX3NrYl9mcmVlX2Z1bmMpOworCWllZWU4MDIxMV9wdXJnZV90eF9xdWV1ZSgmbG9jYWwtPmh3LCAmdHhxaS0+ZnJhZ3MpOwogfQogCiBpbnQgaWVlZTgwMjExX3R4cV9zZXR1cF9mbG93cyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKQEAgLTE0MzIsNiArMTQzNCw4IEBACiAJc3RydWN0IGZxICpmcSA9ICZsb2NhbC0+ZnE7CiAJaW50IHJldDsKIAlpbnQgaTsKKwlib29sIHN1cHBfdmh0ID0gZmFsc2U7CisJZW51bSBubDgwMjExX2JhbmQgYmFuZDsKIAogCWlmICghbG9jYWwtPm9wcy0+d2FrZV90eF9xdWV1ZSkKIAkJcmV0dXJuIDA7CkBAIC0xNDQwLDggKzE0NDQsMjQgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJLyoKKwkgKiBJZiB0aGUgaGFyZHdhcmUgZG9lc24ndCBzdXBwb3J0IFZIVCwgaXQgaXMgc2FmZSB0byBsaW1pdCB0aGUgbWF4aW11bQorCSAqIHF1ZXVlIHNpemUuIDQgTWJ5dGVzIGlzIDY0IG1heC1zaXplIGFnZ3JlZ2F0ZXMgaW4gODAyLjExbi4KKwkgKi8KKwlmb3IgKGJhbmQgPSAwOyBiYW5kIDwgTlVNX05MODAyMTFfQkFORFM7IGJhbmQrKykgeworCQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKworCQlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbYmFuZF07CisJCWlmICghc2JhbmQpCisJCQljb250aW51ZTsKKworCQlzdXBwX3ZodCA9IHN1cHBfdmh0IHx8IHNiYW5kLT52aHRfY2FwLnZodF9zdXBwb3J0ZWQ7CisJfQorCisJaWYgKCFzdXBwX3ZodCkKKwkJZnEtPm1lbW9yeV9saW1pdCA9IDQgPDwgMjA7IC8qIDQgTWJ5dGVzICovCisKIAljb2RlbF9wYXJhbXNfaW5pdCgmbG9jYWwtPmNwYXJhbXMpOwotCWNvZGVsX3N0YXRzX2luaXQoJmxvY2FsLT5jc3RhdHMpOwogCWxvY2FsLT5jcGFyYW1zLmludGVydmFsID0gTVMyVElNRSgxMDApOwogCWxvY2FsLT5jcGFyYW1zLnRhcmdldCA9IE1TMlRJTUUoMjApOwogCWxvY2FsLT5jcGFyYW1zLmVjbiA9IHRydWU7CkBAIC0xNDc2LDUwICsxNDk2LDQ2IEBACiAJc3Bpbl91bmxvY2tfYmgoJmZxLT5sb2NrKTsKIH0KIAotc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV90eF9kZXF1ZXVlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV90eHEgKnR4cSkKK3N0YXRpYyBib29sIGllZWU4MDIxMV9xdWV1ZV9za2Ioc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJc3RydWN0IHN0YV9pbmZvICpzdGEsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGh3X3RvX2xvY2FsKGh3KTsKLQlzdHJ1Y3QgdHhxX2luZm8gKnR4cWkgPSBjb250YWluZXJfb2YodHhxLCBzdHJ1Y3QgdHhxX2luZm8sIHR4cSk7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAJc3RydWN0IGZxICpmcSA9ICZsb2NhbC0+ZnE7Ci0Jc3RydWN0IGZxX3RpbiAqdGluID0gJnR4cWktPnRpbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOworCXN0cnVjdCB0eHFfaW5mbyAqdHhxaTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqcHVic3RhOworCisJaWYgKCFsb2NhbC0+b3BzLT53YWtlX3R4X3F1ZXVlIHx8CisJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoc3RhICYmIHN0YS0+dXBsb2FkZWQpCisJCXB1YnN0YSA9ICZzdGEtPnN0YTsKKwllbHNlCisJCXB1YnN0YSA9IE5VTEw7CisKKwlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pCisJCXNkYXRhID0gY29udGFpbmVyX29mKHNkYXRhLT5ic3MsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhLCB1LmFwKTsKKworCXZpZiA9ICZzZGF0YS0+dmlmOworCXR4cWkgPSBpZWVlODAyMTFfZ2V0X3R4cShsb2NhbCwgdmlmLCBwdWJzdGEsIHNrYik7CisKKwlpZiAoIXR4cWkpCisJCXJldHVybiBmYWxzZTsKKworCWluZm8tPmNvbnRyb2wudmlmID0gdmlmOwogCiAJc3Bpbl9sb2NrX2JoKCZmcS0+bG9jayk7Ci0KLQlpZiAodGVzdF9iaXQoSUVFRTgwMjExX1RYUV9TVE9QLCAmdHhxaS0+ZmxhZ3MpKQotCQlnb3RvIG91dDsKLQotCXNrYiA9IGZxX3Rpbl9kZXF1ZXVlKGZxLCB0aW4sIGZxX3Rpbl9kZXF1ZXVlX2Z1bmMpOwotCWlmICghc2tiKQotCQlnb3RvIG91dDsKLQotCWllZWU4MDIxMV9zZXRfc2tiX3ZpZihza2IsIHR4cWkpOwotCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwotCWlmICh0eHEtPnN0YSAmJiBpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IGNvbnRhaW5lcl9vZih0eHEtPnN0YSwgc3RydWN0IHN0YV9pbmZvLAotCQkJCQkJICAgIHN0YSk7Ci0JCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKLQotCQloZHItPnNlcV9jdHJsID0gaWVlZTgwMjExX3R4X25leHRfc2VxKHN0YSwgdHhxLT50aWQpOwotCQlpZiAodGVzdF9iaXQoSUVFRTgwMjExX1RYUV9BTVBEVSwgJnR4cWktPmZsYWdzKSkKLQkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9DVExfQU1QRFU7Ci0JCWVsc2UKLQkJCWluZm8tPmZsYWdzICY9IH5JRUVFODAyMTFfVFhfQ1RMX0FNUERVOwotCX0KLQotb3V0OgorCWllZWU4MDIxMV90eHFfZW5xdWV1ZShsb2NhbCwgdHhxaSwgc2tiKTsKIAlzcGluX3VubG9ja19iaCgmZnEtPmxvY2spOwogCi0JaWYgKHNrYiAmJiBza2JfaGFzX2ZyYWdfbGlzdChza2IpICYmCi0JICAgICFpZWVlODAyMTFfaHdfY2hlY2soJmxvY2FsLT5odywgVFhfRlJBR19MSVNUKSkKLQkJc2tiX2xpbmVhcml6ZShza2IpOworCWRydl93YWtlX3R4X3F1ZXVlKGxvY2FsLCB0eHFpKTsKIAotCXJldHVybiBza2I7CisJcmV0dXJuIHRydWU7CiB9Ci1FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV90eF9kZXF1ZXVlKTsKIAogc3RhdGljIGJvb2wgaWVlZTgwMjExX3R4X2ZyYWdzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCkBAIC0xNTI4LDkgKzE1NDQsNyBAQAogCQkJICAgICAgIGJvb2wgdHhwZW5kaW5nKQogewogCXN0cnVjdCBpZWVlODAyMTFfdHhfY29udHJvbCBjb250cm9sID0ge307Ci0Jc3RydWN0IGZxICpmcSA9ICZsb2NhbC0+ZnE7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnRtcDsKLQlzdHJ1Y3QgdHhxX2luZm8gKnR4cWk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNrYl9xdWV1ZV93YWxrX3NhZmUoc2ticywgc2tiLCB0bXApIHsKQEAgLTE1NDUsMjEgKzE1NTksNiBAQAogCQl9CiAjZW5kaWYKIAotCQl0eHFpID0gaWVlZTgwMjExX2dldF90eHEobG9jYWwsIHZpZiwgc3RhLCBza2IpOwotCQlpZiAodHhxaSkgewotCQkJaW5mby0+Y29udHJvbC52aWYgPSB2aWY7Ci0KLQkJCV9fc2tiX3VubGluayhza2IsIHNrYnMpOwotCi0JCQlzcGluX2xvY2tfYmgoJmZxLT5sb2NrKTsKLQkJCWllZWU4MDIxMV90eHFfZW5xdWV1ZShsb2NhbCwgdHhxaSwgc2tiKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZmcS0+bG9jayk7Ci0KLQkJCWRydl93YWtlX3R4X3F1ZXVlKGxvY2FsLCB0eHFpKTsKLQotCQkJY29udGludWU7Ci0JCX0KLQogCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPnF1ZXVlX3N0b3BfcmVhc29uX2xvY2ssIGZsYWdzKTsKIAkJaWYgKGxvY2FsLT5xdWV1ZV9zdG9wX3JlYXNvbnNbcV0gfHwKIAkJICAgICghdHhwZW5kaW5nICYmICFza2JfcXVldWVfZW1wdHkoJmxvY2FsLT5wZW5kaW5nW3FdKSkpIHsKQEAgLTE2NDMsNyArMTY0Miw3IEBACiAKIAlzd2l0Y2ggKHNkYXRhLT52aWYudHlwZSkgewogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKLQkJaWYgKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQUNUSVZFKSB7CisJCWlmIChzZGF0YS0+dS5tbnRyLmZsYWdzICYgTU9OSVRPUl9GTEFHX0FDVElWRSkgewogCQkJdmlmID0gJnNkYXRhLT52aWY7CiAJCQlicmVhazsKIAkJfQpAQCAtMTY4MCwxMCArMTY3OSwxMyBAQAogLyoKICAqIEludm9rZSBUWCBoYW5kbGVycywgcmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgbm9uLXplcm8gaWYgdGhlCiAgKiBmcmFtZSB3YXMgZHJvcHBlZCBvciBxdWV1ZWQuCisgKgorICogVGhlIGhhbmRsZXJzIGFyZSBzcGxpdCBpbnRvIGFuIGVhcmx5IGFuZCBsYXRlIHBhcnQuIFRoZSBsYXR0ZXIgaXMgZXZlcnl0aGluZworICogdGhhdCBjYW4gYmUgc2Vuc2l0aXZlIHRvIHJlb3JkZXJpbmcsIGFuZCB3aWxsIGJlIGRlZmVycmVkIHRvIGFmdGVyIHBhY2tldHMKKyAqIGFyZSBkZXF1ZXVlZCBmcm9tIHRoZSBpbnRlcm1lZGlhdGUgcXVldWVzICh3aGVuIHRoZXkgYXJlIGVuYWJsZWQpLgogICovCi1zdGF0aWMgaW50IGludm9rZV90eF9oYW5kbGVycyhzdHJ1Y3QgaWVlZTgwMjExX3R4X2RhdGEgKnR4KQorc3RhdGljIGludCBpbnZva2VfdHhfaGFuZGxlcnNfZWFybHkoc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHR4LT5za2IpOwogCWllZWU4MDIxMV90eF9yZXN1bHQgcmVzID0gVFhfRFJPUDsKIAogI2RlZmluZSBDQUxMX1RYSCh0eGgpIFwKQEAgLTE3MDEsNiArMTcwMywzMSBAQAogCWlmICghaWVlZTgwMjExX2h3X2NoZWNrKCZ0eC0+bG9jYWwtPmh3LCBIQVNfUkFURV9DT05UUk9MKSkKIAkJQ0FMTF9UWEgoaWVlZTgwMjExX3R4X2hfcmF0ZV9jdHJsKTsKIAorIHR4aF9kb25lOgorCWlmICh1bmxpa2VseShyZXMgPT0gVFhfRFJPUCkpIHsKKwkJSTgwMl9ERUJVR19JTkModHgtPmxvY2FsLT50eF9oYW5kbGVyc19kcm9wKTsKKwkJaWYgKHR4LT5za2IpCisJCQlpZWVlODAyMTFfZnJlZV90eHNrYigmdHgtPmxvY2FsLT5odywgdHgtPnNrYik7CisJCWVsc2UKKwkJCWllZWU4MDIxMV9wdXJnZV90eF9xdWV1ZSgmdHgtPmxvY2FsLT5odywgJnR4LT5za2JzKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSBpZiAodW5saWtlbHkocmVzID09IFRYX1FVRVVFRCkpIHsKKwkJSTgwMl9ERUJVR19JTkModHgtPmxvY2FsLT50eF9oYW5kbGVyc19xdWV1ZWQpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMYXRlIGhhbmRsZXJzIGNhbiBiZSBjYWxsZWQgd2hpbGUgdGhlIHN0YSBsb2NrIGlzIGhlbGQuIEhhbmRsZXJzIHRoYXQgY2FuCisgKiBjYXVzZSBwYWNrZXRzIHRvIGJlIGdlbmVyYXRlZCB3aWxsIGNhdXNlIGRlYWRsb2NrIQorICovCitzdGF0aWMgaW50IGludm9rZV90eF9oYW5kbGVyc19sYXRlKHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgpCit7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQih0eC0+c2tiKTsKKwlpZWVlODAyMTFfdHhfcmVzdWx0IHJlcyA9IFRYX0NPTlRJTlVFOworCiAJaWYgKHVubGlrZWx5KGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0lOVEZMX1JFVFJBTlNNSVNTSU9OKSkgewogCQlfX3NrYl9xdWV1ZV90YWlsKCZ0eC0+c2ticywgdHgtPnNrYik7CiAJCXR4LT5za2IgPSBOVUxMOwpAQCAtMTczMyw2ICsxNzYwLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaW52b2tlX3R4X2hhbmRsZXJzKHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgpCit7CisJaW50IHIgPSBpbnZva2VfdHhfaGFuZGxlcnNfZWFybHkodHgpOworCisJaWYgKHIpCisJCXJldHVybiByOworCXJldHVybiBpbnZva2VfdHhfaGFuZGxlcnNfbGF0ZSh0eCk7Cit9CisKIGJvb2wgaWVlZTgwMjExX3R4X3ByZXBhcmVfc2tiKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIGludCBiYW5kLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqKnN0YSkKQEAgLTE4MDcsNyArMTg0MywxMyBAQAogCQlpbmZvLT5od19xdWV1ZSA9CiAJCQlzZGF0YS0+dmlmLmh3X3F1ZXVlW3NrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpXTsKIAotCWlmICghaW52b2tlX3R4X2hhbmRsZXJzKCZ0eCkpCisJaWYgKGludm9rZV90eF9oYW5kbGVyc19lYXJseSgmdHgpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoaWVlZTgwMjExX3F1ZXVlX3NrYihsb2NhbCwgc2RhdGEsIHR4LnN0YSwgdHguc2tiKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoIWludm9rZV90eF9oYW5kbGVyc19sYXRlKCZ0eCkpCiAJCXJlc3VsdCA9IF9faWVlZTgwMjExX3R4KGxvY2FsLCAmdHguc2ticywgbGVkX2xlbiwKIAkJCQkJdHguc3RhLCB0eHBlbmRpbmcpOwogCkBAIC0yMjYzLDE1ICsyMzA1LDkgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CiAJCWlmIChzZGF0YS0+d2Rldi53aXBoeS0+ZmxhZ3MgJiBXSVBIWV9GTEFHX1NVUFBPUlRTX1RETFMpIHsKIAkJCXN0YSA9IHN0YV9pbmZvX2dldChzZGF0YSwgc2tiLT5kYXRhKTsKLQkJCWlmIChzdGEpIHsKLQkJCQlib29sIHRkbHNfcGVlciwgdGRsc19hdXRoOwotCi0JCQkJdGRsc19wZWVyID0gdGVzdF9zdGFfZmxhZyhzdGEsCi0JCQkJCQkJICBXTEFOX1NUQV9URExTX1BFRVIpOwotCQkJCXRkbHNfYXV0aCA9IHRlc3Rfc3RhX2ZsYWcoc3RhLAotCQkJCQkJV0xBTl9TVEFfVERMU19QRUVSX0FVVEgpOwotCi0JCQkJaWYgKHRkbHNfcGVlciAmJiB0ZGxzX2F1dGgpIHsKKwkJCWlmIChzdGEgJiYgdGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1RETFNfUEVFUikpIHsKKwkJCQlpZiAodGVzdF9zdGFfZmxhZyhzdGEsCisJCQkJCQkgIFdMQU5fU1RBX1RETFNfUEVFUl9BVVRIKSkgewogCQkJCQkqc3RhX291dCA9IHN0YTsKIAkJCQkJcmV0dXJuIDA7CiAJCQkJfQpAQCAtMjI4Myw4ICsyMzE5LDcgQEAKIAkJCQkgKiBhZnRlciBhIFRETFMgc3RhIGlzIHJlbW92ZWQgZHVlIHRvIGJlaW5nCiAJCQkJICogdW5yZWFjaGFibGUuCiAJCQkJICovCi0JCQkJaWYgKHRkbHNfcGVlciAmJiAhdGRsc19hdXRoICYmCi0JCQkJICAgICFpZWVlODAyMTFfaXNfdGRsc19zZXR1cChza2IpKQorCQkJCWlmICghaWVlZTgwMjExX2lzX3RkbHNfc2V0dXAoc2tiKSkKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAKQEAgLTIzMzQsNyArMjM2OSw2IEBACiAJc3RydWN0IG1lc2hfcGF0aCBfX21heWJlX3VudXNlZCAqbXBwYXRoID0gTlVMTCwgKm1wYXRoID0gTlVMTDsKIAljb25zdCB1OCAqZW5jYXBzX2RhdGE7CiAJaW50IGVuY2Fwc19sZW4sIHNraXBfaGVhZGVyX2J5dGVzOwotCWludCBuaF9wb3MsIGhfcG9zOwogCWJvb2wgd21lX3N0YSA9IGZhbHNlLCBhdXRob3JpemVkID0gZmFsc2U7CiAJYm9vbCB0ZGxzX3BlZXI7CiAJYm9vbCBtdWx0aWNhc3Q7CkBAIC0yNjQwLDEzICsyNjc0LDcgQEAKIAkJZW5jYXBzX2xlbiA9IDA7CiAJfQogCi0JbmhfcG9zID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgLSBza2ItPmRhdGE7Ci0JaF9wb3MgPSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpIC0gc2tiLT5kYXRhOwotCiAJc2tiX3B1bGwoc2tiLCBza2lwX2hlYWRlcl9ieXRlcyk7Ci0JbmhfcG9zIC09IHNraXBfaGVhZGVyX2J5dGVzOwotCWhfcG9zIC09IHNraXBfaGVhZGVyX2J5dGVzOwotCiAJaGVhZF9uZWVkID0gaGRybGVuICsgZW5jYXBzX2xlbiArIG1lc2hoZHJsZW4gLSBza2JfaGVhZHJvb20oc2tiKTsKIAogCS8qCkBAIC0yNjcyLDE4ICsyNzAwLDEyIEBACiAJCX0KIAl9CiAKLQlpZiAoZW5jYXBzX2RhdGEpIHsKKwlpZiAoZW5jYXBzX2RhdGEpCiAJCW1lbWNweShza2JfcHVzaChza2IsIGVuY2Fwc19sZW4pLCBlbmNhcHNfZGF0YSwgZW5jYXBzX2xlbik7Ci0JCW5oX3BvcyArPSBlbmNhcHNfbGVuOwotCQloX3BvcyArPSBlbmNhcHNfbGVuOwotCX0KIAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNICi0JaWYgKG1lc2hoZHJsZW4gPiAwKSB7CisJaWYgKG1lc2hoZHJsZW4gPiAwKQogCQltZW1jcHkoc2tiX3B1c2goc2tiLCBtZXNoaGRybGVuKSwgJm1lc2hfaGRyLCBtZXNoaGRybGVuKTsKLQkJbmhfcG9zICs9IG1lc2hoZHJsZW47Ci0JCWhfcG9zICs9IG1lc2hoZHJsZW47Ci0JfQogI2VuZGlmCiAKIAlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkgewpAQCAtMjY5OSwxNSArMjcyMSw3IEBACiAJfSBlbHNlCiAJCW1lbWNweShza2JfcHVzaChza2IsIGhkcmxlbiksICZoZHIsIGhkcmxlbik7CiAKLQluaF9wb3MgKz0gaGRybGVuOwotCWhfcG9zICs9IGhkcmxlbjsKLQotCS8qIFVwZGF0ZSBza2IgcG9pbnRlcnMgdG8gdmFyaW91cyBoZWFkZXJzIHNpbmNlIHRoaXMgbW9kaWZpZWQgZnJhbWUKLQkgKiBpcyBnb2luZyB0byBnbyB0aHJvdWdoIExpbnV4IG5ldHdvcmtpbmcgY29kZSB0aGF0IG1heSBwb3RlbnRpYWxseQotCSAqIG5lZWQgdGhpbmdzIGxpa2UgcG9pbnRlciB0byBJUCBoZWFkZXIuICovCiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKLQlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwgbmhfcG9zKTsKLQlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBoX3Bvcyk7CiAKIAlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwogCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKQEAgLTMxNzksOCArMzE5Myw3MSBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qCisgKiBDYW4gYmUgY2FsbGVkIHdoaWxlIHRoZSBzdGEgbG9jayBpcyBoZWxkLiBBbnl0aGluZyB0aGF0IGNhbiBjYXVzZSBwYWNrZXRzIHRvCisgKiBiZSBnZW5lcmF0ZWQgd2lsbCBjYXVzZSBkZWFkbG9jayEKKyAqLworc3RhdGljIHZvaWQgaWVlZTgwMjExX3htaXRfZmFzdF9maW5pc2goc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhLCB1OCBwbl9vZmZzLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5LAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHZvaWQgKilza2ItPmRhdGE7CisJdTggdGlkID0gSUVFRTgwMjExX05VTV9USURTOworCisJaWYgKGtleSkKKwkJaW5mby0+Y29udHJvbC5od19rZXkgPSAma2V5LT5jb25mOworCisJaWVlZTgwMjExX3R4X3N0YXRzKHNrYi0+ZGV2LCBza2ItPmxlbik7CisKKwlpZiAoaGRyLT5mcmFtZV9jb250cm9sICYgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBKSkgeworCQl0aWQgPSBza2ItPnByaW9yaXR5ICYgSUVFRTgwMjExX1FPU19DVExfVEFHMURfTUFTSzsKKwkJKmllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpID0gdGlkOworCQloZHItPnNlcV9jdHJsID0gaWVlZTgwMjExX3R4X25leHRfc2VxKHN0YSwgdGlkKTsKKwl9IGVsc2UgeworCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX0FTU0lHTl9TRVE7CisJCWhkci0+c2VxX2N0cmwgPSBjcHVfdG9fbGUxNihzZGF0YS0+c2VxdWVuY2VfbnVtYmVyKTsKKwkJc2RhdGEtPnNlcXVlbmNlX251bWJlciArPSAweDEwOworCX0KKworCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKQorCQlzdGEtPnR4X3N0YXRzLm1zZHVbdGlkXSArPQorCQkJRElWX1JPVU5EX1VQKHNrYi0+bGVuLCBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKTsKKwllbHNlCisJCXN0YS0+dHhfc3RhdHMubXNkdVt0aWRdKys7CisKKwlpbmZvLT5od19xdWV1ZSA9IHNkYXRhLT52aWYuaHdfcXVldWVbc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYildOworCisJLyogc3RhdGlzdGljcyBub3JtYWxseSBkb25lIGJ5IGllZWU4MDIxMV90eF9oX3N0YXRzIChidXQgdGhhdAorCSAqIGhhcyB0byBjb25zaWRlciBmcmFnbWVudGF0aW9uLCBzbyBpcyBtb3JlIGNvbXBsZXgpCisJICovCisJc3RhLT50eF9zdGF0cy5ieXRlc1tza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKV0gKz0gc2tiLT5sZW47CisJc3RhLT50eF9zdGF0cy5wYWNrZXRzW3NrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpXSsrOworCisJaWYgKHBuX29mZnMpIHsKKwkJdTY0IHBuOworCQl1OCAqY3J5cHRvX2hkciA9IHNrYi0+ZGF0YSArIHBuX29mZnM7CisKKwkJc3dpdGNoIChrZXktPmNvbmYuY2lwaGVyKSB7CisJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKKwkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QXzI1NjoKKwkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9HQ01QOgorCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0dDTVBfMjU2OgorCQkJcG4gPSBhdG9taWM2NF9pbmNfcmV0dXJuKCZrZXktPmNvbmYudHhfcG4pOworCQkJY3J5cHRvX2hkclswXSA9IHBuOworCQkJY3J5cHRvX2hkclsxXSA9IHBuID4+IDg7CisJCQljcnlwdG9faGRyWzRdID0gcG4gPj4gMTY7CisJCQljcnlwdG9faGRyWzVdID0gcG4gPj4gMjQ7CisJCQljcnlwdG9faGRyWzZdID0gcG4gPj4gMzI7CisJCQljcnlwdG9faGRyWzddID0gcG4gPj4gNDA7CisJCQlicmVhazsKKwkJfQorCX0KK30KKwogc3RhdGljIGJvb2wgaWVlZTgwMjExX3htaXRfZmFzdChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKKwkJCQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX2Zhc3RfdHggKmZhc3RfdHgsCiAJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKQEAgLTMyMzEsOCArMzMwOCw2IEBACiAJCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlpZWVlODAyMTFfdHhfc3RhdHMoZGV2LCBza2ItPmxlbiArIGV4dHJhX2hlYWQpOwotCiAJaWYgKChoZHItPmZyYW1lX2NvbnRyb2wgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEpKSAmJgogCSAgICBpZWVlODAyMTFfYW1zZHVfYWdncmVnYXRlKHNkYXRhLCBzdGEsIGZhc3RfdHgsIHNrYikpCiAJCXJldHVybiB0cnVlOwpAQCAtMzI2MSwyNCArMzMzNiw3IEBACiAJaW5mby0+ZmxhZ3MgPSBJRUVFODAyMTFfVFhfQ1RMX0ZJUlNUX0ZSQUdNRU5UIHwKIAkJICAgICAgSUVFRTgwMjExX1RYX0NUTF9ET05URlJBRyB8CiAJCSAgICAgICh0aWRfdHggPyBJRUVFODAyMTFfVFhfQ1RMX0FNUERVIDogMCk7Ci0KLQlpZiAoaGRyLT5mcmFtZV9jb250cm9sICYgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBKSkgewotCQkqaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcikgPSB0aWQ7Ci0JCWlmICghc3RhLT5zdGEudHhxWzBdKQotCQkJaGRyLT5zZXFfY3RybCA9IGllZWU4MDIxMV90eF9uZXh0X3NlcShzdGEsIHRpZCk7Ci0JfSBlbHNlIHsKLQkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0NUTF9BU1NJR05fU0VROwotCQloZHItPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoc2RhdGEtPnNlcXVlbmNlX251bWJlcik7Ci0JCXNkYXRhLT5zZXF1ZW5jZV9udW1iZXIgKz0gMHgxMDsKLQl9Ci0KLQlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkKLQkJc3RhLT50eF9zdGF0cy5tc2R1W3RpZF0gKz0KLQkJCURJVl9ST1VORF9VUChza2ItPmxlbiwgc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSk7Ci0JZWxzZQotCQlzdGEtPnR4X3N0YXRzLm1zZHVbdGlkXSsrOwotCi0JaW5mby0+aHdfcXVldWUgPSBzZGF0YS0+dmlmLmh3X3F1ZXVlW3NrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpXTsKKwlpbmZvLT5jb250cm9sLmZsYWdzID0gSUVFRTgwMjExX1RYX0NUUkxfRkFTVF9YTUlUOwogCiAJX19za2JfcXVldWVfaGVhZF9pbml0KCZ0eC5za2JzKTsKIApAQCAtMzI4OCw5ICszMzQ2LDYgQEAKIAl0eC5zdGEgPSBzdGE7CiAJdHgua2V5ID0gZmFzdF90eC0+a2V5OwogCi0JaWYgKGZhc3RfdHgtPmtleSkKLQkJaW5mby0+Y29udHJvbC5od19rZXkgPSAmZmFzdF90eC0+a2V5LT5jb25mOwotCiAJaWYgKCFpZWVlODAyMTFfaHdfY2hlY2soJmxvY2FsLT5odywgSEFTX1JBVEVfQ09OVFJPTCkpIHsKIAkJdHguc2tiID0gc2tiOwogCQlyID0gaWVlZTgwMjExX3R4X2hfcmF0ZV9jdHJsKCZ0eCk7CkBAIC0zMzA0LDMxICszMzU5LDExIEBACiAJCX0KIAl9CiAKLQkvKiBzdGF0aXN0aWNzIG5vcm1hbGx5IGRvbmUgYnkgaWVlZTgwMjExX3R4X2hfc3RhdHMgKGJ1dCB0aGF0Ci0JICogaGFzIHRvIGNvbnNpZGVyIGZyYWdtZW50YXRpb24sIHNvIGlzIG1vcmUgY29tcGxleCkKLQkgKi8KLQlzdGEtPnR4X3N0YXRzLmJ5dGVzW3NrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpXSArPSBza2ItPmxlbjsKLQlzdGEtPnR4X3N0YXRzLnBhY2tldHNbc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYildKys7CisJaWYgKGllZWU4MDIxMV9xdWV1ZV9za2IobG9jYWwsIHNkYXRhLCBzdGEsIHNrYikpCisJCXJldHVybiB0cnVlOwogCi0JaWYgKGZhc3RfdHgtPnBuX29mZnMpIHsKLQkJdTY0IHBuOwotCQl1OCAqY3J5cHRvX2hkciA9IHNrYi0+ZGF0YSArIGZhc3RfdHgtPnBuX29mZnM7Ci0KLQkJc3dpdGNoIChmYXN0X3R4LT5rZXktPmNvbmYuY2lwaGVyKSB7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QXzI1NjoKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9HQ01QOgotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0dDTVBfMjU2OgotCQkJcG4gPSBhdG9taWM2NF9pbmNfcmV0dXJuKCZmYXN0X3R4LT5rZXktPmNvbmYudHhfcG4pOwotCQkJY3J5cHRvX2hkclswXSA9IHBuOwotCQkJY3J5cHRvX2hkclsxXSA9IHBuID4+IDg7Ci0JCQljcnlwdG9faGRyWzRdID0gcG4gPj4gMTY7Ci0JCQljcnlwdG9faGRyWzVdID0gcG4gPj4gMjQ7Ci0JCQljcnlwdG9faGRyWzZdID0gcG4gPj4gMzI7Ci0JCQljcnlwdG9faGRyWzddID0gcG4gPj4gNDA7Ci0JCQlicmVhazsKLQkJfQotCX0KKwlpZWVlODAyMTFfeG1pdF9mYXN0X2ZpbmlzaChzZGF0YSwgc3RhLCBmYXN0X3R4LT5wbl9vZmZzLAorCQkJCSAgIGZhc3RfdHgtPmtleSwgc2tiKTsKIAogCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikKIAkJc2RhdGEgPSBjb250YWluZXJfb2Yoc2RhdGEtPmJzcywKQEAgLTMzMzksNiArMzM3NCw5NCBAQAogCXJldHVybiB0cnVlOwogfQogCitzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3R4X2RlcXVldWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4cSAqdHhxKQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaHdfdG9fbG9jYWwoaHcpOworCXN0cnVjdCB0eHFfaW5mbyAqdHhxaSA9IGNvbnRhaW5lcl9vZih0eHEsIHN0cnVjdCB0eHFfaW5mbywgdHhxKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBmcSAqZnEgPSAmbG9jYWwtPmZxOworCXN0cnVjdCBmcV90aW4gKnRpbiA9ICZ0eHFpLT50aW47CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOworCXN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSB0eDsKKwlpZWVlODAyMTFfdHhfcmVzdWx0IHI7CisKKwlzcGluX2xvY2tfYmgoJmZxLT5sb2NrKTsKKworCWlmICh0ZXN0X2JpdChJRUVFODAyMTFfVFhRX1NUT1AsICZ0eHFpLT5mbGFncykpCisJCWdvdG8gb3V0OworCisJLyogTWFrZSBzdXJlIGZyYWdtZW50cyBzdGF5IHRvZ2V0aGVyLiAqLworCXNrYiA9IF9fc2tiX2RlcXVldWUoJnR4cWktPmZyYWdzKTsKKwlpZiAoc2tiKQorCQlnb3RvIG91dDsKKworYmVnaW46CisJc2tiID0gZnFfdGluX2RlcXVldWUoZnEsIHRpbiwgZnFfdGluX2RlcXVldWVfZnVuYyk7CisJaWYgKCFza2IpCisJCWdvdG8gb3V0OworCisJaWVlZTgwMjExX3NldF9za2JfdmlmKHNrYiwgdHhxaSk7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKworCW1lbXNldCgmdHgsIDAsIHNpemVvZih0eCkpOworCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdHguc2ticyk7CisJdHgubG9jYWwgPSBsb2NhbDsKKwl0eC5za2IgPSBza2I7CisJdHguc2RhdGEgPSB2aWZfdG9fc2RhdGEoaW5mby0+Y29udHJvbC52aWYpOworCisJaWYgKHR4cS0+c3RhKQorCQl0eC5zdGEgPSBjb250YWluZXJfb2YodHhxLT5zdGEsIHN0cnVjdCBzdGFfaW5mbywgc3RhKTsKKworCS8qCisJICogVGhlIGtleSBjYW4gYmUgcmVtb3ZlZCB3aGlsZSB0aGUgcGFja2V0IHdhcyBxdWV1ZWQsIHNvIG5lZWQgdG8gY2FsbAorCSAqIHRoaXMgaGVyZSB0byBnZXQgdGhlIGN1cnJlbnQga2V5LgorCSAqLworCXIgPSBpZWVlODAyMTFfdHhfaF9zZWxlY3Rfa2V5KCZ0eCk7CisJaWYgKHIgIT0gVFhfQ09OVElOVUUpIHsKKwkJaWVlZTgwMjExX2ZyZWVfdHhza2IoJmxvY2FsLT5odywgc2tiKTsKKwkJZ290byBiZWdpbjsKKwl9CisKKwlpZiAoaW5mby0+Y29udHJvbC5mbGFncyAmIElFRUU4MDIxMV9UWF9DVFJMX0ZBU1RfWE1JVCkgeworCQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IGNvbnRhaW5lcl9vZih0eHEtPnN0YSwgc3RydWN0IHN0YV9pbmZvLAorCQkJCQkJICAgIHN0YSk7CisJCXU4IHBuX29mZnMgPSAwOworCisJCWlmICh0eC5rZXkgJiYKKwkJICAgICh0eC5rZXktPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVYpKQorCQkJcG5fb2ZmcyA9IGllZWU4MDIxMV9oZHJsZW4oaGRyLT5mcmFtZV9jb250cm9sKTsKKworCQlpZWVlODAyMTFfeG1pdF9mYXN0X2ZpbmlzaChzdGEtPnNkYXRhLCBzdGEsIHBuX29mZnMsCisJCQkJCSAgIHR4LmtleSwgc2tiKTsKKwl9IGVsc2UgeworCQlpZiAoaW52b2tlX3R4X2hhbmRsZXJzX2xhdGUoJnR4KSkKKwkJCWdvdG8gYmVnaW47CisKKwkJc2tiID0gX19za2JfZGVxdWV1ZSgmdHguc2ticyk7CisKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnR4LnNrYnMpKQorCQkJc2tiX3F1ZXVlX3NwbGljZV90YWlsKCZ0eC5za2JzLCAmdHhxaS0+ZnJhZ3MpOworCX0KKworCWlmIChza2IgJiYgc2tiX2hhc19mcmFnX2xpc3Qoc2tiKSAmJgorCSAgICAhaWVlZTgwMjExX2h3X2NoZWNrKCZsb2NhbC0+aHcsIFRYX0ZSQUdfTElTVCkpIHsKKwkJaWYgKHNrYl9saW5lYXJpemUoc2tiKSkgeworCQkJaWVlZTgwMjExX2ZyZWVfdHhza2IoJmxvY2FsLT5odywgc2tiKTsKKwkJCWdvdG8gYmVnaW47CisJCX0KKwl9CisKK291dDoKKwlzcGluX3VubG9ja19iaCgmZnEtPmxvY2spOworCisJcmV0dXJuIHNrYjsKK30KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3R4X2RlcXVldWUpOworCiB2b2lkIF9faWVlZTgwMjExX3N1YmlmX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICB1MzIgaW5mb19mbGFncykKQEAgLTMzNjMsNyArMzQ4Niw3IEBACiAJCWZhc3RfdHggPSByY3VfZGVyZWZlcmVuY2Uoc3RhLT5mYXN0X3R4KTsKIAogCQlpZiAoZmFzdF90eCAmJgotCQkgICAgaWVlZTgwMjExX3htaXRfZmFzdChzZGF0YSwgZGV2LCBzdGEsIGZhc3RfdHgsIHNrYikpCisJCSAgICBpZWVlODAyMTFfeG1pdF9mYXN0KHNkYXRhLCBzdGEsIGZhc3RfdHgsIHNrYikpCiAJCQlnb3RvIG91dDsKIAl9CiAKQEAgLTQyNzUsNyArNDM5OCw3IEBACiAJCQlzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKHNrYi0+ZGV2KTsKIAkJaWYgKCFpZWVlODAyMTFfdHhfcHJlcGFyZShzZGF0YSwgJnR4LCBOVUxMLCBza2IpKQogCQkJYnJlYWs7Ci0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWllZWU4MDIxMV9mcmVlX3R4c2tiKGh3LCBza2IpOwogCX0KIAogCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CkBAIC00MzkwLDkgKzQ1MTMsNiBAQAogCWludCBhYyA9IGllZWU4MDJfMWRfdG9fYWNbdGlkICYgN107CiAKIAlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwotCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwotCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7Ci0KIAlza2Jfc2V0X3F1ZXVlX21hcHBpbmcoc2tiLCBhYyk7CiAJc2tiLT5wcmlvcml0eSA9IHRpZDsKIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3V0aWwuYyBiL25ldC9tYWM4MDIxMS91dGlsLmMKaW5kZXggNDJiZjBiNi4uNTQ1Yzc5YSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3V0aWwuYworKysgYi9uZXQvbWFjODAyMTEvdXRpbC5jCkBAIC01OTgsNyArNTk4LDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZGF0YSwgJmxvY2FsLT5pbnRlcmZhY2VzLCBsaXN0KSB7CiAJCXN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKLQkJCWlmICghKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQUNUSVZFKSkKKwkJCWlmICghKHNkYXRhLT51Lm1udHIuZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQUNUSVZFKSkKIAkJCQljb250aW51ZTsKIAkJCWJyZWFrOwogCQljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CkBAIC0xMjA5LDcgKzEyMDksOCBAQAogCX0KIAogCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiAmJgotCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSkgeworCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSAmJgorCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKSB7CiAJCXNkYXRhLT52aWYuYnNzX2NvbmYucW9zID0gZW5hYmxlX3FvczsKIAkJaWYgKGJzc19ub3RpZnkpCiAJCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwKQEAgLTE3NDgsNiArMTc0OSw0NiBAQAogCW11dGV4X3VubG9jaygmbG9jYWwtPnN0YV9tdHgpOwogfQogCitzdGF0aWMgaW50IGllZWU4MDIxMV9yZWNvbmZpZ19uYW4oc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCit7CisJc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpmdW5jLCAqKmZ1bmNzOworCWludCByZXMsIGlkLCBpID0gMDsKKworCXJlcyA9IGRydl9zdGFydF9uYW4oc2RhdGEtPmxvY2FsLCBzZGF0YSwKKwkJCSAgICAmc2RhdGEtPnUubmFuLmNvbmYpOworCWlmIChXQVJOX09OKHJlcykpCisJCXJldHVybiByZXM7CisKKwlmdW5jcyA9IGt6YWxsb2MoKHNkYXRhLT5sb2NhbC0+aHcubWF4X25hbl9kZV9lbnRyaWVzICsgMSkgKgorCQkJc2l6ZW9mKCpmdW5jcyksIEdGUF9LRVJORUwpOworCWlmICghZnVuY3MpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogQWRkIGFsbCB0aGUgZnVuY3Rpb25zOgorCSAqIFRoaXMgaXMgYSBsaXR0bGUgYml0IHVnbHkuIFdlIG5lZWQgdG8gY2FsbCBhIHBvdGVudGlhbGx5IHNsZWVwaW5nCisJICogY2FsbGJhY2sgZm9yIGVhY2ggTkFOIGZ1bmN0aW9uLCBzbyB3ZSBjYW4ndCBob2xkIHRoZSBzcGlubG9jay4KKwkgKi8KKwlzcGluX2xvY2tfYmgoJnNkYXRhLT51Lm5hbi5mdW5jX2xvY2spOworCisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZzZGF0YS0+dS5uYW4uZnVuY3Rpb25faW5zdF9pZHMsIGZ1bmMsIGlkKQorCQlmdW5jc1tpKytdID0gZnVuYzsKKworCXNwaW5fdW5sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKworCWZvciAoaSA9IDA7IGZ1bmNzW2ldOyBpKyspIHsKKwkJcmVzID0gZHJ2X2FkZF9uYW5fZnVuYyhzZGF0YS0+bG9jYWwsIHNkYXRhLCBmdW5jc1tpXSk7CisJCWlmIChXQVJOX09OKHJlcykpCisJCQlpZWVlODAyMTFfbmFuX2Z1bmNfdGVybWluYXRlZCgmc2RhdGEtPnZpZiwKKwkJCQkJCSAgICAgIGZ1bmNzW2ldLT5pbnN0YW5jZV9pZCwKKwkJCQkJCSAgICAgIE5MODAyMTFfTkFOX0ZVTkNfVEVSTV9SRUFTT05fRVJST1IsCisJCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKKwl9CisKKwlrZnJlZShmdW5jcyk7CisKKwlyZXR1cm4gMDsKK30KKwogaW50IGllZWU4MDIxMV9yZWNvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9ICZsb2NhbC0+aHc7CkBAIC0xOTcxLDYgKzIwMTIsMTMgQEAKIAkJCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgY2hhbmdlZCk7CiAJCQl9CiAJCQlicmVhazsKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CisJCQlyZXMgPSBpZWVlODAyMTFfcmVjb25maWdfbmFuKHNkYXRhKTsKKwkJCWlmIChyZXMgPCAwKSB7CisJCQkJaWVlZTgwMjExX2hhbmRsZV9yZWNvbmZpZ19mYWlsdXJlKGxvY2FsKTsKKwkJCQlyZXR1cm4gcmVzOworCQkJfQorCQkJYnJlYWs7CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfV0RTOgogCQljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKQEAgLTI1NTUsNyArMjYwMyw2IEBACiAKIAkJaWYgKG5lZWRfYmFzaWMgJiYgYmFzaWNfcmF0ZXMgJiBCSVQoaSkpCiAJCQliYXNpYyA9IDB4ODA7Ci0JCXJhdGUgPSBzYmFuZC0+Yml0cmF0ZXNbaV0uYml0cmF0ZTsKIAkJcmF0ZSA9IERJVl9ST1VORF9VUChzYmFuZC0+Yml0cmF0ZXNbaV0uYml0cmF0ZSwKIAkJCQkgICAgNSAqICgxIDw8IHNoaWZ0KSk7CiAJCSpwb3MrKyA9IGJhc2ljIHwgKHU4KSByYXRlOwpAQCAtMzM5NCwxMSArMzQ0MSwxOCBAQAogCQkJICAgICB1bnNpZ25lZCBsb25nICpieXRlX2NudCkKIHsKIAlzdHJ1Y3QgdHhxX2luZm8gKnR4cWkgPSB0b190eHFfaW5mbyh0eHEpOworCXUzMiBmcmFnX2NudCA9IDAsIGZyYWdfYnl0ZXMgPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2JfcXVldWVfd2FsaygmdHhxaS0+ZnJhZ3MsIHNrYikgeworCQlmcmFnX2NudCsrOworCQlmcmFnX2J5dGVzICs9IHNrYi0+bGVuOworCX0KIAogCWlmIChmcmFtZV9jbnQpCi0JCSpmcmFtZV9jbnQgPSB0eHFpLT50aW4uYmFja2xvZ19wYWNrZXRzOworCQkqZnJhbWVfY250ID0gdHhxaS0+dGluLmJhY2tsb2dfcGFja2V0cyArIGZyYWdfY250OwogCiAJaWYgKGJ5dGVfY250KQotCQkqYnl0ZV9jbnQgPSB0eHFpLT50aW4uYmFja2xvZ19ieXRlczsKKwkJKmJ5dGVfY250ID0gdHhxaS0+dGluLmJhY2tsb2dfYnl0ZXMgKyBmcmFnX2J5dGVzOwogfQogRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfdHhxX2dldF9kZXB0aCk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTU0L2lmYWNlLmMgYi9uZXQvbWFjODAyMTU0L2lmYWNlLmMKaW5kZXggNzA3OWNkMy4uMDYwMTlkYiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjE1NC9pZmFjZS5jCisrKyBiL25ldC9tYWM4MDIxNTQvaWZhY2UuYwpAQCAtNjYzLDYgKzY2Myw3IEBACiAKIAkvKiBUT0RPIGNoZWNrIHRoaXMgKi8KIAlTRVRfTkVUREVWX0RFVihuZGV2LCAmbG9jYWwtPnBoeS0+ZGV2KTsKKwlkZXZfbmV0X3NldChuZGV2LCB3cGFuX3BoeV9uZXQobG9jYWwtPmh3LnBoeSkpOwogCXNkYXRhID0gbmV0ZGV2X3ByaXYobmRldik7CiAJbmRldi0+aWVlZTgwMjE1NF9wdHIgPSAmc2RhdGEtPndwYW5fZGV2OwogCW1lbWNweShzZGF0YS0+bmFtZSwgbmRldi0+bmFtZSwgSUZOQU1TSVopOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjE1NC9yeC5jIGIvbmV0L21hYzgwMjE1NC9yeC5jCmluZGV4IDQ0NmUxMzAuLjRkY2Y2ZTEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxNTQvcnguYworKysgYi9uZXQvbWFjODAyMTU0L3J4LmMKQEAgLTEwMSwxMSArMTAxLDE2IEBACiAJc2RhdGEtPmRldi0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CiAKIAlzd2l0Y2ggKG1hY19jYihza2IpLT50eXBlKSB7CisJY2FzZSBJRUVFODAyMTU0X0ZDX1RZUEVfQkVBQ09OOgorCWNhc2UgSUVFRTgwMjE1NF9GQ19UWVBFX0FDSzoKKwljYXNlIElFRUU4MDIxNTRfRkNfVFlQRV9NQUNfQ01EOgorCQlnb3RvIGZhaWw7CisKIAljYXNlIElFRUU4MDIxNTRfRkNfVFlQRV9EQVRBOgogCQlyZXR1cm4gaWVlZTgwMjE1NF9kZWxpdmVyX3NrYihza2IpOwogCWRlZmF1bHQ6Ci0JCXByX3dhcm4oImllZWU4MDIxNTQ6IGJhZCBmcmFtZSByZWNlaXZlZCAodHlwZSA9ICVkKVxuIiwKLQkJCW1hY19jYihza2IpLT50eXBlKTsKKwkJcHJfd2Fybl9yYXRlbGltaXRlZCgiaWVlZTgwMjE1NDogYmFkIGZyYW1lIHJlY2VpdmVkICIKKwkJCQkgICAgIih0eXBlID0gJWQpXG4iLCBtYWNfY2Ioc2tiKS0+dHlwZSk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9tcGxzL2FmX21wbHMuYyBiL25ldC9tcGxzL2FmX21wbHMuYwppbmRleCA1YzE2MWU3Li4wZTQzMzRjIDEwMDY0NAotLS0gYS9uZXQvbXBscy9hZl9tcGxzLmMKKysrIGIvbmV0L21wbHMvYWZfbXBscy5jCkBAIC05NjEsOSArOTYxLDYgQEAKIAkJCQlSQ1VfSU5JVF9QT0lOVEVSKG5oLT5uaF9kZXYsIE5VTEwpOwogCQl9IGVuZGZvcl9uZXh0aG9wcyhydCk7CiAJfQotCi0KLQlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIG1wbHNfaWZ1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbmhfZmxhZ3MpCkBAIC05OTcsOCArOTk0LDYgQEAKIAogCQlBQ0NFU1NfT05DRShydC0+cnRfbmhuX2FsaXZlKSA9IGFsaXZlOwogCX0KLQotCXJldHVybjsKIH0KIAogc3RhdGljIGludCBtcGxzX2Rldl9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LApkaWZmIC0tZ2l0IGEvbmV0L21wbHMvaW50ZXJuYWwuaCBiL25ldC9tcGxzL2ludGVybmFsLmgKaW5kZXggNzMyYTVjMS4uYmRmZWY2YyAxMDA2NDQKLS0tIGEvbmV0L21wbHMvaW50ZXJuYWwuaAorKysgYi9uZXQvbXBscy9pbnRlcm5hbC5oCkBAIC0xLDkgKzEsNiBAQAogI2lmbmRlZiBNUExTX0lOVEVSTkFMX0gKICNkZWZpbmUgTVBMU19JTlRFUk5BTF9ICi0KLXN0cnVjdCBtcGxzX3NoaW1faGRyIHsKLQlfX2JlMzIgbGFiZWxfc3RhY2tfZW50cnk7Ci19OworI2luY2x1ZGUgPG5ldC9tcGxzLmg+CiAKIHN0cnVjdCBtcGxzX2VudHJ5X2RlY29kZWQgewogCXUzMiBsYWJlbDsKQEAgLTkzLDExICs5MCw2IEBACiAKICNkZWZpbmUgZW5kZm9yX25leHRob3BzKHJ0KSB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IG1wbHNfc2hpbV9oZHIgKm1wbHNfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JcmV0dXJuIChzdHJ1Y3QgbXBsc19zaGltX2hkciAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwotfQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBtcGxzX3NoaW1faGRyIG1wbHNfZW50cnlfZW5jb2RlKHUzMiBsYWJlbCwgdW5zaWduZWQgdHRsLCB1bnNpZ25lZCB0YywgYm9vbCBib3MpCiB7CiAJc3RydWN0IG1wbHNfc2hpbV9oZHIgcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbmV0L21wbHMvbXBsc19nc28uYyBiL25ldC9tcGxzL21wbHNfZ3NvLmMKaW5kZXggMjA1NWU1Ny4uYjRkYTZkOCAxMDA2NDQKLS0tIGEvbmV0L21wbHMvbXBsc19nc28uYworKysgYi9uZXQvbXBscy9tcGxzX2dzby5jCkBAIC0yMywzMiArMjMsNTAgQEAKIAkJCQkgICAgICAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNlZ3MgPSBFUlJfUFRSKC1FSU5WQUwpOworCXUxNiBtYWNfb2Zmc2V0ID0gc2tiLT5tYWNfaGVhZGVyOwogCW5ldGRldl9mZWF0dXJlc190IG1wbHNfZmVhdHVyZXM7CisJdTE2IG1hY19sZW4gPSBza2ItPm1hY19sZW47CiAJX19iZTE2IG1wbHNfcHJvdG9jb2w7CisJdW5zaWduZWQgaW50IG1wbHNfaGxlbjsKKworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCW1wbHNfaGxlbiA9IHNrYl9pbm5lcl9uZXR3b3JrX2hlYWRlcihza2IpIC0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CisJaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgbXBsc19obGVuKSkpCisJCWdvdG8gb3V0OwogCiAJLyogU2V0dXAgaW5uZXIgU0tCLiAqLwogCW1wbHNfcHJvdG9jb2wgPSBza2ItPnByb3RvY29sOwogCXNrYi0+cHJvdG9jb2wgPSBza2ItPmlubmVyX3Byb3RvY29sOwogCi0JLyogUHVzaCBiYWNrIHRoZSBtYWMgaGVhZGVyIHRoYXQgc2tiX21hY19nc29fc2VnbWVudCgpIGhhcyBwdWxsZWQuCi0JICogSXQgd2lsbCBiZSByZS1wdWxsZWQgYnkgdGhlIGNhbGwgdG8gc2tiX21hY19nc29fc2VnbWVudCgpIGJlbG93Ci0JICovCi0JX19za2JfcHVzaChza2IsIHNrYi0+bWFjX2xlbik7CisJX19za2JfcHVsbChza2IsIG1wbHNfaGxlbik7CisKKwlza2ItPm1hY19sZW4gPSAwOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAKIAkvKiBTZWdtZW50IGlubmVyIHBhY2tldC4gKi8KIAltcGxzX2ZlYXR1cmVzID0gc2tiLT5kZXYtPm1wbHNfZmVhdHVyZXMgJiBmZWF0dXJlczsKIAlzZWdzID0gc2tiX21hY19nc29fc2VnbWVudChza2IsIG1wbHNfZmVhdHVyZXMpOworCWlmIChJU19FUlJfT1JfTlVMTChzZWdzKSkgeworCQlza2JfZ3NvX2Vycm9yX3Vud2luZChza2IsIG1wbHNfcHJvdG9jb2wsIG1wbHNfaGxlbiwgbWFjX29mZnNldCwKKwkJCQkgICAgIG1hY19sZW4pOworCQlnb3RvIG91dDsKKwl9CisJc2tiID0gc2VnczsKIAorCW1wbHNfaGxlbiArPSBtYWNfbGVuOworCWRvIHsKKwkJc2tiLT5tYWNfbGVuID0gbWFjX2xlbjsKKwkJc2tiLT5wcm90b2NvbCA9IG1wbHNfcHJvdG9jb2w7CiAKLQkvKiBSZXN0b3JlIG91dGVyIHByb3RvY29sLiAqLwotCXNrYi0+cHJvdG9jb2wgPSBtcGxzX3Byb3RvY29sOworCQlza2JfcmVzZXRfaW5uZXJfbmV0d29ya19oZWFkZXIoc2tiKTsKIAotCS8qIFJlLXB1bGwgdGhlIG1hYyBoZWFkZXIgdGhhdCB0aGUgY2FsbCB0byBza2JfbWFjX2dzb19zZWdtZW50KCkKLQkgKiBhYm92ZSBwdWxsZWQuICBJdCB3aWxsIGJlIHJlLXB1c2hlZCBhZnRlciByZXR1cm5pbmcKLQkgKiBza2JfbWFjX2dzb19zZWdtZW50KCksIGFuIGluZGlyZWN0IGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uLgotCSAqLwotCV9fc2tiX3B1bGwoc2tiLCBza2ItPmRhdGEgLSBza2JfbWFjX2hlYWRlcihza2IpKTsKKwkJX19za2JfcHVzaChza2IsIG1wbHNfaGxlbik7CiAKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwkJc2tiX3NldF9uZXR3b3JrX2hlYWRlcihza2IsIG1hY19sZW4pOworCX0gd2hpbGUgKChza2IgPSBza2ItPm5leHQpKTsKKworb3V0OgogCXJldHVybiBzZWdzOwogfQogCmRpZmYgLS1naXQgYS9uZXQvbXBscy9tcGxzX2lwdHVubmVsLmMgYi9uZXQvbXBscy9tcGxzX2lwdHVubmVsLmMKaW5kZXggNjQ0YThkYS4uY2Y1MmNmMyAxMDA2NDQKLS0tIGEvbmV0L21wbHMvbXBsc19pcHR1bm5lbC5jCisrKyBiL25ldC9tcGxzL21wbHNfaXB0dW5uZWwuYwpAQCAtMzcsNyArMzcsNyBAQAogCXJldHVybiBlbi0+bGFiZWxzICogc2l6ZW9mKHN0cnVjdCBtcGxzX3NoaW1faGRyKTsKIH0KIAotc3RhdGljIGludCBtcGxzX291dHB1dChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgbXBsc194bWl0KHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG1wbHNfaXB0dW5uZWxfZW5jYXAgKnR1bl9lbmNhcF9pbmZvOwogCXN0cnVjdCBtcGxzX3NoaW1faGRyICpoZHI7CkBAIC05MCw3ICs5MCwxMSBAQAogCWlmIChza2JfY293KHNrYiwgaGhfbGVuICsgbmV3X2hlYWRlcl9zaXplKSkKIAkJZ290byBkcm9wOwogCisJc2tiX3NldF9pbm5lcl9wcm90b2NvbChza2IsIHNrYi0+cHJvdG9jb2wpOworCXNrYl9yZXNldF9pbm5lcl9uZXR3b3JrX2hlYWRlcihza2IpOworCiAJc2tiX3B1c2goc2tiLCBuZXdfaGVhZGVyX3NpemUpOworCiAJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAlza2ItPmRldiA9IG91dF9kZXY7CkBAIC0xMTUsNyArMTE5LDcgQEAKIAkJbmV0X2RiZ19yYXRlbGltaXRlZCgiJXM6IHBhY2tldCB0cmFuc21pc3Npb24gZmFpbGVkOiAlZFxuIiwKIAkJCQkgICAgX19mdW5jX18sIGVycik7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gTFdUVU5ORUxfWE1JVF9ET05FOwogCiBkcm9wOgogCWtmcmVlX3NrYihza2IpOwpAQCAtMTUzLDcgKzE1Nyw4IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJvdXQ7CiAJbmV3dHMtPnR5cGUgPSBMV1RVTk5FTF9FTkNBUF9NUExTOwotCW5ld3RzLT5mbGFncyB8PSBMV1RVTk5FTF9TVEFURV9PVVRQVVRfUkVESVJFQ1Q7CisJbmV3dHMtPmZsYWdzIHw9IExXVFVOTkVMX1NUQVRFX1hNSVRfUkVESVJFQ1Q7CisJbmV3dHMtPmhlYWRyb29tID0gbXBsc19lbmNhcF9zaXplKHR1bl9lbmNhcF9pbmZvKTsKIAogCSp0cyA9IG5ld3RzOwogCkBAIC0yMDksNyArMjE0LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBsd3R1bm5lbF9lbmNhcF9vcHMgbXBsc19pcHR1bl9vcHMgPSB7CiAJLmJ1aWxkX3N0YXRlID0gbXBsc19idWlsZF9zdGF0ZSwKLQkub3V0cHV0ID0gbXBsc19vdXRwdXQsCisJLnhtaXQgPSBtcGxzX3htaXQsCiAJLmZpbGxfZW5jYXAgPSBtcGxzX2ZpbGxfZW5jYXBfaW5mbywKIAkuZ2V0X2VuY2FwX3NpemUgPSBtcGxzX2VuY2FwX25sc2l6ZSwKIAkuY21wX2VuY2FwID0gbXBsc19lbmNhcF9jbXAsCmRpZmYgLS1naXQgYS9uZXQvbmNzaS9pbnRlcm5hbC5oIGIvbmV0L25jc2kvaW50ZXJuYWwuaAppbmRleCAzMzczOGMwLi4xMzI5MGE3IDEwMDY0NAotLS0gYS9uZXQvbmNzaS9pbnRlcm5hbC5oCisrKyBiL25ldC9uY3NpL2ludGVybmFsLmgKQEAgLTE3MCw2ICsxNzAsNyBAQAogCiAjZGVmaW5lIE5DU0lfUEFDS0FHRV9TSElGVAk1CiAjZGVmaW5lIE5DU0lfUEFDS0FHRV9JTkRFWChjKQkoKChjKSA+PiBOQ1NJX1BBQ0tBR0VfU0hJRlQpICYgMHg3KQorI2RlZmluZSBOQ1NJX1JFU0VSVkVEX0NIQU5ORUwJMHgxZgogI2RlZmluZSBOQ1NJX0NIQU5ORUxfSU5ERVgoYykJKChjKSAmICgoMSA8PCBOQ1NJX1BBQ0tBR0VfU0hJRlQpIC0gMSkpCiAjZGVmaW5lIE5DU0lfVE9fQ0hBTk5FTChwLCBjKQkoKChwKSA8PCBOQ1NJX1BBQ0tBR0VfU0hJRlQpIHwgKGMpKQogCkBAIC0xODYsOSArMTg3LDE1IEBACiAJc3RydWN0IG5jc2lfY2hhbm5lbF9tb2RlICAgIG1vZGVzW05DU0lfTU9ERV9NQVhdOwogCXN0cnVjdCBuY3NpX2NoYW5uZWxfZmlsdGVyICAqZmlsdGVyc1tOQ1NJX0ZJTFRFUl9NQVhdOwogCXN0cnVjdCBuY3NpX2NoYW5uZWxfc3RhdHMgICBzdGF0czsKLQlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICAgICAgdGltZXI7CS8qIExpbmsgbW9uaXRvciB0aW1lciAgKi8KLQlib29sICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDsJLyogVGltZXIgaXMgZW5hYmxlZCAgICAqLwotCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgICB0aW1lb3V0OwkvKiBUaW1lcyBvZiB0aW1lb3V0ICAgICovCisJc3RydWN0IHsKKwkJc3RydWN0IHRpbWVyX2xpc3QgICB0aW1lcjsKKwkJYm9vbCAgICAgICAgICAgICAgICBlbmFibGVkOworCQl1bnNpZ25lZCBpbnQgICAgICAgIHN0YXRlOworI2RlZmluZSBOQ1NJX0NIQU5ORUxfTU9OSVRPUl9TVEFSVAkwCisjZGVmaW5lIE5DU0lfQ0hBTk5FTF9NT05JVE9SX1JFVFJZCTEKKyNkZWZpbmUgTkNTSV9DSEFOTkVMX01PTklUT1JfV0FJVAkyCisjZGVmaW5lIE5DU0lfQ0hBTk5FTF9NT05JVE9SX1dBSVRfTUFYCTUKKwl9IG1vbml0b3I7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgIG5vZGU7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgIGxpbms7CiB9OwpAQCAtMjA2LDcgKzIxMyw4IEBACiBzdHJ1Y3QgbmNzaV9yZXF1ZXN0IHsKIAl1bnNpZ25lZCBjaGFyICAgICAgICBpZDsgICAgICAvKiBSZXF1ZXN0IElEIC0gMCB0byAyNTUgICAgICAgICAgICovCiAJYm9vbCAgICAgICAgICAgICAgICAgdXNlZDsgICAgLyogUmVxdWVzdCB0aGF0IGhhcyBiZWVuIGFzc2lnbmVkICAqLwotCWJvb2wgICAgICAgICAgICAgICAgIGRyaXZlbjsgIC8qIERyaXZlIHN0YXRlIG1hY2hpbmUgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICBmbGFnczsgICAvKiBOQ1NJIHJlcXVlc3QgcHJvcGVydHkgICAgICAgICAgICovCisjZGVmaW5lIE5DU0lfUkVRX0ZMQUdfRVZFTlRfRFJJVkVOCTEKIAlzdHJ1Y3QgbmNzaV9kZXZfcHJpdiAqbmRwOyAgICAvKiBBc3NvY2lhdGVkIE5DU0kgZGV2aWNlICAgICAgICAgICovCiAJc3RydWN0IHNrX2J1ZmYgICAgICAgKmNtZDsgICAgLyogQXNzb2NpYXRlZCBOQ1NJIGNvbW1hbmQgcGFja2V0ICAqLwogCXN0cnVjdCBza19idWZmICAgICAgICpyc3A7ICAgIC8qIEFzc29jaWF0ZWQgTkNTSSByZXNwb25zZSBwYWNrZXQgKi8KQEAgLTI1OCw2ICsyNjYsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgICAgcGFja2FnZXM7ICAgICAgICAvKiBMaXN0IG9mIHBhY2thZ2VzICAgICAgICAgICAqLwogCXN0cnVjdCBuY3NpX3JlcXVlc3QgcmVxdWVzdHNbMjU2XTsgICAvKiBSZXF1ZXN0IHRhYmxlICAgICAgICAgICAgICAqLwogCXVuc2lnbmVkIGludCAgICAgICAgcmVxdWVzdF9pZDsgICAgICAvKiBMYXN0IHVzZWQgcmVxdWVzdCBJRCAgICAgICAqLworI2RlZmluZSBOQ1NJX1JFUV9TVEFSVF9JRFgJMQogCXVuc2lnbmVkIGludCAgICAgICAgcGVuZGluZ19yZXFfbnVtOyAvKiBOdW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0cyAqLwogCXN0cnVjdCBuY3NpX3BhY2thZ2UgKmFjdGl2ZV9wYWNrYWdlOyAvKiBDdXJyZW50bHkgaGFuZGxlZCBwYWNrYWdlICAqLwogCXN0cnVjdCBuY3NpX2NoYW5uZWwgKmFjdGl2ZV9jaGFubmVsOyAvKiBDdXJyZW50bHkgaGFuZGxlZCBjaGFubmVsICAqLwpAQCAtMjc0LDcgKzI4Myw3IEBACiAJdW5zaWduZWQgY2hhciAgICAgICAgcGFja2FnZTsgICAgIC8qIERlc3RpbmF0aW9uIHBhY2thZ2UgSUQgICAgICAgICovCiAJdW5zaWduZWQgY2hhciAgICAgICAgY2hhbm5lbDsgICAgIC8qIERldGluYXRpb24gY2hhbm5lbCBJRCBvciAweDFmICovCiAJdW5zaWduZWQgc2hvcnQgICAgICAgcGF5bG9hZDsgICAgIC8qIENvbW1hbmQgcGFja2V0IHBheWxvYWQgbGVuZ3RoICovCi0JYm9vbCAgICAgICAgICAgICAgICAgZHJpdmVuOyAgICAgIC8qIERyaXZlIHRoZSBzdGF0ZSBtYWNoaW5lPyAgICAgICovCisJdW5zaWduZWQgaW50ICAgICAgICAgcmVxX2ZsYWdzOyAgIC8qIE5DU0kgcmVxdWVzdCBwcm9wZXJ0aWVzICAgICAgICovCiAJdW5pb24gewogCQl1bnNpZ25lZCBjaGFyICBieXRlc1sxNl07IC8qIENvbW1hbmQgcGFja2V0IHNwZWNpZmljIGRhdGEgICovCiAJCXVuc2lnbmVkIHNob3J0IHdvcmRzWzhdOwpAQCAtMzEzLDcgKzMyMiw4IEBACiAJCQkJICAgdW5zaWduZWQgY2hhciBpZCwKIAkJCQkgICBzdHJ1Y3QgbmNzaV9wYWNrYWdlICoqbnAsCiAJCQkJICAgc3RydWN0IG5jc2lfY2hhbm5lbCAqKm5jKTsKLXN0cnVjdCBuY3NpX3JlcXVlc3QgKm5jc2lfYWxsb2NfcmVxdWVzdChzdHJ1Y3QgbmNzaV9kZXZfcHJpdiAqbmRwLCBib29sIGRyaXZlbik7CitzdHJ1Y3QgbmNzaV9yZXF1ZXN0ICpuY3NpX2FsbG9jX3JlcXVlc3Qoc3RydWN0IG5jc2lfZGV2X3ByaXYgKm5kcCwKKwkJCQkJdW5zaWduZWQgaW50IHJlcV9mbGFncyk7CiB2b2lkIG5jc2lfZnJlZV9yZXF1ZXN0KHN0cnVjdCBuY3NpX3JlcXVlc3QgKm5yKTsKIHN0cnVjdCBuY3NpX2RldiAqbmNzaV9maW5kX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGludCBuY3NpX3Byb2Nlc3NfbmV4dF9jaGFubmVsKHN0cnVjdCBuY3NpX2Rldl9wcml2ICpuZHApOwpkaWZmIC0tZ2l0IGEvbmV0L25jc2kvbmNzaS1hZW4uYyBiL25ldC9uY3NpL25jc2ktYWVuLmMKaW5kZXggZDQ2MzQ2OC4uYjQxYTY2MSAxMDA2NDQKLS0tIGEvbmV0L25jc2kvbmNzaS1hZW4uYworKysgYi9uZXQvbmNzaS9uY3NpLWFlbi5jCkBAIC01Myw3ICs1Myw5IEBACiAJc3RydWN0IG5jc2lfYWVuX2xzY19wa3QgKmxzYzsKIAlzdHJ1Y3QgbmNzaV9jaGFubmVsICpuYzsKIAlzdHJ1Y3QgbmNzaV9jaGFubmVsX21vZGUgKm5jbTsKLQl1bnNpZ25lZCBsb25nIG9sZF9kYXRhOworCWJvb2wgY2hhaW5lZDsKKwlpbnQgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBvbGRfZGF0YSwgZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogRmluZCB0aGUgTkNTSSBjaGFubmVsICovCkBAIC02MiwyMCArNjQsMjcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBVcGRhdGUgdGhlIGxpbmsgc3RhdHVzICovCi0JbmNtID0gJm5jLT5tb2Rlc1tOQ1NJX01PREVfTElOS107CiAJbHNjID0gKHN0cnVjdCBuY3NpX2Flbl9sc2NfcGt0ICopaDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZuYy0+bG9jaywgZmxhZ3MpOworCW5jbSA9ICZuYy0+bW9kZXNbTkNTSV9NT0RFX0xJTktdOwogCW9sZF9kYXRhID0gbmNtLT5kYXRhWzJdOwotCW5jbS0+ZGF0YVsyXSA9IG50b2hsKGxzYy0+c3RhdHVzKTsKKwlkYXRhID0gbnRvaGwobHNjLT5zdGF0dXMpOworCW5jbS0+ZGF0YVsyXSA9IGRhdGE7CiAJbmNtLT5kYXRhWzRdID0gbnRvaGwobHNjLT5vZW1fc3RhdHVzKTsKLQlpZiAoISgob2xkX2RhdGEgXiBuY20tPmRhdGFbMl0pICYgMHgxKSB8fAotCSAgICAhbGlzdF9lbXB0eSgmbmMtPmxpbmspKQorCisJY2hhaW5lZCA9ICFsaXN0X2VtcHR5KCZuYy0+bGluayk7CisJc3RhdGUgPSBuYy0+c3RhdGU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKKworCWlmICghKChvbGRfZGF0YSBeIGRhdGEpICYgMHgxKSB8fCBjaGFpbmVkKQogCQlyZXR1cm4gMDsKLQlpZiAoIShuYy0+c3RhdGUgPT0gTkNTSV9DSEFOTkVMX0lOQUNUSVZFICYmIChuY20tPmRhdGFbMl0gJiAweDEpKSAmJgotCSAgICAhKG5jLT5zdGF0ZSA9PSBOQ1NJX0NIQU5ORUxfQUNUSVZFICYmICEobmNtLT5kYXRhWzJdICYgMHgxKSkpCisJaWYgKCEoc3RhdGUgPT0gTkNTSV9DSEFOTkVMX0lOQUNUSVZFICYmIChkYXRhICYgMHgxKSkgJiYKKwkgICAgIShzdGF0ZSA9PSBOQ1NJX0NIQU5ORUxfQUNUSVZFICYmICEoZGF0YSAmIDB4MSkpKQogCQlyZXR1cm4gMDsKIAogCWlmICghKG5kcC0+ZmxhZ3MgJiBOQ1NJX0RFVl9IV0EpICYmCi0JICAgIG5jLT5zdGF0ZSA9PSBOQ1NJX0NIQU5ORUxfQUNUSVZFKQorCSAgICBzdGF0ZSA9PSBOQ1NJX0NIQU5ORUxfQUNUSVZFKQogCQluZHAtPmZsYWdzIHw9IE5DU0lfREVWX1JFU0hVRkZMRTsKIAogCW5jc2lfc3RvcF9jaGFubmVsX21vbml0b3IobmMpOwpAQCAtOTcsMTMgKzEwNiwyMSBAQAogCWlmICghbmMpCiAJCXJldHVybiAtRU5PREVWOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5jLT5sb2NrLCBmbGFncyk7CiAJaWYgKCFsaXN0X2VtcHR5KCZuYy0+bGluaykgfHwKLQkgICAgbmMtPnN0YXRlICE9IE5DU0lfQ0hBTk5FTF9BQ1RJVkUpCisJICAgIG5jLT5zdGF0ZSAhPSBOQ1NJX0NIQU5ORUxfQUNUSVZFKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybiAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCiAJbmNzaV9zdG9wX2NoYW5uZWxfbW9uaXRvcihuYyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm5jLT5sb2NrLCBmbGFncyk7CisJbmMtPnN0YXRlID0gTkNTSV9DSEFOTkVMX0lOVklTSUJMRTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5kcC0+bG9jaywgZmxhZ3MpOwotCXhjaGcoJm5jLT5zdGF0ZSwgTkNTSV9DSEFOTkVMX0lOQUNUSVZFKTsKKwluYy0+c3RhdGUgPSBOQ1NJX0NIQU5ORUxfSU5BQ1RJVkU7CiAJbGlzdF9hZGRfdGFpbF9yY3UoJm5jLT5saW5rLCAmbmRwLT5jaGFubmVsX3F1ZXVlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZHAtPmxvY2ssIGZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvbmV0L25jc2kvbmNzaS1jbWQuYyBiL25ldC9uY3NpL25jc2ktY21kLmMKaW5kZXggMjEwNTdhOC4uZGI3MDgzYiAxMDA2NDQKLS0tIGEvbmV0L25jc2kvbmNzaS1jbWQuYworKysgYi9uZXQvbmNzaS9uY3NpLWNtZC5jCkBAIC0yNzIsNyArMjcyLDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBuY3NpX3JlcXVlc3QgKm5yOwogCi0JbnIgPSBuY3NpX2FsbG9jX3JlcXVlc3QobmRwLCBuY2EtPmRyaXZlbik7CisJbnIgPSBuY3NpX2FsbG9jX3JlcXVlc3QobmRwLCBuY2EtPnJlcV9mbGFncyk7CiAJaWYgKCFucikKIAkJcmV0dXJuIE5VTEw7CiAKZGlmZiAtLWdpdCBhL25ldC9uY3NpL25jc2ktbWFuYWdlLmMgYi9uZXQvbmNzaS9uY3NpLW1hbmFnZS5jCmluZGV4IGVmMDE3YjguLjVlNTA5ZTUgMTAwNjQ0Ci0tLSBhL25ldC9uY3NpL25jc2ktbWFuYWdlLmMKKysrIGIvbmV0L25jc2kvbmNzaS1tYW5hZ2UuYwpAQCAtMTMyLDYgKzEzMiw3IEBACiAJc3RydWN0IG5jc2lfZGV2ICpuZCA9ICZuZHAtPm5kZXY7CiAJc3RydWN0IG5jc2lfcGFja2FnZSAqbnA7CiAJc3RydWN0IG5jc2lfY2hhbm5lbCAqbmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCW5kLT5zdGF0ZSA9IG5jc2lfZGV2X3N0YXRlX2Z1bmN0aW9uYWw7CiAJaWYgKGZvcmNlX2Rvd24pIHsKQEAgLTE0MiwxNCArMTQzLDIxIEBACiAJbmQtPmxpbmtfdXAgPSAwOwogCU5DU0lfRk9SX0VBQ0hfUEFDS0FHRShuZHAsIG5wKSB7CiAJCU5DU0lfRk9SX0VBQ0hfQ0hBTk5FTChucCwgbmMpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZuYy0+bG9jaywgZmxhZ3MpOworCiAJCQlpZiAoIWxpc3RfZW1wdHkoJm5jLT5saW5rKSB8fAotCQkJICAgIG5jLT5zdGF0ZSAhPSBOQ1NJX0NIQU5ORUxfQUNUSVZFKQorCQkJICAgIG5jLT5zdGF0ZSAhPSBOQ1NJX0NIQU5ORUxfQUNUSVZFKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKIAkJCQljb250aW51ZTsKKwkJCX0KIAogCQkJaWYgKG5jLT5tb2Rlc1tOQ1NJX01PREVfTElOS10uZGF0YVsyXSAmIDB4MSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jLT5sb2NrLCBmbGFncyk7CiAJCQkJbmQtPmxpbmtfdXAgPSAxOwogCQkJCWdvdG8gcmVwb3J0OwogCQkJfQorCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCQl9CiAJfQogCkBAIC0xNjMsNDMgKzE3MSw1NSBAQAogCXN0cnVjdCBuY3NpX3BhY2thZ2UgKm5wID0gbmMtPnBhY2thZ2U7CiAJc3RydWN0IG5jc2lfZGV2X3ByaXYgKm5kcCA9IG5wLT5uZHA7CiAJc3RydWN0IG5jc2lfY21kX2FyZyBuY2E7Ci0JYm9vbCBlbmFibGVkOwotCXVuc2lnbmVkIGludCB0aW1lb3V0OworCWJvb2wgZW5hYmxlZCwgY2hhaW5lZDsKKwl1bnNpZ25lZCBpbnQgbW9uaXRvcl9zdGF0ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQ7CisJaW50IHN0YXRlLCByZXQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbmMtPmxvY2ssIGZsYWdzKTsKLQl0aW1lb3V0ID0gbmMtPnRpbWVvdXQ7Ci0JZW5hYmxlZCA9IG5jLT5lbmFibGVkOworCXN0YXRlID0gbmMtPnN0YXRlOworCWNoYWluZWQgPSAhbGlzdF9lbXB0eSgmbmMtPmxpbmspOworCWVuYWJsZWQgPSBuYy0+bW9uaXRvci5lbmFibGVkOworCW1vbml0b3Jfc3RhdGUgPSBuYy0+bW9uaXRvci5zdGF0ZTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKCFlbmFibGVkIHx8ICFsaXN0X2VtcHR5KCZuYy0+bGluaykpCisJaWYgKCFlbmFibGVkIHx8IGNoYWluZWQpCiAJCXJldHVybjsKLQlpZiAobmMtPnN0YXRlICE9IE5DU0lfQ0hBTk5FTF9JTkFDVElWRSAmJgotCSAgICBuYy0+c3RhdGUgIT0gTkNTSV9DSEFOTkVMX0FDVElWRSkKKwlpZiAoc3RhdGUgIT0gTkNTSV9DSEFOTkVMX0lOQUNUSVZFICYmCisJICAgIHN0YXRlICE9IE5DU0lfQ0hBTk5FTF9BQ1RJVkUpCiAJCXJldHVybjsKIAotCWlmICghKHRpbWVvdXQgJSAyKSkgeworCXN3aXRjaCAobW9uaXRvcl9zdGF0ZSkgeworCWNhc2UgTkNTSV9DSEFOTkVMX01PTklUT1JfU1RBUlQ6CisJY2FzZSBOQ1NJX0NIQU5ORUxfTU9OSVRPUl9SRVRSWToKIAkJbmNhLm5kcCA9IG5kcDsKIAkJbmNhLnBhY2thZ2UgPSBucC0+aWQ7CiAJCW5jYS5jaGFubmVsID0gbmMtPmlkOwogCQluY2EudHlwZSA9IE5DU0lfUEtUX0NNRF9HTFM7Ci0JCW5jYS5kcml2ZW4gPSBmYWxzZTsKKwkJbmNhLnJlcV9mbGFncyA9IDA7CiAJCXJldCA9IG5jc2lfeG1pdF9jbWQoJm5jYSk7CiAJCWlmIChyZXQpIHsKIAkJCW5ldGRldl9lcnIobmRwLT5uZGV2LmRldiwgIkVycm9yICVkIHNlbmRpbmcgR0xTXG4iLAogCQkJCSAgIHJldCk7CiAJCQlyZXR1cm47CiAJCX0KLQl9CiAKLQlpZiAodGltZW91dCArIDEgPj0gMykgeworCQlicmVhazsKKwljYXNlIE5DU0lfQ0hBTk5FTF9NT05JVE9SX1dBSVQgLi4uIE5DU0lfQ0hBTk5FTF9NT05JVE9SX1dBSVRfTUFYOgorCQlicmVhazsKKwlkZWZhdWx0OgogCQlpZiAoIShuZHAtPmZsYWdzICYgTkNTSV9ERVZfSFdBKSAmJgotCQkgICAgbmMtPnN0YXRlID09IE5DU0lfQ0hBTk5FTF9BQ1RJVkUpCisJCSAgICBzdGF0ZSA9PSBOQ1NJX0NIQU5ORUxfQUNUSVZFKSB7CiAJCQluY3NpX3JlcG9ydF9saW5rKG5kcCwgdHJ1ZSk7CisJCQluZHAtPmZsYWdzIHw9IE5DU0lfREVWX1JFU0hVRkZMRTsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZuYy0+bG9jaywgZmxhZ3MpOworCQluYy0+c3RhdGUgPSBOQ1NJX0NIQU5ORUxfSU5WSVNJQkxFOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZuZHAtPmxvY2ssIGZsYWdzKTsKLQkJeGNoZygmbmMtPnN0YXRlLCBOQ1NJX0NIQU5ORUxfSU5BQ1RJVkUpOworCQluYy0+c3RhdGUgPSBOQ1NJX0NIQU5ORUxfSU5BQ1RJVkU7CiAJCWxpc3RfYWRkX3RhaWxfcmN1KCZuYy0+bGluaywgJm5kcC0+Y2hhbm5lbF9xdWV1ZSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5kcC0+bG9jaywgZmxhZ3MpOwogCQluY3NpX3Byb2Nlc3NfbmV4dF9jaGFubmVsKG5kcCk7CkBAIC0yMDcsMTAgKzIyNyw5IEBACiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5jLT5sb2NrLCBmbGFncyk7Ci0JbmMtPnRpbWVvdXQgPSB0aW1lb3V0ICsgMTsKLQluYy0+ZW5hYmxlZCA9IHRydWU7CisJbmMtPm1vbml0b3Iuc3RhdGUrKzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwotCW1vZF90aW1lcigmbmMtPnRpbWVyLCBqaWZmaWVzICsgSFogKiAoMSA8PCAobmMtPnRpbWVvdXQgLyAyKSkpOworCW1vZF90aW1lcigmbmMtPm1vbml0b3IudGltZXIsIGppZmZpZXMgKyBIWik7CiB9CiAKIHZvaWQgbmNzaV9zdGFydF9jaGFubmVsX21vbml0b3Ioc3RydWN0IG5jc2lfY2hhbm5lbCAqbmMpCkBAIC0yMTgsMTIgKzIzNywxMiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbmMtPmxvY2ssIGZsYWdzKTsKLQlXQVJOX09OX09OQ0UobmMtPmVuYWJsZWQpOwotCW5jLT50aW1lb3V0ID0gMDsKLQluYy0+ZW5hYmxlZCA9IHRydWU7CisJV0FSTl9PTl9PTkNFKG5jLT5tb25pdG9yLmVuYWJsZWQpOworCW5jLT5tb25pdG9yLmVuYWJsZWQgPSB0cnVlOworCW5jLT5tb25pdG9yLnN0YXRlID0gTkNTSV9DSEFOTkVMX01PTklUT1JfU1RBUlQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKIAotCW1vZF90aW1lcigmbmMtPnRpbWVyLCBqaWZmaWVzICsgSFogKiAoMSA8PCAobmMtPnRpbWVvdXQgLyAyKSkpOworCW1vZF90aW1lcigmbmMtPm1vbml0b3IudGltZXIsIGppZmZpZXMgKyBIWik7CiB9CiAKIHZvaWQgbmNzaV9zdG9wX2NoYW5uZWxfbW9uaXRvcihzdHJ1Y3QgbmNzaV9jaGFubmVsICpuYykKQEAgLTIzMSwxNCArMjUwLDE0IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZuYy0+bG9jaywgZmxhZ3MpOwotCWlmICghbmMtPmVuYWJsZWQpIHsKKwlpZiAoIW5jLT5tb25pdG9yLmVuYWJsZWQpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KLQluYy0+ZW5hYmxlZCA9IGZhbHNlOworCW5jLT5tb25pdG9yLmVuYWJsZWQgPSBmYWxzZTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCi0JZGVsX3RpbWVyX3N5bmMoJm5jLT50aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJm5jLT5tb25pdG9yLnRpbWVyKTsKIH0KIAogc3RydWN0IG5jc2lfY2hhbm5lbCAqbmNzaV9maW5kX2NoYW5uZWwoc3RydWN0IG5jc2lfcGFja2FnZSAqbnAsCkBAIC0yNjcsOCArMjg2LDkgQEAKIAluYy0+aWQgPSBpZDsKIAluYy0+cGFja2FnZSA9IG5wOwogCW5jLT5zdGF0ZSA9IE5DU0lfQ0hBTk5FTF9JTkFDVElWRTsKLQluYy0+ZW5hYmxlZCA9IGZhbHNlOwotCXNldHVwX3RpbWVyKCZuYy0+dGltZXIsIG5jc2lfY2hhbm5lbF9tb25pdG9yLCAodW5zaWduZWQgbG9uZyluYyk7CisJbmMtPm1vbml0b3IuZW5hYmxlZCA9IGZhbHNlOworCXNldHVwX3RpbWVyKCZuYy0+bW9uaXRvci50aW1lciwKKwkJICAgIG5jc2lfY2hhbm5lbF9tb25pdG9yLCAodW5zaWduZWQgbG9uZyluYyk7CiAJc3Bpbl9sb2NrX2luaXQoJm5jLT5sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmbmMtPmxpbmspOwogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5DU0lfQ0FQX01BWDsgaW5kZXgrKykKQEAgLTQwNSw3ICs0MjUsOCBAQAogICogYmUgc2FtZS4gT3RoZXJ3aXNlLCB0aGUgYm9ndXMgcmVzcG9uc2UgbWlnaHQgYmUgcmVwbGllZC4gU28KICAqIHRoZSBhdmFpbGFibGUgSURzIGFyZSBhbGxvY2F0ZWQgaW4gcm91bmQtcm9iaW4gZmFzaGlvbi4KICAqLwotc3RydWN0IG5jc2lfcmVxdWVzdCAqbmNzaV9hbGxvY19yZXF1ZXN0KHN0cnVjdCBuY3NpX2Rldl9wcml2ICpuZHAsIGJvb2wgZHJpdmVuKQorc3RydWN0IG5jc2lfcmVxdWVzdCAqbmNzaV9hbGxvY19yZXF1ZXN0KHN0cnVjdCBuY3NpX2Rldl9wcml2ICpuZHAsCisJCQkJCXVuc2lnbmVkIGludCByZXFfZmxhZ3MpCiB7CiAJc3RydWN0IG5jc2lfcmVxdWVzdCAqbnIgPSBOVUxMOwogCWludCBpLCBsaW1pdCA9IEFSUkFZX1NJWkUobmRwLT5yZXF1ZXN0cyk7CkBAIC00MTMsMzAgKzQzNCwzMSBAQAogCiAJLyogQ2hlY2sgaWYgdGhlcmUgaXMgb25lIGF2YWlsYWJsZSByZXF1ZXN0IHVudGlsIHRoZSBjZWlsaW5nICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5kcC0+bG9jaywgZmxhZ3MpOwotCWZvciAoaSA9IG5kcC0+cmVxdWVzdF9pZDsgIW5yICYmIGkgPCBsaW1pdDsgaSsrKSB7CisJZm9yIChpID0gbmRwLT5yZXF1ZXN0X2lkOyBpIDwgbGltaXQ7IGkrKykgewogCQlpZiAobmRwLT5yZXF1ZXN0c1tpXS51c2VkKQogCQkJY29udGludWU7CiAKIAkJbnIgPSAmbmRwLT5yZXF1ZXN0c1tpXTsKIAkJbnItPnVzZWQgPSB0cnVlOwotCQluci0+ZHJpdmVuID0gZHJpdmVuOwotCQlpZiAoKytuZHAtPnJlcXVlc3RfaWQgPj0gbGltaXQpCi0JCQluZHAtPnJlcXVlc3RfaWQgPSAwOworCQluci0+ZmxhZ3MgPSByZXFfZmxhZ3M7CisJCW5kcC0+cmVxdWVzdF9pZCA9IGkgKyAxOworCQlnb3RvIGZvdW5kOwogCX0KIAogCS8qIEZhaWwgYmFjayB0byBjaGVjayBmcm9tIHRoZSBzdGFydGluZyBjdXJzb3IgKi8KLQlmb3IgKGkgPSAwOyAhbnIgJiYgaSA8IG5kcC0+cmVxdWVzdF9pZDsgaSsrKSB7CisJZm9yIChpID0gTkNTSV9SRVFfU1RBUlRfSURYOyBpIDwgbmRwLT5yZXF1ZXN0X2lkOyBpKyspIHsKIAkJaWYgKG5kcC0+cmVxdWVzdHNbaV0udXNlZCkKIAkJCWNvbnRpbnVlOwogCiAJCW5yID0gJm5kcC0+cmVxdWVzdHNbaV07CiAJCW5yLT51c2VkID0gdHJ1ZTsKLQkJbnItPmRyaXZlbiA9IGRyaXZlbjsKLQkJaWYgKCsrbmRwLT5yZXF1ZXN0X2lkID49IGxpbWl0KQotCQkJbmRwLT5yZXF1ZXN0X2lkID0gMDsKKwkJbnItPmZsYWdzID0gcmVxX2ZsYWdzOworCQluZHAtPnJlcXVlc3RfaWQgPSBpICsgMTsKKwkJZ290byBmb3VuZDsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmRwLT5sb2NrLCBmbGFncyk7CiAKK2ZvdW5kOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5kcC0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBucjsKIH0KIApAQCAtNDU4LDcgKzQ4MCw3IEBACiAJbnItPmNtZCA9IE5VTEw7CiAJbnItPnJzcCA9IE5VTEw7CiAJbnItPnVzZWQgPSBmYWxzZTsKLQlkcml2ZW4gPSBuci0+ZHJpdmVuOworCWRyaXZlbiA9ICEhKG5yLT5mbGFncyAmIE5DU0lfUkVRX0ZMQUdfRVZFTlRfRFJJVkVOKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZHAtPmxvY2ssIGZsYWdzKTsKIAogCWlmIChkcml2ZW4gJiYgY21kICYmIC0tbmRwLT5wZW5kaW5nX3JlcV9udW0gPT0gMCkKQEAgLTUwOCwxMCArNTMwLDExIEBACiAJc3RydWN0IG5jc2lfcGFja2FnZSAqbnAgPSBuZHAtPmFjdGl2ZV9wYWNrYWdlOwogCXN0cnVjdCBuY3NpX2NoYW5uZWwgKm5jID0gbmRwLT5hY3RpdmVfY2hhbm5lbDsKIAlzdHJ1Y3QgbmNzaV9jbWRfYXJnIG5jYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKIAluY2EubmRwID0gbmRwOwotCW5jYS5kcml2ZW4gPSB0cnVlOworCW5jYS5yZXFfZmxhZ3MgPSBOQ1NJX1JFUV9GTEFHX0VWRU5UX0RSSVZFTjsKIAlzd2l0Y2ggKG5kLT5zdGF0ZSkgewogCWNhc2UgbmNzaV9kZXZfc3RhdGVfc3VzcGVuZDoKIAkJbmQtPnN0YXRlID0gbmNzaV9kZXZfc3RhdGVfc3VzcGVuZF9zZWxlY3Q7CkBAIC01MjcsNyArNTUwLDcgQEAKIAkJbmNhLnBhY2thZ2UgPSBucC0+aWQ7CiAJCWlmIChuZC0+c3RhdGUgPT0gbmNzaV9kZXZfc3RhdGVfc3VzcGVuZF9zZWxlY3QpIHsKIAkJCW5jYS50eXBlID0gTkNTSV9QS1RfQ01EX1NQOwotCQkJbmNhLmNoYW5uZWwgPSAweDFmOworCQkJbmNhLmNoYW5uZWwgPSBOQ1NJX1JFU0VSVkVEX0NIQU5ORUw7CiAJCQlpZiAobmRwLT5mbGFncyAmIE5DU0lfREVWX0hXQSkKIAkJCQluY2EuYnl0ZXNbMF0gPSAwOwogCQkJZWxzZQpAQCAtNTQ0LDcgKzU2Nyw3IEBACiAJCQluZC0+c3RhdGUgPSBuY3NpX2Rldl9zdGF0ZV9zdXNwZW5kX2Rlc2VsZWN0OwogCQl9IGVsc2UgaWYgKG5kLT5zdGF0ZSA9PSBuY3NpX2Rldl9zdGF0ZV9zdXNwZW5kX2Rlc2VsZWN0KSB7CiAJCQluY2EudHlwZSA9IE5DU0lfUEtUX0NNRF9EUDsKLQkJCW5jYS5jaGFubmVsID0gMHgxZjsKKwkJCW5jYS5jaGFubmVsID0gTkNTSV9SRVNFUlZFRF9DSEFOTkVMOwogCQkJbmQtPnN0YXRlID0gbmNzaV9kZXZfc3RhdGVfc3VzcGVuZF9kb25lOwogCQl9CiAKQEAgLTU1Niw3ICs1NzksOSBAQAogCiAJCWJyZWFrOwogCWNhc2UgbmNzaV9kZXZfc3RhdGVfc3VzcGVuZF9kb25lOgotCQl4Y2hnKCZuYy0+c3RhdGUsIE5DU0lfQ0hBTk5FTF9JTkFDVElWRSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZuYy0+bG9jaywgZmxhZ3MpOworCQluYy0+c3RhdGUgPSBOQ1NJX0NIQU5ORUxfSU5BQ1RJVkU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jLT5sb2NrLCBmbGFncyk7CiAJCW5jc2lfcHJvY2Vzc19uZXh0X2NoYW5uZWwobmRwKTsKIAogCQlicmVhazsKQEAgLTU3NCwxMCArNTk5LDExIEBACiAJc3RydWN0IG5jc2lfY2hhbm5lbCAqbmMgPSBuZHAtPmFjdGl2ZV9jaGFubmVsOwogCXN0cnVjdCBuY3NpX2NtZF9hcmcgbmNhOwogCXVuc2lnbmVkIGNoYXIgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCiAJbmNhLm5kcCA9IG5kcDsKLQluY2EuZHJpdmVuID0gdHJ1ZTsKKwluY2EucmVxX2ZsYWdzID0gTkNTSV9SRVFfRkxBR19FVkVOVF9EUklWRU47CiAJc3dpdGNoIChuZC0+c3RhdGUpIHsKIAljYXNlIG5jc2lfZGV2X3N0YXRlX2NvbmZpZzoKIAljYXNlIG5jc2lfZGV2X3N0YXRlX2NvbmZpZ19zcDoKQEAgLTU5MCw3ICs2MTYsNyBAQAogCQllbHNlCiAJCQluY2EuYnl0ZXNbMF0gPSAxOwogCQluY2EucGFja2FnZSA9IG5wLT5pZDsKLQkJbmNhLmNoYW5uZWwgPSAweDFmOworCQluY2EuY2hhbm5lbCA9IE5DU0lfUkVTRVJWRURfQ0hBTk5FTDsKIAkJcmV0ID0gbmNzaV94bWl0X2NtZCgmbmNhKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3I7CkBAIC02NzUsMTAgKzcwMSwxMiBAQAogCQkJZ290byBlcnJvcjsKIAkJYnJlYWs7CiAJY2FzZSBuY3NpX2Rldl9zdGF0ZV9jb25maWdfZG9uZToKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm5jLT5sb2NrLCBmbGFncyk7CiAJCWlmIChuYy0+bW9kZXNbTkNTSV9NT0RFX0xJTktdLmRhdGFbMl0gJiAweDEpCi0JCQl4Y2hnKCZuYy0+c3RhdGUsIE5DU0lfQ0hBTk5FTF9BQ1RJVkUpOworCQkJbmMtPnN0YXRlID0gTkNTSV9DSEFOTkVMX0FDVElWRTsKIAkJZWxzZQotCQkJeGNoZygmbmMtPnN0YXRlLCBOQ1NJX0NIQU5ORUxfSU5BQ1RJVkUpOworCQkJbmMtPnN0YXRlID0gTkNTSV9DSEFOTkVMX0lOQUNUSVZFOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCiAJCW5jc2lfc3RhcnRfY2hhbm5lbF9tb25pdG9yKG5jKTsKIAkJbmNzaV9wcm9jZXNzX25leHRfY2hhbm5lbChuZHApOwpAQCAtNzA3LDE4ICs3MzUsMjUgQEAKIAlmb3VuZCA9IE5VTEw7CiAJTkNTSV9GT1JfRUFDSF9QQUNLQUdFKG5kcCwgbnApIHsKIAkJTkNTSV9GT1JfRUFDSF9DSEFOTkVMKG5wLCBuYykgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJm5jLT5sb2NrLCBmbGFncyk7CisKIAkJCWlmICghbGlzdF9lbXB0eSgmbmMtPmxpbmspIHx8Ci0JCQkgICAgbmMtPnN0YXRlICE9IE5DU0lfQ0hBTk5FTF9JTkFDVElWRSkKKwkJCSAgICBuYy0+c3RhdGUgIT0gTkNTSV9DSEFOTkVMX0lOQUNUSVZFKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKIAkJCQljb250aW51ZTsKKwkJCX0KIAogCQkJaWYgKCFmb3VuZCkKIAkJCQlmb3VuZCA9IG5jOwogCiAJCQluY20gPSAmbmMtPm1vZGVzW05DU0lfTU9ERV9MSU5LXTsKIAkJCWlmIChuY20tPmRhdGFbMl0gJiAweDEpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCQkJCWZvdW5kID0gbmM7CiAJCQkJZ290byBvdXQ7CiAJCQl9CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jLT5sb2NrLCBmbGFncyk7CiAJCX0KIAl9CiAKQEAgLTc5Nyw3ICs4MzIsNyBAQAogCWludCByZXQ7CiAKIAluY2EubmRwID0gbmRwOwotCW5jYS5kcml2ZW4gPSB0cnVlOworCW5jYS5yZXFfZmxhZ3MgPSBOQ1NJX1JFUV9GTEFHX0VWRU5UX0RSSVZFTjsKIAlzd2l0Y2ggKG5kLT5zdGF0ZSkgewogCWNhc2UgbmNzaV9kZXZfc3RhdGVfcHJvYmU6CiAJCW5kLT5zdGF0ZSA9IG5jc2lfZGV2X3N0YXRlX3Byb2JlX2Rlc2VsZWN0OwpAQCAtODA3LDcgKzg0Miw3IEBACiAKIAkJLyogRGVzZWxlY3QgYWxsIHBvc3NpYmxlIHBhY2thZ2VzICovCiAJCW5jYS50eXBlID0gTkNTSV9QS1RfQ01EX0RQOwotCQluY2EuY2hhbm5lbCA9IDB4MWY7CisJCW5jYS5jaGFubmVsID0gTkNTSV9SRVNFUlZFRF9DSEFOTkVMOwogCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSB7CiAJCQluY2EucGFja2FnZSA9IGluZGV4OwogCQkJcmV0ID0gbmNzaV94bWl0X2NtZCgmbmNhKTsKQEAgLTgyMyw3ICs4NTgsNyBAQAogCQkvKiBTZWxlY3QgYWxsIHBvc3NpYmxlIHBhY2thZ2VzICovCiAJCW5jYS50eXBlID0gTkNTSV9QS1RfQ01EX1NQOwogCQluY2EuYnl0ZXNbMF0gPSAxOwotCQluY2EuY2hhbm5lbCA9IDB4MWY7CisJCW5jYS5jaGFubmVsID0gTkNTSV9SRVNFUlZFRF9DSEFOTkVMOwogCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSB7CiAJCQluY2EucGFja2FnZSA9IGluZGV4OwogCQkJcmV0ID0gbmNzaV94bWl0X2NtZCgmbmNhKTsKQEAgLTg3Niw3ICs5MTEsNyBAQAogCQluY2EudHlwZSA9IE5DU0lfUEtUX0NNRF9TUDsKIAkJbmNhLmJ5dGVzWzBdID0gMTsKIAkJbmNhLnBhY2thZ2UgPSBuZHAtPmFjdGl2ZV9wYWNrYWdlLT5pZDsKLQkJbmNhLmNoYW5uZWwgPSAweDFmOworCQluY2EuY2hhbm5lbCA9IE5DU0lfUkVTRVJWRURfQ0hBTk5FTDsKIAkJcmV0ID0gbmNzaV94bWl0X2NtZCgmbmNhKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3I7CkBAIC04ODQsMTIgKzkxOSwxMiBAQAogCQluZC0+c3RhdGUgPSBuY3NpX2Rldl9zdGF0ZV9wcm9iZV9jaXM7CiAJCWJyZWFrOwogCWNhc2UgbmNzaV9kZXZfc3RhdGVfcHJvYmVfY2lzOgotCQluZHAtPnBlbmRpbmdfcmVxX251bSA9IDMyOworCQluZHAtPnBlbmRpbmdfcmVxX251bSA9IE5DU0lfUkVTRVJWRURfQ0hBTk5FTDsKIAogCQkvKiBDbGVhciBpbml0aWFsIHN0YXRlICovCiAJCW5jYS50eXBlID0gTkNTSV9QS1RfQ01EX0NJUzsKIAkJbmNhLnBhY2thZ2UgPSBuZHAtPmFjdGl2ZV9wYWNrYWdlLT5pZDsKLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMHgyMDsgaW5kZXgrKykgeworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOQ1NJX1JFU0VSVkVEX0NIQU5ORUw7IGluZGV4KyspIHsKIAkJCW5jYS5jaGFubmVsID0gaW5kZXg7CiAJCQlyZXQgPSBuY3NpX3htaXRfY21kKCZuY2EpOwogCQkJaWYgKHJldCkKQEAgLTkzMyw3ICs5NjgsNyBAQAogCQkvKiBEZXNlbGVjdCB0aGUgYWN0aXZlIHBhY2thZ2UgKi8KIAkJbmNhLnR5cGUgPSBOQ1NJX1BLVF9DTURfRFA7CiAJCW5jYS5wYWNrYWdlID0gbmRwLT5hY3RpdmVfcGFja2FnZS0+aWQ7Ci0JCW5jYS5jaGFubmVsID0gMHgxZjsKKwkJbmNhLmNoYW5uZWwgPSBOQ1NJX1JFU0VSVkVEX0NIQU5ORUw7CiAJCXJldCA9IG5jc2lfeG1pdF9jbWQoJm5jYSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycm9yOwpAQCAtOTg3LDExICsxMDIyLDE0IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCW9sZF9zdGF0ZSA9IHhjaGcoJm5jLT5zdGF0ZSwgTkNTSV9DSEFOTkVMX0lOVklTSUJMRSk7CiAJbGlzdF9kZWxfaW5pdCgmbmMtPmxpbmspOwotCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmRwLT5sb2NrLCBmbGFncyk7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmMtPmxvY2ssIGZsYWdzKTsKKwlvbGRfc3RhdGUgPSBuYy0+c3RhdGU7CisJbmMtPnN0YXRlID0gTkNTSV9DSEFOTkVMX0lOVklTSUJMRTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOworCiAJbmRwLT5hY3RpdmVfY2hhbm5lbCA9IG5jOwogCW5kcC0+YWN0aXZlX3BhY2thZ2UgPSBuYy0+cGFja2FnZTsKIApAQCAtMTAwNiw3ICsxMDQ0LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbmV0ZGV2X2VycihuZHAtPm5kZXYuZGV2LCAiSW52YWxpZCBzdGF0ZSAweCV4IG9uICVkOiVkXG4iLAotCQkJICAgbmMtPnN0YXRlLCBuYy0+cGFja2FnZS0+aWQsIG5jLT5pZCk7CisJCQkgICBvbGRfc3RhdGUsIG5jLT5wYWNrYWdlLT5pZCwgbmMtPmlkKTsKIAkJbmNzaV9yZXBvcnRfbGluayhuZHAsIGZhbHNlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTA3MCw3ICsxMTA4LDcgQEAKIAkJcmV0dXJuIE5PVElGWV9PSzsKIAogCW5jYS5uZHAgPSBuZHA7Ci0JbmNhLmRyaXZlbiA9IGZhbHNlOworCW5jYS5yZXFfZmxhZ3MgPSAwOwogCW5jYS5wYWNrYWdlID0gbnAtPmlkOwogCW5jYS5jaGFubmVsID0gbmMtPmlkOwogCW5jYS5kd29yZHNbMF0gPSBuYy0+Y2Fwc1tOQ1NJX0NBUF9NQ10uY2FwOwpAQCAtMTExOCw3ICsxMTU2LDcgQEAKIAkvKiBJbml0aWFsaXplIHByaXZhdGUgTkNTSSBkZXZpY2UgKi8KIAlzcGluX2xvY2tfaW5pdCgmbmRwLT5sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmbmRwLT5wYWNrYWdlcyk7Ci0JbmRwLT5yZXF1ZXN0X2lkID0gMDsKKwluZHAtPnJlcXVlc3RfaWQgPSBOQ1NJX1JFUV9TVEFSVF9JRFg7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobmRwLT5yZXF1ZXN0cyk7IGkrKykgewogCQluZHAtPnJlcXVlc3RzW2ldLmlkID0gaTsKIAkJbmRwLT5yZXF1ZXN0c1tpXS5uZHAgPSBuZHA7CkBAIC0xMTQ5LDkgKzExODcsNyBAQAogaW50IG5jc2lfc3RhcnRfZGV2KHN0cnVjdCBuY3NpX2RldiAqbmQpCiB7CiAJc3RydWN0IG5jc2lfZGV2X3ByaXYgKm5kcCA9IFRPX05DU0lfREVWX1BSSVYobmQpOwotCXN0cnVjdCBuY3NpX3BhY2thZ2UgKm5wOwotCXN0cnVjdCBuY3NpX2NoYW5uZWwgKm5jOwotCWludCBvbGRfc3RhdGUsIHJldDsKKwlpbnQgcmV0OwogCiAJaWYgKG5kLT5zdGF0ZSAhPSBuY3NpX2Rldl9zdGF0ZV9yZWdpc3RlcmVkICYmCiAJICAgIG5kLT5zdGF0ZSAhPSBuY3NpX2Rldl9zdGF0ZV9mdW5jdGlvbmFsKQpAQCAtMTE2MywxNSArMTE5OSw2IEBACiAJCXJldHVybiAwOwogCX0KIAotCS8qIFJlc2V0IGNoYW5uZWwncyBzdGF0ZSBhbmQgc3RhcnQgb3ZlciAqLwotCU5DU0lfRk9SX0VBQ0hfUEFDS0FHRShuZHAsIG5wKSB7Ci0JCU5DU0lfRk9SX0VBQ0hfQ0hBTk5FTChucCwgbmMpIHsKLQkJCW9sZF9zdGF0ZSA9IHhjaGcoJm5jLT5zdGF0ZSwgTkNTSV9DSEFOTkVMX0lOQUNUSVZFKTsKLQkJCVdBUk5fT05fT05DRSghbGlzdF9lbXB0eSgmbmMtPmxpbmspIHx8Ci0JCQkJICAgICBvbGRfc3RhdGUgPT0gTkNTSV9DSEFOTkVMX0lOVklTSUJMRSk7Ci0JCX0KLQl9Ci0KIAlpZiAobmRwLT5mbGFncyAmIE5DU0lfREVWX0hXQSkKIAkJcmV0ID0gbmNzaV9lbmFibGVfaHdhKG5kcCk7CiAJZWxzZQpAQCAtMTE4MSw2ICsxMjA4LDM1IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuY3NpX3N0YXJ0X2Rldik7CiAKK3ZvaWQgbmNzaV9zdG9wX2RldihzdHJ1Y3QgbmNzaV9kZXYgKm5kKQoreworCXN0cnVjdCBuY3NpX2Rldl9wcml2ICpuZHAgPSBUT19OQ1NJX0RFVl9QUklWKG5kKTsKKwlzdHJ1Y3QgbmNzaV9wYWNrYWdlICpucDsKKwlzdHJ1Y3QgbmNzaV9jaGFubmVsICpuYzsKKwlib29sIGNoYWluZWQ7CisJaW50IG9sZF9zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogU3RvcCB0aGUgY2hhbm5lbCBtb25pdG9yIGFuZCByZXNldCBjaGFubmVsJ3Mgc3RhdGUgKi8KKwlOQ1NJX0ZPUl9FQUNIX1BBQ0tBR0UobmRwLCBucCkgeworCQlOQ1NJX0ZPUl9FQUNIX0NIQU5ORUwobnAsIG5jKSB7CisJCQluY3NpX3N0b3BfY2hhbm5lbF9tb25pdG9yKG5jKTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJm5jLT5sb2NrLCBmbGFncyk7CisJCQljaGFpbmVkID0gIWxpc3RfZW1wdHkoJm5jLT5saW5rKTsKKwkJCW9sZF9zdGF0ZSA9IG5jLT5zdGF0ZTsKKwkJCW5jLT5zdGF0ZSA9IE5DU0lfQ0hBTk5FTF9JTkFDVElWRTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jLT5sb2NrLCBmbGFncyk7CisKKwkJCVdBUk5fT05fT05DRShjaGFpbmVkIHx8CisJCQkJICAgICBvbGRfc3RhdGUgPT0gTkNTSV9DSEFOTkVMX0lOVklTSUJMRSk7CisJCX0KKwl9CisKKwluY3NpX3JlcG9ydF9saW5rKG5kcCwgdHJ1ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuY3NpX3N0b3BfZGV2KTsKKwogdm9pZCBuY3NpX3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBuY3NpX2RldiAqbmQpCiB7CiAJc3RydWN0IG5jc2lfZGV2X3ByaXYgKm5kcCA9IFRPX05DU0lfREVWX1BSSVYobmQpOwpkaWZmIC0tZ2l0IGEvbmV0L25jc2kvbmNzaS1yc3AuYyBiL25ldC9uY3NpL25jc2ktcnNwLmMKaW5kZXggYWY4NDM4OS4uMDg3ZGI3NyAxMDA2NDQKLS0tIGEvbmV0L25jc2kvbmNzaS1yc3AuYworKysgYi9uZXQvbmNzaS9uY3NpLXJzcC5jCkBAIC0zMTcsMTIgKzMxNywxMiBAQAogCW5jbS0+ZGF0YVszXSA9IG50b2hsKHJzcC0+b3RoZXIpOwogCW5jbS0+ZGF0YVs0XSA9IG50b2hsKHJzcC0+b2VtX3N0YXR1cyk7CiAKLQlpZiAobnItPmRyaXZlbikKKwlpZiAobnItPmZsYWdzICYgTkNTSV9SRVFfRkxBR19FVkVOVF9EUklWRU4pCiAJCXJldHVybiAwOwogCiAJLyogUmVzZXQgdGhlIGNoYW5uZWwgbW9uaXRvciBpZiBpdCBoYXMgYmVlbiBlbmFibGVkICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5jLT5sb2NrLCBmbGFncyk7Ci0JbmMtPnRpbWVvdXQgPSAwOworCW5jLT5tb25pdG9yLnN0YXRlID0gTkNTSV9DSEFOTkVMX01PTklUT1JfU1RBUlQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L25ldGZpbHRlci9LY29uZmlnCmluZGV4IDkyNjZjZWUuLmU4ZDU2ZDkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTQ3NCw2ICs0NzQsMTIgQEAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlICJtZXRhIiBleHByZXNzaW9uIHRoYXQgeW91IGNhbiB1c2UgdG8gbWF0Y2ggYW5kCiAJICB0byBzZXQgcGFja2V0IG1ldGFpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBwYWNrZXQgbWFyay4KIAorY29uZmlnIE5GVF9OVU1HRU4KKwl0cmlzdGF0ZSAiTmV0ZmlsdGVyIG5mX3RhYmxlcyBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZSIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSBudW1iZXIgZ2VuZXJhdG9yIGV4cHJlc3Npb24gdXNlZCB0byBwZXJmb3JtCisJICBpbmNyZW1lbnRhbCBjb3VudGluZyBhbmQgcmFuZG9tIG51bWJlcnMgYm91bmQgdG8gYSB1cHBlciBsaW1pdC4KKwogY29uZmlnIE5GVF9DVAogCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLCiAJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgY29ubnRyYWNrIG1vZHVsZSIKQEAgLTQ4MSwxMyArNDg3LDEzIEBACiAJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSAibWV0YSIgZXhwcmVzc2lvbiB0aGF0IHlvdSBjYW4gdXNlIHRvIG1hdGNoCiAJICBjb25uZWN0aW9uIHRyYWNraW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIGZsb3cgc3RhdGUuCiAKLWNvbmZpZyBORlRfUkJUUkVFCitjb25maWcgTkZUX1NFVF9SQlRSRUUKIAl0cmlzdGF0ZSAiTmV0ZmlsdGVyIG5mX3RhYmxlcyByYnRyZWUgc2V0IG1vZHVsZSIKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSAicmJ0cmVlIiBzZXQgdHlwZSAoUmVkIEJsYWNrIHRyZWUpIHRoYXQgaXMgdXNlZAogCSAgdG8gYnVpbGQgaW50ZXJ2YWwtYmFzZWQgc2V0cy4KIAotY29uZmlnIE5GVF9IQVNICitjb25maWcgTkZUX1NFVF9IQVNICiAJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgaGFzaCBzZXQgbW9kdWxlIgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlICJoYXNoIiBzZXQgdHlwZSB0aGF0IGlzIHVzZWQgdG8gYnVpbGQgb25lLXdheQpAQCAtNTQyLDYgKzU0OCwxMiBAQAogCSAgVGhpcyBpcyByZXF1aXJlZCBpZiB5b3UgaW50ZW5kIHRvIHVzZSB0aGUgdXNlcnNwYWNlIHF1ZXVlaW5nCiAJICBpbmZyYXN0cnVjdHVyZSAoYWxzbyBrbm93biBhcyBORlFVRVVFKSBmcm9tIG5mdGFibGVzLgogCitjb25maWcgTkZUX1FVT1RBCisJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgcXVvdGEgbW9kdWxlIgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlICJxdW90YSIgZXhwcmVzc2lvbiB0aGF0IHlvdSBjYW4gdXNlIHRvIG1hdGNoCisJICBlbmZvcmNlIGJ5dGVzIHF1b3Rhcy4KKwogY29uZmlnIE5GVF9SRUpFQ1QKIAlkZWZhdWx0IG0gaWYgTkVURklMVEVSX0FEVkFOQ0VEPW4KIAl0cmlzdGF0ZSAiTmV0ZmlsdGVyIG5mX3RhYmxlcyByZWplY3Qgc3VwcG9ydCIKQEAgLTU2Myw2ICs1NzUsMTIgQEAKIAkgIHhfdGFibGVzIG1hdGNoL3RhcmdldCBleHRlbnNpb25zIG92ZXIgdGhlIG5mX3RhYmxlcwogCSAgZnJhbWV3b3JrLgogCitjb25maWcgTkZUX0hBU0gKKwl0cmlzdGF0ZSAiTmV0ZmlsdGVyIG5mX3RhYmxlcyBoYXNoIG1vZHVsZSIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSAiaGFzaCIgZXhwcmVzc2lvbiB0aGF0IHlvdSBjYW4gdXNlIHRvIHBlcmZvcm0KKwkgIGEgaGFzaCBvcGVyYXRpb24gb24gcmVnaXN0ZXJzLgorCiBpZiBORl9UQUJMRVNfTkVUREVWCiAKIGNvbmZpZyBORl9EVVBfTkVUREVWCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L25ldGZpbHRlci9NYWtlZmlsZQppbmRleCA2OTEzNDU0Li5jMjNjM2M4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCisrKyBiL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTcxLDggKzcxLDkgQEAKIAogIyBuZl90YWJsZXMKIG5mX3RhYmxlcy1vYmpzICs9IG5mX3RhYmxlc19jb3JlLm8gbmZfdGFibGVzX2FwaS5vIG5mX3RhYmxlc190cmFjZS5vCi1uZl90YWJsZXMtb2JqcyArPSBuZnRfaW1tZWRpYXRlLm8gbmZ0X2NtcC5vIG5mdF9sb29rdXAubyBuZnRfZHluc2V0Lm8KK25mX3RhYmxlcy1vYmpzICs9IG5mdF9pbW1lZGlhdGUubyBuZnRfY21wLm8gbmZ0X3JhbmdlLm8KIG5mX3RhYmxlcy1vYmpzICs9IG5mdF9iaXR3aXNlLm8gbmZ0X2J5dGVvcmRlci5vIG5mdF9wYXlsb2FkLm8KK25mX3RhYmxlcy1vYmpzICs9IG5mdF9sb29rdXAubyBuZnRfZHluc2V0Lm8KIAogb2JqLSQoQ09ORklHX05GX1RBQkxFUykJCSs9IG5mX3RhYmxlcy5vCiBvYmotJChDT05GSUdfTkZfVEFCTEVTX0lORVQpCSs9IG5mX3RhYmxlc19pbmV0Lm8KQEAgLTgwLDE4ICs4MSwyMSBAQAogb2JqLSQoQ09ORklHX05GVF9DT01QQVQpCSs9IG5mdF9jb21wYXQubwogb2JqLSQoQ09ORklHX05GVF9FWFRIRFIpCSs9IG5mdF9leHRoZHIubwogb2JqLSQoQ09ORklHX05GVF9NRVRBKQkJKz0gbmZ0X21ldGEubworb2JqLSQoQ09ORklHX05GVF9OVU1HRU4pCSs9IG5mdF9udW1nZW4ubwogb2JqLSQoQ09ORklHX05GVF9DVCkJCSs9IG5mdF9jdC5vCiBvYmotJChDT05GSUdfTkZUX0xJTUlUKQkJKz0gbmZ0X2xpbWl0Lm8KIG9iai0kKENPTkZJR19ORlRfTkFUKQkJKz0gbmZ0X25hdC5vCiBvYmotJChDT05GSUdfTkZUX1FVRVVFKQkJKz0gbmZ0X3F1ZXVlLm8KK29iai0kKENPTkZJR19ORlRfUVVPVEEpCQkrPSBuZnRfcXVvdGEubwogb2JqLSQoQ09ORklHX05GVF9SRUpFQ1QpIAkrPSBuZnRfcmVqZWN0Lm8KIG9iai0kKENPTkZJR19ORlRfUkVKRUNUX0lORVQpCSs9IG5mdF9yZWplY3RfaW5ldC5vCi1vYmotJChDT05GSUdfTkZUX1JCVFJFRSkJKz0gbmZ0X3JidHJlZS5vCi1vYmotJChDT05GSUdfTkZUX0hBU0gpCQkrPSBuZnRfaGFzaC5vCitvYmotJChDT05GSUdfTkZUX1NFVF9SQlRSRUUpCSs9IG5mdF9zZXRfcmJ0cmVlLm8KK29iai0kKENPTkZJR19ORlRfU0VUX0hBU0gpCSs9IG5mdF9zZXRfaGFzaC5vCiBvYmotJChDT05GSUdfTkZUX0NPVU5URVIpCSs9IG5mdF9jb3VudGVyLm8KIG9iai0kKENPTkZJR19ORlRfTE9HKQkJKz0gbmZ0X2xvZy5vCiBvYmotJChDT05GSUdfTkZUX01BU1EpCQkrPSBuZnRfbWFzcS5vCiBvYmotJChDT05GSUdfTkZUX1JFRElSKQkJKz0gbmZ0X3JlZGlyLm8KK29iai0kKENPTkZJR19ORlRfSEFTSCkJCSs9IG5mdF9oYXNoLm8KIAogIyBuZl90YWJsZXMgbmV0ZGV2CiBvYmotJChDT05GSUdfTkZUX0RVUF9ORVRERVYpCSs9IG5mdF9kdXBfbmV0ZGV2Lm8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvY29yZS5jIGIvbmV0L25ldGZpbHRlci9jb3JlLmMKaW5kZXggZjM5Mjc2ZC4uYzlkOTBlYiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9jb3JlLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAKQEAgLTYxLDMzICs2Miw2MiBAQAogI2VuZGlmCiAKIHN0YXRpYyBERUZJTkVfTVVURVgobmZfaG9va19tdXRleCk7CisjZGVmaW5lIG5mX2VudHJ5X2RlcmVmZXJlbmNlKGUpIFwKKwlyY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKGUsIGxvY2tkZXBfaXNfaGVsZCgmbmZfaG9va19tdXRleCkpCiAKLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICpuZl9maW5kX2hvb2tfbGlzdChzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJCSAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqcmVnKQorc3RhdGljIHN0cnVjdCBuZl9ob29rX2VudHJ5ICpuZl9ob29rX2VudHJ5X2hlYWQoc3RydWN0IG5ldCAqbmV0LAorCQkJCQkJY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpyZWcpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaG9va19saXN0ID0gTlVMTDsKKwlzdHJ1Y3QgbmZfaG9va19lbnRyeSAqaG9va19oZWFkID0gTlVMTDsKIAogCWlmIChyZWctPnBmICE9IE5GUFJPVE9fTkVUREVWKQotCQlob29rX2xpc3QgPSAmbmV0LT5uZi5ob29rc1tyZWctPnBmXVtyZWctPmhvb2tudW1dOworCQlob29rX2hlYWQgPSBuZl9lbnRyeV9kZXJlZmVyZW5jZShuZXQtPm5mLmhvb2tzW3JlZy0+cGZdCisJCQkJCQkgW3JlZy0+aG9va251bV0pOwogCWVsc2UgaWYgKHJlZy0+aG9va251bSA9PSBORl9ORVRERVZfSU5HUkVTUykgewogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfSU5HUkVTUwogCQlpZiAocmVnLT5kZXYgJiYgZGV2X25ldChyZWctPmRldikgPT0gbmV0KQotCQkJaG9va19saXN0ID0gJnJlZy0+ZGV2LT5uZl9ob29rc19pbmdyZXNzOworCQkJaG9va19oZWFkID0KKwkJCQluZl9lbnRyeV9kZXJlZmVyZW5jZSgKKwkJCQkJcmVnLT5kZXYtPm5mX2hvb2tzX2luZ3Jlc3MpOwogI2VuZGlmCiAJfQotCXJldHVybiBob29rX2xpc3Q7CisJcmV0dXJuIGhvb2tfaGVhZDsKIH0KIAotc3RydWN0IG5mX2hvb2tfZW50cnkgewotCWNvbnN0IHN0cnVjdCBuZl9ob29rX29wcwkqb3JpZ19vcHM7Ci0Jc3RydWN0IG5mX2hvb2tfb3BzCQlvcHM7Ci19OworLyogbXVzdCBob2xkIG5mX2hvb2tfbXV0ZXggKi8KK3N0YXRpYyB2b2lkIG5mX3NldF9ob29rc19oZWFkKHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpyZWcsCisJCQkgICAgICBzdHJ1Y3QgbmZfaG9va19lbnRyeSAqZW50cnkpCit7CisJc3dpdGNoIChyZWctPnBmKSB7CisJY2FzZSBORlBST1RPX05FVERFVjoKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0lOR1JFU1MKKwkJLyogV2UgYWxyZWFkeSBjaGVja2VkIGluIG5mX3JlZ2lzdGVyX25ldF9ob29rKCkgdGhhdCB0aGlzIGlzCisJCSAqIHVzZWQgZnJvbSBpbmdyZXNzLgorCQkgKi8KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHJlZy0+ZGV2LT5uZl9ob29rc19pbmdyZXNzLCBlbnRyeSk7CisjZW5kaWYKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldC0+bmYuaG9va3NbcmVnLT5wZl1bcmVnLT5ob29rbnVtXSwKKwkJCQkgICBlbnRyeSk7CisJCWJyZWFrOworCX0KK30KIAogaW50IG5mX3JlZ2lzdGVyX25ldF9ob29rKHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpyZWcpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaG9va19saXN0OworCXN0cnVjdCBuZl9ob29rX2VudHJ5ICpob29rc19lbnRyeTsKIAlzdHJ1Y3QgbmZfaG9va19lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IG5mX2hvb2tfb3BzICplbGVtOworCisJaWYgKHJlZy0+cGYgPT0gTkZQUk9UT19ORVRERVYpIHsKKyNpZm5kZWYgQ09ORklHX05FVEZJTFRFUl9JTkdSRVNTCisJCWlmIChyZWctPmhvb2tudW0gPT0gTkZfTkVUREVWX0lOR1JFU1MpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisjZW5kaWYKKwkJaWYgKHJlZy0+aG9va251bSAhPSBORl9ORVRERVZfSU5HUkVTUyB8fAorCQkgICAgIXJlZy0+ZGV2IHx8IGRldl9uZXQocmVnLT5kZXYpICE9IG5ldCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KIAogCWVudHJ5ID0ga21hbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbnRyeSkKQEAgLTk1LDE5ICsxMjUsMzAgQEAKIAogCWVudHJ5LT5vcmlnX29wcwk9IHJlZzsKIAllbnRyeS0+b3BzCT0gKnJlZzsKLQotCWhvb2tfbGlzdCA9IG5mX2ZpbmRfaG9va19saXN0KG5ldCwgcmVnKTsKLQlpZiAoIWhvb2tfbGlzdCkgewotCQlrZnJlZShlbnRyeSk7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KKwllbnRyeS0+bmV4dAk9IE5VTEw7CiAKIAltdXRleF9sb2NrKCZuZl9ob29rX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVsZW0sIGhvb2tfbGlzdCwgbGlzdCkgewotCQlpZiAocmVnLT5wcmlvcml0eSA8IGVsZW0tPnByaW9yaXR5KQotCQkJYnJlYWs7CisJaG9va3NfZW50cnkgPSBuZl9ob29rX2VudHJ5X2hlYWQobmV0LCByZWcpOworCisJaWYgKGhvb2tzX2VudHJ5ICYmIGhvb2tzX2VudHJ5LT5vcmlnX29wcy0+cHJpb3JpdHkgPiByZWctPnByaW9yaXR5KSB7CisJCS8qIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgd2UgbmVlZCB0byBpbnNlcnQgYXQgdGhlIGhlYWQgKi8KKwkJZW50cnktPm5leHQgPSBob29rc19lbnRyeTsKKwkJaG9va3NfZW50cnkgPSBOVUxMOwogCX0KLQlsaXN0X2FkZF9yY3UoJmVudHJ5LT5vcHMubGlzdCwgZWxlbS0+bGlzdC5wcmV2KTsKKworCXdoaWxlIChob29rc19lbnRyeSAmJgorCQlyZWctPnByaW9yaXR5ID49IGhvb2tzX2VudHJ5LT5vcmlnX29wcy0+cHJpb3JpdHkgJiYKKwkJbmZfZW50cnlfZGVyZWZlcmVuY2UoaG9va3NfZW50cnktPm5leHQpKSB7CisJCWhvb2tzX2VudHJ5ID0gbmZfZW50cnlfZGVyZWZlcmVuY2UoaG9va3NfZW50cnktPm5leHQpOworCX0KKworCWlmIChob29rc19lbnRyeSkgeworCQllbnRyeS0+bmV4dCA9IG5mX2VudHJ5X2RlcmVmZXJlbmNlKGhvb2tzX2VudHJ5LT5uZXh0KTsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGhvb2tzX2VudHJ5LT5uZXh0LCBlbnRyeSk7CisJfSBlbHNlIHsKKwkJbmZfc2V0X2hvb2tzX2hlYWQobmV0LCByZWcsIGVudHJ5KTsKKwl9CisKIAltdXRleF91bmxvY2soJm5mX2hvb2tfbXV0ZXgpOwogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfSU5HUkVTUwogCWlmIChyZWctPnBmID09IE5GUFJPVE9fTkVUREVWICYmIHJlZy0+aG9va251bSA9PSBORl9ORVRERVZfSU5HUkVTUykKQEAgLTEyMiwyNCArMTYzLDMzIEBACiAKIHZvaWQgbmZfdW5yZWdpc3Rlcl9uZXRfaG9vayhzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqcmVnKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmhvb2tfbGlzdDsKLQlzdHJ1Y3QgbmZfaG9va19lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IG5mX2hvb2tfb3BzICplbGVtOwotCi0JaG9va19saXN0ID0gbmZfZmluZF9ob29rX2xpc3QobmV0LCByZWcpOwotCWlmICghaG9va19saXN0KQotCQlyZXR1cm47CisJc3RydWN0IG5mX2hvb2tfZW50cnkgKmhvb2tzX2VudHJ5OwogCiAJbXV0ZXhfbG9jaygmbmZfaG9va19tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbGVtLCBob29rX2xpc3QsIGxpc3QpIHsKLQkJZW50cnkgPSBjb250YWluZXJfb2YoZWxlbSwgc3RydWN0IG5mX2hvb2tfZW50cnksIG9wcyk7Ci0JCWlmIChlbnRyeS0+b3JpZ19vcHMgPT0gcmVnKSB7Ci0JCQlsaXN0X2RlbF9yY3UoJmVudHJ5LT5vcHMubGlzdCk7Ci0JCQlicmVhazsKLQkJfQorCWhvb2tzX2VudHJ5ID0gbmZfaG9va19lbnRyeV9oZWFkKG5ldCwgcmVnKTsKKwlpZiAoaG9va3NfZW50cnkgJiYgaG9va3NfZW50cnktPm9yaWdfb3BzID09IHJlZykgeworCQluZl9zZXRfaG9va3NfaGVhZChuZXQsIHJlZywKKwkJCQkgIG5mX2VudHJ5X2RlcmVmZXJlbmNlKGhvb2tzX2VudHJ5LT5uZXh0KSk7CisJCWdvdG8gdW5sb2NrOwogCX0KKwl3aGlsZSAoaG9va3NfZW50cnkgJiYgbmZfZW50cnlfZGVyZWZlcmVuY2UoaG9va3NfZW50cnktPm5leHQpKSB7CisJCXN0cnVjdCBuZl9ob29rX2VudHJ5ICpuZXh0ID0KKwkJCW5mX2VudHJ5X2RlcmVmZXJlbmNlKGhvb2tzX2VudHJ5LT5uZXh0KTsKKwkJc3RydWN0IG5mX2hvb2tfZW50cnkgKm5uZXh0OworCisJCWlmIChuZXh0LT5vcmlnX29wcyAhPSByZWcpIHsKKwkJCWhvb2tzX2VudHJ5ID0gbmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCW5uZXh0ID0gbmZfZW50cnlfZGVyZWZlcmVuY2UobmV4dC0+bmV4dCk7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihob29rc19lbnRyeS0+bmV4dCwgbm5leHQpOworCQlob29rc19lbnRyeSA9IG5leHQ7CisJCWJyZWFrOworCX0KKwordW5sb2NrOgogCW11dGV4X3VubG9jaygmbmZfaG9va19tdXRleCk7Ci0JaWYgKCZlbGVtLT5saXN0ID09IGhvb2tfbGlzdCkgeworCWlmICghaG9va3NfZW50cnkpIHsKIAkJV0FSTigxLCAibmZfdW5yZWdpc3Rlcl9uZXRfaG9vazogaG9vayBub3QgZm91bmQhXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE1MSwxMCArMjAxLDEwIEBACiAJc3RhdGljX2tleV9zbG93X2RlYygmbmZfaG9va3NfbmVlZGVkW3JlZy0+cGZdW3JlZy0+aG9va251bV0pOwogI2VuZGlmCiAJc3luY2hyb25pemVfbmV0KCk7Ci0JbmZfcXVldWVfbmZfaG9va19kcm9wKG5ldCwgJmVudHJ5LT5vcHMpOworCW5mX3F1ZXVlX25mX2hvb2tfZHJvcChuZXQsIGhvb2tzX2VudHJ5KTsKIAkvKiBvdGhlciBjcHUgbWlnaHQgc3RpbGwgcHJvY2VzcyBuZnF1ZXVlIHZlcmRpY3QgdGhhdCB1c2VkIHJlZyAqLwogCXN5bmNocm9uaXplX25ldCgpOwotCWtmcmVlKGVudHJ5KTsKKwlrZnJlZShob29rc19lbnRyeSk7CiB9CiBFWFBPUlRfU1lNQk9MKG5mX3VucmVnaXN0ZXJfbmV0X2hvb2spOwogCkBAIC0xODgsMTkgKzIzOCwxNyBAQAogCiBzdGF0aWMgTElTVF9IRUFEKG5mX2hvb2tfbGlzdCk7CiAKLWludCBuZl9yZWdpc3Rlcl9ob29rKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnKQorc3RhdGljIGludCBfbmZfcmVnaXN0ZXJfaG9vayhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZykKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQsICpsYXN0OwogCWludCByZXQ7CiAKLQlydG5sX2xvY2soKTsKIAlmb3JfZWFjaF9uZXQobmV0KSB7CiAJCXJldCA9IG5mX3JlZ2lzdGVyX25ldF9ob29rKG5ldCwgcmVnKTsKIAkJaWYgKHJldCAmJiByZXQgIT0gLUVOT0VOVCkKIAkJCWdvdG8gcm9sbGJhY2s7CiAJfQogCWxpc3RfYWRkX3RhaWwoJnJlZy0+bGlzdCwgJm5mX2hvb2tfbGlzdCk7Ci0JcnRubF91bmxvY2soKTsKIAogCXJldHVybiAwOwogcm9sbGJhY2s6CkBAIC0yMTAsMTkgKzI1OCwzNCBAQAogCQkJYnJlYWs7CiAJCW5mX3VucmVnaXN0ZXJfbmV0X2hvb2sobmV0LCByZWcpOwogCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgbmZfcmVnaXN0ZXJfaG9vayhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZykKK3sKKwlpbnQgcmV0OworCisJcnRubF9sb2NrKCk7CisJcmV0ID0gX25mX3JlZ2lzdGVyX2hvb2socmVnKTsKIAlydG5sX3VubG9jaygpOworCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wobmZfcmVnaXN0ZXJfaG9vayk7CiAKLXZvaWQgbmZfdW5yZWdpc3Rlcl9ob29rKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnKQorc3RhdGljIHZvaWQgX25mX3VucmVnaXN0ZXJfaG9vayhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZykKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQ7CiAKLQlydG5sX2xvY2soKTsKIAlsaXN0X2RlbCgmcmVnLT5saXN0KTsKIAlmb3JfZWFjaF9uZXQobmV0KQogCQluZl91bnJlZ2lzdGVyX25ldF9ob29rKG5ldCwgcmVnKTsKK30KKwordm9pZCBuZl91bnJlZ2lzdGVyX2hvb2soc3RydWN0IG5mX2hvb2tfb3BzICpyZWcpCit7CisJcnRubF9sb2NrKCk7CisJX25mX3VucmVnaXN0ZXJfaG9vayhyZWcpOwogCXJ0bmxfdW5sb2NrKCk7CiB9CiBFWFBPUlRfU1lNQk9MKG5mX3VucmVnaXN0ZXJfaG9vayk7CkBAIC0yNDYsNiArMzA5LDI2IEBACiB9CiBFWFBPUlRfU1lNQk9MKG5mX3JlZ2lzdGVyX2hvb2tzKTsKIAorLyogQ2FsbGVyIE1VU1QgdGFrZSBydG5sX2xvY2soKSAqLworaW50IF9uZl9yZWdpc3Rlcl9ob29rcyhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZywgdW5zaWduZWQgaW50IG4pCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGVyciA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCWVyciA9IF9uZl9yZWdpc3Rlcl9ob29rKCZyZWdbaV0pOworCQlpZiAoZXJyKQorCQkJZ290byBlcnI7CisJfQorCXJldHVybiBlcnI7CisKK2VycjoKKwlpZiAoaSA+IDApCisJCV9uZl91bnJlZ2lzdGVyX2hvb2tzKHJlZywgaSk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woX25mX3JlZ2lzdGVyX2hvb2tzKTsKKwogdm9pZCBuZl91bnJlZ2lzdGVyX2hvb2tzKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnLCB1bnNpZ25lZCBpbnQgbikKIHsKIAl3aGlsZSAobi0tID4gMCkKQEAgLTI1MywxMCArMzM2LDE3IEBACiB9CiBFWFBPUlRfU1lNQk9MKG5mX3VucmVnaXN0ZXJfaG9va3MpOwogCi11bnNpZ25lZCBpbnQgbmZfaXRlcmF0ZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKy8qIENhbGxlciBNVVNUIHRha2UgcnRubF9sb2NrICovCit2b2lkIF9uZl91bnJlZ2lzdGVyX2hvb2tzKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnLCB1bnNpZ25lZCBpbnQgbikKK3sKKwl3aGlsZSAobi0tID4gMCkKKwkJX25mX3VucmVnaXN0ZXJfaG9vaygmcmVnW25dKTsKK30KK0VYUE9SVF9TWU1CT0woX25mX3VucmVnaXN0ZXJfaG9va3MpOworCit1bnNpZ25lZCBpbnQgbmZfaXRlcmF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAotCQkJc3RydWN0IG5mX2hvb2tfb3BzICoqZWxlbXApCisJCQlzdHJ1Y3QgbmZfaG9va19lbnRyeSAqKmVudHJ5cCkKIHsKIAl1bnNpZ25lZCBpbnQgdmVyZGljdDsKIApAQCAtMjY0LDIwICszNTQsMjMgQEAKIAkgKiBUaGUgY2FsbGVyIG11c3Qgbm90IGJsb2NrIGJldHdlZW4gY2FsbHMgdG8gdGhpcwogCSAqIGZ1bmN0aW9uIGJlY2F1c2Ugb2YgcmlzayBvZiBjb250aW51aW5nIGZyb20gZGVsZXRlZCBlbGVtZW50LgogCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmN1KCgqZWxlbXApLCBoZWFkLCBsaXN0KSB7Ci0JCWlmIChzdGF0ZS0+dGhyZXNoID4gKCplbGVtcCktPnByaW9yaXR5KQorCXdoaWxlICgqZW50cnlwKSB7CisJCWlmIChzdGF0ZS0+dGhyZXNoID4gKCplbnRyeXApLT5vcHMucHJpb3JpdHkpIHsKKwkJCSplbnRyeXAgPSByY3VfZGVyZWZlcmVuY2UoKCplbnRyeXApLT5uZXh0KTsKIAkJCWNvbnRpbnVlOworCQl9CiAKIAkJLyogT3B0aW1pemF0aW9uOiB3ZSBkb24ndCBuZWVkIHRvIGhvbGQgbW9kdWxlCiAJCSAgIHJlZmVyZW5jZSBoZXJlLCBzaW5jZSBmdW5jdGlvbiBjYW4ndCBzbGVlcC4gLS1SUiAqLwogcmVwZWF0OgotCQl2ZXJkaWN0ID0gKCplbGVtcCktPmhvb2soKCplbGVtcCktPnByaXYsIHNrYiwgc3RhdGUpOworCQl2ZXJkaWN0ID0gKCplbnRyeXApLT5vcHMuaG9vaygoKmVudHJ5cCktPm9wcy5wcml2LCBza2IsIHN0YXRlKTsKIAkJaWYgKHZlcmRpY3QgIT0gTkZfQUNDRVBUKSB7CiAjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRwogCQkJaWYgKHVubGlrZWx5KCh2ZXJkaWN0ICYgTkZfVkVSRElDVF9NQVNLKQogCQkJCQkJCT4gTkZfTUFYX1ZFUkRJQ1QpKSB7CiAJCQkJTkZERUJVRygiRXZpbCByZXR1cm4gZnJvbSAlcCgldSkuXG4iLAotCQkJCQkoKmVsZW1wKS0+aG9vaywgc3RhdGUtPmhvb2spOworCQkJCQkoKmVudHJ5cCktPm9wcy5ob29rLCBzdGF0ZS0+aG9vayk7CisJCQkJKmVudHJ5cCA9IHJjdV9kZXJlZmVyZW5jZSgoKmVudHJ5cCktPm5leHQpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogI2VuZGlmCkBAIC0yODUsMjUgKzM3OCwyMyBAQAogCQkJCXJldHVybiB2ZXJkaWN0OwogCQkJZ290byByZXBlYXQ7CiAJCX0KKwkJKmVudHJ5cCA9IHJjdV9kZXJlZmVyZW5jZSgoKmVudHJ5cCktPm5leHQpOwogCX0KIAlyZXR1cm4gTkZfQUNDRVBUOwogfQogCiAKIC8qIFJldHVybnMgMSBpZiBva2ZuKCkgbmVlZHMgdG8gYmUgZXhlY3V0ZWQgYnkgdGhlIGNhbGxlciwKLSAqIC1FUEVSTSBmb3IgTkZfRFJPUCwgMCBvdGhlcndpc2UuICovCisgKiAtRVBFUk0gZm9yIE5GX0RST1AsIDAgb3RoZXJ3aXNlLiAgQ2FsbGVyIG11c3QgaG9sZCByY3VfcmVhZF9sb2NrLiAqLwogaW50IG5mX2hvb2tfc2xvdyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7Ci0Jc3RydWN0IG5mX2hvb2tfb3BzICplbGVtOworCXN0cnVjdCBuZl9ob29rX2VudHJ5ICplbnRyeTsKIAl1bnNpZ25lZCBpbnQgdmVyZGljdDsKIAlpbnQgcmV0ID0gMDsKIAotCS8qIFdlIG1heSBhbHJlYWR5IGhhdmUgdGhpcywgYnV0IHJlYWQtbG9ja3MgbmVzdCBhbnl3YXkgKi8KLQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQllbGVtID0gbGlzdF9lbnRyeV9yY3Uoc3RhdGUtPmhvb2tfbGlzdCwgc3RydWN0IG5mX2hvb2tfb3BzLCBsaXN0KTsKKwllbnRyeSA9IHJjdV9kZXJlZmVyZW5jZShzdGF0ZS0+aG9va19lbnRyaWVzKTsKIG5leHRfaG9vazoKLQl2ZXJkaWN0ID0gbmZfaXRlcmF0ZShzdGF0ZS0+aG9va19saXN0LCBza2IsIHN0YXRlLCAmZWxlbSk7CisJdmVyZGljdCA9IG5mX2l0ZXJhdGUoc2tiLCBzdGF0ZSwgJmVudHJ5KTsKIAlpZiAodmVyZGljdCA9PSBORl9BQ0NFUFQgfHwgdmVyZGljdCA9PSBORl9TVE9QKSB7CiAJCXJldCA9IDE7CiAJfSBlbHNlIGlmICgodmVyZGljdCAmIE5GX1ZFUkRJQ1RfTUFTSykgPT0gTkZfRFJPUCkgewpAQCAtMzEyLDggKzQwMywxMCBAQAogCQlpZiAocmV0ID09IDApCiAJCQlyZXQgPSAtRVBFUk07CiAJfSBlbHNlIGlmICgodmVyZGljdCAmIE5GX1ZFUkRJQ1RfTUFTSykgPT0gTkZfUVVFVUUpIHsKLQkJaW50IGVyciA9IG5mX3F1ZXVlKHNrYiwgZWxlbSwgc3RhdGUsCi0JCQkJICAgdmVyZGljdCA+PiBORl9WRVJESUNUX1FCSVRTKTsKKwkJaW50IGVycjsKKworCQlSQ1VfSU5JVF9QT0lOVEVSKHN0YXRlLT5ob29rX2VudHJpZXMsIGVudHJ5KTsKKwkJZXJyID0gbmZfcXVldWUoc2tiLCBzdGF0ZSwgdmVyZGljdCA+PiBORl9WRVJESUNUX1FCSVRTKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWlmIChlcnIgPT0gLUVTUkNIICYmCiAJCQkgICAodmVyZGljdCAmIE5GX1ZFUkRJQ1RfRkxBR19RVUVVRV9CWVBBU1MpKQpAQCAtMzIxLDcgKzQxNCw2IEBACiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJfQogCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChuZl9ob29rX3Nsb3cpOwpAQCAtNDQxLDcgKzUzMyw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShuZXQtPm5mLmhvb2tzKTsgaSsrKSB7CiAJCWZvciAoaCA9IDA7IGggPCBORl9NQVhfSE9PS1M7IGgrKykKLQkJCUlOSVRfTElTVF9IRUFEKCZuZXQtPm5mLmhvb2tzW2ldW2hdKTsKKwkJCVJDVV9JTklUX1BPSU5URVIobmV0LT5uZi5ob29rc1tpXVtoXSwgTlVMTCk7CiAJfQogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19uZmN0LmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbmZjdC5jCmluZGV4IGYwNGZkOGQuLmZjMjMwZDkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19uZmN0LmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX25mY3QuYwpAQCAtMjgxLDEzICsyODEsMTAgQEAKIAloID0gbmZfY29ubnRyYWNrX2ZpbmRfZ2V0KGNwLT5pcHZzLT5uZXQsICZuZl9jdF96b25lX2RmbHQsICZ0dXBsZSk7CiAJaWYgKGgpIHsKIAkJY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCQkvKiBTaG93IHdoYXQgaGFwcGVucyBpbnN0ZWFkIG9mIGNhbGxpbmcgbmZfY3Rfa2lsbCgpICovCi0JCWlmIChkZWxfdGltZXIoJmN0LT50aW1lb3V0KSkgewotCQkJSVBfVlNfREJHKDcsICIlczogY3Q9JXAsIGRlbGV0ZWQgY29ubnRyYWNrIHRpbWVyIGZvciB0dXBsZT0iCisJCWlmIChuZl9jdF9raWxsKGN0KSkgeworCQkJSVBfVlNfREJHKDcsICIlczogY3Q9JXAsIGRlbGV0ZWQgY29ubnRyYWNrIGZvciB0dXBsZT0iCiAJCQkJRk1UX1RVUExFICJcbiIsCiAJCQkJX19mdW5jX18sIGN0LCBBUkdfVFVQTEUoJnR1cGxlKSk7Ci0JCQlpZiAoY3QtPnRpbWVvdXQuZnVuY3Rpb24pCi0JCQkJY3QtPnRpbWVvdXQuZnVuY3Rpb24oY3QtPnRpbWVvdXQuZGF0YSk7CiAJCX0gZWxzZSB7CiAJCQlJUF9WU19EQkcoNywgIiVzOiBjdD0lcCwgbm8gY29ubnRyYWNrIHRpbWVyIGZvciB0dXBsZT0iCiAJCQkJRk1UX1RVUExFICJcbiIsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKaW5kZXggZGQyYzQzYS4uYmE2YTFkNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYwpAQCAtNzIsMTIgKzcyLDI0IEBACiBzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqbmZfY29ubnRyYWNrX2hhc2ggX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19oYXNoKTsKIAorc3RydWN0IGNvbm50cmFja19nY193b3JrIHsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCWR3b3JrOworCXUzMgkJCWxhc3RfYnVja2V0OworCWJvb2wJCQlleGl0aW5nOworfTsKKwogc3RhdGljIF9fcmVhZF9tb3N0bHkgc3RydWN0IGttZW1fY2FjaGUgKm5mX2Nvbm50cmFja19jYWNoZXA7CiBzdGF0aWMgX19yZWFkX21vc3RseSBzcGlubG9ja190IG5mX2Nvbm50cmFja19sb2Nrc19hbGxfbG9jazsKLXN0YXRpYyBfX3JlYWRfbW9zdGx5IHNlcWNvdW50X3QgbmZfY29ubnRyYWNrX2dlbmVyYXRpb247CiBzdGF0aWMgX19yZWFkX21vc3RseSBERUZJTkVfU1BJTkxPQ0sobmZfY29ubnRyYWNrX2xvY2tzX2FsbF9sb2NrKTsKIHN0YXRpYyBfX3JlYWRfbW9zdGx5IGJvb2wgbmZfY29ubnRyYWNrX2xvY2tzX2FsbDsKIAorI2RlZmluZSBHQ19NQVhfQlVDS0VUU19ESVYJNjR1CisjZGVmaW5lIEdDX01BWF9CVUNLRVRTCQk4MTkydQorI2RlZmluZSBHQ19JTlRFUlZBTAkJKDUgKiBIWikKKyNkZWZpbmUgR0NfTUFYX0VWSUNUUwkJMjU2dQorCitzdGF0aWMgc3RydWN0IGNvbm50cmFja19nY193b3JrIGNvbm50cmFja19nY193b3JrOworCiB2b2lkIG5mX2Nvbm50cmFja19sb2NrKHNwaW5sb2NrX3QgKmxvY2spIF9fYWNxdWlyZXMobG9jaykKIHsKIAlzcGluX2xvY2sobG9jayk7CkBAIC0xNjQsNyArMTc2LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19odGFibGVfc2l6ZSk7CiAKIHVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfbWF4IF9fcmVhZF9tb3N0bHk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfbWF4KTsKK3NlcWNvdW50X3QgbmZfY29ubnRyYWNrX2dlbmVyYXRpb24gX19yZWFkX21vc3RseTsKIAogREVGSU5FX1BFUl9DUFUoc3RydWN0IG5mX2Nvbm4sIG5mX2Nvbm50cmFja191bnRyYWNrZWQpOwogRVhQT1JUX1BFUl9DUFVfU1lNQk9MKG5mX2Nvbm50cmFja191bnRyYWNrZWQpOwpAQCAtMzY3LDEyICszNzksMTAgQEAKIGRlc3Ryb3lfY29ubnRyYWNrKHN0cnVjdCBuZl9jb25udHJhY2sgKm5mY3QpCiB7CiAJc3RydWN0IG5mX2Nvbm4gKmN0ID0gKHN0cnVjdCBuZl9jb25uICopbmZjdDsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpOwogCXN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bzsKIAogCXByX2RlYnVnKCJkZXN0cm95X2Nvbm50cmFjayglcClcbiIsIGN0KTsKIAlORl9DVF9BU1NFUlQoYXRvbWljX3JlYWQoJm5mY3QtPnVzZSkgPT0gMCk7Ci0JTkZfQ1RfQVNTRVJUKCF0aW1lcl9wZW5kaW5nKCZjdC0+dGltZW91dCkpOwogCiAJaWYgKHVubGlrZWx5KG5mX2N0X2lzX3RlbXBsYXRlKGN0KSkpIHsKIAkJbmZfY3RfdG1wbF9mcmVlKGN0KTsKQEAgLTM5NSw3ICs0MDUsNiBAQAogCiAJbmZfY3RfZGVsX2Zyb21fZHlpbmdfb3JfdW5jb25maXJtZWRfbGlzdChjdCk7CiAKLQlORl9DVF9TVEFUX0lOQyhuZXQsIGRlbGV0ZSk7CiAJbG9jYWxfYmhfZW5hYmxlKCk7CiAKIAlpZiAoY3QtPm1hc3RlcikKQEAgLTQyNyw3ICs0MzYsNiBAQAogCiAJbmZfY3RfYWRkX3RvX2R5aW5nX2xpc3QoY3QpOwogCi0JTkZfQ1RfU1RBVF9JTkMobmV0LCBkZWxldGVfbGlzdCk7CiAJbG9jYWxfYmhfZW5hYmxlKCk7CiB9CiAKQEAgLTQzNSwzNSArNDQzLDMwIEBACiB7CiAJc3RydWN0IG5mX2Nvbm5fdHN0YW1wICp0c3RhbXA7CiAKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChJUFNfRFlJTkdfQklULCAmY3QtPnN0YXR1cykpCisJCXJldHVybiBmYWxzZTsKKwogCXRzdGFtcCA9IG5mX2Nvbm5fdHN0YW1wX2ZpbmQoY3QpOwogCWlmICh0c3RhbXAgJiYgdHN0YW1wLT5zdG9wID09IDApCiAJCXRzdGFtcC0+c3RvcCA9IGt0aW1lX2dldF9yZWFsX25zKCk7CiAKLQlpZiAobmZfY3RfaXNfZHlpbmcoY3QpKQotCQlnb3RvIGRlbGV0ZTsKLQogCWlmIChuZl9jb25udHJhY2tfZXZlbnRfcmVwb3J0KElQQ1RfREVTVFJPWSwgY3QsCiAJCQkJICAgIHBvcnRpZCwgcmVwb3J0KSA8IDApIHsKLQkJLyogZGVzdHJveSBldmVudCB3YXMgbm90IGRlbGl2ZXJlZCAqLworCQkvKiBkZXN0cm95IGV2ZW50IHdhcyBub3QgZGVsaXZlcmVkLiBuZl9jdF9wdXQgd2lsbAorCQkgKiBiZSBkb25lIGJ5IGV2ZW50IGNhY2hlIHdvcmtlciBvbiByZWRlbGl2ZXJ5LgorCQkgKi8KIAkJbmZfY3RfZGVsZXRlX2Zyb21fbGlzdHMoY3QpOwogCQluZl9jb25udHJhY2tfZWNhY2hlX2RlbGF5ZWRfd29yayhuZl9jdF9uZXQoY3QpKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCW5mX2Nvbm50cmFja19lY2FjaGVfd29yayhuZl9jdF9uZXQoY3QpKTsKLQlzZXRfYml0KElQU19EWUlOR19CSVQsICZjdC0+c3RhdHVzKTsKLSBkZWxldGU6CiAJbmZfY3RfZGVsZXRlX2Zyb21fbGlzdHMoY3QpOwogCW5mX2N0X3B1dChjdCk7CiAJcmV0dXJuIHRydWU7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9kZWxldGUpOwogCi1zdGF0aWMgdm9pZCBkZWF0aF9ieV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgdWxfY29ubnRyYWNrKQotewotCW5mX2N0X2RlbGV0ZSgoc3RydWN0IG5mX2Nvbm4gKil1bF9jb25udHJhY2ssIDAsIDApOwotfQotCiBzdGF0aWMgaW5saW5lIGJvb2wKIG5mX2N0X2tleV9lcXVhbChzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmgsCiAJCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLApAQCAtNDgxLDIyICs0ODQsMTcgQEAKIAkgICAgICAgbmV0X2VxKG5ldCwgbmZfY3RfbmV0KGN0KSk7CiB9CiAKLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggcmN1IHJlYWQgbG9jayBoZWxkICovCi12b2lkIG5mX2Nvbm50cmFja19nZXRfaHQoc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKipoYXNoLCB1bnNpZ25lZCBpbnQgKmhzaXplKQorLyogY2FsbGVyIG11c3QgaG9sZCByY3UgcmVhZGxvY2sgYW5kIG5vbmUgb2YgdGhlIG5mX2Nvbm50cmFja19sb2NrcyAqLworc3RhdGljIHZvaWQgbmZfY3RfZ2NfZXhwaXJlZChzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7Ci0Jc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhwdHI7Ci0JdW5zaWduZWQgaW50IHNlcXVlbmNlLCBoc3o7CisJaWYgKCFhdG9taWNfaW5jX25vdF96ZXJvKCZjdC0+Y3RfZ2VuZXJhbC51c2UpKQorCQlyZXR1cm47CiAKLQlkbyB7Ci0JCXNlcXVlbmNlID0gcmVhZF9zZXFjb3VudF9iZWdpbigmbmZfY29ubnRyYWNrX2dlbmVyYXRpb24pOwotCQloc3ogPSBuZl9jb25udHJhY2tfaHRhYmxlX3NpemU7Ci0JCWhwdHIgPSBuZl9jb25udHJhY2tfaGFzaDsKLQl9IHdoaWxlIChyZWFkX3NlcWNvdW50X3JldHJ5KCZuZl9jb25udHJhY2tfZ2VuZXJhdGlvbiwgc2VxdWVuY2UpKTsKKwlpZiAobmZfY3Rfc2hvdWxkX2djKGN0KSkKKwkJbmZfY3Rfa2lsbChjdCk7CiAKLQkqaGFzaCA9IGhwdHI7Ci0JKmhzaXplID0gaHN6OworCW5mX2N0X3B1dChjdCk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfZ2V0X2h0KTsKIAogLyoKICAqIFdhcm5pbmcgOgpAQCAtNTEwLDIxICs1MDgsMjYgQEAKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7CiAJc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmN0X2hhc2g7CiAJc3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47Ci0JdW5zaWduZWQgaW50IGJ1Y2tldCwgc2VxdWVuY2U7CisJdW5zaWduZWQgaW50IGJ1Y2tldCwgaHNpemU7CiAKIGJlZ2luOgotCWRvIHsKLQkJc2VxdWVuY2UgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZuZl9jb25udHJhY2tfZ2VuZXJhdGlvbik7Ci0JCWJ1Y2tldCA9IHNjYWxlX2hhc2goaGFzaCk7Ci0JCWN0X2hhc2ggPSBuZl9jb25udHJhY2tfaGFzaDsKLQl9IHdoaWxlIChyZWFkX3NlcWNvdW50X3JldHJ5KCZuZl9jb25udHJhY2tfZ2VuZXJhdGlvbiwgc2VxdWVuY2UpKTsKKwluZl9jb25udHJhY2tfZ2V0X2h0KCZjdF9oYXNoLCAmaHNpemUpOworCWJ1Y2tldCA9IHJlY2lwcm9jYWxfc2NhbGUoaGFzaCwgaHNpemUpOwogCiAJaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGgsIG4sICZjdF9oYXNoW2J1Y2tldF0sIGhubm9kZSkgewotCQlpZiAobmZfY3Rfa2V5X2VxdWFsKGgsIHR1cGxlLCB6b25lLCBuZXQpKSB7Ci0JCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBmb3VuZCk7Ci0JCQlyZXR1cm4gaDsKKwkJc3RydWN0IG5mX2Nvbm4gKmN0OworCisJCWN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKKwkJaWYgKG5mX2N0X2lzX2V4cGlyZWQoY3QpKSB7CisJCQluZl9jdF9nY19leHBpcmVkKGN0KTsKKwkJCWNvbnRpbnVlOwogCQl9Ci0JCU5GX0NUX1NUQVRfSU5DX0FUT01JQyhuZXQsIHNlYXJjaGVkKTsKKworCQlpZiAobmZfY3RfaXNfZHlpbmcoY3QpKQorCQkJY29udGludWU7CisKKwkJaWYgKG5mX2N0X2tleV9lcXVhbChoLCB0dXBsZSwgem9uZSwgbmV0KSkKKwkJCXJldHVybiBoOwogCX0KIAkvKgogCSAqIGlmIHRoZSBudWxscyB2YWx1ZSB3ZSBnb3QgYXQgdGhlIGVuZCBvZiB0aGlzIGxvb2t1cCBpcwpAQCAtNjE4LDcgKzYyMSw2IEBACiAJCQkJICAgIHpvbmUsIG5ldCkpCiAJCQlnb3RvIG91dDsKIAotCWFkZF90aW1lcigmY3QtPnRpbWVvdXQpOwogCXNtcF93bWIoKTsKIAkvKiBUaGUgY2FsbGVyIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0ICovCiAJYXRvbWljX3NldCgmY3QtPmN0X2dlbmVyYWwudXNlLCAyKTsKQEAgLTc3MSw4ICs3NzMsNyBAQAogCS8qIFRpbWVyIHJlbGF0aXZlIHRvIGNvbmZpcm1hdGlvbiB0aW1lLCBub3Qgb3JpZ2luYWwKIAkgICBzZXR0aW5nIHRpbWUsIG90aGVyd2lzZSB3ZSdkIGdldCB0aW1lciB3cmFwIGluCiAJICAgd2VpcmQgZGVsYXkgY2FzZXMuICovCi0JY3QtPnRpbWVvdXQuZXhwaXJlcyArPSBqaWZmaWVzOwotCWFkZF90aW1lcigmY3QtPnRpbWVvdXQpOworCWN0LT50aW1lb3V0ICs9IG5mY3RfdGltZV9zdGFtcDsKIAlhdG9taWNfaW5jKCZjdC0+Y3RfZ2VuZXJhbC51c2UpOwogCWN0LT5zdGF0dXMgfD0gSVBTX0NPTkZJUk1FRDsKIApAQCAtNzkxLDcgKzc5Miw2IEBACiAJICovCiAJX19uZl9jb25udHJhY2tfaGFzaF9pbnNlcnQoY3QsIGhhc2gsIHJlcGx5X2hhc2gpOwogCW5mX2Nvbm50cmFja19kb3VibGVfdW5sb2NrKGhhc2gsIHJlcGx5X2hhc2gpOwotCU5GX0NUX1NUQVRfSU5DKG5ldCwgaW5zZXJ0KTsKIAlsb2NhbF9iaF9lbmFibGUoKTsKIAogCWhlbHAgPSBuZmN0X2hlbHAoY3QpOwpAQCAtODIzLDI5ICs4MjMsNDAgQEAKIAljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgKnpvbmU7CiAJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwogCXN0cnVjdCBobGlzdF9udWxsc19oZWFkICpjdF9oYXNoOwotCXVuc2lnbmVkIGludCBoYXNoLCBzZXF1ZW5jZTsKKwl1bnNpZ25lZCBpbnQgaGFzaCwgaHNpemU7CiAJc3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCiAJem9uZSA9IG5mX2N0X3pvbmUoaWdub3JlZF9jb25udHJhY2spOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWRvIHsKLQkJc2VxdWVuY2UgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZuZl9jb25udHJhY2tfZ2VuZXJhdGlvbik7Ci0JCWhhc2ggPSBoYXNoX2Nvbm50cmFjayhuZXQsIHR1cGxlKTsKLQkJY3RfaGFzaCA9IG5mX2Nvbm50cmFja19oYXNoOwotCX0gd2hpbGUgKHJlYWRfc2VxY291bnRfcmV0cnkoJm5mX2Nvbm50cmFja19nZW5lcmF0aW9uLCBzZXF1ZW5jZSkpOworIGJlZ2luOgorCW5mX2Nvbm50cmFja19nZXRfaHQoJmN0X2hhc2gsICZoc2l6ZSk7CisJaGFzaCA9IF9faGFzaF9jb25udHJhY2sobmV0LCB0dXBsZSwgaHNpemUpOwogCiAJaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGgsIG4sICZjdF9oYXNoW2hhc2hdLCBobm5vZGUpIHsKIAkJY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCQlpZiAoY3QgIT0gaWdub3JlZF9jb25udHJhY2sgJiYKLQkJICAgIG5mX2N0X2tleV9lcXVhbChoLCB0dXBsZSwgem9uZSwgbmV0KSkgeworCisJCWlmIChjdCA9PSBpZ25vcmVkX2Nvbm50cmFjaykKKwkJCWNvbnRpbnVlOworCisJCWlmIChuZl9jdF9pc19leHBpcmVkKGN0KSkgeworCQkJbmZfY3RfZ2NfZXhwaXJlZChjdCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChuZl9jdF9rZXlfZXF1YWwoaCwgdHVwbGUsIHpvbmUsIG5ldCkpIHsKIAkJCU5GX0NUX1NUQVRfSU5DX0FUT01JQyhuZXQsIGZvdW5kKTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJcmV0dXJuIDE7CiAJCX0KLQkJTkZfQ1RfU1RBVF9JTkNfQVRPTUlDKG5ldCwgc2VhcmNoZWQpOwogCX0KKworCWlmIChnZXRfbnVsbHNfdmFsdWUobikgIT0gaGFzaCkgeworCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBzZWFyY2hfcmVzdGFydCk7CisJCWdvdG8gYmVnaW47CisJfQorCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyZXR1cm4gMDsKQEAgLTg2Nyw2ICs4NzgsMTEgQEAKIAlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UoaCwgbiwgaGVhZCwgaG5ub2RlKSB7CiAJCXRtcCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7CiAKKwkJaWYgKG5mX2N0X2lzX2V4cGlyZWQodG1wKSkgeworCQkJbmZfY3RfZ2NfZXhwaXJlZCh0bXApOworCQkJY29udGludWU7CisJCX0KKwogCQlpZiAodGVzdF9iaXQoSVBTX0FTU1VSRURfQklULCAmdG1wLT5zdGF0dXMpIHx8CiAJCSAgICAhbmV0X2VxKG5mX2N0X25ldCh0bXApLCBuZXQpIHx8CiAJCSAgICBuZl9jdF9pc19keWluZyh0bXApKQpAQCAtODg0LDcgKzkwMCw2IEBACiAJCSAqLwogCQlpZiAobmV0X2VxKG5mX2N0X25ldCh0bXApLCBuZXQpICYmCiAJCSAgICBuZl9jdF9pc19jb25maXJtZWQodG1wKSAmJgotCQkgICAgZGVsX3RpbWVyKCZ0bXAtPnRpbWVvdXQpICYmCiAJCSAgICBuZl9jdF9kZWxldGUodG1wLCAwLCAwKSkKIAkJCWRyb3BzKys7CiAKQEAgLTkwMCwxNCArOTE1LDExIEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgTkZfQ1RfRVZJQ1RJT05fUkFOR0U7IGkrKykgewogCQlzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqY3RfaGFzaDsKLQkJdW5zaWduZWQgaGFzaCwgc2VxdWVuY2UsIGRyb3BzOworCQl1bnNpZ25lZCBpbnQgaGFzaCwgaHNpemUsIGRyb3BzOwogCiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJZG8gewotCQkJc2VxdWVuY2UgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZuZl9jb25udHJhY2tfZ2VuZXJhdGlvbik7Ci0JCQloYXNoID0gc2NhbGVfaGFzaChfaGFzaCsrKTsKLQkJCWN0X2hhc2ggPSBuZl9jb25udHJhY2tfaGFzaDsKLQkJfSB3aGlsZSAocmVhZF9zZXFjb3VudF9yZXRyeSgmbmZfY29ubnRyYWNrX2dlbmVyYXRpb24sIHNlcXVlbmNlKSk7CisJCW5mX2Nvbm50cmFja19nZXRfaHQoJmN0X2hhc2gsICZoc2l6ZSk7CisJCWhhc2ggPSByZWNpcHJvY2FsX3NjYWxlKF9oYXNoKyssIGhzaXplKTsKIAogCQlkcm9wcyA9IGVhcmx5X2Ryb3BfbGlzdChuZXQsICZjdF9oYXNoW2hhc2hdKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC05MjEsNiArOTMzLDY5IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCitzdGF0aWMgdm9pZCBnY193b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXVuc2lnbmVkIGludCBpLCBnb2FsLCBidWNrZXRzID0gMCwgZXhwaXJlZF9jb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBuZXh0X3J1biA9IEdDX0lOVEVSVkFMOworCXVuc2lnbmVkIGludCByYXRpbywgc2Nhbm5lZCA9IDA7CisJc3RydWN0IGNvbm50cmFja19nY193b3JrICpnY193b3JrOworCisJZ2Nfd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY29ubnRyYWNrX2djX3dvcmssIGR3b3JrLndvcmspOworCisJZ29hbCA9IG1pbihuZl9jb25udHJhY2tfaHRhYmxlX3NpemUgLyBHQ19NQVhfQlVDS0VUU19ESVYsIEdDX01BWF9CVUNLRVRTKTsKKwlpID0gZ2Nfd29yay0+bGFzdF9idWNrZXQ7CisKKwlkbyB7CisJCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKKwkJc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmN0X2hhc2g7CisJCXN0cnVjdCBobGlzdF9udWxsc19ub2RlICpuOworCQl1bnNpZ25lZCBpbnQgaGFzaHN6OworCQlzdHJ1Y3QgbmZfY29ubiAqdG1wOworCisJCWkrKzsKKwkJcmN1X3JlYWRfbG9jaygpOworCisJCW5mX2Nvbm50cmFja19nZXRfaHQoJmN0X2hhc2gsICZoYXNoc3opOworCQlpZiAoaSA+PSBoYXNoc3opCisJCQlpID0gMDsKKworCQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UoaCwgbiwgJmN0X2hhc2hbaV0sIGhubm9kZSkgeworCQkJdG1wID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKKworCQkJc2Nhbm5lZCsrOworCQkJaWYgKG5mX2N0X2lzX2V4cGlyZWQodG1wKSkgeworCQkJCW5mX2N0X2djX2V4cGlyZWQodG1wKTsKKwkJCQlleHBpcmVkX2NvdW50Kys7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKiBjb3VsZCBjaGVjayBnZXRfbnVsbHNfdmFsdWUoKSBoZXJlIGFuZCByZXN0YXJ0IGlmIGN0CisJCSAqIHdhcyBtb3ZlZCB0byBhbm90aGVyIGNoYWluLiAgQnV0IGdpdmVuIGdjIGlzIGJlc3QtZWZmb3J0CisJCSAqIHdlIHdpbGwganVzdCBjb250aW51ZSB3aXRoIG5leHQgaGFzaCBzbG90LgorCQkgKi8KKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCWNvbmRfcmVzY2hlZF9yY3VfcXMoKTsKKwl9IHdoaWxlICgrK2J1Y2tldHMgPCBnb2FsICYmCisJCSBleHBpcmVkX2NvdW50IDwgR0NfTUFYX0VWSUNUUyk7CisKKwlpZiAoZ2Nfd29yay0+ZXhpdGluZykKKwkJcmV0dXJuOworCisJcmF0aW8gPSBzY2FubmVkID8gZXhwaXJlZF9jb3VudCAqIDEwMCAvIHNjYW5uZWQgOiAwOworCWlmIChyYXRpbyA+PSA5MCkKKwkJbmV4dF9ydW4gPSAwOworCisJZ2Nfd29yay0+bGFzdF9idWNrZXQgPSBpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZ2Nfd29yay0+ZHdvcmssIG5leHRfcnVuKTsKK30KKworc3RhdGljIHZvaWQgY29ubnRyYWNrX2djX3dvcmtfaW5pdChzdHJ1Y3QgY29ubnRyYWNrX2djX3dvcmsgKmdjX3dvcmspCit7CisJSU5JVF9ERUxBWUVEX1dPUksoJmdjX3dvcmstPmR3b3JrLCBnY193b3JrZXIpOworCWdjX3dvcmstPmV4aXRpbmcgPSBmYWxzZTsKK30KKwogc3RhdGljIHN0cnVjdCBuZl9jb25uICoKIF9fbmZfY29ubnRyYWNrX2FsbG9jKHN0cnVjdCBuZXQgKm5ldCwKIAkJICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgKnpvbmUsCkBAIC05NTcsOCArMTAzMiw2IEBACiAJLyogc2F2ZSBoYXNoIGZvciByZXVzaW5nIHdoZW4gY29uZmlybWluZyAqLwogCSoodW5zaWduZWQgbG9uZyAqKSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLmhubm9kZS5wcHJldikgPSBoYXNoOwogCWN0LT5zdGF0dXMgPSAwOwotCS8qIERvbid0IHNldCB0aW1lciB5ZXQ6IHdhaXQgZm9yIGNvbmZpcm1hdGlvbiAqLwotCXNldHVwX3RpbWVyKCZjdC0+dGltZW91dCwgZGVhdGhfYnlfdGltZW91dCwgKHVuc2lnbmVkIGxvbmcpY3QpOwogCXdyaXRlX3BuZXQoJmN0LT5jdF9uZXQsIG5ldCk7CiAJbWVtc2V0KCZjdC0+X19uZmN0X2luaXRfb2Zmc2V0WzBdLCAwLAogCSAgICAgICBvZmZzZXRvZihzdHJ1Y3QgbmZfY29ubiwgcHJvdG8pIC0KQEAgLTEwMzUsOSArMTEwOCw5IEBACiAJaWYgKElTX0VSUihjdCkpCiAJCXJldHVybiAoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICopY3Q7CiAKLQlpZiAodG1wbCAmJiBuZmN0X3N5bnByb3h5KHRtcGwpKSB7Ci0JCW5mY3Rfc2VxYWRqX2V4dF9hZGQoY3QpOwotCQluZmN0X3N5bnByb3h5X2V4dF9hZGQoY3QpOworCWlmICghbmZfY3RfYWRkX3N5bnByb3h5KGN0LCB0bXBsKSkgeworCQluZl9jb25udHJhY2tfZnJlZShjdCk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIAogCXRpbWVvdXRfZXh0ID0gdG1wbCA/IG5mX2N0X3RpbWVvdXRfZmluZCh0bXBsKSA6IE5VTEw7CkBAIC0xMDk2LDEwICsxMTY5LDggQEAKIAkJfQogCQlzcGluX3VubG9jaygmbmZfY29ubnRyYWNrX2V4cGVjdF9sb2NrKTsKIAl9Ci0JaWYgKCFleHApIHsKKwlpZiAoIWV4cCkKIAkJX19uZl9jdF90cnlfYXNzaWduX2hlbHBlcihjdCwgdG1wbCwgR0ZQX0FUT01JQyk7Ci0JCU5GX0NUX1NUQVRfSU5DKG5ldCwgbmV3KTsKLQl9CiAKIAkvKiBOb3cgaXQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgdW5jb25maXJtZWQgbGlzdCwgYnVtcCByZWZjb3VudCAqLwogCW5mX2Nvbm50cmFja19nZXQoJmN0LT5jdF9nZW5lcmFsKTsKQEAgLTEyMDQsNyArMTI3NSw3IEBACiAJCXNrYi0+bmZjdCA9IE5VTEw7CiAJfQogCi0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCisJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggKi8KIAlsM3Byb3RvID0gX19uZl9jdF9sM3Byb3RvX2ZpbmQocGYpOwogCXJldCA9IGwzcHJvdG8tPmdldF9sNHByb3RvKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYiksCiAJCQkJICAgJmRhdGFvZmYsICZwcm90b251bSk7CkBAIC0xMzMyLDcgKzE0MDMsNiBAQAogCQkJICB1bnNpZ25lZCBsb25nIGV4dHJhX2ppZmZpZXMsCiAJCQkgIGludCBkb19hY2N0KQogewotCU5GX0NUX0FTU0VSVChjdC0+dGltZW91dC5kYXRhID09ICh1bnNpZ25lZCBsb25nKWN0KTsKIAlORl9DVF9BU1NFUlQoc2tiKTsKIAogCS8qIE9ubHkgdXBkYXRlIGlmIHRoaXMgaXMgbm90IGEgZml4ZWQgdGltZW91dCAqLwpAQCAtMTM0MCwzOSArMTQxMCwyNSBAQAogCQlnb3RvIGFjY3Q7CiAKIAkvKiBJZiBub3QgaW4gaGFzaCB0YWJsZSwgdGltZXIgd2lsbCBub3QgYmUgYWN0aXZlIHlldCAqLwotCWlmICghbmZfY3RfaXNfY29uZmlybWVkKGN0KSkgewotCQljdC0+dGltZW91dC5leHBpcmVzID0gZXh0cmFfamlmZmllczsKLQl9IGVsc2UgewotCQl1bnNpZ25lZCBsb25nIG5ld3RpbWUgPSBqaWZmaWVzICsgZXh0cmFfamlmZmllczsKKwlpZiAobmZfY3RfaXNfY29uZmlybWVkKGN0KSkKKwkJZXh0cmFfamlmZmllcyArPSBuZmN0X3RpbWVfc3RhbXA7CiAKLQkJLyogT25seSB1cGRhdGUgdGhlIHRpbWVvdXQgaWYgdGhlIG5ldyB0aW1lb3V0IGlzIGF0IGxlYXN0Ci0JCSAgIEhaIGppZmZpZXMgZnJvbSB0aGUgb2xkIHRpbWVvdXQuIE5lZWQgZGVsX3RpbWVyIGZvciByYWNlCi0JCSAgIGF2b2lkYW5jZSAobWF5IGFscmVhZHkgYmUgZHlpbmcpLiAqLwotCQlpZiAobmV3dGltZSAtIGN0LT50aW1lb3V0LmV4cGlyZXMgPj0gSFopCi0JCQltb2RfdGltZXJfcGVuZGluZygmY3QtPnRpbWVvdXQsIG5ld3RpbWUpOwotCX0KLQorCWN0LT50aW1lb3V0ID0gZXh0cmFfamlmZmllczsKIGFjY3Q6CiAJaWYgKGRvX2FjY3QpCiAJCW5mX2N0X2FjY3RfdXBkYXRlKGN0LCBjdGluZm8sIHNrYi0+bGVuKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKF9fbmZfY3RfcmVmcmVzaF9hY2N0KTsKIAotYm9vbCBfX25mX2N0X2tpbGxfYWNjdChzdHJ1Y3QgbmZfY29ubiAqY3QsCi0JCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgICBpbnQgZG9fYWNjdCkKK2Jvb2wgbmZfY3Rfa2lsbF9hY2N0KHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWlmIChkb19hY2N0KQotCQluZl9jdF9hY2N0X3VwZGF0ZShjdCwgY3RpbmZvLCBza2ItPmxlbik7CisJbmZfY3RfYWNjdF91cGRhdGUoY3QsIGN0aW5mbywgc2tiLT5sZW4pOwogCi0JaWYgKGRlbF90aW1lcigmY3QtPnRpbWVvdXQpKSB7Ci0JCWN0LT50aW1lb3V0LmZ1bmN0aW9uKCh1bnNpZ25lZCBsb25nKWN0KTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gbmZfY3RfZGVsZXRlKGN0LCAwLCAwKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKF9fbmZfY3Rfa2lsbF9hY2N0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2tpbGxfYWNjdCk7CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19ORl9DVF9ORVRMSU5LKQogCkBAIC0xNTA1LDExICsxNTYxLDggQEAKIAogCXdoaWxlICgoY3QgPSBnZXRfbmV4dF9jb3Jwc2UobmV0LCBpdGVyLCBkYXRhLCAmYnVja2V0KSkgIT0gTlVMTCkgewogCQkvKiBUaW1lIHRvIHB1c2ggdXAgZGFpc2VzLi4uICovCi0JCWlmIChkZWxfdGltZXIoJmN0LT50aW1lb3V0KSkKLQkJCW5mX2N0X2RlbGV0ZShjdCwgcG9ydGlkLCByZXBvcnQpOwogCi0JCS8qIC4uLiBlbHNlIHRoZSB0aW1lciB3aWxsIGdldCBoaW0gc29vbi4gKi8KLQorCQluZl9jdF9kZWxldGUoY3QsIHBvcnRpZCwgcmVwb3J0KTsKIAkJbmZfY3RfcHV0KGN0KTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJfQpAQCAtMTU0NSw2ICsxNTk4LDcgQEAKIAogdm9pZCBuZl9jb25udHJhY2tfY2xlYW51cF9zdGFydCh2b2lkKQogeworCWNvbm50cmFja19nY193b3JrLmV4aXRpbmcgPSB0cnVlOwogCVJDVV9JTklUX1BPSU5URVIoaXBfY3RfYXR0YWNoLCBOVUxMKTsKIH0KIApAQCAtMTU1NCw2ICsxNjA4LDcgQEAKIAl3aGlsZSAodW50cmFja19yZWZzKCkgPiAwKQogCQlzY2hlZHVsZSgpOwogCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZjb25udHJhY2tfZ2Nfd29yay5kd29yayk7CiAJbmZfY3RfZnJlZV9oYXNodGFibGUobmZfY29ubnRyYWNrX2hhc2gsIG5mX2Nvbm50cmFja19odGFibGVfc2l6ZSk7CiAKIAluZl9jb25udHJhY2tfcHJvdG9fZmluaSgpOwpAQCAtMTgyOCw2ICsxODgzLDEwIEBACiAJfQogCS8qICAtIGFuZCBsb29rIGl0IGxpa2UgYXMgYSBjb25maXJtZWQgY29ubmVjdGlvbiAqLwogCW5mX2N0X3VudHJhY2tlZF9zdGF0dXNfb3IoSVBTX0NPTkZJUk1FRCB8IElQU19VTlRSQUNLRUQpOworCisJY29ubnRyYWNrX2djX3dvcmtfaW5pdCgmY29ubnRyYWNrX2djX3dvcmspOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY29ubnRyYWNrX2djX3dvcmsuZHdvcmssIEdDX0lOVEVSVkFMKTsKKwogCXJldHVybiAwOwogCiBlcnJfcHJvdG86CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jCmluZGV4IGQyODAxMWIuLmRhOWRmMmQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jCkBAIC00OSw4ICs0OSwxMyBAQAogCiAJaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnkoaCwgbiwgJnBjcHUtPmR5aW5nLCBobm5vZGUpIHsKIAkJc3RydWN0IG5mX2Nvbm4gKmN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKKwkJc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgKmU7CiAKLQkJaWYgKG5mX2N0X2lzX2R5aW5nKGN0KSkKKwkJaWYgKCFuZl9jdF9pc19jb25maXJtZWQoY3QpKQorCQkJY29udGludWU7CisKKwkJZSA9IG5mX2N0X2VjYWNoZV9maW5kKGN0KTsKKwkJaWYgKCFlIHx8IGUtPnN0YXRlICE9IE5GQ1RfRUNBQ0hFX0RFU1RST1lfRkFJTCkKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChuZl9jb25udHJhY2tfZXZlbnQoSVBDVF9ERVNUUk9ZLCBjdCkpIHsKQEAgLTU4LDggKzYzLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJLyogd2UndmUgZ290IHRoZSBldmVudCBkZWxpdmVyZWQsIG5vdyBpdCdzIGR5aW5nICovCi0JCXNldF9iaXQoSVBTX0RZSU5HX0JJVCwgJmN0LT5zdGF0dXMpOworCQllLT5zdGF0ZSA9IE5GQ1RfRUNBQ0hFX0RFU1RST1lfU0VOVDsKIAkJcmVmc1tldmljdGVkXSA9IGN0OwogCiAJCWlmICgrK2V2aWN0ZWQgPj0gQVJSQVlfU0laRShyZWZzKSkgewpAQCAtMTMwLDcgKzEzNCw3IEBACiAJaWYgKCFlKQogCQlnb3RvIG91dF91bmxvY2s7CiAKLQlpZiAobmZfY3RfaXNfY29uZmlybWVkKGN0KSAmJiAhbmZfY3RfaXNfZHlpbmcoY3QpKSB7CisJaWYgKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHsKIAkJc3RydWN0IG5mX2N0X2V2ZW50IGl0ZW0gPSB7CiAJCQkuY3QJPSBjdCwKIAkJCS5wb3J0aWQJPSBlLT5wb3J0aWQgPyBlLT5wb3J0aWQgOiBwb3J0aWQsCkBAIC0xNTAsMTEgKzE1NCwxMyBAQAogCQkJCSAqIHRyaWdnZXJlZCBieSBhIHByb2Nlc3MsIHdlIHN0b3JlIHRoZSBQT1JUSUQKIAkJCQkgKiB0byBpbmNsdWRlIGl0IGluIHRoZSByZXRyYW5zbWlzc2lvbi4KIAkJCQkgKi8KLQkJCQlpZiAoZXZlbnRtYXNrICYgKDEgPDwgSVBDVF9ERVNUUk9ZKSAmJgotCQkJCSAgICBlLT5wb3J0aWQgPT0gMCAmJiBwb3J0aWQgIT0gMCkKLQkJCQkJZS0+cG9ydGlkID0gcG9ydGlkOwotCQkJCWVsc2UKKwkJCQlpZiAoZXZlbnRtYXNrICYgKDEgPDwgSVBDVF9ERVNUUk9ZKSkgeworCQkJCQlpZiAoZS0+cG9ydGlkID09IDAgJiYgcG9ydGlkICE9IDApCisJCQkJCQllLT5wb3J0aWQgPSBwb3J0aWQ7CisJCQkJCWUtPnN0YXRlID0gTkZDVF9FQ0FDSEVfREVTVFJPWV9GQUlMOworCQkJCX0gZWxzZSB7CiAJCQkJCWUtPm1pc3NlZCB8PSBldmVudG1hc2s7CisJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQllLT5taXNzZWQgJj0gfm1pc3NlZDsKIAkJCX0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKaW5kZXggOWUzNjkzMS4uZjhkYmFjZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKQEAgLTU3NCw3ICs1NzQsNyBAQAogCWhlbHBlciA9IHJjdV9kZXJlZmVyZW5jZShuZmN0X2hlbHAoZXhwZWN0LT5tYXN0ZXIpLT5oZWxwZXIpOwogCWlmIChoZWxwZXIpIHsKIAkJc2VxX3ByaW50ZihzLCAiJXMlcyIsIGV4cGVjdC0+ZmxhZ3MgPyAiICIgOiAiIiwgaGVscGVyLT5uYW1lKTsKLQkJaWYgKGhlbHBlci0+ZXhwZWN0X3BvbGljeVtleHBlY3QtPmNsYXNzXS5uYW1lKQorCQlpZiAoaGVscGVyLT5leHBlY3RfcG9saWN5W2V4cGVjdC0+Y2xhc3NdLm5hbWVbMF0pCiAJCQlzZXFfcHJpbnRmKHMsICIvJXMiLAogCQkJCSAgIGhlbHBlci0+ZXhwZWN0X3BvbGljeVtleHBlY3QtPmNsYXNzXS5uYW1lKTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCmluZGV4IDQzMTQ3MDAuLmUzZWQyMDAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCkBAIC0yMzcsNyArMjM3LDcgQEAKIAl9CiAJZGVsaW0gPSBkYXRhWzBdOwogCWlmIChpc2RpZ2l0KGRlbGltKSB8fCBkZWxpbSA8IDMzIHx8IGRlbGltID4gMTI2IHx8IGRhdGFbMl0gIT0gZGVsaW0pIHsKLQkJcHJfZGVidWcoInRyeV9lcHJ0OiBpbnZhbGlkIGRlbGltaXR0ZXIuXG4iKTsKKwkJcHJfZGVidWcoInRyeV9lcHJ0OiBpbnZhbGlkIGRlbGltaXRlci5cbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTMwMSw4ICszMDEsNiBAQAogCXNpemVfdCBpID0gcGxlbjsKIAogCXByX2RlYnVnKCJmaW5kX3BhdHRlcm4gYCVzJzogZGxlbiA9ICVadVxuIiwgcGF0dGVybiwgZGxlbik7Ci0JaWYgKGRsZW4gPT0gMCkKLQkJcmV0dXJuIDA7CiAKIAlpZiAoZGxlbiA8PSBwbGVuKSB7CiAJCS8qIFNob3J0IHBhY2tldDogdHJ5IGZvciBwYXJ0aWFsPyAqLwpAQCAtMzExLDE5ICszMDksOCBAQAogCQllbHNlIHJldHVybiAwOwogCX0KIAotCWlmIChzdHJuY2FzZWNtcChkYXRhLCBwYXR0ZXJuLCBwbGVuKSAhPSAwKSB7Ci0jaWYgMAotCQlzaXplX3QgaTsKLQotCQlwcl9kZWJ1ZygiZnRwOiBzdHJpbmcgbWlzbWF0Y2hcbiIpOwotCQlmb3IgKGkgPSAwOyBpIDwgcGxlbjsgaSsrKSB7Ci0JCQlwcl9kZWJ1ZygiZnRwOmNoYXIgJXUgYCVjJygldSkgdnMgYCVjJygldSlcbiIsCi0JCQkJIGksIGRhdGFbaV0sIGRhdGFbaV0sCi0JCQkJIHBhdHRlcm5baV0sIHBhdHRlcm5baV0pOwotCQl9Ci0jZW5kaWYKKwlpZiAoc3RybmNhc2VjbXAoZGF0YSwgcGF0dGVybiwgcGxlbikgIT0gMCkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJcHJfZGVidWcoIlBhdHRlcm4gbWF0Y2hlcyFcbiIpOwogCS8qIE5vdyB3ZSd2ZSBmb3VuZCB0aGUgY29uc3RhbnQgc3RyaW5nLCB0cnkgdG8gc2tpcApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX21haW4uYwppbmRleCBiYjc3YTk3Li5mNjVkOTM2MyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMKQEAgLTczNiw3ICs3MzYsNyBAQAogCWNvbnN0IHN0cnVjdCBuZl9hZmluZm8gKmFmaW5mbzsKIAlpbnQgcmV0ID0gMDsKIAotCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfc2xvdygpICovCisJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggKi8KIAlhZmluZm8gPSBuZl9nZXRfYWZpbmZvKGZhbWlseSk7CiAJaWYgKCFhZmluZm8pCiAJCXJldHVybiAwOwpAQCAtMTQ3Myw3ICsxNDczLDggQEAKIAkJCQkgInRpbWVvdXQgdG8gJXUgc2Vjb25kcyBmb3IiLAogCQkJCSBpbmZvLT50aW1lb3V0KTsKIAkJCW5mX2N0X2R1bXBfdHVwbGUoJmV4cC0+dHVwbGUpOwotCQkJbW9kX3RpbWVyKCZleHAtPnRpbWVvdXQsIGppZmZpZXMgKyBpbmZvLT50aW1lb3V0ICogSFopOworCQkJbW9kX3RpbWVyX3BlbmRpbmcoJmV4cC0+dGltZW91dCwKKwkJCQkJICBqaWZmaWVzICsgaW5mby0+dGltZW91dCAqIEhaKTsKIAkJfQogCQlzcGluX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2V4cGVjdF9sb2NrKTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jCmluZGV4IGI5ODliODEuLjMzNmUyMTUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jCkBAIC0xODksNyArMTg5LDYgQEAKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyID0gTlVMTDsKIAlzdHJ1Y3QgbmZfY29ubl9oZWxwICpoZWxwOwogCXN0cnVjdCBuZXQgKm5ldCA9IG5mX2N0X25ldChjdCk7Ci0JaW50IHJldCA9IDA7CiAKIAkvKiBXZSBhbHJlYWR5IGdvdCBhIGhlbHBlciBleHBsaWNpdGx5IGF0dGFjaGVkLiBUaGUgZnVuY3Rpb24KIAkgKiBuZl9jb25udHJhY2tfYWx0ZXJfcmVwbHkgLSBpbiBjYXNlIE5BVCBpcyBpbiB1c2UgLSBhc2tzIGZvciBsb29raW5nCkBAIC0yMjMsMTUgKzIyMiwxMyBAQAogCWlmIChoZWxwZXIgPT0gTlVMTCkgewogCQlpZiAoaGVscCkKIAkJCVJDVV9JTklUX1BPSU5URVIoaGVscC0+aGVscGVyLCBOVUxMKTsKLQkJZ290byBvdXQ7CisJCXJldHVybiAwOwogCX0KIAogCWlmIChoZWxwID09IE5VTEwpIHsKIAkJaGVscCA9IG5mX2N0X2hlbHBlcl9leHRfYWRkKGN0LCBoZWxwZXIsIGZsYWdzKTsKLQkJaWYgKGhlbHAgPT0gTlVMTCkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0OwotCQl9CisJCWlmIChoZWxwID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKIAl9IGVsc2UgewogCQkvKiBXZSBvbmx5IGFsbG93IGhlbHBlciByZS1hc3NpZ25tZW50IG9mIHRoZSBzYW1lIHNvcnQgc2luY2UKIAkJICogd2UgY2Fubm90IHJlYWxsb2NhdGUgdGhlIGhlbHBlciBleHRlbnNpb24gYXJlYS4KQEAgLTI0MCwxMyArMjM3LDEzIEBACiAKIAkJaWYgKHRtcCAmJiB0bXAtPmhlbHAgIT0gaGVscGVyLT5oZWxwKSB7CiAJCQlSQ1VfSU5JVF9QT0lOVEVSKGhlbHAtPmhlbHBlciwgTlVMTCk7Ci0JCQlnb3RvIG91dDsKKwkJCXJldHVybiAwOwogCQl9CiAJfQogCiAJcmN1X2Fzc2lnbl9wb2ludGVyKGhlbHAtPmhlbHBlciwgaGVscGVyKTsKLW91dDoKLQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX25mX2N0X3RyeV9hc3NpZ25faGVscGVyKTsKIApAQCAtMzQ5LDcgKzM0Niw3IEBACiAJLyogQ2FsbGVkIGZyb20gdGhlIGhlbHBlciBmdW5jdGlvbiwgdGhpcyBjYWxsIG5ldmVyIGZhaWxzICovCiAJaGVscCA9IG5mY3RfaGVscChjdCk7CiAKLQkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3Nsb3cgKi8KKwkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3RocmVzaCAqLwogCWhlbHBlciA9IHJjdV9kZXJlZmVyZW5jZShoZWxwLT5oZWxwZXIpOwogCiAJbmZfbG9nX3BhY2tldChuZl9jdF9uZXQoY3QpLCBuZl9jdF9sM251bShjdCksIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYwppbmRleCAwNTBiYjM0Li4yNzU0MDQ1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jCkBAIC0xNDksMTAgKzE0OSw3IEBACiAKIHN0YXRpYyBpbnQgY3RuZXRsaW5rX2R1bXBfdGltZW91dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7Ci0JbG9uZyB0aW1lb3V0ID0gKChsb25nKWN0LT50aW1lb3V0LmV4cGlyZXMgLSAobG9uZylqaWZmaWVzKSAvIEhaOwotCi0JaWYgKHRpbWVvdXQgPCAwKQotCQl0aW1lb3V0ID0gMDsKKwlsb25nIHRpbWVvdXQgPSBuZl9jdF9leHBpcmVzKGN0KSAvIEhaOwogCiAJaWYgKG5sYV9wdXRfYmUzMihza2IsIENUQV9USU1FT1VULCBodG9ubCh0aW1lb3V0KSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwpAQCAtODE4LDE0ICs4MTUsMjMgQEAKIAlzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjsKIAlzdHJ1Y3QgbmZnZW5tc2cgKm5mbXNnID0gbmxtc2dfZGF0YShjYi0+bmxoKTsKIAl1X2ludDhfdCBsM3Byb3RvID0gbmZtc2ctPm5mZ2VuX2ZhbWlseTsKLQlpbnQgcmVzOworCXN0cnVjdCBuZl9jb25uICpuZl9jdF9ldmljdFs4XTsKKwlpbnQgcmVzLCBpOwogCXNwaW5sb2NrX3QgKmxvY2twOwogCiAJbGFzdCA9IChzdHJ1Y3QgbmZfY29ubiAqKWNiLT5hcmdzWzFdOworCWkgPSAwOwogCiAJbG9jYWxfYmhfZGlzYWJsZSgpOwogCWZvciAoOyBjYi0+YXJnc1swXSA8IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsgY2ItPmFyZ3NbMF0rKykgewogcmVzdGFydDoKKwkJd2hpbGUgKGkpIHsKKwkJCWktLTsKKwkJCWlmIChuZl9jdF9zaG91bGRfZ2MobmZfY3RfZXZpY3RbaV0pKQorCQkJCW5mX2N0X2tpbGwobmZfY3RfZXZpY3RbaV0pOworCQkJbmZfY3RfcHV0KG5mX2N0X2V2aWN0W2ldKTsKKwkJfQorCiAJCWxvY2twID0gJm5mX2Nvbm50cmFja19sb2Nrc1tjYi0+YXJnc1swXSAlIENPTk5UUkFDS19MT0NLU107CiAJCW5mX2Nvbm50cmFja19sb2NrKGxvY2twKTsKIAkJaWYgKGNiLT5hcmdzWzBdID49IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZSkgewpAQCAtODM3LDYgKzg0MywxMyBAQAogCQkJaWYgKE5GX0NUX0RJUkVDVElPTihoKSAhPSBJUF9DVF9ESVJfT1JJR0lOQUwpCiAJCQkJY29udGludWU7CiAJCQljdCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7CisJCQlpZiAobmZfY3RfaXNfZXhwaXJlZChjdCkpIHsKKwkJCQlpZiAoaSA8IEFSUkFZX1NJWkUobmZfY3RfZXZpY3QpICYmCisJCQkJICAgIGF0b21pY19pbmNfbm90X3plcm8oJmN0LT5jdF9nZW5lcmFsLnVzZSkpCisJCQkJCW5mX2N0X2V2aWN0W2krK10gPSBjdDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwogCQkJaWYgKCFuZXRfZXEobmV0LCBuZl9jdF9uZXQoY3QpKSkKIAkJCQljb250aW51ZTsKIApAQCAtODc4LDYgKzg5MSwxMyBAQAogCWlmIChsYXN0KQogCQluZl9jdF9wdXQobGFzdCk7CiAKKwl3aGlsZSAoaSkgeworCQlpLS07CisJCWlmIChuZl9jdF9zaG91bGRfZ2MobmZfY3RfZXZpY3RbaV0pKQorCQkJbmZfY3Rfa2lsbChuZl9jdF9ldmljdFtpXSk7CisJCW5mX2N0X3B1dChuZl9jdF9ldmljdFtpXSk7CisJfQorCiAJcmV0dXJuIHNrYi0+bGVuOwogfQogCkBAIC0xMTQ3LDkgKzExNjcsNyBAQAogCQl9CiAJfQogCi0JaWYgKGRlbF90aW1lcigmY3QtPnRpbWVvdXQpKQotCQluZl9jdF9kZWxldGUoY3QsIE5FVExJTktfQ0Ioc2tiKS5wb3J0aWQsIG5sbXNnX3JlcG9ydChubGgpKTsKLQorCW5mX2N0X2RlbGV0ZShjdCwgTkVUTElOS19DQihza2IpLnBvcnRpZCwgbmxtc2dfcmVwb3J0KG5saCkpOwogCW5mX2N0X3B1dChjdCk7CiAKIAlyZXR1cm4gMDsKQEAgLTE1MTcsMTEgKzE1MzUsMTAgQEAKIHsKIAl1X2ludDMyX3QgdGltZW91dCA9IG50b2hsKG5sYV9nZXRfYmUzMihjZGFbQ1RBX1RJTUVPVVRdKSk7CiAKLQlpZiAoIWRlbF90aW1lcigmY3QtPnRpbWVvdXQpKQotCQlyZXR1cm4gLUVUSU1FOworCWN0LT50aW1lb3V0ID0gbmZjdF90aW1lX3N0YW1wICsgdGltZW91dCAqIEhaOwogCi0JY3QtPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0ICogSFo7Ci0JYWRkX3RpbWVyKCZjdC0+dGltZW91dCk7CisJaWYgKHRlc3RfYml0KElQU19EWUlOR19CSVQsICZjdC0+c3RhdHVzKSkKKwkJcmV0dXJuIC1FVElNRTsKIAogCXJldHVybiAwOwogfQpAQCAtMTcxOSw5ICsxNzM2LDggQEAKIAogCWlmICghY2RhW0NUQV9USU1FT1VUXSkKIAkJZ290byBlcnIxOwotCWN0LT50aW1lb3V0LmV4cGlyZXMgPSBudG9obChubGFfZ2V0X2JlMzIoY2RhW0NUQV9USU1FT1VUXSkpOwogCi0JY3QtPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyBjdC0+dGltZW91dC5leHBpcmVzICogSFo7CisJY3QtPnRpbWVvdXQgPSBuZmN0X3RpbWVfc3RhbXAgKyBudG9obChubGFfZ2V0X2JlMzIoY2RhW0NUQV9USU1FT1VUXSkpICogSFo7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAgCWlmIChjZGFbQ1RBX0hFTFBdKSB7CkBAIC0xODk0LDYgKzE5MTAsOCBAQAogCiAJCQlpZiAoIWNkYVtDVEFfVFVQTEVfT1JJR10gfHwgIWNkYVtDVEFfVFVQTEVfUkVQTFldKQogCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKG90dXBsZS5kc3QucHJvdG9udW0gIT0gcnR1cGxlLmRzdC5wcm90b251bSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQkJY3QgPSBjdG5ldGxpbmtfY3JlYXRlX2Nvbm50cmFjayhuZXQsICZ6b25lLCBjZGEsICZvdHVwbGUsCiAJCQkJCQkJJnJ0dXBsZSwgdTMpOwpAQCAtMTk2NiwxMyArMTk4NCw5IEBACiAJbmZtc2ctPnZlcnNpb24gICAgICA9IE5GTkVUTElOS19WMDsKIAluZm1zZy0+cmVzX2lkCSAgICA9IGh0b25zKGNwdSk7CiAKLQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgQ1RBX1NUQVRTX1NFQVJDSEVELCBodG9ubChzdC0+c2VhcmNoZWQpKSB8fAotCSAgICBubGFfcHV0X2JlMzIoc2tiLCBDVEFfU1RBVFNfRk9VTkQsIGh0b25sKHN0LT5mb3VuZCkpIHx8Ci0JICAgIG5sYV9wdXRfYmUzMihza2IsIENUQV9TVEFUU19ORVcsIGh0b25sKHN0LT5uZXcpKSB8fAorCWlmIChubGFfcHV0X2JlMzIoc2tiLCBDVEFfU1RBVFNfRk9VTkQsIGh0b25sKHN0LT5mb3VuZCkpIHx8CiAJICAgIG5sYV9wdXRfYmUzMihza2IsIENUQV9TVEFUU19JTlZBTElELCBodG9ubChzdC0+aW52YWxpZCkpIHx8CiAJICAgIG5sYV9wdXRfYmUzMihza2IsIENUQV9TVEFUU19JR05PUkUsIGh0b25sKHN0LT5pZ25vcmUpKSB8fAotCSAgICBubGFfcHV0X2JlMzIoc2tiLCBDVEFfU1RBVFNfREVMRVRFLCBodG9ubChzdC0+ZGVsZXRlKSkgfHwKLQkgICAgbmxhX3B1dF9iZTMyKHNrYiwgQ1RBX1NUQVRTX0RFTEVURV9MSVNULCBodG9ubChzdC0+ZGVsZXRlX2xpc3QpKSB8fAogCSAgICBubGFfcHV0X2JlMzIoc2tiLCBDVEFfU1RBVFNfSU5TRVJULCBodG9ubChzdC0+aW5zZXJ0KSkgfHwKIAkgICAgbmxhX3B1dF9iZTMyKHNrYiwgQ1RBX1NUQVRTX0lOU0VSVF9GQUlMRUQsCiAJCQkJaHRvbmwoc3QtPmluc2VydF9mYWlsZWQpKSB8fApAQCAtMjM2MiwxMiArMjM3Niw4IEBACiAJCXJldHVybiBQVFJfRVJSKGV4cCk7CiAKIAllcnIgPSBuZl9jdF9leHBlY3RfcmVsYXRlZF9yZXBvcnQoZXhwLCBwb3J0aWQsIHJlcG9ydCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJbmZfY3RfZXhwZWN0X3B1dChleHApOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiAwOworCW5mX2N0X2V4cGVjdF9wdXQoZXhwKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBjdG5ldGxpbmtfZ2x1ZV9zZXFhZGooc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5jCmluZGV4IDU1ODhjN2EuLmY2MGE0NzUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmMKQEAgLTE1Nyw4ICsxNTcsNyBAQAogCQlwcl9kZWJ1Zygic2V0dGluZyB0aW1lb3V0IG9mIGNvbm50cmFjayAlcCB0byAwXG4iLCBzaWJsaW5nKTsKIAkJc2libGluZy0+cHJvdG8uZ3JlLnRpbWVvdXQJICA9IDA7CiAJCXNpYmxpbmctPnByb3RvLmdyZS5zdHJlYW1fdGltZW91dCA9IDA7Ci0JCWlmIChkZWxfdGltZXIoJnNpYmxpbmctPnRpbWVvdXQpKQotCQkJc2libGluZy0+dGltZW91dC5mdW5jdGlvbigodW5zaWduZWQgbG9uZylzaWJsaW5nKTsKKwkJbmZfY3Rfa2lsbChzaWJsaW5nKTsKIAkJbmZfY3RfcHV0KHNpYmxpbmcpOwogCQlyZXR1cm4gMTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG8uYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvLmMKaW5kZXggYjY1ZDU4Ni4uOGQyYzdkOCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG8uYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90by5jCkBAIC0xNTksNTQgKzE1OSw2IEBACiAJICAgICAgIG5mX2N0X2wzbnVtKGkpID09IGw0cHJvdG8tPmwzcHJvdG87CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmZfaXBfbmV0ICpuZl9jdF9sM3Byb3RvX25ldChzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJCSAgIHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bykKLXsKLQlpZiAobDNwcm90by0+bDNwcm90byA9PSBQRl9JTkVUKQotCQlyZXR1cm4gJm5ldC0+Y3QubmZfY3RfcHJvdG87Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBuZl9jdF9sM3Byb3RvX3JlZ2lzdGVyX3N5c2N0bChzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJCSBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG8pCi17Ci0JaW50IGVyciA9IDA7Ci0Jc3RydWN0IG5mX2lwX25ldCAqaW4gPSBuZl9jdF9sM3Byb3RvX25ldChuZXQsIGwzcHJvdG8pOwotCS8qIG5mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYgZG9lc24ndCBzdXBwb3J0IHN5c2N0bCAqLwotCWlmIChpbiA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotI2lmIGRlZmluZWQoQ09ORklHX1NZU0NUTCkgJiYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKQotCWlmIChpbi0+Y3RsX3RhYmxlICE9IE5VTEwpIHsKLQkJZXJyID0gbmZfY3RfcmVnaXN0ZXJfc3lzY3RsKG5ldCwKLQkJCQkJICAgICZpbi0+Y3RsX3RhYmxlX2hlYWRlciwKLQkJCQkJICAgIGwzcHJvdG8tPmN0bF90YWJsZV9wYXRoLAotCQkJCQkgICAgaW4tPmN0bF90YWJsZSk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlrZnJlZShpbi0+Y3RsX3RhYmxlKTsKLQkJCWluLT5jdGxfdGFibGUgPSBOVUxMOwotCQl9Ci0JfQotI2VuZGlmCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgbmZfY3RfbDNwcm90b191bnJlZ2lzdGVyX3N5c2N0bChzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJCSAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG8pCi17Ci0Jc3RydWN0IG5mX2lwX25ldCAqaW4gPSBuZl9jdF9sM3Byb3RvX25ldChuZXQsIGwzcHJvdG8pOwotCi0JaWYgKGluID09IE5VTEwpCi0JCXJldHVybjsKLSNpZiBkZWZpbmVkKENPTkZJR19TWVNDVEwpICYmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCkKLQlpZiAoaW4tPmN0bF90YWJsZV9oZWFkZXIgIT0gTlVMTCkKLQkJbmZfY3RfdW5yZWdpc3Rlcl9zeXNjdGwoJmluLT5jdGxfdGFibGVfaGVhZGVyLAotCQkJCQkmaW4tPmN0bF90YWJsZSwKLQkJCQkJMCk7Ci0jZW5kaWYKLX0KLQogaW50IG5mX2N0X2wzcHJvdG9fcmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpwcm90bykKIHsKIAlpbnQgcmV0ID0gMDsKQEAgLTI0MSw3ICsxOTMsNyBAQAogaW50IG5mX2N0X2wzcHJvdG9fcGVybmV0X3JlZ2lzdGVyKHN0cnVjdCBuZXQgKm5ldCwKIAkJCQkgIHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqcHJvdG8pCiB7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAogCWlmIChwcm90by0+aW5pdF9uZXQpIHsKIAkJcmV0ID0gcHJvdG8tPmluaXRfbmV0KG5ldCk7CkBAIC0yNDksNyArMjAxLDcgQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0dXJuIG5mX2N0X2wzcHJvdG9fcmVnaXN0ZXJfc3lzY3RsKG5ldCwgcHJvdG8pOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfbDNwcm90b19wZXJuZXRfcmVnaXN0ZXIpOwogCkBAIC0yNzIsOCArMjI0LDYgQEAKIHZvaWQgbmZfY3RfbDNwcm90b19wZXJuZXRfdW5yZWdpc3RlcihzdHJ1Y3QgbmV0ICpuZXQsCiAJCQkJICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKnByb3RvKQogewotCW5mX2N0X2wzcHJvdG9fdW5yZWdpc3Rlcl9zeXNjdGwobmV0LCBwcm90byk7Ci0KIAkvKiBSZW1vdmUgYWxsIGNvbnRyYWNrIGVudHJpZXMgZm9yIHRoaXMgcHJvdG9jb2wgKi8KIAluZl9jdF9pdGVyYXRlX2NsZWFudXAobmV0LCBraWxsX2wzcHJvdG8sIHByb3RvLCAwLCAwKTsKIH0KQEAgLTMxMiwyNiArMjYyLDYgQEAKIAkJCX0KIAkJfQogCX0KLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCi0JaWYgKGw0cHJvdG8tPmwzcHJvdG8gIT0gQUZfSU5FVDYgJiYgcG4tPmN0bF9jb21wYXRfdGFibGUgIT0gTlVMTCkgewotCQlpZiAoZXJyIDwgMCkgewotCQkJbmZfY3Rfa2ZyZWVfY29tcGF0X3N5c2N0bF90YWJsZShwbik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQllcnIgPSBuZl9jdF9yZWdpc3Rlcl9zeXNjdGwobmV0LAotCQkJCQkgICAgJnBuLT5jdGxfY29tcGF0X2hlYWRlciwKLQkJCQkJICAgICJuZXQvaXB2NC9uZXRmaWx0ZXIiLAotCQkJCQkgICAgcG4tPmN0bF9jb21wYXRfdGFibGUpOwotCQlpZiAoZXJyID09IDApCi0JCQlnb3RvIG91dDsKLQotCQluZl9jdF9rZnJlZV9jb21wYXRfc3lzY3RsX3RhYmxlKHBuKTsKLQkJbmZfY3RfdW5yZWdpc3Rlcl9zeXNjdGwoJnBuLT5jdGxfdGFibGVfaGVhZGVyLAotCQkJCQkmcG4tPmN0bF90YWJsZSwKLQkJCQkJcG4tPnVzZXJzKTsKLQl9Ci1vdXQ6Ci0jZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCAqLwogI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KIAlyZXR1cm4gZXJyOwogfQpAQCAtMzQ2LDEzICsyNzYsNiBAQAogCQluZl9jdF91bnJlZ2lzdGVyX3N5c2N0bCgmcG4tPmN0bF90YWJsZV9oZWFkZXIsCiAJCQkJCSZwbi0+Y3RsX3RhYmxlLAogCQkJCQlwbi0+dXNlcnMpOwotCi0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAotCWlmIChsNHByb3RvLT5sM3Byb3RvICE9IEFGX0lORVQ2ICYmIHBuLT5jdGxfY29tcGF0X2hlYWRlciAhPSBOVUxMKQotCQluZl9jdF91bnJlZ2lzdGVyX3N5c2N0bCgmcG4tPmN0bF9jb21wYXRfaGVhZGVyLAotCQkJCQkmcG4tPmN0bF9jb21wYXRfdGFibGUsCi0JCQkJCTApOwotI2VuZGlmIC8qIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQgKi8KICNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2RjY3AuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2RjY3AuYwppbmRleCAzOTlhMzhmLi5hNDViZWU1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19kY2NwLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZGNjcC5jCkBAIC00MDIsNyArNDAyLDggQEAKIHsKIAlzdHJ1Y3QgZGNjcF9oZHIgX2hkciwgKmRoOwogCi0JZGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCBzaXplb2YoX2hkciksICZfaGRyKTsKKwkvKiBBY3R1YWxseSBvbmx5IG5lZWQgZmlyc3QgNCBieXRlcyB0byBnZXQgcG9ydHMuICovCisJZGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCA0LCAmX2hkcik7CiAJaWYgKGRoID09IE5VTEwpCiAJCXJldHVybiBmYWxzZTsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jCmluZGV4IDg2ZGM3NTIuLmQ1ODY4YmEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19nZW5lcmljLmMKQEAgLTE1MSwxNyArMTUxLDYgQEAKIAl9LAogCXsgfQogfTsKLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCi1zdGF0aWMgc3RydWN0IGN0bF90YWJsZSBnZW5lcmljX2NvbXBhdF9zeXNjdGxfdGFibGVbXSA9IHsKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfZ2VuZXJpY190aW1lb3V0IiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsgfQotfTsKLSNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUICovCiAjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwogCiBzdGF0aWMgaW50IGdlbmVyaWNfa21lbWR1cF9zeXNjdGxfdGFibGUoc3RydWN0IG5mX3Byb3RvX25ldCAqcG4sCkBAIC0xNzksNDAgKzE2OCwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdlbmVyaWNfa21lbWR1cF9jb21wYXRfc3lzY3RsX3RhYmxlKHN0cnVjdCBuZl9wcm90b19uZXQgKnBuLAotCQkJCQkgICAgICAgc3RydWN0IG5mX2dlbmVyaWNfbmV0ICpnbikKLXsKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAotCXBuLT5jdGxfY29tcGF0X3RhYmxlID0ga21lbWR1cChnZW5lcmljX2NvbXBhdF9zeXNjdGxfdGFibGUsCi0JCQkJICAgICAgIHNpemVvZihnZW5lcmljX2NvbXBhdF9zeXNjdGxfdGFibGUpLAotCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIXBuLT5jdGxfY29tcGF0X3RhYmxlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzBdLmRhdGEgPSAmZ24tPnRpbWVvdXQ7Ci0jZW5kaWYKLSNlbmRpZgotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGdlbmVyaWNfaW5pdF9uZXQoc3RydWN0IG5ldCAqbmV0LCB1X2ludDE2X3QgcHJvdG8pCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgbmZfZ2VuZXJpY19uZXQgKmduID0gZ2VuZXJpY19wZXJuZXQobmV0KTsKIAlzdHJ1Y3QgbmZfcHJvdG9fbmV0ICpwbiA9ICZnbi0+cG47CiAKIAlnbi0+dGltZW91dCA9IG5mX2N0X2dlbmVyaWNfdGltZW91dDsKIAotCXJldCA9IGdlbmVyaWNfa21lbWR1cF9jb21wYXRfc3lzY3RsX3RhYmxlKHBuLCBnbik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBnZW5lcmljX2ttZW1kdXBfc3lzY3RsX3RhYmxlKHBuLCBnbik7Ci0JaWYgKHJldCA8IDApCi0JCW5mX2N0X2tmcmVlX2NvbXBhdF9zeXNjdGxfdGFibGUocG4pOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZ2VuZXJpY19rbWVtZHVwX3N5c2N0bF90YWJsZShwbiwgZ24pOwogfQogCiBzdGF0aWMgc3RydWN0IG5mX3Byb3RvX25ldCAqZ2VuZXJpY19nZXRfbmV0X3Byb3RvKHN0cnVjdCBuZXQgKm5ldCkKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmMKaW5kZXggYTk2NDUxYS4uOWE3MTVmOCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmMKQEAgLTE5MiwxNSArMTkyLDE1IEBACiBzdGF0aWMgYm9vbCBncmVfcGt0X3RvX3R1cGxlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBkYXRhb2ZmLAogCQkJICAgICBzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQogewotCWNvbnN0IHN0cnVjdCBncmVfaGRyX3BwdHAgKnBncmVoZHI7Ci0Jc3RydWN0IGdyZV9oZHJfcHB0cCBfcGdyZWhkcjsKKwljb25zdCBzdHJ1Y3QgcHB0cF9ncmVfaGVhZGVyICpwZ3JlaGRyOworCXN0cnVjdCBwcHRwX2dyZV9oZWFkZXIgX3BncmVoZHI7CiAJX19iZTE2IHNyY2tleTsKLQljb25zdCBzdHJ1Y3QgZ3JlX2hkciAqZ3JlaGRyOwotCXN0cnVjdCBncmVfaGRyIF9ncmVoZHI7CisJY29uc3Qgc3RydWN0IGdyZV9iYXNlX2hkciAqZ3JlaGRyOworCXN0cnVjdCBncmVfYmFzZV9oZHIgX2dyZWhkcjsKIAogCS8qIGZpcnN0IG9ubHkgZGVsaW5lYXJpemUgb2xkIFJGQzE3MDEgR1JFIGhlYWRlciAqLwogCWdyZWhkciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGRhdGFvZmYsIHNpemVvZihfZ3JlaGRyKSwgJl9ncmVoZHIpOwotCWlmICghZ3JlaGRyIHx8IGdyZWhkci0+dmVyc2lvbiAhPSBHUkVfVkVSU0lPTl9QUFRQKSB7CisJaWYgKCFncmVoZHIgfHwgKGdyZWhkci0+ZmxhZ3MgJiBHUkVfVkVSU0lPTikgIT0gR1JFX1ZFUlNJT05fMSkgewogCQkvKiB0cnkgdG8gYmVoYXZlIGxpa2UgIm5mX2Nvbm50cmFja19wcm90b19nZW5lcmljIiAqLwogCQl0dXBsZS0+c3JjLnUuYWxsID0gMDsKIAkJdHVwbGUtPmRzdC51LmFsbCA9IDA7CkBAIC0yMTIsOCArMjEyLDggQEAKIAlpZiAoIXBncmVoZHIpCiAJCXJldHVybiB0cnVlOwogCi0JaWYgKG50b2hzKGdyZWhkci0+cHJvdG9jb2wpICE9IEdSRV9QUk9UT0NPTF9QUFRQKSB7Ci0JCXByX2RlYnVnKCJHUkVfVkVSU0lPTl9QUFRQIGJ1dCB1bmtub3duIHByb3RvXG4iKTsKKwlpZiAoZ3JlaGRyLT5wcm90b2NvbCAhPSBHUkVfUFJPVE9fUFBQKSB7CisJCXByX2RlYnVnKCJVbnN1cHBvcnRlZCBHUkUgcHJvdG8oMHgleClcbiIsIG50b2hzKGdyZWhkci0+cHJvdG9jb2wpKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fc2N0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fc2N0cC5jCmluZGV4IDFkN2FiOTYuLjk4MmVhNjIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3NjdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19zY3RwLmMKQEAgLTE2MSw4ICsxNjEsOCBAQAogCWNvbnN0IHN0cnVjdCBzY3RwaGRyICpocDsKIAlzdHJ1Y3Qgc2N0cGhkciBfaGRyOwogCi0JLyogQWN0dWFsbHkgb25seSBuZWVkIGZpcnN0IDggYnl0ZXMuICovCi0JaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCA4LCAmX2hkcik7CisJLyogQWN0dWFsbHkgb25seSBuZWVkIGZpcnN0IDQgYnl0ZXMgdG8gZ2V0IHBvcnRzLiAqLworCWhwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgZGF0YW9mZiwgNCwgJl9oZHIpOwogCWlmIChocCA9PSBOVUxMKQogCQlyZXR1cm4gZmFsc2U7CiAKQEAgLTcwNSw1NCArNzA1LDYgQEAKIAl9LAogCXsgfQogfTsKLQotI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKLXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIHNjdHBfY29tcGF0X3N5c2N0bF90YWJsZVtdID0gewotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfY2xvc2VkIiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfY29va2llX3dhaXQiLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3NjdHBfdGltZW91dF9jb29raWVfZWNob2VkIiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfZXN0YWJsaXNoZWQiLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3NjdHBfdGltZW91dF9zaHV0ZG93bl9zZW50IiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfc2h1dGRvd25fcmVjZCIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X3NodXRkb3duX2Fja19zZW50IiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsgfQotfTsKLSNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUICovCiAjZW5kaWYKIAogc3RhdGljIGludCBzY3RwX2ttZW1kdXBfc3lzY3RsX3RhYmxlKHN0cnVjdCBuZl9wcm90b19uZXQgKnBuLApAQCAtNzgxLDMyICs3MzMsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNjdHBfa21lbWR1cF9jb21wYXRfc3lzY3RsX3RhYmxlKHN0cnVjdCBuZl9wcm90b19uZXQgKnBuLAotCQkJCQkgICAgc3RydWN0IHNjdHBfbmV0ICpzbikKLXsKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAotCXBuLT5jdGxfY29tcGF0X3RhYmxlID0ga21lbWR1cChzY3RwX2NvbXBhdF9zeXNjdGxfdGFibGUsCi0JCQkJICAgICAgIHNpemVvZihzY3RwX2NvbXBhdF9zeXNjdGxfdGFibGUpLAotCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIXBuLT5jdGxfY29tcGF0X3RhYmxlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzBdLmRhdGEgPSAmc24tPnRpbWVvdXRzW1NDVFBfQ09OTlRSQUNLX0NMT1NFRF07Ci0JcG4tPmN0bF9jb21wYXRfdGFibGVbMV0uZGF0YSA9ICZzbi0+dGltZW91dHNbU0NUUF9DT05OVFJBQ0tfQ09PS0lFX1dBSVRdOwotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzJdLmRhdGEgPSAmc24tPnRpbWVvdXRzW1NDVFBfQ09OTlRSQUNLX0NPT0tJRV9FQ0hPRURdOwotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzNdLmRhdGEgPSAmc24tPnRpbWVvdXRzW1NDVFBfQ09OTlRSQUNLX0VTVEFCTElTSEVEXTsKLQlwbi0+Y3RsX2NvbXBhdF90YWJsZVs0XS5kYXRhID0gJnNuLT50aW1lb3V0c1tTQ1RQX0NPTk5UUkFDS19TSFVURE9XTl9TRU5UXTsKLQlwbi0+Y3RsX2NvbXBhdF90YWJsZVs1XS5kYXRhID0gJnNuLT50aW1lb3V0c1tTQ1RQX0NPTk5UUkFDS19TSFVURE9XTl9SRUNEXTsKLQlwbi0+Y3RsX2NvbXBhdF90YWJsZVs2XS5kYXRhID0gJnNuLT50aW1lb3V0c1tTQ1RQX0NPTk5UUkFDS19TSFVURE9XTl9BQ0tfU0VOVF07Ci0jZW5kaWYKLSNlbmRpZgotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHNjdHBfaW5pdF9uZXQoc3RydWN0IG5ldCAqbmV0LCB1X2ludDE2X3QgcHJvdG8pCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3Qgc2N0cF9uZXQgKnNuID0gc2N0cF9wZXJuZXQobmV0KTsKIAlzdHJ1Y3QgbmZfcHJvdG9fbmV0ICpwbiA9ICZzbi0+cG47CiAKQEAgLTgxNywxOCArNzQ1LDcgQEAKIAkJCXNuLT50aW1lb3V0c1tpXSA9IHNjdHBfdGltZW91dHNbaV07CiAJfQogCi0JaWYgKHByb3RvID09IEFGX0lORVQpIHsKLQkJcmV0ID0gc2N0cF9rbWVtZHVwX2NvbXBhdF9zeXNjdGxfdGFibGUocG4sIHNuKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCi0JCXJldCA9IHNjdHBfa21lbWR1cF9zeXNjdGxfdGFibGUocG4sIHNuKTsKLQkJaWYgKHJldCA8IDApCi0JCQluZl9jdF9rZnJlZV9jb21wYXRfc3lzY3RsX3RhYmxlKHBuKTsKLQl9IGVsc2UKLQkJcmV0ID0gc2N0cF9rbWVtZHVwX3N5c2N0bF90YWJsZShwbiwgc24pOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gc2N0cF9rbWVtZHVwX3N5c2N0bF90YWJsZShwbiwgc24pOwogfQogCiBzdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvIG5mX2Nvbm50cmFja19sNHByb3RvX3NjdHA0IF9fcmVhZF9tb3N0bHkgPSB7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCmluZGV4IDcwYzgzODEuLjY5ZjY4NzcgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCkBAIC0yODIsOCArMjgyLDggQEAKIAljb25zdCBzdHJ1Y3QgdGNwaGRyICpocDsKIAlzdHJ1Y3QgdGNwaGRyIF9oZHI7CiAKLQkvKiBBY3R1YWxseSBvbmx5IG5lZWQgZmlyc3QgOCBieXRlcy4gKi8KLQlocCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGRhdGFvZmYsIDgsICZfaGRyKTsKKwkvKiBBY3R1YWxseSBvbmx5IG5lZWQgZmlyc3QgNCBieXRlcyB0byBnZXQgcG9ydHMuICovCisJaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCA0LCAmX2hkcik7CiAJaWYgKGhwID09IE5VTEwpCiAJCXJldHVybiBmYWxzZTsKIApAQCAtMTQ4MSw5MCArMTQ4MSw2IEBACiAJfSwKIAl7IH0KIH07Ci0KLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCi1zdGF0aWMgc3RydWN0IGN0bF90YWJsZSB0Y3BfY29tcGF0X3N5c2N0bF90YWJsZVtdID0gewotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfdGltZW91dF9zeW5fc2VudCIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfc3luX3NlbnQyIiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfdGltZW91dF9zeW5fcmVjdiIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfZXN0YWJsaXNoZWQiLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X2Zpbl93YWl0IiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfdGltZW91dF9jbG9zZV93YWl0IiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfdGltZW91dF9sYXN0X2FjayIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfdGltZV93YWl0IiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfdGltZW91dF9jbG9zZSIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfbWF4X3JldHJhbnMiLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF9sb29zZSIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF9iZV9saWJlcmFsIiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX21heF9yZXRyYW5zIiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7IH0KLX07Ci0jZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCAqLwogI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KIAogc3RhdGljIGludCB0Y3Bfa21lbWR1cF9zeXNjdGxfdGFibGUoc3RydWN0IG5mX3Byb3RvX25ldCAqcG4sCkBAIC0xNTk3LDM4ICsxNTEzLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0Y3Bfa21lbWR1cF9jb21wYXRfc3lzY3RsX3RhYmxlKHN0cnVjdCBuZl9wcm90b19uZXQgKnBuLAotCQkJCQkgICBzdHJ1Y3QgbmZfdGNwX25ldCAqdG4pCi17Ci0jaWZkZWYgQ09ORklHX1NZU0NUTAotI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKLQlwbi0+Y3RsX2NvbXBhdF90YWJsZSA9IGttZW1kdXAodGNwX2NvbXBhdF9zeXNjdGxfdGFibGUsCi0JCQkJICAgICAgIHNpemVvZih0Y3BfY29tcGF0X3N5c2N0bF90YWJsZSksCi0JCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghcG4tPmN0bF9jb21wYXRfdGFibGUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcG4tPmN0bF9jb21wYXRfdGFibGVbMF0uZGF0YSA9ICZ0bi0+dGltZW91dHNbVENQX0NPTk5UUkFDS19TWU5fU0VOVF07Ci0JcG4tPmN0bF9jb21wYXRfdGFibGVbMV0uZGF0YSA9ICZ0bi0+dGltZW91dHNbVENQX0NPTk5UUkFDS19TWU5fU0VOVDJdOwotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzJdLmRhdGEgPSAmdG4tPnRpbWVvdXRzW1RDUF9DT05OVFJBQ0tfU1lOX1JFQ1ZdOwotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzNdLmRhdGEgPSAmdG4tPnRpbWVvdXRzW1RDUF9DT05OVFJBQ0tfRVNUQUJMSVNIRURdOwotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzRdLmRhdGEgPSAmdG4tPnRpbWVvdXRzW1RDUF9DT05OVFJBQ0tfRklOX1dBSVRdOwotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzVdLmRhdGEgPSAmdG4tPnRpbWVvdXRzW1RDUF9DT05OVFJBQ0tfQ0xPU0VfV0FJVF07Ci0JcG4tPmN0bF9jb21wYXRfdGFibGVbNl0uZGF0YSA9ICZ0bi0+dGltZW91dHNbVENQX0NPTk5UUkFDS19MQVNUX0FDS107Ci0JcG4tPmN0bF9jb21wYXRfdGFibGVbN10uZGF0YSA9ICZ0bi0+dGltZW91dHNbVENQX0NPTk5UUkFDS19USU1FX1dBSVRdOwotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzhdLmRhdGEgPSAmdG4tPnRpbWVvdXRzW1RDUF9DT05OVFJBQ0tfQ0xPU0VdOwotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzldLmRhdGEgPSAmdG4tPnRpbWVvdXRzW1RDUF9DT05OVFJBQ0tfUkVUUkFOU107Ci0JcG4tPmN0bF9jb21wYXRfdGFibGVbMTBdLmRhdGEgPSAmdG4tPnRjcF9sb29zZTsKLQlwbi0+Y3RsX2NvbXBhdF90YWJsZVsxMV0uZGF0YSA9ICZ0bi0+dGNwX2JlX2xpYmVyYWw7Ci0JcG4tPmN0bF9jb21wYXRfdGFibGVbMTJdLmRhdGEgPSAmdG4tPnRjcF9tYXhfcmV0cmFuczsKLSNlbmRpZgotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgdGNwX2luaXRfbmV0KHN0cnVjdCBuZXQgKm5ldCwgdV9pbnQxNl90IHByb3RvKQogewotCWludCByZXQ7CiAJc3RydWN0IG5mX3RjcF9uZXQgKnRuID0gdGNwX3Blcm5ldChuZXQpOwogCXN0cnVjdCBuZl9wcm90b19uZXQgKnBuID0gJnRuLT5wbjsKIApAQCAtMTY0MywxOCArMTUyOSw3IEBACiAJCXRuLT50Y3BfbWF4X3JldHJhbnMgPSBuZl9jdF90Y3BfbWF4X3JldHJhbnM7CiAJfQogCi0JaWYgKHByb3RvID09IEFGX0lORVQpIHsKLQkJcmV0ID0gdGNwX2ttZW1kdXBfY29tcGF0X3N5c2N0bF90YWJsZShwbiwgdG4pOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJcmV0ID0gdGNwX2ttZW1kdXBfc3lzY3RsX3RhYmxlKHBuLCB0bik7Ci0JCWlmIChyZXQgPCAwKQotCQkJbmZfY3Rfa2ZyZWVfY29tcGF0X3N5c2N0bF90YWJsZShwbik7Ci0JfSBlbHNlCi0JCXJldCA9IHRjcF9rbWVtZHVwX3N5c2N0bF90YWJsZShwbiwgdG4pOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gdGNwX2ttZW1kdXBfc3lzY3RsX3RhYmxlKHBuLCB0bik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmZfcHJvdG9fbmV0ICp0Y3BfZ2V0X25ldF9wcm90byhzdHJ1Y3QgbmV0ICpuZXQpCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCmluZGV4IDRmZDA0MDUuLjIwZjM1ZWQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCkBAIC00NCw4ICs0NCw4IEBACiAJY29uc3Qgc3RydWN0IHVkcGhkciAqaHA7CiAJc3RydWN0IHVkcGhkciBfaGRyOwogCi0JLyogQWN0dWFsbHkgb25seSBuZWVkIGZpcnN0IDggYnl0ZXMuICovCi0JaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCBzaXplb2YoX2hkciksICZfaGRyKTsKKwkvKiBBY3R1YWxseSBvbmx5IG5lZWQgZmlyc3QgNCBieXRlcyB0byBnZXQgcG9ydHMuICovCisJaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCA0LCAmX2hkcik7CiAJaWYgKGhwID09IE5VTEwpCiAJCXJldHVybiBmYWxzZTsKIApAQCAtMjE4LDIzICsyMTgsNiBAQAogCX0sCiAJeyB9CiB9OwotI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKLXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIHVkcF9jb21wYXRfc3lzY3RsX3RhYmxlW10gPSB7Ci0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3VkcF90aW1lb3V0IiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja191ZHBfdGltZW91dF9zdHJlYW0iLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JeyB9Ci19OwotI2VuZGlmIC8qIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQgKi8KICNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCiAKIHN0YXRpYyBpbnQgdWRwX2ttZW1kdXBfc3lzY3RsX3RhYmxlKHN0cnVjdCBuZl9wcm90b19uZXQgKnBuLApAQCAtMjU0LDI3ICsyMzcsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVkcF9rbWVtZHVwX2NvbXBhdF9zeXNjdGxfdGFibGUoc3RydWN0IG5mX3Byb3RvX25ldCAqcG4sCi0JCQkJCSAgIHN0cnVjdCBuZl91ZHBfbmV0ICp1bikKLXsKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAotCXBuLT5jdGxfY29tcGF0X3RhYmxlID0ga21lbWR1cCh1ZHBfY29tcGF0X3N5c2N0bF90YWJsZSwKLQkJCQkgICAgICAgc2l6ZW9mKHVkcF9jb21wYXRfc3lzY3RsX3RhYmxlKSwKLQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwbi0+Y3RsX2NvbXBhdF90YWJsZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwbi0+Y3RsX2NvbXBhdF90YWJsZVswXS5kYXRhID0gJnVuLT50aW1lb3V0c1tVRFBfQ1RfVU5SRVBMSUVEXTsKLQlwbi0+Y3RsX2NvbXBhdF90YWJsZVsxXS5kYXRhID0gJnVuLT50aW1lb3V0c1tVRFBfQ1RfUkVQTElFRF07Ci0jZW5kaWYKLSNlbmRpZgotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHVkcF9pbml0X25ldChzdHJ1Y3QgbmV0ICpuZXQsIHVfaW50MTZfdCBwcm90bykKIHsKLQlpbnQgcmV0OwogCXN0cnVjdCBuZl91ZHBfbmV0ICp1biA9IHVkcF9wZXJuZXQobmV0KTsKIAlzdHJ1Y3QgbmZfcHJvdG9fbmV0ICpwbiA9ICZ1bi0+cG47CiAKQEAgLTI4NSwxOCArMjQ5LDcgQEAKIAkJCXVuLT50aW1lb3V0c1tpXSA9IHVkcF90aW1lb3V0c1tpXTsKIAl9CiAKLQlpZiAocHJvdG8gPT0gQUZfSU5FVCkgewotCQlyZXQgPSB1ZHBfa21lbWR1cF9jb21wYXRfc3lzY3RsX3RhYmxlKHBuLCB1bik7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQotCQlyZXQgPSB1ZHBfa21lbWR1cF9zeXNjdGxfdGFibGUocG4sIHVuKTsKLQkJaWYgKHJldCA8IDApCi0JCQluZl9jdF9rZnJlZV9jb21wYXRfc3lzY3RsX3RhYmxlKHBuKTsKLQl9IGVsc2UKLQkJcmV0ID0gdWRwX2ttZW1kdXBfc3lzY3RsX3RhYmxlKHBuLCB1bik7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiB1ZHBfa21lbWR1cF9zeXNjdGxfdGFibGUocG4sIHVuKTsKIH0KIAogc3RhdGljIHN0cnVjdCBuZl9wcm90b19uZXQgKnVkcF9nZXRfbmV0X3Byb3RvKHN0cnVjdCBuZXQgKm5ldCkKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcGxpdGUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcGxpdGUuYwppbmRleCA5ZDY5MmY1YS4uMDI5MjA2ZSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdWRwbGl0ZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcGxpdGUuYwpAQCAtNTQsNyArNTQsOCBAQAogCWNvbnN0IHN0cnVjdCB1ZHBoZHIgKmhwOwogCXN0cnVjdCB1ZHBoZHIgX2hkcjsKIAotCWhwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgZGF0YW9mZiwgc2l6ZW9mKF9oZHIpLCAmX2hkcik7CisJLyogQWN0dWFsbHkgb25seSBuZWVkIGZpcnN0IDQgYnl0ZXMgdG8gZ2V0IHBvcnRzLiAqLworCWhwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgZGF0YW9mZiwgNCwgJl9oZHIpOwogCWlmIChocCA9PSBOVUxMKQogCQlyZXR1cm4gZmFsc2U7CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NlcWFkai5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2VxYWRqLmMKaW5kZXggZGZmMGYwYy4uZWY3MDYzZSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2VxYWRqLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2VxYWRqLmMKQEAgLTE2OSw3ICsxNjksNyBAQAogCXMzMiBzZXFvZmYsIGFja29mZjsKIAlzdHJ1Y3QgbmZfY29ubl9zZXFhZGogKnNlcWFkaiA9IG5mY3Rfc2VxYWRqKGN0KTsKIAlzdHJ1Y3QgbmZfY3Rfc2VxYWRqICp0aGlzX3dheSwgKm90aGVyX3dheTsKLQlpbnQgcmVzOworCWludCByZXMgPSAxOwogCiAJdGhpc193YXkgID0gJnNlcWFkai0+c2VxW2Rpcl07CiAJb3RoZXJfd2F5ID0gJnNlcWFkai0+c2VxWyFkaXJdOwpAQCAtMTg0LDI3ICsxODQsMzEgQEAKIAllbHNlCiAJCXNlcW9mZiA9IHRoaXNfd2F5LT5vZmZzZXRfYmVmb3JlOwogCisJbmV3c2VxID0gaHRvbmwobnRvaGwodGNwaC0+c2VxKSArIHNlcW9mZik7CisJaW5ldF9wcm90b19jc3VtX3JlcGxhY2U0KCZ0Y3BoLT5jaGVjaywgc2tiLCB0Y3BoLT5zZXEsIG5ld3NlcSwgZmFsc2UpOworCXByX2RlYnVnKCJBZGp1c3Rpbmcgc2VxdWVuY2UgbnVtYmVyIGZyb20gJXUtPiV1XG4iLAorCQkgbnRvaGwodGNwaC0+c2VxKSwgbnRvaGwobmV3c2VxKSk7CisJdGNwaC0+c2VxID0gbmV3c2VxOworCisJaWYgKCF0Y3BoLT5hY2spCisJCWdvdG8gb3V0OworCiAJaWYgKGFmdGVyKG50b2hsKHRjcGgtPmFja19zZXEpIC0gb3RoZXJfd2F5LT5vZmZzZXRfYmVmb3JlLAogCQkgIG90aGVyX3dheS0+Y29ycmVjdGlvbl9wb3MpKQogCQlhY2tvZmYgPSBvdGhlcl93YXktPm9mZnNldF9hZnRlcjsKIAllbHNlCiAJCWFja29mZiA9IG90aGVyX3dheS0+b2Zmc2V0X2JlZm9yZTsKIAotCW5ld3NlcSA9IGh0b25sKG50b2hsKHRjcGgtPnNlcSkgKyBzZXFvZmYpOwogCW5ld2FjayA9IGh0b25sKG50b2hsKHRjcGgtPmFja19zZXEpIC0gYWNrb2ZmKTsKLQotCWluZXRfcHJvdG9fY3N1bV9yZXBsYWNlNCgmdGNwaC0+Y2hlY2ssIHNrYiwgdGNwaC0+c2VxLCBuZXdzZXEsIGZhbHNlKTsKIAlpbmV0X3Byb3RvX2NzdW1fcmVwbGFjZTQoJnRjcGgtPmNoZWNrLCBza2IsIHRjcGgtPmFja19zZXEsIG5ld2FjaywKIAkJCQkgZmFsc2UpOwotCi0JcHJfZGVidWcoIkFkanVzdGluZyBzZXF1ZW5jZSBudW1iZXIgZnJvbSAldS0+JXUsIGFjayBmcm9tICV1LT4ldVxuIiwKKwlwcl9kZWJ1ZygiQWRqdXN0aW5nIGFjayBudW1iZXIgZnJvbSAldS0+JXUsIGFjayBmcm9tICV1LT4ldVxuIiwKIAkJIG50b2hsKHRjcGgtPnNlcSksIG50b2hsKG5ld3NlcSksIG50b2hsKHRjcGgtPmFja19zZXEpLAogCQkgbnRvaGwobmV3YWNrKSk7Ci0KLQl0Y3BoLT5zZXEgPSBuZXdzZXE7CiAJdGNwaC0+YWNrX3NlcSA9IG5ld2FjazsKIAogCXJlcyA9IG5mX2N0X3NhY2tfYWRqdXN0KHNrYiwgcHJvdG9mZiwgdGNwaCwgY3QsIGN0aW5mbyk7CitvdXQ6CiAJc3Bpbl91bmxvY2tfYmgoJmN0LT5sb2NrKTsKIAogCXJldHVybiByZXM7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zaXAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5jCmluZGV4IDhkOWRiOWQuLjYyMWI4MWMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5jCkBAIC04Myw5ICs4MywxMCBAQAogc3RhdGljIGludCBpc3dvcmRjKGNvbnN0IGNoYXIgYykKIHsKIAlpZiAoaXNhbG51bShjKSB8fCBjID09ICchJyB8fCBjID09ICciJyB8fCBjID09ICclJyB8fAotCSAgICAoYyA+PSAnKCcgJiYgYyA8PSAnLycpIHx8IGMgPT0gJzonIHx8IGMgPT0gJzwnIHx8IGMgPT0gJz4nIHx8CisJICAgIChjID49ICcoJyAmJiBjIDw9ICcrJykgfHwgYyA9PSAnOicgfHwgYyA9PSAnPCcgfHwgYyA9PSAnPicgfHwKIAkgICAgYyA9PSAnPycgfHwgKGMgPj0gJ1snICYmIGMgPD0gJ10nKSB8fCBjID09ICdfJyB8fCBjID09ICdgJyB8fAotCSAgICBjID09ICd7JyB8fCBjID09ICd9JyB8fCBjID09ICd+JykKKwkgICAgYyA9PSAneycgfHwgYyA9PSAnfScgfHwgYyA9PSAnficgfHwgKGMgPj0gJy0nICYmIGMgPD0gJy8nKSB8fAorCSAgICBjID09ICdcJycpCiAJCXJldHVybiAxOwogCXJldHVybiAwOwogfQpAQCAtMzI5LDEzICszMzAsMTIgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpzaXBfc2tpcF93aGl0ZXNwYWNlKGNvbnN0IGNoYXIgKmRwdHIsIGNvbnN0IGNoYXIgKmxpbWl0KQogewogCWZvciAoOyBkcHRyIDwgbGltaXQ7IGRwdHIrKykgewotCQlpZiAoKmRwdHIgPT0gJyAnKQorCQlpZiAoKmRwdHIgPT0gJyAnIHx8ICpkcHRyID09ICdcdCcpCiAJCQljb250aW51ZTsKIAkJaWYgKCpkcHRyICE9ICdccicgJiYgKmRwdHIgIT0gJ1xuJykKIAkJCWJyZWFrOwogCQlkcHRyID0gc2lwX2ZvbGxvd19jb250aW51YXRpb24oZHB0ciwgbGltaXQpOwotCQlpZiAoZHB0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisJCWJyZWFrOwogCX0KIAlyZXR1cm4gZHB0cjsKIH0KQEAgLTEzODMsNyArMTM4Myw3IEBACiAJCXJldHVybiBORl9EUk9QOwogCX0KIAljc2VxID0gc2ltcGxlX3N0cnRvdWwoKmRwdHIgKyBtYXRjaG9mZiwgTlVMTCwgMTApOwotCWlmICghY3NlcSkgeworCWlmICghY3NlcSAmJiAqKCpkcHRyICsgbWF0Y2hvZmYpICE9ICcwJykgewogCQluZl9jdF9oZWxwZXJfbG9nKHNrYiwgY3QsICJjYW5ub3QgZ2V0IGNzZXEiKTsKIAkJcmV0dXJuIE5GX0RST1A7CiAJfQpAQCAtMTQ0Niw3ICsxNDQ2LDcgQEAKIAkJCXJldHVybiBORl9EUk9QOwogCQl9CiAJCWNzZXEgPSBzaW1wbGVfc3RydG91bCgqZHB0ciArIG1hdGNob2ZmLCBOVUxMLCAxMCk7Ci0JCWlmICghY3NlcSkgeworCQlpZiAoIWNzZXEgJiYgKigqZHB0ciArIG1hdGNob2ZmKSAhPSAnMCcpIHsKIAkJCW5mX2N0X2hlbHBlcl9sb2coc2tiLCBjdCwgImNhbm5vdCBnZXQgY3NlcSIpOwogCQkJcmV0dXJuIE5GX0RST1A7CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYwppbmRleCA5NThhMTQ1Li41ZjQ0NmNkIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zdGFuZGFsb25lLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jCkBAIC0yMDUsMTYgKzIwNSwyNSBAQAogCXN0cnVjdCBuZl9jb25uICpjdCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaGFzaCk7CiAJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvOwogCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bzsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXFfZmlsZV9uZXQocyk7CiAJaW50IHJldCA9IDA7CiAKIAlORl9DVF9BU1NFUlQoY3QpOwogCWlmICh1bmxpa2VseSghYXRvbWljX2luY19ub3RfemVybygmY3QtPmN0X2dlbmVyYWwudXNlKSkpCiAJCXJldHVybiAwOwogCisJaWYgKG5mX2N0X3Nob3VsZF9nYyhjdCkpIHsKKwkJbmZfY3Rfa2lsbChjdCk7CisJCWdvdG8gcmVsZWFzZTsKKwl9CisKIAkvKiB3ZSBvbmx5IHdhbnQgdG8gcHJpbnQgRElSX09SSUdJTkFMICovCiAJaWYgKE5GX0NUX0RJUkVDVElPTihoYXNoKSkKIAkJZ290byByZWxlYXNlOwogCisJaWYgKCFuZXRfZXEobmZfY3RfbmV0KGN0KSwgbmV0KSkKKwkJZ290byByZWxlYXNlOworCiAJbDNwcm90byA9IF9fbmZfY3RfbDNwcm90b19maW5kKG5mX2N0X2wzbnVtKGN0KSk7CiAJTkZfQ1RfQVNTRVJUKGwzcHJvdG8pOwogCWw0cHJvdG8gPSBfX25mX2N0X2w0cHJvdG9fZmluZChuZl9jdF9sM251bShjdCksIG5mX2N0X3Byb3RvbnVtKGN0KSk7CkBAIC0yMjQsOCArMjMzLDcgQEAKIAlzZXFfcHJpbnRmKHMsICIlLThzICV1ICUtOHMgJXUgJWxkICIsCiAJCSAgIGwzcHJvdG8tPm5hbWUsIG5mX2N0X2wzbnVtKGN0KSwKIAkJICAgbDRwcm90by0+bmFtZSwgbmZfY3RfcHJvdG9udW0oY3QpLAotCQkgICB0aW1lcl9wZW5kaW5nKCZjdC0+dGltZW91dCkKLQkJICAgPyAobG9uZykoY3QtPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXMpL0haIDogMCk7CisJCSAgIG5mX2N0X2V4cGlyZXMoY3QpICAvIEhaKTsKIAogCWlmIChsNHByb3RvLT5wcmludF9jb25udHJhY2spCiAJCWw0cHJvdG8tPnByaW50X2Nvbm50cmFjayhzLCBjdCk7CkBAIC0zNDksMTMgKzM1NywxMyBAQAogCXNlcV9wcmludGYoc2VxLCAiJTA4eCAgJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAiCiAJCQkiJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAogCQkgICBucl9jb25udHJhY2tzLAotCQkgICBzdC0+c2VhcmNoZWQsCisJCSAgIDAsCiAJCSAgIHN0LT5mb3VuZCwKLQkJICAgc3QtPm5ldywKKwkJICAgMCwKIAkJICAgc3QtPmludmFsaWQsCiAJCSAgIHN0LT5pZ25vcmUsCi0JCSAgIHN0LT5kZWxldGUsCi0JCSAgIHN0LT5kZWxldGVfbGlzdCwKKwkJICAgMCwKKwkJICAgMCwKIAkJICAgc3QtPmluc2VydCwKIAkJICAgc3QtPmluc2VydF9mYWlsZWQsCiAJCSAgIHN0LT5kcm9wLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9pbnRlcm5hbHMuaCBiL25ldC9uZXRmaWx0ZXIvbmZfaW50ZXJuYWxzLmgKaW5kZXggMDY1NTIyNS4uZTBhZGI1OSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9pbnRlcm5hbHMuaAorKysgYi9uZXQvbmV0ZmlsdGVyL25mX2ludGVybmFscy5oCkBAIC0xMywxMyArMTMsMTMgQEAKIAogCiAvKiBjb3JlLmMgKi8KLXVuc2lnbmVkIGludCBuZl9pdGVyYXRlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQlzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUsIHN0cnVjdCBuZl9ob29rX29wcyAqKmVsZW1wKTsKK3Vuc2lnbmVkIGludCBuZl9pdGVyYXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKKwkJCXN0cnVjdCBuZl9ob29rX2VudHJ5ICoqZW50cnlwKTsKIAogLyogbmZfcXVldWUuYyAqLwotaW50IG5mX3F1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZl9ob29rX29wcyAqZWxlbSwKLQkgICAgIHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgaW50IHF1ZXVlbnVtKTsKLXZvaWQgbmZfcXVldWVfbmZfaG9va19kcm9wKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMpOworaW50IG5mX3F1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKKwkgICAgIHVuc2lnbmVkIGludCBxdWV1ZW51bSk7Cit2b2lkIG5mX3F1ZXVlX25mX2hvb2tfZHJvcChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZl9ob29rX2VudHJ5ICplbnRyeSk7CiBpbnQgX19pbml0IG5ldGZpbHRlcl9xdWV1ZV9pbml0KHZvaWQpOwogCiAvKiBuZl9sb2cuYyAqLwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9sb2cuYyBiL25ldC9uZXRmaWx0ZXIvbmZfbG9nLmMKaW5kZXggYWE1ODQ3YS4uM2RjYTkwZCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9sb2cuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2xvZy5jCkBAIC0zOSwxMiArMzksMTIgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBuZl9sb2dfc2V0KHN0cnVjdCBuZXQgKm5ldCwgdV9pbnQ4X3QgcGYsIGNvbnN0IHN0cnVjdCBuZl9sb2dnZXIgKmxvZ2dlcikKK2ludCBuZl9sb2dfc2V0KHN0cnVjdCBuZXQgKm5ldCwgdV9pbnQ4X3QgcGYsIGNvbnN0IHN0cnVjdCBuZl9sb2dnZXIgKmxvZ2dlcikKIHsKIAljb25zdCBzdHJ1Y3QgbmZfbG9nZ2VyICpsb2c7CiAKLQlpZiAocGYgPT0gTkZQUk9UT19VTlNQRUMpCi0JCXJldHVybjsKKwlpZiAocGYgPT0gTkZQUk9UT19VTlNQRUMgfHwgcGYgPj0gQVJSQVlfU0laRShuZXQtPm5mLm5mX2xvZ2dlcnMpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAltdXRleF9sb2NrKCZuZl9sb2dfbXV0ZXgpOwogCWxvZyA9IG5mdF9sb2dfZGVyZWZlcmVuY2UobmV0LT5uZi5uZl9sb2dnZXJzW3BmXSk7CkBAIC01Miw2ICs1Miw4IEBACiAJCXJjdV9hc3NpZ25fcG9pbnRlcihuZXQtPm5mLm5mX2xvZ2dlcnNbcGZdLCBsb2dnZXIpOwogCiAJbXV0ZXhfdW5sb2NrKCZuZl9sb2dfbXV0ZXgpOworCisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKG5mX2xvZ19zZXQpOwogCkBAIC00MjAsNyArNDIyLDcgQEAKIAljaGFyIGJ1ZltORkxPR0dFUl9OQU1FX0xFTl07CiAJaW50IHIgPSAwOwogCWludCB0aW5kZXggPSAodW5zaWduZWQgbG9uZyl0YWJsZS0+ZXh0cmExOwotCXN0cnVjdCBuZXQgKm5ldCA9IGN1cnJlbnQtPm5zcHJveHktPm5ldF9uczsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSB0YWJsZS0+ZXh0cmEyOwogCiAJaWYgKHdyaXRlKSB7CiAJCXN0cnVjdCBjdGxfdGFibGUgdG1wID0gKnRhYmxlOwpAQCAtNDc0LDcgKzQ3Niw2IEBACiAJCQkJIDMsICIlZCIsIGkpOwogCQkJbmZfbG9nX3N5c2N0bF90YWJsZVtpXS5wcm9jbmFtZQk9CiAJCQkJbmZfbG9nX3N5c2N0bF9mbmFtZXNbaV07Ci0JCQluZl9sb2dfc3lzY3RsX3RhYmxlW2ldLmRhdGEgPSBOVUxMOwogCQkJbmZfbG9nX3N5c2N0bF90YWJsZVtpXS5tYXhsZW4gPSBORkxPR0dFUl9OQU1FX0xFTjsKIAkJCW5mX2xvZ19zeXNjdGxfdGFibGVbaV0ubW9kZSA9IDA2NDQ7CiAJCQluZl9sb2dfc3lzY3RsX3RhYmxlW2ldLnByb2NfaGFuZGxlciA9CkBAIC00ODQsNiArNDg1LDkgQEAKIAkJfQogCX0KIAorCWZvciAoaSA9IE5GUFJPVE9fVU5TUEVDOyBpIDwgTkZQUk9UT19OVU1QUk9UTzsgaSsrKQorCQl0YWJsZVtpXS5leHRyYTIgPSBuZXQ7CisKIAluZXQtPm5mLm5mX2xvZ19kaXJfaGVhZGVyID0gcmVnaXN0ZXJfbmV0X3N5c2N0bChuZXQsCiAJCQkJCQkibmV0L25ldGZpbHRlci9uZl9sb2ciLAogCQkJCQkJdGFibGUpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9sb2dfY29tbW9uLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2xvZ19jb21tb24uYwppbmRleCBhNWFhNTk2Li4xMTlmZTFjIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2xvZ19jb21tb24uYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2xvZ19jb21tb24uYwpAQCAtNzcsNyArNzcsNyBAQAogCW5mX2xvZ19idWZfYWRkKG0sICJTUFQ9JXUgRFBUPSV1ICIsCiAJCSAgICAgICBudG9ocyh0aC0+c291cmNlKSwgbnRvaHModGgtPmRlc3QpKTsKIAkvKiBNYXggbGVuZ3RoOiAzMCAiU0VRPTQyOTQ5NjcyOTUgQUNLPTQyOTQ5NjcyOTUgIiAqLwotCWlmIChsb2dmbGFncyAmIFhUX0xPR19UQ1BTRVEpIHsKKwlpZiAobG9nZmxhZ3MgJiBORl9MT0dfVENQU0VRKSB7CiAJCW5mX2xvZ19idWZfYWRkKG0sICJTRVE9JXUgQUNLPSV1ICIsCiAJCQkgICAgICAgbnRvaGwodGgtPnNlcSksIG50b2hsKHRoLT5hY2tfc2VxKSk7CiAJfQpAQCAtMTA3LDcgKzEwNyw3IEBACiAJLyogTWF4IGxlbmd0aDogMTEgIlVSR1A9NjU1MzUgIiAqLwogCW5mX2xvZ19idWZfYWRkKG0sICJVUkdQPSV1ICIsIG50b2hzKHRoLT51cmdfcHRyKSk7CiAKLQlpZiAoKGxvZ2ZsYWdzICYgWFRfTE9HX1RDUE9QVCkgJiYgdGgtPmRvZmYqNCA+IHNpemVvZihzdHJ1Y3QgdGNwaGRyKSkgeworCWlmICgobG9nZmxhZ3MgJiBORl9MT0dfVENQT1BUKSAmJiB0aC0+ZG9mZio0ID4gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKSB7CiAJCXVfaW50OF90IF9vcHRbNjAgLSBzaXplb2Yoc3RydWN0IHRjcGhkcildOwogCQljb25zdCB1X2ludDhfdCAqb3A7CiAJCXVuc2lnbmVkIGludCBpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jIGIvbmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCmluZGV4IGRlMzE4MTguLmJiYjhmM2QgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMKQEAgLTQ0MSw3ICs0NDEsOCBAQAogCQkJY3QtPnN0YXR1cyB8PSBJUFNfRFNUX05BVDsKIAogCQlpZiAobmZjdF9oZWxwKGN0KSkKLQkJCW5mY3Rfc2VxYWRqX2V4dF9hZGQoY3QpOworCQkJaWYgKCFuZmN0X3NlcWFkal9leHRfYWRkKGN0KSkKKwkJCQlyZXR1cm4gTkZfRFJPUDsKIAl9CiAKIAlpZiAobWFuaXB0eXBlID09IE5GX05BVF9NQU5JUF9TUkMpIHsKQEAgLTU2NSwxNiArNTY2LDEwIEBACiAJICogRWxzZSwgd2hlbiB0aGUgY29ubnRyYWNrIGlzIGRlc3RveWVkLCBuZl9uYXRfY2xlYW51cF9jb25udHJhY2soKQogCSAqIHdpbGwgZGVsZXRlIGVudHJ5IGZyb20gYWxyZWFkeS1mcmVlZCB0YWJsZS4KIAkgKi8KLQlpZiAoIWRlbF90aW1lcigmY3QtPnRpbWVvdXQpKQotCQlyZXR1cm4gMTsKLQogCWN0LT5zdGF0dXMgJj0gfklQU19OQVRfRE9ORV9NQVNLOwotCiAJcmhhc2h0YWJsZV9yZW1vdmVfZmFzdCgmbmZfbmF0X2J5c291cmNlX3RhYmxlLCAmY3QtPm5hdF9ieXNvdXJjZSwKIAkJCSAgICAgICBuZl9uYXRfYnlzb3VyY2VfcGFyYW1zKTsKIAotCWFkZF90aW1lcigmY3QtPnRpbWVvdXQpOwotCiAJLyogZG9uJ3QgZGVsZXRlIGNvbm50cmFjay4gIEFsdGhvdWdoIHRoYXQgd291bGQgbWFrZSB0aGluZ3MgYSBsb3QKIAkgKiBzaW1wbGVyLCB3ZSdkIGVuZCB1cCBmbHVzaGluZyBhbGwgY29ubnRyYWNrcyBvbiBuYXQgcm1tb2QuCiAJICovCkBAIC04MDcsNyArODAyLDcgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXJldHVybiBuZl9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBtYW5pcCk7CisJcmV0dXJuIG5mX25hdF9zZXR1cF9pbmZvKGN0LCAmcmFuZ2UsIG1hbmlwKSA9PSBORl9EUk9QID8gLUVOT01FTSA6IDA7CiB9CiAjZWxzZQogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9xdWV1ZS5jIGIvbmV0L25ldGZpbHRlci9uZl9xdWV1ZS5jCmluZGV4IGIxOWFkMjAuLjk2OTY0YTAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfcXVldWUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX3F1ZXVlLmMKQEAgLTk2LDE0ICs5NiwxNCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZfcXVldWVfZW50cnlfZ2V0X3JlZnMpOwogCi12b2lkIG5mX3F1ZXVlX25mX2hvb2tfZHJvcChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZl9ob29rX29wcyAqb3BzKQordm9pZCBuZl9xdWV1ZV9uZl9ob29rX2Ryb3Aoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZfaG9va19lbnRyeSAqZW50cnkpCiB7CiAJY29uc3Qgc3RydWN0IG5mX3F1ZXVlX2hhbmRsZXIgKnFoOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCXFoID0gcmN1X2RlcmVmZXJlbmNlKG5ldC0+bmYucXVldWVfaGFuZGxlcik7CiAJaWYgKHFoKQotCQlxaC0+bmZfaG9va19kcm9wKG5ldCwgb3BzKTsKKwkJcWgtPm5mX2hvb2tfZHJvcChuZXQsIGVudHJ5KTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIApAQCAtMTEyLDcgKzExMiw2IEBACiAgKiB0aHJvdWdoIG5mX3JlaW5qZWN0KCkuCiAgKi8KIGludCBuZl9xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgICAgc3RydWN0IG5mX2hvb2tfb3BzICplbGVtLAogCSAgICAgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAogCSAgICAgdW5zaWduZWQgaW50IHF1ZXVlbnVtKQogewpAQCAtMTQxLDcgKzE0MCw2IEBACiAKIAkqZW50cnkgPSAoc3RydWN0IG5mX3F1ZXVlX2VudHJ5KSB7CiAJCS5za2IJPSBza2IsCi0JCS5lbGVtCT0gZWxlbSwKIAkJLnN0YXRlCT0gKnN0YXRlLAogCQkuc2l6ZQk9IHNpemVvZigqZW50cnkpICsgYWZpbmZvLT5yb3V0ZV9rZXlfc2l6ZSwKIAl9OwpAQCAtMTY1LDExICsxNjMsMTUgQEAKIAogdm9pZCBuZl9yZWluamVjdChzdHJ1Y3QgbmZfcXVldWVfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCBpbnQgdmVyZGljdCkKIHsKKwlzdHJ1Y3QgbmZfaG9va19lbnRyeSAqaG9va19lbnRyeTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZW50cnktPnNrYjsKLQlzdHJ1Y3QgbmZfaG9va19vcHMgKmVsZW0gPSBlbnRyeS0+ZWxlbTsKIAljb25zdCBzdHJ1Y3QgbmZfYWZpbmZvICphZmluZm87CisJc3RydWN0IG5mX2hvb2tfb3BzICplbGVtOwogCWludCBlcnI7CiAKKwlob29rX2VudHJ5ID0gcmN1X2RlcmVmZXJlbmNlKGVudHJ5LT5zdGF0ZS5ob29rX2VudHJpZXMpOworCWVsZW0gPSAmaG9va19lbnRyeS0+b3BzOworCiAJbmZfcXVldWVfZW50cnlfcmVsZWFzZV9yZWZzKGVudHJ5KTsKIAogCS8qIENvbnRpbnVlIHRyYXZlcnNhbCBpZmYgdXNlcnNwYWNlIHNhaWQgb2suLi4gKi8KQEAgLTE4Niw4ICsxODgsNyBAQAogCiAJaWYgKHZlcmRpY3QgPT0gTkZfQUNDRVBUKSB7CiAJbmV4dF9ob29rOgotCQl2ZXJkaWN0ID0gbmZfaXRlcmF0ZShlbnRyeS0+c3RhdGUuaG9va19saXN0LAotCQkJCSAgICAgc2tiLCAmZW50cnktPnN0YXRlLCAmZWxlbSk7CisJCXZlcmRpY3QgPSBuZl9pdGVyYXRlKHNrYiwgJmVudHJ5LT5zdGF0ZSwgJmhvb2tfZW50cnkpOwogCX0KIAogCXN3aXRjaCAodmVyZGljdCAmIE5GX1ZFUkRJQ1RfTUFTSykgewpAQCAtMTk4LDcgKzE5OSw4IEBACiAJCWxvY2FsX2JoX2VuYWJsZSgpOwogCQlicmVhazsKIAljYXNlIE5GX1FVRVVFOgotCQllcnIgPSBuZl9xdWV1ZShza2IsIGVsZW0sICZlbnRyeS0+c3RhdGUsCisJCVJDVV9JTklUX1BPSU5URVIoZW50cnktPnN0YXRlLmhvb2tfZW50cmllcywgaG9va19lbnRyeSk7CisJCWVyciA9IG5mX3F1ZXVlKHNrYiwgJmVudHJ5LT5zdGF0ZSwKIAkJCSAgICAgICB2ZXJkaWN0ID4+IE5GX1ZFUkRJQ1RfUUJJVFMpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJaWYgKGVyciA9PSAtRVNSQ0ggJiYKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2FwaS5jIGIvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfYXBpLmMKaW5kZXggN2UxYzg3Ni4uYjcwZDNlYSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfYXBpLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfYXBpLmMKQEAgLTExOTYsNiArMTE5Niw4MyBAQAogCX0KIH0KIAorc3RydWN0IG5mdF9jaGFpbl9ob29rIHsKKwl1MzIJCQkJbnVtOworCXUzMgkJCQlwcmlvcml0eTsKKwljb25zdCBzdHJ1Y3QgbmZfY2hhaW5fdHlwZQkqdHlwZTsKKwlzdHJ1Y3QgbmV0X2RldmljZQkJKmRldjsKK307CisKK3N0YXRpYyBpbnQgbmZ0X2NoYWluX3BhcnNlX2hvb2soc3RydWN0IG5ldCAqbmV0LAorCQkJCWNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBubGFbXSwKKwkJCQlzdHJ1Y3QgbmZ0X2FmX2luZm8gKmFmaSwKKwkJCQlzdHJ1Y3QgbmZ0X2NoYWluX2hvb2sgKmhvb2ssIGJvb2wgY3JlYXRlKQoreworCXN0cnVjdCBubGF0dHIgKmhhW05GVEFfSE9PS19NQVggKyAxXTsKKwljb25zdCBzdHJ1Y3QgbmZfY2hhaW5fdHlwZSAqdHlwZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBlcnI7CisKKwllcnIgPSBubGFfcGFyc2VfbmVzdGVkKGhhLCBORlRBX0hPT0tfTUFYLCBubGFbTkZUQV9DSEFJTl9IT09LXSwKKwkJCSAgICAgICBuZnRfaG9va19wb2xpY3kpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGhhW05GVEFfSE9PS19IT09LTlVNXSA9PSBOVUxMIHx8CisJICAgIGhhW05GVEFfSE9PS19QUklPUklUWV0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlob29rLT5udW0gPSBudG9obChubGFfZ2V0X2JlMzIoaGFbTkZUQV9IT09LX0hPT0tOVU1dKSk7CisJaWYgKGhvb2stPm51bSA+PSBhZmktPm5ob29rcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlob29rLT5wcmlvcml0eSA9IG50b2hsKG5sYV9nZXRfYmUzMihoYVtORlRBX0hPT0tfUFJJT1JJVFldKSk7CisKKwl0eXBlID0gY2hhaW5fdHlwZVthZmktPmZhbWlseV1bTkZUX0NIQUlOX1RfREVGQVVMVF07CisJaWYgKG5sYVtORlRBX0NIQUlOX1RZUEVdKSB7CisJCXR5cGUgPSBuZl90YWJsZXNfY2hhaW5fdHlwZV9sb29rdXAoYWZpLCBubGFbTkZUQV9DSEFJTl9UWVBFXSwKKwkJCQkJCSAgIGNyZWF0ZSk7CisJCWlmIChJU19FUlIodHlwZSkpCisJCQlyZXR1cm4gUFRSX0VSUih0eXBlKTsKKwl9CisJaWYgKCEodHlwZS0+aG9va19tYXNrICYgKDEgPDwgaG9vay0+bnVtKSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KHR5cGUtPm93bmVyKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlob29rLT50eXBlID0gdHlwZTsKKworCWhvb2stPmRldiA9IE5VTEw7CisJaWYgKGFmaS0+ZmxhZ3MgJiBORlRfQUZfTkVFRFNfREVWKSB7CisJCWNoYXIgaWZuYW1lW0lGTkFNU0laXTsKKworCQlpZiAoIWhhW05GVEFfSE9PS19ERVZdKSB7CisJCQltb2R1bGVfcHV0KHR5cGUtPm93bmVyKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCisJCW5sYV9zdHJsY3B5KGlmbmFtZSwgaGFbTkZUQV9IT09LX0RFVl0sIElGTkFNU0laKTsKKwkJZGV2ID0gZGV2X2dldF9ieV9uYW1lKG5ldCwgaWZuYW1lKTsKKwkJaWYgKCFkZXYpIHsKKwkJCW1vZHVsZV9wdXQodHlwZS0+b3duZXIpOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKwkJaG9vay0+ZGV2ID0gZGV2OworCX0gZWxzZSBpZiAoaGFbTkZUQV9IT09LX0RFVl0pIHsKKwkJbW9kdWxlX3B1dCh0eXBlLT5vd25lcik7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmZ0X2NoYWluX3JlbGVhc2VfaG9vayhzdHJ1Y3QgbmZ0X2NoYWluX2hvb2sgKmhvb2spCit7CisJbW9kdWxlX3B1dChob29rLT50eXBlLT5vd25lcik7CisJaWYgKGhvb2stPmRldiAhPSBOVUxMKQorCQlkZXZfcHV0KGhvb2stPmRldik7Cit9CisKIHN0YXRpYyBpbnQgbmZfdGFibGVzX25ld2NoYWluKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2sgKm5sc2ssCiAJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBubGFbXSkKQEAgLTEyMDYsMTAgKzEyODMsOCBAQAogCXN0cnVjdCBuZnRfdGFibGUgKnRhYmxlOwogCXN0cnVjdCBuZnRfY2hhaW4gKmNoYWluOwogCXN0cnVjdCBuZnRfYmFzZV9jaGFpbiAqYmFzZWNoYWluID0gTlVMTDsKLQlzdHJ1Y3QgbmxhdHRyICpoYVtORlRBX0hPT0tfTUFYICsgMV07CiAJdTggZ2VubWFzayA9IG5mdF9nZW5tYXNrX25leHQobmV0KTsKIAlpbnQgZmFtaWx5ID0gbmZtc2ctPm5mZ2VuX2ZhbWlseTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKIAl1OCBwb2xpY3kgPSBORl9BQ0NFUFQ7CiAJdTY0IGhhbmRsZSA9IDA7CiAJdW5zaWduZWQgaW50IGk7CkBAIC0xMjczLDYgKzEzNDgsMzcgQEAKIAkJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9SRVBMQUNFKQogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCisJCWlmIChubGFbTkZUQV9DSEFJTl9IT09LXSkgeworCQkJc3RydWN0IG5mdF9iYXNlX2NoYWluICpiYXNlY2hhaW47CisJCQlzdHJ1Y3QgbmZ0X2NoYWluX2hvb2sgaG9vazsKKwkJCXN0cnVjdCBuZl9ob29rX29wcyAqb3BzOworCisJCQlpZiAoIShjaGFpbi0+ZmxhZ3MgJiBORlRfQkFTRV9DSEFJTikpCisJCQkJcmV0dXJuIC1FQlVTWTsKKworCQkJZXJyID0gbmZ0X2NoYWluX3BhcnNlX2hvb2sobmV0LCBubGEsIGFmaSwgJmhvb2ssCisJCQkJCQkgICBjcmVhdGUpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKworCQkJYmFzZWNoYWluID0gbmZ0X2Jhc2VfY2hhaW4oY2hhaW4pOworCQkJaWYgKGJhc2VjaGFpbi0+dHlwZSAhPSBob29rLnR5cGUpIHsKKwkJCQluZnRfY2hhaW5fcmVsZWFzZV9ob29rKCZob29rKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCisJCQlmb3IgKGkgPSAwOyBpIDwgYWZpLT5ub3BzOyBpKyspIHsKKwkJCQlvcHMgPSAmYmFzZWNoYWluLT5vcHNbaV07CisJCQkJaWYgKG9wcy0+aG9va251bSAhPSBob29rLm51bSB8fAorCQkJCSAgICBvcHMtPnByaW9yaXR5ICE9IGhvb2sucHJpb3JpdHkgfHwKKwkJCQkgICAgb3BzLT5kZXYgIT0gaG9vay5kZXYpIHsKKwkJCQkJbmZ0X2NoYWluX3JlbGVhc2VfaG9vaygmaG9vayk7CisJCQkJCXJldHVybiAtRUJVU1k7CisJCQkJfQorCQkJfQorCQkJbmZ0X2NoYWluX3JlbGVhc2VfaG9vaygmaG9vayk7CisJCX0KKwogCQlpZiAobmxhW05GVEFfQ0hBSU5fSEFORExFXSAmJiBuYW1lKSB7CiAJCQlzdHJ1Y3QgbmZ0X2NoYWluICpjaGFpbjI7CiAKQEAgLTEzMjAsMTAyICsxNDI2LDUzIEBACiAJCXJldHVybiAtRU9WRVJGTE9XOwogCiAJaWYgKG5sYVtORlRBX0NIQUlOX0hPT0tdKSB7Ci0JCWNvbnN0IHN0cnVjdCBuZl9jaGFpbl90eXBlICp0eXBlOworCQlzdHJ1Y3QgbmZ0X2NoYWluX2hvb2sgaG9vazsKIAkJc3RydWN0IG5mX2hvb2tfb3BzICpvcHM7CiAJCW5mX2hvb2tmbiAqaG9va2ZuOwotCQl1MzIgaG9va251bSwgcHJpb3JpdHk7CiAKLQkJdHlwZSA9IGNoYWluX3R5cGVbZmFtaWx5XVtORlRfQ0hBSU5fVF9ERUZBVUxUXTsKLQkJaWYgKG5sYVtORlRBX0NIQUlOX1RZUEVdKSB7Ci0JCQl0eXBlID0gbmZfdGFibGVzX2NoYWluX3R5cGVfbG9va3VwKGFmaSwKLQkJCQkJCQkgICBubGFbTkZUQV9DSEFJTl9UWVBFXSwKLQkJCQkJCQkgICBjcmVhdGUpOwotCQkJaWYgKElTX0VSUih0eXBlKSkKLQkJCQlyZXR1cm4gUFRSX0VSUih0eXBlKTsKLQkJfQotCi0JCWVyciA9IG5sYV9wYXJzZV9uZXN0ZWQoaGEsIE5GVEFfSE9PS19NQVgsIG5sYVtORlRBX0NIQUlOX0hPT0tdLAotCQkJCSAgICAgICBuZnRfaG9va19wb2xpY3kpOworCQllcnIgPSBuZnRfY2hhaW5fcGFyc2VfaG9vayhuZXQsIG5sYSwgYWZpLCAmaG9vaywgY3JlYXRlKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwotCQlpZiAoaGFbTkZUQV9IT09LX0hPT0tOVU1dID09IE5VTEwgfHwKLQkJICAgIGhhW05GVEFfSE9PS19QUklPUklUWV0gPT0gTlVMTCkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWhvb2tudW0gPSBudG9obChubGFfZ2V0X2JlMzIoaGFbTkZUQV9IT09LX0hPT0tOVU1dKSk7Ci0JCWlmIChob29rbnVtID49IGFmaS0+bmhvb2tzKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXByaW9yaXR5ID0gbnRvaGwobmxhX2dldF9iZTMyKGhhW05GVEFfSE9PS19QUklPUklUWV0pKTsKLQotCQlpZiAoISh0eXBlLT5ob29rX21hc2sgJiAoMSA8PCBob29rbnVtKSkpCi0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCWlmICghdHJ5X21vZHVsZV9nZXQodHlwZS0+b3duZXIpKQotCQkJcmV0dXJuIC1FTk9FTlQ7Ci0JCWhvb2tmbiA9IHR5cGUtPmhvb2tzW2hvb2tudW1dOwotCi0JCWlmIChhZmktPmZsYWdzICYgTkZUX0FGX05FRURTX0RFVikgewotCQkJY2hhciBpZm5hbWVbSUZOQU1TSVpdOwotCi0JCQlpZiAoIWhhW05GVEFfSE9PS19ERVZdKSB7Ci0JCQkJbW9kdWxlX3B1dCh0eXBlLT5vd25lcik7Ci0JCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCQkJfQotCi0JCQlubGFfc3RybGNweShpZm5hbWUsIGhhW05GVEFfSE9PS19ERVZdLCBJRk5BTVNJWik7Ci0JCQlkZXYgPSBkZXZfZ2V0X2J5X25hbWUobmV0LCBpZm5hbWUpOwotCQkJaWYgKCFkZXYpIHsKLQkJCQltb2R1bGVfcHV0KHR5cGUtPm93bmVyKTsKLQkJCQlyZXR1cm4gLUVOT0VOVDsKLQkJCX0KLQkJfSBlbHNlIGlmIChoYVtORlRBX0hPT0tfREVWXSkgewotCQkJbW9kdWxlX3B1dCh0eXBlLT5vd25lcik7Ci0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCX0KIAogCQliYXNlY2hhaW4gPSBremFsbG9jKHNpemVvZigqYmFzZWNoYWluKSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChiYXNlY2hhaW4gPT0gTlVMTCkgewotCQkJbW9kdWxlX3B1dCh0eXBlLT5vd25lcik7Ci0JCQlpZiAoZGV2ICE9IE5VTEwpCi0JCQkJZGV2X3B1dChkZXYpOworCQkJbmZ0X2NoYWluX3JlbGVhc2VfaG9vaygmaG9vayk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCi0JCWlmIChkZXYgIT0gTlVMTCkKLQkJCXN0cm5jcHkoYmFzZWNoYWluLT5kZXZfbmFtZSwgZGV2LT5uYW1lLCBJRk5BTVNJWik7CisJCWlmIChob29rLmRldiAhPSBOVUxMKQorCQkJc3RybmNweShiYXNlY2hhaW4tPmRldl9uYW1lLCBob29rLmRldi0+bmFtZSwgSUZOQU1TSVopOwogCiAJCWlmIChubGFbTkZUQV9DSEFJTl9DT1VOVEVSU10pIHsKIAkJCXN0YXRzID0gbmZ0X3N0YXRzX2FsbG9jKG5sYVtORlRBX0NIQUlOX0NPVU5URVJTXSk7CiAJCQlpZiAoSVNfRVJSKHN0YXRzKSkgewotCQkJCW1vZHVsZV9wdXQodHlwZS0+b3duZXIpOworCQkJCW5mdF9jaGFpbl9yZWxlYXNlX2hvb2soJmhvb2spOwogCQkJCWtmcmVlKGJhc2VjaGFpbik7Ci0JCQkJaWYgKGRldiAhPSBOVUxMKQotCQkJCQlkZXZfcHV0KGRldik7CiAJCQkJcmV0dXJuIFBUUl9FUlIoc3RhdHMpOwogCQkJfQogCQkJYmFzZWNoYWluLT5zdGF0cyA9IHN0YXRzOwogCQl9IGVsc2UgewogCQkJc3RhdHMgPSBuZXRkZXZfYWxsb2NfcGNwdV9zdGF0cyhzdHJ1Y3QgbmZ0X3N0YXRzKTsKIAkJCWlmIChzdGF0cyA9PSBOVUxMKSB7Ci0JCQkJbW9kdWxlX3B1dCh0eXBlLT5vd25lcik7CisJCQkJbmZ0X2NoYWluX3JlbGVhc2VfaG9vaygmaG9vayk7CiAJCQkJa2ZyZWUoYmFzZWNoYWluKTsKLQkJCQlpZiAoZGV2ICE9IE5VTEwpCi0JCQkJCWRldl9wdXQoZGV2KTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCXJjdV9hc3NpZ25fcG9pbnRlcihiYXNlY2hhaW4tPnN0YXRzLCBzdGF0cyk7CiAJCX0KIAotCQliYXNlY2hhaW4tPnR5cGUgPSB0eXBlOworCQlob29rZm4gPSBob29rLnR5cGUtPmhvb2tzW2hvb2subnVtXTsKKwkJYmFzZWNoYWluLT50eXBlID0gaG9vay50eXBlOwogCQljaGFpbiA9ICZiYXNlY2hhaW4tPmNoYWluOwogCiAJCWZvciAoaSA9IDA7IGkgPCBhZmktPm5vcHM7IGkrKykgewogCQkJb3BzID0gJmJhc2VjaGFpbi0+b3BzW2ldOwogCQkJb3BzLT5wZgkJPSBmYW1pbHk7Ci0JCQlvcHMtPmhvb2tudW0JPSBob29rbnVtOwotCQkJb3BzLT5wcmlvcml0eQk9IHByaW9yaXR5OworCQkJb3BzLT5ob29rbnVtCT0gaG9vay5udW07CisJCQlvcHMtPnByaW9yaXR5CT0gaG9vay5wcmlvcml0eTsKIAkJCW9wcy0+cHJpdgk9IGNoYWluOwogCQkJb3BzLT5ob29rCT0gYWZpLT5ob29rc1tvcHMtPmhvb2tudW1dOwotCQkJb3BzLT5kZXYJPSBkZXY7CisJCQlvcHMtPmRldgk9IGhvb2suZGV2OwogCQkJaWYgKGhvb2tmbikKIAkJCQlvcHMtPmhvb2sgPSBob29rZm47CiAJCQlpZiAoYWZpLT5ob29rX29wc19pbml0KQpAQCAtMzQyNiwxMiArMzQ4MywxMiBAQAogfQogCiBzdGF0aWMgaW50IG5mdF9hZGRfc2V0X2VsZW0oc3RydWN0IG5mdF9jdHggKmN0eCwgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyKQorCQkJICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHIsIHUzMiBubG1zZ19mbGFncykKIHsKIAlzdHJ1Y3QgbmxhdHRyICpubGFbTkZUQV9TRVRfRUxFTV9NQVggKyAxXTsKIAlzdHJ1Y3QgbmZ0X2RhdGFfZGVzYyBkMSwgZDI7CiAJc3RydWN0IG5mdF9zZXRfZXh0X3RtcGwgdG1wbDsKLQlzdHJ1Y3QgbmZ0X3NldF9leHQgKmV4dDsKKwlzdHJ1Y3QgbmZ0X3NldF9leHQgKmV4dCwgKmV4dDI7CiAJc3RydWN0IG5mdF9zZXRfZWxlbSBlbGVtOwogCXN0cnVjdCBuZnRfc2V0X2JpbmRpbmcgKmJpbmRpbmc7CiAJc3RydWN0IG5mdF91c2VyZGF0YSAqdWRhdGE7CkBAIC0zNTU4LDkgKzM2MTUsMTkgQEAKIAkJZ290byBlcnI0OwogCiAJZXh0LT5nZW5tYXNrID0gbmZ0X2dlbm1hc2tfY3VyKGN0eC0+bmV0KSB8IE5GVF9TRVRfRUxFTV9CVVNZX01BU0s7Ci0JZXJyID0gc2V0LT5vcHMtPmluc2VydChjdHgtPm5ldCwgc2V0LCAmZWxlbSk7Ci0JaWYgKGVyciA8IDApCisJZXJyID0gc2V0LT5vcHMtPmluc2VydChjdHgtPm5ldCwgc2V0LCAmZWxlbSwgJmV4dDIpOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSAtRUVYSVNUKSB7CisJCQlpZiAobmZ0X3NldF9leHRfZXhpc3RzKGV4dCwgTkZUX1NFVF9FWFRfREFUQSkgJiYKKwkJCSAgICBuZnRfc2V0X2V4dF9leGlzdHMoZXh0MiwgTkZUX1NFVF9FWFRfREFUQSkgJiYKKwkJCSAgICBtZW1jbXAobmZ0X3NldF9leHRfZGF0YShleHQpLAorCQkJCSAgIG5mdF9zZXRfZXh0X2RhdGEoZXh0MiksIHNldC0+ZGxlbikgIT0gMCkKKwkJCQllcnIgPSAtRUJVU1k7CisJCQllbHNlIGlmICghKG5sbXNnX2ZsYWdzICYgTkxNX0ZfRVhDTCkpCisJCQkJZXJyID0gMDsKKwkJfQogCQlnb3RvIGVycjU7CisJfQogCiAJbmZ0X3RyYW5zX2VsZW0odHJhbnMpID0gZWxlbTsKIAlsaXN0X2FkZF90YWlsKCZ0cmFucy0+bGlzdCwgJmN0eC0+bmV0LT5uZnQuY29tbWl0X2xpc3QpOwpAQCAtMzYxNiw3ICszNjgzLDcgQEAKIAkJICAgICFhdG9taWNfYWRkX3VubGVzcygmc2V0LT5uZWxlbXMsIDEsIHNldC0+c2l6ZSArIHNldC0+bmRlYWN0KSkKIAkJCXJldHVybiAtRU5GSUxFOwogCi0JCWVyciA9IG5mdF9hZGRfc2V0X2VsZW0oJmN0eCwgc2V0LCBhdHRyKTsKKwkJZXJyID0gbmZ0X2FkZF9zZXRfZWxlbSgmY3R4LCBzZXQsIGF0dHIsIG5saC0+bmxtc2dfZmxhZ3MpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJYXRvbWljX2RlYygmc2V0LT5uZWxlbXMpOwogCQkJYnJlYWs7CkBAIC00MzQzLDYgKzQ0MTAsMzEgQEAKIH0KIAogLyoqCisgKgluZnRfcGFyc2VfdTMyX2NoZWNrIC0gZmV0Y2ggdTMyIGF0dHJpYnV0ZSBhbmQgY2hlY2sgZm9yIG1heGltdW0gdmFsdWUKKyAqCisgKglAYXR0cjogbmV0bGluayBhdHRyaWJ1dGUgdG8gZmV0Y2ggdmFsdWUgZnJvbQorICoJQG1heDogbWF4aW11bSB2YWx1ZSB0byBiZSBzdG9yZWQgaW4gZGVzdAorICoJQGRlc3Q6IHBvaW50ZXIgdG8gdGhlIHZhcmlhYmxlCisgKgorICoJUGFyc2UsIGNoZWNrIGFuZCBzdG9yZSBhIGdpdmVuIHUzMiBuZXRsaW5rIGF0dHJpYnV0ZSBpbnRvIHZhcmlhYmxlLgorICoJVGhpcyBmdW5jdGlvbiByZXR1cm5zIC1FUkFOR0UgaWYgdGhlIHZhbHVlIGdvZXMgb3ZlciBtYXhpbXVtIHZhbHVlLgorICoJT3RoZXJ3aXNlIGEgMCBpcyByZXR1cm5lZCBhbmQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlCisgKglkZXN0aW5hdGlvbiB2YXJpYWJsZS4KKyAqLwordW5zaWduZWQgaW50IG5mdF9wYXJzZV91MzJfY2hlY2soY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0ciwgaW50IG1heCwgdTMyICpkZXN0KQoreworCWludCB2YWw7CisKKwl2YWwgPSBudG9obChubGFfZ2V0X2JlMzIoYXR0cikpOworCWlmICh2YWwgPiBtYXgpCisJCXJldHVybiAtRVJBTkdFOworCisJKmRlc3QgPSB2YWw7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZnRfcGFyc2VfdTMyX2NoZWNrKTsKKworLyoqCiAgKgluZnRfcGFyc2VfcmVnaXN0ZXIgLSBwYXJzZSBhIHJlZ2lzdGVyIHZhbHVlIGZyb20gYSBuZXRsaW5rIGF0dHJpYnV0ZQogICoKICAqCUBhdHRyOiBuZXRsaW5rIGF0dHJpYnV0ZQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5jIGIvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5jCmluZGV4IGZiOGI1ODkuLjBkZDVjNjkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19jb3JlLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAkudSA9IHsKIAkJLmxvZyA9IHsKIAkJCS5sZXZlbCA9IExPR0xFVkVMX1dBUk5JTkcsCi0JCQkubG9nZmxhZ3MgPSBORl9MT0dfTUFTSywKKwkJCS5sb2dmbGFncyA9IE5GX0xPR19ERUZBVUxUX01BU0ssCiAJICAgICAgICB9LAogCX0sCiB9OwpAQCAtOTMsMTIgKzkzLDE1IEBACiAKIAlpZiAocHJpdi0+YmFzZSA9PSBORlRfUEFZTE9BRF9ORVRXT1JLX0hFQURFUikKIAkJcHRyID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7Ci0JZWxzZQorCWVsc2UgeworCQlpZiAoIXBrdC0+dHByb3Rfc2V0KQorCQkJcmV0dXJuIGZhbHNlOwogCQlwdHIgPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKSArIHBrdC0+eHQudGhvZmY7CisJfQogCiAJcHRyICs9IHByaXYtPm9mZnNldDsKIAotCWlmICh1bmxpa2VseShwdHIgKyBwcml2LT5sZW4gPj0gc2tiX3RhaWxfcG9pbnRlcihza2IpKSkKKwlpZiAodW5saWtlbHkocHRyICsgcHJpdi0+bGVuID4gc2tiX3RhaWxfcG9pbnRlcihza2IpKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJKmRlc3QgPSAwOwpAQCAtMjYwLDggKzI2MywxMyBAQAogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycjc7CiAKLQlyZXR1cm4gMDsKKwllcnIgPSBuZnRfcmFuZ2VfbW9kdWxlX2luaXQoKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnI4OwogCisJcmV0dXJuIDA7CitlcnI4OgorCW5mdF9keW5zZXRfbW9kdWxlX2V4aXQoKTsKIGVycjc6CiAJbmZ0X3BheWxvYWRfbW9kdWxlX2V4aXQoKTsKIGVycjY6CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19pbmV0LmMgYi9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19pbmV0LmMKaW5kZXggNmI1Zjc2Mi4uZjcxM2NjMiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfaW5ldC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2luZXQuYwpAQCAtODIsNyArODIsMTAgQEAKIHsKIAlpbnQgcmV0OwogCi0JbmZ0X3JlZ2lzdGVyX2NoYWluX3R5cGUoJmZpbHRlcl9pbmV0KTsKKwlyZXQgPSBuZnRfcmVnaXN0ZXJfY2hhaW5fdHlwZSgmZmlsdGVyX2luZXQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCiAJcmV0ID0gcmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmbmZfdGFibGVzX2luZXRfbmV0X29wcyk7CiAJaWYgKHJldCA8IDApCiAJCW5mdF91bnJlZ2lzdGVyX2NoYWluX3R5cGUoJmZpbHRlcl9pbmV0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX25ldGRldi5jIGIvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfbmV0ZGV2LmMKaW5kZXggNWVlZmU0YS4uOWUyYWU0MiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfbmV0ZGV2LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfbmV0ZGV2LmMKQEAgLTE1LDc5ICsxNSw2IEBACiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXNfaXB2NC5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjYuaD4KIAotc3RhdGljIGlubGluZSB2b2lkCi1uZnRfbmV0ZGV2X3NldF9wa3RpbmZvX2lwdjQoc3RydWN0IG5mdF9wa3RpbmZvICpwa3QsCi0JCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IGlwaGRyICppcGgsIF9pcGg7Ci0JdTMyIGxlbiwgdGhvZmY7Ci0KLQluZnRfc2V0X3BrdGluZm8ocGt0LCBza2IsIHN0YXRlKTsKLQotCWlwaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpLCBzaXplb2YoKmlwaCksCi0JCQkJICZfaXBoKTsKLQlpZiAoIWlwaCkKLQkJcmV0dXJuOwotCi0JaXBoID0gaXBfaGRyKHNrYik7Ci0JaWYgKGlwaC0+aWhsIDwgNSB8fCBpcGgtPnZlcnNpb24gIT0gNCkKLQkJcmV0dXJuOwotCi0JbGVuID0gbnRvaHMoaXBoLT50b3RfbGVuKTsKLQl0aG9mZiA9IGlwaC0+aWhsICogNDsKLQlpZiAoc2tiLT5sZW4gPCBsZW4pCi0JCXJldHVybjsKLQllbHNlIGlmIChsZW4gPCB0aG9mZikKLQkJcmV0dXJuOwotCi0JcGt0LT50cHJvdCA9IGlwaC0+cHJvdG9jb2w7Ci0JcGt0LT54dC50aG9mZiA9IHRob2ZmOwotCXBrdC0+eHQuZnJhZ29mZiA9IG50b2hzKGlwaC0+ZnJhZ19vZmYpICYgSVBfT0ZGU0VUOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9fbmZ0X25ldGRldl9zZXRfcGt0aW5mb19pcHY2KHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0LAotCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKLXsKLSNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQotCXN0cnVjdCBpcHY2aGRyICppcDZoLCBfaXA2aDsKLQl1bnNpZ25lZCBpbnQgdGhvZmYgPSAwOwotCXVuc2lnbmVkIHNob3J0IGZyYWdfb2ZmOwotCWludCBwcm90b2hkcjsKLQl1MzIgcGt0X2xlbjsKLQotCWlwNmggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSwgc2l6ZW9mKCppcDZoKSwKLQkJCQkgICZfaXA2aCk7Ci0JaWYgKCFpcDZoKQotCQlyZXR1cm47Ci0KLQlpZiAoaXA2aC0+dmVyc2lvbiAhPSA2KQotCQlyZXR1cm47Ci0KLQlwa3RfbGVuID0gbnRvaHMoaXA2aC0+cGF5bG9hZF9sZW4pOwotCWlmIChwa3RfbGVuICsgc2l6ZW9mKCppcDZoKSA+IHNrYi0+bGVuKQotCQlyZXR1cm47Ci0KLQlwcm90b2hkciA9IGlwdjZfZmluZF9oZHIocGt0LT5za2IsICZ0aG9mZiwgLTEsICZmcmFnX29mZiwgTlVMTCk7Ci0JaWYgKHByb3RvaGRyIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQlwa3QtPnRwcm90ID0gcHJvdG9oZHI7Ci0JcGt0LT54dC50aG9mZiA9IHRob2ZmOwotCXBrdC0+eHQuZnJhZ29mZiA9IGZyYWdfb2ZmOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBuZnRfbmV0ZGV2X3NldF9wa3RpbmZvX2lwdjYoc3RydWN0IG5mdF9wa3RpbmZvICpwa3QsCi0JCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQotewotCW5mdF9zZXRfcGt0aW5mbyhwa3QsIHNrYiwgc3RhdGUpOwotCV9fbmZ0X25ldGRldl9zZXRfcGt0aW5mb19pcHY2KHBrdCwgc2tiLCBzdGF0ZSk7Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBpbnQKIG5mdF9kb19jaGFpbl9uZXRkZXYodm9pZCAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKQEAgLTk2LDEzICsyMywxMyBAQAogCiAJc3dpdGNoIChza2ItPnByb3RvY29sKSB7CiAJY2FzZSBodG9ucyhFVEhfUF9JUCk6Ci0JCW5mdF9uZXRkZXZfc2V0X3BrdGluZm9faXB2NCgmcGt0LCBza2IsIHN0YXRlKTsKKwkJbmZ0X3NldF9wa3RpbmZvX2lwdjRfdmFsaWRhdGUoJnBrdCwgc2tiLCBzdGF0ZSk7CiAJCWJyZWFrOwogCWNhc2UgaHRvbnMoRVRIX1BfSVBWNik6Ci0JCW5mdF9uZXRkZXZfc2V0X3BrdGluZm9faXB2NigmcGt0LCBza2IsIHN0YXRlKTsKKwkJbmZ0X3NldF9wa3RpbmZvX2lwdjZfdmFsaWRhdGUoJnBrdCwgc2tiLCBzdGF0ZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCW5mdF9zZXRfcGt0aW5mbygmcGt0LCBza2IsIHN0YXRlKTsKKwkJbmZ0X3NldF9wa3RpbmZvX3Vuc3BlYygmcGt0LCBza2IsIHN0YXRlKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0yMjIsMTQgKzE0OSwyNSBAQAogewogCWludCByZXQ7CiAKLQluZnRfcmVnaXN0ZXJfY2hhaW5fdHlwZSgmbmZ0X2ZpbHRlcl9jaGFpbl9uZXRkZXYpOwotCXJldCA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm5mX3RhYmxlc19uZXRkZXZfbmV0X29wcyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJbmZ0X3VucmVnaXN0ZXJfY2hhaW5fdHlwZSgmbmZ0X2ZpbHRlcl9jaGFpbl9uZXRkZXYpOworCXJldCA9IG5mdF9yZWdpc3Rlcl9jaGFpbl90eXBlKCZuZnRfZmlsdGVyX2NoYWluX25ldGRldik7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQl9Ci0JcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZuZl90YWJsZXNfbmV0ZGV2X25vdGlmaWVyKTsKKworCXJldCA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm5mX3RhYmxlc19uZXRkZXZfbmV0X29wcyk7CisJaWYgKHJldCkKKwkJZ290byBlcnIxOworCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZuZl90YWJsZXNfbmV0ZGV2X25vdGlmaWVyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjI7CisKIAlyZXR1cm4gMDsKKworZXJyMjoKKwl1bnJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm5mX3RhYmxlc19uZXRkZXZfbmV0X29wcyk7CitlcnIxOgorCW5mdF91bnJlZ2lzdGVyX2NoYWluX3R5cGUoJm5mdF9maWx0ZXJfY2hhaW5fbmV0ZGV2KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbmZfdGFibGVzX25ldGRldl9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc190cmFjZS5jIGIvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfdHJhY2UuYwppbmRleCAzOWViMWNjLi5hYjY5NWY4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc190cmFjZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX3RyYWNlLmMKQEAgLTExMywyMCArMTEzLDIyIEBACiAJCQkJICBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKIHsKIAljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcGt0LT5za2I7Ci0JdW5zaWduZWQgaW50IGxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKLQkJCQkgcGt0LT54dC50aG9mZiAtIHNrYl9uZXR3b3JrX29mZnNldChza2IpLAotCQkJCSBORlRfVFJBQ0VUWVBFX05FVFdPUktfSFNJWkUpOwogCWludCBvZmYgPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKKwl1bnNpZ25lZCBpbnQgbGVuLCBuaF9lbmQ7CiAKKwluaF9lbmQgPSBwa3QtPnRwcm90X3NldCA/IHBrdC0+eHQudGhvZmYgOiBza2ItPmxlbjsKKwlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIG5oX2VuZCAtIHNrYl9uZXR3b3JrX29mZnNldChza2IpLAorCQkgICAgTkZUX1RSQUNFVFlQRV9ORVRXT1JLX0hTSVpFKTsKIAlpZiAodHJhY2VfZmlsbF9oZWFkZXIobmxza2IsIE5GVEFfVFJBQ0VfTkVUV09SS19IRUFERVIsIHNrYiwgb2ZmLCBsZW4pKQogCQlyZXR1cm4gLTE7CiAKLQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHNrYi0+bGVuIC0gcGt0LT54dC50aG9mZiwKLQkJICAgIE5GVF9UUkFDRVRZUEVfVFJBTlNQT1JUX0hTSVpFKTsKLQotCWlmICh0cmFjZV9maWxsX2hlYWRlcihubHNrYiwgTkZUQV9UUkFDRV9UUkFOU1BPUlRfSEVBREVSLCBza2IsCi0JCQkgICAgICBwa3QtPnh0LnRob2ZmLCBsZW4pKQotCQlyZXR1cm4gLTE7CisJaWYgKHBrdC0+dHByb3Rfc2V0KSB7CisJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgc2tiLT5sZW4gLSBwa3QtPnh0LnRob2ZmLAorCQkJICAgIE5GVF9UUkFDRVRZUEVfVFJBTlNQT1JUX0hTSVpFKTsKKwkJaWYgKHRyYWNlX2ZpbGxfaGVhZGVyKG5sc2tiLCBORlRBX1RSQUNFX1RSQU5TUE9SVF9IRUFERVIsIHNrYiwKKwkJCQkgICAgICBwa3QtPnh0LnRob2ZmLCBsZW4pKQorCQkJcmV0dXJuIC0xOworCX0KIAogCWlmICghc2tiX21hY19oZWFkZXJfd2FzX3NldChza2IpKQogCQlyZXR1cm4gMDsKQEAgLTIzNyw3ICsyMzksNyBAQAogCQlicmVhazsKIAljYXNlIE5GVF9UUkFDRVRZUEVfUE9MSUNZOgogCQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9UUkFDRV9QT0xJQ1ksCi0JCQkJIGluZm8tPmJhc2VjaGFpbi0+cG9saWN5KSkKKwkJCQkgaHRvbmwoaW5mby0+YmFzZWNoYWluLT5wb2xpY3kpKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19hY2N0LmMgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19hY2N0LmMKaW5kZXggMWI0ZGU0Yi4uZDQ0ZDg5YiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfYWNjdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2FjY3QuYwpAQCAtMzI2LDE0ICszMjYsMTQgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCS8qIHdlIHdhbnQgdG8gYXZvaWQgcmFjZXMgd2l0aCBuZm5sX2FjY3RfZmluZF9nZXQuICovCi0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmN1ci0+cmVmY250KSkgeworCS8qIFdlIHdhbnQgdG8gYXZvaWQgcmFjZXMgd2l0aCBuZm5sX2FjY3RfcHV0LiBTbyBvbmx5IHdoZW4gdGhlIGN1cnJlbnQKKwkgKiByZWZjbnQgaXMgMSwgd2UgZGVjcmVhc2UgaXQgdG8gMC4KKwkgKi8KKwlpZiAoYXRvbWljX2NtcHhjaGcoJmN1ci0+cmVmY250LCAxLCAwKSA9PSAxKSB7CiAJCS8qIFdlIGFyZSBwcm90ZWN0ZWQgYnkgbmZubCBtdXRleC4gKi8KIAkJbGlzdF9kZWxfcmN1KCZjdXItPmhlYWQpOwogCQlrZnJlZV9yY3UoY3VyLCByY3VfaGVhZCk7CiAJfSBlbHNlIHsKLQkJLyogc3RpbGwgaW4gdXNlLCByZXN0b3JlIHJlZmVyZW5jZSBjb3VudGVyLiAqLwotCQlhdG9taWNfaW5jKCZjdXItPnJlZmNudCk7CiAJCXJldCA9IC1FQlVTWTsKIAl9CiAJcmV0dXJuIHJldDsKQEAgLTM0MywxMiArMzQzLDEyIEBACiAJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCiAJCQkgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCiB7Ci0JY2hhciAqYWNjdF9uYW1lOwotCXN0cnVjdCBuZl9hY2N0ICpjdXI7CisJc3RydWN0IG5mX2FjY3QgKmN1ciwgKnRtcDsKIAlpbnQgcmV0ID0gLUVOT0VOVDsKKwljaGFyICphY2N0X25hbWU7CiAKIAlpZiAoIXRiW05GQUNDVF9OQU1FXSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN1ciwgJm5ldC0+bmZubF9hY2N0X2xpc3QsIGhlYWQpCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjdXIsIHRtcCwgJm5ldC0+bmZubF9hY2N0X2xpc3QsIGhlYWQpCiAJCQluZm5sX2FjY3RfdHJ5X2RlbChjdXIpOwogCiAJCXJldHVybiAwOwpAQCAtNDQzLDcgKzQ0Myw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZm5sX2FjY3RfdXBkYXRlKTsKIAotc3RhdGljIHZvaWQgbmZubF9vdmVycXVvdGFfcmVwb3J0KHN0cnVjdCBuZl9hY2N0ICpuZmFjY3QpCitzdGF0aWMgdm9pZCBuZm5sX292ZXJxdW90YV9yZXBvcnQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmZfYWNjdCAqbmZhY2N0KQogewogCWludCByZXQ7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTQ1OCwxMSArNDU4LDEyIEBACiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm47CiAJfQotCW5ldGxpbmtfYnJvYWRjYXN0KGluaXRfbmV0Lm5mbmwsIHNrYiwgMCwgTkZOTEdSUF9BQ0NUX1FVT1RBLAorCW5ldGxpbmtfYnJvYWRjYXN0KG5ldC0+bmZubCwgc2tiLCAwLCBORk5MR1JQX0FDQ1RfUVVPVEEsCiAJCQkgIEdGUF9BVE9NSUMpOwogfQogCi1pbnQgbmZubF9hY2N0X292ZXJxdW90YShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmZfYWNjdCAqbmZhY2N0KQoraW50IG5mbmxfYWNjdF9vdmVycXVvdGEoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IG5mX2FjY3QgKm5mYWNjdCkKIHsKIAl1NjQgbm93OwogCXU2NCAqcXVvdGE7CkBAIC00ODAsNyArNDgxLDcgQEAKIAogCWlmIChub3cgPj0gKnF1b3RhICYmCiAJICAgICF0ZXN0X2FuZF9zZXRfYml0KE5GQUNDVF9PVkVSUVVPVEFfQklULCAmbmZhY2N0LT5mbGFncykpIHsKLQkJbmZubF9vdmVycXVvdGFfcmVwb3J0KG5mYWNjdCk7CisJCW5mbmxfb3ZlcnF1b3RhX3JlcG9ydChuZXQsIG5mYWNjdCk7CiAJfQogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2N0aGVscGVyLmMgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19jdGhlbHBlci5jCmluZGV4IGU5MjRlOTUuLjNiNzlmMzQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2N0aGVscGVyLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfY3RoZWxwZXIuYwpAQCAtNDMsNyArNDMsNyBAQAogCWlmIChoZWxwID09IE5VTEwpCiAJCXJldHVybiBORl9EUk9QOwogCi0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCisJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggKi8KIAloZWxwZXIgPSByY3VfZGVyZWZlcmVuY2UoaGVscC0+aGVscGVyKTsKIAlpZiAoaGVscGVyID09IE5VTEwpCiAJCXJldHVybiBORl9EUk9QOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfY3R0aW1lb3V0LmMgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19jdHRpbWVvdXQuYwppbmRleCA0Y2RjZDk2Li4xMzllMDg2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19jdHRpbWVvdXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19jdHRpbWVvdXQuYwpAQCAtOTgsMzEgKzk4LDI4IEBACiAJCWJyZWFrOwogCX0KIAotCWw0cHJvdG8gPSBuZl9jdF9sNHByb3RvX2ZpbmRfZ2V0KGwzbnVtLCBsNG51bSk7Ci0KLQkvKiBUaGlzIHByb3RvY29sIGlzIG5vdCBzdXBwb3J0dGVkLCBza2lwLiAqLwotCWlmIChsNHByb3RvLT5sNHByb3RvICE9IGw0bnVtKSB7Ci0JCXJldCA9IC1FT1BOT1RTVVBQOwotCQlnb3RvIGVycl9wcm90b19wdXQ7Ci0JfQotCiAJaWYgKG1hdGNoaW5nKSB7CiAJCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfUkVQTEFDRSkgewogCQkJLyogWW91IGNhbm5vdCByZXBsYWNlIG9uZSB0aW1lb3V0IHBvbGljeSBieSBhbm90aGVyIG9mCiAJCQkgKiBkaWZmZXJlbnQga2luZCwgc29ycnkuCiAJCQkgKi8KIAkJCWlmIChtYXRjaGluZy0+bDNudW0gIT0gbDNudW0gfHwKLQkJCSAgICBtYXRjaGluZy0+bDRwcm90by0+bDRwcm90byAhPSBsNG51bSkgewotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJZ290byBlcnJfcHJvdG9fcHV0OwotCQkJfQorCQkJICAgIG1hdGNoaW5nLT5sNHByb3RvLT5sNHByb3RvICE9IGw0bnVtKQorCQkJCXJldHVybiAtRUlOVkFMOwogCi0JCQlyZXQgPSBjdG5sX3RpbWVvdXRfcGFyc2VfcG9saWN5KCZtYXRjaGluZy0+ZGF0YSwKLQkJCQkJCQlsNHByb3RvLCBuZXQsCi0JCQkJCQkJY2RhW0NUQV9USU1FT1VUX0RBVEFdKTsKLQkJCXJldHVybiByZXQ7CisJCQlyZXR1cm4gY3RubF90aW1lb3V0X3BhcnNlX3BvbGljeSgmbWF0Y2hpbmctPmRhdGEsCisJCQkJCQkJIG1hdGNoaW5nLT5sNHByb3RvLCBuZXQsCisJCQkJCQkJIGNkYVtDVEFfVElNRU9VVF9EQVRBXSk7CiAJCX0KLQkJcmV0ID0gLUVCVVNZOworCisJCXJldHVybiAtRUJVU1k7CisJfQorCisJbDRwcm90byA9IG5mX2N0X2w0cHJvdG9fZmluZF9nZXQobDNudW0sIGw0bnVtKTsKKworCS8qIFRoaXMgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnR0ZWQsIHNraXAuICovCisJaWYgKGw0cHJvdG8tPmw0cHJvdG8gIT0gbDRudW0pIHsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CiAJCWdvdG8gZXJyX3Byb3RvX3B1dDsKIAl9CiAKQEAgLTMwNSw3ICszMDIsMTYgQEAKIAljb25zdCBzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbm47CiAJdW5zaWduZWQgaW50IGxhc3RfaHNpemU7CiAJc3BpbmxvY2tfdCAqbG9jazsKLQlpbnQgaTsKKwlpbnQgaSwgY3B1OworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlzdHJ1Y3QgY3RfcGNwdSAqcGNwdSA9IHBlcl9jcHVfcHRyKG5ldC0+Y3QucGNwdV9saXN0cywgY3B1KTsKKworCQlzcGluX2xvY2tfYmgoJnBjcHUtPmxvY2spOworCQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeShoLCBubiwgJnBjcHUtPnVuY29uZmlybWVkLCBobm5vZGUpCisJCQl1bnRpbWVvdXQoaCwgdGltZW91dCk7CisJCXNwaW5fdW5sb2NrX2JoKCZwY3B1LT5sb2NrKTsKKwl9CiAKIAlsb2NhbF9iaF9kaXNhYmxlKCk7CiByZXN0YXJ0OgpAQCAtMzMwLDE2ICszMzYsMTYgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCS8qIHdlIHdhbnQgdG8gYXZvaWQgcmFjZXMgd2l0aCBuZl9jdF90aW1lb3V0X2ZpbmRfZ2V0LiAqLwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZ0aW1lb3V0LT5yZWZjbnQpKSB7CisJLyogV2Ugd2FudCB0byBhdm9pZCByYWNlcyB3aXRoIGN0bmxfdGltZW91dF9wdXQuIFNvIG9ubHkgd2hlbiB0aGUKKwkgKiBjdXJyZW50IHJlZmNudCBpcyAxLCB3ZSBkZWNyZWFzZSBpdCB0byAwLgorCSAqLworCWlmIChhdG9taWNfY21weGNoZygmdGltZW91dC0+cmVmY250LCAxLCAwKSA9PSAxKSB7CiAJCS8qIFdlIGFyZSBwcm90ZWN0ZWQgYnkgbmZubCBtdXRleC4gKi8KIAkJbGlzdF9kZWxfcmN1KCZ0aW1lb3V0LT5oZWFkKTsKIAkJbmZfY3RfbDRwcm90b19wdXQodGltZW91dC0+bDRwcm90byk7CiAJCWN0bmxfdW50aW1lb3V0KG5ldCwgdGltZW91dCk7CiAJCWtmcmVlX3JjdSh0aW1lb3V0LCByY3VfaGVhZCk7CiAJfSBlbHNlIHsKLQkJLyogc3RpbGwgaW4gdXNlLCByZXN0b3JlIHJlZmVyZW5jZSBjb3VudGVyLiAqLwotCQlhdG9taWNfaW5jKCZ0aW1lb3V0LT5yZWZjbnQpOwogCQlyZXQgPSAtRUJVU1k7CiAJfQogCXJldHVybiByZXQ7CkBAIC0zNTAsMTIgKzM1NiwxMyBAQAogCQkJCSBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKIAkJCQkgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IGNkYVtdKQogewotCXN0cnVjdCBjdG5sX3RpbWVvdXQgKmN1cjsKKwlzdHJ1Y3QgY3RubF90aW1lb3V0ICpjdXIsICp0bXA7CiAJaW50IHJldCA9IC1FTk9FTlQ7CiAJY2hhciAqbmFtZTsKIAogCWlmICghY2RhW0NUQV9USU1FT1VUX05BTUVdKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyLCAmbmV0LT5uZmN0X3RpbWVvdXRfbGlzdCwgaGVhZCkKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGN1ciwgdG1wLCAmbmV0LT5uZmN0X3RpbWVvdXRfbGlzdCwKKwkJCQkJIGhlYWQpCiAJCQljdG5sX3RpbWVvdXRfdHJ5X2RlbChuZXQsIGN1cik7CiAKIAkJcmV0dXJuIDA7CkBAIC01NDMsNyArNTUwLDkgQEAKIAogc3RhdGljIHZvaWQgY3RubF90aW1lb3V0X3B1dChzdHJ1Y3QgY3RubF90aW1lb3V0ICp0aW1lb3V0KQogewotCWF0b21pY19kZWMoJnRpbWVvdXQtPnJlZmNudCk7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnRpbWVvdXQtPnJlZmNudCkpCisJCWtmcmVlX3JjdSh0aW1lb3V0LCByY3VfaGVhZCk7CisKIAltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX1RJTUVPVVQgKi8KQEAgLTU5MSw3ICs2MDAsOSBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjdXIsIHRtcCwgJm5ldC0+bmZjdF90aW1lb3V0X2xpc3QsIGhlYWQpIHsKIAkJbGlzdF9kZWxfcmN1KCZjdXItPmhlYWQpOwogCQluZl9jdF9sNHByb3RvX3B1dChjdXItPmw0cHJvdG8pOwotCQlrZnJlZV9yY3UoY3VyLCByY3VfaGVhZCk7CisKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmN1ci0+cmVmY250KSkKKwkJCWtmcmVlX3JjdShjdXIsIHJjdV9oZWFkKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5jIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMKaW5kZXggY2JjZmRmYi4uZWIwODZhMSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMKQEAgLTQ0Miw3ICs0NDIsOSBAQAogCQkJaWYgKG5sYV9wdXRfYmUzMihpbnN0LT5za2IsIE5GVUxBX0lGSU5ERVhfUEhZU0lOREVWLAogCQkJCQkgaHRvbmwoaW5kZXYtPmlmaW5kZXgpKSB8fAogCQkJLyogdGhpcyBpcyB0aGUgYnJpZGdlIGdyb3VwICJiclgiICovCi0JCQkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3Nsb3cgb3IgbmZfbG9nX3BhY2tldCAqLworCQkJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggb3IKKwkJCSAqIG5mX2xvZ19wYWNrZXQuCisJCQkgKi8KIAkJCSAgICBubGFfcHV0X2JlMzIoaW5zdC0+c2tiLCBORlVMQV9JRklOREVYX0lOREVWLAogCQkJCQkgaHRvbmwoYnJfcG9ydF9nZXRfcmN1KGluZGV2KS0+YnItPmRldi0+aWZpbmRleCkpKQogCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwpAQCAtNDc3LDcgKzQ3OSw5IEBACiAJCQlpZiAobmxhX3B1dF9iZTMyKGluc3QtPnNrYiwgTkZVTEFfSUZJTkRFWF9QSFlTT1VUREVWLAogCQkJCQkgaHRvbmwob3V0ZGV2LT5pZmluZGV4KSkgfHwKIAkJCS8qIHRoaXMgaXMgdGhlIGJyaWRnZSBncm91cCAiYnJYIiAqLwotCQkJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93IG9yIG5mX2xvZ19wYWNrZXQgKi8KKwkJCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfdGhyZXNoIG9yCisJCQkgKiBuZl9sb2dfcGFja2V0LgorCQkJICovCiAJCQkgICAgbmxhX3B1dF9iZTMyKGluc3QtPnNrYiwgTkZVTEFfSUZJTkRFWF9PVVRERVYsCiAJCQkJCSBodG9ubChicl9wb3J0X2dldF9yY3Uob3V0ZGV2KS0+YnItPmRldi0+aWZpbmRleCkpKQogCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwpAQCAtMTE0Nyw2ICsxMTUxLDcgQEAKIE1PRFVMRV9BTElBU19ORl9MT0dHRVIoQUZfSU5FVCwgMSk7CiBNT0RVTEVfQUxJQVNfTkZfTE9HR0VSKEFGX0lORVQ2LCAxKTsKIE1PRFVMRV9BTElBU19ORl9MT0dHRVIoQUZfQlJJREdFLCAxKTsKK01PRFVMRV9BTElBU19ORl9MT0dHRVIoMywgMSk7IC8qIE5GUFJPVE9fQVJQICovCiAKIG1vZHVsZV9pbml0KG5mbmV0bGlua19sb2dfaW5pdCk7CiBtb2R1bGVfZXhpdChuZm5ldGxpbmtfbG9nX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmMKaW5kZXggNWQzNmEwOS4uYWY4MzJjNSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jCkBAIC03NDAsNyArNzQwLDcgQEAKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBlbnRyeS0+c3RhdGUubmV0OwogCXN0cnVjdCBuZm5sX3F1ZXVlX25ldCAqcSA9IG5mbmxfcXVldWVfcGVybmV0KG5ldCk7CiAKLQkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3Nsb3coKSAqLworCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfdGhyZXNoICovCiAJcXVldWUgPSBpbnN0YW5jZV9sb29rdXAocSwgcXVldWVudW0pOwogCWlmICghcXVldWUpCiAJCXJldHVybiAtRVNSQ0g7CkBAIC05MTcsMTIgKzkxNywxNCBAQAogCS5ub3RpZmllcl9jYWxsCT0gbmZxbmxfcmN2X2Rldl9ldmVudCwKIH07CiAKLXN0YXRpYyBpbnQgbmZfaG9va19jbXAoc3RydWN0IG5mX3F1ZXVlX2VudHJ5ICplbnRyeSwgdW5zaWduZWQgbG9uZyBvcHNfcHRyKQorc3RhdGljIGludCBuZl9ob29rX2NtcChzdHJ1Y3QgbmZfcXVldWVfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCBsb25nIGVudHJ5X3B0cikKIHsKLQlyZXR1cm4gZW50cnktPmVsZW0gPT0gKHN0cnVjdCBuZl9ob29rX29wcyAqKW9wc19wdHI7CisJcmV0dXJuIHJjdV9hY2Nlc3NfcG9pbnRlcihlbnRyeS0+c3RhdGUuaG9va19lbnRyaWVzKSA9PQorCQkoc3RydWN0IG5mX2hvb2tfZW50cnkgKillbnRyeV9wdHI7CiB9CiAKLXN0YXRpYyB2b2lkIG5mcW5sX25mX2hvb2tfZHJvcChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZl9ob29rX29wcyAqaG9vaykKK3N0YXRpYyB2b2lkIG5mcW5sX25mX2hvb2tfZHJvcChzdHJ1Y3QgbmV0ICpuZXQsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfZW50cnkgKmhvb2spCiB7CiAJc3RydWN0IG5mbmxfcXVldWVfbmV0ICpxID0gbmZubF9xdWV1ZV9wZXJuZXQobmV0KTsKIAlpbnQgaTsKQEAgLTExNDUsMTAgKzExNDcsOCBAQAogCXN0cnVjdCBuZm5sX3F1ZXVlX25ldCAqcSA9IG5mbmxfcXVldWVfcGVybmV0KG5ldCk7CiAJaW50IGVycjsKIAotCXF1ZXVlID0gaW5zdGFuY2VfbG9va3VwKHEsIHF1ZXVlX251bSk7Ci0JaWYgKCFxdWV1ZSkKLQkJcXVldWUgPSB2ZXJkaWN0X2luc3RhbmNlX2xvb2t1cChxLCBxdWV1ZV9udW0sCi0JCQkJCQlORVRMSU5LX0NCKHNrYikucG9ydGlkKTsKKwlxdWV1ZSA9IHZlcmRpY3RfaW5zdGFuY2VfbG9va3VwKHEsIHF1ZXVlX251bSwKKwkJCQkJTkVUTElOS19DQihza2IpLnBvcnRpZCk7CiAJaWYgKElTX0VSUihxdWV1ZSkpCiAJCXJldHVybiBQVFJfRVJSKHF1ZXVlKTsKIApAQCAtMTUyNCw5ICsxNTI0LDE2IEBACiAJCWdvdG8gY2xlYW51cF9uZXRsaW5rX25vdGlmaWVyOwogCX0KIAotCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbmZxbmxfZGV2X25vdGlmaWVyKTsKKwlzdGF0dXMgPSByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJm5mcW5sX2Rldl9ub3RpZmllcik7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcHJfZXJyKCJuZl9xdWV1ZTogZmFpbGVkIHRvIHJlZ2lzdGVyIG5ldGRldmljZSBub3RpZmllclxuIik7CisJCWdvdG8gY2xlYW51cF9uZXRsaW5rX3N1YnN5czsKKwl9CisKIAlyZXR1cm4gc3RhdHVzOwogCitjbGVhbnVwX25ldGxpbmtfc3Vic3lzOgorCW5mbmV0bGlua19zdWJzeXNfdW5yZWdpc3RlcigmbmZxbmxfc3Vic3lzKTsKIGNsZWFudXBfbmV0bGlua19ub3RpZmllcjoKIAluZXRsaW5rX3VucmVnaXN0ZXJfbm90aWZpZXIoJm5mcW5sX3J0bmxfbm90aWZpZXIpOwogCXVucmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmbmZubF9xdWV1ZV9uZXRfb3BzKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2JpdHdpc2UuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2JpdHdpc2UuYwppbmRleCBkNzFjYzE4Li4zMWMxNWVkIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9iaXR3aXNlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfYml0d2lzZS5jCkBAIC01Miw2ICs1Miw3IEBACiB7CiAJc3RydWN0IG5mdF9iaXR3aXNlICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKIAlzdHJ1Y3QgbmZ0X2RhdGFfZGVzYyBkMSwgZDI7CisJdTMyIGxlbjsKIAlpbnQgZXJyOwogCiAJaWYgKHRiW05GVEFfQklUV0lTRV9TUkVHXSA9PSBOVUxMIHx8CkBAIC02MSw3ICs2MiwxMiBAQAogCSAgICB0YltORlRBX0JJVFdJU0VfWE9SXSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXByaXYtPmxlbiAgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9CSVRXSVNFX0xFTl0pKTsKKwllcnIgPSBuZnRfcGFyc2VfdTMyX2NoZWNrKHRiW05GVEFfQklUV0lTRV9MRU5dLCBVOF9NQVgsICZsZW4pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcHJpdi0+bGVuID0gbGVuOworCiAJcHJpdi0+c3JlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX0JJVFdJU0VfU1JFR10pOwogCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKHByaXYtPnNyZWcsIHByaXYtPmxlbik7CiAJaWYgKGVyciA8IDApCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9ieXRlb3JkZXIuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2J5dGVvcmRlci5jCmluZGV4IGI3OGMyOGIuLmVlNjNkOTggMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X2J5dGVvcmRlci5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2J5dGVvcmRlci5jCkBAIC05OSw2ICs5OSw3IEBACiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKIHsKIAlzdHJ1Y3QgbmZ0X2J5dGVvcmRlciAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJdTMyIHNpemUsIGxlbjsKIAlpbnQgZXJyOwogCiAJaWYgKHRiW05GVEFfQllURU9SREVSX1NSRUddID09IE5VTEwgfHwKQEAgLTExNyw3ICsxMTgsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcHJpdi0+c2l6ZSA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0JZVEVPUkRFUl9TSVpFXSkpOworCWVyciA9IG5mdF9wYXJzZV91MzJfY2hlY2sodGJbTkZUQV9CWVRFT1JERVJfU0laRV0sIFU4X01BWCwgJnNpemUpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcHJpdi0+c2l6ZSA9IHNpemU7CisKIAlzd2l0Y2ggKHByaXYtPnNpemUpIHsKIAljYXNlIDI6CiAJY2FzZSA0OgpAQCAtMTI4LDcgKzEzNCwxMiBAQAogCX0KIAogCXByaXYtPnNyZWcgPSBuZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9CWVRFT1JERVJfU1JFR10pOwotCXByaXYtPmxlbiAgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9CWVRFT1JERVJfTEVOXSkpOworCWVyciA9IG5mdF9wYXJzZV91MzJfY2hlY2sodGJbTkZUQV9CWVRFT1JERVJfTEVOXSwgVThfTUFYLCAmbGVuKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXByaXYtPmxlbiA9IGxlbjsKKwogCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKHByaXYtPnNyZWcsIHByaXYtPmxlbik7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9jbXAuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2NtcC5jCmluZGV4IGUyNWIzNWQuLjJlNTM3MzkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X2NtcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2NtcC5jCkBAIC04NCw2ICs4NCw5IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKKwlpZiAoZGVzYy5sZW4gPiBVOF9NQVgpCisJCXJldHVybiAtRVJBTkdFOworCiAJcHJpdi0+b3AgID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfQ01QX09QXSkpOwogCXByaXYtPmxlbiA9IGRlc2MubGVuOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfY3QuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2N0LmMKaW5kZXggNTFlMTgwZi4uZDdiMGQxNzEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X2N0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfY3QuYwpAQCAtMTI4LDE1ICsxMjgsMTggQEAKIAkJbWVtY3B5KGRlc3QsICZjb3VudCwgc2l6ZW9mKGNvdW50KSk7CiAJCXJldHVybjsKIAl9CisJY2FzZSBORlRfQ1RfTDNQUk9UT0NPTDoKKwkJKmRlc3QgPSBuZl9jdF9sM251bShjdCk7CisJCXJldHVybjsKKwljYXNlIE5GVF9DVF9QUk9UT0NPTDoKKwkJKmRlc3QgPSBuZl9jdF9wcm90b251bShjdCk7CisJCXJldHVybjsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAKIAl0dXBsZSA9ICZjdC0+dHVwbGVoYXNoW3ByaXYtPmRpcl0udHVwbGU7CiAJc3dpdGNoIChwcml2LT5rZXkpIHsKLQljYXNlIE5GVF9DVF9MM1BST1RPQ09MOgotCQkqZGVzdCA9IG5mX2N0X2wzbnVtKGN0KTsKLQkJcmV0dXJuOwogCWNhc2UgTkZUX0NUX1NSQzoKIAkJbWVtY3B5KGRlc3QsIHR1cGxlLT5zcmMudTMuYWxsLAogCQkgICAgICAgbmZfY3RfbDNudW0oY3QpID09IE5GUFJPVE9fSVBWNCA/IDQgOiAxNik7CkBAIC0xNDUsOSArMTQ4LDYgQEAKIAkJbWVtY3B5KGRlc3QsIHR1cGxlLT5kc3QudTMuYWxsLAogCQkgICAgICAgbmZfY3RfbDNudW0oY3QpID09IE5GUFJPVE9fSVBWNCA/IDQgOiAxNik7CiAJCXJldHVybjsKLQljYXNlIE5GVF9DVF9QUk9UT0NPTDoKLQkJKmRlc3QgPSBuZl9jdF9wcm90b251bShjdCk7Ci0JCXJldHVybjsKIAljYXNlIE5GVF9DVF9QUk9UT19TUkM6CiAJCSpkZXN0ID0gKF9fZm9yY2UgX191MTYpdHVwbGUtPnNyYy51LmFsbDsKIAkJcmV0dXJuOwpAQCAtMjgzLDggKzI4Myw5IEBACiAKIAljYXNlIE5GVF9DVF9MM1BST1RPQ09MOgogCWNhc2UgTkZUX0NUX1BST1RPQ09MOgotCQlpZiAodGJbTkZUQV9DVF9ESVJFQ1RJT05dID09IE5VTEwpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyogRm9yIGNvbXBhdGliaWxpdHksIGRvIG5vdCByZXBvcnQgZXJyb3IgaWYgTkZUQV9DVF9ESVJFQ1RJT04KKwkJICogYXR0cmlidXRlIGlzIHNwZWNpZmllZC4KKwkJICovCiAJCWxlbiA9IHNpemVvZih1OCk7CiAJCWJyZWFrOwogCWNhc2UgTkZUX0NUX1NSQzoKQEAgLTM2Myw2ICszNjQsOCBAQAogCXN3aXRjaCAocHJpdi0+a2V5KSB7CiAjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19NQVJLCiAJY2FzZSBORlRfQ1RfTUFSSzoKKwkJaWYgKHRiW05GVEFfQ1RfRElSRUNUSU9OXSkKKwkJCXJldHVybiAtRUlOVkFMOwogCQlsZW4gPSBGSUVMRF9TSVpFT0Yoc3RydWN0IG5mX2Nvbm4sIG1hcmspOwogCQlicmVhazsKICNlbmRpZgpAQCAtNDMyLDggKzQzNSw2IEBACiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJc3dpdGNoIChwcml2LT5rZXkpIHsKLQljYXNlIE5GVF9DVF9MM1BST1RPQ09MOgotCWNhc2UgTkZUX0NUX1BST1RPQ09MOgogCWNhc2UgTkZUX0NUX1NSQzoKIAljYXNlIE5GVF9DVF9EU1Q6CiAJY2FzZSBORlRfQ1RfUFJPVE9fU1JDOgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfZHluc2V0LmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9keW5zZXQuYwppbmRleCAwYWYyNjY5Li5lM2I4M2MzIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9keW5zZXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9keW5zZXQuYwpAQCAtMjIsNiArMjIsNyBAQAogCWVudW0gbmZ0X2R5bnNldF9vcHMJCW9wOjg7CiAJZW51bSBuZnRfcmVnaXN0ZXJzCQlzcmVnX2tleTo4OwogCWVudW0gbmZ0X3JlZ2lzdGVycwkJc3JlZ19kYXRhOjg7CisJYm9vbAkJCQlpbnZlcnQ7CiAJdTY0CQkJCXRpbWVvdXQ7CiAJc3RydWN0IG5mdF9leHByCQkJKmV4cHI7CiAJc3RydWN0IG5mdF9zZXRfYmluZGluZwkJYmluZGluZzsKQEAgLTgyLDEwICs4MywxNCBAQAogCiAJCWlmIChzZXhwciAhPSBOVUxMKQogCQkJc2V4cHItPm9wcy0+ZXZhbChzZXhwciwgcmVncywgcGt0KTsKKworCQlpZiAocHJpdi0+aW52ZXJ0KQorCQkJcmVncy0+dmVyZGljdC5jb2RlID0gTkZUX0JSRUFLOwogCQlyZXR1cm47CiAJfQogb3V0OgotCXJlZ3MtPnZlcmRpY3QuY29kZSA9IE5GVF9CUkVBSzsKKwlpZiAoIXByaXYtPmludmVydCkKKwkJcmVncy0+dmVyZGljdC5jb2RlID0gTkZUX0JSRUFLOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbmZ0X2R5bnNldF9wb2xpY3lbTkZUQV9EWU5TRVRfTUFYICsgMV0gPSB7CkBAIC05Niw2ICsxMDEsNyBAQAogCVtORlRBX0RZTlNFVF9TUkVHX0RBVEFdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKIAlbTkZUQV9EWU5TRVRfVElNRU9VVF0JPSB7IC50eXBlID0gTkxBX1U2NCB9LAogCVtORlRBX0RZTlNFVF9FWFBSXQk9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCisJW05GVEFfRFlOU0VUX0ZMQUdTXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiB9OwogCiBzdGF0aWMgaW50IG5mdF9keW5zZXRfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LApAQCAtMTEzLDYgKzExOSwxNSBAQAogCSAgICB0YltORlRBX0RZTlNFVF9TUkVHX0tFWV0gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAodGJbTkZUQV9EWU5TRVRfRkxBR1NdKSB7CisJCXUzMiBmbGFncyA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0RZTlNFVF9GTEFHU10pKTsKKworCQlpZiAoZmxhZ3MgJiB+TkZUX0RZTlNFVF9GX0lOVikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZmxhZ3MgJiBORlRfRFlOU0VUX0ZfSU5WKQorCQkJcHJpdi0+aW52ZXJ0ID0gdHJ1ZTsKKwl9CisKIAlzZXQgPSBuZl90YWJsZXNfc2V0X2xvb2t1cChjdHgtPnRhYmxlLCB0YltORlRBX0RZTlNFVF9TRVRfTkFNRV0sCiAJCQkJICAgZ2VubWFzayk7CiAJaWYgKElTX0VSUihzZXQpKSB7CkBAIC0yMjAsNiArMjM1LDcgQEAKIHN0YXRpYyBpbnQgbmZ0X2R5bnNldF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwcikKIHsKIAljb25zdCBzdHJ1Y3QgbmZ0X2R5bnNldCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJdTMyIGZsYWdzID0gcHJpdi0+aW52ZXJ0ID8gTkZUX0RZTlNFVF9GX0lOViA6IDA7CiAKIAlpZiAobmZ0X2R1bXBfcmVnaXN0ZXIoc2tiLCBORlRBX0RZTlNFVF9TUkVHX0tFWSwgcHJpdi0+c3JlZ19rZXkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKQEAgLTIzNSw2ICsyNTEsOCBAQAogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlpZiAocHJpdi0+ZXhwciAmJiBuZnRfZXhwcl9kdW1wKHNrYiwgTkZUQV9EWU5TRVRfRVhQUiwgcHJpdi0+ZXhwcikpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX0RZTlNFVF9GTEFHUywgaHRvbmwoZmxhZ3MpKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJcmV0dXJuIDA7CiAKIG5sYV9wdXRfZmFpbHVyZToKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2V4dGhkci5jIGIvbmV0L25ldGZpbHRlci9uZnRfZXh0aGRyLmMKaW5kZXggYmE3YWVkMS4uYTg0Y2YzZCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfZXh0aGRyLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfZXh0aGRyLmMKQEAgLTU5LDYgKzU5LDcgQEAKIAkJCSAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQogewogCXN0cnVjdCBuZnRfZXh0aGRyICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwl1MzIgb2Zmc2V0LCBsZW4sIGVycjsKIAogCWlmICh0YltORlRBX0VYVEhEUl9EUkVHXSA9PSBOVUxMIHx8CiAJICAgIHRiW05GVEFfRVhUSERSX1RZUEVdID09IE5VTEwgfHwKQEAgLTY2LDkgKzY3LDE3IEBACiAJICAgIHRiW05GVEFfRVhUSERSX0xFTl0gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwllcnIgPSBuZnRfcGFyc2VfdTMyX2NoZWNrKHRiW05GVEFfRVhUSERSX09GRlNFVF0sIFU4X01BWCwgJm9mZnNldCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBuZnRfcGFyc2VfdTMyX2NoZWNrKHRiW05GVEFfRVhUSERSX0xFTl0sIFU4X01BWCwgJmxlbik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKIAlwcml2LT50eXBlICAgPSBubGFfZ2V0X3U4KHRiW05GVEFfRVhUSERSX1RZUEVdKTsKLQlwcml2LT5vZmZzZXQgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9FWFRIRFJfT0ZGU0VUXSkpOwotCXByaXYtPmxlbiAgICA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0VYVEhEUl9MRU5dKSk7CisJcHJpdi0+b2Zmc2V0ID0gb2Zmc2V0OworCXByaXYtPmxlbiAgICA9IGxlbjsKIAlwcml2LT5kcmVnICAgPSBuZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9FWFRIRFJfRFJFR10pOwogCiAJcmV0dXJuIG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9zdG9yZShjdHgsIHByaXYtPmRyZWcsIE5VTEwsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9oYXNoLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9oYXNoLmMKaW5kZXggNTY0ZmE3OS4uMDk0NzNiNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfaGFzaC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2hhc2guYwpAQCAtMSwzOTUgKzEsMTQ1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTQgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTGF1cmEgR2FyY2lhIDxuZXZvbGFAZ21haWwuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogRGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIGZ1bmRlZCBieSBBc3Rhcm8gQUcgKGh0dHA6Ly93d3cuYXN0YXJvLmNvbS8pCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbG9nMi5oPgotI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L3JoYXNodGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXMuaD4KLQotLyogV2UgdGFyZ2V0IGEgaGFzaCB0YWJsZSBzaXplIG9mIDQsIGVsZW1lbnQgaGludCBpcyA3NSUgb2YgZmluYWwgc2l6ZSAqLwotI2RlZmluZSBORlRfSEFTSF9FTEVNRU5UX0hJTlQgMworI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgogCiBzdHJ1Y3QgbmZ0X2hhc2ggewotCXN0cnVjdCByaGFzaHRhYmxlCQlodDsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrCQlnY193b3JrOworCWVudW0gbmZ0X3JlZ2lzdGVycyAgICAgIHNyZWc6ODsKKwllbnVtIG5mdF9yZWdpc3RlcnMgICAgICBkcmVnOjg7CisJdTgJCQlsZW47CisJdTMyCQkJbW9kdWx1czsKKwl1MzIJCQlzZWVkOworCXUzMgkJCW9mZnNldDsKIH07CiAKLXN0cnVjdCBuZnRfaGFzaF9lbGVtIHsKLQlzdHJ1Y3Qgcmhhc2hfaGVhZAkJbm9kZTsKLQlzdHJ1Y3QgbmZ0X3NldF9leHQJCWV4dDsKK3N0YXRpYyB2b2lkIG5mdF9oYXNoX2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCisJCQkgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQoreworCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJY29uc3Qgdm9pZCAqZGF0YSA9ICZyZWdzLT5kYXRhW3ByaXYtPnNyZWddOworCXUzMiBoOworCisJaCA9IHJlY2lwcm9jYWxfc2NhbGUoamhhc2goZGF0YSwgcHJpdi0+bGVuLCBwcml2LT5zZWVkKSwgcHJpdi0+bW9kdWx1cyk7CisJcmVncy0+ZGF0YVtwcml2LT5kcmVnXSA9IGggKyBwcml2LT5vZmZzZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnRfaGFzaF9wb2xpY3lbTkZUQV9IQVNIX01BWCArIDFdID0geworCVtORlRBX0hBU0hfU1JFR10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtORlRBX0hBU0hfRFJFR10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtORlRBX0hBU0hfTEVOXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtORlRBX0hBU0hfTU9EVUxVU10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtORlRBX0hBU0hfU0VFRF0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogfTsKIAotc3RydWN0IG5mdF9oYXNoX2NtcF9hcmcgewotCWNvbnN0IHN0cnVjdCBuZnRfc2V0CQkqc2V0OwotCWNvbnN0IHUzMgkJCSprZXk7Ci0JdTgJCQkJZ2VubWFzazsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgbmZ0X2hhc2hfcGFyYW1zOwotCi1zdGF0aWMgaW5saW5lIHUzMiBuZnRfaGFzaF9rZXkoY29uc3Qgdm9pZCAqZGF0YSwgdTMyIGxlbiwgdTMyIHNlZWQpCi17Ci0JY29uc3Qgc3RydWN0IG5mdF9oYXNoX2NtcF9hcmcgKmFyZyA9IGRhdGE7Ci0KLQlyZXR1cm4gamhhc2goYXJnLT5rZXksIGxlbiwgc2VlZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIG5mdF9oYXNoX29iaihjb25zdCB2b2lkICpkYXRhLCB1MzIgbGVuLCB1MzIgc2VlZCkKLXsKLQljb25zdCBzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGUgPSBkYXRhOwotCi0JcmV0dXJuIGpoYXNoKG5mdF9zZXRfZXh0X2tleSgmaGUtPmV4dCksIGxlbiwgc2VlZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG5mdF9oYXNoX2NtcChzdHJ1Y3Qgcmhhc2h0YWJsZV9jb21wYXJlX2FyZyAqYXJnLAotCQkJICAgICAgIGNvbnN0IHZvaWQgKnB0cikKLXsKLQljb25zdCBzdHJ1Y3QgbmZ0X2hhc2hfY21wX2FyZyAqeCA9IGFyZy0+a2V5OwotCWNvbnN0IHN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZSA9IHB0cjsKLQotCWlmIChtZW1jbXAobmZ0X3NldF9leHRfa2V5KCZoZS0+ZXh0KSwgeC0+a2V5LCB4LT5zZXQtPmtsZW4pKQotCQlyZXR1cm4gMTsKLQlpZiAobmZ0X3NldF9lbGVtX2V4cGlyZWQoJmhlLT5leHQpKQotCQlyZXR1cm4gMTsKLQlpZiAoIW5mdF9zZXRfZWxlbV9hY3RpdmUoJmhlLT5leHQsIHgtPmdlbm1hc2spKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2wgbmZ0X2hhc2hfbG9va3VwKGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCSAgICBjb25zdCB1MzIgKmtleSwgY29uc3Qgc3RydWN0IG5mdF9zZXRfZXh0ICoqZXh0KQotewotCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCWNvbnN0IHN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZTsKLQlzdHJ1Y3QgbmZ0X2hhc2hfY21wX2FyZyBhcmcgPSB7Ci0JCS5nZW5tYXNrID0gbmZ0X2dlbm1hc2tfY3VyKG5ldCksCi0JCS5zZXQJID0gc2V0LAotCQkua2V5CSA9IGtleSwKLQl9OwotCi0JaGUgPSByaGFzaHRhYmxlX2xvb2t1cF9mYXN0KCZwcml2LT5odCwgJmFyZywgbmZ0X2hhc2hfcGFyYW1zKTsKLQlpZiAoaGUgIT0gTlVMTCkKLQkJKmV4dCA9ICZoZS0+ZXh0OwotCi0JcmV0dXJuICEhaGU7Ci19Ci0KLXN0YXRpYyBib29sIG5mdF9oYXNoX3VwZGF0ZShzdHJ1Y3QgbmZ0X3NldCAqc2V0LCBjb25zdCB1MzIgKmtleSwKLQkJCSAgICB2b2lkICooKm5ldykoc3RydWN0IG5mdF9zZXQgKiwKLQkJCQkJIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqLAotCQkJCQkgc3RydWN0IG5mdF9yZWdzICpyZWdzKSwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCi0JCQkgICAgc3RydWN0IG5mdF9yZWdzICpyZWdzLAotCQkJICAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2V4dCAqKmV4dCkKLXsKLQlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKLQlzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGU7Ci0Jc3RydWN0IG5mdF9oYXNoX2NtcF9hcmcgYXJnID0gewotCQkuZ2VubWFzayA9IE5GVF9HRU5NQVNLX0FOWSwKLQkJLnNldAkgPSBzZXQsCi0JCS5rZXkJID0ga2V5LAotCX07Ci0KLQloZSA9IHJoYXNodGFibGVfbG9va3VwX2Zhc3QoJnByaXYtPmh0LCAmYXJnLCBuZnRfaGFzaF9wYXJhbXMpOwotCWlmIChoZSAhPSBOVUxMKQotCQlnb3RvIG91dDsKLQotCWhlID0gbmV3KHNldCwgZXhwciwgcmVncyk7Ci0JaWYgKGhlID09IE5VTEwpCi0JCWdvdG8gZXJyMTsKLQlpZiAocmhhc2h0YWJsZV9sb29rdXBfaW5zZXJ0X2tleSgmcHJpdi0+aHQsICZhcmcsICZoZS0+bm9kZSwKLQkJCQkJIG5mdF9oYXNoX3BhcmFtcykpCi0JCWdvdG8gZXJyMjsKLW91dDoKLQkqZXh0ID0gJmhlLT5leHQ7Ci0JcmV0dXJuIHRydWU7Ci0KLWVycjI6Ci0JbmZ0X3NldF9lbGVtX2Rlc3Ryb3koc2V0LCBoZSk7Ci1lcnIxOgotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGludCBuZnRfaGFzaF9pbnNlcnQoY29uc3Qgc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKLXsKLQlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKLQlzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGUgPSBlbGVtLT5wcml2OwotCXN0cnVjdCBuZnRfaGFzaF9jbXBfYXJnIGFyZyA9IHsKLQkJLmdlbm1hc2sgPSBuZnRfZ2VubWFza19uZXh0KG5ldCksCi0JCS5zZXQJID0gc2V0LAotCQkua2V5CSA9IGVsZW0tPmtleS52YWwuZGF0YSwKLQl9OwotCi0JcmV0dXJuIHJoYXNodGFibGVfbG9va3VwX2luc2VydF9rZXkoJnByaXYtPmh0LCAmYXJnLCAmaGUtPm5vZGUsCi0JCQkJCSAgICBuZnRfaGFzaF9wYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBuZnRfaGFzaF9hY3RpdmF0ZShjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQotewotCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZSA9IGVsZW0tPnByaXY7Ci0KLQluZnRfc2V0X2VsZW1fY2hhbmdlX2FjdGl2ZShuZXQsIHNldCwgJmhlLT5leHQpOwotCW5mdF9zZXRfZWxlbV9jbGVhcl9idXN5KCZoZS0+ZXh0KTsKLX0KLQotc3RhdGljIHZvaWQgKm5mdF9oYXNoX2RlYWN0aXZhdGUoY29uc3Qgc3RydWN0IG5ldCAqbmV0LAotCQkJCSBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJCSBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQotewotCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZTsKLQlzdHJ1Y3QgbmZ0X2hhc2hfY21wX2FyZyBhcmcgPSB7Ci0JCS5nZW5tYXNrID0gbmZ0X2dlbm1hc2tfbmV4dChuZXQpLAotCQkuc2V0CSA9IHNldCwKLQkJLmtleQkgPSBlbGVtLT5rZXkudmFsLmRhdGEsCi0JfTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQloZSA9IHJoYXNodGFibGVfbG9va3VwX2Zhc3QoJnByaXYtPmh0LCAmYXJnLCBuZnRfaGFzaF9wYXJhbXMpOwotCWlmIChoZSAhPSBOVUxMKSB7Ci0JCWlmICghbmZ0X3NldF9lbGVtX21hcmtfYnVzeSgmaGUtPmV4dCkgfHwKLQkJICAgICFuZnRfaXNfYWN0aXZlKG5ldCwgJmhlLT5leHQpKQotCQkJbmZ0X3NldF9lbGVtX2NoYW5nZV9hY3RpdmUobmV0LCBzZXQsICZoZS0+ZXh0KTsKLQkJZWxzZQotCQkJaGUgPSBOVUxMOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiBoZTsKLX0KLQotc3RhdGljIHZvaWQgbmZ0X2hhc2hfcmVtb3ZlKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkgICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKLXsKLQlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKLQlzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGUgPSBlbGVtLT5wcml2OwotCi0Jcmhhc2h0YWJsZV9yZW1vdmVfZmFzdCgmcHJpdi0+aHQsICZoZS0+bm9kZSwgbmZ0X2hhc2hfcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgbmZ0X2hhc2hfd2Fsayhjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJICBzdHJ1Y3QgbmZ0X3NldF9pdGVyICppdGVyKQotewotCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZTsKLQlzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyIGh0aTsKLQlzdHJ1Y3QgbmZ0X3NldF9lbGVtIGVsZW07Ci0JaW50IGVycjsKLQotCWVyciA9IHJoYXNodGFibGVfd2Fsa19pbml0KCZwcml2LT5odCwgJmh0aSwgR0ZQX0tFUk5FTCk7Ci0JaXRlci0+ZXJyID0gZXJyOwotCWlmIChlcnIpCi0JCXJldHVybjsKLQotCWVyciA9IHJoYXNodGFibGVfd2Fsa19zdGFydCgmaHRpKTsKLQlpZiAoZXJyICYmIGVyciAhPSAtRUFHQUlOKSB7Ci0JCWl0ZXItPmVyciA9IGVycjsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jd2hpbGUgKChoZSA9IHJoYXNodGFibGVfd2Fsa19uZXh0KCZodGkpKSkgewotCQlpZiAoSVNfRVJSKGhlKSkgewotCQkJZXJyID0gUFRSX0VSUihoZSk7Ci0JCQlpZiAoZXJyICE9IC1FQUdBSU4pIHsKLQkJCQlpdGVyLT5lcnIgPSBlcnI7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKGl0ZXItPmNvdW50IDwgaXRlci0+c2tpcCkKLQkJCWdvdG8gY29udDsKLQkJaWYgKG5mdF9zZXRfZWxlbV9leHBpcmVkKCZoZS0+ZXh0KSkKLQkJCWdvdG8gY29udDsKLQkJaWYgKCFuZnRfc2V0X2VsZW1fYWN0aXZlKCZoZS0+ZXh0LCBpdGVyLT5nZW5tYXNrKSkKLQkJCWdvdG8gY29udDsKLQotCQllbGVtLnByaXYgPSBoZTsKLQotCQlpdGVyLT5lcnIgPSBpdGVyLT5mbihjdHgsIHNldCwgaXRlciwgJmVsZW0pOwotCQlpZiAoaXRlci0+ZXJyIDwgMCkKLQkJCWdvdG8gb3V0OwotCi1jb250OgotCQlpdGVyLT5jb3VudCsrOwotCX0KLQotb3V0OgotCXJoYXNodGFibGVfd2Fsa19zdG9wKCZodGkpOwotCXJoYXNodGFibGVfd2Fsa19leGl0KCZodGkpOwotfQotCi1zdGF0aWMgdm9pZCBuZnRfaGFzaF9nYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IG5mdF9zZXQgKnNldDsKLQlzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGU7Ci0Jc3RydWN0IG5mdF9oYXNoICpwcml2OwotCXN0cnVjdCBuZnRfc2V0X2djX2JhdGNoICpnY2IgPSBOVUxMOwotCXN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgaHRpOwotCWludCBlcnI7Ci0KLQlwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuZnRfaGFzaCwgZ2Nfd29yay53b3JrKTsKLQlzZXQgID0gbmZ0X3NldF9jb250YWluZXJfb2YocHJpdik7Ci0KLQllcnIgPSByaGFzaHRhYmxlX3dhbGtfaW5pdCgmcHJpdi0+aHQsICZodGksIEdGUF9LRVJORUwpOwotCWlmIChlcnIpCi0JCWdvdG8gc2NoZWR1bGU7Ci0KLQllcnIgPSByaGFzaHRhYmxlX3dhbGtfc3RhcnQoJmh0aSk7Ci0JaWYgKGVyciAmJiBlcnIgIT0gLUVBR0FJTikKLQkJZ290byBvdXQ7Ci0KLQl3aGlsZSAoKGhlID0gcmhhc2h0YWJsZV93YWxrX25leHQoJmh0aSkpKSB7Ci0JCWlmIChJU19FUlIoaGUpKSB7Ci0JCQlpZiAoUFRSX0VSUihoZSkgIT0gLUVBR0FJTikKLQkJCQlnb3RvIG91dDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKCFuZnRfc2V0X2VsZW1fZXhwaXJlZCgmaGUtPmV4dCkpCi0JCQljb250aW51ZTsKLQkJaWYgKG5mdF9zZXRfZWxlbV9tYXJrX2J1c3koJmhlLT5leHQpKQotCQkJY29udGludWU7Ci0KLQkJZ2NiID0gbmZ0X3NldF9nY19iYXRjaF9jaGVjayhzZXQsIGdjYiwgR0ZQX0FUT01JQyk7Ci0JCWlmIChnY2IgPT0gTlVMTCkKLQkJCWdvdG8gb3V0OwotCQlyaGFzaHRhYmxlX3JlbW92ZV9mYXN0KCZwcml2LT5odCwgJmhlLT5ub2RlLCBuZnRfaGFzaF9wYXJhbXMpOwotCQlhdG9taWNfZGVjKCZzZXQtPm5lbGVtcyk7Ci0JCW5mdF9zZXRfZ2NfYmF0Y2hfYWRkKGdjYiwgaGUpOwotCX0KLW91dDoKLQlyaGFzaHRhYmxlX3dhbGtfc3RvcCgmaHRpKTsKLQlyaGFzaHRhYmxlX3dhbGtfZXhpdCgmaHRpKTsKLQotCW5mdF9zZXRfZ2NfYmF0Y2hfY29tcGxldGUoZ2NiKTsKLXNjaGVkdWxlOgotCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLCAmcHJpdi0+Z2Nfd29yaywKLQkJCSAgIG5mdF9zZXRfZ2NfaW50ZXJ2YWwoc2V0KSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbmZ0X2hhc2hfcHJpdnNpemUoY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IG5sYVtdKQotewotCXJldHVybiBzaXplb2Yoc3RydWN0IG5mdF9oYXNoKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBuZnRfaGFzaF9wYXJhbXMgPSB7Ci0JLmhlYWRfb2Zmc2V0CQk9IG9mZnNldG9mKHN0cnVjdCBuZnRfaGFzaF9lbGVtLCBub2RlKSwKLQkuaGFzaGZuCQkJPSBuZnRfaGFzaF9rZXksCi0JLm9ial9oYXNoZm4JCT0gbmZ0X2hhc2hfb2JqLAotCS5vYmpfY21wZm4JCT0gbmZ0X2hhc2hfY21wLAotCS5hdXRvbWF0aWNfc2hyaW5raW5nCT0gdHJ1ZSwKLX07Ci0KLXN0YXRpYyBpbnQgbmZ0X2hhc2hfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2Rlc2MgKmRlc2MsCitzdGF0aWMgaW50IG5mdF9oYXNoX2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJCSBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCiAJCQkgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCiB7Ci0Jc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0Jc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcyA9IG5mdF9oYXNoX3BhcmFtczsKLQlpbnQgZXJyOworCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJdTMyIGxlbjsKIAotCXBhcmFtcy5uZWxlbV9oaW50ID0gZGVzYy0+c2l6ZSA/OiBORlRfSEFTSF9FTEVNRU5UX0hJTlQ7Ci0JcGFyYW1zLmtleV9sZW4JICA9IHNldC0+a2xlbjsKKwlpZiAoIXRiW05GVEFfSEFTSF9TUkVHXSB8fAorCSAgICAhdGJbTkZUQV9IQVNIX0RSRUddIHx8CisJICAgICF0YltORlRBX0hBU0hfTEVOXSAgfHwKKwkgICAgIXRiW05GVEFfSEFTSF9TRUVEXSB8fAorCSAgICAhdGJbTkZUQV9IQVNIX01PRFVMVVNdKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCWVyciA9IHJoYXNodGFibGVfaW5pdCgmcHJpdi0+aHQsICZwYXJhbXMpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOworCWlmICh0YltORlRBX0hBU0hfT0ZGU0VUXSkKKwkJcHJpdi0+b2Zmc2V0ID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfSEFTSF9PRkZTRVRdKSk7CiAKLQlJTklUX0RFRkVSUkFCTEVfV09SSygmcHJpdi0+Z2Nfd29yaywgbmZ0X2hhc2hfZ2MpOwotCWlmIChzZXQtPmZsYWdzICYgTkZUX1NFVF9USU1FT1VUKQotCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwgJnByaXYtPmdjX3dvcmssCi0JCQkJICAgbmZ0X3NldF9nY19pbnRlcnZhbChzZXQpKTsKKwlwcml2LT5zcmVnID0gbmZ0X3BhcnNlX3JlZ2lzdGVyKHRiW05GVEFfSEFTSF9TUkVHXSk7CisJcHJpdi0+ZHJlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX0hBU0hfRFJFR10pOworCisJbGVuID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfSEFTSF9MRU5dKSk7CisJaWYgKGxlbiA9PSAwIHx8IGxlbiA+IFU4X01BWCkKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwlwcml2LT5sZW4gPSBsZW47CisKKwlwcml2LT5tb2R1bHVzID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfSEFTSF9NT0RVTFVTXSkpOworCWlmIChwcml2LT5tb2R1bHVzIDw9IDEpCisJCXJldHVybiAtRVJBTkdFOworCisJaWYgKHByaXYtPm9mZnNldCArIHByaXYtPm1vZHVsdXMgLSAxIDwgcHJpdi0+b2Zmc2V0KQorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKworCXByaXYtPnNlZWQgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9IQVNIX1NFRURdKSk7CisKKwlyZXR1cm4gbmZ0X3ZhbGlkYXRlX3JlZ2lzdGVyX2xvYWQocHJpdi0+c3JlZywgbGVuKSAmJgorCSAgICAgICBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfc3RvcmUoY3R4LCBwcml2LT5kcmVnLCBOVUxMLAorCQkJCQkgICBORlRfREFUQV9WQUxVRSwgc2l6ZW9mKHUzMikpOworfQorCitzdGF0aWMgaW50IG5mdF9oYXNoX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpCit7CisJY29uc3Qgc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKworCWlmIChuZnRfZHVtcF9yZWdpc3Rlcihza2IsIE5GVEFfSEFTSF9TUkVHLCBwcml2LT5zcmVnKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKG5mdF9kdW1wX3JlZ2lzdGVyKHNrYiwgTkZUQV9IQVNIX0RSRUcsIHByaXYtPmRyZWcpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9IQVNIX0xFTiwgaHRvbmwocHJpdi0+bGVuKSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX0hBU0hfTU9EVUxVUywgaHRvbmwocHJpdi0+bW9kdWx1cykpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9IQVNIX1NFRUQsIGh0b25sKHByaXYtPnNlZWQpKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKHByaXYtPm9mZnNldCAhPSAwKQorCQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9IQVNIX09GRlNFVCwgaHRvbmwocHJpdi0+b2Zmc2V0KSkpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtMTsKIH0KIAotc3RhdGljIHZvaWQgbmZ0X2hhc2hfZWxlbV9kZXN0cm95KHZvaWQgKnB0ciwgdm9pZCAqYXJnKQotewotCW5mdF9zZXRfZWxlbV9kZXN0cm95KChjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqKWFyZywgcHRyKTsKLX0KLQotc3RhdGljIHZvaWQgbmZ0X2hhc2hfZGVzdHJveShjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0KQotewotCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5nY193b3JrKTsKLQlyaGFzaHRhYmxlX2ZyZWVfYW5kX2Rlc3Ryb3koJnByaXYtPmh0LCBuZnRfaGFzaF9lbGVtX2Rlc3Ryb3ksCi0JCQkJICAgICh2b2lkICopc2V0KTsKLX0KLQotc3RhdGljIGJvb2wgbmZ0X2hhc2hfZXN0aW1hdGUoY29uc3Qgc3RydWN0IG5mdF9zZXRfZGVzYyAqZGVzYywgdTMyIGZlYXR1cmVzLAotCQkJICAgICAgc3RydWN0IG5mdF9zZXRfZXN0aW1hdGUgKmVzdCkKLXsKLQl1bnNpZ25lZCBpbnQgZXNpemU7Ci0KLQllc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSk7Ci0JaWYgKGRlc2MtPnNpemUpIHsKLQkJZXN0LT5zaXplID0gc2l6ZW9mKHN0cnVjdCBuZnRfaGFzaCkgKwotCQkJICAgIHJvdW5kdXBfcG93X29mX3R3byhkZXNjLT5zaXplICogNCAvIDMpICoKLQkJCSAgICBzaXplb2Yoc3RydWN0IG5mdF9oYXNoX2VsZW0gKikgKwotCQkJICAgIGRlc2MtPnNpemUgKiBlc2l6ZTsKLQl9IGVsc2UgewotCQkvKiBSZXNpemluZyBoYXBwZW5zIHdoZW4gdGhlIGxvYWQgZHJvcHMgYmVsb3cgMzAlIG9yIGdvZXMKLQkJICogYWJvdmUgNzUlLiBUaGUgYXZlcmFnZSBvZiA1Mi41JSBsb2FkIChhcHByb3hpbWF0ZWQgYnkgNTAlKQotCQkgKiBpcyB1c2VkIGZvciB0aGUgc2l6ZSBlc3RpbWF0aW9uIG9mIHRoZSBoYXNoIGJ1Y2tldHMsCi0JCSAqIG1lYW5pbmcgd2UgY2FsY3VsYXRlIHR3byBidWNrZXRzIHBlciBlbGVtZW50LgotCQkgKi8KLQkJZXN0LT5zaXplID0gZXNpemUgKyAyICogc2l6ZW9mKHN0cnVjdCBuZnRfaGFzaF9lbGVtICopOwotCX0KLQotCWVzdC0+Y2xhc3MgPSBORlRfU0VUX0NMQVNTX09fMTsKLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgc3RydWN0IG5mdF9zZXRfb3BzIG5mdF9oYXNoX29wcyBfX3JlYWRfbW9zdGx5ID0gewotCS5wcml2c2l6ZSAgICAgICA9IG5mdF9oYXNoX3ByaXZzaXplLAotCS5lbGVtc2l6ZQk9IG9mZnNldG9mKHN0cnVjdCBuZnRfaGFzaF9lbGVtLCBleHQpLAotCS5lc3RpbWF0ZQk9IG5mdF9oYXNoX2VzdGltYXRlLAorc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9oYXNoX3R5cGU7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5mdF9leHByX29wcyBuZnRfaGFzaF9vcHMgPSB7CisJLnR5cGUJCT0gJm5mdF9oYXNoX3R5cGUsCisJLnNpemUJCT0gTkZUX0VYUFJfU0laRShzaXplb2Yoc3RydWN0IG5mdF9oYXNoKSksCisJLmV2YWwJCT0gbmZ0X2hhc2hfZXZhbCwKIAkuaW5pdAkJPSBuZnRfaGFzaF9pbml0LAotCS5kZXN0cm95CT0gbmZ0X2hhc2hfZGVzdHJveSwKLQkuaW5zZXJ0CQk9IG5mdF9oYXNoX2luc2VydCwKLQkuYWN0aXZhdGUJPSBuZnRfaGFzaF9hY3RpdmF0ZSwKLQkuZGVhY3RpdmF0ZQk9IG5mdF9oYXNoX2RlYWN0aXZhdGUsCi0JLnJlbW92ZQkJPSBuZnRfaGFzaF9yZW1vdmUsCi0JLmxvb2t1cAkJPSBuZnRfaGFzaF9sb29rdXAsCi0JLnVwZGF0ZQkJPSBuZnRfaGFzaF91cGRhdGUsCi0JLndhbGsJCT0gbmZ0X2hhc2hfd2FsaywKLQkuZmVhdHVyZXMJPSBORlRfU0VUX01BUCB8IE5GVF9TRVRfVElNRU9VVCwKKwkuZHVtcAkJPSBuZnRfaGFzaF9kdW1wLAorfTsKKworc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9oYXNoX3R5cGUgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJPSAiaGFzaCIsCisJLm9wcwkJPSAmbmZ0X2hhc2hfb3BzLAorCS5wb2xpY3kJCT0gbmZ0X2hhc2hfcG9saWN5LAorCS5tYXhhdHRyCT0gTkZUQV9IQVNIX01BWCwKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBuZnRfaGFzaF9tb2R1bGVfaW5pdCh2b2lkKQogewotCXJldHVybiBuZnRfcmVnaXN0ZXJfc2V0KCZuZnRfaGFzaF9vcHMpOworCXJldHVybiBuZnRfcmVnaXN0ZXJfZXhwcigmbmZ0X2hhc2hfdHlwZSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBuZnRfaGFzaF9tb2R1bGVfZXhpdCh2b2lkKQogewotCW5mdF91bnJlZ2lzdGVyX3NldCgmbmZ0X2hhc2hfb3BzKTsKKwluZnRfdW5yZWdpc3Rlcl9leHByKCZuZnRfaGFzaF90eXBlKTsKIH0KIAogbW9kdWxlX2luaXQobmZ0X2hhc2hfbW9kdWxlX2luaXQpOwogbW9kdWxlX2V4aXQobmZ0X2hhc2hfbW9kdWxlX2V4aXQpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4iKTsKLU1PRFVMRV9BTElBU19ORlRfU0VUKCk7CitNT0RVTEVfQVVUSE9SKCJMYXVyYSBHYXJjaWEgPG5ldm9sYUBnbWFpbC5jb20+Iik7CitNT0RVTEVfQUxJQVNfTkZUX0VYUFIoImhhc2giKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2ltbWVkaWF0ZS5jIGIvbmV0L25ldGZpbHRlci9uZnRfaW1tZWRpYXRlLmMKaW5kZXggZGIzYjc0Ni4uZDE3MDE4ZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfaW1tZWRpYXRlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfaW1tZWRpYXRlLmMKQEAgLTUzLDYgKzUzLDEwIEBACiAJCQkgICAgdGJbTkZUQV9JTU1FRElBVEVfREFUQV0pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOworCisJaWYgKGRlc2MubGVuID4gVThfTUFYKQorCQlyZXR1cm4gLUVSQU5HRTsKKwogCXByaXYtPmRsZW4gPSBkZXNjLmxlbjsKIAogCXByaXYtPmRyZWcgPSBuZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9JTU1FRElBVEVfRFJFR10pOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfbGltaXQuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2xpbWl0LmMKaW5kZXggMDcwYjk4OS4uYzZiYWY0MSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfbGltaXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9saW1pdC5jCkBAIC0xNDUsNyArMTQ1LDcgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXByaXYtPmNvc3QgPSBkaXZfdTY0KHByaXYtPmxpbWl0Lm5zZWNzLCBwcml2LT5saW1pdC5yYXRlKTsKKwlwcml2LT5jb3N0ID0gZGl2NjRfdTY0KHByaXYtPmxpbWl0Lm5zZWNzLCBwcml2LT5saW1pdC5yYXRlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTcwLDcgKzE3MCw3IEBACiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKIHsKIAlzdHJ1Y3QgbmZ0X2xpbWl0ICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKLQl1NjQgY29zdCA9IGRpdl91NjQocHJpdi0+bnNlY3MgKiBwa3QtPnNrYi0+bGVuLCBwcml2LT5yYXRlKTsKKwl1NjQgY29zdCA9IGRpdjY0X3U2NChwcml2LT5uc2VjcyAqIHBrdC0+c2tiLT5sZW4sIHByaXYtPnJhdGUpOwogCiAJaWYgKG5mdF9saW1pdF9ldmFsKHByaXYsIGNvc3QpKQogCQlyZWdzLT52ZXJkaWN0LmNvZGUgPSBORlRfQlJFQUs7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9sb2cuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2xvZy5jCmluZGV4IDI0YTczYmIuLjFiMDE0MDQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X2xvZy5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2xvZy5jCkBAIC01OCw4ICs1OCwxMSBAQAogCWlmICh0YltORlRBX0xPR19MRVZFTF0gIT0gTlVMTCAmJgogCSAgICB0YltORlRBX0xPR19HUk9VUF0gIT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHRiW05GVEFfTE9HX0dST1VQXSAhPSBOVUxMKQorCWlmICh0YltORlRBX0xPR19HUk9VUF0gIT0gTlVMTCkgewogCQlsaS0+dHlwZSA9IE5GX0xPR19UWVBFX1VMT0c7CisJCWlmICh0YltORlRBX0xPR19GTEFHU10gIT0gTlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KIAogCW5sYSA9IHRiW05GVEFfTE9HX1BSRUZJWF07CiAJaWYgKG5sYSAhPSBOVUxMKSB7CkBAIC04Nyw2ICs5MCwxMCBAQAogCQlpZiAodGJbTkZUQV9MT0dfRkxBR1NdICE9IE5VTEwpIHsKIAkJCWxpLT51LmxvZy5sb2dmbGFncyA9CiAJCQkJbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfTE9HX0ZMQUdTXSkpOworCQkJaWYgKGxpLT51LmxvZy5sb2dmbGFncyAmIH5ORl9MT0dfTUFTSykgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBlcnIxOworCQkJfQogCQl9CiAJCWJyZWFrOwogCWNhc2UgTkZfTE9HX1RZUEVfVUxPRzoKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2xvb2t1cC5jIGIvbmV0L25ldGZpbHRlci9uZnRfbG9va3VwLmMKaW5kZXggZTE2NDMyNS4uODE2NmI2OSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfbG9va3VwLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfbG9va3VwLmMKQEAgLTQzLDcgKzQzLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChmb3VuZCAmJiBzZXQtPmZsYWdzICYgTkZUX1NFVF9NQVApCisJaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX01BUCkKIAkJbmZ0X2RhdGFfY29weSgmcmVncy0+ZGF0YVtwcml2LT5kcmVnXSwKIAkJCSAgICAgIG5mdF9zZXRfZXh0X2RhdGEoZXh0KSwgc2V0LT5kbGVuKTsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfbWV0YS5jIGIvbmV0L25ldGZpbHRlci9uZnRfbWV0YS5jCmluZGV4IDI4NjNmMzQuLjZjMWUwMjQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X21ldGEuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmMKQEAgLTUyLDYgKzUyLDggQEAKIAkJKmRlc3QgPSBwa3QtPnBmOwogCQlicmVhazsKIAljYXNlIE5GVF9NRVRBX0w0UFJPVE86CisJCWlmICghcGt0LT50cHJvdF9zZXQpCisJCQlnb3RvIGVycjsKIAkJKmRlc3QgPSBwa3QtPnRwcm90OwogCQlicmVhazsKIAljYXNlIE5GVF9NRVRBX1BSSU9SSVRZOgpAQCAtMjkxLDEwICsyOTMsMTYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5mdF9tZXRhX2dldF9pbml0KTsKIAotc3RhdGljIGludCBuZnRfbWV0YV9zZXRfaW5pdF9wa3R0eXBlKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgpCitpbnQgbmZ0X21ldGFfc2V0X3ZhbGlkYXRlKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCQkgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgY29uc3Qgc3RydWN0IG5mdF9kYXRhICoqZGF0YSkKIHsKKwlzdHJ1Y3QgbmZ0X21ldGEgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOwogCXVuc2lnbmVkIGludCBob29rczsKIAorCWlmIChwcml2LT5rZXkgIT0gTkZUX01FVEFfUEtUVFlQRSkKKwkJcmV0dXJuIDA7CisKIAlzd2l0Y2ggKGN0eC0+YWZpLT5mYW1pbHkpIHsKIAljYXNlIE5GUFJPVE9fQlJJREdFOgogCQlob29rcyA9IDEgPDwgTkZfQlJfUFJFX1JPVVRJTkc7CkBAIC0zMDgsNiArMzE2LDcgQEAKIAogCXJldHVybiBuZnRfY2hhaW5fdmFsaWRhdGVfaG9va3MoY3R4LT5jaGFpbiwgaG9va3MpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZ0X21ldGFfc2V0X3ZhbGlkYXRlKTsKIAogaW50IG5mdF9tZXRhX3NldF9pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKQEAgLTMyNywxNSArMzM2LDE2IEBACiAJCWxlbiA9IHNpemVvZih1OCk7CiAJCWJyZWFrOwogCWNhc2UgTkZUX01FVEFfUEtUVFlQRToKLQkJZXJyID0gbmZ0X21ldGFfc2V0X2luaXRfcGt0dHlwZShjdHgpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKIAkJbGVuID0gc2l6ZW9mKHU4KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAorCWVyciA9IG5mdF9tZXRhX3NldF92YWxpZGF0ZShjdHgsIGV4cHIsIE5VTEwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCiAJcHJpdi0+c3JlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX01FVEFfU1JFR10pOwogCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKHByaXYtPnNyZWcsIGxlbik7CiAJaWYgKGVyciA8IDApCkBAIC00MDcsNiArNDE3LDcgQEAKIAkuaW5pdAkJPSBuZnRfbWV0YV9zZXRfaW5pdCwKIAkuZGVzdHJveQk9IG5mdF9tZXRhX3NldF9kZXN0cm95LAogCS5kdW1wCQk9IG5mdF9tZXRhX3NldF9kdW1wLAorCS52YWxpZGF0ZQk9IG5mdF9tZXRhX3NldF92YWxpZGF0ZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfb3BzICoKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X251bWdlbi5jIGIvbmV0L25ldGZpbHRlci9uZnRfbnVtZ2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViYzVhYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X251bWdlbi5jCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IExhdXJhIEdhcmNpYSA8bmV2b2xhQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdGljX2tleS5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5oPgorCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHJuZF9zdGF0ZSwgbmZ0X251bWdlbl9wcmFuZG9tX3N0YXRlKTsKKworc3RydWN0IG5mdF9uZ19pbmMgeworCWVudW0gbmZ0X3JlZ2lzdGVycyAgICAgIGRyZWc6ODsKKwl1MzIJCQltb2R1bHVzOworCWF0b21pY190CQljb3VudGVyOworCXUzMgkJCW9mZnNldDsKK307CisKK3N0YXRpYyB2b2lkIG5mdF9uZ19pbmNfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQkgICAgc3RydWN0IG5mdF9yZWdzICpyZWdzLAorCQkJICAgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQoreworCXN0cnVjdCBuZnRfbmdfaW5jICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwl1MzIgbnZhbCwgb3ZhbDsKKworCWRvIHsKKwkJb3ZhbCA9IGF0b21pY19yZWFkKCZwcml2LT5jb3VudGVyKTsKKwkJbnZhbCA9IChvdmFsICsgMSA8IHByaXYtPm1vZHVsdXMpID8gb3ZhbCArIDEgOiAwOworCX0gd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZwcml2LT5jb3VudGVyLCBvdmFsLCBudmFsKSAhPSBvdmFsKTsKKworCXJlZ3MtPmRhdGFbcHJpdi0+ZHJlZ10gPSBudmFsICsgcHJpdi0+b2Zmc2V0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbmZ0X25nX3BvbGljeVtORlRBX05HX01BWCArIDFdID0geworCVtORlRBX05HX0RSRUddCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05GVEFfTkdfTU9EVUxVU10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtORlRBX05HX1RZUEVdCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05GVEFfTkdfT0ZGU0VUXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCit9OworCitzdGF0aWMgaW50IG5mdF9uZ19pbmNfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkJICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCit7CisJc3RydWN0IG5mdF9uZ19pbmMgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCisJaWYgKHRiW05GVEFfTkdfT0ZGU0VUXSkKKwkJcHJpdi0+b2Zmc2V0ID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfTkdfT0ZGU0VUXSkpOworCisJcHJpdi0+bW9kdWx1cyA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX05HX01PRFVMVVNdKSk7CisJaWYgKHByaXYtPm1vZHVsdXMgPT0gMCkKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwlpZiAocHJpdi0+b2Zmc2V0ICsgcHJpdi0+bW9kdWx1cyAtIDEgPCBwcml2LT5vZmZzZXQpCisJCXJldHVybiAtRU9WRVJGTE9XOworCisJcHJpdi0+ZHJlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX05HX0RSRUddKTsKKwlhdG9taWNfc2V0KCZwcml2LT5jb3VudGVyLCAwKTsKKworCXJldHVybiBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfc3RvcmUoY3R4LCBwcml2LT5kcmVnLCBOVUxMLAorCQkJCQkgICBORlRfREFUQV9WQUxVRSwgc2l6ZW9mKHUzMikpOworfQorCitzdGF0aWMgaW50IG5mdF9uZ19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gbmZ0X3JlZ2lzdGVycyBkcmVnLAorCQkgICAgICAgdTMyIG1vZHVsdXMsIGVudW0gbmZ0X25nX3R5cGVzIHR5cGUsIHUzMiBvZmZzZXQpCit7CisJaWYgKG5mdF9kdW1wX3JlZ2lzdGVyKHNrYiwgTkZUQV9OR19EUkVHLCBkcmVnKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GVEFfTkdfTU9EVUxVUywgaHRvbmwobW9kdWx1cykpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9OR19UWVBFLCBodG9ubCh0eXBlKSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX05HX09GRlNFVCwgaHRvbmwob2Zmc2V0KSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgbmZ0X25nX2luY19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwcikKK3sKKwljb25zdCBzdHJ1Y3QgbmZ0X25nX2luYyAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisKKwlyZXR1cm4gbmZ0X25nX2R1bXAoc2tiLCBwcml2LT5kcmVnLCBwcml2LT5tb2R1bHVzLCBORlRfTkdfSU5DUkVNRU5UQUwsCisJCQkgICBwcml2LT5vZmZzZXQpOworfQorCitzdHJ1Y3QgbmZ0X25nX3JhbmRvbSB7CisJZW51bSBuZnRfcmVnaXN0ZXJzICAgICAgZHJlZzo4OworCXUzMgkJCW1vZHVsdXM7CisJdTMyCQkJb2Zmc2V0OworfTsKKworc3RhdGljIHZvaWQgbmZ0X25nX3JhbmRvbV9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgICAgICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCit7CisJc3RydWN0IG5mdF9uZ19yYW5kb20gKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCXN0cnVjdCBybmRfc3RhdGUgKnN0YXRlID0gdGhpc19jcHVfcHRyKCZuZnRfbnVtZ2VuX3ByYW5kb21fc3RhdGUpOworCXUzMiB2YWw7CisKKwl2YWwgPSByZWNpcHJvY2FsX3NjYWxlKHByYW5kb21fdTMyX3N0YXRlKHN0YXRlKSwgcHJpdi0+bW9kdWx1cyk7CisJcmVncy0+ZGF0YVtwcml2LT5kcmVnXSA9IHZhbCArIHByaXYtPm9mZnNldDsKK30KKworc3RhdGljIGludCBuZnRfbmdfcmFuZG9tX2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQoreworCXN0cnVjdCBuZnRfbmdfcmFuZG9tICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKworCWlmICh0YltORlRBX05HX09GRlNFVF0pCisJCXByaXYtPm9mZnNldCA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX05HX09GRlNFVF0pKTsKKworCXByaXYtPm1vZHVsdXMgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9OR19NT0RVTFVTXSkpOworCWlmIChwcml2LT5tb2R1bHVzID09IDApCisJCXJldHVybiAtRVJBTkdFOworCisJaWYgKHByaXYtPm9mZnNldCArIHByaXYtPm1vZHVsdXMgLSAxIDwgcHJpdi0+b2Zmc2V0KQorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKworCXByYW5kb21faW5pdF9vbmNlKCZuZnRfbnVtZ2VuX3ByYW5kb21fc3RhdGUpOworCisJcHJpdi0+ZHJlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX05HX0RSRUddKTsKKworCXJldHVybiBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfc3RvcmUoY3R4LCBwcml2LT5kcmVnLCBOVUxMLAorCQkJCQkgICBORlRfREFUQV9WQUxVRSwgc2l6ZW9mKHUzMikpOworfQorCitzdGF0aWMgaW50IG5mdF9uZ19yYW5kb21fZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpCit7CisJY29uc3Qgc3RydWN0IG5mdF9uZ19yYW5kb20gKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCisJcmV0dXJuIG5mdF9uZ19kdW1wKHNrYiwgcHJpdi0+ZHJlZywgcHJpdi0+bW9kdWx1cywgTkZUX05HX1JBTkRPTSwKKwkJCSAgIHByaXYtPm9mZnNldCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSBuZnRfbmdfdHlwZTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfb3BzIG5mdF9uZ19pbmNfb3BzID0geworCS50eXBlCQk9ICZuZnRfbmdfdHlwZSwKKwkuc2l6ZQkJPSBORlRfRVhQUl9TSVpFKHNpemVvZihzdHJ1Y3QgbmZ0X25nX2luYykpLAorCS5ldmFsCQk9IG5mdF9uZ19pbmNfZXZhbCwKKwkuaW5pdAkJPSBuZnRfbmdfaW5jX2luaXQsCisJLmR1bXAJCT0gbmZ0X25nX2luY19kdW1wLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfZXhwcl9vcHMgbmZ0X25nX3JhbmRvbV9vcHMgPSB7CisJLnR5cGUJCT0gJm5mdF9uZ190eXBlLAorCS5zaXplCQk9IE5GVF9FWFBSX1NJWkUoc2l6ZW9mKHN0cnVjdCBuZnRfbmdfcmFuZG9tKSksCisJLmV2YWwJCT0gbmZ0X25nX3JhbmRvbV9ldmFsLAorCS5pbml0CQk9IG5mdF9uZ19yYW5kb21faW5pdCwKKwkuZHVtcAkJPSBuZnRfbmdfcmFuZG9tX2R1bXAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5mdF9leHByX29wcyAqCituZnRfbmdfc2VsZWN0X29wcyhjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LCBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKK3sKKwl1MzIgdHlwZTsKKworCWlmICghdGJbTkZUQV9OR19EUkVHXQkgfHwKKwkgICAgIXRiW05GVEFfTkdfTU9EVUxVU10gfHwKKwkgICAgIXRiW05GVEFfTkdfVFlQRV0pCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJdHlwZSA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX05HX1RZUEVdKSk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE5GVF9OR19JTkNSRU1FTlRBTDoKKwkJcmV0dXJuICZuZnRfbmdfaW5jX29wczsKKwljYXNlIE5GVF9OR19SQU5ET006CisJCXJldHVybiAmbmZ0X25nX3JhbmRvbV9vcHM7CisJfQorCisJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSBuZnRfbmdfdHlwZSBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lCQk9ICJudW1nZW4iLAorCS5zZWxlY3Rfb3BzCT0gJm5mdF9uZ19zZWxlY3Rfb3BzLAorCS5wb2xpY3kJCT0gbmZ0X25nX3BvbGljeSwKKwkubWF4YXR0cgk9IE5GVEFfTkdfTUFYLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG5mdF9uZ19tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiBuZnRfcmVnaXN0ZXJfZXhwcigmbmZ0X25nX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZ0X25nX21vZHVsZV9leGl0KHZvaWQpCit7CisJbmZ0X3VucmVnaXN0ZXJfZXhwcigmbmZ0X25nX3R5cGUpOworfQorCittb2R1bGVfaW5pdChuZnRfbmdfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQobmZ0X25nX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTGF1cmEgR2FyY2lhIDxuZXZvbGFAZ21haWwuY29tPiIpOworTU9EVUxFX0FMSUFTX05GVF9FWFBSKCJudW1nZW4iKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X3BheWxvYWQuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3BheWxvYWQuYwppbmRleCAxMmNkNGJmLi5iMmY4ODYxIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9wYXlsb2FkLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfcGF5bG9hZC5jCkBAIC05Miw2ICs5Miw4IEBACiAJCW9mZnNldCA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOwogCQlicmVhazsKIAljYXNlIE5GVF9QQVlMT0FEX1RSQU5TUE9SVF9IRUFERVI6CisJCWlmICghcGt0LT50cHJvdF9zZXQpCisJCQlnb3RvIGVycjsKIAkJb2Zmc2V0ID0gcGt0LT54dC50aG9mZjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTE4NCw2ICsxODYsOCBAQAogCQlvZmZzZXQgPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKIAkJYnJlYWs7CiAJY2FzZSBORlRfUEFZTE9BRF9UUkFOU1BPUlRfSEVBREVSOgorCQlpZiAoIXBrdC0+dHByb3Rfc2V0KQorCQkJZ290byBlcnI7CiAJCW9mZnNldCA9IHBrdC0+eHQudGhvZmY7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9xdWV1ZS5jIGIvbmV0L25ldGZpbHRlci9uZnRfcXVldWUuYwppbmRleCA2MWQyMTZlLi4zOTNkMzU5IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9xdWV1ZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3F1ZXVlLmMKQEAgLTIyLDkgKzIyLDEwIEBACiBzdGF0aWMgdTMyIGpoYXNoX2luaXR2YWwgX19yZWFkX21vc3RseTsKIAogc3RydWN0IG5mdF9xdWV1ZSB7Ci0JdTE2CXF1ZXVlbnVtOwotCXUxNglxdWV1ZXNfdG90YWw7Ci0JdTE2CWZsYWdzOworCWVudW0gbmZ0X3JlZ2lzdGVycwlzcmVnX3FudW06ODsKKwl1MTYJCQlxdWV1ZW51bTsKKwl1MTYJCQlxdWV1ZXNfdG90YWw7CisJdTE2CQkJZmxhZ3M7CiB9OwogCiBzdGF0aWMgdm9pZCBuZnRfcXVldWVfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCkBAIC01NCwyNyArNTUsNTEgQEAKIAlyZWdzLT52ZXJkaWN0LmNvZGUgPSByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIG5mdF9xdWV1ZV9zcmVnX2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJCXN0cnVjdCBuZnRfcmVncyAqcmVncywKKwkJCQljb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKK3sKKwlzdHJ1Y3QgbmZ0X3F1ZXVlICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwl1MzIgcXVldWUsIHJldDsKKworCXF1ZXVlID0gcmVncy0+ZGF0YVtwcml2LT5zcmVnX3FudW1dOworCisJcmV0ID0gTkZfUVVFVUVfTlIocXVldWUpOworCWlmIChwcml2LT5mbGFncyAmIE5GVF9RVUVVRV9GTEFHX0JZUEFTUykKKwkJcmV0IHw9IE5GX1ZFUkRJQ1RfRkxBR19RVUVVRV9CWVBBU1M7CisKKwlyZWdzLT52ZXJkaWN0LmNvZGUgPSByZXQ7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnRfcXVldWVfcG9saWN5W05GVEFfUVVFVUVfTUFYICsgMV0gPSB7CiAJW05GVEFfUVVFVUVfTlVNXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiAJW05GVEFfUVVFVUVfVE9UQUxdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKIAlbTkZUQV9RVUVVRV9GTEFHU10JPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtORlRBX1FVRVVFX1NSRUdfUU5VTV0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogfTsKIAogc3RhdGljIGludCBuZnRfcXVldWVfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAotCQkJICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCisJCQkgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCiB7CiAJc3RydWN0IG5mdF9xdWV1ZSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJdTMyIG1heGlkOwogCi0JaWYgKHRiW05GVEFfUVVFVUVfTlVNXSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWluaXRfaGFzaHJhbmRvbSgmamhhc2hfaW5pdHZhbCk7CiAJcHJpdi0+cXVldWVudW0gPSBudG9ocyhubGFfZ2V0X2JlMTYodGJbTkZUQV9RVUVVRV9OVU1dKSk7CiAKLQlpZiAodGJbTkZUQV9RVUVVRV9UT1RBTF0gIT0gTlVMTCkKKwlpZiAodGJbTkZUQV9RVUVVRV9UT1RBTF0pCiAJCXByaXYtPnF1ZXVlc190b3RhbCA9IG50b2hzKG5sYV9nZXRfYmUxNih0YltORlRBX1FVRVVFX1RPVEFMXSkpOwotCWlmICh0YltORlRBX1FVRVVFX0ZMQUdTXSAhPSBOVUxMKSB7CisJZWxzZQorCQlwcml2LT5xdWV1ZXNfdG90YWwgPSAxOworCisJaWYgKHByaXYtPnF1ZXVlc190b3RhbCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1heGlkID0gcHJpdi0+cXVldWVzX3RvdGFsIC0gMSArIHByaXYtPnF1ZXVlbnVtOworCWlmIChtYXhpZCA+IFUxNl9NQVgpCisJCXJldHVybiAtRVJBTkdFOworCisJaWYgKHRiW05GVEFfUVVFVUVfRkxBR1NdKSB7CiAJCXByaXYtPmZsYWdzID0gbnRvaHMobmxhX2dldF9iZTE2KHRiW05GVEFfUVVFVUVfRkxBR1NdKSk7CiAJCWlmIChwcml2LT5mbGFncyAmIH5ORlRfUVVFVUVfRkxBR19NQVNLKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC04Miw2ICsxMDcsMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBuZnRfcXVldWVfc3JlZ19pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQoreworCXN0cnVjdCBuZnRfcXVldWUgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCWludCBlcnI7CisKKwlwcml2LT5zcmVnX3FudW0gPSBuZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9RVUVVRV9TUkVHX1FOVU1dKTsKKwllcnIgPSBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfbG9hZChwcml2LT5zcmVnX3FudW0sIHNpemVvZih1MzIpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmICh0YltORlRBX1FVRVVFX0ZMQUdTXSkgeworCQlwcml2LT5mbGFncyA9IG50b2hzKG5sYV9nZXRfYmUxNih0YltORlRBX1FVRVVFX0ZMQUdTXSkpOworCQlpZiAocHJpdi0+ZmxhZ3MgJiB+TkZUX1FVRVVFX0ZMQUdfTUFTSykKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAocHJpdi0+ZmxhZ3MgJiBORlRfUVVFVUVfRkxBR19DUFVfRkFOT1VUKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG5mdF9xdWV1ZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwcikKIHsKIAljb25zdCBzdHJ1Y3QgbmZ0X3F1ZXVlICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKQEAgLTk3LDYgKzE0NSwyMSBAQAogCXJldHVybiAtMTsKIH0KIAorc3RhdGljIGludAorbmZ0X3F1ZXVlX3NyZWdfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpCit7CisJY29uc3Qgc3RydWN0IG5mdF9xdWV1ZSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisKKwlpZiAobmZ0X2R1bXBfcmVnaXN0ZXIoc2tiLCBORlRBX1FVRVVFX1NSRUdfUU5VTSwgcHJpdi0+c3JlZ19xbnVtKSB8fAorCSAgICBubGFfcHV0X2JlMTYoc2tiLCBORlRBX1FVRVVFX0ZMQUdTLCBodG9ucyhwcml2LT5mbGFncykpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIC0xOworfQorCiBzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X3F1ZXVlX3R5cGU7CiBzdGF0aWMgY29uc3Qgc3RydWN0IG5mdF9leHByX29wcyBuZnRfcXVldWVfb3BzID0gewogCS50eXBlCQk9ICZuZnRfcXVldWVfdHlwZSwKQEAgLTEwNiw5ICsxNjksMzUgQEAKIAkuZHVtcAkJPSBuZnRfcXVldWVfZHVtcCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfb3BzIG5mdF9xdWV1ZV9zcmVnX29wcyA9IHsKKwkudHlwZQkJPSAmbmZ0X3F1ZXVlX3R5cGUsCisJLnNpemUJCT0gTkZUX0VYUFJfU0laRShzaXplb2Yoc3RydWN0IG5mdF9xdWV1ZSkpLAorCS5ldmFsCQk9IG5mdF9xdWV1ZV9zcmVnX2V2YWwsCisJLmluaXQJCT0gbmZ0X3F1ZXVlX3NyZWdfaW5pdCwKKwkuZHVtcAkJPSBuZnRfcXVldWVfc3JlZ19kdW1wLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfZXhwcl9vcHMgKgorbmZ0X3F1ZXVlX3NlbGVjdF9vcHMoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKK3sKKwlpZiAodGJbTkZUQV9RVUVVRV9OVU1dICYmIHRiW05GVEFfUVVFVUVfU1JFR19RTlVNXSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlpbml0X2hhc2hyYW5kb20oJmpoYXNoX2luaXR2YWwpOworCisJaWYgKHRiW05GVEFfUVVFVUVfTlVNXSkKKwkJcmV0dXJuICZuZnRfcXVldWVfb3BzOworCisJaWYgKHRiW05GVEFfUVVFVUVfU1JFR19RTlVNXSkKKwkJcmV0dXJuICZuZnRfcXVldWVfc3JlZ19vcHM7CisKKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKK30KKwogc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9xdWV1ZV90eXBlIF9fcmVhZF9tb3N0bHkgPSB7CiAJLm5hbWUJCT0gInF1ZXVlIiwKLQkub3BzCQk9ICZuZnRfcXVldWVfb3BzLAorCS5zZWxlY3Rfb3BzCT0gJm5mdF9xdWV1ZV9zZWxlY3Rfb3BzLAogCS5wb2xpY3kJCT0gbmZ0X3F1ZXVlX3BvbGljeSwKIAkubWF4YXR0cgk9IE5GVEFfUVVFVUVfTUFYLAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X3F1b3RhLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9xdW90YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMDEwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9xdW90YS5jCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFBhYmxvIE5laXJhIEF5dXNvIDxwYWJsb0BuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CisKK3N0cnVjdCBuZnRfcXVvdGEgeworCXU2NAkJcXVvdGE7CisJYm9vbAkJaW52ZXJ0OworCWF0b21pYzY0X3QJcmVtYWluOworfTsKKworc3RhdGljIGlubGluZSBib29sIG5mdF9vdmVycXVvdGEoc3RydWN0IG5mdF9xdW90YSAqcHJpdiwKKwkJCQkgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCit7CisJcmV0dXJuIGF0b21pYzY0X3N1Yl9yZXR1cm4ocGt0LT5za2ItPmxlbiwgJnByaXYtPnJlbWFpbikgPCAwOworfQorCitzdGF0aWMgdm9pZCBuZnRfcXVvdGFfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQkgICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCisJCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKK3sKKwlzdHJ1Y3QgbmZ0X3F1b3RhICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKworCWlmIChuZnRfb3ZlcnF1b3RhKHByaXYsIHBrdCkgXiBwcml2LT5pbnZlcnQpCisJCXJlZ3MtPnZlcmRpY3QuY29kZSA9IE5GVF9CUkVBSzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF9xdW90YV9wb2xpY3lbTkZUQV9RVU9UQV9NQVggKyAxXSA9IHsKKwlbTkZUQV9RVU9UQV9CWVRFU10JPSB7IC50eXBlID0gTkxBX1U2NCB9LAorCVtORlRBX1FVT1RBX0ZMQUdTXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCit9OworCitzdGF0aWMgaW50IG5mdF9xdW90YV9pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCQkgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCit7CisJc3RydWN0IG5mdF9xdW90YSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJdTMyIGZsYWdzID0gMDsKKwl1NjQgcXVvdGE7CisKKwlpZiAoIXRiW05GVEFfUVVPVEFfQllURVNdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXF1b3RhID0gYmU2NF90b19jcHUobmxhX2dldF9iZTY0KHRiW05GVEFfUVVPVEFfQllURVNdKSk7CisJaWYgKHF1b3RhID4gUzY0X01BWCkKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisKKwlpZiAodGJbTkZUQV9RVU9UQV9GTEFHU10pIHsKKwkJZmxhZ3MgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9RVU9UQV9GTEFHU10pKTsKKwkJaWYgKGZsYWdzICYgfk5GVF9RVU9UQV9GX0lOVikKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByaXYtPnF1b3RhID0gcXVvdGE7CisJcHJpdi0+aW52ZXJ0ID0gKGZsYWdzICYgTkZUX1FVT1RBX0ZfSU5WKSA/IHRydWUgOiBmYWxzZTsKKwlhdG9taWM2NF9zZXQoJnByaXYtPnJlbWFpbiwgcXVvdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmZ0X3F1b3RhX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByKQoreworCWNvbnN0IHN0cnVjdCBuZnRfcXVvdGEgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCXUzMiBmbGFncyA9IHByaXYtPmludmVydCA/IE5GVF9RVU9UQV9GX0lOViA6IDA7CisKKwlpZiAobmxhX3B1dF9iZTY0KHNrYiwgTkZUQV9RVU9UQV9CWVRFUywgY3B1X3RvX2JlNjQocHJpdi0+cXVvdGEpLAorCQkJIE5GVEFfUVVPVEFfUEFEKSB8fAorCSAgICBubGFfcHV0X2JlMzIoc2tiLCBORlRBX1FVT1RBX0ZMQUdTLCBodG9ubChmbGFncykpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9xdW90YV90eXBlOworc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfZXhwcl9vcHMgbmZ0X3F1b3RhX29wcyA9IHsKKwkudHlwZQkJPSAmbmZ0X3F1b3RhX3R5cGUsCisJLnNpemUJCT0gTkZUX0VYUFJfU0laRShzaXplb2Yoc3RydWN0IG5mdF9xdW90YSkpLAorCS5ldmFsCQk9IG5mdF9xdW90YV9ldmFsLAorCS5pbml0CQk9IG5mdF9xdW90YV9pbml0LAorCS5kdW1wCQk9IG5mdF9xdW90YV9kdW1wLAorfTsKKworc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9xdW90YV90eXBlIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUJCT0gInF1b3RhIiwKKwkub3BzCQk9ICZuZnRfcXVvdGFfb3BzLAorCS5wb2xpY3kJCT0gbmZ0X3F1b3RhX3BvbGljeSwKKwkubWF4YXR0cgk9IE5GVEFfUVVPVEFfTUFYLAorCS5mbGFncwkJPSBORlRfRVhQUl9TVEFURUZVTCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBuZnRfcXVvdGFfbW9kdWxlX2luaXQodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIG5mdF9yZWdpc3Rlcl9leHByKCZuZnRfcXVvdGFfdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZnRfcXVvdGFfbW9kdWxlX2V4aXQodm9pZCkKK3sKKyAgICAgICAgbmZ0X3VucmVnaXN0ZXJfZXhwcigmbmZ0X3F1b3RhX3R5cGUpOworfQorCittb2R1bGVfaW5pdChuZnRfcXVvdGFfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQobmZ0X3F1b3RhX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUGFibG8gTmVpcmEgQXl1c28gPHBhYmxvQG5ldGZpbHRlci5vcmc+Iik7CitNT0RVTEVfQUxJQVNfTkZUX0VYUFIoInF1b3RhIik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9yYW5nZS5jIGIvbmV0L25ldGZpbHRlci9uZnRfcmFuZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmQ1MzU4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfcmFuZ2UuYwpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBQYWJsbyBOZWlyYSBBeXVzbyA8cGFibG9AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19jb3JlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXMuaD4KKworc3RydWN0IG5mdF9yYW5nZV9leHByIHsKKwlzdHJ1Y3QgbmZ0X2RhdGEJCWRhdGFfZnJvbTsKKwlzdHJ1Y3QgbmZ0X2RhdGEJCWRhdGFfdG87CisJZW51bSBuZnRfcmVnaXN0ZXJzCXNyZWc6ODsKKwl1OAkJCWxlbjsKKwllbnVtIG5mdF9yYW5nZV9vcHMJb3A6ODsKK307CisKK3N0YXRpYyB2b2lkIG5mdF9yYW5nZV9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCisJCQkgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCit7CisJY29uc3Qgc3RydWN0IG5mdF9yYW5nZV9leHByICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwlib29sIG1pc21hdGNoOworCWludCBkMSwgZDI7CisKKwlkMSA9IG1lbWNtcCgmcmVncy0+ZGF0YVtwcml2LT5zcmVnXSwgJnByaXYtPmRhdGFfZnJvbSwgcHJpdi0+bGVuKTsKKwlkMiA9IG1lbWNtcCgmcmVncy0+ZGF0YVtwcml2LT5zcmVnXSwgJnByaXYtPmRhdGFfdG8sIHByaXYtPmxlbik7CisJc3dpdGNoIChwcml2LT5vcCkgeworCWNhc2UgTkZUX1JBTkdFX0VROgorCQltaXNtYXRjaCA9IChkMSA8IDAgfHwgZDIgPiAwKTsKKwkJYnJlYWs7CisJY2FzZSBORlRfUkFOR0VfTkVROgorCQltaXNtYXRjaCA9IChkMSA+PSAwICYmIGQyIDw9IDApOworCQlicmVhazsKKwl9CisKKwlpZiAobWlzbWF0Y2gpCisJCXJlZ3MtPnZlcmRpY3QuY29kZSA9IE5GVF9CUkVBSzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF9yYW5nZV9wb2xpY3lbTkZUQV9SQU5HRV9NQVggKyAxXSA9IHsKKwlbTkZUQV9SQU5HRV9TUkVHXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtORlRBX1JBTkdFX09QXQkJCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbTkZUQV9SQU5HRV9GUk9NX0RBVEFdCQk9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCisJW05GVEFfUkFOR0VfVE9fREFUQV0JCT0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKK307CisKK3N0YXRpYyBpbnQgbmZ0X3JhbmdlX2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCit7CisJc3RydWN0IG5mdF9yYW5nZV9leHByICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwlzdHJ1Y3QgbmZ0X2RhdGFfZGVzYyBkZXNjX2Zyb20sIGRlc2NfdG87CisJaW50IGVycjsKKworCWVyciA9IG5mdF9kYXRhX2luaXQoTlVMTCwgJnByaXYtPmRhdGFfZnJvbSwgc2l6ZW9mKHByaXYtPmRhdGFfZnJvbSksCisJCQkgICAgJmRlc2NfZnJvbSwgdGJbTkZUQV9SQU5HRV9GUk9NX0RBVEFdKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IG5mdF9kYXRhX2luaXQoTlVMTCwgJnByaXYtPmRhdGFfdG8sIHNpemVvZihwcml2LT5kYXRhX3RvKSwKKwkJCSAgICAmZGVzY190bywgdGJbTkZUQV9SQU5HRV9UT19EQVRBXSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyMTsKKworCWlmIChkZXNjX2Zyb20ubGVuICE9IGRlc2NfdG8ubGVuKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyMjsKKwl9CisKKwlwcml2LT5zcmVnID0gbmZ0X3BhcnNlX3JlZ2lzdGVyKHRiW05GVEFfUkFOR0VfU1JFR10pOworCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKHByaXYtPnNyZWcsIGRlc2NfZnJvbS5sZW4pOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycjI7CisKKwlwcml2LT5vcCAgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9SQU5HRV9PUF0pKTsKKwlwcml2LT5sZW4gPSBkZXNjX2Zyb20ubGVuOworCXJldHVybiAwOworZXJyMjoKKwluZnRfZGF0YV91bmluaXQoJnByaXYtPmRhdGFfdG8sIGRlc2NfdG8udHlwZSk7CitlcnIxOgorCW5mdF9kYXRhX3VuaW5pdCgmcHJpdi0+ZGF0YV9mcm9tLCBkZXNjX2Zyb20udHlwZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBuZnRfcmFuZ2VfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpCit7CisJY29uc3Qgc3RydWN0IG5mdF9yYW5nZV9leHByICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKworCWlmIChuZnRfZHVtcF9yZWdpc3Rlcihza2IsIE5GVEFfUkFOR0VfU1JFRywgcHJpdi0+c3JlZykpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX1JBTkdFX09QLCBodG9ubChwcml2LT5vcCkpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWlmIChuZnRfZGF0YV9kdW1wKHNrYiwgTkZUQV9SQU5HRV9GUk9NX0RBVEEsICZwcml2LT5kYXRhX2Zyb20sCisJCQkgIE5GVF9EQVRBX1ZBTFVFLCBwcml2LT5sZW4pIDwgMCB8fAorCSAgICBuZnRfZGF0YV9kdW1wKHNrYiwgTkZUQV9SQU5HRV9UT19EQVRBLCAmcHJpdi0+ZGF0YV90bywKKwkJCSAgTkZUX0RBVEFfVkFMVUUsIHByaXYtPmxlbikgPCAwKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9yYW5nZV90eXBlOworc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfZXhwcl9vcHMgbmZ0X3JhbmdlX29wcyA9IHsKKwkudHlwZQkJPSAmbmZ0X3JhbmdlX3R5cGUsCisJLnNpemUJCT0gTkZUX0VYUFJfU0laRShzaXplb2Yoc3RydWN0IG5mdF9yYW5nZV9leHByKSksCisJLmV2YWwJCT0gbmZ0X3JhbmdlX2V2YWwsCisJLmluaXQJCT0gbmZ0X3JhbmdlX2luaXQsCisJLmR1bXAJCT0gbmZ0X3JhbmdlX2R1bXAsCit9OworCitzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X3JhbmdlX3R5cGUgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJPSAicmFuZ2UiLAorCS5vcHMJCT0gJm5mdF9yYW5nZV9vcHMsCisJLnBvbGljeQkJPSBuZnRfcmFuZ2VfcG9saWN5LAorCS5tYXhhdHRyCT0gTkZUQV9SQU5HRV9NQVgsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworaW50IF9faW5pdCBuZnRfcmFuZ2VfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbmZ0X3JlZ2lzdGVyX2V4cHIoJm5mdF9yYW5nZV90eXBlKTsKK30KKwordm9pZCBuZnRfcmFuZ2VfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwluZnRfdW5yZWdpc3Rlcl9leHByKCZuZnRfcmFuZ2VfdHlwZSk7Cit9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9yYnRyZWUuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3JidHJlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDczOTM2Li4wMDAwMDAwCi0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X3JidHJlZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIERldmVsb3BtZW50IG9mIHRoaXMgY29kZSBmdW5kZWQgYnkgQXN0YXJvIEFHIChodHRwOi8vd3d3LmFzdGFyby5jb20vKQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXMuaD4KLQotc3RhdGljIERFRklORV9TUElOTE9DSyhuZnRfcmJ0cmVlX2xvY2spOwotCi1zdHJ1Y3QgbmZ0X3JidHJlZSB7Ci0Jc3RydWN0IHJiX3Jvb3QJCXJvb3Q7Ci19OwotCi1zdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtIHsKLQlzdHJ1Y3QgcmJfbm9kZQkJbm9kZTsKLQlzdHJ1Y3QgbmZ0X3NldF9leHQJZXh0OwotfTsKLQotc3RhdGljIGJvb2wgbmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQoY29uc3Qgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlKQotewotCXJldHVybiBuZnRfc2V0X2V4dF9leGlzdHMoJnJiZS0+ZXh0LCBORlRfU0VUX0VYVF9GTEFHUykgJiYKLQkgICAgICAgKCpuZnRfc2V0X2V4dF9mbGFncygmcmJlLT5leHQpICYgTkZUX1NFVF9FTEVNX0lOVEVSVkFMX0VORCk7Ci19Ci0KLXN0YXRpYyBib29sIG5mdF9yYnRyZWVfZXF1YWwoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwgY29uc3Qgdm9pZCAqdGhpcywKLQkJCSAgICAgY29uc3Qgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqaW50ZXJ2YWwpCi17Ci0JcmV0dXJuIG1lbWNtcCh0aGlzLCBuZnRfc2V0X2V4dF9rZXkoJmludGVydmFsLT5leHQpLCBzZXQtPmtsZW4pID09IDA7Ci19Ci0KLXN0YXRpYyBib29sIG5mdF9yYnRyZWVfbG9va3VwKGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCSAgICAgIGNvbnN0IHUzMiAqa2V5LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9leHQgKipleHQpCi17Ci0JY29uc3Qgc3RydWN0IG5mdF9yYnRyZWUgKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKLQljb25zdCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUsICppbnRlcnZhbCA9IE5VTEw7Ci0JdTggZ2VubWFzayA9IG5mdF9nZW5tYXNrX2N1cihuZXQpOwotCWNvbnN0IHN0cnVjdCByYl9ub2RlICpwYXJlbnQ7Ci0JY29uc3Qgdm9pZCAqdGhpczsKLQlpbnQgZDsKLQotCXNwaW5fbG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKLQlwYXJlbnQgPSBwcml2LT5yb290LnJiX25vZGU7Ci0Jd2hpbGUgKHBhcmVudCAhPSBOVUxMKSB7Ci0JCXJiZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSwgbm9kZSk7Ci0KLQkJdGhpcyA9IG5mdF9zZXRfZXh0X2tleSgmcmJlLT5leHQpOwotCQlkID0gbWVtY21wKHRoaXMsIGtleSwgc2V0LT5rbGVuKTsKLQkJaWYgKGQgPCAwKSB7Ci0JCQlwYXJlbnQgPSBwYXJlbnQtPnJiX2xlZnQ7Ci0JCQkvKiBJbiBjYXNlIG9mIGFkamFjZW50IHJhbmdlcywgd2UgYWx3YXlzIHNlZSB0aGUgaGlnaAotCQkJICogcGFydCBvZiB0aGUgcmFuZ2UgaW4gZmlyc3QgcGxhY2UsIGJlZm9yZSB0aGUgbG93IG9uZS4KLQkJCSAqIFNvIGRvbid0IHVwZGF0ZSBpbnRlcnZhbCBpZiB0aGUga2V5cyBhcmUgZXF1YWwuCi0JCQkgKi8KLQkJCWlmIChpbnRlcnZhbCAmJiBuZnRfcmJ0cmVlX2VxdWFsKHNldCwgdGhpcywgaW50ZXJ2YWwpKQotCQkJCWNvbnRpbnVlOwotCQkJaW50ZXJ2YWwgPSByYmU7Ci0JCX0gZWxzZSBpZiAoZCA+IDApCi0JCQlwYXJlbnQgPSBwYXJlbnQtPnJiX3JpZ2h0OwotCQllbHNlIHsKLWZvdW5kOgotCQkJaWYgKCFuZnRfc2V0X2VsZW1fYWN0aXZlKCZyYmUtPmV4dCwgZ2VubWFzaykpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQtPnJiX2xlZnQ7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAobmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQocmJlKSkKLQkJCQlnb3RvIG91dDsKLQkJCXNwaW5fdW5sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOwotCi0JCQkqZXh0ID0gJnJiZS0+ZXh0OwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfSU5URVJWQUwgJiYgaW50ZXJ2YWwgIT0gTlVMTCkgewotCQlyYmUgPSBpbnRlcnZhbDsKLQkJZ290byBmb3VuZDsKLQl9Ci1vdXQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50IF9fbmZ0X3JidHJlZV9pbnNlcnQoY29uc3Qgc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJICAgICAgIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKm5ldykKLXsKLQlzdHJ1Y3QgbmZ0X3JidHJlZSAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCXU4IGdlbm1hc2sgPSBuZnRfZ2VubWFza19uZXh0KG5ldCk7Ci0Jc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlOwotCXN0cnVjdCByYl9ub2RlICpwYXJlbnQsICoqcDsKLQlpbnQgZDsKLQotCXBhcmVudCA9IE5VTEw7Ci0JcCA9ICZwcml2LT5yb290LnJiX25vZGU7Ci0Jd2hpbGUgKCpwICE9IE5VTEwpIHsKLQkJcGFyZW50ID0gKnA7Ci0JCXJiZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSwgbm9kZSk7Ci0JCWQgPSBtZW1jbXAobmZ0X3NldF9leHRfa2V5KCZyYmUtPmV4dCksCi0JCQkgICBuZnRfc2V0X2V4dF9rZXkoJm5ldy0+ZXh0KSwKLQkJCSAgIHNldC0+a2xlbik7Ci0JCWlmIChkIDwgMCkKLQkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OwotCQllbHNlIGlmIChkID4gMCkKLQkJCXAgPSAmcGFyZW50LT5yYl9yaWdodDsKLQkJZWxzZSB7Ci0JCQlpZiAobmZ0X3NldF9lbGVtX2FjdGl2ZSgmcmJlLT5leHQsIGdlbm1hc2spKSB7Ci0JCQkJaWYgKG5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKHJiZSkgJiYKLQkJCQkgICAgIW5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKG5ldykpCi0JCQkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OwotCQkJCWVsc2UgaWYgKCFuZnRfcmJ0cmVlX2ludGVydmFsX2VuZChyYmUpICYmCi0JCQkJCSBuZnRfcmJ0cmVlX2ludGVydmFsX2VuZChuZXcpKQotCQkJCQlwID0gJnBhcmVudC0+cmJfcmlnaHQ7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gLUVFWElTVDsKLQkJCX0KLQkJfQotCX0KLQlyYl9saW5rX25vZGUoJm5ldy0+bm9kZSwgcGFyZW50LCBwKTsKLQlyYl9pbnNlcnRfY29sb3IoJm5ldy0+bm9kZSwgJnByaXYtPnJvb3QpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG5mdF9yYnRyZWVfaW5zZXJ0KGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCSAgICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKLXsKLQlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUgPSBlbGVtLT5wcml2OwotCWludCBlcnI7Ci0KLQlzcGluX2xvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7Ci0JZXJyID0gX19uZnRfcmJ0cmVlX2luc2VydChuZXQsIHNldCwgcmJlKTsKLQlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIG5mdF9yYnRyZWVfcmVtb3ZlKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQotewotCXN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0Jc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlID0gZWxlbS0+cHJpdjsKLQotCXNwaW5fbG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKLQlyYl9lcmFzZSgmcmJlLT5ub2RlLCAmcHJpdi0+cm9vdCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5mdF9yYnRyZWVfYWN0aXZhdGUoY29uc3Qgc3RydWN0IG5ldCAqbmV0LAotCQkJCWNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkJY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKLXsKLQlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUgPSBlbGVtLT5wcml2OwotCi0JbmZ0X3NldF9lbGVtX2NoYW5nZV9hY3RpdmUobmV0LCBzZXQsICZyYmUtPmV4dCk7Ci19Ci0KLXN0YXRpYyB2b2lkICpuZnRfcmJ0cmVlX2RlYWN0aXZhdGUoY29uc3Qgc3RydWN0IG5ldCAqbmV0LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkJICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKLXsKLQljb25zdCBzdHJ1Y3QgbmZ0X3JidHJlZSAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCWNvbnN0IHN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBwcml2LT5yb290LnJiX25vZGU7Ci0Jc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlLCAqdGhpcyA9IGVsZW0tPnByaXY7Ci0JdTggZ2VubWFzayA9IG5mdF9nZW5tYXNrX25leHQobmV0KTsKLQlpbnQgZDsKLQotCXdoaWxlIChwYXJlbnQgIT0gTlVMTCkgewotCQlyYmUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0sIG5vZGUpOwotCi0JCWQgPSBtZW1jbXAobmZ0X3NldF9leHRfa2V5KCZyYmUtPmV4dCksICZlbGVtLT5rZXkudmFsLAotCQkJCQkgICBzZXQtPmtsZW4pOwotCQlpZiAoZCA8IDApCi0JCQlwYXJlbnQgPSBwYXJlbnQtPnJiX2xlZnQ7Ci0JCWVsc2UgaWYgKGQgPiAwKQotCQkJcGFyZW50ID0gcGFyZW50LT5yYl9yaWdodDsKLQkJZWxzZSB7Ci0JCQlpZiAoIW5mdF9zZXRfZWxlbV9hY3RpdmUoJnJiZS0+ZXh0LCBnZW5tYXNrKSkgewotCQkJCXBhcmVudCA9IHBhcmVudC0+cmJfbGVmdDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChuZnRfcmJ0cmVlX2ludGVydmFsX2VuZChyYmUpICYmCi0JCQkgICAgIW5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKHRoaXMpKSB7Ci0JCQkJcGFyZW50ID0gcGFyZW50LT5yYl9sZWZ0OwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmICghbmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQocmJlKSAmJgotCQkJCSAgIG5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKHRoaXMpKSB7Ci0JCQkJcGFyZW50ID0gcGFyZW50LT5yYl9yaWdodDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCW5mdF9zZXRfZWxlbV9jaGFuZ2VfYWN0aXZlKG5ldCwgc2V0LCAmcmJlLT5leHQpOwotCQkJcmV0dXJuIHJiZTsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgbmZ0X3JidHJlZV93YWxrKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCi0JCQkgICAgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCSAgICBzdHJ1Y3QgbmZ0X3NldF9pdGVyICppdGVyKQotewotCWNvbnN0IHN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0Jc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlOwotCXN0cnVjdCBuZnRfc2V0X2VsZW0gZWxlbTsKLQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKLQotCXNwaW5fbG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKLQlmb3IgKG5vZGUgPSByYl9maXJzdCgmcHJpdi0+cm9vdCk7IG5vZGUgIT0gTlVMTDsgbm9kZSA9IHJiX25leHQobm9kZSkpIHsKLQkJcmJlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSwgbm9kZSk7Ci0KLQkJaWYgKGl0ZXItPmNvdW50IDwgaXRlci0+c2tpcCkKLQkJCWdvdG8gY29udDsKLQkJaWYgKCFuZnRfc2V0X2VsZW1fYWN0aXZlKCZyYmUtPmV4dCwgaXRlci0+Z2VubWFzaykpCi0JCQlnb3RvIGNvbnQ7Ci0KLQkJZWxlbS5wcml2ID0gcmJlOwotCi0JCWl0ZXItPmVyciA9IGl0ZXItPmZuKGN0eCwgc2V0LCBpdGVyLCAmZWxlbSk7Ci0JCWlmIChpdGVyLT5lcnIgPCAwKSB7Ci0JCQlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKLQkJCXJldHVybjsKLQkJfQotY29udDoKLQkJaXRlci0+Y291bnQrKzsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbmZ0X3JidHJlZV9wcml2c2l6ZShjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgbmxhW10pCi17Ci0JcmV0dXJuIHNpemVvZihzdHJ1Y3QgbmZ0X3JidHJlZSk7Ci19Ci0KLXN0YXRpYyBpbnQgbmZ0X3JidHJlZV9pbml0KGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLAotCQkJICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IG5sYVtdKQotewotCXN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0KLQlwcml2LT5yb290ID0gUkJfUk9PVDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbmZ0X3JidHJlZV9kZXN0cm95KGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQpCi17Ci0Jc3RydWN0IG5mdF9yYnRyZWUgKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKLQlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmU7Ci0Jc3RydWN0IHJiX25vZGUgKm5vZGU7Ci0KLQl3aGlsZSAoKG5vZGUgPSBwcml2LT5yb290LnJiX25vZGUpICE9IE5VTEwpIHsKLQkJcmJfZXJhc2Uobm9kZSwgJnByaXYtPnJvb3QpOwotCQlyYmUgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBub2RlKTsKLQkJbmZ0X3NldF9lbGVtX2Rlc3Ryb3koc2V0LCByYmUpOwotCX0KLX0KLQotc3RhdGljIGJvb2wgbmZ0X3JidHJlZV9lc3RpbWF0ZShjb25zdCBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLCB1MzIgZmVhdHVyZXMsCi0JCQkJc3RydWN0IG5mdF9zZXRfZXN0aW1hdGUgKmVzdCkKLXsKLQl1bnNpZ25lZCBpbnQgbnNpemU7Ci0KLQluc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtKTsKLQlpZiAoZGVzYy0+c2l6ZSkKLQkJZXN0LT5zaXplID0gc2l6ZW9mKHN0cnVjdCBuZnRfcmJ0cmVlKSArIGRlc2MtPnNpemUgKiBuc2l6ZTsKLQllbHNlCi0JCWVzdC0+c2l6ZSA9IG5zaXplOwotCi0JZXN0LT5jbGFzcyA9IE5GVF9TRVRfQ0xBU1NfT19MT0dfTjsKLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgc3RydWN0IG5mdF9zZXRfb3BzIG5mdF9yYnRyZWVfb3BzIF9fcmVhZF9tb3N0bHkgPSB7Ci0JLnByaXZzaXplCT0gbmZ0X3JidHJlZV9wcml2c2l6ZSwKLQkuZWxlbXNpemUJPSBvZmZzZXRvZihzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBleHQpLAotCS5lc3RpbWF0ZQk9IG5mdF9yYnRyZWVfZXN0aW1hdGUsCi0JLmluaXQJCT0gbmZ0X3JidHJlZV9pbml0LAotCS5kZXN0cm95CT0gbmZ0X3JidHJlZV9kZXN0cm95LAotCS5pbnNlcnQJCT0gbmZ0X3JidHJlZV9pbnNlcnQsCi0JLnJlbW92ZQkJPSBuZnRfcmJ0cmVlX3JlbW92ZSwKLQkuZGVhY3RpdmF0ZQk9IG5mdF9yYnRyZWVfZGVhY3RpdmF0ZSwKLQkuYWN0aXZhdGUJPSBuZnRfcmJ0cmVlX2FjdGl2YXRlLAotCS5sb29rdXAJCT0gbmZ0X3JidHJlZV9sb29rdXAsCi0JLndhbGsJCT0gbmZ0X3JidHJlZV93YWxrLAotCS5mZWF0dXJlcwk9IE5GVF9TRVRfSU5URVJWQUwgfCBORlRfU0VUX01BUCwKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBuZnRfcmJ0cmVlX21vZHVsZV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG5mdF9yZWdpc3Rlcl9zZXQoJm5mdF9yYnRyZWVfb3BzKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG5mdF9yYnRyZWVfbW9kdWxlX2V4aXQodm9pZCkKLXsKLQluZnRfdW5yZWdpc3Rlcl9zZXQoJm5mdF9yYnRyZWVfb3BzKTsKLX0KLQotbW9kdWxlX2luaXQobmZ0X3JidHJlZV9tb2R1bGVfaW5pdCk7Ci1tb2R1bGVfZXhpdChuZnRfcmJ0cmVlX21vZHVsZV9leGl0KTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Iik7Ci1NT0RVTEVfQUxJQVNfTkZUX1NFVCgpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0LmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9yZWplY3QuYwppbmRleCAwNTIyZmM5Li5jNjRkZTNmNyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0LmMKQEAgLTI2LDExICsyNiwyNyBAQAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKG5mdF9yZWplY3RfcG9saWN5KTsKIAoraW50IG5mdF9yZWplY3RfdmFsaWRhdGUoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJCWNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCWNvbnN0IHN0cnVjdCBuZnRfZGF0YSAqKmRhdGEpCit7CisJcmV0dXJuIG5mdF9jaGFpbl92YWxpZGF0ZV9ob29rcyhjdHgtPmNoYWluLAorCQkJCQkoMSA8PCBORl9JTkVUX0xPQ0FMX0lOKSB8CisJCQkJCSgxIDw8IE5GX0lORVRfRk9SV0FSRCkgfAorCQkJCQkoMSA8PCBORl9JTkVUX0xPQ0FMX09VVCkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZ0X3JlamVjdF92YWxpZGF0ZSk7CisKIGludCBuZnRfcmVqZWN0X2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKIAkJICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKIAkJICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQogewogCXN0cnVjdCBuZnRfcmVqZWN0ICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwlpbnQgZXJyOworCisJZXJyID0gbmZ0X3JlamVjdF92YWxpZGF0ZShjdHgsIGV4cHIsIE5VTEwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCiAJaWYgKHRiW05GVEFfUkVKRUNUX1RZUEVdID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0X2luZXQuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pbmV0LmMKaW5kZXggNzU5Y2E1Mi4uZTc5ZDljYSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0X2luZXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9yZWplY3RfaW5ldC5jCkBAIC02Niw3ICs2NiwxMSBAQAogCQkJCWNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQogewogCXN0cnVjdCBuZnRfcmVqZWN0ICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKLQlpbnQgaWNtcF9jb2RlOworCWludCBpY21wX2NvZGUsIGVycjsKKworCWVyciA9IG5mdF9yZWplY3RfdmFsaWRhdGUoY3R4LCBleHByLCBOVUxMKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKIAogCWlmICh0YltORlRBX1JFSkVDVF9UWVBFXSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEyNCw2ICsxMjgsNyBAQAogCS5ldmFsCQk9IG5mdF9yZWplY3RfaW5ldF9ldmFsLAogCS5pbml0CQk9IG5mdF9yZWplY3RfaW5ldF9pbml0LAogCS5kdW1wCQk9IG5mdF9yZWplY3RfaW5ldF9kdW1wLAorCS52YWxpZGF0ZQk9IG5mdF9yZWplY3RfdmFsaWRhdGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X3JlamVjdF9pbmV0X3R5cGUgX19yZWFkX21vc3RseSA9IHsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X3NldF9oYXNoLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9zZXRfaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OTRjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9zZXRfaGFzaC5jCkBAIC0wLDAgKzEsNDA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTQgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBEZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgZnVuZGVkIGJ5IEFzdGFybyBBRyAoaHR0cDovL3d3dy5hc3Rhcm8uY29tLykKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvamhhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvcmhhc2h0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgorCisvKiBXZSB0YXJnZXQgYSBoYXNoIHRhYmxlIHNpemUgb2YgNCwgZWxlbWVudCBoaW50IGlzIDc1JSBvZiBmaW5hbCBzaXplICovCisjZGVmaW5lIE5GVF9IQVNIX0VMRU1FTlRfSElOVCAzCisKK3N0cnVjdCBuZnRfaGFzaCB7CisJc3RydWN0IHJoYXNodGFibGUJCWh0OworCXN0cnVjdCBkZWxheWVkX3dvcmsJCWdjX3dvcms7Cit9OworCitzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSB7CisJc3RydWN0IHJoYXNoX2hlYWQJCW5vZGU7CisJc3RydWN0IG5mdF9zZXRfZXh0CQlleHQ7Cit9OworCitzdHJ1Y3QgbmZ0X2hhc2hfY21wX2FyZyB7CisJY29uc3Qgc3RydWN0IG5mdF9zZXQJCSpzZXQ7CisJY29uc3QgdTMyCQkJKmtleTsKKwl1OAkJCQlnZW5tYXNrOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBuZnRfaGFzaF9wYXJhbXM7CisKK3N0YXRpYyBpbmxpbmUgdTMyIG5mdF9oYXNoX2tleShjb25zdCB2b2lkICpkYXRhLCB1MzIgbGVuLCB1MzIgc2VlZCkKK3sKKwljb25zdCBzdHJ1Y3QgbmZ0X2hhc2hfY21wX2FyZyAqYXJnID0gZGF0YTsKKworCXJldHVybiBqaGFzaChhcmctPmtleSwgbGVuLCBzZWVkKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbmZ0X2hhc2hfb2JqKGNvbnN0IHZvaWQgKmRhdGEsIHUzMiBsZW4sIHUzMiBzZWVkKQoreworCWNvbnN0IHN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZSA9IGRhdGE7CisKKwlyZXR1cm4gamhhc2gobmZ0X3NldF9leHRfa2V5KCZoZS0+ZXh0KSwgbGVuLCBzZWVkKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmZ0X2hhc2hfY21wKHN0cnVjdCByaGFzaHRhYmxlX2NvbXBhcmVfYXJnICphcmcsCisJCQkgICAgICAgY29uc3Qgdm9pZCAqcHRyKQoreworCWNvbnN0IHN0cnVjdCBuZnRfaGFzaF9jbXBfYXJnICp4ID0gYXJnLT5rZXk7CisJY29uc3Qgc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlID0gcHRyOworCisJaWYgKG1lbWNtcChuZnRfc2V0X2V4dF9rZXkoJmhlLT5leHQpLCB4LT5rZXksIHgtPnNldC0+a2xlbikpCisJCXJldHVybiAxOworCWlmIChuZnRfc2V0X2VsZW1fZXhwaXJlZCgmaGUtPmV4dCkpCisJCXJldHVybiAxOworCWlmICghbmZ0X3NldF9lbGVtX2FjdGl2ZSgmaGUtPmV4dCwgeC0+Z2VubWFzaykpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBuZnRfaGFzaF9sb29rdXAoY29uc3Qgc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAorCQkJICAgIGNvbnN0IHUzMiAqa2V5LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9leHQgKipleHQpCit7CisJc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJY29uc3Qgc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlOworCXN0cnVjdCBuZnRfaGFzaF9jbXBfYXJnIGFyZyA9IHsKKwkJLmdlbm1hc2sgPSBuZnRfZ2VubWFza19jdXIobmV0KSwKKwkJLnNldAkgPSBzZXQsCisJCS5rZXkJID0ga2V5LAorCX07CisKKwloZSA9IHJoYXNodGFibGVfbG9va3VwX2Zhc3QoJnByaXYtPmh0LCAmYXJnLCBuZnRfaGFzaF9wYXJhbXMpOworCWlmIChoZSAhPSBOVUxMKQorCQkqZXh0ID0gJmhlLT5leHQ7CisKKwlyZXR1cm4gISFoZTsKK30KKworc3RhdGljIGJvb2wgbmZ0X2hhc2hfdXBkYXRlKHN0cnVjdCBuZnRfc2V0ICpzZXQsIGNvbnN0IHUzMiAqa2V5LAorCQkJICAgIHZvaWQgKigqbmV3KShzdHJ1Y3QgbmZ0X3NldCAqLAorCQkJCQkgY29uc3Qgc3RydWN0IG5mdF9leHByICosCisJCQkJCSBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MpLAorCQkJICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCisJCQkgICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZXh0ICoqZXh0KQoreworCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOworCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZTsKKwlzdHJ1Y3QgbmZ0X2hhc2hfY21wX2FyZyBhcmcgPSB7CisJCS5nZW5tYXNrID0gTkZUX0dFTk1BU0tfQU5ZLAorCQkuc2V0CSA9IHNldCwKKwkJLmtleQkgPSBrZXksCisJfTsKKworCWhlID0gcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgmcHJpdi0+aHQsICZhcmcsIG5mdF9oYXNoX3BhcmFtcyk7CisJaWYgKGhlICE9IE5VTEwpCisJCWdvdG8gb3V0OworCisJaGUgPSBuZXcoc2V0LCBleHByLCByZWdzKTsKKwlpZiAoaGUgPT0gTlVMTCkKKwkJZ290byBlcnIxOworCWlmIChyaGFzaHRhYmxlX2xvb2t1cF9pbnNlcnRfa2V5KCZwcml2LT5odCwgJmFyZywgJmhlLT5ub2RlLAorCQkJCQkgbmZ0X2hhc2hfcGFyYW1zKSkKKwkJZ290byBlcnIyOworb3V0OgorCSpleHQgPSAmaGUtPmV4dDsKKwlyZXR1cm4gdHJ1ZTsKKworZXJyMjoKKwluZnRfc2V0X2VsZW1fZGVzdHJveShzZXQsIGhlKTsKK2VycjE6CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IG5mdF9oYXNoX2luc2VydChjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtLAorCQkJICAgc3RydWN0IG5mdF9zZXRfZXh0ICoqZXh0KQoreworCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOworCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZSA9IGVsZW0tPnByaXY7CisJc3RydWN0IG5mdF9oYXNoX2NtcF9hcmcgYXJnID0geworCQkuZ2VubWFzayA9IG5mdF9nZW5tYXNrX25leHQobmV0KSwKKwkJLnNldAkgPSBzZXQsCisJCS5rZXkJID0gZWxlbS0+a2V5LnZhbC5kYXRhLAorCX07CisJc3RydWN0IG5mdF9oYXNoX2VsZW0gKnByZXY7CisKKwlwcmV2ID0gcmhhc2h0YWJsZV9sb29rdXBfZ2V0X2luc2VydF9rZXkoJnByaXYtPmh0LCAmYXJnLCAmaGUtPm5vZGUsCisJCQkJCSAgICAgICBuZnRfaGFzaF9wYXJhbXMpOworCWlmIChJU19FUlIocHJldikpCisJCXJldHVybiBQVFJfRVJSKHByZXYpOworCWlmIChwcmV2KSB7CisJCSpleHQgPSAmcHJldi0+ZXh0OworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5mdF9oYXNoX2FjdGl2YXRlKGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2VsZW0gKmVsZW0pCit7CisJc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlID0gZWxlbS0+cHJpdjsKKworCW5mdF9zZXRfZWxlbV9jaGFuZ2VfYWN0aXZlKG5ldCwgc2V0LCAmaGUtPmV4dCk7CisJbmZ0X3NldF9lbGVtX2NsZWFyX2J1c3koJmhlLT5leHQpOworfQorCitzdGF0aWMgdm9pZCAqbmZ0X2hhc2hfZGVhY3RpdmF0ZShjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkJIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2VsZW0gKmVsZW0pCit7CisJc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlOworCXN0cnVjdCBuZnRfaGFzaF9jbXBfYXJnIGFyZyA9IHsKKwkJLmdlbm1hc2sgPSBuZnRfZ2VubWFza19uZXh0KG5ldCksCisJCS5zZXQJID0gc2V0LAorCQkua2V5CSA9IGVsZW0tPmtleS52YWwuZGF0YSwKKwl9OworCisJcmN1X3JlYWRfbG9jaygpOworCWhlID0gcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgmcHJpdi0+aHQsICZhcmcsIG5mdF9oYXNoX3BhcmFtcyk7CisJaWYgKGhlICE9IE5VTEwpIHsKKwkJaWYgKCFuZnRfc2V0X2VsZW1fbWFya19idXN5KCZoZS0+ZXh0KSB8fAorCQkgICAgIW5mdF9pc19hY3RpdmUobmV0LCAmaGUtPmV4dCkpCisJCQluZnRfc2V0X2VsZW1fY2hhbmdlX2FjdGl2ZShuZXQsIHNldCwgJmhlLT5leHQpOworCQllbHNlCisJCQloZSA9IE5VTEw7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIGhlOworfQorCitzdGF0aWMgdm9pZCBuZnRfaGFzaF9yZW1vdmUoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQoreworCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOworCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZSA9IGVsZW0tPnByaXY7CisKKwlyaGFzaHRhYmxlX3JlbW92ZV9mYXN0KCZwcml2LT5odCwgJmhlLT5ub2RlLCBuZnRfaGFzaF9wYXJhbXMpOworfQorCitzdGF0aWMgdm9pZCBuZnRfaGFzaF93YWxrKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkgIHN0cnVjdCBuZnRfc2V0X2l0ZXIgKml0ZXIpCit7CisJc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlOworCXN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgaHRpOworCXN0cnVjdCBuZnRfc2V0X2VsZW0gZWxlbTsKKwlpbnQgZXJyOworCisJZXJyID0gcmhhc2h0YWJsZV93YWxrX2luaXQoJnByaXYtPmh0LCAmaHRpLCBHRlBfS0VSTkVMKTsKKwlpdGVyLT5lcnIgPSBlcnI7CisJaWYgKGVycikKKwkJcmV0dXJuOworCisJZXJyID0gcmhhc2h0YWJsZV93YWxrX3N0YXJ0KCZodGkpOworCWlmIChlcnIgJiYgZXJyICE9IC1FQUdBSU4pIHsKKwkJaXRlci0+ZXJyID0gZXJyOworCQlnb3RvIG91dDsKKwl9CisKKwl3aGlsZSAoKGhlID0gcmhhc2h0YWJsZV93YWxrX25leHQoJmh0aSkpKSB7CisJCWlmIChJU19FUlIoaGUpKSB7CisJCQllcnIgPSBQVFJfRVJSKGhlKTsKKwkJCWlmIChlcnIgIT0gLUVBR0FJTikgeworCQkJCWl0ZXItPmVyciA9IGVycjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoaXRlci0+Y291bnQgPCBpdGVyLT5za2lwKQorCQkJZ290byBjb250OworCQlpZiAobmZ0X3NldF9lbGVtX2V4cGlyZWQoJmhlLT5leHQpKQorCQkJZ290byBjb250OworCQlpZiAoIW5mdF9zZXRfZWxlbV9hY3RpdmUoJmhlLT5leHQsIGl0ZXItPmdlbm1hc2spKQorCQkJZ290byBjb250OworCisJCWVsZW0ucHJpdiA9IGhlOworCisJCWl0ZXItPmVyciA9IGl0ZXItPmZuKGN0eCwgc2V0LCBpdGVyLCAmZWxlbSk7CisJCWlmIChpdGVyLT5lcnIgPCAwKQorCQkJZ290byBvdXQ7CisKK2NvbnQ6CisJCWl0ZXItPmNvdW50Kys7CisJfQorCitvdXQ6CisJcmhhc2h0YWJsZV93YWxrX3N0b3AoJmh0aSk7CisJcmhhc2h0YWJsZV93YWxrX2V4aXQoJmh0aSk7Cit9CisKK3N0YXRpYyB2b2lkIG5mdF9oYXNoX2djKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgbmZ0X3NldCAqc2V0OworCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZTsKKwlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXY7CisJc3RydWN0IG5mdF9zZXRfZ2NfYmF0Y2ggKmdjYiA9IE5VTEw7CisJc3RydWN0IHJoYXNodGFibGVfaXRlciBodGk7CisJaW50IGVycjsKKworCXByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG5mdF9oYXNoLCBnY193b3JrLndvcmspOworCXNldCAgPSBuZnRfc2V0X2NvbnRhaW5lcl9vZihwcml2KTsKKworCWVyciA9IHJoYXNodGFibGVfd2Fsa19pbml0KCZwcml2LT5odCwgJmh0aSwgR0ZQX0tFUk5FTCk7CisJaWYgKGVycikKKwkJZ290byBzY2hlZHVsZTsKKworCWVyciA9IHJoYXNodGFibGVfd2Fsa19zdGFydCgmaHRpKTsKKwlpZiAoZXJyICYmIGVyciAhPSAtRUFHQUlOKQorCQlnb3RvIG91dDsKKworCXdoaWxlICgoaGUgPSByaGFzaHRhYmxlX3dhbGtfbmV4dCgmaHRpKSkpIHsKKwkJaWYgKElTX0VSUihoZSkpIHsKKwkJCWlmIChQVFJfRVJSKGhlKSAhPSAtRUFHQUlOKQorCQkJCWdvdG8gb3V0OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIW5mdF9zZXRfZWxlbV9leHBpcmVkKCZoZS0+ZXh0KSkKKwkJCWNvbnRpbnVlOworCQlpZiAobmZ0X3NldF9lbGVtX21hcmtfYnVzeSgmaGUtPmV4dCkpCisJCQljb250aW51ZTsKKworCQlnY2IgPSBuZnRfc2V0X2djX2JhdGNoX2NoZWNrKHNldCwgZ2NiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGdjYiA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCXJoYXNodGFibGVfcmVtb3ZlX2Zhc3QoJnByaXYtPmh0LCAmaGUtPm5vZGUsIG5mdF9oYXNoX3BhcmFtcyk7CisJCWF0b21pY19kZWMoJnNldC0+bmVsZW1zKTsKKwkJbmZ0X3NldF9nY19iYXRjaF9hZGQoZ2NiLCBoZSk7CisJfQorb3V0OgorCXJoYXNodGFibGVfd2Fsa19zdG9wKCZodGkpOworCXJoYXNodGFibGVfd2Fsa19leGl0KCZodGkpOworCisJbmZ0X3NldF9nY19iYXRjaF9jb21wbGV0ZShnY2IpOworc2NoZWR1bGU6CisJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsICZwcml2LT5nY193b3JrLAorCQkJICAgbmZ0X3NldF9nY19pbnRlcnZhbChzZXQpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBuZnRfaGFzaF9wcml2c2l6ZShjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgbmxhW10pCit7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgbmZ0X2hhc2gpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIG5mdF9oYXNoX3BhcmFtcyA9IHsKKwkuaGVhZF9vZmZzZXQJCT0gb2Zmc2V0b2Yoc3RydWN0IG5mdF9oYXNoX2VsZW0sIG5vZGUpLAorCS5oYXNoZm4JCQk9IG5mdF9oYXNoX2tleSwKKwkub2JqX2hhc2hmbgkJPSBuZnRfaGFzaF9vYmosCisJLm9ial9jbXBmbgkJPSBuZnRfaGFzaF9jbXAsCisJLmF1dG9tYXRpY19zaHJpbmtpbmcJPSB0cnVlLAorfTsKKworc3RhdGljIGludCBuZnRfaGFzaF9pbml0KGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkgY29uc3Qgc3RydWN0IG5mdF9zZXRfZGVzYyAqZGVzYywKKwkJCSBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKK3sKKwlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKKwlzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zID0gbmZ0X2hhc2hfcGFyYW1zOworCWludCBlcnI7CisKKwlwYXJhbXMubmVsZW1faGludCA9IGRlc2MtPnNpemUgPzogTkZUX0hBU0hfRUxFTUVOVF9ISU5UOworCXBhcmFtcy5rZXlfbGVuCSAgPSBzZXQtPmtsZW47CisKKwllcnIgPSByaGFzaHRhYmxlX2luaXQoJnByaXYtPmh0LCAmcGFyYW1zKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCUlOSVRfREVGRVJSQUJMRV9XT1JLKCZwcml2LT5nY193b3JrLCBuZnRfaGFzaF9nYyk7CisJaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX1RJTUVPVVQpCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLCAmcHJpdi0+Z2Nfd29yaywKKwkJCQkgICBuZnRfc2V0X2djX2ludGVydmFsKHNldCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuZnRfaGFzaF9lbGVtX2Rlc3Ryb3kodm9pZCAqcHRyLCB2b2lkICphcmcpCit7CisJbmZ0X3NldF9lbGVtX2Rlc3Ryb3koKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICopYXJnLCBwdHIpOworfQorCitzdGF0aWMgdm9pZCBuZnRfaGFzaF9kZXN0cm95KGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQpCit7CisJc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPmdjX3dvcmspOworCXJoYXNodGFibGVfZnJlZV9hbmRfZGVzdHJveSgmcHJpdi0+aHQsIG5mdF9oYXNoX2VsZW1fZGVzdHJveSwKKwkJCQkgICAgKHZvaWQgKilzZXQpOworfQorCitzdGF0aWMgYm9vbCBuZnRfaGFzaF9lc3RpbWF0ZShjb25zdCBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLCB1MzIgZmVhdHVyZXMsCisJCQkgICAgICBzdHJ1Y3QgbmZ0X3NldF9lc3RpbWF0ZSAqZXN0KQoreworCXVuc2lnbmVkIGludCBlc2l6ZTsKKworCWVzaXplID0gc2l6ZW9mKHN0cnVjdCBuZnRfaGFzaF9lbGVtKTsKKwlpZiAoZGVzYy0+c2l6ZSkgeworCQllc3QtPnNpemUgPSBzaXplb2Yoc3RydWN0IG5mdF9oYXNoKSArCisJCQkgICAgcm91bmR1cF9wb3dfb2ZfdHdvKGRlc2MtPnNpemUgKiA0IC8gMykgKgorCQkJICAgIHNpemVvZihzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqKSArCisJCQkgICAgZGVzYy0+c2l6ZSAqIGVzaXplOworCX0gZWxzZSB7CisJCS8qIFJlc2l6aW5nIGhhcHBlbnMgd2hlbiB0aGUgbG9hZCBkcm9wcyBiZWxvdyAzMCUgb3IgZ29lcworCQkgKiBhYm92ZSA3NSUuIFRoZSBhdmVyYWdlIG9mIDUyLjUlIGxvYWQgKGFwcHJveGltYXRlZCBieSA1MCUpCisJCSAqIGlzIHVzZWQgZm9yIHRoZSBzaXplIGVzdGltYXRpb24gb2YgdGhlIGhhc2ggYnVja2V0cywKKwkJICogbWVhbmluZyB3ZSBjYWxjdWxhdGUgdHdvIGJ1Y2tldHMgcGVyIGVsZW1lbnQuCisJCSAqLworCQllc3QtPnNpemUgPSBlc2l6ZSArIDIgKiBzaXplb2Yoc3RydWN0IG5mdF9oYXNoX2VsZW0gKik7CisJfQorCisJZXN0LT5jbGFzcyA9IE5GVF9TRVRfQ0xBU1NfT18xOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZ0X3NldF9vcHMgbmZ0X2hhc2hfb3BzIF9fcmVhZF9tb3N0bHkgPSB7CisJLnByaXZzaXplICAgICAgID0gbmZ0X2hhc2hfcHJpdnNpemUsCisJLmVsZW1zaXplCT0gb2Zmc2V0b2Yoc3RydWN0IG5mdF9oYXNoX2VsZW0sIGV4dCksCisJLmVzdGltYXRlCT0gbmZ0X2hhc2hfZXN0aW1hdGUsCisJLmluaXQJCT0gbmZ0X2hhc2hfaW5pdCwKKwkuZGVzdHJveQk9IG5mdF9oYXNoX2Rlc3Ryb3ksCisJLmluc2VydAkJPSBuZnRfaGFzaF9pbnNlcnQsCisJLmFjdGl2YXRlCT0gbmZ0X2hhc2hfYWN0aXZhdGUsCisJLmRlYWN0aXZhdGUJPSBuZnRfaGFzaF9kZWFjdGl2YXRlLAorCS5yZW1vdmUJCT0gbmZ0X2hhc2hfcmVtb3ZlLAorCS5sb29rdXAJCT0gbmZ0X2hhc2hfbG9va3VwLAorCS51cGRhdGUJCT0gbmZ0X2hhc2hfdXBkYXRlLAorCS53YWxrCQk9IG5mdF9oYXNoX3dhbGssCisJLmZlYXR1cmVzCT0gTkZUX1NFVF9NQVAgfCBORlRfU0VUX1RJTUVPVVQsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbmZ0X2hhc2hfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbmZ0X3JlZ2lzdGVyX3NldCgmbmZ0X2hhc2hfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5mdF9oYXNoX21vZHVsZV9leGl0KHZvaWQpCit7CisJbmZ0X3VucmVnaXN0ZXJfc2V0KCZuZnRfaGFzaF9vcHMpOworfQorCittb2R1bGVfaW5pdChuZnRfaGFzaF9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChuZnRfaGFzaF9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PiIpOworTU9EVUxFX0FMSUFTX05GVF9TRVQoKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X3NldF9yYnRyZWUuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3NldF9yYnRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGI1YmRhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfc2V0X3JidHJlZS5jCkBAIC0wLDAgKzEsMzIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBEZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgZnVuZGVkIGJ5IEFzdGFybyBBRyAoaHR0cDovL3d3dy5hc3Rhcm8uY29tLykKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobmZ0X3JidHJlZV9sb2NrKTsKKworc3RydWN0IG5mdF9yYnRyZWUgeworCXN0cnVjdCByYl9yb290CQlyb290OworfTsKKworc3RydWN0IG5mdF9yYnRyZWVfZWxlbSB7CisJc3RydWN0IHJiX25vZGUJCW5vZGU7CisJc3RydWN0IG5mdF9zZXRfZXh0CWV4dDsKK307CisKK3N0YXRpYyBib29sIG5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKGNvbnN0IHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKnJiZSkKK3sKKwlyZXR1cm4gbmZ0X3NldF9leHRfZXhpc3RzKCZyYmUtPmV4dCwgTkZUX1NFVF9FWFRfRkxBR1MpICYmCisJICAgICAgICgqbmZ0X3NldF9leHRfZmxhZ3MoJnJiZS0+ZXh0KSAmIE5GVF9TRVRfRUxFTV9JTlRFUlZBTF9FTkQpOworfQorCitzdGF0aWMgYm9vbCBuZnRfcmJ0cmVlX2VxdWFsKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsIGNvbnN0IHZvaWQgKnRoaXMsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKmludGVydmFsKQoreworCXJldHVybiBtZW1jbXAodGhpcywgbmZ0X3NldF9leHRfa2V5KCZpbnRlcnZhbC0+ZXh0KSwgc2V0LT5rbGVuKSA9PSAwOworfQorCitzdGF0aWMgYm9vbCBuZnRfcmJ0cmVlX2xvb2t1cChjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkgICAgICBjb25zdCB1MzIgKmtleSwgY29uc3Qgc3RydWN0IG5mdF9zZXRfZXh0ICoqZXh0KQoreworCWNvbnN0IHN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJY29uc3Qgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlLCAqaW50ZXJ2YWwgPSBOVUxMOworCXU4IGdlbm1hc2sgPSBuZnRfZ2VubWFza19jdXIobmV0KTsKKwljb25zdCBzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50OworCWNvbnN0IHZvaWQgKnRoaXM7CisJaW50IGQ7CisKKwlzcGluX2xvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7CisJcGFyZW50ID0gcHJpdi0+cm9vdC5yYl9ub2RlOworCXdoaWxlIChwYXJlbnQgIT0gTlVMTCkgeworCQlyYmUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0sIG5vZGUpOworCisJCXRoaXMgPSBuZnRfc2V0X2V4dF9rZXkoJnJiZS0+ZXh0KTsKKwkJZCA9IG1lbWNtcCh0aGlzLCBrZXksIHNldC0+a2xlbik7CisJCWlmIChkIDwgMCkgeworCQkJcGFyZW50ID0gcGFyZW50LT5yYl9sZWZ0OworCQkJLyogSW4gY2FzZSBvZiBhZGphY2VudCByYW5nZXMsIHdlIGFsd2F5cyBzZWUgdGhlIGhpZ2gKKwkJCSAqIHBhcnQgb2YgdGhlIHJhbmdlIGluIGZpcnN0IHBsYWNlLCBiZWZvcmUgdGhlIGxvdyBvbmUuCisJCQkgKiBTbyBkb24ndCB1cGRhdGUgaW50ZXJ2YWwgaWYgdGhlIGtleXMgYXJlIGVxdWFsLgorCQkJICovCisJCQlpZiAoaW50ZXJ2YWwgJiYgbmZ0X3JidHJlZV9lcXVhbChzZXQsIHRoaXMsIGludGVydmFsKSkKKwkJCQljb250aW51ZTsKKwkJCWludGVydmFsID0gcmJlOworCQl9IGVsc2UgaWYgKGQgPiAwKQorCQkJcGFyZW50ID0gcGFyZW50LT5yYl9yaWdodDsKKwkJZWxzZSB7CisJCQlpZiAoIW5mdF9zZXRfZWxlbV9hY3RpdmUoJnJiZS0+ZXh0LCBnZW5tYXNrKSkgeworCQkJCXBhcmVudCA9IHBhcmVudC0+cmJfbGVmdDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChuZnRfcmJ0cmVlX2ludGVydmFsX2VuZChyYmUpKQorCQkJCWdvdG8gb3V0OworCQkJc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7CisKKwkJCSpleHQgPSAmcmJlLT5leHQ7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworCWlmIChzZXQtPmZsYWdzICYgTkZUX1NFVF9JTlRFUlZBTCAmJiBpbnRlcnZhbCAhPSBOVUxMICYmCisJICAgIG5mdF9zZXRfZWxlbV9hY3RpdmUoJmludGVydmFsLT5leHQsIGdlbm1hc2spICYmCisJICAgICFuZnRfcmJ0cmVlX2ludGVydmFsX2VuZChpbnRlcnZhbCkpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7CisJCSpleHQgPSAmaW50ZXJ2YWwtPmV4dDsKKwkJcmV0dXJuIHRydWU7CisJfQorb3V0OgorCXNwaW5fdW5sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCBfX25mdF9yYnRyZWVfaW5zZXJ0KGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCSAgICAgICBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpuZXcsCisJCQkgICAgICAgc3RydWN0IG5mdF9zZXRfZXh0ICoqZXh0KQoreworCXN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJdTggZ2VubWFzayA9IG5mdF9nZW5tYXNrX25leHQobmV0KTsKKwlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKipwOworCWludCBkOworCisJcGFyZW50ID0gTlVMTDsKKwlwID0gJnByaXYtPnJvb3QucmJfbm9kZTsKKwl3aGlsZSAoKnAgIT0gTlVMTCkgeworCQlwYXJlbnQgPSAqcDsKKwkJcmJlID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBub2RlKTsKKwkJZCA9IG1lbWNtcChuZnRfc2V0X2V4dF9rZXkoJnJiZS0+ZXh0KSwKKwkJCSAgIG5mdF9zZXRfZXh0X2tleSgmbmV3LT5leHQpLAorCQkJICAgc2V0LT5rbGVuKTsKKwkJaWYgKGQgPCAwKQorCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGQgPiAwKQorCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCQllbHNlIHsKKwkJCWlmIChuZnRfc2V0X2VsZW1fYWN0aXZlKCZyYmUtPmV4dCwgZ2VubWFzaykpIHsKKwkJCQlpZiAobmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQocmJlKSAmJgorCQkJCSAgICAhbmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQobmV3KSkKKwkJCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCQkJZWxzZSBpZiAoIW5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKHJiZSkgJiYKKwkJCQkJIG5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKG5ldykpCisJCQkJCXAgPSAmcGFyZW50LT5yYl9yaWdodDsKKwkJCQllbHNlIHsKKwkJCQkJKmV4dCA9ICZyYmUtPmV4dDsKKwkJCQkJcmV0dXJuIC1FRVhJU1Q7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJiX2xpbmtfbm9kZSgmbmV3LT5ub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmbmV3LT5ub2RlLCAmcHJpdi0+cm9vdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmZ0X3JidHJlZV9pbnNlcnQoY29uc3Qgc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtLAorCQkJICAgICBzdHJ1Y3QgbmZ0X3NldF9leHQgKipleHQpCit7CisJc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlID0gZWxlbS0+cHJpdjsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOworCWVyciA9IF9fbmZ0X3JidHJlZV9pbnNlcnQobmV0LCBzZXQsIHJiZSwgZXh0KTsKKwlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIG5mdF9yYnRyZWVfcmVtb3ZlKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQoreworCXN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlID0gZWxlbS0+cHJpdjsKKworCXNwaW5fbG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKKwlyYl9lcmFzZSgmcmJlLT5ub2RlLCAmcHJpdi0+cm9vdCk7CisJc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIG5mdF9yYnRyZWVfYWN0aXZhdGUoY29uc3Qgc3RydWN0IG5ldCAqbmV0LAorCQkJCWNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkJY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKK3sKKwlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUgPSBlbGVtLT5wcml2OworCisJbmZ0X3NldF9lbGVtX2NoYW5nZV9hY3RpdmUobmV0LCBzZXQsICZyYmUtPmV4dCk7Cit9CisKK3N0YXRpYyB2b2lkICpuZnRfcmJ0cmVlX2RlYWN0aXZhdGUoY29uc3Qgc3RydWN0IG5ldCAqbmV0LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkJICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKK3sKKwljb25zdCBzdHJ1Y3QgbmZ0X3JidHJlZSAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOworCWNvbnN0IHN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBwcml2LT5yb290LnJiX25vZGU7CisJc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlLCAqdGhpcyA9IGVsZW0tPnByaXY7CisJdTggZ2VubWFzayA9IG5mdF9nZW5tYXNrX25leHQobmV0KTsKKwlpbnQgZDsKKworCXdoaWxlIChwYXJlbnQgIT0gTlVMTCkgeworCQlyYmUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0sIG5vZGUpOworCisJCWQgPSBtZW1jbXAobmZ0X3NldF9leHRfa2V5KCZyYmUtPmV4dCksICZlbGVtLT5rZXkudmFsLAorCQkJCQkgICBzZXQtPmtsZW4pOworCQlpZiAoZCA8IDApCisJCQlwYXJlbnQgPSBwYXJlbnQtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGQgPiAwKQorCQkJcGFyZW50ID0gcGFyZW50LT5yYl9yaWdodDsKKwkJZWxzZSB7CisJCQlpZiAoIW5mdF9zZXRfZWxlbV9hY3RpdmUoJnJiZS0+ZXh0LCBnZW5tYXNrKSkgeworCQkJCXBhcmVudCA9IHBhcmVudC0+cmJfbGVmdDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChuZnRfcmJ0cmVlX2ludGVydmFsX2VuZChyYmUpICYmCisJCQkgICAgIW5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKHRoaXMpKSB7CisJCQkJcGFyZW50ID0gcGFyZW50LT5yYl9sZWZ0OworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmICghbmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQocmJlKSAmJgorCQkJCSAgIG5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKHRoaXMpKSB7CisJCQkJcGFyZW50ID0gcGFyZW50LT5yYl9yaWdodDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW5mdF9zZXRfZWxlbV9jaGFuZ2VfYWN0aXZlKG5ldCwgc2V0LCAmcmJlLT5leHQpOworCQkJcmV0dXJuIHJiZTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgbmZ0X3JidHJlZV93YWxrKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCQkgICAgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCSAgICBzdHJ1Y3QgbmZ0X3NldF9pdGVyICppdGVyKQoreworCWNvbnN0IHN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlOworCXN0cnVjdCBuZnRfc2V0X2VsZW0gZWxlbTsKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKworCXNwaW5fbG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKKwlmb3IgKG5vZGUgPSByYl9maXJzdCgmcHJpdi0+cm9vdCk7IG5vZGUgIT0gTlVMTDsgbm9kZSA9IHJiX25leHQobm9kZSkpIHsKKwkJcmJlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSwgbm9kZSk7CisKKwkJaWYgKGl0ZXItPmNvdW50IDwgaXRlci0+c2tpcCkKKwkJCWdvdG8gY29udDsKKwkJaWYgKCFuZnRfc2V0X2VsZW1fYWN0aXZlKCZyYmUtPmV4dCwgaXRlci0+Z2VubWFzaykpCisJCQlnb3RvIGNvbnQ7CisKKwkJZWxlbS5wcml2ID0gcmJlOworCisJCWl0ZXItPmVyciA9IGl0ZXItPmZuKGN0eCwgc2V0LCBpdGVyLCAmZWxlbSk7CisJCWlmIChpdGVyLT5lcnIgPCAwKSB7CisJCQlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKKwkJCXJldHVybjsKKwkJfQorY29udDoKKwkJaXRlci0+Y291bnQrKzsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZ0X3JidHJlZV9wcml2c2l6ZShjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgbmxhW10pCit7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgbmZ0X3JidHJlZSk7Cit9CisKK3N0YXRpYyBpbnQgbmZ0X3JidHJlZV9pbml0KGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLAorCQkJICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IG5sYVtdKQoreworCXN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisKKwlwcml2LT5yb290ID0gUkJfUk9PVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmZ0X3JidHJlZV9kZXN0cm95KGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQpCit7CisJc3RydWN0IG5mdF9yYnRyZWUgKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKKwlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmU7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisKKwl3aGlsZSAoKG5vZGUgPSBwcml2LT5yb290LnJiX25vZGUpICE9IE5VTEwpIHsKKwkJcmJfZXJhc2Uobm9kZSwgJnByaXYtPnJvb3QpOworCQlyYmUgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBub2RlKTsKKwkJbmZ0X3NldF9lbGVtX2Rlc3Ryb3koc2V0LCByYmUpOworCX0KK30KKworc3RhdGljIGJvb2wgbmZ0X3JidHJlZV9lc3RpbWF0ZShjb25zdCBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLCB1MzIgZmVhdHVyZXMsCisJCQkJc3RydWN0IG5mdF9zZXRfZXN0aW1hdGUgKmVzdCkKK3sKKwl1bnNpZ25lZCBpbnQgbnNpemU7CisKKwluc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtKTsKKwlpZiAoZGVzYy0+c2l6ZSkKKwkJZXN0LT5zaXplID0gc2l6ZW9mKHN0cnVjdCBuZnRfcmJ0cmVlKSArIGRlc2MtPnNpemUgKiBuc2l6ZTsKKwllbHNlCisJCWVzdC0+c2l6ZSA9IG5zaXplOworCisJZXN0LT5jbGFzcyA9IE5GVF9TRVRfQ0xBU1NfT19MT0dfTjsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgc3RydWN0IG5mdF9zZXRfb3BzIG5mdF9yYnRyZWVfb3BzIF9fcmVhZF9tb3N0bHkgPSB7CisJLnByaXZzaXplCT0gbmZ0X3JidHJlZV9wcml2c2l6ZSwKKwkuZWxlbXNpemUJPSBvZmZzZXRvZihzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBleHQpLAorCS5lc3RpbWF0ZQk9IG5mdF9yYnRyZWVfZXN0aW1hdGUsCisJLmluaXQJCT0gbmZ0X3JidHJlZV9pbml0LAorCS5kZXN0cm95CT0gbmZ0X3JidHJlZV9kZXN0cm95LAorCS5pbnNlcnQJCT0gbmZ0X3JidHJlZV9pbnNlcnQsCisJLnJlbW92ZQkJPSBuZnRfcmJ0cmVlX3JlbW92ZSwKKwkuZGVhY3RpdmF0ZQk9IG5mdF9yYnRyZWVfZGVhY3RpdmF0ZSwKKwkuYWN0aXZhdGUJPSBuZnRfcmJ0cmVlX2FjdGl2YXRlLAorCS5sb29rdXAJCT0gbmZ0X3JidHJlZV9sb29rdXAsCisJLndhbGsJCT0gbmZ0X3JidHJlZV93YWxrLAorCS5mZWF0dXJlcwk9IE5GVF9TRVRfSU5URVJWQUwgfCBORlRfU0VUX01BUCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBuZnRfcmJ0cmVlX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIG5mdF9yZWdpc3Rlcl9zZXQoJm5mdF9yYnRyZWVfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5mdF9yYnRyZWVfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwluZnRfdW5yZWdpc3Rlcl9zZXQoJm5mdF9yYnRyZWVfb3BzKTsKK30KKworbW9kdWxlX2luaXQobmZ0X3JidHJlZV9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChuZnRfcmJ0cmVlX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Iik7CitNT0RVTEVfQUxJQVNfTkZUX1NFVCgpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9SQVRFRVNULmMgYi9uZXQvbmV0ZmlsdGVyL3h0X1JBVEVFU1QuYwppbmRleCA1MTUxMzFmLi5kYmQ2YzRhIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X1JBVEVFU1QuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X1JBVEVFU1QuYwpAQCAtMjQsNyArMjQsNiBAQAogI2RlZmluZSBSQVRFRVNUX0hTSVpFCTE2CiBzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgcmF0ZWVzdF9oYXNoW1JBVEVFU1RfSFNJWkVdIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgdW5zaWduZWQgaW50IGpoYXNoX3JuZCBfX3JlYWRfbW9zdGx5Owotc3RhdGljIGJvb2wgcm5kX2luaXRlZCBfX3JlYWRfbW9zdGx5OwogCiBzdGF0aWMgdW5zaWduZWQgaW50IHh0X3JhdGVlc3RfaGFzaChjb25zdCBjaGFyICpuYW1lKQogewpAQCAtOTksMTAgKzk4LDcgQEAKIAl9IGNmZzsKIAlpbnQgcmV0OwogCi0JaWYgKHVubGlrZWx5KCFybmRfaW5pdGVkKSkgewotCQlnZXRfcmFuZG9tX2J5dGVzKCZqaGFzaF9ybmQsIHNpemVvZihqaGFzaF9ybmQpKTsKLQkJcm5kX2luaXRlZCA9IHRydWU7Ci0JfQorCW5ldF9nZXRfcmFuZG9tX29uY2UoJmpoYXNoX3JuZCwgc2l6ZW9mKGpoYXNoX3JuZCkpOwogCiAJZXN0ID0geHRfcmF0ZWVzdF9sb29rdXAoaW5mby0+bmFtZSk7CiAJaWYgKGVzdCkgewpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9UQ1BNU1MuYyBiL25ldC9uZXRmaWx0ZXIveHRfVENQTVNTLmMKaW5kZXggZTExODM5Ny4uODcyZGIyZCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9UQ1BNU1MuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X1RDUE1TUy5jCkBAIC0xMTAsMTggKzExMCwxNCBAQAogCWlmIChpbmZvLT5tc3MgPT0gWFRfVENQTVNTX0NMQU1QX1BNVFUpIHsKIAkJc3RydWN0IG5ldCAqbmV0ID0gcGFyLT5uZXQ7CiAJCXVuc2lnbmVkIGludCBpbl9tdHUgPSB0Y3Btc3NfcmV2ZXJzZV9tdHUobmV0LCBza2IsIGZhbWlseSk7CisJCXVuc2lnbmVkIGludCBtaW5fbXR1ID0gbWluKGRzdF9tdHUoc2tiX2RzdChza2IpKSwgaW5fbXR1KTsKIAotCQlpZiAoZHN0X210dShza2JfZHN0KHNrYikpIDw9IG1pbmxlbikgeworCQlpZiAobWluX210dSA8PSBtaW5sZW4pIHsKIAkJCW5ldF9lcnJfcmF0ZWxpbWl0ZWQoInVua25vd24gb3IgaW52YWxpZCBwYXRoLU1UVSAoJXUpXG4iLAotCQkJCQkgICAgZHN0X210dShza2JfZHN0KHNrYikpKTsKKwkJCQkJICAgIG1pbl9tdHUpOwogCQkJcmV0dXJuIC0xOwogCQl9Ci0JCWlmIChpbl9tdHUgPD0gbWlubGVuKSB7Ci0JCQluZXRfZXJyX3JhdGVsaW1pdGVkKCJ1bmtub3duIG9yIGludmFsaWQgcGF0aC1NVFUgKCV1KVxuIiwKLQkJCQkJICAgIGluX210dSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJbmV3bXNzID0gbWluKGRzdF9tdHUoc2tiX2RzdChza2IpKSwgaW5fbXR1KSAtIG1pbmxlbjsKKwkJbmV3bXNzID0gbWluX210dSAtIG1pbmxlbjsKIAl9IGVsc2UKIAkJbmV3bXNzID0gaW5mby0+bXNzOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X1RFRS5jIGIvbmV0L25ldGZpbHRlci94dF9URUUuYwppbmRleCA2ZTU3YTM5Li4wNDcxZGI0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X1RFRS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfVEVFLmMKQEAgLTg5LDYgKzg5LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoaW5mby0+b2lmWzBdKSB7CisJCWludCByZXQ7CisKIAkJaWYgKGluZm8tPm9pZltzaXplb2YoaW5mby0+b2lmKS0xXSAhPSAnXDAnKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTEwMSw3ICsxMDMsMTEgQEAKIAkJcHJpdi0+bm90aWZpZXIubm90aWZpZXJfY2FsbCA9IHRlZV9uZXRkZXZfZXZlbnQ7CiAJCWluZm8tPnByaXYgICAgPSBwcml2OwogCi0JCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmcHJpdi0+bm90aWZpZXIpOworCQlyZXQgPSByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnByaXYtPm5vdGlmaWVyKTsKKwkJaWYgKHJldCkgeworCQkJa2ZyZWUocHJpdik7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfSBlbHNlCiAJCWluZm8tPnByaXYgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X1RQUk9YWS5jIGIvbmV0L25ldGZpbHRlci94dF9UUFJPWFkuYwppbmRleCA3ZjQ0MTRkLi42NjNjNGMzIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X1RQUk9YWS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfVFBST1hZLmMKQEAgLTEyNyw2ICsxMjcsOCBAQAogCQkJCQkJICAgIGRhZGRyLCBkcG9ydCwKIAkJCQkJCSAgICBpbi0+aWZpbmRleCk7CiAKKwkJCWlmIChzayAmJiAhYXRvbWljX2luY19ub3RfemVybygmc2stPnNrX3JlZmNudCkpCisJCQkJc2sgPSBOVUxMOwogCQkJLyogTk9URTogd2UgcmV0dXJuIGxpc3RlbmVycyBldmVuIGlmIGJvdW5kIHRvCiAJCQkgKiAwLjAuMC4wLCB0aG9zZSBhcmUgZmlsdGVyZWQgb3V0IGluCiAJCQkgKiB4dF9zb2NrZXQsIHNpbmNlIHh0X1RQUk9YWSBuZWVkcyAwIGJvdW5kCkBAIC0xOTUsNiArMTk3LDggQEAKIAkJCQkJCSAgIGRhZGRyLCBudG9ocyhkcG9ydCksCiAJCQkJCQkgICBpbi0+aWZpbmRleCk7CiAKKwkJCWlmIChzayAmJiAhYXRvbWljX2luY19ub3RfemVybygmc2stPnNrX3JlZmNudCkpCisJCQkJc2sgPSBOVUxMOwogCQkJLyogTk9URTogd2UgcmV0dXJuIGxpc3RlbmVycyBldmVuIGlmIGJvdW5kIHRvCiAJCQkgKiAwLjAuMC4wLCB0aG9zZSBhcmUgZmlsdGVyZWQgb3V0IGluCiAJCQkgKiB4dF9zb2NrZXQsIHNpbmNlIHh0X1RQUk9YWSBuZWVkcyAwIGJvdW5kCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5saW1pdC5jIGIvbmV0L25ldGZpbHRlci94dF9jb25ubGltaXQuYwppbmRleCA5OWJiYzgyLi5iNmRjMzIyIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5saW1pdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubmxpbWl0LmMKQEAgLTM2NiwxNCArMzY2LDggQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgcmV0OwogCi0JaWYgKHVubGlrZWx5KCFjb25ubGltaXRfcm5kKSkgewotCQl1X2ludDMyX3QgcmFuZDsKKwluZXRfZ2V0X3JhbmRvbV9vbmNlKCZjb25ubGltaXRfcm5kLCBzaXplb2YoY29ubmxpbWl0X3JuZCkpOwogCi0JCWRvIHsKLQkJCWdldF9yYW5kb21fYnl0ZXMoJnJhbmQsIHNpemVvZihyYW5kKSk7Ci0JCX0gd2hpbGUgKCFyYW5kKTsKLQkJY21weGNoZygmY29ubmxpbWl0X3JuZCwgMCwgcmFuZCk7Ci0JfQogCXJldCA9IG5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQocGFyLT5mYW1pbHkpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByX2luZm8oImNhbm5vdCBsb2FkIGNvbm50cmFjayBzdXBwb3J0IGZvciAiCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jIGIvbmV0L25ldGZpbHRlci94dF9jb25udHJhY2suYwppbmRleCAxODg0MDRiOS4uYTNiOGY2OSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9jb25udHJhY2suYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jCkBAIC0yMzMsMTAgKzIzMyw4IEBACiAJCXJldHVybiBmYWxzZTsKIAogCWlmIChpbmZvLT5tYXRjaF9mbGFncyAmIFhUX0NPTk5UUkFDS19FWFBJUkVTKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZXhwaXJlcyA9IDA7CisJCXVuc2lnbmVkIGxvbmcgZXhwaXJlcyA9IG5mX2N0X2V4cGlyZXMoY3QpIC8gSFo7CiAKLQkJaWYgKHRpbWVyX3BlbmRpbmcoJmN0LT50aW1lb3V0KSkKLQkJCWV4cGlyZXMgPSAoY3QtPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXMpIC8gSFo7CiAJCWlmICgoZXhwaXJlcyA+PSBpbmZvLT5leHBpcmVzX21pbiAmJgogCQkgICAgZXhwaXJlcyA8PSBpbmZvLT5leHBpcmVzX21heCkgXgogCQkgICAgIShpbmZvLT5pbnZlcnRfZmxhZ3MgJiBYVF9DT05OVFJBQ0tfRVhQSVJFUykpCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5jIGIvbmV0L25ldGZpbHRlci94dF9oYXNobGltaXQuYwppbmRleCAxNzg2OTY4Li4yZmFiMGM2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMKQEAgLTU2LDYgKzU2LDcgQEAKIH0KIAogLyogbmVlZCB0byBkZWNsYXJlIHRoaXMgYXQgdGhlIHRvcCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGxfZmlsZV9vcHNfdjE7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkbF9maWxlX29wczsKIAogLyogaGFzaCB0YWJsZSBjcmFwICovCkBAIC04Niw4ICs4Nyw4IEBACiAJdW5zaWduZWQgbG9uZyBleHBpcmVzOwkJLyogcHJlY2FsY3VsYXRlZCBleHBpcnkgdGltZSAqLwogCXN0cnVjdCB7CiAJCXVuc2lnbmVkIGxvbmcgcHJldjsJLyogbGFzdCBtb2RpZmljYXRpb24gKi8KLQkJdV9pbnQzMl90IGNyZWRpdDsKLQkJdV9pbnQzMl90IGNyZWRpdF9jYXAsIGNvc3Q7CisJCXVfaW50NjRfdCBjcmVkaXQ7CisJCXVfaW50NjRfdCBjcmVkaXRfY2FwLCBjb3N0OwogCX0gcmF0ZWluZm87CiAJc3RydWN0IHJjdV9oZWFkIHJjdTsKIH07CkBAIC05OCw3ICs5OSw3IEBACiAJdV9pbnQ4X3QgZmFtaWx5OwogCWJvb2wgcm5kX2luaXRpYWxpemVkOwogCi0Jc3RydWN0IGhhc2hsaW1pdF9jZmcxIGNmZzsJLyogY29uZmlnICovCisJc3RydWN0IGhhc2hsaW1pdF9jZmcyIGNmZzsJLyogY29uZmlnICovCiAKIAkvKiB1c2VkIGludGVybmFsbHkgKi8KIAlzcGlubG9ja190IGxvY2s7CQkvKiBsb2NrIGZvciBsaXN0X2hlYWQgKi8KQEAgLTExNCw2ICsxMTUsMzAgQEAKIAlzdHJ1Y3QgaGxpc3RfaGVhZCBoYXNoWzBdOwkvKiBoYXNodGFibGUgaXRzZWxmICovCiB9OwogCitzdGF0aWMgaW50CitjZmdfY29weShzdHJ1Y3QgaGFzaGxpbWl0X2NmZzIgKnRvLCB2b2lkICpmcm9tLCBpbnQgcmV2aXNpb24pCit7CisJaWYgKHJldmlzaW9uID09IDEpIHsKKwkJc3RydWN0IGhhc2hsaW1pdF9jZmcxICpjZmcgPSAoc3RydWN0IGhhc2hsaW1pdF9jZmcxICopZnJvbTsKKworCQl0by0+bW9kZSA9IGNmZy0+bW9kZTsKKwkJdG8tPmF2ZyA9IGNmZy0+YXZnOworCQl0by0+YnVyc3QgPSBjZmctPmJ1cnN0OworCQl0by0+c2l6ZSA9IGNmZy0+c2l6ZTsKKwkJdG8tPm1heCA9IGNmZy0+bWF4OworCQl0by0+Z2NfaW50ZXJ2YWwgPSBjZmctPmdjX2ludGVydmFsOworCQl0by0+ZXhwaXJlID0gY2ZnLT5leHBpcmU7CisJCXRvLT5zcmNtYXNrID0gY2ZnLT5zcmNtYXNrOworCQl0by0+ZHN0bWFzayA9IGNmZy0+ZHN0bWFzazsKKwl9IGVsc2UgaWYgKHJldmlzaW9uID09IDIpIHsKKwkJbWVtY3B5KHRvLCBmcm9tLCBzaXplb2Yoc3RydWN0IGhhc2hsaW1pdF9jZmcyKSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBERUZJTkVfTVVURVgoaGFzaGxpbWl0X211dGV4KTsJLyogcHJvdGVjdHMgaHRhYmxlcyBsaXN0ICovCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmhhc2hsaW1pdF9jYWNoZXAgX19yZWFkX21vc3RseTsKIApAQCAtMjE1LDE2ICsyNDAsMTggQEAKIH0KIHN0YXRpYyB2b2lkIGh0YWJsZV9nYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCi1zdGF0aWMgaW50IGh0YWJsZV9jcmVhdGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEgKm1pbmZvLAotCQkJIHVfaW50OF90IGZhbWlseSkKK3N0YXRpYyBpbnQgaHRhYmxlX2NyZWF0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBoYXNobGltaXRfY2ZnMiAqY2ZnLAorCQkJIGNvbnN0IGNoYXIgKm5hbWUsIHVfaW50OF90IGZhbWlseSwKKwkJCSBzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqKm91dF9oaW5mbywKKwkJCSBpbnQgcmV2aXNpb24pCiB7CiAJc3RydWN0IGhhc2hsaW1pdF9uZXQgKmhhc2hsaW1pdF9uZXQgPSBoYXNobGltaXRfcGVybmV0KG5ldCk7CiAJc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvOwotCXVuc2lnbmVkIGludCBzaXplOwotCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBzaXplLCBpOworCWludCByZXQ7CiAKLQlpZiAobWluZm8tPmNmZy5zaXplKSB7Ci0JCXNpemUgPSBtaW5mby0+Y2ZnLnNpemU7CisJaWYgKGNmZy0+c2l6ZSkgeworCQlzaXplID0gY2ZnLT5zaXplOwogCX0gZWxzZSB7CiAJCXNpemUgPSAodG90YWxyYW1fcGFnZXMgPDwgUEFHRV9TSElGVCkgLyAxNjM4NCAvCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCk7CkBAIC0yMzgsMTAgKzI2NSwxNCBAQAogCSAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgKiBzaXplKTsKIAlpZiAoaGluZm8gPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWluZm8tPmhpbmZvID0gaGluZm87CisJKm91dF9oaW5mbyA9IGhpbmZvOwogCiAJLyogY29weSBtYXRjaCBjb25maWcgaW50byBoYXNodGFibGUgY29uZmlnICovCi0JbWVtY3B5KCZoaW5mby0+Y2ZnLCAmbWluZm8tPmNmZywgc2l6ZW9mKGhpbmZvLT5jZmcpKTsKKwlyZXQgPSBjZmdfY29weSgmaGluZm8tPmNmZywgKHZvaWQgKiljZmcsIDIpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCWhpbmZvLT5jZmcuc2l6ZSA9IHNpemU7CiAJaWYgKGhpbmZvLT5jZmcubWF4ID09IDApCiAJCWhpbmZvLT5jZmcubWF4ID0gOCAqIGhpbmZvLT5jZmcuc2l6ZTsKQEAgLTI1NSwxNyArMjg2LDE4IEBACiAJaGluZm8tPmNvdW50ID0gMDsKIAloaW5mby0+ZmFtaWx5ID0gZmFtaWx5OwogCWhpbmZvLT5ybmRfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQloaW5mby0+bmFtZSA9IGtzdHJkdXAobWluZm8tPm5hbWUsIEdGUF9LRVJORUwpOworCWhpbmZvLT5uYW1lID0ga3N0cmR1cChuYW1lLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhpbmZvLT5uYW1lKSB7CiAJCXZmcmVlKGhpbmZvKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXNwaW5fbG9ja19pbml0KCZoaW5mby0+bG9jayk7CiAKLQloaW5mby0+cGRlID0gcHJvY19jcmVhdGVfZGF0YShtaW5mby0+bmFtZSwgMCwKKwloaW5mby0+cGRlID0gcHJvY19jcmVhdGVfZGF0YShuYW1lLCAwLAogCQkoZmFtaWx5ID09IE5GUFJPVE9fSVBWNCkgPwogCQloYXNobGltaXRfbmV0LT5pcHRfaGFzaGxpbWl0IDogaGFzaGxpbWl0X25ldC0+aXA2dF9oYXNobGltaXQsCi0JCSZkbF9maWxlX29wcywgaGluZm8pOworCQkocmV2aXNpb24gPT0gMSkgPyAmZGxfZmlsZV9vcHNfdjEgOiAmZGxfZmlsZV9vcHMsCisJCWhpbmZvKTsKIAlpZiAoaGluZm8tPnBkZSA9PSBOVUxMKSB7CiAJCWtmcmVlKGhpbmZvLT5uYW1lKTsKIAkJdmZyZWUoaGluZm8pOwpAQCAtMzk4LDcgKzQzMCw4IEBACiAgICAoc2xvd2VzdCB1c2Vyc3BhY2UgdG9vbCBhbGxvd3MpLCB3aGljaCBtZWFucwogICAgQ1JFRElUU19QRVJfSklGRlkqSFoqNjAqNjAqMjQgPCAyXjMyIGllLgogKi8KLSNkZWZpbmUgTUFYX0NQSiAoMHhGRkZGRkZGRiAvIChIWio2MCo2MCoyNCkpCisjZGVmaW5lIE1BWF9DUEpfdjEgKDB4RkZGRkZGRkYgLyAoSFoqNjAqNjAqMjQpKQorI2RlZmluZSBNQVhfQ1BKICgweEZGRkZGRkZGRkZGRkZGRkYgLyAoSFoqNjAqNjAqMjQpKQogCiAvKiBSZXBlYXRlZCBzaGlmdCBhbmQgb3IgZ2l2ZXMgdXMgYWxsIDFzLCBmaW5hbCBzaGlmdCBhbmQgYWRkIDEgZ2l2ZXMKICAqIHVzIHRoZSBwb3dlciBvZiAyIGJlbG93IHRoZSB0aGVvcmV0aWNhbCBtYXgsIHNvIEdDQyBzaW1wbHkgZG9lcyBhCkBAIC00MDgsOSArNDQxLDEyIEBACiAjZGVmaW5lIF9QT1cyX0JFTE9XOCh4KSAoX1BPVzJfQkVMT1c0KHgpfF9QT1cyX0JFTE9XNCgoeCk+PjQpKQogI2RlZmluZSBfUE9XMl9CRUxPVzE2KHgpIChfUE9XMl9CRUxPVzgoeCl8X1BPVzJfQkVMT1c4KCh4KT4+OCkpCiAjZGVmaW5lIF9QT1cyX0JFTE9XMzIoeCkgKF9QT1cyX0JFTE9XMTYoeCl8X1BPVzJfQkVMT1cxNigoeCk+PjE2KSkKKyNkZWZpbmUgX1BPVzJfQkVMT1c2NCh4KSAoX1BPVzJfQkVMT1czMih4KXxfUE9XMl9CRUxPVzMyKCh4KT4+MzIpKQogI2RlZmluZSBQT1cyX0JFTE9XMzIoeCkgKChfUE9XMl9CRUxPVzMyKHgpPj4xKSArIDEpCisjZGVmaW5lIFBPVzJfQkVMT1c2NCh4KSAoKF9QT1cyX0JFTE9XNjQoeCk+PjEpICsgMSkKIAotI2RlZmluZSBDUkVESVRTX1BFUl9KSUZGWSBQT1cyX0JFTE9XMzIoTUFYX0NQSikKKyNkZWZpbmUgQ1JFRElUU19QRVJfSklGRlkgUE9XMl9CRUxPVzY0KE1BWF9DUEopCisjZGVmaW5lIENSRURJVFNfUEVSX0pJRkZZX3YxIFBPVzJfQkVMT1czMihNQVhfQ1BKX3YxKQogCiAvKiBpbiBieXRlIG1vZGUsIHRoZSBsb3dlc3QgcG9zc2libGUgcmF0ZSBpcyBvbmUgcGFja2V0L3NlY29uZC4KICAqIGNyZWRpdF9jYXAgaXMgdXNlZCBhcyBhIGNvdW50ZXIgdGhhdCB0ZWxscyB1cyBob3cgbWFueSB0aW1lcyB3ZSBjYW4KQEAgLTQyNSwxNCArNDYxLDI1IEBACiB9CiAKIC8qIFByZWNpc2lvbiBzYXZlci4gKi8KLXN0YXRpYyB1MzIgdXNlcjJjcmVkaXRzKHUzMiB1c2VyKQorc3RhdGljIHU2NCB1c2VyMmNyZWRpdHModTY0IHVzZXIsIGludCByZXZpc2lvbikKIHsKLQkvKiBJZiBtdWx0aXBseWluZyB3b3VsZCBvdmVyZmxvdy4uLiAqLwotCWlmICh1c2VyID4gMHhGRkZGRkZGRiAvIChIWipDUkVESVRTX1BFUl9KSUZGWSkpCi0JCS8qIERpdmlkZSBmaXJzdC4gKi8KLQkJcmV0dXJuICh1c2VyIC8gWFRfSEFTSExJTUlUX1NDQUxFKSAqIEhaICogQ1JFRElUU19QRVJfSklGRlk7CisJaWYgKHJldmlzaW9uID09IDEpIHsKKwkJLyogSWYgbXVsdGlwbHlpbmcgd291bGQgb3ZlcmZsb3cuLi4gKi8KKwkJaWYgKHVzZXIgPiAweEZGRkZGRkZGIC8gKEhaKkNSRURJVFNfUEVSX0pJRkZZX3YxKSkKKwkJCS8qIERpdmlkZSBmaXJzdC4gKi8KKwkJCXJldHVybiBkaXY2NF91NjQodXNlciwgWFRfSEFTSExJTUlUX1NDQUxFKQorCQkJCSogSFogKiBDUkVESVRTX1BFUl9KSUZGWV92MTsKIAotCXJldHVybiAodXNlciAqIEhaICogQ1JFRElUU19QRVJfSklGRlkpIC8gWFRfSEFTSExJTUlUX1NDQUxFOworCQlyZXR1cm4gZGl2NjRfdTY0KHVzZXIgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZX3YxLAorCQkJCSBYVF9IQVNITElNSVRfU0NBTEUpOworCX0gZWxzZSB7CisJCWlmICh1c2VyID4gMHhGRkZGRkZGRkZGRkZGRkZGIC8gKEhaKkNSRURJVFNfUEVSX0pJRkZZKSkKKwkJCXJldHVybiBkaXY2NF91NjQodXNlciwgWFRfSEFTSExJTUlUX1NDQUxFX3YyKQorCQkJCSogSFogKiBDUkVESVRTX1BFUl9KSUZGWTsKKworCQlyZXR1cm4gZGl2NjRfdTY0KHVzZXIgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZLAorCQkJCSBYVF9IQVNITElNSVRfU0NBTEVfdjIpOworCX0KIH0KIAogc3RhdGljIHUzMiB1c2VyMmNyZWRpdHNfYnl0ZSh1MzIgdXNlcikKQEAgLTQ0MiwxMCArNDg5LDExIEBACiAJcmV0dXJuICh1MzIpICh1cyA+PiAzMik7CiB9CiAKLXN0YXRpYyB2b2lkIHJhdGVpbmZvX3JlY2FsYyhzdHJ1Y3QgZHN0aGFzaF9lbnQgKmRoLCB1bnNpZ25lZCBsb25nIG5vdywgdTMyIG1vZGUpCitzdGF0aWMgdm9pZCByYXRlaW5mb19yZWNhbGMoc3RydWN0IGRzdGhhc2hfZW50ICpkaCwgdW5zaWduZWQgbG9uZyBub3csCisJCQkgICAgdTMyIG1vZGUsIGludCByZXZpc2lvbikKIHsKIAl1bnNpZ25lZCBsb25nIGRlbHRhID0gbm93IC0gZGgtPnJhdGVpbmZvLnByZXY7Ci0JdTMyIGNhcDsKKwl1NjQgY2FwLCBjcGo7CiAKIAlpZiAoZGVsdGEgPT0gMCkKIAkJcmV0dXJuOwpAQCAtNDUzLDcgKzUwMSw3IEBACiAJZGgtPnJhdGVpbmZvLnByZXYgPSBub3c7CiAKIAlpZiAobW9kZSAmIFhUX0hBU0hMSU1JVF9CWVRFUykgewotCQl1MzIgdG1wID0gZGgtPnJhdGVpbmZvLmNyZWRpdDsKKwkJdTY0IHRtcCA9IGRoLT5yYXRlaW5mby5jcmVkaXQ7CiAJCWRoLT5yYXRlaW5mby5jcmVkaXQgKz0gQ1JFRElUU19QRVJfSklGRllfQllURVMgKiBkZWx0YTsKIAkJY2FwID0gQ1JFRElUU19QRVJfSklGRllfQllURVMgKiBIWjsKIAkJaWYgKHRtcCA+PSBkaC0+cmF0ZWluZm8uY3JlZGl0KSB7Lyogb3ZlcmZsb3cgKi8KQEAgLTQ2MSw3ICs1MDksOSBAQAogCQkJcmV0dXJuOwogCQl9CiAJfSBlbHNlIHsKLQkJZGgtPnJhdGVpbmZvLmNyZWRpdCArPSBkZWx0YSAqIENSRURJVFNfUEVSX0pJRkZZOworCQljcGogPSAocmV2aXNpb24gPT0gMSkgPworCQkJQ1JFRElUU19QRVJfSklGRllfdjEgOiBDUkVESVRTX1BFUl9KSUZGWTsKKwkJZGgtPnJhdGVpbmZvLmNyZWRpdCArPSBkZWx0YSAqIGNwajsKIAkJY2FwID0gZGgtPnJhdGVpbmZvLmNyZWRpdF9jYXA7CiAJfQogCWlmIChkaC0+cmF0ZWluZm8uY3JlZGl0ID4gY2FwKQpAQCAtNDY5LDcgKzUxOSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHJhdGVpbmZvX2luaXQoc3RydWN0IGRzdGhhc2hfZW50ICpkaCwKLQkJCSAgc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvKQorCQkJICBzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm8sIGludCByZXZpc2lvbikKIHsKIAlkaC0+cmF0ZWluZm8ucHJldiA9IGppZmZpZXM7CiAJaWYgKGhpbmZvLT5jZmcubW9kZSAmIFhUX0hBU0hMSU1JVF9CWVRFUykgewpAQCAtNDc4LDggKzUyOCw4IEBACiAJCWRoLT5yYXRlaW5mby5jcmVkaXRfY2FwID0gaGluZm8tPmNmZy5idXJzdDsKIAl9IGVsc2UgewogCQlkaC0+cmF0ZWluZm8uY3JlZGl0ID0gdXNlcjJjcmVkaXRzKGhpbmZvLT5jZmcuYXZnICoKLQkJCQkJCSAgIGhpbmZvLT5jZmcuYnVyc3QpOwotCQlkaC0+cmF0ZWluZm8uY29zdCA9IHVzZXIyY3JlZGl0cyhoaW5mby0+Y2ZnLmF2Zyk7CisJCQkJCQkgICBoaW5mby0+Y2ZnLmJ1cnN0LCByZXZpc2lvbik7CisJCWRoLT5yYXRlaW5mby5jb3N0ID0gdXNlcjJjcmVkaXRzKGhpbmZvLT5jZmcuYXZnLCByZXZpc2lvbik7CiAJCWRoLT5yYXRlaW5mby5jcmVkaXRfY2FwID0gZGgtPnJhdGVpbmZvLmNyZWRpdDsKIAl9CiB9CkBAIC02MDMsMTUgKzY1MywxNSBAQAogfQogCiBzdGF0aWMgYm9vbAotaGFzaGxpbWl0X210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKK2hhc2hsaW1pdF9tdF9jb21tb24oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyLAorCQkgICAgc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvLAorCQkgICAgY29uc3Qgc3RydWN0IGhhc2hsaW1pdF9jZmcyICpjZmcsIGludCByZXZpc2lvbikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEgKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKLQlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm8gPSBpbmZvLT5oaW5mbzsKIAl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CiAJc3RydWN0IGRzdGhhc2hfZW50ICpkaDsKIAlzdHJ1Y3QgZHN0aGFzaF9kc3QgZHN0OwogCWJvb2wgcmFjZSA9IGZhbHNlOwotCXUzMiBjb3N0OworCXU2NCBjb3N0OwogCiAJaWYgKGhhc2hsaW1pdF9pbml0X2RzdChoaW5mbywgJmRzdCwgc2tiLCBwYXItPnRob2ZmKSA8IDApCiAJCWdvdG8gaG90ZHJvcDsKQEAgLTYyNiwxOCArNjc2LDE4IEBACiAJCX0gZWxzZSBpZiAocmFjZSkgewogCQkJLyogQWxyZWFkeSBnb3QgYW4gZW50cnksIHVwZGF0ZSBleHBpcmF0aW9uIHRpbWVvdXQgKi8KIAkJCWRoLT5leHBpcmVzID0gbm93ICsgbXNlY3NfdG9famlmZmllcyhoaW5mby0+Y2ZnLmV4cGlyZSk7Ci0JCQlyYXRlaW5mb19yZWNhbGMoZGgsIG5vdywgaGluZm8tPmNmZy5tb2RlKTsKKwkJCXJhdGVpbmZvX3JlY2FsYyhkaCwgbm93LCBoaW5mby0+Y2ZnLm1vZGUsIHJldmlzaW9uKTsKIAkJfSBlbHNlIHsKIAkJCWRoLT5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoaGluZm8tPmNmZy5leHBpcmUpOwotCQkJcmF0ZWluZm9faW5pdChkaCwgaGluZm8pOworCQkJcmF0ZWluZm9faW5pdChkaCwgaGluZm8sIHJldmlzaW9uKTsKIAkJfQogCX0gZWxzZSB7CiAJCS8qIHVwZGF0ZSBleHBpcmF0aW9uIHRpbWVvdXQgKi8KIAkJZGgtPmV4cGlyZXMgPSBub3cgKyBtc2Vjc190b19qaWZmaWVzKGhpbmZvLT5jZmcuZXhwaXJlKTsKLQkJcmF0ZWluZm9fcmVjYWxjKGRoLCBub3csIGhpbmZvLT5jZmcubW9kZSk7CisJCXJhdGVpbmZvX3JlY2FsYyhkaCwgbm93LCBoaW5mby0+Y2ZnLm1vZGUsIHJldmlzaW9uKTsKIAl9CiAKLQlpZiAoaW5mby0+Y2ZnLm1vZGUgJiBYVF9IQVNITElNSVRfQllURVMpCisJaWYgKGNmZy0+bW9kZSAmIFhUX0hBU0hMSU1JVF9CWVRFUykKIAkJY29zdCA9IGhhc2hsaW1pdF9ieXRlX2Nvc3Qoc2tiLT5sZW4sIGRoKTsKIAllbHNlCiAJCWNvc3QgPSBkaC0+cmF0ZWluZm8uY29zdDsKQEAgLTY0Nyw3MyArNjk3LDEzNiBAQAogCQlkaC0+cmF0ZWluZm8uY3JlZGl0IC09IGNvc3Q7CiAJCXNwaW5fdW5sb2NrKCZkaC0+bG9jayk7CiAJCXJjdV9yZWFkX3VubG9ja19iaCgpOwotCQlyZXR1cm4gIShpbmZvLT5jZmcubW9kZSAmIFhUX0hBU0hMSU1JVF9JTlZFUlQpOworCQlyZXR1cm4gIShjZmctPm1vZGUgJiBYVF9IQVNITElNSVRfSU5WRVJUKTsKIAl9CiAKIAlzcGluX3VubG9jaygmZGgtPmxvY2spOwogCXJjdV9yZWFkX3VubG9ja19iaCgpOwogCS8qIGRlZmF1bHQgbWF0Y2ggaXMgdW5kZXJsaW1pdCAtIHNvIG92ZXIgdGhlIGxpbWl0LCB3ZSBuZWVkIHRvIGludmVydCAqLwotCXJldHVybiBpbmZvLT5jZmcubW9kZSAmIFhUX0hBU0hMSU1JVF9JTlZFUlQ7CisJcmV0dXJuIGNmZy0+bW9kZSAmIFhUX0hBU0hMSU1JVF9JTlZFUlQ7CiAKICBob3Rkcm9wOgogCXBhci0+aG90ZHJvcCA9IHRydWU7CiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgaW50IGhhc2hsaW1pdF9tdF9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKK3N0YXRpYyBib29sCitoYXNobGltaXRfbXRfdjEoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQogewotCXN0cnVjdCBuZXQgKm5ldCA9IHBhci0+bmV0OwotCXN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMSAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMSAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCXN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpoaW5mbyA9IGluZm8tPmhpbmZvOworCXN0cnVjdCBoYXNobGltaXRfY2ZnMiBjZmcgPSB7fTsKIAlpbnQgcmV0OwogCi0JaWYgKGluZm8tPmNmZy5nY19pbnRlcnZhbCA9PSAwIHx8IGluZm8tPmNmZy5leHBpcmUgPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGluZm8tPm5hbWVbc2l6ZW9mKGluZm8tPm5hbWUpLTFdICE9ICdcMCcpCisJcmV0ID0gY2ZnX2NvcHkoJmNmZywgKHZvaWQgKikmaW5mby0+Y2ZnLCAxKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gaGFzaGxpbWl0X210X2NvbW1vbihza2IsIHBhciwgaGluZm8sICZjZmcsIDEpOworfQorCitzdGF0aWMgYm9vbAoraGFzaGxpbWl0X210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKK3sKKwljb25zdCBzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzIgKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKwlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm8gPSBpbmZvLT5oaW5mbzsKKworCXJldHVybiBoYXNobGltaXRfbXRfY29tbW9uKHNrYiwgcGFyLCBoaW5mbywgJmluZm8tPmNmZywgMik7Cit9CisKK3N0YXRpYyBpbnQgaGFzaGxpbWl0X210X2NoZWNrX2NvbW1vbihjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhciwKKwkJCQkgICAgIHN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICoqaGluZm8sCisJCQkJICAgICBzdHJ1Y3QgaGFzaGxpbWl0X2NmZzIgKmNmZywKKwkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCByZXZpc2lvbikKK3sKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBwYXItPm5ldDsKKwlpbnQgcmV0OworCisJaWYgKGNmZy0+Z2NfaW50ZXJ2YWwgPT0gMCB8fCBjZmctPmV4cGlyZSA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAocGFyLT5mYW1pbHkgPT0gTkZQUk9UT19JUFY0KSB7Ci0JCWlmIChpbmZvLT5jZmcuc3JjbWFzayA+IDMyIHx8IGluZm8tPmNmZy5kc3RtYXNrID4gMzIpCisJCWlmIChjZmctPnNyY21hc2sgPiAzMiB8fCBjZmctPmRzdG1hc2sgPiAzMikKIAkJCXJldHVybiAtRUlOVkFMOwogCX0gZWxzZSB7Ci0JCWlmIChpbmZvLT5jZmcuc3JjbWFzayA+IDEyOCB8fCBpbmZvLT5jZmcuZHN0bWFzayA+IDEyOCkKKwkJaWYgKGNmZy0+c3JjbWFzayA+IDEyOCB8fCBjZmctPmRzdG1hc2sgPiAxMjgpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoaW5mby0+Y2ZnLm1vZGUgJiB+WFRfSEFTSExJTUlUX0FMTCkgeworCWlmIChjZmctPm1vZGUgJiB+WFRfSEFTSExJTUlUX0FMTCkgewogCQlwcl9pbmZvKCJVbmtub3duIG1vZGUgbWFzayAlWCwga2VybmVsIHRvbyBvbGQ/XG4iLAotCQkJCQkJaW5mby0+Y2ZnLm1vZGUpOworCQkJCQkJY2ZnLT5tb2RlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogQ2hlY2sgZm9yIG92ZXJmbG93LiAqLwotCWlmIChpbmZvLT5jZmcubW9kZSAmIFhUX0hBU0hMSU1JVF9CWVRFUykgewotCQlpZiAodXNlcjJjcmVkaXRzX2J5dGUoaW5mby0+Y2ZnLmF2ZykgPT0gMCkgewotCQkJcHJfaW5mbygib3ZlcmZsb3csIHJhdGUgdG9vIGhpZ2g6ICV1XG4iLCBpbmZvLT5jZmcuYXZnKTsKKwlpZiAoY2ZnLT5tb2RlICYgWFRfSEFTSExJTUlUX0JZVEVTKSB7CisJCWlmICh1c2VyMmNyZWRpdHNfYnl0ZShjZmctPmF2ZykgPT0gMCkgeworCQkJcHJfaW5mbygib3ZlcmZsb3csIHJhdGUgdG9vIGhpZ2g6ICVsbHVcbiIsIGNmZy0+YXZnKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JfSBlbHNlIGlmIChpbmZvLT5jZmcuYnVyc3QgPT0gMCB8fAotCQkgICAgdXNlcjJjcmVkaXRzKGluZm8tPmNmZy5hdmcgKiBpbmZvLT5jZmcuYnVyc3QpIDwKLQkJICAgIHVzZXIyY3JlZGl0cyhpbmZvLT5jZmcuYXZnKSkgewotCQkJcHJfaW5mbygib3ZlcmZsb3csIHRyeSBsb3dlcjogJXUvJXVcbiIsCi0JCQkJaW5mby0+Y2ZnLmF2ZywgaW5mby0+Y2ZnLmJ1cnN0KTsKKwl9IGVsc2UgaWYgKGNmZy0+YnVyc3QgPT0gMCB8fAorCQkgICAgdXNlcjJjcmVkaXRzKGNmZy0+YXZnICogY2ZnLT5idXJzdCwgcmV2aXNpb24pIDwKKwkJICAgIHVzZXIyY3JlZGl0cyhjZmctPmF2ZywgcmV2aXNpb24pKSB7CisJCQlwcl9pbmZvKCJvdmVyZmxvdywgdHJ5IGxvd2VyOiAlbGx1LyVsbHVcbiIsCisJCQkJY2ZnLT5hdmcsIGNmZy0+YnVyc3QpOwogCQkJcmV0dXJuIC1FUkFOR0U7CiAJfQogCiAJbXV0ZXhfbG9jaygmaGFzaGxpbWl0X211dGV4KTsKLQlpbmZvLT5oaW5mbyA9IGh0YWJsZV9maW5kX2dldChuZXQsIGluZm8tPm5hbWUsIHBhci0+ZmFtaWx5KTsKLQlpZiAoaW5mby0+aGluZm8gPT0gTlVMTCkgewotCQlyZXQgPSBodGFibGVfY3JlYXRlKG5ldCwgaW5mbywgcGFyLT5mYW1pbHkpOworCSpoaW5mbyA9IGh0YWJsZV9maW5kX2dldChuZXQsIG5hbWUsIHBhci0+ZmFtaWx5KTsKKwlpZiAoKmhpbmZvID09IE5VTEwpIHsKKwkJcmV0ID0gaHRhYmxlX2NyZWF0ZShuZXQsIGNmZywgbmFtZSwgcGFyLT5mYW1pbHksCisJCQkJICAgIGhpbmZvLCByZXZpc2lvbik7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltdXRleF91bmxvY2soJmhhc2hsaW1pdF9tdXRleCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCW11dGV4X3VubG9jaygmaGFzaGxpbWl0X211dGV4KTsKKwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGhhc2hsaW1pdF9tdF9jaGVja192MShjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKK3sKKwlzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEgKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKwlzdHJ1Y3QgaGFzaGxpbWl0X2NmZzIgY2ZnID0ge307CisJaW50IHJldDsKKworCWlmIChpbmZvLT5uYW1lW3NpemVvZihpbmZvLT5uYW1lKSAtIDFdICE9ICdcMCcpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gY2ZnX2NvcHkoJmNmZywgKHZvaWQgKikmaW5mby0+Y2ZnLCAxKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gaGFzaGxpbWl0X210X2NoZWNrX2NvbW1vbihwYXIsICZpbmZvLT5oaW5mbywKKwkJCQkJICZjZmcsIGluZm8tPm5hbWUsIDEpOworfQorCitzdGF0aWMgaW50IGhhc2hsaW1pdF9tdF9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKK3sKKwlzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzIgKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKworCWlmIChpbmZvLT5uYW1lW3NpemVvZihpbmZvLT5uYW1lKSAtIDFdICE9ICdcMCcpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGhhc2hsaW1pdF9tdF9jaGVja19jb21tb24ocGFyLCAmaW5mby0+aGluZm8sICZpbmZvLT5jZmcsCisJCQkJCSBpbmZvLT5uYW1lLCAyKTsKK30KKworc3RhdGljIHZvaWQgaGFzaGxpbWl0X210X2Rlc3Ryb3lfdjEoY29uc3Qgc3RydWN0IHh0X210ZHRvcl9wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMSAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCisJaHRhYmxlX3B1dChpbmZvLT5oaW5mbyk7Cit9CisKIHN0YXRpYyB2b2lkIGhhc2hsaW1pdF9tdF9kZXN0cm95KGNvbnN0IHN0cnVjdCB4dF9tdGR0b3JfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEgKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzIgKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCWh0YWJsZV9wdXQoaW5mby0+aGluZm8pOwogfQpAQCAtNzIzLDggKzgzNiwxOCBAQAogCQkubmFtZSAgICAgICAgICAgPSAiaGFzaGxpbWl0IiwKIAkJLnJldmlzaW9uICAgICAgID0gMSwKIAkJLmZhbWlseSAgICAgICAgID0gTkZQUk9UT19JUFY0LAotCQkubWF0Y2ggICAgICAgICAgPSBoYXNobGltaXRfbXQsCisJCS5tYXRjaCAgICAgICAgICA9IGhhc2hsaW1pdF9tdF92MSwKIAkJLm1hdGNoc2l6ZSAgICAgID0gc2l6ZW9mKHN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMSksCisJCS5jaGVja2VudHJ5ICAgICA9IGhhc2hsaW1pdF9tdF9jaGVja192MSwKKwkJLmRlc3Ryb3kgICAgICAgID0gaGFzaGxpbWl0X210X2Rlc3Ryb3lfdjEsCisJCS5tZSAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCX0sCisJeworCQkubmFtZSAgICAgICAgICAgPSAiaGFzaGxpbWl0IiwKKwkJLnJldmlzaW9uICAgICAgID0gMiwKKwkJLmZhbWlseSAgICAgICAgID0gTkZQUk9UT19JUFY0LAorCQkubWF0Y2ggICAgICAgICAgPSBoYXNobGltaXRfbXQsCisJCS5tYXRjaHNpemUgICAgICA9IHNpemVvZihzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzIpLAogCQkuY2hlY2tlbnRyeSAgICAgPSBoYXNobGltaXRfbXRfY2hlY2ssCiAJCS5kZXN0cm95ICAgICAgICA9IGhhc2hsaW1pdF9tdF9kZXN0cm95LAogCQkubWUgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKQEAgLTczNCw4ICs4NTcsMTggQEAKIAkJLm5hbWUgICAgICAgICAgID0gImhhc2hsaW1pdCIsCiAJCS5yZXZpc2lvbiAgICAgICA9IDEsCiAJCS5mYW1pbHkgICAgICAgICA9IE5GUFJPVE9fSVBWNiwKLQkJLm1hdGNoICAgICAgICAgID0gaGFzaGxpbWl0X210LAorCQkubWF0Y2ggICAgICAgICAgPSBoYXNobGltaXRfbXRfdjEsCiAJCS5tYXRjaHNpemUgICAgICA9IHNpemVvZihzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEpLAorCQkuY2hlY2tlbnRyeSAgICAgPSBoYXNobGltaXRfbXRfY2hlY2tfdjEsCisJCS5kZXN0cm95ICAgICAgICA9IGhhc2hsaW1pdF9tdF9kZXN0cm95X3YxLAorCQkubWUgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwl9LAorCXsKKwkJLm5hbWUgICAgICAgICAgID0gImhhc2hsaW1pdCIsCisJCS5yZXZpc2lvbiAgICAgICA9IDIsCisJCS5mYW1pbHkgICAgICAgICA9IE5GUFJPVE9fSVBWNiwKKwkJLm1hdGNoICAgICAgICAgID0gaGFzaGxpbWl0X210LAorCQkubWF0Y2hzaXplICAgICAgPSBzaXplb2Yoc3RydWN0IHh0X2hhc2hsaW1pdF9tdGluZm8yKSwKIAkJLmNoZWNrZW50cnkgICAgID0gaGFzaGxpbWl0X210X2NoZWNrLAogCQkuZGVzdHJveSAgICAgICAgPSBoYXNobGltaXRfbXRfZGVzdHJveSwKIAkJLm1lICAgICAgICAgICAgID0gVEhJU19NT0RVTEUsCkBAIC03ODYsMTggKzkxOSwxMiBAQAogCXNwaW5fdW5sb2NrX2JoKCZodGFibGUtPmxvY2spOwogfQogCi1zdGF0aWMgaW50IGRsX3NlcV9yZWFsX3Nob3coc3RydWN0IGRzdGhhc2hfZW50ICplbnQsIHVfaW50OF90IGZhbWlseSwKLQkJCQkgICBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCitzdGF0aWMgdm9pZCBkbF9zZXFfcHJpbnQoc3RydWN0IGRzdGhhc2hfZW50ICplbnQsIHVfaW50OF90IGZhbWlseSwKKwkJCSBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmh0ID0gcy0+cHJpdmF0ZTsKLQotCXNwaW5fbG9jaygmZW50LT5sb2NrKTsKLQkvKiByZWNhbGN1bGF0ZSB0byBzaG93IGFjY3VyYXRlIG51bWJlcnMgKi8KLQlyYXRlaW5mb19yZWNhbGMoZW50LCBqaWZmaWVzLCBodC0+Y2ZnLm1vZGUpOwotCiAJc3dpdGNoIChmYW1pbHkpIHsKIAljYXNlIE5GUFJPVE9fSVBWNDoKLQkJc2VxX3ByaW50ZihzLCAiJWxkICVwSTQ6JXUtPiVwSTQ6JXUgJXUgJXUgJXVcbiIsCisJCXNlcV9wcmludGYocywgIiVsZCAlcEk0OiV1LT4lcEk0OiV1ICVsbHUgJWxsdSAlbGx1XG4iLAogCQkJICAgKGxvbmcpKGVudC0+ZXhwaXJlcyAtIGppZmZpZXMpL0haLAogCQkJICAgJmVudC0+ZHN0LmlwLnNyYywKIAkJCSAgIG50b2hzKGVudC0+ZHN0LnNyY19wb3J0KSwKQEAgLTgwOCw3ICs5MzUsNyBAQAogCQlicmVhazsKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpCiAJY2FzZSBORlBST1RPX0lQVjY6Ci0JCXNlcV9wcmludGYocywgIiVsZCAlcEk2OiV1LT4lcEk2OiV1ICV1ICV1ICV1XG4iLAorCQlzZXFfcHJpbnRmKHMsICIlbGQgJXBJNjoldS0+JXBJNjoldSAlbGx1ICVsbHUgJWxsdVxuIiwKIAkJCSAgIChsb25nKShlbnQtPmV4cGlyZXMgLSBqaWZmaWVzKS9IWiwKIAkJCSAgICZlbnQtPmRzdC5pcDYuc3JjLAogCQkJICAgbnRvaHMoZW50LT5kc3Quc3JjX3BvcnQpLApAQCAtODIxLDEwICs5NDgsNTIgQEAKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9Cit9CisKK3N0YXRpYyBpbnQgZGxfc2VxX3JlYWxfc2hvd192MShzdHJ1Y3QgZHN0aGFzaF9lbnQgKmVudCwgdV9pbnQ4X3QgZmFtaWx5LAorCQkJICAgICAgIHN0cnVjdCBzZXFfZmlsZSAqcykKK3sKKwljb25zdCBzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaHQgPSBzLT5wcml2YXRlOworCisJc3Bpbl9sb2NrKCZlbnQtPmxvY2spOworCS8qIHJlY2FsY3VsYXRlIHRvIHNob3cgYWNjdXJhdGUgbnVtYmVycyAqLworCXJhdGVpbmZvX3JlY2FsYyhlbnQsIGppZmZpZXMsIGh0LT5jZmcubW9kZSwgMSk7CisKKwlkbF9zZXFfcHJpbnQoZW50LCBmYW1pbHksIHMpOworCiAJc3Bpbl91bmxvY2soJmVudC0+bG9jayk7CiAJcmV0dXJuIHNlcV9oYXNfb3ZlcmZsb3dlZChzKTsKIH0KIAorc3RhdGljIGludCBkbF9zZXFfcmVhbF9zaG93KHN0cnVjdCBkc3RoYXNoX2VudCAqZW50LCB1X2ludDhfdCBmYW1pbHksCisJCQkgICAgc3RydWN0IHNlcV9maWxlICpzKQoreworCWNvbnN0IHN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpodCA9IHMtPnByaXZhdGU7CisKKwlzcGluX2xvY2soJmVudC0+bG9jayk7CisJLyogcmVjYWxjdWxhdGUgdG8gc2hvdyBhY2N1cmF0ZSBudW1iZXJzICovCisJcmF0ZWluZm9fcmVjYWxjKGVudCwgamlmZmllcywgaHQtPmNmZy5tb2RlLCAyKTsKKworCWRsX3NlcV9wcmludChlbnQsIGZhbWlseSwgcyk7CisKKwlzcGluX3VubG9jaygmZW50LT5sb2NrKTsKKwlyZXR1cm4gc2VxX2hhc19vdmVyZmxvd2VkKHMpOworfQorCitzdGF0aWMgaW50IGRsX3NlcV9zaG93X3YxKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaHRhYmxlID0gcy0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgKmJ1Y2tldCA9ICh1bnNpZ25lZCBpbnQgKil2OworCXN0cnVjdCBkc3RoYXNoX2VudCAqZW50OworCisJaWYgKCFobGlzdF9lbXB0eSgmaHRhYmxlLT5oYXNoWypidWNrZXRdKSkgeworCQlobGlzdF9mb3JfZWFjaF9lbnRyeShlbnQsICZodGFibGUtPmhhc2hbKmJ1Y2tldF0sIG5vZGUpCisJCQlpZiAoZGxfc2VxX3JlYWxfc2hvd192MShlbnQsIGh0YWJsZS0+ZmFtaWx5LCBzKSkKKwkJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGRsX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaHRhYmxlID0gcy0+cHJpdmF0ZTsKQEAgLTgzOSw2ICsxMDA4LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZGxfc2VxX29wc192MSA9IHsKKwkuc3RhcnQgPSBkbF9zZXFfc3RhcnQsCisJLm5leHQgID0gZGxfc2VxX25leHQsCisJLnN0b3AgID0gZGxfc2VxX3N0b3AsCisJLnNob3cgID0gZGxfc2VxX3Nob3dfdjEKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZGxfc2VxX29wcyA9IHsKIAkuc3RhcnQgPSBkbF9zZXFfc3RhcnQsCiAJLm5leHQgID0gZGxfc2VxX25leHQsCkBAIC04NDYsOSArMTAyMiw5IEBACiAJLnNob3cgID0gZGxfc2VxX3Nob3cKIH07CiAKLXN0YXRpYyBpbnQgZGxfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIGludCBkbF9wcm9jX29wZW5fdjEoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JaW50IHJldCA9IHNlcV9vcGVuKGZpbGUsICZkbF9zZXFfb3BzKTsKKwlpbnQgcmV0ID0gc2VxX29wZW4oZmlsZSwgJmRsX3NlcV9vcHNfdjEpOwogCiAJaWYgKCFyZXQpIHsKIAkJc3RydWN0IHNlcV9maWxlICpzZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKQEAgLTg1Nyw2ICsxMDMzLDI2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBkbF9wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJldCA9IHNlcV9vcGVuKGZpbGUsICZkbF9zZXFfb3BzKTsKKworCWlmICghcmV0KSB7CisJCXN0cnVjdCBzZXFfZmlsZSAqc2YgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkJc2YtPnByaXZhdGUgPSBQREVfREFUQShpbm9kZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRsX2ZpbGVfb3BzX3YxID0geworCS5vd25lciAgID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSBkbF9wcm9jX29wZW5fdjEsCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkbF9maWxlX29wcyA9IHsKIAkub3duZXIgICA9IFRISVNfTU9EVUxFLAogCS5vcGVuICAgID0gZGxfcHJvY19vcGVuLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9oZWxwZXIuYyBiL25ldC9uZXRmaWx0ZXIveHRfaGVscGVyLmMKaW5kZXggOWY0YWIwMC4uZjY3OWRkNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9oZWxwZXIuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2hlbHBlci5jCkBAIC00MSw3ICs0MSw3IEBACiAJaWYgKCFtYXN0ZXJfaGVscCkKIAkJcmV0dXJuIHJldDsKIAotCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfc2xvdyAqLworCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfdGhyZXNoICovCiAJaGVscGVyID0gcmN1X2RlcmVmZXJlbmNlKG1hc3Rlcl9oZWxwLT5oZWxwZXIpOwogCWlmICghaGVscGVyKQogCQlyZXR1cm4gcmV0OwpAQCAtNjUsNyArNjUsNyBAQAogCQkJcGFyLT5mYW1pbHkpOwogCQlyZXR1cm4gcmV0OwogCX0KLQlpbmZvLT5uYW1lWzI5XSA9ICdcMCc7CisJaW5mby0+bmFtZVtzaXplb2YoaW5mby0+bmFtZSkgLSAxXSA9ICdcMCc7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfbmZhY2N0LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X25mYWNjdC5jCmluZGV4IDMwNDhhN2UuLmNmMzI3NTkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfbmZhY2N0LmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9uZmFjY3QuYwpAQCAtMjYsNyArMjYsNyBAQAogCiAJbmZubF9hY2N0X3VwZGF0ZShza2IsIGluZm8tPm5mYWNjdCk7CiAKLQlvdmVycXVvdGEgPSBuZm5sX2FjY3Rfb3ZlcnF1b3RhKHNrYiwgaW5mby0+bmZhY2N0KTsKKwlvdmVycXVvdGEgPSBuZm5sX2FjY3Rfb3ZlcnF1b3RhKHBhci0+bmV0LCBza2IsIGluZm8tPm5mYWNjdCk7CiAKIAlyZXR1cm4gb3ZlcnF1b3RhID09IE5GQUNDVF9VTkRFUlFVT1RBID8gZmFsc2UgOiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9waHlzZGV2LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuYwppbmRleCBlNWYxODk4Li5iYjMzNTk4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuYwpAQCAtMTA3LDggKzEwNyw4IEBACiAJICAgICBpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX0JSSURHRUQpICYmCiAJICAgIHBhci0+aG9va19tYXNrICYgKCgxIDw8IE5GX0lORVRfTE9DQUxfT1VUKSB8CiAJICAgICgxIDw8IE5GX0lORVRfRk9SV0FSRCkgfCAoMSA8PCBORl9JTkVUX1BPU1RfUk9VVElORykpKSB7Ci0JCXByX2luZm8oInVzaW5nIC0tcGh5c2Rldi1vdXQgYW5kIC0tcGh5c2Rldi1pcy1vdXQgYXJlIG9ubHkiCi0JCQkic3VwcG9ydGVkIGluIHRoZSBGT1JXQVJEIGFuZCBQT1NUUk9VVElORyBjaGFpbnMgd2l0aCIKKwkJcHJfaW5mbygidXNpbmcgLS1waHlzZGV2LW91dCBhbmQgLS1waHlzZGV2LWlzLW91dCBhcmUgb25seSAiCisJCQkic3VwcG9ydGVkIGluIHRoZSBGT1JXQVJEIGFuZCBQT1NUUk9VVElORyBjaGFpbnMgd2l0aCAiCiAJCQkiYnJpZGdlZCB0cmFmZmljLlxuIik7CiAJCWlmIChwYXItPmhvb2tfbWFzayAmICgxIDw8IE5GX0lORVRfTE9DQUxfT1VUKSkKIAkJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9yZWNlbnQuYyBiL25ldC9uZXRmaWx0ZXIveHRfcmVjZW50LmMKaW5kZXggZDcyNWEyNy4uZTNiN2EwOSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9yZWNlbnQuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3JlY2VudC5jCkBAIC0xMTAsNyArMTEwLDYgQEAKICNlbmRpZgogCiBzdGF0aWMgdV9pbnQzMl90IGhhc2hfcm5kIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMgYm9vbCBoYXNoX3JuZF9pbml0ZWQgX19yZWFkX21vc3RseTsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcmVjZW50X2VudHJ5X2hhc2g0KGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqYWRkcikKIHsKQEAgLTM0MCwxMCArMzM5LDggQEAKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAlzaXplX3Qgc3o7CiAKLQlpZiAodW5saWtlbHkoIWhhc2hfcm5kX2luaXRlZCkpIHsKLQkJZ2V0X3JhbmRvbV9ieXRlcygmaGFzaF9ybmQsIHNpemVvZihoYXNoX3JuZCkpOwotCQloYXNoX3JuZF9pbml0ZWQgPSB0cnVlOwotCX0KKwluZXRfZ2V0X3JhbmRvbV9vbmNlKCZoYXNoX3JuZCwgc2l6ZW9mKGhhc2hfcm5kKSk7CisKIAlpZiAoaW5mby0+Y2hlY2tfc2V0ICYgflhUX1JFQ0VOVF9WQUxJRF9GTEFHUykgewogCQlwcl9pbmZvKCJVbnN1cHBvcnRlZCB1c2VyIHNwYWNlIGZsYWdzICglMDh4KVxuIiwKIAkJCWluZm8tPmNoZWNrX3NldCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3NjdHAuYyBiL25ldC9uZXRmaWx0ZXIveHRfc2N0cC5jCmluZGV4IGVmMzZhNTYuLjRkZWRiOTYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfc2N0cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfc2N0cC5jCkBAIC02OCw3ICs2OCw3IEBACiAJCQkgKytpLCBvZmZzZXQsIHNjaC0+dHlwZSwgaHRvbnMoc2NoLT5sZW5ndGgpLAogCQkJIHNjaC0+ZmxhZ3MpOwogI2VuZGlmCi0JCW9mZnNldCArPSBXT1JEX1JPVU5EKG50b2hzKHNjaC0+bGVuZ3RoKSk7CisJCW9mZnNldCArPSBTQ1RQX1BBRDQobnRvaHMoc2NoLT5sZW5ndGgpKTsKIAogCQlwcl9kZWJ1Zygic2tiLT5sZW46ICVkXHRvZmZzZXQ6ICVkXG4iLCBza2ItPmxlbiwgb2Zmc2V0KTsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvZGlhZy5jIGIvbmV0L25ldGxpbmsvZGlhZy5jCmluZGV4IDhkZDgzNmEuLmIyZjBlOTggMTAwNjQ0Ci0tLSBhL25ldC9uZXRsaW5rL2RpYWcuYworKysgYi9uZXQvbmV0bGluay9kaWFnLmMKQEAgLTYzLDQzICs2Myw3NCBAQAogc3RhdGljIGludCBfX25ldGxpbmtfZGlhZ19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJCQlpbnQgcHJvdG9jb2wsIGludCBzX251bSkKIHsKKwlzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICpodGkgPSAodm9pZCAqKWNiLT5hcmdzWzJdOwogCXN0cnVjdCBuZXRsaW5rX3RhYmxlICp0YmwgPSAmbmxfdGFibGVbcHJvdG9jb2xdOwotCXN0cnVjdCByaGFzaHRhYmxlICpodCA9ICZ0YmwtPmhhc2g7Ci0JY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqaHRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UoaHQtPnRibCwgaHQpOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOwogCXN0cnVjdCBuZXRsaW5rX2RpYWdfcmVxICpyZXE7CiAJc3RydWN0IG5ldGxpbmtfc29jayAqbmxzazsKIAlzdHJ1Y3Qgc29jayAqc2s7Ci0JaW50IHJldCA9IDAsIG51bSA9IDAsIGk7CisJaW50IG51bSA9IDI7CisJaW50IHJldCA9IDA7CiAKIAlyZXEgPSBubG1zZ19kYXRhKGNiLT5ubGgpOwogCi0JZm9yIChpID0gMDsgaSA8IGh0YmwtPnNpemU7IGkrKykgewotCQlzdHJ1Y3Qgcmhhc2hfaGVhZCAqcG9zOworCWlmIChzX251bSA+IDEpCisJCWdvdG8gbWNfbGlzdDsKIAotCQlyaHRfZm9yX2VhY2hfZW50cnlfcmN1KG5sc2ssIHBvcywgaHRibCwgaSwgbm9kZSkgewotCQkJc2sgPSAoc3RydWN0IHNvY2sgKilubHNrOworCW51bS0tOwogCi0JCQlpZiAoIW5ldF9lcShzb2NrX25ldChzayksIG5ldCkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAobnVtIDwgc19udW0pIHsKLQkJCQludW0rKzsKKwlpZiAoIWh0aSkgeworCQlodGkgPSBrbWFsbG9jKHNpemVvZigqaHRpKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaHRpKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJY2ItPmFyZ3NbMl0gPSAobG9uZylodGk7CisJfQorCisJaWYgKCFzX251bSkKKwkJcmhhc2h0YWJsZV93YWxrX2VudGVyKCZ0YmwtPmhhc2gsIGh0aSk7CisKKwlyZXQgPSByaGFzaHRhYmxlX3dhbGtfc3RhcnQoaHRpKTsKKwlpZiAocmV0ID09IC1FQUdBSU4pCisJCXJldCA9IDA7CisJaWYgKHJldCkKKwkJZ290byBzdG9wOworCisJd2hpbGUgKChubHNrID0gcmhhc2h0YWJsZV93YWxrX25leHQoaHRpKSkpIHsKKwkJaWYgKElTX0VSUihubHNrKSkgeworCQkJcmV0ID0gUFRSX0VSUihubHNrKTsKKwkJCWlmIChyZXQgPT0gLUVBR0FJTikgeworCQkJCXJldCA9IDA7CiAJCQkJY29udGludWU7CiAJCQl9CisJCQlicmVhazsKKwkJfQogCi0JCQlpZiAoc2tfZGlhZ19maWxsKHNrLCBza2IsIHJlcSwKLQkJCQkJIE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkLAotCQkJCQkgY2ItPm5saC0+bmxtc2dfc2VxLAotCQkJCQkgTkxNX0ZfTVVMVEksCi0JCQkJCSBzb2NrX2lfaW5vKHNrKSkgPCAwKSB7Ci0JCQkJcmV0ID0gMTsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9CisJCXNrID0gKHN0cnVjdCBzb2NrICopbmxzazsKIAotCQkJbnVtKys7CisJCWlmICghbmV0X2VxKHNvY2tfbmV0KHNrKSwgbmV0KSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChza19kaWFnX2ZpbGwoc2ssIHNrYiwgcmVxLAorCQkJCSBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKKwkJCQkgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCSBOTE1fRl9NVUxUSSwKKwkJCQkgc29ja19pX2lubyhzaykpIDwgMCkgeworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOwogCQl9CiAJfQogCitzdG9wOgorCXJoYXNodGFibGVfd2Fsa19zdG9wKGh0aSk7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCisJcmhhc2h0YWJsZV93YWxrX2V4aXQoaHRpKTsKKwludW0rKzsKKworbWNfbGlzdDoKKwlyZWFkX2xvY2soJm5sX3RhYmxlX2xvY2spOwogCXNrX2Zvcl9lYWNoX2JvdW5kKHNrLCAmdGJsLT5tY19saXN0KSB7CiAJCWlmIChza19oYXNoZWQoc2spKQogCQkJY29udGludWU7CkBAIC0xMTYsMTMgKzE0NywxNCBAQAogCQkJCSBOTE1fRl9NVUxUSSwKIAkJCQkgc29ja19pX2lubyhzaykpIDwgMCkgewogCQkJcmV0ID0gMTsKLQkJCWdvdG8gZG9uZTsKKwkJCWJyZWFrOwogCQl9CiAJCW51bSsrOwogCX0KKwlyZWFkX3VubG9jaygmbmxfdGFibGVfbG9jayk7CisKIGRvbmU6CiAJY2ItPmFyZ3NbMF0gPSBudW07Ci0JY2ItPmFyZ3NbMV0gPSBwcm90b2NvbDsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMzEsMjAgKzE2MywyMCBAQAogewogCXN0cnVjdCBuZXRsaW5rX2RpYWdfcmVxICpyZXE7CiAJaW50IHNfbnVtID0gY2ItPmFyZ3NbMF07CisJaW50IGVyciA9IDA7CiAKIAlyZXEgPSBubG1zZ19kYXRhKGNiLT5ubGgpOwogCi0JcmN1X3JlYWRfbG9jaygpOwotCXJlYWRfbG9jaygmbmxfdGFibGVfbG9jayk7Ci0KIAlpZiAocmVxLT5zZGlhZ19wcm90b2NvbCA9PSBORElBR19QUk9UT19BTEwpIHsKIAkJaW50IGk7CiAKIAkJZm9yIChpID0gY2ItPmFyZ3NbMV07IGkgPCBNQVhfTElOS1M7IGkrKykgewotCQkJaWYgKF9fbmV0bGlua19kaWFnX2R1bXAoc2tiLCBjYiwgaSwgc19udW0pKQorCQkJZXJyID0gX19uZXRsaW5rX2RpYWdfZHVtcChza2IsIGNiLCBpLCBzX251bSk7CisJCQlpZiAoZXJyKQogCQkJCWJyZWFrOwogCQkJc19udW0gPSAwOwogCQl9CisJCWNiLT5hcmdzWzFdID0gaTsKIAl9IGVsc2UgewogCQlpZiAocmVxLT5zZGlhZ19wcm90b2NvbCA+PSBNQVhfTElOS1MpIHsKIAkJCXJlYWRfdW5sb2NrKCZubF90YWJsZV9sb2NrKTsKQEAgLTE1MiwxMyArMTg0LDIyIEBACiAJCQlyZXR1cm4gLUVOT0VOVDsKIAkJfQogCi0JCV9fbmV0bGlua19kaWFnX2R1bXAoc2tiLCBjYiwgcmVxLT5zZGlhZ19wcm90b2NvbCwgc19udW0pOworCQllcnIgPSBfX25ldGxpbmtfZGlhZ19kdW1wKHNrYiwgY2IsIHJlcS0+c2RpYWdfcHJvdG9jb2wsIHNfbnVtKTsKIAl9CiAKLQlyZWFkX3VubG9jaygmbmxfdGFibGVfbG9jayk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIGVyciA8IDAgPyBlcnIgOiBza2ItPmxlbjsKK30KIAotCXJldHVybiBza2ItPmxlbjsKK3N0YXRpYyBpbnQgbmV0bGlua19kaWFnX2R1bXBfZG9uZShzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IHJoYXNodGFibGVfaXRlciAqaHRpID0gKHZvaWQgKiljYi0+YXJnc1syXTsKKworCWlmIChjYi0+YXJnc1swXSA9PSAxKQorCQlyaGFzaHRhYmxlX3dhbGtfZXhpdChodGkpOworCisJa2ZyZWUoaHRpKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG5ldGxpbmtfZGlhZ19oYW5kbGVyX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpoKQpAQCAtMTcyLDYgKzIxMyw3IEBACiAJaWYgKGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRFVNUCkgewogCQlzdHJ1Y3QgbmV0bGlua19kdW1wX2NvbnRyb2wgYyA9IHsKIAkJCS5kdW1wID0gbmV0bGlua19kaWFnX2R1bXAsCisJCQkuZG9uZSA9IG5ldGxpbmtfZGlhZ19kdW1wX2RvbmUsCiAJCX07CiAJCXJldHVybiBuZXRsaW5rX2R1bXBfc3RhcnQobmV0LT5kaWFnX25sc2ssIHNrYiwgaCwgJmMpOwogCX0gZWxzZQpkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwppbmRleCBhMDkxMzJhLi4yM2NjMTI2IDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9nZW5ldGxpbmsuYworKysgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwpAQCAtOTc3LDcgKzk3Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ2VubF9vcHMgZ2VubF9jdHJsX29wc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBnZW5sX29wcyBnZW5sX2N0cmxfb3BzW10gPSB7CiAJewogCQkuY21kCQk9IENUUkxfQ01EX0dFVEZBTUlMWSwKIAkJLmRvaXQJCT0gY3RybF9nZXRmYW1pbHksCkBAIC05ODYsNyArOTg2LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCBnZW5sX2N0cmxfZ3JvdXBzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdlbmxfbXVsdGljYXN0X2dyb3VwIGdlbmxfY3RybF9ncm91cHNbXSA9IHsKIAl7IC5uYW1lID0gIm5vdGlmeSIsIH0sCiB9OwogCmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jIGIvbmV0L29wZW52c3dpdGNoL2FjdGlvbnMuYwppbmRleCAxZWNiZDc3Li40ZTAzZjY0IDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jCisrKyBiL25ldC9vcGVudnN3aXRjaC9hY3Rpb25zLmMKQEAgLTcxLDYgKzcxLDggQEAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgb3ZzX2ZyYWdfZGF0YSwgb3ZzX2ZyYWdfZGF0YV9zdG9yYWdlKTsKIAogI2RlZmluZSBERUZFUlJFRF9BQ1RJT05fRklGT19TSVpFIDEwCisjZGVmaW5lIE9WU19SRUNVUlNJT05fTElNSVQgNQorI2RlZmluZSBPVlNfREVGRVJSRURfQUNUSU9OX1RIUkVTSE9MRCAoT1ZTX1JFQ1VSU0lPTl9MSU1JVCAtIDIpCiBzdHJ1Y3QgYWN0aW9uX2ZpZm8gewogCWludCBoZWFkOwogCWludCB0YWlsOwpAQCAtNzgsNyArODAsMTIgQEAKIAlzdHJ1Y3QgZGVmZXJyZWRfYWN0aW9uIGZpZm9bREVGRVJSRURfQUNUSU9OX0ZJRk9fU0laRV07CiB9OwogCitzdHJ1Y3QgcmVjaXJjX2tleXMgeworCXN0cnVjdCBzd19mbG93X2tleSBrZXlbT1ZTX0RFRkVSUkVEX0FDVElPTl9USFJFU0hPTERdOworfTsKKwogc3RhdGljIHN0cnVjdCBhY3Rpb25fZmlmbyBfX3BlcmNwdSAqYWN0aW9uX2ZpZm9zOworc3RhdGljIHN0cnVjdCByZWNpcmNfa2V5cyBfX3BlcmNwdSAqcmVjaXJjX2tleXM7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBleGVjX2FjdGlvbnNfbGV2ZWwpOwogCiBzdGF0aWMgdm9pZCBhY3Rpb25fZmlmb19pbml0KHN0cnVjdCBhY3Rpb25fZmlmbyAqZmlmbykKQEAgLTE1Myw3ICsxNjAsNyBAQAogc3RhdGljIGludCBwdXNoX21wbHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksCiAJCSAgICAgY29uc3Qgc3RydWN0IG92c19hY3Rpb25fcHVzaF9tcGxzICptcGxzKQogewotCV9fYmUzMiAqbmV3X21wbHNfbHNlOworCXN0cnVjdCBtcGxzX3NoaW1faGRyICpuZXdfbXBsc19sc2U7CiAKIAkvKiBOZXR3b3JraW5nIHN0YWNrIGRvIG5vdCBhbGxvdyBzaW11bHRhbmVvdXMgVHVubmVsIGFuZCBNUExTIEdTTy4gKi8KIAlpZiAoc2tiLT5lbmNhcHN1bGF0aW9uKQpAQCAtMTYyLDE5ICsxNjksMjMgQEAKIAlpZiAoc2tiX2Nvd19oZWFkKHNrYiwgTVBMU19ITEVOKSA8IDApCiAJCXJldHVybiAtRU5PTUVNOwogCisJaWYgKCFza2ItPmlubmVyX3Byb3RvY29sKSB7CisJCXNrYl9zZXRfaW5uZXJfbmV0d29ya19oZWFkZXIoc2tiLCBza2ItPm1hY19sZW4pOworCQlza2Jfc2V0X2lubmVyX3Byb3RvY29sKHNrYiwgc2tiLT5wcm90b2NvbCk7CisJfQorCiAJc2tiX3B1c2goc2tiLCBNUExTX0hMRU4pOwogCW1lbW1vdmUoc2tiX21hY19oZWFkZXIoc2tiKSAtIE1QTFNfSExFTiwgc2tiX21hY19oZWFkZXIoc2tiKSwKIAkJc2tiLT5tYWNfbGVuKTsKIAlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBza2ItPm1hY19sZW4pOwogCi0JbmV3X21wbHNfbHNlID0gKF9fYmUzMiAqKXNrYl9tcGxzX2hlYWRlcihza2IpOwotCSpuZXdfbXBsc19sc2UgPSBtcGxzLT5tcGxzX2xzZTsKKwluZXdfbXBsc19sc2UgPSBtcGxzX2hkcihza2IpOworCW5ld19tcGxzX2xzZS0+bGFiZWxfc3RhY2tfZW50cnkgPSBtcGxzLT5tcGxzX2xzZTsKIAogCXNrYl9wb3N0cHVzaF9yY3N1bShza2IsIG5ld19tcGxzX2xzZSwgTVBMU19ITEVOKTsKIAogCXVwZGF0ZV9ldGhlcnR5cGUoc2tiLCBldGhfaGRyKHNrYiksIG1wbHMtPm1wbHNfZXRoZXJ0eXBlKTsKLQlpZiAoIXNrYi0+aW5uZXJfcHJvdG9jb2wpCi0JCXNrYl9zZXRfaW5uZXJfcHJvdG9jb2woc2tiLCBza2ItPnByb3RvY29sKTsKIAlza2ItPnByb3RvY29sID0gbXBscy0+bXBsc19ldGhlcnR5cGU7CiAKIAlpbnZhbGlkYXRlX2Zsb3dfa2V5KGtleSk7CkBAIC0xOTEsMTggKzIwMiwxOSBAQAogCWlmICh1bmxpa2VseShlcnIpKQogCQlyZXR1cm4gZXJyOwogCi0Jc2tiX3Bvc3RwdWxsX3Jjc3VtKHNrYiwgc2tiX21wbHNfaGVhZGVyKHNrYiksIE1QTFNfSExFTik7CisJc2tiX3Bvc3RwdWxsX3Jjc3VtKHNrYiwgbXBsc19oZHIoc2tiKSwgTVBMU19ITEVOKTsKIAogCW1lbW1vdmUoc2tiX21hY19oZWFkZXIoc2tiKSArIE1QTFNfSExFTiwgc2tiX21hY19oZWFkZXIoc2tiKSwKIAkJc2tiLT5tYWNfbGVuKTsKIAogCV9fc2tiX3B1bGwoc2tiLCBNUExTX0hMRU4pOwogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJc2tiX3NldF9uZXR3b3JrX2hlYWRlcihza2IsIHNrYi0+bWFjX2xlbik7CiAKLQkvKiBza2JfbXBsc19oZWFkZXIoKSBpcyB1c2VkIHRvIGxvY2F0ZSB0aGUgZXRoZXJ0eXBlCi0JICogZmllbGQgY29ycmVjdGx5IGluIHRoZSBwcmVzZW5jZSBvZiBWTEFOIHRhZ3MuCisJLyogbXBsc19oZHIoKSBpcyB1c2VkIHRvIGxvY2F0ZSB0aGUgZXRoZXJ0eXBlIGZpZWxkIGNvcnJlY3RseSBpbiB0aGUKKwkgKiBwcmVzZW5jZSBvZiBWTEFOIHRhZ3MuCiAJICovCi0JaGRyID0gKHN0cnVjdCBldGhoZHIgKikoc2tiX21wbHNfaGVhZGVyKHNrYikgLSBFVEhfSExFTik7CisJaGRyID0gKHN0cnVjdCBldGhoZHIgKikoKHZvaWQgKiltcGxzX2hkcihza2IpIC0gRVRIX0hMRU4pOwogCXVwZGF0ZV9ldGhlcnR5cGUoc2tiLCBoZHIsIGV0aGVydHlwZSk7CiAJaWYgKGV0aF9wX21wbHMoc2tiLT5wcm90b2NvbCkpCiAJCXNrYi0+cHJvdG9jb2wgPSBldGhlcnR5cGU7CkBAIC0yMTQsNyArMjI2LDcgQEAKIHN0YXRpYyBpbnQgc2V0X21wbHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHN3X2Zsb3dfa2V5ICpmbG93X2tleSwKIAkJICAgIGNvbnN0IF9fYmUzMiAqbXBsc19sc2UsIGNvbnN0IF9fYmUzMiAqbWFzaykKIHsKLQlfX2JlMzIgKnN0YWNrOworCXN0cnVjdCBtcGxzX3NoaW1faGRyICpzdGFjazsKIAlfX2JlMzIgbHNlOwogCWludCBlcnI7CiAKQEAgLTIyMiwxNiArMjM0LDE2IEBACiAJaWYgKHVubGlrZWx5KGVycikpCiAJCXJldHVybiBlcnI7CiAKLQlzdGFjayA9IChfX2JlMzIgKilza2JfbXBsc19oZWFkZXIoc2tiKTsKLQlsc2UgPSBPVlNfTUFTS0VEKCpzdGFjaywgKm1wbHNfbHNlLCAqbWFzayk7CisJc3RhY2sgPSBtcGxzX2hkcihza2IpOworCWxzZSA9IE9WU19NQVNLRUQoc3RhY2stPmxhYmVsX3N0YWNrX2VudHJ5LCAqbXBsc19sc2UsICptYXNrKTsKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpIHsKLQkJX19iZTMyIGRpZmZbXSA9IHsgfigqc3RhY2spLCBsc2UgfTsKKwkJX19iZTMyIGRpZmZbXSA9IHsgfihzdGFjay0+bGFiZWxfc3RhY2tfZW50cnkpLCBsc2UgfTsKIAogCQlza2ItPmNzdW0gPSB+Y3N1bV9wYXJ0aWFsKChjaGFyICopZGlmZiwgc2l6ZW9mKGRpZmYpLAogCQkJCQkgIH5za2ItPmNzdW0pOwogCX0KIAotCSpzdGFjayA9IGxzZTsKKwlzdGFjay0+bGFiZWxfc3RhY2tfZW50cnkgPSBsc2U7CiAJZmxvd19rZXktPm1wbHMudG9wX2xzZSA9IGxzZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI0MSwyMCArMjUzLDI0IEBACiAJaW50IGVycjsKIAogCWVyciA9IHNrYl92bGFuX3BvcChza2IpOwotCWlmIChza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKQorCWlmIChza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKSB7CiAJCWludmFsaWRhdGVfZmxvd19rZXkoa2V5KTsKLQllbHNlCi0JCWtleS0+ZXRoLnRjaSA9IDA7CisJfSBlbHNlIHsKKwkJa2V5LT5ldGgudmxhbi50Y2kgPSAwOworCQlrZXktPmV0aC52bGFuLnRwaWQgPSAwOworCX0KIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IHB1c2hfdmxhbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSwKIAkJICAgICBjb25zdCBzdHJ1Y3Qgb3ZzX2FjdGlvbl9wdXNoX3ZsYW4gKnZsYW4pCiB7Ci0JaWYgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpCisJaWYgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpIHsKIAkJaW52YWxpZGF0ZV9mbG93X2tleShrZXkpOwotCWVsc2UKLQkJa2V5LT5ldGgudGNpID0gdmxhbi0+dmxhbl90Y2k7CisJfSBlbHNlIHsKKwkJa2V5LT5ldGgudmxhbi50Y2kgPSB2bGFuLT52bGFuX3RjaTsKKwkJa2V5LT5ldGgudmxhbi50cGlkID0gdmxhbi0+dmxhbl90cGlkOworCX0KIAlyZXR1cm4gc2tiX3ZsYW5fcHVzaChza2IsIHZsYW4tPnZsYW5fdHBpZCwKIAkJCSAgICAgbnRvaHModmxhbi0+dmxhbl90Y2kpICYgflZMQU5fVEFHX1BSRVNFTlQpOwogfQpAQCAtMTAxMSw2ICsxMDI3LDcgQEAKIAkJCSAgY29uc3Qgc3RydWN0IG5sYXR0ciAqYSwgaW50IHJlbSkKIHsKIAlzdHJ1Y3QgZGVmZXJyZWRfYWN0aW9uICpkYTsKKwlpbnQgbGV2ZWw7CiAKIAlpZiAoIWlzX2Zsb3dfa2V5X3ZhbGlkKGtleSkpIHsKIAkJaW50IGVycjsKQEAgLTEwMzQsNiArMTA1MSwxOCBAQAogCQkJcmV0dXJuIDA7CiAJfQogCisJbGV2ZWwgPSB0aGlzX2NwdV9yZWFkKGV4ZWNfYWN0aW9uc19sZXZlbCk7CisJaWYgKGxldmVsIDw9IE9WU19ERUZFUlJFRF9BQ1RJT05fVEhSRVNIT0xEKSB7CisJCXN0cnVjdCByZWNpcmNfa2V5cyAqcmtzID0gdGhpc19jcHVfcHRyKHJlY2lyY19rZXlzKTsKKwkJc3RydWN0IHN3X2Zsb3dfa2V5ICpyZWNpcmNfa2V5ID0gJnJrcy0+a2V5W2xldmVsIC0gMV07CisKKwkJKnJlY2lyY19rZXkgPSAqa2V5OworCQlyZWNpcmNfa2V5LT5yZWNpcmNfaWQgPSBubGFfZ2V0X3UzMihhKTsKKwkJb3ZzX2RwX3Byb2Nlc3NfcGFja2V0KHNrYiwgcmVjaXJjX2tleSk7CisKKwkJcmV0dXJuIDA7CisJfQorCiAJZGEgPSBhZGRfZGVmZXJyZWRfYWN0aW9ucyhza2IsIGtleSwgTlVMTCk7CiAJaWYgKGRhKSB7CiAJCWRhLT5wa3Rfa2V5LnJlY2lyY19pZCA9IG5sYV9nZXRfdTMyKGEpOwpAQCAtMTIwMCwxMSArMTIyOSwxMCBAQAogCQkJY29uc3Qgc3RydWN0IHN3X2Zsb3dfYWN0aW9ucyAqYWN0cywKIAkJCXN0cnVjdCBzd19mbG93X2tleSAqa2V5KQogewotCXN0YXRpYyBjb25zdCBpbnQgb3ZzX3JlY3Vyc2lvbl9saW1pdCA9IDU7CiAJaW50IGVyciwgbGV2ZWw7CiAKIAlsZXZlbCA9IF9fdGhpc19jcHVfaW5jX3JldHVybihleGVjX2FjdGlvbnNfbGV2ZWwpOwotCWlmICh1bmxpa2VseShsZXZlbCA+IG92c19yZWN1cnNpb25fbGltaXQpKSB7CisJaWYgKHVubGlrZWx5KGxldmVsID4gT1ZTX1JFQ1VSU0lPTl9MSU1JVCkpIHsKIAkJbmV0X2NyaXRfcmF0ZWxpbWl0ZWQoIm92czogcmVjdXJzaW9uIGxpbWl0IHJlYWNoZWQgb24gZGF0YXBhdGggJXMsIHByb2JhYmxlIGNvbmZpZ3VyYXRpb24gZXJyb3JcbiIsCiAJCQkJICAgICBvdnNfZHBfbmFtZShkcCkpOwogCQlrZnJlZV9za2Ioc2tiKTsKQEAgLTEyMjksMTAgKzEyNTcsMTcgQEAKIAlpZiAoIWFjdGlvbl9maWZvcykKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlyZWNpcmNfa2V5cyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcmVjaXJjX2tleXMpOworCWlmICghcmVjaXJjX2tleXMpIHsKKwkJZnJlZV9wZXJjcHUoYWN0aW9uX2ZpZm9zKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKIHZvaWQgYWN0aW9uX2ZpZm9zX2V4aXQodm9pZCkKIHsKIAlmcmVlX3BlcmNwdShhY3Rpb25fZmlmb3MpOworCWZyZWVfcGVyY3B1KHJlY2lyY19rZXlzKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYyBiL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYwppbmRleCBjNjQ0Yzc4Li4zMTA0NWVmIDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMKKysrIGIvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jCkBAIC00MzMsNyArNDMzLDYgQEAKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG87CiAJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSB0dXBsZTsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0JZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCXVuc2lnbmVkIGludCBkYXRhb2ZmOwogCXU4IHByb3RvbnVtOwpAQCAtNDU4LDEzICs0NTcsOCBAQAogCiAJY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwogCi0JY3RpbmZvID0gb3ZzX2N0X2dldF9pbmZvKGgpOwotCWlmIChjdGluZm8gPT0gSVBfQ1RfTkVXKSB7Ci0JCS8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uICovCi0JCVdBUk5fT05DRSgxLCAib3ZzX2N0X2ZpbmRfZXhpc3Rpbmc6IG5ldyBwYWNrZXQgZm9yICVwXG4iLCBjdCk7Ci0JfQogCXNrYi0+bmZjdCA9ICZjdC0+Y3RfZ2VuZXJhbDsKLQlza2ItPm5mY3RpbmZvID0gY3RpbmZvOworCXNrYi0+bmZjdGluZm8gPSBvdnNfY3RfZ2V0X2luZm8oaCk7CiAJcmV0dXJuIGN0OwogfQogCkBAIC0xMzczLDcgKzEzNjcsNyBAQAogCWlmIChjdF9pbmZvLT5oZWxwZXIpCiAJCW1vZHVsZV9wdXQoY3RfaW5mby0+aGVscGVyLT5tZSk7CiAJaWYgKGN0X2luZm8tPmN0KQotCQluZl9jdF9wdXQoY3RfaW5mby0+Y3QpOworCQluZl9jdF90bXBsX2ZyZWUoY3RfaW5mby0+Y3QpOwogfQogCiB2b2lkIG92c19jdF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9kYXRhcGF0aC5jIGIvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMKaW5kZXggNTI0YzBmZC4uNGQ2N2VhOCAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMKKysrIGIvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMKQEAgLTkyOCw3ICs5MjgsNiBAQAogCXN0cnVjdCBzd19mbG93X21hc2sgbWFzazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcmVwbHk7CiAJc3RydWN0IGRhdGFwYXRoICpkcDsKLQlzdHJ1Y3Qgc3dfZmxvd19rZXkga2V5OwogCXN0cnVjdCBzd19mbG93X2FjdGlvbnMgKmFjdHM7CiAJc3RydWN0IHN3X2Zsb3dfbWF0Y2ggbWF0Y2g7CiAJdTMyIHVmaWRfZmxhZ3MgPSBvdnNfbmxhX2dldF91ZmlkX2ZsYWdzKGFbT1ZTX0ZMT1dfQVRUUl9VRklEX0ZMQUdTXSk7CkBAIC05NTYsMjAgKzk1NSwyNCBAQAogCX0KIAogCS8qIEV4dHJhY3Qga2V5LiAqLwotCW92c19tYXRjaF9pbml0KCZtYXRjaCwgJmtleSwgJm1hc2spOworCW92c19tYXRjaF9pbml0KCZtYXRjaCwgJm5ld19mbG93LT5rZXksIGZhbHNlLCAmbWFzayk7CiAJZXJyb3IgPSBvdnNfbmxhX2dldF9tYXRjaChuZXQsICZtYXRjaCwgYVtPVlNfRkxPV19BVFRSX0tFWV0sCiAJCQkJICBhW09WU19GTE9XX0FUVFJfTUFTS10sIGxvZyk7CiAJaWYgKGVycm9yKQogCQlnb3RvIGVycl9rZnJlZV9mbG93OwogCi0Jb3ZzX2Zsb3dfbWFza19rZXkoJm5ld19mbG93LT5rZXksICZrZXksIHRydWUsICZtYXNrKTsKLQogCS8qIEV4dHJhY3QgZmxvdyBpZGVudGlmaWVyLiAqLwogCWVycm9yID0gb3ZzX25sYV9nZXRfaWRlbnRpZmllcigmbmV3X2Zsb3ctPmlkLCBhW09WU19GTE9XX0FUVFJfVUZJRF0sCi0JCQkJICAgICAgICZrZXksIGxvZyk7CisJCQkJICAgICAgICZuZXdfZmxvdy0+a2V5LCBsb2cpOwogCWlmIChlcnJvcikKIAkJZ290byBlcnJfa2ZyZWVfZmxvdzsKIAorCS8qIHVubWFza2VkIGtleSBpcyBuZWVkZWQgdG8gbWF0Y2ggd2hlbiB1ZmlkIGlzIG5vdCB1c2VkLiAqLworCWlmIChvdnNfaWRlbnRpZmllcl9pc19rZXkoJm5ld19mbG93LT5pZCkpCisJCW1hdGNoLmtleSA9IG5ld19mbG93LT5pZC51bm1hc2tlZF9rZXk7CisKKwlvdnNfZmxvd19tYXNrX2tleSgmbmV3X2Zsb3ctPmtleSwgJm5ld19mbG93LT5rZXksIHRydWUsICZtYXNrKTsKKwogCS8qIFZhbGlkYXRlIGFjdGlvbnMuICovCiAJZXJyb3IgPSBvdnNfbmxhX2NvcHlfYWN0aW9ucyhuZXQsIGFbT1ZTX0ZMT1dfQVRUUl9BQ1RJT05TXSwKIAkJCQkgICAgICZuZXdfZmxvdy0+a2V5LCAmYWN0cywgbG9nKTsKQEAgLTk5Niw3ICs5OTksNyBAQAogCWlmIChvdnNfaWRlbnRpZmllcl9pc191ZmlkKCZuZXdfZmxvdy0+aWQpKQogCQlmbG93ID0gb3ZzX2Zsb3dfdGJsX2xvb2t1cF91ZmlkKCZkcC0+dGFibGUsICZuZXdfZmxvdy0+aWQpOwogCWlmICghZmxvdykKLQkJZmxvdyA9IG92c19mbG93X3RibF9sb29rdXAoJmRwLT50YWJsZSwgJmtleSk7CisJCWZsb3cgPSBvdnNfZmxvd190YmxfbG9va3VwKCZkcC0+dGFibGUsICZuZXdfZmxvdy0+a2V5KTsKIAlpZiAobGlrZWx5KCFmbG93KSkgewogCQlyY3VfYXNzaWduX3BvaW50ZXIobmV3X2Zsb3ctPnNmX2FjdHMsIGFjdHMpOwogCkBAIC0xMTIxLDcgKzExMjQsNyBAQAogCiAJdWZpZF9wcmVzZW50ID0gb3ZzX25sYV9nZXRfdWZpZCgmc2ZpZCwgYVtPVlNfRkxPV19BVFRSX1VGSURdLCBsb2cpOwogCWlmIChhW09WU19GTE9XX0FUVFJfS0VZXSkgewotCQlvdnNfbWF0Y2hfaW5pdCgmbWF0Y2gsICZrZXksICZtYXNrKTsKKwkJb3ZzX21hdGNoX2luaXQoJm1hdGNoLCAma2V5LCB0cnVlLCAmbWFzayk7CiAJCWVycm9yID0gb3ZzX25sYV9nZXRfbWF0Y2gobmV0LCAmbWF0Y2gsIGFbT1ZTX0ZMT1dfQVRUUl9LRVldLAogCQkJCQkgIGFbT1ZTX0ZMT1dfQVRUUl9NQVNLXSwgbG9nKTsKIAl9IGVsc2UgaWYgKCF1ZmlkX3ByZXNlbnQpIHsKQEAgLTEyMzgsNyArMTI0MSw3IEBACiAKIAl1ZmlkX3ByZXNlbnQgPSBvdnNfbmxhX2dldF91ZmlkKCZ1ZmlkLCBhW09WU19GTE9XX0FUVFJfVUZJRF0sIGxvZyk7CiAJaWYgKGFbT1ZTX0ZMT1dfQVRUUl9LRVldKSB7Ci0JCW92c19tYXRjaF9pbml0KCZtYXRjaCwgJmtleSwgTlVMTCk7CisJCW92c19tYXRjaF9pbml0KCZtYXRjaCwgJmtleSwgdHJ1ZSwgTlVMTCk7CiAJCWVyciA9IG92c19ubGFfZ2V0X21hdGNoKG5ldCwgJm1hdGNoLCBhW09WU19GTE9XX0FUVFJfS0VZXSwgTlVMTCwKIAkJCQkJbG9nKTsKIAl9IGVsc2UgaWYgKCF1ZmlkX3ByZXNlbnQpIHsKQEAgLTEyOTcsNyArMTMwMCw3IEBACiAKIAl1ZmlkX3ByZXNlbnQgPSBvdnNfbmxhX2dldF91ZmlkKCZ1ZmlkLCBhW09WU19GTE9XX0FUVFJfVUZJRF0sIGxvZyk7CiAJaWYgKGFbT1ZTX0ZMT1dfQVRUUl9LRVldKSB7Ci0JCW92c19tYXRjaF9pbml0KCZtYXRjaCwgJmtleSwgTlVMTCk7CisJCW92c19tYXRjaF9pbml0KCZtYXRjaCwgJmtleSwgdHJ1ZSwgTlVMTCk7CiAJCWVyciA9IG92c19ubGFfZ2V0X21hdGNoKG5ldCwgJm1hdGNoLCBhW09WU19GTE9XX0FUVFJfS0VZXSwKIAkJCQkJTlVMTCwgbG9nKTsKIAkJaWYgKHVubGlrZWx5KGVycikpCkBAIC0yNDM3LDMgKzI0NDAsNyBAQAogCiBNT0RVTEVfREVTQ1JJUFRJT04oIk9wZW4gdlN3aXRjaCBzd2l0Y2hpbmcgZGF0YXBhdGgiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19HRU5MX0ZBTUlMWShPVlNfREFUQVBBVEhfRkFNSUxZKTsKK01PRFVMRV9BTElBU19HRU5MX0ZBTUlMWShPVlNfVlBPUlRfRkFNSUxZKTsKK01PRFVMRV9BTElBU19HRU5MX0ZBTUlMWShPVlNfRkxPV19GQU1JTFkpOworTU9EVUxFX0FMSUFTX0dFTkxfRkFNSUxZKE9WU19QQUNLRVRfRkFNSUxZKTsKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9mbG93LmMgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5jCmluZGV4IDBlYTEyOGUuLmM4YzgyZTEgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9mbG93LmMKKysrIGIvbmV0L29wZW52c3dpdGNoL2Zsb3cuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CkBAIC03MiwzMiArNzMsMzMgQEAKIHsKIAlzdHJ1Y3QgZmxvd19zdGF0cyAqc3RhdHM7CiAJaW50IG5vZGUgPSBudW1hX25vZGVfaWQoKTsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCWludCBsZW4gPSBza2ItPmxlbiArIChza2Jfdmxhbl90YWdfcHJlc2VudChza2IpID8gVkxBTl9ITEVOIDogMCk7CiAKLQlzdGF0cyA9IHJjdV9kZXJlZmVyZW5jZShmbG93LT5zdGF0c1tub2RlXSk7CisJc3RhdHMgPSByY3VfZGVyZWZlcmVuY2UoZmxvdy0+c3RhdHNbY3B1XSk7CiAKLQkvKiBDaGVjayBpZiBhbHJlYWR5IGhhdmUgbm9kZS1zcGVjaWZpYyBzdGF0cy4gKi8KKwkvKiBDaGVjayBpZiBhbHJlYWR5IGhhdmUgQ1BVLXNwZWNpZmljIHN0YXRzLiAqLwogCWlmIChsaWtlbHkoc3RhdHMpKSB7CiAJCXNwaW5fbG9jaygmc3RhdHMtPmxvY2spOwogCQkvKiBNYXJrIGlmIHdlIHdyaXRlIG9uIHRoZSBwcmUtYWxsb2NhdGVkIHN0YXRzLiAqLwotCQlpZiAobm9kZSA9PSAwICYmIHVubGlrZWx5KGZsb3ctPnN0YXRzX2xhc3Rfd3JpdGVyICE9IG5vZGUpKQotCQkJZmxvdy0+c3RhdHNfbGFzdF93cml0ZXIgPSBub2RlOworCQlpZiAoY3B1ID09IDAgJiYgdW5saWtlbHkoZmxvdy0+c3RhdHNfbGFzdF93cml0ZXIgIT0gY3B1KSkKKwkJCWZsb3ctPnN0YXRzX2xhc3Rfd3JpdGVyID0gY3B1OwogCX0gZWxzZSB7CiAJCXN0YXRzID0gcmN1X2RlcmVmZXJlbmNlKGZsb3ctPnN0YXRzWzBdKTsgLyogUHJlLWFsbG9jYXRlZC4gKi8KIAkJc3Bpbl9sb2NrKCZzdGF0cy0+bG9jayk7CiAKLQkJLyogSWYgdGhlIGN1cnJlbnQgTlVNQS1ub2RlIGlzIHRoZSBvbmx5IHdyaXRlciBvbiB0aGUKKwkJLyogSWYgdGhlIGN1cnJlbnQgQ1BVIGlzIHRoZSBvbmx5IHdyaXRlciBvbiB0aGUKIAkJICogcHJlLWFsbG9jYXRlZCBzdGF0cyBrZWVwIHVzaW5nIHRoZW0uCiAJCSAqLwotCQlpZiAodW5saWtlbHkoZmxvdy0+c3RhdHNfbGFzdF93cml0ZXIgIT0gbm9kZSkpIHsKKwkJaWYgKHVubGlrZWx5KGZsb3ctPnN0YXRzX2xhc3Rfd3JpdGVyICE9IGNwdSkpIHsKIAkJCS8qIEEgcHJldmlvdXMgbG9ja2VyIG1heSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHRoZQotCQkJICogc3RhdHMsIHNvIHdlIG5lZWQgdG8gY2hlY2sgYWdhaW4uICBJZiBub2RlLXNwZWNpZmljCisJCQkgKiBzdGF0cywgc28gd2UgbmVlZCB0byBjaGVjayBhZ2Fpbi4gIElmIENQVS1zcGVjaWZpYwogCQkJICogc3RhdHMgd2VyZSBhbHJlYWR5IGFsbG9jYXRlZCwgd2UgdXBkYXRlIHRoZSBwcmUtCiAJCQkgKiBhbGxvY2F0ZWQgc3RhdHMgYXMgd2UgaGF2ZSBhbHJlYWR5IGxvY2tlZCB0aGVtLgogCQkJICovCi0JCQlpZiAobGlrZWx5KGZsb3ctPnN0YXRzX2xhc3Rfd3JpdGVyICE9IE5VTUFfTk9fTk9ERSkKLQkJCSAgICAmJiBsaWtlbHkoIXJjdV9hY2Nlc3NfcG9pbnRlcihmbG93LT5zdGF0c1tub2RlXSkpKSB7Ci0JCQkJLyogVHJ5IHRvIGFsbG9jYXRlIG5vZGUtc3BlY2lmaWMgc3RhdHMuICovCisJCQlpZiAobGlrZWx5KGZsb3ctPnN0YXRzX2xhc3Rfd3JpdGVyICE9IC0xKSAmJgorCQkJICAgIGxpa2VseSghcmN1X2FjY2Vzc19wb2ludGVyKGZsb3ctPnN0YXRzW2NwdV0pKSkgeworCQkJCS8qIFRyeSB0byBhbGxvY2F0ZSBDUFUtc3BlY2lmaWMgc3RhdHMuICovCiAJCQkJc3RydWN0IGZsb3dfc3RhdHMgKm5ld19zdGF0czsKIAogCQkJCW5ld19zdGF0cyA9CkBAIC0xMTQsMTIgKzExNiwxMiBAQAogCQkJCQluZXdfc3RhdHMtPnRjcF9mbGFncyA9IHRjcF9mbGFnczsKIAkJCQkJc3Bpbl9sb2NrX2luaXQoJm5ld19zdGF0cy0+bG9jayk7CiAKLQkJCQkJcmN1X2Fzc2lnbl9wb2ludGVyKGZsb3ctPnN0YXRzW25vZGVdLAorCQkJCQlyY3VfYXNzaWduX3BvaW50ZXIoZmxvdy0+c3RhdHNbY3B1XSwKIAkJCQkJCQkgICBuZXdfc3RhdHMpOwogCQkJCQlnb3RvIHVubG9jazsKIAkJCQl9CiAJCQl9Ci0JCQlmbG93LT5zdGF0c19sYXN0X3dyaXRlciA9IG5vZGU7CisJCQlmbG93LT5zdGF0c19sYXN0X3dyaXRlciA9IGNwdTsKIAkJfQogCX0KIApAQCAtMTM2LDE0ICsxMzgsMTUgQEAKIAkJCXN0cnVjdCBvdnNfZmxvd19zdGF0cyAqb3ZzX3N0YXRzLAogCQkJdW5zaWduZWQgbG9uZyAqdXNlZCwgX19iZTE2ICp0Y3BfZmxhZ3MpCiB7Ci0JaW50IG5vZGU7CisJaW50IGNwdTsKIAogCSp1c2VkID0gMDsKIAkqdGNwX2ZsYWdzID0gMDsKIAltZW1zZXQob3ZzX3N0YXRzLCAwLCBzaXplb2YoKm92c19zdGF0cykpOwogCi0JZm9yX2VhY2hfbm9kZShub2RlKSB7Ci0JCXN0cnVjdCBmbG93X3N0YXRzICpzdGF0cyA9IHJjdV9kZXJlZmVyZW5jZV9vdnNsKGZsb3ctPnN0YXRzW25vZGVdKTsKKwkvKiBXZSBvcGVuIGNvZGUgdGhpcyB0byBtYWtlIHN1cmUgY3B1IDAgaXMgYWx3YXlzIGNvbnNpZGVyZWQgKi8KKwlmb3IgKGNwdSA9IDA7IGNwdSA8IG5yX2NwdV9pZHM7IGNwdSA9IGNwdW1hc2tfbmV4dChjcHUsIGNwdV9wb3NzaWJsZV9tYXNrKSkgeworCQlzdHJ1Y3QgZmxvd19zdGF0cyAqc3RhdHMgPSByY3VfZGVyZWZlcmVuY2Vfb3ZzbChmbG93LT5zdGF0c1tjcHVdKTsKIAogCQlpZiAoc3RhdHMpIHsKIAkJCS8qIExvY2FsIENQVSBtYXkgd3JpdGUgb24gbm9uLWxvY2FsIHN0YXRzLCBzbyB3ZSBtdXN0CkBAIC0xNjMsMTAgKzE2NiwxMSBAQAogLyogQ2FsbGVkIHdpdGggb3ZzX211dGV4LiAqLwogdm9pZCBvdnNfZmxvd19zdGF0c19jbGVhcihzdHJ1Y3Qgc3dfZmxvdyAqZmxvdykKIHsKLQlpbnQgbm9kZTsKKwlpbnQgY3B1OwogCi0JZm9yX2VhY2hfbm9kZShub2RlKSB7Ci0JCXN0cnVjdCBmbG93X3N0YXRzICpzdGF0cyA9IG92c2xfZGVyZWZlcmVuY2UoZmxvdy0+c3RhdHNbbm9kZV0pOworCS8qIFdlIG9wZW4gY29kZSB0aGlzIHRvIG1ha2Ugc3VyZSBjcHUgMCBpcyBhbHdheXMgY29uc2lkZXJlZCAqLworCWZvciAoY3B1ID0gMDsgY3B1IDwgbnJfY3B1X2lkczsgY3B1ID0gY3B1bWFza19uZXh0KGNwdSwgY3B1X3Bvc3NpYmxlX21hc2spKSB7CisJCXN0cnVjdCBmbG93X3N0YXRzICpzdGF0cyA9IG92c2xfZGVyZWZlcmVuY2UoZmxvdy0+c3RhdHNbY3B1XSk7CiAKIAkJaWYgKHN0YXRzKSB7CiAJCQlzcGluX2xvY2tfYmgoJnN0YXRzLT5sb2NrKTsKQEAgLTMwMiwyNCArMzA2LDU3IEBACiAJCQkJICBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7CiB9CiAKLXN0YXRpYyBpbnQgcGFyc2VfdmxhbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSkKKy8qKgorICogUGFyc2UgdmxhbiB0YWcgZnJvbSB2bGFuIGhlYWRlci4KKyAqIFJldHVybnMgRVJST1Igb24gbWVtb3J5IGVycm9yLgorICogUmV0dXJucyAwIGlmIGl0IGVuY291bnRlcnMgYSBub24tdmxhbiBvciBpbmNvbXBsZXRlIHBhY2tldC4KKyAqIFJldHVybnMgMSBhZnRlciBzdWNjZXNzZnVsbHkgcGFyc2luZyB2bGFuIHRhZy4KKyAqLworc3RhdGljIGludCBwYXJzZV92bGFuX3RhZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgdmxhbl9oZWFkICprZXlfdmgpCiB7Ci0Jc3RydWN0IHF0YWdfcHJlZml4IHsKLQkJX19iZTE2IGV0aF90eXBlOyAvKiBFVEhfUF84MDIxUSAqLwotCQlfX2JlMTYgdGNpOwotCX07Ci0Jc3RydWN0IHF0YWdfcHJlZml4ICpxcDsKKwlzdHJ1Y3Qgdmxhbl9oZWFkICp2aCA9IChzdHJ1Y3Qgdmxhbl9oZWFkICopc2tiLT5kYXRhOwogCi0JaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBxdGFnX3ByZWZpeCkgKyBzaXplb2YoX19iZTE2KSkpCisJaWYgKGxpa2VseSghZXRoX3R5cGVfdmxhbih2aC0+dHBpZCkpKQogCQlyZXR1cm4gMDsKIAotCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgcXRhZ19wcmVmaXgpICsKLQkJCQkJIHNpemVvZihfX2JlMTYpKSkpCisJaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCB2bGFuX2hlYWQpICsgc2l6ZW9mKF9fYmUxNikpKQorCQlyZXR1cm4gMDsKKworCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3Qgdmxhbl9oZWFkKSArCisJCQkJIHNpemVvZihfX2JlMTYpKSkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcXAgPSAoc3RydWN0IHF0YWdfcHJlZml4ICopIHNrYi0+ZGF0YTsKLQlrZXktPmV0aC50Y2kgPSBxcC0+dGNpIHwgaHRvbnMoVkxBTl9UQUdfUFJFU0VOVCk7Ci0JX19za2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgcXRhZ19wcmVmaXgpKTsKKwl2aCA9IChzdHJ1Y3Qgdmxhbl9oZWFkICopc2tiLT5kYXRhOworCWtleV92aC0+dGNpID0gdmgtPnRjaSB8IGh0b25zKFZMQU5fVEFHX1BSRVNFTlQpOworCWtleV92aC0+dHBpZCA9IHZoLT50cGlkOworCisJX19za2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3Qgdmxhbl9oZWFkKSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdmxhbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSkKK3sKKwlpbnQgcmVzOworCisJa2V5LT5ldGgudmxhbi50Y2kgPSAwOworCWtleS0+ZXRoLnZsYW4udHBpZCA9IDA7CisJa2V5LT5ldGguY3ZsYW4udGNpID0gMDsKKwlrZXktPmV0aC5jdmxhbi50cGlkID0gMDsKKworCWlmIChsaWtlbHkoc2tiX3ZsYW5fdGFnX3ByZXNlbnQoc2tiKSkpIHsKKwkJa2V5LT5ldGgudmxhbi50Y2kgPSBodG9ucyhza2ItPnZsYW5fdGNpKTsKKwkJa2V5LT5ldGgudmxhbi50cGlkID0gc2tiLT52bGFuX3Byb3RvOworCX0gZWxzZSB7CisJCS8qIFBhcnNlIG91dGVyIHZsYW4gdGFnIGluIHRoZSBub24tYWNjZWxlcmF0ZWQgY2FzZS4gKi8KKwkJcmVzID0gcGFyc2Vfdmxhbl90YWcoc2tiLCAma2V5LT5ldGgudmxhbik7CisJCWlmIChyZXMgPD0gMCkKKwkJCXJldHVybiByZXM7CisJfQorCisJLyogUGFyc2UgaW5uZXIgdmxhbiB0YWcuICovCisJcmVzID0gcGFyc2Vfdmxhbl90YWcoc2tiLCAma2V5LT5ldGguY3ZsYW4pOworCWlmIChyZXMgPD0gMCkKKwkJcmV0dXJuIHJlczsKIAogCXJldHVybiAwOwogfQpAQCAtNDgwLDEyICs1MTcsOCBAQAogCSAqIHVwZGF0ZSBza2ItPmNzdW0gaGVyZS4KIAkgKi8KIAotCWtleS0+ZXRoLnRjaSA9IDA7Ci0JaWYgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpCi0JCWtleS0+ZXRoLnRjaSA9IGh0b25zKHNrYi0+dmxhbl90Y2kpOwotCWVsc2UgaWYgKGV0aC0+aF9wcm90byA9PSBodG9ucyhFVEhfUF84MDIxUSkpCi0JCWlmICh1bmxpa2VseShwYXJzZV92bGFuKHNrYiwga2V5KSkpCi0JCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAodW5saWtlbHkocGFyc2Vfdmxhbihza2IsIGtleSkpKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWtleS0+ZXRoLnR5cGUgPSBwYXJzZV9ldGhlcnR5cGUoc2tiKTsKIAlpZiAodW5saWtlbHkoa2V5LT5ldGgudHlwZSA9PSBodG9ucygwKSkpCkBAIC02MDAsMTIgKzYzMyw3IEBACiAJfSBlbHNlIGlmIChldGhfcF9tcGxzKGtleS0+ZXRoLnR5cGUpKSB7CiAJCXNpemVfdCBzdGFja19sZW4gPSBNUExTX0hMRU47CiAKLQkJLyogSW4gdGhlIHByZXNlbmNlIG9mIGFuIE1QTFMgbGFiZWwgc3RhY2sgdGhlIGVuZCBvZiB0aGUgTDIKLQkJICogaGVhZGVyIGFuZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBMMyBoZWFkZXIgZGlmZmVyLgotCQkgKgotCQkgKiBBZHZhbmNlIG5ldHdvcmtfaGVhZGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIEwzCi0JCSAqIGhlYWRlci4gbWFjX2xlbiBjb3JyZXNwb25kcyB0byB0aGUgZW5kIG9mIHRoZSBMMiBoZWFkZXIuCi0JCSAqLworCQlza2Jfc2V0X2lubmVyX25ldHdvcmtfaGVhZGVyKHNrYiwgc2tiLT5tYWNfbGVuKTsKIAkJd2hpbGUgKDEpIHsKIAkJCV9fYmUzMiBsc2U7CiAKQEAgLTYxMywxMiArNjQxLDEyIEBACiAJCQlpZiAodW5saWtlbHkoZXJyb3IpKQogCQkJCXJldHVybiAwOwogCi0JCQltZW1jcHkoJmxzZSwgc2tiX25ldHdvcmtfaGVhZGVyKHNrYiksIE1QTFNfSExFTik7CisJCQltZW1jcHkoJmxzZSwgc2tiX2lubmVyX25ldHdvcmtfaGVhZGVyKHNrYiksIE1QTFNfSExFTik7CiAKIAkJCWlmIChzdGFja19sZW4gPT0gTVBMU19ITEVOKQogCQkJCW1lbWNweSgma2V5LT5tcGxzLnRvcF9sc2UsICZsc2UsIE1QTFNfSExFTik7CiAKLQkJCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBza2ItPm1hY19sZW4gKyBzdGFja19sZW4pOworCQkJc2tiX3NldF9pbm5lcl9uZXR3b3JrX2hlYWRlcihza2IsIHNrYi0+bWFjX2xlbiArIHN0YWNrX2xlbik7CiAJCQlpZiAobHNlICYgaHRvbmwoTVBMU19MU19TX01BU0spKQogCQkJCWJyZWFrOwogCkBAIC03MzQsOCArNzYyLDYgQEAKIHsKIAlpbnQgZXJyOwogCi0JbWVtc2V0KGtleSwgMCwgT1ZTX1NXX0ZMT1dfS0VZX01FVEFEQVRBX1NJWkUpOwotCiAJLyogRXh0cmFjdCBtZXRhZGF0YSBmcm9tIG5ldGxpbmsgYXR0cmlidXRlcy4gKi8KIAllcnIgPSBvdnNfbmxhX2dldF9mbG93X21ldGFkYXRhKG5ldCwgYXR0ciwga2V5LCBsb2cpOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5oIGIvbmV0L29wZW52c3dpdGNoL2Zsb3cuaAppbmRleCAwMzM3OGU3Li5hZTc4M2Y1IDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5oCisrKyBiL25ldC9vcGVudnN3aXRjaC9mbG93LmgKQEAgLTUwLDYgKzUwLDExIEBACiAJc3RydWN0IG1ldGFkYXRhX2RzdAkqdHVuX2RzdDsKIH07CiAKK3N0cnVjdCB2bGFuX2hlYWQgeworCV9fYmUxNiB0cGlkOyAvKiBWbGFuIHR5cGUuIEdlbmVyYWxseSA4MDIuMXEgb3IgODAyLjFhZC4qLworCV9fYmUxNiB0Y2k7ICAvKiAwIGlmIG5vIFZMQU4sIFZMQU5fVEFHX1BSRVNFTlQgc2V0IG90aGVyd2lzZS4gKi8KK307CisKICNkZWZpbmUgT1ZTX1NXX0ZMT1dfS0VZX01FVEFEQVRBX1NJWkUJCQlcCiAJKG9mZnNldG9mKHN0cnVjdCBzd19mbG93X2tleSwgcmVjaXJjX2lkKSArCVwKIAlGSUVMRF9TSVpFT0Yoc3RydWN0IHN3X2Zsb3dfa2V5LCByZWNpcmNfaWQpKQpAQCAtNjksNyArNzQsOCBAQAogCXN0cnVjdCB7CiAJCXU4ICAgICBzcmNbRVRIX0FMRU5dOwkvKiBFdGhlcm5ldCBzb3VyY2UgYWRkcmVzcy4gKi8KIAkJdTggICAgIGRzdFtFVEhfQUxFTl07CS8qIEV0aGVybmV0IGRlc3RpbmF0aW9uIGFkZHJlc3MuICovCi0JCV9fYmUxNiB0Y2k7CQkvKiAwIGlmIG5vIFZMQU4sIFZMQU5fVEFHX1BSRVNFTlQgc2V0IG90aGVyd2lzZS4gKi8KKwkJc3RydWN0IHZsYW5faGVhZCB2bGFuOworCQlzdHJ1Y3Qgdmxhbl9oZWFkIGN2bGFuOwogCQlfX2JlMTYgdHlwZTsJCS8qIEV0aGVybmV0IGZyYW1lIHR5cGUuICovCiAJfSBldGg7CiAJdW5pb24gewpAQCAtMTcyLDE0ICsxNzgsMTQgQEAKIAkJc3RydWN0IGhsaXN0X25vZGUgbm9kZVsyXTsKIAkJdTMyIGhhc2g7CiAJfSBmbG93X3RhYmxlLCB1ZmlkX3RhYmxlOwotCWludCBzdGF0c19sYXN0X3dyaXRlcjsJCS8qIE5VTUEtbm9kZSBpZCBvZiB0aGUgbGFzdCB3cml0ZXIgb24KKwlpbnQgc3RhdHNfbGFzdF93cml0ZXI7CQkvKiBDUFUgaWQgb2YgdGhlIGxhc3Qgd3JpdGVyIG9uCiAJCQkJCSAqICdzdGF0c1swXScuCiAJCQkJCSAqLwogCXN0cnVjdCBzd19mbG93X2tleSBrZXk7CiAJc3RydWN0IHN3X2Zsb3dfaWQgaWQ7CiAJc3RydWN0IHN3X2Zsb3dfbWFzayAqbWFzazsKIAlzdHJ1Y3Qgc3dfZmxvd19hY3Rpb25zIF9fcmN1ICpzZl9hY3RzOwotCXN0cnVjdCBmbG93X3N0YXRzIF9fcmN1ICpzdGF0c1tdOyAvKiBPbmUgZm9yIGVhY2ggTlVNQSBub2RlLiAgRmlyc3Qgb25lCisJc3RydWN0IGZsb3dfc3RhdHMgX19yY3UgKnN0YXRzW107IC8qIE9uZSBmb3IgZWFjaCBDUFUuICBGaXJzdCBvbmUKIAkJCQkJICAgKiBpcyBhbGxvY2F0ZWQgYXQgZmxvdyBjcmVhdGlvbiB0aW1lLAogCQkJCQkgICAqIHRoZSByZXN0IGFyZSBhbGxvY2F0ZWQgb24gZGVtYW5kCiAJCQkJCSAgICogd2hpbGUgaG9sZGluZyB0aGUgJ3N0YXRzWzBdLmxvY2snLgpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2Zsb3dfbmV0bGluay5jIGIvbmV0L29wZW52c3dpdGNoL2Zsb3dfbmV0bGluay5jCmluZGV4IGM3OGE2YTEuLmFlMjVkZWQgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9mbG93X25ldGxpbmsuYworKysgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvd19uZXRsaW5rLmMKQEAgLTgwOCw2ICs4MDgsMTY3IEBACiAJCQkJICBpcF90dW5uZWxfaW5mb19hZih0dW5faW5mbykpOwogfQogCitzdGF0aWMgaW50IGVuY29kZV92bGFuX2Zyb21fbmxhdHRycyhzdHJ1Y3Qgc3dfZmxvd19tYXRjaCAqbWF0Y2gsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKmFbXSwKKwkJCQkgICAgYm9vbCBpc19tYXNrLCBib29sIGlubmVyKQoreworCV9fYmUxNiB0Y2kgPSAwOworCV9fYmUxNiB0cGlkID0gMDsKKworCWlmIChhW09WU19LRVlfQVRUUl9WTEFOXSkKKwkJdGNpID0gbmxhX2dldF9iZTE2KGFbT1ZTX0tFWV9BVFRSX1ZMQU5dKTsKKworCWlmIChhW09WU19LRVlfQVRUUl9FVEhFUlRZUEVdKQorCQl0cGlkID0gbmxhX2dldF9iZTE2KGFbT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRV0pOworCisJaWYgKGxpa2VseSghaW5uZXIpKSB7CisJCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgZXRoLnZsYW4udHBpZCwgdHBpZCwgaXNfbWFzayk7CisJCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgZXRoLnZsYW4udGNpLCB0Y2ksIGlzX21hc2spOworCX0gZWxzZSB7CisJCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgZXRoLmN2bGFuLnRwaWQsIHRwaWQsIGlzX21hc2spOworCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIGV0aC5jdmxhbi50Y2ksIHRjaSwgaXNfbWFzayk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhbGlkYXRlX3ZsYW5fZnJvbV9ubGF0dHJzKGNvbnN0IHN0cnVjdCBzd19mbG93X21hdGNoICptYXRjaCwKKwkJCQkgICAgICB1NjQga2V5X2F0dHJzLCBib29sIGlubmVyLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiphLCBib29sIGxvZykKK3sKKwlfX2JlMTYgdGNpID0gMDsKKworCWlmICghKChrZXlfYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfRVRIRVJORVQpKSAmJgorCSAgICAgIChrZXlfYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfRVRIRVJUWVBFKSkgJiYKKwkgICAgICAgZXRoX3R5cGVfdmxhbihubGFfZ2V0X2JlMTYoYVtPVlNfS0VZX0FUVFJfRVRIRVJUWVBFXSkpKSkgeworCQkvKiBOb3QgYSBWTEFOLiAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoISgoa2V5X2F0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX1ZMQU4pKSAmJgorCSAgICAgIChrZXlfYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfRU5DQVApKSkpIHsKKwkJT1ZTX05MRVJSKGxvZywgIkludmFsaWQgJXMgZnJhbWUiLCAoaW5uZXIpID8gIkMtVkxBTiIgOiAiVkxBTiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYVtPVlNfS0VZX0FUVFJfVkxBTl0pCisJCXRjaSA9IG5sYV9nZXRfYmUxNihhW09WU19LRVlfQVRUUl9WTEFOXSk7CisKKwlpZiAoISh0Y2kgJiBodG9ucyhWTEFOX1RBR19QUkVTRU5UKSkpIHsKKwkJaWYgKHRjaSkgeworCQkJT1ZTX05MRVJSKGxvZywgIiVzIFRDSSBkb2VzIG5vdCBoYXZlIFZMQU5fVEFHX1BSRVNFTlQgYml0IHNldC4iLAorCQkJCSAgKGlubmVyKSA/ICJDLVZMQU4iIDogIlZMQU4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgaWYgKG5sYV9sZW4oYVtPVlNfS0VZX0FUVFJfRU5DQVBdKSkgeworCQkJLyogQ29ybmVyIGNhc2UgZm9yIHRydW5jYXRlZCBWTEFOIGhlYWRlci4gKi8KKwkJCU9WU19OTEVSUihsb2csICJUcnVuY2F0ZWQgJXMgaGVhZGVyIGhhcyBub24temVybyBlbmNhcCBhdHRyaWJ1dGUuIiwKKwkJCQkgIChpbm5lcikgPyAiQy1WTEFOIiA6ICJWTEFOIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHZhbGlkYXRlX3ZsYW5fbWFza19mcm9tX25sYXR0cnMoY29uc3Qgc3RydWN0IHN3X2Zsb3dfbWF0Y2ggKm1hdGNoLAorCQkJCQkgICB1NjQga2V5X2F0dHJzLCBib29sIGlubmVyLAorCQkJCQkgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICoqYSwgYm9vbCBsb2cpCit7CisJX19iZTE2IHRjaSA9IDA7CisJX19iZTE2IHRwaWQgPSAwOworCWJvb2wgZW5jYXBfdmFsaWQgPSAhIShtYXRjaC0+a2V5LT5ldGgudmxhbi50Y2kgJgorCQkJICAgICAgaHRvbnMoVkxBTl9UQUdfUFJFU0VOVCkpOworCWJvb2wgaV9lbmNhcF92YWxpZCA9ICEhKG1hdGNoLT5rZXktPmV0aC5jdmxhbi50Y2kgJgorCQkJCWh0b25zKFZMQU5fVEFHX1BSRVNFTlQpKTsKKworCWlmICghKGtleV9hdHRycyAmICgxIDw8IE9WU19LRVlfQVRUUl9FTkNBUCkpKSB7CisJCS8qIE5vdCBhIFZMQU4uICovCisJCXJldHVybiAwOworCX0KKworCWlmICgoIWlubmVyICYmICFlbmNhcF92YWxpZCkgfHwgKGlubmVyICYmICFpX2VuY2FwX3ZhbGlkKSkgeworCQlPVlNfTkxFUlIobG9nLCAiRW5jYXAgbWFzayBhdHRyaWJ1dGUgaXMgc2V0IGZvciBub24tJXMgZnJhbWUuIiwKKwkJCSAgKGlubmVyKSA/ICJDLVZMQU4iIDogIlZMQU4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFbT1ZTX0tFWV9BVFRSX1ZMQU5dKQorCQl0Y2kgPSBubGFfZ2V0X2JlMTYoYVtPVlNfS0VZX0FUVFJfVkxBTl0pOworCisJaWYgKGFbT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRV0pCisJCXRwaWQgPSBubGFfZ2V0X2JlMTYoYVtPVlNfS0VZX0FUVFJfRVRIRVJUWVBFXSk7CisKKwlpZiAodHBpZCAhPSBodG9ucygweGZmZmYpKSB7CisJCU9WU19OTEVSUihsb2csICJNdXN0IGhhdmUgYW4gZXhhY3QgbWF0Y2ggb24gJXMgVFBJRCAobWFzaz0leCkuIiwKKwkJCSAgKGlubmVyKSA/ICJDLVZMQU4iIDogIlZMQU4iLCBudG9ocyh0cGlkKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoISh0Y2kgJiBodG9ucyhWTEFOX1RBR19QUkVTRU5UKSkpIHsKKwkJT1ZTX05MRVJSKGxvZywgIiVzIFRDSSBtYXNrIGRvZXMgbm90IGhhdmUgZXhhY3QgbWF0Y2ggZm9yIFZMQU5fVEFHX1BSRVNFTlQgYml0LiIsCisJCQkgIChpbm5lcikgPyAiQy1WTEFOIiA6ICJWTEFOIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9fcGFyc2Vfdmxhbl9mcm9tX25sYXR0cnMoc3RydWN0IHN3X2Zsb3dfbWF0Y2ggKm1hdGNoLAorCQkJCSAgICAgdTY0ICprZXlfYXR0cnMsIGJvb2wgaW5uZXIsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICoqYSwgYm9vbCBpc19tYXNrLAorCQkJCSAgICAgYm9vbCBsb2cpCit7CisJaW50IGVycjsKKwljb25zdCBzdHJ1Y3QgbmxhdHRyICplbmNhcDsKKworCWlmICghaXNfbWFzaykKKwkJZXJyID0gdmFsaWRhdGVfdmxhbl9mcm9tX25sYXR0cnMobWF0Y2gsICprZXlfYXR0cnMsIGlubmVyLAorCQkJCQkJIGEsIGxvZyk7CisJZWxzZQorCQllcnIgPSB2YWxpZGF0ZV92bGFuX21hc2tfZnJvbV9ubGF0dHJzKG1hdGNoLCAqa2V5X2F0dHJzLCBpbm5lciwKKwkJCQkJCSAgICAgIGEsIGxvZyk7CisJaWYgKGVyciA8PSAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gZW5jb2RlX3ZsYW5fZnJvbV9ubGF0dHJzKG1hdGNoLCBhLCBpc19tYXNrLCBpbm5lcik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCSprZXlfYXR0cnMgJj0gfigxIDw8IE9WU19LRVlfQVRUUl9FTkNBUCk7CisJKmtleV9hdHRycyAmPSB+KDEgPDwgT1ZTX0tFWV9BVFRSX1ZMQU4pOworCSprZXlfYXR0cnMgJj0gfigxIDw8IE9WU19LRVlfQVRUUl9FVEhFUlRZUEUpOworCisJZW5jYXAgPSBhW09WU19LRVlfQVRUUl9FTkNBUF07CisKKwlpZiAoIWlzX21hc2spCisJCWVyciA9IHBhcnNlX2Zsb3dfbmxhdHRycyhlbmNhcCwgYSwga2V5X2F0dHJzLCBsb2cpOworCWVsc2UKKwkJZXJyID0gcGFyc2VfZmxvd19tYXNrX25sYXR0cnMoZW5jYXAsIGEsIGtleV9hdHRycywgbG9nKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfdmxhbl9mcm9tX25sYXR0cnMoc3RydWN0IHN3X2Zsb3dfbWF0Y2ggKm1hdGNoLAorCQkJCSAgIHU2NCAqa2V5X2F0dHJzLCBjb25zdCBzdHJ1Y3QgbmxhdHRyICoqYSwKKwkJCQkgICBib29sIGlzX21hc2ssIGJvb2wgbG9nKQoreworCWludCBlcnI7CisJYm9vbCBlbmNhcF92YWxpZCA9IGZhbHNlOworCisJZXJyID0gX19wYXJzZV92bGFuX2Zyb21fbmxhdHRycyhtYXRjaCwga2V5X2F0dHJzLCBmYWxzZSwgYSwKKwkJCQkJaXNfbWFzaywgbG9nKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZW5jYXBfdmFsaWQgPSAhIShtYXRjaC0+a2V5LT5ldGgudmxhbi50Y2kgJiBodG9ucyhWTEFOX1RBR19QUkVTRU5UKSk7CisJaWYgKGVuY2FwX3ZhbGlkKSB7CisJCWVyciA9IF9fcGFyc2Vfdmxhbl9mcm9tX25sYXR0cnMobWF0Y2gsIGtleV9hdHRycywgdHJ1ZSwgYSwKKwkJCQkJCWlzX21hc2ssIGxvZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG1ldGFkYXRhX2Zyb21fbmxhdHRycyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzd19mbG93X21hdGNoICptYXRjaCwKIAkJCQkgdTY0ICphdHRycywgY29uc3Qgc3RydWN0IG5sYXR0ciAqKmEsCiAJCQkJIGJvb2wgaXNfbWFzaywgYm9vbCBsb2cpCkBAIC05MjMsMjAgKzEwODQsMTEgQEAKIAl9CiAKIAlpZiAoYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfVkxBTikpIHsKLQkJX19iZTE2IHRjaTsKLQotCQl0Y2kgPSBubGFfZ2V0X2JlMTYoYVtPVlNfS0VZX0FUVFJfVkxBTl0pOwotCQlpZiAoISh0Y2kgJiBodG9ucyhWTEFOX1RBR19QUkVTRU5UKSkpIHsKLQkJCWlmIChpc19tYXNrKQotCQkJCU9WU19OTEVSUihsb2csICJWTEFOIFRDSSBtYXNrIGRvZXMgbm90IGhhdmUgZXhhY3QgbWF0Y2ggZm9yIFZMQU5fVEFHX1BSRVNFTlQgYml0LiIpOwotCQkJZWxzZQotCQkJCU9WU19OTEVSUihsb2csICJWTEFOIFRDSSBkb2VzIG5vdCBoYXZlIFZMQU5fVEFHX1BSRVNFTlQgYml0IHNldC4iKTsKLQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIGV0aC50Y2ksIHRjaSwgaXNfbWFzayk7Ci0JCWF0dHJzICY9IH4oMSA8PCBPVlNfS0VZX0FUVFJfVkxBTik7CisJCS8qIFZMQU4gYXR0cmlidXRlIGlzIGFsd2F5cyBwYXJzZWQgYmVmb3JlIGdldHRpbmcgaGVyZSBzaW5jZSBpdAorCQkgKiBtYXkgb2NjdXIgbXVsdGlwbGUgdGltZXMuCisJCSAqLworCQlPVlNfTkxFUlIobG9nLCAiVkxBTiBhdHRyaWJ1dGUgdW5leHBlY3RlZC4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGF0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRSkpIHsKQEAgLTExODIsNDkgKzEzMzQsMTggQEAKIAkJICAgICAgYm9vbCBsb2cpCiB7CiAJY29uc3Qgc3RydWN0IG5sYXR0ciAqYVtPVlNfS0VZX0FUVFJfTUFYICsgMV07Ci0JY29uc3Qgc3RydWN0IG5sYXR0ciAqZW5jYXA7CiAJc3RydWN0IG5sYXR0ciAqbmV3bWFzayA9IE5VTEw7CiAJdTY0IGtleV9hdHRycyA9IDA7CiAJdTY0IG1hc2tfYXR0cnMgPSAwOwotCWJvb2wgZW5jYXBfdmFsaWQgPSBmYWxzZTsKIAlpbnQgZXJyOwogCiAJZXJyID0gcGFyc2VfZmxvd19ubGF0dHJzKG5sYV9rZXksIGEsICZrZXlfYXR0cnMsIGxvZyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmICgoa2V5X2F0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX0VUSEVSTkVUKSkgJiYKLQkgICAgKGtleV9hdHRycyAmICgxIDw8IE9WU19LRVlfQVRUUl9FVEhFUlRZUEUpKSAmJgotCSAgICAobmxhX2dldF9iZTE2KGFbT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRV0pID09IGh0b25zKEVUSF9QXzgwMjFRKSkpIHsKLQkJX19iZTE2IHRjaTsKLQotCQlpZiAoISgoa2V5X2F0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX1ZMQU4pKSAmJgotCQkgICAgICAoa2V5X2F0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX0VOQ0FQKSkpKSB7Ci0JCQlPVlNfTkxFUlIobG9nLCAiSW52YWxpZCBWbGFuIGZyYW1lLiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlrZXlfYXR0cnMgJj0gfigxIDw8IE9WU19LRVlfQVRUUl9FVEhFUlRZUEUpOwotCQl0Y2kgPSBubGFfZ2V0X2JlMTYoYVtPVlNfS0VZX0FUVFJfVkxBTl0pOwotCQllbmNhcCA9IGFbT1ZTX0tFWV9BVFRSX0VOQ0FQXTsKLQkJa2V5X2F0dHJzICY9IH4oMSA8PCBPVlNfS0VZX0FUVFJfRU5DQVApOwotCQllbmNhcF92YWxpZCA9IHRydWU7Ci0KLQkJaWYgKHRjaSAmIGh0b25zKFZMQU5fVEFHX1BSRVNFTlQpKSB7Ci0JCQllcnIgPSBwYXJzZV9mbG93X25sYXR0cnMoZW5jYXAsIGEsICZrZXlfYXR0cnMsIGxvZyk7Ci0JCQlpZiAoZXJyKQotCQkJCXJldHVybiBlcnI7Ci0JCX0gZWxzZSBpZiAoIXRjaSkgewotCQkJLyogQ29ybmVyIGNhc2UgZm9yIHRydW5jYXRlZCA4MDIuMVEgaGVhZGVyLiAqLwotCQkJaWYgKG5sYV9sZW4oZW5jYXApKSB7Ci0JCQkJT1ZTX05MRVJSKGxvZywgIlRydW5jYXRlZCA4MDIuMVEgaGVhZGVyIGhhcyBub24temVybyBlbmNhcCBhdHRyaWJ1dGUuIik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlPVlNfTkxFUlIobG9nLCAiRW5jYXAgYXR0ciBpcyBzZXQgZm9yIG5vbi1WTEFOIGZyYW1lIik7Ci0JCQlyZXR1cm4gIC1FSU5WQUw7Ci0JCX0KLQl9CisJZXJyID0gcGFyc2Vfdmxhbl9mcm9tX25sYXR0cnMobWF0Y2gsICZrZXlfYXR0cnMsIGEsIGZhbHNlLCBsb2cpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAllcnIgPSBvdnNfa2V5X2Zyb21fbmxhdHRycyhuZXQsIG1hdGNoLCBrZXlfYXR0cnMsIGEsIGZhbHNlLCBsb2cpOwogCWlmIChlcnIpCkBAIC0xMjY1LDQ2ICsxMzg2LDEyIEBACiAJCQlnb3RvIGZyZWVfbmV3bWFzazsKIAogCQkvKiBBbHdheXMgbWF0Y2ggb24gdGNpLiAqLwotCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIGV0aC50Y2ksIGh0b25zKDB4ZmZmZiksIHRydWUpOworCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIGV0aC52bGFuLnRjaSwgaHRvbnMoMHhmZmZmKSwgdHJ1ZSk7CisJCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgZXRoLmN2bGFuLnRjaSwgaHRvbnMoMHhmZmZmKSwgdHJ1ZSk7CiAKLQkJaWYgKG1hc2tfYXR0cnMgJiAxIDw8IE9WU19LRVlfQVRUUl9FTkNBUCkgewotCQkJX19iZTE2IGV0aF90eXBlID0gMDsKLQkJCV9fYmUxNiB0Y2kgPSAwOwotCi0JCQlpZiAoIWVuY2FwX3ZhbGlkKSB7Ci0JCQkJT1ZTX05MRVJSKGxvZywgIkVuY2FwIG1hc2sgYXR0cmlidXRlIGlzIHNldCBmb3Igbm9uLVZMQU4gZnJhbWUuIik7Ci0JCQkJZXJyID0gLUVJTlZBTDsKLQkJCQlnb3RvIGZyZWVfbmV3bWFzazsKLQkJCX0KLQotCQkJbWFza19hdHRycyAmPSB+KDEgPDwgT1ZTX0tFWV9BVFRSX0VOQ0FQKTsKLQkJCWlmIChhW09WU19LRVlfQVRUUl9FVEhFUlRZUEVdKQotCQkJCWV0aF90eXBlID0gbmxhX2dldF9iZTE2KGFbT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRV0pOwotCi0JCQlpZiAoZXRoX3R5cGUgPT0gaHRvbnMoMHhmZmZmKSkgewotCQkJCW1hc2tfYXR0cnMgJj0gfigxIDw8IE9WU19LRVlfQVRUUl9FVEhFUlRZUEUpOwotCQkJCWVuY2FwID0gYVtPVlNfS0VZX0FUVFJfRU5DQVBdOwotCQkJCWVyciA9IHBhcnNlX2Zsb3dfbWFza19ubGF0dHJzKGVuY2FwLCBhLAotCQkJCQkJCSAgICAgICZtYXNrX2F0dHJzLCBsb2cpOwotCQkJCWlmIChlcnIpCi0JCQkJCWdvdG8gZnJlZV9uZXdtYXNrOwotCQkJfSBlbHNlIHsKLQkJCQlPVlNfTkxFUlIobG9nLCAiVkxBTiBmcmFtZXMgbXVzdCBoYXZlIGFuIGV4YWN0IG1hdGNoIG9uIHRoZSBUUElEIChtYXNrPSV4KS4iLAotCQkJCQkgIG50b2hzKGV0aF90eXBlKSk7Ci0JCQkJZXJyID0gLUVJTlZBTDsKLQkJCQlnb3RvIGZyZWVfbmV3bWFzazsKLQkJCX0KLQotCQkJaWYgKGFbT1ZTX0tFWV9BVFRSX1ZMQU5dKQotCQkJCXRjaSA9IG5sYV9nZXRfYmUxNihhW09WU19LRVlfQVRUUl9WTEFOXSk7Ci0KLQkJCWlmICghKHRjaSAmIGh0b25zKFZMQU5fVEFHX1BSRVNFTlQpKSkgewotCQkJCU9WU19OTEVSUihsb2csICJWTEFOIHRhZyBwcmVzZW50IGJpdCBtdXN0IGhhdmUgYW4gZXhhY3QgbWF0Y2ggKHRjaV9tYXNrPSV4KS4iLAotCQkJCQkgIG50b2hzKHRjaSkpOwotCQkJCWVyciA9IC1FSU5WQUw7Ci0JCQkJZ290byBmcmVlX25ld21hc2s7Ci0JCQl9Ci0JCX0KKwkJZXJyID0gcGFyc2Vfdmxhbl9mcm9tX25sYXR0cnMobWF0Y2gsICZtYXNrX2F0dHJzLCBhLCB0cnVlLCBsb2cpOworCQlpZiAoZXJyKQorCQkJZ290byBmcmVlX25ld21hc2s7CiAKIAkJZXJyID0gb3ZzX2tleV9mcm9tX25sYXR0cnMobmV0LCBtYXRjaCwgbWFza19hdHRycywgYSwgdHJ1ZSwKIAkJCQkJICAgbG9nKTsKQEAgLTE0MTAsMTIgKzE0OTcsMjUgQEAKIAlyZXR1cm4gbWV0YWRhdGFfZnJvbV9ubGF0dHJzKG5ldCwgJm1hdGNoLCAmYXR0cnMsIGEsIGZhbHNlLCBsb2cpOwogfQogCitzdGF0aWMgaW50IG92c19ubGFfcHV0X3ZsYW4oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHZsYW5faGVhZCAqdmgsCisJCQkgICAgYm9vbCBpc19tYXNrKQoreworCV9fYmUxNiBldGhfdHlwZSA9ICFpc19tYXNrID8gdmgtPnRwaWQgOiBodG9ucygweGZmZmYpOworCisJaWYgKG5sYV9wdXRfYmUxNihza2IsIE9WU19LRVlfQVRUUl9FVEhFUlRZUEUsIGV0aF90eXBlKSB8fAorCSAgICBubGFfcHV0X2JlMTYoc2tiLCBPVlNfS0VZX0FUVFJfVkxBTiwgdmgtPnRjaSkpCisJCXJldHVybiAtRU1TR1NJWkU7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgX19vdnNfbmxhX3B1dF9rZXkoY29uc3Qgc3RydWN0IHN3X2Zsb3dfa2V5ICpzd2tleSwKIAkJCSAgICAgY29uc3Qgc3RydWN0IHN3X2Zsb3dfa2V5ICpvdXRwdXQsIGJvb2wgaXNfbWFzaywKIAkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3Qgb3ZzX2tleV9ldGhlcm5ldCAqZXRoX2tleTsKLQlzdHJ1Y3QgbmxhdHRyICpubGEsICplbmNhcDsKKwlzdHJ1Y3QgbmxhdHRyICpubGE7CisJc3RydWN0IG5sYXR0ciAqZW5jYXAgPSBOVUxMOworCXN0cnVjdCBubGF0dHIgKmluX2VuY2FwID0gTlVMTDsKIAogCWlmIChubGFfcHV0X3UzMihza2IsIE9WU19LRVlfQVRUUl9SRUNJUkNfSUQsIG91dHB1dC0+cmVjaXJjX2lkKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CkBAIC0xNDY0LDE3ICsxNTY0LDIxIEBACiAJZXRoZXJfYWRkcl9jb3B5KGV0aF9rZXktPmV0aF9zcmMsIG91dHB1dC0+ZXRoLnNyYyk7CiAJZXRoZXJfYWRkcl9jb3B5KGV0aF9rZXktPmV0aF9kc3QsIG91dHB1dC0+ZXRoLmRzdCk7CiAKLQlpZiAoc3drZXktPmV0aC50Y2kgfHwgc3drZXktPmV0aC50eXBlID09IGh0b25zKEVUSF9QXzgwMjFRKSkgewotCQlfX2JlMTYgZXRoX3R5cGU7Ci0JCWV0aF90eXBlID0gIWlzX21hc2sgPyBodG9ucyhFVEhfUF84MDIxUSkgOiBodG9ucygweGZmZmYpOwotCQlpZiAobmxhX3B1dF9iZTE2KHNrYiwgT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRSwgZXRoX3R5cGUpIHx8Ci0JCSAgICBubGFfcHV0X2JlMTYoc2tiLCBPVlNfS0VZX0FUVFJfVkxBTiwgb3V0cHV0LT5ldGgudGNpKSkKKwlpZiAoc3drZXktPmV0aC52bGFuLnRjaSB8fCBldGhfdHlwZV92bGFuKHN3a2V5LT5ldGgudHlwZSkpIHsKKwkJaWYgKG92c19ubGFfcHV0X3ZsYW4oc2tiLCAmb3V0cHV0LT5ldGgudmxhbiwgaXNfbWFzaykpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAkJZW5jYXAgPSBubGFfbmVzdF9zdGFydChza2IsIE9WU19LRVlfQVRUUl9FTkNBUCk7Ci0JCWlmICghc3drZXktPmV0aC50Y2kpCisJCWlmICghc3drZXktPmV0aC52bGFuLnRjaSkKIAkJCWdvdG8gdW5lbmNhcDsKLQl9IGVsc2UKLQkJZW5jYXAgPSBOVUxMOworCisJCWlmIChzd2tleS0+ZXRoLmN2bGFuLnRjaSB8fCBldGhfdHlwZV92bGFuKHN3a2V5LT5ldGgudHlwZSkpIHsKKwkJCWlmIChvdnNfbmxhX3B1dF92bGFuKHNrYiwgJm91dHB1dC0+ZXRoLmN2bGFuLCBpc19tYXNrKSkKKwkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwkJCWluX2VuY2FwID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBPVlNfS0VZX0FUVFJfRU5DQVApOworCQkJaWYgKCFzd2tleS0+ZXRoLmN2bGFuLnRjaSkKKwkJCQlnb3RvIHVuZW5jYXA7CisJCX0KKwl9CiAKIAlpZiAoc3drZXktPmV0aC50eXBlID09IGh0b25zKEVUSF9QXzgwMl8yKSkgewogCQkvKgpAQCAtMTQ5Myw2ICsxNTk3LDE0IEBACiAJaWYgKG5sYV9wdXRfYmUxNihza2IsIE9WU19LRVlfQVRUUl9FVEhFUlRZUEUsIG91dHB1dC0+ZXRoLnR5cGUpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAorCWlmIChldGhfdHlwZV92bGFuKHN3a2V5LT5ldGgudHlwZSkpIHsKKwkJLyogVGhlcmUgYXJlIDMgVkxBTiB0YWdzLCB3ZSBkb24ndCBrbm93IGFueXRoaW5nIGFib3V0IHRoZSByZXN0CisJCSAqIG9mIHRoZSBwYWNrZXQsIHNvIHRydW5jYXRlIGhlcmUuCisJCSAqLworCQlXQVJOX09OX09OQ0UoIShlbmNhcCAmJiBpbl9lbmNhcCkpOworCQlnb3RvIHVuZW5jYXA7CisJfQorCiAJaWYgKHN3a2V5LT5ldGgudHlwZSA9PSBodG9ucyhFVEhfUF9JUCkpIHsKIAkJc3RydWN0IG92c19rZXlfaXB2NCAqaXB2NF9rZXk7CiAKQEAgLTE2MTksNiArMTczMSw4IEBACiAJfQogCiB1bmVuY2FwOgorCWlmIChpbl9lbmNhcCkKKwkJbmxhX25lc3RfZW5kKHNrYiwgaW5fZW5jYXApOwogCWlmIChlbmNhcCkKIAkJbmxhX25lc3RfZW5kKHNrYiwgZW5jYXApOwogCkBAIC0xODgyLDEzICsxOTk2LDE1IEBACiAKIHZvaWQgb3ZzX21hdGNoX2luaXQoc3RydWN0IHN3X2Zsb3dfbWF0Y2ggKm1hdGNoLAogCQkgICAgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksCisJCSAgICBib29sIHJlc2V0X2tleSwKIAkJICAgIHN0cnVjdCBzd19mbG93X21hc2sgKm1hc2spCiB7CiAJbWVtc2V0KG1hdGNoLCAwLCBzaXplb2YoKm1hdGNoKSk7CiAJbWF0Y2gtPmtleSA9IGtleTsKIAltYXRjaC0+bWFzayA9IG1hc2s7CiAKLQltZW1zZXQoa2V5LCAwLCBzaXplb2YoKmtleSkpOworCWlmIChyZXNldF9rZXkpCisJCW1lbXNldChrZXksIDAsIHNpemVvZigqa2V5KSk7CiAKIAlpZiAobWFzaykgewogCQltZW1zZXQoJm1hc2stPmtleSwgMCwgc2l6ZW9mKG1hc2stPmtleSkpOwpAQCAtMTkzNSw3ICsyMDUxLDcgQEAKIAlzdHJ1Y3QgbmxhdHRyICphOwogCWludCBlcnIgPSAwLCBzdGFydCwgb3B0c190eXBlOwogCi0Jb3ZzX21hdGNoX2luaXQoJm1hdGNoLCAma2V5LCBOVUxMKTsKKwlvdnNfbWF0Y2hfaW5pdCgmbWF0Y2gsICZrZXksIHRydWUsIE5VTEwpOwogCW9wdHNfdHlwZSA9IGlwX3R1bl9mcm9tX25sYXR0cihubGFfZGF0YShhdHRyKSwgJm1hdGNoLCBmYWxzZSwgbG9nKTsKIAlpZiAob3B0c190eXBlIDwgMCkKIAkJcmV0dXJuIG9wdHNfdHlwZTsKQEAgLTIyODMsNyArMjM5OSw3IEBACiAKIAkJY2FzZSBPVlNfQUNUSU9OX0FUVFJfUFVTSF9WTEFOOgogCQkJdmxhbiA9IG5sYV9kYXRhKGEpOwotCQkJaWYgKHZsYW4tPnZsYW5fdHBpZCAhPSBodG9ucyhFVEhfUF84MDIxUSkpCisJCQlpZiAoIWV0aF90eXBlX3ZsYW4odmxhbi0+dmxhbl90cGlkKSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWlmICghKHZsYW4tPnZsYW5fdGNpICYgaHRvbnMoVkxBTl9UQUdfUFJFU0VOVCkpKQogCQkJCXJldHVybiAtRUlOVkFMOwpAQCAtMjM4OCw3ICsyNTA0LDcgQEAKIAogCSgqc2ZhKS0+b3JpZ19sZW4gPSBubGFfbGVuKGF0dHIpOwogCWVyciA9IF9fb3ZzX25sYV9jb3B5X2FjdGlvbnMobmV0LCBhdHRyLCBrZXksIDAsIHNmYSwga2V5LT5ldGgudHlwZSwKLQkJCQkgICAgIGtleS0+ZXRoLnRjaSwgbG9nKTsKKwkJCQkgICAgIGtleS0+ZXRoLnZsYW4udGNpLCBsb2cpOwogCWlmIChlcnIpCiAJCW92c19ubGFfZnJlZV9mbG93X2FjdGlvbnMoKnNmYSk7CiAKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9mbG93X25ldGxpbmsuaCBiL25ldC9vcGVudnN3aXRjaC9mbG93X25ldGxpbmsuaAppbmRleCA0N2RkMTQyLi40NWY5NzY5IDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvZmxvd19uZXRsaW5rLmgKKysrIGIvbmV0L29wZW52c3dpdGNoL2Zsb3dfbmV0bGluay5oCkBAIC00MSw3ICs0MSw4IEBACiBzaXplX3Qgb3ZzX2tleV9hdHRyX3NpemUodm9pZCk7CiAKIHZvaWQgb3ZzX21hdGNoX2luaXQoc3RydWN0IHN3X2Zsb3dfbWF0Y2ggKm1hdGNoLAotCQkgICAgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksIHN0cnVjdCBzd19mbG93X21hc2sgKm1hc2spOworCQkgICAgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksIGJvb2wgcmVzZXRfa2V5LAorCQkgICAgc3RydWN0IHN3X2Zsb3dfbWFzayAqbWFzayk7CiAKIGludCBvdnNfbmxhX3B1dF9rZXkoY29uc3Qgc3RydWN0IHN3X2Zsb3dfa2V5ICosIGNvbnN0IHN0cnVjdCBzd19mbG93X2tleSAqLAogCQkgICAgaW50IGF0dHIsIGJvb2wgaXNfbWFzaywgc3RydWN0IHNrX2J1ZmYgKik7CmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvZmxvd190YWJsZS5jIGIvbmV0L29wZW52c3dpdGNoL2Zsb3dfdGFibGUuYwppbmRleCBkMDczZmZmLi5lYTdhODA3IDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvZmxvd190YWJsZS5jCisrKyBiL25ldC9vcGVudnN3aXRjaC9mbG93X3RhYmxlLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgpAQCAtNzksMTcgKzgwLDEyIEBACiB7CiAJc3RydWN0IHN3X2Zsb3cgKmZsb3c7CiAJc3RydWN0IGZsb3dfc3RhdHMgKnN0YXRzOwotCWludCBub2RlOwogCi0JZmxvdyA9IGttZW1fY2FjaGVfYWxsb2MoZmxvd19jYWNoZSwgR0ZQX0tFUk5FTCk7CisJZmxvdyA9IGttZW1fY2FjaGVfemFsbG9jKGZsb3dfY2FjaGUsIEdGUF9LRVJORUwpOwogCWlmICghZmxvdykKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQlmbG93LT5zZl9hY3RzID0gTlVMTDsKLQlmbG93LT5tYXNrID0gTlVMTDsKLQlmbG93LT5pZC51bm1hc2tlZF9rZXkgPSBOVUxMOwotCWZsb3ctPmlkLnVmaWRfbGVuID0gMDsKLQlmbG93LT5zdGF0c19sYXN0X3dyaXRlciA9IE5VTUFfTk9fTk9ERTsKKwlmbG93LT5zdGF0c19sYXN0X3dyaXRlciA9IC0xOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBzdGF0IG5vZGUuICovCiAJc3RhdHMgPSBrbWVtX2NhY2hlX2FsbG9jX25vZGUoZmxvd19zdGF0c19jYWNoZSwKQEAgLTEwMiwxMCArOTgsNiBAQAogCiAJUkNVX0lOSVRfUE9JTlRFUihmbG93LT5zdGF0c1swXSwgc3RhdHMpOwogCi0JZm9yX2VhY2hfbm9kZShub2RlKQotCQlpZiAobm9kZSAhPSAwKQotCQkJUkNVX0lOSVRfUE9JTlRFUihmbG93LT5zdGF0c1tub2RlXSwgTlVMTCk7Ci0KIAlyZXR1cm4gZmxvdzsKIGVycjoKIAlrbWVtX2NhY2hlX2ZyZWUoZmxvd19jYWNoZSwgZmxvdyk7CkBAIC0xNDIsMTYgKzEzNCwxNyBAQAogCiBzdGF0aWMgdm9pZCBmbG93X2ZyZWUoc3RydWN0IHN3X2Zsb3cgKmZsb3cpCiB7Ci0JaW50IG5vZGU7CisJaW50IGNwdTsKIAogCWlmIChvdnNfaWRlbnRpZmllcl9pc19rZXkoJmZsb3ctPmlkKSkKIAkJa2ZyZWUoZmxvdy0+aWQudW5tYXNrZWRfa2V5KTsKIAlpZiAoZmxvdy0+c2ZfYWN0cykKIAkJb3ZzX25sYV9mcmVlX2Zsb3dfYWN0aW9ucygoc3RydWN0IHN3X2Zsb3dfYWN0aW9ucyBfX2ZvcmNlICopZmxvdy0+c2ZfYWN0cyk7Ci0JZm9yX2VhY2hfbm9kZShub2RlKQotCQlpZiAoZmxvdy0+c3RhdHNbbm9kZV0pCisJLyogV2Ugb3BlbiBjb2RlIHRoaXMgdG8gbWFrZSBzdXJlIGNwdSAwIGlzIGFsd2F5cyBjb25zaWRlcmVkICovCisJZm9yIChjcHUgPSAwOyBjcHUgPCBucl9jcHVfaWRzOyBjcHUgPSBjcHVtYXNrX25leHQoY3B1LCBjcHVfcG9zc2libGVfbWFzaykpCisJCWlmIChmbG93LT5zdGF0c1tjcHVdKQogCQkJa21lbV9jYWNoZV9mcmVlKGZsb3dfc3RhdHNfY2FjaGUsCi0JCQkJCShzdHJ1Y3QgZmxvd19zdGF0cyBfX2ZvcmNlICopZmxvdy0+c3RhdHNbbm9kZV0pOworCQkJCQkoc3RydWN0IGZsb3dfc3RhdHMgX19mb3JjZSAqKWZsb3ctPnN0YXRzW2NwdV0pOwogCWttZW1fY2FjaGVfZnJlZShmbG93X2NhY2hlLCBmbG93KTsKIH0KIApAQCAtNzU2LDcgKzc0OSw3IEBACiAJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3Qgc3dfZmxvd19rZXkpICUgc2l6ZW9mKGxvbmcpKTsKIAogCWZsb3dfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgic3dfZmxvdyIsIHNpemVvZihzdHJ1Y3Qgc3dfZmxvdykKLQkJCQkgICAgICAgKyAobnJfbm9kZV9pZHMKKwkJCQkgICAgICAgKyAobnJfY3B1X2lkcwogCQkJCQkgICogc2l6ZW9mKHN0cnVjdCBmbG93X3N0YXRzICopKSwKIAkJCQkgICAgICAgMCwgMCwgTlVMTCk7CiAJaWYgKGZsb3dfY2FjaGUgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC92cG9ydC1nZW5ldmUuYyBiL25ldC9vcGVudnN3aXRjaC92cG9ydC1nZW5ldmUuYwppbmRleCAxYTFmY2VjLi41YWFmM2JhIDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtZ2VuZXZlLmMKKysrIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LWdlbmV2ZS5jCkBAIC05Myw3ICs5MywxNCBAQAogCQlyZXR1cm4gRVJSX0NBU1QoZGV2KTsKIAl9CiAKLQlkZXZfY2hhbmdlX2ZsYWdzKGRldiwgZGV2LT5mbGFncyB8IElGRl9VUCk7CisJZXJyID0gZGV2X2NoYW5nZV9mbGFncyhkZXYsIGRldi0+ZmxhZ3MgfCBJRkZfVVApOworCWlmIChlcnIgPCAwKSB7CisJCXJ0bmxfZGVsZXRlX2xpbmsoZGV2KTsKKwkJcnRubF91bmxvY2soKTsKKwkJb3ZzX3Zwb3J0X2ZyZWUodnBvcnQpOworCQlnb3RvIGVycm9yOworCX0KKwogCXJ0bmxfdW5sb2NrKCk7CiAJcmV0dXJuIHZwb3J0OwogZXJyb3I6CmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtZ3JlLmMgYi9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtZ3JlLmMKaW5kZXggN2Y4ODk3Zi4uMGU3MmQ5NSAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL3Zwb3J0LWdyZS5jCisrKyBiL25ldC9vcGVudnN3aXRjaC92cG9ydC1ncmUuYwpAQCAtNTQsNiArNTQsNyBAQAogCXN0cnVjdCBuZXQgKm5ldCA9IG92c19kcF9nZXRfbmV0KHBhcm1zLT5kcCk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgdnBvcnQgKnZwb3J0OworCWludCBlcnI7CiAKIAl2cG9ydCA9IG92c192cG9ydF9hbGxvYygwLCAmb3ZzX2dyZV92cG9ydF9vcHMsIHBhcm1zKTsKIAlpZiAoSVNfRVJSKHZwb3J0KSkKQEAgLTY3LDkgKzY4LDE1IEBACiAJCXJldHVybiBFUlJfQ0FTVChkZXYpOwogCX0KIAotCWRldl9jaGFuZ2VfZmxhZ3MoZGV2LCBkZXYtPmZsYWdzIHwgSUZGX1VQKTsKLQlydG5sX3VubG9jaygpOworCWVyciA9IGRldl9jaGFuZ2VfZmxhZ3MoZGV2LCBkZXYtPmZsYWdzIHwgSUZGX1VQKTsKKwlpZiAoZXJyIDwgMCkgeworCQlydG5sX2RlbGV0ZV9saW5rKGRldik7CisJCXJ0bmxfdW5sb2NrKCk7CisJCW92c192cG9ydF9mcmVlKHZwb3J0KTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwl9CiAKKwlydG5sX3VubG9jaygpOwogCXJldHVybiB2cG9ydDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL3Zwb3J0LWludGVybmFsX2Rldi5jIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LWludGVybmFsX2Rldi5jCmluZGV4IDQzNGUwNGMuLjk1YzM2MTQgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC92cG9ydC1pbnRlcm5hbF9kZXYuYworKysgYi9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtaW50ZXJuYWxfZGV2LmMKQEAgLTE0MCw3ICsxNDAsNyBAQAogCiBzdGF0aWMgdm9pZCBpbnRlcm5hbF9zZXRfcnhfaGVhZHJvb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19ocikKIHsKLQlkZXYtPm5lZWRlZF9oZWFkcm9vbSA9IG5ld19ocjsKKwlkZXYtPm5lZWRlZF9oZWFkcm9vbSA9IG5ld19ociA8IDAgPyAwIDogbmV3X2hyOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGludGVybmFsX2Rldl9uZXRkZXZfb3BzID0gewpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL3Zwb3J0LXZ4bGFuLmMgYi9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtdnhsYW4uYwppbmRleCA1ZWI3Njk0Li43ZWI5NTVlIDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtdnhsYW4uYworKysgYi9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtdnhsYW4uYwpAQCAtMTMwLDcgKzEzMCwxNCBAQAogCQlyZXR1cm4gRVJSX0NBU1QoZGV2KTsKIAl9CiAKLQlkZXZfY2hhbmdlX2ZsYWdzKGRldiwgZGV2LT5mbGFncyB8IElGRl9VUCk7CisJZXJyID0gZGV2X2NoYW5nZV9mbGFncyhkZXYsIGRldi0+ZmxhZ3MgfCBJRkZfVVApOworCWlmIChlcnIgPCAwKSB7CisJCXJ0bmxfZGVsZXRlX2xpbmsoZGV2KTsKKwkJcnRubF91bmxvY2soKTsKKwkJb3ZzX3Zwb3J0X2ZyZWUodnBvcnQpOworCQlnb3RvIGVycm9yOworCX0KKwogCXJ0bmxfdW5sb2NrKCk7CiAJcmV0dXJuIHZwb3J0OwogZXJyb3I6CmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQuYyBiL25ldC9vcGVudnN3aXRjaC92cG9ydC5jCmluZGV4IDZiMjFmZDAuLjhmMTk4NDMgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC92cG9ydC5jCisrKyBiL25ldC9vcGVudnN3aXRjaC92cG9ydC5jCkBAIC00ODUsOSArNDg1LDE0IEBACiB7CiAJdW5zaWduZWQgaW50IGxlbmd0aCA9IHNrYi0+bGVuIC0gRVRIX0hMRU47CiAKLQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxUSkpCisJaWYgKHNrYl92bGFuX3RhZ2dlZChza2IpKQogCQlsZW5ndGggLT0gVkxBTl9ITEVOOwogCisJLyogRG9uJ3Qgc3VidHJhY3QgZm9yIG11bHRpcGxlIFZMQU4gdGFncy4gTW9zdCAoYWxsPykgZHJpdmVycyBhbGxvdworCSAqIChFVEhfTEVOICsgVkxBTl9ITEVOKSBpbiBhZGRpdGlvbiB0byB0aGUgbXR1IHZhbHVlLCBidXQgYWxtb3N0IG5vbmUKKwkgKiBhY2NvdW50IGZvciA4MDIuMWFkLiBlLmcuIGlzX3NrYl9mb3J3YXJkYWJsZSgpLgorCSAqLworCiAJcmV0dXJuIGxlbmd0aDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3Jkcy9pYi5oIGIvbmV0L3Jkcy9pYi5oCmluZGV4IDA0NmY3NTAuLjQ1YWM4ZTggMTAwNjQ0Ci0tLSBhL25ldC9yZHMvaWIuaAorKysgYi9uZXQvcmRzL2liLmgKQEAgLTMzMyw2ICszMzMsNyBAQAogdm9pZCByZHNfaWJfc3RhdGVfY2hhbmdlKHN0cnVjdCBzb2NrICpzayk7CiBpbnQgcmRzX2liX2xpc3Rlbl9pbml0KHZvaWQpOwogdm9pZCByZHNfaWJfbGlzdGVuX3N0b3Aodm9pZCk7CitfX3ByaW50ZigyLCAzKQogdm9pZCBfX3Jkc19pYl9jb25uX2Vycm9yKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubiwgY29uc3QgY2hhciAqLCAuLi4pOwogaW50IHJkc19pYl9jbV9oYW5kbGVfY29ubmVjdChzdHJ1Y3QgcmRtYV9jbV9pZCAqY21faWQsCiAJCQkgICAgIHN0cnVjdCByZG1hX2NtX2V2ZW50ICpldmVudCk7CmRpZmYgLS1naXQgYS9uZXQvcmRzL3Jkcy5oIGIvbmV0L3Jkcy9yZHMuaAppbmRleCBiMmQxN2YwLi5mZDBiY2NiIDEwMDY0NAotLS0gYS9uZXQvcmRzL3Jkcy5oCisrKyBiL25ldC9yZHMvcmRzLmgKQEAgLTY4OCw2ICs2ODgsNyBAQAogI2RlZmluZSByZHNfY29ubl9lcnJvcihjb25uLCBmbXQuLi4pIFwKIAlfX3Jkc19jb25uX2Vycm9yKGNvbm4sIEtFUk5fV0FSTklORyAiUkRTOiAiIGZtdCkKIAorX19wcmludGYoMiwgMykKIHZvaWQgX19yZHNfY29ubl9wYXRoX2Vycm9yKHN0cnVjdCByZHNfY29ubl9wYXRoICpjcCwgY29uc3QgY2hhciAqLCAuLi4pOwogI2RlZmluZSByZHNfY29ubl9wYXRoX2Vycm9yKGNwLCBmbXQuLi4pIFwKIAlfX3Jkc19jb25uX3BhdGhfZXJyb3IoY3AsIEtFUk5fV0FSTklORyAiUkRTOiAiIGZtdCkKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9LY29uZmlnIGIvbmV0L3J4cnBjL0tjb25maWcKaW5kZXggNzg0YzUzMS4uODZmODg1MyAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL0tjb25maWcKKysrIGIvbmV0L3J4cnBjL0tjb25maWcKQEAgLTE5LDYgKzE5LDIwIEBACiAKIAkgIFNlZSBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcnhycGMudHh0LgogCitjb25maWcgQUZfUlhSUENfSVBWNgorCWJvb2wgIklQdjYgc3VwcG9ydCBmb3IgUnhSUEMiCisJZGVwZW5kcyBvbiAoSVBWNiA9IG0gJiYgQUZfUlhSUEMgPSBtKSB8fCAoSVBWNiA9IHkgJiYgQUZfUlhSUEMpCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBhbGxvdyBBRl9SWFJQQyB0byB1c2UgSVBWNiBVRFAgYXMgd2VsbCBhcyBJUFY0IFVEUCBhcworCSAgaXRzIG5ldHdvcmsgdHJhbnNwb3J0LgorCitjb25maWcgQUZfUlhSUENfSU5KRUNUX0xPU1MKKwlib29sICJJbmplY3QgcGFja2V0IGxvc3MgaW50byBSeFJQQyBwYWNrZXQgc3RyZWFtIgorCWRlcGVuZHMgb24gQUZfUlhSUEMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluamVjdCBwYWNrZXQgbG9zcyBieSBkaXNjYXJkaW5nIHNvbWUgcmVjZWl2ZWQgYW5kIHNvbWUKKwkgIHRyYW5zbWl0dGVkIHBhY2tldHMuCisKIAogY29uZmlnIEFGX1JYUlBDX0RFQlVHCiAJYm9vbCAiUnhSUEMgZHluYW1pYyBkZWJ1Z2dpbmciCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvTWFrZWZpbGUgYi9uZXQvcnhycGMvTWFrZWZpbGUKaW5kZXggMTBmM2Y0OC4uOGZjNmVhMyAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL01ha2VmaWxlCisrKyBiL25ldC9yeHJwYy9NYWtlZmlsZQpAQCAtMjIsNiArMjIsNyBAQAogCXBlZXJfb2JqZWN0Lm8gXAogCXJlY3Ztc2cubyBcCiAJc2VjdXJpdHkubyBcCisJc2VuZG1zZy5vIFwKIAlza2J1ZmYubyBcCiAJdXRpbHMubwogCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvYWZfcnhycGMuYyBiL25ldC9yeHJwYy9hZl9yeHJwYy5jCmluZGV4IDg4ZWZmYWQuLjQ0YzljMmIgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9hZl9yeHJwYy5jCisrKyBiL25ldC9yeHJwYy9hZl9yeHJwYy5jCkBAIC0xNiwxMiArMTYsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXktdHlwZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgImFyLWludGVybmFsLmgiCiAKIE1PRFVMRV9ERVNDUklQVElPTigiUnhSUEMgbmV0d29yayBwcm90b2NvbCIpOwpAQCAtNDMsNyArNDUsNyBAQAogYXRvbWljX3QgcnhycGNfZGVidWdfaWQ7CiAKIC8qIGNvdW50IG9mIHNrYnMgY3VycmVudGx5IGluIHVzZSAqLwotYXRvbWljX3QgcnhycGNfbl9za2JzOworYXRvbWljX3QgcnhycGNfbl90eF9za2JzLCByeHJwY19uX3J4X3NrYnM7CiAKIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpyeHJwY193b3JrcXVldWU7CiAKQEAgLTEwNCwxOSArMTA2LDI1IEBACiAJY2FzZSBBRl9JTkVUOgogCQlpZiAoc3J4LT50cmFuc3BvcnRfbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJX2RlYnVnKCJJTkVUOiAleCBAICVwSTQiLAotCQkgICAgICAgbnRvaHMoc3J4LT50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSwKLQkJICAgICAgICZzcngtPnRyYW5zcG9ydC5zaW4uc2luX2FkZHIpOwogCQl0YWlsID0gb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX3J4cnBjLCB0cmFuc3BvcnQuc2luLl9fcGFkKTsKIAkJYnJlYWs7CiAKKyNpZmRlZiBDT05GSUdfQUZfUlhSUENfSVBWNgogCWNhc2UgQUZfSU5FVDY6CisJCWlmIChzcngtPnRyYW5zcG9ydF9sZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdGFpbCA9IG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9yeHJwYywgdHJhbnNwb3J0KSArCisJCQlzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisJCWJyZWFrOworI2VuZGlmCisKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKIAl9CiAKIAlpZiAodGFpbCA8IGxlbikKIAkJbWVtc2V0KCh2b2lkICopc3J4ICsgdGFpbCwgMCwgbGVuIC0gdGFpbCk7CisJX2RlYnVnKCJJTkVUOiAlcElTcCIsICZzcngtPnRyYW5zcG9ydCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyOCw3ICsxMzYsOCBAQAogCXN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqc3J4ID0gKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqKXNhZGRyOwogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWw7Ci0Jc3RydWN0IHJ4cnBjX3NvY2sgKnJ4ID0gcnhycGNfc2soc2spLCAqcHJ4OworCXN0cnVjdCByeHJwY19zb2NrICpyeCA9IHJ4cnBjX3NrKHNrKTsKKwl1MTYgc2VydmljZV9pZCA9IHNyeC0+c3J4X3NlcnZpY2U7CiAJaW50IHJldDsKIAogCV9lbnRlcigiJXAsJXAsJWQiLCByeCwgc2FkZHIsIGxlbik7CkBAIC0xNTIsMTYgKzE2MSwxMyBAQAogCQlnb3RvIGVycm9yX3VubG9jazsKIAl9CiAKLQlpZiAocngtPnNyeC5zcnhfc2VydmljZSkgewotCQl3cml0ZV9sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkocHJ4LCAmbG9jYWwtPnNlcnZpY2VzLCBsaXN0ZW5fbGluaykgewotCQkJaWYgKHByeC0+c3J4LnNyeF9zZXJ2aWNlID09IHJ4LT5zcnguc3J4X3NlcnZpY2UpCi0JCQkJZ290byBzZXJ2aWNlX2luX3VzZTsKLQkJfQotCisJaWYgKHNlcnZpY2VfaWQpIHsKKwkJd3JpdGVfbG9jaygmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCQlpZiAocmN1X2FjY2Vzc19wb2ludGVyKGxvY2FsLT5zZXJ2aWNlKSkKKwkJCWdvdG8gc2VydmljZV9pbl91c2U7CiAJCXJ4LT5sb2NhbCA9IGxvY2FsOwotCQlsaXN0X2FkZF90YWlsKCZyeC0+bGlzdGVuX2xpbmssICZsb2NhbC0+c2VydmljZXMpOwotCQl3cml0ZV91bmxvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGxvY2FsLT5zZXJ2aWNlLCByeCk7CisJCXdyaXRlX3VubG9jaygmbG9jYWwtPnNlcnZpY2VzX2xvY2spOwogCiAJCXJ4LT5zay5za19zdGF0ZSA9IFJYUlBDX1NFUlZFUl9CT1VORDsKIAl9IGVsc2UgewpAQCAtMTc0LDcgKzE4MCw3IEBACiAJcmV0dXJuIDA7CiAKIHNlcnZpY2VfaW5fdXNlOgotCXdyaXRlX3VubG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCXdyaXRlX3VubG9jaygmbG9jYWwtPnNlcnZpY2VzX2xvY2spOwogCXJ4cnBjX3B1dF9sb2NhbChsb2NhbCk7CiAJcmV0ID0gLUVBRERSSU5VU0U7CiBlcnJvcl91bmxvY2s6CkBAIC0xOTEsNyArMTk3LDcgQEAKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzayk7Ci0JdW5zaWduZWQgaW50IG1heDsKKwl1bnNpZ25lZCBpbnQgbWF4LCBvbGQ7CiAJaW50IHJldDsKIAogCV9lbnRlcigiJXAsJWQiLCByeCwgYmFja2xvZyk7CkBAIC0yMTAsOSArMjE2LDEzIEBACiAJCQliYWNrbG9nID0gbWF4OwogCQllbHNlIGlmIChiYWNrbG9nIDwgMCB8fCBiYWNrbG9nID4gbWF4KQogCQkJYnJlYWs7CisJCW9sZCA9IHNrLT5za19tYXhfYWNrX2JhY2tsb2c7CiAJCXNrLT5za19tYXhfYWNrX2JhY2tsb2cgPSBiYWNrbG9nOwotCQlyeC0+c2suc2tfc3RhdGUgPSBSWFJQQ19TRVJWRVJfTElTVEVOSU5HOwotCQlyZXQgPSAwOworCQlyZXQgPSByeHJwY19zZXJ2aWNlX3ByZWFsbG9jKHJ4LCBHRlBfS0VSTkVMKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcngtPnNrLnNrX3N0YXRlID0gUlhSUENfU0VSVkVSX0xJU1RFTklORzsKKwkJZWxzZQorCQkJc2stPnNrX21heF9hY2tfYmFja2xvZyA9IG9sZDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVCVVNZOwpAQCAtMjMwLDYgKzI0MCw4IEBACiAgKiBAc3J4OiBUaGUgYWRkcmVzcyBvZiB0aGUgcGVlciB0byBjb250YWN0CiAgKiBAa2V5OiBUaGUgc2VjdXJpdHkgY29udGV4dCB0byB1c2UgKGRlZmF1bHRzIHRvIHNvY2tldCBzZXR0aW5nKQogICogQHVzZXJfY2FsbF9JRDogVGhlIElEIHRvIHVzZQorICogQGdmcDogVGhlIGFsbG9jYXRpb24gY29uc3RyYWludHMKKyAqIEBub3RpZnlfcng6IFdoZXJlIHRvIHNlbmQgbm90aWZpY2F0aW9ucyBpbnN0ZWFkIG9mIHNvY2tldCBxdWV1ZQogICoKICAqIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gYmVnaW4gYSBjYWxsIG9uIHRoZSBub21pbmF0ZWQgc29ja2V0LiAgVGhpcyBqdXN0CiAgKiBzZXRzIHVwIGFsbCB0aGUgaW50ZXJuYWwgdHJhY2tpbmcgc3RydWN0dXJlcyBhbmQgYWxsb2NhdGVzIGNvbm5lY3Rpb24gYW5kCkBAIC0yNDIsNyArMjU0LDggQEAKIAkJCQkJICAgc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcngsCiAJCQkJCSAgIHN0cnVjdCBrZXkgKmtleSwKIAkJCQkJICAgdW5zaWduZWQgbG9uZyB1c2VyX2NhbGxfSUQsCi0JCQkJCSAgIGdmcF90IGdmcCkKKwkJCQkJICAgZ2ZwX3QgZ2ZwLAorCQkJCQkgICByeHJwY19ub3RpZnlfcnhfdCBub3RpZnlfcngpCiB7CiAJc3RydWN0IHJ4cnBjX2Nvbm5fcGFyYW1ldGVycyBjcDsKIAlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKQEAgLTI2OSw2ICsyODIsOCBAQAogCWNwLmV4Y2x1c2l2ZQkJPSBmYWxzZTsKIAljcC5zZXJ2aWNlX2lkCQk9IHNyeC0+c3J4X3NlcnZpY2U7CiAJY2FsbCA9IHJ4cnBjX25ld19jbGllbnRfY2FsbChyeCwgJmNwLCBzcngsIHVzZXJfY2FsbF9JRCwgZ2ZwKTsKKwlpZiAoIUlTX0VSUihjYWxsKSkKKwkJY2FsbC0+bm90aWZ5X3J4ID0gbm90aWZ5X3J4OwogCiAJcmVsZWFzZV9zb2NrKCZyeC0+c2spOwogCV9sZWF2ZSgiID0gJXAiLCBjYWxsKTsKQEAgLTI3OCw0MCArMjkzLDM5IEBACiAKIC8qKgogICogcnhycGNfa2VybmVsX2VuZF9jYWxsIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBlbmQgYSBjYWxsIGl0IHdhcyB1c2luZworICogQHNvY2s6IFRoZSBzb2NrZXQgdGhlIGNhbGwgaXMgb24KICAqIEBjYWxsOiBUaGUgY2FsbCB0byBlbmQKICAqCiAgKiBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIGVuZCBhIGNhbGwgaXQgd2FzIHVzaW5nLiAgVGhlIGNhbGwgbXVzdCBiZQogICogY29tcGxldGUgYmVmb3JlIHRoaXMgaXMgY2FsbGVkICh0aGUgY2FsbCBzaG91bGQgYmUgYWJvcnRlZCBpZiBuZWNlc3NhcnkpLgogICovCi12b2lkIHJ4cnBjX2tlcm5lbF9lbmRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3ZvaWQgcnhycGNfa2VybmVsX2VuZF9jYWxsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQogewogCV9lbnRlcigiJWR7JWR9IiwgY2FsbC0+ZGVidWdfaWQsIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpOwotCXJ4cnBjX3JlbW92ZV91c2VyX0lEKGNhbGwtPnNvY2tldCwgY2FsbCk7Ci0JcnhycGNfcHV0X2NhbGwoY2FsbCk7CisJcnhycGNfcmVsZWFzZV9jYWxsKHJ4cnBjX3NrKHNvY2stPnNrKSwgY2FsbCk7CisJcnhycGNfcHV0X2NhbGwoY2FsbCwgcnhycGNfY2FsbF9wdXRfa2VybmVsKTsKIH0KIEVYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2VuZF9jYWxsKTsKIAogLyoqCi0gKiByeHJwY19rZXJuZWxfaW50ZXJjZXB0X3J4X21lc3NhZ2VzIC0gSW50ZXJjZXB0IHJlY2VpdmVkIFJ4UlBDIG1lc3NhZ2VzCisgKiByeHJwY19rZXJuZWxfbmV3X2NhbGxfbm90aWZpY2F0aW9uIC0gR2V0IG5vdGlmaWNhdGlvbnMgb2YgbmV3IGNhbGxzCiAgKiBAc29jazogVGhlIHNvY2tldCB0byBpbnRlcmNlcHQgcmVjZWl2ZWQgbWVzc2FnZXMgb24KLSAqIEBpbnRlcmNlcHRvcjogVGhlIGZ1bmN0aW9uIHRvIHBhc3MgdGhlIG1lc3NhZ2VzIHRvCisgKiBAbm90aWZ5X25ld19jYWxsOiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBuZXcgY2FsbHMgYXBwZWFyCisgKiBAZGlzY2FyZF9uZXdfY2FsbDogRnVuY3Rpb24gdG8gZGlzY2FyZCBwcmVhbGxvY2F0ZWQgY2FsbHMKICAqCi0gKiBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIGludGVyY2VwdCBtZXNzYWdlcyBoZWFkaW5nIGZvciB0aGUgUnggcXVldWUgb24gYW4KLSAqIFJ4UlBDIHNvY2tldC4gIFRoZXkgZ2V0IHBhc3NlZCB0byB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGluc3RlYWQuCi0gKiBAaW50ZXJjZXB0b3Igc2hvdWxkIGZyZWUgdGhlIHNvY2tldCBidWZmZXJzIGl0IGlzIGdpdmVuLiAgQGludGVyY2VwdG9yIGlzCi0gKiBjYWxsZWQgd2l0aCB0aGUgc29ja2V0IHJlY2VpdmUgcXVldWUgc3BpbmxvY2sgaGVsZCBhbmQgc29mdGlycXMgZGlzYWJsZWQgLQotICogdGhpcyBlbnN1cmVzIHRoYXQgdGhlIG1lc3NhZ2VzIHdpbGwgYmUgZGVsaXZlcmVkIGluIHRoZSByaWdodCBvcmRlci4KKyAqIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gYmUgZ2l2ZW4gbm90aWZpY2F0aW9ucyBhYm91dCBuZXcgY2FsbHMuCiAgKi8KLXZvaWQgcnhycGNfa2VybmVsX2ludGVyY2VwdF9yeF9tZXNzYWdlcyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJCQlyeHJwY19pbnRlcmNlcHRvcl90IGludGVyY2VwdG9yKQordm9pZCByeHJwY19rZXJuZWxfbmV3X2NhbGxfbm90aWZpY2F0aW9uKAorCXN0cnVjdCBzb2NrZXQgKnNvY2ssCisJcnhycGNfbm90aWZ5X25ld19jYWxsX3Qgbm90aWZ5X25ld19jYWxsLAorCXJ4cnBjX2Rpc2NhcmRfbmV3X2NhbGxfdCBkaXNjYXJkX25ld19jYWxsKQogewogCXN0cnVjdCByeHJwY19zb2NrICpyeCA9IHJ4cnBjX3NrKHNvY2stPnNrKTsKIAotCV9lbnRlcigiIik7Ci0JcngtPmludGVyY2VwdG9yID0gaW50ZXJjZXB0b3I7CisJcngtPm5vdGlmeV9uZXdfY2FsbCA9IG5vdGlmeV9uZXdfY2FsbDsKKwlyeC0+ZGlzY2FyZF9uZXdfY2FsbCA9IGRpc2NhcmRfbmV3X2NhbGw7CiB9Ci0KLUVYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2ludGVyY2VwdF9yeF9tZXNzYWdlcyk7CitFWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9uZXdfY2FsbF9ub3RpZmljYXRpb24pOwogCiAvKgogICogY29ubmVjdCBhbiBSeFJQQyBzb2NrZXQKQEAgLTM5MSw2ICs0MDUsMjMgQEAKIAogCXN3aXRjaCAocngtPnNrLnNrX3N0YXRlKSB7CiAJY2FzZSBSWFJQQ19VTkJPVU5EOgorCQlyeC0+c3J4LnNyeF9mYW1pbHkgPSBBRl9SWFJQQzsKKwkJcngtPnNyeC5zcnhfc2VydmljZSA9IDA7CisJCXJ4LT5zcngudHJhbnNwb3J0X3R5cGUgPSBTT0NLX0RHUkFNOworCQlyeC0+c3J4LnRyYW5zcG9ydC5mYW1pbHkgPSByeC0+ZmFtaWx5OworCQlzd2l0Y2ggKHJ4LT5mYW1pbHkpIHsKKwkJY2FzZSBBRl9JTkVUOgorCQkJcngtPnNyeC50cmFuc3BvcnRfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfQUZfUlhSUENfSVBWNgorCQljYXNlIEFGX0lORVQ2OgorCQkJcngtPnNyeC50cmFuc3BvcnRfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FQUZOT1NVUFBPUlQ7CisJCQlnb3RvIGVycm9yX3VubG9jazsKKwkJfQogCQlsb2NhbCA9IHJ4cnBjX2xvb2t1cF9sb2NhbCgmcngtPnNyeCk7CiAJCWlmIChJU19FUlIobG9jYWwpKSB7CiAJCQlyZXQgPSBQVFJfRVJSKGxvY2FsKTsKQEAgLTUwNSwxNSArNTM2LDE2IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHJ4cnBjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCiAJCQkgICAgICAgcG9sbF90YWJsZSAqd2FpdCkKIHsKLQl1bnNpZ25lZCBpbnQgbWFzazsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzayk7CisJdW5zaWduZWQgaW50IG1hc2s7CiAKIAlzb2NrX3BvbGxfd2FpdChmaWxlLCBza19zbGVlcChzayksIHdhaXQpOwogCW1hc2sgPSAwOwogCiAJLyogdGhlIHNvY2tldCBpcyByZWFkYWJsZSBpZiB0aGVyZSBhcmUgYW55IG1lc3NhZ2VzIHdhaXRpbmcgb24gdGhlIFJ4CiAJICogcXVldWUgKi8KLQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKQorCWlmICghbGlzdF9lbXB0eSgmcngtPnJlY3Ztc2dfcSkpCiAJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKIAogCS8qIHRoZSBzb2NrZXQgaXMgd3JpdGFibGUgaWYgdGhlcmUgaXMgc3BhY2UgdG8gYWRkIG5ldyBkYXRhIHRvIHRoZQpAQCAtNTQwLDcgKzU3Miw4IEBACiAJCXJldHVybiAtRUFGTk9TVVBQT1JUOwogCiAJLyogd2Ugc3VwcG9ydCB0cmFuc3BvcnQgcHJvdG9jb2wgVURQL1VEUDYgb25seSAqLwotCWlmIChwcm90b2NvbCAhPSBQRl9JTkVUKQorCWlmIChwcm90b2NvbCAhPSBQRl9JTkVUICYmCisJICAgIElTX0VOQUJMRUQoQ09ORklHX0FGX1JYUlBDX0lQVjYpICYmIHByb3RvY29sICE9IFBGX0lORVQ2KQogCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKIAogCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfREdSQU0pCkBAIC01NTQsNiArNTg3LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisJc29ja19zZXRfZmxhZyhzaywgU09DS19SQ1VfRlJFRSk7CiAJc2stPnNrX3N0YXRlCQk9IFJYUlBDX1VOQk9VTkQ7CiAJc2stPnNrX3dyaXRlX3NwYWNlCT0gcnhycGNfd3JpdGVfc3BhY2U7CiAJc2stPnNrX21heF9hY2tfYmFja2xvZwk9IDA7CkBAIC01NjMsOSArNTk3LDExIEBACiAJcngtPmZhbWlseSA9IHByb3RvY29sOwogCXJ4LT5jYWxscyA9IFJCX1JPT1Q7CiAKLQlJTklUX0xJU1RfSEVBRCgmcngtPmxpc3Rlbl9saW5rKTsKLQlJTklUX0xJU1RfSEVBRCgmcngtPnNlY3VyZXEpOwotCUlOSVRfTElTVF9IRUFEKCZyeC0+YWNjZXB0cSk7CisJc3Bpbl9sb2NrX2luaXQoJnJ4LT5pbmNvbWluZ19sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcngtPnNvY2tfY2FsbHMpOworCUlOSVRfTElTVF9IRUFEKCZyeC0+dG9fYmVfYWNjZXB0ZWQpOworCUlOSVRfTElTVF9IRUFEKCZyeC0+cmVjdm1zZ19xKTsKKwlyd2xvY2tfaW5pdCgmcngtPnJlY3Ztc2dfbG9jayk7CiAJcndsb2NrX2luaXQoJnJ4LT5jYWxsX2xvY2spOwogCW1lbXNldCgmcngtPnNyeCwgMCwgc2l6ZW9mKHJ4LT5zcngpKTsKIApAQCAtNTc0LDYgKzYxMCwzOSBAQAogfQogCiAvKgorICogS2lsbCBhbGwgdGhlIGNhbGxzIG9uIGEgc29ja2V0IGFuZCBzaHV0IGl0IGRvd24uCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfc2h1dGRvd24oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCByeHJwY19zb2NrICpyeCA9IHJ4cnBjX3NrKHNrKTsKKwlpbnQgcmV0ID0gMDsKKworCV9lbnRlcigiJXAsJWQiLCBzaywgZmxhZ3MpOworCisJaWYgKGZsYWdzICE9IFNIVVRfUkRXUikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmIChzay0+c2tfc3RhdGUgPT0gUlhSUENfQ0xPU0UpCisJCXJldHVybiAtRVNIVVRET1dOOworCisJbG9ja19zb2NrKHNrKTsKKworCXNwaW5fbG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisJaWYgKHNrLT5za19zdGF0ZSA8IFJYUlBDX0NMT1NFKSB7CisJCXNrLT5za19zdGF0ZSA9IFJYUlBDX0NMT1NFOworCQlzay0+c2tfc2h1dGRvd24gPSBTSFVURE9XTl9NQVNLOworCX0gZWxzZSB7CisJCXJldCA9IC1FU0hVVERPV047CisJfQorCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKworCXJ4cnBjX2Rpc2NhcmRfcHJlYWxsb2MocngpOworCisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgogICogUnhSUEMgc29ja2V0IGRlc3RydWN0b3IKICAqLwogc3RhdGljIHZvaWQgcnhycGNfc29ja19kZXN0cnVjdG9yKHN0cnVjdCBzb2NrICpzaykKQEAgLTYwOSwxNSArNjc4LDE0IEBACiAJc2stPnNrX3N0YXRlID0gUlhSUENfQ0xPU0U7CiAJc3Bpbl91bmxvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOwogCi0JQVNTRVJUQ01QKHJ4LT5saXN0ZW5fbGluay5uZXh0LCAhPSwgTElTVF9QT0lTT04xKTsKLQotCWlmICghbGlzdF9lbXB0eSgmcngtPmxpc3Rlbl9saW5rKSkgewotCQl3cml0ZV9sb2NrX2JoKCZyeC0+bG9jYWwtPnNlcnZpY2VzX2xvY2spOwotCQlsaXN0X2RlbCgmcngtPmxpc3Rlbl9saW5rKTsKLQkJd3JpdGVfdW5sb2NrX2JoKCZyeC0+bG9jYWwtPnNlcnZpY2VzX2xvY2spOworCWlmIChyeC0+bG9jYWwgJiYgcngtPmxvY2FsLT5zZXJ2aWNlID09IHJ4KSB7CisJCXdyaXRlX2xvY2soJnJ4LT5sb2NhbC0+c2VydmljZXNfbG9jayk7CisJCXJ4LT5sb2NhbC0+c2VydmljZSA9IE5VTEw7CisJCXdyaXRlX3VubG9jaygmcngtPmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKIAl9CiAKIAkvKiB0cnkgdG8gZmx1c2ggb3V0IHRoaXMgc29ja2V0ICovCisJcnhycGNfZGlzY2FyZF9wcmVhbGxvYyhyeCk7CiAJcnhycGNfcmVsZWFzZV9jYWxsc19vbl9zb2NrZXQocngpOwogCWZsdXNoX3dvcmtxdWV1ZShyeHJwY193b3JrcXVldWUpOwogCXJ4cnBjX3B1cmdlX3F1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CkBAIC02NjYsNyArNzM0LDcgQEAKIAkucG9sbAkJPSByeHJwY19wb2xsLAogCS5pb2N0bAkJPSBzb2NrX25vX2lvY3RsLAogCS5saXN0ZW4JCT0gcnhycGNfbGlzdGVuLAotCS5zaHV0ZG93bgk9IHNvY2tfbm9fc2h1dGRvd24sCisJLnNodXRkb3duCT0gcnhycGNfc2h1dGRvd24sCiAJLnNldHNvY2tvcHQJPSByeHJwY19zZXRzb2Nrb3B0LAogCS5nZXRzb2Nrb3B0CT0gc29ja19ub19nZXRzb2Nrb3B0LAogCS5zZW5kbXNnCT0gcnhycGNfc2VuZG1zZywKQEAgLTY5Nyw3ICs3NjUsMTMgQEAKIAogCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHJ4cnBjX3NrYl9wcml2KSA+IEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgY2IpKTsKIAotCXJ4cnBjX2Vwb2NoID0gZ2V0X3NlY29uZHMoKTsKKwlnZXRfcmFuZG9tX2J5dGVzKCZyeHJwY19lcG9jaCwgc2l6ZW9mKHJ4cnBjX2Vwb2NoKSk7CisJcnhycGNfZXBvY2ggfD0gUlhSUENfUkFORE9NX0VQT0NIOworCWdldF9yYW5kb21fYnl0ZXMoJnJ4cnBjX2NsaWVudF9jb25uX2lkcy5jdXIsCisJCQkgc2l6ZW9mKHJ4cnBjX2NsaWVudF9jb25uX2lkcy5jdXIpKTsKKwlyeHJwY19jbGllbnRfY29ubl9pZHMuY3VyICY9IDB4M2ZmZmZmZmY7CisJaWYgKHJ4cnBjX2NsaWVudF9jb25uX2lkcy5jdXIgPT0gMCkKKwkJcnhycGNfY2xpZW50X2Nvbm5faWRzLmN1ciA9IDE7CiAKIAlyZXQgPSAtRU5PTUVNOwogCXJ4cnBjX2NhbGxfamFyID0ga21lbV9jYWNoZV9jcmVhdGUoCkBAIC03ODgsNyArODYyLDggQEAKIAlwcm90b191bnJlZ2lzdGVyKCZyeHJwY19wcm90byk7CiAJcnhycGNfZGVzdHJveV9hbGxfY2FsbHMoKTsKIAlyeHJwY19kZXN0cm95X2FsbF9jb25uZWN0aW9ucygpOwotCUFTU0VSVENNUChhdG9taWNfcmVhZCgmcnhycGNfbl9za2JzKSwgPT0sIDApOworCUFTU0VSVENNUChhdG9taWNfcmVhZCgmcnhycGNfbl90eF9za2JzKSwgPT0sIDApOworCUFTU0VSVENNUChhdG9taWNfcmVhZCgmcnhycGNfbl9yeF9za2JzKSwgPT0sIDApOwogCXJ4cnBjX2Rlc3Ryb3lfYWxsX2xvY2FscygpOwogCiAJcmVtb3ZlX3Byb2NfZW50cnkoInJ4cnBjX2Nvbm5zIiwgaW5pdF9uZXQucHJvY19uZXQpOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLWludGVybmFsLmggYi9uZXQvcnhycGMvYXItaW50ZXJuYWwuaAppbmRleCAxYmI5ZTdhLi5kMzhkZmZkIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvYXItaW50ZXJuYWwuaAorKysgYi9uZXQvcnhycGMvYXItaW50ZXJuYWwuaApAQCAtMzUsMTEgKzM1LDIzIEBACiAjZGVmaW5lIHJ4cnBjX3F1ZXVlX2RlbGF5ZWRfd29yayhXUyxEKQlcCiAJcXVldWVfZGVsYXllZF93b3JrKHJ4cnBjX3dvcmtxdWV1ZSwgKFdTKSwgKEQpKQogCi0jZGVmaW5lIHJ4cnBjX3F1ZXVlX2NhbGwoQ0FMTCkJcnhycGNfcXVldWVfd29yaygmKENBTEwpLT5wcm9jZXNzb3IpCi0KIHN0cnVjdCByeHJwY19jb25uZWN0aW9uOwogCiAvKgorICogTWFyayBhcHBsaWVkIHRvIHNvY2tldCBidWZmZXJzLgorICovCitlbnVtIHJ4cnBjX3NrYl9tYXJrIHsKKwlSWFJQQ19TS0JfTUFSS19EQVRBLAkJLyogZGF0YSBtZXNzYWdlICovCisJUlhSUENfU0tCX01BUktfRklOQUxfQUNLLAkvKiBmaW5hbCBBQ0sgcmVjZWl2ZWQgbWVzc2FnZSAqLworCVJYUlBDX1NLQl9NQVJLX0JVU1ksCQkvKiBzZXJ2ZXIgYnVzeSBtZXNzYWdlICovCisJUlhSUENfU0tCX01BUktfUkVNT1RFX0FCT1JULAkvKiByZW1vdGUgYWJvcnQgbWVzc2FnZSAqLworCVJYUlBDX1NLQl9NQVJLX0xPQ0FMX0FCT1JULAkvKiBsb2NhbCBhYm9ydCBtZXNzYWdlICovCisJUlhSUENfU0tCX01BUktfTkVUX0VSUk9SLAkvKiBuZXR3b3JrIGVycm9yIG1lc3NhZ2UgKi8KKwlSWFJQQ19TS0JfTUFSS19MT0NBTF9FUlJPUiwJLyogbG9jYWwgZXJyb3IgbWVzc2FnZSAqLworCVJYUlBDX1NLQl9NQVJLX05FV19DQUxMLAkvKiBsb2NhbCBlcnJvciBtZXNzYWdlICovCit9OworCisvKgogICogc2tfc3RhdGUgZm9yIFJ4UlBDIHNvY2tldHMKICAqLwogZW51bSB7CkBAIC01MiwxOSArNjQsNDQgQEAKIH07CiAKIC8qCisgKiBTZXJ2aWNlIGJhY2tsb2cgcHJlYWxsb2NhdGlvbi4KKyAqCisgKiBUaGlzIGNvbnRhaW5zIGNpcmN1bGFyIGJ1ZmZlcnMgb2YgcHJlYWxsb2NhdGVkIHBlZXJzLCBjb25uZWN0aW9ucyBhbmQgY2FsbHMKKyAqIGZvciBpbmNvbWluZyBzZXJ2aWNlIGNhbGxzIGFuZCB0aGVpciBoZWFkIGFuZCB0YWlsIHBvaW50ZXJzLiAgVGhpcyBhbGxvd3MKKyAqIGNhbGxzIHRvIGJlIHNldCB1cCBpbiB0aGUgZGF0YV9yZWFkeSBoYW5kbGVyLCB0aGVyZWJ5IGF2b2lkaW5nIHRoZSBuZWVkIHRvCisgKiBzaHVmZmxlIHBhY2tldHMgYXJvdW5kIHNvIG11Y2guCisgKi8KK3N0cnVjdCByeHJwY19iYWNrbG9nIHsKKwl1bnNpZ25lZCBzaG9ydAkJcGVlcl9iYWNrbG9nX2hlYWQ7CisJdW5zaWduZWQgc2hvcnQJCXBlZXJfYmFja2xvZ190YWlsOworCXVuc2lnbmVkIHNob3J0CQljb25uX2JhY2tsb2dfaGVhZDsKKwl1bnNpZ25lZCBzaG9ydAkJY29ubl9iYWNrbG9nX3RhaWw7CisJdW5zaWduZWQgc2hvcnQJCWNhbGxfYmFja2xvZ19oZWFkOworCXVuc2lnbmVkIHNob3J0CQljYWxsX2JhY2tsb2dfdGFpbDsKKyNkZWZpbmUgUlhSUENfQkFDS0xPR19NQVgJMzIKKwlzdHJ1Y3QgcnhycGNfcGVlcgkqcGVlcl9iYWNrbG9nW1JYUlBDX0JBQ0tMT0dfTUFYXTsKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbgkqY29ubl9iYWNrbG9nW1JYUlBDX0JBQ0tMT0dfTUFYXTsKKwlzdHJ1Y3QgcnhycGNfY2FsbAkqY2FsbF9iYWNrbG9nW1JYUlBDX0JBQ0tMT0dfTUFYXTsKK307CisKKy8qCiAgKiBSeFJQQyBzb2NrZXQgZGVmaW5pdGlvbgogICovCiBzdHJ1Y3QgcnhycGNfc29jayB7CiAJLyogV0FSTklORzogc2sgaGFzIHRvIGJlIHRoZSBmaXJzdCBtZW1iZXIgKi8KIAlzdHJ1Y3Qgc29jawkJc2s7Ci0JcnhycGNfaW50ZXJjZXB0b3JfdAlpbnRlcmNlcHRvcjsJLyoga2VybmVsIHNlcnZpY2UgUnggaW50ZXJjZXB0b3IgZnVuY3Rpb24gKi8KKwlyeHJwY19ub3RpZnlfbmV3X2NhbGxfdAlub3RpZnlfbmV3X2NhbGw7IC8qIEZ1bmMgdG8gbm90aWZ5IG9mIG5ldyBjYWxsICovCisJcnhycGNfZGlzY2FyZF9uZXdfY2FsbF90IGRpc2NhcmRfbmV3X2NhbGw7IC8qIEZ1bmMgdG8gZGlzY2FyZCBhIG5ldyBjYWxsICovCiAJc3RydWN0IHJ4cnBjX2xvY2FsCSpsb2NhbDsJCS8qIGxvY2FsIGVuZHBvaW50ICovCi0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0ZW5fbGluazsJLyogbGluayBpbiB0aGUgbG9jYWwgZW5kcG9pbnQncyBsaXN0ZW4gbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJc2VjdXJlcTsJLyogY2FsbHMgYXdhaXRpbmcgY29ubmVjdGlvbiBzZWN1cml0eSBjbGVhcmFuY2UgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWFjY2VwdHE7CS8qIGNhbGxzIGF3YWl0aW5nIGFjY2VwdGFuY2UgKi8KKwlzdHJ1Y3QgcnhycGNfYmFja2xvZwkqYmFja2xvZzsJLyogUHJlYWxsb2NhdGlvbiBmb3Igc2VydmljZXMgKi8KKwlzcGlubG9ja190CQlpbmNvbWluZ19sb2NrOwkvKiBJbmNvbWluZyBjYWxsIHZzIHNlcnZpY2Ugc2h1dGRvd24gbG9jayAqLworCXN0cnVjdCBsaXN0X2hlYWQJc29ja19jYWxsczsJLyogTGlzdCBvZiBjYWxscyBvd25lZCBieSB0aGlzIHNvY2tldCAqLworCXN0cnVjdCBsaXN0X2hlYWQJdG9fYmVfYWNjZXB0ZWQ7CS8qIGNhbGxzIGF3YWl0aW5nIGFjY2VwdGFuY2UgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXJlY3Ztc2dfcTsJLyogQ2FsbHMgYXdhaXRpbmcgcmVjdm1zZydzIGF0dGVudGlvbiAgKi8KKwlyd2xvY2tfdAkJcmVjdm1zZ19sb2NrOwkvKiBMb2NrIGZvciByZWN2bXNnX3EgKi8KIAlzdHJ1Y3Qga2V5CQkqa2V5OwkJLyogc2VjdXJpdHkgZm9yIHRoaXMgc29ja2V0ICovCiAJc3RydWN0IGtleQkJKnNlY3VyaXRpZXM7CS8qIGxpc3Qgb2Ygc2VydmVyIHNlY3VyaXR5IGRlc2NyaXB0b3JzICovCi0Jc3RydWN0IHJiX3Jvb3QJCWNhbGxzOwkJLyogb3V0c3RhbmRpbmcgY2FsbHMgb24gdGhpcyBzb2NrZXQgKi8KKwlzdHJ1Y3QgcmJfcm9vdAkJY2FsbHM7CQkvKiBVc2VyIElEIC0+IGNhbGwgbWFwcGluZyAqLwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogI2RlZmluZSBSWFJQQ19TT0NLX0NPTk5FQ1RFRAkJMAkvKiBjb25uZWN0X3NyeCBpcyBzZXQgKi8KIAlyd2xvY2tfdAkJY2FsbF9sb2NrOwkvKiBsb2NrIGZvciBjYWxscyAqLwpAQCAtMTAzLDEzICsxNDAsMTEgQEAKICAqIC0gbWF4IDQ4IGJ5dGVzIChzdHJ1Y3Qgc2tfYnVmZjo6Y2IpCiAgKi8KIHN0cnVjdCByeHJwY19za2JfcHJpdiB7Ci0Jc3RydWN0IHJ4cnBjX2NhbGwJKmNhbGw7CQkvKiBjYWxsIHdpdGggd2hpY2ggYXNzb2NpYXRlZCAqLwotCXVuc2lnbmVkIGxvbmcJCXJlc2VuZF9hdDsJLyogdGltZSBpbiBqaWZmaWVzIGF0IHdoaWNoIHRvIHJlc2VuZCAqLwogCXVuaW9uIHsKLQkJdW5zaWduZWQgaW50CW9mZnNldDsJCS8qIG9mZnNldCBpbnRvIGJ1ZmZlciBvZiBuZXh0IHJlYWQgKi8KKwkJdTgJCW5yX2p1bWJvOwkvKiBOdW1iZXIgb2YganVtYm8gc3VicGFja2V0cyAqLworCX07CisJdW5pb24gewogCQlpbnQJCXJlbWFpbjsJCS8qIGFtb3VudCBvZiBzcGFjZSByZW1haW5pbmcgZm9yIG5leHQgd3JpdGUgKi8KLQkJdTMyCQllcnJvcjsJCS8qIG5ldHdvcmsgZXJyb3IgY29kZSAqLwotCQlib29sCQluZWVkX3Jlc2VuZDsJLyogVCBpZiBuZWVkcyByZXNlbmRpbmcgKi8KIAl9OwogCiAJc3RydWN0IHJ4cnBjX2hvc3RfaGVhZGVyIGhkcjsJCS8qIFJ4UlBDIHBhY2tldCBoZWFkZXIgZnJvbSB0aGlzIHBhY2tldCAqLwpAQCAtMTE3LDEzICsxNTIsNiBAQAogCiAjZGVmaW5lIHJ4cnBjX3NrYihfX3NrYikgKChzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKikgJihfX3NrYiktPmNiKQogCi1lbnVtIHJ4cnBjX2NvbW1hbmQgewotCVJYUlBDX0NNRF9TRU5EX0RBVEEsCQkvKiBzZW5kIGRhdGEgbWVzc2FnZSAqLwotCVJYUlBDX0NNRF9TRU5EX0FCT1JULAkJLyogcmVxdWVzdCBhYm9ydCBnZW5lcmF0aW9uICovCi0JUlhSUENfQ01EX0FDQ0VQVCwJCS8qIFtzZXJ2ZXJdIGFjY2VwdCBpbmNvbWluZyBjYWxsICovCi0JUlhSUENfQ01EX1JFSkVDVF9CVVNZLAkJLyogW3NlcnZlcl0gcmVqZWN0IGEgY2FsbCBhcyBidXN5ICovCi19OwotCiAvKgogICogUnhSUEMgc2VjdXJpdHkgbW9kdWxlIGludGVyZmFjZQogICovCkBAIC0xNTAsNyArMTc4LDEyIEBACiAJCQkgICAgIHZvaWQgKik7CiAKIAkvKiB2ZXJpZnkgdGhlIHNlY3VyaXR5IG9uIGEgcmVjZWl2ZWQgcGFja2V0ICovCi0JaW50ICgqdmVyaWZ5X3BhY2tldCkoc3RydWN0IHJ4cnBjX2NhbGwgKiwgc3RydWN0IHNrX2J1ZmYgKiwgdTMyICopOworCWludCAoKnZlcmlmeV9wYWNrZXQpKHN0cnVjdCByeHJwY19jYWxsICosIHN0cnVjdCBza19idWZmICosCisJCQkgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCByeHJwY19zZXFfdCwgdTE2KTsKKworCS8qIExvY2F0ZSB0aGUgZGF0YSBpbiBhIHJlY2VpdmVkIHBhY2tldCB0aGF0IGhhcyBiZWVuIHZlcmlmaWVkLiAqLworCXZvaWQgKCpsb2NhdGVfZGF0YSkoc3RydWN0IHJ4cnBjX2NhbGwgKiwgc3RydWN0IHNrX2J1ZmYgKiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgaW50ICopOwogCiAJLyogaXNzdWUgYSBjaGFsbGVuZ2UgKi8KIAlpbnQgKCppc3N1ZV9jaGFsbGVuZ2UpKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOwpAQCAtMTgwLDkgKzIxMyw4IEBACiAJc3RydWN0IGxpc3RfaGVhZAlsaW5rOwogCXN0cnVjdCBzb2NrZXQJCSpzb2NrZXQ7CS8qIG15IFVEUCBzb2NrZXQgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcHJvY2Vzc29yOwotCXN0cnVjdCBsaXN0X2hlYWQJc2VydmljZXM7CS8qIHNlcnZpY2VzIGxpc3RlbmluZyBvbiB0aGlzIGVuZHBvaW50ICovCisJc3RydWN0IHJ4cnBjX3NvY2sgX19yY3UJKnNlcnZpY2U7CS8qIFNlcnZpY2UocykgbGlzdGVuaW5nIG9uIHRoaXMgZW5kcG9pbnQgKi8KIAlzdHJ1Y3Qgcndfc2VtYXBob3JlCWRlZnJhZ19zZW07CS8qIGNvbnRyb2wgcmUtZW5hYmxlbWVudCBvZiBJUCBERiBiaXQgKi8KLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCWFjY2VwdF9xdWV1ZTsJLyogaW5jb21pbmcgY2FsbHMgYXdhaXRpbmcgYWNjZXB0YW5jZSAqLwogCXN0cnVjdCBza19idWZmX2hlYWQJcmVqZWN0X3F1ZXVlOwkvKiBwYWNrZXRzIGF3YWl0aW5nIHJlamVjdGlvbiAqLwogCXN0cnVjdCBza19idWZmX2hlYWQJZXZlbnRfcXVldWU7CS8qIGVuZHBvaW50IGV2ZW50IHBhY2tldHMgYXdhaXRpbmcgcHJvY2Vzc2luZyAqLwogCXN0cnVjdCByYl9yb290CQljbGllbnRfY29ubnM7CS8qIENsaWVudCBjb25uZWN0aW9ucyBieSBzb2NrZXQgcGFyYW1zICovCkBAIC0yMjAsMTAgKzI1MiwxMiBAQAogCiAJLyogY2FsY3VsYXRlZCBSVFQgY2FjaGUgKi8KICNkZWZpbmUgUlhSUENfUlRUX0NBQ0hFX1NJWkUgMzIKLQlzdXNlY29uZHNfdAkJcnR0OwkJLyogY3VycmVudCBSVFQgZXN0aW1hdGUgKGluIHVTKSAqLwotCXVuc2lnbmVkIGludAkJcnR0X3BvaW50OwkvKiBuZXh0IGVudHJ5IGF0IHdoaWNoIHRvIGluc2VydCAqLwotCXVuc2lnbmVkIGludAkJcnR0X3VzYWdlOwkvKiBhbW91bnQgb2YgY2FjaGUgYWN0dWFsbHkgdXNlZCAqLwotCXN1c2Vjb25kc190CQlydHRfY2FjaGVbUlhSUENfUlRUX0NBQ0hFX1NJWkVdOyAvKiBjYWxjdWxhdGVkIFJUVCBjYWNoZSAqLworCWt0aW1lX3QJCQlydHRfbGFzdF9yZXE7CS8qIFRpbWUgb2YgbGFzdCBSVFQgcmVxdWVzdCAqLworCXU2NAkJCXJ0dDsJCS8qIEN1cnJlbnQgUlRUIGVzdGltYXRlIChpbiBuUykgKi8KKwl1NjQJCQlydHRfc3VtOwkvKiBTdW0gb2YgY2FjaGUgY29udGVudHMgKi8KKwl1NjQJCQlydHRfY2FjaGVbUlhSUENfUlRUX0NBQ0hFX1NJWkVdOyAvKiBEZXRlcm1pbmVkIFJUVCBjYWNoZSAqLworCXU4CQkJcnR0X2N1cnNvcjsJLyogbmV4dCBlbnRyeSBhdCB3aGljaCB0byBpbnNlcnQgKi8KKwl1OAkJCXJ0dF91c2FnZTsJLyogYW1vdW50IG9mIGNhY2hlIGFjdHVhbGx5IHVzZWQgKi8KIH07CiAKIC8qCkBAIC0yNTUsNiArMjg5LDkgQEAKIAlSWFJQQ19DT05OX0hBU19JRFIsCQkvKiBIYXMgYSBjbGllbnQgY29ubiBJRCBhc3NpZ25lZCAqLwogCVJYUlBDX0NPTk5fSU5fU0VSVklDRV9DT05OUywJLyogQ29ubiBpcyBpbiBwZWVyLT5zZXJ2aWNlX2Nvbm5zICovCiAJUlhSUENfQ09OTl9JTl9DTElFTlRfQ09OTlMsCS8qIENvbm4gaXMgaW4gbG9jYWwtPmNsaWVudF9jb25ucyAqLworCVJYUlBDX0NPTk5fRVhQT1NFRCwJCS8qIENvbm4gaGFzIGV4dHJhIHJlZiBmb3IgZXhwb3N1cmUgKi8KKwlSWFJQQ19DT05OX0RPTlRfUkVVU0UsCQkvKiBEb24ndCByZXVzZSB0aGlzIGNvbm5lY3Rpb24gKi8KKwlSWFJQQ19DT05OX0NPVU5URUQsCQkvKiBDb3VudGVkIGJ5IHJ4cnBjX25yX2NsaWVudF9jb25ucyAqLwogfTsKIAogLyoKQEAgLTI2NSwxNyArMzAyLDI5IEBACiB9OwogCiAvKgorICogVGhlIGNvbm5lY3Rpb24gY2FjaGUgc3RhdGUuCisgKi8KK2VudW0gcnhycGNfY29ubl9jYWNoZV9zdGF0ZSB7CisJUlhSUENfQ09OTl9DTElFTlRfSU5BQ1RJVkUsCS8qIENvbm4gaXMgbm90IHlldCBsaXN0ZWQgKi8KKwlSWFJQQ19DT05OX0NMSUVOVF9XQUlUSU5HLAkvKiBDb25uIGlzIG9uIHdhaXQgbGlzdCwgd2FpdGluZyBmb3IgY2FwYWNpdHkgKi8KKwlSWFJQQ19DT05OX0NMSUVOVF9BQ1RJVkUsCS8qIENvbm4gaXMgb24gYWN0aXZlIGxpc3QsIGRvaW5nIGNhbGxzICovCisJUlhSUENfQ09OTl9DTElFTlRfQ1VMTEVELAkvKiBDb25uIGlzIGN1bGxlZCBhbmQgZGVsaXN0ZWQsIGRvaW5nIGNhbGxzICovCisJUlhSUENfQ09OTl9DTElFTlRfSURMRSwJCS8qIENvbm4gaXMgb24gaWRsZSBsaXN0LCBkb2luZyBtb3N0bHkgbm90aGluZyAqLworCVJYUlBDX0NPTk5fX05SX0NBQ0hFX1NUQVRFUworfTsKKworLyoKICAqIFRoZSBjb25uZWN0aW9uIHByb3RvY29sIHN0YXRlLgogICovCiBlbnVtIHJ4cnBjX2Nvbm5fcHJvdG9fc3RhdGUgewogCVJYUlBDX0NPTk5fVU5VU0VELAkJLyogQ29ubmVjdGlvbiBub3QgeWV0IGF0dGVtcHRlZCAqLwogCVJYUlBDX0NPTk5fQ0xJRU5ULAkJLyogQ2xpZW50IGNvbm5lY3Rpb24gKi8KKwlSWFJQQ19DT05OX1NFUlZJQ0VfUFJFQUxMT0MsCS8qIFNlcnZpY2UgY29ubmVjdGlvbiBwcmVhbGxvY2F0aW9uICovCiAJUlhSUENfQ09OTl9TRVJWSUNFX1VOU0VDVVJFRCwJLyogU2VydmljZSB1bnNlY3VyZWQgY29ubmVjdGlvbiAqLwogCVJYUlBDX0NPTk5fU0VSVklDRV9DSEFMTEVOR0lORywJLyogU2VydmljZSBjaGFsbGVuZ2luZyBmb3Igc2VjdXJpdHkgKi8KIAlSWFJQQ19DT05OX1NFUlZJQ0UsCQkvKiBTZXJ2aWNlIHNlY3VyZWQgY29ubmVjdGlvbiAqLwogCVJYUlBDX0NPTk5fUkVNT1RFTFlfQUJPUlRFRCwJLyogQ29ubiBhYm9ydGVkIGJ5IHBlZXIgKi8KIAlSWFJQQ19DT05OX0xPQ0FMTFlfQUJPUlRFRCwJLyogQ29ubiBhYm9ydGVkIGxvY2FsbHkgKi8KLQlSWFJQQ19DT05OX05FVFdPUktfRVJST1IsCS8qIENvbm4gdGVybWluYXRlZCBieSBuZXR3b3JrIGVycm9yICovCiAJUlhSUENfQ09OTl9fTlJfU1RBVEVTCiB9OwogCkBAIC0yODgsMjMgKzMzNywzMyBAQAogCXN0cnVjdCByeHJwY19jb25uX3Byb3RvCXByb3RvOwogCXN0cnVjdCByeHJwY19jb25uX3BhcmFtZXRlcnMgcGFyYW1zOwogCi0Jc3BpbmxvY2tfdAkJY2hhbm5lbF9sb2NrOworCWF0b21pY190CQl1c2FnZTsKKwlzdHJ1Y3QgcmN1X2hlYWQJCXJjdTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWNhY2hlX2xpbms7CiAKKwlzcGlubG9ja190CQljaGFubmVsX2xvY2s7CisJdW5zaWduZWQgY2hhcgkJYWN0aXZlX2NoYW5zOwkvKiBNYXNrIG9mIGFjdGl2ZSBjaGFubmVscyAqLworI2RlZmluZSBSWFJQQ19BQ1RJVkVfQ0hBTlNfTUFTSwkoKDEgPDwgUlhSUENfTUFYQ0FMTFMpIC0gMSkKKwlzdHJ1Y3QgbGlzdF9oZWFkCXdhaXRpbmdfY2FsbHM7CS8qIENhbGxzIHdhaXRpbmcgZm9yIGNoYW5uZWxzICovCiAJc3RydWN0IHJ4cnBjX2NoYW5uZWwgewogCQlzdHJ1Y3QgcnhycGNfY2FsbCBfX3JjdQkqY2FsbDsJCS8qIEFjdGl2ZSBjYWxsICovCiAJCXUzMgkJCWNhbGxfaWQ7CS8qIElEIG9mIGN1cnJlbnQgY2FsbCAqLwogCQl1MzIJCQljYWxsX2NvdW50ZXI7CS8qIENhbGwgSUQgY291bnRlciAqLwogCQl1MzIJCQlsYXN0X2NhbGw7CS8qIElEIG9mIGxhc3QgY2FsbCAqLwotCQl1MzIJCQlsYXN0X3Jlc3VsdDsJLyogUmVzdWx0IG9mIGxhc3QgY2FsbCAoMC9hYm9ydCkgKi8KKwkJdTgJCQlsYXN0X3R5cGU7CS8qIFR5cGUgb2YgbGFzdCBwYWNrZXQgKi8KKwkJdTE2CQkJbGFzdF9zZXJ2aWNlX2lkOworCQl1bmlvbiB7CisJCQl1MzIJCWxhc3Rfc2VxOworCQkJdTMyCQlsYXN0X2Fib3J0OworCQl9OwogCX0gY2hhbm5lbHNbUlhSUENfTUFYQ0FMTFNdOwotCXdhaXRfcXVldWVfaGVhZF90CWNoYW5uZWxfd3E7CS8qIHF1ZXVlIHRvIHdhaXQgZm9yIGNoYW5uZWwgdG8gYmVjb21lIGF2YWlsYWJsZSAqLwogCi0Jc3RydWN0IHJjdV9oZWFkCQlyY3U7CiAJc3RydWN0IHdvcmtfc3RydWN0CXByb2Nlc3NvcjsJLyogY29ubmVjdGlvbiBldmVudCBwcm9jZXNzb3IgKi8KIAl1bmlvbiB7CiAJCXN0cnVjdCByYl9ub2RlCWNsaWVudF9ub2RlOwkvKiBOb2RlIGluIGxvY2FsLT5jbGllbnRfY29ubnMgKi8KIAkJc3RydWN0IHJiX25vZGUJc2VydmljZV9ub2RlOwkvKiBOb2RlIGluIHBlZXItPnNlcnZpY2VfY29ubnMgKi8KIAl9OworCXN0cnVjdCBsaXN0X2hlYWQJcHJvY19saW5rOwkvKiBsaW5rIGluIHByb2NmcyBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGluayBpbiBtYXN0ZXIgY29ubmVjdGlvbiBsaXN0ICovCiAJc3RydWN0IHNrX2J1ZmZfaGVhZAlyeF9xdWV1ZTsJLyogcmVjZWl2ZWQgY29ubi1sZXZlbCBwYWNrZXRzICovCiAJY29uc3Qgc3RydWN0IHJ4cnBjX3NlY3VyaXR5ICpzZWN1cml0eTsJLyogYXBwbGllZCBzZWN1cml0eSBtb2R1bGUgKi8KQEAgLTMxMywyMSArMzcyLDE4IEBACiAJc3RydWN0IHJ4cnBjX2NyeXB0CWNzdW1faXY7CS8qIHBhY2tldCBjaGVja3N1bSBiYXNlICovCiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJdW5zaWduZWQgbG9uZwkJZXZlbnRzOwotCXVuc2lnbmVkIGxvbmcJCXB1dF90aW1lOwkvKiBUaW1lIGF0IHdoaWNoIGxhc3QgcHV0ICovCisJdW5zaWduZWQgbG9uZwkJaWRsZV90aW1lc3RhbXA7CS8qIFRpbWUgYXQgd2hpY2ggbGFzdCBiZWNhbWUgaWRsZSAqLwogCXNwaW5sb2NrX3QJCXN0YXRlX2xvY2s7CS8qIHN0YXRlLWNoYW5nZSBsb2NrICovCi0JYXRvbWljX3QJCXVzYWdlOwotCWVudW0gcnhycGNfY29ubl9wcm90b19zdGF0ZSBzdGF0ZSA6IDg7CS8qIGN1cnJlbnQgc3RhdGUgb2YgY29ubmVjdGlvbiAqLworCWVudW0gcnhycGNfY29ubl9jYWNoZV9zdGF0ZSBjYWNoZV9zdGF0ZTsKKwllbnVtIHJ4cnBjX2Nvbm5fcHJvdG9fc3RhdGUgc3RhdGU7CS8qIGN1cnJlbnQgc3RhdGUgb2YgY29ubmVjdGlvbiAqLwogCXUzMgkJCWxvY2FsX2Fib3J0OwkvKiBsb2NhbCBhYm9ydCBjb2RlICovCiAJdTMyCQkJcmVtb3RlX2Fib3J0OwkvKiByZW1vdGUgYWJvcnQgY29kZSAqLwotCWludAkJCWVycm9yOwkJLyogbG9jYWwgZXJyb3IgaW5jdXJyZWQgKi8KIAlpbnQJCQlkZWJ1Z19pZDsJLyogZGVidWcgSUQgZm9yIHByaW50a3MgKi8KIAlhdG9taWNfdAkJc2VyaWFsOwkJLyogcGFja2V0IHNlcmlhbCBudW1iZXIgY291bnRlciAqLwotCWF0b21pY190CQloaV9zZXJpYWw7CS8qIGhpZ2hlc3Qgc2VyaWFsIG51bWJlciByZWNlaXZlZCAqLwotCWF0b21pY190CQlhdmFpbF9jaGFuczsJLyogbnVtYmVyIG9mIGNoYW5uZWxzIGF2YWlsYWJsZSAqLwotCXU4CQkJc2l6ZV9hbGlnbjsJLyogZGF0YSBzaXplIGFsaWdubWVudCAoZm9yIHNlY3VyaXR5KSAqLwotCXU4CQkJaGVhZGVyX3NpemU7CS8qIHJ4cnBjICsgc2VjdXJpdHkgaGVhZGVyIHNpemUgKi8KLQl1OAkJCXNlY3VyaXR5X3NpemU7CS8qIHNlY3VyaXR5IGhlYWRlciBzaXplICovCisJdW5zaWduZWQgaW50CQloaV9zZXJpYWw7CS8qIGhpZ2hlc3Qgc2VyaWFsIG51bWJlciByZWNlaXZlZCAqLwogCXUzMgkJCXNlY3VyaXR5X25vbmNlOwkvKiByZXNwb25zZSByZS11c2UgcHJldmVudGVyICovCisJdTgJCQlzaXplX2FsaWduOwkvKiBkYXRhIHNpemUgYWxpZ25tZW50IChmb3Igc2VjdXJpdHkpICovCisJdTgJCQlzZWN1cml0eV9zaXplOwkvKiBzZWN1cml0eSBoZWFkZXIgc2l6ZSAqLwogCXU4CQkJc2VjdXJpdHlfaXg7CS8qIHNlY3VyaXR5IHR5cGUgKi8KIAl1OAkJCW91dF9jbGllbnRmbGFnOwkvKiBSWFJQQ19DTElFTlRfSU5JVElBVEVEIGlmIHdlIGFyZSBjbGllbnQgKi8KIH07CkBAIC0zMzcsMzcgKzM5MywyMyBAQAogICovCiBlbnVtIHJ4cnBjX2NhbGxfZmxhZyB7CiAJUlhSUENfQ0FMTF9SRUxFQVNFRCwJCS8qIGNhbGwgaGFzIGJlZW4gcmVsZWFzZWQgLSBubyBtb3JlIG1lc3NhZ2UgdG8gdXNlcnNwYWNlICovCi0JUlhSUENfQ0FMTF9URVJNSU5BTF9NU0csCS8qIGNhbGwgaGFzIGdpdmVuIHRoZSBzb2NrZXQgaXRzIGZpbmFsIG1lc3NhZ2UgKi8KLQlSWFJQQ19DQUxMX1JDVkRfTEFTVCwJCS8qIGFsbCBwYWNrZXRzIHJlY2VpdmVkICovCi0JUlhSUENfQ0FMTF9SVU5fUlRJTUVSLAkJLyogVHggcmVzZW5kIHRpbWVyIHN0YXJ0ZWQgKi8KLQlSWFJQQ19DQUxMX1RYX1NPRlRfQUNLLAkJLyogc2VudCBzb21lIHNvZnQgQUNLcyAqLwotCVJYUlBDX0NBTExfUFJPQ19CVVNZLAkJLyogdGhlIHByb2Nlc3NvciBpcyBidXN5ICovCi0JUlhSUENfQ0FMTF9JTklUX0FDQ0VQVCwJCS8qIGFjY2VwdGFuY2Ugd2FzIGluaXRpYXRlZCAqLwogCVJYUlBDX0NBTExfSEFTX1VTRVJJRCwJCS8qIGhhcyBhIHVzZXIgSUQgYXR0YWNoZWQgKi8KLQlSWFJQQ19DQUxMX0VYUEVDVF9PT1MsCQkvKiBleHBlY3Qgb3V0IG9mIHNlcXVlbmNlIHBhY2tldHMgKi8KKwlSWFJQQ19DQUxMX0lTX1NFUlZJQ0UsCQkvKiBDYWxsIGlzIHNlcnZpY2UgY2FsbCAqLworCVJYUlBDX0NBTExfRVhQT1NFRCwJCS8qIFRoZSBjYWxsIHdhcyBleHBvc2VkIHRvIHRoZSB3b3JsZCAqLworCVJYUlBDX0NBTExfUlhfTEFTVCwJCS8qIFJlY2VpdmVkIHRoZSBsYXN0IHBhY2tldCAoYXQgcnh0eF90b3ApICovCisJUlhSUENfQ0FMTF9UWF9MQVNULAkJLyogTGFzdCBwYWNrZXQgaW4gVHggYnVmZmVyIChhdCByeHR4X3RvcCkgKi8KKwlSWFJQQ19DQUxMX1BJTkdJTkcsCQkvKiBQaW5nIGluIHByb2Nlc3MgKi8KKwlSWFJQQ19DQUxMX1JFVFJBTlNfVElNRU9VVCwJLyogUmV0cmFuc21pc3Npb24gZHVlIHRvIHRpbWVvdXQgb2NjdXJyZWQgKi8KIH07CiAKIC8qCiAgKiBFdmVudHMgdGhhdCBjYW4gYmUgcmFpc2VkIG9uIGEgY2FsbC4KICAqLwogZW51bSByeHJwY19jYWxsX2V2ZW50IHsKLQlSWFJQQ19DQUxMX0VWX1JDVkRfQUNLQUxMLAkvKiBBQ0tBTEwgb3IgcmVwbHkgcmVjZWl2ZWQgKi8KLQlSWFJQQ19DQUxMX0VWX1JDVkRfQlVTWSwJLyogYnVzeSBwYWNrZXQgcmVjZWl2ZWQgKi8KLQlSWFJQQ19DQUxMX0VWX1JDVkRfQUJPUlQsCS8qIGFib3J0IHBhY2tldCByZWNlaXZlZCAqLwotCVJYUlBDX0NBTExfRVZfUkNWRF9FUlJPUiwJLyogbmV0d29yayBlcnJvciByZWNlaXZlZCAqLwotCVJYUlBDX0NBTExfRVZfQUNLX0ZJTkFMLAkvKiBuZWVkIHRvIGdlbmVyYXRlIGZpbmFsIEFDSyAoYW5kIHJlbGVhc2UgY2FsbCkgKi8KIAlSWFJQQ19DQUxMX0VWX0FDSywJCS8qIG5lZWQgdG8gZ2VuZXJhdGUgQUNLICovCi0JUlhSUENfQ0FMTF9FVl9SRUpFQ1RfQlVTWSwJLyogbmVlZCB0byBnZW5lcmF0ZSBidXN5IG1lc3NhZ2UgKi8KIAlSWFJQQ19DQUxMX0VWX0FCT1JULAkJLyogbmVlZCB0byBnZW5lcmF0ZSBhYm9ydCAqLwotCVJYUlBDX0NBTExfRVZfQ09OTl9BQk9SVCwJLyogbG9jYWwgY29ubmVjdGlvbiBhYm9ydCBnZW5lcmF0ZWQgKi8KLQlSWFJQQ19DQUxMX0VWX1JFU0VORF9USU1FUiwJLyogVHggcmVzZW5kIHRpbWVyIGV4cGlyZWQgKi8KKwlSWFJQQ19DQUxMX0VWX1RJTUVSLAkJLyogVGltZXIgZXhwaXJlZCAqLwogCVJYUlBDX0NBTExfRVZfUkVTRU5ELAkJLyogVHggcmVzZW5kIHJlcXVpcmVkICovCi0JUlhSUENfQ0FMTF9FVl9EUkFJTl9SWF9PT1MsCS8qIGRyYWluIHRoZSBSeCBvdXQgb2Ygc2VxdWVuY2UgcXVldWUgKi8KLQlSWFJQQ19DQUxMX0VWX0xJRkVfVElNRVIsCS8qIGNhbGwncyBsaWZldGltZXIgcmFuIG91dCAqLwotCVJYUlBDX0NBTExfRVZfQUNDRVBURUQsCQkvKiBpbmNvbWluZyBjYWxsIGFjY2VwdGVkIGJ5IHVzZXJzcGFjZSBhcHAgKi8KLQlSWFJQQ19DQUxMX0VWX1NFQ1VSRUQsCQkvKiBpbmNvbWluZyBjYWxsJ3MgY29ubmVjdGlvbiBpcyBub3cgc2VjdXJlICovCi0JUlhSUENfQ0FMTF9FVl9QT1NUX0FDQ0VQVCwJLyogbmVlZCB0byBwb3N0IGFuICJhY2NlcHQ/IiBtZXNzYWdlIHRvIHRoZSBhcHAgKi8KLQlSWFJQQ19DQUxMX0VWX1JFTEVBU0UsCQkvKiBuZWVkIHRvIHJlbGVhc2UgdGhlIGNhbGwncyByZXNvdXJjZXMgKi8KIH07CiAKIC8qCkBAIC0zNzksMjAgKzQyMSwzOCBAQAogCVJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVCwJLyogLSBjbGllbnQgc2VuZGluZyByZXF1ZXN0IHBoYXNlICovCiAJUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFksCS8qIC0gY2xpZW50IGF3YWl0aW5nIHJlcGx5ICovCiAJUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWSwJLyogLSBjbGllbnQgcmVjZWl2aW5nIHJlcGx5IHBoYXNlICovCi0JUlhSUENfQ0FMTF9DTElFTlRfRklOQUxfQUNLLAkvKiAtIGNsaWVudCBzZW5kaW5nIGZpbmFsIEFDSyBwaGFzZSAqLworCVJYUlBDX0NBTExfU0VSVkVSX1BSRUFMTE9DLAkvKiAtIHNlcnZpY2UgcHJlYWxsb2NhdGlvbiAqLwogCVJYUlBDX0NBTExfU0VSVkVSX1NFQ1VSSU5HLAkvKiAtIHNlcnZlciBzZWN1cmluZyByZXF1ZXN0IGNvbm5lY3Rpb24gKi8KIAlSWFJQQ19DQUxMX1NFUlZFUl9BQ0NFUFRJTkcsCS8qIC0gc2VydmVyIGFjY2VwdGluZyByZXF1ZXN0ICovCiAJUlhSUENfQ0FMTF9TRVJWRVJfUkVDVl9SRVFVRVNULAkvKiAtIHNlcnZlciByZWNlaXZpbmcgcmVxdWVzdCAqLwogCVJYUlBDX0NBTExfU0VSVkVSX0FDS19SRVFVRVNULAkvKiAtIHNlcnZlciBwZW5kaW5nIEFDSyBvZiByZXF1ZXN0ICovCiAJUlhSUENfQ0FMTF9TRVJWRVJfU0VORF9SRVBMWSwJLyogLSBzZXJ2ZXIgc2VuZGluZyByZXBseSAqLwogCVJYUlBDX0NBTExfU0VSVkVSX0FXQUlUX0FDSywJLyogLSBzZXJ2ZXIgYXdhaXRpbmcgZmluYWwgQUNLICovCi0JUlhSUENfQ0FMTF9DT01QTEVURSwJCS8qIC0gY2FsbCBjb21wbGV0ZWQgKi8KLQlSWFJQQ19DQUxMX1NFUlZFUl9CVVNZLAkJLyogLSBjYWxsIHJlamVjdGVkIGJ5IGJ1c3kgc2VydmVyICovCisJUlhSUENfQ0FMTF9DT01QTEVURSwJCS8qIC0gY2FsbCBjb21wbGV0ZSAqLworCU5SX19SWFJQQ19DQUxMX1NUQVRFUworfTsKKworLyoKKyAqIENhbGwgY29tcGxldGlvbiBjb25kaXRpb24gKHN0YXRlID09IFJYUlBDX0NBTExfQ09NUExFVEUpLgorICovCitlbnVtIHJ4cnBjX2NhbGxfY29tcGxldGlvbiB7CisJUlhSUENfQ0FMTF9TVUNDRUVERUQsCQkvKiAtIE5vcm1hbCB0ZXJtaW5hdGlvbiAqLwogCVJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRCwJLyogLSBjYWxsIGFib3J0ZWQgYnkgcGVlciAqLwogCVJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVELAkvKiAtIGNhbGwgYWJvcnRlZCBsb2NhbGx5IG9uIGVycm9yIG9yIGNsb3NlICovCisJUlhSUENfQ0FMTF9MT0NBTF9FUlJPUiwJCS8qIC0gY2FsbCBmYWlsZWQgZHVlIHRvIGxvY2FsIGVycm9yICovCiAJUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SLAkvKiAtIGNhbGwgdGVybWluYXRlZCBieSBuZXR3b3JrIGVycm9yICovCi0JUlhSUENfQ0FMTF9ERUFELAkJLyogLSBjYWxsIGlzIGRlYWQgKi8KLQlOUl9fUlhSUENfQ0FMTF9TVEFURVMKKwlOUl9fUlhSUENfQ0FMTF9DT01QTEVUSU9OUworfTsKKworLyoKKyAqIENhbGwgVHggY29uZ2VzdGlvbiBtYW5hZ2VtZW50IG1vZGVzLgorICovCitlbnVtIHJ4cnBjX2Nvbmdlc3RfbW9kZSB7CisJUlhSUENfQ0FMTF9TTE9XX1NUQVJULAorCVJYUlBDX0NBTExfQ09OR0VTVF9BVk9JREFOQ0UsCisJUlhSUENfQ0FMTF9QQUNLRVRfTE9TUywKKwlSWFJQQ19DQUxMX0ZBU1RfUkVUUkFOU01JVCwKKwlOUl9fUlhSUENfQ09OR0VTVF9NT0RFUwogfTsKIAogLyoKQEAgLTQwMiw5MSArNDYyLDMyOSBAQAogc3RydWN0IHJ4cnBjX2NhbGwgewogCXN0cnVjdCByY3VfaGVhZAkJcmN1OwogCXN0cnVjdCByeHJwY19jb25uZWN0aW9uCSpjb25uOwkJLyogY29ubmVjdGlvbiBjYXJyeWluZyBjYWxsICovCi0Jc3RydWN0IHJ4cnBjX3NvY2sJKnNvY2tldDsJLyogc29ja2V0IHJlc3BvbnNpYmxlICovCi0Jc3RydWN0IHRpbWVyX2xpc3QJbGlmZXRpbWVyOwkvKiBsaWZldGltZSByZW1haW5pbmcgb24gY2FsbCAqLwotCXN0cnVjdCB0aW1lcl9saXN0CWRlYWRzcGFuOwkvKiByZWFwIHRpbWVyIGZvciByZS1BQ0snaW5nLCBldGMgICovCi0Jc3RydWN0IHRpbWVyX2xpc3QJYWNrX3RpbWVyOwkvKiBBQ0sgZ2VuZXJhdGlvbiB0aW1lciAqLwotCXN0cnVjdCB0aW1lcl9saXN0CXJlc2VuZF90aW1lcjsJLyogVHggcmVzZW5kIHRpbWVyICovCi0Jc3RydWN0IHdvcmtfc3RydWN0CWRlc3Ryb3llcjsJLyogY2FsbCBkZXN0cm95ZXIgKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcHJvY2Vzc29yOwkvKiBwYWNrZXQgcHJvY2Vzc29yIGFuZCBBQ0sgZ2VuZXJhdG9yICovCisJc3RydWN0IHJ4cnBjX3BlZXIJKnBlZXI7CQkvKiBQZWVyIHJlY29yZCBmb3IgcmVtb3RlIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgcnhycGNfc29jayBfX3JjdQkqc29ja2V0OwkvKiBzb2NrZXQgcmVzcG9uc2libGUgKi8KKwlrdGltZV90CQkJYWNrX2F0OwkJLyogV2hlbiBkZWZlcnJlZCBBQ0sgbmVlZHMgdG8gaGFwcGVuICovCisJa3RpbWVfdAkJCXJlc2VuZF9hdDsJLyogV2hlbiBuZXh0IHJlc2VuZCBuZWVkcyB0byBoYXBwZW4gKi8KKwlrdGltZV90CQkJZXhwaXJlX2F0OwkvKiBXaGVuIHRoZSBjYWxsIHRpbWVzIG91dCAqLworCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOwkJLyogQ29tYmluZWQgZXZlbnQgdGltZXIgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcHJvY2Vzc29yOwkvKiBFdmVudCBwcm9jZXNzb3IgKi8KKwlyeHJwY19ub3RpZnlfcnhfdAlub3RpZnlfcng7CS8qIGtlcm5lbCBzZXJ2aWNlIFJ4IG5vdGlmaWNhdGlvbiBmdW5jdGlvbiAqLwogCXN0cnVjdCBsaXN0X2hlYWQJbGluazsJCS8qIGxpbmsgaW4gbWFzdGVyIGNhbGwgbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQJY2hhbl93YWl0X2xpbms7CS8qIExpbmsgaW4gY29ubi0+d2FpdGluZ19jYWxscyAqLwogCXN0cnVjdCBobGlzdF9ub2RlCWVycm9yX2xpbms7CS8qIGxpbmsgaW4gZXJyb3IgZGlzdHJpYnV0aW9uIGxpc3QgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWFjY2VwdF9saW5rOwkvKiBjYWxscyBhd2FpdGluZyBhY2NlcHRhbmNlICovCi0Jc3RydWN0IHJiX25vZGUJCXNvY2tfbm9kZTsJLyogbm9kZSBpbiBzb2NrZXQgY2FsbCB0cmVlICovCi0Jc3RydWN0IHNrX2J1ZmZfaGVhZAlyeF9xdWV1ZTsJLyogcmVjZWl2ZWQgcGFja2V0cyAqLwotCXN0cnVjdCBza19idWZmX2hlYWQJcnhfb29zX3F1ZXVlOwkvKiBwYWNrZXRzIHJlY2VpdmVkIG91dCBvZiBzZXF1ZW5jZSAqLworCXN0cnVjdCBsaXN0X2hlYWQJYWNjZXB0X2xpbms7CS8qIExpbmsgaW4gcngtPmFjY2VwdHEgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXJlY3Ztc2dfbGluazsJLyogTGluayBpbiByeC0+cmVjdm1zZ19xICovCisJc3RydWN0IGxpc3RfaGVhZAlzb2NrX2xpbms7CS8qIExpbmsgaW4gcngtPnNvY2tfY2FsbHMgKi8KKwlzdHJ1Y3QgcmJfbm9kZQkJc29ja19ub2RlOwkvKiBOb2RlIGluIHJ4LT5jYWxscyAqLwogCXN0cnVjdCBza19idWZmCQkqdHhfcGVuZGluZzsJLyogVHggc29ja2V0IGJ1ZmZlciBiZWluZyBmaWxsZWQgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdAl0eF93YWl0cTsJLyogd2FpdCBmb3IgVHggd2luZG93IHNwYWNlIHRvIGJlY29tZSBhdmFpbGFibGUgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0cTsJCS8qIFdhaXQgcXVldWUgZm9yIGNoYW5uZWwgb3IgVHggKi8KIAlfX2JlMzIJCQljcnlwdG9fYnVmWzJdOwkvKiBUZW1wb3JhcnkgcGFja2V0IGNyeXB0byBidWZmZXIgKi8KIAl1bnNpZ25lZCBsb25nCQl1c2VyX2NhbGxfSUQ7CS8qIHVzZXItZGVmaW5lZCBjYWxsIElEICovCi0JdW5zaWduZWQgbG9uZwkJY3JlYXRpb25famlmOwkvKiB0aW1lIG9mIGNhbGwgY3JlYXRpb24gKi8KIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAl1bnNpZ25lZCBsb25nCQlldmVudHM7CiAJc3BpbmxvY2tfdAkJbG9jazsKIAlyd2xvY2tfdAkJc3RhdGVfbG9jazsJLyogbG9jayBmb3Igc3RhdGUgdHJhbnNpdGlvbiAqLwotCWF0b21pY190CQl1c2FnZTsKLQlhdG9taWNfdAkJc2VxdWVuY2U7CS8qIFR4IGRhdGEgcGFja2V0IHNlcXVlbmNlIGNvdW50ZXIgKi8KLQl1MzIJCQlsb2NhbF9hYm9ydDsJLyogbG9jYWwgYWJvcnQgY29kZSAqLwotCXUzMgkJCXJlbW90ZV9hYm9ydDsJLyogcmVtb3RlIGFib3J0IGNvZGUgKi8KLQlpbnQJCQllcnJvcl9yZXBvcnQ7CS8qIE5ldHdvcmsgZXJyb3IgKElDTVAvbG9jYWwgdHJhbnNwb3J0KSAqLworCXUzMgkJCWFib3J0X2NvZGU7CS8qIExvY2FsL3JlbW90ZSBhYm9ydCBjb2RlICovCiAJaW50CQkJZXJyb3I7CQkvKiBMb2NhbCBlcnJvciBpbmN1cnJlZCAqLwotCWVudW0gcnhycGNfY2FsbF9zdGF0ZQlzdGF0ZSA6IDg7CS8qIGN1cnJlbnQgc3RhdGUgb2YgY2FsbCAqLwotCWludAkJCWRlYnVnX2lkOwkvKiBkZWJ1ZyBJRCBmb3IgcHJpbnRrcyAqLwotCXU4CQkJY2hhbm5lbDsJLyogY29ubmVjdGlvbiBjaGFubmVsIG9jY3VwaWVkIGJ5IHRoaXMgY2FsbCAqLwotCi0JLyogdHJhbnNtaXNzaW9uLXBoYXNlIEFDSyBtYW5hZ2VtZW50ICovCi0JdTgJCQlhY2tzX2hlYWQ7CS8qIG9mZnNldCBpbnRvIHdpbmRvdyBvZiBmaXJzdCBlbnRyeSAqLwotCXU4CQkJYWNrc190YWlsOwkvKiBvZmZzZXQgaW50byB3aW5kb3cgb2YgbGFzdCBlbnRyeSAqLwotCXU4CQkJYWNrc193aW5zejsJLyogc2l6ZSBvZiB1bi1BQ0snZCB3aW5kb3cgKi8KLQl1OAkJCWFja3NfdW5hY2tlZDsJLyogbG93ZXN0IHVuYWNrZWQgcGFja2V0IGluIGxhc3QgQUNLIHJlY2VpdmVkICovCi0JaW50CQkJYWNrc19sYXRlc3Q7CS8qIHNlcmlhbCBudW1iZXIgb2YgbGF0ZXN0IEFDSyByZWNlaXZlZCAqLwotCXJ4cnBjX3NlcV90CQlhY2tzX2hhcmQ7CS8qIGhpZ2hlc3QgZGVmaW5pdGl2ZWx5IEFDSydkIG1zZyBzZXEgKi8KLQl1bnNpZ25lZCBsb25nCQkqYWNrc193aW5kb3c7CS8qIHNlbnQgcGFja2V0IHdpbmRvdwotCQkJCQkJICogLSBlbGVtZW50cyBhcmUgcG9pbnRlcnMgd2l0aCBMU0Igc2V0IGlmIEFDSydkCi0JCQkJCQkgKi8KLQotCS8qIHJlY2VpdmUtcGhhc2UgQUNLIG1hbmFnZW1lbnQgKi8KLQlyeHJwY19zZXFfdAkJcnhfZGF0YV9leHBlY3Q7CS8qIG5leHQgZGF0YSBzZXEgSUQgZXhwZWN0ZWQgdG8gYmUgcmVjZWl2ZWQgKi8KLQlyeHJwY19zZXFfdAkJcnhfZGF0YV9wb3N0OwkvKiBuZXh0IGRhdGEgc2VxIElEIGV4cGVjdGVkIHRvIGJlIHBvc3RlZCAqLwotCXJ4cnBjX3NlcV90CQlyeF9kYXRhX3JlY3Y7CS8qIGxhc3QgZGF0YSBzZXEgSUQgZW5jb3VudGVyZWQgYnkgcmVjdm1zZyAqLwotCXJ4cnBjX3NlcV90CQlyeF9kYXRhX2VhdGVuOwkvKiBsYXN0IGRhdGEgc2VxIElEIGNvbnN1bWVkIGJ5IHJlY3Ztc2cgKi8KLQlyeHJwY19zZXFfdAkJcnhfZmlyc3Rfb29zOwkvKiBmaXJzdCBwYWNrZXQgaW4gcnhfb29zX3F1ZXVlIChvciAwKSAqLwotCXJ4cnBjX3NlcV90CQlhY2tyX3dpbl90b3A7CS8qIHRvcCBvZiBBQ0sgd2luZG93IChyeF9kYXRhX2VhdGVuIGlzIGJvdHRvbSkgKi8KLQlyeHJwY19zZXFfdAkJYWNrcl9wcmV2X3NlcTsJLyogcHJldmlvdXMgc2VxdWVuY2UgbnVtYmVyIHJlY2VpdmVkICovCi0JdTgJCQlhY2tyX3JlYXNvbjsJLyogcmVhc29uIHRvIEFDSyAqLwotCXJ4cnBjX3NlcmlhbF90CQlhY2tyX3NlcmlhbDsJLyogc2VyaWFsIG9mIHBhY2tldCBiZWluZyBBQ0snZCAqLwotCWF0b21pY190CQlhY2tyX25vdF9pZGxlOwkvKiBudW1iZXIgb2YgcGFja2V0cyBpbiBSeCBxdWV1ZSAqLwotCi0JLyogcmVjZWl2ZWQgcGFja2V0IHJlY29yZHMsIDEgYml0IHBlciByZWNvcmQgKi8KLSNkZWZpbmUgUlhSUENfQUNLUl9XSU5ET1dfQVNaIERJVl9ST1VORF9VUChSWFJQQ19NQVhBQ0tTLCBCSVRTX1BFUl9MT05HKQotCXVuc2lnbmVkIGxvbmcJCWFja3Jfd2luZG93W1JYUlBDX0FDS1JfV0lORE9XX0FTWiArIDFdOwotCi0JdTgJCQlpbl9jbGllbnRmbGFnOwkvKiBDb3B5IG9mIGNvbm4tPmluX2NsaWVudGZsYWcgKi8KLQlzdHJ1Y3QgcnhycGNfbG9jYWwJKmxvY2FsOwkJLyogTG9jYWwgZW5kcG9pbnQuICovCisJZW51bSByeHJwY19jYWxsX3N0YXRlCXN0YXRlOwkJLyogY3VycmVudCBzdGF0ZSBvZiBjYWxsICovCisJZW51bSByeHJwY19jYWxsX2NvbXBsZXRpb24gY29tcGxldGlvbjsJLyogQ2FsbCBjb21wbGV0aW9uIGNvbmRpdGlvbiAqLworCWF0b21pY190CQl1c2FnZTsKKwl1MTYJCQlzZXJ2aWNlX2lkOwkvKiBzZXJ2aWNlIElEICovCisJdTgJCQlzZWN1cml0eV9peDsJLyogU2VjdXJpdHkgdHlwZSAqLwogCXUzMgkJCWNhbGxfaWQ7CS8qIGNhbGwgSUQgb24gY29ubmVjdGlvbiAgKi8KIAl1MzIJCQljaWQ7CQkvKiBjb25uZWN0aW9uIElEIHBsdXMgY2hhbm5lbCBpbmRleCAqLwotCXUzMgkJCWVwb2NoOwkJLyogZXBvY2ggb2YgdGhpcyBjb25uZWN0aW9uICovCi0JdTE2CQkJc2VydmljZV9pZDsJLyogc2VydmljZSBJRCAqLworCWludAkJCWRlYnVnX2lkOwkvKiBkZWJ1ZyBJRCBmb3IgcHJpbnRrcyAqLworCXVuc2lnbmVkIHNob3J0CQlyeF9wa3Rfb2Zmc2V0OwkvKiBDdXJyZW50IHJlY3Ztc2cgcGFja2V0IG9mZnNldCAqLworCXVuc2lnbmVkIHNob3J0CQlyeF9wa3RfbGVuOwkvKiBDdXJyZW50IHJlY3Ztc2cgcGFja2V0IGxlbiAqLworCisJLyogUngvVHggY2lyY3VsYXIgYnVmZmVyLCBkZXBlbmRpbmcgb24gcGhhc2UuCisJICoKKwkgKiBJbiB0aGUgUnggcGhhc2UsIHBhY2tldHMgYXJlIGFubm90YXRlZCB3aXRoIDAgb3IgdGhlIG51bWJlciBvZiB0aGUKKwkgKiBzZWdtZW50IG9mIGEganVtYm8gcGFja2V0IGVhY2ggYnVmZmVyIHJlZmVycyB0by4gIFRoZXJlIGNhbiBiZSB1cCB0bworCSAqIDQ3IHNlZ21lbnRzIGluIGEgbWF4aW11bS1zaXplIFVEUCBwYWNrZXQuCisJICoKKwkgKiBJbiB0aGUgVHggcGhhc2UsIHBhY2tldHMgYXJlIGFubm90YXRlZCB3aXRoIHdoaWNoIGJ1ZmZlcnMgaGF2ZSBiZWVuCisJICogYWNrZWQuCisJICovCisjZGVmaW5lIFJYUlBDX1JYVFhfQlVGRl9TSVpFCTY0CisjZGVmaW5lIFJYUlBDX1JYVFhfQlVGRl9NQVNLCShSWFJQQ19SWFRYX0JVRkZfU0laRSAtIDEpCisjZGVmaW5lIFJYUlBDX0lOSVRfUlhfV0lORE9XX1NJWkUgMzIKKwlzdHJ1Y3Qgc2tfYnVmZgkJKipyeHR4X2J1ZmZlcjsKKwl1OAkJCSpyeHR4X2Fubm90YXRpb25zOworI2RlZmluZSBSWFJQQ19UWF9BTk5PX0FDSwkwCisjZGVmaW5lIFJYUlBDX1RYX0FOTk9fVU5BQ0sJMQorI2RlZmluZSBSWFJQQ19UWF9BTk5PX05BSwkyCisjZGVmaW5lIFJYUlBDX1RYX0FOTk9fUkVUUkFOUwkzCisjZGVmaW5lIFJYUlBDX1RYX0FOTk9fTUFTSwkweDAzCisjZGVmaW5lIFJYUlBDX1RYX0FOTk9fTEFTVAkweDA0CisjZGVmaW5lIFJYUlBDX1RYX0FOTk9fUkVTRU5UCTB4MDgKKworI2RlZmluZSBSWFJQQ19SWF9BTk5PX0pVTUJPCTB4M2YJCS8qIEp1bWJvIHN1YnBhY2tldCBudW1iZXIgKyAxIGlmIG5vdCB6ZXJvICovCisjZGVmaW5lIFJYUlBDX1JYX0FOTk9fSkxBU1QJMHg0MAkJLyogU2V0IGlmIGxhc3QgZWxlbWVudCBvZiBhIGp1bWJvIHBhY2tldCAqLworI2RlZmluZSBSWFJQQ19SWF9BTk5PX1ZFUklGSUVECTB4ODAJCS8qIFNldCBpZiB2ZXJpZmllZCBhbmQgZGVjcnlwdGVkICovCisJcnhycGNfc2VxX3QJCXR4X2hhcmRfYWNrOwkvKiBEZWFkIHNsb3QgaW4gYnVmZmVyOyB0aGUgZmlyc3QgdHJhbnNtaXR0ZWQgYnV0CisJCQkJCQkgKiBub3QgaGFyZC1BQ0snZCBwYWNrZXQgZm9sbG93cyB0aGlzLgorCQkJCQkJICovCisJcnhycGNfc2VxX3QJCXR4X3RvcDsJCS8qIEhpZ2hlc3QgVHggc2xvdCBhbGxvY2F0ZWQuICovCisKKwkvKiBUQ1Atc3R5bGUgc2xvdy1zdGFydCBjb25nZXN0aW9uIGNvbnRyb2wgW1JGQzU2ODFdLiAgU2luY2UgdGhlIFNNU1MKKwkgKiBpcyBmaXhlZCwgd2Uga2VlcCB0aGVzZSBudW1iZXJzIGluIHRlcm1zIG9mIHNlZ21lbnRzIChpZS4gREFUQQorCSAqIHBhY2tldHMpIHJhdGhlciB0aGFuIGJ5dGVzLgorCSAqLworI2RlZmluZSBSWFJQQ19UWF9TTVNTCQlSWFJQQ19KVU1CT19EQVRBTEVOCisJdTgJCQljb25nX2N3bmQ7CS8qIENvbmdlc3Rpb24gd2luZG93IHNpemUgKi8KKwl1OAkJCWNvbmdfZXh0cmE7CS8qIEV4dHJhIHRvIHNlbmQgZm9yIGNvbmdlc3Rpb24gbWFuYWdlbWVudCAqLworCXU4CQkJY29uZ19zc3RocmVzaDsJLyogU2xvdy1zdGFydCB0aHJlc2hvbGQgKi8KKwllbnVtIHJ4cnBjX2Nvbmdlc3RfbW9kZQljb25nX21vZGU6ODsJLyogQ29uZ2VzdGlvbiBtYW5hZ2VtZW50IG1vZGUgKi8KKwl1OAkJCWNvbmdfZHVwX2Fja3M7CS8qIENvdW50IG9mIEFDS3Mgc2hvd2luZyBtaXNzaW5nIHBhY2tldHMgKi8KKwl1OAkJCWNvbmdfY3VtdWxfYWNrczsgLyogQ3VtdWxhdGl2ZSBBQ0sgY291bnQgKi8KKwlrdGltZV90CQkJY29uZ190c3RhbXA7CS8qIExhc3QgdGltZSBjd25kIHdhcyBjaGFuZ2VkICovCisKKwlyeHJwY19zZXFfdAkJcnhfaGFyZF9hY2s7CS8qIERlYWQgc2xvdCBpbiBidWZmZXI7IHRoZSBmaXJzdCByZWNlaXZlZCBidXQgbm90CisJCQkJCQkgKiBjb25zdW1lZCBwYWNrZXQgZm9sbG93cyB0aGlzLgorCQkJCQkJICovCisJcnhycGNfc2VxX3QJCXJ4X3RvcDsJCS8qIEhpZ2hlc3QgUnggc2xvdCBhbGxvY2F0ZWQuICovCisJcnhycGNfc2VxX3QJCXJ4X2V4cGVjdF9uZXh0OwkvKiBFeHBlY3RlZCBuZXh0IHBhY2tldCBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1OAkJCXJ4X3dpbnNpemU7CS8qIFNpemUgb2YgUnggd2luZG93ICovCisJdTgJCQl0eF93aW5zaXplOwkvKiBNYXhpbXVtIHNpemUgb2YgVHggd2luZG93ICovCisJYm9vbAkJCXR4X3BoYXNlOwkvKiBUIGlmIHRyYW5zbWlzc2lvbiBwaGFzZSwgRiBpZiByZWNlaXZlIHBoYXNlICovCisJdTgJCQlucl9qdW1ib19iYWQ7CS8qIE51bWJlciBvZiBqdW1ibyBkdXBzL2V4Y2VlZHMtd2luZG93cyAqLworCisJLyogcmVjZWl2ZS1waGFzZSBBQ0sgbWFuYWdlbWVudCAqLworCXU4CQkJYWNrcl9yZWFzb247CS8qIHJlYXNvbiB0byBBQ0sgKi8KKwl1MTYJCQlhY2tyX3NrZXc7CS8qIHNrZXcgb24gcGFja2V0IGJlaW5nIEFDSydkICovCisJcnhycGNfc2VyaWFsX3QJCWFja3Jfc2VyaWFsOwkvKiBzZXJpYWwgb2YgcGFja2V0IGJlaW5nIEFDSydkICovCisJcnhycGNfc2VxX3QJCWFja3JfcHJldl9zZXE7CS8qIHByZXZpb3VzIHNlcXVlbmNlIG51bWJlciByZWNlaXZlZCAqLworCXJ4cnBjX3NlcV90CQlhY2tyX2NvbnN1bWVkOwkvKiBIaWdoZXN0IHBhY2tldCBzaG93biBjb25zdW1lZCAqLworCXJ4cnBjX3NlcV90CQlhY2tyX3NlZW47CS8qIEhpZ2hlc3QgcGFja2V0IHNob3duIHNlZW4gKi8KKwlyeHJwY19zZXJpYWxfdAkJYWNrcl9waW5nOwkvKiBMYXN0IHBpbmcgc2VudCAqLworCWt0aW1lX3QJCQlhY2tyX3BpbmdfdGltZTsJLyogVGltZSBsYXN0IHBpbmcgc2VudCAqLworCisJLyogdHJhbnNtaXNzaW9uLXBoYXNlIEFDSyBtYW5hZ2VtZW50ICovCisJa3RpbWVfdAkJCWFja3NfbGF0ZXN0X3RzOwkvKiBUaW1lc3RhbXAgb2YgbGF0ZXN0IEFDSyByZWNlaXZlZCAqLworCXJ4cnBjX3NlcmlhbF90CQlhY2tzX2xhdGVzdDsJLyogc2VyaWFsIG51bWJlciBvZiBsYXRlc3QgQUNLIHJlY2VpdmVkICovCisJcnhycGNfc2VxX3QJCWFja3NfbG93ZXN0X25hazsgLyogTG93ZXN0IE5BQ0sgaW4gdGhlIGJ1ZmZlciAob3IgPT10eF9oYXJkX2FjaykgKi8KIH07CiAKIC8qCi0gKiBsb2NhbGx5IGFib3J0IGFuIFJ4UlBDIGNhbGwKKyAqIFN1bW1hcnkgb2YgYSBuZXcgQUNLIGFuZCB0aGUgY2hhbmdlcyBpdCBtYWRlIHRvIHRoZSBUeCBidWZmZXIgcGFja2V0IHN0YXRlcy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIHJ4cnBjX2Fib3J0X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHUzMiBhYm9ydF9jb2RlKQotewotCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKLQkJY2FsbC0+bG9jYWxfYWJvcnQgPSBhYm9ydF9jb2RlOwotCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOwotCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCX0KLQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotfQorc3RydWN0IHJ4cnBjX2Fja19zdW1tYXJ5IHsKKwl1OAkJCWFja19yZWFzb247CisJdTgJCQlucl9hY2tzOwkJLyogTnVtYmVyIG9mIEFDS3MgaW4gcGFja2V0ICovCisJdTgJCQlucl9uYWNrczsJCS8qIE51bWJlciBvZiBOQUNLcyBpbiBwYWNrZXQgKi8KKwl1OAkJCW5yX25ld19hY2tzOwkJLyogTnVtYmVyIG9mIG5ldyBBQ0tzIGluIHBhY2tldCAqLworCXU4CQkJbnJfbmV3X25hY2tzOwkJLyogTnVtYmVyIG9mIG5ldyBOQUNLcyBpbiBwYWNrZXQgKi8KKwl1OAkJCW5yX3JvdF9uZXdfYWNrczsJLyogTnVtYmVyIG9mIHJvdGF0ZWQgbmV3IEFDS3MgKi8KKwlib29sCQkJbmV3X2xvd19uYWNrOwkJLyogVCBpZiBuZXcgbG93IE5BQ0sgZm91bmQgKi8KKwlib29sCQkJcmV0cmFuc190aW1lbzsJCS8qIFQgaWYgcmVUeCBkdWUgdG8gdGltZW91dCBoYXBwZW5lZCAqLworCXU4CQkJZmxpZ2h0X3NpemU7CQkvKiBOdW1iZXIgb2YgdW5yZWNlaXZlZCB0cmFuc21pc3Npb25zICovCisJLyogUGxhY2UgdG8gc3Rhc2ggdmFsdWVzIGZvciB0cmFjaW5nICovCisJZW51bSByeHJwY19jb25nZXN0X21vZGUJbW9kZTo4OworCXU4CQkJY3duZDsKKwl1OAkJCXNzdGhyZXNoOworCXU4CQkJZHVwX2Fja3M7CisJdTgJCQljdW11bGF0aXZlX2Fja3M7Cit9OworCitlbnVtIHJ4cnBjX3NrYl90cmFjZSB7CisJcnhycGNfc2tiX3J4X2NsZWFuZWQsCisJcnhycGNfc2tiX3J4X2ZyZWVkLAorCXJ4cnBjX3NrYl9yeF9nb3QsCisJcnhycGNfc2tiX3J4X2xvc3QsCisJcnhycGNfc2tiX3J4X3JlY2VpdmVkLAorCXJ4cnBjX3NrYl9yeF9yb3RhdGVkLAorCXJ4cnBjX3NrYl9yeF9wdXJnZWQsCisJcnhycGNfc2tiX3J4X3NlZW4sCisJcnhycGNfc2tiX3R4X2NsZWFuZWQsCisJcnhycGNfc2tiX3R4X2ZyZWVkLAorCXJ4cnBjX3NrYl90eF9nb3QsCisJcnhycGNfc2tiX3R4X25ldywKKwlyeHJwY19za2JfdHhfcm90YXRlZCwKKwlyeHJwY19za2JfdHhfc2VlbiwKKwlyeHJwY19za2JfX25yX3RyYWNlCit9OworCitleHRlcm4gY29uc3QgY2hhciByeHJwY19za2JfdHJhY2VzW3J4cnBjX3NrYl9fbnJfdHJhY2VdWzddOworCitlbnVtIHJ4cnBjX2Nvbm5fdHJhY2UgeworCXJ4cnBjX2Nvbm5fbmV3X2NsaWVudCwKKwlyeHJwY19jb25uX25ld19zZXJ2aWNlLAorCXJ4cnBjX2Nvbm5fcXVldWVkLAorCXJ4cnBjX2Nvbm5fc2VlbiwKKwlyeHJwY19jb25uX2dvdCwKKwlyeHJwY19jb25uX3B1dF9jbGllbnQsCisJcnhycGNfY29ubl9wdXRfc2VydmljZSwKKwlyeHJwY19jb25uX19ucl90cmFjZQorfTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcnhycGNfY29ubl90cmFjZXNbcnhycGNfY29ubl9fbnJfdHJhY2VdWzRdOworCitlbnVtIHJ4cnBjX2NsaWVudF90cmFjZSB7CisJcnhycGNfY2xpZW50X2FjdGl2YXRlX2NoYW5zLAorCXJ4cnBjX2NsaWVudF9hbGxvYywKKwlyeHJwY19jbGllbnRfY2hhbl9hY3RpdmF0ZSwKKwlyeHJwY19jbGllbnRfY2hhbl9kaXNjb25uZWN0LAorCXJ4cnBjX2NsaWVudF9jaGFuX3Bhc3MsCisJcnhycGNfY2xpZW50X2NoYW5fdW5zdGFydGVkLAorCXJ4cnBjX2NsaWVudF9jbGVhbnVwLAorCXJ4cnBjX2NsaWVudF9jb3VudCwKKwlyeHJwY19jbGllbnRfZGlzY2FyZCwKKwlyeHJwY19jbGllbnRfZHVwbGljYXRlLAorCXJ4cnBjX2NsaWVudF9leHBvc2VkLAorCXJ4cnBjX2NsaWVudF9yZXBsYWNlLAorCXJ4cnBjX2NsaWVudF90b19hY3RpdmUsCisJcnhycGNfY2xpZW50X3RvX2N1bGxlZCwKKwlyeHJwY19jbGllbnRfdG9faWRsZSwKKwlyeHJwY19jbGllbnRfdG9faW5hY3RpdmUsCisJcnhycGNfY2xpZW50X3RvX3dhaXRpbmcsCisJcnhycGNfY2xpZW50X3VuY291bnQsCisJcnhycGNfY2xpZW50X19ucl90cmFjZQorfTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcnhycGNfY2xpZW50X3RyYWNlc1tyeHJwY19jbGllbnRfX25yX3RyYWNlXVs3XTsKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX2Nvbm5fY2FjaGVfc3RhdGVzW1JYUlBDX0NPTk5fX05SX0NBQ0hFX1NUQVRFU11bNV07CisKK2VudW0gcnhycGNfY2FsbF90cmFjZSB7CisJcnhycGNfY2FsbF9uZXdfY2xpZW50LAorCXJ4cnBjX2NhbGxfbmV3X3NlcnZpY2UsCisJcnhycGNfY2FsbF9xdWV1ZWQsCisJcnhycGNfY2FsbF9xdWV1ZWRfcmVmLAorCXJ4cnBjX2NhbGxfc2VlbiwKKwlyeHJwY19jYWxsX2Nvbm5lY3RlZCwKKwlyeHJwY19jYWxsX3JlbGVhc2UsCisJcnhycGNfY2FsbF9nb3QsCisJcnhycGNfY2FsbF9nb3RfdXNlcmlkLAorCXJ4cnBjX2NhbGxfZ290X2tlcm5lbCwKKwlyeHJwY19jYWxsX3B1dCwKKwlyeHJwY19jYWxsX3B1dF91c2VyaWQsCisJcnhycGNfY2FsbF9wdXRfa2VybmVsLAorCXJ4cnBjX2NhbGxfcHV0X25vcXVldWUsCisJcnhycGNfY2FsbF9lcnJvciwKKwlyeHJwY19jYWxsX19ucl90cmFjZQorfTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcnhycGNfY2FsbF90cmFjZXNbcnhycGNfY2FsbF9fbnJfdHJhY2VdWzRdOworCitlbnVtIHJ4cnBjX3RyYW5zbWl0X3RyYWNlIHsKKwlyeHJwY190cmFuc21pdF93YWl0LAorCXJ4cnBjX3RyYW5zbWl0X3F1ZXVlLAorCXJ4cnBjX3RyYW5zbWl0X3F1ZXVlX2xhc3QsCisJcnhycGNfdHJhbnNtaXRfcm90YXRlLAorCXJ4cnBjX3RyYW5zbWl0X3JvdGF0ZV9sYXN0LAorCXJ4cnBjX3RyYW5zbWl0X2F3YWl0X3JlcGx5LAorCXJ4cnBjX3RyYW5zbWl0X2VuZCwKKwlyeHJwY190cmFuc21pdF9fbnJfdHJhY2UKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX3RyYW5zbWl0X3RyYWNlc1tyeHJwY190cmFuc21pdF9fbnJfdHJhY2VdWzRdOworCitlbnVtIHJ4cnBjX3JlY2VpdmVfdHJhY2UgeworCXJ4cnBjX3JlY2VpdmVfaW5jb21pbmcsCisJcnhycGNfcmVjZWl2ZV9xdWV1ZSwKKwlyeHJwY19yZWNlaXZlX3F1ZXVlX2xhc3QsCisJcnhycGNfcmVjZWl2ZV9mcm9udCwKKwlyeHJwY19yZWNlaXZlX3JvdGF0ZSwKKwlyeHJwY19yZWNlaXZlX2VuZCwKKwlyeHJwY19yZWNlaXZlX19ucl90cmFjZQorfTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcnhycGNfcmVjZWl2ZV90cmFjZXNbcnhycGNfcmVjZWl2ZV9fbnJfdHJhY2VdWzRdOworCitlbnVtIHJ4cnBjX3JlY3Ztc2dfdHJhY2UgeworCXJ4cnBjX3JlY3Ztc2dfZW50ZXIsCisJcnhycGNfcmVjdm1zZ193YWl0LAorCXJ4cnBjX3JlY3Ztc2dfZGVxdWV1ZSwKKwlyeHJwY19yZWN2bXNnX2hvbGUsCisJcnhycGNfcmVjdm1zZ19uZXh0LAorCXJ4cnBjX3JlY3Ztc2dfY29udCwKKwlyeHJwY19yZWN2bXNnX2Z1bGwsCisJcnhycGNfcmVjdm1zZ19kYXRhX3JldHVybiwKKwlyeHJwY19yZWN2bXNnX3Rlcm1pbmFsLAorCXJ4cnBjX3JlY3Ztc2dfdG9fYmVfYWNjZXB0ZWQsCisJcnhycGNfcmVjdm1zZ19yZXR1cm4sCisJcnhycGNfcmVjdm1zZ19fbnJfdHJhY2UKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX3JlY3Ztc2dfdHJhY2VzW3J4cnBjX3JlY3Ztc2dfX25yX3RyYWNlXVs1XTsKKworZW51bSByeHJwY19ydHRfdHhfdHJhY2UgeworCXJ4cnBjX3J0dF90eF9waW5nLAorCXJ4cnBjX3J0dF90eF9kYXRhLAorCXJ4cnBjX3J0dF90eF9fbnJfdHJhY2UKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX3J0dF90eF90cmFjZXNbcnhycGNfcnR0X3R4X19ucl90cmFjZV1bNV07CisKK2VudW0gcnhycGNfcnR0X3J4X3RyYWNlIHsKKwlyeHJwY19ydHRfcnhfcGluZ19yZXNwb25zZSwKKwlyeHJwY19ydHRfcnhfcmVxdWVzdGVkX2FjaywKKwlyeHJwY19ydHRfcnhfX25yX3RyYWNlCit9OworCitleHRlcm4gY29uc3QgY2hhciByeHJwY19ydHRfcnhfdHJhY2VzW3J4cnBjX3J0dF9yeF9fbnJfdHJhY2VdWzVdOworCitlbnVtIHJ4cnBjX3RpbWVyX3RyYWNlIHsKKwlyeHJwY190aW1lcl9iZWdpbiwKKwlyeHJwY190aW1lcl9pbml0X2Zvcl9yZXBseSwKKwlyeHJwY190aW1lcl9leHBpcmVkLAorCXJ4cnBjX3RpbWVyX3NldF9mb3JfYWNrLAorCXJ4cnBjX3RpbWVyX3NldF9mb3JfcmVzZW5kLAorCXJ4cnBjX3RpbWVyX3NldF9mb3Jfc2VuZCwKKwlyeHJwY190aW1lcl9fbnJfdHJhY2UKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX3RpbWVyX3RyYWNlc1tyeHJwY190aW1lcl9fbnJfdHJhY2VdWzhdOworCitlbnVtIHJ4cnBjX3Byb3Bvc2VfYWNrX3RyYWNlIHsKKwlyeHJwY19wcm9wb3NlX2Fja19jbGllbnRfdHhfZW5kLAorCXJ4cnBjX3Byb3Bvc2VfYWNrX2lucHV0X2RhdGEsCisJcnhycGNfcHJvcG9zZV9hY2tfcGluZ19mb3JfbG9zdF9hY2ssCisJcnhycGNfcHJvcG9zZV9hY2tfcGluZ19mb3JfbG9zdF9yZXBseSwKKwlyeHJwY19wcm9wb3NlX2Fja19waW5nX2Zvcl9wYXJhbXMsCisJcnhycGNfcHJvcG9zZV9hY2tfcmVzcG9uZF90b19hY2ssCisJcnhycGNfcHJvcG9zZV9hY2tfcmVzcG9uZF90b19waW5nLAorCXJ4cnBjX3Byb3Bvc2VfYWNrX3JldHJ5X3R4LAorCXJ4cnBjX3Byb3Bvc2VfYWNrX3JvdGF0ZV9yeCwKKwlyeHJwY19wcm9wb3NlX2Fja190ZXJtaW5hbF9hY2ssCisJcnhycGNfcHJvcG9zZV9hY2tfX25yX3RyYWNlCit9OworCitlbnVtIHJ4cnBjX3Byb3Bvc2VfYWNrX291dGNvbWUgeworCXJ4cnBjX3Byb3Bvc2VfYWNrX3VzZSwKKwlyeHJwY19wcm9wb3NlX2Fja191cGRhdGUsCisJcnhycGNfcHJvcG9zZV9hY2tfc3Vic3VtZSwKKwlyeHJwY19wcm9wb3NlX2Fja19fbnJfb3V0Y29tZXMKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX3Byb3Bvc2VfYWNrX3RyYWNlc1tyeHJwY19wcm9wb3NlX2Fja19fbnJfdHJhY2VdWzhdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IHJ4cnBjX3Byb3Bvc2VfYWNrX291dGNvbWVzW3J4cnBjX3Byb3Bvc2VfYWNrX19ucl9vdXRjb21lc107CisKK2VudW0gcnhycGNfY29uZ2VzdF9jaGFuZ2UgeworCXJ4cnBjX2NvbmdfYmVnaW5fcmV0cmFuc21pc3Npb24sCisJcnhycGNfY29uZ19jbGVhcmVkX25hY2tzLAorCXJ4cnBjX2NvbmdfbmV3X2xvd19uYWNrLAorCXJ4cnBjX2Nvbmdfbm9fY2hhbmdlLAorCXJ4cnBjX2NvbmdfcHJvZ3Jlc3MsCisJcnhycGNfY29uZ19yZXRyYW5zbWl0X2FnYWluLAorCXJ4cnBjX2NvbmdfcnR0X3dpbmRvd19lbmQsCisJcnhycGNfY29uZ19zYXdfbmFjaywKKwlyeHJwY19jb25nZXN0X19ucl9jaGFuZ2UKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX2Nvbmdlc3RfbW9kZXNbTlJfX1JYUlBDX0NPTkdFU1RfTU9ERVNdWzEwXTsKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX2Nvbmdlc3RfY2hhbmdlc1tyeHJwY19jb25nZXN0X19ucl9jaGFuZ2VdWzldOworCitleHRlcm4gY29uc3QgY2hhciAqY29uc3QgcnhycGNfcGt0c1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgY29uc3QgcnhycGNfYWNrX25hbWVzW1JYUlBDX0FDS19fSU5WQUxJRCArIDFdWzRdOworCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3J4cnBjLmg+CiAKIC8qCiAgKiBhZl9yeHJwYy5jCiAgKi8KLWV4dGVybiBhdG9taWNfdCByeHJwY19uX3NrYnM7CitleHRlcm4gYXRvbWljX3QgcnhycGNfbl90eF9za2JzLCByeHJwY19uX3J4X3NrYnM7CiBleHRlcm4gdTMyIHJ4cnBjX2Vwb2NoOwogZXh0ZXJuIGF0b21pY190IHJ4cnBjX2RlYnVnX2lkOwogZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpyeHJwY193b3JrcXVldWU7CkBAIC00OTQsNzAgKzc5MiwxNzggQEAKIC8qCiAgKiBjYWxsX2FjY2VwdC5jCiAgKi8KK2ludCByeHJwY19zZXJ2aWNlX3ByZWFsbG9jKHN0cnVjdCByeHJwY19zb2NrICosIGdmcF90KTsKK3ZvaWQgcnhycGNfZGlzY2FyZF9wcmVhbGxvYyhzdHJ1Y3QgcnhycGNfc29jayAqKTsKK3N0cnVjdCByeHJwY19jYWxsICpyeHJwY19uZXdfaW5jb21pbmdfY2FsbChzdHJ1Y3QgcnhycGNfbG9jYWwgKiwKKwkJCQkJICAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKiwKKwkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKik7CiB2b2lkIHJ4cnBjX2FjY2VwdF9pbmNvbWluZ19jYWxscyhzdHJ1Y3QgcnhycGNfbG9jYWwgKik7Ci1zdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWNjZXB0X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKiwgdW5zaWduZWQgbG9uZyk7CitzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWNjZXB0X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKiwgdW5zaWduZWQgbG9uZywKKwkJCQkgICAgIHJ4cnBjX25vdGlmeV9yeF90KTsKIGludCByeHJwY19yZWplY3RfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqKTsKIAogLyoKICAqIGNhbGxfZXZlbnQuYwogICovCi12b2lkIF9fcnhycGNfcHJvcG9zZV9BQ0soc3RydWN0IHJ4cnBjX2NhbGwgKiwgdTgsIHUzMiwgYm9vbCk7Ci12b2lkIHJ4cnBjX3Byb3Bvc2VfQUNLKHN0cnVjdCByeHJwY19jYWxsICosIHU4LCB1MzIsIGJvb2wpOwordm9pZCByeHJwY19zZXRfdGltZXIoc3RydWN0IHJ4cnBjX2NhbGwgKiwgZW51bSByeHJwY190aW1lcl90cmFjZSwga3RpbWVfdCk7Cit2b2lkIHJ4cnBjX3Byb3Bvc2VfQUNLKHN0cnVjdCByeHJwY19jYWxsICosIHU4LCB1MTYsIHUzMiwgYm9vbCwgYm9vbCwKKwkJICAgICAgIGVudW0gcnhycGNfcHJvcG9zZV9hY2tfdHJhY2UpOwogdm9pZCByeHJwY19wcm9jZXNzX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICopOwogCiAvKgogICogY2FsbF9vYmplY3QuYwogICovCitleHRlcm4gY29uc3QgY2hhciAqY29uc3QgcnhycGNfY2FsbF9zdGF0ZXNbXTsKK2V4dGVybiBjb25zdCBjaGFyICpjb25zdCByeHJwY19jYWxsX2NvbXBsZXRpb25zW107CiBleHRlcm4gdW5zaWduZWQgaW50IHJ4cnBjX21heF9jYWxsX2xpZmV0aW1lOwotZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19kZWFkX2NhbGxfZXhwaXJ5OwogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpyeHJwY19jYWxsX2phcjsKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHJ4cnBjX2NhbGxzOwogZXh0ZXJuIHJ3bG9ja190IHJ4cnBjX2NhbGxfbG9jazsKIAogc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2ZpbmRfY2FsbF9ieV91c2VyX0lEKHN0cnVjdCByeHJwY19zb2NrICosIHVuc2lnbmVkIGxvbmcpOworc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2FsbG9jX2NhbGwoZ2ZwX3QpOwogc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX25ld19jbGllbnRfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqLAogCQkJCQkgc3RydWN0IHJ4cnBjX2Nvbm5fcGFyYW1ldGVycyAqLAogCQkJCQkgc3RydWN0IHNvY2thZGRyX3J4cnBjICosCiAJCQkJCSB1bnNpZ25lZCBsb25nLCBnZnBfdCk7Ci1zdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfaW5jb21pbmdfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqLAotCQkJCSAgICAgICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqLAotCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKTsKLXZvaWQgcnhycGNfcmVsZWFzZV9jYWxsKHN0cnVjdCByeHJwY19jYWxsICopOwordm9pZCByeHJwY19pbmNvbWluZ19jYWxsKHN0cnVjdCByeHJwY19zb2NrICosIHN0cnVjdCByeHJwY19jYWxsICosCisJCQkgc3RydWN0IHNrX2J1ZmYgKik7Cit2b2lkIHJ4cnBjX3JlbGVhc2VfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKIHZvaWQgcnhycGNfcmVsZWFzZV9jYWxsc19vbl9zb2NrZXQoc3RydWN0IHJ4cnBjX3NvY2sgKik7Ci12b2lkIF9fcnhycGNfcHV0X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKik7Citib29sIF9fcnhycGNfcXVldWVfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKK2Jvb2wgcnhycGNfcXVldWVfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKK3ZvaWQgcnhycGNfc2VlX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKik7Cit2b2lkIHJ4cnBjX2dldF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICosIGVudW0gcnhycGNfY2FsbF90cmFjZSk7Cit2b2lkIHJ4cnBjX3B1dF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICosIGVudW0gcnhycGNfY2FsbF90cmFjZSk7Cit2b2lkIHJ4cnBjX2NsZWFudXBfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKIHZvaWQgX19leGl0IHJ4cnBjX2Rlc3Ryb3lfYWxsX2NhbGxzKHZvaWQpOwogCitzdGF0aWMgaW5saW5lIGJvb2wgcnhycGNfaXNfc2VydmljZV9jYWxsKGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXJldHVybiB0ZXN0X2JpdChSWFJQQ19DQUxMX0lTX1NFUlZJQ0UsICZjYWxsLT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCByeHJwY19pc19jbGllbnRfY2FsbChjb25zdCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlyZXR1cm4gIXJ4cnBjX2lzX3NlcnZpY2VfY2FsbChjYWxsKTsKK30KKworLyoKKyAqIFRyYW5zaXRpb24gYSBjYWxsIHRvIHRoZSBjb21wbGV0ZSBzdGF0ZS4KKyAqLworc3RhdGljIGlubGluZSBib29sIF9fcnhycGNfc2V0X2NhbGxfY29tcGxldGlvbihzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkJICAgICAgIGVudW0gcnhycGNfY2FsbF9jb21wbGV0aW9uIGNvbXBsLAorCQkJCQkgICAgICAgdTMyIGFib3J0X2NvZGUsCisJCQkJCSAgICAgICBpbnQgZXJyb3IpCit7CisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQljYWxsLT5hYm9ydF9jb2RlID0gYWJvcnRfY29kZTsKKwkJY2FsbC0+ZXJyb3IgPSBlcnJvcjsKKwkJY2FsbC0+Y29tcGxldGlvbiA9IGNvbXBsLAorCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfQ09NUExFVEU7CisJCXdha2VfdXAoJmNhbGwtPndhaXRxKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIHJ4cnBjX3NldF9jYWxsX2NvbXBsZXRpb24oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJCSAgICAgZW51bSByeHJwY19jYWxsX2NvbXBsZXRpb24gY29tcGwsCisJCQkJCSAgICAgdTMyIGFib3J0X2NvZGUsCisJCQkJCSAgICAgaW50IGVycm9yKQoreworCWJvb2wgcmV0OworCisJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJcmV0ID0gX19yeHJwY19zZXRfY2FsbF9jb21wbGV0aW9uKGNhbGwsIGNvbXBsLCBhYm9ydF9jb2RlLCBlcnJvcik7CisJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUmVjb3JkIHRoYXQgYSBjYWxsIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBfX3J4cnBjX2NhbGxfY29tcGxldGVkKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXJldHVybiBfX3J4cnBjX3NldF9jYWxsX2NvbXBsZXRpb24oY2FsbCwgUlhSUENfQ0FMTF9TVUNDRUVERUQsIDAsIDApOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgcnhycGNfY2FsbF9jb21wbGV0ZWQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJYm9vbCByZXQ7CisKKwl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlyZXQgPSBfX3J4cnBjX2NhbGxfY29tcGxldGVkKGNhbGwpOworCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlY29yZCB0aGF0IGEgY2FsbCBpcyBsb2NhbGx5IGFib3J0ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBfX3J4cnBjX2Fib3J0X2NhbGwoY29uc3QgY2hhciAqd2h5LCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICAgICByeHJwY19zZXFfdCBzZXEsCisJCQkJICAgICAgdTMyIGFib3J0X2NvZGUsIGludCBlcnJvcikKK3sKKwl0cmFjZV9yeHJwY19hYm9ydCh3aHksIGNhbGwtPmNpZCwgY2FsbC0+Y2FsbF9pZCwgc2VxLAorCQkJICBhYm9ydF9jb2RlLCBlcnJvcik7CisJcmV0dXJuIF9fcnhycGNfc2V0X2NhbGxfY29tcGxldGlvbihjYWxsLCBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRCwKKwkJCQkJICAgYWJvcnRfY29kZSwgZXJyb3IpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgcnhycGNfYWJvcnRfY2FsbChjb25zdCBjaGFyICp3aHksIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgICByeHJwY19zZXFfdCBzZXEsIHUzMiBhYm9ydF9jb2RlLCBpbnQgZXJyb3IpCit7CisJYm9vbCByZXQ7CisKKwl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlyZXQgPSBfX3J4cnBjX2Fib3J0X2NhbGwod2h5LCBjYWxsLCBzZXEsIGFib3J0X2NvZGUsIGVycm9yKTsKKwl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBjb25uX2NsaWVudC5jCiAgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgcnhycGNfbWF4X2NsaWVudF9jb25uZWN0aW9uczsKK2V4dGVybiB1bnNpZ25lZCBpbnQgcnhycGNfcmVhcF9jbGllbnRfY29ubmVjdGlvbnM7CitleHRlcm4gdW5zaWduZWQgaW50IHJ4cnBjX2Nvbm5faWRsZV9jbGllbnRfZXhwaXJ5OworZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19jb25uX2lkbGVfY2xpZW50X2Zhc3RfZXhwaXJ5OwogZXh0ZXJuIHN0cnVjdCBpZHIgcnhycGNfY2xpZW50X2Nvbm5faWRzOwogCiB2b2lkIHJ4cnBjX2Rlc3Ryb3lfY2xpZW50X2Nvbm5faWRzKHZvaWQpOwogaW50IHJ4cnBjX2Nvbm5lY3RfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3QgcnhycGNfY29ubl9wYXJhbWV0ZXJzICosCiAJCSAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKiwgZ2ZwX3QpOwotdm9pZCByeHJwY191bnB1Ymxpc2hfY2xpZW50X2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKik7Cit2b2lkIHJ4cnBjX2V4cG9zZV9jbGllbnRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKK3ZvaWQgcnhycGNfZGlzY29ubmVjdF9jbGllbnRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKK3ZvaWQgcnhycGNfcHV0X2NsaWVudF9jb25uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOwordm9pZCBfX2V4aXQgcnhycGNfZGVzdHJveV9hbGxfY2xpZW50X2Nvbm5lY3Rpb25zKHZvaWQpOwogCiAvKgogICogY29ubl9ldmVudC5jCiAgKi8KIHZvaWQgcnhycGNfcHJvY2Vzc19jb25uZWN0aW9uKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKLXZvaWQgcnhycGNfcmVqZWN0X3BhY2tldChzdHJ1Y3QgcnhycGNfbG9jYWwgKiwgc3RydWN0IHNrX2J1ZmYgKik7Ci12b2lkIHJ4cnBjX3JlamVjdF9wYWNrZXRzKHN0cnVjdCByeHJwY19sb2NhbCAqKTsKIAogLyoKICAqIGNvbm5fb2JqZWN0LmMKICAqLwogZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19jb25uZWN0aW9uX2V4cGlyeTsKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHJ4cnBjX2Nvbm5lY3Rpb25zOworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgcnhycGNfY29ubmVjdGlvbl9wcm9jX2xpc3Q7CiBleHRlcm4gcndsb2NrX3QgcnhycGNfY29ubmVjdGlvbl9sb2NrOwogCiBpbnQgcnhycGNfZXh0cmFjdF9hZGRyX2Zyb21fc2tiKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpyeHJwY19hbGxvY19jb25uZWN0aW9uKGdmcF90KTsKIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpyeHJwY19maW5kX2Nvbm5lY3Rpb25fcmN1KHN0cnVjdCByeHJwY19sb2NhbCAqLAogCQkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKik7Ci12b2lkIF9fcnhycGNfZGlzY29ubmVjdF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICopOwordm9pZCBfX3J4cnBjX2Rpc2Nvbm5lY3RfY2FsbChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKIHZvaWQgcnhycGNfZGlzY29ubmVjdF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICopOwotdm9pZCByeHJwY19wdXRfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqKTsKK3ZvaWQgcnhycGNfa2lsbF9jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOworYm9vbCByeHJwY19xdWV1ZV9jb25uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOwordm9pZCByeHJwY19zZWVfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqKTsKK3ZvaWQgcnhycGNfZ2V0X2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKik7CitzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqcnhycGNfZ2V0X2Nvbm5lY3Rpb25fbWF5YmUoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKik7Cit2b2lkIHJ4cnBjX3B1dF9zZXJ2aWNlX2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKik7CiB2b2lkIF9fZXhpdCByeHJwY19kZXN0cm95X2FsbF9jb25uZWN0aW9ucyh2b2lkKTsKIAogc3RhdGljIGlubGluZSBib29sIHJ4cnBjX2Nvbm5faXNfY2xpZW50KGNvbnN0IHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQpAQCAtNTcwLDI0ICs5NzYsMTUgQEAKIAlyZXR1cm4gIXJ4cnBjX2Nvbm5faXNfY2xpZW50KGNvbm4pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfZ2V0X2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCitzdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfcHV0X2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCiB7Ci0JYXRvbWljX2luYygmY29ubi0+dXNhZ2UpOwotfQorCWlmICghY29ubikKKwkJcmV0dXJuOwogCi1zdGF0aWMgaW5saW5lCi1zdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqcnhycGNfZ2V0X2Nvbm5lY3Rpb25fbWF5YmUoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCi17Ci0JcmV0dXJuIGF0b21pY19pbmNfbm90X3plcm8oJmNvbm4tPnVzYWdlKSA/IGNvbm4gOiBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgcnhycGNfcXVldWVfY29ubihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKLXsKLQlpZiAoIXJ4cnBjX2dldF9jb25uZWN0aW9uX21heWJlKGNvbm4pKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKCFyeHJwY19xdWV1ZV93b3JrKCZjb25uLT5wcm9jZXNzb3IpKQotCQlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKLQlyZXR1cm4gdHJ1ZTsKKwlpZiAocnhycGNfY29ubl9pc19jbGllbnQoY29ubikpCisJCXJ4cnBjX3B1dF9jbGllbnRfY29ubihjb25uKTsKKwllbHNlCisJCXJ4cnBjX3B1dF9zZXJ2aWNlX2Nvbm4oY29ubik7CiB9CiAKIC8qCkBAIC01OTUsMTcgKzk5MiwxNCBAQAogICovCiBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqcnhycGNfZmluZF9zZXJ2aWNlX2Nvbm5fcmN1KHN0cnVjdCByeHJwY19wZWVyICosCiAJCQkJCQkgICAgIHN0cnVjdCBza19idWZmICopOwotc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKnJ4cnBjX2luY29taW5nX2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2xvY2FsICosCi0JCQkJCQkgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKiwKLQkJCQkJCSAgIHN0cnVjdCBza19idWZmICopOworc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKnJ4cnBjX3ByZWFsbG9jX3NlcnZpY2VfY29ubmVjdGlvbihnZnBfdCk7Cit2b2lkIHJ4cnBjX25ld19pbmNvbWluZ19jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICosIHN0cnVjdCBza19idWZmICopOwogdm9pZCByeHJwY191bnB1Ymxpc2hfc2VydmljZV9jb25uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOwogCiAvKgogICogaW5wdXQuYwogICovCiB2b2lkIHJ4cnBjX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKik7Ci1pbnQgcnhycGNfcXVldWVfcmN2X3NrYihzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sLCBib29sKTsKLXZvaWQgcnhycGNfZmFzdF9wcm9jZXNzX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIAogLyoKICAqIGluc2VjdXJlLmMKQEAgLTY2NywyNSArMTA2MSwyNCBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19yeF93aW5kb3dfc2l6ZTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgcnhycGNfcnhfbXR1OwogZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19yeF9qdW1ib19tYXg7CitleHRlcm4gdW5zaWduZWQgaW50IHJ4cnBjX3Jlc2VuZF90aW1lb3V0OwogCi1leHRlcm4gY29uc3QgY2hhciAqY29uc3QgcnhycGNfcGt0c1tdOwogZXh0ZXJuIGNvbnN0IHM4IHJ4cnBjX2Fja19wcmlvcml0eVtdOwogCi1leHRlcm4gY29uc3QgY2hhciAqcnhycGNfYWNrcyh1OCByZWFzb24pOwotCiAvKgogICogb3V0cHV0LmMKICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19yZXNlbmRfdGltZW91dDsKLQotaW50IHJ4cnBjX3NlbmRfZGF0YV9wYWNrZXQoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKiwgc3RydWN0IHNrX2J1ZmYgKik7Ci1pbnQgcnhycGNfZG9fc2VuZG1zZyhzdHJ1Y3QgcnhycGNfc29jayAqLCBzdHJ1Y3QgbXNnaGRyICosIHNpemVfdCk7CitpbnQgcnhycGNfc2VuZF9jYWxsX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqLCB1OCk7CitpbnQgcnhycGNfc2VuZF9kYXRhX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKK3ZvaWQgcnhycGNfcmVqZWN0X3BhY2tldHMoc3RydWN0IHJ4cnBjX2xvY2FsICopOwogCiAvKgogICogcGVlcl9ldmVudC5jCiAgKi8KIHZvaWQgcnhycGNfZXJyb3JfcmVwb3J0KHN0cnVjdCBzb2NrICopOwogdm9pZCByeHJwY19wZWVyX2Vycm9yX2Rpc3RyaWJ1dG9yKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKK3ZvaWQgcnhycGNfcGVlcl9hZGRfcnR0KHN0cnVjdCByeHJwY19jYWxsICosIGVudW0gcnhycGNfcnR0X3J4X3RyYWNlLAorCQkJcnhycGNfc2VyaWFsX3QsIHJ4cnBjX3NlcmlhbF90LCBrdGltZV90LCBrdGltZV90KTsKIAogLyoKICAqIHBlZXJfb2JqZWN0LmMKQEAgLTY5NSwxMCArMTA4OCwxMyBAQAogc3RydWN0IHJ4cnBjX3BlZXIgKnJ4cnBjX2xvb2t1cF9wZWVyKHN0cnVjdCByeHJwY19sb2NhbCAqLAogCQkJCSAgICAgc3RydWN0IHNvY2thZGRyX3J4cnBjICosIGdmcF90KTsKIHN0cnVjdCByeHJwY19wZWVyICpyeHJwY19hbGxvY19wZWVyKHN0cnVjdCByeHJwY19sb2NhbCAqLCBnZnBfdCk7CitzdHJ1Y3QgcnhycGNfcGVlciAqcnhycGNfbG9va3VwX2luY29taW5nX3BlZXIoc3RydWN0IHJ4cnBjX2xvY2FsICosCisJCQkJCSAgICAgIHN0cnVjdCByeHJwY19wZWVyICopOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfZ2V0X3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpCitzdGF0aWMgaW5saW5lIHN0cnVjdCByeHJwY19wZWVyICpyeHJwY19nZXRfcGVlcihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcikKIHsKIAlhdG9taWNfaW5jKCZwZWVyLT51c2FnZSk7CisJcmV0dXJuIHBlZXI7CiB9CiAKIHN0YXRpYyBpbmxpbmUKQEAgLTcxNywxNCArMTExMywxMyBAQAogLyoKICAqIHByb2MuYwogICovCi1leHRlcm4gY29uc3QgY2hhciAqY29uc3QgcnhycGNfY2FsbF9zdGF0ZXNbXTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJ4cnBjX2NhbGxfc2VxX2ZvcHM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByeHJwY19jb25uZWN0aW9uX3NlcV9mb3BzOwogCiAvKgogICogcmVjdm1zZy5jCiAgKi8KLXZvaWQgcnhycGNfcmVtb3ZlX3VzZXJfSUQoc3RydWN0IHJ4cnBjX3NvY2sgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKik7Cit2b2lkIHJ4cnBjX25vdGlmeV9zb2NrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKik7CiBpbnQgcnhycGNfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBtc2doZHIgKiwgc2l6ZV90LCBpbnQpOwogCiAvKgpAQCAtNzQzLDkgKzExMzgsMjEgQEAKIGludCByeHJwY19pbml0X3NlcnZlcl9jb25uX3NlY3VyaXR5KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOwogCiAvKgorICogc2VuZG1zZy5jCisgKi8KK2ludCByeHJwY19kb19zZW5kbXNnKHN0cnVjdCByeHJwY19zb2NrICosIHN0cnVjdCBtc2doZHIgKiwgc2l6ZV90KTsKKworLyoKICAqIHNrYnVmZi5jCiAgKi8KK3ZvaWQgcnhycGNfa2VybmVsX2RhdGFfY29uc3VtZWQoc3RydWN0IHJ4cnBjX2NhbGwgKiwgc3RydWN0IHNrX2J1ZmYgKik7CiB2b2lkIHJ4cnBjX3BhY2tldF9kZXN0cnVjdG9yKHN0cnVjdCBza19idWZmICopOwordm9pZCByeHJwY19uZXdfc2tiKHN0cnVjdCBza19idWZmICosIGVudW0gcnhycGNfc2tiX3RyYWNlKTsKK3ZvaWQgcnhycGNfc2VlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqLCBlbnVtIHJ4cnBjX3NrYl90cmFjZSk7Cit2b2lkIHJ4cnBjX2dldF9za2Ioc3RydWN0IHNrX2J1ZmYgKiwgZW51bSByeHJwY19za2JfdHJhY2UpOwordm9pZCByeHJwY19mcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqLCBlbnVtIHJ4cnBjX3NrYl90cmFjZSk7Cit2b2lkIHJ4cnBjX2xvc2Vfc2tiKHN0cnVjdCBza19idWZmICosIGVudW0gcnhycGNfc2tiX3RyYWNlKTsKK3ZvaWQgcnhycGNfcHVyZ2VfcXVldWUoc3RydWN0IHNrX2J1ZmZfaGVhZCAqKTsKIAogLyoKICAqIHN5c2N0bC5jCkBAIC03NjMsNiArMTE3MCwyMyBAQAogICovCiBpbnQgcnhycGNfZXh0cmFjdF9hZGRyX2Zyb21fc2tiKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIAorc3RhdGljIGlubGluZSBib29sIGJlZm9yZSh1MzIgc2VxMSwgdTMyIHNlcTIpCit7CisgICAgICAgIHJldHVybiAoczMyKShzZXExIC0gc2VxMikgPCAwOworfQorc3RhdGljIGlubGluZSBib29sIGJlZm9yZV9lcSh1MzIgc2VxMSwgdTMyIHNlcTIpCit7CisgICAgICAgIHJldHVybiAoczMyKShzZXExIC0gc2VxMikgPD0gMDsKK30KK3N0YXRpYyBpbmxpbmUgYm9vbCBhZnRlcih1MzIgc2VxMSwgdTMyIHNlcTIpCit7CisgICAgICAgIHJldHVybiAoczMyKShzZXExIC0gc2VxMikgPiAwOworfQorc3RhdGljIGlubGluZSBib29sIGFmdGVyX2VxKHUzMiBzZXExLCB1MzIgc2VxMikKK3sKKyAgICAgICAgcmV0dXJuIChzMzIpKHNlcTEgLSBzZXEyKSA+PSAwOworfQorCiAvKgogICogZGVidWcgdHJhY2luZwogICovCkBAIC04NDUsMTEgKzEyNjksMTIgQEAKIAogI2RlZmluZSBBU1NFUlRDTVAoWCwgT1AsIFkpCQkJCQkJXAogZG8gewkJCQkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIF94ID0gKHVuc2lnbmVkIGxvbmcpKFgpOwkJCQlcCi0JdW5zaWduZWQgbG9uZyBfeSA9ICh1bnNpZ25lZCBsb25nKShZKTsJCQkJXAorCV9fdHlwZW9mX18oWCkgX3ggPSAoWCk7CQkJCQkJXAorCV9fdHlwZW9mX18oWSkgX3kgPSAoX190eXBlb2ZfXyhYKSkoWSk7CQkJCVwKIAlpZiAodW5saWtlbHkoIShfeCBPUCBfeSkpKSB7CQkJCQlcCi0JCXByX2VycigiQXNzZXJ0aW9uIGZhaWxlZCAtICVsdSgweCVseCkgJXMgJWx1KDB4JWx4KSBpcyBmYWxzZVxuIiwJCQlcCi0JCSAgICAgICBfeCwgX3gsICNPUCwgX3ksIF95KTsJCQkJXAorCQlwcl9lcnIoIkFzc2VydGlvbiBmYWlsZWQgLSAlbHUoMHglbHgpICVzICVsdSgweCVseCkgaXMgZmFsc2VcbiIsIFwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKV94LCAodW5zaWduZWQgbG9uZylfeCwgI09QLAlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZylfeSwgKHVuc2lnbmVkIGxvbmcpX3kpOwkJXAogCQlCVUcoKTsJCQkJCQkJXAogCX0JCQkJCQkJCVwKIH0gd2hpbGUgKDApCkBAIC04NjQsMTEgKzEyODksMTIgQEAKIAogI2RlZmluZSBBU1NFUlRJRkNNUChDLCBYLCBPUCwgWSkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyBfeCA9ICh1bnNpZ25lZCBsb25nKShYKTsJCQkJXAotCXVuc2lnbmVkIGxvbmcgX3kgPSAodW5zaWduZWQgbG9uZykoWSk7CQkJCVwKKwlfX3R5cGVvZl9fKFgpIF94ID0gKFgpOwkJCQkJCVwKKwlfX3R5cGVvZl9fKFkpIF95ID0gKF9fdHlwZW9mX18oWCkpKFkpOwkJCQlcCiAJaWYgKHVubGlrZWx5KChDKSAmJiAhKF94IE9QIF95KSkpIHsJCQkJXAogCQlwcl9lcnIoIkFzc2VydGlvbiBmYWlsZWQgLSAlbHUoMHglbHgpICVzICVsdSgweCVseCkgaXMgZmFsc2VcbiIsIFwKLQkJICAgICAgIF94LCBfeCwgI09QLCBfeSwgX3kpOwkJCQlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZylfeCwgKHVuc2lnbmVkIGxvbmcpX3gsICNPUCwJXAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpX3ksICh1bnNpZ25lZCBsb25nKV95KTsJCVwKIAkJQlVHKCk7CQkJCQkJCVwKIAl9CQkJCQkJCQlcCiB9IHdoaWxlICgwKQpAQCAtODkyLDU0ICsxMzE4LDMgQEAKIH0gd2hpbGUgKDApCiAKICNlbmRpZiAvKiBfX0tERUJVR0FMTCAqLwotCi0vKgotICogc29ja2V0IGJ1ZmZlciBhY2NvdW50aW5nIC8gbGVhayBmaW5kaW5nCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3J4cnBjX25ld19za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3QgY2hhciAqZm4pCi17Ci0JLy9fbmV0KCJuZXcgc2tiICVwICVzIFslZF0iLCBza2IsIGZuLCBhdG9taWNfcmVhZCgmcnhycGNfbl9za2JzKSk7Ci0JLy9hdG9taWNfaW5jKCZyeHJwY19uX3NrYnMpOwotfQotCi0jZGVmaW5lIHJ4cnBjX25ld19za2Ioc2tiKSBfX3J4cnBjX25ld19za2IoKHNrYiksIF9fZnVuY19fKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19yeHJwY19raWxsX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBjaGFyICpmbikKLXsKLQkvL19uZXQoImtpbGwgc2tiICVwICVzIFslZF0iLCBza2IsIGZuLCBhdG9taWNfcmVhZCgmcnhycGNfbl9za2JzKSk7Ci0JLy9hdG9taWNfZGVjKCZyeHJwY19uX3NrYnMpOwotfQotCi0jZGVmaW5lIHJ4cnBjX2tpbGxfc2tiKHNrYikgX19yeHJwY19raWxsX3NrYigoc2tiKSwgX19mdW5jX18pCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3J4cnBjX2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IGNoYXIgKmZuKQotewotCWlmIChza2IpIHsKLQkJQ0hFQ0tfU0xBQl9PS0FZKCZza2ItPnVzZXJzKTsKLQkJLy9fbmV0KCJmcmVlIHNrYiAlcCAlcyBbJWRdIiwKLQkJLy8gICAgIHNrYiwgZm4sIGF0b21pY19yZWFkKCZyeHJwY19uX3NrYnMpKTsKLQkJLy9hdG9taWNfZGVjKCZyeHJwY19uX3NrYnMpOwotCQlrZnJlZV9za2Ioc2tiKTsKLQl9Ci19Ci0KLSNkZWZpbmUgcnhycGNfZnJlZV9za2Ioc2tiKSBfX3J4cnBjX2ZyZWVfc2tiKChza2IpLCBfX2Z1bmNfXykKLQotc3RhdGljIGlubGluZSB2b2lkIHJ4cnBjX3B1cmdlX3F1ZXVlKHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKChsaXN0KSkpICE9IE5VTEwpCi0JCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci19Ci0KLSNkZWZpbmUgcnhycGNfZ2V0X2NhbGwoQ0FMTCkJCQkJXAotZG8gewkJCQkJCQlcCi0JQ0hFQ0tfU0xBQl9PS0FZKCYoQ0FMTCktPnVzYWdlKTsJCVwKLQlpZiAoYXRvbWljX2luY19yZXR1cm4oJihDQUxMKS0+dXNhZ2UpID09IDEpCVwKLQkJQlVHKCk7CQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIHJ4cnBjX3B1dF9jYWxsKENBTEwpCQkJCVwKLWRvIHsJCQkJCQkJXAotCV9fcnhycGNfcHV0X2NhbGwoQ0FMTCk7CQkJCVwKLX0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvY2FsbF9hY2NlcHQuYyBiL25ldC9yeHJwYy9jYWxsX2FjY2VwdC5jCmluZGV4IDBiMjgzMjEuLjNjYWMyMzEgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9jYWxsX2FjY2VwdC5jCisrKyBiL25ldC9yeHJwYy9jYWxsX2FjY2VwdC5jCkBAIC0yMCwyNjQgKzIwLDQwOSBAQAogI2luY2x1ZGUgPGxpbnV4L2luNi5oPgogI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9jaXJjX2J1Zi5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKIAogLyoKLSAqIGdlbmVyYXRlIGEgY29ubmVjdGlvbi1sZXZlbCBhYm9ydAorICogUHJlYWxsb2NhdGUgYSBzaW5nbGUgc2VydmljZSBjYWxsLCBjb25uZWN0aW9uIGFuZCBwZWVyIGFuZCwgaWYgcG9zc2libGUsCisgKiBnaXZlIHRoZW0gYSB1c2VyIElEIGFuZCBhdHRhY2ggdGhlIHVzZXIncyBzaWRlIG9mIHRoZSBJRCB0byB0aGVtLgogICovCi1zdGF0aWMgaW50IHJ4cnBjX2J1c3koc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwgc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcngsCi0JCSAgICAgIHN0cnVjdCByeHJwY193aXJlX2hlYWRlciAqd2hkcikKK3N0YXRpYyBpbnQgcnhycGNfc2VydmljZV9wcmVhbGxvY19vbmUoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJCSAgICAgIHN0cnVjdCByeHJwY19iYWNrbG9nICpiLAorCQkJCSAgICAgIHJ4cnBjX25vdGlmeV9yeF90IG5vdGlmeV9yeCwKKwkJCQkgICAgICByeHJwY191c2VyX2F0dGFjaF9jYWxsX3QgdXNlcl9hdHRhY2hfY2FsbCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCwgZ2ZwX3QgZ2ZwKQogewotCXN0cnVjdCBtc2doZHIgbXNnOwotCXN0cnVjdCBrdmVjIGlvdlsxXTsKLQlzaXplX3QgbGVuOwotCWludCByZXQ7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlpbnQgbWF4LCB0bXA7CisJdW5zaWduZWQgaW50IHNpemUgPSBSWFJQQ19CQUNLTE9HX01BWDsKKwl1bnNpZ25lZCBpbnQgaGVhZCwgdGFpbCwgY2FsbF9oZWFkLCBjYWxsX3RhaWw7CiAKLQlfZW50ZXIoIiVkLCwiLCBsb2NhbC0+ZGVidWdfaWQpOworCW1heCA9IHJ4LT5zay5za19tYXhfYWNrX2JhY2tsb2c7CisJdG1wID0gcngtPnNrLnNrX2Fja19iYWNrbG9nOworCWlmICh0bXAgPj0gbWF4KSB7CisJCV9sZWF2ZSgiID0gLUVOT0JVRlMgW2Z1bGwgJXVdIiwgbWF4KTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwltYXggLT0gdG1wOwogCi0Jd2hkci0+dHlwZQk9IFJYUlBDX1BBQ0tFVF9UWVBFX0JVU1k7Ci0Jd2hkci0+c2VyaWFsCT0gaHRvbmwoMSk7CisJLyogV2UgZG9uJ3QgbmVlZCBtb3JlIGNvbm5zIGFuZCBwZWVycyB0aGFuIHdlIGhhdmUgY2FsbHMsIGJ1dCBvbiB0aGUKKwkgKiBvdGhlciBoYW5kLCB3ZSBzaG91bGRuJ3QgZXZlciB1c2UgbW9yZSBwZWVycyB0aGFuIGNvbm5zIG9yIGNvbm5zCisJICogdGhhbiBjYWxscy4KKwkgKi8KKwljYWxsX2hlYWQgPSBiLT5jYWxsX2JhY2tsb2dfaGVhZDsKKwljYWxsX3RhaWwgPSBSRUFEX09OQ0UoYi0+Y2FsbF9iYWNrbG9nX3RhaWwpOworCXRtcCA9IENJUkNfQ05UKGNhbGxfaGVhZCwgY2FsbF90YWlsLCBzaXplKTsKKwlpZiAodG1wID49IG1heCkgeworCQlfbGVhdmUoIiA9IC1FTk9CVUZTIFtlbm91Z2ggJXVdIiwgdG1wKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwltYXggPSB0bXAgKyAxOwogCi0JbXNnLm1zZ19uYW1lCT0gJnNyeC0+dHJhbnNwb3J0LnNpbjsKLQltc2cubXNnX25hbWVsZW4JPSBzaXplb2Yoc3J4LT50cmFuc3BvcnQuc2luKTsKLQltc2cubXNnX2NvbnRyb2wJPSBOVUxMOwotCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0JbXNnLm1zZ19mbGFncwk9IDA7Ci0KLQlpb3ZbMF0uaW92X2Jhc2UJPSB3aGRyOwotCWlvdlswXS5pb3ZfbGVuCT0gc2l6ZW9mKCp3aGRyKTsKLQotCWxlbiA9IGlvdlswXS5pb3ZfbGVuOwotCi0JX3Byb3RvKCJUeCBCVVNZICUlMSIpOwotCi0JcmV0ID0ga2VybmVsX3NlbmRtc2cobG9jYWwtPnNvY2tldCwgJm1zZywgaW92LCAxLCBsZW4pOwotCWlmIChyZXQgPCAwKSB7Ci0JCV9sZWF2ZSgiID0gLUVBR0FJTiBbc2VuZG1zZyBmYWlsZWQ6ICVkXSIsIHJldCk7Ci0JCXJldHVybiAtRUFHQUlOOworCWhlYWQgPSBiLT5wZWVyX2JhY2tsb2dfaGVhZDsKKwl0YWlsID0gUkVBRF9PTkNFKGItPnBlZXJfYmFja2xvZ190YWlsKTsKKwlpZiAoQ0lSQ19DTlQoaGVhZCwgdGFpbCwgc2l6ZSkgPCBtYXgpIHsKKwkJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIgPSByeHJwY19hbGxvY19wZWVyKHJ4LT5sb2NhbCwgZ2ZwKTsKKwkJaWYgKCFwZWVyKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWItPnBlZXJfYmFja2xvZ1toZWFkXSA9IHBlZXI7CisJCXNtcF9zdG9yZV9yZWxlYXNlKCZiLT5wZWVyX2JhY2tsb2dfaGVhZCwKKwkJCQkgIChoZWFkICsgMSkgJiAoc2l6ZSAtIDEpKTsKIAl9CiAKLQlfbGVhdmUoIiA9IDAiKTsKKwloZWFkID0gYi0+Y29ubl9iYWNrbG9nX2hlYWQ7CisJdGFpbCA9IFJFQURfT05DRShiLT5jb25uX2JhY2tsb2dfdGFpbCk7CisJaWYgKENJUkNfQ05UKGhlYWQsIHRhaWwsIHNpemUpIDwgbWF4KSB7CisJCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCisJCWNvbm4gPSByeHJwY19wcmVhbGxvY19zZXJ2aWNlX2Nvbm5lY3Rpb24oZ2ZwKTsKKwkJaWYgKCFjb25uKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWItPmNvbm5fYmFja2xvZ1toZWFkXSA9IGNvbm47CisJCXNtcF9zdG9yZV9yZWxlYXNlKCZiLT5jb25uX2JhY2tsb2dfaGVhZCwKKwkJCQkgIChoZWFkICsgMSkgJiAoc2l6ZSAtIDEpKTsKKworCQl0cmFjZV9yeHJwY19jb25uKGNvbm4sIHJ4cnBjX2Nvbm5fbmV3X3NlcnZpY2UsCisJCQkJIGF0b21pY19yZWFkKCZjb25uLT51c2FnZSksIGhlcmUpOworCX0KKworCS8qIE5vdyBpdCBnZXRzIGNvbXBsaWNhdGVkLCBiZWNhdXNlIGNhbGxzIGdldCByZWdpc3RlcmVkIHdpdGggdGhlCisJICogc29ja2V0IGhlcmUsIHBhcnRpY3VsYXJseSBpZiBhIHVzZXIgSUQgaXMgcHJlYXNzaWduZWQgYnkgdGhlIHVzZXIuCisJICovCisJY2FsbCA9IHJ4cnBjX2FsbG9jX2NhbGwoZ2ZwKTsKKwlpZiAoIWNhbGwpCisJCXJldHVybiAtRU5PTUVNOworCWNhbGwtPmZsYWdzIHw9ICgxIDw8IFJYUlBDX0NBTExfSVNfU0VSVklDRSk7CisJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9QUkVBTExPQzsKKworCXRyYWNlX3J4cnBjX2NhbGwoY2FsbCwgcnhycGNfY2FsbF9uZXdfc2VydmljZSwKKwkJCSBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAorCQkJIGhlcmUsIChjb25zdCB2b2lkICopdXNlcl9jYWxsX0lEKTsKKworCXdyaXRlX2xvY2soJnJ4LT5jYWxsX2xvY2spOworCWlmICh1c2VyX2F0dGFjaF9jYWxsKSB7CisJCXN0cnVjdCByeHJwY19jYWxsICp4Y2FsbDsKKwkJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKipwcDsKKworCQkvKiBDaGVjayB0aGUgdXNlciBJRCBpc24ndCBhbHJlYWR5IGluIHVzZSAqLworCQlwcCA9ICZyeC0+Y2FsbHMucmJfbm9kZTsKKwkJcGFyZW50ID0gTlVMTDsKKwkJd2hpbGUgKCpwcCkgeworCQkJcGFyZW50ID0gKnBwOworCQkJeGNhbGwgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCByeHJwY19jYWxsLCBzb2NrX25vZGUpOworCQkJaWYgKHVzZXJfY2FsbF9JRCA8IGNhbGwtPnVzZXJfY2FsbF9JRCkKKwkJCQlwcCA9ICYoKnBwKS0+cmJfbGVmdDsKKwkJCWVsc2UgaWYgKHVzZXJfY2FsbF9JRCA+IGNhbGwtPnVzZXJfY2FsbF9JRCkKKwkJCQlwcCA9ICYoKnBwKS0+cmJfcmlnaHQ7CisJCQllbHNlCisJCQkJZ290byBpZF9pbl91c2U7CisJCX0KKworCQljYWxsLT51c2VyX2NhbGxfSUQgPSB1c2VyX2NhbGxfSUQ7CisJCWNhbGwtPm5vdGlmeV9yeCA9IG5vdGlmeV9yeDsKKwkJcnhycGNfZ2V0X2NhbGwoY2FsbCwgcnhycGNfY2FsbF9nb3Rfa2VybmVsKTsKKwkJdXNlcl9hdHRhY2hfY2FsbChjYWxsLCB1c2VyX2NhbGxfSUQpOworCQlyeHJwY19nZXRfY2FsbChjYWxsLCByeHJwY19jYWxsX2dvdF91c2VyaWQpOworCQlyYl9saW5rX25vZGUoJmNhbGwtPnNvY2tfbm9kZSwgcGFyZW50LCBwcCk7CisJCXJiX2luc2VydF9jb2xvcigmY2FsbC0+c29ja19ub2RlLCAmcngtPmNhbGxzKTsKKwkJc2V0X2JpdChSWFJQQ19DQUxMX0hBU19VU0VSSUQsICZjYWxsLT5mbGFncyk7CisJfQorCisJbGlzdF9hZGQoJmNhbGwtPnNvY2tfbGluaywgJnJ4LT5zb2NrX2NhbGxzKTsKKworCXdyaXRlX3VubG9jaygmcngtPmNhbGxfbG9jayk7CisKKwl3cml0ZV9sb2NrKCZyeHJwY19jYWxsX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmNhbGwtPmxpbmssICZyeHJwY19jYWxscyk7CisJd3JpdGVfdW5sb2NrKCZyeHJwY19jYWxsX2xvY2spOworCisJYi0+Y2FsbF9iYWNrbG9nW2NhbGxfaGVhZF0gPSBjYWxsOworCXNtcF9zdG9yZV9yZWxlYXNlKCZiLT5jYWxsX2JhY2tsb2dfaGVhZCwgKGNhbGxfaGVhZCArIDEpICYgKHNpemUgLSAxKSk7CisJX2xlYXZlKCIgPSAwIFslZCAtPiAlbHhdIiwgY2FsbC0+ZGVidWdfaWQsIHVzZXJfY2FsbF9JRCk7CisJcmV0dXJuIDA7CisKK2lkX2luX3VzZToKKwl3cml0ZV91bmxvY2soJnJ4LT5jYWxsX2xvY2spOworCXJ4cnBjX2NsZWFudXBfY2FsbChjYWxsKTsKKwlfbGVhdmUoIiA9IC1FQkFEU0xUIik7CisJcmV0dXJuIC1FQkFEU0xUOworfQorCisvKgorICogUHJlYWxsb2NhdGUgc3VmZmljaWVudCBzZXJ2aWNlIGNvbm5lY3Rpb25zLCBjYWxscyBhbmQgcGVlcnMgdG8gY292ZXIgdGhlCisgKiBlbnRpcmUgYmFja2xvZyBvZiBhIHNvY2tldC4gIFdoZW4gYSBuZXcgY2FsbCBjb21lcyBpbiwgaWYgd2UgZG9uJ3QgaGF2ZQorICogc3VmZmljaWVudCBvZiBlYWNoIGF2YWlsYWJsZSwgdGhlIGNhbGwgZ2V0cyByZWplY3RlZCBhcyBidXN5IG9yIGlnbm9yZWQuCisgKgorICogVGhlIGJhY2tsb2cgaXMgcmVwbGVuaXNoZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQgb3IgcmVqZWN0ZWQuCisgKi8KK2ludCByeHJwY19zZXJ2aWNlX3ByZWFsbG9jKHN0cnVjdCByeHJwY19zb2NrICpyeCwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCByeHJwY19iYWNrbG9nICpiID0gcngtPmJhY2tsb2c7CisKKwlpZiAoIWIpIHsKKwkJYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByeHJwY19iYWNrbG9nKSwgZ2ZwKTsKKwkJaWYgKCFiKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJ4LT5iYWNrbG9nID0gYjsKKwl9CisKKwlpZiAocngtPmRpc2NhcmRfbmV3X2NhbGwpCisJCXJldHVybiAwOworCisJd2hpbGUgKHJ4cnBjX3NlcnZpY2VfcHJlYWxsb2Nfb25lKHJ4LCBiLCBOVUxMLCBOVUxMLCAwLCBnZnApID09IDApCisJCTsKKwogCXJldHVybiAwOwogfQogCiAvKgotICogYWNjZXB0IGFuIGluY29taW5nIGNhbGwgdGhhdCBuZWVkcyBwZWVyLCB0cmFuc3BvcnQgYW5kL29yIGNvbm5lY3Rpb24gc2V0dGluZwotICogdXAKKyAqIERpc2NhcmQgdGhlIHByZWFsbG9jYXRpb24gb24gYSBzZXJ2aWNlLgogICovCi1zdGF0aWMgaW50IHJ4cnBjX2FjY2VwdF9pbmNvbWluZ19jYWxsKHN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwsCi0JCQkJICAgICAgc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAotCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcngpCit2b2lkIHJ4cnBjX2Rpc2NhcmRfcHJlYWxsb2Moc3RydWN0IHJ4cnBjX3NvY2sgKnJ4KQogewotCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOwotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AsICpuc3A7CisJc3RydWN0IHJ4cnBjX2JhY2tsb2cgKmIgPSByeC0+YmFja2xvZzsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IFJYUlBDX0JBQ0tMT0dfTUFYLCBoZWFkLCB0YWlsOworCisJaWYgKCFiKQorCQlyZXR1cm47CisJcngtPmJhY2tsb2cgPSBOVUxMOworCisJLyogTWFrZSBzdXJlIHRoYXQgdGhlcmUgYXJlbid0IGFueSBpbmNvbWluZyBjYWxscyBpbiBwcm9ncmVzcyBiZWZvcmUgd2UKKwkgKiBjbGVhciB0aGUgcHJlYWxsb2NhdGlvbiBidWZmZXJzLgorCSAqLworCXNwaW5fbG9ja19iaCgmcngtPmluY29taW5nX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZyeC0+aW5jb21pbmdfbG9jayk7CisKKwloZWFkID0gYi0+cGVlcl9iYWNrbG9nX2hlYWQ7CisJdGFpbCA9IGItPnBlZXJfYmFja2xvZ190YWlsOworCXdoaWxlIChDSVJDX0NOVChoZWFkLCB0YWlsLCBzaXplKSA+IDApIHsKKwkJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIgPSBiLT5wZWVyX2JhY2tsb2dbdGFpbF07CisJCWtmcmVlKHBlZXIpOworCQl0YWlsID0gKHRhaWwgKyAxKSAmIChzaXplIC0gMSk7CisJfQorCisJaGVhZCA9IGItPmNvbm5fYmFja2xvZ19oZWFkOworCXRhaWwgPSBiLT5jb25uX2JhY2tsb2dfdGFpbDsKKwl3aGlsZSAoQ0lSQ19DTlQoaGVhZCwgdGFpbCwgc2l6ZSkgPiAwKSB7CisJCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gYi0+Y29ubl9iYWNrbG9nW3RhaWxdOworCQl3cml0ZV9sb2NrKCZyeHJwY19jb25uZWN0aW9uX2xvY2spOworCQlsaXN0X2RlbCgmY29ubi0+bGluayk7CisJCWxpc3RfZGVsKCZjb25uLT5wcm9jX2xpbmspOworCQl3cml0ZV91bmxvY2soJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CisJCWtmcmVlKGNvbm4pOworCQl0YWlsID0gKHRhaWwgKyAxKSAmIChzaXplIC0gMSk7CisJfQorCisJaGVhZCA9IGItPmNhbGxfYmFja2xvZ19oZWFkOworCXRhaWwgPSBiLT5jYWxsX2JhY2tsb2dfdGFpbDsKKwl3aGlsZSAoQ0lSQ19DTlQoaGVhZCwgdGFpbCwgc2l6ZSkgPiAwKSB7CisJCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gYi0+Y2FsbF9iYWNrbG9nW3RhaWxdOworCQlpZiAocngtPmRpc2NhcmRfbmV3X2NhbGwpIHsKKwkJCV9kZWJ1ZygiZGlzY2FyZCAlbHgiLCBjYWxsLT51c2VyX2NhbGxfSUQpOworCQkJcngtPmRpc2NhcmRfbmV3X2NhbGwoY2FsbCwgY2FsbC0+dXNlcl9jYWxsX0lEKTsKKwkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0X2tlcm5lbCk7CisJCX0KKwkJcnhycGNfY2FsbF9jb21wbGV0ZWQoY2FsbCk7CisJCXJ4cnBjX3JlbGVhc2VfY2FsbChyeCwgY2FsbCk7CisJCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0KTsKKwkJdGFpbCA9ICh0YWlsICsgMSkgJiAoc2l6ZSAtIDEpOworCX0KKworCWtmcmVlKGIpOworfQorCisvKgorICogQWxsb2NhdGUgYSBuZXcgaW5jb21pbmcgY2FsbCBmcm9tIHRoZSBwcmVhbGxvYyBwb29sLCBhbG9uZyB3aXRoIGEgY29ubmVjdGlvbgorICogYW5kIGEgcGVlciBhcyBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWxsb2NfaW5jb21pbmdfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqcngsCisJCQkJCQkgICAgc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwKKwkJCQkJCSAgICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByeHJwY19iYWNrbG9nICpiID0gcngtPmJhY2tsb2c7CisJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIsICp4cGVlcjsKIAlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqbm90aWZpY2F0aW9uOwotCWludCByZXQ7CisJdW5zaWduZWQgc2hvcnQgY2FsbF9oZWFkLCBjb25uX2hlYWQsIHBlZXJfaGVhZDsKKwl1bnNpZ25lZCBzaG9ydCBjYWxsX3RhaWwsIGNvbm5fdGFpbCwgcGVlcl90YWlsOworCXVuc2lnbmVkIHNob3J0IGNhbGxfY291bnQsIGNvbm5fY291bnQ7CisKKwkvKiAjY2FsbHMgPj0gI2Nvbm5zID49ICNwZWVycyBtdXN0IGhvbGQgdHJ1ZS4gKi8KKwljYWxsX2hlYWQgPSBzbXBfbG9hZF9hY3F1aXJlKCZiLT5jYWxsX2JhY2tsb2dfaGVhZCk7CisJY2FsbF90YWlsID0gYi0+Y2FsbF9iYWNrbG9nX3RhaWw7CisJY2FsbF9jb3VudCA9IENJUkNfQ05UKGNhbGxfaGVhZCwgY2FsbF90YWlsLCBSWFJQQ19CQUNLTE9HX01BWCk7CisJY29ubl9oZWFkID0gc21wX2xvYWRfYWNxdWlyZSgmYi0+Y29ubl9iYWNrbG9nX2hlYWQpOworCWNvbm5fdGFpbCA9IGItPmNvbm5fYmFja2xvZ190YWlsOworCWNvbm5fY291bnQgPSBDSVJDX0NOVChjb25uX2hlYWQsIGNvbm5fdGFpbCwgUlhSUENfQkFDS0xPR19NQVgpOworCUFTU0VSVENNUChjb25uX2NvdW50LCA+PSwgY2FsbF9jb3VudCk7CisJcGVlcl9oZWFkID0gc21wX2xvYWRfYWNxdWlyZSgmYi0+cGVlcl9iYWNrbG9nX2hlYWQpOworCXBlZXJfdGFpbCA9IGItPnBlZXJfYmFja2xvZ190YWlsOworCUFTU0VSVENNUChDSVJDX0NOVChwZWVyX2hlYWQsIHBlZXJfdGFpbCwgUlhSUENfQkFDS0xPR19NQVgpLCA+PSwKKwkJICBjb25uX2NvdW50KTsKKworCWlmIChjYWxsX2NvdW50ID09IDApCisJCXJldHVybiBOVUxMOworCisJaWYgKCFjb25uKSB7CisJCS8qIE5vIGNvbm5lY3Rpb24uICBXZSdyZSBnb2luZyB0byBuZWVkIGEgcGVlciB0byBzdGFydCBvZmYKKwkJICogd2l0aC4gIElmIG9uZSBkb2Vzbid0IHlldCBleGlzdCwgdXNlIGEgc3BhcmUgZnJvbSB0aGUKKwkJICogcHJlYWxsb2NhdGlvbiBzZXQuICBXZSBkdW1wIHRoZSBhZGRyZXNzIGludG8gdGhlIHNwYXJlIGluCisJCSAqIGFudGljaXBhdGlvbiAtIGFuZCB0byBzYXZlIG9uIHN0YWNrIHNwYWNlLgorCQkgKi8KKwkJeHBlZXIgPSBiLT5wZWVyX2JhY2tsb2dbcGVlcl90YWlsXTsKKwkJaWYgKHJ4cnBjX2V4dHJhY3RfYWRkcl9mcm9tX3NrYigmeHBlZXItPnNyeCwgc2tiKSA8IDApCisJCQlyZXR1cm4gTlVMTDsKKworCQlwZWVyID0gcnhycGNfbG9va3VwX2luY29taW5nX3BlZXIobG9jYWwsIHhwZWVyKTsKKwkJaWYgKHBlZXIgPT0geHBlZXIpIHsKKwkJCWItPnBlZXJfYmFja2xvZ1twZWVyX3RhaWxdID0gTlVMTDsKKwkJCXNtcF9zdG9yZV9yZWxlYXNlKCZiLT5wZWVyX2JhY2tsb2dfdGFpbCwKKwkJCQkJICAocGVlcl90YWlsICsgMSkgJgorCQkJCQkgIChSWFJQQ19CQUNLTE9HX01BWCAtIDEpKTsKKwkJfQorCisJCS8qIE5vdyBhbGxvY2F0ZSBhbmQgc2V0IHVwIHRoZSBjb25uZWN0aW9uICovCisJCWNvbm4gPSBiLT5jb25uX2JhY2tsb2dbY29ubl90YWlsXTsKKwkJYi0+Y29ubl9iYWNrbG9nW2Nvbm5fdGFpbF0gPSBOVUxMOworCQlzbXBfc3RvcmVfcmVsZWFzZSgmYi0+Y29ubl9iYWNrbG9nX3RhaWwsCisJCQkJICAoY29ubl90YWlsICsgMSkgJiAoUlhSUENfQkFDS0xPR19NQVggLSAxKSk7CisJCXJ4cnBjX2dldF9sb2NhbChsb2NhbCk7CisJCWNvbm4tPnBhcmFtcy5sb2NhbCA9IGxvY2FsOworCQljb25uLT5wYXJhbXMucGVlciA9IHBlZXI7CisJCXJ4cnBjX3NlZV9jb25uZWN0aW9uKGNvbm4pOworCQlyeHJwY19uZXdfaW5jb21pbmdfY29ubmVjdGlvbihjb25uLCBza2IpOworCX0gZWxzZSB7CisJCXJ4cnBjX2dldF9jb25uZWN0aW9uKGNvbm4pOworCX0KKworCS8qIEFuZCBub3cgd2UgY2FuIGFsbG9jYXRlIGFuZCBzZXQgdXAgYSBuZXcgY2FsbCAqLworCWNhbGwgPSBiLT5jYWxsX2JhY2tsb2dbY2FsbF90YWlsXTsKKwliLT5jYWxsX2JhY2tsb2dbY2FsbF90YWlsXSA9IE5VTEw7CisJc21wX3N0b3JlX3JlbGVhc2UoJmItPmNhbGxfYmFja2xvZ190YWlsLAorCQkJICAoY2FsbF90YWlsICsgMSkgJiAoUlhSUENfQkFDS0xPR19NQVggLSAxKSk7CisKKwlyeHJwY19zZWVfY2FsbChjYWxsKTsKKwljYWxsLT5jb25uID0gY29ubjsKKwljYWxsLT5wZWVyID0gcnhycGNfZ2V0X3BlZXIoY29ubi0+cGFyYW1zLnBlZXIpOworCXJldHVybiBjYWxsOworfQorCisvKgorICogU2V0IHVwIGEgbmV3IGluY29taW5nIGNhbGwuICBDYWxsZWQgaW4gQkggY29udGV4dCB3aXRoIHRoZSBSQ1UgcmVhZCBsb2NrCisgKiBoZWxkLgorICoKKyAqIElmIHRoaXMgaXMgZm9yIGEga2VybmVsIHNlcnZpY2UsIHdoZW4gd2UgYWxsb2NhdGUgdGhlIGNhbGwsIGl0IHdpbGwgaGF2ZQorICogdGhyZWUgcmVmcyBvbiBpdDogKDEpIHRoZSBrZXJuZWwgc2VydmljZSwgKDIpIHRoZSB1c2VyX2NhbGxfSUQgdHJlZSwgKDMpIHRoZQorICogcmV0YWluZXIgcmVmIG9idGFpbmVkIGZyb20gdGhlIGJhY2tsb2cgYnVmZmVyLiAgUHJlYWxsb2MgY2FsbHMgZm9yIHVzZXJzcGFjZQorICogc2VydmljZXMgb25seSBoYXZlIHRoZSByZWYgZnJvbSB0aGUgYmFja2xvZyBidWZmZXIuICBXZSB3YW50IHRvIHBhc3MgdGhpcworICogcmVmIHRvIG5vbi1CSCBjb250ZXh0IHRvIGRpc3Bvc2Ugb2YuCisgKgorICogSWYgd2Ugd2FudCB0byByZXBvcnQgYW4gZXJyb3IsIHdlIG1hcmsgdGhlIHNrYiB3aXRoIHRoZSBwYWNrZXQgdHlwZSBhbmQKKyAqIGFib3J0IGNvZGUgYW5kIHJldHVybiBOVUxMLgorICovCitzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfbmV3X2luY29taW5nX2NhbGwoc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwKKwkJCQkJICAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOworCXN0cnVjdCByeHJwY19zb2NrICpyeDsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwl1MTYgc2VydmljZV9pZCA9IHNwLT5oZHIuc2VydmljZUlkOwogCiAJX2VudGVyKCIiKTsKIAotCXNwID0gcnhycGNfc2tiKHNrYik7CisJLyogR2V0IHRoZSBzb2NrZXQgcHJvdmlkaW5nIHRoZSBzZXJ2aWNlICovCisJcnggPSByY3VfZGVyZWZlcmVuY2UobG9jYWwtPnNlcnZpY2UpOworCWlmIChzZXJ2aWNlX2lkID09IHJ4LT5zcnguc3J4X3NlcnZpY2UpCisJCWdvdG8gZm91bmRfc2VydmljZTsKIAotCS8qIGdldCBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlIHRvIHNlbmQgdG8gdGhlIHNlcnZlciBhcHAgKi8KLQlub3RpZmljYXRpb24gPSBhbGxvY19za2IoMCwgR0ZQX05PRlMpOwotCWlmICghbm90aWZpY2F0aW9uKSB7Ci0JCV9kZWJ1Zygibm8gbWVtb3J5Iik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3Jfbm9mcmVlOwotCX0KLQlyeHJwY19uZXdfc2tiKG5vdGlmaWNhdGlvbik7Ci0Jbm90aWZpY2F0aW9uLT5tYXJrID0gUlhSUENfU0tCX01BUktfTkVXX0NBTEw7Ci0KLQljb25uID0gcnhycGNfaW5jb21pbmdfY29ubmVjdGlvbihsb2NhbCwgc3J4LCBza2IpOwotCWlmIChJU19FUlIoY29ubikpIHsKLQkJX2RlYnVnKCJubyBjb25uIik7Ci0JCXJldCA9IFBUUl9FUlIoY29ubik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JY2FsbCA9IHJ4cnBjX2luY29taW5nX2NhbGwocngsIGNvbm4sIHNrYik7Ci0JcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7Ci0JaWYgKElTX0VSUihjYWxsKSkgewotCQlfZGVidWcoIm5vIGNhbGwiKTsKLQkJcmV0ID0gUFRSX0VSUihjYWxsKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQkvKiBhdHRhY2ggdGhlIGNhbGwgdG8gdGhlIHNvY2tldCAqLwotCXJlYWRfbG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOwotCWlmIChyeC0+c2suc2tfc3RhdGUgPT0gUlhSUENfQ0xPU0UpCi0JCWdvdG8gaW52YWxpZF9zZXJ2aWNlOwotCi0Jd3JpdGVfbG9jaygmcngtPmNhbGxfbG9jayk7Ci0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfSU5JVF9BQ0NFUFQsICZjYWxsLT5mbGFncykpIHsKLQkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7Ci0KLQkJc3Bpbl9sb2NrKCZjYWxsLT5jb25uLT5zdGF0ZV9sb2NrKTsKLQkJaWYgKHNwLT5oZHIuc2VjdXJpdHlJbmRleCA+IDAgJiYKLQkJICAgIGNhbGwtPmNvbm4tPnN0YXRlID09IFJYUlBDX0NPTk5fU0VSVklDRV9VTlNFQ1VSRUQpIHsKLQkJCV9kZWJ1ZygiYXdhaXQgY29ubiBzZWMiKTsKLQkJCWxpc3RfYWRkX3RhaWwoJmNhbGwtPmFjY2VwdF9saW5rLCAmcngtPnNlY3VyZXEpOwotCQkJY2FsbC0+Y29ubi0+c3RhdGUgPSBSWFJQQ19DT05OX1NFUlZJQ0VfQ0hBTExFTkdJTkc7Ci0JCQlzZXRfYml0KFJYUlBDX0NPTk5fRVZfQ0hBTExFTkdFLCAmY2FsbC0+Y29ubi0+ZXZlbnRzKTsKLQkJCXJ4cnBjX3F1ZXVlX2Nvbm4oY2FsbC0+Y29ubik7Ci0JCX0gZWxzZSB7Ci0JCQlfZGVidWcoImNvbm4gcmVhZHkiKTsKLQkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HOwotCQkJbGlzdF9hZGRfdGFpbCgmY2FsbC0+YWNjZXB0X2xpbmssICZyeC0+YWNjZXB0cSk7Ci0JCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQkJCW5zcCA9IHJ4cnBjX3NrYihub3RpZmljYXRpb24pOwotCQkJbnNwLT5jYWxsID0gY2FsbDsKLQotCQkJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSksID49LCAzKTsKLQotCQkJX2RlYnVnKCJub3RpZnkiKTsKLQkJCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7Ci0JCQlyZXQgPSByeHJwY19xdWV1ZV9yY3Zfc2tiKGNhbGwsIG5vdGlmaWNhdGlvbiwgdHJ1ZSwKLQkJCQkJCSAgZmFsc2UpOwotCQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCQkJbm90aWZpY2F0aW9uID0gTlVMTDsKLQkJCUJVR19PTihyZXQgPCAwKTsKLQkJfQotCQlzcGluX3VubG9jaygmY2FsbC0+Y29ubi0+c3RhdGVfbG9jayk7Ci0KLQkJX2RlYnVnKCJxdWV1ZWQiKTsKLQl9Ci0Jd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKLQotCV9kZWJ1ZygicHJvY2VzcyIpOwotCXJ4cnBjX2Zhc3RfcHJvY2Vzc19wYWNrZXQoY2FsbCwgc2tiKTsKLQotCV9kZWJ1ZygiZG9uZSIpOwotCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7Ci0JcnhycGNfZnJlZV9za2Iobm90aWZpY2F0aW9uKTsKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQlfbGVhdmUoIiA9IDAiKTsKLQlyZXR1cm4gMDsKLQotaW52YWxpZF9zZXJ2aWNlOgotCV9kZWJ1ZygiaW52YWxpZCIpOwotCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7Ci0KLQlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCWlmICghdGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSAmJgotCSAgICAhdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VWX1JFTEVBU0UsICZjYWxsLT5ldmVudHMpKSB7Ci0JCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwotCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOwotCX0KLQlyZWFkX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JcmV0ID0gLUVDT05OUkVGVVNFRDsKLWVycm9yOgotCXJ4cnBjX2ZyZWVfc2tiKG5vdGlmaWNhdGlvbik7Ci1lcnJvcl9ub2ZyZWU6Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIGFjY2VwdCBpbmNvbWluZyBjYWxscyB0aGF0IG5lZWQgcGVlciwgdHJhbnNwb3J0IGFuZC9vciBjb25uZWN0aW9uIHNldHRpbmcgdXAKLSAqIC0gdGhlIHBhY2tldHMgd2UgZ2V0IGFyZSBhbGwgaW5jb21pbmcgY2xpZW50IERBVEEgcGFja2V0cyB0aGF0IGhhdmUgc2VxID09IDEKLSAqLwotdm9pZCByeHJwY19hY2NlcHRfaW5jb21pbmdfY2FsbHMoc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCkKLXsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCXN0cnVjdCBzb2NrYWRkcl9yeHJwYyBzcng7Ci0Jc3RydWN0IHJ4cnBjX3NvY2sgKnJ4OwotCXN0cnVjdCByeHJwY193aXJlX2hlYWRlciB3aGRyOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IHJldDsKLQotCV9lbnRlcigiJWQiLCBsb2NhbC0+ZGVidWdfaWQpOwotCi0Jc2tiID0gc2tiX2RlcXVldWUoJmxvY2FsLT5hY2NlcHRfcXVldWUpOwotCWlmICghc2tiKSB7Ci0JCV9sZWF2ZSgiXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCV9uZXQoImluY29taW5nIGNhbGwgc2tiICVwIiwgc2tiKTsKLQotCXNwID0gcnhycGNfc2tiKHNrYik7Ci0KLQkvKiBTZXQgdXAgYSByZXNwb25zZSBwYWNrZXQgaGVhZGVyIGluIGNhc2Ugd2UgbmVlZCBpdCAqLwotCXdoZHIuZXBvY2gJPSBodG9ubChzcC0+aGRyLmVwb2NoKTsKLQl3aGRyLmNpZAk9IGh0b25sKHNwLT5oZHIuY2lkKTsKLQl3aGRyLmNhbGxOdW1iZXIJPSBodG9ubChzcC0+aGRyLmNhbGxOdW1iZXIpOwotCXdoZHIuc2VxCT0gaHRvbmwoc3AtPmhkci5zZXEpOwotCXdoZHIuc2VyaWFsCT0gMDsKLQl3aGRyLmZsYWdzCT0gMDsKLQl3aGRyLnR5cGUJPSAwOwotCXdoZHIudXNlclN0YXR1cwk9IDA7Ci0Jd2hkci5zZWN1cml0eUluZGV4ID0gc3AtPmhkci5zZWN1cml0eUluZGV4OwotCXdoZHIuX3JzdmQJPSAwOwotCXdoZHIuc2VydmljZUlkCT0gaHRvbnMoc3AtPmhkci5zZXJ2aWNlSWQpOwotCi0JaWYgKHJ4cnBjX2V4dHJhY3RfYWRkcl9mcm9tX3NrYigmc3J4LCBza2IpIDwgMCkKLQkJZ290byBkcm9wOwotCi0JLyogZ2V0IHRoZSBzb2NrZXQgcHJvdmlkaW5nIHRoZSBzZXJ2aWNlICovCi0JcmVhZF9sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShyeCwgJmxvY2FsLT5zZXJ2aWNlcywgbGlzdGVuX2xpbmspIHsKLQkJaWYgKHJ4LT5zcnguc3J4X3NlcnZpY2UgPT0gc3AtPmhkci5zZXJ2aWNlSWQgJiYKLQkJICAgIHJ4LT5zay5za19zdGF0ZSAhPSBSWFJQQ19DTE9TRSkKLQkJCWdvdG8gZm91bmRfc2VydmljZTsKLQl9Ci0JcmVhZF91bmxvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKLQlnb3RvIGludmFsaWRfc2VydmljZTsKKwl0cmFjZV9yeHJwY19hYm9ydCgiSU5WIiwgc3AtPmhkci5jaWQsIHNwLT5oZHIuY2FsbE51bWJlciwgc3AtPmhkci5zZXEsCisJCQkgIFJYX0lOVkFMSURfT1BFUkFUSU9OLCBFT1BOT1RTVVBQKTsKKwlza2ItPm1hcmsgPSBSWFJQQ19TS0JfTUFSS19MT0NBTF9BQk9SVDsKKwlza2ItPnByaW9yaXR5ID0gUlhfSU5WQUxJRF9PUEVSQVRJT047CisJX2xlYXZlKCIgPSBOVUxMIFtzZXJ2aWNlXSIpOworCXJldHVybiBOVUxMOwogCiBmb3VuZF9zZXJ2aWNlOgotCV9kZWJ1ZygiZm91bmQgc2VydmljZSAlaGQiLCByeC0+c3J4LnNyeF9zZXJ2aWNlKTsKLQlpZiAoc2tfYWNjZXB0cV9pc19mdWxsKCZyeC0+c2spKQotCQlnb3RvIGJhY2tsb2dfZnVsbDsKLQlza19hY2NlcHRxX2FkZGVkKCZyeC0+c2spOwotCXNvY2tfaG9sZCgmcngtPnNrKTsKLQlyZWFkX3VubG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCXNwaW5fbG9jaygmcngtPmluY29taW5nX2xvY2spOworCWlmIChyeC0+c2suc2tfc3RhdGUgPT0gUlhSUENfQ0xPU0UpIHsKKwkJdHJhY2VfcnhycGNfYWJvcnQoIkNMUyIsIHNwLT5oZHIuY2lkLCBzcC0+aGRyLmNhbGxOdW1iZXIsCisJCQkJICBzcC0+aGRyLnNlcSwgUlhfSU5WQUxJRF9PUEVSQVRJT04sIEVTSFVURE9XTik7CisJCXNrYi0+bWFyayA9IFJYUlBDX1NLQl9NQVJLX0xPQ0FMX0FCT1JUOworCQlza2ItPnByaW9yaXR5ID0gUlhfSU5WQUxJRF9PUEVSQVRJT047CisJCV9sZWF2ZSgiID0gTlVMTCBbY2xvc2VdIik7CisJCWNhbGwgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CiAKLQlyZXQgPSByeHJwY19hY2NlcHRfaW5jb21pbmdfY2FsbChsb2NhbCwgcngsIHNrYiwgJnNyeCk7Ci0JaWYgKHJldCA8IDApCi0JCXNrX2FjY2VwdHFfcmVtb3ZlZCgmcngtPnNrKTsKLQlzb2NrX3B1dCgmcngtPnNrKTsKLQlzd2l0Y2ggKHJldCkgewotCWNhc2UgLUVDT05OUkVTRVQ6IC8qIG9sZCBjYWxscyBhcmUgaWdub3JlZCAqLwotCWNhc2UgLUVDT05OQUJPUlRFRDogLyogYWJvcnRlZCBjYWxscyBhcmUgcmVhYm9ydGVkIG9yIGlnbm9yZWQgKi8KLQljYXNlIDA6Ci0JCXJldHVybjsKLQljYXNlIC1FQ09OTlJFRlVTRUQ6Ci0JCWdvdG8gaW52YWxpZF9zZXJ2aWNlOwotCWNhc2UgLUVCVVNZOgotCQlnb3RvIGJ1c3k7Ci0JY2FzZSAtRUtFWVJFSkVDVEVEOgotCQlnb3RvIHNlY3VyaXR5X21pc21hdGNoOworCWNhbGwgPSByeHJwY19hbGxvY19pbmNvbWluZ19jYWxsKHJ4LCBsb2NhbCwgY29ubiwgc2tiKTsKKwlpZiAoIWNhbGwpIHsKKwkJc2tiLT5tYXJrID0gUlhSUENfU0tCX01BUktfQlVTWTsKKwkJX2xlYXZlKCIgPSBOVUxMIFtidXN5XSIpOworCQljYWxsID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJdHJhY2VfcnhycGNfcmVjZWl2ZShjYWxsLCByeHJwY19yZWNlaXZlX2luY29taW5nLAorCQkJICAgIHNwLT5oZHIuc2VyaWFsLCBzcC0+aGRyLnNlcSk7CisKKwkvKiBNYWtlIHRoZSBjYWxsIGxpdmUuICovCisJcnhycGNfaW5jb21pbmdfY2FsbChyeCwgY2FsbCwgc2tiKTsKKwljb25uID0gY2FsbC0+Y29ubjsKKworCWlmIChyeC0+bm90aWZ5X25ld19jYWxsKQorCQlyeC0+bm90aWZ5X25ld19jYWxsKCZyeC0+c2ssIGNhbGwsIGNhbGwtPnVzZXJfY2FsbF9JRCk7CisJZWxzZQorCQlza19hY2NlcHRxX2FkZGVkKCZyeC0+c2spOworCisJc3Bpbl9sb2NrKCZjb25uLT5zdGF0ZV9sb2NrKTsKKwlzd2l0Y2ggKGNvbm4tPnN0YXRlKSB7CisJY2FzZSBSWFJQQ19DT05OX1NFUlZJQ0VfVU5TRUNVUkVEOgorCQljb25uLT5zdGF0ZSA9IFJYUlBDX0NPTk5fU0VSVklDRV9DSEFMTEVOR0lORzsKKwkJc2V0X2JpdChSWFJQQ19DT05OX0VWX0NIQUxMRU5HRSwgJmNhbGwtPmNvbm4tPmV2ZW50cyk7CisJCXJ4cnBjX3F1ZXVlX2Nvbm4oY2FsbC0+Y29ubik7CisJCWJyZWFrOworCisJY2FzZSBSWFJQQ19DT05OX1NFUlZJQ0U6CisJCXdyaXRlX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQlpZiAocngtPmRpc2NhcmRfbmV3X2NhbGwpCisJCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX1JFQ1ZfUkVRVUVTVDsKKwkJZWxzZQorCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0NFUFRJTkc7CisJCXdyaXRlX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJCWJyZWFrOworCisJY2FzZSBSWFJQQ19DT05OX1JFTU9URUxZX0FCT1JURUQ6CisJCXJ4cnBjX3NldF9jYWxsX2NvbXBsZXRpb24oY2FsbCwgUlhSUENfQ0FMTF9SRU1PVEVMWV9BQk9SVEVELAorCQkJCQkgIGNvbm4tPnJlbW90ZV9hYm9ydCwgRUNPTk5BQk9SVEVEKTsKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19DT05OX0xPQ0FMTFlfQUJPUlRFRDoKKwkJcnhycGNfYWJvcnRfY2FsbCgiQ09OIiwgY2FsbCwgc3AtPmhkci5zZXEsCisJCQkJIGNvbm4tPmxvY2FsX2Fib3J0LCBFQ09OTkFCT1JURUQpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CisJc3Bpbl91bmxvY2soJmNvbm4tPnN0YXRlX2xvY2spOwogCi1iYWNrbG9nX2Z1bGw6Ci0JcmVhZF91bmxvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKLWJ1c3k6Ci0JcnhycGNfYnVzeShsb2NhbCwgJnNyeCwgJndoZHIpOwotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci0JcmV0dXJuOworCWlmIChjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0NFUFRJTkcpCisJCXJ4cnBjX25vdGlmeV9zb2NrZXQoY2FsbCk7CiAKLWRyb3A6Ci0JcnhycGNfZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm47CisJLyogV2UgaGF2ZSB0byBkaXNjYXJkIHRoZSBwcmVhbGxvYyBxdWV1ZSdzIHJlZiBoZXJlIGFuZCByZWx5IG9uIGEKKwkgKiBjb21iaW5hdGlvbiBvZiB0aGUgUkNVIHJlYWQgbG9jayBhbmQgcmVmcyBoZWxkIGVpdGhlciBieSB0aGUgc29ja2V0CisJICogKHJlY3Ztc2cgcXVldWUsIHRvLWJlLWFjY2VwdGVkIHF1ZXVlIG9yIHVzZXIgSUQgdHJlZSkgb3IgdGhlIGtlcm5lbAorCSAqIHNlcnZpY2UgdG8gcHJldmVudCB0aGUgY2FsbCBmcm9tIGJlaW5nIGRlYWxsb2NhdGVkIHRvbyBlYXJseS4KKwkgKi8KKwlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CiAKLWludmFsaWRfc2VydmljZToKLQlza2ItPnByaW9yaXR5ID0gUlhfSU5WQUxJRF9PUEVSQVRJT047Ci0JcnhycGNfcmVqZWN0X3BhY2tldChsb2NhbCwgc2tiKTsKLQlyZXR1cm47Ci0KLQkvKiBjYW4ndCBjaGFuZ2UgY29ubmVjdGlvbiBzZWN1cml0eSB0eXBlIG1pZC1mbG93ICovCi1zZWN1cml0eV9taXNtYXRjaDoKLQlza2ItPnByaW9yaXR5ID0gUlhfUFJPVE9DT0xfRVJST1I7Ci0JcnhycGNfcmVqZWN0X3BhY2tldChsb2NhbCwgc2tiKTsKLQlyZXR1cm47CisJX2xlYXZlKCIgPSAlcHslZH0iLCBjYWxsLCBjYWxsLT5kZWJ1Z19pZCk7CitvdXQ6CisJc3Bpbl91bmxvY2soJnJ4LT5pbmNvbWluZ19sb2NrKTsKKwlyZXR1cm4gY2FsbDsKIH0KIAogLyoKQEAgLTI4NSw3ICs0MzAsOCBAQAogICogLSBhc3NpZ24gdGhlIHVzZXIgY2FsbCBJRCB0byB0aGUgY2FsbCBhdCB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlCiAgKi8KIHN0cnVjdCByeHJwY19jYWxsICpyeHJwY19hY2NlcHRfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqcngsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCkKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lELAorCQkJCSAgICAgcnhycGNfbm90aWZ5X3J4X3Qgbm90aWZ5X3J4KQogewogCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwogCXN0cnVjdCByYl9ub2RlICpwYXJlbnQsICoqcHA7CkBAIC0yOTcsMTIgKzQ0MywxMyBAQAogCiAJd3JpdGVfbG9jaygmcngtPmNhbGxfbG9jayk7CiAKLQlyZXQgPSAtRU5PREFUQTsKLQlpZiAobGlzdF9lbXB0eSgmcngtPmFjY2VwdHEpKQotCQlnb3RvIG91dDsKKwlpZiAobGlzdF9lbXB0eSgmcngtPnRvX2JlX2FjY2VwdGVkKSkgeworCQl3cml0ZV91bmxvY2soJnJ4LT5jYWxsX2xvY2spOworCQlrbGVhdmUoIiA9IC1FTk9EQVRBIFtlbXB0eV0iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RBVEEpOworCX0KIAogCS8qIGNoZWNrIHRoZSB1c2VyIElEIGlzbid0IGFscmVhZHkgaW4gdXNlICovCi0JcmV0ID0gLUVCQURTTFQ7CiAJcHAgPSAmcngtPmNhbGxzLnJiX25vZGU7CiAJcGFyZW50ID0gTlVMTDsKIAl3aGlsZSAoKnBwKSB7CkBAIC0zMTQsNjIgKzQ2MSw1OSBAQAogCQllbHNlIGlmICh1c2VyX2NhbGxfSUQgPiBjYWxsLT51c2VyX2NhbGxfSUQpCiAJCQlwcCA9ICYoKnBwKS0+cmJfcmlnaHQ7CiAJCWVsc2UKLQkJCWdvdG8gb3V0OworCQkJZ290byBpZF9pbl91c2U7CiAJfQogCi0JLyogZGVxdWV1ZSB0aGUgZmlyc3QgY2FsbCBhbmQgY2hlY2sgaXQncyBzdGlsbCB2YWxpZCAqLwotCWNhbGwgPSBsaXN0X2VudHJ5KHJ4LT5hY2NlcHRxLm5leHQsIHN0cnVjdCByeHJwY19jYWxsLCBhY2NlcHRfbGluayk7CisJLyogRGVxdWV1ZSB0aGUgZmlyc3QgY2FsbCBhbmQgY2hlY2sgaXQncyBzdGlsbCB2YWxpZC4gIFdlIGdhaW4KKwkgKiByZXNwb25zaWJpbGl0eSBmb3IgdGhlIHF1ZXVlJ3MgcmVmZXJlbmNlLgorCSAqLworCWNhbGwgPSBsaXN0X2VudHJ5KHJ4LT50b19iZV9hY2NlcHRlZC5uZXh0LAorCQkJICBzdHJ1Y3QgcnhycGNfY2FsbCwgYWNjZXB0X2xpbmspOwogCWxpc3RfZGVsX2luaXQoJmNhbGwtPmFjY2VwdF9saW5rKTsKIAlza19hY2NlcHRxX3JlbW92ZWQoJnJ4LT5zayk7CisJcnhycGNfc2VlX2NhbGwoY2FsbCk7CiAKIAl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKIAlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7CiAJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0NFUFRJTkc6CiAJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfUkVDVl9SRVFVRVNUOwogCQlicmVhazsKLQljYXNlIFJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRDoKLQljYXNlIFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOgotCQlyZXQgPSAtRUNPTk5BQk9SVEVEOworCWNhc2UgUlhSUENfQ0FMTF9DT01QTEVURToKKwkJcmV0ID0gY2FsbC0+ZXJyb3I7CiAJCWdvdG8gb3V0X3JlbGVhc2U7Ci0JY2FzZSBSWFJQQ19DQUxMX05FVFdPUktfRVJST1I6Ci0JCXJldCA9IGNhbGwtPmNvbm4tPmVycm9yOwotCQlnb3RvIG91dF9yZWxlYXNlOwotCWNhc2UgUlhSUENfQ0FMTF9ERUFEOgotCQlyZXQgPSAtRVRJTUU7Ci0JCWdvdG8gb3V0X2Rpc2NhcmQ7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQogCiAJLyogZm9ybWFsaXNlIHRoZSBhY2NlcHRhbmNlICovCisJY2FsbC0+bm90aWZ5X3J4ID0gbm90aWZ5X3J4OwogCWNhbGwtPnVzZXJfY2FsbF9JRCA9IHVzZXJfY2FsbF9JRDsKKwlyeHJwY19nZXRfY2FsbChjYWxsLCByeHJwY19jYWxsX2dvdF91c2VyaWQpOwogCXJiX2xpbmtfbm9kZSgmY2FsbC0+c29ja19ub2RlLCBwYXJlbnQsIHBwKTsKIAlyYl9pbnNlcnRfY29sb3IoJmNhbGwtPnNvY2tfbm9kZSwgJnJ4LT5jYWxscyk7CiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpKQogCQlCVUcoKTsKLQlpZiAodGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VWX0FDQ0VQVEVELCAmY2FsbC0+ZXZlbnRzKSkKLQkJQlVHKCk7Ci0JcnhycGNfcXVldWVfY2FsbChjYWxsKTsKIAotCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwogCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CiAJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKwlyeHJwY19ub3RpZnlfc29ja2V0KGNhbGwpOworCXJ4cnBjX3NlcnZpY2VfcHJlYWxsb2MocngsIEdGUF9LRVJORUwpOwogCV9sZWF2ZSgiID0gJXB7JWR9IiwgY2FsbCwgY2FsbC0+ZGVidWdfaWQpOwogCXJldHVybiBjYWxsOwogCi0JLyogaWYgdGhlIGNhbGwgaXMgYWxyZWFkeSBkeWluZyBvciBkZWFkLCB0aGVuIHdlIGxlYXZlIHRoZSBzb2NrZXQncyByZWYKLQkgKiBvbiBpdCB0byBiZSByZWxlYXNlZCBieSByeHJwY19kZWFkX2NhbGxfZXhwaXJlZCgpIGFzIGluZHVjZWQgYnkKLQkgKiByeHJwY19yZWxlYXNlX2NhbGwoKSAqLwogb3V0X3JlbGVhc2U6CiAJX2RlYnVnKCJyZWxlYXNlICVwIiwgY2FsbCk7Ci0JaWYgKCF0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpICYmCi0JICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfUkVMRUFTRSwgJmNhbGwtPmV2ZW50cykpCi0JCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci1vdXRfZGlzY2FyZDoKIAl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCV9kZWJ1ZygiZGlzY2FyZCAlcCIsIGNhbGwpOwotb3V0OgogCXdyaXRlX3VubG9jaygmcngtPmNhbGxfbG9jayk7CisJcnhycGNfcmVsZWFzZV9jYWxsKHJ4LCBjYWxsKTsKKwlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CisJZ290byBvdXQ7CisKK2lkX2luX3VzZToKKwlyZXQgPSAtRUJBRFNMVDsKKwl3cml0ZV91bmxvY2soJnJ4LT5jYWxsX2xvY2spOworb3V0OgorCXJ4cnBjX3NlcnZpY2VfcHJlYWxsb2MocngsIEdGUF9LRVJORUwpOwogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CkBAIC0zODEsNiArNTI1LDcgQEAKIGludCByeHJwY19yZWplY3RfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqcngpCiB7CiAJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CisJYm9vbCBhYm9ydCA9IGZhbHNlOwogCWludCByZXQ7CiAKIAlfZW50ZXIoIiIpOwpAQCAtMzg5LDg4ICs1MzQsNzMgQEAKIAogCXdyaXRlX2xvY2soJnJ4LT5jYWxsX2xvY2spOwogCi0JcmV0ID0gLUVOT0RBVEE7Ci0JaWYgKGxpc3RfZW1wdHkoJnJ4LT5hY2NlcHRxKSkKLQkJZ290byBvdXQ7CisJaWYgKGxpc3RfZW1wdHkoJnJ4LT50b19iZV9hY2NlcHRlZCkpIHsKKwkJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKwkJcmV0dXJuIC1FTk9EQVRBOworCX0KIAotCS8qIGRlcXVldWUgdGhlIGZpcnN0IGNhbGwgYW5kIGNoZWNrIGl0J3Mgc3RpbGwgdmFsaWQgKi8KLQljYWxsID0gbGlzdF9lbnRyeShyeC0+YWNjZXB0cS5uZXh0LCBzdHJ1Y3QgcnhycGNfY2FsbCwgYWNjZXB0X2xpbmspOworCS8qIERlcXVldWUgdGhlIGZpcnN0IGNhbGwgYW5kIGNoZWNrIGl0J3Mgc3RpbGwgdmFsaWQuICBXZSBnYWluCisJICogcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBxdWV1ZSdzIHJlZmVyZW5jZS4KKwkgKi8KKwljYWxsID0gbGlzdF9lbnRyeShyeC0+dG9fYmVfYWNjZXB0ZWQubmV4dCwKKwkJCSAgc3RydWN0IHJ4cnBjX2NhbGwsIGFjY2VwdF9saW5rKTsKIAlsaXN0X2RlbF9pbml0KCZjYWxsLT5hY2NlcHRfbGluayk7CiAJc2tfYWNjZXB0cV9yZW1vdmVkKCZyeC0+c2spOworCXJ4cnBjX3NlZV9jYWxsKGNhbGwpOwogCiAJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CiAJc3dpdGNoIChjYWxsLT5zdGF0ZSkgewogCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HOgotCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX0JVU1k7Ci0JCWlmICh0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfUkVKRUNUX0JVU1ksICZjYWxsLT5ldmVudHMpKQotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQkJcmV0ID0gMDsKLQkJZ290byBvdXRfcmVsZWFzZTsKLQljYXNlIFJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRDoKLQljYXNlIFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOgotCQlyZXQgPSAtRUNPTk5BQk9SVEVEOwotCQlnb3RvIG91dF9yZWxlYXNlOwotCWNhc2UgUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SOgotCQlyZXQgPSBjYWxsLT5jb25uLT5lcnJvcjsKLQkJZ290byBvdXRfcmVsZWFzZTsKLQljYXNlIFJYUlBDX0NBTExfREVBRDoKLQkJcmV0ID0gLUVUSU1FOworCQlfX3J4cnBjX2Fib3J0X2NhbGwoIlJFSiIsIGNhbGwsIDEsIFJYX1VTRVJfQUJPUlQsIEVDT05OQUJPUlRFRCk7CisJCWFib3J0ID0gdHJ1ZTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBSWFJQQ19DQUxMX0NPTVBMRVRFOgorCQlyZXQgPSBjYWxsLT5lcnJvcjsKIAkJZ290byBvdXRfZGlzY2FyZDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CiAKLQkvKiBpZiB0aGUgY2FsbCBpcyBhbHJlYWR5IGR5aW5nIG9yIGRlYWQsIHRoZW4gd2UgbGVhdmUgdGhlIHNvY2tldCdzIHJlZgotCSAqIG9uIGl0IHRvIGJlIHJlbGVhc2VkIGJ5IHJ4cnBjX2RlYWRfY2FsbF9leHBpcmVkKCkgYXMgaW5kdWNlZCBieQotCSAqIHJ4cnBjX3JlbGVhc2VfY2FsbCgpICovCi1vdXRfcmVsZWFzZToKLQlfZGVidWcoInJlbGVhc2UgJXAiLCBjYWxsKTsKLQlpZiAoIXRlc3RfYml0KFJYUlBDX0NBTExfUkVMRUFTRUQsICZjYWxsLT5mbGFncykgJiYKLQkgICAgIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9SRUxFQVNFLCAmY2FsbC0+ZXZlbnRzKSkKLQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKIG91dF9kaXNjYXJkOgogCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JX2RlYnVnKCJkaXNjYXJkICVwIiwgY2FsbCk7Ci1vdXQ6CiAJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKwlpZiAoYWJvcnQpIHsKKwkJcnhycGNfc2VuZF9jYWxsX3BhY2tldChjYWxsLCBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVCk7CisJCXJ4cnBjX3JlbGVhc2VfY2FsbChyeCwgY2FsbCk7CisJCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0KTsKKwl9CisJcnhycGNfc2VydmljZV9wcmVhbGxvYyhyeCwgR0ZQX0tFUk5FTCk7CiAJX2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIAotLyoqCi0gKiByeHJwY19rZXJuZWxfYWNjZXB0X2NhbGwgLSBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIGFjY2VwdCBhbiBpbmNvbWluZyBjYWxsCi0gKiBAc29jazogVGhlIHNvY2tldCBvbiB3aGljaCB0aGUgaW1wZW5kaW5nIGNhbGwgaXMgd2FpdGluZwotICogQHVzZXJfY2FsbF9JRDogVGhlIHRhZyB0byBhdHRhY2ggdG8gdGhlIGNhbGwKKy8qCisgKiByeHJwY19rZXJuZWxfY2hhcmdlX2FjY2VwdCAtIENoYXJnZSB1cCBzb2NrZXQgd2l0aCBwcmVhbGxvY2F0ZWQgY2FsbHMKKyAqIEBzb2NrOiBUaGUgc29ja2V0IG9uIHdoaWNoIHRvIHByZWFsbG9jYXRlCisgKiBAbm90aWZ5X3J4OiBFdmVudCBub3RpZmljYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBjYWxsCisgKiBAdXNlcl9hdHRhY2hfY2FsbDogRnVuYyB0byBhdHRhY2ggY2FsbCB0byB1c2VyX2NhbGxfSUQKKyAqIEB1c2VyX2NhbGxfSUQ6IFRoZSB0YWcgdG8gYXR0YWNoIHRvIHRoZSBwcmVhbGxvY2F0ZWQgY2FsbAorICogQGdmcDogVGhlIGFsbG9jYXRpb24gY29uZGl0aW9ucy4KICAqCi0gKiBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIGFjY2VwdCBhbiBpbmNvbWluZyBjYWxsLCBhc3N1bWluZyB0aGUgaW5jb21pbmcKLSAqIGNhbGwgaXMgc3RpbGwgdmFsaWQuCi0gKi8KLXN0cnVjdCByeHJwY19jYWxsICpyeHJwY19rZXJuZWxfYWNjZXB0X2NhbGwoc3RydWN0IHNvY2tldCAqc29jaywKLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lEKQotewotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCi0JX2VudGVyKCIsJWx4IiwgdXNlcl9jYWxsX0lEKTsKLQljYWxsID0gcnhycGNfYWNjZXB0X2NhbGwocnhycGNfc2soc29jay0+c2spLCB1c2VyX2NhbGxfSUQpOwotCV9sZWF2ZSgiID0gJXAiLCBjYWxsKTsKLQlyZXR1cm4gY2FsbDsKLX0KLUVYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2FjY2VwdF9jYWxsKTsKLQotLyoqCi0gKiByeHJwY19rZXJuZWxfcmVqZWN0X2NhbGwgLSBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIHJlamVjdCBhbiBpbmNvbWluZyBjYWxsCi0gKiBAc29jazogVGhlIHNvY2tldCBvbiB3aGljaCB0aGUgaW1wZW5kaW5nIGNhbGwgaXMgd2FpdGluZworICogQ2hhcmdlIHVwIHRoZSBzb2NrZXQgd2l0aCBwcmVhbGxvY2F0ZWQgY2FsbHMsIGVhY2ggd2l0aCBhIHVzZXIgSUQuICBBCisgKiBmdW5jdGlvbiBzaG91bGQgYmUgcHJvdmlkZWQgdG8gZWZmZWN0IHRoZSBhdHRhY2htZW50IGZyb20gdGhlIHVzZXIncyBzaWRlLgorICogVGhlIHVzZXIgaXMgZ2l2ZW4gYSByZWYgdG8gaG9sZCBvbiB0aGUgY2FsbC4KICAqCi0gKiBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIHJlamVjdCBhbiBpbmNvbWluZyBjYWxsIHdpdGggYSBCVVNZIG1lc3NhZ2UsCi0gKiBhc3N1bWluZyB0aGUgaW5jb21pbmcgY2FsbCBpcyBzdGlsbCB2YWxpZC4KKyAqIE5vdGUgdGhhdCB0aGUgY2FsbCBtYXkgYmUgY29tZSBjb25uZWN0ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KICAqLwotaW50IHJ4cnBjX2tlcm5lbF9yZWplY3RfY2FsbChzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoraW50IHJ4cnBjX2tlcm5lbF9jaGFyZ2VfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgICAgcnhycGNfbm90aWZ5X3J4X3Qgbm90aWZ5X3J4LAorCQkJICAgICAgIHJ4cnBjX3VzZXJfYXR0YWNoX2NhbGxfdCB1c2VyX2F0dGFjaF9jYWxsLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lELCBnZnBfdCBnZnApCiB7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzb2NrLT5zayk7CisJc3RydWN0IHJ4cnBjX2JhY2tsb2cgKmIgPSByeC0+YmFja2xvZzsKIAotCV9lbnRlcigiIik7Ci0JcmV0ID0gcnhycGNfcmVqZWN0X2NhbGwocnhycGNfc2soc29jay0+c2spKTsKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OworCWlmIChzb2NrLT5zay0+c2tfc3RhdGUgPT0gUlhSUENfQ0xPU0UpCisJCXJldHVybiAtRVNIVVRET1dOOworCisJcmV0dXJuIHJ4cnBjX3NlcnZpY2VfcHJlYWxsb2Nfb25lKHJ4LCBiLCBub3RpZnlfcngsCisJCQkJCSAgdXNlcl9hdHRhY2hfY2FsbCwgdXNlcl9jYWxsX0lELAorCQkJCQkgIGdmcCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9yZWplY3RfY2FsbCk7CitFWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9jaGFyZ2VfYWNjZXB0KTsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9jYWxsX2V2ZW50LmMgYi9uZXQvcnhycGMvY2FsbF9ldmVudC5jCmluZGV4IGZjMzJhYTUuLjRmMDA0NzYgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9jYWxsX2V2ZW50LmMKKysrIGIvbmV0L3J4cnBjL2NhbGxfZXZlbnQuYwpAQCAtMjIsMTI3NCArMjIsMzUxIEBACiAjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKIAogLyoKKyAqIFNldCB0aGUgdGltZXIKKyAqLwordm9pZCByeHJwY19zZXRfdGltZXIoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGVudW0gcnhycGNfdGltZXJfdHJhY2Ugd2h5LAorCQkgICAgIGt0aW1lX3Qgbm93KQoreworCXVuc2lnbmVkIGxvbmcgdF9qLCBub3dfaiA9IGppZmZpZXM7CisJa3RpbWVfdCB0OworCWJvb2wgcXVldWUgPSBmYWxzZTsKKworCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisKKwlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7CisJCXQgPSBjYWxsLT5leHBpcmVfYXQ7CisJCWlmICgha3RpbWVfYWZ0ZXIodCwgbm93KSkKKwkJCWdvdG8gb3V0OworCisJCWlmICgha3RpbWVfYWZ0ZXIoY2FsbC0+cmVzZW5kX2F0LCBub3cpKSB7CisJCQljYWxsLT5yZXNlbmRfYXQgPSBjYWxsLT5leHBpcmVfYXQ7CisJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9SRVNFTkQsICZjYWxsLT5ldmVudHMpKQorCQkJCXF1ZXVlID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChrdGltZV9iZWZvcmUoY2FsbC0+cmVzZW5kX2F0LCB0KSkgeworCQkJdCA9IGNhbGwtPnJlc2VuZF9hdDsKKwkJfQorCisJCWlmICgha3RpbWVfYWZ0ZXIoY2FsbC0+YWNrX2F0LCBub3cpKSB7CisJCQljYWxsLT5hY2tfYXQgPSBjYWxsLT5leHBpcmVfYXQ7CisJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9BQ0ssICZjYWxsLT5ldmVudHMpKQorCQkJCXF1ZXVlID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChrdGltZV9iZWZvcmUoY2FsbC0+YWNrX2F0LCB0KSkgeworCQkJdCA9IGNhbGwtPmFja19hdDsKKwkJfQorCisJCXRfaiA9IG5zZWNzX3RvX2ppZmZpZXMoa3RpbWVfdG9fbnMoa3RpbWVfc3ViKHQsIG5vdykpKTsKKwkJdF9qICs9IGppZmZpZXM7CisKKwkJLyogV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY2FsY3VsYXRlZCBqaWZmaWVzIHZhbHVlIGZhbGxzCisJCSAqIGF0IG9yIGFmdGVyIHRoZSBuc2VjIHZhbHVlLCBvciB3ZSBtYXkgbG9vcCBjZWFzZWxlc3NseQorCQkgKiBiZWNhdXNlIHRoZSB0aW1lciB0aW1lcyBvdXQsIGJ1dCB3ZSBoYXZlbid0IHJlYWNoZWQgdGhlIG5zZWMKKwkJICogdGltZW91dCB5ZXQuCisJCSAqLworCQl0X2orKzsKKworCQlpZiAoY2FsbC0+dGltZXIuZXhwaXJlcyAhPSB0X2ogfHwgIXRpbWVyX3BlbmRpbmcoJmNhbGwtPnRpbWVyKSkgeworCQkJbW9kX3RpbWVyKCZjYWxsLT50aW1lciwgdF9qKTsKKwkJCXRyYWNlX3J4cnBjX3RpbWVyKGNhbGwsIHdoeSwgbm93LCBub3dfaik7CisJCX0KKworCQlpZiAocXVldWUpCisJCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCX0KKworb3V0OgorCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKK30KKworLyoKICAqIHByb3Bvc2UgYW4gQUNLIGJlIHNlbnQKICAqLwotdm9pZCBfX3J4cnBjX3Byb3Bvc2VfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1OCBhY2tfcmVhc29uLAotCQkJIHUzMiBzZXJpYWwsIGJvb2wgaW1tZWRpYXRlKQorc3RhdGljIHZvaWQgX19yeHJwY19wcm9wb3NlX0FDSyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTggYWNrX3JlYXNvbiwKKwkJCQl1MTYgc2tldywgdTMyIHNlcmlhbCwgYm9vbCBpbW1lZGlhdGUsCisJCQkJYm9vbCBiYWNrZ3JvdW5kLAorCQkJCWVudW0gcnhycGNfcHJvcG9zZV9hY2tfdHJhY2Ugd2h5KQogewotCXVuc2lnbmVkIGxvbmcgZXhwaXJ5OworCWVudW0gcnhycGNfcHJvcG9zZV9hY2tfb3V0Y29tZSBvdXRjb21lID0gcnhycGNfcHJvcG9zZV9hY2tfdXNlOworCXVuc2lnbmVkIGludCBleHBpcnkgPSByeHJwY19zb2Z0X2Fja19kZWxheTsKKwlrdGltZV90IG5vdywgYWNrX2F0OwogCXM4IHByaW9yID0gcnhycGNfYWNrX3ByaW9yaXR5W2Fja19yZWFzb25dOwogCi0JQVNTRVJUQ01QKHByaW9yLCA+LCAwKTsKLQotCV9lbnRlcigieyVkfSwlcywlJSV4LCV1IiwKLQkgICAgICAgY2FsbC0+ZGVidWdfaWQsIHJ4cnBjX2Fja3MoYWNrX3JlYXNvbiksIHNlcmlhbCwgaW1tZWRpYXRlKTsKLQotCWlmIChwcmlvciA8IHJ4cnBjX2Fja19wcmlvcml0eVtjYWxsLT5hY2tyX3JlYXNvbl0pIHsKLQkJaWYgKGltbWVkaWF0ZSkKLQkJCWdvdG8gY2FuY2VsX3RpbWVyOwotCQlyZXR1cm47Ci0JfQotCi0JLyogdXBkYXRlIERFTEFZLCBJRExFLCBSRVFVRVNURUQgYW5kIFBJTkdfUkVTUE9OU0UgQUNLIHNlcmlhbAotCSAqIG51bWJlcnMgKi8KLQlpZiAocHJpb3IgPT0gcnhycGNfYWNrX3ByaW9yaXR5W2NhbGwtPmFja3JfcmVhc29uXSkgewotCQlpZiAocHJpb3IgPD0gNCkKKwkvKiBVcGRhdGUgREVMQVksIElETEUsIFJFUVVFU1RFRCBhbmQgUElOR19SRVNQT05TRSBBQ0sgc2VyaWFsCisJICogbnVtYmVycywgYnV0IHdlIGRvbid0IGFsdGVyIHRoZSB0aW1lb3V0LgorCSAqLworCV9kZWJ1ZygicHJpb3IgJXUgJXUgdnMgJXUgJXUiLAorCSAgICAgICBhY2tfcmVhc29uLCBwcmlvciwKKwkgICAgICAgY2FsbC0+YWNrcl9yZWFzb24sIHJ4cnBjX2Fja19wcmlvcml0eVtjYWxsLT5hY2tyX3JlYXNvbl0pOworCWlmIChhY2tfcmVhc29uID09IGNhbGwtPmFja3JfcmVhc29uKSB7CisJCWlmIChSWFJQQ19BQ0tfVVBEQVRFQUJMRSAmICgxIDw8IGFja19yZWFzb24pKSB7CisJCQlvdXRjb21lID0gcnhycGNfcHJvcG9zZV9hY2tfdXBkYXRlOwogCQkJY2FsbC0+YWNrcl9zZXJpYWwgPSBzZXJpYWw7Ci0JCWlmIChpbW1lZGlhdGUpCi0JCQlnb3RvIGNhbmNlbF90aW1lcjsKLQkJcmV0dXJuOworCQkJY2FsbC0+YWNrcl9za2V3ID0gc2tldzsKKwkJfQorCQlpZiAoIWltbWVkaWF0ZSkKKwkJCWdvdG8gdHJhY2U7CisJfSBlbHNlIGlmIChwcmlvciA+IHJ4cnBjX2Fja19wcmlvcml0eVtjYWxsLT5hY2tyX3JlYXNvbl0pIHsKKwkJY2FsbC0+YWNrcl9yZWFzb24gPSBhY2tfcmVhc29uOworCQljYWxsLT5hY2tyX3NlcmlhbCA9IHNlcmlhbDsKKwkJY2FsbC0+YWNrcl9za2V3ID0gc2tldzsKKwl9IGVsc2UgeworCQlvdXRjb21lID0gcnhycGNfcHJvcG9zZV9hY2tfc3Vic3VtZTsKIAl9CiAKLQljYWxsLT5hY2tyX3JlYXNvbiA9IGFja19yZWFzb247Ci0JY2FsbC0+YWNrcl9zZXJpYWwgPSBzZXJpYWw7Ci0KIAlzd2l0Y2ggKGFja19yZWFzb24pIHsKLQljYXNlIFJYUlBDX0FDS19ERUxBWToKLQkJX2RlYnVnKCJydW4gZGVsYXkgdGltZXIiKTsKLQkJZXhwaXJ5ID0gcnhycGNfc29mdF9hY2tfZGVsYXk7Ci0JCWdvdG8gcnVuX3RpbWVyOwotCi0JY2FzZSBSWFJQQ19BQ0tfSURMRToKLQkJaWYgKCFpbW1lZGlhdGUpIHsKLQkJCV9kZWJ1ZygicnVuIGRlZmVyIHRpbWVyIik7Ci0JCQlleHBpcnkgPSByeHJwY19pZGxlX2Fja19kZWxheTsKLQkJCWdvdG8gcnVuX3RpbWVyOwotCQl9Ci0JCWdvdG8gY2FuY2VsX3RpbWVyOwotCiAJY2FzZSBSWFJQQ19BQ0tfUkVRVUVTVEVEOgotCQlleHBpcnkgPSByeHJwY19yZXF1ZXN0ZWRfYWNrX2RlbGF5OwotCQlpZiAoIWV4cGlyeSkKLQkJCWdvdG8gY2FuY2VsX3RpbWVyOwotCQlpZiAoIWltbWVkaWF0ZSB8fCBzZXJpYWwgPT0gMSkgewotCQkJX2RlYnVnKCJydW4gZGVmZXIgdGltZXIiKTsKLQkJCWdvdG8gcnVuX3RpbWVyOwotCQl9CisJCWlmIChyeHJwY19yZXF1ZXN0ZWRfYWNrX2RlbGF5IDwgZXhwaXJ5KQorCQkJZXhwaXJ5ID0gcnhycGNfcmVxdWVzdGVkX2Fja19kZWxheTsKKwkJaWYgKHNlcmlhbCA9PSAxKQorCQkJaW1tZWRpYXRlID0gZmFsc2U7CisJCWJyZWFrOworCisJY2FzZSBSWFJQQ19BQ0tfREVMQVk6CisJCWlmIChyeHJwY19zb2Z0X2Fja19kZWxheSA8IGV4cGlyeSkKKwkJCWV4cGlyeSA9IHJ4cnBjX3NvZnRfYWNrX2RlbGF5OworCQlicmVhazsKKworCWNhc2UgUlhSUENfQUNLX1BJTkc6CisJY2FzZSBSWFJQQ19BQ0tfSURMRToKKwkJaWYgKHJ4cnBjX2lkbGVfYWNrX2RlbGF5IDwgZXhwaXJ5KQorCQkJZXhwaXJ5ID0gcnhycGNfaWRsZV9hY2tfZGVsYXk7CisJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJX2RlYnVnKCJpbW1lZGlhdGUgQUNLIik7Ci0JCWdvdG8gY2FuY2VsX3RpbWVyOworCQlpbW1lZGlhdGUgPSB0cnVlOworCQlicmVhazsKIAl9CiAKLXJ1bl90aW1lcjoKLQlleHBpcnkgKz0gamlmZmllczsKLQlpZiAoIXRpbWVyX3BlbmRpbmcoJmNhbGwtPmFja190aW1lcikgfHwKLQkgICAgdGltZV9hZnRlcihjYWxsLT5hY2tfdGltZXIuZXhwaXJlcywgZXhwaXJ5KSkKLQkJbW9kX3RpbWVyKCZjYWxsLT5hY2tfdGltZXIsIGV4cGlyeSk7Ci0JcmV0dXJuOworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0VWX0FDSywgJmNhbGwtPmV2ZW50cykpIHsKKwkJX2RlYnVnKCJhbHJlYWR5IHNjaGVkdWxlZCIpOworCX0gZWxzZSBpZiAoaW1tZWRpYXRlIHx8IGV4cGlyeSA9PSAwKSB7CisJCV9kZWJ1ZygiaW1tZWRpYXRlIEFDSyAlbHgiLCBjYWxsLT5ldmVudHMpOworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9BQ0ssICZjYWxsLT5ldmVudHMpICYmCisJCSAgICBiYWNrZ3JvdW5kKQorCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwl9IGVsc2UgeworCQlub3cgPSBrdGltZV9nZXRfcmVhbCgpOworCQlhY2tfYXQgPSBrdGltZV9hZGRfbXMobm93LCBleHBpcnkpOworCQlpZiAoa3RpbWVfYmVmb3JlKGFja19hdCwgY2FsbC0+YWNrX2F0KSkgeworCQkJY2FsbC0+YWNrX2F0ID0gYWNrX2F0OworCQkJcnhycGNfc2V0X3RpbWVyKGNhbGwsIHJ4cnBjX3RpbWVyX3NldF9mb3JfYWNrLCBub3cpOworCQl9CisJfQogCi1jYW5jZWxfdGltZXI6Ci0JX2RlYnVnKCJjYW5jZWwgdGltZXIgJSUldSIsIHNlcmlhbCk7Ci0JdHJ5X3RvX2RlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tfdGltZXIpOwotCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JaWYgKGNhbGwtPnN0YXRlIDw9IFJYUlBDX0NBTExfQ09NUExFVEUgJiYKLQkgICAgIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9BQ0ssICZjYWxsLT5ldmVudHMpKQotCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOwotCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKK3RyYWNlOgorCXRyYWNlX3J4cnBjX3Byb3Bvc2VfYWNrKGNhbGwsIHdoeSwgYWNrX3JlYXNvbiwgc2VyaWFsLCBpbW1lZGlhdGUsCisJCQkJYmFja2dyb3VuZCwgb3V0Y29tZSk7CiB9CiAKIC8qCiAgKiBwcm9wb3NlIGFuIEFDSyBiZSBzZW50LCBsb2NraW5nIHRoZSBjYWxsIHN0cnVjdHVyZQogICovCiB2b2lkIHJ4cnBjX3Byb3Bvc2VfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1OCBhY2tfcmVhc29uLAotCQkgICAgICAgdTMyIHNlcmlhbCwgYm9vbCBpbW1lZGlhdGUpCisJCSAgICAgICB1MTYgc2tldywgdTMyIHNlcmlhbCwgYm9vbCBpbW1lZGlhdGUsIGJvb2wgYmFja2dyb3VuZCwKKwkJICAgICAgIGVudW0gcnhycGNfcHJvcG9zZV9hY2tfdHJhY2Ugd2h5KQogewotCXM4IHByaW9yID0gcnhycGNfYWNrX3ByaW9yaXR5W2Fja19yZWFzb25dOwotCi0JaWYgKHByaW9yID4gcnhycGNfYWNrX3ByaW9yaXR5W2NhbGwtPmFja3JfcmVhc29uXSkgewotCQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwotCQlfX3J4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIGFja19yZWFzb24sIHNlcmlhbCwgaW1tZWRpYXRlKTsKLQkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOwotCX0KKwlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOworCV9fcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgYWNrX3JlYXNvbiwgc2tldywgc2VyaWFsLAorCQkJICAgIGltbWVkaWF0ZSwgYmFja2dyb3VuZCwgd2h5KTsKKwlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CiB9CiAKIC8qCi0gKiBzZXQgdGhlIHJlc2VuZCB0aW1lcgorICogSGFuZGxlIGNvbmdlc3Rpb24gYmVpbmcgZGV0ZWN0ZWQgYnkgdGhlIHJldHJhbnNtaXQgdGltZW91dC4KICAqLwotc3RhdGljIHZvaWQgcnhycGNfc2V0X3Jlc2VuZChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTggcmVzZW5kLAotCQkJICAgICB1bnNpZ25lZCBsb25nIHJlc2VuZF9hdCkKK3N0YXRpYyB2b2lkIHJ4cnBjX2Nvbmdlc3Rpb25fdGltZW91dChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKIHsKLQlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKQotCQlyZXNlbmQgPSAwOwotCi0JaWYgKHJlc2VuZCAmIDEpIHsKLQkJX2RlYnVnKCJTRVQgUkVTRU5EIik7Ci0JCXNldF9iaXQoUlhSUENfQ0FMTF9FVl9SRVNFTkQsICZjYWxsLT5ldmVudHMpOwotCX0KLQotCWlmIChyZXNlbmQgJiAyKSB7Ci0JCV9kZWJ1ZygiTU9ESUZZIFJFU0VORCBUSU1FUiIpOwotCQlzZXRfYml0KFJYUlBDX0NBTExfUlVOX1JUSU1FUiwgJmNhbGwtPmZsYWdzKTsKLQkJbW9kX3RpbWVyKCZjYWxsLT5yZXNlbmRfdGltZXIsIHJlc2VuZF9hdCk7Ci0JfSBlbHNlIHsKLQkJX2RlYnVnKCJLSUxMIFJFU0VORCBUSU1FUiIpOwotCQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKTsKLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfUkVTRU5EX1RJTUVSLCAmY2FsbC0+ZXZlbnRzKTsKLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfUlVOX1JUSU1FUiwgJmNhbGwtPmZsYWdzKTsKLQl9Ci0JcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCXNldF9iaXQoUlhSUENfQ0FMTF9SRVRSQU5TX1RJTUVPVVQsICZjYWxsLT5mbGFncyk7CiB9CiAKIC8qCi0gKiByZXNlbmQgcGFja2V0cworICogUGVyZm9ybSByZXRyYW5zbWlzc2lvbiBvZiBOQUsnZCBhbmQgdW5hY2snZCBwYWNrZXRzLgogICovCi1zdGF0aWMgdm9pZCByeHJwY19yZXNlbmQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCitzdGF0aWMgdm9pZCByeHJwY19yZXNlbmQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGt0aW1lX3Qgbm93KQogewotCXN0cnVjdCByeHJwY193aXJlX2hlYWRlciAqd2hkcjsKIAlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCXN0cnVjdCBza19idWZmICp0eGI7Ci0JdW5zaWduZWQgbG9uZyAqcF90eGIsIHJlc2VuZF9hdDsKLQlib29sIHN0b3A7Ci0JaW50IGxvb3A7Ci0JdTggcmVzZW5kOworCXN0cnVjdCBza19idWZmICpza2I7CisJcnhycGNfc2VxX3QgY3Vyc29yLCBzZXEsIHRvcDsKKwlrdGltZV90IG1heF9hZ2UsIG9sZGVzdCwgYWNrX3RzOworCWludCBpeDsKKwl1OCBhbm5vdGF0aW9uLCBhbm5vX3R5cGUsIHJldHJhbnMgPSAwLCB1bmFja2VkID0gMDsKIAotCV9lbnRlcigieyVkLCVkLCVkLCVkfSwiLAotCSAgICAgICBjYWxsLT5hY2tzX2hhcmQsIGNhbGwtPmFja3NfdW5hY2tlZCwKLQkgICAgICAgYXRvbWljX3JlYWQoJmNhbGwtPnNlcXVlbmNlKSwKLQkgICAgICAgQ0lSQ19DTlQoY2FsbC0+YWNrc19oZWFkLCBjYWxsLT5hY2tzX3RhaWwsIGNhbGwtPmFja3Nfd2luc3opKTsKKwlfZW50ZXIoInslZCwlZH0iLCBjYWxsLT50eF9oYXJkX2FjaywgY2FsbC0+dHhfdG9wKTsKIAotCXN0b3AgPSBmYWxzZTsKLQlyZXNlbmQgPSAwOwotCXJlc2VuZF9hdCA9IDA7CisJbWF4X2FnZSA9IGt0aW1lX3N1Yl9tcyhub3csIHJ4cnBjX3Jlc2VuZF90aW1lb3V0KTsKIAotCWZvciAobG9vcCA9IGNhbGwtPmFja3NfdGFpbDsKLQkgICAgIGxvb3AgIT0gY2FsbC0+YWNrc19oZWFkIHx8IHN0b3A7Ci0JICAgICBsb29wID0gKGxvb3AgKyAxKSAmICAoY2FsbC0+YWNrc193aW5zeiAtIDEpCi0JICAgICApIHsKLQkJcF90eGIgPSBjYWxsLT5hY2tzX3dpbmRvdyArIGxvb3A7Ci0JCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOwotCQlpZiAoKnBfdHhiICYgMSkKKwlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOworCisJY3Vyc29yID0gY2FsbC0+dHhfaGFyZF9hY2s7CisJdG9wID0gY2FsbC0+dHhfdG9wOworCUFTU0VSVChiZWZvcmVfZXEoY3Vyc29yLCB0b3ApKTsKKwlpZiAoY3Vyc29yID09IHRvcCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJLyogU2NhbiB0aGUgcGFja2V0IGxpc3Qgd2l0aG91dCBkcm9wcGluZyB0aGUgbG9jayBhbmQgZGVjaWRlIHdoaWNoIG9mCisJICogdGhlIHBhY2tldHMgaW4gdGhlIFR4IGJ1ZmZlciB3ZSdyZSBnb2luZyB0byByZXNlbmQgYW5kIHdoYXQgdGhlIG5ldworCSAqIHJlc2VuZCB0aW1lb3V0IHdpbGwgYmUuCisJICovCisJb2xkZXN0ID0gbm93OworCWZvciAoc2VxID0gY3Vyc29yICsgMTsgYmVmb3JlX2VxKHNlcSwgdG9wKTsgc2VxKyspIHsKKwkJaXggPSBzZXEgJiBSWFJQQ19SWFRYX0JVRkZfTUFTSzsKKwkJYW5ub3RhdGlvbiA9IGNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbaXhdOworCQlhbm5vX3R5cGUgPSBhbm5vdGF0aW9uICYgUlhSUENfVFhfQU5OT19NQVNLOworCQlhbm5vdGF0aW9uICY9IH5SWFJQQ19UWF9BTk5PX01BU0s7CisJCWlmIChhbm5vX3R5cGUgPT0gUlhSUENfVFhfQU5OT19BQ0spCiAJCQljb250aW51ZTsKIAotCQl0eGIgPSAoc3RydWN0IHNrX2J1ZmYgKikgKnBfdHhiOwotCQlzcCA9IHJ4cnBjX3NrYih0eGIpOworCQlza2IgPSBjYWxsLT5yeHR4X2J1ZmZlcltpeF07CisJCXJ4cnBjX3NlZV9za2Ioc2tiLCByeHJwY19za2JfdHhfc2Vlbik7CisJCXNwID0gcnhycGNfc2tiKHNrYik7CiAKLQkJaWYgKHNwLT5uZWVkX3Jlc2VuZCkgewotCQkJc3AtPm5lZWRfcmVzZW5kID0gZmFsc2U7Ci0KLQkJCS8qIGVhY2ggVHggcGFja2V0IGhhcyBhIG5ldyBzZXJpYWwgbnVtYmVyICovCi0JCQlzcC0+aGRyLnNlcmlhbCA9IGF0b21pY19pbmNfcmV0dXJuKCZjYWxsLT5jb25uLT5zZXJpYWwpOwotCi0JCQl3aGRyID0gKHN0cnVjdCByeHJwY193aXJlX2hlYWRlciAqKXR4Yi0+aGVhZDsKLQkJCXdoZHItPnNlcmlhbCA9IGh0b25sKHNwLT5oZHIuc2VyaWFsKTsKLQotCQkJX3Byb3RvKCJUeCBEQVRBICUlJXUgeyAjJWQgfSIsCi0JCQkgICAgICAgc3AtPmhkci5zZXJpYWwsIHNwLT5oZHIuc2VxKTsKLQkJCWlmIChyeHJwY19zZW5kX2RhdGFfcGFja2V0KGNhbGwtPmNvbm4sIHR4YikgPCAwKSB7Ci0JCQkJc3RvcCA9IHRydWU7Ci0JCQkJc3AtPnJlc2VuZF9hdCA9IGppZmZpZXMgKyAzOwotCQkJfSBlbHNlIHsKLQkJCQlzcC0+cmVzZW5kX2F0ID0KLQkJCQkJamlmZmllcyArIHJ4cnBjX3Jlc2VuZF90aW1lb3V0OworCQlpZiAoYW5ub190eXBlID09IFJYUlBDX1RYX0FOTk9fVU5BQ0spIHsKKwkJCWlmIChrdGltZV9hZnRlcihza2ItPnRzdGFtcCwgbWF4X2FnZSkpIHsKKwkJCQlpZiAoa3RpbWVfYmVmb3JlKHNrYi0+dHN0YW1wLCBvbGRlc3QpKQorCQkJCQlvbGRlc3QgPSBza2ItPnRzdGFtcDsKKwkJCQljb250aW51ZTsKIAkJCX0KKwkJCWlmICghKGFubm90YXRpb24gJiBSWFJQQ19UWF9BTk5PX1JFU0VOVCkpCisJCQkJdW5hY2tlZCsrOwogCQl9CiAKLQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcyArIDEsIHNwLT5yZXNlbmRfYXQpKSB7Ci0JCQlzcC0+bmVlZF9yZXNlbmQgPSB0cnVlOwotCQkJcmVzZW5kIHw9IDE7Ci0JCX0gZWxzZSBpZiAocmVzZW5kICYgMikgewotCQkJaWYgKHRpbWVfYmVmb3JlKHNwLT5yZXNlbmRfYXQsIHJlc2VuZF9hdCkpCi0JCQkJcmVzZW5kX2F0ID0gc3AtPnJlc2VuZF9hdDsKLQkJfSBlbHNlIHsKLQkJCXJlc2VuZF9hdCA9IHNwLT5yZXNlbmRfYXQ7Ci0JCQlyZXNlbmQgfD0gMjsKLQkJfQorCQkvKiBPa2F5LCB3ZSBuZWVkIHRvIHJldHJhbnNtaXQgYSBwYWNrZXQuICovCisJCWNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbaXhdID0gUlhSUENfVFhfQU5OT19SRVRSQU5TIHwgYW5ub3RhdGlvbjsKKwkJcmV0cmFucysrOworCQl0cmFjZV9yeHJwY19yZXRyYW5zbWl0KGNhbGwsIHNlcSwgYW5ub3RhdGlvbiB8IGFubm9fdHlwZSwKKwkJCQkgICAgICAga3RpbWVfdG9fbnMoa3RpbWVfc3ViKHNrYi0+dHN0YW1wLCBtYXhfYWdlKSkpOwogCX0KIAotCXJ4cnBjX3NldF9yZXNlbmQoY2FsbCwgcmVzZW5kLCByZXNlbmRfYXQpOworCWNhbGwtPnJlc2VuZF9hdCA9IGt0aW1lX2FkZF9tcyhvbGRlc3QsIHJ4cnBjX3Jlc2VuZF90aW1lb3V0KTsKKworCWlmICh1bmFja2VkKQorCQlyeHJwY19jb25nZXN0aW9uX3RpbWVvdXQoY2FsbCk7CisKKwkvKiBJZiB0aGVyZSB3YXMgbm90aGluZyB0aGF0IG5lZWRlZCByZXRyYW5zbWlzc2lvbiB0aGVuIGl0J3MgbGlrZWx5CisJICogdGhhdCBhbiBBQ0sgZ290IGxvc3Qgc29tZXdoZXJlLiAgU2VuZCBhIHBpbmcgdG8gZmluZCBvdXQgaW5zdGVhZCBvZgorCSAqIHJldHJhbnNtaXR0aW5nIGRhdGEuCisJICovCisJaWYgKCFyZXRyYW5zKSB7CisJCXJ4cnBjX3NldF90aW1lcihjYWxsLCByeHJwY190aW1lcl9zZXRfZm9yX3Jlc2VuZCwgbm93KTsKKwkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOworCQlhY2tfdHMgPSBrdGltZV9zdWIobm93LCBjYWxsLT5hY2tzX2xhdGVzdF90cyk7CisJCWlmIChrdGltZV90b19ucyhhY2tfdHMpIDwgY2FsbC0+cGVlci0+cnR0KQorCQkJZ290byBvdXQ7CisJCXJ4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIFJYUlBDX0FDS19QSU5HLCAwLCAwLCB0cnVlLCBmYWxzZSwKKwkJCQkgIHJ4cnBjX3Byb3Bvc2VfYWNrX3BpbmdfZm9yX2xvc3RfYWNrKTsKKwkJcnhycGNfc2VuZF9jYWxsX3BhY2tldChjYWxsLCBSWFJQQ19QQUNLRVRfVFlQRV9BQ0spOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBOb3cgZ28gdGhyb3VnaCB0aGUgVHggd2luZG93IGFuZCBwZXJmb3JtIHRoZSByZXRyYW5zbWlzc2lvbnMuICBXZQorCSAqIGhhdmUgdG8gZHJvcCB0aGUgbG9jayBmb3IgZWFjaCBzZW5kLiAgSWYgYW4gQUNLIGNvbWVzIGluIHdoaWxzdCB0aGUKKwkgKiBsb2NrIGlzIGRyb3BwZWQsIGl0IG1heSBjbGVhciBzb21lIG9mIHRoZSByZXRyYW5zbWlzc2lvbiBtYXJrZXJzIGZvcgorCSAqIHBhY2tldHMgdGhhdCBpdCBzb2Z0LUFDS3MuCisJICovCisJZm9yIChzZXEgPSBjdXJzb3IgKyAxOyBiZWZvcmVfZXEoc2VxLCB0b3ApOyBzZXErKykgeworCQlpeCA9IHNlcSAmIFJYUlBDX1JYVFhfQlVGRl9NQVNLOworCQlhbm5vdGF0aW9uID0gY2FsbC0+cnh0eF9hbm5vdGF0aW9uc1tpeF07CisJCWFubm9fdHlwZSA9IGFubm90YXRpb24gJiBSWFJQQ19UWF9BTk5PX01BU0s7CisJCWlmIChhbm5vX3R5cGUgIT0gUlhSUENfVFhfQU5OT19SRVRSQU5TKQorCQkJY29udGludWU7CisKKwkJc2tiID0gY2FsbC0+cnh0eF9idWZmZXJbaXhdOworCQlyeHJwY19nZXRfc2tiKHNrYiwgcnhycGNfc2tiX3R4X2dvdCk7CisJCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCQlpZiAocnhycGNfc2VuZF9kYXRhX3BhY2tldChjYWxsLCBza2IsIHRydWUpIDwgMCkgeworCQkJcnhycGNfZnJlZV9za2Ioc2tiLCByeHJwY19za2JfdHhfZnJlZWQpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHJ4cnBjX2lzX2NsaWVudF9jYWxsKGNhbGwpKQorCQkJcnhycGNfZXhwb3NlX2NsaWVudF9jYWxsKGNhbGwpOworCisJCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3R4X2ZyZWVkKTsKKwkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCQkvKiBXZSBuZWVkIHRvIGNsZWFyIHRoZSByZXRyYW5zbWl0IHN0YXRlLCBidXQgdGhlcmUgYXJlIHR3bworCQkgKiB0aGluZ3Mgd2UgbmVlZCB0byBiZSBhd2FyZSBvZjogQSBuZXcgQUNLL05BSyBtaWdodCBoYXZlIGJlZW4KKwkJICogcmVjZWl2ZWQgYW5kIHRoZSBwYWNrZXQgbWlnaHQgaGF2ZSBiZWVuIGhhcmQtQUNLJ2QgKGluIHdoaWNoCisJCSAqIGNhc2UgaXQgd2lsbCBubyBsb25nZXIgYmUgaW4gdGhlIGJ1ZmZlcikuCisJCSAqLworCQlpZiAoYWZ0ZXIoc2VxLCBjYWxsLT50eF9oYXJkX2FjaykpIHsKKwkJCWFubm90YXRpb24gPSBjYWxsLT5yeHR4X2Fubm90YXRpb25zW2l4XTsKKwkJCWFubm9fdHlwZSA9IGFubm90YXRpb24gJiBSWFJQQ19UWF9BTk5PX01BU0s7CisJCQlpZiAoYW5ub190eXBlID09IFJYUlBDX1RYX0FOTk9fUkVUUkFOUyB8fAorCQkJICAgIGFubm9fdHlwZSA9PSBSWFJQQ19UWF9BTk5PX05BSykgeworCQkJCWFubm90YXRpb24gJj0gflJYUlBDX1RYX0FOTk9fTUFTSzsKKwkJCQlhbm5vdGF0aW9uIHw9IFJYUlBDX1RYX0FOTk9fVU5BQ0s7CisJCQl9CisJCQlhbm5vdGF0aW9uIHw9IFJYUlBDX1RYX0FOTk9fUkVTRU5UOworCQkJY2FsbC0+cnh0eF9hbm5vdGF0aW9uc1tpeF0gPSBhbm5vdGF0aW9uOworCQl9CisKKwkJaWYgKGFmdGVyKGNhbGwtPnR4X2hhcmRfYWNrLCBzZXEpKQorCQkJc2VxID0gY2FsbC0+dHhfaGFyZF9hY2s7CisJfQorCitvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKK291dDoKIAlfbGVhdmUoIiIpOwogfQogCiAvKgotICogaGFuZGxlIHJlc2VuZCB0aW1lciBleHBpcnkKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfcmVzZW5kX3RpbWVyKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQotewotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7Ci0Jc3RydWN0IHNrX2J1ZmYgKnR4YjsKLQl1bnNpZ25lZCBsb25nICpwX3R4YiwgcmVzZW5kX2F0OwotCWludCBsb29wOwotCXU4IHJlc2VuZDsKLQotCV9lbnRlcigiJWQsJWQsJWQiLAotCSAgICAgICBjYWxsLT5hY2tzX3RhaWwsIGNhbGwtPmFja3NfdW5hY2tlZCwgY2FsbC0+YWNrc19oZWFkKTsKLQotCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKQotCQlyZXR1cm47Ci0KLQlyZXNlbmQgPSAwOwotCXJlc2VuZF9hdCA9IDA7Ci0KLQlmb3IgKGxvb3AgPSBjYWxsLT5hY2tzX3VuYWNrZWQ7Ci0JICAgICBsb29wICE9IGNhbGwtPmFja3NfaGVhZDsKLQkgICAgIGxvb3AgPSAobG9vcCArIDEpICYgIChjYWxsLT5hY2tzX3dpbnN6IC0gMSkKLQkgICAgICkgewotCQlwX3R4YiA9IGNhbGwtPmFja3Nfd2luZG93ICsgbG9vcDsKLQkJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7Ci0JCXR4YiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAoKnBfdHhiICYgfjEpOwotCQlzcCA9IHJ4cnBjX3NrYih0eGIpOwotCi0JCUFTU0VSVCghKCpwX3R4YiAmIDEpKTsKLQotCQlpZiAoc3AtPm5lZWRfcmVzZW5kKSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzICsgMSwgc3AtPnJlc2VuZF9hdCkpIHsKLQkJCXNwLT5uZWVkX3Jlc2VuZCA9IHRydWU7Ci0JCQlyZXNlbmQgfD0gMTsKLQkJfSBlbHNlIGlmIChyZXNlbmQgJiAyKSB7Ci0JCQlpZiAodGltZV9iZWZvcmUoc3AtPnJlc2VuZF9hdCwgcmVzZW5kX2F0KSkKLQkJCQlyZXNlbmRfYXQgPSBzcC0+cmVzZW5kX2F0OwotCQl9IGVsc2UgewotCQkJcmVzZW5kX2F0ID0gc3AtPnJlc2VuZF9hdDsKLQkJCXJlc2VuZCB8PSAyOwotCQl9Ci0JfQotCi0JcnhycGNfc2V0X3Jlc2VuZChjYWxsLCByZXNlbmQsIHJlc2VuZF9hdCk7Ci0JX2xlYXZlKCIiKTsKLX0KLQotLyoKLSAqIHByb2Nlc3Mgc29mdCBBQ0tzIG9mIG91ciB0cmFuc21pdHRlZCBwYWNrZXRzCi0gKiAtIHRoZXNlIGluZGljYXRlIHBhY2tldHMgdGhlIHBlZXIgaGFzIG9yIGhhcyBub3QgcmVjZWl2ZWQsIGJ1dCBoYXNuJ3QgeWV0Ci0gKiAgIGdpdmVuIHRvIHRoZSBjb25zdW1lciwgYW5kIHNvIGNhbiBzdGlsbCBiZSBkaXNjYXJkZWQgYW5kIHJlLXJlcXVlc3RlZAotICovCi1zdGF0aWMgaW50IHJ4cnBjX3Byb2Nlc3Nfc29mdF9BQ0tzKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCSAgIHN0cnVjdCByeHJwY19hY2twYWNrZXQgKmFjaywKLQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7Ci0Jc3RydWN0IHNrX2J1ZmYgKnR4YjsKLQl1bnNpZ25lZCBsb25nICpwX3R4YiwgcmVzZW5kX2F0OwotCWludCBsb29wOwotCXU4IHNhY2tzW1JYUlBDX01BWEFDS1NdLCByZXNlbmQ7Ci0KLQlfZW50ZXIoInslZCwlZH0seyVkfSwiLAotCSAgICAgICBjYWxsLT5hY2tzX2hhcmQsCi0JICAgICAgIENJUkNfQ05UKGNhbGwtPmFja3NfaGVhZCwgY2FsbC0+YWNrc190YWlsLCBjYWxsLT5hY2tzX3dpbnN6KSwKLQkgICAgICAgYWNrLT5uQWNrcyk7Ci0KLQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsIHNhY2tzLCBhY2stPm5BY2tzKSA8IDApCi0JCWdvdG8gcHJvdG9jb2xfZXJyb3I7Ci0KLQlyZXNlbmQgPSAwOwotCXJlc2VuZF9hdCA9IDA7Ci0JZm9yIChsb29wID0gMDsgbG9vcCA8IGFjay0+bkFja3M7IGxvb3ArKykgewotCQlwX3R4YiA9IGNhbGwtPmFja3Nfd2luZG93OwotCQlwX3R4YiArPSAoY2FsbC0+YWNrc190YWlsICsgbG9vcCkgJiAoY2FsbC0+YWNrc193aW5zeiAtIDEpOwotCQlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKLQkJdHhiID0gKHN0cnVjdCBza19idWZmICopICgqcF90eGIgJiB+MSk7Ci0JCXNwID0gcnhycGNfc2tiKHR4Yik7Ci0KLQkJc3dpdGNoIChzYWNrc1tsb29wXSkgewotCQljYXNlIFJYUlBDX0FDS19UWVBFX0FDSzoKLQkJCXNwLT5uZWVkX3Jlc2VuZCA9IGZhbHNlOwotCQkJKnBfdHhiIHw9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBSWFJQQ19BQ0tfVFlQRV9OQUNLOgotCQkJc3AtPm5lZWRfcmVzZW5kID0gdHJ1ZTsKLQkJCSpwX3R4YiAmPSB+MTsKLQkJCXJlc2VuZCA9IDE7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCV9kZWJ1ZygiVW5zdXBwb3J0ZWQgQUNLIHR5cGUgJWQiLCBzYWNrc1tsb29wXSk7Ci0JCQlnb3RvIHByb3RvY29sX2Vycm9yOwotCQl9Ci0JfQotCi0Jc21wX21iKCk7Ci0JY2FsbC0+YWNrc191bmFja2VkID0gKGNhbGwtPmFja3NfdGFpbCArIGxvb3ApICYgKGNhbGwtPmFja3Nfd2luc3ogLSAxKTsKLQotCS8qIGFueXRoaW5nIG5vdCBleHBsaWNpdGx5IEFDSydkIGlzIGltcGxpY2l0bHkgTkFDSydkLCBidXQgbWF5IGp1c3Qgbm90Ci0JICogaGF2ZSBiZWVuIHJlY2VpdmVkIG9yIHByb2Nlc3NlZCB5ZXQgYnkgdGhlIGZhciBlbmQgKi8KLQlmb3IgKGxvb3AgPSBjYWxsLT5hY2tzX3VuYWNrZWQ7Ci0JICAgICBsb29wICE9IGNhbGwtPmFja3NfaGVhZDsKLQkgICAgIGxvb3AgPSAobG9vcCArIDEpICYgIChjYWxsLT5hY2tzX3dpbnN6IC0gMSkKLQkgICAgICkgewotCQlwX3R4YiA9IGNhbGwtPmFja3Nfd2luZG93ICsgbG9vcDsKLQkJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7Ci0JCXR4YiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAoKnBfdHhiICYgfjEpOwotCQlzcCA9IHJ4cnBjX3NrYih0eGIpOwotCi0JCWlmICgqcF90eGIgJiAxKSB7Ci0JCQkvKiBwYWNrZXQgbXVzdCBoYXZlIGJlZW4gZGlzY2FyZGVkICovCi0JCQlzcC0+bmVlZF9yZXNlbmQgPSB0cnVlOwotCQkJKnBfdHhiICY9IH4xOwotCQkJcmVzZW5kIHw9IDE7Ci0JCX0gZWxzZSBpZiAoc3AtPm5lZWRfcmVzZW5kKSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzICsgMSwgc3AtPnJlc2VuZF9hdCkpIHsKLQkJCXNwLT5uZWVkX3Jlc2VuZCA9IHRydWU7Ci0JCQlyZXNlbmQgfD0gMTsKLQkJfSBlbHNlIGlmIChyZXNlbmQgJiAyKSB7Ci0JCQlpZiAodGltZV9iZWZvcmUoc3AtPnJlc2VuZF9hdCwgcmVzZW5kX2F0KSkKLQkJCQlyZXNlbmRfYXQgPSBzcC0+cmVzZW5kX2F0OwotCQl9IGVsc2UgewotCQkJcmVzZW5kX2F0ID0gc3AtPnJlc2VuZF9hdDsKLQkJCXJlc2VuZCB8PSAyOwotCQl9Ci0JfQotCi0JcnhycGNfc2V0X3Jlc2VuZChjYWxsLCByZXNlbmQsIHJlc2VuZF9hdCk7Ci0JX2xlYXZlKCIgPSAwIik7Ci0JcmV0dXJuIDA7Ci0KLXByb3RvY29sX2Vycm9yOgotCV9sZWF2ZSgiID0gLUVQUk9UTyIpOwotCXJldHVybiAtRVBST1RPOwotfQotCi0vKgotICogZGlzY2FyZCBoYXJkLUFDSydkIHBhY2tldHMgZnJvbSB0aGUgVHggd2luZG93Ci0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX3JvdGF0ZV90eF93aW5kb3coc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHUzMiBoYXJkKQotewotCXVuc2lnbmVkIGxvbmcgX3NrYjsKLQlpbnQgdGFpbCA9IGNhbGwtPmFja3NfdGFpbCwgb2xkX3RhaWw7Ci0JaW50IHdpbiA9IENJUkNfQ05UKGNhbGwtPmFja3NfaGVhZCwgdGFpbCwgY2FsbC0+YWNrc193aW5zeik7Ci0KLQlfZW50ZXIoInsldSwldX0sJXUiLCBjYWxsLT5hY2tzX2hhcmQsIHdpbiwgaGFyZCk7Ci0KLQlBU1NFUlRDTVAoaGFyZCAtIGNhbGwtPmFja3NfaGFyZCwgPD0sIHdpbik7Ci0KLQl3aGlsZSAoY2FsbC0+YWNrc19oYXJkIDwgaGFyZCkgewotCQlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKLQkJX3NrYiA9IGNhbGwtPmFja3Nfd2luZG93W3RhaWxdICYgfjE7Ci0JCXJ4cnBjX2ZyZWVfc2tiKChzdHJ1Y3Qgc2tfYnVmZiAqKSBfc2tiKTsKLQkJb2xkX3RhaWwgPSB0YWlsOwotCQl0YWlsID0gKHRhaWwgKyAxKSAmIChjYWxsLT5hY2tzX3dpbnN6IC0gMSk7Ci0JCWNhbGwtPmFja3NfdGFpbCA9IHRhaWw7Ci0JCWlmIChjYWxsLT5hY2tzX3VuYWNrZWQgPT0gb2xkX3RhaWwpCi0JCQljYWxsLT5hY2tzX3VuYWNrZWQgPSB0YWlsOwotCQljYWxsLT5hY2tzX2hhcmQrKzsKLQl9Ci0KLQl3YWtlX3VwKCZjYWxsLT50eF93YWl0cSk7Ci19Ci0KLS8qCi0gKiBjbGVhciB0aGUgVHggd2luZG93IGluIHRoZSBldmVudCBvZiBhIGZhaWx1cmUKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfY2xlYXJfdHhfd2luZG93KHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQotewotCXJ4cnBjX3JvdGF0ZV90eF93aW5kb3coY2FsbCwgYXRvbWljX3JlYWQoJmNhbGwtPnNlcXVlbmNlKSk7Ci19Ci0KLS8qCi0gKiBkcmFpbiB0aGUgb3V0IG9mIHNlcXVlbmNlIHJlY2VpdmVkIHBhY2tldCBxdWV1ZSBpbnRvIHRoZSBwYWNrZXQgUnggcXVldWUKLSAqLwotc3RhdGljIGludCByeHJwY19kcmFpbl9yeF9vb3NfcXVldWUoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWJvb2wgdGVybWluYWw7Ci0JaW50IHJldDsKLQotCV9lbnRlcigieyVkLCVkfSIsIGNhbGwtPnJ4X2RhdGFfcG9zdCwgY2FsbC0+cnhfZmlyc3Rfb29zKTsKLQotCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7Ci0KLQlyZXQgPSAtRUNPTk5SRVNFVDsKLQlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSkKLQkJZ290byBzb2NrZXRfdW5hdmFpbGFibGU7Ci0KLQlza2IgPSBza2JfZGVxdWV1ZSgmY2FsbC0+cnhfb29zX3F1ZXVlKTsKLQlpZiAoc2tiKSB7Ci0JCXNwID0gcnhycGNfc2tiKHNrYik7Ci0KLQkJX2RlYnVnKCJkcmFpbiBPT1MgcGFja2V0ICVkIFslZF0iLAotCQkgICAgICAgc3AtPmhkci5zZXEsIGNhbGwtPnJ4X2ZpcnN0X29vcyk7Ci0KLQkJaWYgKHNwLT5oZHIuc2VxICE9IGNhbGwtPnJ4X2ZpcnN0X29vcykgewotCQkJc2tiX3F1ZXVlX2hlYWQoJmNhbGwtPnJ4X29vc19xdWV1ZSwgc2tiKTsKLQkJCWNhbGwtPnJ4X2ZpcnN0X29vcyA9IHJ4cnBjX3NrYihza2IpLT5oZHIuc2VxOwotCQkJX2RlYnVnKCJyZXF1ZXVlICVwIHsldX0iLCBza2IsIGNhbGwtPnJ4X2ZpcnN0X29vcyk7Ci0JCX0gZWxzZSB7Ci0JCQlza2ItPm1hcmsgPSBSWFJQQ19TS0JfTUFSS19EQVRBOwotCQkJdGVybWluYWwgPSAoKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgJiYKLQkJCQkhKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEKSk7Ci0JCQlyZXQgPSByeHJwY19xdWV1ZV9yY3Zfc2tiKGNhbGwsIHNrYiwgdHJ1ZSwgdGVybWluYWwpOwotCQkJQlVHX09OKHJldCA8IDApOwotCQkJX2RlYnVnKCJkcmFpbiAjJXUiLCBjYWxsLT5yeF9kYXRhX3Bvc3QpOwotCQkJY2FsbC0+cnhfZGF0YV9wb3N0Kys7Ci0KLQkJCS8qIGZpbmQgb3V0IHdoYXQgdGhlIG5leHQgcGFja2V0IGlzICovCi0JCQlza2IgPSBza2JfcGVlaygmY2FsbC0+cnhfb29zX3F1ZXVlKTsKLQkJCWlmIChza2IpCi0JCQkJY2FsbC0+cnhfZmlyc3Rfb29zID0gcnhycGNfc2tiKHNrYiktPmhkci5zZXE7Ci0JCQllbHNlCi0JCQkJY2FsbC0+cnhfZmlyc3Rfb29zID0gMDsKLQkJCV9kZWJ1ZygicGVlayAlcCB7JXV9Iiwgc2tiLCBjYWxsLT5yeF9maXJzdF9vb3MpOwotCQl9Ci0JfQotCi0JcmV0ID0gMDsKLXNvY2tldF91bmF2YWlsYWJsZToKLQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIGluc2VydCBhbiBvdXQgb2Ygc2VxdWVuY2UgcGFja2V0IGludG8gdGhlIGJ1ZmZlcgotICovCi1zdGF0aWMgdm9pZCByeHJwY19pbnNlcnRfb29zX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwLCAqcHNwOwotCXN0cnVjdCBza19idWZmICpwOwotCXUzMiBzZXE7Ci0KLQlzcCA9IHJ4cnBjX3NrYihza2IpOwotCXNlcSA9IHNwLT5oZHIuc2VxOwotCV9lbnRlcigiLCx7JXV9Iiwgc2VxKTsKLQotCXNrYi0+ZGVzdHJ1Y3RvciA9IHJ4cnBjX3BhY2tldF9kZXN0cnVjdG9yOwotCUFTU0VSVENNUChzcC0+Y2FsbCwgPT0sIE5VTEwpOwotCXNwLT5jYWxsID0gY2FsbDsKLQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQotCS8qIGluc2VydCBpbnRvIHRoZSBidWZmZXIgaW4gc2VxdWVuY2Ugb3JkZXIgKi8KLQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwotCi0Jc2tiX3F1ZXVlX3dhbGsoJmNhbGwtPnJ4X29vc19xdWV1ZSwgcCkgewotCQlwc3AgPSByeHJwY19za2IocCk7Ci0JCWlmIChwc3AtPmhkci5zZXEgPiBzZXEpIHsKLQkJCV9kZWJ1ZygiaW5zZXJ0IG9vcyAjJXUgYmVmb3JlICMldSIsIHNlcSwgcHNwLT5oZHIuc2VxKTsKLQkJCXNrYl9pbnNlcnQocCwgc2tiLCAmY2FsbC0+cnhfb29zX3F1ZXVlKTsKLQkJCWdvdG8gaW5zZXJ0ZWQ7Ci0JCX0KLQl9Ci0KLQlfZGVidWcoImFwcGVuZCBvb3MgIyV1Iiwgc2VxKTsKLQlza2JfcXVldWVfdGFpbCgmY2FsbC0+cnhfb29zX3F1ZXVlLCBza2IpOwotaW5zZXJ0ZWQ6Ci0KLQkvKiB3ZSBtaWdodCBub3cgaGF2ZSBhIG5ldyBmcm9udCB0byB0aGUgcXVldWUgKi8KLQlpZiAoY2FsbC0+cnhfZmlyc3Rfb29zID09IDAgfHwgc2VxIDwgY2FsbC0+cnhfZmlyc3Rfb29zKQotCQljYWxsLT5yeF9maXJzdF9vb3MgPSBzZXE7Ci0KLQlyZWFkX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUgJiYKLQkgICAgY2FsbC0+cnhfZGF0YV9wb3N0ID09IGNhbGwtPnJ4X2ZpcnN0X29vcykgewotCQlfZGVidWcoImRyYWluIHJ4IG9vcyBub3ciKTsKLQkJc2V0X2JpdChSWFJQQ19DQUxMX0VWX0RSQUlOX1JYX09PUywgJmNhbGwtPmV2ZW50cyk7Ci0JfQotCXJlYWRfdW5sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQotCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKLQlfbGVhdmUoIiBbc3RvcmVkICMldV0iLCBjYWxsLT5yeF9maXJzdF9vb3MpOwotfQotCi0vKgotICogY2xlYXIgdGhlIFR4IHdpbmRvdyBvbiBmaW5hbCBBQ0sgcmVjZXB0aW9uCi0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX3phcF90eF93aW5kb3coc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGxvbmcgX3NrYiwgKmFja3Nfd2luZG93OwotCXU4IHdpbnN6ID0gY2FsbC0+YWNrc193aW5zejsKLQlpbnQgdGFpbDsKLQotCWFja3Nfd2luZG93ID0gY2FsbC0+YWNrc193aW5kb3c7Ci0JY2FsbC0+YWNrc193aW5kb3cgPSBOVUxMOwotCi0Jd2hpbGUgKENJUkNfQ05UKGNhbGwtPmFja3NfaGVhZCwgY2FsbC0+YWNrc190YWlsLCB3aW5zeikgPiAwKSB7Ci0JCXRhaWwgPSBjYWxsLT5hY2tzX3RhaWw7Ci0JCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOwotCQlfc2tiID0gYWNrc193aW5kb3dbdGFpbF0gJiB+MTsKLQkJc21wX21iKCk7Ci0JCWNhbGwtPmFja3NfdGFpbCA9IChjYWxsLT5hY2tzX3RhaWwgKyAxKSAmICh3aW5zeiAtIDEpOwotCi0JCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBfc2tiOwotCQlzcCA9IHJ4cnBjX3NrYihza2IpOwotCQlfZGVidWcoIisrKyBjbGVhciBUeCAldSIsIHNwLT5oZHIuc2VxKTsKLQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKLQl9Ci0KLQlrZnJlZShhY2tzX3dpbmRvdyk7Ci19Ci0KLS8qCi0gKiBwcm9jZXNzIHRoZSBleHRyYSBpbmZvcm1hdGlvbiB0aGF0IG1heSBiZSBhcHBlbmRlZCB0byBhbiBBQ0sgcGFja2V0Ci0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX2V4dHJhY3RfYWNraW5mbyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgIHVuc2lnbmVkIGludCBsYXRlc3QsIGludCBuQWNrcykKLXsKLQlzdHJ1Y3QgcnhycGNfYWNraW5mbyBhY2tpbmZvOwotCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOwotCXVuc2lnbmVkIGludCBtdHU7Ci0KLQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIG5BY2tzICsgMywgJmFja2luZm8sIHNpemVvZihhY2tpbmZvKSkgPCAwKSB7Ci0JCV9sZWF2ZSgiIFtubyBhY2tpbmZvXSIpOwotCQlyZXR1cm47Ci0JfQotCi0JX3Byb3RvKCJSeCBBQ0sgJSUldSBJbmZvIHsgcng9JXUgbWF4PSV1IHJ3aW49JXUgam09JXUgfSIsCi0JICAgICAgIGxhdGVzdCwKLQkgICAgICAgbnRvaGwoYWNraW5mby5yeE1UVSksIG50b2hsKGFja2luZm8ubWF4TVRVKSwKLQkgICAgICAgbnRvaGwoYWNraW5mby5yd2luZCksIG50b2hsKGFja2luZm8uanVtYm9fbWF4KSk7Ci0KLQltdHUgPSBtaW4obnRvaGwoYWNraW5mby5yeE1UVSksIG50b2hsKGFja2luZm8ubWF4TVRVKSk7Ci0KLQlwZWVyID0gY2FsbC0+Y29ubi0+cGFyYW1zLnBlZXI7Ci0JaWYgKG10dSA8IHBlZXItPm1heGRhdGEpIHsKLQkJc3Bpbl9sb2NrX2JoKCZwZWVyLT5sb2NrKTsKLQkJcGVlci0+bWF4ZGF0YSA9IG10dTsKLQkJcGVlci0+bXR1ID0gbXR1ICsgcGVlci0+aGRyc2l6ZTsKLQkJc3Bpbl91bmxvY2tfYmgoJnBlZXItPmxvY2spOwotCQlfbmV0KCJOZXQgTVRVICV1IChtYXhkYXRhICV1KSIsIHBlZXItPm10dSwgcGVlci0+bWF4ZGF0YSk7Ci0JfQotfQotCi0vKgotICogcHJvY2VzcyBwYWNrZXRzIGluIHRoZSByZWNlcHRpb24gcXVldWUKLSAqLwotc3RhdGljIGludCByeHJwY19wcm9jZXNzX3J4X3F1ZXVlKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCSAgdTMyICpfYWJvcnRfY29kZSkKLXsKLQlzdHJ1Y3QgcnhycGNfYWNrcGFja2V0IGFjazsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JYm9vbCBwb3N0X0FDSzsKLQlpbnQgbGF0ZXN0OwotCXUzMiBoYXJkLCB0eDsKLQotCV9lbnRlcigiIik7Ci0KLXByb2Nlc3NfZnVydGhlcjoKLQlza2IgPSBza2JfZGVxdWV1ZSgmY2FsbC0+cnhfcXVldWUpOwotCWlmICghc2tiKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCV9uZXQoImRlZmVycmVkIHNrYiAlcCIsIHNrYik7Ci0KLQlzcCA9IHJ4cnBjX3NrYihza2IpOwotCi0JX2RlYnVnKCJwcm9jZXNzICVzIFtzdCAlZF0iLCByeHJwY19wa3RzW3NwLT5oZHIudHlwZV0sIGNhbGwtPnN0YXRlKTsKLQotCXBvc3RfQUNLID0gZmFsc2U7Ci0KLQlzd2l0Y2ggKHNwLT5oZHIudHlwZSkgewotCQkvKiBkYXRhIHBhY2tldHMgdGhhdCB3aW5kIHVwIGhlcmUgaGF2ZSBiZWVuIHJlY2VpdmVkIG91dCBvZgotCQkgKiBvcmRlciwgbmVlZCBzZWN1cml0eSBwcm9jZXNzaW5nIG9yIGFyZSBqdW1ibyBwYWNrZXRzICovCi0JY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBOgotCQlfcHJvdG8oIk9PU1EgREFUQSAlJSV1IHsgIyV1IH0iLCBzcC0+aGRyLnNlcmlhbCwgc3AtPmhkci5zZXEpOwotCi0JCS8qIHNlY3VyZWQgcGFja2V0cyBtdXN0IGJlIHZlcmlmaWVkIGFuZCBwb3NzaWJseSBkZWNyeXB0ZWQgKi8KLQkJaWYgKGNhbGwtPmNvbm4tPnNlY3VyaXR5LT52ZXJpZnlfcGFja2V0KGNhbGwsIHNrYiwKLQkJCQkJCQlfYWJvcnRfY29kZSkgPCAwKQotCQkJZ290byBwcm90b2NvbF9lcnJvcjsKLQotCQlyeHJwY19pbnNlcnRfb29zX3BhY2tldChjYWxsLCBza2IpOwotCQlnb3RvIHByb2Nlc3NfZnVydGhlcjsKLQotCQkvKiBwYXJ0aWFsIEFDSyB0byBwcm9jZXNzICovCi0JY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0s6Ci0JCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgJmFjaywgc2l6ZW9mKGFjaykpIDwgMCkgewotCQkJX2RlYnVnKCJleHRyYWN0aW9uIGZhaWx1cmUiKTsKLQkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7Ci0JCX0KLQkJaWYgKCFza2JfcHVsbChza2IsIHNpemVvZihhY2spKSkKLQkJCUJVRygpOwotCi0JCWxhdGVzdCA9IHNwLT5oZHIuc2VyaWFsOwotCQloYXJkID0gbnRvaGwoYWNrLmZpcnN0UGFja2V0KTsKLQkJdHggPSBhdG9taWNfcmVhZCgmY2FsbC0+c2VxdWVuY2UpOwotCi0JCV9wcm90bygiUnggQUNLICUlJXUgeyBtPSVodSBmPSMldSBwPSMldSBzPSUlJXUgcj0lcyBuPSV1IH0iLAotCQkgICAgICAgbGF0ZXN0LAotCQkgICAgICAgbnRvaHMoYWNrLm1heFNrZXcpLAotCQkgICAgICAgaGFyZCwKLQkJICAgICAgIG50b2hsKGFjay5wcmV2aW91c1BhY2tldCksCi0JCSAgICAgICBudG9obChhY2suc2VyaWFsKSwKLQkJICAgICAgIHJ4cnBjX2Fja3MoYWNrLnJlYXNvbiksCi0JCSAgICAgICBhY2subkFja3MpOwotCi0JCXJ4cnBjX2V4dHJhY3RfYWNraW5mbyhjYWxsLCBza2IsIGxhdGVzdCwgYWNrLm5BY2tzKTsKLQotCQlpZiAoYWNrLnJlYXNvbiA9PSBSWFJQQ19BQ0tfUElORykgewotCQkJX3Byb3RvKCJSeCBBQ0sgJSUldSBQSU5HIFJlcXVlc3QiLCBsYXRlc3QpOwotCQkJcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgUlhSUENfQUNLX1BJTkdfUkVTUE9OU0UsCi0JCQkJCSAgc3AtPmhkci5zZXJpYWwsIHRydWUpOwotCQl9Ci0KLQkJLyogZGlzY2FyZCBhbnkgb3V0LW9mLW9yZGVyIG9yIGR1cGxpY2F0ZSBBQ0tzICovCi0JCWlmIChsYXRlc3QgLSBjYWxsLT5hY2tzX2xhdGVzdCA8PSAwKSB7Ci0JCQlfZGVidWcoImRpc2NhcmQgQUNLICVkIDw9ICVkIiwKLQkJCSAgICAgICBsYXRlc3QsIGNhbGwtPmFja3NfbGF0ZXN0KTsKLQkJCWdvdG8gZGlzY2FyZDsKLQkJfQotCQljYWxsLT5hY2tzX2xhdGVzdCA9IGxhdGVzdDsKLQotCQlpZiAoY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUICYmCi0JCSAgICBjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWSAmJgotCQkgICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9TRVJWRVJfU0VORF9SRVBMWSAmJgotCQkgICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9TRVJWRVJfQVdBSVRfQUNLKQotCQkJZ290byBkaXNjYXJkOwotCi0JCV9kZWJ1ZygiVHg9JWQgSD0ldSBTPSVkIiwgdHgsIGNhbGwtPmFja3NfaGFyZCwgY2FsbC0+c3RhdGUpOwotCi0JCWlmIChoYXJkID4gMCkgewotCQkJaWYgKGhhcmQgLSAxID4gdHgpIHsKLQkJCQlfZGVidWcoImhhcmQtQUNLJ2QgcGFja2V0ICVkIG5vdCB0cmFuc21pdHRlZCIKLQkJCQkgICAgICAgIiAoJWQgdG9wKSIsCi0JCQkJICAgICAgIGhhcmQgLSAxLCB0eCk7Ci0JCQkJZ290byBwcm90b2NvbF9lcnJvcjsKLQkJCX0KLQotCQkJaWYgKChjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWSB8fAotCQkJICAgICBjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX1NFUlZFUl9BV0FJVF9BQ0spICYmCi0JCQkgICAgaGFyZCA+IHR4KSB7Ci0JCQkJY2FsbC0+YWNrc19oYXJkID0gdHg7Ci0JCQkJZ290byBhbGxfYWNrZWQ7Ci0JCQl9Ci0KLQkJCXNtcF9ybWIoKTsKLQkJCXJ4cnBjX3JvdGF0ZV90eF93aW5kb3coY2FsbCwgaGFyZCAtIDEpOwotCQl9Ci0KLQkJaWYgKGFjay5uQWNrcyA+IDApIHsKLQkJCWlmIChoYXJkIC0gMSArIGFjay5uQWNrcyA+IHR4KSB7Ci0JCQkJX2RlYnVnKCJzb2Z0LUFDSydkIHBhY2tldCAlZCslZCBub3QiCi0JCQkJICAgICAgICIgdHJhbnNtaXR0ZWQgKCVkIHRvcCkiLAotCQkJCSAgICAgICBoYXJkIC0gMSwgYWNrLm5BY2tzLCB0eCk7Ci0JCQkJZ290byBwcm90b2NvbF9lcnJvcjsKLQkJCX0KLQotCQkJaWYgKHJ4cnBjX3Byb2Nlc3Nfc29mdF9BQ0tzKGNhbGwsICZhY2ssIHNrYikgPCAwKQotCQkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7Ci0JCX0KLQkJZ290byBkaXNjYXJkOwotCi0JCS8qIGNvbXBsZXRlIEFDSyB0byBwcm9jZXNzICovCi0JY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0tBTEw6Ci0JCWdvdG8gYWxsX2Fja2VkOwotCi0JCS8qIGFib3J0IGFuZCBidXN5IGFyZSBoYW5kbGVkIGVsc2V3aGVyZSAqLwotCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQlVTWToKLQljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOgotCQlCVUcoKTsKLQotCQkvKiBjb25uZWN0aW9uIGxldmVsIGV2ZW50cyAtIGFsc28gaGFuZGxlZCBlbHNld2hlcmUgKi8KLQljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0NIQUxMRU5HRToKLQljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX1JFU1BPTlNFOgotCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfREVCVUc6Ci0JCUJVRygpOwotCX0KLQotCS8qIGlmIHdlJ3ZlIGhhZCBhIGhhcmQgQUNLIHRoYXQgY292ZXJzIGFsbCB0aGUgcGFja2V0cyB3ZSd2ZSBzZW50LCB0aGVuCi0JICogdGhhdCBlbmRzIHRoYXQgcGhhc2Ugb2YgdGhlIG9wZXJhdGlvbiAqLwotYWxsX2Fja2VkOgotCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCV9kZWJ1ZygiYWNrIGFsbCAlZCIsIGNhbGwtPnN0YXRlKTsKLQotCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKLQljYXNlIFJYUlBDX0NBTExfQ0xJRU5UX0FXQUlUX1JFUExZOgotCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfQ0xJRU5UX1JFQ1ZfUkVQTFk7Ci0JCWJyZWFrOwotCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQVdBSVRfQUNLOgotCQlfZGVidWcoInNydiBjb21wbGV0ZSIpOwotCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfQ09NUExFVEU7Ci0JCXBvc3RfQUNLID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JY2FzZSBSWFJQQ19DQUxMX0NMSUVOVF9TRU5EX1JFUVVFU1Q6Ci0JY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1Q6Ci0JCWdvdG8gcHJvdG9jb2xfZXJyb3JfdW5sb2NrOyAvKiBjYW4ndCBvY2N1ciB5ZXQgKi8KLQlkZWZhdWx0OgotCQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCQlnb3RvIGRpc2NhcmQ7IC8qIGFzc3VtZSBwYWNrZXQgbGVmdCBvdmVyIGZyb20gZWFybGllciBwaGFzZSAqLwotCX0KLQotCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0KLQkvKiBpZiBhbGwgdGhlIHBhY2tldHMgd2Ugc2VudCBhcmUgaGFyZC1BQ0snZCwgdGhlbiB3ZSBjYW4gZGlzY2FyZAotCSAqIHdoYXRldmVyIHdlJ3ZlIGdvdCBsZWZ0ICovCi0JX2RlYnVnKCJjbGVhciBUeCAlZCIsCi0JICAgICAgIENJUkNfQ05UKGNhbGwtPmFja3NfaGVhZCwgY2FsbC0+YWNrc190YWlsLCBjYWxsLT5hY2tzX3dpbnN6KSk7Ci0KLQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKTsKLQljbGVhcl9iaXQoUlhSUENfQ0FMTF9SVU5fUlRJTUVSLCAmY2FsbC0+ZmxhZ3MpOwotCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JFU0VORF9USU1FUiwgJmNhbGwtPmV2ZW50cyk7Ci0KLQlpZiAoY2FsbC0+YWNrc193aW5kb3cpCi0JCXJ4cnBjX3phcF90eF93aW5kb3coY2FsbCk7Ci0KLQlpZiAocG9zdF9BQ0spIHsKLQkJLyogcG9zdCB0aGUgZmluYWwgQUNLIG1lc3NhZ2UgZm9yIHVzZXJzcGFjZSB0byBwaWNrIHVwICovCi0JCV9kZWJ1ZygicG9zdCBBQ0siKTsKLQkJc2tiLT5tYXJrID0gUlhSUENfU0tCX01BUktfRklOQUxfQUNLOwotCQlzcC0+Y2FsbCA9IGNhbGw7Ci0JCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwotCQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwotCQlpZiAocnhycGNfcXVldWVfcmN2X3NrYihjYWxsLCBza2IsIHRydWUsIHRydWUpIDwgMCkKLQkJCUJVRygpOwotCQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7Ci0JCWdvdG8gcHJvY2Vzc19mdXJ0aGVyOwotCX0KLQotZGlzY2FyZDoKLQlyeHJwY19mcmVlX3NrYihza2IpOwotCWdvdG8gcHJvY2Vzc19mdXJ0aGVyOwotCi1wcm90b2NvbF9lcnJvcl91bmxvY2s6Ci0Jd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLXByb3RvY29sX2Vycm9yOgotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci0JX2xlYXZlKCIgPSAtRVBST1RPIik7Ci0JcmV0dXJuIC1FUFJPVE87Ci19Ci0KLS8qCi0gKiBwb3N0IGEgbWVzc2FnZSB0byB0aGUgc29ja2V0IFJ4IHF1ZXVlIGZvciByZWN2bXNnKCkgdG8gcGljayB1cAotICovCi1zdGF0aWMgaW50IHJ4cnBjX3Bvc3RfbWVzc2FnZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTMyIG1hcmssIHUzMiBlcnJvciwKLQkJCSAgICAgIGJvb2wgZmF0YWwpCi17Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCByZXQ7Ci0KLQlfZW50ZXIoInslZCwlbHh9LCV1LCV1LCVkIiwKLQkgICAgICAgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPmZsYWdzLCBtYXJrLCBlcnJvciwgZmF0YWwpOwotCi0JLyogcmVtb3ZlIHRpbWVycyBhbmQgdGhpbmdzIGZvciBmYXRhbCBtZXNzYWdlcyAqLwotCWlmIChmYXRhbCkgewotCQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKTsKLQkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcik7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JVTl9SVElNRVIsICZjYWxsLT5mbGFncyk7Ci0JfQotCi0JaWYgKG1hcmsgIT0gUlhSUENfU0tCX01BUktfTkVXX0NBTEwgJiYKLQkgICAgIXRlc3RfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKSkgewotCQlfbGVhdmUoIltubyB1c2VyaWRdIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghdGVzdF9iaXQoUlhSUENfQ0FMTF9URVJNSU5BTF9NU0csICZjYWxsLT5mbGFncykpIHsKLQkJc2tiID0gYWxsb2Nfc2tiKDAsIEdGUF9OT0ZTKTsKLQkJaWYgKCFza2IpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlyeHJwY19uZXdfc2tiKHNrYik7Ci0KLQkJc2tiLT5tYXJrID0gbWFyazsKLQotCQlzcCA9IHJ4cnBjX3NrYihza2IpOwotCQltZW1zZXQoc3AsIDAsIHNpemVvZigqc3ApKTsKLQkJc3AtPmVycm9yID0gZXJyb3I7Ci0JCXNwLT5jYWxsID0gY2FsbDsKLQkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7Ci0KLQkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKLQkJcmV0ID0gcnhycGNfcXVldWVfcmN2X3NrYihjYWxsLCBza2IsIHRydWUsIGZhdGFsKTsKLQkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOwotCQlCVUdfT04ocmV0IDwgMCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBoYW5kbGUgYmFja2dyb3VuZCBwcm9jZXNzaW5nIG9mIGluY29taW5nIGNhbGwgcGFja2V0cyBhbmQgQUNLIC8gYWJvcnQKLSAqIGdlbmVyYXRpb24KKyAqIEhhbmRsZSByZXRyYW5zbWlzc2lvbiBhbmQgZGVmZXJyZWQgQUNLL2Fib3J0IGdlbmVyYXRpb24uCiAgKi8KIHZvaWQgcnhycGNfcHJvY2Vzc19jYWxsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnhycGNfY2FsbCwgcHJvY2Vzc29yKTsKLQlzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIgd2hkcjsKLQlzdHJ1Y3QgcnhycGNfYWNrcGFja2V0IGFjazsKLQlzdHJ1Y3QgcnhycGNfYWNraW5mbyBhY2tpbmZvOwotCXN0cnVjdCBtc2doZHIgbXNnOwotCXN0cnVjdCBrdmVjIGlvdls1XTsKLQllbnVtIHJ4cnBjX2NhbGxfZXZlbnQgZ2VuYml0OwotCXVuc2lnbmVkIGxvbmcgYml0czsKLQlfX2JlMzIgZGF0YSwgcGFkOwotCXNpemVfdCBsZW47Ci0JaW50IGxvb3AsIG5iaXQsIGlvYywgcmV0LCBtdHU7Ci0JdTMyIHNlcmlhbCwgYWJvcnRfY29kZSA9IFJYX1BST1RPQ09MX0VSUk9SOwotCXU4ICphY2tzID0gTlVMTDsKKwlrdGltZV90IG5vdzsKKworCXJ4cnBjX3NlZV9jYWxsKGNhbGwpOwogCiAJLy9wcmludGsoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCV9lbnRlcigieyVkLCVzLCVseH0gWyVsdV0iLAotCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+c3RhdGVdLCBjYWxsLT5ldmVudHMsCi0JICAgICAgIChqaWZmaWVzIC0gY2FsbC0+Y3JlYXRpb25famlmKSAvIChIWiAvIDEwKSk7CisJX2VudGVyKCJ7JWQsJXMsJWx4fSIsCisJICAgICAgIGNhbGwtPmRlYnVnX2lkLCByeHJwY19jYWxsX3N0YXRlc1tjYWxsLT5zdGF0ZV0sIGNhbGwtPmV2ZW50cyk7CiAKLQlpZiAodGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1BST0NfQlVTWSwgJmNhbGwtPmZsYWdzKSkgewotCQlfZGVidWcoIlhYWFhYWFhYWFhYWFggUlVOTklORyBPTiBNVUxUSVBMRSBDUFVTIFhYWFhYWFhYWFhYWFgiKTsKLQkJcmV0dXJuOworcmVjaGVja19zdGF0ZToKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpKSB7CisJCXJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpOworCQlnb3RvIHJlY2hlY2tfc3RhdGU7CiAJfQogCi0JLyogdGhlcmUncyBhIGdvb2QgY2hhbmNlIHdlJ3JlIGdvaW5nIHRvIGhhdmUgdG8gc2VuZCBhIG1lc3NhZ2UsIHNvIHNldAotCSAqIG9uZSB1cCBpbiBhZHZhbmNlICovCi0JbXNnLm1zZ19uYW1lCT0gJmNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5zcngudHJhbnNwb3J0OwotCW1zZy5tc2dfbmFtZWxlbgk9IGNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5zcngudHJhbnNwb3J0X2xlbjsKLQltc2cubXNnX2NvbnRyb2wJPSBOVUxMOwotCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0JbXNnLm1zZ19mbGFncwk9IDA7Ci0KLQl3aGRyLmVwb2NoCT0gaHRvbmwoY2FsbC0+Y29ubi0+cHJvdG8uZXBvY2gpOwotCXdoZHIuY2lkCT0gaHRvbmwoY2FsbC0+Y2lkKTsKLQl3aGRyLmNhbGxOdW1iZXIJPSBodG9ubChjYWxsLT5jYWxsX2lkKTsKLQl3aGRyLnNlcQk9IDA7Ci0Jd2hkci50eXBlCT0gUlhSUENfUEFDS0VUX1RZUEVfQUNLOwotCXdoZHIuZmxhZ3MJPSBjYWxsLT5jb25uLT5vdXRfY2xpZW50ZmxhZzsKLQl3aGRyLnVzZXJTdGF0dXMJPSAwOwotCXdoZHIuc2VjdXJpdHlJbmRleCA9IGNhbGwtPmNvbm4tPnNlY3VyaXR5X2l4OwotCXdoZHIuX3JzdmQJPSAwOwotCXdoZHIuc2VydmljZUlkCT0gaHRvbnMoY2FsbC0+c2VydmljZV9pZCk7Ci0KLQltZW1zZXQoaW92LCAwLCBzaXplb2YoaW92KSk7Ci0JaW92WzBdLmlvdl9iYXNlCT0gJndoZHI7Ci0JaW92WzBdLmlvdl9sZW4JPSBzaXplb2Yod2hkcik7Ci0KLQkvKiBkZWFsIHdpdGggZXZlbnRzIG9mIGEgZmluYWwgbmF0dXJlICovCi0JaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfRVZfUkNWRF9FUlJPUiwgJmNhbGwtPmV2ZW50cykpIHsKLQkJZW51bSByeHJwY19za2JfbWFyayBtYXJrOwotCQlpbnQgZXJyb3I7Ci0KLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfQ09OTl9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JFSkVDVF9CVVNZLCAmY2FsbC0+ZXZlbnRzKTsKLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCi0JCWVycm9yID0gY2FsbC0+ZXJyb3JfcmVwb3J0OwotCQlpZiAoZXJyb3IgPCBSWFJQQ19MT0NBTF9FUlJPUl9PRkZTRVQpIHsKLQkJCW1hcmsgPSBSWFJQQ19TS0JfTUFSS19ORVRfRVJST1I7Ci0JCQlfZGVidWcoInBvc3QgbmV0IGVycm9yICVkIiwgZXJyb3IpOwotCQl9IGVsc2UgewotCQkJbWFyayA9IFJYUlBDX1NLQl9NQVJLX0xPQ0FMX0VSUk9SOwotCQkJZXJyb3IgLT0gUlhSUENfTE9DQUxfRVJST1JfT0ZGU0VUOwotCQkJX2RlYnVnKCJwb3N0IG5ldCBsb2NhbCBlcnJvciAlZCIsIGVycm9yKTsKLQkJfQotCi0JCWlmIChyeHJwY19wb3N0X21lc3NhZ2UoY2FsbCwgbWFyaywgZXJyb3IsIHRydWUpIDwgMCkKLQkJCWdvdG8gbm9fbWVtOwotCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9FVl9SQ1ZEX0VSUk9SLCAmY2FsbC0+ZXZlbnRzKTsKLQkJZ290byBraWxsX0FDS3M7CisJaWYgKGNhbGwtPnN0YXRlID09IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnRpbWVyKTsKKwkJZ290byBvdXRfcHV0OwogCX0KIAotCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0VWX0NPTk5fQUJPUlQsICZjYWxsLT5ldmVudHMpKSB7Ci0JCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgPiwgUlhSUENfQ0FMTF9DT01QTEVURSk7Ci0KLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfUkVKRUNUX0JVU1ksICZjYWxsLT5ldmVudHMpOwotCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9FVl9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7Ci0KLQkJX2RlYnVnKCJwb3N0IGNvbm4gYWJvcnQiKTsKLQotCQlpZiAocnhycGNfcG9zdF9tZXNzYWdlKGNhbGwsIFJYUlBDX1NLQl9NQVJLX0xPQ0FMX0VSUk9SLAotCQkJCSAgICAgICBjYWxsLT5jb25uLT5lcnJvciwgdHJ1ZSkgPCAwKQotCQkJZ290byBub19tZW07Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX0NPTk5fQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCQlnb3RvIGtpbGxfQUNLczsKKwlub3cgPSBrdGltZV9nZXRfcmVhbCgpOworCWlmIChrdGltZV9iZWZvcmUoY2FsbC0+ZXhwaXJlX2F0LCBub3cpKSB7CisJCXJ4cnBjX2Fib3J0X2NhbGwoIkVYUCIsIGNhbGwsIDAsIFJYX0NBTExfVElNRU9VVCwgRVRJTUUpOworCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpOworCQlnb3RvIHJlY2hlY2tfc3RhdGU7CiAJfQogCi0JaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfRVZfUkVKRUNUX0JVU1ksICZjYWxsLT5ldmVudHMpKSB7Ci0JCXdoZHIudHlwZSA9IFJYUlBDX1BBQ0tFVF9UWVBFX0JVU1k7Ci0JCWdlbmJpdCA9IFJYUlBDX0NBTExfRVZfUkVKRUNUX0JVU1k7Ci0JCWdvdG8gc2VuZF9tZXNzYWdlOwotCX0KLQotCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0VWX0FCT1JULCAmY2FsbC0+ZXZlbnRzKSkgewotCQlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsID4sIFJYUlBDX0NBTExfQ09NUExFVEUpOwotCi0JCWlmIChyeHJwY19wb3N0X21lc3NhZ2UoY2FsbCwgUlhSUENfU0tCX01BUktfTE9DQUxfRVJST1IsCi0JCQkJICAgICAgIEVDT05OQUJPUlRFRCwgdHJ1ZSkgPCAwKQotCQkJZ290byBub19tZW07Ci0JCXdoZHIudHlwZSA9IFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOwotCQlkYXRhID0gaHRvbmwoY2FsbC0+bG9jYWxfYWJvcnQpOwotCQlpb3ZbMV0uaW92X2Jhc2UgPSAmZGF0YTsKLQkJaW92WzFdLmlvdl9sZW4gPSBzaXplb2YoZGF0YSk7Ci0JCWdlbmJpdCA9IFJYUlBDX0NBTExfRVZfQUJPUlQ7Ci0JCWdvdG8gc2VuZF9tZXNzYWdlOwotCX0KLQotCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0VWX0FDS19GSU5BTCwgJmNhbGwtPmV2ZW50cykpIHsKLQkJZ2VuYml0ID0gUlhSUENfQ0FMTF9FVl9BQ0tfRklOQUw7Ci0KLQkJYWNrLmJ1ZmZlclNwYWNlCT0gaHRvbnMoOCk7Ci0JCWFjay5tYXhTa2V3CT0gMDsKLQkJYWNrLnNlcmlhbAk9IDA7Ci0JCWFjay5yZWFzb24JPSBSWFJQQ19BQ0tfSURMRTsKLQkJYWNrLm5BY2tzCT0gMDsKLQkJY2FsbC0+YWNrcl9yZWFzb24gPSAwOwotCi0JCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7Ci0JCWFjay5zZXJpYWwJPSBodG9ubChjYWxsLT5hY2tyX3NlcmlhbCk7Ci0JCWFjay5wcmV2aW91c1BhY2tldCA9IGh0b25sKGNhbGwtPmFja3JfcHJldl9zZXEpOwotCQlhY2suZmlyc3RQYWNrZXQJPSBodG9ubChjYWxsLT5yeF9kYXRhX2VhdGVuICsgMSk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKLQotCQlwYWQgPSAwOwotCi0JCWlvdlsxXS5pb3ZfYmFzZSA9ICZhY2s7Ci0JCWlvdlsxXS5pb3ZfbGVuCT0gc2l6ZW9mKGFjayk7Ci0JCWlvdlsyXS5pb3ZfYmFzZSA9ICZwYWQ7Ci0JCWlvdlsyXS5pb3ZfbGVuCT0gMzsKLQkJaW92WzNdLmlvdl9iYXNlID0gJmFja2luZm87Ci0JCWlvdlszXS5pb3ZfbGVuCT0gc2l6ZW9mKGFja2luZm8pOwotCQlnb3RvIHNlbmRfQUNLOwotCX0KLQotCWlmIChjYWxsLT5ldmVudHMgJiAoKDEgPDwgUlhSUENfQ0FMTF9FVl9SQ1ZEX0JVU1kpIHwKLQkJCSAgICAoMSA8PCBSWFJQQ19DQUxMX0VWX1JDVkRfQUJPUlQpKQotCSAgICApIHsKLQkJdTMyIG1hcms7Ci0KLQkJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfRVZfUkNWRF9BQk9SVCwgJmNhbGwtPmV2ZW50cykpCi0JCQltYXJrID0gUlhSUENfU0tCX01BUktfUkVNT1RFX0FCT1JUOwotCQllbHNlCi0JCQltYXJrID0gUlhSUENfU0tCX01BUktfQlVTWTsKLQotCQlfZGVidWcoInBvc3QgYWJvcnQvYnVzeSIpOwotCQlyeHJwY19jbGVhcl90eF93aW5kb3coY2FsbCk7Ci0JCWlmIChyeHJwY19wb3N0X21lc3NhZ2UoY2FsbCwgbWFyaywgRUNPTk5BQk9SVEVELCB0cnVlKSA8IDApCi0JCQlnb3RvIG5vX21lbTsKLQotCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9FVl9SQ1ZEX0JVU1ksICZjYWxsLT5ldmVudHMpOwotCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9FVl9SQ1ZEX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKLQkJZ290byBraWxsX0FDS3M7Ci0JfQotCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JDVkRfQUNLQUxMLCAmY2FsbC0+ZXZlbnRzKSkgewotCQlfZGVidWcoImRvIGltcGxpY2l0IGFja2FsbCIpOwotCQlyeHJwY19jbGVhcl90eF93aW5kb3coY2FsbCk7Ci0JfQotCi0JaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfRVZfTElGRV9USU1FUiwgJmNhbGwtPmV2ZW50cykpIHsKLQkJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCWlmIChjYWxsLT5zdGF0ZSA8PSBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7Ci0JCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOwotCQkJY2FsbC0+bG9jYWxfYWJvcnQgPSBSWF9DQUxMX1RJTUVPVVQ7Ci0JCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCQl9Ci0JCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0KLQkJX2RlYnVnKCJwb3N0IHRpbWVvdXQiKTsKLQkJaWYgKHJ4cnBjX3Bvc3RfbWVzc2FnZShjYWxsLCBSWFJQQ19TS0JfTUFSS19MT0NBTF9FUlJPUiwKLQkJCQkgICAgICAgRVRJTUUsIHRydWUpIDwgMCkKLQkJCWdvdG8gbm9fbWVtOwotCi0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX0xJRkVfVElNRVIsICZjYWxsLT5ldmVudHMpOwotCQlnb3RvIGtpbGxfQUNLczsKLQl9Ci0KLQkvKiBkZWFsIHdpdGggYXNzb3J0ZWQgaW5ib3VuZCBtZXNzYWdlcyAqLwotCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkpIHsKLQkJc3dpdGNoIChyeHJwY19wcm9jZXNzX3J4X3F1ZXVlKGNhbGwsICZhYm9ydF9jb2RlKSkgewotCQljYXNlIDA6Ci0JCWNhc2UgLUVBR0FJTjoKLQkJCWJyZWFrOwotCQljYXNlIC1FTk9NRU06Ci0JCQlnb3RvIG5vX21lbTsKLQkJY2FzZSAtRUtFWUVYUElSRUQ6Ci0JCWNhc2UgLUVLRVlSRUpFQ1RFRDoKLQkJY2FzZSAtRVBST1RPOgotCQkJcnhycGNfYWJvcnRfY2FsbChjYWxsLCBhYm9ydF9jb2RlKTsKLQkJCWdvdG8ga2lsbF9BQ0tzOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlhSUENfQ0FMTF9FVl9BQ0ssICZjYWxsLT5ldmVudHMpKSB7CisJCWNhbGwtPmFja19hdCA9IGNhbGwtPmV4cGlyZV9hdDsKKwkJaWYgKGNhbGwtPmFja3JfcmVhc29uKSB7CisJCQlyeHJwY19zZW5kX2NhbGxfcGFja2V0KGNhbGwsIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSyk7CisJCQlnb3RvIHJlY2hlY2tfc3RhdGU7CiAJCX0KIAl9CiAKLQkvKiBoYW5kbGUgcmVzZW5kaW5nICovCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JFU0VORF9USU1FUiwgJmNhbGwtPmV2ZW50cykpCi0JCXJ4cnBjX3Jlc2VuZF90aW1lcihjYWxsKTsKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfUkVTRU5ELCAmY2FsbC0+ZXZlbnRzKSkKLQkJcnhycGNfcmVzZW5kKGNhbGwpOwotCi0JLyogY29uc2lkZXIgc2VuZGluZyBhbiBvcmRpbmFyeSBBQ0sgKi8KLQlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9FVl9BQ0ssICZjYWxsLT5ldmVudHMpKSB7Ci0JCV9kZWJ1Zygic2VuZCBBQ0s6IHdpbmRvdzogJWQgLSAlZCB7ICVseCB9IiwKLQkJICAgICAgIGNhbGwtPnJ4X2RhdGFfZWF0ZW4sIGNhbGwtPmFja3Jfd2luX3RvcCwKLQkJICAgICAgIGNhbGwtPmFja3Jfd2luZG93WzBdKTsKLQotCQlpZiAoY2FsbC0+c3RhdGUgPiBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVCAmJgotCQkgICAgY2FsbC0+YWNrcl9yZWFzb24gIT0gUlhSUENfQUNLX1BJTkdfUkVTUE9OU0UpIHsKLQkJCS8qIEFDSyBieSBzZW5kaW5nIHJlcGx5IERBVEEgcGFja2V0IGluIHRoaXMgc3RhdGUgKi8KLQkJCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX0FDSywgJmNhbGwtPmV2ZW50cyk7Ci0JCQlnb3RvIG1heWJlX3Jlc2NoZWR1bGU7Ci0JCX0KLQotCQlnZW5iaXQgPSBSWFJQQ19DQUxMX0VWX0FDSzsKLQotCQlhY2tzID0ga3phbGxvYyhjYWxsLT5hY2tyX3dpbl90b3AgLSBjYWxsLT5yeF9kYXRhX2VhdGVuLAotCQkJICAgICAgIEdGUF9OT0ZTKTsKLQkJaWYgKCFhY2tzKQotCQkJZ290byBub19tZW07Ci0KLQkJLy9oZHIuZmxhZ3MJPSBSWFJQQ19TTE9XX1NUQVJUX09LOwotCQlhY2suYnVmZmVyU3BhY2UJPSBodG9ucyg4KTsKLQkJYWNrLm1heFNrZXcJPSAwOwotCi0JCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7Ci0JCWFjay5yZWFzb24JPSBjYWxsLT5hY2tyX3JlYXNvbjsKLQkJYWNrLnNlcmlhbAk9IGh0b25sKGNhbGwtPmFja3Jfc2VyaWFsKTsKLQkJYWNrLnByZXZpb3VzUGFja2V0ID0gaHRvbmwoY2FsbC0+YWNrcl9wcmV2X3NlcSk7Ci0JCWFjay5maXJzdFBhY2tldCA9IGh0b25sKGNhbGwtPnJ4X2RhdGFfZWF0ZW4gKyAxKTsKLQotCQlhY2subkFja3MgPSAwOwotCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgUlhSUENfQUNLUl9XSU5ET1dfQVNaOyBsb29wKyspIHsKLQkJCW5iaXQgPSBsb29wICogQklUU19QRVJfTE9ORzsKLQkJCWZvciAoYml0cyA9IGNhbGwtPmFja3Jfd2luZG93W2xvb3BdOyBiaXRzOyBiaXRzID4+PSAxCi0JCQkgICAgICkgewotCQkJCV9kZWJ1ZygiLSBsPSVkIG49JWQgYj0lbHgiLCBsb29wLCBuYml0LCBiaXRzKTsKLQkJCQlpZiAoYml0cyAmIDEpIHsKLQkJCQkJYWNrc1tuYml0XSA9IFJYUlBDX0FDS19UWVBFX0FDSzsKLQkJCQkJYWNrLm5BY2tzID0gbmJpdCArIDE7Ci0JCQkJfQotCQkJCW5iaXQrKzsKLQkJCX0KLQkJfQotCQljYWxsLT5hY2tyX3JlYXNvbiA9IDA7Ci0JCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKLQotCQlwYWQgPSAwOwotCi0JCWlvdlsxXS5pb3ZfYmFzZSA9ICZhY2s7Ci0JCWlvdlsxXS5pb3ZfbGVuCT0gc2l6ZW9mKGFjayk7Ci0JCWlvdlsyXS5pb3ZfYmFzZSA9IGFja3M7Ci0JCWlvdlsyXS5pb3ZfbGVuCT0gYWNrLm5BY2tzOwotCQlpb3ZbM10uaW92X2Jhc2UgPSAmcGFkOwotCQlpb3ZbM10uaW92X2xlbgk9IDM7Ci0JCWlvdls0XS5pb3ZfYmFzZSA9ICZhY2tpbmZvOwotCQlpb3ZbNF0uaW92X2xlbgk9IHNpemVvZihhY2tpbmZvKTsKLQotCQlzd2l0Y2ggKGFjay5yZWFzb24pIHsKLQkJY2FzZSBSWFJQQ19BQ0tfUkVRVUVTVEVEOgotCQljYXNlIFJYUlBDX0FDS19EVVBMSUNBVEU6Ci0JCWNhc2UgUlhSUENfQUNLX09VVF9PRl9TRVFVRU5DRToKLQkJY2FzZSBSWFJQQ19BQ0tfRVhDRUVEU19XSU5ET1c6Ci0JCWNhc2UgUlhSUENfQUNLX05PU1BBQ0U6Ci0JCWNhc2UgUlhSUENfQUNLX1BJTkc6Ci0JCWNhc2UgUlhSUENfQUNLX1BJTkdfUkVTUE9OU0U6Ci0JCQlnb3RvIHNlbmRfQUNLX3dpdGhfc2tldzsKLQkJY2FzZSBSWFJQQ19BQ0tfREVMQVk6Ci0JCWNhc2UgUlhSUENfQUNLX0lETEU6Ci0JCQlnb3RvIHNlbmRfQUNLOwotCQl9CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JFU0VORCwgJmNhbGwtPmV2ZW50cykpIHsKKwkJcnhycGNfcmVzZW5kKGNhbGwsIG5vdyk7CisJCWdvdG8gcmVjaGVja19zdGF0ZTsKIAl9CiAKLQkvKiBoYW5kbGUgY29tcGxldGlvbiBvZiBzZWN1cml0eSBuZWdvdGlhdGlvbnMgb24gYW4gaW5jb21pbmcKLQkgKiBjb25uZWN0aW9uICovCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1NFQ1VSRUQsICZjYWxsLT5ldmVudHMpKSB7Ci0JCV9kZWJ1Zygic2VjdXJlZCIpOwotCQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwotCi0JCWlmIChjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX1NFUlZFUl9TRUNVUklORykgewotCQkJX2RlYnVnKCJzZWN1cmluZyIpOwotCQkJd3JpdGVfbG9jaygmY2FsbC0+c29ja2V0LT5jYWxsX2xvY2spOwotCQkJaWYgKCF0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpICYmCi0JCQkgICAgIXRlc3RfYml0KFJYUlBDX0NBTExfRVZfUkVMRUFTRSwgJmNhbGwtPmV2ZW50cykpIHsKLQkJCQlfZGVidWcoIm5vdCByZWxlYXNlZCIpOwotCQkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HOwotCQkJCWxpc3RfbW92ZV90YWlsKCZjYWxsLT5hY2NlcHRfbGluaywKLQkJCQkJICAgICAgICZjYWxsLT5zb2NrZXQtPmFjY2VwdHEpOwotCQkJfQotCQkJd3JpdGVfdW5sb2NrKCZjYWxsLT5zb2NrZXQtPmNhbGxfbG9jayk7Ci0JCQlyZWFkX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCQkJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkKLQkJCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfUE9TVF9BQ0NFUFQsICZjYWxsLT5ldmVudHMpOwotCQkJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCQl9Ci0KLQkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOwotCQlpZiAoIXRlc3RfYml0KFJYUlBDX0NBTExfRVZfUE9TVF9BQ0NFUFQsICZjYWxsLT5ldmVudHMpKQotCQkJZ290byBtYXliZV9yZXNjaGVkdWxlOwotCX0KLQotCS8qIHBvc3QgYSBub3RpZmljYXRpb24gb2YgYW4gYWNjZXB0YWJsZSBjb25uZWN0aW9uIHRvIHRoZSBhcHAgKi8KLQlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9FVl9QT1NUX0FDQ0VQVCwgJmNhbGwtPmV2ZW50cykpIHsKLQkJX2RlYnVnKCJwb3N0IGFjY2VwdCIpOwotCQlpZiAocnhycGNfcG9zdF9tZXNzYWdlKGNhbGwsIFJYUlBDX1NLQl9NQVJLX05FV19DQUxMLAotCQkJCSAgICAgICAwLCBmYWxzZSkgPCAwKQotCQkJZ290byBub19tZW07Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1BPU1RfQUNDRVBULCAmY2FsbC0+ZXZlbnRzKTsKLQkJZ290byBtYXliZV9yZXNjaGVkdWxlOwotCX0KLQotCS8qIGhhbmRsZSBpbmNvbWluZyBjYWxsIGFjY2VwdGFuY2UgKi8KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfQUNDRVBURUQsICZjYWxsLT5ldmVudHMpKSB7Ci0JCV9kZWJ1ZygiYWNjZXB0ZWQiKTsKLQkJQVNTRVJUQ01QKGNhbGwtPnJ4X2RhdGFfcG9zdCwgPT0sIDApOwotCQljYWxsLT5yeF9kYXRhX3Bvc3QgPSAxOwotCQlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCQlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0NPTVBMRVRFKQotCQkJc2V0X2JpdChSWFJQQ19DQUxMX0VWX0RSQUlOX1JYX09PUywgJmNhbGwtPmV2ZW50cyk7Ci0JCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQl9Ci0KLQkvKiBkcmFpbiB0aGUgb3V0IG9mIHNlcXVlbmNlIHJlY2VpdmVkIHBhY2tldCBxdWV1ZSBpbnRvIHRoZSBwYWNrZXQgUngKLQkgKiBxdWV1ZSAqLwotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlhSUENfQ0FMTF9FVl9EUkFJTl9SWF9PT1MsICZjYWxsLT5ldmVudHMpKSB7Ci0JCXdoaWxlIChjYWxsLT5yeF9kYXRhX3Bvc3QgPT0gY2FsbC0+cnhfZmlyc3Rfb29zKQotCQkJaWYgKHJ4cnBjX2RyYWluX3J4X29vc19xdWV1ZShjYWxsKSA8IDApCi0JCQkJYnJlYWs7Ci0JCWdvdG8gbWF5YmVfcmVzY2hlZHVsZTsKLQl9Ci0KLQlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9FVl9SRUxFQVNFLCAmY2FsbC0+ZXZlbnRzKSkgewotCQlyeHJwY19yZWxlYXNlX2NhbGwoY2FsbCk7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JFTEVBU0UsICZjYWxsLT5ldmVudHMpOwotCX0KKwlyeHJwY19zZXRfdGltZXIoY2FsbCwgcnhycGNfdGltZXJfc2V0X2Zvcl9yZXNlbmQsIG5vdyk7CiAKIAkvKiBvdGhlciBldmVudHMgbWF5IGhhdmUgYmVlbiByYWlzZWQgc2luY2Ugd2Ugc3RhcnRlZCBjaGVja2luZyAqLwotCWdvdG8gbWF5YmVfcmVzY2hlZHVsZTsKLQotc2VuZF9BQ0tfd2l0aF9za2V3OgotCWFjay5tYXhTa2V3ID0gaHRvbnMoYXRvbWljX3JlYWQoJmNhbGwtPmNvbm4tPmhpX3NlcmlhbCkgLQotCQkJICAgIG50b2hsKGFjay5zZXJpYWwpKTsKLXNlbmRfQUNLOgotCW10dSA9IGNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5pZl9tdHU7Ci0JbXR1IC09IGNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5oZHJzaXplOwotCWFja2luZm8ubWF4TVRVCT0gaHRvbmwobXR1KTsKLQlhY2tpbmZvLnJ3aW5kCT0gaHRvbmwocnhycGNfcnhfd2luZG93X3NpemUpOwotCi0JLyogcGVybWl0IHRoZSBwZWVyIHRvIHNlbmQgdXMganVtYm8gcGFja2V0cyBpZiBpdCB3YW50cyB0byAqLwotCWFja2luZm8ucnhNVFUJPSBodG9ubChyeHJwY19yeF9tdHUpOwotCWFja2luZm8uanVtYm9fbWF4ID0gaHRvbmwocnhycGNfcnhfanVtYm9fbWF4KTsKLQotCXNlcmlhbCA9IGF0b21pY19pbmNfcmV0dXJuKCZjYWxsLT5jb25uLT5zZXJpYWwpOwotCXdoZHIuc2VyaWFsID0gaHRvbmwoc2VyaWFsKTsKLQlfcHJvdG8oIlR4IEFDSyAlJSV1IHsgbT0laHUgZj0jJXUgcD0jJXUgcz0lJSV1IHI9JXMgbj0ldSB9IiwKLQkgICAgICAgc2VyaWFsLAotCSAgICAgICBudG9ocyhhY2subWF4U2tldyksCi0JICAgICAgIG50b2hsKGFjay5maXJzdFBhY2tldCksCi0JICAgICAgIG50b2hsKGFjay5wcmV2aW91c1BhY2tldCksCi0JICAgICAgIG50b2hsKGFjay5zZXJpYWwpLAotCSAgICAgICByeHJwY19hY2tzKGFjay5yZWFzb24pLAotCSAgICAgICBhY2subkFja3MpOwotCi0JZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcik7Ci0JaWYgKGFjay5uQWNrcyA+IDApCi0JCXNldF9iaXQoUlhSUENfQ0FMTF9UWF9TT0ZUX0FDSywgJmNhbGwtPmZsYWdzKTsKLQlnb3RvIHNlbmRfbWVzc2FnZV8yOwotCi1zZW5kX21lc3NhZ2U6Ci0JX2RlYnVnKCJzZW5kIG1lc3NhZ2UiKTsKLQotCXNlcmlhbCA9IGF0b21pY19pbmNfcmV0dXJuKCZjYWxsLT5jb25uLT5zZXJpYWwpOwotCXdoZHIuc2VyaWFsID0gaHRvbmwoc2VyaWFsKTsKLQlfcHJvdG8oIlR4ICVzICUlJXUiLCByeHJwY19wa3RzW3doZHIudHlwZV0sIHNlcmlhbCk7Ci1zZW5kX21lc3NhZ2VfMjoKLQotCWxlbiA9IGlvdlswXS5pb3ZfbGVuOwotCWlvYyA9IDE7Ci0JaWYgKGlvdls0XS5pb3ZfbGVuKSB7Ci0JCWlvYyA9IDU7Ci0JCWxlbiArPSBpb3ZbNF0uaW92X2xlbjsKLQkJbGVuICs9IGlvdlszXS5pb3ZfbGVuOwotCQlsZW4gKz0gaW92WzJdLmlvdl9sZW47Ci0JCWxlbiArPSBpb3ZbMV0uaW92X2xlbjsKLQl9IGVsc2UgaWYgKGlvdlszXS5pb3ZfbGVuKSB7Ci0JCWlvYyA9IDQ7Ci0JCWxlbiArPSBpb3ZbM10uaW92X2xlbjsKLQkJbGVuICs9IGlvdlsyXS5pb3ZfbGVuOwotCQlsZW4gKz0gaW92WzFdLmlvdl9sZW47Ci0JfSBlbHNlIGlmIChpb3ZbMl0uaW92X2xlbikgewotCQlpb2MgPSAzOwotCQlsZW4gKz0gaW92WzJdLmlvdl9sZW47Ci0JCWxlbiArPSBpb3ZbMV0uaW92X2xlbjsKLQl9IGVsc2UgaWYgKGlvdlsxXS5pb3ZfbGVuKSB7Ci0JCWlvYyA9IDI7Ci0JCWxlbiArPSBpb3ZbMV0uaW92X2xlbjsKKwlpZiAoY2FsbC0+ZXZlbnRzICYmIGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQlfX3J4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IGtlcm5lbF9zZW5kbXNnKGNhbGwtPmNvbm4tPnBhcmFtcy5sb2NhbC0+c29ja2V0LAotCQkJICAgICAmbXNnLCBpb3YsIGlvYywgbGVuKTsKLQlpZiAocmV0IDwgMCkgewotCQlfZGVidWcoInNlbmRtc2cgZmFpbGVkOiAlZCIsIHJldCk7Ci0JCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfREVBRCkKLQkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlzd2l0Y2ggKGdlbmJpdCkgewotCWNhc2UgUlhSUENfQ0FMTF9FVl9BQk9SVDoKLQkJY2xlYXJfYml0KGdlbmJpdCwgJmNhbGwtPmV2ZW50cyk7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JDVkRfQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCQlnb3RvIGtpbGxfQUNLczsKLQotCWNhc2UgUlhSUENfQ0FMTF9FVl9BQ0tfRklOQUw6Ci0JCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCQlpZiAoY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9DTElFTlRfRklOQUxfQUNLKQotCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0NPTVBMRVRFOwotCQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCQlnb3RvIGtpbGxfQUNLczsKLQotCWRlZmF1bHQ6Ci0JCWNsZWFyX2JpdChnZW5iaXQsICZjYWxsLT5ldmVudHMpOwotCQlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7Ci0JCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFk6Ci0JCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWToKLQkJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1Q6Ci0JCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1Q6Ci0JCQlfZGVidWcoInN0YXJ0IEFDSyB0aW1lciIpOwotCQkJcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgUlhSUENfQUNLX0RFTEFZLAotCQkJCQkgIGNhbGwtPmFja3Jfc2VyaWFsLCBmYWxzZSk7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlnb3RvIG1heWJlX3Jlc2NoZWR1bGU7Ci0JfQotCi1raWxsX0FDS3M6Ci0JZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcik7Ci0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX0VWX0FDS19GSU5BTCwgJmNhbGwtPmV2ZW50cykpCi0JCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX0FDSywgJmNhbGwtPmV2ZW50cyk7Ci0KLW1heWJlX3Jlc2NoZWR1bGU6Ci0JaWYgKGNhbGwtPmV2ZW50cyB8fCAhc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkpIHsKLQkJcmVhZF9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQkJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9ERUFEKQotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQkJcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCX0KLQotCS8qIGRvbid0IGxlYXZlIGFib3J0ZWQgY29ubmVjdGlvbnMgb24gdGhlIGFjY2VwdCBxdWV1ZSAqLwotCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFICYmCi0JICAgICFsaXN0X2VtcHR5KCZjYWxsLT5hY2NlcHRfbGluaykpIHsKLQkJX2RlYnVnKCJYIHVubGlua2luZyBvbmNlLXBlbmRpbmcgY2FsbCAlcCB7IGU9JWx4IGY9JWx4IGM9JXggfSIsCi0JCSAgICAgICBjYWxsLCBjYWxsLT5ldmVudHMsIGNhbGwtPmZsYWdzLCBjYWxsLT5jb25uLT5wcm90by5jaWQpOwotCi0JCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCWlmICghdGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSAmJgotCQkgICAgIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9SRUxFQVNFLCAmY2FsbC0+ZXZlbnRzKSkKLQkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQl9Ci0KLWVycm9yOgotCWNsZWFyX2JpdChSWFJQQ19DQUxMX1BST0NfQlVTWSwgJmNhbGwtPmZsYWdzKTsKLQlrZnJlZShhY2tzKTsKLQotCS8qIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0d28gQ1BVcyBib3RoIHByb2Nlc3NpbmcgdGhlIHdvcmsgaXRlbSBmb3Igb25lCi0JICogY2FsbCBhdCB0aGUgc2FtZSB0aW1lLCB3ZSB1c2UgYSBmbGFnIHRvIG5vdGUgd2hlbiBpdCdzIGJ1c3k7IGhvd2V2ZXIKLQkgKiB0aGlzIG1lYW5zIHRoZXJlJ3MgYSByYWNlIGJldHdlZW4gY2xlYXJpbmcgdGhlIGZsYWcgYW5kIHNldHRpbmcgdGhlCi0JICogd29yayBwZW5kaW5nIGJpdCBhbmQgdGhlIHdvcmsgaXRlbSBiZWluZyBwcm9jZXNzZWQgYWdhaW4gKi8KLQlpZiAoY2FsbC0+ZXZlbnRzICYmICF3b3JrX3BlbmRpbmcoJmNhbGwtPnByb2Nlc3NvcikpIHsKLQkJX2RlYnVnKCJqdW1wc3RhcnQgJXgiLCBjYWxsLT5jb25uLT5wcm90by5jaWQpOwotCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOwotCX0KLQorb3V0X3B1dDoKKwlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CitvdXQ6CiAJX2xlYXZlKCIiKTsKLQlyZXR1cm47Ci0KLW5vX21lbToKLQlfZGVidWcoIm91dCBvZiBtZW1vcnkiKTsKLQlnb3RvIG1heWJlX3Jlc2NoZWR1bGU7CiB9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvY2FsbF9vYmplY3QuYyBiL25ldC9yeHJwYy9jYWxsX29iamVjdC5jCmluZGV4IDkxMjg3YzkuLjM2NGI0MmQgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9jYWxsX29iamVjdC5jCisrKyBiL25ldC9yeHJwYy9jYWxsX29iamVjdC5jCkBAIC0xOSwyMyArMTksMTMgQEAKICNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KICNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgogCi0vKgotICogTWF4aW11bSBsaWZldGltZSBvZiBhIGNhbGwgKGluIGppZmZpZXMpLgotICovCi11bnNpZ25lZCBpbnQgcnhycGNfbWF4X2NhbGxfbGlmZXRpbWUgPSA2MCAqIEhaOwotCi0vKgotICogVGltZSB0aWxsIGRlYWQgY2FsbCBleHBpcmVzIGFmdGVyIGxhc3QgdXNlIChpbiBqaWZmaWVzKS4KLSAqLwotdW5zaWduZWQgaW50IHJ4cnBjX2RlYWRfY2FsbF9leHBpcnkgPSAyICogSFo7Ci0KIGNvbnN0IGNoYXIgKmNvbnN0IHJ4cnBjX2NhbGxfc3RhdGVzW05SX19SWFJQQ19DQUxMX1NUQVRFU10gPSB7Ci0JW1JYUlBDX0NBTExfVU5JTklUSUFMSVNFRF0JCT0gIlVuaW5pdCIsCisJW1JYUlBDX0NBTExfVU5JTklUSUFMSVNFRF0JCT0gIlVuaW5pdCAgIiwKIAlbUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfQ09OTl0JCT0gIkNsV3RDb25uIiwKIAlbUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUXQk9ICJDbFNuZFJlcSIsCiAJW1JYUlBDX0NBTExfQ0xJRU5UX0FXQUlUX1JFUExZXQkJPSAiQ2xBd3RScGwiLAogCVtSWFJQQ19DQUxMX0NMSUVOVF9SRUNWX1JFUExZXQkJPSAiQ2xSY3ZScGwiLAotCVtSWFJQQ19DQUxMX0NMSUVOVF9GSU5BTF9BQ0tdCQk9ICJDbEZubEFDSyIsCisJW1JYUlBDX0NBTExfU0VSVkVSX1BSRUFMTE9DXQkJPSAiU3ZQcmVhbGMiLAogCVtSWFJQQ19DQUxMX1NFUlZFUl9TRUNVUklOR10JCT0gIlN2U2VjdXJlIiwKIAlbUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HXQkJPSAiU3ZBY2NlcHQiLAogCVtSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1RdCT0gIlN2UmN2UmVxIiwKQEAgLTQzLDIyICszMyw0NyBAQAogCVtSWFJQQ19DQUxMX1NFUlZFUl9TRU5EX1JFUExZXQkJPSAiU3ZTbmRScGwiLAogCVtSWFJQQ19DQUxMX1NFUlZFUl9BV0FJVF9BQ0tdCQk9ICJTdkF3dEFDSyIsCiAJW1JYUlBDX0NBTExfQ09NUExFVEVdCQkJPSAiQ29tcGxldGUiLAotCVtSWFJQQ19DQUxMX1NFUlZFUl9CVVNZXQkJPSAiU3ZCdXN5ICAiLAorfTsKKworY29uc3QgY2hhciAqY29uc3QgcnhycGNfY2FsbF9jb21wbGV0aW9uc1tOUl9fUlhSUENfQ0FMTF9DT01QTEVUSU9OU10gPSB7CisJW1JYUlBDX0NBTExfU1VDQ0VFREVEXQkJCT0gIkNvbXBsZXRlIiwKIAlbUlhSUENfQ0FMTF9SRU1PVEVMWV9BQk9SVEVEXQkJPSAiUm10QWJvcnQiLAogCVtSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRF0JCT0gIkxvY0Fib3J0IiwKKwlbUlhSUENfQ0FMTF9MT0NBTF9FUlJPUl0JCT0gIkxvY0Vycm9yIiwKIAlbUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SXQkJPSAiTmV0RXJyb3IiLAotCVtSWFJQQ19DQUxMX0RFQURdCQkJPSAiRGVhZCAgICAiLAorfTsKKworY29uc3QgY2hhciByeHJwY19jYWxsX3RyYWNlc1tyeHJwY19jYWxsX19ucl90cmFjZV1bNF0gPSB7CisJW3J4cnBjX2NhbGxfbmV3X2NsaWVudF0JCT0gIk5XYyIsCisJW3J4cnBjX2NhbGxfbmV3X3NlcnZpY2VdCT0gIk5XcyIsCisJW3J4cnBjX2NhbGxfcXVldWVkXQkJPSAiUVVFIiwKKwlbcnhycGNfY2FsbF9xdWV1ZWRfcmVmXQkJPSAiUVVSIiwKKwlbcnhycGNfY2FsbF9jb25uZWN0ZWRdCQk9ICJDT04iLAorCVtyeHJwY19jYWxsX3JlbGVhc2VdCQk9ICJSTFMiLAorCVtyeHJwY19jYWxsX3NlZW5dCQk9ICJTRUUiLAorCVtyeHJwY19jYWxsX2dvdF0JCT0gIkdPVCIsCisJW3J4cnBjX2NhbGxfZ290X3VzZXJpZF0JCT0gIkd1cyIsCisJW3J4cnBjX2NhbGxfZ290X2tlcm5lbF0JCT0gIkdrZSIsCisJW3J4cnBjX2NhbGxfcHV0XQkJPSAiUFVUIiwKKwlbcnhycGNfY2FsbF9wdXRfdXNlcmlkXQkJPSAiUHVzIiwKKwlbcnhycGNfY2FsbF9wdXRfa2VybmVsXQkJPSAiUGtlIiwKKwlbcnhycGNfY2FsbF9wdXRfbm9xdWV1ZV0JPSAiUE5RIiwKKwlbcnhycGNfY2FsbF9lcnJvcl0JCT0gIipFKiIsCiB9OwogCiBzdHJ1Y3Qga21lbV9jYWNoZSAqcnhycGNfY2FsbF9qYXI7CiBMSVNUX0hFQUQocnhycGNfY2FsbHMpOwogREVGSU5FX1JXTE9DSyhyeHJwY19jYWxsX2xvY2spOwogCi1zdGF0aWMgdm9pZCByeHJwY19kZXN0cm95X2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLXN0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfbGlmZV9leHBpcmVkKHVuc2lnbmVkIGxvbmcgX2NhbGwpOwotc3RhdGljIHZvaWQgcnhycGNfZGVhZF9jYWxsX2V4cGlyZWQodW5zaWduZWQgbG9uZyBfY2FsbCk7Ci1zdGF0aWMgdm9pZCByeHJwY19hY2tfdGltZV9leHBpcmVkKHVuc2lnbmVkIGxvbmcgX2NhbGwpOwotc3RhdGljIHZvaWQgcnhycGNfcmVzZW5kX3RpbWVfZXhwaXJlZCh1bnNpZ25lZCBsb25nIF9jYWxsKTsKK3N0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfdGltZXJfZXhwaXJlZCh1bnNpZ25lZCBsb25nIF9jYWxsKQoreworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gKHN0cnVjdCByeHJwY19jYWxsICopX2NhbGw7CisKKwlfZW50ZXIoIiVkIiwgY2FsbC0+ZGVidWdfaWQpOworCisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkKKwkJcnhycGNfc2V0X3RpbWVyKGNhbGwsIHJ4cnBjX3RpbWVyX2V4cGlyZWQsIGt0aW1lX2dldF9yZWFsKCkpOworfQogCiAvKgogICogZmluZCBhbiBleHRhbnQgc2VydmVyIGNhbGwKQEAgLTkxLDcgKzEwNiw3IEBACiAJcmV0dXJuIE5VTEw7CiAKIGZvdW5kX2V4dGFudF9jYWxsOgotCXJ4cnBjX2dldF9jYWxsKGNhbGwpOworCXJ4cnBjX2dldF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfZ290KTsKIAlyZWFkX3VubG9jaygmcngtPmNhbGxfbG9jayk7CiAJX2xlYXZlKCIgPSAlcCBbJWRdIiwgY2FsbCwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSk7CiAJcmV0dXJuIGNhbGw7CkBAIC0xMDAsNyArMTE1LDcgQEAKIC8qCiAgKiBhbGxvY2F0ZSBhIG5ldyBjYWxsCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWxsb2NfY2FsbChnZnBfdCBnZnApCitzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWxsb2NfY2FsbChnZnBfdCBnZnApCiB7CiAJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CiAKQEAgLTEwOCwyOSArMTIzLDI1IEBACiAJaWYgKCFjYWxsKQogCQlyZXR1cm4gTlVMTDsKIAotCWNhbGwtPmFja3Nfd2luc3ogPSAxNjsKLQljYWxsLT5hY2tzX3dpbmRvdyA9IGttYWxsb2MoY2FsbC0+YWNrc193aW5zeiAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwljYWxsLT5yeHR4X2J1ZmZlciA9IGtjYWxsb2MoUlhSUENfUlhUWF9CVUZGX1NJWkUsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiAqKSwKIAkJCQkgICAgZ2ZwKTsKLQlpZiAoIWNhbGwtPmFja3Nfd2luZG93KSB7Ci0JCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FsbCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKwlpZiAoIWNhbGwtPnJ4dHhfYnVmZmVyKQorCQlnb3RvIG5vbWVtOwogCi0Jc2V0dXBfdGltZXIoJmNhbGwtPmxpZmV0aW1lciwgJnJ4cnBjX2NhbGxfbGlmZV9leHBpcmVkLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIGNhbGwpOwotCXNldHVwX3RpbWVyKCZjYWxsLT5kZWFkc3BhbiwgJnJ4cnBjX2RlYWRfY2FsbF9leHBpcmVkLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIGNhbGwpOwotCXNldHVwX3RpbWVyKCZjYWxsLT5hY2tfdGltZXIsICZyeHJwY19hY2tfdGltZV9leHBpcmVkLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIGNhbGwpOwotCXNldHVwX3RpbWVyKCZjYWxsLT5yZXNlbmRfdGltZXIsICZyeHJwY19yZXNlbmRfdGltZV9leHBpcmVkLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIGNhbGwpOwotCUlOSVRfV09SSygmY2FsbC0+ZGVzdHJveWVyLCAmcnhycGNfZGVzdHJveV9jYWxsKTsKKwljYWxsLT5yeHR4X2Fubm90YXRpb25zID0ga2NhbGxvYyhSWFJQQ19SWFRYX0JVRkZfU0laRSwgc2l6ZW9mKHU4KSwgZ2ZwKTsKKwlpZiAoIWNhbGwtPnJ4dHhfYW5ub3RhdGlvbnMpCisJCWdvdG8gbm9tZW1fMjsKKworCXNldHVwX3RpbWVyKCZjYWxsLT50aW1lciwgcnhycGNfY2FsbF90aW1lcl9leHBpcmVkLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpY2FsbCk7CiAJSU5JVF9XT1JLKCZjYWxsLT5wcm9jZXNzb3IsICZyeHJwY19wcm9jZXNzX2NhbGwpOwogCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5saW5rKTsKKwlJTklUX0xJU1RfSEVBRCgmY2FsbC0+Y2hhbl93YWl0X2xpbmspOwogCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5hY2NlcHRfbGluayk7Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2FsbC0+cnhfcXVldWUpOwotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNhbGwtPnJ4X29vc19xdWV1ZSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmY2FsbC0+dHhfd2FpdHEpOworCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5yZWN2bXNnX2xpbmspOworCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5zb2NrX2xpbmspOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhbGwtPndhaXRxKTsKIAlzcGluX2xvY2tfaW5pdCgmY2FsbC0+bG9jayk7CiAJcndsb2NrX2luaXQoJmNhbGwtPnN0YXRlX2xvY2spOwogCWF0b21pY19zZXQoJmNhbGwtPnVzYWdlLCAxKTsKQEAgLTEzOCw3MCArMTQ5LDY1IEBACiAKIAltZW1zZXQoJmNhbGwtPnNvY2tfbm9kZSwgMHhlZCwgc2l6ZW9mKGNhbGwtPnNvY2tfbm9kZSkpOwogCi0JY2FsbC0+cnhfZGF0YV9leHBlY3QgPSAxOwotCWNhbGwtPnJ4X2RhdGFfZWF0ZW4gPSAwOwotCWNhbGwtPnJ4X2ZpcnN0X29vcyA9IDA7Ci0JY2FsbC0+YWNrcl93aW5fdG9wID0gY2FsbC0+cnhfZGF0YV9lYXRlbiArIDEgKyByeHJwY19yeF93aW5kb3dfc2l6ZTsKLQljYWxsLT5jcmVhdGlvbl9qaWYgPSBqaWZmaWVzOworCS8qIExlYXZlIHNwYWNlIGluIHRoZSByaW5nIHRvIGhhbmRsZSBhIG1heGVkLW91dCBqdW1ibyBwYWNrZXQgKi8KKwljYWxsLT5yeF93aW5zaXplID0gcnhycGNfcnhfd2luZG93X3NpemU7CisJY2FsbC0+dHhfd2luc2l6ZSA9IDE2OworCWNhbGwtPnJ4X2V4cGVjdF9uZXh0ID0gMTsKKworCWlmIChSWFJQQ19UWF9TTVNTID4gMjE5MCkKKwkJY2FsbC0+Y29uZ19jd25kID0gMjsKKwllbHNlIGlmIChSWFJQQ19UWF9TTVNTID4gMTA5NSkKKwkJY2FsbC0+Y29uZ19jd25kID0gMzsKKwllbHNlCisJCWNhbGwtPmNvbmdfY3duZCA9IDQ7CisJY2FsbC0+Y29uZ19zc3RocmVzaCA9IFJYUlBDX1JYVFhfQlVGRl9TSVpFIC0gMTsKIAlyZXR1cm4gY2FsbDsKKworbm9tZW1fMjoKKwlrZnJlZShjYWxsLT5yeHR4X2J1ZmZlcik7Citub21lbToKKwlrbWVtX2NhY2hlX2ZyZWUocnhycGNfY2FsbF9qYXIsIGNhbGwpOworCXJldHVybiBOVUxMOwogfQogCiAvKgogICogQWxsb2NhdGUgYSBuZXcgY2xpZW50IGNhbGwuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWxsb2NfY2xpZW50X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAotCQkJCQkJICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCwKK3N0YXRpYyBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWxsb2NfY2xpZW50X2NhbGwoc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcngsCiAJCQkJCQkgIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlrdGltZV90IG5vdzsKIAogCV9lbnRlcigiIik7CiAKLQlBU1NFUlQocngtPmxvY2FsICE9IE5VTEwpOwotCiAJY2FsbCA9IHJ4cnBjX2FsbG9jX2NhbGwoZ2ZwKTsKIAlpZiAoIWNhbGwpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfQ09OTjsKLQotCXNvY2tfaG9sZCgmcngtPnNrKTsKLQljYWxsLT5zb2NrZXQgPSByeDsKLQljYWxsLT5yeF9kYXRhX3Bvc3QgPSAxOwotCi0JY2FsbC0+bG9jYWwgPSByeC0+bG9jYWw7CiAJY2FsbC0+c2VydmljZV9pZCA9IHNyeC0+c3J4X3NlcnZpY2U7Ci0JY2FsbC0+aW5fY2xpZW50ZmxhZyA9IDA7CisJY2FsbC0+dHhfcGhhc2UgPSB0cnVlOworCW5vdyA9IGt0aW1lX2dldF9yZWFsKCk7CisJY2FsbC0+YWNrc19sYXRlc3RfdHMgPSBub3c7CisJY2FsbC0+Y29uZ190c3RhbXAgPSBub3c7CiAKIAlfbGVhdmUoIiA9ICVwIiwgY2FsbCk7CiAJcmV0dXJuIGNhbGw7CiB9CiAKIC8qCi0gKiBCZWdpbiBjbGllbnQgY2FsbC4KKyAqIEluaXRpYXRlIHRoZSBjYWxsIGFjay9yZXNlbmQvZXhwaXJ5IHRpbWVyLgogICovCi1zdGF0aWMgaW50IHJ4cnBjX2JlZ2luX2NsaWVudF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCSAgIHN0cnVjdCByeHJwY19jb25uX3BhcmFtZXRlcnMgKmNwLAotCQkJCSAgIHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqc3J4LAotCQkJCSAgIGdmcF90IGdmcCkKK3N0YXRpYyB2b2lkIHJ4cnBjX3N0YXJ0X2NhbGxfdGltZXIoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCiB7Ci0JaW50IHJldDsKKwlrdGltZV90IG5vdyA9IGt0aW1lX2dldF9yZWFsKCksIGV4cGlyZV9hdDsKIAotCS8qIFNldCB1cCBvciBnZXQgYSBjb25uZWN0aW9uIHJlY29yZCBhbmQgc2V0IHRoZSBwcm90b2NvbCBwYXJhbWV0ZXJzLAotCSAqIGluY2x1ZGluZyBjaGFubmVsIG51bWJlciBhbmQgY2FsbCBJRC4KLQkgKi8KLQlyZXQgPSByeHJwY19jb25uZWN0X2NhbGwoY2FsbCwgY3AsIHNyeCwgZ2ZwKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUOwotCi0Jc3Bpbl9sb2NrKCZjYWxsLT5jb25uLT5wYXJhbXMucGVlci0+bG9jayk7Ci0JaGxpc3RfYWRkX2hlYWQoJmNhbGwtPmVycm9yX2xpbmssICZjYWxsLT5jb25uLT5wYXJhbXMucGVlci0+ZXJyb3JfdGFyZ2V0cyk7Ci0Jc3Bpbl91bmxvY2soJmNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5sb2NrKTsKLQotCWNhbGwtPmxpZmV0aW1lci5leHBpcmVzID0gamlmZmllcyArIHJ4cnBjX21heF9jYWxsX2xpZmV0aW1lOwotCWFkZF90aW1lcigmY2FsbC0+bGlmZXRpbWVyKTsKLQlyZXR1cm4gMDsKKwlleHBpcmVfYXQgPSBrdGltZV9hZGRfbXMobm93LCByeHJwY19tYXhfY2FsbF9saWZldGltZSk7CisJY2FsbC0+ZXhwaXJlX2F0ID0gZXhwaXJlX2F0OworCWNhbGwtPmFja19hdCA9IGV4cGlyZV9hdDsKKwljYWxsLT5yZXNlbmRfYXQgPSBleHBpcmVfYXQ7CisJY2FsbC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBMT05HX01BWCAvIDI7CisJcnhycGNfc2V0X3RpbWVyKGNhbGwsIHJ4cnBjX3RpbWVyX2JlZ2luLCBub3cpOwogfQogCiAvKgpAQCAtMjE2LDIwICsyMjIsMjEgQEAKIHsKIAlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgKnhjYWxsOwogCXN0cnVjdCByYl9ub2RlICpwYXJlbnQsICoqcHA7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKIAlpbnQgcmV0OwogCiAJX2VudGVyKCIlcCwlbHgiLCByeCwgdXNlcl9jYWxsX0lEKTsKIAotCWNhbGwgPSByeHJwY19hbGxvY19jbGllbnRfY2FsbChyeCwgc3J4LCBnZnApOworCWNhbGwgPSByeHJwY19hbGxvY19jbGllbnRfY2FsbChzcngsIGdmcCk7CiAJaWYgKElTX0VSUihjYWxsKSkgewogCQlfbGVhdmUoIiA9ICVsZCIsIFBUUl9FUlIoY2FsbCkpOwogCQlyZXR1cm4gY2FsbDsKIAl9CiAKLQkvKiBQdWJsaXNoIHRoZSBjYWxsLCBldmVuIHRob3VnaCBpdCBpcyBpbmNvbXBsZXRlbHkgc2V0IHVwIGFzIHlldCAqLwotCWNhbGwtPnVzZXJfY2FsbF9JRCA9IHVzZXJfY2FsbF9JRDsKLQlfX3NldF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpOworCXRyYWNlX3J4cnBjX2NhbGwoY2FsbCwgcnhycGNfY2FsbF9uZXdfY2xpZW50LCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAorCQkJIGhlcmUsIChjb25zdCB2b2lkICopdXNlcl9jYWxsX0lEKTsKIAorCS8qIFB1Ymxpc2ggdGhlIGNhbGwsIGV2ZW4gdGhvdWdoIGl0IGlzIGluY29tcGxldGVseSBzZXQgdXAgYXMgeWV0ICovCiAJd3JpdGVfbG9jaygmcngtPmNhbGxfbG9jayk7CiAKIAlwcCA9ICZyeC0+Y2FsbHMucmJfbm9kZTsKQEAgLTI0MywzNzIgKzI1MCwyODUgQEAKIAkJZWxzZSBpZiAodXNlcl9jYWxsX0lEID4geGNhbGwtPnVzZXJfY2FsbF9JRCkKIAkJCXBwID0gJigqcHApLT5yYl9yaWdodDsKIAkJZWxzZQotCQkJZ290byBmb3VuZF91c2VyX0lEX25vd19wcmVzZW50OworCQkJZ290byBlcnJvcl9kdXBfdXNlcl9JRDsKIAl9CiAKLQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQorCXJjdV9hc3NpZ25fcG9pbnRlcihjYWxsLT5zb2NrZXQsIHJ4KTsKKwljYWxsLT51c2VyX2NhbGxfSUQgPSB1c2VyX2NhbGxfSUQ7CisJX19zZXRfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKTsKKwlyeHJwY19nZXRfY2FsbChjYWxsLCByeHJwY19jYWxsX2dvdF91c2VyaWQpOwogCXJiX2xpbmtfbm9kZSgmY2FsbC0+c29ja19ub2RlLCBwYXJlbnQsIHBwKTsKIAlyYl9pbnNlcnRfY29sb3IoJmNhbGwtPnNvY2tfbm9kZSwgJnJ4LT5jYWxscyk7CisJbGlzdF9hZGQoJmNhbGwtPnNvY2tfbGluaywgJnJ4LT5zb2NrX2NhbGxzKTsKKwogCXdyaXRlX3VubG9jaygmcngtPmNhbGxfbG9jayk7CiAKLQl3cml0ZV9sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOworCXdyaXRlX2xvY2soJnJ4cnBjX2NhbGxfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmY2FsbC0+bGluaywgJnJ4cnBjX2NhbGxzKTsKLQl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7CisJd3JpdGVfdW5sb2NrKCZyeHJwY19jYWxsX2xvY2spOwogCi0JcmV0ID0gcnhycGNfYmVnaW5fY2xpZW50X2NhbGwoY2FsbCwgY3AsIHNyeCwgZ2ZwKTsKKwkvKiBTZXQgdXAgb3IgZ2V0IGEgY29ubmVjdGlvbiByZWNvcmQgYW5kIHNldCB0aGUgcHJvdG9jb2wgcGFyYW1ldGVycywKKwkgKiBpbmNsdWRpbmcgY2hhbm5lbCBudW1iZXIgYW5kIGNhbGwgSUQuCisJICovCisJcmV0ID0gcnhycGNfY29ubmVjdF9jYWxsKGNhbGwsIGNwLCBzcngsIGdmcCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKKwl0cmFjZV9yeHJwY19jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfY29ubmVjdGVkLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAorCQkJIGhlcmUsIEVSUl9QVFIocmV0KSk7CisKKwlzcGluX2xvY2tfYmgoJmNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5sb2NrKTsKKwlobGlzdF9hZGRfaGVhZCgmY2FsbC0+ZXJyb3JfbGluaywKKwkJICAgICAgICZjYWxsLT5jb25uLT5wYXJhbXMucGVlci0+ZXJyb3JfdGFyZ2V0cyk7CisJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5sb2NrKTsKKworCXJ4cnBjX3N0YXJ0X2NhbGxfdGltZXIoY2FsbCk7CisKIAlfbmV0KCJDQUxMIG5ldyAlZCBvbiBDT05OICVkIiwgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPmNvbm4tPmRlYnVnX2lkKTsKIAogCV9sZWF2ZSgiID0gJXAgW25ld10iLCBjYWxsKTsKIAlyZXR1cm4gY2FsbDsKIAotZXJyb3I6Ci0Jd3JpdGVfbG9jaygmcngtPmNhbGxfbG9jayk7Ci0JcmJfZXJhc2UoJmNhbGwtPnNvY2tfbm9kZSwgJnJ4LT5jYWxscyk7Ci0Jd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQotCXdyaXRlX2xvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7Ci0JbGlzdF9kZWxfaW5pdCgmY2FsbC0+bGluayk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOwotCi0JY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0RFQUQ7Ci0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIEVSUl9QVFIocmV0KTsKLQogCS8qIFdlIHVuZXhwZWN0ZWRseSBmb3VuZCB0aGUgdXNlciBJRCBpbiB0aGUgbGlzdCBhZnRlciB0YWtpbmcKIAkgKiB0aGUgY2FsbF9sb2NrLiAgVGhpcyBzaG91bGRuJ3QgaGFwcGVuIHVubGVzcyB0aGUgdXNlciByYWNlcwogCSAqIHdpdGggaXRzZWxmIGFuZCB0cmllcyB0byBhZGQgdGhlIHNhbWUgdXNlciBJRCB0d2ljZSBhdCB0aGUKIAkgKiBzYW1lIHRpbWUgaW4gZGlmZmVyZW50IHRocmVhZHMuCiAJICovCi1mb3VuZF91c2VyX0lEX25vd19wcmVzZW50OgorZXJyb3JfZHVwX3VzZXJfSUQ6CiAJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKLQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfREVBRDsKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQlfbGVhdmUoIiA9IC1FRVhJU1QgWyVwXSIsIGNhbGwpOwotCXJldHVybiBFUlJfUFRSKC1FRVhJU1QpOworCXJldCA9IC1FRVhJU1Q7CisKK2Vycm9yOgorCV9fcnhycGNfc2V0X2NhbGxfY29tcGxldGlvbihjYWxsLCBSWFJQQ19DQUxMX0xPQ0FMX0VSUk9SLAorCQkJCSAgICBSWF9DQUxMX0RFQUQsIHJldCk7CisJdHJhY2VfcnhycGNfY2FsbChjYWxsLCByeHJwY19jYWxsX2Vycm9yLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAorCQkJIGhlcmUsIEVSUl9QVFIocmV0KSk7CisJcnhycGNfcmVsZWFzZV9jYWxsKHJ4LCBjYWxsKTsKKwlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KIAogLyoKLSAqIHNldCB1cCBhbiBpbmNvbWluZyBjYWxsCi0gKiAtIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQgd2l0aCBJUlFzIGVuYWJsZWQKKyAqIFNldCB1cCBhbiBpbmNvbWluZyBjYWxsLiAgY2FsbC0+Y29ubiBwb2ludHMgdG8gdGhlIGNvbm5lY3Rpb24uCisgKiBUaGlzIGlzIGNhbGxlZCBpbiBCSCBjb250ZXh0IGFuZCBpc24ndCBhbGxvd2VkIHRvIGZhaWwuCiAgKi8KLXN0cnVjdCByeHJwY19jYWxsICpyeHJwY19pbmNvbWluZ19jYWxsKHN0cnVjdCByeHJwY19zb2NrICpyeCwKLQkJCQkgICAgICAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit2b2lkIHJ4cnBjX2luY29taW5nX2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJIHN0cnVjdCBza19idWZmICpza2IpCiB7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPSBjYWxsLT5jb25uOwogCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgKmNhbmRpZGF0ZTsKLQl1MzIgY2FsbF9pZCwgY2hhbjsKKwl1MzIgY2hhbjsKIAotCV9lbnRlcigiLCVkIiwgY29ubi0+ZGVidWdfaWQpOworCV9lbnRlcigiLCVkIiwgY2FsbC0+Y29ubi0+ZGVidWdfaWQpOwogCi0JQVNTRVJUKHJ4ICE9IE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihjYWxsLT5zb2NrZXQsIHJ4KTsKKwljYWxsLT5jYWxsX2lkCQk9IHNwLT5oZHIuY2FsbE51bWJlcjsKKwljYWxsLT5zZXJ2aWNlX2lkCT0gc3AtPmhkci5zZXJ2aWNlSWQ7CisJY2FsbC0+Y2lkCQk9IHNwLT5oZHIuY2lkOworCWNhbGwtPnN0YXRlCQk9IFJYUlBDX0NBTExfU0VSVkVSX0FDQ0VQVElORzsKKwlpZiAoc3AtPmhkci5zZWN1cml0eUluZGV4ID4gMCkKKwkJY2FsbC0+c3RhdGUJPSBSWFJQQ19DQUxMX1NFUlZFUl9TRUNVUklORzsKKwljYWxsLT5jb25nX3RzdGFtcAk9IHNrYi0+dHN0YW1wOwogCi0JY2FuZGlkYXRlID0gcnhycGNfYWxsb2NfY2FsbChHRlBfTk9JTyk7Ci0JaWYgKCFjYW5kaWRhdGUpCi0JCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7Ci0KLQljaGFuID0gc3AtPmhkci5jaWQgJiBSWFJQQ19DSEFOTkVMTUFTSzsKLQljYW5kaWRhdGUtPnNvY2tldAk9IHJ4OwotCWNhbmRpZGF0ZS0+Y29ubgkJPSBjb25uOwotCWNhbmRpZGF0ZS0+Y2lkCQk9IHNwLT5oZHIuY2lkOwotCWNhbmRpZGF0ZS0+Y2FsbF9pZAk9IHNwLT5oZHIuY2FsbE51bWJlcjsKLQljYW5kaWRhdGUtPmNoYW5uZWwJPSBjaGFuOwotCWNhbmRpZGF0ZS0+cnhfZGF0YV9wb3N0CT0gMDsKLQljYW5kaWRhdGUtPnN0YXRlCT0gUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HOwotCWlmIChjb25uLT5zZWN1cml0eV9peCA+IDApCi0JCWNhbmRpZGF0ZS0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9TRUNVUklORzsKLQotCXNwaW5fbG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKLQotCS8qIHNldCB0aGUgY2hhbm5lbCBmb3IgdGhpcyBjYWxsICovCi0JY2FsbCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoY29ubi0+Y2hhbm5lbHNbY2hhbl0uY2FsbCwKLQkJCQkJIGxvY2tkZXBfaXNfaGVsZCgmY29ubi0+Y2hhbm5lbF9sb2NrKSk7Ci0KLQlfZGVidWcoImNoYW5uZWxbJXVdIGlzICVwIiwgY2FuZGlkYXRlLT5jaGFubmVsLCBjYWxsKTsKLQlpZiAoY2FsbCAmJiBjYWxsLT5jYWxsX2lkID09IHNwLT5oZHIuY2FsbE51bWJlcikgewotCQkvKiBhbHJlYWR5IHNldDsgbXVzdCd2ZSBiZWVuIGEgZHVwbGljYXRlIHBhY2tldCAqLwotCQlfZGVidWcoImV4dGFudCBjYWxsIFslZF0iLCBjYWxsLT5zdGF0ZSk7Ci0JCUFTU0VSVENNUChjYWxsLT5jb25uLCA9PSwgY29ubik7Ci0KLQkJcmVhZF9sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQkJc3dpdGNoIChjYWxsLT5zdGF0ZSkgewotCQljYXNlIFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOgotCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpKQotCQkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JCWNhc2UgUlhSUENfQ0FMTF9SRU1PVEVMWV9BQk9SVEVEOgotCQkJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCQkJZ290byBhYm9ydGVkX2NhbGw7Ci0JCWRlZmF1bHQ6Ci0JCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQkJCXJlYWRfdW5sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQkJCWdvdG8gZXh0YW50X2NhbGw7Ci0JCX0KLQl9Ci0KLQlpZiAoY2FsbCkgewotCQkvKiBpdCBzZWVtcyB0aGUgY2hhbm5lbCBpcyBzdGlsbCBpbiB1c2UgZnJvbSB0aGUgcHJldmlvdXMgY2FsbAotCQkgKiAtIGRpdGNoIHRoZSBvbGQgYmluZGluZyBpZiBpdHMgY2FsbCBpcyBub3cgY29tcGxldGUgKi8KLQkJX2RlYnVnKCJDQUxMOiAldSB7ICVzIH0iLAotCQkgICAgICAgY2FsbC0+ZGVidWdfaWQsIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPnN0YXRlXSk7Ci0KLQkJaWYgKGNhbGwtPnN0YXRlID49IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKLQkJCV9fcnhycGNfZGlzY29ubmVjdF9jYWxsKGNhbGwpOwotCQl9IGVsc2UgewotCQkJc3Bpbl91bmxvY2soJmNvbm4tPmNoYW5uZWxfbG9jayk7Ci0JCQlrbWVtX2NhY2hlX2ZyZWUocnhycGNfY2FsbF9qYXIsIGNhbmRpZGF0ZSk7Ci0JCQlfbGVhdmUoIiA9IC1FQlVTWSIpOwotCQkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKLQkJfQotCX0KLQotCS8qIGNoZWNrIHRoZSBjYWxsIG51bWJlciBpc24ndCBkdXBsaWNhdGUgKi8KLQlfZGVidWcoImNoZWNrIGR1cCIpOwotCWNhbGxfaWQgPSBzcC0+aGRyLmNhbGxOdW1iZXI7Ci0KLQkvKiBXZSBqdXN0IGlnbm9yZSBjYWxscyBwcmlvciB0byB0aGUgY3VycmVudCBjYWxsIElELiAgVGVybWluYXRlZCBjYWxscwotCSAqIGFyZSBoYW5kbGVkIHZpYSB0aGUgY29ubmVjdGlvbi4KKwkvKiBTZXQgdGhlIGNoYW5uZWwgZm9yIHRoaXMgY2FsbC4gIFdlIGRvbid0IGdldCBjaGFubmVsX2xvY2sgYXMgd2UncmUKKwkgKiBvbmx5IGRlZmVuZGluZyBhZ2FpbnN0IHRoZSBkYXRhX3JlYWR5IGhhbmRsZXIgKHdoaWNoIHdlJ3JlIGNhbGxlZAorCSAqIGZyb20pIGFuZCB0aGUgUkVTUE9OU0UgcGFja2V0IHBhcnNlciAod2hpY2ggaXMgb25seSByZWFsbHkKKwkgKiBpbnRlcmVzdGVkIGluIGNhbGxfY291bnRlciBhbmQgY2FuIGNvcGUgd2l0aCBhIGRpc2FncmVlbWVudCB3aXRoIHRoZQorCSAqIGNhbGwgcG9pbnRlcikuCiAJICovCi0JaWYgKGNhbGxfaWQgPD0gY29ubi0+Y2hhbm5lbHNbY2hhbl0uY2FsbF9jb3VudGVyKQotCQlnb3RvIG9sZF9jYWxsOyAvKiBUT0RPOiBKdXN0IGRyb3AgcGFja2V0ICovCi0KLQkvKiBtYWtlIHRoZSBjYWxsIGF2YWlsYWJsZSAqLwotCV9kZWJ1ZygibmV3IGNhbGwiKTsKLQljYWxsID0gY2FuZGlkYXRlOwotCWNhbmRpZGF0ZSA9IE5VTEw7Ci0JY29ubi0+Y2hhbm5lbHNbY2hhbl0uY2FsbF9jb3VudGVyID0gY2FsbF9pZDsKKwljaGFuID0gc3AtPmhkci5jaWQgJiBSWFJQQ19DSEFOTkVMTUFTSzsKKwljb25uLT5jaGFubmVsc1tjaGFuXS5jYWxsX2NvdW50ZXIgPSBjYWxsLT5jYWxsX2lkOworCWNvbm4tPmNoYW5uZWxzW2NoYW5dLmNhbGxfaWQgPSBjYWxsLT5jYWxsX2lkOwogCXJjdV9hc3NpZ25fcG9pbnRlcihjb25uLT5jaGFubmVsc1tjaGFuXS5jYWxsLCBjYWxsKTsKLQlzb2NrX2hvbGQoJnJ4LT5zayk7Ci0JcnhycGNfZ2V0X2Nvbm5lY3Rpb24oY29ubik7Ci0Jc3Bpbl91bmxvY2soJmNvbm4tPmNoYW5uZWxfbG9jayk7CiAKIAlzcGluX2xvY2soJmNvbm4tPnBhcmFtcy5wZWVyLT5sb2NrKTsKIAlobGlzdF9hZGRfaGVhZCgmY2FsbC0+ZXJyb3JfbGluaywgJmNvbm4tPnBhcmFtcy5wZWVyLT5lcnJvcl90YXJnZXRzKTsKIAlzcGluX3VubG9jaygmY29ubi0+cGFyYW1zLnBlZXItPmxvY2spOwogCi0Jd3JpdGVfbG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZjYWxsLT5saW5rLCAmcnhycGNfY2FsbHMpOwotCXdyaXRlX3VubG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKLQotCWNhbGwtPmxvY2FsID0gY29ubi0+cGFyYW1zLmxvY2FsOwotCWNhbGwtPmVwb2NoID0gY29ubi0+cHJvdG8uZXBvY2g7Ci0JY2FsbC0+c2VydmljZV9pZCA9IGNvbm4tPnBhcmFtcy5zZXJ2aWNlX2lkOwotCWNhbGwtPmluX2NsaWVudGZsYWcgPSBSWFJQQ19DTElFTlRfSU5JVElBVEVEOwotCiAJX25ldCgiQ0FMTCBpbmNvbWluZyAlZCBvbiBDT05OICVkIiwgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPmNvbm4tPmRlYnVnX2lkKTsKIAotCWNhbGwtPmxpZmV0aW1lci5leHBpcmVzID0gamlmZmllcyArIHJ4cnBjX21heF9jYWxsX2xpZmV0aW1lOwotCWFkZF90aW1lcigmY2FsbC0+bGlmZXRpbWVyKTsKLQlfbGVhdmUoIiA9ICVwIHslZH0gW25ld10iLCBjYWxsLCBjYWxsLT5kZWJ1Z19pZCk7Ci0JcmV0dXJuIGNhbGw7Ci0KLWV4dGFudF9jYWxsOgotCXNwaW5fdW5sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOwotCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FuZGlkYXRlKTsKLQlfbGVhdmUoIiA9ICVwIHslZH0gW2V4dGFudF0iLCBjYWxsLCBjYWxsID8gY2FsbC0+ZGVidWdfaWQgOiAtMSk7Ci0JcmV0dXJuIGNhbGw7Ci0KLWFib3J0ZWRfY2FsbDoKLQlzcGluX3VubG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKLQlrbWVtX2NhY2hlX2ZyZWUocnhycGNfY2FsbF9qYXIsIGNhbmRpZGF0ZSk7Ci0JX2xlYXZlKCIgPSAtRUNPTk5BQk9SVEVEIik7Ci0JcmV0dXJuIEVSUl9QVFIoLUVDT05OQUJPUlRFRCk7Ci0KLW9sZF9jYWxsOgotCXNwaW5fdW5sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOwotCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FuZGlkYXRlKTsKLQlfbGVhdmUoIiA9IC1FQ09OTlJFU0VUIFtvbGRdIik7Ci0JcmV0dXJuIEVSUl9QVFIoLUVDT05OUkVTRVQpOworCXJ4cnBjX3N0YXJ0X2NhbGxfdGltZXIoY2FsbCk7CisJX2xlYXZlKCIiKTsKIH0KIAogLyoKLSAqIGRldGFjaCBhIGNhbGwgZnJvbSBhIHNvY2tldCBhbmQgc2V0IHVwIGZvciByZWxlYXNlCisgKiBRdWV1ZSBhIGNhbGwncyB3b3JrIHByb2Nlc3NvciwgZ2V0dGluZyBhIHJlZiB0byBwYXNzIHRvIHRoZSB3b3JrIHF1ZXVlLgogICovCi12b2lkIHJ4cnBjX3JlbGVhc2VfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK2Jvb2wgcnhycGNfcXVldWVfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKIHsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiA9IGNhbGwtPmNvbm47Ci0Jc3RydWN0IHJ4cnBjX3NvY2sgKnJ4ID0gY2FsbC0+c29ja2V0OworCWNvbnN0IHZvaWQgKmhlcmUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJaW50IG4gPSBfX2F0b21pY19hZGRfdW5sZXNzKCZjYWxsLT51c2FnZSwgMSwgMCk7CisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChyeHJwY19xdWV1ZV93b3JrKCZjYWxsLT5wcm9jZXNzb3IpKQorCQl0cmFjZV9yeHJwY19jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcXVldWVkLCBuICsgMSwgaGVyZSwgTlVMTCk7CisJZWxzZQorCQlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dF9ub3F1ZXVlKTsKKwlyZXR1cm4gdHJ1ZTsKK30KIAotCV9lbnRlcigieyVkLCVkLCVkLCVkfSIsCi0JICAgICAgIGNhbGwtPmRlYnVnX2lkLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAotCSAgICAgICBhdG9taWNfcmVhZCgmY2FsbC0+YWNrcl9ub3RfaWRsZSksCi0JICAgICAgIGNhbGwtPnJ4X2ZpcnN0X29vcyk7CisvKgorICogUXVldWUgYSBjYWxsJ3Mgd29yayBwcm9jZXNzb3IsIHBhc3NpbmcgdGhlIGNhbGxlcnMgcmVmIHRvIHRoZSB3b3JrIHF1ZXVlLgorICovCitib29sIF9fcnhycGNfcXVldWVfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwljb25zdCB2b2lkICpoZXJlID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworCWludCBuID0gYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKTsKKwlBU1NFUlRDTVAobiwgPj0sIDEpOworCWlmIChyeHJwY19xdWV1ZV93b3JrKCZjYWxsLT5wcm9jZXNzb3IpKQorCQl0cmFjZV9yeHJwY19jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcXVldWVkX3JlZiwgbiwgaGVyZSwgTlVMTCk7CisJZWxzZQorCQlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dF9ub3F1ZXVlKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIE5vdGUgdGhlIHJlLWVtZXJnZW5jZSBvZiBhIGNhbGwuCisgKi8KK3ZvaWQgcnhycGNfc2VlX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpZiAoY2FsbCkgeworCQlpbnQgbiA9IGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSk7CisKKwkJdHJhY2VfcnhycGNfY2FsbChjYWxsLCByeHJwY19jYWxsX3NlZW4sIG4sIGhlcmUsIE5VTEwpOworCX0KK30KKworLyoKKyAqIE5vdGUgdGhlIGFkZGl0aW9uIG9mIGEgcmVmIG9uIGEgY2FsbC4KKyAqLwordm9pZCByeHJwY19nZXRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgZW51bSByeHJwY19jYWxsX3RyYWNlIG9wKQoreworCWNvbnN0IHZvaWQgKmhlcmUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJaW50IG4gPSBhdG9taWNfaW5jX3JldHVybigmY2FsbC0+dXNhZ2UpOworCisJdHJhY2VfcnhycGNfY2FsbChjYWxsLCBvcCwgbiwgaGVyZSwgTlVMTCk7Cit9CisKKy8qCisgKiBEZXRhY2ggYSBjYWxsIGZyb20gaXRzIG93bmluZyBzb2NrZXQuCisgKi8KK3ZvaWQgcnhycGNfcmVsZWFzZV9jYWxsKHN0cnVjdCByeHJwY19zb2NrICpyeCwgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiA9IGNhbGwtPmNvbm47CisJYm9vbCBwdXQgPSBmYWxzZTsKKwlpbnQgaTsKKworCV9lbnRlcigieyVkLCVkfSIsIGNhbGwtPmRlYnVnX2lkLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpKTsKKworCXRyYWNlX3J4cnBjX2NhbGwoY2FsbCwgcnhycGNfY2FsbF9yZWxlYXNlLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAorCQkJIGhlcmUsIChjb25zdCB2b2lkICopY2FsbC0+ZmxhZ3MpOworCisJQVNTRVJUQ01QKGNhbGwtPnN0YXRlLCA9PSwgUlhSUENfQ0FMTF9DT01QTEVURSk7CiAKIAlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwogCWlmICh0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfUkVMRUFTRUQsICZjYWxsLT5mbGFncykpCiAJCUJVRygpOwogCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKIAotCS8qIGRpc3NvY2lhdGUgZnJvbSB0aGUgc29ja2V0Ci0JICogLSB0aGUgc29ja2V0J3MgcmVmIG9uIHRoZSBjYWxsIGlzIHBhc3NlZCB0byB0aGUgZGVhdGggdGltZXIKLQkgKi8KLQlfZGVidWcoIlJFTEVBU0UgQ0FMTCAlcCAoJWQgQ09OTiAlcCkiLCBjYWxsLCBjYWxsLT5kZWJ1Z19pZCwgY29ubik7CisJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnRpbWVyKTsKIAotCXNwaW5fbG9jaygmY29ubi0+cGFyYW1zLnBlZXItPmxvY2spOwotCWhsaXN0X2RlbF9pbml0KCZjYWxsLT5lcnJvcl9saW5rKTsKLQlzcGluX3VubG9jaygmY29ubi0+cGFyYW1zLnBlZXItPmxvY2spOworCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYW55IG1vcmUgbm90aWZpY2F0aW9ucyAqLworCXdyaXRlX2xvY2tfYmgoJnJ4LT5yZWN2bXNnX2xvY2spOwogCi0Jd3JpdGVfbG9ja19iaCgmcngtPmNhbGxfbG9jayk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5hY2NlcHRfbGluaykpIHsKKwlpZiAoIWxpc3RfZW1wdHkoJmNhbGwtPnJlY3Ztc2dfbGluaykpIHsKIAkJX2RlYnVnKCJ1bmxpbmtpbmcgb25jZS1wZW5kaW5nIGNhbGwgJXAgeyBlPSVseCBmPSVseCB9IiwKIAkJICAgICAgIGNhbGwsIGNhbGwtPmV2ZW50cywgY2FsbC0+ZmxhZ3MpOwotCQlBU1NFUlQoIXRlc3RfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKSk7Ci0JCWxpc3RfZGVsX2luaXQoJmNhbGwtPmFjY2VwdF9saW5rKTsKLQkJc2tfYWNjZXB0cV9yZW1vdmVkKCZyeC0+c2spOwotCX0gZWxzZSBpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpKSB7CisJCWxpc3RfZGVsKCZjYWxsLT5yZWN2bXNnX2xpbmspOworCQlwdXQgPSB0cnVlOworCX0KKworCS8qIGxpc3RfZW1wdHkoKSBtdXN0IHJldHVybiBmYWxzZSBpbiByeHJwY19ub3RpZnlfc29ja2V0KCkgKi8KKwljYWxsLT5yZWN2bXNnX2xpbmsubmV4dCA9IE5VTEw7CisJY2FsbC0+cmVjdm1zZ19saW5rLnByZXYgPSBOVUxMOworCisJd3JpdGVfdW5sb2NrX2JoKCZyeC0+cmVjdm1zZ19sb2NrKTsKKwlpZiAocHV0KQorCQlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CisKKwl3cml0ZV9sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpKSB7CiAJCXJiX2VyYXNlKCZjYWxsLT5zb2NrX25vZGUsICZyeC0+Y2FsbHMpOwogCQltZW1zZXQoJmNhbGwtPnNvY2tfbm9kZSwgMHhkZCwgc2l6ZW9mKGNhbGwtPnNvY2tfbm9kZSkpOwotCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpOwotCX0KLQl3cml0ZV91bmxvY2tfYmgoJnJ4LT5jYWxsX2xvY2spOwotCi0JLyogZnJlZSB1cCB0aGUgY2hhbm5lbCBmb3IgcmV1c2UgKi8KLQl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQotCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUgJiYKLQkgICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9DTElFTlRfRklOQUxfQUNLKSB7Ci0JCV9kZWJ1ZygiKysrIEFCT1JUSU5HIFNUQVRFICVkICsrK1xuIiwgY2FsbC0+c3RhdGUpOwotCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOwotCQljYWxsLT5sb2NhbF9hYm9ydCA9IFJYX0NBTExfREVBRDsKLQl9Ci0Jd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQotCXJ4cnBjX2Rpc2Nvbm5lY3RfY2FsbChjYWxsKTsKLQotCS8qIGNsZWFuIHVwIHRoZSBSeCBxdWV1ZSAqLwotCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkgfHwKLQkgICAgIXNrYl9xdWV1ZV9lbXB0eSgmY2FsbC0+cnhfb29zX3F1ZXVlKSkgewotCQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0JCV9kZWJ1ZygicHVyZ2UgUnggcXVldWVzIik7Ci0KLQkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKLQkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY2FsbC0+cnhfcXVldWUpKSB8fAotCQkgICAgICAgKHNrYiA9IHNrYl9kZXF1ZXVlKCZjYWxsLT5yeF9vb3NfcXVldWUpKSkgewotCQkJc3AgPSByeHJwY19za2Ioc2tiKTsKLQkJCWlmIChzcC0+Y2FsbCkgewotCQkJCUFTU0VSVENNUChzcC0+Y2FsbCwgPT0sIGNhbGwpOwotCQkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCQkJCXNwLT5jYWxsID0gTlVMTDsKLQkJCX0KLQkJCXNrYi0+ZGVzdHJ1Y3RvciA9IE5VTEw7Ci0JCQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7Ci0KLQkJCV9kZWJ1ZygiLSB6YXAgJXMgJSUldSAjJXUiLAotCQkJICAgICAgIHJ4cnBjX3BrdHNbc3AtPmhkci50eXBlXSwKLQkJCSAgICAgICBzcC0+aGRyLnNlcmlhbCwgc3AtPmhkci5zZXEpOwotCQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKLQkJCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOwotCi0JCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgIT0sIFJYUlBDX0NBTExfQ09NUExFVEUpOworCQlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dF91c2VyaWQpOwogCX0KIAotCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5yZXNlbmRfdGltZXIpOwotCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tfdGltZXIpOwotCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5saWZldGltZXIpOwotCWNhbGwtPmRlYWRzcGFuLmV4cGlyZXMgPSBqaWZmaWVzICsgcnhycGNfZGVhZF9jYWxsX2V4cGlyeTsKLQlhZGRfdGltZXIoJmNhbGwtPmRlYWRzcGFuKTsKKwlsaXN0X2RlbCgmY2FsbC0+c29ja19saW5rKTsKKwl3cml0ZV91bmxvY2soJnJ4LT5jYWxsX2xvY2spOworCisJX2RlYnVnKCJSRUxFQVNFIENBTEwgJXAgKCVkIENPTk4gJXApIiwgY2FsbCwgY2FsbC0+ZGVidWdfaWQsIGNvbm4pOworCisJaWYgKGNvbm4pCisJCXJ4cnBjX2Rpc2Nvbm5lY3RfY2FsbChjYWxsKTsKKworCWZvciAoaSA9IDA7IGkgPCBSWFJQQ19SWFRYX0JVRkZfU0laRTsgaSsrKSB7CisJCXJ4cnBjX2ZyZWVfc2tiKGNhbGwtPnJ4dHhfYnVmZmVyW2ldLAorCQkJICAgICAgIChjYWxsLT50eF9waGFzZSA/IHJ4cnBjX3NrYl90eF9jbGVhbmVkIDoKKwkJCQlyeHJwY19za2JfcnhfY2xlYW5lZCkpOworCQljYWxsLT5yeHR4X2J1ZmZlcltpXSA9IE5VTEw7CisJfQogCiAJX2xlYXZlKCIiKTsKIH0KIAogLyoKLSAqIGhhbmRsZSBhIGRlYWQgY2FsbCBiZWluZyByZWFkeSBmb3IgcmVhcGluZwotICovCi1zdGF0aWMgdm9pZCByeHJwY19kZWFkX2NhbGxfZXhwaXJlZCh1bnNpZ25lZCBsb25nIF9jYWxsKQotewotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gKHN0cnVjdCByeHJwY19jYWxsICopIF9jYWxsOwotCi0JX2VudGVyKCJ7JWR9IiwgY2FsbC0+ZGVidWdfaWQpOwotCi0Jd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0RFQUQ7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLX0KLQotLyoKLSAqIG1hcmsgYSBjYWxsIGFzIHRvIGJlIHJlbGVhc2VkLCBhYm9ydGluZyBpdCBpZiBpdCdzIHN0aWxsIGluIHByb2dyZXNzCi0gKiAtIGNhbGxlZCB3aXRoIHNvZnRpcnFzIGRpc2FibGVkCi0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX21hcmtfY2FsbF9yZWxlYXNlZChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKLXsKLQlib29sIHNjaGVkOwotCi0Jd3JpdGVfbG9jaygmY2FsbC0+c3RhdGVfbG9jayk7Ci0JaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9ERUFEKSB7Ci0JCXNjaGVkID0gZmFsc2U7Ci0JCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKLQkJCV9kZWJ1ZygiYWJvcnQgY2FsbCAlcCIsIGNhbGwpOwotCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRDsKLQkJCWNhbGwtPmxvY2FsX2Fib3J0ID0gUlhfQ0FMTF9ERUFEOwotCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpKQotCQkJCXNjaGVkID0gdHJ1ZTsKLQkJfQotCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9SRUxFQVNFLCAmY2FsbC0+ZXZlbnRzKSkKLQkJCXNjaGVkID0gdHJ1ZTsKLQkJaWYgKHNjaGVkKQotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQl9Ci0Jd3JpdGVfdW5sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLX0KLQotLyoKICAqIHJlbGVhc2UgYWxsIHRoZSBjYWxscyBhc3NvY2lhdGVkIHdpdGggYSBzb2NrZXQKICAqLwogdm9pZCByeHJwY19yZWxlYXNlX2NhbGxzX29uX3NvY2tldChzdHJ1Y3QgcnhycGNfc29jayAqcngpCiB7CiAJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7Ci0Jc3RydWN0IHJiX25vZGUgKnA7CiAKIAlfZW50ZXIoIiVwIiwgcngpOwogCi0JcmVhZF9sb2NrX2JoKCZyeC0+Y2FsbF9sb2NrKTsKLQotCS8qIG1hcmsgYWxsIHRoZSBjYWxscyBhcyBubyBsb25nZXIgd2FudGluZyBpbmNvbWluZyBwYWNrZXRzICovCi0JZm9yIChwID0gcmJfZmlyc3QoJnJ4LT5jYWxscyk7IHA7IHAgPSByYl9uZXh0KHApKSB7Ci0JCWNhbGwgPSByYl9lbnRyeShwLCBzdHJ1Y3QgcnhycGNfY2FsbCwgc29ja19ub2RlKTsKLQkJcnhycGNfbWFya19jYWxsX3JlbGVhc2VkKGNhbGwpOworCXdoaWxlICghbGlzdF9lbXB0eSgmcngtPnRvX2JlX2FjY2VwdGVkKSkgeworCQljYWxsID0gbGlzdF9lbnRyeShyeC0+dG9fYmVfYWNjZXB0ZWQubmV4dCwKKwkJCQkgIHN0cnVjdCByeHJwY19jYWxsLCBhY2NlcHRfbGluayk7CisJCWxpc3RfZGVsKCZjYWxsLT5hY2NlcHRfbGluayk7CisJCXJ4cnBjX2Fib3J0X2NhbGwoIlNLUiIsIGNhbGwsIDAsIFJYX0NBTExfREVBRCwgRUNPTk5SRVNFVCk7CisJCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0KTsKIAl9CiAKLQkvKiBraWxsIHRoZSBub3QteWV0LWFjY2VwdGVkIGluY29taW5nIGNhbGxzICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjYWxsLCAmcngtPnNlY3VyZXEsIGFjY2VwdF9saW5rKSB7Ci0JCXJ4cnBjX21hcmtfY2FsbF9yZWxlYXNlZChjYWxsKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnJ4LT5zb2NrX2NhbGxzKSkgeworCQljYWxsID0gbGlzdF9lbnRyeShyeC0+c29ja19jYWxscy5uZXh0LAorCQkJCSAgc3RydWN0IHJ4cnBjX2NhbGwsIHNvY2tfbGluayk7CisJCXJ4cnBjX2dldF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfZ290KTsKKwkJcnhycGNfYWJvcnRfY2FsbCgiU0tUIiwgY2FsbCwgMCwgUlhfQ0FMTF9ERUFELCBFQ09OTlJFU0VUKTsKKwkJcnhycGNfc2VuZF9jYWxsX3BhY2tldChjYWxsLCBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVCk7CisJCXJ4cnBjX3JlbGVhc2VfY2FsbChyeCwgY2FsbCk7CisJCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0KTsKIAl9CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbGwsICZyeC0+YWNjZXB0cSwgYWNjZXB0X2xpbmspIHsKLQkJcnhycGNfbWFya19jYWxsX3JlbGVhc2VkKGNhbGwpOwotCX0KLQotCXJlYWRfdW5sb2NrX2JoKCZyeC0+Y2FsbF9sb2NrKTsKIAlfbGVhdmUoIiIpOwogfQogCiAvKgogICogcmVsZWFzZSBhIGNhbGwKICAqLwotdm9pZCBfX3J4cnBjX3B1dF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQordm9pZCByeHJwY19wdXRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgZW51bSByeHJwY19jYWxsX3RyYWNlIG9wKQogeworCWNvbnN0IHZvaWQgKmhlcmUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJaW50IG47CisKIAlBU1NFUlQoY2FsbCAhPSBOVUxMKTsKIAotCV9lbnRlcigiJXB7dT0lZH0iLCBjYWxsLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpKTsKLQotCUFTU0VSVENNUChhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLCA+LCAwKTsKLQotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjYWxsLT51c2FnZSkpIHsKKwluID0gYXRvbWljX2RlY19yZXR1cm4oJmNhbGwtPnVzYWdlKTsKKwl0cmFjZV9yeHJwY19jYWxsKGNhbGwsIG9wLCBuLCBoZXJlLCBOVUxMKTsKKwlBU1NFUlRDTVAobiwgPj0sIDApOworCWlmIChuID09IDApIHsKIAkJX2RlYnVnKCJjYWxsICVkIGRlYWQiLCBjYWxsLT5kZWJ1Z19pZCk7Ci0JCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgPT0sIFJYUlBDX0NBTExfREVBRCk7Ci0JCXJ4cnBjX3F1ZXVlX3dvcmsoJmNhbGwtPmRlc3Ryb3llcik7CisJCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgPT0sIFJYUlBDX0NBTExfQ09NUExFVEUpOworCisJCXdyaXRlX2xvY2soJnJ4cnBjX2NhbGxfbG9jayk7CisJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmxpbmspOworCQl3cml0ZV91bmxvY2soJnJ4cnBjX2NhbGxfbG9jayk7CisKKwkJcnhycGNfY2xlYW51cF9jYWxsKGNhbGwpOwogCX0KLQlfbGVhdmUoIiIpOwogfQogCiAvKgpAQCAtNjE4LDE4NyArNTM4LDcwIEBACiB7CiAJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgcnhycGNfY2FsbCwgcmN1KTsKIAotCXJ4cnBjX3B1cmdlX3F1ZXVlKCZjYWxsLT5yeF9xdWV1ZSk7CisJcnhycGNfcHV0X3BlZXIoY2FsbC0+cGVlcik7CisJa2ZyZWUoY2FsbC0+cnh0eF9idWZmZXIpOworCWtmcmVlKGNhbGwtPnJ4dHhfYW5ub3RhdGlvbnMpOwogCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FsbCk7CiB9CiAKIC8qCiAgKiBjbGVhbiB1cCBhIGNhbGwKICAqLwotc3RhdGljIHZvaWQgcnhycGNfY2xlYW51cF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQordm9pZCByeHJwY19jbGVhbnVwX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCiB7Ci0JX25ldCgiREVTVFJPWSBDQUxMICVkIiwgY2FsbC0+ZGVidWdfaWQpOworCWludCBpOwogCi0JQVNTRVJUKGNhbGwtPnNvY2tldCk7CisJX25ldCgiREVTVFJPWSBDQUxMICVkIiwgY2FsbC0+ZGVidWdfaWQpOwogCiAJbWVtc2V0KCZjYWxsLT5zb2NrX25vZGUsIDB4Y2QsIHNpemVvZihjYWxsLT5zb2NrX25vZGUpKTsKIAotCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5saWZldGltZXIpOwotCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5kZWFkc3Bhbik7Ci0JZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcik7Ci0JZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnJlc2VuZF90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnRpbWVyKTsKIAorCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgPT0sIFJYUlBDX0NBTExfQ09NUExFVEUpOwogCUFTU0VSVCh0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpKTsKLQlBU1NFUlRDTVAoY2FsbC0+ZXZlbnRzLCA9PSwgMCk7Ci0JaWYgKHdvcmtfcGVuZGluZygmY2FsbC0+cHJvY2Vzc29yKSkgewotCQlfZGVidWcoImRlZmVyIGRlc3Ryb3kiKTsKLQkJcnhycGNfcXVldWVfd29yaygmY2FsbC0+ZGVzdHJveWVyKTsKLQkJcmV0dXJuOwotCX0KLQogCUFTU0VSVENNUChjYWxsLT5jb25uLCA9PSwgTlVMTCk7CiAKLQlpZiAoY2FsbC0+YWNrc193aW5kb3cpIHsKLQkJX2RlYnVnKCJraWxsIFR4IHdpbmRvdyAlZCIsCi0JCSAgICAgICBDSVJDX0NOVChjYWxsLT5hY2tzX2hlYWQsIGNhbGwtPmFja3NfdGFpbCwKLQkJCQljYWxsLT5hY2tzX3dpbnN6KSk7Ci0JCXNtcF9tYigpOwotCQl3aGlsZSAoQ0lSQ19DTlQoY2FsbC0+YWNrc19oZWFkLCBjYWxsLT5hY2tzX3RhaWwsCi0JCQkJY2FsbC0+YWNrc193aW5zeikgPiAwKSB7Ci0JCQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCQkJdW5zaWduZWQgbG9uZyBfc2tiOworCS8qIENsZWFuIHVwIHRoZSBSeC9UeCBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhSUENfUlhUWF9CVUZGX1NJWkU7IGkrKykKKwkJcnhycGNfZnJlZV9za2IoY2FsbC0+cnh0eF9idWZmZXJbaV0sCisJCQkgICAgICAgKGNhbGwtPnR4X3BoYXNlID8gcnhycGNfc2tiX3R4X2NsZWFuZWQgOgorCQkJCXJ4cnBjX3NrYl9yeF9jbGVhbmVkKSk7CiAKLQkJCV9za2IgPSBjYWxsLT5hY2tzX3dpbmRvd1tjYWxsLT5hY2tzX3RhaWxdICYgfjE7Ci0JCQlzcCA9IHJ4cnBjX3NrYigoc3RydWN0IHNrX2J1ZmYgKilfc2tiKTsKLQkJCV9kZWJ1ZygiKysrIGNsZWFyIFR4ICV1Iiwgc3AtPmhkci5zZXEpOwotCQkJcnhycGNfZnJlZV9za2IoKHN0cnVjdCBza19idWZmICopX3NrYik7Ci0JCQljYWxsLT5hY2tzX3RhaWwgPQotCQkJCShjYWxsLT5hY2tzX3RhaWwgKyAxKSAmIChjYWxsLT5hY2tzX3dpbnN6IC0gMSk7Ci0JCX0KKwlyeHJwY19mcmVlX3NrYihjYWxsLT50eF9wZW5kaW5nLCByeHJwY19za2JfdHhfY2xlYW5lZCk7CiAKLQkJa2ZyZWUoY2FsbC0+YWNrc193aW5kb3cpOwotCX0KLQotCXJ4cnBjX2ZyZWVfc2tiKGNhbGwtPnR4X3BlbmRpbmcpOwotCi0JcnhycGNfcHVyZ2VfcXVldWUoJmNhbGwtPnJ4X3F1ZXVlKTsKLQlBU1NFUlQoc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9vb3NfcXVldWUpKTsKLQlzb2NrX3B1dCgmY2FsbC0+c29ja2V0LT5zayk7CiAJY2FsbF9yY3UoJmNhbGwtPnJjdSwgcnhycGNfcmN1X2Rlc3Ryb3lfY2FsbCk7CiB9CiAKIC8qCi0gKiBkZXN0cm95IGEgY2FsbAotICovCi1zdGF0aWMgdm9pZCByeHJwY19kZXN0cm95X2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByeHJwY19jYWxsLCBkZXN0cm95ZXIpOwotCi0JX2VudGVyKCIlcHslZCwlZCwlcH0iLAotCSAgICAgICBjYWxsLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLCBjYWxsLT5jaGFubmVsLCBjYWxsLT5jb25uKTsKLQotCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgPT0sIFJYUlBDX0NBTExfREVBRCk7Ci0KLQl3cml0ZV9sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOwotCWxpc3RfZGVsX2luaXQoJmNhbGwtPmxpbmspOwotCXdyaXRlX3VubG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKLQotCXJ4cnBjX2NsZWFudXBfY2FsbChjYWxsKTsKLQlfbGVhdmUoIiIpOwotfQotCi0vKgotICogcHJlZW1wdGl2ZWx5IGRlc3Ryb3kgYWxsIHRoZSBjYWxsIHJlY29yZHMgZnJvbSBhIHRyYW5zcG9ydCBlbmRwb2ludCByYXRoZXIKLSAqIHRoYW4gd2FpdGluZyBmb3IgdGhlbSB0byB0aW1lIG91dAorICogTWFrZSBzdXJlIHRoYXQgYWxsIGNhbGxzIGFyZSBnb25lLgogICovCiB2b2lkIF9fZXhpdCByeHJwY19kZXN0cm95X2FsbF9jYWxscyh2b2lkKQogewogCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwogCiAJX2VudGVyKCIiKTsKLQl3cml0ZV9sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJnJ4cnBjX2NhbGxzKSkKKwkJcmV0dXJuOworCisJd3JpdGVfbG9jaygmcnhycGNfY2FsbF9sb2NrKTsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmcnhycGNfY2FsbHMpKSB7CiAJCWNhbGwgPSBsaXN0X2VudHJ5KHJ4cnBjX2NhbGxzLm5leHQsIHN0cnVjdCByeHJwY19jYWxsLCBsaW5rKTsKIAkJX2RlYnVnKCJaYXBwaW5nIGNhbGwgJXAiLCBjYWxsKTsKIAorCQlyeHJwY19zZWVfY2FsbChjYWxsKTsKIAkJbGlzdF9kZWxfaW5pdCgmY2FsbC0+bGluayk7CiAKLQkJc3dpdGNoIChhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpKSB7Ci0JCWNhc2UgMDoKLQkJCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgPT0sIFJYUlBDX0NBTExfREVBRCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJaWYgKGRlbF90aW1lcl9zeW5jKCZjYWxsLT5kZWFkc3BhbikgIT0gMCAmJgotCQkJICAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfREVBRCkKLQkJCQlyeHJwY19kZWFkX2NhbGxfZXhwaXJlZCgodW5zaWduZWQgbG9uZykgY2FsbCk7Ci0JCQlpZiAoY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9ERUFEKQotCQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZXJyKCJDYWxsICVwIHN0aWxsIGluIHVzZSAoJWQsJWQsJXMsJWx4LCVseCkhXG4iLAotCQkJICAgICAgIGNhbGwsIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSksCi0JCQkgICAgICAgYXRvbWljX3JlYWQoJmNhbGwtPmFja3Jfbm90X2lkbGUpLAotCQkJICAgICAgIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPnN0YXRlXSwKLQkJCSAgICAgICBjYWxsLT5mbGFncywgY2FsbC0+ZXZlbnRzKTsKLQkJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkpCi0JCQkJcHJfZXJyKCJSeCBxdWV1ZSBvY2N1cGllZFxuIik7Ci0JCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmY2FsbC0+cnhfb29zX3F1ZXVlKSkKLQkJCQlwcl9lcnIoIk9PUyBxdWV1ZSBvY2N1cGllZFxuIik7Ci0JCQlicmVhazsKLQkJfQorCQlwcl9lcnIoIkNhbGwgJXAgc3RpbGwgaW4gdXNlICglZCwlcywlbHgsJWx4KSFcbiIsCisJCSAgICAgICBjYWxsLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAorCQkgICAgICAgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+c3RhdGVdLAorCQkgICAgICAgY2FsbC0+ZmxhZ3MsIGNhbGwtPmV2ZW50cyk7CiAKLQkJd3JpdGVfdW5sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOworCQl3cml0ZV91bmxvY2soJnJ4cnBjX2NhbGxfbG9jayk7CiAJCWNvbmRfcmVzY2hlZCgpOwotCQl3cml0ZV9sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOworCQl3cml0ZV9sb2NrKCZyeHJwY19jYWxsX2xvY2spOwogCX0KIAotCXdyaXRlX3VubG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKLQlfbGVhdmUoIiIpOwotfQotCi0vKgotICogaGFuZGxlIGNhbGwgbGlmZXRpbWUgYmVpbmcgZXhjZWVkZWQKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfY2FsbF9saWZlX2V4cGlyZWQodW5zaWduZWQgbG9uZyBfY2FsbCkKLXsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IChzdHJ1Y3QgcnhycGNfY2FsbCAqKSBfY2FsbDsKLQotCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKQotCQlyZXR1cm47Ci0KLQlfZW50ZXIoInslZH0iLCBjYWxsLT5kZWJ1Z19pZCk7Ci0JcmVhZF9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7Ci0JCXNldF9iaXQoUlhSUENfQ0FMTF9FVl9MSUZFX1RJTUVSLCAmY2FsbC0+ZXZlbnRzKTsKLQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQl9Ci0JcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotfQotCi0vKgotICogaGFuZGxlIHJlc2VuZCB0aW1lciBleHBpcnkKLSAqIC0gbWF5IG5vdCB0YWtlIGNhbGwtPnN0YXRlX2xvY2sgYXMgdGhpcyBjYW4gZGVhZGxvY2sgYWdhaW5zdCBkZWxfdGltZXJfc3luYygpCi0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX3Jlc2VuZF90aW1lX2V4cGlyZWQodW5zaWduZWQgbG9uZyBfY2FsbCkKLXsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IChzdHJ1Y3QgcnhycGNfY2FsbCAqKSBfY2FsbDsKLQotCV9lbnRlcigieyVkfSIsIGNhbGwtPmRlYnVnX2lkKTsKLQotCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKQotCQlyZXR1cm47Ci0KLQljbGVhcl9iaXQoUlhSUENfQ0FMTF9SVU5fUlRJTUVSLCAmY2FsbC0+ZmxhZ3MpOwotCWlmICghdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VWX1JFU0VORF9USU1FUiwgJmNhbGwtPmV2ZW50cykpCi0JCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci19Ci0KLS8qCi0gKiBoYW5kbGUgQUNLIHRpbWVyIGV4cGlyeQotICovCi1zdGF0aWMgdm9pZCByeHJwY19hY2tfdGltZV9leHBpcmVkKHVuc2lnbmVkIGxvbmcgX2NhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSAoc3RydWN0IHJ4cnBjX2NhbGwgKikgX2NhbGw7Ci0KLQlfZW50ZXIoInslZH0iLCBjYWxsLT5kZWJ1Z19pZCk7Ci0KLQlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9DT01QTEVURSkKLQkJcmV0dXJuOwotCi0JcmVhZF9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0NPTVBMRVRFICYmCi0JICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfQUNLLCAmY2FsbC0+ZXZlbnRzKSkKLQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQlyZWFkX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJd3JpdGVfdW5sb2NrKCZyeHJwY19jYWxsX2xvY2spOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2Nvbm5fY2xpZW50LmMgYi9uZXQvcnhycGMvY29ubl9jbGllbnQuYwppbmRleCA5ZTkxZjI3Li42MGVmOTYwIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvY29ubl9jbGllbnQuYworKysgYi9uZXQvcnhycGMvY29ubl9jbGllbnQuYwpAQCAtNyw2ICs3LDY4IEBACiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQogICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCisgKiBDbGllbnQgY29ubmVjdGlvbnMgbmVlZCB0byBiZSBjYWNoZWQgZm9yIGEgbGl0dGxlIHdoaWxlIGFmdGVyIHRoZXkndmUgbWFkZSBhCisgKiBjYWxsIHNvIGFzIHRvIGhhbmRsZSByZXRyYW5zbWl0dGVkIERBVEEgcGFja2V0cyBpbiBjYXNlIHRoZSBzZXJ2ZXIgZGlkbid0CisgKiByZWNlaXZlIHRoZSBmaW5hbCBBQ0sgb3IgdGVybWluYXRpbmcgQUJPUlQgd2Ugc2VudCBpdC4KKyAqCisgKiBDbGllbnQgY29ubmVjdGlvbnMgY2FuIGJlIGluIG9uZSBvZiBhIG51bWJlciBvZiBjYWNoZSBzdGF0ZXM6CisgKgorICogICgxKSBJTkFDVElWRSAtIFRoZSBjb25uZWN0aW9uIGlzIG5vdCBoZWxkIGluIGFueSBsaXN0IGFuZCBtYXkgbm90IGhhdmUgYmVlbgorICogICAgICBleHBvc2VkIHRvIHRoZSB3b3JsZC4gIElmIGl0IGhhcyBiZWVuIHByZXZpb3VzbHkgZXhwb3NlZCwgaXQgd2FzCisgKiAgICAgIGRpc2NhcmRlZCBmcm9tIHRoZSBpZGxlIGxpc3QgYWZ0ZXIgZXhwaXJpbmcuCisgKgorICogICgyKSBXQUlUSU5HIC0gVGhlIGNvbm5lY3Rpb24gaXMgd2FpdGluZyBmb3IgdGhlIG51bWJlciBvZiBjbGllbnQgY29ubnMgdG8KKyAqICAgICAgZHJvcCBiZWxvdyB0aGUgbWF4aW11bSBjYXBhY2l0eS4gIENhbGxzIG1heSBiZSBpbiBwcm9ncmVzcyB1cG9uIGl0IGZyb20KKyAqICAgICAgd2hlbiBpdCB3YXMgYWN0aXZlIGFuZCBnb3QgY3VsbGVkLgorICoKKyAqCVRoZSBjb25uZWN0aW9uIGlzIG9uIHRoZSByeHJwY193YWl0aW5nX2NsaWVudF9jb25ucyBsaXN0IHdoaWNoIGlzIGtlcHQKKyAqCWluIHRvLWJlLWdyYW50ZWQgb3JkZXIuICBDdWxsZWQgY29ubnMgd2l0aCB3YWl0ZXJzIGdvIHRvIHRoZSBiYWNrIG9mCisgKgl0aGUgcXVldWUganVzdCBsaWtlIG5ldyBjb25ucy4KKyAqCisgKiAgKDMpIEFDVElWRSAtIFRoZSBjb25uZWN0aW9uIGhhcyBhdCBsZWFzdCBvbmUgY2FsbCBpbiBwcm9ncmVzcyB1cG9uIGl0LCBpdAorICogICAgICBtYXkgZnJlZWx5IGdyYW50IGF2YWlsYWJsZSBjaGFubmVscyB0byBuZXcgY2FsbHMgYW5kIGNhbGxzIG1heSBiZQorICogICAgICB3YWl0aW5nIG9uIGl0IGZvciBjaGFubmVscyB0byBiZWNvbWUgYXZhaWxhYmxlLgorICoKKyAqCVRoZSBjb25uZWN0aW9uIGlzIG9uIHRoZSByeHJwY19hY3RpdmVfY2xpZW50X2Nvbm5zIGxpc3Qgd2hpY2ggaXMga2VwdAorICoJaW4gYWN0aXZhdGlvbiBvcmRlciBmb3IgY3VsbGluZyBwdXJwb3Nlcy4KKyAqCisgKglyeHJwY19ucl9hY3RpdmVfY2xpZW50X2Nvbm5zIGlzIGhlbGQgaW5jcmVtZW50ZWQgYWxzby4KKyAqCisgKiAgKDQpIENVTExFRCAtIFRoZSBjb25uZWN0aW9uIGdvdCBzdW1tYXJpbHkgY3VsbGVkIHRvIHRyeSBhbmQgZnJlZSB1cAorICogICAgICBjYXBhY2l0eS4gIENhbGxzIGN1cnJlbnRseSBpbiBwcm9ncmVzcyBvbiB0aGUgY29ubmVjdGlvbiBhcmUgYWxsb3dlZCB0bworICogICAgICBjb250aW51ZSwgYnV0IG5ldyBjYWxscyB3aWxsIGhhdmUgdG8gd2FpdC4gIFRoZXJlIGNhbiBiZSBubyB3YWl0ZXJzIGluCisgKiAgICAgIHRoaXMgc3RhdGUgLSB0aGUgY29ubiB3b3VsZCBoYXZlIHRvIGdvIHRvIHRoZSBXQUlUSU5HIHN0YXRlIGluc3RlYWQuCisgKgorICogICg1KSBJRExFIC0gVGhlIGNvbm5lY3Rpb24gaGFzIG5vIGNhbGxzIGluIHByb2dyZXNzIHVwb24gaXQgYW5kIG11c3QgaGF2ZQorICogICAgICBiZWVuIGV4cG9zZWQgdG8gdGhlIHdvcmxkIChpZS4gdGhlIEVYUE9TRUQgZmxhZyBtdXN0IGJlIHNldCkuICBXaGVuIGl0CisgKiAgICAgIGV4cGlyZXMsIHRoZSBFWFBPU0VEIGZsYWcgaXMgY2xlYXJlZCBhbmQgdGhlIGNvbm5lY3Rpb24gdHJhbnNpdGlvbnMgdG8KKyAqICAgICAgdGhlIElOQUNUSVZFIHN0YXRlLgorICoKKyAqCVRoZSBjb25uZWN0aW9uIGlzIG9uIHRoZSByeHJwY19pZGxlX2NsaWVudF9jb25ucyBsaXN0IHdoaWNoIGlzIGtlcHQgaW4KKyAqCW9yZGVyIG9mIGhvdyBzb29uIHRoZXknbGwgZXhwaXJlLgorICoKKyAqIFRoZXJlIGFyZSBmbGFncyBvZiByZWxldmFuY2UgdG8gdGhlIGNhY2hlOgorICoKKyAqICAoMSkgRVhQT1NFRCAtIFRoZSBjb25uZWN0aW9uIElEIGdvdCBleHBvc2VkIHRvIHRoZSB3b3JsZC4gIElmIHRoaXMgZmxhZyBpcworICogICAgICBzZXQsIGFuIGV4dHJhIHJlZiBpcyBhZGRlZCB0byB0aGUgY29ubmVjdGlvbiBwcmV2ZW50aW5nIGl0IGZyb20gYmVpbmcKKyAqICAgICAgcmVhcGVkIHdoZW4gaXQgaGFzIG5vIGNhbGxzIG91dHN0YW5kaW5nLiAgVGhpcyBmbGFnIGlzIGNsZWFyZWQgYW5kIHRoZQorICogICAgICByZWYgZHJvcHBlZCB3aGVuIGEgY29ubiBpcyBkaXNjYXJkZWQgZnJvbSB0aGUgaWRsZSBsaXN0LgorICoKKyAqICAgICAgVGhpcyBhbGxvd3MgdXMgdG8gbW92ZSB0ZXJtaW5hbCBjYWxsIHN0YXRlIHJldHJhbnNtaXNzaW9uIHRvIHRoZQorICogICAgICBjb25uZWN0aW9uIGFuZCB0byBkaXNjYXJkIHRoZSBjYWxsIGltbWVkaWF0ZWx5IHdlIHRoaW5rIGl0IGlzIGRvbmUKKyAqICAgICAgd2l0aC4gIEl0IGFsc28gZ2l2ZSB1cyBhIGNoYW5jZSB0byByZXVzZSB0aGUgY29ubmVjdGlvbi4KKyAqCisgKiAgKDIpIERPTlRfUkVVU0UgLSBUaGUgY29ubmVjdGlvbiBzaG91bGQgYmUgZGlzY2FyZGVkIGFzIHNvb24gYXMgcG9zc2libGUgYW5kCisgKiAgICAgIHNob3VsZCBub3QgYmUgcmV1c2VkLiAgVGhpcyBpcyBzZXQgd2hlbiBhbiBleGNsdXNpdmUgY29ubmVjdGlvbiBpcyB1c2VkCisgKiAgICAgIG9yIGEgY2FsbCBJRCBjb3VudGVyIG92ZXJmbG93cy4KKyAqCisgKiBUaGUgY2FjaGluZyBzdGF0ZSBtYXkgb25seSBiZSBjaGFuZ2VkIGlmIHRoZSBjYWNoZSBsb2NrIGlzIGhlbGQuCisgKgorICogVGhlcmUgYXJlIHR3byBpZGxlIGNsaWVudCBjb25uZWN0aW9uIGV4cGlyeSBkdXJhdGlvbnMuICBJZiB0aGUgdG90YWwgbnVtYmVyCisgKiBvZiBjb25uZWN0aW9ucyBpcyBiZWxvdyB0aGUgcmVhcCB0aHJlc2hvbGQsIHdlIHVzZSB0aGUgbm9ybWFsIGR1cmF0aW9uOyBpZgorICogaXQncyBhYm92ZSwgd2UgdXNlIHRoZSBmYXN0IGR1cmF0aW9uLgogICovCiAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKQEAgLTE2LDI3ICs3OCw1MCBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKIAorX19yZWFkX21vc3RseSB1bnNpZ25lZCBpbnQgcnhycGNfbWF4X2NsaWVudF9jb25uZWN0aW9ucyA9IDEwMDA7CitfX3JlYWRfbW9zdGx5IHVuc2lnbmVkIGludCByeHJwY19yZWFwX2NsaWVudF9jb25uZWN0aW9ucyA9IDkwMDsKK19fcmVhZF9tb3N0bHkgdW5zaWduZWQgaW50IHJ4cnBjX2Nvbm5faWRsZV9jbGllbnRfZXhwaXJ5ID0gMiAqIDYwICogSFo7CitfX3JlYWRfbW9zdGx5IHVuc2lnbmVkIGludCByeHJwY19jb25uX2lkbGVfY2xpZW50X2Zhc3RfZXhwaXJ5ID0gMiAqIEhaOworCitzdGF0aWMgdW5zaWduZWQgaW50IHJ4cnBjX25yX2NsaWVudF9jb25uczsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnhycGNfbnJfYWN0aXZlX2NsaWVudF9jb25uczsKK3N0YXRpYyBfX3JlYWRfbW9zdGx5IGJvb2wgcnhycGNfa2lsbF9hbGxfY2xpZW50X2Nvbm5zOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJ4cnBjX2NsaWVudF9jb25uX2NhY2hlX2xvY2spOworc3RhdGljIERFRklORV9TUElOTE9DSyhyeHJwY19jbGllbnRfY29ubl9kaXNjYXJkX211dGV4KTsKK3N0YXRpYyBMSVNUX0hFQUQocnhycGNfd2FpdGluZ19jbGllbnRfY29ubnMpOworc3RhdGljIExJU1RfSEVBRChyeHJwY19hY3RpdmVfY2xpZW50X2Nvbm5zKTsKK3N0YXRpYyBMSVNUX0hFQUQocnhycGNfaWRsZV9jbGllbnRfY29ubnMpOworCiAvKgogICogV2UgdXNlIG1hY2hpbmUtdW5pcXVlIElEcyBmb3Igb3VyIGNsaWVudCBjb25uZWN0aW9ucy4KICAqLwogREVGSU5FX0lEUihyeHJwY19jbGllbnRfY29ubl9pZHMpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhyeHJwY19jb25uX2lkX2xvY2spOwogCitzdGF0aWMgdm9pZCByeHJwY19jdWxsX2FjdGl2ZV9jbGllbnRfY29ubnModm9pZCk7CitzdGF0aWMgdm9pZCByeHJwY19kaXNjYXJkX2V4cGlyZWRfY2xpZW50X2Nvbm5zKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKKworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKHJ4cnBjX2NsaWVudF9jb25uX3JlYXAsCisJCQkgICAgcnhycGNfZGlzY2FyZF9leHBpcmVkX2NsaWVudF9jb25ucyk7CisKK2NvbnN0IGNoYXIgcnhycGNfY29ubl9jYWNoZV9zdGF0ZXNbUlhSUENfQ09OTl9fTlJfQ0FDSEVfU1RBVEVTXVs1XSA9IHsKKwlbUlhSUENfQ09OTl9DTElFTlRfSU5BQ1RJVkVdCT0gIkluYWMiLAorCVtSWFJQQ19DT05OX0NMSUVOVF9XQUlUSU5HXQk9ICJXYWl0IiwKKwlbUlhSUENfQ09OTl9DTElFTlRfQUNUSVZFXQk9ICJBY3R2IiwKKwlbUlhSUENfQ09OTl9DTElFTlRfQ1VMTEVEXQk9ICJDdWxsIiwKKwlbUlhSUENfQ09OTl9DTElFTlRfSURMRV0JPSAiSWRsZSIsCit9OworCiAvKgogICogR2V0IGEgY29ubmVjdGlvbiBJRCBhbmQgZXBvY2ggZm9yIGEgY2xpZW50IGNvbm5lY3Rpb24gZnJvbSB0aGUgZ2xvYmFsIHBvb2wuCiAgKiBUaGUgY29ubmVjdGlvbiBzdHJ1Y3QgcG9pbnRlciBpcyB0aGVuIHJlY29yZGVkIGluIHRoZSBpZHIgcmFkaXggdHJlZS4gIFRoZQotICogZXBvY2ggaXMgY2hhbmdlZCBpZiB0aGlzIHdyYXBzLgotICoKLSAqIFRPRE86IFRoZSBJRFIgdHJlZSBnZXRzIHZlcnkgZXhwZW5zaXZlIG9uIG1lbW9yeSBpZiB0aGUgY29ubmVjdGlvbiBJRHMgYXJlCi0gKiB3aWRlbHkgc2NhdHRlcmVkIHRocm91Z2hvdXQgdGhlIG51bWJlciBzcGFjZSwgc28gd2Ugc2hhbGwgbmVlZCB0byByZXRpcmUKLSAqIGNvbm5lY3Rpb25zIHRoYXQgaGF2ZSwgc2F5LCBhbiBJRCBtb3JlIHRoYW4gZm91ciB0aW1lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKLSAqIGNsaWVudCBjb25ucyBhd2F5IGZyb20gdGhlIGN1cnJlbnQgYWxsb2NhdGlvbiBwb2ludCB0byB0cnkgYW5kIGtlZXAgdGhlIElEcwotICogY29uY2VudHJhdGVkLiAgV2Ugd2lsbCBhbHNvIG5lZWQgdG8gcmV0aXJlIGNvbm5lY3Rpb25zIGZyb20gYW4gb2xkIGVwb2NoLgorICogZXBvY2ggZG9lc24ndCBjaGFuZ2UgdW50aWwgdGhlIGNsaWVudCBpcyByZWJvb3RlZCAob3IsIGF0IGxlYXN0LCB1bmxlc3MgdGhlCisgKiBtb2R1bGUgaXMgdW5sb2FkZWQpLgogICovCiBzdGF0aWMgaW50IHJ4cnBjX2dldF9jbGllbnRfY29ubmVjdGlvbl9pZChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKIAkJCQkJICBnZnBfdCBnZnApCiB7Ci0JdTMyIGVwb2NoOwogCWludCBpZDsKIAogCV9lbnRlcigiIik7CkBAIC00NCwzNCArMTI5LDE4IEBACiAJaWRyX3ByZWxvYWQoZ2ZwKTsKIAlzcGluX2xvY2soJnJ4cnBjX2Nvbm5faWRfbG9jayk7CiAKLQllcG9jaCA9IHJ4cnBjX2Vwb2NoOwotCi0JLyogV2UgY291bGQgdXNlIGlkcl9hbGxvY19jeWNsaWMoKSBoZXJlLCBidXQgd2UgcmVhbGx5IG5lZWQgdG8ga25vdwotCSAqIHdoZW4gdGhlIHRoaW5nIHdyYXBzIHNvIHRoYXQgd2UgY2FuIGFkdmFuY2UgdGhlIGVwb2NoLgotCSAqLwotCWlmIChyeHJwY19jbGllbnRfY29ubl9pZHMuY3VyID09IDApCi0JCXJ4cnBjX2NsaWVudF9jb25uX2lkcy5jdXIgPSAxOwotCWlkID0gaWRyX2FsbG9jKCZyeHJwY19jbGllbnRfY29ubl9pZHMsIGNvbm4sCi0JCSAgICAgICByeHJwY19jbGllbnRfY29ubl9pZHMuY3VyLCAweDQwMDAwMDAwLCBHRlBfTk9XQUlUKTsKLQlpZiAoaWQgPCAwKSB7Ci0JCWlmIChpZCAhPSAtRU5PU1BDKQotCQkJZ290byBlcnJvcjsKLQkJaWQgPSBpZHJfYWxsb2MoJnJ4cnBjX2NsaWVudF9jb25uX2lkcywgY29ubiwKLQkJCSAgICAgICAxLCAweDQwMDAwMDAwLCBHRlBfTk9XQUlUKTsKLQkJaWYgKGlkIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWVwb2NoKys7Ci0JCXJ4cnBjX2Vwb2NoID0gZXBvY2g7Ci0JfQotCXJ4cnBjX2NsaWVudF9jb25uX2lkcy5jdXIgPSBpZCArIDE7CisJaWQgPSBpZHJfYWxsb2NfY3ljbGljKCZyeHJwY19jbGllbnRfY29ubl9pZHMsIGNvbm4sCisJCQkgICAgICAxLCAweDQwMDAwMDAwLCBHRlBfTk9XQUlUKTsKKwlpZiAoaWQgPCAwKQorCQlnb3RvIGVycm9yOwogCiAJc3Bpbl91bmxvY2soJnJ4cnBjX2Nvbm5faWRfbG9jayk7CiAJaWRyX3ByZWxvYWRfZW5kKCk7CiAKLQljb25uLT5wcm90by5lcG9jaCA9IGVwb2NoOworCWNvbm4tPnByb3RvLmVwb2NoID0gcnhycGNfZXBvY2g7CiAJY29ubi0+cHJvdG8uY2lkID0gaWQgPDwgUlhSUENfQ0lEU0hJRlQ7CiAJc2V0X2JpdChSWFJQQ19DT05OX0hBU19JRFIsICZjb25uLT5mbGFncyk7Ci0JX2xlYXZlKCIgW0NJRCAleDoleF0iLCBlcG9jaCwgY29ubi0+cHJvdG8uY2lkKTsKKwlfbGVhdmUoIiBbQ0lEICV4XSIsIGNvbm4tPnByb3RvLmNpZCk7CiAJcmV0dXJuIDA7CiAKIGVycm9yOgpAQCAtMTE0LDggKzE4Myw3IEBACiB9CiAKIC8qCi0gKiBBbGxvY2F0ZSBhIGNsaWVudCBjb25uZWN0aW9uLiAgVGhlIGNhbGxlciBtdXN0IHRha2UgY2FyZSB0byBjbGVhciBhbnkKLSAqIHBhZGRpbmcgYnl0ZXMgaW4gKmNwLgorICogQWxsb2NhdGUgYSBjbGllbnQgY29ubmVjdGlvbi4KICAqLwogc3RhdGljIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICoKIHJ4cnBjX2FsbG9jX2NsaWVudF9jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uX3BhcmFtZXRlcnMgKmNwLCBnZnBfdCBnZnApCkBAIC0xMzEsNiArMTk5LDEwIEBACiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIAorCWF0b21pY19zZXQoJmNvbm4tPnVzYWdlLCAxKTsKKwlpZiAoY3AtPmV4Y2x1c2l2ZSkKKwkJX19zZXRfYml0KFJYUlBDX0NPTk5fRE9OVF9SRVVTRSwgJmNvbm4tPmZsYWdzKTsKKwogCWNvbm4tPnBhcmFtcwkJPSAqY3A7CiAJY29ubi0+b3V0X2NsaWVudGZsYWcJPSBSWFJQQ19DTElFTlRfSU5JVElBVEVEOwogCWNvbm4tPnN0YXRlCQk9IFJYUlBDX0NPTk5fQ0xJRU5UOwpAQCAtMTQ4LDcgKzIyMCw3IEBACiAJCWdvdG8gZXJyb3JfMjsKIAogCXdyaXRlX2xvY2soJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmY29ubi0+bGluaywgJnJ4cnBjX2Nvbm5lY3Rpb25zKTsKKwlsaXN0X2FkZF90YWlsKCZjb25uLT5wcm9jX2xpbmssICZyeHJwY19jb25uZWN0aW9uX3Byb2NfbGlzdCk7CiAJd3JpdGVfdW5sb2NrKCZyeHJwY19jb25uZWN0aW9uX2xvY2spOwogCiAJLyogV2Ugc3RlYWwgdGhlIGNhbGxlcidzIHBlZXIgcmVmLiAqLwpAQCAtMTU2LDYgKzIyOCw5IEBACiAJcnhycGNfZ2V0X2xvY2FsKGNvbm4tPnBhcmFtcy5sb2NhbCk7CiAJa2V5X2dldChjb25uLT5wYXJhbXMua2V5KTsKIAorCXRyYWNlX3J4cnBjX2Nvbm4oY29ubiwgcnhycGNfY29ubl9uZXdfY2xpZW50LCBhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpLAorCQkJIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIC0xLCByeHJwY19jbGllbnRfYWxsb2MpOwogCV9sZWF2ZSgiID0gJXAiLCBjb25uKTsKIAlyZXR1cm4gY29ubjsKIApAQCAtMTcwLDMyICsyNDUsNjggQEAKIH0KIAogLyoKLSAqIGZpbmQgYSBjb25uZWN0aW9uIGZvciBhIGNhbGwKLSAqIC0gY2FsbGVkIGluIHByb2Nlc3MgY29udGV4dCB3aXRoIElSUXMgZW5hYmxlZAorICogRGV0ZXJtaW5lIGlmIGEgY29ubmVjdGlvbiBtYXkgYmUgcmV1c2VkLgogICovCi1pbnQgcnhycGNfY29ubmVjdF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkgICAgICAgc3RydWN0IHJ4cnBjX2Nvbm5fcGFyYW1ldGVycyAqY3AsCi0JCSAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCwKLQkJICAgICAgIGdmcF90IGdmcCkKK3N0YXRpYyBib29sIHJ4cnBjX21heV9yZXVzZV9jb25uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQoreworCWludCBpZF9jdXJzb3IsIGlkLCBkaXN0YW5jZSwgbGltaXQ7CisKKwlpZiAodGVzdF9iaXQoUlhSUENfQ09OTl9ET05UX1JFVVNFLCAmY29ubi0+ZmxhZ3MpKQorCQlnb3RvIGRvbnRfcmV1c2U7CisKKwlpZiAoY29ubi0+cHJvdG8uZXBvY2ggIT0gcnhycGNfZXBvY2gpCisJCWdvdG8gbWFya19kb250X3JldXNlOworCisJLyogVGhlIElEUiB0cmVlIGdldHMgdmVyeSBleHBlbnNpdmUgb24gbWVtb3J5IGlmIHRoZSBjb25uZWN0aW9uIElEcyBhcmUKKwkgKiB3aWRlbHkgc2NhdHRlcmVkIHRocm91Z2hvdXQgdGhlIG51bWJlciBzcGFjZSwgc28gd2Ugc2hhbGwgd2FudCB0bworCSAqIGtpbGwgb2ZmIGNvbm5lY3Rpb25zIHRoYXQsIHNheSwgaGF2ZSBhbiBJRCBtb3JlIHRoYW4gYWJvdXQgZm91cgorCSAqIHRpbWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjbGllbnQgY29ubnMgYXdheSBmcm9tIHRoZSBjdXJyZW50CisJICogYWxsb2NhdGlvbiBwb2ludCB0byB0cnkgYW5kIGtlZXAgdGhlIElEcyBjb25jZW50cmF0ZWQuCisJICovCisJaWRfY3Vyc29yID0gUkVBRF9PTkNFKHJ4cnBjX2NsaWVudF9jb25uX2lkcy5jdXIpOworCWlkID0gY29ubi0+cHJvdG8uY2lkID4+IFJYUlBDX0NJRFNISUZUOworCWRpc3RhbmNlID0gaWQgLSBpZF9jdXJzb3I7CisJaWYgKGRpc3RhbmNlIDwgMCkKKwkJZGlzdGFuY2UgPSAtZGlzdGFuY2U7CisJbGltaXQgPSByb3VuZF91cChyeHJwY19tYXhfY2xpZW50X2Nvbm5lY3Rpb25zLCBJRFJfU0laRSkgKiA0OworCWlmIChkaXN0YW5jZSA+IGxpbWl0KQorCQlnb3RvIG1hcmtfZG9udF9yZXVzZTsKKworCXJldHVybiB0cnVlOworCittYXJrX2RvbnRfcmV1c2U6CisJc2V0X2JpdChSWFJQQ19DT05OX0RPTlRfUkVVU0UsICZjb25uLT5mbGFncyk7Citkb250X3JldXNlOgorCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIENyZWF0ZSBvciBmaW5kIGEgY2xpZW50IGNvbm5lY3Rpb24gdG8gdXNlIGZvciBhIGNhbGwuCisgKgorICogSWYgd2UgcmV0dXJuIHdpdGggYSBjb25uZWN0aW9uLCB0aGUgY2FsbCB3aWxsIGJlIG9uIGl0cyB3YWl0aW5nIGxpc3QuICBJdCdzCisgKiBsZWZ0IHRvIHRoZSBjYWxsZXIgdG8gYXNzaWduIGEgY2hhbm5lbCBhbmQgd2FrZSB1cCB0aGUgY2FsbC4KKyAqLworc3RhdGljIGludCByeHJwY19nZXRfY2xpZW50X2Nvbm4oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJIHN0cnVjdCByeHJwY19jb25uX3BhcmFtZXRlcnMgKmNwLAorCQkJCSBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCwKKwkJCQkgZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLCAqY2FuZGlkYXRlID0gTlVMTDsKIAlzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsID0gY3AtPmxvY2FsOwogCXN0cnVjdCByYl9ub2RlICpwLCAqKnBwLCAqcGFyZW50OwogCWxvbmcgZGlmZjsKLQlpbnQgY2hhbjsKLQotCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisJaW50IHJldCA9IC1FTk9NRU07CiAKIAlfZW50ZXIoInslZCwlbHh9LCIsIGNhbGwtPmRlYnVnX2lkLCBjYWxsLT51c2VyX2NhbGxfSUQpOwogCiAJY3AtPnBlZXIgPSByeHJwY19sb29rdXBfcGVlcihjcC0+bG9jYWwsIHNyeCwgZ2ZwKTsKIAlpZiAoIWNwLT5wZWVyKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKIAorCS8qIElmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBtZWFudCB0byBiZSBleGNsdXNpdmUsIHNlYXJjaCB0aGUgYXZhaWxhYmxlCisJICogY29ubmVjdGlvbnMgdG8gc2VlIGlmIHRoZSBjb25uZWN0aW9uIHdlIHdhbnQgdG8gdXNlIGFscmVhZHkgZXhpc3RzLgorCSAqLwogCWlmICghY3AtPmV4Y2x1c2l2ZSkgewotCQkvKiBTZWFyY2ggZm9yIGEgZXhpc3RpbmcgY2xpZW50IGNvbm5lY3Rpb24gdW5sZXNzIHRoaXMgaXMgZ29pbmcKLQkJICogdG8gYmUgYSBjb25uZWN0aW9uIHRoYXQncyB1c2VkIGV4Y2x1c2l2ZWx5IGZvciBhIHNpbmdsZSBjYWxsLgotCQkgKi8KIAkJX2RlYnVnKCJzZWFyY2ggMSIpOwogCQlzcGluX2xvY2soJmxvY2FsLT5jbGllbnRfY29ubnNfbG9jayk7CiAJCXAgPSBsb2NhbC0+Y2xpZW50X2Nvbm5zLnJiX25vZGU7CkBAIC0yMDYsMzkgKzMxNyw1NiBAQAogCQkJZGlmZiA9IChjbXAocGVlcikgPzoKIAkJCQljbXAoa2V5KSA/OgogCQkJCWNtcChzZWN1cml0eV9sZXZlbCkpOwotCQkJaWYgKGRpZmYgPCAwKQorI3VuZGVmIGNtcAorCQkJaWYgKGRpZmYgPCAwKSB7CiAJCQkJcCA9IHAtPnJiX2xlZnQ7Ci0JCQllbHNlIGlmIChkaWZmID4gMCkKKwkJCX0gZWxzZSBpZiAoZGlmZiA+IDApIHsKIAkJCQlwID0gcC0+cmJfcmlnaHQ7Ci0JCQllbHNlCi0JCQkJZ290byBmb3VuZF9leHRhbnRfY29ubjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHJ4cnBjX21heV9yZXVzZV9jb25uKGNvbm4pICYmCisJCQkJICAgIHJ4cnBjX2dldF9jb25uZWN0aW9uX21heWJlKGNvbm4pKQorCQkJCQlnb3RvIGZvdW5kX2V4dGFudF9jb25uOworCQkJCS8qIFRoZSBjb25uZWN0aW9uIG5lZWRzIHJlcGxhY2luZy4gIEl0J3MgYmV0dGVyCisJCQkJICogdG8gZWZmZWN0IHRoYXQgd2hlbiB3ZSBoYXZlIHNvbWV0aGluZyB0bworCQkJCSAqIHJlcGxhY2UgaXQgd2l0aCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8KKwkJCQkgKiByZWJhbGFuY2UgdGhlIHRyZWUgdHdpY2UuCisJCQkJICovCisJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAkJc3Bpbl91bmxvY2soJmxvY2FsLT5jbGllbnRfY29ubnNfbG9jayk7CiAJfQogCi0JLyogV2UgZGlkbid0IGZpbmQgYSBjb25uZWN0aW9uIG9yIHdlIHdhbnQgYW4gZXhjbHVzaXZlIG9uZS4gKi8KLQlfZGVidWcoImdldCBuZXcgY29ubiIpOworCS8qIFRoZXJlIHdhc24ndCBhIGNvbm5lY3Rpb24geWV0IG9yIHdlIG5lZWQgYW4gZXhjbHVzaXZlIGNvbm5lY3Rpb24uCisJICogV2UgbmVlZCB0byBjcmVhdGUgYSBjYW5kaWRhdGUgYW5kIHRoZW4gcG90ZW50aWFsbHkgcmVkbyB0aGUgc2VhcmNoCisJICogaW4gY2FzZSB3ZSdyZSByYWNpbmcgd2l0aCBhbm90aGVyIHRocmVhZCBhbHNvIHRyeWluZyB0byBjb25uZWN0IG9uIGEKKwkgKiBzaGFyZWFibGUgY29ubmVjdGlvbi4KKwkgKi8KKwlfZGVidWcoIm5ldyBjb25uIik7CiAJY2FuZGlkYXRlID0gcnhycGNfYWxsb2NfY2xpZW50X2Nvbm5lY3Rpb24oY3AsIGdmcCk7Ci0JaWYgKCFjYW5kaWRhdGUpIHsKLQkJX2xlYXZlKCIgPSAtRU5PTUVNIik7Ci0JCXJldHVybiAtRU5PTUVNOworCWlmIChJU19FUlIoY2FuZGlkYXRlKSkgeworCQlyZXQgPSBQVFJfRVJSKGNhbmRpZGF0ZSk7CisJCWdvdG8gZXJyb3JfcGVlcjsKIAl9CiAKKwkvKiBBZGQgdGhlIGNhbGwgdG8gdGhlIG5ldyBjb25uZWN0aW9uJ3Mgd2FpdGluZyBsaXN0IGluIGNhc2Ugd2UncmUKKwkgKiBnb2luZyB0byBoYXZlIHRvIHdhaXQgZm9yIHRoZSBjb25uZWN0aW9uIHRvIGNvbWUgbGl2ZS4gIEl0J3Mgb3VyCisJICogY29ubmVjdGlvbiwgc28gd2Ugd2FudCBmaXJzdCBkaWJzIG9uIHRoZSBjaGFubmVsIHNsb3RzLiAgV2Ugd291bGQKKwkgKiBub3JtYWxseSBoYXZlIHRvIHRha2UgY2hhbm5lbF9sb2NrIGJ1dCB3ZSBkbyB0aGlzIGJlZm9yZSBhbnlvbmUgZWxzZQorCSAqIGNhbiBzZWUgdGhlIGNvbm5lY3Rpb24uCisJICovCisJbGlzdF9hZGRfdGFpbCgmY2FsbC0+Y2hhbl93YWl0X2xpbmssICZjYW5kaWRhdGUtPndhaXRpbmdfY2FsbHMpOworCiAJaWYgKGNwLT5leGNsdXNpdmUpIHsKLQkJLyogQXNzaWduIHRoZSBjYWxsIG9uIGFuIGV4Y2x1c2l2ZSBjb25uZWN0aW9uIHRvIGNoYW5uZWwgMCBhbmQKLQkJICogZG9uJ3QgYWRkIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBlbmRwb2ludCdzIHNoYXJlYWJsZSBjb25uCi0JCSAqIGxvb2t1cCB0cmVlLgotCQkgKi8KLQkJX2RlYnVnKCJleGNsdXNpdmUgY2hhbiAwIik7Ci0JCWNvbm4gPSBjYW5kaWRhdGU7Ci0JCWF0b21pY19zZXQoJmNvbm4tPmF2YWlsX2NoYW5zLCBSWFJQQ19NQVhDQUxMUyAtIDEpOwotCQlzcGluX2xvY2soJmNvbm4tPmNoYW5uZWxfbG9jayk7Ci0JCWNoYW4gPSAwOwotCQlnb3RvIGZvdW5kX2NoYW5uZWw7CisJCWNhbGwtPmNvbm4gPSBjYW5kaWRhdGU7CisJCWNhbGwtPnNlY3VyaXR5X2l4ID0gY2FuZGlkYXRlLT5zZWN1cml0eV9peDsKKwkJX2xlYXZlKCIgPSAwIFtleGNsdXNpdmUgJWRdIiwgY2FuZGlkYXRlLT5kZWJ1Z19pZCk7CisJCXJldHVybiAwOwogCX0KIAotCS8qIFdlIG5lZWQgdG8gcmVkbyB0aGUgc2VhcmNoIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGFkZCBhIG5ldyBjb25uZWN0aW9uCi0JICogbGVzdCB3ZSByYWNlIHdpdGggc29tZW9uZSBlbHNlIGFkZGluZyBhIGNvbmZsaWN0aW5nIGluc3RhbmNlLgorCS8qIFB1Ymxpc2ggdGhlIG5ldyBjb25uZWN0aW9uIGZvciB1c2Vyc3BhY2UgdG8gZmluZC4gIFdlIG5lZWQgdG8gcmVkbworCSAqIHRoZSBzZWFyY2ggYmVmb3JlIGRvaW5nIHRoaXMgbGVzdCB3ZSByYWNlIHdpdGggc29tZW9uZSBlbHNlIGFkZGluZyBhCisJICogY29uZmxpY3RpbmcgaW5zdGFuY2UuCiAJICovCiAJX2RlYnVnKCJzZWFyY2ggMiIpOwogCXNwaW5fbG9jaygmbG9jYWwtPmNsaWVudF9jb25uc19sb2NrKTsKQEAgLTI0OSwxMjQgKzM3Nyw3MTEgQEAKIAkJcGFyZW50ID0gKnBwOwogCQljb25uID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgY2xpZW50X25vZGUpOwogCisjZGVmaW5lIGNtcChYKSAoKGxvbmcpY29ubi0+cGFyYW1zLlggLSAobG9uZyljYW5kaWRhdGUtPnBhcmFtcy5YKQogCQlkaWZmID0gKGNtcChwZWVyKSA/OgogCQkJY21wKGtleSkgPzoKIAkJCWNtcChzZWN1cml0eV9sZXZlbCkpOwotCQlpZiAoZGlmZiA8IDApCisjdW5kZWYgY21wCisJCWlmIChkaWZmIDwgMCkgewogCQkJcHAgPSAmKCpwcCktPnJiX2xlZnQ7Ci0JCWVsc2UgaWYgKGRpZmYgPiAwKQorCQl9IGVsc2UgaWYgKGRpZmYgPiAwKSB7CiAJCQlwcCA9ICYoKnBwKS0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCWdvdG8gZm91bmRfZXh0YW50X2Nvbm47CisJCX0gZWxzZSB7CisJCQlpZiAocnhycGNfbWF5X3JldXNlX2Nvbm4oY29ubikgJiYKKwkJCSAgICByeHJwY19nZXRfY29ubmVjdGlvbl9tYXliZShjb25uKSkKKwkJCQlnb3RvIGZvdW5kX2V4dGFudF9jb25uOworCQkJLyogVGhlIG9sZCBjb25uZWN0aW9uIGlzIGZyb20gYW4gb3V0ZGF0ZWQgZXBvY2guICovCisJCQlfZGVidWcoInJlcGxhY2UgY29ubiIpOworCQkJY2xlYXJfYml0KFJYUlBDX0NPTk5fSU5fQ0xJRU5UX0NPTk5TLCAmY29ubi0+ZmxhZ3MpOworCQkJcmJfcmVwbGFjZV9ub2RlKCZjb25uLT5jbGllbnRfbm9kZSwKKwkJCQkJJmNhbmRpZGF0ZS0+Y2xpZW50X25vZGUsCisJCQkJCSZsb2NhbC0+Y2xpZW50X2Nvbm5zKTsKKwkJCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCAtMSwgcnhycGNfY2xpZW50X3JlcGxhY2UpOworCQkJZ290byBjYW5kaWRhdGVfcHVibGlzaGVkOworCQl9CiAJfQogCi0JLyogVGhlIHNlY29uZCBzZWFyY2ggYWxzbyBmYWlsZWQ7IHNpbXBseSBhZGQgdGhlIG5ldyBjb25uZWN0aW9uIHdpdGgKLQkgKiB0aGUgbmV3IGNhbGwgaW4gY2hhbm5lbCAwLiAgTm90ZSB0aGF0IHdlIG5lZWQgdG8gdGFrZSB0aGUgY2hhbm5lbAotCSAqIGxvY2sgYmVmb3JlIGRyb3BwaW5nIHRoZSBjbGllbnQgY29ubiBsb2NrLgotCSAqLwogCV9kZWJ1ZygibmV3IGNvbm4iKTsKLQlzZXRfYml0KFJYUlBDX0NPTk5fSU5fQ0xJRU5UX0NPTk5TLCAmY2FuZGlkYXRlLT5mbGFncyk7CiAJcmJfbGlua19ub2RlKCZjYW5kaWRhdGUtPmNsaWVudF9ub2RlLCBwYXJlbnQsIHBwKTsKIAlyYl9pbnNlcnRfY29sb3IoJmNhbmRpZGF0ZS0+Y2xpZW50X25vZGUsICZsb2NhbC0+Y2xpZW50X2Nvbm5zKTsKLWF0dGFjaGVkOgotCWNvbm4gPSBjYW5kaWRhdGU7Ci0JY2FuZGlkYXRlID0gTlVMTDsKIAotCWF0b21pY19zZXQoJmNvbm4tPmF2YWlsX2NoYW5zLCBSWFJQQ19NQVhDQUxMUyAtIDEpOwotCXNwaW5fbG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKK2NhbmRpZGF0ZV9wdWJsaXNoZWQ6CisJc2V0X2JpdChSWFJQQ19DT05OX0lOX0NMSUVOVF9DT05OUywgJmNhbmRpZGF0ZS0+ZmxhZ3MpOworCWNhbGwtPmNvbm4gPSBjYW5kaWRhdGU7CisJY2FsbC0+c2VjdXJpdHlfaXggPSBjYW5kaWRhdGUtPnNlY3VyaXR5X2l4OwogCXNwaW5fdW5sb2NrKCZsb2NhbC0+Y2xpZW50X2Nvbm5zX2xvY2spOwotCWNoYW4gPSAwOwotCi1mb3VuZF9jaGFubmVsOgotCV9kZWJ1ZygiZm91bmQgY2hhbiIpOwotCWNhbGwtPmNvbm4JPSBjb25uOwotCWNhbGwtPmNoYW5uZWwJPSBjaGFuOwotCWNhbGwtPmVwb2NoCT0gY29ubi0+cHJvdG8uZXBvY2g7Ci0JY2FsbC0+Y2lkCT0gY29ubi0+cHJvdG8uY2lkIHwgY2hhbjsKLQljYWxsLT5jYWxsX2lkCT0gKytjb25uLT5jaGFubmVsc1tjaGFuXS5jYWxsX2NvdW50ZXI7Ci0JY29ubi0+Y2hhbm5lbHNbY2hhbl0uY2FsbF9pZCA9IGNhbGwtPmNhbGxfaWQ7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGNvbm4tPmNoYW5uZWxzW2NoYW5dLmNhbGwsIGNhbGwpOwotCi0JX25ldCgiQ09OTkVDVCBjYWxsICVkIG9uIGNvbm4gJWQiLCBjYWxsLT5kZWJ1Z19pZCwgY29ubi0+ZGVidWdfaWQpOwotCi0Jc3Bpbl91bmxvY2soJmNvbm4tPmNoYW5uZWxfbG9jayk7Ci0JcnhycGNfcHV0X3BlZXIoY3AtPnBlZXIpOwotCWNwLT5wZWVyID0gTlVMTDsKLQlfbGVhdmUoIiA9ICVwIHt1PSVkfSIsIGNvbm4sIGF0b21pY19yZWFkKCZjb25uLT51c2FnZSkpOworCV9sZWF2ZSgiID0gMCBbbmV3ICVkXSIsIGNhbmRpZGF0ZS0+ZGVidWdfaWQpOwogCXJldHVybiAwOwogCi0JLyogV2UgZm91bmQgYSBwb3RlbnRpYWxseSBzdWl0YWJsZSBjb25uZWN0aW9uIGFscmVhZHkgaW4gZXhpc3RlbmNlLiAgSWYKLQkgKiB3ZSBjYW4gcmV1c2UgaXQgKGllLiBpdHMgdXNhZ2UgY291bnQgaGFzbid0IGJlZW4gcmVkdWNlZCB0byAwIGJ5IHRoZQotCSAqIHJlYXBlciksIGRpc2NhcmQgYW55IGNhbmRpZGF0ZSB3ZSBtYXkgaGF2ZSBhbGxvY2F0ZWQsIGFuZCB0cnkgdG8gZ2V0Ci0JICogYSBjaGFubmVsIG9uIHRoaXMgb25lLCBvdGhlcndpc2Ugd2UgaGF2ZSB0byByZXBsYWNlIGl0LgorCS8qIFdlIGNvbWUgaGVyZSBpZiB3ZSBmb3VuZCBhIHN1aXRhYmxlIGNvbm5lY3Rpb24gYWxyZWFkeSBpbiBleGlzdGVuY2UuCisJICogRGlzY2FyZCBhbnkgY2FuZGlkYXRlIHdlIG1heSBoYXZlIGFsbG9jYXRlZCwgYW5kIHRyeSB0byBnZXQgYQorCSAqIGNoYW5uZWwgb24gdGhpcyBvbmUuCiAJICovCiBmb3VuZF9leHRhbnRfY29ubjoKIAlfZGVidWcoImZvdW5kIGNvbm4iKTsKLQlpZiAoIXJ4cnBjX2dldF9jb25uZWN0aW9uX21heWJlKGNvbm4pKSB7Ci0JCXNldF9iaXQoUlhSUENfQ09OTl9JTl9DTElFTlRfQ09OTlMsICZjYW5kaWRhdGUtPmZsYWdzKTsKLQkJcmJfcmVwbGFjZV9ub2RlKCZjb25uLT5jbGllbnRfbm9kZSwKLQkJCQkmY2FuZGlkYXRlLT5jbGllbnRfbm9kZSwKLQkJCQkmbG9jYWwtPmNsaWVudF9jb25ucyk7Ci0JCWNsZWFyX2JpdChSWFJQQ19DT05OX0lOX0NMSUVOVF9DT05OUywgJmNvbm4tPmZsYWdzKTsKLQkJZ290byBhdHRhY2hlZDsKLQl9Ci0KIAlzcGluX3VubG9jaygmbG9jYWwtPmNsaWVudF9jb25uc19sb2NrKTsKIAotCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNhbmRpZGF0ZSk7Ci0KLQlpZiAoIWF0b21pY19hZGRfdW5sZXNzKCZjb25uLT5hdmFpbF9jaGFucywgLTEsIDApKSB7Ci0JCWlmICghZ2ZwZmxhZ3NfYWxsb3dfYmxvY2tpbmcoZ2ZwKSkgewotCQkJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7Ci0JCQlfbGVhdmUoIiA9IC1FQUdBSU4iKTsKLQkJCXJldHVybiAtRUFHQUlOOwotCQl9Ci0KLQkJYWRkX3dhaXRfcXVldWUoJmNvbm4tPmNoYW5uZWxfd3EsICZteXNlbGYpOwotCQlmb3IgKDs7KSB7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJaWYgKGF0b21pY19hZGRfdW5sZXNzKCZjb25uLT5hdmFpbF9jaGFucywgLTEsIDApKQotCQkJCWJyZWFrOwotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCWdvdG8gaW50ZXJydXB0ZWQ7Ci0JCQlzY2hlZHVsZSgpOwotCQl9Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKCZjb25uLT5jaGFubmVsX3dxLCAmbXlzZWxmKTsKLQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCWlmIChjYW5kaWRhdGUpIHsKKwkJdHJhY2VfcnhycGNfY2xpZW50KGNhbmRpZGF0ZSwgLTEsIHJ4cnBjX2NsaWVudF9kdXBsaWNhdGUpOworCQlyeHJwY19wdXRfY29ubmVjdGlvbihjYW5kaWRhdGUpOworCQljYW5kaWRhdGUgPSBOVUxMOwogCX0KIAotCS8qIFRoZSBjb25uZWN0aW9uIGFsbGVnZWRseSBub3cgaGFzIGEgZnJlZSBjaGFubmVsIGFuZCB3ZSBjYW4gbm93Ci0JICogYXR0YWNoIHRoZSBjYWxsIHRvIGl0LgotCSAqLwogCXNwaW5fbG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKKwljYWxsLT5jb25uID0gY29ubjsKKwljYWxsLT5zZWN1cml0eV9peCA9IGNvbm4tPnNlY3VyaXR5X2l4OworCWxpc3RfYWRkKCZjYWxsLT5jaGFuX3dhaXRfbGluaywgJmNvbm4tPndhaXRpbmdfY2FsbHMpOworCXNwaW5fdW5sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOworCV9sZWF2ZSgiID0gMCBbZXh0YW50ICVkXSIsIGNvbm4tPmRlYnVnX2lkKTsKKwlyZXR1cm4gMDsKIAotCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBSWFJQQ19NQVhDQUxMUzsgY2hhbisrKQotCQlpZiAoIWNvbm4tPmNoYW5uZWxzW2NoYW5dLmNhbGwpCi0JCQlnb3RvIGZvdW5kX2NoYW5uZWw7Ci0JQlVHKCk7Ci0KLWludGVycnVwdGVkOgotCXJlbW92ZV93YWl0X3F1ZXVlKCZjb25uLT5jaGFubmVsX3dxLCAmbXlzZWxmKTsKLQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7CitlcnJvcl9wZWVyOgogCXJ4cnBjX3B1dF9wZWVyKGNwLT5wZWVyKTsKIAljcC0+cGVlciA9IE5VTEw7Ci0JX2xlYXZlKCIgPSAtRVJFU1RBUlRTWVMiKTsKLQlyZXR1cm4gLUVSRVNUQVJUU1lTOworZXJyb3I6CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKLSAqIFJlbW92ZSBhIGNsaWVudCBjb25uZWN0aW9uIGZyb20gdGhlIGxvY2FsIGVuZHBvaW50J3MgdHJlZSwgdGhlcmVieSByZW1vdmluZwotICogaXQgYXMgYSB0YXJnZXQgZm9yIHJldXNlIGZvciBuZXcgY2xpZW50IGNhbGxzLgorICogQWN0aXZhdGUgYSBjb25uZWN0aW9uLgogICovCi12b2lkIHJ4cnBjX3VucHVibGlzaF9jbGllbnRfY29ubihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3N0YXRpYyB2b2lkIHJ4cnBjX2FjdGl2YXRlX2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCiB7Ci0Jc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCA9IGNvbm4tPnBhcmFtcy5sb2NhbDsKKwl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgLTEsIHJ4cnBjX2NsaWVudF90b19hY3RpdmUpOworCWNvbm4tPmNhY2hlX3N0YXRlID0gUlhSUENfQ09OTl9DTElFTlRfQUNUSVZFOworCXJ4cnBjX25yX2FjdGl2ZV9jbGllbnRfY29ubnMrKzsKKwlsaXN0X21vdmVfdGFpbCgmY29ubi0+Y2FjaGVfbGluaywgJnJ4cnBjX2FjdGl2ZV9jbGllbnRfY29ubnMpOworfQogCi0Jc3Bpbl9sb2NrKCZsb2NhbC0+Y2xpZW50X2Nvbm5zX2xvY2spOwotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlhSUENfQ09OTl9JTl9DTElFTlRfQ09OTlMsICZjb25uLT5mbGFncykpCi0JCXJiX2VyYXNlKCZjb25uLT5jbGllbnRfbm9kZSwgJmxvY2FsLT5jbGllbnRfY29ubnMpOwotCXNwaW5fdW5sb2NrKCZsb2NhbC0+Y2xpZW50X2Nvbm5zX2xvY2spOworLyoKKyAqIEF0dGVtcHQgdG8gYW5pbWF0ZSBhIGNvbm5lY3Rpb24gZm9yIGEgbmV3IGNhbGwuCisgKgorICogSWYgaXQncyBub3QgZXhjbHVzaXZlLCB0aGUgY29ubmVjdGlvbiBpcyBpbiB0aGUgZW5kcG9pbnQgdHJlZSwgYW5kIHdlJ3JlIGluCisgKiB0aGUgY29ubidzIGxpc3Qgb2YgdGhvc2Ugd2FpdGluZyB0byBncmFiIGEgY2hhbm5lbC4gIFRoZXJlIGlzLCBob3dldmVyLCBhCisgKiBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGxpdmUgY29ubmVjdGlvbnMgYWxsb3dlZCBhdCBhbnkgb25lIHRpbWUsIHNvIHdlIG1heQorICogaGF2ZSB0byB3YWl0IGZvciBjYXBhY2l0eSB0byBiZWNvbWUgYXZhaWxhYmxlLgorICoKKyAqIE5vdGUgdGhhdCBhIGNvbm5lY3Rpb24gb24gdGhlIHdhaXRpbmcgcXVldWUgbWlnaHQgKmFsc28qIGhhdmUgYWN0aXZlCisgKiBjaGFubmVscyBpZiBpdCBoYXMgYmVlbiBjdWxsZWQgdG8gbWFrZSBzcGFjZSBhbmQgdGhlbiByZS1yZXF1ZXN0ZWQgYnkgYSBuZXcKKyAqIGNhbGwuCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2FuaW1hdGVfY2xpZW50X2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJdW5zaWduZWQgaW50IG5yX2Nvbm5zOworCisJX2VudGVyKCIlZCwlZCIsIGNvbm4tPmRlYnVnX2lkLCBjb25uLT5jYWNoZV9zdGF0ZSk7CisKKwlpZiAoY29ubi0+Y2FjaGVfc3RhdGUgPT0gUlhSUENfQ09OTl9DTElFTlRfQUNUSVZFKQorCQlnb3RvIG91dDsKKworCXNwaW5fbG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisKKwlucl9jb25ucyA9IHJ4cnBjX25yX2NsaWVudF9jb25uczsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ09OTl9DT1VOVEVELCAmY29ubi0+ZmxhZ3MpKSB7CisJCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCAtMSwgcnhycGNfY2xpZW50X2NvdW50KTsKKwkJcnhycGNfbnJfY2xpZW50X2Nvbm5zID0gbnJfY29ubnMgKyAxOworCX0KKworCXN3aXRjaCAoY29ubi0+Y2FjaGVfc3RhdGUpIHsKKwljYXNlIFJYUlBDX0NPTk5fQ0xJRU5UX0FDVElWRToKKwljYXNlIFJYUlBDX0NPTk5fQ0xJRU5UX1dBSVRJTkc6CisJCWJyZWFrOworCisJY2FzZSBSWFJQQ19DT05OX0NMSUVOVF9JTkFDVElWRToKKwljYXNlIFJYUlBDX0NPTk5fQ0xJRU5UX0NVTExFRDoKKwljYXNlIFJYUlBDX0NPTk5fQ0xJRU5UX0lETEU6CisJCWlmIChucl9jb25ucyA+PSByeHJwY19tYXhfY2xpZW50X2Nvbm5lY3Rpb25zKQorCQkJZ290byB3YWl0X2Zvcl9jYXBhY2l0eTsKKwkJZ290byBhY3RpdmF0ZV9jb25uOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCitvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrKCZyeHJwY19jbGllbnRfY29ubl9jYWNoZV9sb2NrKTsKK291dDoKKwlfbGVhdmUoIiBbJWRdIiwgY29ubi0+Y2FjaGVfc3RhdGUpOworCXJldHVybjsKKworYWN0aXZhdGVfY29ubjoKKwlfZGVidWcoImFjdGl2YXRlIik7CisJcnhycGNfYWN0aXZhdGVfY29ubihjb25uKTsKKwlnb3RvIG91dF91bmxvY2s7CisKK3dhaXRfZm9yX2NhcGFjaXR5OgorCV9kZWJ1Zygid2FpdCIpOworCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCAtMSwgcnhycGNfY2xpZW50X3RvX3dhaXRpbmcpOworCWNvbm4tPmNhY2hlX3N0YXRlID0gUlhSUENfQ09OTl9DTElFTlRfV0FJVElORzsKKwlsaXN0X21vdmVfdGFpbCgmY29ubi0+Y2FjaGVfbGluaywgJnJ4cnBjX3dhaXRpbmdfY2xpZW50X2Nvbm5zKTsKKwlnb3RvIG91dF91bmxvY2s7Cit9CisKKy8qCisgKiBEZWFjdGl2YXRlIGEgY2hhbm5lbC4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfZGVhY3RpdmF0ZV9vbmVfY2hhbm5lbChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJCQkJIHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXN0cnVjdCByeHJwY19jaGFubmVsICpjaGFuID0gJmNvbm4tPmNoYW5uZWxzW2NoYW5uZWxdOworCisJcmN1X2Fzc2lnbl9wb2ludGVyKGNoYW4tPmNhbGwsIE5VTEwpOworCWNvbm4tPmFjdGl2ZV9jaGFucyAmPSB+KDEgPDwgY2hhbm5lbCk7Cit9CisKKy8qCisgKiBBc3NpZ24gYSBjaGFubmVsIHRvIHRoZSBjYWxsIGF0IHRoZSBmcm9udCBvZiB0aGUgcXVldWUgYW5kIHdha2UgdGhlIGNhbGwgdXAuCisgKiBXZSBkb24ndCBpbmNyZW1lbnQgdGhlIGNhbGxOdW1iZXIgY291bnRlciB1bnRpbCB0aGlzIG51bWJlciBoYXMgYmVlbiBleHBvc2VkCisgKiB0byB0aGUgd29ybGQuCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2FjdGl2YXRlX29uZV9jaGFubmVsKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgcnhycGNfY2hhbm5lbCAqY2hhbiA9ICZjb25uLT5jaGFubmVsc1tjaGFubmVsXTsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IGxpc3RfZW50cnkoY29ubi0+d2FpdGluZ19jYWxscy5uZXh0LAorCQkJCQkgICAgIHN0cnVjdCByeHJwY19jYWxsLCBjaGFuX3dhaXRfbGluayk7CisJdTMyIGNhbGxfaWQgPSBjaGFuLT5jYWxsX2NvdW50ZXIgKyAxOworCisJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIGNoYW5uZWwsIHJ4cnBjX2NsaWVudF9jaGFuX2FjdGl2YXRlKTsKKworCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUOworCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisKKwlyeHJwY19zZWVfY2FsbChjYWxsKTsKKwlsaXN0X2RlbF9pbml0KCZjYWxsLT5jaGFuX3dhaXRfbGluayk7CisJY29ubi0+YWN0aXZlX2NoYW5zIHw9IDEgPDwgY2hhbm5lbDsKKwljYWxsLT5wZWVyCT0gcnhycGNfZ2V0X3BlZXIoY29ubi0+cGFyYW1zLnBlZXIpOworCWNhbGwtPmNpZAk9IGNvbm4tPnByb3RvLmNpZCB8IGNoYW5uZWw7CisJY2FsbC0+Y2FsbF9pZAk9IGNhbGxfaWQ7CisKKwlfbmV0KCJDT05ORUNUIGNhbGwgJTA4eDolMDh4IGFzIGNhbGwgJWQgb24gY29ubiAlZCIsCisJICAgICBjYWxsLT5jaWQsIGNhbGwtPmNhbGxfaWQsIGNhbGwtPmRlYnVnX2lkLCBjb25uLT5kZWJ1Z19pZCk7CisKKwkvKiBQYWlyZWQgd2l0aCB0aGUgcmVhZCBiYXJyaWVyIGluIHJ4cnBjX3dhaXRfZm9yX2NoYW5uZWwoKS4gIFRoaXMKKwkgKiBvcmRlcnMgY2lkIGFuZCBlcG9jaCBpbiB0aGUgY29ubmVjdGlvbiB3cnQgdG8gY2FsbF9pZCB3aXRob3V0IHRoZQorCSAqIG5lZWQgdG8gdGFrZSB0aGUgY2hhbm5lbF9sb2NrLgorCSAqCisJICogV2UgcHJvdmlzaW9uYWxseSBhc3NpZ24gYSBjYWxsTnVtYmVyIGF0IHRoaXMgcG9pbnQsIGJ1dCB3ZSBkb24ndAorCSAqIGNvbmZpcm0gaXQgdW50aWwgdGhlIGNhbGwgaXMgYWJvdXQgdG8gYmUgZXhwb3NlZC4KKwkgKgorCSAqIFRPRE86IFBhaXIgd2l0aCBhIGJhcnJpZXIgaW4gdGhlIGRhdGFfcmVhZHkgaGFuZGxlciB3aGVuIHRoYXQgbG9va3MKKwkgKiBhdCB0aGUgY2FsbCBJRCB0aHJvdWdoIGEgY29ubmVjdGlvbiBjaGFubmVsLgorCSAqLworCXNtcF93bWIoKTsKKwljaGFuLT5jYWxsX2lkCT0gY2FsbF9pZDsKKwlyY3VfYXNzaWduX3BvaW50ZXIoY2hhbi0+Y2FsbCwgY2FsbCk7CisJd2FrZV91cCgmY2FsbC0+d2FpdHEpOworfQorCisvKgorICogQXNzaWduIGNoYW5uZWxzIGFuZCBjYWxsTnVtYmVycyB0byB3YWl0aW5nIGNhbGxzIHdpdGggY2hhbm5lbF9sb2NrCisgKiBoZWxkIGJ5IGNhbGxlci4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfYWN0aXZhdGVfY2hhbm5lbHNfbG9ja2VkKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQoreworCXU4IGF2YWlsLCBtYXNrOworCisJc3dpdGNoIChjb25uLT5jYWNoZV9zdGF0ZSkgeworCWNhc2UgUlhSUENfQ09OTl9DTElFTlRfQUNUSVZFOgorCQltYXNrID0gUlhSUENfQUNUSVZFX0NIQU5TX01BU0s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNvbm4tPndhaXRpbmdfY2FsbHMpICYmCisJICAgICAgIChhdmFpbCA9IH5jb25uLT5hY3RpdmVfY2hhbnMsCisJCWF2YWlsICY9IG1hc2ssCisJCWF2YWlsICE9IDApKQorCQlyeHJwY19hY3RpdmF0ZV9vbmVfY2hhbm5lbChjb25uLCBfX2ZmcyhhdmFpbCkpOworfQorCisvKgorICogQXNzaWduIGNoYW5uZWxzIGFuZCBjYWxsTnVtYmVycyB0byB3YWl0aW5nIGNhbGxzLgorICovCitzdGF0aWMgdm9pZCByeHJwY19hY3RpdmF0ZV9jaGFubmVscyhzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3sKKwlfZW50ZXIoIiVkIiwgY29ubi0+ZGVidWdfaWQpOworCisJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIC0xLCByeHJwY19jbGllbnRfYWN0aXZhdGVfY2hhbnMpOworCisJaWYgKGNvbm4tPmFjdGl2ZV9jaGFucyA9PSBSWFJQQ19BQ1RJVkVfQ0hBTlNfTUFTSykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOworCXJ4cnBjX2FjdGl2YXRlX2NoYW5uZWxzX2xvY2tlZChjb25uKTsKKwlzcGluX3VubG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogV2FpdCBmb3IgYSBjYWxsTnVtYmVyIGFuZCBhIGNoYW5uZWwgdG8gYmUgZ3JhbnRlZCB0byBhIGNhbGwuCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfd2FpdF9mb3JfY2hhbm5lbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgZ2ZwX3QgZ2ZwKQoreworCWludCByZXQgPSAwOworCisJX2VudGVyKCIlZCIsIGNhbGwtPmRlYnVnX2lkKTsKKworCWlmICghY2FsbC0+Y2FsbF9pZCkgeworCQlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOworCisJCWlmICghZ2ZwZmxhZ3NfYWxsb3dfYmxvY2tpbmcoZ2ZwKSkgeworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJYWRkX3dhaXRfcXVldWVfZXhjbHVzaXZlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisJCWZvciAoOzspIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAoY2FsbC0+Y2FsbF9pZCkKKwkJCQlicmVhazsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNjaGVkdWxlKCk7CisJCX0KKwkJcmVtb3ZlX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCX0KKworCS8qIFBhaXJlZCB3aXRoIHRoZSB3cml0ZSBiYXJyaWVyIGluIHJ4cnBjX2FjdGl2YXRlX29uZV9jaGFubmVsKCkuICovCisJc21wX3JtYigpOworCitvdXQ6CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGZpbmQgYSBjb25uZWN0aW9uIGZvciBhIGNhbGwKKyAqIC0gY2FsbGVkIGluIHByb2Nlc3MgY29udGV4dCB3aXRoIElSUXMgZW5hYmxlZAorICovCitpbnQgcnhycGNfY29ubmVjdF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkgICAgICAgc3RydWN0IHJ4cnBjX2Nvbm5fcGFyYW1ldGVycyAqY3AsCisJCSAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCwKKwkJICAgICAgIGdmcF90IGdmcCkKK3sKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JWQsJWx4fSwiLCBjYWxsLT5kZWJ1Z19pZCwgY2FsbC0+dXNlcl9jYWxsX0lEKTsKKworCXJ4cnBjX2Rpc2NhcmRfZXhwaXJlZF9jbGllbnRfY29ubnMoTlVMTCk7CisJcnhycGNfY3VsbF9hY3RpdmVfY2xpZW50X2Nvbm5zKCk7CisKKwlyZXQgPSByeHJwY19nZXRfY2xpZW50X2Nvbm4oY2FsbCwgY3AsIHNyeCwgZ2ZwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJ4cnBjX2FuaW1hdGVfY2xpZW50X2Nvbm4oY2FsbC0+Y29ubik7CisJcnhycGNfYWN0aXZhdGVfY2hhbm5lbHMoY2FsbC0+Y29ubik7CisKKwlyZXQgPSByeHJwY193YWl0X2Zvcl9jaGFubmVsKGNhbGwsIGdmcCk7CisJaWYgKHJldCA8IDApCisJCXJ4cnBjX2Rpc2Nvbm5lY3RfY2xpZW50X2NhbGwoY2FsbCk7CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTm90ZSB0aGF0IGEgY29ubmVjdGlvbiBpcyBhYm91dCB0byBiZSBleHBvc2VkIHRvIHRoZSB3b3JsZC4gIE9uY2UgaXQgaXMKKyAqIGV4cG9zZWQsIHdlIG1haW50YWluIGFuIGV4dHJhIHJlZiBvbiBpdCB0aGF0IHN0b3BzIGl0IGZyb20gYmVpbmcgc3VtbWFyaWx5CisgKiBkaXNjYXJkZWQgYmVmb3JlIGl0J3MgKGEpIGhhZCBhIGNoYW5jZSB0byBkZWFsIHdpdGggcmV0cmFuc21pc3Npb24gYW5kIChiKQorICogaGFkIGEgY2hhbmNlIGF0IHJlLXVzZSAodGhlIHBlci1jb25uZWN0aW9uIHNlY3VyaXR5IG5lZ290aWF0aW9uIGlzCisgKiBleHBlbnNpdmUpLgorICovCitzdGF0aWMgdm9pZCByeHJwY19leHBvc2VfY2xpZW50X2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ09OTl9FWFBPU0VELCAmY29ubi0+ZmxhZ3MpKSB7CisJCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCBjaGFubmVsLCByeHJwY19jbGllbnRfZXhwb3NlZCk7CisJCXJ4cnBjX2dldF9jb25uZWN0aW9uKGNvbm4pOworCX0KK30KKworLyoKKyAqIE5vdGUgdGhhdCBhIGNhbGwsIGFuZCB0aHVzIGEgY29ubmVjdGlvbiwgaXMgYWJvdXQgdG8gYmUgZXhwb3NlZCB0byB0aGUKKyAqIHdvcmxkLgorICovCit2b2lkIHJ4cnBjX2V4cG9zZV9jbGllbnRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbCA9IGNhbGwtPmNpZCAmIFJYUlBDX0NIQU5ORUxNQVNLOworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gY2FsbC0+Y29ubjsKKwlzdHJ1Y3QgcnhycGNfY2hhbm5lbCAqY2hhbiA9ICZjb25uLT5jaGFubmVsc1tjaGFubmVsXTsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VYUE9TRUQsICZjYWxsLT5mbGFncykpIHsKKwkJLyogTWFyayB0aGUgY2FsbCBJRCBhcyBiZWluZyB1c2VkLiAgSWYgdGhlIGNhbGxOdW1iZXIgY291bnRlcgorCQkgKiBleGNlZWRzIH4yIGJpbGxpb24sIHdlIGtpbGwgdGhlIGNvbm5lY3Rpb24gYWZ0ZXIgaXRzCisJCSAqIG91dHN0YW5kaW5nIGNhbGxzIGhhdmUgZmluaXNoZWQgc28gdGhhdCB0aGUgY291bnRlciBkb2Vzbid0CisJCSAqIHdyYXAuCisJCSAqLworCQljaGFuLT5jYWxsX2NvdW50ZXIrKzsKKwkJaWYgKGNoYW4tPmNhbGxfY291bnRlciA+PSBJTlRfTUFYKQorCQkJc2V0X2JpdChSWFJQQ19DT05OX0RPTlRfUkVVU0UsICZjb25uLT5mbGFncyk7CisJCXJ4cnBjX2V4cG9zZV9jbGllbnRfY29ubihjb25uLCBjaGFubmVsKTsKKwl9Cit9CisKKy8qCisgKiBEaXNjb25uZWN0IGEgY2xpZW50IGNhbGwuCisgKi8KK3ZvaWQgcnhycGNfZGlzY29ubmVjdF9jbGllbnRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbCA9IGNhbGwtPmNpZCAmIFJYUlBDX0NIQU5ORUxNQVNLOworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gY2FsbC0+Y29ubjsKKwlzdHJ1Y3QgcnhycGNfY2hhbm5lbCAqY2hhbiA9ICZjb25uLT5jaGFubmVsc1tjaGFubmVsXTsKKworCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCBjaGFubmVsLCByeHJwY19jbGllbnRfY2hhbl9kaXNjb25uZWN0KTsKKwljYWxsLT5jb25uID0gTlVMTDsKKworCXNwaW5fbG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKKworCS8qIENhbGxzIHRoYXQgaGF2ZSBuZXZlciBhY3R1YWxseSBiZWVuIGFzc2lnbmVkIGEgY2hhbm5lbCBjYW4gc2ltcGx5IGJlCisJICogZGlzY2FyZGVkLiAgSWYgdGhlIGNvbm4gZGlkbid0IGdldCB1c2VkIGVpdGhlciwgaXQgd2lsbCBmb2xsb3cKKwkgKiBpbW1lZGlhdGVseSB1bmxlc3Mgc29tZW9uZSBlbHNlIGdyYWJzIGl0IGluIHRoZSBtZWFudGltZS4KKwkgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmNhbGwtPmNoYW5fd2FpdF9saW5rKSkgeworCQlfZGVidWcoImNhbGwgaXMgd2FpdGluZyIpOworCQlBU1NFUlRDTVAoY2FsbC0+Y2FsbF9pZCwgPT0sIDApOworCQlBU1NFUlQoIXRlc3RfYml0KFJYUlBDX0NBTExfRVhQT1NFRCwgJmNhbGwtPmZsYWdzKSk7CisJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmNoYW5fd2FpdF9saW5rKTsKKworCQl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgY2hhbm5lbCwgcnhycGNfY2xpZW50X2NoYW5fdW5zdGFydGVkKTsKKworCQkvKiBXZSBtdXN0IGRlYWN0aXZhdGUgb3IgaWRsZSB0aGUgY29ubmVjdGlvbiBpZiBpdCdzIG5vdworCQkgKiB3YWl0aW5nIGZvciBub3RoaW5nLgorCQkgKi8KKwkJc3Bpbl9sb2NrKCZyeHJwY19jbGllbnRfY29ubl9jYWNoZV9sb2NrKTsKKwkJaWYgKGNvbm4tPmNhY2hlX3N0YXRlID09IFJYUlBDX0NPTk5fQ0xJRU5UX1dBSVRJTkcgJiYKKwkJICAgIGxpc3RfZW1wdHkoJmNvbm4tPndhaXRpbmdfY2FsbHMpICYmCisJCSAgICAhY29ubi0+YWN0aXZlX2NoYW5zKQorCQkJZ290byBpZGxlX2Nvbm5lY3Rpb247CisJCWdvdG8gb3V0OworCX0KKworCUFTU0VSVENNUChyY3VfYWNjZXNzX3BvaW50ZXIoY2hhbi0+Y2FsbCksID09LCBjYWxsKTsKKworCS8qIElmIGEgY2xpZW50IGNhbGwgd2FzIGV4cG9zZWQgdG8gdGhlIHdvcmxkLCB3ZSBzYXZlIHRoZSByZXN1bHQgZm9yCisJICogcmV0cmFuc21pc3Npb24uCisJICoKKwkgKiBXZSB1c2UgYSBiYXJyaWVyIGhlcmUgc28gdGhhdCB0aGUgY2FsbCBudW1iZXIgYW5kIGFib3J0IGNvZGUgY2FuIGJlCisJICogcmVhZCB3aXRob3V0IG5lZWRpbmcgdG8gdGFrZSBhIGxvY2suCisJICoKKwkgKiBUT0RPOiBNYWtlIHRoZSBpbmNvbWluZyBwYWNrZXQgaGFuZGxlciBjaGVjayB0aGlzIGFuZCBoYW5kbGUKKwkgKiB0ZXJtaW5hbCByZXRyYW5zbWlzc2lvbiB3aXRob3V0IHJlcXVpcmluZyBhY2Nlc3MgdG8gdGhlIGNhbGwuCisJICovCisJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfRVhQT1NFRCwgJmNhbGwtPmZsYWdzKSkgeworCQlfZGVidWcoImV4cG9zZWQgJXUsJXUiLCBjYWxsLT5jYWxsX2lkLCBjYWxsLT5hYm9ydF9jb2RlKTsKKwkJX19yeHJwY19kaXNjb25uZWN0X2NhbGwoY29ubiwgY2FsbCk7CisJfQorCisJLyogU2VlIGlmIHdlIGNhbiBwYXNzIHRoZSBjaGFubmVsIGRpcmVjdGx5IHRvIGFub3RoZXIgY2FsbC4gKi8KKwlpZiAoY29ubi0+Y2FjaGVfc3RhdGUgPT0gUlhSUENfQ09OTl9DTElFTlRfQUNUSVZFICYmCisJICAgICFsaXN0X2VtcHR5KCZjb25uLT53YWl0aW5nX2NhbGxzKSkgeworCQl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgY2hhbm5lbCwgcnhycGNfY2xpZW50X2NoYW5fcGFzcyk7CisJCXJ4cnBjX2FjdGl2YXRlX29uZV9jaGFubmVsKGNvbm4sIGNoYW5uZWwpOworCQlnb3RvIG91dF8yOworCX0KKworCS8qIFRoaW5ncyBhcmUgbW9yZSBjb21wbGV4IGFuZCB3ZSBuZWVkIHRoZSBjYWNoZSBsb2NrLiAgV2UgbWlnaHQgYmUKKwkgKiBhYmxlIHRvIHNpbXBseSBpZGxlIHRoZSBjb25uIG9yIGl0IG1pZ2h0IG5vdyBiZSBsdXJraW5nIG9uIHRoZSB3YWl0CisJICogbGlzdC4gIEl0IG1pZ2h0IGV2ZW4gZ2V0IG1vdmVkIGJhY2sgdG8gdGhlIGFjdGl2ZSBsaXN0IHdoaWxzdCB3ZSdyZQorCSAqIHdhaXRpbmcgZm9yIHRoZSBsb2NrLgorCSAqLworCXNwaW5fbG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisKKwlzd2l0Y2ggKGNvbm4tPmNhY2hlX3N0YXRlKSB7CisJY2FzZSBSWFJQQ19DT05OX0NMSUVOVF9BQ1RJVkU6CisJCWlmIChsaXN0X2VtcHR5KCZjb25uLT53YWl0aW5nX2NhbGxzKSkgeworCQkJcnhycGNfZGVhY3RpdmF0ZV9vbmVfY2hhbm5lbChjb25uLCBjaGFubmVsKTsKKwkJCWlmICghY29ubi0+YWN0aXZlX2NoYW5zKSB7CisJCQkJcnhycGNfbnJfYWN0aXZlX2NsaWVudF9jb25ucy0tOworCQkJCWdvdG8gaWRsZV9jb25uZWN0aW9uOworCQkJfQorCQkJZ290byBvdXQ7CisJCX0KKworCQl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgY2hhbm5lbCwgcnhycGNfY2xpZW50X2NoYW5fcGFzcyk7CisJCXJ4cnBjX2FjdGl2YXRlX29uZV9jaGFubmVsKGNvbm4sIGNoYW5uZWwpOworCQlnb3RvIG91dDsKKworCWNhc2UgUlhSUENfQ09OTl9DTElFTlRfQ1VMTEVEOgorCQlyeHJwY19kZWFjdGl2YXRlX29uZV9jaGFubmVsKGNvbm4sIGNoYW5uZWwpOworCQlBU1NFUlQobGlzdF9lbXB0eSgmY29ubi0+d2FpdGluZ19jYWxscykpOworCQlpZiAoIWNvbm4tPmFjdGl2ZV9jaGFucykKKwkJCWdvdG8gaWRsZV9jb25uZWN0aW9uOworCQlnb3RvIG91dDsKKworCWNhc2UgUlhSUENfQ09OTl9DTElFTlRfV0FJVElORzoKKwkJcnhycGNfZGVhY3RpdmF0ZV9vbmVfY2hhbm5lbChjb25uLCBjaGFubmVsKTsKKwkJZ290byBvdXQ7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKK291dDoKKwlzcGluX3VubG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CitvdXRfMjoKKwlzcGluX3VubG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKKwlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKKwlfbGVhdmUoIiIpOworCXJldHVybjsKKworaWRsZV9jb25uZWN0aW9uOgorCS8qIEFzIG5vIGNoYW5uZWxzIHJlbWFpbiBhY3RpdmUsIHRoZSBjb25uZWN0aW9uIGdldHMgZGVhY3RpdmF0ZWQKKwkgKiBpbW1lZGlhdGVseSBvciBtb3ZlZCB0byB0aGUgaWRsZSBsaXN0IGZvciBhIHNob3J0IHdoaWxlLgorCSAqLworCWlmICh0ZXN0X2JpdChSWFJQQ19DT05OX0VYUE9TRUQsICZjb25uLT5mbGFncykpIHsKKwkJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIGNoYW5uZWwsIHJ4cnBjX2NsaWVudF90b19pZGxlKTsKKwkJY29ubi0+aWRsZV90aW1lc3RhbXAgPSBqaWZmaWVzOworCQljb25uLT5jYWNoZV9zdGF0ZSA9IFJYUlBDX0NPTk5fQ0xJRU5UX0lETEU7CisJCWxpc3RfbW92ZV90YWlsKCZjb25uLT5jYWNoZV9saW5rLCAmcnhycGNfaWRsZV9jbGllbnRfY29ubnMpOworCQlpZiAocnhycGNfaWRsZV9jbGllbnRfY29ubnMubmV4dCA9PSAmY29ubi0+Y2FjaGVfbGluayAmJgorCQkgICAgIXJ4cnBjX2tpbGxfYWxsX2NsaWVudF9jb25ucykKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhyeHJwY193b3JrcXVldWUsCisJCQkJCSAgICZyeHJwY19jbGllbnRfY29ubl9yZWFwLAorCQkJCQkgICByeHJwY19jb25uX2lkbGVfY2xpZW50X2V4cGlyeSk7CisJfSBlbHNlIHsKKwkJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIGNoYW5uZWwsIHJ4cnBjX2NsaWVudF90b19pbmFjdGl2ZSk7CisJCWNvbm4tPmNhY2hlX3N0YXRlID0gUlhSUENfQ09OTl9DTElFTlRfSU5BQ1RJVkU7CisJCWxpc3RfZGVsX2luaXQoJmNvbm4tPmNhY2hlX2xpbmspOworCX0KKwlnb3RvIG91dDsKK30KKworLyoKKyAqIENsZWFuIHVwIGEgZGVhZCBjbGllbnQgY29ubmVjdGlvbi4KKyAqLworc3RhdGljIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICoKK3J4cnBjX3B1dF9vbmVfY2xpZW50X2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKm5leHQgPSBOVUxMOworCXN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwgPSBjb25uLT5wYXJhbXMubG9jYWw7CisJdW5zaWduZWQgaW50IG5yX2Nvbm5zOworCisJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIC0xLCByeHJwY19jbGllbnRfY2xlYW51cCk7CisKKwlpZiAodGVzdF9iaXQoUlhSUENfQ09OTl9JTl9DTElFTlRfQ09OTlMsICZjb25uLT5mbGFncykpIHsKKwkJc3Bpbl9sb2NrKCZsb2NhbC0+Y2xpZW50X2Nvbm5zX2xvY2spOworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NPTk5fSU5fQ0xJRU5UX0NPTk5TLAorCQkJCSAgICAgICAmY29ubi0+ZmxhZ3MpKQorCQkJcmJfZXJhc2UoJmNvbm4tPmNsaWVudF9ub2RlLCAmbG9jYWwtPmNsaWVudF9jb25ucyk7CisJCXNwaW5fdW5sb2NrKCZsb2NhbC0+Y2xpZW50X2Nvbm5zX2xvY2spOworCX0KIAogCXJ4cnBjX3B1dF9jbGllbnRfY29ubmVjdGlvbl9pZChjb25uKTsKKworCUFTU0VSVENNUChjb25uLT5jYWNoZV9zdGF0ZSwgPT0sIFJYUlBDX0NPTk5fQ0xJRU5UX0lOQUNUSVZFKTsKKworCWlmICh0ZXN0X2JpdChSWFJQQ19DT05OX0NPVU5URUQsICZjb25uLT5mbGFncykpIHsKKwkJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIC0xLCByeHJwY19jbGllbnRfdW5jb3VudCk7CisJCXNwaW5fbG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisJCW5yX2Nvbm5zID0gLS1yeHJwY19ucl9jbGllbnRfY29ubnM7CisKKwkJaWYgKG5yX2Nvbm5zIDwgcnhycGNfbWF4X2NsaWVudF9jb25uZWN0aW9ucyAmJgorCQkgICAgIWxpc3RfZW1wdHkoJnJ4cnBjX3dhaXRpbmdfY2xpZW50X2Nvbm5zKSkgeworCQkJbmV4dCA9IGxpc3RfZW50cnkocnhycGNfd2FpdGluZ19jbGllbnRfY29ubnMubmV4dCwKKwkJCQkJICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgY2FjaGVfbGluayk7CisJCQlyeHJwY19nZXRfY29ubmVjdGlvbihuZXh0KTsKKwkJCXJ4cnBjX2FjdGl2YXRlX2Nvbm4obmV4dCk7CisJCX0KKworCQlzcGluX3VubG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisJfQorCisJcnhycGNfa2lsbF9jb25uZWN0aW9uKGNvbm4pOworCWlmIChuZXh0KQorCQlyeHJwY19hY3RpdmF0ZV9jaGFubmVscyhuZXh0KTsKKworCS8qIFdlIG5lZWQgdG8gZ2V0IHJpZCBvZiB0aGUgdGVtcG9yYXJ5IHJlZiB3ZSB0b29rIHVwb24gbmV4dCwgYnV0IHdlCisJICogY2FuJ3QgY2FsbCByeHJwY19wdXRfY29ubmVjdGlvbigpIHJlY3Vyc2l2ZWx5LgorCSAqLworCXJldHVybiBuZXh0OworfQorCisvKgorICogQ2xlYW4gdXAgYSBkZWFkIGNsaWVudCBjb25uZWN0aW9ucy4KKyAqLwordm9pZCByeHJwY19wdXRfY2xpZW50X2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpbnQgbjsKKworCWRvIHsKKwkJbiA9IGF0b21pY19kZWNfcmV0dXJuKCZjb25uLT51c2FnZSk7CisJCXRyYWNlX3J4cnBjX2Nvbm4oY29ubiwgcnhycGNfY29ubl9wdXRfY2xpZW50LCBuLCBoZXJlKTsKKwkJaWYgKG4gPiAwKQorCQkJcmV0dXJuOworCQlBU1NFUlRDTVAobiwgPj0sIDApOworCisJCWNvbm4gPSByeHJwY19wdXRfb25lX2NsaWVudF9jb25uKGNvbm4pOworCX0gd2hpbGUgKGNvbm4pOworfQorCisvKgorICogS2lsbCB0aGUgbG9uZ2VzdC1hY3RpdmUgY2xpZW50IGNvbm5lY3Rpb25zIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IG9uZXMuCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2N1bGxfYWN0aXZlX2NsaWVudF9jb25ucyh2b2lkKQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXVuc2lnbmVkIGludCBucl9jb25ucyA9IHJ4cnBjX25yX2NsaWVudF9jb25uczsKKwl1bnNpZ25lZCBpbnQgbnJfYWN0aXZlLCBsaW1pdDsKKworCV9lbnRlcigiIik7CisKKwlBU1NFUlRDTVAobnJfY29ubnMsID49LCAwKTsKKwlpZiAobnJfY29ubnMgPCByeHJwY19tYXhfY2xpZW50X2Nvbm5lY3Rpb25zKSB7CisJCV9sZWF2ZSgiIFtva10iKTsKKwkJcmV0dXJuOworCX0KKwlsaW1pdCA9IHJ4cnBjX3JlYXBfY2xpZW50X2Nvbm5lY3Rpb25zOworCisJc3Bpbl9sb2NrKCZyeHJwY19jbGllbnRfY29ubl9jYWNoZV9sb2NrKTsKKwlucl9hY3RpdmUgPSByeHJwY19ucl9hY3RpdmVfY2xpZW50X2Nvbm5zOworCisJd2hpbGUgKG5yX2FjdGl2ZSA+IGxpbWl0KSB7CisJCUFTU0VSVCghbGlzdF9lbXB0eSgmcnhycGNfYWN0aXZlX2NsaWVudF9jb25ucykpOworCQljb25uID0gbGlzdF9lbnRyeShyeHJwY19hY3RpdmVfY2xpZW50X2Nvbm5zLm5leHQsCisJCQkJICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgY2FjaGVfbGluayk7CisJCUFTU0VSVENNUChjb25uLT5jYWNoZV9zdGF0ZSwgPT0sIFJYUlBDX0NPTk5fQ0xJRU5UX0FDVElWRSk7CisKKwkJaWYgKGxpc3RfZW1wdHkoJmNvbm4tPndhaXRpbmdfY2FsbHMpKSB7CisJCQl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgLTEsIHJ4cnBjX2NsaWVudF90b19jdWxsZWQpOworCQkJY29ubi0+Y2FjaGVfc3RhdGUgPSBSWFJQQ19DT05OX0NMSUVOVF9DVUxMRUQ7CisJCQlsaXN0X2RlbF9pbml0KCZjb25uLT5jYWNoZV9saW5rKTsKKwkJfSBlbHNlIHsKKwkJCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCAtMSwgcnhycGNfY2xpZW50X3RvX3dhaXRpbmcpOworCQkJY29ubi0+Y2FjaGVfc3RhdGUgPSBSWFJQQ19DT05OX0NMSUVOVF9XQUlUSU5HOworCQkJbGlzdF9tb3ZlX3RhaWwoJmNvbm4tPmNhY2hlX2xpbmssCisJCQkJICAgICAgICZyeHJwY193YWl0aW5nX2NsaWVudF9jb25ucyk7CisJCX0KKworCQlucl9hY3RpdmUtLTsKKwl9CisKKwlyeHJwY19ucl9hY3RpdmVfY2xpZW50X2Nvbm5zID0gbnJfYWN0aXZlOworCXNwaW5fdW5sb2NrKCZyeHJwY19jbGllbnRfY29ubl9jYWNoZV9sb2NrKTsKKwlBU1NFUlRDTVAobnJfYWN0aXZlLCA+PSwgMCk7CisJX2xlYXZlKCIgW2N1bGxlZF0iKTsKK30KKworLyoKKyAqIERpc2NhcmQgZXhwaXJlZCBjbGllbnQgY29ubmVjdGlvbnMgZnJvbSB0aGUgaWRsZSBsaXN0LiAgRWFjaCBjb25uIGluIHRoZQorICogaWRsZSBsaXN0IGhhcyBiZWVuIGV4cG9zZWQgYW5kIGhvbGRzIGFuIGV4dHJhIHJlZiBiZWNhdXNlIG9mIHRoYXQuCisgKgorICogVGhpcyBtYXkgYmUgY2FsbGVkIGZyb20gY29ubiBzZXR1cCBvciBmcm9tIGEgd29yayBpdGVtIHNvIGNhbm5vdCBiZQorICogY29uc2lkZXJlZCBub24tcmVlbnRyYW50LgorICovCitzdGF0aWMgdm9pZCByeHJwY19kaXNjYXJkX2V4cGlyZWRfY2xpZW50X2Nvbm5zKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKKwl1bnNpZ25lZCBsb25nIGV4cGlyeSwgY29ubl9leHBpcmVzX2F0LCBub3c7CisJdW5zaWduZWQgaW50IG5yX2Nvbm5zOworCWJvb2wgZGlkX2Rpc2NhcmQgPSBmYWxzZTsKKworCV9lbnRlcigiJWMiLCB3b3JrID8gJ3cnIDogJ24nKTsKKworCWlmIChsaXN0X2VtcHR5KCZyeHJwY19pZGxlX2NsaWVudF9jb25ucykpIHsKKwkJX2xlYXZlKCIgW2VtcHR5XSIpOworCQlyZXR1cm47CisJfQorCisJLyogRG9uJ3QgZG91YmxlIHVwIG9uIHRoZSBkaXNjYXJkaW5nICovCisJaWYgKCFzcGluX3RyeWxvY2soJnJ4cnBjX2NsaWVudF9jb25uX2Rpc2NhcmRfbXV0ZXgpKSB7CisJCV9sZWF2ZSgiIFthbHJlYWR5XSIpOworCQlyZXR1cm47CisJfQorCisJLyogV2Uga2VlcCBhbiBlc3RpbWF0ZSBvZiB3aGF0IHRoZSBudW1iZXIgb2YgY29ubnMgb3VnaHQgdG8gYmUgYWZ0ZXIKKwkgKiB3ZSd2ZSBkaXNjYXJkZWQgc29tZSBzbyB0aGF0IHdlIGRvbid0IG92ZXJkbyB0aGUgZGlzY2FyZGluZy4KKwkgKi8KKwlucl9jb25ucyA9IHJ4cnBjX25yX2NsaWVudF9jb25uczsKKworbmV4dDoKKwlzcGluX2xvY2soJnJ4cnBjX2NsaWVudF9jb25uX2NhY2hlX2xvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJnJ4cnBjX2lkbGVfY2xpZW50X2Nvbm5zKSkKKwkJZ290byBvdXQ7CisKKwljb25uID0gbGlzdF9lbnRyeShyeHJwY19pZGxlX2NsaWVudF9jb25ucy5uZXh0LAorCQkJICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgY2FjaGVfbGluayk7CisJQVNTRVJUKHRlc3RfYml0KFJYUlBDX0NPTk5fRVhQT1NFRCwgJmNvbm4tPmZsYWdzKSk7CisKKwlpZiAoIXJ4cnBjX2tpbGxfYWxsX2NsaWVudF9jb25ucykgeworCQkvKiBJZiB0aGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGlzIG92ZXIgdGhlIHJlYXAgbGltaXQsIHdlCisJCSAqIGV4cGVkaXRlIGRpc2NhcmQgYnkgcmVkdWNpbmcgdGhlIGV4cGlyeSB0aW1lb3V0LiAgV2UgbXVzdCwKKwkJICogaG93ZXZlciwgaGF2ZSBhdCBsZWFzdCBhIHNob3J0IGdyYWNlIHBlcmlvZCB0byBiZSBhYmxlIHRvIGRvCisJCSAqIGZpbmFsLUFDSyBvciBBQk9SVCByZXRyYW5zbWlzc2lvbi4KKwkJICovCisJCWV4cGlyeSA9IHJ4cnBjX2Nvbm5faWRsZV9jbGllbnRfZXhwaXJ5OworCQlpZiAobnJfY29ubnMgPiByeHJwY19yZWFwX2NsaWVudF9jb25uZWN0aW9ucykKKwkJCWV4cGlyeSA9IHJ4cnBjX2Nvbm5faWRsZV9jbGllbnRfZmFzdF9leHBpcnk7CisKKwkJY29ubl9leHBpcmVzX2F0ID0gY29ubi0+aWRsZV90aW1lc3RhbXAgKyBleHBpcnk7CisKKwkJbm93ID0gUkVBRF9PTkNFKGppZmZpZXMpOworCQlpZiAodGltZV9hZnRlcihjb25uX2V4cGlyZXNfYXQsIG5vdykpCisJCQlnb3RvIG5vdF95ZXRfZXhwaXJlZDsKKwl9CisKKwl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgLTEsIHJ4cnBjX2NsaWVudF9kaXNjYXJkKTsKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DT05OX0VYUE9TRUQsICZjb25uLT5mbGFncykpCisJCUJVRygpOworCWNvbm4tPmNhY2hlX3N0YXRlID0gUlhSUENfQ09OTl9DTElFTlRfSU5BQ1RJVkU7CisJbGlzdF9kZWxfaW5pdCgmY29ubi0+Y2FjaGVfbGluayk7CisKKwlzcGluX3VubG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisKKwkvKiBXaGVuIHdlIGNsZWFyZWQgdGhlIEVYUE9TRUQgZmxhZywgd2UgdG9vayBvbiByZXNwb25zaWJpbGl0eSBmb3IgdGhlCisJICogcmVmZXJlbmNlIHRoYXQgdGhhdCBoYWQgb24gdGhlIHVzYWdlIGNvdW50LiAgV2UgZGVhbCB3aXRoIHRoYXQgaGVyZS4KKwkgKiBJZiBzb21lb25lIHJlLXNldHMgdGhlIGZsYWcgYW5kIHJlLWdldHMgdGhlIHJlZiwgdGhhdCdzIGZpbmUuCisJICovCisJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7CisJZGlkX2Rpc2NhcmQgPSB0cnVlOworCW5yX2Nvbm5zLS07CisJZ290byBuZXh0OworCitub3RfeWV0X2V4cGlyZWQ6CisJLyogVGhlIGNvbm5lY3Rpb24gYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZSBoYXNuJ3QgeWV0IGV4cGlyZWQsIHNvCisJICogc2NoZWR1bGUgdGhlIHdvcmsgaXRlbSBmb3IgdGhhdCBwb2ludCBpZiB3ZSBkaXNjYXJkZWQgc29tZXRoaW5nLgorCSAqCisJICogV2UgZG9uJ3Qgd29ycnkgaWYgdGhlIHdvcmsgaXRlbSBpcyBhbHJlYWR5IHNjaGVkdWxlZCAtIGl0IGNhbiBsb29rCisJICogYWZ0ZXIgcmVzY2hlZHVsaW5nIGl0c2VsZiBhdCBhIGxhdGVyIHRpbWUuICBXZSBjb3VsZCBjYW5jZWwgaXQsIGJ1dAorCSAqIHRoZW4gdGhpbmdzIGdldCBtZXNzaWVyLgorCSAqLworCV9kZWJ1Zygibm90IHlldCIpOworCWlmICghcnhycGNfa2lsbF9hbGxfY2xpZW50X2Nvbm5zKQorCQlxdWV1ZV9kZWxheWVkX3dvcmsocnhycGNfd29ya3F1ZXVlLAorCQkJCSAgICZyeHJwY19jbGllbnRfY29ubl9yZWFwLAorCQkJCSAgIGNvbm5fZXhwaXJlc19hdCAtIG5vdyk7CisKK291dDoKKwlzcGluX3VubG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisJc3Bpbl91bmxvY2soJnJ4cnBjX2NsaWVudF9jb25uX2Rpc2NhcmRfbXV0ZXgpOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBQcmVlbXB0aXZlbHkgZGVzdHJveSBhbGwgdGhlIGNsaWVudCBjb25uZWN0aW9uIHJlY29yZHMgcmF0aGVyIHRoYW4gd2FpdGluZworICogZm9yIHRoZW0gdG8gdGltZSBvdXQKKyAqLwordm9pZCBfX2V4aXQgcnhycGNfZGVzdHJveV9hbGxfY2xpZW50X2Nvbm5lY3Rpb25zKHZvaWQpCit7CisJX2VudGVyKCIiKTsKKworCXNwaW5fbG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisJcnhycGNfa2lsbF9hbGxfY2xpZW50X2Nvbm5zID0gdHJ1ZTsKKwlzcGluX3VubG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrKCZyeHJwY19jbGllbnRfY29ubl9yZWFwKTsKKworCWlmICghcXVldWVfZGVsYXllZF93b3JrKHJ4cnBjX3dvcmtxdWV1ZSwgJnJ4cnBjX2NsaWVudF9jb25uX3JlYXAsIDApKQorCQlfZGVidWcoImRlc3Ryb3k6IHF1ZXVlIGZhaWxlZCIpOworCisJX2xlYXZlKCIiKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9jb25uX2V2ZW50LmMgYi9uZXQvcnhycGMvY29ubl9ldmVudC5jCmluZGV4IGNlZTBmMzUuLjNmOWQ4ZDcgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9jb25uX2V2ZW50LmMKKysrIGIvbmV0L3J4cnBjL2Nvbm5fZXZlbnQuYwpAQCAtMTUsMjAgKzE1LDEyOCBAQAogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2VycnF1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9pbjYuaD4KLSNpbmNsdWRlIDxsaW51eC9pY21wLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgogCiAvKgorICogUmV0cmFuc21pdCB0ZXJtaW5hbCBBQ0sgb3IgQUJPUlQgb2YgdGhlIHByZXZpb3VzIGNhbGwuCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2Nvbm5fcmV0cmFuc21pdF9jYWxsKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKwlzdHJ1Y3QgcnhycGNfY2hhbm5lbCAqY2hhbjsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3Y7CisJc3RydWN0IHsKKwkJc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyIHdoZHI7CisJCXVuaW9uIHsKKwkJCXN0cnVjdCB7CisJCQkJX19iZTMyIGNvZGU7CisJCQl9IGFib3J0OworCQkJc3RydWN0IHsKKwkJCQlzdHJ1Y3QgcnhycGNfYWNrcGFja2V0IGFjazsKKwkJCQl1OCBwYWRkaW5nWzNdOworCQkJCXN0cnVjdCByeHJwY19hY2tpbmZvIGluZm87CisJCQl9OworCQl9OworCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgcGt0OworCXNpemVfdCBsZW47CisJdTMyIHNlcmlhbCwgbXR1LCBjYWxsX2lkOworCisJX2VudGVyKCIlZCIsIGNvbm4tPmRlYnVnX2lkKTsKKworCWNoYW4gPSAmY29ubi0+Y2hhbm5lbHNbc3AtPmhkci5jaWQgJiBSWFJQQ19DSEFOTkVMTUFTS107CisKKwkvKiBJZiB0aGUgbGFzdCBjYWxsIGdvdCBtb3ZlZCBvbiB3aGlsc3Qgd2Ugd2VyZSB3YWl0aW5nIHRvIHJ1biwganVzdAorCSAqIGlnbm9yZSB0aGlzIHBhY2tldC4KKwkgKi8KKwljYWxsX2lkID0gUkVBRF9PTkNFKGNoYW4tPmxhc3RfY2FsbCk7CisJLyogU3luYyB3aXRoIF9fcnhycGNfZGlzY29ubmVjdF9jYWxsKCkgKi8KKwlzbXBfcm1iKCk7CisJaWYgKGNhbGxfaWQgIT0gc3AtPmhkci5jYWxsTnVtYmVyKQorCQlyZXR1cm47CisKKwltc2cubXNnX25hbWUJPSAmY29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnQ7CisJbXNnLm1zZ19uYW1lbGVuCT0gY29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnRfbGVuOworCW1zZy5tc2dfY29udHJvbAk9IE5VTEw7CisJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKKwltc2cubXNnX2ZsYWdzCT0gMDsKKworCXBrdC53aGRyLmVwb2NoCQk9IGh0b25sKHNwLT5oZHIuZXBvY2gpOworCXBrdC53aGRyLmNpZAkJPSBodG9ubChzcC0+aGRyLmNpZCk7CisJcGt0LndoZHIuY2FsbE51bWJlcgk9IGh0b25sKHNwLT5oZHIuY2FsbE51bWJlcik7CisJcGt0LndoZHIuc2VxCQk9IDA7CisJcGt0LndoZHIudHlwZQkJPSBjaGFuLT5sYXN0X3R5cGU7CisJcGt0LndoZHIuZmxhZ3MJCT0gY29ubi0+b3V0X2NsaWVudGZsYWc7CisJcGt0LndoZHIudXNlclN0YXR1cwk9IDA7CisJcGt0LndoZHIuc2VjdXJpdHlJbmRleAk9IGNvbm4tPnNlY3VyaXR5X2l4OworCXBrdC53aGRyLl9yc3ZkCQk9IDA7CisJcGt0LndoZHIuc2VydmljZUlkCT0gaHRvbnMoY2hhbi0+bGFzdF9zZXJ2aWNlX2lkKTsKKworCWxlbiA9IHNpemVvZihwa3Qud2hkcik7CisJc3dpdGNoIChjaGFuLT5sYXN0X3R5cGUpIHsKKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOgorCQlwa3QuYWJvcnQuY29kZQk9IGh0b25sKGNoYW4tPmxhc3RfYWJvcnQpOworCQlsZW4gKz0gc2l6ZW9mKHBrdC5hYm9ydCk7CisJCWJyZWFrOworCisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0s6CisJCW10dSA9IGNvbm4tPnBhcmFtcy5wZWVyLT5pZl9tdHU7CisJCW10dSAtPSBjb25uLT5wYXJhbXMucGVlci0+aGRyc2l6ZTsKKwkJcGt0LmFjay5idWZmZXJTcGFjZQk9IDA7CisJCXBrdC5hY2subWF4U2tldwkJPSBodG9ucyhza2ItPnByaW9yaXR5KTsKKwkJcGt0LmFjay5maXJzdFBhY2tldAk9IGh0b25sKGNoYW4tPmxhc3Rfc2VxKTsKKwkJcGt0LmFjay5wcmV2aW91c1BhY2tldAk9IGh0b25sKGNoYW4tPmxhc3Rfc2VxIC0gMSk7CisJCXBrdC5hY2suc2VyaWFsCQk9IGh0b25sKHNwLT5oZHIuc2VyaWFsKTsKKwkJcGt0LmFjay5yZWFzb24JCT0gUlhSUENfQUNLX0RVUExJQ0FURTsKKwkJcGt0LmFjay5uQWNrcwkJPSAwOworCQlwa3QuaW5mby5yeE1UVQkJPSBodG9ubChyeHJwY19yeF9tdHUpOworCQlwa3QuaW5mby5tYXhNVFUJCT0gaHRvbmwobXR1KTsKKwkJcGt0LmluZm8ucndpbmQJCT0gaHRvbmwocnhycGNfcnhfd2luZG93X3NpemUpOworCQlwa3QuaW5mby5qdW1ib19tYXgJPSBodG9ubChyeHJwY19yeF9qdW1ib19tYXgpOworCQlwa3Qud2hkci5mbGFncwkJfD0gUlhSUENfU0xPV19TVEFSVF9PSzsKKwkJbGVuICs9IHNpemVvZihwa3QuYWNrKSArIHNpemVvZihwa3QuaW5mbyk7CisJCWJyZWFrOworCX0KKworCS8qIFJlc3luYyB3aXRoIF9fcnhycGNfZGlzY29ubmVjdF9jYWxsKCkgYW5kIGNoZWNrIHRoYXQgdGhlIGxhc3QgY2FsbAorCSAqIGRpZG4ndCBnZXQgYWR2YW5jZWQgd2hpbHN0IHdlIHdlcmUgZmlsbGluZyBvdXQgdGhlIHBhY2tldHMuCisJICovCisJc21wX3JtYigpOworCWlmIChSRUFEX09OQ0UoY2hhbi0+bGFzdF9jYWxsKSAhPSBjYWxsX2lkKQorCQlyZXR1cm47CisKKwlpb3YuaW92X2Jhc2UJPSAmcGt0OworCWlvdi5pb3ZfbGVuCT0gbGVuOworCisJc2VyaWFsID0gYXRvbWljX2luY19yZXR1cm4oJmNvbm4tPnNlcmlhbCk7CisJcGt0LndoZHIuc2VyaWFsID0gaHRvbmwoc2VyaWFsKTsKKworCXN3aXRjaCAoY2hhbi0+bGFzdF90eXBlKSB7CisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVDoKKwkJX3Byb3RvKCJUeCBBQk9SVCAlJSV1IHsgJWQgfSBbcmVdIiwgc2VyaWFsLCBjb25uLT5sb2NhbF9hYm9ydCk7CisJCWJyZWFrOworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUNLOgorCQl0cmFjZV9yeHJwY190eF9hY2soTlVMTCwgc2VyaWFsLCBjaGFuLT5sYXN0X3NlcSwgMCwKKwkJCQkgICBSWFJQQ19BQ0tfRFVQTElDQVRFLCAwKTsKKwkJX3Byb3RvKCJUeCBBQ0sgJSUldSBbcmVdIiwgc2VyaWFsKTsKKwkJYnJlYWs7CisJfQorCisJa2VybmVsX3NlbmRtc2coY29ubi0+cGFyYW1zLmxvY2FsLT5zb2NrZXQsICZtc2csICZpb3YsIDEsIGxlbik7CisJX2xlYXZlKCIiKTsKKwlyZXR1cm47Cit9CisKKy8qCiAgKiBwYXNzIGEgY29ubmVjdGlvbi1sZXZlbCBhYm9ydCBvbnRvIGFsbCBjYWxscyBvbiB0aGF0IGNvbm5lY3Rpb24KICAqLwotc3RhdGljIHZvaWQgcnhycGNfYWJvcnRfY2FsbHMoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sIGludCBzdGF0ZSwKLQkJCSAgICAgIHUzMiBhYm9ydF9jb2RlKQorc3RhdGljIHZvaWQgcnhycGNfYWJvcnRfY2FsbHMoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkgICAgICBlbnVtIHJ4cnBjX2NhbGxfY29tcGxldGlvbiBjb21wbCwKKwkJCSAgICAgIHUzMiBhYm9ydF9jb2RlLCBpbnQgZXJyb3IpCiB7CiAJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CiAJaW50IGk7CkBAIC00MSwxOSArMTQ5LDE1IEBACiAJCWNhbGwgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKAogCQkJY29ubi0+Y2hhbm5lbHNbaV0uY2FsbCwKIAkJCWxvY2tkZXBfaXNfaGVsZCgmY29ubi0+Y2hhbm5lbF9sb2NrKSk7Ci0JCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCQlpZiAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSkgewotCQkJY2FsbC0+c3RhdGUgPSBzdGF0ZTsKLQkJCWlmIChzdGF0ZSA9PSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRCkgewotCQkJCWNhbGwtPmxvY2FsX2Fib3J0ID0gY29ubi0+bG9jYWxfYWJvcnQ7Ci0JCQkJc2V0X2JpdChSWFJQQ19DQUxMX0VWX0NPTk5fQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCQkJfSBlbHNlIHsKLQkJCQljYWxsLT5yZW1vdGVfYWJvcnQgPSBjb25uLT5yZW1vdGVfYWJvcnQ7Ci0JCQkJc2V0X2JpdChSWFJQQ19DQUxMX0VWX1JDVkRfQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCQkJfQotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJaWYgKGNhbGwpIHsKKwkJCWlmIChjb21wbCA9PSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRCkKKwkJCQl0cmFjZV9yeHJwY19hYm9ydCgiQ09OIiwgY2FsbC0+Y2lkLAorCQkJCQkJICBjYWxsLT5jYWxsX2lkLCAwLAorCQkJCQkJICBhYm9ydF9jb2RlLCBlcnJvcik7CisJCQlpZiAocnhycGNfc2V0X2NhbGxfY29tcGxldGlvbihjYWxsLCBjb21wbCwKKwkJCQkJCSAgICAgIGFib3J0X2NvZGUsIGVycm9yKSkKKwkJCQlyeHJwY19ub3RpZnlfc29ja2V0KGNhbGwpOwogCQl9Ci0JCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CiAJfQogCiAJc3Bpbl91bmxvY2soJmNvbm4tPmNoYW5uZWxfbG9jayk7CkBAIC03OCwxNyArMTgyLDE2IEBACiAKIAkvKiBnZW5lcmF0ZSBhIGNvbm5lY3Rpb24tbGV2ZWwgYWJvcnQgKi8KIAlzcGluX2xvY2tfYmgoJmNvbm4tPnN0YXRlX2xvY2spOwotCWlmIChjb25uLT5zdGF0ZSA8IFJYUlBDX0NPTk5fUkVNT1RFTFlfQUJPUlRFRCkgewotCQljb25uLT5zdGF0ZSA9IFJYUlBDX0NPTk5fTE9DQUxMWV9BQk9SVEVEOwotCQljb25uLT5lcnJvciA9IGVycm9yOwotCQlzcGluX3VubG9ja19iaCgmY29ubi0+c3RhdGVfbG9jayk7Ci0JfSBlbHNlIHsKKwlpZiAoY29ubi0+c3RhdGUgPj0gUlhSUENfQ09OTl9SRU1PVEVMWV9BQk9SVEVEKSB7CiAJCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zdGF0ZV9sb2NrKTsKIAkJX2xlYXZlKCIgPSAwIFthbHJlYWR5IGRlYWRdIik7CiAJCXJldHVybiAwOwogCX0KIAotCXJ4cnBjX2Fib3J0X2NhbGxzKGNvbm4sIFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVELCBhYm9ydF9jb2RlKTsKKwljb25uLT5zdGF0ZSA9IFJYUlBDX0NPTk5fTE9DQUxMWV9BQk9SVEVEOworCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zdGF0ZV9sb2NrKTsKKworCXJ4cnBjX2Fib3J0X2NhbGxzKGNvbm4sIFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVELCBhYm9ydF9jb2RlLCBlcnJvcik7CiAKIAltc2cubXNnX25hbWUJPSAmY29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnQ7CiAJbXNnLm1zZ19uYW1lbGVuCT0gY29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnRfbGVuOwpAQCAtMTMyLDE3ICsyMzUsMTggQEAKIAogLyoKICAqIG1hcmsgYSBjYWxsIGFzIGJlaW5nIG9uIGEgbm93LXNlY3VyZWQgY2hhbm5lbAotICogLSBtdXN0IGJlIGNhbGxlZCB3aXRoIHNvZnRpcnFzIGRpc2FibGVkCisgKiAtIG11c3QgYmUgY2FsbGVkIHdpdGggQkgncyBkaXNhYmxlZC4KICAqLwogc3RhdGljIHZvaWQgcnhycGNfY2FsbF9pc19zZWN1cmUoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCiB7CiAJX2VudGVyKCIlcCIsIGNhbGwpOwogCWlmIChjYWxsKSB7Ci0JCXJlYWRfbG9jaygmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUgJiYKLQkJICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfU0VDVVJFRCwgJmNhbGwtPmV2ZW50cykpCi0JCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOwotCQlyZWFkX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCQlpZiAoY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9TRVJWRVJfU0VDVVJJTkcpIHsKKwkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HOworCQkJcnhycGNfbm90aWZ5X3NvY2tldChjYWxsKTsKKwkJfQorCQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwogCX0KIH0KIApAQCAtMTU5LDIyICsyNjMsMjggQEAKIAlpbnQgbG9vcCwgcmV0OwogCiAJaWYgKGNvbm4tPnN0YXRlID49IFJYUlBDX0NPTk5fUkVNT1RFTFlfQUJPUlRFRCkgewotCQlrbGVhdmUoIiA9IC1FQ09OTkFCT1JURUQgWyV1XSIsIGNvbm4tPnN0YXRlKTsKKwkJX2xlYXZlKCIgPSAtRUNPTk5BQk9SVEVEIFsldV0iLCBjb25uLT5zdGF0ZSk7CiAJCXJldHVybiAtRUNPTk5BQk9SVEVEOwogCX0KIAogCV9lbnRlcigieyVkfSx7JXUsJSUldX0sIiwgY29ubi0+ZGVidWdfaWQsIHNwLT5oZHIudHlwZSwgc3AtPmhkci5zZXJpYWwpOwogCiAJc3dpdGNoIChzcC0+aGRyLnR5cGUpIHsKKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEE6CisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0s6CisJCXJ4cnBjX2Nvbm5fcmV0cmFuc21pdF9jYWxsKGNvbm4sIHNrYik7CisJCXJldHVybiAwOworCiAJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVDoKLQkJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCAmd3RtcCwgc2l6ZW9mKHd0bXApKSA8IDApCisJCWlmIChza2JfY29weV9iaXRzKHNrYiwgc2l6ZW9mKHN0cnVjdCByeHJwY193aXJlX2hlYWRlciksCisJCQkJICAmd3RtcCwgc2l6ZW9mKHd0bXApKSA8IDApCiAJCQlyZXR1cm4gLUVQUk9UTzsKIAkJYWJvcnRfY29kZSA9IG50b2hsKHd0bXApOwogCQlfcHJvdG8oIlJ4IEFCT1JUICUlJXUgeyBhYz0lZCB9Iiwgc3AtPmhkci5zZXJpYWwsIGFib3J0X2NvZGUpOwogCiAJCWNvbm4tPnN0YXRlID0gUlhSUENfQ09OTl9SRU1PVEVMWV9BQk9SVEVEOwogCQlyeHJwY19hYm9ydF9jYWxscyhjb25uLCBSWFJQQ19DQUxMX1JFTU9URUxZX0FCT1JURUQsCi0JCQkJICBhYm9ydF9jb2RlKTsKKwkJCQkgIGFib3J0X2NvZGUsIEVDT05OQUJPUlRFRCk7CiAJCXJldHVybiAtRUNPTk5BQk9SVEVEOwogCiAJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9DSEFMTEVOR0U6CkBAIC0xOTksMTQgKzMwOSwxNiBAQAogCiAJCWlmIChjb25uLT5zdGF0ZSA9PSBSWFJQQ19DT05OX1NFUlZJQ0VfQ0hBTExFTkdJTkcpIHsKIAkJCWNvbm4tPnN0YXRlID0gUlhSUENfQ09OTl9TRVJWSUNFOworCQkJc3Bpbl91bmxvY2soJmNvbm4tPnN0YXRlX2xvY2spOwogCQkJZm9yIChsb29wID0gMDsgbG9vcCA8IFJYUlBDX01BWENBTExTOyBsb29wKyspCiAJCQkJcnhycGNfY2FsbF9pc19zZWN1cmUoCiAJCQkJCXJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoCiAJCQkJCQljb25uLT5jaGFubmVsc1tsb29wXS5jYWxsLAogCQkJCQkJbG9ja2RlcF9pc19oZWxkKCZjb25uLT5jaGFubmVsX2xvY2spKSk7CisJCX0gZWxzZSB7CisJCQlzcGluX3VubG9jaygmY29ubi0+c3RhdGVfbG9jayk7CiAJCX0KIAotCQlzcGluX3VubG9jaygmY29ubi0+c3RhdGVfbG9jayk7CiAJCXNwaW5fdW5sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOwogCQlyZXR1cm4gMDsKIApAQCAtMjY5LDcgKzM4MSw3IEBACiAJdTMyIGFib3J0X2NvZGUgPSBSWF9QUk9UT0NPTF9FUlJPUjsKIAlpbnQgcmV0OwogCi0JX2VudGVyKCJ7JWR9IiwgY29ubi0+ZGVidWdfaWQpOworCXJ4cnBjX3NlZV9jb25uZWN0aW9uKGNvbm4pOwogCiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DT05OX0VWX0NIQUxMRU5HRSwgJmNvbm4tPmV2ZW50cykpCiAJCXJ4cnBjX3NlY3VyZV9jb25uZWN0aW9uKGNvbm4pOwpAQCAtMjc3LDYgKzM4OSw3IEBACiAJLyogZ28gdGhyb3VnaCB0aGUgY29ubi1sZXZlbCBldmVudCBwYWNrZXRzLCByZWxlYXNpbmcgdGhlIHJlZiBvbiB0aGlzCiAJICogY29ubmVjdGlvbiB0aGF0IGVhY2ggb25lIGhhcyB3aGVuIHdlJ3ZlIGZpbmlzaGVkIHdpdGggaXQgKi8KIAl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZjb25uLT5yeF9xdWV1ZSkpKSB7CisJCXJ4cnBjX3NlZV9za2Ioc2tiLCByeHJwY19za2Jfcnhfc2Vlbik7CiAJCXJldCA9IHJ4cnBjX3Byb2Nlc3NfZXZlbnQoY29ubiwgc2tiLCAmYWJvcnRfY29kZSk7CiAJCXN3aXRjaCAocmV0KSB7CiAJCWNhc2UgLUVQUk9UTzoKQEAgLTI4Nyw3ICs0MDAsNyBAQAogCQkJZ290byByZXF1ZXVlX2FuZF9sZWF2ZTsKIAkJY2FzZSAtRUNPTk5BQk9SVEVEOgogCQlkZWZhdWx0OgotCQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwkJCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3J4X2ZyZWVkKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMzA0LDkxICs0MTcsNyBAQAogcHJvdG9jb2xfZXJyb3I6CiAJaWYgKHJ4cnBjX2Fib3J0X2Nvbm5lY3Rpb24oY29ubiwgLXJldCwgYWJvcnRfY29kZSkgPCAwKQogCQlnb3RvIHJlcXVldWVfYW5kX2xlYXZlOwotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJcnhycGNfZnJlZV9za2Ioc2tiLCByeHJwY19za2JfcnhfZnJlZWQpOwogCV9sZWF2ZSgiIFtFUFJPVE9dIik7CiAJZ290byBvdXQ7CiB9Ci0KLS8qCi0gKiBwdXQgYSBwYWNrZXQgdXAgZm9yIHRyYW5zcG9ydC1sZXZlbCBhYm9ydAotICovCi12b2lkIHJ4cnBjX3JlamVjdF9wYWNrZXQoc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlDSEVDS19TTEFCX09LQVkoJmxvY2FsLT51c2FnZSk7Ci0KLQlza2JfcXVldWVfdGFpbCgmbG9jYWwtPnJlamVjdF9xdWV1ZSwgc2tiKTsKLQlyeHJwY19xdWV1ZV9sb2NhbChsb2NhbCk7Ci19Ci0KLS8qCi0gKiByZWplY3QgcGFja2V0cyB0aHJvdWdoIHRoZSBsb2NhbCBlbmRwb2ludAotICovCi12b2lkIHJ4cnBjX3JlamVjdF9wYWNrZXRzKHN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwpCi17Ci0JdW5pb24gewotCQlzdHJ1Y3Qgc29ja2FkZHIgc2E7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47Ci0JfSBzYTsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCXN0cnVjdCByeHJwY193aXJlX2hlYWRlciB3aGRyOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IG1zZ2hkciBtc2c7Ci0Jc3RydWN0IGt2ZWMgaW92WzJdOwotCXNpemVfdCBzaXplOwotCV9fYmUzMiBjb2RlOwotCi0JX2VudGVyKCIlZCIsIGxvY2FsLT5kZWJ1Z19pZCk7Ci0KLQlpb3ZbMF0uaW92X2Jhc2UgPSAmd2hkcjsKLQlpb3ZbMF0uaW92X2xlbiA9IHNpemVvZih3aGRyKTsKLQlpb3ZbMV0uaW92X2Jhc2UgPSAmY29kZTsKLQlpb3ZbMV0uaW92X2xlbiA9IHNpemVvZihjb2RlKTsKLQlzaXplID0gc2l6ZW9mKHdoZHIpICsgc2l6ZW9mKGNvZGUpOwotCi0JbXNnLm1zZ19uYW1lID0gJnNhOwotCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7Ci0JbXNnLm1zZ19jb250cm9sbGVuID0gMDsKLQltc2cubXNnX2ZsYWdzID0gMDsKLQotCW1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOwotCXNhLnNhLnNhX2ZhbWlseSA9IGxvY2FsLT5zcngudHJhbnNwb3J0LmZhbWlseTsKLQlzd2l0Y2ggKHNhLnNhLnNhX2ZhbWlseSkgewotCWNhc2UgQUZfSU5FVDoKLQkJbXNnLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHNhLnNpbik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCW1zZy5tc2dfbmFtZWxlbiA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCW1lbXNldCgmd2hkciwgMCwgc2l6ZW9mKHdoZHIpKTsKLQl3aGRyLnR5cGUgPSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVDsKLQotCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmxvY2FsLT5yZWplY3RfcXVldWUpKSkgewotCQlzcCA9IHJ4cnBjX3NrYihza2IpOwotCQlzd2l0Y2ggKHNhLnNhLnNhX2ZhbWlseSkgewotCQljYXNlIEFGX0lORVQ6Ci0JCQlzYS5zaW4uc2luX3BvcnQgPSB1ZHBfaGRyKHNrYiktPnNvdXJjZTsKLQkJCXNhLnNpbi5zaW5fYWRkci5zX2FkZHIgPSBpcF9oZHIoc2tiKS0+c2FkZHI7Ci0JCQljb2RlID0gaHRvbmwoc2tiLT5wcmlvcml0eSk7Ci0KLQkJCXdoZHIuZXBvY2gJPSBodG9ubChzcC0+aGRyLmVwb2NoKTsKLQkJCXdoZHIuY2lkCT0gaHRvbmwoc3AtPmhkci5jaWQpOwotCQkJd2hkci5jYWxsTnVtYmVyCT0gaHRvbmwoc3AtPmhkci5jYWxsTnVtYmVyKTsKLQkJCXdoZHIuc2VydmljZUlkCT0gaHRvbnMoc3AtPmhkci5zZXJ2aWNlSWQpOwotCQkJd2hkci5mbGFncwk9IHNwLT5oZHIuZmxhZ3M7Ci0JCQl3aGRyLmZsYWdzCV49IFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7Ci0JCQl3aGRyLmZsYWdzCSY9IFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7Ci0KLQkJCWtlcm5lbF9zZW5kbXNnKGxvY2FsLT5zb2NrZXQsICZtc2csIGlvdiwgMiwgc2l6ZSk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCQlyeHJwY19mcmVlX3NrYihza2IpOwotCX0KLQotCV9sZWF2ZSgiIik7Ci19CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvY29ubl9vYmplY3QuYyBiL25ldC9yeHJwYy9jb25uX29iamVjdC5jCmluZGV4IDg5NmQ4NDQuLmUxZTgzYWYgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9jb25uX29iamVjdC5jCisrKyBiL25ldC9yeHJwYy9jb25uX29iamVjdC5jCkBAIC0xLDYgKzEsNiBAQAotLyogUnhSUEMgdmlydHVhbCBjb25uZWN0aW9uIGhhbmRsZXIKKy8qIFJ4UlBDIHZpcnR1YWwgY29ubmVjdGlvbiBoYW5kbGVyLCBjb21tb24gYml0cy4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDE2IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0xNSw4ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0jaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CiAjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKIAogLyoKQEAgLTI3LDkgKzI1LDEyIEBACiBzdGF0aWMgdm9pZCByeHJwY19jb25uZWN0aW9uX3JlYXBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiBMSVNUX0hFQUQocnhycGNfY29ubmVjdGlvbnMpOworTElTVF9IRUFEKHJ4cnBjX2Nvbm5lY3Rpb25fcHJvY19saXN0KTsKIERFRklORV9SV0xPQ0socnhycGNfY29ubmVjdGlvbl9sb2NrKTsKIHN0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhyeHJwY19jb25uZWN0aW9uX3JlYXAsIHJ4cnBjX2Nvbm5lY3Rpb25fcmVhcGVyKTsKIAorc3RhdGljIHZvaWQgcnhycGNfZGVzdHJveV9jb25uZWN0aW9uKHN0cnVjdCByY3VfaGVhZCAqKTsKKwogLyoKICAqIGFsbG9jYXRlIGEgbmV3IGNvbm5lY3Rpb24KICAqLwpAQCAtNDEsMjEgKzQyLDE4IEBACiAKIAljb25uID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24pLCBnZnApOwogCWlmIChjb25uKSB7CisJCUlOSVRfTElTVF9IRUFEKCZjb25uLT5jYWNoZV9saW5rKTsKIAkJc3Bpbl9sb2NrX2luaXQoJmNvbm4tPmNoYW5uZWxfbG9jayk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNvbm4tPmNoYW5uZWxfd3EpOworCQlJTklUX0xJU1RfSEVBRCgmY29ubi0+d2FpdGluZ19jYWxscyk7CiAJCUlOSVRfV09SSygmY29ubi0+cHJvY2Vzc29yLCAmcnhycGNfcHJvY2Vzc19jb25uZWN0aW9uKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmNvbm4tPnByb2NfbGluayk7CiAJCUlOSVRfTElTVF9IRUFEKCZjb25uLT5saW5rKTsKIAkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY29ubi0+cnhfcXVldWUpOwogCQljb25uLT5zZWN1cml0eSA9ICZyeHJwY19ub19zZWN1cml0eTsKIAkJc3Bpbl9sb2NrX2luaXQoJmNvbm4tPnN0YXRlX2xvY2spOwotCQkvKiBXZSBtYWludGFpbiBhbiBleHRyYSByZWYgb24gdGhlIGNvbm5lY3Rpb24gd2hpbHN0IGl0IGlzCi0JCSAqIG9uIHRoZSByeHJwY19jb25uZWN0aW9ucyBsaXN0LgotCQkgKi8KLQkJYXRvbWljX3NldCgmY29ubi0+dXNhZ2UsIDIpOwogCQljb25uLT5kZWJ1Z19pZCA9IGF0b21pY19pbmNfcmV0dXJuKCZyeHJwY19kZWJ1Z19pZCk7Ci0JCWF0b21pY19zZXQoJmNvbm4tPmF2YWlsX2NoYW5zLCBSWFJQQ19NQVhDQUxMUyk7CiAJCWNvbm4tPnNpemVfYWxpZ24gPSA0OwotCQljb25uLT5oZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpOworCQljb25uLT5pZGxlX3RpbWVzdGFtcCA9IGppZmZpZXM7CiAJfQogCiAJX2xlYXZlKCIgPSAlcHslZH0iLCBjb25uLCBjb25uID8gY29ubi0+ZGVidWdfaWQgOiAwKTsKQEAgLTEzNSw2ICsxMzMsMTYgQEAKIAkJCSAgICBzcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkci5zX2FkZHIpCiAJCQkJZ290byBub3RfZm91bmQ7CiAJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfQUZfUlhSUENfSVBWNgorCQljYXNlIEFGX0lORVQ2OgorCQkJaWYgKHBlZXItPnNyeC50cmFuc3BvcnQuc2luNi5zaW42X3BvcnQgIT0KKwkJCSAgICBzcngudHJhbnNwb3J0LnNpbjYuc2luNl9wb3J0IHx8CisJCQkgICAgbWVtY21wKCZwZWVyLT5zcngudHJhbnNwb3J0LnNpbjYuc2luNl9hZGRyLAorCQkJCSAgICZzcngudHJhbnNwb3J0LnNpbjYuc2luNl9hZGRyLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSAhPSAwKQorCQkJCWdvdG8gbm90X2ZvdW5kOworCQkJYnJlYWs7CisjZW5kaWYKIAkJZGVmYXVsdDoKIAkJCUJVRygpOwogCQl9CkBAIC0xNTMsMjUgKzE2MSwzMiBAQAogICogdGVybWluYXRlcy4gIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBjaGFubmVsX2xvY2sgYW5kIG11c3QgcmVsZWFzZSB0aGUKICAqIGNhbGwncyByZWYgb24gdGhlIGNvbm5lY3Rpb24uCiAgKi8KLXZvaWQgX19yeHJwY19kaXNjb25uZWN0X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit2b2lkIF9fcnhycGNfZGlzY29ubmVjdF9jYWxsKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJICAgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKIHsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiA9IGNhbGwtPmNvbm47Ci0Jc3RydWN0IHJ4cnBjX2NoYW5uZWwgKmNoYW4gPSAmY29ubi0+Y2hhbm5lbHNbY2FsbC0+Y2hhbm5lbF07CisJc3RydWN0IHJ4cnBjX2NoYW5uZWwgKmNoYW4gPQorCQkmY29ubi0+Y2hhbm5lbHNbY2FsbC0+Y2lkICYgUlhSUENfQ0hBTk5FTE1BU0tdOwogCi0JX2VudGVyKCIlZCwlZCIsIGNvbm4tPmRlYnVnX2lkLCBjYWxsLT5jaGFubmVsKTsKKwlfZW50ZXIoIiVkLCV4IiwgY29ubi0+ZGVidWdfaWQsIGNhbGwtPmNpZCk7CiAKIAlpZiAocmN1X2FjY2Vzc19wb2ludGVyKGNoYW4tPmNhbGwpID09IGNhbGwpIHsKIAkJLyogU2F2ZSB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsIHNvIHRoYXQgd2UgY2FuIHJlcGVhdCBpdCBpZiBuZWNlc3NhcnkKIAkJICogdGhyb3VnaCB0aGUgY2hhbm5lbCwgd2hpbHN0IGRpc3Bvc2luZyBvZiB0aGUgYWN0dWFsIGNhbGwgcmVjb3JkLgogCQkgKi8KLQkJY2hhbi0+bGFzdF9yZXN1bHQgPSBjYWxsLT5sb2NhbF9hYm9ydDsKKwkJY2hhbi0+bGFzdF9zZXJ2aWNlX2lkID0gY2FsbC0+c2VydmljZV9pZDsKKwkJaWYgKGNhbGwtPmFib3J0X2NvZGUpIHsKKwkJCWNoYW4tPmxhc3RfYWJvcnQgPSBjYWxsLT5hYm9ydF9jb2RlOworCQkJY2hhbi0+bGFzdF90eXBlID0gUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQ7CisJCX0gZWxzZSB7CisJCQljaGFuLT5sYXN0X3NlcSA9IGNhbGwtPnJ4X2hhcmRfYWNrOworCQkJY2hhbi0+bGFzdF90eXBlID0gUlhSUENfUEFDS0VUX1RZUEVfQUNLOworCQl9CisJCS8qIFN5bmMgd2l0aCByeHJwY19jb25uX3JldHJhbnNtaXQoKS4gKi8KIAkJc21wX3dtYigpOwogCQljaGFuLT5sYXN0X2NhbGwgPSBjaGFuLT5jYWxsX2lkOwogCQljaGFuLT5jYWxsX2lkID0gY2hhbi0+Y2FsbF9jb3VudGVyOwogCiAJCXJjdV9hc3NpZ25fcG9pbnRlcihjaGFuLT5jYWxsLCBOVUxMKTsKLQkJYXRvbWljX2luYygmY29ubi0+YXZhaWxfY2hhbnMpOwotCQl3YWtlX3VwKCZjb25uLT5jaGFubmVsX3dxKTsKIAl9CiAKIAlfbGVhdmUoIiIpOwpAQCAtMTg1LDM0ICsyMDAsMTIyIEBACiB7CiAJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPSBjYWxsLT5jb25uOwogCisJc3Bpbl9sb2NrX2JoKCZjb25uLT5wYXJhbXMucGVlci0+bG9jayk7CisJaGxpc3RfZGVsX2luaXQoJmNhbGwtPmVycm9yX2xpbmspOworCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5wYXJhbXMucGVlci0+bG9jayk7CisKKwlpZiAocnhycGNfaXNfY2xpZW50X2NhbGwoY2FsbCkpCisJCXJldHVybiByeHJwY19kaXNjb25uZWN0X2NsaWVudF9jYWxsKGNhbGwpOworCiAJc3Bpbl9sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOwotCV9fcnhycGNfZGlzY29ubmVjdF9jYWxsKGNhbGwpOworCV9fcnhycGNfZGlzY29ubmVjdF9jYWxsKGNvbm4sIGNhbGwpOwogCXNwaW5fdW5sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOwogCiAJY2FsbC0+Y29ubiA9IE5VTEw7CisJY29ubi0+aWRsZV90aW1lc3RhbXAgPSBqaWZmaWVzOwogCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNvbm4pOwogfQogCiAvKgotICogcmVsZWFzZSBhIHZpcnR1YWwgY29ubmVjdGlvbgorICogS2lsbCBvZmYgYSBjb25uZWN0aW9uLgogICovCi12b2lkIHJ4cnBjX3B1dF9jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQordm9pZCByeHJwY19raWxsX2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCiB7Ci0JaWYgKCFjb25uKQotCQlyZXR1cm47CisJQVNTRVJUKCFyY3VfYWNjZXNzX3BvaW50ZXIoY29ubi0+Y2hhbm5lbHNbMF0uY2FsbCkgJiYKKwkgICAgICAgIXJjdV9hY2Nlc3NfcG9pbnRlcihjb25uLT5jaGFubmVsc1sxXS5jYWxsKSAmJgorCSAgICAgICAhcmN1X2FjY2Vzc19wb2ludGVyKGNvbm4tPmNoYW5uZWxzWzJdLmNhbGwpICYmCisJICAgICAgICFyY3VfYWNjZXNzX3BvaW50ZXIoY29ubi0+Y2hhbm5lbHNbM10uY2FsbCkpOworCUFTU0VSVChsaXN0X2VtcHR5KCZjb25uLT5jYWNoZV9saW5rKSk7CiAKLQlfZW50ZXIoIiVwe3U9JWQsZD0lZH0iLAotCSAgICAgICBjb25uLCBhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpLCBjb25uLT5kZWJ1Z19pZCk7CisJd3JpdGVfbG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZjb25uLT5wcm9jX2xpbmspOworCXdyaXRlX3VubG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKIAotCUFTU0VSVENNUChhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpLCA+LCAxKTsKKwkvKiBEcmFpbiB0aGUgUnggcXVldWUuICBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggd2UndmUgdW5wdWJsaXNoZWQsIGFuCisJICogaW5jb21pbmcgcGFja2V0IGNvdWxkIHN0aWxsIGJlIGJlaW5nIGFkZGVkIHRvIG91ciBSeCBxdWV1ZSwgc28gd2UKKwkgKiB3aWxsIG5lZWQgdG8gZHJhaW4gaXQgYWdhaW4gaW4gdGhlIFJDVSBjbGVhbnVwIGhhbmRsZXIuCisJICovCisJcnhycGNfcHVyZ2VfcXVldWUoJmNvbm4tPnJ4X3F1ZXVlKTsKIAotCWNvbm4tPnB1dF90aW1lID0ga3RpbWVfZ2V0X3NlY29uZHMoKTsKLQlpZiAoYXRvbWljX2RlY19yZXR1cm4oJmNvbm4tPnVzYWdlKSA9PSAxKSB7Ci0JCV9kZWJ1Zygiem9tYmllIik7Ci0JCXJ4cnBjX3F1ZXVlX2RlbGF5ZWRfd29yaygmcnhycGNfY29ubmVjdGlvbl9yZWFwLCAwKTsKKwkvKiBMZWF2ZSBmaW5hbCBkZXN0cnVjdGlvbiB0byBSQ1UuICBUaGUgY29ubmVjdGlvbiBwcm9jZXNzb3Igd29yayBpdGVtCisJICogbXVzdCBjYXJyeSBhIHJlZiBvbiB0aGUgY29ubmVjdGlvbiB0byBwcmV2ZW50IHVzIGdldHRpbmcgaGVyZSB3aGlsc3QKKwkgKiBpdCBpcyBxdWV1ZWQgb3IgcnVubmluZy4KKwkgKi8KKwljYWxsX3JjdSgmY29ubi0+cmN1LCByeHJwY19kZXN0cm95X2Nvbm5lY3Rpb24pOworfQorCisvKgorICogUXVldWUgYSBjb25uZWN0aW9uJ3Mgd29yayBwcm9jZXNzb3IsIGdldHRpbmcgYSByZWYgdG8gcGFzcyB0byB0aGUgd29yaworICogcXVldWUuCisgKi8KK2Jvb2wgcnhycGNfcXVldWVfY29ubihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3sKKwljb25zdCB2b2lkICpoZXJlID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworCWludCBuID0gX19hdG9taWNfYWRkX3VubGVzcygmY29ubi0+dXNhZ2UsIDEsIDApOworCWlmIChuID09IDApCisJCXJldHVybiBmYWxzZTsKKwlpZiAocnhycGNfcXVldWVfd29yaygmY29ubi0+cHJvY2Vzc29yKSkKKwkJdHJhY2VfcnhycGNfY29ubihjb25uLCByeHJwY19jb25uX3F1ZXVlZCwgbiArIDEsIGhlcmUpOworCWVsc2UKKwkJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBOb3RlIHRoZSByZS1lbWVyZ2VuY2Ugb2YgYSBjb25uZWN0aW9uLgorICovCit2b2lkIHJ4cnBjX3NlZV9jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQoreworCWNvbnN0IHZvaWQgKmhlcmUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJaWYgKGNvbm4pIHsKKwkJaW50IG4gPSBhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpOworCisJCXRyYWNlX3J4cnBjX2Nvbm4oY29ubiwgcnhycGNfY29ubl9zZWVuLCBuLCBoZXJlKTsKIAl9Cit9CiAKLQlfbGVhdmUoIiIpOworLyoKKyAqIEdldCBhIHJlZiBvbiBhIGNvbm5lY3Rpb24uCisgKi8KK3ZvaWQgcnhycGNfZ2V0X2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpbnQgbiA9IGF0b21pY19pbmNfcmV0dXJuKCZjb25uLT51c2FnZSk7CisKKwl0cmFjZV9yeHJwY19jb25uKGNvbm4sIHJ4cnBjX2Nvbm5fZ290LCBuLCBoZXJlKTsKK30KKworLyoKKyAqIFRyeSB0byBnZXQgYSByZWYgb24gYSBjb25uZWN0aW9uLgorICovCitzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqCityeHJwY19nZXRfY29ubmVjdGlvbl9tYXliZShzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3sKKwljb25zdCB2b2lkICpoZXJlID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworCisJaWYgKGNvbm4pIHsKKwkJaW50IG4gPSBfX2F0b21pY19hZGRfdW5sZXNzKCZjb25uLT51c2FnZSwgMSwgMCk7CisJCWlmIChuID4gMCkKKwkJCXRyYWNlX3J4cnBjX2Nvbm4oY29ubiwgcnhycGNfY29ubl9nb3QsIG4gKyAxLCBoZXJlKTsKKwkJZWxzZQorCQkJY29ubiA9IE5VTEw7CisJfQorCXJldHVybiBjb25uOworfQorCisvKgorICogUmVsZWFzZSBhIHNlcnZpY2UgY29ubmVjdGlvbgorICovCit2b2lkIHJ4cnBjX3B1dF9zZXJ2aWNlX2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpbnQgbjsKKworCW4gPSBhdG9taWNfZGVjX3JldHVybigmY29ubi0+dXNhZ2UpOworCXRyYWNlX3J4cnBjX2Nvbm4oY29ubiwgcnhycGNfY29ubl9wdXRfc2VydmljZSwgbiwgaGVyZSk7CisJQVNTRVJUQ01QKG4sID49LCAwKTsKKwlpZiAobiA9PSAwKQorCQlyeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoJnJ4cnBjX2Nvbm5lY3Rpb25fcmVhcCwgMCk7CiB9CiAKIC8qCkBAIC0yNDIsMTkgKzM0NSwxOSBAQAogfQogCiAvKgotICogcmVhcCBkZWFkIGNvbm5lY3Rpb25zCisgKiByZWFwIGRlYWQgc2VydmljZSBjb25uZWN0aW9ucwogICovCiBzdGF0aWMgdm9pZCByeHJwY19jb25uZWN0aW9uX3JlYXBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sICpfcDsKLQl1bnNpZ25lZCBsb25nIHJlYXBfb2xkZXJfdGhhbiwgZWFybGllc3QsIHB1dF90aW1lLCBub3c7CisJdW5zaWduZWQgbG9uZyByZWFwX29sZGVyX3RoYW4sIGVhcmxpZXN0LCBpZGxlX3RpbWVzdGFtcCwgbm93OwogCiAJTElTVF9IRUFEKGdyYXZleWFyZCk7CiAKIAlfZW50ZXIoIiIpOwogCi0Jbm93ID0ga3RpbWVfZ2V0X3NlY29uZHMoKTsKLQlyZWFwX29sZGVyX3RoYW4gPSAgbm93IC0gcnhycGNfY29ubmVjdGlvbl9leHBpcnk7CisJbm93ID0gamlmZmllczsKKwlyZWFwX29sZGVyX3RoYW4gPSBub3cgLSByeHJwY19jb25uZWN0aW9uX2V4cGlyeSAqIEhaOwogCWVhcmxpZXN0ID0gVUxPTkdfTUFYOwogCiAJd3JpdGVfbG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKQEAgLTI2MiwxMSArMzY1LDE3IEBACiAJCUFTU0VSVENNUChhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpLCA+LCAwKTsKIAkJaWYgKGxpa2VseShhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpID4gMSkpCiAJCQljb250aW51ZTsKKwkJaWYgKGNvbm4tPnN0YXRlID09IFJYUlBDX0NPTk5fU0VSVklDRV9QUkVBTExPQykKKwkJCWNvbnRpbnVlOwogCi0JCXB1dF90aW1lID0gUkVBRF9PTkNFKGNvbm4tPnB1dF90aW1lKTsKLQkJaWYgKHRpbWVfYWZ0ZXIocHV0X3RpbWUsIHJlYXBfb2xkZXJfdGhhbikpIHsKLQkJCWlmICh0aW1lX2JlZm9yZShwdXRfdGltZSwgZWFybGllc3QpKQotCQkJCWVhcmxpZXN0ID0gcHV0X3RpbWU7CisJCWlkbGVfdGltZXN0YW1wID0gUkVBRF9PTkNFKGNvbm4tPmlkbGVfdGltZXN0YW1wKTsKKwkJX2RlYnVnKCJyZWFwIENPTk4gJWQgeyB1PSVkLHQ9JWxkIH0iLAorCQkgICAgICAgY29ubi0+ZGVidWdfaWQsIGF0b21pY19yZWFkKCZjb25uLT51c2FnZSksCisJCSAgICAgICAobG9uZylyZWFwX29sZGVyX3RoYW4gLSAobG9uZylpZGxlX3RpbWVzdGFtcCk7CisKKwkJaWYgKHRpbWVfYWZ0ZXIoaWRsZV90aW1lc3RhbXAsIHJlYXBfb2xkZXJfdGhhbikpIHsKKwkJCWlmICh0aW1lX2JlZm9yZShpZGxlX3RpbWVzdGFtcCwgZWFybGllc3QpKQorCQkJCWVhcmxpZXN0ID0gaWRsZV90aW1lc3RhbXA7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0yNzcsNyArMzg2LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChyeHJwY19jb25uX2lzX2NsaWVudChjb25uKSkKLQkJCXJ4cnBjX3VucHVibGlzaF9jbGllbnRfY29ubihjb25uKTsKKwkJCUJVRygpOwogCQllbHNlCiAJCQlyeHJwY191bnB1Ymxpc2hfc2VydmljZV9jb25uKGNvbm4pOwogCkBAIC0yODcsOSArMzk2LDkgQEAKIAogCWlmIChlYXJsaWVzdCAhPSBVTE9OR19NQVgpIHsKIAkJX2RlYnVnKCJyZXNjaGVkdWxlIHJlYXBlciAlbGQiLCAobG9uZykgZWFybGllc3QgLSBub3cpOwotCQlBU1NFUlRDTVAoZWFybGllc3QsID4sIG5vdyk7CisJCUFTU0VSVCh0aW1lX2FmdGVyKGVhcmxpZXN0LCBub3cpKTsKIAkJcnhycGNfcXVldWVfZGVsYXllZF93b3JrKCZyeHJwY19jb25uZWN0aW9uX3JlYXAsCi0JCQkJCSAoZWFybGllc3QgLSBub3cpICogSFopOworCQkJCQkgZWFybGllc3QgLSBub3cpOwogCX0KIAogCXdoaWxlICghbGlzdF9lbXB0eSgmZ3JhdmV5YXJkKSkgewpAQCAtMjk4LDE2ICs0MDcsMTUgQEAKIAkJbGlzdF9kZWxfaW5pdCgmY29ubi0+bGluayk7CiAKIAkJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZjb25uLT51c2FnZSksID09LCAwKTsKLQkJc2tiX3F1ZXVlX3B1cmdlKCZjb25uLT5yeF9xdWV1ZSk7Ci0JCWNhbGxfcmN1KCZjb25uLT5yY3UsIHJ4cnBjX2Rlc3Ryb3lfY29ubmVjdGlvbik7CisJCXJ4cnBjX2tpbGxfY29ubmVjdGlvbihjb25uKTsKIAl9CiAKIAlfbGVhdmUoIiIpOwogfQogCiAvKgotICogcHJlZW1wdGl2ZWx5IGRlc3Ryb3kgYWxsIHRoZSBjb25uZWN0aW9uIHJlY29yZHMgcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlbQotICogdG8gdGltZSBvdXQKKyAqIHByZWVtcHRpdmVseSBkZXN0cm95IGFsbCB0aGUgc2VydmljZSBjb25uZWN0aW9uIHJlY29yZHMgcmF0aGVyIHRoYW4KKyAqIHdhaXRpbmcgZm9yIHRoZW0gdG8gdGltZSBvdXQKICAqLwogdm9pZCBfX2V4aXQgcnhycGNfZGVzdHJveV9hbGxfY29ubmVjdGlvbnModm9pZCkKIHsKQEAgLTMxNiw2ICs0MjQsOCBAQAogCiAJX2VudGVyKCIiKTsKIAorCXJ4cnBjX2Rlc3Ryb3lfYWxsX2NsaWVudF9jb25uZWN0aW9ucygpOworCiAJcnhycGNfY29ubmVjdGlvbl9leHBpcnkgPSAwOwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJnJ4cnBjX2Nvbm5lY3Rpb25fcmVhcCk7CiAJcnhycGNfcXVldWVfZGVsYXllZF93b3JrKCZyeHJwY19jb25uZWN0aW9uX3JlYXAsIDApOwpAQCAtMzMwLDYgKzQ0MCw4IEBACiAJd3JpdGVfdW5sb2NrKCZyeHJwY19jb25uZWN0aW9uX2xvY2spOwogCUJVR19PTihsZWFrKTsKIAorCUFTU0VSVChsaXN0X2VtcHR5KCZyeHJwY19jb25uZWN0aW9uX3Byb2NfbGlzdCkpOworCiAJLyogTWFrZSBzdXJlIHRoZSBsb2NhbCBhbmQgcGVlciByZWNvcmRzIHBpbm5lZCBieSBhbnkgZHlpbmcgY29ubmVjdGlvbnMKIAkgKiBhcmUgcmVsZWFzZWQuCiAJICovCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvY29ubl9zZXJ2aWNlLmMgYi9uZXQvcnhycGMvY29ubl9zZXJ2aWNlLmMKaW5kZXggZmQ5MDI3Yy4uZWVmNTUxZiAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2Nvbm5fc2VydmljZS5jCisrKyBiL25ldC9yeHJwYy9jb25uX3NlcnZpY2UuYwpAQCAtNjUsOSArNjUsOCBAQAogICogSW5zZXJ0IGEgc2VydmljZSBjb25uZWN0aW9uIGludG8gYSBwZWVyJ3MgdHJlZSwgdGhlcmVieSBtYWtpbmcgaXQgYSB0YXJnZXQKICAqIGZvciBpbmNvbWluZyBwYWNrZXRzLgogICovCi1zdGF0aWMgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKgotcnhycGNfcHVibGlzaF9zZXJ2aWNlX2Nvbm4oc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIsCi0JCQkgICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3N0YXRpYyB2b2lkIHJ4cnBjX3B1Ymxpc2hfc2VydmljZV9jb25uKHN0cnVjdCByeHJwY19wZWVyICpwZWVyLAorCQkJCSAgICAgICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKIHsKIAlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY3Vyc29yID0gTlVMTDsKIAlzdHJ1Y3QgcnhycGNfY29ubl9wcm90byBrID0gY29ubi0+cHJvdG87CkBAIC05Niw3ICs5NSw3IEBACiAJc2V0X2JpdChSWFJQQ19DT05OX0lOX1NFUlZJQ0VfQ09OTlMsICZjb25uLT5mbGFncyk7CiAJd3JpdGVfc2VxdW5sb2NrX2JoKCZwZWVyLT5zZXJ2aWNlX2Nvbm5fbG9jayk7CiAJX2xlYXZlKCIgPSAlZCBbbmV3XSIsIGNvbm4tPmRlYnVnX2lkKTsKLQlyZXR1cm4gY29ubjsKKwlyZXR1cm47CiAKIGZvdW5kX2V4dGFudF9jb25uOgogCWlmIChhdG9taWNfcmVhZCgmY3Vyc29yLT51c2FnZSkgPT0gMCkKQEAgLTExOSwxMDAgKzExOCw1OCBAQAogfQogCiAvKgotICogZ2V0IGEgcmVjb3JkIG9mIGFuIGluY29taW5nIGNvbm5lY3Rpb24KKyAqIFByZWFsbG9jYXRlIGEgc2VydmljZSBjb25uZWN0aW9uLiAgVGhlIGNvbm5lY3Rpb24gaXMgcGxhY2VkIG9uIHRoZSBwcm9jIGFuZAorICogcmVhcCBsaXN0cyBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZ2V0IHRoZSBsb2NrIGZyb20gQkggY29udGV4dC4KICAqLwotc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKnJ4cnBjX2luY29taW5nX2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwKLQkJCQkJCSAgIHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqc3J4LAotCQkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0cnVjdCByeHJwY19jb25uZWN0aW9uICpyeHJwY19wcmVhbGxvY19zZXJ2aWNlX2Nvbm5lY3Rpb24oZ2ZwX3QgZ2ZwKQogewotCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gcnhycGNfYWxsb2NfY29ubmVjdGlvbihnZnApOworCisJaWYgKGNvbm4pIHsKKwkJLyogV2UgbWFpbnRhaW4gYW4gZXh0cmEgcmVmIG9uIHRoZSBjb25uZWN0aW9uIHdoaWxzdCBpdCBpcyBvbgorCQkgKiB0aGUgcnhycGNfY29ubmVjdGlvbnMgbGlzdC4KKwkJICovCisJCWNvbm4tPnN0YXRlID0gUlhSUENfQ09OTl9TRVJWSUNFX1BSRUFMTE9DOworCQlhdG9taWNfc2V0KCZjb25uLT51c2FnZSwgMik7CisKKwkJd3JpdGVfbG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmY29ubi0+bGluaywgJnJ4cnBjX2Nvbm5lY3Rpb25zKTsKKwkJbGlzdF9hZGRfdGFpbCgmY29ubi0+cHJvY19saW5rLCAmcnhycGNfY29ubmVjdGlvbl9wcm9jX2xpc3QpOworCQl3cml0ZV91bmxvY2soJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CisKKwkJdHJhY2VfcnhycGNfY29ubihjb25uLCByeHJwY19jb25uX25ld19zZXJ2aWNlLAorCQkJCSBhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpLAorCQkJCSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCX0KKworCXJldHVybiBjb25uOworfQorCisvKgorICogU2V0IHVwIGFuIGluY29taW5nIGNvbm5lY3Rpb24uICBUaGlzIGlzIGNhbGxlZCBpbiBCSCBjb250ZXh0IHdpdGggdGhlIFJDVQorICogcmVhZCBsb2NrIGhlbGQuCisgKi8KK3ZvaWQgcnhycGNfbmV3X2luY29taW5nX2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKIAlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7Ci0Jc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXI7Ci0JY29uc3QgY2hhciAqbmV3ID0gIm9sZCI7CiAKIAlfZW50ZXIoIiIpOwogCi0JcGVlciA9IHJ4cnBjX2xvb2t1cF9wZWVyKGxvY2FsLCBzcngsIEdGUF9OT0lPKTsKLQlpZiAoIXBlZXIpIHsKLQkJX2RlYnVnKCJubyBwZWVyIik7Ci0JCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7Ci0JfQotCi0JQVNTRVJUKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEKTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlwZWVyID0gcnhycGNfbG9va3VwX3BlZXJfcmN1KGxvY2FsLCBzcngpOwotCWlmIChwZWVyKSB7Ci0JCWNvbm4gPSByeHJwY19maW5kX3NlcnZpY2VfY29ubl9yY3UocGVlciwgc2tiKTsKLQkJaWYgKGNvbm4pIHsKLQkJCWlmIChzcC0+aGRyLnNlY3VyaXR5SW5kZXggIT0gY29ubi0+c2VjdXJpdHlfaXgpCi0JCQkJZ290byBzZWN1cml0eV9taXNtYXRjaF9yY3U7Ci0JCQlpZiAocnhycGNfZ2V0X2Nvbm5lY3Rpb25fbWF5YmUoY29ubikpCi0JCQkJZ290byBmb3VuZF9leHRhbnRfY29ubmVjdGlvbl9yY3U7Ci0KLQkJCS8qIFRoZSBjb25uIGhhcyBleHBpcmVkIGJ1dCB3ZSBjYW4ndCByZW1vdmUgaXQgd2l0aG91dAotCQkJICogdGhlIGFwcHJvcHJpYXRlIGxvY2ssIHNvIHdlIGF0dGVtcHQgdG8gcmVwbGFjZSBpdAotCQkJICogd2hlbiB3ZSBoYXZlIGEgbmV3IGNhbmRpZGF0ZS4KLQkJCSAqLwotCQl9Ci0KLQkJaWYgKCFyeHJwY19nZXRfcGVlcl9tYXliZShwZWVyKSkKLQkJCXBlZXIgPSBOVUxMOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCWlmICghcGVlcikgewotCQlwZWVyID0gcnhycGNfbG9va3VwX3BlZXIobG9jYWwsIHNyeCwgR0ZQX05PSU8pOwotCQlpZiAoIXBlZXIpCi0JCQlnb3RvIGVub21lbTsKLQl9Ci0KLQkvKiBXZSBkb24ndCBoYXZlIGEgbWF0Y2hpbmcgcmVjb3JkIHlldC4gKi8KLQljb25uID0gcnhycGNfYWxsb2NfY29ubmVjdGlvbihHRlBfTk9JTyk7Ci0JaWYgKCFjb25uKQotCQlnb3RvIGVub21lbV9wZWVyOwotCiAJY29ubi0+cHJvdG8uZXBvY2gJPSBzcC0+aGRyLmVwb2NoOwogCWNvbm4tPnByb3RvLmNpZAkJPSBzcC0+aGRyLmNpZCAmIFJYUlBDX0NJRE1BU0s7Ci0JY29ubi0+cGFyYW1zLmxvY2FsCT0gbG9jYWw7Ci0JY29ubi0+cGFyYW1zLnBlZXIJPSBwZWVyOwogCWNvbm4tPnBhcmFtcy5zZXJ2aWNlX2lkCT0gc3AtPmhkci5zZXJ2aWNlSWQ7CiAJY29ubi0+c2VjdXJpdHlfaXgJPSBzcC0+aGRyLnNlY3VyaXR5SW5kZXg7CiAJY29ubi0+b3V0X2NsaWVudGZsYWcJPSAwOwotCWNvbm4tPnN0YXRlCQk9IFJYUlBDX0NPTk5fU0VSVklDRTsKLQlpZiAoY29ubi0+cGFyYW1zLnNlcnZpY2VfaWQpCisJaWYgKGNvbm4tPnNlY3VyaXR5X2l4KQogCQljb25uLT5zdGF0ZQk9IFJYUlBDX0NPTk5fU0VSVklDRV9VTlNFQ1VSRUQ7Ci0KLQlyeHJwY19nZXRfbG9jYWwobG9jYWwpOwotCi0Jd3JpdGVfbG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZjb25uLT5saW5rLCAmcnhycGNfY29ubmVjdGlvbnMpOwotCXdyaXRlX3VubG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKKwllbHNlCisJCWNvbm4tPnN0YXRlCT0gUlhSUENfQ09OTl9TRVJWSUNFOwogCiAJLyogTWFrZSB0aGUgY29ubmVjdGlvbiBhIHRhcmdldCBmb3IgaW5jb21pbmcgcGFja2V0cy4gKi8KLQlyeHJwY19wdWJsaXNoX3NlcnZpY2VfY29ubihwZWVyLCBjb25uKTsKKwlyeHJwY19wdWJsaXNoX3NlcnZpY2VfY29ubihjb25uLT5wYXJhbXMucGVlciwgY29ubik7CiAKLQluZXcgPSAibmV3IjsKLQotc3VjY2VzczoKLQlfbmV0KCJDT05ORUNUSU9OICVzICVkIHsleH0iLCBuZXcsIGNvbm4tPmRlYnVnX2lkLCBjb25uLT5wcm90by5jaWQpOwotCV9sZWF2ZSgiID0gJXAge3U9JWR9IiwgY29ubiwgYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSk7Ci0JcmV0dXJuIGNvbm47Ci0KLWZvdW5kX2V4dGFudF9jb25uZWN0aW9uX3JjdToKLQlyY3VfcmVhZF91bmxvY2soKTsKLQlnb3RvIHN1Y2Nlc3M7Ci0KLXNlY3VyaXR5X21pc21hdGNoX3JjdToKLQlyY3VfcmVhZF91bmxvY2soKTsKLQlfbGVhdmUoIiA9IC1FS0VZUkVKRUNURUQiKTsKLQlyZXR1cm4gRVJSX1BUUigtRUtFWVJFSkVDVEVEKTsKLQotZW5vbWVtX3BlZXI6Ci0JcnhycGNfcHV0X3BlZXIocGVlcik7Ci1lbm9tZW06Ci0JX2xlYXZlKCIgPSAtRU5PTUVNIik7Ci0JcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJX25ldCgiQ09OTkVDVElPTiBuZXcgJWQgeyV4fSIsIGNvbm4tPmRlYnVnX2lkLCBjb25uLT5wcm90by5jaWQpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2lucHV0LmMgYi9uZXQvcnhycGMvaW5wdXQuYwppbmRleCA5OTFhMjBkLi4zYWQ5Zjc1IDEwMDY0NAotLS0gYS9uZXQvcnhycGMvaW5wdXQuYworKysgYi9uZXQvcnhycGMvaW5wdXQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIFJ4UlBDIHBhY2tldCByZWNlcHRpb24KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDE2IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0yNyw1NjEgKzI3LDkyOCBAQAogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKIAotLyoKLSAqIHF1ZXVlIGEgcGFja2V0IGZvciByZWN2bXNnIHRvIHBhc3MgdG8gdXNlcnNwYWNlCi0gKiAtIHRoZSBjYWxsZXIgbXVzdCBob2xkIGEgbG9jayBvbiBjYWxsLT5sb2NrCi0gKiAtIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgKHNrX2ZpbHRlcigpIGRpc2FibGVzIEJIJ3MpCi0gKiAtIGVhdHMgdGhlIHBhY2tldCB3aGV0aGVyIHN1Y2Nlc3NmdWwgb3Igbm90Ci0gKiAtIHRoZXJlIG11c3QgYmUganVzdCBvbmUgcmVmZXJlbmNlIHRvIHRoZSBwYWNrZXQsIHdoaWNoIHRoZSBjYWxsZXIgcGFzc2VzIHRvCi0gKiAgIHRoaXMgZnVuY3Rpb24KLSAqLwotaW50IHJ4cnBjX3F1ZXVlX3Jjdl9za2Ioc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQlib29sIGZvcmNlLCBib29sIHRlcm1pbmFsKQorc3RhdGljIHZvaWQgcnhycGNfcHJvdG9fYWJvcnQoY29uc3QgY2hhciAqd2h5LAorCQkJICAgICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHJ4cnBjX3NlcV90IHNlcSkKIHsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCXN0cnVjdCByeHJwY19zb2NrICpyeCA9IGNhbGwtPnNvY2tldDsKLQlzdHJ1Y3Qgc29jayAqc2s7Ci0JaW50IHJldDsKLQotCV9lbnRlcigiLCwlZCwlZCIsIGZvcmNlLCB0ZXJtaW5hbCk7Ci0KLQlBU1NFUlQoIWlycXNfZGlzYWJsZWQoKSk7Ci0KLQlzcCA9IHJ4cnBjX3NrYihza2IpOwotCUFTU0VSVENNUChzcC0+Y2FsbCwgPT0sIGNhbGwpOwotCi0JLyogaWYgd2UndmUgYWxyZWFkeSBwb3N0ZWQgdGhlIHRlcm1pbmFsIG1lc3NhZ2UgZm9yIGEgY2FsbCwgdGhlbiB3ZQotCSAqIGRvbid0IHBvc3QgYW55IG1vcmUgKi8KLQlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9URVJNSU5BTF9NU0csICZjYWxsLT5mbGFncykpIHsKLQkJX2RlYnVnKCJhbHJlYWR5IHRlcm1pbmF0ZWQiKTsKLQkJQVNTRVJUQ01QKGNhbGwtPnN0YXRlLCA+PSwgUlhSUENfQ0FMTF9DT01QTEVURSk7Ci0JCXNrYi0+ZGVzdHJ1Y3RvciA9IE5VTEw7Ci0JCXNwLT5jYWxsID0gTlVMTDsKLQkJcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiAwOworCWlmIChyeHJwY19hYm9ydF9jYWxsKHdoeSwgY2FsbCwgc2VxLCBSWF9QUk9UT0NPTF9FUlJPUiwgRUJBRE1TRykpIHsKKwkJc2V0X2JpdChSWFJQQ19DQUxMX0VWX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKKwkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKIAl9Ci0KLQlzayA9ICZyeC0+c2s7Ci0KLQlpZiAoIWZvcmNlKSB7Ci0JCS8qIGNhc3Qgc2tiLT5yY3ZidWYgdG8gdW5zaWduZWQuLi4gIEl0J3MgcG9pbnRsZXNzLCBidXQKLQkJICogcmVkdWNlcyBudW1iZXIgb2Ygd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCAtVwotCQkgKiAtLUFOSyAqLwotLy8JCXJldCA9IC1FTk9CVUZTOwotLy8JCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpICsgc2tiLT50cnVlc2l6ZSA+PQotLy8JCSAgICAodW5zaWduZWQgaW50KSBzay0+c2tfcmN2YnVmKQotLy8JCQlnb3RvIG91dDsKLQotCQlyZXQgPSBza19maWx0ZXIoc2ssIHNrYik7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXQ7Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKLQlpZiAoIXRlc3RfYml0KFJYUlBDX0NBTExfVEVSTUlOQUxfTVNHLCAmY2FsbC0+ZmxhZ3MpICYmCi0JICAgICF0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpICYmCi0JICAgIGNhbGwtPnNvY2tldC0+c2suc2tfc3RhdGUgIT0gUlhSUENfQ0xPU0UpIHsKLQkJc2tiLT5kZXN0cnVjdG9yID0gcnhycGNfcGFja2V0X2Rlc3RydWN0b3I7Ci0JCXNrYi0+ZGV2ID0gTlVMTDsKLQkJc2tiLT5zayA9IHNrOwotCQlhdG9taWNfYWRkKHNrYi0+dHJ1ZXNpemUsICZzay0+c2tfcm1lbV9hbGxvYyk7Ci0KLQkJaWYgKHRlcm1pbmFsKSB7Ci0JCQlfZGVidWcoIjw8PDwgVEVSTUlOQUwgTUVTU0FHRSA+Pj4+Iik7Ci0JCQlzZXRfYml0KFJYUlBDX0NBTExfVEVSTUlOQUxfTVNHLCAmY2FsbC0+ZmxhZ3MpOwotCQl9Ci0KLQkJLyogYWxsb3cgaW50ZXJjZXB0aW9uIGJ5IGEga2VybmVsIHNlcnZpY2UgKi8KLQkJaWYgKHJ4LT5pbnRlcmNlcHRvcikgewotCQkJcngtPmludGVyY2VwdG9yKHNrLCBjYWxsLT51c2VyX2NhbGxfSUQsIHNrYik7Ci0JCQlzcGluX3VubG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7Ci0JCX0gZWxzZSB7Ci0JCQlfbmV0KCJwb3N0IHNrYiAlcCIsIHNrYik7Ci0JCQlfX3NrYl9xdWV1ZV90YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKLQotCQkJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCi0JCQkJc2stPnNrX2RhdGFfcmVhZHkoc2spOwotCQl9Ci0JCXNrYiA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJc3Bpbl91bmxvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOwotCX0KLQlyZXQgPSAwOwotCi1vdXQ6Ci0JLyogcmVsZWFzZSB0aGUgc29ja2V0IGJ1ZmZlciAqLwotCWlmIChza2IpIHsKLQkJc2tiLT5kZXN0cnVjdG9yID0gTlVMTDsKLQkJc3AtPmNhbGwgPSBOVUxMOwotCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKLQl9Ci0KLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwogfQogCiAvKgotICogcHJvY2VzcyBhIERBVEEgcGFja2V0LCBwb3N0aW5nIHRoZSBwYWNrZXQgdG8gdGhlIGFwcHJvcHJpYXRlIHF1ZXVlCi0gKiAtIGVhdHMgdGhlIHBhY2tldCBpZiBzdWNjZXNzZnVsCisgKiBEbyBUQ1Atc3R5bGUgY29uZ2VzdGlvbiBtYW5hZ2VtZW50IFtSRkMgNTY4MV0uCiAgKi8KLXN0YXRpYyBpbnQgcnhycGNfZmFzdF9wcm9jZXNzX2RhdGEoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHNlcSkKK3N0YXRpYyB2b2lkIHJ4cnBjX2Nvbmdlc3Rpb25fbWFuYWdlbWVudChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJc3RydWN0IHJ4cnBjX2Fja19zdW1tYXJ5ICpzdW1tYXJ5LAorCQkJCQlyeHJwY19zZXJpYWxfdCBhY2tlZF9zZXJpYWwpCiB7Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlib29sIHRlcm1pbmFsOwotCWludCByZXQsIGFja2JpdCwgYWNrOworCWVudW0gcnhycGNfY29uZ2VzdF9jaGFuZ2UgY2hhbmdlID0gcnhycGNfY29uZ19ub19jaGFuZ2U7CisJdW5zaWduZWQgaW50IGN1bXVsYXRpdmVfYWNrcyA9IGNhbGwtPmNvbmdfY3VtdWxfYWNrczsKKwl1bnNpZ25lZCBpbnQgY3duZCA9IGNhbGwtPmNvbmdfY3duZDsKKwlib29sIHJlc2VuZCA9IGZhbHNlOwogCi0JX2VudGVyKCJ7JXUsJXV9LCx7JXV9IiwgY2FsbC0+cnhfZGF0YV9wb3N0LCBjYWxsLT5yeF9maXJzdF9vb3MsIHNlcSk7CisJc3VtbWFyeS0+ZmxpZ2h0X3NpemUgPQorCQkoY2FsbC0+dHhfdG9wIC0gY2FsbC0+dHhfaGFyZF9hY2spIC0gc3VtbWFyeS0+bnJfYWNrczsKIAotCXNwID0gcnhycGNfc2tiKHNrYik7Ci0JQVNTRVJUQ01QKHNwLT5jYWxsLCA9PSwgTlVMTCk7Ci0KLQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCi0JaWYgKGNhbGwtPnN0YXRlID4gUlhSUENfQ0FMTF9DT01QTEVURSkKLQkJZ290byBkaXNjYXJkOwotCi0JQVNTRVJUQ01QKGNhbGwtPnJ4X2RhdGFfZXhwZWN0LCA+PSwgY2FsbC0+cnhfZGF0YV9wb3N0KTsKLQlBU1NFUlRDTVAoY2FsbC0+cnhfZGF0YV9wb3N0LCA+PSwgY2FsbC0+cnhfZGF0YV9yZWN2KTsKLQlBU1NFUlRDTVAoY2FsbC0+cnhfZGF0YV9yZWN2LCA+PSwgY2FsbC0+cnhfZGF0YV9lYXRlbik7Ci0KLQlpZiAoc2VxIDwgY2FsbC0+cnhfZGF0YV9wb3N0KSB7Ci0JCV9kZWJ1ZygiZHVwICMldSBbLSV1XSIsIHNlcSwgY2FsbC0+cnhfZGF0YV9wb3N0KTsKLQkJYWNrID0gUlhSUENfQUNLX0RVUExJQ0FURTsKLQkJcmV0ID0gLUVOT0JVRlM7Ci0JCWdvdG8gZGlzY2FyZF9hbmRfYWNrOwotCX0KLQotCS8qIHdlIG1heSBhbHJlYWR5IGhhdmUgdGhlIHBhY2tldCBpbiB0aGUgb3V0IG9mIHNlcXVlbmNlIHF1ZXVlICovCi0JYWNrYml0ID0gc2VxIC0gKGNhbGwtPnJ4X2RhdGFfZWF0ZW4gKyAxKTsKLQlBU1NFUlRDTVAoYWNrYml0LCA+PSwgMCk7Ci0JaWYgKF9fdGVzdF9hbmRfc2V0X2JpdChhY2tiaXQsIGNhbGwtPmFja3Jfd2luZG93KSkgewotCQlfZGVidWcoImR1cCBvb3MgIyV1IFsldSwldV0iLAotCQkgICAgICAgc2VxLCBjYWxsLT5yeF9kYXRhX2VhdGVuLCBjYWxsLT5yeF9kYXRhX3Bvc3QpOwotCQlhY2sgPSBSWFJQQ19BQ0tfRFVQTElDQVRFOwotCQlnb3RvIGRpc2NhcmRfYW5kX2FjazsKLQl9Ci0KLQlpZiAoc2VxID49IGNhbGwtPmFja3Jfd2luX3RvcCkgewotCQlfZGVidWcoImV4Y2VlZCAjJXUgWyV1XSIsIHNlcSwgY2FsbC0+YWNrcl93aW5fdG9wKTsKLQkJX19jbGVhcl9iaXQoYWNrYml0LCBjYWxsLT5hY2tyX3dpbmRvdyk7Ci0JCWFjayA9IFJYUlBDX0FDS19FWENFRURTX1dJTkRPVzsKLQkJZ290byBkaXNjYXJkX2FuZF9hY2s7Ci0JfQotCi0JaWYgKHNlcSA9PSBjYWxsLT5yeF9kYXRhX2V4cGVjdCkgewotCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9FWFBFQ1RfT09TLCAmY2FsbC0+ZmxhZ3MpOwotCQljYWxsLT5yeF9kYXRhX2V4cGVjdCsrOwotCX0gZWxzZSBpZiAoc2VxID4gY2FsbC0+cnhfZGF0YV9leHBlY3QpIHsKLQkJX2RlYnVnKCJvb3MgIyV1IFsldV0iLCBzZXEsIGNhbGwtPnJ4X2RhdGFfZXhwZWN0KTsKLQkJY2FsbC0+cnhfZGF0YV9leHBlY3QgPSBzZXEgKyAxOwotCQlpZiAodGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VYUEVDVF9PT1MsICZjYWxsLT5mbGFncykpIHsKLQkJCWFjayA9IFJYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0U7Ci0JCQlnb3RvIGVucXVldWVfYW5kX2FjazsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NBTExfUkVUUkFOU19USU1FT1VULCAmY2FsbC0+ZmxhZ3MpKSB7CisJCXN1bW1hcnktPnJldHJhbnNfdGltZW8gPSB0cnVlOworCQljYWxsLT5jb25nX3NzdGhyZXNoID0gbWF4X3QodW5zaWduZWQgaW50LAorCQkJCQkgICAgc3VtbWFyeS0+ZmxpZ2h0X3NpemUgLyAyLCAyKTsKKwkJY3duZCA9IDE7CisJCWlmIChjd25kID49IGNhbGwtPmNvbmdfc3N0aHJlc2ggJiYKKwkJICAgIGNhbGwtPmNvbmdfbW9kZSA9PSBSWFJQQ19DQUxMX1NMT1dfU1RBUlQpIHsKKwkJCWNhbGwtPmNvbmdfbW9kZSA9IFJYUlBDX0NBTExfQ09OR0VTVF9BVk9JREFOQ0U7CisJCQljYWxsLT5jb25nX3RzdGFtcCA9IHNrYi0+dHN0YW1wOworCQkJY3VtdWxhdGl2ZV9hY2tzID0gMDsKIAkJfQotCQlnb3RvIGVucXVldWVfcGFja2V0OwogCX0KIAotCWlmIChzZXEgIT0gY2FsbC0+cnhfZGF0YV9wb3N0KSB7Ci0JCV9kZWJ1ZygiYWhlYWQgIyV1IFsldV0iLCBzZXEsIGNhbGwtPnJ4X2RhdGFfcG9zdCk7Ci0JCWdvdG8gZW5xdWV1ZV9wYWNrZXQ7Ci0JfQorCWN1bXVsYXRpdmVfYWNrcyArPSBzdW1tYXJ5LT5ucl9uZXdfYWNrczsKKwljdW11bGF0aXZlX2Fja3MgKz0gc3VtbWFyeS0+bnJfcm90X25ld19hY2tzOworCWlmIChjdW11bGF0aXZlX2Fja3MgPiAyNTUpCisJCWN1bXVsYXRpdmVfYWNrcyA9IDI1NTsKIAotCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX1JDVkRfTEFTVCwgJmNhbGwtPmZsYWdzKSkKLQkJZ290byBwcm90b2NvbF9lcnJvcjsKKwlzdW1tYXJ5LT5tb2RlID0gY2FsbC0+Y29uZ19tb2RlOworCXN1bW1hcnktPmN3bmQgPSBjYWxsLT5jb25nX2N3bmQ7CisJc3VtbWFyeS0+c3N0aHJlc2ggPSBjYWxsLT5jb25nX3NzdGhyZXNoOworCXN1bW1hcnktPmN1bXVsYXRpdmVfYWNrcyA9IGN1bXVsYXRpdmVfYWNrczsKKwlzdW1tYXJ5LT5kdXBfYWNrcyA9IGNhbGwtPmNvbmdfZHVwX2Fja3M7CiAKLQkvKiBpZiB0aGUgcGFja2V0IG5lZWQgc2VjdXJpdHkgdGhpbmdzIGRvaW5nIHRvIGl0LCB0aGVuIGl0IGdvZXMgZG93bgotCSAqIHRoZSBzbG93IHBhdGggKi8KLQlpZiAoY2FsbC0+Y29ubi0+c2VjdXJpdHlfaXgpCi0JCWdvdG8gZW5xdWV1ZV9wYWNrZXQ7Ci0KLQlzcC0+Y2FsbCA9IGNhbGw7Ci0JcnhycGNfZ2V0X2NhbGwoY2FsbCk7Ci0JdGVybWluYWwgPSAoKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgJiYKLQkJICAgICEoc3AtPmhkci5mbGFncyAmIFJYUlBDX0NMSUVOVF9JTklUSUFURUQpKTsKLQlyZXQgPSByeHJwY19xdWV1ZV9yY3Zfc2tiKGNhbGwsIHNrYiwgZmFsc2UsIHRlcm1pbmFsKTsKLQlpZiAocmV0IDwgMCkgewotCQlpZiAocmV0ID09IC1FTk9NRU0gfHwgcmV0ID09IC1FTk9CVUZTKSB7Ci0JCQlfX2NsZWFyX2JpdChhY2tiaXQsIGNhbGwtPmFja3Jfd2luZG93KTsKLQkJCWFjayA9IFJYUlBDX0FDS19OT1NQQUNFOwotCQkJZ290byBkaXNjYXJkX2FuZF9hY2s7CisJc3dpdGNoIChjYWxsLT5jb25nX21vZGUpIHsKKwljYXNlIFJYUlBDX0NBTExfU0xPV19TVEFSVDoKKwkJaWYgKHN1bW1hcnktPm5yX25hY2tzID4gMCkKKwkJCWdvdG8gcGFja2V0X2xvc3NfZGV0ZWN0ZWQ7CisJCWlmIChzdW1tYXJ5LT5jdW11bGF0aXZlX2Fja3MgPiAwKQorCQkJY3duZCArPSAxOworCQlpZiAoY3duZCA+PSBjYWxsLT5jb25nX3NzdGhyZXNoKSB7CisJCQljYWxsLT5jb25nX21vZGUgPSBSWFJQQ19DQUxMX0NPTkdFU1RfQVZPSURBTkNFOworCQkJY2FsbC0+Y29uZ190c3RhbXAgPSBza2ItPnRzdGFtcDsKIAkJfQogCQlnb3RvIG91dDsKKworCWNhc2UgUlhSUENfQ0FMTF9DT05HRVNUX0FWT0lEQU5DRToKKwkJaWYgKHN1bW1hcnktPm5yX25hY2tzID4gMCkKKwkJCWdvdG8gcGFja2V0X2xvc3NfZGV0ZWN0ZWQ7CisKKwkJLyogV2UgYW5hbHlzZSB0aGUgbnVtYmVyIG9mIHBhY2tldHMgdGhhdCBnZXQgQUNLJ2QgcGVyIFJUVAorCQkgKiBwZXJpb2QgYW5kIGluY3JlYXNlIHRoZSB3aW5kb3cgaWYgd2UgbWFuYWdlZCB0byBmaWxsIGl0LgorCQkgKi8KKwkJaWYgKGNhbGwtPnBlZXItPnJ0dF91c2FnZSA9PSAwKQorCQkJZ290byBvdXQ7CisJCWlmIChrdGltZV9iZWZvcmUoc2tiLT50c3RhbXAsCisJCQkJIGt0aW1lX2FkZF9ucyhjYWxsLT5jb25nX3RzdGFtcCwKKwkJCQkJICAgICAgY2FsbC0+cGVlci0+cnR0KSkpCisJCQlnb3RvIG91dF9ub19jbGVhcl9jYTsKKwkJY2hhbmdlID0gcnhycGNfY29uZ19ydHRfd2luZG93X2VuZDsKKwkJY2FsbC0+Y29uZ190c3RhbXAgPSBza2ItPnRzdGFtcDsKKwkJaWYgKGN1bXVsYXRpdmVfYWNrcyA+PSBjd25kKQorCQkJY3duZCsrOworCQlnb3RvIG91dDsKKworCWNhc2UgUlhSUENfQ0FMTF9QQUNLRVRfTE9TUzoKKwkJaWYgKHN1bW1hcnktPm5yX25hY2tzID09IDApCisJCQlnb3RvIHJlc3VtZV9ub3JtYWxpdHk7CisKKwkJaWYgKHN1bW1hcnktPm5ld19sb3dfbmFjaykgeworCQkJY2hhbmdlID0gcnhycGNfY29uZ19uZXdfbG93X25hY2s7CisJCQljYWxsLT5jb25nX2R1cF9hY2tzID0gMTsKKwkJCWlmIChjYWxsLT5jb25nX2V4dHJhID4gMSkKKwkJCQljYWxsLT5jb25nX2V4dHJhID0gMTsKKwkJCWdvdG8gc2VuZF9leHRyYV9kYXRhOworCQl9CisKKwkJY2FsbC0+Y29uZ19kdXBfYWNrcysrOworCQlpZiAoY2FsbC0+Y29uZ19kdXBfYWNrcyA8IDMpCisJCQlnb3RvIHNlbmRfZXh0cmFfZGF0YTsKKworCQljaGFuZ2UgPSByeHJwY19jb25nX2JlZ2luX3JldHJhbnNtaXNzaW9uOworCQljYWxsLT5jb25nX21vZGUgPSBSWFJQQ19DQUxMX0ZBU1RfUkVUUkFOU01JVDsKKwkJY2FsbC0+Y29uZ19zc3RocmVzaCA9IG1heF90KHVuc2lnbmVkIGludCwKKwkJCQkJICAgIHN1bW1hcnktPmZsaWdodF9zaXplIC8gMiwgMik7CisJCWN3bmQgPSBjYWxsLT5jb25nX3NzdGhyZXNoICsgMzsKKwkJY2FsbC0+Y29uZ19leHRyYSA9IDA7CisJCWNhbGwtPmNvbmdfZHVwX2Fja3MgPSAwOworCQlyZXNlbmQgPSB0cnVlOworCQlnb3RvIG91dDsKKworCWNhc2UgUlhSUENfQ0FMTF9GQVNUX1JFVFJBTlNNSVQ6CisJCWlmICghc3VtbWFyeS0+bmV3X2xvd19uYWNrKSB7CisJCQlpZiAoc3VtbWFyeS0+bnJfbmV3X2Fja3MgPT0gMCkKKwkJCQljd25kICs9IDE7CisJCQljYWxsLT5jb25nX2R1cF9hY2tzKys7CisJCQlpZiAoY2FsbC0+Y29uZ19kdXBfYWNrcyA9PSAyKSB7CisJCQkJY2hhbmdlID0gcnhycGNfY29uZ19yZXRyYW5zbWl0X2FnYWluOworCQkJCWNhbGwtPmNvbmdfZHVwX2Fja3MgPSAwOworCQkJCXJlc2VuZCA9IHRydWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQljaGFuZ2UgPSByeHJwY19jb25nX3Byb2dyZXNzOworCQkJY3duZCA9IGNhbGwtPmNvbmdfc3N0aHJlc2g7CisJCQlpZiAoc3VtbWFyeS0+bnJfbmFja3MgPT0gMCkKKwkJCQlnb3RvIHJlc3VtZV9ub3JtYWxpdHk7CisJCX0KKwkJZ290byBvdXQ7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJZ290byBvdXQ7CiAJfQogCi0Jc2tiID0gTlVMTDsKLQotCV9kZWJ1ZygicG9zdCAjJXUiLCBzZXEpOwotCUFTU0VSVENNUChjYWxsLT5yeF9kYXRhX3Bvc3QsID09LCBzZXEpOwotCWNhbGwtPnJ4X2RhdGFfcG9zdCsrOwotCi0JaWYgKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkKLQkJc2V0X2JpdChSWFJQQ19DQUxMX1JDVkRfTEFTVCwgJmNhbGwtPmZsYWdzKTsKLQotCS8qIGlmIHdlJ3ZlIHJlYWNoZWQgYW4gb3V0IG9mIHNlcXVlbmNlIHBhY2tldCB0aGVuIHdlIG5lZWQgdG8gZHJhaW4KLQkgKiB0aGF0IHF1ZXVlIGludG8gdGhlIHNvY2tldCBSeCBxdWV1ZSBub3cgKi8KLQlpZiAoY2FsbC0+cnhfZGF0YV9wb3N0ID09IGNhbGwtPnJ4X2ZpcnN0X29vcykgewotCQlfZGVidWcoImRyYWluIHJ4IG9vcyBub3ciKTsKLQkJcmVhZF9sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQkJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSAmJgotCQkgICAgIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9EUkFJTl9SWF9PT1MsICZjYWxsLT5ldmVudHMpKQotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQkJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCX0KLQotCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQlhdG9taWNfaW5jKCZjYWxsLT5hY2tyX25vdF9pZGxlKTsKLQlyeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBSWFJQQ19BQ0tfREVMQVksIHNwLT5oZHIuc2VyaWFsLCBmYWxzZSk7Ci0JX2xlYXZlKCIgPSAwIFtwb3N0ZWRdIik7Ci0JcmV0dXJuIDA7Ci0KLXByb3RvY29sX2Vycm9yOgotCXJldCA9IC1FQkFETVNHOworcmVzdW1lX25vcm1hbGl0eToKKwljaGFuZ2UgPSByeHJwY19jb25nX2NsZWFyZWRfbmFja3M7CisJY2FsbC0+Y29uZ19kdXBfYWNrcyA9IDA7CisJY2FsbC0+Y29uZ19leHRyYSA9IDA7CisJY2FsbC0+Y29uZ190c3RhbXAgPSBza2ItPnRzdGFtcDsKKwlpZiAoY3duZCA8IGNhbGwtPmNvbmdfc3N0aHJlc2gpCisJCWNhbGwtPmNvbmdfbW9kZSA9IFJYUlBDX0NBTExfU0xPV19TVEFSVDsKKwllbHNlCisJCWNhbGwtPmNvbmdfbW9kZSA9IFJYUlBDX0NBTExfQ09OR0VTVF9BVk9JREFOQ0U7CiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci0KLWRpc2NhcmRfYW5kX2FjazoKLQlfZGVidWcoImRpc2NhcmQgYW5kIEFDSyBwYWNrZXQgJXAiLCBza2IpOwotCV9fcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgYWNrLCBzcC0+aGRyLnNlcmlhbCwgdHJ1ZSk7Ci1kaXNjYXJkOgotCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQlyeHJwY19mcmVlX3NrYihza2IpOwotCV9sZWF2ZSgiID0gMCBbZGlzY2FyZGVkXSIpOwotCXJldHVybiAwOwotCi1lbnF1ZXVlX2FuZF9hY2s6Ci0JX19yeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBhY2ssIHNwLT5oZHIuc2VyaWFsLCB0cnVlKTsKLWVucXVldWVfcGFja2V0OgotCV9uZXQoImRlZmVyIHNrYiAlcCIsIHNrYik7Ci0Jc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCXNrYl9xdWV1ZV90YWlsKCZjYWxsLT5yeF9xdWV1ZSwgc2tiKTsKLQlhdG9taWNfaW5jKCZjYWxsLT5hY2tyX25vdF9pZGxlKTsKLQlyZWFkX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfREVBRCkKKwljdW11bGF0aXZlX2Fja3MgPSAwOworb3V0X25vX2NsZWFyX2NhOgorCWlmIChjd25kID49IFJYUlBDX1JYVFhfQlVGRl9TSVpFIC0gMSkKKwkJY3duZCA9IFJYUlBDX1JYVFhfQlVGRl9TSVpFIC0gMTsKKwljYWxsLT5jb25nX2N3bmQgPSBjd25kOworCWNhbGwtPmNvbmdfY3VtdWxfYWNrcyA9IGN1bXVsYXRpdmVfYWNrczsKKwl0cmFjZV9yeHJwY19jb25nZXN0KGNhbGwsIHN1bW1hcnksIGFja2VkX3NlcmlhbCwgY2hhbmdlKTsKKwlpZiAocmVzZW5kICYmICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfUkVTRU5ELCAmY2FsbC0+ZXZlbnRzKSkKIAkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQlyZWFkX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7Ci0JX2xlYXZlKCIgPSAwIFtxdWV1ZWRdIik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuOworCitwYWNrZXRfbG9zc19kZXRlY3RlZDoKKwljaGFuZ2UgPSByeHJwY19jb25nX3Nhd19uYWNrOworCWNhbGwtPmNvbmdfbW9kZSA9IFJYUlBDX0NBTExfUEFDS0VUX0xPU1M7CisJY2FsbC0+Y29uZ19kdXBfYWNrcyA9IDA7CisJZ290byBzZW5kX2V4dHJhX2RhdGE7CisKK3NlbmRfZXh0cmFfZGF0YToKKwkvKiBTZW5kIHNvbWUgcHJldmlvdXNseSB1bnNlbnQgREFUQSBpZiB3ZSBoYXZlIHNvbWUgdG8gYWR2YW5jZSB0aGUgQUNLCisJICogc3RhdGUuCisJICovCisJaWYgKGNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbY2FsbC0+dHhfdG9wICYgUlhSUENfUlhUWF9CVUZGX01BU0tdICYKKwkgICAgUlhSUENfVFhfQU5OT19MQVNUIHx8CisJICAgIHN1bW1hcnktPm5yX2Fja3MgIT0gY2FsbC0+dHhfdG9wIC0gY2FsbC0+dHhfaGFyZF9hY2spIHsKKwkJY2FsbC0+Y29uZ19leHRyYSsrOworCQl3YWtlX3VwKCZjYWxsLT53YWl0cSk7CisJfQorCWdvdG8gb3V0X25vX2NsZWFyX2NhOwogfQogCiAvKgotICogYXNzdW1lIGFuIGltcGxpY2l0IEFDS0FMTCBvZiB0aGUgdHJhbnNtaXNzaW9uIHBoYXNlIG9mIGEgY2xpZW50IHNvY2tldCB1cG9uCi0gKiByZWNlcHRpb24gb2YgdGhlIGZpcnN0IHJlcGx5IHBhY2tldAorICogUGluZyB0aGUgb3RoZXIgZW5kIHRvIGZpbGwgb3VyIFJUVCBjYWNoZSBhbmQgdG8gcmV0cmlldmUgdGhlIHJ3aW5kCisgKiBhbmQgTVRVIHBhcmFtZXRlcnMuCiAgKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX2Fzc3VtZV9pbXBsaWNpdF9hY2thbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHUzMiBzZXJpYWwpCitzdGF0aWMgdm9pZCByeHJwY19zZW5kX3Bpbmcoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgaW50IHNrZXcpCiB7Ci0Jd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOworCWt0aW1lX3Qgbm93ID0gc2tiLT50c3RhbXA7CisKKwlpZiAoY2FsbC0+cGVlci0+cnR0X3VzYWdlIDwgMyB8fAorCSAgICBrdGltZV9iZWZvcmUoa3RpbWVfYWRkX21zKGNhbGwtPnBlZXItPnJ0dF9sYXN0X3JlcSwgMTAwMCksIG5vdykpCisJCXJ4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIFJYUlBDX0FDS19QSU5HLCBza2V3LCBzcC0+aGRyLnNlcmlhbCwKKwkJCQkgIHRydWUsIHRydWUsCisJCQkJICByeHJwY19wcm9wb3NlX2Fja19waW5nX2Zvcl9wYXJhbXMpOworfQorCisvKgorICogQXBwbHkgYSBoYXJkIEFDSyBieSBhZHZhbmNpbmcgdGhlIFR4IHdpbmRvdy4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfcm90YXRlX3R4X3dpbmRvdyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgcnhycGNfc2VxX3QgdG8sCisJCQkJICAgc3RydWN0IHJ4cnBjX2Fja19zdW1tYXJ5ICpzdW1tYXJ5KQoreworCXN0cnVjdCBza19idWZmICpza2IsICpsaXN0ID0gTlVMTDsKKwlpbnQgaXg7CisJdTggYW5ub3RhdGlvbjsKKworCWlmIChjYWxsLT5hY2tzX2xvd2VzdF9uYWsgPT0gY2FsbC0+dHhfaGFyZF9hY2spIHsKKwkJY2FsbC0+YWNrc19sb3dlc3RfbmFrID0gdG87CisJfSBlbHNlIGlmIChiZWZvcmVfZXEoY2FsbC0+YWNrc19sb3dlc3RfbmFrLCB0bykpIHsKKwkJc3VtbWFyeS0+bmV3X2xvd19uYWNrID0gdHJ1ZTsKKwkJY2FsbC0+YWNrc19sb3dlc3RfbmFrID0gdG87CisJfQorCisJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKKworCXdoaWxlIChiZWZvcmUoY2FsbC0+dHhfaGFyZF9hY2ssIHRvKSkgeworCQljYWxsLT50eF9oYXJkX2FjaysrOworCQlpeCA9IGNhbGwtPnR4X2hhcmRfYWNrICYgUlhSUENfUlhUWF9CVUZGX01BU0s7CisJCXNrYiA9IGNhbGwtPnJ4dHhfYnVmZmVyW2l4XTsKKwkJYW5ub3RhdGlvbiA9IGNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbaXhdOworCQlyeHJwY19zZWVfc2tiKHNrYiwgcnhycGNfc2tiX3R4X3JvdGF0ZWQpOworCQljYWxsLT5yeHR4X2J1ZmZlcltpeF0gPSBOVUxMOworCQljYWxsLT5yeHR4X2Fubm90YXRpb25zW2l4XSA9IDA7CisJCXNrYi0+bmV4dCA9IGxpc3Q7CisJCWxpc3QgPSBza2I7CisKKwkJaWYgKGFubm90YXRpb24gJiBSWFJQQ19UWF9BTk5PX0xBU1QpCisJCQlzZXRfYml0KFJYUlBDX0NBTExfVFhfTEFTVCwgJmNhbGwtPmZsYWdzKTsKKwkJaWYgKChhbm5vdGF0aW9uICYgUlhSUENfVFhfQU5OT19NQVNLKSAhPSBSWFJQQ19UWF9BTk5PX0FDSykKKwkJCXN1bW1hcnktPm5yX3JvdF9uZXdfYWNrcysrOworCX0KKworCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKKworCXRyYWNlX3J4cnBjX3RyYW5zbWl0KGNhbGwsICh0ZXN0X2JpdChSWFJQQ19DQUxMX1RYX0xBU1QsICZjYWxsLT5mbGFncykgPworCQkJCSAgICByeHJwY190cmFuc21pdF9yb3RhdGVfbGFzdCA6CisJCQkJICAgIHJ4cnBjX3RyYW5zbWl0X3JvdGF0ZSkpOworCXdha2VfdXAoJmNhbGwtPndhaXRxKTsKKworCXdoaWxlIChsaXN0KSB7CisJCXNrYiA9IGxpc3Q7CisJCWxpc3QgPSBza2ItPm5leHQ7CisJCXNrYi0+bmV4dCA9IE5VTEw7CisJCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3R4X2ZyZWVkKTsKKwl9Cit9CisKKy8qCisgKiBFbmQgdGhlIHRyYW5zbWlzc2lvbiBwaGFzZSBvZiBhIGNhbGwuCisgKgorICogVGhpcyBvY2N1cnMgd2hlbiB3ZSBnZXQgYW4gQUNLQUxMIHBhY2tldCwgdGhlIGZpcnN0IERBVEEgcGFja2V0IG9mIGEgcmVwbHksCisgKiBvciBhIGZpbmFsIEFDSyBwYWNrZXQuCisgKi8KK3N0YXRpYyBib29sIHJ4cnBjX2VuZF90eF9waGFzZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgYm9vbCByZXBseV9iZWd1biwKKwkJCSAgICAgICBjb25zdCBjaGFyICphYm9ydF93aHkpCit7CisKKwlBU1NFUlQodGVzdF9iaXQoUlhSUENfQ0FMTF9UWF9MQVNULCAmY2FsbC0+ZmxhZ3MpKTsKKworCXdyaXRlX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOwogCiAJc3dpdGNoIChjYWxsLT5zdGF0ZSkgeworCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUOgogCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFk6Ci0JCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWTsKLQkJY2FsbC0+YWNrc19sYXRlc3QgPSBzZXJpYWw7CisJCWlmIChyZXBseV9iZWd1bikKKwkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWTsKKwkJZWxzZQorCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWTsKKwkJYnJlYWs7CiAKLQkJX2RlYnVnKCJpbXBsaWNpdCBBQ0tBTEwgJSUldSIsIGNhbGwtPmFja3NfbGF0ZXN0KTsKLQkJc2V0X2JpdChSWFJQQ19DQUxMX0VWX1JDVkRfQUNLQUxMLCAmY2FsbC0+ZXZlbnRzKTsKLQkJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQotCQlpZiAodHJ5X3RvX2RlbF90aW1lcl9zeW5jKCZjYWxsLT5yZXNlbmRfdGltZXIpID49IDApIHsKLQkJCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JFU0VORF9USU1FUiwgJmNhbGwtPmV2ZW50cyk7Ci0JCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9FVl9SRVNFTkQsICZjYWxsLT5ldmVudHMpOwotCQkJY2xlYXJfYml0KFJYUlBDX0NBTExfUlVOX1JUSU1FUiwgJmNhbGwtPmZsYWdzKTsKLQkJfQorCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQVdBSVRfQUNLOgorCQlfX3J4cnBjX2NhbGxfY29tcGxldGVkKGNhbGwpOworCQlyeHJwY19ub3RpZnlfc29ja2V0KGNhbGwpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCWJyZWFrOworCQlnb3RvIGJhZF9zdGF0ZTsKKwl9CisKKwl3cml0ZV91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCWlmIChjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWSkgeworCQlyeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBSWFJQQ19BQ0tfSURMRSwgMCwgMCwgZmFsc2UsIHRydWUsCisJCQkJICByeHJwY19wcm9wb3NlX2Fja19jbGllbnRfdHhfZW5kKTsKKwkJdHJhY2VfcnhycGNfdHJhbnNtaXQoY2FsbCwgcnhycGNfdHJhbnNtaXRfYXdhaXRfcmVwbHkpOworCX0gZWxzZSB7CisJCXRyYWNlX3J4cnBjX3RyYW5zbWl0KGNhbGwsIHJ4cnBjX3RyYW5zbWl0X2VuZCk7CisJfQorCV9sZWF2ZSgiID0gb2siKTsKKwlyZXR1cm4gdHJ1ZTsKKworYmFkX3N0YXRlOgorCXdyaXRlX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJa2RlYnVnKCJlbmRfdHggJXMiLCByeHJwY19jYWxsX3N0YXRlc1tjYWxsLT5zdGF0ZV0pOworCXJ4cnBjX3Byb3RvX2Fib3J0KGFib3J0X3doeSwgY2FsbCwgY2FsbC0+dHhfdG9wKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiBCZWdpbiB0aGUgcmVwbHkgcmVjZXB0aW9uIHBoYXNlIG9mIGEgY2FsbC4KKyAqLworc3RhdGljIGJvb2wgcnhycGNfcmVjZWl2aW5nX3JlcGx5KHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXN0cnVjdCByeHJwY19hY2tfc3VtbWFyeSBzdW1tYXJ5ID0geyAwIH07CisJcnhycGNfc2VxX3QgdG9wID0gUkVBRF9PTkNFKGNhbGwtPnR4X3RvcCk7CisKKwlpZiAoY2FsbC0+YWNrcl9yZWFzb24pIHsKKwkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwkJY2FsbC0+YWNrcl9yZWFzb24gPSAwOworCQljYWxsLT5yZXNlbmRfYXQgPSBjYWxsLT5leHBpcmVfYXQ7CisJCWNhbGwtPmFja19hdCA9IGNhbGwtPmV4cGlyZV9hdDsKKwkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOworCQlyeHJwY19zZXRfdGltZXIoY2FsbCwgcnhycGNfdGltZXJfaW5pdF9mb3JfcmVwbHksCisJCQkJa3RpbWVfZ2V0X3JlYWwoKSk7CisJfQorCisJaWYgKCF0ZXN0X2JpdChSWFJQQ19DQUxMX1RYX0xBU1QsICZjYWxsLT5mbGFncykpCisJCXJ4cnBjX3JvdGF0ZV90eF93aW5kb3coY2FsbCwgdG9wLCAmc3VtbWFyeSk7CisJaWYgKCF0ZXN0X2JpdChSWFJQQ19DQUxMX1RYX0xBU1QsICZjYWxsLT5mbGFncykpIHsKKwkJcnhycGNfcHJvdG9fYWJvcnQoIlRYTCIsIGNhbGwsIHRvcCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKCFyeHJwY19lbmRfdHhfcGhhc2UoY2FsbCwgdHJ1ZSwgIkVURCIpKQorCQlyZXR1cm4gZmFsc2U7CisJY2FsbC0+dHhfcGhhc2UgPSBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFNjYW4gYSBqdW1ibyBwYWNrZXQgdG8gdmFsaWRhdGUgaXRzIHN0cnVjdHVyZSBhbmQgdG8gd29yayBvdXQgaG93IG1hbnkKKyAqIHN1YnBhY2tldHMgaXQgY29udGFpbnMuCisgKgorICogQSBqdW1ibyBwYWNrZXQgaXMgYSBjb2xsZWN0aW9uIG9mIGNvbnNlY3V0aXZlIHBhY2tldHMgZ2x1ZWQgdG9nZXRoZXIgd2l0aAorICogbGl0dGxlIGhlYWRlcnMgYmV0d2VlbiB0aGF0IGluZGljYXRlIGhvdyB0byBjaGFuZ2UgdGhlIGluaXRpYWwgaGVhZGVyIGZvcgorICogZWFjaCBzdWJwYWNrZXQuCisgKgorICogUlhSUENfSlVNQk9fUEFDS0VUIG11c3QgYmUgc2V0IG9uIGFsbCBidXQgdGhlIGxhc3Qgc3VicGFja2V0IC0gYW5kIGFsbCBidXQKKyAqIHRoZSBsYXN0IGFyZSBSWFJQQ19KVU1CT19EQVRBTEVOIGluIHNpemUuICBUaGUgbGFzdCBzdWJwYWNrZXQgbWF5IGJlIG9mIGFueQorICogc2l6ZS4KKyAqLworc3RhdGljIGJvb2wgcnhycGNfdmFsaWRhdGVfanVtYm8oc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpOworCXVuc2lnbmVkIGludCBsZW4gPSBza2ItPmxlbjsKKwlpbnQgbnJfanVtYm8gPSAxOworCXU4IGZsYWdzID0gc3AtPmhkci5mbGFnczsKKworCWRvIHsKKwkJbnJfanVtYm8rKzsKKwkJaWYgKGxlbiAtIG9mZnNldCA8IFJYUlBDX0pVTUJPX1NVQlBLVExFTikKKwkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJCWlmIChmbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKQorCQkJZ290byBwcm90b2NvbF9lcnJvcjsKKwkJb2Zmc2V0ICs9IFJYUlBDX0pVTUJPX0RBVEFMRU47CisJCWlmIChza2JfY29weV9iaXRzKHNrYiwgb2Zmc2V0LCAmZmxhZ3MsIDEpIDwgMCkKKwkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJCW9mZnNldCArPSBzaXplb2Yoc3RydWN0IHJ4cnBjX2p1bWJvX2hlYWRlcik7CisJfSB3aGlsZSAoZmxhZ3MgJiBSWFJQQ19KVU1CT19QQUNLRVQpOworCisJc3AtPm5yX2p1bWJvID0gbnJfanVtYm87CisJcmV0dXJuIHRydWU7CisKK3Byb3RvY29sX2Vycm9yOgorCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIEhhbmRsZSByZWNlcHRpb24gb2YgYSBkdXBsaWNhdGUgcGFja2V0LgorICoKKyAqIFdlIGhhdmUgdG8gdGFrZSBjYXJlIHRvIGF2b2lkIGFuIGF0dGFjayBoZXJlIHdoZXJlYnkgd2UncmUgZ2l2ZW4gYSBzZXJpZXMgb2YKKyAqIGp1bWJvZ3JhbXMsIGVhY2ggd2l0aCBhIHNlcXVlbmNlIG51bWJlciBvbmUgYmVmb3JlIHRoZSBwcmVjZWRpbmcgb25lIGFuZAorICogZmlsbGVkIHVwIHRvIG1heGltdW0gVURQIHNpemUuICBJZiB0aGV5IG5ldmVyIHNlbmQgdXMgdGhlIGZpcnN0IHBhY2tldCBpbgorICogdGhlIHNlcXVlbmNlLCB0aGV5IGNhbiBjYXVzZSB1cyB0byBoYXZlIHRvIGhvbGQgb24gdG8gYXJvdW5kIDJNaUIgb2Yga2VybmVsCisgKiBzcGFjZSB1bnRpbCB0aGUgY2FsbCB0aW1lcyBvdXQuCisgKgorICogV2UgbGltaXQgdGhlIHNwYWNlIHVzYWdlIGJ5IG9ubHkgYWNjZXB0aW5nIHRocmVlIGR1cGxpY2F0ZSBqdW1ibyBwYWNrZXRzIHBlcgorICogY2FsbC4gIEFmdGVyIHRoYXQsIHdlIHRlbGwgdGhlIG90aGVyIHNpZGUgd2UncmUgbm8gbG9uZ2VyIGFjY2VwdGluZyBqdW1ib3MKKyAqICh0aGF0IGluZm9ybWF0aW9uIGlzIGVuY29kZWQgaW4gdGhlIEFDSyBwYWNrZXQpLgorICovCitzdGF0aWMgdm9pZCByeHJwY19pbnB1dF9kdXBfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgcnhycGNfc2VxX3Qgc2VxLAorCQkJCSB1OCBhbm5vdGF0aW9uLCBib29sICpfanVtYm9fYmFkKQoreworCS8qIERpc2NhcmQgbm9ybWFsIHBhY2tldHMgdGhhdCBhcmUgZHVwbGljYXRlcy4gKi8KKwlpZiAoYW5ub3RhdGlvbiA9PSAwKQorCQlyZXR1cm47CisKKwkvKiBTa2lwIGp1bWJvIHN1YnBhY2tldHMgdGhhdCBhcmUgZHVwbGljYXRlcy4gIFdoZW4gd2UndmUgaGFkIHRocmVlIG9yCisJICogbW9yZSBwYXJ0aWFsbHkgZHVwbGljYXRlIGp1bWJvIHBhY2tldHMsIHdlIHJlZnVzZSB0byB0YWtlIGFueSBtb3JlCisJICoganVtYm9zIGZvciB0aGlzIGNhbGwuCisJICovCisJaWYgKCEqX2p1bWJvX2JhZCkgeworCQljYWxsLT5ucl9qdW1ib19iYWQrKzsKKwkJKl9qdW1ib19iYWQgPSB0cnVlOwogCX0KIH0KIAogLyoKLSAqIHBvc3QgYW4gaW5jb21pbmcgcGFja2V0IHRvIHRoZSBub21pbmF0ZWQgY2FsbCB0byBkZWFsIHdpdGgKLSAqIC0gbXVzdCBnZXQgcmlkIG9mIHRoZSBza19idWZmLCBlaXRoZXIgYnkgZnJlZWluZyBpdCBvciBieSBxdWV1aW5nIGl0CisgKiBQcm9jZXNzIGEgREFUQSBwYWNrZXQsIGFkZGluZyB0aGUgcGFja2V0IHRvIHRoZSBSeCByaW5nLgogICovCi12b2lkIHJ4cnBjX2Zhc3RfcHJvY2Vzc19wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCByeHJwY19pbnB1dF9kYXRhKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICB1MTYgc2tldykKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpOworCXVuc2lnbmVkIGludCBpeDsKKwlyeHJwY19zZXJpYWxfdCBzZXJpYWwgPSBzcC0+aGRyLnNlcmlhbCwgYWNrX3NlcmlhbCA9IDA7CisJcnhycGNfc2VxX3Qgc2VxID0gc3AtPmhkci5zZXEsIGhhcmRfYWNrOworCWJvb2wgaW1tZWRpYXRlX2FjayA9IGZhbHNlLCBqdW1ib19iYWQgPSBmYWxzZSwgcXVldWVkOworCXUxNiBsZW47CisJdTggYWNrID0gMCwgZmxhZ3MsIGFubm90YXRpb24gPSAwOworCisJX2VudGVyKCJ7JXUsJXV9LHsldSwldX0iLAorCSAgICAgICBjYWxsLT5yeF9oYXJkX2FjaywgY2FsbC0+cnhfdG9wLCBza2ItPmxlbiwgc2VxKTsKKworCV9wcm90bygiUnggREFUQSAlJSV1IHsgIyV1IGY9JTAyeCB9IiwKKwkgICAgICAgc3AtPmhkci5zZXJpYWwsIHNlcSwgc3AtPmhkci5mbGFncyk7CisKKwlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9DT01QTEVURSkKKwkJcmV0dXJuOworCisJLyogUmVjZWl2ZWQgZGF0YSBpbXBsaWNpdGx5IEFDS3MgYWxsIG9mIHRoZSByZXF1ZXN0IHBhY2tldHMgd2Ugc2VudAorCSAqIHdoZW4gd2UncmUgYWN0aW5nIGFzIGEgY2xpZW50LgorCSAqLworCWlmICgoY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUIHx8CisJICAgICBjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWSkgJiYKKwkgICAgIXJ4cnBjX3JlY2VpdmluZ19yZXBseShjYWxsKSkKKwkJcmV0dXJuOworCisJY2FsbC0+YWNrcl9wcmV2X3NlcSA9IHNlcTsKKworCWhhcmRfYWNrID0gUkVBRF9PTkNFKGNhbGwtPnJ4X2hhcmRfYWNrKTsKKwlpZiAoYWZ0ZXIoc2VxLCBoYXJkX2FjayArIGNhbGwtPnJ4X3dpbnNpemUpKSB7CisJCWFjayA9IFJYUlBDX0FDS19FWENFRURTX1dJTkRPVzsKKwkJYWNrX3NlcmlhbCA9IHNlcmlhbDsKKwkJZ290byBhY2s7CisJfQorCisJZmxhZ3MgPSBzcC0+aGRyLmZsYWdzOworCWlmIChmbGFncyAmIFJYUlBDX0pVTUJPX1BBQ0tFVCkgeworCQlpZiAoY2FsbC0+bnJfanVtYm9fYmFkID4gMykgeworCQkJYWNrID0gUlhSUENfQUNLX05PU1BBQ0U7CisJCQlhY2tfc2VyaWFsID0gc2VyaWFsOworCQkJZ290byBhY2s7CisJCX0KKwkJYW5ub3RhdGlvbiA9IDE7CisJfQorCituZXh0X3N1YnBhY2tldDoKKwlxdWV1ZWQgPSBmYWxzZTsKKwlpeCA9IHNlcSAmIFJYUlBDX1JYVFhfQlVGRl9NQVNLOworCWxlbiA9IHNrYi0+bGVuOworCWlmIChmbGFncyAmIFJYUlBDX0pVTUJPX1BBQ0tFVCkKKwkJbGVuID0gUlhSUENfSlVNQk9fREFUQUxFTjsKKworCWlmIChmbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKSB7CisJCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX1JYX0xBU1QsICZjYWxsLT5mbGFncykgJiYKKwkJICAgIHNlcSAhPSBjYWxsLT5yeF90b3ApCisJCQlyZXR1cm4gcnhycGNfcHJvdG9fYWJvcnQoIkxTTiIsIGNhbGwsIHNlcSk7CisJfSBlbHNlIHsKKwkJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfUlhfTEFTVCwgJmNhbGwtPmZsYWdzKSAmJgorCQkgICAgYWZ0ZXJfZXEoc2VxLCBjYWxsLT5yeF90b3ApKQorCQkJcmV0dXJuIHJ4cnBjX3Byb3RvX2Fib3J0KCJMU0EiLCBjYWxsLCBzZXEpOworCX0KKworCWlmIChiZWZvcmVfZXEoc2VxLCBoYXJkX2FjaykpIHsKKwkJYWNrID0gUlhSUENfQUNLX0RVUExJQ0FURTsKKwkJYWNrX3NlcmlhbCA9IHNlcmlhbDsKKwkJZ290byBza2lwOworCX0KKworCWlmIChmbGFncyAmIFJYUlBDX1JFUVVFU1RfQUNLICYmICFhY2spIHsKKwkJYWNrID0gUlhSUENfQUNLX1JFUVVFU1RFRDsKKwkJYWNrX3NlcmlhbCA9IHNlcmlhbDsKKwl9CisKKwlpZiAoY2FsbC0+cnh0eF9idWZmZXJbaXhdKSB7CisJCXJ4cnBjX2lucHV0X2R1cF9kYXRhKGNhbGwsIHNlcSwgYW5ub3RhdGlvbiwgJmp1bWJvX2JhZCk7CisJCWlmIChhY2sgIT0gUlhSUENfQUNLX0RVUExJQ0FURSkgeworCQkJYWNrID0gUlhSUENfQUNLX0RVUExJQ0FURTsKKwkJCWFja19zZXJpYWwgPSBzZXJpYWw7CisJCX0KKwkJaW1tZWRpYXRlX2FjayA9IHRydWU7CisJCWdvdG8gc2tpcDsKKwl9CisKKwkvKiBRdWV1ZSB0aGUgcGFja2V0LiAgV2UgdXNlIGEgY291cGxlIG9mIG1lbW9yeSBiYXJyaWVycyBoZXJlIGFzIG5lZWQKKwkgKiB0byBtYWtlIHN1cmUgdGhhdCByeF90b3AgaXMgcGVyY2VpdmVkIHRvIGJlIHNldCBhZnRlciB0aGUgYnVmZmVyCisJICogcG9pbnRlciBhbmQgdGhhdCB0aGUgYnVmZmVyIHBvaW50ZXIgaXMgc2V0IGFmdGVyIHRoZSBhbm5vdGF0aW9uIGFuZAorCSAqIHRoZSBza2IgZGF0YS4KKwkgKgorCSAqIEJhcnJpZXJzIGFnYWluc3QgcnhycGNfcmVjdm1zZ19kYXRhKCkgYW5kIHJ4cnBjX3JvdGF0ZV9yeF93aW5kb3coKQorCSAqIGFuZCBhbHNvIHJ4cnBjX2ZpbGxfb3V0X2FjaygpLgorCSAqLworCXJ4cnBjX2dldF9za2Ioc2tiLCByeHJwY19za2JfcnhfZ290KTsKKwljYWxsLT5yeHR4X2Fubm90YXRpb25zW2l4XSA9IGFubm90YXRpb247CisJc21wX3dtYigpOworCWNhbGwtPnJ4dHhfYnVmZmVyW2l4XSA9IHNrYjsKKwlpZiAoYWZ0ZXIoc2VxLCBjYWxsLT5yeF90b3ApKSB7CisJCXNtcF9zdG9yZV9yZWxlYXNlKCZjYWxsLT5yeF90b3AsIHNlcSk7CisJfSBlbHNlIGlmIChiZWZvcmUoc2VxLCBjYWxsLT5yeF90b3ApKSB7CisJCS8qIFNlbmQgYW4gaW1tZWRpYXRlIEFDSyBpZiB3ZSBmaWxsIGluIGEgaG9sZSAqLworCQlpZiAoIWFjaykgeworCQkJYWNrID0gUlhSUENfQUNLX0RFTEFZOworCQkJYWNrX3NlcmlhbCA9IHNlcmlhbDsKKwkJfQorCQlpbW1lZGlhdGVfYWNrID0gdHJ1ZTsKKwl9CisJaWYgKGZsYWdzICYgUlhSUENfTEFTVF9QQUNLRVQpIHsKKwkJc2V0X2JpdChSWFJQQ19DQUxMX1JYX0xBU1QsICZjYWxsLT5mbGFncyk7CisJCXRyYWNlX3J4cnBjX3JlY2VpdmUoY2FsbCwgcnhycGNfcmVjZWl2ZV9xdWV1ZV9sYXN0LCBzZXJpYWwsIHNlcSk7CisJfSBlbHNlIHsKKwkJdHJhY2VfcnhycGNfcmVjZWl2ZShjYWxsLCByeHJwY19yZWNlaXZlX3F1ZXVlLCBzZXJpYWwsIHNlcSk7CisJfQorCXF1ZXVlZCA9IHRydWU7CisKKwlpZiAoYWZ0ZXJfZXEoc2VxLCBjYWxsLT5yeF9leHBlY3RfbmV4dCkpIHsKKwkJaWYgKGFmdGVyKHNlcSwgY2FsbC0+cnhfZXhwZWN0X25leHQpKSB7CisJCQlfbmV0KCJPT1MgJXUgPiAldSIsIHNlcSwgY2FsbC0+cnhfZXhwZWN0X25leHQpOworCQkJYWNrID0gUlhSUENfQUNLX09VVF9PRl9TRVFVRU5DRTsKKwkJCWFja19zZXJpYWwgPSBzZXJpYWw7CisJCX0KKwkJY2FsbC0+cnhfZXhwZWN0X25leHQgPSBzZXEgKyAxOworCX0KKworc2tpcDoKKwlvZmZzZXQgKz0gbGVuOworCWlmIChmbGFncyAmIFJYUlBDX0pVTUJPX1BBQ0tFVCkgeworCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIG9mZnNldCwgJmZsYWdzLCAxKSA8IDApCisJCQlyZXR1cm4gcnhycGNfcHJvdG9fYWJvcnQoIlhKRiIsIGNhbGwsIHNlcSk7CisJCW9mZnNldCArPSBzaXplb2Yoc3RydWN0IHJ4cnBjX2p1bWJvX2hlYWRlcik7CisJCXNlcSsrOworCQlzZXJpYWwrKzsKKwkJYW5ub3RhdGlvbisrOworCQlpZiAoZmxhZ3MgJiBSWFJQQ19KVU1CT19QQUNLRVQpCisJCQlhbm5vdGF0aW9uIHw9IFJYUlBDX1JYX0FOTk9fSkxBU1Q7CisJCWlmIChhZnRlcihzZXEsIGhhcmRfYWNrICsgY2FsbC0+cnhfd2luc2l6ZSkpIHsKKwkJCWFjayA9IFJYUlBDX0FDS19FWENFRURTX1dJTkRPVzsKKwkJCWFja19zZXJpYWwgPSBzZXJpYWw7CisJCQlpZiAoIWp1bWJvX2JhZCkgeworCQkJCWNhbGwtPm5yX2p1bWJvX2JhZCsrOworCQkJCWp1bWJvX2JhZCA9IHRydWU7CisJCQl9CisJCQlnb3RvIGFjazsKKwkJfQorCisJCV9wcm90bygiUnggREFUQSBKdW1ibyAlJSV1Iiwgc2VyaWFsKTsKKwkJZ290byBuZXh0X3N1YnBhY2tldDsKKwl9CisKKwlpZiAocXVldWVkICYmIGZsYWdzICYgUlhSUENfTEFTVF9QQUNLRVQgJiYgIWFjaykgeworCQlhY2sgPSBSWFJQQ19BQ0tfREVMQVk7CisJCWFja19zZXJpYWwgPSBzZXJpYWw7CisJfQorCithY2s6CisJaWYgKGFjaykKKwkJcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgYWNrLCBza2V3LCBhY2tfc2VyaWFsLAorCQkJCSAgaW1tZWRpYXRlX2FjaywgdHJ1ZSwKKwkJCQkgIHJ4cnBjX3Byb3Bvc2VfYWNrX2lucHV0X2RhdGEpOworCisJaWYgKHNwLT5oZHIuc2VxID09IFJFQURfT05DRShjYWxsLT5yeF9oYXJkX2FjaykgKyAxKQorCQlyeHJwY19ub3RpZnlfc29ja2V0KGNhbGwpOworCV9sZWF2ZSgiIFtxdWV1ZWRdIik7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgcmVxdWVzdGVkIEFDSy4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfaW5wdXRfcmVxdWVzdGVkX2FjayhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICAgICBrdGltZV90IHJlc3BfdGltZSwKKwkJCQkgICAgICByeHJwY19zZXJpYWxfdCBvcmlnX3NlcmlhbCwKKwkJCQkgICAgICByeHJwY19zZXJpYWxfdCBhY2tfc2VyaWFsKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlrdGltZV90IHNlbnRfYXQ7CisJaW50IGl4OworCisJZm9yIChpeCA9IDA7IGl4IDwgUlhSUENfUlhUWF9CVUZGX1NJWkU7IGl4KyspIHsKKwkJc2tiID0gY2FsbC0+cnh0eF9idWZmZXJbaXhdOworCQlpZiAoIXNrYikKKwkJCWNvbnRpbnVlOworCisJCXNwID0gcnhycGNfc2tiKHNrYik7CisJCWlmIChzcC0+aGRyLnNlcmlhbCAhPSBvcmlnX3NlcmlhbCkKKwkJCWNvbnRpbnVlOworCQlzbXBfcm1iKCk7CisJCXNlbnRfYXQgPSBza2ItPnRzdGFtcDsKKwkJZ290byBmb3VuZDsKKwl9CisJcmV0dXJuOworCitmb3VuZDoKKwlyeHJwY19wZWVyX2FkZF9ydHQoY2FsbCwgcnhycGNfcnR0X3J4X3JlcXVlc3RlZF9hY2ssCisJCQkgICBvcmlnX3NlcmlhbCwgYWNrX3NlcmlhbCwgc2VudF9hdCwgcmVzcF90aW1lKTsKK30KKworLyoKKyAqIFByb2Nlc3MgYSBwaW5nIHJlc3BvbnNlLgorICovCitzdGF0aWMgdm9pZCByeHJwY19pbnB1dF9waW5nX3Jlc3BvbnNlKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgICAgIGt0aW1lX3QgcmVzcF90aW1lLAorCQkJCSAgICAgIHJ4cnBjX3NlcmlhbF90IG9yaWdfc2VyaWFsLAorCQkJCSAgICAgIHJ4cnBjX3NlcmlhbF90IGFja19zZXJpYWwpCit7CisJcnhycGNfc2VyaWFsX3QgcGluZ19zZXJpYWw7CisJa3RpbWVfdCBwaW5nX3RpbWU7CisKKwlwaW5nX3RpbWUgPSBjYWxsLT5hY2tyX3BpbmdfdGltZTsKKwlzbXBfcm1iKCk7CisJcGluZ19zZXJpYWwgPSBjYWxsLT5hY2tyX3Bpbmc7CisKKwlpZiAoIXRlc3RfYml0KFJYUlBDX0NBTExfUElOR0lORywgJmNhbGwtPmZsYWdzKSB8fAorCSAgICBiZWZvcmUob3JpZ19zZXJpYWwsIHBpbmdfc2VyaWFsKSkKKwkJcmV0dXJuOworCWNsZWFyX2JpdChSWFJQQ19DQUxMX1BJTkdJTkcsICZjYWxsLT5mbGFncyk7CisJaWYgKGFmdGVyKG9yaWdfc2VyaWFsLCBwaW5nX3NlcmlhbCkpCisJCXJldHVybjsKKworCXJ4cnBjX3BlZXJfYWRkX3J0dChjYWxsLCByeHJwY19ydHRfcnhfcGluZ19yZXNwb25zZSwKKwkJCSAgIG9yaWdfc2VyaWFsLCBhY2tfc2VyaWFsLCBwaW5nX3RpbWUsIHJlc3BfdGltZSk7Cit9CisKKy8qCisgKiBQcm9jZXNzIHRoZSBleHRyYSBpbmZvcm1hdGlvbiB0aGF0IG1heSBiZSBhcHBlbmRlZCB0byBhbiBBQ0sgcGFja2V0CisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2lucHV0X2Fja2luZm8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJc3RydWN0IHJ4cnBjX2Fja2luZm8gKmFja2luZm8pCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOworCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOworCXVuc2lnbmVkIGludCBtdHU7CisJdTMyIHJ3aW5kID0gbnRvaGwoYWNraW5mby0+cndpbmQpOworCisJX3Byb3RvKCJSeCBBQ0sgJSUldSBJbmZvIHsgcng9JXUgbWF4PSV1IHJ3aW49JXUgam09JXUgfSIsCisJICAgICAgIHNwLT5oZHIuc2VyaWFsLAorCSAgICAgICBudG9obChhY2tpbmZvLT5yeE1UVSksIG50b2hsKGFja2luZm8tPm1heE1UVSksCisJICAgICAgIHJ3aW5kLCBudG9obChhY2tpbmZvLT5qdW1ib19tYXgpKTsKKworCWlmIChyd2luZCA+IFJYUlBDX1JYVFhfQlVGRl9TSVpFIC0gMSkKKwkJcndpbmQgPSBSWFJQQ19SWFRYX0JVRkZfU0laRSAtIDE7CisJY2FsbC0+dHhfd2luc2l6ZSA9IHJ3aW5kOworCWlmIChjYWxsLT5jb25nX3NzdGhyZXNoID4gcndpbmQpCisJCWNhbGwtPmNvbmdfc3N0aHJlc2ggPSByd2luZDsKKworCW10dSA9IG1pbihudG9obChhY2tpbmZvLT5yeE1UVSksIG50b2hsKGFja2luZm8tPm1heE1UVSkpOworCisJcGVlciA9IGNhbGwtPnBlZXI7CisJaWYgKG10dSA8IHBlZXItPm1heGRhdGEpIHsKKwkJc3Bpbl9sb2NrX2JoKCZwZWVyLT5sb2NrKTsKKwkJcGVlci0+bWF4ZGF0YSA9IG10dTsKKwkJcGVlci0+bXR1ID0gbXR1ICsgcGVlci0+aGRyc2l6ZTsKKwkJc3Bpbl91bmxvY2tfYmgoJnBlZXItPmxvY2spOworCQlfbmV0KCJOZXQgTVRVICV1IChtYXhkYXRhICV1KSIsIHBlZXItPm10dSwgcGVlci0+bWF4ZGF0YSk7CisJfQorfQorCisvKgorICogUHJvY2VzcyBpbmRpdmlkdWFsIHNvZnQgQUNLcy4KKyAqCisgKiBFYWNoIEFDSyBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gb25lIHBhY2tldCBhbmQgY2FuIGJlIGVpdGhlciBhbiBBQ0sgb3IKKyAqIGEgTkFLLiAgSWYgd2UgZ2V0IGZpbmQgYW4gZXhwbGljaXRseSBOQUsnZCBwYWNrZXQgd2UgcmVzZW5kIGltbWVkaWF0ZWx5OworICogcGFja2V0cyB0aGF0IGxpZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgQUNLIGxpc3QgYXJlIHNjaGVkdWxlZCBmb3IgcmVzZW5kIGJ5CisgKiB0aGUgdGltZXIgb24gdGhlIGJhc2lzIHRoYXQgdGhlIHBlZXIgbWlnaHQganVzdCBub3QgaGF2ZSBwcm9jZXNzZWQgdGhlbSBhdAorICogdGhlIHRpbWUgdGhlIEFDSyB3YXMgc2VudC4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfaW5wdXRfc29mdF9hY2tzKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1OCAqYWNrcywKKwkJCQkgIHJ4cnBjX3NlcV90IHNlcSwgaW50IG5yX2Fja3MsCisJCQkJICBzdHJ1Y3QgcnhycGNfYWNrX3N1bW1hcnkgKnN1bW1hcnkpCit7CisJaW50IGl4OworCXU4IGFubm90YXRpb24sIGFubm9fdHlwZTsKKworCWZvciAoOyBucl9hY2tzID4gMDsgbnJfYWNrcy0tLCBzZXErKykgeworCQlpeCA9IHNlcSAmIFJYUlBDX1JYVFhfQlVGRl9NQVNLOworCQlhbm5vdGF0aW9uID0gY2FsbC0+cnh0eF9hbm5vdGF0aW9uc1tpeF07CisJCWFubm9fdHlwZSA9IGFubm90YXRpb24gJiBSWFJQQ19UWF9BTk5PX01BU0s7CisJCWFubm90YXRpb24gJj0gflJYUlBDX1RYX0FOTk9fTUFTSzsKKwkJc3dpdGNoICgqYWNrcysrKSB7CisJCWNhc2UgUlhSUENfQUNLX1RZUEVfQUNLOgorCQkJc3VtbWFyeS0+bnJfYWNrcysrOworCQkJaWYgKGFubm9fdHlwZSA9PSBSWFJQQ19UWF9BTk5PX0FDSykKKwkJCQljb250aW51ZTsKKwkJCXN1bW1hcnktPm5yX25ld19hY2tzKys7CisJCQljYWxsLT5yeHR4X2Fubm90YXRpb25zW2l4XSA9CisJCQkJUlhSUENfVFhfQU5OT19BQ0sgfCBhbm5vdGF0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgUlhSUENfQUNLX1RZUEVfTkFDSzoKKwkJCWlmICghc3VtbWFyeS0+bnJfbmFja3MgJiYKKwkJCSAgICBjYWxsLT5hY2tzX2xvd2VzdF9uYWsgIT0gc2VxKSB7CisJCQkJY2FsbC0+YWNrc19sb3dlc3RfbmFrID0gc2VxOworCQkJCXN1bW1hcnktPm5ld19sb3dfbmFjayA9IHRydWU7CisJCQl9CisJCQlzdW1tYXJ5LT5ucl9uYWNrcysrOworCQkJaWYgKGFubm9fdHlwZSA9PSBSWFJQQ19UWF9BTk5PX05BSykKKwkJCQljb250aW51ZTsKKwkJCXN1bW1hcnktPm5yX25ld19uYWNrcysrOworCQkJaWYgKGFubm9fdHlwZSA9PSBSWFJQQ19UWF9BTk5PX1JFVFJBTlMpCisJCQkJY29udGludWU7CisJCQljYWxsLT5yeHR4X2Fubm90YXRpb25zW2l4XSA9CisJCQkJUlhSUENfVFhfQU5OT19OQUsgfCBhbm5vdGF0aW9uOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gcnhycGNfcHJvdG9fYWJvcnQoIlNGVCIsIGNhbGwsIDApOworCQl9CisJfQorfQorCisvKgorICogUHJvY2VzcyBhbiBBQ0sgcGFja2V0LgorICoKKyAqIGFjay5maXJzdFBhY2tldCBpcyB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBmaXJzdCBzb2Z0LUFDSydkL05BSydkIHBhY2tldAorICogaW4gdGhlIEFDSyBhcnJheS4gIEFueXRoaW5nIGJlZm9yZSB0aGF0IGlzIGhhcmQtQUNLJ2QgYW5kIG1heSBiZSBkaXNjYXJkZWQuCisgKgorICogQSBoYXJkLUFDSyBtZWFucyB0aGF0IGEgcGFja2V0IGhhcyBiZWVuIHByb2Nlc3NlZCBhbmQgbWF5IGJlIGRpc2NhcmRlZDsgYQorICogc29mdC1BQ0sgbWVhbnMgdGhhdCB0aGUgcGFja2V0IG1heSBiZSBkaXNjYXJkZWQgYW5kIHJldHJhbnNtaXNzaW9uCisgKiByZXF1ZXN0ZWQuICBBIHBoYXNlIGlzIGNvbXBsZXRlIHdoZW4gYWxsIHBhY2tldHMgYXJlIGhhcmQtQUNLJ2QuCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2lucHV0X2FjayhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICB1MTYgc2tldykKK3sKKwlzdHJ1Y3QgcnhycGNfYWNrX3N1bW1hcnkgc3VtbWFyeSA9IHsgMCB9OworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKwl1bmlvbiB7CisJCXN0cnVjdCByeHJwY19hY2twYWNrZXQgYWNrOworCQlzdHJ1Y3QgcnhycGNfYWNraW5mbyBpbmZvOworCQl1OCBhY2tzW1JYUlBDX01BWEFDS1NdOworCX0gYnVmOworCXJ4cnBjX3NlcmlhbF90IGFja2VkX3NlcmlhbDsKKwlyeHJwY19zZXFfdCBmaXJzdF9zb2Z0X2FjaywgaGFyZF9hY2s7CisJaW50IG5yX2Fja3MsIG9mZnNldCwgaW9mZnNldDsKKworCV9lbnRlcigiIik7CisKKwlvZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyKTsKKwlpZiAoc2tiX2NvcHlfYml0cyhza2IsIG9mZnNldCwgJmJ1Zi5hY2ssIHNpemVvZihidWYuYWNrKSkgPCAwKSB7CisJCV9kZWJ1ZygiZXh0cmFjdGlvbiBmYWlsdXJlIik7CisJCXJldHVybiByeHJwY19wcm90b19hYm9ydCgiWEFLIiwgY2FsbCwgMCk7CisJfQorCW9mZnNldCArPSBzaXplb2YoYnVmLmFjayk7CisKKwlhY2tlZF9zZXJpYWwgPSBudG9obChidWYuYWNrLnNlcmlhbCk7CisJZmlyc3Rfc29mdF9hY2sgPSBudG9obChidWYuYWNrLmZpcnN0UGFja2V0KTsKKwloYXJkX2FjayA9IGZpcnN0X3NvZnRfYWNrIC0gMTsKKwlucl9hY2tzID0gYnVmLmFjay5uQWNrczsKKwlzdW1tYXJ5LmFja19yZWFzb24gPSAoYnVmLmFjay5yZWFzb24gPCBSWFJQQ19BQ0tfX0lOVkFMSUQgPworCQkJICAgICAgYnVmLmFjay5yZWFzb24gOiBSWFJQQ19BQ0tfX0lOVkFMSUQpOworCisJdHJhY2VfcnhycGNfcnhfYWNrKGNhbGwsIGZpcnN0X3NvZnRfYWNrLCBzdW1tYXJ5LmFja19yZWFzb24sIG5yX2Fja3MpOworCisJX3Byb3RvKCJSeCBBQ0sgJSUldSB7IG09JWh1IGY9IyV1IHA9IyV1IHM9JSUldSByPSVzIG49JXUgfSIsCisJICAgICAgIHNwLT5oZHIuc2VyaWFsLAorCSAgICAgICBudG9ocyhidWYuYWNrLm1heFNrZXcpLAorCSAgICAgICBmaXJzdF9zb2Z0X2FjaywKKwkgICAgICAgbnRvaGwoYnVmLmFjay5wcmV2aW91c1BhY2tldCksCisJICAgICAgIGFja2VkX3NlcmlhbCwKKwkgICAgICAgcnhycGNfYWNrX25hbWVzW3N1bW1hcnkuYWNrX3JlYXNvbl0sCisJICAgICAgIGJ1Zi5hY2subkFja3MpOworCisJaWYgKGJ1Zi5hY2sucmVhc29uID09IFJYUlBDX0FDS19QSU5HX1JFU1BPTlNFKQorCQlyeHJwY19pbnB1dF9waW5nX3Jlc3BvbnNlKGNhbGwsIHNrYi0+dHN0YW1wLCBhY2tlZF9zZXJpYWwsCisJCQkJCSAgc3AtPmhkci5zZXJpYWwpOworCWlmIChidWYuYWNrLnJlYXNvbiA9PSBSWFJQQ19BQ0tfUkVRVUVTVEVEKQorCQlyeHJwY19pbnB1dF9yZXF1ZXN0ZWRfYWNrKGNhbGwsIHNrYi0+dHN0YW1wLCBhY2tlZF9zZXJpYWwsCisJCQkJCSAgc3AtPmhkci5zZXJpYWwpOworCisJaWYgKGJ1Zi5hY2sucmVhc29uID09IFJYUlBDX0FDS19QSU5HKSB7CisJCV9wcm90bygiUnggQUNLICUlJXUgUElORyBSZXF1ZXN0Iiwgc3AtPmhkci5zZXJpYWwpOworCQlyeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBSWFJQQ19BQ0tfUElOR19SRVNQT05TRSwKKwkJCQkgIHNrZXcsIHNwLT5oZHIuc2VyaWFsLCB0cnVlLCB0cnVlLAorCQkJCSAgcnhycGNfcHJvcG9zZV9hY2tfcmVzcG9uZF90b19waW5nKTsKKwl9IGVsc2UgaWYgKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19SRVFVRVNUX0FDSykgeworCQlyeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBSWFJQQ19BQ0tfUkVRVUVTVEVELAorCQkJCSAgc2tldywgc3AtPmhkci5zZXJpYWwsIHRydWUsIHRydWUsCisJCQkJICByeHJwY19wcm9wb3NlX2Fja19yZXNwb25kX3RvX2Fjayk7CisJfQorCisJaW9mZnNldCA9IG9mZnNldCArIG5yX2Fja3MgKyAzOworCWlmIChza2ItPmxlbiA+PSBpb2Zmc2V0ICsgc2l6ZW9mKGJ1Zi5pbmZvKSkgeworCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIGlvZmZzZXQsICZidWYuaW5mbywgc2l6ZW9mKGJ1Zi5pbmZvKSkgPCAwKQorCQkJcmV0dXJuIHJ4cnBjX3Byb3RvX2Fib3J0KCJYQUkiLCBjYWxsLCAwKTsKKwkJcnhycGNfaW5wdXRfYWNraW5mbyhjYWxsLCBza2IsICZidWYuaW5mbyk7CisJfQorCisJaWYgKGZpcnN0X3NvZnRfYWNrID09IDApCisJCXJldHVybiByeHJwY19wcm90b19hYm9ydCgiQUswIiwgY2FsbCwgMCk7CisKKwkvKiBJZ25vcmUgQUNLcyB1bmxlc3Mgd2UgYXJlIG9yIGhhdmUganVzdCBiZWVuIHRyYW5zbWl0dGluZy4gKi8KKwlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7CisJY2FzZSBSWFJQQ19DQUxMX0NMSUVOVF9TRU5EX1JFUVVFU1Q6CisJY2FzZSBSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWToKKwljYXNlIFJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFk6CisJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9BV0FJVF9BQ0s6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwkvKiBEaXNjYXJkIGFueSBvdXQtb2Ytb3JkZXIgb3IgZHVwbGljYXRlIEFDS3MuICovCisJaWYgKGJlZm9yZV9lcShzcC0+aGRyLnNlcmlhbCwgY2FsbC0+YWNrc19sYXRlc3QpKSB7CisJCV9kZWJ1ZygiZGlzY2FyZCBBQ0sgJWQgPD0gJWQiLAorCQkgICAgICAgc3AtPmhkci5zZXJpYWwsIGNhbGwtPmFja3NfbGF0ZXN0KTsKKwkJcmV0dXJuOworCX0KKwljYWxsLT5hY2tzX2xhdGVzdF90cyA9IHNrYi0+dHN0YW1wOworCWNhbGwtPmFja3NfbGF0ZXN0ID0gc3AtPmhkci5zZXJpYWw7CisKKwlpZiAoYmVmb3JlKGhhcmRfYWNrLCBjYWxsLT50eF9oYXJkX2FjaykgfHwKKwkgICAgYWZ0ZXIoaGFyZF9hY2ssIGNhbGwtPnR4X3RvcCkpCisJCXJldHVybiByeHJwY19wcm90b19hYm9ydCgiQUtXIiwgY2FsbCwgMCk7CisJaWYgKG5yX2Fja3MgPiBjYWxsLT50eF90b3AgLSBoYXJkX2FjaykKKwkJcmV0dXJuIHJ4cnBjX3Byb3RvX2Fib3J0KCJBS04iLCBjYWxsLCAwKTsKKworCWlmIChhZnRlcihoYXJkX2FjaywgY2FsbC0+dHhfaGFyZF9hY2spKQorCQlyeHJwY19yb3RhdGVfdHhfd2luZG93KGNhbGwsIGhhcmRfYWNrLCAmc3VtbWFyeSk7CisKKwlpZiAobnJfYWNrcyA+IDApIHsKKwkJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBvZmZzZXQsIGJ1Zi5hY2tzLCBucl9hY2tzKSA8IDApCisJCQlyZXR1cm4gcnhycGNfcHJvdG9fYWJvcnQoIlhTQSIsIGNhbGwsIDApOworCQlyeHJwY19pbnB1dF9zb2Z0X2Fja3MoY2FsbCwgYnVmLmFja3MsIGZpcnN0X3NvZnRfYWNrLCBucl9hY2tzLAorCQkJCSAgICAgICZzdW1tYXJ5KTsKKwl9CisKKwlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9UWF9MQVNULCAmY2FsbC0+ZmxhZ3MpKSB7CisJCXJ4cnBjX2VuZF90eF9waGFzZShjYWxsLCBmYWxzZSwgIkVUQSIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbY2FsbC0+dHhfdG9wICYgUlhSUENfUlhUWF9CVUZGX01BU0tdICYKKwkgICAgUlhSUENfVFhfQU5OT19MQVNUICYmCisJICAgIHN1bW1hcnkubnJfYWNrcyA9PSBjYWxsLT50eF90b3AgLSBoYXJkX2FjaykKKwkJcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgUlhSUENfQUNLX1BJTkcsIHNrZXcsIHNwLT5oZHIuc2VyaWFsLAorCQkJCSAgZmFsc2UsIHRydWUsCisJCQkJICByeHJwY19wcm9wb3NlX2Fja19waW5nX2Zvcl9sb3N0X3JlcGx5KTsKKworCXJldHVybiByeHJwY19jb25nZXN0aW9uX21hbmFnZW1lbnQoY2FsbCwgc2tiLCAmc3VtbWFyeSwgYWNrZWRfc2VyaWFsKTsKK30KKworLyoKKyAqIFByb2Nlc3MgYW4gQUNLQUxMIHBhY2tldC4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfaW5wdXRfYWNrYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByeHJwY19hY2tfc3VtbWFyeSBzdW1tYXJ5ID0geyAwIH07CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOworCisJX3Byb3RvKCJSeCBBQ0tBTEwgJSUldSIsIHNwLT5oZHIuc2VyaWFsKTsKKworCXJ4cnBjX3JvdGF0ZV90eF93aW5kb3coY2FsbCwgY2FsbC0+dHhfdG9wLCAmc3VtbWFyeSk7CisJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfVFhfTEFTVCwgJmNhbGwtPmZsYWdzKSkKKwkJcnhycGNfZW5kX3R4X3BoYXNlKGNhbGwsIGZhbHNlLCAiRVRMIik7Cit9CisKKy8qCisgKiBQcm9jZXNzIGFuIEFCT1JUIHBhY2tldC4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfaW5wdXRfYWJvcnQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOwogCV9fYmUzMiB3dG1wOwotCXUzMiBoaV9zZXJpYWwsIGFib3J0X2NvZGU7CisJdTMyIGFib3J0X2NvZGUgPSBSWF9DQUxMX0RFQUQ7CisKKwlfZW50ZXIoIiIpOworCisJaWYgKHNrYi0+bGVuID49IDQgJiYKKwkgICAgc2tiX2NvcHlfYml0cyhza2IsIHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpLAorCQkJICAmd3RtcCwgc2l6ZW9mKHd0bXApKSA+PSAwKQorCQlhYm9ydF9jb2RlID0gbnRvaGwod3RtcCk7CisKKwlfcHJvdG8oIlJ4IEFCT1JUICUlJXUgeyAleCB9Iiwgc3AtPmhkci5zZXJpYWwsIGFib3J0X2NvZGUpOworCisJaWYgKHJ4cnBjX3NldF9jYWxsX2NvbXBsZXRpb24oY2FsbCwgUlhSUENfQ0FMTF9SRU1PVEVMWV9BQk9SVEVELAorCQkJCSAgICAgIGFib3J0X2NvZGUsIEVDT05OQUJPUlRFRCkpCisJCXJ4cnBjX25vdGlmeV9zb2NrZXQoY2FsbCk7Cit9CisKKy8qCisgKiBQcm9jZXNzIGFuIGluY29taW5nIGNhbGwgcGFja2V0LgorICovCitzdGF0aWMgdm9pZCByeHJwY19pbnB1dF9jYWxsX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IHNrZXcpCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOwogCiAJX2VudGVyKCIlcCwlcCIsIGNhbGwsIHNrYik7CiAKLQlBU1NFUlQoIWlycXNfZGlzYWJsZWQoKSk7Ci0KLSNpZiAwIC8vIElOSkVDVCBSWCBFUlJPUgotCWlmIChzcC0+aGRyLnR5cGUgPT0gUlhSUENfUEFDS0VUX1RZUEVfREFUQSkgewotCQlzdGF0aWMgaW50IHNraXAgPSAwOwotCQlpZiAoKytza2lwID09IDMpIHsKLQkJCXByaW50aygiRFJPUFBFRCAzUkQgUEFDS0VUISEhISEhISEhISEhIVxuIik7Ci0JCQlza2lwID0gMDsKLQkJCWdvdG8gZnJlZV9wYWNrZXQ7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCS8qIHRyYWNrIHRoZSBsYXRlc3Qgc2VyaWFsIG51bWJlciBvbiB0aGlzIGNvbm5lY3Rpb24gZm9yIEFDSyBwYWNrZXQKLQkgKiBpbmZvcm1hdGlvbiAqLwotCWhpX3NlcmlhbCA9IGF0b21pY19yZWFkKCZjYWxsLT5jb25uLT5oaV9zZXJpYWwpOwotCXdoaWxlIChzcC0+aGRyLnNlcmlhbCA+IGhpX3NlcmlhbCkKLQkJaGlfc2VyaWFsID0gYXRvbWljX2NtcHhjaGcoJmNhbGwtPmNvbm4tPmhpX3NlcmlhbCwgaGlfc2VyaWFsLAotCQkJCQkgICBzcC0+aGRyLnNlcmlhbCk7Ci0KLQkvKiByZXF1ZXN0IEFDSyBnZW5lcmF0aW9uIGZvciBhbnkgQUNLIG9yIERBVEEgcGFja2V0IHRoYXQgcmVxdWVzdHMKLQkgKiBpdCAqLwotCWlmIChzcC0+aGRyLmZsYWdzICYgUlhSUENfUkVRVUVTVF9BQ0spIHsKLQkJX3Byb3RvKCJBQ0sgUmVxdWVzdGVkIG9uICUlJXUiLCBzcC0+aGRyLnNlcmlhbCk7Ci0JCXJ4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIFJYUlBDX0FDS19SRVFVRVNURUQsIHNwLT5oZHIuc2VyaWFsLCBmYWxzZSk7Ci0JfQotCiAJc3dpdGNoIChzcC0+aGRyLnR5cGUpIHsKLQljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOgotCQlfZGVidWcoImFib3J0Iik7CisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBOgorCQlyeHJwY19pbnB1dF9kYXRhKGNhbGwsIHNrYiwgc2tldyk7CisJCWJyZWFrOwogCi0JCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgJnd0bXAsIHNpemVvZih3dG1wKSkgPCAwKQotCQkJZ290byBwcm90b2NvbF9lcnJvcjsKLQotCQlhYm9ydF9jb2RlID0gbnRvaGwod3RtcCk7Ci0JCV9wcm90bygiUnggQUJPUlQgJSUldSB7ICV4IH0iLCBzcC0+aGRyLnNlcmlhbCwgYWJvcnRfY29kZSk7Ci0KLQkJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKLQkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9SRU1PVEVMWV9BQk9SVEVEOwotCQkJY2FsbC0+cmVtb3RlX2Fib3J0ID0gYWJvcnRfY29kZTsKLQkJCXNldF9iaXQoUlhSUENfQ0FMTF9FVl9SQ1ZEX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKLQkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JCX0KLQkJZ290byBmcmVlX3BhY2tldF91bmxvY2s7CisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0s6CisJCXJ4cnBjX2lucHV0X2FjayhjYWxsLCBza2IsIHNrZXcpOworCQlicmVhazsKIAogCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQlVTWToKIAkJX3Byb3RvKCJSeCBCVVNZICUlJXUiLCBzcC0+aGRyLnNlcmlhbCk7CiAKLQkJaWYgKHJ4cnBjX2Nvbm5faXNfc2VydmljZShjYWxsLT5jb25uKSkKLQkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJCS8qIEp1c3QgaWdub3JlIEJVU1kgcGFja2V0cyBmcm9tIHRoZSBzZXJ2ZXI7IHRoZSByZXRyeSBhbmQKKwkJICogbGlmZXNwYW4gdGltZXJzIHdpbGwgdGFrZSBjYXJlIG9mIGJ1c2luZXNzLiAgQlVTWSBwYWNrZXRzCisJCSAqIGZyb20gdGhlIGNsaWVudCBkb24ndCBtYWtlIHNlbnNlLgorCQkgKi8KKwkJYnJlYWs7CiAKLQkJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKLQkJY2FzZSBSWFJQQ19DQUxMX0NMSUVOVF9TRU5EX1JFUVVFU1Q6Ci0JCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX0JVU1k7Ci0JCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfUkNWRF9CVVNZLCAmY2FsbC0+ZXZlbnRzKTsKLQkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQlVTWToKLQkJCWdvdG8gZnJlZV9wYWNrZXRfdW5sb2NrOwotCQlkZWZhdWx0OgotCQkJZ290byBwcm90b2NvbF9lcnJvcl9sb2NrZWQ7Ci0JCX0KKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOgorCQlyeHJwY19pbnB1dF9hYm9ydChjYWxsLCBza2IpOworCQlicmVhazsKKworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUNLQUxMOgorCQlyeHJwY19pbnB1dF9hY2thbGwoY2FsbCwgc2tiKTsKKwkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlfcHJvdG8oIlJ4ICVzICUlJXUiLCByeHJwY19wa3RzW3NwLT5oZHIudHlwZV0sIHNwLT5oZHIuc2VyaWFsKTsKLQkJZ290byBwcm90b2NvbF9lcnJvcjsKLQotCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfREFUQToKLQkJX3Byb3RvKCJSeCBEQVRBICUlJXUgeyAjJXUgfSIsIHNwLT5oZHIuc2VyaWFsLCBzcC0+aGRyLnNlcSk7Ci0KLQkJaWYgKHNwLT5oZHIuc2VxID09IDApCi0JCQlnb3RvIHByb3RvY29sX2Vycm9yOwotCi0JCWNhbGwtPmFja3JfcHJldl9zZXEgPSBzcC0+aGRyLnNlcTsKLQotCQkvKiByZWNlaXZlZCBkYXRhIGltcGxpY2l0bHkgQUNLcyBhbGwgb2YgdGhlIHJlcXVlc3QgcGFja2V0cyB3ZQotCQkgKiBzZW50IHdoZW4gd2UncmUgYWN0aW5nIGFzIGEgY2xpZW50ICovCi0JCWlmIChjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWSkKLQkJCXJ4cnBjX2Fzc3VtZV9pbXBsaWNpdF9hY2thbGwoY2FsbCwgc3AtPmhkci5zZXJpYWwpOwotCi0JCXN3aXRjaCAocnhycGNfZmFzdF9wcm9jZXNzX2RhdGEoY2FsbCwgc2tiLCBzcC0+aGRyLnNlcSkpIHsKLQkJY2FzZSAwOgotCQkJc2tiID0gTlVMTDsKLQkJCWdvdG8gZG9uZTsKLQotCQlkZWZhdWx0OgotCQkJQlVHKCk7Ci0KLQkJCS8qIGRhdGEgcGFja2V0IHJlY2VpdmVkIGJleW9uZCB0aGUgbGFzdCBwYWNrZXQgKi8KLQkJY2FzZSAtRUJBRE1TRzoKLQkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7Ci0JCX0KLQotCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUNLQUxMOgotCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUNLOgotCQkvKiBBQ0sgcHJvY2Vzc2luZyBpcyBkb25lIGluIHByb2Nlc3MgY29udGV4dCAqLwotCQlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCQlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0RFQUQpIHsKLQkJCXNrYl9xdWV1ZV90YWlsKCZjYWxsLT5yeF9xdWV1ZSwgc2tiKTsKLQkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JCQlza2IgPSBOVUxMOwotCQl9Ci0JCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQkJZ290byBmcmVlX3BhY2tldDsKLQl9Ci0KLXByb3RvY29sX2Vycm9yOgotCV9kZWJ1ZygicHJvdG9jb2wgZXJyb3IiKTsKLQl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLXByb3RvY29sX2Vycm9yX2xvY2tlZDoKLQlpZiAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSkgewotCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOwotCQljYWxsLT5sb2NhbF9hYm9ydCA9IFJYX1BST1RPQ09MX0VSUk9SOwotCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOwotCX0KLWZyZWVfcGFja2V0X3VubG9jazoKLQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotZnJlZV9wYWNrZXQ6Ci0JcnhycGNfZnJlZV9za2Ioc2tiKTsKLWRvbmU6Ci0JX2xlYXZlKCIiKTsKLX0KLQotLyoKLSAqIHNwbGl0IHVwIGEganVtYm8gZGF0YSBwYWNrZXQKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfcHJvY2Vzc19qdW1ib19wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmICpqdW1ibykKLXsKLQlzdHJ1Y3QgcnhycGNfanVtYm9faGVhZGVyIGpoZHI7Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcGFydDsKLQotCV9lbnRlcigiLHsldSwldX0iLCBqdW1iby0+ZGF0YV9sZW4sIGp1bWJvLT5sZW4pOwotCi0Jc3AgPSByeHJwY19za2IoanVtYm8pOwotCi0JZG8gewotCQlzcC0+aGRyLmZsYWdzICY9IH5SWFJQQ19KVU1CT19QQUNLRVQ7Ci0KLQkJLyogbWFrZSBhIGNsb25lIHRvIHJlcHJlc2VudCB0aGUgZmlyc3Qgc3VicGFja2V0IGluIHdoYXQncyBsZWZ0Ci0JCSAqIG9mIHRoZSBqdW1ibyBwYWNrZXQgKi8KLQkJcGFydCA9IHNrYl9jbG9uZShqdW1ibywgR0ZQX0FUT01JQyk7Ci0JCWlmICghcGFydCkgewotCQkJLyogc2ltcGx5IGRpdGNoIHRoZSB0YWlsIGluIHRoZSBldmVudCBvZiBFTk9NRU0gKi8KLQkJCXBza2JfdHJpbShqdW1ibywgUlhSUENfSlVNQk9fREFUQUxFTik7Ci0JCQlicmVhazsKLQkJfQotCQlyeHJwY19uZXdfc2tiKHBhcnQpOwotCi0JCXBza2JfdHJpbShwYXJ0LCBSWFJQQ19KVU1CT19EQVRBTEVOKTsKLQotCQlpZiAoIXBza2JfcHVsbChqdW1ibywgUlhSUENfSlVNQk9fREFUQUxFTikpCi0JCQlnb3RvIHByb3RvY29sX2Vycm9yOwotCi0JCWlmIChza2JfY29weV9iaXRzKGp1bWJvLCAwLCAmamhkciwgc2l6ZW9mKGpoZHIpKSA8IDApCi0JCQlnb3RvIHByb3RvY29sX2Vycm9yOwotCQlpZiAoIXBza2JfcHVsbChqdW1ibywgc2l6ZW9mKGpoZHIpKSkKLQkJCUJVRygpOwotCi0JCXNwLT5oZHIuc2VxCSs9IDE7Ci0JCXNwLT5oZHIuc2VyaWFsCSs9IDE7Ci0JCXNwLT5oZHIuZmxhZ3MJPSBqaGRyLmZsYWdzOwotCQlzcC0+aGRyLl9yc3ZkCT0gbnRvaHMoamhkci5fcnN2ZCk7Ci0KLQkJX3Byb3RvKCJSeCBEQVRBIEp1bWJvICUlJXUiLCBzcC0+aGRyLnNlcmlhbCAtIDEpOwotCi0JCXJ4cnBjX2Zhc3RfcHJvY2Vzc19wYWNrZXQoY2FsbCwgcGFydCk7Ci0JCXBhcnQgPSBOVUxMOwotCi0JfSB3aGlsZSAoc3AtPmhkci5mbGFncyAmIFJYUlBDX0pVTUJPX1BBQ0tFVCk7Ci0KLQlyeHJwY19mYXN0X3Byb2Nlc3NfcGFja2V0KGNhbGwsIGp1bWJvKTsKLQlfbGVhdmUoIiIpOwotCXJldHVybjsKLQotcHJvdG9jb2xfZXJyb3I6Ci0JX2RlYnVnKCJwcm90b2NvbCBlcnJvciIpOwotCXJ4cnBjX2ZyZWVfc2tiKHBhcnQpOwotCXJ4cnBjX2ZyZWVfc2tiKGp1bWJvKTsKLQl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQlpZiAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSkgewotCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOwotCQljYWxsLT5sb2NhbF9hYm9ydCA9IFJYX1BST1RPQ09MX0VSUk9SOwotCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOwotCX0KLQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCV9sZWF2ZSgiIik7Ci19Ci0KLS8qCi0gKiBwb3N0IGFuIGluY29taW5nIHBhY2tldCB0byB0aGUgYXBwcm9wcmlhdGUgY2FsbC9zb2NrZXQgdG8gZGVhbCB3aXRoCi0gKiAtIG11c3QgZ2V0IHJpZCBvZiB0aGUgc2tfYnVmZiwgZWl0aGVyIGJ5IGZyZWVpbmcgaXQgb3IgYnkgcXVldWluZyBpdAotICovCi1zdGF0aWMgdm9pZCByeHJwY19wb3N0X3BhY2tldF90b19jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQotCV9lbnRlcigiJXAsJXAiLCBjYWxsLCBza2IpOwotCi0Jc3AgPSByeHJwY19za2Ioc2tiKTsKLQotCV9kZWJ1ZygiZXh0YW50IGNhbGwgWyVkXSIsIGNhbGwtPnN0YXRlKTsKLQotCXJlYWRfbG9jaygmY2FsbC0+c3RhdGVfbG9jayk7Ci0Jc3dpdGNoIChjYWxsLT5zdGF0ZSkgewotCWNhc2UgUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURUQ6Ci0JCWlmICghdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VWX0FCT1JULCAmY2FsbC0+ZXZlbnRzKSkgewotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQkJCWdvdG8gZnJlZV91bmxvY2s7Ci0JCX0KLQljYXNlIFJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRDoKLQljYXNlIFJYUlBDX0NBTExfTkVUV09SS19FUlJPUjoKLQljYXNlIFJYUlBDX0NBTExfREVBRDoKLQkJZ290byBkZWFkX2NhbGw7Ci0JY2FzZSBSWFJQQ19DQUxMX0NPTVBMRVRFOgotCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfRklOQUxfQUNLOgotCQkvKiBjb21wbGV0ZSBzZXJ2ZXIgY2FsbCAqLwotCQlpZiAocnhycGNfY29ubl9pc19zZXJ2aWNlKGNhbGwtPmNvbm4pKQotCQkJZ290byBkZWFkX2NhbGw7Ci0JCS8qIHJlc2VuZCBsYXN0IHBhY2tldCBvZiBhIGNvbXBsZXRlZCBjYWxsICovCi0JCV9kZWJ1ZygiZmluYWwgYWNrIGFnYWluIik7Ci0JCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwotCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfQUNLX0ZJTkFMLCAmY2FsbC0+ZXZlbnRzKTsKLQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQkJZ290byBmcmVlX3VubG9jazsKLQlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAKLQlyZWFkX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7Ci0JcnhycGNfZ2V0X2NhbGwoY2FsbCk7Ci0KLQlpZiAoc3AtPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEgJiYKLQkgICAgc3AtPmhkci5mbGFncyAmIFJYUlBDX0pVTUJPX1BBQ0tFVCkKLQkJcnhycGNfcHJvY2Vzc19qdW1ib19wYWNrZXQoY2FsbCwgc2tiKTsKLQllbHNlCi0JCXJ4cnBjX2Zhc3RfcHJvY2Vzc19wYWNrZXQoY2FsbCwgc2tiKTsKLQotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCWdvdG8gZG9uZTsKLQotZGVhZF9jYWxsOgotCWlmIChzcC0+aGRyLnR5cGUgIT0gUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpIHsKLQkJc2tiLT5wcmlvcml0eSA9IFJYX0NBTExfREVBRDsKLQkJcnhycGNfcmVqZWN0X3BhY2tldChjYWxsLT5jb25uLT5wYXJhbXMubG9jYWwsIHNrYik7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLWZyZWVfdW5sb2NrOgotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci11bmxvY2s6Ci0JcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotZG9uZToKIAlfbGVhdmUoIiIpOwogfQogCiAvKgogICogcG9zdCBjb25uZWN0aW9uLWxldmVsIGV2ZW50cyB0byB0aGUgY29ubmVjdGlvbgotICogLSB0aGlzIGluY2x1ZGVzIGNoYWxsZW5nZXMsIHJlc3BvbnNlcyBhbmQgc29tZSBhYm9ydHMKKyAqIC0gdGhpcyBpbmNsdWRlcyBjaGFsbGVuZ2VzLCByZXNwb25zZXMsIHNvbWUgYWJvcnRzIGFuZCBjYWxsIHRlcm1pbmFsIHBhY2tldAorICogICByZXRyYW5zbWlzc2lvbi4KICAqLwotc3RhdGljIGJvb2wgcnhycGNfcG9zdF9wYWNrZXRfdG9fY29ubihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKK3N0YXRpYyB2b2lkIHJ4cnBjX3Bvc3RfcGFja2V0X3RvX2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCiAJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlfZW50ZXIoIiVwLCVwIiwgY29ubiwgc2tiKTsKIAogCXNrYl9xdWV1ZV90YWlsKCZjb25uLT5yeF9xdWV1ZSwgc2tiKTsKLQlyZXR1cm4gcnhycGNfcXVldWVfY29ubihjb25uKTsKKwlyeHJwY19xdWV1ZV9jb25uKGNvbm4pOwogfQogCiAvKgpAQCAtNTk4LDYgKzk2NSwxNyBAQAogfQogCiAvKgorICogcHV0IGEgcGFja2V0IHVwIGZvciB0cmFuc3BvcnQtbGV2ZWwgYWJvcnQKKyAqLworc3RhdGljIHZvaWQgcnhycGNfcmVqZWN0X3BhY2tldChzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUNIRUNLX1NMQUJfT0tBWSgmbG9jYWwtPnVzYWdlKTsKKworCXNrYl9xdWV1ZV90YWlsKCZsb2NhbC0+cmVqZWN0X3F1ZXVlLCBza2IpOworCXJ4cnBjX3F1ZXVlX2xvY2FsKGxvY2FsKTsKK30KKworLyoKICAqIEV4dHJhY3QgdGhlIHdpcmUgaGVhZGVyIGZyb20gYSBwYWNrZXQgYW5kIHRyYW5zbGF0ZSB0aGUgYnl0ZSBvcmRlci4KICAqLwogc3RhdGljIG5vaW5saW5lCkBAIC02MDgsOCArOTg2LDYgQEAKIAkvKiBkaWcgb3V0IHRoZSBSeFJQQyBjb25uZWN0aW9uIGRldGFpbHMgKi8KIAlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsICZ3aGRyLCBzaXplb2Yod2hkcikpIDwgMCkKIAkJcmV0dXJuIC1FQkFETVNHOwotCWlmICghcHNrYl9wdWxsKHNrYiwgc2l6ZW9mKHdoZHIpKSkKLQkJQlVHKCk7CiAKIAltZW1zZXQoc3AsIDAsIHNpemVvZigqc3ApKTsKIAlzcC0+aGRyLmVwb2NoCQk9IG50b2hsKHdoZHIuZXBvY2gpOwpAQCAtNjM0LDE5ICsxMDEwLDIyIEBACiAgKiBzaHV0IGRvd24gYW5kIHRoZSBsb2NhbCBlbmRwb2ludCBmcm9tIGdvaW5nIGF3YXksIHRodXMgc2tfdXNlcl9kYXRhIHdpbGwgbm90CiAgKiBiZSBjbGVhcmVkIHVudGlsIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KICAqLwotdm9pZCByeHJwY19kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaykKK3ZvaWQgcnhycGNfZGF0YV9yZWFkeShzdHJ1Y3Qgc29jayAqdWRwX3NrKQogewogCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCByeHJwY19jaGFubmVsICpjaGFuOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwogCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7Ci0Jc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCA9IHNrLT5za191c2VyX2RhdGE7CisJc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCA9IHVkcF9zay0+c2tfdXNlcl9kYXRhOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbDsKKwlpbnQgcmV0LCBza2V3OwogCi0JX2VudGVyKCIlcCIsIHNrKTsKKwlfZW50ZXIoIiVwIiwgdWRwX3NrKTsKIAogCUFTU0VSVCghaXJxc19kaXNhYmxlZCgpKTsKIAotCXNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCAwLCAxLCAmcmV0KTsKKwlza2IgPSBza2JfcmVjdl9kYXRhZ3JhbSh1ZHBfc2ssIDAsIDEsICZyZXQpOwogCWlmICghc2tiKSB7CiAJCWlmIChyZXQgPT0gLUVBR0FJTikKIAkJCXJldHVybjsKQEAgLTY1NCwxMyArMTAzMywxMyBAQAogCQlyZXR1cm47CiAJfQogCi0JcnhycGNfbmV3X3NrYihza2IpOworCXJ4cnBjX25ld19za2Ioc2tiLCByeHJwY19za2JfcnhfcmVjZWl2ZWQpOwogCiAJX25ldCgicmVjdiBza2IgJXAiLCBza2IpOwogCiAJLyogd2UnbGwgcHJvYmFibHkgbmVlZCB0byBjaGVja3N1bSBpdCAoZGlkbid0IGNhbGwgc29ja19yZWN2bXNnKSAqLwogCWlmIChza2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkgewotCQlyeHJwY19mcmVlX3NrYihza2IpOworCQlyeHJwY19mcmVlX3NrYihza2IsIHJ4cnBjX3NrYl9yeF9mcmVlZCk7CiAJCV9fVURQX0lOQ19TVEFUUygmaW5pdF9uZXQsIFVEUF9NSUJfSU5FUlJPUlMsIDApOwogCQlfbGVhdmUoIiBbQ1NVTSBmYWlsZWRdIik7CiAJCXJldHVybjsKQEAgLTY3NCwxMyArMTA1MywyMSBAQAogCXNrYl9vcnBoYW4oc2tiKTsKIAlzcCA9IHJ4cnBjX3NrYihza2IpOwogCi0JX25ldCgiUnggVURQIHBhY2tldCBmcm9tICUwOHg6JTA0aHUiLAotCSAgICAgbnRvaGwoaXBfaGRyKHNrYiktPnNhZGRyKSwgbnRvaHModWRwX2hkcihza2IpLT5zb3VyY2UpKTsKLQogCS8qIGRpZyBvdXQgdGhlIFJ4UlBDIGNvbm5lY3Rpb24gZGV0YWlscyAqLwogCWlmIChyeHJwY19leHRyYWN0X2hlYWRlcihzcCwgc2tiKSA8IDApCiAJCWdvdG8gYmFkX21lc3NhZ2U7CiAKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfQUZfUlhSUENfSU5KRUNUX0xPU1MpKSB7CisJCXN0YXRpYyBpbnQgbG9zZTsKKwkJaWYgKChsb3NlKysgJiA3KSA9PSA3KSB7CisJCQl0cmFjZV9yeHJwY19yeF9sb3NlKHNwKTsKKwkJCXJ4cnBjX2xvc2Vfc2tiKHNrYiwgcnhycGNfc2tiX3J4X2xvc3QpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJdHJhY2VfcnhycGNfcnhfcGFja2V0KHNwKTsKKwogCV9uZXQoIlJ4IFJ4UlBDICVzIGVwPSV4IGNhbGw9JXg6JXgiLAogCSAgICAgc3AtPmhkci5mbGFncyAmIFJYUlBDX0NMSUVOVF9JTklUSUFURUQgPyAiVG9TZXJ2ZXIiIDogIlRvQ2xpZW50IiwKIAkgICAgIHNwLT5oZHIuZXBvY2gsIHNwLT5oZHIuY2lkLCBzcC0+aGRyLmNhbGxOdW1iZXIpOwpAQCAtNjkxLDcwICsxMDc4LDEyNSBAQAogCQlnb3RvIGJhZF9tZXNzYWdlOwogCX0KIAotCWlmIChzcC0+aGRyLnR5cGUgPT0gUlhSUENfUEFDS0VUX1RZUEVfVkVSU0lPTikgeworCXN3aXRjaCAoc3AtPmhkci50eXBlKSB7CisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9WRVJTSU9OOgogCQlyeHJwY19wb3N0X3BhY2tldF90b19sb2NhbChsb2NhbCwgc2tiKTsKIAkJZ290byBvdXQ7Ci0JfQogCi0JaWYgKHNwLT5oZHIudHlwZSA9PSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBICYmCi0JICAgIChzcC0+aGRyLmNhbGxOdW1iZXIgPT0gMCB8fCBzcC0+aGRyLnNlcSA9PSAwKSkKLQkJZ290byBiYWRfbWVzc2FnZTsKKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0JVU1k6CisJCWlmIChzcC0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCkKKwkJCWdvdG8gZGlzY2FyZDsKKworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfREFUQToKKwkJaWYgKHNwLT5oZHIuY2FsbE51bWJlciA9PSAwKQorCQkJZ290byBiYWRfbWVzc2FnZTsKKwkJaWYgKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19KVU1CT19QQUNLRVQgJiYKKwkJICAgICFyeHJwY192YWxpZGF0ZV9qdW1ibyhza2IpKQorCQkJZ290byBiYWRfbWVzc2FnZTsKKwkJYnJlYWs7CisJfQogCiAJcmN1X3JlYWRfbG9jaygpOwogCi1yZXRyeV9maW5kX2Nvbm46CiAJY29ubiA9IHJ4cnBjX2ZpbmRfY29ubmVjdGlvbl9yY3UobG9jYWwsIHNrYik7Ci0JaWYgKCFjb25uKQotCQlnb3RvIGNhbnRfcm91dGVfY2FsbDsKKwlpZiAoY29ubikgeworCQlpZiAoc3AtPmhkci5zZWN1cml0eUluZGV4ICE9IGNvbm4tPnNlY3VyaXR5X2l4KQorCQkJZ290byB3cm9uZ19zZWN1cml0eTsKIAotCWlmIChzcC0+aGRyLmNhbGxOdW1iZXIgPT0gMCkgewotCQkvKiBDb25uZWN0aW9uLWxldmVsIHBhY2tldCAqLwotCQlfZGVidWcoIkNPTk4gJXAgeyVkfSIsIGNvbm4sIGNvbm4tPmRlYnVnX2lkKTsKLQkJaWYgKCFyeHJwY19wb3N0X3BhY2tldF90b19jb25uKGNvbm4sIHNrYikpCi0JCQlnb3RvIHJldHJ5X2ZpbmRfY29ubjsKLQl9IGVsc2UgewotCQkvKiBDYWxsLWJvdW5kIHBhY2tldHMgYXJlIHJvdXRlZCBieSBjb25uZWN0aW9uIGNoYW5uZWwuICovCi0JCXVuc2lnbmVkIGludCBjaGFubmVsID0gc3AtPmhkci5jaWQgJiBSWFJQQ19DSEFOTkVMTUFTSzsKLQkJc3RydWN0IHJ4cnBjX2NoYW5uZWwgKmNoYW4gPSAmY29ubi0+Y2hhbm5lbHNbY2hhbm5lbF07Ci0JCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gcmN1X2RlcmVmZXJlbmNlKGNoYW4tPmNhbGwpOwotCi0JCWlmICghY2FsbCB8fCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpID09IDApCi0JCQlnb3RvIGNhbnRfcm91dGVfY2FsbDsKLQotCQlyeHJwY19wb3N0X3BhY2tldF90b19jYWxsKGNhbGwsIHNrYik7Ci0JfQotCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci1vdXQ6Ci0JcmV0dXJuOwotCi1jYW50X3JvdXRlX2NhbGw6Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlfZGVidWcoImNhbid0IHJvdXRlIGNhbGwiKTsKLQlpZiAoc3AtPmhkci5mbGFncyAmIFJYUlBDX0NMSUVOVF9JTklUSUFURUQgJiYKLQkgICAgc3AtPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEpIHsKLQkJaWYgKHNwLT5oZHIuc2VxID09IDEpIHsKLQkJCV9kZWJ1ZygiZmlyc3QgcGFja2V0Iik7Ci0JCQlza2JfcXVldWVfdGFpbCgmbG9jYWwtPmFjY2VwdF9xdWV1ZSwgc2tiKTsKLQkJCXJ4cnBjX3F1ZXVlX3dvcmsoJmxvY2FsLT5wcm9jZXNzb3IpOwotCQkJX2xlYXZlKCIgW2luY29taW5nXSIpOwotCQkJcmV0dXJuOworCQlpZiAoc3AtPmhkci5jYWxsTnVtYmVyID09IDApIHsKKwkJCS8qIENvbm5lY3Rpb24tbGV2ZWwgcGFja2V0ICovCisJCQlfZGVidWcoIkNPTk4gJXAgeyVkfSIsIGNvbm4sIGNvbm4tPmRlYnVnX2lkKTsKKwkJCXJ4cnBjX3Bvc3RfcGFja2V0X3RvX2Nvbm4oY29ubiwgc2tiKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKIAkJfQotCQlza2ItPnByaW9yaXR5ID0gUlhfSU5WQUxJRF9PUEVSQVRJT047CisKKwkJLyogTm90ZSB0aGUgc2VyaWFsIG51bWJlciBza2V3IGhlcmUgKi8KKwkJc2tldyA9IChpbnQpc3AtPmhkci5zZXJpYWwgLSAoaW50KWNvbm4tPmhpX3NlcmlhbDsKKwkJaWYgKHNrZXcgPj0gMCkgeworCQkJaWYgKHNrZXcgPiAwKQorCQkJCWNvbm4tPmhpX3NlcmlhbCA9IHNwLT5oZHIuc2VyaWFsOworCQl9IGVsc2UgeworCQkJc2tldyA9IC1za2V3OworCQkJc2tldyA9IG1pbihza2V3LCA2NTUzNSk7CisJCX0KKworCQkvKiBDYWxsLWJvdW5kIHBhY2tldHMgYXJlIHJvdXRlZCBieSBjb25uZWN0aW9uIGNoYW5uZWwuICovCisJCWNoYW5uZWwgPSBzcC0+aGRyLmNpZCAmIFJYUlBDX0NIQU5ORUxNQVNLOworCQljaGFuID0gJmNvbm4tPmNoYW5uZWxzW2NoYW5uZWxdOworCisJCS8qIElnbm9yZSByZWFsbHkgb2xkIGNhbGxzICovCisJCWlmIChzcC0+aGRyLmNhbGxOdW1iZXIgPCBjaGFuLT5sYXN0X2NhbGwpCisJCQlnb3RvIGRpc2NhcmRfdW5sb2NrOworCisJCWlmIChzcC0+aGRyLmNhbGxOdW1iZXIgPT0gY2hhbi0+bGFzdF9jYWxsKSB7CisJCQkvKiBGb3IgdGhlIHByZXZpb3VzIHNlcnZpY2UgY2FsbCwgaWYgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgd2UKKwkJCSAqIGRpc2NhcmQgYWxsIGZ1cnRoZXIgcGFja2V0cy4KKwkJCSAqLworCQkJaWYgKHJ4cnBjX2Nvbm5faXNfc2VydmljZShjb25uKSAmJgorCQkJICAgIChjaGFuLT5sYXN0X3R5cGUgPT0gUlhSUENfUEFDS0VUX1RZUEVfQUNLIHx8CisJCQkgICAgIHNwLT5oZHIudHlwZSA9PSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVCkpCisJCQkJZ290byBkaXNjYXJkX3VubG9jazsKKworCQkJLyogQnV0IG90aGVyd2lzZSB3ZSBuZWVkIHRvIHJldHJhbnNtaXQgdGhlIGZpbmFsIHBhY2tldCBmcm9tCisJCQkgKiBkYXRhIGNhY2hlZCBpbiB0aGUgY29ubmVjdGlvbiByZWNvcmQuCisJCQkgKi8KKwkJCXJ4cnBjX3Bvc3RfcGFja2V0X3RvX2Nvbm4oY29ubiwgc2tiKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCWNhbGwgPSByY3VfZGVyZWZlcmVuY2UoY2hhbi0+Y2FsbCk7CiAJfSBlbHNlIHsKLQkJc2tiLT5wcmlvcml0eSA9IFJYX0NBTExfREVBRDsKKwkJc2tldyA9IDA7CisJCWNhbGwgPSBOVUxMOwogCX0KIAotCWlmIChzcC0+aGRyLnR5cGUgIT0gUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpIHsKLQkJX2RlYnVnKCJyZWplY3QgdHlwZSAlZCIsc3AtPmhkci50eXBlKTsKLQkJcnhycGNfcmVqZWN0X3BhY2tldChsb2NhbCwgc2tiKTsKKwlpZiAoIWNhbGwgfHwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSA9PSAwKSB7CisJCWlmICghKHNwLT5oZHIudHlwZSAmIFJYUlBDX0NMSUVOVF9JTklUSUFURUQpIHx8CisJCSAgICBzcC0+aGRyLmNhbGxOdW1iZXIgPT0gMCB8fAorCQkgICAgc3AtPmhkci50eXBlICE9IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEpCisJCQlnb3RvIGJhZF9tZXNzYWdlX3VubG9jazsKKwkJaWYgKHNwLT5oZHIuc2VxICE9IDEpCisJCQlnb3RvIGRpc2NhcmRfdW5sb2NrOworCQljYWxsID0gcnhycGNfbmV3X2luY29taW5nX2NhbGwobG9jYWwsIGNvbm4sIHNrYik7CisJCWlmICghY2FsbCkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlnb3RvIHJlamVjdF9wYWNrZXQ7CisJCX0KKwkJcnhycGNfc2VuZF9waW5nKGNhbGwsIHNrYiwgc2tldyk7CiAJfQotCV9sZWF2ZSgiIFtubyBjYWxsXSIpOworCisJcnhycGNfaW5wdXRfY2FsbF9wYWNrZXQoY2FsbCwgc2tiLCBza2V3KTsKKwlnb3RvIGRpc2NhcmRfdW5sb2NrOworCitkaXNjYXJkX3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKK2Rpc2NhcmQ6CisJcnhycGNfZnJlZV9za2Ioc2tiLCByeHJwY19za2JfcnhfZnJlZWQpOworb3V0OgorCXRyYWNlX3J4cnBjX3J4X2RvbmUoMCwgMCk7CiAJcmV0dXJuOwogCitvdXRfdW5sb2NrOgorCXJjdV9yZWFkX3VubG9jaygpOworCWdvdG8gb3V0OworCit3cm9uZ19zZWN1cml0eToKKwlyY3VfcmVhZF91bmxvY2soKTsKKwl0cmFjZV9yeHJwY19hYm9ydCgiU0VDIiwgc3AtPmhkci5jaWQsIHNwLT5oZHIuY2FsbE51bWJlciwgc3AtPmhkci5zZXEsCisJCQkgIFJYS0FESU5DT05TSVNURU5DWSwgRUJBRE1TRyk7CisJc2tiLT5wcmlvcml0eSA9IFJYS0FESU5DT05TSVNURU5DWTsKKwlnb3RvIHBvc3RfYWJvcnQ7CisKK2JhZF9tZXNzYWdlX3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKIGJhZF9tZXNzYWdlOgorCXRyYWNlX3J4cnBjX2Fib3J0KCJCQUQiLCBzcC0+aGRyLmNpZCwgc3AtPmhkci5jYWxsTnVtYmVyLCBzcC0+aGRyLnNlcSwKKwkJCSAgUlhfUFJPVE9DT0xfRVJST1IsIEVCQURNU0cpOwogCXNrYi0+cHJpb3JpdHkgPSBSWF9QUk9UT0NPTF9FUlJPUjsKK3Bvc3RfYWJvcnQ6CisJc2tiLT5tYXJrID0gUlhSUENfU0tCX01BUktfTE9DQUxfQUJPUlQ7CityZWplY3RfcGFja2V0OgorCXRyYWNlX3J4cnBjX3J4X2RvbmUoc2tiLT5tYXJrLCBza2ItPnByaW9yaXR5KTsKIAlyeHJwY19yZWplY3RfcGFja2V0KGxvY2FsLCBza2IpOwogCV9sZWF2ZSgiIFtiYWRtc2ddIik7CiB9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvaW5zZWN1cmUuYyBiL25ldC9yeHJwYy9pbnNlY3VyZS5jCmluZGV4IGMyMWFkMjEuLjdkNDM3NWUgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9pbnNlY3VyZS5jCisrKyBiL25ldC9yeHJwYy9pbnNlY3VyZS5jCkBAIC0yMywzMSArMjMsMzYgQEAKIH0KIAogc3RhdGljIGludCBub25lX3NlY3VyZV9wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgICBzaXplX3QgZGF0YV9zaXplLAotCQkJICAgICAgIHZvaWQgKnNlY2hkcikKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICBzaXplX3QgZGF0YV9zaXplLAorCQkJICAgICAgdm9pZCAqc2VjaGRyKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG5vbmVfdmVyaWZ5X3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgIHUzMiAqX2Fib3J0X2NvZGUpCitzdGF0aWMgaW50IG5vbmVfdmVyaWZ5X3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW4sCisJCQkgICAgICByeHJwY19zZXFfdCBzZXEsIHUxNiBleHBlY3RlZF9ja3N1bSkKIHsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgbm9uZV9sb2NhdGVfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgKl9sZW4pCit7Cit9CisKIHN0YXRpYyBpbnQgbm9uZV9yZXNwb25kX3RvX2NoYWxsZW5nZShzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKLQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgIHUzMiAqX2Fib3J0X2NvZGUpCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgdTMyICpfYWJvcnRfY29kZSkKIHsKIAkqX2Fib3J0X2NvZGUgPSBSWF9QUk9UT0NPTF9FUlJPUjsKIAlyZXR1cm4gLUVQUk9UTzsKIH0KIAogc3RhdGljIGludCBub25lX3ZlcmlmeV9yZXNwb25zZShzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKLQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgdTMyICpfYWJvcnRfY29kZSkKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXUzMiAqX2Fib3J0X2NvZGUpCiB7CiAJKl9hYm9ydF9jb2RlID0gUlhfUFJPVE9DT0xfRVJST1I7CiAJcmV0dXJuIC1FUFJPVE87CkBAIC03OCw2ICs4Myw3IEBACiAJLnByaW1lX3BhY2tldF9zZWN1cml0eQkJPSBub25lX3ByaW1lX3BhY2tldF9zZWN1cml0eSwKIAkuc2VjdXJlX3BhY2tldAkJCT0gbm9uZV9zZWN1cmVfcGFja2V0LAogCS52ZXJpZnlfcGFja2V0CQkJPSBub25lX3ZlcmlmeV9wYWNrZXQsCisJLmxvY2F0ZV9kYXRhCQkJPSBub25lX2xvY2F0ZV9kYXRhLAogCS5yZXNwb25kX3RvX2NoYWxsZW5nZQkJPSBub25lX3Jlc3BvbmRfdG9fY2hhbGxlbmdlLAogCS52ZXJpZnlfcmVzcG9uc2UJCT0gbm9uZV92ZXJpZnlfcmVzcG9uc2UsCiAJLmNsZWFyCQkJCT0gbm9uZV9jbGVhciwKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9sb2NhbF9ldmVudC5jIGIvbmV0L3J4cnBjL2xvY2FsX2V2ZW50LmMKaW5kZXggMzFhM2Y4Ni4uNTQwZDM5NSAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2xvY2FsX2V2ZW50LmMKKysrIGIvbmV0L3J4cnBjL2xvY2FsX2V2ZW50LmMKQEAgLTE1LDggKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgogI2luY2x1ZGUgPGdlbmVyYXRlZC91dHNyZWxlYXNlLmg+CkBAIC0zMyw3ICszMSw3IEBACiB7CiAJc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyIHdoZHI7CiAJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOwotCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJc3RydWN0IHNvY2thZGRyX3J4cnBjIHNyeDsKIAlzdHJ1Y3QgbXNnaGRyIG1zZzsKIAlzdHJ1Y3Qga3ZlYyBpb3ZbMl07CiAJc2l6ZV90IGxlbjsKQEAgLTQxLDEyICszOSwxMSBAQAogCiAJX2VudGVyKCIiKTsKIAotCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQlzaW4uc2luX3BvcnQgPSB1ZHBfaGRyKHNrYiktPnNvdXJjZTsKLQlzaW4uc2luX2FkZHIuc19hZGRyID0gaXBfaGRyKHNrYiktPnNhZGRyOworCWlmIChyeHJwY19leHRyYWN0X2FkZHJfZnJvbV9za2IoJnNyeCwgc2tiKSA8IDApCisJCXJldHVybjsKIAotCW1zZy5tc2dfbmFtZQk9ICZzaW47Ci0JbXNnLm1zZ19uYW1lbGVuCT0gc2l6ZW9mKHNpbik7CisJbXNnLm1zZ19uYW1lCT0gJnNyeC50cmFuc3BvcnQ7CisJbXNnLm1zZ19uYW1lbGVuCT0gc3J4LnRyYW5zcG9ydF9sZW47CiAJbXNnLm1zZ19jb250cm9sCT0gTlVMTDsKIAltc2cubXNnX2NvbnRyb2xsZW4gPSAwOwogCW1zZy5tc2dfZmxhZ3MJPSAwOwpAQCAtOTMsMTEgKzkwLDEzIEBACiAJaWYgKHNrYikgewogCQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CiAKKwkJcnhycGNfc2VlX3NrYihza2IsIHJ4cnBjX3NrYl9yeF9zZWVuKTsKIAkJX2RlYnVnKCJ7JWR9LHsldX0iLCBsb2NhbC0+ZGVidWdfaWQsIHNwLT5oZHIudHlwZSk7CiAKIAkJc3dpdGNoIChzcC0+aGRyLnR5cGUpIHsKIAkJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9WRVJTSU9OOgotCQkJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCAmdiwgMSkgPCAwKQorCQkJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBzaXplb2Yoc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyKSwKKwkJCQkJICAmdiwgMSkgPCAwKQogCQkJCXJldHVybjsKIAkJCV9wcm90bygiUnggVkVSU0lPTiB7ICUwMnggfSIsIHYpOwogCQkJaWYgKHYgPT0gMCkKQEAgLTEwOSw3ICsxMDgsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlyeHJwY19mcmVlX3NrYihza2IpOworCQlyeHJwY19mcmVlX3NrYihza2IsIHJ4cnBjX3NrYl9yeF9mcmVlZCk7CiAJfQogCiAJX2xlYXZlKCIiKTsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9sb2NhbF9vYmplY3QuYyBiL25ldC9yeHJwYy9sb2NhbF9vYmplY3QuYwppbmRleCBhNzUzNzk2Li5mZjQ4NjRkNSAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2xvY2FsX29iamVjdC5jCisrKyBiL25ldC9yeHJwYy9sb2NhbF9vYmplY3QuYwpAQCAtNTgsNiArNTgsMTcgQEAKIAkJCW1lbWNtcCgmbG9jYWwtPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAogCQkJICAgICAgICZzcngtPnRyYW5zcG9ydC5zaW4uc2luX2FkZHIsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisjaWZkZWYgQ09ORklHX0FGX1JYUlBDX0lQVjYKKwljYXNlIEFGX0lORVQ2OgorCQkvKiBJZiB0aGUgY2hvaWNlIG9mIFVEUDYgcG9ydCBpcyBsZWZ0IHVwIHRvIHRoZSB0cmFuc3BvcnQsIHRoZW4KKwkJICogdGhlIGVuZHBvaW50IHJlY29yZCBkb2Vzbid0IG1hdGNoLgorCQkgKi8KKwkJcmV0dXJuICgodTE2IF9fZm9yY2UpbG9jYWwtPnNyeC50cmFuc3BvcnQuc2luNi5zaW42X3BvcnQgLQorCQkJKHUxNiBfX2ZvcmNlKXNyeC0+dHJhbnNwb3J0LnNpbjYuc2luNl9wb3J0KSA/OgorCQkJbWVtY21wKCZsb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW42LnNpbjZfYWRkciwKKwkJCSAgICAgICAmc3J4LT50cmFuc3BvcnQuc2luNi5zaW42X2FkZHIsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworI2VuZGlmCiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQpAQCAtNzUsOSArODYsNyBAQAogCQlhdG9taWNfc2V0KCZsb2NhbC0+dXNhZ2UsIDEpOwogCQlJTklUX0xJU1RfSEVBRCgmbG9jYWwtPmxpbmspOwogCQlJTklUX1dPUksoJmxvY2FsLT5wcm9jZXNzb3IsIHJ4cnBjX2xvY2FsX3Byb2Nlc3Nvcik7Ci0JCUlOSVRfTElTVF9IRUFEKCZsb2NhbC0+c2VydmljZXMpOwogCQlpbml0X3J3c2VtKCZsb2NhbC0+ZGVmcmFnX3NlbSk7Ci0JCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmxvY2FsLT5hY2NlcHRfcXVldWUpOwogCQlza2JfcXVldWVfaGVhZF9pbml0KCZsb2NhbC0+cmVqZWN0X3F1ZXVlKTsKIAkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbG9jYWwtPmV2ZW50X3F1ZXVlKTsKIAkJbG9jYWwtPmNsaWVudF9jb25ucyA9IFJCX1JPT1Q7CkBAIC0xMDEsMTEgKzExMCwxMiBAQAogCXN0cnVjdCBzb2NrICpzb2NrOwogCWludCByZXQsIG9wdDsKIAotCV9lbnRlcigiJXB7JWR9IiwgbG9jYWwsIGxvY2FsLT5zcngudHJhbnNwb3J0X3R5cGUpOworCV9lbnRlcigiJXB7JWQsJWR9IiwKKwkgICAgICAgbG9jYWwsIGxvY2FsLT5zcngudHJhbnNwb3J0X3R5cGUsIGxvY2FsLT5zcngudHJhbnNwb3J0LmZhbWlseSk7CiAKIAkvKiBjcmVhdGUgYSBzb2NrZXQgdG8gcmVwcmVzZW50IHRoZSBsb2NhbCBlbmRwb2ludCAqLwotCXJldCA9IHNvY2tfY3JlYXRlX2tlcm4oJmluaXRfbmV0LCBQRl9JTkVULCBsb2NhbC0+c3J4LnRyYW5zcG9ydF90eXBlLAotCQkJICAgICAgIElQUFJPVE9fVURQLCAmbG9jYWwtPnNvY2tldCk7CisJcmV0ID0gc29ja19jcmVhdGVfa2VybigmaW5pdF9uZXQsIGxvY2FsLT5zcngudHJhbnNwb3J0LmZhbWlseSwKKwkJCSAgICAgICBsb2NhbC0+c3J4LnRyYW5zcG9ydF90eXBlLCAwLCAmbG9jYWwtPnNvY2tldCk7CiAJaWYgKHJldCA8IDApIHsKIAkJX2xlYXZlKCIgPSAlZCBbc29ja2V0XSIsIHJldCk7CiAJCXJldHVybiByZXQ7CkBAIC0xNzAsMTggKzE4MCw4IEBACiAJbG9uZyBkaWZmOwogCWludCByZXQ7CiAKLQlpZiAoc3J4LT50cmFuc3BvcnQuZmFtaWx5ID09IEFGX0lORVQpIHsKLQkJX2VudGVyKCJ7JWQsJXUsJXBJNCslaHV9IiwKLQkJICAgICAgIHNyeC0+dHJhbnNwb3J0X3R5cGUsCi0JCSAgICAgICBzcngtPnRyYW5zcG9ydC5mYW1pbHksCi0JCSAgICAgICAmc3J4LT50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAotCQkgICAgICAgbnRvaHMoc3J4LT50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7Ci0JfSBlbHNlIHsKLQkJX2VudGVyKCJ7JWQsJXV9IiwKLQkJICAgICAgIHNyeC0+dHJhbnNwb3J0X3R5cGUsCi0JCSAgICAgICBzcngtPnRyYW5zcG9ydC5mYW1pbHkpOwotCQlyZXR1cm4gRVJSX1BUUigtRUFGTk9TVVBQT1JUKTsKLQl9CisJX2VudGVyKCJ7JWQsJWQsJXBJU3B9IiwKKwkgICAgICAgc3J4LT50cmFuc3BvcnRfdHlwZSwgc3J4LT50cmFuc3BvcnQuZmFtaWx5LCAmc3J4LT50cmFuc3BvcnQpOwogCiAJbXV0ZXhfbG9jaygmcnhycGNfbG9jYWxfbXV0ZXgpOwogCkBAIC0yMzQsMTMgKzIzNCw4IEBACiBmb3VuZDoKIAltdXRleF91bmxvY2soJnJ4cnBjX2xvY2FsX211dGV4KTsKIAotCV9uZXQoIkxPQ0FMICVzICVkIHslZCwldSwlcEk0KyVodX0iLAotCSAgICAgYWdlLAotCSAgICAgbG9jYWwtPmRlYnVnX2lkLAotCSAgICAgbG9jYWwtPnNyeC50cmFuc3BvcnRfdHlwZSwKLQkgICAgIGxvY2FsLT5zcngudHJhbnNwb3J0LmZhbWlseSwKLQkgICAgICZsb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIsCi0JICAgICBudG9ocyhsb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKwlfbmV0KCJMT0NBTCAlcyAlZCB7JXBJU3B9IiwKKwkgICAgIGFnZSwgbG9jYWwtPmRlYnVnX2lkLCAmbG9jYWwtPnNyeC50cmFuc3BvcnQpOwogCiAJX2xlYXZlKCIgPSAlcCIsIGxvY2FsKTsKIAlyZXR1cm4gbG9jYWw7CkBAIC0yOTYsNyArMjkxLDcgQEAKIAltdXRleF91bmxvY2soJnJ4cnBjX2xvY2FsX211dGV4KTsKIAogCUFTU0VSVChSQl9FTVBUWV9ST09UKCZsb2NhbC0+Y2xpZW50X2Nvbm5zKSk7Ci0JQVNTRVJUKGxpc3RfZW1wdHkoJmxvY2FsLT5zZXJ2aWNlcykpOworCUFTU0VSVCghbG9jYWwtPnNlcnZpY2UpOwogCiAJaWYgKHNvY2tldCkgewogCQlsb2NhbC0+c29ja2V0ID0gTlVMTDsKQEAgLTMwOCw3ICszMDMsNiBAQAogCS8qIEF0IHRoaXMgcG9pbnQsIHRoZXJlIHNob3VsZCBiZSBubyBtb3JlIHBhY2tldHMgY29taW5nIGluIHRvIHRoZQogCSAqIGxvY2FsIGVuZHBvaW50LgogCSAqLwotCXJ4cnBjX3B1cmdlX3F1ZXVlKCZsb2NhbC0+YWNjZXB0X3F1ZXVlKTsKIAlyeHJwY19wdXJnZV9xdWV1ZSgmbG9jYWwtPnJlamVjdF9xdWV1ZSk7CiAJcnhycGNfcHVyZ2VfcXVldWUoJmxvY2FsLT5ldmVudF9xdWV1ZSk7CiAKQEAgLTMzMiwxMSArMzI2LDYgQEAKIAkJaWYgKGF0b21pY19yZWFkKCZsb2NhbC0+dXNhZ2UpID09IDApCiAJCQlyZXR1cm4gcnhycGNfbG9jYWxfZGVzdHJveWVyKGxvY2FsKTsKIAotCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmbG9jYWwtPmFjY2VwdF9xdWV1ZSkpIHsKLQkJCXJ4cnBjX2FjY2VwdF9pbmNvbWluZ19jYWxscyhsb2NhbCk7Ci0JCQlhZ2FpbiA9IHRydWU7Ci0JCX0KLQogCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmbG9jYWwtPnJlamVjdF9xdWV1ZSkpIHsKIAkJCXJ4cnBjX3JlamVjdF9wYWNrZXRzKGxvY2FsKTsKIAkJCWFnYWluID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9taXNjLmMgYi9uZXQvcnhycGMvbWlzYy5jCmluZGV4IGJkYzVlNDIuLjlkMWM3MjEgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9taXNjLmMKKysrIGIvbmV0L3J4cnBjL21pc2MuYwpAQCAtMjEsMjggKzIxLDMzIEBACiB1bnNpZ25lZCBpbnQgcnhycGNfbWF4X2JhY2tsb2cgX19yZWFkX21vc3RseSA9IDEwOwogCiAvKgorICogTWF4aW11bSBsaWZldGltZSBvZiBhIGNhbGwgKGluIG14KS4KKyAqLwordW5zaWduZWQgaW50IHJ4cnBjX21heF9jYWxsX2xpZmV0aW1lID0gNjAgKiAxMDAwOworCisvKgogICogSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgc2NoZWR1bGluZyBBQ0sgZ2VuZXJhdGlvbiBhZnRlciBzZWVpbmcgYQotICogcGFja2V0IHdpdGggUlhSUENfUkVRVUVTVF9BQ0sgc2V0IChpbiBqaWZmaWVzKS4KKyAqIHBhY2tldCB3aXRoIFJYUlBDX1JFUVVFU1RfQUNLIHNldCAoaW4gbXMpLgogICovCiB1bnNpZ25lZCBpbnQgcnhycGNfcmVxdWVzdGVkX2Fja19kZWxheSA9IDE7CiAKIC8qCi0gKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBzY2hlZHVsaW5nIGFuIEFDSyB3aXRoIHN1YnR5cGUgREVMQVkgKGluIGppZmZpZXMpLgorICogSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgc2NoZWR1bGluZyBhbiBBQ0sgd2l0aCBzdWJ0eXBlIERFTEFZIChpbiBtcykuCiAgKgogICogV2UgdXNlIHRoaXMgd2hlbiB3ZSd2ZSByZWNlaXZlZCBuZXcgZGF0YSBwYWNrZXRzLiAgSWYgdGhvc2UgcGFja2V0cyBhcmVuJ3QKICAqIGFsbCBjb25zdW1lZCB3aXRoaW4gdGhpcyB0aW1lIHdlIHdpbGwgc2VuZCBhIERFTEFZIEFDSyBpZiBhbiBBQ0sgd2FzIG5vdAogICogcmVxdWVzdGVkIHRvIGxldCB0aGUgc2VuZGVyIGtub3cgaXQgZG9lc24ndCBuZWVkIHRvIHJlc2VuZC4KICAqLwotdW5zaWduZWQgaW50IHJ4cnBjX3NvZnRfYWNrX2RlbGF5ID0gMSAqIEhaOwordW5zaWduZWQgaW50IHJ4cnBjX3NvZnRfYWNrX2RlbGF5ID0gMSAqIDEwMDA7CiAKIC8qCi0gKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBzY2hlZHVsaW5nIGFuIEFDSyB3aXRoIHN1YnR5cGUgSURMRSAoaW4gamlmZmllcykuCisgKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBzY2hlZHVsaW5nIGFuIEFDSyB3aXRoIHN1YnR5cGUgSURMRSAoaW4gbXMpLgogICoKICAqIFdlIHVzZSB0aGlzIHdoZW4gd2UndmUgY29uc3VtZWQgc29tZSBwcmV2aW91c2x5IHNvZnQtQUNLJ2QgcGFja2V0cyB3aGVuCiAgKiBmdXJ0aGVyIHBhY2tldHMgYXJlbid0IGltbWVkaWF0ZWx5IHJlY2VpdmVkIHRvIGRlY2lkZSB3aGVuIHRvIHNlbmQgYW4gSURMRQogICogQUNLIGxldCB0aGUgb3RoZXIgZW5kIGtub3cgdGhhdCBpdCBjYW4gZnJlZSB1cCBpdHMgVHggYnVmZmVyIHNwYWNlLgogICovCi11bnNpZ25lZCBpbnQgcnhycGNfaWRsZV9hY2tfZGVsYXkgPSAwLjUgKiBIWjsKK3Vuc2lnbmVkIGludCByeHJwY19pZGxlX2Fja19kZWxheSA9IDAuNSAqIDEwMDA7CiAKIC8qCiAgKiBSZWNlaXZlIHdpbmRvdyBzaXplIGluIHBhY2tldHMuICBUaGlzIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKQEAgLTUwLDcgKzU1LDEwIEBACiAgKiBsaW1pdCBpcyBoaXQsIHdlIHNob3VsZCBnZW5lcmF0ZSBhbiBFWENFRURTX1dJTkRPVyBBQ0sgYW5kIGRpc2NhcmQgZnVydGhlcgogICogcGFja2V0cy4KICAqLwotdW5zaWduZWQgaW50IHJ4cnBjX3J4X3dpbmRvd19zaXplID0gMzI7Cit1bnNpZ25lZCBpbnQgcnhycGNfcnhfd2luZG93X3NpemUgPSBSWFJQQ19JTklUX1JYX1dJTkRPV19TSVpFOworI2lmIChSWFJQQ19SWFRYX0JVRkZfU0laRSAtIDEpIDwgUlhSUENfSU5JVF9SWF9XSU5ET1dfU0laRQorI2Vycm9yIE5lZWQgdG8gcmVkdWNlIFJYUlBDX0lOSVRfUlhfV0lORE9XX1NJWkUKKyNlbmRpZgogCiAvKgogICogTWF4aW11bSBSeCBNVFUgc2l6ZS4gIFRoaXMgaW5kaWNhdGVzIHRvIHRoZSBzZW5kZXIgdGhlIHNpemUgb2YganVtYm8gcGFja2V0CkBAIC02NCw2ICs3MiwxMSBAQAogICovCiB1bnNpZ25lZCBpbnQgcnhycGNfcnhfanVtYm9fbWF4ID0gNDsKIAorLyoKKyAqIFRpbWUgdGlsbCBwYWNrZXQgcmVzZW5kIChpbiBtaWxsaXNlY29uZHMpLgorICovCit1bnNpZ25lZCBpbnQgcnhycGNfcmVzZW5kX3RpbWVvdXQgPSA0ICogMTAwMDsKKwogY29uc3QgY2hhciAqY29uc3QgcnhycGNfcGt0c1tdID0gewogCSI/MDAiLAogCSJEQVRBIiwgIkFDSyIsICJCVVNZIiwgIkFCT1JUIiwgIkFDS0FMTCIsICJDSEFMTCIsICJSRVNQIiwgIkRFQlVHIiwKQEAgLTc1LDIxICs4OCwxNTIgQEAKIAlbUlhSUENfQUNLX0RFTEFZXQkJPSAxLAogCVtSWFJQQ19BQ0tfUkVRVUVTVEVEXQkJPSAyLAogCVtSWFJQQ19BQ0tfSURMRV0JCT0gMywKLQlbUlhSUENfQUNLX1BJTkdfUkVTUE9OU0VdCT0gNCwKLQlbUlhSUENfQUNLX0RVUExJQ0FURV0JCT0gNSwKLQlbUlhSUENfQUNLX09VVF9PRl9TRVFVRU5DRV0JPSA2LAotCVtSWFJQQ19BQ0tfRVhDRUVEU19XSU5ET1ddCT0gNywKLQlbUlhSUENfQUNLX05PU1BBQ0VdCQk9IDgsCisJW1JYUlBDX0FDS19EVVBMSUNBVEVdCQk9IDQsCisJW1JYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0VdCT0gNSwKKwlbUlhSUENfQUNLX0VYQ0VFRFNfV0lORE9XXQk9IDYsCisJW1JYUlBDX0FDS19OT1NQQUNFXQkJPSA3LAorCVtSWFJQQ19BQ0tfUElOR19SRVNQT05TRV0JPSA4LAorCVtSWFJQQ19BQ0tfUElOR10JCT0gOSwKIH07CiAKLWNvbnN0IGNoYXIgKnJ4cnBjX2Fja3ModTggcmVhc29uKQotewotCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzdHJbXSA9IHsKLQkJIi0tLSIsICJSRVEiLCAiRFVQIiwgIk9PUyIsICJXSU4iLCAiTUVNIiwgIlBORyIsICJQTlIiLCAiRExZIiwKLQkJIklETCIsICItPy0iCi0JfTsKK2NvbnN0IGNoYXIgY29uc3QgcnhycGNfYWNrX25hbWVzW1JYUlBDX0FDS19fSU5WQUxJRCArIDFdWzRdID0geworCSItLS0iLCAiUkVRIiwgIkRVUCIsICJPT1MiLCAiV0lOIiwgIk1FTSIsICJQTkciLCAiUE5SIiwgIkRMWSIsCisJIklETCIsICItPy0iCit9OwogCi0JaWYgKHJlYXNvbiA+PSBBUlJBWV9TSVpFKHN0cikpCi0JCXJlYXNvbiA9IEFSUkFZX1NJWkUoc3RyKSAtIDE7Ci0JcmV0dXJuIHN0cltyZWFzb25dOwotfQorY29uc3QgY2hhciByeHJwY19za2JfdHJhY2VzW3J4cnBjX3NrYl9fbnJfdHJhY2VdWzddID0geworCVtyeHJwY19za2JfcnhfY2xlYW5lZF0JCT0gIlJ4IENMTiIsCisJW3J4cnBjX3NrYl9yeF9mcmVlZF0JCT0gIlJ4IEZSRSIsCisJW3J4cnBjX3NrYl9yeF9nb3RdCQk9ICJSeCBHT1QiLAorCVtyeHJwY19za2JfcnhfbG9zdF0JCT0gIlJ4ICpMKiIsCisJW3J4cnBjX3NrYl9yeF9yZWNlaXZlZF0JCT0gIlJ4IFJDViIsCisJW3J4cnBjX3NrYl9yeF9wdXJnZWRdCQk9ICJSeCBQVVIiLAorCVtyeHJwY19za2Jfcnhfcm90YXRlZF0JCT0gIlJ4IFJPVCIsCisJW3J4cnBjX3NrYl9yeF9zZWVuXQkJPSAiUnggU0VFIiwKKwlbcnhycGNfc2tiX3R4X2NsZWFuZWRdCQk9ICJUeCBDTE4iLAorCVtyeHJwY19za2JfdHhfZnJlZWRdCQk9ICJUeCBGUkUiLAorCVtyeHJwY19za2JfdHhfZ290XQkJPSAiVHggR09UIiwKKwlbcnhycGNfc2tiX3R4X25ld10JCT0gIlR4IE5FVyIsCisJW3J4cnBjX3NrYl90eF9yb3RhdGVkXQkJPSAiVHggUk9UIiwKKwlbcnhycGNfc2tiX3R4X3NlZW5dCQk9ICJUeCBTRUUiLAorfTsKKworY29uc3QgY2hhciByeHJwY19jb25uX3RyYWNlc1tyeHJwY19jb25uX19ucl90cmFjZV1bNF0gPSB7CisJW3J4cnBjX2Nvbm5fbmV3X2NsaWVudF0JCT0gIk5XYyIsCisJW3J4cnBjX2Nvbm5fbmV3X3NlcnZpY2VdCT0gIk5XcyIsCisJW3J4cnBjX2Nvbm5fcXVldWVkXQkJPSAiUVVFIiwKKwlbcnhycGNfY29ubl9zZWVuXQkJPSAiU0VFIiwKKwlbcnhycGNfY29ubl9nb3RdCQk9ICJHT1QiLAorCVtyeHJwY19jb25uX3B1dF9jbGllbnRdCQk9ICJQVGMiLAorCVtyeHJwY19jb25uX3B1dF9zZXJ2aWNlXQk9ICJQVHMiLAorfTsKKworY29uc3QgY2hhciByeHJwY19jbGllbnRfdHJhY2VzW3J4cnBjX2NsaWVudF9fbnJfdHJhY2VdWzddID0geworCVtyeHJwY19jbGllbnRfYWN0aXZhdGVfY2hhbnNdCT0gIkFjdGl2YSIsCisJW3J4cnBjX2NsaWVudF9hbGxvY10JCT0gIkFsbG9jICIsCisJW3J4cnBjX2NsaWVudF9jaGFuX2FjdGl2YXRlXQk9ICJDaEFjdHYiLAorCVtyeHJwY19jbGllbnRfY2hhbl9kaXNjb25uZWN0XQk9ICJDaERpc2MiLAorCVtyeHJwY19jbGllbnRfY2hhbl9wYXNzXQk9ICJDaFBhc3MiLAorCVtyeHJwY19jbGllbnRfY2hhbl91bnN0YXJ0ZWRdCT0gIkNoVW5zdCIsCisJW3J4cnBjX2NsaWVudF9jbGVhbnVwXQkJPSAiQ2xlYW4gIiwKKwlbcnhycGNfY2xpZW50X2NvdW50XQkJPSAiQ291bnQgIiwKKwlbcnhycGNfY2xpZW50X2Rpc2NhcmRdCQk9ICJEaXNjYXIiLAorCVtyeHJwY19jbGllbnRfZHVwbGljYXRlXQk9ICJEdXBsaWMiLAorCVtyeHJwY19jbGllbnRfZXhwb3NlZF0JCT0gIkV4cG9zZSIsCisJW3J4cnBjX2NsaWVudF9yZXBsYWNlXQkJPSAiUmVwbGFjIiwKKwlbcnhycGNfY2xpZW50X3RvX2FjdGl2ZV0JPSAiLT5BY3R2IiwKKwlbcnhycGNfY2xpZW50X3RvX2N1bGxlZF0JPSAiLT5DdWxsIiwKKwlbcnhycGNfY2xpZW50X3RvX2lkbGVdCQk9ICItPklkbGUiLAorCVtyeHJwY19jbGllbnRfdG9faW5hY3RpdmVdCT0gIi0+SW5hYyIsCisJW3J4cnBjX2NsaWVudF90b193YWl0aW5nXQk9ICItPldhaXQiLAorCVtyeHJwY19jbGllbnRfdW5jb3VudF0JCT0gIlVuY291biIsCit9OworCitjb25zdCBjaGFyIHJ4cnBjX3RyYW5zbWl0X3RyYWNlc1tyeHJwY190cmFuc21pdF9fbnJfdHJhY2VdWzRdID0geworCVtyeHJwY190cmFuc21pdF93YWl0XQkJPSAiV0FJIiwKKwlbcnhycGNfdHJhbnNtaXRfcXVldWVdCQk9ICJRVUUiLAorCVtyeHJwY190cmFuc21pdF9xdWV1ZV9sYXN0XQk9ICJRTFMiLAorCVtyeHJwY190cmFuc21pdF9yb3RhdGVdCQk9ICJST1QiLAorCVtyeHJwY190cmFuc21pdF9yb3RhdGVfbGFzdF0JPSAiUkxTIiwKKwlbcnhycGNfdHJhbnNtaXRfYXdhaXRfcmVwbHldCT0gIkFXUiIsCisJW3J4cnBjX3RyYW5zbWl0X2VuZF0JCT0gIkVORCIsCit9OworCitjb25zdCBjaGFyIHJ4cnBjX3JlY2VpdmVfdHJhY2VzW3J4cnBjX3JlY2VpdmVfX25yX3RyYWNlXVs0XSA9IHsKKwlbcnhycGNfcmVjZWl2ZV9pbmNvbWluZ10JPSAiSU5DIiwKKwlbcnhycGNfcmVjZWl2ZV9xdWV1ZV0JCT0gIlFVRSIsCisJW3J4cnBjX3JlY2VpdmVfcXVldWVfbGFzdF0JPSAiUUxTIiwKKwlbcnhycGNfcmVjZWl2ZV9mcm9udF0JCT0gIkZSTiIsCisJW3J4cnBjX3JlY2VpdmVfcm90YXRlXQkJPSAiUk9UIiwKKwlbcnhycGNfcmVjZWl2ZV9lbmRdCQk9ICJFTkQiLAorfTsKKworY29uc3QgY2hhciByeHJwY19yZWN2bXNnX3RyYWNlc1tyeHJwY19yZWN2bXNnX19ucl90cmFjZV1bNV0gPSB7CisJW3J4cnBjX3JlY3Ztc2dfZW50ZXJdCQk9ICJFTlRSIiwKKwlbcnhycGNfcmVjdm1zZ193YWl0XQkJPSAiV0FJVCIsCisJW3J4cnBjX3JlY3Ztc2dfZGVxdWV1ZV0JCT0gIkRFUVUiLAorCVtyeHJwY19yZWN2bXNnX2hvbGVdCQk9ICJIT0xFIiwKKwlbcnhycGNfcmVjdm1zZ19uZXh0XQkJPSAiTkVYVCIsCisJW3J4cnBjX3JlY3Ztc2dfY29udF0JCT0gIkNPTlQiLAorCVtyeHJwY19yZWN2bXNnX2Z1bGxdCQk9ICJGVUxMIiwKKwlbcnhycGNfcmVjdm1zZ19kYXRhX3JldHVybl0JPSAiREFUQSIsCisJW3J4cnBjX3JlY3Ztc2dfdGVybWluYWxdCT0gIlRFUk0iLAorCVtyeHJwY19yZWN2bXNnX3RvX2JlX2FjY2VwdGVkXQk9ICJUQkFDIiwKKwlbcnhycGNfcmVjdm1zZ19yZXR1cm5dCQk9ICJSRVROIiwKK307CisKK2NvbnN0IGNoYXIgcnhycGNfcnR0X3R4X3RyYWNlc1tyeHJwY19ydHRfdHhfX25yX3RyYWNlXVs1XSA9IHsKKwlbcnhycGNfcnR0X3R4X3BpbmddCQk9ICJQSU5HIiwKKwlbcnhycGNfcnR0X3R4X2RhdGFdCQk9ICJEQVRBIiwKK307CisKK2NvbnN0IGNoYXIgcnhycGNfcnR0X3J4X3RyYWNlc1tyeHJwY19ydHRfcnhfX25yX3RyYWNlXVs1XSA9IHsKKwlbcnhycGNfcnR0X3J4X3BpbmdfcmVzcG9uc2VdCT0gIlBPTkciLAorCVtyeHJwY19ydHRfcnhfcmVxdWVzdGVkX2Fja10JPSAiUkFDSyIsCit9OworCitjb25zdCBjaGFyIHJ4cnBjX3RpbWVyX3RyYWNlc1tyeHJwY190aW1lcl9fbnJfdHJhY2VdWzhdID0geworCVtyeHJwY190aW1lcl9iZWdpbl0JCQk9ICJCZWdpbiAiLAorCVtyeHJwY190aW1lcl9leHBpcmVkXQkJCT0gIipFWFBSKiIsCisJW3J4cnBjX3RpbWVyX2luaXRfZm9yX3JlcGx5XQkJPSAiSW5pUnBsIiwKKwlbcnhycGNfdGltZXJfc2V0X2Zvcl9hY2tdCQk9ICJTZXRBY2siLAorCVtyeHJwY190aW1lcl9zZXRfZm9yX3NlbmRdCQk9ICJTZXRUeCAiLAorCVtyeHJwY190aW1lcl9zZXRfZm9yX3Jlc2VuZF0JCT0gIlNldFJUeCIsCit9OworCitjb25zdCBjaGFyIHJ4cnBjX3Byb3Bvc2VfYWNrX3RyYWNlc1tyeHJwY19wcm9wb3NlX2Fja19fbnJfdHJhY2VdWzhdID0geworCVtyeHJwY19wcm9wb3NlX2Fja19jbGllbnRfdHhfZW5kXQk9ICJDbFR4RW5kIiwKKwlbcnhycGNfcHJvcG9zZV9hY2tfaW5wdXRfZGF0YV0JCT0gIkRhdGFJbiAiLAorCVtyeHJwY19wcm9wb3NlX2Fja19waW5nX2Zvcl9sb3N0X2Fja10JPSAiTG9zdEFjayIsCisJW3J4cnBjX3Byb3Bvc2VfYWNrX3BpbmdfZm9yX2xvc3RfcmVwbHldCT0gIkxvc3RScGwiLAorCVtyeHJwY19wcm9wb3NlX2Fja19waW5nX2Zvcl9wYXJhbXNdCT0gIlBhcmFtcyAiLAorCVtyeHJwY19wcm9wb3NlX2Fja19yZXNwb25kX3RvX2Fja10JPSAiUnNwMkFjayIsCisJW3J4cnBjX3Byb3Bvc2VfYWNrX3Jlc3BvbmRfdG9fcGluZ10JPSAiUnNwMlBuZyIsCisJW3J4cnBjX3Byb3Bvc2VfYWNrX3JldHJ5X3R4XQkJPSAiUmV0cnlUeCIsCisJW3J4cnBjX3Byb3Bvc2VfYWNrX3JvdGF0ZV9yeF0JCT0gIlJ4QWNrICAiLAorCVtyeHJwY19wcm9wb3NlX2Fja190ZXJtaW5hbF9hY2tdCT0gIkNsVGVybSAiLAorfTsKKworY29uc3QgY2hhciAqY29uc3QgcnhycGNfcHJvcG9zZV9hY2tfb3V0Y29tZXNbcnhycGNfcHJvcG9zZV9hY2tfX25yX291dGNvbWVzXSA9IHsKKwlbcnhycGNfcHJvcG9zZV9hY2tfdXNlXQkJCT0gIiIsCisJW3J4cnBjX3Byb3Bvc2VfYWNrX3VwZGF0ZV0JCT0gIiBVcGRhdGUiLAorCVtyeHJwY19wcm9wb3NlX2Fja19zdWJzdW1lXQkJPSAiIFN1YnN1bWUiLAorfTsKKworY29uc3QgY2hhciByeHJwY19jb25nZXN0X21vZGVzW05SX19SWFJQQ19DT05HRVNUX01PREVTXVsxMF0gPSB7CisJW1JYUlBDX0NBTExfU0xPV19TVEFSVF0JCT0gIlNsb3dTdGFydCIsCisJW1JYUlBDX0NBTExfQ09OR0VTVF9BVk9JREFOQ0VdCT0gIkNvbmdBdm9pZCIsCisJW1JYUlBDX0NBTExfUEFDS0VUX0xPU1NdCT0gIlBrdExvc3MgICIsCisJW1JYUlBDX0NBTExfRkFTVF9SRVRSQU5TTUlUXQk9ICJGYXN0UmVUeCAiLAorfTsKKworY29uc3QgY2hhciByeHJwY19jb25nZXN0X2NoYW5nZXNbcnhycGNfY29uZ2VzdF9fbnJfY2hhbmdlXVs5XSA9IHsKKwlbcnhycGNfY29uZ19iZWdpbl9yZXRyYW5zbWlzc2lvbl0JPSAiIFJldHJhbnMiLAorCVtyeHJwY19jb25nX2NsZWFyZWRfbmFja3NdCQk9ICIgQ2xlYXJlZCIsCisJW3J4cnBjX2NvbmdfbmV3X2xvd19uYWNrXQkJPSAiIE5ld0xvd04iLAorCVtyeHJwY19jb25nX25vX2NoYW5nZV0JCQk9ICIiLAorCVtyeHJwY19jb25nX3Byb2dyZXNzXQkJCT0gIiBQcm9ncmVzIiwKKwlbcnhycGNfY29uZ19yZXRyYW5zbWl0X2FnYWluXQkJPSAiIFJlVHhBZ24iLAorCVtyeHJwY19jb25nX3J0dF93aW5kb3dfZW5kXQkJPSAiIFJ0dFdpbkUiLAorCVtyeHJwY19jb25nX3Nhd19uYWNrXQkJCT0gIiBTYXdOYWNrIiwKK307CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvb3V0cHV0LmMgYi9uZXQvcnhycGMvb3V0cHV0LmMKaW5kZXggZjRiZGEwNi4uMGQ0N2RiOCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL291dHB1dC5jCisrKyBiL25ldC9yeHJwYy9vdXRwdXQuYwpAQCAtMTQsMzM2ICsxNCwzMjYgQEAKICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9jaXJjX2J1Zi5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CiAjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKIAotLyoKLSAqIFRpbWUgdGlsbCBwYWNrZXQgcmVzZW5kIChpbiBqaWZmaWVzKS4KLSAqLwotdW5zaWduZWQgaW50IHJ4cnBjX3Jlc2VuZF90aW1lb3V0ID0gNCAqIEhaOwotCi1zdGF0aWMgaW50IHJ4cnBjX3NlbmRfZGF0YShzdHJ1Y3QgcnhycGNfc29jayAqcngsCi0JCQkgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCSAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbik7CitzdHJ1Y3QgcnhycGNfcGt0X2J1ZmZlciB7CisJc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyIHdoZHI7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHJ4cnBjX2Fja3BhY2tldCBhY2s7CisJCQl1OCBhY2tzWzI1NV07CisJCQl1OCBwYWRbM107CisJCX07CisJCV9fYmUzMiBhYm9ydF9jb2RlOworCX07CisJc3RydWN0IHJ4cnBjX2Fja2luZm8gYWNraW5mbzsKK307CiAKIC8qCi0gKiBleHRyYWN0IGNvbnRyb2wgbWVzc2FnZXMgZnJvbSB0aGUgc2VuZG1zZygpIGNvbnRyb2wgYnVmZmVyCisgKiBGaWxsIG91dCBhbiBBQ0sgcGFja2V0LgogICovCi1zdGF0aWMgaW50IHJ4cnBjX3NlbmRtc2dfY21zZyhzdHJ1Y3QgbXNnaGRyICptc2csCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICp1c2VyX2NhbGxfSUQsCi0JCQkgICAgICBlbnVtIHJ4cnBjX2NvbW1hbmQgKmNvbW1hbmQsCi0JCQkgICAgICB1MzIgKmFib3J0X2NvZGUsCi0JCQkgICAgICBib29sICpfZXhjbHVzaXZlKQorc3RhdGljIHNpemVfdCByeHJwY19maWxsX291dF9hY2soc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJIHN0cnVjdCByeHJwY19wa3RfYnVmZmVyICpwa3QsCisJCQkJIHJ4cnBjX3NlcV90ICpfaGFyZF9hY2ssCisJCQkJIHJ4cnBjX3NlcV90ICpfdG9wKQogewotCXN0cnVjdCBjbXNnaGRyICpjbXNnOwotCWJvb2wgZ290X3VzZXJfSUQgPSBmYWxzZTsKLQlpbnQgbGVuOworCXJ4cnBjX3NlcmlhbF90IHNlcmlhbDsKKwlyeHJwY19zZXFfdCBoYXJkX2FjaywgdG9wLCBzZXE7CisJaW50IGl4OworCXUzMiBtdHUsIGptYXg7CisJdTggKmFja3AgPSBwa3QtPmFja3M7CiAKLQkqY29tbWFuZCA9IFJYUlBDX0NNRF9TRU5EX0RBVEE7CisJLyogQmFycmllciBhZ2FpbnN0IHJ4cnBjX2lucHV0X2RhdGEoKS4gKi8KKwlzZXJpYWwgPSBjYWxsLT5hY2tyX3NlcmlhbDsKKwloYXJkX2FjayA9IFJFQURfT05DRShjYWxsLT5yeF9oYXJkX2Fjayk7CisJdG9wID0gc21wX2xvYWRfYWNxdWlyZSgmY2FsbC0+cnhfdG9wKTsKKwkqX2hhcmRfYWNrID0gaGFyZF9hY2s7CisJKl90b3AgPSB0b3A7CiAKLQlpZiAobXNnLT5tc2dfY29udHJvbGxlbiA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlwa3QtPmFjay5idWZmZXJTcGFjZQk9IGh0b25zKDgpOworCXBrdC0+YWNrLm1heFNrZXcJPSBodG9ucyhjYWxsLT5hY2tyX3NrZXcpOworCXBrdC0+YWNrLmZpcnN0UGFja2V0CT0gaHRvbmwoaGFyZF9hY2sgKyAxKTsKKwlwa3QtPmFjay5wcmV2aW91c1BhY2tldAk9IGh0b25sKGNhbGwtPmFja3JfcHJldl9zZXEpOworCXBrdC0+YWNrLnNlcmlhbAkJPSBodG9ubChzZXJpYWwpOworCXBrdC0+YWNrLnJlYXNvbgkJPSBjYWxsLT5hY2tyX3JlYXNvbjsKKwlwa3QtPmFjay5uQWNrcwkJPSB0b3AgLSBoYXJkX2FjazsKIAotCWZvcl9lYWNoX2Ntc2doZHIoY21zZywgbXNnKSB7Ci0JCWlmICghQ01TR19PSyhtc2csIGNtc2cpKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBrdC0+YWNrLnJlYXNvbiA9PSBSWFJQQ19BQ0tfUElORykKKwkJcGt0LT53aGRyLmZsYWdzIHw9IFJYUlBDX1JFUVVFU1RfQUNLOwogCi0JCWxlbiA9IGNtc2ctPmNtc2dfbGVuIC0gQ01TR19BTElHTihzaXplb2Yoc3RydWN0IGNtc2doZHIpKTsKLQkJX2RlYnVnKCJDTVNHICVkLCAlZCwgJWQiLAotCQkgICAgICAgY21zZy0+Y21zZ19sZXZlbCwgY21zZy0+Y21zZ190eXBlLCBsZW4pOworCWlmIChhZnRlcih0b3AsIGhhcmRfYWNrKSkgeworCQlzZXEgPSBoYXJkX2FjayArIDE7CisJCWRvIHsKKwkJCWl4ID0gc2VxICYgUlhSUENfUlhUWF9CVUZGX01BU0s7CisJCQlpZiAoY2FsbC0+cnh0eF9idWZmZXJbaXhdKQorCQkJCSphY2twKysgPSBSWFJQQ19BQ0tfVFlQRV9BQ0s7CisJCQllbHNlCisJCQkJKmFja3ArKyA9IFJYUlBDX0FDS19UWVBFX05BQ0s7CisJCQlzZXErKzsKKwkJfSB3aGlsZSAoYmVmb3JlX2VxKHNlcSwgdG9wKSk7CisJfQogCi0JCWlmIChjbXNnLT5jbXNnX2xldmVsICE9IFNPTF9SWFJQQykKLQkJCWNvbnRpbnVlOworCW10dSA9IGNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5pZl9tdHU7CisJbXR1IC09IGNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5oZHJzaXplOworCWptYXggPSAoY2FsbC0+bnJfanVtYm9fYmFkID4gMykgPyAxIDogcnhycGNfcnhfanVtYm9fbWF4OworCXBrdC0+YWNraW5mby5yeE1UVQk9IGh0b25sKHJ4cnBjX3J4X210dSk7CisJcGt0LT5hY2tpbmZvLm1heE1UVQk9IGh0b25sKG10dSk7CisJcGt0LT5hY2tpbmZvLnJ3aW5kCT0gaHRvbmwoY2FsbC0+cnhfd2luc2l6ZSk7CisJcGt0LT5hY2tpbmZvLmp1bWJvX21heAk9IGh0b25sKGptYXgpOwogCi0JCXN3aXRjaCAoY21zZy0+Y21zZ190eXBlKSB7Ci0JCWNhc2UgUlhSUENfVVNFUl9DQUxMX0lEOgotCQkJaWYgKG1zZy0+bXNnX2ZsYWdzICYgTVNHX0NNU0dfQ09NUEFUKSB7Ci0JCQkJaWYgKGxlbiAhPSBzaXplb2YodTMyKSkKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJKnVzZXJfY2FsbF9JRCA9ICoodTMyICopIENNU0dfREFUQShjbXNnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGxlbiAhPSBzaXplb2YodW5zaWduZWQgbG9uZykpCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCSp1c2VyX2NhbGxfSUQgPSAqKHVuc2lnbmVkIGxvbmcgKikKLQkJCQkJQ01TR19EQVRBKGNtc2cpOwotCQkJfQotCQkJX2RlYnVnKCJVc2VyIENhbGwgSUQgJWx4IiwgKnVzZXJfY2FsbF9JRCk7Ci0JCQlnb3RfdXNlcl9JRCA9IHRydWU7Ci0JCQlicmVhazsKKwkqYWNrcCsrID0gMDsKKwkqYWNrcCsrID0gMDsKKwkqYWNrcCsrID0gMDsKKwlyZXR1cm4gdG9wIC0gaGFyZF9hY2sgKyAzOworfQogCi0JCWNhc2UgUlhSUENfQUJPUlQ6Ci0JCQlpZiAoKmNvbW1hbmQgIT0gUlhSUENfQ01EX1NFTkRfREFUQSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCSpjb21tYW5kID0gUlhSUENfQ01EX1NFTkRfQUJPUlQ7Ci0JCQlpZiAobGVuICE9IHNpemVvZigqYWJvcnRfY29kZSkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkqYWJvcnRfY29kZSA9ICoodW5zaWduZWQgaW50ICopIENNU0dfREFUQShjbXNnKTsKLQkJCV9kZWJ1ZygiQWJvcnQgJXgiLCAqYWJvcnRfY29kZSk7Ci0JCQlpZiAoKmFib3J0X2NvZGUgPT0gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWJyZWFrOworLyoKKyAqIFNlbmQgYW4gQUNLIG9yIEFCT1JUIGNhbGwgcGFja2V0LgorICovCitpbnQgcnhycGNfc2VuZF9jYWxsX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTggdHlwZSkKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiA9IE5VTEw7CisJc3RydWN0IHJ4cnBjX3BrdF9idWZmZXIgKnBrdDsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3ZbMl07CisJcnhycGNfc2VyaWFsX3Qgc2VyaWFsOworCXJ4cnBjX3NlcV90IGhhcmRfYWNrLCB0b3A7CisJc2l6ZV90IGxlbiwgbjsKKwlib29sIHBpbmcgPSBmYWxzZTsKKwlpbnQgaW9jLCByZXQ7CisJdTMyIGFib3J0X2NvZGU7CiAKLQkJY2FzZSBSWFJQQ19BQ0NFUFQ6Ci0JCQlpZiAoKmNvbW1hbmQgIT0gUlhSUENfQ01EX1NFTkRfREFUQSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCSpjb21tYW5kID0gUlhSUENfQ01EX0FDQ0VQVDsKLQkJCWlmIChsZW4gIT0gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWJyZWFrOworCV9lbnRlcigiJXUsJXMiLCBjYWxsLT5kZWJ1Z19pZCwgcnhycGNfcGt0c1t0eXBlXSk7CiAKLQkJY2FzZSBSWFJQQ19FWENMVVNJVkVfQ0FMTDoKLQkJCSpfZXhjbHVzaXZlID0gdHJ1ZTsKLQkJCWlmIChsZW4gIT0gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7CisJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwlpZiAoY2FsbC0+Y29ubikKKwkJY29ubiA9IHJ4cnBjX2dldF9jb25uZWN0aW9uX21heWJlKGNhbGwtPmNvbm4pOworCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwlpZiAoIWNvbm4pCisJCXJldHVybiAtRUNPTk5SRVNFVDsKKworCXBrdCA9IGt6YWxsb2Moc2l6ZW9mKCpwa3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBrdCkgeworCQlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbXNnLm1zZ19uYW1lCT0gJmNhbGwtPnBlZXItPnNyeC50cmFuc3BvcnQ7CisJbXNnLm1zZ19uYW1lbGVuCT0gY2FsbC0+cGVlci0+c3J4LnRyYW5zcG9ydF9sZW47CisJbXNnLm1zZ19jb250cm9sCT0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfZmxhZ3MJPSAwOworCisJcGt0LT53aGRyLmVwb2NoCQk9IGh0b25sKGNvbm4tPnByb3RvLmVwb2NoKTsKKwlwa3QtPndoZHIuY2lkCQk9IGh0b25sKGNhbGwtPmNpZCk7CisJcGt0LT53aGRyLmNhbGxOdW1iZXIJPSBodG9ubChjYWxsLT5jYWxsX2lkKTsKKwlwa3QtPndoZHIuc2VxCQk9IDA7CisJcGt0LT53aGRyLnR5cGUJCT0gdHlwZTsKKwlwa3QtPndoZHIuZmxhZ3MJCT0gY29ubi0+b3V0X2NsaWVudGZsYWc7CisJcGt0LT53aGRyLnVzZXJTdGF0dXMJPSAwOworCXBrdC0+d2hkci5zZWN1cml0eUluZGV4CT0gY2FsbC0+c2VjdXJpdHlfaXg7CisJcGt0LT53aGRyLl9yc3ZkCQk9IDA7CisJcGt0LT53aGRyLnNlcnZpY2VJZAk9IGh0b25zKGNhbGwtPnNlcnZpY2VfaWQpOworCisJaW92WzBdLmlvdl9iYXNlCT0gcGt0OworCWlvdlswXS5pb3ZfbGVuCT0gc2l6ZW9mKHBrdC0+d2hkcik7CisJbGVuID0gc2l6ZW9mKHBrdC0+d2hkcik7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSzoKKwkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwkJaWYgKCFjYWxsLT5hY2tyX3JlYXNvbikgeworCQkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOworCQkJcmV0ID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXBpbmcgPSAoY2FsbC0+YWNrcl9yZWFzb24gPT0gUlhSUENfQUNLX1BJTkcpOworCQluID0gcnhycGNfZmlsbF9vdXRfYWNrKGNhbGwsIHBrdCwgJmhhcmRfYWNrLCAmdG9wKTsKKwkJY2FsbC0+YWNrcl9yZWFzb24gPSAwOworCisJCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCisJCXBrdC0+d2hkci5mbGFncyB8PSBSWFJQQ19TTE9XX1NUQVJUX09LOworCisJCWlvdlswXS5pb3ZfbGVuICs9IHNpemVvZihwa3QtPmFjaykgKyBuOworCQlpb3ZbMV0uaW92X2Jhc2UgPSAmcGt0LT5hY2tpbmZvOworCQlpb3ZbMV0uaW92X2xlbgk9IHNpemVvZihwa3QtPmFja2luZm8pOworCQlsZW4gKz0gc2l6ZW9mKHBrdC0+YWNrKSArIG4gKyBzaXplb2YocGt0LT5hY2tpbmZvKTsKKwkJaW9jID0gMjsKKwkJYnJlYWs7CisKKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOgorCQlhYm9ydF9jb2RlID0gY2FsbC0+YWJvcnRfY29kZTsKKwkJcGt0LT5hYm9ydF9jb2RlID0gaHRvbmwoYWJvcnRfY29kZSk7CisJCWlvdlswXS5pb3ZfbGVuICs9IHNpemVvZihwa3QtPmFib3J0X2NvZGUpOworCQlsZW4gKz0gc2l6ZW9mKHBrdC0+YWJvcnRfY29kZSk7CisJCWlvYyA9IDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldCA9IC1FTk9BTk87CisJCWdvdG8gb3V0OworCX0KKworCXNlcmlhbCA9IGF0b21pY19pbmNfcmV0dXJuKCZjb25uLT5zZXJpYWwpOworCXBrdC0+d2hkci5zZXJpYWwgPSBodG9ubChzZXJpYWwpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUNLOgorCQl0cmFjZV9yeHJwY190eF9hY2soY2FsbCwgc2VyaWFsLAorCQkJCSAgIG50b2hsKHBrdC0+YWNrLmZpcnN0UGFja2V0KSwKKwkJCQkgICBudG9obChwa3QtPmFjay5zZXJpYWwpLAorCQkJCSAgIHBrdC0+YWNrLnJlYXNvbiwgcGt0LT5hY2subkFja3MpOworCQlicmVhazsKKwl9CisKKwlpZiAocGluZykgeworCQljYWxsLT5hY2tyX3BpbmcgPSBzZXJpYWw7CisJCXNtcF93bWIoKTsKKwkJLyogV2UgbmVlZCB0byBzdGljayBhIHRpbWUgaW4gYmVmb3JlIHdlIHNlbmQgdGhlIHBhY2tldCBpbiBjYXNlCisJCSAqIHRoZSByZXBseSBnZXRzIGJhY2sgYmVmb3JlIGtlcm5lbF9zZW5kbXNnKCkgY29tcGxldGVzIC0gYnV0CisJCSAqIGFza2luZyBVRFAgdG8gc2VuZCB0aGUgcGFja2V0IGNhbiB0YWtlIGEgcmVsYXRpdmVseSBsb25nCisJCSAqIHRpbWUsIHNvIHdlIHVwZGF0ZSB0aGUgdGltZSBhZnRlciwgb24gdGhlIGFzc3VtcHRpb24gdGhhdAorCQkgKiB0aGUgcGFja2V0IHRyYW5zbWlzc2lvbiBpcyBtb3JlIGxpa2VseSB0byBoYXBwZW4gdG93YXJkcyB0aGUKKwkJICogZW5kIG9mIHRoZSBrZXJuZWxfc2VuZG1zZygpIGNhbGwuCisJCSAqLworCQljYWxsLT5hY2tyX3BpbmdfdGltZSA9IGt0aW1lX2dldF9yZWFsKCk7CisJCXNldF9iaXQoUlhSUENfQ0FMTF9QSU5HSU5HLCAmY2FsbC0+ZmxhZ3MpOworCQl0cmFjZV9yeHJwY19ydHRfdHgoY2FsbCwgcnhycGNfcnR0X3R4X3BpbmcsIHNlcmlhbCk7CisJfQorCXJldCA9IGtlcm5lbF9zZW5kbXNnKGNvbm4tPnBhcmFtcy5sb2NhbC0+c29ja2V0LAorCQkJICAgICAmbXNnLCBpb3YsIGlvYywgbGVuKTsKKwlpZiAocGluZykKKwkJY2FsbC0+YWNrcl9waW5nX3RpbWUgPSBrdGltZV9nZXRfcmVhbCgpOworCisJaWYgKHR5cGUgPT0gUlhSUENfUEFDS0VUX1RZUEVfQUNLICYmCisJICAgIGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQlpZiAocmV0IDwgMCkgeworCQkJY2xlYXJfYml0KFJYUlBDX0NBTExfUElOR0lORywgJmNhbGwtPmZsYWdzKTsKKwkJCXJ4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIHBrdC0+YWNrLnJlYXNvbiwKKwkJCQkJICBudG9ocyhwa3QtPmFjay5tYXhTa2V3KSwKKwkJCQkJICBudG9obChwa3QtPmFjay5zZXJpYWwpLAorCQkJCQkgIHRydWUsIHRydWUsCisJCQkJCSAgcnhycGNfcHJvcG9zZV9hY2tfcmV0cnlfdHgpOworCQl9IGVsc2UgeworCQkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwkJCWlmIChhZnRlcihoYXJkX2FjaywgY2FsbC0+YWNrcl9jb25zdW1lZCkpCisJCQkJY2FsbC0+YWNrcl9jb25zdW1lZCA9IGhhcmRfYWNrOworCQkJaWYgKGFmdGVyKHRvcCwgY2FsbC0+YWNrcl9zZWVuKSkKKwkJCQljYWxsLT5hY2tyX3NlZW4gPSB0b3A7CisJCQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CiAJCX0KIAl9CiAKLQlpZiAoIWdvdF91c2VyX0lEKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlfbGVhdmUoIiA9IDAiKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGFib3J0IGEgY2FsbCwgc2VuZGluZyBhbiBBQk9SVCBwYWNrZXQgdG8gdGhlIHBlZXIKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfc2VuZF9hYm9ydChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTMyIGFib3J0X2NvZGUpCi17Ci0Jd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0KLQlpZiAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSkgewotCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOwotCQljYWxsLT5sb2NhbF9hYm9ydCA9IGFib3J0X2NvZGU7Ci0JCXNldF9iaXQoUlhSUENfQ0FMTF9FVl9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7Ci0JCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5yZXNlbmRfdGltZXIpOwotCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKTsKLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfUkVTRU5EX1RJTUVSLCAmY2FsbC0+ZXZlbnRzKTsKLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfQUNLLCAmY2FsbC0+ZXZlbnRzKTsKLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfUlVOX1JUSU1FUiwgJmNhbGwtPmZsYWdzKTsKLQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQl9Ci0KLQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotfQotCi0vKgotICogQ3JlYXRlIGEgbmV3IGNsaWVudCBjYWxsIGZvciBzZW5kbXNnKCkuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcnhycGNfY2FsbCAqCi1yeHJwY19uZXdfY2xpZW50X2NhbGxfZm9yX3NlbmRtc2coc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LCBzdHJ1Y3QgbXNnaGRyICptc2csCi0JCQkJICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCwgYm9vbCBleGNsdXNpdmUpCi17Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5fcGFyYW1ldGVycyBjcDsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQlzdHJ1Y3Qga2V5ICprZXk7Ci0KLQlERUNMQVJFX1NPQ0tBRERSKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqLCBzcngsIG1zZy0+bXNnX25hbWUpOwotCi0JX2VudGVyKCIiKTsKLQotCWlmICghbXNnLT5tc2dfbmFtZSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVERVNUQUREUlJFUSk7Ci0KLQlrZXkgPSByeC0+a2V5OwotCWlmIChrZXkgJiYgIXJ4LT5rZXktPnBheWxvYWQuZGF0YVswXSkKLQkJa2V5ID0gTlVMTDsKLQotCW1lbXNldCgmY3AsIDAsIHNpemVvZihjcCkpOwotCWNwLmxvY2FsCQk9IHJ4LT5sb2NhbDsKLQljcC5rZXkJCQk9IHJ4LT5rZXk7Ci0JY3Auc2VjdXJpdHlfbGV2ZWwJPSByeC0+bWluX3NlY19sZXZlbDsKLQljcC5leGNsdXNpdmUJCT0gcngtPmV4Y2x1c2l2ZSB8IGV4Y2x1c2l2ZTsKLQljcC5zZXJ2aWNlX2lkCQk9IHNyeC0+c3J4X3NlcnZpY2U7Ci0JY2FsbCA9IHJ4cnBjX25ld19jbGllbnRfY2FsbChyeCwgJmNwLCBzcngsIHVzZXJfY2FsbF9JRCwgR0ZQX0tFUk5FTCk7Ci0KLQlfbGVhdmUoIiA9ICVwXG4iLCBjYWxsKTsKLQlyZXR1cm4gY2FsbDsKLX0KLQotLyoKLSAqIHNlbmQgYSBtZXNzYWdlIGZvcm1pbmcgcGFydCBvZiBhIGNsaWVudCBjYWxsIHRocm91Z2ggYW4gUnhSUEMgc29ja2V0Ci0gKiAtIGNhbGxlciBob2xkcyB0aGUgc29ja2V0IGxvY2tlZAotICogLSB0aGUgc29ja2V0IG1heSBiZSBlaXRoZXIgYSBjbGllbnQgc29ja2V0IG9yIGEgc2VydmVyIHNvY2tldAotICovCi1pbnQgcnhycGNfZG9fc2VuZG1zZyhzdHJ1Y3QgcnhycGNfc29jayAqcngsIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKLXsKLQllbnVtIHJ4cnBjX2NvbW1hbmQgY21kOwotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCXVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lEID0gMDsKLQlib29sIGV4Y2x1c2l2ZSA9IGZhbHNlOwotCXUzMiBhYm9ydF9jb2RlID0gMDsKLQlpbnQgcmV0OwotCi0JX2VudGVyKCIiKTsKLQotCXJldCA9IHJ4cnBjX3NlbmRtc2dfY21zZyhtc2csICZ1c2VyX2NhbGxfSUQsICZjbWQsICZhYm9ydF9jb2RlLAotCQkJCSAmZXhjbHVzaXZlKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChjbWQgPT0gUlhSUENfQ01EX0FDQ0VQVCkgewotCQlpZiAocngtPnNrLnNrX3N0YXRlICE9IFJYUlBDX1NFUlZFUl9MSVNURU5JTkcpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJY2FsbCA9IHJ4cnBjX2FjY2VwdF9jYWxsKHJ4LCB1c2VyX2NhbGxfSUQpOwotCQlpZiAoSVNfRVJSKGNhbGwpKQotCQkJcmV0dXJuIFBUUl9FUlIoY2FsbCk7Ci0JCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQljYWxsID0gcnhycGNfZmluZF9jYWxsX2J5X3VzZXJfSUQocngsIHVzZXJfY2FsbF9JRCk7Ci0JaWYgKCFjYWxsKSB7Ci0JCWlmIChjbWQgIT0gUlhSUENfQ01EX1NFTkRfREFUQSkKLQkJCXJldHVybiAtRUJBRFNMVDsKLQkJY2FsbCA9IHJ4cnBjX25ld19jbGllbnRfY2FsbF9mb3Jfc2VuZG1zZyhyeCwgbXNnLCB1c2VyX2NhbGxfSUQsCi0JCQkJCQkJIGV4Y2x1c2l2ZSk7Ci0JCWlmIChJU19FUlIoY2FsbCkpCi0JCQlyZXR1cm4gUFRSX0VSUihjYWxsKTsKLQl9Ci0KLQlfZGVidWcoIkNBTEwgJWQgVVNSICVseCBTVCAlZCBvbiBDT05OICVwIiwKLQkgICAgICAgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPnVzZXJfY2FsbF9JRCwgY2FsbC0+c3RhdGUsIGNhbGwtPmNvbm4pOwotCi0JaWYgKGNhbGwtPnN0YXRlID49IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKLQkJLyogaXQncyB0b28gbGF0ZSBmb3IgdGhpcyBjYWxsICovCi0JCXJldCA9IC1FQ09OTlJFU0VUOwotCX0gZWxzZSBpZiAoY21kID09IFJYUlBDX0NNRF9TRU5EX0FCT1JUKSB7Ci0JCXJ4cnBjX3NlbmRfYWJvcnQoY2FsbCwgYWJvcnRfY29kZSk7Ci0JCXJldCA9IDA7Ci0JfSBlbHNlIGlmIChjbWQgIT0gUlhSUENfQ01EX1NFTkRfREFUQSkgewotCQlyZXQgPSAtRUlOVkFMOwotCX0gZWxzZSBpZiAoIWNhbGwtPmluX2NsaWVudGZsYWcgJiYKLQkJICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUKSB7Ci0JCS8qIHJlcXVlc3QgcGhhc2UgY29tcGxldGUgZm9yIHRoaXMgY2xpZW50IGNhbGwgKi8KLQkJcmV0ID0gLUVQUk9UTzsKLQl9IGVsc2UgaWYgKGNhbGwtPmluX2NsaWVudGZsYWcgJiYKLQkJICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1QgJiYKLQkJICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9TRVJWRVJfU0VORF9SRVBMWSkgewotCQkvKiBSZXBseSBwaGFzZSBub3QgYmVndW4gb3Igbm90IGNvbXBsZXRlIGZvciBzZXJ2aWNlIGNhbGwuICovCi0JCXJldCA9IC1FUFJPVE87Ci0JfSBlbHNlIHsKLQkJcmV0ID0gcnhycGNfc2VuZF9kYXRhKHJ4LCBjYWxsLCBtc2csIGxlbik7Ci0JfQotCi0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7CitvdXQ6CisJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7CisJa2ZyZWUocGt0KTsKIAlyZXR1cm4gcmV0OwogfQogCi0vKioKLSAqIHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEgLSBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIHNlbmQgZGF0YSBvbiBhIGNhbGwKLSAqIEBjYWxsOiBUaGUgY2FsbCB0byBzZW5kIGRhdGEgdGhyb3VnaAotICogQG1zZzogVGhlIGRhdGEgdG8gc2VuZAotICogQGxlbjogVGhlIGFtb3VudCBvZiBkYXRhIHRvIHNlbmQKLSAqCi0gKiBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIHNlbmQgZGF0YSBvbiBhIGNhbGwuICBUaGUgY2FsbCBtdXN0IGJlIGluIGFuIHN0YXRlCi0gKiBhcHByb3ByaWF0ZSB0byBzZW5kaW5nIGRhdGEuICBObyBjb250cm9sIGRhdGEgc2hvdWxkIGJlIHN1cHBsaWVkIGluIEBtc2csCi0gKiBub3Igc2hvdWxkIGFuIGFkZHJlc3MgYmUgc3VwcGxpZWQuICBNU0dfTU9SRSBzaG91bGQgYmUgZmxhZ2dlZCBpZiB0aGVyZSdzCi0gKiBtb3JlIGRhdGEgdG8gY29tZSwgb3RoZXJ3aXNlIHRoaXMgZGF0YSB3aWxsIGVuZCB0aGUgdHJhbnNtaXNzaW9uIHBoYXNlLgotICovCi1pbnQgcnhycGNfa2VybmVsX3NlbmRfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IG1zZ2hkciAqbXNnLAotCQkJICAgc2l6ZV90IGxlbikKLXsKLQlpbnQgcmV0OwotCi0JX2VudGVyKCJ7JWQsJXN9LCIsIGNhbGwtPmRlYnVnX2lkLCByeHJwY19jYWxsX3N0YXRlc1tjYWxsLT5zdGF0ZV0pOwotCi0JQVNTRVJUQ01QKG1zZy0+bXNnX25hbWUsID09LCBOVUxMKTsKLQlBU1NFUlRDTVAobXNnLT5tc2dfY29udHJvbCwgPT0sIE5VTEwpOwotCi0JbG9ja19zb2NrKCZjYWxsLT5zb2NrZXQtPnNrKTsKLQotCV9kZWJ1ZygiQ0FMTCAlZCBVU1IgJWx4IFNUICVkIG9uIENPTk4gJXAiLAotCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgY2FsbC0+dXNlcl9jYWxsX0lELCBjYWxsLT5zdGF0ZSwgY2FsbC0+Y29ubik7Ci0KLQlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9DT01QTEVURSkgewotCQlyZXQgPSAtRVNIVVRET1dOOyAvKiBpdCdzIHRvbyBsYXRlIGZvciB0aGlzIGNhbGwgKi8KLQl9IGVsc2UgaWYgKGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVCAmJgotCQkgICBjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVCAmJgotCQkgICBjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX1NFUlZFUl9TRU5EX1JFUExZKSB7Ci0JCXJldCA9IC1FUFJPVE87IC8qIHJlcXVlc3QgcGhhc2UgY29tcGxldGUgZm9yIHRoaXMgY2xpZW50IGNhbGwgKi8KLQl9IGVsc2UgewotCQlyZXQgPSByeHJwY19zZW5kX2RhdGEoY2FsbC0+c29ja2V0LCBjYWxsLCBtc2csIGxlbik7Ci0JfQotCi0JcmVsZWFzZV9zb2NrKCZjYWxsLT5zb2NrZXQtPnNrKTsKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1FWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEpOwotCi0vKioKLSAqIHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBhYm9ydCBhIGNhbGwKLSAqIEBjYWxsOiBUaGUgY2FsbCB0byBiZSBhYm9ydGVkCi0gKiBAYWJvcnRfY29kZTogVGhlIGFib3J0IGNvZGUgdG8gc3RpY2sgaW50byB0aGUgQUJPUlQgcGFja2V0Ci0gKgotICogQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBhYm9ydCBhIGNhbGwsIGlmIGl0J3Mgc3RpbGwgaW4gYW4gYWJvcnRhYmxlIHN0YXRlLgotICovCi12b2lkIHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1MzIgYWJvcnRfY29kZSkKLXsKLQlfZW50ZXIoInslZH0sJWQiLCBjYWxsLT5kZWJ1Z19pZCwgYWJvcnRfY29kZSk7Ci0KLQlsb2NrX3NvY2soJmNhbGwtPnNvY2tldC0+c2spOwotCi0JX2RlYnVnKCJDQUxMICVkIFVTUiAlbHggU1QgJWQgb24gQ09OTiAlcCIsCi0JICAgICAgIGNhbGwtPmRlYnVnX2lkLCBjYWxsLT51c2VyX2NhbGxfSUQsIGNhbGwtPnN0YXRlLCBjYWxsLT5jb25uKTsKLQotCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUpCi0JCXJ4cnBjX3NlbmRfYWJvcnQoY2FsbCwgYWJvcnRfY29kZSk7Ci0KLQlyZWxlYXNlX3NvY2soJmNhbGwtPnNvY2tldC0+c2spOwotCV9sZWF2ZSgiIik7Ci19Ci0KLUVYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2Fib3J0X2NhbGwpOwotCiAvKgogICogc2VuZCBhIHBhY2tldCB0aHJvdWdoIHRoZSB0cmFuc3BvcnQgZW5kcG9pbnQKICAqLwotaW50IHJ4cnBjX3NlbmRfZGF0YV9wYWNrZXQoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IpCitpbnQgcnhycGNfc2VuZF9kYXRhX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgIGJvb2wgcmV0cmFucykKIHsKLQlzdHJ1Y3Qga3ZlYyBpb3ZbMV07CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPSBjYWxsLT5jb25uOworCXN0cnVjdCByeHJwY193aXJlX2hlYWRlciB3aGRyOworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKIAlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3ZbMl07CisJcnhycGNfc2VyaWFsX3Qgc2VyaWFsOworCXNpemVfdCBsZW47CisJYm9vbCBsb3N0ID0gZmFsc2U7CiAJaW50IHJldCwgb3B0OwogCiAJX2VudGVyKCIseyVkfSIsIHNrYi0+bGVuKTsKIAotCWlvdlswXS5pb3ZfYmFzZSA9IHNrYi0+aGVhZDsKLQlpb3ZbMF0uaW92X2xlbiA9IHNrYi0+bGVuOworCS8qIEVhY2ggdHJhbnNtaXNzaW9uIG9mIGEgVHggcGFja2V0IG5lZWRzIGEgbmV3IHNlcmlhbCBudW1iZXIgKi8KKwlzZXJpYWwgPSBhdG9taWNfaW5jX3JldHVybigmY29ubi0+c2VyaWFsKTsKIAotCW1zZy5tc2dfbmFtZSA9ICZjb25uLT5wYXJhbXMucGVlci0+c3J4LnRyYW5zcG9ydDsKLQltc2cubXNnX25hbWVsZW4gPSBjb25uLT5wYXJhbXMucGVlci0+c3J4LnRyYW5zcG9ydF9sZW47CisJd2hkci5lcG9jaAk9IGh0b25sKGNvbm4tPnByb3RvLmVwb2NoKTsKKwl3aGRyLmNpZAk9IGh0b25sKGNhbGwtPmNpZCk7CisJd2hkci5jYWxsTnVtYmVyCT0gaHRvbmwoY2FsbC0+Y2FsbF9pZCk7CisJd2hkci5zZXEJPSBodG9ubChzcC0+aGRyLnNlcSk7CisJd2hkci5zZXJpYWwJPSBodG9ubChzZXJpYWwpOworCXdoZHIudHlwZQk9IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEE7CisJd2hkci5mbGFncwk9IHNwLT5oZHIuZmxhZ3M7CisJd2hkci51c2VyU3RhdHVzCT0gMDsKKwl3aGRyLnNlY3VyaXR5SW5kZXggPSBjYWxsLT5zZWN1cml0eV9peDsKKwl3aGRyLl9yc3ZkCT0gaHRvbnMoc3AtPmhkci5fcnN2ZCk7CisJd2hkci5zZXJ2aWNlSWQJPSBodG9ucyhjYWxsLT5zZXJ2aWNlX2lkKTsKKworCWlvdlswXS5pb3ZfYmFzZSA9ICZ3aGRyOworCWlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKHdoZHIpOworCWlvdlsxXS5pb3ZfYmFzZSA9IHNrYi0+aGVhZDsKKwlpb3ZbMV0uaW92X2xlbiA9IHNrYi0+bGVuOworCWxlbiA9IGlvdlswXS5pb3ZfbGVuICsgaW92WzFdLmlvdl9sZW47CisKKwltc2cubXNnX25hbWUgPSAmY2FsbC0+cGVlci0+c3J4LnRyYW5zcG9ydDsKKwltc2cubXNnX25hbWVsZW4gPSBjYWxsLT5wZWVyLT5zcngudHJhbnNwb3J0X2xlbjsKIAltc2cubXNnX2NvbnRyb2wgPSBOVUxMOwogCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CiAJbXNnLm1zZ19mbGFncyA9IDA7CiAKKwkvKiBJZiBvdXIgUlRUIGNhY2hlIG5lZWRzIHdvcmtpbmcgb24sIHJlcXVlc3QgYW4gQUNLLiAgQWxzbyByZXF1ZXN0CisJICogQUNLcyBpZiBhIERBVEEgcGFja2V0IGFwcGVhcnMgdG8gaGF2ZSBiZWVuIGxvc3QuCisJICovCisJaWYgKHJldHJhbnMgfHwKKwkgICAgY2FsbC0+Y29uZ19tb2RlID09IFJYUlBDX0NBTExfU0xPV19TVEFSVCB8fAorCSAgICAoY2FsbC0+cGVlci0+cnR0X3VzYWdlIDwgMyAmJiBzcC0+aGRyLnNlcSAmIDEpIHx8CisJICAgIGt0aW1lX2JlZm9yZShrdGltZV9hZGRfbXMoY2FsbC0+cGVlci0+cnR0X2xhc3RfcmVxLCAxMDAwKSwKKwkJCSBrdGltZV9nZXRfcmVhbCgpKSkKKwkJd2hkci5mbGFncyB8PSBSWFJQQ19SRVFVRVNUX0FDSzsKKworCWlmIChJU19FTkFCTEVEKENPTkZJR19BRl9SWFJQQ19JTkpFQ1RfTE9TUykpIHsKKwkJc3RhdGljIGludCBsb3NlOworCQlpZiAoKGxvc2UrKyAmIDcpID09IDcpIHsKKwkJCXJldCA9IDA7CisJCQlsb3N0ID0gdHJ1ZTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCV9wcm90bygiVHggREFUQSAlJSV1IHsgIyV1IH0iLCBzZXJpYWwsIHNwLT5oZHIuc2VxKTsKKwogCS8qIHNlbmQgdGhlIHBhY2tldCB3aXRoIHRoZSBkb24ndCBmcmFnbWVudCBiaXQgc2V0IGlmIHdlIGN1cnJlbnRseQogCSAqIHRoaW5rIGl0J3Mgc21hbGwgZW5vdWdoICovCi0JaWYgKHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCByeHJwY193aXJlX2hlYWRlcikgPCBjb25uLT5wYXJhbXMucGVlci0+bWF4ZGF0YSkgewotCQlkb3duX3JlYWQoJmNvbm4tPnBhcmFtcy5sb2NhbC0+ZGVmcmFnX3NlbSk7Ci0JCS8qIHNlbmQgdGhlIHBhY2tldCBieSBVRFAKLQkJICogLSByZXR1cm5zIC1FTVNHU0laRSBpZiBVRFAgd291bGQgaGF2ZSB0byBmcmFnbWVudCB0aGUgcGFja2V0Ci0JCSAqICAgdG8gZ28gb3V0IG9mIHRoZSBpbnRlcmZhY2UKLQkJICogICAtIGluIHdoaWNoIGNhc2UsIHdlJ2xsIGhhdmUgcHJvY2Vzc2VkIHRoZSBJQ01QIGVycm9yCi0JCSAqICAgICBtZXNzYWdlIGFuZCB1cGRhdGUgdGhlIHBlZXIgcmVjb3JkCi0JCSAqLwotCQlyZXQgPSBrZXJuZWxfc2VuZG1zZyhjb25uLT5wYXJhbXMubG9jYWwtPnNvY2tldCwgJm1zZywgaW92LCAxLAotCQkJCSAgICAgaW92WzBdLmlvdl9sZW4pOworCWlmIChpb3ZbMV0uaW92X2xlbiA+PSBjYWxsLT5wZWVyLT5tYXhkYXRhKQorCQlnb3RvIHNlbmRfZnJhZ21lbnRhYmxlOwogCi0JCXVwX3JlYWQoJmNvbm4tPnBhcmFtcy5sb2NhbC0+ZGVmcmFnX3NlbSk7Ci0JCWlmIChyZXQgPT0gLUVNU0dTSVpFKQotCQkJZ290byBzZW5kX2ZyYWdtZW50YWJsZTsKKwlkb3duX3JlYWQoJmNvbm4tPnBhcmFtcy5sb2NhbC0+ZGVmcmFnX3NlbSk7CisJLyogc2VuZCB0aGUgcGFja2V0IGJ5IFVEUAorCSAqIC0gcmV0dXJucyAtRU1TR1NJWkUgaWYgVURQIHdvdWxkIGhhdmUgdG8gZnJhZ21lbnQgdGhlIHBhY2tldAorCSAqICAgdG8gZ28gb3V0IG9mIHRoZSBpbnRlcmZhY2UKKwkgKiAgIC0gaW4gd2hpY2ggY2FzZSwgd2UnbGwgaGF2ZSBwcm9jZXNzZWQgdGhlIElDTVAgZXJyb3IKKwkgKiAgICAgbWVzc2FnZSBhbmQgdXBkYXRlIHRoZSBwZWVyIHJlY29yZAorCSAqLworCXJldCA9IGtlcm5lbF9zZW5kbXNnKGNvbm4tPnBhcmFtcy5sb2NhbC0+c29ja2V0LCAmbXNnLCBpb3YsIDIsIGxlbik7CiAKLQkJX2xlYXZlKCIgPSAlZCBbJXVdIiwgcmV0LCBjb25uLT5wYXJhbXMucGVlci0+bWF4ZGF0YSk7Ci0JCXJldHVybiByZXQ7CisJdXBfcmVhZCgmY29ubi0+cGFyYW1zLmxvY2FsLT5kZWZyYWdfc2VtKTsKKwlpZiAocmV0ID09IC1FTVNHU0laRSkKKwkJZ290byBzZW5kX2ZyYWdtZW50YWJsZTsKKworZG9uZToKKwl0cmFjZV9yeHJwY190eF9kYXRhKGNhbGwsIHNwLT5oZHIuc2VxLCBzZXJpYWwsIHdoZHIuZmxhZ3MsCisJCQkgICAgcmV0cmFucywgbG9zdCk7CisJaWYgKHJldCA+PSAwKSB7CisJCWt0aW1lX3Qgbm93ID0ga3RpbWVfZ2V0X3JlYWwoKTsKKwkJc2tiLT50c3RhbXAgPSBub3c7CisJCXNtcF93bWIoKTsKKwkJc3AtPmhkci5zZXJpYWwgPSBzZXJpYWw7CisJCWlmICh3aGRyLmZsYWdzICYgUlhSUENfUkVRVUVTVF9BQ0spIHsKKwkJCWNhbGwtPnBlZXItPnJ0dF9sYXN0X3JlcSA9IG5vdzsKKwkJCXRyYWNlX3J4cnBjX3J0dF90eChjYWxsLCByeHJwY19ydHRfdHhfZGF0YSwgc2VyaWFsKTsKKwkJfQogCX0KKwlfbGVhdmUoIiA9ICVkIFsldV0iLCByZXQsIGNhbGwtPnBlZXItPm1heGRhdGEpOworCXJldHVybiByZXQ7CiAKIHNlbmRfZnJhZ21lbnRhYmxlOgogCS8qIGF0dGVtcHQgdG8gc2VuZCB0aGlzIG1lc3NhZ2Ugd2l0aCBmcmFnbWVudGF0aW9uIGVuYWJsZWQgKi8KQEAgLTM1OCw4ICszNDgsOCBAQAogCQkJCQlTT0xfSVAsIElQX01UVV9ESVNDT1ZFUiwKIAkJCQkJKGNoYXIgKikmb3B0LCBzaXplb2Yob3B0KSk7CiAJCWlmIChyZXQgPT0gMCkgewotCQkJcmV0ID0ga2VybmVsX3NlbmRtc2coY29ubi0+cGFyYW1zLmxvY2FsLT5zb2NrZXQsICZtc2csIGlvdiwgMSwKLQkJCQkJICAgICBpb3ZbMF0uaW92X2xlbik7CisJCQlyZXQgPSBrZXJuZWxfc2VuZG1zZyhjb25uLT5wYXJhbXMubG9jYWwtPnNvY2tldCwgJm1zZywKKwkJCQkJICAgICBpb3YsIDIsIGxlbik7CiAKIAkJCW9wdCA9IElQX1BNVFVESVNDX0RPOwogCQkJa2VybmVsX3NldHNvY2tvcHQoY29ubi0+cGFyYW1zLmxvY2FsLT5zb2NrZXQsIFNPTF9JUCwKQEAgLTM2NywzNTUgKzM1Nyw4MiBAQAogCQkJCQkgIChjaGFyICopJm9wdCwgc2l6ZW9mKG9wdCkpOwogCQl9CiAJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX0FGX1JYUlBDX0lQVjYKKwljYXNlIEFGX0lORVQ2OgorCQlvcHQgPSBJUFY2X1BNVFVESVNDX0RPTlQ7CisJCXJldCA9IGtlcm5lbF9zZXRzb2Nrb3B0KGNvbm4tPnBhcmFtcy5sb2NhbC0+c29ja2V0LAorCQkJCQlTT0xfSVBWNiwgSVBWNl9NVFVfRElTQ09WRVIsCisJCQkJCShjaGFyICopJm9wdCwgc2l6ZW9mKG9wdCkpOworCQlpZiAocmV0ID09IDApIHsKKwkJCXJldCA9IGtlcm5lbF9zZW5kbXNnKGNvbm4tPnBhcmFtcy5sb2NhbC0+c29ja2V0LCAmbXNnLAorCQkJCQkgICAgIGlvdiwgMSwgaW92WzBdLmlvdl9sZW4pOworCisJCQlvcHQgPSBJUFY2X1BNVFVESVNDX0RPOworCQkJa2VybmVsX3NldHNvY2tvcHQoY29ubi0+cGFyYW1zLmxvY2FsLT5zb2NrZXQsCisJCQkJCSAgU09MX0lQVjYsIElQVjZfTVRVX0RJU0NPVkVSLAorCQkJCQkgIChjaGFyICopJm9wdCwgc2l6ZW9mKG9wdCkpOworCQl9CisJCWJyZWFrOworI2VuZGlmCiAJfQogCiAJdXBfd3JpdGUoJmNvbm4tPnBhcmFtcy5sb2NhbC0+ZGVmcmFnX3NlbSk7Ci0JX2xlYXZlKCIgPSAlZCBbZnJhZyAldV0iLCByZXQsIGNvbm4tPnBhcmFtcy5wZWVyLT5tYXhkYXRhKTsKLQlyZXR1cm4gcmV0OworCWdvdG8gZG9uZTsKIH0KIAogLyoKLSAqIHdhaXQgZm9yIHNwYWNlIHRvIGFwcGVhciBpbiB0aGUgdHJhbnNtaXQvQUNLIHdpbmRvdwotICogLSBjYWxsZXIgaG9sZHMgdGhlIHNvY2tldCBsb2NrZWQKKyAqIHJlamVjdCBwYWNrZXRzIHRocm91Z2ggdGhlIGxvY2FsIGVuZHBvaW50CiAgKi8KLXN0YXRpYyBpbnQgcnhycGNfd2FpdF9mb3JfdHhfd2luZG93KHN0cnVjdCByeHJwY19zb2NrICpyeCwKLQkJCQkgICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkJICAgIGxvbmcgKnRpbWVvKQordm9pZCByeHJwY19yZWplY3RfcGFja2V0cyhzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsKQogewotCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7Ci0JaW50IHJldDsKKwlzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgc3J4OworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyIHdoZHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3ZbMl07CisJc2l6ZV90IHNpemU7CisJX19iZTMyIGNvZGU7CiAKLQlfZW50ZXIoIix7JWR9LCVsZCIsCi0JICAgICAgIENJUkNfU1BBQ0UoY2FsbC0+YWNrc19oZWFkLCBBQ0NFU1NfT05DRShjYWxsLT5hY2tzX3RhaWwpLAotCQkJICBjYWxsLT5hY2tzX3dpbnN6KSwKLQkgICAgICAgKnRpbWVvKTsKKwlfZW50ZXIoIiVkIiwgbG9jYWwtPmRlYnVnX2lkKTsKIAotCWFkZF93YWl0X3F1ZXVlKCZjYWxsLT50eF93YWl0cSwgJm15c2VsZik7CisJaW92WzBdLmlvdl9iYXNlID0gJndoZHI7CisJaW92WzBdLmlvdl9sZW4gPSBzaXplb2Yod2hkcik7CisJaW92WzFdLmlvdl9iYXNlID0gJmNvZGU7CisJaW92WzFdLmlvdl9sZW4gPSBzaXplb2YoY29kZSk7CisJc2l6ZSA9IHNpemVvZih3aGRyKSArIHNpemVvZihjb2RlKTsKIAotCWZvciAoOzspIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJcmV0ID0gMDsKLQkJaWYgKENJUkNfU1BBQ0UoY2FsbC0+YWNrc19oZWFkLCBBQ0NFU1NfT05DRShjYWxsLT5hY2tzX3RhaWwpLAotCQkJICAgICAgIGNhbGwtPmFja3Nfd2luc3opID4gMCkKLQkJCWJyZWFrOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCXJldCA9IHNvY2tfaW50cl9lcnJubygqdGltZW8pOwotCQkJYnJlYWs7CisJbXNnLm1zZ19uYW1lID0gJnNyeC50cmFuc3BvcnQ7CisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfZmxhZ3MgPSAwOworCisJbWVtc2V0KCZ3aGRyLCAwLCBzaXplb2Yod2hkcikpOworCXdoZHIudHlwZSA9IFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOworCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmbG9jYWwtPnJlamVjdF9xdWV1ZSkpKSB7CisJCXJ4cnBjX3NlZV9za2Ioc2tiLCByeHJwY19za2Jfcnhfc2Vlbik7CisJCXNwID0gcnhycGNfc2tiKHNrYik7CisKKwkJaWYgKHJ4cnBjX2V4dHJhY3RfYWRkcl9mcm9tX3NrYigmc3J4LCBza2IpID09IDApIHsKKwkJCW1zZy5tc2dfbmFtZWxlbiA9IHNyeC50cmFuc3BvcnRfbGVuOworCisJCQljb2RlID0gaHRvbmwoc2tiLT5wcmlvcml0eSk7CisKKwkJCXdoZHIuZXBvY2gJPSBodG9ubChzcC0+aGRyLmVwb2NoKTsKKwkJCXdoZHIuY2lkCT0gaHRvbmwoc3AtPmhkci5jaWQpOworCQkJd2hkci5jYWxsTnVtYmVyCT0gaHRvbmwoc3AtPmhkci5jYWxsTnVtYmVyKTsKKwkJCXdoZHIuc2VydmljZUlkCT0gaHRvbnMoc3AtPmhkci5zZXJ2aWNlSWQpOworCQkJd2hkci5mbGFncwk9IHNwLT5oZHIuZmxhZ3M7CisJCQl3aGRyLmZsYWdzCV49IFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7CisJCQl3aGRyLmZsYWdzCSY9IFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7CisKKwkJCWtlcm5lbF9zZW5kbXNnKGxvY2FsLT5zb2NrZXQsICZtc2csIGlvdiwgMiwgc2l6ZSk7CiAJCX0KIAotCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7Ci0JCSp0aW1lbyA9IHNjaGVkdWxlX3RpbWVvdXQoKnRpbWVvKTsKLQkJbG9ja19zb2NrKCZyeC0+c2spOwotCX0KLQotCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT50eF93YWl0cSwgJm15c2VsZik7Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogYXR0ZW1wdCB0byBzY2hlZHVsZSBhbiBpbnN0YW50IFR4IHJlc2VuZAotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfaW5zdGFudF9yZXNlbmQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0JcmVhZF9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQlpZiAodHJ5X3RvX2RlbF90aW1lcl9zeW5jKCZjYWxsLT5yZXNlbmRfdGltZXIpID49IDApIHsKLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfUlVOX1JUSU1FUiwgJmNhbGwtPmZsYWdzKTsKLQkJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSAmJgotCQkgICAgIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9SRVNFTkRfVElNRVIsICZjYWxsLT5ldmVudHMpKQotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQl9Ci0JcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotfQotCi0vKgotICogcXVldWUgYSBwYWNrZXQgZm9yIHRyYW5zbWlzc2lvbiwgc2V0IHRoZSByZXNlbmQgdGltZXIgYW5kIGF0dGVtcHQKLSAqIHRvIHNlbmQgdGhlIHBhY2tldCBpbW1lZGlhdGVseQotICovCi1zdGF0aWMgdm9pZCByeHJwY19xdWV1ZV9wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICAgYm9vbCBsYXN0KQotewotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKLQlpbnQgcmV0OwotCi0JX25ldCgicXVldWUgc2tiICVwIFslZF0iLCBza2IsIGNhbGwtPmFja3NfaGVhZCk7Ci0KLQlBU1NFUlQoY2FsbC0+YWNrc193aW5kb3cgIT0gTlVMTCk7Ci0JY2FsbC0+YWNrc193aW5kb3dbY2FsbC0+YWNrc19oZWFkXSA9ICh1bnNpZ25lZCBsb25nKSBza2I7Ci0Jc21wX3dtYigpOwotCWNhbGwtPmFja3NfaGVhZCA9IChjYWxsLT5hY2tzX2hlYWQgKyAxKSAmIChjYWxsLT5hY2tzX3dpbnN6IC0gMSk7Ci0KLQlpZiAobGFzdCB8fCBjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVCkgewotCQlfZGVidWcoIl9fX19fX19fYXdhaXRpbmcgcmVwbHkvQUNLX19fX19fX19fXyIpOwotCQl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQkJc3dpdGNoIChjYWxsLT5zdGF0ZSkgewotCQljYXNlIFJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVDoKLQkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFk7Ci0JCQlicmVhazsKLQkJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVDoKLQkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfU0VORF9SRVBMWTsKLQkJCWlmICghbGFzdCkKLQkJCQlicmVhazsKLQkJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9TRU5EX1JFUExZOgotCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9BV0FJVF9BQ0s7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JfQotCi0JX3Byb3RvKCJUeCBEQVRBICUlJXUgeyAjJXUgfSIsIHNwLT5oZHIuc2VyaWFsLCBzcC0+aGRyLnNlcSk7Ci0KLQlzcC0+bmVlZF9yZXNlbmQgPSBmYWxzZTsKLQlzcC0+cmVzZW5kX2F0ID0gamlmZmllcyArIHJ4cnBjX3Jlc2VuZF90aW1lb3V0OwotCWlmICghdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1JVTl9SVElNRVIsICZjYWxsLT5mbGFncykpIHsKLQkJX2RlYnVnKCJydW4gdGltZXIiKTsKLQkJY2FsbC0+cmVzZW5kX3RpbWVyLmV4cGlyZXMgPSBzcC0+cmVzZW5kX2F0OwotCQlhZGRfdGltZXIoJmNhbGwtPnJlc2VuZF90aW1lcik7Ci0JfQotCi0JLyogYXR0ZW1wdCB0byBjYW5jZWwgdGhlIHJ4LUFDSyB0aW1lciwgZGVmZXJyaW5nIHJlcGx5IHRyYW5zbWlzc2lvbiBpZgotCSAqIHdlJ3JlIEFDSydpbmcgdGhlIHJlcXVlc3QgcGhhc2Ugb2YgYW4gaW5jb21pbmcgY2FsbCAqLwotCXJldCA9IC1FQUdBSU47Ci0JaWYgKHRyeV90b19kZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKSA+PSAwKSB7Ci0JCS8qIHRoZSBwYWNrZXQgbWF5IGJlIGZyZWVkIGJ5IHJ4cnBjX3Byb2Nlc3NfY2FsbCgpIGJlZm9yZSB0aGlzCi0JCSAqIHJldHVybnMgKi8KLQkJcmV0ID0gcnhycGNfc2VuZF9kYXRhX3BhY2tldChjYWxsLT5jb25uLCBza2IpOwotCQlfbmV0KCJzZW50IHNrYiAlcCIsIHNrYik7Ci0JfSBlbHNlIHsKLQkJX2RlYnVnKCJmYWlsZWQgdG8gZGVsZXRlIEFDSyB0aW1lciIpOwotCX0KLQotCWlmIChyZXQgPCAwKSB7Ci0JCV9kZWJ1ZygibmVlZCBpbnN0YW50IHJlc2VuZCAlZCIsIHJldCk7Ci0JCXNwLT5uZWVkX3Jlc2VuZCA9IHRydWU7Ci0JCXJ4cnBjX2luc3RhbnRfcmVzZW5kKGNhbGwpOworCQlyeHJwY19mcmVlX3NrYihza2IsIHJ4cnBjX3NrYl9yeF9mcmVlZCk7CiAJfQogCiAJX2xlYXZlKCIiKTsKIH0KLQotLyoKLSAqIENvbnZlcnQgYSBob3N0LWVuZGlhbiBoZWFkZXIgaW50byBhIG5ldHdvcmstZW5kaWFuIGhlYWRlci4KLSAqLwotc3RhdGljIHZvaWQgcnhycGNfaW5zZXJ0X2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCByeHJwY193aXJlX2hlYWRlciB3aGRyOwotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKLQotCXdoZHIuZXBvY2gJPSBodG9ubChzcC0+aGRyLmVwb2NoKTsKLQl3aGRyLmNpZAk9IGh0b25sKHNwLT5oZHIuY2lkKTsKLQl3aGRyLmNhbGxOdW1iZXIJPSBodG9ubChzcC0+aGRyLmNhbGxOdW1iZXIpOwotCXdoZHIuc2VxCT0gaHRvbmwoc3AtPmhkci5zZXEpOwotCXdoZHIuc2VyaWFsCT0gaHRvbmwoc3AtPmhkci5zZXJpYWwpOwotCXdoZHIudHlwZQk9IHNwLT5oZHIudHlwZTsKLQl3aGRyLmZsYWdzCT0gc3AtPmhkci5mbGFnczsKLQl3aGRyLnVzZXJTdGF0dXMJPSBzcC0+aGRyLnVzZXJTdGF0dXM7Ci0Jd2hkci5zZWN1cml0eUluZGV4ID0gc3AtPmhkci5zZWN1cml0eUluZGV4OwotCXdoZHIuX3JzdmQJPSBodG9ucyhzcC0+aGRyLl9yc3ZkKTsKLQl3aGRyLnNlcnZpY2VJZAk9IGh0b25zKHNwLT5oZHIuc2VydmljZUlkKTsKLQotCW1lbWNweShza2ItPmhlYWQsICZ3aGRyLCBzaXplb2Yod2hkcikpOwotfQotCi0vKgotICogc2VuZCBkYXRhIHRocm91Z2ggYSBzb2NrZXQKLSAqIC0gbXVzdCBiZSBjYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0Ci0gKiAtIGNhbGxlciBob2xkcyB0aGUgc29ja2V0IGxvY2tlZAotICovCi1zdGF0aWMgaW50IHJ4cnBjX3NlbmRfZGF0YShzdHJ1Y3QgcnhycGNfc29jayAqcngsCi0JCQkgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCSAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IHNvY2sgKnNrID0gJnJ4LT5zazsKLQlsb25nIHRpbWVvOwotCWJvb2wgbW9yZTsKLQlpbnQgcmV0LCBjb3BpZWQ7Ci0KLQl0aW1lbyA9IHNvY2tfc25kdGltZW8oc2ssIG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlUKTsKLQotCS8qIHRoaXMgc2hvdWxkIGJlIGluIHBvbGwgKi8KLQlza19jbGVhcl9iaXQoU09DS1dRX0FTWU5DX05PU1BBQ0UsIHNrKTsKLQotCWlmIChzay0+c2tfZXJyIHx8IChzay0+c2tfc2h1dGRvd24gJiBTRU5EX1NIVVRET1dOKSkKLQkJcmV0dXJuIC1FUElQRTsKLQotCW1vcmUgPSBtc2ctPm1zZ19mbGFncyAmIE1TR19NT1JFOwotCi0Jc2tiID0gY2FsbC0+dHhfcGVuZGluZzsKLQljYWxsLT50eF9wZW5kaW5nID0gTlVMTDsKLQotCWNvcGllZCA9IDA7Ci0JZG8gewotCQlpZiAoIXNrYikgewotCQkJc2l6ZV90IHNpemUsIGNodW5rLCBtYXgsIHNwYWNlOwotCi0JCQlfZGVidWcoImFsbG9jIik7Ci0KLQkJCWlmIChDSVJDX1NQQUNFKGNhbGwtPmFja3NfaGVhZCwKLQkJCQkgICAgICAgQUNDRVNTX09OQ0UoY2FsbC0+YWNrc190YWlsKSwKLQkJCQkgICAgICAgY2FsbC0+YWNrc193aW5zeikgPD0gMCkgewotCQkJCXJldCA9IC1FQUdBSU47Ci0JCQkJaWYgKG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlUKQotCQkJCQlnb3RvIG1heWJlX2Vycm9yOwotCQkJCXJldCA9IHJ4cnBjX3dhaXRfZm9yX3R4X3dpbmRvdyhyeCwgY2FsbCwKLQkJCQkJCQkgICAgICAgJnRpbWVvKTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJZ290byBtYXliZV9lcnJvcjsKLQkJCX0KLQotCQkJbWF4ID0gY2FsbC0+Y29ubi0+cGFyYW1zLnBlZXItPm1heGRhdGE7Ci0JCQltYXggLT0gY2FsbC0+Y29ubi0+c2VjdXJpdHlfc2l6ZTsKLQkJCW1heCAmPSB+KGNhbGwtPmNvbm4tPnNpemVfYWxpZ24gLSAxVUwpOwotCi0JCQljaHVuayA9IG1heDsKLQkJCWlmIChjaHVuayA+IG1zZ19kYXRhX2xlZnQobXNnKSAmJiAhbW9yZSkKLQkJCQljaHVuayA9IG1zZ19kYXRhX2xlZnQobXNnKTsKLQotCQkJc3BhY2UgPSBjaHVuayArIGNhbGwtPmNvbm4tPnNpemVfYWxpZ247Ci0JCQlzcGFjZSAmPSB+KGNhbGwtPmNvbm4tPnNpemVfYWxpZ24gLSAxVUwpOwotCi0JCQlzaXplID0gc3BhY2UgKyBjYWxsLT5jb25uLT5oZWFkZXJfc2l6ZTsKLQotCQkJX2RlYnVnKCJTSVpFOiAlenUvJXp1LyV6dSIsIGNodW5rLCBzcGFjZSwgc2l6ZSk7Ci0KLQkJCS8qIGNyZWF0ZSBhIGJ1ZmZlciB0aGF0IHdlIGNhbiByZXRhaW4gdW50aWwgaXQncyBBQ0snZCAqLwotCQkJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYigKLQkJCQlzaywgc2l6ZSwgbXNnLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZyZXQpOwotCQkJaWYgKCFza2IpCi0JCQkJZ290byBtYXliZV9lcnJvcjsKLQotCQkJcnhycGNfbmV3X3NrYihza2IpOwotCi0JCQlfZGVidWcoIkFMTE9DIFNFTkQgJXAiLCBza2IpOwotCi0JCQlBU1NFUlRDTVAoc2tiLT5tYXJrLCA9PSwgMCk7Ci0KLQkJCV9kZWJ1ZygiSFM6ICV1IiwgY2FsbC0+Y29ubi0+aGVhZGVyX3NpemUpOwotCQkJc2tiX3Jlc2VydmUoc2tiLCBjYWxsLT5jb25uLT5oZWFkZXJfc2l6ZSk7Ci0JCQlza2ItPmxlbiArPSBjYWxsLT5jb25uLT5oZWFkZXJfc2l6ZTsKLQotCQkJc3AgPSByeHJwY19za2Ioc2tiKTsKLQkJCXNwLT5yZW1haW4gPSBjaHVuazsKLQkJCWlmIChzcC0+cmVtYWluID4gc2tiX3RhaWxyb29tKHNrYikpCi0JCQkJc3AtPnJlbWFpbiA9IHNrYl90YWlscm9vbShza2IpOwotCi0JCQlfbmV0KCJza2I6IGhyICVkLCB0ciAlZCwgaGwgJWQsIHJtICVkIiwKLQkJCSAgICAgICBza2JfaGVhZHJvb20oc2tiKSwKLQkJCSAgICAgICBza2JfdGFpbHJvb20oc2tiKSwKLQkJCSAgICAgICBza2JfaGVhZGxlbihza2IpLAotCQkJICAgICAgIHNwLT5yZW1haW4pOwotCi0JCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwotCQl9Ci0KLQkJX2RlYnVnKCJhcHBlbmQiKTsKLQkJc3AgPSByeHJwY19za2Ioc2tiKTsKLQotCQkvKiBhcHBlbmQgbmV4dCBzZWdtZW50IG9mIGRhdGEgdG8gdGhlIGN1cnJlbnQgYnVmZmVyICovCi0JCWlmIChtc2dfZGF0YV9sZWZ0KG1zZykgPiAwKSB7Ci0JCQlpbnQgY29weSA9IHNrYl90YWlscm9vbShza2IpOwotCQkJQVNTRVJUQ01QKGNvcHksID4sIDApOwotCQkJaWYgKGNvcHkgPiBtc2dfZGF0YV9sZWZ0KG1zZykpCi0JCQkJY29weSA9IG1zZ19kYXRhX2xlZnQobXNnKTsKLQkJCWlmIChjb3B5ID4gc3AtPnJlbWFpbikKLQkJCQljb3B5ID0gc3AtPnJlbWFpbjsKLQotCQkJX2RlYnVnKCJhZGQiKTsKLQkJCXJldCA9IHNrYl9hZGRfZGF0YShza2IsICZtc2ctPm1zZ19pdGVyLCBjb3B5KTsKLQkJCV9kZWJ1ZygiYWRkZWQiKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWdvdG8gZWZhdWx0OwotCQkJc3AtPnJlbWFpbiAtPSBjb3B5OwotCQkJc2tiLT5tYXJrICs9IGNvcHk7Ci0JCQljb3BpZWQgKz0gY29weTsKLQkJfQotCi0JCS8qIGNoZWNrIGZvciB0aGUgZmFyIHNpZGUgYWJvcnRpbmcgdGhlIGNhbGwgb3IgYSBuZXR3b3JrIGVycm9yCi0JCSAqIG9jY3VycmluZyAqLwotCQlpZiAoY2FsbC0+c3RhdGUgPiBSWFJQQ19DQUxMX0NPTVBMRVRFKQotCQkJZ290byBjYWxsX2Fib3J0ZWQ7Ci0KLQkJLyogYWRkIHRoZSBwYWNrZXQgdG8gdGhlIHNlbmQgcXVldWUgaWYgaXQncyBub3cgZnVsbCAqLwotCQlpZiAoc3AtPnJlbWFpbiA8PSAwIHx8Ci0JCSAgICAobXNnX2RhdGFfbGVmdChtc2cpID09IDAgJiYgIW1vcmUpKSB7Ci0JCQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiA9IGNhbGwtPmNvbm47Ci0JCQl1aW50MzJfdCBzZXE7Ci0JCQlzaXplX3QgcGFkOwotCi0JCQkvKiBwYWQgb3V0IGlmIHdlJ3JlIHVzaW5nIHNlY3VyaXR5ICovCi0JCQlpZiAoY29ubi0+c2VjdXJpdHlfaXgpIHsKLQkJCQlwYWQgPSBjb25uLT5zZWN1cml0eV9zaXplICsgc2tiLT5tYXJrOwotCQkJCXBhZCA9IGNvbm4tPnNpemVfYWxpZ24gLSBwYWQ7Ci0JCQkJcGFkICY9IGNvbm4tPnNpemVfYWxpZ24gLSAxOwotCQkJCV9kZWJ1ZygicGFkICV6dSIsIHBhZCk7Ci0JCQkJaWYgKHBhZCkKLQkJCQkJbWVtc2V0KHNrYl9wdXQoc2tiLCBwYWQpLCAwLCBwYWQpOwotCQkJfQotCi0JCQlzZXEgPSBhdG9taWNfaW5jX3JldHVybigmY2FsbC0+c2VxdWVuY2UpOwotCi0JCQlzcC0+aGRyLmVwb2NoCT0gY29ubi0+cHJvdG8uZXBvY2g7Ci0JCQlzcC0+aGRyLmNpZAk9IGNhbGwtPmNpZDsKLQkJCXNwLT5oZHIuY2FsbE51bWJlciA9IGNhbGwtPmNhbGxfaWQ7Ci0JCQlzcC0+aGRyLnNlcQk9IHNlcTsKLQkJCXNwLT5oZHIuc2VyaWFsCT0gYXRvbWljX2luY19yZXR1cm4oJmNvbm4tPnNlcmlhbCk7Ci0JCQlzcC0+aGRyLnR5cGUJPSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBOwotCQkJc3AtPmhkci51c2VyU3RhdHVzID0gMDsKLQkJCXNwLT5oZHIuc2VjdXJpdHlJbmRleCA9IGNvbm4tPnNlY3VyaXR5X2l4OwotCQkJc3AtPmhkci5fcnN2ZAk9IDA7Ci0JCQlzcC0+aGRyLnNlcnZpY2VJZCA9IGNhbGwtPnNlcnZpY2VfaWQ7Ci0KLQkJCXNwLT5oZHIuZmxhZ3MgPSBjb25uLT5vdXRfY2xpZW50ZmxhZzsKLQkJCWlmIChtc2dfZGF0YV9sZWZ0KG1zZykgPT0gMCAmJiAhbW9yZSkKLQkJCQlzcC0+aGRyLmZsYWdzIHw9IFJYUlBDX0xBU1RfUEFDS0VUOwotCQkJZWxzZSBpZiAoQ0lSQ19TUEFDRShjYWxsLT5hY2tzX2hlYWQsCi0JCQkJCSAgICBBQ0NFU1NfT05DRShjYWxsLT5hY2tzX3RhaWwpLAotCQkJCQkgICAgY2FsbC0+YWNrc193aW5zeikgPiAxKQotCQkJCXNwLT5oZHIuZmxhZ3MgfD0gUlhSUENfTU9SRV9QQUNLRVRTOwotCQkJaWYgKG1vcmUgJiYgc2VxICYgMSkKLQkJCQlzcC0+aGRyLmZsYWdzIHw9IFJYUlBDX1JFUVVFU1RfQUNLOwotCi0JCQlyZXQgPSBjb25uLT5zZWN1cml0eS0+c2VjdXJlX3BhY2tldCgKLQkJCQljYWxsLCBza2IsIHNrYi0+bWFyaywKLQkJCQlza2ItPmhlYWQgKyBzaXplb2Yoc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyKSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlnb3RvIG91dDsKLQotCQkJcnhycGNfaW5zZXJ0X2hlYWRlcihza2IpOwotCQkJcnhycGNfcXVldWVfcGFja2V0KGNhbGwsIHNrYiwgIW1zZ19kYXRhX2xlZnQobXNnKSAmJiAhbW9yZSk7Ci0JCQlza2IgPSBOVUxMOwotCQl9Ci0JfSB3aGlsZSAobXNnX2RhdGFfbGVmdChtc2cpID4gMCk7Ci0KLXN1Y2Nlc3M6Ci0JcmV0ID0gY29waWVkOwotb3V0OgotCWNhbGwtPnR4X3BlbmRpbmcgPSBza2I7Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLQotY2FsbF9hYm9ydGVkOgotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci0JaWYgKGNhbGwtPnN0YXRlID09IFJYUlBDX0NBTExfTkVUV09SS19FUlJPUikKLQkJcmV0ID0gY2FsbC0+ZXJyb3JfcmVwb3J0IDwgUlhSUENfTE9DQUxfRVJST1JfT0ZGU0VUID8KLQkJCWNhbGwtPmVycm9yX3JlcG9ydCA6Ci0JCQljYWxsLT5lcnJvcl9yZXBvcnQgLSBSWFJQQ19MT0NBTF9FUlJPUl9PRkZTRVQ7Ci0JZWxzZQotCQlyZXQgPSAtRUNPTk5BQk9SVEVEOwotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci0KLW1heWJlX2Vycm9yOgotCWlmIChjb3BpZWQpCi0JCWdvdG8gc3VjY2VzczsKLQlnb3RvIG91dDsKLQotZWZhdWx0OgotCXJldCA9IC1FRkFVTFQ7Ci0JZ290byBvdXQ7Ci19CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvcGVlcl9ldmVudC5jIGIvbmV0L3J4cnBjL3BlZXJfZXZlbnQuYwppbmRleCA4OTQwNjc0Li5iZjEzYjg0IDEwMDY0NAotLS0gYS9uZXQvcnhycGMvcGVlcl9ldmVudC5jCisrKyBiL25ldC9yeHJwYy9wZWVyX2V2ZW50LmMKQEAgLTY2LDYgKzY2LDMyIEBACiAJCX0KIAkJYnJlYWs7CiAKKyNpZmRlZiBDT05GSUdfQUZfUlhSUENfSVBWNgorCWNhc2UgQUZfSU5FVDY6CisJCXNyeC50cmFuc3BvcnQuc2luNi5zaW42X3BvcnQgPSBzZXJyLT5wb3J0OworCQlzcngudHJhbnNwb3J0X2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwkJc3dpdGNoIChzZXJyLT5lZS5lZV9vcmlnaW4pIHsKKwkJY2FzZSBTT19FRV9PUklHSU5fSUNNUDY6CisJCQlfbmV0KCJSeCBJQ01QNiIpOworCQkJbWVtY3B5KCZzcngudHJhbnNwb3J0LnNpbjYuc2luNl9hZGRyLAorCQkJICAgICAgIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgc2Vyci0+YWRkcl9vZmZzZXQsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQkJYnJlYWs7CisJCWNhc2UgU09fRUVfT1JJR0lOX0lDTVA6CisJCQlfbmV0KCJSeCBJQ01QIG9uIHY2IHNvY2siKTsKKwkJCW1lbWNweShzcngudHJhbnNwb3J0LnNpbjYuc2luNl9hZGRyLnM2X2FkZHIgKyAxMiwKKwkJCSAgICAgICBza2JfbmV0d29ya19oZWFkZXIoc2tiKSArIHNlcnItPmFkZHJfb2Zmc2V0LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltZW1jcHkoJnNyeC50cmFuc3BvcnQuc2luNi5zaW42X2FkZHIsCisJCQkgICAgICAgJmlwdjZfaGRyKHNrYiktPnNhZGRyLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworI2VuZGlmCisKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0xMjksMjIgKzE1NSwyMSBAQAogCQlfbGVhdmUoIlVEUCBzb2NrZXQgZXJycXVldWUgZW1wdHkiKTsKIAkJcmV0dXJuOwogCX0KKwlyeHJwY19uZXdfc2tiKHNrYiwgcnhycGNfc2tiX3J4X3JlY2VpdmVkKTsKIAlzZXJyID0gU0tCX0VYVF9FUlIoc2tiKTsKIAlpZiAoIXNrYi0+bGVuICYmIHNlcnItPmVlLmVlX29yaWdpbiA9PSBTT19FRV9PUklHSU5fVElNRVNUQU1QSU5HKSB7CiAJCV9sZWF2ZSgiVURQIGVtcHR5IG1lc3NhZ2UiKTsKLQkJa2ZyZWVfc2tiKHNrYik7CisJCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3J4X2ZyZWVkKTsKIAkJcmV0dXJuOwogCX0KIAotCXJ4cnBjX25ld19za2Ioc2tiKTsKLQogCXJjdV9yZWFkX2xvY2soKTsKIAlwZWVyID0gcnhycGNfbG9va3VwX3BlZXJfaWNtcF9yY3UobG9jYWwsIHNrYik7CiAJaWYgKHBlZXIgJiYgIXJ4cnBjX2dldF9wZWVyX21heWJlKHBlZXIpKQogCQlwZWVyID0gTlVMTDsKIAlpZiAoIXBlZXIpIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3J4X2ZyZWVkKTsKIAkJX2xlYXZlKCIgW25vIHBlZXJdIik7CiAJCXJldHVybjsKIAl9CkBAIC0xNTQsNyArMTc5LDcgQEAKIAkgICAgIHNlcnItPmVlLmVlX2NvZGUgPT0gSUNNUF9GUkFHX05FRURFRCkpIHsKIAkJcnhycGNfYWRqdXN0X210dShwZWVyLCBzZXJyKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3J4X2ZyZWVkKTsKIAkJcnhycGNfcHV0X3BlZXIocGVlcik7CiAJCV9sZWF2ZSgiIFtNVFUgdXBkYXRlXSIpOwogCQlyZXR1cm47CkBAIC0xNjIsNyArMTg3LDcgQEAKIAogCXJ4cnBjX3N0b3JlX2Vycm9yKHBlZXIsIHNlcnIpOwogCXJjdV9yZWFkX3VubG9jaygpOwotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJcnhycGNfZnJlZV9za2Ioc2tiLCByeHJwY19za2JfcnhfZnJlZWQpOwogCiAJLyogVGhlIHJlZiB3ZSBvYnRhaW5lZCBpcyBwYXNzZWQgb2ZmIHRvIHRoZSB3b3JrIGl0ZW0gKi8KIAlyeHJwY19xdWV1ZV93b3JrKCZwZWVyLT5lcnJvcl9kaXN0cmlidXRvcik7CkBAIC0yNDgsMTMgKzI3MywyMCBAQAogCXN0cnVjdCByeHJwY19wZWVyICpwZWVyID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByeHJwY19wZWVyLCBlcnJvcl9kaXN0cmlidXRvcik7CiAJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7Ci0JaW50IGVycm9yX3JlcG9ydDsKKwllbnVtIHJ4cnBjX2NhbGxfY29tcGxldGlvbiBjb21wbDsKKwlpbnQgZXJyb3I7CiAKIAlfZW50ZXIoIiIpOwogCi0JZXJyb3JfcmVwb3J0ID0gUkVBRF9PTkNFKHBlZXItPmVycm9yX3JlcG9ydCk7CisJZXJyb3IgPSBSRUFEX09OQ0UocGVlci0+ZXJyb3JfcmVwb3J0KTsKKwlpZiAoZXJyb3IgPCBSWFJQQ19MT0NBTF9FUlJPUl9PRkZTRVQpIHsKKwkJY29tcGwgPSBSWFJQQ19DQUxMX05FVFdPUktfRVJST1I7CisJfSBlbHNlIHsKKwkJY29tcGwgPSBSWFJQQ19DQUxMX0xPQ0FMX0VSUk9SOworCQllcnJvciAtPSBSWFJQQ19MT0NBTF9FUlJPUl9PRkZTRVQ7CisJfQogCi0JX2RlYnVnKCJJU1NVRSBFUlJPUiAlZCIsIGVycm9yX3JlcG9ydCk7CisJX2RlYnVnKCJJU1NVRSBFUlJPUiAlcyAlZCIsIHJ4cnBjX2NhbGxfY29tcGxldGlvbnNbY29tcGxdLCBlcnJvcik7CiAKIAlzcGluX2xvY2tfYmgoJnBlZXItPmxvY2spOwogCkBAIC0yNjIsMTYgKzI5NCwxMCBAQAogCQljYWxsID0gaGxpc3RfZW50cnkocGVlci0+ZXJyb3JfdGFyZ2V0cy5maXJzdCwKIAkJCQkgICBzdHJ1Y3QgcnhycGNfY2FsbCwgZXJyb3JfbGluayk7CiAJCWhsaXN0X2RlbF9pbml0KCZjYWxsLT5lcnJvcl9saW5rKTsKKwkJcnhycGNfc2VlX2NhbGwoY2FsbCk7CiAKLQkJd3JpdGVfbG9jaygmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCWlmIChjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX0NPTVBMRVRFICYmCi0JCSAgICBjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfTkVUV09SS19FUlJPUikgewotCQkJY2FsbC0+ZXJyb3JfcmVwb3J0ID0gZXJyb3JfcmVwb3J0OwotCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX05FVFdPUktfRVJST1I7Ci0JCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfUkNWRF9FUlJPUiwgJmNhbGwtPmV2ZW50cyk7Ci0JCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOwotCQl9Ci0JCXdyaXRlX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJCWlmIChyeHJwY19zZXRfY2FsbF9jb21wbGV0aW9uKGNhbGwsIGNvbXBsLCAwLCBlcnJvcikpCisJCQlyeHJwY19ub3RpZnlfc29ja2V0KGNhbGwpOwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZwZWVyLT5sb2NrKTsKQEAgLTI3OSwzICszMDUsNDQgQEAKIAlyeHJwY19wdXRfcGVlcihwZWVyKTsKIAlfbGVhdmUoIiIpOwogfQorCisvKgorICogQWRkIFJUVCBpbmZvcm1hdGlvbiB0byBjYWNoZS4gIFRoaXMgaXMgY2FsbGVkIGluIHNvZnRpcnEgbW9kZSBhbmQgaGFzCisgKiBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBwZWVyIFJUVCBkYXRhLgorICovCit2b2lkIHJ4cnBjX3BlZXJfYWRkX3J0dChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgZW51bSByeHJwY19ydHRfcnhfdHJhY2Ugd2h5LAorCQkJcnhycGNfc2VyaWFsX3Qgc2VuZF9zZXJpYWwsIHJ4cnBjX3NlcmlhbF90IHJlc3Bfc2VyaWFsLAorCQkJa3RpbWVfdCBzZW5kX3RpbWUsIGt0aW1lX3QgcmVzcF90aW1lKQoreworCXN0cnVjdCByeHJwY19wZWVyICpwZWVyID0gY2FsbC0+cGVlcjsKKwlzNjQgcnR0OworCXU2NCBzdW0gPSBwZWVyLT5ydHRfc3VtLCBhdmc7CisJdTggY3Vyc29yID0gcGVlci0+cnR0X2N1cnNvciwgdXNhZ2UgPSBwZWVyLT5ydHRfdXNhZ2U7CisKKwlydHQgPSBrdGltZV90b19ucyhrdGltZV9zdWIocmVzcF90aW1lLCBzZW5kX3RpbWUpKTsKKwlpZiAocnR0IDwgMCkKKwkJcmV0dXJuOworCisJLyogUmVwbGFjZSB0aGUgb2xkZXN0IGRhdHVtIGluIHRoZSBSVFQgYnVmZmVyICovCisJc3VtIC09IHBlZXItPnJ0dF9jYWNoZVtjdXJzb3JdOworCXN1bSArPSBydHQ7CisJcGVlci0+cnR0X2NhY2hlW2N1cnNvcl0gPSBydHQ7CisJcGVlci0+cnR0X2N1cnNvciA9IChjdXJzb3IgKyAxKSAmIChSWFJQQ19SVFRfQ0FDSEVfU0laRSAtIDEpOworCXBlZXItPnJ0dF9zdW0gPSBzdW07CisJaWYgKHVzYWdlIDwgUlhSUENfUlRUX0NBQ0hFX1NJWkUpIHsKKwkJdXNhZ2UrKzsKKwkJcGVlci0+cnR0X3VzYWdlID0gdXNhZ2U7CisJfQorCisJLyogTm93IHJlY2FsY3VsYXRlIHRoZSBhdmVyYWdlICovCisJaWYgKHVzYWdlID09IFJYUlBDX1JUVF9DQUNIRV9TSVpFKSB7CisJCWF2ZyA9IHN1bSAvIFJYUlBDX1JUVF9DQUNIRV9TSVpFOworCX0gZWxzZSB7CisJCWF2ZyA9IHN1bTsKKwkJZG9fZGl2KGF2ZywgdXNhZ2UpOworCX0KKworCXBlZXItPnJ0dCA9IGF2ZzsKKwl0cmFjZV9yeHJwY19ydHRfcngoY2FsbCwgd2h5LCBzZW5kX3NlcmlhbCwgcmVzcF9zZXJpYWwsIHJ0dCwKKwkJCSAgIHVzYWdlLCBhdmcpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3BlZXJfb2JqZWN0LmMgYi9uZXQvcnhycGMvcGVlcl9vYmplY3QuYwppbmRleCA1MzhlOTgzLi45NDFiNzI0IDEwMDY0NAotLS0gYS9uZXQvcnhycGMvcGVlcl9vYmplY3QuYworKysgYi9uZXQvcnhycGMvcGVlcl9vYmplY3QuYwpAQCAtMTYsMTIgKzE2LDE0IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvdWRwLmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaHRhYmxlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CiAjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKIAogc3RhdGljIERFRklORV9IQVNIVEFCTEUocnhycGNfcGVlcl9oYXNoLCAxMCk7CkBAIC01MCw2ICs1MiwxMyBAQAogCQlzaXplID0gc2l6ZW9mKHNyeC0+dHJhbnNwb3J0LnNpbi5zaW5fYWRkcik7CiAJCXAgPSAodTE2ICopJnNyeC0+dHJhbnNwb3J0LnNpbi5zaW5fYWRkcjsKIAkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0FGX1JYUlBDX0lQVjYKKwljYXNlIEFGX0lORVQ2OgorCQloYXNoX2tleSArPSAodTE2IF9fZm9yY2Upc3J4LT50cmFuc3BvcnQuc2luLnNpbl9wb3J0OworCQlzaXplID0gc2l6ZW9mKHNyeC0+dHJhbnNwb3J0LnNpbjYuc2luNl9hZGRyKTsKKwkJcCA9ICh1MTYgKikmc3J4LT50cmFuc3BvcnQuc2luNi5zaW42X2FkZHI7CisJCWJyZWFrOworI2VuZGlmCiAJZGVmYXVsdDoKIAkJV0FSTigxLCAiQUZfUlhSUEM6IFVuc3VwcG9ydGVkIHRyYW5zcG9ydCBhZGRyZXNzIGZhbWlseVxuIik7CiAJCXJldHVybiAwOwpAQCAtOTMsNiArMTAyLDE0IEBACiAJCQltZW1jbXAoJnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAogCQkJICAgICAgICZzcngtPnRyYW5zcG9ydC5zaW4uc2luX2FkZHIsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisjaWZkZWYgQ09ORklHX0FGX1JYUlBDX0lQVjYKKwljYXNlIEFGX0lORVQ2OgorCQlyZXR1cm4gKCh1MTYgX19mb3JjZSlwZWVyLT5zcngudHJhbnNwb3J0LnNpbjYuc2luNl9wb3J0IC0KKwkJCSh1MTYgX19mb3JjZSlzcngtPnRyYW5zcG9ydC5zaW42LnNpbjZfcG9ydCkgPzoKKwkJCW1lbWNtcCgmcGVlci0+c3J4LnRyYW5zcG9ydC5zaW42LnNpbjZfYWRkciwKKwkJCSAgICAgICAmc3J4LT50cmFuc3BvcnQuc2luNi5zaW42X2FkZHIsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworI2VuZGlmCiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQpAQCAtMTMwLDE3ICsxNDcsNyBAQAogCiAJcGVlciA9IF9fcnhycGNfbG9va3VwX3BlZXJfcmN1KGxvY2FsLCBzcngsIGhhc2hfa2V5KTsKIAlpZiAocGVlcikgewotCQlzd2l0Y2ggKHNyeC0+dHJhbnNwb3J0LmZhbWlseSkgewotCQljYXNlIEFGX0lORVQ6Ci0JCQlfbmV0KCJQRUVSICVkIHslZCwldSwlcEk0KyVodX0iLAotCQkJICAgICBwZWVyLT5kZWJ1Z19pZCwKLQkJCSAgICAgcGVlci0+c3J4LnRyYW5zcG9ydF90eXBlLAotCQkJICAgICBwZWVyLT5zcngudHJhbnNwb3J0LmZhbWlseSwKLQkJCSAgICAgJnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAotCQkJICAgICBudG9ocyhwZWVyLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fcG9ydCkpOwotCQkJYnJlYWs7Ci0JCX0KLQorCQlfbmV0KCJQRUVSICVkIHslcElTcH0iLCBwZWVyLT5kZWJ1Z19pZCwgJnBlZXItPnNyeC50cmFuc3BvcnQpOwogCQlfbGVhdmUoIiA9ICVwIHt1PSVkfSIsIHBlZXIsIGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSkpOwogCX0KIAlyZXR1cm4gcGVlcjsKQEAgLTE1MiwyMiArMTU5LDUzIEBACiAgKi8KIHN0YXRpYyB2b2lkIHJ4cnBjX2Fzc2Vzc19NVFVfc2l6ZShzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcikKIHsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7Ci0Jc3RydWN0IGZsb3dpNCBmbDQ7CisJc3RydWN0IGZsb3dpIGZsOworCXN0cnVjdCBmbG93aTQgKmZsNCA9ICZmbC51LmlwNDsKKyNpZmRlZiBDT05GSUdfQUZfUlhSUENfSVBWNgorCXN0cnVjdCBmbG93aTYgKmZsNiA9ICZmbC51LmlwNjsKKyNlbmRpZgogCiAJcGVlci0+aWZfbXR1ID0gMTUwMDsKIAotCXJ0ID0gaXBfcm91dGVfb3V0cHV0X3BvcnRzKCZpbml0X25ldCwgJmZsNCwgTlVMTCwKLQkJCQkgICBwZWVyLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkci5zX2FkZHIsIDAsCi0JCQkJICAgaHRvbnMoNzAwMCksIGh0b25zKDcwMDEpLAotCQkJCSAgIElQUFJPVE9fVURQLCAwLCAwKTsKLQlpZiAoSVNfRVJSKHJ0KSkgewotCQlfbGVhdmUoIiBbcm91dGUgZXJyICVsZF0iLCBQVFJfRVJSKHJ0KSk7Ci0JCXJldHVybjsKKwltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKKwlzd2l0Y2ggKHBlZXItPnNyeC50cmFuc3BvcnQuZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlydCA9IGlwX3JvdXRlX291dHB1dF9wb3J0cygKKwkJCSZpbml0X25ldCwgZmw0LCBOVUxMLAorCQkJcGVlci0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIuc19hZGRyLCAwLAorCQkJaHRvbnMoNzAwMCksIGh0b25zKDcwMDEpLCBJUFBST1RPX1VEUCwgMCwgMCk7CisJCWlmIChJU19FUlIocnQpKSB7CisJCQlfbGVhdmUoIiBbcm91dGUgZXJyICVsZF0iLCBQVFJfRVJSKHJ0KSk7CisJCQlyZXR1cm47CisJCX0KKwkJZHN0ID0gJnJ0LT5kc3Q7CisJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX0FGX1JYUlBDX0lQVjYKKwljYXNlIEFGX0lORVQ2OgorCQlmbDYtPmZsb3dpNl9paWYgPSBMT09QQkFDS19JRklOREVYOworCQlmbDYtPmZsb3dpNl9zY29wZSA9IFJUX1NDT1BFX1VOSVZFUlNFOworCQlmbDYtPmZsb3dpNl9wcm90byA9IElQUFJPVE9fVURQOworCQltZW1jcHkoJmZsNi0+ZGFkZHIsICZwZWVyLT5zcngudHJhbnNwb3J0LnNpbjYuc2luNl9hZGRyLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlmbDYtPmZsNl9kcG9ydCA9IGh0b25zKDcwMDEpOworCQlmbDYtPmZsNl9zcG9ydCA9IGh0b25zKDcwMDApOworCQlkc3QgPSBpcDZfcm91dGVfb3V0cHV0KCZpbml0X25ldCwgTlVMTCwgZmw2KTsKKwkJaWYgKElTX0VSUihkc3QpKSB7CisJCQlfbGVhdmUoIiBbcm91dGUgZXJyICVsZF0iLCBQVFJfRVJSKGRzdCkpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworI2VuZGlmCisKKwlkZWZhdWx0OgorCQlCVUcoKTsKIAl9CiAKLQlwZWVyLT5pZl9tdHUgPSBkc3RfbXR1KCZydC0+ZHN0KTsKLQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CisJcGVlci0+aWZfbXR1ID0gZHN0X210dShkc3QpOworCWRzdF9yZWxlYXNlKGRzdCk7CiAKIAlfbGVhdmUoIiBbaWZfbXR1ICV1XSIsIHBlZXItPmlmX210dSk7CiB9CkBAIC0xOTksNiArMjM3LDQxIEBACiB9CiAKIC8qCisgKiBJbml0aWFsaXNlIHBlZXIgcmVjb3JkLgorICovCitzdGF0aWMgdm9pZCByeHJwY19pbml0X3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIsIHVuc2lnbmVkIGxvbmcgaGFzaF9rZXkpCit7CisJcGVlci0+aGFzaF9rZXkgPSBoYXNoX2tleTsKKwlyeHJwY19hc3Nlc3NfTVRVX3NpemUocGVlcik7CisJcGVlci0+bXR1ID0gcGVlci0+aWZfbXR1OworCXBlZXItPnJ0dF9sYXN0X3JlcSA9IGt0aW1lX2dldF9yZWFsKCk7CisKKwlzd2l0Y2ggKHBlZXItPnNyeC50cmFuc3BvcnQuZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlwZWVyLT5oZHJzaXplID0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19BRl9SWFJQQ19JUFY2CisJY2FzZSBBRl9JTkVUNjoKKwkJcGVlci0+aGRyc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJc3dpdGNoIChwZWVyLT5zcngudHJhbnNwb3J0X3R5cGUpIHsKKwljYXNlIFNPQ0tfREdSQU06CisJCXBlZXItPmhkcnNpemUgKz0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlwZWVyLT5oZHJzaXplICs9IHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpOworCXBlZXItPm1heGRhdGEgPSBwZWVyLT5tdHUgLSBwZWVyLT5oZHJzaXplOworfQorCisvKgogICogU2V0IHVwIGEgbmV3IHBlZXIuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcnhycGNfcGVlciAqcnhycGNfY3JlYXRlX3BlZXIoc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwKQEAgLTIxMiwyOCArMjg1LDggQEAKIAogCXBlZXIgPSByeHJwY19hbGxvY19wZWVyKGxvY2FsLCBnZnApOwogCWlmIChwZWVyKSB7Ci0JCXBlZXItPmhhc2hfa2V5ID0gaGFzaF9rZXk7CiAJCW1lbWNweSgmcGVlci0+c3J4LCBzcngsIHNpemVvZigqc3J4KSk7Ci0KLQkJcnhycGNfYXNzZXNzX01UVV9zaXplKHBlZXIpOwotCQlwZWVyLT5tdHUgPSBwZWVyLT5pZl9tdHU7Ci0KLQkJaWYgKHNyeC0+dHJhbnNwb3J0LmZhbWlseSA9PSBBRl9JTkVUKSB7Ci0JCQlwZWVyLT5oZHJzaXplID0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7Ci0JCQlzd2l0Y2ggKHNyeC0+dHJhbnNwb3J0X3R5cGUpIHsKLQkJCWNhc2UgU09DS19ER1JBTToKLQkJCQlwZWVyLT5oZHJzaXplICs9IHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJQlVHKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlCVUcoKTsKLQkJfQotCi0JCXBlZXItPmhkcnNpemUgKz0gc2l6ZW9mKHN0cnVjdCByeHJwY193aXJlX2hlYWRlcik7Ci0JCXBlZXItPm1heGRhdGEgPSBwZWVyLT5tdHUgLSBwZWVyLT5oZHJzaXplOworCQlyeHJwY19pbml0X3BlZXIocGVlciwgaGFzaF9rZXkpOwogCX0KIAogCV9sZWF2ZSgiID0gJXAiLCBwZWVyKTsKQEAgLTI0MSw2ICsyOTQsMzUgQEAKIH0KIAogLyoKKyAqIFNldCB1cCBhIG5ldyBpbmNvbWluZyBwZWVyLiAgVGhlIGFkZHJlc3MgaXMgcHJlc3RvcmVkIGluIHRoZSBwcmVhbGxvY2F0ZWQKKyAqIHBlZXIuCisgKi8KK3N0cnVjdCByeHJwY19wZWVyICpyeHJwY19sb29rdXBfaW5jb21pbmdfcGVlcihzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsLAorCQkJCQkgICAgICBzdHJ1Y3QgcnhycGNfcGVlciAqcHJlYWxsb2MpCit7CisJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXI7CisJdW5zaWduZWQgbG9uZyBoYXNoX2tleTsKKworCWhhc2hfa2V5ID0gcnhycGNfcGVlcl9oYXNoX2tleShsb2NhbCwgJnByZWFsbG9jLT5zcngpOworCXByZWFsbG9jLT5sb2NhbCA9IGxvY2FsOworCXJ4cnBjX2luaXRfcGVlcihwcmVhbGxvYywgaGFzaF9rZXkpOworCisJc3Bpbl9sb2NrKCZyeHJwY19wZWVyX2hhc2hfbG9jayk7CisKKwkvKiBOZWVkIHRvIGNoZWNrIHRoYXQgd2UgYXJlbid0IHJhY2luZyB3aXRoIHNvbWVvbmUgZWxzZSAqLworCXBlZXIgPSBfX3J4cnBjX2xvb2t1cF9wZWVyX3JjdShsb2NhbCwgJnByZWFsbG9jLT5zcngsIGhhc2hfa2V5KTsKKwlpZiAocGVlciAmJiAhcnhycGNfZ2V0X3BlZXJfbWF5YmUocGVlcikpCisJCXBlZXIgPSBOVUxMOworCWlmICghcGVlcikgeworCQlwZWVyID0gcHJlYWxsb2M7CisJCWhhc2hfYWRkX3JjdShyeHJwY19wZWVyX2hhc2gsICZwZWVyLT5oYXNoX2xpbmssIGhhc2hfa2V5KTsKKwl9CisKKwlzcGluX3VubG9jaygmcnhycGNfcGVlcl9oYXNoX2xvY2spOworCXJldHVybiBwZWVyOworfQorCisvKgogICogb2J0YWluIGEgcmVtb3RlIHRyYW5zcG9ydCBlbmRwb2ludCBmb3IgdGhlIHNwZWNpZmllZCBhZGRyZXNzCiAgKi8KIHN0cnVjdCByeHJwY19wZWVyICpyeHJwY19sb29rdXBfcGVlcihzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsLApAQCAtMjQ5LDExICszMzEsNyBAQAogCXN0cnVjdCByeHJwY19wZWVyICpwZWVyLCAqY2FuZGlkYXRlOwogCXVuc2lnbmVkIGxvbmcgaGFzaF9rZXkgPSByeHJwY19wZWVyX2hhc2hfa2V5KGxvY2FsLCBzcngpOwogCi0JX2VudGVyKCJ7JWQsJWQsJXBJNCslaHV9IiwKLQkgICAgICAgc3J4LT50cmFuc3BvcnRfdHlwZSwKLQkgICAgICAgc3J4LT50cmFuc3BvcnRfbGVuLAotCSAgICAgICAmc3J4LT50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAotCSAgICAgICBudG9ocyhzcngtPnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKwlfZW50ZXIoInslcElTcH0iLCAmc3J4LT50cmFuc3BvcnQpOwogCiAJLyogc2VhcmNoIHRoZSBwZWVyIGxpc3QgZmlyc3QgKi8KIAlyY3VfcmVhZF9sb2NrKCk7CkBAIC0yNzIsNyArMzUwLDcgQEAKIAkJCXJldHVybiBOVUxMOwogCQl9CiAKLQkJc3Bpbl9sb2NrKCZyeHJwY19wZWVyX2hhc2hfbG9jayk7CisJCXNwaW5fbG9ja19iaCgmcnhycGNfcGVlcl9oYXNoX2xvY2spOwogCiAJCS8qIE5lZWQgdG8gY2hlY2sgdGhhdCB3ZSBhcmVuJ3QgcmFjaW5nIHdpdGggc29tZW9uZSBlbHNlICovCiAJCXBlZXIgPSBfX3J4cnBjX2xvb2t1cF9wZWVyX3JjdShsb2NhbCwgc3J4LCBoYXNoX2tleSk7CkBAIC0yODIsNyArMzYwLDcgQEAKIAkJCWhhc2hfYWRkX3JjdShyeHJwY19wZWVyX2hhc2gsCiAJCQkJICAgICAmY2FuZGlkYXRlLT5oYXNoX2xpbmssIGhhc2hfa2V5KTsKIAotCQlzcGluX3VubG9jaygmcnhycGNfcGVlcl9oYXNoX2xvY2spOworCQlzcGluX3VubG9ja19iaCgmcnhycGNfcGVlcl9oYXNoX2xvY2spOwogCiAJCWlmIChwZWVyKQogCQkJa2ZyZWUoY2FuZGlkYXRlKTsKQEAgLTI5MCwxMSArMzY4LDcgQEAKIAkJCXBlZXIgPSBjYW5kaWRhdGU7CiAJfQogCi0JX25ldCgiUEVFUiAlZCB7JWQsJXBJNCslaHV9IiwKLQkgICAgIHBlZXItPmRlYnVnX2lkLAotCSAgICAgcGVlci0+c3J4LnRyYW5zcG9ydF90eXBlLAotCSAgICAgJnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAotCSAgICAgbnRvaHMocGVlci0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKwlfbmV0KCJQRUVSICVkIHslcElTcH0iLCBwZWVyLT5kZWJ1Z19pZCwgJnBlZXItPnNyeC50cmFuc3BvcnQpOwogCiAJX2xlYXZlKCIgPSAlcCB7dT0lZH0iLCBwZWVyLCBhdG9taWNfcmVhZCgmcGVlci0+dXNhZ2UpKTsKIAlyZXR1cm4gcGVlcjsKQEAgLTMwNyw5ICszODEsMjQgQEAKIHsKIAlBU1NFUlQoaGxpc3RfZW1wdHkoJnBlZXItPmVycm9yX3RhcmdldHMpKTsKIAotCXNwaW5fbG9jaygmcnhycGNfcGVlcl9oYXNoX2xvY2spOworCXNwaW5fbG9ja19iaCgmcnhycGNfcGVlcl9oYXNoX2xvY2spOwogCWhhc2hfZGVsX3JjdSgmcGVlci0+aGFzaF9saW5rKTsKLQlzcGluX3VubG9jaygmcnhycGNfcGVlcl9oYXNoX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZyeHJwY19wZWVyX2hhc2hfbG9jayk7CiAKIAlrZnJlZV9yY3UocGVlciwgcmN1KTsKIH0KKworLyoqCisgKiByeHJwY19rZXJuZWxfZ2V0X3BlZXIgLSBHZXQgdGhlIHBlZXIgYWRkcmVzcyBvZiBhIGNhbGwKKyAqIEBzb2NrOiBUaGUgc29ja2V0IG9uIHdoaWNoIHRoZSBjYWxsIGlzIGluIHByb2dyZXNzLgorICogQGNhbGw6IFRoZSBjYWxsIHRvIHF1ZXJ5CisgKiBAX3NyeDogV2hlcmUgdG8gcGxhY2UgdGhlIHJlc3VsdAorICoKKyAqIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIHBlZXIgaW4gYSBjYWxsLgorICovCit2b2lkIHJ4cnBjX2tlcm5lbF9nZXRfcGVlcihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCSAgIHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqX3NyeCkKK3sKKwkqX3NyeCA9IGNhbGwtPnBlZXItPnNyeDsKK30KK0VYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2dldF9wZWVyKTsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9wcm9jLmMgYi9uZXQvcnhycGMvcHJvYy5jCmluZGV4IGNlZDVmMDcuLjY1Y2Q5ODAgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9wcm9jLmMKKysrIGIvbmV0L3J4cnBjL3Byb2MuYwpAQCAtMTcsMTIgKzE3LDEyIEBACiBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcnhycGNfY29ubl9zdGF0ZXNbUlhSUENfQ09OTl9fTlJfU1RBVEVTXSA9IHsKIAlbUlhSUENfQ09OTl9VTlVTRURdCQkJPSAiVW51c2VkICAiLAogCVtSWFJQQ19DT05OX0NMSUVOVF0JCQk9ICJDbGllbnQgICIsCisJW1JYUlBDX0NPTk5fU0VSVklDRV9QUkVBTExPQ10JCT0gIlN2UHJlYWxjIiwKIAlbUlhSUENfQ09OTl9TRVJWSUNFX1VOU0VDVVJFRF0JCT0gIlN2VW5zZWMgIiwKIAlbUlhSUENfQ09OTl9TRVJWSUNFX0NIQUxMRU5HSU5HXQk9ICJTdkNoYWxsICIsCiAJW1JYUlBDX0NPTk5fU0VSVklDRV0JCQk9ICJTdlNlY3VyZSIsCiAJW1JYUlBDX0NPTk5fUkVNT1RFTFlfQUJPUlRFRF0JCT0gIlJtdEFib3J0IiwKIAlbUlhSUENfQ09OTl9MT0NBTExZX0FCT1JURURdCQk9ICJMb2NBYm9ydCIsCi0JW1JYUlBDX0NPTk5fTkVUV09SS19FUlJPUl0JCT0gIk5ldEVycm9yIiwKIH07CiAKIC8qCkBAIC0zMCw2ICszMCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkICpyeHJwY19jYWxsX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpfcG9zKQogeworCXJjdV9yZWFkX2xvY2soKTsKIAlyZWFkX2xvY2soJnJ4cnBjX2NhbGxfbG9jayk7CiAJcmV0dXJuIHNlcV9saXN0X3N0YXJ0X2hlYWQoJnJ4cnBjX2NhbGxzLCAqX3Bvcyk7CiB9CkBAIC00MiwxNyArNDMsMjEgQEAKIHN0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7CiAJcmVhZF91bmxvY2soJnJ4cnBjX2NhbGxfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIHN0YXRpYyBpbnQgcnhycGNfY2FsbF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsOworCXN0cnVjdCByeHJwY19zb2NrICpyeDsKKwlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKIAlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQljaGFyIGxidWZmWzQgKyA0ICsgNCArIDQgKyA1ICsgMV0sIHJidWZmWzQgKyA0ICsgNCArIDQgKyA1ICsgMV07CisJY2hhciBsYnVmZls1MF0sIHJidWZmWzUwXTsKIAogCWlmICh2ID09ICZyeHJwY19jYWxscykgewogCQlzZXFfcHV0cyhzZXEsCi0JCQkgIlByb3RvIExvY2FsICAgICAgICAgICAgICAgICAgUmVtb3RlICAgICAgICAgICAgICAgICIKKwkJCSAiUHJvdG8gTG9jYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCisJCQkgIiBSZW1vdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKIAkJCSAiIFN2SUQgQ29ubklEICAgQ2FsbElEICAgRW5kIFVzZSBTdGF0ZSAgICBBYm9ydCAgICIKIAkJCSAiIFVzZXJJRFxuIik7CiAJCXJldHVybiAwOwpAQCAtNjAsMzAgKzY1LDM1IEBACiAKIAljYWxsID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgcnhycGNfY2FsbCwgbGluayk7CiAKLQlzcHJpbnRmKGxidWZmLCAiJXBJNDoldSIsCi0JCSZjYWxsLT5sb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIsCi0JCW50b2hzKGNhbGwtPmxvY2FsLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fcG9ydCkpOworCXJ4ID0gcmN1X2RlcmVmZXJlbmNlKGNhbGwtPnNvY2tldCk7CisJaWYgKHJ4KSB7CisJCWxvY2FsID0gUkVBRF9PTkNFKHJ4LT5sb2NhbCk7CisJCWlmIChsb2NhbCkKKwkJCXNwcmludGYobGJ1ZmYsICIlcElTcGMiLCAmbG9jYWwtPnNyeC50cmFuc3BvcnQpOworCQllbHNlCisJCQlzdHJjcHkobGJ1ZmYsICJub19sb2NhbCIpOworCX0gZWxzZSB7CisJCXN0cmNweShsYnVmZiwgIm5vX3NvY2tldCIpOworCX0KIAotCWNvbm4gPSBjYWxsLT5jb25uOwotCWlmIChjb25uKQotCQlzcHJpbnRmKHJidWZmLCAiJXBJNDoldSIsCi0JCQkmY29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAotCQkJbnRvaHMoY29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisJcGVlciA9IGNhbGwtPnBlZXI7CisJaWYgKHBlZXIpCisJCXNwcmludGYocmJ1ZmYsICIlcElTcGMiLCAmcGVlci0+c3J4LnRyYW5zcG9ydCk7CiAJZWxzZQogCQlzdHJjcHkocmJ1ZmYsICJub19jb25uZWN0aW9uIik7CiAKIAlzZXFfcHJpbnRmKHNlcSwKLQkJICAgIlVEUCAgICUtMjIuMjJzICUtMjIuMjJzICU0eCAlMDh4ICUwOHggJXMgJTN1IgorCQkgICAiVURQICAgJS00Ny40N3MgJS00Ny40N3MgJTR4ICUwOHggJTA4eCAlcyAlM3UiCiAJCSAgICIgJS04LjhzICUwOHggJWx4XG4iLAogCQkgICBsYnVmZiwKIAkJICAgcmJ1ZmYsCiAJCSAgIGNhbGwtPnNlcnZpY2VfaWQsCiAJCSAgIGNhbGwtPmNpZCwKIAkJICAgY2FsbC0+Y2FsbF9pZCwKLQkJICAgY2FsbC0+aW5fY2xpZW50ZmxhZyA/ICJTdmMiIDogIkNsdCIsCisJCSAgIHJ4cnBjX2lzX3NlcnZpY2VfY2FsbChjYWxsKSA/ICJTdmMiIDogIkNsdCIsCiAJCSAgIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSksCiAJCSAgIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPnN0YXRlXSwKLQkJICAgY2FsbC0+cmVtb3RlX2Fib3J0ID86IGNhbGwtPmxvY2FsX2Fib3J0LAorCQkgICBjYWxsLT5hYm9ydF9jb2RlLAogCQkgICBjYWxsLT51c2VyX2NhbGxfSUQpOwogCiAJcmV0dXJuIDA7CkBAIC0xMTUsMTMgKzEyNSwxMyBAQAogc3RhdGljIHZvaWQgKnJ4cnBjX2Nvbm5lY3Rpb25fc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKl9wb3MpCiB7CiAJcmVhZF9sb2NrKCZyeHJwY19jb25uZWN0aW9uX2xvY2spOwotCXJldHVybiBzZXFfbGlzdF9zdGFydF9oZWFkKCZyeHJwY19jb25uZWN0aW9ucywgKl9wb3MpOworCXJldHVybiBzZXFfbGlzdF9zdGFydF9oZWFkKCZyeHJwY19jb25uZWN0aW9uX3Byb2NfbGlzdCwgKl9wb3MpOwogfQogCiBzdGF0aWMgdm9pZCAqcnhycGNfY29ubmVjdGlvbl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwKIAkJCQkgICAgICAgbG9mZl90ICpwb3MpCiB7Ci0JcmV0dXJuIHNlcV9saXN0X25leHQodiwgJnJ4cnBjX2Nvbm5lY3Rpb25zLCBwb3MpOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZyeHJwY19jb25uZWN0aW9uX3Byb2NfbGlzdCwgcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgcnhycGNfY29ubmVjdGlvbl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKQEAgLTEzMiwyOSArMTQyLDMxIEBACiBzdGF0aWMgaW50IHJ4cnBjX2Nvbm5lY3Rpb25fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7CiAJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47Ci0JY2hhciBsYnVmZls0ICsgNCArIDQgKyA0ICsgNSArIDFdLCByYnVmZls0ICsgNCArIDQgKyA0ICsgNSArIDFdOworCWNoYXIgbGJ1ZmZbNTBdLCByYnVmZls1MF07CiAKLQlpZiAodiA9PSAmcnhycGNfY29ubmVjdGlvbnMpIHsKKwlpZiAodiA9PSAmcnhycGNfY29ubmVjdGlvbl9wcm9jX2xpc3QpIHsKIAkJc2VxX3B1dHMoc2VxLAotCQkJICJQcm90byBMb2NhbCAgICAgICAgICAgICAgICAgIFJlbW90ZSAgICAgICAgICAgICAgICAiCisJCQkgIlByb3RvIExvY2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorCQkJICIgUmVtb3RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiAJCQkgIiBTdklEIENvbm5JRCAgIEVuZCBVc2UgU3RhdGUgICAgS2V5ICAgICAiCiAJCQkgIiBTZXJpYWwgICBJU2VyaWFsXG4iCiAJCQkgKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JY29ubiA9IGxpc3RfZW50cnkodiwgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24sIGxpbmspOworCWNvbm4gPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBwcm9jX2xpbmspOworCWlmIChjb25uLT5zdGF0ZSA9PSBSWFJQQ19DT05OX1NFUlZJQ0VfUFJFQUxMT0MpIHsKKwkJc3RyY3B5KGxidWZmLCAibm9fbG9jYWwiKTsKKwkJc3RyY3B5KHJidWZmLCAibm9fY29ubmVjdGlvbiIpOworCQlnb3RvIHByaW50OworCX0KIAotCXNwcmludGYobGJ1ZmYsICIlcEk0OiV1IiwKLQkJJmNvbm4tPnBhcmFtcy5sb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIsCi0JCW50b2hzKGNvbm4tPnBhcmFtcy5sb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKwlzcHJpbnRmKGxidWZmLCAiJXBJU3BjIiwgJmNvbm4tPnBhcmFtcy5sb2NhbC0+c3J4LnRyYW5zcG9ydCk7CiAKLQlzcHJpbnRmKHJidWZmLCAiJXBJNDoldSIsCi0JCSZjb25uLT5wYXJhbXMucGVlci0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIsCi0JCW50b2hzKGNvbm4tPnBhcmFtcy5wZWVyLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fcG9ydCkpOwotCisJc3ByaW50ZihyYnVmZiwgIiVwSVNwYyIsICZjb25uLT5wYXJhbXMucGVlci0+c3J4LnRyYW5zcG9ydCk7CitwcmludDoKIAlzZXFfcHJpbnRmKHNlcSwKLQkJICAgIlVEUCAgICUtMjIuMjJzICUtMjIuMjJzICU0eCAlMDh4ICVzICUzdSIKKwkJICAgIlVEUCAgICUtNDcuNDdzICUtNDcuNDdzICU0eCAlMDh4ICVzICUzdSIKIAkJICAgIiAlcyAlMDh4ICUwOHggJTA4eFxuIiwKIAkJICAgbGJ1ZmYsCiAJCSAgIHJidWZmLApAQCAtMTY1LDcgKzE3Nyw3IEBACiAJCSAgIHJ4cnBjX2Nvbm5fc3RhdGVzW2Nvbm4tPnN0YXRlXSwKIAkJICAga2V5X3NlcmlhbChjb25uLT5wYXJhbXMua2V5KSwKIAkJICAgYXRvbWljX3JlYWQoJmNvbm4tPnNlcmlhbCksCi0JCSAgIGF0b21pY19yZWFkKCZjb25uLT5oaV9zZXJpYWwpKTsKKwkJICAgY29ubi0+aGlfc2VyaWFsKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3JlY3Ztc2cuYyBiL25ldC9yeHJwYy9yZWN2bXNnLmMKaW5kZXggYTNmYTJlZC4uZjA1ZWEwYSAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL3JlY3Ztc2cuYworKysgYi9uZXQvcnhycGMvcmVjdm1zZy5jCkBAIC0xOSw0MTggKzE5LDY0NSBAQAogI2luY2x1ZGUgImFyLWludGVybmFsLmgiCiAKIC8qCi0gKiByZW1vdmFsIGEgY2FsbCdzIHVzZXIgSUQgZnJvbSB0aGUgc29ja2V0IHRyZWUgdG8gbWFrZSB0aGUgdXNlciBJRCBhdmFpbGFibGUKLSAqIGFnYWluIGFuZCBzbyB0aGF0IGl0IHdvbid0IGJlIHNlZW4gYWdhaW4gaW4gYXNzb2NpYXRpb24gd2l0aCB0aGF0IGNhbGwKKyAqIFBvc3QgYSBjYWxsIGZvciBhdHRlbnRpb24gYnkgdGhlIHNvY2tldCBvciBrZXJuZWwgc2VydmljZS4gIEZ1cnRoZXIKKyAqIG5vdGlmaWNhdGlvbnMgYXJlIHN1cHByZXNzZWQgYnkgcHV0dGluZyByZWN2bXNnX2xpbmsgb24gYSBkdW1teSBxdWV1ZS4KICAqLwotdm9pZCByeHJwY19yZW1vdmVfdXNlcl9JRChzdHJ1Y3QgcnhycGNfc29jayAqcngsIHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQordm9pZCByeHJwY19ub3RpZnlfc29ja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQogewotCV9kZWJ1ZygiUkVMRUFTRSBDQUxMICVkIiwgY2FsbC0+ZGVidWdfaWQpOworCXN0cnVjdCByeHJwY19zb2NrICpyeDsKKwlzdHJ1Y3Qgc29jayAqc2s7CiAKLQlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpKSB7Ci0JCXdyaXRlX2xvY2tfYmgoJnJ4LT5jYWxsX2xvY2spOwotCQlyYl9lcmFzZSgmY2FsbC0+c29ja19ub2RlLCAmY2FsbC0+c29ja2V0LT5jYWxscyk7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0hBU19VU0VSSUQsICZjYWxsLT5mbGFncyk7Ci0JCXdyaXRlX3VubG9ja19iaCgmcngtPmNhbGxfbG9jayk7CisJX2VudGVyKCIlZCIsIGNhbGwtPmRlYnVnX2lkKTsKKworCWlmICghbGlzdF9lbXB0eSgmY2FsbC0+cmVjdm1zZ19saW5rKSkKKwkJcmV0dXJuOworCisJcmN1X3JlYWRfbG9jaygpOworCisJcnggPSByY3VfZGVyZWZlcmVuY2UoY2FsbC0+c29ja2V0KTsKKwlzayA9ICZyeC0+c2s7CisJaWYgKHJ4ICYmIHNrLT5za19zdGF0ZSA8IFJYUlBDX0NMT1NFKSB7CisJCWlmIChjYWxsLT5ub3RpZnlfcngpIHsKKwkJCWNhbGwtPm5vdGlmeV9yeChzaywgY2FsbCwgY2FsbC0+dXNlcl9jYWxsX0lEKTsKKwkJfSBlbHNlIHsKKwkJCXdyaXRlX2xvY2tfYmgoJnJ4LT5yZWN2bXNnX2xvY2spOworCQkJaWYgKGxpc3RfZW1wdHkoJmNhbGwtPnJlY3Ztc2dfbGluaykpIHsKKwkJCQlyeHJwY19nZXRfY2FsbChjYWxsLCByeHJwY19jYWxsX2dvdCk7CisJCQkJbGlzdF9hZGRfdGFpbCgmY2FsbC0+cmVjdm1zZ19saW5rLCAmcngtPnJlY3Ztc2dfcSk7CisJCQl9CisJCQl3cml0ZV91bmxvY2tfYmgoJnJ4LT5yZWN2bXNnX2xvY2spOworCisJCQlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkgeworCQkJCV9kZWJ1ZygiY2FsbCAlcHMiLCBzay0+c2tfZGF0YV9yZWFkeSk7CisJCQkJc2stPnNrX2RhdGFfcmVhZHkoc2spOworCQkJfQorCQl9CiAJfQogCi0JcmVhZF9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQlpZiAoIXRlc3RfYml0KFJYUlBDX0NBTExfUkVMRUFTRUQsICZjYWxsLT5mbGFncykgJiYKLQkgICAgIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9SRUxFQVNFLCAmY2FsbC0+ZXZlbnRzKSkKLQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQlyZWFkX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJX2xlYXZlKCIiKTsKIH0KIAogLyoKLSAqIHJlY2VpdmUgYSBtZXNzYWdlIGZyb20gYW4gUnhSUEMgc29ja2V0CisgKiBQYXNzIGEgY2FsbCB0ZXJtaW5hdGluZyBtZXNzYWdlIHRvIHVzZXJzcGFjZS4KKyAqLworc3RhdGljIGludCByeHJwY19yZWN2bXNnX3Rlcm0oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBtc2doZHIgKm1zZykKK3sKKwl1MzIgdG1wID0gMDsKKwlpbnQgcmV0OworCisJc3dpdGNoIChjYWxsLT5jb21wbGV0aW9uKSB7CisJY2FzZSBSWFJQQ19DQUxMX1NVQ0NFRURFRDoKKwkJcmV0ID0gMDsKKwkJaWYgKHJ4cnBjX2lzX3NlcnZpY2VfY2FsbChjYWxsKSkKKwkJCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19BQ0ssIDAsICZ0bXApOworCQlicmVhazsKKwljYXNlIFJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRDoKKwkJdG1wID0gY2FsbC0+YWJvcnRfY29kZTsKKwkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX0FCT1JULCA0LCAmdG1wKTsKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRDoKKwkJdG1wID0gY2FsbC0+YWJvcnRfY29kZTsKKwkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX0FCT1JULCA0LCAmdG1wKTsKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19DQUxMX05FVFdPUktfRVJST1I6CisJCXRtcCA9IGNhbGwtPmVycm9yOworCQlyZXQgPSBwdXRfY21zZyhtc2csIFNPTF9SWFJQQywgUlhSUENfTkVUX0VSUk9SLCA0LCAmdG1wKTsKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19DQUxMX0xPQ0FMX0VSUk9SOgorCQl0bXAgPSBjYWxsLT5lcnJvcjsKKwkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX0xPQ0FMX0VSUk9SLCA0LCAmdG1wKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCJJbnZhbGlkIHRlcm1pbmFsIGNhbGwgc3RhdGUgJXVcbiIsIGNhbGwtPnN0YXRlKTsKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKworCXRyYWNlX3J4cnBjX3JlY3Ztc2coY2FsbCwgcnhycGNfcmVjdm1zZ190ZXJtaW5hbCwgY2FsbC0+cnhfaGFyZF9hY2ssCisJCQkgICAgY2FsbC0+cnhfcGt0X29mZnNldCwgY2FsbC0+cnhfcGt0X2xlbiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUGFzcyBiYWNrIG5vdGlmaWNhdGlvbiBvZiBhIG5ldyBjYWxsLiAgVGhlIGNhbGwgaXMgYWRkZWQgdG8gdGhlCisgKiB0by1iZS1hY2NlcHRlZCBsaXN0LiAgVGhpcyBtZWFucyB0aGF0IHRoZSBuZXh0IGNhbGwgdG8gYmUgYWNjZXB0ZWQgbWlnaHQgbm90CisgKiBiZSB0aGUgbGFzdCBjYWxsIHNlZW4gYXdhaXRpbmcgYWNjZXB0YW5jZSwgYnV0IHVubGVzcyB3ZSBsZWF2ZSB0aGlzIG9uIHRoZQorICogZnJvbnQgb2YgdGhlIHF1ZXVlIGFuZCBibG9jayBhbGwgb3RoZXIgbWVzc2FnZXMgdW50aWwgc29tZW9uZSBnaXZlcyB1cyBhCisgKiB1c2VyX0lEIGZvciBpdCwgdGhlcmUncyBub3QgYSBsb3Qgd2UgY2FuIGRvLgorICovCitzdGF0aWMgaW50IHJ4cnBjX3JlY3Ztc2dfbmV3X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJCSAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJICBzdHJ1Y3QgbXNnaGRyICptc2csIGludCBmbGFncykKK3sKKwlpbnQgdG1wID0gMCwgcmV0OworCisJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX05FV19DQUxMLCAwLCAmdG1wKTsKKworCWlmIChyZXQgPT0gMCAmJiAhKGZsYWdzICYgTVNHX1BFRUspKSB7CisJCV9kZWJ1ZygidG8gYmUgYWNjZXB0ZWQiKTsKKwkJd3JpdGVfbG9ja19iaCgmcngtPnJlY3Ztc2dfbG9jayk7CisJCWxpc3RfZGVsX2luaXQoJmNhbGwtPnJlY3Ztc2dfbGluayk7CisJCXdyaXRlX3VubG9ja19iaCgmcngtPnJlY3Ztc2dfbG9jayk7CisKKwkJcnhycGNfZ2V0X2NhbGwoY2FsbCwgcnhycGNfY2FsbF9nb3QpOworCQl3cml0ZV9sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmY2FsbC0+YWNjZXB0X2xpbmssICZyeC0+dG9fYmVfYWNjZXB0ZWQpOworCQl3cml0ZV91bmxvY2soJnJ4LT5jYWxsX2xvY2spOworCX0KKworCXRyYWNlX3J4cnBjX3JlY3Ztc2coY2FsbCwgcnhycGNfcmVjdm1zZ190b19iZV9hY2NlcHRlZCwgMSwgMCwgMCwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRW5kIHRoZSBwYWNrZXQgcmVjZXB0aW9uIHBoYXNlLgorICovCitzdGF0aWMgdm9pZCByeHJwY19lbmRfcnhfcGhhc2Uoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHJ4cnBjX3NlcmlhbF90IHNlcmlhbCkKK3sKKwlfZW50ZXIoIiVkLCVzIiwgY2FsbC0+ZGVidWdfaWQsIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPnN0YXRlXSk7CisKKwl0cmFjZV9yeHJwY19yZWNlaXZlKGNhbGwsIHJ4cnBjX3JlY2VpdmVfZW5kLCAwLCBjYWxsLT5yeF90b3ApOworCUFTU0VSVENNUChjYWxsLT5yeF9oYXJkX2FjaywgPT0sIGNhbGwtPnJ4X3RvcCk7CisKKwlpZiAoY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWSkgeworCQlyeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBSWFJQQ19BQ0tfSURMRSwgMCwgc2VyaWFsLCB0cnVlLCBmYWxzZSwKKwkJCQkgIHJ4cnBjX3Byb3Bvc2VfYWNrX3Rlcm1pbmFsX2Fjayk7CisJCXJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUNLKTsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKworCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKKwljYXNlIFJYUlBDX0NBTExfQ0xJRU5UX1JFQ1ZfUkVQTFk6CisJCV9fcnhycGNfY2FsbF9jb21wbGV0ZWQoY2FsbCk7CisJCWJyZWFrOworCisJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1Q6CisJCWNhbGwtPnR4X3BoYXNlID0gdHJ1ZTsKKwkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKK30KKworLyoKKyAqIERpc2NhcmQgYSBwYWNrZXQgd2UndmUgdXNlZCB1cCBhbmQgYWR2YW5jZSB0aGUgUnggd2luZG93IGJ5IG9uZS4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfcm90YXRlX3J4X3dpbmRvdyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBza19idWZmICpza2I7CisJcnhycGNfc2VyaWFsX3Qgc2VyaWFsOworCXJ4cnBjX3NlcV90IGhhcmRfYWNrLCB0b3A7CisJdTggZmxhZ3M7CisJaW50IGl4OworCisJX2VudGVyKCIlZCIsIGNhbGwtPmRlYnVnX2lkKTsKKworCWhhcmRfYWNrID0gY2FsbC0+cnhfaGFyZF9hY2s7CisJdG9wID0gc21wX2xvYWRfYWNxdWlyZSgmY2FsbC0+cnhfdG9wKTsKKwlBU1NFUlQoYmVmb3JlKGhhcmRfYWNrLCB0b3ApKTsKKworCWhhcmRfYWNrKys7CisJaXggPSBoYXJkX2FjayAmIFJYUlBDX1JYVFhfQlVGRl9NQVNLOworCXNrYiA9IGNhbGwtPnJ4dHhfYnVmZmVyW2l4XTsKKwlyeHJwY19zZWVfc2tiKHNrYiwgcnhycGNfc2tiX3J4X3JvdGF0ZWQpOworCXNwID0gcnhycGNfc2tiKHNrYik7CisJZmxhZ3MgPSBzcC0+aGRyLmZsYWdzOworCXNlcmlhbCA9IHNwLT5oZHIuc2VyaWFsOworCWlmIChjYWxsLT5yeHR4X2Fubm90YXRpb25zW2l4XSAmIFJYUlBDX1JYX0FOTk9fSlVNQk8pCisJCXNlcmlhbCArPSAoY2FsbC0+cnh0eF9hbm5vdGF0aW9uc1tpeF0gJiBSWFJQQ19SWF9BTk5PX0pVTUJPKSAtIDE7CisKKwljYWxsLT5yeHR4X2J1ZmZlcltpeF0gPSBOVUxMOworCWNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbaXhdID0gMDsKKwkvKiBCYXJyaWVyIGFnYWluc3QgcnhycGNfaW5wdXRfZGF0YSgpLiAqLworCXNtcF9zdG9yZV9yZWxlYXNlKCZjYWxsLT5yeF9oYXJkX2FjaywgaGFyZF9hY2spOworCisJcnhycGNfZnJlZV9za2Ioc2tiLCByeHJwY19za2JfcnhfZnJlZWQpOworCisJX2RlYnVnKCIldSwldSwlMDJ4IiwgaGFyZF9hY2ssIHRvcCwgZmxhZ3MpOworCXRyYWNlX3J4cnBjX3JlY2VpdmUoY2FsbCwgcnhycGNfcmVjZWl2ZV9yb3RhdGUsIHNlcmlhbCwgaGFyZF9hY2spOworCWlmIChmbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKSB7CisJCXJ4cnBjX2VuZF9yeF9waGFzZShjYWxsLCBzZXJpYWwpOworCX0gZWxzZSB7CisJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGVyZSdzIGFuIEFDSyB0aGF0IG5lZWRzIHNlbmRpbmcuICovCisJCWlmIChhZnRlcl9lcShoYXJkX2FjaywgY2FsbC0+YWNrcl9jb25zdW1lZCArIDIpIHx8CisJCSAgICBhZnRlcl9lcSh0b3AsIGNhbGwtPmFja3Jfc2VlbiArIDIpIHx8CisJCSAgICAoaGFyZF9hY2sgPT0gdG9wICYmIGFmdGVyKGhhcmRfYWNrLCBjYWxsLT5hY2tyX2NvbnN1bWVkKSkpCisJCQlyeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBSWFJQQ19BQ0tfREVMQVksIDAsIHNlcmlhbCwKKwkJCQkJICB0cnVlLCBmYWxzZSwKKwkJCQkJICByeHJwY19wcm9wb3NlX2Fja19yb3RhdGVfcngpOworCQlpZiAoY2FsbC0+YWNrcl9yZWFzb24pCisJCQlyeHJwY19zZW5kX2NhbGxfcGFja2V0KGNhbGwsIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSyk7CisJfQorfQorCisvKgorICogRGVjcnlwdCBhbmQgdmVyaWZ5IGEgKHN1YilwYWNrZXQuICBUaGUgcGFja2V0J3MgbGVuZ3RoIG1heSBiZSBjaGFuZ2VkIGR1ZSB0bworICogcGFkZGluZywgYnV0IGlmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZSBwYWNrZXQgbGVuZ3RoIHdpbGwgYmUgcmVzaWRlbnQgaW4gdGhlCisgKiBzb2NrZXQgYnVmZmVyLiAgTm90ZSB0aGF0IHdlIGNhbid0IG1vZGlmeSB0aGUgbWFzdGVyIHNrYiBpbmZvIGFzIHRoZSBza2IgbWF5CisgKiBiZSB0aGUgaG9tZSB0byBtdWx0aXBsZSBzdWJwYWNrZXRzLgorICovCitzdGF0aWMgaW50IHJ4cnBjX3ZlcmlmeV9wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgdTggYW5ub3RhdGlvbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKwlyeHJwY19zZXFfdCBzZXEgPSBzcC0+aGRyLnNlcTsKKwl1MTYgY2tzdW0gPSBzcC0+aGRyLmNrc3VtOworCisJX2VudGVyKCIiKTsKKworCS8qIEZvciBhbGwgYnV0IHRoZSBoZWFkIGp1bWJvIHN1YnBhY2tldCwgdGhlIHNlY3VyaXR5IGNoZWNrc3VtIGlzIGluIGEKKwkgKiBqdW1ibyBoZWFkZXIgaW1tZWRpYXRlbHkgcHJpb3IgdG8gdGhlIGRhdGEuCisJICovCisJaWYgKChhbm5vdGF0aW9uICYgUlhSUENfUlhfQU5OT19KVU1CTykgPiAxKSB7CisJCV9fYmUxNiB0bXA7CisJCWlmIChza2JfY29weV9iaXRzKHNrYiwgb2Zmc2V0IC0gMiwgJnRtcCwgMikgPCAwKQorCQkJQlVHKCk7CisJCWNrc3VtID0gbnRvaHModG1wKTsKKwkJc2VxICs9IChhbm5vdGF0aW9uICYgUlhSUENfUlhfQU5OT19KVU1CTykgLSAxOworCX0KKworCXJldHVybiBjYWxsLT5jb25uLT5zZWN1cml0eS0+dmVyaWZ5X3BhY2tldChjYWxsLCBza2IsIG9mZnNldCwgbGVuLAorCQkJCQkJICAgc2VxLCBja3N1bSk7Cit9CisKKy8qCisgKiBMb2NhdGUgdGhlIGRhdGEgd2l0aGluIGEgcGFja2V0LiAgVGhpcyBpcyBjb21wbGljYXRlZCBieToKKyAqCisgKiAoMSkgQW4gc2tiIG1heSBjb250YWluIGEganVtYm8gcGFja2V0IC0gc28gd2UgaGF2ZSB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZQorICogICAgIHN1YnBhY2tldC4KKyAqCisgKiAoMikgVGhlIChzdWIpcGFja2V0cyBtYXkgYmUgZW5jcnlwdGVkIGFuZCwgaWYgc28sIHRoZSBlbmNyeXB0ZWQgcG9ydGlvbgorICogICAgIGNvbnRhaW5zIGFuIGV4dHJhIGhlYWRlciB3aGljaCBpbmNsdWRlcyB0aGUgdHJ1ZSBsZW5ndGggb2YgdGhlIGRhdGEsCisgKiAgICAgZXhjbHVkaW5nIGFueSBlbmNyeXB0ZWQgcGFkZGluZy4KKyAqLworc3RhdGljIGludCByeHJwY19sb2NhdGVfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgdTggKl9hbm5vdGF0aW9uLAorCQkJICAgICB1bnNpZ25lZCBpbnQgKl9vZmZzZXQsIHVuc2lnbmVkIGludCAqX2xlbikKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCByeHJwY193aXJlX2hlYWRlcik7CisJdW5zaWduZWQgaW50IGxlbiA9ICpfbGVuOworCWludCByZXQ7CisJdTggYW5ub3RhdGlvbiA9ICpfYW5ub3RhdGlvbjsKKworCS8qIExvY2F0ZSB0aGUgc3VicGFja2V0ICovCisJbGVuID0gc2tiLT5sZW4gLSBvZmZzZXQ7CisJaWYgKChhbm5vdGF0aW9uICYgUlhSUENfUlhfQU5OT19KVU1CTykgPiAwKSB7CisJCW9mZnNldCArPSAoKChhbm5vdGF0aW9uICYgUlhSUENfUlhfQU5OT19KVU1CTykgLSAxKSAqCisJCQkgICBSWFJQQ19KVU1CT19TVUJQS1RMRU4pOworCQlsZW4gPSAoYW5ub3RhdGlvbiAmIFJYUlBDX1JYX0FOTk9fSkxBU1QpID8KKwkJCXNrYi0+bGVuIC0gb2Zmc2V0IDogUlhSUENfSlVNQk9fU1VCUEtUTEVOOworCX0KKworCWlmICghKGFubm90YXRpb24gJiBSWFJQQ19SWF9BTk5PX1ZFUklGSUVEKSkgeworCQlyZXQgPSByeHJwY192ZXJpZnlfcGFja2V0KGNhbGwsIHNrYiwgYW5ub3RhdGlvbiwgb2Zmc2V0LCBsZW4pOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCSpfYW5ub3RhdGlvbiB8PSBSWFJQQ19SWF9BTk5PX1ZFUklGSUVEOworCX0KKworCSpfb2Zmc2V0ID0gb2Zmc2V0OworCSpfbGVuID0gbGVuOworCWNhbGwtPmNvbm4tPnNlY3VyaXR5LT5sb2NhdGVfZGF0YShjYWxsLCBza2IsIF9vZmZzZXQsIF9sZW4pOworCXJldHVybiAwOworfQorCisvKgorICogRGVsaXZlciBtZXNzYWdlcyB0byBhIGNhbGwuICBUaGlzIGtlZXBzIHByb2Nlc3NpbmcgcGFja2V0cyB1bnRpbCB0aGUgYnVmZmVyCisgKiBpcyBmaWxsZWQgYW5kIHdlIGZpbmQgZWl0aGVyIG1vcmUgREFUQSAocmV0dXJucyAwKSBvciB0aGUgZW5kIG9mIHRoZSBEQVRBCisgKiAocmV0dXJucyAxKS4gIElmIG1vcmUgcGFja2V0cyBhcmUgcmVxdWlyZWQsIGl0IHJldHVybnMgLUVBR0FJTi4KKyAqLworc3RhdGljIGludCByeHJwY19yZWN2bXNnX2RhdGEoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwKKwkJCSAgICAgIHNpemVfdCBsZW4sIGludCBmbGFncywgc2l6ZV90ICpfb2Zmc2V0KQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlyeHJwY19zZXFfdCBoYXJkX2FjaywgdG9wLCBzZXE7CisJc2l6ZV90IHJlbWFpbjsKKwlib29sIGxhc3Q7CisJdW5zaWduZWQgaW50IHJ4X3BrdF9vZmZzZXQsIHJ4X3BrdF9sZW47CisJaW50IGl4LCBjb3B5LCByZXQgPSAtRUFHQUlOLCByZXQyOworCisJcnhfcGt0X29mZnNldCA9IGNhbGwtPnJ4X3BrdF9vZmZzZXQ7CisJcnhfcGt0X2xlbiA9IGNhbGwtPnJ4X3BrdF9sZW47CisKKwlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1QpIHsKKwkJc2VxID0gY2FsbC0+cnhfaGFyZF9hY2s7CisJCXJldCA9IDE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBCYXJyaWVycyBhZ2FpbnN0IHJ4cnBjX2lucHV0X2RhdGEoKS4gKi8KKwloYXJkX2FjayA9IGNhbGwtPnJ4X2hhcmRfYWNrOworCXRvcCA9IHNtcF9sb2FkX2FjcXVpcmUoJmNhbGwtPnJ4X3RvcCk7CisJZm9yIChzZXEgPSBoYXJkX2FjayArIDE7IGJlZm9yZV9lcShzZXEsIHRvcCk7IHNlcSsrKSB7CisJCWl4ID0gc2VxICYgUlhSUENfUlhUWF9CVUZGX01BU0s7CisJCXNrYiA9IGNhbGwtPnJ4dHhfYnVmZmVyW2l4XTsKKwkJaWYgKCFza2IpIHsKKwkJCXRyYWNlX3J4cnBjX3JlY3Ztc2coY2FsbCwgcnhycGNfcmVjdm1zZ19ob2xlLCBzZXEsCisJCQkJCSAgICByeF9wa3Rfb2Zmc2V0LCByeF9wa3RfbGVuLCAwKTsKKwkJCWJyZWFrOworCQl9CisJCXNtcF9ybWIoKTsKKwkJcnhycGNfc2VlX3NrYihza2IsIHJ4cnBjX3NrYl9yeF9zZWVuKTsKKwkJc3AgPSByeHJwY19za2Ioc2tiKTsKKworCQlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkKKwkJCXRyYWNlX3J4cnBjX3JlY2VpdmUoY2FsbCwgcnhycGNfcmVjZWl2ZV9mcm9udCwKKwkJCQkJICAgIHNwLT5oZHIuc2VyaWFsLCBzZXEpOworCisJCWlmIChtc2cpCisJCQlzb2NrX3JlY3ZfdGltZXN0YW1wKG1zZywgc29jay0+c2ssIHNrYik7CisKKwkJaWYgKHJ4X3BrdF9vZmZzZXQgPT0gMCkgeworCQkJcmV0MiA9IHJ4cnBjX2xvY2F0ZV9kYXRhKGNhbGwsIHNrYiwKKwkJCQkJCSAmY2FsbC0+cnh0eF9hbm5vdGF0aW9uc1tpeF0sCisJCQkJCQkgJnJ4X3BrdF9vZmZzZXQsICZyeF9wa3RfbGVuKTsKKwkJCXRyYWNlX3J4cnBjX3JlY3Ztc2coY2FsbCwgcnhycGNfcmVjdm1zZ19uZXh0LCBzZXEsCisJCQkJCSAgICByeF9wa3Rfb2Zmc2V0LCByeF9wa3RfbGVuLCByZXQyKTsKKwkJCWlmIChyZXQyIDwgMCkgeworCQkJCXJldCA9IHJldDI7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0cmFjZV9yeHJwY19yZWN2bXNnKGNhbGwsIHJ4cnBjX3JlY3Ztc2dfY29udCwgc2VxLAorCQkJCQkgICAgcnhfcGt0X29mZnNldCwgcnhfcGt0X2xlbiwgMCk7CisJCX0KKworCQkvKiBXZSBoYXZlIHRvIGhhbmRsZSBzaG9ydCwgZW1wdHkgYW5kIHVzZWQtdXAgREFUQSBwYWNrZXRzLiAqLworCQlyZW1haW4gPSBsZW4gLSAqX29mZnNldDsKKwkJY29weSA9IHJ4X3BrdF9sZW47CisJCWlmIChjb3B5ID4gcmVtYWluKQorCQkJY29weSA9IHJlbWFpbjsKKwkJaWYgKGNvcHkgPiAwKSB7CisJCQlyZXQyID0gc2tiX2NvcHlfZGF0YWdyYW1faXRlcihza2IsIHJ4X3BrdF9vZmZzZXQsIGl0ZXIsCisJCQkJCQkgICAgICBjb3B5KTsKKwkJCWlmIChyZXQyIDwgMCkgeworCQkJCXJldCA9IHJldDI7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCS8qIGhhbmRsZSBwaWVjZW1lYWwgY29uc3VtcHRpb24gb2YgZGF0YSBwYWNrZXRzICovCisJCQlyeF9wa3Rfb2Zmc2V0ICs9IGNvcHk7CisJCQlyeF9wa3RfbGVuIC09IGNvcHk7CisJCQkqX29mZnNldCArPSBjb3B5OworCQl9CisKKwkJaWYgKHJ4X3BrdF9sZW4gPiAwKSB7CisJCQl0cmFjZV9yeHJwY19yZWN2bXNnKGNhbGwsIHJ4cnBjX3JlY3Ztc2dfZnVsbCwgc2VxLAorCQkJCQkgICAgcnhfcGt0X29mZnNldCwgcnhfcGt0X2xlbiwgMCk7CisJCQlBU1NFUlRDTVAoKl9vZmZzZXQsID09LCBsZW4pOworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogVGhlIHdob2xlIHBhY2tldCBoYXMgYmVlbiB0cmFuc2ZlcnJlZC4gKi8KKwkJbGFzdCA9IHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVDsKKwkJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpCisJCQlyeHJwY19yb3RhdGVfcnhfd2luZG93KGNhbGwpOworCQlyeF9wa3Rfb2Zmc2V0ID0gMDsKKwkJcnhfcGt0X2xlbiA9IDA7CisKKwkJaWYgKGxhc3QpIHsKKwkJCUFTU0VSVENNUChzZXEsID09LCBSRUFEX09OQ0UoY2FsbC0+cnhfdG9wKSk7CisJCQlyZXQgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKK291dDoKKwlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkgeworCQljYWxsLT5yeF9wa3Rfb2Zmc2V0ID0gcnhfcGt0X29mZnNldDsKKwkJY2FsbC0+cnhfcGt0X2xlbiA9IHJ4X3BrdF9sZW47CisJfQorZG9uZToKKwl0cmFjZV9yeHJwY19yZWN2bXNnKGNhbGwsIHJ4cnBjX3JlY3Ztc2dfZGF0YV9yZXR1cm4sIHNlcSwKKwkJCSAgICByeF9wa3Rfb2Zmc2V0LCByeF9wa3RfbGVuLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWNlaXZlIGEgbWVzc2FnZSBmcm9tIGFuIFJ4UlBDIHNvY2tldAogICogLSB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgYWJvdXQgdHdvIG9yIG1vcmUgdGhyZWFkcyBjYWxsaW5nIHJlY3Ztc2cKICAqICAgc2ltdWx0YW5lb3VzbHkKICAqLwogaW50IHJ4cnBjX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLAogCQkgIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gTlVMTCwgKmNvbnRpbnVlX2NhbGwgPSBOVUxMOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwogCXN0cnVjdCByeHJwY19zb2NrICpyeCA9IHJ4cnBjX3NrKHNvY2stPnNrKTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJc2l6ZV90IGNvcGllZCA9IDA7CiAJbG9uZyB0aW1lbzsKLQlpbnQgY29weSwgcmV0LCB1bGxlbiwgb2Zmc2V0LCBjb3BpZWQgPSAwOwotCXUzMiBhYm9ydF9jb2RlOworCWludCByZXQ7CiAKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAotCV9lbnRlcigiLCwsJXp1LCVkIiwgbGVuLCBmbGFncyk7CisJdHJhY2VfcnhycGNfcmVjdm1zZyhOVUxMLCByeHJwY19yZWN2bXNnX2VudGVyLCAwLCAwLCAwLCAwKTsKIAogCWlmIChmbGFncyAmIChNU0dfT09CIHwgTVNHX1RSVU5DKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JdWxsZW4gPSBtc2ctPm1zZ19mbGFncyAmIE1TR19DTVNHX0NPTVBBVCA/IDQgOiBzaXplb2YodW5zaWduZWQgbG9uZyk7Ci0KIAl0aW1lbyA9IHNvY2tfcmN2dGltZW8oJnJ4LT5zaywgZmxhZ3MgJiBNU0dfRE9OVFdBSVQpOwotCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19NT1JFOwogCit0cnlfYWdhaW46CiAJbG9ja19zb2NrKCZyeC0+c2spOwogCi0JZm9yICg7OykgewotCQkvKiByZXR1cm4gaW1tZWRpYXRlbHkgaWYgYSBjbGllbnQgc29ja2V0IGhhcyBubyBvdXRzdGFuZGluZwotCQkgKiBjYWxscyAqLwotCQlpZiAoUkJfRU1QVFlfUk9PVCgmcngtPmNhbGxzKSkgewotCQkJaWYgKGNvcGllZCkKLQkJCQlnb3RvIG91dDsKLQkJCWlmIChyeC0+c2suc2tfc3RhdGUgIT0gUlhSUENfU0VSVkVSX0xJU1RFTklORykgewotCQkJCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKLQkJCQlpZiAoY29udGludWVfY2FsbCkKLQkJCQkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7Ci0JCQkJcmV0dXJuIC1FTk9EQVRBOwotCQkJfQotCQl9Ci0KLQkJLyogZ2V0IHRoZSBuZXh0IG1lc3NhZ2Ugb24gdGhlIFJ4IHF1ZXVlICovCi0JCXNrYiA9IHNrYl9wZWVrKCZyeC0+c2suc2tfcmVjZWl2ZV9xdWV1ZSk7Ci0JCWlmICghc2tiKSB7Ci0JCQkvKiBub3RoaW5nIHJlbWFpbnMgb24gdGhlIHF1ZXVlICovCi0JCQlpZiAoY29waWVkICYmCi0JCQkgICAgKGZsYWdzICYgTVNHX1BFRUsgfHwgdGltZW8gPT0gMCkpCi0JCQkJZ290byBvdXQ7Ci0KLQkJCS8qIHdhaXQgZm9yIGEgbWVzc2FnZSB0byB0dXJuIHVwICovCi0JCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7Ci0JCQlwcmVwYXJlX3RvX3dhaXRfZXhjbHVzaXZlKHNrX3NsZWVwKCZyeC0+c2spLCAmd2FpdCwKLQkJCQkJCSAgVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXJldCA9IHNvY2tfZXJyb3IoJnJ4LT5zayk7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gd2FpdF9lcnJvcjsKLQotCQkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmcngtPnNrLnNrX3JlY2VpdmVfcXVldWUpKSB7Ci0JCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCQlnb3RvIHdhaXRfaW50ZXJydXB0ZWQ7Ci0JCQkJdGltZW8gPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvKTsKLQkJCX0KLQkJCWZpbmlzaF93YWl0KHNrX3NsZWVwKCZyeC0+c2spLCAmd2FpdCk7Ci0JCQlsb2NrX3NvY2soJnJ4LT5zayk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JcGVla19uZXh0X3BhY2tldDoKLQkJc3AgPSByeHJwY19za2Ioc2tiKTsKLQkJY2FsbCA9IHNwLT5jYWxsOwotCQlBU1NFUlQoY2FsbCAhPSBOVUxMKTsKLQotCQlfZGVidWcoIm5leHQgcGt0ICVzIiwgcnhycGNfcGt0c1tzcC0+aGRyLnR5cGVdKTsKLQotCQkvKiBtYWtlIHN1cmUgd2Ugd2FpdCBmb3IgdGhlIHN0YXRlIHRvIGJlIHVwZGF0ZWQgaW4gdGhpcyBjYWxsICovCi0JCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKLQotCQlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSkgewotCQkJX2RlYnVnKCJwYWNrZXQgZnJvbSByZWxlYXNlZCBjYWxsIik7Ci0JCQlpZiAoc2tiX2RlcXVldWUoJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKSAhPSBza2IpCi0JCQkJQlVHKCk7Ci0JCQlyeHJwY19mcmVlX3NrYihza2IpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBkZXRlcm1pbmUgd2hldGhlciB0byBjb250aW51ZSBsYXN0IGRhdGEgcmVjZWl2ZSAqLwotCQlpZiAoY29udGludWVfY2FsbCkgewotCQkJX2RlYnVnKCJtYXliZSBjb250Iik7Ci0JCQlpZiAoY2FsbCAhPSBjb250aW51ZV9jYWxsIHx8Ci0JCQkgICAgc2tiLT5tYXJrICE9IFJYUlBDX1NLQl9NQVJLX0RBVEEpIHsKLQkJCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7Ci0JCQkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7Ci0JCQkJX2xlYXZlKCIgPSAlZCBbbm9uY29udF0iLCBjb3BpZWQpOwotCQkJCXJldHVybiBjb3BpZWQ7Ci0JCQl9Ci0JCX0KLQotCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQotCQkvKiBjb3B5IHRoZSBwZWVyIGFkZHJlc3MgYW5kIHRpbWVzdGFtcCAqLwotCQlpZiAoIWNvbnRpbnVlX2NhbGwpIHsKLQkJCWlmIChtc2ctPm1zZ19uYW1lKSB7Ci0JCQkJc2l6ZV90IGxlbiA9Ci0JCQkJCXNpemVvZihjYWxsLT5jb25uLT5wYXJhbXMucGVlci0+c3J4KTsKLQkJCQltZW1jcHkobXNnLT5tc2dfbmFtZSwKLQkJCQkgICAgICAgJmNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5zcngsIGxlbik7Ci0JCQkJbXNnLT5tc2dfbmFtZWxlbiA9IGxlbjsKLQkJCX0KLQkJCXNvY2tfcmVjdl90aW1lc3RhbXAobXNnLCAmcngtPnNrLCBza2IpOwotCQl9Ci0KLQkJLyogcmVjZWl2ZSB0aGUgbWVzc2FnZSAqLwotCQlpZiAoc2tiLT5tYXJrICE9IFJYUlBDX1NLQl9NQVJLX0RBVEEpCi0JCQlnb3RvIHJlY2VpdmVfbm9uX2RhdGFfbWVzc2FnZTsKLQotCQlfZGVidWcoInJlY3Ztc2cgREFUQSAjJXUgeyAlZCwgJWQgfSIsCi0JCSAgICAgICBzcC0+aGRyLnNlcSwgc2tiLT5sZW4sIHNwLT5vZmZzZXQpOwotCi0JCWlmICghY29udGludWVfY2FsbCkgewotCQkJLyogb25seSBzZXQgdGhlIGNvbnRyb2wgZGF0YSBvbmNlIHBlciByZWN2bXNnKCkgKi8KLQkJCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19VU0VSX0NBTExfSUQsCi0JCQkJICAgICAgIHVsbGVuLCAmY2FsbC0+dXNlcl9jYWxsX0lEKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWdvdG8gY29weV9lcnJvcjsKLQkJCUFTU0VSVCh0ZXN0X2JpdChSWFJQQ19DQUxMX0hBU19VU0VSSUQsICZjYWxsLT5mbGFncykpOwotCQl9Ci0KLQkJQVNTRVJUQ01QKHNwLT5oZHIuc2VxLCA+PSwgY2FsbC0+cnhfZGF0YV9yZWN2KTsKLQkJQVNTRVJUQ01QKHNwLT5oZHIuc2VxLCA8PSwgY2FsbC0+cnhfZGF0YV9yZWN2ICsgMSk7Ci0JCWNhbGwtPnJ4X2RhdGFfcmVjdiA9IHNwLT5oZHIuc2VxOwotCi0JCUFTU0VSVENNUChzcC0+aGRyLnNlcSwgPiwgY2FsbC0+cnhfZGF0YV9lYXRlbik7Ci0KLQkJb2Zmc2V0ID0gc3AtPm9mZnNldDsKLQkJY29weSA9IHNrYi0+bGVuIC0gb2Zmc2V0OwotCQlpZiAoY29weSA+IGxlbiAtIGNvcGllZCkKLQkJCWNvcHkgPSBsZW4gLSBjb3BpZWQ7Ci0KLQkJcmV0ID0gc2tiX2NvcHlfZGF0YWdyYW1fbXNnKHNrYiwgb2Zmc2V0LCBtc2csIGNvcHkpOwotCi0JCWlmIChyZXQgPCAwKQotCQkJZ290byBjb3B5X2Vycm9yOwotCi0JCS8qIGhhbmRsZSBwaWVjZW1lYWwgY29uc3VtcHRpb24gb2YgZGF0YSBwYWNrZXRzICovCi0JCV9kZWJ1ZygiY29waWVkICVkKyVkIiwgY29weSwgY29waWVkKTsKLQotCQlvZmZzZXQgKz0gY29weTsKLQkJY29waWVkICs9IGNvcHk7Ci0KLQkJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpCi0JCQlzcC0+b2Zmc2V0ID0gb2Zmc2V0OwotCi0JCWlmIChzcC0+b2Zmc2V0IDwgc2tiLT5sZW4pIHsKLQkJCV9kZWJ1ZygiYnVmZmVyIGZ1bGwiKTsKLQkJCUFTU0VSVENNUChjb3BpZWQsID09LCBsZW4pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiB3ZSB0cmFuc2ZlcnJlZCB0aGUgd2hvbGUgZGF0YSBwYWNrZXQgKi8KLQkJaWYgKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgewotCQkJX2RlYnVnKCJsYXN0Iik7Ci0JCQlpZiAocnhycGNfY29ubl9pc19jbGllbnQoY2FsbC0+Y29ubikpIHsKLQkJCQkgLyogbGFzdCBieXRlIG9mIHJlcGx5IHJlY2VpdmVkICovCi0JCQkJcmV0ID0gY29waWVkOwotCQkJCWdvdG8gdGVybWluYWxfbWVzc2FnZTsKLQkJCX0KLQotCQkJLyogbGFzdCBiaXQgb2YgcmVxdWVzdCByZWNlaXZlZCAqLwotCQkJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpIHsKLQkJCQlfZGVidWcoImVhdCBwYWNrZXQiKTsKLQkJCQlpZiAoc2tiX2RlcXVldWUoJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKSAhPQotCQkJCSAgICBza2IpCi0JCQkJCUJVRygpOwotCQkJCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci0JCQl9Ci0JCQltc2ctPm1zZ19mbGFncyAmPSB+TVNHX01PUkU7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIG1vdmUgb24gdG8gdGhlIG5leHQgZGF0YSBtZXNzYWdlICovCi0JCV9kZWJ1ZygibmV4dCIpOwotCQlpZiAoIWNvbnRpbnVlX2NhbGwpCi0JCQljb250aW51ZV9jYWxsID0gc3AtPmNhbGw7Ci0JCWVsc2UKLQkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCQljYWxsID0gTlVMTDsKLQotCQlpZiAoZmxhZ3MgJiBNU0dfUEVFSykgewotCQkJX2RlYnVnKCJwZWVrIG5leHQiKTsKLQkJCXNrYiA9IHNrYi0+bmV4dDsKLQkJCWlmIChza2IgPT0gKHN0cnVjdCBza19idWZmICopICZyeC0+c2suc2tfcmVjZWl2ZV9xdWV1ZSkKLQkJCQlicmVhazsKLQkJCWdvdG8gcGVla19uZXh0X3BhY2tldDsKLQkJfQotCi0JCV9kZWJ1ZygiZWF0IHBhY2tldCIpOwotCQlpZiAoc2tiX2RlcXVldWUoJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKSAhPSBza2IpCi0JCQlCVUcoKTsKLQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwkvKiBSZXR1cm4gaW1tZWRpYXRlbHkgaWYgYSBjbGllbnQgc29ja2V0IGhhcyBubyBvdXRzdGFuZGluZyBjYWxscyAqLworCWlmIChSQl9FTVBUWV9ST09UKCZyeC0+Y2FsbHMpICYmCisJICAgIGxpc3RfZW1wdHkoJnJ4LT5yZWN2bXNnX3EpICYmCisJICAgIHJ4LT5zay5za19zdGF0ZSAhPSBSWFJQQ19TRVJWRVJfTElTVEVOSU5HKSB7CisJCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKKwkJcmV0dXJuIC1FTk9EQVRBOwogCX0KIAotCS8qIGVuZCBvZiBub24tdGVybWluYWwgZGF0YSBwYWNrZXQgcmVjZXB0aW9uIGZvciB0aGUgbW9tZW50ICovCi0JX2RlYnVnKCJlbmQgcmN2IGRhdGEiKTsKLW91dDoKLQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7Ci0JaWYgKGNhbGwpCi0JCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCWlmIChjb250aW51ZV9jYWxsKQotCQlyeHJwY19wdXRfY2FsbChjb250aW51ZV9jYWxsKTsKLQlfbGVhdmUoIiA9ICVkIFtkYXRhXSIsIGNvcGllZCk7Ci0JcmV0dXJuIGNvcGllZDsKLQotCS8qIGhhbmRsZSBub24tREFUQSBtZXNzYWdlcyBzdWNoIGFzIGFib3J0cywgaW5jb21pbmcgY29ubmVjdGlvbnMgYW5kCi0JICogZmluYWwgQUNLcyAqLwotcmVjZWl2ZV9ub25fZGF0YV9tZXNzYWdlOgotCV9kZWJ1Zygibm9uLWRhdGEiKTsKLQotCWlmIChza2ItPm1hcmsgPT0gUlhSUENfU0tCX01BUktfTkVXX0NBTEwpIHsKLQkJX2RlYnVnKCJSRUNWIE5FVyBDQUxMIik7Ci0JCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19ORVdfQ0FMTCwgMCwgJmFib3J0X2NvZGUpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gY29weV9lcnJvcjsKLQkJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpIHsKLQkJCWlmIChza2JfZGVxdWV1ZSgmcngtPnNrLnNrX3JlY2VpdmVfcXVldWUpICE9IHNrYikKLQkJCQlCVUcoKTsKLQkJCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJaWYgKGxpc3RfZW1wdHkoJnJ4LT5yZWN2bXNnX3EpKSB7CisJCXJldCA9IC1FV09VTERCTE9DSzsKKwkJaWYgKHRpbWVvID09IDApIHsKKwkJCWNhbGwgPSBOVUxMOworCQkJZ290byBlcnJvcl9ub19jYWxsOwogCQl9Ci0JCWdvdG8gb3V0OworCisJCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKKworCQkvKiBXYWl0IGZvciBzb21ldGhpbmcgdG8gaGFwcGVuICovCisJCXByZXBhcmVfdG9fd2FpdF9leGNsdXNpdmUoc2tfc2xlZXAoJnJ4LT5zayksICZ3YWl0LAorCQkJCQkgIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXJldCA9IHNvY2tfZXJyb3IoJnJ4LT5zayk7CisJCWlmIChyZXQpCisJCQlnb3RvIHdhaXRfZXJyb3I7CisKKwkJaWYgKGxpc3RfZW1wdHkoJnJ4LT5yZWN2bXNnX3EpKSB7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJZ290byB3YWl0X2ludGVycnVwdGVkOworCQkJdHJhY2VfcnhycGNfcmVjdm1zZyhOVUxMLCByeHJwY19yZWN2bXNnX3dhaXQsCisJCQkJCSAgICAwLCAwLCAwLCAwKTsKKwkJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisJCX0KKwkJZmluaXNoX3dhaXQoc2tfc2xlZXAoJnJ4LT5zayksICZ3YWl0KTsKKwkJZ290byB0cnlfYWdhaW47CiAJfQogCi0JcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX1VTRVJfQ0FMTF9JRCwKLQkJICAgICAgIHVsbGVuLCAmY2FsbC0+dXNlcl9jYWxsX0lEKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBjb3B5X2Vycm9yOwotCUFTU0VSVCh0ZXN0X2JpdChSWFJQQ19DQUxMX0hBU19VU0VSSUQsICZjYWxsLT5mbGFncykpOworCS8qIEZpbmQgdGhlIG5leHQgY2FsbCBhbmQgZGVxdWV1ZSBpdCBpZiB3ZSdyZSBub3QganVzdCBwZWVraW5nLiAgSWYgd2UKKwkgKiBkbyBkZXF1ZXVlIGl0LCB0aGF0IGNvbWVzIHdpdGggYSByZWYgdGhhdCB3ZSB3aWxsIG5lZWQgdG8gcmVsZWFzZS4KKwkgKi8KKwl3cml0ZV9sb2NrX2JoKCZyeC0+cmVjdm1zZ19sb2NrKTsKKwlsID0gcngtPnJlY3Ztc2dfcS5uZXh0OworCWNhbGwgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCByeHJwY19jYWxsLCByZWN2bXNnX2xpbmspOworCWlmICghKGZsYWdzICYgTVNHX1BFRUspKQorCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5yZWN2bXNnX2xpbmspOworCWVsc2UKKwkJcnhycGNfZ2V0X2NhbGwoY2FsbCwgcnhycGNfY2FsbF9nb3QpOworCXdyaXRlX3VubG9ja19iaCgmcngtPnJlY3Ztc2dfbG9jayk7CiAKLQlzd2l0Y2ggKHNrYi0+bWFyaykgewotCWNhc2UgUlhSUENfU0tCX01BUktfREFUQToKKwl0cmFjZV9yeHJwY19yZWN2bXNnKGNhbGwsIHJ4cnBjX3JlY3Ztc2dfZGVxdWV1ZSwgMCwgMCwgMCwgMCk7CisKKwlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSkKIAkJQlVHKCk7Ci0JY2FzZSBSWFJQQ19TS0JfTUFSS19GSU5BTF9BQ0s6Ci0JCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19BQ0ssIDAsICZhYm9ydF9jb2RlKTsKKworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0hBU19VU0VSSUQsICZjYWxsLT5mbGFncykpIHsKKwkJaWYgKGZsYWdzICYgTVNHX0NNU0dfQ09NUEFUKSB7CisJCQl1bnNpZ25lZCBpbnQgaWQzMiA9IGNhbGwtPnVzZXJfY2FsbF9JRDsKKworCQkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX1VTRVJfQ0FMTF9JRCwKKwkJCQkgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGludCksICZpZDMyKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19VU0VSX0NBTExfSUQsCisJCQkJICAgICAgIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJCQkgICAgICAgJmNhbGwtPnVzZXJfY2FsbF9JRCk7CisJCX0KKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yOworCX0KKworCWlmIChtc2ctPm1zZ19uYW1lKSB7CisJCXNpemVfdCBsZW4gPSBzaXplb2YoY2FsbC0+Y29ubi0+cGFyYW1zLnBlZXItPnNyeCk7CisJCW1lbWNweShtc2ctPm1zZ19uYW1lLCAmY2FsbC0+Y29ubi0+cGFyYW1zLnBlZXItPnNyeCwgbGVuKTsKKwkJbXNnLT5tc2dfbmFtZWxlbiA9IGxlbjsKKwl9CisKKwlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7CisJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0NFUFRJTkc6CisJCXJldCA9IHJ4cnBjX3JlY3Ztc2dfbmV3X2NhbGwocngsIGNhbGwsIG1zZywgZmxhZ3MpOwogCQlicmVhazsKLQljYXNlIFJYUlBDX1NLQl9NQVJLX0JVU1k6Ci0JCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19CVVNZLCAwLCAmYWJvcnRfY29kZSk7Ci0JCWJyZWFrOwotCWNhc2UgUlhSUENfU0tCX01BUktfUkVNT1RFX0FCT1JUOgotCQlhYm9ydF9jb2RlID0gY2FsbC0+cmVtb3RlX2Fib3J0OwotCQlyZXQgPSBwdXRfY21zZyhtc2csIFNPTF9SWFJQQywgUlhSUENfQUJPUlQsIDQsICZhYm9ydF9jb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBSWFJQQ19TS0JfTUFSS19MT0NBTF9BQk9SVDoKLQkJYWJvcnRfY29kZSA9IGNhbGwtPmxvY2FsX2Fib3J0OwotCQlyZXQgPSBwdXRfY21zZyhtc2csIFNPTF9SWFJQQywgUlhSUENfQUJPUlQsIDQsICZhYm9ydF9jb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBSWFJQQ19TS0JfTUFSS19ORVRfRVJST1I6Ci0JCV9kZWJ1ZygiUkVDViBORVQgRVJST1IgJWQiLCBzcC0+ZXJyb3IpOwotCQlhYm9ydF9jb2RlID0gc3AtPmVycm9yOwotCQlyZXQgPSBwdXRfY21zZyhtc2csIFNPTF9SWFJQQywgUlhSUENfTkVUX0VSUk9SLCA0LCAmYWJvcnRfY29kZSk7Ci0JCWJyZWFrOwotCWNhc2UgUlhSUENfU0tCX01BUktfTE9DQUxfRVJST1I6Ci0JCV9kZWJ1ZygiUkVDViBMT0NBTCBFUlJPUiAlZCIsIHNwLT5lcnJvcik7Ci0JCWFib3J0X2NvZGUgPSBzcC0+ZXJyb3I7Ci0JCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19MT0NBTF9FUlJPUiwgNCwKLQkJCSAgICAgICAmYWJvcnRfY29kZSk7CisJY2FzZSBSWFJQQ19DQUxMX0NMSUVOVF9SRUNWX1JFUExZOgorCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfUkVDVl9SRVFVRVNUOgorCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1Q6CisJCXJldCA9IHJ4cnBjX3JlY3Ztc2dfZGF0YShzb2NrLCBjYWxsLCBtc2csICZtc2ctPm1zZ19pdGVyLCBsZW4sCisJCQkJCSBmbGFncywgJmNvcGllZCk7CisJCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJCXJldCA9IDA7CisKKwkJaWYgKGFmdGVyKGNhbGwtPnJ4X3RvcCwgY2FsbC0+cnhfaGFyZF9hY2spICYmCisJCSAgICBjYWxsLT5yeHR4X2J1ZmZlclsoY2FsbC0+cnhfaGFyZF9hY2sgKyAxKSAmIFJYUlBDX1JYVFhfQlVGRl9NQVNLXSkKKwkJCXJ4cnBjX25vdGlmeV9zb2NrZXQoY2FsbCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByX2VycigiVW5rbm93biBwYWNrZXQgbWFyayAldVxuIiwgc2tiLT5tYXJrKTsKLQkJQlVHKCk7CisJCXJldCA9IDA7CiAJCWJyZWFrOwogCX0KIAogCWlmIChyZXQgPCAwKQotCQlnb3RvIGNvcHlfZXJyb3I7CisJCWdvdG8gZXJyb3I7CiAKLXRlcm1pbmFsX21lc3NhZ2U6Ci0JX2RlYnVnKCJ0ZXJtaW5hbCIpOwotCW1zZy0+bXNnX2ZsYWdzICY9IH5NU0dfTU9SRTsKLQltc2ctPm1zZ19mbGFncyB8PSBNU0dfRU9SOwotCi0JaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpIHsKLQkJX25ldCgiZnJlZSB0ZXJtaW5hbCBza2IgJXAiLCBza2IpOwotCQlpZiAoc2tiX2RlcXVldWUoJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKSAhPSBza2IpCi0JCQlCVUcoKTsKLQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKLQkJcnhycGNfcmVtb3ZlX3VzZXJfSUQocngsIGNhbGwpOworCWlmIChjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7CisJCXJldCA9IHJ4cnBjX3JlY3Ztc2dfdGVybShjYWxsLCBtc2cpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWlmICghKGZsYWdzICYgTVNHX1BFRUspKQorCQkJcnhycGNfcmVsZWFzZV9jYWxsKHJ4LCBjYWxsKTsKKwkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX0VPUjsKKwkJcmV0ID0gMTsKIAl9CiAKLQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7Ci0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JaWYgKGNvbnRpbnVlX2NhbGwpCi0JCXJ4cnBjX3B1dF9jYWxsKGNvbnRpbnVlX2NhbGwpOwotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7CisJaWYgKHJldCA9PSAwKQorCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfTU9SRTsKKwllbHNlCisJCW1zZy0+bXNnX2ZsYWdzICY9IH5NU0dfTU9SRTsKKwlyZXQgPSBjb3BpZWQ7CiAKLWNvcHlfZXJyb3I6Ci0JX2RlYnVnKCJjb3B5IGVycm9yIik7CitlcnJvcjoKKwlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CitlcnJvcl9ub19jYWxsOgogCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQlpZiAoY29udGludWVfY2FsbCkKLQkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJdHJhY2VfcnhycGNfcmVjdm1zZyhjYWxsLCByeHJwY19yZWN2bXNnX3JldHVybiwgMCwgMCwgMCwgcmV0KTsKIAlyZXR1cm4gcmV0OwogCiB3YWl0X2ludGVycnVwdGVkOgogCXJldCA9IHNvY2tfaW50cl9lcnJubyh0aW1lbyk7CiB3YWl0X2Vycm9yOgogCWZpbmlzaF93YWl0KHNrX3NsZWVwKCZyeC0+c2spLCAmd2FpdCk7Ci0JaWYgKGNvbnRpbnVlX2NhbGwpCi0JCXJ4cnBjX3B1dF9jYWxsKGNvbnRpbnVlX2NhbGwpOwotCWlmIChjb3BpZWQpCi0JCWNvcGllZCA9IHJldDsKLQlfbGVhdmUoIiA9ICVkIFt3YWl0ZmFpbCAlZF0iLCBjb3BpZWQsIHJldCk7Ci0JcmV0dXJuIGNvcGllZDsKLQorCWNhbGwgPSBOVUxMOworCWdvdG8gZXJyb3Jfbm9fY2FsbDsKIH0KIAogLyoqCi0gKiByeHJwY19rZXJuZWxfZGF0YV9kZWxpdmVyZWQgLSBSZWNvcmQgZGVsaXZlcnkgb2YgZGF0YSBtZXNzYWdlCi0gKiBAc2tiOiBNZXNzYWdlIGhvbGRpbmcgZGF0YQorICogcnhycGNfa2VybmVsX3JlY3ZfZGF0YSAtIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gcmVjZWl2ZSBkYXRhL2luZm8KKyAqIEBzb2NrOiBUaGUgc29ja2V0IHRoYXQgdGhlIGNhbGwgZXhpc3RzIG9uCisgKiBAY2FsbDogVGhlIGNhbGwgdG8gc2VuZCBkYXRhIHRocm91Z2gKKyAqIEBidWY6IFRoZSBidWZmZXIgdG8gcmVjZWl2ZSBpbnRvCisgKiBAc2l6ZTogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciwgaW5jbHVkaW5nIGRhdGEgYWxyZWFkeSByZWFkCisgKiBAX29mZnNldDogVGhlIHJ1bm5pbmcgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlci4KKyAqIEB3YW50X21vcmU6IFRydWUgaWYgbW9yZSBkYXRhIGlzIGV4cGVjdGVkIHRvIGJlIHJlYWQKKyAqIEBfYWJvcnQ6IFdoZXJlIHRoZSBhYm9ydCBjb2RlIGlzIHN0b3JlZCBpZiAtRUNPTk5BQk9SVEVEIGlzIHJldHVybmVkCiAgKgotICogUmVjb3JkIHRoZSBkZWxpdmVyeSBvZiBhIGRhdGEgbWVzc2FnZS4gIFRoaXMgcGVybWl0cyBSeFJQQyB0byBrZWVwIGl0cwotICogdHJhY2tpbmcgY29ycmVjdC4gIFRoZSBzb2NrZXQgYnVmZmVyIHdpbGwgYmUgZGVsZXRlZC4KLSAqLwotdm9pZCByeHJwY19rZXJuZWxfZGF0YV9kZWxpdmVyZWQoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSBzcC0+Y2FsbDsKLQotCUFTU0VSVENNUChzcC0+aGRyLnNlcSwgPj0sIGNhbGwtPnJ4X2RhdGFfcmVjdik7Ci0JQVNTRVJUQ01QKHNwLT5oZHIuc2VxLCA8PSwgY2FsbC0+cnhfZGF0YV9yZWN2ICsgMSk7Ci0JY2FsbC0+cnhfZGF0YV9yZWN2ID0gc3AtPmhkci5zZXE7Ci0KLQlBU1NFUlRDTVAoc3AtPmhkci5zZXEsID4sIGNhbGwtPnJ4X2RhdGFfZWF0ZW4pOwotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci19Ci0KLUVYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2RhdGFfZGVsaXZlcmVkKTsKLQotLyoqCi0gKiByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0IC0gRGV0ZXJtaW5lIGlmIGRhdGEgbWVzc2FnZSBpcyBsYXN0IG9uZQotICogQHNrYjogTWVzc2FnZSBob2xkaW5nIGRhdGEKKyAqIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gcmVjZWl2ZSBkYXRhIGFuZCBwaWNrIHVwIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICogc3RhdGUgb2YgYSBjYWxsLiAgUmV0dXJucyAwIGlmIGdvdCB3aGF0IHdhcyBhc2tlZCBmb3IgYW5kIHRoZXJlJ3MgbW9yZQorICogYXZhaWxhYmxlLCAxIGlmIHdlIGdvdCB3aGF0IHdhcyBhc2tlZCBmb3IgYW5kIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEKKyAqIGFuZCAtRUFHQUlOIGlmIHdlIG5lZWQgbW9yZSBkYXRhLgogICoKLSAqIERldGVybWluZSBpZiBkYXRhIG1lc3NhZ2UgaXMgbGFzdCBvbmUgZm9yIHRoZSBwYXJlbnQgY2FsbC4KLSAqLwotYm9vbCByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0KHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOwotCi0JQVNTRVJUQ01QKHNrYi0+bWFyaywgPT0sIFJYUlBDX1NLQl9NQVJLX0RBVEEpOwotCi0JcmV0dXJuIHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVDsKLX0KLQotRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0KTsKLQotLyoqCi0gKiByeHJwY19rZXJuZWxfZ2V0X2Fib3J0X2NvZGUgLSBHZXQgdGhlIGFib3J0IGNvZGUgZnJvbSBhbiBSeFJQQyBhYm9ydCBtZXNzYWdlCi0gKiBAc2tiOiBNZXNzYWdlIGluZGljYXRpbmcgYW4gYWJvcnQKKyAqIE5vdGUgdGhhdCB3ZSBtYXkgcmV0dXJuIC1FQUdBSU4gdG8gZHJhaW4gZW1wdHkgcGFja2V0cyBhdCB0aGUgZW5kIG9mIHRoZQorICogZGF0YSwgZXZlbiBpZiB3ZSd2ZSBhbHJlYWR5IGNvcGllZCBvdmVyIHRoZSByZXF1ZXN0ZWQgZGF0YS4KICAqCi0gKiBHZXQgdGhlIGFib3J0IGNvZGUgZnJvbSBhbiBSeFJQQyBhYm9ydCBtZXNzYWdlLgorICogVGhpcyBmdW5jdGlvbiBhZGRzIHRoZSBhbW91bnQgaXQgdHJhbnNmZXJzIHRvICpfb2Zmc2V0LCBzbyB0aGlzIHNob3VsZCBiZQorICogcHJlY2xlYXJlZCBhcyBhcHByb3ByaWF0ZS4gIE5vdGUgdGhhdCB0aGUgYW1vdW50IHJlbWFpbmluZyBpbiB0aGUgYnVmZmVyIGlzCisgKiB0YWtlbiB0byBiZSBzaXplIC0gKl9vZmZzZXQuCisgKgorICogKl9hYm9ydCBzaG91bGQgYWxzbyBiZSBpbml0aWFsaXNlZCB0byAwLgogICovCi11MzIgcnhycGNfa2VybmVsX2dldF9hYm9ydF9jb2RlKHN0cnVjdCBza19idWZmICpza2IpCitpbnQgcnhycGNfa2VybmVsX3JlY3ZfZGF0YShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCSAgIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUsIHNpemVfdCAqX29mZnNldCwKKwkJCSAgIGJvb2wgd2FudF9tb3JlLCB1MzIgKl9hYm9ydCkKIHsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CisJc3RydWN0IGlvdl9pdGVyIGl0ZXI7CisJc3RydWN0IGt2ZWMgaW92OworCWludCByZXQ7CiAKLQlzd2l0Y2ggKHNrYi0+bWFyaykgewotCWNhc2UgUlhSUENfU0tCX01BUktfUkVNT1RFX0FCT1JUOgotCQlyZXR1cm4gc3AtPmNhbGwtPnJlbW90ZV9hYm9ydDsKLQljYXNlIFJYUlBDX1NLQl9NQVJLX0xPQ0FMX0FCT1JUOgotCQlyZXR1cm4gc3AtPmNhbGwtPmxvY2FsX2Fib3J0OworCV9lbnRlcigieyVkLCVzfSwlenUvJXp1LCVkIiwKKwkgICAgICAgY2FsbC0+ZGVidWdfaWQsIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPnN0YXRlXSwKKwkgICAgICAgKl9vZmZzZXQsIHNpemUsIHdhbnRfbW9yZSk7CisKKwlBU1NFUlRDTVAoKl9vZmZzZXQsIDw9LCBzaXplKTsKKwlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsICE9LCBSWFJQQ19DQUxMX1NFUlZFUl9BQ0NFUFRJTkcpOworCisJaW92Lmlvdl9iYXNlID0gYnVmICsgKl9vZmZzZXQ7CisJaW92Lmlvdl9sZW4gPSBzaXplIC0gKl9vZmZzZXQ7CisJaW92X2l0ZXJfa3ZlYygmaXRlciwgSVRFUl9LVkVDIHwgUkVBRCwgJmlvdiwgMSwgc2l6ZSAtICpfb2Zmc2V0KTsKKworCWxvY2tfc29jayhzb2NrLT5zayk7CisKKwlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7CisJY2FzZSBSWFJQQ19DQUxMX0NMSUVOVF9SRUNWX1JFUExZOgorCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfUkVDVl9SRVFVRVNUOgorCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1Q6CisJCXJldCA9IHJ4cnBjX3JlY3Ztc2dfZGF0YShzb2NrLCBjYWxsLCBOVUxMLCAmaXRlciwgc2l6ZSwgMCwKKwkJCQkJIF9vZmZzZXQpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCisJCS8qIFdlIGNhbiBvbmx5IHJlYWNoIGhlcmUgd2l0aCBhIHBhcnRpYWxseSBmdWxsIGJ1ZmZlciBpZiB3ZQorCQkgKiBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZGF0YS4gIFdlIG11c3Qgb3RoZXJ3aXNlIGhhdmUgYQorCQkgKiBmdWxsIGJ1ZmZlciBvciBoYXZlIGJlZW4gZ2l2ZW4gLUVBR0FJTi4KKwkJICovCisJCWlmIChyZXQgPT0gMSkgeworCQkJaWYgKCpfb2Zmc2V0IDwgc2l6ZSkKKwkJCQlnb3RvIHNob3J0X2RhdGE7CisJCQlpZiAoIXdhbnRfbW9yZSkKKwkJCQlnb3RvIHJlYWRfcGhhc2VfY29tcGxldGU7CisJCQlyZXQgPSAwOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoIXdhbnRfbW9yZSkKKwkJCWdvdG8gZXhjZXNzX2RhdGE7CisJCWdvdG8gb3V0OworCisJY2FzZSBSWFJQQ19DQUxMX0NPTVBMRVRFOgorCQlnb3RvIGNhbGxfY29tcGxldGU7CisKIAlkZWZhdWx0OgotCQlCVUcoKTsKKwkJcmV0ID0gLUVJTlBST0dSRVNTOworCQlnb3RvIG91dDsKIAl9CisKK3JlYWRfcGhhc2VfY29tcGxldGU6CisJcmV0ID0gMTsKK291dDoKKwlyZWxlYXNlX3NvY2soc29jay0+c2spOworCV9sZWF2ZSgiID0gJWQgWyV6dSwlZF0iLCByZXQsICpfb2Zmc2V0LCAqX2Fib3J0KTsKKwlyZXR1cm4gcmV0OworCitzaG9ydF9kYXRhOgorCXJldCA9IC1FQkFETVNHOworCWdvdG8gb3V0OworZXhjZXNzX2RhdGE6CisJcmV0ID0gLUVNU0dTSVpFOworCWdvdG8gb3V0OworY2FsbF9jb21wbGV0ZToKKwkqX2Fib3J0ID0gY2FsbC0+YWJvcnRfY29kZTsKKwlyZXQgPSBjYWxsLT5lcnJvcjsKKwlpZiAoY2FsbC0+Y29tcGxldGlvbiA9PSBSWFJQQ19DQUxMX1NVQ0NFRURFRCkgeworCQlyZXQgPSAxOworCQlpZiAoc2l6ZSA+IDApCisJCQlyZXQgPSAtRUNPTk5SRVNFVDsKKwl9CisJZ290byBvdXQ7CiB9Ci0KLUVYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2dldF9hYm9ydF9jb2RlKTsKLQotLyoqCi0gKiByeHJwY19rZXJuZWxfZ2V0X2Vycm9yIC0gR2V0IHRoZSBlcnJvciBudW1iZXIgZnJvbSBhbiBSeFJQQyBlcnJvciBtZXNzYWdlCi0gKiBAc2tiOiBNZXNzYWdlIGluZGljYXRpbmcgYW4gZXJyb3IKLSAqCi0gKiBHZXQgdGhlIGVycm9yIG51bWJlciBmcm9tIGFuIFJ4UlBDIGVycm9yIG1lc3NhZ2UuCi0gKi8KLWludCByeHJwY19rZXJuZWxfZ2V0X2Vycm9yX251bWJlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKLQotCXJldHVybiBzcC0+ZXJyb3I7Ci19Ci0KLUVYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2dldF9lcnJvcl9udW1iZXIpOworRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfcmVjdl9kYXRhKTsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9yeGthZC5jIGIvbmV0L3J4cnBjL3J4a2FkLmMKaW5kZXggNjNhZmE5ZS4uNjI3YWJlZCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL3J4a2FkLmMKKysrIGIvbmV0L3J4cnBjL3J4a2FkLmMKQEAgLTgwLDEyICs4MCwxMCBAQAogCWNhc2UgUlhSUENfU0VDVVJJVFlfQVVUSDoKIAkJY29ubi0+c2l6ZV9hbGlnbiA9IDg7CiAJCWNvbm4tPnNlY3VyaXR5X3NpemUgPSBzaXplb2Yoc3RydWN0IHJ4a2FkX2xldmVsMV9oZHIpOwotCQljb25uLT5oZWFkZXJfc2l6ZSArPSBzaXplb2Yoc3RydWN0IHJ4a2FkX2xldmVsMV9oZHIpOwogCQlicmVhazsKIAljYXNlIFJYUlBDX1NFQ1VSSVRZX0VOQ1JZUFQ6CiAJCWNvbm4tPnNpemVfYWxpZ24gPSA4OwogCQljb25uLT5zZWN1cml0eV9zaXplID0gc2l6ZW9mKHN0cnVjdCByeGthZF9sZXZlbDJfaGRyKTsKLQkJY29ubi0+aGVhZGVyX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCByeGthZF9sZXZlbDJfaGRyKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVLRVlSRUpFQ1RFRDsKQEAgLTE2MSw3ICsxNTksNyBAQAogCiAJX2VudGVyKCIiKTsKIAotCWNoZWNrID0gc3AtPmhkci5zZXEgXiBzcC0+aGRyLmNhbGxOdW1iZXI7CisJY2hlY2sgPSBzcC0+aGRyLnNlcSBeIGNhbGwtPmNhbGxfaWQ7CiAJZGF0YV9zaXplIHw9ICh1MzIpY2hlY2sgPDwgMTY7CiAKIAloZHIuZGF0YV9zaXplID0gaHRvbmwoZGF0YV9zaXplKTsKQEAgLTIwNSw3ICsyMDMsNyBAQAogCiAJX2VudGVyKCIiKTsKIAotCWNoZWNrID0gc3AtPmhkci5zZXEgXiBzcC0+aGRyLmNhbGxOdW1iZXI7CisJY2hlY2sgPSBzcC0+aGRyLnNlcSBeIGNhbGwtPmNhbGxfaWQ7CiAKIAlyeGtoZHIuZGF0YV9zaXplID0gaHRvbmwoZGF0YV9zaXplIHwgKHUzMiljaGVjayA8PCAxNik7CiAJcnhraGRyLmNoZWNrc3VtID0gMDsKQEAgLTI3NSw5ICsyNzMsOSBAQAogCW1lbWNweSgmaXYsIGNhbGwtPmNvbm4tPmNzdW1faXYueCwgc2l6ZW9mKGl2KSk7CiAKIAkvKiBjYWxjdWxhdGUgdGhlIHNlY3VyaXR5IGNoZWNrc3VtICovCi0JeCA9IGNhbGwtPmNoYW5uZWwgPDwgKDMyIC0gUlhSUENfQ0lEU0hJRlQpOworCXggPSAoY2FsbC0+Y2lkICYgUlhSUENfQ0hBTk5FTE1BU0spIDw8ICgzMiAtIFJYUlBDX0NJRFNISUZUKTsKIAl4IHw9IHNwLT5oZHIuc2VxICYgMHgzZmZmZmZmZjsKLQljYWxsLT5jcnlwdG9fYnVmWzBdID0gaHRvbmwoc3AtPmhkci5jYWxsTnVtYmVyKTsKKwljYWxsLT5jcnlwdG9fYnVmWzBdID0gaHRvbmwoY2FsbC0+Y2FsbF9pZCk7CiAJY2FsbC0+Y3J5cHRvX2J1ZlsxXSA9IGh0b25sKHgpOwogCiAJc2dfaW5pdF9vbmUoJnNnLCBjYWxsLT5jcnlwdG9fYnVmLCA4KTsKQEAgLTMxNiwxMiArMzE0LDExIEBACiAvKgogICogZGVjcnlwdCBwYXJ0aWFsIGVuY3J5cHRpb24gb24gYSBwYWNrZXQgKGxldmVsIDEgc2VjdXJpdHkpCiAgKi8KLXN0YXRpYyBpbnQgcnhrYWRfdmVyaWZ5X3BhY2tldF9hdXRoKGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICB1MzIgKl9hYm9ydF9jb2RlKQorc3RhdGljIGludCByeGthZF92ZXJpZnlfcGFja2V0XzEoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW4sCisJCQkJIHJ4cnBjX3NlcV90IHNlcSkKIHsKIAlzdHJ1Y3QgcnhrYWRfbGV2ZWwxX2hkciBzZWNoZHI7Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKIAlTS0NJUEhFUl9SRVFVRVNUX09OX1NUQUNLKHJlcSwgY2FsbC0+Y29ubi0+Y2lwaGVyKTsKIAlzdHJ1Y3QgcnhycGNfY3J5cHQgaXY7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzE2XTsKQEAgLTMzMiwxNSArMzI5LDIwIEBACiAKIAlfZW50ZXIoIiIpOwogCi0Jc3AgPSByeHJwY19za2Ioc2tiKTsKKwlpZiAobGVuIDwgOCkgeworCQlyeHJwY19hYm9ydF9jYWxsKCJWMUgiLCBjYWxsLCBzZXEsIFJYS0FEU0VBTEVESU5DT04sIEVQUk9UTyk7CisJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJfQogCi0JLyogd2Ugd2FudCB0byBkZWNyeXB0IHRoZSBza2J1ZmYgaW4tcGxhY2UgKi8KKwkvKiBEZWNyeXB0IHRoZSBza2J1ZmYgaW4tcGxhY2UuICBUT0RPOiBXZSByZWFsbHkgd2FudCB0byBkZWNyeXB0CisJICogZGlyZWN0bHkgaW50byB0aGUgdGFyZ2V0IGJ1ZmZlci4KKwkgKi8KIAluc2cgPSBza2JfY293X2RhdGEoc2tiLCAwLCAmdHJhaWxlcik7CiAJaWYgKG5zZyA8IDAgfHwgbnNnID4gMTYpCiAJCWdvdG8gbm9tZW07CiAKIAlzZ19pbml0X3RhYmxlKHNnLCBuc2cpOwotCXNrYl90b19zZ3ZlYyhza2IsIHNnLCAwLCA4KTsKKwlza2JfdG9fc2d2ZWMoc2tiLCBzZywgb2Zmc2V0LCA4KTsKIAogCS8qIHN0YXJ0IHRoZSBkZWNyeXB0aW9uIGFmcmVzaCAqLwogCW1lbXNldCgmaXYsIDAsIHNpemVvZihpdikpOwpAQCAtMzUxLDM1ICszNTMsMzUgQEAKIAljcnlwdG9fc2tjaXBoZXJfZGVjcnlwdChyZXEpOwogCXNrY2lwaGVyX3JlcXVlc3RfemVybyhyZXEpOwogCi0JLyogcmVtb3ZlIHRoZSBkZWNyeXB0ZWQgcGFja2V0IGxlbmd0aCAqLwotCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgJnNlY2hkciwgc2l6ZW9mKHNlY2hkcikpIDwgMCkKLQkJZ290byBkYXRhbGVuX2Vycm9yOwotCWlmICghc2tiX3B1bGwoc2tiLCBzaXplb2Yoc2VjaGRyKSkpCi0JCUJVRygpOworCS8qIEV4dHJhY3QgdGhlIGRlY3J5cHRlZCBwYWNrZXQgbGVuZ3RoICovCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBvZmZzZXQsICZzZWNoZHIsIHNpemVvZihzZWNoZHIpKSA8IDApIHsKKwkJcnhycGNfYWJvcnRfY2FsbCgiWFYxIiwgY2FsbCwgc2VxLCBSWEtBRERBVEFMRU4sIEVQUk9UTyk7CisJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJfQorCW9mZnNldCArPSBzaXplb2Yoc2VjaGRyKTsKKwlsZW4gLT0gc2l6ZW9mKHNlY2hkcik7CiAKIAlidWYgPSBudG9obChzZWNoZHIuZGF0YV9zaXplKTsKIAlkYXRhX3NpemUgPSBidWYgJiAweGZmZmY7CiAKIAljaGVjayA9IGJ1ZiA+PiAxNjsKLQljaGVjayBePSBzcC0+aGRyLnNlcSBeIHNwLT5oZHIuY2FsbE51bWJlcjsKKwljaGVjayBePSBzZXEgXiBjYWxsLT5jYWxsX2lkOwogCWNoZWNrICY9IDB4ZmZmZjsKIAlpZiAoY2hlY2sgIT0gMCkgewotCQkqX2Fib3J0X2NvZGUgPSBSWEtBRFNFQUxFRElOQ09OOworCQlyeHJwY19hYm9ydF9jYWxsKCJWMUMiLCBjYWxsLCBzZXEsIFJYS0FEU0VBTEVESU5DT04sIEVQUk9UTyk7CiAJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CiAJfQogCi0JLyogc2hvcnRlbiB0aGUgcGFja2V0IHRvIHJlbW92ZSB0aGUgcGFkZGluZyAqLwotCWlmIChkYXRhX3NpemUgPiBza2ItPmxlbikKLQkJZ290byBkYXRhbGVuX2Vycm9yOwotCWVsc2UgaWYgKGRhdGFfc2l6ZSA8IHNrYi0+bGVuKQotCQlza2ItPmxlbiA9IGRhdGFfc2l6ZTsKKwlpZiAoZGF0YV9zaXplID4gbGVuKSB7CisJCXJ4cnBjX2Fib3J0X2NhbGwoIlYxTCIsIGNhbGwsIHNlcSwgUlhLQUREQVRBTEVOLCBFUFJPVE8pOworCQlnb3RvIHByb3RvY29sX2Vycm9yOworCX0KIAogCV9sZWF2ZSgiID0gMCBbZGxlbj0leF0iLCBkYXRhX3NpemUpOwogCXJldHVybiAwOwogCi1kYXRhbGVuX2Vycm9yOgotCSpfYWJvcnRfY29kZSA9IFJYS0FEREFUQUxFTjsKIHByb3RvY29sX2Vycm9yOgorCXJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpOwogCV9sZWF2ZSgiID0gLUVQUk9UTyIpOwogCXJldHVybiAtRVBST1RPOwogCkBAIC0zOTEsMTMgKzM5MywxMiBAQAogLyoKICAqIHdob2xseSBkZWNyeXB0IGEgcGFja2V0IChsZXZlbCAyIHNlY3VyaXR5KQogICovCi1zdGF0aWMgaW50IHJ4a2FkX3ZlcmlmeV9wYWNrZXRfZW5jcnlwdChjb25zdCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgICAgdTMyICpfYWJvcnRfY29kZSkKK3N0YXRpYyBpbnQgcnhrYWRfdmVyaWZ5X3BhY2tldF8yKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJCSByeHJwY19zZXFfdCBzZXEpCiB7CiAJY29uc3Qgc3RydWN0IHJ4cnBjX2tleV90b2tlbiAqdG9rZW47CiAJc3RydWN0IHJ4a2FkX2xldmVsMl9oZHIgc2VjaGRyOwotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CiAJU0tDSVBIRVJfUkVRVUVTVF9PTl9TVEFDSyhyZXEsIGNhbGwtPmNvbm4tPmNpcGhlcik7CiAJc3RydWN0IHJ4cnBjX2NyeXB0IGl2OwogCXN0cnVjdCBzY2F0dGVybGlzdCBfc2dbNF0sICpzZzsKQEAgLTQwOCw5ICs0MDksMTQgQEAKIAogCV9lbnRlcigiLHslZH0iLCBza2ItPmxlbik7CiAKLQlzcCA9IHJ4cnBjX3NrYihza2IpOworCWlmIChsZW4gPCA4KSB7CisJCXJ4cnBjX2Fib3J0X2NhbGwoIlYySCIsIGNhbGwsIHNlcSwgUlhLQURTRUFMRURJTkNPTiwgRVBST1RPKTsKKwkJZ290byBwcm90b2NvbF9lcnJvcjsKKwl9CiAKLQkvKiB3ZSB3YW50IHRvIGRlY3J5cHQgdGhlIHNrYnVmZiBpbi1wbGFjZSAqLworCS8qIERlY3J5cHQgdGhlIHNrYnVmZiBpbi1wbGFjZS4gIFRPRE86IFdlIHJlYWxseSB3YW50IHRvIGRlY3J5cHQKKwkgKiBkaXJlY3RseSBpbnRvIHRoZSB0YXJnZXQgYnVmZmVyLgorCSAqLwogCW5zZyA9IHNrYl9jb3dfZGF0YShza2IsIDAsICZ0cmFpbGVyKTsKIAlpZiAobnNnIDwgMCkKIAkJZ290byBub21lbTsKQEAgLTQyMyw3ICs0MjksNyBAQAogCX0KIAogCXNnX2luaXRfdGFibGUoc2csIG5zZyk7Ci0Jc2tiX3RvX3NndmVjKHNrYiwgc2csIDAsIHNrYi0+bGVuKTsKKwlza2JfdG9fc2d2ZWMoc2tiLCBzZywgb2Zmc2V0LCBsZW4pOwogCiAJLyogZGVjcnlwdCBmcm9tIHRoZSBzZXNzaW9uIGtleSAqLwogCXRva2VuID0gY2FsbC0+Y29ubi0+cGFyYW1zLmtleS0+cGF5bG9hZC5kYXRhWzBdOwpAQCAtNDMxLDQxICs0MzcsNDEgQEAKIAogCXNrY2lwaGVyX3JlcXVlc3Rfc2V0X3RmbShyZXEsIGNhbGwtPmNvbm4tPmNpcGhlcik7CiAJc2tjaXBoZXJfcmVxdWVzdF9zZXRfY2FsbGJhY2socmVxLCAwLCBOVUxMLCBOVUxMKTsKLQlza2NpcGhlcl9yZXF1ZXN0X3NldF9jcnlwdChyZXEsIHNnLCBzZywgc2tiLT5sZW4sIGl2LngpOworCXNrY2lwaGVyX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgc2csIHNnLCBsZW4sIGl2LngpOwogCWNyeXB0b19za2NpcGhlcl9kZWNyeXB0KHJlcSk7CiAJc2tjaXBoZXJfcmVxdWVzdF96ZXJvKHJlcSk7CiAJaWYgKHNnICE9IF9zZykKIAkJa2ZyZWUoc2cpOwogCi0JLyogcmVtb3ZlIHRoZSBkZWNyeXB0ZWQgcGFja2V0IGxlbmd0aCAqLwotCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgJnNlY2hkciwgc2l6ZW9mKHNlY2hkcikpIDwgMCkKLQkJZ290byBkYXRhbGVuX2Vycm9yOwotCWlmICghc2tiX3B1bGwoc2tiLCBzaXplb2Yoc2VjaGRyKSkpCi0JCUJVRygpOworCS8qIEV4dHJhY3QgdGhlIGRlY3J5cHRlZCBwYWNrZXQgbGVuZ3RoICovCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBvZmZzZXQsICZzZWNoZHIsIHNpemVvZihzZWNoZHIpKSA8IDApIHsKKwkJcnhycGNfYWJvcnRfY2FsbCgiWFYyIiwgY2FsbCwgc2VxLCBSWEtBRERBVEFMRU4sIEVQUk9UTyk7CisJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJfQorCW9mZnNldCArPSBzaXplb2Yoc2VjaGRyKTsKKwlsZW4gLT0gc2l6ZW9mKHNlY2hkcik7CiAKIAlidWYgPSBudG9obChzZWNoZHIuZGF0YV9zaXplKTsKIAlkYXRhX3NpemUgPSBidWYgJiAweGZmZmY7CiAKIAljaGVjayA9IGJ1ZiA+PiAxNjsKLQljaGVjayBePSBzcC0+aGRyLnNlcSBeIHNwLT5oZHIuY2FsbE51bWJlcjsKKwljaGVjayBePSBzZXEgXiBjYWxsLT5jYWxsX2lkOwogCWNoZWNrICY9IDB4ZmZmZjsKIAlpZiAoY2hlY2sgIT0gMCkgewotCQkqX2Fib3J0X2NvZGUgPSBSWEtBRFNFQUxFRElOQ09OOworCQlyeHJwY19hYm9ydF9jYWxsKCJWMkMiLCBjYWxsLCBzZXEsIFJYS0FEU0VBTEVESU5DT04sIEVQUk9UTyk7CiAJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CiAJfQogCi0JLyogc2hvcnRlbiB0aGUgcGFja2V0IHRvIHJlbW92ZSB0aGUgcGFkZGluZyAqLwotCWlmIChkYXRhX3NpemUgPiBza2ItPmxlbikKLQkJZ290byBkYXRhbGVuX2Vycm9yOwotCWVsc2UgaWYgKGRhdGFfc2l6ZSA8IHNrYi0+bGVuKQotCQlza2ItPmxlbiA9IGRhdGFfc2l6ZTsKKwlpZiAoZGF0YV9zaXplID4gbGVuKSB7CisJCXJ4cnBjX2Fib3J0X2NhbGwoIlYyTCIsIGNhbGwsIHNlcSwgUlhLQUREQVRBTEVOLCBFUFJPVE8pOworCQlnb3RvIHByb3RvY29sX2Vycm9yOworCX0KIAogCV9sZWF2ZSgiID0gMCBbZGxlbj0leF0iLCBkYXRhX3NpemUpOwogCXJldHVybiAwOwogCi1kYXRhbGVuX2Vycm9yOgotCSpfYWJvcnRfY29kZSA9IFJYS0FEREFUQUxFTjsKIHByb3RvY29sX2Vycm9yOgorCXJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpOwogCV9sZWF2ZSgiID0gLUVQUk9UTyIpOwogCXJldHVybiAtRVBST1RPOwogCkBAIC00NzUsNDAgKzQ4MSwzMSBAQAogfQogCiAvKgotICogdmVyaWZ5IHRoZSBzZWN1cml0eSBvbiBhIHJlY2VpdmVkIHBhY2tldAorICogVmVyaWZ5IHRoZSBzZWN1cml0eSBvbiBhIHJlY2VpdmVkIHBhY2tldCBvciBzdWJwYWNrZXQgKGlmIHBhcnQgb2YgYQorICoganVtYm8gcGFja2V0KS4KICAqLwotc3RhdGljIGludCByeGthZF92ZXJpZnlfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICAgdTMyICpfYWJvcnRfY29kZSkKK3N0YXRpYyBpbnQgcnhrYWRfdmVyaWZ5X3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJICAgICAgIHJ4cnBjX3NlcV90IHNlcSwgdTE2IGV4cGVjdGVkX2Nrc3VtKQogewogCVNLQ0lQSEVSX1JFUVVFU1RfT05fU1RBQ0socmVxLCBjYWxsLT5jb25uLT5jaXBoZXIpOwotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CiAJc3RydWN0IHJ4cnBjX2NyeXB0IGl2OwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKIAl1MTYgY2tzdW07CiAJdTMyIHgsIHk7Ci0JaW50IHJldDsKLQotCXNwID0gcnhycGNfc2tiKHNrYik7CiAKIAlfZW50ZXIoInslZHsleH19LHsjJXV9IiwKLQkgICAgICAgY2FsbC0+ZGVidWdfaWQsIGtleV9zZXJpYWwoY2FsbC0+Y29ubi0+cGFyYW1zLmtleSksIHNwLT5oZHIuc2VxKTsKKwkgICAgICAgY2FsbC0+ZGVidWdfaWQsIGtleV9zZXJpYWwoY2FsbC0+Y29ubi0+cGFyYW1zLmtleSksIHNlcSk7CiAKIAlpZiAoIWNhbGwtPmNvbm4tPmNpcGhlcikKIAkJcmV0dXJuIDA7CiAKLQlpZiAoc3AtPmhkci5zZWN1cml0eUluZGV4ICE9IFJYUlBDX1NFQ1VSSVRZX1JYS0FEKSB7Ci0JCSpfYWJvcnRfY29kZSA9IFJYS0FESU5DT05TSVNURU5DWTsKLQkJX2xlYXZlKCIgPSAtRVBST1RPIFtub3QgcnhrYWRdIik7Ci0JCXJldHVybiAtRVBST1RPOwotCX0KLQogCS8qIGNvbnRpbnVlIGVuY3J5cHRpbmcgZnJvbSB3aGVyZSB3ZSBsZWZ0IG9mZiAqLwogCW1lbWNweSgmaXYsIGNhbGwtPmNvbm4tPmNzdW1faXYueCwgc2l6ZW9mKGl2KSk7CiAKIAkvKiB2YWxpZGF0ZSB0aGUgc2VjdXJpdHkgY2hlY2tzdW0gKi8KLQl4ID0gY2FsbC0+Y2hhbm5lbCA8PCAoMzIgLSBSWFJQQ19DSURTSElGVCk7Ci0JeCB8PSBzcC0+aGRyLnNlcSAmIDB4M2ZmZmZmZmY7CisJeCA9IChjYWxsLT5jaWQgJiBSWFJQQ19DSEFOTkVMTUFTSykgPDwgKDMyIC0gUlhSUENfQ0lEU0hJRlQpOworCXggfD0gc2VxICYgMHgzZmZmZmZmZjsKIAljYWxsLT5jcnlwdG9fYnVmWzBdID0gaHRvbmwoY2FsbC0+Y2FsbF9pZCk7CiAJY2FsbC0+Y3J5cHRvX2J1ZlsxXSA9IGh0b25sKHgpOwogCkBAIC01MjQsMjkgKzUyMSw2OSBAQAogCWlmIChja3N1bSA9PSAwKQogCQlja3N1bSA9IDE7IC8qIHplcm8gY2hlY2tzdW1zIGFyZSBub3QgcGVybWl0dGVkICovCiAKLQlpZiAoc3AtPmhkci5ja3N1bSAhPSBja3N1bSkgewotCQkqX2Fib3J0X2NvZGUgPSBSWEtBRFNFQUxFRElOQ09OOworCWlmIChja3N1bSAhPSBleHBlY3RlZF9ja3N1bSkgeworCQlyeHJwY19hYm9ydF9jYWxsKCJWQ0siLCBjYWxsLCBzZXEsIFJYS0FEU0VBTEVESU5DT04sIEVQUk9UTyk7CisJCXJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpOwogCQlfbGVhdmUoIiA9IC1FUFJPVE8gW2NzdW0gZmFpbGVkXSIpOwogCQlyZXR1cm4gLUVQUk9UTzsKIAl9CiAKIAlzd2l0Y2ggKGNhbGwtPmNvbm4tPnBhcmFtcy5zZWN1cml0eV9sZXZlbCkgewogCWNhc2UgUlhSUENfU0VDVVJJVFlfUExBSU46Ci0JCXJldCA9IDA7Ci0JCWJyZWFrOworCQlyZXR1cm4gMDsKIAljYXNlIFJYUlBDX1NFQ1VSSVRZX0FVVEg6Ci0JCXJldCA9IHJ4a2FkX3ZlcmlmeV9wYWNrZXRfYXV0aChjYWxsLCBza2IsIF9hYm9ydF9jb2RlKTsKLQkJYnJlYWs7CisJCXJldHVybiByeGthZF92ZXJpZnlfcGFja2V0XzEoY2FsbCwgc2tiLCBvZmZzZXQsIGxlbiwgc2VxKTsKIAljYXNlIFJYUlBDX1NFQ1VSSVRZX0VOQ1JZUFQ6Ci0JCXJldCA9IHJ4a2FkX3ZlcmlmeV9wYWNrZXRfZW5jcnlwdChjYWxsLCBza2IsIF9hYm9ydF9jb2RlKTsKLQkJYnJlYWs7CisJCXJldHVybiByeGthZF92ZXJpZnlfcGFja2V0XzIoY2FsbCwgc2tiLCBvZmZzZXQsIGxlbiwgc2VxKTsKIAlkZWZhdWx0OgotCQlyZXQgPSAtRU5PQU5POwotCQlicmVhazsKKwkJcmV0dXJuIC1FTk9BTk87CiAJfQorfQogCi0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKKy8qCisgKiBMb2NhdGUgdGhlIGRhdGEgY29udGFpbmVkIGluIGEgcGFja2V0IHRoYXQgd2FzIHBhcnRpYWxseSBlbmNyeXB0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHJ4a2FkX2xvY2F0ZV9kYXRhXzEoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJdW5zaWduZWQgaW50ICpfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgKl9sZW4pCit7CisJc3RydWN0IHJ4a2FkX2xldmVsMV9oZHIgc2VjaGRyOworCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAqX29mZnNldCwgJnNlY2hkciwgc2l6ZW9mKHNlY2hkcikpIDwgMCkKKwkJQlVHKCk7CisJKl9vZmZzZXQgKz0gc2l6ZW9mKHNlY2hkcik7CisJKl9sZW4gPSBudG9obChzZWNoZHIuZGF0YV9zaXplKSAmIDB4ZmZmZjsKK30KKworLyoKKyAqIExvY2F0ZSB0aGUgZGF0YSBjb250YWluZWQgaW4gYSBwYWNrZXQgdGhhdCB3YXMgY29tcGxldGVseSBlbmNyeXB0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHJ4a2FkX2xvY2F0ZV9kYXRhXzIoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJdW5zaWduZWQgaW50ICpfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgKl9sZW4pCit7CisJc3RydWN0IHJ4a2FkX2xldmVsMl9oZHIgc2VjaGRyOworCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAqX29mZnNldCwgJnNlY2hkciwgc2l6ZW9mKHNlY2hkcikpIDwgMCkKKwkJQlVHKCk7CisJKl9vZmZzZXQgKz0gc2l6ZW9mKHNlY2hkcik7CisJKl9sZW4gPSBudG9obChzZWNoZHIuZGF0YV9zaXplKSAmIDB4ZmZmZjsKK30KKworLyoKKyAqIExvY2F0ZSB0aGUgZGF0YSBjb250YWluZWQgaW4gYW4gYWxyZWFkeSBkZWNyeXB0ZWQgcGFja2V0LgorICovCitzdGF0aWMgdm9pZCByeGthZF9sb2NhdGVfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqX29mZnNldCwgdW5zaWduZWQgaW50ICpfbGVuKQoreworCXN3aXRjaCAoY2FsbC0+Y29ubi0+cGFyYW1zLnNlY3VyaXR5X2xldmVsKSB7CisJY2FzZSBSWFJQQ19TRUNVUklUWV9BVVRIOgorCQlyeGthZF9sb2NhdGVfZGF0YV8xKGNhbGwsIHNrYiwgX29mZnNldCwgX2xlbik7CisJCXJldHVybjsKKwljYXNlIFJYUlBDX1NFQ1VSSVRZX0VOQ1JZUFQ6CisJCXJ4a2FkX2xvY2F0ZV9kYXRhXzIoY2FsbCwgc2tiLCBfb2Zmc2V0LCBfbGVuKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CiB9CiAKIC8qCkBAIC03MTYsNyArNzUzLDcgQEAKIAlzdHJ1Y3QgcnhrYWRfY2hhbGxlbmdlIGNoYWxsZW5nZTsKIAlzdHJ1Y3QgcnhrYWRfcmVzcG9uc2UgcmVzcAogCQlfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7IC8qIG11c3QgYmUgYWxpZ25lZCBmb3IgY3J5cHRvICovCi0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CiAJdTMyIHZlcnNpb24sIG5vbmNlLCBtaW5fbGV2ZWwsIGFib3J0X2NvZGU7CiAJaW50IHJldDsKIApAQCAtNzM0LDggKzc3MSw4IEBACiAJfQogCiAJYWJvcnRfY29kZSA9IFJYS0FEUEFDS0VUU0hPUlQ7Ci0Jc3AgPSByeHJwY19za2Ioc2tiKTsKLQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsICZjaGFsbGVuZ2UsIHNpemVvZihjaGFsbGVuZ2UpKSA8IDApCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBzaXplb2Yoc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyKSwKKwkJCSAgJmNoYWxsZW5nZSwgc2l6ZW9mKGNoYWxsZW5nZSkpIDwgMCkKIAkJZ290byBwcm90b2NvbF9lcnJvcjsKIAogCXZlcnNpb24gPSBudG9obChjaGFsbGVuZ2UudmVyc2lvbik7CkBAIC05ODEsNyArMTAxOCw3IEBACiB7CiAJc3RydWN0IHJ4a2FkX3Jlc3BvbnNlIHJlc3BvbnNlCiAJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsgLyogbXVzdCBiZSBhbGlnbmVkIGZvciBjcnlwdG8gKi8KLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKIAlzdHJ1Y3QgcnhycGNfY3J5cHQgc2Vzc2lvbl9rZXk7CiAJdGltZV90IGV4cGlyeTsKIAl2b2lkICp0aWNrZXQ7CkBAIC05OTIsNyArMTAyOSw4IEBACiAJX2VudGVyKCJ7JWQsJXh9IiwgY29ubi0+ZGVidWdfaWQsIGtleV9zZXJpYWwoY29ubi0+c2VydmVyX2tleSkpOwogCiAJYWJvcnRfY29kZSA9IFJYS0FEUEFDS0VUU0hPUlQ7Ci0JaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpIDwgMCkKKwlpZiAoc2tiX2NvcHlfYml0cyhza2IsIHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpLAorCQkJICAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpIDwgMCkKIAkJZ290byBwcm90b2NvbF9lcnJvcjsKIAlpZiAoIXBza2JfcHVsbChza2IsIHNpemVvZihyZXNwb25zZSkpKQogCQlCVUcoKTsKQEAgLTEwMDAsNyArMTAzOCw2IEBACiAJdmVyc2lvbiA9IG50b2hsKHJlc3BvbnNlLnZlcnNpb24pOwogCXRpY2tldF9sZW4gPSBudG9obChyZXNwb25zZS50aWNrZXRfbGVuKTsKIAlrdm5vID0gbnRvaGwocmVzcG9uc2Uua3Zubyk7Ci0Jc3AgPSByeHJwY19za2Ioc2tiKTsKIAlfcHJvdG8oIlJ4IFJFU1BPTlNFICUlJXUgeyB2PSV1IGt2PSV1IHRsPSV1IH0iLAogCSAgICAgICBzcC0+aGRyLnNlcmlhbCwgdmVyc2lvbiwga3ZubywgdGlja2V0X2xlbik7CiAKQEAgLTEwMjIsNyArMTA1OSw4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJYWJvcnRfY29kZSA9IFJYS0FEUEFDS0VUU0hPUlQ7Ci0JaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCB0aWNrZXQsIHRpY2tldF9sZW4pIDwgMCkKKwlpZiAoc2tiX2NvcHlfYml0cyhza2IsIHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpLAorCQkJICB0aWNrZXQsIHRpY2tldF9sZW4pIDwgMCkKIAkJZ290byBwcm90b2NvbF9lcnJvcl9mcmVlOwogCiAJcmV0ID0gcnhrYWRfZGVjcnlwdF90aWNrZXQoY29ubiwgdGlja2V0LCB0aWNrZXRfbGVuLCAmc2Vzc2lvbl9rZXksCkBAIC0xMTQ3LDYgKzExODUsNyBAQAogCS5wcmltZV9wYWNrZXRfc2VjdXJpdHkJCT0gcnhrYWRfcHJpbWVfcGFja2V0X3NlY3VyaXR5LAogCS5zZWN1cmVfcGFja2V0CQkJPSByeGthZF9zZWN1cmVfcGFja2V0LAogCS52ZXJpZnlfcGFja2V0CQkJPSByeGthZF92ZXJpZnlfcGFja2V0LAorCS5sb2NhdGVfZGF0YQkJCT0gcnhrYWRfbG9jYXRlX2RhdGEsCiAJLmlzc3VlX2NoYWxsZW5nZQkJPSByeGthZF9pc3N1ZV9jaGFsbGVuZ2UsCiAJLnJlc3BvbmRfdG9fY2hhbGxlbmdlCQk9IHJ4a2FkX3Jlc3BvbmRfdG9fY2hhbGxlbmdlLAogCS52ZXJpZnlfcmVzcG9uc2UJCT0gcnhrYWRfdmVyaWZ5X3Jlc3BvbnNlLApkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3NlY3VyaXR5LmMgYi9uZXQvcnhycGMvc2VjdXJpdHkuYwppbmRleCA4MTRkMjg1Li43ZDkyMWU1IDEwMDY0NAotLS0gYS9uZXQvcnhycGMvc2VjdXJpdHkuYworKysgYi9uZXQvcnhycGMvc2VjdXJpdHkuYwpAQCAtMTMwLDIwICsxMzAsMjAgQEAKIAl9CiAKIAkvKiBmaW5kIHRoZSBzZXJ2aWNlICovCi0JcmVhZF9sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShyeCwgJmxvY2FsLT5zZXJ2aWNlcywgbGlzdGVuX2xpbmspIHsKLQkJaWYgKHJ4LT5zcnguc3J4X3NlcnZpY2UgPT0gY29ubi0+cGFyYW1zLnNlcnZpY2VfaWQpCi0JCQlnb3RvIGZvdW5kX3NlcnZpY2U7Ci0JfQorCXJlYWRfbG9jaygmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCXJ4ID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChsb2NhbC0+c2VydmljZSwKKwkJCQkgICAgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c2VydmljZXNfbG9jaykpOworCWlmIChyeCAmJiByeC0+c3J4LnNyeF9zZXJ2aWNlID09IGNvbm4tPnBhcmFtcy5zZXJ2aWNlX2lkKQorCQlnb3RvIGZvdW5kX3NlcnZpY2U7CiAKIAkvKiB0aGUgc2VydmljZSBhcHBlYXJzIHRvIGhhdmUgZGllZCAqLwotCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CisJcmVhZF91bmxvY2soJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKIAlfbGVhdmUoIiA9IC1FTk9FTlQiKTsKIAlyZXR1cm4gLUVOT0VOVDsKIAogZm91bmRfc2VydmljZToKIAlpZiAoIXJ4LT5zZWN1cml0aWVzKSB7Ci0JCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CisJCXJlYWRfdW5sb2NrKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CiAJCV9sZWF2ZSgiID0gLUVOT0tFWSIpOwogCQlyZXR1cm4gLUVOT0tFWTsKIAl9CkBAIC0xNTIsMTMgKzE1MiwxMyBAQAogCWtyZWYgPSBrZXlyaW5nX3NlYXJjaChtYWtlX2tleV9yZWYocngtPnNlY3VyaXRpZXMsIDFVTCksCiAJCQkgICAgICAma2V5X3R5cGVfcnhycGNfcywga2Rlc2MpOwogCWlmIChJU19FUlIoa3JlZikpIHsKLQkJcmVhZF91bmxvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwkJcmVhZF91bmxvY2soJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKIAkJX2xlYXZlKCIgPSAlbGQgW3NlYXJjaF0iLCBQVFJfRVJSKGtyZWYpKTsKIAkJcmV0dXJuIFBUUl9FUlIoa3JlZik7CiAJfQogCiAJa2V5ID0ga2V5X3JlZl90b19wdHIoa3JlZik7Ci0JcmVhZF91bmxvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwlyZWFkX3VubG9jaygmbG9jYWwtPnNlcnZpY2VzX2xvY2spOwogCiAJY29ubi0+c2VydmVyX2tleSA9IGtleTsKIAljb25uLT5zZWN1cml0eSA9IHNlYzsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9zZW5kbXNnLmMgYi9uZXQvcnhycGMvc2VuZG1zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMjI1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvc2VuZG1zZy5jCkBAIC0wLDAgKzEsNjA2IEBACisvKiBBRl9SWFJQQyBzZW5kbXNnKCkgaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDE2IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CisjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKKworZW51bSByeHJwY19jb21tYW5kIHsKKwlSWFJQQ19DTURfU0VORF9EQVRBLAkJLyogc2VuZCBkYXRhIG1lc3NhZ2UgKi8KKwlSWFJQQ19DTURfU0VORF9BQk9SVCwJCS8qIHJlcXVlc3QgYWJvcnQgZ2VuZXJhdGlvbiAqLworCVJYUlBDX0NNRF9BQ0NFUFQsCQkvKiBbc2VydmVyXSBhY2NlcHQgaW5jb21pbmcgY2FsbCAqLworCVJYUlBDX0NNRF9SRUpFQ1RfQlVTWSwJCS8qIFtzZXJ2ZXJdIHJlamVjdCBhIGNhbGwgYXMgYnVzeSAqLworfTsKKworLyoKKyAqIHdhaXQgZm9yIHNwYWNlIHRvIGFwcGVhciBpbiB0aGUgdHJhbnNtaXQvQUNLIHdpbmRvdworICogLSBjYWxsZXIgaG9sZHMgdGhlIHNvY2tldCBsb2NrZWQKKyAqLworc3RhdGljIGludCByeHJwY193YWl0X2Zvcl90eF93aW5kb3coc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJCSAgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICAgbG9uZyAqdGltZW8pCit7CisJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKwlpbnQgcmV0OworCisJX2VudGVyKCIseyV1LCV1LCV1fSIsCisJICAgICAgIGNhbGwtPnR4X2hhcmRfYWNrLCBjYWxsLT50eF90b3AsIGNhbGwtPnR4X3dpbnNpemUpOworCisJYWRkX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKKworCWZvciAoOzspIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJcmV0ID0gMDsKKwkJaWYgKGNhbGwtPnR4X3RvcCAtIGNhbGwtPnR4X2hhcmRfYWNrIDwKKwkJICAgIG1pbl90KHVuc2lnbmVkIGludCwgY2FsbC0+dHhfd2luc2l6ZSwKKwkJCSAgY2FsbC0+Y29uZ19jd25kICsgY2FsbC0+Y29uZ19leHRyYSkpCisJCQlicmVhazsKKwkJaWYgKGNhbGwtPnN0YXRlID49IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKKwkJCXJldCA9IC1jYWxsLT5lcnJvcjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0ID0gc29ja19pbnRyX2Vycm5vKCp0aW1lbyk7CisJCQlicmVhazsKKwkJfQorCisJCXRyYWNlX3J4cnBjX3RyYW5zbWl0KGNhbGwsIHJ4cnBjX3RyYW5zbWl0X3dhaXQpOworCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7CisJCSp0aW1lbyA9IHNjaGVkdWxlX3RpbWVvdXQoKnRpbWVvKTsKKwkJbG9ja19zb2NrKCZyeC0+c2spOworCX0KKworCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogU2NoZWR1bGUgYW4gaW5zdGFudCBUeCByZXNlbmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByeHJwY19pbnN0YW50X3Jlc2VuZChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgaW50IGl4KQoreworCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7CisKKwlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7CisJCWNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbaXhdID0gUlhSUENfVFhfQU5OT19SRVRSQU5TOworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9SRVNFTkQsICZjYWxsLT5ldmVudHMpKQorCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwl9CisKKwlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7Cit9CisKKy8qCisgKiBRdWV1ZSBhIERBVEEgcGFja2V0IGZvciB0cmFuc21pc3Npb24sIHNldCB0aGUgcmVzZW5kIHRpbWVvdXQgYW5kIHNlbmQgdGhlCisgKiBwYWNrZXQgaW1tZWRpYXRlbHkKKyAqLworc3RhdGljIHZvaWQgcnhycGNfcXVldWVfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIGJvb2wgbGFzdCkKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CisJcnhycGNfc2VxX3Qgc2VxID0gc3AtPmhkci5zZXE7CisJaW50IHJldCwgaXg7CisJdTggYW5ub3RhdGlvbiA9IFJYUlBDX1RYX0FOTk9fVU5BQ0s7CisKKwlfbmV0KCJxdWV1ZSBza2IgJXAgWyVkXSIsIHNrYiwgc2VxKTsKKworCUFTU0VSVENNUChzZXEsID09LCBjYWxsLT50eF90b3AgKyAxKTsKKworCWlmIChsYXN0KQorCQlhbm5vdGF0aW9uIHw9IFJYUlBDX1RYX0FOTk9fTEFTVDsKKworCS8qIFdlIGhhdmUgdG8gc2V0IHRoZSB0aW1lc3RhbXAgYmVmb3JlIHF1ZXVlaW5nIGFzIHRoZSByZXRyYW5zbWl0CisJICogYWxnb3JpdGhtIGNhbiBzZWUgdGhlIHBhY2tldCBhcyBzb29uIGFzIHdlIHF1ZXVlIGl0LgorCSAqLworCXNrYi0+dHN0YW1wID0ga3RpbWVfZ2V0X3JlYWwoKTsKKworCWl4ID0gc2VxICYgUlhSUENfUlhUWF9CVUZGX01BU0s7CisJcnhycGNfZ2V0X3NrYihza2IsIHJ4cnBjX3NrYl90eF9nb3QpOworCWNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbaXhdID0gYW5ub3RhdGlvbjsKKwlzbXBfd21iKCk7CisJY2FsbC0+cnh0eF9idWZmZXJbaXhdID0gc2tiOworCWNhbGwtPnR4X3RvcCA9IHNlcTsKKwlpZiAobGFzdCkKKwkJdHJhY2VfcnhycGNfdHJhbnNtaXQoY2FsbCwgcnhycGNfdHJhbnNtaXRfcXVldWVfbGFzdCk7CisJZWxzZQorCQl0cmFjZV9yeHJwY190cmFuc21pdChjYWxsLCByeHJwY190cmFuc21pdF9xdWV1ZSk7CisKKwlpZiAobGFzdCB8fCBjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVCkgeworCQlfZGVidWcoIl9fX19fX19fYXdhaXRpbmcgcmVwbHkvQUNLX19fX19fX19fXyIpOworCQl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwkJc3dpdGNoIChjYWxsLT5zdGF0ZSkgeworCQljYXNlIFJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVDoKKwkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFk7CisJCQlicmVhazsKKwkJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVDoKKwkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfU0VORF9SRVBMWTsKKwkJCWlmICghbGFzdCkKKwkJCQlicmVhazsKKwkJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9TRU5EX1JFUExZOgorCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9BV0FJVF9BQ0s7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJfQorCisJaWYgKHNlcSA9PSAxICYmIHJ4cnBjX2lzX2NsaWVudF9jYWxsKGNhbGwpKQorCQlyeHJwY19leHBvc2VfY2xpZW50X2NhbGwoY2FsbCk7CisKKwlyZXQgPSByeHJwY19zZW5kX2RhdGFfcGFja2V0KGNhbGwsIHNrYiwgZmFsc2UpOworCWlmIChyZXQgPCAwKSB7CisJCV9kZWJ1ZygibmVlZCBpbnN0YW50IHJlc2VuZCAlZCIsIHJldCk7CisJCXJ4cnBjX2luc3RhbnRfcmVzZW5kKGNhbGwsIGl4KTsKKwl9IGVsc2UgeworCQlrdGltZV90IG5vdyA9IGt0aW1lX2dldF9yZWFsKCksIHJlc2VuZF9hdDsKKworCQlyZXNlbmRfYXQgPSBrdGltZV9hZGRfbXMobm93LCByeHJwY19yZXNlbmRfdGltZW91dCk7CisKKwkJaWYgKGt0aW1lX2JlZm9yZShyZXNlbmRfYXQsIGNhbGwtPnJlc2VuZF9hdCkpIHsKKwkJCWNhbGwtPnJlc2VuZF9hdCA9IHJlc2VuZF9hdDsKKwkJCXJ4cnBjX3NldF90aW1lcihjYWxsLCByeHJwY190aW1lcl9zZXRfZm9yX3NlbmQsIG5vdyk7CisJCX0KKwl9CisKKwlyeHJwY19mcmVlX3NrYihza2IsIHJ4cnBjX3NrYl90eF9mcmVlZCk7CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIHNlbmQgZGF0YSB0aHJvdWdoIGEgc29ja2V0CisgKiAtIG11c3QgYmUgY2FsbGVkIGluIHByb2Nlc3MgY29udGV4dAorICogLSBjYWxsZXIgaG9sZHMgdGhlIHNvY2tldCBsb2NrZWQKKyAqLworc3RhdGljIGludCByeHJwY19zZW5kX2RhdGEoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBzb2NrICpzayA9ICZyeC0+c2s7CisJbG9uZyB0aW1lbzsKKwlib29sIG1vcmU7CisJaW50IHJldCwgY29waWVkOworCisJdGltZW8gPSBzb2NrX3NuZHRpbWVvKHNrLCBtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCk7CisKKwkvKiB0aGlzIHNob3VsZCBiZSBpbiBwb2xsICovCisJc2tfY2xlYXJfYml0KFNPQ0tXUV9BU1lOQ19OT1NQQUNFLCBzayk7CisKKwlpZiAoc2stPnNrX2VyciB8fCAoc2stPnNrX3NodXRkb3duICYgU0VORF9TSFVURE9XTikpCisJCXJldHVybiAtRVBJUEU7CisKKwltb3JlID0gbXNnLT5tc2dfZmxhZ3MgJiBNU0dfTU9SRTsKKworCXNrYiA9IGNhbGwtPnR4X3BlbmRpbmc7CisJY2FsbC0+dHhfcGVuZGluZyA9IE5VTEw7CisJcnhycGNfc2VlX3NrYihza2IsIHJ4cnBjX3NrYl90eF9zZWVuKTsKKworCWNvcGllZCA9IDA7CisJZG8geworCQkvKiBDaGVjayB0byBzZWUgaWYgdGhlcmUncyBhIHBpbmcgQUNLIHRvIHJlcGx5IHRvLiAqLworCQlpZiAoY2FsbC0+YWNrcl9yZWFzb24gPT0gUlhSUENfQUNLX1BJTkdfUkVTUE9OU0UpCisJCQlyeHJwY19zZW5kX2NhbGxfcGFja2V0KGNhbGwsIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSyk7CisKKwkJaWYgKCFza2IpIHsKKwkJCXNpemVfdCBzaXplLCBjaHVuaywgbWF4LCBzcGFjZTsKKworCQkJX2RlYnVnKCJhbGxvYyIpOworCisJCQlpZiAoY2FsbC0+dHhfdG9wIC0gY2FsbC0+dHhfaGFyZF9hY2sgPj0KKwkJCSAgICBtaW5fdCh1bnNpZ25lZCBpbnQsIGNhbGwtPnR4X3dpbnNpemUsCisJCQkJICBjYWxsLT5jb25nX2N3bmQgKyBjYWxsLT5jb25nX2V4dHJhKSkgeworCQkJCXJldCA9IC1FQUdBSU47CisJCQkJaWYgKG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlUKQorCQkJCQlnb3RvIG1heWJlX2Vycm9yOworCQkJCXJldCA9IHJ4cnBjX3dhaXRfZm9yX3R4X3dpbmRvdyhyeCwgY2FsbCwKKwkJCQkJCQkgICAgICAgJnRpbWVvKTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJZ290byBtYXliZV9lcnJvcjsKKwkJCX0KKworCQkJbWF4ID0gUlhSUENfSlVNQk9fREFUQUxFTjsKKwkJCW1heCAtPSBjYWxsLT5jb25uLT5zZWN1cml0eV9zaXplOworCQkJbWF4ICY9IH4oY2FsbC0+Y29ubi0+c2l6ZV9hbGlnbiAtIDFVTCk7CisKKwkJCWNodW5rID0gbWF4OworCQkJaWYgKGNodW5rID4gbXNnX2RhdGFfbGVmdChtc2cpICYmICFtb3JlKQorCQkJCWNodW5rID0gbXNnX2RhdGFfbGVmdChtc2cpOworCisJCQlzcGFjZSA9IGNodW5rICsgY2FsbC0+Y29ubi0+c2l6ZV9hbGlnbjsKKwkJCXNwYWNlICY9IH4oY2FsbC0+Y29ubi0+c2l6ZV9hbGlnbiAtIDFVTCk7CisKKwkJCXNpemUgPSBzcGFjZSArIGNhbGwtPmNvbm4tPnNlY3VyaXR5X3NpemU7CisKKwkJCV9kZWJ1ZygiU0laRTogJXp1LyV6dS8lenUiLCBjaHVuaywgc3BhY2UsIHNpemUpOworCisJCQkvKiBjcmVhdGUgYSBidWZmZXIgdGhhdCB3ZSBjYW4gcmV0YWluIHVudGlsIGl0J3MgQUNLJ2QgKi8KKwkJCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2IoCisJCQkJc2ssIHNpemUsIG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlULCAmcmV0KTsKKwkJCWlmICghc2tiKQorCQkJCWdvdG8gbWF5YmVfZXJyb3I7CisKKwkJCXJ4cnBjX25ld19za2Ioc2tiLCByeHJwY19za2JfdHhfbmV3KTsKKworCQkJX2RlYnVnKCJBTExPQyBTRU5EICVwIiwgc2tiKTsKKworCQkJQVNTRVJUQ01QKHNrYi0+bWFyaywgPT0sIDApOworCisJCQlfZGVidWcoIkhTOiAldSIsIGNhbGwtPmNvbm4tPnNlY3VyaXR5X3NpemUpOworCQkJc2tiX3Jlc2VydmUoc2tiLCBjYWxsLT5jb25uLT5zZWN1cml0eV9zaXplKTsKKwkJCXNrYi0+bGVuICs9IGNhbGwtPmNvbm4tPnNlY3VyaXR5X3NpemU7CisKKwkJCXNwID0gcnhycGNfc2tiKHNrYik7CisJCQlzcC0+cmVtYWluID0gY2h1bms7CisJCQlpZiAoc3AtPnJlbWFpbiA+IHNrYl90YWlscm9vbShza2IpKQorCQkJCXNwLT5yZW1haW4gPSBza2JfdGFpbHJvb20oc2tiKTsKKworCQkJX25ldCgic2tiOiBociAlZCwgdHIgJWQsIGhsICVkLCBybSAlZCIsCisJCQkgICAgICAgc2tiX2hlYWRyb29tKHNrYiksCisJCQkgICAgICAgc2tiX3RhaWxyb29tKHNrYiksCisJCQkgICAgICAgc2tiX2hlYWRsZW4oc2tiKSwKKwkJCSAgICAgICBzcC0+cmVtYWluKTsKKworCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJfQorCisJCV9kZWJ1ZygiYXBwZW5kIik7CisJCXNwID0gcnhycGNfc2tiKHNrYik7CisKKwkJLyogYXBwZW5kIG5leHQgc2VnbWVudCBvZiBkYXRhIHRvIHRoZSBjdXJyZW50IGJ1ZmZlciAqLworCQlpZiAobXNnX2RhdGFfbGVmdChtc2cpID4gMCkgeworCQkJaW50IGNvcHkgPSBza2JfdGFpbHJvb20oc2tiKTsKKwkJCUFTU0VSVENNUChjb3B5LCA+LCAwKTsKKwkJCWlmIChjb3B5ID4gbXNnX2RhdGFfbGVmdChtc2cpKQorCQkJCWNvcHkgPSBtc2dfZGF0YV9sZWZ0KG1zZyk7CisJCQlpZiAoY29weSA+IHNwLT5yZW1haW4pCisJCQkJY29weSA9IHNwLT5yZW1haW47CisKKwkJCV9kZWJ1ZygiYWRkIik7CisJCQlyZXQgPSBza2JfYWRkX2RhdGEoc2tiLCAmbXNnLT5tc2dfaXRlciwgY29weSk7CisJCQlfZGVidWcoImFkZGVkIik7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIGVmYXVsdDsKKwkJCXNwLT5yZW1haW4gLT0gY29weTsKKwkJCXNrYi0+bWFyayArPSBjb3B5OworCQkJY29waWVkICs9IGNvcHk7CisJCX0KKworCQkvKiBjaGVjayBmb3IgdGhlIGZhciBzaWRlIGFib3J0aW5nIHRoZSBjYWxsIG9yIGEgbmV0d29yayBlcnJvcgorCQkgKiBvY2N1cnJpbmcgKi8KKwkJaWYgKGNhbGwtPnN0YXRlID09IFJYUlBDX0NBTExfQ09NUExFVEUpCisJCQlnb3RvIGNhbGxfdGVybWluYXRlZDsKKworCQkvKiBhZGQgdGhlIHBhY2tldCB0byB0aGUgc2VuZCBxdWV1ZSBpZiBpdCdzIG5vdyBmdWxsICovCisJCWlmIChzcC0+cmVtYWluIDw9IDAgfHwKKwkJICAgIChtc2dfZGF0YV9sZWZ0KG1zZykgPT0gMCAmJiAhbW9yZSkpIHsKKwkJCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gY2FsbC0+Y29ubjsKKwkJCXVpbnQzMl90IHNlcTsKKwkJCXNpemVfdCBwYWQ7CisKKwkJCS8qIHBhZCBvdXQgaWYgd2UncmUgdXNpbmcgc2VjdXJpdHkgKi8KKwkJCWlmIChjb25uLT5zZWN1cml0eV9peCkgeworCQkJCXBhZCA9IGNvbm4tPnNlY3VyaXR5X3NpemUgKyBza2ItPm1hcms7CisJCQkJcGFkID0gY29ubi0+c2l6ZV9hbGlnbiAtIHBhZDsKKwkJCQlwYWQgJj0gY29ubi0+c2l6ZV9hbGlnbiAtIDE7CisJCQkJX2RlYnVnKCJwYWQgJXp1IiwgcGFkKTsKKwkJCQlpZiAocGFkKQorCQkJCQltZW1zZXQoc2tiX3B1dChza2IsIHBhZCksIDAsIHBhZCk7CisJCQl9CisKKwkJCXNlcSA9IGNhbGwtPnR4X3RvcCArIDE7CisKKwkJCXNwLT5oZHIuc2VxCT0gc2VxOworCQkJc3AtPmhkci5fcnN2ZAk9IDA7CisJCQlzcC0+aGRyLmZsYWdzCT0gY29ubi0+b3V0X2NsaWVudGZsYWc7CisKKwkJCWlmIChtc2dfZGF0YV9sZWZ0KG1zZykgPT0gMCAmJiAhbW9yZSkKKwkJCQlzcC0+aGRyLmZsYWdzIHw9IFJYUlBDX0xBU1RfUEFDS0VUOworCQkJZWxzZSBpZiAoY2FsbC0+dHhfdG9wIC0gY2FsbC0+dHhfaGFyZF9hY2sgPAorCQkJCSBjYWxsLT50eF93aW5zaXplKQorCQkJCXNwLT5oZHIuZmxhZ3MgfD0gUlhSUENfTU9SRV9QQUNLRVRTOworCisJCQlyZXQgPSBjb25uLT5zZWN1cml0eS0+c2VjdXJlX3BhY2tldCgKKwkJCQljYWxsLCBza2IsIHNrYi0+bWFyaywgc2tiLT5oZWFkKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gb3V0OworCisJCQlyeHJwY19xdWV1ZV9wYWNrZXQoY2FsbCwgc2tiLCAhbXNnX2RhdGFfbGVmdChtc2cpICYmICFtb3JlKTsKKwkJCXNrYiA9IE5VTEw7CisJCX0KKwl9IHdoaWxlIChtc2dfZGF0YV9sZWZ0KG1zZykgPiAwKTsKKworc3VjY2VzczoKKwlyZXQgPSBjb3BpZWQ7CitvdXQ6CisJY2FsbC0+dHhfcGVuZGluZyA9IHNrYjsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCitjYWxsX3Rlcm1pbmF0ZWQ6CisJcnhycGNfZnJlZV9za2Ioc2tiLCByeHJwY19za2JfdHhfZnJlZWQpOworCV9sZWF2ZSgiID0gJWQiLCAtY2FsbC0+ZXJyb3IpOworCXJldHVybiAtY2FsbC0+ZXJyb3I7CisKK21heWJlX2Vycm9yOgorCWlmIChjb3BpZWQpCisJCWdvdG8gc3VjY2VzczsKKwlnb3RvIG91dDsKKworZWZhdWx0OgorCXJldCA9IC1FRkFVTFQ7CisJZ290byBvdXQ7Cit9CisKKy8qCisgKiBleHRyYWN0IGNvbnRyb2wgbWVzc2FnZXMgZnJvbSB0aGUgc2VuZG1zZygpIGNvbnRyb2wgYnVmZmVyCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfc2VuZG1zZ19jbXNnKHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnVzZXJfY2FsbF9JRCwKKwkJCSAgICAgIGVudW0gcnhycGNfY29tbWFuZCAqY29tbWFuZCwKKwkJCSAgICAgIHUzMiAqYWJvcnRfY29kZSwKKwkJCSAgICAgIGJvb2wgKl9leGNsdXNpdmUpCit7CisJc3RydWN0IGNtc2doZHIgKmNtc2c7CisJYm9vbCBnb3RfdXNlcl9JRCA9IGZhbHNlOworCWludCBsZW47CisKKwkqY29tbWFuZCA9IFJYUlBDX0NNRF9TRU5EX0RBVEE7CisKKwlpZiAobXNnLT5tc2dfY29udHJvbGxlbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvcl9lYWNoX2Ntc2doZHIoY21zZywgbXNnKSB7CisJCWlmICghQ01TR19PSyhtc2csIGNtc2cpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbGVuID0gY21zZy0+Y21zZ19sZW4gLSBDTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgY21zZ2hkcikpOworCQlfZGVidWcoIkNNU0cgJWQsICVkLCAlZCIsCisJCSAgICAgICBjbXNnLT5jbXNnX2xldmVsLCBjbXNnLT5jbXNnX3R5cGUsIGxlbik7CisKKwkJaWYgKGNtc2ctPmNtc2dfbGV2ZWwgIT0gU09MX1JYUlBDKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChjbXNnLT5jbXNnX3R5cGUpIHsKKwkJY2FzZSBSWFJQQ19VU0VSX0NBTExfSUQ6CisJCQlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfQ01TR19DT01QQVQpIHsKKwkJCQlpZiAobGVuICE9IHNpemVvZih1MzIpKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkqdXNlcl9jYWxsX0lEID0gKih1MzIgKikgQ01TR19EQVRBKGNtc2cpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobGVuICE9IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJKnVzZXJfY2FsbF9JRCA9ICoodW5zaWduZWQgbG9uZyAqKQorCQkJCQlDTVNHX0RBVEEoY21zZyk7CisJCQl9CisJCQlfZGVidWcoIlVzZXIgQ2FsbCBJRCAlbHgiLCAqdXNlcl9jYWxsX0lEKTsKKwkJCWdvdF91c2VyX0lEID0gdHJ1ZTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlhSUENfQUJPUlQ6CisJCQlpZiAoKmNvbW1hbmQgIT0gUlhSUENfQ01EX1NFTkRfREFUQSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCSpjb21tYW5kID0gUlhSUENfQ01EX1NFTkRfQUJPUlQ7CisJCQlpZiAobGVuICE9IHNpemVvZigqYWJvcnRfY29kZSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkqYWJvcnRfY29kZSA9ICoodW5zaWduZWQgaW50ICopIENNU0dfREFUQShjbXNnKTsKKwkJCV9kZWJ1ZygiQWJvcnQgJXgiLCAqYWJvcnRfY29kZSk7CisJCQlpZiAoKmFib3J0X2NvZGUgPT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCisJCWNhc2UgUlhSUENfQUNDRVBUOgorCQkJaWYgKCpjb21tYW5kICE9IFJYUlBDX0NNRF9TRU5EX0RBVEEpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkqY29tbWFuZCA9IFJYUlBDX0NNRF9BQ0NFUFQ7CisJCQlpZiAobGVuICE9IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKworCQljYXNlIFJYUlBDX0VYQ0xVU0lWRV9DQUxMOgorCQkJKl9leGNsdXNpdmUgPSB0cnVlOworCQkJaWYgKGxlbiAhPSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmICghZ290X3VzZXJfSUQpCisJCXJldHVybiAtRUlOVkFMOworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfQorCisvKgorICogQ3JlYXRlIGEgbmV3IGNsaWVudCBjYWxsIGZvciBzZW5kbXNnKCkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnhycGNfY2FsbCAqCityeHJwY19uZXdfY2xpZW50X2NhbGxfZm9yX3NlbmRtc2coc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkJICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCwgYm9vbCBleGNsdXNpdmUpCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5fcGFyYW1ldGVycyBjcDsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlzdHJ1Y3Qga2V5ICprZXk7CisKKwlERUNMQVJFX1NPQ0tBRERSKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqLCBzcngsIG1zZy0+bXNnX25hbWUpOworCisJX2VudGVyKCIiKTsKKworCWlmICghbXNnLT5tc2dfbmFtZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVERVNUQUREUlJFUSk7CisKKwlrZXkgPSByeC0+a2V5OworCWlmIChrZXkgJiYgIXJ4LT5rZXktPnBheWxvYWQuZGF0YVswXSkKKwkJa2V5ID0gTlVMTDsKKworCW1lbXNldCgmY3AsIDAsIHNpemVvZihjcCkpOworCWNwLmxvY2FsCQk9IHJ4LT5sb2NhbDsKKwljcC5rZXkJCQk9IHJ4LT5rZXk7CisJY3Auc2VjdXJpdHlfbGV2ZWwJPSByeC0+bWluX3NlY19sZXZlbDsKKwljcC5leGNsdXNpdmUJCT0gcngtPmV4Y2x1c2l2ZSB8IGV4Y2x1c2l2ZTsKKwljcC5zZXJ2aWNlX2lkCQk9IHNyeC0+c3J4X3NlcnZpY2U7CisJY2FsbCA9IHJ4cnBjX25ld19jbGllbnRfY2FsbChyeCwgJmNwLCBzcngsIHVzZXJfY2FsbF9JRCwgR0ZQX0tFUk5FTCk7CisKKwlfbGVhdmUoIiA9ICVwXG4iLCBjYWxsKTsKKwlyZXR1cm4gY2FsbDsKK30KKworLyoKKyAqIHNlbmQgYSBtZXNzYWdlIGZvcm1pbmcgcGFydCBvZiBhIGNsaWVudCBjYWxsIHRocm91Z2ggYW4gUnhSUEMgc29ja2V0CisgKiAtIGNhbGxlciBob2xkcyB0aGUgc29ja2V0IGxvY2tlZAorICogLSB0aGUgc29ja2V0IG1heSBiZSBlaXRoZXIgYSBjbGllbnQgc29ja2V0IG9yIGEgc2VydmVyIHNvY2tldAorICovCitpbnQgcnhycGNfZG9fc2VuZG1zZyhzdHJ1Y3QgcnhycGNfc29jayAqcngsIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwllbnVtIHJ4cnBjX2NvbW1hbmQgY21kOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lEID0gMDsKKwlib29sIGV4Y2x1c2l2ZSA9IGZhbHNlOworCXUzMiBhYm9ydF9jb2RlID0gMDsKKwlpbnQgcmV0OworCisJX2VudGVyKCIiKTsKKworCXJldCA9IHJ4cnBjX3NlbmRtc2dfY21zZyhtc2csICZ1c2VyX2NhbGxfSUQsICZjbWQsICZhYm9ydF9jb2RlLAorCQkJCSAmZXhjbHVzaXZlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChjbWQgPT0gUlhSUENfQ01EX0FDQ0VQVCkgeworCQlpZiAocngtPnNrLnNrX3N0YXRlICE9IFJYUlBDX1NFUlZFUl9MSVNURU5JTkcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FsbCA9IHJ4cnBjX2FjY2VwdF9jYWxsKHJ4LCB1c2VyX2NhbGxfSUQsIE5VTEwpOworCQlpZiAoSVNfRVJSKGNhbGwpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2FsbCk7CisJCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FsbCA9IHJ4cnBjX2ZpbmRfY2FsbF9ieV91c2VyX0lEKHJ4LCB1c2VyX2NhbGxfSUQpOworCWlmICghY2FsbCkgeworCQlpZiAoY21kICE9IFJYUlBDX0NNRF9TRU5EX0RBVEEpCisJCQlyZXR1cm4gLUVCQURTTFQ7CisJCWNhbGwgPSByeHJwY19uZXdfY2xpZW50X2NhbGxfZm9yX3NlbmRtc2cocngsIG1zZywgdXNlcl9jYWxsX0lELAorCQkJCQkJCSBleGNsdXNpdmUpOworCQlpZiAoSVNfRVJSKGNhbGwpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2FsbCk7CisJfQorCisJX2RlYnVnKCJDQUxMICVkIFVTUiAlbHggU1QgJWQgb24gQ09OTiAlcCIsCisJICAgICAgIGNhbGwtPmRlYnVnX2lkLCBjYWxsLT51c2VyX2NhbGxfSUQsIGNhbGwtPnN0YXRlLCBjYWxsLT5jb25uKTsKKworCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7CisJCS8qIGl0J3MgdG9vIGxhdGUgZm9yIHRoaXMgY2FsbCAqLworCQlyZXQgPSAtRVNIVVRET1dOOworCX0gZWxzZSBpZiAoY21kID09IFJYUlBDX0NNRF9TRU5EX0FCT1JUKSB7CisJCXJldCA9IDA7CisJCWlmIChyeHJwY19hYm9ydF9jYWxsKCJDTUQiLCBjYWxsLCAwLCBhYm9ydF9jb2RlLCBFQ09OTkFCT1JURUQpKQorCQkJcmV0ID0gcnhycGNfc2VuZF9jYWxsX3BhY2tldChjYWxsLAorCQkJCQkJICAgICBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVCk7CisJfSBlbHNlIGlmIChjbWQgIT0gUlhSUENfQ01EX1NFTkRfREFUQSkgeworCQlyZXQgPSAtRUlOVkFMOworCX0gZWxzZSBpZiAocnhycGNfaXNfY2xpZW50X2NhbGwoY2FsbCkgJiYKKwkJICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUKSB7CisJCS8qIHJlcXVlc3QgcGhhc2UgY29tcGxldGUgZm9yIHRoaXMgY2xpZW50IGNhbGwgKi8KKwkJcmV0ID0gLUVQUk9UTzsKKwl9IGVsc2UgaWYgKHJ4cnBjX2lzX3NlcnZpY2VfY2FsbChjYWxsKSAmJgorCQkgICBjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVCAmJgorCQkgICBjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX1NFUlZFUl9TRU5EX1JFUExZKSB7CisJCS8qIFJlcGx5IHBoYXNlIG5vdCBiZWd1biBvciBub3QgY29tcGxldGUgZm9yIHNlcnZpY2UgY2FsbC4gKi8KKwkJcmV0ID0gLUVQUk9UTzsKKwl9IGVsc2UgeworCQlyZXQgPSByeHJwY19zZW5kX2RhdGEocngsIGNhbGwsIG1zZywgbGVuKTsKKwl9CisKKwlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiByeHJwY19rZXJuZWxfc2VuZF9kYXRhIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBzZW5kIGRhdGEgb24gYSBjYWxsCisgKiBAc29jazogVGhlIHNvY2tldCB0aGUgY2FsbCBpcyBvbgorICogQGNhbGw6IFRoZSBjYWxsIHRvIHNlbmQgZGF0YSB0aHJvdWdoCisgKiBAbXNnOiBUaGUgZGF0YSB0byBzZW5kCisgKiBAbGVuOiBUaGUgYW1vdW50IG9mIGRhdGEgdG8gc2VuZAorICoKKyAqIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gc2VuZCBkYXRhIG9uIGEgY2FsbC4gIFRoZSBjYWxsIG11c3QgYmUgaW4gYW4gc3RhdGUKKyAqIGFwcHJvcHJpYXRlIHRvIHNlbmRpbmcgZGF0YS4gIE5vIGNvbnRyb2wgZGF0YSBzaG91bGQgYmUgc3VwcGxpZWQgaW4gQG1zZywKKyAqIG5vciBzaG91bGQgYW4gYWRkcmVzcyBiZSBzdXBwbGllZC4gIE1TR19NT1JFIHNob3VsZCBiZSBmbGFnZ2VkIGlmIHRoZXJlJ3MKKyAqIG1vcmUgZGF0YSB0byBjb21lLCBvdGhlcndpc2UgdGhpcyBkYXRhIHdpbGwgZW5kIHRoZSB0cmFuc21pc3Npb24gcGhhc2UuCisgKi8KK2ludCByeHJwY19rZXJuZWxfc2VuZF9kYXRhKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQoreworCWludCByZXQ7CisKKwlfZW50ZXIoInslZCwlc30sIiwgY2FsbC0+ZGVidWdfaWQsIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPnN0YXRlXSk7CisKKwlBU1NFUlRDTVAobXNnLT5tc2dfbmFtZSwgPT0sIE5VTEwpOworCUFTU0VSVENNUChtc2ctPm1zZ19jb250cm9sLCA9PSwgTlVMTCk7CisKKwlsb2NrX3NvY2soc29jay0+c2spOworCisJX2RlYnVnKCJDQUxMICVkIFVTUiAlbHggU1QgJWQgb24gQ09OTiAlcCIsCisJICAgICAgIGNhbGwtPmRlYnVnX2lkLCBjYWxsLT51c2VyX2NhbGxfSUQsIGNhbGwtPnN0YXRlLCBjYWxsLT5jb25uKTsKKworCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7CisJCXJldCA9IC1FU0hVVERPV047IC8qIGl0J3MgdG9vIGxhdGUgZm9yIHRoaXMgY2FsbCAqLworCX0gZWxzZSBpZiAoY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUICYmCisJCSAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfU0VSVkVSX0FDS19SRVFVRVNUICYmCisJCSAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFkpIHsKKwkJcmV0ID0gLUVQUk9UTzsgLyogcmVxdWVzdCBwaGFzZSBjb21wbGV0ZSBmb3IgdGhpcyBjbGllbnQgY2FsbCAqLworCX0gZWxzZSB7CisJCXJldCA9IHJ4cnBjX3NlbmRfZGF0YShyeHJwY19zayhzb2NrLT5zayksIGNhbGwsIG1zZywgbGVuKTsKKwl9CisKKwlyZWxlYXNlX3NvY2soc29jay0+c2spOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEpOworCisvKioKKyAqIHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBhYm9ydCBhIGNhbGwKKyAqIEBzb2NrOiBUaGUgc29ja2V0IHRoZSBjYWxsIGlzIG9uCisgKiBAY2FsbDogVGhlIGNhbGwgdG8gYmUgYWJvcnRlZAorICogQGFib3J0X2NvZGU6IFRoZSBhYm9ydCBjb2RlIHRvIHN0aWNrIGludG8gdGhlIEFCT1JUIHBhY2tldAorICogQGVycm9yOiBMb2NhbCBlcnJvciB2YWx1ZQorICogQHdoeTogMy1jaGFyIHN0cmluZyBpbmRpY2F0aW5nIHdoeS4KKyAqCisgKiBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIGFib3J0IGEgY2FsbCwgaWYgaXQncyBzdGlsbCBpbiBhbiBhYm9ydGFibGUgc3RhdGUuCisgKi8KK3ZvaWQgcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkgICAgIHUzMiBhYm9ydF9jb2RlLCBpbnQgZXJyb3IsIGNvbnN0IGNoYXIgKndoeSkKK3sKKwlfZW50ZXIoInslZH0sJWQsJWQsJXMiLCBjYWxsLT5kZWJ1Z19pZCwgYWJvcnRfY29kZSwgZXJyb3IsIHdoeSk7CisKKwlsb2NrX3NvY2soc29jay0+c2spOworCisJaWYgKHJ4cnBjX2Fib3J0X2NhbGwod2h5LCBjYWxsLCAwLCBhYm9ydF9jb2RlLCBlcnJvcikpCisJCXJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpOworCisJcmVsZWFzZV9zb2NrKHNvY2stPnNrKTsKKwlfbGVhdmUoIiIpOworfQorCitFWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKTsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9za2J1ZmYuYyBiL25ldC9yeHJwYy9za2J1ZmYuYwppbmRleCBlZWUwY2ZkOS4uNjdiMDJjNCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL3NrYnVmZi5jCisrKyBiL25ldC9yeHJwYy9za2J1ZmYuYwpAQCAtMTgsMTIxICsxOCw4MiBAQAogI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgogI2luY2x1ZGUgImFyLWludGVybmFsLmgiCiAKKyNkZWZpbmUgc2VsZWN0X3NrYl9jb3VudChvcCkgKG9wID49IHJ4cnBjX3NrYl90eF9jbGVhbmVkID8gJnJ4cnBjX25fdHhfc2ticyA6ICZyeHJwY19uX3J4X3NrYnMpCisKIC8qCi0gKiBzZXQgdXAgZm9yIHRoZSBBQ0sgYXQgdGhlIGVuZCBvZiB0aGUgcmVjZWl2ZSBwaGFzZSB3aGVuIHdlIGRpc2NhcmQgdGhlIGZpbmFsCi0gKiByZWNlaXZlIHBoYXNlIGRhdGEgcGFja2V0Ci0gKiAtIGNhbGxlZCB3aXRoIHNvZnRpcnFzIGRpc2FibGVkCisgKiBOb3RlIHRoZSBhbGxvY2F0aW9uIG9yIHJlY2VwdGlvbiBvZiBhIHNvY2tldCBidWZmZXIuCiAgKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX3JlcXVlc3RfZmluYWxfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQordm9pZCByeHJwY19uZXdfc2tiKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gcnhycGNfc2tiX3RyYWNlIG9wKQogewotCS8qIHRoZSBjYWxsIG1heSBiZSBhYm9ydGVkIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIEFDSyBpdCAqLwotCXdyaXRlX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCi0Jc3dpdGNoIChjYWxsLT5zdGF0ZSkgewotCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWToKLQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0NMSUVOVF9GSU5BTF9BQ0s7Ci0JCV9kZWJ1ZygicmVxdWVzdCBmaW5hbCBBQ0siKTsKLQotCQkvKiBnZXQgYW4gZXh0cmEgcmVmIG9uIHRoZSBjYWxsIGZvciB0aGUgZmluYWwtQUNLIGdlbmVyYXRvciB0bwotCQkgKiByZWxlYXNlICovCi0JCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwotCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfQUNLX0ZJTkFMLCAmY2FsbC0+ZXZlbnRzKTsKLQkJaWYgKHRyeV90b19kZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKSA+PSAwKQotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFJYUlBDX0NBTExfU0VSVkVSX1JFQ1ZfUkVRVUVTVDoKLQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVDsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQl3cml0ZV91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCWNvbnN0IHZvaWQgKmhlcmUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJaW50IG4gPSBhdG9taWNfaW5jX3JldHVybihzZWxlY3Rfc2tiX2NvdW50KG9wKSk7CisJdHJhY2VfcnhycGNfc2tiKHNrYiwgb3AsIGF0b21pY19yZWFkKCZza2ItPnVzZXJzKSwgbiwgaGVyZSk7CiB9CiAKIC8qCi0gKiBkcm9wIHRoZSBib3R0b20gQUNLIG9mZiBvZiB0aGUgY2FsbCBBQ0sgd2luZG93IGFuZCBhZHZhbmNlIHRoZSB3aW5kb3cKKyAqIE5vdGUgdGhlIHJlLWVtZXJnZW5jZSBvZiBhIHNvY2tldCBidWZmZXIgZnJvbSBhIHF1ZXVlIG9yIGJ1ZmZlci4KICAqLwotc3RhdGljIHZvaWQgcnhycGNfaGFyZF9BQ0tfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwKQordm9pZCByeHJwY19zZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gcnhycGNfc2tiX3RyYWNlIG9wKQogewotCWludCBsb29wOwotCXUzMiBzZXE7Ci0KLQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwotCi0JX2RlYnVnKCJoYXJkIEFDSyAjJXUiLCBzcC0+aGRyLnNlcSk7Ci0KLQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgUlhSUENfQUNLUl9XSU5ET1dfQVNaOyBsb29wKyspIHsKLQkJY2FsbC0+YWNrcl93aW5kb3dbbG9vcF0gPj49IDE7Ci0JCWNhbGwtPmFja3Jfd2luZG93W2xvb3BdIHw9Ci0JCQljYWxsLT5hY2tyX3dpbmRvd1tsb29wICsgMV0gPDwgKEJJVFNfUEVSX0xPTkcgLSAxKTsKKwljb25zdCB2b2lkICpoZXJlID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworCWlmIChza2IpIHsKKwkJaW50IG4gPSBhdG9taWNfcmVhZChzZWxlY3Rfc2tiX2NvdW50KG9wKSk7CisJCXRyYWNlX3J4cnBjX3NrYihza2IsIG9wLCBhdG9taWNfcmVhZCgmc2tiLT51c2VycyksIG4sIGhlcmUpOwogCX0KLQotCXNlcSA9IHNwLT5oZHIuc2VxOwotCUFTU0VSVENNUChzZXEsID09LCBjYWxsLT5yeF9kYXRhX2VhdGVuICsgMSk7Ci0JY2FsbC0+cnhfZGF0YV9lYXRlbiA9IHNlcTsKLQotCWlmIChjYWxsLT5hY2tyX3dpbl90b3AgPCBVSU5UX01BWCkKLQkJY2FsbC0+YWNrcl93aW5fdG9wKys7Ci0KLQlBU1NFUlRJRkNNUChjYWxsLT5zdGF0ZSA8PSBSWFJQQ19DQUxMX0NPTVBMRVRFLAotCQkgICAgY2FsbC0+cnhfZGF0YV9wb3N0LCA+PSwgY2FsbC0+cnhfZGF0YV9yZWN2KTsKLQlBU1NFUlRJRkNNUChjYWxsLT5zdGF0ZSA8PSBSWFJQQ19DQUxMX0NPTVBMRVRFLAotCQkgICAgY2FsbC0+cnhfZGF0YV9yZWN2LCA+PSwgY2FsbC0+cnhfZGF0YV9lYXRlbik7Ci0KLQlpZiAoc3AtPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKSB7Ci0JCXJ4cnBjX3JlcXVlc3RfZmluYWxfQUNLKGNhbGwpOwotCX0gZWxzZSBpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY2FsbC0+YWNrcl9ub3RfaWRsZSkgJiYKLQkJICAgdGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NBTExfVFhfU09GVF9BQ0ssICZjYWxsLT5mbGFncykpIHsKLQkJLyogV2UgcHJldmlvdXNseSBzb2Z0LUFDSydkIHNvbWUgcmVjZWl2ZWQgcGFja2V0cyB0aGF0IGhhdmUgbm93Ci0JCSAqIGJlZW4gY29uc3VtZWQsIHNvIHNlbmQgYSBoYXJkLUFDSyBpZiBubyBtb3JlIHBhY2tldHMgYXJlCi0JCSAqIGltbWVkaWF0ZWx5IGZvcnRoY29taW5nIHRvIGFsbG93IHRoZSB0cmFuc21pdHRlciB0byBmcmVlIHVwCi0JCSAqIGl0cyBUeCBidWZmZXJhZ2UuCi0JCSAqLwotCQlfZGVidWcoInNlbmQgUnggaWRsZSBBQ0siKTsKLQkJX19yeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBSWFJQQ19BQ0tfSURMRSwgc3AtPmhkci5zZXJpYWwsCi0JCQkJICAgIGZhbHNlKTsKLQl9Ci0KLQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CiB9CiAKIC8qCi0gKiBkZXN0cm95IGEgcGFja2V0IHRoYXQgaGFzIGFuIFJ4UlBDIGNvbnRyb2wgYnVmZmVyCi0gKiAtIGFkdmFuY2UgdGhlIGhhcmQtQUNLIHN0YXRlIG9mIHRoZSBwYXJlbnQgY2FsbCAoZG9uZSBoZXJlIGluIGNhc2Ugc29tZXRoaW5nCi0gKiAgIGluIHRoZSBrZXJuZWwgYnlwYXNzZXMgcmVjdm1zZygpIGFuZCBzdGVhbHMgdGhlIHBhY2tldCBkaXJlY3RseSBvZmYgb2YgdGhlCi0gKiAgIHNvY2tldCByZWNlaXZlIHF1ZXVlKQorICogTm90ZSB0aGUgYWRkaXRpb24gb2YgYSByZWYgb24gYSBzb2NrZXQgYnVmZmVyLgogICovCi12b2lkIHJ4cnBjX3BhY2tldF9kZXN0cnVjdG9yKHN0cnVjdCBza19idWZmICpza2IpCit2b2lkIHJ4cnBjX2dldF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSByeHJwY19za2JfdHJhY2Ugb3ApCiB7Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOwotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gc3AtPmNhbGw7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpbnQgbiA9IGF0b21pY19pbmNfcmV0dXJuKHNlbGVjdF9za2JfY291bnQob3ApKTsKKwl0cmFjZV9yeHJwY19za2Ioc2tiLCBvcCwgYXRvbWljX3JlYWQoJnNrYi0+dXNlcnMpLCBuLCBoZXJlKTsKKwlza2JfZ2V0KHNrYik7Cit9CiAKLQlfZW50ZXIoIiVweyVwfSIsIHNrYiwgY2FsbCk7Ci0KLQlpZiAoY2FsbCkgewotCQkvKiBzZW5kIHRoZSBmaW5hbCBBQ0sgb24gYSBjbGllbnQgY2FsbCAqLwotCQlpZiAoc3AtPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEpCi0JCQlyeHJwY19oYXJkX0FDS19kYXRhKGNhbGwsIHNwKTsKLQkJcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JCXNwLT5jYWxsID0gTlVMTDsKKy8qCisgKiBOb3RlIHRoZSBkZXN0cnVjdGlvbiBvZiBhIHNvY2tldCBidWZmZXIuCisgKi8KK3ZvaWQgcnhycGNfZnJlZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSByeHJwY19za2JfdHJhY2Ugb3ApCit7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpZiAoc2tiKSB7CisJCWludCBuOworCQlDSEVDS19TTEFCX09LQVkoJnNrYi0+dXNlcnMpOworCQluID0gYXRvbWljX2RlY19yZXR1cm4oc2VsZWN0X3NrYl9jb3VudChvcCkpOworCQl0cmFjZV9yeHJwY19za2Ioc2tiLCBvcCwgYXRvbWljX3JlYWQoJnNrYi0+dXNlcnMpLCBuLCBoZXJlKTsKKwkJa2ZyZWVfc2tiKHNrYik7CiAJfQotCi0JaWYgKHNrYi0+c2spCi0JCXNvY2tfcmZyZWUoc2tiKTsKLQlfbGVhdmUoIiIpOwogfQogCi0vKioKLSAqIHJ4cnBjX2tlcm5lbF9mcmVlX3NrYiAtIEZyZWUgYW4gUnhSUEMgc29ja2V0IGJ1ZmZlcgotICogQHNrYjogVGhlIHNvY2tldCBidWZmZXIgdG8gYmUgZnJlZWQKLSAqCi0gKiBMZXQgUnhSUEMgZnJlZSBpdHMgb3duIHNvY2tldCBidWZmZXIsIHBlcm1pdHRpbmcgaXQgdG8gbWFpbnRhaW4gZGVidWcKLSAqIGFjY291bnRpbmcuCisvKgorICogTm90ZSB0aGUgaW5qZWN0ZWQgbG9zcyBvZiBhIHNvY2tldCBidWZmZXIuCiAgKi8KLXZvaWQgcnhycGNfa2VybmVsX2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IpCit2b2lkIHJ4cnBjX2xvc2Vfc2tiKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gcnhycGNfc2tiX3RyYWNlIG9wKQogewotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpZiAoc2tiKSB7CisJCWludCBuOworCQlDSEVDS19TTEFCX09LQVkoJnNrYi0+dXNlcnMpOworCQluID0gYXRvbWljX2RlY19yZXR1cm4oc2VsZWN0X3NrYl9jb3VudChvcCkpOworCQl0cmFjZV9yeHJwY19za2Ioc2tiLCBvcCwgYXRvbWljX3JlYWQoJnNrYi0+dXNlcnMpLCBuLCBoZXJlKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQogfQotRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfZnJlZV9za2IpOworCisvKgorICogQ2xlYXIgYSBxdWV1ZSBvZiBzb2NrZXQgYnVmZmVycy4KKyAqLwordm9pZCByeHJwY19wdXJnZV9xdWV1ZShzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQoreworCWNvbnN0IHZvaWQgKmhlcmUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKChsaXN0KSkpICE9IE5VTEwpIHsKKwkJaW50IG4gPSBhdG9taWNfZGVjX3JldHVybihzZWxlY3Rfc2tiX2NvdW50KHJ4cnBjX3NrYl9yeF9wdXJnZWQpKTsKKwkJdHJhY2VfcnhycGNfc2tiKHNrYiwgcnhycGNfc2tiX3J4X3B1cmdlZCwKKwkJCQlhdG9taWNfcmVhZCgmc2tiLT51c2VycyksIG4sIGhlcmUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvc3lzY3RsLmMgYi9uZXQvcnhycGMvc3lzY3RsLmMKaW5kZXggMDNhZDA4Ny4uMzRjNzA2ZCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL3N5c2N0bC5jCisrKyBiL25ldC9yeHJwYy9zeXNjdGwuYwpAQCAtMjAsNyArMjAsNyBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBmb3VyID0gNDsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdGhpcnR5dHdvID0gMzI7CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5fNjU1MzUgPSA2NTUzNTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbl9tYXhfYWNrcyA9IFJYUlBDX01BWEFDS1M7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5fbWF4X2Fja3MgPSBSWFJQQ19SWFRYX0JVRkZfU0laRSAtIDE7CiAKIC8qCiAgKiBSeFJQQyBvcGVyYXRpbmcgcGFyYW1ldGVycy4KQEAgLTM1LDcgKzM1LDcgQEAKIAkJLmRhdGEJCT0gJnJ4cnBjX3JlcXVlc3RlZF9hY2tfZGVsYXksCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCQkuZXh0cmExCQk9ICh2b2lkICopJnplcm8sCiAJfSwKIAl7CkBAIC00Myw3ICs0Myw3IEBACiAJCS5kYXRhCQk9ICZyeHJwY19zb2Z0X2Fja19kZWxheSwKIAkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKIAkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbXNfamlmZmllcywKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCiAJCS5leHRyYTEJCT0gKHZvaWQgKikmb25lLAogCX0sCiAJewpAQCAtNTEsNyArNTEsNyBAQAogCQkuZGF0YQkJPSAmcnhycGNfaWRsZV9hY2tfZGVsYXksCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCQkuZXh0cmExCQk9ICh2b2lkICopJm9uZSwKIAl9LAogCXsKQEAgLTU5LDYgKzU5LDIyIEBACiAJCS5kYXRhCQk9ICZyeHJwY19yZXNlbmRfdGltZW91dCwKIAkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKIAkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCisJCS5leHRyYTEJCT0gKHZvaWQgKikmb25lLAorCX0sCisJeworCQkucHJvY25hbWUJPSAiaWRsZV9jb25uX2V4cGlyeSIsCisJCS5kYXRhCQk9ICZyeHJwY19jb25uX2lkbGVfY2xpZW50X2V4cGlyeSwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbXNfamlmZmllcywKKwkJLmV4dHJhMQkJPSAodm9pZCAqKSZvbmUsCisJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJpZGxlX2Nvbm5fZmFzdF9leHBpcnkiLAorCQkuZGF0YQkJPSAmcnhycGNfY29ubl9pZGxlX2NsaWVudF9mYXN0X2V4cGlyeSwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbXNfamlmZmllcywKIAkJLmV4dHJhMQkJPSAodm9pZCAqKSZvbmUsCiAJfSwKQEAgLTY5LDMwICs4NSwyOSBAQAogCQkuZGF0YQkJPSAmcnhycGNfbWF4X2NhbGxfbGlmZXRpbWUsCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JCS5leHRyYTEJCT0gKHZvaWQgKikmb25lLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiZGVhZF9jYWxsX2V4cGlyeSIsCi0JCS5kYXRhCQk9ICZyeHJwY19kZWFkX2NhbGxfZXhwaXJ5LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAotCQkuZXh0cmExCQk9ICh2b2lkICopJm9uZSwKLQl9LAotCi0JLyogVmFsdWVzIG1lYXN1cmVkIGluIHNlY29uZHMgKi8KLQl7Ci0JCS5wcm9jbmFtZQk9ICJjb25uZWN0aW9uX2V4cGlyeSIsCi0JCS5kYXRhCQk9ICZyeHJwY19jb25uZWN0aW9uX2V4cGlyeSwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKIAkJLmV4dHJhMQkJPSAodm9pZCAqKSZvbmUsCiAJfSwKIAogCS8qIE5vbi10aW1lIHZhbHVlcyAqLwogCXsKKwkJLnByb2NuYW1lCT0gIm1heF9jbGllbnRfY29ubnMiLAorCQkuZGF0YQkJPSAmcnhycGNfbWF4X2NsaWVudF9jb25uZWN0aW9ucywKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuZXh0cmExCQk9ICh2b2lkICopJnJ4cnBjX3JlYXBfY2xpZW50X2Nvbm5lY3Rpb25zLAorCX0sCisJeworCQkucHJvY25hbWUJPSAicmVhcF9jbGllbnRfY29ubnMiLAorCQkuZGF0YQkJPSAmcnhycGNfcmVhcF9jbGllbnRfY29ubmVjdGlvbnMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLmV4dHJhMQkJPSAodm9pZCAqKSZvbmUsCisJCS5leHRyYTIJCT0gKHZvaWQgKikmcnhycGNfbWF4X2NsaWVudF9jb25uZWN0aW9ucywKKwl9LAorCXsKIAkJLnByb2NuYW1lCT0gIm1heF9iYWNrbG9nIiwKIAkJLmRhdGEJCT0gJnJ4cnBjX21heF9iYWNrbG9nLAogCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLApkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3V0aWxzLmMgYi9uZXQvcnhycGMvdXRpbHMuYwppbmRleCBiODg5MTRkLi5mZjdhZjcxIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvdXRpbHMuYworKysgYi9uZXQvcnhycGMvdXRpbHMuYwpAQCAtMzAsNiArMzAsNyBAQAogCQlzcngtPnRyYW5zcG9ydC5zaW4uc2luX2FkZHIuc19hZGRyID0gaXBfaGRyKHNrYiktPnNhZGRyOwogCQlyZXR1cm4gMDsKIAorI2lmZGVmIENPTkZJR19BRl9SWFJQQ19JUFY2CiAJY2FzZSBFVEhfUF9JUFY2OgogCQlzcngtPnRyYW5zcG9ydF90eXBlID0gU09DS19ER1JBTTsKIAkJc3J4LT50cmFuc3BvcnRfbGVuID0gc2l6ZW9mKHNyeC0+dHJhbnNwb3J0LnNpbjYpOwpAQCAtMzcsNiArMzgsNyBAQAogCQlzcngtPnRyYW5zcG9ydC5zaW42LnNpbjZfcG9ydCA9IHVkcF9oZHIoc2tiKS0+c291cmNlOwogCQlzcngtPnRyYW5zcG9ydC5zaW42LnNpbjZfYWRkciA9IGlwdjZfaGRyKHNrYiktPnNhZGRyOwogCQlyZXR1cm4gMDsKKyNlbmRpZgogCiAJZGVmYXVsdDoKIAkJcHJfd2Fybl9yYXRlbGltaXRlZCgiQUZfUlhSUEM6IFVua25vd24gZXRoIHByb3RvY29sICV1XG4iLApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL0tjb25maWcgYi9uZXQvc2NoZWQvS2NvbmZpZwppbmRleCBjY2Y5MzFiLi44Nzk1NmE3IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvS2NvbmZpZworKysgYi9uZXQvc2NoZWQvS2NvbmZpZwpAQCAtNzQ5LDYgKzc0OSwxNyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFjdF9jb25ubWFyay4KIAorY29uZmlnIE5FVF9BQ1RfU0tCTU9ECisgICAgICAgIHRyaXN0YXRlICJza2IgZGF0YSBtb2RpZmljYXRpb24gYWN0aW9uIgorICAgICAgICBkZXBlbmRzIG9uIE5FVF9DTFNfQUNUCisgICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgIFNheSBZIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIHNrYiBkYXRhCisKKyAgICAgICAgIElmIHVuc3VyZSwgc2F5IE4uCisKKyAgICAgICAgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKyAgICAgICAgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhY3Rfc2tibW9kLgorCiBjb25maWcgTkVUX0FDVF9JRkUKICAgICAgICAgdHJpc3RhdGUgIkludGVyLUZFIGFjdGlvbiBiYXNlZCBvbiBJRVRGIEZvckNFUyBJbnRlckZFIExGQiIKICAgICAgICAgZGVwZW5kcyBvbiBORVRfQ0xTX0FDVApAQCAtNzYxLDYgKzc3MiwxNyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFjdF9pZmUuCiAKK2NvbmZpZyBORVRfQUNUX1RVTk5FTF9LRVkKKyAgICAgICAgdHJpc3RhdGUgIklQIHR1bm5lbCBtZXRhZGF0YSBtYW5pcHVsYXRpb24iCisgICAgICAgIGRlcGVuZHMgb24gTkVUX0NMU19BQ1QKKyAgICAgICAgLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBzZXQvcmVsZWFzZSBpcCB0dW5uZWwgbWV0YWRhdGEuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhY3RfdHVubmVsX2tleS4KKwogY29uZmlnIE5FVF9JRkVfU0tCTUFSSwogICAgICAgICB0cmlzdGF0ZSAiU3VwcG9ydCB0byBlbmNvZGluZyBkZWNvZGluZyBza2IgbWFyayBvbiBJRkUgYWN0aW9uIgogICAgICAgICBkZXBlbmRzIG9uIE5FVF9BQ1RfSUZFCkBAIC03NzEsNiArNzkzLDExIEBACiAgICAgICAgIGRlcGVuZHMgb24gTkVUX0FDVF9JRkUKICAgICAgICAgLS0taGVscC0tLQogCitjb25maWcgTkVUX0lGRV9TS0JUQ0lOREVYCisgICAgICAgIHRyaXN0YXRlICJTdXBwb3J0IHRvIGVuY29kaW5nIGRlY29kaW5nIHNrYiB0Y2luZGV4IG9uIElGRSBhY3Rpb24iCisgICAgICAgIGRlcGVuZHMgb24gTkVUX0FDVF9JRkUKKyAgICAgICAgLS0taGVscC0tLQorCiBjb25maWcgTkVUX0NMU19JTkQKIAlib29sICJJbmNvbWluZyBkZXZpY2UgY2xhc3NpZmljYXRpb24iCiAJZGVwZW5kcyBvbiBORVRfQ0xTX1UzMiB8fCBORVRfQ0xTX0ZXCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvTWFrZWZpbGUgYi9uZXQvc2NoZWQvTWFrZWZpbGUKaW5kZXggYWUwODhhNS4uNGJkZGEzNiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL01ha2VmaWxlCisrKyBiL25ldC9zY2hlZC9NYWtlZmlsZQpAQCAtMTksOSArMTksMTIgQEAKIG9iai0kKENPTkZJR19ORVRfQUNUX1ZMQU4pCSs9IGFjdF92bGFuLm8KIG9iai0kKENPTkZJR19ORVRfQUNUX0JQRikJKz0gYWN0X2JwZi5vCiBvYmotJChDT05GSUdfTkVUX0FDVF9DT05OTUFSSykJKz0gYWN0X2Nvbm5tYXJrLm8KK29iai0kKENPTkZJR19ORVRfQUNUX1NLQk1PRCkJKz0gYWN0X3NrYm1vZC5vCiBvYmotJChDT05GSUdfTkVUX0FDVF9JRkUpCSs9IGFjdF9pZmUubwogb2JqLSQoQ09ORklHX05FVF9JRkVfU0tCTUFSSykJKz0gYWN0X21ldGFfbWFyay5vCiBvYmotJChDT05GSUdfTkVUX0lGRV9TS0JQUklPKQkrPSBhY3RfbWV0YV9za2JwcmlvLm8KK29iai0kKENPTkZJR19ORVRfSUZFX1NLQlRDSU5ERVgpCSs9IGFjdF9tZXRhX3NrYnRjaW5kZXgubworb2JqLSQoQ09ORklHX05FVF9BQ1RfVFVOTkVMX0tFWSkrPSBhY3RfdHVubmVsX2tleS5vCiBvYmotJChDT05GSUdfTkVUX1NDSF9GSUZPKQkrPSBzY2hfZmlmby5vCiBvYmotJChDT05GSUdfTkVUX1NDSF9DQlEpCSs9IHNjaF9jYnEubwogb2JqLSQoQ09ORklHX05FVF9TQ0hfSFRCKQkrPSBzY2hfaHRiLm8KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfYXBpLmMgYi9uZXQvc2NoZWQvYWN0X2FwaS5jCmluZGV4IGU0YTVmMjYuLmM5MTAyMTcgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfYXBpLmMKKysrIGIvbmV0L3NjaGVkL2FjdF9hcGkuYwpAQCAtNjQsNyArNjQsNiBAQAogCQlpZiAocC0+dGNmYV9iaW5kY250IDw9IDAgJiYgcC0+dGNmYV9yZWZjbnQgPD0gMCkgewogCQkJaWYgKHAtPm9wcy0+Y2xlYW51cCkKIAkJCQlwLT5vcHMtPmNsZWFudXAocCwgYmluZCk7Ci0JCQlsaXN0X2RlbCgmcC0+bGlzdCk7CiAJCQl0Y2ZfaGFzaF9kZXN0cm95KHAtPmhpbmZvLCBwKTsKIAkJCXJldCA9IEFDVF9QX0RFTEVURUQ7CiAJCX0KQEAgLTQyMSwxOCArNDIwLDE5IEBACiAJcmV0dXJuIHJlczsKIH0KIAotaW50IHRjZl9hY3Rpb25fZXhlYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICphY3Rpb25zLAotCQkgICAgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKK2ludCB0Y2ZfYWN0aW9uX2V4ZWMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqKmFjdGlvbnMsCisJCSAgICBpbnQgbnJfYWN0aW9ucywgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKIHsKLQljb25zdCBzdHJ1Y3QgdGNfYWN0aW9uICphOwotCWludCByZXQgPSAtMTsKKwlpbnQgcmV0ID0gLTEsIGk7CiAKIAlpZiAoc2tiLT50Y192ZXJkICYgVENfTkNMUykgewogCQlza2ItPnRjX3ZlcmQgPSBDTFJfVENfTkNMUyhza2ItPnRjX3ZlcmQpOwogCQlyZXQgPSBUQ19BQ1RfT0s7CiAJCWdvdG8gZXhlY19kb25lOwogCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGEsIGFjdGlvbnMsIGxpc3QpIHsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfYWN0aW9uczsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEgPSBhY3Rpb25zW2ldOworCiByZXBlYXQ6CiAJCXJldCA9IGEtPm9wcy0+YWN0KHNrYiwgYSwgcmVzKTsKIAkJaWYgKHJldCA9PSBUQ19BQ1RfUkVQRUFUKQpAQCAtNTkyLDkgKzU5MiwxOSBAQAogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKLWludCB0Y2ZfYWN0aW9uX2luaXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmxhdHRyICpubGEsCi0JCQkJICBzdHJ1Y3QgbmxhdHRyICplc3QsIGNoYXIgKm5hbWUsIGludCBvdnIsCi0JCQkJICBpbnQgYmluZCwgc3RydWN0IGxpc3RfaGVhZCAqYWN0aW9ucykKK3N0YXRpYyB2b2lkIGNsZWFudXBfYShzdHJ1Y3QgbGlzdF9oZWFkICphY3Rpb25zLCBpbnQgb3ZyKQoreworCXN0cnVjdCB0Y19hY3Rpb24gKmE7CisKKwlpZiAoIW92cikKKwkJcmV0dXJuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhLCBhY3Rpb25zLCBsaXN0KQorCQlhLT50Y2ZhX3JlZmNudC0tOworfQorCitpbnQgdGNmX2FjdGlvbl9pbml0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5sYXR0ciAqbmxhLCBzdHJ1Y3QgbmxhdHRyICplc3QsCisJCSAgICBjaGFyICpuYW1lLCBpbnQgb3ZyLCBpbnQgYmluZCwgc3RydWN0IGxpc3RfaGVhZCAqYWN0aW9ucykKIHsKIAlzdHJ1Y3QgbmxhdHRyICp0YltUQ0FfQUNUX01BWF9QUklPICsgMV07CiAJc3RydWN0IHRjX2FjdGlvbiAqYWN0OwpAQCAtNjEyLDggKzYyMiwxNSBAQAogCQkJZ290byBlcnI7CiAJCX0KIAkJYWN0LT5vcmRlciA9IGk7CisJCWlmIChvdnIpCisJCQlhY3QtPnRjZmFfcmVmY250Kys7CiAJCWxpc3RfYWRkX3RhaWwoJmFjdC0+bGlzdCwgYWN0aW9ucyk7CiAJfQorCisJLyogUmVtb3ZlIHRoZSB0ZW1wIHJlZmNudCB3aGljaCB3YXMgbmVjZXNzYXJ5IHRvIHByb3RlY3QgYWdhaW5zdAorCSAqIGRlc3Ryb3lpbmcgYW4gZXhpc3RpbmcgYWN0aW9uIHdoaWNoIHdhcyBiZWluZyByZXBsYWNlZAorCSAqLworCWNsZWFudXBfYShhY3Rpb25zLCBvdnIpOwogCXJldHVybiAwOwogCiBlcnI6CkBAIC03NTQsMTYgKzc3MSw2IEBACiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIAotc3RhdGljIHZvaWQgY2xlYW51cF9hKHN0cnVjdCBsaXN0X2hlYWQgKmFjdGlvbnMpCi17Ci0Jc3RydWN0IHRjX2FjdGlvbiAqYSwgKnRtcDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhLCB0bXAsIGFjdGlvbnMsIGxpc3QpIHsKLQkJbGlzdF9kZWwoJmEtPmxpc3QpOwotCQlrZnJlZShhKTsKLQl9Ci19Ci0KIHN0YXRpYyBpbnQgdGNhX2FjdGlvbl9mbHVzaChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBubGF0dHIgKm5sYSwKIAkJCSAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHUzMiBwb3J0aWQpCiB7CkBAIC04OTMsNiArOTAwLDggQEAKIAkJCWdvdG8gZXJyOwogCQl9CiAJCWFjdC0+b3JkZXIgPSBpOworCQlpZiAoZXZlbnQgPT0gUlRNX0dFVEFDVElPTikKKwkJCWFjdC0+dGNmYV9yZWZjbnQrKzsKIAkJbGlzdF9hZGRfdGFpbCgmYWN0LT5saXN0LCAmYWN0aW9ucyk7CiAJfQogCkBAIC05MDUsNyArOTE0LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiBlcnI6Ci0JY2xlYW51cF9hKCZhY3Rpb25zKTsKKwl0Y2ZfYWN0aW9uX2Rlc3Ryb3koJmFjdGlvbnMsIDApOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTkzMywyNCArOTQyLDE3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludAotdGNmX2FjdGlvbl9hZGQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmxhdHRyICpubGEsIHN0cnVjdCBubG1zZ2hkciAqbiwKLQkgICAgICAgdTMyIHBvcnRpZCwgaW50IG92cikKK3N0YXRpYyBpbnQgdGNmX2FjdGlvbl9hZGQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmxhdHRyICpubGEsCisJCQkgIHN0cnVjdCBubG1zZ2hkciAqbiwgdTMyIHBvcnRpZCwgaW50IG92cikKIHsKIAlpbnQgcmV0ID0gMDsKIAlMSVNUX0hFQUQoYWN0aW9ucyk7CiAKIAlyZXQgPSB0Y2ZfYWN0aW9uX2luaXQobmV0LCBubGEsIE5VTEwsIE5VTEwsIG92ciwgMCwgJmFjdGlvbnMpOwogCWlmIChyZXQpCi0JCWdvdG8gZG9uZTsKKwkJcmV0dXJuIHJldDsKIAotCS8qIGR1bXAgdGhlbiBmcmVlIGFsbCB0aGUgYWN0aW9ucyBhZnRlciB1cGRhdGU7IGluc2VydGVkIHBvbGljeQotCSAqIHN0YXlzIGludGFjdAotCSAqLwotCXJldCA9IHRjZl9hZGRfbm90aWZ5KG5ldCwgbiwgJmFjdGlvbnMsIHBvcnRpZCk7Ci0JY2xlYW51cF9hKCZhY3Rpb25zKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gdGNmX2FkZF9ub3RpZnkobmV0LCBuLCAmYWN0aW9ucywgcG9ydGlkKTsKIH0KIAogc3RhdGljIGludCB0Y19jdGxfYWN0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbikKQEAgLTEwMDQsOCArMTAwNiw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBubGF0dHIgKgotZmluZF9kdW1wX2tpbmQoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpuKQorc3RhdGljIHN0cnVjdCBubGF0dHIgKmZpbmRfZHVtcF9raW5kKGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbikKIHsKIAlzdHJ1Y3QgbmxhdHRyICp0YjEsICp0YjJbVENBX0FDVF9NQVggKyAxXTsKIAlzdHJ1Y3QgbmxhdHRyICp0YltUQ0FfQUNUX01BWF9QUklPICsgMV07CkBAIC0xMDMyLDggKzEwMzMsNyBAQAogCXJldHVybiBraW5kOwogfQogCi1zdGF0aWMgaW50Ci10Y19kdW1wX2FjdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCitzdGF0aWMgaW50IHRjX2R1bXBfYWN0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfYnBmLmMgYi9uZXQvc2NoZWQvYWN0X2JwZi5jCmluZGV4IGJmYTg3MDcuLjFkMzk2MDAgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfYnBmLmMKKysrIGIvbmV0L3NjaGVkL2FjdF9icGYuYwpAQCAtMzksMTMgKzM5LDEwIEBACiBzdGF0aWMgaW50IHRjZl9icGYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRjX2FjdGlvbiAqYWN0LAogCQkgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQogeworCWJvb2wgYXRfaW5ncmVzcyA9IHNrYl9hdF90Y19pbmdyZXNzKHNrYik7CiAJc3RydWN0IHRjZl9icGYgKnByb2cgPSB0b19icGYoYWN0KTsKIAlzdHJ1Y3QgYnBmX3Byb2cgKmZpbHRlcjsKIAlpbnQgYWN0aW9uLCBmaWx0ZXJfcmVzOwotCWJvb2wgYXRfaW5ncmVzcyA9IEdfVENfQVQoc2tiLT50Y192ZXJkKSAmIEFUX0lOR1JFU1M7Ci0KLQlpZiAodW5saWtlbHkoIXNrYl9tYWNfaGVhZGVyX3dhc19zZXQoc2tiKSkpCi0JCXJldHVybiBUQ19BQ1RfVU5TUEVDOwogCiAJdGNmX2xhc3R1c2VfdXBkYXRlKCZwcm9nLT50Y2ZfdG0pOwogCWJzdGF0c19jcHVfdXBkYXRlKHRoaXNfY3B1X3B0cihwcm9nLT5jb21tb24uY3B1X2JzdGF0cyksIHNrYik7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X2NzdW0uYyBiL25ldC9zY2hlZC9hY3RfY3N1bS5jCmluZGV4IGI1ZGJmNjMuLmUwZGVmY2UgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfY3N1bS5jCisrKyBiL25ldC9zY2hlZC9hY3RfY3N1bS5jCkBAIC0xMTYsOCArMTE2LDggQEAKIAkJcmV0dXJuICh2b2lkICopKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgaWhsKTsKIH0KIAotc3RhdGljIGludCB0Y2ZfY3N1bV9pcHY0X2ljbXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBpaGwsIHVuc2lnbmVkIGludCBpcGwpCitzdGF0aWMgaW50IHRjZl9jc3VtX2lwdjRfaWNtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaWhsLAorCQkJICAgICAgdW5zaWduZWQgaW50IGlwbCkKIHsKIAlzdHJ1Y3QgaWNtcGhkciAqaWNtcGg7CiAKQEAgLTE1Miw4ICsxNTIsOCBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IHRjZl9jc3VtX2lwdjZfaWNtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgdW5zaWduZWQgaW50IGlobCwgdW5zaWduZWQgaW50IGlwbCkKK3N0YXRpYyBpbnQgdGNmX2NzdW1faXB2Nl9pY21wKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBpaGwsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgaXBsKQogewogCXN0cnVjdCBpY21wNmhkciAqaWNtcDZoOwogCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcDZoOwpAQCAtMTc0LDggKzE3NCw4IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgdGNmX2NzdW1faXB2NF90Y3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgdW5zaWduZWQgaW50IGlobCwgdW5zaWduZWQgaW50IGlwbCkKK3N0YXRpYyBpbnQgdGNmX2NzdW1faXB2NF90Y3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGlobCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGlwbCkKIHsKIAlzdHJ1Y3QgdGNwaGRyICp0Y3BoOwogCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoOwpAQCAtMTk1LDggKzE5NSw4IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgdGNmX2NzdW1faXB2Nl90Y3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgdW5zaWduZWQgaW50IGlobCwgdW5zaWduZWQgaW50IGlwbCkKK3N0YXRpYyBpbnQgdGNmX2NzdW1faXB2Nl90Y3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGlobCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGlwbCkKIHsKIAlzdHJ1Y3QgdGNwaGRyICp0Y3BoOwogCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcDZoOwpAQCAtMjE3LDggKzIxNyw4IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgdGNmX2NzdW1faXB2NF91ZHAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgdW5zaWduZWQgaW50IGlobCwgdW5zaWduZWQgaW50IGlwbCwgaW50IHVkcGxpdGUpCitzdGF0aWMgaW50IHRjZl9jc3VtX2lwdjRfdWRwKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBpaGwsCisJCQkgICAgIHVuc2lnbmVkIGludCBpcGwsIGludCB1ZHBsaXRlKQogewogCXN0cnVjdCB1ZHBoZHIgKnVkcGg7CiAJY29uc3Qgc3RydWN0IGlwaGRyICppcGg7CkBAIC0yNzAsOCArMjcwLDggQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCB0Y2ZfY3N1bV9pcHY2X3VkcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICB1bnNpZ25lZCBpbnQgaWhsLCB1bnNpZ25lZCBpbnQgaXBsLCBpbnQgdWRwbGl0ZSkKK3N0YXRpYyBpbnQgdGNmX2NzdW1faXB2Nl91ZHAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGlobCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGlwbCwgaW50IHVkcGxpdGUpCiB7CiAJc3RydWN0IHVkcGhkciAqdWRwaDsKIAljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXA2aDsKQEAgLTM4MCw4ICszODAsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRjZl9jc3VtX2lwdjZfaG9wb3B0cyhzdHJ1Y3QgaXB2Nl9vcHRfaGRyICppcDZ4aCwKLQkJCQkgdW5zaWduZWQgaW50IGl4aGwsIHVuc2lnbmVkIGludCAqcGwpCitzdGF0aWMgaW50IHRjZl9jc3VtX2lwdjZfaG9wb3B0cyhzdHJ1Y3QgaXB2Nl9vcHRfaGRyICppcDZ4aCwgdW5zaWduZWQgaW50IGl4aGwsCisJCQkJIHVuc2lnbmVkIGludCAqcGwpCiB7CiAJaW50IG9mZiwgbGVuLCBvcHRsZW47CiAJdW5zaWduZWQgY2hhciAqeGggPSAodm9pZCAqKWlwNnhoOwpAQCAtNDk0LDggKzQ5NCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdGNmX2NzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgIGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEsIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCitzdGF0aWMgaW50IHRjZl9jc3VtKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEsCisJCSAgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQogewogCXN0cnVjdCB0Y2ZfY3N1bSAqcCA9IHRvX3RjZl9jc3VtKGEpOwogCWludCBhY3Rpb247CkBAIC01MzEsOCArNTMxLDggQEAKIAlyZXR1cm4gVENfQUNUX1NIT1Q7CiB9CiAKLXN0YXRpYyBpbnQgdGNmX2NzdW1fZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLCBpbnQgcmVmKQorc3RhdGljIGludCB0Y2ZfY3N1bV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLAorCQkJIGludCByZWYpCiB7CiAJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNmX2NzdW0gKnAgPSB0b190Y2ZfY3N1bShhKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfZ2FjdC5jIGIvbmV0L3NjaGVkL2FjdF9nYWN0LmMKaW5kZXggZTI0YTQwOS4uZTBhYTMwZiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9nYWN0LmMKKysrIGIvbmV0L3NjaGVkL2FjdF9nYWN0LmMKQEAgLTE1Niw3ICsxNTYsOCBAQAogCWludCBhY3Rpb24gPSBSRUFEX09OQ0UoZ2FjdC0+dGNmX2FjdGlvbik7CiAJc3RydWN0IHRjZl90ICp0bSA9ICZnYWN0LT50Y2ZfdG07CiAKLQlfYnN0YXRzX2NwdV91cGRhdGUodGhpc19jcHVfcHRyKGdhY3QtPmNvbW1vbi5jcHVfYnN0YXRzKSwgYnl0ZXMsIHBhY2tldHMpOworCV9ic3RhdHNfY3B1X3VwZGF0ZSh0aGlzX2NwdV9wdHIoZ2FjdC0+Y29tbW9uLmNwdV9ic3RhdHMpLCBieXRlcywKKwkJCSAgIHBhY2tldHMpOwogCWlmIChhY3Rpb24gPT0gVENfQUNUX1NIT1QpCiAJCXRoaXNfY3B1X3B0cihnYWN0LT5jb21tb24uY3B1X3FzdGF0cyktPmRyb3BzICs9IHBhY2tldHM7CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfaWZlLmMgYi9uZXQvc2NoZWQvYWN0X2lmZS5jCmluZGV4IDE0MWEwNmUuLjk1YzQ2M2MgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfaWZlLmMKKysrIGIvbmV0L3NjaGVkL2FjdF9pZmUuYwpAQCAtNTMsNyArNTMsNyBAQAogCXUzMiAqdGx2ID0gKHUzMiAqKShza2JkYXRhKTsKIAl1MTYgdG90bGVuID0gbmxhX3RvdGFsX3NpemUoZGxlbik7CS8qYWxpZ25tZW50ICsgaGRyICovCiAJY2hhciAqZHB0ciA9IChjaGFyICopdGx2ICsgTkxBX0hEUkxFTjsKLQl1MzIgaHRsdiA9IGF0dHJ0eXBlIDw8IDE2IHwgdG90bGVuOworCXUzMiBodGx2ID0gYXR0cnR5cGUgPDwgMTYgfCAoZGxlbiArIE5MQV9IRFJMRU4pOwogCiAJKnRsdiA9IGh0b25sKGh0bHYpOwogCW1lbXNldChkcHRyLCAwLCB0b3RsZW4gLSBOTEFfSERSTEVOKTsKQEAgLTYzLDYgKzYzLDIzIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpZmVfdGx2X21ldGFfZW5jb2RlKTsKIAoraW50IGlmZV9lbmNvZGVfbWV0YV91MTYodTE2IG1ldGF2YWwsIHZvaWQgKnNrYmRhdGEsIHN0cnVjdCB0Y2ZfbWV0YV9pbmZvICptaSkKK3sKKwl1MTYgZWRhdGEgPSAwOworCisJaWYgKG1pLT5tZXRhdmFsKQorCQllZGF0YSA9ICoodTE2ICopbWktPm1ldGF2YWw7CisJZWxzZSBpZiAobWV0YXZhbCkKKwkJZWRhdGEgPSBtZXRhdmFsOworCisJaWYgKCFlZGF0YSkgLyogd2lsbCBub3QgZW5jb2RlICovCisJCXJldHVybiAwOworCisJZWRhdGEgPSBodG9ucyhlZGF0YSk7CisJcmV0dXJuIGlmZV90bHZfbWV0YV9lbmNvZGUoc2tiZGF0YSwgbWktPm1ldGFpZCwgMiwgJmVkYXRhKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlmZV9lbmNvZGVfbWV0YV91MTYpOworCiBpbnQgaWZlX2dldF9tZXRhX3UzMihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX21ldGFfaW5mbyAqbWkpCiB7CiAJaWYgKG1pLT5tZXRhdmFsKQpAQCAtODEsNiArOTgsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlmZV9jaGVja19tZXRhX3UzMik7CiAKK2ludCBpZmVfY2hlY2tfbWV0YV91MTYodTE2IG1ldGF2YWwsIHN0cnVjdCB0Y2ZfbWV0YV9pbmZvICptaSkKK3sKKwlpZiAobWV0YXZhbCB8fCBtaS0+bWV0YXZhbCkKKwkJcmV0dXJuIDg7IC8qIFQrTCsoVikgPT0gMisyKygyKzJieXRlcGFkKSAqLworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpZmVfY2hlY2tfbWV0YV91MTYpOworCiBpbnQgaWZlX2VuY29kZV9tZXRhX3UzMih1MzIgbWV0YXZhbCwgdm9pZCAqc2tiZGF0YSwgc3RydWN0IHRjZl9tZXRhX2luZm8gKm1pKQogewogCXUzMiBlZGF0YSA9IG1ldGF2YWw7CkBAIC0xMzUsNyArMTYxLDcgQEAKIAogaW50IGlmZV92YWxpZGF0ZV9tZXRhX3UzMih2b2lkICp2YWwsIGludCBsZW4pCiB7Ci0JaWYgKGxlbiA9PSA0KQorCWlmIChsZW4gPT0gc2l6ZW9mKHUzMikpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNDQsOCArMTcwLDggQEAKIAogaW50IGlmZV92YWxpZGF0ZV9tZXRhX3UxNih2b2lkICp2YWwsIGludCBsZW4pCiB7Ci0JLyogbGVuZ3RoIHdpbGwgaW5jbHVkZSBwYWRkaW5nICovCi0JaWYgKGxlbiA9PSBOTEFfQUxJR04oMikpCisJLyogbGVuZ3RoIHdpbGwgbm90IGluY2x1ZGUgcGFkZGluZyAqLworCWlmIChsZW4gPT0gc2l6ZW9mKHUxNikpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIC1FSU5WQUw7CkBAIC02MjcsNyArNjUzLDcgQEAKIAlzdHJ1Y3QgdGNmX2lmZV9pbmZvICppZmUgPSB0b19pZmUoYSk7CiAJaW50IGFjdGlvbiA9IGlmZS0+dGNmX2FjdGlvbjsKIAlzdHJ1Y3QgaWZlaGVhZHIgKmlmZWhkciA9IChzdHJ1Y3QgaWZlaGVhZHIgKilza2ItPmRhdGE7Ci0JdTE2IGlmZWhkcmxuID0gaWZlaGRyLT5tZXRhbGVuOworCWludCBpZmVoZHJsbiA9IChpbnQpaWZlaGRyLT5tZXRhbGVuOwogCXN0cnVjdCBtZXRhX3RsdmhkciAqdGx2ID0gKHN0cnVjdCBtZXRhX3RsdmhkciAqKShpZmVoZHItPnRsdl9kYXRhKTsKIAogCXNwaW5fbG9jaygmaWZlLT50Y2ZfbG9jayk7CkBAIC02NTIsMTIgKzY3OCwxNCBAQAogCQl1OCAqdGx2ZGF0YSA9ICh1OCAqKXRsdjsKIAkJdTE2IG10eXBlID0gdGx2LT50eXBlOwogCQl1MTYgbWxlbiA9IHRsdi0+bGVuOworCQl1MTYgYWxlbjsKIAogCQltdHlwZSA9IG50b2hzKG10eXBlKTsKIAkJbWxlbiA9IG50b2hzKG1sZW4pOworCQlhbGVuID0gTkxBX0FMSUdOKG1sZW4pOwogCi0JCWlmIChmaW5kX2RlY29kZV9tZXRhaWQoc2tiLCBpZmUsIG10eXBlLCAobWxlbiAtIDQpLAotCQkJCSAgICAgICAodm9pZCAqKSh0bHZkYXRhICsgNCkpKSB7CisJCWlmIChmaW5kX2RlY29kZV9tZXRhaWQoc2tiLCBpZmUsIG10eXBlLCAobWxlbiAtIE5MQV9IRFJMRU4pLAorCQkJCSAgICAgICAodm9pZCAqKSh0bHZkYXRhICsgTkxBX0hEUkxFTikpKSB7CiAJCQkvKiBhYnVzZSBvdmVybGltaXRzIHRvIGNvdW50IHdoZW4gd2UgcmVjZWl2ZSBtZXRhZGF0YQogCQkJICogYnV0IGRvbnQgaGF2ZSBhbiBvcHMgZm9yIGl0CiAJCQkgKi8KQEAgLTY2Niw4ICs2OTQsOCBAQAogCQkJaWZlLT50Y2ZfcXN0YXRzLm92ZXJsaW1pdHMrKzsKIAkJfQogCi0JCXRsdmRhdGEgKz0gbWxlbjsKLQkJaWZlaGRybG4gLT0gbWxlbjsKKwkJdGx2ZGF0YSArPSBhbGVuOworCQlpZmVoZHJsbiAtPSBhbGVuOwogCQl0bHYgPSAoc3RydWN0IG1ldGFfdGx2aGRyICopdGx2ZGF0YTsKIAl9CiAKQEAgLTczOCw4ICs3NjYsNiBAQAogCQlyZXR1cm4gVENfQUNUX1NIT1Q7CiAJfQogCi0JaWV0aGggPSBldGhfaGRyKHNrYik7Ci0KIAllcnIgPSBza2JfY293X2hlYWQoc2tiLCBoZHJtKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewogCQlpZmUtPnRjZl9xc3RhdHMuZHJvcHMrKzsKQEAgLTc1MCw2ICs3NzYsNyBAQAogCWlmICghKGF0ICYgQVRfRUdSRVNTKSkKIAkJc2tiX3B1c2goc2tiLCBza2ItPmRldi0+aGFyZF9oZWFkZXJfbGVuKTsKIAorCWlldGhoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CiAJX19za2JfcHVzaChza2IsIGhkcm0pOwogCW1lbWNweShza2ItPmRhdGEsIGlldGhoLCBza2ItPm1hY19sZW4pOwogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X21ldGFfc2tidGNpbmRleC5jIGIvbmV0L3NjaGVkL2FjdF9tZXRhX3NrYnRjaW5kZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjM1Nzc0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL2FjdF9tZXRhX3NrYnRjaW5kZXguYwpAQCAtMCwwICsxLDc5IEBACisvKgorICogbmV0L3NjaGVkL2FjdF9tZXRhX3RjX2luZGV4LmMgSUZFIHNrYi0+dGNfaW5kZXggbWV0YWRhdGEgbW9kdWxlCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogY29weXJpZ2h0IEphbWFsIEhhZGkgU2FsaW0gKDIwMTYpCisgKgorKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC90Y19hY3QvdGNfaWZlLmg+CisjaW5jbHVkZSA8bmV0L3RjX2FjdC90Y19pZmUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKworc3RhdGljIGludCBza2J0Y2luZGV4X2VuY29kZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB2b2lkICpza2JkYXRhLAorCQkJICAgICBzdHJ1Y3QgdGNmX21ldGFfaW5mbyAqZSkKK3sKKwl1MzIgaWZldGNfaW5kZXggPSBza2ItPnRjX2luZGV4OworCisJcmV0dXJuIGlmZV9lbmNvZGVfbWV0YV91MTYoaWZldGNfaW5kZXgsIHNrYmRhdGEsIGUpOworfQorCitzdGF0aWMgaW50IHNrYnRjaW5kZXhfZGVjb2RlKHN0cnVjdCBza19idWZmICpza2IsIHZvaWQgKmRhdGEsIHUxNiBsZW4pCit7CisJdTE2IGlmZXRjX2luZGV4ID0gKih1MTYgKilkYXRhOworCisJc2tiLT50Y19pbmRleCA9IG50b2hzKGlmZXRjX2luZGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBza2J0Y2luZGV4X2NoZWNrKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y2ZfbWV0YV9pbmZvICplKQoreworCXJldHVybiBpZmVfY2hlY2tfbWV0YV91MTYoc2tiLT50Y19pbmRleCwgZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNmX21ldGFfb3BzIGlmZV9za2J0Y2luZGV4X29wcyA9IHsKKwkubWV0YWlkID0gSUZFX01FVEFfVENJTkRFWCwKKwkubWV0YXR5cGUgPSBOTEFfVTE2LAorCS5uYW1lID0gInRjX2luZGV4IiwKKwkuc3lub3BzaXMgPSAic2tiIHRjX2luZGV4IDE2IGJpdCBtZXRhZGF0YSIsCisJLmNoZWNrX3ByZXNlbmNlID0gc2tidGNpbmRleF9jaGVjaywKKwkuZW5jb2RlID0gc2tidGNpbmRleF9lbmNvZGUsCisJLmRlY29kZSA9IHNrYnRjaW5kZXhfZGVjb2RlLAorCS5nZXQgPSBpZmVfZ2V0X21ldGFfdTE2LAorCS5hbGxvYyA9IGlmZV9hbGxvY19tZXRhX3UxNiwKKwkucmVsZWFzZSA9IGlmZV9yZWxlYXNlX21ldGFfZ2VuLAorCS52YWxpZGF0ZSA9IGlmZV92YWxpZGF0ZV9tZXRhX3UxNiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlmZXRjX2luZGV4X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX2lmZV9vcCgmaWZlX3NrYnRjaW5kZXhfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGlmZXRjX2luZGV4X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9pZmVfb3AoJmlmZV9za2J0Y2luZGV4X29wcyk7Cit9CisKK21vZHVsZV9pbml0KGlmZXRjX2luZGV4X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGlmZXRjX2luZGV4X2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0FVVEhPUigiSmFtYWwgSGFkaSBTYWxpbSgyMDE2KSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlci1GRSBza2IgdGNfaW5kZXggbWV0YWRhdGEgbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfSUZFX01FVEEoSUZFX01FVEFfU0tCVENJTkRFWCk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X21pcnJlZC5jIGIvbmV0L3NjaGVkL2FjdF9taXJyZWQuYwppbmRleCA2MDM4Yzg1Li42NjdkYzM4IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X21pcnJlZC5jCisrKyBiL25ldC9zY2hlZC9hY3RfbWlycmVkLmMKQEAgLTIwNCw3ICsyMDQsMTUgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IHRjZl9taXJyZWRfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCwgaW50IHJlZikKK3N0YXRpYyB2b2lkIHRjZl9zdGF0c191cGRhdGUoc3RydWN0IHRjX2FjdGlvbiAqYSwgdTY0IGJ5dGVzLCB1MzIgcGFja2V0cywKKwkJCSAgICAgdTY0IGxhc3R1c2UpCit7CisJdGNmX2xhc3R1c2VfdXBkYXRlKCZhLT50Y2ZhX3RtKTsKKwlfYnN0YXRzX2NwdV91cGRhdGUodGhpc19jcHVfcHRyKGEtPmNwdV9ic3RhdHMpLCBieXRlcywgcGFja2V0cyk7Cit9CisKK3N0YXRpYyBpbnQgdGNmX21pcnJlZF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLAorCQkJICAgaW50IHJlZikKIHsKIAl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCXN0cnVjdCB0Y2ZfbWlycmVkICptID0gdG9fbWlycmVkKGEpOwpAQCAtMjgwLDYgKzI4OCw3IEBACiAJLnR5cGUJCT0JVENBX0FDVF9NSVJSRUQsCiAJLm93bmVyCQk9CVRISVNfTU9EVUxFLAogCS5hY3QJCT0JdGNmX21pcnJlZCwKKwkuc3RhdHNfdXBkYXRlCT0JdGNmX3N0YXRzX3VwZGF0ZSwKIAkuZHVtcAkJPQl0Y2ZfbWlycmVkX2R1bXAsCiAJLmNsZWFudXAJPQl0Y2ZfbWlycmVkX3JlbGVhc2UsCiAJLmluaXQJCT0JdGNmX21pcnJlZF9pbml0LApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9wb2xpY2UuYyBiL25ldC9zY2hlZC9hY3RfcG9saWNlLmMKaW5kZXggYjNjN2U5Ny4uZDFiZDI0OCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9wb2xpY2UuYworKysgYi9uZXQvc2NoZWQvYWN0X3BvbGljZS5jCkBAIC02Myw0OSArNjMsOCBAQAogCQkJCSBjb25zdCBzdHJ1Y3QgdGNfYWN0aW9uX29wcyAqb3BzKQogewogCXN0cnVjdCB0Y19hY3Rpb25fbmV0ICp0biA9IG5ldF9nZW5lcmljKG5ldCwgcG9saWNlX25ldF9pZCk7Ci0Jc3RydWN0IHRjZl9oYXNoaW5mbyAqaGluZm8gPSB0bi0+aGluZm87Ci0JaW50IGVyciA9IDAsIGluZGV4ID0gLTEsIGkgPSAwLCBzX2kgPSAwLCBuX2kgPSAwOwotCXN0cnVjdCBubGF0dHIgKm5lc3Q7CiAKLQlzcGluX2xvY2tfYmgoJmhpbmZvLT5sb2NrKTsKLQotCXNfaSA9IGNiLT5hcmdzWzBdOwotCi0JZm9yIChpID0gMDsgaSA8IChQT0xfVEFCX01BU0sgKyAxKTsgaSsrKSB7Ci0JCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwotCQlzdHJ1Y3QgdGNfYWN0aW9uICpwOwotCi0JCWhlYWQgPSAmaGluZm8tPmh0YWJbdGNmX2hhc2goaSwgUE9MX1RBQl9NQVNLKV07Ci0KLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHAsIGhlYWQsIHRjZmFfaGVhZCkgewotCQkJaW5kZXgrKzsKLQkJCWlmIChpbmRleCA8IHNfaSkKLQkJCQljb250aW51ZTsKLQkJCW5lc3QgPSBubGFfbmVzdF9zdGFydChza2IsIGluZGV4KTsKLQkJCWlmIChuZXN0ID09IE5VTEwpCi0JCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0JCQlpZiAodHlwZSA9PSBSVE1fREVMQUNUSU9OKQotCQkJCWVyciA9IHRjZl9hY3Rpb25fZHVtcF8xKHNrYiwgcCwgMCwgMSk7Ci0JCQllbHNlCi0JCQkJZXJyID0gdGNmX2FjdGlvbl9kdW1wXzEoc2tiLCBwLCAwLCAwKTsKLQkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJaW5kZXgtLTsKLQkJCQlubGFfbmVzdF9jYW5jZWwoc2tiLCBuZXN0KTsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9Ci0JCQlubGFfbmVzdF9lbmQoc2tiLCBuZXN0KTsKLQkJCW5faSsrOwotCQl9Ci0JfQotZG9uZToKLQlzcGluX3VubG9ja19iaCgmaGluZm8tPmxvY2spOwotCWlmIChuX2kpCi0JCWNiLT5hcmdzWzBdICs9IG5faTsKLQlyZXR1cm4gbl9pOwotCi1ubGFfcHV0X2ZhaWx1cmU6Ci0JbmxhX25lc3RfY2FuY2VsKHNrYiwgbmVzdCk7Ci0JZ290byBkb25lOworCXJldHVybiB0Y2ZfZ2VuZXJpY193YWxrZXIodG4sIHNrYiwgY2IsIHR5cGUsIG9wcyk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBwb2xpY2VfcG9saWN5W1RDQV9QT0xJQ0VfTUFYICsgMV0gPSB7CkBAIC0xMjUsNiArODQsNyBAQAogCXN0cnVjdCB0Y2ZfcG9saWNlICpwb2xpY2U7CiAJc3RydWN0IHFkaXNjX3JhdGVfdGFibGUgKlJfdGFiID0gTlVMTCwgKlBfdGFiID0gTlVMTDsKIAlzdHJ1Y3QgdGNfYWN0aW9uX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHBvbGljZV9uZXRfaWQpOworCWJvb2wgZXhpc3RzID0gZmFsc2U7CiAJaW50IHNpemU7CiAKIAlpZiAobmxhID09IE5VTEwpCkBAIC0xMzksMjQgKzk5LDI0IEBACiAJc2l6ZSA9IG5sYV9sZW4odGJbVENBX1BPTElDRV9UQkZdKTsKIAlpZiAoc2l6ZSAhPSBzaXplb2YoKnBhcm0pICYmIHNpemUgIT0gc2l6ZW9mKHN0cnVjdCB0Y19wb2xpY2VfY29tcGF0KSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JcGFybSA9IG5sYV9kYXRhKHRiW1RDQV9QT0xJQ0VfVEJGXSk7CiAKLQlpZiAocGFybS0+aW5kZXgpIHsKLQkJaWYgKHRjZl9oYXNoX2NoZWNrKHRuLCBwYXJtLT5pbmRleCwgYSwgYmluZCkpIHsKLQkJCWlmIChvdnIpCi0JCQkJZ290byBvdmVycmlkZTsKLQkJCS8qIG5vdCByZXBsYWNpbmcgKi8KLQkJCXJldHVybiAtRUVYSVNUOwotCQl9Ci0JfSBlbHNlIHsKKwlwYXJtID0gbmxhX2RhdGEodGJbVENBX1BPTElDRV9UQkZdKTsKKwlleGlzdHMgPSB0Y2ZfaGFzaF9jaGVjayh0biwgcGFybS0+aW5kZXgsIGEsIGJpbmQpOworCWlmIChleGlzdHMgJiYgYmluZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWV4aXN0cykgewogCQlyZXQgPSB0Y2ZfaGFzaF9jcmVhdGUodG4sIHBhcm0tPmluZGV4LCBOVUxMLCBhLAogCQkJCSAgICAgICZhY3RfcG9saWNlX29wcywgYmluZCwgZmFsc2UpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAkJcmV0ID0gQUNUX1BfQ1JFQVRFRDsKKwl9IGVsc2UgeworCQl0Y2ZfaGFzaF9yZWxlYXNlKCphLCBiaW5kKTsKKwkJaWYgKCFvdnIpCisJCQlyZXR1cm4gLUVFWElTVDsKIAl9CiAKLW92ZXJyaWRlOgogCXBvbGljZSA9IHRvX3BvbGljZSgqYSk7CiAJaWYgKHBhcm0tPnJhdGUucmF0ZSkgewogCQllcnIgPSAtRU5PTUVNOwpAQCAtMjg5LDYgKzI0OSw4IEBACiAJCQlwb2xpY2UtPnRjZnBfdF9jID0gbm93OwogCQkJcG9saWNlLT50Y2ZwX3Rva3MgPSB0b2tzOwogCQkJcG9saWNlLT50Y2ZwX3B0b2tzID0gcHRva3M7CisJCQlpZiAocG9saWNlLT50Y2ZwX3Jlc3VsdCA9PSBUQ19BQ1RfU0hPVCkKKwkJCQlwb2xpY2UtPnRjZl9xc3RhdHMuZHJvcHMrKzsKIAkJCXNwaW5fdW5sb2NrKCZwb2xpY2UtPnRjZl9sb2NrKTsKIAkJCXJldHVybiBwb2xpY2UtPnRjZnBfcmVzdWx0OwogCQl9CkBAIC0zMDEsOCArMjYzLDggQEAKIAlyZXR1cm4gcG9saWNlLT50Y2ZfYWN0aW9uOwogfQogCi1zdGF0aWMgaW50Ci10Y2ZfYWN0X3BvbGljZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLCBpbnQgcmVmKQorc3RhdGljIGludCB0Y2ZfYWN0X3BvbGljZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsCisJCQkgICAgICAgaW50IGJpbmQsIGludCByZWYpCiB7CiAJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNmX3BvbGljZSAqcG9saWNlID0gdG9fcG9saWNlKGEpOwpAQCAtMzg3LDE0ICszNDksMTIgQEAKIAkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdGNfYWN0aW9uX25ldCksCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdAotcG9saWNlX2luaXRfbW9kdWxlKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBwb2xpY2VfaW5pdF9tb2R1bGUodm9pZCkKIHsKIAlyZXR1cm4gdGNmX3JlZ2lzdGVyX2FjdGlvbigmYWN0X3BvbGljZV9vcHMsICZwb2xpY2VfbmV0X29wcyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdAotcG9saWNlX2NsZWFudXBfbW9kdWxlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgcG9saWNlX2NsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJdGNmX3VucmVnaXN0ZXJfYWN0aW9uKCZhY3RfcG9saWNlX29wcywgJnBvbGljZV9uZXRfb3BzKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3Rfc2tibW9kLmMgYi9uZXQvc2NoZWQvYWN0X3NrYm1vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDk2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvYWN0X3NrYm1vZC5jCkBAIC0wLDAgKzEsMzAxIEBACisvKgorICogbmV0L3NjaGVkL2FjdF9za2Jtb2QuYyAgc2tiIGRhdGEgbW9kaWZpZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgSmFtYWwgSGFkaSBTYWxpbSA8amhzQG1vamF0YXR1LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3RjX2FjdC90Y19za2Jtb2QuaD4KKyNpbmNsdWRlIDxuZXQvdGNfYWN0L3RjX3NrYm1vZC5oPgorCisjZGVmaW5lIFNLQk1PRF9UQUJfTUFTSyAgICAgMTUKKworc3RhdGljIGludCBza2Jtb2RfbmV0X2lkOworc3RhdGljIHN0cnVjdCB0Y19hY3Rpb25fb3BzIGFjdF9za2Jtb2Rfb3BzOworCisjZGVmaW5lIE1BWF9FRElUX0xFTiBFVEhfSExFTgorc3RhdGljIGludCB0Y2Zfc2tibW9kX3J1bihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgdGNfYWN0aW9uICphLAorCQkJICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQoreworCXN0cnVjdCB0Y2Zfc2tibW9kICpkID0gdG9fc2tibW9kKGEpOworCWludCBhY3Rpb247CisJc3RydWN0IHRjZl9za2Jtb2RfcGFyYW1zICpwOworCXU2NCBmbGFnczsKKwlpbnQgZXJyOworCisJdGNmX2xhc3R1c2VfdXBkYXRlKCZkLT50Y2ZfdG0pOworCWJzdGF0c19jcHVfdXBkYXRlKHRoaXNfY3B1X3B0cihkLT5jb21tb24uY3B1X2JzdGF0cyksIHNrYik7CisKKwkvKiBYWFg6IGlmIHlvdSBhcmUgZ29pbmcgdG8gZWRpdCBtb3JlIGZpZWxkcyBiZXlvbmQgZXRoZXJuZXQgaGVhZGVyCisJICogKGV4YW1wbGUgd2hlbiB5b3UgYWRkIElQIGhlYWRlciByZXBsYWNlbWVudCBvciB2bGFuIHN3YXApCisJICogdGhlbiBNQVhfRURJVF9MRU4gbmVlZHMgdG8gY2hhbmdlIGFwcHJvcHJpYXRlbHkKKwkqLworCWVyciA9IHNrYl9lbnN1cmVfd3JpdGFibGUoc2tiLCBNQVhfRURJVF9MRU4pOworCWlmICh1bmxpa2VseShlcnIpKSB7IC8qIGJlc3QgcG9saWN5IGlzIHRvIGRyb3Agb24gdGhlIGZsb29yICovCisJCXFzdGF0c19vdmVybGltaXRfaW5jKHRoaXNfY3B1X3B0cihkLT5jb21tb24uY3B1X3FzdGF0cykpOworCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJfQorCisJcmN1X3JlYWRfbG9jaygpOworCWFjdGlvbiA9IFJFQURfT05DRShkLT50Y2ZfYWN0aW9uKTsKKwlpZiAodW5saWtlbHkoYWN0aW9uID09IFRDX0FDVF9TSE9UKSkgeworCQlxc3RhdHNfb3ZlcmxpbWl0X2luYyh0aGlzX2NwdV9wdHIoZC0+Y29tbW9uLmNwdV9xc3RhdHMpKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiBhY3Rpb247CisJfQorCisJcCA9IHJjdV9kZXJlZmVyZW5jZShkLT5za2Jtb2RfcCk7CisJZmxhZ3MgPSBwLT5mbGFnczsKKwlpZiAoZmxhZ3MgJiBTS0JNT0RfRl9ETUFDKQorCQlldGhlcl9hZGRyX2NvcHkoZXRoX2hkcihza2IpLT5oX2Rlc3QsIHAtPmV0aF9kc3QpOworCWlmIChmbGFncyAmIFNLQk1PRF9GX1NNQUMpCisJCWV0aGVyX2FkZHJfY29weShldGhfaGRyKHNrYiktPmhfc291cmNlLCBwLT5ldGhfc3JjKTsKKwlpZiAoZmxhZ3MgJiBTS0JNT0RfRl9FVFlQRSkKKwkJZXRoX2hkcihza2IpLT5oX3Byb3RvID0gcC0+ZXRoX3R5cGU7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAoZmxhZ3MgJiBTS0JNT0RfRl9TV0FQTUFDKSB7CisJCXUxNiB0bXBhZGRyW0VUSF9BTEVOIC8gMl07IC8qIGV0aGVyX2FkZHJfY29weSgpIHJlcXVpcmVtZW50ICovCisJCS8qWFhYOiBJIGFtIHN1cmUgd2UgY2FuIGNvbWUgdXAgd2l0aCBtb3JlIGVmZmljaWVudCBzd2FwcGluZyovCisJCWV0aGVyX2FkZHJfY29weSgodTggKil0bXBhZGRyLCBldGhfaGRyKHNrYiktPmhfZGVzdCk7CisJCWV0aGVyX2FkZHJfY29weShldGhfaGRyKHNrYiktPmhfZGVzdCwgZXRoX2hkcihza2IpLT5oX3NvdXJjZSk7CisJCWV0aGVyX2FkZHJfY29weShldGhfaGRyKHNrYiktPmhfc291cmNlLCAodTggKil0bXBhZGRyKTsKKwl9CisKKwlyZXR1cm4gYWN0aW9uOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgc2tibW9kX3BvbGljeVtUQ0FfU0tCTU9EX01BWCArIDFdID0geworCVtUQ0FfU0tCTU9EX1BBUk1TXQkJPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IHRjX3NrYm1vZCkgfSwKKwlbVENBX1NLQk1PRF9ETUFDXQkJPSB7IC5sZW4gPSBFVEhfQUxFTiB9LAorCVtUQ0FfU0tCTU9EX1NNQUNdCQk9IHsgLmxlbiA9IEVUSF9BTEVOIH0sCisJW1RDQV9TS0JNT0RfRVRZUEVdCQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCit9OworCitzdGF0aWMgaW50IHRjZl9za2Jtb2RfaW5pdChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBubGF0dHIgKm5sYSwKKwkJCSAgIHN0cnVjdCBubGF0dHIgKmVzdCwgc3RydWN0IHRjX2FjdGlvbiAqKmEsCisJCQkgICBpbnQgb3ZyLCBpbnQgYmluZCkKK3sKKwlzdHJ1Y3QgdGNfYWN0aW9uX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHNrYm1vZF9uZXRfaWQpOworCXN0cnVjdCBubGF0dHIgKnRiW1RDQV9TS0JNT0RfTUFYICsgMV07CisJc3RydWN0IHRjZl9za2Jtb2RfcGFyYW1zICpwLCAqcF9vbGQ7CisJc3RydWN0IHRjX3NrYm1vZCAqcGFybTsKKwlzdHJ1Y3QgdGNmX3NrYm1vZCAqZDsKKwlib29sIGV4aXN0cyA9IGZhbHNlOworCXU4ICpkYWRkciA9IE5VTEw7CisJdTggKnNhZGRyID0gTlVMTDsKKwl1MTYgZXRoX3R5cGUgPSAwOworCXUzMiBsZmxhZ3MgPSAwOworCWludCByZXQgPSAwLCBlcnI7CisKKwlpZiAoIW5sYSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBubGFfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfU0tCTU9EX01BWCwgbmxhLCBza2Jtb2RfcG9saWN5KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmICghdGJbVENBX1NLQk1PRF9QQVJNU10pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRiW1RDQV9TS0JNT0RfRE1BQ10pIHsKKwkJZGFkZHIgPSBubGFfZGF0YSh0YltUQ0FfU0tCTU9EX0RNQUNdKTsKKwkJbGZsYWdzIHw9IFNLQk1PRF9GX0RNQUM7CisJfQorCisJaWYgKHRiW1RDQV9TS0JNT0RfU01BQ10pIHsKKwkJc2FkZHIgPSBubGFfZGF0YSh0YltUQ0FfU0tCTU9EX1NNQUNdKTsKKwkJbGZsYWdzIHw9IFNLQk1PRF9GX1NNQUM7CisJfQorCisJaWYgKHRiW1RDQV9TS0JNT0RfRVRZUEVdKSB7CisJCWV0aF90eXBlID0gbmxhX2dldF91MTYodGJbVENBX1NLQk1PRF9FVFlQRV0pOworCQlsZmxhZ3MgfD0gU0tCTU9EX0ZfRVRZUEU7CisJfQorCisJcGFybSA9IG5sYV9kYXRhKHRiW1RDQV9TS0JNT0RfUEFSTVNdKTsKKwlpZiAocGFybS0+ZmxhZ3MgJiBTS0JNT0RfRl9TV0FQTUFDKQorCQlsZmxhZ3MgPSBTS0JNT0RfRl9TV0FQTUFDOworCisJZXhpc3RzID0gdGNmX2hhc2hfY2hlY2sodG4sIHBhcm0tPmluZGV4LCBhLCBiaW5kKTsKKwlpZiAoZXhpc3RzICYmIGJpbmQpCisJCXJldHVybiAwOworCisJaWYgKCFsZmxhZ3MpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFleGlzdHMpIHsKKwkJcmV0ID0gdGNmX2hhc2hfY3JlYXRlKHRuLCBwYXJtLT5pbmRleCwgZXN0LCBhLAorCQkJCSAgICAgICZhY3Rfc2tibW9kX29wcywgYmluZCwgdHJ1ZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IEFDVF9QX0NSRUFURUQ7CisJfSBlbHNlIHsKKwkJdGNmX2hhc2hfcmVsZWFzZSgqYSwgYmluZCk7CisJCWlmICghb3ZyKQorCQkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJZCA9IHRvX3NrYm1vZCgqYSk7CisKKwlBU1NFUlRfUlROTCgpOworCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGNmX3NrYm1vZF9wYXJhbXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIXApKSB7CisJCWlmIChvdnIpCisJCQl0Y2ZfaGFzaF9yZWxlYXNlKCphLCBiaW5kKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcC0+ZmxhZ3MgPSBsZmxhZ3M7CisJZC0+dGNmX2FjdGlvbiA9IHBhcm0tPmFjdGlvbjsKKworCXBfb2xkID0gcnRubF9kZXJlZmVyZW5jZShkLT5za2Jtb2RfcCk7CisKKwlpZiAob3ZyKQorCQlzcGluX2xvY2tfYmgoJmQtPnRjZl9sb2NrKTsKKworCWlmIChsZmxhZ3MgJiBTS0JNT0RfRl9ETUFDKQorCQlldGhlcl9hZGRyX2NvcHkocC0+ZXRoX2RzdCwgZGFkZHIpOworCWlmIChsZmxhZ3MgJiBTS0JNT0RfRl9TTUFDKQorCQlldGhlcl9hZGRyX2NvcHkocC0+ZXRoX3NyYywgc2FkZHIpOworCWlmIChsZmxhZ3MgJiBTS0JNT0RfRl9FVFlQRSkKKwkJcC0+ZXRoX3R5cGUgPSBodG9ucyhldGhfdHlwZSk7CisKKwlyY3VfYXNzaWduX3BvaW50ZXIoZC0+c2tibW9kX3AsIHApOworCWlmIChvdnIpCisJCXNwaW5fdW5sb2NrX2JoKCZkLT50Y2ZfbG9jayk7CisKKwlpZiAocF9vbGQpCisJCWtmcmVlX3JjdShwX29sZCwgcmN1KTsKKworCWlmIChyZXQgPT0gQUNUX1BfQ1JFQVRFRCkKKwkJdGNmX2hhc2hfaW5zZXJ0KHRuLCAqYSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdGNmX3NrYm1vZF9jbGVhbnVwKHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kKQoreworCXN0cnVjdCB0Y2Zfc2tibW9kICpkID0gdG9fc2tibW9kKGEpOworCXN0cnVjdCB0Y2Zfc2tibW9kX3BhcmFtcyAgKnA7CisKKwlwID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChkLT5za2Jtb2RfcCwgMSk7CisJa2ZyZWVfcmN1KHAsIHJjdSk7Cit9CisKK3N0YXRpYyBpbnQgdGNmX3NrYm1vZF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsCisJCQkgICBpbnQgYmluZCwgaW50IHJlZikKK3sKKwlzdHJ1Y3QgdGNmX3NrYm1vZCAqZCA9IHRvX3NrYm1vZChhKTsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOworCXN0cnVjdCB0Y2Zfc2tibW9kX3BhcmFtcyAgKnAgPSBydG5sX2RlcmVmZXJlbmNlKGQtPnNrYm1vZF9wKTsKKwlzdHJ1Y3QgdGNfc2tibW9kIG9wdCA9IHsKKwkJLmluZGV4ICAgPSBkLT50Y2ZfaW5kZXgsCisJCS5yZWZjbnQgID0gZC0+dGNmX3JlZmNudCAtIHJlZiwKKwkJLmJpbmRjbnQgPSBkLT50Y2ZfYmluZGNudCAtIGJpbmQsCisJCS5hY3Rpb24gID0gZC0+dGNmX2FjdGlvbiwKKwl9OworCXN0cnVjdCB0Y2ZfdCB0OworCisJb3B0LmZsYWdzICA9IHAtPmZsYWdzOworCWlmIChubGFfcHV0KHNrYiwgVENBX1NLQk1PRF9QQVJNUywgc2l6ZW9mKG9wdCksICZvcHQpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAoKHAtPmZsYWdzICYgU0tCTU9EX0ZfRE1BQykgJiYKKwkgICAgbmxhX3B1dChza2IsIFRDQV9TS0JNT0RfRE1BQywgRVRIX0FMRU4sIHAtPmV0aF9kc3QpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAoKHAtPmZsYWdzICYgU0tCTU9EX0ZfU01BQykgJiYKKwkgICAgbmxhX3B1dChza2IsIFRDQV9TS0JNT0RfU01BQywgRVRIX0FMRU4sIHAtPmV0aF9zcmMpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAoKHAtPmZsYWdzICYgU0tCTU9EX0ZfRVRZUEUpICYmCisJICAgIG5sYV9wdXRfdTE2KHNrYiwgVENBX1NLQk1PRF9FVFlQRSwgbnRvaHMocC0+ZXRoX3R5cGUpKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwl0Y2ZfdG1fZHVtcCgmdCwgJmQtPnRjZl90bSk7CisJaWYgKG5sYV9wdXRfNjRiaXQoc2tiLCBUQ0FfU0tCTU9EX1RNLCBzaXplb2YodCksICZ0LCBUQ0FfU0tCTU9EX1BBRCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJcmV0dXJuIHNrYi0+bGVuOworbmxhX3B1dF9mYWlsdXJlOgorCXJjdV9yZWFkX3VubG9jaygpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdGNmX3NrYm1vZF93YWxrZXIoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsIGludCB0eXBlLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgdGNfYWN0aW9uX29wcyAqb3BzKQoreworCXN0cnVjdCB0Y19hY3Rpb25fbmV0ICp0biA9IG5ldF9nZW5lcmljKG5ldCwgc2tibW9kX25ldF9pZCk7CisKKwlyZXR1cm4gdGNmX2dlbmVyaWNfd2Fsa2VyKHRuLCBza2IsIGNiLCB0eXBlLCBvcHMpOworfQorCitzdGF0aWMgaW50IHRjZl9za2Jtb2Rfc2VhcmNoKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRjX2FjdGlvbiAqKmEsIHUzMiBpbmRleCkKK3sKKwlzdHJ1Y3QgdGNfYWN0aW9uX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHNrYm1vZF9uZXRfaWQpOworCisJcmV0dXJuIHRjZl9oYXNoX3NlYXJjaCh0biwgYSwgaW5kZXgpOworfQorCitzdGF0aWMgc3RydWN0IHRjX2FjdGlvbl9vcHMgYWN0X3NrYm1vZF9vcHMgPSB7CisJLmtpbmQJCT0JInNrYm1vZCIsCisJLnR5cGUJCT0JVENBX0FDVF9TS0JNT0QsCisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorCS5hY3QJCT0JdGNmX3NrYm1vZF9ydW4sCisJLmR1bXAJCT0JdGNmX3NrYm1vZF9kdW1wLAorCS5pbml0CQk9CXRjZl9za2Jtb2RfaW5pdCwKKwkuY2xlYW51cAk9CXRjZl9za2Jtb2RfY2xlYW51cCwKKwkud2FsawkJPQl0Y2Zfc2tibW9kX3dhbGtlciwKKwkubG9va3VwCQk9CXRjZl9za2Jtb2Rfc2VhcmNoLAorCS5zaXplCQk9CXNpemVvZihzdHJ1Y3QgdGNmX3NrYm1vZCksCit9OworCitzdGF0aWMgX19uZXRfaW5pdCBpbnQgc2tibW9kX2luaXRfbmV0KHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlzdHJ1Y3QgdGNfYWN0aW9uX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHNrYm1vZF9uZXRfaWQpOworCisJcmV0dXJuIHRjX2FjdGlvbl9uZXRfaW5pdCh0biwgJmFjdF9za2Jtb2Rfb3BzLCBTS0JNT0RfVEFCX01BU0spOworfQorCitzdGF0aWMgdm9pZCBfX25ldF9leGl0IHNrYm1vZF9leGl0X25ldChzdHJ1Y3QgbmV0ICpuZXQpCit7CisJc3RydWN0IHRjX2FjdGlvbl9uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCBza2Jtb2RfbmV0X2lkKTsKKworCXRjX2FjdGlvbl9uZXRfZXhpdCh0bik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGVybmV0X29wZXJhdGlvbnMgc2tibW9kX25ldF9vcHMgPSB7CisJLmluaXQgPSBza2Jtb2RfaW5pdF9uZXQsCisJLmV4aXQgPSBza2Jtb2RfZXhpdF9uZXQsCisJLmlkICAgPSAmc2tibW9kX25ldF9pZCwKKwkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdGNfYWN0aW9uX25ldCksCit9OworCitNT0RVTEVfQVVUSE9SKCJKYW1hbCBIYWRpIFNhbGltLCA8amhzQG1vamF0YXR1LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0tCIGRhdGEgbW9kLWluZyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IF9faW5pdCBza2Jtb2RfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gdGNmX3JlZ2lzdGVyX2FjdGlvbigmYWN0X3NrYm1vZF9vcHMsICZza2Jtb2RfbmV0X29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBza2Jtb2RfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl0Y2ZfdW5yZWdpc3Rlcl9hY3Rpb24oJmFjdF9za2Jtb2Rfb3BzLCAmc2tibW9kX25ldF9vcHMpOworfQorCittb2R1bGVfaW5pdChza2Jtb2RfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoc2tibW9kX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfdHVubmVsX2tleS5jIGIvbmV0L3NjaGVkL2FjdF90dW5uZWxfa2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0N2JkZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9hY3RfdHVubmVsX2tleS5jCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCBBbWlyIFZhZGFpIDxhbWlyQHZhZGFpLm1lPgorICogQ29weXJpZ2h0IChjKSAyMDE2LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPG5ldC9kc3QuaD4KKyNpbmNsdWRlIDxuZXQvZHN0X21ldGFkYXRhLmg+CisKKyNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfdHVubmVsX2tleS5oPgorI2luY2x1ZGUgPG5ldC90Y19hY3QvdGNfdHVubmVsX2tleS5oPgorCisjZGVmaW5lIFRVTk5FTF9LRVlfVEFCX01BU0sgICAgIDE1CisKK3N0YXRpYyBpbnQgdHVubmVsX2tleV9uZXRfaWQ7CitzdGF0aWMgc3RydWN0IHRjX2FjdGlvbl9vcHMgYWN0X3R1bm5lbF9rZXlfb3BzOworCitzdGF0aWMgaW50IHR1bm5lbF9rZXlfYWN0KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEsCisJCQkgIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCit7CisJc3RydWN0IHRjZl90dW5uZWxfa2V5ICp0ID0gdG9fdHVubmVsX2tleShhKTsKKwlzdHJ1Y3QgdGNmX3R1bm5lbF9rZXlfcGFyYW1zICpwYXJhbXM7CisJaW50IGFjdGlvbjsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCXBhcmFtcyA9IHJjdV9kZXJlZmVyZW5jZSh0LT5wYXJhbXMpOworCisJdGNmX2xhc3R1c2VfdXBkYXRlKCZ0LT50Y2ZfdG0pOworCWJzdGF0c19jcHVfdXBkYXRlKHRoaXNfY3B1X3B0cih0LT5jb21tb24uY3B1X2JzdGF0cyksIHNrYik7CisJYWN0aW9uID0gcGFyYW1zLT5hY3Rpb247CisKKwlzd2l0Y2ggKHBhcmFtcy0+dGNmdF9hY3Rpb24pIHsKKwljYXNlIFRDQV9UVU5ORUxfS0VZX0FDVF9SRUxFQVNFOgorCQlza2JfZHN0X2Ryb3Aoc2tiKTsKKwkJYnJlYWs7CisJY2FzZSBUQ0FfVFVOTkVMX0tFWV9BQ1RfU0VUOgorCQlza2JfZHN0X2Ryb3Aoc2tiKTsKKwkJc2tiX2RzdF9zZXQoc2tiLCBkc3RfY2xvbmUoJnBhcmFtcy0+dGNmdF9lbmNfbWV0YWRhdGEtPmRzdCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOX09OQ0UoMSwgIkJhZCB0dW5uZWxfa2V5IGFjdGlvbiAlZC5cbiIsCisJCQkgIHBhcmFtcy0+dGNmdF9hY3Rpb24pOworCQlicmVhazsKKwl9CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBhY3Rpb247Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSB0dW5uZWxfa2V5X3BvbGljeVtUQ0FfVFVOTkVMX0tFWV9NQVggKyAxXSA9IHsKKwlbVENBX1RVTk5FTF9LRVlfUEFSTVNdCSAgICA9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgdGNfdHVubmVsX2tleSkgfSwKKwlbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjRfU1JDXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW1RDQV9UVU5ORUxfS0VZX0VOQ19JUFY0X0RTVF0gPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtUQ0FfVFVOTkVMX0tFWV9FTkNfSVBWNl9TUkNdID0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikgfSwKKwlbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfRFNUXSA9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpIH0sCisJW1RDQV9UVU5ORUxfS0VZX0VOQ19LRVlfSURdICAgPSB7IC50eXBlID0gTkxBX1UzMiB9LAorfTsKKworc3RhdGljIGludCB0dW5uZWxfa2V5X2luaXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmxhdHRyICpubGEsCisJCQkgICBzdHJ1Y3QgbmxhdHRyICplc3QsIHN0cnVjdCB0Y19hY3Rpb24gKiphLAorCQkJICAgaW50IG92ciwgaW50IGJpbmQpCit7CisJc3RydWN0IHRjX2FjdGlvbl9uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCB0dW5uZWxfa2V5X25ldF9pZCk7CisJc3RydWN0IG5sYXR0ciAqdGJbVENBX1RVTk5FTF9LRVlfTUFYICsgMV07CisJc3RydWN0IHRjZl90dW5uZWxfa2V5X3BhcmFtcyAqcGFyYW1zX29sZDsKKwlzdHJ1Y3QgdGNmX3R1bm5lbF9rZXlfcGFyYW1zICpwYXJhbXNfbmV3OworCXN0cnVjdCBtZXRhZGF0YV9kc3QgKm1ldGFkYXRhID0gTlVMTDsKKwlzdHJ1Y3QgdGNfdHVubmVsX2tleSAqcGFybTsKKwlzdHJ1Y3QgdGNmX3R1bm5lbF9rZXkgKnQ7CisJYm9vbCBleGlzdHMgPSBmYWxzZTsKKwlfX2JlNjQga2V5X2lkOworCWludCByZXQgPSAwOworCWludCBlcnI7CisKKwlpZiAoIW5sYSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBubGFfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfVFVOTkVMX0tFWV9NQVgsIG5sYSwgdHVubmVsX2tleV9wb2xpY3kpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCF0YltUQ0FfVFVOTkVMX0tFWV9QQVJNU10pCisJCXJldHVybiAtRUlOVkFMOworCisJcGFybSA9IG5sYV9kYXRhKHRiW1RDQV9UVU5ORUxfS0VZX1BBUk1TXSk7CisJZXhpc3RzID0gdGNmX2hhc2hfY2hlY2sodG4sIHBhcm0tPmluZGV4LCBhLCBiaW5kKTsKKwlpZiAoZXhpc3RzICYmIGJpbmQpCisJCXJldHVybiAwOworCisJc3dpdGNoIChwYXJtLT50X2FjdGlvbikgeworCWNhc2UgVENBX1RVTk5FTF9LRVlfQUNUX1JFTEVBU0U6CisJCWJyZWFrOworCWNhc2UgVENBX1RVTk5FTF9LRVlfQUNUX1NFVDoKKwkJaWYgKCF0YltUQ0FfVFVOTkVMX0tFWV9FTkNfS0VZX0lEXSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCisJCWtleV9pZCA9IGtleTMyX3RvX3R1bm5lbF9pZChubGFfZ2V0X2JlMzIodGJbVENBX1RVTk5FTF9LRVlfRU5DX0tFWV9JRF0pKTsKKworCQlpZiAodGJbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjRfU1JDXSAmJgorCQkgICAgdGJbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjRfRFNUXSkgeworCQkJX19iZTMyIHNhZGRyOworCQkJX19iZTMyIGRhZGRyOworCisJCQlzYWRkciA9IG5sYV9nZXRfaW5fYWRkcih0YltUQ0FfVFVOTkVMX0tFWV9FTkNfSVBWNF9TUkNdKTsKKwkJCWRhZGRyID0gbmxhX2dldF9pbl9hZGRyKHRiW1RDQV9UVU5ORUxfS0VZX0VOQ19JUFY0X0RTVF0pOworCisJCQltZXRhZGF0YSA9IF9faXBfdHVuX3NldF9kc3Qoc2FkZHIsIGRhZGRyLCAwLCAwLAorCQkJCQkJICAgIFRVTk5FTF9LRVksIGtleV9pZCwgMCk7CisJCX0gZWxzZSBpZiAodGJbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfU1JDXSAmJgorCQkJICAgdGJbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfRFNUXSkgeworCQkJc3RydWN0IGluNl9hZGRyIHNhZGRyOworCQkJc3RydWN0IGluNl9hZGRyIGRhZGRyOworCisJCQlzYWRkciA9IG5sYV9nZXRfaW42X2FkZHIodGJbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfU1JDXSk7CisJCQlkYWRkciA9IG5sYV9nZXRfaW42X2FkZHIodGJbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfRFNUXSk7CisKKwkJCW1ldGFkYXRhID0gX19pcHY2X3R1bl9zZXRfZHN0KCZzYWRkciwgJmRhZGRyLCAwLCAwLCAwLAorCQkJCQkJICAgICAgVFVOTkVMX0tFWSwga2V5X2lkLCAwKTsKKwkJfQorCisJCWlmICghbWV0YWRhdGEpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKworCQltZXRhZGF0YS0+dS50dW5faW5mby5tb2RlIHw9IElQX1RVTk5FTF9JTkZPX1RYOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGVycl9vdXQ7CisJfQorCisJaWYgKCFleGlzdHMpIHsKKwkJcmV0ID0gdGNmX2hhc2hfY3JlYXRlKHRuLCBwYXJtLT5pbmRleCwgZXN0LCBhLAorCQkJCSAgICAgICZhY3RfdHVubmVsX2tleV9vcHMsIGJpbmQsIHRydWUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBBQ1RfUF9DUkVBVEVEOworCX0gZWxzZSB7CisJCXRjZl9oYXNoX3JlbGVhc2UoKmEsIGJpbmQpOworCQlpZiAoIW92cikKKwkJCXJldHVybiAtRUVYSVNUOworCX0KKworCXQgPSB0b190dW5uZWxfa2V5KCphKTsKKworCUFTU0VSVF9SVE5MKCk7CisJcGFyYW1zX25ldyA9IGt6YWxsb2Moc2l6ZW9mKCpwYXJhbXNfbmV3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFwYXJhbXNfbmV3KSkgeworCQlpZiAocmV0ID09IEFDVF9QX0NSRUFURUQpCisJCQl0Y2ZfaGFzaF9yZWxlYXNlKCphLCBiaW5kKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGFyYW1zX29sZCA9IHJ0bmxfZGVyZWZlcmVuY2UodC0+cGFyYW1zKTsKKworCXBhcmFtc19uZXctPmFjdGlvbiA9IHBhcm0tPmFjdGlvbjsKKwlwYXJhbXNfbmV3LT50Y2Z0X2FjdGlvbiA9IHBhcm0tPnRfYWN0aW9uOworCXBhcmFtc19uZXctPnRjZnRfZW5jX21ldGFkYXRhID0gbWV0YWRhdGE7CisKKwlyY3VfYXNzaWduX3BvaW50ZXIodC0+cGFyYW1zLCBwYXJhbXNfbmV3KTsKKworCWlmIChwYXJhbXNfb2xkKQorCQlrZnJlZV9yY3UocGFyYW1zX29sZCwgcmN1KTsKKworCWlmIChyZXQgPT0gQUNUX1BfQ1JFQVRFRCkKKwkJdGNmX2hhc2hfaW5zZXJ0KHRuLCAqYSk7CisKKwlyZXR1cm4gcmV0OworCitlcnJfb3V0OgorCWlmIChleGlzdHMpCisJCXRjZl9oYXNoX3JlbGVhc2UoKmEsIGJpbmQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHR1bm5lbF9rZXlfcmVsZWFzZShzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCkKK3sKKwlzdHJ1Y3QgdGNmX3R1bm5lbF9rZXkgKnQgPSB0b190dW5uZWxfa2V5KGEpOworCXN0cnVjdCB0Y2ZfdHVubmVsX2tleV9wYXJhbXMgKnBhcmFtczsKKworCXBhcmFtcyA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQodC0+cGFyYW1zLCAxKTsKKworCWlmIChwYXJhbXMtPnRjZnRfYWN0aW9uID09IFRDQV9UVU5ORUxfS0VZX0FDVF9TRVQpCisJCWRzdF9yZWxlYXNlKCZwYXJhbXMtPnRjZnRfZW5jX21ldGFkYXRhLT5kc3QpOworCisJa2ZyZWVfcmN1KHBhcmFtcywgcmN1KTsKK30KKworc3RhdGljIGludCB0dW5uZWxfa2V5X2R1bXBfYWRkcmVzc2VzKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgaXBfdHVubmVsX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgc2hvcnQgZmFtaWx5ID0gaXBfdHVubmVsX2luZm9fYWYoaW5mbyk7CisKKwlpZiAoZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJX19iZTMyIHNhZGRyID0gaW5mby0+a2V5LnUuaXB2NC5zcmM7CisJCV9fYmUzMiBkYWRkciA9IGluZm8tPmtleS51LmlwdjQuZHN0OworCisJCWlmICghbmxhX3B1dF9pbl9hZGRyKHNrYiwgVENBX1RVTk5FTF9LRVlfRU5DX0lQVjRfU1JDLCBzYWRkcikgJiYKKwkJICAgICFubGFfcHV0X2luX2FkZHIoc2tiLCBUQ0FfVFVOTkVMX0tFWV9FTkNfSVBWNF9EU1QsIGRhZGRyKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkcjYgPSAmaW5mby0+a2V5LnUuaXB2Ni5zcmM7CisJCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHI2ID0gJmluZm8tPmtleS51LmlwdjYuZHN0OworCisJCWlmICghbmxhX3B1dF9pbjZfYWRkcihza2IsCisJCQkJICAgICAgVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfU1JDLCBzYWRkcjYpICYmCisJCSAgICAhbmxhX3B1dF9pbjZfYWRkcihza2IsCisJCQkJICAgICAgVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfRFNULCBkYWRkcjYpKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdHVubmVsX2tleV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsCisJCQkgICBpbnQgYmluZCwgaW50IHJlZikKK3sKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOworCXN0cnVjdCB0Y2ZfdHVubmVsX2tleSAqdCA9IHRvX3R1bm5lbF9rZXkoYSk7CisJc3RydWN0IHRjZl90dW5uZWxfa2V5X3BhcmFtcyAqcGFyYW1zOworCXN0cnVjdCB0Y190dW5uZWxfa2V5IG9wdCA9IHsKKwkJLmluZGV4ICAgID0gdC0+dGNmX2luZGV4LAorCQkucmVmY250ICAgPSB0LT50Y2ZfcmVmY250IC0gcmVmLAorCQkuYmluZGNudCAgPSB0LT50Y2ZfYmluZGNudCAtIGJpbmQsCisJfTsKKwlzdHJ1Y3QgdGNmX3QgdG07CisKKwlwYXJhbXMgPSBydG5sX2RlcmVmZXJlbmNlKHQtPnBhcmFtcyk7CisKKwlvcHQudF9hY3Rpb24gPSBwYXJhbXMtPnRjZnRfYWN0aW9uOworCW9wdC5hY3Rpb24gPSBwYXJhbXMtPmFjdGlvbjsKKworCWlmIChubGFfcHV0KHNrYiwgVENBX1RVTk5FTF9LRVlfUEFSTVMsIHNpemVvZihvcHQpLCAmb3B0KSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAocGFyYW1zLT50Y2Z0X2FjdGlvbiA9PSBUQ0FfVFVOTkVMX0tFWV9BQ1RfU0VUKSB7CisJCXN0cnVjdCBpcF90dW5uZWxfa2V5ICprZXkgPQorCQkJJnBhcmFtcy0+dGNmdF9lbmNfbWV0YWRhdGEtPnUudHVuX2luZm8ua2V5OworCQlfX2JlMzIga2V5X2lkID0gdHVubmVsX2lkX3RvX2tleTMyKGtleS0+dHVuX2lkKTsKKworCQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgVENBX1RVTk5FTF9LRVlfRU5DX0tFWV9JRCwga2V5X2lkKSB8fAorCQkgICAgdHVubmVsX2tleV9kdW1wX2FkZHJlc3Nlcyhza2IsCisJCQkJCSAgICAgICZwYXJhbXMtPnRjZnRfZW5jX21ldGFkYXRhLT51LnR1bl9pbmZvKSkKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCX0KKworCXRjZl90bV9kdW1wKCZ0bSwgJnQtPnRjZl90bSk7CisJaWYgKG5sYV9wdXRfNjRiaXQoc2tiLCBUQ0FfVFVOTkVMX0tFWV9UTSwgc2l6ZW9mKHRtKSwKKwkJCSAgJnRtLCBUQ0FfVFVOTkVMX0tFWV9QQUQpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCXJldHVybiBza2ItPmxlbjsKKworbmxhX3B1dF9mYWlsdXJlOgorCW5sbXNnX3RyaW0oc2tiLCBiKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdHVubmVsX2tleV93YWxrZXIoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsIGludCB0eXBlLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgdGNfYWN0aW9uX29wcyAqb3BzKQoreworCXN0cnVjdCB0Y19hY3Rpb25fbmV0ICp0biA9IG5ldF9nZW5lcmljKG5ldCwgdHVubmVsX2tleV9uZXRfaWQpOworCisJcmV0dXJuIHRjZl9nZW5lcmljX3dhbGtlcih0biwgc2tiLCBjYiwgdHlwZSwgb3BzKTsKK30KKworc3RhdGljIGludCB0dW5uZWxfa2V5X3NlYXJjaChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0Y19hY3Rpb24gKiphLCB1MzIgaW5kZXgpCit7CisJc3RydWN0IHRjX2FjdGlvbl9uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCB0dW5uZWxfa2V5X25ldF9pZCk7CisKKwlyZXR1cm4gdGNmX2hhc2hfc2VhcmNoKHRuLCBhLCBpbmRleCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNfYWN0aW9uX29wcyBhY3RfdHVubmVsX2tleV9vcHMgPSB7CisJLmtpbmQJCT0JInR1bm5lbF9rZXkiLAorCS50eXBlCQk9CVRDQV9BQ1RfVFVOTkVMX0tFWSwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCisJLmFjdAkJPQl0dW5uZWxfa2V5X2FjdCwKKwkuZHVtcAkJPQl0dW5uZWxfa2V5X2R1bXAsCisJLmluaXQJCT0JdHVubmVsX2tleV9pbml0LAorCS5jbGVhbnVwCT0JdHVubmVsX2tleV9yZWxlYXNlLAorCS53YWxrCQk9CXR1bm5lbF9rZXlfd2Fsa2VyLAorCS5sb29rdXAJCT0JdHVubmVsX2tleV9zZWFyY2gsCisJLnNpemUJCT0Jc2l6ZW9mKHN0cnVjdCB0Y2ZfdHVubmVsX2tleSksCit9OworCitzdGF0aWMgX19uZXRfaW5pdCBpbnQgdHVubmVsX2tleV9pbml0X25ldChzdHJ1Y3QgbmV0ICpuZXQpCit7CisJc3RydWN0IHRjX2FjdGlvbl9uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCB0dW5uZWxfa2V5X25ldF9pZCk7CisKKwlyZXR1cm4gdGNfYWN0aW9uX25ldF9pbml0KHRuLCAmYWN0X3R1bm5lbF9rZXlfb3BzLCBUVU5ORUxfS0VZX1RBQl9NQVNLKTsKK30KKworc3RhdGljIHZvaWQgX19uZXRfZXhpdCB0dW5uZWxfa2V5X2V4aXRfbmV0KHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlzdHJ1Y3QgdGNfYWN0aW9uX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHR1bm5lbF9rZXlfbmV0X2lkKTsKKworCXRjX2FjdGlvbl9uZXRfZXhpdCh0bik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGVybmV0X29wZXJhdGlvbnMgdHVubmVsX2tleV9uZXRfb3BzID0geworCS5pbml0ID0gdHVubmVsX2tleV9pbml0X25ldCwKKwkuZXhpdCA9IHR1bm5lbF9rZXlfZXhpdF9uZXQsCisJLmlkICAgPSAmdHVubmVsX2tleV9uZXRfaWQsCisJLnNpemUgPSBzaXplb2Yoc3RydWN0IHRjX2FjdGlvbl9uZXQpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHVubmVsX2tleV9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiB0Y2ZfcmVnaXN0ZXJfYWN0aW9uKCZhY3RfdHVubmVsX2tleV9vcHMsICZ0dW5uZWxfa2V5X25ldF9vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdHVubmVsX2tleV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXRjZl91bnJlZ2lzdGVyX2FjdGlvbigmYWN0X3R1bm5lbF9rZXlfb3BzLCAmdHVubmVsX2tleV9uZXRfb3BzKTsKK30KKworbW9kdWxlX2luaXQodHVubmVsX2tleV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdCh0dW5uZWxfa2V5X2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0FVVEhPUigiQW1pciBWYWRhaSA8YW1pckB2YWRhaS5tZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXAgdHVubmVsIG1hbmlwdWxhdGlvbiBhY3Rpb25zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X3ZsYW4uYyBiL25ldC9zY2hlZC9hY3Rfdmxhbi5jCmluZGV4IDY5MTQwOWQuLmI1N2ZjYmMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3Rfdmxhbi5jCisrKyBiL25ldC9zY2hlZC9hY3Rfdmxhbi5jCkBAIC0zMCwxMiArMzAsMTkgQEAKIAlzdHJ1Y3QgdGNmX3ZsYW4gKnYgPSB0b192bGFuKGEpOwogCWludCBhY3Rpb247CiAJaW50IGVycjsKKwl1MTYgdGNpOwogCiAJc3Bpbl9sb2NrKCZ2LT50Y2ZfbG9jayk7CiAJdGNmX2xhc3R1c2VfdXBkYXRlKCZ2LT50Y2ZfdG0pOwogCWJzdGF0c191cGRhdGUoJnYtPnRjZl9ic3RhdHMsIHNrYik7CiAJYWN0aW9uID0gdi0+dGNmX2FjdGlvbjsKIAorCS8qIEVuc3VyZSAnZGF0YScgcG9pbnRzIGF0IG1hY19oZWFkZXIgcHJpb3IgY2FsbGluZyB2bGFuIG1hbmlwdWxhdGluZworCSAqIGZ1bmN0aW9ucy4KKwkgKi8KKwlpZiAoc2tiX2F0X3RjX2luZ3Jlc3Moc2tiKSkKKwkJc2tiX3B1c2hfcmNzdW0oc2tiLCBza2ItPm1hY19sZW4pOworCiAJc3dpdGNoICh2LT50Y2Z2X2FjdGlvbikgewogCWNhc2UgVENBX1ZMQU5fQUNUX1BPUDoKIAkJZXJyID0gc2tiX3ZsYW5fcG9wKHNrYik7CkBAIC00MywxMCArNTAsMzUgQEAKIAkJCWdvdG8gZHJvcDsKIAkJYnJlYWs7CiAJY2FzZSBUQ0FfVkxBTl9BQ1RfUFVTSDoKLQkJZXJyID0gc2tiX3ZsYW5fcHVzaChza2IsIHYtPnRjZnZfcHVzaF9wcm90bywgdi0+dGNmdl9wdXNoX3ZpZCk7CisJCWVyciA9IHNrYl92bGFuX3B1c2goc2tiLCB2LT50Y2Z2X3B1c2hfcHJvdG8sIHYtPnRjZnZfcHVzaF92aWQgfAorCQkJCSAgICAodi0+dGNmdl9wdXNoX3ByaW8gPDwgVkxBTl9QUklPX1NISUZUKSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGRyb3A7CiAJCWJyZWFrOworCWNhc2UgVENBX1ZMQU5fQUNUX01PRElGWToKKwkJLyogTm8tb3AgaWYgbm8gdmxhbiB0YWcgKGVpdGhlciBody1hY2NlbCBvciBpbi1wYXlsb2FkKSAqLworCQlpZiAoIXNrYl92bGFuX3RhZ2dlZChza2IpKQorCQkJZ290byB1bmxvY2s7CisJCS8qIGV4dHJhY3QgZXhpc3RpbmcgdGFnIChhbmQgZ3VhcmFudGVlIG5vIGh3LWFjY2VsIHRhZykgKi8KKwkJaWYgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpIHsKKwkJCXRjaSA9IHNrYl92bGFuX3RhZ19nZXQoc2tiKTsKKwkJCXNrYi0+dmxhbl90Y2kgPSAwOworCQl9IGVsc2UgeworCQkJLyogaW4tcGF5bG9hZCB2bGFuIHRhZywgcG9wIGl0ICovCisJCQllcnIgPSBfX3NrYl92bGFuX3BvcChza2IsICZ0Y2kpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGRyb3A7CisJCX0KKwkJLyogcmVwbGFjZSB0aGUgdmlkICovCisJCXRjaSA9ICh0Y2kgJiB+VkxBTl9WSURfTUFTSykgfCB2LT50Y2Z2X3B1c2hfdmlkOworCQkvKiByZXBsYWNlIHByaW8gYml0cywgaWYgdGNmdl9wdXNoX3ByaW8gc3BlY2lmaWVkICovCisJCWlmICh2LT50Y2Z2X3B1c2hfcHJpbykgeworCQkJdGNpICY9IH5WTEFOX1BSSU9fTUFTSzsKKwkJCXRjaSB8PSB2LT50Y2Z2X3B1c2hfcHJpbyA8PCBWTEFOX1BSSU9fU0hJRlQ7CisJCX0KKwkJLyogcHV0IHVwZGF0ZWQgdGNpIGFzIGh3YWNjZWwgdGFnICovCisJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2LT50Y2Z2X3B1c2hfcHJvdG8sIHRjaSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KQEAgLTU3LDYgKzg5LDkgQEAKIAlhY3Rpb24gPSBUQ19BQ1RfU0hPVDsKIAl2LT50Y2ZfcXN0YXRzLmRyb3BzKys7CiB1bmxvY2s6CisJaWYgKHNrYl9hdF90Y19pbmdyZXNzKHNrYikpCisJCXNrYl9wdWxsX3Jjc3VtKHNrYiwgc2tiLT5tYWNfbGVuKTsKKwogCXNwaW5fdW5sb2NrKCZ2LT50Y2ZfbG9jayk7CiAJcmV0dXJuIGFjdGlvbjsKIH0KQEAgLTY1LDYgKzEwMCw3IEBACiAJW1RDQV9WTEFOX1BBUk1TXQkJPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IHRjX3ZsYW4pIH0sCiAJW1RDQV9WTEFOX1BVU0hfVkxBTl9JRF0JCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKIAlbVENBX1ZMQU5fUFVTSF9WTEFOX1BST1RPQ09MXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW1RDQV9WTEFOX1BVU0hfVkxBTl9QUklPUklUWV0JPSB7IC50eXBlID0gTkxBX1U4IH0sCiB9OwogCiBzdGF0aWMgaW50IHRjZl92bGFuX2luaXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmxhdHRyICpubGEsCkBAIC03OCw2ICsxMTQsNyBAQAogCWludCBhY3Rpb247CiAJX19iZTE2IHB1c2hfdmlkID0gMDsKIAlfX2JlMTYgcHVzaF9wcm90byA9IDA7CisJdTggcHVzaF9wcmlvID0gMDsKIAlib29sIGV4aXN0cyA9IGZhbHNlOwogCWludCByZXQgPSAwLCBlcnI7CiAKQEAgLTk5LDYgKzEzNiw3IEBACiAJY2FzZSBUQ0FfVkxBTl9BQ1RfUE9QOgogCQlicmVhazsKIAljYXNlIFRDQV9WTEFOX0FDVF9QVVNIOgorCWNhc2UgVENBX1ZMQU5fQUNUX01PRElGWToKIAkJaWYgKCF0YltUQ0FfVkxBTl9QVVNIX1ZMQU5fSURdKSB7CiAJCQlpZiAoZXhpc3RzKQogCQkJCXRjZl9oYXNoX3JlbGVhc2UoKmEsIGJpbmQpOwpAQCAtMTIzLDYgKzE2MSw5IEBACiAJCX0gZWxzZSB7CiAJCQlwdXNoX3Byb3RvID0gaHRvbnMoRVRIX1BfODAyMVEpOwogCQl9CisKKwkJaWYgKHRiW1RDQV9WTEFOX1BVU0hfVkxBTl9QUklPUklUWV0pCisJCQlwdXNoX3ByaW8gPSBubGFfZ2V0X3U4KHRiW1RDQV9WTEFOX1BVU0hfVkxBTl9QUklPUklUWV0pOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlpZiAoZXhpc3RzKQpAQCAtMTUwLDYgKzE5MSw3IEBACiAKIAl2LT50Y2Z2X2FjdGlvbiA9IGFjdGlvbjsKIAl2LT50Y2Z2X3B1c2hfdmlkID0gcHVzaF92aWQ7CisJdi0+dGNmdl9wdXNoX3ByaW8gPSBwdXNoX3ByaW87CiAJdi0+dGNmdl9wdXNoX3Byb3RvID0gcHVzaF9wcm90bzsKIAogCXYtPnRjZl9hY3Rpb24gPSBwYXJtLT5hY3Rpb247CkBAIC0xNzgsMTAgKzIyMCwxMyBAQAogCWlmIChubGFfcHV0KHNrYiwgVENBX1ZMQU5fUEFSTVMsIHNpemVvZihvcHQpLCAmb3B0KSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQlpZiAodi0+dGNmdl9hY3Rpb24gPT0gVENBX1ZMQU5fQUNUX1BVU0ggJiYKKwlpZiAoKHYtPnRjZnZfYWN0aW9uID09IFRDQV9WTEFOX0FDVF9QVVNIIHx8CisJICAgICB2LT50Y2Z2X2FjdGlvbiA9PSBUQ0FfVkxBTl9BQ1RfTU9ESUZZKSAmJgogCSAgICAobmxhX3B1dF91MTYoc2tiLCBUQ0FfVkxBTl9QVVNIX1ZMQU5fSUQsIHYtPnRjZnZfcHVzaF92aWQpIHx8CiAJICAgICBubGFfcHV0X2JlMTYoc2tiLCBUQ0FfVkxBTl9QVVNIX1ZMQU5fUFJPVE9DT0wsCi0JCQkgIHYtPnRjZnZfcHVzaF9wcm90bykpKQorCQkJICB2LT50Y2Z2X3B1c2hfcHJvdG8pIHx8CisJICAgICAobmxhX3B1dF91OChza2IsIFRDQV9WTEFOX1BVU0hfVkxBTl9QUklPUklUWSwKKwkJCQkJICAgICAgdi0+dGNmdl9wdXNoX3ByaW8pKSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJdGNmX3RtX2R1bXAoJnQsICZ2LT50Y2ZfdG0pOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19hcGkuYyBiL25ldC9zY2hlZC9jbHNfYXBpLmMKaW5kZXggODQzYTcxNi4uMTFkYTdkYSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19hcGkuYworKysgYi9uZXQvc2NoZWQvY2xzX2FwaS5jCkBAIC0zNDQsMTMgKzM0NCwxNSBAQAogCQkJaWYgKGVyciA9PSAwKSB7CiAJCQkJc3RydWN0IHRjZl9wcm90byAqbmV4dCA9IHJ0bmxfZGVyZWZlcmVuY2UodHAtPm5leHQpOwogCi0JCQkJdGZpbHRlcl9ub3RpZnkobmV0LCBza2IsIG4sIHRwLCBmaCwgUlRNX0RFTFRGSUxURVIpOworCQkJCXRmaWx0ZXJfbm90aWZ5KG5ldCwgc2tiLCBuLCB0cCwgZmgsCisJCQkJCSAgICAgICBSVE1fREVMVEZJTFRFUik7CiAJCQkJaWYgKHRjZl9kZXN0cm95KHRwLCBmYWxzZSkpCiAJCQkJCVJDVV9JTklUX1BPSU5URVIoKmJhY2ssIG5leHQpOwogCQkJfQogCQkJZ290byBlcnJvdXQ7CiAJCWNhc2UgUlRNX0dFVFRGSUxURVI6Ci0JCQllcnIgPSB0ZmlsdGVyX25vdGlmeShuZXQsIHNrYiwgbiwgdHAsIGZoLCBSVE1fTkVXVEZJTFRFUik7CisJCQllcnIgPSB0ZmlsdGVyX25vdGlmeShuZXQsIHNrYiwgbiwgdHAsIGZoLAorCQkJCQkgICAgIFJUTV9ORVdURklMVEVSKTsKIAkJCWdvdG8gZXJyb3V0OwogCQlkZWZhdWx0OgogCQkJZXJyID0gLUVJTlZBTDsKQEAgLTQ0OCw3ICs0NTAsOCBAQAogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KGEtPnNrYi0+c2spOwogCiAJcmV0dXJuIHRjZl9maWxsX25vZGUobmV0LCBhLT5za2IsIHRwLCBuLCBORVRMSU5LX0NCKGEtPmNiLT5za2IpLnBvcnRpZCwKLQkJCSAgICAgYS0+Y2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwgUlRNX05FV1RGSUxURVIpOworCQkJICAgICBhLT5jYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLAorCQkJICAgICBSVE1fTkVXVEZJTFRFUik7CiB9CiAKIC8qIGNhbGxlZCB3aXRoIFJUTkwgKi8KQEAgLTU0MSwzNiArNTQ0LDQ0IEBACiB2b2lkIHRjZl9leHRzX2Rlc3Ryb3koc3RydWN0IHRjZl9leHRzICpleHRzKQogewogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAotCXRjZl9hY3Rpb25fZGVzdHJveSgmZXh0cy0+YWN0aW9ucywgVENBX0FDVF9VTkJJTkQpOwotCUlOSVRfTElTVF9IRUFEKCZleHRzLT5hY3Rpb25zKTsKKwlMSVNUX0hFQUQoYWN0aW9ucyk7CisKKwl0Y2ZfZXh0c190b19saXN0KGV4dHMsICZhY3Rpb25zKTsKKwl0Y2ZfYWN0aW9uX2Rlc3Ryb3koJmFjdGlvbnMsIFRDQV9BQ1RfVU5CSU5EKTsKKwlrZnJlZShleHRzLT5hY3Rpb25zKTsKKwlleHRzLT5ucl9hY3Rpb25zID0gMDsKICNlbmRpZgogfQogRVhQT1JUX1NZTUJPTCh0Y2ZfZXh0c19kZXN0cm95KTsKIAogaW50IHRjZl9leHRzX3ZhbGlkYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCBubGF0dHIgKip0YiwKLQkJICBzdHJ1Y3QgbmxhdHRyICpyYXRlX3Rsdiwgc3RydWN0IHRjZl9leHRzICpleHRzLCBib29sIG92cikKKwkJICAgICAgc3RydWN0IG5sYXR0ciAqcmF0ZV90bHYsIHN0cnVjdCB0Y2ZfZXh0cyAqZXh0cywgYm9vbCBvdnIpCiB7CiAjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCiAJewogCQlzdHJ1Y3QgdGNfYWN0aW9uICphY3Q7CiAKLQkJSU5JVF9MSVNUX0hFQUQoJmV4dHMtPmFjdGlvbnMpOwogCQlpZiAoZXh0cy0+cG9saWNlICYmIHRiW2V4dHMtPnBvbGljZV0pIHsKIAkJCWFjdCA9IHRjZl9hY3Rpb25faW5pdF8xKG5ldCwgdGJbZXh0cy0+cG9saWNlXSwgcmF0ZV90bHYsCi0JCQkJCQkicG9saWNlIiwgb3ZyLAotCQkJCQkJVENBX0FDVF9CSU5EKTsKKwkJCQkJCSJwb2xpY2UiLCBvdnIsIFRDQV9BQ1RfQklORCk7CiAJCQlpZiAoSVNfRVJSKGFjdCkpCiAJCQkJcmV0dXJuIFBUUl9FUlIoYWN0KTsKIAogCQkJYWN0LT50eXBlID0gZXh0cy0+dHlwZSA9IFRDQV9PTERfQ09NUEFUOwotCQkJbGlzdF9hZGQoJmFjdC0+bGlzdCwgJmV4dHMtPmFjdGlvbnMpOworCQkJZXh0cy0+YWN0aW9uc1swXSA9IGFjdDsKKwkJCWV4dHMtPm5yX2FjdGlvbnMgPSAxOwogCQl9IGVsc2UgaWYgKGV4dHMtPmFjdGlvbiAmJiB0YltleHRzLT5hY3Rpb25dKSB7Ci0JCQlpbnQgZXJyOworCQkJTElTVF9IRUFEKGFjdGlvbnMpOworCQkJaW50IGVyciwgaSA9IDA7CisKIAkJCWVyciA9IHRjZl9hY3Rpb25faW5pdChuZXQsIHRiW2V4dHMtPmFjdGlvbl0sIHJhdGVfdGx2LAotCQkJCQkgICAgICBOVUxMLCBvdnIsCi0JCQkJCSAgICAgIFRDQV9BQ1RfQklORCwgJmV4dHMtPmFjdGlvbnMpOworCQkJCQkgICAgICBOVUxMLCBvdnIsIFRDQV9BQ1RfQklORCwKKwkJCQkJICAgICAgJmFjdGlvbnMpOwogCQkJaWYgKGVycikKIAkJCQlyZXR1cm4gZXJyOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShhY3QsICZhY3Rpb25zLCBsaXN0KQorCQkJCWV4dHMtPmFjdGlvbnNbaSsrXSA9IGFjdDsKKwkJCWV4dHMtPm5yX2FjdGlvbnMgPSBpOwogCQl9CiAJfQogI2Vsc2UKQEAgLTU4NywzNyArNTk4LDQ5IEBACiAJCSAgICAgc3RydWN0IHRjZl9leHRzICpzcmMpCiB7CiAjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCi0JTElTVF9IRUFEKHRtcCk7CisJc3RydWN0IHRjZl9leHRzIG9sZCA9ICpkc3Q7CisKIAl0Y2ZfdHJlZV9sb2NrKHRwKTsKLQlsaXN0X3NwbGljZV9pbml0KCZkc3QtPmFjdGlvbnMsICZ0bXApOwotCWxpc3Rfc3BsaWNlKCZzcmMtPmFjdGlvbnMsICZkc3QtPmFjdGlvbnMpOworCWRzdC0+bnJfYWN0aW9ucyA9IHNyYy0+bnJfYWN0aW9uczsKKwlkc3QtPmFjdGlvbnMgPSBzcmMtPmFjdGlvbnM7CiAJZHN0LT50eXBlID0gc3JjLT50eXBlOwogCXRjZl90cmVlX3VubG9jayh0cCk7Ci0JdGNmX2FjdGlvbl9kZXN0cm95KCZ0bXAsIFRDQV9BQ1RfVU5CSU5EKTsKKworCXRjZl9leHRzX2Rlc3Ryb3koJm9sZCk7CiAjZW5kaWYKIH0KIEVYUE9SVF9TWU1CT0wodGNmX2V4dHNfY2hhbmdlKTsKIAotI2RlZmluZSB0Y2ZfZXh0c19maXJzdF9hY3QoZXh0KQkJCQkJXAotCWxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmKGV4dHMpLT5hY3Rpb25zLAkJXAotCQkJCSBzdHJ1Y3QgdGNfYWN0aW9uLCBsaXN0KQorI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAorc3RhdGljIHN0cnVjdCB0Y19hY3Rpb24gKnRjZl9leHRzX2ZpcnN0X2FjdChzdHJ1Y3QgdGNmX2V4dHMgKmV4dHMpCit7CisJaWYgKGV4dHMtPm5yX2FjdGlvbnMgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJZWxzZQorCQlyZXR1cm4gZXh0cy0+YWN0aW9uc1swXTsKK30KKyNlbmRpZgogCiBpbnQgdGNmX2V4dHNfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX2V4dHMgKmV4dHMpCiB7CiAjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCiAJc3RydWN0IG5sYXR0ciAqbmVzdDsKIAotCWlmIChleHRzLT5hY3Rpb24gJiYgIWxpc3RfZW1wdHkoJmV4dHMtPmFjdGlvbnMpKSB7CisJaWYgKGV4dHMtPmFjdGlvbiAmJiBleHRzLT5ucl9hY3Rpb25zKSB7CiAJCS8qCiAJCSAqIGFnYWluIGZvciBiYWNrd2FyZCBjb21wYXRpYmxlIG1vZGUgLSB3ZSB3YW50CiAJCSAqIHRvIHdvcmsgd2l0aCBib3RoIG9sZCBhbmQgbmV3IG1vZGVzIG9mIGVudGVyaW5nCiAJCSAqIHRjIGRhdGEgZXZlbiBpZiBpcHJvdXRlMiAgd2FzIG5ld2VyIC0gamhzCiAJCSAqLwogCQlpZiAoZXh0cy0+dHlwZSAhPSBUQ0FfT0xEX0NPTVBBVCkgeworCQkJTElTVF9IRUFEKGFjdGlvbnMpOworCiAJCQluZXN0ID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBleHRzLT5hY3Rpb24pOwogCQkJaWYgKG5lc3QgPT0gTlVMTCkKIAkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQkJCWlmICh0Y2ZfYWN0aW9uX2R1bXAoc2tiLCAmZXh0cy0+YWN0aW9ucywgMCwgMCkgPCAwKQorCisJCQl0Y2ZfZXh0c190b19saXN0KGV4dHMsICZhY3Rpb25zKTsKKwkJCWlmICh0Y2ZfYWN0aW9uX2R1bXAoc2tiLCAmYWN0aW9ucywgMCwgMCkgPCAwKQogCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCQkJbmxhX25lc3RfZW5kKHNrYiwgbmVzdCk7CiAJCX0gZWxzZSBpZiAoZXh0cy0+cG9saWNlKSB7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2Jhc2ljLmMgYi9uZXQvc2NoZWQvY2xzX2Jhc2ljLmMKaW5kZXggMGI4YzNhYy4uZWIyMTliNyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19iYXNpYy5jCisrKyBiL25ldC9zY2hlZC9jbHNfYmFzaWMuYwpAQCAtMTM4LDEwICsxMzgsMTIgQEAKIAlzdHJ1Y3QgdGNmX2V4dHMgZTsKIAlzdHJ1Y3QgdGNmX2VtYXRjaF90cmVlIHQ7CiAKLQl0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfQkFTSUNfQUNULCBUQ0FfQkFTSUNfUE9MSUNFKTsKLQllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZSwgb3ZyKTsKKwllcnIgPSB0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfQkFTSUNfQUNULCBUQ0FfQkFTSUNfUE9MSUNFKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKKwllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZSwgb3ZyKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSB0Y2ZfZW1fdHJlZV92YWxpZGF0ZSh0cCwgdGJbVENBX0JBU0lDX0VNQVRDSEVTXSwgJnQpOwogCWlmIChlcnIgPCAwKQpAQCAtMTg5LDcgKzE5MSwxMCBAQAogCWlmICghZm5ldykKIAkJcmV0dXJuIC1FTk9CVUZTOwogCi0JdGNmX2V4dHNfaW5pdCgmZm5ldy0+ZXh0cywgVENBX0JBU0lDX0FDVCwgVENBX0JBU0lDX1BPTElDRSk7CisJZXJyID0gdGNmX2V4dHNfaW5pdCgmZm5ldy0+ZXh0cywgVENBX0JBU0lDX0FDVCwgVENBX0JBU0lDX1BPTElDRSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OworCiAJZXJyID0gLUVJTlZBTDsKIAlpZiAoaGFuZGxlKSB7CiAJCWZuZXctPmhhbmRsZSA9IGhhbmRsZTsKQEAgLTIyNiw2ICsyMzEsNyBAQAogCiAJcmV0dXJuIDA7CiBlcnJvdXQ6CisJdGNmX2V4dHNfZGVzdHJveSgmZm5ldy0+ZXh0cyk7CiAJa2ZyZWUoZm5ldyk7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfYnBmLmMgYi9uZXQvc2NoZWQvY2xzX2JwZi5jCmluZGV4IGMzMDAyYzIuLmJiMWQ1YTQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfYnBmLmMKKysrIGIvbmV0L3NjaGVkL2Nsc19icGYuYwpAQCAtMjcsNiArMjcsOCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJUQyBCUEYgYmFzZWQgY2xhc3NpZmllciIpOwogCiAjZGVmaW5lIENMU19CUEZfTkFNRV9MRU4JMjU2CisjZGVmaW5lIENMU19CUEZfU1VQUE9SVEVEX0dFTl9GTEFHUwkJXAorCShUQ0FfQ0xTX0ZMQUdTX1NLSVBfSFcgfCBUQ0FfQ0xTX0ZMQUdTX1NLSVBfU1cpCiAKIHN0cnVjdCBjbHNfYnBmX2hlYWQgewogCXN0cnVjdCBsaXN0X2hlYWQgcGxpc3Q7CkBAIC0zOSw2ICs0MSw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaW5rOwogCXN0cnVjdCB0Y2ZfcmVzdWx0IHJlczsKIAlib29sIGV4dHNfaW50ZWdyYXRlZDsKKwlib29sIG9mZmxvYWRlZDsKKwl1MzIgZ2VuX2ZsYWdzOwogCXN0cnVjdCB0Y2ZfZXh0cyBleHRzOwogCXUzMiBoYW5kbGU7CiAJdW5pb24gewpAQCAtNTQsOCArNTgsMTAgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBicGZfcG9saWN5W1RDQV9CUEZfTUFYICsgMV0gPSB7CiAJW1RDQV9CUEZfQ0xBU1NJRF0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtUQ0FfQlBGX0ZMQUdTXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtUQ0FfQlBGX0ZMQUdTX0dFTl0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtUQ0FfQlBGX0ZEXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAotCVtUQ0FfQlBGX05BTUVdCQk9IHsgLnR5cGUgPSBOTEFfTlVMX1NUUklORywgLmxlbiA9IENMU19CUEZfTkFNRV9MRU4gfSwKKwlbVENBX0JQRl9OQU1FXQkJPSB7IC50eXBlID0gTkxBX05VTF9TVFJJTkcsCisJCQkJICAgIC5sZW4gPSBDTFNfQlBGX05BTUVfTEVOIH0sCiAJW1RDQV9CUEZfT1BTX0xFTl0JPSB7IC50eXBlID0gTkxBX1UxNiB9LAogCVtUQ0FfQlBGX09QU10JCT0geyAudHlwZSA9IE5MQV9CSU5BUlksCiAJCQkJICAgIC5sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2tfZmlsdGVyKSAqIEJQRl9NQVhJTlNOUyB9LApAQCAtODMsOSArODksNiBAQAogCXN0cnVjdCBjbHNfYnBmX3Byb2cgKnByb2c7CiAJaW50IHJldCA9IC0xOwogCi0JaWYgKHVubGlrZWx5KCFza2JfbWFjX2hlYWRlcl93YXNfc2V0KHNrYikpKQotCQlyZXR1cm4gLTE7Ci0KIAkvKiBOZWVkZWQgaGVyZSBmb3IgYWNjZXNzaW5nIG1hcHMuICovCiAJcmN1X3JlYWRfbG9jaygpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHByb2csICZoZWFkLT5wbGlzdCwgbGluaykgewpAQCAtOTMsNyArOTYsOSBAQAogCiAJCXFkaXNjX3NrYl9jYihza2IpLT50Y19jbGFzc2lkID0gcHJvZy0+cmVzLmNsYXNzaWQ7CiAKLQkJaWYgKGF0X2luZ3Jlc3MpIHsKKwkJaWYgKHRjX3NraXBfc3cocHJvZy0+Z2VuX2ZsYWdzKSkgeworCQkJZmlsdGVyX3JlcyA9IHByb2ctPmV4dHNfaW50ZWdyYXRlZCA/IFRDX0FDVF9VTlNQRUMgOiAwOworCQl9IGVsc2UgaWYgKGF0X2luZ3Jlc3MpIHsKIAkJCS8qIEl0IGlzIHNhZmUgdG8gcHVzaC9wdWxsIGV2ZW4gaWYgc2tiX3NoYXJlZCgpICovCiAJCQlfX3NrYl9wdXNoKHNrYiwgc2tiLT5tYWNfbGVuKTsKIAkJCWJwZl9jb21wdXRlX2RhdGFfZW5kKHNrYik7CkBAIC0xNDAsNiArMTQ1LDkxIEBACiAJcmV0dXJuICFwcm9nLT5icGZfb3BzOwogfQogCitzdGF0aWMgaW50IGNsc19icGZfb2ZmbG9hZF9jbWQoc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCBjbHNfYnBmX3Byb2cgKnByb2csCisJCQkgICAgICAgZW51bSB0Y19jbHNicGZfY29tbWFuZCBjbWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRwLT5xLT5kZXZfcXVldWUtPmRldjsKKwlzdHJ1Y3QgdGNfY2xzX2JwZl9vZmZsb2FkIGJwZl9vZmZsb2FkID0ge307CisJc3RydWN0IHRjX3RvX25ldGRldiBvZmZsb2FkOworCisJb2ZmbG9hZC50eXBlID0gVENfU0VUVVBfQ0xTQlBGOworCW9mZmxvYWQuY2xzX2JwZiA9ICZicGZfb2ZmbG9hZDsKKworCWJwZl9vZmZsb2FkLmNvbW1hbmQgPSBjbWQ7CisJYnBmX29mZmxvYWQuZXh0cyA9ICZwcm9nLT5leHRzOworCWJwZl9vZmZsb2FkLnByb2cgPSBwcm9nLT5maWx0ZXI7CisJYnBmX29mZmxvYWQubmFtZSA9IHByb2ctPmJwZl9uYW1lOworCWJwZl9vZmZsb2FkLmV4dHNfaW50ZWdyYXRlZCA9IHByb2ctPmV4dHNfaW50ZWdyYXRlZDsKKwlicGZfb2ZmbG9hZC5nZW5fZmxhZ3MgPSBwcm9nLT5nZW5fZmxhZ3M7CisKKwlyZXR1cm4gZGV2LT5uZXRkZXZfb3BzLT5uZG9fc2V0dXBfdGMoZGV2LCB0cC0+cS0+aGFuZGxlLAorCQkJCQkgICAgIHRwLT5wcm90b2NvbCwgJm9mZmxvYWQpOworfQorCitzdGF0aWMgaW50IGNsc19icGZfb2ZmbG9hZChzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgc3RydWN0IGNsc19icGZfcHJvZyAqcHJvZywKKwkJCSAgIHN0cnVjdCBjbHNfYnBmX3Byb2cgKm9sZHByb2cpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRwLT5xLT5kZXZfcXVldWUtPmRldjsKKwlzdHJ1Y3QgY2xzX2JwZl9wcm9nICpvYmogPSBwcm9nOworCWVudW0gdGNfY2xzYnBmX2NvbW1hbmQgY21kOworCWJvb2wgc2tpcF9zdzsKKwlpbnQgcmV0OworCisJc2tpcF9zdyA9IHRjX3NraXBfc3cocHJvZy0+Z2VuX2ZsYWdzKSB8fAorCQkob2xkcHJvZyAmJiB0Y19za2lwX3N3KG9sZHByb2ctPmdlbl9mbGFncykpOworCisJaWYgKG9sZHByb2cgJiYgb2xkcHJvZy0+b2ZmbG9hZGVkKSB7CisJCWlmICh0Y19zaG91bGRfb2ZmbG9hZChkZXYsIHRwLCBwcm9nLT5nZW5fZmxhZ3MpKSB7CisJCQljbWQgPSBUQ19DTFNCUEZfUkVQTEFDRTsKKwkJfSBlbHNlIGlmICghdGNfc2tpcF9zdyhwcm9nLT5nZW5fZmxhZ3MpKSB7CisJCQlvYmogPSBvbGRwcm9nOworCQkJY21kID0gVENfQ0xTQlBGX0RFU1RST1k7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghdGNfc2hvdWxkX29mZmxvYWQoZGV2LCB0cCwgcHJvZy0+Z2VuX2ZsYWdzKSkKKwkJCXJldHVybiBza2lwX3N3ID8gLUVJTlZBTCA6IDA7CisJCWNtZCA9IFRDX0NMU0JQRl9BREQ7CisJfQorCisJcmV0ID0gY2xzX2JwZl9vZmZsb2FkX2NtZCh0cCwgb2JqLCBjbWQpOworCWlmIChyZXQpCisJCXJldHVybiBza2lwX3N3ID8gcmV0IDogMDsKKworCW9iai0+b2ZmbG9hZGVkID0gdHJ1ZTsKKwlpZiAob2xkcHJvZykKKwkJb2xkcHJvZy0+b2ZmbG9hZGVkID0gZmFsc2U7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xzX2JwZl9zdG9wX29mZmxvYWQoc3RydWN0IHRjZl9wcm90byAqdHAsCisJCQkJIHN0cnVjdCBjbHNfYnBmX3Byb2cgKnByb2cpCit7CisJaW50IGVycjsKKworCWlmICghcHJvZy0+b2ZmbG9hZGVkKQorCQlyZXR1cm47CisKKwllcnIgPSBjbHNfYnBmX29mZmxvYWRfY21kKHRwLCBwcm9nLCBUQ19DTFNCUEZfREVTVFJPWSk7CisJaWYgKGVycikgeworCQlwcl9lcnIoIlN0b3BwaW5nIGhhcmR3YXJlIG9mZmxvYWQgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuOworCX0KKworCXByb2ctPm9mZmxvYWRlZCA9IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBjbHNfYnBmX29mZmxvYWRfdXBkYXRlX3N0YXRzKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAorCQkJCQkgc3RydWN0IGNsc19icGZfcHJvZyAqcHJvZykKK3sKKwlpZiAoIXByb2ctPm9mZmxvYWRlZCkKKwkJcmV0dXJuOworCisJY2xzX2JwZl9vZmZsb2FkX2NtZCh0cCwgcHJvZywgVENfQ0xTQlBGX1NUQVRTKTsKK30KKwogc3RhdGljIGludCBjbHNfYnBmX2luaXQoc3RydWN0IHRjZl9wcm90byAqdHApCiB7CiAJc3RydWN0IGNsc19icGZfaGVhZCAqaGVhZDsKQEAgLTE3OSw2ICsyNjksNyBAQAogewogCXN0cnVjdCBjbHNfYnBmX3Byb2cgKnByb2cgPSAoc3RydWN0IGNsc19icGZfcHJvZyAqKSBhcmc7CiAKKwljbHNfYnBmX3N0b3Bfb2ZmbG9hZCh0cCwgcHJvZyk7CiAJbGlzdF9kZWxfcmN1KCZwcm9nLT5saW5rKTsKIAl0Y2ZfdW5iaW5kX2ZpbHRlcih0cCwgJnByb2ctPnJlcyk7CiAJY2FsbF9yY3UoJnByb2ctPnJjdSwgX19jbHNfYnBmX2RlbGV0ZV9wcm9nKTsKQEAgLTE5NSw2ICsyODYsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHJvZywgdG1wLCAmaGVhZC0+cGxpc3QsIGxpbmspIHsKKwkJY2xzX2JwZl9zdG9wX29mZmxvYWQodHAsIHByb2cpOwogCQlsaXN0X2RlbF9yY3UoJnByb2ctPmxpbmspOwogCQl0Y2ZfdW5iaW5kX2ZpbHRlcih0cCwgJnByb2ctPnJlcyk7CiAJCWNhbGxfcmN1KCZwcm9nLT5yY3UsIF9fY2xzX2JwZl9kZWxldGVfcHJvZyk7CkBAIC0zMDQsNiArMzk2LDcgQEAKIHsKIAlib29sIGlzX2JwZiwgaXNfZWJwZiwgaGF2ZV9leHRzID0gZmFsc2U7CiAJc3RydWN0IHRjZl9leHRzIGV4dHM7CisJdTMyIGdlbl9mbGFncyA9IDA7CiAJaW50IHJldDsKIAogCWlzX2JwZiA9IHRiW1RDQV9CUEZfT1BTX0xFTl0gJiYgdGJbVENBX0JQRl9PUFNdOwpAQCAtMzExLDMwICs0MDQsMzkgQEAKIAlpZiAoKCFpc19icGYgJiYgIWlzX2VicGYpIHx8IChpc19icGYgJiYgaXNfZWJwZikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdGNmX2V4dHNfaW5pdCgmZXh0cywgVENBX0JQRl9BQ1QsIFRDQV9CUEZfUE9MSUNFKTsKLQlyZXQgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZXh0cywgb3ZyKTsKKwlyZXQgPSB0Y2ZfZXh0c19pbml0KCZleHRzLCBUQ0FfQlBGX0FDVCwgVENBX0JQRl9QT0xJQ0UpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OworCXJldCA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZleHRzLCBvdnIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm91dDsKIAogCWlmICh0YltUQ0FfQlBGX0ZMQUdTXSkgewogCQl1MzIgYnBmX2ZsYWdzID0gbmxhX2dldF91MzIodGJbVENBX0JQRl9GTEFHU10pOwogCiAJCWlmIChicGZfZmxhZ3MgJiB+VENBX0JQRl9GTEFHX0FDVF9ESVJFQ1QpIHsKLQkJCXRjZl9leHRzX2Rlc3Ryb3koJmV4dHMpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvdXQ7CiAJCX0KIAogCQloYXZlX2V4dHMgPSBicGZfZmxhZ3MgJiBUQ0FfQlBGX0ZMQUdfQUNUX0RJUkVDVDsKIAl9CisJaWYgKHRiW1RDQV9CUEZfRkxBR1NfR0VOXSkgeworCQlnZW5fZmxhZ3MgPSBubGFfZ2V0X3UzMih0YltUQ0FfQlBGX0ZMQUdTX0dFTl0pOworCQlpZiAoZ2VuX2ZsYWdzICYgfkNMU19CUEZfU1VQUE9SVEVEX0dFTl9GTEFHUyB8fAorCQkgICAgIXRjX2ZsYWdzX3ZhbGlkKGdlbl9mbGFncykpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCX0KIAogCXByb2ctPmV4dHNfaW50ZWdyYXRlZCA9IGhhdmVfZXh0czsKKwlwcm9nLT5nZW5fZmxhZ3MgPSBnZW5fZmxhZ3M7CiAKIAlyZXQgPSBpc19icGYgPyBjbHNfYnBmX3Byb2dfZnJvbV9vcHModGIsIHByb2cpIDoKIAkJICAgICAgIGNsc19icGZfcHJvZ19mcm9tX2VmZCh0YiwgcHJvZywgdHApOwotCWlmIChyZXQgPCAwKSB7Ci0JCXRjZl9leHRzX2Rlc3Ryb3koJmV4dHMpOwotCQlyZXR1cm4gcmV0OwotCX0KKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvdXQ7CiAKIAlpZiAodGJbVENBX0JQRl9DTEFTU0lEXSkgewogCQlwcm9nLT5yZXMuY2xhc3NpZCA9IG5sYV9nZXRfdTMyKHRiW1RDQV9CUEZfQ0xBU1NJRF0pOwpAQCAtMzQzLDYgKzQ0NSwxMCBAQAogCiAJdGNmX2V4dHNfY2hhbmdlKHRwLCAmcHJvZy0+ZXh0cywgJmV4dHMpOwogCXJldHVybiAwOworCitlcnJvdXQ6CisJdGNmX2V4dHNfZGVzdHJveSgmZXh0cyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHUzMiBjbHNfYnBmX2dyYWJfbmV3X2hhbmRsZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKQEAgLTM4OCw3ICs0OTQsOSBAQAogCWlmICghcHJvZykKIAkJcmV0dXJuIC1FTk9CVUZTOwogCi0JdGNmX2V4dHNfaW5pdCgmcHJvZy0+ZXh0cywgVENBX0JQRl9BQ1QsIFRDQV9CUEZfUE9MSUNFKTsKKwlyZXQgPSB0Y2ZfZXh0c19pbml0KCZwcm9nLT5leHRzLCBUQ0FfQlBGX0FDVCwgVENBX0JQRl9QT0xJQ0UpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm91dDsKIAogCWlmIChvbGRwcm9nKSB7CiAJCWlmIChoYW5kbGUgJiYgb2xkcHJvZy0+aGFuZGxlICE9IGhhbmRsZSkgewpAQCAtNDA2LDEwICs1MTQsMTcgQEAKIAkJZ290byBlcnJvdXQ7CiAJfQogCi0JcmV0ID0gY2xzX2JwZl9tb2RpZnlfZXhpc3RpbmcobmV0LCB0cCwgcHJvZywgYmFzZSwgdGIsIHRjYVtUQ0FfUkFURV0sIG92cik7CisJcmV0ID0gY2xzX2JwZl9tb2RpZnlfZXhpc3RpbmcobmV0LCB0cCwgcHJvZywgYmFzZSwgdGIsIHRjYVtUQ0FfUkFURV0sCisJCQkJICAgICAgb3ZyKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvdXQ7CiAKKwlyZXQgPSBjbHNfYnBmX29mZmxvYWQodHAsIHByb2csIG9sZHByb2cpOworCWlmIChyZXQpIHsKKwkJY2xzX2JwZl9kZWxldGVfcHJvZyh0cCwgcHJvZyk7CisJCXJldHVybiByZXQ7CisJfQorCiAJaWYgKG9sZHByb2cpIHsKIAkJbGlzdF9yZXBsYWNlX3JjdSgmb2xkcHJvZy0+bGluaywgJnByb2ctPmxpbmspOwogCQl0Y2ZfdW5iaW5kX2ZpbHRlcih0cCwgJm9sZHByb2ctPnJlcyk7CkBAIC00MjAsOSArNTM1LDEwIEBACiAKIAkqYXJnID0gKHVuc2lnbmVkIGxvbmcpIHByb2c7CiAJcmV0dXJuIDA7Ci1lcnJvdXQ6Ci0Ja2ZyZWUocHJvZyk7CiAKK2Vycm91dDoKKwl0Y2ZfZXh0c19kZXN0cm95KCZwcm9nLT5leHRzKTsKKwlrZnJlZShwcm9nKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00NzAsNiArNTg2LDggQEAKIAogCXRtLT50Y21faGFuZGxlID0gcHJvZy0+aGFuZGxlOwogCisJY2xzX2JwZl9vZmZsb2FkX3VwZGF0ZV9zdGF0cyh0cCwgcHJvZyk7CisKIAluZXN0ID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBUQ0FfT1BUSU9OUyk7CiAJaWYgKG5lc3QgPT0gTlVMTCkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CkBAIC00OTIsNiArNjEwLDkgQEAKIAkJYnBmX2ZsYWdzIHw9IFRDQV9CUEZfRkxBR19BQ1RfRElSRUNUOwogCWlmIChicGZfZmxhZ3MgJiYgbmxhX3B1dF91MzIoc2tiLCBUQ0FfQlBGX0ZMQUdTLCBicGZfZmxhZ3MpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAocHJvZy0+Z2VuX2ZsYWdzICYmCisJICAgIG5sYV9wdXRfdTMyKHNrYiwgVENBX0JQRl9GTEFHU19HRU4sIHByb2ctPmdlbl9mbGFncykpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJbmxhX25lc3RfZW5kKHNrYiwgbmVzdCk7CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfY2dyb3VwLmMgYi9uZXQvc2NoZWQvY2xzX2Nncm91cC5jCmluZGV4IDRjODViZDMuLjg1MjMzYzQ3IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2Nncm91cC5jCisrKyBiL25ldC9zY2hlZC9jbHNfY2dyb3VwLmMKQEAgLTkzLDcgKzkzLDkgQEAKIAlpZiAoIW5ldykKIAkJcmV0dXJuIC1FTk9CVUZTOwogCi0JdGNmX2V4dHNfaW5pdCgmbmV3LT5leHRzLCBUQ0FfQ0dST1VQX0FDVCwgVENBX0NHUk9VUF9QT0xJQ0UpOworCWVyciA9IHRjZl9leHRzX2luaXQoJm5ldy0+ZXh0cywgVENBX0NHUk9VUF9BQ1QsIFRDQV9DR1JPVVBfUE9MSUNFKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvdXQ7CiAJbmV3LT5oYW5kbGUgPSBoYW5kbGU7CiAJbmV3LT50cCA9IHRwOwogCWVyciA9IG5sYV9wYXJzZV9uZXN0ZWQodGIsIFRDQV9DR1JPVVBfTUFYLCB0Y2FbVENBX09QVElPTlNdLApAQCAtMTAxLDEwICsxMDMsMTQgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJvdXQ7CiAKLQl0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfQ0dST1VQX0FDVCwgVENBX0NHUk9VUF9QT0xJQ0UpOwotCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCB0Y2FbVENBX1JBVEVdLCAmZSwgb3ZyKTsKKwllcnIgPSB0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfQ0dST1VQX0FDVCwgVENBX0NHUk9VUF9QT0xJQ0UpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm91dDsKKwllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgdGNhW1RDQV9SQVRFXSwgJmUsIG92cik7CisJaWYgKGVyciA8IDApIHsKKwkJdGNmX2V4dHNfZGVzdHJveSgmZSk7CisJCWdvdG8gZXJyb3V0OworCX0KIAogCWVyciA9IHRjZl9lbV90cmVlX3ZhbGlkYXRlKHRwLCB0YltUQ0FfQ0dST1VQX0VNQVRDSEVTXSwgJnQpOwogCWlmIChlcnIgPCAwKSB7CkBAIC0xMjAsNiArMTI2LDcgQEAKIAkJY2FsbF9yY3UoJmhlYWQtPnJjdSwgY2xzX2Nncm91cF9kZXN0cm95X3JjdSk7CiAJcmV0dXJuIDA7CiBlcnJvdXQ6CisJdGNmX2V4dHNfZGVzdHJveSgmbmV3LT5leHRzKTsKIAlrZnJlZShuZXcpOwogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2Zsb3cuYyBiL25ldC9zY2hlZC9jbHNfZmxvdy5jCmluZGV4IGZiZmVjNmEuLmUzOTY3MjMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfZmxvdy5jCisrKyBiL25ldC9zY2hlZC9jbHNfZmxvdy5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L2Zsb3dfZGlzc2VjdG9yLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfQ09OTlRSQUNLKQogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CiAjZW5kaWYKIApAQCAtODcsMTIgKzg3LDE0IEBACiAJcmV0dXJuIGFkZHJfZm9sZChza2JfZHN0KHNrYikpIF4gKF9fZm9yY2UgdTE2KSB0Y19za2JfcHJvdG9jb2woc2tiKTsKIH0KIAotc3RhdGljIHUzMiBmbG93X2dldF9wcm90byhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQorc3RhdGljIHUzMiBmbG93X2dldF9wcm90byhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQogewogCXJldHVybiBmbG93LT5iYXNpYy5pcF9wcm90bzsKIH0KIAotc3RhdGljIHUzMiBmbG93X2dldF9wcm90b19zcmMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKK3N0YXRpYyB1MzIgZmxvd19nZXRfcHJvdG9fc3JjKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQogewogCWlmIChmbG93LT5wb3J0cy5wb3J0cykKIAkJcmV0dXJuIG50b2hzKGZsb3ctPnBvcnRzLnNyYyk7CkBAIC0xMDAsNyArMTAyLDggQEAKIAlyZXR1cm4gYWRkcl9mb2xkKHNrYi0+c2spOwogfQogCi1zdGF0aWMgdTMyIGZsb3dfZ2V0X3Byb3RvX2RzdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQorc3RhdGljIHUzMiBmbG93X2dldF9wcm90b19kc3QoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCiB7CiAJaWYgKGZsb3ctPnBvcnRzLnBvcnRzKQogCQlyZXR1cm4gbnRvaHMoZmxvdy0+cG9ydHMuZHN0KTsKQEAgLTEyNSwxNCArMTI4LDE0IEBACiAKIHN0YXRpYyB1MzIgZmxvd19nZXRfbmZjdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19ORl9DT05OVFJBQ0spCiAJcmV0dXJuIGFkZHJfZm9sZChza2ItPm5mY3QpOwogI2Vsc2UKIAlyZXR1cm4gMDsKICNlbmRpZgogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX05GX0NPTk5UUkFDSykKICNkZWZpbmUgQ1RUVVBMRShza2IsIG1lbWJlcikJCQkJCQlcCiAoewkJCQkJCQkJCVwKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsJCQkJCVwKQEAgLTE0OSw3ICsxNTIsOCBAQAogfSkKICNlbmRpZgogCi1zdGF0aWMgdTMyIGZsb3dfZ2V0X25mY3Rfc3JjKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCitzdGF0aWMgdTMyIGZsb3dfZ2V0X25mY3Rfc3JjKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCiB7CiAJc3dpdGNoICh0Y19za2JfcHJvdG9jb2woc2tiKSkgewogCWNhc2UgaHRvbnMoRVRIX1BfSVApOgpAQCAtMTYxLDcgKzE2NSw4IEBACiAJcmV0dXJuIGZsb3dfZ2V0X3NyYyhza2IsIGZsb3cpOwogfQogCi1zdGF0aWMgdTMyIGZsb3dfZ2V0X25mY3RfZHN0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCitzdGF0aWMgdTMyIGZsb3dfZ2V0X25mY3RfZHN0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCiB7CiAJc3dpdGNoICh0Y19za2JfcHJvdG9jb2woc2tiKSkgewogCWNhc2UgaHRvbnMoRVRIX1BfSVApOgpAQCAtMTczLDE0ICsxNzgsMTYgQEAKIAlyZXR1cm4gZmxvd19nZXRfZHN0KHNrYiwgZmxvdyk7CiB9CiAKLXN0YXRpYyB1MzIgZmxvd19nZXRfbmZjdF9wcm90b19zcmMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKK3N0YXRpYyB1MzIgZmxvd19nZXRfbmZjdF9wcm90b19zcmMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQogewogCXJldHVybiBudG9ocyhDVFRVUExFKHNrYiwgc3JjLnUuYWxsKSk7CiBmYWxsYmFjazoKIAlyZXR1cm4gZmxvd19nZXRfcHJvdG9fc3JjKHNrYiwgZmxvdyk7CiB9CiAKLXN0YXRpYyB1MzIgZmxvd19nZXRfbmZjdF9wcm90b19kc3QoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKK3N0YXRpYyB1MzIgZmxvd19nZXRfbmZjdF9wcm90b19kc3QoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQogewogCXJldHVybiBudG9ocyhDVFRVUExFKHNrYiwgZHN0LnUuYWxsKSk7CiBmYWxsYmFjazoKQEAgLTQxOCwxMCArNDI1LDEyIEBACiAJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCi0JdGNmX2V4dHNfaW5pdCgmZSwgVENBX0ZMT1dfQUNULCBUQ0FfRkxPV19QT0xJQ0UpOworCWVyciA9IHRjZl9leHRzX2luaXQoJmUsIFRDQV9GTE9XX0FDVCwgVENBX0ZMT1dfUE9MSUNFKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnIxOwogCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCB0Y2FbVENBX1JBVEVdLCAmZSwgb3ZyKTsKIAlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwkJZ290byBlcnIxOwogCiAJZXJyID0gdGNmX2VtX3RyZWVfdmFsaWRhdGUodHAsIHRiW1RDQV9GTE9XX0VNQVRDSEVTXSwgJnQpOwogCWlmIChlcnIgPCAwKQpAQCAtNDMyLDEzICs0NDEsMTUgQEAKIAlpZiAoIWZuZXcpCiAJCWdvdG8gZXJyMjsKIAotCXRjZl9leHRzX2luaXQoJmZuZXctPmV4dHMsIFRDQV9GTE9XX0FDVCwgVENBX0ZMT1dfUE9MSUNFKTsKKwllcnIgPSB0Y2ZfZXh0c19pbml0KCZmbmV3LT5leHRzLCBUQ0FfRkxPV19BQ1QsIFRDQV9GTE9XX1BPTElDRSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyMzsKIAogCWZvbGQgPSAoc3RydWN0IGZsb3dfZmlsdGVyICopKmFyZzsKIAlpZiAoZm9sZCkgewogCQllcnIgPSAtRUlOVkFMOwogCQlpZiAoZm9sZC0+aGFuZGxlICE9IGhhbmRsZSAmJiBoYW5kbGUpCi0JCQlnb3RvIGVycjI7CisJCQlnb3RvIGVycjM7CiAKIAkJLyogQ29weSBmb2xkIGludG8gZm5ldyAqLwogCQlmbmV3LT50cCA9IGZvbGQtPnRwOwpAQCAtNDU4LDMxICs0NjksMzEgQEAKIAkJaWYgKHRiW1RDQV9GTE9XX01PREVdKQogCQkJbW9kZSA9IG5sYV9nZXRfdTMyKHRiW1RDQV9GTE9XX01PREVdKTsKIAkJaWYgKG1vZGUgIT0gRkxPV19NT0RFX0hBU0ggJiYgbmtleXMgPiAxKQotCQkJZ290byBlcnIyOworCQkJZ290byBlcnIzOwogCiAJCWlmIChtb2RlID09IEZMT1dfTU9ERV9IQVNIKQogCQkJcGVydHVyYl9wZXJpb2QgPSBmb2xkLT5wZXJ0dXJiX3BlcmlvZDsKIAkJaWYgKHRiW1RDQV9GTE9XX1BFUlRVUkJdKSB7CiAJCQlpZiAobW9kZSAhPSBGTE9XX01PREVfSEFTSCkKLQkJCQlnb3RvIGVycjI7CisJCQkJZ290byBlcnIzOwogCQkJcGVydHVyYl9wZXJpb2QgPSBubGFfZ2V0X3UzMih0YltUQ0FfRkxPV19QRVJUVVJCXSkgKiBIWjsKIAkJfQogCX0gZWxzZSB7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWlmICghaGFuZGxlKQotCQkJZ290byBlcnIyOworCQkJZ290byBlcnIzOwogCQlpZiAoIXRiW1RDQV9GTE9XX0tFWVNdKQotCQkJZ290byBlcnIyOworCQkJZ290byBlcnIzOwogCiAJCW1vZGUgPSBGTE9XX01PREVfTUFQOwogCQlpZiAodGJbVENBX0ZMT1dfTU9ERV0pCiAJCQltb2RlID0gbmxhX2dldF91MzIodGJbVENBX0ZMT1dfTU9ERV0pOwogCQlpZiAobW9kZSAhPSBGTE9XX01PREVfSEFTSCAmJiBua2V5cyA+IDEpCi0JCQlnb3RvIGVycjI7CisJCQlnb3RvIGVycjM7CiAKIAkJaWYgKHRiW1RDQV9GTE9XX1BFUlRVUkJdKSB7CiAJCQlpZiAobW9kZSAhPSBGTE9XX01PREVfSEFTSCkKLQkJCQlnb3RvIGVycjI7CisJCQkJZ290byBlcnIzOwogCQkJcGVydHVyYl9wZXJpb2QgPSBubGFfZ2V0X3UzMih0YltUQ0FfRkxPV19QRVJUVVJCXSkgKiBIWjsKIAkJfQogCkBAIC01NDIsNiArNTUzLDggQEAKIAkJY2FsbF9yY3UoJmZvbGQtPnJjdSwgZmxvd19kZXN0cm95X2ZpbHRlcik7CiAJcmV0dXJuIDA7CiAKK2VycjM6CisJdGNmX2V4dHNfZGVzdHJveSgmZm5ldy0+ZXh0cyk7CiBlcnIyOgogCXRjZl9lbV90cmVlX2Rlc3Ryb3koJnQpOwogCWtmcmVlKGZuZXcpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19mbG93ZXIuYyBiL25ldC9zY2hlZC9jbHNfZmxvd2VyLmMKaW5kZXggNTA2MDgwMS4uZjZmNDBmYiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19mbG93ZXIuYworKysgYi9uZXQvc2NoZWQvY2xzX2Zsb3dlci5jCkBAIC0yMywxNyArMjMsMjYgQEAKICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvZmxvd19kaXNzZWN0b3IuaD4KIAorI2luY2x1ZGUgPG5ldC9kc3QuaD4KKyNpbmNsdWRlIDxuZXQvZHN0X21ldGFkYXRhLmg+CisKIHN0cnVjdCBmbF9mbG93X2tleSB7CiAJaW50CWluZGV2X2lmaW5kZXg7CiAJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9jb250cm9sIGNvbnRyb2w7CisJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9jb250cm9sIGVuY19jb250cm9sOwogCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfYmFzaWMgYmFzaWM7CiAJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9ldGhfYWRkcnMgZXRoOwotCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfYWRkcnMgaXBhZGRyczsKKwlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3ZsYW4gdmxhbjsKIAl1bmlvbiB7CiAJCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfaXB2NF9hZGRycyBpcHY0OwogCQlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2lwdjZfYWRkcnMgaXB2NjsKIAl9OwogCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfcG9ydHMgdHA7CisJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9rZXlpZCBlbmNfa2V5X2lkOworCXVuaW9uIHsKKwkJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9pcHY0X2FkZHJzIGVuY19pcHY0OworCQlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2lwdjZfYWRkcnMgZW5jX2lwdjY7CisJfTsKIH0gX19hbGlnbmVkKEJJVFNfUEVSX0xPTkcgLyA4KTsgLyogRW5zdXJlIHRoYXQgd2UgY2FuIGRvIGNvbXBhcmlzb25zIGFzIGxvbmdzLiAqLwogCiBzdHJ1Y3QgZmxfZmxvd19tYXNrX3JhbmdlIHsKQEAgLTEyMywxMSArMTMyLDMxIEBACiAJc3RydWN0IGNsc19mbF9maWx0ZXIgKmY7CiAJc3RydWN0IGZsX2Zsb3dfa2V5IHNrYl9rZXk7CiAJc3RydWN0IGZsX2Zsb3dfa2V5IHNrYl9ta2V5OworCXN0cnVjdCBpcF90dW5uZWxfaW5mbyAqaW5mbzsKIAogCWlmICghYXRvbWljX3JlYWQoJmhlYWQtPmh0Lm5lbGVtcykpCiAJCXJldHVybiAtMTsKIAogCWZsX2NsZWFyX21hc2tlZF9yYW5nZSgmc2tiX2tleSwgJmhlYWQtPm1hc2spOworCisJaW5mbyA9IHNrYl90dW5uZWxfaW5mbyhza2IpOworCWlmIChpbmZvKSB7CisJCXN0cnVjdCBpcF90dW5uZWxfa2V5ICprZXkgPSAmaW5mby0+a2V5OworCisJCXN3aXRjaCAoaXBfdHVubmVsX2luZm9fYWYoaW5mbykpIHsKKwkJY2FzZSBBRl9JTkVUOgorCQkJc2tiX2tleS5lbmNfaXB2NC5zcmMgPSBrZXktPnUuaXB2NC5zcmM7CisJCQlza2Jfa2V5LmVuY19pcHY0LmRzdCA9IGtleS0+dS5pcHY0LmRzdDsKKwkJCWJyZWFrOworCQljYXNlIEFGX0lORVQ2OgorCQkJc2tiX2tleS5lbmNfaXB2Ni5zcmMgPSBrZXktPnUuaXB2Ni5zcmM7CisJCQlza2Jfa2V5LmVuY19pcHY2LmRzdCA9IGtleS0+dS5pcHY2LmRzdDsKKwkJCWJyZWFrOworCQl9CisKKwkJc2tiX2tleS5lbmNfa2V5X2lkLmtleWlkID0gdHVubmVsX2lkX3RvX2tleTMyKGtleS0+dHVuX2lkKTsKKwl9CisKIAlza2Jfa2V5LmluZGV2X2lmaW5kZXggPSBza2ItPnNrYl9paWY7CiAJLyogc2tiX2Zsb3dfZGlzc2VjdCgpIGRvZXMgbm90IHNldCBuX3Byb3RvIGluIGNhc2UgYW4gdW5rbm93biBwcm90b2NvbCwKIAkgKiBzbyBkbyBpdCByYXRoZXIgaGVyZS4KQEAgLTIxMiw3ICsyNDEsOCBAQAogCXRjLnR5cGUgPSBUQ19TRVRVUF9DTFNGTE9XRVI7CiAJdGMuY2xzX2Zsb3dlciA9ICZvZmZsb2FkOwogCi0JZXJyID0gZGV2LT5uZXRkZXZfb3BzLT5uZG9fc2V0dXBfdGMoZGV2LCB0cC0+cS0+aGFuZGxlLCB0cC0+cHJvdG9jb2wsICZ0Yyk7CisJZXJyID0gZGV2LT5uZXRkZXZfb3BzLT5uZG9fc2V0dXBfdGMoZGV2LCB0cC0+cS0+aGFuZGxlLCB0cC0+cHJvdG9jb2wsCisJCQkJCSAgICAmdGMpOwogCiAJaWYgKHRjX3NraXBfc3coZmxhZ3MpKQogCQlyZXR1cm4gZXJyOwpAQCAtMjkzLDYgKzMyMywyMiBAQAogCVtUQ0FfRkxPV0VSX0tFWV9UQ1BfRFNUXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiAJW1RDQV9GTE9XRVJfS0VZX1VEUF9TUkNdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKIAlbVENBX0ZMT1dFUl9LRVlfVURQX0RTVF0JPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtUQ0FfRkxPV0VSX0tFWV9WTEFOX0lEXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW1RDQV9GTE9XRVJfS0VZX1ZMQU5fUFJJT10JPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW1RDQV9GTE9XRVJfS0VZX1ZMQU5fRVRIX1RZUEVdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKKwlbVENBX0ZMT1dFUl9LRVlfRU5DX0tFWV9JRF0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9TUkNdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfU1JDX01BU0tdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfRFNUXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW1RDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X0RTVF9NQVNLXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW1RDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X1NSQ10JPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSB9LAorCVtUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9TUkNfTUFTS10gPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSB9LAorCVtUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9EU1RdCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikgfSwKKwlbVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjZfRFNUX01BU0tdID0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikgfSwKKwlbVENBX0ZMT1dFUl9LRVlfVENQX1NSQ19NQVNLXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW1RDQV9GTE9XRVJfS0VZX1RDUF9EU1RfTUFTS10JPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtUQ0FfRkxPV0VSX0tFWV9VRFBfU1JDX01BU0tdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKKwlbVENBX0ZMT1dFUl9LRVlfVURQX0RTVF9NQVNLXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiB9OwogCiBzdGF0aWMgdm9pZCBmbF9zZXRfa2V5X3ZhbChzdHJ1Y3QgbmxhdHRyICoqdGIsCkBAIC0zMDgsOSArMzU0LDI5IEBACiAJCW1lbWNweShtYXNrLCBubGFfZGF0YSh0YlttYXNrX3R5cGVdKSwgbGVuKTsKIH0KIAorc3RhdGljIHZvaWQgZmxfc2V0X2tleV92bGFuKHN0cnVjdCBubGF0dHIgKip0YiwKKwkJCSAgICBzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3ZsYW4gKmtleV92YWwsCisJCQkgICAgc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV92bGFuICprZXlfbWFzaykKK3sKKyNkZWZpbmUgVkxBTl9QUklPUklUWV9NQVNLCTB4NworCisJaWYgKHRiW1RDQV9GTE9XRVJfS0VZX1ZMQU5fSURdKSB7CisJCWtleV92YWwtPnZsYW5faWQgPQorCQkJbmxhX2dldF91MTYodGJbVENBX0ZMT1dFUl9LRVlfVkxBTl9JRF0pICYgVkxBTl9WSURfTUFTSzsKKwkJa2V5X21hc2stPnZsYW5faWQgPSBWTEFOX1ZJRF9NQVNLOworCX0KKwlpZiAodGJbVENBX0ZMT1dFUl9LRVlfVkxBTl9QUklPXSkgeworCQlrZXlfdmFsLT52bGFuX3ByaW9yaXR5ID0KKwkJCW5sYV9nZXRfdTgodGJbVENBX0ZMT1dFUl9LRVlfVkxBTl9QUklPXSkgJgorCQkJVkxBTl9QUklPUklUWV9NQVNLOworCQlrZXlfbWFzay0+dmxhbl9wcmlvcml0eSA9IFZMQU5fUFJJT1JJVFlfTUFTSzsKKwl9Cit9CisKIHN0YXRpYyBpbnQgZmxfc2V0X2tleShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBubGF0dHIgKip0YiwKIAkJICAgICAgc3RydWN0IGZsX2Zsb3dfa2V5ICprZXksIHN0cnVjdCBmbF9mbG93X2tleSAqbWFzaykKIHsKKwlfX2JlMTYgZXRoZXJ0eXBlOwogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0lORAogCWlmICh0YltUQ0FfRkxPV0VSX0lOREVWXSkgewogCQlpbnQgZXJyID0gdGNmX2NoYW5nZV9pbmRldihuZXQsIHRiW1RDQV9GTE9XRVJfSU5ERVZdKTsKQEAgLTMyOCw5ICszOTQsMjAgQEAKIAkJICAgICAgIG1hc2stPmV0aC5zcmMsIFRDQV9GTE9XRVJfS0VZX0VUSF9TUkNfTUFTSywKIAkJICAgICAgIHNpemVvZihrZXktPmV0aC5zcmMpKTsKIAotCWZsX3NldF9rZXlfdmFsKHRiLCAma2V5LT5iYXNpYy5uX3Byb3RvLCBUQ0FfRkxPV0VSX0tFWV9FVEhfVFlQRSwKLQkJICAgICAgICZtYXNrLT5iYXNpYy5uX3Byb3RvLCBUQ0FfRkxPV0VSX1VOU1BFQywKLQkJICAgICAgIHNpemVvZihrZXktPmJhc2ljLm5fcHJvdG8pKTsKKwlpZiAodGJbVENBX0ZMT1dFUl9LRVlfRVRIX1RZUEVdKSB7CisJCWV0aGVydHlwZSA9IG5sYV9nZXRfYmUxNih0YltUQ0FfRkxPV0VSX0tFWV9FVEhfVFlQRV0pOworCisJCWlmIChldGhlcnR5cGUgPT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CisJCQlmbF9zZXRfa2V5X3ZsYW4odGIsICZrZXktPnZsYW4sICZtYXNrLT52bGFuKTsKKwkJCWZsX3NldF9rZXlfdmFsKHRiLCAma2V5LT5iYXNpYy5uX3Byb3RvLAorCQkJCSAgICAgICBUQ0FfRkxPV0VSX0tFWV9WTEFOX0VUSF9UWVBFLAorCQkJCSAgICAgICAmbWFzay0+YmFzaWMubl9wcm90bywgVENBX0ZMT1dFUl9VTlNQRUMsCisJCQkJICAgICAgIHNpemVvZihrZXktPmJhc2ljLm5fcHJvdG8pKTsKKwkJfSBlbHNlIHsKKwkJCWtleS0+YmFzaWMubl9wcm90byA9IGV0aGVydHlwZTsKKwkJCW1hc2stPmJhc2ljLm5fcHJvdG8gPSBjcHVfdG9fYmUxNih+MCk7CisJCX0KKwl9CiAKIAlpZiAoa2V5LT5iYXNpYy5uX3Byb3RvID09IGh0b25zKEVUSF9QX0lQKSB8fAogCSAgICBrZXktPmJhc2ljLm5fcHJvdG8gPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKQEAgLTM1OSwyMCArNDM2LDU0IEBACiAKIAlpZiAoa2V5LT5iYXNpYy5pcF9wcm90byA9PSBJUFBST1RPX1RDUCkgewogCQlmbF9zZXRfa2V5X3ZhbCh0YiwgJmtleS0+dHAuc3JjLCBUQ0FfRkxPV0VSX0tFWV9UQ1BfU1JDLAotCQkJICAgICAgICZtYXNrLT50cC5zcmMsIFRDQV9GTE9XRVJfVU5TUEVDLAorCQkJICAgICAgICZtYXNrLT50cC5zcmMsIFRDQV9GTE9XRVJfS0VZX1RDUF9TUkNfTUFTSywKIAkJCSAgICAgICBzaXplb2Yoa2V5LT50cC5zcmMpKTsKIAkJZmxfc2V0X2tleV92YWwodGIsICZrZXktPnRwLmRzdCwgVENBX0ZMT1dFUl9LRVlfVENQX0RTVCwKLQkJCSAgICAgICAmbWFzay0+dHAuZHN0LCBUQ0FfRkxPV0VSX1VOU1BFQywKKwkJCSAgICAgICAmbWFzay0+dHAuZHN0LCBUQ0FfRkxPV0VSX0tFWV9UQ1BfRFNUX01BU0ssCiAJCQkgICAgICAgc2l6ZW9mKGtleS0+dHAuZHN0KSk7CiAJfSBlbHNlIGlmIChrZXktPmJhc2ljLmlwX3Byb3RvID09IElQUFJPVE9fVURQKSB7CiAJCWZsX3NldF9rZXlfdmFsKHRiLCAma2V5LT50cC5zcmMsIFRDQV9GTE9XRVJfS0VZX1VEUF9TUkMsCi0JCQkgICAgICAgJm1hc2stPnRwLnNyYywgVENBX0ZMT1dFUl9VTlNQRUMsCisJCQkgICAgICAgJm1hc2stPnRwLnNyYywgVENBX0ZMT1dFUl9LRVlfVURQX1NSQ19NQVNLLAogCQkJICAgICAgIHNpemVvZihrZXktPnRwLnNyYykpOwogCQlmbF9zZXRfa2V5X3ZhbCh0YiwgJmtleS0+dHAuZHN0LCBUQ0FfRkxPV0VSX0tFWV9VRFBfRFNULAotCQkJICAgICAgICZtYXNrLT50cC5kc3QsIFRDQV9GTE9XRVJfVU5TUEVDLAorCQkJICAgICAgICZtYXNrLT50cC5kc3QsIFRDQV9GTE9XRVJfS0VZX1VEUF9EU1RfTUFTSywKIAkJCSAgICAgICBzaXplb2Yoa2V5LT50cC5kc3QpKTsKIAl9CiAKKwlpZiAodGJbVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfU1JDXSB8fAorCSAgICB0YltUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9EU1RdKSB7CisJCWtleS0+ZW5jX2NvbnRyb2wuYWRkcl90eXBlID0gRkxPV19ESVNTRUNUT1JfS0VZX0lQVjRfQUREUlM7CisJCWZsX3NldF9rZXlfdmFsKHRiLCAma2V5LT5lbmNfaXB2NC5zcmMsCisJCQkgICAgICAgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfU1JDLAorCQkJICAgICAgICZtYXNrLT5lbmNfaXB2NC5zcmMsCisJCQkgICAgICAgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfU1JDX01BU0ssCisJCQkgICAgICAgc2l6ZW9mKGtleS0+ZW5jX2lwdjQuc3JjKSk7CisJCWZsX3NldF9rZXlfdmFsKHRiLCAma2V5LT5lbmNfaXB2NC5kc3QsCisJCQkgICAgICAgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfRFNULAorCQkJICAgICAgICZtYXNrLT5lbmNfaXB2NC5kc3QsCisJCQkgICAgICAgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfRFNUX01BU0ssCisJCQkgICAgICAgc2l6ZW9mKGtleS0+ZW5jX2lwdjQuZHN0KSk7CisJfQorCisJaWYgKHRiW1RDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X1NSQ10gfHwKKwkgICAgdGJbVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjZfRFNUXSkgeworCQlrZXktPmVuY19jb250cm9sLmFkZHJfdHlwZSA9IEZMT1dfRElTU0VDVE9SX0tFWV9JUFY2X0FERFJTOworCQlmbF9zZXRfa2V5X3ZhbCh0YiwgJmtleS0+ZW5jX2lwdjYuc3JjLAorCQkJICAgICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X1NSQywKKwkJCSAgICAgICAmbWFzay0+ZW5jX2lwdjYuc3JjLAorCQkJICAgICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X1NSQ19NQVNLLAorCQkJICAgICAgIHNpemVvZihrZXktPmVuY19pcHY2LnNyYykpOworCQlmbF9zZXRfa2V5X3ZhbCh0YiwgJmtleS0+ZW5jX2lwdjYuZHN0LAorCQkJICAgICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X0RTVCwKKwkJCSAgICAgICAmbWFzay0+ZW5jX2lwdjYuZHN0LAorCQkJICAgICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X0RTVF9NQVNLLAorCQkJICAgICAgIHNpemVvZihrZXktPmVuY19pcHY2LmRzdCkpOworCX0KKworCWZsX3NldF9rZXlfdmFsKHRiLCAma2V5LT5lbmNfa2V5X2lkLmtleWlkLCBUQ0FfRkxPV0VSX0tFWV9FTkNfS0VZX0lELAorCQkgICAgICAgJm1hc2stPmVuY19rZXlfaWQua2V5aWQsIFRDQV9GTE9XRVJfVU5TUEVDLAorCQkgICAgICAgc2l6ZW9mKGtleS0+ZW5jX2tleV9pZC5rZXlpZCkpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQwNCwxMiArNTE1LDEwIEBACiAKICNkZWZpbmUgRkxfS0VZX01FTUJFUl9PRkZTRVQobWVtYmVyKSBvZmZzZXRvZihzdHJ1Y3QgZmxfZmxvd19rZXksIG1lbWJlcikKICNkZWZpbmUgRkxfS0VZX01FTUJFUl9TSVpFKG1lbWJlcikgKHNpemVvZigoKHN0cnVjdCBmbF9mbG93X2tleSAqKSAwKS0+bWVtYmVyKSkKLSNkZWZpbmUgRkxfS0VZX01FTUJFUl9FTkRfT0ZGU0VUKG1lbWJlcikJCQkJCVwKLQkoRkxfS0VZX01FTUJFUl9PRkZTRVQobWVtYmVyKSArIEZMX0tFWV9NRU1CRVJfU0laRShtZW1iZXIpKQogCi0jZGVmaW5lIEZMX0tFWV9JTl9SQU5HRShtYXNrLCBtZW1iZXIpCQkJCQkJXAotICAgICAgICAoRkxfS0VZX01FTUJFUl9PRkZTRVQobWVtYmVyKSA8PSAobWFzayktPnJhbmdlLmVuZCAmJgkJCVwKLSAgICAgICAgIEZMX0tFWV9NRU1CRVJfRU5EX09GRlNFVChtZW1iZXIpID49IChtYXNrKS0+cmFuZ2Uuc3RhcnQpCisjZGVmaW5lIEZMX0tFWV9JU19NQVNLRUQobWFzaywgbWVtYmVyKQkJCQkJCVwKKwltZW1jaHJfaW52KCgoY2hhciAqKW1hc2spICsgRkxfS0VZX01FTUJFUl9PRkZTRVQobWVtYmVyKSwJCVwKKwkJICAgMCwgRkxfS0VZX01FTUJFUl9TSVpFKG1lbWJlcikpCQkJCVwKIAogI2RlZmluZSBGTF9LRVlfU0VUKGtleXMsIGNudCwgaWQsIG1lbWJlcikJCQkJCVwKIAlkbyB7CQkJCQkJCQkJXApAQCAtNDE4LDkgKzUyNyw5IEBACiAJCWNudCsrOwkJCQkJCQkJXAogCX0gd2hpbGUoMCk7CiAKLSNkZWZpbmUgRkxfS0VZX1NFVF9JRl9JTl9SQU5HRShtYXNrLCBrZXlzLCBjbnQsIGlkLCBtZW1iZXIpCQkJXAorI2RlZmluZSBGTF9LRVlfU0VUX0lGX01BU0tFRChtYXNrLCBrZXlzLCBjbnQsIGlkLCBtZW1iZXIpCQkJXAogCWRvIHsJCQkJCQkJCQlcCi0JCWlmIChGTF9LRVlfSU5fUkFOR0UobWFzaywgbWVtYmVyKSkJCQkJXAorCQlpZiAoRkxfS0VZX0lTX01BU0tFRChtYXNrLCBtZW1iZXIpKQkJCQlcCiAJCQlGTF9LRVlfU0VUKGtleXMsIGNudCwgaWQsIG1lbWJlcik7CQkJXAogCX0gd2hpbGUoMCk7CiAKQEAgLTQzMiwxNCArNTQxLDE2IEBACiAKIAlGTF9LRVlfU0VUKGtleXMsIGNudCwgRkxPV19ESVNTRUNUT1JfS0VZX0NPTlRST0wsIGNvbnRyb2wpOwogCUZMX0tFWV9TRVQoa2V5cywgY250LCBGTE9XX0RJU1NFQ1RPUl9LRVlfQkFTSUMsIGJhc2ljKTsKLQlGTF9LRVlfU0VUX0lGX0lOX1JBTkdFKG1hc2ssIGtleXMsIGNudCwKLQkJCSAgICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfRVRIX0FERFJTLCBldGgpOwotCUZMX0tFWV9TRVRfSUZfSU5fUkFOR0UobWFzaywga2V5cywgY250LAotCQkJICAgICAgIEZMT1dfRElTU0VDVE9SX0tFWV9JUFY0X0FERFJTLCBpcHY0KTsKLQlGTF9LRVlfU0VUX0lGX0lOX1JBTkdFKG1hc2ssIGtleXMsIGNudCwKLQkJCSAgICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfSVBWNl9BRERSUywgaXB2Nik7Ci0JRkxfS0VZX1NFVF9JRl9JTl9SQU5HRShtYXNrLCBrZXlzLCBjbnQsCi0JCQkgICAgICAgRkxPV19ESVNTRUNUT1JfS0VZX1BPUlRTLCB0cCk7CisJRkxfS0VZX1NFVF9JRl9NQVNLRUQoJm1hc2stPmtleSwga2V5cywgY250LAorCQkJICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfRVRIX0FERFJTLCBldGgpOworCUZMX0tFWV9TRVRfSUZfTUFTS0VEKCZtYXNrLT5rZXksIGtleXMsIGNudCwKKwkJCSAgICAgRkxPV19ESVNTRUNUT1JfS0VZX0lQVjRfQUREUlMsIGlwdjQpOworCUZMX0tFWV9TRVRfSUZfTUFTS0VEKCZtYXNrLT5rZXksIGtleXMsIGNudCwKKwkJCSAgICAgRkxPV19ESVNTRUNUT1JfS0VZX0lQVjZfQUREUlMsIGlwdjYpOworCUZMX0tFWV9TRVRfSUZfTUFTS0VEKCZtYXNrLT5rZXksIGtleXMsIGNudCwKKwkJCSAgICAgRkxPV19ESVNTRUNUT1JfS0VZX1BPUlRTLCB0cCk7CisJRkxfS0VZX1NFVF9JRl9NQVNLRUQoJm1hc2stPmtleSwga2V5cywgY250LAorCQkJICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfVkxBTiwgdmxhbik7CiAKIAlza2JfZmxvd19kaXNzZWN0b3JfaW5pdCgmaGVhZC0+ZGlzc2VjdG9yLCBrZXlzLCBjbnQpOwogfQpAQCAtNDc4LDEwICs1ODksMTIgQEAKIAlzdHJ1Y3QgdGNmX2V4dHMgZTsKIAlpbnQgZXJyOwogCi0JdGNmX2V4dHNfaW5pdCgmZSwgVENBX0ZMT1dFUl9BQ1QsIDApOwotCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZlLCBvdnIpOworCWVyciA9IHRjZl9leHRzX2luaXQoJmUsIFRDQV9GTE9XRVJfQUNULCAwKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKKwllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZSwgb3ZyKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvdXQ7CiAKIAlpZiAodGJbVENBX0ZMT1dFUl9DTEFTU0lEXSkgewogCQlmLT5yZXMuY2xhc3NpZCA9IG5sYV9nZXRfdTMyKHRiW1RDQV9GTE9XRVJfQ0xBU1NJRF0pOwpAQCAtNTUwLDcgKzY2Myw5IEBACiAJaWYgKCFmbmV3KQogCQlyZXR1cm4gLUVOT0JVRlM7CiAKLQl0Y2ZfZXh0c19pbml0KCZmbmV3LT5leHRzLCBUQ0FfRkxPV0VSX0FDVCwgMCk7CisJZXJyID0gdGNmX2V4dHNfaW5pdCgmZm5ldy0+ZXh0cywgVENBX0ZMT1dFUl9BQ1QsIDApOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDsKIAogCWlmICghaGFuZGxlKSB7CiAJCWhhbmRsZSA9IGZsX2dyYWJfbmV3X2hhbmRsZSh0cCwgaGVhZCk7CkBAIC02MTQsNiArNzI5LDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyb3V0OgorCXRjZl9leHRzX2Rlc3Ryb3koJmZuZXctPmV4dHMpOwogCWtmcmVlKGZuZXcpOwogCXJldHVybiBlcnI7CiB9CkBAIC02NjgsNiArNzg0LDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZmxfZHVtcF9rZXlfdmxhbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgIHN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfdmxhbiAqdmxhbl9rZXksCisJCQkgICAgc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV92bGFuICp2bGFuX21hc2spCit7CisJaW50IGVycjsKKworCWlmICghbWVtY2hyX2ludih2bGFuX21hc2ssIDAsIHNpemVvZigqdmxhbl9tYXNrKSkpCisJCXJldHVybiAwOworCWlmICh2bGFuX21hc2stPnZsYW5faWQpIHsKKwkJZXJyID0gbmxhX3B1dF91MTYoc2tiLCBUQ0FfRkxPV0VSX0tFWV9WTEFOX0lELAorCQkJCSAgdmxhbl9rZXktPnZsYW5faWQpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisJaWYgKHZsYW5fbWFzay0+dmxhbl9wcmlvcml0eSkgeworCQllcnIgPSBubGFfcHV0X3U4KHNrYiwgVENBX0ZMT1dFUl9LRVlfVkxBTl9QUklPLAorCQkJCSB2bGFuX2tleS0+dmxhbl9wcmlvcml0eSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBmbF9kdW1wKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgZmgsCiAJCSAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y21zZyAqdCkKIHsKQEAgLTcxMiw2ICs4NTEsMTAgQEAKIAkJCSAgICAmbWFzay0+YmFzaWMubl9wcm90bywgVENBX0ZMT1dFUl9VTlNQRUMsCiAJCQkgICAgc2l6ZW9mKGtleS0+YmFzaWMubl9wcm90bykpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWlmIChmbF9kdW1wX2tleV92bGFuKHNrYiwgJmtleS0+dmxhbiwgJm1hc2stPnZsYW4pKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwogCWlmICgoa2V5LT5iYXNpYy5uX3Byb3RvID09IGh0b25zKEVUSF9QX0lQKSB8fAogCSAgICAga2V5LT5iYXNpYy5uX3Byb3RvID09IGh0b25zKEVUSF9QX0lQVjYpKSAmJgogCSAgICBmbF9kdW1wX2tleV92YWwoc2tiLCAma2V5LT5iYXNpYy5pcF9wcm90bywgVENBX0ZMT1dFUl9LRVlfSVBfUFJPVE8sCkBAIC03MzgsMjEgKzg4MSw0OCBAQAogCiAJaWYgKGtleS0+YmFzaWMuaXBfcHJvdG8gPT0gSVBQUk9UT19UQ1AgJiYKIAkgICAgKGZsX2R1bXBfa2V5X3ZhbChza2IsICZrZXktPnRwLnNyYywgVENBX0ZMT1dFUl9LRVlfVENQX1NSQywKLQkJCSAgICAgJm1hc2stPnRwLnNyYywgVENBX0ZMT1dFUl9VTlNQRUMsCisJCQkgICAgICZtYXNrLT50cC5zcmMsIFRDQV9GTE9XRVJfS0VZX1RDUF9TUkNfTUFTSywKIAkJCSAgICAgc2l6ZW9mKGtleS0+dHAuc3JjKSkgfHwKIAkgICAgIGZsX2R1bXBfa2V5X3ZhbChza2IsICZrZXktPnRwLmRzdCwgVENBX0ZMT1dFUl9LRVlfVENQX0RTVCwKLQkJCSAgICAgJm1hc2stPnRwLmRzdCwgVENBX0ZMT1dFUl9VTlNQRUMsCisJCQkgICAgICZtYXNrLT50cC5kc3QsIFRDQV9GTE9XRVJfS0VZX1RDUF9EU1RfTUFTSywKIAkJCSAgICAgc2l6ZW9mKGtleS0+dHAuZHN0KSkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAllbHNlIGlmIChrZXktPmJhc2ljLmlwX3Byb3RvID09IElQUFJPVE9fVURQICYmCiAJCSAoZmxfZHVtcF9rZXlfdmFsKHNrYiwgJmtleS0+dHAuc3JjLCBUQ0FfRkxPV0VSX0tFWV9VRFBfU1JDLAotCQkJCSAgJm1hc2stPnRwLnNyYywgVENBX0ZMT1dFUl9VTlNQRUMsCisJCQkJICAmbWFzay0+dHAuc3JjLCBUQ0FfRkxPV0VSX0tFWV9VRFBfU1JDX01BU0ssCiAJCQkJICBzaXplb2Yoa2V5LT50cC5zcmMpKSB8fAogCQkgIGZsX2R1bXBfa2V5X3ZhbChza2IsICZrZXktPnRwLmRzdCwgVENBX0ZMT1dFUl9LRVlfVURQX0RTVCwKLQkJCQkgICZtYXNrLT50cC5kc3QsIFRDQV9GTE9XRVJfVU5TUEVDLAorCQkJCSAgJm1hc2stPnRwLmRzdCwgVENBX0ZMT1dFUl9LRVlfVURQX0RTVF9NQVNLLAogCQkJCSAgc2l6ZW9mKGtleS0+dHAuZHN0KSkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAorCWlmIChrZXktPmVuY19jb250cm9sLmFkZHJfdHlwZSA9PSBGTE9XX0RJU1NFQ1RPUl9LRVlfSVBWNF9BRERSUyAmJgorCSAgICAoZmxfZHVtcF9rZXlfdmFsKHNrYiwgJmtleS0+ZW5jX2lwdjQuc3JjLAorCQkJICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X1NSQywgJm1hc2stPmVuY19pcHY0LnNyYywKKwkJCSAgICBUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9TUkNfTUFTSywKKwkJCSAgICBzaXplb2Yoa2V5LT5lbmNfaXB2NC5zcmMpKSB8fAorCSAgICAgZmxfZHVtcF9rZXlfdmFsKHNrYiwgJmtleS0+ZW5jX2lwdjQuZHN0LAorCQkJICAgICBUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9EU1QsICZtYXNrLT5lbmNfaXB2NC5kc3QsCisJCQkgICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X0RTVF9NQVNLLAorCQkJICAgICBzaXplb2Yoa2V5LT5lbmNfaXB2NC5kc3QpKSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWVsc2UgaWYgKGtleS0+ZW5jX2NvbnRyb2wuYWRkcl90eXBlID09IEZMT1dfRElTU0VDVE9SX0tFWV9JUFY2X0FERFJTICYmCisJCSAoZmxfZHVtcF9rZXlfdmFsKHNrYiwgJmtleS0+ZW5jX2lwdjYuc3JjLAorCQkJICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X1NSQywgJm1hc2stPmVuY19pcHY2LnNyYywKKwkJCSAgICBUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9TUkNfTUFTSywKKwkJCSAgICBzaXplb2Yoa2V5LT5lbmNfaXB2Ni5zcmMpKSB8fAorCQkgZmxfZHVtcF9rZXlfdmFsKHNrYiwgJmtleS0+ZW5jX2lwdjYuZHN0LAorCQkJCSBUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9EU1QsCisJCQkJICZtYXNrLT5lbmNfaXB2Ni5kc3QsCisJCQkJIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X0RTVF9NQVNLLAorCQkJICAgIHNpemVvZihrZXktPmVuY19pcHY2LmRzdCkpKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAoZmxfZHVtcF9rZXlfdmFsKHNrYiwgJmtleS0+ZW5jX2tleV9pZCwgVENBX0ZMT1dFUl9LRVlfRU5DX0tFWV9JRCwKKwkJCSAgICAmbWFzay0+ZW5jX2tleV9pZCwgVENBX0ZMT1dFUl9VTlNQRUMsCisJCQkgICAgc2l6ZW9mKGtleS0+ZW5jX2tleV9pZCkpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwogCW5sYV9wdXRfdTMyKHNrYiwgVENBX0ZMT1dFUl9GTEFHUywgZi0+ZmxhZ3MpOwogCiAJaWYgKHRjZl9leHRzX2R1bXAoc2tiLCAmZi0+ZXh0cykpCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2Z3LmMgYi9uZXQvc2NoZWQvY2xzX2Z3LmMKaW5kZXggZjIzYTNiNi4uOWRjNjNkNSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19mdy5jCisrKyBiL25ldC9zY2hlZC9jbHNfZncuYwpAQCAtNTcsNyArNTcsNyBAQAogfQogCiBzdGF0aWMgaW50IGZ3X2NsYXNzaWZ5KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAotCQkJICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQorCQkgICAgICAgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKIHsKIAlzdHJ1Y3QgZndfaGVhZCAqaGVhZCA9IHJjdV9kZXJlZmVyZW5jZV9iaCh0cC0+cm9vdCk7CiAJc3RydWN0IGZ3X2ZpbHRlciAqZjsKQEAgLTE4OCwxNyArMTg4LDIwIEBACiAKIHN0YXRpYyBpbnQKIGZ3X2NoYW5nZV9hdHRycyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBzdHJ1Y3QgZndfZmlsdGVyICpmLAotCXN0cnVjdCBubGF0dHIgKip0Yiwgc3RydWN0IG5sYXR0ciAqKnRjYSwgdW5zaWduZWQgbG9uZyBiYXNlLCBib29sIG92cikKKwkJc3RydWN0IG5sYXR0ciAqKnRiLCBzdHJ1Y3QgbmxhdHRyICoqdGNhLCB1bnNpZ25lZCBsb25nIGJhc2UsCisJCWJvb2wgb3ZyKQogewogCXN0cnVjdCBmd19oZWFkICpoZWFkID0gcnRubF9kZXJlZmVyZW5jZSh0cC0+cm9vdCk7CiAJc3RydWN0IHRjZl9leHRzIGU7CiAJdTMyIG1hc2s7CiAJaW50IGVycjsKIAotCXRjZl9leHRzX2luaXQoJmUsIFRDQV9GV19BQ1QsIFRDQV9GV19QT0xJQ0UpOwotCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCB0Y2FbVENBX1JBVEVdLCAmZSwgb3ZyKTsKKwllcnIgPSB0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfRldfQUNULCBUQ0FfRldfUE9MSUNFKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKKwllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgdGNhW1RDQV9SQVRFXSwgJmUsIG92cik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OwogCiAJaWYgKHRiW1RDQV9GV19DTEFTU0lEXSkgewogCQlmLT5yZXMuY2xhc3NpZCA9IG5sYV9nZXRfdTMyKHRiW1RDQV9GV19DTEFTU0lEXSk7CkBAIC0yMzUsOSArMjM4LDggQEAKIAogc3RhdGljIGludCBmd19jaGFuZ2Uoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLAogCQkgICAgIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGJhc2UsCi0JCSAgICAgdTMyIGhhbmRsZSwKLQkJICAgICBzdHJ1Y3QgbmxhdHRyICoqdGNhLAotCQkgICAgIHVuc2lnbmVkIGxvbmcgKmFyZywgYm9vbCBvdnIpCisJCSAgICAgdTMyIGhhbmRsZSwgc3RydWN0IG5sYXR0ciAqKnRjYSwgdW5zaWduZWQgbG9uZyAqYXJnLAorCQkgICAgIGJvb2wgb3ZyKQogewogCXN0cnVjdCBmd19oZWFkICpoZWFkID0gcnRubF9kZXJlZmVyZW5jZSh0cC0+cm9vdCk7CiAJc3RydWN0IGZ3X2ZpbHRlciAqZiA9IChzdHJ1Y3QgZndfZmlsdGVyICopICphcmc7CkBAIC0yNzAsMTAgKzI3MiwxNSBAQAogI2VuZGlmIC8qIENPTkZJR19ORVRfQ0xTX0lORCAqLwogCQlmbmV3LT50cCA9IGYtPnRwOwogCi0JCXRjZl9leHRzX2luaXQoJmZuZXctPmV4dHMsIFRDQV9GV19BQ1QsIFRDQV9GV19QT0xJQ0UpOworCQllcnIgPSB0Y2ZfZXh0c19pbml0KCZmbmV3LT5leHRzLCBUQ0FfRldfQUNULCBUQ0FfRldfUE9MSUNFKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWtmcmVlKGZuZXcpOworCQkJcmV0dXJuIGVycjsKKwkJfQogCiAJCWVyciA9IGZ3X2NoYW5nZV9hdHRycyhuZXQsIHRwLCBmbmV3LCB0YiwgdGNhLCBiYXNlLCBvdnIpOwogCQlpZiAoZXJyIDwgMCkgeworCQkJdGNmX2V4dHNfZGVzdHJveSgmZm5ldy0+ZXh0cyk7CiAJCQlrZnJlZShmbmV3KTsKIAkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTMxMyw3ICszMjAsOSBAQAogCWlmIChmID09IE5VTEwpCiAJCXJldHVybiAtRU5PQlVGUzsKIAotCXRjZl9leHRzX2luaXQoJmYtPmV4dHMsIFRDQV9GV19BQ1QsIFRDQV9GV19QT0xJQ0UpOworCWVyciA9IHRjZl9leHRzX2luaXQoJmYtPmV4dHMsIFRDQV9GV19BQ1QsIFRDQV9GV19QT0xJQ0UpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDsKIAlmLT5pZCA9IGhhbmRsZTsKIAlmLT50cCA9IHRwOwogCkBAIC0zMjgsNiArMzM3LDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyb3V0OgorCXRjZl9leHRzX2Rlc3Ryb3koJmYtPmV4dHMpOwogCWtmcmVlKGYpOwogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX3JvdXRlLmMgYi9uZXQvc2NoZWQvY2xzX3JvdXRlLmMKaW5kZXggMDhhM2IwYS4uNDU1ZmM4ZiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19yb3V0ZS5jCisrKyBiL25ldC9zY2hlZC9jbHNfcm91dGUuYwpAQCAtMjY4LDggKzI2OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1yb3V0ZTRfZGVsZXRlX2ZpbHRlcihzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCitzdGF0aWMgdm9pZCByb3V0ZTRfZGVsZXRlX2ZpbHRlcihzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCiB7CiAJc3RydWN0IHJvdXRlNF9maWx0ZXIgKmYgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHJvdXRlNF9maWx0ZXIsIHJjdSk7CiAKQEAgLTM4MywxNyArMzgyLDE5IEBACiAJCQkgICAgc3RydWN0IG5sYXR0ciAqKnRiLCBzdHJ1Y3QgbmxhdHRyICplc3QsIGludCBuZXcsCiAJCQkgICAgYm9vbCBvdnIpCiB7Ci0JaW50IGVycjsKIAl1MzIgaWQgPSAwLCB0byA9IDAsIG5oYW5kbGUgPSAweDgwMDA7CiAJc3RydWN0IHJvdXRlNF9maWx0ZXIgKmZwOwogCXVuc2lnbmVkIGludCBoMTsKIAlzdHJ1Y3Qgcm91dGU0X2J1Y2tldCAqYjsKIAlzdHJ1Y3QgdGNmX2V4dHMgZTsKKwlpbnQgZXJyOwogCi0JdGNmX2V4dHNfaW5pdCgmZSwgVENBX1JPVVRFNF9BQ1QsIFRDQV9ST1VURTRfUE9MSUNFKTsKLQllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZSwgb3ZyKTsKKwllcnIgPSB0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfUk9VVEU0X0FDVCwgVENBX1JPVVRFNF9QT0xJQ0UpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOworCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZlLCBvdnIpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDsKIAogCWVyciA9IC1FSU5WQUw7CiAJaWYgKHRiW1RDQV9ST1VURTRfVE9dKSB7CkBAIC00NzIsMTAgKzQ3Myw4IEBACiB9CiAKIHN0YXRpYyBpbnQgcm91dGU0X2NoYW5nZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICppbl9za2IsCi0JCSAgICAgICBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBiYXNlLAotCQkgICAgICAgdTMyIGhhbmRsZSwKLQkJICAgICAgIHN0cnVjdCBubGF0dHIgKip0Y2EsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nICphcmcsIGJvb2wgb3ZyKQorCQkJIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGJhc2UsIHUzMiBoYW5kbGUsCisJCQkgc3RydWN0IG5sYXR0ciAqKnRjYSwgdW5zaWduZWQgbG9uZyAqYXJnLCBib29sIG92cikKIHsKIAlzdHJ1Y3Qgcm91dGU0X2hlYWQgKmhlYWQgPSBydG5sX2RlcmVmZXJlbmNlKHRwLT5yb290KTsKIAlzdHJ1Y3Qgcm91dGU0X2ZpbHRlciBfX3JjdSAqKmZwOwpAQCAtNTAzLDcgKzUwMiwxMCBAQAogCWlmICghZikKIAkJZ290byBlcnJvdXQ7CiAKLQl0Y2ZfZXh0c19pbml0KCZmLT5leHRzLCBUQ0FfUk9VVEU0X0FDVCwgVENBX1JPVVRFNF9QT0xJQ0UpOworCWVyciA9IHRjZl9leHRzX2luaXQoJmYtPmV4dHMsIFRDQV9ST1VURTRfQUNULCBUQ0FfUk9VVEU0X1BPTElDRSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OworCiAJaWYgKGZvbGQpIHsKIAkJZi0+aWQgPSBmb2xkLT5pZDsKIAkJZi0+aWlmID0gZm9sZC0+aWlmOwpAQCAtNTU3LDYgKzU1OSw4IEBACiAJcmV0dXJuIDA7CiAKIGVycm91dDoKKwlpZiAoZikKKwkJdGNmX2V4dHNfZGVzdHJveSgmZi0+ZXh0cyk7CiAJa2ZyZWUoZik7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfcnN2cC5oIGIvbmV0L3NjaGVkL2Nsc19yc3ZwLmgKaW5kZXggZjljOWZjMC4uNGYwNWExOSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19yc3ZwLmgKKysrIGIvbmV0L3NjaGVkL2Nsc19yc3ZwLmgKQEAgLTQ4NywxMCArNDg3LDEyIEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQl0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfUlNWUF9BQ1QsIFRDQV9SU1ZQX1BPTElDRSk7Ci0JZXJyID0gdGNmX2V4dHNfdmFsaWRhdGUobmV0LCB0cCwgdGIsIHRjYVtUQ0FfUkFURV0sICZlLCBvdnIpOworCWVyciA9IHRjZl9leHRzX2luaXQoJmUsIFRDQV9SU1ZQX0FDVCwgVENBX1JTVlBfUE9MSUNFKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKKwllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgdGNhW1RDQV9SQVRFXSwgJmUsIG92cik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0MjsKIAogCWYgPSAoc3RydWN0IHJzdnBfZmlsdGVyICopKmFyZzsKIAlpZiAoZikgewpAQCAtNTA2LDcgKzUwOCwxMSBAQAogCQkJZ290byBlcnJvdXQyOwogCQl9CiAKLQkJdGNmX2V4dHNfaW5pdCgmbi0+ZXh0cywgVENBX1JTVlBfQUNULCBUQ0FfUlNWUF9QT0xJQ0UpOworCQllcnIgPSB0Y2ZfZXh0c19pbml0KCZuLT5leHRzLCBUQ0FfUlNWUF9BQ1QsIFRDQV9SU1ZQX1BPTElDRSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlrZnJlZShuKTsKKwkJCWdvdG8gZXJyb3V0MjsKKwkJfQogCiAJCWlmICh0YltUQ0FfUlNWUF9DTEFTU0lEXSkgewogCQkJbi0+cmVzLmNsYXNzaWQgPSBubGFfZ2V0X3UzMih0YltUQ0FfUlNWUF9DTEFTU0lEXSk7CkBAIC01MzAsNyArNTM2LDkgQEAKIAlpZiAoZiA9PSBOVUxMKQogCQlnb3RvIGVycm91dDI7CiAKLQl0Y2ZfZXh0c19pbml0KCZmLT5leHRzLCBUQ0FfUlNWUF9BQ1QsIFRDQV9SU1ZQX1BPTElDRSk7CisJZXJyID0gdGNmX2V4dHNfaW5pdCgmZi0+ZXh0cywgVENBX1JTVlBfQUNULCBUQ0FfUlNWUF9QT0xJQ0UpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDsKIAloMiA9IDE2OwogCWlmICh0YltUQ0FfUlNWUF9TUkNdKSB7CiAJCW1lbWNweShmLT5zcmMsIG5sYV9kYXRhKHRiW1RDQV9SU1ZQX1NSQ10pLCBzaXplb2YoZi0+c3JjKSk7CkBAIC02MjcsNiArNjM1LDcgQEAKIAlnb3RvIGluc2VydDsKIAogZXJyb3V0OgorCXRjZl9leHRzX2Rlc3Ryb3koJmYtPmV4dHMpOwogCWtmcmVlKGYpOwogZXJyb3V0MjoKIAl0Y2ZfZXh0c19kZXN0cm95KCZlKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfdGNpbmRleC5jIGIvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKaW5kZXggOTQ0YzhmZi4uOTYxNDRiZCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKKysrIGIvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKQEAgLTUwLDE0ICs1MCwxMyBAQAogCXN0cnVjdCByY3VfaGVhZCByY3U7CiB9OwogCi1zdGF0aWMgaW5saW5lIGludAotdGNpbmRleF9maWx0ZXJfaXNfc2V0KHN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgKnIpCitzdGF0aWMgaW5saW5lIGludCB0Y2luZGV4X2ZpbHRlcl9pc19zZXQoc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqcikKIHsKIAlyZXR1cm4gdGNmX2V4dHNfaXNfcHJlZGljYXRpdmUoJnItPmV4dHMpIHx8IHItPnJlcy5jbGFzc2lkOwogfQogCi1zdGF0aWMgc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqCi10Y2luZGV4X2xvb2t1cChzdHJ1Y3QgdGNpbmRleF9kYXRhICpwLCB1MTYga2V5KQorc3RhdGljIHN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgKnRjaW5kZXhfbG9va3VwKHN0cnVjdCB0Y2luZGV4X2RhdGEgKnAsCisJCQkJCQkgICAgdTE2IGtleSkKIHsKIAlpZiAocC0+cGVyZmVjdCkgewogCQlzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0ICpmID0gcC0+cGVyZmVjdCArIGtleTsKQEAgLTE0NCw3ICsxNDMsOCBAQAogCiBzdGF0aWMgdm9pZCB0Y2luZGV4X2Rlc3Ryb3lfZmV4dHMoc3RydWN0IHJjdV9oZWFkICpoZWFkKQogewotCXN0cnVjdCB0Y2luZGV4X2ZpbHRlciAqZiA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgdGNpbmRleF9maWx0ZXIsIHJjdSk7CisJc3RydWN0IHRjaW5kZXhfZmlsdGVyICpmID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCB0Y2luZGV4X2ZpbHRlciwKKwkJCQkJCXJjdSk7CiAKIAl0Y2ZfZXh0c19kZXN0cm95KCZmLT5yZXN1bHQuZXh0cyk7CiAJa2ZyZWUoZik7CkBAIC0yMTksMTAgKzIxOSwxMCBAQAogCVtUQ0FfVENJTkRFWF9DTEFTU0lEXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAogfTsKIAotc3RhdGljIHZvaWQgdGNpbmRleF9maWx0ZXJfcmVzdWx0X2luaXQoc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqcikKK3N0YXRpYyBpbnQgdGNpbmRleF9maWx0ZXJfcmVzdWx0X2luaXQoc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqcikKIHsKIAltZW1zZXQociwgMCwgc2l6ZW9mKCpyKSk7Ci0JdGNmX2V4dHNfaW5pdCgmci0+ZXh0cywgVENBX1RDSU5ERVhfQUNULCBUQ0FfVENJTkRFWF9QT0xJQ0UpOworCXJldHVybiB0Y2ZfZXh0c19pbml0KCZyLT5leHRzLCBUQ0FfVENJTkRFWF9BQ1QsIFRDQV9UQ0lOREVYX1BPTElDRSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fdGNpbmRleF9wYXJ0aWFsX2Rlc3Ryb3koc3RydWN0IHJjdV9oZWFkICpoZWFkKQpAQCAtMjMzLDIzICsyMzMsNTcgQEAKIAlrZnJlZShwKTsKIH0KIAorc3RhdGljIHZvaWQgdGNpbmRleF9mcmVlX3BlcmZlY3RfaGFzaChzdHJ1Y3QgdGNpbmRleF9kYXRhICpjcCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjcC0+aGFzaDsgaSsrKQorCQl0Y2ZfZXh0c19kZXN0cm95KCZjcC0+cGVyZmVjdFtpXS5leHRzKTsKKwlrZnJlZShjcC0+cGVyZmVjdCk7Cit9CisKK3N0YXRpYyBpbnQgdGNpbmRleF9hbGxvY19wZXJmZWN0X2hhc2goc3RydWN0IHRjaW5kZXhfZGF0YSAqY3ApCit7CisJaW50IGksIGVyciA9IDA7CisKKwljcC0+cGVyZmVjdCA9IGtjYWxsb2MoY3AtPmhhc2gsIHNpemVvZihzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0KSwKKwkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghY3AtPnBlcmZlY3QpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IGNwLT5oYXNoOyBpKyspIHsKKwkJZXJyID0gdGNmX2V4dHNfaW5pdCgmY3AtPnBlcmZlY3RbaV0uZXh0cywKKwkJCQkgICAgVENBX1RDSU5ERVhfQUNULCBUQ0FfVENJTkRFWF9QT0xJQ0UpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3V0OworCX0KKworCXJldHVybiAwOworCitlcnJvdXQ6CisJdGNpbmRleF9mcmVlX3BlcmZlY3RfaGFzaChjcCk7CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludAogdGNpbmRleF9zZXRfcGFybXMoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBiYXNlLAogCQkgIHUzMiBoYW5kbGUsIHN0cnVjdCB0Y2luZGV4X2RhdGEgKnAsCiAJCSAgc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqciwgc3RydWN0IG5sYXR0ciAqKnRiLAogCQkgIHN0cnVjdCBubGF0dHIgKmVzdCwgYm9vbCBvdnIpCiB7Ci0JaW50IGVyciwgYmFsbG9jID0gMDsKIAlzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0IG5ld19maWx0ZXJfcmVzdWx0LCAqb2xkX3IgPSByOwogCXN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgY3I7Ci0Jc3RydWN0IHRjaW5kZXhfZGF0YSAqY3AsICpvbGRwOworCXN0cnVjdCB0Y2luZGV4X2RhdGEgKmNwID0gTlVMTCwgKm9sZHA7CiAJc3RydWN0IHRjaW5kZXhfZmlsdGVyICpmID0gTlVMTDsgLyogbWFrZSBnY2MgYmVoYXZlICovCisJaW50IGVyciwgYmFsbG9jID0gMDsKIAlzdHJ1Y3QgdGNmX2V4dHMgZTsKIAotCXRjZl9leHRzX2luaXQoJmUsIFRDQV9UQ0lOREVYX0FDVCwgVENBX1RDSU5ERVhfUE9MSUNFKTsKLQllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZSwgb3ZyKTsKKwllcnIgPSB0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfVENJTkRFWF9BQ1QsIFRDQV9UQ0lOREVYX1BPTElDRSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CisJZXJyID0gdGNmX2V4dHNfdmFsaWRhdGUobmV0LCB0cCwgdGIsIGVzdCwgJmUsIG92cik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OwogCiAJZXJyID0gLUVOT01FTTsKIAkvKiB0Y2luZGV4X2RhdGEgYXR0cmlidXRlcyBtdXN0IGxvb2sgYXRvbWljIHRvIGNsYXNzaWZpZXIvbG9va3VwIHNvCkBAIC0yNzAsMTkgKzMwNCwyMCBAQAogCWlmIChwLT5wZXJmZWN0KSB7CiAJCWludCBpOwogCi0JCWNwLT5wZXJmZWN0ID0ga21lbWR1cChwLT5wZXJmZWN0LAotCQkJCSAgICAgIHNpemVvZigqcikgKiBjcC0+aGFzaCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghY3AtPnBlcmZlY3QpCisJCWlmICh0Y2luZGV4X2FsbG9jX3BlcmZlY3RfaGFzaChjcCkgPCAwKQogCQkJZ290byBlcnJvdXQ7CiAJCWZvciAoaSA9IDA7IGkgPCBjcC0+aGFzaDsgaSsrKQotCQkJdGNmX2V4dHNfaW5pdCgmY3AtPnBlcmZlY3RbaV0uZXh0cywKLQkJCQkgICAgICBUQ0FfVENJTkRFWF9BQ1QsIFRDQV9UQ0lOREVYX1BPTElDRSk7CisJCQljcC0+cGVyZmVjdFtpXS5yZXMgPSBwLT5wZXJmZWN0W2ldLnJlczsKIAkJYmFsbG9jID0gMTsKIAl9CiAJY3AtPmggPSBwLT5oOwogCi0JdGNpbmRleF9maWx0ZXJfcmVzdWx0X2luaXQoJm5ld19maWx0ZXJfcmVzdWx0KTsKLQl0Y2luZGV4X2ZpbHRlcl9yZXN1bHRfaW5pdCgmY3IpOworCWVyciA9IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdF9pbml0KCZuZXdfZmlsdGVyX3Jlc3VsdCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0MTsKKwllcnIgPSB0Y2luZGV4X2ZpbHRlcl9yZXN1bHRfaW5pdCgmY3IpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDE7CiAJaWYgKG9sZF9yKQogCQljci5yZXMgPSByLT5yZXM7CiAKQEAgLTMzOCwxNSArMzczLDggQEAKIAllcnIgPSAtRU5PTUVNOwogCWlmICghY3AtPnBlcmZlY3QgJiYgIWNwLT5oKSB7CiAJCWlmICh2YWxpZF9wZXJmZWN0X2hhc2goY3ApKSB7Ci0JCQlpbnQgaTsKLQotCQkJY3AtPnBlcmZlY3QgPSBrY2FsbG9jKGNwLT5oYXNoLCBzaXplb2YoKnIpLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghY3AtPnBlcmZlY3QpCisJCQlpZiAodGNpbmRleF9hbGxvY19wZXJmZWN0X2hhc2goY3ApIDwgMCkKIAkJCQlnb3RvIGVycm91dF9hbGxvYzsKLQkJCWZvciAoaSA9IDA7IGkgPCBjcC0+aGFzaDsgaSsrKQotCQkJCXRjZl9leHRzX2luaXQoJmNwLT5wZXJmZWN0W2ldLmV4dHMsCi0JCQkJCSAgICAgIFRDQV9UQ0lOREVYX0FDVCwKLQkJCQkJICAgICAgVENBX1RDSU5ERVhfUE9MSUNFKTsKIAkJCWJhbGxvYyA9IDE7CiAJCX0gZWxzZSB7CiAJCQlzdHJ1Y3QgdGNpbmRleF9maWx0ZXIgX19yY3UgKipoYXNoOwpAQCAtMzczLDggKzQwMSwxMiBAQAogCQlpZiAoIWYpCiAJCQlnb3RvIGVycm91dF9hbGxvYzsKIAkJZi0+a2V5ID0gaGFuZGxlOwotCQl0Y2luZGV4X2ZpbHRlcl9yZXN1bHRfaW5pdCgmZi0+cmVzdWx0KTsKIAkJZi0+bmV4dCA9IE5VTEw7CisJCWVyciA9IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdF9pbml0KCZmLT5yZXN1bHQpOworCQlpZiAoZXJyIDwgMCkgeworCQkJa2ZyZWUoZik7CisJCQlnb3RvIGVycm91dF9hbGxvYzsKKwkJfQogCX0KIAogCWlmICh0YltUQ0FfVENJTkRFWF9DTEFTU0lEXSkgewpAQCAtMzg3LDggKzQxOSwxMyBAQAogCWVsc2UKIAkJdGNmX2V4dHNfY2hhbmdlKHRwLCAmY3IuZXh0cywgJmUpOwogCi0JaWYgKG9sZF9yICYmIG9sZF9yICE9IHIpCi0JCXRjaW5kZXhfZmlsdGVyX3Jlc3VsdF9pbml0KG9sZF9yKTsKKwlpZiAob2xkX3IgJiYgb2xkX3IgIT0gcikgeworCQllcnIgPSB0Y2luZGV4X2ZpbHRlcl9yZXN1bHRfaW5pdChvbGRfcik7CisJCWlmIChlcnIgPCAwKSB7CisJCQlrZnJlZShmKTsKKwkJCWdvdG8gZXJyb3V0X2FsbG9jOworCQl9CisJfQogCiAJb2xkcCA9IHA7CiAJci0+cmVzID0gY3IucmVzOwpAQCAtNDE1LDkgKzQ1MiwxMiBAQAogCiBlcnJvdXRfYWxsb2M6CiAJaWYgKGJhbGxvYyA9PSAxKQotCQlrZnJlZShjcC0+cGVyZmVjdCk7CisJCXRjaW5kZXhfZnJlZV9wZXJmZWN0X2hhc2goY3ApOwogCWVsc2UgaWYgKGJhbGxvYyA9PSAyKQogCQlrZnJlZShjcC0+aCk7CitlcnJvdXQxOgorCXRjZl9leHRzX2Rlc3Ryb3koJmNyLmV4dHMpOworCXRjZl9leHRzX2Rlc3Ryb3koJm5ld19maWx0ZXJfcmVzdWx0LmV4dHMpOwogZXJyb3V0OgogCWtmcmVlKGNwKTsKIAl0Y2ZfZXh0c19kZXN0cm95KCZlKTsKQEAgLTUxMCw3ICs1NTAsNyBAQAogCiAKIHN0YXRpYyBpbnQgdGNpbmRleF9kdW1wKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgZmgsCi0gICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjbXNnICp0KQorCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjbXNnICp0KQogewogCXN0cnVjdCB0Y2luZGV4X2RhdGEgKnAgPSBydG5sX2RlcmVmZXJlbmNlKHRwLT5yb290KTsKIAlzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0ICpyID0gKHN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgKikgZmg7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX3UzMi5jIGIvbmV0L3NjaGVkL2Nsc191MzIuYwppbmRleCBmZmU1OTNlLi5hZTgzYzNhZSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc191MzIuYworKysgYi9uZXQvc2NoZWQvY2xzX3UzMi5jCkBAIC0xMDQsNyArMTA0LDggQEAKIAlyZXR1cm4gaDsKIH0KIAotc3RhdGljIGludCB1MzJfY2xhc3NpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCitzdGF0aWMgaW50IHUzMl9jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKKwkJCXN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCiB7CiAJc3RydWN0IHsKIAkJc3RydWN0IHRjX3Vfa25vZGUgKmtub2RlOwpAQCAtMjU2LDggKzI1Nyw3IEBACiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgc3RydWN0IHRjX3VfaG5vZGUgKgotdTMyX2xvb2t1cF9odChzdHJ1Y3QgdGNfdV9jb21tb24gKnRwX2MsIHUzMiBoYW5kbGUpCitzdGF0aWMgc3RydWN0IHRjX3VfaG5vZGUgKnUzMl9sb29rdXBfaHQoc3RydWN0IHRjX3VfY29tbW9uICp0cF9jLCB1MzIgaGFuZGxlKQogewogCXN0cnVjdCB0Y191X2hub2RlICpodDsKIApAQCAtMjcwLDggKzI3MCw3IEBACiAJcmV0dXJuIGh0OwogfQogCi1zdGF0aWMgc3RydWN0IHRjX3Vfa25vZGUgKgotdTMyX2xvb2t1cF9rZXkoc3RydWN0IHRjX3VfaG5vZGUgKmh0LCB1MzIgaGFuZGxlKQorc3RhdGljIHN0cnVjdCB0Y191X2tub2RlICp1MzJfbG9va3VwX2tleShzdHJ1Y3QgdGNfdV9obm9kZSAqaHQsIHUzMiBoYW5kbGUpCiB7CiAJdW5zaWduZWQgaW50IHNlbDsKIAlzdHJ1Y3QgdGNfdV9rbm9kZSAqbiA9IE5VTEw7CkBAIC0zNjAsOCArMzU5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1MzJfZGVzdHJveV9rZXkoc3RydWN0IHRjZl9wcm90byAqdHAsCi0JCQkgICBzdHJ1Y3QgdGNfdV9rbm9kZSAqbiwKK3N0YXRpYyBpbnQgdTMyX2Rlc3Ryb3lfa2V5KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBzdHJ1Y3QgdGNfdV9rbm9kZSAqbiwKIAkJCSAgIGJvb2wgZnJlZV9wZikKIHsKIAl0Y2ZfZXh0c19kZXN0cm95KCZuLT5leHRzKTsKQEAgLTQ0OCw5ICs0NDYsOCBAQAogCX0KIH0KIAotc3RhdGljIGludCB1MzJfcmVwbGFjZV9od19obm9kZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKLQkJCQkgc3RydWN0IHRjX3VfaG5vZGUgKmgsCi0JCQkJIHUzMiBmbGFncykKK3N0YXRpYyBpbnQgdTMyX3JlcGxhY2VfaHdfaG5vZGUoc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCB0Y191X2hub2RlICpoLAorCQkJCXUzMiBmbGFncykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdHAtPnEtPmRldl9xdWV1ZS0+ZGV2OwogCXN0cnVjdCB0Y19jbHNfdTMyX29mZmxvYWQgdTMyX29mZmxvYWQgPSB7MH07CkBAIC00OTYsOSArNDkzLDggQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgdTMyX3JlcGxhY2VfaHdfa25vZGUoc3RydWN0IHRjZl9wcm90byAqdHAsCi0JCQkJIHN0cnVjdCB0Y191X2tub2RlICpuLAotCQkJCSB1MzIgZmxhZ3MpCitzdGF0aWMgaW50IHUzMl9yZXBsYWNlX2h3X2tub2RlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBzdHJ1Y3QgdGNfdV9rbm9kZSAqbiwKKwkJCQl1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRwLT5xLT5kZXZfcXVldWUtPmRldjsKIAlzdHJ1Y3QgdGNfY2xzX3UzMl9vZmZsb2FkIHUzMl9vZmZsb2FkID0gezB9OwpAQCAtNzA5LDEzICs3MDUsMTUgQEAKIAkJCSBzdHJ1Y3QgdGNfdV9rbm9kZSAqbiwgc3RydWN0IG5sYXR0ciAqKnRiLAogCQkJIHN0cnVjdCBubGF0dHIgKmVzdCwgYm9vbCBvdnIpCiB7Ci0JaW50IGVycjsKIAlzdHJ1Y3QgdGNmX2V4dHMgZTsKKwlpbnQgZXJyOwogCi0JdGNmX2V4dHNfaW5pdCgmZSwgVENBX1UzMl9BQ1QsIFRDQV9VMzJfUE9MSUNFKTsKLQllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZSwgb3ZyKTsKKwllcnIgPSB0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfVTMyX0FDVCwgVENBX1UzMl9QT0xJQ0UpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOworCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZlLCBvdnIpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDsKIAogCWVyciA9IC1FSU5WQUw7CiAJaWYgKHRiW1RDQV9VMzJfTElOS10pIHsKQEAgLTc2MSw4ICs3NTksNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIHUzMl9yZXBsYWNlX2tub2RlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAotCQkJICAgICAgc3RydWN0IHRjX3VfY29tbW9uICp0cF9jLAorc3RhdGljIHZvaWQgdTMyX3JlcGxhY2Vfa25vZGUoc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCB0Y191X2NvbW1vbiAqdHBfYywKIAkJCSAgICAgIHN0cnVjdCB0Y191X2tub2RlICpuKQogewogCXN0cnVjdCB0Y191X2tub2RlIF9fcmN1ICoqaW5zOwpAQCAtODMzLDE1ICs4MzAsMTcgQEAKIAluZXctPnRwID0gdHA7CiAJbWVtY3B5KCZuZXctPnNlbCwgcywgc2l6ZW9mKCpzKSArIHMtPm5rZXlzKnNpemVvZihzdHJ1Y3QgdGNfdTMyX2tleSkpOwogCi0JdGNmX2V4dHNfaW5pdCgmbmV3LT5leHRzLCBUQ0FfVTMyX0FDVCwgVENBX1UzMl9QT0xJQ0UpOworCWlmICh0Y2ZfZXh0c19pbml0KCZuZXctPmV4dHMsIFRDQV9VMzJfQUNULCBUQ0FfVTMyX1BPTElDRSkpIHsKKwkJa2ZyZWUobmV3KTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCiAJcmV0dXJuIG5ldzsKIH0KIAogc3RhdGljIGludCB1MzJfY2hhbmdlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwKIAkJICAgICAgc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgYmFzZSwgdTMyIGhhbmRsZSwKLQkJICAgICAgc3RydWN0IG5sYXR0ciAqKnRjYSwKLQkJICAgICAgdW5zaWduZWQgbG9uZyAqYXJnLCBib29sIG92cikKKwkJICAgICAgc3RydWN0IG5sYXR0ciAqKnRjYSwgdW5zaWduZWQgbG9uZyAqYXJnLCBib29sIG92cikKIHsKIAlzdHJ1Y3QgdGNfdV9jb21tb24gKnRwX2MgPSB0cC0+ZGF0YTsKIAlzdHJ1Y3QgdGNfdV9obm9kZSAqaHQ7CkBAIC05ODUsOSArOTg0LDEyIEBACiAJbi0+aGFuZGxlID0gaGFuZGxlOwogCW4tPmZzaGlmdCA9IHMtPmhtYXNrID8gZmZzKG50b2hsKHMtPmhtYXNrKSkgLSAxIDogMDsKIAluLT5mbGFncyA9IGZsYWdzOwotCXRjZl9leHRzX2luaXQoJm4tPmV4dHMsIFRDQV9VMzJfQUNULCBUQ0FfVTMyX1BPTElDRSk7CiAJbi0+dHAgPSB0cDsKIAorCWVyciA9IHRjZl9leHRzX2luaXQoJm4tPmV4dHMsIFRDQV9VMzJfQUNULCBUQ0FfVTMyX1BPTElDRSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OworCiAjaWZkZWYgQ09ORklHX0NMU19VMzJfTUFSSwogCW4tPnBjcHVfc3VjY2VzcyA9IGFsbG9jX3BlcmNwdSh1MzIpOwogCWlmICghbi0+cGNwdV9zdWNjZXNzKSB7CkBAIC0xMDI4LDkgKzEwMzAsMTAgQEAKIGVycmh3OgogI2lmZGVmIENPTkZJR19DTFNfVTMyX01BUksKIAlmcmVlX3BlcmNwdShuLT5wY3B1X3N1Y2Nlc3MpOwotZXJyb3V0OgogI2VuZGlmCiAKK2Vycm91dDoKKwl0Y2ZfZXh0c19kZXN0cm95KCZuLT5leHRzKTsKICNpZmRlZiBDT05GSUdfQ0xTX1UzMl9QRVJGCiAJZnJlZV9wZXJjcHUobi0+cGYpOwogI2VuZGlmCkBAIC0xMDc5LDcgKzEwODIsNyBAQAogfQogCiBzdGF0aWMgaW50IHUzMl9kdW1wKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgZmgsCi0JCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjbXNnICp0KQorCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjbXNnICp0KQogewogCXN0cnVjdCB0Y191X2tub2RlICpuID0gKHN0cnVjdCB0Y191X2tub2RlICopZmg7CiAJc3RydWN0IHRjX3VfaG5vZGUgKmh0X3VwLCAqaHRfZG93bjsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfYXBpLmMgYi9uZXQvc2NoZWQvc2NoX2FwaS5jCmluZGV4IDEyZWJkZTguLjIwNmRjMjQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfYXBpLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9hcGkuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2h0YWJsZS5oPgogCiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgpAQCAtMjU5LDM3ICsyNjAsNDAgQEAKIHsKIAlzdHJ1Y3QgUWRpc2MgKnE7CiAKKwlpZiAoIXFkaXNjX2Rldihyb290KSkKKwkJcmV0dXJuIChyb290LT5oYW5kbGUgPT0gaGFuZGxlID8gcm9vdCA6IE5VTEwpOworCiAJaWYgKCEocm9vdC0+ZmxhZ3MgJiBUQ1FfRl9CVUlMVElOKSAmJgogCSAgICByb290LT5oYW5kbGUgPT0gaGFuZGxlKQogCQlyZXR1cm4gcm9vdDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHEsICZyb290LT5saXN0LCBsaXN0KSB7CisJaGFzaF9mb3JfZWFjaF9wb3NzaWJsZV9yY3UocWRpc2NfZGV2KHJvb3QpLT5xZGlzY19oYXNoLCBxLCBoYXNoLCBoYW5kbGUpIHsKIAkJaWYgKHEtPmhhbmRsZSA9PSBoYW5kbGUpCiAJCQlyZXR1cm4gcTsKIAl9CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgcWRpc2NfbGlzdF9hZGQoc3RydWN0IFFkaXNjICpxKQordm9pZCBxZGlzY19oYXNoX2FkZChzdHJ1Y3QgUWRpc2MgKnEpCiB7CiAJaWYgKChxLT5wYXJlbnQgIT0gVENfSF9ST09UKSAmJiAhKHEtPmZsYWdzICYgVENRX0ZfSU5HUkVTUykpIHsKIAkJc3RydWN0IFFkaXNjICpyb290ID0gcWRpc2NfZGV2KHEpLT5xZGlzYzsKIAogCQlXQVJOX09OX09OQ0Uocm9vdCA9PSAmbm9vcF9xZGlzYyk7CiAJCUFTU0VSVF9SVE5MKCk7Ci0JCWxpc3RfYWRkX3RhaWxfcmN1KCZxLT5saXN0LCAmcm9vdC0+bGlzdCk7CisJCWhhc2hfYWRkX3JjdShxZGlzY19kZXYocSktPnFkaXNjX2hhc2gsICZxLT5oYXNoLCBxLT5oYW5kbGUpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wocWRpc2NfbGlzdF9hZGQpOworRVhQT1JUX1NZTUJPTChxZGlzY19oYXNoX2FkZCk7CiAKLXZvaWQgcWRpc2NfbGlzdF9kZWwoc3RydWN0IFFkaXNjICpxKQordm9pZCBxZGlzY19oYXNoX2RlbChzdHJ1Y3QgUWRpc2MgKnEpCiB7CiAJaWYgKChxLT5wYXJlbnQgIT0gVENfSF9ST09UKSAmJiAhKHEtPmZsYWdzICYgVENRX0ZfSU5HUkVTUykpIHsKIAkJQVNTRVJUX1JUTkwoKTsKLQkJbGlzdF9kZWxfcmN1KCZxLT5saXN0KTsKKwkJaGFzaF9kZWxfcmN1KCZxLT5oYXNoKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKHFkaXNjX2xpc3RfZGVsKTsKK0VYUE9SVF9TWU1CT0wocWRpc2NfaGFzaF9kZWwpOwogCiBzdHJ1Y3QgUWRpc2MgKnFkaXNjX2xvb2t1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgaGFuZGxlKQogewpAQCAtMzg1LDcgKzM4OSw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcWRpc2NfcmF0ZV90YWJsZSAqcWRpc2NfcnRhYl9saXN0OwogCi1zdHJ1Y3QgcWRpc2NfcmF0ZV90YWJsZSAqcWRpc2NfZ2V0X3J0YWIoc3RydWN0IHRjX3JhdGVzcGVjICpyLCBzdHJ1Y3QgbmxhdHRyICp0YWIpCitzdHJ1Y3QgcWRpc2NfcmF0ZV90YWJsZSAqcWRpc2NfZ2V0X3J0YWIoc3RydWN0IHRjX3JhdGVzcGVjICpyLAorCQkJCQlzdHJ1Y3QgbmxhdHRyICp0YWIpCiB7CiAJc3RydWN0IHFkaXNjX3JhdGVfdGFibGUgKnJ0YWI7CiAKQEAgLTUzNyw3ICs1NDIsOCBAQAogCXJldHVybiAtMTsKIH0KIAotdm9pZCBfX3FkaXNjX2NhbGN1bGF0ZV9wa3RfbGVuKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBxZGlzY19zaXplX3RhYmxlICpzdGFiKQordm9pZCBfX3FkaXNjX2NhbGN1bGF0ZV9wa3RfbGVuKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHFkaXNjX3NpemVfdGFibGUgKnN0YWIpCiB7CiAJaW50IHBrdF9sZW4sIHNsb3Q7CiAKQEAgLTg4NCwxMCArODkwLDEwIEBACiAgICBQYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdmlhIG9wdC4KICAqLwogCi1zdGF0aWMgc3RydWN0IFFkaXNjICoKLXFkaXNjX2NyZWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpkZXZfcXVldWUsCi0JICAgICBzdHJ1Y3QgUWRpc2MgKnAsIHUzMiBwYXJlbnQsIHUzMiBoYW5kbGUsCi0JICAgICBzdHJ1Y3QgbmxhdHRyICoqdGNhLCBpbnQgKmVycnApCitzdGF0aWMgc3RydWN0IFFkaXNjICpxZGlzY19jcmVhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBuZXRkZXZfcXVldWUgKmRldl9xdWV1ZSwKKwkJCQkgIHN0cnVjdCBRZGlzYyAqcCwgdTMyIHBhcmVudCwgdTMyIGhhbmRsZSwKKwkJCQkgIHN0cnVjdCBubGF0dHIgKip0Y2EsIGludCAqZXJycCkKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBubGF0dHIgKmtpbmQgPSB0Y2FbVENBX0tJTkRdOwpAQCAtOTk4LDcgKzEwMDQsNyBAQAogCQkJCWdvdG8gZXJyX291dDQ7CiAJCX0KIAotCQlxZGlzY19saXN0X2FkZChzY2gpOworCQlxZGlzY19oYXNoX2FkZChzY2gpOwogCiAJCXJldHVybiBzY2g7CiAJfQpAQCAtMTA2OSw3ICsxMDc1LDggQEAKIAlpbnQJCQlkZXB0aDsKIH07CiAKLXN0YXRpYyBpbnQgY2hlY2tfbG9vcF9mbihzdHJ1Y3QgUWRpc2MgKnEsIHVuc2lnbmVkIGxvbmcgY2wsIHN0cnVjdCBxZGlzY193YWxrZXIgKncpOworc3RhdGljIGludCBjaGVja19sb29wX2ZuKHN0cnVjdCBRZGlzYyAqcSwgdW5zaWduZWQgbG9uZyBjbCwKKwkJCSBzdHJ1Y3QgcWRpc2Nfd2Fsa2VyICp3KTsKIAogc3RhdGljIGludCBjaGVja19sb29wKHN0cnVjdCBRZGlzYyAqcSwgc3RydWN0IFFkaXNjICpwLCBpbnQgZGVwdGgpCiB7CkBAIC0xNDMxLDEwICsxNDM4LDExIEBACiAKIHN0YXRpYyBpbnQgdGNfZHVtcF9xZGlzY19yb290KHN0cnVjdCBRZGlzYyAqcm9vdCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKLQkJCSAgICAgIGludCAqcV9pZHhfcCwgaW50IHNfcV9pZHgpCisJCQkgICAgICBpbnQgKnFfaWR4X3AsIGludCBzX3FfaWR4LCBib29sIHJlY3VyKQogewogCWludCByZXQgPSAwLCBxX2lkeCA9ICpxX2lkeF9wOwogCXN0cnVjdCBRZGlzYyAqcTsKKwlpbnQgYjsKIAogCWlmICghcm9vdCkKIAkJcmV0dXJuIDA7CkBAIC0xNDQ1LDE4ICsxNDUzLDMwIEBACiAJfSBlbHNlIHsKIAkJaWYgKCF0Y19xZGlzY19kdW1wX2lnbm9yZShxKSAmJgogCQkgICAgdGNfZmlsbF9xZGlzYyhza2IsIHEsIHEtPnBhcmVudCwgTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQsCi0JCQkJICBjYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLCBSVE1fTkVXUURJU0MpIDw9IDApCisJCQkJICBjYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLAorCQkJCSAgUlRNX05FV1FESVNDKSA8PSAwKQogCQkJZ290byBkb25lOwogCQlxX2lkeCsrOwogCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHEsICZyb290LT5saXN0LCBsaXN0KSB7CisKKwkvKiBJZiBkdW1waW5nIHNpbmdsZXRvbnMsIHRoZXJlIGlzIG5vIHFkaXNjX2Rldihyb290KSBhbmQgdGhlIHNpbmdsZXRvbgorCSAqIGl0c2VsZiBoYXMgYWxyZWFkeSBiZWVuIGR1bXBlZC4KKwkgKgorCSAqIElmIHdlJ3ZlIGFscmVhZHkgZHVtcGVkIHRoZSB0b3AtbGV2ZWwgKGluZ3Jlc3MpIHFkaXNjIGFib3ZlIGFuZCB0aGUgZ2xvYmFsCisJICogcWRpc2MgaGFzaHRhYmxlLCB3ZSBkb24ndCB3YW50IHRvIGhpdCBpdCBhZ2FpbgorCSAqLworCWlmICghcWRpc2NfZGV2KHJvb3QpIHx8ICFyZWN1cikKKwkJZ290byBvdXQ7CisKKwloYXNoX2Zvcl9lYWNoKHFkaXNjX2Rldihyb290KS0+cWRpc2NfaGFzaCwgYiwgcSwgaGFzaCkgewogCQlpZiAocV9pZHggPCBzX3FfaWR4KSB7CiAJCQlxX2lkeCsrOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKCF0Y19xZGlzY19kdW1wX2lnbm9yZShxKSAmJgogCQkgICAgdGNfZmlsbF9xZGlzYyhza2IsIHEsIHEtPnBhcmVudCwgTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQsCi0JCQkJICBjYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLCBSVE1fTkVXUURJU0MpIDw9IDApCisJCQkJICBjYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLAorCQkJCSAgUlRNX05FV1FESVNDKSA8PSAwKQogCQkJZ290byBkb25lOwogCQlxX2lkeCsrOwogCX0KQEAgLTE0OTAsMTMgKzE1MTAsMTQgQEAKIAkJCXNfcV9pZHggPSAwOwogCQlxX2lkeCA9IDA7CiAKLQkJaWYgKHRjX2R1bXBfcWRpc2Nfcm9vdChkZXYtPnFkaXNjLCBza2IsIGNiLCAmcV9pZHgsIHNfcV9pZHgpIDwgMCkKKwkJaWYgKHRjX2R1bXBfcWRpc2Nfcm9vdChkZXYtPnFkaXNjLCBza2IsIGNiLCAmcV9pZHgsIHNfcV9pZHgsCisJCQkJICAgICAgIHRydWUpIDwgMCkKIAkJCWdvdG8gZG9uZTsKIAogCQlkZXZfcXVldWUgPSBkZXZfaW5ncmVzc19xdWV1ZShkZXYpOwogCQlpZiAoZGV2X3F1ZXVlICYmCiAJCSAgICB0Y19kdW1wX3FkaXNjX3Jvb3QoZGV2X3F1ZXVlLT5xZGlzY19zbGVlcGluZywgc2tiLCBjYiwKLQkJCQkgICAgICAgJnFfaWR4LCBzX3FfaWR4KSA8IDApCisJCQkJICAgICAgICZxX2lkeCwgc19xX2lkeCwgZmFsc2UpIDwgMCkKIAkJCWdvdG8gZG9uZTsKIAogY29udDoKQEAgLTE2MjUsNyArMTY0Niw4IEBACiAJCQlpZiAoY29wcy0+ZGVsZXRlKQogCQkJCWVyciA9IGNvcHMtPmRlbGV0ZShxLCBjbCk7CiAJCQlpZiAoZXJyID09IDApCi0JCQkJdGNsYXNzX25vdGlmeShuZXQsIHNrYiwgbiwgcSwgY2wsIFJUTV9ERUxUQ0xBU1MpOworCQkJCXRjbGFzc19ub3RpZnkobmV0LCBza2IsIG4sIHEsIGNsLAorCQkJCQkgICAgICBSVE1fREVMVENMQVNTKTsKIAkJCWdvdG8gb3V0OwogCQljYXNlIFJUTV9HRVRUQ0xBU1M6CiAJCQllcnIgPSB0Y2xhc3Nfbm90aWZ5KG5ldCwgc2tiLCBuLCBxLCBjbCwgUlRNX05FV1RDTEFTUyk7CkBAIC0xNzIzLDEyICsxNzQ1LDE0IEBACiAJc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sJKmNiOwogfTsKIAotc3RhdGljIGludCBxZGlzY19jbGFzc19kdW1wKHN0cnVjdCBRZGlzYyAqcSwgdW5zaWduZWQgbG9uZyBjbCwgc3RydWN0IHFkaXNjX3dhbGtlciAqYXJnKQorc3RhdGljIGludCBxZGlzY19jbGFzc19kdW1wKHN0cnVjdCBRZGlzYyAqcSwgdW5zaWduZWQgbG9uZyBjbCwKKwkJCSAgICBzdHJ1Y3QgcWRpc2Nfd2Fsa2VyICphcmcpCiB7CiAJc3RydWN0IHFkaXNjX2R1bXBfYXJncyAqYSA9IChzdHJ1Y3QgcWRpc2NfZHVtcF9hcmdzICopYXJnOwogCiAJcmV0dXJuIHRjX2ZpbGxfdGNsYXNzKGEtPnNrYiwgcSwgY2wsIE5FVExJTktfQ0IoYS0+Y2ItPnNrYikucG9ydGlkLAotCQkJICAgICAgYS0+Y2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwgUlRNX05FV1RDTEFTUyk7CisJCQkgICAgICBhLT5jYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLAorCQkJICAgICAgUlRNX05FV1RDTEFTUyk7CiB9CiAKIHN0YXRpYyBpbnQgdGNfZHVtcF90Y2xhc3NfcWRpc2Moc3RydWN0IFFkaXNjICpxLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMTc2NSw2ICsxNzg5LDcgQEAKIAkJCSAgICAgICBpbnQgKnRfcCwgaW50IHNfdCkKIHsKIAlzdHJ1Y3QgUWRpc2MgKnE7CisJaW50IGI7CiAKIAlpZiAoIXJvb3QpCiAJCXJldHVybiAwOwpAQCAtMTc3Miw3ICsxNzk3LDEwIEBACiAJaWYgKHRjX2R1bXBfdGNsYXNzX3FkaXNjKHJvb3QsIHNrYiwgdGNtLCBjYiwgdF9wLCBzX3QpIDwgMCkKIAkJcmV0dXJuIC0xOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShxLCAmcm9vdC0+bGlzdCwgbGlzdCkgeworCWlmICghcWRpc2NfZGV2KHJvb3QpKQorCQlyZXR1cm4gMDsKKworCWhhc2hfZm9yX2VhY2gocWRpc2NfZGV2KHJvb3QpLT5xZGlzY19oYXNoLCBiLCBxLCBoYXNoKSB7CiAJCWlmICh0Y19kdW1wX3RjbGFzc19xZGlzYyhxLCBza2IsIHRjbSwgY2IsIHRfcCwgc190KSA8IDApCiAJCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTk1NywxMCArMTk4NSwxMiBAQAogCiAJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ORVdRRElTQywgdGNfbW9kaWZ5X3FkaXNjLCBOVUxMLCBOVUxMKTsKIAlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0RFTFFESVNDLCB0Y19nZXRfcWRpc2MsIE5VTEwsIE5VTEwpOwotCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fR0VUUURJU0MsIHRjX2dldF9xZGlzYywgdGNfZHVtcF9xZGlzYywgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRRRElTQywgdGNfZ2V0X3FkaXNjLCB0Y19kdW1wX3FkaXNjLAorCQkgICAgICBOVUxMKTsKIAlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX05FV1RDTEFTUywgdGNfY3RsX3RjbGFzcywgTlVMTCwgTlVMTCk7CiAJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ERUxUQ0xBU1MsIHRjX2N0bF90Y2xhc3MsIE5VTEwsIE5VTEwpOwotCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fR0VUVENMQVNTLCB0Y19jdGxfdGNsYXNzLCB0Y19kdW1wX3RjbGFzcywgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRUQ0xBU1MsIHRjX2N0bF90Y2xhc3MsIHRjX2R1bXBfdGNsYXNzLAorCQkgICAgICBOVUxMKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9jb2RlbC5jIGIvbmV0L3NjaGVkL3NjaF9jb2RlbC5jCmluZGV4IDQwMDJkZjMuLjViZmE3OWUgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfY29kZWwuYworKysgYi9uZXQvc2NoZWQvc2NoX2NvZGVsLmMKQEAgLTY5LDcgKzY5LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqZGVxdWV1ZV9mdW5jKHN0cnVjdCBjb2RlbF92YXJzICp2YXJzLCB2b2lkICpjdHgpCiB7CiAJc3RydWN0IFFkaXNjICpzY2ggPSBjdHg7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IF9fc2tiX2RlcXVldWUoJnNjaC0+cSk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IF9fcWRpc2NfZGVxdWV1ZV9oZWFkKCZzY2gtPnEpOwogCiAJaWYgKHNrYikKIAkJc2NoLT5xc3RhdHMuYmFja2xvZyAtPSBxZGlzY19wa3RfbGVuKHNrYik7CkBAIC0xNzIsNyArMTcyLDcgQEAKIAogCXFsZW4gPSBzY2gtPnEucWxlbjsKIAl3aGlsZSAoc2NoLT5xLnFsZW4gPiBzY2gtPmxpbWl0KSB7Ci0JCXN0cnVjdCBza19idWZmICpza2IgPSBfX3NrYl9kZXF1ZXVlKCZzY2gtPnEpOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19xZGlzY19kZXF1ZXVlX2hlYWQoJnNjaC0+cSk7CiAKIAkJZHJvcHBlZCArPSBxZGlzY19wa3RfbGVuKHNrYik7CiAJCXFkaXNjX3FzdGF0c19iYWNrbG9nX2RlYyhzY2gsIHNrYik7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2ZpZm8uYyBiL25ldC9zY2hlZC9zY2hfZmlmby5jCmluZGV4IGJhZWVkNmEuLjFlMzcyNDcgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfZmlmby5jCisrKyBiL25ldC9zY2hlZC9zY2hfZmlmby5jCkBAIC0zMSw3ICszMSw3IEBACiBzdGF0aWMgaW50IHBmaWZvX2VucXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpzY2gsCiAJCQkgc3RydWN0IHNrX2J1ZmYgKip0b19mcmVlKQogewotCWlmIChsaWtlbHkoc2tiX3F1ZXVlX2xlbigmc2NoLT5xKSA8IHNjaC0+bGltaXQpKQorCWlmIChsaWtlbHkoc2NoLT5xLnFsZW4gPCBzY2gtPmxpbWl0KSkKIAkJcmV0dXJuIHFkaXNjX2VucXVldWVfdGFpbChza2IsIHNjaCk7CiAKIAlyZXR1cm4gcWRpc2NfZHJvcChza2IsIHNjaCwgdG9fZnJlZSk7CkBAIC00Miw3ICs0Miw3IEBACiB7CiAJdW5zaWduZWQgaW50IHByZXZfYmFja2xvZzsKIAotCWlmIChsaWtlbHkoc2tiX3F1ZXVlX2xlbigmc2NoLT5xKSA8IHNjaC0+bGltaXQpKQorCWlmIChsaWtlbHkoc2NoLT5xLnFsZW4gPCBzY2gtPmxpbWl0KSkKIAkJcmV0dXJuIHFkaXNjX2VucXVldWVfdGFpbChza2IsIHNjaCk7CiAKIAlwcmV2X2JhY2tsb2cgPSBzY2gtPnFzdGF0cy5iYWNrbG9nOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9mcS5jIGIvbmV0L3NjaGVkL3NjaF9mcS5jCmluZGV4IGU1NDU4YjkuLjE4ZTc1MjQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfZnEuYworKysgYi9uZXQvc2NoZWQvc2NoX2ZxLmMKQEAgLTg2LDYgKzg2LDcgQEAKIAogCXN0cnVjdCByYl9yb290CWRlbGF5ZWQ7CS8qIGZvciByYXRlIGxpbWl0ZWQgZmxvd3MgKi8KIAl1NjQJCXRpbWVfbmV4dF9kZWxheWVkX2Zsb3c7CisJdW5zaWduZWQgbG9uZwl1bnRocm90dGxlX2xhdGVuY3lfbnM7CiAKIAlzdHJ1Y3QgZnFfZmxvdwlpbnRlcm5hbDsJLyogZm9yIG5vbiBjbGFzc2lmaWVkIG9yIGhpZ2ggcHJpbyBwYWNrZXRzICovCiAJdTMyCQlxdWFudHVtOwpAQCAtOTQsNiArOTUsNyBAQAogCXUzMgkJZmxvd19tYXhfcmF0ZTsJLyogb3B0aW9uYWwgbWF4IHJhdGUgcGVyIGZsb3cgKi8KIAl1MzIJCWZsb3dfcGxpbWl0OwkvKiBtYXggcGFja2V0cyBwZXIgZmxvdyAqLwogCXUzMgkJb3JwaGFuX21hc2s7CS8qIG1hc2sgZm9yIG9ycGhhbmVkIHNrYiAqLworCXUzMgkJbG93X3JhdGVfdGhyZXNob2xkOwogCXN0cnVjdCByYl9yb290CSpmcV9yb290OwogCXU4CQlyYXRlX2VuYWJsZTsKIAl1OAkJZnFfdHJlZXNfbG9nOwpAQCAtNDA3LDExICs0MDksMTkgQEAKIAogc3RhdGljIHZvaWQgZnFfY2hlY2tfdGhyb3R0bGVkKHN0cnVjdCBmcV9zY2hlZF9kYXRhICpxLCB1NjQgbm93KQogeworCXVuc2lnbmVkIGxvbmcgc2FtcGxlOwogCXN0cnVjdCByYl9ub2RlICpwOwogCiAJaWYgKHEtPnRpbWVfbmV4dF9kZWxheWVkX2Zsb3cgPiBub3cpCiAJCXJldHVybjsKIAorCS8qIFVwZGF0ZSB1bnRocm90dGxlIGxhdGVuY3kgRVdNQS4KKwkgKiBUaGlzIGlzIGNoZWFwIGFuZCBjYW4gaGVscCBkaWFnbm9zaW5nIHRpbWVyL2xhdGVuY3kgcHJvYmxlbXMuCisJICovCisJc2FtcGxlID0gKHVuc2lnbmVkIGxvbmcpKG5vdyAtIHEtPnRpbWVfbmV4dF9kZWxheWVkX2Zsb3cpOworCXEtPnVudGhyb3R0bGVfbGF0ZW5jeV9ucyAtPSBxLT51bnRocm90dGxlX2xhdGVuY3lfbnMgPj4gMzsKKwlxLT51bnRocm90dGxlX2xhdGVuY3lfbnMgKz0gc2FtcGxlID4+IDM7CisKIAlxLT50aW1lX25leHRfZGVsYXllZF9mbG93ID0gfjBVTEw7CiAJd2hpbGUgKChwID0gcmJfZmlyc3QoJnEtPmRlbGF5ZWQpKSAhPSBOVUxMKSB7CiAJCXN0cnVjdCBmcV9mbG93ICpmID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCBmcV9mbG93LCByYXRlX25vZGUpOwpAQCAtNDMzLDcgKzQ0Myw3IEBACiAJc3RydWN0IGZxX2Zsb3dfaGVhZCAqaGVhZDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBmcV9mbG93ICpmOwotCXUzMiByYXRlOworCXUzMiByYXRlLCBwbGVuOwogCiAJc2tiID0gZnFfZGVxdWV1ZV9oZWFkKHNjaCwgJnEtPmludGVybmFsKTsKIAlpZiAoc2tiKQpAQCAtNDgyLDcgKzQ5Miw3IEBACiAJcHJlZmV0Y2goJnNrYi0+ZW5kKTsKIAlmLT5jcmVkaXQgLT0gcWRpc2NfcGt0X2xlbihza2IpOwogCi0JaWYgKGYtPmNyZWRpdCA+IDAgfHwgIXEtPnJhdGVfZW5hYmxlKQorCWlmICghcS0+cmF0ZV9lbmFibGUpCiAJCWdvdG8gb3V0OwogCiAJLyogRG8gbm90IHBhY2UgbG9jYWxseSBnZW5lcmF0ZWQgYWNrIHBhY2tldHMgKi8KQEAgLTQ5Myw4ICs1MDMsMTUgQEAKIAlpZiAoc2tiLT5zaykKIAkJcmF0ZSA9IG1pbihza2ItPnNrLT5za19wYWNpbmdfcmF0ZSwgcmF0ZSk7CiAKKwlpZiAocmF0ZSA8PSBxLT5sb3dfcmF0ZV90aHJlc2hvbGQpIHsKKwkJZi0+Y3JlZGl0ID0gMDsKKwkJcGxlbiA9IHFkaXNjX3BrdF9sZW4oc2tiKTsKKwl9IGVsc2UgeworCQlwbGVuID0gbWF4KHFkaXNjX3BrdF9sZW4oc2tiKSwgcS0+cXVhbnR1bSk7CisJCWlmIChmLT5jcmVkaXQgPiAwKQorCQkJZ290byBvdXQ7CisJfQogCWlmIChyYXRlICE9IH4wVSkgewotCQl1MzIgcGxlbiA9IG1heChxZGlzY19wa3RfbGVuKHNrYiksIHEtPnF1YW50dW0pOwogCQl1NjQgbGVuID0gKHU2NClwbGVuICogTlNFQ19QRVJfU0VDOwogCiAJCWlmIChsaWtlbHkocmF0ZSkpCkBAIC01MDcsNyArNTI0LDEyIEBACiAJCQlsZW4gPSBOU0VDX1BFUl9TRUM7CiAJCQlxLT5zdGF0X3BrdHNfdG9vX2xvbmcrKzsKIAkJfQotCisJCS8qIEFjY291bnQgZm9yIHNjaGVkdWxlL3RpbWVycyBkcmlmdHMuCisJCSAqIGYtPnRpbWVfbmV4dF9wYWNrZXQgd2FzIHNldCB3aGVuIHByaW9yIHBhY2tldCB3YXMgc2VudCwKKwkJICogYW5kIGN1cnJlbnQgdGltZSAoQG5vdykgY2FuIGJlIHRvbyBsYXRlIGJ5IHRlbnMgb2YgdXMuCisJCSAqLworCQlpZiAoZi0+dGltZV9uZXh0X3BhY2tldCkKKwkJCWxlbiAtPSBtaW4obGVuLzIsIG5vdyAtIGYtPnRpbWVfbmV4dF9wYWNrZXQpOwogCQlmLT50aW1lX25leHRfcGFja2V0ID0gbm93ICsgbGVuOwogCX0KIG91dDoKQEAgLTY2Miw2ICs2ODQsNyBAQAogCVtUQ0FfRlFfRkxPV19NQVhfUkFURV0JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKIAlbVENBX0ZRX0JVQ0tFVFNfTE9HXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtUQ0FfRlFfRkxPV19SRUZJTExfREVMQVldCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbVENBX0ZRX0xPV19SQVRFX1RIUkVTSE9MRF0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogfTsKIAogc3RhdGljIGludCBmcV9jaGFuZ2Uoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBubGF0dHIgKm9wdCkKQEAgLTcxNiw2ICs3MzksMTAgQEAKIAlpZiAodGJbVENBX0ZRX0ZMT1dfTUFYX1JBVEVdKQogCQlxLT5mbG93X21heF9yYXRlID0gbmxhX2dldF91MzIodGJbVENBX0ZRX0ZMT1dfTUFYX1JBVEVdKTsKIAorCWlmICh0YltUQ0FfRlFfTE9XX1JBVEVfVEhSRVNIT0xEXSkKKwkJcS0+bG93X3JhdGVfdGhyZXNob2xkID0KKwkJCW5sYV9nZXRfdTMyKHRiW1RDQV9GUV9MT1dfUkFURV9USFJFU0hPTERdKTsKKwogCWlmICh0YltUQ0FfRlFfUkFURV9FTkFCTEVdKSB7CiAJCXUzMiBlbmFibGUgPSBubGFfZ2V0X3UzMih0YltUQ0FfRlFfUkFURV9FTkFCTEVdKTsKIApAQCAtNzc0LDYgKzgwMSw3IEBACiAJcS0+aW5pdGlhbF9xdWFudHVtCT0gMTAgKiBwc2NoZWRfbXR1KHFkaXNjX2RldihzY2gpKTsKIAlxLT5mbG93X3JlZmlsbF9kZWxheQk9IG1zZWNzX3RvX2ppZmZpZXMoNDApOwogCXEtPmZsb3dfbWF4X3JhdGUJPSB+MFU7CisJcS0+dGltZV9uZXh0X2RlbGF5ZWRfZmxvdyA9IH4wVUxMOwogCXEtPnJhdGVfZW5hYmxlCQk9IDE7CiAJcS0+bmV3X2Zsb3dzLmZpcnN0CT0gTlVMTDsKIAlxLT5vbGRfZmxvd3MuZmlyc3QJPSBOVUxMOwpAQCAtNzgxLDYgKzgwOSw3IEBACiAJcS0+ZnFfcm9vdAkJPSBOVUxMOwogCXEtPmZxX3RyZWVzX2xvZwkJPSBpbG9nMigxMDI0KTsKIAlxLT5vcnBoYW5fbWFzawkJPSAxMDI0IC0gMTsKKwlxLT5sb3dfcmF0ZV90aHJlc2hvbGQJPSA1NTAwMDAgLyA4OwogCXFkaXNjX3dhdGNoZG9nX2luaXQoJnEtPndhdGNoZG9nLCBzY2gpOwogCiAJaWYgKG9wdCkKQEAgLTgxMSw2ICs4NDAsOCBAQAogCSAgICBubGFfcHV0X3UzMihza2IsIFRDQV9GUV9GTE9XX1JFRklMTF9ERUxBWSwKIAkJCWppZmZpZXNfdG9fdXNlY3MocS0+Zmxvd19yZWZpbGxfZGVsYXkpKSB8fAogCSAgICBubGFfcHV0X3UzMihza2IsIFRDQV9GUV9PUlBIQU5fTUFTSywgcS0+b3JwaGFuX21hc2spIHx8CisJICAgIG5sYV9wdXRfdTMyKHNrYiwgVENBX0ZRX0xPV19SQVRFX1RIUkVTSE9MRCwKKwkJCXEtPmxvd19yYXRlX3RocmVzaG9sZCkgfHwKIAkgICAgbmxhX3B1dF91MzIoc2tiLCBUQ0FfRlFfQlVDS0VUU19MT0csIHEtPmZxX3RyZWVzX2xvZykpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCkBAIC04MjMsMjAgKzg1NCwyNCBAQAogc3RhdGljIGludCBmcV9kdW1wX3N0YXRzKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3QgZ25ldF9kdW1wICpkKQogewogCXN0cnVjdCBmcV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwotCXU2NCBub3cgPSBrdGltZV9nZXRfbnMoKTsKLQlzdHJ1Y3QgdGNfZnFfcWRfc3RhdHMgc3QgPSB7Ci0JCS5nY19mbG93cwkJPSBxLT5zdGF0X2djX2Zsb3dzLAotCQkuaGlnaHByaW9fcGFja2V0cwk9IHEtPnN0YXRfaW50ZXJuYWxfcGFja2V0cywKLQkJLnRjcF9yZXRyYW5zCQk9IHEtPnN0YXRfdGNwX3JldHJhbnMsCi0JCS50aHJvdHRsZWQJCT0gcS0+c3RhdF90aHJvdHRsZWQsCi0JCS5mbG93c19wbGltaXQJCT0gcS0+c3RhdF9mbG93c19wbGltaXQsCi0JCS5wa3RzX3Rvb19sb25nCQk9IHEtPnN0YXRfcGt0c190b29fbG9uZywKLQkJLmFsbG9jYXRpb25fZXJyb3JzCT0gcS0+c3RhdF9hbGxvY2F0aW9uX2Vycm9ycywKLQkJLmZsb3dzCQkJPSBxLT5mbG93cywKLQkJLmluYWN0aXZlX2Zsb3dzCQk9IHEtPmluYWN0aXZlX2Zsb3dzLAotCQkudGhyb3R0bGVkX2Zsb3dzCT0gcS0+dGhyb3R0bGVkX2Zsb3dzLAotCQkudGltZV9uZXh0X2RlbGF5ZWRfZmxvdwk9IHEtPnRpbWVfbmV4dF9kZWxheWVkX2Zsb3cgLSBub3csCi0JfTsKKwlzdHJ1Y3QgdGNfZnFfcWRfc3RhdHMgc3Q7CisKKwlzY2hfdHJlZV9sb2NrKHNjaCk7CisKKwlzdC5nY19mbG93cwkJICA9IHEtPnN0YXRfZ2NfZmxvd3M7CisJc3QuaGlnaHByaW9fcGFja2V0cwkgID0gcS0+c3RhdF9pbnRlcm5hbF9wYWNrZXRzOworCXN0LnRjcF9yZXRyYW5zCQkgID0gcS0+c3RhdF90Y3BfcmV0cmFuczsKKwlzdC50aHJvdHRsZWQJCSAgPSBxLT5zdGF0X3Rocm90dGxlZDsKKwlzdC5mbG93c19wbGltaXQJCSAgPSBxLT5zdGF0X2Zsb3dzX3BsaW1pdDsKKwlzdC5wa3RzX3Rvb19sb25nCSAgPSBxLT5zdGF0X3BrdHNfdG9vX2xvbmc7CisJc3QuYWxsb2NhdGlvbl9lcnJvcnMJICA9IHEtPnN0YXRfYWxsb2NhdGlvbl9lcnJvcnM7CisJc3QudGltZV9uZXh0X2RlbGF5ZWRfZmxvdyA9IHEtPnRpbWVfbmV4dF9kZWxheWVkX2Zsb3cgLSBrdGltZV9nZXRfbnMoKTsKKwlzdC5mbG93cwkJICA9IHEtPmZsb3dzOworCXN0LmluYWN0aXZlX2Zsb3dzCSAgPSBxLT5pbmFjdGl2ZV9mbG93czsKKwlzdC50aHJvdHRsZWRfZmxvd3MJICA9IHEtPnRocm90dGxlZF9mbG93czsKKwlzdC51bnRocm90dGxlX2xhdGVuY3lfbnMgID0gbWluX3QodW5zaWduZWQgbG9uZywKKwkJCQkJICBxLT51bnRocm90dGxlX2xhdGVuY3lfbnMsIH4wVSk7CisJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CiAKIAlyZXR1cm4gZ25ldF9zdGF0c19jb3B5X2FwcChkLCAmc3QsIHNpemVvZihzdCkpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9nZW5lcmljLmMgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwppbmRleCBlOTViNjdjLi42Y2ZiNmU5IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYworKysgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwpAQCAtNDIzLDcgKzQyMyw2IEBACiAJLmRlcXVldWUJPQlub29wX2RlcXVldWUsCiAJLmZsYWdzCQk9CVRDUV9GX0JVSUxUSU4sCiAJLm9wcwkJPQkmbm9vcF9xZGlzY19vcHMsCi0JLmxpc3QJCT0JTElTVF9IRUFEX0lOSVQobm9vcF9xZGlzYy5saXN0KSwKIAkucS5sb2NrCQk9CV9fU1BJTl9MT0NLX1VOTE9DS0VEKG5vb3BfcWRpc2MucS5sb2NrKSwKIAkuZGV2X3F1ZXVlCT0JJm5vb3BfbmV0ZGV2X3F1ZXVlLAogCS5ydW5uaW5nCT0JU0VRQ05UX1pFUk8obm9vcF9xZGlzYy5ydW5uaW5nKSwKQEAgLTQ2Nyw3ICs0NjYsNyBAQAogICovCiBzdHJ1Y3QgcGZpZm9fZmFzdF9wcml2IHsKIAl1MzIgYml0bWFwOwotCXN0cnVjdCBza19idWZmX2hlYWQgcVtQRklGT19GQVNUX0JBTkRTXTsKKwlzdHJ1Y3QgcWRpc2Nfc2tiX2hlYWQgcVtQRklGT19GQVNUX0JBTkRTXTsKIH07CiAKIC8qCkBAIC00NzgsNyArNDc3LDcgQEAKICAqLwogc3RhdGljIGNvbnN0IGludCBiaXRtYXAyYmFuZFtdID0gey0xLCAwLCAxLCAwLCAyLCAwLCAxLCAwfTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpiYW5kMmxpc3Qoc3RydWN0IHBmaWZvX2Zhc3RfcHJpdiAqcHJpdiwKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHFkaXNjX3NrYl9oZWFkICpiYW5kMmxpc3Qoc3RydWN0IHBmaWZvX2Zhc3RfcHJpdiAqcHJpdiwKIAkJCQkJICAgICBpbnQgYmFuZCkKIHsKIAlyZXR1cm4gcHJpdi0+cSArIGJhbmQ7CkBAIC00ODcsMTAgKzQ4NiwxMCBAQAogc3RhdGljIGludCBwZmlmb19mYXN0X2VucXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpxZGlzYywKIAkJCSAgICAgIHN0cnVjdCBza19idWZmICoqdG9fZnJlZSkKIHsKLQlpZiAoc2tiX3F1ZXVlX2xlbigmcWRpc2MtPnEpIDwgcWRpc2NfZGV2KHFkaXNjKS0+dHhfcXVldWVfbGVuKSB7CisJaWYgKHFkaXNjLT5xLnFsZW4gPCBxZGlzY19kZXYocWRpc2MpLT50eF9xdWV1ZV9sZW4pIHsKIAkJaW50IGJhbmQgPSBwcmlvMmJhbmRbc2tiLT5wcmlvcml0eSAmIFRDX1BSSU9fTUFYXTsKIAkJc3RydWN0IHBmaWZvX2Zhc3RfcHJpdiAqcHJpdiA9IHFkaXNjX3ByaXYocWRpc2MpOwotCQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0ID0gYmFuZDJsaXN0KHByaXYsIGJhbmQpOworCQlzdHJ1Y3QgcWRpc2Nfc2tiX2hlYWQgKmxpc3QgPSBiYW5kMmxpc3QocHJpdiwgYmFuZCk7CiAKIAkJcHJpdi0+Yml0bWFwIHw9ICgxIDw8IGJhbmQpOwogCQlxZGlzYy0+cS5xbGVuKys7CkBAIC01MDYsMTEgKzUwNSwxNiBAQAogCWludCBiYW5kID0gYml0bWFwMmJhbmRbcHJpdi0+Yml0bWFwXTsKIAogCWlmIChsaWtlbHkoYmFuZCA+PSAwKSkgewotCQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0ID0gYmFuZDJsaXN0KHByaXYsIGJhbmQpOwotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19xZGlzY19kZXF1ZXVlX2hlYWQocWRpc2MsIGxpc3QpOworCQlzdHJ1Y3QgcWRpc2Nfc2tiX2hlYWQgKnFoID0gYmFuZDJsaXN0KHByaXYsIGJhbmQpOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19xZGlzY19kZXF1ZXVlX2hlYWQocWgpOworCisJCWlmIChsaWtlbHkoc2tiICE9IE5VTEwpKSB7CisJCQlxZGlzY19xc3RhdHNfYmFja2xvZ19kZWMocWRpc2MsIHNrYik7CisJCQlxZGlzY19ic3RhdHNfdXBkYXRlKHFkaXNjLCBza2IpOworCQl9CiAKIAkJcWRpc2MtPnEucWxlbi0tOwotCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KGxpc3QpKQorCQlpZiAocWgtPnFsZW4gPT0gMCkKIAkJCXByaXYtPmJpdG1hcCAmPSB+KDEgPDwgYmFuZCk7CiAKIAkJcmV0dXJuIHNrYjsKQEAgLTUyNSw5ICs1MjksOSBAQAogCWludCBiYW5kID0gYml0bWFwMmJhbmRbcHJpdi0+Yml0bWFwXTsKIAogCWlmIChiYW5kID49IDApIHsKLQkJc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCA9IGJhbmQybGlzdChwcml2LCBiYW5kKTsKKwkJc3RydWN0IHFkaXNjX3NrYl9oZWFkICpxaCA9IGJhbmQybGlzdChwcml2LCBiYW5kKTsKIAotCQlyZXR1cm4gc2tiX3BlZWsobGlzdCk7CisJCXJldHVybiBxaC0+aGVhZDsKIAl9CiAKIAlyZXR1cm4gTlVMTDsKQEAgLTU2NSw3ICs1NjksNyBAQAogCXN0cnVjdCBwZmlmb19mYXN0X3ByaXYgKnByaXYgPSBxZGlzY19wcml2KHFkaXNjKTsKIAogCWZvciAocHJpbyA9IDA7IHByaW8gPCBQRklGT19GQVNUX0JBTkRTOyBwcmlvKyspCi0JCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdChiYW5kMmxpc3QocHJpdiwgcHJpbykpOworCQlxZGlzY19za2JfaGVhZF9pbml0KGJhbmQybGlzdChwcml2LCBwcmlvKSk7CiAKIAkvKiBDYW4gYnktcGFzcyB0aGUgcXVldWUgZGlzY2lwbGluZSAqLwogCXFkaXNjLT5mbGFncyB8PSBUQ1FfRl9DQU5fQllQQVNTOwpAQCAtNjEzLDggKzYxNyw4IEBACiAJCXNjaCA9IChzdHJ1Y3QgUWRpc2MgKikgUURJU0NfQUxJR04oKHVuc2lnbmVkIGxvbmcpIHApOwogCQlzY2gtPnBhZGRlZCA9IChjaGFyICopIHNjaCAtIChjaGFyICopIHA7CiAJfQotCUlOSVRfTElTVF9IRUFEKCZzY2gtPmxpc3QpOwotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNjaC0+cSk7CisJcWRpc2Nfc2tiX2hlYWRfaW5pdCgmc2NoLT5xKTsKKwlzcGluX2xvY2tfaW5pdCgmc2NoLT5xLmxvY2spOwogCiAJc3Bpbl9sb2NrX2luaXQoJnNjaC0+YnVzeWxvY2spOwogCWxvY2tkZXBfc2V0X2NsYXNzKCZzY2gtPmJ1c3lsb2NrLApAQCAtNjQzLDE4ICs2NDcsMTkgQEAKIAlzdHJ1Y3QgUWRpc2MgKnNjaDsKIAogCWlmICghdHJ5X21vZHVsZV9nZXQob3BzLT5vd25lcikpCi0JCWdvdG8gZXJyb3V0OworCQlyZXR1cm4gTlVMTDsKIAogCXNjaCA9IHFkaXNjX2FsbG9jKGRldl9xdWV1ZSwgb3BzKTsKLQlpZiAoSVNfRVJSKHNjaCkpCi0JCWdvdG8gZXJyb3V0OworCWlmIChJU19FUlIoc2NoKSkgeworCQltb2R1bGVfcHV0KG9wcy0+b3duZXIpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAJc2NoLT5wYXJlbnQgPSBwYXJlbnRpZDsKIAogCWlmICghb3BzLT5pbml0IHx8IG9wcy0+aW5pdChzY2gsIE5VTEwpID09IDApCiAJCXJldHVybiBzY2g7CiAKIAlxZGlzY19kZXN0cm95KHNjaCk7Ci1lcnJvdXQ6CiAJcmV0dXJuIE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MKHFkaXNjX2NyZWF0ZV9kZmx0KTsKQEAgLTcwMCw3ICs3MDUsNyBAQAogCQlyZXR1cm47CiAKICNpZmRlZiBDT05GSUdfTkVUX1NDSEVECi0JcWRpc2NfbGlzdF9kZWwocWRpc2MpOworCXFkaXNjX2hhc2hfZGVsKHFkaXNjKTsKIAogCXFkaXNjX3B1dF9zdGFiKHJ0bmxfZGVyZWZlcmVuY2UocWRpc2MtPnN0YWIpKTsKICNlbmRpZgpAQCAtNzg4LDYgKzc5MywxMCBAQAogCQkJcWRpc2MtPm9wcy0+YXR0YWNoKHFkaXNjKTsKIAkJfQogCX0KKyNpZmRlZiBDT05GSUdfTkVUX1NDSEVECisJaWYgKGRldi0+cWRpc2MpCisJCXFkaXNjX2hhc2hfYWRkKGRldi0+cWRpc2MpOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIHRyYW5zaXRpb25fb25lX3FkaXNjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2hmc2MuYyBiL25ldC9zY2hlZC9zY2hfaGZzYy5jCmluZGV4IDNkZGM3YmQuLjAwMGYxZDMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfaGZzYy5jCisrKyBiL25ldC9zY2hlZC9zY2hfaGZzYy5jCkBAIC0xNDIsOCArMTQyLDYgQEAKIAkJCQkJICAgbGluay1zaGFyaW5nLCBtYXgobXlmLCBjZm1pbikgKi8KIAl1NjQJY2xfbXlmOwkJCS8qIG15IGZpdC10aW1lIChjYWxjdWxhdGVkIGZyb20gdGhpcwogCQkJCQkgICBjbGFzcydzIG93biB1cHBlcmxpbWl0IGN1cnZlKSAqLwotCXU2NAljbF9teWZhZGo7CQkvKiBteSBmaXQtdGltZSBhZGp1c3RtZW50ICh0byBjYW5jZWwKLQkJCQkJICAgaGlzdG9yeSBkZXBlbmRlbmNlKSAqLwogCXU2NAljbF9jZm1pbjsJCS8qIGVhcmxpZXN0IGNoaWxkcmVuJ3MgZml0LXRpbWUgKHVzZWQKIAkJCQkJICAgd2l0aCBjbF9teWYgdG8gb2J0YWluIGNsX2YpICovCiAJdTY0CWNsX2N2dG1pbjsJCS8qIG1pbmltYWwgdmlydHVhbCB0aW1lIGFtb25nIHRoZQpAQCAtMTUxLDExICsxNDksOCBAQAogCQkJCQkgICAobW9ub3RvbmljIHdpdGhpbiBhIHBlcmlvZCkgKi8KIAl1NjQJY2xfdnRhZGo7CQkvKiBpbnRyYS1wZXJpb2QgY3VtdWxhdGl2ZSB2dAogCQkJCQkgICBhZGp1c3RtZW50ICovCi0JdTY0CWNsX3Z0b2ZmOwkJLyogaW50ZXItcGVyaW9kIGN1bXVsYXRpdmUgdnQgb2Zmc2V0ICovCi0JdTY0CWNsX2N2dG1heDsJCS8qIG1heCBjaGlsZCdzIHZ0IGluIHRoZSBsYXN0IHBlcmlvZCAqLwotCXU2NAljbF9jdnRvZmY7CQkvKiBjdW11bGF0aXZlIGN2dG1heCBvZiBhbGwgcGVyaW9kcyAqLwotCXU2NAljbF9wY3Z0b2ZmOwkJLyogcGFyZW50J3MgY3Z0b2ZmIGF0IGluaXRpYWxpemF0aW9uCi0JCQkJCSAgIHRpbWUgKi8KKwl1NjQJY2xfY3Z0b2ZmOwkJLyogbGFyZ2VzdCB2aXJ0dWFsIHRpbWUgc2VlbiBhbW9uZworCQkJCQkgICB0aGUgY2hpbGRyZW4gKi8KIAogCXN0cnVjdCBpbnRlcm5hbF9zYyBjbF9yc2M7CS8qIGludGVybmFsIHJlYWwtdGltZSBzZXJ2aWNlIGN1cnZlICovCiAJc3RydWN0IGludGVybmFsX3NjIGNsX2ZzYzsJLyogaW50ZXJuYWwgZmFpciBzZXJ2aWNlIGN1cnZlICovCkBAIC03MDEsMjggKzY5NiwxNiBAQAogCQkJfSBlbHNlIHsKIAkJCQkvKgogCQkJCSAqIGZpcnN0IGNoaWxkIGZvciBhIG5ldyBwYXJlbnQgYmFja2xvZyBwZXJpb2QuCi0JCQkJICogYWRkIHBhcmVudCdzIGN2dG1heCB0byBjdnRvZmYgdG8gbWFrZSBhIG5ldwotCQkJCSAqIHZ0ICh2dG9mZiArIHZ0KSBsYXJnZXIgdGhhbiB0aGUgdnQgaW4gdGhlCi0JCQkJICogbGFzdCBwZXJpb2QgZm9yIGFsbCBjaGlsZHJlbi4KKwkJCQkgKiBpbml0aWFsaXplIGNsX3Z0IHRvIHRoZSBoaWdoZXN0IHZhbHVlIHNlZW4KKwkJCQkgKiBhbW9uZyB0aGUgc2libGluZ3MuIHRoaXMgaXMgYW5hbG9nb3VzIHRvCisJCQkJICogd2hhdCBjdXJfdGltZSB3b3VsZCBwcm92aWRlIGluIHJlYWx0aW1lIGNhc2UuCiAJCQkJICovCi0JCQkJdnQgPSBjbC0+Y2xfcGFyZW50LT5jbF9jdnRtYXg7Ci0JCQkJY2wtPmNsX3BhcmVudC0+Y2xfY3Z0b2ZmICs9IHZ0OwotCQkJCWNsLT5jbF9wYXJlbnQtPmNsX2N2dG1heCA9IDA7CisJCQkJY2wtPmNsX3Z0ID0gY2wtPmNsX3BhcmVudC0+Y2xfY3Z0b2ZmOwogCQkJCWNsLT5jbF9wYXJlbnQtPmNsX2N2dG1pbiA9IDA7Ci0JCQkJY2wtPmNsX3Z0ID0gMDsKIAkJCX0KIAotCQkJY2wtPmNsX3Z0b2ZmID0gY2wtPmNsX3BhcmVudC0+Y2xfY3Z0b2ZmIC0KLQkJCQkJCQljbC0+Y2xfcGN2dG9mZjsKLQogCQkJLyogdXBkYXRlIHRoZSB2aXJ0dWFsIGN1cnZlICovCi0JCQl2dCA9IGNsLT5jbF92dCArIGNsLT5jbF92dG9mZjsKLQkJCXJ0c2NfbWluKCZjbC0+Y2xfdmlydHVhbCwgJmNsLT5jbF9mc2MsIHZ0LAotCQkJCQkJICAgICAgY2wtPmNsX3RvdGFsKTsKLQkJCWlmIChjbC0+Y2xfdmlydHVhbC54ID09IHZ0KSB7Ci0JCQkJY2wtPmNsX3ZpcnR1YWwueCAtPSBjbC0+Y2xfdnRvZmY7Ci0JCQkJY2wtPmNsX3Z0b2ZmID0gMDsKLQkJCX0KKwkJCXJ0c2NfbWluKCZjbC0+Y2xfdmlydHVhbCwgJmNsLT5jbF9mc2MsIGNsLT5jbF92dCwgY2wtPmNsX3RvdGFsKTsKIAkJCWNsLT5jbF92dGFkaiA9IDA7CiAKIAkJCWNsLT5jbF92dHBlcmlvZCsrOyAgLyogaW5jcmVtZW50IHZ0IHBlcmlvZCAqLwpAQCAtNzQ1LDcgKzcyOCw2IEBACiAJCQkJLyogY29tcHV0ZSBteWYgKi8KIAkJCQljbC0+Y2xfbXlmID0gcnRzY195MngoJmNsLT5jbF91bGltaXQsCiAJCQkJCQkgICAgICBjbC0+Y2xfdG90YWwpOwotCQkJCWNsLT5jbF9teWZhZGogPSAwOwogCQkJfQogCQl9CiAKQEAgLTc3OSw4ICs3NjEsNyBAQAogCQkJZ29fcGFzc2l2ZSA9IDA7CiAKIAkJLyogdXBkYXRlIHZ0ICovCi0JCWNsLT5jbF92dCA9IHJ0c2NfeTJ4KCZjbC0+Y2xfdmlydHVhbCwgY2wtPmNsX3RvdGFsKQotCQkJICAgIC0gY2wtPmNsX3Z0b2ZmICsgY2wtPmNsX3Z0YWRqOworCQljbC0+Y2xfdnQgPSBydHNjX3kyeCgmY2wtPmNsX3ZpcnR1YWwsIGNsLT5jbF90b3RhbCkgKyBjbC0+Y2xfdnRhZGo7CiAKIAkJLyoKIAkJICogaWYgdnQgb2YgdGhlIGNsYXNzIGlzIHNtYWxsZXIgdGhhbiBjdnRtaW4sCkBAIC03OTUsOSArNzc2LDkgQEAKIAkJaWYgKGdvX3Bhc3NpdmUpIHsKIAkJCS8qIG5vIG1vcmUgYWN0aXZlIGNoaWxkLCBnb2luZyBwYXNzaXZlICovCiAKLQkJCS8qIHVwZGF0ZSBjdnRtYXggb2YgdGhlIHBhcmVudCBjbGFzcyAqLwotCQkJaWYgKGNsLT5jbF92dCA+IGNsLT5jbF9wYXJlbnQtPmNsX2N2dG1heCkKLQkJCQljbC0+Y2xfcGFyZW50LT5jbF9jdnRtYXggPSBjbC0+Y2xfdnQ7CisJCQkvKiB1cGRhdGUgY3Z0b2ZmIG9mIHRoZSBwYXJlbnQgY2xhc3MgKi8KKwkJCWlmIChjbC0+Y2xfdnQgPiBjbC0+Y2xfcGFyZW50LT5jbF9jdnRvZmYpCisJCQkJY2wtPmNsX3BhcmVudC0+Y2xfY3Z0b2ZmID0gY2wtPmNsX3Z0OwogCiAJCQkvKiByZW1vdmUgdGhpcyBjbGFzcyBmcm9tIHRoZSB2dCB0cmVlICovCiAJCQl2dHRyZWVfcmVtb3ZlKGNsKTsKQEAgLTgxMyw5ICs3OTQsMTAgQEAKIAogCQkvKiB1cGRhdGUgZiAqLwogCQlpZiAoY2wtPmNsX2ZsYWdzICYgSEZTQ19VU0MpIHsKKwkJCWNsLT5jbF9teWYgPSBydHNjX3kyeCgmY2wtPmNsX3VsaW1pdCwgY2wtPmNsX3RvdGFsKTsKKyNpZiAwCiAJCQljbC0+Y2xfbXlmID0gY2wtPmNsX215ZmFkaiArIHJ0c2NfeTJ4KCZjbC0+Y2xfdWxpbWl0LAogCQkJCQkJCSAgICAgIGNsLT5jbF90b3RhbCk7Ci0jaWYgMAogCQkJLyoKIAkJCSAqIFRoaXMgY29kZSBjYXVzZXMgY2xhc3NlcyB0byBzdGF5IHdheSB1bmRlciB0aGVpcgogCQkJICogbGltaXQgd2hlbiBtdWx0aXBsZSBjbGFzc2VzIGFyZSB1c2VkIGF0IGdpZ2FiaXQKQEAgLTk0MCw3ICs5MjIsNyBAQAogaGZzY19jaGFuZ2VfZnNjKHN0cnVjdCBoZnNjX2NsYXNzICpjbCwgc3RydWN0IHRjX3NlcnZpY2VfY3VydmUgKmZzYykKIHsKIAlzYzJpc2MoZnNjLCAmY2wtPmNsX2ZzYyk7Ci0JcnRzY19pbml0KCZjbC0+Y2xfdmlydHVhbCwgJmNsLT5jbF9mc2MsIGNsLT5jbF92dG9mZiArIGNsLT5jbF92dCwgY2wtPmNsX3RvdGFsKTsKKwlydHNjX2luaXQoJmNsLT5jbF92aXJ0dWFsLCAmY2wtPmNsX2ZzYywgY2wtPmNsX3Z0LCBjbC0+Y2xfdG90YWwpOwogCWNsLT5jbF9mbGFncyB8PSBIRlNDX0ZTQzsKIH0KIApAQCAtMTA5NCw3ICsxMDc2LDYgQEAKIAlpZiAocGFyZW50LT5sZXZlbCA9PSAwKQogCQloZnNjX3B1cmdlX3F1ZXVlKHNjaCwgcGFyZW50KTsKIAloZnNjX2FkanVzdF9sZXZlbHMocGFyZW50KTsKLQljbC0+Y2xfcGN2dG9mZiA9IHBhcmVudC0+Y2xfY3Z0b2ZmOwogCXNjaF90cmVlX3VubG9jayhzY2gpOwogCiAJcWRpc2NfY2xhc3NfaGFzaF9ncm93KHNjaCwgJnEtPmNsaGFzaCk7CkBAIC0xNDgyLDE2ICsxNDYzLDEyIEBACiAJY2wtPmNsX2UgICAgICAgICAgICA9IDA7CiAJY2wtPmNsX3Z0ICAgICAgICAgICA9IDA7CiAJY2wtPmNsX3Z0YWRqICAgICAgICA9IDA7Ci0JY2wtPmNsX3Z0b2ZmICAgICAgICA9IDA7CiAJY2wtPmNsX2N2dG1pbiAgICAgICA9IDA7Ci0JY2wtPmNsX2N2dG1heCAgICAgICA9IDA7CiAJY2wtPmNsX2N2dG9mZiAgICAgICA9IDA7Ci0JY2wtPmNsX3BjdnRvZmYgICAgICA9IDA7CiAJY2wtPmNsX3Z0cGVyaW9kICAgICA9IDA7CiAJY2wtPmNsX3BhcmVudHBlcmlvZCA9IDA7CiAJY2wtPmNsX2YgICAgICAgICAgICA9IDA7CiAJY2wtPmNsX215ZiAgICAgICAgICA9IDA7Ci0JY2wtPmNsX215ZmFkaiAgICAgICA9IDA7CiAJY2wtPmNsX2NmbWluICAgICAgICA9IDA7CiAJY2wtPmNsX25hY3RpdmUgICAgICA9IDA7CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfaHRiLmMgYi9uZXQvc2NoZWQvc2NoX2h0Yi5jCmluZGV4IDUzZGJmYTEuLmM3OThkMGQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfaHRiLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9odGIuYwpAQCAtMTYyLDcgKzE2Miw3IEBACiAJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CiAKIAkvKiBub24gc2hhcGVkIHNrYnM7IGxldCB0aGVtIGdvIGRpcmVjdGx5IHRocnUgKi8KLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCWRpcmVjdF9xdWV1ZTsKKwlzdHJ1Y3QgcWRpc2Nfc2tiX2hlYWQJZGlyZWN0X3F1ZXVlOwogCWxvbmcJCQlkaXJlY3RfcGt0czsKIAogCXN0cnVjdCBxZGlzY193YXRjaGRvZwl3YXRjaGRvZzsKQEAgLTU3MCw2ICs1NzAsMjIgQEAKIAlsaXN0X2RlbF9pbml0KCZjbC0+dW4ubGVhZi5kcm9wX2xpc3QpOwogfQogCitzdGF0aWMgdm9pZCBodGJfZW5xdWV1ZV90YWlsKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyAqc2NoLAorCQkJICAgICBzdHJ1Y3QgcWRpc2Nfc2tiX2hlYWQgKnFoKQoreworCXN0cnVjdCBza19idWZmICpsYXN0ID0gcWgtPnRhaWw7CisKKwlpZiAobGFzdCkgeworCQlza2ItPm5leHQgPSBOVUxMOworCQlsYXN0LT5uZXh0ID0gc2tiOworCQlxaC0+dGFpbCA9IHNrYjsKKwl9IGVsc2UgeworCQlxaC0+dGFpbCA9IHNrYjsKKwkJcWgtPmhlYWQgPSBza2I7CisJfQorCXFoLT5xbGVuKys7Cit9CisKIHN0YXRpYyBpbnQgaHRiX2VucXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpzY2gsCiAJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKnRvX2ZyZWUpCiB7CkBAIC01ODAsNyArNTk2LDcgQEAKIAlpZiAoY2wgPT0gSFRCX0RJUkVDVCkgewogCQkvKiBlbnF1ZXVlIHRvIGhlbHBlciBxdWV1ZSAqLwogCQlpZiAocS0+ZGlyZWN0X3F1ZXVlLnFsZW4gPCBxLT5kaXJlY3RfcWxlbikgewotCQkJX19za2JfcXVldWVfdGFpbCgmcS0+ZGlyZWN0X3F1ZXVlLCBza2IpOworCQkJaHRiX2VucXVldWVfdGFpbChza2IsIHNjaCwgJnEtPmRpcmVjdF9xdWV1ZSk7CiAJCQlxLT5kaXJlY3RfcGt0cysrOwogCQl9IGVsc2UgewogCQkJcmV0dXJuIHFkaXNjX2Ryb3Aoc2tiLCBzY2gsIHRvX2ZyZWUpOwpAQCAtODg4LDcgKzkwNCw3IEBACiAJdW5zaWduZWQgbG9uZyBzdGFydF9hdDsKIAogCS8qIHRyeSB0byBkZXF1ZXVlIGRpcmVjdCBwYWNrZXRzIGFzIGhpZ2ggcHJpbyAoISkgdG8gbWluaW1pemUgY3B1IHdvcmsgKi8KLQlza2IgPSBfX3NrYl9kZXF1ZXVlKCZxLT5kaXJlY3RfcXVldWUpOworCXNrYiA9IF9fcWRpc2NfZGVxdWV1ZV9oZWFkKCZxLT5kaXJlY3RfcXVldWUpOwogCWlmIChza2IgIT0gTlVMTCkgewogb2s6CiAJCXFkaXNjX2JzdGF0c191cGRhdGUoc2NoLCBza2IpOwpAQCAtMTAxOSw3ICsxMDM1LDcgQEAKIAogCXFkaXNjX3dhdGNoZG9nX2luaXQoJnEtPndhdGNoZG9nLCBzY2gpOwogCUlOSVRfV09SSygmcS0+d29yaywgaHRiX3dvcmtfZnVuYyk7Ci0JX19za2JfcXVldWVfaGVhZF9pbml0KCZxLT5kaXJlY3RfcXVldWUpOworCXFkaXNjX3NrYl9oZWFkX2luaXQoJnEtPmRpcmVjdF9xdWV1ZSk7CiAKIAlpZiAodGJbVENBX0hUQl9ESVJFQ1RfUUxFTl0pCiAJCXEtPmRpcmVjdF9xbGVuID0gbmxhX2dldF91MzIodGJbVENBX0hUQl9ESVJFQ1RfUUxFTl0pOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9tcS5jIGIvbmV0L3NjaGVkL3NjaF9tcS5jCmluZGV4IGI5NDM5ODIuLjJiYzhkN2YgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfbXEuYworKysgYi9uZXQvc2NoZWQvc2NoX21xLmMKQEAgLTg4LDcgKzg4LDcgQEAKIAkJCXFkaXNjX2Rlc3Ryb3kob2xkKTsKICNpZmRlZiBDT05GSUdfTkVUX1NDSEVECiAJCWlmIChudHggPCBkZXYtPnJlYWxfbnVtX3R4X3F1ZXVlcykKLQkJCXFkaXNjX2xpc3RfYWRkKHFkaXNjKTsKKwkJCXFkaXNjX2hhc2hfYWRkKHFkaXNjKTsKICNlbmRpZgogCiAJfQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9tcXByaW8uYyBiL25ldC9zY2hlZC9zY2hfbXFwcmlvLmMKaW5kZXggNTQ5YzY2My4uYjVjNTAyYyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9tcXByaW8uYworKysgYi9uZXQvc2NoZWQvc2NoX21xcHJpby5jCkBAIC0xODIsNyArMTgyLDcgQEAKIAkJaWYgKG9sZCkKIAkJCXFkaXNjX2Rlc3Ryb3kob2xkKTsKIAkJaWYgKG50eCA8IGRldi0+cmVhbF9udW1fdHhfcXVldWVzKQotCQkJcWRpc2NfbGlzdF9hZGQocWRpc2MpOworCQkJcWRpc2NfaGFzaF9hZGQocWRpc2MpOwogCX0KIAlrZnJlZShwcml2LT5xZGlzY3MpOwogCXByaXYtPnFkaXNjcyA9IE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX25ldGVtLmMgYi9uZXQvc2NoZWQvc2NoX25ldGVtLmMKaW5kZXggYWFhZjAyMS4uOWY3YjM4MCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9uZXRlbS5jCisrKyBiL25ldC9zY2hlZC9zY2hfbmV0ZW0uYwpAQCAtNDEzLDYgKzQxMywxNiBAQAogCXJldHVybiBzZWdzOwogfQogCitzdGF0aWMgdm9pZCBuZXRlbV9lbnF1ZXVlX3NrYl9oZWFkKHN0cnVjdCBxZGlzY19za2JfaGVhZCAqcWgsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc2tiLT5uZXh0ID0gcWgtPmhlYWQ7CisKKwlpZiAoIXFoLT5oZWFkKQorCQlxaC0+dGFpbCA9IHNrYjsKKwlxaC0+aGVhZCA9IHNrYjsKKwlxaC0+cWxlbisrOworfQorCiAvKgogICogSW5zZXJ0IG9uZSBza2IgaW50byBxZGlzYy4KICAqIE5vdGU6IHBhcmVudCBkZXBlbmRzIG9uIHJldHVybiB2YWx1ZSB0byBhY2NvdW50IGZvciBxdWV1ZSBsZW5ndGguCkBAIC01MDIsNyArNTEyLDcgQEAKIAkJCTE8PChwcmFuZG9tX3UzMigpICUgOCk7CiAJfQogCi0JaWYgKHVubGlrZWx5KHNrYl9xdWV1ZV9sZW4oJnNjaC0+cSkgPj0gc2NoLT5saW1pdCkpCisJaWYgKHVubGlrZWx5KHNjaC0+cS5xbGVuID49IHNjaC0+bGltaXQpKQogCQlyZXR1cm4gcWRpc2NfZHJvcChza2IsIHNjaCwgdG9fZnJlZSk7CiAKIAlxZGlzY19xc3RhdHNfYmFja2xvZ19pbmMoc2NoLCBza2IpOwpAQCAtNTIyLDggKzUzMiw4IEBACiAJCWlmIChxLT5yYXRlKSB7CiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqbGFzdDsKIAotCQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNjaC0+cSkpCi0JCQkJbGFzdCA9IHNrYl9wZWVrX3RhaWwoJnNjaC0+cSk7CisJCQlpZiAoc2NoLT5xLnFsZW4pCisJCQkJbGFzdCA9IHNjaC0+cS50YWlsOwogCQkJZWxzZQogCQkJCWxhc3QgPSBuZXRlbV9yYl90b19za2IocmJfbGFzdCgmcS0+dF9yb290KSk7CiAJCQlpZiAobGFzdCkgewpAQCAtNTUyLDcgKzU2Miw3IEBACiAJCWNiLT50aW1lX3RvX3NlbmQgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIAkJcS0+Y291bnRlciA9IDA7CiAKLQkJX19za2JfcXVldWVfaGVhZCgmc2NoLT5xLCBza2IpOworCQluZXRlbV9lbnF1ZXVlX3NrYl9oZWFkKCZzY2gtPnEsIHNrYik7CiAJCXNjaC0+cXN0YXRzLnJlcXVldWVzKys7CiAJfQogCkBAIC01ODcsNyArNTk3LDcgQEAKIAlzdHJ1Y3QgcmJfbm9kZSAqcDsKIAogdGZpZm9fZGVxdWV1ZToKLQlza2IgPSBfX3NrYl9kZXF1ZXVlKCZzY2gtPnEpOworCXNrYiA9IF9fcWRpc2NfZGVxdWV1ZV9oZWFkKCZzY2gtPnEpOwogCWlmIChza2IpIHsKIAkJcWRpc2NfcXN0YXRzX2JhY2tsb2dfZGVjKHNjaCwgc2tiKTsKIGRlbGl2ZXI6CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3BpZS5jIGIvbmV0L3NjaGVkL3NjaF9waWUuYwppbmRleCBhNTcwYjBiLi41YzNhOTlkIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3BpZS5jCisrKyBiL25ldC9zY2hlZC9zY2hfcGllLmMKQEAgLTIzMSw3ICsyMzEsNyBAQAogCS8qIERyb3AgZXhjZXNzIHBhY2tldHMgaWYgbmV3IGxpbWl0IGlzIGxvd2VyICovCiAJcWxlbiA9IHNjaC0+cS5xbGVuOwogCXdoaWxlIChzY2gtPnEucWxlbiA+IHNjaC0+bGltaXQpIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IF9fc2tiX2RlcXVldWUoJnNjaC0+cSk7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBfX3FkaXNjX2RlcXVldWVfaGVhZCgmc2NoLT5xKTsKIAogCQlkcm9wcGVkICs9IHFkaXNjX3BrdF9sZW4oc2tiKTsKIAkJcWRpc2NfcXN0YXRzX2JhY2tsb2dfZGVjKHNjaCwgc2tiKTsKQEAgLTUxMSw3ICs1MTEsNyBAQAogc3RhdGljIHN0cnVjdCBza19idWZmICpwaWVfcWRpc2NfZGVxdWV1ZShzdHJ1Y3QgUWRpc2MgKnNjaCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXNrYiA9IF9fcWRpc2NfZGVxdWV1ZV9oZWFkKHNjaCwgJnNjaC0+cSk7CisJc2tiID0gcWRpc2NfZGVxdWV1ZV9oZWFkKHNjaCk7CiAKIAlpZiAoIXNrYikKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3FmcS5jIGIvbmV0L3NjaGVkL3NjaF9xZnEuYwppbmRleCBmMjdmZmVlLi5jYTA1MTZlIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3FmcS5jCisrKyBiL25ldC9zY2hlZC9zY2hfcWZxLmMKQEAgLTExNTMsNiArMTE1Myw3IEBACiAJaWYgKCFza2IpCiAJCXJldHVybiBOVUxMOwogCisJcWRpc2NfcXN0YXRzX2JhY2tsb2dfZGVjKHNjaCwgc2tiKTsKIAlzY2gtPnEucWxlbi0tOwogCXFkaXNjX2JzdGF0c191cGRhdGUoc2NoLCBza2IpOwogCkBAIC0xMjU2LDYgKzEyNTcsNyBAQAogCX0KIAogCWJzdGF0c191cGRhdGUoJmNsLT5ic3RhdHMsIHNrYik7CisJcWRpc2NfcXN0YXRzX2JhY2tsb2dfaW5jKHNjaCwgc2tiKTsKIAkrK3NjaC0+cS5xbGVuOwogCiAJYWdnID0gY2wtPmFnZzsKQEAgLTE0NzYsNiArMTQ3OCw3IEBACiAJCQlxZGlzY19yZXNldChjbC0+cWRpc2MpOwogCQl9CiAJfQorCXNjaC0+cXN0YXRzLmJhY2tsb2cgPSAwOwogCXNjaC0+cS5xbGVuID0gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9zZmIuYyBiL25ldC9zY2hlZC9zY2hfc2ZiLmMKaW5kZXggYWRkM2NjNy4uMjBhMzUwYiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9zZmIuYworKysgYi9uZXQvc2NoZWQvc2NoX3NmYi5jCkBAIC00MDAsNiArNDAwLDcgQEAKIGVucXVldWU6CiAJcmV0ID0gcWRpc2NfZW5xdWV1ZShza2IsIGNoaWxkLCB0b19mcmVlKTsKIAlpZiAobGlrZWx5KHJldCA9PSBORVRfWE1JVF9TVUNDRVNTKSkgeworCQlxZGlzY19xc3RhdHNfYmFja2xvZ19pbmMoc2NoLCBza2IpOwogCQlzY2gtPnEucWxlbisrOwogCQlpbmNyZW1lbnRfcWxlbihza2IsIHEpOwogCX0gZWxzZSBpZiAobmV0X3htaXRfZHJvcF9jb3VudChyZXQpKSB7CkBAIC00MjgsNiArNDI5LDcgQEAKIAogCWlmIChza2IpIHsKIAkJcWRpc2NfYnN0YXRzX3VwZGF0ZShzY2gsIHNrYik7CisJCXFkaXNjX3FzdGF0c19iYWNrbG9nX2RlYyhzY2gsIHNrYik7CiAJCXNjaC0+cS5xbGVuLS07CiAJCWRlY3JlbWVudF9xbGVuKHNrYiwgcSk7CiAJfQpAQCAtNDUwLDYgKzQ1Miw3IEBACiAJc3RydWN0IHNmYl9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwogCiAJcWRpc2NfcmVzZXQocS0+cWRpc2MpOworCXNjaC0+cXN0YXRzLmJhY2tsb2cgPSAwOwogCXNjaC0+cS5xbGVuID0gMDsKIAlxLT5zbG90ID0gMDsKIAlxLT5kb3VibGVfYnVmZmVyaW5nID0gZmFsc2U7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9hc3NvY2lvbGEuYyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCmluZGV4IDFjMjMwNjAuLmYxMGQzMzkgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2Fzc29jaW9sYS5jCisrKyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCkBAIC0xNDA4LDcgKzE0MDgsNyBAQAogCQkJCXRyYW5zcG9ydHMpIHsKIAkJaWYgKHQtPnBtdHVfcGVuZGluZyAmJiB0LT5kc3QpIHsKIAkJCXNjdHBfdHJhbnNwb3J0X3VwZGF0ZV9wbXR1KHNrLCB0LAotCQkJCQkJICAgV09SRF9UUlVOQyhkc3RfbXR1KHQtPmRzdCkpKTsKKwkJCQkJCSAgIFNDVFBfVFJVTkM0KGRzdF9tdHUodC0+ZHN0KSkpOwogCQkJdC0+cG10dV9wZW5kaW5nID0gMDsKIAkJfQogCQlpZiAoIXBtdHUgfHwgKHQtPnBhdGhtdHUgPCBwbXR1KSkKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2F1dGguYyBiL25ldC9zY3RwL2F1dGguYwppbmRleCA5MTJlYjE2Li5mOTlkNDg1IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9hdXRoLmMKKysrIGIvbmV0L3NjdHAvYXV0aC5jCkBAIC00OCw3ICs0OCw3IEBACiAJCS8qIGlkIDIgaXMgcmVzZXJ2ZWQgYXMgd2VsbCAqLwogCQkuaG1hY19pZCA9IFNDVFBfQVVUSF9ITUFDX0lEX1JFU0VSVkVEXzIsCiAJfSwKLSNpZiBkZWZpbmVkIChDT05GSUdfQ1JZUFRPX1NIQTI1NikgfHwgZGVmaW5lZCAoQ09ORklHX0NSWVBUT19TSEEyNTZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0NSWVBUT19TSEEyNTYpCiAJewogCQkuaG1hY19pZCA9IFNDVFBfQVVUSF9ITUFDX0lEX1NIQTI1NiwKIAkJLmhtYWNfbmFtZSA9ICJobWFjKHNoYTI1NikiLApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvY2h1bmsuYyBiL25ldC9zY3RwL2NodW5rLmMKaW5kZXggYTU1ZTU0Ny4uN2ExY2RmNCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvY2h1bmsuYworKysgYi9uZXQvc2N0cC9jaHVuay5jCkBAIC03MCw2ICs3MCwxOSBAQAogCXJldHVybiBtc2c7CiB9CiAKK3ZvaWQgc2N0cF9kYXRhbXNnX2ZyZWUoc3RydWN0IHNjdHBfZGF0YW1zZyAqbXNnKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKKworCS8qIFRoaXMgZG9lc24ndCBoYXZlIHRvIGJlIGEgX3NhZmUgdmFpcmFudCBiZWNhdXNlCisJICogc2N0cF9jaHVua19mcmVlKCkgb25seSBkcm9wcyB0aGUgcmVmcy4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNodW5rLCAmbXNnLT5jaHVua3MsIGZyYWdfbGlzdCkKKwkJc2N0cF9jaHVua19mcmVlKGNodW5rKTsKKworCXNjdHBfZGF0YW1zZ19wdXQobXNnKTsKK30KKwogLyogRmluYWwgZGVzdHJ1Y3RydWN0aW9uIG9mIGRhdGFtc2cgbWVtb3J5LiAqLwogc3RhdGljIHZvaWQgc2N0cF9kYXRhbXNnX2Rlc3Ryb3koc3RydWN0IHNjdHBfZGF0YW1zZyAqbXNnKQogewpAQCAtMTc5LDEyICsxOTIsMTggQEAKIAkJCSBtc2csIG1zZy0+ZXhwaXJlc19hdCwgamlmZmllcyk7CiAJfQogCisJaWYgKGFzb2MtPnBlZXIucHJzY3RwX2NhcGFibGUgJiYKKwkgICAgU0NUUF9QUl9UVExfRU5BQkxFRChzaW5mby0+c2luZm9fZmxhZ3MpKQorCQltc2ctPmV4cGlyZXNfYXQgPQorCQkJamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoc2luZm8tPnNpbmZvX3RpbWV0b2xpdmUpOworCiAJLyogVGhpcyBpcyB0aGUgYmlnZ2VzdCBwb3NzaWJsZSBEQVRBIGNodW5rIHRoYXQgY2FuIGZpdCBpbnRvCiAJICogdGhlIHBhY2tldAogCSAqLwotCW1heF9kYXRhID0gKGFzb2MtPnBhdGhtdHUgLQotCQlzY3RwX3NrKGFzb2MtPmJhc2Uuc2spLT5wZi0+YWYtPm5ldF9oZWFkZXJfbGVuIC0KLQkJc2l6ZW9mKHN0cnVjdCBzY3RwaGRyKSAtIHNpemVvZihzdHJ1Y3Qgc2N0cF9kYXRhX2NodW5rKSkgJiB+MzsKKwltYXhfZGF0YSA9IGFzb2MtPnBhdGhtdHUgLQorCQkgICBzY3RwX3NrKGFzb2MtPmJhc2Uuc2spLT5wZi0+YWYtPm5ldF9oZWFkZXJfbGVuIC0KKwkJICAgc2l6ZW9mKHN0cnVjdCBzY3RwaGRyKSAtIHNpemVvZihzdHJ1Y3Qgc2N0cF9kYXRhX2NodW5rKTsKKwltYXhfZGF0YSA9IFNDVFBfVFJVTkM0KG1heF9kYXRhKTsKIAogCW1heCA9IGFzb2MtPmZyYWdfcG9pbnQ7CiAJLyogSWYgdGhlIHRoZSBwZWVyIHJlcXVlc3RlZCB0aGF0IHdlIGF1dGhlbnRpY2F0ZSBEQVRBIGNodW5rcwpAQCAtMTk1LDggKzIxNCw4IEBACiAJCXN0cnVjdCBzY3RwX2htYWMgKmhtYWNfZGVzYyA9IHNjdHBfYXV0aF9hc29jX2dldF9obWFjKGFzb2MpOwogCiAJCWlmIChobWFjX2Rlc2MpCi0JCQltYXhfZGF0YSAtPSBXT1JEX1JPVU5EKHNpemVvZihzY3RwX2F1dGhfY2h1bmtfdCkgKwotCQkJCQkgICAgaG1hY19kZXNjLT5obWFjX2xlbik7CisJCQltYXhfZGF0YSAtPSBTQ1RQX1BBRDQoc2l6ZW9mKHNjdHBfYXV0aF9jaHVua190KSArCisJCQkJCSAgICAgIGhtYWNfZGVzYy0+aG1hY19sZW4pOwogCX0KIAogCS8qIE5vdywgY2hlY2sgaWYgd2UgbmVlZCB0byByZWR1Y2Ugb3VyIG1heCAqLwpAQCAtMjE2LDcgKzIzNSw3IEBACiAJICAgIGFzb2MtPm91dHF1ZXVlLm91dF9xbGVuID09IDAgJiYKIAkgICAgbGlzdF9lbXB0eSgmYXNvYy0+b3V0cXVldWUucmV0cmFuc21pdCkgJiYKIAkgICAgbXNnX2xlbiA+IG1heCkKLQkJbWF4X2RhdGEgLT0gV09SRF9ST1VORChzaXplb2Yoc2N0cF9zYWNrX2NodW5rX3QpKTsKKwkJbWF4X2RhdGEgLT0gU0NUUF9QQUQ0KHNpemVvZihzY3RwX3NhY2tfY2h1bmtfdCkpOwogCiAJLyogRW5jb3VyYWdlIENvb2tpZS1FQ0hPIGJ1bmRsaW5nLiAqLwogCWlmIChhc29jLT5zdGF0ZSA8IFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCkKQEAgLTMzNSw3ICszNTQsNyBAQAogLyogQ2hlY2sgd2hldGhlciB0aGlzIG1lc3NhZ2UgaGFzIGV4cGlyZWQuICovCiBpbnQgc2N0cF9jaHVua19hYmFuZG9uZWQoc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rKQogewotCWlmICghY2h1bmstPmFzb2MtPnByc2N0cF9lbmFibGUgfHwKKwlpZiAoIWNodW5rLT5hc29jLT5wZWVyLnByc2N0cF9jYXBhYmxlIHx8CiAJICAgICFTQ1RQX1BSX1BPTElDWShjaHVuay0+c2luZm8uc2luZm9fZmxhZ3MpKSB7CiAJCXN0cnVjdCBzY3RwX2RhdGFtc2cgKm1zZyA9IGNodW5rLT5tc2c7CiAKQEAgLTM0OSwxNCArMzY4LDE0IEBACiAJfQogCiAJaWYgKFNDVFBfUFJfVFRMX0VOQUJMRUQoY2h1bmstPnNpbmZvLnNpbmZvX2ZsYWdzKSAmJgotCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIGNodW5rLT5wcnNjdHBfcGFyYW0pKSB7CisJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgY2h1bmstPm1zZy0+ZXhwaXJlc19hdCkpIHsKIAkJaWYgKGNodW5rLT5zZW50X2NvdW50KQogCQkJY2h1bmstPmFzb2MtPmFiYW5kb25lZF9zZW50W1NDVFBfUFJfSU5ERVgoVFRMKV0rKzsKIAkJZWxzZQogCQkJY2h1bmstPmFzb2MtPmFiYW5kb25lZF91bnNlbnRbU0NUUF9QUl9JTkRFWChUVEwpXSsrOwogCQlyZXR1cm4gMTsKIAl9IGVsc2UgaWYgKFNDVFBfUFJfUlRYX0VOQUJMRUQoY2h1bmstPnNpbmZvLnNpbmZvX2ZsYWdzKSAmJgotCQkgICBjaHVuay0+c2VudF9jb3VudCA+IGNodW5rLT5wcnNjdHBfcGFyYW0pIHsKKwkJICAgY2h1bmstPnNlbnRfY291bnQgPiBjaHVuay0+c2luZm8uc2luZm9fdGltZXRvbGl2ZSkgewogCQljaHVuay0+YXNvYy0+YWJhbmRvbmVkX3NlbnRbU0NUUF9QUl9JTkRFWChSVFgpXSsrOwogCQlyZXR1cm4gMTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pbnB1dC5jIGIvbmV0L3NjdHAvaW5wdXQuYwppbmRleCBjMTgyZGI3Li5hMmVhMWQxIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9pbnB1dC5jCisrKyBiL25ldC9zY3RwL2lucHV0LmMKQEAgLTExOSw3ICsxMTksMTMgQEAKIAkJICAgICAgIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikpCiAJCWdvdG8gZGlzY2FyZF9pdDsKIAotCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3Qgc2N0cGhkcikpKQorCS8qIElmIHRoZSBwYWNrZXQgaXMgZnJhZ21lbnRlZCBhbmQgd2UgbmVlZCB0byBkbyBjcmMgY2hlY2tpbmcsCisJICogaXQncyBiZXR0ZXIgdG8ganVzdCBsaW5lYXJpemUgaXQgb3RoZXJ3aXNlIGNyYyBjb21wdXRpbmcKKwkgKiB0YWtlcyBsb25nZXIuCisJICovCisJaWYgKCghKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1NDVFApICYmCisJICAgICBza2JfbGluZWFyaXplKHNrYikpIHx8CisJICAgICFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBzY3RwaGRyKSkpCiAJCWdvdG8gZGlzY2FyZF9pdDsKIAogCS8qIFB1bGwgdXAgdGhlIElQIGhlYWRlci4gKi8KQEAgLTU5OSw3ICs2MDUsNyBAQAogCQkvKiBQTVRVIGRpc2NvdmVyeSAoUkZDMTE5MSkgKi8KIAkJaWYgKElDTVBfRlJBR19ORUVERUQgPT0gY29kZSkgewogCQkJc2N0cF9pY21wX2ZyYWdfbmVlZGVkKHNrLCBhc29jLCB0cmFuc3BvcnQsCi0JCQkJCSAgICAgIFdPUkRfVFJVTkMoaW5mbykpOworCQkJCQkgICAgICBTQ1RQX1RSVU5DNChpbmZvKSk7CiAJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0gZWxzZSB7CiAJCQlpZiAoSUNNUF9QUk9UX1VOUkVBQ0ggPT0gY29kZSkgewpAQCAtNjY3LDcgKzY3Myw3IEBACiAJCWlmIChudG9ocyhjaC0+bGVuZ3RoKSA8IHNpemVvZihzY3RwX2NodW5raGRyX3QpKQogCQkJYnJlYWs7CiAKLQkJY2hfZW5kID0gb2Zmc2V0ICsgV09SRF9ST1VORChudG9ocyhjaC0+bGVuZ3RoKSk7CisJCWNoX2VuZCA9IG9mZnNldCArIFNDVFBfUEFENChudG9ocyhjaC0+bGVuZ3RoKSk7CiAJCWlmIChjaF9lbmQgPiBza2ItPmxlbikKIAkJCWJyZWFrOwogCkBAIC03OTAsMjcgKzc5NiwzNCBAQAogc3RhdGljIGlubGluZSBpbnQgc2N0cF9oYXNoX2NtcChzdHJ1Y3Qgcmhhc2h0YWJsZV9jb21wYXJlX2FyZyAqYXJnLAogCQkJCWNvbnN0IHZvaWQgKnB0cikKIHsKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnQgPSAoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICopcHRyOwogCWNvbnN0IHN0cnVjdCBzY3RwX2hhc2hfY21wX2FyZyAqeCA9IGFyZy0+a2V5OwotCWNvbnN0IHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdCA9IHB0cjsKLQlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyA9IHQtPmFzb2M7Ci0JY29uc3Qgc3RydWN0IG5ldCAqbmV0ID0geC0+bmV0OworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCWludCBlcnIgPSAxOwogCiAJaWYgKCFzY3RwX2NtcF9hZGRyX2V4YWN0KCZ0LT5pcGFkZHIsIHgtPnBhZGRyKSkKLQkJcmV0dXJuIDE7Ci0JaWYgKCFuZXRfZXEoc29ja19uZXQoYXNvYy0+YmFzZS5zayksIG5ldCkpCi0JCXJldHVybiAxOworCQlyZXR1cm4gZXJyOworCWlmICghc2N0cF90cmFuc3BvcnRfaG9sZCh0KSkKKwkJcmV0dXJuIGVycjsKKworCWFzb2MgPSB0LT5hc29jOworCWlmICghbmV0X2VxKHNvY2tfbmV0KGFzb2MtPmJhc2Uuc2spLCB4LT5uZXQpKQorCQlnb3RvIG91dDsKIAlpZiAoeC0+ZXApIHsKIAkJaWYgKHgtPmVwICE9IGFzb2MtPmVwKQotCQkJcmV0dXJuIDE7CisJCQlnb3RvIG91dDsKIAl9IGVsc2UgewogCQlpZiAoeC0+bGFkZHItPnY0LnNpbl9wb3J0ICE9IGh0b25zKGFzb2MtPmJhc2UuYmluZF9hZGRyLnBvcnQpKQotCQkJcmV0dXJuIDE7CisJCQlnb3RvIG91dDsKIAkJaWYgKCFzY3RwX2JpbmRfYWRkcl9tYXRjaCgmYXNvYy0+YmFzZS5iaW5kX2FkZHIsCiAJCQkJCSAgeC0+bGFkZHIsIHNjdHBfc2soYXNvYy0+YmFzZS5zaykpKQotCQkJcmV0dXJuIDE7CisJCQlnb3RvIG91dDsKIAl9CiAKLQlyZXR1cm4gMDsKKwllcnIgPSAwOworb3V0OgorCXNjdHBfdHJhbnNwb3J0X3B1dCh0KTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBzY3RwX2hhc2hfb2JqKGNvbnN0IHZvaWQgKmRhdGEsIHUzMiBsZW4sIHUzMiBzZWVkKQpAQCAtMTExNSw3ICsxMTI4LDcgQEAKIAkJaWYgKG50b2hzKGNoLT5sZW5ndGgpIDwgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpCiAJCQlicmVhazsKIAotCQljaF9lbmQgPSAoKF9fdTggKiljaCkgKyBXT1JEX1JPVU5EKG50b2hzKGNoLT5sZW5ndGgpKTsKKwkJY2hfZW5kID0gKChfX3U4ICopY2gpICsgU0NUUF9QQUQ0KG50b2hzKGNoLT5sZW5ndGgpKTsKIAkJaWYgKGNoX2VuZCA+IHNrYl90YWlsX3BvaW50ZXIoc2tiKSkKIAkJCWJyZWFrOwogCkBAIC0xMTc3LDkgKzExOTAsNiBAQAogCWlmICgoc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSAmIFNLQl9HU09fU0NUUCkgPT0gU0tCX0dTT19TQ1RQKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChza2JfbGluZWFyaXplKHNrYikpCi0JCXJldHVybiBOVUxMOwotCiAJY2ggPSAoc2N0cF9jaHVua2hkcl90ICopIHNrYi0+ZGF0YTsKIAogCS8qIFRoZSBjb2RlIGJlbG93IHdpbGwgYXR0ZW1wdCB0byB3YWxrIHRoZSBjaHVuayBhbmQgZXh0cmFjdApAQCAtMTE4Nyw3ICsxMTk3LDcgQEAKIAkgKiB0aGF0IHRoZSBjaHVuayBsZW5ndGggZG9lc24ndCBjYXVzZSBvdmVyZmxvdy4gIE90aGVyd2lzZSwgd2UnbGwKIAkgKiB3YWxrIG9mZiB0aGUgZW5kLgogCSAqLwotCWlmIChXT1JEX1JPVU5EKG50b2hzKGNoLT5sZW5ndGgpKSA+IHNrYi0+bGVuKQorCWlmIChTQ1RQX1BBRDQobnRvaHMoY2gtPmxlbmd0aCkpID4gc2tiLT5sZW4pCiAJCXJldHVybiBOVUxMOwogCiAJLyogSWYgdGhpcyBpcyBJTklUL0lOSVQtQUNLIGxvb2sgaW5zaWRlIHRoZSBjaHVuayB0b28uICovCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pbnF1ZXVlLmMgYi9uZXQvc2N0cC9pbnF1ZXVlLmMKaW5kZXggYzMwZGRiMC4uZjczMWRlMyAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvaW5xdWV1ZS5jCisrKyBiL25ldC9zY3RwL2lucXVldWUuYwpAQCAtMTcwLDE5ICsxNzAsNiBAQAogCiAJCWNodW5rID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHNjdHBfY2h1bmssIGxpc3QpOwogCi0JCS8qIExpbmVhcml6ZSBpZiBpdCdzIG5vdCBHU08gKi8KLQkJaWYgKChza2Jfc2hpbmZvKGNodW5rLT5za2IpLT5nc29fdHlwZSAmIFNLQl9HU09fU0NUUCkgIT0gU0tCX0dTT19TQ1RQICYmCi0JCSAgICBza2JfaXNfbm9ubGluZWFyKGNodW5rLT5za2IpKSB7Ci0JCQlpZiAoc2tiX2xpbmVhcml6ZShjaHVuay0+c2tiKSkgewotCQkJCV9fU0NUUF9JTkNfU1RBVFMoZGV2X25ldChjaHVuay0+c2tiLT5kZXYpLCBTQ1RQX01JQl9JTl9QS1RfRElTQ0FSRFMpOwotCQkJCXNjdHBfY2h1bmtfZnJlZShjaHVuayk7Ci0JCQkJZ290byBuZXh0X2NodW5rOwotCQkJfQotCi0JCQkvKiBVcGRhdGUgc2N0cF9oZHIgYXMgaXQgcHJvYmFibHkgY2hhbmdlZCAqLwotCQkJY2h1bmstPnNjdHBfaGRyID0gc2N0cF9oZHIoY2h1bmstPnNrYik7Ci0JCX0KLQogCQlpZiAoKHNrYl9zaGluZm8oY2h1bmstPnNrYiktPmdzb190eXBlICYgU0tCX0dTT19TQ1RQKSA9PSBTS0JfR1NPX1NDVFApIHsKIAkJCS8qIEdTTy1tYXJrZWQgc2ticyBidXQgd2l0aG91dCBmcmFncywgaGFuZGxlCiAJCQkgKiB0aGVtIG5vcm1hbGx5CkBAIC0yMjYsNyArMjEzLDcgQEAKIAl9CiAKIAljaHVuay0+Y2h1bmtfaGRyID0gY2g7Ci0JY2h1bmstPmNodW5rX2VuZCA9ICgoX191OCAqKWNoKSArIFdPUkRfUk9VTkQobnRvaHMoY2gtPmxlbmd0aCkpOworCWNodW5rLT5jaHVua19lbmQgPSAoKF9fdTggKiljaCkgKyBTQ1RQX1BBRDQobnRvaHMoY2gtPmxlbmd0aCkpOwogCXNrYl9wdWxsKGNodW5rLT5za2IsIHNpemVvZihzY3RwX2NodW5raGRyX3QpKTsKIAljaHVuay0+c3ViaC52ID0gTlVMTDsgLyogU3ViaGVhZGVyIGlzIG5vIGxvbmdlciB2YWxpZC4gICovCiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL291dHB1dC5jIGIvbmV0L3NjdHAvb3V0cHV0LmMKaW5kZXggMWYxNjgyYi4uMmE1YzE4OSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvb3V0cHV0LmMKKysrIGIvbmV0L3NjdHAvb3V0cHV0LmMKQEAgLTE4MCw3ICsxODAsNiBAQAogCQkJCSAgICAgICBpbnQgb25lX3BhY2tldCwgZ2ZwX3QgZ2ZwKQogewogCXNjdHBfeG1pdF90IHJldHZhbDsKLQlpbnQgZXJyb3IgPSAwOwogCiAJcHJfZGVidWcoIiVzOiBwYWNrZXQ6JXAgc2l6ZTolWnUgY2h1bms6JXAgc2l6ZTolZFxuIiwgX19mdW5jX18sCiAJCSBwYWNrZXQsIHBhY2tldC0+c2l6ZSwgY2h1bmssIGNodW5rLT5za2IgPyBjaHVuay0+c2tiLT5sZW4gOiAtMSk7CkBAIC0xODgsNiArMTg3LDggQEAKIAlzd2l0Y2ggKChyZXR2YWwgPSAoc2N0cF9wYWNrZXRfYXBwZW5kX2NodW5rKHBhY2tldCwgY2h1bmspKSkpIHsKIAljYXNlIFNDVFBfWE1JVF9QTVRVX0ZVTEw6CiAJCWlmICghcGFja2V0LT5oYXNfY29va2llX2VjaG8pIHsKKwkJCWludCBlcnJvciA9IDA7CisKIAkJCWVycm9yID0gc2N0cF9wYWNrZXRfdHJhbnNtaXQocGFja2V0LCBnZnApOwogCQkJaWYgKGVycm9yIDwgMCkKIAkJCQljaHVuay0+c2tiLT5zay0+c2tfZXJyID0gLWVycm9yOwpAQCAtMjk2LDcgKzI5Nyw3IEBACiAJCQkJCSAgICAgIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKIHsKIAlzY3RwX3htaXRfdCByZXR2YWwgPSBTQ1RQX1hNSVRfT0s7Ci0JX191MTYgY2h1bmtfbGVuID0gV09SRF9ST1VORChudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpKTsKKwlfX3UxNiBjaHVua19sZW4gPSBTQ1RQX1BBRDQobnRvaHMoY2h1bmstPmNodW5rX2hkci0+bGVuZ3RoKSk7CiAKIAkvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBjaHVuayB3aWxsIGZpdCBpbnRvIHRoZSBwYWNrZXQgKi8KIAlyZXR2YWwgPSBzY3RwX3BhY2tldF93aWxsX2ZpdChwYWNrZXQsIGNodW5rLCBjaHVua19sZW4pOwpAQCAtNDQxLDE0ICs0NDIsMTQgQEAKIAkJCSAqIHRpbWUuIEFwcGxpY2F0aW9uIG1heSBub3RpY2UgdGhpcyBlcnJvci4KIAkJCSAqLwogCQkJcHJfZXJyX29uY2UoIlRyeWluZyB0byBHU08gYnV0IHVuZGVybHlpbmcgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBpdC4iKTsKLQkJCWdvdG8gbm9tZW07CisJCQlnb3RvIGVycjsKIAkJfQogCX0gZWxzZSB7CiAJCXBrdF9zaXplID0gcGFja2V0LT5zaXplOwogCX0KIAloZWFkID0gYWxsb2Nfc2tiKHBrdF9zaXplICsgTUFYX0hFQURFUiwgZ2ZwKTsKIAlpZiAoIWhlYWQpCi0JCWdvdG8gbm9tZW07CisJCWdvdG8gZXJyOwogCWlmIChnc28pIHsKIAkJTkFQSV9HUk9fQ0IoaGVhZCktPmxhc3QgPSBoZWFkOwogCQlza2Jfc2hpbmZvKGhlYWQpLT5nc29fdHlwZSA9IHNrLT5za19nc29fdHlwZTsKQEAgLTQ2OSw4ICs0NzAsMTIgQEAKIAkJfQogCX0KIAlkc3QgPSBkc3RfY2xvbmUodHAtPmRzdCk7Ci0JaWYgKCFkc3QpCi0JCWdvdG8gbm9fcm91dGU7CisJaWYgKCFkc3QpIHsKKwkJaWYgKGFzb2MpCisJCQlJUF9JTkNfU1RBVFMoc29ja19uZXQoYXNvYy0+YmFzZS5zayksCisJCQkJICAgICBJUFNUQVRTX01JQl9PVVROT1JPVVRFUyk7CisJCWdvdG8gbm9kc3Q7CisJfQogCXNrYl9kc3Rfc2V0KGhlYWQsIGRzdCk7CiAKIAkvKiBCdWlsZCB0aGUgU0NUUCBoZWFkZXIuICAqLwpAQCAtNTAzLDcgKzUwOCw3IEBACiAJCWlmIChnc28pIHsKIAkJCXBrdF9zaXplID0gcGFja2V0LT5vdmVyaGVhZDsKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2h1bmssICZwYWNrZXQtPmNodW5rX2xpc3QsIGxpc3QpIHsKLQkJCQlpbnQgcGFkZGVkID0gV09SRF9ST1VORChjaHVuay0+c2tiLT5sZW4pOworCQkJCWludCBwYWRkZWQgPSBTQ1RQX1BBRDQoY2h1bmstPnNrYi0+bGVuKTsKIAogCQkJCWlmIChwa3Rfc2l6ZSArIHBhZGRlZCA+IHRwLT5wYXRobXR1KQogCQkJCQlicmVhazsKQEAgLTUzMyw3ICs1MzgsNyBAQAogCQkgKiBpbmNsdWRlZCBpbiB0aGUgY2h1bmsgbGVuZ3RoIGZpZWxkLiAgVGhlIHNlbmRlciBzaG91bGQKIAkJICogbmV2ZXIgcGFkIHdpdGggbW9yZSB0aGFuIDMgYnl0ZXMuCiAJCSAqCi0JCSAqIFtUaGlzIHdob2xlIGNvbW1lbnQgZXhwbGFpbnMgV09SRF9ST1VORCgpIGJlbG93Ll0KKwkJICogW1RoaXMgd2hvbGUgY29tbWVudCBleHBsYWlucyBTQ1RQX1BBRDQoKSBiZWxvdy5dCiAJCSAqLwogCiAJCXBrdF9zaXplIC09IHBhY2tldC0+b3ZlcmhlYWQ7CkBAIC01NTUsNyArNTYwLDcgQEAKIAkJCQloYXNfZGF0YSA9IDE7CiAJCQl9CiAKLQkJCXBhZGRpbmcgPSBXT1JEX1JPVU5EKGNodW5rLT5za2ItPmxlbikgLSBjaHVuay0+c2tiLT5sZW47CisJCQlwYWRkaW5nID0gU0NUUF9QQUQ0KGNodW5rLT5za2ItPmxlbikgLSBjaHVuay0+c2tiLT5sZW47CiAJCQlpZiAocGFkZGluZykKIAkJCQltZW1zZXQoc2tiX3B1dChjaHVuay0+c2tiLCBwYWRkaW5nKSwgMCwgcGFkZGluZyk7CiAKQEAgLTU4Miw3ICs1ODcsNyBAQAogCQkJICogYWNrbm93bGVkZ2VkIG9yIGhhdmUgZmFpbGVkLgogCQkJICogUmUtcXVldWUgYXV0aCBjaHVua3MgaWYgbmVlZGVkLgogCQkJICovCi0JCQlwa3Rfc2l6ZSAtPSBXT1JEX1JPVU5EKGNodW5rLT5za2ItPmxlbik7CisJCQlwa3Rfc2l6ZSAtPSBTQ1RQX1BBRDQoY2h1bmstPnNrYi0+bGVuKTsKIAogCQkJaWYgKCFzY3RwX2NodW5rX2lzX2RhdGEoY2h1bmspICYmIGNodW5rICE9IHBhY2tldC0+YXV0aCkKIAkJCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOwpAQCAtNjIxLDggKzYyNiwxMCBAQAogCQlpZiAoIWdzbykKIAkJCWJyZWFrOwogCi0JCWlmIChza2JfZ3JvX3JlY2VpdmUoJmhlYWQsIG5za2IpKQorCQlpZiAoc2tiX2dyb19yZWNlaXZlKCZoZWFkLCBuc2tiKSkgeworCQkJa2ZyZWVfc2tiKG5za2IpOwogCQkJZ290byBub21lbTsKKwkJfQogCQluc2tiID0gTlVMTDsKIAkJaWYgKFdBUk5fT05fT05DRShza2Jfc2hpbmZvKGhlYWQpLT5nc29fc2VncyA+PQogCQkJCSBzay0+c2tfZ3NvX21heF9zZWdzKSkKQEAgLTcxNiwxOCArNzIzLDEzIEBACiAJfQogCWhlYWQtPmlnbm9yZV9kZiA9IHBhY2tldC0+aXBmcmFnb2s7CiAJdHAtPmFmX3NwZWNpZmljLT5zY3RwX3htaXQoaGVhZCwgdHApOworCWdvdG8gb3V0OwogCi1vdXQ6Ci0Jc2N0cF9wYWNrZXRfcmVzZXQocGFja2V0KTsKLQlyZXR1cm4gZXJyOwotbm9fcm91dGU6Ci0Ja2ZyZWVfc2tiKGhlYWQpOwotCWlmIChuc2tiICE9IGhlYWQpCi0JCWtmcmVlX3NrYihuc2tiKTsKK25vbWVtOgorCWlmIChwYWNrZXQtPmF1dGggJiYgbGlzdF9lbXB0eSgmcGFja2V0LT5hdXRoLT5saXN0KSkKKwkJc2N0cF9jaHVua19mcmVlKHBhY2tldC0+YXV0aCk7CiAKLQlpZiAoYXNvYykKLQkJSVBfSU5DX1NUQVRTKHNvY2tfbmV0KGFzb2MtPmJhc2Uuc2spLCBJUFNUQVRTX01JQl9PVVROT1JPVVRFUyk7Ci0KK25vZHN0OgogCS8qIEZJWE1FOiBSZXR1cm5pbmcgdGhlICdlcnInIHdpbGwgZWZmZWN0IGFsbCB0aGUgYXNzb2NpYXRpb25zCiAJICogYXNzb2NpYXRlZCB3aXRoIGEgc29ja2V0LCBhbHRob3VnaCBvbmx5IG9uZSBvZiB0aGUgcGF0aHMgb2YgdGhlCiAJICogYXNzb2NpYXRpb24gaXMgdW5yZWFjaGFibGUuCkBAIC03MzYsMjIgKzczOCwxOCBAQAogCSAqIHJlcXVpcmVkLgogCSAqLwogCSAvKiBlcnIgPSAtRUhPU1RVTlJFQUNIOyAqLwotZXJyOgotCS8qIENvbnRyb2wgY2h1bmtzIGFyZSB1bnJlbGlhYmxlIHNvIGp1c3QgZHJvcCB0aGVtLiAgREFUQSBjaHVua3MKLQkgKiB3aWxsIGdldCByZXNlbnQgb3IgZHJvcHBlZCBsYXRlci4KLQkgKi8KKwlrZnJlZV9za2IoaGVhZCk7CiAKK2VycjoKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2h1bmssIHRtcCwgJnBhY2tldC0+Y2h1bmtfbGlzdCwgbGlzdCkgewogCQlsaXN0X2RlbF9pbml0KCZjaHVuay0+bGlzdCk7CiAJCWlmICghc2N0cF9jaHVua19pc19kYXRhKGNodW5rKSkKIAkJCXNjdHBfY2h1bmtfZnJlZShjaHVuayk7CiAJfQotCWdvdG8gb3V0Owotbm9tZW06Ci0JaWYgKHBhY2tldC0+YXV0aCAmJiBsaXN0X2VtcHR5KCZwYWNrZXQtPmF1dGgtPmxpc3QpKQotCQlzY3RwX2NodW5rX2ZyZWUocGFja2V0LT5hdXRoKTsKLQllcnIgPSAtRU5PTUVNOwotCWdvdG8gZXJyOworCitvdXQ6CisJc2N0cF9wYWNrZXRfcmVzZXQocGFja2V0KTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTg3OCw3ICs4NzYsNyBAQAogCQkJCQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCiAJCQkJCXUxNiBjaHVua19sZW4pCiB7Ci0Jc2l6ZV90IHBzaXplLCBwbXR1OworCXNpemVfdCBwc2l6ZSwgcG10dSwgbWF4c2l6ZTsKIAlzY3RwX3htaXRfdCByZXR2YWwgPSBTQ1RQX1hNSVRfT0s7CiAKIAlwc2l6ZSA9IHBhY2tldC0+c2l6ZTsKQEAgLTkwNiw2ICs5MDQsMTcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKKwkJLyogU2ltaWxhcmx5LCBpZiB0aGlzIGNodW5rIHdhcyBidWlsdCBiZWZvcmUgYSBQTVRVCisJCSAqIHJlZHVjdGlvbiwgd2UgaGF2ZSB0byBmcmFnbWVudCBpdCBhdCBJUCBsZXZlbCBub3cuIFNvCisJCSAqIGlmIHRoZSBwYWNrZXQgYWxyZWFkeSBjb250YWlucyBzb21ldGhpbmcsIHdlIG5lZWQgdG8KKwkJICogZmx1c2guCisJCSAqLworCQltYXhzaXplID0gcG10dSAtIHBhY2tldC0+b3ZlcmhlYWQ7CisJCWlmIChwYWNrZXQtPmF1dGgpCisJCQltYXhzaXplIC09IFNDVFBfUEFENChwYWNrZXQtPmF1dGgtPnNrYi0+bGVuKTsKKwkJaWYgKGNodW5rX2xlbiA+IG1heHNpemUpCisJCQlyZXR2YWwgPSBTQ1RQX1hNSVRfUE1UVV9GVUxMOworCiAJCS8qIEl0IGlzIGFsc28gb2theSB0byBmcmFnbWVudCBpZiB0aGUgY2h1bmsgd2UgYXJlCiAJCSAqIGFkZGluZyBpcyBhIGNvbnRyb2wgY2h1bmssIGJ1dCBvbmx5IGlmIGN1cnJlbnQgcGFja2V0CiAJCSAqIGlzIG5vdCBhIEdTTyBvbmUgb3RoZXJ3aXNlIGl0IGNhdXNlcyBmcmFnbWVudGF0aW9uIG9mCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9vdXRxdWV1ZS5jIGIvbmV0L3NjdHAvb3V0cXVldWUuYwppbmRleCA3MmU1NGE0Li41ODI1ODUzIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9vdXRxdWV1ZS5jCisrKyBiL25ldC9zY3RwL291dHF1ZXVlLmMKQEAgLTY4LDcgKzY4LDcgQEAKIAogc3RhdGljIHZvaWQgc2N0cF9nZW5lcmF0ZV9md2R0c24oc3RydWN0IHNjdHBfb3V0cSAqcSwgX191MzIgc2Fja19jdHNuKTsKIAotc3RhdGljIGludCBzY3RwX291dHFfZmx1c2goc3RydWN0IHNjdHBfb3V0cSAqcSwgaW50IHJ0eF90aW1lb3V0LCBnZnBfdCBnZnApOworc3RhdGljIHZvaWQgc2N0cF9vdXRxX2ZsdXNoKHN0cnVjdCBzY3RwX291dHEgKnEsIGludCBydHhfdGltZW91dCwgZ2ZwX3QgZ2ZwKTsKIAogLyogQWRkIGRhdGEgdG8gdGhlIGZyb250IG9mIHRoZSBxdWV1ZS4gKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBzY3RwX291dHFfaGVhZF9kYXRhKHN0cnVjdCBzY3RwX291dHEgKnEsCkBAIC0yODUsMTAgKzI4NSw5IEBACiB9CiAKIC8qIFB1dCBhIG5ldyBjaHVuayBpbiBhbiBzY3RwX291dHEuICAqLwotaW50IHNjdHBfb3V0cV90YWlsKHN0cnVjdCBzY3RwX291dHEgKnEsIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgZ2ZwX3QgZ2ZwKQordm9pZCBzY3RwX291dHFfdGFpbChzdHJ1Y3Qgc2N0cF9vdXRxICpxLCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChxLT5hc29jLT5iYXNlLnNrKTsKLQlpbnQgZXJyb3IgPSAwOwogCiAJcHJfZGVidWcoIiVzOiBvdXRxOiVwLCBjaHVuazolcFslc11cbiIsIF9fZnVuY19fLCBxLCBjaHVuaywKIAkJIGNodW5rICYmIGNodW5rLT5jaHVua19oZHIgPwpAQCAtMjk5LDU0ICsyOTgsMjYgQEAKIAkgKiBpbW1lZGlhdGVseS4KIAkgKi8KIAlpZiAoc2N0cF9jaHVua19pc19kYXRhKGNodW5rKSkgewotCQkvKiBJcyBpdCBPSyB0byBxdWV1ZSBkYXRhIGNodW5rcz8gICovCi0JCS8qIEZyb20gOS4gVGVybWluYXRpb24gb2YgQXNzb2NpYXRpb24KLQkJICoKLQkJICogV2hlbiBlaXRoZXIgZW5kcG9pbnQgcGVyZm9ybXMgYSBzaHV0ZG93biwgdGhlCi0JCSAqIGFzc29jaWF0aW9uIG9uIGVhY2ggcGVlciB3aWxsIHN0b3AgYWNjZXB0aW5nIG5ldwotCQkgKiBkYXRhIGZyb20gaXRzIHVzZXIgYW5kIG9ubHkgZGVsaXZlciBkYXRhIGluIHF1ZXVlCi0JCSAqIGF0IHRoZSB0aW1lIG9mIHNlbmRpbmcgb3IgcmVjZWl2aW5nIHRoZSBTSFVURE9XTgotCQkgKiBjaHVuay4KLQkJICovCi0JCXN3aXRjaCAocS0+YXNvYy0+c3RhdGUpIHsKLQkJY2FzZSBTQ1RQX1NUQVRFX0NMT1NFRDoKLQkJY2FzZSBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkc6Ci0JCWNhc2UgU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UOgotCQljYXNlIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQ6Ci0JCWNhc2UgU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVDoKLQkJCS8qIENhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93biAqLwotCQkJZXJyb3IgPSAtRVNIVVRET1dOOwotCQkJYnJlYWs7CisJCXByX2RlYnVnKCIlczogb3V0cXVldWVpbmc6IG91dHE6JXAsIGNodW5rOiVwWyVzXSlcbiIsCisJCQkgX19mdW5jX18sIHEsIGNodW5rLCBjaHVuayAmJiBjaHVuay0+Y2h1bmtfaGRyID8KKwkJCSBzY3RwX2NuYW1lKFNDVFBfU1RfQ0hVTksoY2h1bmstPmNodW5rX2hkci0+dHlwZSkpIDoKKwkJCSAiaWxsZWdhbCBjaHVuayIpOwogCi0JCWRlZmF1bHQ6Ci0JCQlwcl9kZWJ1ZygiJXM6IG91dHF1ZXVlaW5nOiBvdXRxOiVwLCBjaHVuazolcFslc10pXG4iLAotCQkJCSBfX2Z1bmNfXywgcSwgY2h1bmssIGNodW5rICYmIGNodW5rLT5jaHVua19oZHIgPwotCQkJCSBzY3RwX2NuYW1lKFNDVFBfU1RfQ0hVTksoY2h1bmstPmNodW5rX2hkci0+dHlwZSkpIDoKLQkJCQkgImlsbGVnYWwgY2h1bmsiKTsKLQotCQkJc2N0cF9jaHVua19ob2xkKGNodW5rKTsKLQkJCXNjdHBfb3V0cV90YWlsX2RhdGEocSwgY2h1bmspOwotCQkJaWYgKGNodW5rLT5hc29jLT5wcnNjdHBfZW5hYmxlICYmCi0JCQkgICAgU0NUUF9QUl9QUklPX0VOQUJMRUQoY2h1bmstPnNpbmZvLnNpbmZvX2ZsYWdzKSkKLQkJCQljaHVuay0+YXNvYy0+c2VudF9jbnRfcmVtb3ZhYmxlKys7Ci0JCQlpZiAoY2h1bmstPmNodW5rX2hkci0+ZmxhZ3MgJiBTQ1RQX0RBVEFfVU5PUkRFUkVEKQotCQkJCVNDVFBfSU5DX1NUQVRTKG5ldCwgU0NUUF9NSUJfT1VUVU5PUkRFUkNIVU5LUyk7Ci0JCQllbHNlCi0JCQkJU0NUUF9JTkNfU1RBVFMobmV0LCBTQ1RQX01JQl9PVVRPUkRFUkNIVU5LUyk7Ci0JCQlicmVhazsKLQkJfQorCQlzY3RwX291dHFfdGFpbF9kYXRhKHEsIGNodW5rKTsKKwkJaWYgKGNodW5rLT5hc29jLT5wZWVyLnByc2N0cF9jYXBhYmxlICYmCisJCSAgICBTQ1RQX1BSX1BSSU9fRU5BQkxFRChjaHVuay0+c2luZm8uc2luZm9fZmxhZ3MpKQorCQkJY2h1bmstPmFzb2MtPnNlbnRfY250X3JlbW92YWJsZSsrOworCQlpZiAoY2h1bmstPmNodW5rX2hkci0+ZmxhZ3MgJiBTQ1RQX0RBVEFfVU5PUkRFUkVEKQorCQkJU0NUUF9JTkNfU1RBVFMobmV0LCBTQ1RQX01JQl9PVVRVTk9SREVSQ0hVTktTKTsKKwkJZWxzZQorCQkJU0NUUF9JTkNfU1RBVFMobmV0LCBTQ1RQX01JQl9PVVRPUkRFUkNIVU5LUyk7CiAJfSBlbHNlIHsKIAkJbGlzdF9hZGRfdGFpbCgmY2h1bmstPmxpc3QsICZxLT5jb250cm9sX2NodW5rX2xpc3QpOwogCQlTQ1RQX0lOQ19TVEFUUyhuZXQsIFNDVFBfTUlCX09VVENUUkxDSFVOS1MpOwogCX0KIAotCWlmIChlcnJvciA8IDApCi0JCXJldHVybiBlcnJvcjsKLQogCWlmICghcS0+Y29yaykKLQkJZXJyb3IgPSBzY3RwX291dHFfZmx1c2gocSwgMCwgZ2ZwKTsKLQotCXJldHVybiBlcnJvcjsKKwkJc2N0cF9vdXRxX2ZsdXNoKHEsIDAsIGdmcCk7CiB9CiAKIC8qIEluc2VydCBhIGNodW5rIGludG8gdGhlIHNvcnRlZCBsaXN0IGJhc2VkIG9uIHRoZSBUU05zLiAgVGhlIHJldHJhbnNtaXQgbGlzdApAQCAtMzgzLDcgKzM1NCw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2hrLCB0ZW1wLCBxdWV1ZSwgdHJhbnNtaXR0ZWRfbGlzdCkgewogCQlpZiAoIVNDVFBfUFJfUFJJT19FTkFCTEVEKGNoay0+c2luZm8uc2luZm9fZmxhZ3MpIHx8Ci0JCSAgICBjaGstPnByc2N0cF9wYXJhbSA8PSBzaW5mby0+c2luZm9fdGltZXRvbGl2ZSkKKwkJICAgIGNoay0+c2luZm8uc2luZm9fdGltZXRvbGl2ZSA8PSBzaW5mby0+c2luZm9fdGltZXRvbGl2ZSkKIAkJCWNvbnRpbnVlOwogCiAJCWxpc3RfZGVsX2luaXQoJmNoay0+dHJhbnNtaXR0ZWRfbGlzdCk7CkBAIC00MTgsNyArMzg5LDcgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaGssIHRlbXAsIHF1ZXVlLCBsaXN0KSB7CiAJCWlmICghU0NUUF9QUl9QUklPX0VOQUJMRUQoY2hrLT5zaW5mby5zaW5mb19mbGFncykgfHwKLQkJICAgIGNoay0+cHJzY3RwX3BhcmFtIDw9IHNpbmZvLT5zaW5mb190aW1ldG9saXZlKQorCQkgICAgY2hrLT5zaW5mby5zaW5mb190aW1ldG9saXZlIDw9IHNpbmZvLT5zaW5mb190aW1ldG9saXZlKQogCQkJY29udGludWU7CiAKIAkJbGlzdF9kZWxfaW5pdCgmY2hrLT5saXN0KTsKQEAgLTQ0Miw3ICs0MTMsNyBAQAogewogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OwogCi0JaWYgKCFhc29jLT5wcnNjdHBfZW5hYmxlIHx8ICFhc29jLT5zZW50X2NudF9yZW1vdmFibGUpCisJaWYgKCFhc29jLT5wZWVyLnByc2N0cF9jYXBhYmxlIHx8ICFhc29jLT5zZW50X2NudF9yZW1vdmFibGUpCiAJCXJldHVybjsKIAogCW1zZ19sZW4gPSBzY3RwX3Byc2N0cF9wcnVuZV9zZW50KGFzb2MsIHNpbmZvLApAQCAtNTU5LDcgKzUzMCw2IEBACiAJCSAgICAgc2N0cF9yZXRyYW5zbWl0X3JlYXNvbl90IHJlYXNvbikKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChxLT5hc29jLT5iYXNlLnNrKTsKLQlpbnQgZXJyb3IgPSAwOwogCiAJc3dpdGNoIChyZWFzb24pIHsKIAljYXNlIFNDVFBfUlRYUl9UM19SVFg6CkBAIC02MDMsMTAgKzU3Myw3IEBACiAJICogd2lsbCBiZSBmbHVzaGVkIGF0IHRoZSBlbmQuCiAJICovCiAJaWYgKHJlYXNvbiAhPSBTQ1RQX1JUWFJfRkFTVF9SVFgpCi0JCWVycm9yID0gc2N0cF9vdXRxX2ZsdXNoKHEsIC8qIHJ0eF90aW1lb3V0ICovIDEsIEdGUF9BVE9NSUMpOwotCi0JaWYgKGVycm9yKQotCQlxLT5hc29jLT5iYXNlLnNrLT5za19lcnIgPSAtZXJyb3I7CisJCXNjdHBfb3V0cV9mbHVzaChxLCAvKiBydHhfdGltZW91dCAqLyAxLCBHRlBfQVRPTUlDKTsKIH0KIAogLyoKQEAgLTc3OCwxMiArNzQ1LDEyIEBACiB9CiAKIC8qIENvcmsgdGhlIG91dHF1ZXVlIHNvIHF1ZXVlZCBjaHVua3MgYXJlIHJlYWxseSBxdWV1ZWQuICovCi1pbnQgc2N0cF9vdXRxX3VuY29yayhzdHJ1Y3Qgc2N0cF9vdXRxICpxLCBnZnBfdCBnZnApCit2b2lkIHNjdHBfb3V0cV91bmNvcmsoc3RydWN0IHNjdHBfb3V0cSAqcSwgZ2ZwX3QgZ2ZwKQogewogCWlmIChxLT5jb3JrKQogCQlxLT5jb3JrID0gMDsKIAotCXJldHVybiBzY3RwX291dHFfZmx1c2gocSwgMCwgZ2ZwKTsKKwlzY3RwX291dHFfZmx1c2gocSwgMCwgZ2ZwKTsKIH0KIAogCkBAIC03OTYsNyArNzYzLDcgQEAKICAqIGxvY2tpbmcgY29uY2VybnMgbXVzdCBiZSBtYWRlLiAgVG9kYXkgd2UgdXNlIHRoZSBzb2NrIGxvY2sgdG8gcHJvdGVjdAogICogdGhpcyBmdW5jdGlvbi4KICAqLwotc3RhdGljIGludCBzY3RwX291dHFfZmx1c2goc3RydWN0IHNjdHBfb3V0cSAqcSwgaW50IHJ0eF90aW1lb3V0LCBnZnBfdCBnZnApCitzdGF0aWMgdm9pZCBzY3RwX291dHFfZmx1c2goc3RydWN0IHNjdHBfb3V0cSAqcSwgaW50IHJ0eF90aW1lb3V0LCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfcGFja2V0ICpwYWNrZXQ7CiAJc3RydWN0IHNjdHBfcGFja2V0IHNpbmdsZXRvbjsKQEAgLTkxOSw4ICs4ODYsMTAgQEAKIAkJCXNjdHBfcGFja2V0X2NvbmZpZygmc2luZ2xldG9uLCB2dGFnLCAwKTsKIAkJCXNjdHBfcGFja2V0X2FwcGVuZF9jaHVuaygmc2luZ2xldG9uLCBjaHVuayk7CiAJCQllcnJvciA9IHNjdHBfcGFja2V0X3RyYW5zbWl0KCZzaW5nbGV0b24sIGdmcCk7Ci0JCQlpZiAoZXJyb3IgPCAwKQotCQkJCXJldHVybiBlcnJvcjsKKwkJCWlmIChlcnJvciA8IDApIHsKKwkJCQlhc29jLT5iYXNlLnNrLT5za19lcnIgPSAtZXJyb3I7CisJCQkJcmV0dXJuOworCQkJfQogCQkJYnJlYWs7CiAKIAkJY2FzZSBTQ1RQX0NJRF9BQk9SVDoKQEAgLTEwMTgsNiArOTg3LDggQEAKIAkJcmV0cmFuOgogCQkJZXJyb3IgPSBzY3RwX291dHFfZmx1c2hfcnR4KHEsIHBhY2tldCwKIAkJCQkJCSAgICBydHhfdGltZW91dCwgJnN0YXJ0X3RpbWVyKTsKKwkJCWlmIChlcnJvciA8IDApCisJCQkJYXNvYy0+YmFzZS5zay0+c2tfZXJyID0gLWVycm9yOwogCiAJCQlpZiAoc3RhcnRfdGltZXIpIHsKIAkJCQlzY3RwX3RyYW5zcG9ydF9yZXNldF90M19ydHgodHJhbnNwb3J0KTsKQEAgLTEwNTUsNyArMTAyNiw3IEBACiAKIAkJCQkvKiBNYXJrIGFzIGZhaWxlZCBzZW5kLiAqLwogCQkJCXNjdHBfY2h1bmtfZmFpbChjaHVuaywgU0NUUF9FUlJPUl9JTlZfU1RSTSk7Ci0JCQkJaWYgKGFzb2MtPnByc2N0cF9lbmFibGUgJiYKKwkJCQlpZiAoYXNvYy0+cGVlci5wcnNjdHBfY2FwYWJsZSAmJgogCQkJCSAgICBTQ1RQX1BSX1BSSU9fRU5BQkxFRChjaHVuay0+c2luZm8uc2luZm9fZmxhZ3MpKQogCQkJCQlhc29jLT5zZW50X2NudF9yZW1vdmFibGUtLTsKIAkJCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOwpAQCAtMTE5MiwxNCArMTE2MywxNSBAQAogCQkJCQkJICAgICAgc3RydWN0IHNjdHBfdHJhbnNwb3J0LAogCQkJCQkJICAgICAgc2VuZF9yZWFkeSk7CiAJCXBhY2tldCA9ICZ0LT5wYWNrZXQ7Ci0JCWlmICghc2N0cF9wYWNrZXRfZW1wdHkocGFja2V0KSkKKwkJaWYgKCFzY3RwX3BhY2tldF9lbXB0eShwYWNrZXQpKSB7CiAJCQllcnJvciA9IHNjdHBfcGFja2V0X3RyYW5zbWl0KHBhY2tldCwgZ2ZwKTsKKwkJCWlmIChlcnJvciA8IDApCisJCQkJYXNvYy0+YmFzZS5zay0+c2tfZXJyID0gLWVycm9yOworCQl9CiAKIAkJLyogQ2xlYXIgdGhlIGJ1cnN0IGxpbWl0ZWQgc3RhdGUsIGlmIGFueSAqLwogCQlzY3RwX3RyYW5zcG9ydF9idXJzdF9yZXNldCh0KTsKIAl9Ci0KLQlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qIFVwZGF0ZSB1bmFja19kYXRhIGJhc2VkIG9uIHRoZSBpbmNvbWluZyBTQUNLIGNodW5rICovCkBAIC0xMzQ3LDcgKzEzMTksNyBAQAogCQl0c24gPSBudG9obCh0Y2h1bmstPnN1YmguZGF0YV9oZHItPnRzbik7CiAJCWlmIChUU05fbHRlKHRzbiwgY3RzbikpIHsKIAkJCWxpc3RfZGVsX2luaXQoJnRjaHVuay0+dHJhbnNtaXR0ZWRfbGlzdCk7Ci0JCQlpZiAoYXNvYy0+cHJzY3RwX2VuYWJsZSAmJgorCQkJaWYgKGFzb2MtPnBlZXIucHJzY3RwX2NhcGFibGUgJiYKIAkJCSAgICBTQ1RQX1BSX1BSSU9fRU5BQkxFRChjaHVuay0+c2luZm8uc2luZm9fZmxhZ3MpKQogCQkJCWFzb2MtPnNlbnRfY250X3JlbW92YWJsZS0tOwogCQkJc2N0cF9jaHVua19mcmVlKHRjaHVuayk7CkBAIC0xNzQ3LDcgKzE3MTksNyBAQAogewogCWludCBpOwogCXNjdHBfc2Fja192YXJpYWJsZV90ICpmcmFnczsKLQlfX3UxNiBnYXA7CisJX191MTYgdHNuX29mZnNldCwgYmxvY2tzOwogCV9fdTMyIGN0c24gPSBudG9obChzYWNrLT5jdW1fdHNuX2Fjayk7CiAKIAlpZiAoVFNOX2x0ZSh0c24sIGN0c24pKQpAQCAtMTc2NiwxMCArMTczOCwxMSBAQAogCSAqLwogCiAJZnJhZ3MgPSBzYWNrLT52YXJpYWJsZTsKLQlnYXAgPSB0c24gLSBjdHNuOwotCWZvciAoaSA9IDA7IGkgPCBudG9ocyhzYWNrLT5udW1fZ2FwX2Fja19ibG9ja3MpOyArK2kpIHsKLQkJaWYgKFRTTl9sdGUobnRvaHMoZnJhZ3NbaV0uZ2FiLnN0YXJ0KSwgZ2FwKSAmJgotCQkgICAgVFNOX2x0ZShnYXAsIG50b2hzKGZyYWdzW2ldLmdhYi5lbmQpKSkKKwlibG9ja3MgPSBudG9ocyhzYWNrLT5udW1fZ2FwX2Fja19ibG9ja3MpOworCXRzbl9vZmZzZXQgPSB0c24gLSBjdHNuOworCWZvciAoaSA9IDA7IGkgPCBibG9ja3M7ICsraSkgeworCQlpZiAodHNuX29mZnNldCA+PSBudG9ocyhmcmFnc1tpXS5nYWIuc3RhcnQpICYmCisJCSAgICB0c25fb2Zmc2V0IDw9IG50b2hzKGZyYWdzW2ldLmdhYi5lbmQpKQogCQkJZ290byBwYXNzOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvcHJvYy5jIGIvbmV0L3NjdHAvcHJvYy5jCmluZGV4IDRjYjVhZWQuLjIwNjM3N2YgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3Byb2MuYworKysgYi9uZXQvc2N0cC9wcm9jLmMKQEAgLTczLDEzICs3MywxNyBAQAogLyogRGlzcGxheSBzY3RwIHNubXAgbWliIHN0YXRpc3RpY3MoL3Byb2MvbmV0L3NjdHAvc25tcCkuICovCiBzdGF0aWMgaW50IHNjdHBfc25tcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZbU0NUUF9NSUJfTUFYXTsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXEtPnByaXZhdGU7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBzY3RwX3NubXBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwltZW1zZXQoYnVmZiwgMCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogU0NUUF9NSUJfTUFYKTsKKworCXNubXBfZ2V0X2NwdV9maWVsZF9iYXRjaChidWZmLCBzY3RwX3NubXBfbGlzdCwKKwkJCQkgbmV0LT5zY3RwLnNjdHBfc3RhdGlzdGljcyk7CisJZm9yIChpID0gMDsgc2N0cF9zbm1wX2xpc3RbaV0ubmFtZTsgaSsrKQogCQlzZXFfcHJpbnRmKHNlcSwgIiUtMzJzXHQlbGRcbiIsIHNjdHBfc25tcF9saXN0W2ldLm5hbWUsCi0JCQkgICBzbm1wX2ZvbGRfZmllbGQobmV0LT5zY3RwLnNjdHBfc3RhdGlzdGljcywKLQkJCQkgICAgICBzY3RwX3NubXBfbGlzdFtpXS5lbnRyeSkpOworCQkJCQkJYnVmZltpXSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI5Myw2ICsyOTcsNyBAQAogCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCX0KIAorCWl0ZXItPnN0YXJ0X2ZhaWwgPSAwOwogCXJldHVybiBzY3RwX3RyYW5zcG9ydF9nZXRfaWR4KHNlcV9maWxlX25ldChzZXEpLCAmaXRlci0+aHRpLCAqcG9zKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc2N0cF9kaWFnLmMgYi9uZXQvc2N0cC9zY3RwX2RpYWcuYwppbmRleCBmNjllZGNmLi4wNDg5NTRlIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zY3RwX2RpYWcuYworKysgYi9uZXQvc2N0cC9zY3RwX2RpYWcuYwpAQCAtMTMsNiArMTMsNyBAQAogewogCXVuaW9uIHNjdHBfYWRkciBsYWRkciwgcGFkZHI7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OworCXN0cnVjdCB0aW1lcl9saXN0ICp0M19ydHggPSAmYXNvYy0+cGVlci5wcmltYXJ5X3BhdGgtPlQzX3J0eF90aW1lcjsKIAogCWxhZGRyID0gbGlzdF9lbnRyeShhc29jLT5iYXNlLmJpbmRfYWRkci5hZGRyZXNzX2xpc3QubmV4dCwKIAkJCSAgIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LCBsaXN0KS0+YTsKQEAgLTQwLDEwICs0MSwxNSBAQAogCX0KIAogCXItPmlkaWFnX3N0YXRlID0gYXNvYy0+c3RhdGU7Ci0Jci0+aWRpYWdfdGltZXIgPSBTQ1RQX0VWRU5UX1RJTUVPVVRfVDNfUlRYOwotCXItPmlkaWFnX3JldHJhbnMgPSBhc29jLT5ydHhfZGF0YV9jaHVua3M7Ci0Jci0+aWRpYWdfZXhwaXJlcyA9IGppZmZpZXNfdG9fbXNlY3MoCi0JCWFzb2MtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9UM19SVFhdIC0gamlmZmllcyk7CisJaWYgKHRpbWVyX3BlbmRpbmcodDNfcnR4KSkgeworCQlyLT5pZGlhZ190aW1lciA9IFNDVFBfRVZFTlRfVElNRU9VVF9UM19SVFg7CisJCXItPmlkaWFnX3JldHJhbnMgPSBhc29jLT5ydHhfZGF0YV9jaHVua3M7CisJCXItPmlkaWFnX2V4cGlyZXMgPSBqaWZmaWVzX3RvX21zZWNzKHQzX3J0eC0+ZXhwaXJlcyAtIGppZmZpZXMpOworCX0gZWxzZSB7CisJCXItPmlkaWFnX3RpbWVyID0gMDsKKwkJci0+aWRpYWdfcmV0cmFucyA9IDA7CisJCXItPmlkaWFnX2V4cGlyZXMgPSAwOworCX0KIH0KIAogc3RhdGljIGludCBpbmV0X2RpYWdfbXNnX3NjdHBsYWRkcnNfZmlsbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMTAwLDcgKzEwNiw4IEBACiAJCQkgICAgICAgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnJlcSwKIAkJCSAgICAgICBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnMsCiAJCQkgICAgICAgaW50IHBvcnRpZCwgdTMyIHNlcSwgdTE2IG5sbXNnX2ZsYWdzLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCkKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKnVubGgsCisJCQkgICAgICAgYm9vbCBuZXRfYWRtaW4pCiB7CiAJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwID0gc2N0cF9zayhzayktPmVwOwogCXN0cnVjdCBsaXN0X2hlYWQgKmFkZHJfbGlzdDsKQEAgLTEyNyw3ICsxMzQsNyBAQAogCQlyLT5pZGlhZ19yZXRyYW5zID0gMDsKIAl9CiAKLQlpZiAoaW5ldF9kaWFnX21zZ19hdHRyc19maWxsKHNrLCBza2IsIHIsIGV4dCwgdXNlcl9ucykpCisJaWYgKGluZXRfZGlhZ19tc2dfYXR0cnNfZmlsbChzaywgc2tiLCByLCBleHQsIHVzZXJfbnMsIG5ldF9hZG1pbikpCiAJCWdvdG8gZXJyb3V0OwogCiAJaWYgKGV4dCAmICgxIDw8IChJTkVUX0RJQUdfU0tNRU1JTkZPIC0gMSkpKSB7CkBAIC0xOTcsNiArMjA0LDcgQEAKIAlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2I7CiAJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnI7CiAJY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGg7CisJYm9vbCBuZXRfYWRtaW47CiB9OwogCiBzdGF0aWMgc2l6ZV90IGluZXRfYXNzb2NfYXR0cl9zaXplKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQpAQCAtMjEzLDYgKzIyMSw3IEBACiAJCSsgbmxhX3RvdGFsX3NpemUoMSkgLyogSU5FVF9ESUFHX1NIVVRET1dOICovCiAJCSsgbmxhX3RvdGFsX3NpemUoMSkgLyogSU5FVF9ESUFHX1RPUyAqLwogCQkrIG5sYV90b3RhbF9zaXplKDEpIC8qIElORVRfRElBR19UQ0xBU1MgKi8KKwkJKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBJTkVUX0RJQUdfTUFSSyAqLwogCQkrIG5sYV90b3RhbF9zaXplKGFkZHJsZW4gKiBhc29jLT5wZWVyLnRyYW5zcG9ydF9jb3VudCkKIAkJKyBubGFfdG90YWxfc2l6ZShhZGRybGVuICogYWRkcmNudCkKIAkJKyBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19tZW1pbmZvKSkKQEAgLTI1MCw3ICsyNTksOCBAQAogCWVyciA9IGluZXRfc2N0cF9kaWFnX2ZpbGwoc2ssIGFzc29jLCByZXAsIHJlcSwKIAkJCQkgIHNrX3VzZXJfbnMoTkVUTElOS19DQihpbl9za2IpLnNrKSwKIAkJCQkgIE5FVExJTktfQ0IoaW5fc2tiKS5wb3J0aWQsCi0JCQkJICBubGgtPm5sbXNnX3NlcSwgMCwgbmxoKTsKKwkJCQkgIG5saC0+bmxtc2dfc2VxLCAwLCBubGgsCisJCQkJICBjb21tcC0+bmV0X2FkbWluKTsKIAlyZWxlYXNlX3NvY2soc2spOwogCWlmIChlcnIgPCAwKSB7CiAJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CkBAIC0yNjYsMjggKzI3NiwxNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgc2N0cF90c3BfZHVtcChzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRzcCwgdm9pZCAqcCkKK3N0YXRpYyBpbnQgc2N0cF9zb2NrX2R1bXAoc3RydWN0IHNvY2sgKnNrLCB2b2lkICpwKQogewotCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCA9IHRzcC0+YXNvYy0+ZXA7CisJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwID0gc2N0cF9zayhzayktPmVwOwogCXN0cnVjdCBzY3RwX2NvbW1fcGFyYW0gKmNvbW1wID0gcDsKLQlzdHJ1Y3Qgc29jayAqc2sgPSBlcC0+YmFzZS5zazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gY29tbXAtPnNrYjsKIAlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IgPSBjb21tcC0+Y2I7CiAJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnIgPSBjb21tcC0+cjsKLQlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNzb2MgPQotCQlsaXN0X2VudHJ5KGVwLT5hc29jcy5uZXh0LCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiwgYXNvY3MpOworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc3NvYzsKIAlpbnQgZXJyID0gMDsKIAotCS8qIGZpbmQgdGhlIGVwIG9ubHkgb25jZSB0aHJvdWdoIHRoZSB0cmFuc3BvcnRzIGJ5IHRoaXMgY29uZGl0aW9uICovCi0JaWYgKHRzcC0+YXNvYyAhPSBhc3NvYykKLQkJZ290byBvdXQ7Ci0KLQlpZiAoci0+c2RpYWdfZmFtaWx5ICE9IEFGX1VOU1BFQyAmJiBzay0+c2tfZmFtaWx5ICE9IHItPnNkaWFnX2ZhbWlseSkKLQkJZ290byBvdXQ7Ci0KIAlsb2NrX3NvY2soc2spOwotCWlmIChzayAhPSBhc3NvYy0+YmFzZS5zaykKLQkJZ290byByZWxlYXNlOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoYXNzb2MsICZlcC0+YXNvY3MsIGFzb2NzKSB7CiAJCWlmIChjYi0+YXJnc1s0XSA8IGNiLT5hcmdzWzFdKQogCQkJZ290byBuZXh0OwpAQCAtMzA0LDkgKzMwMywxMCBAQAogCQkJCQlza191c2VyX25zKE5FVExJTktfQ0IoY2ItPnNrYikuc2spLAogCQkJCQlORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKIAkJCQkJY2ItPm5saC0+bmxtc2dfc2VxLAotCQkJCQlOTE1fRl9NVUxUSSwgY2ItPm5saCkgPCAwKSB7CisJCQkJCU5MTV9GX01VTFRJLCBjYi0+bmxoLAorCQkJCQljb21tcC0+bmV0X2FkbWluKSA8IDApIHsKIAkJCWNiLT5hcmdzWzNdID0gMTsKLQkJCWVyciA9IDI7CisJCQllcnIgPSAxOwogCQkJZ290byByZWxlYXNlOwogCQl9CiAJCWNiLT5hcmdzWzNdID0gMTsKQEAgLTMxNCw4ICszMTQsOSBAQAogCQlpZiAoaW5ldF9zY3RwX2RpYWdfZmlsbChzaywgYXNzb2MsIHNrYiwgciwKIAkJCQkJc2tfdXNlcl9ucyhORVRMSU5LX0NCKGNiLT5za2IpLnNrKSwKIAkJCQkJTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQsCi0JCQkJCWNiLT5ubGgtPm5sbXNnX3NlcSwgMCwgY2ItPm5saCkgPCAwKSB7Ci0JCQllcnIgPSAyOworCQkJCQljYi0+bmxoLT5ubG1zZ19zZXEsIDAsIGNiLT5ubGgsCisJCQkJCWNvbW1wLT5uZXRfYWRtaW4pIDwgMCkgeworCQkJZXJyID0gMTsKIAkJCWdvdG8gcmVsZWFzZTsKIAkJfQogbmV4dDoKQEAgLTMyNywxMCArMzI4LDM1IEBACiAJY2ItPmFyZ3NbNF0gPSAwOwogcmVsZWFzZToKIAlyZWxlYXNlX3NvY2soc2spOworCXNvY2tfcHV0KHNrKTsKIAlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNjdHBfZ2V0X3NvY2soc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0c3AsIHZvaWQgKnApCit7CisJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwID0gdHNwLT5hc29jLT5lcDsKKwlzdHJ1Y3Qgc2N0cF9jb21tX3BhcmFtICpjb21tcCA9IHA7CisJc3RydWN0IHNvY2sgKnNrID0gZXAtPmJhc2Uuc2s7CisJc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiID0gY29tbXAtPmNiOworCWNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyID0gY29tbXAtPnI7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzc29jID0KKwkJbGlzdF9lbnRyeShlcC0+YXNvY3MubmV4dCwgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24sIGFzb2NzKTsKKworCS8qIGZpbmQgdGhlIGVwIG9ubHkgb25jZSB0aHJvdWdoIHRoZSB0cmFuc3BvcnRzIGJ5IHRoaXMgY29uZGl0aW9uICovCisJaWYgKHRzcC0+YXNvYyAhPSBhc3NvYykKKwkJZ290byBvdXQ7CisKKwlpZiAoci0+c2RpYWdfZmFtaWx5ICE9IEFGX1VOU1BFQyAmJiBzay0+c2tfZmFtaWx5ICE9IHItPnNkaWFnX2ZhbWlseSkKKwkJZ290byBvdXQ7CisKKwlzb2NrX2hvbGQoc2spOworCWNiLT5hcmdzWzVdID0gKGxvbmcpc2s7CisKKwlyZXR1cm4gMTsKKwogb3V0OgogCWNiLT5hcmdzWzJdKys7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzY3RwX2VwX2R1bXAoc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLCB2b2lkICpwKQpAQCAtMzUwLDcgKzM3Niw3IEBACiAJaWYgKGNiLT5hcmdzWzRdIDwgY2ItPmFyZ3NbMV0pCiAJCWdvdG8gbmV4dDsKIAotCWlmICgoci0+aWRpYWdfc3RhdGVzICYgflRDUEZfTElTVEVOKSAmJiAhbGlzdF9lbXB0eSgmZXAtPmFzb2NzKSkKKwlpZiAoIShyLT5pZGlhZ19zdGF0ZXMgJiBUQ1BGX0xJU1RFTikgJiYgIWxpc3RfZW1wdHkoJmVwLT5hc29jcykpCiAJCWdvdG8gbmV4dDsKIAogCWlmIChyLT5zZGlhZ19mYW1pbHkgIT0gQUZfVU5TUEVDICYmCkBAIC0zNjksNyArMzk1LDcgQEAKIAkJCQlza191c2VyX25zKE5FVExJTktfQ0IoY2ItPnNrYikuc2spLAogCQkJCU5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkLAogCQkJCWNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksCi0JCQkJY2ItPm5saCkgPCAwKSB7CisJCQkJY2ItPm5saCwgY29tbXAtPm5ldF9hZG1pbikgPCAwKSB7CiAJCWVyciA9IDI7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTQwNiw2ICs0MzIsNyBAQAogCQkuc2tiID0gaW5fc2tiLAogCQkuciA9IHJlcSwKIAkJLm5saCA9IG5saCwKKwkJLm5ldF9hZG1pbiA9IG5ldGxpbmtfbmV0X2NhcGFibGUoaW5fc2tiLCBDQVBfTkVUX0FETUlOKSwKIAl9OwogCiAJaWYgKHJlcS0+c2RpYWdfZmFtaWx5ID09IEFGX0lORVQpIHsKQEAgLTQxOCwxMSArNDQ1LDEzIEBACiAJCXBhZGRyLnY0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOwogCX0gZWxzZSB7CiAJCWxhZGRyLnY2LnNpbjZfcG9ydCA9IHJlcS0+aWQuaWRpYWdfc3BvcnQ7Ci0JCW1lbWNweSgmbGFkZHIudjYuc2luNl9hZGRyLCByZXEtPmlkLmlkaWFnX3NyYywgNjQpOworCQltZW1jcHkoJmxhZGRyLnY2LnNpbjZfYWRkciwgcmVxLT5pZC5pZGlhZ19zcmMsCisJCSAgICAgICBzaXplb2YobGFkZHIudjYuc2luNl9hZGRyKSk7CiAJCWxhZGRyLnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiAKIAkJcGFkZHIudjYuc2luNl9wb3J0ID0gcmVxLT5pZC5pZGlhZ19kcG9ydDsKLQkJbWVtY3B5KCZwYWRkci52Ni5zaW42X2FkZHIsIHJlcS0+aWQuaWRpYWdfZHN0LCA2NCk7CisJCW1lbWNweSgmcGFkZHIudjYuc2luNl9hZGRyLCByZXEtPmlkLmlkaWFnX2RzdCwKKwkJICAgICAgIHNpemVvZihwYWRkci52Ni5zaW42X2FkZHIpKTsKIAkJcGFkZHIudjYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKIAl9CiAKQEAgLTQzOSw2ICs0NjgsNyBAQAogCQkuc2tiID0gc2tiLAogCQkuY2IgPSBjYiwKIAkJLnIgPSByLAorCQkubmV0X2FkbWluID0gbmV0bGlua19uZXRfY2FwYWJsZShjYi0+c2tiLCBDQVBfTkVUX0FETUlOKSwKIAl9OwogCiAJLyogZXBzIGhhc2h0YWJsZSBkdW1wcwpAQCAtNDY0LDEwICs0OTQsMTggQEAKIAkgKiAyIDogdG8gcmVjb3JkIHRoZSB0cmFuc3BvcnQgcG9zIG9mIHRoaXMgdGltZSdzIHRyYXZlcnNhbAogCSAqIDMgOiB0byBtYXJrIGlmIHdlIGhhdmUgZHVtcGVkIHRoZSBlcCBpbmZvIG9mIHRoZSBjdXJyZW50IGFzb2MKIAkgKiA0IDogdG8gd29yayBhcyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byB0cmF2ZXJzYWwgbGlzdAorCSAqIDUgOiB0byBzYXZlIHRoZSBzayB3ZSBnZXQgZnJvbSB0cmF2ZWxzaW5nIHRoZSB0c3AgbGlzdC4KIAkgKi8KLQlpZiAoIShpZGlhZ19zdGF0ZXMgJiB+VENQRl9MSVNURU4pKQorCWlmICghKGlkaWFnX3N0YXRlcyAmIH4oVENQRl9MSVNURU4gfCBUQ1BGX0NMT1NFKSkpCiAJCWdvdG8gZG9uZTsKLQlzY3RwX2Zvcl9lYWNoX3RyYW5zcG9ydChzY3RwX3RzcF9kdW1wLCBuZXQsIGNiLT5hcmdzWzJdLCAmY29tbXApOworCituZXh0OgorCWNiLT5hcmdzWzVdID0gMDsKKwlzY3RwX2Zvcl9lYWNoX3RyYW5zcG9ydChzY3RwX2dldF9zb2NrLCBuZXQsIGNiLT5hcmdzWzJdLCAmY29tbXApOworCisJaWYgKGNiLT5hcmdzWzVdICYmICFzY3RwX3NvY2tfZHVtcCgoc3RydWN0IHNvY2sgKiljYi0+YXJnc1s1XSwgJmNvbW1wKSkKKwkJZ290byBuZXh0OworCiBkb25lOgogCWNiLT5hcmdzWzFdID0gY2ItPmFyZ3NbNF07CiAJY2ItPmFyZ3NbNF0gPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jIGIvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jCmluZGV4IDhjNzdiODcuLjllOTY5MGIgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYworKysgYi9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMKQEAgLTI1Myw3ICsyNTMsNyBAQAogCW51bV90eXBlcyA9IHNwLT5wZi0+c3VwcG9ydGVkX2FkZHJzKHNwLCB0eXBlcyk7CiAKIAljaHVua3NpemUgPSBzaXplb2YoaW5pdCkgKyBhZGRyc19sZW47Ci0JY2h1bmtzaXplICs9IFdPUkRfUk9VTkQoU0NUUF9TQVRfTEVOKG51bV90eXBlcykpOworCWNodW5rc2l6ZSArPSBTQ1RQX1BBRDQoU0NUUF9TQVRfTEVOKG51bV90eXBlcykpOwogCWNodW5rc2l6ZSArPSBzaXplb2YoZWNhcF9wYXJhbSk7CiAKIAlpZiAoYXNvYy0+cHJzY3RwX2VuYWJsZSkKQEAgLTI4MywxNCArMjgzLDE0IEBACiAJCS8qIEFkZCBITUFDUyBwYXJhbWV0ZXIgbGVuZ3RoIGlmIGFueSB3ZXJlIGRlZmluZWQgKi8KIAkJYXV0aF9obWFjcyA9IChzY3RwX3BhcmFtaGRyX3QgKilhc29jLT5jLmF1dGhfaG1hY3M7CiAJCWlmIChhdXRoX2htYWNzLT5sZW5ndGgpCi0JCQljaHVua3NpemUgKz0gV09SRF9ST1VORChudG9ocyhhdXRoX2htYWNzLT5sZW5ndGgpKTsKKwkJCWNodW5rc2l6ZSArPSBTQ1RQX1BBRDQobnRvaHMoYXV0aF9obWFjcy0+bGVuZ3RoKSk7CiAJCWVsc2UKIAkJCWF1dGhfaG1hY3MgPSBOVUxMOwogCiAJCS8qIEFkZCBDSFVOS1MgcGFyYW1ldGVyIGxlbmd0aCAqLwogCQlhdXRoX2NodW5rcyA9IChzY3RwX3BhcmFtaGRyX3QgKilhc29jLT5jLmF1dGhfY2h1bmtzOwogCQlpZiAoYXV0aF9jaHVua3MtPmxlbmd0aCkKLQkJCWNodW5rc2l6ZSArPSBXT1JEX1JPVU5EKG50b2hzKGF1dGhfY2h1bmtzLT5sZW5ndGgpKTsKKwkJCWNodW5rc2l6ZSArPSBTQ1RQX1BBRDQobnRvaHMoYXV0aF9jaHVua3MtPmxlbmd0aCkpOwogCQllbHNlCiAJCQlhdXRoX2NodW5rcyA9IE5VTEw7CiAKQEAgLTMwMCw4ICszMDAsOCBAQAogCiAJLyogSWYgd2UgaGF2ZSBhbnkgZXh0ZW5zaW9ucyB0byByZXBvcnQsIGFjY291bnQgZm9yIHRoYXQgKi8KIAlpZiAobnVtX2V4dCkKLQkJY2h1bmtzaXplICs9IFdPUkRfUk9VTkQoc2l6ZW9mKHNjdHBfc3VwcG9ydGVkX2V4dF9wYXJhbV90KSArCi0JCQkJCW51bV9leHQpOworCQljaHVua3NpemUgKz0gU0NUUF9QQUQ0KHNpemVvZihzY3RwX3N1cHBvcnRlZF9leHRfcGFyYW1fdCkgKworCQkJCSAgICAgICBudW1fZXh0KTsKIAogCS8qIFJGQyAyOTYwIDMuMy4yIEluaXRpYXRpb24gKElOSVQpICgxKQogCSAqCkBAIC00NDMsMTMgKzQ0MywxMyBAQAogCiAJCWF1dGhfaG1hY3MgPSAoc2N0cF9wYXJhbWhkcl90ICopYXNvYy0+Yy5hdXRoX2htYWNzOwogCQlpZiAoYXV0aF9obWFjcy0+bGVuZ3RoKQotCQkJY2h1bmtzaXplICs9IFdPUkRfUk9VTkQobnRvaHMoYXV0aF9obWFjcy0+bGVuZ3RoKSk7CisJCQljaHVua3NpemUgKz0gU0NUUF9QQUQ0KG50b2hzKGF1dGhfaG1hY3MtPmxlbmd0aCkpOwogCQllbHNlCiAJCQlhdXRoX2htYWNzID0gTlVMTDsKIAogCQlhdXRoX2NodW5rcyA9IChzY3RwX3BhcmFtaGRyX3QgKilhc29jLT5jLmF1dGhfY2h1bmtzOwogCQlpZiAoYXV0aF9jaHVua3MtPmxlbmd0aCkKLQkJCWNodW5rc2l6ZSArPSBXT1JEX1JPVU5EKG50b2hzKGF1dGhfY2h1bmtzLT5sZW5ndGgpKTsKKwkJCWNodW5rc2l6ZSArPSBTQ1RQX1BBRDQobnRvaHMoYXV0aF9jaHVua3MtPmxlbmd0aCkpOwogCQllbHNlCiAJCQlhdXRoX2NodW5rcyA9IE5VTEw7CiAKQEAgLTQ1OCw4ICs0NTgsOCBAQAogCX0KIAogCWlmIChudW1fZXh0KQotCQljaHVua3NpemUgKz0gV09SRF9ST1VORChzaXplb2Yoc2N0cF9zdXBwb3J0ZWRfZXh0X3BhcmFtX3QpICsKLQkJCQkJbnVtX2V4dCk7CisJCWNodW5rc2l6ZSArPSBTQ1RQX1BBRDQoc2l6ZW9mKHNjdHBfc3VwcG9ydGVkX2V4dF9wYXJhbV90KSArCisJCQkJICAgICAgIG51bV9leHQpOwogCiAJLyogTm93IGFsbG9jYXRlIGFuZCBmaWxsIG91dCB0aGUgY2h1bmsuICAqLwogCXJldHZhbCA9IHNjdHBfbWFrZV9jb250cm9sKGFzb2MsIFNDVFBfQ0lEX0lOSVRfQUNLLCAwLCBjaHVua3NpemUsIGdmcCk7CkBAIC03MDYsMjAgKzcwNiw2IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHZvaWQgc2N0cF9zZXRfcHJzY3RwX3BvbGljeShzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCi0JCQkJICAgY29uc3Qgc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm8pCi17Ci0JaWYgKCFjaHVuay0+YXNvYy0+cHJzY3RwX2VuYWJsZSkKLQkJcmV0dXJuOwotCi0JaWYgKFNDVFBfUFJfVFRMX0VOQUJMRUQoc2luZm8tPnNpbmZvX2ZsYWdzKSkKLQkJY2h1bmstPnByc2N0cF9wYXJhbSA9Ci0JCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhzaW5mby0+c2luZm9fdGltZXRvbGl2ZSk7Ci0JZWxzZSBpZiAoU0NUUF9QUl9SVFhfRU5BQkxFRChzaW5mby0+c2luZm9fZmxhZ3MpIHx8Ci0JCSBTQ1RQX1BSX1BSSU9fRU5BQkxFRChzaW5mby0+c2luZm9fZmxhZ3MpKQotCQljaHVuay0+cHJzY3RwX3BhcmFtID0gc2luZm8tPnNpbmZvX3RpbWV0b2xpdmU7Ci19Ci0KIC8qIE1ha2UgYSBEQVRBIGNodW5rIGZvciB0aGUgZ2l2ZW4gYXNzb2NpYXRpb24gZnJvbSB0aGUgcHJvdmlkZWQKICAqIHBhcmFtZXRlcnMuICBIb3dldmVyLCBkbyBub3QgcG9wdWxhdGUgdGhlIGRhdGEgcGF5bG9hZC4KICAqLwpAQCAtNzUzLDcgKzczOSw2IEBACiAKIAlyZXR2YWwtPnN1YmguZGF0YV9oZHIgPSBzY3RwX2FkZHRvX2NodW5rKHJldHZhbCwgc2l6ZW9mKGRwKSwgJmRwKTsKIAltZW1jcHkoJnJldHZhbC0+c2luZm8sIHNpbmZvLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOwotCXNjdHBfc2V0X3Byc2N0cF9wb2xpY3kocmV0dmFsLCBzaW5mbyk7CiAKIG5vZGF0YToKIAlyZXR1cm4gcmV0dmFsOwpAQCAtMTM5MCw3ICsxMzc1LDcgQEAKIAlzdHJ1Y3Qgc29jayAqc2s7CiAKIAkvKiBObyBuZWVkIHRvIGFsbG9jYXRlIExMIGhlcmUsIGFzIHRoaXMgaXMgb25seSBhIGNodW5rLiAqLwotCXNrYiA9IGFsbG9jX3NrYihXT1JEX1JPVU5EKHNpemVvZihzY3RwX2NodW5raGRyX3QpICsgcGF5bGVuKSwgZ2ZwKTsKKwlza2IgPSBhbGxvY19za2IoU0NUUF9QQUQ0KHNpemVvZihzY3RwX2NodW5raGRyX3QpICsgcGF5bGVuKSwgZ2ZwKTsKIAlpZiAoIXNrYikKIAkJZ290byBub2RhdGE7CiAKQEAgLTE0ODIsNyArMTQ2Nyw3IEBACiAJdm9pZCAqdGFyZ2V0OwogCXZvaWQgKnBhZGRpbmc7CiAJaW50IGNodW5rbGVuID0gbnRvaHMoY2h1bmstPmNodW5rX2hkci0+bGVuZ3RoKTsKLQlpbnQgcGFkbGVuID0gV09SRF9ST1VORChjaHVua2xlbikgLSBjaHVua2xlbjsKKwlpbnQgcGFkbGVuID0gU0NUUF9QQUQ0KGNodW5rbGVuKSAtIGNodW5rbGVuOwogCiAJcGFkZGluZyA9IHNrYl9wdXQoY2h1bmstPnNrYiwgcGFkbGVuKTsKIAl0YXJnZXQgPSBza2JfcHV0KGNodW5rLT5za2IsIGxlbik7CkBAIC0xOTAwLDcgKzE4ODUsNyBAQAogCXN0cnVjdCBfX3NjdHBfbWlzc2luZyByZXBvcnQ7CiAJX191MTYgbGVuOwogCi0JbGVuID0gV09SRF9ST1VORChzaXplb2YocmVwb3J0KSk7CisJbGVuID0gU0NUUF9QQUQ0KHNpemVvZihyZXBvcnQpKTsKIAogCS8qIE1ha2UgYW4gRVJST1IgY2h1bmssIHByZXBhcmluZyBlbm91Z2ggcm9vbSBmb3IKIAkgKiByZXR1cm5pbmcgbXVsdGlwbGUgdW5rbm93biBwYXJhbWV0ZXJzLgpAQCAtMjA5OCw5ICsyMDgzLDkgQEAKIAogCQlpZiAoKmVycnApIHsKIAkJCWlmICghc2N0cF9pbml0X2NhdXNlX2ZpeGVkKCplcnJwLCBTQ1RQX0VSUk9SX1VOS05PV05fUEFSQU0sCi0JCQkJCVdPUkRfUk9VTkQobnRvaHMocGFyYW0ucC0+bGVuZ3RoKSkpKQorCQkJCQlTQ1RQX1BBRDQobnRvaHMocGFyYW0ucC0+bGVuZ3RoKSkpKQogCQkJCXNjdHBfYWRkdG9fY2h1bmtfZml4ZWQoKmVycnAsCi0JCQkJCQlXT1JEX1JPVU5EKG50b2hzKHBhcmFtLnAtPmxlbmd0aCkpLAorCQkJCQkJU0NUUF9QQUQ0KG50b2hzKHBhcmFtLnAtPmxlbmd0aCkpLAogCQkJCQkJcGFyYW0udik7CiAJCX0gZWxzZSB7CiAJCQkvKiBJZiB0aGVyZSBpcyBubyBtZW1vcnkgZm9yIGdlbmVyYXRpbmcgdGhlIEVSUk9SCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMgYi9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMKaW5kZXggMTJkNDUxOS4uYzM0NWJmMSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jCisrKyBiL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYwpAQCAtMTAyMCwxOSArMTAyMCwxMyBAQAogICogVGhpcyB3YXkgdGhlIHdob2xlIG1lc3NhZ2UgaXMgcXVldWVkIHVwIGFuZCBidW5kbGluZyBpZgogICogZW5jb3VyYWdlZCBmb3Igc21hbGwgZnJhZ21lbnRzLgogICovCi1zdGF0aWMgaW50IHNjdHBfY21kX3NlbmRfbXNnKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAotCQkJCXN0cnVjdCBzY3RwX2RhdGFtc2cgKm1zZywgZ2ZwX3QgZ2ZwKQorc3RhdGljIHZvaWQgc2N0cF9jbWRfc2VuZF9tc2coc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkgICAgICBzdHJ1Y3Qgc2N0cF9kYXRhbXNnICptc2csIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bms7Ci0JaW50IGVycm9yID0gMDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2h1bmssICZtc2ctPmNodW5rcywgZnJhZ19saXN0KSB7Ci0JCWVycm9yID0gc2N0cF9vdXRxX3RhaWwoJmFzb2MtPm91dHF1ZXVlLCBjaHVuaywgZ2ZwKTsKLQkJaWYgKGVycm9yKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGVycm9yOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2h1bmssICZtc2ctPmNodW5rcywgZnJhZ19saXN0KQorCQlzY3RwX291dHFfdGFpbCgmYXNvYy0+b3V0cXVldWUsIGNodW5rLCBnZnApOwogfQogCiAKQEAgLTE0MjcsOCArMTQyMSw3IEBACiAJCQkJbG9jYWxfY29yayA9IDE7CiAJCQl9CiAJCQkvKiBTZW5kIGEgY2h1bmsgdG8gb3VyIHBlZXIuICAqLwotCQkJZXJyb3IgPSBzY3RwX291dHFfdGFpbCgmYXNvYy0+b3V0cXVldWUsIGNtZC0+b2JqLmNodW5rLAotCQkJCQkgICAgICAgZ2ZwKTsKKwkJCXNjdHBfb3V0cV90YWlsKCZhc29jLT5vdXRxdWV1ZSwgY21kLT5vYmouY2h1bmssIGdmcCk7CiAJCQlicmVhazsKIAogCQljYXNlIFNDVFBfQ01EX1NFTkRfUEtUOgpAQCAtMTY4Miw3ICsxNjc1LDcgQEAKIAkJY2FzZSBTQ1RQX0NNRF9GT1JDRV9QUklNX1JFVFJBTjoKIAkJCXQgPSBhc29jLT5wZWVyLnJldHJhbl9wYXRoOwogCQkJYXNvYy0+cGVlci5yZXRyYW5fcGF0aCA9IGFzb2MtPnBlZXIucHJpbWFyeV9wYXRoOwotCQkJZXJyb3IgPSBzY3RwX291dHFfdW5jb3JrKCZhc29jLT5vdXRxdWV1ZSwgZ2ZwKTsKKwkJCXNjdHBfb3V0cV91bmNvcmsoJmFzb2MtPm91dHF1ZXVlLCBnZnApOwogCQkJbG9jYWxfY29yayA9IDA7CiAJCQlhc29jLT5wZWVyLnJldHJhbl9wYXRoID0gdDsKIAkJCWJyZWFrOwpAQCAtMTcwOSw3ICsxNzAyLDcgQEAKIAkJCQlzY3RwX291dHFfY29yaygmYXNvYy0+b3V0cXVldWUpOwogCQkJCWxvY2FsX2NvcmsgPSAxOwogCQkJfQotCQkJZXJyb3IgPSBzY3RwX2NtZF9zZW5kX21zZyhhc29jLCBjbWQtPm9iai5tc2csIGdmcCk7CisJCQlzY3RwX2NtZF9zZW5kX21zZyhhc29jLCBjbWQtPm9iai5tc2csIGdmcCk7CiAJCQlicmVhazsKIAkJY2FzZSBTQ1RQX0NNRF9TRU5EX05FWFRfQVNDT05GOgogCQkJc2N0cF9jbWRfc2VuZF9hc2NvbmYoYXNvYyk7CkBAIC0xNzM5LDkgKzE3MzIsOSBAQAogCSAqLwogCWlmIChhc29jICYmIFNDVFBfRVZFTlRfVF9DSFVOSyA9PSBldmVudF90eXBlICYmIGNodW5rKSB7CiAJCWlmIChjaHVuay0+ZW5kX29mX3BhY2tldCB8fCBjaHVuay0+c2luZ2xldG9uKQotCQkJZXJyb3IgPSBzY3RwX291dHFfdW5jb3JrKCZhc29jLT5vdXRxdWV1ZSwgZ2ZwKTsKKwkJCXNjdHBfb3V0cV91bmNvcmsoJmFzb2MtPm91dHF1ZXVlLCBnZnApOwogCX0gZWxzZSBpZiAobG9jYWxfY29yaykKLQkJZXJyb3IgPSBzY3RwX291dHFfdW5jb3JrKCZhc29jLT5vdXRxdWV1ZSwgZ2ZwKTsKKwkJc2N0cF9vdXRxX3VuY29yaygmYXNvYy0+b3V0cXVldWUsIGdmcCk7CiAKIAlpZiAoc3AtPmRhdGFfcmVhZHlfc2lnbmFsbGVkKQogCQlzcC0+ZGF0YV9yZWFkeV9zaWduYWxsZWQgPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMgYi9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYwppbmRleCBkODhiYjJiLi4wMjZlM2JjIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYworKysgYi9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYwpAQCAtMzQ1NCw3ICszNDU0LDcgQEAKIAkJfQogCiAJCS8qIFJlcG9ydCB2aW9sYXRpb24gaWYgY2h1bmsgbGVuIG92ZXJmbG93cyAqLwotCQljaF9lbmQgPSAoKF9fdTggKiljaCkgKyBXT1JEX1JPVU5EKG50b2hzKGNoLT5sZW5ndGgpKTsKKwkJY2hfZW5kID0gKChfX3U4ICopY2gpICsgU0NUUF9QQUQ0KG50b2hzKGNoLT5sZW5ndGgpKTsKIAkJaWYgKGNoX2VuZCA+IHNrYl90YWlsX3BvaW50ZXIoc2tiKSkKIAkJCXJldHVybiBzY3RwX3NmX3Zpb2xhdGlvbl9jaHVua2xlbihuZXQsIGVwLCBhc29jLCB0eXBlLCBhcmcsCiAJCQkJCQkgIGNvbW1hbmRzKTsKQEAgLTQxODUsNyArNDE4NSw3IEBACiAJCWhkciA9IHVua19jaHVuay0+Y2h1bmtfaGRyOwogCQllcnJfY2h1bmsgPSBzY3RwX21ha2Vfb3BfZXJyb3IoYXNvYywgdW5rX2NodW5rLAogCQkJCQkgICAgICAgU0NUUF9FUlJPUl9VTktOT1dOX0NIVU5LLCBoZHIsCi0JCQkJCSAgICAgICBXT1JEX1JPVU5EKG50b2hzKGhkci0+bGVuZ3RoKSksCisJCQkJCSAgICAgICBTQ1RQX1BBRDQobnRvaHMoaGRyLT5sZW5ndGgpKSwKIAkJCQkJICAgICAgIDApOwogCQlpZiAoZXJyX2NodW5rKSB7CiAJCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUExZLApAQCAtNDIwMyw3ICs0MjAzLDcgQEAKIAkJaGRyID0gdW5rX2NodW5rLT5jaHVua19oZHI7CiAJCWVycl9jaHVuayA9IHNjdHBfbWFrZV9vcF9lcnJvcihhc29jLCB1bmtfY2h1bmssCiAJCQkJCSAgICAgICBTQ1RQX0VSUk9SX1VOS05PV05fQ0hVTkssIGhkciwKLQkJCQkJICAgICAgIFdPUkRfUk9VTkQobnRvaHMoaGRyLT5sZW5ndGgpKSwKKwkJCQkJICAgICAgIFNDVFBfUEFENChudG9ocyhoZHItPmxlbmd0aCkpLAogCQkJCQkgICAgICAgMCk7CiAJCWlmIChlcnJfY2h1bmspIHsKIAkJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVQTFksCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zb2NrZXQuYyBiL25ldC9zY3RwL3NvY2tldC5jCmluZGV4IDlmYzQxN2EuLmZiMDJjNzAgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NvY2tldC5jCisrKyBiL25ldC9zY3RwL3NvY2tldC5jCkBAIC0xOTU4LDYgKzE5NTgsOCBAQAogCiAJLyogTm93IHNlbmQgdGhlIChwb3NzaWJseSkgZnJhZ21lbnRlZCBtZXNzYWdlLiAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2h1bmssICZkYXRhbXNnLT5jaHVua3MsIGZyYWdfbGlzdCkgeworCQlzY3RwX2NodW5rX2hvbGQoY2h1bmspOworCiAJCS8qIERvIGFjY291bnRpbmcgZm9yIHRoZSB3cml0ZSBzcGFjZS4gICovCiAJCXNjdHBfc2V0X293bmVyX3coY2h1bmspOwogCkBAIC0xOTcwLDEzICsxOTcyLDE1IEBACiAJICogYnJlYWtzLgogCSAqLwogCWVyciA9IHNjdHBfcHJpbWl0aXZlX1NFTkQobmV0LCBhc29jLCBkYXRhbXNnKTsKLQlzY3RwX2RhdGFtc2dfcHV0KGRhdGFtc2cpOwogCS8qIERpZCB0aGUgbG93ZXIgbGF5ZXIgYWNjZXB0IHRoZSBjaHVuaz8gKi8KLQlpZiAoZXJyKQorCWlmIChlcnIpIHsKKwkJc2N0cF9kYXRhbXNnX2ZyZWUoZGF0YW1zZyk7CiAJCWdvdG8gb3V0X2ZyZWU7CisJfQogCiAJcHJfZGVidWcoIiVzOiB3ZSBzZW50IHByaW1pdGl2ZWx5XG4iLCBfX2Z1bmNfXyk7CiAKKwlzY3RwX2RhdGFtc2dfcHV0KGRhdGFtc2cpOwogCWVyciA9IG1zZ19sZW47CiAKIAlpZiAodW5saWtlbHkod2FpdF9jb25uZWN0KSkgewpAQCAtNDQ2OSwxNyArNDQ3MywyMSBAQAogCQkJCSAgY29uc3QgdW5pb24gc2N0cF9hZGRyICpwYWRkciwgdm9pZCAqcCkKIHsKIAlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydDsKLQlpbnQgZXJyID0gMDsKKwlpbnQgZXJyID0gLUVOT0VOVDsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAl0cmFuc3BvcnQgPSBzY3RwX2FkZHJzX2xvb2t1cF90cmFuc3BvcnQobmV0LCBsYWRkciwgcGFkZHIpOwogCWlmICghdHJhbnNwb3J0IHx8ICFzY3RwX3RyYW5zcG9ydF9ob2xkKHRyYW5zcG9ydCkpCiAJCWdvdG8gb3V0OwotCWVyciA9IGNiKHRyYW5zcG9ydCwgcCk7CisKKwlzY3RwX2Fzc29jaWF0aW9uX2hvbGQodHJhbnNwb3J0LT5hc29jKTsKIAlzY3RwX3RyYW5zcG9ydF9wdXQodHJhbnNwb3J0KTsKIAotb3V0OgogCXJjdV9yZWFkX3VubG9jaygpOworCWVyciA9IGNiKHRyYW5zcG9ydCwgcCk7CisJc2N0cF9hc3NvY2lhdGlvbl9wdXQodHJhbnNwb3J0LT5hc29jKTsKKworb3V0OgogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzY3RwX3RyYW5zcG9ydF9sb29rdXBfcHJvY2Vzcyk7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC90cmFuc3BvcnQuYyBiL25ldC9zY3RwL3RyYW5zcG9ydC5jCmluZGV4IDgxYjg2NjcuLmNlNTRkY2UgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3RyYW5zcG9ydC5jCisrKyBiL25ldC9zY3RwL3RyYW5zcG9ydC5jCkBAIC0yMzMsNyArMjMzLDcgQEAKIAl9CiAKIAlpZiAodHJhbnNwb3J0LT5kc3QpIHsKLQkJdHJhbnNwb3J0LT5wYXRobXR1ID0gV09SRF9UUlVOQyhkc3RfbXR1KHRyYW5zcG9ydC0+ZHN0KSk7CisJCXRyYW5zcG9ydC0+cGF0aG10dSA9IFNDVFBfVFJVTkM0KGRzdF9tdHUodHJhbnNwb3J0LT5kc3QpKTsKIAl9IGVsc2UKIAkJdHJhbnNwb3J0LT5wYXRobXR1ID0gU0NUUF9ERUZBVUxUX01BWFNFR01FTlQ7CiB9CkBAIC0yODcsNyArMjg3LDcgQEAKIAkJcmV0dXJuOwogCX0KIAlpZiAodHJhbnNwb3J0LT5kc3QpIHsKLQkJdHJhbnNwb3J0LT5wYXRobXR1ID0gV09SRF9UUlVOQyhkc3RfbXR1KHRyYW5zcG9ydC0+ZHN0KSk7CisJCXRyYW5zcG9ydC0+cGF0aG10dSA9IFNDVFBfVFJVTkM0KGRzdF9tdHUodHJhbnNwb3J0LT5kc3QpKTsKIAogCQkvKiBJbml0aWFsaXplIHNrLT5za19yY3Zfc2FkZHIsIGlmIHRoZSB0cmFuc3BvcnQgaXMgdGhlCiAJCSAqIGFzc29jaWF0aW9uJ3MgYWN0aXZlIHBhdGggZm9yIGdldHNvY2tuYW1lKCkuCmRpZmYgLS1naXQgYS9uZXQvc2N0cC91bHBldmVudC5jIGIvbmV0L3NjdHAvdWxwZXZlbnQuYwppbmRleCAxYmM0ZjcxLi5iZWEwMDA1IDEwMDY0NAotLS0gYS9uZXQvc2N0cC91bHBldmVudC5jCisrKyBiL25ldC9zY3RwL3VscGV2ZW50LmMKQEAgLTM4Myw3ICszODMsNyBAQAogCiAJY2ggPSAoc2N0cF9lcnJoZHJfdCAqKShjaHVuay0+c2tiLT5kYXRhKTsKIAljYXVzZSA9IGNoLT5jYXVzZTsKLQllbGVuID0gV09SRF9ST1VORChudG9ocyhjaC0+bGVuZ3RoKSkgLSBzaXplb2Yoc2N0cF9lcnJoZHJfdCk7CisJZWxlbiA9IFNDVFBfUEFENChudG9ocyhjaC0+bGVuZ3RoKSkgLSBzaXplb2Yoc2N0cF9lcnJoZHJfdCk7CiAKIAkvKiBQdWxsIG9mZiB0aGUgRVJST1IgaGVhZGVyLiAgKi8KIAlza2JfcHVsbChjaHVuay0+c2tiLCBzaXplb2Yoc2N0cF9lcnJoZHJfdCkpOwpAQCAtNjg4LDcgKzY4OCw3IEBACiAJICogTVVTVCBpZ25vcmUgdGhlIHBhZGRpbmcgYnl0ZXMuCiAJICovCiAJbGVuID0gbnRvaHMoY2h1bmstPmNodW5rX2hkci0+bGVuZ3RoKTsKLQlwYWRkaW5nID0gV09SRF9ST1VORChsZW4pIC0gbGVuOworCXBhZGRpbmcgPSBTQ1RQX1BBRDQobGVuKSAtIGxlbjsKIAogCS8qIEZpeHVwIGNsb25lZCBza2Igd2l0aCBqdXN0IHRoaXMgY2h1bmtzIGRhdGEuICAqLwogCXNrYl90cmltKHNrYiwgY2h1bmstPmNodW5rX2VuZCAtIHBhZGRpbmcgLSBza2ItPmRhdGEpOwpAQCAtNzAyLDE0ICs3MDIsMTQgQEAKIAkgKi8KIAlzY3RwX3VscGV2ZW50X2luaXQoZXZlbnQsIDAsIHNrYi0+bGVuICsgc2l6ZW9mKHN0cnVjdCBza19idWZmKSk7CiAKLQlzY3RwX3VscGV2ZW50X3JlY2VpdmVfZGF0YShldmVudCwgYXNvYyk7Ci0KIAkvKiBBbmQgaG9sZCB0aGUgY2h1bmsgYXMgd2UgbmVlZCBpdCBmb3IgZ2V0dGluZyB0aGUgSVAgaGVhZGVycwogCSAqIGxhdGVyIGluIHJlY3Ztc2cKIAkgKi8KIAlzY3RwX2NodW5rX2hvbGQoY2h1bmspOwogCWV2ZW50LT5jaHVuayA9IGNodW5rOwogCisJc2N0cF91bHBldmVudF9yZWNlaXZlX2RhdGEoZXZlbnQsIGFzb2MpOworCiAJZXZlbnQtPnN0cmVhbSA9IG50b2hzKGNodW5rLT5zdWJoLmRhdGFfaGRyLT5zdHJlYW0pOwogCWV2ZW50LT5zc24gPSBudG9ocyhjaHVuay0+c3ViaC5kYXRhX2hkci0+c3NuKTsKIAlldmVudC0+cHBpZCA9IGNodW5rLT5zdWJoLmRhdGFfaGRyLT5wcGlkOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvdWxwcXVldWUuYyBiL25ldC9zY3RwL3VscHF1ZXVlLmMKaW5kZXggODc3ZTU1MC4uODRkMGZkYSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvdWxwcXVldWUuYworKysgYi9uZXQvc2N0cC91bHBxdWV1ZS5jCkBAIC0xNDAsMTEgKzE0MCw4IEBACiAJCSAqIHdlIGNhbiBnbyBhaGVhZCBhbmQgY2xlYXIgb3V0IHRoZSBsb2JieSBpbiBvbmUgc2hvdAogCQkgKi8KIAkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNwLT5wZF9sb2JieSkpIHsKLQkJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJCQlza2JfcXVldWVfc3BsaWNlX3RhaWxfaW5pdCgmc3AtPnBkX2xvYmJ5LAogCQkJCQkJICAgJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKLQkJCWxpc3QgPSAoc3RydWN0IGxpc3RfaGVhZCAqKSZzY3RwX3NrKHNrKS0+cGRfbG9iYnk7Ci0JCQlJTklUX0xJU1RfSEVBRChsaXN0KTsKIAkJCXJldHVybiAxOwogCQl9CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL25ldC9zdHJwYXJzZXIvS2NvbmZpZyBiL25ldC9zdHJwYXJzZXIvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2ZmM2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3N0cnBhcnNlci9LY29uZmlnCkBAIC0wLDAgKzEsNCBAQAorCitjb25maWcgU1RSRUFNX1BBUlNFUgorCXRyaXN0YXRlCisJZGVmYXVsdCBuCmRpZmYgLS1naXQgYS9uZXQvc3RycGFyc2VyL01ha2VmaWxlIGIvbmV0L3N0cnBhcnNlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NThhMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3N0cnBhcnNlci9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmotJChDT05GSUdfU1RSRUFNX1BBUlNFUikgKz0gc3RycGFyc2VyLm8KZGlmZiAtLWdpdCBhL25ldC9zdHJwYXJzZXIvc3RycGFyc2VyLmMgYi9uZXQvc3RycGFyc2VyL3N0cnBhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNzU0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc3RycGFyc2VyL3N0cnBhcnNlci5jCkBAIC0wLDAgKzEsNTEwIEBACisvKgorICogU3RyZWFtIFBhcnNlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBUb20gSGVyYmVydCA8dG9tQGhlcmJlcnRsYW5kLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2VycnF1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bmV0L3N0cnBhcnNlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRucy9nZW5lcmljLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpzdHJwX3dxOworCitzdHJ1Y3QgX3N0cnBfcnhfbXNnIHsKKwkvKiBJbnRlcm5hbCBjYiBzdHJ1Y3R1cmUuIHN0cnVjdCBzdHJwX3J4X21zZyBtdXN0IGJlIGZpcnN0IGZvciBwYXNzaW5nCisJICogdG8gdXBwZXIgbGF5ZXIuCisJICovCisJc3RydWN0IHN0cnBfcnhfbXNnIHN0cnA7CisJaW50IGFjY3VtX2xlbjsKKwlpbnQgZWFybHlfZWF0ZW47Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBfc3RycF9yeF9tc2cgKl9zdHJwX3J4X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IF9zdHJwX3J4X21zZyAqKSgodm9pZCAqKXNrYi0+Y2IgKworCQlvZmZzZXRvZihzdHJ1Y3QgcWRpc2Nfc2tiX2NiLCBkYXRhKSk7Cit9CisKKy8qIExvd2VyIGxvY2sgaGVsZCAqLworc3RhdGljIHZvaWQgc3RycF9hYm9ydF9yeF9zdHJwKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIGludCBlcnIpCit7CisJc3RydWN0IHNvY2sgKmNzayA9IHN0cnAtPnNrOworCisJLyogVW5yZWNvdmVyYWJsZSBlcnJvciBpbiByZWNlaXZlICovCisKKwlkZWxfdGltZXIoJnN0cnAtPnJ4X21zZ190aW1lcik7CisKKwlpZiAoc3RycC0+cnhfc3RvcHBlZCkKKwkJcmV0dXJuOworCisJc3RycC0+cnhfc3RvcHBlZCA9IDE7CisKKwkvKiBSZXBvcnQgYW4gZXJyb3Igb24gdGhlIGxvd2VyIHNvY2tldCAqLworCWNzay0+c2tfZXJyID0gZXJyOworCWNzay0+c2tfZXJyb3JfcmVwb3J0KGNzayk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cnBfc3RhcnRfcnhfdGltZXIoc3RydWN0IHN0cnBhcnNlciAqc3RycCkKK3sKKwlpZiAoc3RycC0+c2stPnNrX3JjdnRpbWVvKQorCQltb2RfdGltZXIoJnN0cnAtPnJ4X21zZ190aW1lciwgc3RycC0+c2stPnNrX3JjdnRpbWVvKTsKK30KKworLyogTG93ZXIgbG9jayBoZWxkICovCitzdGF0aWMgdm9pZCBzdHJwX3BhcnNlcl9lcnIoc3RydWN0IHN0cnBhcnNlciAqc3RycCwgaW50IGVyciwKKwkJCSAgICByZWFkX2Rlc2NyaXB0b3JfdCAqZGVzYykKK3sKKwlkZXNjLT5lcnJvciA9IGVycjsKKwlrZnJlZV9za2Ioc3RycC0+cnhfc2tiX2hlYWQpOworCXN0cnAtPnJ4X3NrYl9oZWFkID0gTlVMTDsKKwlzdHJwLT5jYi5hYm9ydF9wYXJzZXIoc3RycCwgZXJyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3RycF9wZWVrX2xlbihzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBzdHJwLT5zay0+c2tfc29ja2V0OworCisJcmV0dXJuIHNvY2stPm9wcy0+cGVla19sZW4oc29jayk7Cit9CisKKy8qIExvd2VyIHNvY2tldCBsb2NrIGhlbGQgKi8KK3N0YXRpYyBpbnQgc3RycF9yZWN2KHJlYWRfZGVzY3JpcHRvcl90ICpkZXNjLCBzdHJ1Y3Qgc2tfYnVmZiAqb3JpZ19za2IsCisJCSAgICAgdW5zaWduZWQgaW50IG9yaWdfb2Zmc2V0LCBzaXplX3Qgb3JpZ19sZW4pCit7CisJc3RydWN0IHN0cnBhcnNlciAqc3RycCA9IChzdHJ1Y3Qgc3RycGFyc2VyICopZGVzYy0+YXJnLmRhdGE7CisJc3RydWN0IF9zdHJwX3J4X21zZyAqcnhtOworCXN0cnVjdCBza19idWZmICpoZWFkLCAqc2tiOworCXNpemVfdCBlYXRlbiA9IDAsIGNhbmRfbGVuOworCXNzaXplX3QgZXh0cmE7CisJaW50IGVycjsKKwlib29sIGNsb25lZF9vcmlnID0gZmFsc2U7CisKKwlpZiAoc3RycC0+cnhfcGF1c2VkKQorCQlyZXR1cm4gMDsKKworCWhlYWQgPSBzdHJwLT5yeF9za2JfaGVhZDsKKwlpZiAoaGVhZCkgeworCQkvKiBNZXNzYWdlIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKi8KKworCQlyeG0gPSBfc3RycF9yeF9tc2coaGVhZCk7CisJCWlmICh1bmxpa2VseShyeG0tPmVhcmx5X2VhdGVuKSkgeworCQkJLyogQWxyZWFkeSBzb21lIG51bWJlciBvZiBieXRlcyBvbiB0aGUgcmVjZWl2ZSBzb2NrCisJCQkgKiBkYXRhIHNhdmVkIGluIHJ4X3NrYl9oZWFkLCBqdXN0IGluZGljYXRlIHRoZXkKKwkJCSAqIGFyZSBjb25zdW1lZC4KKwkJCSAqLworCQkJZWF0ZW4gPSBvcmlnX2xlbiA8PSByeG0tPmVhcmx5X2VhdGVuID8KKwkJCQlvcmlnX2xlbiA6IHJ4bS0+ZWFybHlfZWF0ZW47CisJCQlyeG0tPmVhcmx5X2VhdGVuIC09IGVhdGVuOworCisJCQlyZXR1cm4gZWF0ZW47CisJCX0KKworCQlpZiAodW5saWtlbHkob3JpZ19vZmZzZXQpKSB7CisJCQkvKiBHZXR0aW5nIGRhdGEgd2l0aCBhIG5vbi16ZXJvIG9mZnNldCB3aGVuIGEgbWVzc2FnZSBpcworCQkJICogaW4gcHJvZ3Jlc3MgaXMgbm90IGV4cGVjdGVkLiBJZiBpdCBkb2VzIGhhcHBlbiwgd2UKKwkJCSAqIG5lZWQgdG8gY2xvbmUgYW5kIHB1bGwgc2luY2Ugd2UgY2FuJ3QgZGVhbCB3aXRoCisJCQkgKiBvZmZzZXRzIGluIHRoZSBza2JzIGZvciBhIG1lc3NhZ2UgZXhwZWN0IGluIHRoZSBoZWFkLgorCQkJICovCisJCQlvcmlnX3NrYiA9IHNrYl9jbG9uZShvcmlnX3NrYiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoIW9yaWdfc2tiKSB7CisJCQkJU1RSUF9TVEFUU19JTkNSKHN0cnAtPnN0YXRzLnJ4X21lbV9mYWlsKTsKKwkJCQlkZXNjLT5lcnJvciA9IC1FTk9NRU07CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoIXBza2JfcHVsbChvcmlnX3NrYiwgb3JpZ19vZmZzZXQpKSB7CisJCQkJU1RSUF9TVEFUU19JTkNSKHN0cnAtPnN0YXRzLnJ4X21lbV9mYWlsKTsKKwkJCQlrZnJlZV9za2Iob3JpZ19za2IpOworCQkJCWRlc2MtPmVycm9yID0gLUVOT01FTTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWNsb25lZF9vcmlnID0gdHJ1ZTsKKwkJCW9yaWdfb2Zmc2V0ID0gMDsKKwkJfQorCisJCWlmICghc3RycC0+cnhfc2tiX25leHRwKSB7CisJCQkvKiBXZSBhcmUgZ29pbmcgdG8gYXBwZW5kIHRvIHRoZSBmcmFnc19saXN0IG9mIGhlYWQuCisJCQkgKiBOZWVkIHRvIHVuc2hhcmUgdGhlIGZyYWdfbGlzdC4KKwkJCSAqLworCQkJZXJyID0gc2tiX3VuY2xvbmUoaGVhZCwgR0ZQX0FUT01JQyk7CisJCQlpZiAoZXJyKSB7CisJCQkJU1RSUF9TVEFUU19JTkNSKHN0cnAtPnN0YXRzLnJ4X21lbV9mYWlsKTsKKwkJCQlkZXNjLT5lcnJvciA9IGVycjsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJaWYgKHVubGlrZWx5KHNrYl9zaGluZm8oaGVhZCktPmZyYWdfbGlzdCkpIHsKKwkJCQkvKiBXZSBjYW4ndCBhcHBlbmQgdG8gYW4gc2tfYnVmZiB0aGF0IGFscmVhZHkKKwkJCQkgKiBoYXMgYSBmcmFnX2xpc3QuIFdlIGNyZWF0ZSBhIG5ldyBoZWFkLCBwb2ludAorCQkJCSAqIHRoZSBmcmFnX2xpc3Qgb2YgdGhhdCB0byB0aGUgb2xkIGhlYWQsIGFuZAorCQkJCSAqIHRoZW4gYXJlIGFibGUgdG8gdXNlIHRoZSBvbGQgaGVhZC0+bmV4dCBmb3IKKwkJCQkgKiBhcHBlbmRpbmcgdG8gdGhlIG1lc3NhZ2UuCisJCQkJICovCisJCQkJaWYgKFdBUk5fT04oaGVhZC0+bmV4dCkpIHsKKwkJCQkJZGVzYy0+ZXJyb3IgPSAtRUlOVkFMOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisKKwkJCQlza2IgPSBhbGxvY19za2IoMCwgR0ZQX0FUT01JQyk7CisJCQkJaWYgKCFza2IpIHsKKwkJCQkJU1RSUF9TVEFUU19JTkNSKHN0cnAtPnN0YXRzLnJ4X21lbV9mYWlsKTsKKwkJCQkJZGVzYy0+ZXJyb3IgPSAtRU5PTUVNOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJc2tiLT5sZW4gPSBoZWFkLT5sZW47CisJCQkJc2tiLT5kYXRhX2xlbiA9IGhlYWQtPmxlbjsKKwkJCQlza2ItPnRydWVzaXplID0gaGVhZC0+dHJ1ZXNpemU7CisJCQkJKl9zdHJwX3J4X21zZyhza2IpID0gKl9zdHJwX3J4X21zZyhoZWFkKTsKKwkJCQlzdHJwLT5yeF9za2JfbmV4dHAgPSAmaGVhZC0+bmV4dDsKKwkJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCA9IGhlYWQ7CisJCQkJc3RycC0+cnhfc2tiX2hlYWQgPSBza2I7CisJCQkJaGVhZCA9IHNrYjsKKwkJCX0gZWxzZSB7CisJCQkJc3RycC0+cnhfc2tiX25leHRwID0KKwkJCQkgICAgJnNrYl9zaGluZm8oaGVhZCktPmZyYWdfbGlzdDsKKwkJCX0KKwkJfQorCX0KKworCXdoaWxlIChlYXRlbiA8IG9yaWdfbGVuKSB7CisJCS8qIEFsd2F5cyBjbG9uZSBzaW5jZSB3ZSB3aWxsIGNvbnN1bWUgc29tZXRoaW5nICovCisJCXNrYiA9IHNrYl9jbG9uZShvcmlnX3NrYiwgR0ZQX0FUT01JQyk7CisJCWlmICghc2tiKSB7CisJCQlTVFJQX1NUQVRTX0lOQ1Ioc3RycC0+c3RhdHMucnhfbWVtX2ZhaWwpOworCQkJZGVzYy0+ZXJyb3IgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKworCQljYW5kX2xlbiA9IG9yaWdfbGVuIC0gZWF0ZW47CisKKwkJaGVhZCA9IHN0cnAtPnJ4X3NrYl9oZWFkOworCQlpZiAoIWhlYWQpIHsKKwkJCWhlYWQgPSBza2I7CisJCQlzdHJwLT5yeF9za2JfaGVhZCA9IGhlYWQ7CisJCQkvKiBXaWxsIHNldCByeF9za2JfbmV4dHAgb24gbmV4dCBwYWNrZXQgaWYgbmVlZGVkICovCisJCQlzdHJwLT5yeF9za2JfbmV4dHAgPSBOVUxMOworCQkJcnhtID0gX3N0cnBfcnhfbXNnKGhlYWQpOworCQkJbWVtc2V0KHJ4bSwgMCwgc2l6ZW9mKCpyeG0pKTsKKwkJCXJ4bS0+c3RycC5vZmZzZXQgPSBvcmlnX29mZnNldCArIGVhdGVuOworCQl9IGVsc2UgeworCQkJLyogVW5jbG9uZSBzaW5jZSB3ZSBtYXkgYmUgYXBwZW5kaW5nIHRvIGFuIHNrYiB0aGF0IHdlCisJCQkgKiBhbHJlYWR5IHNoYXJlIGEgZnJhZ19saXN0IHdpdGguCisJCQkgKi8KKwkJCWVyciA9IHNrYl91bmNsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoZXJyKSB7CisJCQkJU1RSUF9TVEFUU19JTkNSKHN0cnAtPnN0YXRzLnJ4X21lbV9mYWlsKTsKKwkJCQlkZXNjLT5lcnJvciA9IGVycjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcnhtID0gX3N0cnBfcnhfbXNnKGhlYWQpOworCQkJKnN0cnAtPnJ4X3NrYl9uZXh0cCA9IHNrYjsKKwkJCXN0cnAtPnJ4X3NrYl9uZXh0cCA9ICZza2ItPm5leHQ7CisJCQloZWFkLT5kYXRhX2xlbiArPSBza2ItPmxlbjsKKwkJCWhlYWQtPmxlbiArPSBza2ItPmxlbjsKKwkJCWhlYWQtPnRydWVzaXplICs9IHNrYi0+dHJ1ZXNpemU7CisJCX0KKworCQlpZiAoIXJ4bS0+c3RycC5mdWxsX2xlbikgeworCQkJc3NpemVfdCBsZW47CisKKwkJCWxlbiA9ICgqc3RycC0+Y2IucGFyc2VfbXNnKShzdHJwLCBoZWFkKTsKKworCQkJaWYgKCFsZW4pIHsKKwkJCQkvKiBOZWVkIG1vcmUgaGVhZGVyIHRvIGRldGVybWluZSBsZW5ndGggKi8KKwkJCQlpZiAoIXJ4bS0+YWNjdW1fbGVuKSB7CisJCQkJCS8qIFN0YXJ0IFJYIHRpbWVyIGZvciBuZXcgbWVzc2FnZSAqLworCQkJCQlzdHJwX3N0YXJ0X3J4X3RpbWVyKHN0cnApOworCQkJCX0KKwkJCQlyeG0tPmFjY3VtX2xlbiArPSBjYW5kX2xlbjsKKwkJCQllYXRlbiArPSBjYW5kX2xlbjsKKwkJCQlTVFJQX1NUQVRTX0lOQ1Ioc3RycC0+c3RhdHMucnhfbmVlZF9tb3JlX2hkcik7CisJCQkJV0FSTl9PTihlYXRlbiAhPSBvcmlnX2xlbik7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGxlbiA8IDApIHsKKwkJCQlpZiAobGVuID09IC1FU1RSUElQRSAmJiByeG0tPmFjY3VtX2xlbikgeworCQkJCQlsZW4gPSAtRU5PREFUQTsKKwkJCQkJc3RycC0+cnhfdW5yZWNvdl9pbnRyID0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlzdHJwLT5yeF9pbnRlcnJ1cHRlZCA9IDE7CisJCQkJfQorCQkJCXN0cnBfcGFyc2VyX2VycihzdHJwLCBlcnIsIGRlc2MpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChsZW4gPiBzdHJwLT5zay0+c2tfcmN2YnVmKSB7CisJCQkJLyogTWVzc2FnZSBsZW5ndGggZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgKi8KKwkJCQlTVFJQX1NUQVRTX0lOQ1Ioc3RycC0+c3RhdHMucnhfbXNnX3Rvb19iaWcpOworCQkJCXN0cnBfcGFyc2VyX2VycihzdHJwLCAtRU1TR1NJWkUsIGRlc2MpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChsZW4gPD0gKHNzaXplX3QpaGVhZC0+bGVuIC0KKwkJCQkJICBza2ItPmxlbiAtIHJ4bS0+c3RycC5vZmZzZXQpIHsKKwkJCQkvKiBMZW5ndGggbXVzdCBiZSBpbnRvIG5ldyBza2IgKGFuZCBhbHNvCisJCQkJICogZ3JlYXRlciB0aGFuIHplcm8pCisJCQkJICovCisJCQkJU1RSUF9TVEFUU19JTkNSKHN0cnAtPnN0YXRzLnJ4X2JhZF9oZHJfbGVuKTsKKwkJCQlzdHJwX3BhcnNlcl9lcnIoc3RycCwgLUVQUk9UTywgZGVzYyk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXJ4bS0+c3RycC5mdWxsX2xlbiA9IGxlbjsKKwkJfQorCisJCWV4dHJhID0gKHNzaXplX3QpKHJ4bS0+YWNjdW1fbGVuICsgY2FuZF9sZW4pIC0KKwkJCXJ4bS0+c3RycC5mdWxsX2xlbjsKKworCQlpZiAoZXh0cmEgPCAwKSB7CisJCQkvKiBNZXNzYWdlIG5vdCBjb21wbGV0ZSB5ZXQuICovCisJCQlpZiAocnhtLT5zdHJwLmZ1bGxfbGVuIC0gcnhtLT5hY2N1bV9sZW4gPgorCQkJICAgIHN0cnBfcGVla19sZW4oc3RycCkpIHsKKwkJCQkvKiBEb24ndCBoYXZlIHRoZSB3aG9sZSBtZXNzYWdlcyBpbiB0aGUgc29ja2V0CisJCQkJICogYnVmZmVyLiBTZXQgc3RycC0+cnhfbmVlZF9ieXRlcyB0byB3YWl0IGZvcgorCQkJCSAqIHRoZSByZXN0IG9mIHRoZSBtZXNzYWdlLiBBbHNvLCBzZXQgImVhcmx5CisJCQkJICogZWF0ZW4iIHNpbmNlIHdlJ3ZlIGFscmVhZHkgYnVmZmVyZWQgdGhlIHNrYgorCQkJCSAqIGJ1dCBkb24ndCBjb25zdW1lIHlldCBwZXIgc3RycF9yZWFkX3NvY2suCisJCQkJICovCisKKwkJCQlpZiAoIXJ4bS0+YWNjdW1fbGVuKSB7CisJCQkJCS8qIFN0YXJ0IFJYIHRpbWVyIGZvciBuZXcgbWVzc2FnZSAqLworCQkJCQlzdHJwX3N0YXJ0X3J4X3RpbWVyKHN0cnApOworCQkJCX0KKworCQkJCXN0cnAtPnJ4X25lZWRfYnl0ZXMgPSByeG0tPnN0cnAuZnVsbF9sZW4gLQorCQkJCQkJICAgICAgIHJ4bS0+YWNjdW1fbGVuOworCQkJCXJ4bS0+YWNjdW1fbGVuICs9IGNhbmRfbGVuOworCQkJCXJ4bS0+ZWFybHlfZWF0ZW4gPSBjYW5kX2xlbjsKKwkJCQlTVFJQX1NUQVRTX0FERChzdHJwLT5zdGF0cy5yeF9ieXRlcywgY2FuZF9sZW4pOworCQkJCWRlc2MtPmNvdW50ID0gMDsgLyogU3RvcCByZWFkaW5nIHNvY2tldCAqLworCQkJCWJyZWFrOworCQkJfQorCQkJcnhtLT5hY2N1bV9sZW4gKz0gY2FuZF9sZW47CisJCQllYXRlbiArPSBjYW5kX2xlbjsKKwkJCVdBUk5fT04oZWF0ZW4gIT0gb3JpZ19sZW4pOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBQb3NpdGl2ZSBleHRyYSBpbmRpY2F0ZXMgb3JlIGJ5dGVzIHRoYW4gbmVlZGVkIGZvciB0aGUKKwkJICogbWVzc2FnZQorCQkgKi8KKworCQlXQVJOX09OKGV4dHJhID4gY2FuZF9sZW4pOworCisJCWVhdGVuICs9IChjYW5kX2xlbiAtIGV4dHJhKTsKKworCQkvKiBIdXJyYXksIHdlIGhhdmUgYSBuZXcgbWVzc2FnZSEgKi8KKwkJZGVsX3RpbWVyKCZzdHJwLT5yeF9tc2dfdGltZXIpOworCQlzdHJwLT5yeF9za2JfaGVhZCA9IE5VTEw7CisJCVNUUlBfU1RBVFNfSU5DUihzdHJwLT5zdGF0cy5yeF9tc2dzKTsKKworCQkvKiBHaXZlIHNrYiB0byB1cHBlciBsYXllciAqLworCQlzdHJwLT5jYi5yY3ZfbXNnKHN0cnAsIGhlYWQpOworCisJCWlmICh1bmxpa2VseShzdHJwLT5yeF9wYXVzZWQpKSB7CisJCQkvKiBVcHBlciBsYXllciBwYXVzZWQgc3RycCAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoY2xvbmVkX29yaWcpCisJCWtmcmVlX3NrYihvcmlnX3NrYik7CisKKwlTVFJQX1NUQVRTX0FERChzdHJwLT5zdGF0cy5yeF9ieXRlcywgZWF0ZW4pOworCisJcmV0dXJuIGVhdGVuOworfQorCitzdGF0aWMgaW50IGRlZmF1bHRfcmVhZF9zb2NrX2RvbmUoc3RydWN0IHN0cnBhcnNlciAqc3RycCwgaW50IGVycikKK3sKKwlyZXR1cm4gZXJyOworfQorCisvKiBDYWxsZWQgd2l0aCBsb2NrIGhlbGQgb24gbG93ZXIgc29ja2V0ICovCitzdGF0aWMgaW50IHN0cnBfcmVhZF9zb2NrKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnApCit7CisJc3RydWN0IHNvY2tldCAqc29jayA9IHN0cnAtPnNrLT5za19zb2NrZXQ7CisJcmVhZF9kZXNjcmlwdG9yX3QgZGVzYzsKKworCWRlc2MuYXJnLmRhdGEgPSBzdHJwOworCWRlc2MuZXJyb3IgPSAwOworCWRlc2MuY291bnQgPSAxOyAvKiBnaXZlIG1vcmUgdGhhbiBvbmUgc2tiIHBlciBjYWxsICovCisKKwkvKiBzayBzaG91bGQgYmUgbG9ja2VkIGhlcmUsIHNvIG9rYXkgdG8gZG8gcmVhZF9zb2NrICovCisJc29jay0+b3BzLT5yZWFkX3NvY2soc3RycC0+c2ssICZkZXNjLCBzdHJwX3JlY3YpOworCisJZGVzYy5lcnJvciA9IHN0cnAtPmNiLnJlYWRfc29ja19kb25lKHN0cnAsIGRlc2MuZXJyb3IpOworCisJcmV0dXJuIGRlc2MuZXJyb3I7Cit9CisKKy8qIExvd2VyIHNvY2sgbG9jayBoZWxkICovCit2b2lkIHN0cnBfZGF0YV9yZWFkeShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKQoreworCWlmICh1bmxpa2VseShzdHJwLT5yeF9zdG9wcGVkKSkKKwkJcmV0dXJuOworCisJLyogVGhpcyBjaGVjayBpcyBuZWVkZWQgdG8gc3luY2hyb25pemUgd2l0aCBkb19zdHJwX3J4X3dvcmsuCisJICogZG9fc3RycF9yeF93b3JrIGFjcXVpcmVzIGEgcHJvY2VzcyBsb2NrIChsb2NrX3NvY2spIHdoZXJlYXMKKwkgKiB0aGUgbG9jayBoZWxkIGhlcmUgaXMgYmhfbG9ja19zb2NrLiBUaGUgdHdvIGxvY2tzIGNhbiBiZQorCSAqIGhlbGQgYnkgZGlmZmVyZW50IHRocmVhZHMgYXQgdGhlIHNhbWUgdGltZSwgYnV0IGJoX2xvY2tfc29jaworCSAqIGFsbG93cyBhIHRocmVhZCBpbiBCSCBjb250ZXh0IHRvIHNhZmVseSBjaGVjayBpZiB0aGUgcHJvY2VzcworCSAqIGxvY2sgaXMgaGVsZC4gSW4gdGhpcyBjYXNlLCBpZiB0aGUgbG9jayBpcyBoZWxkLCBxdWV1ZSB3b3JrLgorCSAqLworCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc3RycC0+c2spKSB7CisJCXF1ZXVlX3dvcmsoc3RycF93cSwgJnN0cnAtPnJ4X3dvcmspOworCQlyZXR1cm47CisJfQorCisJaWYgKHN0cnAtPnJ4X3BhdXNlZCkKKwkJcmV0dXJuOworCisJaWYgKHN0cnAtPnJ4X25lZWRfYnl0ZXMpIHsKKwkJaWYgKHN0cnBfcGVla19sZW4oc3RycCkgPj0gc3RycC0+cnhfbmVlZF9ieXRlcykKKwkJCXN0cnAtPnJ4X25lZWRfYnl0ZXMgPSAwOworCQllbHNlCisJCQlyZXR1cm47CisJfQorCisJaWYgKHN0cnBfcmVhZF9zb2NrKHN0cnApID09IC1FTk9NRU0pCisJCXF1ZXVlX3dvcmsoc3RycF93cSwgJnN0cnAtPnJ4X3dvcmspOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3RycF9kYXRhX3JlYWR5KTsKKworc3RhdGljIHZvaWQgZG9fc3RycF9yeF93b3JrKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnApCit7CisJcmVhZF9kZXNjcmlwdG9yX3QgcmRfZGVzYzsKKwlzdHJ1Y3Qgc29jayAqY3NrID0gc3RycC0+c2s7CisKKwkvKiBXZSBuZWVkIHRoZSByZWFkIGxvY2sgdG8gc3luY2hyb25pemUgd2l0aCBzdHJwX2RhdGFfcmVhZHkuIFdlCisJICogbmVlZCB0aGUgc29ja2V0IGxvY2sgZm9yIGNhbGxpbmcgc3RycF9yZWFkX3NvY2suCisJICovCisJbG9ja19zb2NrKGNzayk7CisKKwlpZiAodW5saWtlbHkoc3RycC0+cnhfc3RvcHBlZCkpCisJCWdvdG8gb3V0OworCisJaWYgKHN0cnAtPnJ4X3BhdXNlZCkKKwkJZ290byBvdXQ7CisKKwlyZF9kZXNjLmFyZy5kYXRhID0gc3RycDsKKworCWlmIChzdHJwX3JlYWRfc29jayhzdHJwKSA9PSAtRU5PTUVNKQorCQlxdWV1ZV93b3JrKHN0cnBfd3EsICZzdHJwLT5yeF93b3JrKTsKKworb3V0OgorCXJlbGVhc2Vfc29jayhjc2spOworfQorCitzdGF0aWMgdm9pZCBzdHJwX3J4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3KQoreworCWRvX3N0cnBfcnhfd29yayhjb250YWluZXJfb2Yodywgc3RydWN0IHN0cnBhcnNlciwgcnhfd29yaykpOworfQorCitzdGF0aWMgdm9pZCBzdHJwX3J4X21zZ190aW1lb3V0KHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzdHJwYXJzZXIgKnN0cnAgPSAoc3RydWN0IHN0cnBhcnNlciAqKWFyZzsKKworCS8qIE1lc3NhZ2UgYXNzZW1ibHkgdGltZWQgb3V0ICovCisJU1RSUF9TVEFUU19JTkNSKHN0cnAtPnN0YXRzLnJ4X21zZ190aW1lb3V0cyk7CisJbG9ja19zb2NrKHN0cnAtPnNrKTsKKwlzdHJwLT5jYi5hYm9ydF9wYXJzZXIoc3RycCwgRVRJTUVET1VUKTsKKwlyZWxlYXNlX3NvY2soc3RycC0+c2spOworfQorCitpbnQgc3RycF9pbml0KHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBzb2NrICpjc2ssCisJICAgICAgc3RydWN0IHN0cnBfY2FsbGJhY2tzICpjYikKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gY3NrLT5za19zb2NrZXQ7CisKKwlpZiAoIWNiIHx8ICFjYi0+cmN2X21zZyB8fCAhY2ItPnBhcnNlX21zZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXNvY2stPm9wcy0+cmVhZF9zb2NrIHx8ICFzb2NrLT5vcHMtPnBlZWtfbGVuKQorCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKKworCW1lbXNldChzdHJwLCAwLCBzaXplb2YoKnN0cnApKTsKKworCXN0cnAtPnNrID0gY3NrOworCisJc2V0dXBfdGltZXIoJnN0cnAtPnJ4X21zZ190aW1lciwgc3RycF9yeF9tc2dfdGltZW91dCwKKwkJICAgICh1bnNpZ25lZCBsb25nKXN0cnApOworCisJSU5JVF9XT1JLKCZzdHJwLT5yeF93b3JrLCBzdHJwX3J4X3dvcmspOworCisJc3RycC0+Y2IucmN2X21zZyA9IGNiLT5yY3ZfbXNnOworCXN0cnAtPmNiLnBhcnNlX21zZyA9IGNiLT5wYXJzZV9tc2c7CisJc3RycC0+Y2IucmVhZF9zb2NrX2RvbmUgPSBjYi0+cmVhZF9zb2NrX2RvbmUgPyA6IGRlZmF1bHRfcmVhZF9zb2NrX2RvbmU7CisJc3RycC0+Y2IuYWJvcnRfcGFyc2VyID0gY2ItPmFib3J0X3BhcnNlciA/IDogc3RycF9hYm9ydF9yeF9zdHJwOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzdHJwX2luaXQpOworCit2b2lkIHN0cnBfdW5wYXVzZShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKQoreworCXN0cnAtPnJ4X3BhdXNlZCA9IDA7CisKKwkvKiBTeW5jIHNldHRpbmcgcnhfcGF1c2VkIHdpdGggUlggd29yayAqLworCXNtcF9tYigpOworCisJcXVldWVfd29yayhzdHJwX3dxLCAmc3RycC0+cnhfd29yayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzdHJwX3VucGF1c2UpOworCisvKiBzdHJwIG11c3QgYWxyZWFkeSBiZSBzdG9wcGVkIHNvIHRoYXQgc3RycF9yZWN2IHdpbGwgbm8gbG9uZ2VyIGJlIGNhbGxlZC4KKyAqIE5vdGUgdGhhdCBzdHJwX2RvbmUgaXMgbm90IGNhbGxlZCB3aXRoIHRoZSBsb3dlciBzb2NrZXQgaGVsZC4KKyAqLwordm9pZCBzdHJwX2RvbmUoc3RydWN0IHN0cnBhcnNlciAqc3RycCkKK3sKKwlXQVJOX09OKCFzdHJwLT5yeF9zdG9wcGVkKTsKKworCWRlbF90aW1lcl9zeW5jKCZzdHJwLT5yeF9tc2dfdGltZXIpOworCWNhbmNlbF93b3JrX3N5bmMoJnN0cnAtPnJ4X3dvcmspOworCisJaWYgKHN0cnAtPnJ4X3NrYl9oZWFkKSB7CisJCWtmcmVlX3NrYihzdHJwLT5yeF9za2JfaGVhZCk7CisJCXN0cnAtPnJ4X3NrYl9oZWFkID0gTlVMTDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzdHJwX2RvbmUpOworCit2b2lkIHN0cnBfc3RvcChzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKQoreworCXN0cnAtPnJ4X3N0b3BwZWQgPSAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3RycF9zdG9wKTsKKwordm9pZCBzdHJwX2NoZWNrX3JjdihzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKQoreworCXF1ZXVlX3dvcmsoc3RycF93cSwgJnN0cnAtPnJ4X3dvcmspOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3RycF9jaGVja19yY3YpOworCitzdGF0aWMgaW50IF9faW5pdCBzdHJwX21vZF9pbml0KHZvaWQpCit7CisJc3RycF93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrc3RycCIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzdHJwX21vZF9leGl0KHZvaWQpCit7Cit9Cittb2R1bGVfaW5pdChzdHJwX21vZF9pbml0KTsKK21vZHVsZV9leGl0KHN0cnBfbW9kX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jCmluZGV4IDFkMjgxODEuLmQ4NTgyMDIgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKQEAgLTU2OSw5ICs1NjksMTAgQEAKIAlzdHJ1Y3QgcnNjICpmb3VuZDsKIAogCW1lbXNldCgmcnNjaSwgMCwgc2l6ZW9mKHJzY2kpKTsKLQlyc2NpLmhhbmRsZS5kYXRhID0gaGFuZGxlLT5kYXRhOwotCXJzY2kuaGFuZGxlLmxlbiA9IGhhbmRsZS0+bGVuOworCWlmIChkdXBfdG9fbmV0b2JqKCZyc2NpLmhhbmRsZSwgaGFuZGxlLT5kYXRhLCBoYW5kbGUtPmxlbikpCisJCXJldHVybiBOVUxMOwogCWZvdW5kID0gcnNjX2xvb2t1cChjZCwgJnJzY2kpOworCXJzY19mcmVlKCZyc2NpKTsKIAlpZiAoIWZvdW5kKQogCQlyZXR1cm4gTlVMTDsKIAlpZiAoY2FjaGVfY2hlY2soY2QsICZmb3VuZC0+aCwgTlVMTCkpCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2NsbnQuYyBiL25ldC9zdW5ycGMvY2xudC5jCmluZGV4IDdmNzlmYjcuLjY2ZjIzYjMgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvY2xudC5jCisrKyBiL25ldC9zdW5ycGMvY2xudC5jCkBAIC00NTMsNyArNDUzLDcgQEAKIAlzdHJ1Y3QgcnBjX3hwcnRfc3dpdGNoICp4cHM7CiAKIAlpZiAoYXJncy0+YmNfeHBydCAmJiBhcmdzLT5iY194cHJ0LT54cHRfYmNfeHBzKSB7Ci0JCVdBUk5fT04oYXJncy0+cHJvdG9jb2wgIT0gWFBSVF9UUkFOU1BPUlRfQkNfVENQKTsKKwkJV0FSTl9PTl9PTkNFKCEoYXJncy0+cHJvdG9jb2wgJiBYUFJUX1RSQU5TUE9SVF9CQykpOwogCQl4cHMgPSBhcmdzLT5iY194cHJ0LT54cHRfYmNfeHBzOwogCQl4cHJ0X3N3aXRjaF9nZXQoeHBzKTsKIAl9IGVsc2UgewpAQCAtNTIwLDcgKzUyMCw3IEBACiAJY2hhciBzZXJ2ZXJuYW1lWzQ4XTsKIAogCWlmIChhcmdzLT5iY194cHJ0KSB7Ci0JCVdBUk5fT04oYXJncy0+cHJvdG9jb2wgIT0gWFBSVF9UUkFOU1BPUlRfQkNfVENQKTsKKwkJV0FSTl9PTl9PTkNFKCEoYXJncy0+cHJvdG9jb2wgJiBYUFJUX1RSQU5TUE9SVF9CQykpOwogCQl4cHJ0ID0gYXJncy0+YmNfeHBydC0+eHB0X2JjX3hwcnQ7CiAJCWlmICh4cHJ0KSB7CiAJCQl4cHJ0X2dldCh4cHJ0KTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydHJkbWEvdmVyYnMuYyBiL25ldC9zdW5ycGMveHBydHJkbWEvdmVyYnMuYwppbmRleCA1MzZkMGJlLi43OTljY2U2IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRyZG1hL3ZlcmJzLmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS92ZXJicy5jCkBAIC01MSw2ICs1MSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2FkZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjX3JkbWEuaD4KICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+IC8qIHRyeV9tb2R1bGVfZ2V0KCkvbW9kdWxlX3B1dCgpICovCiAKQEAgLTkyMyw3ICs5MjQsNyBAQAogCX0KIAogCUlOSVRfTElTVF9IRUFEKCZidWYtPnJiX3JlY3ZfYnVmcyk7Ci0JZm9yIChpID0gMDsgaSA8IGJ1Zi0+cmJfbWF4X3JlcXVlc3RzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgYnVmLT5yYl9tYXhfcmVxdWVzdHMgKyBSUENSRE1BX01BWF9CQ19SRVFVRVNUUzsgaSsrKSB7CiAJCXN0cnVjdCBycGNyZG1hX3JlcCAqcmVwOwogCiAJCXJlcCA9IHJwY3JkbWFfY3JlYXRlX3JlcChyX3hwcnQpOwpAQCAtMTAxOCw2ICsxMDE5LDcgQEAKIAkJcmVwID0gcnBjcmRtYV9idWZmZXJfZ2V0X3JlcF9sb2NrZWQoYnVmKTsKIAkJcnBjcmRtYV9kZXN0cm95X3JlcChpYSwgcmVwKTsKIAl9CisJYnVmLT5yYl9zZW5kX2NvdW50ID0gMDsKIAogCXNwaW5fbG9jaygmYnVmLT5yYl9yZXFzbG9jayk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZidWYtPnJiX2FsbHJlcXMpKSB7CkBAIC0xMDMyLDYgKzEwMzQsNyBAQAogCQlzcGluX2xvY2soJmJ1Zi0+cmJfcmVxc2xvY2spOwogCX0KIAlzcGluX3VubG9jaygmYnVmLT5yYl9yZXFzbG9jayk7CisJYnVmLT5yYl9yZWN2X2NvdW50ID0gMDsKIAogCXJwY3JkbWFfZGVzdHJveV9tcnMoYnVmKTsKIH0KQEAgLTEwNzQsOCArMTA3NywyNyBAQAogCXNwaW5fdW5sb2NrKCZidWYtPnJiX213bG9jayk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcnBjcmRtYV9yZXAgKgorcnBjcmRtYV9idWZmZXJfZ2V0X3JlcChzdHJ1Y3QgcnBjcmRtYV9idWZmZXIgKmJ1ZmZlcnMpCit7CisJLyogSWYgYW4gUlBDIHByZXZpb3VzbHkgY29tcGxldGVkIHdpdGhvdXQgYSByZXBseSAoc2F5LCBhCisJICogY3JlZGVudGlhbCBwcm9ibGVtIG9yIGEgc29mdCB0aW1lb3V0IG9jY3VycykgdGhlbiBob2xkIG9mZgorCSAqIG9uIHN1cHBseWluZyBtb3JlIFJlY2VpdmUgYnVmZmVycyB1bnRpbCB0aGUgbnVtYmVyIG9mIG5ldworCSAqIHBlbmRpbmcgUlBDcyBjYXRjaGVzIHVwIHRvIHRoZSBudW1iZXIgb2YgcG9zdGVkIFJlY2VpdmVzLgorCSAqLworCWlmICh1bmxpa2VseShidWZmZXJzLT5yYl9zZW5kX2NvdW50IDwgYnVmZmVycy0+cmJfcmVjdl9jb3VudCkpCisJCXJldHVybiBOVUxMOworCisJaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJmJ1ZmZlcnMtPnJiX3JlY3ZfYnVmcykpKQorCQlyZXR1cm4gTlVMTDsKKwlidWZmZXJzLT5yYl9yZWN2X2NvdW50Kys7CisJcmV0dXJuIHJwY3JkbWFfYnVmZmVyX2dldF9yZXBfbG9ja2VkKGJ1ZmZlcnMpOworfQorCiAvKgogICogR2V0IGEgc2V0IG9mIHJlcXVlc3QvcmVwbHkgYnVmZmVycy4KKyAqCisgKiBSZXBseSBidWZmZXIgKGlmIGF2YWlsYWJsZSkgaXMgYXR0YWNoZWQgdG8gc2VuZCBidWZmZXIgdXBvbiByZXR1cm4uCiAgKi8KIHN0cnVjdCBycGNyZG1hX3JlcSAqCiBycGNyZG1hX2J1ZmZlcl9nZXQoc3RydWN0IHJwY3JkbWFfYnVmZmVyICpidWZmZXJzKQpAQCAtMTA4NSwyMSArMTEwNywxNSBAQAogCXNwaW5fbG9jaygmYnVmZmVycy0+cmJfbG9jayk7CiAJaWYgKGxpc3RfZW1wdHkoJmJ1ZmZlcnMtPnJiX3NlbmRfYnVmcykpCiAJCWdvdG8gb3V0X3JlcWJ1ZjsKKwlidWZmZXJzLT5yYl9zZW5kX2NvdW50Kys7CiAJcmVxID0gcnBjcmRtYV9idWZmZXJfZ2V0X3JlcV9sb2NrZWQoYnVmZmVycyk7Ci0JaWYgKGxpc3RfZW1wdHkoJmJ1ZmZlcnMtPnJiX3JlY3ZfYnVmcykpCi0JCWdvdG8gb3V0X3JlcGJ1ZjsKLQlyZXEtPnJsX3JlcGx5ID0gcnBjcmRtYV9idWZmZXJfZ2V0X3JlcF9sb2NrZWQoYnVmZmVycyk7CisJcmVxLT5ybF9yZXBseSA9IHJwY3JkbWFfYnVmZmVyX2dldF9yZXAoYnVmZmVycyk7CiAJc3Bpbl91bmxvY2soJmJ1ZmZlcnMtPnJiX2xvY2spOwogCXJldHVybiByZXE7CiAKIG91dF9yZXFidWY6CiAJc3Bpbl91bmxvY2soJmJ1ZmZlcnMtPnJiX2xvY2spOwotCXByX3dhcm4oInJwY3JkbWE6IG91dCBvZiByZXF1ZXN0IGJ1ZmZlcnMgKCVwKVxuIiwgYnVmZmVycyk7Ci0JcmV0dXJuIE5VTEw7Ci1vdXRfcmVwYnVmOgotCWxpc3RfYWRkKCZyZXEtPnJsX2ZyZWUsICZidWZmZXJzLT5yYl9zZW5kX2J1ZnMpOwotCXNwaW5fdW5sb2NrKCZidWZmZXJzLT5yYl9sb2NrKTsKLQlwcl93YXJuKCJycGNyZG1hOiBvdXQgb2YgcmVwbHkgYnVmZmVycyAoJXApXG4iLCBidWZmZXJzKTsKKwlwcl93YXJuKCJSUEM6ICAgICAgICVzOiBvdXQgb2YgcmVxdWVzdCBidWZmZXJzXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTExMTcsOSArMTEzMywxMiBAQAogCXJlcS0+cmxfcmVwbHkgPSBOVUxMOwogCiAJc3Bpbl9sb2NrKCZidWZmZXJzLT5yYl9sb2NrKTsKKwlidWZmZXJzLT5yYl9zZW5kX2NvdW50LS07CiAJbGlzdF9hZGRfdGFpbCgmcmVxLT5ybF9mcmVlLCAmYnVmZmVycy0+cmJfc2VuZF9idWZzKTsKLQlpZiAocmVwKQorCWlmIChyZXApIHsKKwkJYnVmZmVycy0+cmJfcmVjdl9jb3VudC0tOwogCQlsaXN0X2FkZF90YWlsKCZyZXAtPnJyX2xpc3QsICZidWZmZXJzLT5yYl9yZWN2X2J1ZnMpOworCX0KIAlzcGluX3VubG9jaygmYnVmZmVycy0+cmJfbG9jayk7CiB9CiAKQEAgLTExMzMsOCArMTE1Miw3IEBACiAJc3RydWN0IHJwY3JkbWFfYnVmZmVyICpidWZmZXJzID0gcmVxLT5ybF9idWZmZXI7CiAKIAlzcGluX2xvY2soJmJ1ZmZlcnMtPnJiX2xvY2spOwotCWlmICghbGlzdF9lbXB0eSgmYnVmZmVycy0+cmJfcmVjdl9idWZzKSkKLQkJcmVxLT5ybF9yZXBseSA9IHJwY3JkbWFfYnVmZmVyX2dldF9yZXBfbG9ja2VkKGJ1ZmZlcnMpOworCXJlcS0+cmxfcmVwbHkgPSBycGNyZG1hX2J1ZmZlcl9nZXRfcmVwKGJ1ZmZlcnMpOwogCXNwaW5fdW5sb2NrKCZidWZmZXJzLT5yYl9sb2NrKTsKIH0KIApAQCAtMTE0OCw2ICsxMTY2LDcgQEAKIAlzdHJ1Y3QgcnBjcmRtYV9idWZmZXIgKmJ1ZmZlcnMgPSAmcmVwLT5ycl9yeHBydC0+cnhfYnVmOwogCiAJc3Bpbl9sb2NrKCZidWZmZXJzLT5yYl9sb2NrKTsKKwlidWZmZXJzLT5yYl9yZWN2X2NvdW50LS07CiAJbGlzdF9hZGRfdGFpbCgmcmVwLT5ycl9saXN0LCAmYnVmZmVycy0+cmJfcmVjdl9idWZzKTsKIAlzcGluX3VubG9jaygmYnVmZmVycy0+cmJfbG9jayk7CiB9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hwcnRyZG1hL3hwcnRfcmRtYS5oIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS94cHJ0X3JkbWEuaAppbmRleCA2NzBmYWQ1Li5hNzFiMGY1IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRyZG1hL3hwcnRfcmRtYS5oCisrKyBiL25ldC9zdW5ycGMveHBydHJkbWEveHBydF9yZG1hLmgKQEAgLTMyMSw2ICszMjEsNyBAQAogCWNoYXIJCQkqcmJfcG9vbDsKIAogCXNwaW5sb2NrX3QJCXJiX2xvY2s7CS8qIHByb3RlY3QgYnVmIGxpc3RzICovCisJaW50CQkJcmJfc2VuZF9jb3VudCwgcmJfcmVjdl9jb3VudDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXJiX3NlbmRfYnVmczsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXJiX3JlY3ZfYnVmczsKIAl1MzIJCQlyYl9tYXhfcmVxdWVzdHM7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hwcnRzb2NrLmMgYi9uZXQvc3VucnBjL3hwcnRzb2NrLmMKaW5kZXggOGVkZTNiYy4uYmYxNjg4MyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy94cHJ0c29jay5jCisrKyBiL25ldC9zdW5ycGMveHBydHNvY2suYwpAQCAtMTA3NCw3ICsxMDc0LDcgQEAKIAkJc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIDAsIDEsICZlcnIpOwogCQlpZiAoc2tiICE9IE5VTEwpIHsKIAkJCXhzX3VkcF9kYXRhX3JlYWRfc2tiKCZ0cmFuc3BvcnQtPnhwcnQsIHNrLCBza2IpOwotCQkJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CisJCQlza2JfZnJlZV9kYXRhZ3JhbV9sb2NrZWQoc2ssIHNrYik7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChYUFJUX1NPQ0tfREFUQV9SRUFEWSwgJnRyYW5zcG9ydC0+c29ja19zdGF0ZSkpCmRpZmYgLS1naXQgYS9uZXQvc3dpdGNoZGV2L3N3aXRjaGRldi5jIGIvbmV0L3N3aXRjaGRldi9zd2l0Y2hkZXYuYwppbmRleCBhNWZjOWRkLi4wMmJlYjM1IDEwMDY0NAotLS0gYS9uZXQvc3dpdGNoZGV2L3N3aXRjaGRldi5jCisrKyBiL25ldC9zd2l0Y2hkZXYvc3dpdGNoZGV2LmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+Ci0jaW5jbHVkZSA8bmV0L2lwX2ZpYi5oPgogI2luY2x1ZGUgPG5ldC9zd2l0Y2hkZXYuaD4KIAogLyoqCkBAIC0zNDQsOCArMzQzLDYgQEAKIAlzd2l0Y2ggKG9iai0+aWQpIHsKIAljYXNlIFNXSVRDSERFVl9PQkpfSURfUE9SVF9WTEFOOgogCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfdmxhbik7Ci0JY2FzZSBTV0lUQ0hERVZfT0JKX0lEX0lQVjRfRklCOgotCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliKTsKIAljYXNlIFNXSVRDSERFVl9PQkpfSURfUE9SVF9GREI6CiAJCXJldHVybiBzaXplb2Yoc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIpOwogCWNhc2UgU1dJVENIREVWX09CSl9JRF9QT1JUX01EQjoKQEAgLTEwNDIsNyArMTAzOSw3IEBACiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IG5kbXNnICpuZG07CiAKLQlpZiAoZHVtcC0+aWR4IDwgZHVtcC0+Y2ItPmFyZ3NbMF0pCisJaWYgKGR1bXAtPmlkeCA8IGR1bXAtPmNiLT5hcmdzWzJdKQogCQlnb3RvIHNraXA7CiAKIAlubGggPSBubG1zZ19wdXQoZHVtcC0+c2tiLCBwb3J0aWQsIHNlcSwgUlRNX05FV05FSUdILApAQCAtMTA4OSw3ICsxMDg2LDcgQEAKICAqLwogaW50IHN3aXRjaGRldl9wb3J0X2ZkYl9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpmaWx0ZXJfZGV2LCBpbnQgaWR4KQorCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpmaWx0ZXJfZGV2LCBpbnQgKmlkeCkKIHsKIAlzdHJ1Y3Qgc3dpdGNoZGV2X2ZkYl9kdW1wIGR1bXAgPSB7CiAJCS5mZGIub2JqLm9yaWdfZGV2ID0gZGV2LApAQCAtMTA5NywyMDcgKzEwOTQsMjcgQEAKIAkJLmRldiA9IGRldiwKIAkJLnNrYiA9IHNrYiwKIAkJLmNiID0gY2IsCi0JCS5pZHggPSBpZHgsCisJCS5pZHggPSAqaWR4LAogCX07CiAJaW50IGVycjsKIAogCWVyciA9IHN3aXRjaGRldl9wb3J0X29ial9kdW1wKGRldiwgJmR1bXAuZmRiLm9iaiwKIAkJCQkgICAgICBzd2l0Y2hkZXZfcG9ydF9mZGJfZHVtcF9jYik7Ci0JY2ItPmFyZ3NbMV0gPSBlcnI7Ci0JcmV0dXJuIGR1bXAuaWR4OworCSppZHggPSBkdW1wLmlkeDsKKwlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3dpdGNoZGV2X3BvcnRfZmRiX2R1bXApOwogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnN3aXRjaGRldl9nZXRfbG93ZXN0X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCWNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb3BzICpvcHMgPSBkZXYtPnN3aXRjaGRldl9vcHM7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmxvd2VyX2RldjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG9ydF9kZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKLQotCS8qIFJlY3VzaXZlbHkgc2VhcmNoIGRvd24gdW50aWwgd2UgZmluZCBhIHN3IHBvcnQgZGV2LgotCSAqIChBIHN3IHBvcnQgZGV2IHN1cHBvcnRzIHN3aXRjaGRldl9wb3J0X2F0dHJfZ2V0KS4KLQkgKi8KLQotCWlmIChvcHMgJiYgb3BzLT5zd2l0Y2hkZXZfcG9ydF9hdHRyX2dldCkKLQkJcmV0dXJuIGRldjsKLQotCW5ldGRldl9mb3JfZWFjaF9sb3dlcl9kZXYoZGV2LCBsb3dlcl9kZXYsIGl0ZXIpIHsKLQkJcG9ydF9kZXYgPSBzd2l0Y2hkZXZfZ2V0X2xvd2VzdF9kZXYobG93ZXJfZGV2KTsKLQkJaWYgKHBvcnRfZGV2KQotCQkJcmV0dXJuIHBvcnRfZGV2OwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnN3aXRjaGRldl9nZXRfZGV2X2J5X25ocyhzdHJ1Y3QgZmliX2luZm8gKmZpKQotewotCXN0cnVjdCBzd2l0Y2hkZXZfYXR0ciBhdHRyID0gewotCQkuaWQgPSBTV0lUQ0hERVZfQVRUUl9JRF9QT1JUX1BBUkVOVF9JRCwKLQl9OwotCXN0cnVjdCBzd2l0Y2hkZXZfYXR0ciBwcmV2X2F0dHI7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7Ci0JaW50IG5oc2VsOwotCi0JQVNTRVJUX1JUTkwoKTsKLQotCS8qIEZvciB0aGlzIHJvdXRlLCBhbGwgbmV4dGhvcCBkZXZzIG11c3QgYmUgb24gdGhlIHNhbWUgc3dpdGNoLiAqLwotCi0JZm9yIChuaHNlbCA9IDA7IG5oc2VsIDwgZmktPmZpYl9uaHM7IG5oc2VsKyspIHsKLQkJY29uc3Qgc3RydWN0IGZpYl9uaCAqbmggPSAmZmktPmZpYl9uaFtuaHNlbF07Ci0KLQkJaWYgKCFuaC0+bmhfZGV2KQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJZGV2ID0gc3dpdGNoZGV2X2dldF9sb3dlc3RfZGV2KG5oLT5uaF9kZXYpOwotCQlpZiAoIWRldikKLQkJCXJldHVybiBOVUxMOwotCi0JCWF0dHIub3JpZ19kZXYgPSBkZXY7Ci0JCWlmIChzd2l0Y2hkZXZfcG9ydF9hdHRyX2dldChkZXYsICZhdHRyKSkKLQkJCXJldHVybiBOVUxMOwotCi0JCWlmIChuaHNlbCA+IDAgJiYKLQkJICAgICFuZXRkZXZfcGh5c19pdGVtX2lkX3NhbWUoJnByZXZfYXR0ci51LnBwaWQsICZhdHRyLnUucHBpZCkpCi0JCQkJcmV0dXJuIE5VTEw7Ci0KLQkJcHJldl9hdHRyID0gYXR0cjsKLQl9Ci0KLQlyZXR1cm4gZGV2OwotfQotCi0vKioKLSAqCXN3aXRjaGRldl9maWJfaXB2NF9hZGQgLSBBZGQvbW9kaWZ5IHN3aXRjaCBJUHY0IHJvdXRlIGVudHJ5Ci0gKgotICoJQGRzdDogcm91dGUncyBJUHY0IGRlc3RpbmF0aW9uIGFkZHJlc3MKLSAqCUBkc3RfbGVuOiBkZXN0aW5hdGlvbiBhZGRyZXNzIGxlbmd0aCAocHJlZml4IGxlbmd0aCkKLSAqCUBmaTogcm91dGUgRklCIGluZm8gc3RydWN0dXJlCi0gKglAdG9zOiByb3V0ZSBUT1MKLSAqCUB0eXBlOiByb3V0ZSB0eXBlCi0gKglAbmxmbGFnczogbmV0bGluayBmbGFncyBwYXNzZWQgaW4gKE5MTV9GXyopCi0gKglAdGJfaWQ6IHJvdXRlIHRhYmxlIElECi0gKgotICoJQWRkL21vZGlmeSBzd2l0Y2ggSVB2NCByb3V0ZSBlbnRyeS4KLSAqLwotaW50IHN3aXRjaGRldl9maWJfaXB2NF9hZGQodTMyIGRzdCwgaW50IGRzdF9sZW4sIHN0cnVjdCBmaWJfaW5mbyAqZmksCi0JCQkgICB1OCB0b3MsIHU4IHR5cGUsIHUzMiBubGZsYWdzLCB1MzIgdGJfaWQpCi17Ci0Jc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgaXB2NF9maWIgPSB7Ci0JCS5vYmouaWQgPSBTV0lUQ0hERVZfT0JKX0lEX0lQVjRfRklCLAotCQkuZHN0ID0gZHN0LAotCQkuZHN0X2xlbiA9IGRzdF9sZW4sCi0JCS5maSA9IGZpLAotCQkudG9zID0gdG9zLAotCQkudHlwZSA9IHR5cGUsCi0JCS5ubGZsYWdzID0gbmxmbGFncywKLQkJLnRiX2lkID0gdGJfaWQsCi0JfTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCWludCBlcnIgPSAwOwotCi0JLyogRG9uJ3Qgb2ZmbG9hZCByb3V0ZSBpZiB1c2luZyBjdXN0b20gaXAgcnVsZXMgb3IgaWYKLQkgKiBJUHY0IEZJQiBvZmZsb2FkaW5nIGhhcyBiZWVuIGRpc2FibGVkIGNvbXBsZXRlbHkuCi0JICovCi0KLSNpZmRlZiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTCi0JaWYgKGZpLT5maWJfbmV0LT5pcHY0LmZpYl9oYXNfY3VzdG9tX3J1bGVzKQotCQlyZXR1cm4gMDsKLSNlbmRpZgotCi0JaWYgKGZpLT5maWJfbmV0LT5pcHY0LmZpYl9vZmZsb2FkX2Rpc2FibGVkKQotCQlyZXR1cm4gMDsKLQotCWRldiA9IHN3aXRjaGRldl9nZXRfZGV2X2J5X25ocyhmaSk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiAwOwotCi0JaXB2NF9maWIub2JqLm9yaWdfZGV2ID0gZGV2OwotCWVyciA9IHN3aXRjaGRldl9wb3J0X29ial9hZGQoZGV2LCAmaXB2NF9maWIub2JqKTsKLQlpZiAoIWVycikKLQkJZmktPmZpYl9mbGFncyB8PSBSVE5IX0ZfT0ZGTE9BRDsKLQotCXJldHVybiBlcnIgPT0gLUVPUE5PVFNVUFAgPyAwIDogZXJyOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3dpdGNoZGV2X2ZpYl9pcHY0X2FkZCk7Ci0KLS8qKgotICoJc3dpdGNoZGV2X2ZpYl9pcHY0X2RlbCAtIERlbGV0ZSBJUHY0IHJvdXRlIGVudHJ5IGZyb20gc3dpdGNoCi0gKgotICoJQGRzdDogcm91dGUncyBJUHY0IGRlc3RpbmF0aW9uIGFkZHJlc3MKLSAqCUBkc3RfbGVuOiBkZXN0aW5hdGlvbiBhZGRyZXNzIGxlbmd0aCAocHJlZml4IGxlbmd0aCkKLSAqCUBmaTogcm91dGUgRklCIGluZm8gc3RydWN0dXJlCi0gKglAdG9zOiByb3V0ZSBUT1MKLSAqCUB0eXBlOiByb3V0ZSB0eXBlCi0gKglAdGJfaWQ6IHJvdXRlIHRhYmxlIElECi0gKgotICoJRGVsZXRlIElQdjQgcm91dGUgZW50cnkgZnJvbSBzd2l0Y2ggZGV2aWNlLgotICovCi1pbnQgc3dpdGNoZGV2X2ZpYl9pcHY0X2RlbCh1MzIgZHN0LCBpbnQgZHN0X2xlbiwgc3RydWN0IGZpYl9pbmZvICpmaSwKLQkJCSAgIHU4IHRvcywgdTggdHlwZSwgdTMyIHRiX2lkKQotewotCXN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliIGlwdjRfZmliID0gewotCQkub2JqLmlkID0gU1dJVENIREVWX09CSl9JRF9JUFY0X0ZJQiwKLQkJLmRzdCA9IGRzdCwKLQkJLmRzdF9sZW4gPSBkc3RfbGVuLAotCQkuZmkgPSBmaSwKLQkJLnRvcyA9IHRvcywKLQkJLnR5cGUgPSB0eXBlLAotCQkubmxmbGFncyA9IDAsCi0JCS50Yl9pZCA9IHRiX2lkLAotCX07Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlpbnQgZXJyID0gMDsKLQotCWlmICghKGZpLT5maWJfZmxhZ3MgJiBSVE5IX0ZfT0ZGTE9BRCkpCi0JCXJldHVybiAwOwotCi0JZGV2ID0gc3dpdGNoZGV2X2dldF9kZXZfYnlfbmhzKGZpKTsKLQlpZiAoIWRldikKLQkJcmV0dXJuIDA7Ci0KLQlpcHY0X2ZpYi5vYmoub3JpZ19kZXYgPSBkZXY7Ci0JZXJyID0gc3dpdGNoZGV2X3BvcnRfb2JqX2RlbChkZXYsICZpcHY0X2ZpYi5vYmopOwotCWlmICghZXJyKQotCQlmaS0+ZmliX2ZsYWdzICY9IH5SVE5IX0ZfT0ZGTE9BRDsKLQotCXJldHVybiBlcnIgPT0gLUVPUE5PVFNVUFAgPyAwIDogZXJyOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3dpdGNoZGV2X2ZpYl9pcHY0X2RlbCk7Ci0KLS8qKgotICoJc3dpdGNoZGV2X2ZpYl9pcHY0X2Fib3J0IC0gQWJvcnQgYW4gSVB2NCBGSUIgb3BlcmF0aW9uCi0gKgotICoJQGZpOiByb3V0ZSBGSUIgaW5mbyBzdHJ1Y3R1cmUKLSAqLwotdm9pZCBzd2l0Y2hkZXZfZmliX2lwdjRfYWJvcnQoc3RydWN0IGZpYl9pbmZvICpmaSkKLXsKLQkvKiBUaGVyZSB3YXMgYSBwcm9ibGVtIGluc3RhbGxpbmcgdGhpcyByb3V0ZSB0byB0aGUgb2ZmbG9hZAotCSAqIGRldmljZS4gIEZvciBub3csIHVudGlsIHdlIGNvbWUgdXAgd2l0aCBtb3JlIHJlZmluZWQKLQkgKiBwb2xpY3kgaGFuZGxpbmcsIGFicnVwdGx5IGVuZCBJUHY0IGZpYiBvZmZsb2FkaW5nIGZvcgotCSAqIGZvciBlbnRpcmUgbmV0IGJ5IGZsdXNoaW5nIG9mZmxvYWQgZGV2aWNlKHMpIG9mIGFsbAotCSAqIElQdjQgcm91dGVzLCBhbmQgbWFyayBJUHY0IGZpYiBvZmZsb2FkaW5nIGJyb2tlbiBmcm9tCi0JICogdGhpcyBwb2ludCBmb3J3YXJkLgotCSAqLwotCi0JZmliX2ZsdXNoX2V4dGVybmFsKGZpLT5maWJfbmV0KTsKLQlmaS0+ZmliX25ldC0+aXB2NC5maWJfb2ZmbG9hZF9kaXNhYmxlZCA9IHRydWU7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzd2l0Y2hkZXZfZmliX2lwdjRfYWJvcnQpOwotCiBib29sIHN3aXRjaGRldl9wb3J0X3NhbWVfcGFyZW50X2lkKHN0cnVjdCBuZXRfZGV2aWNlICphLAogCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpiKQogewogCXN0cnVjdCBzd2l0Y2hkZXZfYXR0ciBhX2F0dHIgPSB7CiAJCS5vcmlnX2RldiA9IGEsCiAJCS5pZCA9IFNXSVRDSERFVl9BVFRSX0lEX1BPUlRfUEFSRU5UX0lELAotCQkuZmxhZ3MgPSBTV0lUQ0hERVZfRl9OT19SRUNVUlNFLAogCX07CiAJc3RydWN0IHN3aXRjaGRldl9hdHRyIGJfYXR0ciA9IHsKIAkJLm9yaWdfZGV2ID0gYiwKIAkJLmlkID0gU1dJVENIREVWX0FUVFJfSURfUE9SVF9QQVJFTlRfSUQsCi0JCS5mbGFncyA9IFNXSVRDSERFVl9GX05PX1JFQ1VSU0UsCiAJfTsKIAogCWlmIChzd2l0Y2hkZXZfcG9ydF9hdHRyX2dldChhLCAmYV9hdHRyKSB8fApAQCAtMTMwNiw4OSArMTEyMyw0IEBACiAKIAlyZXR1cm4gbmV0ZGV2X3BoeXNfaXRlbV9pZF9zYW1lKCZhX2F0dHIudS5wcGlkLCAmYl9hdHRyLnUucHBpZCk7CiB9Ci0KLXN0YXRpYyB1MzIgc3dpdGNoZGV2X3BvcnRfZndkX21hcmtfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpncm91cF9kZXYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmxvd2VyX2RldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwotCi0JbmV0ZGV2X2Zvcl9lYWNoX2xvd2VyX2Rldihncm91cF9kZXYsIGxvd2VyX2RldiwgaXRlcikgewotCQlpZiAobG93ZXJfZGV2ID09IGRldikKLQkJCWNvbnRpbnVlOwotCQlpZiAoc3dpdGNoZGV2X3BvcnRfc2FtZV9wYXJlbnRfaWQoZGV2LCBsb3dlcl9kZXYpKQotCQkJcmV0dXJuIGxvd2VyX2Rldi0+b2ZmbG9hZF9md2RfbWFyazsKLQkJcmV0dXJuIHN3aXRjaGRldl9wb3J0X2Z3ZF9tYXJrX2dldChkZXYsIGxvd2VyX2Rldik7Ci0JfQotCi0JcmV0dXJuIGRldi0+aWZpbmRleDsKLX0KIEVYUE9SVF9TWU1CT0xfR1BMKHN3aXRjaGRldl9wb3J0X3NhbWVfcGFyZW50X2lkKTsKLQotc3RhdGljIHZvaWQgc3dpdGNoZGV2X3BvcnRfZndkX21hcmtfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmdyb3VwX2RldiwKLQkJCQkJICB1MzIgb2xkX21hcmssIHUzMiAqcmVzZXRfbWFyaykKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbG93ZXJfZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7Ci0KLQluZXRkZXZfZm9yX2VhY2hfbG93ZXJfZGV2KGdyb3VwX2RldiwgbG93ZXJfZGV2LCBpdGVyKSB7Ci0JCWlmIChsb3dlcl9kZXYtPm9mZmxvYWRfZndkX21hcmsgPT0gb2xkX21hcmspIHsKLQkJCWlmICghKnJlc2V0X21hcmspCi0JCQkJKnJlc2V0X21hcmsgPSBsb3dlcl9kZXYtPmlmaW5kZXg7Ci0JCQlsb3dlcl9kZXYtPm9mZmxvYWRfZndkX21hcmsgPSAqcmVzZXRfbWFyazsKLQkJfQotCQlzd2l0Y2hkZXZfcG9ydF9md2RfbWFya19yZXNldChsb3dlcl9kZXYsIG9sZF9tYXJrLCByZXNldF9tYXJrKTsKLQl9Ci19Ci0KLS8qKgotICoJc3dpdGNoZGV2X3BvcnRfZndkX21hcmtfc2V0IC0gU2V0IHBvcnQgb2ZmbG9hZCBmb3J3YXJkaW5nIG1hcmsKLSAqCi0gKglAZGV2OiBwb3J0IGRldmljZQotICoJQGdyb3VwX2RldjogY29udGFpbmluZyBkZXZpY2UKLSAqCUBqb2luaW5nOiB0cnVlIGlmIGRldiBpcyBqb2luaW5nIGdyb3VwOyBmYWxzZSBpZiBsZWF2aW5nIGdyb3VwCi0gKgotICoJQW4gdW5ncm91cGVkIHBvcnQncyBvZmZsb2FkIG1hcmsgaXMganVzdCBpdHMgaWZpbmRleC4gIEEgZ3JvdXBlZAotICoJcG9ydCdzIChtZW1iZXIgb2YgYSBicmlkZ2UsIGZvciBleGFtcGxlKSBvZmZsb2FkIG1hcmsgaXMgdGhlIGlmaW5kZXgKLSAqCW9mIG9uZSBvZiB0aGUgcG9ydHMgaW4gdGhlIGdyb3VwIHdpdGggdGhlIHNhbWUgcGFyZW50IChzd2l0Y2gpIElELgotICoJUG9ydHMgb24gdGhlIHNhbWUgZGV2aWNlIGluIHRoZSBzYW1lIGdyb3VwIHdpbGwgaGF2ZSB0aGUgc2FtZSBtYXJrLgotICoKLSAqCUV4YW1wbGU6Ci0gKgotICoJCWJyMAkJaWZpbmRleD05Ci0gKgkJICBzdzFwMQkJaWZpbmRleD0yCW1hcms9MgotICoJCSAgc3cxcDIJCWlmaW5kZXg9MwltYXJrPTIKLSAqCQkgIHN3MnAxCQlpZmluZGV4PTQJbWFyaz01Ci0gKgkJICBzdzJwMgkJaWZpbmRleD01CW1hcms9NQotICoKLSAqCUlmIHN3MnAyIGxlYXZlcyB0aGUgYnJpZGdlLCB3ZSdsbCBoYXZlOgotICoKLSAqCQlicjAJCWlmaW5kZXg9OQotICoJCSAgc3cxcDEJCWlmaW5kZXg9MgltYXJrPTIKLSAqCQkgIHN3MXAyCQlpZmluZGV4PTMJbWFyaz0yCi0gKgkJICBzdzJwMQkJaWZpbmRleD00CW1hcms9NAotICoJCXN3MnAyCQlpZmluZGV4PTUJbWFyaz01Ci0gKi8KLXZvaWQgc3dpdGNoZGV2X3BvcnRfZndkX21hcmtfc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpncm91cF9kZXYsCi0JCQkJIGJvb2wgam9pbmluZykKLXsKLQl1MzIgbWFyayA9IGRldi0+aWZpbmRleDsKLQl1MzIgcmVzZXRfbWFyayA9IDA7Ci0KLQlpZiAoZ3JvdXBfZGV2KSB7Ci0JCUFTU0VSVF9SVE5MKCk7Ci0JCWlmIChqb2luaW5nKQotCQkJbWFyayA9IHN3aXRjaGRldl9wb3J0X2Z3ZF9tYXJrX2dldChkZXYsIGdyb3VwX2Rldik7Ci0JCWVsc2UgaWYgKGRldi0+b2ZmbG9hZF9md2RfbWFyayA9PSBtYXJrKQotCQkJLyogT2hvaCwgdGhpcyBwb3J0IHdhcyB0aGUgbWFyayByZWZlcmVuY2UgcG9ydCwKLQkJCSAqIGJ1dCBpdCdzIGxlYXZpbmcgdGhlIGdyb3VwLCBzbyByZXNldCB0aGUKLQkJCSAqIG1hcmsgZm9yIHRoZSByZW1haW5pbmcgcG9ydHMgaW4gdGhlIGdyb3VwLgotCQkJICovCi0JCQlzd2l0Y2hkZXZfcG9ydF9md2RfbWFya19yZXNldChncm91cF9kZXYsIG1hcmssCi0JCQkJCQkgICAgICAmcmVzZXRfbWFyayk7Ci0JfQotCi0JZGV2LT5vZmZsb2FkX2Z3ZF9tYXJrID0gbWFyazsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHN3aXRjaGRldl9wb3J0X2Z3ZF9tYXJrX3NldCk7CmRpZmYgLS1naXQgYS9uZXQvc3lzY3RsX25ldC5jIGIvbmV0L3N5c2N0bF9uZXQuYwppbmRleCA0NmE3MWM3Li5lMGM3MWJkIDEwMDY0NAotLS0gYS9uZXQvc3lzY3RsX25ldC5jCisrKyBiL25ldC9zeXNjdGxfbmV0LmMKQEAgLTQyLDI2ICs0MiwzNyBAQAogCQkJICAgICAgIHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKQogewogCXN0cnVjdCBuZXQgKm5ldCA9IGNvbnRhaW5lcl9vZihoZWFkLT5zZXQsIHN0cnVjdCBuZXQsIHN5c2N0bHMpOwotCWt1aWRfdCByb290X3VpZCA9IG1ha2Vfa3VpZChuZXQtPnVzZXJfbnMsIDApOwotCWtnaWRfdCByb290X2dpZCA9IG1ha2Vfa2dpZChuZXQtPnVzZXJfbnMsIDApOwogCiAJLyogQWxsb3cgbmV0d29yayBhZG1pbmlzdHJhdG9yIHRvIGhhdmUgc2FtZSBhY2Nlc3MgYXMgcm9vdC4gKi8KLQlpZiAobnNfY2FwYWJsZV9ub2F1ZGl0KG5ldC0+dXNlcl9ucywgQ0FQX05FVF9BRE1JTikgfHwKLQkgICAgdWlkX2VxKHJvb3RfdWlkLCBjdXJyZW50X2V1aWQoKSkpIHsKKwlpZiAobnNfY2FwYWJsZV9ub2F1ZGl0KG5ldC0+dXNlcl9ucywgQ0FQX05FVF9BRE1JTikpIHsKIAkJaW50IG1vZGUgPSAodGFibGUtPm1vZGUgPj4gNikgJiA3OwogCQlyZXR1cm4gKG1vZGUgPDwgNikgfCAobW9kZSA8PCAzKSB8IG1vZGU7CiAJfQotCS8qIEFsbG93IG5ldG5zIHJvb3QgZ3JvdXAgdG8gaGF2ZSB0aGUgc2FtZSBhY2Nlc3MgYXMgdGhlIHJvb3QgZ3JvdXAgKi8KLQlpZiAoaW5fZWdyb3VwX3Aocm9vdF9naWQpKSB7Ci0JCWludCBtb2RlID0gKHRhYmxlLT5tb2RlID4+IDMpICYgNzsKLQkJcmV0dXJuIChtb2RlIDw8IDMpIHwgbW9kZTsKLQl9CisKIAlyZXR1cm4gdGFibGUtPm1vZGU7CiB9CiAKK3N0YXRpYyB2b2lkIG5ldF9jdGxfc2V0X293bmVyc2hpcChzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaGVhZCwKKwkJCQkgIHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLAorCQkJCSAga3VpZF90ICp1aWQsIGtnaWRfdCAqZ2lkKQoreworCXN0cnVjdCBuZXQgKm5ldCA9IGNvbnRhaW5lcl9vZihoZWFkLT5zZXQsIHN0cnVjdCBuZXQsIHN5c2N0bHMpOworCWt1aWRfdCBuc19yb290X3VpZDsKKwlrZ2lkX3QgbnNfcm9vdF9naWQ7CisKKwluc19yb290X3VpZCA9IG1ha2Vfa3VpZChuZXQtPnVzZXJfbnMsIDApOworCWlmICh1aWRfdmFsaWQobnNfcm9vdF91aWQpKQorCQkqdWlkID0gbnNfcm9vdF91aWQ7CisKKwluc19yb290X2dpZCA9IG1ha2Vfa2dpZChuZXQtPnVzZXJfbnMsIDApOworCWlmIChnaWRfdmFsaWQobnNfcm9vdF9naWQpKQorCQkqZ2lkID0gbnNfcm9vdF9naWQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX3Jvb3QgbmV0X3N5c2N0bF9yb290ID0gewogCS5sb29rdXAgPSBuZXRfY3RsX2hlYWRlcl9sb29rdXAsCiAJLnBlcm1pc3Npb25zID0gbmV0X2N0bF9wZXJtaXNzaW9ucywKKwkuc2V0X293bmVyc2hpcCA9IG5ldF9jdGxfc2V0X293bmVyc2hpcCwKIH07CiAKIHN0YXRpYyBpbnQgX19uZXRfaW5pdCBzeXNjdGxfbmV0X2luaXQoc3RydWN0IG5ldCAqbmV0KQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYmNhc3QuYyBiL25ldC90aXBjL2JjYXN0LmMKaW5kZXggYWU0NjliMy4uNzUzZjc3NCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvYmNhc3QuYworKysgYi9uZXQvdGlwYy9iY2FzdC5jCkBAIC0yNjksMTggKzI2OSwxOSBAQAogICoKICAqIFJDVSBpcyBsb2NrZWQsIG5vIG90aGVyIGxvY2tzIHNldAogICovCi12b2lkIHRpcGNfYmNhc3Rfc3luY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19saW5rICpsLAotCQkJIHN0cnVjdCB0aXBjX21zZyAqaGRyKQoraW50IHRpcGNfYmNhc3Rfc3luY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19saW5rICpsLAorCQkJc3RydWN0IHRpcGNfbXNnICpoZHIpCiB7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCAqaW5wdXRxID0gJnRpcGNfYmNfYmFzZShuZXQpLT5pbnB1dHE7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCB4bWl0cTsKKwlpbnQgcmMgPSAwOwogCiAJX19za2JfcXVldWVfaGVhZF9pbml0KCZ4bWl0cSk7CiAKIAl0aXBjX2JjYXN0X2xvY2sobmV0KTsKIAlpZiAobXNnX3R5cGUoaGRyKSA9PSBTVEFURV9NU0cpIHsKIAkJdGlwY19saW5rX2JjX2Fja19yY3YobCwgbXNnX2JjYXN0X2FjayhoZHIpLCAmeG1pdHEpOwotCQl0aXBjX2xpbmtfYmNfc3luY19yY3YobCwgaGRyLCAmeG1pdHEpOworCQlyYyA9IHRpcGNfbGlua19iY19zeW5jX3JjdihsLCBoZHIsICZ4bWl0cSk7CiAJfSBlbHNlIHsKIAkJdGlwY19saW5rX2JjX2luaXRfcmN2KGwsIGhkcik7CiAJfQpAQCAtMjkxLDYgKzI5Miw3IEBACiAJLyogQW55IHNvY2tldCB3YWtldXAgbWVzc2FnZXMgPyAqLwogCWlmICghc2tiX3F1ZXVlX2VtcHR5KGlucHV0cSkpCiAJCXRpcGNfc2tfcmN2KG5ldCwgaW5wdXRxKTsKKwlyZXR1cm4gcmM7CiB9CiAKIC8qIHRpcGNfYmNhc3RfYWRkX3BlZXIgLSBhZGQgYSBwZWVyIG5vZGUgdG8gYnJvYWRjYXN0IGxpbmsgYW5kIGJlYXJlcgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYmNhc3QuaCBiL25ldC90aXBjL2JjYXN0LmgKaW5kZXggZDVlNzliMy4uNWZmZTM0NCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvYmNhc3QuaAorKysgYi9uZXQvdGlwYy9iY2FzdC5oCkBAIC01Niw4ICs1Niw4IEBACiBpbnQgdGlwY19iY2FzdF94bWl0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCk7CiBpbnQgdGlwY19iY2FzdF9yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19saW5rICpsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHZvaWQgdGlwY19iY2FzdF9hY2tfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRpcGNfbGluayAqbCwgdTMyIGFja2VkKTsKLXZvaWQgdGlwY19iY2FzdF9zeW5jX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0aXBjX2xpbmsgKmwsCi0JCQkgc3RydWN0IHRpcGNfbXNnICpoZHIpOworaW50IHRpcGNfYmNhc3Rfc3luY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19saW5rICpsLAorCQkJc3RydWN0IHRpcGNfbXNnICpoZHIpOwogaW50IHRpcGNfbmxfYWRkX2JjX2xpbmsoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19ubF9tc2cgKm1zZyk7CiBpbnQgdGlwY19ubF9iY19saW5rX3NldChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBubGF0dHIgKmF0dHJzW10pOwogaW50IHRpcGNfYmNsaW5rX3Jlc2V0X3N0YXRzKHN0cnVjdCBuZXQgKm5ldCk7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iZWFyZXIuYyBiL25ldC90aXBjL2JlYXJlci5jCmluZGV4IDY1YjFiYmYuLjk3NWRiZWIgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2JlYXJlci5jCisrKyBiL25ldC90aXBjL2JlYXJlci5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSAibW9uaXRvci5oIgogI2luY2x1ZGUgImJjYXN0LmgiCiAjaW5jbHVkZSAibmV0bGluay5oIgorI2luY2x1ZGUgInVkcF9tZWRpYS5oIgogCiAjZGVmaW5lIE1BWF9BRERSX1NUUiA2MAogCkBAIC01Niw2ICs1NywxMyBAQAogCU5VTEwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgdGlwY19iZWFyZXIgKmJlYXJlcl9nZXQoc3RydWN0IG5ldCAqbmV0LCBpbnQgYmVhcmVyX2lkKQoreworCXN0cnVjdCB0aXBjX25ldCAqdG4gPSB0aXBjX25ldChuZXQpOworCisJcmV0dXJuIHJjdV9kZXJlZmVyZW5jZV9ydG5sKHRuLT5iZWFyZXJfbGlzdFtiZWFyZXJfaWRdKTsKK30KKwogc3RhdGljIHZvaWQgYmVhcmVyX2Rpc2FibGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIpOwogCiAvKioKQEAgLTMyMyw2ICszMzEsNyBAQAogCWItPmRvbWFpbiA9IGRpc2NfZG9tYWluOwogCWItPm5ldF9wbGFuZSA9IGJlYXJlcl9pZCArICdBJzsKIAliLT5wcmlvcml0eSA9IHByaW9yaXR5OworCXRlc3RfYW5kX3NldF9iaXRfbG9jaygwLCAmYi0+dXApOwogCiAJcmVzID0gdGlwY19kaXNjX2NyZWF0ZShuZXQsIGIsICZiLT5iY2FzdF9hZGRyLCAmc2tiKTsKIAlpZiAocmVzKSB7CkBAIC0zNjAsMTUgKzM2OSwyNCBAQAogICovCiB2b2lkIHRpcGNfYmVhcmVyX3Jlc2V0X2FsbChzdHJ1Y3QgbmV0ICpuZXQpCiB7Ci0Jc3RydWN0IHRpcGNfbmV0ICp0biA9IHRpcGNfbmV0KG5ldCk7CiAJc3RydWN0IHRpcGNfYmVhcmVyICpiOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKLQkJYiA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKHRuLT5iZWFyZXJfbGlzdFtpXSk7CisJCWIgPSBiZWFyZXJfZ2V0KG5ldCwgaSk7CisJCWlmIChiKQorCQkJY2xlYXJfYml0X3VubG9jaygwLCAmYi0+dXApOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JFQVJFUlM7IGkrKykgeworCQliID0gYmVhcmVyX2dldChuZXQsIGkpOwogCQlpZiAoYikKIAkJCXRpcGNfcmVzZXRfYmVhcmVyKG5ldCwgYik7CiAJfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfQkVBUkVSUzsgaSsrKSB7CisJCWIgPSBiZWFyZXJfZ2V0KG5ldCwgaSk7CisJCWlmIChiKQorCQkJdGVzdF9hbmRfc2V0X2JpdF9sb2NrKDAsICZiLT51cCk7CisJfQogfQogCiAvKioKQEAgLTM4Miw4ICs0MDAsOSBAQAogCWludCBiZWFyZXJfaWQgPSBiLT5pZGVudGl0eTsKIAogCXByX2luZm8oIkRpc2FibGluZyBiZWFyZXIgPCVzPlxuIiwgYi0+bmFtZSk7Ci0JYi0+bWVkaWEtPmRpc2FibGVfbWVkaWEoYik7CisJY2xlYXJfYml0X3VubG9jaygwLCAmYi0+dXApOwogCXRpcGNfbm9kZV9kZWxldGVfbGlua3MobmV0LCBiZWFyZXJfaWQpOworCWItPm1lZGlhLT5kaXNhYmxlX21lZGlhKGIpOwogCVJDVV9JTklUX1BPSU5URVIoYi0+bWVkaWFfcHRyLCBOVUxMKTsKIAlpZiAoYi0+bGlua19yZXEpCiAJCXRpcGNfZGlzY19kZWxldGUoYi0+bGlua19yZXEpOwpAQCAtNDQwLDIyICs0NTksMTYgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCWludCBkZWx0YTsKLQl2b2lkICp0aXBjX3B0cjsKIAogCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXJjdV9kZXJlZmVyZW5jZV9ydG5sKGItPm1lZGlhX3B0cik7CiAJaWYgKCFkZXYpCiAJCXJldHVybiAwOwogCi0JLyogU2VuZCBSRVNFVCBtZXNzYWdlIGV2ZW4gaWYgYmVhcmVyIGlzIGRldGFjaGVkIGZyb20gZGV2aWNlICovCi0JdGlwY19wdHIgPSByY3VfZGVyZWZlcmVuY2VfcnRubChkZXYtPnRpcGNfcHRyKTsKLQlpZiAodW5saWtlbHkoIXRpcGNfcHRyICYmICFtc2dfaXNfcmVzZXQoYnVmX21zZyhza2IpKSkpCi0JCWdvdG8gZHJvcDsKLQotCWRlbHRhID0gZGV2LT5oYXJkX2hlYWRlcl9sZW4gLSBza2JfaGVhZHJvb20oc2tiKTsKLQlpZiAoKGRlbHRhID4gMCkgJiYKLQkgICAgcHNrYl9leHBhbmRfaGVhZChza2IsIFNLQl9EQVRBX0FMSUdOKGRlbHRhKSwgMCwgR0ZQX0FUT01JQykpCi0JCWdvdG8gZHJvcDsKLQorCWRlbHRhID0gU0tCX0RBVEFfQUxJR04oZGV2LT5oYXJkX2hlYWRlcl9sZW4gLSBza2JfaGVhZHJvb20oc2tiKSk7CisJaWYgKChkZWx0YSA+IDApICYmIHBza2JfZXhwYW5kX2hlYWQoc2tiLCBkZWx0YSwgMCwgR0ZQX0FUT01JQykpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KIAlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlza2ItPmRldiA9IGRldjsKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfVElQQyk7CkBAIC00NjMsOSArNDc2LDYgQEAKIAkJCWRldi0+ZGV2X2FkZHIsIHNrYi0+bGVuKTsKIAlkZXZfcXVldWVfeG1pdChza2IpOwogCXJldHVybiAwOwotZHJvcDoKLQlrZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm4gMDsKIH0KIAogaW50IHRpcGNfYmVhcmVyX210dShzdHJ1Y3QgbmV0ICpuZXQsIHUzMiBiZWFyZXJfaWQpCkBAIC00ODcsMTIgKzQ5NywxMiBAQAogCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICpkZXN0KQogewotCXN0cnVjdCB0aXBjX25ldCAqdG4gPSB0aXBjX25ldChuZXQpOworCXN0cnVjdCB0aXBjX21zZyAqaGRyID0gYnVmX21zZyhza2IpOwogCXN0cnVjdCB0aXBjX2JlYXJlciAqYjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQliID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwodG4tPmJlYXJlcl9saXN0W2JlYXJlcl9pZF0pOwotCWlmIChsaWtlbHkoYikpCisJYiA9IGJlYXJlcl9nZXQobmV0LCBiZWFyZXJfaWQpOworCWlmIChsaWtlbHkoYiAmJiAodGVzdF9iaXQoMCwgJmItPnVwKSB8fCBtc2dfaXNfcmVzZXQoaGRyKSkpKQogCQliLT5tZWRpYS0+c2VuZF9tc2cobmV0LCBza2IsIGIsIGRlc3QpOwogCWVsc2UKIAkJa2ZyZWVfc2tiKHNrYik7CkBAIC01MDUsNyArNTE1LDYgQEAKIAkJICAgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEsCiAJCSAgICAgIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmRzdCkKIHsKLQlzdHJ1Y3QgdGlwY19uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCB0aXBjX25ldF9pZCk7CiAJc3RydWN0IHRpcGNfYmVhcmVyICpiOwogCXN0cnVjdCBza19idWZmICpza2IsICp0bXA7CiAKQEAgLTUxMywxMiArNTIyLDE1IEBACiAJCXJldHVybjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQliID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwodG4tPmJlYXJlcl9saXN0W2JlYXJlcl9pZF0pOworCWIgPSBiZWFyZXJfZ2V0KG5ldCwgYmVhcmVyX2lkKTsKIAlpZiAodW5saWtlbHkoIWIpKQogCQlfX3NrYl9xdWV1ZV9wdXJnZSh4bWl0cSk7CiAJc2tiX3F1ZXVlX3dhbGtfc2FmZSh4bWl0cSwgc2tiLCB0bXApIHsKIAkJX19za2JfZGVxdWV1ZSh4bWl0cSk7Ci0JCWItPm1lZGlhLT5zZW5kX21zZyhuZXQsIHNrYiwgYiwgZHN0KTsKKwkJaWYgKGxpa2VseSh0ZXN0X2JpdCgwLCAmYi0+dXApIHx8IG1zZ19pc19yZXNldChidWZfbXNnKHNrYikpKSkKKwkJCWItPm1lZGlhLT5zZW5kX21zZyhuZXQsIHNrYiwgYiwgZHN0KTsKKwkJZWxzZQorCQkJa2ZyZWVfc2tiKHNrYik7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogfQpAQCAtNTM1LDggKzU0Nyw4IEBACiAJc3RydWN0IHRpcGNfbXNnICpoZHI7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JYiA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKHRuLT5iZWFyZXJfbGlzdFtiZWFyZXJfaWRdKTsKLQlpZiAodW5saWtlbHkoIWIpKQorCWIgPSBiZWFyZXJfZ2V0KG5ldCwgYmVhcmVyX2lkKTsKKwlpZiAodW5saWtlbHkoIWIgfHwgIXRlc3RfYml0KDAsICZiLT51cCkpKQogCQlfX3NrYl9xdWV1ZV9wdXJnZSh4bWl0cSk7CiAJc2tiX3F1ZXVlX3dhbGtfc2FmZSh4bWl0cSwgc2tiLCB0bXApIHsKIAkJaGRyID0gYnVmX21zZyhza2IpOwpAQCAtNTY2LDcgKzU3OCw4IEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJYiA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKGRldi0+dGlwY19wdHIpOwotCWlmIChsaWtlbHkoYiAmJiAoc2tiLT5wa3RfdHlwZSA8PSBQQUNLRVRfQlJPQURDQVNUKSkpIHsKKwlpZiAobGlrZWx5KGIgJiYgdGVzdF9iaXQoMCwgJmItPnVwKSAmJgorCQkgICAoc2tiLT5wa3RfdHlwZSA8PSBQQUNLRVRfQlJPQURDQVNUKSkpIHsKIAkJc2tiLT5uZXh0ID0gTlVMTDsKIAkJdGlwY19yY3YoZGV2X25ldChkZXYpLCBza2IsIGIpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTU5MSwxOCArNjA0LDkgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmV0ZGV2X25vdGlmaWVyX2luZm9fdG9fZGV2KHB0cik7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOwotCXN0cnVjdCB0aXBjX25ldCAqdG4gPSB0aXBjX25ldChuZXQpOwogCXN0cnVjdCB0aXBjX2JlYXJlciAqYjsKLQlpbnQgaTsKIAogCWIgPSBydG5sX2RlcmVmZXJlbmNlKGRldi0+dGlwY19wdHIpOwotCWlmICghYikgewotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JFQVJFUlM7IGIgPSBOVUxMLCBpKyspIHsKLQkJCWIgPSBydG5sX2RlcmVmZXJlbmNlKHRuLT5iZWFyZXJfbGlzdFtpXSk7Ci0JCQlpZiAoYiAmJiAoYi0+bWVkaWFfcHRyID09IGRldikpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9CiAJaWYgKCFiKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKQEAgLTYxMywxMSArNjE3LDEwIEBACiAJCWlmIChuZXRpZl9jYXJyaWVyX29rKGRldikpCiAJCQlicmVhazsKIAljYXNlIE5FVERFVl9VUDoKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKGRldi0+dGlwY19wdHIsIGIpOworCQl0ZXN0X2FuZF9zZXRfYml0X2xvY2soMCwgJmItPnVwKTsKIAkJYnJlYWs7CiAJY2FzZSBORVRERVZfR09JTkdfRE9XTjoKLQkJUkNVX0lOSVRfUE9JTlRFUihkZXYtPnRpcGNfcHRyLCBOVUxMKTsKLQkJc3luY2hyb25pemVfbmV0KCk7CisJCWNsZWFyX2JpdF91bmxvY2soMCwgJmItPnVwKTsKIAkJdGlwY19yZXNldF9iZWFyZXIobmV0LCBiKTsKIAkJYnJlYWs7CiAJY2FzZSBORVRERVZfQ0hBTkdFTVRVOgpAQCAtNzA5LDYgKzcxMiwxNCBAQAogCQlnb3RvIHByb3BfbXNnX2Z1bGw7CiAKIAlubGFfbmVzdF9lbmQobXNnLT5za2IsIHByb3ApOworCisjaWZkZWYgQ09ORklHX1RJUENfTUVESUFfVURQCisJaWYgKGJlYXJlci0+bWVkaWEtPnR5cGVfaWQgPT0gVElQQ19NRURJQV9UWVBFX1VEUCkgeworCQlpZiAodGlwY191ZHBfbmxfYWRkX2JlYXJlcl9kYXRhKG1zZywgYmVhcmVyKSkKKwkJCWdvdG8gYXR0cl9tc2dfZnVsbDsKKwl9CisjZW5kaWYKKwogCW5sYV9uZXN0X2VuZChtc2ctPnNrYiwgYXR0cnMpOwogCWdlbmxtc2dfZW5kKG1zZy0+c2tiLCBoZHIpOwogCkBAIC04OTUsNiArOTA2LDQ5IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCB0aXBjX25sX2JlYXJlcl9hZGQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlpbnQgZXJyOworCWNoYXIgKm5hbWU7CisJc3RydWN0IHRpcGNfYmVhcmVyICpiOworCXN0cnVjdCBubGF0dHIgKmF0dHJzW1RJUENfTkxBX0JFQVJFUl9NQVggKyAxXTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKKworCWlmICghaW5mby0+YXR0cnNbVElQQ19OTEFfQkVBUkVSXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBubGFfcGFyc2VfbmVzdGVkKGF0dHJzLCBUSVBDX05MQV9CRUFSRVJfTUFYLAorCQkJICAgICAgIGluZm8tPmF0dHJzW1RJUENfTkxBX0JFQVJFUl0sCisJCQkgICAgICAgdGlwY19ubF9iZWFyZXJfcG9saWN5KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCFhdHRyc1tUSVBDX05MQV9CRUFSRVJfTkFNRV0pCisJCXJldHVybiAtRUlOVkFMOworCW5hbWUgPSBubGFfZGF0YShhdHRyc1tUSVBDX05MQV9CRUFSRVJfTkFNRV0pOworCisJcnRubF9sb2NrKCk7CisJYiA9IHRpcGNfYmVhcmVyX2ZpbmQobmV0LCBuYW1lKTsKKwlpZiAoIWIpIHsKKwkJcnRubF91bmxvY2soKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisjaWZkZWYgQ09ORklHX1RJUENfTUVESUFfVURQCisJaWYgKGF0dHJzW1RJUENfTkxBX0JFQVJFUl9VRFBfT1BUU10pIHsKKwkJZXJyID0gdGlwY191ZHBfbmxfYmVhcmVyX2FkZChiLAorCQkJCQkgICAgIGF0dHJzW1RJUENfTkxBX0JFQVJFUl9VRFBfT1BUU10pOworCQlpZiAoZXJyKSB7CisJCQlydG5sX3VubG9jaygpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKyNlbmRpZgorCXJ0bmxfdW5sb2NrKCk7CisKKwlyZXR1cm4gMDsKK30KKwogaW50IHRpcGNfbmxfYmVhcmVyX3NldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewogCWludCBlcnI7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iZWFyZXIuaCBiL25ldC90aXBjL2JlYXJlci5oCmluZGV4IDQzNzU3ZjEuLjc4ODkyZTJmIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9iZWFyZXIuaAorKysgYi9uZXQvdGlwYy9iZWFyZXIuaApAQCAtMTUwLDYgKzE1MCw3IEBACiAJdTMyIGlkZW50aXR5OwogCXN0cnVjdCB0aXBjX2xpbmtfcmVxICpsaW5rX3JlcTsKIAljaGFyIG5ldF9wbGFuZTsKKwl1bnNpZ25lZCBsb25nIHVwOwogfTsKIAogc3RydWN0IHRpcGNfYmVhcmVyX25hbWVzIHsKQEAgLTE4MCw2ICsxODEsNyBAQAogaW50IHRpcGNfbmxfYmVhcmVyX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKIGludCB0aXBjX25sX2JlYXJlcl9nZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CiBpbnQgdGlwY19ubF9iZWFyZXJfc2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOworaW50IHRpcGNfbmxfYmVhcmVyX2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIAogaW50IHRpcGNfbmxfbWVkaWFfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwogaW50IHRpcGNfbmxfbWVkaWFfZ2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbGluay5jIGIvbmV0L3RpcGMvbGluay5jCmluZGV4IDg3N2Q5NGYuLmIzNmUxNmMgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2xpbmsuYworKysgYi9uZXQvdGlwYy9saW5rLmMKQEAgLTE4MSw3ICsxODEsMTAgQEAKIAl1MTYgYWNrZWQ7CiAJc3RydWN0IHRpcGNfbGluayAqYmNfcmN2bGluazsKIAlzdHJ1Y3QgdGlwY19saW5rICpiY19zbmRsaW5rOwotCWludCBuYWNrX3N0YXRlOworCXVuc2lnbmVkIGxvbmcgcHJldl9yZXRyOworCXUxNiBwcmV2X2Zyb207CisJdTE2IHByZXZfdG87CisJdTggbmFja19zdGF0ZTsKIAlib29sIGJjX3BlZXJfaXNfdXA7CiAKIAkvKiBTdGF0aXN0aWNzICovCkBAIC0yMDIsNiArMjA1LDggQEAKIAlCQ19OQUNLX1NORF9TVVBQUkVTUywKIH07CiAKKyNkZWZpbmUgVElQQ19CQ19SRVRSX0xJTUlUIDEwICAgLyogW21zXSAqLworCiAvKgogICogSW50ZXJ2YWwgYmV0d2VlbiBOQUNLcyB3aGVuIHBhY2tldHMgYXJyaXZlIG91dCBvZiBvcmRlcgogICovCkBAIC0yMzcsOCArMjQyLDggQEAKIAkJCQkgICAgICB1MTYgcmN2Z2FwLCBpbnQgdG9sZXJhbmNlLCBpbnQgcHJpb3JpdHksCiAJCQkJICAgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpOwogc3RhdGljIHZvaWQgbGlua19wcmludChzdHJ1Y3QgdGlwY19saW5rICpsLCBjb25zdCBjaGFyICpzdHIpOwotc3RhdGljIHZvaWQgdGlwY19saW5rX2J1aWxkX25hY2tfbXNnKHN0cnVjdCB0aXBjX2xpbmsgKmwsCi0JCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSk7CitzdGF0aWMgaW50IHRpcGNfbGlua19idWlsZF9uYWNrX21zZyhzdHJ1Y3QgdGlwY19saW5rICpsLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSk7CiBzdGF0aWMgdm9pZCB0aXBjX2xpbmtfYnVpbGRfYmNfaW5pdF9tc2coc3RydWN0IHRpcGNfbGluayAqbCwKIAkJCQkJc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpOwogc3RhdGljIGJvb2wgdGlwY19saW5rX3JlbGVhc2VfcGt0cyhzdHJ1Y3QgdGlwY19saW5rICpsLCB1MTYgdG8pOwpAQCAtMzY3LDYgKzM3MiwxOCBAQAogCXJldHVybiBsLT5hY2tlcnM7CiB9CiAKK3UxNiBsaW5rX2JjX3Jjdl9nYXAoc3RydWN0IHRpcGNfbGluayAqbCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2tiX3BlZWsoJmwtPmRlZmVyZHEpOworCXUxNiBnYXAgPSAwOworCisJaWYgKG1vcmUobC0+c25kX254dCwgbC0+cmN2X254dCkpCisJCWdhcCA9IGwtPnNuZF9ueHQgLSBsLT5yY3Zfbnh0OworCWlmIChza2IpCisJCWdhcCA9IGJ1Zl9zZXFubyhza2IpIC0gbC0+cmN2X254dDsKKwlyZXR1cm4gZ2FwOworfQorCiB2b2lkIHRpcGNfbGlua19zZXRfbXR1KHN0cnVjdCB0aXBjX2xpbmsgKmwsIGludCBtdHUpCiB7CiAJbC0+bXR1ID0gbXR1OwpAQCAtODA3LDcgKzgyNCw3IEBACiAKIAlza2JfcXVldWVfd2Fsa19zYWZlKCZsLT53YWtldXBxLCBza2IsIHRtcCkgewogCQlpbXAgPSBUSVBDX1NLQl9DQihza2IpLT5jaGFpbl9pbXA7Ci0JCWxpbSA9IGwtPndpbmRvdyArIGwtPmJhY2tsb2dbaW1wXS5saW1pdDsKKwkJbGltID0gbC0+YmFja2xvZ1tpbXBdLmxpbWl0OwogCQlwbmRbaW1wXSArPSBUSVBDX1NLQl9DQihza2IpLT5jaGFpbl9zejsKIAkJaWYgKChwbmRbaW1wXSArIGwtPmJhY2tsb2dbaW1wXS5sZW4pID49IGxpbSkKIAkJCWJyZWFrOwpAQCAtODczLDkgKzg5MCwxMSBAQAogCXN0cnVjdCBza19idWZmICpza2IsICpfc2tiLCAqYnNrYjsKIAogCS8qIE1hdGNoIG1zZyBpbXBvcnRhbmNlIGFnYWluc3QgdGhpcyBhbmQgYWxsIGhpZ2hlciBiYWNrbG9nIGxpbWl0czogKi8KLQlmb3IgKGkgPSBpbXA7IGkgPD0gVElQQ19TWVNURU1fSU1QT1JUQU5DRTsgaSsrKSB7Ci0JCWlmICh1bmxpa2VseShsLT5iYWNrbG9nW2ldLmxlbiA+PSBsLT5iYWNrbG9nW2ldLmxpbWl0KSkKLQkJCXJldHVybiBsaW5rX3NjaGVkdWxlX3VzZXIobCwgbGlzdCk7CisJaWYgKCFza2JfcXVldWVfZW1wdHkoYmFja2xvZ3EpKSB7CisJCWZvciAoaSA9IGltcDsgaSA8PSBUSVBDX1NZU1RFTV9JTVBPUlRBTkNFOyBpKyspIHsKKwkJCWlmICh1bmxpa2VseShsLT5iYWNrbG9nW2ldLmxlbiA+PSBsLT5iYWNrbG9nW2ldLmxpbWl0KSkKKwkJCQlyZXR1cm4gbGlua19zY2hlZHVsZV91c2VyKGwsIGxpc3QpOworCQl9CiAJfQogCWlmICh1bmxpa2VseShtc2dfc2l6ZShoZHIpID4gbXR1KSkgewogCQlza2JfcXVldWVfcHVyZ2UobGlzdCk7CkBAIC0xMTMzLDcgKzExNTIsMTAgQEAKIAkJaWYgKCgobC0+cmN2X254dCBeIHRpcGNfb3duX2FkZHIobC0+bmV0KSkgJiAweGYpICE9IDB4ZikKIAkJCXJldHVybiAwOwogCQlsLT5yY3ZfdW5hY2tlZCA9IDA7Ci0JCXJldHVybiBUSVBDX0xJTktfU05EX0JDX0FDSzsKKworCQkvKiBVc2Ugc25kX254dCB0byBzdG9yZSBwZWVyJ3Mgc25kX254dCBpbiBicm9hZGNhc3QgcmN2IGxpbmsgKi8KKwkJbC0+c25kX254dCA9IGwtPnJjdl9ueHQ7CisJCXJldHVybiBUSVBDX0xJTktfU05EX1NUQVRFOwogCX0KIAogCS8qIFVuaWNhc3QgQUNLICovCkBAIC0xMTYyLDE3ICsxMTg0LDI2IEBACiB9CiAKIC8qIHRpcGNfbGlua19idWlsZF9uYWNrX21zZzogcHJlcGFyZSBsaW5rIG5hY2sgbWVzc2FnZSBmb3IgdHJhbnNtaXNzaW9uCisgKiBOb3RlIHRoYXQgc2VuZGluZyBvZiBicm9hZGNhc3QgTkFDSyBpcyBjb29yZGluYXRlZCBhbW9uZyBub2RlcywgdG8KKyAqIHJlZHVjZSB0aGUgcmlzayBvZiBOQUNLIHN0b3JtcyB0b3dhcmRzIHRoZSBzZW5kZXIKICAqLwotc3RhdGljIHZvaWQgdGlwY19saW5rX2J1aWxkX25hY2tfbXNnKHN0cnVjdCB0aXBjX2xpbmsgKmwsCi0JCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSkKK3N0YXRpYyBpbnQgdGlwY19saW5rX2J1aWxkX25hY2tfbXNnKHN0cnVjdCB0aXBjX2xpbmsgKmwsCisJCQkJICAgIHN0cnVjdCBza19idWZmX2hlYWQgKnhtaXRxKQogewogCXUzMiBkZWZfY250ID0gKytsLT5zdGF0cy5kZWZlcnJlZF9yZWN2OworCWludCBtYXRjaDEsIG1hdGNoMjsKIAotCWlmIChsaW5rX2lzX2JjX3JjdmxpbmsobCkpCi0JCXJldHVybjsKKwlpZiAobGlua19pc19iY19yY3ZsaW5rKGwpKSB7CisJCW1hdGNoMSA9IGRlZl9jbnQgJiAweGY7CisJCW1hdGNoMiA9IHRpcGNfb3duX2FkZHIobC0+bmV0KSAmIDB4ZjsKKwkJaWYgKG1hdGNoMSA9PSBtYXRjaDIpCisJCQlyZXR1cm4gVElQQ19MSU5LX1NORF9TVEFURTsKKwkJcmV0dXJuIDA7CisJfQogCiAJaWYgKChza2JfcXVldWVfbGVuKCZsLT5kZWZlcmRxKSA9PSAxKSB8fCAhKGRlZl9jbnQgJSBUSVBDX05BQ0tfSU5UVikpCiAJCXRpcGNfbGlua19idWlsZF9wcm90b19tc2cobCwgU1RBVEVfTVNHLCAwLCAwLCAwLCAwLCB4bWl0cSk7CisJcmV0dXJuIDA7CiB9CiAKIC8qIHRpcGNfbGlua19yY3YgLSBwcm9jZXNzIFRJUEMgcGFja2V0cy9tZXNzYWdlcyBhcnJpdmluZyBmcm9tIG9mZi1ub2RlCkBAIC0xMjIzLDcgKzEyNTQsNyBAQAogCQkvKiBEZWZlciBkZWxpdmVyeSBpZiBzZXF1ZW5jZSBnYXAgKi8KIAkJaWYgKHVubGlrZWx5KHNlcW5vICE9IHJjdl9ueHQpKSB7CiAJCQlfX3RpcGNfc2tiX3F1ZXVlX3NvcnRlZChkZWZxLCBzZXFubywgc2tiKTsKLQkJCXRpcGNfbGlua19idWlsZF9uYWNrX21zZyhsLCB4bWl0cSk7CisJCQlyYyB8PSB0aXBjX2xpbmtfYnVpbGRfbmFja19tc2cobCwgeG1pdHEpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTIzNCw3ICsxMjY1LDcgQEAKIAkJCXJjIHw9IHRpcGNfbGlua19pbnB1dChsLCBza2IsIGwtPmlucHV0cSk7CiAJCWlmICh1bmxpa2VseSgrK2wtPnJjdl91bmFja2VkID49IFRJUENfTUlOX0xJTktfV0lOKSkKIAkJCXJjIHw9IHRpcGNfbGlua19idWlsZF9zdGF0ZV9tc2cobCwgeG1pdHEpOwotCQlpZiAodW5saWtlbHkocmMgJiB+VElQQ19MSU5LX1NORF9CQ19BQ0spKQorCQlpZiAodW5saWtlbHkocmMgJiB+VElQQ19MSU5LX1NORF9TVEFURSkpCiAJCQlicmVhazsKIAl9IHdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZShkZWZxKSkpOwogCkBAIC0xMjQ4LDEwICsxMjc5LDExIEBACiAJCQkJICAgICAgdTE2IHJjdmdhcCwgaW50IHRvbGVyYW5jZSwgaW50IHByaW9yaXR5LAogCQkJCSAgICAgIHN0cnVjdCBza19idWZmX2hlYWQgKnhtaXRxKQogeworCXN0cnVjdCB0aXBjX2xpbmsgKmJjbCA9IGwtPmJjX3Jjdmxpbms7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgdGlwY19tc2cgKmhkcjsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpkZnEgPSAmbC0+ZGVmZXJkcTsKLQlib29sIG5vZGVfdXAgPSBsaW5rX2lzX3VwKGwtPmJjX3JjdmxpbmspOworCWJvb2wgbm9kZV91cCA9IGxpbmtfaXNfdXAoYmNsKTsKIAlzdHJ1Y3QgdGlwY19tb25fc3RhdGUgKm1zdGF0ZSA9ICZsLT5tb25fc3RhdGU7CiAJaW50IGRsZW4gPSAwOwogCXZvaWQgKmRhdGE7CkBAIC0xMjc5LDcgKzEzMTEsNyBAQAogCW1zZ19zZXRfbmV0X3BsYW5lKGhkciwgbC0+bmV0X3BsYW5lKTsKIAltc2dfc2V0X25leHRfc2VudChoZHIsIGwtPnNuZF9ueHQpOwogCW1zZ19zZXRfYWNrKGhkciwgbC0+cmN2X254dCAtIDEpOwotCW1zZ19zZXRfYmNhc3RfYWNrKGhkciwgbC0+YmNfcmN2bGluay0+cmN2X254dCAtIDEpOworCW1zZ19zZXRfYmNhc3RfYWNrKGhkciwgYmNsLT5yY3Zfbnh0IC0gMSk7CiAJbXNnX3NldF9sYXN0X2JjYXN0KGhkciwgbC0+YmNfc25kbGluay0+c25kX254dCAtIDEpOwogCW1zZ19zZXRfbGlua190b2xlcmFuY2UoaGRyLCB0b2xlcmFuY2UpOwogCW1zZ19zZXRfbGlua3ByaW8oaGRyLCBwcmlvcml0eSk7CkBAIC0xMjg5LDYgKzEzMjEsNyBAQAogCiAJaWYgKG10eXAgPT0gU1RBVEVfTVNHKSB7CiAJCW1zZ19zZXRfc2VxX2dhcChoZHIsIHJjdmdhcCk7CisJCW1zZ19zZXRfYmNfZ2FwKGhkciwgbGlua19iY19yY3ZfZ2FwKGJjbCkpOwogCQltc2dfc2V0X3Byb2JlKGhkciwgcHJvYmUpOwogCQl0aXBjX21vbl9wcmVwKGwtPm5ldCwgZGF0YSwgJmRsZW4sIG1zdGF0ZSwgbC0+YmVhcmVyX2lkKTsKIAkJbXNnX3NldF9zaXplKGhkciwgSU5UX0hfU0laRSArIGRsZW4pOwpAQCAtMTU3MSw1MSArMTYwNCwxMDcgQEAKIAkJbC0+cmN2X254dCA9IHBlZXJzX3NuZF9ueHQ7CiB9CiAKKy8qIGxpbmtfYmNfcmV0ciBldmFsKCktIGNoZWNrIGlmIHRoZSBpbmRpY2F0ZWQgcmFuZ2UgY2FuIGJlIHJldHJhbnNtaXR0ZWQgbm93CisgKiAtIEFkanVzdCBwZXJtaXR0ZWQgcmFuZ2UgaWYgdGhlcmUgaXMgb3ZlcmxhcCB3aXRoIHByZXZpb3VzIHJldHJhbnNtaXNzaW9uCisgKi8KK3N0YXRpYyBib29sIGxpbmtfYmNfcmV0cl9ldmFsKHN0cnVjdCB0aXBjX2xpbmsgKmwsIHUxNiAqZnJvbSwgdTE2ICp0bykKK3sKKwl1bnNpZ25lZCBsb25nIGVsYXBzZWQgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBsLT5wcmV2X3JldHIpOworCisJaWYgKGxlc3MoKnRvLCAqZnJvbSkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIE5ldyByZXRyYW5zbWlzc2lvbiByZXF1ZXN0ICovCisJaWYgKChlbGFwc2VkID4gVElQQ19CQ19SRVRSX0xJTUlUKSB8fAorCSAgICBsZXNzKCp0bywgbC0+cHJldl9mcm9tKSB8fCBtb3JlKCpmcm9tLCBsLT5wcmV2X3RvKSkgeworCQlsLT5wcmV2X2Zyb20gPSAqZnJvbTsKKwkJbC0+cHJldl90byA9ICp0bzsKKwkJbC0+cHJldl9yZXRyID0gamlmZmllczsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogSW5zaWRlIHJhbmdlIG9mIHByZXZpb3VzIHJldHJhbnNtaXQgKi8KKwlpZiAoIWxlc3MoKmZyb20sIGwtPnByZXZfZnJvbSkgJiYgIW1vcmUoKnRvLCBsLT5wcmV2X3RvKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogRnVsbHkgb3IgcGFydGlhbGx5IG91dHNpZGUgcHJldmlvdXMgcmFuZ2UgPT4gZXhjbHVkZSBvdmVybGFwICovCisJaWYgKGxlc3MoKmZyb20sIGwtPnByZXZfZnJvbSkpIHsKKwkJKnRvID0gbC0+cHJldl9mcm9tIC0gMTsKKwkJbC0+cHJldl9mcm9tID0gKmZyb207CisJfQorCWlmIChtb3JlKCp0bywgbC0+cHJldl90bykpIHsKKwkJKmZyb20gPSBsLT5wcmV2X3RvICsgMTsKKwkJbC0+cHJldl90byA9ICp0bzsKKwl9CisJbC0+cHJldl9yZXRyID0gamlmZmllczsKKwlyZXR1cm4gdHJ1ZTsKK30KKwogLyogdGlwY19saW5rX2JjX3N5bmNfcmN2IC0gdXBkYXRlIHJjdiBsaW5rIGFjY29yZGluZyB0byBwZWVyJ3Mgc2VuZCBzdGF0ZQogICovCi12b2lkIHRpcGNfbGlua19iY19zeW5jX3JjdihzdHJ1Y3QgdGlwY19saW5rICpsLCBzdHJ1Y3QgdGlwY19tc2cgKmhkciwKLQkJCSAgIHN0cnVjdCBza19idWZmX2hlYWQgKnhtaXRxKQoraW50IHRpcGNfbGlua19iY19zeW5jX3JjdihzdHJ1Y3QgdGlwY19saW5rICpsLCBzdHJ1Y3QgdGlwY19tc2cgKmhkciwKKwkJCSAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpCiB7CisJc3RydWN0IHRpcGNfbGluayAqc25kX2wgPSBsLT5iY19zbmRsaW5rOwogCXUxNiBwZWVyc19zbmRfbnh0ID0gbXNnX2JjX3NuZF9ueHQoaGRyKTsKKwl1MTYgZnJvbSA9IG1zZ19iY2FzdF9hY2soaGRyKSArIDE7CisJdTE2IHRvID0gZnJvbSArIG1zZ19iY19nYXAoaGRyKSAtIDE7CisJaW50IHJjID0gMDsKIAogCWlmICghbGlua19pc191cChsKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gcmM7CiAKIAlpZiAoIW1zZ19wZWVyX25vZGVfaXNfdXAoaGRyKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gcmM7CiAKIAkvKiBPcGVuIHdoZW4gcGVlciBhY2tvd2xlZGdlcyBvdXIgYmNhc3QgaW5pdCBtc2cgKHBrdCAjMSkgKi8KIAlpZiAobXNnX2FjayhoZHIpKQogCQlsLT5iY19wZWVyX2lzX3VwID0gdHJ1ZTsKIAogCWlmICghbC0+YmNfcGVlcl9pc191cCkKLQkJcmV0dXJuOworCQlyZXR1cm4gcmM7CisKKwlsLT5zdGF0cy5yZWN2X25hY2tzKys7CiAKIAkvKiBJZ25vcmUgaWYgcGVlcnNfc25kX254dCBnb2VzIGJleW9uZCByZWNlaXZlIHdpbmRvdyAqLwogCWlmIChtb3JlKHBlZXJzX3NuZF9ueHQsIGwtPnJjdl9ueHQgKyBsLT53aW5kb3cpKQotCQlyZXR1cm47CisJCXJldHVybiByYzsKKworCWlmIChsaW5rX2JjX3JldHJfZXZhbChzbmRfbCwgJmZyb20sICZ0bykpCisJCXJjID0gdGlwY19saW5rX3JldHJhbnMoc25kX2wsIGZyb20sIHRvLCB4bWl0cSk7CisKKwlsLT5zbmRfbnh0ID0gcGVlcnNfc25kX254dDsKKwlpZiAobGlua19iY19yY3ZfZ2FwKGwpKQorCQlyYyB8PSBUSVBDX0xJTktfU05EX1NUQVRFOworCisJLyogUmV0dXJuIG5vdyBpZiBzZW5kZXIgc3VwcG9ydHMgbmFjayB2aWEgU1RBVEUgbWVzc2FnZXMgKi8KKwlpZiAobC0+cGVlcl9jYXBzICYgVElQQ19CQ0FTVF9TVEFURV9OQUNLKQorCQlyZXR1cm4gcmM7CisKKwkvKiBPdGhlcndpc2UsIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlICovCiAKIAlpZiAoIW1vcmUocGVlcnNfc25kX254dCwgbC0+cmN2X254dCkpIHsKIAkJbC0+bmFja19zdGF0ZSA9IEJDX05BQ0tfU05EX0NPTkRJVElPTkFMOwotCQlyZXR1cm47CisJCXJldHVybiAwOwogCX0KIAogCS8qIERvbid0IE5BQ0sgaWYgb25lIHdhcyByZWNlbnRseSBzZW50IG9yIHBlZWtlZCAqLwogCWlmIChsLT5uYWNrX3N0YXRlID09IEJDX05BQ0tfU05EX1NVUFBSRVNTKSB7CiAJCWwtPm5hY2tfc3RhdGUgPSBCQ19OQUNLX1NORF9VTkNPTkRJVElPTkFMOwotCQlyZXR1cm47CisJCXJldHVybiAwOwogCX0KIAogCS8qIENvbmRpdGlvbmFsbHkgZGVsYXkgTkFDSyBzZW5kaW5nIHVudGlsIG5leHQgc3luY2ggcmN2ICovCiAJaWYgKGwtPm5hY2tfc3RhdGUgPT0gQkNfTkFDS19TTkRfQ09ORElUSU9OQUwpIHsKIAkJbC0+bmFja19zdGF0ZSA9IEJDX05BQ0tfU05EX1VOQ09ORElUSU9OQUw7CiAJCWlmICgocGVlcnNfc25kX254dCAtIGwtPnJjdl9ueHQpIDwgVElQQ19NSU5fTElOS19XSU4pCi0JCQlyZXR1cm47CisJCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiBTZW5kIE5BQ0sgbm93IGJ1dCBzdXBwcmVzcyBuZXh0IG9uZSAqLwogCXRpcGNfbGlua19idWlsZF9iY19wcm90b19tc2cobCwgdHJ1ZSwgcGVlcnNfc25kX254dCwgeG1pdHEpOwogCWwtPm5hY2tfc3RhdGUgPSBCQ19OQUNLX1NORF9TVVBQUkVTUzsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCB0aXBjX2xpbmtfYmNfYWNrX3JjdihzdHJ1Y3QgdGlwY19saW5rICpsLCB1MTYgYWNrZWQsCkBAIC0xNjUyLDYgKzE3NDEsOCBAQAogfQogCiAvKiB0aXBjX2xpbmtfYmNfbmFja19yY3YoKTogcmVjZWl2ZSBicm9hZGNhc3QgbmFjayBtZXNzYWdlCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBzaW5jZQorICogbm8gQkNBU1RfUFJPVE9DT0wvU1RBVEUgbWVzc2FnZXMgb2NjdXIgZnJvbSBUSVBDIHYyLjUuCiAgKi8KIGludCB0aXBjX2xpbmtfYmNfbmFja19yY3Yoc3RydWN0IHRpcGNfbGluayAqbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpCkBAIC0xNjkyLDEwICsxNzgzLDEwIEBACiAJaW50IG1heF9idWxrID0gVElQQ19NQVhfUFVCTElDQVRJT05TIC8gKGwtPm10dSAvIElURU1fU0laRSk7CiAKIAlsLT53aW5kb3cgPSB3aW47Ci0JbC0+YmFja2xvZ1tUSVBDX0xPV19JTVBPUlRBTkNFXS5saW1pdCAgICAgID0gd2luIC8gMjsKLQlsLT5iYWNrbG9nW1RJUENfTUVESVVNX0lNUE9SVEFOQ0VdLmxpbWl0ICAgPSB3aW47Ci0JbC0+YmFja2xvZ1tUSVBDX0hJR0hfSU1QT1JUQU5DRV0ubGltaXQgICAgID0gd2luIC8gMiAqIDM7Ci0JbC0+YmFja2xvZ1tUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0VdLmxpbWl0ID0gd2luICogMjsKKwlsLT5iYWNrbG9nW1RJUENfTE9XX0lNUE9SVEFOQ0VdLmxpbWl0ICAgICAgPSBtYXhfdCh1MTYsIDUwLCB3aW4pOworCWwtPmJhY2tsb2dbVElQQ19NRURJVU1fSU1QT1JUQU5DRV0ubGltaXQgICA9IG1heF90KHUxNiwgMTAwLCB3aW4gKiAyKTsKKwlsLT5iYWNrbG9nW1RJUENfSElHSF9JTVBPUlRBTkNFXS5saW1pdCAgICAgPSBtYXhfdCh1MTYsIDE1MCwgd2luICogMyk7CisJbC0+YmFja2xvZ1tUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0VdLmxpbWl0ID0gbWF4X3QodTE2LCAyMDAsIHdpbiAqIDQpOwogCWwtPmJhY2tsb2dbVElQQ19TWVNURU1fSU1QT1JUQU5DRV0ubGltaXQgICA9IG1heF9idWxrOwogfQogCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9saW5rLmggYi9uZXQvdGlwYy9saW5rLmgKaW5kZXggZDdlOWQ0Mi4uZDFiZDE3OCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbGluay5oCisrKyBiL25ldC90aXBjL2xpbmsuaApAQCAtNjMsNyArNjMsNyBAQAogZW51bSB7CiAJVElQQ19MSU5LX1VQX0VWVCAgICAgICA9IDEsCiAJVElQQ19MSU5LX0RPV05fRVZUICAgICA9ICgxIDw8IDEpLAotCVRJUENfTElOS19TTkRfQkNfQUNLICAgPSAoMSA8PCAyKQorCVRJUENfTElOS19TTkRfU1RBVEUgICAgPSAoMSA8PCAyKQogfTsKIAogLyogU3RhcnRpbmcgdmFsdWUgZm9yIG1heGltdW0gcGFja2V0IHNpemUgbmVnb3RpYXRpb24gb24gdW5pY2FzdCBsaW5rcwpAQCAtMTM4LDggKzEzOCw4IEBACiB2b2lkIHRpcGNfbGlua19idWlsZF9iY19zeW5jX21zZyhzdHJ1Y3QgdGlwY19saW5rICpsLAogCQkJCSBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSk7CiB2b2lkIHRpcGNfbGlua19iY19pbml0X3JjdihzdHJ1Y3QgdGlwY19saW5rICpsLCBzdHJ1Y3QgdGlwY19tc2cgKmhkcik7Ci12b2lkIHRpcGNfbGlua19iY19zeW5jX3JjdihzdHJ1Y3QgdGlwY19saW5rICpsLCAgIHN0cnVjdCB0aXBjX21zZyAqaGRyLAotCQkJICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpOworaW50IHRpcGNfbGlua19iY19zeW5jX3JjdihzdHJ1Y3QgdGlwY19saW5rICpsLCAgIHN0cnVjdCB0aXBjX21zZyAqaGRyLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSk7CiBpbnQgdGlwY19saW5rX2JjX25hY2tfcmN2KHN0cnVjdCB0aXBjX2xpbmsgKmwsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgIHN0cnVjdCBza19idWZmX2hlYWQgKnhtaXRxKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbW9uaXRvci5jIGIvbmV0L3RpcGMvbW9uaXRvci5jCmluZGV4IGI2MmNhYTEuLmVkOTdhNTggMTAwNjQ0Ci0tLSBhL25ldC90aXBjL21vbml0b3IuYworKysgYi9uZXQvdGlwYy9tb25pdG9yLmMKQEAgLTcyOCwxMiArNzI4LDEzIEBACiAJCQkgICAgIHUzMiBiZWFyZXJfaWQsIHUzMiAqcHJldl9ub2RlKQogewogCXN0cnVjdCB0aXBjX21vbml0b3IgKm1vbiA9IHRpcGNfbW9uaXRvcihuZXQsIGJlYXJlcl9pZCk7Ci0Jc3RydWN0IHRpcGNfcGVlciAqcGVlciA9IG1vbi0+c2VsZjsKKwlzdHJ1Y3QgdGlwY19wZWVyICpwZWVyOwogCiAJaWYgKCFtb24pCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmVhZF9sb2NrX2JoKCZtb24tPmxvY2spOworCXBlZXIgPSBtb24tPnNlbGY7CiAJZG8gewogCQlpZiAoKnByZXZfbm9kZSkgewogCQkJaWYgKHBlZXItPmFkZHIgPT0gKnByZXZfbm9kZSkKZGlmZiAtLWdpdCBhL25ldC90aXBjL21zZy5oIGIvbmV0L3RpcGMvbXNnLmgKaW5kZXggN2NmNTJmYi4uYzM4MzJjZCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbXNnLmgKKysrIGIvbmV0L3RpcGMvbXNnLmgKQEAgLTcxOSw2ICs3MTksMTYgQEAKIAlyZXR1cm4gKGNoYXIgKikmbS0+aGRyW1RJUENfTUVESUFfSU5GT19PRkZTRVRdOwogfQogCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfYmNfZ2FwKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgOCwgMCwgMHgzZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9iY19nYXAoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgOCwgMCwgMHgzZmYsIG4pOworfQorCiAvKgogICogV29yZCA5CiAgKi8KZGlmZiAtLWdpdCBhL25ldC90aXBjL25hbWVfZGlzdHIuYyBiL25ldC90aXBjL25hbWVfZGlzdHIuYwppbmRleCA2YjYyNmE2Li5hMDRmZTliIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMKKysrIGIvbmV0L3RpcGMvbmFtZV9kaXN0ci5jCkBAIC02Miw2ICs2Miw4IEBACiAKIC8qKgogICogbmFtZWRfcHJlcGFyZV9idWYgLSBhbGxvY2F0ZSAmIGluaXRpYWxpemUgYSBwdWJsaWNhdGlvbiBtZXNzYWdlCisgKgorICogVGhlIGJ1ZmZlciByZXR1cm5lZCBpcyBvZiBzaXplIElOVF9IX1NJWkUgKyBwYXlsb2FkIHNpemUKICAqLwogc3RhdGljIHN0cnVjdCBza19idWZmICpuYW1lZF9wcmVwYXJlX2J1ZihzdHJ1Y3QgbmV0ICpuZXQsIHUzMiB0eXBlLCB1MzIgc2l6ZSwKIAkJCQkJIHUzMiBkZXN0KQpAQCAtMTQxLDkgKzE0Myw5IEBACiAJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOwogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCXN0cnVjdCBkaXN0cl9pdGVtICppdGVtID0gTlVMTDsKLQl1aW50IG1zZ19kc3ogPSAodGlwY19ub2RlX2dldF9tdHUobmV0LCBkbm9kZSwgMCkgLyBJVEVNX1NJWkUpICoKLQkJCUlURU1fU0laRTsKLQl1aW50IG1zZ19yZW0gPSBtc2dfZHN6OworCXUzMiBtc2dfZHN6ID0gKCh0aXBjX25vZGVfZ2V0X210dShuZXQsIGRub2RlLCAwKSAtIElOVF9IX1NJWkUpIC8KKwkJCUlURU1fU0laRSkgKiBJVEVNX1NJWkU7CisJdTMyIG1zZ19yZW0gPSBtc2dfZHN6OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwdWJsLCBwbHMsIGxvY2FsX2xpc3QpIHsKIAkJLyogUHJlcGFyZSBuZXh0IGJ1ZmZlcjogKi8KZGlmZiAtLWdpdCBhL25ldC90aXBjL25ldC5oIGIvbmV0L3RpcGMvbmV0LmgKaW5kZXggNzdhN2ExMS4uYzdjMjU0OSAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbmV0LmgKKysrIGIvbmV0L3RpcGMvbmV0LmgKQEAgLTM5LDYgKzM5LDggQEAKIAogI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KIAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHRpcGNfbmxfbmV0X3BvbGljeVtdOworCiBpbnQgdGlwY19uZXRfc3RhcnQoc3RydWN0IG5ldCAqbmV0LCB1MzIgYWRkcik7CiAKIHZvaWQgdGlwY19uZXRfc3RvcChzdHJ1Y3QgbmV0ICpuZXQpOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbmV0bGluay5jIGIvbmV0L3RpcGMvbmV0bGluay5jCmluZGV4IGE4NGRhZWMuLjMyMDAwNTkgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL25ldGxpbmsuYworKysgYi9uZXQvdGlwYy9uZXRsaW5rLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlICJsaW5rLmgiCiAjaW5jbHVkZSAibm9kZS5oIgogI2luY2x1ZGUgIm5ldC5oIgorI2luY2x1ZGUgInVkcF9tZWRpYS5oIgogI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHRpcGNfbmxfcG9saWN5W1RJUENfTkxBX01BWCArIDFdID0gewpAQCAtMTYxLDYgKzE2MiwxMSBAQAogCQkucG9saWN5ID0gdGlwY19ubF9wb2xpY3ksCiAJfSwKIAl7CisJCS5jbWQJPSBUSVBDX05MX0JFQVJFUl9BREQsCisJCS5kb2l0CT0gdGlwY19ubF9iZWFyZXJfYWRkLAorCQkucG9saWN5ID0gdGlwY19ubF9wb2xpY3ksCisJfSwKKwl7CiAJCS5jbWQJPSBUSVBDX05MX0JFQVJFUl9TRVQsCiAJCS5kb2l0CT0gdGlwY19ubF9iZWFyZXJfc2V0LAogCQkucG9saWN5ID0gdGlwY19ubF9wb2xpY3ksCkBAIC0yMzgsNiArMjQ0LDE4IEBACiAJCS5kdW1waXQJPSB0aXBjX25sX25vZGVfZHVtcF9tb25pdG9yX3BlZXIsCiAJCS5wb2xpY3kgPSB0aXBjX25sX3BvbGljeSwKIAl9LAorCXsKKwkJLmNtZAk9IFRJUENfTkxfUEVFUl9SRU1PVkUsCisJCS5kb2l0CT0gdGlwY19ubF9wZWVyX3JtLAorCQkucG9saWN5ID0gdGlwY19ubF9wb2xpY3ksCisJfSwKKyNpZmRlZiBDT05GSUdfVElQQ19NRURJQV9VRFAKKwl7CisJCS5jbWQJPSBUSVBDX05MX1VEUF9HRVRfUkVNT1RFSVAsCisJCS5kdW1waXQJPSB0aXBjX3VkcF9ubF9kdW1wX3JlbW90ZWlwLAorCQkucG9saWN5ID0gdGlwY19ubF9wb2xpY3ksCisJfSwKKyNlbmRpZgogfTsKIAogaW50IHRpcGNfbmxtc2dfcGFyc2UoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBubGF0dHIgKioqYXR0cikKZGlmZiAtLWdpdCBhL25ldC90aXBjL25vZGUuYyBiL25ldC90aXBjL25vZGUuYwppbmRleCAyMTk3NDE5Li43ZWYxNGUyIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9ub2RlLmMKKysrIGIvbmV0L3RpcGMvbm9kZS5jCkBAIC0xMjYyLDYgKzEyNjIsMzQgQEAKIAlrZnJlZV9za2Ioc2tiKTsKIH0KIAorc3RhdGljIHZvaWQgdGlwY19ub2RlX2JjX3N5bmNfcmN2KHN0cnVjdCB0aXBjX25vZGUgKm4sIHN0cnVjdCB0aXBjX21zZyAqaGRyLAorCQkJCSAgaW50IGJlYXJlcl9pZCwgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpCit7CisJc3RydWN0IHRpcGNfbGluayAqdWNsOworCWludCByYzsKKworCXJjID0gdGlwY19iY2FzdF9zeW5jX3JjdihuLT5uZXQsIG4tPmJjX2VudHJ5LmxpbmssIGhkcik7CisKKwlpZiAocmMgJiBUSVBDX0xJTktfRE9XTl9FVlQpIHsKKwkJdGlwY19iZWFyZXJfcmVzZXRfYWxsKG4tPm5ldCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIShyYyAmIFRJUENfTElOS19TTkRfU1RBVEUpKQorCQlyZXR1cm47CisKKwkvKiBJZiBwcm9iZSBtZXNzYWdlLCBhIFNUQVRFIHJlc3BvbnNlIHdpbGwgYmUgc2VudCBhbnl3YXkgKi8KKwlpZiAobXNnX3Byb2JlKGhkcikpCisJCXJldHVybjsKKworCS8qIFByb2R1Y2UgYSBTVEFURSBtZXNzYWdlIGNhcnJ5aW5nIGJyb2FkY2FzdCBOQUNLICovCisJdGlwY19ub2RlX3JlYWRfbG9jayhuKTsKKwl1Y2wgPSBuLT5saW5rc1tiZWFyZXJfaWRdLmxpbms7CisJaWYgKHVjbCkKKwkJdGlwY19saW5rX2J1aWxkX3N0YXRlX21zZyh1Y2wsIHhtaXRxKTsKKwl0aXBjX25vZGVfcmVhZF91bmxvY2sobik7Cit9CisKIC8qKgogICogdGlwY19ub2RlX2JjX3JjdiAtIHByb2Nlc3MgVElQQyBicm9hZGNhc3QgcGFja2V0IGFycml2aW5nIGZyb20gb2ZmLW5vZGUKICAqIEBuZXQ6IHRoZSBhcHBsaWNhYmxlIG5ldCBuYW1lc3BhY2UKQEAgLTEyOTgsNyArMTMyNiw3IEBACiAJcmMgPSB0aXBjX2JjYXN0X3JjdihuZXQsIGJlLT5saW5rLCBza2IpOwogCiAJLyogQnJvYWRjYXN0IEFDS3MgYXJlIHNlbnQgb24gYSB1bmljYXN0IGxpbmsgKi8KLQlpZiAocmMgJiBUSVBDX0xJTktfU05EX0JDX0FDSykgeworCWlmIChyYyAmIFRJUENfTElOS19TTkRfU1RBVEUpIHsKIAkJdGlwY19ub2RlX3JlYWRfbG9jayhuKTsKIAkJdGlwY19saW5rX2J1aWxkX3N0YXRlX21zZyhsZS0+bGluaywgJnhtaXRxKTsKIAkJdGlwY19ub2RlX3JlYWRfdW5sb2NrKG4pOwpAQCAtMTUwNSw3ICsxNTMzLDcgQEAKIAogCS8qIEVuc3VyZSBicm9hZGNhc3QgcmVjZXB0aW9uIGlzIGluIHN5bmNoIHdpdGggcGVlcidzIHNlbmQgc3RhdGUgKi8KIAlpZiAodW5saWtlbHkodXNyID09IExJTktfUFJPVE9DT0wpKQotCQl0aXBjX2JjYXN0X3N5bmNfcmN2KG5ldCwgbi0+YmNfZW50cnkubGluaywgaGRyKTsKKwkJdGlwY19ub2RlX2JjX3N5bmNfcmN2KG4sIGhkciwgYmVhcmVyX2lkLCAmeG1pdHEpOwogCWVsc2UgaWYgKHVubGlrZWx5KHRpcGNfbGlua19hY2tlZChuLT5iY19lbnRyeS5saW5rKSAhPSBiY19hY2spKQogCQl0aXBjX2JjYXN0X2Fja19yY3YobmV0LCBuLT5iY19lbnRyeS5saW5rLCBiY19hY2spOwogCkBAIC0xNTUzLDYgKzE1ODEsNjkgQEAKIAlrZnJlZV9za2Ioc2tiKTsKIH0KIAoraW50IHRpcGNfbmxfcGVlcl9ybShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOworCXN0cnVjdCB0aXBjX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHRpcGNfbmV0X2lkKTsKKwlzdHJ1Y3QgbmxhdHRyICphdHRyc1tUSVBDX05MQV9ORVRfTUFYICsgMV07CisJc3RydWN0IHRpcGNfbm9kZSAqcGVlcjsKKwl1MzIgYWRkcjsKKwlpbnQgZXJyOworCWludCBpOworCisJLyogV2UgaWRlbnRpZnkgdGhlIHBlZXIgYnkgaXRzIG5ldCAqLworCWlmICghaW5mby0+YXR0cnNbVElQQ19OTEFfTkVUXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBubGFfcGFyc2VfbmVzdGVkKGF0dHJzLCBUSVBDX05MQV9ORVRfTUFYLAorCQkJICAgICAgIGluZm8tPmF0dHJzW1RJUENfTkxBX05FVF0sCisJCQkgICAgICAgdGlwY19ubF9uZXRfcG9saWN5KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCFhdHRyc1tUSVBDX05MQV9ORVRfQUREUl0pCisJCXJldHVybiAtRUlOVkFMOworCisJYWRkciA9IG5sYV9nZXRfdTMyKGF0dHJzW1RJUENfTkxBX05FVF9BRERSXSk7CisKKwlpZiAoaW5fb3duX25vZGUobmV0LCBhZGRyKSkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCXNwaW5fbG9ja19iaCgmdG4tPm5vZGVfbGlzdF9sb2NrKTsKKwlwZWVyID0gdGlwY19ub2RlX2ZpbmQobmV0LCBhZGRyKTsKKwlpZiAoIXBlZXIpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnRuLT5ub2RlX2xpc3RfbG9jayk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJdGlwY19ub2RlX3dyaXRlX2xvY2socGVlcik7CisJaWYgKHBlZXItPnN0YXRlICE9IFNFTEZfRE9XTl9QRUVSX0RPV04gJiYKKwkgICAgcGVlci0+c3RhdGUgIT0gU0VMRl9ET1dOX1BFRVJfTEVBVklORykgeworCQl0aXBjX25vZGVfd3JpdGVfdW5sb2NrKHBlZXIpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JFQVJFUlM7IGkrKykgeworCQlzdHJ1Y3QgdGlwY19saW5rX2VudHJ5ICpsZSA9ICZwZWVyLT5saW5rc1tpXTsKKworCQlpZiAobGUtPmxpbmspIHsKKwkJCWtmcmVlKGxlLT5saW5rKTsKKwkJCWxlLT5saW5rID0gTlVMTDsKKwkJCXBlZXItPmxpbmtfY250LS07CisJCX0KKwl9CisJdGlwY19ub2RlX3dyaXRlX3VubG9jayhwZWVyKTsKKwl0aXBjX25vZGVfZGVsZXRlKHBlZXIpOworCisJZXJyID0gMDsKK2Vycl9vdXQ6CisJdGlwY19ub2RlX3B1dChwZWVyKTsKKwlzcGluX3VubG9ja19iaCgmdG4tPm5vZGVfbGlzdF9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKIGludCB0aXBjX25sX25vZGVfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCiB7CiAJaW50IGVycjsKZGlmZiAtLWdpdCBhL25ldC90aXBjL25vZGUuaCBiL25ldC90aXBjL25vZGUuaAppbmRleCBkNjlmZGZjLi4zOWVmNTRjIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9ub2RlLmgKKysrIGIvbmV0L3RpcGMvbm9kZS5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIG5ldC90aXBjL25vZGUuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIG5vZGUgbWFuYWdlbWVudCByb3V0aW5lcwogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCAyMDE0LTIwMTUsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgMjAxNC0yMDE2LCBFcmljc3NvbiBBQgogICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwLTIwMTQsIFdpbmQgUml2ZXIgU3lzdGVtcwogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC00NSwxMSArNDUsMTQgQEAKIC8qIE9wdGlvbmFsIGNhcGFiaWxpdGllcyBzdXBwb3J0ZWQgYnkgdGhpcyBjb2RlIHZlcnNpb24KICAqLwogZW51bSB7Ci0JVElQQ19CQ0FTVF9TWU5DSCAgID0gKDEgPDwgMSksCi0JVElQQ19CTE9DS19GTE9XQ1RMID0gKDIgPDwgMSkKKwlUSVBDX0JDQVNUX1NZTkNIICAgICAgPSAoMSA8PCAxKSwKKwlUSVBDX0JDQVNUX1NUQVRFX05BQ0sgPSAoMSA8PCAyKSwKKwlUSVBDX0JMT0NLX0ZMT1dDVEwgICAgPSAoMSA8PCAzKQogfTsKIAotI2RlZmluZSBUSVBDX05PREVfQ0FQQUJJTElUSUVTIChUSVBDX0JDQVNUX1NZTkNIIHwgVElQQ19CTE9DS19GTE9XQ1RMKQorI2RlZmluZSBUSVBDX05PREVfQ0FQQUJJTElUSUVTIChUSVBDX0JDQVNUX1NZTkNIIHwgXAorCQkJCVRJUENfQkNBU1RfU1RBVEVfTkFDSyB8IFwKKwkJCQlUSVBDX0JMT0NLX0ZMT1dDVEwpCiAjZGVmaW5lIElOVkFMSURfQkVBUkVSX0lEIC0xCiAKIHZvaWQgdGlwY19ub2RlX3N0b3Aoc3RydWN0IG5ldCAqbmV0KTsKQEAgLTc3LDYgKzgwLDcgQEAKIGludCB0aXBjX25sX25vZGVfcmVzZXRfbGlua19zdGF0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIGludCB0aXBjX25sX25vZGVfZ2V0X2xpbmsoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CiBpbnQgdGlwY19ubF9ub2RlX3NldF9saW5rKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOworaW50IHRpcGNfbmxfcGVlcl9ybShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIAogaW50IHRpcGNfbmxfbm9kZV9zZXRfbW9uaXRvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIGludCB0aXBjX25sX25vZGVfZ2V0X21vbml0b3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9zb2NrZXQuYyBiL25ldC90aXBjL3NvY2tldC5jCmluZGV4IGM0OWI4ZGYuLmY5ZjVmM2MgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3NvY2tldC5jCisrKyBiL25ldC90aXBjL3NvY2tldC5jCkBAIC0yMTgwLDcgKzIxODAsOCBAQAogCQkJCQkgICAgICBUSVBDX0NPTk5fTVNHLCBTSE9SVF9IX1NJWkUsCiAJCQkJCSAgICAgIDAsIGRub2RlLCBvbm9kZSwgZHBvcnQsIG9wb3J0LAogCQkJCQkgICAgICBUSVBDX0NPTk5fU0hVVERPV04pOwotCQkJdGlwY19ub2RlX3htaXRfc2tiKG5ldCwgc2tiLCBkbm9kZSwgdHNrLT5wb3J0aWQpOworCQkJaWYgKHNrYikKKwkJCQl0aXBjX25vZGVfeG1pdF9za2IobmV0LCBza2IsIGRub2RlLCB0c2stPnBvcnRpZCk7CiAJCX0KIAkJdHNrLT5jb25uZWN0ZWQgPSAwOwogCQlzb2NrLT5zdGF0ZSA9IFNTX0RJU0NPTk5FQ1RJTkc7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy91ZHBfbWVkaWEuYyBiL25ldC90aXBjL3VkcF9tZWRpYS5jCmluZGV4IGIwMTZjMDEuLmQ4MGNkM2YgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3VkcF9tZWRpYS5jCisrKyBiL25ldC90aXBjL3VkcF9tZWRpYS5jCkBAIC00OSw2ICs0OSw3IEBACiAjaW5jbHVkZSAiY29yZS5oIgogI2luY2x1ZGUgImJlYXJlci5oIgogI2luY2x1ZGUgIm5ldGxpbmsuaCIKKyNpbmNsdWRlICJtc2cuaCIKIAogLyogSUFOQSBhc3NpZ25lZCBVRFAgcG9ydCAqLwogI2RlZmluZSBVRFBfUE9SVF9ERUZBVUxUCTYxMTgKQEAgLTcwLDYgKzcxLDEzIEBACiAJfTsKIH07CiAKKy8qIHN0cnVjdCB1ZHBfcmVwbGljYXN0IC0gY29udGFpbmVyIGZvciBVRFAgcmVtb3RlIGFkZHJlc3NlcyAqLworc3RydWN0IHVkcF9yZXBsaWNhc3QgeworCXN0cnVjdCB1ZHBfbWVkaWFfYWRkciBhZGRyOworCXN0cnVjdCByY3VfaGVhZCByY3U7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKwogLyoqCiAgKiBzdHJ1Y3QgdWRwX2JlYXJlciAtIGlwL3VkcCBiZWFyZXIgZGF0YSBzdHJ1Y3R1cmUKICAqIEBiZWFyZXI6CWFzc29jaWF0ZWQgZ2VuZXJpYyB0aXBjIGJlYXJlcgpAQCAtODIsOCArOTAsMjAgQEAKIAlzdHJ1Y3Qgc29ja2V0ICp1YnNvY2s7CiAJdTMyIGlmaW5kZXg7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IHVkcF9yZXBsaWNhc3QgcmNhc3Q7CiB9OwogCitzdGF0aWMgaW50IHRpcGNfdWRwX2lzX21jYXN0X2FkZHIoc3RydWN0IHVkcF9tZWRpYV9hZGRyICphZGRyKQoreworCWlmIChudG9ocyhhZGRyLT5wcm90bykgPT0gRVRIX1BfSVApCisJCXJldHVybiBpcHY0X2lzX211bHRpY2FzdChhZGRyLT5pcHY0LnNfYWRkcik7CisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKKwllbHNlCisJCXJldHVybiBpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZhZGRyLT5pcHY2KTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCiAvKiB1ZHBfbWVkaWFfYWRkcl9zZXQgLSBjb252ZXJ0IGEgaXAvdWRwIGFkZHJlc3MgdG8gYSBUSVBDIG1lZGlhIGFkZHJlc3MgKi8KIHN0YXRpYyB2b2lkIHRpcGNfdWRwX21lZGlhX2FkZHJfc2V0KHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmFkZHIsCiAJCQkJICAgIHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqdWEpCkBAIC05MSwxNSArMTExLDkgQEAKIAltZW1zZXQoYWRkciwgMCwgc2l6ZW9mKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIpKTsKIAlhZGRyLT5tZWRpYV9pZCA9IFRJUENfTUVESUFfVFlQRV9VRFA7CiAJbWVtY3B5KGFkZHItPnZhbHVlLCB1YSwgc2l6ZW9mKHN0cnVjdCB1ZHBfbWVkaWFfYWRkcikpOwotCWlmIChudG9ocyh1YS0+cHJvdG8pID09IEVUSF9QX0lQKSB7Ci0JCWlmIChpcHY0X2lzX211bHRpY2FzdCh1YS0+aXB2NC5zX2FkZHIpKQotCQkJYWRkci0+YnJvYWRjYXN0ID0gMTsKLQl9IGVsc2UgaWYgKG50b2hzKHVhLT5wcm90bykgPT0gRVRIX1BfSVBWNikgewotCQlpZiAoaXB2Nl9hZGRyX3R5cGUoJnVhLT5pcHY2KSAmIElQVjZfQUREUl9NVUxUSUNBU1QpCi0JCQlhZGRyLT5icm9hZGNhc3QgPSAxOwotCX0gZWxzZSB7Ci0JCXByX2VycigiSW52YWxpZCBVRFAgbWVkaWEgYWRkcmVzc1xuIik7Ci0JfQorCisJaWYgKHRpcGNfdWRwX2lzX21jYXN0X2FkZHIodWEpKQorCQlhZGRyLT5icm9hZGNhc3QgPSAxOwogfQogCiAvKiB0aXBjX3VkcF9hZGRyMnN0ciAtIGNvbnZlcnQgaXAvdWRwIGFkZHJlc3MgdG8gc3RyaW5nICovCkBAIC0xNDAsMjggKzE1NCwxMyBAQAogfQogCiAvKiB0aXBjX3NlbmRfbXNnIC0gZW5xdWV1ZSBhIHNlbmQgcmVxdWVzdCAqLwotc3RhdGljIGludCB0aXBjX3VkcF9zZW5kX21zZyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgIHN0cnVjdCB0aXBjX2JlYXJlciAqYiwKLQkJCSAgICAgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqZGVzdCkKK3N0YXRpYyBpbnQgdGlwY191ZHBfeG1pdChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgc3RydWN0IHVkcF9iZWFyZXIgKnViLCBzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKnNyYywKKwkJCSBzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKmRzdCkKIHsKIAlpbnQgdHRsLCBlcnIgPSAwOwotCXN0cnVjdCB1ZHBfYmVhcmVyICp1YjsKLQlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKmRzdCA9IChzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKikmZGVzdC0+dmFsdWU7Ci0Jc3RydWN0IHVkcF9tZWRpYV9hZGRyICpzcmMgPSAoc3RydWN0IHVkcF9tZWRpYV9hZGRyICopJmItPmFkZHIudmFsdWU7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7CiAKLQlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBVRFBfTUlOX0hFQURST09NKSB7Ci0JCWVyciA9IHBza2JfZXhwYW5kX2hlYWQoc2tiLCBVRFBfTUlOX0hFQURST09NLCAwLCBHRlBfQVRPTUlDKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gdHhfZXJyb3I7Ci0JfQotCi0Jc2tiX3NldF9pbm5lcl9wcm90b2NvbChza2IsIGh0b25zKEVUSF9QX1RJUEMpKTsKLQl1YiA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKGItPm1lZGlhX3B0cik7Ci0JaWYgKCF1YikgewotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIHR4X2Vycm9yOwotCX0KIAlpZiAoZHN0LT5wcm90byA9PSBodG9ucyhFVEhfUF9JUCkpIHsKIAkJc3RydWN0IGZsb3dpNCBmbCA9IHsKIAkJCS5kYWRkciA9IGRzdC0+aXB2NC5zX2FkZHIsCkBAIC0yMDcsMjkgKzIwNiwxNzggQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IHRpcGNfdWRwX3NlbmRfbXNnKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgc3RydWN0IHRpcGNfYmVhcmVyICpiLAorCQkJICAgICBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphZGRyKQoreworCXN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqc3JjID0gKHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqKSZiLT5hZGRyLnZhbHVlOworCXN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqZHN0ID0gKHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqKSZhZGRyLT52YWx1ZTsKKwlzdHJ1Y3QgdWRwX3JlcGxpY2FzdCAqcmNhc3Q7CisJc3RydWN0IHVkcF9iZWFyZXIgKnViOworCWludCBlcnIgPSAwOworCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgVURQX01JTl9IRUFEUk9PTSkgeworCQllcnIgPSBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgVURQX01JTl9IRUFEUk9PTSwgMCwgR0ZQX0FUT01JQyk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwl9CisKKwlza2Jfc2V0X2lubmVyX3Byb3RvY29sKHNrYiwgaHRvbnMoRVRIX1BfVElQQykpOworCXViID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwoYi0+bWVkaWFfcHRyKTsKKwlpZiAoIXViKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghYWRkci0+YnJvYWRjYXN0IHx8IGxpc3RfZW1wdHkoJnViLT5yY2FzdC5saXN0KSkKKwkJcmV0dXJuIHRpcGNfdWRwX3htaXQobmV0LCBza2IsIHViLCBzcmMsIGRzdCk7CisKKwkvKiBSZXBsaWNhc3QsIHNlbmQgYW4gc2tiIHRvIGVhY2ggY29uZmlndXJlZCBJUCBhZGRyZXNzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocmNhc3QsICZ1Yi0+cmNhc3QubGlzdCwgbGlzdCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqX3NrYjsKKworCQlfc2tiID0gcHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisJCWlmICghX3NrYikgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZXJyID0gdGlwY191ZHBfeG1pdChuZXQsIF9za2IsIHViLCBzcmMsICZyY2FzdC0+YWRkcik7CisJCWlmIChlcnIpIHsKKwkJCWtmcmVlX3NrYihfc2tiKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWVyciA9IDA7CitvdXQ6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJvb2wgdGlwY191ZHBfaXNfa25vd25fcGVlcihzdHJ1Y3QgdGlwY19iZWFyZXIgKmIsCisJCQkJICAgc3RydWN0IHVkcF9tZWRpYV9hZGRyICphZGRyKQoreworCXN0cnVjdCB1ZHBfcmVwbGljYXN0ICpyY2FzdCwgKnRtcDsKKwlzdHJ1Y3QgdWRwX2JlYXJlciAqdWI7CisKKwl1YiA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKGItPm1lZGlhX3B0cik7CisJaWYgKCF1YikgeworCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoIlVEUCBiZWFyZXIgaW5zdGFuY2Ugbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyY2FzdCwgdG1wLCAmdWItPnJjYXN0Lmxpc3QsIGxpc3QpIHsKKwkJaWYgKCFtZW1jbXAoJnJjYXN0LT5hZGRyLCBhZGRyLCBzaXplb2Yoc3RydWN0IHVkcF9tZWRpYV9hZGRyKSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgdGlwY191ZHBfcmNhc3RfYWRkKHN0cnVjdCB0aXBjX2JlYXJlciAqYiwKKwkJCSAgICAgIHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgdWRwX3JlcGxpY2FzdCAqcmNhc3Q7CisJc3RydWN0IHVkcF9iZWFyZXIgKnViOworCisJdWIgPSByY3VfZGVyZWZlcmVuY2VfcnRubChiLT5tZWRpYV9wdHIpOworCWlmICghdWIpCisJCXJldHVybiAtRU5PREVWOworCisJcmNhc3QgPSBrbWFsbG9jKHNpemVvZigqcmNhc3QpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXJjYXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweSgmcmNhc3QtPmFkZHIsIGFkZHIsIHNpemVvZihzdHJ1Y3QgdWRwX21lZGlhX2FkZHIpKTsKKworCWlmIChudG9ocyhhZGRyLT5wcm90bykgPT0gRVRIX1BfSVApCisJCXByX2luZm8oIk5ldyByZXBsaWNhc3QgcGVlcjogJXBJNFxuIiwgJnJjYXN0LT5hZGRyLmlwdjQpOworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCisJZWxzZSBpZiAobnRvaHMoYWRkci0+cHJvdG8pID09IEVUSF9QX0lQVjYpCisJCXByX2luZm8oIk5ldyByZXBsaWNhc3QgcGVlcjogJXBJNlxuIiwgJnJjYXN0LT5hZGRyLmlwdjYpOworI2VuZGlmCisKKwlsaXN0X2FkZF9yY3UoJnJjYXN0LT5saXN0LCAmdWItPnJjYXN0Lmxpc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpcGNfdWRwX3JjYXN0X2Rpc2Moc3RydWN0IHRpcGNfYmVhcmVyICpiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB1ZHBfbWVkaWFfYWRkciBzcmMgPSB7MH07CisJc3RydWN0IHVkcF9tZWRpYV9hZGRyICpkc3Q7CisKKwlkc3QgPSAoc3RydWN0IHVkcF9tZWRpYV9hZGRyICopJmItPmJjYXN0X2FkZHIudmFsdWU7CisJaWYgKHRpcGNfdWRwX2lzX21jYXN0X2FkZHIoZHN0KSkKKwkJcmV0dXJuIDA7CisKKwlzcmMucG9ydCA9IHVkcF9oZHIoc2tiKS0+c291cmNlOworCisJaWYgKGlwX2hkcihza2IpLT52ZXJzaW9uID09IDQpIHsKKwkJc3RydWN0IGlwaGRyICppcGhkciA9IGlwX2hkcihza2IpOworCisJCXNyYy5wcm90byA9IGh0b25zKEVUSF9QX0lQKTsKKwkJc3JjLmlwdjQuc19hZGRyID0gaXBoZHItPnNhZGRyOworCQlpZiAoaXB2NF9pc19tdWx0aWNhc3QoaXBoZHItPmRhZGRyKSkKKwkJCXJldHVybiAwOworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCisJfSBlbHNlIGlmIChpcF9oZHIoc2tiKS0+dmVyc2lvbiA9PSA2KSB7CisJCXN0cnVjdCBpcHY2aGRyICppcGhkciA9IGlwdjZfaGRyKHNrYik7CisKKwkJc3JjLnByb3RvID0gaHRvbnMoRVRIX1BfSVBWNik7CisJCXNyYy5pcHY2ID0gaXBoZHItPnNhZGRyOworCQlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmaXBoZHItPmRhZGRyKSkKKwkJCXJldHVybiAwOworI2VuZGlmCisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxpa2VseSh0aXBjX3VkcF9pc19rbm93bl9wZWVyKGIsICZzcmMpKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gdGlwY191ZHBfcmNhc3RfYWRkKGIsICZzcmMpOworfQorCiAvKiB0aXBjX3VkcF9yZWN2IC0gcmVhZCBkYXRhIGZyb20gYmVhcmVyIHNvY2tldCAqLwogc3RhdGljIGludCB0aXBjX3VkcF9yZWN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgdWRwX2JlYXJlciAqdWI7CiAJc3RydWN0IHRpcGNfYmVhcmVyICpiOworCXN0cnVjdCB0aXBjX21zZyAqaGRyOworCWludCBlcnI7CiAKIAl1YiA9IHJjdV9kZXJlZmVyZW5jZV9za191c2VyX2RhdGEoc2spOwogCWlmICghdWIpIHsKIAkJcHJfZXJyX3JhdGVsaW1pdGVkKCJGYWlsZWQgdG8gZ2V0IFVEUCBiZWFyZXIgcmVmZXJlbmNlIik7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlyZXR1cm4gMDsKKwkJZ290byBvdXQ7CiAJfQotCiAJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkcikpOworCWhkciA9IGJ1Zl9tc2coc2tiKTsKKwogCXJjdV9yZWFkX2xvY2soKTsKIAliID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwodWItPmJlYXJlcik7CisJaWYgKCFiKQorCQlnb3RvIHJjdV9vdXQ7CiAKLQlpZiAoYikgeworCWlmIChiICYmIHRlc3RfYml0KDAsICZiLT51cCkpIHsKIAkJdGlwY19yY3Yoc29ja19uZXQoc2spLCBza2IsIGIpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIDA7CiAJfQorCisJaWYgKHVubGlrZWx5KG1zZ191c2VyKGhkcikgPT0gTElOS19DT05GSUcpKSB7CisJCWVyciA9IHRpcGNfdWRwX3JjYXN0X2Rpc2MoYiwgc2tiKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gcmN1X291dDsKKwl9CisKKwl0aXBjX3Jjdihzb2NrX25ldChzayksIHNrYiwgYik7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIDA7CisKK3JjdV9vdXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7CitvdXQ6CiAJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNDEsMTUgKzM4OSwxMSBAQAogCXN0cnVjdCBzb2NrICpzayA9IHViLT51YnNvY2stPnNrOwogCiAJaWYgKG50b2hzKHJlbW90ZS0+cHJvdG8pID09IEVUSF9QX0lQKSB7Ci0JCWlmICghaXB2NF9pc19tdWx0aWNhc3QocmVtb3RlLT5pcHY0LnNfYWRkcikpCi0JCQlyZXR1cm4gMDsKIAkJbXJlcW4uaW1yX211bHRpYWRkciA9IHJlbW90ZS0+aXB2NDsKIAkJbXJlcW4uaW1yX2lmaW5kZXggPSB1Yi0+aWZpbmRleDsKIAkJZXJyID0gaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXFuKTsKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCX0gZWxzZSB7Ci0JCWlmICghaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmcmVtb3RlLT5pcHY2KSkKLQkJCXJldHVybiAwOwogCQllcnIgPSBpcHY2X3N0dWItPmlwdjZfc29ja19tY19qb2luKHNrLCB1Yi0+aWZpbmRleCwKIAkJCQkJCSAgICZyZW1vdGUtPmlwdjYpOwogI2VuZGlmCkBAIC0yNTcsNzUgKzQwMSwyMzQgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKioKLSAqIHBhcnNlX29wdGlvbnMgLSBidWlsZCBsb2NhbC9yZW1vdGUgYWRkcmVzc2VzIGZyb20gY29uZmlndXJhdGlvbgotICogQGF0dHJzOgluZXRsaW5rIGNvbmZpZyBkYXRhCi0gKiBAdWI6CQlVRFAgYmVhcmVyIGluc3RhbmNlCi0gKiBAbG9jYWw6CWxvY2FsIGJlYXJlciBJUCBhZGRyZXNzL3BvcnQKLSAqIEByZW1vdGU6CXBlZXIgb3IgbXVsdGljYXN0IElQL3BvcnQKLSAqLwotc3RhdGljIGludCBwYXJzZV9vcHRpb25zKHN0cnVjdCBubGF0dHIgKmF0dHJzW10sIHN0cnVjdCB1ZHBfYmVhcmVyICp1YiwKLQkJCSBzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKmxvY2FsLAotCQkJIHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqcmVtb3RlKQorc3RhdGljIGludCBfX3RpcGNfbmxfYWRkX3VkcF9hZGRyKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICBzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKmFkZHIsIGludCBubGFfdCkKIHsKLQlzdHJ1Y3QgbmxhdHRyICpvcHRzW1RJUENfTkxBX1VEUF9NQVggKyAxXTsKLQlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYV9sb2NhbCwgc2FfcmVtb3RlOworCWlmIChudG9ocyhhZGRyLT5wcm90bykgPT0gRVRIX1BfSVApIHsKKwkJc3RydWN0IHNvY2thZGRyX2luIGlwNDsKIAotCWlmICghYXR0cnNbVElQQ19OTEFfQkVBUkVSX1VEUF9PUFRTXSkKLQkJZ290byBlcnI7Ci0JaWYgKG5sYV9wYXJzZV9uZXN0ZWQob3B0cywgVElQQ19OTEFfVURQX01BWCwKLQkJCSAgICAgYXR0cnNbVElQQ19OTEFfQkVBUkVSX1VEUF9PUFRTXSwKLQkJCSAgICAgdGlwY19ubF91ZHBfcG9saWN5KSkKLQkJZ290byBlcnI7Ci0JaWYgKG9wdHNbVElQQ19OTEFfVURQX0xPQ0FMXSAmJiBvcHRzW1RJUENfTkxBX1VEUF9SRU1PVEVdKSB7Ci0JCW5sYV9tZW1jcHkoJnNhX2xvY2FsLCBvcHRzW1RJUENfTkxBX1VEUF9MT0NBTF0sCi0JCQkgICBzaXplb2Yoc2FfbG9jYWwpKTsKLQkJbmxhX21lbWNweSgmc2FfcmVtb3RlLCBvcHRzW1RJUENfTkxBX1VEUF9SRU1PVEVdLAotCQkJICAgc2l6ZW9mKHNhX3JlbW90ZSkpOworCQlpcDQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCWlwNC5zaW5fcG9ydCA9IGFkZHItPnBvcnQ7CisJCWlwNC5zaW5fYWRkci5zX2FkZHIgPSBhZGRyLT5pcHY0LnNfYWRkcjsKKwkJaWYgKG5sYV9wdXQoc2tiLCBubGFfdCwgc2l6ZW9mKGlwNCksICZpcDQpKQorCQkJcmV0dXJuIC1FTVNHU0laRTsKKworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCisJfSBlbHNlIGlmIChudG9ocyhhZGRyLT5wcm90bykgPT0gRVRIX1BfSVBWNikgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW42IGlwNjsKKworCQlpcDYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJaXA2LnNpbjZfcG9ydCAgPSBhZGRyLT5wb3J0OworCQltZW1jcHkoJmlwNi5zaW42X2FkZHIsICZhZGRyLT5pcHY2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCWlmIChubGFfcHV0KHNrYiwgbmxhX3QsIHNpemVvZihpcDYpLCAmaXA2KSkKKwkJCXJldHVybiAtRU1TR1NJWkU7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHRpcGNfdWRwX25sX2R1bXBfcmVtb3RlaXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXUzMiBiaWQgPSBjYi0+YXJnc1swXTsKKwl1MzIgc2tpcF9jbnQgPSBjYi0+YXJnc1sxXTsKKwl1MzIgcG9ydGlkID0gTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQ7CisJc3RydWN0IHVkcF9yZXBsaWNhc3QgKnJjYXN0LCAqdG1wOworCXN0cnVjdCB0aXBjX2JlYXJlciAqYjsKKwlzdHJ1Y3QgdWRwX2JlYXJlciAqdWI7CisJdm9pZCAqaGRyOworCWludCBlcnI7CisJaW50IGk7CisKKwlpZiAoIWJpZCAmJiAhc2tpcF9jbnQpIHsKKwkJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CisJCXN0cnVjdCBubGF0dHIgKmJhdHRyc1tUSVBDX05MQV9CRUFSRVJfTUFYICsgMV07CisJCXN0cnVjdCBubGF0dHIgKiphdHRyczsKKwkJY2hhciAqYm5hbWU7CisKKwkJZXJyID0gdGlwY19ubG1zZ19wYXJzZShjYi0+bmxoLCAmYXR0cnMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAoIWF0dHJzW1RJUENfTkxBX0JFQVJFUl0pCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQllcnIgPSBubGFfcGFyc2VfbmVzdGVkKGJhdHRycywgVElQQ19OTEFfQkVBUkVSX01BWCwKKwkJCQkgICAgICAgYXR0cnNbVElQQ19OTEFfQkVBUkVSXSwKKwkJCQkgICAgICAgdGlwY19ubF9iZWFyZXJfcG9saWN5KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJaWYgKCFiYXR0cnNbVElQQ19OTEFfQkVBUkVSX05BTUVdKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJYm5hbWUgPSBubGFfZGF0YShiYXR0cnNbVElQQ19OTEFfQkVBUkVSX05BTUVdKTsKKworCQlydG5sX2xvY2soKTsKKwkJYiA9IHRpcGNfYmVhcmVyX2ZpbmQobmV0LCBibmFtZSk7CisJCWlmICghYikgeworCQkJcnRubF91bmxvY2soKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJpZCA9IGItPmlkZW50aXR5OwogCX0gZWxzZSB7Ci1lcnI6Ci0JCXByX2VycigiSW52YWxpZCBVRFAgYmVhcmVyIGNvbmZpZ3VyYXRpb24iKTsKKwkJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CisJCXN0cnVjdCB0aXBjX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHRpcGNfbmV0X2lkKTsKKworCQlydG5sX2xvY2soKTsKKwkJYiA9IHJ0bmxfZGVyZWZlcmVuY2UodG4tPmJlYXJlcl9saXN0W2JpZF0pOworCQlpZiAoIWIpIHsKKwkJCXJ0bmxfdW5sb2NrKCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXViID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwoYi0+bWVkaWFfcHRyKTsKKwlpZiAoIXViKSB7CisJCXJ0bmxfdW5sb2NrKCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoKHNhX2xvY2FsLnNzX2ZhbWlseSAmIHNhX3JlbW90ZS5zc19mYW1pbHkpID09IEFGX0lORVQpIHsKLQkJc3RydWN0IHNvY2thZGRyX2luICppcDQ7CiAKLQkJaXA0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZzYV9sb2NhbDsKLQkJbG9jYWwtPnByb3RvID0gaHRvbnMoRVRIX1BfSVApOwotCQlsb2NhbC0+cG9ydCA9IGlwNC0+c2luX3BvcnQ7Ci0JCWxvY2FsLT5pcHY0LnNfYWRkciA9IGlwNC0+c2luX2FkZHIuc19hZGRyOworCWkgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyY2FzdCwgdG1wLCAmdWItPnJjYXN0Lmxpc3QsIGxpc3QpIHsKKwkJaWYgKGkgPCBza2lwX2NudCkKKwkJCWdvdG8gY291bnQ7CiAKLQkJaXA0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZzYV9yZW1vdGU7Ci0JCXJlbW90ZS0+cHJvdG8gPSBodG9ucyhFVEhfUF9JUCk7Ci0JCXJlbW90ZS0+cG9ydCA9IGlwNC0+c2luX3BvcnQ7Ci0JCXJlbW90ZS0+aXB2NC5zX2FkZHIgPSBpcDQtPnNpbl9hZGRyLnNfYWRkcjsKKwkJaGRyID0gZ2VubG1zZ19wdXQoc2tiLCBwb3J0aWQsIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkJCQkgICZ0aXBjX2dlbmxfZmFtaWx5LCBOTE1fRl9NVUxUSSwKKwkJCQkgIFRJUENfTkxfQkVBUkVSX0dFVCk7CisJCWlmICghaGRyKQorCQkJZ290byBkb25lOworCisJCWVyciA9IF9fdGlwY19ubF9hZGRfdWRwX2FkZHIoc2tiLCAmcmNhc3QtPmFkZHIsCisJCQkJCSAgICAgVElQQ19OTEFfVURQX1JFTU9URSk7CisJCWlmIChlcnIpIHsKKwkJCWdlbmxtc2dfY2FuY2VsKHNrYiwgaGRyKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlnZW5sbXNnX2VuZChza2IsIGhkcik7Citjb3VudDoKKwkJaSsrOworCX0KK2RvbmU6CisJcnRubF91bmxvY2soKTsKKwljYi0+YXJnc1swXSA9IGJpZDsKKwljYi0+YXJnc1sxXSA9IGk7CisKKwlyZXR1cm4gc2tiLT5sZW47Cit9CisKK2ludCB0aXBjX3VkcF9ubF9hZGRfYmVhcmVyX2RhdGEoc3RydWN0IHRpcGNfbmxfbXNnICptc2csIHN0cnVjdCB0aXBjX2JlYXJlciAqYikKK3sKKwlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKnNyYyA9IChzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKikmYi0+YWRkci52YWx1ZTsKKwlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKmRzdDsKKwlzdHJ1Y3QgdWRwX2JlYXJlciAqdWI7CisJc3RydWN0IG5sYXR0ciAqbmVzdDsKKworCXViID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwoYi0+bWVkaWFfcHRyKTsKKwlpZiAoIXViKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW5lc3QgPSBubGFfbmVzdF9zdGFydChtc2ctPnNrYiwgVElQQ19OTEFfQkVBUkVSX1VEUF9PUFRTKTsKKwlpZiAoIW5lc3QpCisJCWdvdG8gbXNnX2Z1bGw7CisKKwlpZiAoX190aXBjX25sX2FkZF91ZHBfYWRkcihtc2ctPnNrYiwgc3JjLCBUSVBDX05MQV9VRFBfTE9DQUwpKQorCQlnb3RvIG1zZ19mdWxsOworCisJZHN0ID0gKHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqKSZiLT5iY2FzdF9hZGRyLnZhbHVlOworCWlmIChfX3RpcGNfbmxfYWRkX3VkcF9hZGRyKG1zZy0+c2tiLCBkc3QsIFRJUENfTkxBX1VEUF9SRU1PVEUpKQorCQlnb3RvIG1zZ19mdWxsOworCisJaWYgKCFsaXN0X2VtcHR5KCZ1Yi0+cmNhc3QubGlzdCkpIHsKKwkJaWYgKG5sYV9wdXRfZmxhZyhtc2ctPnNrYiwgVElQQ19OTEFfVURQX01VTFRJX1JFTU9URUlQKSkKKwkJCWdvdG8gbXNnX2Z1bGw7CisJfQorCisJbmxhX25lc3RfZW5kKG1zZy0+c2tiLCBuZXN0KTsKKwlyZXR1cm4gMDsKK21zZ19mdWxsOgorCW5sYV9uZXN0X2NhbmNlbChtc2ctPnNrYiwgbmVzdCk7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworLyoqCisgKiB0aXBjX3BhcnNlX3VkcF9hZGRyIC0gYnVpbGQgdWRwIG1lZGlhIGFkZHJlc3MgZnJvbSBuZXRsaW5rIGRhdGEKKyAqIEBubGF0dHI6CW5ldGxpbmsgYXR0cmlidXRlIGNvbnRhaW5pbmcgc29ja2FkZHIgc3RvcmFnZSBhbGlnbmVkIGFkZHJlc3MKKyAqIEBhZGRyOgl0aXBjIG1lZGlhIGFkZHJlc3MgdG8gZmlsbCB3aXRoIGFkZHJlc3MsIHBvcnQgYW5kIHByb3RvY29sIHR5cGUKKyAqIEBzY29wZV9pZDoJSVB2NiBzY29wZSBpZCBwb2ludGVyLCBub3QgTlVMTCBpbmRpY2F0ZXMgaXQncyByZXF1aXJlZAorICovCisKK3N0YXRpYyBpbnQgdGlwY19wYXJzZV91ZHBfYWRkcihzdHJ1Y3QgbmxhdHRyICpubGEsIHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqYWRkciwKKwkJCSAgICAgICB1MzIgKnNjb3BlX2lkKQoreworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNhOworCisJbmxhX21lbWNweSgmc2EsIG5sYSwgc2l6ZW9mKHNhKSk7CisJaWYgKHNhLnNzX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiAqaXA0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZzYTsKKworCQlhZGRyLT5wcm90byA9IGh0b25zKEVUSF9QX0lQKTsKKwkJYWRkci0+cG9ydCA9IGlwNC0+c2luX3BvcnQ7CisJCWFkZHItPmlwdjQuc19hZGRyID0gaXA0LT5zaW5fYWRkci5zX2FkZHI7CiAJCXJldHVybiAwOwogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKLQl9IGVsc2UgaWYgKChzYV9sb2NhbC5zc19mYW1pbHkgJiBzYV9yZW1vdGUuc3NfZmFtaWx5KSA9PSBBRl9JTkVUNikgewotCQlpbnQgYXR5cGU7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmlwNjsKKwl9IGVsc2UgaWYgKHNhLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICppcDYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzYTsKIAotCQlpcDYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzYV9sb2NhbDsKLQkJYXR5cGUgPSBpcHY2X2FkZHJfdHlwZSgmaXA2LT5zaW42X2FkZHIpOwotCQlpZiAoX19pcHY2X2FkZHJfbmVlZHNfc2NvcGVfaWQoYXR5cGUpICYmICFpcDYtPnNpbjZfc2NvcGVfaWQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWRkci0+cHJvdG8gPSBodG9ucyhFVEhfUF9JUFY2KTsKKwkJYWRkci0+cG9ydCA9IGlwNi0+c2luNl9wb3J0OworCQltZW1jcHkoJmFkZHItPmlwdjYsICZpcDYtPnNpbjZfYWRkciwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOwogCi0JCWxvY2FsLT5wcm90byA9IGh0b25zKEVUSF9QX0lQVjYpOwotCQlsb2NhbC0+cG9ydCA9IGlwNi0+c2luNl9wb3J0OwotCQltZW1jcHkoJmxvY2FsLT5pcHY2LCAmaXA2LT5zaW42X2FkZHIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKLQkJdWItPmlmaW5kZXggPSBpcDYtPnNpbjZfc2NvcGVfaWQ7CisJCS8qIFNjb3BlIElEIGlzIG9ubHkgaW50ZXJlc3RpbmcgZm9yIGxvY2FsIGFkZHJlc3NlcyAqLworCQlpZiAoc2NvcGVfaWQpIHsKKwkJCWludCBhdHlwZTsKIAotCQlpcDYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzYV9yZW1vdGU7Ci0JCXJlbW90ZS0+cHJvdG8gPSBodG9ucyhFVEhfUF9JUFY2KTsKLQkJcmVtb3RlLT5wb3J0ID0gaXA2LT5zaW42X3BvcnQ7Ci0JCW1lbWNweSgmcmVtb3RlLT5pcHY2LCAmaXA2LT5zaW42X2FkZHIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJCWF0eXBlID0gaXB2Nl9hZGRyX3R5cGUoJmlwNi0+c2luNl9hZGRyKTsKKwkJCWlmIChfX2lwdjZfYWRkcl9uZWVkc19zY29wZV9pZChhdHlwZSkgJiYKKwkJCSAgICAhaXA2LT5zaW42X3Njb3BlX2lkKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCSpzY29wZV9pZCA9IGlwNi0+c2luNl9zY29wZV9pZCA/IDogMDsKKwkJfQorCiAJCXJldHVybiAwOwogI2VuZGlmCiAJfQogCXJldHVybiAtRUFERFJOT1RBVkFJTDsKIH0KIAoraW50IHRpcGNfdWRwX25sX2JlYXJlcl9hZGQoc3RydWN0IHRpcGNfYmVhcmVyICpiLCBzdHJ1Y3QgbmxhdHRyICphdHRyKQoreworCWludCBlcnI7CisJc3RydWN0IHVkcF9tZWRpYV9hZGRyIGFkZHIgPSB7MH07CisJc3RydWN0IG5sYXR0ciAqb3B0c1tUSVBDX05MQV9VRFBfTUFYICsgMV07CisJc3RydWN0IHVkcF9tZWRpYV9hZGRyICpkc3Q7CisKKwlpZiAobmxhX3BhcnNlX25lc3RlZChvcHRzLCBUSVBDX05MQV9VRFBfTUFYLCBhdHRyLCB0aXBjX25sX3VkcF9wb2xpY3kpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghb3B0c1tUSVBDX05MQV9VRFBfUkVNT1RFXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSB0aXBjX3BhcnNlX3VkcF9hZGRyKG9wdHNbVElQQ19OTEFfVURQX1JFTU9URV0sICZhZGRyLCBOVUxMKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZHN0ID0gKHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqKSZiLT5iY2FzdF9hZGRyLnZhbHVlOworCWlmICh0aXBjX3VkcF9pc19tY2FzdF9hZGRyKGRzdCkpIHsKKwkJcHJfZXJyKCJDYW4ndCBhZGQgcmVtb3RlIGlwIHRvIFRJUEMgVURQIG11bHRpY2FzdCBiZWFyZXJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodGlwY191ZHBfaXNfa25vd25fcGVlcihiLCAmYWRkcikpCisJCXJldHVybiAwOworCisJcmV0dXJuIHRpcGNfdWRwX3JjYXN0X2FkZChiLCAmYWRkcik7Cit9CisKIC8qKgogICogdGlwY191ZHBfZW5hYmxlIC0gY2FsbGJhY2sgdG8gY3JlYXRlIGEgbmV3IHVkcCBiZWFyZXIgaW5zdGFuY2UKICAqIEBuZXQ6CW5ldHdvcmsgbmFtZXNwYWNlCkBAIC0zNDAsMTggKzY0MywzOCBAQAogewogCWludCBlcnIgPSAtRUlOVkFMOwogCXN0cnVjdCB1ZHBfYmVhcmVyICp1YjsKLQlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKnJlbW90ZTsKKwlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgcmVtb3RlID0gezB9OwogCXN0cnVjdCB1ZHBfbWVkaWFfYWRkciBsb2NhbCA9IHswfTsKIAlzdHJ1Y3QgdWRwX3BvcnRfY2ZnIHVkcF9jb25mID0gezB9OwogCXN0cnVjdCB1ZHBfdHVubmVsX3NvY2tfY2ZnIHR1bmNmZyA9IHtOVUxMfTsKKwlzdHJ1Y3QgbmxhdHRyICpvcHRzW1RJUENfTkxBX1VEUF9NQVggKyAxXTsKIAogCXViID0ga3phbGxvYyhzaXplb2YoKnViKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCF1YikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZW1vdGUgPSAoc3RydWN0IHVkcF9tZWRpYV9hZGRyICopJmItPmJjYXN0X2FkZHIudmFsdWU7Ci0JbWVtc2V0KHJlbW90ZSwgMCwgc2l6ZW9mKHN0cnVjdCB1ZHBfbWVkaWFfYWRkcikpOwotCWVyciA9IHBhcnNlX29wdGlvbnMoYXR0cnMsIHViLCAmbG9jYWwsIHJlbW90ZSk7CisJSU5JVF9MSVNUX0hFQUQoJnViLT5yY2FzdC5saXN0KTsKKworCWlmICghYXR0cnNbVElQQ19OTEFfQkVBUkVSX1VEUF9PUFRTXSkKKwkJZ290byBlcnI7CisKKwlpZiAobmxhX3BhcnNlX25lc3RlZChvcHRzLCBUSVBDX05MQV9VRFBfTUFYLAorCQkJICAgICBhdHRyc1tUSVBDX05MQV9CRUFSRVJfVURQX09QVFNdLAorCQkJICAgICB0aXBjX25sX3VkcF9wb2xpY3kpKQorCQlnb3RvIGVycjsKKworCWlmICghb3B0c1tUSVBDX05MQV9VRFBfTE9DQUxdIHx8ICFvcHRzW1RJUENfTkxBX1VEUF9SRU1PVEVdKSB7CisJCXByX2VycigiSW52YWxpZCBVRFAgYmVhcmVyIGNvbmZpZ3VyYXRpb24iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJZXJyID0gdGlwY19wYXJzZV91ZHBfYWRkcihvcHRzW1RJUENfTkxBX1VEUF9MT0NBTF0sICZsb2NhbCwKKwkJCQkgICZ1Yi0+aWZpbmRleCk7CisJaWYgKGVycikKKwkJZ290byBlcnI7CisKKwllcnIgPSB0aXBjX3BhcnNlX3VkcF9hZGRyKG9wdHNbVElQQ19OTEFfVURQX1JFTU9URV0sICZyZW1vdGUsIE5VTEwpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyOwogCkBAIC0zOTYsMTAgKzcxOSwyMiBAQAogCXR1bmNmZy5lbmNhcF9kZXN0cm95ID0gTlVMTDsKIAlzZXR1cF91ZHBfdHVubmVsX3NvY2sobmV0LCB1Yi0+dWJzb2NrLCAmdHVuY2ZnKTsKIAotCWlmIChlbmFibGVfbWNhc3QodWIsIHJlbW90ZSkpCisJLyoqCisJICogVGhlIGJjYXN0IG1lZGlhIGFkZHJlc3MgcG9ydCBpcyB1c2VkIGZvciBhbGwgcGVlcnMgYW5kIHRoZSBpcAorCSAqIGlzIHVzZWQgaWYgaXQncyBhIG11bHRpY2FzdCBhZGRyZXNzLgorCSAqLworCW1lbWNweSgmYi0+YmNhc3RfYWRkci52YWx1ZSwgJnJlbW90ZSwgc2l6ZW9mKHJlbW90ZSkpOworCWlmICh0aXBjX3VkcF9pc19tY2FzdF9hZGRyKCZyZW1vdGUpKQorCQllcnIgPSBlbmFibGVfbWNhc3QodWIsICZyZW1vdGUpOworCWVsc2UKKwkJZXJyID0gdGlwY191ZHBfcmNhc3RfYWRkKGIsICZyZW1vdGUpOworCWlmIChlcnIpCiAJCWdvdG8gZXJyOworCiAJcmV0dXJuIDA7CiBlcnI6CisJaWYgKHViLT51YnNvY2spCisJCXVkcF90dW5uZWxfc29ja19yZWxlYXNlKHViLT51YnNvY2spOwogCWtmcmVlKHViKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtNDA4LDYgKzc0MywxMiBAQAogc3RhdGljIHZvaWQgY2xlYW51cF9iZWFyZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCB1ZHBfYmVhcmVyICp1YiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdWRwX2JlYXJlciwgd29yayk7CisJc3RydWN0IHVkcF9yZXBsaWNhc3QgKnJjYXN0LCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJjYXN0LCB0bXAsICZ1Yi0+cmNhc3QubGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbF9yY3UoJnJjYXN0LT5saXN0KTsKKwkJa2ZyZWVfcmN1KHJjYXN0LCByY3UpOworCX0KIAogCWlmICh1Yi0+dWJzb2NrKQogCQl1ZHBfdHVubmVsX3NvY2tfcmVsZWFzZSh1Yi0+dWJzb2NrKTsKZGlmZiAtLWdpdCBhL25ldC90aXBjL3VkcF9tZWRpYS5oIGIvbmV0L3RpcGMvdWRwX21lZGlhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgxYmJhZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL3VkcF9tZWRpYS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBuZXQvdGlwYy91ZHBfbWVkaWEuaDogSW5jbHVkZSBmaWxlIGZvciBVRFAgYmVhcmVyIG1lZGlhCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDYsIDIwMTMtMjAxNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMC0yMDExLCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZmRlZiBDT05GSUdfVElQQ19NRURJQV9VRFAKKyNpZm5kZWYgX1RJUENfVURQX01FRElBX0gKKyNkZWZpbmUgX1RJUENfVURQX01FRElBX0gKKworaW50IHRpcGNfdWRwX25sX2JlYXJlcl9hZGQoc3RydWN0IHRpcGNfYmVhcmVyICpiLCBzdHJ1Y3QgbmxhdHRyICphdHRyKTsKK2ludCB0aXBjX3VkcF9ubF9hZGRfYmVhcmVyX2RhdGEoc3RydWN0IHRpcGNfbmxfbXNnICptc2csIHN0cnVjdCB0aXBjX2JlYXJlciAqYik7CitpbnQgdGlwY191ZHBfbmxfZHVtcF9yZW1vdGVpcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3VuaXgvYWZfdW5peC5jIGIvbmV0L3VuaXgvYWZfdW5peC5jCmluZGV4IGYxZGZmZTguLjgzMDk2ODcgMTAwNjQ0Ci0tLSBhL25ldC91bml4L2FmX3VuaXguYworKysgYi9uZXQvdW5peC9hZl91bml4LmMKQEAgLTY2MSwxMSArNjYxLDExIEBACiB7CiAJc3RydWN0IHVuaXhfc29jayAqdSA9IHVuaXhfc2soc2spOwogCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdS0+cmVhZGxvY2spKQorCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnUtPmlvbG9jaykpCiAJCXJldHVybiAtRUlOVFI7CiAKIAlzay0+c2tfcGVla19vZmYgPSB2YWw7Ci0JbXV0ZXhfdW5sb2NrKCZ1LT5yZWFkbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZ1LT5pb2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03NzksNyArNzc5LDggQEAKIAlzcGluX2xvY2tfaW5pdCgmdS0+bG9jayk7CiAJYXRvbWljX2xvbmdfc2V0KCZ1LT5pbmZsaWdodCwgMCk7CiAJSU5JVF9MSVNUX0hFQUQoJnUtPmxpbmspOwotCW11dGV4X2luaXQoJnUtPnJlYWRsb2NrKTsgLyogc2luZ2xlIHRhc2sgcmVhZGluZyBsb2NrICovCisJbXV0ZXhfaW5pdCgmdS0+aW9sb2NrKTsgLyogc2luZ2xlIHRhc2sgcmVhZGluZyBsb2NrICovCisJbXV0ZXhfaW5pdCgmdS0+YmluZGxvY2spOyAvKiBzaW5nbGUgdGFzayBiaW5kaW5nIGxvY2sgKi8KIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1LT5wZWVyX3dhaXQpOwogCWluaXRfd2FpdHF1ZXVlX2Z1bmNfZW50cnkoJnUtPnBlZXJfd2FrZSwgdW5peF9kZ3JhbV9wZWVyX3dha2VfcmVsYXkpOwogCXVuaXhfaW5zZXJ0X3NvY2tldCh1bml4X3NvY2tldHNfdW5ib3VuZChzayksIHNrKTsKQEAgLTg0OCw3ICs4NDksNyBAQAogCWludCBlcnI7CiAJdW5zaWduZWQgaW50IHJldHJpZXMgPSAwOwogCi0JZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ1LT5yZWFkbG9jayk7CisJZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ1LT5iaW5kbG9jayk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtODk1LDcgKzg5Niw3IEBACiAJc3Bpbl91bmxvY2soJnVuaXhfdGFibGVfbG9jayk7CiAJZXJyID0gMDsKIAotb3V0OgltdXRleF91bmxvY2soJnUtPnJlYWRsb2NrKTsKK291dDoJbXV0ZXhfdW5sb2NrKCZ1LT5iaW5kbG9jayk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtOTU0LDIwICs5NTUsMzIgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludCB1bml4X21rbm9kKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsIHVtb2RlX3QgbW9kZSwKLQkJICAgICAgc3RydWN0IHBhdGggKnJlcykKK3N0YXRpYyBpbnQgdW5peF9ta25vZChjb25zdCBjaGFyICpzdW5fcGF0aCwgdW1vZGVfdCBtb2RlLCBzdHJ1Y3QgcGF0aCAqcmVzKQogewotCWludCBlcnI7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBwYXRoIHBhdGg7CisJaW50IGVyciA9IDA7CisJLyoKKwkgKiBHZXQgdGhlIHBhcmVudCBkaXJlY3RvcnksIGNhbGN1bGF0ZSB0aGUgaGFzaCBmb3IgbGFzdAorCSAqIGNvbXBvbmVudC4KKwkgKi8KKwlkZW50cnkgPSBrZXJuX3BhdGhfY3JlYXRlKEFUX0ZEQ1dELCBzdW5fcGF0aCwgJnBhdGgsIDApOworCWVyciA9IFBUUl9FUlIoZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpCisJCXJldHVybiBlcnI7CiAKLQllcnIgPSBzZWN1cml0eV9wYXRoX21rbm9kKHBhdGgsIGRlbnRyeSwgbW9kZSwgMCk7CisJLyoKKwkgKiBBbGwgcmlnaHQsIGxldCdzIGNyZWF0ZSBpdC4KKwkgKi8KKwllcnIgPSBzZWN1cml0eV9wYXRoX21rbm9kKCZwYXRoLCBkZW50cnksIG1vZGUsIDApOwogCWlmICghZXJyKSB7Ci0JCWVyciA9IHZmc19ta25vZChkX2lub2RlKHBhdGgtPmRlbnRyeSksIGRlbnRyeSwgbW9kZSwgMCk7CisJCWVyciA9IHZmc19ta25vZChkX2lub2RlKHBhdGguZGVudHJ5KSwgZGVudHJ5LCBtb2RlLCAwKTsKIAkJaWYgKCFlcnIpIHsKLQkJCXJlcy0+bW50ID0gbW50Z2V0KHBhdGgtPm1udCk7CisJCQlyZXMtPm1udCA9IG1udGdldChwYXRoLm1udCk7CiAJCQlyZXMtPmRlbnRyeSA9IGRnZXQoZGVudHJ5KTsKIAkJfQogCX0KLQorCWRvbmVfcGF0aF9jcmVhdGUoJnBhdGgsIGRlbnRyeSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtOTc4LDEyICs5OTEsMTAgQEAKIAlzdHJ1Y3QgdW5peF9zb2NrICp1ID0gdW5peF9zayhzayk7CiAJc3RydWN0IHNvY2thZGRyX3VuICpzdW5hZGRyID0gKHN0cnVjdCBzb2NrYWRkcl91biAqKXVhZGRyOwogCWNoYXIgKnN1bl9wYXRoID0gc3VuYWRkci0+c3VuX3BhdGg7Ci0JaW50IGVyciwgbmFtZV9lcnI7CisJaW50IGVycjsKIAl1bnNpZ25lZCBpbnQgaGFzaDsKIAlzdHJ1Y3QgdW5peF9hZGRyZXNzICphZGRyOwogCXN0cnVjdCBobGlzdF9oZWFkICpsaXN0OwotCXN0cnVjdCBwYXRoIHBhdGg7Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCiAJZXJyID0gLUVJTlZBTDsKIAlpZiAoc3VuYWRkci0+c3VuX2ZhbWlseSAhPSBBRl9VTklYKQpAQCAtOTk5LDM0ICsxMDEwLDE0IEBACiAJCWdvdG8gb3V0OwogCWFkZHJfbGVuID0gZXJyOwogCi0JbmFtZV9lcnIgPSAwOwotCWRlbnRyeSA9IE5VTEw7Ci0JaWYgKHN1bl9wYXRoWzBdKSB7Ci0JCS8qIEdldCB0aGUgcGFyZW50IGRpcmVjdG9yeSwgY2FsY3VsYXRlIHRoZSBoYXNoIGZvciBsYXN0Ci0JCSAqIGNvbXBvbmVudC4KLQkJICovCi0JCWRlbnRyeSA9IGtlcm5fcGF0aF9jcmVhdGUoQVRfRkRDV0QsIHN1bl9wYXRoLCAmcGF0aCwgMCk7Ci0KLQkJaWYgKElTX0VSUihkZW50cnkpKSB7Ci0JCQkvKiBkZWxheSByZXBvcnQgdW50aWwgYWZ0ZXIgJ2FscmVhZHkgYm91bmQnIGNoZWNrICovCi0JCQluYW1lX2VyciA9IFBUUl9FUlIoZGVudHJ5KTsKLQkJCWRlbnRyeSA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQllcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnUtPnJlYWRsb2NrKTsKKwllcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnUtPmJpbmRsb2NrKTsKIAlpZiAoZXJyKQotCQlnb3RvIG91dF9wYXRoOworCQlnb3RvIG91dDsKIAogCWVyciA9IC1FSU5WQUw7CiAJaWYgKHUtPmFkZHIpCiAJCWdvdG8gb3V0X3VwOwogCi0JaWYgKG5hbWVfZXJyKSB7Ci0JCWVyciA9IG5hbWVfZXJyID09IC1FRVhJU1QgPyAtRUFERFJJTlVTRSA6IG5hbWVfZXJyOwotCQlnb3RvIG91dF91cDsKLQl9Ci0KIAllcnIgPSAtRU5PTUVNOwogCWFkZHIgPSBrbWFsbG9jKHNpemVvZigqYWRkcikrYWRkcl9sZW4sIEdGUF9LRVJORUwpOwogCWlmICghYWRkcikKQEAgLTEwMzcsMTEgKzEwMjgsMTEgQEAKIAlhZGRyLT5oYXNoID0gaGFzaCBeIHNrLT5za190eXBlOwogCWF0b21pY19zZXQoJmFkZHItPnJlZmNudCwgMSk7CiAKLQlpZiAoZGVudHJ5KSB7Ci0JCXN0cnVjdCBwYXRoIHVfcGF0aDsKKwlpZiAoc3VuX3BhdGhbMF0pIHsKKwkJc3RydWN0IHBhdGggcGF0aDsKIAkJdW1vZGVfdCBtb2RlID0gU19JRlNPQ0sgfAogCQkgICAgICAgKFNPQ0tfSU5PREUoc29jayktPmlfbW9kZSAmIH5jdXJyZW50X3VtYXNrKCkpOwotCQllcnIgPSB1bml4X21rbm9kKGRlbnRyeSwgJnBhdGgsIG1vZGUsICZ1X3BhdGgpOworCQllcnIgPSB1bml4X21rbm9kKHN1bl9wYXRoLCBtb2RlLCAmcGF0aCk7CiAJCWlmIChlcnIpIHsKIAkJCWlmIChlcnIgPT0gLUVFWElTVCkKIAkJCQllcnIgPSAtRUFERFJJTlVTRTsKQEAgLTEwNDksOSArMTA0MCw5IEBACiAJCQlnb3RvIG91dF91cDsKIAkJfQogCQlhZGRyLT5oYXNoID0gVU5JWF9IQVNIX1NJWkU7Ci0JCWhhc2ggPSBkX3JlYWxfaW5vZGUoZGVudHJ5KS0+aV9pbm8gJiAoVU5JWF9IQVNIX1NJWkUgLSAxKTsKKwkJaGFzaCA9IGRfcmVhbF9pbm9kZShwYXRoLmRlbnRyeSktPmlfaW5vICYgKFVOSVhfSEFTSF9TSVpFIC0gMSk7CiAJCXNwaW5fbG9jaygmdW5peF90YWJsZV9sb2NrKTsKLQkJdS0+cGF0aCA9IHVfcGF0aDsKKwkJdS0+cGF0aCA9IHBhdGg7CiAJCWxpc3QgPSAmdW5peF9zb2NrZXRfdGFibGVbaGFzaF07CiAJfSBlbHNlIHsKIAkJc3Bpbl9sb2NrKCZ1bml4X3RhYmxlX2xvY2spOwpAQCAtMTA3MywxMSArMTA2NCw3IEBACiBvdXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrKCZ1bml4X3RhYmxlX2xvY2spOwogb3V0X3VwOgotCW11dGV4X3VubG9jaygmdS0+cmVhZGxvY2spOwotb3V0X3BhdGg6Ci0JaWYgKGRlbnRyeSkKLQkJZG9uZV9wYXRoX2NyZWF0ZSgmcGF0aCwgZGVudHJ5KTsKLQorCW11dGV4X3VubG9jaygmdS0+YmluZGxvY2spOwogb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC0xOTY5LDE3ICsxOTU2LDE3IEBACiAJaWYgKGZhbHNlKSB7CiBhbGxvY19za2I6CiAJCXVuaXhfc3RhdGVfdW5sb2NrKG90aGVyKTsKLQkJbXV0ZXhfdW5sb2NrKCZ1bml4X3NrKG90aGVyKS0+cmVhZGxvY2spOworCQltdXRleF91bmxvY2soJnVuaXhfc2sob3RoZXIpLT5pb2xvY2spOwogCQluZXdza2IgPSBzb2NrX2FsbG9jX3NlbmRfcHNrYihzaywgMCwgMCwgZmxhZ3MgJiBNU0dfRE9OVFdBSVQsCiAJCQkJCSAgICAgICZlcnIsIDApOwogCQlpZiAoIW5ld3NrYikKIAkJCWdvdG8gZXJyOwogCX0KIAotCS8qIHdlIG11c3QgYWNxdWlyZSByZWFkbG9jayBhcyB3ZSBtb2RpZnkgYWxyZWFkeSBwcmVzZW50CisJLyogd2UgbXVzdCBhY3F1aXJlIGlvbG9jayBhcyB3ZSBtb2RpZnkgYWxyZWFkeSBwcmVzZW50CiAJICogc2ticyBpbiB0aGUgc2tfcmVjZWl2ZV9xdWV1ZSBhbmQgbWVzcyB3aXRoIHNrYi0+bGVuCiAJICovCi0JZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ1bml4X3NrKG90aGVyKS0+cmVhZGxvY2spOworCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdW5peF9zayhvdGhlciktPmlvbG9jayk7CiAJaWYgKGVycikgewogCQllcnIgPSBmbGFncyAmIE1TR19ET05UV0FJVCA/IC1FQUdBSU4gOiAtRVJFU1RBUlRTWVM7CiAJCWdvdG8gZXJyOwpAQCAtMjA0Niw3ICsyMDMzLDcgQEAKIAl9CiAKIAl1bml4X3N0YXRlX3VubG9jayhvdGhlcik7Ci0JbXV0ZXhfdW5sb2NrKCZ1bml4X3NrKG90aGVyKS0+cmVhZGxvY2spOworCW11dGV4X3VubG9jaygmdW5peF9zayhvdGhlciktPmlvbG9jayk7CiAKIAlvdGhlci0+c2tfZGF0YV9yZWFkeShvdGhlcik7CiAJc2NtX2Rlc3Ryb3koJnNjbSk7CkBAIC0yMDU1LDcgKzIwNDIsNyBAQAogZXJyX3N0YXRlX3VubG9jazoKIAl1bml4X3N0YXRlX3VubG9jayhvdGhlcik7CiBlcnJfdW5sb2NrOgotCW11dGV4X3VubG9jaygmdW5peF9zayhvdGhlciktPnJlYWRsb2NrKTsKKwltdXRleF91bmxvY2soJnVuaXhfc2sob3RoZXIpLT5pb2xvY2spOwogZXJyOgogCWtmcmVlX3NrYihuZXdza2IpOwogCWlmIChzZW5kX3NpZ3BpcGUgJiYgIShmbGFncyAmIE1TR19OT1NJR05BTCkpCkBAIC0yMTIzLDcgKzIxMTAsNyBAQAogCXRpbWVvID0gc29ja19yY3Z0aW1lbyhzaywgZmxhZ3MgJiBNU0dfRE9OVFdBSVQpOwogCiAJZG8gewotCQltdXRleF9sb2NrKCZ1LT5yZWFkbG9jayk7CisJCW11dGV4X2xvY2soJnUtPmlvbG9jayk7CiAKIAkJc2tpcCA9IHNrX3BlZWtfb2Zmc2V0KHNrLCBmbGFncyk7CiAJCXNrYiA9IF9fc2tiX3RyeV9yZWN2X2RhdGFncmFtKHNrLCBmbGFncywgJnBlZWtlZCwgJnNraXAsICZlcnIsCkBAIC0yMTMxLDE0ICsyMTE4LDE0IEBACiAJCWlmIChza2IpCiAJCQlicmVhazsKIAotCQltdXRleF91bmxvY2soJnUtPnJlYWRsb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1LT5pb2xvY2spOwogCiAJCWlmIChlcnIgIT0gLUVBR0FJTikKIAkJCWJyZWFrOwogCX0gd2hpbGUgKHRpbWVvICYmCiAJCSAhX19za2Jfd2FpdF9mb3JfbW9yZV9wYWNrZXRzKHNrLCAmZXJyLCAmdGltZW8sIGxhc3QpKTsKIAotCWlmICghc2tiKSB7IC8qIGltcGxpZXMgcmVhZGxvY2sgdW5sb2NrZWQgKi8KKwlpZiAoIXNrYikgeyAvKiBpbXBsaWVzIGlvbG9jayB1bmxvY2tlZCAqLwogCQl1bml4X3N0YXRlX2xvY2soc2spOwogCQkvKiBTaWduYWwgRU9GIG9uIGRpc2Nvbm5lY3RlZCBub24tYmxvY2tpbmcgU0VRUEFDS0VUIHNvY2tldC4gKi8KIAkJaWYgKHNrLT5za190eXBlID09IFNPQ0tfU0VRUEFDS0VUICYmIGVyciA9PSAtRUFHQUlOICYmCkBAIC0yMjAzLDcgKzIxOTAsNyBAQAogCiBvdXRfZnJlZToKIAlza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTsKLQltdXRleF91bmxvY2soJnUtPnJlYWRsb2NrKTsKKwltdXRleF91bmxvY2soJnUtPmlvbG9jayk7CiBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KQEAgLTIyOTgsNyArMjI4NSw3IEBACiAJLyogTG9jayB0aGUgc29ja2V0IHRvIHByZXZlbnQgcXVldWUgZGlzb3JkZXJpbmcKIAkgKiB3aGlsZSBzbGVlcHMgaW4gbWVtY3B5X3RvbXNnCiAJICovCi0JbXV0ZXhfbG9jaygmdS0+cmVhZGxvY2spOworCW11dGV4X2xvY2soJnUtPmlvbG9jayk7CiAKIAlpZiAoZmxhZ3MgJiBNU0dfUEVFSykKIAkJc2tpcCA9IHNrX3BlZWtfb2Zmc2V0KHNrLCBmbGFncyk7CkBAIC0yMzQwLDcgKzIzMjcsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCi0JCQltdXRleF91bmxvY2soJnUtPnJlYWRsb2NrKTsKKwkJCW11dGV4X3VubG9jaygmdS0+aW9sb2NrKTsKIAogCQkJdGltZW8gPSB1bml4X3N0cmVhbV9kYXRhX3dhaXQoc2ssIHRpbWVvLCBsYXN0LAogCQkJCQkJICAgICAgbGFzdF9sZW4pOwpAQCAtMjM1MSw3ICsyMzM4LDcgQEAKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAotCQkJbXV0ZXhfbG9jaygmdS0+cmVhZGxvY2spOworCQkJbXV0ZXhfbG9jaygmdS0+aW9sb2NrKTsKIAkJCWdvdG8gcmVkbzsKIHVubG9jazoKIAkJCXVuaXhfc3RhdGVfdW5sb2NrKHNrKTsKQEAgLTI0NTQsNyArMjQ0MSw3IEBACiAJCX0KIAl9IHdoaWxlIChzaXplKTsKIAotCW11dGV4X3VubG9jaygmdS0+cmVhZGxvY2spOworCW11dGV4X3VubG9jaygmdS0+aW9sb2NrKTsKIAlpZiAoc3RhdGUtPm1zZykKIAkJc2NtX3JlY3Yoc29jaywgc3RhdGUtPm1zZywgJnNjbSwgZmxhZ3MpOwogCWVsc2UKQEAgLTI0OTUsOSArMjQ4Miw5IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgdW5peF9zb2NrICp1ID0gdW5peF9zayhzayk7CiAKLQltdXRleF91bmxvY2soJnUtPnJlYWRsb2NrKTsKKwltdXRleF91bmxvY2soJnUtPmlvbG9jayk7CiAJcmV0ID0gc3BsaWNlX3RvX3BpcGUocGlwZSwgc3BkKTsKLQltdXRleF9sb2NrKCZ1LT5yZWFkbG9jayk7CisJbXV0ZXhfbG9jaygmdS0+aW9sb2NrKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9uZXQvdm13X3Zzb2NrL2FmX3Zzb2NrLmMgYi9uZXQvdm13X3Zzb2NrL2FmX3Zzb2NrLmMKaW5kZXggMTdkYmJlNi4uOGEzOThiMyAxMDA2NDQKLS0tIGEvbmV0L3Ztd192c29jay9hZl92c29jay5jCisrKyBiL25ldC92bXdfdnNvY2svYWZfdnNvY2suYwpAQCAtNDY1LDYgKzQ2NSw4IEBACiAKIAlpZiAodnNvY2tfaXNfcGVuZGluZyhzaykpIHsKIAkJdnNvY2tfcmVtb3ZlX3BlbmRpbmcobGlzdGVuZXIsIHNrKTsKKworCQlsaXN0ZW5lci0+c2tfYWNrX2JhY2tsb2ctLTsKIAl9IGVsc2UgaWYgKCF2c2stPnJlamVjdGVkKSB7CiAJCS8qIFdlIGFyZSBub3Qgb24gdGhlIHBlbmRpbmcgbGlzdCBhbmQgYWNjZXB0KCkgZGlkIG5vdCByZWplY3QKIAkJICogdXMsIHNvIHdlIG11c3QgaGF2ZSBiZWVuIGFjY2VwdGVkIGJ5IG91ciB1c2VyIHByb2Nlc3MuICBXZQpAQCAtNDc1LDggKzQ3Nyw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWxpc3RlbmVyLT5za19hY2tfYmFja2xvZy0tOwotCiAJLyogV2UgbmVlZCB0byByZW1vdmUgb3Vyc2VsZiBmcm9tIHRoZSBnbG9iYWwgY29ubmVjdGVkIHNvY2tldHMgbGlzdCBzbwogCSAqIGluY29taW5nIHBhY2tldHMgY2FuJ3QgZmluZCB0aGlzIHNvY2tldCwgYW5kIHRvIHJlZHVjZSB0aGUgcmVmZXJlbmNlCiAJICogY291bnQuCkBAIC0yMDEwLDUgKzIwMTAsNSBAQAogCiBNT0RVTEVfQVVUSE9SKCJWTXdhcmUsIEluYy4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVk13YXJlIFZpcnR1YWwgU29ja2V0IEZhbWlseSIpOwotTU9EVUxFX1ZFUlNJT04oIjEuMC4xLjAtayIpOworTU9EVUxFX1ZFUlNJT04oIjEuMC4yLjAtayIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvbmV0L3Ztd192c29jay92aXJ0aW9fdHJhbnNwb3J0LmMgYi9uZXQvdm13X3Zzb2NrL3ZpcnRpb190cmFuc3BvcnQuYwppbmRleCA2OTlkZmFiLi45MzZkN2VlIDEwMDY0NAotLS0gYS9uZXQvdm13X3Zzb2NrL3ZpcnRpb190cmFuc3BvcnQuYworKysgYi9uZXQvdm13X3Zzb2NrL3ZpcnRpb190cmFuc3BvcnQuYwpAQCAtODcsOSArODcsNiBAQAogCiAJdnEgPSB2c29jay0+dnFzW1ZTT0NLX1ZRX1RYXTsKIAotCS8qIEF2b2lkIHVubmVjZXNzYXJ5IGludGVycnVwdHMgd2hpbGUgd2UncmUgcHJvY2Vzc2luZyB0aGUgcmluZyAqLwotCXZpcnRxdWV1ZV9kaXNhYmxlX2NiKHZxKTsKLQogCWZvciAoOzspIHsKIAkJc3RydWN0IHZpcnRpb192c29ja19wa3QgKnBrdDsKIAkJc3RydWN0IHNjYXR0ZXJsaXN0IGhkciwgYnVmLCAqc2dzWzJdOwpAQCAtOTksNyArOTYsNiBAQAogCQlzcGluX2xvY2tfYmgoJnZzb2NrLT5zZW5kX3BrdF9saXN0X2xvY2spOwogCQlpZiAobGlzdF9lbXB0eSgmdnNvY2stPnNlbmRfcGt0X2xpc3QpKSB7CiAJCQlzcGluX3VubG9ja19iaCgmdnNvY2stPnNlbmRfcGt0X2xpc3RfbG9jayk7Ci0JCQl2aXJ0cXVldWVfZW5hYmxlX2NiKHZxKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTExOCwxMyArMTE0LDEzIEBACiAJCX0KIAogCQlyZXQgPSB2aXJ0cXVldWVfYWRkX3Nncyh2cSwgc2dzLCBvdXRfc2csIGluX3NnLCBwa3QsIEdGUF9LRVJORUwpOworCQkvKiBVc3VhbGx5IHRoaXMgbWVhbnMgdGhhdCB0aGVyZSBpcyBubyBtb3JlIHNwYWNlIGF2YWlsYWJsZSBpbgorCQkgKiB0aGUgdnEKKwkJICovCiAJCWlmIChyZXQgPCAwKSB7CiAJCQlzcGluX2xvY2tfYmgoJnZzb2NrLT5zZW5kX3BrdF9saXN0X2xvY2spOwogCQkJbGlzdF9hZGQoJnBrdC0+bGlzdCwgJnZzb2NrLT5zZW5kX3BrdF9saXN0KTsKIAkJCXNwaW5fdW5sb2NrX2JoKCZ2c29jay0+c2VuZF9wa3RfbGlzdF9sb2NrKTsKLQotCQkJaWYgKCF2aXJ0cXVldWVfZW5hYmxlX2NiKHZxKSAmJiByZXQgPT0gLUVOT1NQQykKLQkJCQljb250aW51ZTsgLyogcmV0cnkgbm93IHRoYXQgd2UgaGF2ZSBtb3JlIHNwYWNlICovCiAJCQlicmVhazsKIAkJfQogCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvY2hhbi5jIGIvbmV0L3dpcmVsZXNzL2NoYW4uYwppbmRleCBiMGUxMWI2Li41NDk3ZDAyMiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL2NoYW4uYworKysgYi9uZXQvd2lyZWxlc3MvY2hhbi5jCkBAIC0zNzIsNiArMzcyLDcgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9XRFM6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOgogCWNhc2UgTlVNX05MODAyMTFfSUZUWVBFUzoKQEAgLTUxMyw2ICs1MTQsNyBAQAogCQlyID0gY2ZnODAyMTFfZ2V0X2NoYW5zX2Rmc19hdmFpbGFibGUod2lwaHksCiAJCQkJCQkgICAgIGNoYW5kZWYtPmNlbnRlcl9mcmVxMiwKIAkJCQkJCSAgICAgd2lkdGgpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlXQVJOX09OKGNoYW5kZWYtPmNlbnRlcl9mcmVxMik7CiAJCWJyZWFrOwpAQCAtOTQ1LDYgKzk0Nyw3IEBACiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfV0RTOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAkJLyogdGhlc2UgaW50ZXJmYWNlIHR5cGVzIGRvbid0IHJlYWxseSBoYXZlIGEgY2hhbm5lbCAqLwogCQlyZXR1cm47CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDoKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9jb3JlLmMgYi9uZXQvd2lyZWxlc3MvY29yZS5jCmluZGV4IDc2NDVlOTcuLjgyMDFlNmQgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9jb3JlLmMKKysrIGIvbmV0L3dpcmVsZXNzL2NvcmUuYwpAQCAtMjI1LDYgKzIyNSwyMyBAQAogCX0KIH0KIAordm9pZCBjZmc4MDIxMV9zdG9wX25hbihzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCSAgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQoreworCUFTU0VSVF9SVE5MKCk7CisKKwlpZiAoV0FSTl9PTih3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKSkKKwkJcmV0dXJuOworCisJaWYgKCF3ZGV2LT5uYW5fc3RhcnRlZCkKKwkJcmV0dXJuOworCisJcmRldl9zdG9wX25hbihyZGV2LCB3ZGV2KTsKKwl3ZGV2LT5uYW5fc3RhcnRlZCA9IGZhbHNlOworCisJcmRldi0+b3BlbmNvdW50LS07Cit9CisKIHZvaWQgY2ZnODAyMTFfc2h1dGRvd25fYWxsX2ludGVyZmFjZXMoc3RydWN0IHdpcGh5ICp3aXBoeSkKIHsKIAlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKQEAgLTI0Miw2ICsyNTksOSBAQAogCQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CiAJCQljZmc4MDIxMV9zdG9wX3AycF9kZXZpY2UocmRldiwgd2Rldik7CiAJCQlicmVhazsKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CisJCQljZmc4MDIxMV9zdG9wX25hbihyZGV2LCB3ZGV2KTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KQEAgLTUzNyw2ICs1NTcsMTEgQEAKIAkJCQkgICAgYy0+bGltaXRzW2pdLm1heCA+IDEpKQogCQkJCXJldHVybiAtRUlOVkFMOwogCisJCQkvKiBPbmx5IGEgc2luZ2xlIE5BTiBjYW4gYmUgYWxsb3dlZCAqLworCQkJaWYgKFdBUk5fT04odHlwZXMgJiBCSVQoTkw4MDIxMV9JRlRZUEVfTkFOKSAmJgorCQkJCSAgICBjLT5saW1pdHNbal0ubWF4ID4gMSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKIAkJCWNudCArPSBjLT5saW1pdHNbal0ubWF4OwogCQkJLyoKIAkJCSAqIERvbid0IGFkdmVydGlzZSBhbiB1bnN1cHBvcnRlZCB0eXBlCkBAIC01NzksNiArNjA0LDExIEBACiAJCSAgICAgIXJkZXYtPm9wcy0+dGRsc19jYW5jZWxfY2hhbm5lbF9zd2l0Y2gpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoV0FSTl9PTigod2lwaHktPmludGVyZmFjZV9tb2RlcyAmIEJJVChOTDgwMjExX0lGVFlQRV9OQU4pKSAmJgorCQkgICAgKCFyZGV2LT5vcHMtPnN0YXJ0X25hbiB8fCAhcmRldi0+b3BzLT5zdG9wX25hbiB8fAorCQkgICAgICFyZGV2LT5vcHMtPmFkZF9uYW5fZnVuYyB8fCAhcmRldi0+b3BzLT5kZWxfbmFuX2Z1bmMpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkvKgogCSAqIGlmIGEgd2lwaHkgaGFzIHVuc3VwcG9ydGVkIG1vZGVzIGZvciByZWd1bGF0b3J5IGNoYW5uZWwgZW5mb3JjZW1lbnQsCiAJICogb3B0LW91dCBvZiBlbmZvcmNlbWVudCBjaGVja2luZwpAQCAtNTg5LDYgKzYxOSw3IEBACiAJCQkJICAgICAgIEJJVChOTDgwMjExX0lGVFlQRV9QMlBfR08pIHwKIAkJCQkgICAgICAgQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKSB8CiAJCQkJICAgICAgIEJJVChOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFKSB8CisJCQkJICAgICAgIEJJVChOTDgwMjExX0lGVFlQRV9OQU4pIHwKIAkJCQkgICAgICAgQklUKE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pIHwKIAkJCQkgICAgICAgQklUKE5MODAyMTFfSUZUWVBFX01PTklUT1IpKSkKIAkJd2lwaHktPnJlZ3VsYXRvcnlfZmxhZ3MgfD0gUkVHVUxBVE9SWV9JR05PUkVfU1RBTEVfS0lDS09GRjsKQEAgLTkwNiw2ICs5MzcsOCBAQAogCWlmIChXQVJOX09OKHdkZXYtPm5ldGRldikpCiAJCXJldHVybjsKIAorCW5sODAyMTFfbm90aWZ5X2lmYWNlKHJkZXYsIHdkZXYsIE5MODAyMTFfQ01EX0RFTF9JTlRFUkZBQ0UpOworCiAJbGlzdF9kZWxfcmN1KCZ3ZGV2LT5saXN0KTsKIAlyZGV2LT5kZXZsaXN0X2dlbmVyYXRpb24rKzsKIApAQCAtOTE0LDYgKzk0Nyw5IEBACiAJCWNmZzgwMjExX21sbWVfcHVyZ2VfcmVnaXN0cmF0aW9ucyh3ZGV2KTsKIAkJY2ZnODAyMTFfc3RvcF9wMnBfZGV2aWNlKHJkZXYsIHdkZXYpOwogCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKKwkJY2ZnODAyMTFfc3RvcF9uYW4ocmRldiwgd2Rldik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVdBUk5fT05fT05DRSgxKTsKIAkJYnJlYWs7CkBAIC05NzcsNiArMTAxMyw3IEBACiAJCS8qIG11c3QgYmUgaGFuZGxlZCBieSBtYWM4MDIxMS9kcml2ZXIsIGhhcyBubyBBUElzICovCiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAkJLyogY2Fubm90IGhhcHBlbiwgaGFzIG5vIG5ldGRldiAqLwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CkBAIC0xMDc5LDYgKzExMTYsOCBAQAogCQkgICAgIHdkZXYtPmlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UIHx8CiAJCSAgICAgd2Rldi0+aWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSAmJiAhd2Rldi0+dXNlXzRhZGRyKQogCQkJZGV2LT5wcml2X2ZsYWdzIHw9IElGRl9ET05UX0JSSURHRTsKKworCQlubDgwMjExX25vdGlmeV9pZmFjZShyZGV2LCB3ZGV2LCBOTDgwMjExX0NNRF9ORVdfSU5URVJGQUNFKTsKIAkJYnJlYWs7CiAJY2FzZSBORVRERVZfR09JTkdfRE9XTjoKIAkJY2ZnODAyMTFfbGVhdmUocmRldiwgd2Rldik7CkBAIC0xMTU3LDYgKzExOTYsOCBAQAogCQkgKiByZW1vdmUgYW5kIGNsZWFuIGl0IHVwLgogCQkgKi8KIAkJaWYgKCFsaXN0X2VtcHR5KCZ3ZGV2LT5saXN0KSkgeworCQkJbmw4MDIxMV9ub3RpZnlfaWZhY2UocmRldiwgd2RldiwKKwkJCQkJICAgICBOTDgwMjExX0NNRF9ERUxfSU5URVJGQUNFKTsKIAkJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmRldi5rb2JqLCAicGh5ODAyMTEiKTsKIAkJCWxpc3RfZGVsX3JjdSgmd2Rldi0+bGlzdCk7CiAJCQlyZGV2LT5kZXZsaXN0X2dlbmVyYXRpb24rKzsKQEAgLTEyNDYsNyArMTI4Nyw3IEBACiAJaWYgKGVycikKIAkJZ290byBvdXRfZmFpbF9yZWc7CiAKLQljZmc4MDIxMV93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJjZmc4MDIxMSIpOworCWNmZzgwMjExX3dxID0gYWxsb2Nfb3JkZXJlZF93b3JrcXVldWUoImNmZzgwMjExIiwgV1FfTUVNX1JFQ0xBSU0pOwogCWlmICghY2ZnODAyMTFfd3EpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXRfZmFpbF93cTsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9jb3JlLmggYi9uZXQvd2lyZWxlc3MvY29yZS5oCmluZGV4IGVlZTkxNDQuLjA4ZDJlOTQgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9jb3JlLmgKKysrIGIvbmV0L3dpcmVsZXNzL2NvcmUuaApAQCAtMjQ5LDkgKzI0OSw5IEBACiB9OwogCiBzdHJ1Y3QgY2ZnODAyMTFfY2FjaGVkX2tleXMgewotCXN0cnVjdCBrZXlfcGFyYW1zIHBhcmFtc1s2XTsKLQl1OCBkYXRhWzZdW1dMQU5fTUFYX0tFWV9MRU5dOwotCWludCBkZWYsIGRlZm1nbXQ7CisJc3RydWN0IGtleV9wYXJhbXMgcGFyYW1zW0NGRzgwMjExX01BWF9XRVBfS0VZU107CisJdTggZGF0YVtDRkc4MDIxMV9NQVhfV0VQX0tFWVNdW1dMQU5fS0VZX0xFTl9XRVAxMDRdOworCWludCBkZWY7CiB9OwogCiBlbnVtIGNmZzgwMjExX2NoYW5fbW9kZSB7CkBAIC00ODgsNiArNDg4LDkgQEAKIHZvaWQgY2ZnODAyMTFfc3RvcF9wMnBfZGV2aWNlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJCSAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpOwogCit2b2lkIGNmZzgwMjExX3N0b3BfbmFuKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJICAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpOworCiAjZGVmaW5lIENGRzgwMjExX01BWF9OVU1fRElGRkVSRU5UX0NIQU5ORUxTIDEwCiAKICNpZmRlZiBDT05GSUdfQ0ZHODAyMTFfREVWRUxPUEVSX1dBUk5JTkdTCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvaWJzcy5jIGIvbmV0L3dpcmVsZXNzL2lic3MuYwppbmRleCA0YTRkZGE1Li4zNjRmOTAwIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvaWJzcy5jCisrKyBiL25ldC93aXJlbGVzcy9pYnNzLmMKQEAgLTQzLDcgKzQzLDggQEAKIAljZmc4MDIxMV9ob2xkX2Jzcyhic3NfZnJvbV9wdWIoYnNzKSk7CiAJd2Rldi0+Y3VycmVudF9ic3MgPSBic3NfZnJvbV9wdWIoYnNzKTsKIAotCWNmZzgwMjExX3VwbG9hZF9jb25uZWN0X2tleXMod2Rldik7CisJaWYgKCEod2Rldi0+d2lwaHktPmZsYWdzICYgV0lQSFlfRkxBR19IQVNfU1RBVElDX1dFUCkpCisJCWNmZzgwMjExX3VwbG9hZF9jb25uZWN0X2tleXMod2Rldik7CiAKIAlubDgwMjExX3NlbmRfaWJzc19ic3NpZCh3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KSwgZGV2LCBic3NpZCwKIAkJCQlHRlBfS0VSTkVMKTsKQEAgLTExNCw2ICsxMTUsOSBAQAogCQl9CiAJfQogCisJaWYgKFdBUk5fT04oY29ubmtleXMgJiYgY29ubmtleXMtPmRlZiA8IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChXQVJOX09OKHdkZXYtPmNvbm5lY3Rfa2V5cykpCiAJCWt6ZnJlZSh3ZGV2LT5jb25uZWN0X2tleXMpOwogCXdkZXYtPmNvbm5lY3Rfa2V5cyA9IGNvbm5rZXlzOwpAQCAtMjg0LDE4ICsyODgsMTYgQEAKIAlpZiAoIW5ldGlmX3J1bm5pbmcod2Rldi0+bmV0ZGV2KSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAod2Rldi0+d2V4dC5rZXlzKSB7CisJaWYgKHdkZXYtPndleHQua2V5cykKIAkJd2Rldi0+d2V4dC5rZXlzLT5kZWYgPSB3ZGV2LT53ZXh0LmRlZmF1bHRfa2V5OwotCQl3ZGV2LT53ZXh0LmtleXMtPmRlZm1nbXQgPSB3ZGV2LT53ZXh0LmRlZmF1bHRfbWdtdF9rZXk7Ci0JfQogCiAJd2Rldi0+d2V4dC5pYnNzLnByaXZhY3kgPSB3ZGV2LT53ZXh0LmRlZmF1bHRfa2V5ICE9IC0xOwogCi0JaWYgKHdkZXYtPndleHQua2V5cykgeworCWlmICh3ZGV2LT53ZXh0LmtleXMgJiYgd2Rldi0+d2V4dC5rZXlzLT5kZWYgIT0gLTEpIHsKIAkJY2sgPSBrbWVtZHVwKHdkZXYtPndleHQua2V5cywgc2l6ZW9mKCpjayksIEdGUF9LRVJORUwpOwogCQlpZiAoIWNrKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBDRkc4MDIxMV9NQVhfV0VQX0tFWVM7IGkrKykKIAkJCWNrLT5wYXJhbXNbaV0ua2V5ID0gY2stPmRhdGFbaV07CiAJfQogCWVyciA9IF9fY2ZnODAyMTFfam9pbl9pYnNzKHJkZXYsIHdkZXYtPm5ldGRldiwKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9tbG1lLmMgYi9uZXQvd2lyZWxlc3MvbWxtZS5jCmluZGV4IGMyODRkODguLmNiYjQ4ZTIgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9tbG1lLmMKKysrIGIvbmV0L3dpcmVsZXNzL21sbWUuYwpAQCAtMjIyLDcgKzIyMiw3IEBACiAJQVNTRVJUX1dERVZfTE9DSyh3ZGV2KTsKIAogCWlmIChhdXRoX3R5cGUgPT0gTkw4MDIxMV9BVVRIVFlQRV9TSEFSRURfS0VZKQotCQlpZiAoIWtleSB8fCAha2V5X2xlbiB8fCBrZXlfaWR4IDwgMCB8fCBrZXlfaWR4ID4gNCkKKwkJaWYgKCFrZXkgfHwgIWtleV9sZW4gfHwga2V5X2lkeCA8IDAgfHwga2V5X2lkeCA+IDMpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh3ZGV2LT5jdXJyZW50X2JzcyAmJgpAQCAtNjM0LDYgKzYzNCw3IEBACiAJCQkgKiBmYWxsIHRocm91Z2gsIFAyUCBkZXZpY2Ugb25seSBzdXBwb3J0cwogCQkJICogcHVibGljIGFjdGlvbiBmcmFtZXMKIAkJCSAqLworCQljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAkJZGVmYXVsdDoKIAkJCWVyciA9IC1FT1BOT1RTVVBQOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuYwppbmRleCA0NjQxN2Y5Li5jNTEwODEwIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCisrKyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmMKQEAgLTU2LDYgKzU2LDcgQEAKIAlOTDgwMjExX01DR1JQX1JFR1VMQVRPUlksCiAJTkw4MDIxMV9NQ0dSUF9NTE1FLAogCU5MODAyMTFfTUNHUlBfVkVORE9SLAorCU5MODAyMTFfTUNHUlBfTkFOLAogCU5MODAyMTFfTUNHUlBfVEVTVE1PREUgLyoga2VlcCBsYXN0IC0gaWZkZWYhICovCiB9OwogCkBAIC02NSw2ICs2Niw3IEBACiAJW05MODAyMTFfTUNHUlBfUkVHVUxBVE9SWV0gPSB7IC5uYW1lID0gTkw4MDIxMV9NVUxUSUNBU1RfR1JPVVBfUkVHIH0sCiAJW05MODAyMTFfTUNHUlBfTUxNRV0gPSB7IC5uYW1lID0gTkw4MDIxMV9NVUxUSUNBU1RfR1JPVVBfTUxNRSB9LAogCVtOTDgwMjExX01DR1JQX1ZFTkRPUl0gPSB7IC5uYW1lID0gTkw4MDIxMV9NVUxUSUNBU1RfR1JPVVBfVkVORE9SIH0sCisJW05MODAyMTFfTUNHUlBfTkFOXSA9IHsgLm5hbWUgPSBOTDgwMjExX01VTFRJQ0FTVF9HUk9VUF9OQU4gfSwKICNpZmRlZiBDT05GSUdfTkw4MDIxMV9URVNUTU9ERQogCVtOTDgwMjExX01DR1JQX1RFU1RNT0RFXSA9IHsgLm5hbWUgPSBOTDgwMjExX01VTFRJQ0FTVF9HUk9VUF9URVNUTU9ERSB9CiAjZW5kaWYKQEAgLTQwOSw2ICs0MTEsOSBAQAogCQkubGVuID0gVkhUX01VTUlNT19HUk9VUFNfREFUQV9MRU4KIAl9LAogCVtOTDgwMjExX0FUVFJfTVVfTUlNT19GT0xMT1dfTUFDX0FERFJdID0geyAubGVuID0gRVRIX0FMRU4gfSwKKwlbTkw4MDIxMV9BVFRSX05BTl9NQVNURVJfUFJFRl0gPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW05MODAyMTFfQVRUUl9OQU5fRFVBTF0gPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW05MODAyMTFfQVRUUl9OQU5fRlVOQ10gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAogfTsKIAogLyogcG9saWN5IGZvciB0aGUga2V5IGF0dHJpYnV0ZXMgKi8KQEAgLTUwMiw2ICs1MDcsMzkgQEAKIAl9LAogfTsKIAorLyogcG9saWN5IGZvciBOQU4gZnVuY3Rpb24gYXR0cmlidXRlcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5CitubDgwMjExX25hbl9mdW5jX3BvbGljeVtOTDgwMjExX05BTl9GVU5DX0FUVFJfTUFYICsgMV0gPSB7CisJW05MODAyMTFfTkFOX0ZVTkNfVFlQRV0gPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW05MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JRF0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKKwkJCQkgICAgLmxlbiA9IE5MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JRF9MRU4gfSwKKwlbTkw4MDIxMV9OQU5fRlVOQ19QVUJMSVNIX1RZUEVdID0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtOTDgwMjExX05BTl9GVU5DX1BVQkxJU0hfQkNBU1RdID0geyAudHlwZSA9IE5MQV9GTEFHIH0sCisJW05MODAyMTFfTkFOX0ZVTkNfU1VCU0NSSUJFX0FDVElWRV0gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKKwlbTkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVBfSURdID0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUF9SRVFfSURdID0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUF9ERVNUXSA9IHsgLmxlbiA9IEVUSF9BTEVOIH0sCisJW05MODAyMTFfTkFOX0ZVTkNfQ0xPU0VfUkFOR0VdID0geyAudHlwZSA9IE5MQV9GTEFHIH0sCisJW05MODAyMTFfTkFOX0ZVTkNfVFRMXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JTkZPXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLAorCQkJLmxlbiA9IE5MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9TUEVDX0lORk9fTUFYX0xFTiB9LAorCVtOTDgwMjExX05BTl9GVU5DX1NSRl0gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAorCVtOTDgwMjExX05BTl9GVU5DX1JYX01BVENIX0ZJTFRFUl0gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAorCVtOTDgwMjExX05BTl9GVU5DX1RYX01BVENIX0ZJTFRFUl0gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAorCVtOTDgwMjExX05BTl9GVU5DX0lOU1RBTkNFX0lEXSA9IHsgLnR5cGUgPSBOTEFfVTggfSwKKwlbTkw4MDIxMV9OQU5fRlVOQ19URVJNX1JFQVNPTl0gPSB7IC50eXBlID0gTkxBX1U4IH0sCit9OworCisvKiBwb2xpY3kgZm9yIFNlcnZpY2UgUmVzcG9uc2UgRmlsdGVyIGF0dHJpYnV0ZXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeQorbmw4MDIxMV9uYW5fc3JmX3BvbGljeVtOTDgwMjExX05BTl9TUkZfQVRUUl9NQVggKyAxXSA9IHsKKwlbTkw4MDIxMV9OQU5fU1JGX0lOQ0xVREVdID0geyAudHlwZSA9IE5MQV9GTEFHIH0sCisJW05MODAyMTFfTkFOX1NSRl9CRl0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKKwkJCQkgLmxlbiA9ICBOTDgwMjExX05BTl9GVU5DX1NSRl9NQVhfTEVOIH0sCisJW05MODAyMTFfTkFOX1NSRl9CRl9JRFhdID0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtOTDgwMjExX05BTl9TUkZfTUFDX0FERFJTXSA9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCit9OworCiBzdGF0aWMgaW50IG5sODAyMTFfcHJlcGFyZV93ZGV2X2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJCQkgICAgIHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqKnJkZXYsCkBAIC04NDgsMTMgKzg4NiwyMSBAQAogCXN0cnVjdCBubGF0dHIgKmtleTsKIAlzdHJ1Y3QgY2ZnODAyMTFfY2FjaGVkX2tleXMgKnJlc3VsdDsKIAlpbnQgcmVtLCBlcnIsIGRlZiA9IDA7CisJYm9vbCBoYXZlX2tleSA9IGZhbHNlOworCisJbmxhX2Zvcl9lYWNoX25lc3RlZChrZXksIGtleXMsIHJlbSkgeworCQloYXZlX2tleSA9IHRydWU7CisJCWJyZWFrOworCX0KKworCWlmICghaGF2ZV9rZXkpCisJCXJldHVybiBOVUxMOwogCiAJcmVzdWx0ID0ga3phbGxvYyhzaXplb2YoKnJlc3VsdCksIEdGUF9LRVJORUwpOwogCWlmICghcmVzdWx0KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCXJlc3VsdC0+ZGVmID0gLTE7Ci0JcmVzdWx0LT5kZWZtZ210ID0gLTE7CiAKIAlubGFfZm9yX2VhY2hfbmVzdGVkKGtleSwga2V5cywgcmVtKSB7CiAJCW1lbXNldCgmcGFyc2UsIDAsIHNpemVvZihwYXJzZSkpOwpAQCAtODY2LDcgKzkxMiw3IEBACiAJCWVyciA9IC1FSU5WQUw7CiAJCWlmICghcGFyc2UucC5rZXkpCiAJCQlnb3RvIGVycm9yOwotCQlpZiAocGFyc2UuaWR4IDwgMCB8fCBwYXJzZS5pZHggPiA0KQorCQlpZiAocGFyc2UuaWR4IDwgMCB8fCBwYXJzZS5pZHggPiAzKQogCQkJZ290byBlcnJvcjsKIAkJaWYgKHBhcnNlLmRlZikgewogCQkJaWYgKGRlZikKQEAgLTg4MSwxNiArOTI3LDI0IEBACiAJCQkJCQkgICAgIHBhcnNlLmlkeCwgZmFsc2UsIE5VTEwpOwogCQlpZiAoZXJyKQogCQkJZ290byBlcnJvcjsKKwkJaWYgKHBhcnNlLnAuY2lwaGVyICE9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwICYmCisJCSAgICBwYXJzZS5wLmNpcGhlciAhPSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOworCQl9CiAJCXJlc3VsdC0+cGFyYW1zW3BhcnNlLmlkeF0uY2lwaGVyID0gcGFyc2UucC5jaXBoZXI7CiAJCXJlc3VsdC0+cGFyYW1zW3BhcnNlLmlkeF0ua2V5X2xlbiA9IHBhcnNlLnAua2V5X2xlbjsKIAkJcmVzdWx0LT5wYXJhbXNbcGFyc2UuaWR4XS5rZXkgPSByZXN1bHQtPmRhdGFbcGFyc2UuaWR4XTsKIAkJbWVtY3B5KHJlc3VsdC0+ZGF0YVtwYXJzZS5pZHhdLCBwYXJzZS5wLmtleSwgcGFyc2UucC5rZXlfbGVuKTsKIAotCQlpZiAocGFyc2UucC5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKLQkJICAgIHBhcnNlLnAuY2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgewotCQkJaWYgKG5vX2h0KQotCQkJCSpub19odCA9IHRydWU7Ci0JCX0KKwkJLyogbXVzdCBiZSBXRVAga2V5IGlmIHdlIGdvdCBoZXJlICovCisJCWlmIChub19odCkKKwkJCSpub19odCA9IHRydWU7CisJfQorCisJaWYgKHJlc3VsdC0+ZGVmIDwgMCkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOwogCX0KIAogCXJldHVybiByZXN1bHQ7CkBAIC05MTgsNiArOTcyLDcgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfT0NCOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9XRFM6CiAJY2FzZSBOVU1fTkw4MDIxMV9JRlRZUEVTOgpAQCAtMjUyNSwxMCArMjU4MCwzNSBAQAogCWludCBpZl9pZHggPSAwOwogCWludCB3cF9zdGFydCA9IGNiLT5hcmdzWzBdOwogCWludCBpZl9zdGFydCA9IGNiLT5hcmdzWzFdOworCWludCBmaWx0ZXJfd2lwaHkgPSAtMTsKIAlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXY7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldjsKIAogCXJ0bmxfbG9jaygpOworCWlmICghY2ItPmFyZ3NbMl0pIHsKKwkJc3RydWN0IG5sODAyMTFfZHVtcF93aXBoeV9zdGF0ZSBzdGF0ZSA9IHsKKwkJCS5maWx0ZXJfd2lwaHkgPSAtMSwKKwkJfTsKKwkJaW50IHJldDsKKworCQlyZXQgPSBubDgwMjExX2R1bXBfd2lwaHlfcGFyc2Uoc2tiLCBjYiwgJnN0YXRlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJZmlsdGVyX3dpcGh5ID0gc3RhdGUuZmlsdGVyX3dpcGh5OworCisJCS8qCisJCSAqIGlmIGZpbHRlcmluZywgc2V0IGNiLT5hcmdzWzJdIHRvICsxIHNpbmNlIDAgaXMgdGhlIGRlZmF1bHQKKwkJICogdmFsdWUgbmVlZGVkIHRvIGRldGVybWluZSB0aGF0IHBhcnNpbmcgaXMgbmVjZXNzYXJ5LgorCQkgKi8KKwkJaWYgKGZpbHRlcl93aXBoeSA+PSAwKQorCQkJY2ItPmFyZ3NbMl0gPSBmaWx0ZXJfd2lwaHkgKyAxOworCQllbHNlCisJCQljYi0+YXJnc1syXSA9IC0xOworCX0gZWxzZSBpZiAoY2ItPmFyZ3NbMl0gPiAwKSB7CisJCWZpbHRlcl93aXBoeSA9IGNiLT5hcmdzWzJdIC0gMTsKKwl9CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZjZmc4MDIxMV9yZGV2X2xpc3QsIGxpc3QpIHsKIAkJaWYgKCFuZXRfZXEod2lwaHlfbmV0KCZyZGV2LT53aXBoeSksIHNvY2tfbmV0KHNrYi0+c2spKSkKIAkJCWNvbnRpbnVlOwpAQCAtMjUzNiw2ICsyNjE2LDEwIEBACiAJCQl3cF9pZHgrKzsKIAkJCWNvbnRpbnVlOwogCQl9CisKKwkJaWYgKGZpbHRlcl93aXBoeSA+PSAwICYmIGZpbHRlcl93aXBoeSAhPSByZGV2LT53aXBoeV9pZHgpCisJCQljb250aW51ZTsKKwogCQlpZl9pZHggPSAwOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkod2RldiwgJnJkZXYtPndpcGh5LndkZXZfbGlzdCwgbGlzdCkgewpAQCAtMjc1MSw3ICsyODM1LDcgQEAKIAlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKIAlzdHJ1Y3QgdmlmX3BhcmFtcyBwYXJhbXM7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCAqZXZlbnQ7CisJc3RydWN0IHNrX2J1ZmYgKm1zZzsKIAlpbnQgZXJyOwogCWVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSA9IE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOwogCXUzMiBmbGFnczsKQEAgLTI3NzQsNyArMjg1OCw3IEBACiAJICAgICEocmRldi0+d2lwaHkuaW50ZXJmYWNlX21vZGVzICYgKDEgPDwgdHlwZSkpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlpZiAoKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSB8fAorCWlmICgodHlwZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFIHx8IHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTkFOIHx8CiAJICAgICByZGV2LT53aXBoeS5mZWF0dXJlcyAmIE5MODAyMTFfRkVBVFVSRV9NQUNfT05fQ1JFQVRFKSAmJgogCSAgICBpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTUFDXSkgewogCQlubGFfbWVtY3B5KHBhcmFtcy5tYWNhZGRyLCBpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTUFDXSwKQEAgLTI4MzAsOSArMjkxNCwxMCBAQAogCQkgICAgICAgd2Rldi0+bWVzaF9pZF91cF9sZW4pOwogCQl3ZGV2X3VubG9jayh3ZGV2KTsKIAkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgogCQkvKgotCQkgKiBQMlAgRGV2aWNlIGRvZXNuJ3QgaGF2ZSBhIG5ldGRldiwgc28gZG9lc24ndCBnbworCQkgKiBQMlAgRGV2aWNlIGFuZCBOQU4gZG8gbm90IGhhdmUgYSBuZXRkZXYsIHNvIGRvbid0IGdvCiAJCSAqIHRocm91Z2ggdGhlIG5ldGRldiBub3RpZmllciBhbmQgbXVzdCBiZSBhZGRlZCBoZXJlCiAJCSAqLwogCQltdXRleF9pbml0KCZ3ZGV2LT5tdHgpOwpAQCAtMjg1NSwyMCArMjk0MCwxNSBAQAogCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQogCi0JZXZlbnQgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoZXZlbnQpIHsKLQkJaWYgKG5sODAyMTFfc2VuZF9pZmFjZShldmVudCwgMCwgMCwgMCwKLQkJCQkgICAgICAgcmRldiwgd2RldiwgZmFsc2UpIDwgMCkgewotCQkJbmxtc2dfZnJlZShldmVudCk7Ci0JCQlnb3RvIG91dDsKLQkJfQorCS8qCisJICogRm9yIHdkZXZzIHdoaWNoIGhhdmUgbm8gYXNzb2NpYXRlZCBuZXRkZXYgb2JqZWN0IChlLmcuIG9mIHR5cGUKKwkgKiBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFKSwgZW1pdCB0aGUgTkVXX0lOVEVSRkFDRSBldmVudCBoZXJlLgorCSAqIEZvciBhbGwgb3RoZXIgdHlwZXMsIHRoZSBldmVudCB3aWxsIGJlIGdlbmVyYXRlZCBmcm9tIHRoZQorCSAqIG5ldGRldiBub3RpZmllcgorCSAqLworCWlmICghd2Rldi0+bmV0ZGV2KQorCQlubDgwMjExX25vdGlmeV9pZmFjZShyZGV2LCB3ZGV2LCBOTDgwMjExX0NNRF9ORVdfSU5URVJGQUNFKTsKIAotCQlnZW5sbXNnX211bHRpY2FzdF9uZXRucygmbmw4MDIxMV9mYW0sIHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLAotCQkJCQlldmVudCwgMCwgTkw4MDIxMV9NQ0dSUF9DT05GSUcsCi0JCQkJCUdGUF9LRVJORUwpOwotCX0KLQotb3V0OgogCXJldHVybiBnZW5sbXNnX3JlcGx5KG1zZywgaW5mbyk7CiB9CiAKQEAgLTI4NzYsMTggKzI5NTYsMTAgQEAKIHsKIAlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gaW5mby0+dXNlcl9wdHJbMV07Ci0Jc3RydWN0IHNrX2J1ZmYgKm1zZzsKLQlpbnQgc3RhdHVzOwogCiAJaWYgKCFyZGV2LT5vcHMtPmRlbF92aXJ0dWFsX2ludGYpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCW1zZyA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmIChtc2cgJiYgbmw4MDIxMV9zZW5kX2lmYWNlKG1zZywgMCwgMCwgMCwgcmRldiwgd2RldiwgdHJ1ZSkgPCAwKSB7Ci0JCW5sbXNnX2ZyZWUobXNnKTsKLQkJbXNnID0gTlVMTDsKLQl9Ci0KIAkvKgogCSAqIElmIHdlIHJlbW92ZSBhIHdpcmVsZXNzIGRldmljZSB3aXRob3V0IGEgbmV0ZGV2IHRoZW4gY2xlYXIKIAkgKiB1c2VyX3B0clsxXSBzbyB0aGF0IG5sODAyMTFfcG9zdF9kb2l0IHdvbid0IGRlcmVmZXJlbmNlIGl0CkBAIC0yODk4LDE1ICsyOTcwLDcgQEAKIAlpZiAoIXdkZXYtPm5ldGRldikKIAkJaW5mby0+dXNlcl9wdHJbMV0gPSBOVUxMOwogCi0Jc3RhdHVzID0gcmRldl9kZWxfdmlydHVhbF9pbnRmKHJkZXYsIHdkZXYpOwotCWlmIChzdGF0dXMgPj0gMCAmJiBtc2cpCi0JCWdlbmxtc2dfbXVsdGljYXN0X25ldG5zKCZubDgwMjExX2ZhbSwgd2lwaHlfbmV0KCZyZGV2LT53aXBoeSksCi0JCQkJCW1zZywgMCwgTkw4MDIxMV9NQ0dSUF9DT05GSUcsCi0JCQkJCUdGUF9LRVJORUwpOwotCWVsc2UKLQkJbmxtc2dfZnJlZShtc2cpOwotCi0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gcmRldl9kZWxfdmlydHVhbF9pbnRmKHJkZXYsIHdkZXYpOwogfQogCiBzdGF0aWMgaW50IG5sODAyMTFfc2V0X25vYWNrX21hcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQpAQCAtMzMxNiw2ICszMzgwLDI5MSBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyB1MzIgcmF0ZXNldF90b19tYXNrKHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorCQkJICAgdTggKnJhdGVzLCB1OCByYXRlc19sZW4pCit7CisJdTggaTsKKwl1MzIgbWFzayA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmF0ZXNfbGVuOyBpKyspIHsKKwkJaW50IHJhdGUgPSAocmF0ZXNbaV0gJiAweDdmKSAqIDU7CisJCWludCByaWR4OworCisJCWZvciAocmlkeCA9IDA7IHJpZHggPCBzYmFuZC0+bl9iaXRyYXRlczsgcmlkeCsrKSB7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnNyYXRlID0KKwkJCQkmc2JhbmQtPmJpdHJhdGVzW3JpZHhdOworCQkJaWYgKHJhdGUgPT0gc3JhdGUtPmJpdHJhdGUpIHsKKwkJCQltYXNrIHw9IDEgPDwgcmlkeDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAocmlkeCA9PSBzYmFuZC0+bl9iaXRyYXRlcykKKwkJCXJldHVybiAwOyAvKiByYXRlIG5vdCBmb3VuZCAqLworCX0KKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgYm9vbCBodF9yYXRlc2V0X3RvX21hc2soc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCQkgICAgICAgdTggKnJhdGVzLCB1OCByYXRlc19sZW4sCisJCQkgICAgICAgdTggbWNzW0lFRUU4MDIxMV9IVF9NQ1NfTUFTS19MRU5dKQoreworCXU4IGk7CisKKwltZW1zZXQobWNzLCAwLCBJRUVFODAyMTFfSFRfTUNTX01BU0tfTEVOKTsKKworCWZvciAoaSA9IDA7IGkgPCByYXRlc19sZW47IGkrKykgeworCQlpbnQgcmlkeCwgcmJpdDsKKworCQlyaWR4ID0gcmF0ZXNbaV0gLyA4OworCQlyYml0ID0gQklUKHJhdGVzW2ldICUgOCk7CisKKwkJLyogY2hlY2sgdmFsaWRpdHkgKi8KKwkJaWYgKChyaWR4IDwgMCkgfHwgKHJpZHggPj0gSUVFRTgwMjExX0hUX01DU19NQVNLX0xFTikpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJLyogY2hlY2sgYXZhaWxhYmlsaXR5ICovCisJCWlmIChzYmFuZC0+aHRfY2FwLm1jcy5yeF9tYXNrW3JpZHhdICYgcmJpdCkKKwkJCW1jc1tyaWR4XSB8PSByYml0OworCQllbHNlCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1MTYgdmh0X21jc19tYXBfdG9fbWNzX21hc2sodTggdmh0X21jc19tYXApCit7CisJdTE2IG1jc19tYXNrID0gMDsKKworCXN3aXRjaCAodmh0X21jc19tYXApIHsKKwljYXNlIElFRUU4MDIxMV9WSFRfTUNTX05PVF9TVVBQT1JURUQ6CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1ZIVF9NQ1NfU1VQUE9SVF8wXzc6CisJCW1jc19tYXNrID0gMHgwMEZGOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9WSFRfTUNTX1NVUFBPUlRfMF84OgorCQltY3NfbWFzayA9IDB4MDFGRjsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfVkhUX01DU19TVVBQT1JUXzBfOToKKwkJbWNzX21hc2sgPSAweDAzRkY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBtY3NfbWFzazsKK30KKworc3RhdGljIHZvaWQgdmh0X2J1aWxkX21jc19tYXNrKHUxNiB2aHRfbWNzX21hcCwKKwkJCSAgICAgICB1MTYgdmh0X21jc19tYXNrW05MODAyMTFfVkhUX05TU19NQVhdKQoreworCXU4IG5zczsKKworCWZvciAobnNzID0gMDsgbnNzIDwgTkw4MDIxMV9WSFRfTlNTX01BWDsgbnNzKyspIHsKKwkJdmh0X21jc19tYXNrW25zc10gPSB2aHRfbWNzX21hcF90b19tY3NfbWFzayh2aHRfbWNzX21hcCAmIDB4MDMpOworCQl2aHRfbWNzX21hcCA+Pj0gMjsKKwl9Cit9CisKK3N0YXRpYyBib29sIHZodF9zZXRfbWNzX21hc2soc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCQkgICAgIHN0cnVjdCBubDgwMjExX3R4cmF0ZV92aHQgKnR4cmF0ZSwKKwkJCSAgICAgdTE2IG1jc1tOTDgwMjExX1ZIVF9OU1NfTUFYXSkKK3sKKwl1MTYgdHhfbWNzX21hcCA9IGxlMTZfdG9fY3B1KHNiYW5kLT52aHRfY2FwLnZodF9tY3MudHhfbWNzX21hcCk7CisJdTE2IHR4X21jc19tYXNrW05MODAyMTFfVkhUX05TU19NQVhdID0ge307CisJdTggaTsKKworCWlmICghc2JhbmQtPnZodF9jYXAudmh0X3N1cHBvcnRlZCkKKwkJcmV0dXJuIGZhbHNlOworCisJbWVtc2V0KG1jcywgMCwgc2l6ZW9mKHUxNikgKiBOTDgwMjExX1ZIVF9OU1NfTUFYKTsKKworCS8qIEJ1aWxkIHZodF9tY3NfbWFzayBmcm9tIFZIVCBjYXBhYmlsaXRpZXMgKi8KKwl2aHRfYnVpbGRfbWNzX21hc2sodHhfbWNzX21hcCwgdHhfbWNzX21hc2spOworCisJZm9yIChpID0gMDsgaSA8IE5MODAyMTFfVkhUX05TU19NQVg7IGkrKykgeworCQlpZiAoKHR4X21jc19tYXNrW2ldICYgdHhyYXRlLT5tY3NbaV0pID09IHR4cmF0ZS0+bWNzW2ldKQorCQkJbWNzW2ldID0gdHhyYXRlLT5tY3NbaV07CisJCWVsc2UKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5sODAyMTFfdHhhdHRyX3BvbGljeVtOTDgwMjExX1RYUkFURV9NQVggKyAxXSA9IHsKKwlbTkw4MDIxMV9UWFJBVEVfTEVHQUNZXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLAorCQkJCSAgICAubGVuID0gTkw4MDIxMV9NQVhfU1VQUF9SQVRFUyB9LAorCVtOTDgwMjExX1RYUkFURV9IVF0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKKwkJCQkubGVuID0gTkw4MDIxMV9NQVhfU1VQUF9IVF9SQVRFUyB9LAorCVtOTDgwMjExX1RYUkFURV9WSFRdID0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBubDgwMjExX3R4cmF0ZV92aHQpfSwKKwlbTkw4MDIxMV9UWFJBVEVfR0ldID0geyAudHlwZSA9IE5MQV9VOCB9LAorfTsKKworc3RhdGljIGludCBubDgwMjExX3BhcnNlX3R4X2JpdHJhdGVfbWFzayhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLAorCQkJCQkgc3RydWN0IGNmZzgwMjExX2JpdHJhdGVfbWFzayAqbWFzaykKK3sKKwlzdHJ1Y3QgbmxhdHRyICp0YltOTDgwMjExX1RYUkFURV9NQVggKyAxXTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKKwlpbnQgcmVtLCBpOworCXN0cnVjdCBubGF0dHIgKnR4X3JhdGVzOworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCXUxNiB2aHRfdHhfbWNzX21hcDsKKworCW1lbXNldChtYXNrLCAwLCBzaXplb2YoKm1hc2spKTsKKwkvKiBEZWZhdWx0IHRvIGFsbCByYXRlcyBlbmFibGVkICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9OTDgwMjExX0JBTkRTOyBpKyspIHsKKwkJc2JhbmQgPSByZGV2LT53aXBoeS5iYW5kc1tpXTsKKworCQlpZiAoIXNiYW5kKQorCQkJY29udGludWU7CisKKwkJbWFzay0+Y29udHJvbFtpXS5sZWdhY3kgPSAoMSA8PCBzYmFuZC0+bl9iaXRyYXRlcykgLSAxOworCQltZW1jcHkobWFzay0+Y29udHJvbFtpXS5odF9tY3MsCisJCSAgICAgICBzYmFuZC0+aHRfY2FwLm1jcy5yeF9tYXNrLAorCQkgICAgICAgc2l6ZW9mKG1hc2stPmNvbnRyb2xbaV0uaHRfbWNzKSk7CisKKwkJaWYgKCFzYmFuZC0+dmh0X2NhcC52aHRfc3VwcG9ydGVkKQorCQkJY29udGludWU7CisKKwkJdmh0X3R4X21jc19tYXAgPSBsZTE2X3RvX2NwdShzYmFuZC0+dmh0X2NhcC52aHRfbWNzLnR4X21jc19tYXApOworCQl2aHRfYnVpbGRfbWNzX21hc2sodmh0X3R4X21jc19tYXAsIG1hc2stPmNvbnRyb2xbaV0udmh0X21jcyk7CisJfQorCisJLyogaWYgbm8gcmF0ZXMgYXJlIGdpdmVuIHNldCBpdCBiYWNrIHRvIHRoZSBkZWZhdWx0cyAqLworCWlmICghaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1RYX1JBVEVTXSkKKwkJZ290byBvdXQ7CisKKwkvKiBUaGUgbmVzdGVkIGF0dHJpYnV0ZSB1c2VzIGVudW0gbmw4MDIxMV9iYW5kIGFzIHRoZSBpbmRleC4gVGhpcyBtYXBzCisJICogZGlyZWN0bHkgdG8gdGhlIGVudW0gbmw4MDIxMV9iYW5kIHZhbHVlcyB1c2VkIGluIGNmZzgwMjExLgorCSAqLworCUJVSUxEX0JVR19PTihOTDgwMjExX01BWF9TVVBQX0hUX1JBVEVTID4gSUVFRTgwMjExX0hUX01DU19NQVNLX0xFTiAqIDgpOworCW5sYV9mb3JfZWFjaF9uZXN0ZWQodHhfcmF0ZXMsIGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9UWF9SQVRFU10sIHJlbSkgeworCQllbnVtIG5sODAyMTFfYmFuZCBiYW5kID0gbmxhX3R5cGUodHhfcmF0ZXMpOworCQlpbnQgZXJyOworCisJCWlmIChiYW5kIDwgMCB8fCBiYW5kID49IE5VTV9OTDgwMjExX0JBTkRTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNiYW5kID0gcmRldi0+d2lwaHkuYmFuZHNbYmFuZF07CisJCWlmIChzYmFuZCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWVyciA9IG5sYV9wYXJzZSh0YiwgTkw4MDIxMV9UWFJBVEVfTUFYLCBubGFfZGF0YSh0eF9yYXRlcyksCisJCQkJbmxhX2xlbih0eF9yYXRlcyksIG5sODAyMTFfdHhhdHRyX3BvbGljeSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlpZiAodGJbTkw4MDIxMV9UWFJBVEVfTEVHQUNZXSkgeworCQkJbWFzay0+Y29udHJvbFtiYW5kXS5sZWdhY3kgPSByYXRlc2V0X3RvX21hc2soCisJCQkJc2JhbmQsCisJCQkJbmxhX2RhdGEodGJbTkw4MDIxMV9UWFJBVEVfTEVHQUNZXSksCisJCQkJbmxhX2xlbih0YltOTDgwMjExX1RYUkFURV9MRUdBQ1ldKSk7CisJCQlpZiAoKG1hc2stPmNvbnRyb2xbYmFuZF0ubGVnYWN5ID09IDApICYmCisJCQkgICAgbmxhX2xlbih0YltOTDgwMjExX1RYUkFURV9MRUdBQ1ldKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAodGJbTkw4MDIxMV9UWFJBVEVfSFRdKSB7CisJCQlpZiAoIWh0X3JhdGVzZXRfdG9fbWFzaygKKwkJCQkJc2JhbmQsCisJCQkJCW5sYV9kYXRhKHRiW05MODAyMTFfVFhSQVRFX0hUXSksCisJCQkJCW5sYV9sZW4odGJbTkw4MDIxMV9UWFJBVEVfSFRdKSwKKwkJCQkJbWFzay0+Y29udHJvbFtiYW5kXS5odF9tY3MpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICh0YltOTDgwMjExX1RYUkFURV9WSFRdKSB7CisJCQlpZiAoIXZodF9zZXRfbWNzX21hc2soCisJCQkJCXNiYW5kLAorCQkJCQlubGFfZGF0YSh0YltOTDgwMjExX1RYUkFURV9WSFRdKSwKKwkJCQkJbWFzay0+Y29udHJvbFtiYW5kXS52aHRfbWNzKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAodGJbTkw4MDIxMV9UWFJBVEVfR0ldKSB7CisJCQltYXNrLT5jb250cm9sW2JhbmRdLmdpID0KKwkJCQlubGFfZ2V0X3U4KHRiW05MODAyMTFfVFhSQVRFX0dJXSk7CisJCQlpZiAobWFzay0+Y29udHJvbFtiYW5kXS5naSA+IE5MODAyMTFfVFhSQVRFX0ZPUkNFX0xHSSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChtYXNrLT5jb250cm9sW2JhbmRdLmxlZ2FjeSA9PSAwKSB7CisJCQkvKiBkb24ndCBhbGxvdyBlbXB0eSBsZWdhY3kgcmF0ZXMgaWYgSFQgb3IgVkhUCisJCQkgKiBhcmUgbm90IGV2ZW4gc3VwcG9ydGVkLgorCQkJICovCisJCQlpZiAoIShyZGV2LT53aXBoeS5iYW5kc1tiYW5kXS0+aHRfY2FwLmh0X3N1cHBvcnRlZCB8fAorCQkJICAgICAgcmRldi0+d2lwaHkuYmFuZHNbYmFuZF0tPnZodF9jYXAudmh0X3N1cHBvcnRlZCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfSFRfTUNTX01BU0tfTEVOOyBpKyspCisJCQkJaWYgKG1hc2stPmNvbnRyb2xbYmFuZF0uaHRfbWNzW2ldKQorCQkJCQlnb3RvIG91dDsKKworCQkJZm9yIChpID0gMDsgaSA8IE5MODAyMTFfVkhUX05TU19NQVg7IGkrKykKKwkJCQlpZiAobWFzay0+Y29udHJvbFtiYW5kXS52aHRfbWNzW2ldKQorCQkJCQlnb3RvIG91dDsKKworCQkJLyogbGVnYWN5IGFuZCBtY3MgcmF0ZXMgbWF5IG5vdCBiZSBib3RoIGVtcHR5ICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworb3V0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhbGlkYXRlX2JlYWNvbl90eF9yYXRlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJCQkgICBlbnVtIG5sODAyMTFfYmFuZCBiYW5kLAorCQkJCSAgIHN0cnVjdCBjZmc4MDIxMV9iaXRyYXRlX21hc2sgKmJlYWNvbl9yYXRlKQoreworCXUzMiBjb3VudF9odCwgY291bnRfdmh0LCBpOworCXUzMiByYXRlID0gYmVhY29uX3JhdGUtPmNvbnRyb2xbYmFuZF0ubGVnYWN5OworCisJLyogQWxsb3cgb25seSBvbmUgcmF0ZSAqLworCWlmIChod2VpZ2h0MzIocmF0ZSkgPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvdW50X2h0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX0hUX01DU19NQVNLX0xFTjsgaSsrKSB7CisJCWlmIChod2VpZ2h0OChiZWFjb25fcmF0ZS0+Y29udHJvbFtiYW5kXS5odF9tY3NbaV0pID4gMSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoYmVhY29uX3JhdGUtPmNvbnRyb2xbYmFuZF0uaHRfbWNzW2ldKSB7CisJCQljb3VudF9odCsrOworCQkJaWYgKGNvdW50X2h0ID4gMSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoY291bnRfaHQgJiYgcmF0ZSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNvdW50X3ZodCA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5MODAyMTFfVkhUX05TU19NQVg7IGkrKykgeworCQlpZiAoaHdlaWdodDE2KGJlYWNvbl9yYXRlLT5jb250cm9sW2JhbmRdLnZodF9tY3NbaV0pID4gMSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoYmVhY29uX3JhdGUtPmNvbnRyb2xbYmFuZF0udmh0X21jc1tpXSkgeworCQkJY291bnRfdmh0Kys7CisJCQlpZiAoY291bnRfdmh0ID4gMSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoY291bnRfdmh0ICYmIHJhdGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKGNvdW50X2h0ICYmIGNvdW50X3ZodCkgfHwgKCFyYXRlICYmICFjb3VudF9odCAmJiAhY291bnRfdmh0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmF0ZSAmJgorCSAgICAhd2lwaHlfZXh0X2ZlYXR1cmVfaXNzZXQoJnJkZXYtPndpcGh5LAorCQkJCSAgICAgTkw4MDIxMV9FWFRfRkVBVFVSRV9CRUFDT05fUkFURV9MRUdBQ1kpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY291bnRfaHQgJiYKKwkgICAgIXdpcGh5X2V4dF9mZWF0dXJlX2lzc2V0KCZyZGV2LT53aXBoeSwKKwkJCQkgICAgIE5MODAyMTFfRVhUX0ZFQVRVUkVfQkVBQ09OX1JBVEVfSFQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY291bnRfdmh0ICYmCisJICAgICF3aXBoeV9leHRfZmVhdHVyZV9pc3NldCgmcmRldi0+d2lwaHksCisJCQkJICAgICBOTDgwMjExX0VYVF9GRUFUVVJFX0JFQUNPTl9SQVRFX1ZIVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbmw4MDIxMV9wYXJzZV9iZWFjb24oc3RydWN0IG5sYXR0ciAqYXR0cnNbXSwKIAkJCQlzdHJ1Y3QgY2ZnODAyMTFfYmVhY29uX2RhdGEgKmJjbikKIHsKQEAgLTM1NDUsNiArMzg5NCwxNyBAQAogCQkJCQkgICB3ZGV2LT5pZnR5cGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfVFhfUkFURVNdKSB7CisJCWVyciA9IG5sODAyMTFfcGFyc2VfdHhfYml0cmF0ZV9tYXNrKGluZm8sICZwYXJhbXMuYmVhY29uX3JhdGUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQllcnIgPSB2YWxpZGF0ZV9iZWFjb25fdHhfcmF0ZShyZGV2LCBwYXJhbXMuY2hhbmRlZi5jaGFuLT5iYW5kLAorCQkJCQkgICAgICAmcGFyYW1zLmJlYWNvbl9yYXRlKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCiAJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TTVBTX01PREVdKSB7CiAJCXBhcmFtcy5zbXBzX21vZGUgPQogCQkJbmxhX2dldF91OChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfU01QU19NT0RFXSk7CkBAIC01Mzc0LDEyICs1NzM0LDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbmw4MDIxMV9jaGVja19wb3dlcl9tb2RlKGNvbnN0IHN0cnVjdCBubGF0dHIgKm5sYSwKKwkJCQkgICAgZW51bSBubDgwMjExX21lc2hfcG93ZXJfbW9kZSBtaW4sCisJCQkJICAgIGVudW0gbmw4MDIxMV9tZXNoX3Bvd2VyX21vZGUgbWF4LAorCQkJCSAgICBlbnVtIG5sODAyMTFfbWVzaF9wb3dlcl9tb2RlICpvdXQpCit7CisJdTMyIHZhbCA9IG5sYV9nZXRfdTMyKG5sYSk7CisJaWYgKHZhbCA8IG1pbiB8fCB2YWwgPiBtYXgpCisJCXJldHVybiAtRUlOVkFMOworCSpvdXQgPSB2YWw7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbmw4MDIxMV9wYXJzZV9tZXNoX2NvbmZpZyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLAogCQkJCSAgICAgc3RydWN0IG1lc2hfY29uZmlnICpjZmcsCiAJCQkJICAgICB1MzIgKm1hc2tfb3V0KQogewogCXN0cnVjdCBubGF0dHIgKnRiW05MODAyMTFfTUVTSENPTkZfQVRUUl9NQVggKyAxXTsKIAl1MzIgbWFzayA9IDA7CisJdTE2IGh0X29wbW9kZTsKIAogI2RlZmluZSBGSUxMX0lOX01FU0hfUEFSQU1fSUZfU0VUKHRiLCBjZmcsIHBhcmFtLCBtaW4sIG1heCwgbWFzaywgYXR0ciwgZm4pIFwKIGRvIHsJCQkJCQkJCQkgICAgXApAQCAtNTQ3MSw5ICs1ODQ0LDM2IEBACiAJRklMTF9JTl9NRVNIX1BBUkFNX0lGX1NFVCh0YiwgY2ZnLCByc3NpX3RocmVzaG9sZCwgLTI1NSwgMCwKIAkJCQkgIG1hc2ssIE5MODAyMTFfTUVTSENPTkZfUlNTSV9USFJFU0hPTEQsCiAJCQkJICBubDgwMjExX2NoZWNrX3MzMik7Ci0JRklMTF9JTl9NRVNIX1BBUkFNX0lGX1NFVCh0YiwgY2ZnLCBodF9vcG1vZGUsIDAsIDE2LAotCQkJCSAgbWFzaywgTkw4MDIxMV9NRVNIQ09ORl9IVF9PUE1PREUsCi0JCQkJICBubDgwMjExX2NoZWNrX3UxNik7CisJLyoKKwkgKiBDaGVjayBIVCBvcGVyYXRpb24gbW9kZSBiYXNlZCBvbgorCSAqIElFRUUgODAyLjExIDIwMTIgOC40LjIuNTkgSFQgT3BlcmF0aW9uIGVsZW1lbnQuCisJICovCisJaWYgKHRiW05MODAyMTFfTUVTSENPTkZfSFRfT1BNT0RFXSkgeworCQlodF9vcG1vZGUgPSBubGFfZ2V0X3UxNih0YltOTDgwMjExX01FU0hDT05GX0hUX09QTU9ERV0pOworCisJCWlmIChodF9vcG1vZGUgJiB+KElFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT04gfAorCQkJCSAgSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0dGX1NUQV9QUlNOVCB8CisJCQkJICBJRUVFODAyMTFfSFRfT1BfTU9ERV9OT05fSFRfU1RBX1BSU05UKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICgoaHRfb3Btb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0dGX1NUQV9QUlNOVCkgJiYKKwkJICAgIChodF9vcG1vZGUgJiBJRUVFODAyMTFfSFRfT1BfTU9ERV9OT05fSFRfU1RBX1BSU05UKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXN3aXRjaCAoaHRfb3Btb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTikgeworCQljYXNlIElFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT05fTk9ORToKKwkJY2FzZSBJRUVFODAyMTFfSFRfT1BfTU9ERV9QUk9URUNUSU9OXzIwTUhaOgorCQkJaWYgKGh0X29wbW9kZSAmIElFRUU4MDIxMV9IVF9PUF9NT0RFX05PTl9IVF9TVEFfUFJTTlQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfSFRfT1BfTU9ERV9QUk9URUNUSU9OX05PTk1FTUJFUjoKKwkJY2FzZSBJRUVFODAyMTFfSFRfT1BfTU9ERV9QUk9URUNUSU9OX05PTkhUX01JWEVEOgorCQkJaWYgKCEoaHRfb3Btb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0hUX1NUQV9QUlNOVCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQljZmctPmh0X29wbW9kZSA9IGh0X29wbW9kZTsKKwl9CiAJRklMTF9JTl9NRVNIX1BBUkFNX0lGX1NFVCh0YiwgY2ZnLCBkb3QxMU1lc2hIV01QYWN0aXZlUGF0aFRvUm9vdFRpbWVvdXQsCiAJCQkJICAxLCA2NTUzNSwgbWFzaywKIAkJCQkgIE5MODAyMTFfTUVTSENPTkZfSFdNUF9QQVRIX1RPX1JPT1RfVElNRU9VVCwKQEAgLTU0OTAsNyArNTg5MCw3IEBACiAJCQkJICBOTDgwMjExX01FU0hfUE9XRVJfQUNUSVZFLAogCQkJCSAgTkw4MDIxMV9NRVNIX1BPV0VSX01BWCwKIAkJCQkgIG1hc2ssIE5MODAyMTFfTUVTSENPTkZfUE9XRVJfTU9ERSwKLQkJCQkgIG5sODAyMTFfY2hlY2tfdTMyKTsKKwkJCQkgIG5sODAyMTFfY2hlY2tfcG93ZXJfbW9kZSk7CiAJRklMTF9JTl9NRVNIX1BBUkFNX0lGX1NFVCh0YiwgY2ZnLCBkb3QxMU1lc2hBd2FrZVdpbmRvd0R1cmF0aW9uLAogCQkJCSAgMCwgNjU1MzUsIG1hc2ssCiAJCQkJICBOTDgwMjExX01FU0hDT05GX0FXQUtFX1dJTkRPVywgbmw4MDIxMV9jaGVja191MTYpOwpAQCAtNjA3NCw2ICs2NDc0LDkgQEAKIAogCXdpcGh5ID0gJnJkZXYtPndpcGh5OwogCisJaWYgKHdkZXYtPmlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU4pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCWlmICghcmRldi0+b3BzLT5zY2FuKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKQEAgLTY5NTAsNyArNzM1Myw3IEBACiAKIAkJcGFyYW1zLm5fY291bnRlcl9vZmZzZXRzX3ByZXNwID0gbGVuIC8gc2l6ZW9mKHUxNik7CiAJCWlmIChyZGV2LT53aXBoeS5tYXhfbnVtX2NzYV9jb3VudGVycyAmJgotCQkgICAgKHBhcmFtcy5uX2NvdW50ZXJfb2Zmc2V0c19iZWFjb24gPgorCQkgICAgKHBhcmFtcy5uX2NvdW50ZXJfb2Zmc2V0c19wcmVzcCA+CiAJCSAgICAgcmRldi0+d2lwaHkubWF4X251bV9jc2FfY291bnRlcnMpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTczNDAsNyArNzc0Myw3IEBACiAJCSAgICAoa2V5LnAuY2lwaGVyICE9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCB8fAogCQkgICAgIGtleS5wLmtleV9sZW4gIT0gV0xBTl9LRVlfTEVOX1dFUDEwNCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGtleS5pZHggPiA0KQorCQlpZiAoa2V5LmlkeCA+IDMpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9IGVsc2UgewogCQlrZXkucC5rZXlfbGVuID0gMDsKQEAgLTc3NDUsMTIgKzgxNDgsMTMgQEAKIAogCWlic3MuYmVhY29uX2ludGVydmFsID0gMTAwOwogCi0JaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9CRUFDT05fSU5URVJWQUxdKSB7CisJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9CRUFDT05fSU5URVJWQUxdKQogCQlpYnNzLmJlYWNvbl9pbnRlcnZhbCA9CiAJCQlubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfQkVBQ09OX0lOVEVSVkFMXSk7Ci0JCWlmIChpYnNzLmJlYWNvbl9pbnRlcnZhbCA8IDEgfHwgaWJzcy5iZWFjb25faW50ZXJ2YWwgPiAxMDAwMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KKworCWVyciA9IGNmZzgwMjExX3ZhbGlkYXRlX2JlYWNvbl9pbnQocmRldiwgaWJzcy5iZWFjb25faW50ZXJ2YWwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlpZiAoIXJkZXYtPm9wcy0+am9pbl9pYnNzKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC03OTU3LDYgKzgzNjEsOCBAQAogCX0KIAogCWRhdGEgPSBubGFfbmVzdF9zdGFydChza2IsIGF0dHIpOworCWlmICghZGF0YSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKIAkoKHZvaWQgKiopc2tiLT5jYilbMF0gPSByZGV2OwogCSgodm9pZCAqKilza2ItPmNiKVsxXSA9IGhkcjsKQEAgLTg1NzQsMjM4ICs4OTgwLDIxIEBACiAJcmV0dXJuIHJkZXZfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsKHJkZXYsIHdkZXYsIGNvb2tpZSk7CiB9CiAKLXN0YXRpYyB1MzIgcmF0ZXNldF90b19tYXNrKHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAotCQkJICAgdTggKnJhdGVzLCB1OCByYXRlc19sZW4pCi17Ci0JdTggaTsKLQl1MzIgbWFzayA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmF0ZXNfbGVuOyBpKyspIHsKLQkJaW50IHJhdGUgPSAocmF0ZXNbaV0gJiAweDdmKSAqIDU7Ci0JCWludCByaWR4OwotCi0JCWZvciAocmlkeCA9IDA7IHJpZHggPCBzYmFuZC0+bl9iaXRyYXRlczsgcmlkeCsrKSB7Ci0JCQlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnNyYXRlID0KLQkJCQkmc2JhbmQtPmJpdHJhdGVzW3JpZHhdOwotCQkJaWYgKHJhdGUgPT0gc3JhdGUtPmJpdHJhdGUpIHsKLQkJCQltYXNrIHw9IDEgPDwgcmlkeDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAocmlkeCA9PSBzYmFuZC0+bl9iaXRyYXRlcykKLQkJCXJldHVybiAwOyAvKiByYXRlIG5vdCBmb3VuZCAqLwotCX0KLQotCXJldHVybiBtYXNrOwotfQotCi1zdGF0aWMgYm9vbCBodF9yYXRlc2V0X3RvX21hc2soc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCi0JCQkgICAgICAgdTggKnJhdGVzLCB1OCByYXRlc19sZW4sCi0JCQkgICAgICAgdTggbWNzW0lFRUU4MDIxMV9IVF9NQ1NfTUFTS19MRU5dKQotewotCXU4IGk7Ci0KLQltZW1zZXQobWNzLCAwLCBJRUVFODAyMTFfSFRfTUNTX01BU0tfTEVOKTsKLQotCWZvciAoaSA9IDA7IGkgPCByYXRlc19sZW47IGkrKykgewotCQlpbnQgcmlkeCwgcmJpdDsKLQotCQlyaWR4ID0gcmF0ZXNbaV0gLyA4OwotCQlyYml0ID0gQklUKHJhdGVzW2ldICUgOCk7Ci0KLQkJLyogY2hlY2sgdmFsaWRpdHkgKi8KLQkJaWYgKChyaWR4IDwgMCkgfHwgKHJpZHggPj0gSUVFRTgwMjExX0hUX01DU19NQVNLX0xFTikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLyogY2hlY2sgYXZhaWxhYmlsaXR5ICovCi0JCWlmIChzYmFuZC0+aHRfY2FwLm1jcy5yeF9tYXNrW3JpZHhdICYgcmJpdCkKLQkJCW1jc1tyaWR4XSB8PSByYml0OwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB1MTYgdmh0X21jc19tYXBfdG9fbWNzX21hc2sodTggdmh0X21jc19tYXApCi17Ci0JdTE2IG1jc19tYXNrID0gMDsKLQotCXN3aXRjaCAodmh0X21jc19tYXApIHsKLQljYXNlIElFRUU4MDIxMV9WSFRfTUNTX05PVF9TVVBQT1JURUQ6Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX1ZIVF9NQ1NfU1VQUE9SVF8wXzc6Ci0JCW1jc19tYXNrID0gMHgwMEZGOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9WSFRfTUNTX1NVUFBPUlRfMF84OgotCQltY3NfbWFzayA9IDB4MDFGRjsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfVkhUX01DU19TVVBQT1JUXzBfOToKLQkJbWNzX21hc2sgPSAweDAzRkY7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBtY3NfbWFzazsKLX0KLQotc3RhdGljIHZvaWQgdmh0X2J1aWxkX21jc19tYXNrKHUxNiB2aHRfbWNzX21hcCwKLQkJCSAgICAgICB1MTYgdmh0X21jc19tYXNrW05MODAyMTFfVkhUX05TU19NQVhdKQotewotCXU4IG5zczsKLQotCWZvciAobnNzID0gMDsgbnNzIDwgTkw4MDIxMV9WSFRfTlNTX01BWDsgbnNzKyspIHsKLQkJdmh0X21jc19tYXNrW25zc10gPSB2aHRfbWNzX21hcF90b19tY3NfbWFzayh2aHRfbWNzX21hcCAmIDB4MDMpOwotCQl2aHRfbWNzX21hcCA+Pj0gMjsKLQl9Ci19Ci0KLXN0YXRpYyBib29sIHZodF9zZXRfbWNzX21hc2soc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCi0JCQkgICAgIHN0cnVjdCBubDgwMjExX3R4cmF0ZV92aHQgKnR4cmF0ZSwKLQkJCSAgICAgdTE2IG1jc1tOTDgwMjExX1ZIVF9OU1NfTUFYXSkKLXsKLQl1MTYgdHhfbWNzX21hcCA9IGxlMTZfdG9fY3B1KHNiYW5kLT52aHRfY2FwLnZodF9tY3MudHhfbWNzX21hcCk7Ci0JdTE2IHR4X21jc19tYXNrW05MODAyMTFfVkhUX05TU19NQVhdID0ge307Ci0JdTggaTsKLQotCWlmICghc2JhbmQtPnZodF9jYXAudmh0X3N1cHBvcnRlZCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JbWVtc2V0KG1jcywgMCwgc2l6ZW9mKHUxNikgKiBOTDgwMjExX1ZIVF9OU1NfTUFYKTsKLQotCS8qIEJ1aWxkIHZodF9tY3NfbWFzayBmcm9tIFZIVCBjYXBhYmlsaXRpZXMgKi8KLQl2aHRfYnVpbGRfbWNzX21hc2sodHhfbWNzX21hcCwgdHhfbWNzX21hc2spOwotCi0JZm9yIChpID0gMDsgaSA8IE5MODAyMTFfVkhUX05TU19NQVg7IGkrKykgewotCQlpZiAoKHR4X21jc19tYXNrW2ldICYgdHhyYXRlLT5tY3NbaV0pID09IHR4cmF0ZS0+bWNzW2ldKQotCQkJbWNzW2ldID0gdHhyYXRlLT5tY3NbaV07Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5sODAyMTFfdHhhdHRyX3BvbGljeVtOTDgwMjExX1RYUkFURV9NQVggKyAxXSA9IHsKLQlbTkw4MDIxMV9UWFJBVEVfTEVHQUNZXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLAotCQkJCSAgICAubGVuID0gTkw4MDIxMV9NQVhfU1VQUF9SQVRFUyB9LAotCVtOTDgwMjExX1RYUkFURV9IVF0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKLQkJCQkubGVuID0gTkw4MDIxMV9NQVhfU1VQUF9IVF9SQVRFUyB9LAotCVtOTDgwMjExX1RYUkFURV9WSFRdID0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBubDgwMjExX3R4cmF0ZV92aHQpfSwKLQlbTkw4MDIxMV9UWFJBVEVfR0ldID0geyAudHlwZSA9IE5MQV9VOCB9LAotfTsKLQogc3RhdGljIGludCBubDgwMjExX3NldF90eF9iaXRyYXRlX21hc2soc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgICAgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgbmxhdHRyICp0YltOTDgwMjExX1RYUkFURV9NQVggKyAxXTsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKIAlzdHJ1Y3QgY2ZnODAyMTFfYml0cmF0ZV9tYXNrIG1hc2s7Ci0JaW50IHJlbSwgaTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW5mby0+dXNlcl9wdHJbMV07Ci0Jc3RydWN0IG5sYXR0ciAqdHhfcmF0ZXM7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7Ci0JdTE2IHZodF90eF9tY3NfbWFwOworCWludCBlcnI7CiAKIAlpZiAoIXJkZXYtPm9wcy0+c2V0X2JpdHJhdGVfbWFzaykKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JbWVtc2V0KCZtYXNrLCAwLCBzaXplb2YobWFzaykpOwotCS8qIERlZmF1bHQgdG8gYWxsIHJhdGVzIGVuYWJsZWQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX05MODAyMTFfQkFORFM7IGkrKykgewotCQlzYmFuZCA9IHJkZXYtPndpcGh5LmJhbmRzW2ldOworCWVyciA9IG5sODAyMTFfcGFyc2VfdHhfYml0cmF0ZV9tYXNrKGluZm8sICZtYXNrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JCWlmICghc2JhbmQpCi0JCQljb250aW51ZTsKLQotCQltYXNrLmNvbnRyb2xbaV0ubGVnYWN5ID0gKDEgPDwgc2JhbmQtPm5fYml0cmF0ZXMpIC0gMTsKLQkJbWVtY3B5KG1hc2suY29udHJvbFtpXS5odF9tY3MsCi0JCSAgICAgICBzYmFuZC0+aHRfY2FwLm1jcy5yeF9tYXNrLAotCQkgICAgICAgc2l6ZW9mKG1hc2suY29udHJvbFtpXS5odF9tY3MpKTsKLQotCQlpZiAoIXNiYW5kLT52aHRfY2FwLnZodF9zdXBwb3J0ZWQpCi0JCQljb250aW51ZTsKLQotCQl2aHRfdHhfbWNzX21hcCA9IGxlMTZfdG9fY3B1KHNiYW5kLT52aHRfY2FwLnZodF9tY3MudHhfbWNzX21hcCk7Ci0JCXZodF9idWlsZF9tY3NfbWFzayh2aHRfdHhfbWNzX21hcCwgbWFzay5jb250cm9sW2ldLnZodF9tY3MpOwotCX0KLQotCS8qIGlmIG5vIHJhdGVzIGFyZSBnaXZlbiBzZXQgaXQgYmFjayB0byB0aGUgZGVmYXVsdHMgKi8KLQlpZiAoIWluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9UWF9SQVRFU10pCi0JCWdvdG8gb3V0OwotCi0JLyoKLQkgKiBUaGUgbmVzdGVkIGF0dHJpYnV0ZSB1c2VzIGVudW0gbmw4MDIxMV9iYW5kIGFzIHRoZSBpbmRleC4gVGhpcyBtYXBzCi0JICogZGlyZWN0bHkgdG8gdGhlIGVudW0gbmw4MDIxMV9iYW5kIHZhbHVlcyB1c2VkIGluIGNmZzgwMjExLgotCSAqLwotCUJVSUxEX0JVR19PTihOTDgwMjExX01BWF9TVVBQX0hUX1JBVEVTID4gSUVFRTgwMjExX0hUX01DU19NQVNLX0xFTiAqIDgpOwotCW5sYV9mb3JfZWFjaF9uZXN0ZWQodHhfcmF0ZXMsIGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9UWF9SQVRFU10sIHJlbSkgewotCQllbnVtIG5sODAyMTFfYmFuZCBiYW5kID0gbmxhX3R5cGUodHhfcmF0ZXMpOwotCQlpbnQgZXJyOwotCi0JCWlmIChiYW5kIDwgMCB8fCBiYW5kID49IE5VTV9OTDgwMjExX0JBTkRTKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXNiYW5kID0gcmRldi0+d2lwaHkuYmFuZHNbYmFuZF07Ci0JCWlmIChzYmFuZCA9PSBOVUxMKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWVyciA9IG5sYV9wYXJzZSh0YiwgTkw4MDIxMV9UWFJBVEVfTUFYLCBubGFfZGF0YSh0eF9yYXRlcyksCi0JCQkJbmxhX2xlbih0eF9yYXRlcyksIG5sODAyMTFfdHhhdHRyX3BvbGljeSk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCQlpZiAodGJbTkw4MDIxMV9UWFJBVEVfTEVHQUNZXSkgewotCQkJbWFzay5jb250cm9sW2JhbmRdLmxlZ2FjeSA9IHJhdGVzZXRfdG9fbWFzaygKLQkJCQlzYmFuZCwKLQkJCQlubGFfZGF0YSh0YltOTDgwMjExX1RYUkFURV9MRUdBQ1ldKSwKLQkJCQlubGFfbGVuKHRiW05MODAyMTFfVFhSQVRFX0xFR0FDWV0pKTsKLQkJCWlmICgobWFzay5jb250cm9sW2JhbmRdLmxlZ2FjeSA9PSAwKSAmJgotCQkJICAgIG5sYV9sZW4odGJbTkw4MDIxMV9UWFJBVEVfTEVHQUNZXSkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJaWYgKHRiW05MODAyMTFfVFhSQVRFX0hUXSkgewotCQkJaWYgKCFodF9yYXRlc2V0X3RvX21hc2soCi0JCQkJCXNiYW5kLAotCQkJCQlubGFfZGF0YSh0YltOTDgwMjExX1RYUkFURV9IVF0pLAotCQkJCQlubGFfbGVuKHRiW05MODAyMTFfVFhSQVRFX0hUXSksCi0JCQkJCW1hc2suY29udHJvbFtiYW5kXS5odF9tY3MpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWlmICh0YltOTDgwMjExX1RYUkFURV9WSFRdKSB7Ci0JCQlpZiAoIXZodF9zZXRfbWNzX21hc2soCi0JCQkJCXNiYW5kLAotCQkJCQlubGFfZGF0YSh0YltOTDgwMjExX1RYUkFURV9WSFRdKSwKLQkJCQkJbWFzay5jb250cm9sW2JhbmRdLnZodF9tY3MpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWlmICh0YltOTDgwMjExX1RYUkFURV9HSV0pIHsKLQkJCW1hc2suY29udHJvbFtiYW5kXS5naSA9Ci0JCQkJbmxhX2dldF91OCh0YltOTDgwMjExX1RYUkFURV9HSV0pOwotCQkJaWYgKG1hc2suY29udHJvbFtiYW5kXS5naSA+IE5MODAyMTFfVFhSQVRFX0ZPUkNFX0xHSSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmIChtYXNrLmNvbnRyb2xbYmFuZF0ubGVnYWN5ID09IDApIHsKLQkJCS8qIGRvbid0IGFsbG93IGVtcHR5IGxlZ2FjeSByYXRlcyBpZiBIVCBvciBWSFQKLQkJCSAqIGFyZSBub3QgZXZlbiBzdXBwb3J0ZWQuCi0JCQkgKi8KLQkJCWlmICghKHJkZXYtPndpcGh5LmJhbmRzW2JhbmRdLT5odF9jYXAuaHRfc3VwcG9ydGVkIHx8Ci0JCQkgICAgICByZGV2LT53aXBoeS5iYW5kc1tiYW5kXS0+dmh0X2NhcC52aHRfc3VwcG9ydGVkKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9IVF9NQ1NfTUFTS19MRU47IGkrKykKLQkJCQlpZiAobWFzay5jb250cm9sW2JhbmRdLmh0X21jc1tpXSkKLQkJCQkJZ290byBvdXQ7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBOTDgwMjExX1ZIVF9OU1NfTUFYOyBpKyspCi0JCQkJaWYgKG1hc2suY29udHJvbFtiYW5kXS52aHRfbWNzW2ldKQotCQkJCQlnb3RvIG91dDsKLQotCQkJLyogbGVnYWN5IGFuZCBtY3MgcmF0ZXMgbWF5IG5vdCBiZSBib3RoIGVtcHR5ICovCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotb3V0OgogCXJldHVybiByZGV2X3NldF9iaXRyYXRlX21hc2socmRldiwgZGV2LCBOVUxMLCAmbWFzayk7CiB9CiAKQEAgLTg4MzEsNiArOTAyMCw3IEBACiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgogCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQpAQCAtODg3Niw2ICs5MDY2LDcgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CiAJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CkBAIC04OTkyLDYgKzkxODMsNyBAQAogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0dPOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKIAkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KQEAgLTkyMjQsOSArOTQxNiwxMCBAQAogCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfQkVBQ09OX0lOVEVSVkFMXSkgewogCQlzZXR1cC5iZWFjb25faW50ZXJ2YWwgPQogCQkJbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0JFQUNPTl9JTlRFUlZBTF0pOwotCQlpZiAoc2V0dXAuYmVhY29uX2ludGVydmFsIDwgMTAgfHwKLQkJICAgIHNldHVwLmJlYWNvbl9pbnRlcnZhbCA+IDEwMDAwKQotCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZXJyID0gY2ZnODAyMTFfdmFsaWRhdGVfYmVhY29uX2ludChyZGV2LCBzZXR1cC5iZWFjb25faW50ZXJ2YWwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9CiAKIAlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0RUSU1fUEVSSU9EXSkgewpAQCAtOTI3Miw2ICs5NDY1LDE3IEBACiAJCQlyZXR1cm4gZXJyOwogCX0KIAorCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfVFhfUkFURVNdKSB7CisJCWVyciA9IG5sODAyMTFfcGFyc2VfdHhfYml0cmF0ZV9tYXNrKGluZm8sICZzZXR1cC5iZWFjb25fcmF0ZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWVyciA9IHZhbGlkYXRlX2JlYWNvbl90eF9yYXRlKHJkZXYsIHNldHVwLmNoYW5kZWYuY2hhbi0+YmFuZCwKKwkJCQkJICAgICAgJnNldHVwLmJlYWNvbl9yYXRlKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCiAJcmV0dXJuIGNmZzgwMjExX2pvaW5fbWVzaChyZGV2LCBkZXYsICZzZXR1cCwgJmNmZyk7CiB9CiAKQEAgLTkzODUsMTggKzk1ODksMjcgQEAKIAlpZiAoIWZyZXFzKQogCQlyZXR1cm4gLUVOT0JVRlM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcmVxLT5uX2NoYW5uZWxzOyBpKyspCi0JCW5sYV9wdXRfdTMyKG1zZywgaSwgcmVxLT5jaGFubmVsc1tpXS0+Y2VudGVyX2ZyZXEpOworCWZvciAoaSA9IDA7IGkgPCByZXEtPm5fY2hhbm5lbHM7IGkrKykgeworCQlpZiAobmxhX3B1dF91MzIobXNnLCBpLCByZXEtPmNoYW5uZWxzW2ldLT5jZW50ZXJfZnJlcSkpCisJCQlyZXR1cm4gLUVOT0JVRlM7CisJfQogCiAJbmxhX25lc3RfZW5kKG1zZywgZnJlcXMpOwogCiAJaWYgKHJlcS0+bl9tYXRjaF9zZXRzKSB7CiAJCW1hdGNoZXMgPSBubGFfbmVzdF9zdGFydChtc2csIE5MODAyMTFfQVRUUl9TQ0hFRF9TQ0FOX01BVENIKTsKKwkJaWYgKCFtYXRjaGVzKQorCQkJcmV0dXJuIC1FTk9CVUZTOworCiAJCWZvciAoaSA9IDA7IGkgPCByZXEtPm5fbWF0Y2hfc2V0czsgaSsrKSB7CiAJCQltYXRjaCA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgaSk7Ci0JCQlubGFfcHV0KG1zZywgTkw4MDIxMV9TQ0hFRF9TQ0FOX01BVENIX0FUVFJfU1NJRCwKLQkJCQlyZXEtPm1hdGNoX3NldHNbaV0uc3NpZC5zc2lkX2xlbiwKLQkJCQlyZXEtPm1hdGNoX3NldHNbaV0uc3NpZC5zc2lkKTsKKwkJCWlmICghbWF0Y2gpCisJCQkJcmV0dXJuIC1FTk9CVUZTOworCisJCQlpZiAobmxhX3B1dChtc2csIE5MODAyMTFfU0NIRURfU0NBTl9NQVRDSF9BVFRSX1NTSUQsCisJCQkJICAgIHJlcS0+bWF0Y2hfc2V0c1tpXS5zc2lkLnNzaWRfbGVuLAorCQkJCSAgICByZXEtPm1hdGNoX3NldHNbaV0uc3NpZC5zc2lkKSkKKwkJCQlyZXR1cm4gLUVOT0JVRlM7CiAJCQlubGFfbmVzdF9lbmQobXNnLCBtYXRjaCk7CiAJCX0KIAkJbmxhX25lc3RfZW5kKG1zZywgbWF0Y2hlcyk7CkBAIC05NDA4LDYgKzk2MjEsOSBAQAogCiAJZm9yIChpID0gMDsgaSA8IHJlcS0+bl9zY2FuX3BsYW5zOyBpKyspIHsKIAkJc2Nhbl9wbGFuID0gbmxhX25lc3Rfc3RhcnQobXNnLCBpICsgMSk7CisJCWlmICghc2Nhbl9wbGFuKQorCQkJcmV0dXJuIC1FTk9CVUZTOworCiAJCWlmICghc2Nhbl9wbGFuIHx8CiAJCSAgICBubGFfcHV0X3UzMihtc2csIE5MODAyMTFfU0NIRURfU0NBTl9QTEFOX0lOVEVSVkFMLAogCQkJCXJlcS0+c2Nhbl9wbGFuc1tpXS5pbnRlcnZhbCkgfHwKQEAgLTEwMzM0LDYgKzEwNTUwLDU0OSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG5sODAyMTFfc3RhcnRfbmFuKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby0+dXNlcl9wdHJbMF07CisJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGluZm8tPnVzZXJfcHRyWzFdOworCXN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiBjb25mID0ge307CisJaW50IGVycjsKKworCWlmICh3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAod2Rldi0+bmFuX3N0YXJ0ZWQpCisJCXJldHVybiAtRUVYSVNUOworCisJaWYgKHJma2lsbF9ibG9ja2VkKHJkZXYtPnJma2lsbCkpCisJCXJldHVybiAtRVJGS0lMTDsKKworCWlmICghaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX05BTl9NQVNURVJfUFJFRl0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTkFOX0RVQUxdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvbmYubWFzdGVyX3ByZWYgPQorCQlubGFfZ2V0X3U4KGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9OQU5fTUFTVEVSX1BSRUZdKTsKKwlpZiAoIWNvbmYubWFzdGVyX3ByZWYpCisJCXJldHVybiAtRUlOVkFMOworCisJY29uZi5kdWFsID0gbmxhX2dldF91OChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTkFOX0RVQUxdKTsKKworCWVyciA9IHJkZXZfc3RhcnRfbmFuKHJkZXYsIHdkZXYsICZjb25mKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJd2Rldi0+bmFuX3N0YXJ0ZWQgPSB0cnVlOworCXJkZXYtPm9wZW5jb3VudCsrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmw4MDIxMV9zdG9wX25hbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGluZm8tPnVzZXJfcHRyWzBdOworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBpbmZvLT51c2VyX3B0clsxXTsKKworCWlmICh3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwljZmc4MDIxMV9zdG9wX25hbihyZGV2LCB3ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhbGlkYXRlX25hbl9maWx0ZXIoc3RydWN0IG5sYXR0ciAqZmlsdGVyX2F0dHIpCit7CisJc3RydWN0IG5sYXR0ciAqYXR0cjsKKwlpbnQgbGVuID0gMCwgbl9lbnRyaWVzID0gMCwgcmVtOworCisJbmxhX2Zvcl9lYWNoX25lc3RlZChhdHRyLCBmaWx0ZXJfYXR0ciwgcmVtKSB7CisJCWxlbiArPSBubGFfbGVuKGF0dHIpOworCQluX2VudHJpZXMrKzsKKwl9CisKKwlpZiAobGVuID49IFU4X01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gbl9lbnRyaWVzOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9uYW5fZmlsdGVyKHN0cnVjdCBubGF0dHIgKmF0dHJfZmlsdGVyLAorCQkJICAgICBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgKmZ1bmMsCisJCQkgICAgIGJvb2wgdHgpCit7CisJc3RydWN0IG5sYXR0ciAqYXR0cjsKKwlpbnQgbl9lbnRyaWVzLCByZW0sIGk7CisJc3RydWN0IGNmZzgwMjExX25hbl9mdW5jX2ZpbHRlciAqZmlsdGVyOworCisJbl9lbnRyaWVzID0gdmFsaWRhdGVfbmFuX2ZpbHRlcihhdHRyX2ZpbHRlcik7CisJaWYgKG5fZW50cmllcyA8IDApCisJCXJldHVybiBuX2VudHJpZXM7CisKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKCpmdW5jLT5yeF9maWx0ZXJzKSAhPSBzaXplb2YoKmZ1bmMtPnR4X2ZpbHRlcnMpKTsKKworCWZpbHRlciA9IGtjYWxsb2Mobl9lbnRyaWVzLCBzaXplb2YoKmZ1bmMtPnJ4X2ZpbHRlcnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpbHRlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpID0gMDsKKwlubGFfZm9yX2VhY2hfbmVzdGVkKGF0dHIsIGF0dHJfZmlsdGVyLCByZW0pIHsKKwkJZmlsdGVyW2ldLmZpbHRlciA9IGttZW1kdXAobmxhX2RhdGEoYXR0ciksIG5sYV9sZW4oYXR0ciksCisJCQkJCSAgIEdGUF9LRVJORUwpOworCQlmaWx0ZXJbaV0ubGVuID0gbmxhX2xlbihhdHRyKTsKKwkJaSsrOworCX0KKwlpZiAodHgpIHsKKwkJZnVuYy0+bnVtX3R4X2ZpbHRlcnMgPSBuX2VudHJpZXM7CisJCWZ1bmMtPnR4X2ZpbHRlcnMgPSBmaWx0ZXI7CisJfSBlbHNlIHsKKwkJZnVuYy0+bnVtX3J4X2ZpbHRlcnMgPSBuX2VudHJpZXM7CisJCWZ1bmMtPnJ4X2ZpbHRlcnMgPSBmaWx0ZXI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmw4MDIxMV9uYW5fYWRkX2Z1bmMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQlzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGluZm8tPnVzZXJfcHRyWzBdOworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBpbmZvLT51c2VyX3B0clsxXTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltOVU1fTkw4MDIxMV9OQU5fRlVOQ19BVFRSXSwgKmZ1bmNfYXR0cjsKKwlzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgKmZ1bmM7CisJc3RydWN0IHNrX2J1ZmYgKm1zZyA9IE5VTEw7CisJdm9pZCAqaGRyID0gTlVMTDsKKwlpbnQgZXJyID0gMDsKKworCWlmICh3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIXdkZXYtPm5hbl9zdGFydGVkKQorCQlyZXR1cm4gLUVOT1RDT05OOworCisJaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTkFOX0ZVTkNdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3ZGV2LT5vd25lcl9ubHBvcnRpZCAmJgorCSAgICB3ZGV2LT5vd25lcl9ubHBvcnRpZCAhPSBpbmZvLT5zbmRfcG9ydGlkKQorCQlyZXR1cm4gLUVOT1RDT05OOworCisJZXJyID0gbmxhX3BhcnNlKHRiLCBOTDgwMjExX05BTl9GVU5DX0FUVFJfTUFYLAorCQkJbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX05BTl9GVU5DXSksCisJCQlubGFfbGVuKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9OQU5fRlVOQ10pLAorCQkJbmw4MDIxMV9uYW5fZnVuY19wb2xpY3kpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlmdW5jID0ga3phbGxvYyhzaXplb2YoKmZ1bmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZ1bmMpCisJCXJldHVybiAtRU5PTUVNOworCisJZnVuYy0+Y29va2llID0gd2Rldi0+d2lwaHktPmNvb2tpZV9jb3VudGVyKys7CisKKwlpZiAoIXRiW05MODAyMTFfTkFOX0ZVTkNfVFlQRV0gfHwKKwkgICAgbmxhX2dldF91OCh0YltOTDgwMjExX05BTl9GVU5DX1RZUEVdKSA+IE5MODAyMTFfTkFOX0ZVTkNfTUFYX1RZUEUpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisKKwlmdW5jLT50eXBlID0gbmxhX2dldF91OCh0YltOTDgwMjExX05BTl9GVU5DX1RZUEVdKTsKKworCWlmICghdGJbTkw4MDIxMV9OQU5fRlVOQ19TRVJWSUNFX0lEXSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1jcHkoZnVuYy0+c2VydmljZV9pZCwgbmxhX2RhdGEodGJbTkw4MDIxMV9OQU5fRlVOQ19TRVJWSUNFX0lEXSksCisJICAgICAgIHNpemVvZihmdW5jLT5zZXJ2aWNlX2lkKSk7CisKKwlmdW5jLT5jbG9zZV9yYW5nZSA9CisJCW5sYV9nZXRfZmxhZyh0YltOTDgwMjExX05BTl9GVU5DX0NMT1NFX1JBTkdFXSk7CisKKwlpZiAodGJbTkw4MDIxMV9OQU5fRlVOQ19TRVJWSUNFX0lORk9dKSB7CisJCWZ1bmMtPnNlcnZfc3BlY19pbmZvX2xlbiA9CisJCQlubGFfbGVuKHRiW05MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JTkZPXSk7CisJCWZ1bmMtPnNlcnZfc3BlY19pbmZvID0KKwkJCWttZW1kdXAobmxhX2RhdGEodGJbTkw4MDIxMV9OQU5fRlVOQ19TRVJWSUNFX0lORk9dKSwKKwkJCQlmdW5jLT5zZXJ2X3NwZWNfaW5mb19sZW4sCisJCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghZnVuYy0+c2Vydl9zcGVjX2luZm8pIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmICh0YltOTDgwMjExX05BTl9GVU5DX1RUTF0pCisJCWZ1bmMtPnR0bCA9IG5sYV9nZXRfdTMyKHRiW05MODAyMTFfTkFOX0ZVTkNfVFRMXSk7CisKKwlzd2l0Y2ggKGZ1bmMtPnR5cGUpIHsKKwljYXNlIE5MODAyMTFfTkFOX0ZVTkNfUFVCTElTSDoKKwkJaWYgKCF0YltOTDgwMjExX05BTl9GVU5DX1BVQkxJU0hfVFlQRV0pIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWZ1bmMtPnB1Ymxpc2hfdHlwZSA9CisJCQlubGFfZ2V0X3U4KHRiW05MODAyMTFfTkFOX0ZVTkNfUFVCTElTSF9UWVBFXSk7CisJCWZ1bmMtPnB1Ymxpc2hfYmNhc3QgPQorCQkJbmxhX2dldF9mbGFnKHRiW05MODAyMTFfTkFOX0ZVTkNfUFVCTElTSF9CQ0FTVF0pOworCisJCWlmICgoIShmdW5jLT5wdWJsaXNoX3R5cGUgJiBOTDgwMjExX05BTl9TT0xJQ0lURURfUFVCTElTSCkpICYmCisJCQlmdW5jLT5wdWJsaXNoX2JjYXN0KSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX05BTl9GVU5DX1NVQlNDUklCRToKKwkJZnVuYy0+c3Vic2NyaWJlX2FjdGl2ZSA9CisJCQlubGFfZ2V0X2ZsYWcodGJbTkw4MDIxMV9OQU5fRlVOQ19TVUJTQ1JJQkVfQUNUSVZFXSk7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVA6CisJCWlmICghdGJbTkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVBfSURdIHx8CisJCSAgICAhdGJbTkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVBfUkVRX0lEXSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZnVuYy0+Zm9sbG93dXBfaWQgPQorCQkJbmxhX2dldF91OCh0YltOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUF9JRF0pOworCQlmdW5jLT5mb2xsb3d1cF9yZXFpZCA9CisJCQlubGFfZ2V0X3U4KHRiW05MODAyMTFfTkFOX0ZVTkNfRk9MTE9XX1VQX1JFUV9JRF0pOworCQltZW1jcHkoZnVuYy0+Zm9sbG93dXBfZGVzdC5hZGRyLAorCQkgICAgICAgbmxhX2RhdGEodGJbTkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVBfREVTVF0pLAorCQkgICAgICAgc2l6ZW9mKGZ1bmMtPmZvbGxvd3VwX2Rlc3QuYWRkcikpOworCQlpZiAoZnVuYy0+dHRsKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHRiW05MODAyMTFfTkFOX0ZVTkNfU1JGXSkgeworCQlzdHJ1Y3QgbmxhdHRyICpzcmZfdGJbTlVNX05MODAyMTFfTkFOX1NSRl9BVFRSXTsKKworCQllcnIgPSBubGFfcGFyc2Uoc3JmX3RiLCBOTDgwMjExX05BTl9TUkZfQVRUUl9NQVgsCisJCQkJbmxhX2RhdGEodGJbTkw4MDIxMV9OQU5fRlVOQ19TUkZdKSwKKwkJCQlubGFfbGVuKHRiW05MODAyMTFfTkFOX0ZVTkNfU1JGXSksIE5VTEwpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisKKwkJZnVuYy0+c3JmX2luY2x1ZGUgPQorCQkJbmxhX2dldF9mbGFnKHNyZl90YltOTDgwMjExX05BTl9TUkZfSU5DTFVERV0pOworCisJCWlmIChzcmZfdGJbTkw4MDIxMV9OQU5fU1JGX0JGXSkgeworCQkJaWYgKHNyZl90YltOTDgwMjExX05BTl9TUkZfTUFDX0FERFJTXSB8fAorCQkJICAgICFzcmZfdGJbTkw4MDIxMV9OQU5fU1JGX0JGX0lEWF0pIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlmdW5jLT5zcmZfYmZfbGVuID0KKwkJCQlubGFfbGVuKHNyZl90YltOTDgwMjExX05BTl9TUkZfQkZdKTsKKwkJCWZ1bmMtPnNyZl9iZiA9CisJCQkJa21lbWR1cChubGFfZGF0YShzcmZfdGJbTkw4MDIxMV9OQU5fU1JGX0JGXSksCisJCQkJCWZ1bmMtPnNyZl9iZl9sZW4sIEdGUF9LRVJORUwpOworCQkJaWYgKCFmdW5jLT5zcmZfYmYpIHsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlmdW5jLT5zcmZfYmZfaWR4ID0KKwkJCQlubGFfZ2V0X3U4KHNyZl90YltOTDgwMjExX05BTl9TUkZfQkZfSURYXSk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgbmxhdHRyICphdHRyLCAqbWFjX2F0dHIgPQorCQkJCXNyZl90YltOTDgwMjExX05BTl9TUkZfTUFDX0FERFJTXTsKKwkJCWludCBuX2VudHJpZXMsIHJlbSwgaSA9IDA7CisKKwkJCWlmICghbWFjX2F0dHIpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQluX2VudHJpZXMgPSB2YWxpZGF0ZV9hY2xfbWFjX2FkZHJzKG1hY19hdHRyKTsKKwkJCWlmIChuX2VudHJpZXMgPD0gMCkgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWZ1bmMtPnNyZl9udW1fbWFjcyA9IG5fZW50cmllczsKKwkJCWZ1bmMtPnNyZl9tYWNzID0KKwkJCQlremFsbG9jKHNpemVvZigqZnVuYy0+c3JmX21hY3MpICogbl9lbnRyaWVzLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghZnVuYy0+c3JmX21hY3MpIHsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlubGFfZm9yX2VhY2hfbmVzdGVkKGF0dHIsIG1hY19hdHRyLCByZW0pCisJCQkJbWVtY3B5KGZ1bmMtPnNyZl9tYWNzW2krK10uYWRkciwgbmxhX2RhdGEoYXR0ciksCisJCQkJICAgICAgIHNpemVvZigqZnVuYy0+c3JmX21hY3MpKTsKKwkJfQorCX0KKworCWlmICh0YltOTDgwMjExX05BTl9GVU5DX1RYX01BVENIX0ZJTFRFUl0pIHsKKwkJZXJyID0gaGFuZGxlX25hbl9maWx0ZXIodGJbTkw4MDIxMV9OQU5fRlVOQ19UWF9NQVRDSF9GSUxURVJdLAorCQkJCQlmdW5jLCB0cnVlKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCWlmICh0YltOTDgwMjExX05BTl9GVU5DX1JYX01BVENIX0ZJTFRFUl0pIHsKKwkJZXJyID0gaGFuZGxlX25hbl9maWx0ZXIodGJbTkw4MDIxMV9OQU5fRlVOQ19SWF9NQVRDSF9GSUxURVJdLAorCQkJCQlmdW5jLCBmYWxzZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwl9CisKKwltc2cgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zZykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwloZHIgPSBubDgwMjExaGRyX3B1dChtc2csIGluZm8tPnNuZF9wb3J0aWQsIGluZm8tPnNuZF9zZXEsIDAsCisJCQkgICAgIE5MODAyMTFfQ01EX0FERF9OQU5fRlVOQ1RJT04pOworCS8qIFRoaXMgY2FuJ3QgcmVhbGx5IGhhcHBlbiAtIHdlIGp1c3QgYWxsb2NhdGVkIDRLQiAqLworCWlmIChXQVJOX09OKCFoZHIpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IHJkZXZfYWRkX25hbl9mdW5jKHJkZXYsIHdkZXYsIGZ1bmMpOworb3V0OgorCWlmIChlcnIgPCAwKSB7CisJCWNmZzgwMjExX2ZyZWVfbmFuX2Z1bmMoZnVuYyk7CisJCW5sbXNnX2ZyZWUobXNnKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBwcm9wYWdhdGUgdGhlIGluc3RhbmNlIGlkIGFuZCBjb29raWUgdG8gdXNlcnNwYWNlICAqLworCWlmIChubGFfcHV0X3U2NF82NGJpdChtc2csIE5MODAyMTFfQVRUUl9DT09LSUUsIGZ1bmMtPmNvb2tpZSwKKwkJCSAgICAgIE5MODAyMTFfQVRUUl9QQUQpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWZ1bmNfYXR0ciA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgTkw4MDIxMV9BVFRSX05BTl9GVU5DKTsKKwlpZiAoIWZ1bmNfYXR0cikKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAobmxhX3B1dF91OChtc2csIE5MODAyMTFfTkFOX0ZVTkNfSU5TVEFOQ0VfSUQsCisJCSAgICAgICBmdW5jLT5pbnN0YW5jZV9pZCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJbmxhX25lc3RfZW5kKG1zZywgZnVuY19hdHRyKTsKKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKwlyZXR1cm4gZ2VubG1zZ19yZXBseShtc2csIGluZm8pOworCitubGFfcHV0X2ZhaWx1cmU6CisJbmxtc2dfZnJlZShtc2cpOworCXJldHVybiAtRU5PQlVGUzsKK30KKworc3RhdGljIGludCBubDgwMjExX25hbl9kZWxfZnVuYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby0+dXNlcl9wdHJbMF07CisJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGluZm8tPnVzZXJfcHRyWzFdOworCXU2NCBjb29raWU7CisKKwlpZiAod2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX05BTikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCF3ZGV2LT5uYW5fc3RhcnRlZCkKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKworCWlmICghaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0NPT0tJRV0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdkZXYtPm93bmVyX25scG9ydGlkICYmCisJICAgIHdkZXYtPm93bmVyX25scG9ydGlkICE9IGluZm8tPnNuZF9wb3J0aWQpCisJCXJldHVybiAtRU5PVENPTk47CisKKwljb29raWUgPSBubGFfZ2V0X3U2NChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfQ09PS0lFXSk7CisKKwlyZGV2X2RlbF9uYW5fZnVuYyhyZGV2LCB3ZGV2LCBjb29raWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmw4MDIxMV9uYW5fY2hhbmdlX2NvbmZpZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gaW5mby0+dXNlcl9wdHJbMV07CisJc3RydWN0IGNmZzgwMjExX25hbl9jb25mIGNvbmYgPSB7fTsKKwl1MzIgY2hhbmdlZCA9IDA7CisKKwlpZiAod2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX05BTikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCF3ZGV2LT5uYW5fc3RhcnRlZCkKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKworCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTkFOX01BU1RFUl9QUkVGXSkgeworCQljb25mLm1hc3Rlcl9wcmVmID0KKwkJCW5sYV9nZXRfdTgoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX05BTl9NQVNURVJfUFJFRl0pOworCQlpZiAoY29uZi5tYXN0ZXJfcHJlZiA8PSAxIHx8IGNvbmYubWFzdGVyX3ByZWYgPT0gMjU1KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY2hhbmdlZCB8PSBDRkc4MDIxMV9OQU5fQ09ORl9DSEFOR0VEX1BSRUY7CisJfQorCisJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9OQU5fRFVBTF0pIHsKKwkJY29uZi5kdWFsID0gbmxhX2dldF91OChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTkFOX0RVQUxdKTsKKwkJY2hhbmdlZCB8PSBDRkc4MDIxMV9OQU5fQ09ORl9DSEFOR0VEX0RVQUw7CisJfQorCisJaWYgKCFjaGFuZ2VkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiByZGV2X25hbl9jaGFuZ2VfY29uZihyZGV2LCB3ZGV2LCAmY29uZiwgY2hhbmdlZCk7Cit9CisKK3ZvaWQgY2ZnODAyMTFfbmFuX21hdGNoKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQlzdHJ1Y3QgY2ZnODAyMTFfbmFuX21hdGNoX3BhcmFtcyAqbWF0Y2gsIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2Rldi0+d2lwaHk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3aXBoeSk7CisJc3RydWN0IG5sYXR0ciAqbWF0Y2hfYXR0ciwgKmxvY2FsX2Z1bmNfYXR0ciwgKnBlZXJfZnVuY19hdHRyOworCXN0cnVjdCBza19idWZmICptc2c7CisJdm9pZCAqaGRyOworCisJaWYgKFdBUk5fT04oIW1hdGNoLT5pbnN0X2lkIHx8ICFtYXRjaC0+cGVlcl9pbnN0X2lkIHx8ICFtYXRjaC0+YWRkcikpCisJCXJldHVybjsKKworCW1zZyA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIGdmcCk7CisJaWYgKCFtc2cpCisJCXJldHVybjsKKworCWhkciA9IG5sODAyMTFoZHJfcHV0KG1zZywgMCwgMCwgMCwgTkw4MDIxMV9DTURfTkFOX01BVENIKTsKKwlpZiAoIWhkcikgeworCQlubG1zZ19mcmVlKG1zZyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobmxhX3B1dF91MzIobXNnLCBOTDgwMjExX0FUVFJfV0lQSFksIHJkZXYtPndpcGh5X2lkeCkgfHwKKwkgICAgKHdkZXYtPm5ldGRldiAmJiBubGFfcHV0X3UzMihtc2csIE5MODAyMTFfQVRUUl9JRklOREVYLAorCQkJCQkgd2Rldi0+bmV0ZGV2LT5pZmluZGV4KSkgfHwKKwkgICAgbmxhX3B1dF91NjRfNjRiaXQobXNnLCBOTDgwMjExX0FUVFJfV0RFViwgd2Rldl9pZCh3ZGV2KSwKKwkJCSAgICAgIE5MODAyMTFfQVRUUl9QQUQpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWlmIChubGFfcHV0X3U2NF82NGJpdChtc2csIE5MODAyMTFfQVRUUl9DT09LSUUsIG1hdGNoLT5jb29raWUsCisJCQkgICAgICBOTDgwMjExX0FUVFJfUEFEKSB8fAorCSAgICBubGFfcHV0KG1zZywgTkw4MDIxMV9BVFRSX01BQywgRVRIX0FMRU4sIG1hdGNoLT5hZGRyKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwltYXRjaF9hdHRyID0gbmxhX25lc3Rfc3RhcnQobXNnLCBOTDgwMjExX0FUVFJfTkFOX01BVENIKTsKKwlpZiAoIW1hdGNoX2F0dHIpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJbG9jYWxfZnVuY19hdHRyID0gbmxhX25lc3Rfc3RhcnQobXNnLCBOTDgwMjExX05BTl9NQVRDSF9GVU5DX0xPQ0FMKTsKKwlpZiAoIWxvY2FsX2Z1bmNfYXR0cikKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAobmxhX3B1dF91OChtc2csIE5MODAyMTFfTkFOX0ZVTkNfSU5TVEFOQ0VfSUQsIG1hdGNoLT5pbnN0X2lkKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlubGFfbmVzdF9lbmQobXNnLCBsb2NhbF9mdW5jX2F0dHIpOworCisJcGVlcl9mdW5jX2F0dHIgPSBubGFfbmVzdF9zdGFydChtc2csIE5MODAyMTFfTkFOX01BVENIX0ZVTkNfUEVFUik7CisJaWYgKCFwZWVyX2Z1bmNfYXR0cikKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAobmxhX3B1dF91OChtc2csIE5MODAyMTFfTkFOX0ZVTkNfVFlQRSwgbWF0Y2gtPnR5cGUpIHx8CisJICAgIG5sYV9wdXRfdTgobXNnLCBOTDgwMjExX05BTl9GVU5DX0lOU1RBTkNFX0lELCBtYXRjaC0+cGVlcl9pbnN0X2lkKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAobWF0Y2gtPmluZm8gJiYgbWF0Y2gtPmluZm9fbGVuICYmCisJICAgIG5sYV9wdXQobXNnLCBOTDgwMjExX05BTl9GVU5DX1NFUlZJQ0VfSU5GTywgbWF0Y2gtPmluZm9fbGVuLAorCQkgICAgbWF0Y2gtPmluZm8pKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCW5sYV9uZXN0X2VuZChtc2csIHBlZXJfZnVuY19hdHRyKTsKKwlubGFfbmVzdF9lbmQobXNnLCBtYXRjaF9hdHRyKTsKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisKKwlpZiAoIXdkZXYtPm93bmVyX25scG9ydGlkKQorCQlnZW5sbXNnX211bHRpY2FzdF9uZXRucygmbmw4MDIxMV9mYW0sIHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLAorCQkJCQltc2csIDAsIE5MODAyMTFfTUNHUlBfTkFOLCBnZnApOworCWVsc2UKKwkJZ2VubG1zZ191bmljYXN0KHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csCisJCQkJd2Rldi0+b3duZXJfbmxwb3J0aWQpOworCisJcmV0dXJuOworCitubGFfcHV0X2ZhaWx1cmU6CisJbmxtc2dfZnJlZShtc2cpOworfQorRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9uYW5fbWF0Y2gpOworCit2b2lkIGNmZzgwMjExX25hbl9mdW5jX3Rlcm1pbmF0ZWQoc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgIHU4IGluc3RfaWQsCisJCQkJICBlbnVtIG5sODAyMTFfbmFuX2Z1bmNfdGVybV9yZWFzb24gcmVhc29uLAorCQkJCSAgdTY0IGNvb2tpZSwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3ZGV2LT53aXBoeTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOworCXN0cnVjdCBubGF0dHIgKmZ1bmNfYXR0cjsKKwl2b2lkICpoZHI7CisKKwlpZiAoV0FSTl9PTighaW5zdF9pZCkpCisJCXJldHVybjsKKworCW1zZyA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIGdmcCk7CisJaWYgKCFtc2cpCisJCXJldHVybjsKKworCWhkciA9IG5sODAyMTFoZHJfcHV0KG1zZywgMCwgMCwgMCwgTkw4MDIxMV9DTURfREVMX05BTl9GVU5DVElPTik7CisJaWYgKCFoZHIpIHsKKwkJbmxtc2dfZnJlZShtc2cpOworCQlyZXR1cm47CisJfQorCisJaWYgKG5sYV9wdXRfdTMyKG1zZywgTkw4MDIxMV9BVFRSX1dJUEhZLCByZGV2LT53aXBoeV9pZHgpIHx8CisJICAgICh3ZGV2LT5uZXRkZXYgJiYgbmxhX3B1dF91MzIobXNnLCBOTDgwMjExX0FUVFJfSUZJTkRFWCwKKwkJCQkJIHdkZXYtPm5ldGRldi0+aWZpbmRleCkpIHx8CisJICAgIG5sYV9wdXRfdTY0XzY0Yml0KG1zZywgTkw4MDIxMV9BVFRSX1dERVYsIHdkZXZfaWQod2RldiksCisJCQkgICAgICBOTDgwMjExX0FUVFJfUEFEKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAobmxhX3B1dF91NjRfNjRiaXQobXNnLCBOTDgwMjExX0FUVFJfQ09PS0lFLCBjb29raWUsCisJCQkgICAgICBOTDgwMjExX0FUVFJfUEFEKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlmdW5jX2F0dHIgPSBubGFfbmVzdF9zdGFydChtc2csIE5MODAyMTFfQVRUUl9OQU5fRlVOQyk7CisJaWYgKCFmdW5jX2F0dHIpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKG5sYV9wdXRfdTgobXNnLCBOTDgwMjExX05BTl9GVU5DX0lOU1RBTkNFX0lELCBpbnN0X2lkKSB8fAorCSAgICBubGFfcHV0X3U4KG1zZywgTkw4MDIxMV9OQU5fRlVOQ19URVJNX1JFQVNPTiwgcmVhc29uKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlubGFfbmVzdF9lbmQobXNnLCBmdW5jX2F0dHIpOworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKworCWlmICghd2Rldi0+b3duZXJfbmxwb3J0aWQpCisJCWdlbmxtc2dfbXVsdGljYXN0X25ldG5zKCZubDgwMjExX2ZhbSwgd2lwaHlfbmV0KCZyZGV2LT53aXBoeSksCisJCQkJCW1zZywgMCwgTkw4MDIxMV9NQ0dSUF9OQU4sIGdmcCk7CisJZWxzZQorCQlnZW5sbXNnX3VuaWNhc3Qod2lwaHlfbmV0KCZyZGV2LT53aXBoeSksIG1zZywKKwkJCQl3ZGV2LT5vd25lcl9ubHBvcnRpZCk7CisKKwlyZXR1cm47CisKK25sYV9wdXRfZmFpbHVyZToKKwlubG1zZ19mcmVlKG1zZyk7Cit9CitFWFBPUlRfU1lNQk9MKGNmZzgwMjExX25hbl9mdW5jX3Rlcm1pbmF0ZWQpOworCiBzdGF0aWMgaW50IG5sODAyMTFfZ2V0X3Byb3RvY29sX2ZlYXR1cmVzKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCSBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewpAQCAtMTEwMzUsNyArMTE3OTQsMTQgQEAKIAogCQkJZGV2X2hvbGQoZGV2KTsKIAkJfSBlbHNlIGlmIChvcHMtPmludGVybmFsX2ZsYWdzICYgTkw4MDIxMV9GTEFHX0NIRUNLX05FVERFVl9VUCkgewotCQkJaWYgKCF3ZGV2LT5wMnBfc3RhcnRlZCkgeworCQkJaWYgKHdkZXYtPmlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFICYmCisJCQkgICAgIXdkZXYtPnAycF9zdGFydGVkKSB7CisJCQkJaWYgKHJ0bmwpCisJCQkJCXJ0bmxfdW5sb2NrKCk7CisJCQkJcmV0dXJuIC1FTkVURE9XTjsKKwkJCX0KKwkJCWlmICh3ZGV2LT5pZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTkFOICYmCisJCQkgICAgIXdkZXYtPm5hbl9zdGFydGVkKSB7CiAJCQkJaWYgKHJ0bmwpCiAJCQkJCXJ0bmxfdW5sb2NrKCk7CiAJCQkJcmV0dXJuIC1FTkVURE9XTjsKQEAgLTExNjY5LDYgKzEyNDM1LDQ2IEBACiAJCQkJICBOTDgwMjExX0ZMQUdfTkVFRF9SVE5MLAogCX0sCiAJeworCQkuY21kID0gTkw4MDIxMV9DTURfU1RBUlRfTkFOLAorCQkuZG9pdCA9IG5sODAyMTFfc3RhcnRfbmFuLAorCQkucG9saWN5ID0gbmw4MDIxMV9wb2xpY3ksCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkJLmludGVybmFsX2ZsYWdzID0gTkw4MDIxMV9GTEFHX05FRURfV0RFViB8CisJCQkJICBOTDgwMjExX0ZMQUdfTkVFRF9SVE5MLAorCX0sCisJeworCQkuY21kID0gTkw4MDIxMV9DTURfU1RPUF9OQU4sCisJCS5kb2l0ID0gbmw4MDIxMV9zdG9wX25hbiwKKwkJLnBvbGljeSA9IG5sODAyMTFfcG9saWN5LAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJCS5pbnRlcm5hbF9mbGFncyA9IE5MODAyMTFfRkxBR19ORUVEX1dERVZfVVAgfAorCQkJCSAgTkw4MDIxMV9GTEFHX05FRURfUlROTCwKKwl9LAorCXsKKwkJLmNtZCA9IE5MODAyMTFfQ01EX0FERF9OQU5fRlVOQ1RJT04sCisJCS5kb2l0ID0gbmw4MDIxMV9uYW5fYWRkX2Z1bmMsCisJCS5wb2xpY3kgPSBubDgwMjExX3BvbGljeSwKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkuaW50ZXJuYWxfZmxhZ3MgPSBOTDgwMjExX0ZMQUdfTkVFRF9XREVWX1VQIHwKKwkJCQkgIE5MODAyMTFfRkxBR19ORUVEX1JUTkwsCisJfSwKKwl7CisJCS5jbWQgPSBOTDgwMjExX0NNRF9ERUxfTkFOX0ZVTkNUSU9OLAorCQkuZG9pdCA9IG5sODAyMTFfbmFuX2RlbF9mdW5jLAorCQkucG9saWN5ID0gbmw4MDIxMV9wb2xpY3ksCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkJLmludGVybmFsX2ZsYWdzID0gTkw4MDIxMV9GTEFHX05FRURfV0RFVl9VUCB8CisJCQkJICBOTDgwMjExX0ZMQUdfTkVFRF9SVE5MLAorCX0sCisJeworCQkuY21kID0gTkw4MDIxMV9DTURfQ0hBTkdFX05BTl9DT05GSUcsCisJCS5kb2l0ID0gbmw4MDIxMV9uYW5fY2hhbmdlX2NvbmZpZywKKwkJLnBvbGljeSA9IG5sODAyMTFfcG9saWN5LAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJCS5pbnRlcm5hbF9mbGFncyA9IE5MODAyMTFfRkxBR19ORUVEX1dERVZfVVAgfAorCQkJCSAgTkw4MDIxMV9GTEFHX05FRURfUlROTCwKKwl9LAorCXsKIAkJLmNtZCA9IE5MODAyMTFfQ01EX1NFVF9NQ0FTVF9SQVRFLAogCQkuZG9pdCA9IG5sODAyMTFfc2V0X21jYXN0X3JhdGUsCiAJCS5wb2xpY3kgPSBubDgwMjExX3BvbGljeSwKQEAgLTExODE5LDYgKzEyNjI1LDI5IEBACiAJCQkJTkw4MDIxMV9NQ0dSUF9DT05GSUcsIEdGUF9LRVJORUwpOwogfQogCit2b2lkIG5sODAyMTFfbm90aWZ5X2lmYWNlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCWVudW0gbmw4MDIxMV9jb21tYW5kcyBjbWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKm1zZzsKKworCVdBUk5fT04oY21kICE9IE5MODAyMTFfQ01EX05FV19JTlRFUkZBQ0UgJiYKKwkJY21kICE9IE5MODAyMTFfQ01EX0RFTF9JTlRFUkZBQ0UpOworCisJbXNnID0gbmxtc2dfbmV3KE5MTVNHX0RFRkFVTFRfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtc2cpCisJCXJldHVybjsKKworCWlmIChubDgwMjExX3NlbmRfaWZhY2UobXNnLCAwLCAwLCAwLCByZGV2LCB3ZGV2LAorCQkJICAgICAgIGNtZCA9PSBOTDgwMjExX0NNRF9ERUxfSU5URVJGQUNFKSA8IDApIHsKKwkJbmxtc2dfZnJlZShtc2cpOworCQlyZXR1cm47CisJfQorCisJZ2VubG1zZ19tdWx0aWNhc3RfbmV0bnMoJm5sODAyMTFfZmFtLCB3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwgbXNnLCAwLAorCQkJCU5MODAyMTFfTUNHUlBfQ09ORklHLCBHRlBfS0VSTkVMKTsKK30KKwogc3RhdGljIGludCBubDgwMjExX2FkZF9zY2FuX3JlcShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLAogCQkJCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldikKIHsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9ubDgwMjExLmggYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5oCmluZGV4IGE2M2Y0MDIuLjdlMzgyMWQgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9ubDgwMjExLmgKKysrIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuaApAQCAtNyw2ICs3LDkgQEAKIHZvaWQgbmw4MDIxMV9leGl0KHZvaWQpOwogdm9pZCBubDgwMjExX25vdGlmeV93aXBoeShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkgIGVudW0gbmw4MDIxMV9jb21tYW5kcyBjbWQpOwordm9pZCBubDgwMjExX25vdGlmeV9pZmFjZShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCQkgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkgIGVudW0gbmw4MDIxMV9jb21tYW5kcyBjbWQpOwogdm9pZCBubDgwMjExX3NlbmRfc2Nhbl9zdGFydChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpOwogc3RydWN0IHNrX2J1ZmYgKm5sODAyMTFfYnVpbGRfc2Nhbl9tc2coc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3JkZXYtb3BzLmggYi9uZXQvd2lyZWxlc3MvcmRldi1vcHMuaAppbmRleCA4NWZmMzBiLi4xMWNmODNjIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvcmRldi1vcHMuaAorKysgYi9uZXQvd2lyZWxlc3MvcmRldi1vcHMuaApAQCAtODg3LDYgKzg4Nyw2NCBAQAogCXRyYWNlX3JkZXZfcmV0dXJuX3ZvaWQoJnJkZXYtPndpcGh5KTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgcmRldl9zdGFydF9uYW4oc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAorCQkJCSBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2NvbmYgKmNvbmYpCit7CisJaW50IHJldDsKKworCXRyYWNlX3JkZXZfc3RhcnRfbmFuKCZyZGV2LT53aXBoeSwgd2RldiwgY29uZik7CisJcmV0ID0gcmRldi0+b3BzLT5zdGFydF9uYW4oJnJkZXYtPndpcGh5LCB3ZGV2LCBjb25mKTsKKwl0cmFjZV9yZGV2X3JldHVybl9pbnQoJnJkZXYtPndpcGh5LCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZGV2X3N0b3BfbmFuKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJCQkgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldikKK3sKKwl0cmFjZV9yZGV2X3N0b3BfbmFuKCZyZGV2LT53aXBoeSwgd2Rldik7CisJcmRldi0+b3BzLT5zdG9wX25hbigmcmRldi0+d2lwaHksIHdkZXYpOworCXRyYWNlX3JkZXZfcmV0dXJuX3ZvaWQoJnJkZXYtPndpcGh5KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3JkZXZfYWRkX25hbl9mdW5jKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkgIHN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuYyAqbmFuX2Z1bmMpCit7CisJaW50IHJldDsKKworCXRyYWNlX3JkZXZfYWRkX25hbl9mdW5jKCZyZGV2LT53aXBoeSwgd2RldiwgbmFuX2Z1bmMpOworCXJldCA9IHJkZXYtPm9wcy0+YWRkX25hbl9mdW5jKCZyZGV2LT53aXBoeSwgd2RldiwgbmFuX2Z1bmMpOworCXRyYWNlX3JkZXZfcmV0dXJuX2ludCgmcmRldi0+d2lwaHksIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJkZXZfZGVsX25hbl9mdW5jKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJCQkgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwgdTY0IGNvb2tpZSkKK3sKKwl0cmFjZV9yZGV2X2RlbF9uYW5fZnVuYygmcmRldi0+d2lwaHksIHdkZXYsIGNvb2tpZSk7CisJcmRldi0+b3BzLT5kZWxfbmFuX2Z1bmMoJnJkZXYtPndpcGh5LCB3ZGV2LCBjb29raWUpOworCXRyYWNlX3JkZXZfcmV0dXJuX3ZvaWQoJnJkZXYtPndpcGh5KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3JkZXZfbmFuX2NoYW5nZV9jb25mKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkgICAgIHN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiAqY29uZiwgdTMyIGNoYW5nZXMpCit7CisJaW50IHJldDsKKworCXRyYWNlX3JkZXZfbmFuX2NoYW5nZV9jb25mKCZyZGV2LT53aXBoeSwgd2RldiwgY29uZiwgY2hhbmdlcyk7CisJaWYgKHJkZXYtPm9wcy0+bmFuX2NoYW5nZV9jb25mKQorCQlyZXQgPSByZGV2LT5vcHMtPm5hbl9jaGFuZ2VfY29uZigmcmRldi0+d2lwaHksIHdkZXYsIGNvbmYsCisJCQkJCQkgY2hhbmdlcyk7CisJZWxzZQorCQlyZXQgPSAtRU5PVFNVUFA7CisJdHJhY2VfcmRldl9yZXR1cm5faW50KCZyZGV2LT53aXBoeSwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW5saW5lIGludCByZGV2X3NldF9tYWNfYWNsKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBjZmc4MDIxMV9hY2xfZGF0YSAqcGFyYW1zKQpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3NjYW4uYyBiL25ldC93aXJlbGVzcy9zY2FuLmMKaW5kZXggMDM1OGUxMi4uYjViZDU4ZCAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3NjYW4uYworKysgYi9uZXQvd2lyZWxlc3Mvc2Nhbi5jCkBAIC0zNTIsNTIgKzM1Miw0OCBAQAogCV9fY2ZnODAyMTFfYnNzX2V4cGlyZShyZGV2LCBqaWZmaWVzIC0gSUVFRTgwMjExX1NDQU5fUkVTVUxUX0VYUElSRSk7CiB9CiAKLWNvbnN0IHU4ICpjZmc4MDIxMV9maW5kX2llKHU4IGVpZCwgY29uc3QgdTggKmllcywgaW50IGxlbikKK2NvbnN0IHU4ICpjZmc4MDIxMV9maW5kX2llX21hdGNoKHU4IGVpZCwgY29uc3QgdTggKmllcywgaW50IGxlbiwKKwkJCQkgY29uc3QgdTggKm1hdGNoLCBpbnQgbWF0Y2hfbGVuLAorCQkJCSBpbnQgbWF0Y2hfb2Zmc2V0KQogewotCXdoaWxlIChsZW4gPiAyICYmIGllc1swXSAhPSBlaWQpIHsKKwkvKiBtYXRjaF9vZmZzZXQgY2FuJ3QgYmUgc21hbGxlciB0aGFuIDIsIHVubGVzcyBtYXRjaF9sZW4gaXMKKwkgKiB6ZXJvLCBpbiB3aGljaCBjYXNlIG1hdGNoX29mZnNldCBtdXN0IGJlIHplcm8gYXMgd2VsbC4KKwkgKi8KKwlpZiAoV0FSTl9PTigobWF0Y2hfbGVuICYmIG1hdGNoX29mZnNldCA8IDIpIHx8CisJCSAgICAoIW1hdGNoX2xlbiAmJiBtYXRjaF9vZmZzZXQpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwl3aGlsZSAobGVuID49IDIgJiYgbGVuID49IGllc1sxXSArIDIpIHsKKwkJaWYgKChpZXNbMF0gPT0gZWlkKSAmJgorCQkgICAgKGllc1sxXSArIDIgPj0gbWF0Y2hfb2Zmc2V0ICsgbWF0Y2hfbGVuKSAmJgorCQkgICAgIW1lbWNtcChpZXMgKyBtYXRjaF9vZmZzZXQsIG1hdGNoLCBtYXRjaF9sZW4pKQorCQkJcmV0dXJuIGllczsKKwogCQlsZW4gLT0gaWVzWzFdICsgMjsKIAkJaWVzICs9IGllc1sxXSArIDI7CiAJfQotCWlmIChsZW4gPCAyKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobGVuIDwgMiArIGllc1sxXSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGllczsKKworCXJldHVybiBOVUxMOwogfQotRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9maW5kX2llKTsKK0VYUE9SVF9TWU1CT0woY2ZnODAyMTFfZmluZF9pZV9tYXRjaCk7CiAKIGNvbnN0IHU4ICpjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZSh1bnNpZ25lZCBpbnQgb3VpLCBpbnQgb3VpX3R5cGUsCiAJCQkJICBjb25zdCB1OCAqaWVzLCBpbnQgbGVuKQogewotCXN0cnVjdCBpZWVlODAyMTFfdmVuZG9yX2llICppZTsKLQljb25zdCB1OCAqcG9zID0gaWVzLCAqZW5kID0gaWVzICsgbGVuOwotCWludCBpZV9vdWk7CisJY29uc3QgdTggKmllOworCXU4IG1hdGNoW10gPSB7IG91aSA+PiAxNiwgb3VpID4+IDgsIG91aSwgb3VpX3R5cGUgfTsKKwlpbnQgbWF0Y2hfbGVuID0gKG91aV90eXBlIDwgMCkgPyAzIDogc2l6ZW9mKG1hdGNoKTsKIAogCWlmIChXQVJOX09OKG91aV90eXBlID4gMHhmZikpCiAJCXJldHVybiBOVUxMOwogCi0Jd2hpbGUgKHBvcyA8IGVuZCkgewotCQlwb3MgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQywgcG9zLAotCQkJCSAgICAgICBlbmQgLSBwb3MpOwotCQlpZiAoIXBvcykKLQkJCXJldHVybiBOVUxMOworCWllID0gY2ZnODAyMTFfZmluZF9pZV9tYXRjaChXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMsIGllcywgbGVuLAorCQkJCSAgICBtYXRjaCwgbWF0Y2hfbGVuLCAyKTsKIAotCQlpZSA9IChzdHJ1Y3QgaWVlZTgwMjExX3ZlbmRvcl9pZSAqKXBvczsKKwlpZiAoaWUgJiYgKGllWzFdIDwgNCkpCisJCXJldHVybiBOVUxMOwogCi0JCS8qIG1ha2Ugc3VyZSB3ZSBjYW4gYWNjZXNzIGllLT5sZW4gKi8KLQkJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfdmVuZG9yX2llLCBsZW4pICE9IDEpOwotCi0JCWlmIChpZS0+bGVuIDwgc2l6ZW9mKCppZSkpCi0JCQlnb3RvIGNvbnQ7Ci0KLQkJaWVfb3VpID0gaWUtPm91aVswXSA8PCAxNiB8IGllLT5vdWlbMV0gPDwgOCB8IGllLT5vdWlbMl07Ci0JCWlmIChpZV9vdWkgPT0gb3VpICYmCi0JCSAgICAob3VpX3R5cGUgPCAwIHx8IGllLT5vdWlfdHlwZSA9PSBvdWlfdHlwZSkpCi0JCQlyZXR1cm4gcG9zOwotY29udDoKLQkJcG9zICs9IDIgKyBpZS0+bGVuOwotCX0KLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gaWU7CiB9CiBFWFBPUlRfU1lNQk9MKGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKTsKIApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3NtZS5jIGIvbmV0L3dpcmVsZXNzL3NtZS5jCmluZGV4IGFkZDY4MjQuLmE3N2RiMzMgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9zbWUuYworKysgYi9uZXQvd2lyZWxlc3Mvc21lLmMKQEAgLTcyNiw3ICs3MjYsOCBAQAogCiAJd2Rldi0+Y3VycmVudF9ic3MgPSBic3NfZnJvbV9wdWIoYnNzKTsKIAotCWNmZzgwMjExX3VwbG9hZF9jb25uZWN0X2tleXMod2Rldik7CisJaWYgKCEod2Rldi0+d2lwaHktPmZsYWdzICYgV0lQSFlfRkxBR19IQVNfU1RBVElDX1dFUCkpCisJCWNmZzgwMjExX3VwbG9hZF9jb25uZWN0X2tleXMod2Rldik7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJY291bnRyeV9pZSA9IGllZWU4MDIxMV9ic3NfZ2V0X2llKGJzcywgV0xBTl9FSURfQ09VTlRSWSk7CkBAIC0xMDQzLDYgKzEwNDQsMTIgQEAKIAkJCQljb25uZWN0LT5jcnlwdG8uY2lwaGVyc19wYWlyd2lzZVswXSA9IGNpcGhlcjsKIAkJCX0KIAkJfQorCisJCWNvbm5lY3QtPmNyeXB0by53ZXBfa2V5cyA9IGNvbm5rZXlzLT5wYXJhbXM7CisJCWNvbm5lY3QtPmNyeXB0by53ZXBfdHhfa2V5ID0gY29ubmtleXMtPmRlZjsKKwl9IGVsc2UgeworCQlpZiAoV0FSTl9PTihjb25ua2V5cykpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAl3ZGV2LT5jb25uZWN0X2tleXMgPSBjb25ua2V5czsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9zeXNmcy5jIGIvbmV0L3dpcmVsZXNzL3N5c2ZzLmMKaW5kZXggZTQ2NDY5Yi4uMDA4MmY0YiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3N5c2ZzLmMKKysrIGIvbmV0L3dpcmVsZXNzL3N5c2ZzLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXBNXG4iLCB3aXBoeS0+cGVybV9hZGRyKTsKIAogCWZvciAoaSA9IDA7IGkgPCB3aXBoeS0+bl9hZGRyZXNzZXM7IGkrKykKLQkJYnVmICs9IHNwcmludGYoYnVmLCAiJXBNXG4iLCAmd2lwaHktPmFkZHJlc3Nlc1tpXS5hZGRyKTsKKwkJYnVmICs9IHNwcmludGYoYnVmLCAiJXBNXG4iLCB3aXBoeS0+YWRkcmVzc2VzW2ldLmFkZHIpOwogCiAJcmV0dXJuIGJ1ZiAtIHN0YXJ0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3RyYWNlLmggYi9uZXQvd2lyZWxlc3MvdHJhY2UuaAppbmRleCA3MmI1MjU1Li5hM2QwYTkxYiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3RyYWNlLmgKKysrIGIvbmV0L3dpcmVsZXNzL3RyYWNlLmgKQEAgLTE4ODksNiArMTg4OSw5NiBAQAogCVRQX0FSR1Mod2lwaHksIHdkZXYpCiApOwogCitUUkFDRV9FVkVOVChyZGV2X3N0YXJ0X25hbiwKKwlUUF9QUk9UTyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mKSwKKwlUUF9BUkdTKHdpcGh5LCB3ZGV2LCBjb25mKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlXSVBIWV9FTlRSWQorCQlXREVWX0VOVFJZCisJCV9fZmllbGQodTgsIG1hc3Rlcl9wcmVmKQorCQlfX2ZpZWxkKHU4LCBkdWFsKTsKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlXSVBIWV9BU1NJR047CisJCVdERVZfQVNTSUdOOworCQlfX2VudHJ5LT5tYXN0ZXJfcHJlZiA9IGNvbmYtPm1hc3Rlcl9wcmVmOworCQlfX2VudHJ5LT5kdWFsID0gY29uZi0+ZHVhbDsKKwkpLAorCVRQX3ByaW50ayhXSVBIWV9QUl9GTVQgIiwgIiBXREVWX1BSX0ZNVAorCQkgICIsIG1hc3RlciBwcmVmZXJlbmNlOiAldSwgZHVhbDogJWQiLAorCQkgIFdJUEhZX1BSX0FSRywgV0RFVl9QUl9BUkcsIF9fZW50cnktPm1hc3Rlcl9wcmVmLAorCQkgIF9fZW50cnktPmR1YWwpCispOworCitUUkFDRV9FVkVOVChyZGV2X25hbl9jaGFuZ2VfY29uZiwKKwlUUF9QUk9UTyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mLCB1MzIgY2hhbmdlcyksCisJVFBfQVJHUyh3aXBoeSwgd2RldiwgY29uZiwgY2hhbmdlcyksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJV0lQSFlfRU5UUlkKKwkJV0RFVl9FTlRSWQorCQlfX2ZpZWxkKHU4LCBtYXN0ZXJfcHJlZikKKwkJX19maWVsZCh1OCwgZHVhbCk7CisJCV9fZmllbGQodTMyLCBjaGFuZ2VzKTsKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlXSVBIWV9BU1NJR047CisJCVdERVZfQVNTSUdOOworCQlfX2VudHJ5LT5tYXN0ZXJfcHJlZiA9IGNvbmYtPm1hc3Rlcl9wcmVmOworCQlfX2VudHJ5LT5kdWFsID0gY29uZi0+ZHVhbDsKKwkJX19lbnRyeS0+Y2hhbmdlcyA9IGNoYW5nZXM7CisJKSwKKwlUUF9wcmludGsoV0lQSFlfUFJfRk1UICIsICIgV0RFVl9QUl9GTVQKKwkJICAiLCBtYXN0ZXIgcHJlZmVyZW5jZTogJXUsIGR1YWw6ICVkLCBjaGFuZ2VzOiAleCIsCisJCSAgV0lQSFlfUFJfQVJHLCBXREVWX1BSX0FSRywgX19lbnRyeS0+bWFzdGVyX3ByZWYsCisJCSAgX19lbnRyeS0+ZHVhbCwgX19lbnRyeS0+Y2hhbmdlcykKKyk7CisKK0RFRklORV9FVkVOVCh3aXBoeV93ZGV2X2V2dCwgcmRldl9zdG9wX25hbiwKKwlUUF9QUk9UTyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KSwKKwlUUF9BUkdTKHdpcGh5LCB3ZGV2KQorKTsKKworVFJBQ0VfRVZFTlQocmRldl9hZGRfbmFuX2Z1bmMsCisJVFBfUFJPVE8oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuYyAqZnVuYyksCisJVFBfQVJHUyh3aXBoeSwgd2RldiwgZnVuYyksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJV0lQSFlfRU5UUlkKKwkJV0RFVl9FTlRSWQorCQlfX2ZpZWxkKHU4LCBmdW5jX3R5cGUpCisJCV9fZmllbGQodTY0LCBjb29raWUpCisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJV0lQSFlfQVNTSUdOOworCQlXREVWX0FTU0lHTjsKKwkJX19lbnRyeS0+ZnVuY190eXBlID0gZnVuYy0+dHlwZTsKKwkJX19lbnRyeS0+Y29va2llID0gZnVuYy0+Y29va2llCisJKSwKKwlUUF9wcmludGsoV0lQSFlfUFJfRk1UICIsICIgV0RFVl9QUl9GTVQgIiwgdHlwZT0ldSwgY29va2llPSVsbHUiLAorCQkgIFdJUEhZX1BSX0FSRywgV0RFVl9QUl9BUkcsIF9fZW50cnktPmZ1bmNfdHlwZSwKKwkJICBfX2VudHJ5LT5jb29raWUpCispOworCitUUkFDRV9FVkVOVChyZGV2X2RlbF9uYW5fZnVuYywKKwlUUF9QUk9UTyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkgdTY0IGNvb2tpZSksCisJVFBfQVJHUyh3aXBoeSwgd2RldiwgY29va2llKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlXSVBIWV9FTlRSWQorCQlXREVWX0VOVFJZCisJCV9fZmllbGQodTY0LCBjb29raWUpCisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJV0lQSFlfQVNTSUdOOworCQlXREVWX0FTU0lHTjsKKwkJX19lbnRyeS0+Y29va2llID0gY29va2llOworCSksCisJVFBfcHJpbnRrKFdJUEhZX1BSX0ZNVCAiLCAiIFdERVZfUFJfRk1UICIsIGNvb2tpZT0lbGx1IiwKKwkJICBXSVBIWV9QUl9BUkcsIFdERVZfUFJfQVJHLCBfX2VudHJ5LT5jb29raWUpCispOworCiBUUkFDRV9FVkVOVChyZGV2X3NldF9tYWNfYWNsLAogCVRQX1BST1RPKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJCSBzdHJ1Y3QgY2ZnODAyMTFfYWNsX2RhdGEgKnBhcmFtcyksCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvdXRpbC5jIGIvbmV0L3dpcmVsZXNzL3V0aWwuYwppbmRleCBiN2QxNTkyLi44ZWRjZTIyIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvdXRpbC5jCisrKyBiL25ldC93aXJlbGVzcy91dGlsLmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogCQkJCSAgIHN0cnVjdCBrZXlfcGFyYW1zICpwYXJhbXMsIGludCBrZXlfaWR4LAogCQkJCSAgIGJvb2wgcGFpcndpc2UsIGNvbnN0IHU4ICptYWNfYWRkcikKIHsKLQlpZiAoa2V5X2lkeCA+IDUpCisJaWYgKGtleV9pZHggPCAwIHx8IGtleV9pZHggPiA1KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICghcGFpcndpc2UgJiYgbWFjX2FkZHIgJiYgIShyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfSUJTU19SU04pKQpAQCAtMjQ5LDcgKzI0OSwxMyBAQAogCQkvKiBEaXNhbGxvdyBCSVAgKGdyb3VwLW9ubHkpIGNpcGhlciBhcyBwYWlyd2lzZSBjaXBoZXIgKi8KIAkJaWYgKHBhaXJ3aXNlKQogCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChrZXlfaWR4IDwgNCkKKwkJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgorCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgorCQlpZiAoa2V5X2lkeCA+IDMpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC05MDYsNyArOTEyLDcgQEAKIAlpZiAoIXdkZXYtPmNvbm5lY3Rfa2V5cykKIAkJcmV0dXJuOwogCi0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBDRkc4MDIxMV9NQVhfV0VQX0tFWVM7IGkrKykgewogCQlpZiAoIXdkZXYtPmNvbm5lY3Rfa2V5cy0+cGFyYW1zW2ldLmNpcGhlcikKIAkJCWNvbnRpbnVlOwogCQlpZiAocmRldl9hZGRfa2V5KHJkZXYsIGRldiwgaSwgZmFsc2UsIE5VTEwsCkBAIC05MTksOSArOTI1LDYgQEAKIAkJCQluZXRkZXZfZXJyKGRldiwgImZhaWxlZCB0byBzZXQgZGVma2V5ICVkXG4iLCBpKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJaWYgKHdkZXYtPmNvbm5lY3Rfa2V5cy0+ZGVmbWdtdCA9PSBpKQotCQkJaWYgKHJkZXZfc2V0X2RlZmF1bHRfbWdtdF9rZXkocmRldiwgZGV2LCBpKSkKLQkJCQluZXRkZXZfZXJyKGRldiwgImZhaWxlZCB0byBzZXQgbWd0ZGVmICVkXG4iLCBpKTsKIAl9CiAKIAlremZyZWUod2Rldi0+Y29ubmVjdF9rZXlzKTsKQEAgLTEwMDUsOCArMTAwOCw5IEBACiAJaWYgKG90eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCS8qIGNhbm5vdCBjaGFuZ2UgaW50byBQMlAgZGV2aWNlIHR5cGUgKi8KLQlpZiAobnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSkKKwkvKiBjYW5ub3QgY2hhbmdlIGludG8gUDJQIGRldmljZSBvciBOQU4gKi8KKwlpZiAobnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSB8fAorCSAgICBudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU4pCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWlmICghcmRldi0+b3BzLT5jaGFuZ2VfdmlydHVhbF9pbnRmIHx8CkBAIC0xMDg1LDYgKzEwODksNyBAQAogCQkJLyogbm90IGhhcHBlbmluZyAqLwogCQkJYnJlYWs7CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CiAJCQlXQVJOX09OKDEpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTE1NTksNyArMTU2NCw3IEBACiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldjsKIAlpbnQgcmVzID0gMDsKIAotCWlmICghYmVhY29uX2ludCkKKwlpZiAoYmVhY29uX2ludCA8IDEwIHx8IGJlYWNvbl9pbnQgPiAxMDAwMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdkZXYsICZyZGV2LT53aXBoeS53ZGV2X2xpc3QsIGxpc3QpIHsKQEAgLTE3NTcsNiArMTc2MiwyOCBAQAogfQogRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9nZXRfc3RhdGlvbik7CiAKK3ZvaWQgY2ZnODAyMTFfZnJlZV9uYW5fZnVuYyhzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgKmYpCit7CisJaW50IGk7CisKKwlpZiAoIWYpCisJCXJldHVybjsKKworCWtmcmVlKGYtPnNlcnZfc3BlY19pbmZvKTsKKwlrZnJlZShmLT5zcmZfYmYpOworCWtmcmVlKGYtPnNyZl9tYWNzKTsKKwlmb3IgKGkgPSAwOyBpIDwgZi0+bnVtX3J4X2ZpbHRlcnM7IGkrKykKKwkJa2ZyZWUoZi0+cnhfZmlsdGVyc1tpXS5maWx0ZXIpOworCisJZm9yIChpID0gMDsgaSA8IGYtPm51bV90eF9maWx0ZXJzOyBpKyspCisJCWtmcmVlKGYtPnR4X2ZpbHRlcnNbaV0uZmlsdGVyKTsKKworCWtmcmVlKGYtPnJ4X2ZpbHRlcnMpOworCWtmcmVlKGYtPnR4X2ZpbHRlcnMpOworCWtmcmVlKGYpOworfQorRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9mcmVlX25hbl9mdW5jKTsKKwogLyogU2VlIElFRUUgODAyLjFIIGZvciBMTEMvU05BUCBlbmNhcHN1bGF0aW9uL2RlY2Fwc3VsYXRpb24gKi8KIC8qIEV0aGVybmV0LUlJIHNuYXAgaGVhZGVyIChSRkMxMDQyIGZvciBtb3N0IEV0aGVyVHlwZXMpICovCiBjb25zdCB1bnNpZ25lZCBjaGFyIHJmYzEwNDJfaGVhZGVyW10gX19hbGlnbmVkKDIpID0KZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5jIGIvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKaW5kZXggOWYyNzIyMS4uYTIyMDE1NiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKKysrIGIvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKQEAgLTQwNiwxMiArNDA2LDE2IEBACiAJaWYgKHBhaXJ3aXNlICYmICFhZGRyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qCisJICogSW4gbWFueSBjYXNlcyB3ZSB3b24ndCBhY3R1YWxseSBuZWVkIHRoaXMsIGJ1dCBpdCdzIGJldHRlcgorCSAqIHRvIGRvIGl0IGZpcnN0IGluIGNhc2UgdGhlIGFsbG9jYXRpb24gZmFpbHMuIERvbid0IHVzZSB3ZXh0LgorCSAqLwogCWlmICghd2Rldi0+d2V4dC5rZXlzKSB7CiAJCXdkZXYtPndleHQua2V5cyA9IGt6YWxsb2Moc2l6ZW9mKCp3ZGV2LT53ZXh0LmtleXMpLAotCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKKwkJCQkJICBHRlBfS0VSTkVMKTsKIAkJaWYgKCF3ZGV2LT53ZXh0LmtleXMpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IENGRzgwMjExX01BWF9XRVBfS0VZUzsgaSsrKQogCQkJd2Rldi0+d2V4dC5rZXlzLT5wYXJhbXNbaV0ua2V5ID0KIAkJCQl3ZGV2LT53ZXh0LmtleXMtPmRhdGFbaV07CiAJfQpAQCAtNDYwLDcgKzQ2NCw3IEBACiAJCWlmIChlcnIgPT0gLUVOT0VOVCkKIAkJCWVyciA9IDA7CiAJCWlmICghZXJyKSB7Ci0JCQlpZiAoIWFkZHIpIHsKKwkJCWlmICghYWRkciAmJiBpZHggPCA0KSB7CiAJCQkJbWVtc2V0KHdkZXYtPndleHQua2V5cy0+ZGF0YVtpZHhdLCAwLAogCQkJCSAgICAgICBzaXplb2Yod2Rldi0+d2V4dC5rZXlzLT5kYXRhW2lkeF0pKTsKIAkJCQl3ZGV2LT53ZXh0LmtleXMtPnBhcmFtc1tpZHhdLmtleV9sZW4gPSAwOwpAQCAtNDg3LDEwICs0OTEsMTkgQEAKIAllcnIgPSAwOwogCWlmICh3ZGV2LT5jdXJyZW50X2JzcykKIAkJZXJyID0gcmRldl9hZGRfa2V5KHJkZXYsIGRldiwgaWR4LCBwYWlyd2lzZSwgYWRkciwgcGFyYW1zKTsKKwllbHNlIGlmIChwYXJhbXMtPmNpcGhlciAhPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCAmJgorCQkgcGFyYW1zLT5jaXBoZXIgIT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KQorCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKCFhZGRyKSB7CisJLyoKKwkgKiBXZSBvbmx5IG5lZWQgdG8gc3RvcmUgV0VQIGtleXMsIHNpbmNlIHRoZXkncmUgdGhlIG9ubHkga2V5cyB0aGF0CisJICogY2FuIGJlIGJlIHNldCBiZWZvcmUgYSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIGFuZCBwZXJzaXN0IGFmdGVyCisJICogZGlzY29ubmVjdGluZy4KKwkgKi8KKwlpZiAoIWFkZHIgJiYgKHBhcmFtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwIHx8CisJCSAgICAgIHBhcmFtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkpIHsKIAkJd2Rldi0+d2V4dC5rZXlzLT5wYXJhbXNbaWR4XSA9ICpwYXJhbXM7CiAJCW1lbWNweSh3ZGV2LT53ZXh0LmtleXMtPmRhdGFbaWR4XSwKIAkJCXBhcmFtcy0+a2V5LCBwYXJhbXMtPmtleV9sZW4pOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3dleHQtY29yZS5jIGIvbmV0L3dpcmVsZXNzL3dleHQtY29yZS5jCmluZGV4IGRiYjI3MzhlLi42MjUwYjFjIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvd2V4dC1jb3JlLmMKKysrIGIvbmV0L3dpcmVsZXNzL3dleHQtY29yZS5jCkBAIC05NTgsMjkgKzk1OCw4IEBACiAJCQlyZXR1cm4gcHJpdmF0ZShkZXYsIGl3ciwgY21kLCBpbmZvLCBoYW5kbGVyKTsKIAl9CiAJLyogT2xkIGRyaXZlciBBUEkgOiBjYWxsIGRyaXZlciBpb2N0bCBoYW5kbGVyICovCi0JaWYgKGRldi0+bmV0ZGV2X29wcy0+bmRvX2RvX2lvY3RsKSB7Ci0jaWZkZWYgQ09ORklHX0NPTVBBVAotCQlpZiAoaW5mby0+ZmxhZ3MgJiBJV19SRVFVRVNUX0ZMQUdfQ09NUEFUKSB7Ci0JCQlpbnQgcmV0ID0gMDsKLQkJCXN0cnVjdCBpd3JlcSBpd3JfbGNsOwotCQkJc3RydWN0IGNvbXBhdF9pd19wb2ludCAqaXdwX2NvbXBhdCA9ICh2b2lkICopICZpd3ItPnUuZGF0YTsKLQotCQkJbWVtY3B5KCZpd3JfbGNsLCBpd3IsIHNpemVvZihzdHJ1Y3QgaXdyZXEpKTsKLQkJCWl3cl9sY2wudS5kYXRhLnBvaW50ZXIgPSBjb21wYXRfcHRyKGl3cF9jb21wYXQtPnBvaW50ZXIpOwotCQkJaXdyX2xjbC51LmRhdGEubGVuZ3RoID0gaXdwX2NvbXBhdC0+bGVuZ3RoOwotCQkJaXdyX2xjbC51LmRhdGEuZmxhZ3MgPSBpd3BfY29tcGF0LT5mbGFnczsKLQotCQkJcmV0ID0gZGV2LT5uZXRkZXZfb3BzLT5uZG9fZG9faW9jdGwoZGV2LCAodm9pZCAqKSAmaXdyX2xjbCwgY21kKTsKLQotCQkJaXdwX2NvbXBhdC0+cG9pbnRlciA9IHB0cl90b19jb21wYXQoaXdyX2xjbC51LmRhdGEucG9pbnRlcik7Ci0JCQlpd3BfY29tcGF0LT5sZW5ndGggPSBpd3JfbGNsLnUuZGF0YS5sZW5ndGg7Ci0JCQlpd3BfY29tcGF0LT5mbGFncyA9IGl3cl9sY2wudS5kYXRhLmZsYWdzOwotCi0JCQlyZXR1cm4gcmV0OwotCQl9IGVsc2UKLSNlbmRpZgotCQkJcmV0dXJuIGRldi0+bmV0ZGV2X29wcy0+bmRvX2RvX2lvY3RsKGRldiwgaWZyLCBjbWQpOwotCX0KKwlpZiAoZGV2LT5uZXRkZXZfb3BzLT5uZG9fZG9faW9jdGwpCisJCXJldHVybiBkZXYtPm5ldGRldl9vcHMtPm5kb19kb19pb2N0bChkZXYsIGlmciwgY21kKTsKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy93ZXh0LXNtZS5jIGIvbmV0L3dpcmVsZXNzL3dleHQtc21lLmMKaW5kZXggYTRlOGFmMy4uOTk1MTYzOCAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3dleHQtc21lLmMKKysrIGIvbmV0L3dpcmVsZXNzL3dleHQtc21lLmMKQEAgLTM1LDcgKzM1LDYgQEAKIAogCWlmICh3ZGV2LT53ZXh0LmtleXMpIHsKIAkJd2Rldi0+d2V4dC5rZXlzLT5kZWYgPSB3ZGV2LT53ZXh0LmRlZmF1bHRfa2V5OwotCQl3ZGV2LT53ZXh0LmtleXMtPmRlZm1nbXQgPSB3ZGV2LT53ZXh0LmRlZmF1bHRfbWdtdF9rZXk7CiAJCWlmICh3ZGV2LT53ZXh0LmRlZmF1bHRfa2V5ICE9IC0xKQogCQkJd2Rldi0+d2V4dC5jb25uZWN0LnByaXZhY3kgPSB0cnVlOwogCX0KQEAgLTQzLDExICs0MiwxMSBAQAogCWlmICghd2Rldi0+d2V4dC5jb25uZWN0LnNzaWRfbGVuKQogCQlyZXR1cm4gMDsKIAotCWlmICh3ZGV2LT53ZXh0LmtleXMpIHsKKwlpZiAod2Rldi0+d2V4dC5rZXlzICYmIHdkZXYtPndleHQua2V5cy0+ZGVmICE9IC0xKSB7CiAJCWNrID0ga21lbWR1cCh3ZGV2LT53ZXh0LmtleXMsIHNpemVvZigqY2spLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFjaykKIAkJCXJldHVybiAtRU5PTUVNOwotCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgQ0ZHODAyMTFfTUFYX1dFUF9LRVlTOyBpKyspCiAJCQljay0+cGFyYW1zW2ldLmtleSA9IGNrLT5kYXRhW2ldOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L3gyNS9hZl94MjUuYyBiL25ldC94MjUvYWZfeDI1LmMKaW5kZXggYTc1MGYzMy4uZjgzYjc0ZCAxMDA2NDQKLS0tIGEvbmV0L3gyNS9hZl94MjUuYworKysgYi9uZXQveDI1L2FmX3gyNS5jCkBAIC0xNTAwLDEyICsxNTAwLDggQEAKIAkJCWdvdG8gb3V0X2R0ZWZhY19yZWxlYXNlOwogCQlpZiAoZHRlZmFjcy5jYWxsaW5nX2xlbiA+IFgyNV9NQVhfQUVfTEVOKQogCQkJZ290byBvdXRfZHRlZmFjX3JlbGVhc2U7Ci0JCWlmIChkdGVmYWNzLmNhbGxpbmdfYWUgPT0gTlVMTCkKLQkJCWdvdG8gb3V0X2R0ZWZhY19yZWxlYXNlOwogCQlpZiAoZHRlZmFjcy5jYWxsZWRfbGVuID4gWDI1X01BWF9BRV9MRU4pCiAJCQlnb3RvIG91dF9kdGVmYWNfcmVsZWFzZTsKLQkJaWYgKGR0ZWZhY3MuY2FsbGVkX2FlID09IE5VTEwpCi0JCQlnb3RvIG91dF9kdGVmYWNfcmVsZWFzZTsKIAkJeDI1LT5kdGVfZmFjaWxpdGllcyA9IGR0ZWZhY3M7CiAJCXJjID0gMDsKIG91dF9kdGVmYWNfcmVsZWFzZToKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fYWxnby5jIGIvbmV0L3hmcm0veGZybV9hbGdvLmMKaW5kZXggMjUwZTU2Ny4uNDRhYzg1ZiAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9hbGdvLmMKKysrIGIvbmV0L3hmcm0veGZybV9hbGdvLmMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPG5ldC94ZnJtLmg+Ci0jaWYgZGVmaW5lZChDT05GSUdfSU5FVF9FU1ApIHx8IGRlZmluZWQoQ09ORklHX0lORVRfRVNQX01PRFVMRSkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfRVNQKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9FU1BfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lORVRfRVNQKSB8fCBJU19FTkFCTEVEKENPTkZJR19JTkVUNl9FU1ApCiAjaW5jbHVkZSA8bmV0L2VzcC5oPgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1faW5wdXQuYyBiL25ldC94ZnJtL3hmcm1faW5wdXQuYwppbmRleCAxYzRhZDQ3Li42ZTNmMDI1IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX2lucHV0LmMKKysrIGIvbmV0L3hmcm0veGZybV9pbnB1dC5jCkBAIC0yMDcsMTUgKzIwNywxNSBAQAogCWZhbWlseSA9IFhGUk1fU1BJX1NLQl9DQihza2IpLT5mYW1pbHk7CiAKIAkvKiBpZiB0dW5uZWwgaXMgcHJlc2VudCBvdmVycmlkZSBza2ItPm1hcmsgdmFsdWUgd2l0aCB0dW5uZWwgaV9rZXkgKi8KLQlpZiAoWEZSTV9UVU5ORUxfU0tCX0NCKHNrYiktPnR1bm5lbC5pcDQpIHsKLQkJc3dpdGNoIChmYW1pbHkpIHsKLQkJY2FzZSBBRl9JTkVUOgorCXN3aXRjaCAoZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlpZiAoWEZSTV9UVU5ORUxfU0tCX0NCKHNrYiktPnR1bm5lbC5pcDQpCiAJCQltYXJrID0gYmUzMl90b19jcHUoWEZSTV9UVU5ORUxfU0tCX0NCKHNrYiktPnR1bm5lbC5pcDQtPnBhcm1zLmlfa2V5KTsKLQkJCWJyZWFrOwotCQljYXNlIEFGX0lORVQ2OgorCQlicmVhazsKKwljYXNlIEFGX0lORVQ2OgorCQlpZiAoWEZSTV9UVU5ORUxfU0tCX0NCKHNrYiktPnR1bm5lbC5pcDYpCiAJCQltYXJrID0gYmUzMl90b19jcHUoWEZSTV9UVU5ORUxfU0tCX0NCKHNrYiktPnR1bm5lbC5pcDYtPnBhcm1zLmlfa2V5KTsKLQkJCWJyZWFrOwotCQl9CisJCWJyZWFrOwogCX0KIAogCS8qIEFsbG9jYXRlIG5ldyBzZWNwYXRoIG9yIENPVyBleGlzdGluZyBvbmUuICovCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3BvbGljeS5jIGIvbmV0L3hmcm0veGZybV9wb2xpY3kuYwppbmRleCBiNWU2NjViLi5mZDY5ODY2IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3BvbGljeS5jCisrKyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKQEAgLTQ5LDYgKzQ5LDcgQEAKIAkJCQkJCV9fcmVhZF9tb3N0bHk7CiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqeGZybV9kc3RfY2FjaGUgX19yZWFkX21vc3RseTsKK3N0YXRpYyBfX3JlYWRfbW9zdGx5IHNlcWNvdW50X3QgeGZybV9wb2xpY3lfaGFzaF9nZW5lcmF0aW9uOwogCiBzdGF0aWMgdm9pZCB4ZnJtX2luaXRfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogc3RhdGljIGludCBzdGFsZV9idW5kbGUoc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKQEAgLTU5LDYgKzYwLDExIEBACiBzdGF0aWMgc3RydWN0IHhmcm1fcG9saWN5ICpfX3hmcm1fcG9saWN5X3VubGluayhzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCwKIAkJCQkJCWludCBkaXIpOwogCitzdGF0aWMgaW5saW5lIGJvb2wgeGZybV9wb2xfaG9sZF9yY3Uoc3RydWN0IHhmcm1fcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGF0b21pY19pbmNfbm90X3plcm8oJnBvbGljeS0+cmVmY250KTsKK30KKwogc3RhdGljIGlubGluZSBib29sCiBfX3hmcm00X3NlbGVjdG9yX21hdGNoKGNvbnN0IHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIGNvbnN0IHN0cnVjdCBmbG93aSAqZmwpCiB7CkBAIC0zODUsOSArMzkxLDExIEBACiAJX19nZXRfaGFzaF90aHJlc2gobmV0LCBmYW1pbHksIGRpciwgJmRiaXRzLCAmc2JpdHMpOwogCWhhc2ggPSBfX3NlbF9oYXNoKHNlbCwgZmFtaWx5LCBobWFzaywgZGJpdHMsIHNiaXRzKTsKIAotCXJldHVybiAoaGFzaCA9PSBobWFzayArIDEgPwotCQkmbmV0LT54ZnJtLnBvbGljeV9pbmV4YWN0W2Rpcl0gOgotCQluZXQtPnhmcm0ucG9saWN5X2J5ZHN0W2Rpcl0udGFibGUgKyBoYXNoKTsKKwlpZiAoaGFzaCA9PSBobWFzayArIDEpCisJCXJldHVybiAmbmV0LT54ZnJtLnBvbGljeV9pbmV4YWN0W2Rpcl07CisKKwlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKG5ldC0+eGZybS5wb2xpY3lfYnlkc3RbZGlyXS50YWJsZSwKKwkJICAgICBsb2NrZGVwX2lzX2hlbGQoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKSkgKyBoYXNoOwogfQogCiBzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgKnBvbGljeV9oYXNoX2RpcmVjdChzdHJ1Y3QgbmV0ICpuZXQsCkBAIC00MDMsNyArNDExLDggQEAKIAlfX2dldF9oYXNoX3RocmVzaChuZXQsIGZhbWlseSwgZGlyLCAmZGJpdHMsICZzYml0cyk7CiAJaGFzaCA9IF9fYWRkcl9oYXNoKGRhZGRyLCBzYWRkciwgZmFtaWx5LCBobWFzaywgZGJpdHMsIHNiaXRzKTsKIAotCXJldHVybiBuZXQtPnhmcm0ucG9saWN5X2J5ZHN0W2Rpcl0udGFibGUgKyBoYXNoOworCXJldHVybiByY3VfZGVyZWZlcmVuY2VfY2hlY2sobmV0LT54ZnJtLnBvbGljeV9ieWRzdFtkaXJdLnRhYmxlLAorCQkgICAgIGxvY2tkZXBfaXNfaGVsZCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spKSArIGhhc2g7CiB9CiAKIHN0YXRpYyB2b2lkIHhmcm1fZHN0X2hhc2hfdHJhbnNmZXIoc3RydWN0IG5ldCAqbmV0LApAQCAtNDI2LDE0ICs0MzUsMTQgQEAKIAkJaCA9IF9fYWRkcl9oYXNoKCZwb2wtPnNlbGVjdG9yLmRhZGRyLCAmcG9sLT5zZWxlY3Rvci5zYWRkciwKIAkJCQlwb2wtPmZhbWlseSwgbmhhc2htYXNrLCBkYml0cywgc2JpdHMpOwogCQlpZiAoIWVudHJ5MCkgewotCQkJaGxpc3RfZGVsKCZwb2wtPmJ5ZHN0KTsKLQkJCWhsaXN0X2FkZF9oZWFkKCZwb2wtPmJ5ZHN0LCBuZHN0dGFibGUraCk7CisJCQlobGlzdF9kZWxfcmN1KCZwb2wtPmJ5ZHN0KTsKKwkJCWhsaXN0X2FkZF9oZWFkX3JjdSgmcG9sLT5ieWRzdCwgbmRzdHRhYmxlICsgaCk7CiAJCQloMCA9IGg7CiAJCX0gZWxzZSB7CiAJCQlpZiAoaCAhPSBoMCkKIAkJCQljb250aW51ZTsKLQkJCWhsaXN0X2RlbCgmcG9sLT5ieWRzdCk7Ci0JCQlobGlzdF9hZGRfYmVoaW5kKCZwb2wtPmJ5ZHN0LCBlbnRyeTApOworCQkJaGxpc3RfZGVsX3JjdSgmcG9sLT5ieWRzdCk7CisJCQlobGlzdF9hZGRfYmVoaW5kX3JjdSgmcG9sLT5ieWRzdCwgZW50cnkwKTsKIAkJfQogCQllbnRyeTAgPSAmcG9sLT5ieWRzdDsKIAl9CkBAIC00NjgsMjIgKzQ3NywzMiBAQAogCXVuc2lnbmVkIGludCBobWFzayA9IG5ldC0+eGZybS5wb2xpY3lfYnlkc3RbZGlyXS5obWFzazsKIAl1bnNpZ25lZCBpbnQgbmhhc2htYXNrID0geGZybV9uZXdfaGFzaF9tYXNrKGhtYXNrKTsKIAl1bnNpZ25lZCBpbnQgbnNpemUgPSAobmhhc2htYXNrICsgMSkgKiBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpOwotCXN0cnVjdCBobGlzdF9oZWFkICpvZHN0ID0gbmV0LT54ZnJtLnBvbGljeV9ieWRzdFtkaXJdLnRhYmxlOwogCXN0cnVjdCBobGlzdF9oZWFkICpuZHN0ID0geGZybV9oYXNoX2FsbG9jKG5zaXplKTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqb2RzdDsKIAlpbnQgaTsKIAogCWlmICghbmRzdCkKIAkJcmV0dXJuOwogCi0Jd3JpdGVfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXdyaXRlX3NlcWNvdW50X2JlZ2luKCZ4ZnJtX3BvbGljeV9oYXNoX2dlbmVyYXRpb24pOworCisJb2RzdCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQobmV0LT54ZnJtLnBvbGljeV9ieWRzdFtkaXJdLnRhYmxlLAorCQkJCWxvY2tkZXBfaXNfaGVsZCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spKTsKKworCW9kc3QgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKG5ldC0+eGZybS5wb2xpY3lfYnlkc3RbZGlyXS50YWJsZSwKKwkJCQlsb2NrZGVwX2lzX2hlbGQoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKSk7CiAKIAlmb3IgKGkgPSBobWFzazsgaSA+PSAwOyBpLS0pCiAJCXhmcm1fZHN0X2hhc2hfdHJhbnNmZXIobmV0LCBvZHN0ICsgaSwgbmRzdCwgbmhhc2htYXNrLCBkaXIpOwogCi0JbmV0LT54ZnJtLnBvbGljeV9ieWRzdFtkaXJdLnRhYmxlID0gbmRzdDsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmV0LT54ZnJtLnBvbGljeV9ieWRzdFtkaXJdLnRhYmxlLCBuZHN0KTsKIAluZXQtPnhmcm0ucG9saWN5X2J5ZHN0W2Rpcl0uaG1hc2sgPSBuaGFzaG1hc2s7CiAKLQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwl3cml0ZV9zZXFjb3VudF9lbmQoJnhmcm1fcG9saWN5X2hhc2hfZ2VuZXJhdGlvbik7CisJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKworCXN5bmNocm9uaXplX3JjdSgpOwogCiAJeGZybV9oYXNoX2ZyZWUob2RzdCwgKGhtYXNrICsgMSkgKiBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpKTsKIH0KQEAgLTUwMCw3ICs1MTksNyBAQAogCWlmICghbmlkeCkKIAkJcmV0dXJuOwogCi0Jd3JpdGVfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCiAJZm9yIChpID0gaG1hc2s7IGkgPj0gMDsgaS0tKQogCQl4ZnJtX2lkeF9oYXNoX3RyYW5zZmVyKG9pZHggKyBpLCBuaWR4LCBuaGFzaG1hc2spOwpAQCAtNTA4LDcgKzUyNyw3IEBACiAJbmV0LT54ZnJtLnBvbGljeV9ieWlkeCA9IG5pZHg7CiAJbmV0LT54ZnJtLnBvbGljeV9pZHhfaG1hc2sgPSBuaGFzaG1hc2s7CiAKLQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCiAJeGZybV9oYXNoX2ZyZWUob2lkeCwgKGhtYXNrICsgMSkgKiBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpKTsKIH0KQEAgLTU0MSw3ICs1NjAsNiBAQAogCiB2b2lkIHhmcm1fc3BkX2dldGluZm8oc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgeGZybWtfc3BkaW5mbyAqc2kpCiB7Ci0JcmVhZF9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJc2ktPmluY250ID0gbmV0LT54ZnJtLnBvbGljeV9jb3VudFtYRlJNX1BPTElDWV9JTl07CiAJc2ktPm91dGNudCA9IG5ldC0+eGZybS5wb2xpY3lfY291bnRbWEZSTV9QT0xJQ1lfT1VUXTsKIAlzaS0+ZndkY250ID0gbmV0LT54ZnJtLnBvbGljeV9jb3VudFtYRlJNX1BPTElDWV9GV0RdOwpAQCAtNTUwLDcgKzU2OCw2IEBACiAJc2ktPmZ3ZHNjbnQgPSBuZXQtPnhmcm0ucG9saWN5X2NvdW50W1hGUk1fUE9MSUNZX0ZXRCtYRlJNX1BPTElDWV9NQVhdOwogCXNpLT5zcGRoY250ID0gbmV0LT54ZnJtLnBvbGljeV9pZHhfaG1hc2s7CiAJc2ktPnNwZGhtY250ID0geGZybV9wb2xpY3lfaGFzaG1heDsKLQlyZWFkX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogfQogRVhQT1JUX1NZTUJPTCh4ZnJtX3NwZF9nZXRpbmZvKTsKIApAQCAtNjAwLDcgKzYxNyw3IEBACiAJCXJiaXRzNiA9IG5ldC0+eGZybS5wb2xpY3lfaHRocmVzaC5yYml0czY7CiAJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmbmV0LT54ZnJtLnBvbGljeV9odGhyZXNoLmxvY2ssIHNlcSkpOwogCi0Jd3JpdGVfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCiAJLyogcmVzZXQgdGhlIGJ5ZHN0IGFuZCBpbmV4YWN0IHRhYmxlIGluIGFsbCBkaXJlY3Rpb25zICovCiAJZm9yIChkaXIgPSAwOyBkaXIgPCBYRlJNX1BPTElDWV9NQVg7IGRpcisrKSB7CkBAIC02MjYsNiArNjQzLDEwIEBACiAKIAkvKiByZS1pbnNlcnQgYWxsIHBvbGljaWVzIGJ5IG9yZGVyIG9mIGNyZWF0aW9uICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHBvbGljeSwgJm5ldC0+eGZybS5wb2xpY3lfYWxsLCB3YWxrLmFsbCkgeworCQlpZiAoeGZybV9wb2xpY3lfaWQyZGlyKHBvbGljeS0+aW5kZXgpID49IFhGUk1fUE9MSUNZX01BWCkgeworCQkJLyogc2tpcCBzb2NrZXQgcG9saWNpZXMgKi8KKwkJCWNvbnRpbnVlOworCQl9CiAJCW5ld3BvcyA9IE5VTEw7CiAJCWNoYWluID0gcG9saWN5X2hhc2hfYnlzZWwobmV0LCAmcG9saWN5LT5zZWxlY3RvciwKIAkJCQkJICBwb2xpY3ktPmZhbWlseSwKQEAgLTY0Miw3ICs2NjMsNyBAQAogCQkJaGxpc3RfYWRkX2hlYWQoJnBvbGljeS0+Ynlkc3QsIGNoYWluKTsKIAl9CiAKLQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCiAJbXV0ZXhfdW5sb2NrKCZoYXNoX3Jlc2l6ZV9tdXRleCk7CiB9CkBAIC03NTMsNyArNzc0LDcgQEAKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2hhaW47CiAJc3RydWN0IGhsaXN0X25vZGUgKm5ld3BvczsKIAotCXdyaXRlX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAljaGFpbiA9IHBvbGljeV9oYXNoX2J5c2VsKG5ldCwgJnBvbGljeS0+c2VsZWN0b3IsIHBvbGljeS0+ZmFtaWx5LCBkaXIpOwogCWRlbHBvbCA9IE5VTEw7CiAJbmV3cG9zID0gTlVMTDsKQEAgLTc2NCw3ICs3ODUsNyBAQAogCQkgICAgeGZybV9zZWNfY3R4X21hdGNoKHBvbC0+c2VjdXJpdHksIHBvbGljeS0+c2VjdXJpdHkpICYmCiAJCSAgICAhV0FSTl9PTihkZWxwb2wpKSB7CiAJCQlpZiAoZXhjbCkgewotCQkJCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCQkJCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJCQkJcmV0dXJuIC1FRVhJU1Q7CiAJCQl9CiAJCQlkZWxwb2wgPSBwb2w7CkBAIC04MDAsNyArODIxLDcgQEAKIAlwb2xpY3ktPmN1cmxmdC51c2VfdGltZSA9IDA7CiAJaWYgKCFtb2RfdGltZXIoJnBvbGljeS0+dGltZXIsIGppZmZpZXMgKyBIWikpCiAJCXhmcm1fcG9sX2hvbGQocG9saWN5KTsKLQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCiAJaWYgKGRlbHBvbCkKIAkJeGZybV9wb2xpY3lfa2lsbChkZWxwb2wpOwpAQCAtODIwLDcgKzg0MSw3IEBACiAJc3RydWN0IGhsaXN0X2hlYWQgKmNoYWluOwogCiAJKmVyciA9IDA7Ci0Jd3JpdGVfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCWNoYWluID0gcG9saWN5X2hhc2hfYnlzZWwobmV0LCBzZWwsIHNlbC0+ZmFtaWx5LCBkaXIpOwogCXJldCA9IE5VTEw7CiAJaGxpc3RfZm9yX2VhY2hfZW50cnkocG9sLCBjaGFpbiwgYnlkc3QpIHsKQEAgLTgzMyw3ICs4NTQsNyBAQAogCQkJCSplcnIgPSBzZWN1cml0eV94ZnJtX3BvbGljeV9kZWxldGUoCiAJCQkJCQkJCXBvbC0+c2VjdXJpdHkpOwogCQkJCWlmICgqZXJyKSB7Ci0JCQkJCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCQkJCQlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCQkJCQlyZXR1cm4gcG9sOwogCQkJCX0KIAkJCQlfX3hmcm1fcG9saWN5X3VubGluayhwb2wsIGRpcik7CkBAIC04NDIsNyArODYzLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAKIAlpZiAocmV0ICYmIGRlbGV0ZSkKIAkJeGZybV9wb2xpY3lfa2lsbChyZXQpOwpAQCAtODYxLDcgKzg4Miw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJKmVyciA9IDA7Ci0Jd3JpdGVfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCWNoYWluID0gbmV0LT54ZnJtLnBvbGljeV9ieWlkeCArIGlkeF9oYXNoKG5ldCwgaWQpOwogCXJldCA9IE5VTEw7CiAJaGxpc3RfZm9yX2VhY2hfZW50cnkocG9sLCBjaGFpbiwgYnlpZHgpIHsKQEAgLTg3Miw3ICs4OTMsNyBAQAogCQkJCSplcnIgPSBzZWN1cml0eV94ZnJtX3BvbGljeV9kZWxldGUoCiAJCQkJCQkJCXBvbC0+c2VjdXJpdHkpOwogCQkJCWlmICgqZXJyKSB7Ci0JCQkJCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCQkJCQlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCQkJCQlyZXR1cm4gcG9sOwogCQkJCX0KIAkJCQlfX3hmcm1fcG9saWN5X3VubGluayhwb2wsIGRpcik7CkBAIC04ODEsNyArOTAyLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAKIAlpZiAocmV0ICYmIGRlbGV0ZSkKIAkJeGZybV9wb2xpY3lfa2lsbChyZXQpOwpAQCAtOTM5LDcgKzk2MCw3IEBACiB7CiAJaW50IGRpciwgZXJyID0gMCwgY250ID0gMDsKIAotCXdyaXRlX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAogCWVyciA9IHhmcm1fcG9saWN5X2ZsdXNoX3NlY2N0eF9jaGVjayhuZXQsIHR5cGUsIHRhc2tfdmFsaWQpOwogCWlmIChlcnIpCkBAIC05NTUsMTQgKzk3NiwxNCBAQAogCQkJaWYgKHBvbC0+dHlwZSAhPSB0eXBlKQogCQkJCWNvbnRpbnVlOwogCQkJX194ZnJtX3BvbGljeV91bmxpbmsocG9sLCBkaXIpOwotCQkJd3JpdGVfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJCQlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCQkJY250Kys7CiAKIAkJCXhmcm1fYXVkaXRfcG9saWN5X2RlbGV0ZShwb2wsIDEsIHRhc2tfdmFsaWQpOwogCiAJCQl4ZnJtX3BvbGljeV9raWxsKHBvbCk7CiAKLQkJCXdyaXRlX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwkJCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCQkJZ290byBhZ2FpbjE7CiAJCX0KIApAQCAtOTc0LDEzICs5OTUsMTMgQEAKIAkJCQlpZiAocG9sLT50eXBlICE9IHR5cGUpCiAJCQkJCWNvbnRpbnVlOwogCQkJCV9feGZybV9wb2xpY3lfdW5saW5rKHBvbCwgZGlyKTsKLQkJCQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwkJCQlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCQkJCWNudCsrOwogCiAJCQkJeGZybV9hdWRpdF9wb2xpY3lfZGVsZXRlKHBvbCwgMSwgdGFza192YWxpZCk7CiAJCQkJeGZybV9wb2xpY3lfa2lsbChwb2wpOwogCi0JCQkJd3JpdGVfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCQkJCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCQkJCWdvdG8gYWdhaW4yOwogCQkJfQogCQl9CkBAIC05ODksNyArMTAxMCw3IEBACiAJaWYgKCFjbnQpCiAJCWVyciA9IC1FU1JDSDsKIG91dDoKLQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKHhmcm1fcG9saWN5X2ZsdXNoKTsKQEAgLTEwMDksNyArMTAzMCw3IEBACiAJaWYgKGxpc3RfZW1wdHkoJndhbGstPndhbGsuYWxsKSAmJiB3YWxrLT5zZXEgIT0gMCkKIAkJcmV0dXJuIDA7CiAKLQl3cml0ZV9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJaWYgKGxpc3RfZW1wdHkoJndhbGstPndhbGsuYWxsKSkKIAkJeCA9IGxpc3RfZmlyc3RfZW50cnkoJm5ldC0+eGZybS5wb2xpY3lfYWxsLCBzdHJ1Y3QgeGZybV9wb2xpY3lfd2Fsa19lbnRyeSwgYWxsKTsKIAllbHNlCkBAIC0xMDM3LDcgKzEwNTgsNyBAQAogCX0KIAlsaXN0X2RlbF9pbml0KCZ3YWxrLT53YWxrLmFsbCk7CiBvdXQ6Ci0Jd3JpdGVfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiBFWFBPUlRfU1lNQk9MKHhmcm1fcG9saWN5X3dhbGspOwpAQCAtMTA1Niw5ICsxMDc3LDkgQEAKIAlpZiAobGlzdF9lbXB0eSgmd2Fsay0+d2Fsay5hbGwpKQogCQlyZXR1cm47CiAKLQl3cml0ZV9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7IC8qRklYTUUgd2hlcmUgaXMgbmV0PyAqLworCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOyAvKkZJWE1FIHdoZXJlIGlzIG5ldD8gKi8KIAlsaXN0X2RlbCgmd2Fsay0+d2Fsay5hbGwpOwotCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MKHhmcm1fcG9saWN5X3dhbGtfZG9uZSk7CiAKQEAgLTEwOTYsMTcgKzExMTcsMjQgQEAKIAlzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCwgKnJldDsKIAljb25zdCB4ZnJtX2FkZHJlc3NfdCAqZGFkZHIsICpzYWRkcjsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2hhaW47Ci0JdTMyIHByaW9yaXR5ID0gfjBVOworCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKKwl1MzIgcHJpb3JpdHk7CiAKIAlkYWRkciA9IHhmcm1fZmxvd2lfZGFkZHIoZmwsIGZhbWlseSk7CiAJc2FkZHIgPSB4ZnJtX2Zsb3dpX3NhZGRyKGZsLCBmYW1pbHkpOwogCWlmICh1bmxpa2VseSghZGFkZHIgfHwgIXNhZGRyKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZWFkX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKLQljaGFpbiA9IHBvbGljeV9oYXNoX2RpcmVjdChuZXQsIGRhZGRyLCBzYWRkciwgZmFtaWx5LCBkaXIpOworCXJjdV9yZWFkX2xvY2soKTsKKyByZXRyeToKKwlkbyB7CisJCXNlcXVlbmNlID0gcmVhZF9zZXFjb3VudF9iZWdpbigmeGZybV9wb2xpY3lfaGFzaF9nZW5lcmF0aW9uKTsKKwkJY2hhaW4gPSBwb2xpY3lfaGFzaF9kaXJlY3QobmV0LCBkYWRkciwgc2FkZHIsIGZhbWlseSwgZGlyKTsKKwl9IHdoaWxlIChyZWFkX3NlcWNvdW50X3JldHJ5KCZ4ZnJtX3BvbGljeV9oYXNoX2dlbmVyYXRpb24sIHNlcXVlbmNlKSk7CisKKwlwcmlvcml0eSA9IH4wVTsKIAlyZXQgPSBOVUxMOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvbCwgY2hhaW4sIGJ5ZHN0KSB7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHBvbCwgY2hhaW4sIGJ5ZHN0KSB7CiAJCWVyciA9IHhmcm1fcG9saWN5X21hdGNoKHBvbCwgZmwsIHR5cGUsIGZhbWlseSwgZGlyKTsKIAkJaWYgKGVycikgewogCQkJaWYgKGVyciA9PSAtRVNSQ0gpCkBAIC0xMTIyLDcgKzExNTAsNyBAQAogCQl9CiAJfQogCWNoYWluID0gJm5ldC0+eGZybS5wb2xpY3lfaW5leGFjdFtkaXJdOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvbCwgY2hhaW4sIGJ5ZHN0KSB7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHBvbCwgY2hhaW4sIGJ5ZHN0KSB7CiAJCWlmICgocG9sLT5wcmlvcml0eSA+PSBwcmlvcml0eSkgJiYgcmV0KQogCQkJYnJlYWs7CiAKQEAgLTExNDAsOSArMTE2OCwxMyBAQAogCQl9CiAJfQogCi0JeGZybV9wb2xfaG9sZChyZXQpOworCWlmIChyZWFkX3NlcWNvdW50X3JldHJ5KCZ4ZnJtX3BvbGljeV9oYXNoX2dlbmVyYXRpb24sIHNlcXVlbmNlKSkKKwkJZ290byByZXRyeTsKKworCWlmIChyZXQgJiYgIXhmcm1fcG9sX2hvbGRfcmN1KHJldCkpCisJCWdvdG8gcmV0cnk7CiBmYWlsOgotCXJlYWRfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTIxOSwxMCArMTI1MSw5IEBACiAJCQkJCQkgY29uc3Qgc3RydWN0IGZsb3dpICpmbCkKIHsKIAlzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbDsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JcmVhZF9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisgYWdhaW46CiAJcG9sID0gcmN1X2RlcmVmZXJlbmNlKHNrLT5za19wb2xpY3lbZGlyXSk7CiAJaWYgKHBvbCAhPSBOVUxMKSB7CiAJCWJvb2wgbWF0Y2ggPSB4ZnJtX3NlbGVjdG9yX21hdGNoKCZwb2wtPnNlbGVjdG9yLCBmbCwKQEAgLTEyMzcsOCArMTI2OCw4IEBACiAJCQllcnIgPSBzZWN1cml0eV94ZnJtX3BvbGljeV9sb29rdXAocG9sLT5zZWN1cml0eSwKIAkJCQkJCSAgICAgIGZsLT5mbG93aV9zZWNpZCwKIAkJCQkJCSAgICAgIHBvbGljeV90b19mbG93X2RpcihkaXIpKTsKLQkJCWlmICghZXJyKQotCQkJCXhmcm1fcG9sX2hvbGQocG9sKTsKKwkJCWlmICghZXJyICYmICF4ZnJtX3BvbF9ob2xkX3JjdShwb2wpKQorCQkJCWdvdG8gYWdhaW47CiAJCQllbHNlIGlmIChlcnIgPT0gLUVTUkNIKQogCQkJCXBvbCA9IE5VTEw7CiAJCQllbHNlCkBAIC0xMjQ3LDcgKzEyNzgsNiBAQAogCQkJcG9sID0gTlVMTDsKIAl9CiBvdXQ6Ci0JcmVhZF91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcG9sOwogfQpAQCAtMTI3MSw3ICsxMzAxLDcgQEAKIAogCS8qIFNvY2tldCBwb2xpY2llcyBhcmUgbm90IGhhc2hlZC4gKi8KIAlpZiAoIWhsaXN0X3VuaGFzaGVkKCZwb2wtPmJ5ZHN0KSkgewotCQlobGlzdF9kZWwoJnBvbC0+Ynlkc3QpOworCQlobGlzdF9kZWxfcmN1KCZwb2wtPmJ5ZHN0KTsKIAkJaGxpc3RfZGVsKCZwb2wtPmJ5aWR4KTsKIAl9CiAKQEAgLTEyOTUsOSArMTMyNSw5IEBACiB7CiAJc3RydWN0IG5ldCAqbmV0ID0geHBfbmV0KHBvbCk7CiAKLQl3cml0ZV9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJcG9sID0gX194ZnJtX3BvbGljeV91bmxpbmsocG9sLCBkaXIpOwotCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJaWYgKHBvbCkgewogCQl4ZnJtX3BvbGljeV9raWxsKHBvbCk7CiAJCXJldHVybiAwOwpAQCAtMTMxNiw3ICsxMzQ2LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAjZW5kaWYKIAotCXdyaXRlX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAlvbGRfcG9sID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChzay0+c2tfcG9saWN5W2Rpcl0sCiAJCQkJbG9ja2RlcF9pc19oZWxkKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jaykpOwogCWlmIChwb2wpIHsKQEAgLTEzMzQsNyArMTM2NCw3IEBACiAJCSAqLwogCQl4ZnJtX3NrX3BvbGljeV91bmxpbmsob2xkX3BvbCwgZGlyKTsKIAl9Ci0Jd3JpdGVfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAogCWlmIChvbGRfcG9sKSB7CiAJCXhmcm1fcG9saWN5X2tpbGwob2xkX3BvbCk7CkBAIC0xMzY0LDkgKzEzOTQsOSBAQAogCQluZXdwLT50eXBlID0gb2xkLT50eXBlOwogCQltZW1jcHkobmV3cC0+eGZybV92ZWMsIG9sZC0+eGZybV92ZWMsCiAJCSAgICAgICBuZXdwLT54ZnJtX25yKnNpemVvZihzdHJ1Y3QgeGZybV90bXBsKSk7Ci0JCXdyaXRlX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwkJc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJCXhmcm1fc2tfcG9saWN5X2xpbmsobmV3cCwgZGlyKTsKLQkJd3JpdGVfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJCXhmcm1fcG9sX3B1dChuZXdwKTsKIAl9CiAJcmV0dXJuIG5ld3A7CkBAIC0zMDQ4LDcgKzMwNzgsNyBAQAogCiAJLyogSW5pdGlhbGl6ZSB0aGUgcGVyLW5ldCBsb2NrcyBoZXJlICovCiAJc3Bpbl9sb2NrX2luaXQoJm5ldC0+eGZybS54ZnJtX3N0YXRlX2xvY2spOwotCXJ3bG9ja19pbml0KCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAltdXRleF9pbml0KCZuZXQtPnhmcm0ueGZybV9jZmdfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CkBAIC0zMDgyLDYgKzMxMTIsNyBAQAogdm9pZCBfX2luaXQgeGZybV9pbml0KHZvaWQpCiB7CiAJcmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmeGZybV9uZXRfb3BzKTsKKwlzZXFjb3VudF9pbml0KCZ4ZnJtX3BvbGljeV9oYXNoX2dlbmVyYXRpb24pOwogCXhmcm1faW5wdXRfaW5pdCgpOwogfQogCkBAIC0zMTc5LDcgKzMyMTAsNyBAQAogCXN0cnVjdCBobGlzdF9oZWFkICpjaGFpbjsKIAl1MzIgcHJpb3JpdHkgPSB+MFU7CiAKLQlyZWFkX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsgLypGSVhNRSovCisJc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJY2hhaW4gPSBwb2xpY3lfaGFzaF9kaXJlY3QobmV0LCAmc2VsLT5kYWRkciwgJnNlbC0+c2FkZHIsIHNlbC0+ZmFtaWx5LCBkaXIpOwogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvbCwgY2hhaW4sIGJ5ZHN0KSB7CiAJCWlmICh4ZnJtX21pZ3JhdGVfc2VsZWN0b3JfbWF0Y2goc2VsLCAmcG9sLT5zZWxlY3RvcikgJiYKQEAgLTMyMDMsNyArMzIzNCw3IEBACiAKIAl4ZnJtX3BvbF9ob2xkKHJldCk7CiAKLQlyZWFkX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9wcm9jLmMgYi9uZXQveGZybS94ZnJtX3Byb2MuYwppbmRleCA5YzRmYmQ4Li5iYTJiNTM5IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3Byb2MuYworKysgYi9uZXQveGZybS94ZnJtX3Byb2MuYwpAQCAtNTAsMTIgKzUwLDE4IEBACiAKIHN0YXRpYyBpbnQgeGZybV9zdGF0aXN0aWNzX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogeworCXVuc2lnbmVkIGxvbmcgYnVmZltMSU5VWF9NSUJfWEZSTU1BWF07CiAJc3RydWN0IG5ldCAqbmV0ID0gc2VxLT5wcml2YXRlOwogCWludCBpOworCisJbWVtc2V0KGJ1ZmYsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIExJTlVYX01JQl9YRlJNTUFYKTsKKworCXNubXBfZ2V0X2NwdV9maWVsZF9iYXRjaChidWZmLCB4ZnJtX21pYl9saXN0LAorCQkJCSBuZXQtPm1pYi54ZnJtX3N0YXRpc3RpY3MpOwogCWZvciAoaSA9IDA7IHhmcm1fbWliX2xpc3RbaV0ubmFtZTsgaSsrKQogCQlzZXFfcHJpbnRmKHNlcSwgIiUtMjRzXHQlbHVcbiIsIHhmcm1fbWliX2xpc3RbaV0ubmFtZSwKLQkJCSAgIHNubXBfZm9sZF9maWVsZChuZXQtPm1pYi54ZnJtX3N0YXRpc3RpY3MsCi0JCQkJCSAgIHhmcm1fbWliX2xpc3RbaV0uZW50cnkpKTsKKwkJCQkJCWJ1ZmZbaV0pOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fcmVwbGF5LmMgYi9uZXQveGZybS94ZnJtX3JlcGxheS5jCmluZGV4IDRmZDcyNWEuLmNkYzJlMmUgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fcmVwbGF5LmMKKysrIGIvbmV0L3hmcm0veGZybV9yZXBsYXkuYwpAQCAtNTU4LDcgKzU1OCw3IEBACiAJCXgtPnJlcGwtPm5vdGlmeSh4LCBYRlJNX1JFUExBWV9VUERBVEUpOwogfQogCi1zdGF0aWMgc3RydWN0IHhmcm1fcmVwbGF5IHhmcm1fcmVwbGF5X2xlZ2FjeSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGZybV9yZXBsYXkgeGZybV9yZXBsYXlfbGVnYWN5ID0gewogCS5hZHZhbmNlCT0geGZybV9yZXBsYXlfYWR2YW5jZSwKIAkuY2hlY2sJCT0geGZybV9yZXBsYXlfY2hlY2ssCiAJLnJlY2hlY2sJPSB4ZnJtX3JlcGxheV9jaGVjaywKQEAgLTU2Niw3ICs1NjYsNyBAQAogCS5vdmVyZmxvdwk9IHhmcm1fcmVwbGF5X292ZXJmbG93LAogfTsKIAotc3RhdGljIHN0cnVjdCB4ZnJtX3JlcGxheSB4ZnJtX3JlcGxheV9ibXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHhmcm1fcmVwbGF5IHhmcm1fcmVwbGF5X2JtcCA9IHsKIAkuYWR2YW5jZQk9IHhmcm1fcmVwbGF5X2FkdmFuY2VfYm1wLAogCS5jaGVjawkJPSB4ZnJtX3JlcGxheV9jaGVja19ibXAsCiAJLnJlY2hlY2sJPSB4ZnJtX3JlcGxheV9jaGVja19ibXAsCkBAIC01NzQsNyArNTc0LDcgQEAKIAkub3ZlcmZsb3cJPSB4ZnJtX3JlcGxheV9vdmVyZmxvd19ibXAsCiB9OwogCi1zdGF0aWMgc3RydWN0IHhmcm1fcmVwbGF5IHhmcm1fcmVwbGF5X2VzbiA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGZybV9yZXBsYXkgeGZybV9yZXBsYXlfZXNuID0gewogCS5hZHZhbmNlCT0geGZybV9yZXBsYXlfYWR2YW5jZV9lc24sCiAJLmNoZWNrCQk9IHhmcm1fcmVwbGF5X2NoZWNrX2VzbiwKIAkucmVjaGVjawk9IHhmcm1fcmVwbGF5X3JlY2hlY2tfZXNuLApkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9zdGF0ZS5jIGIvbmV0L3hmcm0veGZybV9zdGF0ZS5jCmluZGV4IDk4OTVhOGMuLjQxOWJmNWQgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fc3RhdGUuYworKysgYi9uZXQveGZybS94ZnJtX3N0YXRlLmMKQEAgLTI4LDYgKzI4LDExIEBACiAKICNpbmNsdWRlICJ4ZnJtX2hhc2guaCIKIAorI2RlZmluZSB4ZnJtX3N0YXRlX2RlcmVmX3Byb3QodGFibGUsIG5ldCkgXAorCXJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoKHRhYmxlKSwgbG9ja2RlcF9pc19oZWxkKCYobmV0KS0+eGZybS54ZnJtX3N0YXRlX2xvY2spKQorCitzdGF0aWMgdm9pZCB4ZnJtX3N0YXRlX2djX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKwogLyogRWFjaCB4ZnJtX3N0YXRlIG1heSBiZSBsaW5rZWQgdG8gdHdvIHRhYmxlczoKIAogICAgMS4gSGFzaCB0YWJsZSBieSAoc3BpLGRhZGRyLGFoL2VzcCkgdG8gZmluZCBTQSBieSBTUEkuIChpbnB1dCxjdGwpCkBAIC0zNiw2ICs0MSwxNSBAQAogICovCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgeGZybV9zdGF0ZV9oYXNobWF4IF9fcmVhZF9tb3N0bHkgPSAxICogMTAyNCAqIDEwMjQ7CitzdGF0aWMgX19yZWFkX21vc3RseSBzZXFjb3VudF90IHhmcm1fc3RhdGVfaGFzaF9nZW5lcmF0aW9uID0gU0VRQ05UX1pFUk8oeGZybV9zdGF0ZV9oYXNoX2dlbmVyYXRpb24pOworCitzdGF0aWMgREVDTEFSRV9XT1JLKHhmcm1fc3RhdGVfZ2Nfd29yaywgeGZybV9zdGF0ZV9nY190YXNrKTsKK3N0YXRpYyBITElTVF9IRUFEKHhmcm1fc3RhdGVfZ2NfbGlzdCk7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCB4ZnJtX3N0YXRlX2hvbGRfcmN1KHN0cnVjdCB4ZnJtX3N0YXRlIF9fcmN1ICp4KQoreworCXJldHVybiBhdG9taWNfaW5jX25vdF96ZXJvKCZ4LT5yZWZjbnQpOworfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB4ZnJtX2RzdF9oYXNoKHN0cnVjdCBuZXQgKm5ldCwKIAkJCQkJIGNvbnN0IHhmcm1fYWRkcmVzc190ICpkYWRkciwKQEAgLTc2LDE4ICs5MCwxOCBAQAogCQloID0gX194ZnJtX2RzdF9oYXNoKCZ4LT5pZC5kYWRkciwgJngtPnByb3BzLnNhZGRyLAogCQkJCSAgICB4LT5wcm9wcy5yZXFpZCwgeC0+cHJvcHMuZmFtaWx5LAogCQkJCSAgICBuaGFzaG1hc2spOwotCQlobGlzdF9hZGRfaGVhZCgmeC0+Ynlkc3QsIG5kc3R0YWJsZStoKTsKKwkJaGxpc3RfYWRkX2hlYWRfcmN1KCZ4LT5ieWRzdCwgbmRzdHRhYmxlICsgaCk7CiAKIAkJaCA9IF9feGZybV9zcmNfaGFzaCgmeC0+aWQuZGFkZHIsICZ4LT5wcm9wcy5zYWRkciwKIAkJCQkgICAgeC0+cHJvcHMuZmFtaWx5LAogCQkJCSAgICBuaGFzaG1hc2spOwotCQlobGlzdF9hZGRfaGVhZCgmeC0+YnlzcmMsIG5zcmN0YWJsZStoKTsKKwkJaGxpc3RfYWRkX2hlYWRfcmN1KCZ4LT5ieXNyYywgbnNyY3RhYmxlICsgaCk7CiAKIAkJaWYgKHgtPmlkLnNwaSkgewogCQkJaCA9IF9feGZybV9zcGlfaGFzaCgmeC0+aWQuZGFkZHIsIHgtPmlkLnNwaSwKIAkJCQkJICAgIHgtPmlkLnByb3RvLCB4LT5wcm9wcy5mYW1pbHksCiAJCQkJCSAgICBuaGFzaG1hc2spOwotCQkJaGxpc3RfYWRkX2hlYWQoJngtPmJ5c3BpLCBuc3BpdGFibGUraCk7CisJCQlobGlzdF9hZGRfaGVhZF9yY3UoJngtPmJ5c3BpLCBuc3BpdGFibGUgKyBoKTsKIAkJfQogCX0KIH0KQEAgLTEyMiwyNSArMTM2LDI5IEBACiAJfQogCiAJc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9zdGF0ZV9sb2NrKTsKKwl3cml0ZV9zZXFjb3VudF9iZWdpbigmeGZybV9zdGF0ZV9oYXNoX2dlbmVyYXRpb24pOwogCiAJbmhhc2htYXNrID0gKG5zaXplIC8gc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSkgLSAxVTsKKwlvZHN0ID0geGZybV9zdGF0ZV9kZXJlZl9wcm90KG5ldC0+eGZybS5zdGF0ZV9ieWRzdCwgbmV0KTsKIAlmb3IgKGkgPSBuZXQtPnhmcm0uc3RhdGVfaG1hc2s7IGkgPj0gMDsgaS0tKQotCQl4ZnJtX2hhc2hfdHJhbnNmZXIobmV0LT54ZnJtLnN0YXRlX2J5ZHN0K2ksIG5kc3QsIG5zcmMsIG5zcGksCi0JCQkJICAgbmhhc2htYXNrKTsKKwkJeGZybV9oYXNoX3RyYW5zZmVyKG9kc3QgKyBpLCBuZHN0LCBuc3JjLCBuc3BpLCBuaGFzaG1hc2spOwogCi0Jb2RzdCA9IG5ldC0+eGZybS5zdGF0ZV9ieWRzdDsKLQlvc3JjID0gbmV0LT54ZnJtLnN0YXRlX2J5c3JjOwotCW9zcGkgPSBuZXQtPnhmcm0uc3RhdGVfYnlzcGk7CisJb3NyYyA9IHhmcm1fc3RhdGVfZGVyZWZfcHJvdChuZXQtPnhmcm0uc3RhdGVfYnlzcmMsIG5ldCk7CisJb3NwaSA9IHhmcm1fc3RhdGVfZGVyZWZfcHJvdChuZXQtPnhmcm0uc3RhdGVfYnlzcGksIG5ldCk7CiAJb2hhc2htYXNrID0gbmV0LT54ZnJtLnN0YXRlX2htYXNrOwogCi0JbmV0LT54ZnJtLnN0YXRlX2J5ZHN0ID0gbmRzdDsKLQluZXQtPnhmcm0uc3RhdGVfYnlzcmMgPSBuc3JjOwotCW5ldC0+eGZybS5zdGF0ZV9ieXNwaSA9IG5zcGk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldC0+eGZybS5zdGF0ZV9ieWRzdCwgbmRzdCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldC0+eGZybS5zdGF0ZV9ieXNyYywgbnNyYyk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldC0+eGZybS5zdGF0ZV9ieXNwaSwgbnNwaSk7CiAJbmV0LT54ZnJtLnN0YXRlX2htYXNrID0gbmhhc2htYXNrOwogCisJd3JpdGVfc2VxY291bnRfZW5kKCZ4ZnJtX3N0YXRlX2hhc2hfZ2VuZXJhdGlvbik7CiAJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3N0YXRlX2xvY2spOwogCiAJb3NpemUgPSAob2hhc2htYXNrICsgMSkgKiBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpOworCisJc3luY2hyb25pemVfcmN1KCk7CisKIAl4ZnJtX2hhc2hfZnJlZShvZHN0LCBvc2l6ZSk7CiAJeGZybV9oYXNoX2ZyZWUob3NyYywgb3NpemUpOwogCXhmcm1faGFzaF9mcmVlKG9zcGksIG9zaXplKTsKQEAgLTMzMiw2ICszNTAsNyBAQAogewogCXRhc2tsZXRfaHJ0aW1lcl9jYW5jZWwoJngtPm10aW1lcik7CiAJZGVsX3RpbWVyX3N5bmMoJngtPnJ0aW1lcik7CisJa2ZyZWUoeC0+YWVhZCk7CiAJa2ZyZWUoeC0+YWFsZyk7CiAJa2ZyZWUoeC0+ZWFsZyk7CiAJa2ZyZWUoeC0+Y2FsZyk7CkBAIC0zNTUsMTUgKzM3NCwxNiBAQAogCiBzdGF0aWMgdm9pZCB4ZnJtX3N0YXRlX2djX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBuZXQgKm5ldCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbmV0LCB4ZnJtLnN0YXRlX2djX3dvcmspOwogCXN0cnVjdCB4ZnJtX3N0YXRlICp4OwogCXN0cnVjdCBobGlzdF9ub2RlICp0bXA7CiAJc3RydWN0IGhsaXN0X2hlYWQgZ2NfbGlzdDsKIAogCXNwaW5fbG9ja19iaCgmeGZybV9zdGF0ZV9nY19sb2NrKTsKLQlobGlzdF9tb3ZlX2xpc3QoJm5ldC0+eGZybS5zdGF0ZV9nY19saXN0LCAmZ2NfbGlzdCk7CisJaGxpc3RfbW92ZV9saXN0KCZ4ZnJtX3N0YXRlX2djX2xpc3QsICZnY19saXN0KTsKIAlzcGluX3VubG9ja19iaCgmeGZybV9zdGF0ZV9nY19sb2NrKTsKIAorCXN5bmNocm9uaXplX3JjdSgpOworCiAJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh4LCB0bXAsICZnY19saXN0LCBnY2xpc3QpCiAJCXhmcm1fc3RhdGVfZ2NfZGVzdHJveSh4KTsKIH0KQEAgLTUwMCwxNCArNTIwLDEyIEBACiAKIHZvaWQgX194ZnJtX3N0YXRlX2Rlc3Ryb3koc3RydWN0IHhmcm1fc3RhdGUgKngpCiB7Ci0Jc3RydWN0IG5ldCAqbmV0ID0geHNfbmV0KHgpOwotCiAJV0FSTl9PTih4LT5rbS5zdGF0ZSAhPSBYRlJNX1NUQVRFX0RFQUQpOwogCiAJc3Bpbl9sb2NrX2JoKCZ4ZnJtX3N0YXRlX2djX2xvY2spOwotCWhsaXN0X2FkZF9oZWFkKCZ4LT5nY2xpc3QsICZuZXQtPnhmcm0uc3RhdGVfZ2NfbGlzdCk7CisJaGxpc3RfYWRkX2hlYWQoJngtPmdjbGlzdCwgJnhmcm1fc3RhdGVfZ2NfbGlzdCk7CiAJc3Bpbl91bmxvY2tfYmgoJnhmcm1fc3RhdGVfZ2NfbG9jayk7Ci0Jc2NoZWR1bGVfd29yaygmbmV0LT54ZnJtLnN0YXRlX2djX3dvcmspOworCXNjaGVkdWxlX3dvcmsoJnhmcm1fc3RhdGVfZ2Nfd29yayk7CiB9CiBFWFBPUlRfU1lNQk9MKF9feGZybV9zdGF0ZV9kZXN0cm95KTsKIApAQCAtNTIwLDEwICs1MzgsMTAgQEAKIAkJeC0+a20uc3RhdGUgPSBYRlJNX1NUQVRFX0RFQUQ7CiAJCXNwaW5fbG9jaygmbmV0LT54ZnJtLnhmcm1fc3RhdGVfbG9jayk7CiAJCWxpc3RfZGVsKCZ4LT5rbS5hbGwpOwotCQlobGlzdF9kZWwoJngtPmJ5ZHN0KTsKLQkJaGxpc3RfZGVsKCZ4LT5ieXNyYyk7CisJCWhsaXN0X2RlbF9yY3UoJngtPmJ5ZHN0KTsKKwkJaGxpc3RfZGVsX3JjdSgmeC0+YnlzcmMpOwogCQlpZiAoeC0+aWQuc3BpKQotCQkJaGxpc3RfZGVsKCZ4LT5ieXNwaSk7CisJCQlobGlzdF9kZWxfcmN1KCZ4LT5ieXNwaSk7CiAJCW5ldC0+eGZybS5zdGF0ZV9udW0tLTsKIAkJc3Bpbl91bmxvY2soJm5ldC0+eGZybS54ZnJtX3N0YXRlX2xvY2spOwogCkBAIC02NTksNyArNjc3LDcgQEAKIAl1bnNpZ25lZCBpbnQgaCA9IHhmcm1fc3BpX2hhc2gobmV0LCBkYWRkciwgc3BpLCBwcm90bywgZmFtaWx5KTsKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKIAotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHgsIG5ldC0+eGZybS5zdGF0ZV9ieXNwaStoLCBieXNwaSkgeworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh4LCBuZXQtPnhmcm0uc3RhdGVfYnlzcGkgKyBoLCBieXNwaSkgewogCQlpZiAoeC0+cHJvcHMuZmFtaWx5ICE9IGZhbWlseSB8fAogCQkgICAgeC0+aWQuc3BpICAgICAgICE9IHNwaSB8fAogCQkgICAgeC0+aWQucHJvdG8gICAgICE9IHByb3RvIHx8CkBAIC02NjgsNyArNjg2LDggQEAKIAogCQlpZiAoKG1hcmsgJiB4LT5tYXJrLm0pICE9IHgtPm1hcmsudikKIAkJCWNvbnRpbnVlOwotCQl4ZnJtX3N0YXRlX2hvbGQoeCk7CisJCWlmICgheGZybV9zdGF0ZV9ob2xkX3JjdSh4KSkKKwkJCWNvbnRpbnVlOwogCQlyZXR1cm4geDsKIAl9CiAKQEAgLTY4Myw3ICs3MDIsNyBAQAogCXVuc2lnbmVkIGludCBoID0geGZybV9zcmNfaGFzaChuZXQsIGRhZGRyLCBzYWRkciwgZmFtaWx5KTsKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKIAotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHgsIG5ldC0+eGZybS5zdGF0ZV9ieXNyYytoLCBieXNyYykgeworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh4LCBuZXQtPnhmcm0uc3RhdGVfYnlzcmMgKyBoLCBieXNyYykgewogCQlpZiAoeC0+cHJvcHMuZmFtaWx5ICE9IGZhbWlseSB8fAogCQkgICAgeC0+aWQucHJvdG8gICAgICE9IHByb3RvIHx8CiAJCSAgICAheGZybV9hZGRyX2VxdWFsKCZ4LT5pZC5kYWRkciwgZGFkZHIsIGZhbWlseSkgfHwKQEAgLTY5Miw3ICs3MTEsOCBAQAogCiAJCWlmICgobWFyayAmIHgtPm1hcmsubSkgIT0geC0+bWFyay52KQogCQkJY29udGludWU7Ci0JCXhmcm1fc3RhdGVfaG9sZCh4KTsKKwkJaWYgKCF4ZnJtX3N0YXRlX2hvbGRfcmN1KHgpKQorCQkJY29udGludWU7CiAJCXJldHVybiB4OwogCX0KIApAQCAtNzc1LDEzICs3OTUsMTYgQEAKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqYmVzdCA9IE5VTEw7CiAJdTMyIG1hcmsgPSBwb2wtPm1hcmsudiAmIHBvbC0+bWFyay5tOwogCXVuc2lnbmVkIHNob3J0IGVuY2FwX2ZhbWlseSA9IHRtcGwtPmVuY2FwX2ZhbWlseTsKKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CiAJc3RydWN0IGttX2V2ZW50IGM7CiAKIAl0b19wdXQgPSBOVUxMOwogCi0Jc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9zdGF0ZV9sb2NrKTsKKwlzZXF1ZW5jZSA9IHJlYWRfc2VxY291bnRfYmVnaW4oJnhmcm1fc3RhdGVfaGFzaF9nZW5lcmF0aW9uKTsKKworCXJjdV9yZWFkX2xvY2soKTsKIAloID0geGZybV9kc3RfaGFzaChuZXQsIGRhZGRyLCBzYWRkciwgdG1wbC0+cmVxaWQsIGVuY2FwX2ZhbWlseSk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnkoeCwgbmV0LT54ZnJtLnN0YXRlX2J5ZHN0K2gsIGJ5ZHN0KSB7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHgsIG5ldC0+eGZybS5zdGF0ZV9ieWRzdCArIGgsIGJ5ZHN0KSB7CiAJCWlmICh4LT5wcm9wcy5mYW1pbHkgPT0gZW5jYXBfZmFtaWx5ICYmCiAJCSAgICB4LT5wcm9wcy5yZXFpZCA9PSB0bXBsLT5yZXFpZCAmJgogCQkgICAgKG1hcmsgJiB4LT5tYXJrLm0pID09IHgtPm1hcmsudiAmJgpAQCAtNzk3LDcgKzgyMCw3IEBACiAJCWdvdG8gZm91bmQ7CiAKIAloX3dpbGRjYXJkID0geGZybV9kc3RfaGFzaChuZXQsIGRhZGRyLCAmc2FkZHJfd2lsZGNhcmQsIHRtcGwtPnJlcWlkLCBlbmNhcF9mYW1pbHkpOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHgsIG5ldC0+eGZybS5zdGF0ZV9ieWRzdCtoX3dpbGRjYXJkLCBieWRzdCkgeworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh4LCBuZXQtPnhmcm0uc3RhdGVfYnlkc3QgKyBoX3dpbGRjYXJkLCBieWRzdCkgewogCQlpZiAoeC0+cHJvcHMuZmFtaWx5ID09IGVuY2FwX2ZhbWlseSAmJgogCQkgICAgeC0+cHJvcHMucmVxaWQgPT0gdG1wbC0+cmVxaWQgJiYKIAkJICAgIChtYXJrICYgeC0+bWFyay5tKSA9PSB4LT5tYXJrLnYgJiYKQEAgLTg1MCwxOSArODczLDIxIEBACiAJCX0KIAogCQlpZiAoa21fcXVlcnkoeCwgdG1wbCwgcG9sKSA9PSAwKSB7CisJCQlzcGluX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3N0YXRlX2xvY2spOwogCQkJeC0+a20uc3RhdGUgPSBYRlJNX1NUQVRFX0FDUTsKIAkJCWxpc3RfYWRkKCZ4LT5rbS5hbGwsICZuZXQtPnhmcm0uc3RhdGVfYWxsKTsKLQkJCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieWRzdCwgbmV0LT54ZnJtLnN0YXRlX2J5ZHN0K2gpOworCQkJaGxpc3RfYWRkX2hlYWRfcmN1KCZ4LT5ieWRzdCwgbmV0LT54ZnJtLnN0YXRlX2J5ZHN0ICsgaCk7CiAJCQloID0geGZybV9zcmNfaGFzaChuZXQsIGRhZGRyLCBzYWRkciwgZW5jYXBfZmFtaWx5KTsKLQkJCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieXNyYywgbmV0LT54ZnJtLnN0YXRlX2J5c3JjK2gpOworCQkJaGxpc3RfYWRkX2hlYWRfcmN1KCZ4LT5ieXNyYywgbmV0LT54ZnJtLnN0YXRlX2J5c3JjICsgaCk7CiAJCQlpZiAoeC0+aWQuc3BpKSB7CiAJCQkJaCA9IHhmcm1fc3BpX2hhc2gobmV0LCAmeC0+aWQuZGFkZHIsIHgtPmlkLnNwaSwgeC0+aWQucHJvdG8sIGVuY2FwX2ZhbWlseSk7Ci0JCQkJaGxpc3RfYWRkX2hlYWQoJngtPmJ5c3BpLCBuZXQtPnhmcm0uc3RhdGVfYnlzcGkraCk7CisJCQkJaGxpc3RfYWRkX2hlYWRfcmN1KCZ4LT5ieXNwaSwgbmV0LT54ZnJtLnN0YXRlX2J5c3BpICsgaCk7CiAJCQl9CiAJCQl4LT5sZnQuaGFyZF9hZGRfZXhwaXJlc19zZWNvbmRzID0gbmV0LT54ZnJtLnN5c2N0bF9hY3FfZXhwaXJlczsKIAkJCXRhc2tsZXRfaHJ0aW1lcl9zdGFydCgmeC0+bXRpbWVyLCBrdGltZV9zZXQobmV0LT54ZnJtLnN5c2N0bF9hY3FfZXhwaXJlcywgMCksIEhSVElNRVJfTU9ERV9SRUwpOwogCQkJbmV0LT54ZnJtLnN0YXRlX251bSsrOwogCQkJeGZybV9oYXNoX2dyb3dfY2hlY2sobmV0LCB4LT5ieWRzdC5uZXh0ICE9IE5VTEwpOworCQkJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3N0YXRlX2xvY2spOwogCQl9IGVsc2UgewogCQkJeC0+a20uc3RhdGUgPSBYRlJNX1NUQVRFX0RFQUQ7CiAJCQl0b19wdXQgPSB4OwpAQCAtODcxLDEzICs4OTYsMjYgQEAKIAkJfQogCX0KIG91dDoKLQlpZiAoeCkKLQkJeGZybV9zdGF0ZV9ob2xkKHgpOwotCWVsc2UKKwlpZiAoeCkgeworCQlpZiAoIXhmcm1fc3RhdGVfaG9sZF9yY3UoeCkpIHsKKwkJCSplcnIgPSAtRUFHQUlOOworCQkJeCA9IE5VTEw7CisJCX0KKwl9IGVsc2UgewogCQkqZXJyID0gYWNxdWlyZV9pbl9wcm9ncmVzcyA/IC1FQUdBSU4gOiBlcnJvcjsKLQlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fc3RhdGVfbG9jayk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOwogCWlmICh0b19wdXQpCiAJCXhmcm1fc3RhdGVfcHV0KHRvX3B1dCk7CisKKwlpZiAocmVhZF9zZXFjb3VudF9yZXRyeSgmeGZybV9zdGF0ZV9oYXNoX2dlbmVyYXRpb24sIHNlcXVlbmNlKSkgeworCQkqZXJyID0gLUVBR0FJTjsKKwkJaWYgKHgpIHsKKwkJCXhmcm1fc3RhdGVfcHV0KHgpOworCQkJeCA9IE5VTEw7CisJCX0KKwl9CisKIAlyZXR1cm4geDsKIH0KIApAQCAtOTQ1LDE2ICs5ODMsMTYgQEAKIAogCWggPSB4ZnJtX2RzdF9oYXNoKG5ldCwgJngtPmlkLmRhZGRyLCAmeC0+cHJvcHMuc2FkZHIsCiAJCQkgIHgtPnByb3BzLnJlcWlkLCB4LT5wcm9wcy5mYW1pbHkpOwotCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieWRzdCwgbmV0LT54ZnJtLnN0YXRlX2J5ZHN0K2gpOworCWhsaXN0X2FkZF9oZWFkX3JjdSgmeC0+Ynlkc3QsIG5ldC0+eGZybS5zdGF0ZV9ieWRzdCArIGgpOwogCiAJaCA9IHhmcm1fc3JjX2hhc2gobmV0LCAmeC0+aWQuZGFkZHIsICZ4LT5wcm9wcy5zYWRkciwgeC0+cHJvcHMuZmFtaWx5KTsKLQlobGlzdF9hZGRfaGVhZCgmeC0+YnlzcmMsIG5ldC0+eGZybS5zdGF0ZV9ieXNyYytoKTsKKwlobGlzdF9hZGRfaGVhZF9yY3UoJngtPmJ5c3JjLCBuZXQtPnhmcm0uc3RhdGVfYnlzcmMgKyBoKTsKIAogCWlmICh4LT5pZC5zcGkpIHsKIAkJaCA9IHhmcm1fc3BpX2hhc2gobmV0LCAmeC0+aWQuZGFkZHIsIHgtPmlkLnNwaSwgeC0+aWQucHJvdG8sCiAJCQkJICB4LT5wcm9wcy5mYW1pbHkpOwogCi0JCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieXNwaSwgbmV0LT54ZnJtLnN0YXRlX2J5c3BpK2gpOworCQlobGlzdF9hZGRfaGVhZF9yY3UoJngtPmJ5c3BpLCBuZXQtPnhmcm0uc3RhdGVfYnlzcGkgKyBoKTsKIAl9CiAKIAl0YXNrbGV0X2hydGltZXJfc3RhcnQoJngtPm10aW1lciwga3RpbWVfc2V0KDEsIDApLCBIUlRJTUVSX01PREVfUkVMKTsKQEAgLTEwNjMsOSArMTEwMSw5IEBACiAJCXhmcm1fc3RhdGVfaG9sZCh4KTsKIAkJdGFza2xldF9ocnRpbWVyX3N0YXJ0KCZ4LT5tdGltZXIsIGt0aW1lX3NldChuZXQtPnhmcm0uc3lzY3RsX2FjcV9leHBpcmVzLCAwKSwgSFJUSU1FUl9NT0RFX1JFTCk7CiAJCWxpc3RfYWRkKCZ4LT5rbS5hbGwsICZuZXQtPnhmcm0uc3RhdGVfYWxsKTsKLQkJaGxpc3RfYWRkX2hlYWQoJngtPmJ5ZHN0LCBuZXQtPnhmcm0uc3RhdGVfYnlkc3QraCk7CisJCWhsaXN0X2FkZF9oZWFkX3JjdSgmeC0+Ynlkc3QsIG5ldC0+eGZybS5zdGF0ZV9ieWRzdCArIGgpOwogCQloID0geGZybV9zcmNfaGFzaChuZXQsIGRhZGRyLCBzYWRkciwgZmFtaWx5KTsKLQkJaGxpc3RfYWRkX2hlYWQoJngtPmJ5c3JjLCBuZXQtPnhmcm0uc3RhdGVfYnlzcmMraCk7CisJCWhsaXN0X2FkZF9oZWFkX3JjdSgmeC0+YnlzcmMsIG5ldC0+eGZybS5zdGF0ZV9ieXNyYyArIGgpOwogCiAJCW5ldC0+eGZybS5zdGF0ZV9udW0rKzsKIApAQCAtMTM5NCw5ICsxNDMyLDkgQEAKIHsKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKIAotCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fc3RhdGVfbG9jayk7CisJcmN1X3JlYWRfbG9jaygpOwogCXggPSBfX3hmcm1fc3RhdGVfbG9va3VwKG5ldCwgbWFyaywgZGFkZHIsIHNwaSwgcHJvdG8sIGZhbWlseSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3N0YXRlX2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiB4OwogfQogRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX2xvb2t1cCk7CkBAIC0xNTgxLDcgKzE2MTksNyBAQAogCWlmICh4LT5pZC5zcGkpIHsKIAkJc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9zdGF0ZV9sb2NrKTsKIAkJaCA9IHhmcm1fc3BpX2hhc2gobmV0LCAmeC0+aWQuZGFkZHIsIHgtPmlkLnNwaSwgeC0+aWQucHJvdG8sIHgtPnByb3BzLmZhbWlseSk7Ci0JCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieXNwaSwgbmV0LT54ZnJtLnN0YXRlX2J5c3BpK2gpOworCQlobGlzdF9hZGRfaGVhZF9yY3UoJngtPmJ5c3BpLCBuZXQtPnhmcm0uc3RhdGVfYnlzcGkgKyBoKTsKIAkJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3N0YXRlX2xvY2spOwogCiAJCWVyciA9IDA7CkBAIC0yMDk5LDggKzIxMzcsNiBAQAogCiAJbmV0LT54ZnJtLnN0YXRlX251bSA9IDA7CiAJSU5JVF9XT1JLKCZuZXQtPnhmcm0uc3RhdGVfaGFzaF93b3JrLCB4ZnJtX2hhc2hfcmVzaXplKTsKLQlJTklUX0hMSVNUX0hFQUQoJm5ldC0+eGZybS5zdGF0ZV9nY19saXN0KTsKLQlJTklUX1dPUksoJm5ldC0+eGZybS5zdGF0ZV9nY193b3JrLCB4ZnJtX3N0YXRlX2djX3Rhc2spOwogCXNwaW5fbG9ja19pbml0KCZuZXQtPnhmcm0ueGZybV9zdGF0ZV9sb2NrKTsKIAlyZXR1cm4gMDsKIApAQCAtMjExOCw3ICsyMTU0LDcgQEAKIAogCWZsdXNoX3dvcmsoJm5ldC0+eGZybS5zdGF0ZV9oYXNoX3dvcmspOwogCXhmcm1fc3RhdGVfZmx1c2gobmV0LCBJUFNFQ19QUk9UT19BTlksIGZhbHNlKTsKLQlmbHVzaF93b3JrKCZuZXQtPnhmcm0uc3RhdGVfZ2Nfd29yayk7CisJZmx1c2hfd29yaygmeGZybV9zdGF0ZV9nY193b3JrKTsKIAogCVdBUk5fT04oIWxpc3RfZW1wdHkoJm5ldC0+eGZybS5zdGF0ZV9hbGwpKTsKIApkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9zeXNjdGwuYyBiL25ldC94ZnJtL3hmcm1fc3lzY3RsLmMKaW5kZXggMDVhNmUzZC4uMzVhN2U3OSAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9zeXNjdGwuYworKysgYi9uZXQveGZybS94ZnJtX3N5c2N0bC5jCkBAIC0xNywxMyArMTcsMTMgQEAKIAkJLnByb2NuYW1lCT0gInhmcm1fYWV2ZW50X2V0aW1lIiwKIAkJLm1heGxlbgkJPSBzaXplb2YodTMyKSwKIAkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG91aW50dmVjCiAJfSwKIAl7CiAJCS5wcm9jbmFtZQk9ICJ4ZnJtX2FldmVudF9yc2VxdGgiLAogCQkubWF4bGVuCQk9IHNpemVvZih1MzIpLAogCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYworCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb3VpbnR2ZWMKIAl9LAogCXsKIAkJLnByb2NuYW1lCT0gInhmcm1fbGFydmFsX2Ryb3AiLApkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV91c2VyLmMgYi9uZXQveGZybS94ZnJtX3VzZXIuYwppbmRleCBkNTE2ODQ1Li4wODg5MjA5IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3VzZXIuYworKysgYi9uZXQveGZybS94ZnJtX3VzZXIuYwpAQCAtNTgxLDkgKzU4MSwxMiBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyb3I7CiAKLQlpZiAoYXR0cnNbWEZSTUFfU0VDX0NUWF0gJiYKLQkgICAgc2VjdXJpdHlfeGZybV9zdGF0ZV9hbGxvYyh4LCBubGFfZGF0YShhdHRyc1tYRlJNQV9TRUNfQ1RYXSkpKQotCQlnb3RvIGVycm9yOworCWlmIChhdHRyc1tYRlJNQV9TRUNfQ1RYXSkgeworCQllcnIgPSBzZWN1cml0eV94ZnJtX3N0YXRlX2FsbG9jKHgsCisJCQkJCQlubGFfZGF0YShhdHRyc1tYRlJNQV9TRUNfQ1RYXSkpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJvcjsKKwl9CiAKIAlpZiAoKGVyciA9IHhmcm1fYWxsb2NfcmVwbGF5X3N0YXRlX2VzbigmeC0+cmVwbGF5X2VzbiwgJngtPnByZXBsYXlfZXNuLAogCQkJCQkgICAgICAgYXR0cnNbWEZSTUFfUkVQTEFZX0VTTl9WQUxdKSkpCkBAIC04OTYsNyArODk5LDggQEAKIAlzdHJ1Y3Qgc29jayAqc2sgPSBjYi0+c2tiLT5zazsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAKLQl4ZnJtX3N0YXRlX3dhbGtfZG9uZSh3YWxrLCBuZXQpOworCWlmIChjYi0+YXJnc1swXSkKKwkJeGZybV9zdGF0ZV93YWxrX2RvbmUod2FsaywgbmV0KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTIxLDggKzkyNSw2IEBACiAJCXU4IHByb3RvID0gMDsKIAkJaW50IGVycjsKIAotCQljYi0+YXJnc1swXSA9IDE7Ci0KIAkJZXJyID0gbmxtc2dfcGFyc2UoY2ItPm5saCwgMCwgYXR0cnMsIFhGUk1BX01BWCwKIAkJCQkgIHhmcm1hX3BvbGljeSk7CiAJCWlmIChlcnIgPCAwKQpAQCAtOTM5LDYgKzk0MSw3IEBACiAJCQlwcm90byA9IG5sYV9nZXRfdTgoYXR0cnNbWEZSTUFfUFJPVE9dKTsKIAogCQl4ZnJtX3N0YXRlX3dhbGtfaW5pdCh3YWxrLCBwcm90bywgZmlsdGVyKTsKKwkJY2ItPmFyZ3NbMF0gPSAxOwogCX0KIAogCSh2b2lkKSB4ZnJtX3N0YXRlX3dhbGsobmV0LCB3YWxrLCBkdW1wX29uZV9zdGF0ZSwgJmluZm8pOwpAQCAtMjA1MSw5ICsyMDU0LDYgQEAKIAlpZiAodXAtPmhhcmQpIHsKIAkJeGZybV9wb2xpY3lfZGVsZXRlKHhwLCBwLT5kaXIpOwogCQl4ZnJtX2F1ZGl0X3BvbGljeV9kZWxldGUoeHAsIDEsIHRydWUpOwotCX0gZWxzZSB7Ci0JCS8vIHJlc2V0IHRoZSB0aW1lcnMgaGVyZT8KLQkJV0FSTigxLCAiRG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggc29mdCBwb2xpY3kgZXhwaXJlXG4iKTsKIAl9CiAJa21fcG9saWN5X2V4cGlyZWQoeHAsIHAtPmRpciwgdXAtPmhhcmQsIG5saC0+bmxtc2dfcGlkKTsKIApAQCAtMjExNyw3ICsyMTE3LDcgQEAKIAogCWVyciA9IHZlcmlmeV9uZXdwb2xpY3lfaW5mbygmdWEtPnBvbGljeSk7CiAJaWYgKGVycikKLQkJZ290byBiYWRfcG9saWN5OworCQlnb3RvIGZyZWVfc3RhdGU7CiAKIAkvKiAgIGJ1aWxkIGFuIFhQICovCiAJeHAgPSB4ZnJtX3BvbGljeV9jb25zdHJ1Y3QobmV0LCAmdWEtPnBvbGljeSwgYXR0cnMsICZlcnIpOwpAQCAtMjE0OSw4ICsyMTQ5LDYgQEAKIAogCXJldHVybiAwOwogCi1iYWRfcG9saWN5OgotCVdBUk4oMSwgIkJBRCBwb2xpY3kgcGFzc2VkXG4iKTsKIGZyZWVfc3RhdGU6CiAJa2ZyZWUoeCk7CiBub21lbToKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL01ha2VmaWxlIGIvc2FtcGxlcy9icGYvTWFrZWZpbGUKaW5kZXggOTBlYmY3ZC4uMTJiNzMwNCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9icGYvTWFrZWZpbGUKKysrIGIvc2FtcGxlcy9icGYvTWFrZWZpbGUKQEAgLTI0LDYgKzI0LDkgQEAKIGhvc3Rwcm9ncy15ICs9IHRlc3RfY2dycDJfYXJyYXlfcGluCiBob3N0cHJvZ3MteSArPSB4ZHAxCiBob3N0cHJvZ3MteSArPSB4ZHAyCitob3N0cHJvZ3MteSArPSB0ZXN0X2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXAKK2hvc3Rwcm9ncy15ICs9IHRyYWNlX2V2ZW50Citob3N0cHJvZ3MteSArPSBzYW1wbGVpcAogCiB0ZXN0X3ZlcmlmaWVyLW9ianMgOj0gdGVzdF92ZXJpZmllci5vIGxpYmJwZi5vCiB0ZXN0X21hcHMtb2JqcyA6PSB0ZXN0X21hcHMubyBsaWJicGYubwpAQCAtNDksNiArNTIsMTAgQEAKIHhkcDEtb2JqcyA6PSBicGZfbG9hZC5vIGxpYmJwZi5vIHhkcDFfdXNlci5vCiAjIHJldXNlIHhkcDEgc291cmNlIGludGVudGlvbmFsbHkKIHhkcDItb2JqcyA6PSBicGZfbG9hZC5vIGxpYmJwZi5vIHhkcDFfdXNlci5vCit0ZXN0X2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXAtb2JqcyA6PSBicGZfbG9hZC5vIGxpYmJwZi5vIFwKKwkJCQkgICAgICAgdGVzdF9jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwX3VzZXIubwordHJhY2VfZXZlbnQtb2JqcyA6PSBicGZfbG9hZC5vIGxpYmJwZi5vIHRyYWNlX2V2ZW50X3VzZXIubworc2FtcGxlaXAtb2JqcyA6PSBicGZfbG9hZC5vIGxpYmJwZi5vIHNhbXBsZWlwX3VzZXIubwogCiAjIFRlbGwga2J1aWxkIHRvIGFsd2F5cyBidWlsZCB0aGUgcHJvZ3JhbXMKIGFsd2F5cyA6PSAkKGhvc3Rwcm9ncy15KQpAQCAtNjQsNiArNzEsNyBAQAogYWx3YXlzICs9IHRlc3RfcHJvYmVfd3JpdGVfdXNlcl9rZXJuLm8KIGFsd2F5cyArPSB0cmFjZV9vdXRwdXRfa2Vybi5vCiBhbHdheXMgKz0gdGNicGYxX2tlcm4ubworYWx3YXlzICs9IHRjYnBmMl9rZXJuLm8KIGFsd2F5cyArPSBsYXRoaXN0X2tlcm4ubwogYWx3YXlzICs9IG9mZndha2V0aW1lX2tlcm4ubwogYWx3YXlzICs9IHNwaW50ZXN0X2tlcm4ubwpAQCAtNzQsNiArODIsOSBAQAogYWx3YXlzICs9IHRlc3RfY2dycDJfdGNfa2Vybi5vCiBhbHdheXMgKz0geGRwMV9rZXJuLm8KIGFsd2F5cyArPSB4ZHAyX2tlcm4ubworYWx3YXlzICs9IHRlc3RfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cF9rZXJuLm8KK2Fsd2F5cyArPSB0cmFjZV9ldmVudF9rZXJuLm8KK2Fsd2F5cyArPSBzYW1wbGVpcF9rZXJuLm8KIAogSE9TVENGTEFHUyArPSAtSSQob2JqdHJlZSkvdXNyL2luY2x1ZGUKIApAQCAtOTcsNiArMTA4LDkgQEAKIEhPU1RMT0FETElCRVNfdGVzdF9vdmVyaGVhZCArPSAtbGVsZiAtbHJ0CiBIT1NUTE9BRExJQkVTX3hkcDEgKz0gLWxlbGYKIEhPU1RMT0FETElCRVNfeGRwMiArPSAtbGVsZgorSE9TVExPQURMSUJFU190ZXN0X2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXAgKz0gLWxlbGYKK0hPU1RMT0FETElCRVNfdHJhY2VfZXZlbnQgKz0gLWxlbGYKK0hPU1RMT0FETElCRVNfc2FtcGxlaXAgKz0gLWxlbGYKIAogIyBBbGxvd3MgcG9pbnRpbmcgTExDL0NMQU5HIHRvIGEgTExWTSBiYWNrZW5kIHdpdGggYnBmIHN1cHBvcnQsIHJlZGVmaW5lIG9uIGNtZGxpbmU6CiAjICBtYWtlIHNhbXBsZXMvYnBmLyBMTEM9fi9naXQvbGx2bS9idWlsZC9iaW4vbGxjIENMQU5HPX4vZ2l0L2xsdm0vYnVpbGQvYmluL2NsYW5nCmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9icGZfaGVscGVycy5oIGIvc2FtcGxlcy9icGYvYnBmX2hlbHBlcnMuaAppbmRleCAyMTdjOGQ1MDcuLjkwZjQ0YmQgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL2JwZl9oZWxwZXJzLmgKKysrIGIvc2FtcGxlcy9icGYvYnBmX2hlbHBlcnMuaApAQCAtMzcsMTIgKzM3LDI2IEBACiAJKHZvaWQgKikgQlBGX0ZVTkNfY2xvbmVfcmVkaXJlY3Q7CiBzdGF0aWMgaW50ICgqYnBmX3JlZGlyZWN0KShpbnQgaWZpbmRleCwgaW50IGZsYWdzKSA9CiAJKHZvaWQgKikgQlBGX0ZVTkNfcmVkaXJlY3Q7Ci1zdGF0aWMgaW50ICgqYnBmX3BlcmZfZXZlbnRfb3V0cHV0KSh2b2lkICpjdHgsIHZvaWQgKm1hcCwgaW50IGluZGV4LCB2b2lkICpkYXRhLCBpbnQgc2l6ZSkgPQorc3RhdGljIGludCAoKmJwZl9wZXJmX2V2ZW50X291dHB1dCkodm9pZCAqY3R4LCB2b2lkICptYXAsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBmbGFncywgdm9pZCAqZGF0YSwKKwkJCQkgICAgaW50IHNpemUpID0KIAkodm9pZCAqKSBCUEZfRlVOQ19wZXJmX2V2ZW50X291dHB1dDsKIHN0YXRpYyBpbnQgKCpicGZfZ2V0X3N0YWNraWQpKHZvaWQgKmN0eCwgdm9pZCAqbWFwLCBpbnQgZmxhZ3MpID0KIAkodm9pZCAqKSBCUEZfRlVOQ19nZXRfc3RhY2tpZDsKIHN0YXRpYyBpbnQgKCpicGZfcHJvYmVfd3JpdGVfdXNlcikodm9pZCAqZHN0LCB2b2lkICpzcmMsIGludCBzaXplKSA9CiAJKHZvaWQgKikgQlBGX0ZVTkNfcHJvYmVfd3JpdGVfdXNlcjsKK3N0YXRpYyBpbnQgKCpicGZfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cCkodm9pZCAqbWFwLCBpbnQgaW5kZXgpID0KKwkodm9pZCAqKSBCUEZfRlVOQ19jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwOworc3RhdGljIGludCAoKmJwZl9za2JfZ2V0X3R1bm5lbF9rZXkpKHZvaWQgKmN0eCwgdm9pZCAqa2V5LCBpbnQgc2l6ZSwgaW50IGZsYWdzKSA9CisJKHZvaWQgKikgQlBGX0ZVTkNfc2tiX2dldF90dW5uZWxfa2V5Oworc3RhdGljIGludCAoKmJwZl9za2Jfc2V0X3R1bm5lbF9rZXkpKHZvaWQgKmN0eCwgdm9pZCAqa2V5LCBpbnQgc2l6ZSwgaW50IGZsYWdzKSA9CisJKHZvaWQgKikgQlBGX0ZVTkNfc2tiX3NldF90dW5uZWxfa2V5Oworc3RhdGljIGludCAoKmJwZl9za2JfZ2V0X3R1bm5lbF9vcHQpKHZvaWQgKmN0eCwgdm9pZCAqbWQsIGludCBzaXplKSA9CisJKHZvaWQgKikgQlBGX0ZVTkNfc2tiX2dldF90dW5uZWxfb3B0Oworc3RhdGljIGludCAoKmJwZl9za2Jfc2V0X3R1bm5lbF9vcHQpKHZvaWQgKmN0eCwgdm9pZCAqbWQsIGludCBzaXplKSA9CisJKHZvaWQgKikgQlBGX0ZVTkNfc2tiX3NldF90dW5uZWxfb3B0Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyAoKmJwZl9nZXRfcHJhbmRvbV91MzIpKHZvaWQpID0KKwkodm9pZCAqKSBCUEZfRlVOQ19nZXRfcHJhbmRvbV91MzI7CiAKIC8qIGxsdm0gYnVpbHRpbiBmdW5jdGlvbnMgdGhhdCBlQlBGIEMgcHJvZ3JhbSBtYXkgdXNlIHRvCiAgKiBlbWl0IEJQRl9MRF9BQlMgYW5kIEJQRl9MRF9JTkQgaW5zdHJ1Y3Rpb25zCkBAIC03Miw4ICs4Niw4IEBACiAJKHZvaWQgKikgQlBGX0ZVTkNfbDNfY3N1bV9yZXBsYWNlOwogc3RhdGljIGludCAoKmJwZl9sNF9jc3VtX3JlcGxhY2UpKHZvaWQgKmN0eCwgaW50IG9mZiwgaW50IGZyb20sIGludCB0bywgaW50IGZsYWdzKSA9CiAJKHZvaWQgKikgQlBGX0ZVTkNfbDRfY3N1bV9yZXBsYWNlOwotc3RhdGljIGludCAoKmJwZl9za2JfaW5fY2dyb3VwKSh2b2lkICpjdHgsIHZvaWQgKm1hcCwgaW50IGluZGV4KSA9Ci0JKHZvaWQgKikgQlBGX0ZVTkNfc2tiX2luX2Nncm91cDsKK3N0YXRpYyBpbnQgKCpicGZfc2tiX3VuZGVyX2Nncm91cCkodm9pZCAqY3R4LCB2b2lkICptYXAsIGludCBpbmRleCkgPQorCSh2b2lkICopIEJQRl9GVU5DX3NrYl91bmRlcl9jZ3JvdXA7CiAKICNpZiBkZWZpbmVkKF9feDg2XzY0X18pCiAKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL2JwZl9sb2FkLmMgYi9zYW1wbGVzL2JwZi9icGZfbG9hZC5jCmluZGV4IDBjZmRhMjMuLjk3OTEzZTEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL2JwZl9sb2FkLmMKKysrIGIvc2FtcGxlcy9icGYvYnBmX2xvYWQuYwpAQCAtNTEsNiArNTEsNyBAQAogCWJvb2wgaXNfa3JldHByb2JlID0gc3RybmNtcChldmVudCwgImtyZXRwcm9iZS8iLCAxMCkgPT0gMDsKIAlib29sIGlzX3RyYWNlcG9pbnQgPSBzdHJuY21wKGV2ZW50LCAidHJhY2Vwb2ludC8iLCAxMSkgPT0gMDsKIAlib29sIGlzX3hkcCA9IHN0cm5jbXAoZXZlbnQsICJ4ZHAiLCAzKSA9PSAwOworCWJvb2wgaXNfcGVyZl9ldmVudCA9IHN0cm5jbXAoZXZlbnQsICJwZXJmX2V2ZW50IiwgMTApID09IDA7CiAJZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZTsKIAljaGFyIGJ1ZlsyNTZdOwogCWludCBmZCwgZWZkLCBlcnIsIGlkOwpAQCAtNjksNiArNzAsOCBAQAogCQlwcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1RSQUNFUE9JTlQ7CiAJfSBlbHNlIGlmIChpc194ZHApIHsKIAkJcHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9YRFA7CisJfSBlbHNlIGlmIChpc19wZXJmX2V2ZW50KSB7CisJCXByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfUEVSRl9FVkVOVDsKIAl9IGVsc2UgewogCQlwcmludGYoIlVua25vd24gZXZlbnQgJyVzJ1xuIiwgZXZlbnQpOwogCQlyZXR1cm4gLTE7CkBAIC04Miw3ICs4NSw3IEBACiAKIAlwcm9nX2ZkW3Byb2dfY250KytdID0gZmQ7CiAKLQlpZiAoaXNfeGRwKQorCWlmIChpc194ZHAgfHwgaXNfcGVyZl9ldmVudCkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoaXNfc29ja2V0KSB7CkBAIC0zMjYsNiArMzI5LDcgQEAKIAkJCSAgICBtZW1jbXAoc2huYW1lX3Byb2csICJrcmV0cHJvYmUvIiwgMTApID09IDAgfHwKIAkJCSAgICBtZW1jbXAoc2huYW1lX3Byb2csICJ0cmFjZXBvaW50LyIsIDExKSA9PSAwIHx8CiAJCQkgICAgbWVtY21wKHNobmFtZV9wcm9nLCAieGRwIiwgMykgPT0gMCB8fAorCQkJICAgIG1lbWNtcChzaG5hbWVfcHJvZywgInBlcmZfZXZlbnQiLCAxMCkgPT0gMCB8fAogCQkJICAgIG1lbWNtcChzaG5hbWVfcHJvZywgInNvY2tldCIsIDYpID09IDApCiAJCQkJbG9hZF9hbmRfYXR0YWNoKHNobmFtZV9wcm9nLCBpbnNucywgZGF0YV9wcm9nLT5kX3NpemUpOwogCQl9CkBAIC0zNDQsNiArMzQ4LDcgQEAKIAkJICAgIG1lbWNtcChzaG5hbWUsICJrcmV0cHJvYmUvIiwgMTApID09IDAgfHwKIAkJICAgIG1lbWNtcChzaG5hbWUsICJ0cmFjZXBvaW50LyIsIDExKSA9PSAwIHx8CiAJCSAgICBtZW1jbXAoc2huYW1lLCAieGRwIiwgMykgPT0gMCB8fAorCQkgICAgbWVtY21wKHNobmFtZSwgInBlcmZfZXZlbnQiLCAxMCkgPT0gMCB8fAogCQkgICAgbWVtY21wKHNobmFtZSwgInNvY2tldCIsIDYpID09IDApCiAJCQlsb2FkX2FuZF9hdHRhY2goc2huYW1lLCBkYXRhLT5kX2J1ZiwgZGF0YS0+ZF9zaXplKTsKIAl9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9saWJicGYuaCBiL3NhbXBsZXMvYnBmL2xpYmJwZi5oCmluZGV4IDM2NDU4MmIuLmFjNmVkYjYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL2xpYmJwZi5oCisrKyBiL3NhbXBsZXMvYnBmL2xpYmJwZi5oCkBAIC04NSw2ICs4NSwxNCBAQAogCQkub2ZmICAgPSAwLAkJCQkJXAogCQkuaW1tICAgPSBJTU0gfSkKIAorI2RlZmluZSBCUEZfTU9WMzJfSU1NKERTVCwgSU1NKQkJCQkJXAorCSgoc3RydWN0IGJwZl9pbnNuKSB7CQkJCQlcCisJCS5jb2RlICA9IEJQRl9BTFUgfCBCUEZfTU9WIHwgQlBGX0ssCQlcCisJCS5kc3RfcmVnID0gRFNULAkJCQkJXAorCQkuc3JjX3JlZyA9IDAsCQkJCQlcCisJCS5vZmYgICA9IDAsCQkJCQlcCisJCS5pbW0gICA9IElNTSB9KQorCiAvKiBCUEZfTERfSU1NNjQgbWFjcm8gZW5jb2RlcyBzaW5nbGUgJ2xvYWQgNjQtYml0IGltbWVkaWF0ZScgaW5zbiAqLwogI2RlZmluZSBCUEZfTERfSU1NNjQoRFNULCBJTU0pCQkJCQlcCiAJQlBGX0xEX0lNTTY0X1JBVyhEU1QsIDAsIElNTSkKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL3NhbXBsZWlwX2tlcm4uYyBiL3NhbXBsZXMvYnBmL3NhbXBsZWlwX2tlcm4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzRhNjgxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9icGYvc2FtcGxlaXBfa2Vybi5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIENvcHlyaWdodCAyMDE2IE5ldGZsaXgsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvYnBmLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9icGZfcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgImJwZl9oZWxwZXJzLmgiCisKKyNkZWZpbmUgTUFYX0lQUwkJODE5MgorCitzdHJ1Y3QgYnBmX21hcF9kZWYgU0VDKCJtYXBzIikgaXBfbWFwID0geworCS50eXBlID0gQlBGX01BUF9UWVBFX0hBU0gsCisJLmtleV9zaXplID0gc2l6ZW9mKHU2NCksCisJLnZhbHVlX3NpemUgPSBzaXplb2YodTMyKSwKKwkubWF4X2VudHJpZXMgPSBNQVhfSVBTLAorfTsKKworU0VDKCJwZXJmX2V2ZW50IikKK2ludCBkb19zYW1wbGUoc3RydWN0IGJwZl9wZXJmX2V2ZW50X2RhdGEgKmN0eCkKK3sKKwl1NjQgaXA7CisJdTMyICp2YWx1ZSwgaW5pdF92YWwgPSAxOworCisJaXAgPSBjdHgtPnJlZ3MuaXA7CisJdmFsdWUgPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZpcF9tYXAsICZpcCk7CisJaWYgKHZhbHVlKQorCQkqdmFsdWUgKz0gMTsKKwllbHNlCisJCS8qIEUyQklHIG5vdCB0ZXN0ZWQgZm9yIHRoaXMgZXhhbXBsZSBvbmx5ICovCisJCWJwZl9tYXBfdXBkYXRlX2VsZW0oJmlwX21hcCwgJmlwLCAmaW5pdF92YWwsIEJQRl9OT0VYSVNUKTsKKworCXJldHVybiAwOworfQorY2hhciBfbGljZW5zZVtdIFNFQygibGljZW5zZSIpID0gIkdQTCI7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9zYW1wbGVpcF91c2VyLmMgYi9zYW1wbGVzL2JwZi9zYW1wbGVpcF91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYwYTZiZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvYnBmL3NhbXBsZWlwX3VzZXIuYwpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIHNhbXBsZWlwOiBzYW1wbGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciBhbmQgZnJlcXVlbmN5IGNvdW50IGluIGEgQlBGIG1hcC4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBOZXRmbGl4LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlICJsaWJicGYuaCIKKyNpbmNsdWRlICJicGZfbG9hZC5oIgorCisjZGVmaW5lIERFRkFVTFRfRlJFUQk5OQorI2RlZmluZSBERUZBVUxUX1NFQ1MJNQorI2RlZmluZSBNQVhfSVBTCQk4MTkyCisjZGVmaW5lIFBBR0VfT0ZGU0VUCTB4ZmZmZjg4MDAwMDAwMDAwMAorCitzdGF0aWMgaW50IG5yX2NwdXM7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJcHJpbnRmKCJVU0FHRTogc2FtcGxlaXAgWy1GIGZyZXFdIFtkdXJhdGlvbl1cbiIpOworCXByaW50ZigiICAgICAgIC1GIGZyZXEgICAgIyBzYW1wbGUgZnJlcXVlbmN5IChIZXJ0eiksIGRlZmF1bHQgOTlcbiIpOworCXByaW50ZigiICAgICAgIGR1cmF0aW9uICAgIyBzYW1wbGluZyBkdXJhdGlvbiAoc2Vjb25kcyksIGRlZmF1bHQgNVxuIik7Cit9CisKK3N0YXRpYyBpbnQgc2FtcGxpbmdfc3RhcnQoaW50ICpwbXVfZmQsIGludCBmcmVxKQoreworCWludCBpOworCisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBwZV9zYW1wbGVfYXR0ciA9IHsKKwkJLnR5cGUgPSBQRVJGX1RZUEVfU09GVFdBUkUsCisJCS5mcmVxID0gMSwKKwkJLnNhbXBsZV9wZXJpb2QgPSBmcmVxLAorCQkuY29uZmlnID0gUEVSRl9DT1VOVF9TV19DUFVfQ0xPQ0ssCisJCS5pbmhlcml0ID0gMSwKKwl9OworCisJZm9yIChpID0gMDsgaSA8IG5yX2NwdXM7IGkrKykgeworCQlwbXVfZmRbaV0gPSBwZXJmX2V2ZW50X29wZW4oJnBlX3NhbXBsZV9hdHRyLCAtMSAvKiBwaWQgKi8sIGksCisJCQkJCSAgICAtMSAvKiBncm91cF9mZCAqLywgMCAvKiBmbGFncyAqLyk7CisJCWlmIChwbXVfZmRbaV0gPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBJbml0aWFsaXppbmcgcGVyZiBzYW1wbGluZ1xuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlhc3NlcnQoaW9jdGwocG11X2ZkW2ldLCBQRVJGX0VWRU5UX0lPQ19TRVRfQlBGLAorCQkJICAgICBwcm9nX2ZkWzBdKSA9PSAwKTsKKwkJYXNzZXJ0KGlvY3RsKHBtdV9mZFtpXSwgUEVSRl9FVkVOVF9JT0NfRU5BQkxFLCAwKSA9PSAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2FtcGxpbmdfZW5kKGludCAqcG11X2ZkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yX2NwdXM7IGkrKykKKwkJY2xvc2UocG11X2ZkW2ldKTsKK30KKworc3RydWN0IGlwY291bnQgeworCV9fdTY0IGlwOworCV9fdTMyIGNvdW50OworfTsKKworLyogdXNlZCBmb3Igc29ydGluZyAqLworc3RydWN0IGlwY291bnQgY291bnRzW01BWF9JUFNdOworCitzdGF0aWMgaW50IGNvdW50X2NtcChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCit7CisJcmV0dXJuICgoc3RydWN0IGlwY291bnQgKilwMSktPmNvdW50IC0gKChzdHJ1Y3QgaXBjb3VudCAqKXAyKS0+Y291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2lwX21hcChpbnQgZmQpCit7CisJc3RydWN0IGtzeW0gKnN5bTsKKwlfX3U2NCBrZXksIG5leHRfa2V5OworCV9fdTMyIHZhbHVlOworCWludCBpLCBtYXg7CisKKwlwcmludGYoIiUtMTlzICUtMzJzICVzXG4iLCAiQUREUiIsICJLU1lNIiwgIkNPVU5UIik7CisKKwkvKiBmZXRjaCBJUHMgYW5kIGNvdW50cyAqLworCWtleSA9IDAsIGkgPSAwOworCXdoaWxlIChicGZfZ2V0X25leHRfa2V5KGZkLCAma2V5LCAmbmV4dF9rZXkpID09IDApIHsKKwkJYnBmX2xvb2t1cF9lbGVtKGZkLCAmbmV4dF9rZXksICZ2YWx1ZSk7CisJCWNvdW50c1tpXS5pcCA9IG5leHRfa2V5OworCQljb3VudHNbaSsrXS5jb3VudCA9IHZhbHVlOworCQlrZXkgPSBuZXh0X2tleTsKKwl9CisJbWF4ID0gaTsKKworCS8qIHNvcnQgYW5kIHByaW50ICovCisJcXNvcnQoY291bnRzLCBtYXgsIHNpemVvZihzdHJ1Y3QgaXBjb3VudCksIGNvdW50X2NtcCk7CisJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCWlmIChjb3VudHNbaV0uaXAgPiBQQUdFX09GRlNFVCkgeworCQkJc3ltID0ga3N5bV9zZWFyY2goY291bnRzW2ldLmlwKTsKKwkJCXByaW50ZigiMHglLTE3bGx4ICUtMzJzICV1XG4iLCBjb3VudHNbaV0uaXAsIHN5bS0+bmFtZSwKKwkJCSAgICAgICBjb3VudHNbaV0uY291bnQpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIweCUtMTdsbHggJS0zMnMgJXVcbiIsIGNvdW50c1tpXS5pcCwgIih1c2VyKSIsCisJCQkgICAgICAgY291bnRzW2ldLmNvdW50KTsKKwkJfQorCX0KKworCWlmIChtYXggPT0gTUFYX0lQUykgeworCQlwcmludGYoIldBUk5JTkc6IElQIGhhc2ggd2FzIGZ1bGwgKG1heCAlZCBlbnRyaWVzKTsgIiwgbWF4KTsKKwkJcHJpbnRmKCJtYXkgaGF2ZSBkcm9wcGVkIHNhbXBsZXNcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgaW50X2V4aXQoaW50IHNpZykKK3sKKwlwcmludGYoIlxuIik7CisJcHJpbnRfaXBfbWFwKG1hcF9mZFswXSk7CisJZXhpdCgwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgZmlsZW5hbWVbMjU2XTsKKwlpbnQgKnBtdV9mZCwgb3B0LCBmcmVxID0gREVGQVVMVF9GUkVRLCBzZWNzID0gREVGQVVMVF9TRUNTOworCisJLyogcHJvY2VzcyBhcmd1bWVudHMgKi8KKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiRjpoIikpICE9IC0xKSB7CisJCXN3aXRjaCAob3B0KSB7CisJCWNhc2UgJ0YnOgorCQkJZnJlcSA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoYXJnYyAtIG9wdGluZCA9PSAxKQorCQlzZWNzID0gYXRvaShhcmd2W29wdGluZF0pOworCWlmIChmcmVxID09IDAgfHwgc2VjcyA9PSAwKSB7CisJCXVzYWdlKCk7CisJCXJldHVybiAxOworCX0KKworCS8qIGluaXRpYWxpemUga2VybmVsIHN5bWJvbCB0cmFuc2xhdGlvbiAqLworCWlmIChsb2FkX2thbGxzeW1zKCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogbG9hZGluZyAvcHJvYy9rYWxsc3ltc1xuIik7CisJCXJldHVybiAyOworCX0KKworCS8qIGNyZWF0ZSBwZXJmIEZEcyBmb3IgZWFjaCBDUFUgKi8KKwlucl9jcHVzID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfQ09ORik7CisJcG11X2ZkID0gbWFsbG9jKG5yX2NwdXMgKiBzaXplb2YoaW50KSk7CisJaWYgKHBtdV9mZCA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IG1hbGxvYyBvZiBwbXVfZmRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBsb2FkIEJQRiBwcm9ncmFtICovCisJc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlc19rZXJuLm8iLCBhcmd2WzBdKTsKKwlpZiAobG9hZF9icGZfZmlsZShmaWxlbmFtZSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogbG9hZGluZyBCUEYgcHJvZ3JhbSAoZXJybm8gJWQpOlxuIiwKKwkJCWVycm5vKTsKKwkJaWYgKHN0cmNtcChicGZfbG9nX2J1ZiwgIiIpID09IDApCisJCQlmcHJpbnRmKHN0ZGVyciwgIlRyeTogdWxpbWl0IC1sIHVubGltaXRlZFxuIik7CisJCWVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBicGZfbG9nX2J1Zik7CisJCXJldHVybiAxOworCX0KKwlzaWduYWwoU0lHSU5ULCBpbnRfZXhpdCk7CisKKwkvKiBkbyBzYW1wbGluZyAqLworCXByaW50ZigiU2FtcGxpbmcgYXQgJWQgSGVydHogZm9yICVkIHNlY29uZHMuIEN0cmwtQyBhbHNvIGVuZHMuXG4iLAorCSAgICAgICBmcmVxLCBzZWNzKTsKKwlpZiAoc2FtcGxpbmdfc3RhcnQocG11X2ZkLCBmcmVxKSAhPSAwKQorCQlyZXR1cm4gMTsKKwlzbGVlcChzZWNzKTsKKwlzYW1wbGluZ19lbmQocG11X2ZkKTsKKwlmcmVlKHBtdV9mZCk7CisKKwkvKiBvdXRwdXQgc2FtcGxlIGNvdW50cyAqLworCXByaW50X2lwX21hcChtYXBfZmRbMF0pOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9zb2NrZXgyX2tlcm4uYyBiL3NhbXBsZXMvYnBmL3NvY2tleDJfa2Vybi5jCmluZGV4IGJhMGUxNzcuLjQ0ZTU4NDYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL3NvY2tleDJfa2Vybi5jCisrKyBiL3NhbXBsZXMvYnBmL3NvY2tleDJfa2Vybi5jCkBAIC0xNCw3ICsxNCw3IEBACiAJX19iZTE2IGhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG87CiB9OwogCi1zdHJ1Y3QgZmxvd19rZXlzIHsKK3N0cnVjdCBicGZfZmxvd19rZXlzIHsKIAlfX2JlMzIgc3JjOwogCV9fYmUzMiBkc3Q7CiAJdW5pb24gewpAQCAtNTksNyArNTksNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIF9fdTY0IHBhcnNlX2lwKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYiwgX191NjQgbmhvZmYsIF9fdTY0ICppcF9wcm90bywKLQkJCSAgICAgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKKwkJCSAgICAgc3RydWN0IGJwZl9mbG93X2tleXMgKmZsb3cpCiB7CiAJX191NjQgdmVybGVuOwogCkBAIC04Myw3ICs4Myw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgX191NjQgcGFyc2VfaXB2NihzdHJ1Y3QgX19za19idWZmICpza2IsIF9fdTY0IG5ob2ZmLCBfX3U2NCAqaXBfcHJvdG8sCi0JCQkgICAgICAgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKKwkJCSAgICAgICBzdHJ1Y3QgYnBmX2Zsb3dfa2V5cyAqZmxvdykKIHsKIAkqaXBfcHJvdG8gPSBsb2FkX2J5dGUoc2tiLAogCQkJICAgICAgbmhvZmYgKyBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgbmV4dGhkcikpOwpAQCAtOTYsNyArOTYsNyBAQAogCXJldHVybiBuaG9mZjsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGZsb3dfZGlzc2VjdG9yKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKK3N0YXRpYyBpbmxpbmUgYm9vbCBmbG93X2Rpc3NlY3RvcihzdHJ1Y3QgX19za19idWZmICpza2IsIHN0cnVjdCBicGZfZmxvd19rZXlzICpmbG93KQogewogCV9fdTY0IG5ob2ZmID0gRVRIX0hMRU47CiAJX191NjQgaXBfcHJvdG87CkBAIC0xOTgsNyArMTk4LDcgQEAKIFNFQygic29ja2V0MiIpCiBpbnQgYnBmX3Byb2cyKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgZmxvd19rZXlzIGZsb3c7CisJc3RydWN0IGJwZl9mbG93X2tleXMgZmxvdzsKIAlzdHJ1Y3QgcGFpciAqdmFsdWU7CiAJdTMyIGtleTsKIApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvc29ja2V4M19rZXJuLmMgYi9zYW1wbGVzL2JwZi9zb2NrZXgzX2tlcm4uYwppbmRleCA0MWFlMmZkLi45NTkwN2Y4IDEwMDY0NAotLS0gYS9zYW1wbGVzL2JwZi9zb2NrZXgzX2tlcm4uYworKysgYi9zYW1wbGVzL2JwZi9zb2NrZXgzX2tlcm4uYwpAQCAtNjEsNyArNjEsNyBAQAogCV9fYmUxNiBoX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvOwogfTsKIAotc3RydWN0IGZsb3dfa2V5cyB7CitzdHJ1Y3QgYnBmX2Zsb3dfa2V5cyB7CiAJX19iZTMyIHNyYzsKIAlfX2JlMzIgZHN0OwogCXVuaW9uIHsKQEAgLTg4LDcgKzg4LDcgQEAKIH0KIAogc3RydWN0IGdsb2JhbHMgewotCXN0cnVjdCBmbG93X2tleXMgZmxvdzsKKwlzdHJ1Y3QgYnBmX2Zsb3dfa2V5cyBmbG93OwogfTsKIAogc3RydWN0IGJwZl9tYXBfZGVmIFNFQygibWFwcyIpIHBlcmNwdV9tYXAgPSB7CkBAIC0xMTQsMTQgKzExNCwxNCBAQAogCiBzdHJ1Y3QgYnBmX21hcF9kZWYgU0VDKCJtYXBzIikgaGFzaF9tYXAgPSB7CiAJLnR5cGUgPSBCUEZfTUFQX1RZUEVfSEFTSCwKLQkua2V5X3NpemUgPSBzaXplb2Yoc3RydWN0IGZsb3dfa2V5cyksCisJLmtleV9zaXplID0gc2l6ZW9mKHN0cnVjdCBicGZfZmxvd19rZXlzKSwKIAkudmFsdWVfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcGFpciksCiAJLm1heF9lbnRyaWVzID0gMTAyNCwKIH07CiAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhzdHJ1Y3QgX19za19idWZmICpza2IsIHN0cnVjdCBnbG9iYWxzICpnKQogewotCXN0cnVjdCBmbG93X2tleXMga2V5ID0gZy0+ZmxvdzsKKwlzdHJ1Y3QgYnBmX2Zsb3dfa2V5cyBrZXkgPSBnLT5mbG93OwogCXN0cnVjdCBwYWlyICp2YWx1ZTsKIAogCXZhbHVlID0gYnBmX21hcF9sb29rdXBfZWxlbSgmaGFzaF9tYXAsICZrZXkpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvc29ja2V4M191c2VyLmMgYi9zYW1wbGVzL2JwZi9zb2NrZXgzX3VzZXIuYwppbmRleCBkNDE4NGFiLi4zZmNmZDhjIDEwMDY0NAotLS0gYS9zYW1wbGVzL2JwZi9zb2NrZXgzX3VzZXIuYworKysgYi9zYW1wbGVzL2JwZi9zb2NrZXgzX3VzZXIuYwpAQCAtNyw3ICs3LDcgQEAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KIAotc3RydWN0IGZsb3dfa2V5cyB7CitzdHJ1Y3QgYnBmX2Zsb3dfa2V5cyB7CiAJX19iZTMyIHNyYzsKIAlfX2JlMzIgZHN0OwogCXVuaW9uIHsKQEAgLTQ5LDcgKzQ5LDcgQEAKIAkodm9pZCkgZjsKIAogCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJc3RydWN0IGZsb3dfa2V5cyBrZXkgPSB7fSwgbmV4dF9rZXk7CisJCXN0cnVjdCBicGZfZmxvd19rZXlzIGtleSA9IHt9LCBuZXh0X2tleTsKIAkJc3RydWN0IHBhaXIgdmFsdWU7CiAKIAkJc2xlZXAoMSk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90Y2JwZjJfa2Vybi5jIGIvc2FtcGxlcy9icGYvdGNicGYyX2tlcm4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzAzYmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9icGYvdGNicGYyX2tlcm4uYwpAQCAtMCwwICsxLDM4MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2IFZNd2FyZQorICogQ29weXJpZ2h0IChjKSAyMDE2IEZhY2Vib29rCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPHVhcGkvbGludXgvYnBmLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvaWZfcGFja2V0Lmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9pcC5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvaW4uaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3RjcC5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvZmlsdGVyLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9wa3RfY2xzLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlICJicGZfaGVscGVycy5oIgorCisjZGVmaW5lIF9odG9ubCBfX2J1aWx0aW5fYnN3YXAzMgorI2RlZmluZSBFUlJPUihyZXQpIGRvIHtcCisJCWNoYXIgZm10W10gPSAiRVJST1IgbGluZTolZCByZXQ6JWRcbiI7XAorCQlicGZfdHJhY2VfcHJpbnRrKGZtdCwgc2l6ZW9mKGZtdCksIF9fTElORV9fLCByZXQpOyBcCisJfSB3aGlsZSgwKQorCitzdHJ1Y3QgZ2VuZXZlX29wdCB7CisJX19iZTE2CW9wdF9jbGFzczsKKwl1OAl0eXBlOworCXU4CWxlbmd0aDo1OworCXU4CXIzOjE7CisJdTgJcjI6MTsKKwl1OAlyMToxOworCXU4CW9wdF9kYXRhWzhdOyAvKiBoYXJkLWNvZGVkIHRvIDggYnl0ZSAqLworfTsKKworc3RydWN0IHZ4bGFuX21ldGFkYXRhIHsKKwl1MzIgICAgIGdicDsKK307CisKK1NFQygiZ3JlX3NldF90dW5uZWwiKQoraW50IF9ncmVfc2V0X3R1bm5lbChzdHJ1Y3QgX19za19idWZmICpza2IpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkga2V5OworCisJX19idWlsdGluX21lbXNldCgma2V5LCAweDAsIHNpemVvZihrZXkpKTsKKwlrZXkucmVtb3RlX2lwdjQgPSAweGFjMTAwMTY0OyAvKiAxNzIuMTYuMS4xMDAgKi8KKwlrZXkudHVubmVsX2lkID0gMjsKKwlrZXkudHVubmVsX3RvcyA9IDA7CisJa2V5LnR1bm5lbF90dGwgPSA2NDsKKworCXJldCA9IGJwZl9za2Jfc2V0X3R1bm5lbF9rZXkoc2tiLCAma2V5LCBzaXplb2Yoa2V5KSwgQlBGX0ZfWkVST19DU1VNX1RYKTsKKwlpZiAocmV0IDwgMCkgeworCQlFUlJPUihyZXQpOworCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJfQorCisJcmV0dXJuIFRDX0FDVF9PSzsKK30KKworU0VDKCJncmVfZ2V0X3R1bm5lbCIpCitpbnQgX2dyZV9nZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBicGZfdHVubmVsX2tleSBrZXk7CisJY2hhciBmbXRbXSA9ICJrZXkgJWQgcmVtb3RlIGlwIDB4JXhcbiI7CisKKwlyZXQgPSBicGZfc2tiX2dldF90dW5uZWxfa2V5KHNrYiwgJmtleSwgc2l6ZW9mKGtleSksIDApOworCWlmIChyZXQgPCAwKSB7CisJCUVSUk9SKHJldCk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlicGZfdHJhY2VfcHJpbnRrKGZtdCwgc2l6ZW9mKGZtdCksIGtleS50dW5uZWxfaWQsIGtleS5yZW1vdGVfaXB2NCk7CisJcmV0dXJuIFRDX0FDVF9PSzsKK30KKworU0VDKCJ2eGxhbl9zZXRfdHVubmVsIikKK2ludCBfdnhsYW5fc2V0X3R1bm5lbChzdHJ1Y3QgX19za19idWZmICpza2IpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkga2V5OworCXN0cnVjdCB2eGxhbl9tZXRhZGF0YSBtZDsKKworCV9fYnVpbHRpbl9tZW1zZXQoJmtleSwgMHgwLCBzaXplb2Yoa2V5KSk7CisJa2V5LnJlbW90ZV9pcHY0ID0gMHhhYzEwMDE2NDsgLyogMTcyLjE2LjEuMTAwICovCisJa2V5LnR1bm5lbF9pZCA9IDI7CisJa2V5LnR1bm5lbF90b3MgPSAwOworCWtleS50dW5uZWxfdHRsID0gNjQ7CisKKwlyZXQgPSBicGZfc2tiX3NldF90dW5uZWxfa2V5KHNrYiwgJmtleSwgc2l6ZW9mKGtleSksIEJQRl9GX1pFUk9fQ1NVTV9UWCk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCW1kLmdicCA9IDB4ODAwRkY7IC8qIFNldCBWWExBTiBHcm91cCBQb2xpY3kgZXh0ZW5zaW9uICovCisJcmV0ID0gYnBmX3NrYl9zZXRfdHVubmVsX29wdChza2IsICZtZCwgc2l6ZW9mKG1kKSk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCXJldHVybiBUQ19BQ1RfT0s7Cit9CisKK1NFQygidnhsYW5fZ2V0X3R1bm5lbCIpCitpbnQgX3Z4bGFuX2dldF90dW5uZWwoc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCWludCByZXQ7CisJc3RydWN0IGJwZl90dW5uZWxfa2V5IGtleTsKKwlzdHJ1Y3QgdnhsYW5fbWV0YWRhdGEgbWQ7CisJY2hhciBmbXRbXSA9ICJrZXkgJWQgcmVtb3RlIGlwIDB4JXggdnhsYW4gZ2JwIDB4JXhcbiI7CisKKwlyZXQgPSBicGZfc2tiX2dldF90dW5uZWxfa2V5KHNrYiwgJmtleSwgc2l6ZW9mKGtleSksIDApOworCWlmIChyZXQgPCAwKSB7CisJCUVSUk9SKHJldCk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlyZXQgPSBicGZfc2tiX2dldF90dW5uZWxfb3B0KHNrYiwgJm1kLCBzaXplb2YobWQpKTsKKwlpZiAocmV0IDwgMCkgeworCQlFUlJPUihyZXQpOworCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJfQorCisJYnBmX3RyYWNlX3ByaW50ayhmbXQsIHNpemVvZihmbXQpLAorCQkJa2V5LnR1bm5lbF9pZCwga2V5LnJlbW90ZV9pcHY0LCBtZC5nYnApOworCisJcmV0dXJuIFRDX0FDVF9PSzsKK30KKworU0VDKCJnZW5ldmVfc2V0X3R1bm5lbCIpCitpbnQgX2dlbmV2ZV9zZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0LCByZXQyOworCXN0cnVjdCBicGZfdHVubmVsX2tleSBrZXk7CisJc3RydWN0IGdlbmV2ZV9vcHQgZ29wdDsKKworCV9fYnVpbHRpbl9tZW1zZXQoJmtleSwgMHgwLCBzaXplb2Yoa2V5KSk7CisJa2V5LnJlbW90ZV9pcHY0ID0gMHhhYzEwMDE2NDsgLyogMTcyLjE2LjEuMTAwICovCisJa2V5LnR1bm5lbF9pZCA9IDI7CisJa2V5LnR1bm5lbF90b3MgPSAwOworCWtleS50dW5uZWxfdHRsID0gNjQ7CisKKwlfX2J1aWx0aW5fbWVtc2V0KCZnb3B0LCAweDAsIHNpemVvZihnb3B0KSk7CisJZ29wdC5vcHRfY2xhc3MgPSAweDEwMjsgLyogT3BlbiBWaXJ0dWFsIE5ldHdvcmtpbmcgKE9WTikgKi8KKwlnb3B0LnR5cGUgPSAweDA4OworCWdvcHQucjEgPSAxOworCWdvcHQucjIgPSAwOworCWdvcHQucjMgPSAxOworCWdvcHQubGVuZ3RoID0gMjsgLyogNC1ieXRlIG11bHRpcGxlICovCisJKihpbnQgKikgJmdvcHQub3B0X2RhdGEgPSAweGRlYWRiZWVmOworCisJcmV0ID0gYnBmX3NrYl9zZXRfdHVubmVsX2tleShza2IsICZrZXksIHNpemVvZihrZXkpLCBCUEZfRl9aRVJPX0NTVU1fVFgpOworCWlmIChyZXQgPCAwKSB7CisJCUVSUk9SKHJldCk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlyZXQgPSBicGZfc2tiX3NldF90dW5uZWxfb3B0KHNrYiwgJmdvcHQsIHNpemVvZihnb3B0KSk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCXJldHVybiBUQ19BQ1RfT0s7Cit9CisKK1NFQygiZ2VuZXZlX2dldF90dW5uZWwiKQoraW50IF9nZW5ldmVfZ2V0X3R1bm5lbChzdHJ1Y3QgX19za19idWZmICpza2IpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkga2V5OworCXN0cnVjdCBnZW5ldmVfb3B0IGdvcHQ7CisJY2hhciBmbXRbXSA9ICJrZXkgJWQgcmVtb3RlIGlwIDB4JXggZ2VuZXZlIGNsYXNzIDB4JXhcbiI7CisKKwlyZXQgPSBicGZfc2tiX2dldF90dW5uZWxfa2V5KHNrYiwgJmtleSwgc2l6ZW9mKGtleSksIDApOworCWlmIChyZXQgPCAwKSB7CisJCUVSUk9SKHJldCk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlyZXQgPSBicGZfc2tiX2dldF90dW5uZWxfb3B0KHNrYiwgJmdvcHQsIHNpemVvZihnb3B0KSk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCWJwZl90cmFjZV9wcmludGsoZm10LCBzaXplb2YoZm10KSwKKwkJCWtleS50dW5uZWxfaWQsIGtleS5yZW1vdGVfaXB2NCwgZ29wdC5vcHRfY2xhc3MpOworCXJldHVybiBUQ19BQ1RfT0s7Cit9CisKK1NFQygiaXBpcF9zZXRfdHVubmVsIikKK2ludCBfaXBpcF9zZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkga2V5ID0ge307CisJdm9pZCAqZGF0YSA9ICh2b2lkICopKGxvbmcpc2tiLT5kYXRhOworCXN0cnVjdCBpcGhkciAqaXBoID0gZGF0YTsKKwlzdHJ1Y3QgdGNwaGRyICp0Y3AgPSBkYXRhICsgc2l6ZW9mKCppcGgpOworCXZvaWQgKmRhdGFfZW5kID0gKHZvaWQgKikobG9uZylza2ItPmRhdGFfZW5kOworCWludCByZXQ7CisKKwkvKiBzaW5nbGUgbGVuZ3RoIGNoZWNrICovCisJaWYgKGRhdGEgKyBzaXplb2YoKmlwaCkgKyBzaXplb2YoKnRjcCkgPiBkYXRhX2VuZCkgeworCQlFUlJPUigxKTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCWtleS50dW5uZWxfdHRsID0gNjQ7CisJaWYgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QKSB7CisJCWtleS5yZW1vdGVfaXB2NCA9IDB4YWMxMDAxNjQ7IC8qIDE3Mi4xNi4xLjEwMCAqLworCX0gZWxzZSB7CisJCWlmIChpcGgtPnByb3RvY29sICE9IElQUFJPVE9fVENQIHx8IGlwaC0+aWhsICE9IDUpCisJCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisKKwkJaWYgKHRjcC0+ZGVzdCA9PSBodG9ucyg1MjAwKSkKKwkJCWtleS5yZW1vdGVfaXB2NCA9IDB4YWMxMDAxNjQ7IC8qIDE3Mi4xNi4xLjEwMCAqLworCQllbHNlIGlmICh0Y3AtPmRlc3QgPT0gaHRvbnMoNTIwMSkpCisJCQlrZXkucmVtb3RlX2lwdjQgPSAweGFjMTAwMTY1OyAvKiAxNzIuMTYuMS4xMDEgKi8KKwkJZWxzZQorCQkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCXJldCA9IGJwZl9za2Jfc2V0X3R1bm5lbF9rZXkoc2tiLCAma2V5LCBzaXplb2Yoa2V5KSwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCXJldHVybiBUQ19BQ1RfT0s7Cit9CisKK1NFQygiaXBpcF9nZXRfdHVubmVsIikKK2ludCBfaXBpcF9nZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBicGZfdHVubmVsX2tleSBrZXk7CisJY2hhciBmbXRbXSA9ICJyZW1vdGUgaXAgMHgleFxuIjsKKworCXJldCA9IGJwZl9za2JfZ2V0X3R1bm5lbF9rZXkoc2tiLCAma2V5LCBzaXplb2Yoa2V5KSwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCWJwZl90cmFjZV9wcmludGsoZm10LCBzaXplb2YoZm10KSwga2V5LnJlbW90ZV9pcHY0KTsKKwlyZXR1cm4gVENfQUNUX09LOworfQorCitTRUMoImlwaXA2X3NldF90dW5uZWwiKQoraW50IF9pcGlwNl9zZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkga2V5ID0ge307CisJdm9pZCAqZGF0YSA9ICh2b2lkICopKGxvbmcpc2tiLT5kYXRhOworCXN0cnVjdCBpcGhkciAqaXBoID0gZGF0YTsKKwlzdHJ1Y3QgdGNwaGRyICp0Y3AgPSBkYXRhICsgc2l6ZW9mKCppcGgpOworCXZvaWQgKmRhdGFfZW5kID0gKHZvaWQgKikobG9uZylza2ItPmRhdGFfZW5kOworCWludCByZXQ7CisKKwkvKiBzaW5nbGUgbGVuZ3RoIGNoZWNrICovCisJaWYgKGRhdGEgKyBzaXplb2YoKmlwaCkgKyBzaXplb2YoKnRjcCkgPiBkYXRhX2VuZCkgeworCQlFUlJPUigxKTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCWtleS5yZW1vdGVfaXB2NlswXSA9IF9odG9ubCgweDI0MDFkYjAwKTsKKwlrZXkudHVubmVsX3R0bCA9IDY0OworCisJaWYgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QKSB7CisJCWtleS5yZW1vdGVfaXB2NlszXSA9IF9odG9ubCgxKTsKKwl9IGVsc2UgeworCQlpZiAoaXBoLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCB8fCBpcGgtPmlobCAhPSA1KSB7CisJCQlFUlJPUihpcGgtPnByb3RvY29sKTsKKwkJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwkJfQorCisJCWlmICh0Y3AtPmRlc3QgPT0gaHRvbnMoNTIwMCkpIHsKKwkJCWtleS5yZW1vdGVfaXB2NlszXSA9IF9odG9ubCgxKTsKKwkJfSBlbHNlIGlmICh0Y3AtPmRlc3QgPT0gaHRvbnMoNTIwMSkpIHsKKwkJCWtleS5yZW1vdGVfaXB2NlszXSA9IF9odG9ubCgyKTsKKwkJfSBlbHNlIHsKKwkJCUVSUk9SKHRjcC0+ZGVzdCk7CisJCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJCX0KKwl9CisKKwlyZXQgPSBicGZfc2tiX3NldF90dW5uZWxfa2V5KHNrYiwgJmtleSwgc2l6ZW9mKGtleSksIEJQRl9GX1RVTklORk9fSVBWNik7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCXJldHVybiBUQ19BQ1RfT0s7Cit9CisKK1NFQygiaXBpcDZfZ2V0X3R1bm5lbCIpCitpbnQgX2lwaXA2X2dldF90dW5uZWwoc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCWludCByZXQ7CisJc3RydWN0IGJwZl90dW5uZWxfa2V5IGtleTsKKwljaGFyIGZtdFtdID0gInJlbW90ZSBpcDYgJXg6OiV4XG4iOworCisJcmV0ID0gYnBmX3NrYl9nZXRfdHVubmVsX2tleShza2IsICZrZXksIHNpemVvZihrZXkpLCBCUEZfRl9UVU5JTkZPX0lQVjYpOworCWlmIChyZXQgPCAwKSB7CisJCUVSUk9SKHJldCk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlicGZfdHJhY2VfcHJpbnRrKGZtdCwgc2l6ZW9mKGZtdCksIF9odG9ubChrZXkucmVtb3RlX2lwdjZbMF0pLAorCQkJIF9odG9ubChrZXkucmVtb3RlX2lwdjZbM10pKTsKKwlyZXR1cm4gVENfQUNUX09LOworfQorCitTRUMoImlwNmlwNl9zZXRfdHVubmVsIikKK2ludCBfaXA2aXA2X3NldF90dW5uZWwoc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBicGZfdHVubmVsX2tleSBrZXkgPSB7fTsKKwl2b2lkICpkYXRhID0gKHZvaWQgKikobG9uZylza2ItPmRhdGE7CisJc3RydWN0IGlwdjZoZHIgKmlwaCA9IGRhdGE7CisJc3RydWN0IHRjcGhkciAqdGNwID0gZGF0YSArIHNpemVvZigqaXBoKTsKKwl2b2lkICpkYXRhX2VuZCA9ICh2b2lkICopKGxvbmcpc2tiLT5kYXRhX2VuZDsKKwlpbnQgcmV0OworCisJLyogc2luZ2xlIGxlbmd0aCBjaGVjayAqLworCWlmIChkYXRhICsgc2l6ZW9mKCppcGgpICsgc2l6ZW9mKCp0Y3ApID4gZGF0YV9lbmQpIHsKKwkJRVJST1IoMSk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlrZXkucmVtb3RlX2lwdjZbMF0gPSBfaHRvbmwoMHgyNDAxZGIwMCk7CisJa2V5LnR1bm5lbF90dGwgPSA2NDsKKworCWlmIChpcGgtPm5leHRoZHIgPT0gTkVYVEhEUl9JQ01QKSB7CisJCWtleS5yZW1vdGVfaXB2NlszXSA9IF9odG9ubCgxKTsKKwl9IGVsc2UgeworCQlpZiAoaXBoLT5uZXh0aGRyICE9IE5FWFRIRFJfVENQKSB7CisJCQlFUlJPUihpcGgtPm5leHRoZHIpOworCQkJcmV0dXJuIFRDX0FDVF9TSE9UOworCQl9CisKKwkJaWYgKHRjcC0+ZGVzdCA9PSBodG9ucyg1MjAwKSkgeworCQkJa2V5LnJlbW90ZV9pcHY2WzNdID0gX2h0b25sKDEpOworCQl9IGVsc2UgaWYgKHRjcC0+ZGVzdCA9PSBodG9ucyg1MjAxKSkgeworCQkJa2V5LnJlbW90ZV9pcHY2WzNdID0gX2h0b25sKDIpOworCQl9IGVsc2UgeworCQkJRVJST1IodGNwLT5kZXN0KTsKKwkJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwkJfQorCX0KKworCXJldCA9IGJwZl9za2Jfc2V0X3R1bm5lbF9rZXkoc2tiLCAma2V5LCBzaXplb2Yoa2V5KSwgQlBGX0ZfVFVOSU5GT19JUFY2KTsKKwlpZiAocmV0IDwgMCkgeworCQlFUlJPUihyZXQpOworCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJfQorCisJcmV0dXJuIFRDX0FDVF9PSzsKK30KKworU0VDKCJpcDZpcDZfZ2V0X3R1bm5lbCIpCitpbnQgX2lwNmlwNl9nZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBicGZfdHVubmVsX2tleSBrZXk7CisJY2hhciBmbXRbXSA9ICJyZW1vdGUgaXA2ICV4OjoleFxuIjsKKworCXJldCA9IGJwZl9za2JfZ2V0X3R1bm5lbF9rZXkoc2tiLCAma2V5LCBzaXplb2Yoa2V5KSwgQlBGX0ZfVFVOSU5GT19JUFY2KTsKKwlpZiAocmV0IDwgMCkgeworCQlFUlJPUihyZXQpOworCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJfQorCisJYnBmX3RyYWNlX3ByaW50ayhmbXQsIHNpemVvZihmbXQpLCBfaHRvbmwoa2V5LnJlbW90ZV9pcHY2WzBdKSwKKwkJCSBfaHRvbmwoa2V5LnJlbW90ZV9pcHY2WzNdKSk7CisJcmV0dXJuIFRDX0FDVF9PSzsKK30KKworCitjaGFyIF9saWNlbnNlW10gU0VDKCJsaWNlbnNlIikgPSAiR1BMIjsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL3Rlc3RfY2dycDJfdGNfa2Vybi5jIGIvc2FtcGxlcy9icGYvdGVzdF9jZ3JwMl90Y19rZXJuLmMKaW5kZXggMjczMmMzNy4uMTBmZjczNCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9icGYvdGVzdF9jZ3JwMl90Y19rZXJuLmMKKysrIGIvc2FtcGxlcy9icGYvdGVzdF9jZ3JwMl90Y19rZXJuLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAkJYnBmX3RyYWNlX3ByaW50ayhkb250X2NhcmVfbXNnLCBzaXplb2YoZG9udF9jYXJlX21zZyksCiAJCQkJIGV0aC0+aF9wcm90bywgaXA2aC0+bmV4dGhkcik7CiAJCXJldHVybiBUQ19BQ1RfT0s7Ci0JfSBlbHNlIGlmIChicGZfc2tiX2luX2Nncm91cChza2IsICZ0ZXN0X2NncnAyX2FycmF5X3BpbiwgMCkgIT0gMSkgeworCX0gZWxzZSBpZiAoYnBmX3NrYl91bmRlcl9jZ3JvdXAoc2tiLCAmdGVzdF9jZ3JwMl9hcnJheV9waW4sIDApICE9IDEpIHsKIAkJYnBmX3RyYWNlX3ByaW50ayhwYXNzX21zZywgc2l6ZW9mKHBhc3NfbXNnKSk7CiAJCXJldHVybiBUQ19BQ1RfT0s7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL3Rlc3RfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cF9rZXJuLmMgYi9zYW1wbGVzL2JwZi90ZXN0X2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXBfa2Vybi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjI4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2JwZi90ZXN0X2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXBfa2Vybi5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiBTYXJndW4gRGhpbGxvbiA8c2FyZ3VuQHNhcmd1bi5tZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2JwZi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlICJicGZfaGVscGVycy5oIgorI2luY2x1ZGUgPHVhcGkvbGludXgvdXRzbmFtZS5oPgorCitzdHJ1Y3QgYnBmX21hcF9kZWYgU0VDKCJtYXBzIikgY2dyb3VwX21hcCA9IHsKKwkudHlwZQkJCT0gQlBGX01BUF9UWVBFX0NHUk9VUF9BUlJBWSwKKwkua2V5X3NpemUJCT0gc2l6ZW9mKHUzMiksCisJLnZhbHVlX3NpemUJCT0gc2l6ZW9mKHUzMiksCisJLm1heF9lbnRyaWVzCT0gMSwKK307CisKK3N0cnVjdCBicGZfbWFwX2RlZiBTRUMoIm1hcHMiKSBwZXJmX21hcCA9IHsKKwkudHlwZQkJCT0gQlBGX01BUF9UWVBFX0FSUkFZLAorCS5rZXlfc2l6ZQkJPSBzaXplb2YodTMyKSwKKwkudmFsdWVfc2l6ZQkJPSBzaXplb2YodTY0KSwKKwkubWF4X2VudHJpZXMJPSAxLAorfTsKKworLyogV3JpdGVzIHRoZSBsYXN0IFBJRCB0aGF0IGNhbGxlZCBzeW5jIHRvIGEgbWFwIGF0IGluZGV4IDAgKi8KK1NFQygia3Byb2JlL3N5c19zeW5jIikKK2ludCBicGZfcHJvZzEoc3RydWN0IHB0X3JlZ3MgKmN0eCkKK3sKKwl1NjQgcGlkID0gYnBmX2dldF9jdXJyZW50X3BpZF90Z2lkKCk7CisJaW50IGlkeCA9IDA7CisKKwlpZiAoIWJwZl9jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwKCZjZ3JvdXBfbWFwLCAwKSkKKwkJcmV0dXJuIDA7CisKKwlicGZfbWFwX3VwZGF0ZV9lbGVtKCZwZXJmX21hcCwgJmlkeCwgJnBpZCwgQlBGX0FOWSk7CisJcmV0dXJuIDA7Cit9CisKK2NoYXIgX2xpY2Vuc2VbXSBTRUMoImxpY2Vuc2UiKSA9ICJHUEwiOwordTMyIF92ZXJzaW9uIFNFQygidmVyc2lvbiIpID0gTElOVVhfVkVSU0lPTl9DT0RFOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvdGVzdF9jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwX3VzZXIuYyBiL3NhbXBsZXMvYnBmL3Rlc3RfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cF91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiMGJjZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvYnBmL3Rlc3RfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cF91c2VyLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiBTYXJndW4gRGhpbGxvbiA8c2FyZ3VuQHNhcmd1bi5tZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImxpYmJwZi5oIgorI2luY2x1ZGUgImJwZl9sb2FkLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKworI2RlZmluZSBDR1JPVVBfTU9VTlRfUEFUSAkiL21udCIKKyNkZWZpbmUgQ0dST1VQX1BBVEgJCSIvbW50L215LWNncm91cCIKKworI2RlZmluZSBjbGVhbl9lcnJubygpIChlcnJubyA9PSAwID8gIk5vbmUiIDogc3RyZXJyb3IoZXJybm8pKQorI2RlZmluZSBsb2dfZXJyKE1TRywgLi4uKSBmcHJpbnRmKHN0ZGVyciwgIiglczolZDogZXJybm86ICVzKSAiIE1TRyAiXG4iLCBcCisJX19GSUxFX18sIF9fTElORV9fLCBjbGVhbl9lcnJubygpLCAjI19fVkFfQVJHU19fKQorCitzdGF0aWMgaW50IGpvaW5fY2dyb3VwKGNoYXIgKnBhdGgpCit7CisJaW50IGZkLCByYyA9IDA7CisJcGlkX3QgcGlkID0gZ2V0cGlkKCk7CisJY2hhciBjZ3JvdXBfcGF0aFtQQVRIX01BWCArIDFdOworCisJc25wcmludGYoY2dyb3VwX3BhdGgsIHNpemVvZihjZ3JvdXBfcGF0aCksICIlcy9jZ3JvdXAucHJvY3MiLCBwYXRoKTsKKworCWZkID0gb3BlbihjZ3JvdXBfcGF0aCwgT19XUk9OTFkpOworCWlmIChmZCA8IDApIHsKKwkJbG9nX2VycigiT3BlbmluZyBDZ3JvdXAiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGRwcmludGYoZmQsICIlZFxuIiwgcGlkKSA8IDApIHsKKwkJbG9nX2VycigiSm9pbmluZyBDZ3JvdXAiKTsKKwkJcmMgPSAxOworCX0KKwljbG9zZShmZCk7CisJcmV0dXJuIHJjOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciBmaWxlbmFtZVsyNTZdOworCWludCBjZzIsIGlkeCA9IDA7CisJcGlkX3QgcmVtb3RlX3BpZCwgbG9jYWxfcGlkID0gZ2V0cGlkKCk7CisKKwlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzX2tlcm4ubyIsIGFyZ3ZbMF0pOworCWlmIChsb2FkX2JwZl9maWxlKGZpbGVuYW1lKSkgeworCQlwcmludGYoIiVzIiwgYnBmX2xvZ19idWYpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIFRoaXMgaXMgdG8gYXZvaWQgaW50ZXJmZXJpbmcgd2l0aCBleGlzdGluZyBjZ3JvdXBzLiBVbmZvcnR1bmF0ZWx5LAorCSAqIG1vc3QgcGVvcGxlIGRvbid0IGhhdmUgY2dyb3VwdjIgZW5hYmxlZCBhdCB0aGlzIHBvaW50IGluIHRpbWUuCisJICogSXQncyBlYXNpZXIgdG8gY3JlYXRlIG91ciBvd24gbW91bnQgbmFtZXNwYWNlIGFuZCBtYW5hZ2UgaXQKKwkgKiBvdXJzZWx2ZXMuCisJICovCisJaWYgKHVuc2hhcmUoQ0xPTkVfTkVXTlMpKSB7CisJCWxvZ19lcnIoInVuc2hhcmUiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKG1vdW50KCJub25lIiwgIi8iLCBOVUxMLCBNU19SRUMgfCBNU19QUklWQVRFLCBOVUxMKSkgeworCQlsb2dfZXJyKCJtb3VudCBmYWtlcm9vdCIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobW91bnQoIm5vbmUiLCBDR1JPVVBfTU9VTlRfUEFUSCwgImNncm91cDIiLCAwLCBOVUxMKSkgeworCQlsb2dfZXJyKCJtb3VudCBjZ3JvdXAyIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChta2RpcihDR1JPVVBfUEFUSCwgMDc3NykgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisJCWxvZ19lcnIoIm1rZGlyIGNncm91cCIpOworCQlyZXR1cm4gMTsKKwl9CisKKwljZzIgPSBvcGVuKENHUk9VUF9QQVRILCBPX1JET05MWSk7CisJaWYgKGNnMiA8IDApIHsKKwkJbG9nX2Vycigib3BlbmluZyB0YXJnZXQgY2dyb3VwIik7CisJCWdvdG8gY2xlYW51cF9jZ3JvdXBfZXJyOworCX0KKworCWlmIChicGZfdXBkYXRlX2VsZW0obWFwX2ZkWzBdLCAmaWR4LCAmY2cyLCBCUEZfQU5ZKSkgeworCQlsb2dfZXJyKCJBZGRpbmcgdGFyZ2V0IGNncm91cCB0byBtYXAiKTsKKwkJZ290byBjbGVhbnVwX2Nncm91cF9lcnI7CisJfQorCWlmIChqb2luX2Nncm91cCgiL21udC9teS1jZ3JvdXAiKSkgeworCQlsb2dfZXJyKCJMZWF2aW5nIHRhcmdldCBjZ3JvdXAiKTsKKwkJZ290byBjbGVhbnVwX2Nncm91cF9lcnI7CisJfQorCisJLyoKKwkgKiBUaGUgaW5zdGFsbGVkIGhlbHBlciBwcm9ncmFtIGNhdGNoZWQgdGhlIHN5bmMgY2FsbCwgYW5kIHNob3VsZAorCSAqIHdyaXRlIGl0IHRvIHRoZSBtYXAuCisJICovCisKKwlzeW5jKCk7CisJYnBmX2xvb2t1cF9lbGVtKG1hcF9mZFsxXSwgJmlkeCwgJnJlbW90ZV9waWQpOworCisJaWYgKGxvY2FsX3BpZCAhPSByZW1vdGVfcGlkKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIkJQRiBIZWxwZXIgZGlkbid0IHdyaXRlIGNvcnJlY3QgUElEIHRvIG1hcCwgYnV0OiAlZFxuIiwKKwkJCXJlbW90ZV9waWQpOworCQlnb3RvIGxlYXZlX2Nncm91cF9lcnI7CisJfQorCisJLyogVmVyaWZ5IHRoZSBuZWdhdGl2ZSBzY2VuYXJpbzsgbGVhdmUgdGhlIGNncm91cCAqLworCWlmIChqb2luX2Nncm91cChDR1JPVVBfTU9VTlRfUEFUSCkpCisJCWdvdG8gbGVhdmVfY2dyb3VwX2VycjsKKworCXJlbW90ZV9waWQgPSAwOworCWJwZl91cGRhdGVfZWxlbShtYXBfZmRbMV0sICZpZHgsICZyZW1vdGVfcGlkLCBCUEZfQU5ZKTsKKworCXN5bmMoKTsKKwlicGZfbG9va3VwX2VsZW0obWFwX2ZkWzFdLCAmaWR4LCAmcmVtb3RlX3BpZCk7CisKKwlpZiAobG9jYWxfcGlkID09IHJlbW90ZV9waWQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJCUEYgY2dyb3VwIG5lZ2F0aXZlIHRlc3QgZGlkIG5vdCB3b3JrXG4iKTsKKwkJZ290byBjbGVhbnVwX2Nncm91cF9lcnI7CisJfQorCisJcm1kaXIoQ0dST1VQX1BBVEgpOworCXJldHVybiAwOworCisJLyogRXJyb3IgY29uZGl0aW9uLCBjbGVhbnVwICovCitsZWF2ZV9jZ3JvdXBfZXJyOgorCWpvaW5fY2dyb3VwKENHUk9VUF9NT1VOVF9QQVRIKTsKK2NsZWFudXBfY2dyb3VwX2VycjoKKwlybWRpcihDR1JPVVBfUEFUSCk7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90ZXN0X2lwaXAuc2ggYi9zYW1wbGVzL2JwZi90ZXN0X2lwaXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTk2OTI1NAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvYnBmL3Rlc3RfaXBpcC5zaApAQCAtMCwwICsxLDE3OCBAQAorIyEvYmluL2Jhc2gKKworZnVuY3Rpb24gY29uZmlnX2RldmljZSB7CisJaXAgbmV0bnMgYWRkIGF0X25zMAorCWlwIG5ldG5zIGFkZCBhdF9uczEKKwlpcCBuZXRucyBhZGQgYXRfbnMyCisJaXAgbGluayBhZGQgdmV0aDAgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2ZXRoMGIKKwlpcCBsaW5rIGFkZCB2ZXRoMSB0eXBlIHZldGggcGVlciBuYW1lIHZldGgxYgorCWlwIGxpbmsgYWRkIHZldGgyIHR5cGUgdmV0aCBwZWVyIG5hbWUgdmV0aDJiCisJaXAgbGluayBzZXQgdmV0aDBiIHVwCisJaXAgbGluayBzZXQgdmV0aDFiIHVwCisJaXAgbGluayBzZXQgdmV0aDJiIHVwCisJaXAgbGluayBzZXQgZGV2IHZldGgwYiBtdHUgMTUwMAorCWlwIGxpbmsgc2V0IGRldiB2ZXRoMWIgbXR1IDE1MDAKKwlpcCBsaW5rIHNldCBkZXYgdmV0aDJiIG10dSAxNTAwCisJaXAgbGluayBzZXQgdmV0aDAgbmV0bnMgYXRfbnMwCisJaXAgbGluayBzZXQgdmV0aDEgbmV0bnMgYXRfbnMxCisJaXAgbGluayBzZXQgdmV0aDIgbmV0bnMgYXRfbnMyCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgYWRkciBhZGQgMTcyLjE2LjEuMTAwLzI0IGRldiB2ZXRoMAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIGlwIGFkZHIgYWRkIDI0MDE6ZGIwMDo6MS82NCBkZXYgdmV0aDAgbm9kYWQKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBsaW5rIHNldCBkZXYgdmV0aDAgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMSBpcCBhZGRyIGFkZCAxNzIuMTYuMS4xMDEvMjQgZGV2IHZldGgxCisJaXAgbmV0bnMgZXhlYyBhdF9uczEgaXAgYWRkciBhZGQgMjQwMTpkYjAwOjoyLzY0IGRldiB2ZXRoMSBub2RhZAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIGlwIGxpbmsgc2V0IGRldiB2ZXRoMSB1cAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMyIGlwIGFkZHIgYWRkIDE3Mi4xNi4xLjIwMC8yNCBkZXYgdmV0aDIKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcCBhZGRyIGFkZCAyNDAxOmRiMDA6OjMvNjQgZGV2IHZldGgyIG5vZGFkCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXAgbGluayBzZXQgZGV2IHZldGgyIHVwCisJaXAgbGluayBhZGQgYnIwIHR5cGUgYnJpZGdlCisJaXAgbGluayBzZXQgYnIwIHVwCisJaXAgbGluayBzZXQgZGV2IGJyMCBtdHUgMTUwMAorCWlwIGxpbmsgc2V0IHZldGgwYiBtYXN0ZXIgYnIwCisJaXAgbGluayBzZXQgdmV0aDFiIG1hc3RlciBicjAKKwlpcCBsaW5rIHNldCB2ZXRoMmIgbWFzdGVyIGJyMAorfQorCitmdW5jdGlvbiBhZGRfaXBpcF90dW5uZWwgeworCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIFwKKwkJaXAgbGluayBhZGQgZGV2ICRERVZfTlMgdHlwZSBpcGlwIGxvY2FsIDE3Mi4xNi4xLjEwMCByZW1vdGUgMTcyLjE2LjEuMjAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgbGluayBzZXQgZGV2ICRERVZfTlMgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBhZGRyIGFkZCBkZXYgJERFVl9OUyAxMC4xLjEuMTAwLzI0CisJaXAgbmV0bnMgZXhlYyBhdF9uczEgXAorCQlpcCBsaW5rIGFkZCBkZXYgJERFVl9OUyB0eXBlIGlwaXAgbG9jYWwgMTcyLjE2LjEuMTAxIHJlbW90ZSAxNzIuMTYuMS4yMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMSBpcCBsaW5rIHNldCBkZXYgJERFVl9OUyB1cAorCSMgc2FtZSBpbm5lciBJUCBhZGRyZXNzIGluIGF0X25zMCBhbmQgYXRfbnMxCisJaXAgbmV0bnMgZXhlYyBhdF9uczEgaXAgYWRkciBhZGQgZGV2ICRERVZfTlMgMTAuMS4xLjEwMC8yNAorCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXAgbGluayBhZGQgZGV2ICRERVYgdHlwZSBpcGlwIGV4dGVybmFsCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXAgbGluayBzZXQgZGV2ICRERVYgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcCBhZGRyIGFkZCBkZXYgJERFViAxMC4xLjEuMjAwLzI0Cit9CisKK2Z1bmN0aW9uIGFkZF9pcGlwNl90dW5uZWwgeworCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIFwKKwkJaXAgbGluayBhZGQgZGV2ICRERVZfTlMgdHlwZSBpcDZ0bmwgbW9kZSBpcGlwNiBsb2NhbCAyNDAxOmRiMDA6OjEvNjQgcmVtb3RlIDI0MDE6ZGIwMDo6My82NAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIGlwIGxpbmsgc2V0IGRldiAkREVWX05TIHVwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgYWRkciBhZGQgZGV2ICRERVZfTlMgMTAuMS4xLjEwMC8yNAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIFwKKwkJaXAgbGluayBhZGQgZGV2ICRERVZfTlMgdHlwZSBpcDZ0bmwgbW9kZSBpcGlwNiBsb2NhbCAyNDAxOmRiMDA6OjIvNjQgcmVtb3RlIDI0MDE6ZGIwMDo6My82NAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIGlwIGxpbmsgc2V0IGRldiAkREVWX05TIHVwCisJIyBzYW1lIGlubmVyIElQIGFkZHJlc3MgaW4gYXRfbnMwIGFuZCBhdF9uczEKKwlpcCBuZXRucyBleGVjIGF0X25zMSBpcCBhZGRyIGFkZCBkZXYgJERFVl9OUyAxMC4xLjEuMTAwLzI0CisKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcCBsaW5rIGFkZCBkZXYgJERFViB0eXBlIGlwNnRubCBtb2RlIGlwaXA2IGV4dGVybmFsCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXAgbGluayBzZXQgZGV2ICRERVYgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcCBhZGRyIGFkZCBkZXYgJERFViAxMC4xLjEuMjAwLzI0Cit9CisKK2Z1bmN0aW9uIGFkZF9pcDZpcDZfdHVubmVsIHsKKwlpcCBuZXRucyBleGVjIGF0X25zMCBcCisJCWlwIGxpbmsgYWRkIGRldiAkREVWX05TIHR5cGUgaXA2dG5sIG1vZGUgaXA2aXA2IGxvY2FsIDI0MDE6ZGIwMDo6MS82NCByZW1vdGUgMjQwMTpkYjAwOjozLzY0CisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgbGluayBzZXQgZGV2ICRERVZfTlMgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBhZGRyIGFkZCBkZXYgJERFVl9OUyAyNjAxOjY0Njo6MS82NAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIFwKKwkJaXAgbGluayBhZGQgZGV2ICRERVZfTlMgdHlwZSBpcDZ0bmwgbW9kZSBpcDZpcDYgbG9jYWwgMjQwMTpkYjAwOjoyLzY0IHJlbW90ZSAyNDAxOmRiMDA6OjMvNjQKKwlpcCBuZXRucyBleGVjIGF0X25zMSBpcCBsaW5rIHNldCBkZXYgJERFVl9OUyB1cAorCSMgc2FtZSBpbm5lciBJUCBhZGRyZXNzIGluIGF0X25zMCBhbmQgYXRfbnMxCisJaXAgbmV0bnMgZXhlYyBhdF9uczEgaXAgYWRkciBhZGQgZGV2ICRERVZfTlMgMjYwMTo2NDY6OjEvNjQKKworCWlwIG5ldG5zIGV4ZWMgYXRfbnMyIGlwIGxpbmsgYWRkIGRldiAkREVWIHR5cGUgaXA2dG5sIG1vZGUgaXA2aXA2IGV4dGVybmFsCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXAgbGluayBzZXQgZGV2ICRERVYgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcCBhZGRyIGFkZCBkZXYgJERFViAyNjAxOjY0Njo6Mi82NAorfQorCitmdW5jdGlvbiBhdHRhY2hfYnBmIHsKKwlERVY9JDEKKwlTRVRfVFVOTkVMPSQyCisJR0VUX1RVTk5FTD0kMworCWlwIG5ldG5zIGV4ZWMgYXRfbnMyIHRjIHFkaXNjIGFkZCBkZXYgJERFViBjbHNhY3QKKwlpcCBuZXRucyBleGVjIGF0X25zMiB0YyBmaWx0ZXIgYWRkIGRldiAkREVWIGVncmVzcyBicGYgZGEgb2JqIHRjYnBmMl9rZXJuLm8gc2VjICRTRVRfVFVOTkVMCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgdGMgZmlsdGVyIGFkZCBkZXYgJERFViBpbmdyZXNzIGJwZiBkYSBvYmogdGNicGYyX2tlcm4ubyBzZWMgJEdFVF9UVU5ORUwKK30KKworZnVuY3Rpb24gdGVzdF9pcGlwIHsKKwlERVZfTlM9aXBpcF9zdGQKKwlERVY9aXBpcF9icGYKKwljb25maWdfZGV2aWNlCisjCXRjcGR1bXAgLW5laSBicjAgJgorCWNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL3RyYWNlX3BpcGUgJgorCisJYWRkX2lwaXBfdHVubmVsCisJYXR0YWNoX2JwZiAkREVWIGlwaXBfc2V0X3R1bm5lbCBpcGlwX2dldF90dW5uZWwKKworCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIHBpbmcgLWMgMSAxMC4xLjEuMjAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgcGluZyAtYyAxIDEwLjEuMS4xMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcGVyZiAtc0QgLXAgNTIwMCA+IC9kZXYvbnVsbAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIGlwZXJmIC1zRCAtcCA1MjAxID4gL2Rldi9udWxsCisJc2xlZXAgMC4yCisJIyB0Y3AgY2hlY2sgX3NhbWVfIElQIG92ZXIgZGlmZmVyZW50IHR1bm5lbHMKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcGVyZiAtYyAxMC4xLjEuMTAwIC1uIDVrIC1wIDUyMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcGVyZiAtYyAxMC4xLjEuMTAwIC1uIDVrIC1wIDUyMDEKKwljbGVhbnVwCit9CisKKyMgSVB2NCBvdmVyIElQdjYgdHVubmVsCitmdW5jdGlvbiB0ZXN0X2lwaXA2IHsKKwlERVZfTlM9aXBpcF9zdGQKKwlERVY9aXBpcF9icGYKKwljb25maWdfZGV2aWNlCisjCXRjcGR1bXAgLW5laSBicjAgJgorCWNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL3RyYWNlX3BpcGUgJgorCisJYWRkX2lwaXA2X3R1bm5lbAorCWF0dGFjaF9icGYgJERFViBpcGlwNl9zZXRfdHVubmVsIGlwaXA2X2dldF90dW5uZWwKKworCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIHBpbmcgLWMgMSAxMC4xLjEuMjAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgcGluZyAtYyAxIDEwLjEuMS4xMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcGVyZiAtc0QgLXAgNTIwMCA+IC9kZXYvbnVsbAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIGlwZXJmIC1zRCAtcCA1MjAxID4gL2Rldi9udWxsCisJc2xlZXAgMC4yCisJIyB0Y3AgY2hlY2sgX3NhbWVfIElQIG92ZXIgZGlmZmVyZW50IHR1bm5lbHMKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcGVyZiAtYyAxMC4xLjEuMTAwIC1uIDVrIC1wIDUyMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcGVyZiAtYyAxMC4xLjEuMTAwIC1uIDVrIC1wIDUyMDEKKwljbGVhbnVwCit9CisKKyMgSVB2NiBvdmVyIElQdjYgdHVubmVsCitmdW5jdGlvbiB0ZXN0X2lwNmlwNiB7CisJREVWX05TPWlwaXBfc3RkCisJREVWPWlwaXBfYnBmCisJY29uZmlnX2RldmljZQorIwl0Y3BkdW1wIC1uZWkgYnIwICYKKwljYXQgL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy90cmFjZV9waXBlICYKKworCWFkZF9pcDZpcDZfdHVubmVsCisJYXR0YWNoX2JwZiAkREVWIGlwNmlwNl9zZXRfdHVubmVsIGlwNmlwNl9nZXRfdHVubmVsCisKKwlpcCBuZXRucyBleGVjIGF0X25zMCBwaW5nIC02IC1jIDEgMjYwMTo2NDY6OjIKKwlpcCBuZXRucyBleGVjIGF0X25zMiBwaW5nIC02IC1jIDEgMjYwMTo2NDY6OjEKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcGVyZiAtNnNEIC1wIDUyMDAgPiAvZGV2L251bGwKKwlpcCBuZXRucyBleGVjIGF0X25zMSBpcGVyZiAtNnNEIC1wIDUyMDEgPiAvZGV2L251bGwKKwlzbGVlcCAwLjIKKwkjIHRjcCBjaGVjayBfc2FtZV8gSVAgb3ZlciBkaWZmZXJlbnQgdHVubmVscworCWlwIG5ldG5zIGV4ZWMgYXRfbnMyIGlwZXJmIC02YyAyNjAxOjY0Njo6MSAtbiA1ayAtcCA1MjAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXBlcmYgLTZjIDI2MDE6NjQ2OjoxIC1uIDVrIC1wIDUyMDEKKwljbGVhbnVwCit9CisKK2Z1bmN0aW9uIGNsZWFudXAgeworCXNldCArZXgKKwlwa2lsbCBpcGVyZgorCWlwIG5ldG5zIGRlbGV0ZSBhdF9uczAKKwlpcCBuZXRucyBkZWxldGUgYXRfbnMxCisJaXAgbmV0bnMgZGVsZXRlIGF0X25zMgorCWlwIGxpbmsgZGVsIHZldGgwCisJaXAgbGluayBkZWwgdmV0aDEKKwlpcCBsaW5rIGRlbCB2ZXRoMgorCWlwIGxpbmsgZGVsIGJyMAorCXBraWxsIHRjcGR1bXAKKwlwa2lsbCBjYXQKKwlzZXQgLWV4Cit9CisKK2NsZWFudXAKK2VjaG8gIlRlc3RpbmcgSVAgdHVubmVscy4uLiIKK3Rlc3RfaXBpcAordGVzdF9pcGlwNgordGVzdF9pcDZpcDYKK2VjaG8gIioqKiBQQVNTICoqKiIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL3Rlc3RfbWFwcy5jIGIvc2FtcGxlcy9icGYvdGVzdF9tYXBzLmMKaW5kZXggNDdiZjA4NS4uY2NlMmI1OSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9icGYvdGVzdF9tYXBzLmMKKysrIGIvc2FtcGxlcy9icGYvdGVzdF9tYXBzLmMKQEAgLTY4LDcgKzY4LDE2IEBACiAJYXNzZXJ0KGJwZl91cGRhdGVfZWxlbShtYXBfZmQsICZrZXksICZ2YWx1ZSwgQlBGX05PRVhJU1QpID09IC0xICYmCiAJICAgICAgIGVycm5vID09IEUyQklHKTsKIAorCS8qIHVwZGF0ZSBleGlzdGluZyBlbGVtZW50LCB0aG91Z2h0IHRoZSBtYXAgaXMgZnVsbCAqLworCWtleSA9IDE7CisJYXNzZXJ0KGJwZl91cGRhdGVfZWxlbShtYXBfZmQsICZrZXksICZ2YWx1ZSwgQlBGX0VYSVNUKSA9PSAwKTsKKwlrZXkgPSAyOworCWFzc2VydChicGZfdXBkYXRlX2VsZW0obWFwX2ZkLCAma2V5LCAmdmFsdWUsIEJQRl9BTlkpID09IDApOworCWtleSA9IDE7CisJYXNzZXJ0KGJwZl91cGRhdGVfZWxlbShtYXBfZmQsICZrZXksICZ2YWx1ZSwgQlBGX0FOWSkgPT0gMCk7CisKIAkvKiBjaGVjayB0aGF0IGtleSA9IDAgZG9lc24ndCBleGlzdCAqLworCWtleSA9IDA7CiAJYXNzZXJ0KGJwZl9kZWxldGVfZWxlbShtYXBfZmQsICZrZXkpID09IC0xICYmIGVycm5vID09IEVOT0VOVCk7CiAKIAkvKiBpdGVyYXRlIG92ZXIgdHdvIGVsZW1lbnRzICovCkBAIC00MTMsMTAgKzQyMiwxMiBAQAogCiAJZm9yIChpID0gZm47IGkgPCBNQVBfU0laRTsgaSArPSBUQVNLUykgewogCQlrZXkgPSB2YWx1ZSA9IGk7Ci0JCWlmIChkb191cGRhdGUpCisJCWlmIChkb191cGRhdGUpIHsKIAkJCWFzc2VydChicGZfdXBkYXRlX2VsZW0obWFwX2ZkLCAma2V5LCAmdmFsdWUsIEJQRl9OT0VYSVNUKSA9PSAwKTsKLQkJZWxzZQorCQkJYXNzZXJ0KGJwZl91cGRhdGVfZWxlbShtYXBfZmQsICZrZXksICZ2YWx1ZSwgQlBGX0VYSVNUKSA9PSAwKTsKKwkJfSBlbHNlIHsKIAkJCWFzc2VydChicGZfZGVsZXRlX2VsZW0obWFwX2ZkLCAma2V5KSA9PSAwKTsKKwkJfQogCX0KIH0KIApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvdGVzdF90dW5uZWxfYnBmLnNoIGIvc2FtcGxlcy9icGYvdGVzdF90dW5uZWxfYnBmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmZjYzNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2JwZi90ZXN0X3R1bm5lbF9icGYuc2gKQEAgLTAsMCArMSwxNjcgQEAKKyMhL2Jpbi9iYXNoCisjIEluIE5hbWVzcGFjZSAwIChhdF9uczApIHVzaW5nIG5hdGl2ZSB0dW5uZWwKKyMgT3ZlcmxheSBJUDogMTAuMS4xLjEwMAorIyBsb2NhbCAxOTIuMTYuMS4xMDAgcmVtb3RlIDE5Mi4xNi4xLjIwMAorIyB2ZXRoMCBJUDogMTcyLjE2LjEuMTAwLCB0dW5uZWwgZGV2IDx0eXBlPjAwCisKKyMgT3V0IG9mIE5hbWVzcGFjZSB1c2luZyBCUEYgc2V0L2dldCBvbiBsd3R1bm5lbAorIyBPdmVybGF5IElQOiAxMC4xLjEuMjAwCisjIGxvY2FsIDE3Mi4xNi4xLjIwMCByZW1vdGUgMTcyLjE2LjEuMTAwCisjIHZldGgxIElQOiAxNzIuMTYuMS4yMDAsIHR1bm5lbCBkZXYgPHR5cGU+MTEKKworZnVuY3Rpb24gY29uZmlnX2RldmljZSB7CisJaXAgbmV0bnMgYWRkIGF0X25zMAorCWlwIGxpbmsgYWRkIHZldGgwIHR5cGUgdmV0aCBwZWVyIG5hbWUgdmV0aDEKKwlpcCBsaW5rIHNldCB2ZXRoMCBuZXRucyBhdF9uczAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBhZGRyIGFkZCAxNzIuMTYuMS4xMDAvMjQgZGV2IHZldGgwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgbGluayBzZXQgZGV2IHZldGgwIHVwCisJaXAgbGluayBzZXQgZGV2IHZldGgxIHVwIG10dSAxNTAwCisJaXAgYWRkciBhZGQgZGV2IHZldGgxIDE3Mi4xNi4xLjIwMC8yNAorfQorCitmdW5jdGlvbiBhZGRfZ3JlX3R1bm5lbCB7CisJIyBpbiBuYW1lc3BhY2UKKwlpcCBuZXRucyBleGVjIGF0X25zMCBcCisJCWlwIGxpbmsgYWRkIGRldiAkREVWX05TIHR5cGUgJFRZUEUga2V5IDIgbG9jYWwgMTcyLjE2LjEuMTAwIHJlbW90ZSAxNzIuMTYuMS4yMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBsaW5rIHNldCBkZXYgJERFVl9OUyB1cAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIGlwIGFkZHIgYWRkIGRldiAkREVWX05TIDEwLjEuMS4xMDAvMjQKKworCSMgb3V0IG9mIG5hbWVzcGFjZQorCWlwIGxpbmsgYWRkIGRldiAkREVWIHR5cGUgJFRZUEUga2V5IDIgZXh0ZXJuYWwKKwlpcCBsaW5rIHNldCBkZXYgJERFViB1cAorCWlwIGFkZHIgYWRkIGRldiAkREVWIDEwLjEuMS4yMDAvMjQKK30KKworZnVuY3Rpb24gYWRkX3Z4bGFuX3R1bm5lbCB7CisJIyBTZXQgc3RhdGljIEFSUCBlbnRyeSBoZXJlIGJlY2F1c2UgaXB0YWJsZXMgc2V0LW1hcmsgd29ya3MKKwkjIG9uIEwzIHBhY2tldCwgYXMgYSByZXN1bHQgbm90IGFwcGx5aW5nIHRvIEFSUCBwYWNrZXRzLAorCSMgY2F1c2luZyBlcnJvcnMgYXQgZ2V0X3R1bm5lbF97a2V5L29wdH0uCisKKwkjIGluIG5hbWVzcGFjZQorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIFwKKwkJaXAgbGluayBhZGQgZGV2ICRERVZfTlMgdHlwZSAkVFlQRSBpZCAyIGRzdHBvcnQgNDc4OSBnYnAgcmVtb3RlIDE3Mi4xNi4xLjIwMAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIGlwIGxpbmsgc2V0IGRldiAkREVWX05TIGFkZHJlc3MgNTI6NTQ6MDA6ZDk6MDE6MDAgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBhZGRyIGFkZCBkZXYgJERFVl9OUyAxMC4xLjEuMTAwLzI0CisJaXAgbmV0bnMgZXhlYyBhdF9uczAgYXJwIC1zIDEwLjEuMS4yMDAgNTI6NTQ6MDA6ZDk6MDI6MDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcHRhYmxlcyAtQSBPVVRQVVQgLWogTUFSSyAtLXNldC1tYXJrIDB4ODAwRkYKKworCSMgb3V0IG9mIG5hbWVzcGFjZQorCWlwIGxpbmsgYWRkIGRldiAkREVWIHR5cGUgJFRZUEUgZXh0ZXJuYWwgZ2JwIGRzdHBvcnQgNDc4OQorCWlwIGxpbmsgc2V0IGRldiAkREVWIGFkZHJlc3MgNTI6NTQ6MDA6ZDk6MDI6MDAgdXAKKwlpcCBhZGRyIGFkZCBkZXYgJERFViAxMC4xLjEuMjAwLzI0CisJYXJwIC1zIDEwLjEuMS4xMDAgNTI6NTQ6MDA6ZDk6MDE6MDAKK30KKworZnVuY3Rpb24gYWRkX2dlbmV2ZV90dW5uZWwgeworCSMgaW4gbmFtZXNwYWNlCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgXAorCQlpcCBsaW5rIGFkZCBkZXYgJERFVl9OUyB0eXBlICRUWVBFIGlkIDIgZHN0cG9ydCA2MDgxIHJlbW90ZSAxNzIuMTYuMS4yMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBsaW5rIHNldCBkZXYgJERFVl9OUyB1cAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIGlwIGFkZHIgYWRkIGRldiAkREVWX05TIDEwLjEuMS4xMDAvMjQKKworCSMgb3V0IG9mIG5hbWVzcGFjZQorCWlwIGxpbmsgYWRkIGRldiAkREVWIHR5cGUgJFRZUEUgZHN0cG9ydCA2MDgxIGV4dGVybmFsCisJaXAgbGluayBzZXQgZGV2ICRERVYgdXAKKwlpcCBhZGRyIGFkZCBkZXYgJERFViAxMC4xLjEuMjAwLzI0Cit9CisKK2Z1bmN0aW9uIGFkZF9pcGlwX3R1bm5lbCB7CisJIyBpbiBuYW1lc3BhY2UKKwlpcCBuZXRucyBleGVjIGF0X25zMCBcCisJCWlwIGxpbmsgYWRkIGRldiAkREVWX05TIHR5cGUgJFRZUEUgbG9jYWwgMTcyLjE2LjEuMTAwIHJlbW90ZSAxNzIuMTYuMS4yMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBsaW5rIHNldCBkZXYgJERFVl9OUyB1cAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIGlwIGFkZHIgYWRkIGRldiAkREVWX05TIDEwLjEuMS4xMDAvMjQKKworCSMgb3V0IG9mIG5hbWVzcGFjZQorCWlwIGxpbmsgYWRkIGRldiAkREVWIHR5cGUgJFRZUEUgZXh0ZXJuYWwKKwlpcCBsaW5rIHNldCBkZXYgJERFViB1cAorCWlwIGFkZHIgYWRkIGRldiAkREVWIDEwLjEuMS4yMDAvMjQKK30KKworZnVuY3Rpb24gYXR0YWNoX2JwZiB7CisJREVWPSQxCisJU0VUX1RVTk5FTD0kMgorCUdFVF9UVU5ORUw9JDMKKwl0YyBxZGlzYyBhZGQgZGV2ICRERVYgY2xzYWN0CisJdGMgZmlsdGVyIGFkZCBkZXYgJERFViBlZ3Jlc3MgYnBmIGRhIG9iaiB0Y2JwZjJfa2Vybi5vIHNlYyAkU0VUX1RVTk5FTAorCXRjIGZpbHRlciBhZGQgZGV2ICRERVYgaW5ncmVzcyBicGYgZGEgb2JqIHRjYnBmMl9rZXJuLm8gc2VjICRHRVRfVFVOTkVMCit9CisKK2Z1bmN0aW9uIHRlc3RfZ3JlIHsKKwlUWVBFPWdyZXRhcAorCURFVl9OUz1ncmV0YXAwMAorCURFVj1ncmV0YXAxMQorCWNvbmZpZ19kZXZpY2UKKwlhZGRfZ3JlX3R1bm5lbAorCWF0dGFjaF9icGYgJERFViBncmVfc2V0X3R1bm5lbCBncmVfZ2V0X3R1bm5lbAorCXBpbmcgLWMgMSAxMC4xLjEuMTAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgcGluZyAtYyAxIDEwLjEuMS4yMDAKKwljbGVhbnVwCit9CisKK2Z1bmN0aW9uIHRlc3RfdnhsYW4geworCVRZUEU9dnhsYW4KKwlERVZfTlM9dnhsYW4wMAorCURFVj12eGxhbjExCisJY29uZmlnX2RldmljZQorCWFkZF92eGxhbl90dW5uZWwKKwlhdHRhY2hfYnBmICRERVYgdnhsYW5fc2V0X3R1bm5lbCB2eGxhbl9nZXRfdHVubmVsCisJcGluZyAtYyAxIDEwLjEuMS4xMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBwaW5nIC1jIDEgMTAuMS4xLjIwMAorCWNsZWFudXAKK30KKworZnVuY3Rpb24gdGVzdF9nZW5ldmUgeworCVRZUEU9Z2VuZXZlCisJREVWX05TPWdlbmV2ZTAwCisJREVWPWdlbmV2ZTExCisJY29uZmlnX2RldmljZQorCWFkZF9nZW5ldmVfdHVubmVsCisJYXR0YWNoX2JwZiAkREVWIGdlbmV2ZV9zZXRfdHVubmVsIGdlbmV2ZV9nZXRfdHVubmVsCisJcGluZyAtYyAxIDEwLjEuMS4xMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBwaW5nIC1jIDEgMTAuMS4xLjIwMAorCWNsZWFudXAKK30KKworZnVuY3Rpb24gdGVzdF9pcGlwIHsKKwlUWVBFPWlwaXAKKwlERVZfTlM9aXBpcDAwCisJREVWPWlwaXAxMQorCWNvbmZpZ19kZXZpY2UKKwl0Y3BkdW1wIC1uZWkgdmV0aDEgJgorCWNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL3RyYWNlX3BpcGUgJgorCWFkZF9pcGlwX3R1bm5lbAorCWV0aHRvb2wgLUsgdmV0aDEgZ3NvIG9mZiBncm8gb2ZmIHJ4IG9mZiB0eCBvZmYKKwlpcCBsaW5rIHNldCBkZXYgdmV0aDEgbXR1IDE1MDAKKwlhdHRhY2hfYnBmICRERVYgaXBpcF9zZXRfdHVubmVsIGlwaXBfZ2V0X3R1bm5lbAorCXBpbmcgLWMgMSAxMC4xLjEuMTAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgcGluZyAtYyAxIDEwLjEuMS4yMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcGVyZiAtc0QgLXAgNTIwMCA+IC9kZXYvbnVsbAorCXNsZWVwIDAuMgorCWlwZXJmIC1jIDEwLjEuMS4xMDAgLW4gNWsgLXAgNTIwMAorCWNsZWFudXAKK30KKworZnVuY3Rpb24gY2xlYW51cCB7CisJc2V0ICtleAorCXBraWxsIGlwZXJmCisJaXAgbmV0bnMgZGVsZXRlIGF0X25zMAorCWlwIGxpbmsgZGVsIHZldGgxCisJaXAgbGluayBkZWwgaXBpcDExCisJaXAgbGluayBkZWwgZ3JldGFwMTEKKwlpcCBsaW5rIGRlbCBnZW5ldmUxMQorCXBraWxsIHRjcGR1bXAKKwlwa2lsbCBjYXQKKwlzZXQgLWV4Cit9CisKK2NsZWFudXAKK2VjaG8gIlRlc3RpbmcgR1JFIHR1bm5lbC4uLiIKK3Rlc3RfZ3JlCitlY2hvICJUZXN0aW5nIFZYTEFOIHR1bm5lbC4uLiIKK3Rlc3RfdnhsYW4KK2VjaG8gIlRlc3RpbmcgR0VORVZFIHR1bm5lbC4uLiIKK3Rlc3RfZ2VuZXZlCitlY2hvICJUZXN0aW5nIElQSVAgdHVubmVsLi4uIgordGVzdF9pcGlwCitlY2hvICIqKiogUEFTUyAqKioiCmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90ZXN0X3ZlcmlmaWVyLmMgYi9zYW1wbGVzL2JwZi90ZXN0X3ZlcmlmaWVyLmMKaW5kZXggZmUyZmNlYy4uMzY5ZmZhYSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9icGYvdGVzdF92ZXJpZmllci5jCisrKyBiL3NhbXBsZXMvYnBmL3Rlc3RfdmVyaWZpZXIuYwpAQCAtMjksNiArMjksNyBAQAogCXN0cnVjdCBicGZfaW5zbglpbnNuc1tNQVhfSU5TTlNdOwogCWludCBmaXh1cFtNQVhfRklYVVBTXTsKIAlpbnQgcHJvZ19hcnJheV9maXh1cFtNQVhfRklYVVBTXTsKKwlpbnQgdGVzdF92YWxfbWFwX2ZpeHVwW01BWF9GSVhVUFNdOwogCWNvbnN0IGNoYXIgKmVycnN0cjsKIAljb25zdCBjaGFyICplcnJzdHJfdW5wcml2OwogCWVudW0gewpAQCAtMzksNiArNDAsMTkgQEAKIAllbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlOwogfTsKIAorLyogTm90ZSB3ZSB3YW50IHRoaXMgdG8gYmUgNjQgYml0IGFsaWduZWQgc28gdGhhdCB0aGUgZW5kIG9mIG91ciBhcnJheSBpcworICogYWN0dWFsbHkgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlLgorICovCisjZGVmaW5lIE1BWF9FTlRSSUVTIDExCitzdHJ1Y3QgdGVzdF92YWwgeworCXVuc2lnbmVkIGluZGV4OworCWludCBmb29bTUFYX0VOVFJJRVNdOworfTsKKworc3RydWN0IG90aGVyX3ZhbCB7CisJdW5zaWduZWQgaW50IGFjdGlvblszMl07Cit9OworCiBzdGF0aWMgc3RydWN0IGJwZl90ZXN0IHRlc3RzW10gPSB7CiAJewogCQkiYWRkK3N1YittdWwiLApAQCAtMjkxLDYgKzMwNSwyOSBAQAogCQkucmVzdWx0ID0gUkVKRUNULAogCX0sCiAJeworCQkiaW52YWxpZCBhcmd1bWVudCByZWdpc3RlciIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX2dldF9jZ3JvdXBfY2xhc3NpZCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19nZXRfY2dyb3VwX2NsYXNzaWQpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkuZXJyc3RyID0gIlIxICFyZWFkX29rIiwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkibm9uLWludmFsaWQgYXJndW1lbnQgcmVnaXN0ZXIiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NT1YsIEJQRl9SRUdfNiwgQlBGX1JFR18xKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX2dldF9jZ3JvdXBfY2xhc3NpZCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NT1YsIEJQRl9SRUdfMSwgQlBGX1JFR182KSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX2dldF9jZ3JvdXBfY2xhc3NpZCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKIAkJImNoZWNrIHZhbGlkIHNwaWxsL2ZpbGwiLAogCQkuaW5zbnMgPSB7CiAJCQkvKiBzcGlsbCBSMShjdHgpIGludG8gc3RhY2sgKi8KQEAgLTEyMTAsNiArMTI0Nyw1NCBAQAogCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCiAJfSwKIAl7CisJCSJyYXdfc3RhY2s6IHNrYl9sb2FkX2J5dGVzLCBuZWdhdGl2ZSBsZW4iLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NT1YsIEJQRl9SRUdfNiwgQlBGX1JFR18xMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNiwgLTgpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzMsIEJQRl9SRUdfNiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgLTgpLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfc2tiX2xvYWRfYnl0ZXMpLAorCQkJQlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIEJQRl9SRUdfNiwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5lcnJzdHIgPSAiaW52YWxpZCBzdGFjayB0eXBlIFIzIiwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkicmF3X3N0YWNrOiBza2JfbG9hZF9ieXRlcywgbmVnYXRpdmUgbGVuIDIiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NT1YsIEJQRl9SRUdfNiwgQlBGX1JFR18xMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNiwgLTgpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzMsIEJQRl9SRUdfNiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgfjApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfc2tiX2xvYWRfYnl0ZXMpLAorCQkJQlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIEJQRl9SRUdfNiwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5lcnJzdHIgPSAiaW52YWxpZCBzdGFjayB0eXBlIFIzIiwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkicmF3X3N0YWNrOiBza2JfbG9hZF9ieXRlcywgemVybyBsZW4iLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NT1YsIEJQRl9SRUdfNiwgQlBGX1JFR18xMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNiwgLTgpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzMsIEJQRl9SRUdfNiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19za2JfbG9hZF9ieXRlcyksCisJCQlCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgQlBGX1JFR182LCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIHN0YWNrIHR5cGUgUjMiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CiAJCSJyYXdfc3RhY2s6IHNrYl9sb2FkX2J5dGVzLCBubyBpbml0IiwKIAkJLmluc25zID0gewogCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzIsIDQpLApAQCAtMTQ0OSw3ICsxNTM0LDcgQEAKIAkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAogCX0sCiAJewotCQkicGt0OiB0ZXN0MSIsCisJCSJkaXJlY3QgcGFja2V0IGFjY2VzczogdGVzdDEiLAogCQkuaW5zbnMgPSB7CiAJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCiAJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKQEAgLTE0NjYsNyArMTU1MSw3IEBACiAJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKIAl9LAogCXsKLQkJInBrdDogdGVzdDIiLAorCQkiZGlyZWN0IHBhY2tldCBhY2Nlc3M6IHRlc3QyIiwKIAkJLmluc25zID0gewogCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDEpLAogCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNCwgQlBGX1JFR18xLApAQCAtMTQ5OSw3ICsxNTg0LDcgQEAKIAkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAogCX0sCiAJewotCQkicGt0OiB0ZXN0MyIsCisJCSJkaXJlY3QgcGFja2V0IGFjY2VzczogdGVzdDMiLAogCQkuaW5zbnMgPSB7CiAJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCiAJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKQEAgLTE1MTEsNyArMTU5Niw3IEBACiAJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIsCiAJfSwKIAl7Ci0JCSJwa3Q6IHRlc3Q0IiwKKwkJImRpcmVjdCBwYWNrZXQgYWNjZXNzOiB0ZXN0NCAod3JpdGUpIiwKIAkJLmluc25zID0gewogCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAogCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCkBAIC0xNTI0LDEwICsxNjA5LDc4MCBAQAogCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAogCQkJQlBGX0VYSVRfSU5TTigpLAogCQl9LAotCQkuZXJyc3RyID0gImNhbm5vdCB3cml0ZSIsCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImRpcmVjdCBwYWNrZXQgYWNjZXNzOiB0ZXN0NSAocGt0X2VuZCA+PSByZWcsIGdvb2QgYWNjZXNzKSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzAsIEJQRl9SRUdfMiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMCwgOCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdFLCBCUEZfUkVHXzMsIEJQRl9SRUdfMCwgMiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfTERYX01FTShCUEZfQiwgQlBGX1JFR18wLCBCUEZfUkVHXzIsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gQUNDRVBULAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJkaXJlY3QgcGFja2V0IGFjY2VzczogdGVzdDYgKHBrdF9lbmQgPj0gcmVnLCBiYWQgYWNjZXNzKSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzAsIEJQRl9SRUdfMiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMCwgOCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdFLCBCUEZfUkVHXzMsIEJQRl9SRUdfMCwgMyksCisJCQlCUEZfTERYX01FTShCUEZfQiwgQlBGX1JFR18wLCBCUEZfUkVHXzIsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCiAJCS5yZXN1bHQgPSBSRUpFQ1QsCiAJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKIAl9LAorCXsKKwkJImRpcmVjdCBwYWNrZXQgYWNjZXNzOiB0ZXN0NyAocGt0X2VuZCA+PSByZWcsIGJvdGggYWNjZXNzZXMpIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18zLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMCwgQlBGX1JFR18yKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18wLCA4KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR0UsIEJQRl9SRUdfMywgQlBGX1JFR18wLCAzKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9CLCBCUEZfUkVHXzAsIEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfTERYX01FTShCUEZfQiwgQlBGX1JFR18wLCBCUEZfUkVHXzIsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImRpcmVjdCBwYWNrZXQgYWNjZXNzOiB0ZXN0OCAoZG91YmxlIHRlc3QsIHZhcmlhbnQgMSkiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzMsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18wLCBCUEZfUkVHXzIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzAsIDgpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHRSwgQlBGX1JFR18zLCBCUEZfUkVHXzAsIDQpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR18wLCBCUEZfUkVHXzMsIDEpLAorCQkJQlBGX0xEWF9NRU0oQlBGX0IsIEJQRl9SRUdfMCwgQlBGX1JFR18yLCAwKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9CLCBCUEZfUkVHXzAsIEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImRpcmVjdCBwYWNrZXQgYWNjZXNzOiB0ZXN0OSAoZG91YmxlIHRlc3QsIHZhcmlhbnQgMikiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzMsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18wLCBCUEZfUkVHXzIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzAsIDgpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHRSwgQlBGX1JFR18zLCBCUEZfUkVHXzAsIDIpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR18wLCBCUEZfUkVHXzMsIDEpLAorCQkJQlBGX0xEWF9NRU0oQlBGX0IsIEJQRl9SRUdfMCwgQlBGX1JFR18yLCAwKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9CLCBCUEZfUkVHXzAsIEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImRpcmVjdCBwYWNrZXQgYWNjZXNzOiB0ZXN0MTAgKHdyaXRlIGludmFsaWQpIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18zLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMCwgQlBGX1JFR18yKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18wLCA4KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfMCwgQlBGX1JFR18zLCAyKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9TVFhfTUVNKEJQRl9CLCBCUEZfUkVHXzIsIEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5lcnJzdHIgPSAiaW52YWxpZCBhY2Nlc3MgdG8gcGFja2V0IiwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkiaGVscGVyIGFjY2VzcyB0byBwYWNrZXQ6IHRlc3QxLCB2YWxpZCBwYWNrZXRfcHRyIHJhbmdlIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgeGRwX21kLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18zLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCB4ZHBfbWQsIGRhdGFfZW5kKSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMSwgQlBGX1JFR18yKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18xLCA4KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfMSwgQlBGX1JFR18zLCA1KSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18zLCBCUEZfUkVHXzIpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzQsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX3VwZGF0ZV9lbGVtKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLmZpeHVwID0gezV9LAorCQkucmVzdWx0X3VucHJpdiA9IEFDQ0VQVCwKKwkJLnJlc3VsdCA9IEFDQ0VQVCwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfWERQLAorCX0sCisJeworCQkiaGVscGVyIGFjY2VzcyB0byBwYWNrZXQ6IHRlc3QyLCB1bmNoZWNrZWQgcGFja2V0X3B0ciIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHhkcF9tZCwgZGF0YSkpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLmZpeHVwID0gezF9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1hEUCwKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MywgdmFyaWFibGUgYWRkIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAorCQkJCQlvZmZzZXRvZihzdHJ1Y3QgeGRwX21kLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18zLCBCUEZfUkVHXzEsCisJCQkJCW9mZnNldG9mKHN0cnVjdCB4ZHBfbWQsIGRhdGFfZW5kKSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfNCwgQlBGX1JFR18yKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR180LCA4KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfNCwgQlBGX1JFR18zLCAxMCksCisJCQlCUEZfTERYX01FTShCUEZfQiwgQlBGX1JFR181LCBCUEZfUkVHXzIsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzQsIEJQRl9SRUdfMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIEJQRl9SRUdfNCwgQlBGX1JFR181KSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR181LCBCUEZfUkVHXzQpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzUsIDgpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR181LCBCUEZfUkVHXzMsIDQpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzIsIEJQRl9SRUdfNCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkuZml4dXAgPSB7MTF9LAorCQkucmVzdWx0ID0gQUNDRVBULAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9YRFAsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDQsIHBhY2tldF9wdHIgd2l0aCBiYWQgcmFuZ2UiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCB4ZHBfbWQsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzMsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHhkcF9tZCwgZGF0YV9lbmQpKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR180LCBCUEZfUkVHXzIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzQsIDQpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR180LCBCUEZfUkVHXzMsIDIpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLmZpeHVwID0gezd9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1hEUCwKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0NSwgcGFja2V0X3B0ciB3aXRoIHRvbyBzaG9ydCByYW5nZSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHhkcF9tZCwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgeGRwX21kLCBkYXRhX2VuZCkpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzIsIDEpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzQsIEJQRl9SRUdfMiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNCwgNyksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzQsIEJQRl9SRUdfMywgMyksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkuZml4dXAgPSB7Nn0sCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5lcnJzdHIgPSAiaW52YWxpZCBhY2Nlc3MgdG8gcGFja2V0IiwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfWERQLAorCX0sCisJeworCQkiaGVscGVyIGFjY2VzcyB0byBwYWNrZXQ6IHRlc3Q2LCBjbHMgdmFsaWQgcGFja2V0X3B0ciByYW5nZSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfMiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMSwgOCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzEsIEJQRl9SRUdfMywgNSksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMywgQlBGX1JFR18yKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR180LCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF91cGRhdGVfZWxlbSksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5maXh1cCA9IHs1fSwKKwkJLnJlc3VsdCA9IEFDQ0VQVCwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkiaGVscGVyIGFjY2VzcyB0byBwYWNrZXQ6IHRlc3Q3LCBjbHMgdW5jaGVja2VkIHBhY2tldF9wdHIiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5maXh1cCA9IHsxfSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBwYWNrZXQiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDgsIGNscyB2YXJpYWJsZSBhZGQiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCisJCQkJCW9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzMsIEJQRl9SRUdfMSwKKwkJCQkJb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR180LCBCUEZfUkVHXzIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzQsIDgpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR180LCBCUEZfUkVHXzMsIDEwKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9CLCBCUEZfUkVHXzUsIEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfNCwgQlBGX1JFR18yKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgQlBGX1JFR180LCBCUEZfUkVHXzUpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzUsIEJQRl9SRUdfNCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNSwgOCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzUsIEJQRl9SRUdfMywgNCksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMiwgQlBGX1JFR180KSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5maXh1cCA9IHsxMX0sCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0OSwgY2xzIHBhY2tldF9wdHIgd2l0aCBiYWQgcmFuZ2UiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzMsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR180LCBCUEZfUkVHXzIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzQsIDQpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR180LCBCUEZfUkVHXzMsIDIpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLmZpeHVwID0gezd9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MTAsIGNscyBwYWNrZXRfcHRyIHdpdGggdG9vIHNob3J0IHJhbmdlIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18zLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMiwgMSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfNCwgQlBGX1JFR18yKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR180LCA3KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfNCwgQlBGX1JFR18zLCAzKSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5maXh1cCA9IHs2fSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBwYWNrZXQiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDExLCBjbHMgdW5zdWl0YWJsZSBoZWxwZXIgMSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzYsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzYsIDEpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzMsIEJQRl9SRUdfNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMywgNyksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzMsIEJQRl9SRUdfNywgNCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgNDIpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzUsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfc2tiX3N0b3JlX2J5dGVzKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJoZWxwZXIgYWNjZXNzIHRvIHRoZSBwYWNrZXQiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDEyLCBjbHMgdW5zdWl0YWJsZSBoZWxwZXIgMiIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzYsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzMsIEJQRl9SRUdfNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNiwgOCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzYsIEJQRl9SRUdfNywgMyksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgNCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19za2JfbG9hZF9ieXRlcyksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5lcnJzdHIgPSAiaGVscGVyIGFjY2VzcyB0byB0aGUgcGFja2V0IiwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkiaGVscGVyIGFjY2VzcyB0byBwYWNrZXQ6IHRlc3QxMywgY2xzIGhlbHBlciBvayIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzYsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzYsIDEpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMSwgNyksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzEsIEJQRl9SRUdfNywgNiksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMSwgQlBGX1JFR182KSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18yLCA0KSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18zLCAwKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR180LCAwKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR181LCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX2NzdW1fZGlmZiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MTQsIGNscyBoZWxwZXIgZmFpbCBzdWIiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR182LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzcsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR182LCAxKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzYpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzEsIDcpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR18xLCBCUEZfUkVHXzcsIDYpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfU1VCLCBCUEZfUkVHXzEsIDQpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzIsIDQpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzMsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzQsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzUsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfY3N1bV9kaWZmKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJ0eXBlPWludiBleHBlY3RlZD1mcCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MTUsIGNscyBoZWxwZXIgZmFpbCByYW5nZSAxIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR183LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNiwgMSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMSwgQlBGX1JFR182KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18xLCA3KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfMSwgQlBGX1JFR183LCA2KSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzIsIDgpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzMsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzQsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzUsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfY3N1bV9kaWZmKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBwYWNrZXQiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDE2LCBjbHMgaGVscGVyIGZhaWwgcmFuZ2UgMiIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzYsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzYsIDEpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMSwgNyksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzEsIEJQRl9SRUdfNywgNiksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMSwgQlBGX1JFR182KSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18yLCAtOSksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMywgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19jc3VtX2RpZmYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MTcsIGNscyBoZWxwZXIgZmFpbCByYW5nZSAzIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR183LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNiwgMSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMSwgQlBGX1JFR182KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18xLCA3KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfMSwgQlBGX1JFR183LCA2KSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzIsIH4wKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18zLCAwKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR180LCAwKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR181LCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX2NzdW1fZGlmZiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5lcnJzdHIgPSAiaW52YWxpZCBhY2Nlc3MgdG8gcGFja2V0IiwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkiaGVscGVyIGFjY2VzcyB0byBwYWNrZXQ6IHRlc3QxOCwgY2xzIGhlbHBlciBmYWlsIHJhbmdlIHplcm8iLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR182LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzcsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR182LCAxKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzYpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzEsIDcpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR18xLCBCUEZfUkVHXzcsIDYpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfNiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMywgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19jc3VtX2RpZmYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MTksIHBrdCBlbmQgYXMgaW5wdXQiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR182LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzcsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR182LCAxKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzYpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzEsIDcpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR18xLCBCUEZfUkVHXzcsIDYpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfNyksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgNCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMywgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19jc3VtX2RpZmYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gIlIxIHR5cGU9cGt0X2VuZCBleHBlY3RlZD1mcCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MjAsIHdyb25nIHJlZyIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzYsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzYsIDEpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMSwgNyksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzEsIEJQRl9SRUdfNywgNiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgNCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMywgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19jc3VtX2RpZmYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJInZhbGlkIG1hcCBhY2Nlc3MgaW50byBhbiBhcnJheSB3aXRoIGEgY29uc3RhbnQiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18xMCwgLTgsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzIsIEJQRl9SRUdfMTApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzIsIC04KSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfSk1QX0lNTShCUEZfSkVRLCBCUEZfUkVHXzAsIDAsIDEpLAorCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgMCwgb2Zmc2V0b2Yoc3RydWN0IHRlc3RfdmFsLCBmb28pKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnRlc3RfdmFsX21hcF9maXh1cCA9IHszfSwKKwkJLmVycnN0cl91bnByaXYgPSAiUjAgbGVha3MgYWRkciIsCisJCS5yZXN1bHRfdW5wcml2ID0gUkVKRUNULAorCQkucmVzdWx0ID0gQUNDRVBULAorCX0sCisJeworCQkidmFsaWQgbWFwIGFjY2VzcyBpbnRvIGFuIGFycmF5IHdpdGggYSByZWdpc3RlciIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzEwLCAtOCwgMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMiwgQlBGX1JFR18xMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMiwgLTgpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgNCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMSwgNCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9MU0gsIEJQRl9SRUdfMSwgMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIEJQRl9SRUdfMCwgQlBGX1JFR18xKSwKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIDAsIG9mZnNldG9mKHN0cnVjdCB0ZXN0X3ZhbCwgZm9vKSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS50ZXN0X3ZhbF9tYXBfZml4dXAgPSB7M30sCisJCS5lcnJzdHJfdW5wcml2ID0gIlIwIGxlYWtzIGFkZHIiLAorCQkucmVzdWx0X3VucHJpdiA9IFJFSkVDVCwKKwkJLnJlc3VsdCA9IEFDQ0VQVCwKKwl9LAorCXsKKwkJInZhbGlkIG1hcCBhY2Nlc3MgaW50byBhbiBhcnJheSB3aXRoIGEgdmFyaWFibGUiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18xMCwgLTgsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzIsIEJQRl9SRUdfMTApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzIsIC04KSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfSk1QX0lNTShCUEZfSkVRLCBCUEZfUkVHXzAsIDAsIDUpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMSwgQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KR0UsIEJQRl9SRUdfMSwgTUFYX0VOVFJJRVMsIDMpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTFNILCBCUEZfUkVHXzEsIDIpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBCUEZfUkVHXzAsIEJQRl9SRUdfMSksCisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18wLCAwLCBvZmZzZXRvZihzdHJ1Y3QgdGVzdF92YWwsIGZvbykpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkudGVzdF92YWxfbWFwX2ZpeHVwID0gezN9LAorCQkuZXJyc3RyX3VucHJpdiA9ICJSMCBsZWFrcyBhZGRyIiwKKwkJLnJlc3VsdF91bnByaXYgPSBSRUpFQ1QsCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJfSwKKwl7CisJCSJ2YWxpZCBtYXAgYWNjZXNzIGludG8gYW4gYXJyYXkgd2l0aCBhIHNpZ25lZCB2YXJpYWJsZSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzEwLCAtOCwgMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMiwgQlBGX1JFR18xMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMiwgLTgpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgOSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18xLCBCUEZfUkVHXzAsIDApLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pTR1QsIEJQRl9SRUdfMSwgMHhmZmZmZmZmZiwgMSksCisJCQlCUEZfTU9WMzJfSU1NKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfTU9WMzJfSU1NKEJQRl9SRUdfMiwgTUFYX0VOVFJJRVMpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pTR1QsIEJQRl9SRUdfMiwgQlBGX1JFR18xLCAxKSwKKwkJCUJQRl9NT1YzMl9JTU0oQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX0xTSCwgQlBGX1JFR18xLCAyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgQlBGX1JFR18wLCBCUEZfUkVHXzEpLAorCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgMCwgb2Zmc2V0b2Yoc3RydWN0IHRlc3RfdmFsLCBmb28pKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnRlc3RfdmFsX21hcF9maXh1cCA9IHszfSwKKwkJLmVycnN0cl91bnByaXYgPSAiUjAgbGVha3MgYWRkciIsCisJCS5yZXN1bHRfdW5wcml2ID0gUkVKRUNULAorCQkucmVzdWx0ID0gQUNDRVBULAorCX0sCisJeworCQkiaW52YWxpZCBtYXAgYWNjZXNzIGludG8gYW4gYXJyYXkgd2l0aCBhIGNvbnN0YW50IiwKKwkJLmluc25zID0geworCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMTAsIC04LCAwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18yLCBCUEZfUkVHXzEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18yLCAtOCksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgQlBGX1JFR18wLCAwLCAxKSwKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIChNQVhfRU5UUklFUyArIDEpIDw8IDIsCisJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IHRlc3RfdmFsLCBmb28pKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnRlc3RfdmFsX21hcF9maXh1cCA9IHszfSwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBtYXAgdmFsdWUsIHZhbHVlX3NpemU9NDggb2ZmPTQ4IHNpemU9OCIsCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJfSwKKwl7CisJCSJpbnZhbGlkIG1hcCBhY2Nlc3MgaW50byBhbiBhcnJheSB3aXRoIGEgcmVnaXN0ZXIiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18xMCwgLTgsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzIsIEJQRl9SRUdfMTApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzIsIC04KSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfSk1QX0lNTShCUEZfSkVRLCBCUEZfUkVHXzAsIDAsIDQpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzEsIE1BWF9FTlRSSUVTICsgMSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9MU0gsIEJQRl9SRUdfMSwgMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIEJQRl9SRUdfMCwgQlBGX1JFR18xKSwKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIDAsIG9mZnNldG9mKHN0cnVjdCB0ZXN0X3ZhbCwgZm9vKSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS50ZXN0X3ZhbF9tYXBfZml4dXAgPSB7M30sCisJCS5lcnJzdHIgPSAiUjAgbWluIHZhbHVlIGlzIG91dHNpZGUgb2YgdGhlIGFycmF5IHJhbmdlIiwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwl9LAorCXsKKwkJImludmFsaWQgbWFwIGFjY2VzcyBpbnRvIGFuIGFycmF5IHdpdGggYSB2YXJpYWJsZSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzEwLCAtOCwgMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMiwgQlBGX1JFR18xMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMiwgLTgpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgNCksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18xLCBCUEZfUkVHXzAsIDApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTFNILCBCUEZfUkVHXzEsIDIpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBCUEZfUkVHXzAsIEJQRl9SRUdfMSksCisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18wLCAwLCBvZmZzZXRvZihzdHJ1Y3QgdGVzdF92YWwsIGZvbykpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkudGVzdF92YWxfbWFwX2ZpeHVwID0gezN9LAorCQkuZXJyc3RyID0gIlIwIG1pbiB2YWx1ZSBpcyBuZWdhdGl2ZSwgZWl0aGVyIHVzZSB1bnNpZ25lZCBpbmRleCBvciBkbyBhIGlmIChpbmRleCA+PTApIGNoZWNrLiIsCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJfSwKKwl7CisJCSJpbnZhbGlkIG1hcCBhY2Nlc3MgaW50byBhbiBhcnJheSB3aXRoIG5vIGZsb29yIGNoZWNrIiwKKwkJLmluc25zID0geworCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMTAsIC04LCAwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18yLCBCUEZfUkVHXzEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18yLCAtOCksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgQlBGX1JFR18wLCAwLCA3KSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzEsIEJQRl9SRUdfMCwgMCksCisJCQlCUEZfTU9WMzJfSU1NKEJQRl9SRUdfMiwgTUFYX0VOVFJJRVMpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pTR1QsIEJQRl9SRUdfMiwgQlBGX1JFR18xLCAxKSwKKwkJCUJQRl9NT1YzMl9JTU0oQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX0xTSCwgQlBGX1JFR18xLCAyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgQlBGX1JFR18wLCBCUEZfUkVHXzEpLAorCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgMCwgb2Zmc2V0b2Yoc3RydWN0IHRlc3RfdmFsLCBmb28pKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnRlc3RfdmFsX21hcF9maXh1cCA9IHszfSwKKwkJLmVycnN0ciA9ICJSMCBtaW4gdmFsdWUgaXMgbmVnYXRpdmUsIGVpdGhlciB1c2UgdW5zaWduZWQgaW5kZXggb3IgZG8gYSBpZiAoaW5kZXggPj0wKSBjaGVjay4iLAorCQkucmVzdWx0ID0gUkVKRUNULAorCX0sCisJeworCQkiaW52YWxpZCBtYXAgYWNjZXNzIGludG8gYW4gYXJyYXkgd2l0aCBhIGludmFsaWQgbWF4IGNoZWNrIiwKKwkJLmluc25zID0geworCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMTAsIC04LCAwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18yLCBCUEZfUkVHXzEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18yLCAtOCksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgQlBGX1JFR18wLCAwLCA3KSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzEsIEJQRl9SRUdfMCwgMCksCisJCQlCUEZfTU9WMzJfSU1NKEJQRl9SRUdfMiwgTUFYX0VOVFJJRVMgKyAxKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfMiwgQlBGX1JFR18xLCAxKSwKKwkJCUJQRl9NT1YzMl9JTU0oQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX0xTSCwgQlBGX1JFR18xLCAyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgQlBGX1JFR18wLCBCUEZfUkVHXzEpLAorCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgMCwgb2Zmc2V0b2Yoc3RydWN0IHRlc3RfdmFsLCBmb28pKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnRlc3RfdmFsX21hcF9maXh1cCA9IHszfSwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBtYXAgdmFsdWUsIHZhbHVlX3NpemU9NDggb2ZmPTQ0IHNpemU9OCIsCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJfSwKKwl7CisJCSJpbnZhbGlkIG1hcCBhY2Nlc3MgaW50byBhbiBhcnJheSB3aXRoIGEgaW52YWxpZCBtYXggY2hlY2siLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18xMCwgLTgsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzIsIEJQRl9SRUdfMTApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzIsIC04KSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfSk1QX0lNTShCUEZfSkVRLCBCUEZfUkVHXzAsIDAsIDEwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR184LCBCUEZfUkVHXzApLAorCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMTAsIC04LCAwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18yLCBCUEZfUkVHXzEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18yLCAtOCksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgQlBGX1JFR18wLCAwLCAyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgQlBGX1JFR18wLCBCUEZfUkVHXzgpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMCwgQlBGX1JFR18wLCBvZmZzZXRvZihzdHJ1Y3QgdGVzdF92YWwsIGZvbykpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkudGVzdF92YWxfbWFwX2ZpeHVwID0gezMsIDExfSwKKwkJLmVycnN0ciA9ICJSMCBtaW4gdmFsdWUgaXMgbmVnYXRpdmUsIGVpdGhlciB1c2UgdW5zaWduZWQgaW5kZXggb3IgZG8gYSBpZiAoaW5kZXggPj0wKSBjaGVjay4iLAorCQkucmVzdWx0ID0gUkVKRUNULAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHByb2JlX2ZpbHRlcl9sZW5ndGgoc3RydWN0IGJwZl9pbnNuICpmcCkKQEAgLTE1NDEsMTIgKzIzOTYsMTIgQEAKIAlyZXR1cm4gbGVuICsgMTsKIH0KIAotc3RhdGljIGludCBjcmVhdGVfbWFwKHZvaWQpCitzdGF0aWMgaW50IGNyZWF0ZV9tYXAoc2l6ZV90IHZhbF9zaXplLCBpbnQgbnVtKQogewogCWludCBtYXBfZmQ7CiAKIAltYXBfZmQgPSBicGZfY3JlYXRlX21hcChCUEZfTUFQX1RZUEVfSEFTSCwKLQkJCQlzaXplb2YobG9uZyBsb25nKSwgc2l6ZW9mKGxvbmcgbG9uZyksIDEwMjQsIDApOworCQkJCXNpemVvZihsb25nIGxvbmcpLCB2YWxfc2l6ZSwgbnVtLCAwKTsKIAlpZiAobWFwX2ZkIDwgMCkKIAkJcHJpbnRmKCJmYWlsZWQgdG8gY3JlYXRlIG1hcCAnJXMnXG4iLCBzdHJlcnJvcihlcnJubykpOwogCkBAIC0xNTc2LDEyICsyNDMxLDEzIEBACiAJCWludCBwcm9nX2xlbiA9IHByb2JlX2ZpbHRlcl9sZW5ndGgocHJvZyk7CiAJCWludCAqZml4dXAgPSB0ZXN0c1tpXS5maXh1cDsKIAkJaW50ICpwcm9nX2FycmF5X2ZpeHVwID0gdGVzdHNbaV0ucHJvZ19hcnJheV9maXh1cDsKKwkJaW50ICp0ZXN0X3ZhbF9tYXBfZml4dXAgPSB0ZXN0c1tpXS50ZXN0X3ZhbF9tYXBfZml4dXA7CiAJCWludCBleHBlY3RlZF9yZXN1bHQ7CiAJCWNvbnN0IGNoYXIgKmV4cGVjdGVkX2VycnN0cjsKLQkJaW50IG1hcF9mZCA9IC0xLCBwcm9nX2FycmF5X2ZkID0gLTE7CisJCWludCBtYXBfZmQgPSAtMSwgcHJvZ19hcnJheV9mZCA9IC0xLCB0ZXN0X3ZhbF9tYXBfZmQgPSAtMTsKIAogCQlpZiAoKmZpeHVwKSB7Ci0JCQltYXBfZmQgPSBjcmVhdGVfbWFwKCk7CisJCQltYXBfZmQgPSBjcmVhdGVfbWFwKHNpemVvZihsb25nIGxvbmcpLCAxMDI0KTsKIAogCQkJZG8gewogCQkJCXByb2dbKmZpeHVwXS5pbW0gPSBtYXBfZmQ7CkBAIC0xNTk2LDYgKzI0NTIsMTggQEAKIAkJCQlwcm9nX2FycmF5X2ZpeHVwKys7CiAJCQl9IHdoaWxlICgqcHJvZ19hcnJheV9maXh1cCk7CiAJCX0KKwkJaWYgKCp0ZXN0X3ZhbF9tYXBfZml4dXApIHsKKwkJCS8qIFVucHJpdmlsZWdlZCBjYW4ndCBjcmVhdGUgYSBoYXNoIG1hcC4qLworCQkJaWYgKHVucHJpdikKKwkJCQljb250aW51ZTsKKwkJCXRlc3RfdmFsX21hcF9mZCA9IGNyZWF0ZV9tYXAoc2l6ZW9mKHN0cnVjdCB0ZXN0X3ZhbCksCisJCQkJCQkgICAgIDI1Nik7CisJCQlkbyB7CisJCQkJcHJvZ1sqdGVzdF92YWxfbWFwX2ZpeHVwXS5pbW0gPSB0ZXN0X3ZhbF9tYXBfZmQ7CisJCQkJdGVzdF92YWxfbWFwX2ZpeHVwKys7CisJCQl9IHdoaWxlICgqdGVzdF92YWxfbWFwX2ZpeHVwKTsKKwkJfQorCiAJCXByaW50ZigiIyVkICVzICIsIGksIHRlc3RzW2ldLmRlc2NyKTsKIAogCQlwcm9nX2ZkID0gYnBmX3Byb2dfbG9hZChwcm9nX3R5cGUgPzogQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLApAQCAtMTY0Miw2ICsyNTEwLDggQEAKIAkJCWNsb3NlKG1hcF9mZCk7CiAJCWlmIChwcm9nX2FycmF5X2ZkID49IDApCiAJCQljbG9zZShwcm9nX2FycmF5X2ZkKTsKKwkJaWYgKHRlc3RfdmFsX21hcF9mZCA+PSAwKQorCQkJY2xvc2UodGVzdF92YWxfbWFwX2ZkKTsKIAkJY2xvc2UocHJvZ19mZCk7CiAKIAl9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90cmFjZV9ldmVudF9rZXJuLmMgYi9zYW1wbGVzL2JwZi90cmFjZV9ldmVudF9rZXJuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhOGVkMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvYnBmL3RyYWNlX2V2ZW50X2tlcm4uYwpAQCAtMCwwICsxLDY1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTYgRmFjZWJvb2sKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvYnBmLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9icGZfcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgImJwZl9oZWxwZXJzLmgiCisKK3N0cnVjdCBrZXlfdCB7CisJY2hhciBjb21tW1RBU0tfQ09NTV9MRU5dOworCXUzMiBrZXJuc3RhY2s7CisJdTMyIHVzZXJzdGFjazsKK307CisKK3N0cnVjdCBicGZfbWFwX2RlZiBTRUMoIm1hcHMiKSBjb3VudHMgPSB7CisJLnR5cGUgPSBCUEZfTUFQX1RZUEVfSEFTSCwKKwkua2V5X3NpemUgPSBzaXplb2Yoc3RydWN0IGtleV90KSwKKwkudmFsdWVfc2l6ZSA9IHNpemVvZih1NjQpLAorCS5tYXhfZW50cmllcyA9IDEwMDAwLAorfTsKKworc3RydWN0IGJwZl9tYXBfZGVmIFNFQygibWFwcyIpIHN0YWNrbWFwID0geworCS50eXBlID0gQlBGX01BUF9UWVBFX1NUQUNLX1RSQUNFLAorCS5rZXlfc2l6ZSA9IHNpemVvZih1MzIpLAorCS52YWx1ZV9zaXplID0gUEVSRl9NQVhfU1RBQ0tfREVQVEggKiBzaXplb2YodTY0KSwKKwkubWF4X2VudHJpZXMgPSAxMDAwMCwKK307CisKKyNkZWZpbmUgS0VSTl9TVEFDS0lEX0ZMQUdTICgwIHwgQlBGX0ZfRkFTVF9TVEFDS19DTVApCisjZGVmaW5lIFVTRVJfU1RBQ0tJRF9GTEFHUyAoMCB8IEJQRl9GX0ZBU1RfU1RBQ0tfQ01QIHwgQlBGX0ZfVVNFUl9TVEFDSykKKworU0VDKCJwZXJmX2V2ZW50IikKK2ludCBicGZfcHJvZzEoc3RydWN0IGJwZl9wZXJmX2V2ZW50X2RhdGEgKmN0eCkKK3sKKwljaGFyIGZtdFtdID0gIkNQVS0lZCBwZXJpb2QgJWxsZCBpcCAlbGx4IjsKKwl1MzIgY3B1ID0gYnBmX2dldF9zbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IGtleV90IGtleTsKKwl1NjQgKnZhbCwgb25lID0gMTsKKworCWlmIChjdHgtPnNhbXBsZV9wZXJpb2QgPCAxMDAwMCkKKwkJLyogaWdub3JlIHdhcm11cCAqLworCQlyZXR1cm4gMDsKKwlicGZfZ2V0X2N1cnJlbnRfY29tbSgma2V5LmNvbW0sIHNpemVvZihrZXkuY29tbSkpOworCWtleS5rZXJuc3RhY2sgPSBicGZfZ2V0X3N0YWNraWQoY3R4LCAmc3RhY2ttYXAsIEtFUk5fU1RBQ0tJRF9GTEFHUyk7CisJa2V5LnVzZXJzdGFjayA9IGJwZl9nZXRfc3RhY2tpZChjdHgsICZzdGFja21hcCwgVVNFUl9TVEFDS0lEX0ZMQUdTKTsKKwlpZiAoKGludClrZXkua2VybnN0YWNrIDwgMCAmJiAoaW50KWtleS51c2Vyc3RhY2sgPCAwKSB7CisJCWJwZl90cmFjZV9wcmludGsoZm10LCBzaXplb2YoZm10KSwgY3B1LCBjdHgtPnNhbXBsZV9wZXJpb2QsCisJCQkJIGN0eC0+cmVncy5pcCk7CisJCXJldHVybiAwOworCX0KKworCXZhbCA9IGJwZl9tYXBfbG9va3VwX2VsZW0oJmNvdW50cywgJmtleSk7CisJaWYgKHZhbCkKKwkJKCp2YWwpKys7CisJZWxzZQorCQlicGZfbWFwX3VwZGF0ZV9lbGVtKCZjb3VudHMsICZrZXksICZvbmUsIEJQRl9OT0VYSVNUKTsKKwlyZXR1cm4gMDsKK30KKworY2hhciBfbGljZW5zZVtdIFNFQygibGljZW5zZSIpID0gIkdQTCI7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90cmFjZV9ldmVudF91c2VyLmMgYi9zYW1wbGVzL2JwZi90cmFjZV9ldmVudF91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExMzBkMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2JwZi90cmFjZV9ldmVudF91c2VyLmMKQEAgLTAsMCArMSwyMTMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiBGYWNlYm9vaworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CisjaW5jbHVkZSA8bGludXgvYnBmLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlICJsaWJicGYuaCIKKyNpbmNsdWRlICJicGZfbG9hZC5oIgorCisjZGVmaW5lIFNBTVBMRV9GUkVRIDUwCisKK3N0YXRpYyBib29sIHN5c19yZWFkX3NlZW4sIHN5c193cml0ZV9zZWVuOworCitzdGF0aWMgdm9pZCBwcmludF9rc3ltKF9fdTY0IGFkZHIpCit7CisJc3RydWN0IGtzeW0gKnN5bTsKKworCWlmICghYWRkcikKKwkJcmV0dXJuOworCXN5bSA9IGtzeW1fc2VhcmNoKGFkZHIpOworCXByaW50ZigiJXM7Iiwgc3ltLT5uYW1lKTsKKwlpZiAoIXN0cmNtcChzeW0tPm5hbWUsICJzeXNfcmVhZCIpKQorCQlzeXNfcmVhZF9zZWVuID0gdHJ1ZTsKKwllbHNlIGlmICghc3RyY21wKHN5bS0+bmFtZSwgInN5c193cml0ZSIpKQorCQlzeXNfd3JpdGVfc2VlbiA9IHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2FkZHIoX191NjQgYWRkcikKK3sKKwlpZiAoIWFkZHIpCisJCXJldHVybjsKKwlwcmludGYoIiVsbHg7IiwgYWRkcik7Cit9CisKKyNkZWZpbmUgVEFTS19DT01NX0xFTiAxNgorCitzdHJ1Y3Qga2V5X3QgeworCWNoYXIgY29tbVtUQVNLX0NPTU1fTEVOXTsKKwlfX3UzMiBrZXJuc3RhY2s7CisJX191MzIgdXNlcnN0YWNrOworfTsKKworc3RhdGljIHZvaWQgcHJpbnRfc3RhY2soc3RydWN0IGtleV90ICprZXksIF9fdTY0IGNvdW50KQoreworCV9fdTY0IGlwW1BFUkZfTUFYX1NUQUNLX0RFUFRIXSA9IHt9OworCXN0YXRpYyBib29sIHdhcm5lZDsKKwlpbnQgaTsKKworCXByaW50ZigiJTNsbGQgJXM7IiwgY291bnQsIGtleS0+Y29tbSk7CisJaWYgKGJwZl9sb29rdXBfZWxlbShtYXBfZmRbMV0sICZrZXktPmtlcm5zdGFjaywgaXApICE9IDApIHsKKwkJcHJpbnRmKCItLS07Iik7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gUEVSRl9NQVhfU1RBQ0tfREVQVEggLSAxOyBpID49IDA7IGktLSkKKwkJCXByaW50X2tzeW0oaXBbaV0pOworCX0KKwlwcmludGYoIi07Iik7CisJaWYgKGJwZl9sb29rdXBfZWxlbShtYXBfZmRbMV0sICZrZXktPnVzZXJzdGFjaywgaXApICE9IDApIHsKKwkJcHJpbnRmKCItLS07Iik7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gUEVSRl9NQVhfU1RBQ0tfREVQVEggLSAxOyBpID49IDA7IGktLSkKKwkJCXByaW50X2FkZHIoaXBbaV0pOworCX0KKwlwcmludGYoIlxuIik7CisKKwlpZiAoa2V5LT5rZXJuc3RhY2sgPT0gLUVFWElTVCAmJiAhd2FybmVkKSB7CisJCXByaW50Zigic3RhY2ttYXAgY29sbGlzaW9ucyBzZWVuLiBDb25zaWRlciBpbmNyZWFzaW5nIHNpemVcbiIpOworCQl3YXJuZWQgPSB0cnVlOworCX0gZWxzZSBpZiAoKGludClrZXktPmtlcm5zdGFjayA8IDAgJiYgKGludClrZXktPnVzZXJzdGFjayA8IDApIHsKKwkJcHJpbnRmKCJlcnIgc3RhY2tpZCAlZCAlZFxuIiwga2V5LT5rZXJuc3RhY2ssIGtleS0+dXNlcnN0YWNrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGludF9leGl0KGludCBzaWcpCit7CisJa2lsbCgwLCBTSUdLSUxMKTsKKwlleGl0KDApOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdGFja3Modm9pZCkKK3sKKwlzdHJ1Y3Qga2V5X3Qga2V5ID0ge30sIG5leHRfa2V5OworCV9fdTY0IHZhbHVlOworCV9fdTMyIHN0YWNraWQgPSAwLCBuZXh0X2lkOworCWludCBmZCA9IG1hcF9mZFswXSwgc3RhY2tfbWFwID0gbWFwX2ZkWzFdOworCisJc3lzX3JlYWRfc2VlbiA9IHN5c193cml0ZV9zZWVuID0gZmFsc2U7CisJd2hpbGUgKGJwZl9nZXRfbmV4dF9rZXkoZmQsICZrZXksICZuZXh0X2tleSkgPT0gMCkgeworCQlicGZfbG9va3VwX2VsZW0oZmQsICZuZXh0X2tleSwgJnZhbHVlKTsKKwkJcHJpbnRfc3RhY2soJm5leHRfa2V5LCB2YWx1ZSk7CisJCWJwZl9kZWxldGVfZWxlbShmZCwgJm5leHRfa2V5KTsKKwkJa2V5ID0gbmV4dF9rZXk7CisJfQorCisJaWYgKCFzeXNfcmVhZF9zZWVuIHx8ICFzeXNfd3JpdGVfc2VlbikgeworCQlwcmludGYoIkJVRyBrZXJuZWwgc3RhY2sgZG9lc24ndCBjb250YWluIHN5c19yZWFkKCkgYW5kIHN5c193cml0ZSgpXG4iKTsKKwkJaW50X2V4aXQoMCk7CisJfQorCisJLyogY2xlYXIgc3RhY2sgbWFwICovCisJd2hpbGUgKGJwZl9nZXRfbmV4dF9rZXkoc3RhY2tfbWFwLCAmc3RhY2tpZCwgJm5leHRfaWQpID09IDApIHsKKwkJYnBmX2RlbGV0ZV9lbGVtKHN0YWNrX21hcCwgJm5leHRfaWQpOworCQlzdGFja2lkID0gbmV4dF9pZDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfcGVyZl9ldmVudF9hbGxfY3B1KHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIpCit7CisJaW50IG5yX2NwdXMgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19DT05GKTsKKwlpbnQgKnBtdV9mZCA9IG1hbGxvYyhucl9jcHVzICogc2l6ZW9mKGludCkpOworCWludCBpOworCisJLyogb3BlbiBwZXJmX2V2ZW50IG9uIGFsbCBjcHVzICovCisJZm9yIChpID0gMDsgaSA8IG5yX2NwdXM7IGkrKykgeworCQlwbXVfZmRbaV0gPSBwZXJmX2V2ZW50X29wZW4oYXR0ciwgLTEsIGksIC0xLCAwKTsKKwkJaWYgKHBtdV9mZFtpXSA8IDApIHsKKwkJCXByaW50ZigicGVyZl9ldmVudF9vcGVuIGZhaWxlZFxuIik7CisJCQlnb3RvIGFsbF9jcHVfZXJyOworCQl9CisJCWFzc2VydChpb2N0bChwbXVfZmRbaV0sIFBFUkZfRVZFTlRfSU9DX1NFVF9CUEYsIHByb2dfZmRbMF0pID09IDApOworCQlhc3NlcnQoaW9jdGwocG11X2ZkW2ldLCBQRVJGX0VWRU5UX0lPQ19FTkFCTEUsIDApID09IDApOworCX0KKwlzeXN0ZW0oImRkIGlmPS9kZXYvemVybyBvZj0vZGV2L251bGwgY291bnQ9NTAwMGsiKTsKKwlwcmludF9zdGFja3MoKTsKK2FsbF9jcHVfZXJyOgorCWZvciAoaS0tOyBpID49IDA7IGktLSkKKwkJY2xvc2UocG11X2ZkW2ldKTsKKwlmcmVlKHBtdV9mZCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfcGVyZl9ldmVudF90YXNrKHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIpCit7CisJaW50IHBtdV9mZDsKKworCS8qIG9wZW4gdGFzayBib3VuZCBldmVudCAqLworCXBtdV9mZCA9IHBlcmZfZXZlbnRfb3BlbihhdHRyLCAwLCAtMSwgLTEsIDApOworCWlmIChwbXVfZmQgPCAwKSB7CisJCXByaW50ZigicGVyZl9ldmVudF9vcGVuIGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisJYXNzZXJ0KGlvY3RsKHBtdV9mZCwgUEVSRl9FVkVOVF9JT0NfU0VUX0JQRiwgcHJvZ19mZFswXSkgPT0gMCk7CisJYXNzZXJ0KGlvY3RsKHBtdV9mZCwgUEVSRl9FVkVOVF9JT0NfRU5BQkxFLCAwKSA9PSAwKTsKKwlzeXN0ZW0oImRkIGlmPS9kZXYvemVybyBvZj0vZGV2L251bGwgY291bnQ9NTAwMGsiKTsKKwlwcmludF9zdGFja3MoKTsKKwljbG9zZShwbXVfZmQpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2JwZl9wZXJmX2V2ZW50KHZvaWQpCit7CisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBhdHRyX3R5cGVfaHcgPSB7CisJCS5zYW1wbGVfZnJlcSA9IFNBTVBMRV9GUkVRLAorCQkuZnJlcSA9IDEsCisJCS50eXBlID0gUEVSRl9UWVBFX0hBUkRXQVJFLAorCQkuY29uZmlnID0gUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTLAorCQkuaW5oZXJpdCA9IDEsCisJfTsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIGF0dHJfdHlwZV9zdyA9IHsKKwkJLnNhbXBsZV9mcmVxID0gU0FNUExFX0ZSRVEsCisJCS5mcmVxID0gMSwKKwkJLnR5cGUgPSBQRVJGX1RZUEVfU09GVFdBUkUsCisJCS5jb25maWcgPSBQRVJGX0NPVU5UX1NXX0NQVV9DTE9DSywKKwkJLmluaGVyaXQgPSAxLAorCX07CisKKwl0ZXN0X3BlcmZfZXZlbnRfYWxsX2NwdSgmYXR0cl90eXBlX2h3KTsKKwl0ZXN0X3BlcmZfZXZlbnRfdGFzaygmYXR0cl90eXBlX2h3KTsKKwl0ZXN0X3BlcmZfZXZlbnRfYWxsX2NwdSgmYXR0cl90eXBlX3N3KTsKKwl0ZXN0X3BlcmZfZXZlbnRfdGFzaygmYXR0cl90eXBlX3N3KTsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHJsaW1pdCByID0ge1JMSU1fSU5GSU5JVFksIFJMSU1fSU5GSU5JVFl9OworCWNoYXIgZmlsZW5hbWVbMjU2XTsKKworCXNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXNfa2Vybi5vIiwgYXJndlswXSk7CisJc2V0cmxpbWl0KFJMSU1JVF9NRU1MT0NLLCAmcik7CisKKwlzaWduYWwoU0lHSU5ULCBpbnRfZXhpdCk7CisKKwlpZiAobG9hZF9rYWxsc3ltcygpKSB7CisJCXByaW50ZigiZmFpbGVkIHRvIHByb2Nlc3MgL3Byb2Mva2FsbHN5bXNcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobG9hZF9icGZfZmlsZShmaWxlbmFtZSkpIHsKKwkJcHJpbnRmKCIlcyIsIGJwZl9sb2dfYnVmKTsKKwkJcmV0dXJuIDI7CisJfQorCisJaWYgKGZvcmsoKSA9PSAwKSB7CisJCXJlYWRfdHJhY2VfcGlwZSgpOworCQlyZXR1cm4gMDsKKwl9CisJdGVzdF9icGZfcGVyZl9ldmVudCgpOworCisJaW50X2V4aXQoMCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90cmFjZXg1X2tlcm4uYyBiL3NhbXBsZXMvYnBmL3RyYWNleDVfa2Vybi5jCmluZGV4IGY5NWYyMzIuLmZkMTJkNzEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL3RyYWNleDVfa2Vybi5jCisrKyBiL3NhbXBsZXMvYnBmL3RyYWNleDVfa2Vybi5jCkBAIC0xOSwyMCArMTksMTggQEAKIAkubWF4X2VudHJpZXMgPSAxMDI0LAogfTsKIAotU0VDKCJrcHJvYmUvc2VjY29tcF9waGFzZTEiKQorU0VDKCJrcHJvYmUvX19zZWNjb21wX2ZpbHRlciIpCiBpbnQgYnBmX3Byb2cxKHN0cnVjdCBwdF9yZWdzICpjdHgpCiB7Ci0Jc3RydWN0IHNlY2NvbXBfZGF0YSBzZDsKLQotCWJwZl9wcm9iZV9yZWFkKCZzZCwgc2l6ZW9mKHNkKSwgKHZvaWQgKilQVF9SRUdTX1BBUk0xKGN0eCkpOworCWludCBzY19uciA9IChpbnQpUFRfUkVHU19QQVJNMShjdHgpOwogCiAJLyogZGlzcGF0Y2ggaW50byBuZXh0IEJQRiBwcm9ncmFtIGRlcGVuZGluZyBvbiBzeXNjYWxsIG51bWJlciAqLwotCWJwZl90YWlsX2NhbGwoY3R4LCAmcHJvZ3MsIHNkLm5yKTsKKwlicGZfdGFpbF9jYWxsKGN0eCwgJnByb2dzLCBzY19ucik7CiAKIAkvKiBmYWxsIHRocm91Z2ggLT4gdW5rbm93biBzeXNjYWxsICovCi0JaWYgKHNkLm5yID49IF9fTlJfZ2V0dWlkICYmIHNkLm5yIDw9IF9fTlJfZ2V0c2lkKSB7CisJaWYgKHNjX25yID49IF9fTlJfZ2V0dWlkICYmIHNjX25yIDw9IF9fTlJfZ2V0c2lkKSB7CiAJCWNoYXIgZm10W10gPSAic3lzY2FsbD0lZCAob25lIG9mIGdldC9zZXQgdWlkL3BpZC9naWQpXG4iOwotCQlicGZfdHJhY2VfcHJpbnRrKGZtdCwgc2l6ZW9mKGZtdCksIHNkLm5yKTsKKwkJYnBmX3RyYWNlX3ByaW50ayhmbXQsIHNpemVvZihmbXQpLCBzY19ucik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNDIsNyArNDAsNyBAQAogewogCXN0cnVjdCBzZWNjb21wX2RhdGEgc2Q7CiAKLQlicGZfcHJvYmVfcmVhZCgmc2QsIHNpemVvZihzZCksICh2b2lkICopUFRfUkVHU19QQVJNMShjdHgpKTsKKwlicGZfcHJvYmVfcmVhZCgmc2QsIHNpemVvZihzZCksICh2b2lkICopUFRfUkVHU19QQVJNMihjdHgpKTsKIAlpZiAoc2QuYXJnc1syXSA9PSA1MTIpIHsKIAkJY2hhciBmbXRbXSA9ICJ3cml0ZShmZD0lZCwgYnVmPSVwLCBzaXplPSVkKVxuIjsKIAkJYnBmX3RyYWNlX3ByaW50ayhmbXQsIHNpemVvZihmbXQpLApAQCAtNTUsNyArNTMsNyBAQAogewogCXN0cnVjdCBzZWNjb21wX2RhdGEgc2Q7CiAKLQlicGZfcHJvYmVfcmVhZCgmc2QsIHNpemVvZihzZCksICh2b2lkICopUFRfUkVHU19QQVJNMShjdHgpKTsKKwlicGZfcHJvYmVfcmVhZCgmc2QsIHNpemVvZihzZCksICh2b2lkICopUFRfUkVHU19QQVJNMihjdHgpKTsKIAlpZiAoc2QuYXJnc1syXSA+IDEyOCAmJiBzZC5hcmdzWzJdIDw9IDEwMjQpIHsKIAkJY2hhciBmbXRbXSA9ICJyZWFkKGZkPSVkLCBidWY9JXAsIHNpemU9JWQpXG4iOwogCQlicGZfdHJhY2VfcHJpbnRrKGZtdCwgc2l6ZW9mKGZtdCksCmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90cmFjZXg1X3VzZXIuYyBiL3NhbXBsZXMvYnBmL3RyYWNleDVfdXNlci5jCmluZGV4IGEwNGRkM2MuLjM2YjU5MjUgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL3RyYWNleDVfdXNlci5jCisrKyBiL3NhbXBsZXMvYnBmL3RyYWNleDVfdXNlci5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgogI2luY2x1ZGUgImxpYmJwZi5oIgogI2luY2x1ZGUgImJwZl9sb2FkLmgiCisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAKIC8qIGluc3RhbGwgZmFrZSBzZWNjb21wIHByb2dyYW0gdG8gZW5hYmxlIHNlY2NvbXAgY29kZSBwYXRoIGluc2lkZSB0aGUga2VybmVsLAogICogc28gdGhhdCBvdXIga3Byb2JlIGF0dGFjaGVkIHRvIHNlY2NvbXBfcGhhc2UxKCkgY2FuIGJlIHRyaWdnZXJlZApAQCAtMjcsOCArMjgsMTAgQEAKIHsKIAlGSUxFICpmOwogCWNoYXIgZmlsZW5hbWVbMjU2XTsKKwlzdHJ1Y3QgcmxpbWl0IHIgPSB7UkxJTV9JTkZJTklUWSwgUkxJTV9JTkZJTklUWX07CiAKIAlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzX2tlcm4ubyIsIGFyZ3ZbMF0pOworCXNldHJsaW1pdChSTElNSVRfTUVNTE9DSywgJnIpOwogCiAJaWYgKGxvYWRfYnBmX2ZpbGUoZmlsZW5hbWUpKSB7CiAJCXByaW50ZigiJXMiLCBicGZfbG9nX2J1Zik7CmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLnVic2FuIGIvc2NyaXB0cy9NYWtlZmlsZS51YnNhbgppbmRleCA4YWI2ODY3Li5kZDc3OWM0IDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLnVic2FuCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUudWJzYW4KQEAgLTMsNyArMyw2IEBACiAgICAgICBDRkxBR1NfVUJTQU4gKz0gJChjYWxsIGNjLW9wdGlvbiwgLWZzYW5pdGl6ZT1pbnRlZ2VyLWRpdmlkZS1ieS16ZXJvKQogICAgICAgQ0ZMQUdTX1VCU0FOICs9ICQoY2FsbCBjYy1vcHRpb24sIC1mc2FuaXRpemU9dW5yZWFjaGFibGUpCiAgICAgICBDRkxBR1NfVUJTQU4gKz0gJChjYWxsIGNjLW9wdGlvbiwgLWZzYW5pdGl6ZT12bGEtYm91bmQpCi0gICAgICBDRkxBR1NfVUJTQU4gKz0gJChjYWxsIGNjLW9wdGlvbiwgLWZzYW5pdGl6ZT1udWxsKQogICAgICAgQ0ZMQUdTX1VCU0FOICs9ICQoY2FsbCBjYy1vcHRpb24sIC1mc2FuaXRpemU9c2lnbmVkLWludGVnZXItb3ZlcmZsb3cpCiAgICAgICBDRkxBR1NfVUJTQU4gKz0gJChjYWxsIGNjLW9wdGlvbiwgLWZzYW5pdGl6ZT1ib3VuZHMpCiAgICAgICBDRkxBR1NfVUJTQU4gKz0gJChjYWxsIGNjLW9wdGlvbiwgLWZzYW5pdGl6ZT1vYmplY3Qtc2l6ZSkKQEAgLTE0LDQgKzEzLDggQEAKIGlmZGVmIENPTkZJR19VQlNBTl9BTElHTk1FTlQKICAgICAgIENGTEFHU19VQlNBTiArPSAkKGNhbGwgY2Mtb3B0aW9uLCAtZnNhbml0aXplPWFsaWdubWVudCkKIGVuZGlmCisKK2lmZGVmIENPTkZJR19VQlNBTl9OVUxMCisgICAgICBDRkxBR1NfVUJTQU4gKz0gJChjYWxsIGNjLW9wdGlvbiwgLWZzYW5pdGl6ZT1udWxsKQorZW5kaWYKIGVuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNra2NvbmZpZ3N5bWJvbHMucHkgYi9zY3JpcHRzL2NoZWNra2NvbmZpZ3N5bWJvbHMucHkKaW5kZXggZGY2NDNmNi4uYTMyZTRkYSAxMDA3NTUKLS0tIGEvc2NyaXB0cy9jaGVja2tjb25maWdzeW1ib2xzLnB5CisrKyBiL3NjcmlwdHMvY2hlY2trY29uZmlnc3ltYm9scy5weQpAQCAtMSw5OCArMSw5OSBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMgorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwogCiAiIiJGaW5kIEtjb25maWcgc3ltYm9scyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ1dCBub3QgZGVmaW5lZC4iIiIKIAotIyAoYykgMjAxNC0yMDE1IFZhbGVudGluIFJvdGhiZXJnIDx2YWxlbnRpbnJvdGhiZXJnQGdtYWlsLmNvbT4KKyMgKGMpIDIwMTQtMjAxNiBWYWxlbnRpbiBSb3RoYmVyZyA8dmFsZW50aW5yb3RoYmVyZ0BnbWFpbC5jb20+CiAjIChjKSAyMDE0IFN0ZWZhbiBIZW5nZWxlaW4gPHN0ZWZhbi5oZW5nZWxlaW5AZmF1LmRlPgogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIKIAogCitpbXBvcnQgYXJncGFyc2UKIGltcG9ydCBkaWZmbGliCiBpbXBvcnQgb3MKIGltcG9ydCByZQogaW1wb3J0IHNpZ25hbAoraW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCBzeXMKIGZyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCBQb29sLCBjcHVfY291bnQKLWZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgotZnJvbSBzdWJwcm9jZXNzIGltcG9ydCBQb3BlbiwgUElQRSwgU1RET1VUCiAKIAogIyByZWdleCBleHByZXNzaW9ucwogT1BFUkFUT1JTID0gciImfFwofFwpfFx8fFwhIgotRkVBVFVSRSA9IHIiKD86XHcqW0EtWjAtOV1cdyopezIsfSIKLURFRiA9IHIiXlxzKig/Om1lbnUpeywxfWNvbmZpZ1xzKygiICsgRkVBVFVSRSArIHIiKVxzKiIKLUVYUFIgPSByIig/OiIgKyBPUEVSQVRPUlMgKyByInxcc3wiICsgRkVBVFVSRSArIHIiKSsiCitTWU1CT0wgPSByIig/Olx3KltBLVowLTldXHcqKXsyLH0iCitERUYgPSByIl5ccyooPzptZW51KXssMX1jb25maWdccysoIiArIFNZTUJPTCArIHIiKVxzKiIKK0VYUFIgPSByIig/OiIgKyBPUEVSQVRPUlMgKyByInxcc3wiICsgU1lNQk9MICsgciIpKyIKIERFRkFVTFQgPSByImRlZmF1bHRccysuKj8oPzppZlxzLispeywxfSIKIFNUTVQgPSByIl5ccyooPzppZnxzZWxlY3R8ZGVwZW5kc1xzK29ufCg/OiIgKyBERUZBVUxUICsgciIpKVxzKyIgKyBFWFBSCi1TT1VSQ0VfRkVBVFVSRSA9IHIiKD86XFd8XGIpK1tEXXssMX1DT05GSUdfKCIgKyBGRUFUVVJFICsgciIpIgorU09VUkNFX1NZTUJPTCA9IHIiKD86XFd8XGIpK1tEXXssMX1DT05GSUdfKCIgKyBTWU1CT0wgKyByIikiCiAKICMgcmVnZXggb2JqZWN0cwogUkVHRVhfRklMRV9LQ09ORklHID0gcmUuY29tcGlsZShyIi4qS2NvbmZpZ1tcLlx3K1wtXSokIikKLVJFR0VYX0ZFQVRVUkUgPSByZS5jb21waWxlKHInKD8hXEIpJyArIEZFQVRVUkUgKyByJyg/IVxCKScpCi1SRUdFWF9TT1VSQ0VfRkVBVFVSRSA9IHJlLmNvbXBpbGUoU09VUkNFX0ZFQVRVUkUpCitSRUdFWF9TWU1CT0wgPSByZS5jb21waWxlKHInKD8hXEIpJyArIFNZTUJPTCArIHInKD8hXEIpJykKK1JFR0VYX1NPVVJDRV9TWU1CT0wgPSByZS5jb21waWxlKFNPVVJDRV9TWU1CT0wpCiBSRUdFWF9LQ09ORklHX0RFRiA9IHJlLmNvbXBpbGUoREVGKQogUkVHRVhfS0NPTkZJR19FWFBSID0gcmUuY29tcGlsZShFWFBSKQogUkVHRVhfS0NPTkZJR19TVE1UID0gcmUuY29tcGlsZShTVE1UKQogUkVHRVhfS0NPTkZJR19IRUxQID0gcmUuY29tcGlsZShyIl5ccysoaGVscHwtLS1oZWxwLS0tKVxzKiQiKQotUkVHRVhfRklMVEVSX0ZFQVRVUkVTID0gcmUuY29tcGlsZShyIltBLVphLXowLTldJCIpCitSRUdFWF9GSUxURVJfU1lNQk9MUyA9IHJlLmNvbXBpbGUociJbQS1aYS16MC05XSQiKQogUkVHRVhfTlVNRVJJQyA9IHJlLmNvbXBpbGUociIwW3hYXVswLTlhLWZBLUZdK3xbMC05XSsiKQogUkVHRVhfUVVPVEVTID0gcmUuY29tcGlsZSgiKFwiKC4qPylcIikiKQogCiAKIGRlZiBwYXJzZV9vcHRpb25zKCk6CiAgICAgIiIiVGhlIHVzZXIgaW50ZXJmYWNlIG9mIHRoaXMgbW9kdWxlLiIiIgotICAgIHVzYWdlID0gIiVwcm9nIFtvcHRpb25zXVxuXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJSdW4gdGhpcyB0b29sIHRvIGRldGVjdCBLY29uZmlnIHN5bWJvbHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBidXQgIiBcCi0gICAgICAgICAgICAibm90IGRlZmluZWQgaW5cbktjb25maWcuICBUaGUgb3V0cHV0IG9mIHRoaXMgdG9vbCBoYXMgdGhlICIgICAgICAgXAotICAgICAgICAgICAgImZvcm1hdCBcJ1VuZGVmaW5lZCBzeW1ib2xcXHRGaWxlIGxpc3RcJ1xuXG4iICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJJZiBubyBvcHRpb24gaXMgc3BlY2lmaWVkLCAlcHJvZyB3aWxsIGRlZmF1bHQgdG8gY2hlY2sgeW91clxuIiAgICBcCi0gICAgICAgICAgICAiY3VycmVudCB0cmVlLiAgUGxlYXNlIG5vdGUgdGhhdCBzcGVjaWZ5aW5nIGNvbW1pdHMgd2lsbCAiICAgICAgICAgXAotICAgICAgICAgICAgIlwnZ2l0IHJlc2V0IC0taGFyZFwnXG55b3VyIGN1cnJlbnQgdHJlZSEgIFlvdSBtYXkgc2F2ZSAiICAgICAgICAgIFwKLSAgICAgICAgICAgICJ1bmNvbW1pdHRlZCBjaGFuZ2VzIHRvIGF2b2lkIGxvc2luZyBkYXRhLiIKKyAgICB1c2FnZSA9ICJSdW4gdGhpcyB0b29sIHRvIGRldGVjdCBLY29uZmlnIHN5bWJvbHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBidXQgIiBcCisgICAgICAgICAgICAibm90IGRlZmluZWQgaW4gS2NvbmZpZy4gIElmIG5vIG9wdGlvbiBpcyBzcGVjaWZpZWQsICIgICAgICAgICAgICAgXAorICAgICAgICAgICAgImNoZWNra2NvbmZpZ3N5bWJvbHMgZGVmYXVsdHMgdG8gY2hlY2sgeW91ciBjdXJyZW50IHRyZWUuICAiICAgICAgIFwKKyAgICAgICAgICAgICJQbGVhc2Ugbm90ZSB0aGF0IHNwZWNpZnlpbmcgY29tbWl0cyB3aWxsICdnaXQgcmVzZXQgLS1oYXJkXCcgIiAgICBcCisgICAgICAgICAgICAieW91ciBjdXJyZW50IHRyZWUhICBZb3UgbWF5IHNhdmUgdW5jb21taXR0ZWQgY2hhbmdlcyB0byBhdm9pZCAiICAgXAorICAgICAgICAgICAgImxvc2luZyBkYXRhLiIKIAotICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT11c2FnZSkKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj11c2FnZSkKIAotICAgIHBhcnNlci5hZGRfb3B0aW9uKCctYycsICctLWNvbW1pdCcsIGRlc3Q9J2NvbW1pdCcsIGFjdGlvbj0nc3RvcmUnLAotICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0iQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBjb21taXQgKGhhc2gpIGludHJvZHVjZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCBLY29uZmlnIHN5bWJvbHMuIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctYycsICctLWNvbW1pdCcsIGRlc3Q9J2NvbW1pdCcsIGFjdGlvbj0nc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImNoZWNrIGlmIHRoZSBzcGVjaWZpZWQgY29tbWl0IChoYXNoKSBpbnRyb2R1Y2VzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCBLY29uZmlnIHN5bWJvbHMiKQogCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oJy1kJywgJy0tZGlmZicsIGRlc3Q9J2RpZmYnLCBhY3Rpb249J3N0b3JlJywKLSAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSIiLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkRpZmYgdW5kZWZpbmVkIHN5bWJvbHMgYmV0d2VlbiB0d28gY29tbWl0cy4gIFRoZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXQgZm9ybWF0IGJhc2VzIG9uIEdpdCBsb2cncyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiXCdjb21tbWl0MS4uY29tbWl0MlwnLiIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWQnLCAnLS1kaWZmJywgZGVzdD0nZGlmZicsIGFjdGlvbj0nc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImRpZmYgdW5kZWZpbmVkIHN5bWJvbHMgYmV0d2VlbiB0d28gY29tbWl0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZS5nLiwgLWQgY29tbW1pdDEuLmNvbW1pdDIpIikKIAotICAgIHBhcnNlci5hZGRfb3B0aW9uKCctZicsICctLWZpbmQnLCBkZXN0PSdmaW5kJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkZpbmQgYW5kIHNob3cgY29tbWl0cyB0aGF0IG1heSBjYXVzZSBzeW1ib2xzIHRvIGJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaXNzaW5nLiAgUmVxdWlyZWQgdG8gcnVuIHdpdGggLS1kaWZmLiIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWYnLCAnLS1maW5kJywgZGVzdD0nZmluZCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iZmluZCBhbmQgc2hvdyBjb21taXRzIHRoYXQgbWF5IGNhdXNlIHN5bWJvbHMgdG8gYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlzc2luZyAocmVxdWlyZWQgdG8gcnVuIHdpdGggLS1kaWZmKSIpCiAKLSAgICBwYXJzZXIuYWRkX29wdGlvbignLWknLCAnLS1pZ25vcmUnLCBkZXN0PSdpZ25vcmUnLCBhY3Rpb249J3N0b3JlJywKLSAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSIiLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Iklnbm9yZSBmaWxlcyBtYXRjaGluZyB0aGlzIHBhdHRlcm4uICBOb3RlIHRoYXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBwYXR0ZXJuIG5lZWRzIHRvIGJlIGEgUHl0aG9uIHJlZ2V4LiAgVG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgImlnbm9yZSBkZWZjb25maWdzLCBzcGVjaWZ5IC1pICcuKmRlZmNvbmZpZycuIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctaScsICctLWlnbm9yZScsIGRlc3Q9J2lnbm9yZScsIGFjdGlvbj0nc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Imlnbm9yZSBmaWxlcyBtYXRjaGluZyB0aGlzIFB5dGhvbiByZWdleCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZS5nLiwgLWkgJy4qZGVmY29uZmlnJykiKQogCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oJy1zJywgJy0tc2ltJywgZGVzdD0nc2ltJywgYWN0aW9uPSdzdG9yZScsIGRlZmF1bHQ9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0iUHJpbnQgYSBsaXN0IG9mIG1heGltdW0gMTAgc3RyaW5nLXNpbWlsYXIgc3ltYm9scy4iKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1zJywgJy0tc2ltJywgZGVzdD0nc2ltJywgYWN0aW9uPSdzdG9yZScsIGRlZmF1bHQ9IiIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJwcmludCBhIGxpc3Qgb2YgbWF4LiAxMCBzdHJpbmctc2ltaWxhciBzeW1ib2xzIikKIAotICAgIHBhcnNlci5hZGRfb3B0aW9uKCcnLCAnLS1mb3JjZScsIGRlc3Q9J2ZvcmNlJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlJlc2V0IGN1cnJlbnQgR2l0IHRyZWUgZXZlbiB3aGVuIGl0J3MgZGlydHkuIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZvcmNlJywgZGVzdD0nZm9yY2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InJlc2V0IGN1cnJlbnQgR2l0IHRyZWUgZXZlbiB3aGVuIGl0J3MgZGlydHkiKQogCi0gICAgKG9wdHMsIF8pID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tbm8tY29sb3InLCBkZXN0PSdjb2xvcicsIGFjdGlvbj0nc3RvcmVfZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iZG9uJ3QgcHJpbnQgY29sb3JlZCBvdXRwdXQgKGRlZmF1bHQgd2hlbiBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0dGluZyB0byBhIHRlcm1pbmFsKSIpCiAKLSAgICBpZiBvcHRzLmNvbW1pdCBhbmQgb3B0cy5kaWZmOgorICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICBpZiBhcmdzLmNvbW1pdCBhbmQgYXJncy5kaWZmOgogICAgICAgICBzeXMuZXhpdCgiUGxlYXNlIHNwZWNpZnkgb25seSBvbmUgb3B0aW9uIGF0IG9uY2UuIikKIAotICAgIGlmIG9wdHMuZGlmZiBhbmQgbm90IHJlLm1hdGNoKHIiXltcd1wtXC5dK1wuXC5bXHdcLVwuXSskIiwgb3B0cy5kaWZmKToKKyAgICBpZiBhcmdzLmRpZmYgYW5kIG5vdCByZS5tYXRjaChyIl5bXHdcLVwuXStcLlwuW1x3XC1cLl0rJCIsIGFyZ3MuZGlmZik6CiAgICAgICAgIHN5cy5leGl0KCJQbGVhc2Ugc3BlY2lmeSB2YWxpZCBpbnB1dCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogIgogICAgICAgICAgICAgICAgICAiXCdjb21taXQxLi5jb21taXQyXCciKQogCi0gICAgaWYgb3B0cy5jb21taXQgb3Igb3B0cy5kaWZmOgotICAgICAgICBpZiBub3Qgb3B0cy5mb3JjZSBhbmQgdHJlZV9pc19kaXJ0eSgpOgorICAgIGlmIGFyZ3MuY29tbWl0IG9yIGFyZ3MuZGlmZjoKKyAgICAgICAgaWYgbm90IGFyZ3MuZm9yY2UgYW5kIHRyZWVfaXNfZGlydHkoKToKICAgICAgICAgICAgIHN5cy5leGl0KCJUaGUgY3VycmVudCBHaXQgdHJlZSBpcyBkaXJ0eSAoc2VlICdnaXQgc3RhdHVzJykuICAiCiAgICAgICAgICAgICAgICAgICAgICAiUnVubmluZyB0aGlzIHNjcmlwdCBtYXlcbmRlbGV0ZSBpbXBvcnRhbnQgZGF0YSBzaW5jZSBpdCAiCiAgICAgICAgICAgICAgICAgICAgICAiY2FsbHMgJ2dpdCByZXNldCAtLWhhcmQnIGZvciBzb21lIHBlcmZvcm1hbmNlXG5yZWFzb25zLiAiCkBAIC0xMDAsMTM4ICsxMDEsMTQ4IEBACiAgICAgICAgICAgICAgICAgICAgICAiJy0tZm9yY2UnIGlmIHlvdVxud2FudCB0byBpZ25vcmUgdGhpcyB3YXJuaW5nIGFuZCAiCiAgICAgICAgICAgICAgICAgICAgICAiY29udGludWUuIikKIAotICAgIGlmIG9wdHMuY29tbWl0OgotICAgICAgICBvcHRzLmZpbmQgPSBGYWxzZQorICAgIGlmIGFyZ3MuY29tbWl0OgorICAgICAgICBhcmdzLmZpbmQgPSBGYWxzZQogCi0gICAgaWYgb3B0cy5pZ25vcmU6CisgICAgaWYgYXJncy5pZ25vcmU6CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHJlLm1hdGNoKG9wdHMuaWdub3JlLCAidGhpcy9pcy9qdXN0L2EvdGVzdC5jIikKKyAgICAgICAgICAgIHJlLm1hdGNoKGFyZ3MuaWdub3JlLCAidGhpcy9pcy9qdXN0L2EvdGVzdC5jIikKICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgc3lzLmV4aXQoIlBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgUHl0aG9uIHJlZ2V4LiIpCiAKLSAgICByZXR1cm4gb3B0cworICAgIHJldHVybiBhcmdzCiAKIAogZGVmIG1haW4oKToKICAgICAiIiJNYWluIGZ1bmN0aW9uIG9mIHRoaXMgbW9kdWxlLiIiIgotICAgIG9wdHMgPSBwYXJzZV9vcHRpb25zKCkKKyAgICBhcmdzID0gcGFyc2Vfb3B0aW9ucygpCiAKLSAgICBpZiBvcHRzLnNpbSBhbmQgbm90IG9wdHMuY29tbWl0IGFuZCBub3Qgb3B0cy5kaWZmOgotICAgICAgICBzaW1zID0gZmluZF9zaW1zKG9wdHMuc2ltLCBvcHRzLmlnbm9yZSkKKyAgICBnbG9iYWwgQ09MT1IKKyAgICBDT0xPUiA9IGFyZ3MuY29sb3IgYW5kIHN5cy5zdGRvdXQuaXNhdHR5KCkKKworICAgIGlmIGFyZ3Muc2ltIGFuZCBub3QgYXJncy5jb21taXQgYW5kIG5vdCBhcmdzLmRpZmY6CisgICAgICAgIHNpbXMgPSBmaW5kX3NpbXMoYXJncy5zaW0sIGFyZ3MuaWdub3JlKQogICAgICAgICBpZiBzaW1zOgotICAgICAgICAgICAgcHJpbnQgIiVzOiAlcyIgJSAoeWVsKCJTaW1pbGFyIHN5bWJvbHMiKSwgJywgJy5qb2luKHNpbXMpKQorICAgICAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAoeWVsKCJTaW1pbGFyIHN5bWJvbHMiKSwgJywgJy5qb2luKHNpbXMpKSkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50ICIlczogbm8gc2ltaWxhciBzeW1ib2xzIGZvdW5kIiAlIHllbCgiU2ltaWxhciBzeW1ib2xzIikKKyAgICAgICAgICAgIHByaW50KCIlczogbm8gc2ltaWxhciBzeW1ib2xzIGZvdW5kIiAlIHllbCgiU2ltaWxhciBzeW1ib2xzIikpCiAgICAgICAgIHN5cy5leGl0KDApCiAKICAgICAjIGRpY3Rpb25hcnkgb2YgKHVuKWRlZmluZWQgc3ltYm9scwogICAgIGRlZmluZWQgPSB7fQogICAgIHVuZGVmaW5lZCA9IHt9CiAKLSAgICBpZiBvcHRzLmNvbW1pdCBvciBvcHRzLmRpZmY6CisgICAgaWYgYXJncy5jb21taXQgb3IgYXJncy5kaWZmOgogICAgICAgICBoZWFkID0gZ2V0X2hlYWQoKQogCiAgICAgICAgICMgZ2V0IGNvbW1pdCByYW5nZQogICAgICAgICBjb21taXRfYSA9IE5vbmUKICAgICAgICAgY29tbWl0X2IgPSBOb25lCi0gICAgICAgIGlmIG9wdHMuY29tbWl0OgotICAgICAgICAgICAgY29tbWl0X2EgPSBvcHRzLmNvbW1pdCArICJ+IgotICAgICAgICAgICAgY29tbWl0X2IgPSBvcHRzLmNvbW1pdAotICAgICAgICBlbGlmIG9wdHMuZGlmZjoKLSAgICAgICAgICAgIHNwbGl0ID0gb3B0cy5kaWZmLnNwbGl0KCIuLiIpCisgICAgICAgIGlmIGFyZ3MuY29tbWl0OgorICAgICAgICAgICAgY29tbWl0X2EgPSBhcmdzLmNvbW1pdCArICJ+IgorICAgICAgICAgICAgY29tbWl0X2IgPSBhcmdzLmNvbW1pdAorICAgICAgICBlbGlmIGFyZ3MuZGlmZjoKKyAgICAgICAgICAgIHNwbGl0ID0gYXJncy5kaWZmLnNwbGl0KCIuLiIpCiAgICAgICAgICAgICBjb21taXRfYSA9IHNwbGl0WzBdCiAgICAgICAgICAgICBjb21taXRfYiA9IHNwbGl0WzFdCiAgICAgICAgICAgICB1bmRlZmluZWRfYSA9IHt9CiAgICAgICAgICAgICB1bmRlZmluZWRfYiA9IHt9CiAKICAgICAgICAgIyBnZXQgdW5kZWZpbmVkIGl0ZW1zIGJlZm9yZSB0aGUgY29tbWl0Ci0gICAgICAgIGV4ZWN1dGUoImdpdCByZXNldCAtLWhhcmQgJXMiICUgY29tbWl0X2EpCi0gICAgICAgIHVuZGVmaW5lZF9hLCBfID0gY2hlY2tfc3ltYm9scyhvcHRzLmlnbm9yZSkKKyAgICAgICAgcmVzZXQoY29tbWl0X2EpCisgICAgICAgIHVuZGVmaW5lZF9hLCBfID0gY2hlY2tfc3ltYm9scyhhcmdzLmlnbm9yZSkKIAogICAgICAgICAjIGdldCB1bmRlZmluZWQgaXRlbXMgZm9yIHRoZSBjb21taXQKLSAgICAgICAgZXhlY3V0ZSgiZ2l0IHJlc2V0IC0taGFyZCAlcyIgJSBjb21taXRfYikKLSAgICAgICAgdW5kZWZpbmVkX2IsIGRlZmluZWQgPSBjaGVja19zeW1ib2xzKG9wdHMuaWdub3JlKQorICAgICAgICByZXNldChjb21taXRfYikKKyAgICAgICAgdW5kZWZpbmVkX2IsIGRlZmluZWQgPSBjaGVja19zeW1ib2xzKGFyZ3MuaWdub3JlKQogCiAgICAgICAgICMgcmVwb3J0IGNhc2VzIHRoYXQgYXJlIHByZXNlbnQgZm9yIHRoZSBjb21taXQgYnV0IG5vdCBiZWZvcmUKLSAgICAgICAgZm9yIGZlYXR1cmUgaW4gc29ydGVkKHVuZGVmaW5lZF9iKToKLSAgICAgICAgICAgICMgZmVhdHVyZSBoYXMgbm90IGJlZW4gdW5kZWZpbmVkIGJlZm9yZQotICAgICAgICAgICAgaWYgbm90IGZlYXR1cmUgaW4gdW5kZWZpbmVkX2E6Ci0gICAgICAgICAgICAgICAgZmlsZXMgPSBzb3J0ZWQodW5kZWZpbmVkX2IuZ2V0KGZlYXR1cmUpKQotICAgICAgICAgICAgICAgIHVuZGVmaW5lZFtmZWF0dXJlXSA9IGZpbGVzCi0gICAgICAgICAgICAjIGNoZWNrIGlmIHRoZXJlIGFyZSBuZXcgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIHVuZGVmaW5lZCBmZWF0dXJlCisgICAgICAgIGZvciBzeW1ib2wgaW4gc29ydGVkKHVuZGVmaW5lZF9iKToKKyAgICAgICAgICAgICMgc3ltYm9sIGhhcyBub3QgYmVlbiB1bmRlZmluZWQgYmVmb3JlCisgICAgICAgICAgICBpZiBzeW1ib2wgbm90IGluIHVuZGVmaW5lZF9hOgorICAgICAgICAgICAgICAgIGZpbGVzID0gc29ydGVkKHVuZGVmaW5lZF9iLmdldChzeW1ib2wpKQorICAgICAgICAgICAgICAgIHVuZGVmaW5lZFtzeW1ib2xdID0gZmlsZXMKKyAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlcmUgYXJlIG5ldyBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgdW5kZWZpbmVkIHN5bWJvbAogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBmaWxlcyA9IHNvcnRlZCh1bmRlZmluZWRfYi5nZXQoZmVhdHVyZSkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZF9hLmdldChmZWF0dXJlKSkKKyAgICAgICAgICAgICAgICBmaWxlcyA9IHNvcnRlZCh1bmRlZmluZWRfYi5nZXQoc3ltYm9sKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkX2EuZ2V0KHN5bWJvbCkpCiAgICAgICAgICAgICAgICAgaWYgZmlsZXM6Ci0gICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZFtmZWF0dXJlXSA9IGZpbGVzCisgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZFtzeW1ib2xdID0gZmlsZXMKIAogICAgICAgICAjIHJlc2V0IHRvIGhlYWQKLSAgICAgICAgZXhlY3V0ZSgiZ2l0IHJlc2V0IC0taGFyZCAlcyIgJSBoZWFkKQorICAgICAgICByZXNldChoZWFkKQogCiAgICAgIyBkZWZhdWx0IHRvIGNoZWNrIHRoZSBlbnRpcmUgdHJlZQogICAgIGVsc2U6Ci0gICAgICAgIHVuZGVmaW5lZCwgZGVmaW5lZCA9IGNoZWNrX3N5bWJvbHMob3B0cy5pZ25vcmUpCisgICAgICAgIHVuZGVmaW5lZCwgZGVmaW5lZCA9IGNoZWNrX3N5bWJvbHMoYXJncy5pZ25vcmUpCiAKICAgICAjIG5vdyBwcmludCB0aGUgb3V0cHV0Ci0gICAgZm9yIGZlYXR1cmUgaW4gc29ydGVkKHVuZGVmaW5lZCk6Ci0gICAgICAgIHByaW50IHJlZChmZWF0dXJlKQorICAgIGZvciBzeW1ib2wgaW4gc29ydGVkKHVuZGVmaW5lZCk6CisgICAgICAgIHByaW50KHJlZChzeW1ib2wpKQogCi0gICAgICAgIGZpbGVzID0gc29ydGVkKHVuZGVmaW5lZC5nZXQoZmVhdHVyZSkpCi0gICAgICAgIHByaW50ICIlczogJXMiICUgKHllbCgiUmVmZXJlbmNpbmcgZmlsZXMiKSwgIiwgIi5qb2luKGZpbGVzKSkKKyAgICAgICAgZmlsZXMgPSBzb3J0ZWQodW5kZWZpbmVkLmdldChzeW1ib2wpKQorICAgICAgICBwcmludCgiJXM6ICVzIiAlICh5ZWwoIlJlZmVyZW5jaW5nIGZpbGVzIiksICIsICIuam9pbihmaWxlcykpKQogCi0gICAgICAgIHNpbXMgPSBmaW5kX3NpbXMoZmVhdHVyZSwgb3B0cy5pZ25vcmUsIGRlZmluZWQpCisgICAgICAgIHNpbXMgPSBmaW5kX3NpbXMoc3ltYm9sLCBhcmdzLmlnbm9yZSwgZGVmaW5lZCkKICAgICAgICAgc2ltc19vdXQgPSB5ZWwoIlNpbWlsYXIgc3ltYm9scyIpCiAgICAgICAgIGlmIHNpbXM6Ci0gICAgICAgICAgICBwcmludCAiJXM6ICVzIiAlIChzaW1zX291dCwgJywgJy5qb2luKHNpbXMpKQorICAgICAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAoc2ltc19vdXQsICcsICcuam9pbihzaW1zKSkpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCAiJXM6ICVzIiAlIChzaW1zX291dCwgIm5vIHNpbWlsYXIgc3ltYm9scyBmb3VuZCIpCisgICAgICAgICAgICBwcmludCgiJXM6ICVzIiAlIChzaW1zX291dCwgIm5vIHNpbWlsYXIgc3ltYm9scyBmb3VuZCIpKQogCi0gICAgICAgIGlmIG9wdHMuZmluZDoKLSAgICAgICAgICAgIHByaW50ICIlczoiICUgeWVsKCJDb21taXRzIGNoYW5naW5nIHN5bWJvbCIpCi0gICAgICAgICAgICBjb21taXRzID0gZmluZF9jb21taXRzKGZlYXR1cmUsIG9wdHMuZGlmZikKKyAgICAgICAgaWYgYXJncy5maW5kOgorICAgICAgICAgICAgcHJpbnQoIiVzOiIgJSB5ZWwoIkNvbW1pdHMgY2hhbmdpbmcgc3ltYm9sIikpCisgICAgICAgICAgICBjb21taXRzID0gZmluZF9jb21taXRzKHN5bWJvbCwgYXJncy5kaWZmKQogICAgICAgICAgICAgaWYgY29tbWl0czoKICAgICAgICAgICAgICAgICBmb3IgY29tbWl0IGluIGNvbW1pdHM6CiAgICAgICAgICAgICAgICAgICAgIGNvbW1pdCA9IGNvbW1pdC5zcGxpdCgiICIsIDEpCi0gICAgICAgICAgICAgICAgICAgIHByaW50ICJcdC0gJXMgKFwiJXNcIikiICUgKHllbChjb21taXRbMF0pLCBjb21taXRbMV0pCisgICAgICAgICAgICAgICAgICAgIHByaW50KCJcdC0gJXMgKFwiJXNcIikiICUgKHllbChjb21taXRbMF0pLCBjb21taXRbMV0pKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCAiXHQtIG5vIGNvbW1pdCBmb3VuZCIKLSAgICAgICAgcHJpbnQgICMgIG5ldyBsaW5lCisgICAgICAgICAgICAgICAgcHJpbnQoIlx0LSBubyBjb21taXQgZm91bmQiKQorICAgICAgICBwcmludCgpICAjIG5ldyBsaW5lCisKKworZGVmIHJlc2V0KGNvbW1pdCk6CisgICAgIiIiUmVzZXQgY3VycmVudCBnaXQgdHJlZSB0byAlY29tbWl0LiIiIgorICAgIGV4ZWN1dGUoWyJnaXQiLCAicmVzZXQiLCAiLS1oYXJkIiwgY29tbWl0XSkKIAogCiBkZWYgeWVsKHN0cmluZyk6CiAgICAgIiIiCiAgICAgQ29sb3IgJXN0cmluZyB5ZWxsb3cuCiAgICAgIiIiCi0gICAgcmV0dXJuICJcMDMzWzMzbSVzXDAzM1swbSIgJSBzdHJpbmcKKyAgICByZXR1cm4gIlwwMzNbMzNtJXNcMDMzWzBtIiAlIHN0cmluZyBpZiBDT0xPUiBlbHNlIHN0cmluZwogCiAKIGRlZiByZWQoc3RyaW5nKToKICAgICAiIiIKICAgICBDb2xvciAlc3RyaW5nIHJlZC4KICAgICAiIiIKLSAgICByZXR1cm4gIlwwMzNbMzFtJXNcMDMzWzBtIiAlIHN0cmluZworICAgIHJldHVybiAiXDAzM1szMW0lc1wwMzNbMG0iICUgc3RyaW5nIGlmIENPTE9SIGVsc2Ugc3RyaW5nCiAKIAogZGVmIGV4ZWN1dGUoY21kKToKICAgICAiIiJFeGVjdXRlICVjbWQgYW5kIHJldHVybiBzdGRvdXQuICBFeGl0IGluIGNhc2Ugb2YgZXJyb3IuIiIiCi0gICAgcG9wID0gUG9wZW4oY21kLCBzdGRvdXQ9UElQRSwgc3RkZXJyPVNURE9VVCwgc2hlbGw9VHJ1ZSkKLSAgICAoc3Rkb3V0LCBfKSA9IHBvcC5jb21tdW5pY2F0ZSgpICAjIHdhaXQgdW50aWwgZmluaXNoZWQKLSAgICBpZiBwb3AucmV0dXJuY29kZSAhPSAwOgotICAgICAgICBzeXMuZXhpdChzdGRvdXQpCisgICAgdHJ5OgorICAgICAgICBzdGRvdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChjbWQsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwgc2hlbGw9RmFsc2UpCisgICAgICAgIHN0ZG91dCA9IHN0ZG91dC5kZWNvZGUoZXJyb3JzPSdyZXBsYWNlJykKKyAgICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IgYXMgZmFpbDoKKyAgICAgICAgZXhpdChmYWlsKQogICAgIHJldHVybiBzdGRvdXQKIAogCiBkZWYgZmluZF9jb21taXRzKHN5bWJvbCwgZGlmZik6CiAgICAgIiIiRmluZCBjb21taXRzIGNoYW5naW5nICVzeW1ib2wgaW4gdGhlIGdpdmVuIHJhbmdlIG9mICVkaWZmLiIiIgotICAgIGNvbW1pdHMgPSBleGVjdXRlKCJnaXQgbG9nIC0tcHJldHR5PW9uZWxpbmUgLS1hYmJyZXYtY29tbWl0IC1HICVzICVzIgotICAgICAgICAgICAgICAgICAgICAgICUgKHN5bWJvbCwgZGlmZikpCisgICAgY29tbWl0cyA9IGV4ZWN1dGUoWyJnaXQiLCAibG9nIiwgIi0tcHJldHR5PW9uZWxpbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiLS1hYmJyZXYtY29tbWl0IiwgIi1HIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sLCBkaWZmXSkKICAgICByZXR1cm4gW3ggZm9yIHggaW4gY29tbWl0cy5zcGxpdCgiXG4iKSBpZiB4XQogCiAKIGRlZiB0cmVlX2lzX2RpcnR5KCk6CiAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgd29ya2luZyB0cmVlIGlzIGRpcnR5IChpLmUuLCBpZiBhbnkgZmlsZSBoYXMKICAgICBiZWVuIGFkZGVkLCBkZWxldGVkLCBtb2RpZmllZCwgcmVuYW1lZCBvciBjb3BpZWQgYnV0IG5vdCBjb21taXR0ZWQpLiIiIgotICAgIHN0ZG91dCA9IGV4ZWN1dGUoImdpdCBzdGF0dXMgLS1wb3JjZWxhaW4iKQorICAgIHN0ZG91dCA9IGV4ZWN1dGUoWyJnaXQiLCAic3RhdHVzIiwgIi0tcG9yY2VsYWluIl0pCiAgICAgZm9yIGxpbmUgaW4gc3Rkb3V0OgogICAgICAgICBpZiByZS5maW5kYWxsKHIiW1VSTUFEQ117MX0iLCBsaW5lWzoyXSk6CiAgICAgICAgICAgICByZXR1cm4gVHJ1ZQpAQCAtMjQwLDEzICsyNTEsMTMgQEAKIAogZGVmIGdldF9oZWFkKCk6CiAgICAgIiIiUmV0dXJuIGNvbW1pdCBoYXNoIG9mIGN1cnJlbnQgSEVBRC4iIiIKLSAgICBzdGRvdXQgPSBleGVjdXRlKCJnaXQgcmV2LXBhcnNlIEhFQUQiKQorICAgIHN0ZG91dCA9IGV4ZWN1dGUoWyJnaXQiLCAicmV2LXBhcnNlIiwgIkhFQUQiXSkKICAgICByZXR1cm4gc3Rkb3V0LnN0cmlwKCdcbicpCiAKIAogZGVmIHBhcnRpdGlvbihsc3QsIHNpemUpOgogICAgICIiIlBhcnRpdGlvbiBsaXN0IEBsc3QgaW50byBldmVuaS1zaXplZCBsaXN0cyBvZiBzaXplIEBzaXplLiIiIgotICAgIHJldHVybiBbbHN0W2k6OnNpemVdIGZvciBpIGluIHhyYW5nZShzaXplKV0KKyAgICByZXR1cm4gW2xzdFtpOjpzaXplXSBmb3IgaSBpbiByYW5nZShzaXplKV0KIAogCiBkZWYgaW5pdF93b3JrZXIoKToKQEAgLTI1NCw3ICsyNjUsNyBAQAogICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0lOVCwgc2lnbmFsLlNJR19JR04pCiAKIAotZGVmIGZpbmRfc2ltcyhzeW1ib2wsIGlnbm9yZSwgZGVmaW5lZCA9IFtdKToKK2RlZiBmaW5kX3NpbXMoc3ltYm9sLCBpZ25vcmUsIGRlZmluZWQ9W10pOgogICAgICIiIlJldHVybiBhIGxpc3Qgb2YgbWF4LiB0ZW4gS2NvbmZpZyBzeW1ib2xzIHRoYXQgYXJlIHN0cmluZy1zaW1pbGFyIHRvCiAgICAgQHN5bWJvbC4iIiIKICAgICBpZiBkZWZpbmVkOgpAQCAtMjc5LDcgKzI5MCw3IEBACiBkZWYgZ2V0X2ZpbGVzKCk6CiAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZ2l0IGRpcmVjdG9yeS4iIiIKICAgICAjIHVzZSAnZ2l0IGxzLWZpbGVzJyB0byBnZXQgdGhlIHdvcmtsaXN0Ci0gICAgc3Rkb3V0ID0gZXhlY3V0ZSgiZ2l0IGxzLWZpbGVzIikKKyAgICBzdGRvdXQgPSBleGVjdXRlKFsiZ2l0IiwgImxzLWZpbGVzIl0pCiAgICAgaWYgbGVuKHN0ZG91dCkgPiAwIGFuZCBzdGRvdXRbLTFdID09ICJcbiI6CiAgICAgICAgIHN0ZG91dCA9IHN0ZG91dFs6LTFdCiAKQEAgLTMxMSw4ICszMjIsOCBAQAogICAgIGNoZWNrX3N5bWJvbHMoKSBpbiBvcmRlciB0byBwcm9wZXJseSB0ZXJtaW5hdGUgcnVubmluZyB3b3JrZXIgcHJvY2Vzc2VzLiIiIgogICAgIHNvdXJjZV9maWxlcyA9IFtdCiAgICAga2NvbmZpZ19maWxlcyA9IFtdCi0gICAgZGVmaW5lZF9mZWF0dXJlcyA9IFtdCi0gICAgcmVmZXJlbmNlZF9mZWF0dXJlcyA9IGRpY3QoKSAgIyB7ZmlsZTogW2ZlYXR1cmVzXX0KKyAgICBkZWZpbmVkX3N5bWJvbHMgPSBbXQorICAgIHJlZmVyZW5jZWRfc3ltYm9scyA9IGRpY3QoKSAgIyB7ZmlsZTogW3N5bWJvbHNdfQogCiAgICAgZm9yIGdpdGZpbGUgaW4gZ2V0X2ZpbGVzKCk6CiAgICAgICAgIGlmIFJFR0VYX0ZJTEVfS0NPTkZJRy5tYXRjaChnaXRmaWxlKToKQEAgLTMyNiw3NiArMzM3LDc1IEBACiAgICAgIyBwYXJzZSBzb3VyY2UgZmlsZXMKICAgICBhcmdsaXN0ID0gcGFydGl0aW9uKHNvdXJjZV9maWxlcywgY3B1X2NvdW50KCkpCiAgICAgZm9yIHJlcyBpbiBwb29sLm1hcChwYXJzZV9zb3VyY2VfZmlsZXMsIGFyZ2xpc3QpOgotICAgICAgICByZWZlcmVuY2VkX2ZlYXR1cmVzLnVwZGF0ZShyZXMpCi0KKyAgICAgICAgcmVmZXJlbmNlZF9zeW1ib2xzLnVwZGF0ZShyZXMpCiAKICAgICAjIHBhcnNlIGtjb25maWcgZmlsZXMKICAgICBhcmdsaXN0ID0gW10KICAgICBmb3IgcGFydCBpbiBwYXJ0aXRpb24oa2NvbmZpZ19maWxlcywgY3B1X2NvdW50KCkpOgogICAgICAgICBhcmdsaXN0LmFwcGVuZCgocGFydCwgaWdub3JlKSkKICAgICBmb3IgcmVzIGluIHBvb2wubWFwKHBhcnNlX2tjb25maWdfZmlsZXMsIGFyZ2xpc3QpOgotICAgICAgICBkZWZpbmVkX2ZlYXR1cmVzLmV4dGVuZChyZXNbMF0pCi0gICAgICAgIHJlZmVyZW5jZWRfZmVhdHVyZXMudXBkYXRlKHJlc1sxXSkKLSAgICBkZWZpbmVkX2ZlYXR1cmVzID0gc2V0KGRlZmluZWRfZmVhdHVyZXMpCisgICAgICAgIGRlZmluZWRfc3ltYm9scy5leHRlbmQocmVzWzBdKQorICAgICAgICByZWZlcmVuY2VkX3N5bWJvbHMudXBkYXRlKHJlc1sxXSkKKyAgICBkZWZpbmVkX3N5bWJvbHMgPSBzZXQoZGVmaW5lZF9zeW1ib2xzKQogCi0gICAgIyBpbnZlcnNlIG1hcHBpbmcgb2YgcmVmZXJlbmNlZF9mZWF0dXJlcyB0byBkaWN0KGZlYXR1cmU6IFtmaWxlc10pCisgICAgIyBpbnZlcnNlIG1hcHBpbmcgb2YgcmVmZXJlbmNlZF9zeW1ib2xzIHRvIGRpY3Qoc3ltYm9sOiBbZmlsZXNdKQogICAgIGludl9tYXAgPSBkaWN0KCkKLSAgICBmb3IgX2ZpbGUsIGZlYXR1cmVzIGluIHJlZmVyZW5jZWRfZmVhdHVyZXMuaXRlcml0ZW1zKCk6Ci0gICAgICAgIGZvciBmZWF0dXJlIGluIGZlYXR1cmVzOgotICAgICAgICAgICAgaW52X21hcFtmZWF0dXJlXSA9IGludl9tYXAuZ2V0KGZlYXR1cmUsIHNldCgpKQotICAgICAgICAgICAgaW52X21hcFtmZWF0dXJlXS5hZGQoX2ZpbGUpCi0gICAgcmVmZXJlbmNlZF9mZWF0dXJlcyA9IGludl9tYXAKKyAgICBmb3IgX2ZpbGUsIHN5bWJvbHMgaW4gcmVmZXJlbmNlZF9zeW1ib2xzLml0ZW1zKCk6CisgICAgICAgIGZvciBzeW1ib2wgaW4gc3ltYm9sczoKKyAgICAgICAgICAgIGludl9tYXBbc3ltYm9sXSA9IGludl9tYXAuZ2V0KHN5bWJvbCwgc2V0KCkpCisgICAgICAgICAgICBpbnZfbWFwW3N5bWJvbF0uYWRkKF9maWxlKQorICAgIHJlZmVyZW5jZWRfc3ltYm9scyA9IGludl9tYXAKIAotICAgIHVuZGVmaW5lZCA9IHt9ICAjIHtmZWF0dXJlOiBbZmlsZXNdfQotICAgIGZvciBmZWF0dXJlIGluIHNvcnRlZChyZWZlcmVuY2VkX2ZlYXR1cmVzKToKKyAgICB1bmRlZmluZWQgPSB7fSAgIyB7c3ltYm9sOiBbZmlsZXNdfQorICAgIGZvciBzeW1ib2wgaW4gc29ydGVkKHJlZmVyZW5jZWRfc3ltYm9scyk6CiAgICAgICAgICMgZmlsdGVyIHNvbWUgZmFsc2UgcG9zaXRpdmVzCi0gICAgICAgIGlmIGZlYXR1cmUgPT0gIkZPTyIgb3IgZmVhdHVyZSA9PSAiQkFSIiBvciBcCi0gICAgICAgICAgICAgICAgZmVhdHVyZSA9PSAiRk9PX0JBUiIgb3IgZmVhdHVyZSA9PSAiWFhYIjoKKyAgICAgICAgaWYgc3ltYm9sID09ICJGT08iIG9yIHN5bWJvbCA9PSAiQkFSIiBvciBcCisgICAgICAgICAgICAgICAgc3ltYm9sID09ICJGT09fQkFSIiBvciBzeW1ib2wgPT0gIlhYWCI6CiAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICBpZiBmZWF0dXJlIG5vdCBpbiBkZWZpbmVkX2ZlYXR1cmVzOgotICAgICAgICAgICAgaWYgZmVhdHVyZS5lbmRzd2l0aCgiX01PRFVMRSIpOgorICAgICAgICBpZiBzeW1ib2wgbm90IGluIGRlZmluZWRfc3ltYm9sczoKKyAgICAgICAgICAgIGlmIHN5bWJvbC5lbmRzd2l0aCgiX01PRFVMRSIpOgogICAgICAgICAgICAgICAgICMgYXZvaWQgZmFsc2UgcG9zaXRpdmVzIGZvciBrZXJuZWwgbW9kdWxlcwotICAgICAgICAgICAgICAgIGlmIGZlYXR1cmVbOi1sZW4oIl9NT0RVTEUiKV0gaW4gZGVmaW5lZF9mZWF0dXJlczoKKyAgICAgICAgICAgICAgICBpZiBzeW1ib2xbOi1sZW4oIl9NT0RVTEUiKV0gaW4gZGVmaW5lZF9zeW1ib2xzOgogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgdW5kZWZpbmVkW2ZlYXR1cmVdID0gcmVmZXJlbmNlZF9mZWF0dXJlcy5nZXQoZmVhdHVyZSkKLSAgICByZXR1cm4gdW5kZWZpbmVkLCBkZWZpbmVkX2ZlYXR1cmVzCisgICAgICAgICAgICB1bmRlZmluZWRbc3ltYm9sXSA9IHJlZmVyZW5jZWRfc3ltYm9scy5nZXQoc3ltYm9sKQorICAgIHJldHVybiB1bmRlZmluZWQsIGRlZmluZWRfc3ltYm9scwogCiAKIGRlZiBwYXJzZV9zb3VyY2VfZmlsZXMoc291cmNlX2ZpbGVzKToKICAgICAiIiJQYXJzZSBlYWNoIHNvdXJjZSBmaWxlIGluIEBzb3VyY2VfZmlsZXMgYW5kIHJldHVybiBkaWN0aW9uYXJ5IHdpdGggc291cmNlCiAgICAgZmlsZXMgYXMga2V5cyBhbmQgbGlzdHMgb2YgcmVmZXJlbmNlcyBLY29uZmlnIHN5bWJvbHMgYXMgdmFsdWVzLiIiIgotICAgIHJlZmVyZW5jZWRfZmVhdHVyZXMgPSBkaWN0KCkKKyAgICByZWZlcmVuY2VkX3N5bWJvbHMgPSBkaWN0KCkKICAgICBmb3Igc2ZpbGUgaW4gc291cmNlX2ZpbGVzOgotICAgICAgICByZWZlcmVuY2VkX2ZlYXR1cmVzW3NmaWxlXSA9IHBhcnNlX3NvdXJjZV9maWxlKHNmaWxlKQotICAgIHJldHVybiByZWZlcmVuY2VkX2ZlYXR1cmVzCisgICAgICAgIHJlZmVyZW5jZWRfc3ltYm9sc1tzZmlsZV0gPSBwYXJzZV9zb3VyY2VfZmlsZShzZmlsZSkKKyAgICByZXR1cm4gcmVmZXJlbmNlZF9zeW1ib2xzCiAKIAogZGVmIHBhcnNlX3NvdXJjZV9maWxlKHNmaWxlKToKLSAgICAiIiJQYXJzZSBAc2ZpbGUgYW5kIHJldHVybiBhIGxpc3Qgb2YgcmVmZXJlbmNlZCBLY29uZmlnIGZlYXR1cmVzLiIiIgorICAgICIiIlBhcnNlIEBzZmlsZSBhbmQgcmV0dXJuIGEgbGlzdCBvZiByZWZlcmVuY2VkIEtjb25maWcgc3ltYm9scy4iIiIKICAgICBsaW5lcyA9IFtdCiAgICAgcmVmZXJlbmNlcyA9IFtdCiAKICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2ZpbGUpOgogICAgICAgICByZXR1cm4gcmVmZXJlbmNlcwogCi0gICAgd2l0aCBvcGVuKHNmaWxlLCAiciIpIGFzIHN0cmVhbToKKyAgICB3aXRoIG9wZW4oc2ZpbGUsICJyIiwgZW5jb2Rpbmc9J3V0Zi04JywgZXJyb3JzPSdyZXBsYWNlJykgYXMgc3RyZWFtOgogICAgICAgICBsaW5lcyA9IHN0cmVhbS5yZWFkbGluZXMoKQogCiAgICAgZm9yIGxpbmUgaW4gbGluZXM6Ci0gICAgICAgIGlmIG5vdCAiQ09ORklHXyIgaW4gbGluZToKKyAgICAgICAgaWYgIkNPTkZJR18iIG5vdCBpbiBsaW5lOgogICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgZmVhdHVyZXMgPSBSRUdFWF9TT1VSQ0VfRkVBVFVSRS5maW5kYWxsKGxpbmUpCi0gICAgICAgIGZvciBmZWF0dXJlIGluIGZlYXR1cmVzOgotICAgICAgICAgICAgaWYgbm90IFJFR0VYX0ZJTFRFUl9GRUFUVVJFUy5zZWFyY2goZmVhdHVyZSk6CisgICAgICAgIHN5bWJvbHMgPSBSRUdFWF9TT1VSQ0VfU1lNQk9MLmZpbmRhbGwobGluZSkKKyAgICAgICAgZm9yIHN5bWJvbCBpbiBzeW1ib2xzOgorICAgICAgICAgICAgaWYgbm90IFJFR0VYX0ZJTFRFUl9TWU1CT0xTLnNlYXJjaChzeW1ib2wpOgogICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICByZWZlcmVuY2VzLmFwcGVuZChmZWF0dXJlKQorICAgICAgICAgICAgcmVmZXJlbmNlcy5hcHBlbmQoc3ltYm9sKQogCiAgICAgcmV0dXJuIHJlZmVyZW5jZXMKIAogCi1kZWYgZ2V0X2ZlYXR1cmVzX2luX2xpbmUobGluZSk6Ci0gICAgIiIiUmV0dXJuIG1lbnRpb25lZCBLY29uZmlnIGZlYXR1cmVzIGluIEBsaW5lLiIiIgotICAgIHJldHVybiBSRUdFWF9GRUFUVVJFLmZpbmRhbGwobGluZSkKK2RlZiBnZXRfc3ltYm9sc19pbl9saW5lKGxpbmUpOgorICAgICIiIlJldHVybiBtZW50aW9uZWQgS2NvbmZpZyBzeW1ib2xzIGluIEBsaW5lLiIiIgorICAgIHJldHVybiBSRUdFWF9TWU1CT0wuZmluZGFsbChsaW5lKQogCiAKIGRlZiBwYXJzZV9rY29uZmlnX2ZpbGVzKGFyZ3MpOgpAQCAtNDA0LDIxICs0MTQsMjEgQEAKICAgICBwYXR0ZXJuLiIiIgogICAgIGtjb25maWdfZmlsZXMgPSBhcmdzWzBdCiAgICAgaWdub3JlID0gYXJnc1sxXQotICAgIGRlZmluZWRfZmVhdHVyZXMgPSBbXQotICAgIHJlZmVyZW5jZWRfZmVhdHVyZXMgPSBkaWN0KCkKKyAgICBkZWZpbmVkX3N5bWJvbHMgPSBbXQorICAgIHJlZmVyZW5jZWRfc3ltYm9scyA9IGRpY3QoKQogCiAgICAgZm9yIGtmaWxlIGluIGtjb25maWdfZmlsZXM6CiAgICAgICAgIGRlZmluZWQsIHJlZmVyZW5jZXMgPSBwYXJzZV9rY29uZmlnX2ZpbGUoa2ZpbGUpCi0gICAgICAgIGRlZmluZWRfZmVhdHVyZXMuZXh0ZW5kKGRlZmluZWQpCisgICAgICAgIGRlZmluZWRfc3ltYm9scy5leHRlbmQoZGVmaW5lZCkKICAgICAgICAgaWYgaWdub3JlIGFuZCByZS5tYXRjaChpZ25vcmUsIGtmaWxlKToKICAgICAgICAgICAgICMgZG8gbm90IGNvbGxlY3QgcmVmZXJlbmNlcyBmb3IgZmlsZXMgdGhhdCBtYXRjaCB0aGUgaWdub3JlIHBhdHRlcm4KICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIHJlZmVyZW5jZWRfZmVhdHVyZXNba2ZpbGVdID0gcmVmZXJlbmNlcwotICAgIHJldHVybiAoZGVmaW5lZF9mZWF0dXJlcywgcmVmZXJlbmNlZF9mZWF0dXJlcykKKyAgICAgICAgcmVmZXJlbmNlZF9zeW1ib2xzW2tmaWxlXSA9IHJlZmVyZW5jZXMKKyAgICByZXR1cm4gKGRlZmluZWRfc3ltYm9scywgcmVmZXJlbmNlZF9zeW1ib2xzKQogCiAKIGRlZiBwYXJzZV9rY29uZmlnX2ZpbGUoa2ZpbGUpOgotICAgICIiIlBhcnNlIEBrZmlsZSBhbmQgdXBkYXRlIGZlYXR1cmUgZGVmaW5pdGlvbnMgYW5kIHJlZmVyZW5jZXMuIiIiCisgICAgIiIiUGFyc2UgQGtmaWxlIGFuZCB1cGRhdGUgc3ltYm9sIGRlZmluaXRpb25zIGFuZCByZWZlcmVuY2VzLiIiIgogICAgIGxpbmVzID0gW10KICAgICBkZWZpbmVkID0gW10KICAgICByZWZlcmVuY2VzID0gW10KQEAgLTQyNyw3ICs0MzcsNyBAQAogICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhrZmlsZSk6CiAgICAgICAgIHJldHVybiBkZWZpbmVkLCByZWZlcmVuY2VzCiAKLSAgICB3aXRoIG9wZW4oa2ZpbGUsICJyIikgYXMgc3RyZWFtOgorICAgIHdpdGggb3BlbihrZmlsZSwgInIiLCBlbmNvZGluZz0ndXRmLTgnLCBlcnJvcnM9J3JlcGxhY2UnKSBhcyBzdHJlYW06CiAgICAgICAgIGxpbmVzID0gc3RyZWFtLnJlYWRsaW5lcygpCiAKICAgICBmb3IgaSBpbiByYW5nZShsZW4obGluZXMpKToKQEAgLTQzNiw4ICs0NDYsOCBAQAogICAgICAgICBsaW5lID0gbGluZS5zcGxpdCgiIyIpWzBdICAjIGlnbm9yZSBjb21tZW50cwogCiAgICAgICAgIGlmIFJFR0VYX0tDT05GSUdfREVGLm1hdGNoKGxpbmUpOgotICAgICAgICAgICAgZmVhdHVyZV9kZWYgPSBSRUdFWF9LQ09ORklHX0RFRi5maW5kYWxsKGxpbmUpCi0gICAgICAgICAgICBkZWZpbmVkLmFwcGVuZChmZWF0dXJlX2RlZlswXSkKKyAgICAgICAgICAgIHN5bWJvbF9kZWYgPSBSRUdFWF9LQ09ORklHX0RFRi5maW5kYWxsKGxpbmUpCisgICAgICAgICAgICBkZWZpbmVkLmFwcGVuZChzeW1ib2xfZGVmWzBdKQogICAgICAgICAgICAgc2tpcCA9IEZhbHNlCiAgICAgICAgIGVsaWYgUkVHRVhfS0NPTkZJR19IRUxQLm1hdGNoKGxpbmUpOgogICAgICAgICAgICAgc2tpcCA9IFRydWUKQEAgLTQ0NiwxOCArNDU2LDE4IEBACiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsaWYgUkVHRVhfS0NPTkZJR19TVE1ULm1hdGNoKGxpbmUpOgogICAgICAgICAgICAgbGluZSA9IFJFR0VYX1FVT1RFUy5zdWIoIiIsIGxpbmUpCi0gICAgICAgICAgICBmZWF0dXJlcyA9IGdldF9mZWF0dXJlc19pbl9saW5lKGxpbmUpCisgICAgICAgICAgICBzeW1ib2xzID0gZ2V0X3N5bWJvbHNfaW5fbGluZShsaW5lKQogICAgICAgICAgICAgIyBtdWx0aS1saW5lIHN0YXRlbWVudHMKICAgICAgICAgICAgIHdoaWxlIGxpbmUuZW5kc3dpdGgoIlxcIik6CiAgICAgICAgICAgICAgICAgaSArPSAxCiAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVzW2ldCiAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoJ1xuJykKLSAgICAgICAgICAgICAgICBmZWF0dXJlcy5leHRlbmQoZ2V0X2ZlYXR1cmVzX2luX2xpbmUobGluZSkpCi0gICAgICAgICAgICBmb3IgZmVhdHVyZSBpbiBzZXQoZmVhdHVyZXMpOgotICAgICAgICAgICAgICAgIGlmIFJFR0VYX05VTUVSSUMubWF0Y2goZmVhdHVyZSk6CisgICAgICAgICAgICAgICAgc3ltYm9scy5leHRlbmQoZ2V0X3N5bWJvbHNfaW5fbGluZShsaW5lKSkKKyAgICAgICAgICAgIGZvciBzeW1ib2wgaW4gc2V0KHN5bWJvbHMpOgorICAgICAgICAgICAgICAgIGlmIFJFR0VYX05VTUVSSUMubWF0Y2goc3ltYm9sKToKICAgICAgICAgICAgICAgICAgICAgIyBpZ25vcmUgbnVtZXJpYyB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICByZWZlcmVuY2VzLmFwcGVuZChmZWF0dXJlKQorICAgICAgICAgICAgICAgIHJlZmVyZW5jZXMuYXBwZW5kKHN5bWJvbCkKIAogICAgIHJldHVybiBkZWZpbmVkLCByZWZlcmVuY2VzCiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2hlY2twYXRjaC5wbCBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbAppbmRleCA0ZGUzY2M0Li4yMDZhNmIzIDEwMDc1NQotLS0gYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKKysrIGIvc2NyaXB0cy9jaGVja3BhdGNoLnBsCkBAIC0zNTcwLDE1ICszNTcwLDYgQEAKIAkJCX0KIAkJfQogCi0jIGNoZWNrIGZvciB1c2VzIG9mIERFRklORV9QQ0lfREVWSUNFX1RBQkxFCi0JCWlmICgkbGluZSA9fiAvXGJERUZJTkVfUENJX0RFVklDRV9UQUJMRVxzKlwoXHMqKFx3KylccypcKVxzKj0vKSB7Ci0JCQlpZiAoV0FSTigiREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUiLAotCQkJCSAiUHJlZmVyIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG92ZXIgZGVwcmVjYXRlZCBERUZJTkVfUENJX0RFVklDRV9UQUJMRVxuIiAuICRoZXJlY3VycikgJiYKLQkJCSAgICAkZml4KSB7Ci0JCQkJJGZpeGVkWyRmaXhsaW5lbnJdID1+IHMvXGIoPzpzdGF0aWNccyt8KURFRklORV9QQ0lfREVWSUNFX1RBQkxFXHMqXChccyooXHcrKVxzKlwpXHMqPVxzKi9zdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgJDFcW1xdID0gLzsKLQkJCX0KLQkJfQotCiAjIGNoZWNrIGZvciBuZXcgdHlwZWRlZnMsIG9ubHkgZnVuY3Rpb24gcGFyYW1ldGVycyBhbmQgc3BhcnNlIGFubm90YXRpb25zCiAjIG1ha2Ugc2Vuc2UuCiAJCWlmICgkbGluZSA9fiAvXGJ0eXBlZGVmXHMvICYmCmRpZmYgLS1naXQgYS9zY3JpcHRzL2ZhZGRyMmxpbmUgYi9zY3JpcHRzL2ZhZGRyMmxpbmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDUwYjMzMgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZmFkZHIybGluZQpAQCAtMCwwICsxLDE3NyBAQAorIyEvYmluL2Jhc2gKKyMKKyMgVHJhbnNsYXRlIHN0YWNrIGR1bXAgZnVuY3Rpb24gb2Zmc2V0cy4KKyMKKyMgYWRkcjJsaW5lIGRvZXNuJ3Qgd29yayB3aXRoIEtBU0xSIGFkZHJlc3Nlcy4gIFRoaXMgd29ya3Mgc2ltaWxhcmx5IHRvCisjIGFkZHIybGluZSwgYnV0IGluc3RlYWQgdGFrZXMgdGhlICdmdW5jKzB4MTIzJyBmb3JtYXQgYXMgaW5wdXQ6CisjCisjICAgJCAuL3NjcmlwdHMvZmFkZHIybGluZSB+L2svdm1saW51eCBtZW1pbmZvX3Byb2Nfc2hvdysweDUvMHg1NjgKKyMgICBtZW1pbmZvX3Byb2Nfc2hvdysweDUvMHg1Njg6CisjICAgbWVtaW5mb19wcm9jX3Nob3cgYXQgZnMvcHJvYy9tZW1pbmZvLmM6MjcKKyMKKyMgSWYgdGhlIGFkZHJlc3MgaXMgcGFydCBvZiBhbiBpbmxpbmVkIGZ1bmN0aW9uLCB0aGUgZnVsbCBpbmxpbmUgY2FsbCBjaGFpbiBpcworIyBwcmludGVkOgorIworIyAgICQgLi9zY3JpcHRzL2ZhZGRyMmxpbmUgfi9rL3ZtbGludXggbmF0aXZlX3dyaXRlX21zcisweDYvMHgyNworIyAgIG5hdGl2ZV93cml0ZV9tc3IrMHg2LzB4Mjc6CisjICAgYXJjaF9zdGF0aWNfYnJhbmNoIGF0IGFyY2gveDg2L2luY2x1ZGUvYXNtL21zci5oOjEyMQorIyAgICAoaW5saW5lZCBieSkgc3RhdGljX2tleV9mYWxzZSBhdCBpbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWwuaDoxMjUKKyMgICAgKGlubGluZWQgYnkpIG5hdGl2ZV93cml0ZV9tc3IgYXQgYXJjaC94ODYvaW5jbHVkZS9hc20vbXNyLmg6MTI1CisjCisjIFRoZSBmdW5jdGlvbiBzaXplIGFmdGVyIHRoZSAnLycgaW4gdGhlIGlucHV0IGlzIG9wdGlvbmFsLCBidXQgcmVjb21tZW5kZWQuCisjIEl0J3MgdXNlZCB0byBoZWxwIGRpc2FtYmlndWF0ZSBhbnkgZHVwbGljYXRlIHN5bWJvbCBuYW1lcywgd2hpY2ggY2FuIG9jY3VyCisjIHJhcmVseS4gIElmIHRoZSBzaXplIGlzIG9taXR0ZWQgZm9yIGEgZHVwbGljYXRlIHN5bWJvbCB0aGVuIGl0J3MgcG9zc2libGUgZm9yCisjIG11bHRpcGxlIGNvZGUgc2l0ZXMgdG8gYmUgcHJpbnRlZDoKKyMKKyMgICAkIC4vc2NyaXB0cy9mYWRkcjJsaW5lIH4vay92bWxpbnV4IHJhd19pb2N0bCsweDUKKyMgICByYXdfaW9jdGwrMHg1LzB4MjA6CisjICAgcmF3X2lvY3RsIGF0IGRyaXZlcnMvY2hhci9yYXcuYzoxMjIKKyMKKyMgICByYXdfaW9jdGwrMHg1LzB4YjE6CisjICAgcmF3X2lvY3RsIGF0IG5ldC9pcHY0L3Jhdy5jOjg3NgorIworIyBNdWx0aXBsZSBhZGRyZXNzZXMgY2FuIGJlIHNwZWNpZmllZCBvbiBhIHNpbmdsZSBjb21tYW5kIGxpbmU6CisjCisjICAgJCAuL3NjcmlwdHMvZmFkZHIybGluZSB+L2svdm1saW51eCB0eXBlX3Nob3crMHgxMC80NSBmcmVlX3Jlc2VydmVkX2FyZWErMHg5MAorIyAgIHR5cGVfc2hvdysweDEwLzB4MmQ6CisjICAgdHlwZV9zaG93IGF0IGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2JhY2tsaWdodC5jOjIxMworIworIyAgIGZyZWVfcmVzZXJ2ZWRfYXJlYSsweDkwLzB4MTIzOgorIyAgIGZyZWVfcmVzZXJ2ZWRfYXJlYSBhdCBtbS9wYWdlX2FsbG9jLmM6NjQyOSAoZGlzY3JpbWluYXRvciAyKQorCisKK3NldCAtbyBlcnJleGl0CitzZXQgLW8gbm91bnNldAorCitjb21tYW5kIC12IGF3ayA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJhd2sgaXNuJ3QgaW5zdGFsbGVkIgorY29tbWFuZCAtdiByZWFkZWxmID4vZGV2L251bGwgMj4mMSB8fCBkaWUgInJlYWRlbGYgaXNuJ3QgaW5zdGFsbGVkIgorY29tbWFuZCAtdiBhZGRyMmxpbmUgPi9kZXYvbnVsbCAyPiYxIHx8IGRpZSAiYWRkcjJsaW5lIGlzbid0IGluc3RhbGxlZCIKKwordXNhZ2UoKSB7CisJZWNobyAidXNhZ2U6IGZhZGRyMmxpbmUgPG9iamVjdCBmaWxlPiA8ZnVuYytvZmZzZXQ+IDxmdW5jK29mZnNldD4uLi4iID4mMgorCWV4aXQgMQorfQorCit3YXJuKCkgeworCWVjaG8gIiQxIiA+JjIKK30KKworZGllKCkgeworCWVjaG8gIkVSUk9SOiAkMSIgPiYyCisJZXhpdCAxCit9CisKKyMgVHJ5IHRvIGZpZ3VyZSBvdXQgdGhlIHNvdXJjZSBkaXJlY3RvcnkgcHJlZml4IHNvIHdlIGNhbiByZW1vdmUgaXQgZnJvbSB0aGUKKyMgYWRkcjJsaW5lIG91dHB1dC4gIEhBQ0sgQUxFUlQ6IFRoaXMgYXNzdW1lcyB0aGF0IHN0YXJ0X2tlcm5lbCgpIGlzIGluCisjIGtlcm5lbC9pbml0LmMhICBUaGlzIG9ubHkgd29ya3MgZm9yIHZtbGludXguICBPdGhlcndpc2UgaXQgZmFsbHMgYmFjayB0bworIyBwcmludGluZyB0aGUgYWJzb2x1dGUgcGF0aC4KK2ZpbmRfZGlyX3ByZWZpeCgpIHsKKwlsb2NhbCBvYmpmaWxlPSQxCisKKwlsb2NhbCBzdGFydF9rZXJuZWxfYWRkcj0kKHJlYWRlbGYgLXNXICRvYmpmaWxlIHwgYXdrICckOCA9PSAic3RhcnRfa2VybmVsIiB7cHJpbnRmICIweCVzIiwgJDJ9JykKKwlbWyAteiAkc3RhcnRfa2VybmVsX2FkZHIgXV0gJiYgcmV0dXJuCisKKwlsb2NhbCBmaWxlX2xpbmU9JChhZGRyMmxpbmUgLWUgJG9iamZpbGUgJHN0YXJ0X2tlcm5lbF9hZGRyKQorCVtbIC16ICRmaWxlX2xpbmUgXV0gJiYgcmV0dXJuCisKKwlsb2NhbCBwcmVmaXg9JHtmaWxlX2xpbmUlaW5pdC9tYWluLmM6Kn0KKwlpZiBbWyAteiAkcHJlZml4IF1dIHx8IFtbICRwcmVmaXggPSAkZmlsZV9saW5lIF1dOyB0aGVuCisJCXJldHVybgorCWZpCisKKwlESVJfUFJFRklYPSRwcmVmaXgKKwlyZXR1cm4gMAorfQorCitfX2ZhZGRyMmxpbmUoKSB7CisJbG9jYWwgb2JqZmlsZT0kMQorCWxvY2FsIGZ1bmNfYWRkcj0kMgorCWxvY2FsIGRpcl9wcmVmaXg9JDMKKwlsb2NhbCBwcmludF93YXJuaW5ncz0kNAorCisJbG9jYWwgZnVuYz0ke2Z1bmNfYWRkciUrKn0KKwlsb2NhbCBvZmZzZXQ9JHtmdW5jX2FkZHIjKit9CisJb2Zmc2V0PSR7b2Zmc2V0JS8qfQorCWxvY2FsIHNpemU9CisJW1sgJGZ1bmNfYWRkciA9fiAiLyIgXV0gJiYgc2l6ZT0ke2Z1bmNfYWRkciMqL30KKworCWlmIFtbIC16ICRmdW5jIF1dIHx8IFtbIC16ICRvZmZzZXQgXV0gfHwgW1sgJGZ1bmMgPSAkZnVuY19hZGRyIF1dOyB0aGVuCisJCXdhcm4gImJhZCBmdW5jK29mZnNldCAkZnVuY19hZGRyIgorCQlET05FPTEKKwkJcmV0dXJuCisJZmkKKworCSMgR28gdGhyb3VnaCBlYWNoIG9mIHRoZSBvYmplY3QncyBzeW1ib2xzIHdoaWNoIG1hdGNoIHRoZSBmdW5jIG5hbWUuCisJIyBJbiByYXJlIGNhc2VzIHRoZXJlIG1pZ2h0IGJlIGR1cGxpY2F0ZXMuCisJd2hpbGUgcmVhZCBzeW1ib2w7IGRvCisJCWxvY2FsIGZpZWxkcz0oJHN5bWJvbCkKKwkJbG9jYWwgc3ltX2Jhc2U9MHgke2ZpZWxkc1sxXX0KKwkJbG9jYWwgc3ltX3NpemU9JHtmaWVsZHNbMl19CisJCWxvY2FsIHN5bV90eXBlPSR7ZmllbGRzWzNdfQorCisJCSMgY2FsY3VsYXRlIHRoZSBhZGRyZXNzCisJCWxvY2FsIGFkZHI9JCgoJHN5bV9iYXNlICsgJG9mZnNldCkpCisJCWlmIFtbIC16ICRhZGRyIF1dIHx8IFtbICRhZGRyID0gMCBdXTsgdGhlbgorCQkJd2FybiAiYmFkIGFkZHJlc3M6ICRzeW1fYmFzZSArICRvZmZzZXQiCisJCQlET05FPTEKKwkJCXJldHVybgorCQlmaQorCQlsb2NhbCBoZXhhZGRyPTB4JChwcmludGYgJXggJGFkZHIpCisKKwkJIyB3ZWVkIG91dCBub24tZnVuY3Rpb24gc3ltYm9scworCQlpZiBbWyAkc3ltX3R5cGUgIT0gIkZVTkMiIF1dOyB0aGVuCisJCQlbWyAkcHJpbnRfd2FybmluZ3MgPSAxIF1dICYmCisJCQkJZWNobyAic2tpcHBpbmcgJGZ1bmMgYWRkcmVzcyBhdCAkaGV4YWRkciBkdWUgdG8gbm9uLWZ1bmN0aW9uIHN5bWJvbCIKKwkJCWNvbnRpbnVlCisJCWZpCisKKwkJIyBpZiB0aGUgdXNlciBwcm92aWRlZCBhIHNpemUsIG1ha2Ugc3VyZSBpdCBtYXRjaGVzIHRoZSBzeW1ib2wncyBzaXplCisJCWlmIFtbIC1uICRzaXplIF1dICYmIFtbICRzaXplIC1uZSAkc3ltX3NpemUgXV07IHRoZW4KKwkJCVtbICRwcmludF93YXJuaW5ncyA9IDEgXV0gJiYKKwkJCQllY2hvICJza2lwcGluZyAkZnVuYyBhZGRyZXNzIGF0ICRoZXhhZGRyIGR1ZSB0byBzaXplIG1pc21hdGNoICgkc2l6ZSAhPSAkc3ltX3NpemUpIgorCQkJY29udGludWU7CisJCWZpCisKKwkJIyBtYWtlIHN1cmUgdGhlIHByb3ZpZGVkIG9mZnNldCBpcyB3aXRoaW4gdGhlIHN5bWJvbCdzIHJhbmdlCisJCWlmIFtbICRvZmZzZXQgLWd0ICRzeW1fc2l6ZSBdXTsgdGhlbgorCQkJW1sgJHByaW50X3dhcm5pbmdzID0gMSBdXSAmJgorCQkJCWVjaG8gInNraXBwaW5nICRmdW5jIGFkZHJlc3MgYXQgJGhleGFkZHIgZHVlIHRvIHNpemUgbWlzbWF0Y2ggKCRvZmZzZXQgPiAkc3ltX3NpemUpIgorCQkJY29udGludWUKKwkJZmkKKworCQkjIHNlcGFyYXRlIG11bHRpcGxlIGVudHJpZXMgd2l0aCBhIGJsYW5rIGxpbmUKKwkJW1sgJEZJUlNUID0gMCBdXSAmJiBlY2hvCisJCUZJUlNUPTAKKworCQlsb2NhbCBoZXhzaXplPTB4JChwcmludGYgJXggJHN5bV9zaXplKQorCQllY2hvICIkZnVuYyskb2Zmc2V0LyRoZXhzaXplOiIKKwkJYWRkcjJsaW5lIC1mcGllICRvYmpmaWxlICRoZXhhZGRyIHwgc2VkICJzOyAkZGlyX3ByZWZpeFwoXC4vXCkqOyA7IgorCQlET05FPTEKKworCWRvbmUgPCA8KHJlYWRlbGYgLXNXICRvYmpmaWxlIHwgYXdrIC12IGY9JGZ1bmMgJyQ4ID09IGYge3ByaW50fScpCit9CisKK1tbICQjIC1sdCAyIF1dICYmIHVzYWdlCisKK29iamZpbGU9JDEKK1tbICEgLWYgJG9iamZpbGUgXV0gJiYgZGllICJjYW4ndCBmaW5kIG9iamZpbGUgJG9iamZpbGUiCitzaGlmdAorCitESVJfUFJFRklYPXN1cGVyY2FsaWZyYWdpbGlzdGljZXhwaWFsaWRvY2lvdXMKK2ZpbmRfZGlyX3ByZWZpeCAkb2JqZmlsZQorCitGSVJTVD0xCit3aGlsZSBbWyAkIyAtZ3QgMCBdXTsgZG8KKwlmdW5jX2FkZHI9JDEKKwlzaGlmdAorCisJIyBwcmludCBhbnkgbWF0Y2hlcyBmb3VuZAorCURPTkU9MAorCV9fZmFkZHIybGluZSAkb2JqZmlsZSAkZnVuY19hZGRyICRESVJfUFJFRklYIDAKKworCSMgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kLCBwcmludCB3YXJuaW5ncworCWlmIFtbICRET05FID0gMCBdXTsgdGhlbgorCQlfX2ZhZGRyMmxpbmUgJG9iamZpbGUgJGZ1bmNfYWRkciAkRElSX1BSRUZJWCAxCisJCXdhcm4gIm5vIG1hdGNoIGZvciAkZnVuY19hZGRyIgorCWZpCitkb25lCmRpZmYgLS1naXQgYS9zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsIGIvc2NyaXB0cy9nZXRfbWFpbnRhaW5lci5wbAppbmRleCA0OWEwMGQ1Li5hZWQ0NTExIDEwMDc1NQotLS0gYS9zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsCisrKyBiL3NjcmlwdHMvZ2V0X21haW50YWluZXIucGwKQEAgLTIxMzYsOSArMjEzNiwxMSBAQAogCiAgICAgbXkgJGNtZCA9ICRWQ1NfY21kc3siZmlsZV9leGlzdHNfY21kIn07CiAgICAgJGNtZCA9fiBzLyhcJFx3KykvJDEvZWVnOwkJIyBpbnRlcnBvbGF0ZSAkY21kCi0KKyAgICAkY21kIC49ICIgMj4mMSI7CiAgICAgJGV4aXN0cyA9ICZ7JFZDU19jbWRzeyJleGVjdXRlX2NtZCJ9fSgkY21kKTsKIAorICAgIHJldHVybiAwIGlmICgkPyAhPSAwKTsKKwogICAgIHJldHVybiAkZXhpc3RzOwogfQogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tlcm5lbC1kb2MgYi9zY3JpcHRzL2tlcm5lbC1kb2MKaW5kZXggNGYyZTkwNC4uOTM3MjFmMyAxMDA3NTUKLS0tIGEvc2NyaXB0cy9rZXJuZWwtZG9jCisrKyBiL3NjcmlwdHMva2VybmVsLWRvYwpAQCAtMjEyLDYgKzIxMiw3IEBACiBteSAkdHlwZV9jb25zdGFudCA9ICdcJShbLV9cd10rKSc7CiBteSAkdHlwZV9mdW5jID0gJyhcdyspXChcKSc7CiBteSAkdHlwZV9wYXJhbSA9ICdcQChcdyspJzsKK215ICR0eXBlX2ZwX3BhcmFtID0gJ1xAKFx3KylcKFwpJzsgICMgU3BlY2lhbCBSU1QgaGFuZGxpbmcgZm9yIGZ1bmMgcHRyIHBhcmFtcwogbXkgJHR5cGVfc3RydWN0ID0gJ1wmKChzdHJ1Y3RccyopKltfXHddKyknOwogbXkgJHR5cGVfc3RydWN0X3htbCA9ICdcXCZhbXA7KChzdHJ1Y3RccyopKltfXHddKyknOwogbXkgJHR5cGVfZW52ID0gJyhcJFx3KyknOwpAQCAtMjkyLDYgKzI5Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICMgTm90ZTogbmVlZCB0byBlc2NhcGUgKCkgdG8gYXZvaWQgZnVuYyBtYXRjaGluZyBsYXRlcgogICAgICAgICAgICAgICAgICAgICAgICBbJHR5cGVfbWVtYmVyX2Z1bmMsICJcXDpjXFw6dHlwZVxcOmBcJDFcJDJcXFxcKFxcXFwpIDxcJDE+YCJdLAogICAgICAgICAgICAgICAgICAgICAgICBbJHR5cGVfbWVtYmVyLCAiXFw6Y1xcOnR5cGVcXDpgXCQxXCQyIDxcJDE+YCJdLAorCQkgICAgICAgWyR0eXBlX2ZwX3BhcmFtLCAiKipcJDFcXFxcKFxcXFwpKioiXSwKICAgICAgICAgICAgICAgICAgICAgICAgWyR0eXBlX2Z1bmMsICJcXDpjXFw6ZnVuY1xcOmBcJDEoKWAiXSwKICAgICAgICAgICAgICAgICAgICAgICAgWyR0eXBlX3N0cnVjdF9mdWxsLCAiXFw6Y1xcOnR5cGVcXDpgXCQxIFwkMiA8XCQyPmAiXSwKICAgICAgICAgICAgICAgICAgICAgICAgWyR0eXBlX2VudW1fZnVsbCwgIlxcOmNcXDp0eXBlXFw6YFwkMSBcJDIgPFwkMj5gIl0sCkBAIC00MTIsNyArNDE0LDcgQEAKIG15ICRkb2NfZGVjbCA9ICRkb2NfY29tIC4gJyhcdyspJzsKICMgQHBhcmFtcyBhbmQgYSBzdHJpY3RseSBsaW1pdGVkIHNldCBvZiBzdXBwb3J0ZWQgc2VjdGlvbiBuYW1lcwogbXkgJGRvY19zZWN0ID0gJGRvY19jb20gLiAKLSAgICAnXHMqKFxAXHcrfGRlc2NyaXB0aW9ufGNvbnRleHR8cmV0dXJucz98bm90ZXM/fGV4YW1wbGVzPylccyo6KC4qKSc7CisgICAgJ1xzKihcQFsuXHddK3xcQFwuXC5cLnxkZXNjcmlwdGlvbnxjb250ZXh0fHJldHVybnM/fG5vdGVzP3xleGFtcGxlcz8pXHMqOiguKiknOwogbXkgJGRvY19jb250ZW50ID0gJGRvY19jb21fYm9keSAuICcoLiopJzsKIG15ICRkb2NfYmxvY2sgPSAkZG9jX2NvbSAuICdET0M6XHMqKC4qKT8nOwogbXkgJGRvY19pbmxpbmVfc3RhcnQgPSAnXlxzKi9cKlwqXHMqJCc7CkBAIC0xODMxLDEzICsxODMzLDIyIEBACiAgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKICAgICBteSAoJHBhcmFtZXRlciwgJHNlY3Rpb24pOwogICAgIG15ICRvbGRwcmVmaXggPSAkbGluZXByZWZpeDsKLSAgICBteSAkc3RhcnQ7CisgICAgbXkgJHN0YXJ0ID0gIiI7CiAKLSAgICBwcmludCAiLi4gYzpmdW5jdGlvbjo6ICI7Ci0gICAgaWYgKCRhcmdzeydmdW5jdGlvbnR5cGUnfSBuZSAiIikgewotCSRzdGFydCA9ICRhcmdzeydmdW5jdGlvbnR5cGUnfSAuICIgIiAuICRhcmdzeydmdW5jdGlvbid9IC4gIiAoIjsKKyAgICBpZiAoJGFyZ3N7J3R5cGVkZWYnfSkgeworCXByaW50ICIuLiBjOnR5cGU6OiAiLiAkYXJnc3snZnVuY3Rpb24nfSAuICJcblxuIjsKKwlwcmludF9saW5lbm8oJGRlY2xhcmF0aW9uX3N0YXJ0X2xpbmUpOworCXByaW50ICIgICAqKlR5cGVkZWYqKjogIjsKKwkkbGluZXByZWZpeCA9ICIiOworCW91dHB1dF9oaWdobGlnaHRfcnN0KCRhcmdzeydwdXJwb3NlJ30pOworCSRzdGFydCA9ICJcblxuKipTeW50YXgqKlxuXG4gIGBgIjsKICAgICB9IGVsc2UgewotCSRzdGFydCA9ICRhcmdzeydmdW5jdGlvbid9IC4gIiAoIjsKKwlwcmludCAiLi4gYzpmdW5jdGlvbjo6ICI7CisgICAgfQorICAgIGlmICgkYXJnc3snZnVuY3Rpb250eXBlJ30gbmUgIiIpIHsKKwkkc3RhcnQgLj0gJGFyZ3N7J2Z1bmN0aW9udHlwZSd9IC4gIiAiIC4gJGFyZ3N7J2Z1bmN0aW9uJ30gLiAiICgiOworICAgIH0gZWxzZSB7CisJJHN0YXJ0IC49ICRhcmdzeydmdW5jdGlvbid9IC4gIiAoIjsKICAgICB9CiAgICAgcHJpbnQgJHN0YXJ0OwogCkBAIC0xODQ5LDkgKzE4NjAsNiBAQAogCSRjb3VudCsrOwogCSR0eXBlID0gJGFyZ3N7J3BhcmFtZXRlcnR5cGVzJ317JHBhcmFtZXRlcn07CiAKLQkjIFJTVCBkb2Vzbid0IGxpa2UgYWRkcmVzc19zcGFjZSB0YWdzIGF0IGZ1bmN0aW9uIHByb3RvdHlwZXMKLQkkdHlwZSA9fiBzL19fKHVzZXJ8a2VybmVsfGlvbWVtfHBlcmNwdXxwbWVtfHJjdSlccyovLzsKLQogCWlmICgkdHlwZSA9fiBtLyhbXlwoXSpcKFwqKVxzKlwpXHMqXCgoW15cKV0qKVwpLykgewogCSAgICAjIHBvaW50ZXItdG8tZnVuY3Rpb24KIAkgICAgcHJpbnQgJDEgLiAkcGFyYW1ldGVyIC4gIikgKCIgLiAkMjsKQEAgLTE4NTksMTEgKzE4NjcsMTUgQEAKIAkgICAgcHJpbnQgJHR5cGUgLiAiICIgLiAkcGFyYW1ldGVyOwogCX0KICAgICB9Ci0gICAgcHJpbnQgIilcblxuIjsKLSAgICBwcmludF9saW5lbm8oJGRlY2xhcmF0aW9uX3N0YXJ0X2xpbmUpOwotICAgICRsaW5lcHJlZml4ID0gIiAgICI7Ci0gICAgb3V0cHV0X2hpZ2hsaWdodF9yc3QoJGFyZ3N7J3B1cnBvc2UnfSk7Ci0gICAgcHJpbnQgIlxuIjsKKyAgICBpZiAoJGFyZ3N7J3R5cGVkZWYnfSkgeworCXByaW50ICIpO2BgXG5cbiI7CisgICAgfSBlbHNlIHsKKwlwcmludCAiKVxuXG4iOworCXByaW50X2xpbmVubygkZGVjbGFyYXRpb25fc3RhcnRfbGluZSk7CisJJGxpbmVwcmVmaXggPSAiICAgIjsKKwlvdXRwdXRfaGlnaGxpZ2h0X3JzdCgkYXJnc3sncHVycG9zZSd9KTsKKwlwcmludCAiXG4iOworICAgIH0KIAogICAgIHByaW50ICIqKlBhcmFtZXRlcnMqKlxuXG4iOwogICAgICRsaW5lcHJlZml4ID0gIiAgIjsKQEAgLTIwMDMsNyArMjAxNSw3IEBACiAJKCRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJfbmFtZX0gbmUgJHVuZGVzY3JpYmVkKSB8fCBuZXh0OwogCSR0eXBlID0gJGFyZ3N7J3BhcmFtZXRlcnR5cGVzJ317JHBhcmFtZXRlcn07CiAgICAgICAgIHByaW50X2xpbmVubygkcGFyYW1ldGVyZGVzY19zdGFydF9saW5lc3skcGFyYW1ldGVyX25hbWV9KTsKLQlwcmludCAiYGAkdHlwZSAkcGFyYW1ldGVyYGBcbiI7CisJcHJpbnQgImBgIiAuICRwYXJhbWV0ZXIgLiAiYGBcbiI7CiAJb3V0cHV0X2hpZ2hsaWdodF9yc3QoJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcl9uYW1lfSk7CiAJcHJpbnQgIlxuIjsKICAgICB9CkBAIC0yMTkzLDcgKzIyMDUsOSBAQAogICAgICR4ID1+IHNAL1wqLio/XCovQEBnb3M7CSMgc3RyaXAgY29tbWVudHMuCiAKICAgICAjIFBhcnNlIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICBpZiAoJHggPX4gL3R5cGVkZWZccysoXHcrKVxzKlwoXCpccyooXHdcUyspXHMqXClccypcKCguKilcKTsvKSB7CisgICAgaWYgKCR4ID1+IC90eXBlZGVmXHMrKFx3KylccypcKFwqXHMqKFx3XFMrKVxzKlwpXHMqXCgoLiopXCk7LyB8fAorCSR4ID1+IC90eXBlZGVmXHMrKFx3KylccyooXHdcUyspXHMqXHMqXCgoLiopXCk7LykgeworCiAJIyBGdW5jdGlvbiB0eXBlZGVmcwogCSRyZXR1cm5fdHlwZSA9ICQxOwogCSRkZWNsYXJhdGlvbl9uYW1lID0gJDI7CkBAIC0yMjA0LDYgKzIyMTgsNyBAQAogCW91dHB1dF9kZWNsYXJhdGlvbigkZGVjbGFyYXRpb25fbmFtZSwKIAkJCSAgICdmdW5jdGlvbicsCiAJCQkgICB7J2Z1bmN0aW9uJyA9PiAkZGVjbGFyYXRpb25fbmFtZSwKKwkJCSAgICAndHlwZWRlZicgPT4gMSwKIAkJCSAgICAnbW9kdWxlJyA9PiAkbW9kdWxlbmFtZSwKIAkJCSAgICAnZnVuY3Rpb250eXBlJyA9PiAkcmV0dXJuX3R5cGUsCiAJCQkgICAgJ3BhcmFtZXRlcmxpc3QnID0+IFxAcGFyYW1ldGVybGlzdCwKQEAgLTIzMzgsNiArMjM1Myw3IEBACiAKIAlpZiAoJHR5cGUgZXEgIiIgJiYgJHBhcmFtID1+IC9cLlwuXC4kLykKIAl7CisJICAgICRwYXJhbSA9ICIuLi4iOwogCSAgICBpZiAoIWRlZmluZWQgJHBhcmFtZXRlcmRlc2NzeyRwYXJhbX0gfHwgJHBhcmFtZXRlcmRlc2NzeyRwYXJhbX0gZXEgIiIpIHsKIAkJJHBhcmFtZXRlcmRlc2NzeyRwYXJhbX0gPSAidmFyaWFibGUgYXJndW1lbnRzIjsKIAkgICAgfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wYWNrYWdlL2J1aWxkZGViIGIvc2NyaXB0cy9wYWNrYWdlL2J1aWxkZGViCmluZGV4IGUxYzA5ZTIuLjhlYTlmZDIgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvcGFja2FnZS9idWlsZGRlYgorKysgYi9zY3JpcHRzL3BhY2thZ2UvYnVpbGRkZWIKQEAgLTMzMiw3ICszMzIsOSBAQAogCShjZCAkb2JqdHJlZTsgZmluZCB0b29scy9vYmp0b29sIC10eXBlIGYgLWV4ZWN1dGFibGUpID4+ICIkb2JqdHJlZS9kZWJpYW4vaGRyb2JqZmlsZXMiCiBmaQogKGNkICRvYmp0cmVlOyBmaW5kIGFyY2gvJFNSQ0FSQ0gvaW5jbHVkZSBNb2R1bGUuc3ltdmVycyBpbmNsdWRlIHNjcmlwdHMgLXR5cGUgZikgPj4gIiRvYmp0cmVlL2RlYmlhbi9oZHJvYmpmaWxlcyIKLShjZCAkb2JqdHJlZTsgZmluZCBzY3JpcHRzL2djYy1wbHVnaW5zIC1uYW1lIFwqLnNvIC1vIC1uYW1lIGdjYy1jb21tb24uaCkgPj4gIiRvYmp0cmVlL2RlYmlhbi9oZHJvYmpmaWxlcyIKK2lmIGdyZXAgLXEgJ15DT05GSUdfR0NDX1BMVUdJTlM9eScgJEtDT05GSUdfQ09ORklHIDsgdGhlbgorCShjZCAkb2JqdHJlZTsgZmluZCBzY3JpcHRzL2djYy1wbHVnaW5zIC1uYW1lIFwqLnNvIC1vIC1uYW1lIGdjYy1jb21tb24uaCkgPj4gIiRvYmp0cmVlL2RlYmlhbi9oZHJvYmpmaWxlcyIKK2ZpCiBkZXN0ZGlyPSRrZXJuZWxfaGVhZGVyc19kaXIvdXNyL3NyYy9saW51eC1oZWFkZXJzLSR2ZXJzaW9uCiBta2RpciAtcCAiJGRlc3RkaXIiCiAoY2QgJHNyY3RyZWU7IHRhciAtYyAtZiAtIC1UIC0pIDwgIiRvYmp0cmVlL2RlYmlhbi9oZHJzcmNmaWxlcyIgfCAoY2QgJGRlc3RkaXI7IHRhciAteGYgLSkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcmVjb3JkbWNvdW50LmMgYi9zY3JpcHRzL3JlY29yZG1jb3VudC5jCmluZGV4IDQyMzk2YTcuLmE2OGYwMzEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvcmVjb3JkbWNvdW50LmMKKysrIGIvc2NyaXB0cy9yZWNvcmRtY291bnQuYwpAQCAtMzYzLDYgKzM2Myw3IEBACiAJCXN0cmNtcCgiLnNjaGVkLnRleHQiLCAgICB0eHRuYW1lKSA9PSAwIHx8CiAJCXN0cmNtcCgiLnNwaW5sb2NrLnRleHQiLCB0eHRuYW1lKSA9PSAwIHx8CiAJCXN0cmNtcCgiLmlycWVudHJ5LnRleHQiLCB0eHRuYW1lKSA9PSAwIHx8CisJCXN0cmNtcCgiLnNvZnRpcnFlbnRyeS50ZXh0IiwgdHh0bmFtZSkgPT0gMCB8fAogCQlzdHJjbXAoIi5rcHJvYmVzLnRleHQiLCB0eHRuYW1lKSA9PSAwIHx8CiAJCXN0cmNtcCgiLnRleHQudW5saWtlbHkiLCB0eHRuYW1lKSA9PSAwOwogfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9yZWNvcmRtY291bnQucGwgYi9zY3JpcHRzL3JlY29yZG1jb3VudC5wbAppbmRleCA5NmUyNDg2Li4yZDQ4MDExIDEwMDc1NQotLS0gYS9zY3JpcHRzL3JlY29yZG1jb3VudC5wbAorKysgYi9zY3JpcHRzL3JlY29yZG1jb3VudC5wbApAQCAtMTM0LDYgKzEzNCw3IEBACiAgICAgICIuc2NoZWQudGV4dCIgPT4gMSwKICAgICAgIi5zcGlubG9jay50ZXh0IiA9PiAxLAogICAgICAiLmlycWVudHJ5LnRleHQiID0+IDEsCisgICAgICIuc29mdGlycWVudHJ5LnRleHQiID0+IDEsCiAgICAgICIua3Byb2Jlcy50ZXh0IiA9PiAxLAogICAgICAiLnRleHQudW5saWtlbHkiID0+IDEsCiApOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90YWdzLnNoIGIvc2NyaXB0cy90YWdzLnNoCmluZGV4IGVkN2VlZjIuLmIzNzc1YTkgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvdGFncy5zaAorKysgYi9zY3JpcHRzL3RhZ3Muc2gKQEAgLTIwNiw3ICsyMDYsNiBAQAogCScvXDxERUZJTkVfUEVSX0NQVV9TSEFSRURfQUxJR05FRChbXixdKiwgKlwoW1s6YWxudW06XV9dKlwpL1wxL3YvJwogCScvXDxERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChcKFtbOmFsbnVtOl1fXSpcKS9cMS92LycKIAknL1w8REVDTEFSRV9cKFRBU0tMRVRcfFdPUktcfERFTEFZRURfV09SS1wpKFwoW1s6YWxudW06XV9dKlwpL1wyL3YvJwotCScvXDxERUZJTkVfUENJX0RFVklDRV9UQUJMRShcKFtbOmFsbnVtOl1fXSpcKS9cMS92LycKIAknL1woXlxzXClPRkZTRVQoXChbWzphbG51bTpdX10qXCkvXDIvdi8nCiAJJy9cKF5cc1wpREVGSU5FKFwoW1s6YWxudW06XV9dKlwpL1wyL3YvJwogCScvXDxERUZJTkVfSEFTSFRBQkxFKFwoW1s6YWxudW06XV9dKlwpL1wxL3YvJwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy92ZXJfbGludXggYi9zY3JpcHRzL3Zlcl9saW51eAppbmRleCAwZDhiZDI5Li40MzBiMjAxIDEwMDc1NQotLS0gYS9zY3JpcHRzL3Zlcl9saW51eAorKysgYi9zY3JpcHRzL3Zlcl9saW51eApAQCAtMSwxOTMgKzEsODkgQEAKLSMhL2Jpbi9zaAorIyEvYmluL2F3ayAtZgogIyBCZWZvcmUgcnVubmluZyB0aGlzIHNjcmlwdCBwbGVhc2UgZW5zdXJlIHRoYXQgeW91ciBQQVRIIGlzCiAjIHR5cGljYWwgYXMgeW91IHVzZSBmb3IgY29tcGlsYXRpb24vaW5zdGFsbGF0aW9uLiBJIHVzZQogIyAvYmluIC9zYmluIC91c3IvYmluIC91c3Ivc2JpbiAvdXNyL2xvY2FsL2JpbiwgYnV0IGl0IG1heQogIyBkaWZmZXIgb24geW91ciBzeXN0ZW0uCi0jCi1lY2hvICdJZiBzb21lIGZpZWxkcyBhcmUgZW1wdHkgb3IgbG9vayB1bnVzdWFsIHlvdSBtYXkgaGF2ZSBhbiBvbGQgdmVyc2lvbi4nCi1lY2hvICdDb21wYXJlIHRvIHRoZSBjdXJyZW50IG1pbmltYWwgcmVxdWlyZW1lbnRzIGluIERvY3VtZW50YXRpb24vQ2hhbmdlcy4nCi1lY2hvICcgJwogCi11bmFtZSAtYQotZWNobyAnICcKK0JFR0lOIHsKKwl1c2FnZSA9ICJJZiBzb21lIGZpZWxkcyBhcmUgZW1wdHkgb3IgbG9vayB1bnVzdWFsIHlvdSBtYXkgaGF2ZSBhbiBvbGQgdmVyc2lvbi5cbiIKKwl1c2FnZSA9IHVzYWdlICJDb21wYXJlIHRvIHRoZSBjdXJyZW50IG1pbmltYWwgcmVxdWlyZW1lbnRzIGluIERvY3VtZW50YXRpb24vQ2hhbmdlcy5cbiIKKwlwcmludCB1c2FnZQogCi1nY2MgLWR1bXB2ZXJzaW9uIDI+JjEgfAotYXdrICcvWzAtOV0rKFsuXT9bMC05XSspKy8gJiYgIS9ub3QgZm91bmQkL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiR05VIENcdFx0XHQlc1xuIiwKLQlzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpKQotfScKKwlzeXN0ZW0oInVuYW1lIC1hIikKKwlwcmludGYoIlxuIikKIAotbWFrZSAtLXZlcnNpb24gMj4mMSB8Ci1hd2sgJy9HTlUgTWFrZS97Ci0JbWF0Y2goJDAsIC9bMC05XSsoWy5dP1swLTldKykrLykKLQlwcmludGYoIkdOVSBNYWtlXHRcdCVzXG4iLAotCXN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkpCi19JworCXByaW50dmVyc2lvbigiR05VIEMiLCB2ZXJzaW9uKCJnY2MgLWR1bXB2ZXJzaW9uIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIkdOVSBNYWtlIiwgdmVyc2lvbigibWFrZSAtLXZlcnNpb24gMj4mMSIpKQorCXByaW50dmVyc2lvbigiQmludXRpbHMiLCB2ZXJzaW9uKCJsZCAtdiAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJVdGlsLWxpbnV4IiwgdmVyc2lvbigibW91bnQgLS12ZXJzaW9uIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIk1vdW50IiwgdmVyc2lvbigibW91bnQgLS12ZXJzaW9uIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIk1vZHVsZS1pbml0LXRvb2xzIiwgdmVyc2lvbigiZGVwbW9kIC1WICAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJFMmZzcHJvZ3MiLCB2ZXJzaW9uKCJ0dW5lMmZzIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIkpmc3V0aWxzIiwgdmVyc2lvbigiZnNjay5qZnMgLVYgMj4mMSIpKQorCXByaW50dmVyc2lvbigiUmVpc2VyZnNwcm9ncyIsIHZlcnNpb24oInJlaXNlcmZzY2sgLVYgMj4mMSIpKQorCXByaW50dmVyc2lvbigiUmVpc2VyNGZzcHJvZ3MiLCB2ZXJzaW9uKCJmc2NrLnJlaXNlcjQgLVYgMj4mMSIpKQorCXByaW50dmVyc2lvbigiWGZzcHJvZ3MiLCB2ZXJzaW9uKCJ4ZnNfZGIgLVYgMj4mMSIpKQorCXByaW50dmVyc2lvbigiUGNtY2lhdXRpbHMiLCB2ZXJzaW9uKCJwY2NhcmRjdGwgLVYgMj4mMSIpKQorCXByaW50dmVyc2lvbigiUGNtY2lhLWNzIiwgdmVyc2lvbigiY2FyZG1nciAtViAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJRdW90YS10b29scyIsIHZlcnNpb24oInF1b3RhIC1WIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIlBQUCIsIHZlcnNpb24oInBwcGQgLS12ZXJzaW9uIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIklzZG40ay11dGlscyIsIHZlcnNpb24oImlzZG5jdHJsIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIk5mcy11dGlscyIsIHZlcnNpb24oInNob3dtb3VudCAtLXZlcnNpb24gMj4mMSIpKQogCi1sZCAtdiAyPiYxIHwKLWF3ayAnL1swLTldKyhbLl0/WzAtOV0rKSsvICYmICEvbm90IGZvdW5kJC97Ci0JbWF0Y2goJDAsIC9bMC05XSsoWy5dP1swLTldKykrLykKLQlwcmludGYoIkJpbnV0aWxzXHRcdCVzXG4iLAotCXN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkpCi19JwotCi1tb3VudCAtLXZlcnNpb24gMj4mMSB8Ci1hd2sgJy9bMC05XSsoWy5dP1swLTldKykrLyAmJiAhL25vdCBmb3VuZCQvewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JJDAgPSBzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpCi0JcHJpbnRmKCJVdGlsLWxpbnV4XHRcdCVzXG5Nb3VudFx0XHRcdCVzXG4iLCQwLCQwKQotfScKLQotZGVwbW9kIC1WICAyPiYxIHwKLWF3ayAnL1swLTldKyhbLl0/WzAtOV0rKSsvICYmICEvbm90IGZvdW5kJC97Ci0JbWF0Y2goJDAsIC9bMC05XSsoWy5dP1swLTldKykrLykKLQlwcmludGYoIk1vZHVsZS1pbml0LXRvb2xzXHQlc1xuIiwKLQlzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpKQotfScKLQotdHVuZTJmcyAyPiYxIHwKLWF3ayAnL150dW5lMmZzL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiRTJmc3Byb2dzXHRcdCVzXG4iLAotCXN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkpCi19JwotCi1mc2NrLmpmcyAtViAyPiYxIHwKLWF3ayAnL3ZlcnNpb24vewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JcHJpbnRmKCJKZnN1dGlsc1x0XHQlc1xuIiwKLQlzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpKQotfScKLQotcmVpc2VyZnNjayAtViAyPiYxIHwKLWF3ayAnL15yZWlzZXJmc2NrL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiUmVpc2VyZnNwcm9nc1x0XHQlc1xuIiwKLQlzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpKQotfScKLQotZnNjay5yZWlzZXI0IC1WIDI+JjEgfCBncmVwIF5mc2NrLnJlaXNlcjQgfCBhd2sgXAotJ05SPT0xe3ByaW50ICJyZWlzZXI0cHJvZ3MgICAgICAgICAgIiwgJDJ9JwotCi14ZnNfZGIgLVYgMj4mMSB8Ci1hd2sgJy92ZXJzaW9uL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiWGZzcHJvZ3NcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCi0KLXBjY2FyZGN0bCAtViAyPiYxIHwKLWF3ayAnL3BjbWNpYXV0aWxzL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiUGNtY2lhdXRpbHNcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCi0KLWNhcmRtZ3IgLVYgMj4mMXwgZ3JlcCB2ZXJzaW9uIHwgYXdrIFwKLSdOUj09MXtwcmludCAicGNtY2lhLWNzICAgICAgICAgICAgICIsICQzfScKLQotcXVvdGEgLVYgMj4mMSB8Ci1hd2sgJy92ZXJzaW9uL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiUXVvdGEtdG9vbHNcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCi0KLXBwcGQgLS12ZXJzaW9uIDI+JjEgfAotYXdrICcvdmVyc2lvbi97Ci0JbWF0Y2goJDAsIC9bMC05XSsoWy5dP1swLTldKykrLykKLQlwcmludGYoIlBQUFx0XHRcdCVzXG4iLAotCXN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkpCi19JwotCi1pc2RuY3RybCAyPiYxIHwgZ3JlcCB2ZXJzaW9uIHwgYXdrIFwKLSdOUj09MXtwcmludCAiaXNkbjRrLXV0aWxzICAgICAgICAgICIsICRORn0nCi0KLXNob3dtb3VudCAtLXZlcnNpb24gMj4mMSB8IGdyZXAgbmZzLXV0aWxzIHwgYXdrIFwKLSdOUj09MXtwcmludCAibmZzLXV0aWxzICAgICAgICAgICAgICIsICRORn0nCi0KLXRlc3QgLXIgL3Byb2Mvc2VsZi9tYXBzICYmCi1zZWQgJwotCS8uKmxpYmMtXCguKlwpXC5zbyQvIWQKLQlzLy9MaW51eCBDIExpYnJhcnlcdFx0XDEvCi0JcQotJyAvcHJvYy9zZWxmL21hcHMKLQotbGRkIC0tdmVyc2lvbiAyPiYxIHwKLWF3ayAnL15sZGQvewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JcHJpbnRmKCJEeW5hbWljIGxpbmtlciAobGRkKVx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCi0KLWxpYmNwcD1gbGRjb25maWcgLXAgMj4vZGV2L251bGwgfAotCWF3ayAnLyhsaWJnfHN0ZGMpWytdK1wuc28vIHsKLQlwcmludCAkTkYKLQlleGl0CisJaWYgKHN5c3RlbSgidGVzdCAtciAvcHJvYy9zZWxmL21hcHMiKSA9PSAwKSB7CisJCXdoaWxlIChnZXRsaW5lIDwiL3Byb2Mvc2VsZi9tYXBzIiA+IDApIHsKKwkJCW4gPSBzcGxpdCgkMCwgcHJvY21hcHMsICIvIikKKwkJCWlmICgvbGliYy4qc28kLyAmJiBtYXRjaChwcm9jbWFwc1tuXSwgL1swLTldKyhbLl0/WzAtOV0rKSsvKSkgeworCQkJCXZlciA9IHN1YnN0cihwcm9jbWFwc1tuXSwgUlNUQVJULCBSTEVOR1RIKQorCQkJCXByaW50dmVyc2lvbigiTGludXggQyBMaWJyYXJ5IiwgdmVyKQorCQkJCWJyZWFrCisJCQl9CisJCX0KIAl9Ci0nYAotdGVzdCAtciAiJGxpYmNwcCIgJiYKLWxzIC1sICRsaWJjcHAgfAotc2VkICcKLQlzIS4qc29cLiEhCi0JcyFeIUxpbnV4IEMrKyBMaWJyYXJ5XHQhCi0nCi1wcyAtLXZlcnNpb24gMj4mMSB8Ci1hd2sgJy92ZXJzaW9uL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiUHJvY3BzXHRcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCiAKLWlmY29uZmlnIC0tdmVyc2lvbiAyPiYxIHwKLWF3ayAnL3Rvb2xzL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiTmV0LXRvb2xzXHRcdCVzXG4iLAotCXN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkpCi19JworCXByaW50dmVyc2lvbigiRHluYW1pYyBsaW5rZXIgKGxkZCkiLCB2ZXJzaW9uKCJsZGQgLS12ZXJzaW9uIDI+JjEiKSkKIAotbG9hZGtleXMgLVYgMj4mMSB8Ci1hd2sgJy9bMC05XSsoWy5dP1swLTldKykrLyAmJiAhL25vdCBmb3VuZCQvewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JJDAgPSBzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpCi0JcHJpbnRmKCJLYmRcdFx0XHQlc1xuQ29uc29sZS10b29sc1x0XHQlc1xuIiwkMCwkMCkKLX0nCisJd2hpbGUgKCJsZGNvbmZpZyAtcCAyPi9kZXYvbnVsbCIgfCBnZXRsaW5lID4gMCkgeworCQlpZiAoLyhsaWJnfHN0ZGMpWytdK1wuc28vKSB7CisJCQlsaWJjcHAgPSAkTkYKKwkJCWJyZWFrCisJCX0KKwl9CisJaWYgKHN5c3RlbSgidGVzdCAtciAiIGxpYmNwcCkgPT0gMCkKKwkJcHJpbnR2ZXJzaW9uKCJMaW51eCBDKysgTGlicmFyeSIsIHZlcnNpb24oInJlYWRsaW5rICIgbGliY3BwKSkKIAotb3Byb2ZpbGVkIC0tdmVyc2lvbiAyPiYxIHwgYXdrIFwKLScoTlI9PTEgJiYgKCQyID09ICJvcHJvZmlsZSIpKSB7cHJpbnQgIm9wcm9maWxlICAgICAgICAgICAgICAiLCAkM30nCisJcHJpbnR2ZXJzaW9uKCJQcm9jcHMiLCB2ZXJzaW9uKCJwcyAtLXZlcnNpb24gMj4mMSIpKQorCXByaW50dmVyc2lvbigiTmV0LXRvb2xzIiwgdmVyc2lvbigiaWZjb25maWcgLS12ZXJzaW9uIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIktiZCIsIHZlcnNpb24oImxvYWRrZXlzIC1WIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIkNvbnNvbGUtdG9vbHMiLCB2ZXJzaW9uKCJsb2Fka2V5cyAtViAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJPcHJvZmlsZSIsIHZlcnNpb24oIm9wcm9maWxlZCAtLXZlcnNpb24gMj4mMSIpKQorCXByaW50dmVyc2lvbigiU2gtdXRpbHMiLCB2ZXJzaW9uKCJleHByIC0tdiAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJVZGV2IiwgdmVyc2lvbigidWRldmFkbSAtLXZlcnNpb24gMj4mMSIpKQorCXByaW50dmVyc2lvbigiV2lyZWxlc3MtdG9vbHMiLCB2ZXJzaW9uKCJpd2NvbmZpZyAtLXZlcnNpb24gMj4mMSIpKQogCi1leHByIC0tdiAyPiYxIHwKLWF3ayAnL15leHByL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiU2gtdXRpbHNcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCi0KLXVkZXZhZG0gLS12ZXJzaW9uIDI+JjEgfAotYXdrICcvWzAtOV0rKFsuXT9bMC05XSspKy8gJiYgIS9ub3QgZm91bmQkL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiVWRldlx0XHRcdCVzXG4iLAotCXN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkpCi19JwotCi1pd2NvbmZpZyAtLXZlcnNpb24gMj4mMSB8Ci1hd2sgJy92ZXJzaW9uL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiV2lyZWxlc3MtdG9vbHNcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCi0KLXRlc3QgLWUgL3Byb2MvbW9kdWxlcyAmJgotc29ydCAvcHJvYy9tb2R1bGVzIHwKLXNlZCAnCi0Jcy8gLiovLwotCUgKLSR7Ci0JZwotCXMvXlxuL01vZHVsZXMgTG9hZGVkXHRcdC8KLQl5L1xuLyAvCi0JcQorCWlmIChzeXN0ZW0oInRlc3QgLXIgL3Byb2MvbW9kdWxlcyIpID09IDApIHsKKwkJd2hpbGUgKCJzb3J0IC9wcm9jL21vZHVsZXMiIHwgZ2V0bGluZSA+IDApIHsKKwkJCW1vZHMgPSBtb2RzIHNlcCAkMQorCQkJc2VwID0gIiAiCisJCX0KKwkJcHJpbnR2ZXJzaW9uKCJNb2R1bGVzIExvYWRlZCIsIG1vZHMpCisJfQogfQotCWQKLScKKworZnVuY3Rpb24gdmVyc2lvbihjbWQsICAgIHZlcikgeworCXdoaWxlIChjbWQgfCBnZXRsaW5lID4gMCkgeworCQlpZiAoIS92ZXJfbGludXgvICYmIG1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pKSB7CisJCQl2ZXIgPSBzdWJzdHIoJDAsIFJTVEFSVCwgUkxFTkdUSCkKKwkJCWJyZWFrCisJCX0KKwl9CisJY2xvc2UoY21kKQorCXJldHVybiB2ZXIKK30KKworZnVuY3Rpb24gcHJpbnR2ZXJzaW9uKG5hbWUsIHZhbHVlLCAgb2ZtdCkgeworCWlmICh2YWx1ZSAhPSAiIikgeworCQlvZm10ID0gIiUtMjBzXHQlc1xuIgorCQlwcmludGYob2ZtdCwgbmFtZSwgdmFsdWUpCisJfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvS2NvbmZpZyBiL3NlY3VyaXR5L0tjb25maWcKaW5kZXggZGYyOGYyYi4uMTE4ZjQ1NCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvS2NvbmZpZworKysgYi9zZWN1cml0eS9LY29uZmlnCkBAIC0xMzYsNiArMTM2LDcgQEAKIGNvbmZpZyBIQVJERU5FRF9VU0VSQ09QWQogCWJvb2wgIkhhcmRlbiBtZW1vcnkgY29waWVzIGJldHdlZW4ga2VybmVsIGFuZCB1c2Vyc3BhY2UiCiAJZGVwZW5kcyBvbiBIQVZFX0FSQ0hfSEFSREVORURfVVNFUkNPUFkKKwlkZXBlbmRzIG9uIEhBVkVfSEFSREVORURfVVNFUkNPUFlfQUxMT0NBVE9SCiAJc2VsZWN0IEJVRwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGNoZWNrcyBmb3Igb2J2aW91c2x5IHdyb25nIG1lbW9yeSByZWdpb25zIHdoZW4KQEAgLTE0Niw2ICsxNDcsMTcgQEAKIAkgIG9yIGFyZSBwYXJ0IG9mIHRoZSBrZXJuZWwgdGV4dC4gVGhpcyBraWxscyBlbnRpcmUgY2xhc3NlcwogCSAgb2YgaGVhcCBvdmVyZmxvdyBleHBsb2l0cyBhbmQgc2ltaWxhciBrZXJuZWwgbWVtb3J5IGV4cG9zdXJlcy4KIAorY29uZmlnIEhBUkRFTkVEX1VTRVJDT1BZX1BBR0VTUEFOCisJYm9vbCAiUmVmdXNlIHRvIGNvcHkgYWxsb2NhdGlvbnMgdGhhdCBzcGFuIG11bHRpcGxlIHBhZ2VzIgorCWRlcGVuZHMgb24gSEFSREVORURfVVNFUkNPUFkKKwlkZXBlbmRzIG9uIEVYUEVSVAorCWhlbHAKKwkgIFdoZW4gYSBtdWx0aS1wYWdlIGFsbG9jYXRpb24gaXMgZG9uZSB3aXRob3V0IF9fR0ZQX0NPTVAsCisJICBoYXJkZW5lZCB1c2VyY29weSB3aWxsIHJlamVjdCBhdHRlbXB0cyB0byBjb3B5IGl0LiBUaGVyZSBhcmUsCisJICBob3dldmVyLCBzZXZlcmFsIGNhc2VzIG9mIHRoaXMgaW4gdGhlIGtlcm5lbCB0aGF0IGhhdmUgbm90IGFsbAorCSAgYmVlbiByZW1vdmVkLiBUaGlzIGNvbmZpZyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgd2hpbGUKKwkgIHRyeWluZyB0byBmaW5kIHN1Y2ggdXNlcnMuCisKIHNvdXJjZSBzZWN1cml0eS9zZWxpbnV4L0tjb25maWcKIHNvdXJjZSBzZWN1cml0eS9zbWFjay9LY29uZmlnCiBzb3VyY2Ugc2VjdXJpdHkvdG9tb3lvL0tjb25maWcKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvZW5jcnlwdGVkLWtleXMvZW5jcnlwdGVkLmMgYi9zZWN1cml0eS9rZXlzL2VuY3J5cHRlZC1rZXlzL2VuY3J5cHRlZC5jCmluZGV4IDVhZGJmYzMuLjE3YTA2MTAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvZW5jcnlwdGVkLWtleXMvZW5jcnlwdGVkLmMKKysrIGIvc2VjdXJpdHkva2V5cy9lbmNyeXB0ZWQta2V5cy9lbmNyeXB0ZWQuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGNyeXB0by9hZXMuaD4KICNpbmNsdWRlIDxjcnlwdG8vaGFzaC5oPgogI2luY2x1ZGUgPGNyeXB0by9zaGEuaD4KICNpbmNsdWRlIDxjcnlwdG8vc2tjaXBoZXIuaD4KQEAgLTQ3OCw2ICs0NzksNyBAQAogCXN0cnVjdCBjcnlwdG9fc2tjaXBoZXIgKnRmbTsKIAlzdHJ1Y3Qgc2tjaXBoZXJfcmVxdWVzdCAqcmVxOwogCXVuc2lnbmVkIGludCBlbmNyeXB0ZWRfZGF0YWxlbjsKKwl1OCBpdltBRVNfQkxPQ0tfU0laRV07CiAJdW5zaWduZWQgaW50IHBhZGxlbjsKIAljaGFyIHBhZFsxNl07CiAJaW50IHJldDsKQEAgLTUwMCw4ICs1MDIsOCBAQAogCXNnX2luaXRfdGFibGUoc2dfb3V0LCAxKTsKIAlzZ19zZXRfYnVmKHNnX291dCwgZXBheWxvYWQtPmVuY3J5cHRlZF9kYXRhLCBlbmNyeXB0ZWRfZGF0YWxlbik7CiAKLQlza2NpcGhlcl9yZXF1ZXN0X3NldF9jcnlwdChyZXEsIHNnX2luLCBzZ19vdXQsIGVuY3J5cHRlZF9kYXRhbGVuLAotCQkJCSAgIGVwYXlsb2FkLT5pdik7CisJbWVtY3B5KGl2LCBlcGF5bG9hZC0+aXYsIHNpemVvZihpdikpOworCXNrY2lwaGVyX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgc2dfaW4sIHNnX291dCwgZW5jcnlwdGVkX2RhdGFsZW4sIGl2KTsKIAlyZXQgPSBjcnlwdG9fc2tjaXBoZXJfZW5jcnlwdChyZXEpOwogCXRmbSA9IGNyeXB0b19za2NpcGhlcl9yZXF0Zm0ocmVxKTsKIAlza2NpcGhlcl9yZXF1ZXN0X2ZyZWUocmVxKTsKQEAgLTU4MSw2ICs1ODMsNyBAQAogCXN0cnVjdCBjcnlwdG9fc2tjaXBoZXIgKnRmbTsKIAlzdHJ1Y3Qgc2tjaXBoZXJfcmVxdWVzdCAqcmVxOwogCXVuc2lnbmVkIGludCBlbmNyeXB0ZWRfZGF0YWxlbjsKKwl1OCBpdltBRVNfQkxPQ0tfU0laRV07CiAJY2hhciBwYWRbMTZdOwogCWludCByZXQ7CiAKQEAgLTU5OSw4ICs2MDIsOCBAQAogCQkgICBlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4pOwogCXNnX3NldF9idWYoJnNnX291dFsxXSwgcGFkLCBzaXplb2YgcGFkKTsKIAotCXNrY2lwaGVyX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgc2dfaW4sIHNnX291dCwgZW5jcnlwdGVkX2RhdGFsZW4sCi0JCQkJICAgZXBheWxvYWQtPml2KTsKKwltZW1jcHkoaXYsIGVwYXlsb2FkLT5pdiwgc2l6ZW9mKGl2KSk7CisJc2tjaXBoZXJfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCBzZ19pbiwgc2dfb3V0LCBlbmNyeXB0ZWRfZGF0YWxlbiwgaXYpOwogCXJldCA9IGNyeXB0b19za2NpcGhlcl9kZWNyeXB0KHJlcSk7CiAJdGZtID0gY3J5cHRvX3NrY2lwaGVyX3JlcXRmbShyZXEpOwogCXNrY2lwaGVyX3JlcXVlc3RfZnJlZShyZXEpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvbHNtX2F1ZGl0LmMgYi9zZWN1cml0eS9sc21fYXVkaXQuYwppbmRleCBjY2NiZjMwLi4zN2YwNGRhIDEwMDY0NAotLS0gYS9zZWN1cml0eS9sc21fYXVkaXQuYworKysgYi9zZWN1cml0eS9sc21fYXVkaXQuYwpAQCAtOTksNyArOTksNyBAQAogCX0KIAlyZXR1cm4gcmV0OwogfQotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAvKioKICAqIGlwdjZfc2tiX3RvX2F1ZGl0ZGF0YSA6IGZpbGwgYXVkaXRkYXRhIGZyb20gc2tiCiAgKiBAc2tiIDogdGhlIHNrYgpAQCAtMjIwLDcgKzIyMCw3IEBACiAJICovCiAJQlVJTERfQlVHX09OKHNpemVvZihhLT51KSA+IHNpemVvZih2b2lkICopKjIpOwogCi0JYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBwaWQ9JWQgY29tbT0iLCB0YXNrX3BpZF9ucihjdXJyZW50KSk7CisJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBwaWQ9JWQgY29tbT0iLCB0YXNrX3RnaWRfbnIoY3VycmVudCkpOwogCWF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcoYWIsIG1lbWNweShjb21tLCBjdXJyZW50LT5jb21tLCBzaXplb2YoY29tbSkpKTsKIAogCXN3aXRjaCAoYS0+dHlwZSkgewpAQCAtMjQ1LDYgKzI0NSwxOSBAQAogCQl9CiAJCWJyZWFrOwogCX0KKwljYXNlIExTTV9BVURJVF9EQVRBX0ZJTEU6IHsKKwkJc3RydWN0IGlub2RlICppbm9kZTsKKworCQlhdWRpdF9sb2dfZF9wYXRoKGFiLCAiIHBhdGg9IiwgJmEtPnUuZmlsZS0+Zl9wYXRoKTsKKworCQlpbm9kZSA9IGZpbGVfaW5vZGUoYS0+dS5maWxlKTsKKwkJaWYgKGlub2RlKSB7CisJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIGRldj0iKTsKKwkJCWF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcoYWIsIGlub2RlLT5pX3NiLT5zX2lkKTsKKwkJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgaW5vPSVsdSIsIGlub2RlLT5pX2lubyk7CisJCX0KKwkJYnJlYWs7CisJfQogCWNhc2UgTFNNX0FVRElUX0RBVEFfSU9DVExfT1A6IHsKIAkJc3RydWN0IGlub2RlICppbm9kZTsKIApAQCAtMjU3LDcgKzI3MCw3IEBACiAJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIGlubz0lbHUiLCBpbm9kZS0+aV9pbm8pOwogCQl9CiAKLQkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBpb2N0bGNtZD0laHgiLCBhLT51Lm9wLT5jbWQpOworCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIGlvY3RsY21kPTB4JWh4IiwgYS0+dS5vcC0+Y21kKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgTFNNX0FVRElUX0RBVEFfREVOVFJZOiB7CkBAIC0yOTQsNyArMzA3LDcgQEAKIAljYXNlIExTTV9BVURJVF9EQVRBX1RBU0s6IHsKIAkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBhLT51LnRzazsKIAkJaWYgKHRzaykgewotCQkJcGlkX3QgcGlkID0gdGFza19waWRfbnIodHNrKTsKKwkJCXBpZF90IHBpZCA9IHRhc2tfdGdpZF9ucih0c2spOwogCQkJaWYgKHBpZCkgewogCQkJCWNoYXIgY29tbVtzaXplb2YodHNrLT5jb21tKV07CiAJCQkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBvcGlkPSVkIG9jb21tPSIsIHBpZCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWN1cml0eS5jIGIvc2VjdXJpdHkvc2VjdXJpdHkuYwppbmRleCA0ODM4ZTdmLi5mODI1MzA0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWN1cml0eS5jCisrKyBiL3NlY3VyaXR5L3NlY3VyaXR5LmMKQEAgLTM2NCw2ICszNjQsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0woc2VjdXJpdHlfZGVudHJ5X2luaXRfc2VjdXJpdHkpOwogCitpbnQgc2VjdXJpdHlfZGVudHJ5X2NyZWF0ZV9maWxlc19hcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQkJCSAgICBzdHJ1Y3QgcXN0ciAqbmFtZSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGNyZWQgKm9sZCwgc3RydWN0IGNyZWQgKm5ldykKK3sKKwlyZXR1cm4gY2FsbF9pbnRfaG9vayhkZW50cnlfY3JlYXRlX2ZpbGVzX2FzLCAwLCBkZW50cnksIG1vZGUsCisJCQkJbmFtZSwgb2xkLCBuZXcpOworfQorRVhQT1JUX1NZTUJPTChzZWN1cml0eV9kZW50cnlfY3JlYXRlX2ZpbGVzX2FzKTsKKwogaW50IHNlY3VyaXR5X2lub2RlX2luaXRfc2VjdXJpdHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIsCiAJCQkJIGNvbnN0IHN0cnVjdCBxc3RyICpxc3RyLAogCQkJCSBjb25zdCBpbml0eGF0dHJzIGluaXR4YXR0cnMsIHZvaWQgKmZzX2RhdGEpCkBAIC03NDgsNiArNzU3LDE4IEBACiAJY2FsbF92b2lkX2hvb2soaW5vZGVfZ2V0c2VjaWQsIGlub2RlLCBzZWNpZCk7CiB9CiAKK2ludCBzZWN1cml0eV9pbm9kZV9jb3B5X3VwKHN0cnVjdCBkZW50cnkgKnNyYywgc3RydWN0IGNyZWQgKipuZXcpCit7CisJcmV0dXJuIGNhbGxfaW50X2hvb2soaW5vZGVfY29weV91cCwgMCwgc3JjLCBuZXcpOworfQorRVhQT1JUX1NZTUJPTChzZWN1cml0eV9pbm9kZV9jb3B5X3VwKTsKKworaW50IHNlY3VyaXR5X2lub2RlX2NvcHlfdXBfeGF0dHIoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gY2FsbF9pbnRfaG9vayhpbm9kZV9jb3B5X3VwX3hhdHRyLCAtRU9QTk9UU1VQUCwgbmFtZSk7Cit9CitFWFBPUlRfU1lNQk9MKHNlY3VyaXR5X2lub2RlX2NvcHlfdXBfeGF0dHIpOworCiBpbnQgc2VjdXJpdHlfZmlsZV9wZXJtaXNzaW9uKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgbWFzaykKIHsKIAlpbnQgcmV0OwpAQCAtMTYyMyw2ICsxNjQ0LDggQEAKIAkJTElTVF9IRUFEX0lOSVQoc2VjdXJpdHlfaG9va19oZWFkcy5zYl9wYXJzZV9vcHRzX3N0ciksCiAJLmRlbnRyeV9pbml0X3NlY3VyaXR5ID0KIAkJTElTVF9IRUFEX0lOSVQoc2VjdXJpdHlfaG9va19oZWFkcy5kZW50cnlfaW5pdF9zZWN1cml0eSksCisJLmRlbnRyeV9jcmVhdGVfZmlsZXNfYXMgPQorCQlMSVNUX0hFQURfSU5JVChzZWN1cml0eV9ob29rX2hlYWRzLmRlbnRyeV9jcmVhdGVfZmlsZXNfYXMpLAogI2lmZGVmIENPTkZJR19TRUNVUklUWV9QQVRICiAJLnBhdGhfdW5saW5rID0JTElTVF9IRUFEX0lOSVQoc2VjdXJpdHlfaG9va19oZWFkcy5wYXRoX3VubGluayksCiAJLnBhdGhfbWtkaXIgPQlMSVNUX0hFQURfSU5JVChzZWN1cml0eV9ob29rX2hlYWRzLnBhdGhfbWtkaXIpLApAQCAtMTY4NCw2ICsxNzA3LDEwIEBACiAJCUxJU1RfSEVBRF9JTklUKHNlY3VyaXR5X2hvb2tfaGVhZHMuaW5vZGVfbGlzdHNlY3VyaXR5KSwKIAkuaW5vZGVfZ2V0c2VjaWQgPQogCQlMSVNUX0hFQURfSU5JVChzZWN1cml0eV9ob29rX2hlYWRzLmlub2RlX2dldHNlY2lkKSwKKwkuaW5vZGVfY29weV91cCA9CisJCUxJU1RfSEVBRF9JTklUKHNlY3VyaXR5X2hvb2tfaGVhZHMuaW5vZGVfY29weV91cCksCisJLmlub2RlX2NvcHlfdXBfeGF0dHIgPQorCQlMSVNUX0hFQURfSU5JVChzZWN1cml0eV9ob29rX2hlYWRzLmlub2RlX2NvcHlfdXBfeGF0dHIpLAogCS5maWxlX3Blcm1pc3Npb24gPQogCQlMSVNUX0hFQURfSU5JVChzZWN1cml0eV9ob29rX2hlYWRzLmZpbGVfcGVybWlzc2lvbiksCiAJLmZpbGVfYWxsb2Nfc2VjdXJpdHkgPQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9LY29uZmlnIGIvc2VjdXJpdHkvc2VsaW51eC9LY29uZmlnCmluZGV4IDg2OTFlOTIuLmVhN2UzZWYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvS2NvbmZpZworKysgYi9zZWN1cml0eS9zZWxpbnV4L0tjb25maWcKQEAgLTkzLDQxICs5MywzIEBACiAJICB2aWEgL3NlbGludXgvY2hlY2tyZXFwcm90IGlmIGF1dGhvcml6ZWQgYnkgcG9saWN5LgogCiAJICBJZiB5b3UgYXJlIHVuc3VyZSBob3cgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24sIGFuc3dlciAwLgotCi1jb25maWcgU0VDVVJJVFlfU0VMSU5VWF9QT0xJQ1lEQl9WRVJTSU9OX01BWAotCWJvb2wgIk5TQSBTRUxpbnV4IG1heGltdW0gc3VwcG9ydGVkIHBvbGljeSBmb3JtYXQgdmVyc2lvbiIKLQlkZXBlbmRzIG9uIFNFQ1VSSVRZX1NFTElOVVgKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBtYXhpbXVtIHBvbGljeSBmb3JtYXQgdmVyc2lvbiBzdXBwb3J0ZWQKLQkgIGJ5IFNFTGludXggdG8gYmUgc2V0IHRvIGEgcGFydGljdWxhciB2YWx1ZS4gIFRoaXMgdmFsdWUgaXMgcmVwb3J0ZWQKLQkgIHRvIHVzZXJzcGFjZSB2aWEgL3NlbGludXgvcG9saWN5dmVycyBhbmQgdXNlZCBhdCBwb2xpY3kgbG9hZCB0aW1lLgotCSAgSXQgY2FuIGJlIGFkanVzdGVkIGRvd253YXJkIHRvIHN1cHBvcnQgbGVnYWN5IHVzZXJsYW5kIChpbml0KSB0aGF0Ci0JICBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIGtlcm5lbHMgdGhhdCBzdXBwb3J0IG5ld2VyIHBvbGljeSB2ZXJzaW9ucy4KLQotCSAgRXhhbXBsZXM6Ci0JICBGb3IgdGhlIEZlZG9yYSBDb3JlIDMgb3IgNCBMaW51eCBkaXN0cmlidXRpb25zLCBlbmFibGUgdGhpcyBvcHRpb24KLQkgIGFuZCBzZXQgdGhlIHZhbHVlIHZpYSB0aGUgbmV4dCBvcHRpb24uIEZvciBGZWRvcmEgQ29yZSA1IGFuZCBsYXRlciwKLQkgIGRvIG5vdCBlbmFibGUgdGhpcyBvcHRpb24uCi0KLQkgIElmIHlvdSBhcmUgdW5zdXJlIGhvdyB0byBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgYW5zd2VyIE4uCi0KLWNvbmZpZyBTRUNVUklUWV9TRUxJTlVYX1BPTElDWURCX1ZFUlNJT05fTUFYX1ZBTFVFCi0JaW50ICJOU0EgU0VMaW51eCBtYXhpbXVtIHN1cHBvcnRlZCBwb2xpY3kgZm9ybWF0IHZlcnNpb24gdmFsdWUiCi0JZGVwZW5kcyBvbiBTRUNVUklUWV9TRUxJTlVYX1BPTElDWURCX1ZFUlNJT05fTUFYCi0JcmFuZ2UgMTUgMjMKLQlkZWZhdWx0IDE5Ci0JaGVscAotCSAgVGhpcyBvcHRpb24gc2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBtYXhpbXVtIHBvbGljeSBmb3JtYXQgdmVyc2lvbgotCSAgc3VwcG9ydGVkIGJ5IFNFTGludXguCi0KLQkgIEV4YW1wbGVzOgotCSAgRm9yIEZlZG9yYSBDb3JlIDMsIHVzZSAxOC4KLQkgIEZvciBGZWRvcmEgQ29yZSA0LCB1c2UgMTkuCi0KLQkgIElmIHlvdSBhcmUgdW5zdXJlIGhvdyB0byBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgbG9vayBmb3IgdGhlCi0JICBwb2xpY3kgZm9ybWF0IHZlcnNpb24gc3VwcG9ydGVkIGJ5IHlvdXIgcG9saWN5IHRvb2xjaGFpbiwgYnkKLQkgIHJ1bm5pbmcgJ2NoZWNrcG9saWN5IC1WJy4gT3IgbG9vayBhdCB3aGF0IHBvbGljeSB5b3UgaGF2ZQotCSAgaW5zdGFsbGVkIHVuZGVyIC9ldGMvc2VsaW51eC8kU0VMSU5VWFRZUEUvcG9saWN5LCB3aGVyZQotCSAgU0VMSU5VWFRZUEUgaXMgZGVmaW5lZCBpbiB5b3VyIC9ldGMvc2VsaW51eC9jb25maWcuCi0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwppbmRleCAxMzE4NWE2Li4yMjA1ZWEyIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCkBAIC0xNzYxLDggKzE3NjEsOCBAQAogewogCXN0cnVjdCBjb21tb25fYXVkaXRfZGF0YSBhZDsKIAotCWFkLnR5cGUgPSBMU01fQVVESVRfREFUQV9QQVRIOwotCWFkLnUucGF0aCA9IGZpbGUtPmZfcGF0aDsKKwlhZC50eXBlID0gTFNNX0FVRElUX0RBVEFfRklMRTsKKwlhZC51LmZpbGUgPSBmaWxlOwogCXJldHVybiBpbm9kZV9oYXNfcGVybShjcmVkLCBmaWxlX2lub2RlKGZpbGUpLCBhdiwgJmFkKTsKIH0KIApAQCAtMTc4NCw4ICsxNzg0LDggQEAKIAl1MzIgc2lkID0gY3JlZF9zaWQoY3JlZCk7CiAJaW50IHJjOwogCi0JYWQudHlwZSA9IExTTV9BVURJVF9EQVRBX1BBVEg7Ci0JYWQudS5wYXRoID0gZmlsZS0+Zl9wYXRoOworCWFkLnR5cGUgPSBMU01fQVVESVRfREFUQV9GSUxFOworCWFkLnUuZmlsZSA9IGZpbGU7CiAKIAlpZiAoc2lkICE9IGZzZWMtPnNpZCkgewogCQlyYyA9IGF2Y19oYXNfcGVybShzaWQsIGZzZWMtPnNpZCwKQEAgLTE4MDgsMTMgKzE4MDgsMTMgQEAKIC8qCiAgKiBEZXRlcm1pbmUgdGhlIGxhYmVsIGZvciBhbiBpbm9kZSB0aGF0IG1pZ2h0IGJlIHVuaW9uZWQuCiAgKi8KLXN0YXRpYyBpbnQgc2VsaW51eF9kZXRlcm1pbmVfaW5vZGVfbGFiZWwoc3RydWN0IGlub2RlICpkaXIsCi0JCQkJCSBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwKLQkJCQkJIHUxNiB0Y2xhc3MsCi0JCQkJCSB1MzIgKl9uZXdfaXNpZCkKK3N0YXRpYyBpbnQKK3NlbGludXhfZGV0ZXJtaW5lX2lub2RlX2xhYmVsKGNvbnN0IHN0cnVjdCB0YXNrX3NlY3VyaXR5X3N0cnVjdCAqdHNlYywKKwkJCQkgc3RydWN0IGlub2RlICpkaXIsCisJCQkJIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lLCB1MTYgdGNsYXNzLAorCQkJCSB1MzIgKl9uZXdfaXNpZCkKIHsKIAljb25zdCBzdHJ1Y3Qgc3VwZXJibG9ja19zZWN1cml0eV9zdHJ1Y3QgKnNic2VjID0gZGlyLT5pX3NiLT5zX3NlY3VyaXR5OwotCWNvbnN0IHN0cnVjdCB0YXNrX3NlY3VyaXR5X3N0cnVjdCAqdHNlYyA9IGN1cnJlbnRfc2VjdXJpdHkoKTsKIAogCWlmICgoc2JzZWMtPmZsYWdzICYgU0VfU0JJTklUSUFMSVpFRCkgJiYKIAkgICAgKHNic2VjLT5iZWhhdmlvciA9PSBTRUNVUklUWV9GU19VU0VfTU5UUE9JTlQpKSB7CkBAIC0xODU3LDggKzE4NTcsOCBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcmMgPSBzZWxpbnV4X2RldGVybWluZV9pbm9kZV9sYWJlbChkaXIsICZkZW50cnktPmRfbmFtZSwgdGNsYXNzLAotCQkJCQkgICAmbmV3c2lkKTsKKwlyYyA9IHNlbGludXhfZGV0ZXJtaW5lX2lub2RlX2xhYmVsKGN1cnJlbnRfc2VjdXJpdHkoKSwgZGlyLAorCQkJCQkgICAmZGVudHJ5LT5kX25hbWUsIHRjbGFzcywgJm5ld3NpZCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKQEAgLTIzNjUsOCArMjM2NSw4IEBACiAJCQluZXdfdHNlYy0+c2lkID0gb2xkX3RzZWMtPnNpZDsKIAl9CiAKLQlhZC50eXBlID0gTFNNX0FVRElUX0RBVEFfUEFUSDsKLQlhZC51LnBhdGggPSBicHJtLT5maWxlLT5mX3BhdGg7CisJYWQudHlwZSA9IExTTV9BVURJVF9EQVRBX0ZJTEU7CisJYWQudS5maWxlID0gYnBybS0+ZmlsZTsKIAogCWlmIChuZXdfdHNlYy0+c2lkID09IG9sZF90c2VjLT5zaWQpIHsKIAkJcmMgPSBhdmNfaGFzX3Blcm0ob2xkX3RzZWMtPnNpZCwgaXNlYy0+c2lkLApAQCAtMjgzOCw3ICsyODM4LDggQEAKIAl1MzIgbmV3c2lkOwogCWludCByYzsKIAotCXJjID0gc2VsaW51eF9kZXRlcm1pbmVfaW5vZGVfbGFiZWwoZF9pbm9kZShkZW50cnktPmRfcGFyZW50KSwgbmFtZSwKKwlyYyA9IHNlbGludXhfZGV0ZXJtaW5lX2lub2RlX2xhYmVsKGN1cnJlbnRfc2VjdXJpdHkoKSwKKwkJCQkJICAgZF9pbm9kZShkZW50cnktPmRfcGFyZW50KSwgbmFtZSwKIAkJCQkJICAgaW5vZGVfbW9kZV90b19zZWN1cml0eV9jbGFzcyhtb2RlKSwKIAkJCQkJICAgJm5ld3NpZCk7CiAJaWYgKHJjKQpAQCAtMjg0Nyw2ICsyODQ4LDI3IEBACiAJcmV0dXJuIHNlY3VyaXR5X3NpZF90b19jb250ZXh0KG5ld3NpZCwgKGNoYXIgKiopY3R4LCBjdHhsZW4pOwogfQogCitzdGF0aWMgaW50IHNlbGludXhfZGVudHJ5X2NyZWF0ZV9maWxlc19hcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQkJCQkgIHN0cnVjdCBxc3RyICpuYW1lLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBjcmVkICpvbGQsCisJCQkJCSAgc3RydWN0IGNyZWQgKm5ldykKK3sKKwl1MzIgbmV3c2lkOworCWludCByYzsKKwlzdHJ1Y3QgdGFza19zZWN1cml0eV9zdHJ1Y3QgKnRzZWM7CisKKwlyYyA9IHNlbGludXhfZGV0ZXJtaW5lX2lub2RlX2xhYmVsKG9sZC0+c2VjdXJpdHksCisJCQkJCSAgIGRfaW5vZGUoZGVudHJ5LT5kX3BhcmVudCksIG5hbWUsCisJCQkJCSAgIGlub2RlX21vZGVfdG9fc2VjdXJpdHlfY2xhc3MobW9kZSksCisJCQkJCSAgICZuZXdzaWQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJdHNlYyA9IG5ldy0+c2VjdXJpdHk7CisJdHNlYy0+Y3JlYXRlX3NpZCA9IG5ld3NpZDsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBzZWxpbnV4X2lub2RlX2luaXRfc2VjdXJpdHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIsCiAJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBxc3RyICpxc3RyLAogCQkJCSAgICAgICBjb25zdCBjaGFyICoqbmFtZSwKQEAgLTI4NjMsNyArMjg4NSw3IEBACiAJc2lkID0gdHNlYy0+c2lkOwogCW5ld3NpZCA9IHRzZWMtPmNyZWF0ZV9zaWQ7CiAKLQlyYyA9IHNlbGludXhfZGV0ZXJtaW5lX2lub2RlX2xhYmVsKAorCXJjID0gc2VsaW51eF9kZXRlcm1pbmVfaW5vZGVfbGFiZWwoY3VycmVudF9zZWN1cml0eSgpLAogCQlkaXIsIHFzdHIsCiAJCWlub2RlX21vZGVfdG9fc2VjdXJpdHlfY2xhc3MoaW5vZGUtPmlfbW9kZSksCiAJCSZuZXdzaWQpOwpAQCAtMzI5Myw2ICszMzE1LDQxIEBACiAJKnNlY2lkID0gaXNlYy0+c2lkOwogfQogCitzdGF0aWMgaW50IHNlbGludXhfaW5vZGVfY29weV91cChzdHJ1Y3QgZGVudHJ5ICpzcmMsIHN0cnVjdCBjcmVkICoqbmV3KQoreworCXUzMiBzaWQ7CisJc3RydWN0IHRhc2tfc2VjdXJpdHlfc3RydWN0ICp0c2VjOworCXN0cnVjdCBjcmVkICpuZXdfY3JlZHMgPSAqbmV3OworCisJaWYgKG5ld19jcmVkcyA9PSBOVUxMKSB7CisJCW5ld19jcmVkcyA9IHByZXBhcmVfY3JlZHMoKTsKKwkJaWYgKCFuZXdfY3JlZHMpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl0c2VjID0gbmV3X2NyZWRzLT5zZWN1cml0eTsKKwkvKiBHZXQgbGFiZWwgZnJvbSBvdmVybGF5IGlub2RlIGFuZCBzZXQgaXQgaW4gY3JlYXRlX3NpZCAqLworCXNlbGludXhfaW5vZGVfZ2V0c2VjaWQoZF9pbm9kZShzcmMpLCAmc2lkKTsKKwl0c2VjLT5jcmVhdGVfc2lkID0gc2lkOworCSpuZXcgPSBuZXdfY3JlZHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VsaW51eF9pbm9kZV9jb3B5X3VwX3hhdHRyKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJLyogVGhlIGNvcHlfdXAgaG9vayBhYm92ZSBzZXRzIHRoZSBpbml0aWFsIGNvbnRleHQgb24gYW4gaW5vZGUsIGJ1dCB3ZQorCSAqIGRvbid0IHRoZW4gd2FudCB0byBvdmVyd3JpdGUgaXQgYnkgYmxpbmRseSBjb3B5aW5nIGFsbCB0aGUgbG93ZXIKKwkgKiB4YXR0cnMgdXAuICBJbnN0ZWFkLCB3ZSBoYXZlIHRvIGZpbHRlciBvdXQgU0VMaW51eC1yZWxhdGVkIHhhdHRycy4KKwkgKi8KKwlpZiAoc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfU0VMSU5VWCkgPT0gMCkKKwkJcmV0dXJuIDE7IC8qIERpc2NhcmQgKi8KKwkvKgorCSAqIEFueSBvdGhlciBhdHRyaWJ1dGUgYXBhcnQgZnJvbSBTRUxJTlVYIGlzIG5vdCBjbGFpbWVkLCBzdXBwb3J0ZWQKKwkgKiBieSBzZWxpbnV4LgorCSAqLworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKwogLyogZmlsZSBzZWN1cml0eSBvcGVyYXRpb25zICovCiAKIHN0YXRpYyBpbnQgc2VsaW51eF9yZXZhbGlkYXRlX2ZpbGVfcGVybWlzc2lvbihzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1hc2spCkBAIC0zNzc2LDggKzM4MzMsOCBAQAogCiAJLyogZmluaXRfbW9kdWxlICovCiAKLQlhZC50eXBlID0gTFNNX0FVRElUX0RBVEFfUEFUSDsKLQlhZC51LnBhdGggPSBmaWxlLT5mX3BhdGg7CisJYWQudHlwZSA9IExTTV9BVURJVF9EQVRBX0ZJTEU7CisJYWQudS5maWxlID0gZmlsZTsKIAogCWZzZWMgPSBmaWxlLT5mX3NlY3VyaXR5OwogCWlmIChzaWQgIT0gZnNlYy0+c2lkKSB7CkBAIC0zOTg0LDcgKzQwNDEsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCiAvKiBSZXR1cm5zIGVycm9yIG9ubHkgaWYgdW5hYmxlIHRvIHBhcnNlIGFkZHJlc3NlcyAqLwogc3RhdGljIGludCBzZWxpbnV4X3BhcnNlX3NrYl9pcHY2KHN0cnVjdCBza19idWZmICpza2IsCkBAIC00MDc1LDcgKzQxMzIsNyBAQAogCQkJCSAgICAgICAmYWQtPnUubmV0LT52NGluZm8uZGFkZHIpOwogCQlnb3RvIG9rYXk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCWNhc2UgUEZfSU5FVDY6CiAJCXJldCA9IHNlbGludXhfcGFyc2Vfc2tiX2lwdjYoc2tiLCBhZCwgcHJvdG8pOwogCQlpZiAocmV0KQpAQCAtNTAyOSw3ICs1MDg2LDcgQEAKIAlyZXR1cm4gc2VsaW51eF9pcF9mb3J3YXJkKHNrYiwgc3RhdGUtPmluLCBQRl9JTkVUKTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiBzdGF0aWMgdW5zaWduZWQgaW50IHNlbGludXhfaXB2Nl9mb3J3YXJkKHZvaWQgKnByaXYsCiAJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQpAQCAtNTA4Nyw3ICs1MTQ0LDcgQEAKIAlyZXR1cm4gc2VsaW51eF9pcF9vdXRwdXQoc2tiLCBQRl9JTkVUKTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiBzdGF0aWMgdW5zaWduZWQgaW50IHNlbGludXhfaXB2Nl9vdXRwdXQodm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQpAQCAtNTI3Myw3ICs1MzMwLDcgQEAKIAlyZXR1cm4gc2VsaW51eF9pcF9wb3N0cm91dGUoc2tiLCBzdGF0ZS0+b3V0LCBQRl9JTkVUKTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiBzdGF0aWMgdW5zaWduZWQgaW50IHNlbGludXhfaXB2Nl9wb3N0cm91dGUodm9pZCAqcHJpdiwKIAkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQpAQCAtNjA2Miw2ICs2MTE5LDcgQEAKIAlMU01fSE9PS19JTklUKHNiX3BhcnNlX29wdHNfc3RyLCBzZWxpbnV4X3BhcnNlX29wdHNfc3RyKSwKIAogCUxTTV9IT09LX0lOSVQoZGVudHJ5X2luaXRfc2VjdXJpdHksIHNlbGludXhfZGVudHJ5X2luaXRfc2VjdXJpdHkpLAorCUxTTV9IT09LX0lOSVQoZGVudHJ5X2NyZWF0ZV9maWxlc19hcywgc2VsaW51eF9kZW50cnlfY3JlYXRlX2ZpbGVzX2FzKSwKIAogCUxTTV9IT09LX0lOSVQoaW5vZGVfYWxsb2Nfc2VjdXJpdHksIHNlbGludXhfaW5vZGVfYWxsb2Nfc2VjdXJpdHkpLAogCUxTTV9IT09LX0lOSVQoaW5vZGVfZnJlZV9zZWN1cml0eSwgc2VsaW51eF9pbm9kZV9mcmVlX3NlY3VyaXR5KSwKQEAgLTYwODgsNiArNjE0Niw4IEBACiAJTFNNX0hPT0tfSU5JVChpbm9kZV9zZXRzZWN1cml0eSwgc2VsaW51eF9pbm9kZV9zZXRzZWN1cml0eSksCiAJTFNNX0hPT0tfSU5JVChpbm9kZV9saXN0c2VjdXJpdHksIHNlbGludXhfaW5vZGVfbGlzdHNlY3VyaXR5KSwKIAlMU01fSE9PS19JTklUKGlub2RlX2dldHNlY2lkLCBzZWxpbnV4X2lub2RlX2dldHNlY2lkKSwKKwlMU01fSE9PS19JTklUKGlub2RlX2NvcHlfdXAsIHNlbGludXhfaW5vZGVfY29weV91cCksCisJTFNNX0hPT0tfSU5JVChpbm9kZV9jb3B5X3VwX3hhdHRyLCBzZWxpbnV4X2lub2RlX2NvcHlfdXBfeGF0dHIpLAogCiAJTFNNX0hPT0tfSU5JVChmaWxlX3Blcm1pc3Npb24sIHNlbGludXhfZmlsZV9wZXJtaXNzaW9uKSwKIAlMU01fSE9PS19JTklUKGZpbGVfYWxsb2Nfc2VjdXJpdHksIHNlbGludXhfZmlsZV9hbGxvY19zZWN1cml0eSksCkBAIC02MzE3LDcgKzYzNzcsNyBAQAogCQkuaG9va251bSA9CU5GX0lORVRfTE9DQUxfT1VULAogCQkucHJpb3JpdHkgPQlORl9JUF9QUklfU0VMSU5VWF9GSVJTVCwKIAl9LAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJewogCQkuaG9vayA9CQlzZWxpbnV4X2lwdjZfcG9zdHJvdXRlLAogCQkucGYgPQkJTkZQUk9UT19JUFY2LApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3NlY3VyaXR5LmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VjdXJpdHkuaAppbmRleCAzOGZlYjU1Li4zMDhhMjg2IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VjdXJpdHkuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VjdXJpdHkuaApAQCAtMzksMTEgKzM5LDcgQEAKIAogLyogUmFuZ2Ugb2YgcG9saWN5IHZlcnNpb25zIHdlIHVuZGVyc3RhbmQqLwogI2RlZmluZSBQT0xJQ1lEQl9WRVJTSU9OX01JTiAgIFBPTElDWURCX1ZFUlNJT05fQkFTRQotI2lmZGVmIENPTkZJR19TRUNVUklUWV9TRUxJTlVYX1BPTElDWURCX1ZFUlNJT05fTUFYCi0jZGVmaW5lIFBPTElDWURCX1ZFUlNJT05fTUFYCUNPTkZJR19TRUNVUklUWV9TRUxJTlVYX1BPTElDWURCX1ZFUlNJT05fTUFYX1ZBTFVFCi0jZWxzZQogI2RlZmluZSBQT0xJQ1lEQl9WRVJTSU9OX01BWAlQT0xJQ1lEQl9WRVJTSU9OX1hQRVJNU19JT0NUTAotI2VuZGlmCiAKIC8qIE1hc2sgZm9yIGp1c3QgdGhlIG1vdW50IHJlbGF0ZWQgZmxhZ3MgKi8KICNkZWZpbmUgU0VfTU5UTUFTSwkweDBmCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL2NvbmRpdGlvbmFsLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL2NvbmRpdGlvbmFsLmMKaW5kZXggNDU2ZTFhOS4uMzRhZmVhZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9jb25kaXRpb25hbC5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvY29uZGl0aW9uYWwuYwpAQCAtMjQyLDYgKzI0Miw4IEBACiAJCWdvdG8gZXJyOwogCiAJbGVuID0gbGUzMl90b19jcHUoYnVmWzJdKTsKKwlpZiAoKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAodTMyKS0xKSkpCisJCWdvdG8gZXJyOwogCiAJcmMgPSAtRU5PTUVNOwogCWtleSA9IGttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL2ViaXRtYXAuYyBiL3NlY3VyaXR5L3NlbGludXgvc3MvZWJpdG1hcC5jCmluZGV4IDg5NGI2Y2QuLjdkMTBlNWQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvZWJpdG1hcC5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvZWJpdG1hcC5jCkBAIC0zNzQsNiArMzc0LDkgQEAKIAkJZ290byBvazsKIAl9CiAKKwlpZiAoZS0+aGlnaGJpdCAmJiAhY291bnQpCisJCWdvdG8gYmFkOworCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJcmMgPSBuZXh0X2VudHJ5KCZzdGFydGJpdCwgZnAsIHNpemVvZih1MzIpKTsKIAkJaWYgKHJjIDwgMCkgewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jCmluZGV4IDk5MmEzMTUuLmFjZTY4MzggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMKQEAgLTU0MSwyMSArNTQxLDIxIEBACiAKIAlyYyA9IC1FTk9NRU07CiAJcC0+Y2xhc3NfdmFsX3RvX3N0cnVjdCA9Ci0JCWttYWxsb2MocC0+cF9jbGFzc2VzLm5wcmltICogc2l6ZW9mKCoocC0+Y2xhc3NfdmFsX3RvX3N0cnVjdCkpLAorCQlremFsbG9jKHAtPnBfY2xhc3Nlcy5ucHJpbSAqIHNpemVvZigqKHAtPmNsYXNzX3ZhbF90b19zdHJ1Y3QpKSwKIAkJCUdGUF9LRVJORUwpOwogCWlmICghcC0+Y2xhc3NfdmFsX3RvX3N0cnVjdCkKIAkJZ290byBvdXQ7CiAKIAlyYyA9IC1FTk9NRU07CiAJcC0+cm9sZV92YWxfdG9fc3RydWN0ID0KLQkJa21hbGxvYyhwLT5wX3JvbGVzLm5wcmltICogc2l6ZW9mKCoocC0+cm9sZV92YWxfdG9fc3RydWN0KSksCisJCWt6YWxsb2MocC0+cF9yb2xlcy5ucHJpbSAqIHNpemVvZigqKHAtPnJvbGVfdmFsX3RvX3N0cnVjdCkpLAogCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFwLT5yb2xlX3ZhbF90b19zdHJ1Y3QpCiAJCWdvdG8gb3V0OwogCiAJcmMgPSAtRU5PTUVNOwogCXAtPnVzZXJfdmFsX3RvX3N0cnVjdCA9Ci0JCWttYWxsb2MocC0+cF91c2Vycy5ucHJpbSAqIHNpemVvZigqKHAtPnVzZXJfdmFsX3RvX3N0cnVjdCkpLAorCQlremFsbG9jKHAtPnBfdXNlcnMubnByaW0gKiBzaXplb2YoKihwLT51c2VyX3ZhbF90b19zdHJ1Y3QpKSwKIAkJCUdGUF9LRVJORUwpOwogCWlmICghcC0+dXNlcl92YWxfdG9fc3RydWN0KQogCQlnb3RvIG91dDsKQEAgLTk2NCw3ICs5NjQsNyBAQAogCQkgKiBSb2xlIG11c3QgYmUgYXV0aG9yaXplZCBmb3IgdGhlIHR5cGUuCiAJCSAqLwogCQlyb2xlID0gcC0+cm9sZV92YWxfdG9fc3RydWN0W2MtPnJvbGUgLSAxXTsKLQkJaWYgKCFlYml0bWFwX2dldF9iaXQoJnJvbGUtPnR5cGVzLCBjLT50eXBlIC0gMSkpCisJCWlmICghcm9sZSB8fCAhZWJpdG1hcF9nZXRfYml0KCZyb2xlLT50eXBlcywgYy0+dHlwZSAtIDEpKQogCQkJLyogcm9sZSBtYXkgbm90IGJlIGFzc29jaWF0ZWQgd2l0aCB0eXBlICovCiAJCQlyZXR1cm4gMDsKIApAQCAtMTA5NCw2ICsxMDk0LDkgQEAKIAlpbnQgcmM7CiAJY2hhciAqc3RyOwogCisJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAodTMyKS0xKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlzdHIgPSBrbWFsbG9jKGxlbiArIDEsIGZsYWdzKTsKIAlpZiAoIXN0cikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0yNDE0LDYgKzI0MTcsNyBAQAogCQl9IGVsc2UKIAkJCXRyLT50Y2xhc3MgPSBwLT5wcm9jZXNzX2NsYXNzOwogCisJCXJjID0gLUVJTlZBTDsKIAkJaWYgKCFwb2xpY3lkYl9yb2xlX2lzdmFsaWQocCwgdHItPnJvbGUpIHx8CiAJCSAgICAhcG9saWN5ZGJfdHlwZV9pc3ZhbGlkKHAsIHRyLT50eXBlKSB8fAogCQkgICAgIXBvbGljeWRiX2NsYXNzX2lzdmFsaWQocCwgdHItPnRjbGFzcykgfHwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL0tjb25maWcgYi9zZWN1cml0eS9zbWFjay9LY29uZmlnCmluZGV4IDI3MWFkYWUuLjkyM2IxMjAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL0tjb25maWcKKysrIGIvc2VjdXJpdHkvc21hY2svS2NvbmZpZwpAQCAtNDAsMyArNDAsMTUgQEAKIAkgIFRoaXMgZW5hYmxlcyBzZWN1cml0eSBtYXJraW5nIG9mIG5ldHdvcmsgcGFja2V0cyB1c2luZwogCSAgU21hY2sgbGFiZWxzLgogCSAgSWYgeW91IGFyZSB1bnN1cmUgaG93IHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCBhbnN3ZXIgTi4KKworY29uZmlnIFNFQ1VSSVRZX1NNQUNLX0FQUEVORF9TSUdOQUxTCisJYm9vbCAiVHJlYXQgZGVsaXZlcmluZyBzaWduYWxzIGFzIGFuIGFwcGVuZCBvcGVyYXRpb24iCisJZGVwZW5kcyBvbiBTRUNVUklUWV9TTUFDSworCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNlbmRpbmcgYSBzaWduYWwgaGFzIGJlZW4gdHJlYXRlZCBhcyBhIHdyaXRlIG9wZXJhdGlvbiB0byB0aGUKKwkgIHJlY2VpdmluZyBwcm9jZXNzLiBJZiB0aGlzIG9wdGlvbiBpcyBzZWxlY3RlZCwgdGhlIGRlbGl2ZXJ5CisJICB3aWxsIGJlIGFuIGFwcGVuZCBvcGVyYXRpb24gaW5zdGVhZC4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZQorCSAgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGRlbGl2ZXJpbmcgYSBuZXR3b3JrIHBhY2tldCBhbmQKKwkgIGRlbGl2ZXJpbmcgYSBzaWduYWwgaW4gdGhlIFNtYWNrIHJ1bGVzLgorCSAgSWYgeW91IGFyZSB1bnN1cmUgaG93IHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCBhbnN3ZXIgTi4KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmggYi9zZWN1cml0eS9zbWFjay9zbWFjay5oCmluZGV4IDI2ZTU4ZjEuLjUxZmQzMDEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmgKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2suaApAQCAtMjU2LDYgKzI1NiwxNiBAQAogI2RlZmluZSBNQVlfTE9DSwkweDAwMDAyMDAwCS8qIExvY2tzIHNob3VsZCBiZSB3cml0ZXMsIGJ1dCAuLi4gKi8KICNkZWZpbmUgTUFZX0JSSU5HVVAJMHgwMDAwNDAwMAkvKiBSZXBvcnQgdXNlIG9mIHRoaXMgcnVsZSAqLwogCisvKgorICogVGhlIHBvbGljeSBmb3IgZGVsaXZlcmluZyBzaWduYWxzIGlzIGNvbmZpZ3VyYWJsZS4KKyAqIEl0IGlzIHVzdWFsbHkgIndyaXRlIiwgYnV0IGNhbiBiZSAiYXBwZW5kIi4KKyAqLworI2lmZGVmIENPTkZJR19TRUNVUklUWV9TTUFDS19BUFBFTkRfU0lHTkFMUworI2RlZmluZSBNQVlfREVMSVZFUglNQVlfQVBQRU5ECS8qIFNpZ25hbCBkZWxpdmVyeSByZXF1aXJlcyBhcHBlbmQgKi8KKyNlbHNlCisjZGVmaW5lIE1BWV9ERUxJVkVSCU1BWV9XUklURQkvKiBTaWduYWwgZGVsaXZlcnkgcmVxdWlyZXMgd3JpdGUgKi8KKyNlbmRpZgorCiAjZGVmaW5lIFNNQUNLX0JSSU5HVVBfQUxMT1cJCTEJLyogQWxsb3cgYnJpbmd1cCBtb2RlICovCiAjZGVmaW5lIFNNQUNLX1VOQ09ORklORURfU1VCSkVDVAkyCS8qIEFsbG93IHVuY29uZmluZWQgbGFiZWwgKi8KICNkZWZpbmUgU01BQ0tfVU5DT05GSU5FRF9PQkpFQ1QJCTMJLyogQWxsb3cgdW5jb25maW5lZCBsYWJlbCAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMgYi9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYwppbmRleCA4N2E5NzQxLi5jYWVjMjI1IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYworKysgYi9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYwpAQCAtMTg1NywxNCArMTg1NywxNCBAQAogCiAJLyogd2UgZG9uJ3QgbG9nIGhlcmUgYXMgcmMgY2FuIGJlIG92ZXJyaWRlbiAqLwogCXNrcCA9IGZpbGUtPmZfc2VjdXJpdHk7Ci0JcmMgPSBzbWtfYWNjZXNzKHNrcCwgdGtwLCBNQVlfV1JJVEUsIE5VTEwpOwotCXJjID0gc21rX2J1X25vdGUoInNpZ2lvdGFzayIsIHNrcCwgdGtwLCBNQVlfV1JJVEUsIHJjKTsKKwlyYyA9IHNta19hY2Nlc3Moc2twLCB0a3AsIE1BWV9ERUxJVkVSLCBOVUxMKTsKKwlyYyA9IHNta19idV9ub3RlKCJzaWdpb3Rhc2siLCBza3AsIHRrcCwgTUFZX0RFTElWRVIsIHJjKTsKIAlpZiAocmMgIT0gMCAmJiBoYXNfY2FwYWJpbGl0eSh0c2ssIENBUF9NQUNfT1ZFUlJJREUpKQogCQlyYyA9IDA7CiAKIAlzbWtfYWRfaW5pdCgmYWQsIF9fZnVuY19fLCBMU01fQVVESVRfREFUQV9UQVNLKTsKIAlzbWtfYWRfc2V0ZmllbGRfdV90c2soJmFkLCB0c2spOwotCXNtYWNrX2xvZyhza3AtPnNta19rbm93biwgdGtwLT5zbWtfa25vd24sIE1BWV9XUklURSwgcmMsICZhZCk7CisJc21hY2tfbG9nKHNrcC0+c21rX2tub3duLCB0a3AtPnNta19rbm93biwgTUFZX0RFTElWRVIsIHJjLCAmYWQpOwogCXJldHVybiByYzsKIH0KIApAQCAtMjI2NSw4ICsyMjY1LDggQEAKIAkgKiBjYW4gd3JpdGUgdGhlIHJlY2VpdmVyLgogCSAqLwogCWlmIChzZWNpZCA9PSAwKSB7Ci0JCXJjID0gc21rX2N1cmFjYyh0a3AsIE1BWV9XUklURSwgJmFkKTsKLQkJcmMgPSBzbWtfYnVfdGFzayhwLCBNQVlfV1JJVEUsIHJjKTsKKwkJcmMgPSBzbWtfY3VyYWNjKHRrcCwgTUFZX0RFTElWRVIsICZhZCk7CisJCXJjID0gc21rX2J1X3Rhc2socCwgTUFZX0RFTElWRVIsIHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KIAkvKgpAQCAtMjI3NSw4ICsyMjc1LDggQEAKIAkgKiB3ZSBjYW4ndCB0YWtlIHByaXZpbGVnZSBpbnRvIGFjY291bnQuCiAJICovCiAJc2twID0gc21hY2tfZnJvbV9zZWNpZChzZWNpZCk7Ci0JcmMgPSBzbWtfYWNjZXNzKHNrcCwgdGtwLCBNQVlfV1JJVEUsICZhZCk7Ci0JcmMgPSBzbWtfYnVfbm90ZSgiVVNCIHNpZ25hbCIsIHNrcCwgdGtwLCBNQVlfV1JJVEUsIHJjKTsKKwlyYyA9IHNta19hY2Nlc3Moc2twLCB0a3AsIE1BWV9ERUxJVkVSLCAmYWQpOworCXJjID0gc21rX2J1X25vdGUoIlVTQiBzaWduYWwiLCBza3AsIHRrcCwgTUFZX0RFTElWRVIsIHJjKTsKIAlyZXR1cm4gcmM7CiB9CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX25ldGZpbHRlci5jIGIvc2VjdXJpdHkvc21hY2svc21hY2tfbmV0ZmlsdGVyLmMKaW5kZXggYWE2YmYxYi4uMjA1Yjc4NSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2tfbmV0ZmlsdGVyLmMKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2tfbmV0ZmlsdGVyLmMKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxuZXQvaW5ldF9zb2NrLmg+CiAjaW5jbHVkZSAic21hY2suaCIKIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc21hY2tfaXB2Nl9vdXRwdXQodm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTY0LDcgKzY0LDcgQEAKIAkJLmhvb2tudW0gPQlORl9JTkVUX0xPQ0FMX09VVCwKIAkJLnByaW9yaXR5ID0JTkZfSVBfUFJJX1NFTElOVVhfRklSU1QsCiAJfSwKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCXsKIAkJLmhvb2sgPQkJc21hY2tfaXB2Nl9vdXRwdXQsCiAJCS5wZiA9CQlORlBST1RPX0lQVjYsCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zbWFjay9zbWFja2ZzLmMgYi9zZWN1cml0eS9zbWFjay9zbWFja2ZzLmMKaW5kZXggZTI0OWE2Ni4uNjQ5MmZlOSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jCisrKyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYwpAQCAtMjUyMywxNCArMjUyMyw5IEBACiAJaWYgKGNvdW50ID09IDAgfHwgY291bnQgPiBTTUtfTE9OR0xBQkVMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWRhdGEgPSBremFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoZGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBidWYsIGNvdW50KSAhPSAwKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBvdXRfZGF0YTsKLQl9CisJZGF0YSA9IG1lbWR1cF91c2VyKGJ1ZiwgY291bnQpOworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOwogCiAJY3AgPSBzbWtfcGFyc2Vfc21hY2soZGF0YSwgY291bnQpOwogCWlmIChJU19FUlIoY3ApKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvZmFicmljcy9sYXlvdXQuYyBiL3NvdW5kL2FvYS9mYWJyaWNzL2xheW91dC5jCmluZGV4IDhmNzFmN2UuLmEwYzRhNWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9mYWJyaWNzL2xheW91dC5jCisrKyBiL3NvdW5kL2FvYS9mYWJyaWNzL2xheW91dC5jCkBAIC0xMTIsNiArMTEyLDcgQEAKIAogTU9EVUxFX0FMSUFTKCJhb2EtZGV2aWNlLWlkLTE0Iik7CiBNT0RVTEVfQUxJQVMoImFvYS1kZXZpY2UtaWQtMjIiKTsKK01PRFVMRV9BTElBUygiYW9hLWRldmljZS1pZC0zMSIpOwogTU9EVUxFX0FMSUFTKCJhb2EtZGV2aWNlLWlkLTM1Iik7CiBNT0RVTEVfQUxJQVMoImFvYS1kZXZpY2UtaWQtNDQiKTsKIApAQCAtMzYyLDYgKzM2MywxMyBAQAogCQkuY29ubmVjdGlvbnMgPSB0YXNfY29ubmVjdGlvbnNfbm9saW5lb3V0LAogCSAgfSwKIAl9LAorCS8qIFBvd2VyQm9vazYsMSAqLworCXsgLmRldmljZV9pZCA9IDMxLAorCSAgLmNvZGVjc1swXSA9IHsKKwkJLm5hbWUgPSAidGFzIiwKKwkJLmNvbm5lY3Rpb25zID0gdGFzX2Nvbm5lY3Rpb25zX25vbGluZW91dCwKKwkgIH0sCisJfSwKIAkvKiBQb3dlckJvb2s2LDUgKi8KIAl7IC5kZXZpY2VfaWQgPSA0NCwKIAkgIC5jb2RlY3NbMF0gPSB7CkBAIC0xMTYxLDEyICsxMTY5LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgYW9hX2ZhYnJpY19sYXlvdXRfaW5pdCh2b2lkKQogewotCWludCBlcnI7Ci0KLQllcnIgPSBzb3VuZGJ1c19yZWdpc3Rlcl9kcml2ZXIoJmFvYV9zb3VuZGJ1c19kcml2ZXIpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNvdW5kYnVzX3JlZ2lzdGVyX2RyaXZlcigmYW9hX3NvdW5kYnVzX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhb2FfZmFicmljX2xheW91dF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2NvcmUuYyBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvY29yZS5jCmluZGV4IDFjYmYyMTAuLjAwMGI1ODUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvY29yZS5jCisrKyBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvY29yZS5jCkBAIC0xOTcsNyArMTk3LDcgQEAKIAkJCSAqIHNvIHJlc3RyaWN0IHRvIHRob3NlIHdlIGRvIGhhbmRsZSBmb3Igbm93LgogCQkJICovCiAJCQlpZiAoaWQgJiYgKCppZCA9PSAyMiB8fCAqaWQgPT0gMTQgfHwgKmlkID09IDM1IHx8Ci0JCQkJICAgKmlkID09IDQ0KSkgeworCQkJCSAgICppZCA9PSAzMSB8fCAqaWQgPT0gNDQpKSB7CiAJCQkJc25wcmludGYoZGV2LT5zb3VuZC5tb2RhbGlhcywgMzIsCiAJCQkJCSAiYW9hLWRldmljZS1pZC0lZCIsICppZCk7CiAJCQkJb2sgPSAxOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9jb21wcmVzc19vZmZsb2FkLmMgYi9zb3VuZC9jb3JlL2NvbXByZXNzX29mZmxvYWQuYwppbmRleCAyYzQ5ODQ4Li5mZWMxZGZkIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2NvbXByZXNzX29mZmxvYWQuYworKysgYi9zb3VuZC9jb3JlL2NvbXByZXNzX29mZmxvYWQuYwpAQCAtNTUzLDEzICs1NTMsOSBAQAogCQkgKiB3ZSBzaG91bGQgYWxsb3cgcGFyYW1ldGVyIGNoYW5nZSBvbmx5IHdoZW4gc3RyZWFtIGhhcyBiZWVuCiAJCSAqIG9wZW5lZCBub3QgaW4gb3RoZXIgY2FzZXMKIAkJICovCi0JCXBhcmFtcyA9IGttYWxsb2Moc2l6ZW9mKCpwYXJhbXMpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwYXJhbXMpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtcywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoKnBhcmFtcykpKSB7Ci0JCQlyZXR2YWwgPSAtRUZBVUxUOwotCQkJZ290byBvdXQ7Ci0JCX0KKwkJcGFyYW1zID0gbWVtZHVwX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoKnBhcmFtcykpOworCQlpZiAoSVNfRVJSKHBhcmFtcykpCisJCQlyZXR1cm4gUFRSX0VSUihwYXJhbXMpOwogCiAJCXJldHZhbCA9IHNuZF9jb21wcmVzc19jaGVja19pbnB1dChwYXJhbXMpOwogCQlpZiAocmV0dmFsKQpAQCAtNzg0LDcgKzc4MCw3IEBACiAJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHN0cmVhbS0+cnVudGltZS0+c2xlZXAsCiAJCQkoc3RyZWFtLT5ydW50aW1lLT5zdGF0ZSAhPSBTTkRSVl9QQ01fU1RBVEVfRFJBSU5JTkcpKTsKIAlpZiAocmV0ID09IC1FUkVTVEFSVFNZUykKLQkJcHJfZGVidWcoIndhaXQgYWJvcnRlZCBieSBhIHNpZ25hbCIpOworCQlwcl9kZWJ1Zygid2FpdCBhYm9ydGVkIGJ5IGEgc2lnbmFsXG4iKTsKIAllbHNlIGlmIChyZXQpCiAJCXByX2RlYnVnKCJ3YWl0IGZvciBkcmFpbiBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKIApAQCAtOTY2LDcgKzk2Miw3IEBACiAJCQkJICBjb21wci0+Y2FyZCwgY29tcHItPmRldmljZSwKIAkJCQkgICZzbmRfY29tcHJfZmlsZV9vcHMsIGNvbXByLCAmY29tcHItPmRldik7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJzbmRfcmVnaXN0ZXJfZGV2aWNlIGZhaWxlZFxuICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJzbmRfcmVnaXN0ZXJfZGV2aWNlIGZhaWxlZCAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jIGIvc291bmQvY29yZS9wY21fbmF0aXZlLmMKaW5kZXggYzYxZmQ1MC4uOWQzM2MxZSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY21fbmF0aXZlLmMKKysrIGIvc291bmQvY29yZS9wY21fbmF0aXZlLmMKQEAgLTI2MzcsOSArMjYzNywxMSBAQAogCQkJYnJlYWs7CiAJCS8qIEZhbGwgdGhyb3VnaCAqLwogCWNhc2UgU05EUlZfUENNX1NUQVRFX1BSRVBBUkVEOgotCWNhc2UgU05EUlZfUENNX1NUQVRFX1NVU1BFTkRFRDoKIAkJZXJyID0gMDsKIAkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fU1RBVEVfU1VTUEVOREVEOgorCQllcnIgPSAtRVNUUlBJUEU7CisJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX1NUQVRFX1hSVU46CiAJCWVyciA9IC1FUElQRTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3Jhd21pZGkuYyBiL3NvdW5kL2NvcmUvcmF3bWlkaS5jCmluZGV4IDc5NTQzN2IuLmI0NTBhMjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcmF3bWlkaS5jCisrKyBiL3NvdW5kL2NvcmUvcmF3bWlkaS5jCkBAIC0xNjMzLDExICsxNjMzLDEzIEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWxpc3RfYWRkX3RhaWwoJnJtaWRpLT5saXN0LCAmc25kX3Jhd21pZGlfZGV2aWNlcyk7CisJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJZXJyID0gc25kX3JlZ2lzdGVyX2RldmljZShTTkRSVl9ERVZJQ0VfVFlQRV9SQVdNSURJLAogCQkJCSAgcm1pZGktPmNhcmQsIHJtaWRpLT5kZXZpY2UsCiAJCQkJICAmc25kX3Jhd21pZGlfZl9vcHMsIHJtaWRpLCAmcm1pZGktPmRldik7CiAJaWYgKGVyciA8IDApIHsKIAkJcm1pZGlfZXJyKHJtaWRpLCAidW5hYmxlIHRvIHJlZ2lzdGVyXG4iKTsKKwkJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCQlsaXN0X2RlbCgmcm1pZGktPmxpc3QpOwogCQltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAkJcmV0dXJuIGVycjsKQEAgLTE2NDUsNiArMTY0Nyw3IEBACiAJaWYgKHJtaWRpLT5vcHMgJiYgcm1pZGktPm9wcy0+ZGV2X3JlZ2lzdGVyICYmCiAJICAgIChlcnIgPSBybWlkaS0+b3BzLT5kZXZfcmVnaXN0ZXIocm1pZGkpKSA8IDApIHsKIAkJc25kX3VucmVnaXN0ZXJfZGV2aWNlKCZybWlkaS0+ZGV2KTsKKwkJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCQlsaXN0X2RlbCgmcm1pZGktPmxpc3QpOwogCQltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAkJcmV0dXJuIGVycjsKQEAgLTE2NzcsNyArMTY4MCw2IEBACiAJCX0KIAl9CiAjZW5kaWYgLyogQ09ORklHX1NORF9PU1NFTVVMICovCi0JbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJc3ByaW50ZihuYW1lLCAibWlkaSVkIiwgcm1pZGktPmRldmljZSk7CiAJZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShybWlkaS0+Y2FyZCwgbmFtZSwgcm1pZGktPmNhcmQtPnByb2Nfcm9vdCk7CiAJaWYgKGVudHJ5KSB7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfY2xpZW50bWdyLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfY2xpZW50bWdyLmMKaW5kZXggZDZkOTQxOS4uNGM5MzUyMCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX2NsaWVudG1nci5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYwpAQCAtODcsMjEgKzg3LDYgQEAKIAogLyoKICAqLwotIAotc3RhdGljIGlubGluZSBtbV9zZWdtZW50X3Qgc25kX2VudGVyX3VzZXIodm9pZCkKLXsKLQltbV9zZWdtZW50X3QgZnMgPSBnZXRfZnMoKTsKLQlzZXRfZnMoZ2V0X2RzKCkpOwotCXJldHVybiBmczsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNuZF9sZWF2ZV91c2VyKG1tX3NlZ21lbnRfdCBmcykKLXsKLQlzZXRfZnMoZnMpOwotfQotCi0vKgotICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHNuZF9zZXFfZmlsZV9mbGFncyhzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKICAgICAgICAgc3dpdGNoIChmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSkgewpAQCAtMTEyOCw1OSArMTExMyw2OSBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3B2ZXJzaW9uKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCB2b2lkICphcmcpCit7CisJaW50ICpwdmVyc2lvbiA9IGFyZzsKKworCSpwdmVyc2lvbiA9IFNORFJWX1NFUV9WRVJTSU9OOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfY2xpZW50X2lkKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCB2b2lkICphcmcpCit7CisJaW50ICpjbGllbnRfaWQgPSBhcmc7CisKKwkqY2xpZW50X2lkID0gY2xpZW50LT5udW1iZXI7CisJcmV0dXJuIDA7Cit9CiAKIC8qIFNZU1RFTV9JTkZPIGlvY3RsKCkgKi8KLXN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9zeXN0ZW1faW5mbyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9zeXN0ZW1faW5mbyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBzbmRfc2VxX3N5c3RlbV9pbmZvIGluZm87CisJc3RydWN0IHNuZF9zZXFfc3lzdGVtX2luZm8gKmluZm8gPSBhcmc7CiAKLQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOwogCS8qIGZpbGwgdGhlIGluZm8gZmllbGRzICovCi0JaW5mby5xdWV1ZXMgPSBTTkRSVl9TRVFfTUFYX1FVRVVFUzsKLQlpbmZvLmNsaWVudHMgPSBTTkRSVl9TRVFfTUFYX0NMSUVOVFM7Ci0JaW5mby5wb3J0cyA9IFNORFJWX1NFUV9NQVhfUE9SVFM7Ci0JaW5mby5jaGFubmVscyA9IDI1NjsJLyogZml4ZWQgbGltaXQgKi8KLQlpbmZvLmN1cl9jbGllbnRzID0gY2xpZW50X3VzYWdlLmN1cjsKLQlpbmZvLmN1cl9xdWV1ZXMgPSBzbmRfc2VxX3F1ZXVlX2dldF9jdXJfcXVldWVzKCk7CisJaW5mby0+cXVldWVzID0gU05EUlZfU0VRX01BWF9RVUVVRVM7CisJaW5mby0+Y2xpZW50cyA9IFNORFJWX1NFUV9NQVhfQ0xJRU5UUzsKKwlpbmZvLT5wb3J0cyA9IFNORFJWX1NFUV9NQVhfUE9SVFM7CisJaW5mby0+Y2hhbm5lbHMgPSAyNTY7CS8qIGZpeGVkIGxpbWl0ICovCisJaW5mby0+Y3VyX2NsaWVudHMgPSBjbGllbnRfdXNhZ2UuY3VyOworCWluZm8tPmN1cl9xdWV1ZXMgPSBzbmRfc2VxX3F1ZXVlX2dldF9jdXJfcXVldWVzKCk7CiAKLQlpZiAoY29weV90b191c2VyKGFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQogCiAKIC8qIFJVTk5JTkdfTU9ERSBpb2N0bCgpICovCi1zdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfcnVubmluZ19tb2RlKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3J1bm5pbmdfbW9kZShzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgdm9pZCAgKmFyZykKIHsKLQlzdHJ1Y3Qgc25kX3NlcV9ydW5uaW5nX2luZm8gaW5mbzsKKwlzdHJ1Y3Qgc25kX3NlcV9ydW5uaW5nX2luZm8gKmluZm8gPSBhcmc7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjcHRyOwogCWludCBlcnIgPSAwOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCiAJLyogcmVxdWVzdGVkIGNsaWVudCBudW1iZXIgKi8KLQljcHRyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihpbmZvLmNsaWVudCk7CisJY3B0ciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoaW5mby0+Y2xpZW50KTsKIAlpZiAoY3B0ciA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0VOVDsJCS8qIGRvbid0IGNoYW5nZSAhISEgKi8KIAogI2lmZGVmIFNORFJWX0JJR19FTkRJQU4KLQlpZiAoISBpbmZvLmJpZ19lbmRpYW4pIHsKKwlpZiAoIWluZm8tPmJpZ19lbmRpYW4pIHsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBfX2VycjsKIAl9CiAjZWxzZQotCWlmIChpbmZvLmJpZ19lbmRpYW4pIHsKKwlpZiAoaW5mby0+YmlnX2VuZGlhbikgewogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIF9fZXJyOwogCX0KIAogI2VuZGlmCi0JaWYgKGluZm8uY3B1X21vZGUgPiBzaXplb2YobG9uZykpIHsKKwlpZiAoaW5mby0+Y3B1X21vZGUgPiBzaXplb2YobG9uZykpIHsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBfX2VycjsKIAl9Ci0JY3B0ci0+Y29udmVydDMyID0gKGluZm8uY3B1X21vZGUgPCBzaXplb2YobG9uZykpOworCWNwdHItPmNvbnZlcnQzMiA9IChpbmZvLT5jcHVfbW9kZSA8IHNpemVvZihsb25nKSk7CiAgX19lcnI6CiAJc25kX3NlcV9jbGllbnRfdW5sb2NrKGNwdHIpOwogCXJldHVybiBlcnI7CkBAIC0xMjE0LDUxICsxMjA5LDQzIEBACiB9CiAKIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9nZXRfY2xpZW50X2luZm8oc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCSB2b2lkIF9fdXNlciAqYXJnKQorCQkJCQkgdm9pZCAqYXJnKQogeworCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9pbmZvICpjbGllbnRfaW5mbyA9IGFyZzsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNwdHI7Ci0Jc3RydWN0IHNuZF9zZXFfY2xpZW50X2luZm8gY2xpZW50X2luZm87Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmNsaWVudF9pbmZvLCBhcmcsIHNpemVvZihjbGllbnRfaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKIAogCS8qIHJlcXVlc3RlZCBjbGllbnQgbnVtYmVyICovCi0JY3B0ciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoY2xpZW50X2luZm8uY2xpZW50KTsKKwljcHRyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihjbGllbnRfaW5mby0+Y2xpZW50KTsKIAlpZiAoY3B0ciA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0VOVDsJCS8qIGRvbid0IGNoYW5nZSAhISEgKi8KIAotCWdldF9jbGllbnRfaW5mbyhjcHRyLCAmY2xpZW50X2luZm8pOworCWdldF9jbGllbnRfaW5mbyhjcHRyLCBjbGllbnRfaW5mbyk7CiAJc25kX3NlcV9jbGllbnRfdW5sb2NrKGNwdHIpOwogCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZjbGllbnRfaW5mbywgc2l6ZW9mKGNsaWVudF9pbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQogCiAKIC8qIENMSUVOVF9JTkZPIGlvY3RsKCkgKi8KIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9zZXRfY2xpZW50X2luZm8oc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCSB2b2lkIF9fdXNlciAqYXJnKQorCQkJCQkgdm9pZCAqYXJnKQogewotCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9pbmZvIGNsaWVudF9pbmZvOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjbGllbnRfaW5mbywgYXJnLCBzaXplb2YoY2xpZW50X2luZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJc3RydWN0IHNuZF9zZXFfY2xpZW50X2luZm8gKmNsaWVudF9pbmZvID0gYXJnOwogCiAJLyogaXQgaXMgbm90IGFsbG93ZWQgdG8gc2V0IHRoZSBpbmZvIGZpZWxkcyBmb3IgYW4gYW5vdGhlciBjbGllbnQgKi8KLQlpZiAoY2xpZW50LT5udW1iZXIgIT0gY2xpZW50X2luZm8uY2xpZW50KQorCWlmIChjbGllbnQtPm51bWJlciAhPSBjbGllbnRfaW5mby0+Y2xpZW50KQogCQlyZXR1cm4gLUVQRVJNOwogCS8qIGFsc28gY2xpZW50IHR5cGUgbXVzdCBiZSBzZXQgbm93ICovCi0JaWYgKGNsaWVudC0+dHlwZSAhPSBjbGllbnRfaW5mby50eXBlKQorCWlmIChjbGllbnQtPnR5cGUgIT0gY2xpZW50X2luZm8tPnR5cGUpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogZmlsbCB0aGUgaW5mbyBmaWVsZHMgKi8KLQlpZiAoY2xpZW50X2luZm8ubmFtZVswXSkKLQkJc3RybGNweShjbGllbnQtPm5hbWUsIGNsaWVudF9pbmZvLm5hbWUsIHNpemVvZihjbGllbnQtPm5hbWUpKTsKKwlpZiAoY2xpZW50X2luZm8tPm5hbWVbMF0pCisJCXN0cmxjcHkoY2xpZW50LT5uYW1lLCBjbGllbnRfaW5mby0+bmFtZSwgc2l6ZW9mKGNsaWVudC0+bmFtZSkpOwogCi0JY2xpZW50LT5maWx0ZXIgPSBjbGllbnRfaW5mby5maWx0ZXI7Ci0JY2xpZW50LT5ldmVudF9sb3N0ID0gY2xpZW50X2luZm8uZXZlbnRfbG9zdDsKLQltZW1jcHkoY2xpZW50LT5ldmVudF9maWx0ZXIsIGNsaWVudF9pbmZvLmV2ZW50X2ZpbHRlciwgMzIpOworCWNsaWVudC0+ZmlsdGVyID0gY2xpZW50X2luZm8tPmZpbHRlcjsKKwljbGllbnQtPmV2ZW50X2xvc3QgPSBjbGllbnRfaW5mby0+ZXZlbnRfbG9zdDsKKwltZW1jcHkoY2xpZW50LT5ldmVudF9maWx0ZXIsIGNsaWVudF9pbmZvLT5ldmVudF9maWx0ZXIsIDMyKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTI2NywzMCArMTI1NCwyNiBAQAogLyogCiAgKiBDUkVBVEUgUE9SVCBpb2N0bCgpIAogICovCi1zdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfY3JlYXRlX3BvcnQoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJICAgICB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2NyZWF0ZV9wb3J0KHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCB2b2lkICphcmcpCiB7CisJc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvICppbmZvID0gYXJnOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0ICpwb3J0OwotCXN0cnVjdCBzbmRfc2VxX3BvcnRfaW5mbyBpbmZvOwogCXN0cnVjdCBzbmRfc2VxX3BvcnRfY2FsbGJhY2sgKmNhbGxiYWNrOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCiAJLyogaXQgaXMgbm90IGFsbG93ZWQgdG8gY3JlYXRlIHRoZSBwb3J0IGZvciBhbiBhbm90aGVyIGNsaWVudCAqLwotCWlmIChpbmZvLmFkZHIuY2xpZW50ICE9IGNsaWVudC0+bnVtYmVyKQorCWlmIChpbmZvLT5hZGRyLmNsaWVudCAhPSBjbGllbnQtPm51bWJlcikKIAkJcmV0dXJuIC1FUEVSTTsKIAotCXBvcnQgPSBzbmRfc2VxX2NyZWF0ZV9wb3J0KGNsaWVudCwgKGluZm8uZmxhZ3MgJiBTTkRSVl9TRVFfUE9SVF9GTEdfR0lWRU5fUE9SVCkgPyBpbmZvLmFkZHIucG9ydCA6IC0xKTsKKwlwb3J0ID0gc25kX3NlcV9jcmVhdGVfcG9ydChjbGllbnQsIChpbmZvLT5mbGFncyAmIFNORFJWX1NFUV9QT1JUX0ZMR19HSVZFTl9QT1JUKSA/IGluZm8tPmFkZHIucG9ydCA6IC0xKTsKIAlpZiAocG9ydCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmIChjbGllbnQtPnR5cGUgPT0gVVNFUl9DTElFTlQgJiYgaW5mby5rZXJuZWwpIHsKKwlpZiAoY2xpZW50LT50eXBlID09IFVTRVJfQ0xJRU5UICYmIGluZm8tPmtlcm5lbCkgewogCQlzbmRfc2VxX2RlbGV0ZV9wb3J0KGNsaWVudCwgcG9ydC0+YWRkci5wb3J0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChjbGllbnQtPnR5cGUgPT0gS0VSTkVMX0NMSUVOVCkgewotCQlpZiAoKGNhbGxiYWNrID0gaW5mby5rZXJuZWwpICE9IE5VTEwpIHsKKwkJaWYgKChjYWxsYmFjayA9IGluZm8tPmtlcm5lbCkgIT0gTlVMTCkgewogCQkJaWYgKGNhbGxiYWNrLT5vd25lcikKIAkJCQlwb3J0LT5vd25lciA9IGNhbGxiYWNrLT5vd25lcjsKIAkJCXBvcnQtPnByaXZhdGVfZGF0YSA9IGNhbGxiYWNrLT5wcml2YXRlX2RhdGE7CkBAIC0xMzAzLDM3ICsxMjg2LDI5IEBACiAJCX0KIAl9CiAKLQlpbmZvLmFkZHIgPSBwb3J0LT5hZGRyOworCWluZm8tPmFkZHIgPSBwb3J0LT5hZGRyOwogCi0Jc25kX3NlcV9zZXRfcG9ydF9pbmZvKHBvcnQsICZpbmZvKTsKKwlzbmRfc2VxX3NldF9wb3J0X2luZm8ocG9ydCwgaW5mbyk7CiAJc25kX3NlcV9zeXN0ZW1fY2xpZW50X2V2X3BvcnRfc3RhcnQocG9ydC0+YWRkci5jbGllbnQsIHBvcnQtPmFkZHIucG9ydCk7CiAKLQlpZiAoY29weV90b191c2VyKGFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCiAJcmV0dXJuIDA7CiB9CiAKIC8qIAogICogREVMRVRFIFBPUlQgaW9jdGwoKSAKICAqLwotc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2RlbGV0ZV9wb3J0KHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCSAgICAgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9kZWxldGVfcG9ydChzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBzbmRfc2VxX3BvcnRfaW5mbyBpbmZvOworCXN0cnVjdCBzbmRfc2VxX3BvcnRfaW5mbyAqaW5mbyA9IGFyZzsKIAlpbnQgZXJyOwogCi0JLyogc2V0IHBhc3NlZCBwYXJhbWV0ZXJzICovCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCQogCS8qIGl0IGlzIG5vdCBhbGxvd2VkIHRvIHJlbW92ZSB0aGUgcG9ydCBmb3IgYW4gYW5vdGhlciBjbGllbnQgKi8KLQlpZiAoaW5mby5hZGRyLmNsaWVudCAhPSBjbGllbnQtPm51bWJlcikKKwlpZiAoaW5mby0+YWRkci5jbGllbnQgIT0gY2xpZW50LT5udW1iZXIpCiAJCXJldHVybiAtRVBFUk07CiAKLQllcnIgPSBzbmRfc2VxX2RlbGV0ZV9wb3J0KGNsaWVudCwgaW5mby5hZGRyLnBvcnQpOworCWVyciA9IHNuZF9zZXFfZGVsZXRlX3BvcnQoY2xpZW50LCBpbmZvLT5hZGRyLnBvcnQpOwogCWlmIChlcnIgPj0gMCkKLQkJc25kX3NlcV9zeXN0ZW1fY2xpZW50X2V2X3BvcnRfZXhpdChjbGllbnQtPm51bWJlciwgaW5mby5hZGRyLnBvcnQpOworCQlzbmRfc2VxX3N5c3RlbV9jbGllbnRfZXZfcG9ydF9leGl0KGNsaWVudC0+bnVtYmVyLCBpbmZvLT5hZGRyLnBvcnQpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTEzNDEsMzIgKzEzMTYsMjcgQEAKIC8qIAogICogR0VUX1BPUlRfSU5GTyBpb2N0bCgpIChvbiBhbnkgY2xpZW50KSAKICAqLwotc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2dldF9wb3J0X2luZm8oc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJICAgICAgIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfZ2V0X3BvcnRfaW5mbyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgdm9pZCAqYXJnKQogeworCXN0cnVjdCBzbmRfc2VxX3BvcnRfaW5mbyAqaW5mbyA9IGFyZzsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNwdHI7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKnBvcnQ7Ci0Jc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvIGluZm87CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JY3B0ciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoaW5mby5hZGRyLmNsaWVudCk7CisJY3B0ciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoaW5mby0+YWRkci5jbGllbnQpOwogCWlmIChjcHRyID09IE5VTEwpCiAJCXJldHVybiAtRU5YSU87CiAKLQlwb3J0ID0gc25kX3NlcV9wb3J0X3VzZV9wdHIoY3B0ciwgaW5mby5hZGRyLnBvcnQpOworCXBvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihjcHRyLCBpbmZvLT5hZGRyLnBvcnQpOwogCWlmIChwb3J0ID09IE5VTEwpIHsKIAkJc25kX3NlcV9jbGllbnRfdW5sb2NrKGNwdHIpOwogCQlyZXR1cm4gLUVOT0VOVDsJCQkvKiBkb24ndCBjaGFuZ2UgKi8KIAl9CiAKIAkvKiBnZXQgcG9ydCBpbmZvICovCi0Jc25kX3NlcV9nZXRfcG9ydF9pbmZvKHBvcnQsICZpbmZvKTsKKwlzbmRfc2VxX2dldF9wb3J0X2luZm8ocG9ydCwgaW5mbyk7CiAJc25kX3NlcV9wb3J0X3VubG9jayhwb3J0KTsKIAlzbmRfc2VxX2NsaWVudF91bmxvY2soY3B0cik7CiAKLQlpZiAoY29weV90b191c2VyKGFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQogCkBAIC0xMzc0LDIwICsxMzQ0LDE2IEBACiAvKiAKICAqIFNFVF9QT1JUX0lORk8gaW9jdGwoKSAob25seSBwb3J0cyBvbiB0aGlzL293biBjbGllbnQpIAogICovCi1zdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfc2V0X3BvcnRfaW5mbyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkgICAgICAgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9zZXRfcG9ydF9pbmZvKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCB2b2lkICphcmcpCiB7CisJc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvICppbmZvID0gYXJnOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0ICpwb3J0OwotCXN0cnVjdCBzbmRfc2VxX3BvcnRfaW5mbyBpbmZvOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGluZm8uYWRkci5jbGllbnQgIT0gY2xpZW50LT5udW1iZXIpIC8qIG9ubHkgc2V0IG91ciBvd24gcG9ydHMgISAqLworCWlmIChpbmZvLT5hZGRyLmNsaWVudCAhPSBjbGllbnQtPm51bWJlcikgLyogb25seSBzZXQgb3VyIG93biBwb3J0cyAhICovCiAJCXJldHVybiAtRVBFUk07Ci0JcG9ydCA9IHNuZF9zZXFfcG9ydF91c2VfcHRyKGNsaWVudCwgaW5mby5hZGRyLnBvcnQpOworCXBvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihjbGllbnQsIGluZm8tPmFkZHIucG9ydCk7CiAJaWYgKHBvcnQpIHsKLQkJc25kX3NlcV9zZXRfcG9ydF9pbmZvKHBvcnQsICZpbmZvKTsKKwkJc25kX3NlcV9zZXRfcG9ydF9pbmZvKHBvcnQsIGluZm8pOwogCQlzbmRfc2VxX3BvcnRfdW5sb2NrKHBvcnQpOwogCX0KIAlyZXR1cm4gMDsKQEAgLTE0NTMsMzQgKzE0MTksMzEgQEAKICAqIGFkZCB0byBwb3J0J3Mgc3Vic2NyaXB0aW9uIGxpc3QgSU9DVEwgaW50ZXJmYWNlIAogICovCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfc3Vic2NyaWJlX3BvcnQoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCXZvaWQgX191c2VyICphcmcpCisJCQkJCXZvaWQgKmFyZykKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZSAqc3VicyA9IGFyZzsKIAlpbnQgcmVzdWx0ID0gLUVJTlZBTDsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKnJlY2VpdmVyID0gTlVMTCwgKnNlbmRlciA9IE5VTEw7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKnNwb3J0ID0gTlVMTCwgKmRwb3J0ID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZSBzdWJzOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZzdWJzLCBhcmcsIHNpemVvZihzdWJzKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKChyZWNlaXZlciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoc3Vicy5kZXN0LmNsaWVudCkpID09IE5VTEwpCisJaWYgKChyZWNlaXZlciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoc3Vicy0+ZGVzdC5jbGllbnQpKSA9PSBOVUxMKQogCQlnb3RvIF9fZW5kOwotCWlmICgoc2VuZGVyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihzdWJzLnNlbmRlci5jbGllbnQpKSA9PSBOVUxMKQorCWlmICgoc2VuZGVyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihzdWJzLT5zZW5kZXIuY2xpZW50KSkgPT0gTlVMTCkKIAkJZ290byBfX2VuZDsKLQlpZiAoKHNwb3J0ID0gc25kX3NlcV9wb3J0X3VzZV9wdHIoc2VuZGVyLCBzdWJzLnNlbmRlci5wb3J0KSkgPT0gTlVMTCkKKwlpZiAoKHNwb3J0ID0gc25kX3NlcV9wb3J0X3VzZV9wdHIoc2VuZGVyLCBzdWJzLT5zZW5kZXIucG9ydCkpID09IE5VTEwpCiAJCWdvdG8gX19lbmQ7Ci0JaWYgKChkcG9ydCA9IHNuZF9zZXFfcG9ydF91c2VfcHRyKHJlY2VpdmVyLCBzdWJzLmRlc3QucG9ydCkpID09IE5VTEwpCisJaWYgKChkcG9ydCA9IHNuZF9zZXFfcG9ydF91c2VfcHRyKHJlY2VpdmVyLCBzdWJzLT5kZXN0LnBvcnQpKSA9PSBOVUxMKQogCQlnb3RvIF9fZW5kOwogCi0JcmVzdWx0ID0gY2hlY2tfc3Vic2NyaXB0aW9uX3Blcm1pc3Npb24oY2xpZW50LCBzcG9ydCwgZHBvcnQsICZzdWJzKTsKKwlyZXN1bHQgPSBjaGVja19zdWJzY3JpcHRpb25fcGVybWlzc2lvbihjbGllbnQsIHNwb3J0LCBkcG9ydCwgc3Vicyk7CiAJaWYgKHJlc3VsdCA8IDApCiAJCWdvdG8gX19lbmQ7CiAKIAkvKiBjb25uZWN0IHRoZW0gKi8KLQlyZXN1bHQgPSBzbmRfc2VxX3BvcnRfY29ubmVjdChjbGllbnQsIHNlbmRlciwgc3BvcnQsIHJlY2VpdmVyLCBkcG9ydCwgJnN1YnMpOworCXJlc3VsdCA9IHNuZF9zZXFfcG9ydF9jb25uZWN0KGNsaWVudCwgc2VuZGVyLCBzcG9ydCwgcmVjZWl2ZXIsIGRwb3J0LCBzdWJzKTsKIAlpZiAoISByZXN1bHQpIC8qIGJyb2FkY2FzdCBhbm5vdW5jZSAqLwogCQlzbmRfc2VxX2NsaWVudF9ub3RpZnlfc3Vic2NyaXB0aW9uKFNORFJWX1NFUV9BRERSRVNTX1NVQlNDUklCRVJTLCAwLAotCQkJCQkJICAgJnN1YnMsIFNORFJWX1NFUV9FVkVOVF9QT1JUX1NVQlNDUklCRUQpOworCQkJCQkJICAgc3VicywgU05EUlZfU0VRX0VWRU5UX1BPUlRfU1VCU0NSSUJFRCk7CiAgICAgICBfX2VuZDoKICAgICAgIAlpZiAoc3BvcnQpCiAJCXNuZF9zZXFfcG9ydF91bmxvY2soc3BvcnQpOwpAQCAtMTQ5OCwzMyArMTQ2MSwzMCBAQAogICogcmVtb3ZlIGZyb20gcG9ydCdzIHN1YnNjcmlwdGlvbiBsaXN0IAogICovCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfdW5zdWJzY3JpYmVfcG9ydChzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJICB2b2lkIF9fdXNlciAqYXJnKQorCQkJCQkgIHZvaWQgKmFyZykKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZSAqc3VicyA9IGFyZzsKIAlpbnQgcmVzdWx0ID0gLUVOWElPOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudCAqcmVjZWl2ZXIgPSBOVUxMLCAqc2VuZGVyID0gTlVMTDsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqc3BvcnQgPSBOVUxMLCAqZHBvcnQgPSBOVUxMOwotCXN0cnVjdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlIHN1YnM7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJnN1YnMsIGFyZywgc2l6ZW9mKHN1YnMpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoKHJlY2VpdmVyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihzdWJzLmRlc3QuY2xpZW50KSkgPT0gTlVMTCkKKwlpZiAoKHJlY2VpdmVyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihzdWJzLT5kZXN0LmNsaWVudCkpID09IE5VTEwpCiAJCWdvdG8gX19lbmQ7Ci0JaWYgKChzZW5kZXIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKHN1YnMuc2VuZGVyLmNsaWVudCkpID09IE5VTEwpCisJaWYgKChzZW5kZXIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKHN1YnMtPnNlbmRlci5jbGllbnQpKSA9PSBOVUxMKQogCQlnb3RvIF9fZW5kOwotCWlmICgoc3BvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihzZW5kZXIsIHN1YnMuc2VuZGVyLnBvcnQpKSA9PSBOVUxMKQorCWlmICgoc3BvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihzZW5kZXIsIHN1YnMtPnNlbmRlci5wb3J0KSkgPT0gTlVMTCkKIAkJZ290byBfX2VuZDsKLQlpZiAoKGRwb3J0ID0gc25kX3NlcV9wb3J0X3VzZV9wdHIocmVjZWl2ZXIsIHN1YnMuZGVzdC5wb3J0KSkgPT0gTlVMTCkKKwlpZiAoKGRwb3J0ID0gc25kX3NlcV9wb3J0X3VzZV9wdHIocmVjZWl2ZXIsIHN1YnMtPmRlc3QucG9ydCkpID09IE5VTEwpCiAJCWdvdG8gX19lbmQ7CiAKLQlyZXN1bHQgPSBjaGVja19zdWJzY3JpcHRpb25fcGVybWlzc2lvbihjbGllbnQsIHNwb3J0LCBkcG9ydCwgJnN1YnMpOworCXJlc3VsdCA9IGNoZWNrX3N1YnNjcmlwdGlvbl9wZXJtaXNzaW9uKGNsaWVudCwgc3BvcnQsIGRwb3J0LCBzdWJzKTsKIAlpZiAocmVzdWx0IDwgMCkKIAkJZ290byBfX2VuZDsKIAotCXJlc3VsdCA9IHNuZF9zZXFfcG9ydF9kaXNjb25uZWN0KGNsaWVudCwgc2VuZGVyLCBzcG9ydCwgcmVjZWl2ZXIsIGRwb3J0LCAmc3Vicyk7CisJcmVzdWx0ID0gc25kX3NlcV9wb3J0X2Rpc2Nvbm5lY3QoY2xpZW50LCBzZW5kZXIsIHNwb3J0LCByZWNlaXZlciwgZHBvcnQsIHN1YnMpOwogCWlmICghIHJlc3VsdCkgLyogYnJvYWRjYXN0IGFubm91bmNlICovCiAJCXNuZF9zZXFfY2xpZW50X25vdGlmeV9zdWJzY3JpcHRpb24oU05EUlZfU0VRX0FERFJFU1NfU1VCU0NSSUJFUlMsIDAsCi0JCQkJCQkgICAmc3VicywgU05EUlZfU0VRX0VWRU5UX1BPUlRfVU5TVUJTQ1JJQkVEKTsKKwkJCQkJCSAgIHN1YnMsIFNORFJWX1NFUV9FVkVOVF9QT1JUX1VOU1VCU0NSSUJFRCk7CiAgICAgICBfX2VuZDoKICAgICAgIAlpZiAoc3BvcnQpCiAJCXNuZF9zZXFfcG9ydF91bmxvY2soc3BvcnQpOwpAQCAtMTUzOSwxNyArMTQ5OSwxMyBAQAogCiAKIC8qIENSRUFURV9RVUVVRSBpb2N0bCgpICovCi1zdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfY3JlYXRlX3F1ZXVlKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCSAgICAgIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfY3JlYXRlX3F1ZXVlKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHNuZF9zZXFfcXVldWVfaW5mbyBpbmZvOworCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX2luZm8gKmluZm8gPSBhcmc7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZSAqcTsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJlc3VsdCA9IHNuZF9zZXFfcXVldWVfYWxsb2MoY2xpZW50LT5udW1iZXIsIGluZm8ubG9ja2VkLCBpbmZvLmZsYWdzKTsKKwlyZXN1bHQgPSBzbmRfc2VxX3F1ZXVlX2FsbG9jKGNsaWVudC0+bnVtYmVyLCBpbmZvLT5sb2NrZWQsIGluZm8tPmZsYWdzKTsKIAlpZiAocmVzdWx0IDwgMCkKIAkJcmV0dXJuIHJlc3VsdDsKIApAQCAtMTU1NywxODEgKzE1MTMsMTUwIEBACiAJaWYgKHEgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpbmZvLnF1ZXVlID0gcS0+cXVldWU7Ci0JaW5mby5sb2NrZWQgPSBxLT5sb2NrZWQ7Ci0JaW5mby5vd25lciA9IHEtPm93bmVyOworCWluZm8tPnF1ZXVlID0gcS0+cXVldWU7CisJaW5mby0+bG9ja2VkID0gcS0+bG9ja2VkOworCWluZm8tPm93bmVyID0gcS0+b3duZXI7CiAKIAkvKiBzZXQgcXVldWUgbmFtZSAqLwotCWlmICghIGluZm8ubmFtZVswXSkKLQkJc25wcmludGYoaW5mby5uYW1lLCBzaXplb2YoaW5mby5uYW1lKSwgIlF1ZXVlLSVkIiwgcS0+cXVldWUpOwotCXN0cmxjcHkocS0+bmFtZSwgaW5mby5uYW1lLCBzaXplb2YocS0+bmFtZSkpOworCWlmICghaW5mby0+bmFtZVswXSkKKwkJc25wcmludGYoaW5mby0+bmFtZSwgc2l6ZW9mKGluZm8tPm5hbWUpLCAiUXVldWUtJWQiLCBxLT5xdWV1ZSk7CisJc3RybGNweShxLT5uYW1lLCBpbmZvLT5uYW1lLCBzaXplb2YocS0+bmFtZSkpOwogCXF1ZXVlZnJlZShxKTsKIAotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KIAlyZXR1cm4gMDsKIH0KIAogLyogREVMRVRFX1FVRVVFIGlvY3RsKCkgKi8KLXN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9kZWxldGVfcXVldWUoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJICAgICAgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9kZWxldGVfcXVldWUoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9pbmZvIGluZm87CisJc3RydWN0IHNuZF9zZXFfcXVldWVfaW5mbyAqaW5mbyA9IGFyZzsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiBzbmRfc2VxX3F1ZXVlX2RlbGV0ZShjbGllbnQtPm51bWJlciwgaW5mby5xdWV1ZSk7CisJcmV0dXJuIHNuZF9zZXFfcXVldWVfZGVsZXRlKGNsaWVudC0+bnVtYmVyLCBpbmZvLT5xdWV1ZSk7CiB9CiAKIC8qIEdFVF9RVUVVRV9JTkZPIGlvY3RsKCkgKi8KIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9nZXRfcXVldWVfaW5mbyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJdm9pZCAqYXJnKQogewotCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX2luZm8gaW5mbzsKKwlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9pbmZvICppbmZvID0gYXJnOwogCXN0cnVjdCBzbmRfc2VxX3F1ZXVlICpxOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcSA9IHF1ZXVlcHRyKGluZm8ucXVldWUpOworCXEgPSBxdWV1ZXB0cihpbmZvLT5xdWV1ZSk7CiAJaWYgKHEgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7Ci0JaW5mby5xdWV1ZSA9IHEtPnF1ZXVlOwotCWluZm8ub3duZXIgPSBxLT5vd25lcjsKLQlpbmZvLmxvY2tlZCA9IHEtPmxvY2tlZDsKLQlzdHJsY3B5KGluZm8ubmFtZSwgcS0+bmFtZSwgc2l6ZW9mKGluZm8ubmFtZSkpOworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKwlpbmZvLT5xdWV1ZSA9IHEtPnF1ZXVlOworCWluZm8tPm93bmVyID0gcS0+b3duZXI7CisJaW5mby0+bG9ja2VkID0gcS0+bG9ja2VkOworCXN0cmxjcHkoaW5mby0+bmFtZSwgcS0+bmFtZSwgc2l6ZW9mKGluZm8tPm5hbWUpKTsKIAlxdWV1ZWZyZWUocSk7CiAKLQlpZiAoY29weV90b191c2VyKGFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCiAJcmV0dXJuIDA7CiB9CiAKIC8qIFNFVF9RVUVVRV9JTkZPIGlvY3RsKCkgKi8KIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9zZXRfcXVldWVfaW5mbyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJdm9pZCAqYXJnKQogewotCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX2luZm8gaW5mbzsKKwlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9pbmZvICppbmZvID0gYXJnOwogCXN0cnVjdCBzbmRfc2VxX3F1ZXVlICpxOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGluZm8ub3duZXIgIT0gY2xpZW50LT5udW1iZXIpCisJaWYgKGluZm8tPm93bmVyICE9IGNsaWVudC0+bnVtYmVyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIGNoYW5nZSBvd25lci9sb2NrZWQgcGVybWlzc2lvbiAqLwotCWlmIChzbmRfc2VxX3F1ZXVlX2NoZWNrX2FjY2VzcyhpbmZvLnF1ZXVlLCBjbGllbnQtPm51bWJlcikpIHsKLQkJaWYgKHNuZF9zZXFfcXVldWVfc2V0X293bmVyKGluZm8ucXVldWUsIGNsaWVudC0+bnVtYmVyLCBpbmZvLmxvY2tlZCkgPCAwKQorCWlmIChzbmRfc2VxX3F1ZXVlX2NoZWNrX2FjY2VzcyhpbmZvLT5xdWV1ZSwgY2xpZW50LT5udW1iZXIpKSB7CisJCWlmIChzbmRfc2VxX3F1ZXVlX3NldF9vd25lcihpbmZvLT5xdWV1ZSwgY2xpZW50LT5udW1iZXIsIGluZm8tPmxvY2tlZCkgPCAwKQogCQkJcmV0dXJuIC1FUEVSTTsKLQkJaWYgKGluZm8ubG9ja2VkKQotCQkJc25kX3NlcV9xdWV1ZV91c2UoaW5mby5xdWV1ZSwgY2xpZW50LT5udW1iZXIsIDEpOworCQlpZiAoaW5mby0+bG9ja2VkKQorCQkJc25kX3NlcV9xdWV1ZV91c2UoaW5mby0+cXVldWUsIGNsaWVudC0+bnVtYmVyLCAxKTsKIAl9IGVsc2UgewogCQlyZXR1cm4gLUVQRVJNOwogCX0JCiAKLQlxID0gcXVldWVwdHIoaW5mby5xdWV1ZSk7CisJcSA9IHF1ZXVlcHRyKGluZm8tPnF1ZXVlKTsKIAlpZiAoISBxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAocS0+b3duZXIgIT0gY2xpZW50LT5udW1iZXIpIHsKIAkJcXVldWVmcmVlKHEpOwogCQlyZXR1cm4gLUVQRVJNOwogCX0KLQlzdHJsY3B5KHEtPm5hbWUsIGluZm8ubmFtZSwgc2l6ZW9mKHEtPm5hbWUpKTsKKwlzdHJsY3B5KHEtPm5hbWUsIGluZm8tPm5hbWUsIHNpemVvZihxLT5uYW1lKSk7CiAJcXVldWVmcmVlKHEpOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qIEdFVF9OQU1FRF9RVUVVRSBpb2N0bCgpICovCi1zdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfZ2V0X25hbWVkX3F1ZXVlKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2dldF9uYW1lZF9xdWV1ZShzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKKwkJCQkJIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9pbmZvIGluZm87CisJc3RydWN0IHNuZF9zZXFfcXVldWVfaW5mbyAqaW5mbyA9IGFyZzsKIAlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZSAqcTsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXEgPSBzbmRfc2VxX3F1ZXVlX2ZpbmRfbmFtZShpbmZvLm5hbWUpOworCXEgPSBzbmRfc2VxX3F1ZXVlX2ZpbmRfbmFtZShpbmZvLT5uYW1lKTsKIAlpZiAocSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpbmZvLnF1ZXVlID0gcS0+cXVldWU7Ci0JaW5mby5vd25lciA9IHEtPm93bmVyOwotCWluZm8ubG9ja2VkID0gcS0+bG9ja2VkOworCWluZm8tPnF1ZXVlID0gcS0+cXVldWU7CisJaW5mby0+b3duZXIgPSBxLT5vd25lcjsKKwlpbmZvLT5sb2NrZWQgPSBxLT5sb2NrZWQ7CiAJcXVldWVmcmVlKHEpOwogCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQogCXJldHVybiAwOwogfQogCiAvKiBHRVRfUVVFVUVfU1RBVFVTIGlvY3RsKCkgKi8KIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9nZXRfcXVldWVfc3RhdHVzKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQkgIHZvaWQgX191c2VyICphcmcpCisJCQkJCSAgdm9pZCAqYXJnKQogewotCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IHNuZF9zZXFfcXVldWVfc3RhdHVzICpzdGF0dXMgPSBhcmc7CiAJc3RydWN0IHNuZF9zZXFfcXVldWUgKnF1ZXVlOwogCXN0cnVjdCBzbmRfc2VxX3RpbWVyICp0bXI7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJnN0YXR1cywgYXJnLCBzaXplb2Yoc3RhdHVzKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcXVldWUgPSBxdWV1ZXB0cihzdGF0dXMucXVldWUpOworCXF1ZXVlID0gcXVldWVwdHIoc3RhdHVzLT5xdWV1ZSk7CiAJaWYgKHF1ZXVlID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwotCW1lbXNldCgmc3RhdHVzLCAwLCBzaXplb2Yoc3RhdHVzKSk7Ci0Jc3RhdHVzLnF1ZXVlID0gcXVldWUtPnF1ZXVlOworCW1lbXNldChzdGF0dXMsIDAsIHNpemVvZigqc3RhdHVzKSk7CisJc3RhdHVzLT5xdWV1ZSA9IHF1ZXVlLT5xdWV1ZTsKIAkKIAl0bXIgPSBxdWV1ZS0+dGltZXI7Ci0Jc3RhdHVzLmV2ZW50cyA9IHF1ZXVlLT50aWNrcS0+Y2VsbHMgKyBxdWV1ZS0+dGltZXEtPmNlbGxzOworCXN0YXR1cy0+ZXZlbnRzID0gcXVldWUtPnRpY2txLT5jZWxscyArIHF1ZXVlLT50aW1lcS0+Y2VsbHM7CiAKLQlzdGF0dXMudGltZSA9IHNuZF9zZXFfdGltZXJfZ2V0X2N1cl90aW1lKHRtcik7Ci0Jc3RhdHVzLnRpY2sgPSBzbmRfc2VxX3RpbWVyX2dldF9jdXJfdGljayh0bXIpOworCXN0YXR1cy0+dGltZSA9IHNuZF9zZXFfdGltZXJfZ2V0X2N1cl90aW1lKHRtcik7CisJc3RhdHVzLT50aWNrID0gc25kX3NlcV90aW1lcl9nZXRfY3VyX3RpY2sodG1yKTsKIAotCXN0YXR1cy5ydW5uaW5nID0gdG1yLT5ydW5uaW5nOworCXN0YXR1cy0+cnVubmluZyA9IHRtci0+cnVubmluZzsKIAotCXN0YXR1cy5mbGFncyA9IHF1ZXVlLT5mbGFnczsKKwlzdGF0dXMtPmZsYWdzID0gcXVldWUtPmZsYWdzOwogCXF1ZXVlZnJlZShxdWV1ZSk7CiAKLQlpZiAoY29weV90b191c2VyKGFyZywgJnN0YXR1cywgc2l6ZW9mKHN0YXR1cykpKQotCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KIAogCiAvKiBHRVRfUVVFVUVfVEVNUE8gaW9jdGwoKSAqLwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2dldF9xdWV1ZV90ZW1wbyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJIHZvaWQgX191c2VyICphcmcpCisJCQkJCSB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHNuZF9zZXFfcXVldWVfdGVtcG8gdGVtcG87CisJc3RydWN0IHNuZF9zZXFfcXVldWVfdGVtcG8gKnRlbXBvID0gYXJnOwogCXN0cnVjdCBzbmRfc2VxX3F1ZXVlICpxdWV1ZTsKIAlzdHJ1Y3Qgc25kX3NlcV90aW1lciAqdG1yOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ0ZW1wbywgYXJnLCBzaXplb2YodGVtcG8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlxdWV1ZSA9IHF1ZXVlcHRyKHRlbXBvLnF1ZXVlKTsKKwlxdWV1ZSA9IHF1ZXVlcHRyKHRlbXBvLT5xdWV1ZSk7CiAJaWYgKHF1ZXVlID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwotCW1lbXNldCgmdGVtcG8sIDAsIHNpemVvZih0ZW1wbykpOwotCXRlbXBvLnF1ZXVlID0gcXVldWUtPnF1ZXVlOworCW1lbXNldCh0ZW1wbywgMCwgc2l6ZW9mKCp0ZW1wbykpOworCXRlbXBvLT5xdWV1ZSA9IHF1ZXVlLT5xdWV1ZTsKIAkKIAl0bXIgPSBxdWV1ZS0+dGltZXI7CiAKLQl0ZW1wby50ZW1wbyA9IHRtci0+dGVtcG87Ci0JdGVtcG8ucHBxID0gdG1yLT5wcHE7Ci0JdGVtcG8uc2tld192YWx1ZSA9IHRtci0+c2tldzsKLQl0ZW1wby5za2V3X2Jhc2UgPSB0bXItPnNrZXdfYmFzZTsKKwl0ZW1wby0+dGVtcG8gPSB0bXItPnRlbXBvOworCXRlbXBvLT5wcHEgPSB0bXItPnBwcTsKKwl0ZW1wby0+c2tld192YWx1ZSA9IHRtci0+c2tldzsKKwl0ZW1wby0+c2tld19iYXNlID0gdG1yLT5za2V3X2Jhc2U7CiAJcXVldWVmcmVlKHF1ZXVlKTsKIAotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmdGVtcG8sIHNpemVvZih0ZW1wbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc0NywzMSArMTY3MiwyNSBAQAogRVhQT1JUX1NZTUJPTChzbmRfc2VxX3NldF9xdWV1ZV90ZW1wbyk7CiAKIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9zZXRfcXVldWVfdGVtcG8oc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCSB2b2lkIF9fdXNlciAqYXJnKQorCQkJCQkgdm9pZCAqYXJnKQogeworCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX3RlbXBvICp0ZW1wbyA9IGFyZzsKIAlpbnQgcmVzdWx0OwotCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX3RlbXBvIHRlbXBvOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ0ZW1wbywgYXJnLCBzaXplb2YodGVtcG8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXN1bHQgPSBzbmRfc2VxX3NldF9xdWV1ZV90ZW1wbyhjbGllbnQtPm51bWJlciwgJnRlbXBvKTsKKwlyZXN1bHQgPSBzbmRfc2VxX3NldF9xdWV1ZV90ZW1wbyhjbGllbnQtPm51bWJlciwgdGVtcG8pOwogCXJldHVybiByZXN1bHQgPCAwID8gcmVzdWx0IDogMDsKIH0KIAogCiAvKiBHRVRfUVVFVUVfVElNRVIgaW9jdGwoKSAqLwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2dldF9xdWV1ZV90aW1lcihzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJIHZvaWQgX191c2VyICphcmcpCisJCQkJCSB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHNuZF9zZXFfcXVldWVfdGltZXIgdGltZXI7CisJc3RydWN0IHNuZF9zZXFfcXVldWVfdGltZXIgKnRpbWVyID0gYXJnOwogCXN0cnVjdCBzbmRfc2VxX3F1ZXVlICpxdWV1ZTsKIAlzdHJ1Y3Qgc25kX3NlcV90aW1lciAqdG1yOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ0aW1lciwgYXJnLCBzaXplb2YodGltZXIpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlxdWV1ZSA9IHF1ZXVlcHRyKHRpbWVyLnF1ZXVlKTsKKwlxdWV1ZSA9IHF1ZXVlcHRyKHRpbWVyLT5xdWV1ZSk7CiAJaWYgKHF1ZXVlID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xNzgwLDQxICsxNjk5LDM2IEBACiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAJfQogCXRtciA9IHF1ZXVlLT50aW1lcjsKLQltZW1zZXQoJnRpbWVyLCAwLCBzaXplb2YodGltZXIpKTsKLQl0aW1lci5xdWV1ZSA9IHF1ZXVlLT5xdWV1ZTsKKwltZW1zZXQodGltZXIsIDAsIHNpemVvZigqdGltZXIpKTsKKwl0aW1lci0+cXVldWUgPSBxdWV1ZS0+cXVldWU7CiAKLQl0aW1lci50eXBlID0gdG1yLT50eXBlOworCXRpbWVyLT50eXBlID0gdG1yLT50eXBlOwogCWlmICh0bXItPnR5cGUgPT0gU05EUlZfU0VRX1RJTUVSX0FMU0EpIHsKLQkJdGltZXIudS5hbHNhLmlkID0gdG1yLT5hbHNhX2lkOwotCQl0aW1lci51LmFsc2EucmVzb2x1dGlvbiA9IHRtci0+cHJlZmVycmVkX3Jlc29sdXRpb247CisJCXRpbWVyLT51LmFsc2EuaWQgPSB0bXItPmFsc2FfaWQ7CisJCXRpbWVyLT51LmFsc2EucmVzb2x1dGlvbiA9IHRtci0+cHJlZmVycmVkX3Jlc29sdXRpb247CiAJfQogCW11dGV4X3VubG9jaygmcXVldWUtPnRpbWVyX211dGV4KTsKIAlxdWV1ZWZyZWUocXVldWUpOwogCQotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmdGltZXIsIHNpemVvZih0aW1lcikpKQotCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KIAogCiAvKiBTRVRfUVVFVUVfVElNRVIgaW9jdGwoKSAqLwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3NldF9xdWV1ZV90aW1lcihzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJIHZvaWQgX191c2VyICphcmcpCisJCQkJCSB2b2lkICphcmcpCiB7CisJc3RydWN0IHNuZF9zZXFfcXVldWVfdGltZXIgKnRpbWVyID0gYXJnOwogCWludCByZXN1bHQgPSAwOwotCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX3RpbWVyIHRpbWVyOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ0aW1lciwgYXJnLCBzaXplb2YodGltZXIpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAodGltZXIudHlwZSAhPSBTTkRSVl9TRVFfVElNRVJfQUxTQSkKKwlpZiAodGltZXItPnR5cGUgIT0gU05EUlZfU0VRX1RJTUVSX0FMU0EpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHNuZF9zZXFfcXVldWVfY2hlY2tfYWNjZXNzKHRpbWVyLnF1ZXVlLCBjbGllbnQtPm51bWJlcikpIHsKKwlpZiAoc25kX3NlcV9xdWV1ZV9jaGVja19hY2Nlc3ModGltZXItPnF1ZXVlLCBjbGllbnQtPm51bWJlcikpIHsKIAkJc3RydWN0IHNuZF9zZXFfcXVldWUgKnE7CiAJCXN0cnVjdCBzbmRfc2VxX3RpbWVyICp0bXI7CiAKLQkJcSA9IHF1ZXVlcHRyKHRpbWVyLnF1ZXVlKTsKKwkJcSA9IHF1ZXVlcHRyKHRpbWVyLT5xdWV1ZSk7CiAJCWlmIChxID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOWElPOwogCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZxLT50aW1lcl9tdXRleCkpIHsKQEAgLTE4MjIsMTMgKzE3MzYsMTMgQEAKIAkJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAJCX0KIAkJdG1yID0gcS0+dGltZXI7Ci0JCXNuZF9zZXFfcXVldWVfdGltZXJfY2xvc2UodGltZXIucXVldWUpOwotCQl0bXItPnR5cGUgPSB0aW1lci50eXBlOworCQlzbmRfc2VxX3F1ZXVlX3RpbWVyX2Nsb3NlKHRpbWVyLT5xdWV1ZSk7CisJCXRtci0+dHlwZSA9IHRpbWVyLT50eXBlOwogCQlpZiAodG1yLT50eXBlID09IFNORFJWX1NFUV9USU1FUl9BTFNBKSB7Ci0JCQl0bXItPmFsc2FfaWQgPSB0aW1lci51LmFsc2EuaWQ7Ci0JCQl0bXItPnByZWZlcnJlZF9yZXNvbHV0aW9uID0gdGltZXIudS5hbHNhLnJlc29sdXRpb247CisJCQl0bXItPmFsc2FfaWQgPSB0aW1lci0+dS5hbHNhLmlkOworCQkJdG1yLT5wcmVmZXJyZWRfcmVzb2x1dGlvbiA9IHRpbWVyLT51LmFsc2EucmVzb2x1dGlvbjsKIAkJfQotCQlyZXN1bHQgPSBzbmRfc2VxX3F1ZXVlX3RpbWVyX29wZW4odGltZXIucXVldWUpOworCQlyZXN1bHQgPSBzbmRfc2VxX3F1ZXVlX3RpbWVyX29wZW4odGltZXItPnF1ZXVlKTsKIAkJbXV0ZXhfdW5sb2NrKCZxLT50aW1lcl9tdXRleCk7CiAJCXF1ZXVlZnJlZShxKTsKIAl9IGVsc2UgewpAQCAtMTg0MSwzOCArMTc1NSwzMCBAQAogCiAvKiBHRVRfUVVFVUVfQ0xJRU5UIGlvY3RsKCkgKi8KIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9nZXRfcXVldWVfY2xpZW50KHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQkgIHZvaWQgX191c2VyICphcmcpCisJCQkJCSAgdm9pZCAqYXJnKQogewotCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX2NsaWVudCBpbmZvOworCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX2NsaWVudCAqaW5mbyA9IGFyZzsKIAlpbnQgdXNlZDsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXVzZWQgPSBzbmRfc2VxX3F1ZXVlX2lzX3VzZWQoaW5mby5xdWV1ZSwgY2xpZW50LT5udW1iZXIpOworCXVzZWQgPSBzbmRfc2VxX3F1ZXVlX2lzX3VzZWQoaW5mby0+cXVldWUsIGNsaWVudC0+bnVtYmVyKTsKIAlpZiAodXNlZCA8IDApCiAJCXJldHVybiAtRUlOVkFMOwotCWluZm8udXNlZCA9IHVzZWQ7Ci0JaW5mby5jbGllbnQgPSBjbGllbnQtPm51bWJlcjsKKwlpbmZvLT51c2VkID0gdXNlZDsKKwlpbmZvLT5jbGllbnQgPSBjbGllbnQtPm51bWJlcjsKIAotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CiAKIAogLyogU0VUX1FVRVVFX0NMSUVOVCBpb2N0bCgpICovCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfc2V0X3F1ZXVlX2NsaWVudChzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJICB2b2lkIF9fdXNlciAqYXJnKQorCQkJCQkgIHZvaWQgKmFyZykKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9jbGllbnQgKmluZm8gPSBhcmc7CiAJaW50IGVycjsKLQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9jbGllbnQgaW5mbzsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChpbmZvLnVzZWQgPj0gMCkgewotCQllcnIgPSBzbmRfc2VxX3F1ZXVlX3VzZShpbmZvLnF1ZXVlLCBjbGllbnQtPm51bWJlciwgaW5mby51c2VkKTsKKwlpZiAoaW5mby0+dXNlZCA+PSAwKSB7CisJCWVyciA9IHNuZF9zZXFfcXVldWVfdXNlKGluZm8tPnF1ZXVlLCBjbGllbnQtPm51bWJlciwgaW5mby0+dXNlZCk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9CkBAIC0xODgzLDc4ICsxNzg5LDcwIEBACiAKIC8qIEdFVF9DTElFTlRfUE9PTCBpb2N0bCgpICovCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfZ2V0X2NsaWVudF9wb29sKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQkgdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9vbCBpbmZvOworCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb29sICppbmZvID0gYXJnOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY3B0cjsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWNwdHIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKGluZm8uY2xpZW50KTsKKwljcHRyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihpbmZvLT5jbGllbnQpOwogCWlmIChjcHRyID09IE5VTEwpCiAJCXJldHVybiAtRU5PRU5UOwotCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKLQlpbmZvLmNsaWVudCA9IGNwdHItPm51bWJlcjsKLQlpbmZvLm91dHB1dF9wb29sID0gY3B0ci0+cG9vbC0+c2l6ZTsKLQlpbmZvLm91dHB1dF9yb29tID0gY3B0ci0+cG9vbC0+cm9vbTsKLQlpbmZvLm91dHB1dF9mcmVlID0gaW5mby5vdXRwdXRfcG9vbDsKLQlpbmZvLm91dHB1dF9mcmVlID0gc25kX3NlcV91bnVzZWRfY2VsbHMoY3B0ci0+cG9vbCk7CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCWluZm8tPmNsaWVudCA9IGNwdHItPm51bWJlcjsKKwlpbmZvLT5vdXRwdXRfcG9vbCA9IGNwdHItPnBvb2wtPnNpemU7CisJaW5mby0+b3V0cHV0X3Jvb20gPSBjcHRyLT5wb29sLT5yb29tOworCWluZm8tPm91dHB1dF9mcmVlID0gaW5mby0+b3V0cHV0X3Bvb2w7CisJaW5mby0+b3V0cHV0X2ZyZWUgPSBzbmRfc2VxX3VudXNlZF9jZWxscyhjcHRyLT5wb29sKTsKIAlpZiAoY3B0ci0+dHlwZSA9PSBVU0VSX0NMSUVOVCkgewotCQlpbmZvLmlucHV0X3Bvb2wgPSBjcHRyLT5kYXRhLnVzZXIuZmlmb19wb29sX3NpemU7Ci0JCWluZm8uaW5wdXRfZnJlZSA9IGluZm8uaW5wdXRfcG9vbDsKKwkJaW5mby0+aW5wdXRfcG9vbCA9IGNwdHItPmRhdGEudXNlci5maWZvX3Bvb2xfc2l6ZTsKKwkJaW5mby0+aW5wdXRfZnJlZSA9IGluZm8tPmlucHV0X3Bvb2w7CiAJCWlmIChjcHRyLT5kYXRhLnVzZXIuZmlmbykKLQkJCWluZm8uaW5wdXRfZnJlZSA9IHNuZF9zZXFfdW51c2VkX2NlbGxzKGNwdHItPmRhdGEudXNlci5maWZvLT5wb29sKTsKKwkJCWluZm8tPmlucHV0X2ZyZWUgPSBzbmRfc2VxX3VudXNlZF9jZWxscyhjcHRyLT5kYXRhLnVzZXIuZmlmby0+cG9vbCk7CiAJfSBlbHNlIHsKLQkJaW5mby5pbnB1dF9wb29sID0gMDsKLQkJaW5mby5pbnB1dF9mcmVlID0gMDsKKwkJaW5mby0+aW5wdXRfcG9vbCA9IDA7CisJCWluZm8tPmlucHV0X2ZyZWUgPSAwOwogCX0KIAlzbmRfc2VxX2NsaWVudF91bmxvY2soY3B0cik7CiAJCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KIAogLyogU0VUX0NMSUVOVF9QT09MIGlvY3RsKCkgKi8KIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9zZXRfY2xpZW50X3Bvb2woc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCSB2b2lkIF9fdXNlciAqYXJnKQorCQkJCQkgdm9pZCAqYXJnKQogewotCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb29sIGluZm87CisJc3RydWN0IHNuZF9zZXFfY2xpZW50X3Bvb2wgKmluZm8gPSBhcmc7CiAJaW50IHJjOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGNsaWVudC0+bnVtYmVyICE9IGluZm8uY2xpZW50KQorCWlmIChjbGllbnQtPm51bWJlciAhPSBpbmZvLT5jbGllbnQpCiAJCXJldHVybiAtRUlOVkFMOyAvKiBjYW4ndCBjaGFuZ2Ugb3RoZXIgY2xpZW50cyAqLwogCi0JaWYgKGluZm8ub3V0cHV0X3Bvb2wgPj0gMSAmJiBpbmZvLm91dHB1dF9wb29sIDw9IFNORFJWX1NFUV9NQVhfRVZFTlRTICYmCisJaWYgKGluZm8tPm91dHB1dF9wb29sID49IDEgJiYgaW5mby0+b3V0cHV0X3Bvb2wgPD0gU05EUlZfU0VRX01BWF9FVkVOVFMgJiYKIAkgICAgKCEgc25kX3NlcV93cml0ZV9wb29sX2FsbG9jYXRlZChjbGllbnQpIHx8Ci0JICAgICBpbmZvLm91dHB1dF9wb29sICE9IGNsaWVudC0+cG9vbC0+c2l6ZSkpIHsKKwkgICAgIGluZm8tPm91dHB1dF9wb29sICE9IGNsaWVudC0+cG9vbC0+c2l6ZSkpIHsKIAkJaWYgKHNuZF9zZXFfd3JpdGVfcG9vbF9hbGxvY2F0ZWQoY2xpZW50KSkgewogCQkJLyogcmVtb3ZlIGFsbCBleGlzdGluZyBjZWxscyAqLwogCQkJc25kX3NlcV9xdWV1ZV9jbGllbnRfbGVhdmVfY2VsbHMoY2xpZW50LT5udW1iZXIpOwogCQkJc25kX3NlcV9wb29sX2RvbmUoY2xpZW50LT5wb29sKTsKIAkJfQotCQljbGllbnQtPnBvb2wtPnNpemUgPSBpbmZvLm91dHB1dF9wb29sOworCQljbGllbnQtPnBvb2wtPnNpemUgPSBpbmZvLT5vdXRwdXRfcG9vbDsKIAkJcmMgPSBzbmRfc2VxX3Bvb2xfaW5pdChjbGllbnQtPnBvb2wpOwogCQlpZiAocmMgPCAwKQogCQkJcmV0dXJuIHJjOwogCX0KIAlpZiAoY2xpZW50LT50eXBlID09IFVTRVJfQ0xJRU5UICYmIGNsaWVudC0+ZGF0YS51c2VyLmZpZm8gIT0gTlVMTCAmJgotCSAgICBpbmZvLmlucHV0X3Bvb2wgPj0gMSAmJgotCSAgICBpbmZvLmlucHV0X3Bvb2wgPD0gU05EUlZfU0VRX01BWF9DTElFTlRfRVZFTlRTICYmCi0JICAgIGluZm8uaW5wdXRfcG9vbCAhPSBjbGllbnQtPmRhdGEudXNlci5maWZvX3Bvb2xfc2l6ZSkgeworCSAgICBpbmZvLT5pbnB1dF9wb29sID49IDEgJiYKKwkgICAgaW5mby0+aW5wdXRfcG9vbCA8PSBTTkRSVl9TRVFfTUFYX0NMSUVOVF9FVkVOVFMgJiYKKwkgICAgaW5mby0+aW5wdXRfcG9vbCAhPSBjbGllbnQtPmRhdGEudXNlci5maWZvX3Bvb2xfc2l6ZSkgewogCQkvKiBjaGFuZ2UgcG9vbCBzaXplICovCi0JCXJjID0gc25kX3NlcV9maWZvX3Jlc2l6ZShjbGllbnQtPmRhdGEudXNlci5maWZvLCBpbmZvLmlucHV0X3Bvb2wpOworCQlyYyA9IHNuZF9zZXFfZmlmb19yZXNpemUoY2xpZW50LT5kYXRhLnVzZXIuZmlmbywgaW5mby0+aW5wdXRfcG9vbCk7CiAJCWlmIChyYyA8IDApCiAJCQlyZXR1cm4gcmM7Ci0JCWNsaWVudC0+ZGF0YS51c2VyLmZpZm9fcG9vbF9zaXplID0gaW5mby5pbnB1dF9wb29sOworCQljbGllbnQtPmRhdGEudXNlci5maWZvX3Bvb2xfc2l6ZSA9IGluZm8tPmlucHV0X3Bvb2w7CiAJfQotCWlmIChpbmZvLm91dHB1dF9yb29tID49IDEgJiYKLQkgICAgaW5mby5vdXRwdXRfcm9vbSA8PSBjbGllbnQtPnBvb2wtPnNpemUpIHsKLQkJY2xpZW50LT5wb29sLT5yb29tICA9IGluZm8ub3V0cHV0X3Jvb207CisJaWYgKGluZm8tPm91dHB1dF9yb29tID49IDEgJiYKKwkgICAgaW5mby0+b3V0cHV0X3Jvb20gPD0gY2xpZW50LT5wb29sLT5zaXplKSB7CisJCWNsaWVudC0+cG9vbC0+cm9vbSAgPSBpbmZvLT5vdXRwdXRfcm9vbTsKIAl9CiAKIAlyZXR1cm4gc25kX3NlcV9pb2N0bF9nZXRfY2xpZW50X3Bvb2woY2xpZW50LCBhcmcpOwpAQCAtMTk2MywxNyArMTg2MSwxNCBAQAogCiAvKiBSRU1PVkVfRVZFTlRTIGlvY3RsKCkgKi8KIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9yZW1vdmVfZXZlbnRzKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCSAgICAgICB2b2lkIF9fdXNlciAqYXJnKQorCQkJCSAgICAgICB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHNuZF9zZXFfcmVtb3ZlX2V2ZW50cyBpbmZvOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOworCXN0cnVjdCBzbmRfc2VxX3JlbW92ZV9ldmVudHMgKmluZm8gPSBhcmc7CiAKIAkvKgogCSAqIElucHV0IG1vc3RseSBub3QgaW1wbGVtZW50ZWQgWFhYLgogCSAqLwotCWlmIChpbmZvLnJlbW92ZV9tb2RlICYgU05EUlZfU0VRX1JFTU9WRV9JTlBVVCkgeworCWlmIChpbmZvLT5yZW1vdmVfbW9kZSAmIFNORFJWX1NFUV9SRU1PVkVfSU5QVVQpIHsKIAkJLyoKIAkJICogTm8gcmVzdHJpY3Rpb25zIHNvIGZvciBhIHVzZXIgY2xpZW50IHdlIGNhbiBjbGVhcgogCQkgKiB0aGUgd2hvbGUgZmlmbwpAQCAtMTk4Miw4ICsxODc3LDggQEAKIAkJCXNuZF9zZXFfZmlmb19jbGVhcihjbGllbnQtPmRhdGEudXNlci5maWZvKTsKIAl9CiAKLQlpZiAoaW5mby5yZW1vdmVfbW9kZSAmIFNORFJWX1NFUV9SRU1PVkVfT1VUUFVUKQotCQlzbmRfc2VxX3F1ZXVlX3JlbW92ZV9jZWxscyhjbGllbnQtPm51bWJlciwgJmluZm8pOworCWlmIChpbmZvLT5yZW1vdmVfbW9kZSAmIFNORFJWX1NFUV9SRU1PVkVfT1VUUFVUKQorCQlzbmRfc2VxX3F1ZXVlX3JlbW92ZV9jZWxscyhjbGllbnQtPm51bWJlciwgaW5mbyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5OTMsMjYgKzE4ODgsMjMgQEAKICAqIGdldCBzdWJzY3JpcHRpb24gaW5mbwogICovCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfZ2V0X3N1YnNjcmlwdGlvbihzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJICB2b2lkIF9fdXNlciAqYXJnKQorCQkJCQkgIHZvaWQgKmFyZykKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZSAqc3VicyA9IGFyZzsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudCAqc2VuZGVyID0gTlVMTDsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqc3BvcnQgPSBOVUxMOwotCXN0cnVjdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlIHN1YnM7CiAJc3RydWN0IHNuZF9zZXFfc3Vic2NyaWJlcnMgKnA7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJnN1YnMsIGFyZywgc2l6ZW9mKHN1YnMpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KIAlyZXN1bHQgPSAtRUlOVkFMOwotCWlmICgoc2VuZGVyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihzdWJzLnNlbmRlci5jbGllbnQpKSA9PSBOVUxMKQorCWlmICgoc2VuZGVyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihzdWJzLT5zZW5kZXIuY2xpZW50KSkgPT0gTlVMTCkKIAkJZ290byBfX2VuZDsKLQlpZiAoKHNwb3J0ID0gc25kX3NlcV9wb3J0X3VzZV9wdHIoc2VuZGVyLCBzdWJzLnNlbmRlci5wb3J0KSkgPT0gTlVMTCkKKwlpZiAoKHNwb3J0ID0gc25kX3NlcV9wb3J0X3VzZV9wdHIoc2VuZGVyLCBzdWJzLT5zZW5kZXIucG9ydCkpID09IE5VTEwpCiAJCWdvdG8gX19lbmQ7Ci0JcCA9IHNuZF9zZXFfcG9ydF9nZXRfc3Vic2NyaXB0aW9uKCZzcG9ydC0+Y19zcmMsICZzdWJzLmRlc3QpOworCXAgPSBzbmRfc2VxX3BvcnRfZ2V0X3N1YnNjcmlwdGlvbigmc3BvcnQtPmNfc3JjLCAmc3Vicy0+ZGVzdCk7CiAJaWYgKHApIHsKIAkJcmVzdWx0ID0gMDsKLQkJc3VicyA9IHAtPmluZm87CisJCSpzdWJzID0gcC0+aW5mbzsKIAl9IGVsc2UKIAkJcmVzdWx0ID0gLUVOT0VOVDsKIApAQCAtMjAyMSwxMCArMTkxMyw3IEBACiAJCXNuZF9zZXFfcG9ydF91bmxvY2soc3BvcnQpOwogCWlmIChzZW5kZXIpCiAJCXNuZF9zZXFfY2xpZW50X3VubG9jayhzZW5kZXIpOwotCWlmIChyZXN1bHQgPj0gMCkgewotCQlpZiAoY29weV90b191c2VyKGFyZywgJnN1YnMsIHNpemVvZihzdWJzKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0yMDMyLDI2ICsxOTIxLDIyIEBACiAvKgogICogZ2V0IHN1YnNjcmlwdGlvbiBpbmZvIC0gY2hlY2sgb25seSBpdHMgcHJlc2VuY2UKICAqLwotc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3F1ZXJ5X3N1YnMoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJICAgIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfcXVlcnlfc3VicyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgdm9pZCAqYXJnKQogeworCXN0cnVjdCBzbmRfc2VxX3F1ZXJ5X3N1YnMgKnN1YnMgPSBhcmc7CiAJaW50IHJlc3VsdCA9IC1FTlhJTzsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNwdHIgPSBOVUxMOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0ICpwb3J0ID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX3NlcV9xdWVyeV9zdWJzIHN1YnM7CiAJc3RydWN0IHNuZF9zZXFfcG9ydF9zdWJzX2luZm8gKmdyb3VwOwogCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAJaW50IGk7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJnN1YnMsIGFyZywgc2l6ZW9mKHN1YnMpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoKGNwdHIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKHN1YnMucm9vdC5jbGllbnQpKSA9PSBOVUxMKQorCWlmICgoY3B0ciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoc3Vicy0+cm9vdC5jbGllbnQpKSA9PSBOVUxMKQogCQlnb3RvIF9fZW5kOwotCWlmICgocG9ydCA9IHNuZF9zZXFfcG9ydF91c2VfcHRyKGNwdHIsIHN1YnMucm9vdC5wb3J0KSkgPT0gTlVMTCkKKwlpZiAoKHBvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihjcHRyLCBzdWJzLT5yb290LnBvcnQpKSA9PSBOVUxMKQogCQlnb3RvIF9fZW5kOwogCi0Jc3dpdGNoIChzdWJzLnR5cGUpIHsKKwlzd2l0Y2ggKHN1YnMtPnR5cGUpIHsKIAljYXNlIFNORFJWX1NFUV9RVUVSWV9TVUJTX1JFQUQ6CiAJCWdyb3VwID0gJnBvcnQtPmNfc3JjOwogCQlicmVhazsKQEAgLTIwNjQsMjIgKzE5NDksMjIgQEAKIAogCWRvd25fcmVhZCgmZ3JvdXAtPmxpc3RfbXV0ZXgpOwogCS8qIHNlYXJjaCBmb3IgdGhlIHN1YnNjcmliZXIgKi8KLQlzdWJzLm51bV9zdWJzID0gZ3JvdXAtPmNvdW50OworCXN1YnMtPm51bV9zdWJzID0gZ3JvdXAtPmNvdW50OwogCWkgPSAwOwogCXJlc3VsdCA9IC1FTk9FTlQ7CiAJbGlzdF9mb3JfZWFjaChwLCAmZ3JvdXAtPmxpc3RfaGVhZCkgewotCQlpZiAoaSsrID09IHN1YnMuaW5kZXgpIHsKKwkJaWYgKGkrKyA9PSBzdWJzLT5pbmRleCkgewogCQkJLyogZm91bmQhICovCiAJCQlzdHJ1Y3Qgc25kX3NlcV9zdWJzY3JpYmVycyAqczsKLQkJCWlmIChzdWJzLnR5cGUgPT0gU05EUlZfU0VRX1FVRVJZX1NVQlNfUkVBRCkgeworCQkJaWYgKHN1YnMtPnR5cGUgPT0gU05EUlZfU0VRX1FVRVJZX1NVQlNfUkVBRCkgewogCQkJCXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfc2VxX3N1YnNjcmliZXJzLCBzcmNfbGlzdCk7Ci0JCQkJc3Vicy5hZGRyID0gcy0+aW5mby5kZXN0OworCQkJCXN1YnMtPmFkZHIgPSBzLT5pbmZvLmRlc3Q7CiAJCQl9IGVsc2UgewogCQkJCXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfc2VxX3N1YnNjcmliZXJzLCBkZXN0X2xpc3QpOwotCQkJCXN1YnMuYWRkciA9IHMtPmluZm8uc2VuZGVyOworCQkJCXN1YnMtPmFkZHIgPSBzLT5pbmZvLnNlbmRlcjsKIAkJCX0KLQkJCXN1YnMuZmxhZ3MgPSBzLT5pbmZvLmZsYWdzOwotCQkJc3Vicy5xdWV1ZSA9IHMtPmluZm8ucXVldWU7CisJCQlzdWJzLT5mbGFncyA9IHMtPmluZm8uZmxhZ3M7CisJCQlzdWJzLT5xdWV1ZSA9IHMtPmluZm8ucXVldWU7CiAJCQlyZXN1bHQgPSAwOwogCQkJYnJlYWs7CiAJCX0KQEAgLTIwOTEsMTAgKzE5NzYsNyBAQAogCQlzbmRfc2VxX3BvcnRfdW5sb2NrKHBvcnQpOwogCWlmIChjcHRyKQogCQlzbmRfc2VxX2NsaWVudF91bmxvY2soY3B0cik7Ci0JaWYgKHJlc3VsdCA+PSAwKSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmc3Vicywgc2l6ZW9mKHN1YnMpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KKwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTIxMDMsMzEgKzE5ODUsMjYgQEAKICAqIHF1ZXJ5IG5leHQgY2xpZW50CiAgKi8KIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9xdWVyeV9uZXh0X2NsaWVudChzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJICAgdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJICAgdm9pZCAqYXJnKQogeworCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9pbmZvICppbmZvID0gYXJnOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY3B0ciA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9zZXFfY2xpZW50X2luZm8gaW5mbzsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKIAogCS8qIHNlYXJjaCBmb3IgbmV4dCBjbGllbnQgKi8KLQlpbmZvLmNsaWVudCsrOwotCWlmIChpbmZvLmNsaWVudCA8IDApCi0JCWluZm8uY2xpZW50ID0gMDsKLQlmb3IgKDsgaW5mby5jbGllbnQgPCBTTkRSVl9TRVFfTUFYX0NMSUVOVFM7IGluZm8uY2xpZW50KyspIHsKLQkJY3B0ciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoaW5mby5jbGllbnQpOworCWluZm8tPmNsaWVudCsrOworCWlmIChpbmZvLT5jbGllbnQgPCAwKQorCQlpbmZvLT5jbGllbnQgPSAwOworCWZvciAoOyBpbmZvLT5jbGllbnQgPCBTTkRSVl9TRVFfTUFYX0NMSUVOVFM7IGluZm8tPmNsaWVudCsrKSB7CisJCWNwdHIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKGluZm8tPmNsaWVudCk7CiAJCWlmIChjcHRyKQogCQkJYnJlYWs7IC8qIGZvdW5kICovCiAJfQogCWlmIChjcHRyID09IE5VTEwpCiAJCXJldHVybiAtRU5PRU5UOwogCi0JZ2V0X2NsaWVudF9pbmZvKGNwdHIsICZpbmZvKTsKKwlnZXRfY2xpZW50X2luZm8oY3B0ciwgaW5mbyk7CiAJc25kX3NlcV9jbGllbnRfdW5sb2NrKGNwdHIpOwogCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjEzNSw0MyArMjAxMiw0MSBAQAogICogcXVlcnkgbmV4dCBwb3J0CiAgKi8KIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9xdWVyeV9uZXh0X3BvcnQoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCSB2b2lkIF9fdXNlciAqYXJnKQorCQkJCQkgdm9pZCAqYXJnKQogeworCXN0cnVjdCBzbmRfc2VxX3BvcnRfaW5mbyAqaW5mbyA9IGFyZzsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNwdHI7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKnBvcnQgPSBOVUxMOwotCXN0cnVjdCBzbmRfc2VxX3BvcnRfaW5mbyBpbmZvOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWNwdHIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKGluZm8uYWRkci5jbGllbnQpOworCWNwdHIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKGluZm8tPmFkZHIuY2xpZW50KTsKIAlpZiAoY3B0ciA9PSBOVUxMKQogCQlyZXR1cm4gLUVOWElPOwogCiAJLyogc2VhcmNoIGZvciBuZXh0IHBvcnQgKi8KLQlpbmZvLmFkZHIucG9ydCsrOwotCXBvcnQgPSBzbmRfc2VxX3BvcnRfcXVlcnlfbmVhcmVzdChjcHRyLCAmaW5mbyk7CisJaW5mby0+YWRkci5wb3J0Kys7CisJcG9ydCA9IHNuZF9zZXFfcG9ydF9xdWVyeV9uZWFyZXN0KGNwdHIsIGluZm8pOwogCWlmIChwb3J0ID09IE5VTEwpIHsKIAkJc25kX3NlcV9jbGllbnRfdW5sb2NrKGNwdHIpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKIAkvKiBnZXQgcG9ydCBpbmZvICovCi0JaW5mby5hZGRyID0gcG9ydC0+YWRkcjsKLQlzbmRfc2VxX2dldF9wb3J0X2luZm8ocG9ydCwgJmluZm8pOworCWluZm8tPmFkZHIgPSBwb3J0LT5hZGRyOworCXNuZF9zZXFfZ2V0X3BvcnRfaW5mbyhwb3J0LCBpbmZvKTsKIAlzbmRfc2VxX3BvcnRfdW5sb2NrKHBvcnQpOwogCXNuZF9zZXFfY2xpZW50X3VubG9jayhjcHRyKTsKIAotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBzdHJ1Y3Qgc2VxX2lvY3RsX3RhYmxlIHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW9jdGxfaGFuZGxlciB7CiAJdW5zaWduZWQgaW50IGNtZDsKLQlpbnQgKCpmdW5jKShzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgdm9pZCBfX3VzZXIgKiBhcmcpOwotfSBpb2N0bF90YWJsZXNbXSA9IHsKKwlpbnQgKCpmdW5jKShzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgdm9pZCAqYXJnKTsKK30gaW9jdGxfaGFuZGxlcnNbXSA9IHsKKwl7IFNORFJWX1NFUV9JT0NUTF9QVkVSU0lPTiwgc25kX3NlcV9pb2N0bF9wdmVyc2lvbiB9LAorCXsgU05EUlZfU0VRX0lPQ1RMX0NMSUVOVF9JRCwgc25kX3NlcV9pb2N0bF9jbGllbnRfaWQgfSwKIAl7IFNORFJWX1NFUV9JT0NUTF9TWVNURU1fSU5GTywgc25kX3NlcV9pb2N0bF9zeXN0ZW1faW5mbyB9LAogCXsgU05EUlZfU0VRX0lPQ1RMX1JVTk5JTkdfTU9ERSwgc25kX3NlcV9pb2N0bF9ydW5uaW5nX21vZGUgfSwKIAl7IFNORFJWX1NFUV9JT0NUTF9HRVRfQ0xJRU5UX0lORk8sIHNuZF9zZXFfaW9jdGxfZ2V0X2NsaWVudF9pbmZvIH0sCkBAIC0yMjA0LDQwICsyMDc5LDY1IEBACiAJeyAwLCBOVUxMIH0sCiB9OwogCi1zdGF0aWMgaW50IHNuZF9zZXFfZG9faW9jdGwoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkgICAgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlzdHJ1Y3Qgc2VxX2lvY3RsX3RhYmxlICpwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1NFUV9JT0NUTF9QVkVSU0lPTjoKLQkJLyogcmV0dXJuIHNlcXVlbmNlciB2ZXJzaW9uIG51bWJlciAqLwotCQlyZXR1cm4gcHV0X3VzZXIoU05EUlZfU0VRX1ZFUlNJT04sIChpbnQgX191c2VyICopYXJnKSA/IC1FRkFVTFQgOiAwOwotCWNhc2UgU05EUlZfU0VRX0lPQ1RMX0NMSUVOVF9JRDoKLQkJLyogcmV0dXJuIHRoZSBpZCBvZiB0aGlzIGNsaWVudCAqLwotCQlyZXR1cm4gcHV0X3VzZXIoY2xpZW50LT5udW1iZXIsIChpbnQgX191c2VyICopYXJnKSA/IC1FRkFVTFQgOiAwOwotCX0KLQotCWlmICghIGFyZykKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JZm9yIChwID0gaW9jdGxfdGFibGVzOyBwLT5jbWQ7IHArKykgewotCQlpZiAocC0+Y21kID09IGNtZCkKLQkJCXJldHVybiBwLT5mdW5jKGNsaWVudCwgYXJnKTsKLQl9Ci0JcHJfZGVidWcoIkFMU0E6IHNlcSB1bmtub3duIGlvY3RsKCkgMHgleCAodHlwZT0nJWMnLCBudW1iZXI9MHglMDJ4KVxuIiwKLQkJICAgY21kLCBfSU9DX1RZUEUoY21kKSwgX0lPQ19OUihjbWQpKTsKLQlyZXR1cm4gLUVOT1RUWTsKLX0KLQotCi1zdGF0aWMgbG9uZyBzbmRfc2VxX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBsb25nIHNuZF9zZXFfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCS8qIFRvIHVzZSBrZXJuZWwgc3RhY2sgZm9yIGlvY3RsIGRhdGEuICovCisJdW5pb24geworCQlpbnQgcHZlcnNpb247CisJCWludCBjbGllbnRfaWQ7CisJCXN0cnVjdCBzbmRfc2VxX3N5c3RlbV9pbmZvCXN5c3RlbV9pbmZvOworCQlzdHJ1Y3Qgc25kX3NlcV9ydW5uaW5nX2luZm8JcnVubmluZ19pbmZvOworCQlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfaW5mbwljbGllbnRfaW5mbzsKKwkJc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvCXBvcnRfaW5mbzsKKwkJc3RydWN0IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmUJcG9ydF9zdWJzY3JpYmU7CisJCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX2luZm8JcXVldWVfaW5mbzsKKwkJc3RydWN0IHNuZF9zZXFfcXVldWVfc3RhdHVzCXF1ZXVlX3N0YXR1czsKKwkJc3RydWN0IHNuZF9zZXFfcXVldWVfdGVtcG8JdGVtcG87CisJCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX3RpbWVyCXF1ZXVlX3RpbWVyOworCQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9jbGllbnQJcXVldWVfY2xpZW50OworCQlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9vbAljbGllbnRfcG9vbDsKKwkJc3RydWN0IHNuZF9zZXFfcmVtb3ZlX2V2ZW50cwlyZW1vdmVfZXZlbnRzOworCQlzdHJ1Y3Qgc25kX3NlcV9xdWVyeV9zdWJzCXF1ZXJ5X3N1YnM7CisJfSBidWY7CisJY29uc3Qgc3RydWN0IGlvY3RsX2hhbmRsZXIgKmhhbmRsZXI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCBlcnI7CiAKIAlpZiAoc25kX0JVR19PTighY2xpZW50KSkKIAkJcmV0dXJuIC1FTlhJTzsKLQkJCi0JcmV0dXJuIHNuZF9zZXFfZG9faW9jdGwoY2xpZW50LCBjbWQsICh2b2lkIF9fdXNlciAqKSBhcmcpOworCisJZm9yIChoYW5kbGVyID0gaW9jdGxfaGFuZGxlcnM7IGhhbmRsZXItPmNtZCA+IDA7ICsraGFuZGxlcikgeworCQlpZiAoaGFuZGxlci0+Y21kID09IGNtZCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaGFuZGxlci0+Y21kID09IDApCisJCXJldHVybiAtRU5PVFRZOworCisJbWVtc2V0KCZidWYsIDAsIHNpemVvZihidWYpKTsKKworCS8qCisJICogQWxsIG9mIGlvY3RsIGNvbW1hbmRzIGZvciBBTFNBIHNlcXVlbmNlciBnZXQgYW4gYXJndW1lbnQgb2Ygc2l6ZQorCSAqIHdpdGhpbiAxMyBiaXRzLiBXZSBjYW4gc2FmZWx5IHBpY2sgdXAgdGhlIHNpemUgZnJvbSB0aGUgY29tbWFuZC4KKwkgKi8KKwlzaXplID0gX0lPQ19TSVpFKGhhbmRsZXItPmNtZCk7CisJaWYgKGhhbmRsZXItPmNtZCAmIElPQ19JTikgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJmJ1ZiwgKGNvbnN0IHZvaWQgX191c2VyICopYXJnLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCWVyciA9IGhhbmRsZXItPmZ1bmMoY2xpZW50LCAmYnVmKTsKKwlpZiAoZXJyID49IDApIHsKKwkJLyogU29tZSBjb21tYW5kcyBpbmNsdWRlcyBhIGJ1ZyBpbiAnZGlyJyBmaWVsZC4gKi8KKwkJaWYgKGhhbmRsZXItPmNtZCA9PSBTTkRSVl9TRVFfSU9DVExfU0VUX1FVRVVFX0NMSUVOVCB8fAorCQkgICAgaGFuZGxlci0+Y21kID09IFNORFJWX1NFUV9JT0NUTF9TRVRfQ0xJRU5UX1BPT0wgfHwKKwkJICAgIChoYW5kbGVyLT5jbWQgJiBJT0NfT1VUKSkKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmYnVmLCBzaXplKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gZXJyOwogfQogCiAjaWZkZWYgQ09ORklHX0NPTVBBVApAQCAtMjQyMywyMyArMjMyMywzNSBAQAogCiBFWFBPUlRfU1lNQk9MKHNuZF9zZXFfa2VybmVsX2NsaWVudF9kaXNwYXRjaCk7CiAKLS8qCi0gKiBleHBvcnRlZCwgY2FsbGVkIGJ5IGtlcm5lbCBjbGllbnRzIHRvIHBlcmZvcm0gc2FtZSBmdW5jdGlvbnMgYXMgd2l0aAotICogdXNlcmxhbmQgaW9jdGwoKSAKKy8qKgorICogc25kX3NlcV9rZXJuZWxfY2xpZW50X2N0bCAtIG9wZXJhdGUgYSBjb21tYW5kIGZvciBhIGNsaWVudCB3aXRoIGRhdGEgaW4KKyAqCQkJICAgICAgIGtlcm5lbCBzcGFjZS4KKyAqIEBjbGllbnRpZDoJQSBudW1lcmljYWwgSUQgZm9yIGEgY2xpZW50LgorICogQGNtZDoJQW4gaW9jdGwoMikgY29tbWFuZCBmb3IgQUxTQSBzZXF1ZW5jZXIgb3BlcmF0aW9uLgorICogQGFyZzoJQSBwb2ludGVyIHRvIGRhdGEgaW4ga2VybmVsIHNwYWNlLgorICoKKyAqIEFnYWluc3QgaXRzIG5hbWUsIGJvdGgga2VybmVsL2FwcGxpY2F0aW9uIGNsaWVudCBjYW4gYmUgaGFuZGxlZCBieSB0aGlzCisgKiBrZXJuZWwgQVBJLiBBIHBvaW50ZXIgb2YgJ2FyZycgYXJndW1lbnQgc2hvdWxkIGJlIGluIGtlcm5lbCBzcGFjZS4KKyAqCisgKiBSZXR1cm46IDAgYXQgc3VjY2Vzcy4gTmVnYXRpdmUgZXJyb3IgY29kZSBhdCBmYWlsdXJlLgogICovCiBpbnQgc25kX3NlcV9rZXJuZWxfY2xpZW50X2N0bChpbnQgY2xpZW50aWQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKKwljb25zdCBzdHJ1Y3QgaW9jdGxfaGFuZGxlciAqaGFuZGxlcjsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudDsKLQltbV9zZWdtZW50X3QgZnM7Ci0JaW50IHJlc3VsdDsKIAogCWNsaWVudCA9IGNsaWVudHB0cihjbGllbnRpZCk7CiAJaWYgKGNsaWVudCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOWElPOwotCWZzID0gc25kX2VudGVyX3VzZXIoKTsKLQlyZXN1bHQgPSBzbmRfc2VxX2RvX2lvY3RsKGNsaWVudCwgY21kLCAodm9pZCBfX2ZvcmNlIF9fdXNlciAqKWFyZyk7Ci0Jc25kX2xlYXZlX3VzZXIoZnMpOwotCXJldHVybiByZXN1bHQ7CisKKwlmb3IgKGhhbmRsZXIgPSBpb2N0bF9oYW5kbGVyczsgaGFuZGxlci0+Y21kID4gMDsgKytoYW5kbGVyKSB7CisJCWlmIChoYW5kbGVyLT5jbWQgPT0gY21kKQorCQkJcmV0dXJuIGhhbmRsZXItPmZ1bmMoY2xpZW50LCBhcmcpOworCX0KKworCXByX2RlYnVnKCJBTFNBOiBzZXEgdW5rbm93biBpb2N0bCgpIDB4JXggKHR5cGU9JyVjJywgbnVtYmVyPTB4JTAyeClcbiIsCisJCSBjbWQsIF9JT0NfVFlQRShjbWQpLCBfSU9DX05SKGNtZCkpOworCXJldHVybiAtRU5PVFRZOwogfQogCiBFWFBPUlRfU1lNQk9MKHNuZF9zZXFfa2VybmVsX2NsaWVudF9jdGwpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2NvbXBhdC5jIGIvc291bmQvY29yZS9zZXEvc2VxX2NvbXBhdC5jCmluZGV4IDY1MTc1OTAuLmZjZTU2OTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9jb21wYXQuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfY29tcGF0LmMKQEAgLTQ3LDcgKzQ3LDYgQEAKIHsKIAlpbnQgZXJyID0gLUVGQVVMVDsKIAlzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8gKmRhdGE7Ci0JbW1fc2VnbWVudF90IGZzOwogCiAJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKQpAQCAtNTksOSArNTgsNyBAQAogCQlnb3RvIGVycm9yOwogCWRhdGEtPmtlcm5lbCA9IE5VTEw7CiAKLQlmcyA9IHNuZF9lbnRlcl91c2VyKCk7Ci0JZXJyID0gc25kX3NlcV9kb19pb2N0bChjbGllbnQsIGNtZCwgZGF0YSk7Ci0Jc25kX2xlYXZlX3VzZXIoZnMpOworCWVyciA9IHNuZF9zZXFfa2VybmVsX2NsaWVudF9jdGwoY2xpZW50LT5udW1iZXIsIGNtZCwgJmRhdGEpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm9yOwogCkBAIC0xMjMsNyArMTIwLDcgQEAKIAljYXNlIFNORFJWX1NFUV9JT0NUTF9HRVRfU1VCU0NSSVBUSU9OOgogCWNhc2UgU05EUlZfU0VRX0lPQ1RMX1FVRVJZX05FWFRfQ0xJRU5UOgogCWNhc2UgU05EUlZfU0VRX0lPQ1RMX1JVTk5JTkdfTU9ERToKLQkJcmV0dXJuIHNuZF9zZXFfZG9faW9jdGwoY2xpZW50LCBjbWQsIGFyZ3ApOworCQlyZXR1cm4gc25kX3NlcV9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CiAJY2FzZSBTTkRSVl9TRVFfSU9DVExfQ1JFQVRFX1BPUlQzMjoKIAkJcmV0dXJuIHNuZF9zZXFfY2FsbF9wb3J0X2luZm9faW9jdGwoY2xpZW50LCBTTkRSVl9TRVFfSU9DVExfQ1JFQVRFX1BPUlQsIGFyZ3ApOwogCWNhc2UgU05EUlZfU0VRX0lPQ1RMX0RFTEVURV9QT1JUMzI6CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3RpbWVyLmMgYi9zb3VuZC9jb3JlL3RpbWVyLmMKaW5kZXggOWE2MTU3ZS4uZmMxNDRmNCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS90aW1lci5jCisrKyBiL3NvdW5kL2NvcmUvdGltZXIuYwpAQCAtMzUsNiArMzUsOSBAQAogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAKKy8qIGludGVybmFsIGZsYWdzICovCisjZGVmaW5lIFNORFJWX1RJTUVSX0lGTEdfUEFVU0VECQkweDAwMDEwMDAwCisKICNpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfSFJUSU1FUikKICNkZWZpbmUgREVGQVVMVF9USU1FUl9MSU1JVCA0CiAjZWxzZQpAQCAtMjk0LDggKzI5NywyMSBAQAogCQlnZXRfZGV2aWNlKCZ0aW1lci0+Y2FyZC0+Y2FyZF9kZXYpOwogCXRpbWVyaS0+c2xhdmVfY2xhc3MgPSB0aWQtPmRldl9zY2xhc3M7CiAJdGltZXJpLT5zbGF2ZV9pZCA9IHNsYXZlX2lkOwotCWlmIChsaXN0X2VtcHR5KCZ0aW1lci0+b3Blbl9saXN0X2hlYWQpICYmIHRpbWVyLT5ody5vcGVuKQotCQl0aW1lci0+aHcub3Blbih0aW1lcik7CisKKwlpZiAobGlzdF9lbXB0eSgmdGltZXItPm9wZW5fbGlzdF9oZWFkKSAmJiB0aW1lci0+aHcub3BlbikgeworCQlpbnQgZXJyID0gdGltZXItPmh3Lm9wZW4odGltZXIpOworCQlpZiAoZXJyKSB7CisJCQlrZnJlZSh0aW1lcmktPm93bmVyKTsKKwkJCWtmcmVlKHRpbWVyaSk7CisKKwkJCWlmICh0aW1lci0+Y2FyZCkKKwkJCQlwdXRfZGV2aWNlKCZ0aW1lci0+Y2FyZC0+Y2FyZF9kZXYpOworCQkJbW9kdWxlX3B1dCh0aW1lci0+bW9kdWxlKTsKKwkJCW11dGV4X3VubG9jaygmcmVnaXN0ZXJfbXV0ZXgpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwogCWxpc3RfYWRkX3RhaWwoJnRpbWVyaS0+b3Blbl9saXN0LCAmdGltZXItPm9wZW5fbGlzdF9oZWFkKTsKIAlzbmRfdGltZXJfY2hlY2tfbWFzdGVyKHRpbWVyaSk7CiAJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CkBAIC01MjYsNiArNTQyLDEwIEBACiAJCX0KIAl9CiAJdGltZXJpLT5mbGFncyAmPSB+KFNORFJWX1RJTUVSX0lGTEdfUlVOTklORyB8IFNORFJWX1RJTUVSX0lGTEdfU1RBUlQpOworCWlmIChzdG9wKQorCQl0aW1lcmktPmZsYWdzICY9IH5TTkRSVl9USU1FUl9JRkxHX1BBVVNFRDsKKwllbHNlCisJCXRpbWVyaS0+ZmxhZ3MgfD0gU05EUlZfVElNRVJfSUZMR19QQVVTRUQ7CiAJc25kX3RpbWVyX25vdGlmeTEodGltZXJpLCBzdG9wID8gU05EUlZfVElNRVJfRVZFTlRfU1RPUCA6CiAJCQkgIFNORFJWX1RJTUVSX0VWRU5UX0NPTlRJTlVFKTsKICB1bmxvY2s6CkBAIC01ODcsNiArNjA3LDEwIEBACiAgKi8KIGludCBzbmRfdGltZXJfY29udGludWUoc3RydWN0IHNuZF90aW1lcl9pbnN0YW5jZSAqdGltZXJpKQogeworCS8qIHRpbWVyIGNhbiBjb250aW51ZSBvbmx5IGFmdGVyIHBhdXNlICovCisJaWYgKCEodGltZXJpLT5mbGFncyAmIFNORFJWX1RJTUVSX0lGTEdfUEFVU0VEKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAodGltZXJpLT5mbGFncyAmIFNORFJWX1RJTUVSX0lGTEdfU0xBVkUpCiAJCXJldHVybiBzbmRfdGltZXJfc3RhcnRfc2xhdmUodGltZXJpLCBmYWxzZSk7CiAJZWxzZQpAQCAtODEzLDYgKzgzNyw3IEBACiAJdGltZXItPnRtcl9zdWJkZXZpY2UgPSB0aWQtPnN1YmRldmljZTsKIAlpZiAoaWQpCiAJCXN0cmxjcHkodGltZXItPmlkLCBpZCwgc2l6ZW9mKHRpbWVyLT5pZCkpOworCXRpbWVyLT5zdGlja3MgPSAxOwogCUlOSVRfTElTVF9IRUFEKCZ0aW1lci0+ZGV2aWNlX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZ0aW1lci0+b3Blbl9saXN0X2hlYWQpOwogCUlOSVRfTElTVF9IRUFEKCZ0aW1lci0+YWN0aXZlX2xpc3RfaGVhZCk7CkBAIC0xODE3LDYgKzE4NDIsOSBAQAogCXR1ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWlmICghdHUtPnRpbWVyaSkKIAkJcmV0dXJuIC1FQkFERkQ7CisJLyogc3RhcnQgdGltZXIgaW5zdGVhZCBvZiBjb250aW51ZSBpZiBpdCdzIG5vdCB1c2VkIGJlZm9yZSAqLworCWlmICghKHR1LT50aW1lcmktPmZsYWdzICYgU05EUlZfVElNRVJfSUZMR19QQVVTRUQpKQorCQlyZXR1cm4gc25kX3RpbWVyX3VzZXJfc3RhcnQoZmlsZSk7CiAJdHUtPnRpbWVyaS0+bG9zdCA9IDA7CiAJcmV0dXJuIChlcnIgPSBzbmRfdGltZXJfY29udGludWUodHUtPnRpbWVyaSkpIDwgMCA/IGVyciA6IDA7CiB9CkBAIC0xOTU4LDYgKzE5ODYsNyBAQAogCQl0dS0+cXVzZWQtLTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZ0dS0+cWxvY2spOwogCisJCW11dGV4X2xvY2soJnR1LT5pb2N0bF9sb2NrKTsKIAkJaWYgKHR1LT50cmVhZCkgewogCQkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsICZ0dS0+dHF1ZXVlW3FoZWFkXSwKIAkJCQkJIHNpemVvZihzdHJ1Y3Qgc25kX3RpbWVyX3RyZWFkKSkpCkBAIC0xOTY3LDYgKzE5OTYsNyBAQAogCQkJCQkgc2l6ZW9mKHN0cnVjdCBzbmRfdGltZXJfcmVhZCkpKQogCQkJCWVyciA9IC1FRkFVTFQ7CiAJCX0KKwkJbXV0ZXhfdW5sb2NrKCZ0dS0+aW9jdGxfbG9jayk7CiAKIAkJc3Bpbl9sb2NrX2lycSgmdHUtPnFsb2NrKTsKIAkJaWYgKGVyciA8IDApCmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9iZWJvYi9NYWtlZmlsZSBiL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL01ha2VmaWxlCmluZGV4IGFmN2VkNjYuLmRkNDU0ODYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL01ha2VmaWxlCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL01ha2VmaWxlCkBAIC0xLDQgKzEsNSBAQAogc25kLWJlYm9iLW9ianMgOj0gYmVib2JfY29tbWFuZC5vIGJlYm9iX3N0cmVhbS5vIGJlYm9iX3Byb2MubyBiZWJvYl9taWRpLm8gXAotCQkgIGJlYm9iX3BjbS5vIGJlYm9iX2h3ZGVwLm8gYmVib2JfdGVycmF0ZWMubyBiZWJvYl95YW1haGEubyBcCi0JCSAgYmVib2JfZm9jdXNyaXRlLm8gYmVib2JfbWF1ZGlvLm8gYmVib2IubworCQkgIGJlYm9iX3BjbS5vIGJlYm9iX2h3ZGVwLm8gYmVib2JfdGVycmF0ZWMubyBcCisJCSAgYmVib2JfeWFtYWhhX3RlcnJhdGVjLm8gYmVib2JfZm9jdXNyaXRlLm8gYmVib2JfbWF1ZGlvLm8gXAorCQkgIGJlYm9iLm8KIG9iai0kKENPTkZJR19TTkRfQkVCT0IpICs9IHNuZC1iZWJvYi5vCmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYi5jIGIvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2IuYwppbmRleCBmN2UyY2JkLi4zNDY5YWMxNCAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2IuYworKysgYi9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYi5jCkBAIC00NTgsMTcgKzQ1OCwxNyBAQAogCS8qIFRlcnJhVGVjIEVsZWN0cm9uaWMgR21iSCwgUEhBU0UgODggUmFjayBGVyAqLwogCVNORF9CRUJPQl9ERVZfRU5UUlkoVkVOX1RFUlJBVEVDLCAweDAwMDAwMDAzLCAmcGhhc2U4OF9yYWNrX3NwZWMpLAogCS8qIFRlcnJhVGVjIEVsZWN0cm9uaWMgR21iSCwgUEhBU0UgMjQgRlcgKi8KLQlTTkRfQkVCT0JfREVWX0VOVFJZKFZFTl9URVJSQVRFQywgMHgwMDAwMDAwNCwgJnBoYXNlMjRfc2VyaWVzX3NwZWMpLAorCVNORF9CRUJPQl9ERVZfRU5UUlkoVkVOX1RFUlJBVEVDLCAweDAwMDAwMDA0LCAmeWFtYWhhX3RlcnJhdGVjX3NwZWMpLAogCS8qIFRlcnJhVGVjIEVsZWN0cm9uaWMgR21iSCwgUGhhc2UgWDI0IEZXICovCi0JU05EX0JFQk9CX0RFVl9FTlRSWShWRU5fVEVSUkFURUMsIDB4MDAwMDAwMDcsICZwaGFzZTI0X3Nlcmllc19zcGVjKSwKKwlTTkRfQkVCT0JfREVWX0VOVFJZKFZFTl9URVJSQVRFQywgMHgwMDAwMDAwNywgJnlhbWFoYV90ZXJyYXRlY19zcGVjKSwKIAkvKiBUZXJyYVRlYyBFbGVjdHJvbmljIEdtYkgsIEVXUyBNSUMyL01JQzggKi8KIAlTTkRfQkVCT0JfREVWX0VOVFJZKFZFTl9URVJSQVRFQywgMHgwMDAwMDAwNSwgJnNwZWNfbm9ybWFsKSwKIAkvKiBUZXJyYXRlYyBFbGVjdHJvbmljIEdtYkgsIEF1cmVvbiA3LjEgRmlyZXdpcmUgKi8KIAlTTkRfQkVCT0JfREVWX0VOVFJZKFZFTl9URVJSQVRFQywgMHgwMDAwMDAwMiwgJnNwZWNfbm9ybWFsKSwKIAkvKiBZYW1haGEsIEdPNDQgKi8KLQlTTkRfQkVCT0JfREVWX0VOVFJZKFZFTl9ZQU1BSEEsIDB4MDAxMDAwMGIsICZ5YW1haGFfZ29fc3BlYyksCisJU05EX0JFQk9CX0RFVl9FTlRSWShWRU5fWUFNQUhBLCAweDAwMTAwMDBiLCAmeWFtYWhhX3RlcnJhdGVjX3NwZWMpLAogCS8qIFlBTUFIQSwgR080NiAqLwotCVNORF9CRUJPQl9ERVZfRU5UUlkoVkVOX1lBTUFIQSwgMHgwMDEwMDAwYywgJnlhbWFoYV9nb19zcGVjKSwKKwlTTkRfQkVCT0JfREVWX0VOVFJZKFZFTl9ZQU1BSEEsIDB4MDAxMDAwMGMsICZ5YW1haGFfdGVycmF0ZWNfc3BlYyksCiAJLyogRm9jdXNyaXRlLCBTYWZmaXJlUHJvIDI2IEkvTyAqLwogCVNORF9CRUJPQl9ERVZfRU5UUlkoVkVOX0ZPQ1VTUklURSwgMHgwMDAwMDAwMywgJnNhZmZpcmVwcm9fMjZfc3BlYyksCiAJLyogRm9jdXNyaXRlLCBTYWZmaXJlUHJvIDEwIEkvTyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2IuaCBiL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iLmgKaW5kZXggZTdmMWJiOS4uMTc1ZGE4NyAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2IuaAorKysgYi9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYi5oCkBAIC0yMzUsOCArMjM1LDcgQEAKIAogLyogbW9kZWwgc3BlY2lmaWMgb3BlcmF0aW9ucyAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfYmVib2Jfc3BlYyBwaGFzZTg4X3JhY2tfc3BlYzsKLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2JlYm9iX3NwZWMgcGhhc2UyNF9zZXJpZXNfc3BlYzsKLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2JlYm9iX3NwZWMgeWFtYWhhX2dvX3NwZWM7CitleHRlcm4gY29uc3Qgc3RydWN0IHNuZF9iZWJvYl9zcGVjIHlhbWFoYV90ZXJyYXRlY19zcGVjOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfYmVib2Jfc3BlYyBzYWZmaXJlcHJvXzI2X3NwZWM7CiBleHRlcm4gY29uc3Qgc3RydWN0IHNuZF9iZWJvYl9zcGVjIHNhZmZpcmVwcm9fMTBfc3BlYzsKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2JlYm9iX3NwZWMgc2FmZmlyZV9sZV9zcGVjOwpkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2JfdGVycmF0ZWMuYyBiL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iX3RlcnJhdGVjLmMKaW5kZXggYzM4MzU4Yi4uMmZkYWY5MyAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2JfdGVycmF0ZWMuYworKysgYi9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYl90ZXJyYXRlYy5jCkBAIC0zNiwyNSArMzYsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBlbnVtIHNuZF9iZWJvYl9jbG9ja190eXBlIHBoYXNlMjRfc2VyaWVzX2Nsa19zcmNfdHlwZXNbXSA9IHsKLQlTTkRfQkVCT0JfQ0xPQ0tfVFlQRV9JTlRFUk5BTCwKLQlTTkRfQkVCT0JfQ0xPQ0tfVFlQRV9FWFRFUk5BTCwJLyogUy9QRElGICovCi19Owotc3RhdGljIGludAotcGhhc2UyNF9zZXJpZXNfY2xrX3NyY19nZXQoc3RydWN0IHNuZF9iZWJvYiAqYmVib2IsIHVuc2lnbmVkIGludCAqaWQpCi17Ci0JaW50IGVycjsKLQotCWVyciA9IGF2Y19hdWRpb19nZXRfc2VsZWN0b3IoYmVib2ItPnVuaXQsIDAsIDQsIGlkKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWlmICgqaWQgPj0gQVJSQVlfU0laRShwaGFzZTI0X3Nlcmllc19jbGtfc3JjX3R5cGVzKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYmVib2JfcmF0ZV9zcGVjIHBoYXNlX3Nlcmllc19yYXRlX3NwZWMgPSB7CiAJLmdldAk9ICZzbmRfYmVib2Jfc3RyZWFtX2dldF9yYXRlLAogCS5zZXQJPSAmc25kX2JlYm9iX3N0cmVhbV9zZXRfcmF0ZSwKQEAgLTcxLDE1ICs1MiwzIEBACiAJLnJhdGUJPSAmcGhhc2Vfc2VyaWVzX3JhdGVfc3BlYywKIAkubWV0ZXIJPSBOVUxMCiB9OwotCi0vKiAnUEhBU0UgMjQgRlcnIGFuZCAnUEhBU0UgWDI0IEZXJyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYmVib2JfY2xvY2tfc3BlYyBwaGFzZTI0X3Nlcmllc19jbGsgPSB7Ci0JLm51bQk9IEFSUkFZX1NJWkUocGhhc2UyNF9zZXJpZXNfY2xrX3NyY190eXBlcyksCi0JLnR5cGVzCT0gcGhhc2UyNF9zZXJpZXNfY2xrX3NyY190eXBlcywKLQkuZ2V0CT0gJnBoYXNlMjRfc2VyaWVzX2Nsa19zcmNfZ2V0LAotfTsKLWNvbnN0IHN0cnVjdCBzbmRfYmVib2Jfc3BlYyBwaGFzZTI0X3Nlcmllc19zcGVjID0gewotCS5jbG9jawk9ICZwaGFzZTI0X3Nlcmllc19jbGssCi0JLnJhdGUJPSAmcGhhc2Vfc2VyaWVzX3JhdGVfc3BlYywKLQkubWV0ZXIJPSBOVUxMCi19OwpkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2JfeWFtYWhhLmMgYi9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYl95YW1haGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBkNDQwNC4uMDAwMDAwMAotLS0gYS9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYl95YW1haGEuYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBiZWJvYl95YW1haGEuYyAtIGEgcGFydCBvZiBkcml2ZXIgZm9yIEJlQm9CIGJhc2VkIGRldmljZXMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBUYWthc2hpIFNha2Ftb3RvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgotICovCi0KLSNpbmNsdWRlICIuL2JlYm9iLmgiCi0KLS8qCi0gKiBOT1RFOgotICogWWFtYWhhIEdPNDQgaXMgbm90IGRlc2lnbmVkIHRvIGJlIHVzZWQgYXMgc3RhbmQtYWxvbmUgbWl4ZXIuIFNvIGFueSBzdHJlYW1zCi0gKiBtdXN0IGJlIGFjY29tcGFuaWVkLiBJZiBjaGFuZ2luZyB0aGUgc3RhdGUsIGEgTEVEIG9uIHRoZSBkZXZpY2Ugc3RhcnRzIHRvCi0gKiBibGluayBhbmQgaXRzIHN5bmMgc3RhdHVzIGlzIGZhbHNlLiBJbiB0aGlzIHN0YXRlLCB0aGUgZGV2aWNlIHNvdW5kcyBub3RoaW5nCi0gKiBldmVuIGlmIHN0cmVhbWluZy4gVG8gc3RhcnQgc3RyZWFtaW5nIGF0IHRoZSBjdXJyZW50IHNhbXBsaW5nIHJhdGUgaXMgb25seQotICogd2F5IHRvIHJldm9jZXIgdGhpcyBzdGF0ZS4gR080NiBpcyBiZXR0ZXIgZm9yIHN0YW5kLWFsb25lIG1peGVyLgotICoKLSAqIEJvdGggb2YgdGhlbSBoYXZlIGEgY2FwYWJpbGl0eSB0byBjaGFuZ2UgaXRzIHNhbXBsaW5nIHJhdGUgdXAgdG8gMTkyLjBrSHouCi0gKiBBdCAxOTIuMGtIeiwgdGhlIGRldmljZSByZXBvcnRzIDQgUENNLWluLCAxIE1JREktaW4sIDYgUENNLW91dCwgMSBNSURJLW91dC4KLSAqIEJ1dCBZYW1haGEncyBkcml2ZXIgcmVkdWNlIDIgUENNLWluLCAxIE1JREktaW4sIDIgUENNLW91dCwgMSBNSURJLW91dCB0byB1c2UKLSAqICdFeHRlbmRlZCBTdHJlYW0gRm9ybWF0IEluZm9ybWF0aW9uIENvbW1hbmQgLSBTaW5nbGUgUmVxdWVzdCcgaW4gJ0FkZGl0aW9uYWwKLSAqIEFWQyBjb21tYW5kcycgZGVmaW5lZCBieSBCcmlkZ2VDby4KLSAqIFRoaXMgQUxTQSBkcml2ZXIgZG9uJ3QgZG8gdGhpcyBiZWNhdXNlIGEgYml0IHRpcmVzb21lLiBUaGVuIGlzb2Nocm9ub3VzCi0gKiBzdHJlYW1pbmcgd2l0aCBtYW55IGFzeW5jaHJvbm91cyB0cmFuc2FjdGlvbnMgYnJpbmdzIHNvdW5kcyB3aXRoIG5vaXNlcy4KLSAqIFVuZm9ydHVuYXRlbHkgY3VycmVudCAnZmZhZG8tbWl4ZXInIGdlbmVyYXRlZCBtYW55IGFzeW5jaHJvbm91cyB0cmFuc2FjdGlvbgotICogdG8gb2JzZXJ2ZSBkZXZpY2UncyBzdGF0ZSwgbWFpbmx5IGNoZWNrIGNtcCBjb25uZWN0aW9uIGFuZCBzaWduYWwgZm9ybWF0LiBJCi0gKiByZWNjb21lbmQgdXNlcnMgdG8gY2xvc2UgZmZhZG8tbWl4ZXIgYXQgMTkyLjBrSHogaWYgbWl4ZXIgaXMgbmVlZGxlc3MuCi0gKi8KLQotc3RhdGljIGVudW0gc25kX2JlYm9iX2Nsb2NrX3R5cGUgY2xrX3NyY190eXBlc1tdID0gewotCVNORF9CRUJPQl9DTE9DS19UWVBFX0lOVEVSTkFMLAotCVNORF9CRUJPQl9DTE9DS19UWVBFX0VYVEVSTkFMLAkvKiBTL1BESUYgKi8KLX07Ci1zdGF0aWMgaW50Ci1jbGtfc3JjX2dldChzdHJ1Y3Qgc25kX2JlYm9iICpiZWJvYiwgdW5zaWduZWQgaW50ICppZCkKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gYXZjX2F1ZGlvX2dldF9zZWxlY3RvcihiZWJvYi0+dW5pdCwgMCwgNCwgaWQpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKCppZCA+PSBBUlJBWV9TSVpFKGNsa19zcmNfdHlwZXMpKQotCQlyZXR1cm4gLUVJTzsKLQotCXJldHVybiAwOwotfQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYmVib2JfY2xvY2tfc3BlYyBjbG9ja19zcGVjID0gewotCS5udW0JPSBBUlJBWV9TSVpFKGNsa19zcmNfdHlwZXMpLAotCS50eXBlcwk9IGNsa19zcmNfdHlwZXMsCi0JLmdldAk9ICZjbGtfc3JjX2dldCwKLX07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9iZWJvYl9yYXRlX3NwZWMgcmF0ZV9zcGVjID0gewotCS5nZXQJPSAmc25kX2JlYm9iX3N0cmVhbV9nZXRfcmF0ZSwKLQkuc2V0CT0gJnNuZF9iZWJvYl9zdHJlYW1fc2V0X3JhdGUsCi19OwotY29uc3Qgc3RydWN0IHNuZF9iZWJvYl9zcGVjIHlhbWFoYV9nb19zcGVjID0gewotCS5jbG9jawk9ICZjbG9ja19zcGVjLAotCS5yYXRlCT0gJnJhdGVfc3BlYywKLQkubWV0ZXIJPSBOVUxMCi19OwpkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2JfeWFtYWhhX3RlcnJhdGVjLmMgYi9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYl95YW1haGFfdGVycmF0ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmJlM2U3Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2JfeWFtYWhhX3RlcnJhdGVjLmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIGJlYm9iX3lhbWFoYS5jIC0gYSBwYXJ0IG9mIGRyaXZlciBmb3IgQmVCb0IgYmFzZWQgZGV2aWNlcworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFRha2FzaGkgU2FrYW1vdG8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCisgKi8KKworI2luY2x1ZGUgIi4vYmVib2IuaCIKKworLyoKKyAqIE5PVEU6CisgKiBZYW1haGEgR080NCBpcyBub3QgZGVzaWduZWQgdG8gYmUgdXNlZCBhcyBzdGFuZC1hbG9uZSBtaXhlci4gU28gYW55IHN0cmVhbXMKKyAqIG11c3QgYmUgYWNjb21wYW5pZWQuIElmIGNoYW5naW5nIHRoZSBzdGF0ZSwgYSBMRUQgb24gdGhlIGRldmljZSBzdGFydHMgdG8KKyAqIGJsaW5rIGFuZCBpdHMgc3luYyBzdGF0dXMgaXMgZmFsc2UuIEluIHRoaXMgc3RhdGUsIHRoZSBkZXZpY2Ugc291bmRzIG5vdGhpbmcKKyAqIGV2ZW4gaWYgc3RyZWFtaW5nLiBUbyBzdGFydCBzdHJlYW1pbmcgYXQgdGhlIGN1cnJlbnQgc2FtcGxpbmcgcmF0ZSBpcyBvbmx5CisgKiB3YXkgdG8gcmVjb3ZlciB0aGlzIHN0YXRlLiBHTzQ2IGlzIGJldHRlciBmb3Igc3RhbmQtYWxvbmUgbWl4ZXIuCisgKgorICogQm90aCBvZiB0aGVtIGhhdmUgYSBjYXBhYmlsaXR5IHRvIGNoYW5nZSBpdHMgc2FtcGxpbmcgcmF0ZSB1cCB0byAxOTIuMGtIei4KKyAqIEF0IDE5Mi4wa0h6LCB0aGUgZGV2aWNlIHJlcG9ydHMgNCBQQ00taW4sIDEgTUlESS1pbiwgNiBQQ00tb3V0LCAxIE1JREktb3V0LgorICogQnV0IFlhbWFoYSdzIGRyaXZlciByZWR1Y2UgMiBQQ00taW4sIDEgTUlESS1pbiwgMiBQQ00tb3V0LCAxIE1JREktb3V0IHRvIHVzZQorICogJ0V4dGVuZGVkIFN0cmVhbSBGb3JtYXQgSW5mb3JtYXRpb24gQ29tbWFuZCAtIFNpbmdsZSBSZXF1ZXN0JyBpbiAnQWRkaXRpb25hbAorICogQVZDIGNvbW1hbmRzJyBkZWZpbmVkIGJ5IEJyaWRnZUNvLgorICogVGhpcyBBTFNBIGRyaXZlciBkb24ndCBkbyB0aGlzIGJlY2F1c2UgYSBiaXQgdGlyZXNvbWUuIFRoZW4gaXNvY2hyb25vdXMKKyAqIHN0cmVhbWluZyB3aXRoIG1hbnkgYXN5bmNocm9ub3VzIHRyYW5zYWN0aW9ucyBicmluZ3Mgc291bmRzIHdpdGggbm9pc2VzLgorICogVW5mb3J0dW5hdGVseSBjdXJyZW50ICdmZmFkby1taXhlcicgZ2VuZXJhdGVkIG1hbnkgYXN5bmNocm9ub3VzIHRyYW5zYWN0aW9uCisgKiB0byBvYnNlcnZlIGRldmljZSdzIHN0YXRlLCBtYWlubHkgY2hlY2sgY21wIGNvbm5lY3Rpb24gYW5kIHNpZ25hbCBmb3JtYXQuIEkKKyAqIHJlY29tbWVuZCB1c2VycyB0byBjbG9zZSBmZmFkby1taXhlciBhdCAxOTIuMGtIeiBpZiBtaXhlciBpcyBuZWVkbGVzcy4KKyAqCisgKiBUZXJyYXRlYyBQSEFTRSAyNCBGVyBhbmQgUEhBU0UgWDI0IEZXIGFyZSBpbnRlcm5hbGx5IHRoZSBzYW1lIGFzCisgKiBZYW1haGEgR08gNDQgYW5kIEdPIDQ2LiBZYW1haGEgYW5kIFRlcnJhdGVjIGhhZCBjb29wZXJhdGVkIGZvciB0aGVzZSBtb2RlbHMuCisgKi8KKworc3RhdGljIGVudW0gc25kX2JlYm9iX2Nsb2NrX3R5cGUgY2xrX3NyY190eXBlc1tdID0geworCVNORF9CRUJPQl9DTE9DS19UWVBFX0lOVEVSTkFMLAorCVNORF9CRUJPQl9DTE9DS19UWVBFX0VYVEVSTkFMLAkvKiBTL1BESUYgKi8KK307CitzdGF0aWMgaW50CitjbGtfc3JjX2dldChzdHJ1Y3Qgc25kX2JlYm9iICpiZWJvYiwgdW5zaWduZWQgaW50ICppZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gYXZjX2F1ZGlvX2dldF9zZWxlY3RvcihiZWJvYi0+dW5pdCwgMCwgNCwgaWQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCppZCA+PSBBUlJBWV9TSVpFKGNsa19zcmNfdHlwZXMpKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYmVib2JfY2xvY2tfc3BlYyBjbG9ja19zcGVjID0geworCS5udW0JPSBBUlJBWV9TSVpFKGNsa19zcmNfdHlwZXMpLAorCS50eXBlcwk9IGNsa19zcmNfdHlwZXMsCisJLmdldAk9ICZjbGtfc3JjX2dldCwKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9iZWJvYl9yYXRlX3NwZWMgcmF0ZV9zcGVjID0geworCS5nZXQJPSAmc25kX2JlYm9iX3N0cmVhbV9nZXRfcmF0ZSwKKwkuc2V0CT0gJnNuZF9iZWJvYl9zdHJlYW1fc2V0X3JhdGUsCit9OworY29uc3Qgc3RydWN0IHNuZF9iZWJvYl9zcGVjIHlhbWFoYV90ZXJyYXRlY19zcGVjID0geworCS5jbG9jawk9ICZjbG9ja19zcGVjLAorCS5yYXRlCT0gJnJhdGVfc3BlYywKKwkubWV0ZXIJPSBOVUxMCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvZGljZS9kaWNlLXBjbS5jIGIvc291bmQvZmlyZXdpcmUvZGljZS9kaWNlLXBjbS5jCmluZGV4IDRhYTAyNDkuLjYwNzRmZTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2RpY2UvZGljZS1wY20uYworKysgYi9zb3VuZC9maXJld2lyZS9kaWNlL2RpY2UtcGNtLmMKQEAgLTMwMiw3ICszMDIsNyBAQAogCiBpbnQgc25kX2RpY2VfY3JlYXRlX3BjbShzdHJ1Y3Qgc25kX2RpY2UgKmRpY2UpCiB7Ci0Jc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBjYXB0dXJlX29wcyA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIGNhcHR1cmVfb3BzID0gewogCQkub3BlbiAgICAgID0gcGNtX29wZW4sCiAJCS5jbG9zZSAgICAgPSBwY21fY2xvc2UsCiAJCS5pb2N0bCAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTMxNCw3ICszMTQsNyBAQAogCQkucGFnZSAgICAgID0gc25kX3BjbV9saWJfZ2V0X3ZtYWxsb2NfcGFnZSwKIAkJLm1tYXAgICAgICA9IHNuZF9wY21fbGliX21tYXBfdm1hbGxvYywKIAl9OwotCXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgcGxheWJhY2tfb3BzID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgcGxheWJhY2tfb3BzID0gewogCQkub3BlbiAgICAgID0gcGNtX29wZW4sCiAJCS5jbG9zZSAgICAgPSBwY21fY2xvc2UsCiAJCS5pb2N0bCAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2RpZ2kwMHgvZGlnaTAweC1wY20uYyBiL3NvdW5kL2ZpcmV3aXJlL2RpZ2kwMHgvZGlnaTAweC1wY20uYwppbmRleCBjYWMyOGY3Li42MTNmMDU4IDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9kaWdpMDB4L2RpZ2kwMHgtcGNtLmMKKysrIGIvc291bmQvZmlyZXdpcmUvZGlnaTAweC9kaWdpMDB4LXBjbS5jCkBAIC0zMjksNyArMzI5LDcgQEAKIAlyZXR1cm4gYW1kdHBfc3RyZWFtX3BjbV9wb2ludGVyKCZkZzAweC0+cnhfc3RyZWFtKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBwY21fY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHBjbV9jYXB0dXJlX29wcyA9IHsKIAkub3BlbgkJPSBwY21fb3BlbiwKIAkuY2xvc2UJCT0gcGNtX2Nsb3NlLAogCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTM0MSw3ICszNDEsNyBAQAogCS5wYWdlCQk9IHNuZF9wY21fbGliX2dldF92bWFsbG9jX3BhZ2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHBjbV9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHBjbV9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4JCT0gcGNtX29wZW4sCiAJLmNsb3NlCQk9IHBjbV9jbG9zZSwKIAkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9maXJld29ya3MvZmlyZXdvcmtzLmggYi9zb3VuZC9maXJld2lyZS9maXJld29ya3MvZmlyZXdvcmtzLmgKaW5kZXggMDNlZDM1Mi4uZDczYzEyYiAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrcy5oCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2ZpcmV3b3Jrcy9maXJld29ya3MuaApAQCAtMTA4LDcgKzEwOCw2IEBACiAJdTggKnJlc3BfYnVmOwogCXU4ICpwdWxsX3B0cjsKIAl1OCAqcHVzaF9wdHI7Ci0JdW5zaWduZWQgaW50IHJlc3BfcXVldWVzOwogfTsKIAogaW50IHNuZF9lZndfdHJhbnNhY3Rpb25fY21kKHN0cnVjdCBmd191bml0ICp1bml0LApkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrc19od2RlcC5jIGIvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrc19od2RlcC5jCmluZGV4IDMzZGY4NjUuLjJlMWQ5YTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2ZpcmV3b3Jrcy9maXJld29ya3NfaHdkZXAuYworKysgYi9zb3VuZC9maXJld2lyZS9maXJld29ya3MvZmlyZXdvcmtzX2h3ZGVwLmMKQEAgLTI1LDYgKzI1LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgbGVuZ3RoLCB0aWxsX2VuZCwgdHlwZTsKIAlzdHJ1Y3Qgc25kX2Vmd190cmFuc2FjdGlvbiAqdDsKKwl1OCAqcHVsbF9wdHI7CiAJbG9uZyBjb3VudCA9IDA7CiAKIAlpZiAocmVtYWluZWQgPCBzaXplb2YodHlwZSkgKyBzaXplb2Yoc3RydWN0IHNuZF9lZndfdHJhbnNhY3Rpb24pKQpAQCAtMzgsOCArMzksMTcgQEAKIAlidWYgKz0gc2l6ZW9mKHR5cGUpOwogCiAJLyogd3JpdGUgaW50byBidWZmZXIgYXMgbWFueSByZXNwb25zZXMgYXMgcG9zc2libGUgKi8KLQl3aGlsZSAoZWZ3LT5yZXNwX3F1ZXVlcyA+IDApIHsKLQkJdCA9IChzdHJ1Y3Qgc25kX2Vmd190cmFuc2FjdGlvbiAqKShlZnctPnB1bGxfcHRyKTsKKwlzcGluX2xvY2tfaXJxKCZlZnctPmxvY2spOworCisJLyoKKwkgKiBXaGVuIGFub3RoZXIgdGFzayByZWFjaGVzIGhlcmUgZHVyaW5nIHRoaXMgdGFzaydzIGFjY2VzcyB0byB1c2VyCisJICogc3BhY2UsIGl0IHBpY2tzIHVwIGN1cnJlbnQgcG9zaXRpb24gaW4gYnVmZmVyIGFuZCBjYW4gcmVhZCB0aGUgc2FtZQorCSAqIHNlcmllcyBvZiByZXNwb25zZXMuCisJICovCisJcHVsbF9wdHIgPSBlZnctPnB1bGxfcHRyOworCisJd2hpbGUgKGVmdy0+cHVzaF9wdHIgIT0gcHVsbF9wdHIpIHsKKwkJdCA9IChzdHJ1Y3Qgc25kX2Vmd190cmFuc2FjdGlvbiAqKShwdWxsX3B0cik7CiAJCWxlbmd0aCA9IGJlMzJfdG9fY3B1KHQtPmxlbmd0aCkgKiBzaXplb2YoX19iZTMyKTsKIAogCQkvKiBjb25maXJtIGVub3VnaCBzcGFjZSBmb3IgdGhpcyByZXNwb25zZSAqLwpAQCAtNDksMjYgKzU5LDM5IEBACiAJCS8qIGNvcHkgZnJvbSByaW5nIGJ1ZmZlciB0byB1c2VyIGJ1ZmZlciAqLwogCQl3aGlsZSAobGVuZ3RoID4gMCkgewogCQkJdGlsbF9lbmQgPSBzbmRfZWZ3X3Jlc3BfYnVmX3NpemUgLQotCQkJCSh1bnNpZ25lZCBpbnQpKGVmdy0+cHVsbF9wdHIgLSBlZnctPnJlc3BfYnVmKTsKKwkJCQkodW5zaWduZWQgaW50KShwdWxsX3B0ciAtIGVmdy0+cmVzcF9idWYpOwogCQkJdGlsbF9lbmQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbmd0aCwgdGlsbF9lbmQpOwogCi0JCQlpZiAoY29weV90b191c2VyKGJ1ZiwgZWZ3LT5wdWxsX3B0ciwgdGlsbF9lbmQpKQorCQkJc3Bpbl91bmxvY2tfaXJxKCZlZnctPmxvY2spOworCisJCQlpZiAoY29weV90b191c2VyKGJ1ZiwgcHVsbF9wdHIsIHRpbGxfZW5kKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQkJZWZ3LT5wdWxsX3B0ciArPSB0aWxsX2VuZDsKLQkJCWlmIChlZnctPnB1bGxfcHRyID49IGVmdy0+cmVzcF9idWYgKwotCQkJCQkgICAgIHNuZF9lZndfcmVzcF9idWZfc2l6ZSkKLQkJCQllZnctPnB1bGxfcHRyIC09IHNuZF9lZndfcmVzcF9idWZfc2l6ZTsKKwkJCXNwaW5fbG9ja19pcnEoJmVmdy0+bG9jayk7CisKKwkJCXB1bGxfcHRyICs9IHRpbGxfZW5kOworCQkJaWYgKHB1bGxfcHRyID49IGVmdy0+cmVzcF9idWYgKyBzbmRfZWZ3X3Jlc3BfYnVmX3NpemUpCisJCQkJcHVsbF9wdHIgLT0gc25kX2Vmd19yZXNwX2J1Zl9zaXplOwogCiAJCQlsZW5ndGggLT0gdGlsbF9lbmQ7CiAJCQlidWYgKz0gdGlsbF9lbmQ7CiAJCQljb3VudCArPSB0aWxsX2VuZDsKIAkJCXJlbWFpbmVkIC09IHRpbGxfZW5kOwogCQl9Ci0KLQkJZWZ3LT5yZXNwX3F1ZXVlcy0tOwogCX0KIAorCS8qCisJICogQWxsIG9mIHRhc2tzIGNhbiByZWFkIGZyb20gdGhlIGJ1ZmZlciBuZWFybHkgc2ltdWx0YW5lb3VzbHksIGJ1dCB0aGUKKwkgKiBsYXN0IHBvc2l0aW9uIGZvciBlYWNoIHRhc2sgaXMgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB0aGUgbGVuZ3RoIG9mCisJICogZ2l2ZW4gYnVmZmVyLiBIZXJlLCBmb3Igc2ltcGxpY2l0eSwgYSBwb3NpdGlvbiBvZiBidWZmZXIgaXMgc2V0IGJ5CisJICogdGhlIGxhdGVzdCB0YXNrLiBJdCdzIGJldHRlciBmb3IgYSBsaXN0ZW5pbmcgYXBwbGljYXRpb24gdG8gYWxsb3cgb25lCisJICogdGhyZWFkIHRvIHJlYWQgZnJvbSB0aGUgYnVmZmVyLiBVbmxlc3MsIGVhY2ggdGFzayBjYW4gcmVhZCBkaWZmZXJlbnQKKwkgKiBzZXF1ZW5jZSBvZiByZXNwb25zZXMgZGVwZW5kaW5nIG9uIHZhcmlhdGlvbiBvZiBidWZmZXIgbGVuZ3RoLgorCSAqLworCWVmdy0+cHVsbF9wdHIgPSBwdWxsX3B0cjsKKworCXNwaW5fdW5sb2NrX2lycSgmZWZ3LT5sb2NrKTsKKwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtNzYsMTQgKzk5LDE3IEBACiBod2RlcF9yZWFkX2xvY2tlZChzdHJ1Y3Qgc25kX2VmdyAqZWZ3LCBjaGFyIF9fdXNlciAqYnVmLCBsb25nIGNvdW50LAogCQkgIGxvZmZfdCAqb2Zmc2V0KQogewotCXVuaW9uIHNuZF9maXJld2lyZV9ldmVudCBldmVudDsKKwl1bmlvbiBzbmRfZmlyZXdpcmVfZXZlbnQgZXZlbnQgPSB7CisJCS5sb2NrX3N0YXR1cy50eXBlID0gU05EUlZfRklSRVdJUkVfRVZFTlRfTE9DS19TVEFUVVMsCisJfTsKIAotCW1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihldmVudCkpOworCXNwaW5fbG9ja19pcnEoJmVmdy0+bG9jayk7CiAKLQlldmVudC5sb2NrX3N0YXR1cy50eXBlID0gU05EUlZfRklSRVdJUkVfRVZFTlRfTE9DS19TVEFUVVM7CiAJZXZlbnQubG9ja19zdGF0dXMuc3RhdHVzID0gKGVmdy0+ZGV2X2xvY2tfY291bnQgPiAwKTsKIAllZnctPmRldl9sb2NrX2NoYW5nZWQgPSBmYWxzZTsKIAorCXNwaW5fdW5sb2NrX2lycSgmZWZ3LT5sb2NrKTsKKwogCWNvdW50ID0gbWluX3QobG9uZywgY291bnQsIHNpemVvZihldmVudC5sb2NrX3N0YXR1cykpOwogCiAJaWYgKGNvcHlfdG9fdXNlcihidWYsICZldmVudCwgY291bnQpKQpAQCAtOTgsMTAgKzEyNCwxNSBAQAogewogCXN0cnVjdCBzbmRfZWZ3ICplZncgPSBod2RlcC0+cHJpdmF0ZV9kYXRhOwogCURFRklORV9XQUlUKHdhaXQpOworCWJvb2wgZGV2X2xvY2tfY2hhbmdlZDsKKwlib29sIHF1ZXVlZDsKIAogCXNwaW5fbG9ja19pcnEoJmVmdy0+bG9jayk7CiAKLQl3aGlsZSAoKCFlZnctPmRldl9sb2NrX2NoYW5nZWQpICYmIChlZnctPnJlc3BfcXVldWVzID09IDApKSB7CisJZGV2X2xvY2tfY2hhbmdlZCA9IGVmdy0+ZGV2X2xvY2tfY2hhbmdlZDsKKwlxdWV1ZWQgPSBlZnctPnB1c2hfcHRyICE9IGVmdy0+cHVsbF9wdHI7CisKKwl3aGlsZSAoIWRldl9sb2NrX2NoYW5nZWQgJiYgIXF1ZXVlZCkgewogCQlwcmVwYXJlX3RvX3dhaXQoJmVmdy0+aHdkZXBfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCXNwaW5fdW5sb2NrX2lycSgmZWZ3LT5sb2NrKTsKIAkJc2NoZWR1bGUoKTsKQEAgLTEwOSwxNSArMTQwLDE3IEBACiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAJCXNwaW5fbG9ja19pcnEoJmVmdy0+bG9jayk7CisJCWRldl9sb2NrX2NoYW5nZWQgPSBlZnctPmRldl9sb2NrX2NoYW5nZWQ7CisJCXF1ZXVlZCA9IGVmdy0+cHVzaF9wdHIgIT0gZWZ3LT5wdWxsX3B0cjsKIAl9CiAKLQlpZiAoZWZ3LT5kZXZfbG9ja19jaGFuZ2VkKQotCQljb3VudCA9IGh3ZGVwX3JlYWRfbG9ja2VkKGVmdywgYnVmLCBjb3VudCwgb2Zmc2V0KTsKLQllbHNlIGlmIChlZnctPnJlc3BfcXVldWVzID4gMCkKLQkJY291bnQgPSBod2RlcF9yZWFkX3Jlc3BfYnVmKGVmdywgYnVmLCBjb3VudCwgb2Zmc2V0KTsKLQogCXNwaW5fdW5sb2NrX2lycSgmZWZ3LT5sb2NrKTsKIAorCWlmIChkZXZfbG9ja19jaGFuZ2VkKQorCQljb3VudCA9IGh3ZGVwX3JlYWRfbG9ja2VkKGVmdywgYnVmLCBjb3VudCwgb2Zmc2V0KTsKKwllbHNlIGlmIChxdWV1ZWQpCisJCWNvdW50ID0gaHdkZXBfcmVhZF9yZXNwX2J1ZihlZncsIGJ1ZiwgY291bnQsIG9mZnNldCk7CisKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTE2MCw3ICsxOTMsNyBAQAogCXBvbGxfd2FpdChmaWxlLCAmZWZ3LT5od2RlcF93YWl0LCB3YWl0KTsKIAogCXNwaW5fbG9ja19pcnEoJmVmdy0+bG9jayk7Ci0JaWYgKGVmdy0+ZGV2X2xvY2tfY2hhbmdlZCB8fCAoZWZ3LT5yZXNwX3F1ZXVlcyA+IDApKQorCWlmIChlZnctPmRldl9sb2NrX2NoYW5nZWQgfHwgZWZ3LT5wdWxsX3B0ciAhPSBlZnctPnB1c2hfcHRyKQogCQlldmVudHMgPSBQT0xMSU4gfCBQT0xMUkROT1JNOwogCWVsc2UKIAkJZXZlbnRzID0gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2ZpcmV3b3Jrcy9maXJld29ya3NfcHJvYy5jIGIvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrc19wcm9jLmMKaW5kZXggMDYzOWRjYi4uYmViMGEwZiAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrc19wcm9jLmMKKysrIGIvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrc19wcm9jLmMKQEAgLTE4OCw4ICsxODgsOCBAQAogCWVsc2UKIAkJY29uc3VtZWQgPSAodW5zaWduZWQgaW50KShlZnctPnB1c2hfcHRyIC0gZWZ3LT5wdWxsX3B0cik7CiAKLQlzbmRfaXByaW50ZihidWZmZXIsICIlZCAlZC8lZFxuIiwKLQkJICAgIGVmdy0+cmVzcF9xdWV1ZXMsIGNvbnN1bWVkLCBzbmRfZWZ3X3Jlc3BfYnVmX3NpemUpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiVkLyVkXG4iLAorCQkgICAgY29uc3VtZWQsIHNuZF9lZndfcmVzcF9idWZfc2l6ZSk7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9maXJld29ya3MvZmlyZXdvcmtzX3RyYW5zYWN0aW9uLmMgYi9zb3VuZC9maXJld2lyZS9maXJld29ya3MvZmlyZXdvcmtzX3RyYW5zYWN0aW9uLmMKaW5kZXggZjU1MDgwOC4uMzZhMDhiYSAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrc190cmFuc2FjdGlvbi5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2ZpcmV3b3Jrcy9maXJld29ya3NfdHJhbnNhY3Rpb24uYwpAQCAtMTIxLDExICsxMjEsMTEgQEAKIAlzaXplX3QgY2FwYWNpdHksIHRpbGxfZW5kOwogCXN0cnVjdCBzbmRfZWZ3X3RyYW5zYWN0aW9uICp0OwogCi0Jc3Bpbl9sb2NrX2lycSgmZWZ3LT5sb2NrKTsKLQogCXQgPSAoc3RydWN0IHNuZF9lZndfdHJhbnNhY3Rpb24gKilkYXRhOwogCWxlbmd0aCA9IG1pbl90KHNpemVfdCwgYmUzMl90b19jcHUodC0+bGVuZ3RoKSAqIHNpemVvZih1MzIpLCBsZW5ndGgpOwogCisJc3Bpbl9sb2NrX2lycSgmZWZ3LT5sb2NrKTsKKwogCWlmIChlZnctPnB1c2hfcHRyIDwgZWZ3LT5wdWxsX3B0cikKIAkJY2FwYWNpdHkgPSAodW5zaWduZWQgaW50KShlZnctPnB1bGxfcHRyIC0gZWZ3LT5wdXNoX3B0cik7CiAJZWxzZQpAQCAtMTU1LDcgKzE1NSw2IEBACiAJfQogCiAJLyogZm9yIGh3ZGVwICovCi0JZWZ3LT5yZXNwX3F1ZXVlcysrOwogCXdha2VfdXAoJmVmdy0+aHdkZXBfd2FpdCk7CiAKIAkqcmNvZGUgPSBSQ09ERV9DT01QTEVURTsKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL294Zncvb3hmdy1wY20uYyBiL3NvdW5kL2ZpcmV3aXJlL294Zncvb3hmdy1wY20uYwppbmRleCA4ZDIzMzQxLi5mMzUzMGY4IDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9veGZ3L294ZnctcGNtLmMKKysrIGIvc291bmQvZmlyZXdpcmUvb3hmdy9veGZ3LXBjbS5jCkBAIC0zODgsNyArMzg4LDcgQEAKIAogaW50IHNuZF9veGZ3X2NyZWF0ZV9wY20oc3RydWN0IHNuZF9veGZ3ICpveGZ3KQogewotCXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgY2FwdHVyZV9vcHMgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBjYXB0dXJlX29wcyA9IHsKIAkJLm9wZW4gICAgICA9IHBjbV9vcGVuLAogCQkuY2xvc2UgICAgID0gcGNtX2Nsb3NlLAogCQkuaW9jdGwgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCkBAIC00MDAsNyArNDAwLDcgQEAKIAkJLnBhZ2UgICAgICA9IHNuZF9wY21fbGliX2dldF92bWFsbG9jX3BhZ2UsCiAJCS5tbWFwICAgICAgPSBzbmRfcGNtX2xpYl9tbWFwX3ZtYWxsb2MsCiAJfTsKLQlzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHBsYXliYWNrX29wcyA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHBsYXliYWNrX29wcyA9IHsKIAkJLm9wZW4gICAgICA9IHBjbV9vcGVuLAogCQkuY2xvc2UgICAgID0gcGNtX2Nsb3NlLAogCQkuaW9jdGwgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS90YXNjYW0vdGFzY2FtLWh3ZGVwLmMgYi9zb3VuZC9maXJld2lyZS90YXNjYW0vdGFzY2FtLWh3ZGVwLmMKaW5kZXggMTMxMjY3Yy4uMTA2NDA2YyAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvdGFzY2FtL3Rhc2NhbS1od2RlcC5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL3Rhc2NhbS90YXNjYW0taHdkZXAuYwpAQCAtMTYsMzEgKzE2LDE0IEBACiAKICNpbmNsdWRlICJ0YXNjYW0uaCIKIAotc3RhdGljIGxvbmcgaHdkZXBfcmVhZF9sb2NrZWQoc3RydWN0IHNuZF90c2NtICp0c2NtLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgICAgbG9uZyBjb3VudCkKLXsKLQl1bmlvbiBzbmRfZmlyZXdpcmVfZXZlbnQgZXZlbnQ7Ci0KLQltZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKLQotCWV2ZW50LmxvY2tfc3RhdHVzLnR5cGUgPSBTTkRSVl9GSVJFV0lSRV9FVkVOVF9MT0NLX1NUQVRVUzsKLQlldmVudC5sb2NrX3N0YXR1cy5zdGF0dXMgPSAodHNjbS0+ZGV2X2xvY2tfY291bnQgPiAwKTsKLQl0c2NtLT5kZXZfbG9ja19jaGFuZ2VkID0gZmFsc2U7Ci0KLQljb3VudCA9IG1pbl90KGxvbmcsIGNvdW50LCBzaXplb2YoZXZlbnQubG9ja19zdGF0dXMpKTsKLQotCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmZXZlbnQsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KIHN0YXRpYyBsb25nIGh3ZGVwX3JlYWQoc3RydWN0IHNuZF9od2RlcCAqaHdkZXAsIGNoYXIgX191c2VyICpidWYsIGxvbmcgY291bnQsCiAJCSAgICAgICBsb2ZmX3QgKm9mZnNldCkKIHsKIAlzdHJ1Y3Qgc25kX3RzY20gKnRzY20gPSBod2RlcC0+cHJpdmF0ZV9kYXRhOwogCURFRklORV9XQUlUKHdhaXQpOwotCXVuaW9uIHNuZF9maXJld2lyZV9ldmVudCBldmVudDsKKwl1bmlvbiBzbmRfZmlyZXdpcmVfZXZlbnQgZXZlbnQgPSB7CisJCS5sb2NrX3N0YXR1cy50eXBlID0gU05EUlZfRklSRVdJUkVfRVZFTlRfTE9DS19TVEFUVVMsCisJfTsKIAogCXNwaW5fbG9ja19pcnEoJnRzY20tPmxvY2spOwogCkBAIC01NCwxMCArMzcsMTYgQEAKIAkJc3Bpbl9sb2NrX2lycSgmdHNjbS0+bG9jayk7CiAJfQogCi0JbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKGV2ZW50KSk7Ci0JY291bnQgPSBod2RlcF9yZWFkX2xvY2tlZCh0c2NtLCBidWYsIGNvdW50KTsKKwlldmVudC5sb2NrX3N0YXR1cy5zdGF0dXMgPSAodHNjbS0+ZGV2X2xvY2tfY291bnQgPiAwKTsKKwl0c2NtLT5kZXZfbG9ja19jaGFuZ2VkID0gZmFsc2U7CisKIAlzcGluX3VubG9ja19pcnEoJnRzY20tPmxvY2spOwogCisJY291bnQgPSBtaW5fdChsb25nLCBjb3VudCwgc2l6ZW9mKGV2ZW50LmxvY2tfc3RhdHVzKSk7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgJmV2ZW50LCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCiAJcmV0dXJuIGNvdW50OwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS90YXNjYW0vdGFzY2FtLXBjbS5jIGIvc291bmQvZmlyZXdpcmUvdGFzY2FtL3Rhc2NhbS1wY20uYwppbmRleCAzODBkM2RiLi43OWRiMWI2IDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS90YXNjYW0vdGFzY2FtLXBjbS5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL3Rhc2NhbS90YXNjYW0tcGNtLmMKQEAgLTI2OCw3ICsyNjgsNyBAQAogCXJldHVybiBhbWR0cF9zdHJlYW1fcGNtX3BvaW50ZXIoJnRzY20tPnJ4X3N0cmVhbSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgcGNtX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBwY21fY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4JCT0gcGNtX29wZW4sCiAJLmNsb3NlCQk9IHBjbV9jbG9zZSwKIAkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCkBAIC0yODAsNyArMjgwLDcgQEAKIAkucGFnZQkJPSBzbmRfcGNtX2xpYl9nZXRfdm1hbGxvY19wYWdlLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBwY21fcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBwY21fcGxheWJhY2tfb3BzID0gewogCS5vcGVuCQk9IHBjbV9vcGVuLAogCS5jbG9zZQkJPSBwY21fY2xvc2UsCiAJLmlvY3RsCQk9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvaGRhL2V4dC9oZGFjX2V4dF9jb250cm9sbGVyLmMgYi9zb3VuZC9oZGEvZXh0L2hkYWNfZXh0X2NvbnRyb2xsZXIuYwppbmRleCA4NjBmOGNhLi4yNjE0NjkxIDEwMDY0NAotLS0gYS9zb3VuZC9oZGEvZXh0L2hkYWNfZXh0X2NvbnRyb2xsZXIuYworKysgYi9zb3VuZC9oZGEvZXh0L2hkYWNfZXh0X2NvbnRyb2xsZXIuYwpAQCAtMjksODEgKzI5LDYgQEAKICAqLwogI2RlZmluZSBIREFDX01BWF9DQVBTIDEwCiAKLS8qKgotICogc25kX2hkYWNfZXh0X2J1c19wYXJzZV9jYXBhYmlsaXRpZXMgLSBwYXJzZSBjYXBhYmxpdHkgc3RydWN0dXJlCi0gKiBAZWJ1czogdGhlIHBvaW50ZXIgdG8gZXh0ZW5kZWQgYnVzIG9iamVjdAotICoKLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCi0gKi8KLWludCBzbmRfaGRhY19leHRfYnVzX3BhcnNlX2NhcGFiaWxpdGllcyhzdHJ1Y3QgaGRhY19leHRfYnVzICplYnVzKQotewotCXVuc2lnbmVkIGludCBjdXJfY2FwOwotCXVuc2lnbmVkIGludCBvZmZzZXQ7Ci0Jc3RydWN0IGhkYWNfYnVzICpidXMgPSAmZWJ1cy0+YnVzOwotCXVuc2lnbmVkIGludCBjb3VudGVyID0gMDsKLQotCW9mZnNldCA9IHNuZF9oZGFjX2NoaXBfcmVhZGwoYnVzLCBMTENIKTsKLQotCS8qIExldHMgd2FsayB0aGUgbGlua2VkIGNhcGFiaWxpdGllcyBsaXN0ICovCi0JZG8gewotCQljdXJfY2FwID0gX3NuZF9oZGFjX2NoaXBfcmVhZChsLCBidXMsIG9mZnNldCk7Ci0KLQkJZGV2X2RiZyhidXMtPmRldiwgIkNhcGFiaWxpdHkgdmVyc2lvbjogMHgleFxuIiwKLQkJCQkoKGN1cl9jYXAgJiBBWlhfQ0FQX0hEUl9WRVJfTUFTSykgPj4gQVpYX0NBUF9IRFJfVkVSX09GRikpOwotCi0JCWRldl9kYmcoYnVzLT5kZXYsICJIREEgY2FwYWJpbGl0eSBJRDogMHgleFxuIiwKLQkJCQkoY3VyX2NhcCAmIEFaWF9DQVBfSERSX0lEX01BU0spID4+IEFaWF9DQVBfSERSX0lEX09GRik7Ci0KLQkJc3dpdGNoICgoY3VyX2NhcCAmIEFaWF9DQVBfSERSX0lEX01BU0spID4+IEFaWF9DQVBfSERSX0lEX09GRikgewotCQljYXNlIEFaWF9NTF9DQVBfSUQ6Ci0JCQlkZXZfZGJnKGJ1cy0+ZGV2LCAiRm91bmQgTUwgY2FwYWJpbGl0eVxuIik7Ci0JCQllYnVzLT5tbGNhcCA9IGJ1cy0+cmVtYXBfYWRkciArIG9mZnNldDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQVpYX0dUU19DQVBfSUQ6Ci0JCQlkZXZfZGJnKGJ1cy0+ZGV2LCAiRm91bmQgR1RTIGNhcGFiaWxpdHkgb2Zmc2V0PSV4XG4iLCBvZmZzZXQpOwotCQkJZWJ1cy0+Z3RzY2FwID0gYnVzLT5yZW1hcF9hZGRyICsgb2Zmc2V0OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBWlhfUFBfQ0FQX0lEOgotCQkJLyogUFAgY2FwYWJpbGl0eSBmb3VuZCwgdGhlIEF1ZGlvIERTUCBpcyBwcmVzZW50ICovCi0JCQlkZXZfZGJnKGJ1cy0+ZGV2LCAiRm91bmQgUFAgY2FwYWJpbGl0eSBvZmZzZXQ9JXhcbiIsIG9mZnNldCk7Ci0JCQllYnVzLT5wcGNhcCA9IGJ1cy0+cmVtYXBfYWRkciArIG9mZnNldDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQVpYX1NQQl9DQVBfSUQ6Ci0JCQkvKiBTUElCIGNhcGFiaWxpdHkgZm91bmQsIGhhbmRsZXIgZnVuY3Rpb24gKi8KLQkJCWRldl9kYmcoYnVzLT5kZXYsICJGb3VuZCBTUEIgY2FwYWJpbGl0eVxuIik7Ci0JCQllYnVzLT5zcGJjYXAgPSBidXMtPnJlbWFwX2FkZHIgKyBvZmZzZXQ7Ci0JCQlicmVhazsKLQotCQljYXNlIEFaWF9EUlNNX0NBUF9JRDoKLQkJCS8qIERNQSByZXN1bWUgIGNhcGFiaWxpdHkgZm91bmQsIGhhbmRsZXIgZnVuY3Rpb24gKi8KLQkJCWRldl9kYmcoYnVzLT5kZXYsICJGb3VuZCBEUlNNIGNhcGFiaWxpdHlcbiIpOwotCQkJZWJ1cy0+ZHJzbWNhcCA9IGJ1cy0+cmVtYXBfYWRkciArIG9mZnNldDsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlkZXZfZGJnKGJ1cy0+ZGV2LCAiVW5rbm93biBjYXBhYmlsaXR5ICVkXG4iLCBjdXJfY2FwKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY291bnRlcisrOwotCi0JCWlmIChjb3VudGVyID4gSERBQ19NQVhfQ0FQUykgewotCQkJZGV2X2VycihidXMtPmRldiwgIldlIGV4Y2VlZGVkIEhEQUMgRXh0IGNhcGFibGl0aWVzISEhXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogcmVhZCB0aGUgb2Zmc2V0IG9mIG5leHQgY2FwYWJpaXR5ICovCi0JCW9mZnNldCA9IGN1cl9jYXAgJiBBWlhfQ0FQX0hEUl9OWFRfUFRSX01BU0s7Ci0KLQl9IHdoaWxlIChvZmZzZXQpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhY19leHRfYnVzX3BhcnNlX2NhcGFiaWxpdGllcyk7Ci0KIC8qCiAgKiBwcm9jZXNzaW5nIHBpcGUgaGVscGVycyAtIHRoZXNlIGhlbHBlcnMgYXJlIHVzZWZ1bCBmb3IgZGVhbGluZyB3aXRoIEhEQQogICogbmV3IGNhcGFiaWxpdHkgb2YgcHJvY2Vzc2luZyBwaXBlbGluZXMKQEAgLTExOCwxNSArNDMsMTUgQEAKIHsKIAlzdHJ1Y3QgaGRhY19idXMgKmJ1cyA9ICZlYnVzLT5idXM7CiAKLQlpZiAoIWVidXMtPnBwY2FwKSB7CisJaWYgKCFidXMtPnBwY2FwKSB7CiAJCWRldl9lcnIoYnVzLT5kZXYsICJBZGRyZXNzIG9mIFBQIGNhcGFiaWxpdHkgaXMgTlVMTCIpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKGVuYWJsZSkKLQkJc25kX2hkYWNfdXBkYXRlbChlYnVzLT5wcGNhcCwgQVpYX1JFR19QUF9QUENUTCwgMCwgQVpYX1BQQ1RMX0dQUk9DRU4pOworCQlzbmRfaGRhY191cGRhdGVsKGJ1cy0+cHBjYXAsIEFaWF9SRUdfUFBfUFBDVEwsIDAsIEFaWF9QUENUTF9HUFJPQ0VOKTsKIAllbHNlCi0JCXNuZF9oZGFjX3VwZGF0ZWwoZWJ1cy0+cHBjYXAsIEFaWF9SRUdfUFBfUFBDVEwsIEFaWF9QUENUTF9HUFJPQ0VOLCAwKTsKKwkJc25kX2hkYWNfdXBkYXRlbChidXMtPnBwY2FwLCBBWlhfUkVHX1BQX1BQQ1RMLCBBWlhfUFBDVExfR1BST0NFTiwgMCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhY19leHRfYnVzX3BwY2FwX2VuYWJsZSk7CiAKQEAgLTEzOSwxNSArNjQsMTUgQEAKIHsKIAlzdHJ1Y3QgaGRhY19idXMgKmJ1cyA9ICZlYnVzLT5idXM7CiAKLQlpZiAoIWVidXMtPnBwY2FwKSB7CisJaWYgKCFidXMtPnBwY2FwKSB7CiAJCWRldl9lcnIoYnVzLT5kZXYsICJBZGRyZXNzIG9mIFBQIGNhcGFiaWxpdHkgaXMgTlVMTFxuIik7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAoZW5hYmxlKQotCQlzbmRfaGRhY191cGRhdGVsKGVidXMtPnBwY2FwLCBBWlhfUkVHX1BQX1BQQ1RMLCAwLCBBWlhfUFBDVExfUElFKTsKKwkJc25kX2hkYWNfdXBkYXRlbChidXMtPnBwY2FwLCBBWlhfUkVHX1BQX1BQQ1RMLCAwLCBBWlhfUFBDVExfUElFKTsKIAllbHNlCi0JCXNuZF9oZGFjX3VwZGF0ZWwoZWJ1cy0+cHBjYXAsIEFaWF9SRUdfUFBfUFBDVEwsIEFaWF9QUENUTF9QSUUsIDApOworCQlzbmRfaGRhY191cGRhdGVsKGJ1cy0+cHBjYXAsIEFaWF9SRUdfUFBfUFBDVEwsIEFaWF9QUENUTF9QSUUsIDApOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfZXh0X2J1c19wcGNhcF9pbnRfZW5hYmxlKTsKIApAQCAtMTcxLDcgKzk2LDcgQEAKIAlzdHJ1Y3QgaGRhY19leHRfbGluayAqaGxpbms7CiAJc3RydWN0IGhkYWNfYnVzICpidXMgPSAmZWJ1cy0+YnVzOwogCi0JbGlua19jb3VudCA9IHJlYWRsKGVidXMtPm1sY2FwICsgQVpYX1JFR19NTF9NTENEKSArIDE7CisJbGlua19jb3VudCA9IHJlYWRsKGJ1cy0+bWxjYXAgKyBBWlhfUkVHX01MX01MQ0QpICsgMTsKIAogCWRldl9kYmcoYnVzLT5kZXYsICJJbiAlcyBMaW5rIGNvdW50OiAlZFxuIiwgX19mdW5jX18sIGxpbmtfY291bnQpOwogCkBAIC0xODEsNyArMTA2LDcgQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCQlobGluay0+aW5kZXggPSBpZHg7CiAJCWhsaW5rLT5idXMgPSBidXM7Ci0JCWhsaW5rLT5tbF9hZGRyID0gZWJ1cy0+bWxjYXAgKyBBWlhfTUxfQkFTRSArCisJCWhsaW5rLT5tbF9hZGRyID0gYnVzLT5tbGNhcCArIEFaWF9NTF9CQVNFICsKIAkJCQkJKEFaWF9NTF9JTlRFUlZBTCAqIGlkeCk7CiAJCWhsaW5rLT5sY2FwcyAgPSByZWFkbChobGluay0+bWxfYWRkciArIEFaWF9SRUdfTUxfTENBUCk7CiAJCWhsaW5rLT5sc2RpaWQgPSByZWFkdyhobGluay0+bWxfYWRkciArIEFaWF9SRUdfTUxfTFNESUlEKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2hkYS9leHQvaGRhY19leHRfc3RyZWFtLmMgYi9zb3VuZC9oZGEvZXh0L2hkYWNfZXh0X3N0cmVhbS5jCmluZGV4IDYyNmYzYmIuLjNiZTA1MWFiNSAxMDA2NDQKLS0tIGEvc291bmQvaGRhL2V4dC9oZGFjX2V4dF9zdHJlYW0uYworKysgYi9zb3VuZC9oZGEvZXh0L2hkYWNfZXh0X3N0cmVhbS5jCkBAIC00MCwyNyArNDAsMjcgQEAKIHsKIAlzdHJ1Y3QgaGRhY19idXMgKmJ1cyA9ICZlYnVzLT5idXM7CiAKLQlpZiAoZWJ1cy0+cHBjYXApIHsKLQkJc3RyZWFtLT5wcGhjX2FkZHIgPSBlYnVzLT5wcGNhcCArIEFaWF9QUEhDX0JBU0UgKworCWlmIChidXMtPnBwY2FwKSB7CisJCXN0cmVhbS0+cHBoY19hZGRyID0gYnVzLT5wcGNhcCArIEFaWF9QUEhDX0JBU0UgKwogCQkJCUFaWF9QUEhDX0lOVEVSVkFMICogaWR4OwogCi0JCXN0cmVhbS0+cHBsY19hZGRyID0gZWJ1cy0+cHBjYXAgKyBBWlhfUFBMQ19CQVNFICsKKwkJc3RyZWFtLT5wcGxjX2FkZHIgPSBidXMtPnBwY2FwICsgQVpYX1BQTENfQkFTRSArCiAJCQkJQVpYX1BQTENfTVVMVEkgKiBlYnVzLT5udW1fc3RyZWFtcyArCiAJCQkJQVpYX1BQTENfSU5URVJWQUwgKiBpZHg7CiAJfQogCi0JaWYgKGVidXMtPnNwYmNhcCkgewotCQlzdHJlYW0tPnNwaWJfYWRkciA9IGVidXMtPnNwYmNhcCArIEFaWF9TUEJfQkFTRSArCisJaWYgKGJ1cy0+c3BiY2FwKSB7CisJCXN0cmVhbS0+c3BpYl9hZGRyID0gYnVzLT5zcGJjYXAgKyBBWlhfU1BCX0JBU0UgKwogCQkJCQlBWlhfU1BCX0lOVEVSVkFMICogaWR4ICsKIAkJCQkJQVpYX1NQQl9TUElCOwogCi0JCXN0cmVhbS0+Zmlmb19hZGRyID0gZWJ1cy0+c3BiY2FwICsgQVpYX1NQQl9CQVNFICsKKwkJc3RyZWFtLT5maWZvX2FkZHIgPSBidXMtPnNwYmNhcCArIEFaWF9TUEJfQkFTRSArCiAJCQkJCUFaWF9TUEJfSU5URVJWQUwgKiBpZHggKwogCQkJCQlBWlhfU1BCX01BWEZJRk87CiAJfQogCi0JaWYgKGVidXMtPmRyc21jYXApCi0JCXN0cmVhbS0+ZHBpYnJfYWRkciA9IGVidXMtPmRyc21jYXAgKyBBWlhfRFJTTV9CQVNFICsKKwlpZiAoYnVzLT5kcnNtY2FwKQorCQlzdHJlYW0tPmRwaWJyX2FkZHIgPSBidXMtPmRyc21jYXAgKyBBWlhfRFJTTV9CQVNFICsKIAkJCQkJQVpYX0RSU01fSU5URVJWQUwgKiBpZHg7CiAKIAlzdHJlYW0tPmRlY291cGxlZCA9IGZhbHNlOwpAQCAtMTMxLDEwICsxMzEsMTAgQEAKIAogCXNwaW5fbG9ja19pcnEoJmJ1cy0+cmVnX2xvY2spOwogCWlmIChkZWNvdXBsZSkKLQkJc25kX2hkYWNfdXBkYXRlbChlYnVzLT5wcGNhcCwgQVpYX1JFR19QUF9QUENUTCwgMCwKKwkJc25kX2hkYWNfdXBkYXRlbChidXMtPnBwY2FwLCBBWlhfUkVHX1BQX1BQQ1RMLCAwLAogCQkJCUFaWF9QUENUTF9QUk9DRU4oaHN0cmVhbS0+aW5kZXgpKTsKIAllbHNlCi0JCXNuZF9oZGFjX3VwZGF0ZWwoZWJ1cy0+cHBjYXAsIEFaWF9SRUdfUFBfUFBDVEwsCisJCXNuZF9oZGFjX3VwZGF0ZWwoYnVzLT5wcGNhcCwgQVpYX1JFR19QUF9QUENUTCwKIAkJCQkJQVpYX1BQQ1RMX1BST0NFTihoc3RyZWFtLT5pbmRleCksIDApOwogCXN0cmVhbS0+ZGVjb3VwbGVkID0gZGVjb3VwbGU7CiAJc3Bpbl91bmxvY2tfaXJxKCZidXMtPnJlZ19sb2NrKTsKQEAgLTI1NSw3ICsyNTUsNyBAQAogCXN0cnVjdCBoZGFjX3N0cmVhbSAqc3RyZWFtID0gTlVMTDsKIAlzdHJ1Y3QgaGRhY19idXMgKmhidXMgPSAmZWJ1cy0+YnVzOwogCi0JaWYgKCFlYnVzLT5wcGNhcCkgeworCWlmICghaGJ1cy0+cHBjYXApIHsKIAkJZGV2X2VycihoYnVzLT5kZXYsICJzdHJlYW0gdHlwZSBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMjk2LDcgKzI5Niw3IEBACiAJc3RydWN0IGhkYWNfc3RyZWFtICpzdHJlYW0gPSBOVUxMOwogCXN0cnVjdCBoZGFjX2J1cyAqaGJ1cyA9ICZlYnVzLT5idXM7CiAKLQlpZiAoIWVidXMtPnBwY2FwKSB7CisJaWYgKCFoYnVzLT5wcGNhcCkgewogCQlkZXZfZXJyKGhidXMtPmRldiwgInN0cmVhbSB0eXBlIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC00MjMsMjEgKzQyMywyMSBAQAogCXUzMiByZWdpc3Rlcl9tYXNrID0gMDsKIAlzdHJ1Y3QgaGRhY19idXMgKmJ1cyA9ICZlYnVzLT5idXM7CiAKLQlpZiAoIWVidXMtPnNwYmNhcCkgewotCQlkZXZfZXJyKGJ1cy0+ZGV2LCAiQWRkcmVzcyBvZiBTUEIgY2FwYWJpbGl0eSBpcyBOVUxMIik7CisJaWYgKCFidXMtPnNwYmNhcCkgeworCQlkZXZfZXJyKGJ1cy0+ZGV2LCAiQWRkcmVzcyBvZiBTUEIgY2FwYWJpbGl0eSBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCW1hc2sgfD0gKDEgPDwgaW5kZXgpOwogCi0JcmVnaXN0ZXJfbWFzayA9IHJlYWRsKGVidXMtPnNwYmNhcCArIEFaWF9SRUdfU1BCX1NQQkZDQ1RMKTsKKwlyZWdpc3Rlcl9tYXNrID0gcmVhZGwoYnVzLT5zcGJjYXAgKyBBWlhfUkVHX1NQQl9TUEJGQ0NUTCk7CiAKIAltYXNrIHw9IHJlZ2lzdGVyX21hc2s7CiAKIAlpZiAoZW5hYmxlKQotCQlzbmRfaGRhY191cGRhdGVsKGVidXMtPnNwYmNhcCwgQVpYX1JFR19TUEJfU1BCRkNDVEwsIDAsIG1hc2spOworCQlzbmRfaGRhY191cGRhdGVsKGJ1cy0+c3BiY2FwLCBBWlhfUkVHX1NQQl9TUEJGQ0NUTCwgMCwgbWFzayk7CiAJZWxzZQotCQlzbmRfaGRhY191cGRhdGVsKGVidXMtPnNwYmNhcCwgQVpYX1JFR19TUEJfU1BCRkNDVEwsIG1hc2ssIDApOworCQlzbmRfaGRhY191cGRhdGVsKGJ1cy0+c3BiY2FwLCBBWlhfUkVHX1NQQl9TUEJGQ0NUTCwgbWFzaywgMCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhY19leHRfc3RyZWFtX3NwYmNhcF9lbmFibGUpOwogCkBAIC00NTIsOCArNDUyLDggQEAKIHsKIAlzdHJ1Y3QgaGRhY19idXMgKmJ1cyA9ICZlYnVzLT5idXM7CiAKLQlpZiAoIWVidXMtPnNwYmNhcCkgewotCQlkZXZfZXJyKGJ1cy0+ZGV2LCAiQWRkcmVzcyBvZiBTUEIgY2FwYWJpbGl0eSBpcyBOVUxMIik7CisJaWYgKCFidXMtPnNwYmNhcCkgeworCQlkZXZfZXJyKGJ1cy0+ZGV2LCAiQWRkcmVzcyBvZiBTUEIgY2FwYWJpbGl0eSBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00NzUsOCArNDc1LDggQEAKIHsKIAlzdHJ1Y3QgaGRhY19idXMgKmJ1cyA9ICZlYnVzLT5idXM7CiAKLQlpZiAoIWVidXMtPnNwYmNhcCkgewotCQlkZXZfZXJyKGJ1cy0+ZGV2LCAiQWRkcmVzcyBvZiBTUEIgY2FwYWJpbGl0eSBpcyBOVUxMIik7CisJaWYgKCFidXMtPnNwYmNhcCkgeworCQlkZXZfZXJyKGJ1cy0+ZGV2LCAiQWRkcmVzcyBvZiBTUEIgY2FwYWJpbGl0eSBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01MTUsMjEgKzUxNSwyMSBAQAogCXUzMiByZWdpc3Rlcl9tYXNrID0gMDsKIAlzdHJ1Y3QgaGRhY19idXMgKmJ1cyA9ICZlYnVzLT5idXM7CiAKLQlpZiAoIWVidXMtPmRyc21jYXApIHsKLQkJZGV2X2VycihidXMtPmRldiwgIkFkZHJlc3Mgb2YgRFJTTSBjYXBhYmlsaXR5IGlzIE5VTEwiKTsKKwlpZiAoIWJ1cy0+ZHJzbWNhcCkgeworCQlkZXZfZXJyKGJ1cy0+ZGV2LCAiQWRkcmVzcyBvZiBEUlNNIGNhcGFiaWxpdHkgaXMgTlVMTFxuIik7CiAJCXJldHVybjsKIAl9CiAKIAltYXNrIHw9ICgxIDw8IGluZGV4KTsKIAotCXJlZ2lzdGVyX21hc2sgPSByZWFkbChlYnVzLT5kcnNtY2FwICsgQVpYX1JFR19TUEJfU1BCRkNDVEwpOworCXJlZ2lzdGVyX21hc2sgPSByZWFkbChidXMtPmRyc21jYXAgKyBBWlhfUkVHX1NQQl9TUEJGQ0NUTCk7CiAKIAltYXNrIHw9IHJlZ2lzdGVyX21hc2s7CiAKIAlpZiAoZW5hYmxlKQotCQlzbmRfaGRhY191cGRhdGVsKGVidXMtPmRyc21jYXAsIEFaWF9SRUdfRFJTTV9DVEwsIDAsIG1hc2spOworCQlzbmRfaGRhY191cGRhdGVsKGJ1cy0+ZHJzbWNhcCwgQVpYX1JFR19EUlNNX0NUTCwgMCwgbWFzayk7CiAJZWxzZQotCQlzbmRfaGRhY191cGRhdGVsKGVidXMtPmRyc21jYXAsIEFaWF9SRUdfRFJTTV9DVEwsIG1hc2ssIDApOworCQlzbmRfaGRhY191cGRhdGVsKGJ1cy0+ZHJzbWNhcCwgQVpYX1JFR19EUlNNX0NUTCwgbWFzaywgMCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhY19leHRfc3RyZWFtX2Ryc21fZW5hYmxlKTsKIApAQCAtNTQ0LDggKzU0NCw4IEBACiB7CiAJc3RydWN0IGhkYWNfYnVzICpidXMgPSAmZWJ1cy0+YnVzOwogCi0JaWYgKCFlYnVzLT5kcnNtY2FwKSB7Ci0JCWRldl9lcnIoYnVzLT5kZXYsICJBZGRyZXNzIG9mIERSU00gY2FwYWJpbGl0eSBpcyBOVUxMIik7CisJaWYgKCFidXMtPmRyc21jYXApIHsKKwkJZGV2X2VycihidXMtPmRldiwgIkFkZHJlc3Mgb2YgRFJTTSBjYXBhYmlsaXR5IGlzIE5VTExcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2hkYS9oZGFjX2NvbnRyb2xsZXIuYyBiL3NvdW5kL2hkYS9oZGFjX2NvbnRyb2xsZXIuYwppbmRleCA5ZmVlNDY0Li4wNDMwNjU4IDEwMDY0NAotLS0gYS9zb3VuZC9oZGEvaGRhY19jb250cm9sbGVyLmMKKysrIGIvc291bmQvaGRhL2hkYWNfY29udHJvbGxlci5jCkBAIC0yNTUsNiArMjU1LDgxIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhY19idXNfZ2V0X3Jlc3BvbnNlKTsKIAorI2RlZmluZSBIREFDX01BWF9DQVBTIDEwCisvKioKKyAqIHNuZF9oZGFjX2J1c19wYXJzZV9jYXBhYmlsaXRpZXMgLSBwYXJzZSBjYXBhYmlsaXR5IHN0cnVjdHVyZQorICogQGJ1czogdGhlIHBvaW50ZXIgdG8gYnVzIG9iamVjdAorICoKKyAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK2ludCBzbmRfaGRhY19idXNfcGFyc2VfY2FwYWJpbGl0aWVzKHN0cnVjdCBoZGFjX2J1cyAqYnVzKQoreworCXVuc2lnbmVkIGludCBjdXJfY2FwOworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOworCisJb2Zmc2V0ID0gc25kX2hkYWNfY2hpcF9yZWFkbChidXMsIExMQ0gpOworCisJLyogTGV0cyB3YWxrIHRoZSBsaW5rZWQgY2FwYWJpbGl0aWVzIGxpc3QgKi8KKwlkbyB7CisJCWN1cl9jYXAgPSBfc25kX2hkYWNfY2hpcF9yZWFkKGwsIGJ1cywgb2Zmc2V0KTsKKworCQlkZXZfZGJnKGJ1cy0+ZGV2LCAiQ2FwYWJpbGl0eSB2ZXJzaW9uOiAweCV4XG4iLAorCQkJKGN1cl9jYXAgJiBBWlhfQ0FQX0hEUl9WRVJfTUFTSykgPj4gQVpYX0NBUF9IRFJfVkVSX09GRik7CisKKwkJZGV2X2RiZyhidXMtPmRldiwgIkhEQSBjYXBhYmlsaXR5IElEOiAweCV4XG4iLAorCQkJKGN1cl9jYXAgJiBBWlhfQ0FQX0hEUl9JRF9NQVNLKSA+PiBBWlhfQ0FQX0hEUl9JRF9PRkYpOworCisJCXN3aXRjaCAoKGN1cl9jYXAgJiBBWlhfQ0FQX0hEUl9JRF9NQVNLKSA+PiBBWlhfQ0FQX0hEUl9JRF9PRkYpIHsKKwkJY2FzZSBBWlhfTUxfQ0FQX0lEOgorCQkJZGV2X2RiZyhidXMtPmRldiwgIkZvdW5kIE1MIGNhcGFiaWxpdHlcbiIpOworCQkJYnVzLT5tbGNhcCA9IGJ1cy0+cmVtYXBfYWRkciArIG9mZnNldDsKKwkJCWJyZWFrOworCisJCWNhc2UgQVpYX0dUU19DQVBfSUQ6CisJCQlkZXZfZGJnKGJ1cy0+ZGV2LCAiRm91bmQgR1RTIGNhcGFiaWxpdHkgb2Zmc2V0PSV4XG4iLCBvZmZzZXQpOworCQkJYnVzLT5ndHNjYXAgPSBidXMtPnJlbWFwX2FkZHIgKyBvZmZzZXQ7CisJCQlicmVhazsKKworCQljYXNlIEFaWF9QUF9DQVBfSUQ6CisJCQkvKiBQUCBjYXBhYmlsaXR5IGZvdW5kLCB0aGUgQXVkaW8gRFNQIGlzIHByZXNlbnQgKi8KKwkJCWRldl9kYmcoYnVzLT5kZXYsICJGb3VuZCBQUCBjYXBhYmlsaXR5IG9mZnNldD0leFxuIiwgb2Zmc2V0KTsKKwkJCWJ1cy0+cHBjYXAgPSBidXMtPnJlbWFwX2FkZHIgKyBvZmZzZXQ7CisJCQlicmVhazsKKworCQljYXNlIEFaWF9TUEJfQ0FQX0lEOgorCQkJLyogU1BJQiBjYXBhYmlsaXR5IGZvdW5kLCBoYW5kbGVyIGZ1bmN0aW9uICovCisJCQlkZXZfZGJnKGJ1cy0+ZGV2LCAiRm91bmQgU1BCIGNhcGFiaWxpdHlcbiIpOworCQkJYnVzLT5zcGJjYXAgPSBidXMtPnJlbWFwX2FkZHIgKyBvZmZzZXQ7CisJCQlicmVhazsKKworCQljYXNlIEFaWF9EUlNNX0NBUF9JRDoKKwkJCS8qIERNQSByZXN1bWUgIGNhcGFiaWxpdHkgZm91bmQsIGhhbmRsZXIgZnVuY3Rpb24gKi8KKwkJCWRldl9kYmcoYnVzLT5kZXYsICJGb3VuZCBEUlNNIGNhcGFiaWxpdHlcbiIpOworCQkJYnVzLT5kcnNtY2FwID0gYnVzLT5yZW1hcF9hZGRyICsgb2Zmc2V0OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRldl9kYmcoYnVzLT5kZXYsICJVbmtub3duIGNhcGFiaWxpdHkgJWRcbiIsIGN1cl9jYXApOworCQkJYnJlYWs7CisJCX0KKworCQljb3VudGVyKys7CisKKwkJaWYgKGNvdW50ZXIgPiBIREFDX01BWF9DQVBTKSB7CisJCQlkZXZfZXJyKGJ1cy0+ZGV2LCAiV2UgZXhjZWVkZWQgSERBQyBjYXBhYmlsaXRpZXMhISFcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiByZWFkIHRoZSBvZmZzZXQgb2YgbmV4dCBjYXBhYmlsaXR5ICovCisJCW9mZnNldCA9IGN1cl9jYXAgJiBBWlhfQ0FQX0hEUl9OWFRfUFRSX01BU0s7CisKKwl9IHdoaWxlIChvZmZzZXQpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhY19idXNfcGFyc2VfY2FwYWJpbGl0aWVzKTsKKwogLyoKICAqIExvd2xldmVsIGludGVyZmFjZQogICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWQxODg5LmMgYi9zb3VuZC9wY2kvYWQxODg5LmMKaW5kZXggMWZjNmQ4Yi4uOGMzNjk5MCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FkMTg4OS5jCisrKyBiL3NvdW5kL3BjaS9hZDE4ODkuYwpAQCAtNTcxLDcgKzU3MSw3IEBACiAJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzcy0+cnVudGltZSwgcHRyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYWQxODg5X3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2FkMTg4OV9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPSBzbmRfYWQxODg5X3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0gc25kX2FkMTg4OV9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTU4Miw3ICs1ODIsNyBAQAogCS5wb2ludGVyID0gc25kX2FkMTg4OV9wbGF5YmFja19wb2ludGVyLCAKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2FkMTg4OV9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2FkMTg4OV9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9IHNuZF9hZDE4ODlfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9IHNuZF9hZDE4ODlfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYyBiL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYwppbmRleCAzNjQ3MGFmLi45MmI4MTllIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMKKysrIGIvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jCkBAIC0xNDA4LDYgKzE0MDgsNyBAQAogCXNwaW5fdW5sb2NrKCZjb2RlYy0+cmVnX2xvY2spOwogCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgInBsYXliYWNrIHBvaW50ZXIgcmV0dXJuZWQgY3NvPSV4aC5cbiIsIGNzbyk7CiAKKwljc28gJT0gcnVudGltZS0+YnVmZmVyX3NpemU7CiAJcmV0dXJuIGNzbzsKIH0KIApAQCAtMTQyOCw2ICsxNDI5LDcgQEAKIAljc28gPSBpbncoQUxJX1JFRyhjb2RlYywgQUxJX0NTT19BTFBIQV9GTVMgKyAyKSk7CiAJc3Bpbl91bmxvY2soJmNvZGVjLT5yZWdfbG9jayk7CiAKKwljc28gJT0gcnVudGltZS0+YnVmZmVyX3NpemU7CiAJcmV0dXJuIGNzbzsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FsczMwMC5jIGIvc291bmQvcGNpL2FsczMwMC5jCmluZGV4IGFkZDMxNzYuLmFiNzU2MDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hbHMzMDAuYworKysgYi9zb3VuZC9wY2kvYWxzMzAwLmMKQEAgLTU2Myw3ICs1NjMsNyBAQAogCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBjdXJyZW50X3B0cik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2FsczMwMF9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hbHMzMDBfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9hbHMzMDBfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfYWxzMzAwX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtNTc0LDcgKzU3NCw3IEBACiAJLnBvaW50ZXIgPQlzbmRfYWxzMzAwX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hbHMzMDBfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hbHMzMDBfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2FsczMwMF9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX2FsczMwMF9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FsczQwMDAuYyBiL3NvdW5kL3BjaS9hbHM0MDAwLmMKaW5kZXggZmYzOWEwYy4uZWRhYmUxMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FsczQwMDAuYworKysgYi9zb3VuZC9wY2kvYWxzNDAwMC5jCkBAIC02NzIsNyArNjcyLDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYWxzNDAwMF9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hbHM0MDAwX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfYWxzNDAwMF9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF9hbHM0MDAwX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtNjgzLDcgKzY4Myw3IEBACiAJLnBvaW50ZXIgPQlzbmRfYWxzNDAwMF9wbGF5YmFja19wb2ludGVyCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hbHM0MDAwX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYWxzNDAwMF9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfYWxzNDAwMF9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX2FsczQwMDBfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hc2locGkvYXNpaHBpLmMgYi9zb3VuZC9wY2kvYXNpaHBpL2FzaWhwaS5jCmluZGV4IDEwMzllY2MuLjk3NmEzZDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hc2locGkvYXNpaHBpLmMKKysrIGIvc291bmQvcGNpL2FzaWhwaS9hc2locGkuYwpAQCAtMTEzOCw3ICsxMTM4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2FyZF9hc2locGlfcGxheWJhY2tfbW1hcF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYXJkX2FzaWhwaV9wbGF5YmFja19tbWFwX29wcyA9IHsKIAkub3BlbiA9IHNuZF9jYXJkX2FzaWhwaV9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9IHNuZF9jYXJkX2FzaWhwaV9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPSBzbmRfY2FyZF9hc2locGlfcGxheWJhY2tfaW9jdGwsCkBAIC0xMzA1LDcgKzEzMDUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYXJkX2FzaWhwaV9jYXB0dXJlX21tYXBfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2FyZF9hc2locGlfY2FwdHVyZV9tbWFwX29wcyA9IHsKIAkub3BlbiA9IHNuZF9jYXJkX2FzaWhwaV9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0gc25kX2NhcmRfYXNpaHBpX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0gc25kX2NhcmRfYXNpaHBpX2NhcHR1cmVfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXNpaHBpL2hwaWZ1bmMuYyBiL3NvdW5kL3BjaS9hc2locGkvaHBpZnVuYy5jCmluZGV4IDUxMGU1NmMuLmY5YjU3NjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hc2locGkvaHBpZnVuYy5jCisrKyBiL3NvdW5kL3BjaS9hc2locGkvaHBpZnVuYy5jCkBAIC0yMzIzLDExICsyMzIzLDggQEAKIHUxNiBocGlfc2FtcGxlX2Nsb2NrX3F1ZXJ5X2xvY2FsX3JhdGUoY29uc3QgdTMyIGhfY2xvY2ssIGNvbnN0IHUzMiBpbmRleCwKIAl1MzIgKnByYXRlKQogewotCXUxNiBlcnI7Ci0JZXJyID0gaHBpX2NvbnRyb2xfcXVlcnkoaF9jbG9jaywgSFBJX1NBTVBMRUNMT0NLX0xPQ0FMX1NBTVBMRVJBVEUsCi0JCWluZGV4LCAwLCBwcmF0ZSk7Ci0KLQlyZXR1cm4gZXJyOworCXJldHVybiBocGlfY29udHJvbF9xdWVyeShoX2Nsb2NrLCBIUElfU0FNUExFQ0xPQ0tfTE9DQUxfU0FNUExFUkFURSwKKwkJCQkgaW5kZXgsIDAsIHByYXRlKTsKIH0KIAogdTE2IGhwaV9zYW1wbGVfY2xvY2tfc2V0X2xvY2FsX3JhdGUodTMyIGhfY29udHJvbCwgdTMyIHNhbXBsZV9yYXRlKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F0aWl4cC5jIGIvc291bmQvcGNpL2F0aWl4cC5jCmluZGV4IDJjZTAwMjIuLmE0MGM5MTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdGlpeHAuYworKysgYi9zb3VuZC9wY2kvYXRpaXhwLmMKQEAgLTExNDgsNyArMTE0OCw3IEBACiB9CiAKIC8qIEFDOTcgcGxheWJhY2sgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F0aWl4cF9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hdGlpeHBfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9hdGlpeHBfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfYXRpaXhwX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTE2MCw3ICsxMTYwLDcgQEAKIH07CiAKIC8qIEFDOTcgY2FwdHVyZSAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXRpaXhwX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXRpaXhwX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9hdGlpeHBfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9hdGlpeHBfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTExNzIsNyArMTE3Miw3IEBACiB9OwogCiAvKiBTUERJRiBwbGF5YmFjayAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXRpaXhwX3NwZGlmX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F0aWl4cF9zcGRpZl9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2F0aWl4cF9zcGRpZl9vcGVuLAogCS5jbG9zZSA9CXNuZF9hdGlpeHBfc3BkaWZfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMgYi9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMKaW5kZXggYzUzNDU1Mi4uNDAxNTJmZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jCisrKyBiL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYwpAQCAtOTQ3LDcgKzk0Nyw3IEBACiAKIAogLyogQUM5NyBwbGF5YmFjayAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXRpaXhwX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F0aWl4cF9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2F0aWl4cF9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF9hdGlpeHBfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC05NTksNyArOTU5LDcgQEAKIH07CiAKIC8qIEFDOTcgY2FwdHVyZSAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXRpaXhwX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXRpaXhwX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9hdGlpeHBfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9hdGlpeHBfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX2NvcmUuYyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX2NvcmUuYwppbmRleCBkMzEyNWMxLi5lMWFmMjRmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9jb3JlLmMKKysrIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfY29yZS5jCkBAIC0xMDQzLDcgKzEwNDMsNyBAQAogCWZvciAoeCA9IE5SX0FEQiAtIDE7IHggPj0gMDsgeC0tKSB7CiAJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBhZGRyLCAoRklGT19VMCB8IEZJRk9fVTEpKTsKIAkJaWYgKGh3cmVhZCh2b3J0ZXgtPm1taW8sIGFkZHIpICE9IChGSUZPX1UwIHwgRklGT19VMSkpCi0JCQlkZXZfZXJyKHZvcnRleC0+Y2FyZC0+ZGV2LCAiYmFkIGFkYiBmaWZvIHJlc2V0ISIpOworCQkJZGV2X2Vycih2b3J0ZXgtPmNhcmQtPmRldiwgImJhZCBhZGIgZmlmbyByZXNldCFcbiIpOwogCQl2b3J0ZXhfZmlmb19jbGVhcmFkYmRhdGEodm9ydGV4LCB4LCBGSUZPX1NJWkUpOwogCQlhZGRyIC09IDQ7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F3Mi9hdzItYWxzYS5jIGIvc291bmQvcGNpL2F3Mi9hdzItYWxzYS5jCmluZGV4IDE2NzcxNDMuLjU3YmJiODcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdzIvYXcyLWFsc2EuYworKysgYi9zb3VuZC9wY2kvYXcyL2F3Mi1hbHNhLmMKQEAgLTE3OSw3ICsxNzksNyBAQAogbW9kdWxlX3BjaV9kcml2ZXIoYXcyX2RyaXZlcik7CiAKIC8qIG9wZXJhdG9ycyBmb3IgcGxheWJhY2sgUENNIGFsc2EgaW50ZXJmYWNlICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hdzJfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXcyX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9IHNuZF9hdzJfcGNtX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0gc25kX2F3Ml9wY21fcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xOTEsNyArMTkxLDcgQEAKIH07CiAKIC8qIG9wZXJhdG9ycyBmb3IgY2FwdHVyZSBQQ00gYWxzYSBpbnRlcmZhY2UgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F3Ml9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F3Ml9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9IHNuZF9hdzJfcGNtX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPSBzbmRfYXcyX3BjbV9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F6dDMzMjguYyBiL3NvdW5kL3BjaS9henQzMzI4LmMKaW5kZXggNWUyZWYwYi4uODBjNGE0NCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F6dDMzMjguYworKysgYi9zb3VuZC9wY2kvYXp0MzMyOC5jCkBAIC0yMDkwLDcgKzIwOTAsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hemYzMzI4X3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F6ZjMzMjhfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9hemYzMzI4X3BjbV9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF9hemYzMzI4X3BjbV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTIxMDEsNyArMjEwMSw3IEBACiAJLnBvaW50ZXIgPQlzbmRfYXpmMzMyOF9wY21fcG9pbnRlcgogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXpmMzMyOF9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F6ZjMzMjhfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2F6ZjMzMjhfcGNtX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfYXpmMzMyOF9wY21fY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0yMTEyLDcgKzIxMTIsNyBAQAogCS5wb2ludGVyID0Jc25kX2F6ZjMzMjhfcGNtX3BvaW50ZXIKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F6ZjMzMjhfaTJzX291dF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hemYzMzI4X2kyc19vdXRfb3BzID0gewogCS5vcGVuID0JCXNuZF9hemYzMzI4X3BjbV9pMnNfb3V0X29wZW4sCiAJLmNsb3NlID0Jc25kX2F6ZjMzMjhfcGNtX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2J0ODd4LmMgYi9zb3VuZC9wY2kvYnQ4N3guYwppbmRleCA1OTI1YjcxLi5mMmMwNzA5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYnQ4N3guYworKysgYi9zb3VuZC9wY2kvYnQ4N3guYwpAQCAtNTUwLDcgKzU1MCw3IEBACiAJcmV0dXJuIChzbmRfcGNtX3VmcmFtZXNfdClieXRlc190b19mcmFtZXMocnVudGltZSwgY2hpcC0+Y3VycmVudF9saW5lICogY2hpcC0+bGluZV9ieXRlcyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2J0ODd4X3BjbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9idDg3eF9wY21fb3BzID0gewogCS5vcGVuID0gc25kX2J0ODd4X3BjbV9vcGVuLAogCS5jbG9zZSA9IHNuZF9idDg3eF9jbG9zZSwKIAkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYyBiL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYwppbmRleCBkM2NkOTU2Li42MTY1YTU3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMKKysrIGIvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jCkBAIC0xMTA5LDcgKzExMDksNyBAQAogfQogCiAvKiBvcGVyYXRvcnMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhMDEwNl9wbGF5YmFja19mcm9udF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYTAxMDZfcGxheWJhY2tfZnJvbnRfb3BzID0gewogCS5vcGVuID0gICAgICAgIHNuZF9jYTAxMDZfcGNtX29wZW5fcGxheWJhY2tfZnJvbnQsCiAJLmNsb3NlID0gICAgICAgc25kX2NhMDEwNl9wY21fY2xvc2VfcGxheWJhY2ssCiAJLmlvY3RsID0gICAgICAgc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMTIwLDcgKzExMjAsNyBAQAogCS5wb2ludGVyID0gICAgIHNuZF9jYTAxMDZfcGNtX3BvaW50ZXJfcGxheWJhY2ssCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYTAxMDZfY2FwdHVyZV8wX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhMDEwNl9jYXB0dXJlXzBfb3BzID0gewogCS5vcGVuID0gICAgICAgIHNuZF9jYTAxMDZfcGNtX29wZW5fMF9jYXB0dXJlLAogCS5jbG9zZSA9ICAgICAgIHNuZF9jYTAxMDZfcGNtX2Nsb3NlX2NhcHR1cmUsCiAJLmlvY3RsID0gICAgICAgc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMTMxLDcgKzExMzEsNyBAQAogCS5wb2ludGVyID0gICAgIHNuZF9jYTAxMDZfcGNtX3BvaW50ZXJfY2FwdHVyZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhMDEwNl9jYXB0dXJlXzFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2EwMTA2X2NhcHR1cmVfMV9vcHMgPSB7CiAJLm9wZW4gPSAgICAgICAgc25kX2NhMDEwNl9wY21fb3Blbl8xX2NhcHR1cmUsCiAJLmNsb3NlID0gICAgICAgc25kX2NhMDEwNl9wY21fY2xvc2VfY2FwdHVyZSwKIAkuaW9jdGwgPSAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTExNDIsNyArMTE0Miw3IEBACiAJLnBvaW50ZXIgPSAgICAgc25kX2NhMDEwNl9wY21fcG9pbnRlcl9jYXB0dXJlLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2EwMTA2X2NhcHR1cmVfMl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYTAxMDZfY2FwdHVyZV8yX29wcyA9IHsKIAkub3BlbiA9ICAgICAgICBzbmRfY2EwMTA2X3BjbV9vcGVuXzJfY2FwdHVyZSwKIAkuY2xvc2UgPSAgICAgICBzbmRfY2EwMTA2X3BjbV9jbG9zZV9jYXB0dXJlLAogCS5pb2N0bCA9ICAgICAgIHNuZF9wY21fbGliX2lvY3RsLApAQCAtMTE1Myw3ICsxMTUzLDcgQEAKIAkucG9pbnRlciA9ICAgICBzbmRfY2EwMTA2X3BjbV9wb2ludGVyX2NhcHR1cmUsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYTAxMDZfY2FwdHVyZV8zX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhMDEwNl9jYXB0dXJlXzNfb3BzID0gewogCS5vcGVuID0gICAgICAgIHNuZF9jYTAxMDZfcGNtX29wZW5fM19jYXB0dXJlLAogCS5jbG9zZSA9ICAgICAgIHNuZF9jYTAxMDZfcGNtX2Nsb3NlX2NhcHR1cmUsCiAJLmlvY3RsID0gICAgICAgc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMTY0LDcgKzExNjQsNyBAQAogCS5wb2ludGVyID0gICAgIHNuZF9jYTAxMDZfcGNtX3BvaW50ZXJfY2FwdHVyZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhMDEwNl9wbGF5YmFja19jZW50ZXJfbGZlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhMDEwNl9wbGF5YmFja19jZW50ZXJfbGZlX29wcyA9IHsKICAgICAgICAgLm9wZW4gPSAgICAgICAgIHNuZF9jYTAxMDZfcGNtX29wZW5fcGxheWJhY2tfY2VudGVyX2xmZSwKICAgICAgICAgLmNsb3NlID0gICAgICAgIHNuZF9jYTAxMDZfcGNtX2Nsb3NlX3BsYXliYWNrLAogICAgICAgICAuaW9jdGwgPSAgICAgICAgc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMTc1LDcgKzExNzUsNyBAQAogICAgICAgICAucG9pbnRlciA9ICAgICAgc25kX2NhMDEwNl9wY21fcG9pbnRlcl9wbGF5YmFjaywgCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYTAxMDZfcGxheWJhY2tfdW5rbm93bl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYTAxMDZfcGxheWJhY2tfdW5rbm93bl9vcHMgPSB7CiAgICAgICAgIC5vcGVuID0gICAgICAgICBzbmRfY2EwMTA2X3BjbV9vcGVuX3BsYXliYWNrX3Vua25vd24sCiAgICAgICAgIC5jbG9zZSA9ICAgICAgICBzbmRfY2EwMTA2X3BjbV9jbG9zZV9wbGF5YmFjaywKICAgICAgICAgLmlvY3RsID0gICAgICAgIHNuZF9wY21fbGliX2lvY3RsLApAQCAtMTE4Niw3ICsxMTg2LDcgQEAKICAgICAgICAgLnBvaW50ZXIgPSAgICAgIHNuZF9jYTAxMDZfcGNtX3BvaW50ZXJfcGxheWJhY2ssIAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2EwMTA2X3BsYXliYWNrX3JlYXJfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2EwMTA2X3BsYXliYWNrX3JlYXJfb3BzID0gewogICAgICAgICAub3BlbiA9ICAgICAgICAgc25kX2NhMDEwNl9wY21fb3Blbl9wbGF5YmFja19yZWFyLAogICAgICAgICAuY2xvc2UgPSAgICAgICAgc25kX2NhMDEwNl9wY21fY2xvc2VfcGxheWJhY2ssCiAgICAgICAgIC5pb2N0bCA9ICAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jbWlwY2kuYyBiL3NvdW5kL3BjaS9jbWlwY2kuYwppbmRleCAyNGNkY2JhLi43M2Y1OTM1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY21pcGNpLmMKKysrIGIvc291bmQvcGNpL2NtaXBjaS5jCkBAIC0xODM4LDcgKzE4MzgsNyBAQAogLyoKICAqLwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jbWlwY2lfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY21pcGNpX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfY21pcGNpX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX2NtaXBjaV9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTE4NDksNyArMTg0OSw3IEBACiAJLnBvaW50ZXIgPQlzbmRfY21pcGNpX3BsYXliYWNrX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jbWlwY2lfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jbWlwY2lfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2NtaXBjaV9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX2NtaXBjaV9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTg2MCw3ICsxODYwLDcgQEAKIAkucG9pbnRlciA9CXNuZF9jbWlwY2lfY2FwdHVyZV9wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY21pcGNpX3BsYXliYWNrMl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jbWlwY2lfcGxheWJhY2syX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfY21pcGNpX3BsYXliYWNrMl9vcGVuLAogCS5jbG9zZSA9CXNuZF9jbWlwY2lfcGxheWJhY2syX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTg3MSw3ICsxODcxLDcgQEAKIAkucG9pbnRlciA9CXNuZF9jbWlwY2lfY2FwdHVyZV9wb2ludGVyLAkvKiBjaGFubmVsIEIgKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NtaXBjaV9wbGF5YmFja19zcGRpZl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jbWlwY2lfcGxheWJhY2tfc3BkaWZfb3BzID0gewogCS5vcGVuID0JCXNuZF9jbWlwY2lfcGxheWJhY2tfc3BkaWZfb3BlbiwKIAkuY2xvc2UgPQlzbmRfY21pcGNpX3BsYXliYWNrX3NwZGlmX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTg4Miw3ICsxODgyLDcgQEAKIAkucG9pbnRlciA9CXNuZF9jbWlwY2lfcGxheWJhY2tfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NtaXBjaV9jYXB0dXJlX3NwZGlmX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NtaXBjaV9jYXB0dXJlX3NwZGlmX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfY21pcGNpX2NhcHR1cmVfc3BkaWZfb3BlbiwKIAkuY2xvc2UgPQlzbmRfY21pcGNpX2NhcHR1cmVfc3BkaWZfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0MjgxLmMgYi9zb3VuZC9wY2kvY3M0MjgxLmMKaW5kZXggYzI5NmZkMC4uNjE1ZDhhOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNDI4MS5jCisrKyBiL3NvdW5kL3BjaS9jczQyODEuYwpAQCAtOTUxLDcgKzk1MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NzNDI4MV9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jczQyODFfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9jczQyODFfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfY3M0MjgxX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtOTYyLDcgKzk2Miw3IEBACiAJLnBvaW50ZXIgPQlzbmRfY3M0MjgxX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jczQyODFfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jczQyODFfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2NzNDI4MV9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX2NzNDI4MV9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHhfbGliLmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYwppbmRleCAyNzA2ZjI3Li41MjgxMDJjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYworKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYwpAQCAtMjQ2MCw3ICsyNDYwLDcgQEAKIAkJdWRlbGF5KDEwKTsKIAkJaWYgKHNuZF9jczQ2eHhfY29kZWNfcmVhZChjaGlwLCBBQzk3X1JFU0VULCBjb2RlYykgJiAweDgwMDApIHsKIAkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAotCQkJCSJzZWNvbmFkcnkgY29kZWMgbm90IHByZXNlbnRcbiIpOworCQkJCSJzZWNvbmRhcnkgY29kZWMgbm90IHByZXNlbnRcbiIpOwogCQkJcmV0dXJuIC1FTlhJTzsKIAkJfQogCX0KQEAgLTI1MDMsNyArMjUwMyw3IEBACiAJY2hpcC0+bnJfYWM5N19jb2RlY3MgPSAxOwogCiAjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAotCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiZGV0ZWN0aW5nIHNlY29uYWRyeSBjb2RlY1xuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJkZXRlY3Rpbmcgc2Vjb25kYXJ5IGNvZGVjXG4iKTsKIAkvKiB0cnkgZGV0ZWN0IGEgc2Vjb25kYXJ5IGNvZGVjICovCiAJaWYgKCEgY3M0Nnh4X2RldGVjdF9jb2RlYyhjaGlwLCBDUzQ2WFhfU0VDT05EQVJZX0NPREVDX0lOREVYKSkKIAkJY2hpcC0+bnJfYWM5N19jb2RlY3MgPSAyOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvcy5jIGIvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvcy5jCmluZGV4IGQyOTUxZWQuLjRhMGNiZDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3MuYworKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zLmMKQEAgLTE0NDEsNyArMTQ0MSw3IEBACiAJCiAJaWYgKGNoaXAtPm5yX2FjOTdfY29kZWNzID09IDIpIHsKIAkJLyogY3JlYXRlIENPREVDIHRhc2tsZXQgZm9yIHJlYXIgQ2VudGVyL0xGRSBvdXRwdXQgCi0JCSAgIHNsb3QgNiBhbmQgOSBvbiBzZWNvbmFkcnkgQ09ERUMgKi8KKwkJICAgc2xvdCA2IGFuZCA5IG9uIHNlY29uZGFyeSBDT0RFQyAqLwogCQljbGZlX2NvZGVjX291dF9zY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9jb2RlY19vdXRfc2NiKGNoaXAsIkNvZGVjT3V0U0NCX0NMRkUiLDB4MDAzMCwweDAwMzAsCiAJCQkJCQkJCSAgICAgQ0xGRV9NSVhFUl9TQ0JfQUREUiwKIAkJCQkJCQkJICAgICBDTEZFX0NPREVDX1NDQl9BRERSLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BjbS5jIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BjbS5jCmluZGV4IDI3ZmE1N2QuLmMyMDhjMWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19wY20uYworKysgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcGNtLmMKQEAgLTM4MCw3ICszODAsNyBAQAogCQkJCSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGUpOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jczU1MzVhdWRpb19wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jczU1MzVhdWRpb19wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2NzNTUzNWF1ZGlvX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX2NzNTUzNWF1ZGlvX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMzkxLDcgKzM5MSw3IEBACiAJLnBvaW50ZXIgPQlzbmRfY3M1NTM1YXVkaW9fcGNtX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jczU1MzVhdWRpb19jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NzNTUzNWF1ZGlvX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9jczU1MzVhdWRpb19jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX2NzNTUzNWF1ZGlvX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3R4ZmkvY3RhdGMuYyBiL3NvdW5kL3BjaS9jdHhmaS9jdGF0Yy5jCmluZGV4IDk3N2E1OTguLjkwODY1OGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jdHhmaS9jdGF0Yy5jCisrKyBiL3NvdW5kL3BjaS9jdHhmaS9jdGF0Yy5jCkBAIC0xNjIzLDcgKzE2MjMsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgY3RfYXRjIGF0Y19wcmVzZXQgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGN0X2F0YyBhdGNfcHJlc2V0ID0gewogCS5tYXBfYXVkaW9fYnVmZmVyID0gY3RfbWFwX2F1ZGlvX2J1ZmZlciwKIAkudW5tYXBfYXVkaW9fYnVmZmVyID0gY3RfdW5tYXBfYXVkaW9fYnVmZmVyLAogCS5wY21fcGxheWJhY2tfcHJlcGFyZSA9IGF0Y19wY21fcGxheWJhY2tfcHJlcGFyZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jdHhmaS9jdHBjbS5jIGIvc291bmQvcGNpL2N0eGZpL2N0cGNtLmMKaW5kZXggZDg2YzQ3NC4uOTc0OTc4MCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2N0eGZpL2N0cGNtLmMKKysrIGIvc291bmQvcGNpL2N0eGZpL2N0cGNtLmMKQEAgLTM3Miw3ICszNzIsNyBAQAogfQogCiAvKiBQQ00gb3BlcmF0b3JzIGZvciBwbGF5YmFjayAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBjdF9wY21fcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBjdF9wY21fcGxheWJhY2tfb3BzID0gewogCS5vcGVuCSAJPSBjdF9wY21fcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UJCT0gY3RfcGNtX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTM4NSw3ICszODUsNyBAQAogfTsKIAogLyogUENNIG9wZXJhdG9ycyBmb3IgY2FwdHVyZSAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBjdF9wY21fY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIGN0X3BjbV9jYXB0dXJlX29wcyA9IHsKIAkub3BlbgkgCT0gY3RfcGNtX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UJCT0gY3RfcGNtX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsCQk9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2N0eGZpL2N0dm1lbS5jIGIvc291bmQvcGNpL2N0eGZpL2N0dm1lbS5jCmluZGV4IDQxOTMwNmUuLjUyMGUxOWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jdHhmaS9jdHZtZW0uYworKysgYi9zb3VuZC9wY2kvY3R4ZmkvY3R2bWVtLmMKQEAgLTE2NiwxMSArMTY2LDcgQEAKIHN0YXRpYyBkbWFfYWRkcl90CiBjdF9nZXRfcHRwX3BoeXMoc3RydWN0IGN0X3ZtICp2bSwgaW50IGluZGV4KQogewotCWRtYV9hZGRyX3QgYWRkcjsKLQotCWFkZHIgPSAoaW5kZXggPj0gQ1RfUFRQX05VTSkgPyB+MFVMIDogdm0tPnB0cFtpbmRleF0uYWRkcjsKLQotCXJldHVybiBhZGRyOworCXJldHVybiAoaW5kZXggPj0gQ1RfUFRQX05VTSkgPyB+MFVMIDogdm0tPnB0cFtpbmRleF0uYWRkcjsKIH0KIAogaW50IGN0X3ZtX2NyZWF0ZShzdHJ1Y3QgY3Rfdm0gKipydm0sIHN0cnVjdCBwY2lfZGV2ICpwY2kpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYwppbmRleCA2ZDFiOThkLi45MjEwMzdlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMKQEAgLTU0OCw3ICs1NDgsNyBAQAogfQogCiAvKiBvcGVyYXRvcnMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VtdTEwazF4X3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VtdTEwazF4X3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9ICAgICAgICBzbmRfZW11MTBrMXhfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPSAgICAgICBzbmRfZW11MTBrMXhfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0gICAgICAgc25kX3BjbV9saWJfaW9jdGwsCkBAIC02OTQsNyArNjk0LDcgQEAKIAlyZXR1cm4gcHRyOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbXUxMGsxeF9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VtdTEwazF4X2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0gICAgICAgIHNuZF9lbXUxMGsxeF9wY21fb3Blbl9jYXB0dXJlLAogCS5jbG9zZSA9ICAgICAgIHNuZF9lbXUxMGsxeF9wY21fY2xvc2VfY2FwdHVyZSwKIAkuaW9jdGwgPSAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11cGNtLmMKaW5kZXggMTRhMzA1Yi4uMzdiZTFlMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11cGNtLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11cGNtLmMKQEAgLTEzNjQsNyArMTM2NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VtdTEwazFfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW11MTBrMV9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJCXNuZF9lbXUxMGsxX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0JCXNuZF9lbXUxMGsxX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEzNzYsNyArMTM3Niw3IEBACiAJLnBhZ2UgPQkJCXNuZF9wY21fc2didWZfb3BzX3BhZ2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbXUxMGsxX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW11MTBrMV9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQkJc25kX2VtdTEwazFfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CQlzbmRfZW11MTBrMV9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEzODgsNyArMTM4OCw3IEBACiB9OwogCiAvKiBFRlggcGxheWJhY2sgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VtdTEwazFfZWZ4X3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VtdTEwazFfZWZ4X3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQkJc25kX2VtdTEwazFfZWZ4X3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0JCXNuZF9lbXUxMGsxX2VmeF9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQkJc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xNDU1LDcgKzE0NTUsNyBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VtdTEwazFfY2FwdHVyZV9taWNfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW11MTBrMV9jYXB0dXJlX21pY19vcHMgPSB7CiAJLm9wZW4gPQkJCXNuZF9lbXUxMGsxX2NhcHR1cmVfbWljX29wZW4sCiAJLmNsb3NlID0JCXNuZF9lbXUxMGsxX2NhcHR1cmVfbWljX2Nsb3NlLAogCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTE1NTAsNyArMTU1MCw3IEBACiAJLnB1dCA9IHNuZF9lbXUxMGsxX3BjbV9lZnhfdm9pY2VzX21hc2tfcHV0CiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbXUxMGsxX2NhcHR1cmVfZWZ4X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VtdTEwazFfY2FwdHVyZV9lZnhfb3BzID0gewogCS5vcGVuID0JCQlzbmRfZW11MTBrMV9jYXB0dXJlX2VmeF9vcGVuLAogCS5jbG9zZSA9CQlzbmRfZW11MTBrMV9jYXB0dXJlX2VmeF9jbG9zZSwKIAkuaW9jdGwgPQkJc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xNzkxLDcgKzE3OTEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbXUxMGsxX2Z4ODAxMF9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbXUxMGsxX2Z4ODAxMF9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJCXNuZF9lbXUxMGsxX2Z4ODAxMF9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CQlzbmRfZW11MTBrMV9meDgwMTBfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvcDE2di5jIGIvc291bmQvcGNpL2VtdTEwazEvcDE2di5jCmluZGV4IDNjNjBiNDMuLmMxMWYxYTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL3AxNnYuYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9wMTZ2LmMKQEAgLTMwMCwzNyArMzAwLDI5IEBACiBzdGF0aWMgaW50IHNuZF9wMTZ2X3BjbV9od19wYXJhbXNfcGxheWJhY2soc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCiB7Ci0JaW50IHJlc3VsdDsKLQlyZXN1bHQgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLAorCXJldHVybiBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLAogCQkJCQlwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOwotCXJldHVybiByZXN1bHQ7CiB9CiAKIC8qIGh3X3BhcmFtcyBjYWxsYmFjayAqLwogc3RhdGljIGludCBzbmRfcDE2dl9wY21faHdfcGFyYW1zX2NhcHR1cmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCiB7Ci0JaW50IHJlc3VsdDsKLQlyZXN1bHQgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLAorCXJldHVybiBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLAogCQkJCQlwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOwotCXJldHVybiByZXN1bHQ7CiB9CiAKIAogLyogaHdfZnJlZSBjYWxsYmFjayAqLwogc3RhdGljIGludCBzbmRfcDE2dl9wY21faHdfZnJlZV9wbGF5YmFjayhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKLQlpbnQgcmVzdWx0OwotCXJlc3VsdCA9IHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7CiB9CiAKIC8qIGh3X2ZyZWUgY2FsbGJhY2sgKi8KIHN0YXRpYyBpbnQgc25kX3AxNnZfcGNtX2h3X2ZyZWVfY2FwdHVyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKLQlpbnQgcmVzdWx0OwotCXJlc3VsdCA9IHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7CiB9CiAKIApAQCAtNjAxLDcgKzU5Myw3IEBACiB9CiAKIC8qIG9wZXJhdG9ycyAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcDE2dl9wbGF5YmFja19mcm9udF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9wMTZ2X3BsYXliYWNrX2Zyb250X29wcyA9IHsKIAkub3BlbiA9ICAgICAgICBzbmRfcDE2dl9wY21fb3Blbl9wbGF5YmFja19mcm9udCwKIAkuY2xvc2UgPSAgICAgICBzbmRfcDE2dl9wY21fY2xvc2VfcGxheWJhY2ssCiAJLmlvY3RsID0gICAgICAgc25kX3BjbV9saWJfaW9jdGwsCkBAIC02MTIsNyArNjA0LDcgQEAKIAkucG9pbnRlciA9ICAgICBzbmRfcDE2dl9wY21fcG9pbnRlcl9wbGF5YmFjaywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3AxNnZfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9wMTZ2X2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0gICAgICAgIHNuZF9wMTZ2X3BjbV9vcGVuX2NhcHR1cmUsCiAJLmNsb3NlID0gICAgICAgc25kX3AxNnZfcGNtX2Nsb3NlX2NhcHR1cmUsCiAJLmlvY3RsID0gICAgICAgc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW5zMTM3MC5jIGIvc291bmQvcGNpL2VuczEzNzAuYwppbmRleCA2MjZjZDIxLi43ZTc2MGZlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW5zMTM3MC5jCisrKyBiL3NvdW5kL3BjaS9lbnMxMzcwLmMKQEAgLTEyMjcsNyArMTIyNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2Vuc29uaXFfcGxheWJhY2sxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2Vuc29uaXFfcGxheWJhY2sxX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfZW5zb25pcV9wbGF5YmFjazFfb3BlbiwKIAkuY2xvc2UgPQlzbmRfZW5zb25pcV9wbGF5YmFjazFfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMjM4LDcgKzEyMzgsNyBAQAogCS5wb2ludGVyID0Jc25kX2Vuc29uaXFfcGxheWJhY2sxX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbnNvbmlxX3BsYXliYWNrMl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbnNvbmlxX3BsYXliYWNrMl9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2Vuc29uaXFfcGxheWJhY2syX29wZW4sCiAJLmNsb3NlID0Jc25kX2Vuc29uaXFfcGxheWJhY2syX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTI0OSw3ICsxMjQ5LDcgQEAKIAkucG9pbnRlciA9CXNuZF9lbnNvbmlxX3BsYXliYWNrMl9wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW5zb25pcV9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2Vuc29uaXFfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2Vuc29uaXFfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9lbnNvbmlxX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZXMxOTM4LmMgYi9zb3VuZC9wY2kvZXMxOTM4LmMKaW5kZXggODk2M2Q3Ni4uNjgxMzU1OCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VzMTkzOC5jCisrKyBiL3NvdW5kL3BjaS9lczE5MzguYwpAQCAtOTkyLDcgKzk5Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VzMTkzOF9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lczE5MzhfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9lczE5MzhfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfZXMxOTM4X3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTAwMyw3ICsxMDAzLDcgQEAKIAkucG9pbnRlciA9CXNuZF9lczE5MzhfcGxheWJhY2tfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VzMTkzOF9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VzMTkzOF9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfZXMxOTM4X2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfZXMxOTM4X2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZXMxOTY4LmMgYi9zb3VuZC9wY2kvZXMxOTY4LmMKaW5kZXggNTE0ZjI2MC4uODE0NmZiNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VzMTk2OC5jCisrKyBiL3NvdW5kL3BjaS9lczE5NjguYwpAQCAtMTY3Nyw3ICsxNjc3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZXMxOTY4X3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VzMTk2OF9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2VzMTk2OF9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF9lczE5NjhfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xNjg4LDcgKzE2ODgsNyBAQAogCS5wb2ludGVyID0Jc25kX2VzMTk2OF9wY21fcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VzMTk2OF9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VzMTk2OF9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfZXMxOTY4X2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfZXMxOTY4X2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZm04MDEuYyBiL3NvdW5kL3BjaS9mbTgwMS5jCmluZGV4IGJhZGU5YjkuLmM0NzI4N2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9mbTgwMS5jCisrKyBiL3NvdW5kL3BjaS9mbTgwMS5jCkBAIC02OTEsNyArNjkxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZm04MDFfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZm04MDFfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9mbTgwMV9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF9mbTgwMV9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTcwMiw3ICs3MDIsNyBAQAogCS5wb2ludGVyID0Jc25kX2ZtODAxX3BsYXliYWNrX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9mbTgwMV9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2ZtODAxX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9mbTgwMV9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX2ZtODAxX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9jb250cm9sbGVyLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb250cm9sbGVyLmMKaW5kZXggMjdkZTgwMS4uNTAwODc4NSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvbnRyb2xsZXIuYwpAQCAtMjcsNiArMjcsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaWZkZWYgQ09ORklHX1g4NgorLyogZm9yIGFydC10c2MgY29udmVyc2lvbiAqLworI2luY2x1ZGUgPGFzbS90c2MuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlICJoZGFfY29udHJvbGxlci5oIgpAQCAtMzM3LDEyICszNDMsMTczIEBACiAJCQkgICAgICAgYXp4X2dldF9wb3NpdGlvbihjaGlwLCBhenhfZGV2KSk7CiB9CiAKKy8qCisgKiBhenhfc2NhbGU2NDogU2NhbGUgYmFzZSBieSBtdWx0L2RpdiB3aGlsZSBub3Qgb3ZlcmZsb3dpbmcgc2FuZWx5CisgKgorICogRGVyaXZlZCBmcm9tIHNjYWxlNjRfY2hlY2tfb3ZlcmZsb3cgaW4ga2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYworICoKKyAqIFRoZSB0bWVzdGFtcHMgZm9yIGEgNDhLaHogc3RyZWFtIGNhbiBvdmVyZmxvdyBhZnRlciAoMl42NC8xMF45KS80OEsgd2hpY2gKKyAqIGlzIGFib3V0IDM4NDMwNyBpZSB+NC41IGRheXMuCisgKgorICogVGhpcyBzY2FsZXMgdGhlIGNhbGN1bGF0aW9uIHNvIHRoYXQgb3ZlcmZsb3cgd2lsbCBoYXBwZW4gYnV0IGFmdGVyIDJeNjQgLworICogNDgwMDAgc2Vjcywgd2hpY2ggaXMgcHJldHR5IGxhcmdlIQorICoKKyAqIEluIGNhbG4gYmVsb3c6CisgKgliYXNlIG1heSBvdmVyZmxvdywgYnV0IHNpbmNlIHRoZXJlIGlzbuKAmXQgYW55IGFkZGl0aW9uYWwgZGl2aXNpb24KKyAqCXBlcmZvcm1lZCBvbiBiYXNlIGl04oCZcyBPSworICoJcmVtIGNhbuKAmXQgb3ZlcmZsb3cgYmVjYXVzZSBib3RoIGFyZSAzMi1iaXQgdmFsdWVzCisgKi8KKworI2lmZGVmIENPTkZJR19YODYKK3N0YXRpYyB1NjQgYXp4X3NjYWxlNjQodTY0IGJhc2UsIHUzMiBudW0sIHUzMiBkZW4pCit7CisJdTY0IHJlbTsKKworCXJlbSA9IGRvX2RpdihiYXNlLCBkZW4pOworCisJYmFzZSAqPSBudW07CisJcmVtICo9IG51bTsKKworCWRvX2RpdihyZW0sIGRlbik7CisKKwlyZXR1cm4gYmFzZSArIHJlbTsKK30KKworc3RhdGljIGludCBhenhfZ2V0X3N5bmNfdGltZShrdGltZV90ICpkZXZpY2UsCisJCXN0cnVjdCBzeXN0ZW1fY291bnRlcnZhbF90ICpzeXN0ZW0sIHZvaWQgKmN0eCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGN0eDsKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7CisJc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKKwl1NjQgbGxfY291bnRlciwgbGxfY291bnRlcl9sLCBsbF9jb3VudGVyX2g7CisJdTY0IHRzY19jb3VudGVyLCB0c2NfY291bnRlcl9sLCB0c2NfY291bnRlcl9oOworCXUzMiB3YWxsY2xrX2N0ciwgd2FsbGNsa19jeWNsZXM7CisJYm9vbCBkaXJlY3Rpb247CisJdTMyIGRtYV9zZWxlY3Q7CisJdTMyIHRpbWVvdXQgPSAyMDA7CisJdTMyIHJldHJ5X2NvdW50ID0gMDsKKworCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJZGlyZWN0aW9uID0gMTsKKwllbHNlCisJCWRpcmVjdGlvbiA9IDA7CisKKwkvKiAwdGggc3RyZWFtIHRhZyBpcyBub3QgdXNlZCwgc28gRE1BIGNoIDAgaXMgZm9yIDFzdCBzdHJlYW0gdGFnICovCisJZG8geworCQl0aW1lb3V0ID0gMTAwOworCQlkbWFfc2VsZWN0ID0gKGRpcmVjdGlvbiA8PCBHVFNDQ19DRE1BU19ETUFfRElSX1NISUZUKSB8CisJCQkJCShhenhfZGV2LT5jb3JlLnN0cmVhbV90YWcgLSAxKTsKKwkJc25kX2hkYWNfY2hpcF93cml0ZWwoYXp4X2J1cyhjaGlwKSwgR1RTQ0MsIGRtYV9zZWxlY3QpOworCisJCS8qIEVuYWJsZSB0aGUgY2FwdHVyZSAqLworCQlzbmRfaGRhY19jaGlwX3VwZGF0ZWwoYXp4X2J1cyhjaGlwKSwgR1RTQ0MsIDAsIEdUU0NDX1RTQ0NJX01BU0spOworCisJCXdoaWxlICh0aW1lb3V0KSB7CisJCQlpZiAoc25kX2hkYWNfY2hpcF9yZWFkbChhenhfYnVzKGNoaXApLCBHVFNDQykgJgorCQkJCQkJR1RTQ0NfVFNDQ0RfTUFTSykKKwkJCQlicmVhazsKKworCQkJdGltZW91dC0tOworCQl9CisKKwkJaWYgKCF0aW1lb3V0KSB7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkdUU0NDIGNhcHR1cmUgVGltZWRvdXQhXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJLyogUmVhZCB3YWxsIGNsb2NrIGNvdW50ZXIgKi8KKwkJd2FsbGNsa19jdHIgPSBzbmRfaGRhY19jaGlwX3JlYWRsKGF6eF9idXMoY2hpcCksIFdBTEZDQyk7CisKKwkJLyogUmVhZCBUU0MgY291bnRlciAqLworCQl0c2NfY291bnRlcl9sID0gc25kX2hkYWNfY2hpcF9yZWFkbChhenhfYnVzKGNoaXApLCBUU0NDTCk7CisJCXRzY19jb3VudGVyX2ggPSBzbmRfaGRhY19jaGlwX3JlYWRsKGF6eF9idXMoY2hpcCksIFRTQ0NVKTsKKworCQkvKiBSZWFkIExpbmsgY291bnRlciAqLworCQlsbF9jb3VudGVyX2wgPSBzbmRfaGRhY19jaGlwX3JlYWRsKGF6eF9idXMoY2hpcCksIExMUENMKTsKKwkJbGxfY291bnRlcl9oID0gc25kX2hkYWNfY2hpcF9yZWFkbChhenhfYnVzKGNoaXApLCBMTFBDVSk7CisKKwkJLyogQWNrOiByZWdpc3RlcnMgcmVhZCBkb25lICovCisJCXNuZF9oZGFjX2NoaXBfd3JpdGVsKGF6eF9idXMoY2hpcCksIEdUU0NDLCBHVFNDQ19UU0NDRF9TSElGVCk7CisKKwkJdHNjX2NvdW50ZXIgPSAodHNjX2NvdW50ZXJfaCA8PCBUU0NDVV9DQ1VfU0hJRlQpIHwKKwkJCQkJCXRzY19jb3VudGVyX2w7CisKKwkJbGxfY291bnRlciA9IChsbF9jb3VudGVyX2ggPDwgTExQQ19DQ1VfU0hJRlQpIHwJbGxfY291bnRlcl9sOworCQl3YWxsY2xrX2N5Y2xlcyA9IHdhbGxjbGtfY3RyICYgV0FMRkNDX0NJRl9NQVNLOworCisJCS8qCisJCSAqIEFuIGVycm9yIG9jY3VycyBuZWFyIGZyYW1lICJyb2xsb3ZlciIuIFRoZSBjbG9ja3MgaW4KKwkJICogZnJhbWUgdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBlcnJvciBtYXkgaGF2ZQorCQkgKiBvY2N1cnJlZC4gSGVyZSB3ZSB1c2UgdGhlIHZhbHVlIG9mIDEwIGkuZS4sCisJCSAqIEhEQV9NQVhfQ1lDTEVfT0ZGU0VUCisJCSAqLworCQlpZiAod2FsbGNsa19jeWNsZXMgPCBIREFfTUFYX0NZQ0xFX1ZBTFVFIC0gSERBX01BWF9DWUNMRV9PRkZTRVQKKwkJCQkJJiYgd2FsbGNsa19jeWNsZXMgPiBIREFfTUFYX0NZQ0xFX09GRlNFVCkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIFNsZWVwIGJlZm9yZSB3ZSByZWFkIGFnYWluLCBlbHNlIHdlIG1heSBhZ2FpbiBnZXQKKwkJICogdmFsdWUgbmVhciB0byBNQVhfQ1lDTEUuIFRyeSB0byBzbGVlcCBmb3IgZGlmZmVyZW50CisJCSAqIGFtb3VudCBvZiB0aW1lIHNvIHdlIGRvbnQgaGl0IHRoZSBzYW1lIG51bWJlciBhZ2FpbgorCQkgKi8KKwkJdWRlbGF5KHJldHJ5X2NvdW50KyspOworCisJfSB3aGlsZSAocmV0cnlfY291bnQgIT0gSERBX01BWF9DWUNMRV9SRUFEX1JFVFJZKTsKKworCWlmIChyZXRyeV9jb3VudCA9PSBIREFfTUFYX0NZQ0xFX1JFQURfUkVUUlkpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChjaGlwLT5jYXJkLT5kZXYsCisJCQkiRXJyb3IgaW4gV0FMRkNDIGN5Y2xlIGNvdW50XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJKmRldmljZSA9IG5zX3RvX2t0aW1lKGF6eF9zY2FsZTY0KGxsX2NvdW50ZXIsCisJCQkJTlNFQ19QRVJfU0VDLCBydW50aW1lLT5yYXRlKSk7CisJKmRldmljZSA9IGt0aW1lX2FkZF9ucygqZGV2aWNlLCAod2FsbGNsa19jeWNsZXMgKiBOU0VDX1BFUl9TRUMpIC8KKwkJCSAgICAgICAoKEhEQV9NQVhfQ1lDTEVfVkFMVUUgKyAxKSAqIHJ1bnRpbWUtPnJhdGUpKTsKKworCSpzeXN0ZW0gPSBjb252ZXJ0X2FydF90b190c2ModHNjX2NvdW50ZXIpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCitzdGF0aWMgaW50IGF6eF9nZXRfc3luY190aW1lKGt0aW1lX3QgKmRldmljZSwKKwkJc3RydWN0IHN5c3RlbV9jb3VudGVydmFsX3QgKnN5c3RlbSwgdm9pZCAqY3R4KQoreworCXJldHVybiAtRU5YSU87Cit9CisjZW5kaWYKKworc3RhdGljIGludCBhenhfZ2V0X2Nyb3NzdHN0YW1wKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICAgc3RydWN0IHN5c3RlbV9kZXZpY2VfY3Jvc3N0c3RhbXAgKnh0c3RhbXApCit7CisJcmV0dXJuIGdldF9kZXZpY2Vfc3lzdGVtX2Nyb3NzdHN0YW1wKGF6eF9nZXRfc3luY190aW1lLAorCQkJCQlzdWJzdHJlYW0sIE5VTEwsIHh0c3RhbXApOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfbGlua190aW1lX3N1cHBvcnRlZChzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAorCQkJCXN0cnVjdCBzbmRfcGNtX2F1ZGlvX3RzdGFtcF9jb25maWcgKnRzKQoreworCWlmIChydW50aW1lLT5ody5pbmZvICYgU05EUlZfUENNX0lORk9fSEFTX0xJTktfU1lOQ0hST05JWkVEX0FUSU1FKQorCQlpZiAodHMtPnR5cGVfcmVxdWVzdGVkID09IFNORFJWX1BDTV9BVURJT19UU1RBTVBfVFlQRV9MSU5LX1NZTkNIUk9OSVpFRCkKKwkJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgaW50IGF6eF9nZXRfdGltZV9pbmZvKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJc3RydWN0IHRpbWVzcGVjICpzeXN0ZW1fdHMsIHN0cnVjdCB0aW1lc3BlYyAqYXVkaW9fdHMsCiAJCQlzdHJ1Y3Qgc25kX3BjbV9hdWRpb190c3RhbXBfY29uZmlnICphdWRpb190c3RhbXBfY29uZmlnLAogCQkJc3RydWN0IHNuZF9wY21fYXVkaW9fdHN0YW1wX3JlcG9ydCAqYXVkaW9fdHN0YW1wX3JlcG9ydCkKIHsKIAlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3Qgc3lzdGVtX2RldmljZV9jcm9zc3RzdGFtcCB4dHN0YW1wOworCWludCByZXQ7CiAJdTY0IG5zZWM7CiAKIAlpZiAoKHN1YnN0cmVhbS0+cnVudGltZS0+aHcuaW5mbyAmIFNORFJWX1BDTV9JTkZPX0hBU19MSU5LX0FUSU1FKSAmJgpAQCAtMzYxLDggKzUyOCwzNyBAQAogCQlhdWRpb190c3RhbXBfcmVwb3J0LT5hY2N1cmFjeV9yZXBvcnQgPSAxOyAvKiByZXN0IG9mIHN0cnVjdHVyZSBpcyB2YWxpZCAqLwogCQlhdWRpb190c3RhbXBfcmVwb3J0LT5hY2N1cmFjeSA9IDQyOyAvKiAyNCBNSHogV2FsbENsb2NrID09IDQybnMgcmVzb2x1dGlvbiAqLwogCi0JfSBlbHNlCisJfSBlbHNlIGlmIChpc19saW5rX3RpbWVfc3VwcG9ydGVkKHJ1bnRpbWUsIGF1ZGlvX3RzdGFtcF9jb25maWcpKSB7CisKKwkJcmV0ID0gYXp4X2dldF9jcm9zc3RzdGFtcChzdWJzdHJlYW0sICZ4dHN0YW1wKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJc3dpdGNoIChydW50aW1lLT50c3RhbXBfdHlwZSkgeworCQljYXNlIFNORFJWX1BDTV9UU1RBTVBfVFlQRV9NT05PVE9OSUM6CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljYXNlIFNORFJWX1BDTV9UU1RBTVBfVFlQRV9NT05PVE9OSUNfUkFXOgorCQkJKnN5c3RlbV90cyA9IGt0aW1lX3RvX3RpbWVzcGVjKHh0c3RhbXAuc3lzX21vbm9yYXcpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCSpzeXN0ZW1fdHMgPSBrdGltZV90b190aW1lc3BlYyh4dHN0YW1wLnN5c19yZWFsdGltZSk7CisJCQlicmVhazsKKworCQl9CisKKwkJKmF1ZGlvX3RzID0ga3RpbWVfdG9fdGltZXNwZWMoeHRzdGFtcC5kZXZpY2UpOworCisJCWF1ZGlvX3RzdGFtcF9yZXBvcnQtPmFjdHVhbF90eXBlID0KKwkJCVNORFJWX1BDTV9BVURJT19UU1RBTVBfVFlQRV9MSU5LX1NZTkNIUk9OSVpFRDsKKwkJYXVkaW9fdHN0YW1wX3JlcG9ydC0+YWNjdXJhY3lfcmVwb3J0ID0gMTsKKwkJLyogMjQgTUh6IFdhbGxDbG9jayA9PSA0Mm5zIHJlc29sdXRpb24gKi8KKwkJYXVkaW9fdHN0YW1wX3JlcG9ydC0+YWNjdXJhY3kgPSA0MjsKKworCX0gZWxzZSB7CiAJCWF1ZGlvX3RzdGFtcF9yZXBvcnQtPmFjdHVhbF90eXBlID0gU05EUlZfUENNX0FVRElPX1RTVEFNUF9UWVBFX0RFRkFVTFQ7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC00MTIsNiArNjA4LDExIEBACiAJCWdvdG8gdW5sb2NrOwogCX0KIAlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBhenhfZGV2OworCisJaWYgKGNoaXAtPmd0c19wcmVzZW50KQorCQlhenhfcGNtX2h3LmluZm8gPSBhenhfcGNtX2h3LmluZm8gfAorCQkJU05EUlZfUENNX0lORk9fSEFTX0xJTktfU1lOQ0hST05JWkVEX0FUSU1FOworCiAJcnVudGltZS0+aHcgPSBhenhfcGNtX2h3OwogCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbiA9IGhpbmZvLT5jaGFubmVsc19taW47CiAJcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0gaGluZm8tPmNoYW5uZWxzX21heDsKQEAgLTQ5NSw3ICs2OTYsNyBAQAogCXJldHVybiBzbmRfcGNtX2xpYl9kZWZhdWx0X21tYXAoc3Vic3RyZWFtLCBhcmVhKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBhenhfcGNtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgYXp4X3BjbV9vcHMgPSB7CiAJLm9wZW4gPSBhenhfcGNtX29wZW4sCiAJLmNsb3NlID0gYXp4X3BjbV9jbG9zZSwKIAkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvbnRyb2xsZXIuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvbnRyb2xsZXIuaAppbmRleCBlYzYzYmJmLi5hNTBlMDUzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9jb250cm9sbGVyLmgKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5oCkBAIC0xNTksNiArMTU5LDkgQEAKIAl1bnNpZ25lZCBpbnQgcmVnaW9uX3JlcXVlc3RlZDoxOwogCXVuc2lnbmVkIGludCBkaXNhYmxlZDoxOyAvKiBkaXNhYmxlZCBieSB2Z2Ffc3dpdGNoZXJvbyAqLwogCisJLyogR1RTIHByZXNlbnQgKi8KKwl1bnNpZ25lZCBpbnQgZ3RzX3ByZXNlbnQ6MTsKKwogI2lmZGVmIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIKIAlzdHJ1Y3QgYXp4X2RldiBzYXZlZF9henhfZGV2OwogI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwppbmRleCAxNjBjN2Y3Li5jMzQ2OWY3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKQEAgLTU0LDYgKzU0LDcgQEAKIC8qIGZvciBzbm9vcCBjb250cm9sICovCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CiAjZW5kaWYKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgpAQCAtMTY2Myw2ICsxNjY0LDIyIEBACiAJCXJldHVybiAtRU5YSU87CiAJfQogCisJaWYgKElTX1NLTF9QTFVTKHBjaSkpCisJCXNuZF9oZGFjX2J1c19wYXJzZV9jYXBhYmlsaXRpZXMoYnVzKTsKKworCS8qCisJICogU29tZSBJbnRlbCBDUFVzIGhhcyBhbHdheXMgcnVubmluZyB0aW1lciAoQVJUKSBmZWF0dXJlIGFuZAorCSAqIGNvbnRyb2xsZXIgbWF5IGhhdmUgR2xvYmFsIHRpbWUgc3luYyByZXBvcnRpbmcgY2FwYWJpbGl0eSwgc28KKwkgKiBjaGVjayBib3RoIG9mIHRoZXNlIGJlZm9yZSBkZWNsYXJpbmcgc3luY2hyb25pemVkIHRpbWUgcmVwb3J0aW5nCisJICogY2FwYWJpbGl0eSBTTkRSVl9QQ01fSU5GT19IQVNfTElOS19TWU5DSFJPTklaRURfQVRJTUUKKwkgKi8KKwljaGlwLT5ndHNfcHJlc2VudCA9IGZhbHNlOworCisjaWZkZWYgQ09ORklHX1g4NgorCWlmIChidXMtPnBwY2FwICYmIGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BUlQpKQorCQljaGlwLT5ndHNfcHJlc2VudCA9IHRydWU7CisjZW5kaWYKKwogCWlmIChjaGlwLT5tc2kpIHsKIAkJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX05PX01TSTY0KSB7CiAJCQlkZXZfZGJnKGNhcmQtPmRldiwgIkRpc2FibGluZyA2NGJpdCBNU0lcbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMzIuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTMyLmMKaW5kZXggOWNlYjJiYy4uYWQwNjg2NiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMzIuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDEzMi5jCkBAIC00MDE4LDcgKzQwMTgsNyBAQAogLyoKICAqIFBDTQogICovCi1zdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIGNhMDEzMl9wY21fYW5hbG9nX3BsYXliYWNrID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBjYTAxMzJfcGNtX2FuYWxvZ19wbGF5YmFjayA9IHsKIAkuc3Vic3RyZWFtcyA9IDEsCiAJLmNoYW5uZWxzX21pbiA9IDIsCiAJLmNoYW5uZWxzX21heCA9IDYsCkBAIC00MDI5LDcgKzQwMjksNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIGNhMDEzMl9wY21fYW5hbG9nX2NhcHR1cmUgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIGNhMDEzMl9wY21fYW5hbG9nX2NhcHR1cmUgPSB7CiAJLnN1YnN0cmVhbXMgPSAxLAogCS5jaGFubmVsc19taW4gPSAyLAogCS5jaGFubmVsc19tYXggPSAyLApAQCAtNDA0MCw3ICs0MDQwLDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBjYTAxMzJfcGNtX2RpZ2l0YWxfcGxheWJhY2sgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIGNhMDEzMl9wY21fZGlnaXRhbF9wbGF5YmFjayA9IHsKIAkuc3Vic3RyZWFtcyA9IDEsCiAJLmNoYW5uZWxzX21pbiA9IDIsCiAJLmNoYW5uZWxzX21heCA9IDIsCkBAIC00MDUyLDcgKzQwNTIsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIGNhMDEzMl9wY21fZGlnaXRhbF9jYXB0dXJlID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBjYTAxMzJfcGNtX2RpZ2l0YWxfY2FwdHVyZSA9IHsKIAkuc3Vic3RyZWFtcyA9IDEsCiAJLmNoYW5uZWxzX21pbiA9IDIsCiAJLmNoYW5uZWxzX21heCA9IDIsCkBAIC00NjE0LDcgKzQ2MTQsNyBAQAogCWtmcmVlKGNvZGVjLT5zcGVjKTsKIH0KIAotc3RhdGljIHN0cnVjdCBoZGFfY29kZWNfb3BzIGNhMDEzMl9wYXRjaF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jb2RlY19vcHMgY2EwMTMyX3BhdGNoX29wcyA9IHsKIAkuYnVpbGRfY29udHJvbHMgPSBjYTAxMzJfYnVpbGRfY29udHJvbHMsCiAJLmJ1aWxkX3BjbXMgPSBjYTAxMzJfYnVpbGRfcGNtcywKIAkuaW5pdCA9IGNhMDEzMl9pbml0LApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jCmluZGV4IDU2ZmVmYmQuLmVkNjI3NDggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKQEAgLTI2MSw2ICsyNjEsNyBAQAogCUNYVF9GSVhVUF9IUF81MzAsCiAJQ1hUX0ZJWFVQX0NBUF9NSVhfQU1QXzUwNDcsCiAJQ1hUX0ZJWFVQX01VVEVfTEVEX0VBUEQsCisJQ1hUX0ZJWFVQX0hQX1NQRUNUUkUsCiB9OwogCiAvKiBmb3IgaGRhX2ZpeHVwX3RoaW5rcGFkX2FjcGkoKSAqLwpAQCAtNzY1LDYgKzc2NiwxNCBAQAogCQkudHlwZSA9IEhEQV9GSVhVUF9GVU5DLAogCQkudi5mdW5jID0gY3h0X2ZpeHVwX211dGVfbGVkX2VhcGQsCiAJfSwKKwlbQ1hUX0ZJWFVQX0hQX1NQRUNUUkVdID0geworCQkudHlwZSA9IEhEQV9GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBoZGFfcGludGJsW10pIHsKKwkJCS8qIGVuYWJsZSBOSUQgMHgxZCBmb3IgdGhlIHNwZWFrZXIgb24gdG9wICovCisJCQl7IDB4MWQsIDB4OTExNzAxMTEgfSwKKwkJCXsgfQorCQl9CisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBjeHQ1MDQ1X2ZpeHVwc1tdID0gewpAQCAtODE0LDYgKzgyMyw3IEBACiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDU0MywgIkFjZXIgQXNwaXJlIE9uZSA1MjIiLCBDWFRfRklYVVBfU1RFUkVPX0RNSUMpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDA1NGMsICJBY2VyIEFzcGlyZSAzODMwVEciLCBDWFRfRklYVVBfQVNQSVJFX0RNSUMpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDA1NGYsICJBY2VyIEFzcGlyZSA0ODMwVCIsIENYVF9GSVhVUF9BU1BJUkVfRE1JQyksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4ODE3NCwgIkhQIFNwZWN0cmUgeDM2MCIsIENYVF9GSVhVUF9IUF9TUEVDVFJFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzhkLCAiQXN1cyIsIENYVF9GSVhVUF9IRUFEUEhPTkVfTUlDX1BJTiksCiAJU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MDgzMywgIk9MUEMgWE8tMS41IiwgQ1hUX0ZJWFVQX09MUENfWE8pLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIwZjIsICJMZW5vdm8gVDQwMCIsIENYVF9QSU5DRkdfTEVOT1ZPX1RQNDEwKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKaW5kZXggNTc0YjFiNC4uYjU4ZThjNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKQEAgLTQ4MjgsNyArNDgyOCw3IEBACiAJQUxDMjkzX0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSwKIAlBTEMyOTJfRklYVVBfVFBUNDQwX0RPQ0ssCiAJQUxDMjkyX0ZJWFVQX1RQVDQ0MCwKLQlBTEMyODNfRklYVVBfQlhCVDI4MDdfTUlDLAorCUFMQzI4M19GSVhVUF9IRUFEU0VUX01JQywKIAlBTEMyNTVfRklYVVBfREVMTF9XTUlfTUlDX01VVEVfTEVELAogCUFMQzI4Ml9GSVhVUF9BU1BJUkVfVjVfUElOUywKIAlBTEMyODBfRklYVVBfSFBfR1BJTzQsCkBAIC00ODU1LDYgKzQ4NTUsNyBAQAogCUFMQzIyMV9GSVhVUF9IUF9GUk9OVF9NSUMsCiAJQUxDMjkyX0ZJWFVQX1RQVDQ2MCwKIAlBTEMyOThfRklYVVBfU1BLX1ZPTFVNRSwKKwlBTEMyNTZfRklYVVBfREVMTF9JTlNQSVJPTl83NTU5X1NVQldPT0ZFUiwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2ZpeHVwIGFsYzI2OV9maXh1cHNbXSA9IHsKQEAgLTUyNjMsNiArNTI2NCw4IEBACiAJW0FMQzI2OV9GSVhVUF9USElOS1BBRF9BQ1BJXSA9IHsKIAkJLnR5cGUgPSBIREFfRklYVVBfRlVOQywKIAkJLnYuZnVuYyA9IGhkYV9maXh1cF90aGlua3BhZF9hY3BpLAorCQkuY2hhaW5lZCA9IHRydWUsCisJCS5jaGFpbl9pZCA9IEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFLAogCX0sCiAJW0FMQzI2OV9GSVhVUF9ETUlDX1RISU5LUEFEX0FDUEldID0gewogCQkudHlwZSA9IEhEQV9GSVhVUF9GVU5DLApAQCAtNTMyMSw3ICs1MzI0LDcgQEAKIAkJLmNoYWluZWQgPSB0cnVlLAogCQkuY2hhaW5faWQgPSBBTEMyOTJfRklYVVBfVFBUNDQwX0RPQ0ssCiAJfSwKLQlbQUxDMjgzX0ZJWFVQX0JYQlQyODA3X01JQ10gPSB7CisJW0FMQzI4M19GSVhVUF9IRUFEU0VUX01JQ10gPSB7CiAJCS50eXBlID0gSERBX0ZJWFVQX1BJTlMsCiAJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGhkYV9waW50YmxbXSkgewogCQkJeyAweDE5LCAweDA0YTExMGYwIH0sCkBAIC01NTE2LDYgKzU1MTksMTUgQEAKIAkJLmNoYWluZWQgPSB0cnVlLAogCQkuY2hhaW5faWQgPSBBTEMyOThfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFLAogCX0sCisJW0FMQzI1Nl9GSVhVUF9ERUxMX0lOU1BJUk9OXzc1NTlfU1VCV09PRkVSXSA9IHsKKwkJLnR5cGUgPSBIREFfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgaGRhX3BpbnRibFtdKSB7CisJCQl7IDB4MWIsIDB4OTAxNzAxNTEgfSwKKwkJCXsgfQorCQl9LAorCQkuY2hhaW5lZCA9IHRydWUsCisJCS5jaGFpbl9pZCA9IEFMQzI1NV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzI2OV9maXh1cF90YmxbXSA9IHsKQEAgLTU1NjAsNiArNTU3Miw3IEBACiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDZkZiwgIkRlbGwiLCBBTEMyOTNfRklYVVBfRElTQUJMRV9BQU1JWF9NVUxUSUpBQ0spLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2ZTAsICJEZWxsIiwgQUxDMjkzX0ZJWFVQX0RJU0FCTEVfQUFNSVhfTVVMVElKQUNLKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNzA0LCAiRGVsbCBYUFMgMTMgOTM1MCIsIEFMQzI1Nl9GSVhVUF9ERUxMX1hQU18xM19IRUFEUEhPTkVfTk9JU0UpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA3MDYsICJEZWxsIEluc3Bpcm9uIDc1NTkiLCBBTEMyNTZfRklYVVBfREVMTF9JTlNQSVJPTl83NTU5X1NVQldPT0ZFUiksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDcyNSwgIkRlbGwgSW5zcGlyb24gMzE2MiIsIEFMQzI1NV9GSVhVUF9ERUxMX1NQS19OT0lTRSksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDc1YiwgIkRlbGwgWFBTIDEzIDkzNjAiLCBBTEMyNTZfRklYVVBfREVMTF9YUFNfMTNfSEVBRFBIT05FX05PSVNFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNzVkLCAiRGVsbCBBSU8iLCBBTEMyOThfRklYVVBfU1BLX1ZPTFVNRSksCkBAIC01NjUxLDcgKzU2NjQsOCBAQAogCVNORF9QQ0lfUVVJUksoMHgxMGNmLCAweDE3NTcsICJMaWZlYm9vayBFNzUyIiwgQUxDMjY5X0ZJWFVQX0xJRkVCT09LX0hQX1BJTiksCiAJU05EX1BDSV9RVUlSSygweDEwY2YsIDB4MTg0NSwgIkxpZmVib29rIFU5MDQiLCBBTEMyNjlfRklYVVBfTElGRUJPT0tfRVhUTUlDKSwKIAlTTkRfUENJX1FVSVJLKDB4MTQ0ZCwgMHhjMTA5LCAiU2Ftc3VuZyBBdGl2IGJvb2sgOSAoTlA5MDBYM0cpIiwgQUxDMjY5X0ZJWFVQX0lOVl9ETUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ1OCwgMHhmYTUzLCAiR2lnYWJ5dGUgQlhCVC0yODA3IiwgQUxDMjgzX0ZJWFVQX0JYQlQyODA3X01JQyksCisJU05EX1BDSV9RVUlSSygweDE0NTgsIDB4ZmE1MywgIkdpZ2FieXRlIEJYQlQtMjgwNyIsIEFMQzI4M19GSVhVUF9IRUFEU0VUX01JQyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4YjEyMCwgIk1TSSBDdWJpIE1TLUIxMjAiLCBBTEMyODNfRklYVVBfSEVBRFNFVF9NSUMpLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIwZjIsICJUaGlua3BhZCBTTDQxMC81MTAiLCBBTEMyNjlfRklYVVBfU0tVX0lHTk9SRSksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjE1ZSwgIlRoaW5rcGFkIEw1MTIiLCBBTEMyNjlfRklYVVBfU0tVX0lHTk9SRSksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjFiOCwgIlRoaW5rcGFkIEVkZ2UgMTQiLCBBTEMyNjlfRklYVVBfU0tVX0lHTk9SRSksCkBAIC01Nzk0LDYgKzU4MDgsMTMgQEAKIAl7MHgxNCwgMHg5MDE3MDExMH0sIFwKIAl7MHgxNSwgMHgwMjIxNDAxZn0KIAorI2RlZmluZSBBTEMyOTVfU1RBTkRBUkRfUElOUyBcCisJezB4MTIsIDB4YjdhNjAxMzB9LCBcCisJezB4MTQsIDB4OTAxNzAxMTB9LCBcCisJezB4MTcsIDB4MjEwMTQwMjB9LCBcCisJezB4MTgsIDB4MjFhMTkwMzB9LCBcCisJezB4MjEsIDB4MDQyMTEwMjB9CisKICNkZWZpbmUgQUxDMjk4X1NUQU5EQVJEX1BJTlMgXAogCXsweDEyLCAweDkwYTYwMTMwfSwgXAogCXsweDIxLCAweDAzMjExMDIwfQpAQCAtNTgzNCw2ICs1ODU1LDEwIEBACiAJCXsweDE0LCAweDkwMTcwMTIwfSwKIAkJezB4MjEsIDB4MDIyMTEwMzB9KSwKIAlTTkRfSERBX1BJTl9RVUlSSygweDEwZWMwMjU1LCAweDEwMjgsICJEZWxsIiwgQUxDMjU1X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSwKKwkJezB4MTQsIDB4OTAxNzAxMTB9LAorCQl7MHgxYiwgMHgwMjAxMTAyMH0sCisJCXsweDIxLCAweDAyMjExMDFmfSksCisJU05EX0hEQV9QSU5fUVVJUksoMHgxMGVjMDI1NSwgMHgxMDI4LCAiRGVsbCIsIEFMQzI1NV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UsCiAJCXsweDE0LCAweDkwMTcwMTMwfSwKIAkJezB4MWIsIDB4MDEwMTQwMjB9LAogCQl7MHgyMSwgMHgwMjIxMTAzZn0pLApAQCAtNTg5NCw2ICs1OTE5LDE0IEBACiAJCXsweDEyLCAweDkwYTYwMTcwfSwKIAkJezB4MTQsIDB4OTAxNzAxMjB9LAogCQl7MHgyMSwgMHgwMjIxMTAzMH0pLAorCVNORF9IREFfUElOX1FVSVJLKDB4MTBlYzAyNTYsIDB4MTAyOCwgIkRlbGwgSW5zcGlyb24gNTQ2OCIsIEFMQzI1NV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UsCisJCXsweDEyLCAweDkwYTYwMTgwfSwKKwkJezB4MTQsIDB4OTAxNzAxMjB9LAorCQl7MHgyMSwgMHgwMjIxMTAzMH0pLAorCVNORF9IREFfUElOX1FVSVJLKDB4MTBlYzAyNTYsIDB4MTAyOCwgIkRlbGwiLCBBTEMyNTVfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFLAorCQl7MHgxMiwgMHhiN2E2MDEzMH0sCisJCXsweDE0LCAweDkwMTcwMTEwfSwKKwkJezB4MjEsIDB4MDIyMTEwMjB9KSwKIAlTTkRfSERBX1BJTl9RVUlSSygweDEwZWMwMjU2LCAweDEwMjgsICJEZWxsIiwgQUxDMjU1X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSwKIAkJQUxDMjU2X1NUQU5EQVJEX1BJTlMpLAogCVNORF9IREFfUElOX1FVSVJLKDB4MTBlYzAyODAsIDB4MTAzYywgIkhQIiwgQUxDMjgwX0ZJWFVQX0hQX0dQSU80LApAQCAtNjAwNSw2ICs2MDM4LDggQEAKIAlTTkRfSERBX1BJTl9RVUlSSygweDEwZWMwMjkzLCAweDEwMjgsICJEZWxsIiwgQUxDMjkzX0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSwKIAkJQUxDMjkyX1NUQU5EQVJEX1BJTlMsCiAJCXsweDEzLCAweDkwYTYwMTQwfSksCisJU05EX0hEQV9QSU5fUVVJUksoMHgxMGVjMDI5NSwgMHgxMDI4LCAiRGVsbCIsIEFMQzI2OV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UsCisJCUFMQzI5NV9TVEFOREFSRF9QSU5TKSwKIAlTTkRfSERBX1BJTl9RVUlSSygweDEwZWMwMjk4LCAweDEwMjgsICJEZWxsIiwgQUxDMjk4X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSwKIAkJQUxDMjk4X1NUQU5EQVJEX1BJTlMsCiAJCXsweDE3LCAweDkwMTcwMTEwfSksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMKaW5kZXggOGFlM2JiNy4uYjRhYTRjMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYwpAQCAtODQ3LDcgKzg0Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2ljZTE3MTJfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaWNlMTcxMl9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2ljZTE3MTJfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfaWNlMTcxMl9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTg1OCw3ICs4NTgsNyBAQAogCS5wb2ludGVyID0Jc25kX2ljZTE3MTJfcGxheWJhY2tfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2ljZTE3MTJfcGxheWJhY2tfZHNfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaWNlMTcxMl9wbGF5YmFja19kc19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2ljZTE3MTJfcGxheWJhY2tfZHNfb3BlbiwKIAkuY2xvc2UgPQlzbmRfaWNlMTcxMl9wbGF5YmFja19kc19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTg2OSw3ICs4NjksNyBAQAogCS5wb2ludGVyID0Jc25kX2ljZTE3MTJfcGxheWJhY2tfZHNfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2ljZTE3MTJfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9pY2UxNzEyX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9pY2UxNzEyX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfaWNlMTcxMl9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTIyOCw3ICsxMjI4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaWNlMTcxMl9wbGF5YmFja19wcm9fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaWNlMTcxMl9wbGF5YmFja19wcm9fb3BzID0gewogCS5vcGVuID0JCXNuZF9pY2UxNzEyX3BsYXliYWNrX3Byb19vcGVuLAogCS5jbG9zZSA9CXNuZF9pY2UxNzEyX3BsYXliYWNrX3Byb19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEyMzksNyArMTIzOSw3IEBACiAJLnBvaW50ZXIgPQlzbmRfaWNlMTcxMl9wbGF5YmFja19wcm9fcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2ljZTE3MTJfY2FwdHVyZV9wcm9fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaWNlMTcxMl9jYXB0dXJlX3Byb19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2ljZTE3MTJfY2FwdHVyZV9wcm9fb3BlbiwKIAkuY2xvc2UgPQlzbmRfaWNlMTcxMl9jYXB0dXJlX3Byb19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYwppbmRleCAwYjIyYzAwLi5lNWM1MmVkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCkBAIC02MjAsOSArNjIwLDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBzdGRjbG9ja19nZXRfcmF0ZShzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKIHsKLQl1bnNpZ25lZCBpbnQgcmF0ZTsKLQlyYXRlID0gc3RkY2xvY2tfcmF0ZV9saXN0W2luYihJQ0VNVDE3MjQoaWNlLCBSQVRFKSkgJiAxNV07Ci0JcmV0dXJuIHJhdGU7CisJcmV0dXJuIHN0ZGNsb2NrX3JhdGVfbGlzdFtpbmIoSUNFTVQxNzI0KGljZSwgUkFURSkpICYgMTVdOwogfQogCiBzdGF0aWMgdm9pZCBzdGRjbG9ja19zZXRfcmF0ZShzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwgdW5zaWduZWQgaW50IHJhdGUpCkBAIC0xMTEzLDcgKzExMTEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92dDE3MjRfcGxheWJhY2tfcHJvX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3Z0MTcyNF9wbGF5YmFja19wcm9fb3BzID0gewogCS5vcGVuID0JCXNuZF92dDE3MjRfcGxheWJhY2tfcHJvX29wZW4sCiAJLmNsb3NlID0Jc25kX3Z0MTcyNF9wbGF5YmFja19wcm9fY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMTI0LDcgKzExMjIsNyBAQAogCS5wb2ludGVyID0Jc25kX3Z0MTcyNF9wbGF5YmFja19wcm9fcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3Z0MTcyNF9jYXB0dXJlX3Byb19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92dDE3MjRfY2FwdHVyZV9wcm9fb3BzID0gewogCS5vcGVuID0JCXNuZF92dDE3MjRfY2FwdHVyZV9wcm9fb3BlbiwKIAkuY2xvc2UgPQlzbmRfdnQxNzI0X2NhcHR1cmVfcHJvX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTI5Miw3ICsxMjkwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdnQxNzI0X3BsYXliYWNrX3NwZGlmX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3Z0MTcyNF9wbGF5YmFja19zcGRpZl9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3Z0MTcyNF9wbGF5YmFja19zcGRpZl9vcGVuLAogCS5jbG9zZSA9CXNuZF92dDE3MjRfcGxheWJhY2tfc3BkaWZfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMzAzLDcgKzEzMDEsNyBAQAogCS5wb2ludGVyID0Jc25kX3Z0MTcyNF9wY21fcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3Z0MTcyNF9jYXB0dXJlX3NwZGlmX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3Z0MTcyNF9jYXB0dXJlX3NwZGlmX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdnQxNzI0X2NhcHR1cmVfc3BkaWZfb3BlbiwKIAkuY2xvc2UgPQlzbmRfdnQxNzI0X2NhcHR1cmVfc3BkaWZfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xNDM3LDcgKzE0MzUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92dDE3MjRfcGxheWJhY2tfaW5kZXBfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdnQxNzI0X3BsYXliYWNrX2luZGVwX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdnQxNzI0X3BsYXliYWNrX2luZGVwX29wZW4sCiAJLmNsb3NlID0Jc25kX3Z0MTcyNF9wbGF5YmFja19pbmRlcF9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jIGIvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMKaW5kZXggOWUxYWQxMS4uNTY1ZjdmNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMKKysrIGIvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMKQEAgLTE2ODEsNyArMTY4MSw3IEBACiAJcmV0dXJuIHNuZF9rb3JnMTIxMl9jb3B5X3RvKGtvcmcxMjEyLCBkc3QsIHBvcywgY291bnQsIDAsIGtvcmcxMjEyLT5jaGFubmVscyAqIDIpOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9rb3JnMTIxMl9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9rb3JnMTIxMl9wbGF5YmFja19vcHMgPSB7CiAgICAgICAgIC5vcGVuID0JCXNuZF9rb3JnMTIxMl9wbGF5YmFja19vcGVuLAogICAgICAgICAuY2xvc2UgPQlzbmRfa29yZzEyMTJfcGxheWJhY2tfY2xvc2UsCiAgICAgICAgIC5pb2N0bCA9CXNuZF9rb3JnMTIxMl9pb2N0bCwKQEAgLTE2OTMsNyArMTY5Myw3IEBACiAgICAgICAgIC5zaWxlbmNlID0Jc25kX2tvcmcxMjEyX3BsYXliYWNrX3NpbGVuY2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9rb3JnMTIxMl9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2tvcmcxMjEyX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9rb3JnMTIxMl9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX2tvcmcxMjEyX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX2tvcmcxMjEyX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2xvbGEvbG9sYV9wY20uYyBiL3NvdW5kL3BjaS9sb2xhL2xvbGFfcGNtLmMKaW5kZXggM2JkNjk4NS4uMTI2OGJhMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2xvbGEvbG9sYV9wY20uYworKysgYi9zb3VuZC9wY2kvbG9sYS9sb2xhX3BjbS5jCkBAIC01ODYsNyArNTg2LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgbG9sYV9wY21fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBsb2xhX3BjbV9vcHMgPSB7CiAJLm9wZW4gPSBsb2xhX3BjbV9vcGVuLAogCS5jbG9zZSA9IGxvbGFfcGNtX2Nsb3NlLAogCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2x4NjQ2NGVzL2x4NjQ2NGVzLmMgYi9zb3VuZC9wY2kvbHg2NDY0ZXMvbHg2NDY0ZXMuYwppbmRleCA4YjhlMmU1Li5jMGYwYzM0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbHg2NDY0ZXMvbHg2NDY0ZXMuYworKysgYi9zb3VuZC9wY2kvbHg2NDY0ZXMvbHg2NDY0ZXMuYwpAQCAtODA0LDcgKzgwNCw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBseF9vcHNfcGxheWJhY2sgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIGx4X29wc19wbGF5YmFjayA9IHsKIAkub3BlbiAgICAgID0gbHhfcGNtX29wZW4sCiAJLmNsb3NlICAgICA9IGx4X3BjbV9jbG9zZSwKIAkuaW9jdGwgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCkBAIC04MTUsNyArODE1LDcgQEAKIAkucG9pbnRlciAgID0gbHhfcGNtX3N0cmVhbV9wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBseF9vcHNfY2FwdHVyZSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgbHhfb3BzX2NhcHR1cmUgPSB7CiAJLm9wZW4gICAgICA9IGx4X3BjbV9vcGVuLAogCS5jbG9zZSAgICAgPSBseF9wY21fY2xvc2UsCiAJLmlvY3RsICAgICA9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21hZXN0cm8zLmMgYi9zb3VuZC9wY2kvbWFlc3RybzMuYwppbmRleCAxN2FlOTI2Li5jYWZlYTZkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbWFlc3RybzMuYworKysgYi9zb3VuZC9wY2kvbWFlc3RybzMuYwpAQCAtMTgzNCw3ICsxODM0LDcgQEAKICAqIGNyZWF0ZSBwY20gaW5zdGFuY2UKICAqLwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9tM19wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9tM19wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX20zX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX20zX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTg0NSw3ICsxODQ1LDcgQEAKIAkucG9pbnRlciA9CXNuZF9tM19wY21fcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX20zX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfbTNfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX20zX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfbTNfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0LmMgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydC5jCmluZGV4IDI1YzBkZGQuLjgwZDQzOTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0LmMKKysrIGIvc291bmQvcGNpL21peGFydC9taXhhcnQuYwpAQCAtOTIyLDcgKzkyMiw3IEBACiAKIAogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9taXhhcnRfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfbWl4YXJ0X3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiAgICAgID0gc25kX21peGFydF9wbGF5YmFja19vcGVuLAogCS5jbG9zZSAgICAgPSBzbmRfbWl4YXJ0X2Nsb3NlLAogCS5pb2N0bCAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTkzMyw3ICs5MzMsNyBAQAogCS5wb2ludGVyICAgPSBzbmRfbWl4YXJ0X3N0cmVhbV9wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfbWl4YXJ0X2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfbWl4YXJ0X2NhcHR1cmVfb3BzID0gewogCS5vcGVuICAgICAgPSBzbmRfbWl4YXJ0X2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgICAgID0gc25kX21peGFydF9jbG9zZSwKIAkuaW9jdGwgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYyBiL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCmluZGV4IDQ3MzVlMjcuLjEwM2ZlMzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCisrKyBiL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCkBAIC05MDIsNyArOTAyLDcgQEAKIC8qCiAgKiBjcmVhdGUgYSBwY20gaW5zdGFuY2UKICAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfbm0yNTZfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfbm0yNTZfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9ubTI1Nl9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF9ubTI1Nl9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTkxNyw3ICs5MTcsNyBAQAogCS5tbWFwID0JCXNuZF9wY21fbGliX21tYXBfaW9tZW0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ubTI1Nl9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX25tMjU2X2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9ubTI1Nl9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX25tMjU2X2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9wY20uYyBiL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX3BjbS5jCmluZGV4IGFhMmViZDEuLjA0MmEyNDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX3BjbS5jCisrKyBiL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX3BjbS5jCkBAIC02MzEsNyArNjMxLDcgQEAKIAlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIGN1cnJfYWRkciAtICh1MzIpcnVudGltZS0+ZG1hX2FkZHIpOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIG94eWdlbl9yZWNfYV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIG94eWdlbl9yZWNfYV9vcHMgPSB7CiAJLm9wZW4gICAgICA9IG94eWdlbl9yZWNfYV9vcGVuLAogCS5jbG9zZSAgICAgPSBveHlnZW5fY2xvc2UsCiAJLmlvY3RsICAgICA9IHNuZF9wY21fbGliX2lvY3RsLApAQCAtNjQyLDcgKzY0Miw3IEBACiAJLnBvaW50ZXIgICA9IG94eWdlbl9wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBveHlnZW5fcmVjX2Jfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBveHlnZW5fcmVjX2Jfb3BzID0gewogCS5vcGVuICAgICAgPSBveHlnZW5fcmVjX2Jfb3BlbiwKIAkuY2xvc2UgICAgID0gb3h5Z2VuX2Nsb3NlLAogCS5pb2N0bCAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTY1Myw3ICs2NTMsNyBAQAogCS5wb2ludGVyICAgPSBveHlnZW5fcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgb3h5Z2VuX3JlY19jX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgb3h5Z2VuX3JlY19jX29wcyA9IHsKIAkub3BlbiAgICAgID0gb3h5Z2VuX3JlY19jX29wZW4sCiAJLmNsb3NlICAgICA9IG94eWdlbl9jbG9zZSwKIAkuaW9jdGwgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCkBAIC02NjQsNyArNjY0LDcgQEAKIAkucG9pbnRlciAgID0gb3h5Z2VuX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIG94eWdlbl9zcGRpZl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIG94eWdlbl9zcGRpZl9vcHMgPSB7CiAJLm9wZW4gICAgICA9IG94eWdlbl9zcGRpZl9vcGVuLAogCS5jbG9zZSAgICAgPSBveHlnZW5fY2xvc2UsCiAJLmlvY3RsICAgICA9IHNuZF9wY21fbGliX2lvY3RsLApAQCAtNjc1LDcgKzY3NSw3IEBACiAJLnBvaW50ZXIgICA9IG94eWdlbl9wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBveHlnZW5fbXVsdGljaF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIG94eWdlbl9tdWx0aWNoX29wcyA9IHsKIAkub3BlbiAgICAgID0gb3h5Z2VuX211bHRpY2hfb3BlbiwKIAkuY2xvc2UgICAgID0gb3h5Z2VuX2Nsb3NlLAogCS5pb2N0bCAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTY4Niw3ICs2ODYsNyBAQAogCS5wb2ludGVyICAgPSBveHlnZW5fcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgb3h5Z2VuX2FjOTdfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBveHlnZW5fYWM5N19vcHMgPSB7CiAJLm9wZW4gICAgICA9IG94eWdlbl9hYzk3X29wZW4sCiAJLmNsb3NlICAgICA9IG94eWdlbl9jbG9zZSwKIAkuaW9jdGwgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHIuYyBiL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCmluZGV4IDkyOTMyMzUuLmJiN2VlZTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCisrKyBiL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCkBAIC0xMTQ2LDcgKzExNDYsNyBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgcGN4aHJfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBwY3hocl9vcHMgPSB7CiAJLm9wZW4gICAgICA9IHBjeGhyX29wZW4sCiAJLmNsb3NlICAgICA9IHBjeGhyX2Nsb3NlLAogCS5pb2N0bCAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYyBiL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYwppbmRleCAwNjdhOTEyLi5hZGE1ZjAxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcmlwdGlkZS9yaXB0aWRlLmMKKysrIGIvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jCkBAIC02NDQsNyArNjQ0LDcgQEAKIAkgLm1vbm8gPSBsYnVzX3BsYXlfbW9ubzMsCiAJIH0sCiB9Owotc3RhdGljIHN0cnVjdCBsYnVzcGF0aCBsYnVzX3JlY19wYXRoID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBsYnVzcGF0aCBsYnVzX3JlY19wYXRoID0gewogCS5ub2NvbnYgPSBsYnVzX3JlY19ub2NvbnYxLAogCS5zdGVyZW8gPSBsYnVzX3JlY19zdGVyZW8xLAogCS5tb25vID0gbGJ1c19yZWNfbW9ubzEsCkBAIC0xNjY5LDcgKzE2NjksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9yaXB0aWRlX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JpcHRpZGVfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0gc25kX3JpcHRpZGVfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPSBzbmRfcmlwdGlkZV9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTE2ODAsNyArMTY4MCw3IEBACiAJLnRyaWdnZXIgPSBzbmRfcmlwdGlkZV90cmlnZ2VyLAogCS5wb2ludGVyID0gc25kX3JpcHRpZGVfcG9pbnRlciwKIH07Ci1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9yaXB0aWRlX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcmlwdGlkZV9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9IHNuZF9yaXB0aWRlX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPSBzbmRfcmlwdGlkZV9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTMyLmMgYi9zb3VuZC9wY2kvcm1lMzIuYwppbmRleCBjZDk0YWM1Li45NmQxNWRiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lMzIuYworKysgYi9zb3VuZC9wY2kvcm1lMzIuYwpAQCAtMTE5Niw3ICsxMTk2LDcgQEAKIH0KIAogLyogZm9yIGhhbGZkdXBsZXggbW9kZSAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lMzJfcGxheWJhY2tfc3BkaWZfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lMzJfcGxheWJhY2tfc3BkaWZfb3BzID0gewogCS5vcGVuID0JCXNuZF9ybWUzMl9wbGF5YmFja19zcGRpZl9vcGVuLAogCS5jbG9zZSA9CXNuZF9ybWUzMl9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEyMTAsNyArMTIxMCw3IEBACiAJLm1tYXAgPQkJc25kX3BjbV9saWJfbW1hcF9pb21lbSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTMyX2NhcHR1cmVfc3BkaWZfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lMzJfY2FwdHVyZV9zcGRpZl9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3JtZTMyX2NhcHR1cmVfc3BkaWZfb3BlbiwKIAkuY2xvc2UgPQlzbmRfcm1lMzJfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEyMjMsNyArMTIyMyw3IEBACiAJLm1tYXAgPQkJc25kX3BjbV9saWJfbW1hcF9pb21lbSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTMyX3BsYXliYWNrX2FkYXRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lMzJfcGxheWJhY2tfYWRhdF9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3JtZTMyX3BsYXliYWNrX2FkYXRfb3BlbiwKIAkuY2xvc2UgPQlzbmRfcm1lMzJfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMjM2LDcgKzEyMzYsNyBAQAogCS5tbWFwID0JCXNuZF9wY21fbGliX21tYXBfaW9tZW0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWUzMl9jYXB0dXJlX2FkYXRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lMzJfY2FwdHVyZV9hZGF0X29wcyA9IHsKIAkub3BlbiA9CQlzbmRfcm1lMzJfY2FwdHVyZV9hZGF0X29wZW4sCiAJLmNsb3NlID0Jc25kX3JtZTMyX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMjQ5LDcgKzEyNDksNyBAQAogfTsKIAogLyogZm9yIGZ1bGxkdXBsZXggbW9kZSAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lMzJfcGxheWJhY2tfc3BkaWZfZmRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lMzJfcGxheWJhY2tfc3BkaWZfZmRfb3BzID0gewogCS5vcGVuID0JCXNuZF9ybWUzMl9wbGF5YmFja19zcGRpZl9vcGVuLAogCS5jbG9zZSA9CXNuZF9ybWUzMl9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEyNjEsNyArMTI2MSw3IEBACiAJLmFjayA9CQlzbmRfcm1lMzJfcGxheWJhY2tfZmRfYWNrLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lMzJfY2FwdHVyZV9zcGRpZl9mZF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWUzMl9jYXB0dXJlX3NwZGlmX2ZkX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfcm1lMzJfY2FwdHVyZV9zcGRpZl9vcGVuLAogCS5jbG9zZSA9CXNuZF9ybWUzMl9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTI3Myw3ICsxMjczLDcgQEAKIAkuYWNrID0JCXNuZF9ybWUzMl9jYXB0dXJlX2ZkX2FjaywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTMyX3BsYXliYWNrX2FkYXRfZmRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lMzJfcGxheWJhY2tfYWRhdF9mZF9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3JtZTMyX3BsYXliYWNrX2FkYXRfb3BlbiwKIAkuY2xvc2UgPQlzbmRfcm1lMzJfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMjg0LDcgKzEyODQsNyBAQAogCS5hY2sgPQkJc25kX3JtZTMyX3BsYXliYWNrX2ZkX2FjaywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTMyX2NhcHR1cmVfYWRhdF9mZF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWUzMl9jYXB0dXJlX2FkYXRfZmRfb3BzID0gewogCS5vcGVuID0JCXNuZF9ybWUzMl9jYXB0dXJlX2FkYXRfb3BlbiwKIAkuY2xvc2UgPQlzbmRfcm1lMzJfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5Ni5jIGIvc291bmQvcGNpL3JtZTk2LmMKaW5kZXggNDFjMzFkYi4uMDViOWRhMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2LmMKKysrIGIvc291bmQvcGNpL3JtZTk2LmMKQEAgLTE1MDUsNyArMTUwNSw3IEBACiAJcmV0dXJuIHNuZF9ybWU5Nl9jYXB0dXJlX3B0cihybWU5Nik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTk2X3BsYXliYWNrX3NwZGlmX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTk2X3BsYXliYWNrX3NwZGlmX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfcm1lOTZfcGxheWJhY2tfc3BkaWZfb3BlbiwKIAkuY2xvc2UgPQlzbmRfcm1lOTZfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xNTE4LDcgKzE1MTgsNyBAQAogCS5tbWFwID0JCXNuZF9wY21fbGliX21tYXBfaW9tZW0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWU5Nl9jYXB0dXJlX3NwZGlmX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTk2X2NhcHR1cmVfc3BkaWZfb3BzID0gewogCS5vcGVuID0JCXNuZF9ybWU5Nl9jYXB0dXJlX3NwZGlmX29wZW4sCiAJLmNsb3NlID0Jc25kX3JtZTk2X2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xNTMwLDcgKzE1MzAsNyBAQAogCS5tbWFwID0JCXNuZF9wY21fbGliX21tYXBfaW9tZW0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWU5Nl9wbGF5YmFja19hZGF0X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTk2X3BsYXliYWNrX2FkYXRfb3BzID0gewogCS5vcGVuID0JCXNuZF9ybWU5Nl9wbGF5YmFja19hZGF0X29wZW4sCiAJLmNsb3NlID0Jc25kX3JtZTk2X3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTU0Myw3ICsxNTQzLDcgQEAKIAkubW1hcCA9CQlzbmRfcGNtX2xpYl9tbWFwX2lvbWVtLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lOTZfY2FwdHVyZV9hZGF0X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTk2X2NhcHR1cmVfYWRhdF9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3JtZTk2X2NhcHR1cmVfYWRhdF9vcGVuLAogCS5jbG9zZSA9CXNuZF9ybWU5Nl9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jCmluZGV4IDdjODk0MWIuLmI5NGZjNjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYworKysgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMKQEAgLTQ4NjEsNyArNDg2MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2hkc3BfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaGRzcF9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2hkc3BfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfaGRzcF9wbGF5YmFja19yZWxlYXNlLAogCS5pb2N0bCA9CXNuZF9oZHNwX2lvY3RsLApAQCAtNDg3Myw3ICs0ODczLDcgQEAKIAkuc2lsZW5jZSA9CXNuZF9oZHNwX2h3X3NpbGVuY2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9oZHNwX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaGRzcF9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfaGRzcF9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX2hkc3BfY2FwdHVyZV9yZWxlYXNlLAogCS5pb2N0bCA9CXNuZF9oZHNwX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKaW5kZXggYTRhOTk5YS4uMTRiYmY1NSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYworKysgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCkBAIC0xNjY2LDcgKzE2NjYsNyBAQAogCQkJICAgIEhEU1BNX0FVVE9TWU5DX0ZST01fTk9ORSkgewogCiAJCQkJZGV2X3dhcm4oaGRzcG0tPmNhcmQtPmRldiwKLQkJCQkJICJEZXRlY3RlZCBubyBFeHRlcm5lbCBTeW5jXG4iKTsKKwkJCQkJICJEZXRlY3RlZCBubyBFeHRlcm5hbCBTeW5jXG4iKTsKIAkJCQlub3Rfc2V0ID0gMTsKIAogCQkJfSBlbHNlIGlmIChyYXRlICE9IGV4dGVybmFsX2ZyZXEpIHsKQEAgLTYzNjEsNyArNjM2MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2hkc3BtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2hkc3BtX29wcyA9IHsKIAkub3BlbiA9IHNuZF9oZHNwbV9vcGVuLAogCS5jbG9zZSA9IHNuZF9oZHNwbV9yZWxlYXNlLAogCS5pb2N0bCA9IHNuZF9oZHNwbV9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYyBiL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYwppbmRleCBmZGJjMGFhLi41NTE3MmM2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jCkBAIC0yMzY4LDcgKzIzNjgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWU5NjUyX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTk2NTJfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9ybWU5NjUyX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX3JtZTk2NTJfcGxheWJhY2tfcmVsZWFzZSwKIAkuaW9jdGwgPQlzbmRfcm1lOTY1Ml9pb2N0bCwKQEAgLTIzODAsNyArMjM4MCw3IEBACiAJLnNpbGVuY2UgPQlzbmRfcm1lOTY1Ml9od19zaWxlbmNlLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lOTY1Ml9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTk2NTJfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3JtZTk2NTJfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9ybWU5NjUyX2NhcHR1cmVfcmVsZWFzZSwKIAkuaW9jdGwgPQlzbmRfcm1lOTY1Ml9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9zb25pY3ZpYmVzLmMgYi9zb3VuZC9wY2kvc29uaWN2aWJlcy5jCmluZGV4IDFiNmZhZDcuLmUxYTEzODcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9zb25pY3ZpYmVzLmMKKysrIGIvc291bmQvcGNpL3NvbmljdmliZXMuYwpAQCAtODU3LDcgKzg1Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3NvbmljdmliZXNfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfc29uaWN2aWJlc19wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3NvbmljdmliZXNfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfc29uaWN2aWJlc19wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTg2OCw3ICs4NjgsNyBAQAogCS5wb2ludGVyID0Jc25kX3NvbmljdmliZXNfcGxheWJhY2tfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3NvbmljdmliZXNfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9zb25pY3ZpYmVzX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9zb25pY3ZpYmVzX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfc29uaWN2aWJlc19jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYwppbmRleCA1OTlkMmI3Li4yN2YwZWQ4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYworKysgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYwpAQCAtMjA3MCw3ICsyMDcwLDcgQEAKICAgIFBDTSBvcGVyYXRpb25zCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3RyaWRlbnRfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdHJpZGVudF9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3RyaWRlbnRfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfdHJpZGVudF9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfdHJpZGVudF9pb2N0bCwKQEAgLTIwODEsNyArMjA4MSw3IEBACiAJLnBvaW50ZXIgPQlzbmRfdHJpZGVudF9wbGF5YmFja19wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdHJpZGVudF9ueF9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF90cmlkZW50X254X3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdHJpZGVudF9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF90cmlkZW50X3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF90cmlkZW50X2lvY3RsLApAQCAtMjExNSw3ICsyMTE1LDcgQEAKIAkucG9pbnRlciA9CXNuZF90cmlkZW50X3BsYXliYWNrX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF90cmlkZW50X2ZvbGRiYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3RyaWRlbnRfZm9sZGJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF90cmlkZW50X2ZvbGRiYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX3RyaWRlbnRfZm9sZGJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3RyaWRlbnRfaW9jdGwsCkBAIC0yMTI2LDcgKzIxMjYsNyBAQAogCS5wb2ludGVyID0Jc25kX3RyaWRlbnRfcGxheWJhY2tfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3RyaWRlbnRfbnhfZm9sZGJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdHJpZGVudF9ueF9mb2xkYmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3RyaWRlbnRfZm9sZGJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfdHJpZGVudF9mb2xkYmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfdHJpZGVudF9pb2N0bCwKQEAgLTIxMzgsNyArMjEzOCw3IEBACiAJLnBhZ2UgPQkJc25kX3BjbV9zZ2J1Zl9vcHNfcGFnZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3RyaWRlbnRfc3BkaWZfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdHJpZGVudF9zcGRpZl9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3RyaWRlbnRfc3BkaWZfb3BlbiwKIAkuY2xvc2UgPQlzbmRfdHJpZGVudF9zcGRpZl9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfdHJpZGVudF9pb2N0bCwKQEAgLTIxNDksNyArMjE0OSw3IEBACiAJLnBvaW50ZXIgPQlzbmRfdHJpZGVudF9zcGRpZl9wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdHJpZGVudF9zcGRpZl83MDE4X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3RyaWRlbnRfc3BkaWZfNzAxOF9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3RyaWRlbnRfc3BkaWZfb3BlbiwKIAkuY2xvc2UgPQlzbmRfdHJpZGVudF9zcGRpZl9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfdHJpZGVudF9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS92aWE4Mnh4LmMgYi9zb3VuZC9wY2kvdmlhODJ4eC5jCmluZGV4IDNkZDAzOGIuLjM4YTE3YjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS92aWE4Mnh4LmMKKysrIGIvc291bmQvcGNpL3ZpYTgyeHguYwpAQCAtMTM2Niw3ICsxMzY2LDcgQEAKIAogCiAvKiB2aWE2ODYgcGxheWJhY2sgY2FsbGJhY2tzICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92aWE2ODZfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdmlhNjg2X3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdmlhNjg2X3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX3ZpYTgyeHhfcGNtX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTM3OSw3ICsxMzc5LDcgQEAKIH07CiAKIC8qIHZpYTY4NiBjYXB0dXJlIGNhbGxiYWNrcyAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdmlhNjg2X2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdmlhNjg2X2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF92aWE4Mnh4X2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfdmlhODJ4eF9wY21fY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMzkyLDcgKzEzOTIsNyBAQAogfTsKIAogLyogdmlhODIzeCBEU1ggcGxheWJhY2sgY2FsbGJhY2tzICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92aWE4MjMzX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ZpYTgyMzNfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF92aWE4MjMzX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX3ZpYTgyMzNfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xNDA1LDcgKzE0MDUsNyBAQAogfTsKIAogLyogdmlhODIzeCBtdWx0aS1jaGFubmVsIHBsYXliYWNrIGNhbGxiYWNrcyAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdmlhODIzM19tdWx0aV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92aWE4MjMzX211bHRpX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdmlhODIzM19tdWx0aV9vcGVuLAogCS5jbG9zZSA9CXNuZF92aWE4Mnh4X3BjbV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTE0MTgsNyArMTQxOCw3IEBACiB9OwogCiAvKiB2aWE4MjN4IGNhcHR1cmUgY2FsbGJhY2tzICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92aWE4MjMzX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdmlhODIzM19jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdmlhODJ4eF9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX3ZpYTgyeHhfcGNtX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYyBiL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKaW5kZXggOTliOTEzNy4uMmY2ZDQwZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYworKysgYi9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jCkBAIC04MDQsNyArODA0LDcgQEAKIAogCiAvKiB2aWE2ODYgcGxheWJhY2sgY2FsbGJhY2tzICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92aWE2ODZfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdmlhNjg2X3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdmlhODJ4eF9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF92aWE4Mnh4X3BjbV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTgxNyw3ICs4MTcsNyBAQAogfTsKIAogLyogdmlhNjg2IGNhcHR1cmUgY2FsbGJhY2tzICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92aWE2ODZfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92aWE2ODZfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3ZpYTgyeHhfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF92aWE4Mnh4X3BjbV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYwppbmRleCA0YzI2MDc2Li5mZmVlMjg0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKKysrIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCkBAIC0xMTIzLDcgKzExMjMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF95bWZwY2lfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfeW1mcGNpX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQkJc25kX3ltZnBjaV9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CQlzbmRfeW1mcGNpX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTExMzQsNyArMTEzNCw3IEBACiAJLnBvaW50ZXIgPQkJc25kX3ltZnBjaV9wbGF5YmFja19wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfeW1mcGNpX2NhcHR1cmVfcmVjX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ltZnBjaV9jYXB0dXJlX3JlY19vcHMgPSB7CiAJLm9wZW4gPQkJCXNuZF95bWZwY2lfY2FwdHVyZV9yZWNfb3BlbiwKIAkuY2xvc2UgPQkJc25kX3ltZnBjaV9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTExNjksNyArMTE2OSw3IEBACiAJCQkJICAgICBzbmRfcGNtX3N0ZF9jaG1hcHMsIDIsIDAsIE5VTEwpOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF95bWZwY2lfY2FwdHVyZV9hYzk3X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ltZnBjaV9jYXB0dXJlX2FjOTdfb3BzID0gewogCS5vcGVuID0JCQlzbmRfeW1mcGNpX2NhcHR1cmVfYWM5N19vcGVuLAogCS5jbG9zZSA9CQlzbmRfeW1mcGNpX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTIwMyw3ICsxMjAzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfeW1mcGNpX3BsYXliYWNrX3NwZGlmX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ltZnBjaV9wbGF5YmFja19zcGRpZl9vcHMgPSB7CiAJLm9wZW4gPQkJCXNuZF95bWZwY2lfcGxheWJhY2tfc3BkaWZfb3BlbiwKIAkuY2xvc2UgPQkJc25kX3ltZnBjaV9wbGF5YmFja19zcGRpZl9jbG9zZSwKIAkuaW9jdGwgPQkJc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMjM2LDcgKzEyMzYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF95bWZwY2lfcGxheWJhY2tfNGNoX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ltZnBjaV9wbGF5YmFja180Y2hfb3BzID0gewogCS5vcGVuID0JCQlzbmRfeW1mcGNpX3BsYXliYWNrXzRjaF9vcGVuLAogCS5jbG9zZSA9CQlzbmRfeW1mcGNpX3BsYXliYWNrXzRjaF9jbG9zZSwKIAkuaW9jdGwgPQkJc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wcGMvc25kX3BzMy5jIGIvc291bmQvcHBjL3NuZF9wczMuYwppbmRleCAzNjgyNDI1Li5iODRkN2QzIDEwMDY0NAotLS0gYS9zb3VuZC9wcGMvc25kX3BzMy5jCisrKyBiL3NvdW5kL3BwYy9zbmRfcHMzLmMKQEAgLTU2NCw5ICs1NjQsNyBAQAogCiBzdGF0aWMgaW50IHNuZF9wczNfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0JaW50IHJldDsKLQlyZXQgPSBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwogfTsKIAogc3RhdGljIGludCBzbmRfcHMzX2RlbGF5X3RvX2J5dGVzKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2FtZC9hY3AtcGNtLWRtYS5jIGIvc291bmQvc29jL2FtZC9hY3AtcGNtLWRtYS5jCmluZGV4IGQxZmIwMzUuLjUwNGM3Y2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hbWQvYWNwLXBjbS1kbWEuYworKysgYi9zb3VuZC9zb2MvYW1kL2FjcC1wY20tZG1hLmMKQEAgLTg5Nyw3ICs4OTcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGFjcF9kbWFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBhY3BfZG1hX29wcyA9IHsKIAkub3BlbiA9IGFjcF9kbWFfb3BlbiwKIAkuY2xvc2UgPSBhY3BfZG1hX2Nsb3NlLAogCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVsL2F0bWVsLWNsYXNzZC5jIGIvc291bmQvc29jL2F0bWVsL2F0bWVsLWNsYXNzZC5jCmluZGV4IDZkOWI4YjQuLjg5YWM1ZjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1jbGFzc2QuYworKysgYi9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtY2xhc3NkLmMKQEAgLTMwOCw5ICszMDgsMTEgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2NsYXNzZCA9IHsKIAkucHJvYmUJCT0gYXRtZWxfY2xhc3NkX2NvZGVjX3Byb2JlLAotCS5jb250cm9scwk9IGF0bWVsX2NsYXNzZF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scwk9IEFSUkFZX1NJWkUoYXRtZWxfY2xhc3NkX3NuZF9jb250cm9scyksCiAJLmdldF9yZWdtYXAJPSBhdG1lbF9jbGFzc2RfY29kZWNfZ2V0X3JlbWFwLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYXRtZWxfY2xhc3NkX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGF0bWVsX2NsYXNzZF9zbmRfY29udHJvbHMpLAorCX0sCiB9OwogCiAvKiBjb2RlYyBkYWkgY29tcG9uZW50ICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtcGNtLXBkYy5jIGIvc291bmQvc29jL2F0bWVsL2F0bWVsLXBjbS1wZGMuYwppbmRleCBkYTg2MWI0Li45MWI3MDY5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtcGNtLXBkYy5jCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wY20tcGRjLmMKQEAgLTM4MSw3ICszODEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGF0bWVsX3BjbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIGF0bWVsX3BjbV9vcHMgPSB7CiAJLm9wZW4JCT0gYXRtZWxfcGNtX29wZW4sCiAJLmNsb3NlCQk9IGF0bWVsX3BjbV9jbG9zZSwKIAkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtcGRtaWMuYyBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wZG1pYy5jCmluZGV4IDVmNTZkYTYuLmM5MTdkZjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wZG1pYy5jCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wZG1pYy5jCkBAIC04MCw3ICs4MCw3IEBACiAKIAlpZiAocGRhdGEtPm1pY19tYXhfZnJlcSA8IHBkYXRhLT5taWNfbWluX2ZyZXEpIHsKIAkJZGV2X2VycihkZXYsCi0JCQkibWljLW1heC1mcmVxIHNob3VsZCBub3QgbGVzcyB0aGFuIG1pYy1taW4tZnJlcVxuIik7CisJCQkibWljLW1heC1mcmVxIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuIG1pYy1taW4tZnJlcVxuIik7CiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KIApAQCAtMTE1LDggKzExNSwxMCBAQAogCQlyZXR1cm4gcmV0OwogCiAJcmV0ID0gIGNsa19wcmVwYXJlX2VuYWJsZShkZC0+cGNsayk7Ci0JaWYgKHJldCkKKwlpZiAocmV0KSB7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShkZC0+Z2Nsayk7CiAJCXJldHVybiByZXQ7CisJfQogCiAJLyogQ2xlYXIgYWxsIGJpdHMgaW4gdGhlIENvbnRyb2wgUmVnaXN0ZXIoUERNSUNfQ1IpICovCiAJcmVnbWFwX3dyaXRlKGRkLT5yZWdtYXAsIFBETUlDX0NSLCAwKTsKQEAgLTI4Myw3ICsyODUsNyBAQAogCTgsIEFSUkFZX1NJWkUobWljX2dhaW5fdGFibGUpLTEsIFRMVl9EQl9TQ0FMRV9JVEVNKC02NTAwLCAxMDAsIDApLAogKTsKIAotaW50IHBkbWljX2dldF9taWNfdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCitzdGF0aWMgaW50IHBkbWljX2dldF9taWNfdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CkBAIC0zNTcsOCArMzU5LDEwIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9wZG1pYyA9IHsKIAkucHJvYmUJCT0gYXRtZWxfcGRtaWNfY29kZWNfcHJvYmUsCi0JLmNvbnRyb2xzCT0gYXRtZWxfcGRtaWNfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJPSBBUlJBWV9TSVpFKGF0bWVsX3BkbWljX3NuZF9jb250cm9scyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhdG1lbF9wZG1pY19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhdG1lbF9wZG1pY19zbmRfY29udHJvbHMpLAorCX0sCiB9OwogCiAvKiBjb2RlYyBkYWkgY29tcG9uZW50ICovCkBAIC01OTYsNyArNjAwLDcgQEAKIAlkZC0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAoZGQtPmlycSA8IDApIHsKIAkJcmV0ID0gZGQtPmlycTsKLQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY291bGQgbm90IGdldCBpcnE6ICVkXG4iLCByZXQpOworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgaXJxOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTYxNCw3ICs2MTgsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCS8qIFRoZSBnY2xrIGNsb2NrIGZyZXF1ZW5jeSBtdXN0IGFsd2F5cyBiZSB0cmVlIHRpbWVzCisJLyogVGhlIGdjbGsgY2xvY2sgZnJlcXVlbmN5IG11c3QgYWx3YXlzIGJlIHRocmVlIHRpbWVzCiAJICogbG93ZXIgdGhhbiB0aGUgcGNsayBjbG9jayBmcmVxdWVuY3kKIAkgKi8KIAlyZXQgPSBjbGtfc2V0X3JhdGUoZGQtPmdjbGssIGNsa19nZXRfcmF0ZShkZC0+cGNsaykvMyk7CkBAIC02NDksNyArNjUzLDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQkvKiBHZXQgdGhlIG1pbmltYWwgYW5kIG1heGltYWwgc2FtcGxlIHJhdGUgdGhhdCBtaWNwaG9uZSBzdXBwb3J0cyAqLworCS8qIEdldCB0aGUgbWluaW1hbCBhbmQgbWF4aW1hbCBzYW1wbGUgcmF0ZSB0aGF0IHRoZSBtaWNyb3Bob25lIHN1cHBvcnRzICovCiAJYXRtZWxfcGRtaWNfZ2V0X3NhbXBsZV9yYXRlKGRkLCAmcmF0ZV9taW4sICZyYXRlX21heCk7CiAKIAkvKiByZWdpc3RlciBjcHUgZGFpICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvYXRtZWxfc3NjX2RhaS5jIGIvc291bmQvc29jL2F0bWVsL2F0bWVsX3NzY19kYWkuYwppbmRleCA1NGMwOWFjLi4xNmU0NTlhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXRtZWwvYXRtZWxfc3NjX2RhaS5jCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbF9zc2NfZGFpLmMKQEAgLTI5OSw4ICsyOTksOSBAQAogCWNsa19lbmFibGUoc3NjX3AtPnNzYy0+Y2xrKTsKIAlzc2NfcC0+bWNrX3JhdGUgPSBjbGtfZ2V0X3JhdGUoc3NjX3AtPnNzYy0+Y2xrKTsKIAotCS8qIFJlc2V0IHRoZSBTU0MgdG8ga2VlcCBpdCBhdCBhIGNsZWFuIHN0YXR1cyAqLwotCXNzY193cml0ZWwoc3NjX3AtPnNzYy0+cmVncywgQ1IsIFNTQ19CSVQoQ1JfU1dSU1QpKTsKKwkvKiBSZXNldCB0aGUgU1NDIHVubGVzcyBpbml0aWFsaXplZCB0byBrZWVwIGl0IGluIGEgY2xlYW4gc3RhdGUgKi8KKwlpZiAoIXNzY19wLT5pbml0aWFsaXplZCkKKwkJc3NjX3dyaXRlbChzc2NfcC0+c3NjLT5yZWdzLCBDUiwgU1NDX0JJVChDUl9TV1JTVCkpOwogCiAJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKIAkJZGlyID0gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvODhwbTg2MHgtY29kZWMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvODhwbTg2MHgtY29kZWMuYwppbmRleCBlOGJlZDZiLi5iMDEzYTRjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzLzg4cG04NjB4LWNvZGVjLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy84OHBtODYweC1jb2RlYy5jCkBAIC0xMzYxLDEyICsxMzYxLDE0IEBACiAJLnNldF9iaWFzX2xldmVsCT0gcG04NjB4X3NldF9iaWFzX2xldmVsLAogCS5nZXRfcmVnbWFwCT0gcG04NjB4X2dldF9yZWdtYXAsCiAKLQkuY29udHJvbHMgPSBwbTg2MHhfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHBtODYweF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBwbTg2MHhfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShwbTg2MHhfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBwbTg2MHhfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocG04NjB4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHBtODYweF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShwbTg2MHhfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBwbTg2MHhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocG04NjB4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBwbTg2MHhfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHBtODYweF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgcG04NjB4X2NvZGVjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKaW5kZXggMWNkNmFiMy4uYzY3NjY3YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZwpAQCAtOTIsNiArOTIsNyBAQAogCXNlbGVjdCBTTkRfU09DX01BWDk4NzcgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfTUMxMzc4MyBpZiBNRkRfTUMxM1hYWAogCXNlbGVjdCBTTkRfU09DX01MMjYxMjQgaWYgSTJDCisJc2VsZWN0IFNORF9TT0NfTkFVODgxMCBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19OQVU4ODI1IGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX0hETUlfQ09ERUMKIAlzZWxlY3QgU05EX1NPQ19QQ00xNjgxIGlmIEkyQwpAQCAtMTEyLDYgKzExMyw4IEBACiAJc2VsZWN0IFNORF9TT0NfUlQ1NjQ1IGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1JUNTY1MSBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19SVDU2NTkgaWYgSTJDCisJc2VsZWN0IFNORF9TT0NfUlQ1NjYwIGlmIEkyQworCXNlbGVjdCBTTkRfU09DX1JUNTY2MyBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19SVDU2NzAgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfUlQ1Njc3IGlmIEkyQyAmJiBTUElfTUFTVEVSCiAJc2VsZWN0IFNORF9TT0NfU0dUTDUwMDAgaWYgSTJDCkBAIC02NDUsNiArNjQ4LDggQEAKIAlkZWZhdWx0IHkgaWYgU05EX1NPQ19SVDU2NDU9eQogCWRlZmF1bHQgeSBpZiBTTkRfU09DX1JUNTY1MT15CiAJZGVmYXVsdCB5IGlmIFNORF9TT0NfUlQ1NjU5PXkKKwlkZWZhdWx0IHkgaWYgU05EX1NPQ19SVDU2NjA9eQorCWRlZmF1bHQgeSBpZiBTTkRfU09DX1JUNTY2Mz15CiAJZGVmYXVsdCB5IGlmIFNORF9TT0NfUlQ1NjcwPXkKIAlkZWZhdWx0IHkgaWYgU05EX1NPQ19SVDU2Nzc9eQogCWRlZmF1bHQgbSBpZiBTTkRfU09DX1JUNTUxND1tCkBAIC02NTMsNiArNjU4LDggQEAKIAlkZWZhdWx0IG0gaWYgU05EX1NPQ19SVDU2NDU9bQogCWRlZmF1bHQgbSBpZiBTTkRfU09DX1JUNTY1MT1tCiAJZGVmYXVsdCBtIGlmIFNORF9TT0NfUlQ1NjU5PW0KKwlkZWZhdWx0IG0gaWYgU05EX1NPQ19SVDU2NjA9bQorCWRlZmF1bHQgbSBpZiBTTkRfU09DX1JUNTY2Mz1tCiAJZGVmYXVsdCBtIGlmIFNORF9TT0NfUlQ1NjcwPW0KIAlkZWZhdWx0IG0gaWYgU05EX1NPQ19SVDU2Nzc9bQogCkBAIC02NjUsNiArNjcyLDcgQEAKIAogY29uZmlnIFNORF9TT0NfUlQyODYKIAl0cmlzdGF0ZQorCXNlbGVjdCBTTkRfU09DX1JUNTY2MwogCWRlcGVuZHMgb24gSTJDCiAKIGNvbmZpZyBTTkRfU09DX1JUMjk4CkBAIC02OTcsNiArNzA1LDEyIEBACiBjb25maWcgU05EX1NPQ19SVDU2NTkKIAl0cmlzdGF0ZQogCitjb25maWcgU05EX1NPQ19SVDU2NjAKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19SVDU2NjMKKwl0cmlzdGF0ZQorCiBjb25maWcgU05EX1NPQ19SVDU2NzAKIAl0cmlzdGF0ZQogCkBAIC0xMDY0LDYgKzEwNzgsMTAgQEAKIGNvbmZpZyBTTkRfU09DX01MMjYxMjQKIAl0cmlzdGF0ZQogCitjb25maWcgU05EX1NPQ19OQVU4ODEwCisJdHJpc3RhdGUgIk51dm90b24gVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiBOQVU4OEMxMCBDT0RFQyIKKwlkZXBlbmRzIG9uIEkyQworCiBjb25maWcgU05EX1NPQ19OQVU4ODI1CiAJdHJpc3RhdGUKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZSBiL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUKaW5kZXggNTgwMzZhZi4uOTU4Y2Q0OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCkBAIC04Niw2ICs4Niw3IEBACiBzbmQtc29jLW1heDk4NjAtb2JqcyA6PSBtYXg5ODYwLm8KIHNuZC1zb2MtbWMxMzc4My1vYmpzIDo9IG1jMTM3ODMubwogc25kLXNvYy1tbDI2MTI0LW9ianMgOj0gbWwyNjEyNC5vCitzbmQtc29jLW5hdTg4MTAtb2JqcyA6PSBuYXU4ODEwLm8KIHNuZC1zb2MtbmF1ODgyNS1vYmpzIDo9IG5hdTg4MjUubwogc25kLXNvYy1oZG1pLWNvZGVjLW9ianMgOj0gaGRtaS1jb2RlYy5vCiBzbmQtc29jLXBjbTE2ODEtb2JqcyA6PSBwY20xNjgxLm8KQEAgLTExMiw2ICsxMTMsOCBAQAogc25kLXNvYy1ydDU2NDUtb2JqcyA6PSBydDU2NDUubwogc25kLXNvYy1ydDU2NTEtb2JqcyA6PSBydDU2NTEubwogc25kLXNvYy1ydDU2NTktb2JqcyA6PSBydDU2NTkubworc25kLXNvYy1ydDU2NjAtb2JqcyA6PSBydDU2NjAubworc25kLXNvYy1ydDU2NjMtb2JqcyA6PSBydDU2NjMubwogc25kLXNvYy1ydDU2NzAtb2JqcyA6PSBydDU2NzAubwogc25kLXNvYy1ydDU2Nzctb2JqcyA6PSBydDU2Nzcubwogc25kLXNvYy1ydDU2Nzctc3BpLW9ianMgOj0gcnQ1Njc3LXNwaS5vCkBAIC0zMDcsNiArMzEwLDcgQEAKIG9iai0kKENPTkZJR19TTkRfU09DX01BWDk4NjApCSs9IHNuZC1zb2MtbWF4OTg2MC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19NQzEzNzgzKQkrPSBzbmQtc29jLW1jMTM3ODMubwogb2JqLSQoQ09ORklHX1NORF9TT0NfTUwyNjEyNCkJKz0gc25kLXNvYy1tbDI2MTI0Lm8KK29iai0kKENPTkZJR19TTkRfU09DX05BVTg4MTApICAgKz0gc25kLXNvYy1uYXU4ODEwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX05BVTg4MjUpICAgKz0gc25kLXNvYy1uYXU4ODI1Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX0hETUlfQ09ERUMpCSs9IHNuZC1zb2MtaGRtaS1jb2RlYy5vCiBvYmotJChDT05GSUdfU05EX1NPQ19QQ00xNjgxKQkrPSBzbmQtc29jLXBjbTE2ODEubwpAQCAtMzMzLDYgKzMzNyw4IEBACiBvYmotJChDT05GSUdfU05EX1NPQ19SVDU2NDUpCSs9IHNuZC1zb2MtcnQ1NjQ1Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX1JUNTY1MSkJKz0gc25kLXNvYy1ydDU2NTEubwogb2JqLSQoQ09ORklHX1NORF9TT0NfUlQ1NjU5KQkrPSBzbmQtc29jLXJ0NTY1OS5vCitvYmotJChDT05GSUdfU05EX1NPQ19SVDU2NjApCSs9IHNuZC1zb2MtcnQ1NjYwLm8KK29iai0kKENPTkZJR19TTkRfU09DX1JUNTY2MykJKz0gc25kLXNvYy1ydDU2NjMubwogb2JqLSQoQ09ORklHX1NORF9TT0NfUlQ1NjcwKQkrPSBzbmQtc29jLXJ0NTY3MC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19SVDU2NzcpCSs9IHNuZC1zb2MtcnQ1Njc3Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX1JUNTY3N19TUEkpCSs9IHNuZC1zb2MtcnQ1Njc3LXNwaS5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FiODUwMC1jb2RlYy5jIGIvc291bmQvc29jL2NvZGVjcy9hYjg1MDAtY29kZWMuYwppbmRleCAyZmM4OTE1Li45MzVmZjdjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FiODUwMC1jb2RlYy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWI4NTAwLWNvZGVjLmMKQEAgLTI0MDgsMjggKzI0MDgsMjggQEAKIHsKIAl1MzIgdmFsdWU7CiAKLQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAic3Rlcmljc3NvbixhbWljMS10eXBlLXNpbmdsZS1lbmRlZCIsIE5VTEwpKQorCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJzdGVyaWNzc29uLGFtaWMxLXR5cGUtc2luZ2xlLWVuZGVkIikpCiAJCWNvZGVjLT5hbWljcy5taWMxX3R5cGUgPSBBTUlDX1RZUEVfU0lOR0xFX0VOREVEOwogCWVsc2UKIAkJY29kZWMtPmFtaWNzLm1pYzFfdHlwZSA9IEFNSUNfVFlQRV9ESUZGRVJFTlRJQUw7CiAKLQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAic3Rlcmljc3NvbixhbWljMi10eXBlLXNpbmdsZS1lbmRlZCIsIE5VTEwpKQorCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJzdGVyaWNzc29uLGFtaWMyLXR5cGUtc2luZ2xlLWVuZGVkIikpCiAJCWNvZGVjLT5hbWljcy5taWMyX3R5cGUgPSBBTUlDX1RZUEVfU0lOR0xFX0VOREVEOwogCWVsc2UKIAkJY29kZWMtPmFtaWNzLm1pYzJfdHlwZSA9IEFNSUNfVFlQRV9ESUZGRVJFTlRJQUw7CiAKIAkvKiBIYXMgYSBub24tc3RhbmRhcmQgVmFtaWMgYmVlbiByZXF1ZXN0ZWQ/ICovCi0JaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgInN0ZXJpY3Nzb24sYW1pYzFhLWJpYXMtdmFtaWMyIiwgTlVMTCkpCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgInN0ZXJpY3Nzb24sYW1pYzFhLWJpYXMtdmFtaWMyIikpCiAJCWNvZGVjLT5hbWljcy5taWMxYV9taWNiaWFzID0gQU1JQ19NSUNCSUFTX1ZBTUlDMjsKIAllbHNlCiAJCWNvZGVjLT5hbWljcy5taWMxYV9taWNiaWFzID0gQU1JQ19NSUNCSUFTX1ZBTUlDMTsKIAotCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJzdGVyaWNzc29uLGFtaWMxYi1iaWFzLXZhbWljMiIsIE5VTEwpKQorCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJzdGVyaWNzc29uLGFtaWMxYi1iaWFzLXZhbWljMiIpKQogCQljb2RlYy0+YW1pY3MubWljMWJfbWljYmlhcyA9IEFNSUNfTUlDQklBU19WQU1JQzI7CiAJZWxzZQogCQljb2RlYy0+YW1pY3MubWljMWJfbWljYmlhcyA9IEFNSUNfTUlDQklBU19WQU1JQzE7CiAKLQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAic3Rlcmljc3NvbixhbWljMi1iaWFzLXZhbWljMSIsIE5VTEwpKQorCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJzdGVyaWNzc29uLGFtaWMyLWJpYXMtdmFtaWMxIikpCiAJCWNvZGVjLT5hbWljcy5taWMyX21pY2JpYXMgPSBBTUlDX01JQ0JJQVNfVkFNSUMxOwogCWVsc2UKIAkJY29kZWMtPmFtaWNzLm1pYzJfbWljYmlhcyA9IEFNSUNfTUlDQklBU19WQU1JQzI7CkBAIC0yNTI1LDEyICsyNTI1LDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgYWI4NTAwX2NvZGVjX2RyaXZlciA9IHsKIAkucHJvYmUgPQkJYWI4NTAwX2NvZGVjX3Byb2JlLAotCS5jb250cm9scyA9CQlhYjg1MDBfY3RybHMsCi0JLm51bV9jb250cm9scyA9CQlBUlJBWV9TSVpFKGFiODUwMF9jdHJscyksCi0JLmRhcG1fd2lkZ2V0cyA9CQlhYjg1MDBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0JQVJSQVlfU0laRShhYjg1MDBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPQkJYWI4NTAwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPQlBUlJBWV9TSVpFKGFiODUwMF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scyA9CQlhYjg1MDBfY3RybHMsCisJCS5udW1fY29udHJvbHMgPQkJQVJSQVlfU0laRShhYjg1MDBfY3RybHMpLAorCQkuZGFwbV93aWRnZXRzID0JCWFiODUwMF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzID0JQVJSQVlfU0laRShhYjg1MDBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzID0JCWFiODUwMF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcyA9CUFSUkFZX1NJWkUoYWI4NTAwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBhYjg1MDBfY29kZWNfZHJpdmVyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FjOTcuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5jCmluZGV4IDViMzIyNGMuLmY3ZjA0YzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5jCkBAIC0xMTcsMTAgKzExNywxMiBAQAogCS5zdXNwZW5kID0JYWM5N19zb2Nfc3VzcGVuZCwKIAkucmVzdW1lID0JYWM5N19zb2NfcmVzdW1lLAogCi0JLmRhcG1fd2lkZ2V0cyA9IGFjOTdfd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWM5N193aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhYzk3X3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhYzk3X3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gYWM5N193aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWM5N193aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFjOTdfcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhYzk3X3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgYWM5N19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmMKaW5kZXggZTJjZTZjNC4uYTQ3ODIzOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5jCkBAIC0zMjcsMTIgKzMyNywxNCBAQAogCS5zdXNwZW5kID0gYWQxODM2X3N1c3BlbmQsCiAJLnJlc3VtZSA9IGFkMTgzNl9yZXN1bWUsCiAKLQkuY29udHJvbHMgPSBhZDE4M3hfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYWQxODN4X2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gYWQxODN4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWQxODN4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWQxODN4X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFkMTgzeF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhZDE4M3hfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhZDE4M3hfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGFkMTgzeF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhZDE4M3hfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFkMTgzeF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWQxODN4X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCBhZDE4MzZfcmVnX2RlZmF1bHRzW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC5jIGIvc291bmQvc29jL2NvZGVjcy9hZDE5M3guYwppbmRleCAzYTNmM2YyLi5kNjQzNTU3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmMKQEAgLTQxMCwxMiArNDEwLDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9hZDE5M3ggPSB7CiAJLnByb2JlID0gYWQxOTN4X2NvZGVjX3Byb2JlLAotCS5jb250cm9scyA9IGFkMTkzeF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYWQxOTN4X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGFkMTkzeF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFkMTkzeF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGF1ZGlvX3BhdGhzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX3BhdGhzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFkMTkzeF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhZDE5M3hfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhZDE5M3hfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWQxOTN4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhdWRpb19wYXRocywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYXVkaW9fcGF0aHMpLAorCX0sCiB9OwogCiBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhZDE5M3hfcmVnbWFwX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTgwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTk4MC5jCmluZGV4IDllZjIwZGIuLmI3YzFiOWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTgwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZDE5ODAuYwpAQCAtMjk5LDEyICsyOTksMTQgQEAKIAkucHJvYmUgPSAJYWQxOTgwX3NvY19wcm9iZSwKIAkucmVtb3ZlID0gCWFkMTk4MF9zb2NfcmVtb3ZlLAogCi0JLmNvbnRyb2xzID0gYWQxOTgwX3NuZF9hYzk3X2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFkMTk4MF9zbmRfYWM5N19jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGFkMTk4MF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFkMTk4MF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFkMTk4MF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhZDE5ODBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWQxOTgwX3NuZF9hYzk3X2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWQxOTgwX3NuZF9hYzk3X2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhZDE5ODBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWQxOTgwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhZDE5ODBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFkMTk4MF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgYWQxOTgwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkNzMzMTEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQ3MzMxMS5jCmluZGV4IGE5NDAwYWUuLjNlMzU4YTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWQ3MzMxMS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQ3MzMxMS5jCkBAIC01NSwxMCArNTUsMTIgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9hZDczMzExID0gewotCS5kYXBtX3dpZGdldHMgPSBhZDczMzExX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWQ3MzMxMV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFkNzMzMTFfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWQ3MzMxMV9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gYWQ3MzMxMV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhZDczMzExX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhZDczMzExX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhZDczMzExX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBhZDczMzExX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxMzczLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxMzczLmMKaW5kZXggMTU1NmIzNi4uOGZhOTA0NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTM3My5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTEzNzMuYwpAQCAtMTQ2NiwxMiArMTQ2NiwxNCBAQAogCiAJLnNldF9wbGwgPSBhZGF1MTM3M19zZXRfcGxsLAogCi0JLmNvbnRyb2xzID0gYWRhdTEzNzNfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYWRhdTEzNzNfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBhZGF1MTM3M19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFkYXUxMzczX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWRhdTEzNzNfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWRhdTEzNzNfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWRhdTEzNzNfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhZGF1MTM3M19jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gYWRhdTEzNzNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWRhdTEzNzNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFkYXUxMzczX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhZGF1MTM3M19kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgYWRhdTEzNzNfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxNzAxLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxNzAxLmMKaW5kZXggZGU1M2MwZC4uM2JhZDFiYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTcwMS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3MDEuYwpAQCAtNzY1LDEzICs3NjUsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwJCT0gYWRhdTE3MDFfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYJCT0gdHJ1ZSwKIAotCS5jb250cm9scwkJPSBhZGF1MTcwMV9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWRhdTE3MDFfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMJCT0gYWRhdTE3MDFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhZGF1MTcwMV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBhZGF1MTcwMV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhZGF1MTcwMV9kYXBtX3JvdXRlcyksCi0KKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFkYXUxNzAxX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWRhdTE3MDFfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGFkYXUxNzAxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFkYXUxNzAxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhZGF1MTcwMV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWRhdTE3MDFfZGFwbV9yb3V0ZXMpLAorCX0sCiAJLnNldF9zeXNjbGsJCT0gYWRhdTE3MDFfc2V0X3N5c2NsaywKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3NjEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3NjEuYwppbmRleCBiOTVkMjlkLi4zYmMzY2M1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxNzYxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTc2MS5jCkBAIC03MTksMTIgKzcxOSwxNCBAQAogCS5zZXRfYmlhc19sZXZlbAk9IGFkYXUxNzYxX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IGFkYXUxNzYxX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFkYXUxNzYxX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gYWRhdTF4NjFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhZGF1MXg2MV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFkYXUxeDYxX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFkYXUxeDYxX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFkYXUxNzYxX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWRhdTE3NjFfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGFkYXUxeDYxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFkYXUxeDYxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhZGF1MXg2MV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWRhdTF4NjFfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiAjZGVmaW5lIEFEQVUxNzYxX0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBcCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxNzgxLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxNzgxLmMKaW5kZXggYmMxYmI1Ni4uNTQ2MDcxYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTc4MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3ODEuYwpAQCAtNDMyLDEyICs0MzIsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSBhZGF1MTc4MV9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSBhZGF1MTc4MV9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhZGF1MTc4MV9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGFkYXUxNzgxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWRhdTE3ODFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhZGF1MTc4MV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhZGF1MTc4MV9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhZGF1MTc4MV9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFkYXUxNzgxX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhZGF1MTc4MV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhZGF1MTc4MV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWRhdTE3ODFfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFkYXUxNzgxX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogI2RlZmluZSBBREFVMTc4MV9GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgXApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTk3Ny5jIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTk3Ny5jCmluZGV4IDliZGQxNWYuLmIzMTlkYjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5NzcuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LmMKQEAgLTg3MywxMiArODczLDE0IEBACiAJLnNldF9zeXNjbGsgPSBhZGF1MTk3N19zZXRfc3lzY2xrLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IGFkYXUxOTc3X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhZGF1MTk3N19zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBhZGF1MTk3N19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFkYXUxOTc3X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWRhdTE5NzdfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWRhdTE5NzdfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWRhdTE5Nzdfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWRhdTE5Nzdfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhZGF1MTk3N19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhZGF1MTk3N19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWRhdTE5NzdfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFkYXUxOTc3X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBhZGF1MTk3N19zZXR1cF9taWNiaWFzKHN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXU3MDAyLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXU3MDAyLmMKaW5kZXggOWRmNzJjNi4uNjM4NGM1NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZGF1NzAwMi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTcwMDIuYwpAQCAtMzksMTAgKzM5LDEyIEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIGFkYXU3MDAyX2NvZGVjX2RyaXZlciA9IHsKLQkuZGFwbV93aWRnZXRzID0gYWRhdTcwMDJfd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWRhdTcwMDJfd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWRhdTcwMDJfcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFkYXU3MDAyX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gYWRhdTcwMDJfd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFkYXU3MDAyX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWRhdTcwMDJfcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhZGF1NzAwMl9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGFkYXU3MDAyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgweC5jCmluZGV4IGFjZmY4ZDYuLjZlNzkzZWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgweC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgweC5jCkBAIC04MzQsMTIgKzgzNCwxNCBAQAogCS5zZXRfcGxsID0gYWRhdjgweF9zZXRfcGxsLAogCS5zZXRfc3lzY2xrID0gYWRhdjgweF9zZXRfc3lzY2xrLAogCi0JLmNvbnRyb2xzID0gYWRhdjgweF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhZGF2ODB4X2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gYWRhdjgweF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFkYXY4MHhfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhZGF2ODB4X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFkYXY4MHhfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWRhdjgweF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFkYXY4MHhfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGFkYXY4MHhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWRhdjgweF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWRhdjgweF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWRhdjgweF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIGludCBhZGF2ODB4X2J1c19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRzMTE3eC5jIGIvc291bmQvc29jL2NvZGVjcy9hZHMxMTd4LmMKaW5kZXggYzViZTFiZC4uOTBjNzU2ZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZHMxMTd4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZHMxMTd4LmMKQEAgLTU5LDEwICs1OSwxMiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2FkczExN3ggPSB7Ci0JLmRhcG1fd2lkZ2V0cyA9IGFkczExN3hfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhZHMxMTd4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWRzMTE3eF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhZHMxMTd4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhZHMxMTd4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFkczExN3hfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFkczExN3hfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFkczExN3hfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGFkczExN3hfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0MTA0LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDEwNC5jCmluZGV4IDU5NWQwMmQuLjFhOWQyMzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0MTA0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQxMDQuYwpAQCAtMTYzLDcgKzE2MywxMCBAQAogCQkuc3RyZWFtX25hbWUgPSAiUGxheWJhY2siLAogCQkuY2hhbm5lbHNfbWluID0gMiwKIAkJLmNoYW5uZWxzX21heCA9IDIsCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8yMjA1MCB8IFNORFJWX1BDTV9SQVRFXzMyMDAwIHwKKwkJCSBTTkRSVl9QQ01fUkFURV80NDEwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKKwkJCSBTTkRSVl9QQ01fUkFURV84ODIwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKKwkJCSBTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8xOTIwMDAsCiAJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgIHwKIAkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8CiAJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRQpAQCAtMjQ1LDEwICsyNDgsMTIgQEAKIAkuc3VzcGVuZCA9IGFrNDEwNF9zb2Nfc3VzcGVuZCwKIAkucmVzdW1lID0gYWs0MTA0X3NvY19yZXN1bWUsCiAKLQkuZGFwbV93aWRnZXRzID0gYWs0MTA0X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWs0MTA0X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWs0MTA0X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFrNDEwNF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gYWs0MTA0X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFrNDEwNF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWs0MTA0X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhazQxMDRfZGFwbV9yb3V0ZXMpLAorCX0KIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhazQxMDRfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ1MzUuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTM1LmMKaW5kZXggNTQ0MjhjNi4uNjZjZmZmZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ1MzUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDUzNS5jCkBAIC0zOTUsMTIgKzM5NSwxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IGFrNDUzNV9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSBhazQ1MzVfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFrNDUzNV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBhazQ1MzVfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhazQ1MzVfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhazQ1MzVfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFrNDUzNV9hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWs0NTM1X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFrNDUzNV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGFrNDUzNV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhazQ1MzVfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFrNDUzNV9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFrNDUzNV9hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGFrNDUzNV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTU0LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDU1NC5jCmluZGV4IDI5OGRlZGMuLmI5MmM1NDggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTU0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ1NTQuYwpAQCAtNjUsMTAgKzY1LDEyIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfYWs0NTU0ID0gewotCS5kYXBtX3dpZGdldHMgPSBhazQ1NTRfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhazQ1NTRfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhazQ1NTRfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWs0NTU0X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhazQ1NTRfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWs0NTU0X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhazQ1NTRfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFrNDU1NF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgYWs0NTU0X3NvY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ2MTMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjEzLmMKaW5kZXggOTc3OThkMi4uZTgxOWRkOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2MTMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDYxMy5jCkBAIC00NTgsMTIgKzQ1OCwxNCBAQAogCS5zdXNwZW5kCQk9IGFrNDYxM19zdXNwZW5kLAogCS5yZXN1bWUJCQk9IGFrNDYxM19yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsCQk9IGFrNDYxM19zZXRfYmlhc19sZXZlbCwKLQkuY29udHJvbHMJCT0gYWs0NjEzX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWs0NjEzX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cwkJPSBhazQ2MTNfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhazQ2MTNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJCT0gYWs0NjEzX2ludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFrNDYxM19pbnRlcmNvbiksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhazQ2MTNfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWs0NjEzX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gYWs0NjEzX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFrNDYxM19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWs0NjEzX2ludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhazQ2MTNfaW50ZXJjb24pLAorCX0sCiB9OwogCiBzdGF0aWMgdm9pZCBhazQ2MTNfcGFyc2Vfb2Yoc3RydWN0IGFrNDYxM19wcml2ICpwcml2LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQxLmMKaW5kZXggYjE0MTc2Zi4uYzkxNzE3ZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0MS5jCkBAIC01MDUsMTIgKzUwNSwxNCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2FrNDY0MSA9IHsKLQkuY29udHJvbHMJCT0gYWs0NjQxX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWs0NjQxX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cwkJPSBhazQ2NDFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhazQ2NDFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJCT0gYWs0NjQxX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhazQ2NDFfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFrNDY0MV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhazQ2NDFfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhazQ2NDFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWs0NjQxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhazQ2NDFfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhazQ2NDFfYXVkaW9fbWFwKSwKKwl9LAogCS5zZXRfYmlhc19sZXZlbAkJPSBhazQ2NDFfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYJPSB0cnVlLAogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQyLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0Mi5jCmluZGV4IGNjOTQxZDYuLjI2MDlmOTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYwpAQCAtNTU1LDEyICs1NTUsMTQgQEAKIAkuc3VzcGVuZAkJPSBhazQ2NDJfc3VzcGVuZCwKIAkucmVzdW1lCQkJPSBhazQ2NDJfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbAkJPSBhazQ2NDJfc2V0X2JpYXNfbGV2ZWwsCi0JLmNvbnRyb2xzCQk9IGFrNDY0Ml9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFrNDY0Ml9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMJCT0gYWs0NjQyX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWs0NjQyX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCQk9IGFrNDY0Ml9pbnRlcmNvbiwKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhazQ2NDJfaW50ZXJjb24pLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWs0NjQyX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFrNDY0Ml9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGFrNDY0Ml9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhazQ2NDJfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFrNDY0Ml9pbnRlcmNvbiwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWs0NjQyX2ludGVyY29uKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFrNDY0Ml9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FrNDY3MS5jIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NzEuYwppbmRleCBjNzNhOWY2Li42MDg4YWZhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FrNDY3MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmMKQEAgLTYxMiwxMiArNjEyLDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9hazQ2NzEgPSB7CiAJLnNldF9iaWFzX2xldmVsID0gYWs0NjcxX3NldF9iaWFzX2xldmVsLAotCS5jb250cm9scyA9IGFrNDY3MV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYWs0NjcxX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGFrNDY3MV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFrNDY3MV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFrNDY3MV9pbnRlcmNvbiwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhazQ2NzFfaW50ZXJjb24pLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWs0NjcxX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFrNDY3MV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGFrNDY3MV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhazQ2NzFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFrNDY3MV9pbnRlcmNvbiwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWs0NjcxX2ludGVyY29uKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFrNDY3MV9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FrNTM4Ni5jIGIvc291bmQvc29jL2NvZGVjcy9hazUzODYuYwppbmRleCBhZmE5NTM2Li4wZWYyZGYyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FrNTM4Ni5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs1Mzg2LmMKQEAgLTc0LDEwICs3NCwxMiBAQAogCS5yZW1vdmUgPSBhazUzODZfc29jX3JlbW92ZSwKIAkuc3VzcGVuZCA9IGFrNTM4Nl9zb2Nfc3VzcGVuZCwKIAkucmVzdW1lID0gYWs1Mzg2X3NvY19yZXN1bWUsCi0JLmRhcG1fd2lkZ2V0cyA9IGFrNTM4Nl9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFrNTM4Nl9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFrNTM4Nl9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhazUzODZfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IGFrNTM4Nl9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhazUzODZfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFrNTM4Nl9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWs1Mzg2X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBhazUzODZfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MzIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYzMi5jCmluZGV4IDRkM2JhMzMuLmFkYjgwZDggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYzMi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYzMi5jCkBAIC0xMDcyLDEyICsxMDcyLDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gYWxjNTYzMl9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSBhbGM1NjMyX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhbGM1NjMyX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGFsYzU2MzJfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhbGM1NjMyX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWxjNTYzMl9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhbGM1NjMyX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFsYzU2MzJfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWxjNTYzMl9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGFsYzU2MzJfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWxjNTYzMl9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWxjNTYzMl9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWxjNTYzMl9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhbGM1NjMyX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYXJpem9uYS5jIGIvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmMKaW5kZXggZWNmZGJmYy4uODQ2Y2EwNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogCQlicmVhazsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gYXJpem9uYV9vdXRfZXYodywga2NvbnRyb2wsIGV2ZW50KTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGFyaXpvbmFfdGhlcm1hbF93YXJuKGludCBpcnEsIHZvaWQgKmRhdGEpCkBAIC0xNTksMTIgKzE1OSwxNCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGFyaXpvbmFfc3BrbCA9CiAJU05EX1NPQ19EQVBNX1BHQV9FKCJPVVQ0TCIsIFNORF9TT0NfTk9QTSwKIAkJCSAgIEFSSVpPTkFfT1VUNExfRU5BX1NISUZULCAwLCBOVUxMLCAwLCBhcml6b25hX3Nwa19ldiwKLQkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKTsKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGFyaXpvbmFfc3BrciA9CiAJU05EX1NPQ19EQVBNX1BHQV9FKCJPVVQ0UiIsIFNORF9TT0NfTk9QTSwKIAkJCSAgIEFSSVpPTkFfT1VUNFJfRU5BX1NISUZULCAwLCBOVUxMLCAwLCBhcml6b25hX3Nwa19ldiwKLQkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKTsKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKTsKIAogaW50IGFyaXpvbmFfaW5pdF9zcGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewpAQCAtODY0LDYgKzg2Niw3IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwogCXN0cnVjdCBhcml6b25hX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSA9IHByaXYtPmFyaXpvbmE7CiAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKQEAgLTg3Nyw2ICs4ODAsMTggQEAKIAkJCXByaXYtPm91dF91cF9wZW5kaW5nKys7CiAJCQlwcml2LT5vdXRfdXBfZGVsYXkgKz0gMTc7CiAJCQlicmVhazsKKwkJY2FzZSBBUklaT05BX09VVDRMX0VOQV9TSElGVDoKKwkJY2FzZSBBUklaT05BX09VVDRSX0VOQV9TSElGVDoKKwkJCXByaXYtPm91dF91cF9wZW5kaW5nKys7CisJCQlzd2l0Y2ggKGFyaXpvbmEtPnR5cGUpIHsKKwkJCWNhc2UgV001MTAyOgorCQkJY2FzZSBXTTg5OTc6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaXYtPm91dF91cF9kZWxheSArPSAxMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KQEAgLTg4OSw4ICs5MDQsMTIgQEAKIAkJY2FzZSBBUklaT05BX09VVDJSX0VOQV9TSElGVDoKIAkJY2FzZSBBUklaT05BX09VVDNMX0VOQV9TSElGVDoKIAkJY2FzZSBBUklaT05BX09VVDNSX0VOQV9TSElGVDoKKwkJY2FzZSBBUklaT05BX09VVDRMX0VOQV9TSElGVDoKKwkJY2FzZSBBUklaT05BX09VVDRSX0VOQV9TSElGVDoKIAkJCXByaXYtPm91dF91cF9wZW5kaW5nLS07Ci0JCQlpZiAoIXByaXYtPm91dF91cF9wZW5kaW5nKSB7CisJCQlpZiAoIXByaXYtPm91dF91cF9wZW5kaW5nICYmIHByaXYtPm91dF91cF9kZWxheSkgeworCQkJCWRldl9kYmcoY29kZWMtPmRldiwgIlBvd2VyIHVwIGRlbGF5OiAlZFxuIiwKKwkJCQkJcHJpdi0+b3V0X3VwX2RlbGF5KTsKIAkJCQltc2xlZXAocHJpdi0+b3V0X3VwX2RlbGF5KTsKIAkJCQlwcml2LT5vdXRfdXBfZGVsYXkgPSAwOwogCQkJfQpAQCAtOTExLDYgKzkzMCwyMSBAQAogCQkJcHJpdi0+b3V0X2Rvd25fcGVuZGluZysrOwogCQkJcHJpdi0+b3V0X2Rvd25fZGVsYXkrKzsKIAkJCWJyZWFrOworCQljYXNlIEFSSVpPTkFfT1VUNExfRU5BX1NISUZUOgorCQljYXNlIEFSSVpPTkFfT1VUNFJfRU5BX1NISUZUOgorCQkJcHJpdi0+b3V0X2Rvd25fcGVuZGluZysrOworCQkJc3dpdGNoIChhcml6b25hLT50eXBlKSB7CisJCQljYXNlIFdNNTEwMjoKKwkJCWNhc2UgV004OTk3OgorCQkJCWJyZWFrOworCQkJY2FzZSBXTTg5OTg6CisJCQljYXNlIFdNMTgxNDoKKwkJCQlwcml2LT5vdXRfZG93bl9kZWxheSArPSA1OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcml2LT5vdXRfZG93bl9kZWxheSsrOworCQkJCWJyZWFrOworCQkJfQogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KQEAgLTkyMyw4ICs5NTcsMTIgQEAKIAkJY2FzZSBBUklaT05BX09VVDJSX0VOQV9TSElGVDoKIAkJY2FzZSBBUklaT05BX09VVDNMX0VOQV9TSElGVDoKIAkJY2FzZSBBUklaT05BX09VVDNSX0VOQV9TSElGVDoKKwkJY2FzZSBBUklaT05BX09VVDRMX0VOQV9TSElGVDoKKwkJY2FzZSBBUklaT05BX09VVDRSX0VOQV9TSElGVDoKIAkJCXByaXYtPm91dF9kb3duX3BlbmRpbmctLTsKLQkJCWlmICghcHJpdi0+b3V0X2Rvd25fcGVuZGluZykgeworCQkJaWYgKCFwcml2LT5vdXRfZG93bl9wZW5kaW5nICYmIHByaXYtPm91dF9kb3duX2RlbGF5KSB7CisJCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiUG93ZXIgZG93biBkZWxheTogJWRcbiIsCisJCQkJCXByaXYtPm91dF9kb3duX2RlbGF5KTsKIAkJCQltc2xlZXAocHJpdi0+b3V0X2Rvd25fZGVsYXkpOwogCQkJCXByaXYtPm91dF9kb3duX2RlbGF5ID0gMDsKIAkJCX0KQEAgLTE5MjAsOCArMTk1OCw4IEBACiAKIHN0cnVjdCBhcml6b25hX2ZsbF9jZmcgewogCWludCBuOwotCWludCB0aGV0YTsKLQlpbnQgbGFtYmRhOworCXVuc2lnbmVkIGludCB0aGV0YTsKKwl1bnNpZ25lZCBpbnQgbGFtYmRhOwogCWludCByZWZkaXY7CiAJaW50IG91dGRpdjsKIAlpbnQgZnJhdGlvOwpAQCAtMjE4OCwxMyArMjIyNiwxMyBAQAogCQkJCSBBUklaT05BX0ZMTDFfQ1RSTF9VUEQgfCBjZmctPm4pOwogfQogCi1zdGF0aWMgaW50IGFyaXpvbmFfaXNfZW5hYmxlZF9mbGwoc3RydWN0IGFyaXpvbmFfZmxsICpmbGwpCitzdGF0aWMgaW50IGFyaXpvbmFfaXNfZW5hYmxlZF9mbGwoc3RydWN0IGFyaXpvbmFfZmxsICpmbGwsIGludCBiYXNlKQogewogCXN0cnVjdCBhcml6b25hICphcml6b25hID0gZmxsLT5hcml6b25hOwogCXVuc2lnbmVkIGludCByZWc7CiAJaW50IHJldDsKIAotCXJldCA9IHJlZ21hcF9yZWFkKGFyaXpvbmEtPnJlZ21hcCwgZmxsLT5iYXNlICsgMSwgJnJlZyk7CisJcmV0ID0gcmVnbWFwX3JlYWQoYXJpem9uYS0+cmVnbWFwLCBiYXNlICsgMSwgJnJlZyk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWFyaXpvbmFfZmxsX2VycihmbGwsICJGYWlsZWQgdG8gcmVhZCBjdXJyZW50IHN0YXRlOiAlZFxuIiwKIAkJCQlyZXQpOwpAQCAtMjIwOCwyMSArMjI0NiwyNCBAQAogewogCXN0cnVjdCBhcml6b25hICphcml6b25hID0gZmxsLT5hcml6b25hOwogCWJvb2wgdXNlX3N5bmMgPSBmYWxzZTsKLQlpbnQgYWxyZWFkeV9lbmFibGVkID0gYXJpem9uYV9pc19lbmFibGVkX2ZsbChmbGwpOworCWludCBhbHJlYWR5X2VuYWJsZWQgPSBhcml6b25hX2lzX2VuYWJsZWRfZmxsKGZsbCwgZmxsLT5iYXNlKTsKKwlpbnQgc3luY19lbmFibGVkID0gYXJpem9uYV9pc19lbmFibGVkX2ZsbChmbGwsIGZsbC0+YmFzZSArIDB4MTApOwogCXN0cnVjdCBhcml6b25hX2ZsbF9jZmcgY2ZnOwogCWludCBpOwogCXVuc2lnbmVkIGludCB2YWw7CiAKIAlpZiAoYWxyZWFkeV9lbmFibGVkIDwgMCkKIAkJcmV0dXJuIGFscmVhZHlfZW5hYmxlZDsKKwlpZiAoc3luY19lbmFibGVkIDwgMCkKKwkJcmV0dXJuIHN5bmNfZW5hYmxlZDsKIAogCWlmIChhbHJlYWR5X2VuYWJsZWQpIHsKIAkJLyogRmFjaWxpdGF0ZSBzbW9vdGggcmVmY2xrIGFjcm9zcyB0aGUgdHJhbnNpdGlvbiAqLwotCQlyZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoZmxsLT5hcml6b25hLT5yZWdtYXAsIGZsbC0+YmFzZSArIDB4OSwKLQkJCQkJIEFSSVpPTkFfRkxMMV9HQUlOX01BU0ssIDApOwogCQlyZWdtYXBfdXBkYXRlX2JpdHMoZmxsLT5hcml6b25hLT5yZWdtYXAsIGZsbC0+YmFzZSArIDEsCiAJCQkJICAgQVJJWk9OQV9GTEwxX0ZSRUVSVU4sIEFSSVpPTkFfRkxMMV9GUkVFUlVOKTsKIAkJdWRlbGF5KDMyKTsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzX2FzeW5jKGZsbC0+YXJpem9uYS0+cmVnbWFwLCBmbGwtPmJhc2UgKyAweDksCisJCQkJCSBBUklaT05BX0ZMTDFfR0FJTl9NQVNLLCAwKTsKIAl9CiAKIAkvKgpAQCAtMjIzMyw2ICsyMjc0LDEwIEBACiAJICAgIGZsbC0+cmVmX3NyYyAhPSBmbGwtPnN5bmNfc3JjKSB7CiAJCWFyaXpvbmFfY2FsY19mbGwoZmxsLCAmY2ZnLCBmbGwtPnJlZl9mcmVxLCBmYWxzZSk7CiAKKwkJLyogUmVmIHBhdGggaGFyZGNvZGVzIGxhbWJkYSB0byA2NTUzNiB3aGVuIHN5bmMgaXMgb24gKi8KKwkJaWYgKGZsbC0+c3luY19zcmMgPj0gMCAmJiBjZmcubGFtYmRhKQorCQkJY2ZnLnRoZXRhID0gKGNmZy50aGV0YSAqICgxIDw8IDE2KSkgLyBjZmcubGFtYmRhOworCiAJCWFyaXpvbmFfYXBwbHlfZmxsKGFyaXpvbmEsIGZsbC0+YmFzZSwgJmNmZywgZmxsLT5yZWZfc3JjLAogCQkJCSAgZmFsc2UpOwogCQlpZiAoZmxsLT5zeW5jX3NyYyA+PSAwKSB7CkBAIC0yMjU1LDYgKzIzMDAsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoYWxyZWFkeV9lbmFibGVkICYmICEhc3luY19lbmFibGVkICE9IHVzZV9zeW5jKQorCQlhcml6b25hX2ZsbF93YXJuKGZsbCwgIlN5bmNocm9uaXNlciBjaGFuZ2VkIG9uIGFjdGl2ZSBGTExcbiIpOworCiAJLyoKIAkgKiBJbmNyZWFzZSB0aGUgYmFuZHdpZHRoIGlmIHdlJ3JlIG5vdCB1c2luZyBhIGxvdyBmcmVxdWVuY3kKIAkgKiBzeW5jIHNvdXJjZS4KQEAgLTIyNjgsMTQgKzIzMTYsMTQgQEAKIAkJCQkJIEFSSVpPTkFfRkxMMV9TWU5DX0JXKTsKIAogCWlmICghYWxyZWFkeV9lbmFibGVkKQotCQlwbV9ydW50aW1lX2dldChhcml6b25hLT5kZXYpOworCQlwbV9ydW50aW1lX2dldF9zeW5jKGFyaXpvbmEtPmRldik7CiAKLQlyZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoYXJpem9uYS0+cmVnbWFwLCBmbGwtPmJhc2UgKyAxLAotCQkJCSBBUklaT05BX0ZMTDFfRU5BLCBBUklaT05BX0ZMTDFfRU5BKTsKIAlpZiAodXNlX3N5bmMpCiAJCXJlZ21hcF91cGRhdGVfYml0c19hc3luYyhhcml6b25hLT5yZWdtYXAsIGZsbC0+YmFzZSArIDB4MTEsCiAJCQkJCSBBUklaT05BX0ZMTDFfU1lOQ19FTkEsCiAJCQkJCSBBUklaT05BX0ZMTDFfU1lOQ19FTkEpOworCXJlZ21hcF91cGRhdGVfYml0c19hc3luYyhhcml6b25hLT5yZWdtYXAsIGZsbC0+YmFzZSArIDEsCisJCQkJIEFSSVpPTkFfRkxMMV9FTkEsIEFSSVpPTkFfRkxMMV9FTkEpOwogCiAJaWYgKGFscmVhZHlfZW5hYmxlZCkKIAkJcmVnbWFwX3VwZGF0ZV9iaXRzX2FzeW5jKGFyaXpvbmEtPnJlZ21hcCwgZmxsLT5iYXNlICsgMSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYXJpem9uYS5oIGIvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmgKaW5kZXggNjlkYTFlZi4uODUwYWEzMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmgKQEAgLTE5MCwyMCArMTkwLDIxIEBACiAKICNkZWZpbmUgQVJJWk9OQV9EU1BfUk9VVEVTKG5hbWUpIFwKIAl7IG5hbWUsIE5VTEwsIG5hbWUgIiBQcmVsb2FkZXIifSwgXAotCXsgbmFtZSAiIFByZWxvYWRlciIsIE5VTEwsIG5hbWUgIiBBdXggMSIgfSwgXAotCXsgbmFtZSAiIFByZWxvYWRlciIsIE5VTEwsIG5hbWUgIiBBdXggMiIgfSwgXAotCXsgbmFtZSAiIFByZWxvYWRlciIsIE5VTEwsIG5hbWUgIiBBdXggMyIgfSwgXAotCXsgbmFtZSAiIFByZWxvYWRlciIsIE5VTEwsIG5hbWUgIiBBdXggNCIgfSwgXAotCXsgbmFtZSAiIFByZWxvYWRlciIsIE5VTEwsIG5hbWUgIiBBdXggNSIgfSwgXAotCXsgbmFtZSAiIFByZWxvYWRlciIsIE5VTEwsIG5hbWUgIiBBdXggNiIgfSwgXAorCXsgbmFtZSAiIFByZWxvYWRlciIsIE5VTEwsICJTWVNDTEsiIH0sIFwKKwl7IG5hbWUsIE5VTEwsIG5hbWUgIiBBdXggMSIgfSwgXAorCXsgbmFtZSwgTlVMTCwgbmFtZSAiIEF1eCAyIiB9LCBcCisJeyBuYW1lLCBOVUxMLCBuYW1lICIgQXV4IDMiIH0sIFwKKwl7IG5hbWUsIE5VTEwsIG5hbWUgIiBBdXggNCIgfSwgXAorCXsgbmFtZSwgTlVMTCwgbmFtZSAiIEF1eCA1IiB9LCBcCisJeyBuYW1lLCBOVUxMLCBuYW1lICIgQXV4IDYiIH0sIFwKIAlBUklaT05BX01JWEVSX0lOUFVUX1JPVVRFUyhuYW1lICIgQXV4IDEiKSwgXAogCUFSSVpPTkFfTUlYRVJfSU5QVVRfUk9VVEVTKG5hbWUgIiBBdXggMiIpLCBcCiAJQVJJWk9OQV9NSVhFUl9JTlBVVF9ST1VURVMobmFtZSAiIEF1eCAzIiksIFwKIAlBUklaT05BX01JWEVSX0lOUFVUX1JPVVRFUyhuYW1lICIgQXV4IDQiKSwgXAogCUFSSVpPTkFfTUlYRVJfSU5QVVRfUk9VVEVTKG5hbWUgIiBBdXggNSIpLCBcCiAJQVJJWk9OQV9NSVhFUl9JTlBVVF9ST1VURVMobmFtZSAiIEF1eCA2IiksIFwKLQlBUklaT05BX01JWEVSX1JPVVRFUyhuYW1lICIgUHJlbG9hZGVyIiwgbmFtZSAiTCIpLCBcCi0JQVJJWk9OQV9NSVhFUl9ST1VURVMobmFtZSAiIFByZWxvYWRlciIsIG5hbWUgIlIiKQorCUFSSVpPTkFfTUlYRVJfUk9VVEVTKG5hbWUsIG5hbWUgIkwiKSwgXAorCUFSSVpPTkFfTUlYRVJfUk9VVEVTKG5hbWUsIG5hbWUgIlIiKQogCiAjZGVmaW5lIEFSSVpPTkFfRVFfQ09OVFJPTCh4bmFtZSwgeGJhc2UpICAgICAgICAgICAgICAgICAgICAgIFwKIHsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsICAgXApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9idC1zY28uYyBiL3NvdW5kL3NvYy9jb2RlY3MvYnQtc2NvLmMKaW5kZXggMmE4ZDBlZS4uODAxNGU2OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9idC1zY28uYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2J0LXNjby5jCkBAIC02MywxMCArNjMsMTIgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9idF9zY28gPSB7Ci0JLmRhcG1fd2lkZ2V0cyA9IGJ0X3Njb193aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShidF9zY29fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYnRfc2NvX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShidF9zY29fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSBidF9zY29fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGJ0X3Njb193aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGJ0X3Njb19yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGJ0X3Njb19yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGJ0X3Njb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jcTkzdmMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3E5M3ZjLmMKaW5kZXggMWM4OTVhNS4uN2EyZDlhMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jcTkzdmMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NxOTN2Yy5jCkBAIC0xMzEsOCArMTMxLDEwIEBACiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfY3E5M3ZjID0gewogCS5zZXRfYmlhc19sZXZlbCA9IGNxOTN2Y19zZXRfYmlhc19sZXZlbCwKIAkuZ2V0X3JlZ21hcCA9IGNxOTN2Y19nZXRfcmVnbWFwLAotCS5jb250cm9scyA9IGNxOTN2Y19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY3E5M3ZjX3NuZF9jb250cm9scyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scyA9IGNxOTN2Y19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGNxOTN2Y19zbmRfY29udHJvbHMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGNxOTN2Y19wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczM1bDMyLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzMzVsMzIuYwppbmRleCAyODdkMTM3Li43ZTk4MDYyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzMzVsMzIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzMzVsMzIuYwpAQCAtMjMxLDEzICsyMzEsMTQgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9jczM1bDMyID0gewogCS5zZXRfc3lzY2xrID0gY3MzNWwzMl9jb2RlY19zZXRfc3lzY2xrLAogCi0JLmRhcG1fd2lkZ2V0cyA9IGNzMzVsMzJfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShjczM1bDMyX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gY3MzNWwzMl9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoY3MzNWwzMl9hdWRpb19tYXApLAotCi0JLmNvbnRyb2xzID0gY3MzNWwzMl9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY3MzNWwzMl9zbmRfY29udHJvbHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gY3MzNWwzMl9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShjczM1bDMyX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gY3MzNWwzMl9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShjczM1bDMyX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBjczM1bDMyX2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoY3MzNWwzMl9hdWRpb19tYXApLAorCX0sCiB9OwogCiAvKiBDdXJyZW50IGFuZCB0aHJlc2hvbGQgcG93ZXJ1cCBzZXF1ZW5jZSBQZzM3IGluIGRhdGFzaGVldCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczM1bDMzLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzMzVsMzMuYwppbmRleCA2ZjljMWFkLi42ZGYyOWZhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzMzVsMzMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzMzVsMzMuYwpAQCAtODM3LDEzICs4MzcsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSBjczM1bDMzX3NldF9iaWFzX2xldmVsLAogCS5zZXRfc3lzY2xrID0gY3MzNWwzM19jb2RlY19zZXRfc3lzY2xrLAogCi0JLmRhcG1fd2lkZ2V0cyA9IGNzMzVsMzNfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShjczM1bDMzX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gY3MzNWwzM19hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoY3MzNWwzM19hdWRpb19tYXApLAotCS5jb250cm9scyA9IGNzMzVsMzNfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGNzMzVsMzNfc25kX2NvbnRyb2xzKSwKLQorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gY3MzNWwzM19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShjczM1bDMzX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gY3MzNWwzM19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShjczM1bDMzX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBjczM1bDMzX2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoY3MzNWwzM19hdWRpb19tYXApLAorCX0sCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQyNjUuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjY1LmMKaW5kZXggNTVkYjE5ZC4uZmQ5NjZiYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQyNjUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDI2NS5jCkBAIC01NDcsMTMgKzU0NywxNCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfY3M0MjY1ID0gewogCS5zZXRfYmlhc19sZXZlbCA9IGNzNDI2NV9zZXRfYmlhc19sZXZlbCwKIAotCS5kYXBtX3dpZGdldHMgPSBjczQyNjVfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShjczQyNjVfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBjczQyNjVfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGNzNDI2NV9hdWRpb19tYXApLAotCi0JLmNvbnRyb2xzID0gY3M0MjY1X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShjczQyNjVfc25kX2NvbnRyb2xzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGNzNDI2NV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShjczQyNjVfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBjczQyNjVfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoY3M0MjY1X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBjczQyNjVfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShjczQyNjVfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGNzNDI2NV9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MC5jIGIvc291bmQvc29jL2NvZGVjcy9jczQyNzAuYwppbmRleCBlMDc4MDdkLi4xOGJhZWEyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMKQEAgLTYxNywxMiArNjE3LDE0IEBACiAJLnN1c3BlbmQgPQkJY3M0MjcwX3NvY19zdXNwZW5kLAogCS5yZXN1bWUgPQkJY3M0MjcwX3NvY19yZXN1bWUsCiAKLQkuY29udHJvbHMgPQkJY3M0MjcwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0JCUFSUkFZX1NJWkUoY3M0MjcwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9CQljczQyNzBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0JQVJSQVlfU0laRShjczQyNzBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPQkJY3M0MjcwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPQlBUlJBWV9TSVpFKGNzNDI3MF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scyA9CQljczQyNzBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzID0JCUFSUkFZX1NJWkUoY3M0MjcwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMgPQkJY3M0MjcwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMgPQlBUlJBWV9TSVpFKGNzNDI3MF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMgPQkJY3M0MjcwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzID0JQVJSQVlfU0laRShjczQyNzBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQyNzEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcxLmMKaW5kZXggMGMwMDEwYi4uOGMwZjNiOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQyNzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MS5jCkBAIC02NDUsMTIgKzY0NSwxNCBAQAogCS5zdXNwZW5kCQk9IGNzNDI3MV9zb2Nfc3VzcGVuZCwKIAkucmVzdW1lCQkJPSBjczQyNzFfc29jX3Jlc3VtZSwKIAotCS5jb250cm9scwkJPSBjczQyNzFfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShjczQyNzFfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzCQk9IGNzNDI3MV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGNzNDI3MV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBjczQyNzFfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoY3M0MjcxX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGNzNDI3MV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShjczQyNzFfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBjczQyNzFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoY3M0MjcxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBjczQyNzFfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNzNDI3MV9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgY3M0MjcxX2NvbW1vbl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1MS5jCmluZGV4IDM1NDg4ZjEuLjk2Y2ZlMzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1MS5jCkBAIC01MDcsMTIgKzUwNywxNCBAQAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2aWNlX2NzNDJsNTEgPSB7CiAJLnByb2JlID0gY3M0Mmw1MV9jb2RlY19wcm9iZSwKIAotCS5jb250cm9scyA9IGNzNDJsNTFfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGNzNDJsNTFfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gY3M0Mmw1MV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGNzNDJsNTFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBjczQybDUxX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShjczQybDUxX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBjczQybDUxX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGNzNDJsNTFfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBjczQybDUxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGNzNDJsNTFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGNzNDJsNTFfcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShjczQybDUxX3JvdXRlcyksCisJfSwKIH07CiAKIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGNzNDJsNTFfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQybDUyLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTIuYwppbmRleCA0N2I5N2ZjLi4wZDljNGE1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTIuYwpAQCAtMTA1NiwxMyArMTA1NiwxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IGNzNDJsNTJfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmRhcG1fd2lkZ2V0cyA9IGNzNDJsNTJfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShjczQybDUyX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gY3M0Mmw1Ml9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoY3M0Mmw1Ml9hdWRpb19tYXApLAotCi0JLmNvbnRyb2xzID0gY3M0Mmw1Ml9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY3M0Mmw1Ml9zbmRfY29udHJvbHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gY3M0Mmw1Ml9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShjczQybDUyX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gY3M0Mmw1Ml9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShjczQybDUyX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBjczQybDUyX2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoY3M0Mmw1Ml9hdWRpb19tYXApLAorCX0sCiB9OwogCiAvKiBDdXJyZW50IGFuZCB0aHJlc2hvbGQgcG93ZXJ1cCBzZXF1ZW5jZSBQZzM3ICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTYuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1Ni5jCmluZGV4IGVlYzFmZjguLjU0YzE3NjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1Ni5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1Ni5jCkBAIC0xMTIxLDEzICsxMTIxLDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gY3M0Mmw1Nl9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuZGFwbV93aWRnZXRzID0gY3M0Mmw1Nl9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGNzNDJsNTZfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBjczQybDU2X2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShjczQybDU2X2F1ZGlvX21hcCksCi0KLQkuY29udHJvbHMgPSBjczQybDU2X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShjczQybDU2X3NuZF9jb250cm9scyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBjczQybDU2X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGNzNDJsNTZfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBjczQybDU2X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGNzNDJsNTZfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGNzNDJsNTZfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShjczQybDU2X2F1ZGlvX21hcCksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBjczQybDU2X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw3My5jIGIvc291bmQvc29jL2NvZGVjcy9jczQybDczLmMKaW5kZXggNDJhOGZkNC4uNzFiYTU2MCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQybDczLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQybDczLmMKQEAgLTc5NCw3ICs3OTQsNyBAQAogCXU4IG1tY2M7CiB9OwogCi1zdGF0aWMgc3RydWN0IGNzNDJsNzNfbWNsa19kaXYgY3M0Mmw3M19tY2xrX2NvZWZmc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBjczQybDczX21jbGtfZGl2IGNzNDJsNzNfbWNsa19jb2VmZnNbXSA9IHsKIAkvKiBNQ0xLLCBTYW1wbGUgUmF0ZSwgeE1NQ0NbNTowXSAqLwogCXs1NjQ0ODAwLCAxMTAyNSwgMHgzMH0sCiAJezU2NDQ4MDAsIDIyMDUwLCAweDIwfSwKQEAgLTg0NCw3ICs4NDQsNyBAQAogCXU4IG1jbGtkaXY7CiB9OwogCi1zdGF0aWMgc3RydWN0IGNzNDJsNzNfbWNsa3hfZGl2IGNzNDJsNzNfbWNsa3hfY29lZmZzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGNzNDJsNzNfbWNsa3hfZGl2IGNzNDJsNzNfbWNsa3hfY29lZmZzW10gPSB7CiAJezU2NDQ4MDAsICAxLCAwfSwJLyogNTY0NDgwMCAqLwogCXs2MDAwMDAwLCAgMSwgMH0sCS8qIDYwMDAwMDAgKi8KIAl7NjE0NDAwMCwgIDEsIDB9LAkvKiA2MTQ0MDAwICovCkBAIC0xMjU3LDEzICsxMjU3LDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gY3M0Mmw3M19zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuZGFwbV93aWRnZXRzID0gY3M0Mmw3M19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGNzNDJsNzNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBjczQybDczX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShjczQybDczX2F1ZGlvX21hcCksCi0KLQkuY29udHJvbHMgPSBjczQybDczX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShjczQybDczX3NuZF9jb250cm9scyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBjczQybDczX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGNzNDJsNzNfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBjczQybDczX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGNzNDJsNzNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGNzNDJsNzNfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShjczQybDczX2F1ZGlvX21hcCksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBjczQybDczX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mnh4OC5jIGIvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LmMKaW5kZXggMTE3OTEwMWIuLmI0ZDg3MzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mnh4OC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mnh4OC5jCkBAIC00MTEsMTIgKzQxMSwxNCBAQAogCS5wcm9iZSA9IGNzNDJ4eDhfY29kZWNfcHJvYmUsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gY3M0Mnh4OF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY3M0Mnh4OF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBjczQyeHg4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoY3M0Mnh4OF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGNzNDJ4eDhfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoY3M0Mnh4OF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBjczQyeHg4X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGNzNDJ4eDhfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBjczQyeHg4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGNzNDJ4eDhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGNzNDJ4eDhfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNzNDJ4eDhfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBjb25zdCBzdHJ1Y3QgY3M0Mnh4OF9kcml2ZXJfZGF0YSBjczQyNDQ4X2RhdGEgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDM0OS5jIGIvc291bmQvc29jL2NvZGVjcy9jczQzNDkuYwppbmRleCAwYWM4ZmM1Li4yMzFjYTkzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDM0OS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0MzQ5LmMKQEAgLTI1NiwxMyArMjU2LDE0IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfY3M0MzQ5ID0gewotCS5jb250cm9scwkJPSBjczQzNDlfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShjczQzNDlfc25kX2NvbnRyb2xzKSwKLQotCS5kYXBtX3dpZGdldHMJCT0gY3M0MzQ5X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoY3M0MzQ5X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCQk9IGNzNDM0OV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoY3M0MzQ5X3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBjczQzNDlfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoY3M0MzQ5X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gY3M0MzQ5X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGNzNDM0OV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gY3M0MzQ5X3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoY3M0MzQ5X3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBjczQzNDlfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQ3bDI0LmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDdsMjQuYwppbmRleCA5NTRhNGY1Li41YjIyNTY0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDdsMjQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDdsMjQuYwpAQCAtNzQ2LDYgKzc0NiwxNiBAQAogCXsgIklOMkwiLCBOVUxMLCAiU1lTQ0xLIiB9LAogCXsgIklOMlIiLCBOVUxMLCAiU1lTQ0xLIiB9LAogCisJeyAiQVNSQzFMIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBU1JDMVIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFTUkMyTCIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQVNSQzJSIiwgTlVMTCwgIlNZU0NMSyIgfSwKKworCXsgIkFTUkMxTCIsIE5VTEwsICJBU1lOQ0NMSyIgfSwKKwl7ICJBU1JDMVIiLCBOVUxMLCAiQVNZTkNDTEsiIH0sCisJeyAiQVNSQzJMIiwgTlVMTCwgIkFTWU5DQ0xLIiB9LAorCXsgIkFTUkMyUiIsIE5VTEwsICJBU1lOQ0NMSyIgfSwKKwogCXsgIk1JQ0JJQVMxIiwgTlVMTCwgIk1JQ1ZERCIgfSwKIAl7ICJNSUNCSUFTMiIsIE5VTEwsICJNSUNWREQiIH0sCiAKQEAgLTgwNCw3ICs4MTQsNiBAQAogCXsgIkFJRjMgQ2FwdHVyZSIsIE5VTEwsICJTWVNDTEsiIH0sCiAKIAl7ICJWb2ljZSBDb250cm9sIERTUCIsIE5VTEwsICJEU1AzIiB9LAotCXsgIlZvaWNlIENvbnRyb2wgRFNQIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAogCXsgIklOMUwgUEdBIiwgTlVMTCwgIklOMUwiIH0sCiAJeyAiSU4xUiBQR0EiLCBOVUxMLCAiSU4xUiIgfSwKQEAgLTgxMyw3ICs4MjIsNiBAQAogCXsgIklOMlIgUEdBIiwgTlVMTCwgIklOMlIiIH0sCiAKIAl7ICJBdWRpbyBUcmFjZSBEU1AiLCBOVUxMLCAiRFNQMiIgfSwKLQl7ICJBdWRpbyBUcmFjZSBEU1AiLCBOVUxMLCAiU1lTQ0xLIiB9LAogCiAJQVJJWk9OQV9NSVhFUl9ST1VURVMoIk9VVDFMIiwgIkhQT1VUMUwiKSwKIAlBUklaT05BX01JWEVSX1JPVVRFUygiT1VUMVIiLCAiSFBPVVQxUiIpLApAQCAtMTE5MCwxMiArMTE5OCwxNCBAQAogCS5zZXRfc3lzY2xrID0gYXJpem9uYV9zZXRfc3lzY2xrLAogCS5zZXRfcGxsID0gY3M0N2wyNF9zZXRfZmxsLAogCi0JLmNvbnRyb2xzID0gY3M0N2wyNF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY3M0N2wyNF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBjczQ3bDI0X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoY3M0N2wyNF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGNzNDdsMjRfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoY3M0N2wyNF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBjczQ3bDI0X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGNzNDdsMjRfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBjczQ3bDI0X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGNzNDdsMjRfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGNzNDdsMjRfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNzNDdsMjRfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9jb21wcl9vcHMgY3M0N2wyNF9jb21wcl9vcHMgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNTNsMzAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M1M2wzMC5jCmluZGV4IDJjMGQ5YzQuLmNiNDdmYjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M1M2wzMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M1M2wzMC5jCkBAIC00NjYsNyArNDY2LDcgQEAKIAl1OCBtY2xrX2ludF9zY2FsZTsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY3M1M2wzMF9tY2xrX2RpdiBjczUzbDMwX21jbGtfY29lZmZzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGNzNTNsMzBfbWNsa19kaXYgY3M1M2wzMF9tY2xrX2NvZWZmc1tdID0gewogCS8qIE5PVEU6IEVuYWJsZSBNQ0xLX0lOVF9TQ0FMRSB0byBzYXZlIHBvd2VyLiAqLwogCiAJLyogTUNMSywgU2FtcGxlIFJhdGUsIGFzcF9yYXRlLCBpbnRlcm5hbF9mc19yYXRpbywgbWNsa19pbnRfc2NhbGUgKi8KQEAgLTUxMSw3ICs1MTEsNyBAQAogCXU4IG1jbGtkaXY7CiB9OwogCi1zdGF0aWMgc3RydWN0IGNzNTNsMzBfbWNsa3hfZGl2IGNzNTNsMzBfbWNsa3hfY29lZmZzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGNzNTNsMzBfbWNsa3hfZGl2IGNzNTNsMzBfbWNsa3hfY29lZmZzW10gPSB7CiAJezU2NDQ4MDAsICAxLCBDUzUzTDMwX01DTEtfRElWX0JZXzF9LAogCXs2MDAwMDAwLCAgMSwgQ1M1M0wzMF9NQ0xLX0RJVl9CWV8xfSwKIAl7NjE0NDAwMCwgIDEsIENTNTNMMzBfTUNMS19ESVZfQllfMX0sCkBAIC04OTcsMTMgKzg5NywxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IGNzNTNsMzBfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogCi0JLmRhcG1fd2lkZ2V0cyA9IGNzNTNsMzBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShjczUzbDMwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gY3M1M2wzMF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShjczUzbDMwX2RhcG1fcm91dGVzKSwKLQotCS5jb250cm9scyA9IGNzNTNsMzBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGNzNTNsMzBfc25kX2NvbnRyb2xzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGNzNTNsMzBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoY3M1M2wzMF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGNzNTNsMzBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoY3M1M2wzMF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gY3M1M2wzMF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoY3M1M2wzMF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBjczUzbDMwX3JlZ21hcCA9IHsKQEAgLTk5OSw4ICsxMDAwLDggQEAKIAkvKiBDaGVjayBpZiBNQ0xLIHByb3ZpZGVkICovCiAJY3M1M2wzMC0+bWNsayA9IGRldm1fY2xrX2dldChkZXYsICJtY2xrIik7CiAJaWYgKElTX0VSUihjczUzbDMwLT5tY2xrKSkgewotCQlpZiAoUFRSX0VSUihjczUzbDMwLT5tY2xrKSA9PSAtRVBST0JFX0RFRkVSKSB7Ci0JCQlyZXQgPSAtRVBST0JFX0RFRkVSOworCQlpZiAoUFRSX0VSUihjczUzbDMwLT5tY2xrKSAhPSAtRU5PRU5UKSB7CisJCQlyZXQgPSBQVFJfRVJSKGNzNTNsMzAtPm1jbGspOwogCQkJZ290byBlcnJvcjsKIAkJfQogCQkvKiBPdGhlcndpc2UgbWFyayB0aGUgbWNsayBwb2ludGVyIHRvIE5VTEwgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3gyMDQ0Mi5jIGIvc291bmQvc29jL2NvZGVjcy9jeDIwNDQyLmMKaW5kZXggZmIzODg1Zi4uMmMxMjQ3MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jeDIwNDQyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jeDIwNDQyLmMKQEAgLTQwNywxMCArNDA3LDEyIEBACiAJLnJlZ193b3JkX3NpemUgPSBzaXplb2YodTgpLAogCS5yZWFkID0gY3gyMDQ0Ml9yZWFkX3JlZ19jYWNoZSwKIAkud3JpdGUgPSBjeDIwNDQyX3dyaXRlLAotCS5kYXBtX3dpZGdldHMgPSBjeDIwNDQyX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoY3gyMDQ0Ml9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGN4MjA0NDJfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGN4MjA0NDJfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSBjeDIwNDQyX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGN4MjA0NDJfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGN4MjA0NDJfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShjeDIwNDQyX2F1ZGlvX21hcCksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgY3gyMDQ0Ml9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEwLmMKaW5kZXggYWYyM2E2MS4uMTcwNTNkZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMC5jCkBAIC0xMTY3LDEzICsxMTY3LDE0IEBACiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfZGE3MjEwID0gewogCS5wcm9iZQkJCT0gZGE3MjEwX3Byb2JlLAogCi0JLmNvbnRyb2xzCQk9IGRhNzIxMF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGRhNzIxMF9zbmRfY29udHJvbHMpLAotCi0JLmRhcG1fd2lkZ2V0cwkJPSBkYTcyMTBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkYTcyMTBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJCT0gZGE3MjEwX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShkYTcyMTBfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGRhNzIxMF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShkYTcyMTBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBkYTcyMTBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoZGE3MjEwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBkYTcyMTBfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShkYTcyMTBfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEzLmMgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMy5jCmluZGV4IGU1NTI3YmMuLjEyZGE1NTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTMuYwpAQCAtNzUwLDExICs3NTAsMTggQEAKIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEzX1BDX0NPVU5ULAogCQkJCSAgICBEQTcyMTNfUENfRlJFRVJVTl9NQVNLLCAwKTsKIAotCQkvKiBTbGF2ZSBtb2RlLCBpZiBTUk0gbm90IGVuYWJsZWQgbm8gbmVlZCBmb3Igc3RhdHVzIGNoZWNrcyAqLworCQkvKiBJZiBTUk0gbm90IGVuYWJsZWQgdGhlbiBub3RoaW5nIG1vcmUgdG8gZG8gKi8KIAkJcGxsX2N0cmwgPSBzbmRfc29jX3JlYWQoY29kZWMsIERBNzIxM19QTExfQ1RSTCk7CiAJCWlmICghKHBsbF9jdHJsICYgREE3MjEzX1BMTF9TUk1fRU4pKQogCQkJcmV0dXJuIDA7CiAKKwkJLyogQXNzaXN0IDMyS0h6IG1vZGUgUExMIGxvY2sgKi8KKwkJaWYgKHBsbF9jdHJsICYgREE3MjEzX1BMTF8zMktfTU9ERSkgeworCQkJc25kX3NvY193cml0ZShjb2RlYywgMHhGMCwgMHg4Qik7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweEYyLCAweDAzKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4RjAsIDB4MDApOworCQl9CisKIAkJLyogQ2hlY2sgU1JNIGhhcyBsb2NrZWQgKi8KIAkJZG8gewogCQkJcGxsX3N0YXR1cyA9IHNuZF9zb2NfcmVhZChjb2RlYywgREE3MjEzX1BMTF9TVEFUVVMpOwpAQCAtNzcxLDYgKzc3OCwxNCBAQAogCiAJCXJldHVybiAwOwogCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQkvKiBSZXZlcnQgMzJLSHogUExMIGxvY2sgdWRwYXRlcyBpZiBhcHBsaWVkIHByZXZpb3VzbHkgKi8KKwkJcGxsX2N0cmwgPSBzbmRfc29jX3JlYWQoY29kZWMsIERBNzIxM19QTExfQ1RSTCk7CisJCWlmIChwbGxfY3RybCAmIERBNzIxM19QTExfMzJLX01PREUpIHsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4RjAsIDB4OEIpOworCQkJc25kX3NvY193cml0ZShjb2RlYywgMHhGMiwgMHgwMSk7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweEYwLCAweDAwKTsKKwkJfQorCiAJCS8qIFBDIGZyZWUtcnVubmluZyAqLwogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTNfUENfQ09VTlQsCiAJCQkJICAgIERBNzIxM19QQ19GUkVFUlVOX01BU0ssCkBAIC0xMjQ3LDggKzEyNjIsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQkvKiBCeSBkZWZhdWx0IG9ubHkgMzIgQkNMSyBwZXIgV0NMSyBpcyBzdXBwb3J0ZWQgKi8KLQlkYWlfY2xrX21vZGUgfD0gREE3MjEzX0RBSV9CQ0xLU19QRVJfV0NMS18zMjsKKwkvKiBCeSBkZWZhdWx0IG9ubHkgNjQgQkNMSyBwZXIgV0NMSyBpcyBzdXBwb3J0ZWQgKi8KKwlkYWlfY2xrX21vZGUgfD0gREE3MjEzX0RBSV9CQ0xLU19QRVJfV0NMS182NDsKIAogCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxM19EQUlfQ0xLX01PREUsIGRhaV9jbGtfbW9kZSk7CiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEzX0RBSV9DVFJMLCBEQTcyMTNfREFJX0ZPUk1BVF9NQVNLLApAQCAtMTI5NywxMCArMTMxMiwxMyBAQAogCiAJc3dpdGNoIChjbGtfaWQpIHsKIAljYXNlIERBNzIxM19DTEtTUkNfTUNMSzoKLQkJZGE3MjEzLT5tY2xrX3NxdWFyZXJfZW4gPSBmYWxzZTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEzX1BMTF9DVFJMLAorCQkJCSAgICBEQTcyMTNfUExMX01DTEtfU1FSX0VOLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBEQTcyMTNfQ0xLU1JDX01DTEtfU1FSOgotCQlkYTcyMTMtPm1jbGtfc3F1YXJlcl9lbiA9IHRydWU7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxM19QTExfQ1RSTCwKKwkJCQkgICAgREE3MjEzX1BMTF9NQ0xLX1NRUl9FTiwKKwkJCQkgICAgREE3MjEzX1BMTF9NQ0xLX1NRUl9FTik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoY29kZWNfZGFpLT5kZXYsICJVbmtub3duIGNsb2NrIHNvdXJjZSAlZFxuIiwgY2xrX2lkKTsKQEAgLTEzMjQsNyArMTM0Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFN1cHBvcnRlZCBQTEwgaW5wdXQgZnJlcXVlbmNpZXMgYXJlIDVNSHogLSA1NE1Iei4gKi8KKy8qIFN1cHBvcnRlZCBQTEwgaW5wdXQgZnJlcXVlbmNpZXMgYXJlIDMyS0h6LCA1TUh6IC0gNTRNSHouICovCiBzdGF0aWMgaW50IGRhNzIxM19zZXRfZGFpX3BsbChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwgaW50IHBsbF9pZCwKIAkJCSAgICAgIGludCBzb3VyY2UsIHVuc2lnbmVkIGludCBmcmVmLCB1bnNpZ25lZCBpbnQgZm91dCkKIHsKQEAgLTEzMzYsMjIgKzEzNTQsMjYgQEAKIAl1MzIgZnJlcV9yZWY7CiAJdTY0IGZyYWNfZGl2OwogCi0JLyogUmVzZXQgUExMIGNvbmZpZ3VyYXRpb24gKi8KLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBEQTcyMTNfUExMX0NUUkwsIDApOwotCi0JcGxsX2N0cmwgPSAwOwotCiAJLyogV29ya291dCBpbnB1dCBkaXZpZGVyIGJhc2VkIG9uIE1DTEsgcmF0ZSAqLwogCWlmIChkYTcyMTMtPm1jbGtfcmF0ZSA9PSAzMjc2OCkgeworCQlpZiAoIWRhNzIxMy0+bWFzdGVyKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJIjMyS0h6IG9ubHkgdmFsaWQgaWYgY29kZWMgaXMgY2xvY2sgbWFzdGVyXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKIAkJLyogMzJLSHogUExMIE1vZGUgKi8KIAkJaW5kaXZfYml0cyA9IERBNzIxM19QTExfSU5ESVZfOV9UT18xOF9NSFo7CiAJCWluZGl2ID0gREE3MjEzX1BMTF9JTkRJVl85X1RPXzE4X01IWl9WQUw7CisJCXNvdXJjZSA9IERBNzIxM19TWVNDTEtfUExMXzMyS0haOwogCQlmcmVxX3JlZiA9IDM3NTAwMDA7Ci0JCXBsbF9jdHJsIHw9IERBNzIxM19QTExfMzJLX01PREU7CisKIAl9IGVsc2UgewotCQkvKiA1IC0gNTRNSHogTUNMSyAqLwogCQlpZiAoZGE3MjEzLT5tY2xrX3JhdGUgPCA1MDAwMDAwKSB7Ci0JCQlnb3RvIHBsbF9lcnI7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJIlBMTCBpbnB1dCBjbG9jayAlZCBiZWxvdyB2YWxpZCByYW5nZVxuIiwKKwkJCQlkYTcyMTMtPm1jbGtfcmF0ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfSBlbHNlIGlmIChkYTcyMTMtPm1jbGtfcmF0ZSA8PSA5MDAwMDAwKSB7CiAJCQlpbmRpdl9iaXRzID0gREE3MjEzX1BMTF9JTkRJVl81X1RPXzlfTUhaOwogCQkJaW5kaXYgPSBEQTcyMTNfUExMX0lORElWXzVfVE9fOV9NSFpfVkFMOwpAQCAtMTM2NSwzMSArMTM4Nyw0MyBAQAogCQkJaW5kaXZfYml0cyA9IERBNzIxM19QTExfSU5ESVZfMzZfVE9fNTRfTUhaOwogCQkJaW5kaXYgPSBEQTcyMTNfUExMX0lORElWXzM2X1RPXzU0X01IWl9WQUw7CiAJCX0gZWxzZSB7Ci0JCQlnb3RvIHBsbF9lcnI7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJIlBMTCBpbnB1dCBjbG9jayAlZCBhYm92ZSB2YWxpZCByYW5nZVxuIiwKKwkJCQlkYTcyMTMtPm1jbGtfcmF0ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlmcmVxX3JlZiA9IChkYTcyMTMtPm1jbGtfcmF0ZSAvIGluZGl2KTsKIAl9CiAKLQlwbGxfY3RybCB8PSBpbmRpdl9iaXRzOworCXBsbF9jdHJsID0gaW5kaXZfYml0czsKIAotCS8qIFBMTCBCeXBhc3MgbW9kZSAqLwotCWlmIChzb3VyY2UgPT0gREE3MjEzX1NZU0NMS19NQ0xLKSB7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxM19QTExfQ1RSTCwgcGxsX2N0cmwpOworCS8qIENvbmZpZ3VyZSBQTEwgKi8KKwlzd2l0Y2ggKHNvdXJjZSkgeworCWNhc2UgREE3MjEzX1NZU0NMS19NQ0xLOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTNfUExMX0NUUkwsCisJCQkJICAgIERBNzIxM19QTExfSU5ESVZfTUFTSyB8CisJCQkJICAgIERBNzIxM19QTExfTU9ERV9NQVNLLCBwbGxfY3RybCk7CiAJCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogSWYgQ29kZWMgaXMgc2xhdmUgYW5kIFNSTSBlbmFibGVkLAotCSAqIGZyZXFfb3V0IGlzICg5ODMwNDAwMCArIDkwMzE2ODAwKS8yID0gOTQzMTA0MDAKLQkgKi8KLQlpZiAoIWRhNzIxMy0+bWFzdGVyICYmIGRhNzIxMy0+c3JtX2VuKSB7Ci0JCWZvdXQgPSBEQTcyMTNfUExMX0ZSRVFfT1VUXzk0MzEwNDAwOworCWNhc2UgREE3MjEzX1NZU0NMS19QTEw6CisJCWJyZWFrOworCWNhc2UgREE3MjEzX1NZU0NMS19QTExfU1JNOgogCQlwbGxfY3RybCB8PSBEQTcyMTNfUExMX1NSTV9FTjsKLQl9CisJCWZvdXQgPSBEQTcyMTNfUExMX0ZSRVFfT1VUXzk0MzEwNDAwOworCQlicmVhazsKKwljYXNlIERBNzIxM19TWVNDTEtfUExMXzMyS0haOgorCQlpZiAoZGE3MjEzLT5tY2xrX3JhdGUgIT0gMzI3NjgpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiMzJLSHogbW9kZSBvbmx5IHZhbGlkIHdpdGggMzJLSHogTUNMS1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCi0JLyogRW5hYmxlIE1DTEsgc3F1YXJlciBpZiByZXF1aXJlZCAqLwotCWlmIChkYTcyMTMtPm1jbGtfc3F1YXJlcl9lbikKLQkJcGxsX2N0cmwgfD0gREE3MjEzX1BMTF9NQ0xLX1NRUl9FTjsKKwkJcGxsX2N0cmwgfD0gREE3MjEzX1BMTF8zMktfTU9ERSB8IERBNzIxM19QTExfU1JNX0VOOworCQlmb3V0ID0gREE3MjEzX1BMTF9GUkVRX09VVF85NDMxMDQwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBQTEwgY29uZmlnXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJLyogQ2FsY3VsYXRlIGRpdmlkZXJzIGZvciBQTEwgKi8KIAlwbGxfaW50ZWdlciA9IGZvdXQgLyBmcmVxX3JlZjsKQEAgLTE0MDUsMTQgKzE0MzksMTkgQEAKIAogCS8qIEVuYWJsZSBQTEwgKi8KIAlwbGxfY3RybCB8PSBEQTcyMTNfUExMX0VOOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxM19QTExfQ1RSTCwgcGxsX2N0cmwpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxM19QTExfQ1RSTCwKKwkJCSAgICBEQTcyMTNfUExMX0lORElWX01BU0sgfCBEQTcyMTNfUExMX01PREVfTUFTSywKKwkJCSAgICBwbGxfY3RybCk7CisKKwkvKiBBc3Npc3QgMzJLSHogbW9kZSBQTEwgbG9jayAqLworCWlmIChzb3VyY2UgPT0gREE3MjEzX1NZU0NMS19QTExfMzJLSFopIHsKKwkJc25kX3NvY193cml0ZShjb2RlYywgMHhGMCwgMHg4Qik7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4RjEsIDB4MDMpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweEYxLCAweDAxKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgMHhGMCwgMHgwMCk7CisJfQogCiAJcmV0dXJuIDA7Ci0KLXBsbF9lcnI6Ci0JZGV2X2Vycihjb2RlY19kYWktPmRldiwgIlVuc3VwcG9ydGVkIFBMTCBpbnB1dCBmcmVxdWVuY3kgJWRcbiIsCi0JCWRhNzIxMy0+bWNsa19yYXRlKTsKLQlyZXR1cm4gLUVJTlZBTDsKIH0KIAogLyogREFJIG9wZXJhdGlvbnMgKi8KQEAgLTE0NTQsMTEgKzE0OTMsMTAgQEAKIAogCXN3aXRjaCAobGV2ZWwpIHsKIAljYXNlIFNORF9TT0NfQklBU19PTjoKLQljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgogCQlicmVhazsKLQljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgotCQlpZiAoc25kX3NvY19jb2RlY19nZXRfYmlhc19sZXZlbChjb2RlYykgPT0gU05EX1NPQ19CSUFTX09GRikgewotCQkJLyogTUNMSyAqLworCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCS8qIEVuYWJsZSBNQ0xLIGZvciB0cmFuc2l0aW9uIHRvIE9OIHN0YXRlICovCisJCWlmIChzbmRfc29jX2NvZGVjX2dldF9iaWFzX2xldmVsKGNvZGVjKSA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSkgewogCQkJaWYgKGRhNzIxMy0+bWNsaykgewogCQkJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkYTcyMTMtPm1jbGspOwogCQkJCWlmIChyZXQpIHsKQEAgLTE0NjcsMjEgKzE1MDUsMjQgQEAKIAkJCQkJcmV0dXJuIHJldDsKIAkJCQl9CiAJCQl9Ci0KKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgorCQlpZiAoc25kX3NvY19jb2RlY19nZXRfYmlhc19sZXZlbChjb2RlYykgPT0gU05EX1NPQ19CSUFTX09GRikgewogCQkJLyogRW5hYmxlIFZNSUQgcmVmZXJlbmNlICYgbWFzdGVyIGJpYXMgKi8KIAkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxM19SRUZFUkVOQ0VTLAogCQkJCQkgICAgREE3MjEzX1ZNSURfRU4gfCBEQTcyMTNfQklBU19FTiwKIAkJCQkJICAgIERBNzIxM19WTUlEX0VOIHwgREE3MjEzX0JJQVNfRU4pOworCQl9IGVsc2UgeworCQkJLyogUmVtb3ZlIE1DTEsgKi8KKwkJCWlmIChkYTcyMTMtPm1jbGspCisJCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhNzIxMy0+bWNsayk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgogCQkvKiBEaXNhYmxlIFZNSUQgcmVmZXJlbmNlICYgbWFzdGVyIGJpYXMgKi8KIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEzX1JFRkVSRU5DRVMsCiAJCQkJICAgIERBNzIxM19WTUlEX0VOIHwgREE3MjEzX0JJQVNfRU4sIDApOwotCi0JCS8qIE1DTEsgKi8KLQkJaWYgKGRhNzIxMy0+bWNsaykKLQkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShkYTcyMTMtPm1jbGspOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xNjA1LDkgKzE2NDYsNiBAQAogCQkJICAgIERBNzIxM19BTENfQ0FMSUJfTU9ERV9NQU4sIDApOwogCWRhNzIxMy0+YWxjX2NhbGliX2F1dG8gPSB0cnVlOwogCi0JLyogRGVmYXVsdCB0byB1c2luZyBTUk0gZm9yIHNsYXZlIG1vZGUgKi8KLQlkYTcyMTMtPnNybV9lbiA9IHRydWU7Ci0KIAkvKiBEZWZhdWx0IFBDIGNvdW50ZXIgdG8gZnJlZS1ydW5uaW5nICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEzX1BDX0NPVU5ULCBEQTcyMTNfUENfRlJFRVJVTl9NQVNLLAogCQkJICAgIERBNzIxM19QQ19GUkVFUlVOX01BU0spOwpAQCAtMTc0MCwxMyArMTc3OCwxNCBAQAogCS5wcm9iZQkJCT0gZGE3MjEzX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbAkJPSBkYTcyMTNfc2V0X2JpYXNfbGV2ZWwsCiAKLQkuY29udHJvbHMJCT0gZGE3MjEzX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoZGE3MjEzX3NuZF9jb250cm9scyksCi0KLQkuZGFwbV93aWRnZXRzCQk9IGRhNzIxM19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGRhNzIxM19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBkYTcyMTNfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhNzIxM19hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gZGE3MjEzX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGRhNzIxM19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGRhNzIxM19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkYTcyMTNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGRhNzIxM19hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhNzIxM19hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgZGE3MjEzX3JlZ21hcF9jb25maWcgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMy5oIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTMuaAppbmRleCBmYmI3YTM1Li4xNmVmNTZmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMy5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEzLmgKQEAgLTE3Miw2ICsxNzIsNyBAQAogI2RlZmluZSBEQTcyMTNfUExMXzMyS19NT0RFCQkJCQkoMHgxIDw8IDUpCiAjZGVmaW5lIERBNzIxM19QTExfU1JNX0VOCQkJCQkoMHgxIDw8IDYpCiAjZGVmaW5lIERBNzIxM19QTExfRU4JCQkJCQkoMHgxIDw8IDcpCisjZGVmaW5lIERBNzIxM19QTExfTU9ERV9NQVNLCQkJCQkoMHg3IDw8IDUpCiAKIC8qIERBNzIxM19EQUlfQ0xLX01PREUgPSAweDI4ICovCiAjZGVmaW5lIERBNzIxM19EQUlfQkNMS1NfUEVSX1dDTEtfMzIJCQkJKDB4MCA8PCAwKQpAQCAtNDk5LDggKzUwMCw2IEBACiAjZGVmaW5lIERBNzIxM19BTENfQVZHX0lURVJBVElPTlMJNQogCiAvKiBQTEwgcmVsYXRlZCAqLwotI2RlZmluZSBEQTcyMTNfU1lTQ0xLX01DTEsJCQkwCi0jZGVmaW5lIERBNzIxM19TWVNDTEtfUExMCQkJMQogI2RlZmluZSBEQTcyMTNfUExMX0ZSRVFfT1VUXzkwMzE2ODAwCQk5MDMxNjgwMAogI2RlZmluZSBEQTcyMTNfUExMX0ZSRVFfT1VUXzk4MzA0MDAwCQk5ODMwNDAwMAogI2RlZmluZSBEQTcyMTNfUExMX0ZSRVFfT1VUXzk0MzEwNDAwCQk5NDMxMDQwMApAQCAtNTE1LDYgKzUxNCwxMyBAQAogCURBNzIxM19DTEtTUkNfTUNMS19TUVIsCiB9OwogCitlbnVtIGRhNzIxM19zeXNfY2xrIHsKKwlEQTcyMTNfU1lTQ0xLX01DTEsgPSAwLAorCURBNzIxM19TWVNDTEtfUExMLAorCURBNzIxM19TWVNDTEtfUExMX1NSTSwKKwlEQTcyMTNfU1lTQ0xLX1BMTF8zMktIWgorfTsKKwogLyogQ29kZWMgcHJpdmF0ZSBkYXRhICovCiBzdHJ1Y3QgZGE3MjEzX3ByaXYgewogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKQEAgLTUyMiw4ICs1MjgsNiBAQAogCXVuc2lnbmVkIGludCBtY2xrX3JhdGU7CiAJaW50IGNsa19zcmM7CiAJYm9vbCBtYXN0ZXI7Ci0JYm9vbCBtY2xrX3NxdWFyZXJfZW47Ci0JYm9vbCBzcm1fZW47CiAJYm9vbCBhbGNfY2FsaWJfYXV0bzsKIAlib29sIGFsY19lbjsKIAlzdHJ1Y3QgZGE3MjEzX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTguYyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE4LmMKaW5kZXggOTljZTIzZS4uYzY5ZTk3NiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOC5jCkBAIC0xODE5LDcgKzE4MTksNyBAQAogCWlmIChkYTcyMTgtPm1jbGtfcmF0ZSA9PSBmcmVxKQogCQlyZXR1cm4gMDsKIAotCWlmICgoKGZyZXEgPCAyMDAwMDAwKSAmJiAoZnJlcSAhPSAzMjc2OCkpIHx8IChmcmVxID4gNTQwMDAwMDApKSB7CisJaWYgKChmcmVxIDwgMjAwMDAwMCkgfHwgKGZyZXEgPiA1NDAwMDAwMCkpIHsKIAkJZGV2X2Vycihjb2RlY19kYWktPmRldiwgIlVuc3VwcG9ydGVkIE1DTEsgdmFsdWUgJWRcbiIsCiAJCQlmcmVxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xODY2LDExICsxODY2LDggQEAKIAl1MzIgZnJlcV9yZWY7CiAJdTY0IGZyYWNfZGl2OwogCi0JLyogVmVyaWZ5IDMyS0h6LCAyTUh6IC0gNTRNSHogTUNMSyBwcm92aWRlZCwgYW5kIHNldCBpbnB1dCBkaXZpZGVyICovCi0JaWYgKGRhNzIxOC0+bWNsa19yYXRlID09IDMyNzY4KSB7Ci0JCWluZGl2X2JpdHMgPSBEQTcyMThfUExMX0lORElWXzlfVE9fMThfTUhaOwotCQlpbmRpdiA9IERBNzIxOF9QTExfSU5ESVZfOV9UT18xOF9NSFpfVkFMOwotCX0gZWxzZSBpZiAoZGE3MjE4LT5tY2xrX3JhdGUgPCAyMDAwMDAwKSB7CisJLyogVmVyaWZ5IDJNSHogLSA1NE1IeiBNQ0xLIHByb3ZpZGVkLCBhbmQgc2V0IGlucHV0IGRpdmlkZXIgKi8KKwlpZiAoZGE3MjE4LT5tY2xrX3JhdGUgPCAyMDAwMDAwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIlBMTCBpbnB1dCBjbG9jayAlZCBiZWxvdyB2YWxpZCByYW5nZVxuIiwKIAkJCWRhNzIxOC0+bWNsa19yYXRlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xOTExLDkgKzE5MDgsNiBAQAogCWNhc2UgREE3MjE4X1NZU0NMS19QTExfU1JNOgogCQlwbGxfY3RybCB8PSBEQTcyMThfUExMX01PREVfU1JNOwogCQlicmVhazsKLQljYXNlIERBNzIxOF9TWVNDTEtfUExMXzMyS0haOgotCQlwbGxfY3RybCB8PSBEQTcyMThfUExMX01PREVfMzJLSFo7Ci0JCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgUExMIGNvbmZpZ1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjU4OSwyMCArMjU4MywyMiBAQAogCiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgotCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CiAJCWJyZWFrOwotCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCWlmIChzbmRfc29jX2NvZGVjX2dldF9iaWFzX2xldmVsKGNvZGVjKSA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7Ci0JCQkvKiBNQ0xLICovCisJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKKwkJLyogRW5hYmxlIE1DTEsgZm9yIHRyYW5zaXRpb24gdG8gT04gc3RhdGUgKi8KKwkJaWYgKHNuZF9zb2NfY29kZWNfZ2V0X2JpYXNfbGV2ZWwoY29kZWMpID09IFNORF9TT0NfQklBU19TVEFOREJZKSB7CiAJCQlpZiAoZGE3MjE4LT5tY2xrKSB7CiAJCQkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRhNzIxOC0+bWNsayk7CiAJCQkJaWYgKHJldCkgewotCQkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJCQkiRmFpbGVkIHRvIGVuYWJsZSBtY2xrXG4iKTsKKwkJCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBtY2xrXG4iKTsKIAkJCQkJcmV0dXJuIHJldDsKIAkJCQl9CiAJCQl9CisJCX0KIAorCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgorCQlpZiAoc25kX3NvY19jb2RlY19nZXRfYmlhc19sZXZlbChjb2RlYykgPT0gU05EX1NPQ19CSUFTX09GRikgewogCQkJLyogTWFzdGVyIGJpYXMgKi8KIAkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxOF9SRUZFUkVOQ0VTLAogCQkJCQkgICAgREE3MjE4X0JJQVNfRU5fTUFTSywKQEAgLTI2MTIsNiArMjYwOCwxMCBAQAogCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjE4X0xET19DVFJMLAogCQkJCQkgICAgREE3MjE4X0xET19FTl9NQVNLLAogCQkJCQkgICAgREE3MjE4X0xET19FTl9NQVNLKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFJlbW92ZSBNQ0xLICovCisJCQlpZiAoZGE3MjE4LT5tY2xrKQorCQkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShkYTcyMTgtPm1jbGspOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKQEAgLTI2MjUsMTAgKzI2MjUsNiBAQAogCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjE4X1JFRkVSRU5DRVMsCiAJCQkJCSAgICBEQTcyMThfQklBU19FTl9NQVNLLCAwKTsKIAkJfQotCi0JCS8qIE1DTEsgKi8KLQkJaWYgKGRhNzIxOC0+bWNsaykKLQkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShkYTcyMTgtPm1jbGspOwogCQlicmVhazsKIAl9CiAKQEAgLTMwNDUsMTMgKzMwNDEsMTQgQEAKIAkucmVzdW1lCQkJPSBkYTcyMThfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbAkJPSBkYTcyMThfc2V0X2JpYXNfbGV2ZWwsCiAKLQkuY29udHJvbHMJCT0gZGE3MjE4X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoZGE3MjE4X3NuZF9jb250cm9scyksCi0KLQkuZGFwbV93aWRnZXRzCQk9IGRhNzIxOF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGRhNzIxOF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBkYTcyMThfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhNzIxOF9hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gZGE3MjE4X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGRhNzIxOF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGRhNzIxOF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkYTcyMThfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGRhNzIxOF9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhNzIxOF9hdWRpb19tYXApLAorCX0sCiB9OwogCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE4LmggYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOC5oCmluZGV4IDQ3N2NkMzcuLjRmN2VjMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE4LmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTguaApAQCAtODg4LDcgKzg4OCw2IEBACiAjZGVmaW5lIERBNzIxOF9QTExfTU9ERV9CWVBBU1MJCSgweDAgPDwgNikKICNkZWZpbmUgREE3MjE4X1BMTF9NT0RFX05PUk1BTAkJKDB4MSA8PCA2KQogI2RlZmluZSBEQTcyMThfUExMX01PREVfU1JNCQkoMHgyIDw8IDYpCi0jZGVmaW5lIERBNzIxOF9QTExfTU9ERV8zMktIWgkJKDB4MyA8PCA2KQogCiAvKiBEQTcyMThfUExMX0ZSQUNfVE9QID0gMHg5MiAqLwogI2RlZmluZSBEQTcyMThfUExMX0ZCRElWX0ZSQUNfVE9QX1NISUZUCTAKQEAgLTEzNzEsNyArMTM3MCw2IEBACiAJREE3MjE4X1NZU0NMS19NQ0xLID0gMCwKIAlEQTcyMThfU1lTQ0xLX1BMTCwKIAlEQTcyMThfU1lTQ0xLX1BMTF9TUk0sCi0JREE3MjE4X1NZU0NMS19QTExfMzJLSFoKIH07CiAKIGVudW0gZGE3MjE4X2Rldl9pZCB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS1hYWQuYyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE5LWFhZC5jCmluZGV4IGYwMDU3Y2QuLjJiODkxNGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE5LWFhZC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE5LWFhZC5jCkBAIC0xMyw2ICsxMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9wZXJ0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3dha2VpcnEuaD4KQEAgLTExNCwxMyArMTE1LDM4IEBACiAJc3RydWN0IGRhNzIxOV9wcml2ICpkYTcyMTkgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAogCXUxNiB0b25lZ2VuX2ZyZXFfaHB0ZXN0OwotCXU4IGFjY2RldF9jZmc4OwotCWludCByZXBvcnQgPSAwOworCXU4IHBsbF9zcm1fc3RzLCBnYWluX3JhbXBfY3RybCwgYWNjZGV0X2NmZzg7CisJaW50IHJlcG9ydCA9IDAsIHJldCA9IDA7CiAKIAkvKiBMb2NrIERBUE0gYW5kIGFueSBLY29udHJvbHMgdGhhdCBhcmUgYWZmZWN0ZWQgYnkgdGhpcyB0ZXN0ICovCiAJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CiAJbXV0ZXhfbG9jaygmZGE3MjE5LT5sb2NrKTsKIAorCS8qIEVuc3VyZSBNQ0xLIGlzIGF2YWlsYWJsZSBmb3IgSFAgdGVzdCBwcm9jZWR1cmUgKi8KKwlpZiAoZGE3MjE5LT5tY2xrKSB7CisJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkYTcyMTktPm1jbGspOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIG1jbGsgLSAlZFxuIiwgcmV0KTsKKwkJCW11dGV4X3VubG9jaygmZGE3MjE5LT5sb2NrKTsKKwkJCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKgorCSAqIElmIE1DTEsgbm90IHByZXNlbnQsIHRoZW4gd2UncmUgdXNpbmcgdGhlIGludGVybmFsIG9zY2lsbGF0b3IgYW5kCisJICogcmVxdWlyZSBkaWZmZXJlbnQgZnJlcXVlbmN5IHNldHRpbmdzIHRvIGFjaGlldmUgdGhlIHNhbWUgcmVzdWx0LgorCSAqLworCXBsbF9zcm1fc3RzID0gc25kX3NvY19yZWFkKGNvZGVjLCBEQTcyMTlfUExMX1NSTV9TVFMpOworCWlmIChwbGxfc3JtX3N0cyAmIERBNzIxOV9QTExfU1JNX1NUU19NQ0xLKQorCQl0b25lZ2VuX2ZyZXFfaHB0ZXN0ID0gY3B1X3RvX2xlMTYoREE3MjE5X0FBRF9IUFRFU1RfUkFNUF9GUkVRKTsKKwllbHNlCisJCXRvbmVnZW5fZnJlcV9ocHRlc3QgPSBjcHVfdG9fbGUxNihEQTcyMTlfQUFEX0hQVEVTVF9SQU1QX0ZSRVFfSU5UX09TQyk7CisKKwkvKiBFbnN1cmUgZ2FpbiByYW1waW5nIGF0IGZhc3Rlc3QgcmF0ZSAqLworCWdhaW5fcmFtcF9jdHJsID0gc25kX3NvY19yZWFkKGNvZGVjLCBEQTcyMTlfR0FJTl9SQU1QX0NUUkwpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxOV9HQUlOX1JBTVBfQ1RSTCwgREE3MjE5X0dBSU5fUkFNUF9SQVRFX1g4KTsKKwogCS8qIEJ5cGFzcyBjYWNoZSBzbyBpdCBzYXZlcyBjdXJyZW50IHNldHRpbmdzICovCiAJcmVnY2FjaGVfY2FjaGVfYnlwYXNzKGRhNzIxOS0+cmVnbWFwLCB0cnVlKTsKIApAQCAtMTgzLDkgKzIwOSwxNSBAQAogCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxOV9IUF9SX0NUUkwsCiAJCSAgICAgIERBNzIxOV9IUF9SX0FNUF9PRV9NQVNLIHwgREE3MjE5X0hQX1JfQU1QX0VOX01BU0spOwogCisJLyoKKwkgKiBJZiB3ZSdyZSBydW5uaW5nIGZyb20gdGhlIGludGVybmFsIG9zY2lsbGF0b3IgdGhlbiBnaXZlIGF1ZGlvIHBhdGhzCisJICogdGltZSB0byBzZXR0bGUgYmVmb3JlIHJ1bm5pbmcgdGVzdC4KKwkgKi8KKwlpZiAoIShwbGxfc3JtX3N0cyAmIERBNzIxOV9QTExfU1JNX1NUU19NQ0xLKSkKKwkJbXNsZWVwKERBNzIxOV9BQURfSFBURVNUX0lOVF9PU0NfUEFUSF9ERUxBWSk7CisKIAkvKiBDb25maWd1cmUgJiBzdGFydCBUb25lIEdlbmVyYXRvciAqLwogCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxOV9UT05FX0dFTl9PTl9QRVIsIERBNzIxOV9CRUVQX09OX1BFUl9NQVNLKTsKLQl0b25lZ2VuX2ZyZXFfaHB0ZXN0ID0gY3B1X3RvX2xlMTYoREE3MjE5X0FBRF9IUFRFU1RfUkFNUF9GUkVRKTsKIAlyZWdtYXBfcmF3X3dyaXRlKGRhNzIxOS0+cmVnbWFwLCBEQTcyMTlfVE9ORV9HRU5fRlJFUTFfTCwKIAkJCSAmdG9uZWdlbl9mcmVxX2hwdGVzdCwgc2l6ZW9mKHRvbmVnZW5fZnJlcV9ocHRlc3QpKTsKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTlfVE9ORV9HRU5fQ0ZHMiwKQEAgLTI0NCwxMiArMjc2LDI2IEBACiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjE5X0FDQ0RFVF9DT05GSUdfOCwKIAkJCSAgICBEQTcyMTlfSFBURVNUX0VOX01BU0ssIDApOwogCisJLyoKKwkgKiBJZiB3ZSdyZSBydW5uaW5nIGZyb20gdGhlIGludGVybmFsIG9zY2lsbGF0b3IgdGhlbiBnaXZlIGF1ZGlvIHBhdGhzCisJICogdGltZSB0byBzZXR0bGUgYmVmb3JlIGFsbG93aW5nIGhlYWRwaG9uZXMgdG8gYmUgZHJpdmVuIGFzIHJlcXVpcmVkLgorCSAqLworCWlmICghKHBsbF9zcm1fc3RzICYgREE3MjE5X1BMTF9TUk1fU1RTX01DTEspKQorCQltc2xlZXAoREE3MjE5X0FBRF9IUFRFU1RfSU5UX09TQ19QQVRIX0RFTEFZKTsKKworCS8qIFJlc3RvcmUgZ2FpbiByYW1waW5nIHJhdGUgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBEQTcyMTlfR0FJTl9SQU1QX0NUUkwsIGdhaW5fcmFtcF9jdHJsKTsKKwogCS8qIERyaXZlIEhlYWRwaG9uZXMvbGluZW91dCAqLwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxOV9IUF9MX0NUUkwsIERBNzIxOV9IUF9MX0FNUF9PRV9NQVNLLAogCQkJICAgIERBNzIxOV9IUF9MX0FNUF9PRV9NQVNLKTsKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTlfSFBfUl9DVFJMLCBEQTcyMTlfSFBfUl9BTVBfT0VfTUFTSywKIAkJCSAgICBEQTcyMTlfSFBfUl9BTVBfT0VfTUFTSyk7CiAKKwkvKiBSZW1vdmUgTUNMSywgaWYgcHJldmlvdXNseSBlbmFibGVkICovCisJaWYgKGRhNzIxOS0+bWNsaykKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhNzIxOS0+bWNsayk7CisKIAltdXRleF91bmxvY2soJmRhNzIxOS0+bG9jayk7CiAJc25kX3NvY19kYXBtX211dGV4X3VubG9jayhkYXBtKTsKIApAQCAtNzUxLDYgKzc5Nyw2MiBAQAogCiAKIC8qCisgKiBTdXNwZW5kL1Jlc3VtZQorICovCisKK3ZvaWQgZGE3MjE5X2FhZF9zdXNwZW5kKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgZGE3MjE5X3ByaXYgKmRhNzIxOSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBkYTcyMTlfYWFkX3ByaXYgKmRhNzIxOV9hYWQgPSBkYTcyMTktPmFhZDsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKKwl1OCBtaWNiaWFzX2N0cmw7CisKKwlpZiAoZGE3MjE5X2FhZC0+amFjaykgeworCQkvKiBEaXNhYmxlIGphY2sgZGV0ZWN0aW9uIGR1cmluZyBzdXNwZW5kICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxOV9BQ0NERVRfQ09ORklHXzEsCisJCQkJICAgIERBNzIxOV9BQ0NERVRfRU5fTUFTSywgMCk7CisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBhIDQtcG9sZSBqYWNrIGluc2VydGVkLCB0aGVuIG1pY2JpYXMgd2lsbCBiZQorCQkgKiBlbmFibGVkLiBXZSBjYW4gZGlzYWJsZSBtaWNiaWFzIGhlcmUsIGFuZCBrZWVwIGEgbm90ZSB0bworCQkgKiByZS1lbmFibGUgaXQgb24gcmVzdW1lLiBJZiBqYWNrIHJlbW92YWwgb2NjdXJyZWQgZHVyaW5nCisJCSAqIHN1c3BlbmQgdGhlbiB0aGlzIHdpbGwgYmUgZGVhbHQgd2l0aCB0aHJvdWdoIHRoZSBJUlEgaGFuZGxlci4KKwkJICovCisJCWlmIChkYTcyMTlfYWFkLT5qYWNrX2luc2VydGVkKSB7CisJCQltaWNiaWFzX2N0cmwgPSBzbmRfc29jX3JlYWQoY29kZWMsIERBNzIxOV9NSUNCSUFTX0NUUkwpOworCQkJaWYgKG1pY2JpYXNfY3RybCAmIERBNzIxOV9NSUNCSUFTMV9FTl9NQVNLKSB7CisJCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNaWMgQmlhcyIpOworCQkJCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCQkJCWRhNzIxOV9hYWQtPm1pY2JpYXNfcmVzdW1lX2VuYWJsZSA9IHRydWU7CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgZGE3MjE5X2FhZF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBkYTcyMTlfcHJpdiAqZGE3MjE5ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IGRhNzIxOV9hYWRfcHJpdiAqZGE3MjE5X2FhZCA9IGRhNzIxOS0+YWFkOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOworCisJaWYgKGRhNzIxOV9hYWQtPmphY2spIHsKKwkJLyogUmUtZW5hYmxlIG1pY2JpYXMgaWYgcHJldmlvdXNseSBlbmFibGVkIGZvciA0LXBvbGUgamFjayAqLworCQlpZiAoZGE3MjE5X2FhZC0+amFja19pbnNlcnRlZCAmJgorCQkgICAgZGE3MjE5X2FhZC0+bWljYmlhc19yZXN1bWVfZW5hYmxlKSB7CisJCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbihkYXBtLCAiTWljIEJpYXMiKTsKKwkJCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCQkJZGE3MjE5X2FhZC0+bWljYmlhc19yZXN1bWVfZW5hYmxlID0gZmFsc2U7CisJCX0KKworCQkvKiBSZS1lbmFibGUgamFjayBkZXRlY3Rpb24gKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjE5X0FDQ0RFVF9DT05GSUdfMSwKKwkJCQkgICAgREE3MjE5X0FDQ0RFVF9FTl9NQVNLLAorCQkJCSAgICBEQTcyMTlfQUNDREVUX0VOX01BU0spOworCX0KK30KKworCisvKgogICogSW5pdC9FeGl0CiAgKi8KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTktYWFkLmggYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS1hYWQuaAppbmRleCA0ZmNjZjY3Li4xMTdhM2Q3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS1hYWQuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS1hYWQuaApAQCAtMTc2LDggKzE3NiwxMCBAQAogI2RlZmluZSBEQTcyMTlfQUFEX01JQ0JJQVNfQ0hLX0RFTEFZCTEwCiAjZGVmaW5lIERBNzIxOV9BQURfTUlDQklBU19DSEtfUkVUUklFUwk1CiAKLSNkZWZpbmUgREE3MjE5X0FBRF9IUFRFU1RfUkFNUF9GUkVRCTB4MjgKLSNkZWZpbmUgREE3MjE5X0FBRF9IUFRFU1RfUEVSSU9ECTY1CisjZGVmaW5lIERBNzIxOV9BQURfSFBURVNUX1JBTVBfRlJFUQkJMHgyOAorI2RlZmluZSBEQTcyMTlfQUFEX0hQVEVTVF9SQU1QX0ZSRVFfSU5UX09TQwkweDRECisjZGVmaW5lIERBNzIxOV9BQURfSFBURVNUX1BFUklPRAkJNjUKKyNkZWZpbmUgREE3MjE5X0FBRF9IUFRFU1RfSU5UX09TQ19QQVRIX0RFTEFZCTIwCiAKIGVudW0gZGE3MjE5X2FhZF9ldmVudF9yZWdzIHsKIAlEQTcyMTlfQUFEX0lSUV9SRUdfQSA9IDAsCkBAIC0xOTksMTIgKzIwMSwxNyBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCBocHRlc3Rfd29yazsKIAogCXN0cnVjdCBzbmRfc29jX2phY2sgKmphY2s7CisJYm9vbCBtaWNiaWFzX3Jlc3VtZV9lbmFibGU7CiAJYm9vbCBqYWNrX2luc2VydGVkOwogfTsKIAogLyogQUFEIGNvbnRyb2wgKi8KIHZvaWQgZGE3MjE5X2FhZF9qYWNrX2RldChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHN0cnVjdCBzbmRfc29jX2phY2sgKmphY2spOwogCisvKiBTdXNwZW5kL1Jlc3VtZSAqLwordm9pZCBkYTcyMTlfYWFkX3N1c3BlbmQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKK3ZvaWQgZGE3MjE5X2FhZF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKKwogLyogSW5pdC9FeGl0ICovCiBpbnQgZGE3MjE5X2FhZF9pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7CiB2b2lkIGRhNzIxOV9hYWRfZXhpdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTkuYyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE5LmMKaW5kZXggNTBlYTk0My4uMTE1MmFhNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTkuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS5jCkBAIC04MDEsNyArODAxLDcgQEAKIAkJCQkrK2k7CiAJCQkJbXNsZWVwKDUwKTsKIAkJCX0KLQkJfSB3aGlsZSAoKGkgPCBEQTcyMTlfU1JNX0NIRUNLX1JFVFJJRVMpICYgKCFzcm1fbG9jaykpOworCQl9IHdoaWxlICgoaSA8IERBNzIxOV9TUk1fQ0hFQ0tfUkVUUklFUykgJiYgKCFzcm1fbG9jaykpOwogCiAJCWlmICghc3JtX2xvY2spCiAJCQlkZXZfd2Fybihjb2RlYy0+ZGV2LCAiU1JNIGZhaWxlZCB0byBsb2NrXG4iKTsKQEAgLTE0ODIsNiArMTQ4Miw4IEBACiAJaWYgKCFwZGF0YSkKIAkJcmV0dXJuIE5VTEw7CiAKKwlwZGF0YS0+d2FrZXVwX3NvdXJjZSA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAid2FrZXVwLXNvdXJjZSIpOworCiAJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJkbGcsbWljYmlhcy1sdmwiLCAmb2ZfdmFsMzIpID49IDApCiAJCXBkYXRhLT5taWNiaWFzX2x2bCA9IGRhNzIxOV9md19taWNiaWFzX2x2bChkZXYsIG9mX3ZhbDMyKTsKIAllbHNlCkBAIC0xNTA4LDExICsxNTEwLDEwIEBACiAKIAlzd2l0Y2ggKGxldmVsKSB7CiAJY2FzZSBTTkRfU09DX0JJQVNfT046Ci0JY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKIAkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKLQkJaWYgKHNuZF9zb2NfY29kZWNfZ2V0X2JpYXNfbGV2ZWwoY29kZWMpID09IFNORF9TT0NfQklBU19PRkYpIHsKLQkJCS8qIE1DTEsgKi8KKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQkvKiBFbmFibGUgTUNMSyBmb3IgdHJhbnNpdGlvbiB0byBPTiBzdGF0ZSAqLworCQlpZiAoc25kX3NvY19jb2RlY19nZXRfYmlhc19sZXZlbChjb2RlYykgPT0gU05EX1NPQ19CSUFTX1NUQU5EQlkpIHsKIAkJCWlmIChkYTcyMTktPm1jbGspIHsKIAkJCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZGE3MjE5LT5tY2xrKTsKIAkJCQlpZiAocmV0KSB7CkBAIC0xNTIxLDIyICsxNTIyLDI4IEBACiAJCQkJCXJldHVybiByZXQ7CiAJCQkJfQogCQkJfQorCQl9CiAKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJaWYgKHNuZF9zb2NfY29kZWNfZ2V0X2JpYXNfbGV2ZWwoY29kZWMpID09IFNORF9TT0NfQklBU19PRkYpCiAJCQkvKiBNYXN0ZXIgYmlhcyAqLwogCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjE5X1JFRkVSRU5DRVMsCiAJCQkJCSAgICBEQTcyMTlfQklBU19FTl9NQVNLLAogCQkJCQkgICAgREE3MjE5X0JJQVNfRU5fTUFTSyk7CisKKwkJaWYgKHNuZF9zb2NfY29kZWNfZ2V0X2JpYXNfbGV2ZWwoY29kZWMpID09IFNORF9TT0NfQklBU19QUkVQQVJFKSB7CisJCQkvKiBSZW1vdmUgTUNMSyAqLworCQkJaWYgKGRhNzIxOS0+bWNsaykKKwkJCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZGE3MjE5LT5tY2xrKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19PRkY6Ci0JCS8qIE9ubHkgZGlzYWJsZSBtYXN0ZXIgYmlhcyBpZiBqYWNrIGRldGVjdGlvbiBub3QgYWN0aXZlICovCi0JCWlmICghZGE3MjE5LT5hYWQtPmphY2spCisJCS8qIE9ubHkgZGlzYWJsZSBtYXN0ZXIgYmlhcyBpZiB3ZSdyZSBub3QgYSB3YWtlLXVwIHNvdXJjZSAqLworCQlpZiAoIWRhNzIxOS0+d2FrZXVwX3NvdXJjZSkKIAkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxOV9SRUZFUkVOQ0VTLAogCQkJCQkgICAgREE3MjE5X0JJQVNfRU5fTUFTSywgMCk7CiAKLQkJLyogTUNMSyAqLwotCQlpZiAoZGE3MjE5LT5tY2xrKQotCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhNzIxOS0+bWNsayk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTU5OSw2ICsxNjA2LDggQEAKIAlpZiAocGRhdGEpIHsKIAkJdTggbWljYmlhc19sdmwgPSAwOwogCisJCWRhNzIxOS0+d2FrZXVwX3NvdXJjZSA9IHBkYXRhLT53YWtldXBfc291cmNlOworCiAJCS8qIE1pYyBCaWFzIHZvbHRhZ2VzICovCiAJCXN3aXRjaCAocGRhdGEtPm1pY2JpYXNfbHZsKSB7CiAJCWNhc2UgREE3MjE5X01JQ0JJQVNfMV82VjoKQEAgLTE3MzMsMTEgKzE3NDIsMTEgQEAKIHsKIAlzdHJ1Y3QgZGE3MjE5X3ByaXYgKmRhNzIxOSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0Jc25kX3NvY19jb2RlY19mb3JjZV9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKKwkvKiBTdXNwZW5kIEFBRCBpZiB3ZSdyZSBub3QgYSB3YWtlLXVwIHNvdXJjZSAqLworCWlmICghZGE3MjE5LT53YWtldXBfc291cmNlKQorCQlkYTcyMTlfYWFkX3N1c3BlbmQoY29kZWMpOwogCi0JLyogUHV0IGRldmljZSBpbnRvIHN0YW5kYnkgbW9kZSBpZiBqYWNrIGRldGVjdGlvbiBkaXNhYmxlZCAqLwotCWlmICghZGE3MjE5LT5hYWQtPmphY2spCi0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxOV9TWVNURU1fQUNUSVZFLCAwKTsKKwlzbmRfc29jX2NvZGVjX2ZvcmNlX2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNzQ2LDEzICsxNzU1LDEyIEBACiB7CiAJc3RydWN0IGRhNzIxOV9wcml2ICpkYTcyMTkgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAotCS8qIFB1dCBkZXZpY2UgaW50byBhY3RpdmUgbW9kZSBpZiBwcmV2aW91c2x5IHB1c2hlZCB0byBzdGFuZGJ5ICovCi0JaWYgKCFkYTcyMTktPmFhZC0+amFjaykKLQkJc25kX3NvY193cml0ZShjb2RlYywgREE3MjE5X1NZU1RFTV9BQ1RJVkUsCi0JCQkgICAgICBEQTcyMTlfU1lTVEVNX0FDVElWRV9NQVNLKTsKLQogCXNuZF9zb2NfY29kZWNfZm9yY2VfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCisJLyogUmVzdW1lIEFBRCBpZiBwcmV2aW91c2x5IHN1c3BlbmRlZCAqLworCWlmICghZGE3MjE5LT53YWtldXBfc291cmNlKQorCQlkYTcyMTlfYWFkX3Jlc3VtZShjb2RlYyk7CisKIAlyZXR1cm4gMDsKIH0KICNlbHNlCkBAIC0xNzY3LDEzICsxNzc1LDE0IEBACiAJLnJlc3VtZQkJCT0gZGE3MjE5X3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwJCT0gZGE3MjE5X3NldF9iaWFzX2xldmVsLAogCi0JLmNvbnRyb2xzCQk9IGRhNzIxOV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGRhNzIxOV9zbmRfY29udHJvbHMpLAotCi0JLmRhcG1fd2lkZ2V0cwkJPSBkYTcyMTlfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkYTcyMTlfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJCT0gZGE3MjE5X2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShkYTcyMTlfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGRhNzIxOV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShkYTcyMTlfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBkYTcyMTlfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoZGE3MjE5X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBkYTcyMTlfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShkYTcyMTlfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogCkBAIC0xOTIxLDcgKzE5MzAsOCBAQAogCQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgZGE3MjE5X3ByaXYgKmRhNzIxOTsKLQlpbnQgcmV0OworCXVuc2lnbmVkIGludCBzeXN0ZW1fYWN0aXZlLCBzeXN0ZW1fc3RhdHVzOworCWludCBpLCByZXQ7CiAKIAlkYTcyMTkgPSBkZXZtX2t6YWxsb2MoJmkyYy0+ZGV2LCBzaXplb2Yoc3RydWN0IGRhNzIxOV9wcml2KSwKIAkJCSAgICAgIEdGUF9LRVJORUwpOwpAQCAtMTkzNyw2ICsxOTQ3LDM3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJcmVnY2FjaGVfY2FjaGVfYnlwYXNzKGRhNzIxOS0+cmVnbWFwLCB0cnVlKTsKKworCS8qIERpc2FibGUgYXVkaW8gcGF0aHMgaWYgc3RpbGwgYWN0aXZlIGZyb20gcHJldmlvdXMgc3RhcnQgKi8KKwlyZWdtYXBfcmVhZChkYTcyMTktPnJlZ21hcCwgREE3MjE5X1NZU1RFTV9BQ1RJVkUsICZzeXN0ZW1fYWN0aXZlKTsKKwlpZiAoc3lzdGVtX2FjdGl2ZSkgeworCQlyZWdtYXBfd3JpdGUoZGE3MjE5LT5yZWdtYXAsIERBNzIxOV9HQUlOX1JBTVBfQ1RSTCwKKwkJCSAgICAgREE3MjE5X0dBSU5fUkFNUF9SQVRFX05PTUlOQUwpOworCQlyZWdtYXBfd3JpdGUoZGE3MjE5LT5yZWdtYXAsIERBNzIxOV9TWVNURU1fTU9ERVNfSU5QVVQsIDB4MDApOworCQlyZWdtYXBfd3JpdGUoZGE3MjE5LT5yZWdtYXAsIERBNzIxOV9TWVNURU1fTU9ERVNfT1VUUFVULCAweDAxKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgREE3MjE5X1NZU19TVEFUX0NIRUNLX1JFVFJJRVM7ICsraSkgeworCQkJcmVnbWFwX3JlYWQoZGE3MjE5LT5yZWdtYXAsIERBNzIxOV9TWVNURU1fU1RBVFVTLAorCQkJCSAgICAmc3lzdGVtX3N0YXR1cyk7CisJCQlpZiAoIXN5c3RlbV9zdGF0dXMpCisJCQkJYnJlYWs7CisKKwkJCW1zbGVlcChEQTcyMTlfU1lTX1NUQVRfQ0hFQ0tfREVMQVkpOworCQl9CisJfQorCisJLyogU29mdCByZXNldCBjb2RlYyAqLworCXJlZ21hcF93cml0ZV9iaXRzKGRhNzIxOS0+cmVnbWFwLCBEQTcyMTlfQUNDREVUX0NPTkZJR18xLAorCQkJICBEQTcyMTlfQUNDREVUX0VOX01BU0ssIDApOworCXJlZ21hcF93cml0ZV9iaXRzKGRhNzIxOS0+cmVnbWFwLCBEQTcyMTlfQ0lGX0NUUkwsCisJCQkgIERBNzIxOV9DSUZfUkVHX1NPRlRfUkVTRVRfTUFTSywKKwkJCSAgREE3MjE5X0NJRl9SRUdfU09GVF9SRVNFVF9NQVNLKTsKKwlyZWdtYXBfd3JpdGVfYml0cyhkYTcyMTktPnJlZ21hcCwgREE3MjE5X1NZU1RFTV9BQ1RJVkUsCisJCQkgIERBNzIxOV9TWVNURU1fQUNUSVZFX01BU0ssIDApOworCisJcmVnY2FjaGVfY2FjaGVfYnlwYXNzKGRhNzIxOS0+cmVnbWFwLCBmYWxzZSk7CisKIAlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwgJnNvY19jb2RlY19kZXZfZGE3MjE5LAogCQkJCSAgICAgJmRhNzIxOV9kYWksIDEpOwogCWlmIChyZXQgPCAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS5oIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTkuaAppbmRleCBmZjJhMmYwLi42NmQzYmFkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE5LmgKQEAgLTIyNCw2ICsyMjQsNyBAQAogI2RlZmluZSBEQTcyMTlfUExMX1NSTV9TVEFURV9NQVNLCSgweEYgPDwgMCkKICNkZWZpbmUgREE3MjE5X1BMTF9TUk1fU1RBVFVTX1NISUZUCTQKICNkZWZpbmUgREE3MjE5X1BMTF9TUk1fU1RBVFVTX01BU0sJKDB4RiA8PCA0KQorI2RlZmluZSBEQTcyMTlfUExMX1NSTV9TVFNfTUNMSwkJKDB4MSA8PCA0KQogI2RlZmluZSBEQTcyMTlfUExMX1NSTV9TVFNfU1JNX0xPQ0sJKDB4MSA8PCA3KQogCiAvKiBEQTcyMTlfRElHX1JPVVRJTkdfREFJID0gMHgyQSAqLwpAQCAtNTc2LDYgKzU3Nyw4IEBACiAvKiBEQTcyMTlfR0FJTl9SQU1QX0NUUkwgPSAweDkyICovCiAjZGVmaW5lIERBNzIxOV9HQUlOX1JBTVBfUkFURV9TSElGVAkwCiAjZGVmaW5lIERBNzIxOV9HQUlOX1JBTVBfUkFURV9NQVNLCSgweDMgPDwgMCkKKyNkZWZpbmUgREE3MjE5X0dBSU5fUkFNUF9SQVRFX1g4CSgweDAgPDwgMCkKKyNkZWZpbmUgREE3MjE5X0dBSU5fUkFNUF9SQVRFX05PTUlOQUwJKDB4MSA8PCAwKQogI2RlZmluZSBEQTcyMTlfR0FJTl9SQU1QX1JBVEVfTUFYCTQKIAogLyogREE3MjE5X1BDX0NPVU5UID0gMHg5NCAqLwpAQCAtNzcwLDYgKzc3MywxMCBAQAogLyogU1JNICovCiAjZGVmaW5lIERBNzIxOV9TUk1fQ0hFQ0tfUkVUUklFUwk4CiAKKy8qIFN5c3RlbSBDb250cm9sbGVyICovCisjZGVmaW5lIERBNzIxOV9TWVNfU1RBVF9DSEVDS19SRVRSSUVTCTYKKyNkZWZpbmUgREE3MjE5X1NZU19TVEFUX0NIRUNLX0RFTEFZCTUwCisKIGVudW0gZGE3MjE5X2Nsa19zcmMgewogCURBNzIxOV9DTEtTUkNfTUNMSyA9IDAsCiAJREE3MjE5X0NMS1NSQ19NQ0xLX1NRUiwKQEAgLTc5Niw2ICs4MDMsNyBAQAogCXN0cnVjdCBkYTcyMTlfYWFkX3ByaXYgKmFhZDsKIAlzdHJ1Y3QgZGE3MjE5X3BkYXRhICpwZGF0YTsKIAorCWJvb2wgd2FrZXVwX3NvdXJjZTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSBzdXBwbGllc1tEQTcyMTlfTlVNX1NVUFBMSUVTXTsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJc3RydWN0IG11dGV4IGxvY2s7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5jIGIvc291bmQvc29jL2NvZGVjcy9kYTczMnguYwppbmRleCA0NjE1MDZhLi5jMWNjMWMxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MzJ4LmMKQEAgLTE1MDEsMTIgKzE1MDEsMTQgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2RhNzMyeCA9IHsKIAkuc2V0X2JpYXNfbGV2ZWwJCT0gZGE3MzJ4X3NldF9iaWFzX2xldmVsLAotCS5jb250cm9scwkJPSBkYTczMnhfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShkYTczMnhfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzCQk9IGRhNzMyeF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGRhNzMyeF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBkYTczMnhfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoZGE3MzJ4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGRhNzMyeF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShkYTczMnhfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBkYTczMnhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoZGE3MzJ4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBkYTczMnhfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhNzMyeF9kYXBtX3JvdXRlcyksCisJfSwKIAkuc2V0X3BsbAkJPSBkYTczMnhfc2V0X2RhaV9wbGwsCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhOTA1NS5jIGIvc291bmQvc29jL2NvZGVjcy9kYTkwNTUuYwppbmRleCAwYjJlZGU4Li40ZWZiNWY4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhOTA1NS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE5MDU1LmMKQEAgLTE0NTUsMTMgKzE0NTUsMTQgQEAKIAkucHJvYmUJCQk9IGRhOTA1NV9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwJCT0gZGE5MDU1X3NldF9iaWFzX2xldmVsLAogCi0JLmNvbnRyb2xzCQk9IGRhOTA1NV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGRhOTA1NV9zbmRfY29udHJvbHMpLAotCi0JLmRhcG1fd2lkZ2V0cwkJPSBkYTkwNTVfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkYTkwNTVfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJCT0gZGE5MDU1X2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShkYTkwNTVfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGRhOTA1NV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShkYTkwNTVfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBkYTkwNTVfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoZGE5MDU1X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBkYTkwNTVfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShkYTkwNTVfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGRhOTA1NV9yZWdtYXBfY29uZmlnID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kbWljLmMgYi9zb3VuZC9zb2MvY29kZWNzL2RtaWMuYwppbmRleCBmZGU1MzI1Li5jODJiOWRjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RtaWMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RtaWMuYwpAQCAtNTEsMTAgKzUxLDEyIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19kbWljID0gewotCS5kYXBtX3dpZGdldHMgPSBkbWljX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoZG1pY19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGludGVyY29uKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSBkbWljX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGRtaWNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShpbnRlcmNvbiksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgZG1pY19kZXZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvZXM4MzI4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2VzODMyOC5jCmluZGV4IDIwODZkNzEuLjM3NzIyMTk0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2VzODMyOC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZXM4MzI4LmMKQEAgLTgyMywxMiArODIzLDE0IEBACiAJLnNldF9iaWFzX2xldmVsCSAgPSBlczgzMjhfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzCSAgPSBlczgzMjhfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJICA9IEFSUkFZX1NJWkUoZXM4MzI4X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cwkgID0gZXM4MzI4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoZXM4MzI4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCSAgPSBlczgzMjhfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyAgPSBBUlJBWV9TSVpFKGVzODMyOF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBlczgzMjhfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoZXM4MzI4X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gZXM4MzI4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGVzODMyOF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gZXM4MzI4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShlczgzMjhfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBpbnQgZXM4MzI4X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlZ21hcCAqcmVnbWFwKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ndG02MDEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvZ3RtNjAxLmMKaW5kZXggMGI4MDA1Mi4uOTI2YjFhNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ndG02MDEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2d0bTYwMS5jCkBAIC01MiwxMCArNTIsMTIgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9ndG02MDEgPSB7Ci0JLmRhcG1fd2lkZ2V0cyA9IGd0bTYwMV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGd0bTYwMV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGd0bTYwMV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShndG02MDFfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IGd0bTYwMV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShndG02MDFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGd0bTYwMV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoZ3RtNjAxX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBndG02MDFfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvaGRhY19oZG1pLmMgYi9zb3VuZC9zb2MvY29kZWNzL2hkYWNfaGRtaS5jCmluZGV4IDRlMTgxYjIuLmM2MDJjNDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvaGRhY19oZG1pLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9oZGFjX2hkbWkuYwpAQCAtNjE0LDcgKzYxNCw3IEBACiAJCQkoIXBpbi0+ZWxkLmVsZF92YWxpZCkpIHsKIAogCQlkZXZfd2FybigmaGRhYy0+aGRhYy5kZXYsCi0JCQkiRmFpbGVkOiBtb250aW9yIHByZXNlbnQ/ICVkIEVMRCB2YWxpZD86ICVkIGZvciBwaW46ICVkXG4iLAorCQkJIkZhaWxlZDogbW9uaXRvciBwcmVzZW50PyAlZCBFTEQgdmFsaWQ/OiAlZCBmb3IgcGluOiAlZFxuIiwKIAkJCXBpbi0+ZWxkLm1vbml0b3JfcHJlc2VudCwgcGluLT5lbGQuZWxkX3ZhbGlkLCBwaW4tPm5pZCk7CiAKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2hkbWktY29kZWMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvaGRtaS1jb2RlYy5jCmluZGV4IGYyN2QxMTUuLmI5MDQ0OTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvaGRtaS1jb2RlYy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvaGRtaS1jb2RlYy5jCkBAIC0yNCw2ICsyNCwxNSBAQAogCiAjaW5jbHVkZSA8ZHJtL2RybV9jcnRjLmg+IC8qIFRoaXMgaXMgb25seSB0byBnZXQgTUFYX0VMRF9CWVRFUyAqLwogCitzdHJ1Y3QgaGRtaV9kZXZpY2UgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJaW50IGNudDsKK307CisjZGVmaW5lIHBvc190b19oZG1pX2RldmljZShwb3MpCWNvbnRhaW5lcl9vZigocG9zKSwgc3RydWN0IGhkbWlfZGV2aWNlLCBsaXN0KQorTElTVF9IRUFEKGhkbWlfZGV2aWNlX2xpc3QpOworCisjZGVmaW5lIERBSV9OQU1FX1NJWkUgMTYKIHN0cnVjdCBoZG1pX2NvZGVjX3ByaXYgewogCXN0cnVjdCBoZG1pX2NvZGVjX3BkYXRhIGhjZDsKIAlzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyICpkYWlkcnY7CkBAIC0zMjAsNyArMzI5LDYgQEAKIAkJCSBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzMyX0JFKQogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBoZG1pX2kyc19kYWkgPSB7Ci0JLm5hbWUgPSAiaTJzLWhpZmkiLAogCS5pZCA9IERBSV9JRF9JMlMsCiAJLnBsYXliYWNrID0gewogCQkuc3RyZWFtX25hbWUgPSAiUGxheWJhY2siLApAQCAtMzM0LDcgKzM0Miw2IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBoZG1pX3NwZGlmX2RhaSA9IHsKLQkubmFtZSA9ICJzcGRpZi1oaWZpIiwKIAkuaWQgPSBEQUlfSURfU1BESUYsCiAJLnBsYXliYWNrID0gewogCQkuc3RyZWFtX25hbWUgPSAiUGxheWJhY2siLApAQCAtMzQ2LDEzICszNTMsMzcgQEAKIAkub3BzID0gJmhkbWlfZGFpX29wcywKIH07CiAKK3N0YXRpYyBjaGFyIGhkbWlfZGFpX25hbWVbXVtEQUlfTkFNRV9TSVpFXSA9IHsKKwkiaGRtaS1oaWZpLjAiLAorCSJoZG1pLWhpZmkuMSIsCisJImhkbWktaGlmaS4yIiwKKwkiaGRtaS1oaWZpLjMiLAorfTsKKworc3RhdGljIGludCBoZG1pX29mX3hsYXRlX2RhaV9uYW1lKHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50LAorCQkJCSAgc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqYXJncywKKwkJCQkgIGNvbnN0IGNoYXIgKipkYWlfbmFtZSkKK3sKKwlpbnQgaWQgPSBhcmdzLT5hcmdzWzBdOworCisJaWYgKGlkIDwgQVJSQVlfU0laRShoZG1pX2RhaV9uYW1lKSkgeworCQkqZGFpX25hbWUgPSBoZG1pX2RhaV9uYW1lW2lkXTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FQUdBSU47Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgaGRtaV9jb2RlYyA9IHsKLQkuY29udHJvbHMgPSBoZG1pX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGhkbWlfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBoZG1pX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGhkbWlfd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gaGRtaV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoaGRtaV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gaGRtaV9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGhkbWlfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGhkbWlfd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGhkbWlfd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBoZG1pX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoaGRtaV9yb3V0ZXMpLAorCQkub2ZfeGxhdGVfZGFpX25hbWUJPSBoZG1pX29mX3hsYXRlX2RhaV9uYW1lLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGhkbWlfY29kZWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTM2MCw2ICszOTEsOCBAQAogCXN0cnVjdCBoZG1pX2NvZGVjX3BkYXRhICpoY2QgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwogCXN0cnVjdCBoZG1pX2NvZGVjX3ByaXYgKmhjcDsKKwlzdHJ1Y3QgaGRtaV9kZXZpY2UgKmhkOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKIAlpbnQgZGFpX2NvdW50LCBpID0gMDsKIAlpbnQgcmV0OwogCkBAIC0zODEsNiArNDE0LDMxIEBACiAJaWYgKCFoY3ApCiAJCXJldHVybiAtRU5PTUVNOwogCisJaGQgPSBOVUxMOworCWxpc3RfZm9yX2VhY2gocG9zLCAmaGRtaV9kZXZpY2VfbGlzdCkgeworCQlzdHJ1Y3QgaGRtaV9kZXZpY2UgKnRtcCA9IHBvc190b19oZG1pX2RldmljZShwb3MpOworCisJCWlmICh0bXAtPmRldiA9PSBkZXYtPnBhcmVudCkgeworCQkJaGQgPSB0bXA7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghaGQpIHsKKwkJaGQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmhkKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaGQpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQloZC0+ZGV2ID0gZGV2LT5wYXJlbnQ7CisKKwkJbGlzdF9hZGRfdGFpbCgmaGQtPmxpc3QsICZoZG1pX2RldmljZV9saXN0KTsKKwl9CisKKwlpZiAoaGQtPmNudCA+PSBBUlJBWV9TSVpFKGhkbWlfZGFpX25hbWUpKSB7CisJCWRldl9lcnIoZGV2LCAidG9vIG1hbnkgaGRtaSBjb2RlYyBhcmUgZGV0ZWNlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWhjcC0+aGNkID0gKmhjZDsKIAltdXRleF9pbml0KCZoY3AtPmN1cnJlbnRfc3RyZWFtX2xvY2spOwogCkBAIC0zOTMsMTEgKzQ1MSwxNCBAQAogCQloY3AtPmRhaWRydltpXSA9IGhkbWlfaTJzX2RhaTsKIAkJaGNwLT5kYWlkcnZbaV0ucGxheWJhY2suY2hhbm5lbHNfbWF4ID0KIAkJCWhjZC0+bWF4X2kyc19jaGFubmVsczsKKwkJaGNwLT5kYWlkcnZbaV0ubmFtZSA9IGhkbWlfZGFpX25hbWVbaGQtPmNudCsrXTsKIAkJaSsrOwogCX0KIAotCWlmIChoY2QtPnNwZGlmKQorCWlmIChoY2QtPnNwZGlmKSB7CiAJCWhjcC0+ZGFpZHJ2W2ldID0gaGRtaV9zcGRpZl9kYWk7CisJCWhjcC0+ZGFpZHJ2W2ldLm5hbWUgPSBoZG1pX2RhaV9uYW1lW2hkLT5jbnQrK107CisJfQogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYyhkZXYsICZoZG1pX2NvZGVjLCBoY3AtPmRhaWRydiwKIAkJCQkgICAgIGRhaV9jb3VudCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2lubm9fcmszMDM2LmMgYi9zb3VuZC9zb2MvY29kZWNzL2lubm9fcmszMDM2LmMKaW5kZXggOWI2ZTg4NC4uYjkxOGJhNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9pbm5vX3JrMzAzNi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvaW5ub19yazMwMzYuYwpAQCAtMzgwLDEyICszODAsMTQgQEAKIAkucHJvYmUJCQk9IHJrMzAzNl9jb2RlY19wcm9iZSwKIAkucmVtb3ZlCQkJPSByazMwMzZfY29kZWNfcmVtb3ZlLAogCS5zZXRfYmlhc19sZXZlbAkJPSByazMwMzZfY29kZWNfc2V0X2JpYXNfbGV2ZWwsCi0JLmNvbnRyb2xzCQk9IHJrMzAzNl9jb2RlY19kYXBtX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShyazMwMzZfY29kZWNfZGFwbV9jb250cm9scyksCi0JLmRhcG1fcm91dGVzCQk9IHJrMzAzNl9jb2RlY19kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShyazMwMzZfY29kZWNfZGFwbV9yb3V0ZXMpLAotCS5kYXBtX3dpZGdldHMJCT0gcmszMDM2X2NvZGVjX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocmszMDM2X2NvZGVjX2RhcG1fd2lkZ2V0cyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSByazMwMzZfY29kZWNfZGFwbV9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHJrMzAzNl9jb2RlY19kYXBtX2NvbnRyb2xzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHJrMzAzNl9jb2RlY19kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocmszMDM2X2NvZGVjX2RhcG1fcm91dGVzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSByazMwMzZfY29kZWNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocmszMDM2X2NvZGVjX2RhcG1fd2lkZ2V0cyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyByazMwMzZfY29kZWNfcmVnbWFwX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvaXNhYmVsbGUuYyBiL3NvdW5kL3NvYy9jb2RlY3MvaXNhYmVsbGUuYwppbmRleCBiZTQ0ODM3Li5hNGIwZWRlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2lzYWJlbGxlLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9pc2FiZWxsZS5jCkBAIC0xMDg5LDEyICsxMDg5LDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9pc2FiZWxsZSA9IHsKIAkuc2V0X2JpYXNfbGV2ZWwgPSBpc2FiZWxsZV9zZXRfYmlhc19sZXZlbCwKLQkuY29udHJvbHMgPSBpc2FiZWxsZV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoaXNhYmVsbGVfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gaXNhYmVsbGVfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShpc2FiZWxsZV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGlzYWJlbGxlX2ludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGlzYWJlbGxlX2ludGVyY29uKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGlzYWJlbGxlX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGlzYWJlbGxlX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gaXNhYmVsbGVfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoaXNhYmVsbGVfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGlzYWJlbGxlX2ludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShpc2FiZWxsZV9pbnRlcmNvbiksCisJfSwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2p6NDc0MC5jIGIvc291bmQvc29jL2NvZGVjcy9qejQ3NDAuYwppbmRleCAxZjVhYjk5Li4wMjkwZmFiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2p6NDc0MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvano0NzQwLmMKQEAgLTI5OCwxMiArMjk4LDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gano0NzQwX2NvZGVjX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IGp6NDc0MF9jb2RlY19jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShqejQ3NDBfY29kZWNfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBqejQ3NDBfY29kZWNfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShqejQ3NDBfY29kZWNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBqejQ3NDBfY29kZWNfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoano0NzQwX2NvZGVjX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGp6NDc0MF9jb2RlY19jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGp6NDc0MF9jb2RlY19jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gano0NzQwX2NvZGVjX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGp6NDc0MF9jb2RlY19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gano0NzQwX2NvZGVjX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShqejQ3NDBfY29kZWNfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgano0NzQwX2NvZGVjX3JlZ21hcF9jb25maWcgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2wzLmMgYi9zb3VuZC9zb2MvY29kZWNzL2wzLmMKaW5kZXggNTM1M2FmNS4uYTEwZWEzYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9sMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbDMuYwpAQCAtMjAsNiArMjAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAjaW5jbHVkZSA8c291bmQvbDMuaD4KIApAQCAtMzIsMTEgKzM0LDExIEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWFkYXAtPnNldGNsaygwKTsKKwkJYWRhcC0+c2V0Y2xrKGFkYXAsIDApOwogCQl1ZGVsYXkoYWRhcC0+ZGF0YV9ob2xkKTsKLQkJYWRhcC0+c2V0ZGF0KGJ5dGUgJiAxKTsKKwkJYWRhcC0+c2V0ZGF0KGFkYXAsIGJ5dGUgJiAxKTsKIAkJdWRlbGF5KGFkYXAtPmRhdGFfc2V0dXApOwotCQlhZGFwLT5zZXRjbGsoMSk7CisJCWFkYXAtPnNldGNsayhhZGFwLCAxKTsKIAkJdWRlbGF5KGFkYXAtPmNsb2NrX2hpZ2gpOwogCQlieXRlID4+PSAxOwogCX0KQEAgLTU1LDEwICs1NywxMCBAQAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogCQlpZiAoaSkgewogCQkJdWRlbGF5KGFkYXAtPm1vZGVfaG9sZCk7Ci0JCQlhZGFwLT5zZXRtb2RlKDApOworCQkJYWRhcC0+c2V0bW9kZShhZGFwLCAwKTsKIAkJCXVkZWxheShhZGFwLT5tb2RlKTsKIAkJfQotCQlhZGFwLT5zZXRtb2RlKDEpOworCQlhZGFwLT5zZXRtb2RlKGFkYXAsIDEpOwogCQl1ZGVsYXkoYWRhcC0+bW9kZV9zZXR1cCk7CiAJCXNlbmRieXRlKGFkYXAsIGJ1ZltpXSk7CiAJfQpAQCAtNjYsMjYgKzY4LDcxIEBACiAKIGludCBsM193cml0ZShzdHJ1Y3QgbDNfcGlucyAqYWRhcCwgdTggYWRkciwgdTggKmRhdGEsIGludCBsZW4pCiB7Ci0JYWRhcC0+c2V0Y2xrKDEpOwotCWFkYXAtPnNldGRhdCgxKTsKLQlhZGFwLT5zZXRtb2RlKDEpOworCWFkYXAtPnNldGNsayhhZGFwLCAxKTsKKwlhZGFwLT5zZXRkYXQoYWRhcCwgMSk7CisJYWRhcC0+c2V0bW9kZShhZGFwLCAxKTsKIAl1ZGVsYXkoYWRhcC0+bW9kZSk7CiAKLQlhZGFwLT5zZXRtb2RlKDApOworCWFkYXAtPnNldG1vZGUoYWRhcCwgMCk7CiAJdWRlbGF5KGFkYXAtPm1vZGVfc2V0dXApOwogCXNlbmRieXRlKGFkYXAsIGFkZHIpOwogCXVkZWxheShhZGFwLT5tb2RlX2hvbGQpOwogCiAJc2VuZGJ5dGVzKGFkYXAsIGRhdGEsIGxlbik7CiAKLQlhZGFwLT5zZXRjbGsoMSk7Ci0JYWRhcC0+c2V0ZGF0KDEpOwotCWFkYXAtPnNldG1vZGUoMCk7CisJYWRhcC0+c2V0Y2xrKGFkYXAsIDEpOworCWFkYXAtPnNldGRhdChhZGFwLCAxKTsKKwlhZGFwLT5zZXRtb2RlKGFkYXAsIDApOwogCiAJcmV0dXJuIGxlbjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGwzX3dyaXRlKTsKIAorCitzdGF0aWMgdm9pZCBsM19zZXRfY2xrKHN0cnVjdCBsM19waW5zICphZGFwLCBpbnQgdmFsKQoreworCWdwaW9fc2V0X3ZhbHVlKGFkYXAtPmdwaW9fY2xrLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBsM19zZXRfZGF0YShzdHJ1Y3QgbDNfcGlucyAqYWRhcCwgaW50IHZhbCkKK3sKKwlncGlvX3NldF92YWx1ZShhZGFwLT5ncGlvX2RhdGEsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGwzX3NldF9tb2RlKHN0cnVjdCBsM19waW5zICphZGFwLCBpbnQgdmFsKQoreworCWdwaW9fc2V0X3ZhbHVlKGFkYXAtPmdwaW9fbW9kZSwgdmFsKTsKK30KKworaW50IGwzX3NldF9ncGlvX29wcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBsM19waW5zICphZGFwKQoreworCWludCByZXQ7CisKKwlpZiAoIWFkYXAtPnVzZV9ncGlvcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoZGV2LCBhZGFwLT5ncGlvX2RhdGEsCisJCQkJR1BJT0ZfT1VUX0lOSVRfTE9XLCAibDNfZGF0YSIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWFkYXAtPnNldGRhdCA9IGwzX3NldF9kYXRhOworCisJcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKGRldiwgYWRhcC0+Z3Bpb19jbGssCisJCQkJR1BJT0ZfT1VUX0lOSVRfTE9XLCAibDNfY2xrIik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJYWRhcC0+c2V0Y2xrID0gbDNfc2V0X2NsazsKKworCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZShkZXYsIGFkYXAtPmdwaW9fbW9kZSwKKwkJCQlHUElPRl9PVVRfSU5JVF9MT1csICJsM19tb2RlIik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJYWRhcC0+c2V0bW9kZSA9IGwzX3NldF9tb2RlOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChsM19zZXRfZ3Bpb19vcHMpOworCiBNT0RVTEVfREVTQ1JJUFRJT04oIkwzIGJpdC1iYW5naW5nIGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiQ2hyaXN0aWFuIFBlbGxlZ3JpbiA8Y2hyaXBlbGxAZXZvbHdhcmUub3JnPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9sbTQ5NDUzLmMgYi9zb3VuZC9zb2MvY29kZWNzL2xtNDk0NTMuYwppbmRleCA5YWY1NjQwLi44ZDQxM2MyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2xtNDk0NTMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2xtNDk0NTMuYwpAQCAtMTM5MSwxMiArMTM5MSwxNCBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfbG00OTQ1MyA9IHsKIAkuc2V0X2JpYXNfbGV2ZWwgPSBsbTQ5NDUzX3NldF9iaWFzX2xldmVsLAotCS5jb250cm9scyA9IGxtNDk0NTNfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGxtNDk0NTNfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gbG00OTQ1M19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGxtNDk0NTNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBsbTQ5NDUzX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShsbTQ5NDUzX2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBsbTQ5NDUzX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGxtNDk0NTNfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBsbTQ5NDUzX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGxtNDk0NTNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGxtNDk0NTNfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShsbTQ5NDUzX2F1ZGlvX21hcCksCisJfSwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MDg4LmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDg4LmMKaW5kZXggZmMyMjgwNC4uNzJmNzc0NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA4OC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwODguYwpAQCAtMTcwNCwxMiArMTcwNCwxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IG1heDk4MDg4X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IG1heDk4MDg4X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShtYXg5ODA4OF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBtYXg5ODA4OF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1heDk4MDg4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gbWF4OTgwODhfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKG1heDk4MDg4X2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBtYXg5ODA4OF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShtYXg5ODA4OF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IG1heDk4MDg4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKG1heDk4MDg4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBtYXg5ODA4OF9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKG1heDk4MDg4X2F1ZGlvX21hcCksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgbWF4OTgwODhfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MDk1LmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDk1LmMKaW5kZXggMzU3NzAwMy4uNmY4YTc1NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5NS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTUuYwpAQCAtMjEwOCwxMiArMjEwOCwxNCBAQAogCS5zdXNwZW5kID0gbWF4OTgwOTVfc3VzcGVuZCwKIAkucmVzdW1lICA9IG1heDk4MDk1X3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBtYXg5ODA5NV9zZXRfYmlhc19sZXZlbCwKLQkuY29udHJvbHMgPSBtYXg5ODA5NV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobWF4OTgwOTVfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzCSAgPSBtYXg5ODA5NV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1heDk4MDk1X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzICAgICA9IG1heDk4MDk1X2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShtYXg5ODA5NV9hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gbWF4OTgwOTVfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUobWF4OTgwOTVfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBtYXg5ODA5NV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShtYXg5ODA5NV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gbWF4OTgwOTVfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShtYXg5ODA5NV9hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IG1heDk4MDk1X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODM1N2EuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgzNTdhLmMKaW5kZXggNWIxZGZiMS4uNmE2YjY4YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODM1N2EuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MzU3YS5jCkBAIC03NCwxMCArNzQsMTIgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBtYXg5ODM1N2FfY29kZWNfZHJpdmVyID0gewogCS5wcm9iZQkJCT0gbWF4OTgzNTdhX2NvZGVjX3Byb2JlLAotCS5kYXBtX3dpZGdldHMJCT0gbWF4OTgzNTdhX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUobWF4OTgzNTdhX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCQk9IG1heDk4MzU3YV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShtYXg5ODM1N2FfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IG1heDk4MzU3YV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShtYXg5ODM1N2FfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IG1heDk4MzU3YV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUobWF4OTgzNTdhX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgbWF4OTgzNTdhX2RhaV9vcHMgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MzcxLmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MzcxLmMKaW5kZXggY2YwYTM5Yi4uNzgxYmU5YmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgzNzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MzcxLmMKQEAgLTQxMiw2ICs0MTIsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbWF4OTgzNzFfaTJjX2lkW10gPSB7CiAJeyAibWF4OTgzNzEiLCAwIH0sCisJeyB9CiB9OwogCiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbWF4OTgzNzFfaTJjX2lkKTsKQEAgLTQyNSw3ICs0MjYsNiBAQAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1heDk4MzcxX2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAibWF4OTgzNzEiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAkJLnBtID0gTlVMTCwKIAkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKG1heDk4MzcxX29mX21hdGNoKSwKIAl9LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODUwLmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4NTAuYwppbmRleCBjMTRhNzlkLi4wNjEwODQwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21heDk4NTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4NTAuYwpAQCAtMzA2LDEyICszMDYsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSBtYXg5ODUwX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IG1heDk4NTBfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobWF4OTg1MF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IG1heDk4NTBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShtYXg5ODUwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gbWF4OTg1MF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShtYXg5ODUwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IG1heDk4NTBfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShtYXg5ODUwX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBtYXg5ODUwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKG1heDk4NTBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IG1heDk4NTBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKG1heDk4NTBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IG1heDk4NTBfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4NjAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg2MC5jCmluZGV4IDY4MDc0YzkuLjQ5OWJkYmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg2MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg2MC5jCkBAIC01MzgsMTIgKzUzOCwxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IG1heDk4NjBfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gbWF4OTg2MF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShtYXg5ODYwX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gbWF4OTg2MF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1heDk4NjBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBtYXg5ODYwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKG1heDk4NjBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gbWF4OTg2MF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG1heDk4NjBfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IG1heDk4NjBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUobWF4OTg2MF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gbWF4OTg2MF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUobWF4OTg2MF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKICNpZmRlZiBDT05GSUdfUE0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg2Ny5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODY3LmMKaW5kZXggMmEyMmZkZC4uNDJlMmU0MCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODY3LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODY3LmMKQEAgLTM4LDExICszOCwxMCBAQAogc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKG1heDk4NjBfbWljX3RsdiwgMjAwMCwgMTAwLCAxKTsKIHN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShtYXg5ODYwX2FkY19sZWZ0X3RsdiwgLTEyMDAsIDEwMCwgMSk7CiBzdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUobWF4OTg2MF9hZGNfcmlnaHRfdGx2LCAtMTIwMCwgMTAwLCAxKTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbWF4OTgwODhfbWljYm9vc3RfdGx2W10gPSB7Ci0JVExWX0RCX1JBTkdFX0hFQUQoMiksCitzdGF0aWMgY29uc3QgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9SQU5HRShtYXg5ODA4OF9taWNib29zdF90bHYsCiAJMCwgMSwgVExWX0RCX1NDQUxFX0lURU0oMCwgMjAwMCwgMCksCiAJMiwgMiwgVExWX0RCX1NDQUxFX0lURU0oMzAwMCwgMCwgMCksCi19OworKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4Njdfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX0RPVUJMRV9SKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgTUFYOTg2N19MRUZUVk9MLApAQCAtNDE3LDEyICs0MTYsMTQgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBtYXg5ODY3X2NvZGVjID0gewogCS5wcm9iZSA9IG1heDk4NjdfcHJvYmUsCi0JLmNvbnRyb2xzID0gbWF4OTg2N19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobWF4OTg2N19zbmRfY29udHJvbHMpLAotCS5kYXBtX3JvdXRlcyA9IG1heDk4NjdfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKG1heDk4NjdfYXVkaW9fbWFwKSwKLQkuZGFwbV93aWRnZXRzID0gbWF4OTg2N19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1heDk4NjdfZGFwbV93aWRnZXRzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IG1heDk4Njdfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUobWF4OTg2N19zbmRfY29udHJvbHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gbWF4OTg2N19hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKG1heDk4NjdfYXVkaW9fbWFwKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBtYXg5ODY3X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKG1heDk4NjdfZGFwbV93aWRnZXRzKSwKKwl9LAogfTsKIAogc3RhdGljIGJvb2wgbWF4OTg2N192b2xhdGlsZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4OTI1LmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4OTI1LmMKaW5kZXggNTk5MGRlMy4uMzI3ZWFhMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODkyNS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg5MjUuYwpAQCAtNTQwLDEyICs1NDAsMTQgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X21heDk4OTI1ID0gewogCS5wcm9iZSAgICAgICAgICAgID0gbWF4OTg5MjVfcHJvYmUsCi0JLmNvbnRyb2xzID0gbWF4OTg5MjVfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKG1heDk4OTI1X3NuZF9jb250cm9scyksCi0JLmRhcG1fcm91dGVzID0gbWF4OTg5MjVfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKG1heDk4OTI1X2F1ZGlvX21hcCksCi0JLmRhcG1fd2lkZ2V0cyA9IG1heDk4OTI1X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUobWF4OTg5MjVfZGFwbV93aWRnZXRzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IG1heDk4OTI1X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG1heDk4OTI1X3NuZF9jb250cm9scyksCisJCS5kYXBtX3JvdXRlcwkJPSBtYXg5ODkyNV9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKG1heDk4OTI1X2F1ZGlvX21hcCksCisJCS5kYXBtX3dpZGdldHMJCT0gbWF4OTg5MjVfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUobWF4OTg5MjVfZGFwbV93aWRnZXRzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIG1heDk4OTI1X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg5MjYuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg5MjYuYwppbmRleCA4ZDE0YWRhLi4xZWZmN2UwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21heDk4OTI2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODkyNi5jCkBAIC0zNDcsNyArMzQ3LDcgQEAKIAkJbWF4OTg5MjZfc2V0X3NlbnNlX2RhdGEobWF4OTg5MjYpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJEQUkgY2xvY2sgbW9kZSB1bnN1cHBvcnRlZCIpOworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJEQUkgY2xvY2sgbW9kZSB1bnN1cHBvcnRlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMzY0LDcgKzM2NCw3IEBACiAJCWludmVydCA9IE1BWDk4OTI2X0RBSV9CQ0lfTUFTSyB8IE1BWDk4OTI2X0RBSV9XQ0lfTUFTSzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiREFJIGludmVydCBtb2RlIHVuc3VwcG9ydGVkIik7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkRBSSBpbnZlcnQgbW9kZSB1bnN1cHBvcnRlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDA4LDcgKzQwOCw3IEBACiAJCW1heDk4OTI2LT5jaF9zaXplID0gMzI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgImZvcm1hdCB1bnN1cHBvcnRlZCAlZCIsCisJCWRldl9kYmcoY29kZWMtPmRldiwgImZvcm1hdCB1bnN1cHBvcnRlZCAlZFxuIiwKIAkJCXBhcmFtc19mb3JtYXQocGFyYW1zKSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTQ5OCwxMiArNDk4LDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9tYXg5ODkyNiA9IHsKIAkucHJvYmUJPSBtYXg5ODkyNl9wcm9iZSwKLQkuY29udHJvbHMgPSBtYXg5ODkyNl9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobWF4OTg5MjZfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV9yb3V0ZXMgPSBtYXg5ODkyNl9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUobWF4OTg5MjZfYXVkaW9fbWFwKSwKLQkuZGFwbV93aWRnZXRzID0gbWF4OTg5MjZfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShtYXg5ODkyNl9kYXBtX3dpZGdldHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gbWF4OTg5MjZfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUobWF4OTg5MjZfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fcm91dGVzCQk9IG1heDk4OTI2X2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUobWF4OTg5MjZfYXVkaW9fbWFwKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBtYXg5ODkyNl9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShtYXg5ODkyNl9kYXBtX3dpZGdldHMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgbWF4OTg5MjZfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYzEzNzgzLmMgYi9zb3VuZC9zb2MvY29kZWNzL21jMTM3ODMuYwppbmRleCAzZTc3MGNiLi45MDU2MjcwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21jMTM3ODMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21jMTM3ODMuYwpAQCAtNzM3LDEyICs3MzcsMTQgQEAKIAkucHJvYmUJCT0gbWMxMzc4M19wcm9iZSwKIAkucmVtb3ZlCQk9IG1jMTM3ODNfcmVtb3ZlLAogCS5nZXRfcmVnbWFwCT0gbWMxMzc4M19nZXRfcmVnbWFwLAotCS5jb250cm9scwk9IG1jMTM3ODNfY29udHJvbF9saXN0LAotCS5udW1fY29udHJvbHMJPSBBUlJBWV9TSVpFKG1jMTM3ODNfY29udHJvbF9saXN0KSwKLQkuZGFwbV93aWRnZXRzCT0gbWMxMzc4M19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1jMTM3ODNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJPSBtYzEzNzgzX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShtYzEzNzgzX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBtYzEzNzgzX2NvbnRyb2xfbGlzdCwKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG1jMTM3ODNfY29udHJvbF9saXN0KSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBtYzEzNzgzX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKG1jMTM3ODNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IG1jMTM3ODNfcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShtYzEzNzgzX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG1jMTM3ODNfY29kZWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWwyNjEyNC5jIGIvc291bmQvc29jL2NvZGVjcy9tbDI2MTI0LmMKaW5kZXggZjU2MWM3OC4uNjllNWUxOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tbDI2MTI0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tbDI2MTI0LmMKQEAgLTU0MSwxMiArNTQxLDE0IEBACiAJLnByb2JlID0JbWwyNjEyNF9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBtbDI2MTI0X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKLQkuZGFwbV93aWRnZXRzID0gbWwyNjEyNF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1sMjYxMjRfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBtbDI2MTI0X2ludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKG1sMjYxMjRfaW50ZXJjb24pLAotCS5jb250cm9scyA9IG1sMjYxMjRfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKG1sMjYxMjRfc25kX2NvbnRyb2xzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IG1sMjYxMjRfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUobWwyNjEyNF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IG1sMjYxMjRfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUobWwyNjEyNF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gbWwyNjEyNF9pbnRlcmNvbiwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUobWwyNjEyNF9pbnRlcmNvbiksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBtbDI2MTI0X2kyY19yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL25hdTg4MTAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbmF1ODgxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NTUxODYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL25hdTg4MTAuYwpAQCAtMCwwICsxLDg4NCBAQAorLyoKKyAqIG5hdTg4MTAuYyAgLS0gIE5BVTg4MTAgQUxTQSBTb2MgQXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTYgTnV2b3RvbiBUZWNobm9sb2d5IENvcnAuCisgKgorICogQXV0aG9yOiBEYXZpZCBMaW4gPGN0bGluMEBudXZvdG9uLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBXTTg5NzQuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisKKyNpbmNsdWRlICJuYXU4ODEwLmgiCisKKyNkZWZpbmUgTkFVX1BMTF9GUkVRX01BWCAxMDAwMDAwMDAKKyNkZWZpbmUgTkFVX1BMTF9GUkVRX01JTiA5MDAwMDAwMAorI2RlZmluZSBOQVVfUExMX1JFRl9NQVggMzMwMDAwMDAKKyNkZWZpbmUgTkFVX1BMTF9SRUZfTUlOIDgwMDAwMDAKKyNkZWZpbmUgTkFVX1BMTF9PUFRPUF9NSU4gNgorCisKK3N0YXRpYyBjb25zdCBpbnQgbmF1ODgxMF9tY2xrX3NjYWxlcltdID0geyAxMCwgMTUsIDIwLCAzMCwgNDAsIDYwLCA4MCwgMTIwIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgbmF1ODgxMF9yZWdfZGVmYXVsdHNbXSA9IHsKKwl7IE5BVTg4MTBfUkVHX1BPV0VSMSwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19QT1dFUjIsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfUE9XRVIzLCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX0lGQUNFLCAweDAwNTAgfSwKKwl7IE5BVTg4MTBfUkVHX0NPTVAsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfQ0xPQ0ssIDB4MDE0MCB9LAorCXsgTkFVODgxMF9SRUdfU01QTFIsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfREFDLCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX0RBQ0dBSU4sIDB4MDBGRiB9LAorCXsgTkFVODgxMF9SRUdfQURDLCAweDAxMDAgfSwKKwl7IE5BVTg4MTBfUkVHX0FEQ0dBSU4sIDB4MDBGRiB9LAorCXsgTkFVODgxMF9SRUdfRVExLCAweDAxMkMgfSwKKwl7IE5BVTg4MTBfUkVHX0VRMiwgMHgwMDJDIH0sCisJeyBOQVU4ODEwX1JFR19FUTMsIDB4MDAyQyB9LAorCXsgTkFVODgxMF9SRUdfRVE0LCAweDAwMkMgfSwKKwl7IE5BVTg4MTBfUkVHX0VRNSwgMHgwMDJDIH0sCisJeyBOQVU4ODEwX1JFR19EQUNMSU0xLCAweDAwMzIgfSwKKwl7IE5BVTg4MTBfUkVHX0RBQ0xJTTIsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfTk9UQ0gxLCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX05PVENIMiwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19OT1RDSDMsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfTk9UQ0g0LCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX0FMQzEsIDB4MDAzOCB9LAorCXsgTkFVODgxMF9SRUdfQUxDMiwgMHgwMDBCIH0sCisJeyBOQVU4ODEwX1JFR19BTEMzLCAweDAwMzIgfSwKKwl7IE5BVTg4MTBfUkVHX05PSVNFR0FURSwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19QTExOLCAweDAwMDggfSwKKwl7IE5BVTg4MTBfUkVHX1BMTEsxLCAweDAwMEMgfSwKKwl7IE5BVTg4MTBfUkVHX1BMTEsyLCAweDAwOTMgfSwKKwl7IE5BVTg4MTBfUkVHX1BMTEszLCAweDAwRTkgfSwKKwl7IE5BVTg4MTBfUkVHX0FUVEVOLCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX0lOUFVUX1NJR05BTCwgMHgwMDAzIH0sCisJeyBOQVU4ODEwX1JFR19QR0FHQUlOLCAweDAwMTAgfSwKKwl7IE5BVTg4MTBfUkVHX0FEQ0JPT1NULCAweDAxMDAgfSwKKwl7IE5BVTg4MTBfUkVHX09VVFBVVCwgMHgwMDAyIH0sCisJeyBOQVU4ODEwX1JFR19TUEtNSVgsIDB4MDAwMSB9LAorCXsgTkFVODgxMF9SRUdfU1BLR0FJTiwgMHgwMDM5IH0sCisJeyBOQVU4ODEwX1JFR19NT05PTUlYLCAweDAwMDEgfSwKKwl7IE5BVTg4MTBfUkVHX1BPV0VSNCwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19UU0xPVENUTDEsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfVFNMT1RDVEwyLCAweDAwMjAgfSwKKwl7IE5BVTg4MTBfUkVHX0RFVklDRV9SRVZJRCwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19JMkNfREVWSUNFSUQsIDB4MDAxQSB9LAorCXsgTkFVODgxMF9SRUdfQURESVRJT05JRCwgMHgwMENBIH0sCisJeyBOQVU4ODEwX1JFR19SRVNFUlZFLCAweDAxMjQgfSwKKwl7IE5BVTg4MTBfUkVHX09VVENUTCwgMHgwMDAxIH0sCisJeyBOQVU4ODEwX1JFR19BTEMxRU5IQU4xLCAweDAwMTAgfSwKKwl7IE5BVTg4MTBfUkVHX0FMQzFFTkhBTjIsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfTUlTQ0NUTCwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19PVVRUSUVPRkYsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfQUdDUDJQT1VULCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX0FHQ1BPVVQsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfQU1UQ1RMLCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX09VVFRJRU9GRk1BTiwgMHgwMDAwIH0sCit9OworCitzdGF0aWMgYm9vbCBuYXU4ODEwX3JlYWRhYmxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIE5BVTg4MTBfUkVHX1JFU0VUIC4uLiBOQVU4ODEwX1JFR19TTVBMUjoKKwljYXNlIE5BVTg4MTBfUkVHX0RBQyAuLi4gTkFVODgxMF9SRUdfREFDR0FJTjoKKwljYXNlIE5BVTg4MTBfUkVHX0FEQyAuLi4gTkFVODgxMF9SRUdfQURDR0FJTjoKKwljYXNlIE5BVTg4MTBfUkVHX0VRMSAuLi4gTkFVODgxMF9SRUdfRVE1OgorCWNhc2UgTkFVODgxMF9SRUdfREFDTElNMSAuLi4gTkFVODgxMF9SRUdfREFDTElNMjoKKwljYXNlIE5BVTg4MTBfUkVHX05PVENIMSAuLi4gTkFVODgxMF9SRUdfTk9UQ0g0OgorCWNhc2UgTkFVODgxMF9SRUdfQUxDMSAuLi4gTkFVODgxMF9SRUdfQVRURU46CisJY2FzZSBOQVU4ODEwX1JFR19JTlBVVF9TSUdOQUwgLi4uIE5BVTg4MTBfUkVHX1BHQUdBSU46CisJY2FzZSBOQVU4ODEwX1JFR19BRENCT09TVDoKKwljYXNlIE5BVTg4MTBfUkVHX09VVFBVVCAuLi4gTkFVODgxMF9SRUdfU1BLTUlYOgorCWNhc2UgTkFVODgxMF9SRUdfU1BLR0FJTjoKKwljYXNlIE5BVTg4MTBfUkVHX01PTk9NSVg6CisJY2FzZSBOQVU4ODEwX1JFR19QT1dFUjQgLi4uIE5BVTg4MTBfUkVHX1RTTE9UQ1RMMjoKKwljYXNlIE5BVTg4MTBfUkVHX0RFVklDRV9SRVZJRCAuLi4gTkFVODgxMF9SRUdfUkVTRVJWRToKKwljYXNlIE5BVTg4MTBfUkVHX09VVENUTCAuLi4gTkFVODgxMF9SRUdfQUxDMUVOSEFOMjoKKwljYXNlIE5BVTg4MTBfUkVHX01JU0NDVEw6CisJY2FzZSBOQVU4ODEwX1JFR19PVVRUSUVPRkYgLi4uIE5BVTg4MTBfUkVHX09VVFRJRU9GRk1BTjoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIGJvb2wgbmF1ODgxMF93cml0ZWFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTkFVODgxMF9SRUdfUkVTRVQgLi4uIE5BVTg4MTBfUkVHX1NNUExSOgorCWNhc2UgTkFVODgxMF9SRUdfREFDIC4uLiBOQVU4ODEwX1JFR19EQUNHQUlOOgorCWNhc2UgTkFVODgxMF9SRUdfQURDIC4uLiBOQVU4ODEwX1JFR19BRENHQUlOOgorCWNhc2UgTkFVODgxMF9SRUdfRVExIC4uLiBOQVU4ODEwX1JFR19FUTU6CisJY2FzZSBOQVU4ODEwX1JFR19EQUNMSU0xIC4uLiBOQVU4ODEwX1JFR19EQUNMSU0yOgorCWNhc2UgTkFVODgxMF9SRUdfTk9UQ0gxIC4uLiBOQVU4ODEwX1JFR19OT1RDSDQ6CisJY2FzZSBOQVU4ODEwX1JFR19BTEMxIC4uLiBOQVU4ODEwX1JFR19BVFRFTjoKKwljYXNlIE5BVTg4MTBfUkVHX0lOUFVUX1NJR05BTCAuLi4gTkFVODgxMF9SRUdfUEdBR0FJTjoKKwljYXNlIE5BVTg4MTBfUkVHX0FEQ0JPT1NUOgorCWNhc2UgTkFVODgxMF9SRUdfT1VUUFVUIC4uLiBOQVU4ODEwX1JFR19TUEtNSVg6CisJY2FzZSBOQVU4ODEwX1JFR19TUEtHQUlOOgorCWNhc2UgTkFVODgxMF9SRUdfTU9OT01JWDoKKwljYXNlIE5BVTg4MTBfUkVHX1BPV0VSNCAuLi4gTkFVODgxMF9SRUdfVFNMT1RDVEwyOgorCWNhc2UgTkFVODgxMF9SRUdfT1VUQ1RMIC4uLiBOQVU4ODEwX1JFR19BTEMxRU5IQU4yOgorCWNhc2UgTkFVODgxMF9SRUdfTUlTQ0NUTDoKKwljYXNlIE5BVTg4MTBfUkVHX09VVFRJRU9GRiAuLi4gTkFVODgxMF9SRUdfT1VUVElFT0ZGTUFOOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgYm9vbCBuYXU4ODEwX3ZvbGF0aWxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIE5BVTg4MTBfUkVHX1JFU0VUOgorCWNhc2UgTkFVODgxMF9SRUdfREVWSUNFX1JFVklEIC4uLiBOQVU4ODEwX1JFR19SRVNFUlZFOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCisvKiBUaGUgRVEgcGFyYW1ldGVycyBnZXQgZnVuY3Rpb24gaXMgdG8gZ2V0IHRoZSA1IGJhbmQgZXF1YWxpemVyIGNvbnRyb2wuCisgKiBUaGUgcmVnbWFwIHJhdyByZWFkIGNhbid0IHdvcmsgaGVyZSBiZWNhdXNlIHJlZ21hcCBkb2Vzbid0IHByb3ZpZGUKKyAqIHZhbHVlIGZvcm1hdCBmb3IgdmFsdWUgd2lkdGggb2YgOSBiaXRzLiBUaGVyZWZvcmUsIHRoZSBkcml2ZXIgcmVhZHMgZGF0YQorICogZnJvbSBjYWNoZSBhbmQgbWFrZXMgdmFsdWUgZm9ybWF0IGFjY29yZGluZyB0byB0aGUgZW5kaWFubmVzcyBvZgorICogYnl0ZXMgdHlwZSBjb250cm9sIGVsZW1lbnQuCisgKi8KK3N0YXRpYyBpbnQgbmF1ODgxMF9lcV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IG5hdTg4MTAgKm5hdTg4MTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc29jX2J5dGVzX2V4dCAqcGFyYW1zID0gKHZvaWQgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlpbnQgaSwgcmVnLCByZWdfdmFsOworCXUxNiAqdmFsOworCisJdmFsID0gKHUxNiAqKXVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhOworCXJlZyA9IE5BVTg4MTBfUkVHX0VRMTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLT5tYXggLyBzaXplb2YodTE2KTsgaSsrKSB7CisJCXJlZ21hcF9yZWFkKG5hdTg4MTAtPnJlZ21hcCwgcmVnICsgaSwgJnJlZ192YWwpOworCQkvKiBjb252ZXJzaW9uIG9mIDE2LWJpdCBpbnRlZ2VycyBiZXR3ZWVuIG5hdGl2ZSBDUFUgZm9ybWF0CisJCSAqIGFuZCBiaWcgZW5kaWFuIGZvcm1hdAorCQkgKi8KKwkJcmVnX3ZhbCA9IGNwdV90b19iZTE2KHJlZ192YWwpOworCQltZW1jcHkodmFsICsgaSwgJnJlZ192YWwsIHNpemVvZihyZWdfdmFsKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBFUSBwYXJhbWV0ZXJzIHB1dCBmdW5jdGlvbiBpcyB0byBtYWtlIGNvbmZpZ3VyYXRpb24gb2YgNSBiYW5kIGVxdWFsaXplcgorICogY29udHJvbC4gVGhlc2UgY29uZmlndXJhdGlvbiBpbmNsdWRlcyBjZW50cmFsIGZyZXF1ZW5jeSwgZXF1YWxpemVyIGdhaW4sCisgKiBjdXQtb2ZmIGZyZXF1ZW5jeSwgYmFuZHdpZHRoIGNvbnRyb2wsIGFuZCBlcXVhbGl6ZXIgcGF0aC4KKyAqIFRoZSByZWdtYXAgcmF3IHdyaXRlIGNhbid0IHdvcmsgaGVyZSBiZWNhdXNlIHJlZ21hcCBkb2Vzbid0IHByb3ZpZGUKKyAqIHJlZ2lzdGVyIGFuZCB2YWx1ZSBmb3JtYXQgZm9yIHJlZ2lzdGVyIHdpdGggYWRkcmVzcyA3IGJpdHMgYW5kIHZhbHVlIDkgYml0cy4KKyAqIFRoZXJlZm9yZSwgdGhlIGRyaXZlciBtYWtlcyB2YWx1ZSBmb3JtYXQgYWNjb3JkaW5nIHRvIHRoZSBlbmRpYW5uZXNzIG9mCisgKiBieXRlcyB0eXBlIGNvbnRyb2wgZWxlbWVudCBhbmQgd3JpdGVzIGRhdGEgdG8gY29kZWMuCisgKi8KK3N0YXRpYyBpbnQgbmF1ODgxMF9lcV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IG5hdTg4MTAgKm5hdTg4MTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc29jX2J5dGVzX2V4dCAqcGFyYW1zID0gKHZvaWQgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl2b2lkICpkYXRhOworCXUxNiAqdmFsLCB2YWx1ZTsKKwlpbnQgaSwgcmVnLCByZXQ7CisKKwlkYXRhID0ga21lbWR1cCh1Y29udHJvbC0+dmFsdWUuYnl0ZXMuZGF0YSwKKwkJcGFyYW1zLT5tYXgsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJdmFsID0gKHUxNiAqKWRhdGE7CisJcmVnID0gTkFVODgxMF9SRUdfRVExOworCWZvciAoaSA9IDA7IGkgPCBwYXJhbXMtPm1heCAvIHNpemVvZih1MTYpOyBpKyspIHsKKwkJLyogY29udmVyc2lvbiBvZiAxNi1iaXQgaW50ZWdlcnMgYmV0d2VlbiBuYXRpdmUgQ1BVIGZvcm1hdAorCQkgKiBhbmQgYmlnIGVuZGlhbiBmb3JtYXQKKwkJICovCisJCXZhbHVlID0gYmUxNl90b19jcHUoKih2YWwgKyBpKSk7CisJCXJldCA9IHJlZ21hcF93cml0ZShuYXU4ODEwLT5yZWdtYXAsIHJlZyArIGksIHZhbHVlKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRVEgY29uZmlndXJhdGlvbiBmYWlsLCByZWdpc3RlcjogJXggcmV0OiAlZFxuIiwKKwkJCQlyZWcgKyBpLCByZXQpOworCQkJa2ZyZWUoZGF0YSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCWtmcmVlKGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmF1ODgxMF9jb21wYW5kaW5nW10gPSB7CisJIk9mZiIsICJOQyIsICJ1LWxhdyIsICJBLWxhdyIgfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBuYXU4ODEwX2NvbXBhbmRpbmdfYWRjX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShOQVU4ODEwX1JFR19DT01QLCBOQVU4ODEwX0FEQ0NNX1NGVCwKKwkJQVJSQVlfU0laRShuYXU4ODEwX2NvbXBhbmRpbmcpLCBuYXU4ODEwX2NvbXBhbmRpbmcpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG5hdTg4MTBfY29tcGFuZGluZ19kYWNfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKE5BVTg4MTBfUkVHX0NPTVAsIE5BVTg4MTBfREFDQ01fU0ZULAorCQlBUlJBWV9TSVpFKG5hdTg4MTBfY29tcGFuZGluZyksIG5hdTg4MTBfY29tcGFuZGluZyk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmF1ODgxMF9kZWVtcFtdID0geworCSJOb25lIiwgIjMya0h6IiwgIjQ0LjFrSHoiLCAiNDhrSHoiIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbmF1ODgxMF9kZWVtcF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoTkFVODgxMF9SRUdfREFDLCBOQVU4ODEwX0RFRU1QX1NGVCwKKwkJQVJSQVlfU0laRShuYXU4ODEwX2RlZW1wKSwgbmF1ODgxMF9kZWVtcCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmF1ODgxMF9lcW1vZGVbXSA9IHsiQ2FwdHVyZSIsICJQbGF5YmFjayIgfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBuYXU4ODEwX2VxbW9kZV9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoTkFVODgxMF9SRUdfRVExLCBOQVU4ODEwX0VRTV9TRlQsCisJCUFSUkFZX1NJWkUobmF1ODgxMF9lcW1vZGUpLCBuYXU4ODEwX2VxbW9kZSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmF1ODgxMF9hbGNbXSA9IHsiTm9ybWFsIiwgIkxpbWl0ZXIiIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbmF1ODgxMF9hbGNfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKE5BVTg4MTBfUkVHX0FMQzMsIE5BVTg4MTBfQUxDTV9TRlQsCisJCUFSUkFZX1NJWkUobmF1ODgxMF9hbGMpLCBuYXU4ODEwX2FsYyk7CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkaWdpdGFsX3RsdiwgLTEyNzUwLCA1MCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZXFfdGx2LCAtMTIwMCwgMTAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShpbnBnYV90bHYsIC0xMjAwLCA3NSwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoc3BrX3RsdiwgLTU3MDAsIDEwMCwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBuYXU4ODEwX3NuZF9jb250cm9sc1tdID0geworCVNPQ19FTlVNKCJBREMgQ29tcGFuZGluZyIsIG5hdTg4MTBfY29tcGFuZGluZ19hZGNfZW51bSksCisJU09DX0VOVU0oIkRBQyBDb21wYW5kaW5nIiwgbmF1ODgxMF9jb21wYW5kaW5nX2RhY19lbnVtKSwKKwlTT0NfRU5VTSgiREFDIERlLWVtcGhhc2lzIiwgbmF1ODgxMF9kZWVtcF9lbnVtKSwKKworCVNPQ19FTlVNKCJFUSBGdW5jdGlvbiIsIG5hdTg4MTBfZXFtb2RlX2VudW0pLAorCVNORF9TT0NfQllURVNfRVhUKCJFUSBQYXJhbWV0ZXJzIiwgMTAsCisJCSAgbmF1ODgxMF9lcV9nZXQsIG5hdTg4MTBfZXFfcHV0KSwKKworCVNPQ19TSU5HTEUoIkRBQyBJbnZlcnNpb24gU3dpdGNoIiwgTkFVODgxMF9SRUdfREFDLAorCQlOQVU4ODEwX0RBQ1BMX1NGVCwgMSwgMCksCisJU09DX1NJTkdMRV9UTFYoIlBsYXliYWNrIFZvbHVtZSIsIE5BVTg4MTBfUkVHX0RBQ0dBSU4sCisJCU5BVTg4MTBfREFDR0FJTl9TRlQsIDB4ZmYsIDAsIGRpZ2l0YWxfdGx2KSwKKworCVNPQ19TSU5HTEUoIkhpZ2ggUGFzcyBGaWx0ZXIgU3dpdGNoIiwgTkFVODgxMF9SRUdfQURDLAorCQlOQVU4ODEwX0hQRkVOX1NGVCwgMSwgMCksCisJU09DX1NJTkdMRSgiSGlnaCBQYXNzIEN1dCBPZmYiLCBOQVU4ODEwX1JFR19BREMsCisJCU5BVTg4MTBfSFBGX1NGVCwgMHg3LCAwKSwKKworCVNPQ19TSU5HTEUoIkFEQyBJbnZlcnNpb24gU3dpdGNoIiwgTkFVODgxMF9SRUdfQURDLAorCQlOQVU4ODEwX0FEQ1BMX1NGVCwgMSwgMCksCisJU09DX1NJTkdMRV9UTFYoIkNhcHR1cmUgVm9sdW1lIiwgTkFVODgxMF9SRUdfQURDR0FJTiwKKwkJTkFVODgxMF9BRENHQUlOX1NGVCwgMHhmZiwgMCwgZGlnaXRhbF90bHYpLAorCisJU09DX1NJTkdMRV9UTFYoIkVRMSBWb2x1bWUiLCBOQVU4ODEwX1JFR19FUTEsCisJCU5BVTg4MTBfRVExR0NfU0ZULCAweDE4LCAxLCBlcV90bHYpLAorCVNPQ19TSU5HTEVfVExWKCJFUTIgVm9sdW1lIiwgTkFVODgxMF9SRUdfRVEyLAorCQlOQVU4ODEwX0VRMkdDX1NGVCwgMHgxOCwgMSwgZXFfdGx2KSwKKwlTT0NfU0lOR0xFX1RMVigiRVEzIFZvbHVtZSIsIE5BVTg4MTBfUkVHX0VRMywKKwkJTkFVODgxMF9FUTNHQ19TRlQsIDB4MTgsIDEsIGVxX3RsdiksCisJU09DX1NJTkdMRV9UTFYoIkVRNCBWb2x1bWUiLCBOQVU4ODEwX1JFR19FUTQsCisJCU5BVTg4MTBfRVE0R0NfU0ZULCAweDE4LCAxLCBlcV90bHYpLAorCVNPQ19TSU5HTEVfVExWKCJFUTUgVm9sdW1lIiwgTkFVODgxMF9SRUdfRVE1LAorCQlOQVU4ODEwX0VRNUdDX1NGVCwgMHgxOCwgMSwgZXFfdGx2KSwKKworCVNPQ19TSU5HTEUoIkRBQyBMaW1pdGVyIFN3aXRjaCIsIE5BVTg4MTBfUkVHX0RBQ0xJTTEsCisJCU5BVTg4MTBfREFDTElNRU5fU0ZULCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJEQUMgTGltaXRlciBEZWNheSIsIE5BVTg4MTBfUkVHX0RBQ0xJTTEsCisJCU5BVTg4MTBfREFDTElNRENZX1NGVCwgMHhmLCAwKSwKKwlTT0NfU0lOR0xFKCJEQUMgTGltaXRlciBBdHRhY2siLCBOQVU4ODEwX1JFR19EQUNMSU0xLAorCQlOQVU4ODEwX0RBQ0xJTUFUS19TRlQsIDB4ZiwgMCksCisJU09DX1NJTkdMRSgiREFDIExpbWl0ZXIgVGhyZXNob2xkIiwgTkFVODgxMF9SRUdfREFDTElNMiwKKwkJTkFVODgxMF9EQUNMSU1USExfU0ZULCAweDcsIDApLAorCVNPQ19TSU5HTEUoIkRBQyBMaW1pdGVyIEJvb3N0IiwgTkFVODgxMF9SRUdfREFDTElNMiwKKwkJTkFVODgxMF9EQUNMSU1CU1RfU0ZULCAweGYsIDApLAorCisJU09DX0VOVU0oIkFMQyBNb2RlIiwgbmF1ODgxMF9hbGNfZW51bSksCisJU09DX1NJTkdMRSgiQUxDIEVuYWJsZSBTd2l0Y2giLCBOQVU4ODEwX1JFR19BTEMxLAorCQlOQVU4ODEwX0FMQ0VOX1NGVCwgMSwgMCksCisJU09DX1NJTkdMRSgiQUxDIE1heCBWb2x1bWUiLCBOQVU4ODEwX1JFR19BTEMxLAorCQlOQVU4ODEwX0FMQ01YR0FJTl9TRlQsIDB4NywgMCksCisJU09DX1NJTkdMRSgiQUxDIE1pbiBWb2x1bWUiLCBOQVU4ODEwX1JFR19BTEMxLAorCQlOQVU4ODEwX0FMQ01JTkdBSU5fU0ZULCAweDcsIDApLAorCVNPQ19TSU5HTEUoIkFMQyBaQyBTd2l0Y2giLCBOQVU4ODEwX1JFR19BTEMyLAorCQlOQVU4ODEwX0FMQ1pDX1NGVCwgMSwgMCksCisJU09DX1NJTkdMRSgiQUxDIEhvbGQiLCBOQVU4ODEwX1JFR19BTEMyLAorCQlOQVU4ODEwX0FMQ0hUX1NGVCwgMHhmLCAwKSwKKwlTT0NfU0lOR0xFKCJBTEMgVGFyZ2V0IiwgTkFVODgxMF9SRUdfQUxDMiwKKwkJTkFVODgxMF9BTENTTF9TRlQsIDB4ZiwgMCksCisJU09DX1NJTkdMRSgiQUxDIERlY2F5IiwgTkFVODgxMF9SRUdfQUxDMywKKwkJTkFVODgxMF9BTENEQ1lfU0ZULCAweGYsIDApLAorCVNPQ19TSU5HTEUoIkFMQyBBdHRhY2siLCBOQVU4ODEwX1JFR19BTEMzLAorCQlOQVU4ODEwX0FMQ0FUS19TRlQsIDB4ZiwgMCksCisJU09DX1NJTkdMRSgiQUxDIE5vaXNlIEdhdGUgU3dpdGNoIiwgTkFVODgxMF9SRUdfTk9JU0VHQVRFLAorCQlOQVU4ODEwX0FMQ05FTl9TRlQsIDEsIDApLAorCVNPQ19TSU5HTEUoIkFMQyBOb2lzZSBHYXRlIFRocmVzaG9sZCIsIE5BVTg4MTBfUkVHX05PSVNFR0FURSwKKwkJTkFVODgxMF9BTENOVEhfU0ZULCAweDcsIDApLAorCisJU09DX1NJTkdMRSgiUEdBIFpDIFN3aXRjaCIsIE5BVTg4MTBfUkVHX1BHQUdBSU4sCisJCU5BVTg4MTBfUEdBWkNfU0ZULCAxLCAwKSwKKwlTT0NfU0lOR0xFX1RMVigiUEdBIFZvbHVtZSIsIE5BVTg4MTBfUkVHX1BHQUdBSU4sCisJCU5BVTg4MTBfUEdBR0FJTl9TRlQsIDB4M2YsIDAsIGlucGdhX3RsdiksCisKKwlTT0NfU0lOR0xFKCJTcGVha2VyIFpDIFN3aXRjaCIsIE5BVTg4MTBfUkVHX1NQS0dBSU4sCisJCU5BVTg4MTBfU1BLWkNfU0ZULCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJTcGVha2VyIE11dGUgU3dpdGNoIiwgTkFVODgxMF9SRUdfU1BLR0FJTiwKKwkJTkFVODgxMF9TUEtNVF9TRlQsIDEsIDApLAorCVNPQ19TSU5HTEVfVExWKCJTcGVha2VyIFZvbHVtZSIsIE5BVTg4MTBfUkVHX1NQS0dBSU4sCisJCU5BVTg4MTBfU1BLR0FJTl9TRlQsIDB4M2YsIDAsIHNwa190bHYpLAorCisJU09DX1NJTkdMRSgiQ2FwdHVyZSBCb29zdCgrMjBkQikiLCBOQVU4ODEwX1JFR19BRENCT09TVCwKKwkJTkFVODgxMF9QR0FCU1RfU0ZULCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJNb25vIE11dGUgU3dpdGNoIiwgTkFVODgxMF9SRUdfTU9OT01JWCwKKwkJTkFVODgxMF9NT1VUTVhNVF9TRlQsIDEsIDApLAorCisJU09DX1NJTkdMRSgiREFDIE92ZXJzYW1wbGluZyBSYXRlKDEyOHgpIFN3aXRjaCIsIE5BVTg4MTBfUkVHX0RBQywKKwkJTkFVODgxMF9EQUNPU19TRlQsIDEsIDApLAorCVNPQ19TSU5HTEUoIkFEQyBPdmVyc2FtcGxpbmcgUmF0ZSgxMjh4KSBTd2l0Y2giLCBOQVU4ODEwX1JFR19BREMsCisJCU5BVTg4MTBfQURDT1NfU0ZULCAxLCAwKSwKK307CisKKy8qIFNwZWFrZXIgT3V0cHV0IE1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbmF1ODgxMF9zcGVha2VyX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJMaW5lIEJ5cGFzcyBTd2l0Y2giLCBOQVU4ODEwX1JFR19TUEtNSVgsCisJCU5BVTg4MTBfQllQU1BLX1NGVCwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgTkFVODgxMF9SRUdfU1BLTUlYLAorCQlOQVU4ODEwX0RBQ1NQS19TRlQsIDEsIDApLAorfTsKKworLyogTW9ubyBPdXRwdXQgTWl4ZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBuYXU4ODEwX21vbm9fbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkxpbmUgQnlwYXNzIFN3aXRjaCIsIE5BVTg4MTBfUkVHX01PTk9NSVgsCisJCU5BVTg4MTBfQllQTU9VVF9TRlQsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiUENNIFBsYXliYWNrIFN3aXRjaCIsIE5BVTg4MTBfUkVHX01PTk9NSVgsCisJCU5BVTg4MTBfREFDTU9VVF9TRlQsIDEsIDApLAorfTsKKworLyogUEdBIE11dGUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBuYXU4ODEwX2lucGdhX211dGVbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIlBHQSBNdXRlIFN3aXRjaCIsIE5BVTg4MTBfUkVHX1BHQUdBSU4sCisJCU5BVTg4MTBfUEdBTVRfU0ZULCAxLCAwKSwKK307CisKKy8qIElucHV0IFBHQSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG5hdTg4MTBfaW5wZ2FbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIk1pY04gU3dpdGNoIiwgTkFVODgxMF9SRUdfSU5QVVRfU0lHTkFMLAorCQlOQVU4ODEwX05NSUNQR0FfU0ZULCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pY1AgU3dpdGNoIiwgTkFVODgxMF9SRUdfSU5QVVRfU0lHTkFMLAorCQlOQVU4ODEwX1BNSUNQR0FfU0ZULCAxLCAwKSwKK307CisKKy8qIE1pYyBJbnB1dCBib29zdCB2b2wgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBuYXU4ODEwX21pY19ib29zdF9jb250cm9scyA9CisJU09DX0RBUE1fU0lOR0xFKCJNaWMgVm9sdW1lIiwgTkFVODgxMF9SRUdfQURDQk9PU1QsCisJCU5BVTg4MTBfUE1JQ0JTVEdBSU5fU0ZULCAweDcsIDApOworCisvKiBMb29wYmFjayBTd2l0Y2ggKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBuYXU4ODEwX2xvb3BiYWNrID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIE5BVTg4MTBfUkVHX0NPTVAsCisJCU5BVTg4MTBfQUREQVBfU0ZULCAxLCAwKTsKKworc3RhdGljIGludCBjaGVja19tY2xrX3NlbGVjdF9wbGwoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKKwkJCSBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMoc291cmNlLT5kYXBtKTsKKwlzdHJ1Y3QgbmF1ODgxMCAqbmF1ODgxMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCB2YWx1ZTsKKworCXJlZ21hcF9yZWFkKG5hdTg4MTAtPnJlZ21hcCwgTkFVODgxMF9SRUdfQ0xPQ0ssICZ2YWx1ZSk7CisJcmV0dXJuICh2YWx1ZSAmIE5BVTg4MTBfQ0xLTV9NQVNLKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IG5hdTg4MTBfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX01JWEVSKCJTcGVha2VyIE1peGVyIiwgTkFVODgxMF9SRUdfUE9XRVIzLAorCQlOQVU4ODEwX1NQS01YX0VOX1NGVCwgMCwgJm5hdTg4MTBfc3BlYWtlcl9taXhlcl9jb250cm9sc1swXSwKKwkJQVJSQVlfU0laRShuYXU4ODEwX3NwZWFrZXJfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIk1vbm8gTWl4ZXIiLCBOQVU4ODEwX1JFR19QT1dFUjMsCisJCU5BVTg4MTBfTU9VVE1YX0VOX1NGVCwgMCwgJm5hdTg4MTBfbW9ub19taXhlcl9jb250cm9sc1swXSwKKwkJQVJSQVlfU0laRShuYXU4ODEwX21vbm9fbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMiLCAiSGlGaSBQbGF5YmFjayIsIE5BVTg4MTBfUkVHX1BPV0VSMywKKwkJTkFVODgxMF9EQUNfRU5fU0ZULCAwKSwKKwlTTkRfU09DX0RBUE1fQURDKCJBREMiLCAiSGlGaSBDYXB0dXJlIiwgTkFVODgxMF9SRUdfUE9XRVIyLAorCQlOQVU4ODEwX0FEQ19FTl9TRlQsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIlNwa04gT3V0IiwgTkFVODgxMF9SRUdfUE9XRVIzLAorCQlOQVU4ODEwX05TUEtfRU5fU0ZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJTcGtQIE91dCIsIE5BVTg4MTBfUkVHX1BPV0VSMywKKwkJTkFVODgxMF9QU1BLX0VOX1NGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiTW9ubyBPdXQiLCBOQVU4ODEwX1JFR19QT1dFUjMsCisJCU5BVTg4MTBfTU9VVF9FTl9TRlQsIDAsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJJbnB1dCBQR0EiLCBOQVU4ODEwX1JFR19QT1dFUjIsCisJCU5BVTg4MTBfUEdBX0VOX1NGVCwgMCwgbmF1ODgxMF9pbnBnYSwKKwkJQVJSQVlfU0laRShuYXU4ODEwX2lucGdhKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJJbnB1dCBCb29zdCBTdGFnZSIsIE5BVTg4MTBfUkVHX1BPV0VSMiwKKwkJTkFVODgxMF9CU1RfRU5fU0ZULCAwLCBuYXU4ODEwX2lucGdhX211dGUsCisJCUFSUkFZX1NJWkUobmF1ODgxMF9pbnBnYV9tdXRlKSksCisKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJNaWMgQmlhcyIsIE5BVTg4MTBfUkVHX1BPV0VSMSwKKwkJTkFVODgxMF9NSUNCSUFTX0VOX1NGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUExMIiwgTkFVODgxMF9SRUdfUE9XRVIxLAorCQlOQVU4ODEwX1BMTF9FTl9TRlQsIDAsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiRGlnaXRhbCBMb29wYmFjayIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJm5hdTg4MTBfbG9vcGJhY2spLAorCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNSUNOIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNSUNQIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiTU9OT09VVCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIlNQS09VVFAiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEtPVVROIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBuYXU4ODEwX2RhcG1fcm91dGVzW10gPSB7CisJeyJEQUMiLCBOVUxMLCAiUExMIiwgY2hlY2tfbWNsa19zZWxlY3RfcGxsfSwKKworCS8qIE1vbm8gb3V0cHV0IG1peGVyICovCisJeyJNb25vIE1peGVyIiwgIlBDTSBQbGF5YmFjayBTd2l0Y2giLCAiREFDIn0sCisJeyJNb25vIE1peGVyIiwgIkxpbmUgQnlwYXNzIFN3aXRjaCIsICJJbnB1dCBCb29zdCBTdGFnZSJ9LAorCisJLyogU3BlYWtlciBvdXRwdXQgbWl4ZXIgKi8KKwl7IlNwZWFrZXIgTWl4ZXIiLCAiUENNIFBsYXliYWNrIFN3aXRjaCIsICJEQUMifSwKKwl7IlNwZWFrZXIgTWl4ZXIiLCAiTGluZSBCeXBhc3MgU3dpdGNoIiwgIklucHV0IEJvb3N0IFN0YWdlIn0sCisKKwkvKiBPdXRwdXRzICovCisJeyJNb25vIE91dCIsIE5VTEwsICJNb25vIE1peGVyIn0sCisJeyJNT05PT1VUIiwgTlVMTCwgIk1vbm8gT3V0In0sCisJeyJTcGtOIE91dCIsIE5VTEwsICJTcGVha2VyIE1peGVyIn0sCisJeyJTcGtQIE91dCIsIE5VTEwsICJTcGVha2VyIE1peGVyIn0sCisJeyJTUEtPVVROIiwgTlVMTCwgIlNwa04gT3V0In0sCisJeyJTUEtPVVRQIiwgTlVMTCwgIlNwa1AgT3V0In0sCisKKwkvKiBJbnB1dCBCb29zdCBTdGFnZSAqLworCXsiQURDIiwgTlVMTCwgIklucHV0IEJvb3N0IFN0YWdlIn0sCisJeyJBREMiLCBOVUxMLCAiUExMIiwgY2hlY2tfbWNsa19zZWxlY3RfcGxsfSwKKwl7IklucHV0IEJvb3N0IFN0YWdlIiwgTlVMTCwgIklucHV0IFBHQSJ9LAorCXsiSW5wdXQgQm9vc3QgU3RhZ2UiLCBOVUxMLCAiTUlDUCJ9LAorCisJLyogSW5wdXQgUEdBICovCisJeyJJbnB1dCBQR0EiLCBOVUxMLCAiTWljIEJpYXMifSwKKwl7IklucHV0IFBHQSIsICJNaWNOIFN3aXRjaCIsICJNSUNOIn0sCisJeyJJbnB1dCBQR0EiLCAiTWljUCBTd2l0Y2giLCAiTUlDUCJ9LAorCisJLyogRGlnaXRhbCBMb29wdGFjayAqLworCXsiRGlnaXRhbCBMb29wYmFjayIsICJTd2l0Y2giLCAiQURDIn0sCisJeyJEQUMiLCBOVUxMLCAiRGlnaXRhbCBMb29wYmFjayJ9LAorfTsKKworc3RhdGljIGludCBuYXU4ODEwX3NldF9zeXNjbGsoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJCQkJIGludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IG5hdTg4MTAgKm5hdTg4MTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCW5hdTg4MTAtPmNsa19pZCA9IGNsa19pZDsKKwluYXU4ODEwLT5zeXNjbGsgPSBmcmVxOworCWRldl9kYmcobmF1ODgxMC0+ZGV2LCAibWFzdGVyIHN5c2NsayAlZEh6LCBzb3VyY2UgJXNcbiIsCisJCWZyZXEsIGNsa19pZCA9PSBOQVU4ODEwX1NDTEtfUExMID8gIlBMTCIgOiAiTUNMSyIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmF1ODhsMF9jYWxjX3BsbCh1bnNpZ25lZCBpbnQgcGxsX2luLAorCXVuc2lnbmVkIGludCBmcywgc3RydWN0IG5hdTg4MTBfcGxsICpwbGxfcGFyYW0pCit7CisJdTY0IGYyLCBmMl9tYXgsIHBsbF9yYXRpbzsKKwlpbnQgaSwgc2NhbF9zZWw7CisKKwlpZiAocGxsX2luID4gTkFVX1BMTF9SRUZfTUFYIHx8IHBsbF9pbiA8IE5BVV9QTExfUkVGX01JTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmMl9tYXggPSAwOworCXNjYWxfc2VsID0gQVJSQVlfU0laRShuYXU4ODEwX21jbGtfc2NhbGVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShuYXU4ODEwX21jbGtfc2NhbGVyKTsgaSsrKSB7CisJCWYyID0gMjU2ICogZnMgKiA0ICogbmF1ODgxMF9tY2xrX3NjYWxlcltpXSAvIDEwOworCQlpZiAoZjIgPiBOQVVfUExMX0ZSRVFfTUlOICYmIGYyIDwgTkFVX1BMTF9GUkVRX01BWCAmJgorCQkJZjJfbWF4IDwgZjIpIHsKKwkJCWYyX21heCA9IGYyOworCQkJc2NhbF9zZWwgPSBpOworCQl9CisJfQorCWlmIChBUlJBWV9TSVpFKG5hdTg4MTBfbWNsa19zY2FsZXIpID09IHNjYWxfc2VsKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwbGxfcGFyYW0tPm1jbGtfc2NhbGVyID0gc2NhbF9zZWw7CisJZjIgPSBmMl9tYXg7CisKKwkvKiBDYWxjdWxhdGUgdGhlIFBMTCA0LWJpdCBpbnRlZ2VyIGlucHV0IGFuZCB0aGUgUExMIDI0LWJpdCBmcmFjdGlvbmFsCisJICogaW5wdXQ7IHJvdW5kIHVwIHRoZSAyNCs0Yml0LgorCSAqLworCXBsbF9yYXRpbyA9IGRpdl91NjQoZjIgPDwgMjgsIHBsbF9pbik7CisJcGxsX3BhcmFtLT5wcmVfZmFjdG9yID0gMDsKKwlpZiAoKChwbGxfcmF0aW8gPj4gMjgpICYgMHhGKSA8IE5BVV9QTExfT1BUT1BfTUlOKSB7CisJCXBsbF9yYXRpbyA8PD0gMTsKKwkJcGxsX3BhcmFtLT5wcmVfZmFjdG9yID0gMTsKKwl9CisJcGxsX3BhcmFtLT5wbGxfaW50ID0gKHBsbF9yYXRpbyA+PiAyOCkgJiAweEY7CisJcGxsX3BhcmFtLT5wbGxfZnJhYyA9ICgocGxsX3JhdGlvICYgMHhGRkZGRkZGKSA+PiA0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5hdTg4MTBfc2V0X3BsbChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwgaW50IHBsbF9pZCwKKwlpbnQgc291cmNlLCB1bnNpZ25lZCBpbnQgZnJlcV9pbiwgdW5zaWduZWQgaW50IGZyZXFfb3V0KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJc3RydWN0IG5hdTg4MTAgKm5hdTg4MTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgcmVnbWFwICptYXAgPSBuYXU4ODEwLT5yZWdtYXA7CisJc3RydWN0IG5hdTg4MTBfcGxsICpwbGxfcGFyYW0gPSAmbmF1ODgxMC0+cGxsOworCWludCByZXQsIGZzOworCisJZnMgPSBmcmVxX291dCAvIDI1NjsKKwlyZXQgPSBuYXU4OGwwX2NhbGNfcGxsKGZyZXFfaW4sIGZzLCBwbGxfcGFyYW0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIobmF1ODgxMC0+ZGV2LCAiVW5zdXBwb3J0ZWQgaW5wdXQgY2xvY2sgJWRcbiIsIGZyZXFfaW4pOworCQlyZXR1cm4gcmV0OworCX0KKwlkZXZfaW5mbyhuYXU4ODEwLT5kZXYsICJwbGxfaW50PSV4IHBsbF9mcmFjPSV4IG1jbGtfc2NhbGVyPSV4IHByZV9mYWN0b3I9JXhcbiIsCisJCXBsbF9wYXJhbS0+cGxsX2ludCwgcGxsX3BhcmFtLT5wbGxfZnJhYywgcGxsX3BhcmFtLT5tY2xrX3NjYWxlciwKKwkJcGxsX3BhcmFtLT5wcmVfZmFjdG9yKTsKKworCXJlZ21hcF91cGRhdGVfYml0cyhtYXAsIE5BVTg4MTBfUkVHX1BMTE4sCisJCU5BVTg4MTBfUExMTUNMS19ESVYyIHwgTkFVODgxMF9QTExOX01BU0ssCisJCShwbGxfcGFyYW0tPnByZV9mYWN0b3IgPyBOQVU4ODEwX1BMTE1DTEtfRElWMiA6IDApIHwKKwkJcGxsX3BhcmFtLT5wbGxfaW50KTsKKwlyZWdtYXBfd3JpdGUobWFwLCBOQVU4ODEwX1JFR19QTExLMSwKKwkJKHBsbF9wYXJhbS0+cGxsX2ZyYWMgPj4gTkFVODgxMF9QTExLMV9TRlQpICYKKwkJTkFVODgxMF9QTExLMV9NQVNLKTsKKwlyZWdtYXBfd3JpdGUobWFwLCBOQVU4ODEwX1JFR19QTExLMiwKKwkJKHBsbF9wYXJhbS0+cGxsX2ZyYWMgPj4gTkFVODgxMF9QTExLMl9TRlQpICYKKwkJTkFVODgxMF9QTExLMl9NQVNLKTsKKwlyZWdtYXBfd3JpdGUobWFwLCBOQVU4ODEwX1JFR19QTExLMywKKwkJcGxsX3BhcmFtLT5wbGxfZnJhYyAmIE5BVTg4MTBfUExMSzNfTUFTSyk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKG1hcCwgTkFVODgxMF9SRUdfQ0xPQ0ssIE5BVTg4MTBfTUNMS1NFTF9NQVNLLAorCQlwbGxfcGFyYW0tPm1jbGtfc2NhbGVyIDw8IE5BVTg4MTBfTUNMS1NFTF9TRlQpOworCXJlZ21hcF91cGRhdGVfYml0cyhtYXAsIE5BVTg4MTBfUkVHX0NMT0NLLAorCQlOQVU4ODEwX0NMS01fTUFTSywgTkFVODgxMF9DTEtNX1BMTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuYXU4ODEwX3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLAorCQl1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJc3RydWN0IG5hdTg4MTAgKm5hdTg4MTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1MTYgY3RybDFfdmFsID0gMCwgY3RybDJfdmFsID0gMDsKKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWN0cmwyX3ZhbCB8PSBOQVU4ODEwX0NMS0lPX01BU1RFUjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCWN0cmwxX3ZhbCB8PSBOQVU4ODEwX0FJRk1UX0kyUzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJY3RybDFfdmFsIHw9IE5BVTg4MTBfQUlGTVRfTEVGVDsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKKwkJY3RybDFfdmFsIHw9IE5BVTg4MTBfQUlGTVRfUENNX0E7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX05GOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0lCX0lGOgorCQljdHJsMV92YWwgfD0gTkFVODgxMF9CQ0xLUF9JQiB8IE5BVTg4MTBfRlNQX0lGOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0lCX05GOgorCQljdHJsMV92YWwgfD0gTkFVODgxMF9CQ0xLUF9JQjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9JRjoKKwkJY3RybDFfdmFsIHw9IE5BVTg4MTBfRlNQX0lGOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMobmF1ODgxMC0+cmVnbWFwLCBOQVU4ODEwX1JFR19JRkFDRSwKKwkJTkFVODgxMF9BSUZNVF9NQVNLIHwgTkFVODgxMF9GU1BfSUYgfAorCQlOQVU4ODEwX0JDTEtQX0lCLCBjdHJsMV92YWwpOworCXJlZ21hcF91cGRhdGVfYml0cyhuYXU4ODEwLT5yZWdtYXAsIE5BVTg4MTBfUkVHX0NMT0NLLAorCQlOQVU4ODEwX0NMS0lPX01BU0ssIGN0cmwyX3ZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuYXU4ODEwX21jbGtfY2xrZGl2KHN0cnVjdCBuYXU4ODEwICpuYXU4ODEwLCBpbnQgcmF0ZSkKK3sKKwlpbnQgaSwgc2NsaywgaW1jbGsgPSByYXRlICogMjU2LCBkaXYgPSAwOworCisJaWYgKCFuYXU4ODEwLT5zeXNjbGspIHsKKwkJZGV2X2VycihuYXU4ODEwLT5kZXYsICJNYWtlIG1jbGsgZGl2IGNvbmZpZ3VyYXRpb24gZmFpbCBiZWNhdXNlIG9mIGludmFsaWQgc3lzdGVtIGNsb2NrXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ29uZmlndXJlIHRoZSBtYXN0ZXIgY2xvY2sgcHJlc2NhbGVyIGRpdiB0byBtYWtlIHN5c3RlbQorCSAqIGNsb2NrIHRvIGFwcHJveGltYXRlIHRoZSBpbnRlcm5hbCBtYXN0ZXIgY2xvY2sgKElNQ0xLKTsKKwkgKiBhbmQgbGFyZ2Ugb3IgZXF1YWwgdG8gSU1DTEsuCisJICovCisJZm9yIChpID0gMTsgaSA8IEFSUkFZX1NJWkUobmF1ODgxMF9tY2xrX3NjYWxlcik7IGkrKykgeworCQlzY2xrID0gKG5hdTg4MTAtPnN5c2NsayAqIDEwKSAvCisJCQluYXU4ODEwX21jbGtfc2NhbGVyW2ldOworCQlpZiAoc2NsayA8IGltY2xrKQorCQkJYnJlYWs7CisJCWRpdiA9IGk7CisJfQorCWRldl9kYmcobmF1ODgxMC0+ZGV2LAorCQkibWFzdGVyIGNsb2NrIHByZXNjYWxlciAleCBmb3IgZnMgJWRcbiIsIGRpdiwgcmF0ZSk7CisKKwkvKiBtYXN0ZXIgY2xvY2sgZnJvbSBNQ0xLIGFuZCBkaXNhYmxlIFBMTCAqLworCXJlZ21hcF91cGRhdGVfYml0cyhuYXU4ODEwLT5yZWdtYXAsIE5BVTg4MTBfUkVHX0NMT0NLLAorCQlOQVU4ODEwX01DTEtTRUxfTUFTSywgKGRpdiA8PCBOQVU4ODEwX01DTEtTRUxfU0ZUKSk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKG5hdTg4MTAtPnJlZ21hcCwgTkFVODgxMF9SRUdfQ0xPQ0ssCisJCU5BVTg4MTBfQ0xLTV9NQVNLLCBOQVU4ODEwX0NMS01fTUNMSyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuYXU4ODEwX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IG5hdTg4MTAgKm5hdTg4MTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgdmFsX2xlbiA9IDAsIHZhbF9yYXRlID0gMCwgcmV0ID0gMDsKKworCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwljYXNlIDE2OgorCQlicmVhazsKKwljYXNlIDIwOgorCQl2YWxfbGVuIHw9IE5BVTg4MTBfV0xFTl8yMDsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJdmFsX2xlbiB8PSBOQVU4ODEwX1dMRU5fMjQ7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCXZhbF9sZW4gfD0gTkFVODgxMF9XTEVOXzMyOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHBhcmFtc19yYXRlKHBhcmFtcykpIHsKKwljYXNlIDgwMDA6CisJCXZhbF9yYXRlIHw9IE5BVTg4MTBfU01QTFJfOEs7CisJCWJyZWFrOworCWNhc2UgMTEwMjU6CisJCXZhbF9yYXRlIHw9IE5BVTg4MTBfU01QTFJfMTJLOworCQlicmVhazsKKwljYXNlIDE2MDAwOgorCQl2YWxfcmF0ZSB8PSBOQVU4ODEwX1NNUExSXzE2SzsKKwkJYnJlYWs7CisJY2FzZSAyMjA1MDoKKwkJdmFsX3JhdGUgfD0gTkFVODgxMF9TTVBMUl8yNEs7CisJCWJyZWFrOworCWNhc2UgMzIwMDA6CisJCXZhbF9yYXRlIHw9IE5BVTg4MTBfU01QTFJfMzJLOworCQlicmVhazsKKwljYXNlIDQ0MTAwOgorCWNhc2UgNDgwMDA6CisJCWJyZWFrOworCX0KKworCXJlZ21hcF91cGRhdGVfYml0cyhuYXU4ODEwLT5yZWdtYXAsIE5BVTg4MTBfUkVHX0lGQUNFLAorCQlOQVU4ODEwX1dMRU5fTUFTSywgdmFsX2xlbik7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKG5hdTg4MTAtPnJlZ21hcCwgTkFVODgxMF9SRUdfU01QTFIsCisJCU5BVTg4MTBfU01QTFJfTUFTSywgdmFsX3JhdGUpOworCisJLyogSWYgdGhlIG1hc3RlciBjbG9jayBpcyBmcm9tIE1DTEssIHByb3ZpZGUgdGhlIHJ1bnRpbWUgRlMgZm9yIGRyaXZlcgorCSAqIHRvIGdldCB0aGUgbWFzdGVyIGNsb2NrIHByZXNjYWxlciBjb25maWd1cmF0aW9uLgorCSAqLworCWlmIChuYXU4ODEwLT5jbGtfaWQgPT0gTkFVODgxMF9TQ0xLX01DTEspIHsKKwkJcmV0ID0gbmF1ODgxMF9tY2xrX2Nsa2RpdihuYXU4ODEwLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfZXJyKG5hdTg4MTAtPmRldiwgIk1DTEsgZGl2IGNvbmZpZ3VyYXRpb24gZmFpbFxuIik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBuYXU4ODEwX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwlzdHJ1Y3QgbmF1ODgxMCAqbmF1ODgxMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCByZWdtYXAgKm1hcCA9IG5hdTg4MTAtPnJlZ21hcDsKKworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIFNORF9TT0NfQklBU19PTjoKKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQlyZWdtYXBfdXBkYXRlX2JpdHMobWFwLCBOQVU4ODEwX1JFR19QT1dFUjEsCisJCQlOQVU4ODEwX1JFRklNUF9NQVNLLCBOQVU4ODEwX1JFRklNUF84MEspOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCXJlZ21hcF91cGRhdGVfYml0cyhtYXAsIE5BVTg4MTBfUkVHX1BPV0VSMSwKKwkJCU5BVTg4MTBfSU9CVUZfRU4gfCBOQVU4ODEwX0FCSUFTX0VOLAorCQkJTkFVODgxMF9JT0JVRl9FTiB8IE5BVTg4MTBfQUJJQVNfRU4pOworCisJCWlmIChzbmRfc29jX2NvZGVjX2dldF9iaWFzX2xldmVsKGNvZGVjKSA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCQlyZWdjYWNoZV9zeW5jKG1hcCk7CisJCQlyZWdtYXBfdXBkYXRlX2JpdHMobWFwLCBOQVU4ODEwX1JFR19QT1dFUjEsCisJCQkJTkFVODgxMF9SRUZJTVBfTUFTSywgTkFVODgxMF9SRUZJTVBfM0spOworCQkJbWRlbGF5KDEwMCk7CisJCX0KKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKG1hcCwgTkFVODgxMF9SRUdfUE9XRVIxLAorCQkJTkFVODgxMF9SRUZJTVBfTUFTSywgTkFVODgxMF9SRUZJTVBfMzAwSyk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQlyZWdtYXBfd3JpdGUobWFwLCBOQVU4ODEwX1JFR19QT1dFUjEsIDApOworCQlyZWdtYXBfd3JpdGUobWFwLCBOQVU4ODEwX1JFR19QT1dFUjIsIDApOworCQlyZWdtYXBfd3JpdGUobWFwLCBOQVU4ODEwX1JFR19QT1dFUjMsIDApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisjZGVmaW5lIE5BVTg4MTBfUkFURVMgKFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDApCisKKyNkZWZpbmUgTkFVODgxMF9GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8IFwKKwlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBuYXU4ODEwX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gbmF1ODgxMF9wY21faHdfcGFyYW1zLAorCS5zZXRfZm10ID0gbmF1ODgxMF9zZXRfZGFpX2ZtdCwKKwkuc2V0X3N5c2NsayA9IG5hdTg4MTBfc2V0X3N5c2NsaywKKwkuc2V0X3BsbCA9IG5hdTg4MTBfc2V0X3BsbCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG5hdTg4MTBfZGFpID0geworCS5uYW1lID0gIm5hdTg4MTAtaGlmaSIsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiUGxheWJhY2siLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsICAgLyogT25seSAxIGNoYW5uZWwgb2YgZGF0YSAqLworCQkucmF0ZXMgPSBOQVU4ODEwX1JBVEVTLAorCQkuZm9ybWF0cyA9IE5BVTg4MTBfRk9STUFUUywKKwl9LAorCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwgICAvKiBPbmx5IDEgY2hhbm5lbCBvZiBkYXRhICovCisJCS5yYXRlcyA9IE5BVTg4MTBfUkFURVMsCisJCS5mb3JtYXRzID0gTkFVODgxMF9GT1JNQVRTLAorCX0sCisJLm9wcyA9ICZuYXU4ODEwX29wcywKKwkuc3ltbWV0cmljX3JhdGVzID0gMSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBuYXU4ODEwX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gNywKKwkudmFsX2JpdHMgPSA5LAorCisJLm1heF9yZWdpc3RlciA9IE5BVTg4MTBfUkVHX01BWCwKKwkucmVhZGFibGVfcmVnID0gbmF1ODgxMF9yZWFkYWJsZV9yZWcsCisJLndyaXRlYWJsZV9yZWcgPSBuYXU4ODEwX3dyaXRlYWJsZV9yZWcsCisJLnZvbGF0aWxlX3JlZyA9IG5hdTg4MTBfdm9sYXRpbGVfcmVnLAorCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLnJlZ19kZWZhdWx0cyA9IG5hdTg4MTBfcmVnX2RlZmF1bHRzLAorCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRShuYXU4ODEwX3JlZ19kZWZhdWx0cyksCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIG5hdTg4MTBfY29kZWNfZHJpdmVyID0geworCS5zZXRfYmlhc19sZXZlbCA9IG5hdTg4MTBfc2V0X2JpYXNfbGV2ZWwsCisJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAorCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scyA9IG5hdTg4MTBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShuYXU4ODEwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMgPSBuYXU4ODEwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG5hdTg4MTBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzID0gbmF1ODgxMF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUobmF1ODgxMF9kYXBtX3JvdXRlcyksCisJfSwKK307CisKK3N0YXRpYyBpbnQgbmF1ODgxMF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyYy0+ZGV2OworCXN0cnVjdCBuYXU4ODEwICpuYXU4ODEwID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOworCisJaWYgKCFuYXU4ODEwKSB7CisJCW5hdTg4MTAgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKm5hdTg4MTApLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFuYXU4ODEwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIG5hdTg4MTApOworCisJbmF1ODgxMC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAmbmF1ODgxMF9yZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKG5hdTg4MTAtPnJlZ21hcCkpCisJCXJldHVybiBQVFJfRVJSKG5hdTg4MTAtPnJlZ21hcCk7CisJbmF1ODgxMC0+ZGV2ID0gZGV2OworCisJcmVnbWFwX3dyaXRlKG5hdTg4MTAtPnJlZ21hcCwgTkFVODgxMF9SRUdfUkVTRVQsIDB4MDApOworCisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoZGV2LAorCQkmbmF1ODgxMF9jb2RlY19kcml2ZXIsICZuYXU4ODEwX2RhaSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgbmF1ODgxMF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG5hdTg4MTBfaTJjX2lkW10gPSB7CisJeyAibmF1ODgxMCIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbmF1ODgxMF9pMmNfaWQpOworCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBuYXU4ODEwX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJudXZvdG9uLG5hdTg4MTAiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG5hdTg4MTBfb2ZfbWF0Y2gpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBuYXU4ODEwX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibmF1ODgxMCIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihuYXU4ODEwX29mX21hdGNoKSwKKwl9LAorCS5wcm9iZSA9ICAgIG5hdTg4MTBfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSAgIG5hdTg4MTBfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSBuYXU4ODEwX2kyY19pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKG5hdTg4MTBfaTJjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBOQVU4ODEwIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiRGF2aWQgTGluIDxjdGxpbjBAbnV2b3Rvbi5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL25hdTg4MTAuaCBiL3NvdW5kL3NvYy9jb2RlY3MvbmF1ODgxMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODgyNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL25hdTg4MTAuaApAQCAtMCwwICsxLDI4MSBAQAorLyoKKyAqIE5BVTg4MTAgQUxTQSBTb0MgYXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTYgTnV2b3RvbiBUZWNobm9sb2d5IENvcnAuCisgKiBBdXRob3I6IERhdmlkIExpbiA8Y3RsaW4wQG51dm90b24uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX05BVTg4MTBfSF9fCisjZGVmaW5lIF9fTkFVODgxMF9IX18KKworI2RlZmluZSBOQVU4ODEwX1JFR19SRVNFVAkJMHgwMAorI2RlZmluZSBOQVU4ODEwX1JFR19QT1dFUjEJCTB4MDEKKyNkZWZpbmUgTkFVODgxMF9SRUdfUE9XRVIyCQkweDAyCisjZGVmaW5lIE5BVTg4MTBfUkVHX1BPV0VSMwkJMHgwMworI2RlZmluZSBOQVU4ODEwX1JFR19JRkFDRQkJMHgwNAorI2RlZmluZSBOQVU4ODEwX1JFR19DT01QCQkweDA1CisjZGVmaW5lIE5BVTg4MTBfUkVHX0NMT0NLCQkweDA2CisjZGVmaW5lIE5BVTg4MTBfUkVHX1NNUExSCQkweDA3CisjZGVmaW5lIE5BVTg4MTBfUkVHX0RBQwkJMHgwQQorI2RlZmluZSBOQVU4ODEwX1JFR19EQUNHQUlOCQkweDBCCisjZGVmaW5lIE5BVTg4MTBfUkVHX0FEQwkJMHgwRQorI2RlZmluZSBOQVU4ODEwX1JFR19BRENHQUlOCQkweDBGCisjZGVmaW5lIE5BVTg4MTBfUkVHX0VRMQkJMHgxMgorI2RlZmluZSBOQVU4ODEwX1JFR19FUTIJCTB4MTMKKyNkZWZpbmUgTkFVODgxMF9SRUdfRVEzCQkweDE0CisjZGVmaW5lIE5BVTg4MTBfUkVHX0VRNAkJMHgxNQorI2RlZmluZSBOQVU4ODEwX1JFR19FUTUJCTB4MTYKKyNkZWZpbmUgTkFVODgxMF9SRUdfREFDTElNMQkJMHgxOAorI2RlZmluZSBOQVU4ODEwX1JFR19EQUNMSU0yCQkweDE5CisjZGVmaW5lIE5BVTg4MTBfUkVHX05PVENIMQkJMHgxQgorI2RlZmluZSBOQVU4ODEwX1JFR19OT1RDSDIJCTB4MUMKKyNkZWZpbmUgTkFVODgxMF9SRUdfTk9UQ0gzCQkweDFECisjZGVmaW5lIE5BVTg4MTBfUkVHX05PVENINAkJMHgxRQorI2RlZmluZSBOQVU4ODEwX1JFR19BTEMxCQkweDIwCisjZGVmaW5lIE5BVTg4MTBfUkVHX0FMQzIJCTB4MjEKKyNkZWZpbmUgTkFVODgxMF9SRUdfQUxDMwkJMHgyMgorI2RlZmluZSBOQVU4ODEwX1JFR19OT0lTRUdBVEUJCTB4MjMKKyNkZWZpbmUgTkFVODgxMF9SRUdfUExMTgkJMHgyNAorI2RlZmluZSBOQVU4ODEwX1JFR19QTExLMQkJMHgyNQorI2RlZmluZSBOQVU4ODEwX1JFR19QTExLMgkJMHgyNgorI2RlZmluZSBOQVU4ODEwX1JFR19QTExLMwkJMHgyNworI2RlZmluZSBOQVU4ODEwX1JFR19BVFRFTgkJMHgyOAorI2RlZmluZSBOQVU4ODEwX1JFR19JTlBVVF9TSUdOQUwJMHgyQworI2RlZmluZSBOQVU4ODEwX1JFR19QR0FHQUlOCQkweDJECisjZGVmaW5lIE5BVTg4MTBfUkVHX0FEQ0JPT1NUCQkweDJGCisjZGVmaW5lIE5BVTg4MTBfUkVHX09VVFBVVAkJMHgzMQorI2RlZmluZSBOQVU4ODEwX1JFR19TUEtNSVgJCTB4MzIKKyNkZWZpbmUgTkFVODgxMF9SRUdfU1BLR0FJTgkJMHgzNgorI2RlZmluZSBOQVU4ODEwX1JFR19NT05PTUlYCQkweDM4CisjZGVmaW5lIE5BVTg4MTBfUkVHX1BPV0VSNAkJMHgzQQorI2RlZmluZSBOQVU4ODEwX1JFR19UU0xPVENUTDEJCTB4M0IKKyNkZWZpbmUgTkFVODgxMF9SRUdfVFNMT1RDVEwyCQkweDNDCisjZGVmaW5lIE5BVTg4MTBfUkVHX0RFVklDRV9SRVZJRAkweDNFCisjZGVmaW5lIE5BVTg4MTBfUkVHX0kyQ19ERVZJQ0VJRAkweDNGCisjZGVmaW5lIE5BVTg4MTBfUkVHX0FERElUSU9OSUQJMHg0MAorI2RlZmluZSBOQVU4ODEwX1JFR19SRVNFUlZFCQkweDQxCisjZGVmaW5lIE5BVTg4MTBfUkVHX09VVENUTAkJMHg0NQorI2RlZmluZSBOQVU4ODEwX1JFR19BTEMxRU5IQU4xCTB4NDYKKyNkZWZpbmUgTkFVODgxMF9SRUdfQUxDMUVOSEFOMgkweDQ3CisjZGVmaW5lIE5BVTg4MTBfUkVHX01JU0NDVEwJCTB4NDkKKyNkZWZpbmUgTkFVODgxMF9SRUdfT1VUVElFT0ZGCQkweDRCCisjZGVmaW5lIE5BVTg4MTBfUkVHX0FHQ1AyUE9VVAkweDRDCisjZGVmaW5lIE5BVTg4MTBfUkVHX0FHQ1BPVVQJCTB4NEQKKyNkZWZpbmUgTkFVODgxMF9SRUdfQU1UQ1RMCQkweDRFCisjZGVmaW5lIE5BVTg4MTBfUkVHX09VVFRJRU9GRk1BTgkweDRGCisjZGVmaW5lIE5BVTg4MTBfUkVHX01BWAkJTkFVODgxMF9SRUdfT1VUVElFT0ZGTUFOCisKKworLyogTkFVODgxMF9SRUdfUE9XRVIxICgweDEpICovCisjZGVmaW5lIE5BVTg4MTBfRENCVUZfRU4JCSgweDEgPDwgOCkKKyNkZWZpbmUgTkFVODgxMF9QTExfRU5fU0ZUCQk1CisjZGVmaW5lIE5BVTg4MTBfTUlDQklBU19FTl9TRlQJNAorI2RlZmluZSBOQVU4ODEwX0FCSUFTX0VOCQkoMHgxIDw8IDMpCisjZGVmaW5lIE5BVTg4MTBfSU9CVUZfRU4JCSgweDEgPDwgMikKKyNkZWZpbmUgTkFVODgxMF9SRUZJTVBfTUFTSwkJMHgzCisjZGVmaW5lIE5BVTg4MTBfUkVGSU1QX0RJUwkJMHgwCisjZGVmaW5lIE5BVTg4MTBfUkVGSU1QXzgwSwkJMHgxCisjZGVmaW5lIE5BVTg4MTBfUkVGSU1QXzMwMEsJCTB4MgorI2RlZmluZSBOQVU4ODEwX1JFRklNUF8zSwkJMHgzCisKKy8qIE5BVTg4MTBfUkVHX1BPV0VSMiAoMHgyKSAqLworI2RlZmluZSBOQVU4ODEwX0JTVF9FTl9TRlQJCTQKKyNkZWZpbmUgTkFVODgxMF9QR0FfRU5fU0ZUCQkyCisjZGVmaW5lIE5BVTg4MTBfQURDX0VOX1NGVAkJMAorCisvKiBOQVU4ODEwX1JFR19QT1dFUjMgKDB4MykgKi8KKyNkZWZpbmUgTkFVODgxMF9EQUNfRU5fU0ZUCQkwCisjZGVmaW5lIE5BVTg4MTBfU1BLTVhfRU5fU0ZUCQkyCisjZGVmaW5lIE5BVTg4MTBfTU9VVE1YX0VOX1NGVAkzCisjZGVmaW5lIE5BVTg4MTBfUFNQS19FTl9TRlQJCTUKKyNkZWZpbmUgTkFVODgxMF9OU1BLX0VOX1NGVAkJNgorI2RlZmluZSBOQVU4ODEwX01PVVRfRU5fU0ZUCQk3CisKKy8qIE5BVTg4MTBfUkVHX0lGQUNFICgweDQpICovCisjZGVmaW5lIE5BVTg4MTBfQUlGTVRfU0ZUCQkzCisjZGVmaW5lIE5BVTg4MTBfQUlGTVRfTUFTSwkJKDB4MyA8PCBOQVU4ODEwX0FJRk1UX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9BSUZNVF9SSUdIVAkJKDB4MCA8PCBOQVU4ODEwX0FJRk1UX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9BSUZNVF9MRUZUCQkoMHgxIDw8IE5BVTg4MTBfQUlGTVRfU0ZUKQorI2RlZmluZSBOQVU4ODEwX0FJRk1UX0kyUwkJKDB4MiA8PCBOQVU4ODEwX0FJRk1UX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9BSUZNVF9QQ01fQQkJKDB4MyA8PCBOQVU4ODEwX0FJRk1UX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9XTEVOX1NGVAkJNQorI2RlZmluZSBOQVU4ODEwX1dMRU5fTUFTSwkJKDB4MyA8PCBOQVU4ODEwX1dMRU5fU0ZUKQorI2RlZmluZSBOQVU4ODEwX1dMRU5fMTYJCSgweDAgPDwgTkFVODgxMF9XTEVOX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9XTEVOXzIwCQkoMHgxIDw8IE5BVTg4MTBfV0xFTl9TRlQpCisjZGVmaW5lIE5BVTg4MTBfV0xFTl8yNAkJKDB4MiA8PCBOQVU4ODEwX1dMRU5fU0ZUKQorI2RlZmluZSBOQVU4ODEwX1dMRU5fMzIJCSgweDMgPDwgTkFVODgxMF9XTEVOX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9GU1BfSUYJCQkoMHgxIDw8IDcpCisjZGVmaW5lIE5BVTg4MTBfQkNMS1BfSUIJCSgweDEgPDwgOCkKKworLyogTkFVODgxMF9SRUdfQ09NUCAoMHg1KSAqLworI2RlZmluZSBOQVU4ODEwX0FEREFQX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0FEQ0NNX1NGVAkJMQorI2RlZmluZSBOQVU4ODEwX0RBQ0NNX1NGVAkJMworCisvKiBOQVU4ODEwX1JFR19DTE9DSyAoMHg2KSAqLworI2RlZmluZSBOQVU4ODEwX0NMS0lPX01BU0sJCTB4MQorI2RlZmluZSBOQVU4ODEwX0NMS0lPX1NMQVZFCQkweDAKKyNkZWZpbmUgTkFVODgxMF9DTEtJT19NQVNURVIJCTB4MQorI2RlZmluZSBOQVU4ODEwX0JDTEtTRUxfU0ZUCQkyCisjZGVmaW5lIE5BVTg4MTBfQkNMS1NFTF9NQVNLCQkoMHg3IDw8IE5BVTg4MTBfQkNMS1NFTF9TRlQpCisjZGVmaW5lIE5BVTg4MTBfQkNMS0RJVl8xCQkoMHgwIDw8IE5BVTg4MTBfQkNMS1NFTF9TRlQpCisjZGVmaW5lIE5BVTg4MTBfQkNMS0RJVl8yCQkoMHgxIDw8IE5BVTg4MTBfQkNMS1NFTF9TRlQpCisjZGVmaW5lIE5BVTg4MTBfQkNMS0RJVl80CQkoMHgyIDw8IE5BVTg4MTBfQkNMS1NFTF9TRlQpCisjZGVmaW5lIE5BVTg4MTBfQkNMS0RJVl84CQkoMHgzIDw8IE5BVTg4MTBfQkNMS1NFTF9TRlQpCisjZGVmaW5lIE5BVTg4MTBfQkNMS0RJVl8xNgkJKDB4NCA8PCBOQVU4ODEwX0JDTEtTRUxfU0ZUKQorI2RlZmluZSBOQVU4ODEwX0JDTEtESVZfMzIJCSgweDUgPDwgTkFVODgxMF9CQ0xLU0VMX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9NQ0xLU0VMX1NGVAkJNQorI2RlZmluZSBOQVU4ODEwX01DTEtTRUxfTUFTSwkJKDB4NyA8PCBOQVU4ODEwX01DTEtTRUxfU0ZUKQorI2RlZmluZSBOQVU4ODEwX0NMS01fU0ZUCQk4CisjZGVmaW5lIE5BVTg4MTBfQ0xLTV9NQVNLCQkoMHgxIDw8IE5BVTg4MTBfQ0xLTV9TRlQpCisjZGVmaW5lIE5BVTg4MTBfQ0xLTV9NQ0xLCQkoMHgwIDw8IE5BVTg4MTBfQ0xLTV9TRlQpCisjZGVmaW5lIE5BVTg4MTBfQ0xLTV9QTEwJCSgweDEgPDwgTkFVODgxMF9DTEtNX1NGVCkKKworLyogTkFVODgxMF9SRUdfU01QTFIgKDB4NykgKi8KKyNkZWZpbmUgTkFVODgxMF9TTVBMUl9TRlQJCTEKKyNkZWZpbmUgTkFVODgxMF9TTVBMUl9NQVNLCQkoMHg3IDw8IE5BVTg4MTBfU01QTFJfU0ZUKQorI2RlZmluZSBOQVU4ODEwX1NNUExSXzQ4SwkJKDB4MCA8PCBOQVU4ODEwX1NNUExSX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9TTVBMUl8zMksJCSgweDEgPDwgTkFVODgxMF9TTVBMUl9TRlQpCisjZGVmaW5lIE5BVTg4MTBfU01QTFJfMjRLCQkoMHgyIDw8IE5BVTg4MTBfU01QTFJfU0ZUKQorI2RlZmluZSBOQVU4ODEwX1NNUExSXzE2SwkJKDB4MyA8PCBOQVU4ODEwX1NNUExSX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9TTVBMUl8xMksJCSgweDQgPDwgTkFVODgxMF9TTVBMUl9TRlQpCisjZGVmaW5lIE5BVTg4MTBfU01QTFJfOEsJCSgweDUgPDwgTkFVODgxMF9TTVBMUl9TRlQpCisKKy8qIE5BVTg4MTBfUkVHX0RBQyAoMHhBKSAqLworI2RlZmluZSBOQVU4ODEwX0RBQ1BMX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0RBQ09TX1NGVAkJMworI2RlZmluZSBOQVU4ODEwX0RFRU1QX1NGVAkJNAorCisvKiBOQVU4ODEwX1JFR19EQUNHQUlOICgweEIpICovCisjZGVmaW5lIE5BVTg4MTBfREFDR0FJTl9TRlQJCTAKKworLyogTkFVODgxMF9SRUdfQURDICgweEUpICovCisjZGVmaW5lIE5BVTg4MTBfQURDUExfU0ZUCQkwCisjZGVmaW5lIE5BVTg4MTBfQURDT1NfU0ZUCQkzCisjZGVmaW5lIE5BVTg4MTBfSFBGX1NGVAkJNAorI2RlZmluZSBOQVU4ODEwX0hQRkVOX1NGVAkJOAorCisvKiBOQVU4ODEwX1JFR19BRENHQUlOICgweEYpICovCisjZGVmaW5lIE5BVTg4MTBfQURDR0FJTl9TRlQJCTAKKworLyogTkFVODgxMF9SRUdfRVExICgweDEyKSAqLworI2RlZmluZSBOQVU4ODEwX0VRMUdDX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0VRMUNGX1NGVAkJNQorI2RlZmluZSBOQVU4ODEwX0VRTV9TRlQJCTgKKworLyogTkFVODgxMF9SRUdfRVEyICgweDEzKSAqLworI2RlZmluZSBOQVU4ODEwX0VRMkdDX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0VRMkNGX1NGVAkJNQorI2RlZmluZSBOQVU4ODEwX0VRMkJXX1NGVAkJOAorCisvKiBOQVU4ODEwX1JFR19FUTMgKDB4MTQpICovCisjZGVmaW5lIE5BVTg4MTBfRVEzR0NfU0ZUCQkwCisjZGVmaW5lIE5BVTg4MTBfRVEzQ0ZfU0ZUCQk1CisjZGVmaW5lIE5BVTg4MTBfRVEzQldfU0ZUCQk4CisKKy8qIE5BVTg4MTBfUkVHX0VRNCAoMHgxNSkgKi8KKyNkZWZpbmUgTkFVODgxMF9FUTRHQ19TRlQJCTAKKyNkZWZpbmUgTkFVODgxMF9FUTRDRl9TRlQJCTUKKyNkZWZpbmUgTkFVODgxMF9FUTRCV19TRlQJCTgKKworLyogTkFVODgxMF9SRUdfRVE1ICgweDE2KSAqLworI2RlZmluZSBOQVU4ODEwX0VRNUdDX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0VRNUNGX1NGVAkJNQorCisvKiBOQVU4ODEwX1JFR19EQUNMSU0xICgweDE4KSAqLworI2RlZmluZSBOQVU4ODEwX0RBQ0xJTUFUS19TRlQJCTAKKyNkZWZpbmUgTkFVODgxMF9EQUNMSU1EQ1lfU0ZUCQk0CisjZGVmaW5lIE5BVTg4MTBfREFDTElNRU5fU0ZUCQk4CisKKy8qIE5BVTg4MTBfUkVHX0RBQ0xJTTIgKDB4MTkpICovCisjZGVmaW5lIE5BVTg4MTBfREFDTElNQlNUX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0RBQ0xJTVRITF9TRlQJCTQKKworLyogTkFVODgxMF9SRUdfQUxDMSAoMHgyMCkgKi8KKyNkZWZpbmUgTkFVODgxMF9BTENNSU5HQUlOX1NGVAkwCisjZGVmaW5lIE5BVTg4MTBfQUxDTVhHQUlOX1NGVAkJMworI2RlZmluZSBOQVU4ODEwX0FMQ0VOX1NGVAkJOAorCisvKiBOQVU4ODEwX1JFR19BTEMyICgweDIxKSAqLworI2RlZmluZSBOQVU4ODEwX0FMQ1NMX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0FMQ0hUX1NGVAkJNAorI2RlZmluZSBOQVU4ODEwX0FMQ1pDX1NGVAkJOAorCisvKiBOQVU4ODEwX1JFR19BTEMzICgweDIyKSAqLworI2RlZmluZSBOQVU4ODEwX0FMQ0FUS19TRlQJCTAKKyNkZWZpbmUgTkFVODgxMF9BTENEQ1lfU0ZUCQk0CisjZGVmaW5lIE5BVTg4MTBfQUxDTV9TRlQJCTgKKworLyogTkFVODgxMF9SRUdfTk9JU0VHQVRFICgweDIzKSAqLworI2RlZmluZSBOQVU4ODEwX0FMQ05USF9TRlQJCTAKKyNkZWZpbmUgTkFVODgxMF9BTENORU5fU0ZUCQkzCisKKy8qIE5BVTg4MTBfUkVHX1BMTE4gKDB4MjQpICovCisjZGVmaW5lIE5BVTg4MTBfUExMTl9NQVNLCQkweEYKKyNkZWZpbmUgTkFVODgxMF9QTExNQ0xLX0RJVjIJCSgweDEgPDwgNCkKKworLyogTkFVODgxMF9SRUdfUExMSzEgKDB4MjUpICovCisjZGVmaW5lIE5BVTg4MTBfUExMSzFfU0ZUCQkxOAorI2RlZmluZSBOQVU4ODEwX1BMTEsxX01BU0sJCTB4M0YKKworLyogTkFVODgxMF9SRUdfUExMSzIgKDB4MjYpICovCisjZGVmaW5lIE5BVTg4MTBfUExMSzJfU0ZUCQk5CisjZGVmaW5lIE5BVTg4MTBfUExMSzJfTUFTSwkJMHgxRkYKKworLyogTkFVODgxMF9SRUdfUExMSzMgKDB4MjcpICovCisjZGVmaW5lIE5BVTg4MTBfUExMSzNfTUFTSwkJMHgxRkYKKworLyogTkFVODgxMF9SRUdfSU5QVVRfU0lHTkFMICgweDJDKSAqLworI2RlZmluZSBOQVU4ODEwX1BNSUNQR0FfU0ZUCQkwCisjZGVmaW5lIE5BVTg4MTBfTk1JQ1BHQV9TRlQJCTEKKworLyogTkFVODgxMF9SRUdfUEdBR0FJTiAoMHgyRCkgKi8KKyNkZWZpbmUgTkFVODgxMF9QR0FHQUlOX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX1BHQU1UX1NGVAkJNgorI2RlZmluZSBOQVU4ODEwX1BHQVpDX1NGVAkJNworCisvKiBOQVU4ODEwX1JFR19BRENCT09TVCAoMHgyRikgKi8KKyNkZWZpbmUgTkFVODgxMF9QTUlDQlNUR0FJTl9TRlQJNAorI2RlZmluZSBOQVU4ODEwX1BHQUJTVF9TRlQJCTgKKworLyogTkFVODgxMF9SRUdfU1BLTUlYICgweDMyKSAqLworI2RlZmluZSBOQVU4ODEwX0RBQ1NQS19TRlQJCTAKKyNkZWZpbmUgTkFVODgxMF9CWVBTUEtfU0ZUCQkxCisKKy8qIE5BVTg4MTBfUkVHX1NQS0dBSU4gKDB4MzYpICovCisjZGVmaW5lIE5BVTg4MTBfU1BLR0FJTl9TRlQJCTAKKyNkZWZpbmUgTkFVODgxMF9TUEtNVF9TRlQJCTYKKyNkZWZpbmUgTkFVODgxMF9TUEtaQ19TRlQJCTcKKworLyogTkFVODgxMF9SRUdfTU9OT01JWCAoMHgzOCkgKi8KKyNkZWZpbmUgTkFVODgxMF9EQUNNT1VUX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0JZUE1PVVRfU0ZUCQkxCisjZGVmaW5lIE5BVTg4MTBfTU9VVE1YTVRfU0ZUCQk2CisKKworLyogU3lzdGVtIENsb2NrIFNvdXJjZSAqLworZW51bSB7CisJTkFVODgxMF9TQ0xLX01DTEssCisJTkFVODgxMF9TQ0xLX1BMTCwKK307CisKK3N0cnVjdCBuYXU4ODEwX3BsbCB7CisJaW50IHByZV9mYWN0b3I7CisJaW50IG1jbGtfc2NhbGVyOworCWludCBwbGxfZnJhYzsKKwlpbnQgcGxsX2ludDsKK307CisKK3N0cnVjdCBuYXU4ODEwIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXN0cnVjdCBuYXU4ODEwX3BsbCBwbGw7CisJaW50IHN5c2NsazsKKwlpbnQgY2xrX2lkOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL25hdTg4MjUuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbmF1ODgyNS5jCmluZGV4IDVjOTcwN2EuLmU2NDNiZTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbmF1ODgyNS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbmF1ODgyNS5jCkBAIC0yMTIsMzEgKzIxMiw2IEBACiAJMHhmYTJmLCAweGZhZWEsIDB4ZmJhNSwgMHhmYzYwLCAweGZkMWEsIDB4ZmRkNCwgMHhmZThlLCAweGZmNDcKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWkgKm5hdTg4MjVfZ2V0X2NvZGVjX2RhaShzdHJ1Y3QgbmF1ODgyNSAqbmF1ODgyNSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMobmF1ODgyNS0+ZGFwbSk7Ci0Jc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQgPSAmY29kZWMtPmNvbXBvbmVudDsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwgKl9kYWk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY29kZWNfZGFpLCBfZGFpLCAmY29tcG9uZW50LT5kYWlfbGlzdCwgbGlzdCkgewotCQlpZiAoIXN0cm5jbXAoY29kZWNfZGFpLT5uYW1lLCBOVVZPVE9OX0NPREVDX0RBSSwKLQkJCXN0cmxlbihOVVZPVE9OX0NPREVDX0RBSSkpKQotCQkJcmV0dXJuIGNvZGVjX2RhaTsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBib29sIG5hdTg4MjVfZGFpX2lzX2FjdGl2ZShzdHJ1Y3QgbmF1ODgyNSAqbmF1ODgyNSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IG5hdTg4MjVfZ2V0X2NvZGVjX2RhaShuYXU4ODI1KTsKLQotCWlmIChjb2RlY19kYWkpIHsKLQkJaWYgKGNvZGVjX2RhaS0+cGxheWJhY2tfYWN0aXZlIHx8IGNvZGVjX2RhaS0+Y2FwdHVyZV9hY3RpdmUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCiAvKioKICAqIG5hdTg4MjVfc2VtYV9hY3F1aXJlIC0gYWNxdWlyZSB0aGUgc2VtYXBob3JlIG9mIG5hdTg4bDI1CiAgKiBAbmF1ODgyNTogIGNvbXBvbmVudCB0byByZWdpc3RlciB0aGUgY29kZWMgcHJpdmF0ZSBkYXRhIHdpdGgKQEAgLTI1MCwxOSArMjI1LDI2IEBACiAgKiBBY3F1aXJlcyB0aGUgc2VtYXBob3JlIHdpdGhvdXQgamlmZmllcy4gSWYgbm8gbW9yZSB0YXNrcyBhcmUgYWxsb3dlZAogICogdG8gYWNxdWlyZSB0aGUgc2VtYXBob3JlLCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBwdXQgdGhlIHRhc2sgdG8KICAqIHNsZWVwIHVudGlsIHRoZSBzZW1hcGhvcmUgaXMgcmVsZWFzZWQuCi0gKiBJdCByZXR1cm5zIGlmIHRoZSBzZW1hcGhvcmUgd2FzIGFjcXVpcmVkLgorICogSWYgdGhlIHNlbWFwaG9yZSBpcyBub3QgcmVsZWFzZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGppZmZpZXMsCisgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgLUVUSU1FLgorICogSWYgdGhlIHNsZWVwIGlzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIC1FSU5UUi4KKyAqIEl0IHJldHVybnMgMCBpZiB0aGUgc2VtYXBob3JlIHdhcyBhY3F1aXJlZCBzdWNjZXNzZnVsbHkuCiAgKi8KLXN0YXRpYyB2b2lkIG5hdTg4MjVfc2VtYV9hY3F1aXJlKHN0cnVjdCBuYXU4ODI1ICpuYXU4ODI1LCBsb25nIHRpbWVvdXQpCitzdGF0aWMgaW50IG5hdTg4MjVfc2VtYV9hY3F1aXJlKHN0cnVjdCBuYXU4ODI1ICpuYXU4ODI1LCBsb25nIHRpbWVvdXQpCiB7CiAJaW50IHJldDsKIAotCWlmICh0aW1lb3V0KQorCWlmICh0aW1lb3V0KSB7CiAJCXJldCA9IGRvd25fdGltZW91dCgmbmF1ODgyNS0+eHRhbGtfc2VtLCB0aW1lb3V0KTsKLQllbHNlCisJCWlmIChyZXQgPCAwKQorCQkJZGV2X3dhcm4obmF1ODgyNS0+ZGV2LCAiQWNxdWlyZSBzZW1hcGhvbmUgdGltZW91dFxuIik7CisJfSBlbHNlIHsKIAkJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZuYXU4ODI1LT54dGFsa19zZW0pOworCQlpZiAocmV0IDwgMCkKKwkJCWRldl93YXJuKG5hdTg4MjUtPmRldiwgIkFjcXVpcmUgc2VtYXBob25lIGZhaWxcbiIpOworCX0KIAotCWlmIChyZXQgPCAwKQotCQlkZXZfd2FybihuYXU4ODI1LT5kZXYsICJBY3F1aXJlIHNlbWFwaG9uZSBmYWlsXG4iKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTEyMDUsNiArMTE4Nyw4IEBACiAJc3RydWN0IG5hdTg4MjUgKm5hdTg4MjUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAl1bnNpZ25lZCBpbnQgdmFsX2xlbiA9IDA7CiAKKwluYXU4ODI1X3NlbWFfYWNxdWlyZShuYXU4ODI1LCAyICogSFopOworCiAJc3dpdGNoIChwYXJhbXNfd2lkdGgocGFyYW1zKSkgewogCWNhc2UgMTY6CiAJCXZhbF9sZW4gfD0gTkFVODgyNV9JMlNfRExfMTY7CkBAIC0xMjI1LDYgKzEyMDksOSBAQAogCXJlZ21hcF91cGRhdGVfYml0cyhuYXU4ODI1LT5yZWdtYXAsIE5BVTg4MjVfUkVHX0kyU19QQ01fQ1RSTDEsCiAJCU5BVTg4MjVfSTJTX0RMX01BU0ssIHZhbF9sZW4pOwogCisJLyogUmVsZWFzZSB0aGUgc2VtYXBob25lLiAqLworCW5hdTg4MjVfc2VtYV9yZWxlYXNlKG5hdTg4MjUpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyMzQsNiArMTIyMSw4IEBACiAJc3RydWN0IG5hdTg4MjUgKm5hdTg4MjUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAl1bnNpZ25lZCBpbnQgY3RybDFfdmFsID0gMCwgY3RybDJfdmFsID0gMDsKIAorCW5hdTg4MjVfc2VtYV9hY3F1aXJlKG5hdTg4MjUsIDIgKiBIWik7CisKIAlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgogCQljdHJsMl92YWwgfD0gTkFVODgyNV9JMlNfTVNfTUFTVEVSOwpAQCAtMTI4Miw2ICsxMjcxLDkgQEAKIAlyZWdtYXBfdXBkYXRlX2JpdHMobmF1ODgyNS0+cmVnbWFwLCBOQVU4ODI1X1JFR19JMlNfUENNX0NUUkwyLAogCQlOQVU4ODI1X0kyU19NU19NQVNLLCBjdHJsMl92YWwpOwogCisJLyogUmVsZWFzZSB0aGUgc2VtYXBob25lLiAqLworCW5hdTg4MjVfc2VtYV9yZWxlYXNlKG5hdTg4MjUpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2MTEsOCArMTYwMywxMSBAQAogCQkJCQkgKiBjZXNzIGFuZCByZXN0b3JlIGNoYW5nZXMgaWYgcHJvY2VzcwogCQkJCQkgKiBpcyBvbmdvaW5nIHdoZW4gZWplY3Rpb24uCiAJCQkJCSAqLworCQkJCQlpbnQgcmV0OwogCQkJCQluYXU4ODI1LT54dGFsa19wcm90ZWN0ID0gdHJ1ZTsKLQkJCQkJbmF1ODgyNV9zZW1hX2FjcXVpcmUobmF1ODgyNSwgMCk7CisJCQkJCXJldCA9IG5hdTg4MjVfc2VtYV9hY3F1aXJlKG5hdTg4MjUsIDApOworCQkJCQlpZiAocmV0IDwgMCkKKwkJCQkJCW5hdTg4MjUtPnh0YWxrX3Byb3RlY3QgPSBmYWxzZTsKIAkJCQl9CiAJCQkJLyogU3RhcnR1cCBjcm9zcyB0YWxrIGRldGVjdGlvbiBwcm9jZXNzICovCiAJCQkJbmF1ODgyNS0+eHRhbGtfc3RhdGUgPSBOQVU4ODI1X1hUQUxLX1BSRVBBUkU7CkBAIC0xOTEyLDcgKzE5MDcsNyBAQAogCS8qIENhbGN1bGF0ZSB0aGUgRkxMIDEwLWJpdCBpbnRlZ2VyIGlucHV0IGFuZCB0aGUgRkxMIDE2LWJpdCBmcmFjdGlvbmFsCiAJICogaW5wdXQgYmFzZWQgb24gRkRDTywgRlJFRiBhbmQgRkxMIHJhdGlvLgogCSAqLwotCWZ2Y28gPSBkaXZfdTY0KGZ2Y28gPDwgMTYsIGZyZWYgKiBmbGxfcGFyYW0tPnJhdGlvKTsKKwlmdmNvID0gZGl2X3U2NChmdmNvX21heCA8PCAxNiwgZnJlZiAqIGZsbF9wYXJhbS0+cmF0aW8pOwogCWZsbF9wYXJhbS0+ZmxsX2ludCA9IChmdmNvID4+IDE2KSAmIDB4M0ZGOwogCWZsbF9wYXJhbS0+ZmxsX2ZyYWMgPSBmdmNvICYgMHhGRkZGOwogCXJldHVybiAwOwpAQCAtMjIzOCwyMyArMjIzMywxNCBAQAogc3RhdGljIGludCBfX21heWJlX3VudXNlZCBuYXU4ODI1X3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IG5hdTg4MjUgKm5hdTg4MjUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OwogCiAJcmVnY2FjaGVfY2FjaGVfb25seShuYXU4ODI1LT5yZWdtYXAsIGZhbHNlKTsKIAlyZWdjYWNoZV9zeW5jKG5hdTg4MjUtPnJlZ21hcCk7Ci0JaWYgKG5hdTg4MjVfaXNfamFja19pbnNlcnRlZChuYXU4ODI1LT5yZWdtYXApKSB7Ci0JCS8qIElmIHRoZSBqYWNrIGlzIGluc2VydGVkLCB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHBsYXktCi0JCSAqIGJhY2sgaXMgYWN0aXZlIGJlZm9yZSBzdXNwZW5kLiBJZiBhY3RpdmUsIHRoZSBkcml2ZXIgaGFzIHRvCi0JCSAqIHJhaXNlIHRoZSBwcm90ZWN0aW9uIGZvciBjcm9zcyB0YWxrIGZ1bmN0aW9uIHRvIGF2b2lkIHRoZQotCQkgKiBwbGF5YmFjayByZWNvdmVycyBiZWZvcmUgY3Jvc3MgdGFsayBwcm9jZXNzIGZpbmlzaC4gT3RoZXItCi0JCSAqIHdpc2UsIHRoZSBwbGF5YmFjayB3aWxsIGJlIGludGVyZmVyZWQgYnkgY3Jvc3MgdGFsayBmdW5jLQotCQkgKiB0aW9uLiBJdCBpcyBiZXR0ZXIgdG8gYXBwbHkgaGFyZHdhcmUgcmVsYXRlZCBwYXJhbWV0ZXJzCi0JCSAqIGJlZm9yZSBzdGFydGluZyBwbGF5YmFjayBvciByZWNvcmQuCi0JCSAqLwotCQlpZiAobmF1ODgyNV9kYWlfaXNfYWN0aXZlKG5hdTg4MjUpKSB7Ci0JCQluYXU4ODI1LT54dGFsa19wcm90ZWN0ID0gdHJ1ZTsKLQkJCW5hdTg4MjVfc2VtYV9hY3F1aXJlKG5hdTg4MjUsIDApOwotCQl9Ci0JfQorCW5hdTg4MjUtPnh0YWxrX3Byb3RlY3QgPSB0cnVlOworCXJldCA9IG5hdTg4MjVfc2VtYV9hY3F1aXJlKG5hdTg4MjUsIDApOworCWlmIChyZXQgPCAwKQorCQluYXU4ODI1LT54dGFsa19wcm90ZWN0ID0gZmFsc2U7CiAJZW5hYmxlX2lycShuYXU4ODI1LT5pcnEpOwogCiAJcmV0dXJuIDA7CkBAIC0yMjcwLDEyICsyMjU2LDE0IEBACiAJLnN1c3BlbmQgPSBuYXU4ODI1X3N1c3BlbmQsCiAJLnJlc3VtZSA9IG5hdTg4MjVfcmVzdW1lLAogCi0JLmNvbnRyb2xzID0gbmF1ODgyNV9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShuYXU4ODI1X2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gbmF1ODgyNV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG5hdTg4MjVfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBuYXU4ODI1X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKG5hdTg4MjVfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gbmF1ODgyNV9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG5hdTg4MjVfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IG5hdTg4MjVfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUobmF1ODgyNV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gbmF1ODgyNV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUobmF1ODgyNV9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyB2b2lkIG5hdTg4MjVfcmVzZXRfY2hpcChzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3BjbTE2ODEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtMTY4MS5jCmluZGV4IDMzZTFmYzJkLi4wYjE0ZWZhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3BjbTE2ODEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3BjbTE2ODEuYwpAQCAtMjg5LDEyICsyODksMTQgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9wY20xNjgxID0gewotCS5jb250cm9scwkJPSBwY20xNjgxX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShwY20xNjgxX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzCQk9IHBjbTE2ODFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShwY20xNjgxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCQk9IHBjbTE2ODFfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocGNtMTY4MV9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBwY20xNjgxX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocGNtMTY4MV9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcGNtMTY4MV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShwY20xNjgxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBwY20xNjgxX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShwY20xNjgxX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHBjbTE2ODFfaTJjX2lkW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3BjbTE3OXguYyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtMTc5eC5jCmluZGV4IDg4ZmJkZDEuLmI4MTNhMTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtMTc5eC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtMTc5eC5jCkBAIC0yMDYsMTIgKzIwNiwxNCBAQAogRVhQT1JUX1NZTUJPTF9HUEwocGNtMTc5eF9yZWdtYXBfY29uZmlnKTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3BjbTE3OXggPSB7Ci0JLmNvbnRyb2xzCQk9IHBjbTE3OXhfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHBjbTE3OXhfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMJCT0gcGNtMTc5eF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHBjbTE3OXhfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJCT0gcGNtMTc5eF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShwY20xNzl4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHBjbTE3OXhfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShwY20xNzl4X2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBwY20xNzl4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHBjbTE3OXhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHBjbTE3OXhfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHBjbTE3OXhfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBpbnQgcGNtMTc5eF9jb21tb25faW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtMzAwOC5jIGIvc291bmQvc29jL2NvZGVjcy9wY20zMDA4LmMKaW5kZXggOGZiNDQ1Zi4uNzA4YWYwNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9wY20zMDA4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9wY20zMDA4LmMKQEAgLTk5LDEwICs5OSwxMiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3BjbTMwMDggPSB7Ci0JLmRhcG1fd2lkZ2V0cyA9IHBjbTMwMDhfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShwY20zMDA4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gcGNtMzAwOF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShwY20zMDA4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSBwY20zMDA4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHBjbTMwMDhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHBjbTMwMDhfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHBjbTMwMDhfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHBjbTMwMDhfY29kZWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtMzE2OGEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtMzE2OGEuYwppbmRleCA5OTJhNzdlLi4zOWJjMDJkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3BjbTMxNjhhLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9wY20zMTY4YS5jCkBAIC01OTksMTIgKzU5OSwxNCBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHBjbTMxNjhhX2RyaXZlciA9IHsKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCi0JLmNvbnRyb2xzID0gcGNtMzE2OGFfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHBjbTMxNjhhX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHBjbTMxNjhhX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocGNtMzE2OGFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBwY20zMTY4YV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShwY20zMTY4YV9kYXBtX3JvdXRlcykKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHBjbTMxNjhhX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHBjbTMxNjhhX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcGNtMzE2OGFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocGNtMzE2OGFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHBjbTMxNjhhX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShwY20zMTY4YV9kYXBtX3JvdXRlcykKKwl9LAogfTsKIAogaW50IHBjbTMxNjhhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlZ21hcCAqcmVnbWFwKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9wY201MTJ4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3BjbTUxMnguYwppbmRleCAwNDdjNDg5Li43MmIxOWU2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3BjbTUxMnguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3BjbTUxMnguYwpAQCAtMTM0OCwxMiArMTM0OCwxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IHBjbTUxMnhfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gcGNtNTEyeF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShwY201MTJ4X2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gcGNtNTEyeF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHBjbTUxMnhfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBwY201MTJ4X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHBjbTUxMnhfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcGNtNTEyeF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHBjbTUxMnhfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHBjbTUxMnhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocGNtNTEyeF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcGNtNTEyeF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocGNtNTEyeF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlX2NmZyBwY201MTJ4X3JhbmdlID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDI4Ni5jIGIvc291bmQvc29jL2NvZGVjcy9ydDI4Ni5jCmluZGV4IDc0YzBlNGUuLjljMzY1YTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQyODYuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0Mjg2LmMKQEAgLTEwNTMsMTIgKzEwNTMsMTQgQEAKIAkucmVzdW1lID0gcnQyODZfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbCA9IHJ0Mjg2X3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKLQkuY29udHJvbHMgPSBydDI4Nl9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocnQyODZfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gcnQyODZfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShydDI4Nl9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHJ0Mjg2X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHJ0Mjg2X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHJ0Mjg2X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHJ0Mjg2X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcnQyODZfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocnQyODZfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHJ0Mjg2X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShydDI4Nl9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBydDI4Nl9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0Mjk4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0Mjk4LmMKaW5kZXggZjgwY2ZlNC4uNTU1NTg2NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDI5OC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQyOTguYwpAQCAtMTA5NSwxMiArMTA5NSwxNCBAQAogCS5yZXN1bWUgPSBydDI5OF9yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gcnQyOThfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAotCS5jb250cm9scyA9IHJ0Mjk4X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShydDI5OF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBydDI5OF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHJ0Mjk4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gcnQyOThfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocnQyOThfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcnQyOThfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocnQyOThfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBydDI5OF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShydDI5OF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcnQyOThfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHJ0Mjk4X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHJ0Mjk4X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NTE0LXNwaS5jIGIvc291bmQvc29jL2NvZGVjcy9ydDU1MTQtc3BpLmMKaW5kZXggNzdmZjhlYi4uMDkxMDNhYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU1MTQtc3BpLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU1MTQtc3BpLmMKQEAgLTIzNiw3ICsyMzYsNyBAQAogCXJldHVybiBieXRlc190b19mcmFtZXMocnVudGltZSwgcnQ1NTE0X2RzcC0+ZG1hX29mZnNldCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgcnQ1NTE0X3NwaV9wY21fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBydDU1MTRfc3BpX3BjbV9vcHMgPSB7CiAJLm9wZW4JCT0gcnQ1NTE0X3NwaV9wY21fb3BlbiwKIAkuaHdfcGFyYW1zCT0gcnQ1NTE0X3NwaV9od19wYXJhbXMsCiAJLmh3X2ZyZWUJPSBydDU1MTRfc3BpX2h3X2ZyZWUsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTUxNC5jIGIvc291bmQvc29jL2NvZGVjcy9ydDU1MTQuYwppbmRleCA3MTYyZjA1Li5mMjRiN2NmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0NTUxNC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NTE0LmMKQEAgLTI3OCw3ICsyNzgsNyBAQAogCTgsIDgsIFRMVl9EQl9TQ0FMRV9JVEVNKDE3MDAsIDAsIDApCiApOwogCi1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYWRjX3ZvbF90bHYsIC0xNzYyNSwgMzc1LCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGNfdm9sX3RsdiwgLTE3MjUsIDc1LCAwKTsKIAogc3RhdGljIGludCBydDU1MTRfZHNwX3ZvaWNlX3dha2VfdXBfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKQEAgLTM1MiwxMCArMzUyLDEwIEBACiAJU09DX0RPVUJMRV9UTFYoIk1JQyBCb29zdCBWb2x1bWUiLCBSVDU1MTRfQU5BX0NUUkxfTUlDQlNULAogCQlSVDU1MTRfU0VMX0JTVExfU0ZULCBSVDU1MTRfU0VMX0JTVFJfU0ZULCA4LCAwLCBic3RfdGx2KSwKIAlTT0NfRE9VQkxFX1JfVExWKCJBREMxIENhcHR1cmUgVm9sdW1lIiwgUlQ1NTE0X0RPV05GSUxURVIwX0NUUkwxLAotCQlSVDU1MTRfRE9XTkZJTFRFUjBfQ1RSTDIsIFJUNTUxNF9BRF9HQUlOX1NGVCwgMTI3LCAwLAorCQlSVDU1MTRfRE9XTkZJTFRFUjBfQ1RSTDIsIFJUNTUxNF9BRF9HQUlOX1NGVCwgNjMsIDAsCiAJCWFkY192b2xfdGx2KSwKIAlTT0NfRE9VQkxFX1JfVExWKCJBREMyIENhcHR1cmUgVm9sdW1lIiwgUlQ1NTE0X0RPV05GSUxURVIxX0NUUkwxLAotCQlSVDU1MTRfRE9XTkZJTFRFUjFfQ1RSTDIsIFJUNTUxNF9BRF9HQUlOX1NGVCwgMTI3LCAwLAorCQlSVDU1MTRfRE9XTkZJTFRFUjFfQ1RSTDIsIFJUNTUxNF9BRF9HQUlOX1NGVCwgNjMsIDAsCiAJCWFkY192b2xfdGx2KSwKIAlTT0NfU0lOR0xFX0VYVCgiRFNQIFZvaWNlIFdha2UgVXAiLCBTTkRfU09DX05PUE0sIDAsIDEsIDAsCiAJCXJ0NTUxNF9kc3Bfdm9pY2Vfd2FrZV91cF9nZXQsIHJ0NTUxNF9kc3Bfdm9pY2Vfd2FrZV91cF9wdXQpLApAQCAtMTAyMywxMiArMTAyMywxNCBAQAogCS5wcm9iZSA9IHJ0NTUxNF9wcm9iZSwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiAJLnNldF9iaWFzX2xldmVsID0gcnQ1NTE0X3NldF9iaWFzX2xldmVsLAotCS5jb250cm9scyA9IHJ0NTUxNF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocnQ1NTE0X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHJ0NTUxNF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHJ0NTUxNF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHJ0NTUxNF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShydDU1MTRfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcnQ1NTE0X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHJ0NTUxNF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHJ0NTUxNF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShydDU1MTRfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHJ0NTUxNF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocnQ1NTE0X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHJ0NTUxNF9pMmNfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU1MTQuaCBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NTE0LmgKaW5kZXggNjg4ODNjNi4uMjI5ZGUwZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU1MTQuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTUxNC5oCkBAIC0xOTYsOCArMTk2LDggQEAKICNkZWZpbmUgUlQ1NTE0X0FEX0FEX01JWF9CSVQJCQkxMAogI2RlZmluZSBSVDU1MTRfQURfQURfTVVURQkJCSgweDEgPDwgNykKICNkZWZpbmUgUlQ1NTE0X0FEX0FEX01VVEVfQklUCQkJNwotI2RlZmluZSBSVDU1MTRfQURfR0FJTl9NQVNLCQkJKDB4N2YgPDwgMCkKLSNkZWZpbmUgUlQ1NTE0X0FEX0dBSU5fU0ZUCQkJMAorI2RlZmluZSBSVDU1MTRfQURfR0FJTl9NQVNLCQkJKDB4M2YgPDwgMSkKKyNkZWZpbmUgUlQ1NTE0X0FEX0dBSU5fU0ZUCQkJMQogCiAvKiAgUlQ1NTE0X0FOQV9DVFJMX01JQ0JTVCAoMHgyMjIwKSAqLwogI2RlZmluZSBSVDU1MTRfU0VMX0JTVExfTUFTSwkJCSgweGYgPDwgNCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjE2LmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTYxNi5jCmluZGV4IGY1MjdiNWIuLmQxZjI3M2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjE2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2MTYuYwpAQCAtMjk0LDggKzI5NCw3IEBACiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYWRjX2JzdF90bHYsIDAsIDEyMDAsIDApOwogCiAvKiB7MCwgKzIwLCArMjQsICszMCwgKzM1LCArNDAsICs0NCwgKzUwLCArNTJ9IGRCICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGJzdF90bHZbXSA9IHsKLQlUTFZfREJfUkFOR0VfSEVBRCg3KSwKK3N0YXRpYyBjb25zdCBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1JBTkdFKGJzdF90bHYsCiAJMCwgMCwgVExWX0RCX1NDQUxFX0lURU0oMCwgMCwgMCksCiAJMSwgMSwgVExWX0RCX1NDQUxFX0lURU0oMjAwMCwgMCwgMCksCiAJMiwgMiwgVExWX0RCX1NDQUxFX0lURU0oMjQwMCwgMCwgMCksCkBAIC0zMDMsNyArMzAyLDcgQEAKIAk2LCA2LCBUTFZfREJfU0NBTEVfSVRFTSg0NDAwLCAwLCAwKSwKIAk3LCA3LCBUTFZfREJfU0NBTEVfSVRFTSg1MDAwLCAwLCAwKSwKIAk4LCA4LCBUTFZfREJfU0NBTEVfSVRFTSg1MjAwLCAwLCAwKSwKLX07CispOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjE2X3NuZF9jb250cm9sc1tdID0gewogCS8qIEhlYWRwaG9uZSBPdXRwdXQgVm9sdW1lICovCkBAIC0xMjY3LDE0ICsxMjY2LDE0IEBACiAjZGVmaW5lIFJUNTYxNl9GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8IFwKIAkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TOCkKIAotc3RydWN0IHNuZF9zb2NfZGFpX29wcyBydDU2MTZfYWlmX2RhaV9vcHMgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBydDU2MTZfYWlmX2RhaV9vcHMgPSB7CiAJLmh3X3BhcmFtcyA9IHJ0NTYxNl9od19wYXJhbXMsCiAJLnNldF9mbXQgPSBydDU2MTZfc2V0X2RhaV9mbXQsCiAJLnNldF9zeXNjbGsgPSBydDU2MTZfc2V0X2RhaV9zeXNjbGssCiAJLnNldF9wbGwgPSBydDU2MTZfc2V0X2RhaV9wbGwsCiB9OwogCi1zdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHJ0NTYxNl9kYWlbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHJ0NTYxNl9kYWlbXSA9IHsKIAl7CiAJCS5uYW1lID0gInJ0NTYxNi1haWYxIiwKIAkJLmlkID0gUlQ1NjE2X0FJRjEsCkBAIC0xMzAyLDEyICsxMzAxLDE0IEBACiAJLnJlc3VtZSA9IHJ0NTYxNl9yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gcnQ1NjE2X3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKLQkuY29udHJvbHMgPSBydDU2MTZfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHJ0NTYxNl9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBydDU2MTZfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShydDU2MTZfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBydDU2MTZfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocnQ1NjE2X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHJ0NTYxNl9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShydDU2MTZfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBydDU2MTZfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocnQ1NjE2X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBydDU2MTZfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHJ0NTYxNl9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBydDU2MTZfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2MzEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjMxLmMKaW5kZXggMWJlMmJhYi4uMGU0MTgwOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU2MzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTYzMS5jCkBAIC0xNjU3LDEyICsxNjU3LDE0IEBACiAJLnByb2JlID0gcnQ1NjMxX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHJ0NTYzMV9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCi0JLmNvbnRyb2xzID0gcnQ1NjMxX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShydDU2MzFfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gcnQ1NjMxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocnQ1NjMxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gcnQ1NjMxX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHJ0NTYzMV9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBydDU2MzFfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocnQ1NjMxX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcnQ1NjMxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHJ0NTYzMV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcnQ1NjMxX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShydDU2MzFfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcnQ1NjMxX2kyY19pZFtdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NDAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQwLmMKaW5kZXggMDllODk4OC4uM2NjMTEzNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU2NDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY0MC5jCkBAIC0xODcwLDYgKzE4NzAsOSBAQAogCWNhc2UgUlQ1NjQwX1NDTEtfU19QTEwxOgogCQlyZWdfdmFsIHw9IFJUNTY0MF9TQ0xLX1NSQ19QTEwxOwogCQlicmVhazsKKwljYXNlIFJUNTY0MF9TQ0xLX1NfUkNDTEs6CisJCXJlZ192YWwgfD0gUlQ1NjQwX1NDTEtfU1JDX1JDQ0xLOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbnZhbGlkIGNsb2NrIGlkICglZClcbiIsIGNsa19pZCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjI2MSwxMiArMjI2NCwxNCBAQAogCS5yZXN1bWUgPSBydDU2NDBfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbCA9IHJ0NTY0MF9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCi0JLmNvbnRyb2xzID0gcnQ1NjQwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShydDU2NDBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gcnQ1NjQwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocnQ1NjQwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gcnQ1NjQwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHJ0NTY0MF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBydDU2NDBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocnQ1NjQwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcnQ1NjQwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHJ0NTY0MF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcnQ1NjQwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShydDU2NDBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgcnQ1NjQwX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQwLmggYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY0MC5oCmluZGV4IDU4YjY2NGIuLjkwYzg4NzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQwLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NDAuaApAQCAtOTg0LDYgKzk4NCw3IEBACiAjZGVmaW5lIFJUNTY0MF9TQ0xLX1NSQ19TRlQJCQkxNAogI2RlZmluZSBSVDU2NDBfU0NMS19TUkNfTUNMSwkJCSgweDAgPDwgMTQpCiAjZGVmaW5lIFJUNTY0MF9TQ0xLX1NSQ19QTEwxCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjQwX1NDTEtfU1JDX1JDQ0xLCQkJKDB4MiA8PCAxNCkKICNkZWZpbmUgUlQ1NjQwX1BMTDFfU1JDX01BU0sJCQkoMHgzIDw8IDEyKQogI2RlZmluZSBSVDU2NDBfUExMMV9TUkNfU0ZUCQkJMTIKICNkZWZpbmUgUlQ1NjQwX1BMTDFfU1JDX01DTEsJCQkoMHgwIDw8IDEyKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NDUuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQ1LmMKaW5kZXggNDkwYmZlNi4uMTBjMmE1NjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQ1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NDUuYwpAQCAtMzQ4NCwxMiArMzQ4NCwxNCBAQAogCS5yZXN1bWUgPSBydDU2NDVfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbCA9IHJ0NTY0NV9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCi0JLmNvbnRyb2xzID0gcnQ1NjQ1X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShydDU2NDVfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gcnQ1NjQ1X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocnQ1NjQ1X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gcnQ1NjQ1X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHJ0NTY0NV9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBydDU2NDVfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocnQ1NjQ1X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcnQ1NjQ1X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHJ0NTY0NV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcnQ1NjQ1X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShydDU2NDVfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgcnQ1NjQ1X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjUxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY1MS5jCmluZGV4IDdhNjE5NzAuLmY1ZDM0MTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjUxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NTEuYwpAQCAtMTcxMiwxMiArMTcxMiwxNCBAQAogCS5yZXN1bWUgPSBydDU2NTFfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbCA9IHJ0NTY1MV9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCi0JLmNvbnRyb2xzID0gcnQ1NjUxX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShydDU2NTFfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gcnQ1NjUxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocnQ1NjUxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gcnQ1NjUxX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHJ0NTY1MV9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBydDU2NTFfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocnQ1NjUxX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcnQ1NjUxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHJ0NTY1MV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcnQ1NjUxX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShydDU2NTFfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgcnQ1NjUxX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjU5LmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY1OS5jCmluZGV4IDFiMzA5MTQuLmRiNTQ1NTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjU5LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NTkuYwpAQCAtOSw2ICs5LDcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTM1NjUsNyArMzU2Niw5IEBACiBzdGF0aWMgaW50IHJ0NTY1OV9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJCQllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKIHsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKIAlzdHJ1Y3QgcnQ1NjU5X3ByaXYgKnJ0NTY1OSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQ7CiAKIAlzd2l0Y2ggKGxldmVsKSB7CiAJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKQEAgLTM1ODIsNiArMzU4NSwxNyBAQAogCQkJUlQ1NjU5X1BXUl9GVjEgfCBSVDU2NTlfUFdSX0ZWMik7CiAJCWJyZWFrOwogCisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJaWYgKGRhcG0tPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHJ0NTY1OS0+bWNsayk7CisJCQlpZiAocmV0KSB7CisJCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCQkiZmFpbGVkIHRvIGVuYWJsZSBNQ0xLOiAlZFxuIiwgcmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCWJyZWFrOworCiAJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgogCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjU5LT5yZWdtYXAsIFJUNTY1OV9QV1JfRElHXzEsCiAJCQlSVDU2NTlfUFdSX0xETywgMCk7CkBAIC0zNTkxLDYgKzM2MDUsNyBAQAogCQkJUlQ1NjU5X1BXUl9NQiB8IFJUNTY1OV9QV1JfVlJFRjIpOwogCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjU5LT5yZWdtYXAsIFJUNTY1OV9ESUdfTUlTQywKIAkJCVJUNTY1OV9ESUdfR0FURV9DVFJMLCAwKTsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHJ0NTY1OS0+bWNsayk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTM3MjIsMTIgKzM3MzcsMTQgQEAKIAkucmVzdW1lID0gcnQ1NjU5X3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBydDU2NTlfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAotCS5jb250cm9scyA9IHJ0NTY1OV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocnQ1NjU5X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHJ0NTY1OV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHJ0NTY1OV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHJ0NTY1OV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShydDU2NTlfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcnQ1NjU5X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHJ0NTY1OV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHJ0NTY1OV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShydDU2NTlfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHJ0NTY1OV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocnQ1NjU5X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogCkBAIC00MDIwLDYgKzQwMzcsMTUgQEAKIAogCXJlZ21hcF93cml0ZShydDU2NTktPnJlZ21hcCwgUlQ1NjU5X1JFU0VULCAwKTsKIAorCS8qIENoZWNrIGlmIE1DTEsgcHJvdmlkZWQgKi8KKwlydDU2NTktPm1jbGsgPSBkZXZtX2Nsa19nZXQoJmkyYy0+ZGV2LCAibWNsayIpOworCWlmIChJU19FUlIocnQ1NjU5LT5tY2xrKSkgeworCQlpZiAoUFRSX0VSUihydDU2NTktPm1jbGspICE9IC1FTk9FTlQpCisJCQlyZXR1cm4gUFRSX0VSUihydDU2NTktPm1jbGspOworCQkvKiBPdGhlcndpc2UgbWFyayB0aGUgbWNsayBwb2ludGVyIHRvIE5VTEwgKi8KKwkJcnQ1NjU5LT5tY2xrID0gTlVMTDsKKwl9CisKIAlydDU2NTlfY2FsaWJyYXRlKHJ0NTY1OSk7CiAKIAkvKiBsaW5lIGluIGRpZmYgbW9kZSovCkBAIC00MTYzLDYgKzQxODksOSBAQAogCQlpZiAocmV0KQogCQkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gcmVndWVzdCBJUlE6ICVkXG4iLCByZXQpOwogCisJCS8qIEVuYWJsZSBJUlEgb3V0cHV0IGZvciBHUElPMSBwaW4gYW55IHdheSAqLworCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjU5LT5yZWdtYXAsIFJUNTY1OV9HUElPX0NUUkxfMSwKKwkJCQkgICBSVDU2NTlfR1AxX1BJTl9NQVNLLCBSVDU2NTlfR1AxX1BJTl9JUlEpOwogCX0KIAogCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwgJnNvY19jb2RlY19kZXZfcnQ1NjU5LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NTkuaCBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjU5LmgKaW5kZXggZDMxYzllNS4uOGYxYWVlZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU2NTkuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY1OS5oCkBAIC0xODAsOSArMTgwLDkgQEAKICNkZWZpbmUgUlQ1NjU5X0lSUV9DVFJMXzEJCQkweDAwYjYKICNkZWZpbmUgUlQ1NjU5X0lSUV9DVFJMXzIJCQkweDAwYjcKICNkZWZpbmUgUlQ1NjU5X0lSUV9DVFJMXzMJCQkweDAwYjgKLSNkZWZpbmUgUlQ1NjU5X0lSUV9DVFJMXzQJCQkweDAwYjkKLSNkZWZpbmUgUlQ1NjU5X0lSUV9DVFJMXzUJCQkweDAwYmEKLSNkZWZpbmUgUlQ1NjU5X0lSUV9DVFJMXzYJCQkweDAwYmIKKyNkZWZpbmUgUlQ1NjU5X0lSUV9DVFJMXzQJCQkweDAwYmEKKyNkZWZpbmUgUlQ1NjU5X0lSUV9DVFJMXzUJCQkweDAwYmIKKyNkZWZpbmUgUlQ1NjU5X0lSUV9DVFJMXzYJCQkweDAwYmMKICNkZWZpbmUgUlQ1NjU5X0lOVF9TVF8xCQkJCTB4MDBiZQogI2RlZmluZSBSVDU2NTlfSU5UX1NUXzIJCQkJMHgwMGJmCiAjZGVmaW5lIFJUNTY1OV9HUElPX0NUUkxfMQkJCTB4MDBjMApAQCAtMTc5Niw2ICsxNzk2LDcgQEAKIAlzdHJ1Y3QgZ3Bpb19kZXNjICpncGlvZF9yZXNldDsKIAlzdHJ1Y3Qgc25kX3NvY19qYWNrICpoc19qYWNrOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgamFja19kZXRlY3Rfd29yazsKKwlzdHJ1Y3QgY2xrICptY2xrOwogCiAJaW50IHN5c2NsazsKIAlpbnQgc3lzY2xrX3NyYzsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjYwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY2MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMDkzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY2MC5jCkBAIC0wLDAgKzEsMTM1MyBAQAorLyoKKyAqIHJ0NTY2MC5jICAtLSAgUlQ1NjYwIEFMU0EgU29DIGF1ZGlvIGNvZGVjIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDE2IFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLgorICogQXV0aG9yOiBPZGVyIENoaW91IDxvZGVyX2NoaW91QHJlYWx0ZWsuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorCisjaW5jbHVkZSAicmw2MjMxLmgiCisjaW5jbHVkZSAicnQ1NjYwLmgiCisKKyNkZWZpbmUgUlQ1NjYwX0RFVklDRV9JRCAweDYzMzgKKworI2RlZmluZSBSVDU2NjBfUFJfUkFOR0VfQkFTRSAoMHhmZiArIDEpCisjZGVmaW5lIFJUNTY2MF9QUl9TUEFDSU5HIDB4MTAwCisKKyNkZWZpbmUgUlQ1NjYwX1BSX0JBU0UgKFJUNTY2MF9QUl9SQU5HRV9CQVNFICsgKDAgKiBSVDU2NjBfUFJfU1BBQ0lORykpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlX2NmZyBydDU2NjBfcmFuZ2VzW10gPSB7CisJeyAubmFtZSA9ICJQUiIsIC5yYW5nZV9taW4gPSBSVDU2NjBfUFJfQkFTRSwKKwkgIC5yYW5nZV9tYXggPSBSVDU2NjBfUFJfQkFTRSArIDB4ZjMsCisJICAuc2VsZWN0b3JfcmVnID0gUlQ1NjYwX1BSSVZfSU5ERVgsCisJICAuc2VsZWN0b3JfbWFzayA9IDB4ZmYsCisJICAuc2VsZWN0b3Jfc2hpZnQgPSAweDAsCisJICAud2luZG93X3N0YXJ0ID0gUlQ1NjYwX1BSSVZfREFUQSwKKwkgIC53aW5kb3dfbGVuID0gMHgxLCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfc2VxdWVuY2UgcnQ1NjYwX3BhdGNoW10gPSB7CisJeyBSVDU2NjBfQUxDX1BHQV9DVFJMMiwJCTB4NDRjMyB9LAorCXsgUlQ1NjYwX1BSX0JBU0UgKyAweDNkLAkweDI2MDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgcnQ1NjYwX3JlZ1tdID0geworCXsgMHgwMCwgMHgwMDAwIH0sCisJeyAweDAxLCAweGM4MDAgfSwKKwl7IDB4MDIsIDB4YzhjOCB9LAorCXsgMHgwZCwgMHgxMDEwIH0sCisJeyAweDBlLCAweDEwMTAgfSwKKwl7IDB4MTksIDB4YWZhZiB9LAorCXsgMHgxYywgMHgyZjJmIH0sCisJeyAweDFlLCAweDAwMDAgfSwKKwl7IDB4MjcsIDB4NjA2MCB9LAorCXsgMHgyOSwgMHg4MDgwIH0sCisJeyAweDJhLCAweDQyNDIgfSwKKwl7IDB4MmYsIDB4MDAwMCB9LAorCXsgMHgzYiwgMHgwMDAwIH0sCisJeyAweDNjLCAweDAwN2YgfSwKKwl7IDB4M2QsIDB4MDAwMCB9LAorCXsgMHgzZSwgMHgwMDdmIH0sCisJeyAweDQ1LCAweGUwMDAgfSwKKwl7IDB4NDYsIDB4MDAzZSB9LAorCXsgMHg0OCwgMHhmODAwIH0sCisJeyAweDRhLCAweDAwMDQgfSwKKwl7IDB4NGQsIDB4MDAwMCB9LAorCXsgMHg0ZSwgMHgwMDAwIH0sCisJeyAweDRmLCAweDAxZmYgfSwKKwl7IDB4NTAsIDB4MDAwMCB9LAorCXsgMHg1MSwgMHgwMDAwIH0sCisJeyAweDUyLCAweDAxZmYgfSwKKwl7IDB4NjEsIDB4MDAwMCB9LAorCXsgMHg2MiwgMHgwMDAwIH0sCisJeyAweDYzLCAweDAwYzAgfSwKKwl7IDB4NjQsIDB4MDAwMCB9LAorCXsgMHg2NSwgMHgwMDAwIH0sCisJeyAweDY2LCAweDAwMDAgfSwKKwl7IDB4NzAsIDB4ODAwMCB9LAorCXsgMHg3MywgMHg3MDAwIH0sCisJeyAweDc0LCAweDNjMDAgfSwKKwl7IDB4NzUsIDB4MjgwMCB9LAorCXsgMHg4MCwgMHgwMDAwIH0sCisJeyAweDgxLCAweDAwMDAgfSwKKwl7IDB4ODIsIDB4MDAwMCB9LAorCXsgMHg4YywgMHgwMjI4IH0sCisJeyAweDhkLCAweGEwMDAgfSwKKwl7IDB4OGUsIDB4MDAwMCB9LAorCXsgMHg5MiwgMHgwMDAwIH0sCisJeyAweDkzLCAweDMwMDAgfSwKKwl7IDB4YTEsIDB4MDA1OSB9LAorCXsgMHhhMiwgMHgwMDAxIH0sCisJeyAweGEzLCAweDVjODAgfSwKKwl7IDB4YTQsIDB4MDE0NiB9LAorCXsgMHhhNSwgMHgxZjFmIH0sCisJeyAweGE2LCAweDc4YzYgfSwKKwl7IDB4YTcsIDB4ZTVlYyB9LAorCXsgMHhhOCwgMHhiYTYxIH0sCisJeyAweGE5LCAweDNjNzggfSwKKwl7IDB4YWEsIDB4OGFlMiB9LAorCXsgMHhhYiwgMHhlNWVjIH0sCisJeyAweGFjLCAweGM2MDAgfSwKKwl7IDB4YWQsIDB4YmE2MSB9LAorCXsgMHhhZSwgMHgxN2VkIH0sCisJeyAweGIwLCAweDIwODAgfSwKKwl7IDB4YjEsIDB4MDAwMCB9LAorCXsgMHhiMywgMHgwMDFmIH0sCisJeyAweGI0LCAweDAyMGMgfSwKKwl7IDB4YjUsIDB4MWYwMCB9LAorCXsgMHhiNiwgMHgwMDAwIH0sCisJeyAweGI3LCAweDQwMDAgfSwKKwl7IDB4YmIsIDB4MDAwMCB9LAorCXsgMHhiZCwgMHgwMDAwIH0sCisJeyAweGJlLCAweDAwMDAgfSwKKwl7IDB4YmYsIDB4MDEwMCB9LAorCXsgMHhjMCwgMHgwMDAwIH0sCisJeyAweGMyLCAweDAwMDAgfSwKKwl7IDB4ZDMsIDB4YTIyMCB9LAorCXsgMHhkOSwgMHgwODA5IH0sCisJeyAweGRhLCAweDAwMDAgfSwKKwl7IDB4ZTAsIDB4ODAwMCB9LAorCXsgMHhlMSwgMHgwMjAwIH0sCisJeyAweGUyLCAweDgwMDAgfSwKKwl7IDB4ZTMsIDB4MDIwMCB9LAorCXsgMHhlNCwgMHgwZjIwIH0sCisJeyAweGU1LCAweDAwMWYgfSwKKwl7IDB4ZTYsIDB4MDIwYyB9LAorCXsgMHhlNywgMHgxZjAwIH0sCisJeyAweGU4LCAweDAwMDAgfSwKKwl7IDB4ZTksIDB4NDAwMCB9LAorCXsgMHhlYSwgMHgwMGE2IH0sCisJeyAweGViLCAweDA0YzMgfSwKKwl7IDB4ZWMsIDB4MjdjOCB9LAorCXsgMHhlZCwgMHg3NDE4IH0sCisJeyAweGVlLCAweGJmNTAgfSwKKwl7IDB4ZWYsIDB4MDA0NSB9LAorCXsgMHhmMCwgMHgwMDA3IH0sCisJeyAweGZhLCAweDAwMDAgfSwKKwl7IDB4ZmQsIDB4MDAwMCB9LAorCXsgMHhmZSwgMHgxMGVjIH0sCisJeyAweGZmLCAweDYzMzggfSwKK307CisKK3N0YXRpYyBib29sIHJ0NTY2MF92b2xhdGlsZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShydDU2NjBfcmFuZ2VzKTsgaSsrKQorCQlpZiAoKHJlZyA+PSBydDU2NjBfcmFuZ2VzW2ldLndpbmRvd19zdGFydCAmJgorCQkgICAgIHJlZyA8PSBydDU2NjBfcmFuZ2VzW2ldLndpbmRvd19zdGFydCArCisJCSAgICAgcnQ1NjYwX3Jhbmdlc1tpXS53aW5kb3dfbGVuKSB8fAorCQkgICAgKHJlZyA+PSBydDU2NjBfcmFuZ2VzW2ldLnJhbmdlX21pbiAmJgorCQkgICAgIHJlZyA8PSBydDU2NjBfcmFuZ2VzW2ldLnJhbmdlX21heCkpCisJCQlyZXR1cm4gdHJ1ZTsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBSVDU2NjBfUkVTRVQ6CisJY2FzZSBSVDU2NjBfUFJJVl9EQVRBOgorCWNhc2UgUlQ1NjYwX0VRX0NUUkwxOgorCWNhc2UgUlQ1NjYwX0lSUV9DVFJMMjoKKwljYXNlIFJUNTY2MF9JTlRfSVJRX1NUOgorCWNhc2UgUlQ1NjYwX1ZFTkRPUl9JRDoKKwljYXNlIFJUNTY2MF9WRU5ET1JfSUQxOgorCWNhc2UgUlQ1NjYwX1ZFTkRPUl9JRDI6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBib29sIHJ0NTY2MF9yZWFkYWJsZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShydDU2NjBfcmFuZ2VzKTsgaSsrKQorCQlpZiAoKHJlZyA+PSBydDU2NjBfcmFuZ2VzW2ldLndpbmRvd19zdGFydCAmJgorCQkgICAgIHJlZyA8PSBydDU2NjBfcmFuZ2VzW2ldLndpbmRvd19zdGFydCArCisJCSAgICAgcnQ1NjYwX3Jhbmdlc1tpXS53aW5kb3dfbGVuKSB8fAorCQkgICAgKHJlZyA+PSBydDU2NjBfcmFuZ2VzW2ldLnJhbmdlX21pbiAmJgorCQkgICAgIHJlZyA8PSBydDU2NjBfcmFuZ2VzW2ldLnJhbmdlX21heCkpCisJCQlyZXR1cm4gdHJ1ZTsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBSVDU2NjBfUkVTRVQ6CisJY2FzZSBSVDU2NjBfU1BLX1ZPTDoKKwljYXNlIFJUNTY2MF9MT1VUX1ZPTDoKKwljYXNlIFJUNTY2MF9JTjFfSU4yOgorCWNhc2UgUlQ1NjYwX0lOM19JTjQ6CisJY2FzZSBSVDU2NjBfREFDMV9ESUdfVk9MOgorCWNhc2UgUlQ1NjYwX1NUTzFfQURDX0RJR19WT0w6CisJY2FzZSBSVDU2NjBfQURDX0JTVF9WT0wxOgorCWNhc2UgUlQ1NjYwX1NUTzFfQURDX01JWEVSOgorCWNhc2UgUlQ1NjYwX0FEX0RBX01JWEVSOgorCWNhc2UgUlQ1NjYwX1NUT19EQUNfTUlYRVI6CisJY2FzZSBSVDU2NjBfRElHX0lORjFfREFUQToKKwljYXNlIFJUNTY2MF9SRUNfTDFfTUlYRVI6CisJY2FzZSBSVDU2NjBfUkVDX0wyX01JWEVSOgorCWNhc2UgUlQ1NjYwX1JFQ19SMV9NSVhFUjoKKwljYXNlIFJUNTY2MF9SRUNfUjJfTUlYRVI6CisJY2FzZSBSVDU2NjBfTE9VVF9NSVhFUjoKKwljYXNlIFJUNTY2MF9TUEtfTUlYRVI6CisJY2FzZSBSVDU2NjBfU1BPX01JWEVSOgorCWNhc2UgUlQ1NjYwX1NQT19DTFNEX1JBVElPOgorCWNhc2UgUlQ1NjYwX09VVF9MX0dBSU4xOgorCWNhc2UgUlQ1NjYwX09VVF9MX0dBSU4yOgorCWNhc2UgUlQ1NjYwX09VVF9MMV9NSVhFUjoKKwljYXNlIFJUNTY2MF9PVVRfUl9HQUlOMToKKwljYXNlIFJUNTY2MF9PVVRfUl9HQUlOMjoKKwljYXNlIFJUNTY2MF9PVVRfUjFfTUlYRVI6CisJY2FzZSBSVDU2NjBfUFdSX0RJRzE6CisJY2FzZSBSVDU2NjBfUFdSX0RJRzI6CisJY2FzZSBSVDU2NjBfUFdSX0FOTEcxOgorCWNhc2UgUlQ1NjYwX1BXUl9BTkxHMjoKKwljYXNlIFJUNTY2MF9QV1JfTUlYRVI6CisJY2FzZSBSVDU2NjBfUFdSX1ZPTDoKKwljYXNlIFJUNTY2MF9QUklWX0lOREVYOgorCWNhc2UgUlQ1NjYwX1BSSVZfREFUQToKKwljYXNlIFJUNTY2MF9JMlMxX1NEUDoKKwljYXNlIFJUNTY2MF9BRERBX0NMSzE6CisJY2FzZSBSVDU2NjBfQUREQV9DTEsyOgorCWNhc2UgUlQ1NjYwX0RNSUNfQ1RSTDE6CisJY2FzZSBSVDU2NjBfR0xCX0NMSzoKKwljYXNlIFJUNTY2MF9QTExfQ1RSTDE6CisJY2FzZSBSVDU2NjBfUExMX0NUUkwyOgorCWNhc2UgUlQ1NjYwX0NMU0RfQU1QX09DX0NUUkw6CisJY2FzZSBSVDU2NjBfQ0xTRF9BTVBfQ1RSTDoKKwljYXNlIFJUNTY2MF9MT1VUX0FNUF9DVFJMOgorCWNhc2UgUlQ1NjYwX1NQS19BTVBfU1BLVkREOgorCWNhc2UgUlQ1NjYwX01JQ0JJQVM6CisJY2FzZSBSVDU2NjBfQ0xTRF9PVVRfQ1RSTDE6CisJY2FzZSBSVDU2NjBfQ0xTRF9PVVRfQ1RSTDI6CisJY2FzZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMMToKKwljYXNlIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkwyOgorCWNhc2UgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDM6CisJY2FzZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMNDoKKwljYXNlIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkw1OgorCWNhc2UgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDY6CisJY2FzZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMNzoKKwljYXNlIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkw4OgorCWNhc2UgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDk6CisJY2FzZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMMTA6CisJY2FzZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMMTE6CisJY2FzZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMMTI6CisJY2FzZSBSVDU2NjBfRVFfQ1RSTDE6CisJY2FzZSBSVDU2NjBfRVFfQ1RSTDI6CisJY2FzZSBSVDU2NjBfRFJDX0FHQ19DVFJMMToKKwljYXNlIFJUNTY2MF9EUkNfQUdDX0NUUkwyOgorCWNhc2UgUlQ1NjYwX0RSQ19BR0NfQ1RSTDM6CisJY2FzZSBSVDU2NjBfRFJDX0FHQ19DVFJMNDoKKwljYXNlIFJUNTY2MF9EUkNfQUdDX0NUUkw1OgorCWNhc2UgUlQ1NjYwX0pEX0NUUkw6CisJY2FzZSBSVDU2NjBfSVJRX0NUUkwxOgorCWNhc2UgUlQ1NjYwX0lSUV9DVFJMMjoKKwljYXNlIFJUNTY2MF9JTlRfSVJRX1NUOgorCWNhc2UgUlQ1NjYwX0dQSU9fQ1RSTDE6CisJY2FzZSBSVDU2NjBfR1BJT19DVFJMMjoKKwljYXNlIFJUNTY2MF9XSU5EX0ZJTFRFUl9DVFJMMToKKwljYXNlIFJUNTY2MF9TVl9aQ0QxOgorCWNhc2UgUlQ1NjYwX1NWX1pDRDI6CisJY2FzZSBSVDU2NjBfRFJDMV9MTV9DVFJMMToKKwljYXNlIFJUNTY2MF9EUkMxX0xNX0NUUkwyOgorCWNhc2UgUlQ1NjYwX0RSQzJfTE1fQ1RSTDE6CisJY2FzZSBSVDU2NjBfRFJDMl9MTV9DVFJMMjoKKwljYXNlIFJUNTY2MF9NVUxUSV9EUkNfQ1RSTDoKKwljYXNlIFJUNTY2MF9EUkMyX0NUUkwxOgorCWNhc2UgUlQ1NjYwX0RSQzJfQ1RSTDI6CisJY2FzZSBSVDU2NjBfRFJDMl9DVFJMMzoKKwljYXNlIFJUNTY2MF9EUkMyX0NUUkw0OgorCWNhc2UgUlQ1NjYwX0RSQzJfQ1RSTDU6CisJY2FzZSBSVDU2NjBfQUxDX1BHQV9DVFJMMToKKwljYXNlIFJUNTY2MF9BTENfUEdBX0NUUkwyOgorCWNhc2UgUlQ1NjYwX0FMQ19QR0FfQ1RSTDM6CisJY2FzZSBSVDU2NjBfQUxDX1BHQV9DVFJMNDoKKwljYXNlIFJUNTY2MF9BTENfUEdBX0NUUkw1OgorCWNhc2UgUlQ1NjYwX0FMQ19QR0FfQ1RSTDY6CisJY2FzZSBSVDU2NjBfQUxDX1BHQV9DVFJMNzoKKwljYXNlIFJUNTY2MF9HRU5fQ1RSTDE6CisJY2FzZSBSVDU2NjBfR0VOX0NUUkwyOgorCWNhc2UgUlQ1NjYwX0dFTl9DVFJMMzoKKwljYXNlIFJUNTY2MF9WRU5ET1JfSUQ6CisJY2FzZSBSVDU2NjBfVkVORE9SX0lEMToKKwljYXNlIFJUNTY2MF9WRU5ET1JfSUQyOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUocnQ1NjYwX291dF92b2xfdGx2LCAtNDY1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShydDU2NjBfZGFjX3ZvbF90bHYsIC02NTI1LCA3NSwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUocnQ1NjYwX2FkY192b2xfdGx2LCAtMTcyNSwgNzUsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHJ0NTY2MF9hZGNfYnN0X3RsdiwgMCwgMTIwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUocnQ1NjYwX2JzdF90bHYsIC0xMjAwLCA3NSwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjBfc25kX2NvbnRyb2xzW10gPSB7CisJLyogU3BlYWtlciBPdXRwdXQgVm9sdW1lICovCisJU09DX1NJTkdMRSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCBSVDU2NjBfU1BLX1ZPTCwgUlQ1NjYwX0xfTVVURV9TRlQsCisJCTEsIDEpLAorCVNPQ19TSU5HTEVfVExWKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIFJUNTY2MF9TUEtfVk9MLAorCQlSVDU2NjBfTF9WT0xfU0ZULCAzOSwgMSwgcnQ1NjYwX291dF92b2xfdGx2KSwKKworCS8qIE9VVFBVVCBDb250cm9sICovCisJU09DX0RPVUJMRSgiT1VUIFBsYXliYWNrIFN3aXRjaCIsIFJUNTY2MF9MT1VUX1ZPTCwgUlQ1NjYwX0xfTVVURV9TRlQsCisJCVJUNTY2MF9SX01VVEVfU0ZULCAxLCAxKSwKKwlTT0NfRE9VQkxFX1RMVigiT1VUIFBsYXliYWNrIFZvbHVtZSIsIFJUNTY2MF9MT1VUX1ZPTCwgUlQ1NjYwX0xfVk9MX1NGVCwKKwkJUlQ1NjYwX1JfVk9MX1NGVCwgMzksIDEsIHJ0NTY2MF9vdXRfdm9sX3RsdiksCisKKwkvKiBEQUMgRGlnaXRhbCBWb2x1bWUgKi8KKwlTT0NfRE9VQkxFX1RMVigiREFDMSBQbGF5YmFjayBWb2x1bWUiLCBSVDU2NjBfREFDMV9ESUdfVk9MLAorCQlSVDU2NjBfREFDX0wxX1ZPTF9TRlQsIFJUNTY2MF9EQUNfUjFfVk9MX1NGVCwgODcsIDAsCisJCXJ0NTY2MF9kYWNfdm9sX3RsdiksCisKKwkvKiBJTjEvSU4yL0lOMyBDb250cm9sICovCisJU09DX1NJTkdMRV9UTFYoIklOMSBCb29zdCBWb2x1bWUiLCBSVDU2NjBfSU4xX0lOMiwgUlQ1NjYwX0JTVF9TRlQxLCA2OSwKKwkJMCwgcnQ1NjYwX2JzdF90bHYpLAorCVNPQ19TSU5HTEVfVExWKCJJTjIgQm9vc3QgVm9sdW1lIiwgUlQ1NjYwX0lOMV9JTjIsIFJUNTY2MF9CU1RfU0ZUMiwgNjksCisJCTAsIHJ0NTY2MF9ic3RfdGx2KSwKKwlTT0NfU0lOR0xFX1RMVigiSU4zIEJvb3N0IFZvbHVtZSIsIFJUNTY2MF9JTjNfSU40LCBSVDU2NjBfQlNUX1NGVDMsIDY5LAorCQkwLCBydDU2NjBfYnN0X3RsdiksCisKKwkvKiBBREMgRGlnaXRhbCBWb2x1bWUgQ29udHJvbCAqLworCVNPQ19ET1VCTEUoIkFEQyBDYXB0dXJlIFN3aXRjaCIsIFJUNTY2MF9TVE8xX0FEQ19ESUdfVk9MLAorCQlSVDU2NjBfTF9NVVRFX1NGVCwgUlQ1NjYwX1JfTVVURV9TRlQsIDEsIDEpLAorCVNPQ19ET1VCTEVfVExWKCJBREMgQ2FwdHVyZSBWb2x1bWUiLCBSVDU2NjBfU1RPMV9BRENfRElHX1ZPTCwKKwkJUlQ1NjYwX0FEQ19MX1ZPTF9TRlQsIFJUNTY2MF9BRENfUl9WT0xfU0ZULCA2MywgMCwKKwkJcnQ1NjYwX2FkY192b2xfdGx2KSwKKworCS8qIEFEQyBCb29zdCBWb2x1bWUgQ29udHJvbCAqLworCVNPQ19ET1VCTEVfVExWKCJTVE8xIEFEQyBCb29zdCBHYWluIFZvbHVtZSIsIFJUNTY2MF9BRENfQlNUX1ZPTDEsCisJCVJUNTY2MF9TVE8xX0FEQ19MX0JTVF9TRlQsIFJUNTY2MF9TVE8xX0FEQ19SX0JTVF9TRlQsIDMsIDAsCisJCXJ0NTY2MF9hZGNfYnN0X3RsdiksCit9OworCisvKioKKyAqIHJ0NTY2MF9zZXRfZG1pY19jbGsgLSBTZXQgcGFyYW1ldGVyIG9mIGRtaWMuCisgKgorICogQHc6IERBUE0gd2lkZ2V0LgorICogQGtjb250cm9sOiBUaGUga2NvbnRyb2wgb2YgdGhpcyB3aWRnZXQuCisgKiBAZXZlbnQ6IEV2ZW50IGlkLgorICoKKyAqLworc3RhdGljIGludCBydDU2NjBfc2V0X2RtaWNfY2xrKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCBydDU2NjBfcHJpdiAqcnQ1NjYwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IGlkeCwgcmF0ZTsKKworCXJhdGUgPSBydDU2NjAtPnN5c2NsayAvIHJsNjIzMV9nZXRfcHJlX2RpdihydDU2NjAtPnJlZ21hcCwKKwkJUlQ1NjYwX0FEREFfQ0xLMSwgUlQ1NjYwX0kyU19QRDFfU0ZUKTsKKwlpZHggPSBybDYyMzFfY2FsY19kbWljX2NsayhyYXRlKTsKKwlpZiAoaWR4IDwgMCkKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBETUlDIGNsb2NrXG4iKTsKKwllbHNlCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2MF9ETUlDX0NUUkwxLAorCQkJUlQ1NjYwX0RNSUNfQ0xLX01BU0ssIGlkeCA8PCBSVDU2NjBfRE1JQ19DTEtfU0ZUKTsKKworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYwX2lzX3N5c19jbGtfZnJvbV9wbGwoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKKwkJCSBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMoc291cmNlLT5kYXBtKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBSVDU2NjBfR0xCX0NMSyk7CisJdmFsICY9IFJUNTY2MF9TQ0xLX1NSQ19NQVNLOworCWlmICh2YWwgPT0gUlQ1NjYwX1NDTEtfU1JDX1BMTDEpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qIERpZ2l0YWwgTWl4ZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjBfc3RvMV9hZGNfbF9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkFEQzEgU3dpdGNoIiwgUlQ1NjYwX1NUTzFfQURDX01JWEVSLAorCQkJUlQ1NjYwX01fQURDX0wxX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJBREMyIFN3aXRjaCIsIFJUNTY2MF9TVE8xX0FEQ19NSVhFUiwKKwkJCVJUNTY2MF9NX0FEQ19MMl9TRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2MF9zdG8xX2FkY19yX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiQURDMSBTd2l0Y2giLCBSVDU2NjBfU1RPMV9BRENfTUlYRVIsCisJCQlSVDU2NjBfTV9BRENfUjFfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkFEQzIgU3dpdGNoIiwgUlQ1NjYwX1NUTzFfQURDX01JWEVSLAorCQkJUlQ1NjYwX01fQURDX1IyX1NGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYwX2RhY19sX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiU3RlcmVvIEFEQyBTd2l0Y2giLCBSVDU2NjBfQURfREFfTUlYRVIsCisJCQlSVDU2NjBfTV9BRENNSVhfTF9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiREFDMSBTd2l0Y2giLCBSVDU2NjBfQURfREFfTUlYRVIsCisJCQlSVDU2NjBfTV9EQUMxX0xfU0ZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjBfZGFjX3JfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJTdGVyZW8gQURDIFN3aXRjaCIsIFJUNTY2MF9BRF9EQV9NSVhFUiwKKwkJCVJUNTY2MF9NX0FEQ01JWF9SX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUMxIFN3aXRjaCIsIFJUNTY2MF9BRF9EQV9NSVhFUiwKKwkJCVJUNTY2MF9NX0RBQzFfUl9TRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2MF9zdG9fZGFjX2xfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJEQUMgTDEgU3dpdGNoIiwgUlQ1NjYwX1NUT19EQUNfTUlYRVIsCisJCQlSVDU2NjBfTV9EQUNfTDFfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkRBQyBSMSBTd2l0Y2giLCBSVDU2NjBfU1RPX0RBQ19NSVhFUiwKKwkJCVJUNTY2MF9NX0RBQ19SMV9TVE9fTF9TRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2MF9zdG9fZGFjX3JfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJEQUMgUjEgU3dpdGNoIiwgUlQ1NjYwX1NUT19EQUNfTUlYRVIsCisJCQlSVDU2NjBfTV9EQUNfUjFfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkRBQyBMMSBTd2l0Y2giLCBSVDU2NjBfU1RPX0RBQ19NSVhFUiwKKwkJCVJUNTY2MF9NX0RBQ19MMV9TVE9fUl9TRlQsIDEsIDEpLAorfTsKKworLyogQW5hbG9nIElucHV0IE1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYwX3JlY19sX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiQlNUMyBTd2l0Y2giLCBSVDU2NjBfUkVDX0wyX01JWEVSLAorCQkJUlQ1NjYwX01fQlNUM19STV9MX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJCU1QyIFN3aXRjaCIsIFJUNTY2MF9SRUNfTDJfTUlYRVIsCisJCQlSVDU2NjBfTV9CU1QyX1JNX0xfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkJTVDEgU3dpdGNoIiwgUlQ1NjYwX1JFQ19MMl9NSVhFUiwKKwkJCVJUNTY2MF9NX0JTVDFfUk1fTF9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiT1VUIE1JWEwgU3dpdGNoIiwgUlQ1NjYwX1JFQ19MMl9NSVhFUiwKKwkJCVJUNTY2MF9NX09NX0xfUk1fTF9TRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2MF9yZWNfcl9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkJTVDMgU3dpdGNoIiwgUlQ1NjYwX1JFQ19SMl9NSVhFUiwKKwkJCVJUNTY2MF9NX0JTVDNfUk1fUl9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQlNUMiBTd2l0Y2giLCBSVDU2NjBfUkVDX1IyX01JWEVSLAorCQkJUlQ1NjYwX01fQlNUMl9STV9SX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJCU1QxIFN3aXRjaCIsIFJUNTY2MF9SRUNfUjJfTUlYRVIsCisJCQlSVDU2NjBfTV9CU1QxX1JNX1JfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk9VVCBNSVhSIFN3aXRjaCIsIFJUNTY2MF9SRUNfUjJfTUlYRVIsCisJCQlSVDU2NjBfTV9PTV9SX1JNX1JfU0ZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjBfc3BrX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiQlNUMyBTd2l0Y2giLCBSVDU2NjBfU1BLX01JWEVSLAorCQkJUlQ1NjYwX01fQlNUM19TTV9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQlNUMSBTd2l0Y2giLCBSVDU2NjBfU1BLX01JWEVSLAorCQkJUlQ1NjYwX01fQlNUMV9TTV9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiREFDTCBTd2l0Y2giLCBSVDU2NjBfU1BLX01JWEVSLAorCQkJUlQ1NjYwX01fREFDTF9TTV9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiREFDUiBTd2l0Y2giLCBSVDU2NjBfU1BLX01JWEVSLAorCQkJUlQ1NjYwX01fREFDUl9TTV9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiT1VUTUlYTCBTd2l0Y2giLCBSVDU2NjBfU1BLX01JWEVSLAorCQkJUlQ1NjYwX01fT01fTF9TTV9TRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2MF9vdXRfbF9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkJTVDMgU3dpdGNoIiwgUlQ1NjYwX09VVF9MMV9NSVhFUiwKKwkJCVJUNTY2MF9NX0JTVDNfT01fTF9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQlNUMiBTd2l0Y2giLCBSVDU2NjBfT1VUX0wxX01JWEVSLAorCQkJUlQ1NjYwX01fQlNUMl9PTV9MX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJCU1QxIFN3aXRjaCIsIFJUNTY2MF9PVVRfTDFfTUlYRVIsCisJCQlSVDU2NjBfTV9CU1QxX09NX0xfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIlJFQ01JWEwgU3dpdGNoIiwgUlQ1NjYwX09VVF9MMV9NSVhFUiwKKwkJCVJUNTY2MF9NX1JNX0xfT01fTF9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiREFDUiBTd2l0Y2giLCBSVDU2NjBfT1VUX0wxX01JWEVSLAorCQkJUlQ1NjYwX01fREFDX1JfT01fTF9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiREFDTCBTd2l0Y2giLCBSVDU2NjBfT1VUX0wxX01JWEVSLAorCQkJUlQ1NjYwX01fREFDX0xfT01fTF9TRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2MF9vdXRfcl9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkJTVDIgU3dpdGNoIiwgUlQ1NjYwX09VVF9SMV9NSVhFUiwKKwkJCVJUNTY2MF9NX0JTVDJfT01fUl9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQlNUMSBTd2l0Y2giLCBSVDU2NjBfT1VUX1IxX01JWEVSLAorCQkJUlQ1NjYwX01fQlNUMV9PTV9SX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJSRUNNSVhSIFN3aXRjaCIsIFJUNTY2MF9PVVRfUjFfTUlYRVIsCisJCQlSVDU2NjBfTV9STV9SX09NX1JfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkRBQ1IgU3dpdGNoIiwgUlQ1NjYwX09VVF9SMV9NSVhFUiwKKwkJCVJUNTY2MF9NX0RBQ19SX09NX1JfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkRBQ0wgU3dpdGNoIiwgUlQ1NjYwX09VVF9SMV9NSVhFUiwKKwkJCVJUNTY2MF9NX0RBQ19MX09NX1JfU0ZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjBfc3BvX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiREFDUiBTd2l0Y2giLCBSVDU2NjBfU1BPX01JWEVSLAorCQkJUlQ1NjYwX01fREFDX1JfU1BNX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUNMIFN3aXRjaCIsIFJUNTY2MF9TUE9fTUlYRVIsCisJCQlSVDU2NjBfTV9EQUNfTF9TUE1fU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIlNQS1ZPTCBTd2l0Y2giLCBSVDU2NjBfU1BPX01JWEVSLAorCQkJUlQ1NjYwX01fU1ZfU1BNX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJCU1QxIFN3aXRjaCIsIFJUNTY2MF9TUE9fTUlYRVIsCisJCQlSVDU2NjBfTV9CU1QxX1NQTV9TRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2MF9sb3V0X21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiREFDIFN3aXRjaCIsIFJUNTY2MF9MT1VUX01JWEVSLAorCQkJUlQ1NjYwX01fREFDMV9MTV9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiT1VUTUlYIFN3aXRjaCIsIFJUNTY2MF9MT1VUX01JWEVSLAorCQkJUlQ1NjYwX01fTE9WT0xfTE1fU0ZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzcGtfdm9sX2NvbnRyb2wgPQorCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgUlQ1NjYwX1NQS19WT0wsCisJCVJUNTY2MF9WT0xfTF9TRlQsIDEsIDEpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbG91dF9sX3ZvbF9jb250cm9sID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIFJUNTY2MF9MT1VUX1ZPTCwKKwkJUlQ1NjYwX1ZPTF9MX1NGVCwgMSwgMSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsb3V0X3Jfdm9sX2NvbnRyb2wgPQorCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgUlQ1NjYwX0xPVVRfVk9MLAorCQlSVDU2NjBfVk9MX1JfU0ZULCAxLCAxKTsKKworLyogSW50ZXJmYWNlIGRhdGEgc2VsZWN0ICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ0NTY2MF9kYXRhX3NlbGVjdFtdID0geworCSJML1IiLCAiUi9MIiwgIkwvTCIsICJSL1IiCit9OworCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjYwX2lmMV9kYWNfZW51bSwKKwlSVDU2NjBfRElHX0lORjFfREFUQSwgUlQ1NjYwX0lGMV9EQUNfSU5fU0ZULCBydDU2NjBfZGF0YV9zZWxlY3QpOworCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjYwX2lmMV9hZGNfZW51bSwKKwlSVDU2NjBfRElHX0lORjFfREFUQSwgUlQ1NjYwX0lGMV9BRENfSU5fU0ZULCBydDU2NjBfZGF0YV9zZWxlY3QpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYwX2lmMV9kYWNfc3dhcF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIklGMSBEQUMgU3dhcCBTb3VyY2UiLCBydDU2NjBfaWYxX2RhY19lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2MF9pZjFfYWRjX3N3YXBfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJJRjEgQURDIFN3YXAgU291cmNlIiwgcnQ1NjYwX2lmMV9hZGNfZW51bSk7CisKK3N0YXRpYyBpbnQgcnQ1NjYwX2xvdXRfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2MF9MT1VUX0FNUF9DVFJMLAorCQkJUlQ1NjYwX0xPVVRfQ09fTUFTSyB8IFJUNTY2MF9MT1VUX0NCX01BU0ssCisJCQlSVDU2NjBfTE9VVF9DT19FTiB8IFJUNTY2MF9MT1VUX0NCX1BVKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjBfTE9VVF9BTVBfQ1RSTCwKKwkJCVJUNTY2MF9MT1VUX0NPX01BU0sgfCBSVDU2NjBfTE9VVF9DQl9NQVNLLAorCQkJUlQ1NjYwX0xPVVRfQ09fRElTIHwgUlQ1NjYwX0xPVVRfQ0JfUEQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgcnQ1NjYwX2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9TVVBQTFkoIkxETzIiLCBSVDU2NjBfUFdSX0FOTEcxLAorCQlSVDU2NjBfUFdSX0xETzJfQklULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJQTEwxIiwgUlQ1NjYwX1BXUl9BTkxHMiwKKwkJUlQ1NjYwX1BXUl9QTExfQklULCAwLCBOVUxMLCAwKSwKKworCS8qIE1JQ0JJQVMgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJNSUNCSUFTMSIsIFJUNTY2MF9QV1JfQU5MRzIsCisJCQlSVDU2NjBfUFdSX01CMV9CSVQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIk1JQ0JJQVMyIiwgUlQ1NjYwX1BXUl9BTkxHMiwKKwkJCVJUNTY2MF9QV1JfTUIyX0JJVCwgMCwgTlVMTCwgMCksCisKKwkvKiBJbnB1dCBTaWRlICovCisJLyogSW5wdXQgTGluZXMgKi8KKwlTTkRfU09DX0RBUE1fSU5QVVQoIkRNSUMgTDEiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkRNSUMgUjEiKSwKKworCVNORF9TT0NfREFQTV9JTlBVVCgiSU4xUCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiSU4xTiIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiSU4yUCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiSU4zUCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiSU4zTiIpLAorCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiRE1JQyBDTEsiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXJ0NTY2MF9zZXRfZG1pY19jbGssIFNORF9TT0NfREFQTV9QUkVfUE1VKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJETUlDIFBvd2VyIiwgUlQ1NjYwX0RNSUNfQ1RSTDEsCisJCVJUNTY2MF9ETUlDXzFfRU5fU0ZULCAwLCBOVUxMLCAwKSwKKworCS8qIEJvb3N0ICovCisJU05EX1NPQ19EQVBNX1BHQSgiQlNUMSIsIFJUNTY2MF9QV1JfQU5MRzIsIFJUNTY2MF9QV1JfQlNUMV9CSVQsIDAsCisJCU5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIkJTVDIiLCBSVDU2NjBfUFdSX0FOTEcyLCBSVDU2NjBfUFdSX0JTVDJfQklULCAwLAorCQlOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJCU1QzIiwgUlQ1NjYwX1BXUl9BTkxHMiwgUlQ1NjYwX1BXUl9CU1QzX0JJVCwgMCwKKwkJTlVMTCwgMCksCisKKwkvKiBSRUMgTWl4ZXIgKi8KKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJFQ01JWEwiLCBSVDU2NjBfUFdSX01JWEVSLCBSVDU2NjBfUFdSX1JNX0xfQklULAorCQkJMCwgcnQ1NjYwX3JlY19sX21peCwgQVJSQVlfU0laRShydDU2NjBfcmVjX2xfbWl4KSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSRUNNSVhSIiwgUlQ1NjYwX1BXUl9NSVhFUiwgUlQ1NjYwX1BXUl9STV9SX0JJVCwKKwkJCTAsIHJ0NTY2MF9yZWNfcl9taXgsIEFSUkFZX1NJWkUocnQ1NjYwX3JlY19yX21peCkpLAorCisJLyogQURDcyAqLworCVNORF9TT0NfREFQTV9BREMoIkFEQyBMIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQURDKCJBREMgUiIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCksCisKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJBREMgTCBwb3dlciIsIFJUNTY2MF9QV1JfRElHMSwKKwkJCVJUNTY2MF9QV1JfQURDX0xfQklULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJBREMgUiBwb3dlciIsIFJUNTY2MF9QV1JfRElHMSwKKwkJCVJUNTY2MF9QV1JfQURDX1JfQklULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJBREMgY2xvY2siLCBSVDU2NjBfUFJfQkFTRSArIFJUNTY2MF9DSE9QX0RBQ19BREMsCisJCQkxMiwgMCwgTlVMTCwgMCksCisKKwkvKiBBREMgTWl4ZXIgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJhZGMgc3RlcmVvMSBmaWx0ZXIiLCBSVDU2NjBfUFdSX0RJRzIsCisJCVJUNTY2MF9QV1JfQURDX1MxRl9CSVQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiU3RvMSBBREMgTUlYTCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJcnQ1NjYwX3N0bzFfYWRjX2xfbWl4LCBBUlJBWV9TSVpFKHJ0NTY2MF9zdG8xX2FkY19sX21peCkpLAorCVNORF9TT0NfREFQTV9NSVhFUigiU3RvMSBBREMgTUlYUiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJcnQ1NjYwX3N0bzFfYWRjX3JfbWl4LCBBUlJBWV9TSVpFKHJ0NTY2MF9zdG8xX2FkY19yX21peCkpLAorCisJLyogQURDICovCisJU05EX1NPQ19EQVBNX0FEQygiU3RlcmVvMSBBREMgTUlYTCIsIE5VTEwsIFJUNTY2MF9TVE8xX0FEQ19ESUdfVk9MLAorCQlSVDU2NjBfTF9NVVRFX1NGVCwgMSksCisJU05EX1NPQ19EQVBNX0FEQygiU3RlcmVvMSBBREMgTUlYUiIsIE5VTEwsIFJUNTY2MF9TVE8xX0FEQ19ESUdfVk9MLAorCQlSVDU2NjBfUl9NVVRFX1NGVCwgMSksCisKKwkvKiBEaWdpdGFsIEludGVyZmFjZSAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIkkyUzEiLCBSVDU2NjBfUFdSX0RJRzEsIFJUNTY2MF9QV1JfSTJTMV9CSVQsIDAsCisJCU5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIklGMSBEQUMiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIklGMSBEQUMgTCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiSUYxIERBQyBSIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJJRjEgREFDIFN3YXAgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJJnJ0NTY2MF9pZjFfZGFjX3N3YXBfbXV4KSwKKwlTTkRfU09DX0RBUE1fUEdBKCJJRjEgQURDIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJJRjEgQURDIFN3YXAgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJJnJ0NTY2MF9pZjFfYWRjX3N3YXBfbXV4KSwKKworCS8qIEF1ZGlvIEludGVyZmFjZSAqLworCVNORF9TT0NfREFQTV9BSUZfSU4oIkFJRjFSWCIsICJBSUYxIFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMVRYIiwgIkFJRjEgQ2FwdHVyZSIsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisKKwkvKiBPdXRwdXQgU2lkZSAqLworCS8qIERBQyBtaXhlciBiZWZvcmUgc291bmQgZWZmZWN0ICAqLworCVNORF9TT0NfREFQTV9NSVhFUigiREFDMSBNSVhMIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBydDU2NjBfZGFjX2xfbWl4LAorCQlBUlJBWV9TSVpFKHJ0NTY2MF9kYWNfbF9taXgpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkRBQzEgTUlYUiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgcnQ1NjYwX2RhY19yX21peCwKKwkJQVJSQVlfU0laRShydDU2NjBfZGFjX3JfbWl4KSksCisKKwkvKiBEQUMgTWl4ZXIgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJkYWMgc3RlcmVvMSBmaWx0ZXIiLCBSVDU2NjBfUFdSX0RJRzIsCisJCVJUNTY2MF9QV1JfREFDX1MxRl9CSVQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiU3RlcmVvIERBQyBNSVhMIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlydDU2NjBfc3RvX2RhY19sX21peCwgQVJSQVlfU0laRShydDU2NjBfc3RvX2RhY19sX21peCkpLAorCVNORF9TT0NfREFQTV9NSVhFUigiU3RlcmVvIERBQyBNSVhSIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlydDU2NjBfc3RvX2RhY19yX21peCwgQVJSQVlfU0laRShydDU2NjBfc3RvX2RhY19yX21peCkpLAorCisJLyogREFDcyAqLworCVNORF9TT0NfREFQTV9EQUMoIkRBQyBMMSIsIE5VTEwsIFJUNTY2MF9QV1JfRElHMSwKKwkJCVJUNTY2MF9QV1JfREFDX0wxX0JJVCwgMCksCisJU05EX1NPQ19EQVBNX0RBQygiREFDIFIxIiwgTlVMTCwgUlQ1NjYwX1BXUl9ESUcxLAorCQkJUlQ1NjYwX1BXUl9EQUNfUjFfQklULCAwKSwKKworCS8qIE9VVCBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiU1BLIE1JWCIsIFJUNTY2MF9QV1JfTUlYRVIsIFJUNTY2MF9QV1JfU01fQklULAorCQkwLCBydDU2NjBfc3BrX21peCwgQVJSQVlfU0laRShydDU2NjBfc3BrX21peCkpLAorCVNORF9TT0NfREFQTV9NSVhFUigiT1VUIE1JWEwiLCBSVDU2NjBfUFdSX01JWEVSLCBSVDU2NjBfUFdSX09NX0xfQklULAorCQkwLCBydDU2NjBfb3V0X2xfbWl4LCBBUlJBWV9TSVpFKHJ0NTY2MF9vdXRfbF9taXgpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIk9VVCBNSVhSIiwgUlQ1NjYwX1BXUl9NSVhFUiwgUlQ1NjYwX1BXUl9PTV9SX0JJVCwKKwkJMCwgcnQ1NjYwX291dF9yX21peCwgQVJSQVlfU0laRShydDU2NjBfb3V0X3JfbWl4KSksCisKKwkvKiBPdXRwdXQgVm9sdW1lICovCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiU1BLVk9MIiwgUlQ1NjYwX1BXUl9WT0wsCisJCVJUNTY2MF9QV1JfU1ZfQklULCAwLCAmc3BrX3ZvbF9jb250cm9sKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJEQUMgMSIsIFNORF9TT0NfTk9QTSwKKwkJMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiTE9VVFZPTCIsIFNORF9TT0NfTk9QTSwKKwkJMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiTE9VVFZPTCBMIiwgU05EX1NPQ19OT1BNLAorCQlSVDU2NjBfUFdSX0xWX0xfQklULCAwLCAmbG91dF9sX3ZvbF9jb250cm9sKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJMT1VUVk9MIFIiLCBTTkRfU09DX05PUE0sCisJCVJUNTY2MF9QV1JfTFZfUl9CSVQsIDAsICZsb3V0X3Jfdm9sX2NvbnRyb2wpLAorCisJLyogSFBPL0xPVVQvTW9ubyBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiU1BPIE1JWCIsIFNORF9TT0NfTk9QTSwgMCwKKwkJMCwgcnQ1NjYwX3Nwb19taXgsIEFSUkFZX1NJWkUocnQ1NjYwX3Nwb19taXgpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkxPVVQgTUlYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlydDU2NjBfbG91dF9taXgsIEFSUkFZX1NJWkUocnQ1NjYwX2xvdXRfbWl4KSksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiVlJFRiBIUCIsIFJUNTY2MF9HRU5fQ1RSTDEsCisJCVJUNTY2MF9QV1JfVlJFRl9IUF9TRlQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0FfUygiTE9VVCBhbXAiLCAxLCBSVDU2NjBfUFdSX0FOTEcxLAorCQlSVDU2NjBfUFdSX0hBX0JJVCwgMCwgcnQ1NjYwX2xvdXRfZXZlbnQsCisJCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKwlTTkRfU09DX0RBUE1fUEdBX1MoIlNQSyBhbXAiLCAxLCBSVDU2NjBfUFdSX0RJRzEsCisJCVJUNTY2MF9QV1JfQ0xTX0RfQklULCAwLCBOVUxMLCAwKSwKKworCS8qIE91dHB1dCBMaW5lcyAqLworCVNORF9TT0NfREFQTV9PVVRQVVQoIkxPVVRMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiTE9VVFIiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUE8iKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHJ0NTY2MF9kYXBtX3JvdXRlc1tdID0geworCXsgIk1JQ0JJQVMxIiwgTlVMTCwgIkxETzIiIH0sCisJeyAiTUlDQklBUzIiLCBOVUxMLCAiTERPMiIgfSwKKworCXsgIkJTVDEiLCBOVUxMLCAiSU4xUCIgfSwKKwl7ICJCU1QxIiwgTlVMTCwgIklOMU4iIH0sCisJeyAiQlNUMiIsIE5VTEwsICJJTjJQIiB9LAorCXsgIkJTVDMiLCBOVUxMLCAiSU4zUCIgfSwKKwl7ICJCU1QzIiwgTlVMTCwgIklOM04iIH0sCisKKwl7ICJSRUNNSVhMIiwgIkJTVDMgU3dpdGNoIiwgIkJTVDMiIH0sCisJeyAiUkVDTUlYTCIsICJCU1QyIFN3aXRjaCIsICJCU1QyIiB9LAorCXsgIlJFQ01JWEwiLCAiQlNUMSBTd2l0Y2giLCAiQlNUMSIgfSwKKwl7ICJSRUNNSVhMIiwgIk9VVCBNSVhMIFN3aXRjaCIsICJPVVQgTUlYTCIgfSwKKworCXsgIlJFQ01JWFIiLCAiQlNUMyBTd2l0Y2giLCAiQlNUMyIgfSwKKwl7ICJSRUNNSVhSIiwgIkJTVDIgU3dpdGNoIiwgIkJTVDIiIH0sCisJeyAiUkVDTUlYUiIsICJCU1QxIFN3aXRjaCIsICJCU1QxIiB9LAorCXsgIlJFQ01JWFIiLCAiT1VUIE1JWFIgU3dpdGNoIiwgIk9VVCBNSVhSIiB9LAorCisJeyAiQURDIEwiLCBOVUxMLCAiUkVDTUlYTCIgfSwKKwl7ICJBREMgTCIsIE5VTEwsICJBREMgTCBwb3dlciIgfSwKKwl7ICJBREMgTCIsIE5VTEwsICJBREMgY2xvY2siIH0sCisJeyAiQURDIFIiLCBOVUxMLCAiUkVDTUlYUiIgfSwKKwl7ICJBREMgUiIsIE5VTEwsICJBREMgUiBwb3dlciIgfSwKKwl7ICJBREMgUiIsIE5VTEwsICJBREMgY2xvY2siIH0sCisKKwl7IkRNSUMgTDEiLCBOVUxMLCAiRE1JQyBDTEsifSwKKwl7IkRNSUMgTDEiLCBOVUxMLCAiRE1JQyBQb3dlciJ9LAorCXsiRE1JQyBSMSIsIE5VTEwsICJETUlDIENMSyJ9LAorCXsiRE1JQyBSMSIsIE5VTEwsICJETUlDIFBvd2VyIn0sCisKKwl7ICJTdG8xIEFEQyBNSVhMIiwgIkFEQzEgU3dpdGNoIiwgIkFEQyBMIiB9LAorCXsgIlN0bzEgQURDIE1JWEwiLCAiQURDMiBTd2l0Y2giLCAiRE1JQyBMMSIgfSwKKwl7ICJTdG8xIEFEQyBNSVhSIiwgIkFEQzEgU3dpdGNoIiwgIkFEQyBSIiB9LAorCXsgIlN0bzEgQURDIE1JWFIiLCAiQURDMiBTd2l0Y2giLCAiRE1JQyBSMSIgfSwKKworCXsgIlN0ZXJlbzEgQURDIE1JWEwiLCBOVUxMLCAiU3RvMSBBREMgTUlYTCIgfSwKKwl7ICJTdGVyZW8xIEFEQyBNSVhMIiwgTlVMTCwgImFkYyBzdGVyZW8xIGZpbHRlciIgfSwKKwl7ICJhZGMgc3RlcmVvMSBmaWx0ZXIiLCBOVUxMLCAiUExMMSIsIHJ0NTY2MF9pc19zeXNfY2xrX2Zyb21fcGxsIH0sCisKKwl7ICJTdGVyZW8xIEFEQyBNSVhSIiwgTlVMTCwgIlN0bzEgQURDIE1JWFIiIH0sCisJeyAiU3RlcmVvMSBBREMgTUlYUiIsIE5VTEwsICJhZGMgc3RlcmVvMSBmaWx0ZXIiIH0sCisJeyAiYWRjIHN0ZXJlbzEgZmlsdGVyIiwgTlVMTCwgIlBMTDEiLCBydDU2NjBfaXNfc3lzX2Nsa19mcm9tX3BsbCB9LAorCisJeyAiSUYxIEFEQyIsIE5VTEwsICJTdGVyZW8xIEFEQyBNSVhMIiB9LAorCXsgIklGMSBBREMiLCBOVUxMLCAiU3RlcmVvMSBBREMgTUlYUiIgfSwKKwl7ICJJRjEgQURDIiwgTlVMTCwgIkkyUzEiIH0sCisKKwl7ICJJRjEgQURDIFN3YXAgTXV4IiwgIkwvUiIsICJJRjEgQURDIiB9LAorCXsgIklGMSBBREMgU3dhcCBNdXgiLCAiUi9MIiwgIklGMSBBREMiIH0sCisJeyAiSUYxIEFEQyBTd2FwIE11eCIsICJML0wiLCAiSUYxIEFEQyIgfSwKKwl7ICJJRjEgQURDIFN3YXAgTXV4IiwgIlIvUiIsICJJRjEgQURDIiB9LAorCXsgIkFJRjFUWCIsIE5VTEwsICJJRjEgQURDIFN3YXAgTXV4IiB9LAorCisJeyAiSUYxIERBQyIsIE5VTEwsICJBSUYxUlgiIH0sCisJeyAiSUYxIERBQyIsIE5VTEwsICJJMlMxIiB9LAorCisJeyAiSUYxIERBQyBTd2FwIE11eCIsICJML1IiLCAiSUYxIERBQyIgfSwKKwl7ICJJRjEgREFDIFN3YXAgTXV4IiwgIlIvTCIsICJJRjEgREFDIiB9LAorCXsgIklGMSBEQUMgU3dhcCBNdXgiLCAiTC9MIiwgIklGMSBEQUMiIH0sCisJeyAiSUYxIERBQyBTd2FwIE11eCIsICJSL1IiLCAiSUYxIERBQyIgfSwKKworCXsgIklGMSBEQUMgTCIsIE5VTEwsICJJRjEgREFDIFN3YXAgTXV4IiB9LAorCXsgIklGMSBEQUMgUiIsIE5VTEwsICJJRjEgREFDIFN3YXAgTXV4IiB9LAorCisJeyAiREFDMSBNSVhMIiwgIlN0ZXJlbyBBREMgU3dpdGNoIiwgIlN0ZXJlbzEgQURDIE1JWEwiIH0sCisJeyAiREFDMSBNSVhMIiwgIkRBQzEgU3dpdGNoIiwgIklGMSBEQUMgTCIgfSwKKwl7ICJEQUMxIE1JWFIiLCAiU3RlcmVvIEFEQyBTd2l0Y2giLCAiU3RlcmVvMSBBREMgTUlYUiIgfSwKKwl7ICJEQUMxIE1JWFIiLCAiREFDMSBTd2l0Y2giLCAiSUYxIERBQyBSIiB9LAorCisJeyAiU3RlcmVvIERBQyBNSVhMIiwgIkRBQyBMMSBTd2l0Y2giLCAiREFDMSBNSVhMIiB9LAorCXsgIlN0ZXJlbyBEQUMgTUlYTCIsICJEQUMgUjEgU3dpdGNoIiwgIkRBQzEgTUlYUiIgfSwKKwl7ICJTdGVyZW8gREFDIE1JWEwiLCBOVUxMLCAiZGFjIHN0ZXJlbzEgZmlsdGVyIiB9LAorCXsgImRhYyBzdGVyZW8xIGZpbHRlciIsIE5VTEwsICJQTEwxIiwgcnQ1NjYwX2lzX3N5c19jbGtfZnJvbV9wbGwgfSwKKwl7ICJTdGVyZW8gREFDIE1JWFIiLCAiREFDIFIxIFN3aXRjaCIsICJEQUMxIE1JWFIiIH0sCisJeyAiU3RlcmVvIERBQyBNSVhSIiwgIkRBQyBMMSBTd2l0Y2giLCAiREFDMSBNSVhMIiB9LAorCXsgIlN0ZXJlbyBEQUMgTUlYUiIsIE5VTEwsICJkYWMgc3RlcmVvMSBmaWx0ZXIiIH0sCisJeyAiZGFjIHN0ZXJlbzEgZmlsdGVyIiwgTlVMTCwgIlBMTDEiLCBydDU2NjBfaXNfc3lzX2Nsa19mcm9tX3BsbCB9LAorCisJeyAiREFDIEwxIiwgTlVMTCwgIlN0ZXJlbyBEQUMgTUlYTCIgfSwKKwl7ICJEQUMgUjEiLCBOVUxMLCAiU3RlcmVvIERBQyBNSVhSIiB9LAorCisJeyAiU1BLIE1JWCIsICJCU1QzIFN3aXRjaCIsICJCU1QzIiB9LAorCXsgIlNQSyBNSVgiLCAiQlNUMSBTd2l0Y2giLCAiQlNUMSIgfSwKKwl7ICJTUEsgTUlYIiwgIkRBQ0wgU3dpdGNoIiwgIkRBQyBMMSIgfSwKKwl7ICJTUEsgTUlYIiwgIkRBQ1IgU3dpdGNoIiwgIkRBQyBSMSIgfSwKKwl7ICJTUEsgTUlYIiwgIk9VVE1JWEwgU3dpdGNoIiwgIk9VVCBNSVhMIiB9LAorCisJeyAiT1VUIE1JWEwiLCAiQlNUMyBTd2l0Y2giLCAiQlNUMyIgfSwKKwl7ICJPVVQgTUlYTCIsICJCU1QyIFN3aXRjaCIsICJCU1QyIiB9LAorCXsgIk9VVCBNSVhMIiwgIkJTVDEgU3dpdGNoIiwgIkJTVDEiIH0sCisJeyAiT1VUIE1JWEwiLCAiUkVDTUlYTCBTd2l0Y2giLCAiUkVDTUlYTCIgfSwKKwl7ICJPVVQgTUlYTCIsICJEQUNSIFN3aXRjaCIsICJEQUMgUjEiIH0sCisJeyAiT1VUIE1JWEwiLCAiREFDTCBTd2l0Y2giLCAiREFDIEwxIiB9LAorCisJeyAiT1VUIE1JWFIiLCAiQlNUMiBTd2l0Y2giLCAiQlNUMiIgfSwKKwl7ICJPVVQgTUlYUiIsICJCU1QxIFN3aXRjaCIsICJCU1QxIiB9LAorCXsgIk9VVCBNSVhSIiwgIlJFQ01JWFIgU3dpdGNoIiwgIlJFQ01JWFIiIH0sCisJeyAiT1VUIE1JWFIiLCAiREFDUiBTd2l0Y2giLCAiREFDIFIxIiB9LAorCXsgIk9VVCBNSVhSIiwgIkRBQ0wgU3dpdGNoIiwgIkRBQyBMMSIgfSwKKworCXsgIlNQTyBNSVgiLCAiREFDUiBTd2l0Y2giLCAiREFDIFIxIiB9LAorCXsgIlNQTyBNSVgiLCAiREFDTCBTd2l0Y2giLCAiREFDIEwxIiB9LAorCXsgIlNQTyBNSVgiLCAiU1BLVk9MIFN3aXRjaCIsICJTUEtWT0wiIH0sCisJeyAiU1BPIE1JWCIsICJCU1QxIFN3aXRjaCIsICJCU1QxIiB9LAorCisJeyAiU1BLVk9MIiwgIlN3aXRjaCIsICJTUEsgTUlYIiB9LAorCXsgIkxPVVRWT0wgTCIsICJTd2l0Y2giLCAiT1VUIE1JWEwiIH0sCisJeyAiTE9VVFZPTCBSIiwgIlN3aXRjaCIsICJPVVQgTUlYUiIgfSwKKworCXsgIkxPVVRWT0wiLCBOVUxMLCAiTE9VVFZPTCBMIiB9LAorCXsgIkxPVVRWT0wiLCBOVUxMLCAiTE9VVFZPTCBSIiB9LAorCisJeyAiREFDIDEiLCBOVUxMLCAiREFDIEwxIiB9LAorCXsgIkRBQyAxIiwgTlVMTCwgIkRBQyBSMSIgfSwKKworCXsgIkxPVVQgTUlYIiwgIkRBQyBTd2l0Y2giLCAiREFDIDEiIH0sCisJeyAiTE9VVCBNSVgiLCAiT1VUTUlYIFN3aXRjaCIsICJMT1VUVk9MIiB9LAorCisJeyAiTE9VVCBhbXAiLCBOVUxMLCAiTE9VVCBNSVgiIH0sCisJeyAiTE9VVCBhbXAiLCBOVUxMLCAiVlJFRiBIUCIgfSwKKwl7ICJMT1VUTCIsIE5VTEwsICJMT1VUIGFtcCIgfSwKKwl7ICJMT1VUUiIsIE5VTEwsICJMT1VUIGFtcCIgfSwKKworCXsgIlNQSyBhbXAiLCBOVUxMLCAiU1BPIE1JWCIgfSwKKwl7ICJTUE8iLCBOVUxMLCAiU1BLIGFtcCIgfSwKK307CisKK3N0YXRpYyBpbnQgcnQ1NjYwX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgcnQ1NjYwX3ByaXYgKnJ0NTY2MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCB2YWxfbGVuID0gMCwgdmFsX2NsaywgbWFza19jbGs7CisJaW50IHByZV9kaXYsIGJjbGtfbXMsIGZyYW1lX3NpemU7CisKKwlydDU2NjAtPmxyY2tbZGFpLT5pZF0gPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCXByZV9kaXYgPSBybDYyMzFfZ2V0X2Nsa19pbmZvKHJ0NTY2MC0+c3lzY2xrLCBydDU2NjAtPmxyY2tbZGFpLT5pZF0pOworCWlmIChwcmVfZGl2IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbnN1cHBvcnRlZCBjbG9jayBzZXR0aW5nICVkIGZvciBEQUkgJWRcbiIsCisJCQlydDU2NjAtPmxyY2tbZGFpLT5pZF0sIGRhaS0+aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmcmFtZV9zaXplID0gc25kX3NvY19wYXJhbXNfdG9fZnJhbWVfc2l6ZShwYXJhbXMpOworCWlmIChmcmFtZV9zaXplIDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbnN1cHBvcnRlZCBmcmFtZSBzaXplOiAlZFxuIiwgZnJhbWVfc2l6ZSk7CisJCXJldHVybiBmcmFtZV9zaXplOworCX0KKworCWlmIChmcmFtZV9zaXplID4gMzIpCisJCWJjbGtfbXMgPSAxOworCWVsc2UKKwkJYmNsa19tcyA9IDA7CisKKwlydDU2NjAtPmJjbGtbZGFpLT5pZF0gPSBydDU2NjAtPmxyY2tbZGFpLT5pZF0gKiAoMzIgPDwgYmNsa19tcyk7CisKKwlkZXZfZGJnKGRhaS0+ZGV2LCAiYmNsayBpcyAlZEh6IGFuZCBscmNrIGlzICVkSHpcbiIsCisJCXJ0NTY2MC0+YmNsa1tkYWktPmlkXSwgcnQ1NjYwLT5scmNrW2RhaS0+aWRdKTsKKwlkZXZfZGJnKGRhaS0+ZGV2LCAiYmNsa19tcyBpcyAlZCBhbmQgcHJlX2RpdiBpcyAlZCBmb3IgaWlzICVkXG4iLAorCQkJCWJjbGtfbXMsIHByZV9kaXYsIGRhaS0+aWQpOworCisJc3dpdGNoIChwYXJhbXNfd2lkdGgocGFyYW1zKSkgeworCWNhc2UgMTY6CisJCWJyZWFrOworCWNhc2UgMjA6CisJCXZhbF9sZW4gfD0gUlQ1NjYwX0kyU19ETF8yMDsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJdmFsX2xlbiB8PSBSVDU2NjBfSTJTX0RMXzI0OworCQlicmVhazsKKwljYXNlIDg6CisJCXZhbF9sZW4gfD0gUlQ1NjYwX0kyU19ETF84OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGRhaS0+aWQpIHsKKwljYXNlIFJUNTY2MF9BSUYxOgorCQltYXNrX2NsayA9IFJUNTY2MF9JMlNfQkNMS19NUzFfTUFTSyB8IFJUNTY2MF9JMlNfUEQxX01BU0s7CisJCXZhbF9jbGsgPSBiY2xrX21zIDw8IFJUNTY2MF9JMlNfQkNMS19NUzFfU0ZUIHwKKwkJCXByZV9kaXYgPDwgUlQ1NjYwX0kyU19QRDFfU0ZUOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjBfSTJTMV9TRFAsIFJUNTY2MF9JMlNfRExfTUFTSywKKwkJCXZhbF9sZW4pOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjBfQUREQV9DTEsxLCBtYXNrX2NsaywgdmFsX2Nsayk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBkYWktPmlkOiAlZFxuIiwgZGFpLT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2MF9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCBydDU2NjBfcHJpdiAqcnQ1NjYwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdW5zaWduZWQgaW50IHJlZ192YWwgPSAwOworCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTToKKwkJcnQ1NjYwLT5tYXN0ZXJbZGFpLT5pZF0gPSAxOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJcmVnX3ZhbCB8PSBSVDU2NjBfSTJTX01TX1M7CisJCXJ0NTY2MC0+bWFzdGVyW2RhaS0+aWRdID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFJRk1UX0lCX05GOgorCQlyZWdfdmFsIHw9IFJUNTY2MF9JMlNfQlBfSU5WOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJcmVnX3ZhbCB8PSBSVDU2NjBfSTJTX0RGX0xFRlQ7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKKwkJcmVnX3ZhbCB8PSBSVDU2NjBfSTJTX0RGX1BDTV9BOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCXJlZ192YWwgIHw9IFJUNTY2MF9JMlNfREZfUENNX0I7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChkYWktPmlkKSB7CisJY2FzZSBSVDU2NjBfQUlGMToKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYwX0kyUzFfU0RQLAorCQkJUlQ1NjYwX0kyU19NU19NQVNLIHwgUlQ1NjYwX0kyU19CUF9NQVNLIHwKKwkJCVJUNTY2MF9JMlNfREZfTUFTSywgcmVnX3ZhbCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBkYWktPmlkOiAlZFxuIiwgZGFpLT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2MF9zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgcnQ1NjYwX3ByaXYgKnJ0NTY2MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCByZWdfdmFsID0gMDsKKworCWlmIChmcmVxID09IHJ0NTY2MC0+c3lzY2xrICYmIGNsa19pZCA9PSBydDU2NjAtPnN5c2Nsa19zcmMpCisJCXJldHVybiAwOworCisJc3dpdGNoIChjbGtfaWQpIHsKKwljYXNlIFJUNTY2MF9TQ0xLX1NfTUNMSzoKKwkJcmVnX3ZhbCB8PSBSVDU2NjBfU0NMS19TUkNfTUNMSzsKKwkJYnJlYWs7CisKKwljYXNlIFJUNTY2MF9TQ0xLX1NfUExMMToKKwkJcmVnX3ZhbCB8PSBSVDU2NjBfU0NMS19TUkNfUExMMTsKKwkJYnJlYWs7CisKKwljYXNlIFJUNTY2MF9TQ0xLX1NfUkNDTEs6CisJCXJlZ192YWwgfD0gUlQ1NjYwX1NDTEtfU1JDX1JDQ0xLOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgY2xvY2sgaWQgKCVkKVxuIiwgY2xrX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYwX0dMQl9DTEssIFJUNTY2MF9TQ0xLX1NSQ19NQVNLLAorCQlyZWdfdmFsKTsKKworCXJ0NTY2MC0+c3lzY2xrID0gZnJlcTsKKwlydDU2NjAtPnN5c2Nsa19zcmMgPSBjbGtfaWQ7CisKKwlkZXZfZGJnKGRhaS0+ZGV2LCAiU3lzY2xrIGlzICVkSHogYW5kIGNsb2NrIGlkIGlzICVkXG4iLCBmcmVxLCBjbGtfaWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYwX3NldF9kYWlfcGxsKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgcGxsX2lkLCBpbnQgc291cmNlLAorCQkJdW5zaWduZWQgaW50IGZyZXFfaW4sIHVuc2lnbmVkIGludCBmcmVxX291dCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCBydDU2NjBfcHJpdiAqcnQ1NjYwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHJsNjIzMV9wbGxfY29kZSBwbGxfY29kZTsKKwlpbnQgcmV0OworCisJaWYgKHNvdXJjZSA9PSBydDU2NjAtPnBsbF9zcmMgJiYgZnJlcV9pbiA9PSBydDU2NjAtPnBsbF9pbiAmJgorCQlmcmVxX291dCA9PSBydDU2NjAtPnBsbF9vdXQpCisJCXJldHVybiAwOworCisJaWYgKCFmcmVxX2luIHx8ICFmcmVxX291dCkgeworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJQTEwgZGlzYWJsZWRcbiIpOworCisJCXJ0NTY2MC0+cGxsX2luID0gMDsKKwkJcnQ1NjYwLT5wbGxfb3V0ID0gMDsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYwX0dMQl9DTEssCisJCQlSVDU2NjBfU0NMS19TUkNfTUFTSywgUlQ1NjYwX1NDTEtfU1JDX01DTEspOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKHNvdXJjZSkgeworCWNhc2UgUlQ1NjYwX1BMTDFfU19NQ0xLOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjBfR0xCX0NMSywKKwkJCVJUNTY2MF9QTEwxX1NSQ19NQVNLLCBSVDU2NjBfUExMMV9TUkNfTUNMSyk7CisJCWJyZWFrOworCisJY2FzZSBSVDU2NjBfUExMMV9TX0JDTEs6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2MF9HTEJfQ0xLLAorCQkJUlQ1NjYwX1BMTDFfU1JDX01BU0ssIFJUNTY2MF9QTEwxX1NSQ19CQ0xLMSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5rbm93biBQTEwgc291cmNlICVkXG4iLCBzb3VyY2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBybDYyMzFfcGxsX2NhbGMoZnJlcV9pbiwgZnJlcV9vdXQsICZwbGxfY29kZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5zdXBwb3J0IGlucHV0IGNsb2NrICVkXG4iLCBmcmVxX2luKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJieXBhc3M9JWQgbT0lZCBuPSVkIGs9JWRcbiIsCisJCXBsbF9jb2RlLm1fYnAsIChwbGxfY29kZS5tX2JwID8gMCA6IHBsbF9jb2RlLm1fY29kZSksCisJCXBsbF9jb2RlLm5fY29kZSwgcGxsX2NvZGUua19jb2RlKTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2MF9QTExfQ1RSTDEsCisJCXBsbF9jb2RlLm5fY29kZSA8PCBSVDU2NjBfUExMX05fU0ZUIHwgcGxsX2NvZGUua19jb2RlKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjBfUExMX0NUUkwyLAorCQkocGxsX2NvZGUubV9icCA/IDAgOiBwbGxfY29kZS5tX2NvZGUpIDw8IFJUNTY2MF9QTExfTV9TRlQgfAorCQlwbGxfY29kZS5tX2JwIDw8IFJUNTY2MF9QTExfTV9CUF9TRlQpOworCisJcnQ1NjYwLT5wbGxfaW4gPSBmcmVxX2luOworCXJ0NTY2MC0+cGxsX291dCA9IGZyZXFfb3V0OworCXJ0NTY2MC0+cGxsX3NyYyA9IHNvdXJjZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2MF9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwlzdHJ1Y3QgcnQ1NjYwX3ByaXYgKnJ0NTY2MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKGxldmVsKSB7CisJY2FzZSBTTkRfU09DX0JJQVNfT046CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYwX0dFTl9DVFJMMSwKKwkJCVJUNTY2MF9ESUdfR0FURV9DVFJMLCBSVDU2NjBfRElHX0dBVEVfQ1RSTCk7CisKKwkJaWYgKElTX0VSUihydDU2NjAtPm1jbGspKQorCQkJYnJlYWs7CisKKwkJaWYgKHNuZF9zb2NfY29kZWNfZ2V0X2JpYXNfbGV2ZWwoY29kZWMpID09IFNORF9TT0NfQklBU19PTikgeworCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHJ0NTY2MC0+bWNsayk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocnQ1NjYwLT5tY2xrKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCWlmIChzbmRfc29jX2NvZGVjX2dldF9iaWFzX2xldmVsKGNvZGVjKSA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjBfUFdSX0FOTEcxLAorCQkJCVJUNTY2MF9QV1JfVlJFRjEgfCBSVDU2NjBfUFdSX01CIHwKKwkJCQlSVDU2NjBfUFdSX0JHIHwgUlQ1NjYwX1BXUl9WUkVGMiwKKwkJCQlSVDU2NjBfUFdSX1ZSRUYxIHwgUlQ1NjYwX1BXUl9NQiB8CisJCQkJUlQ1NjYwX1BXUl9CRyB8IFJUNTY2MF9QV1JfVlJFRjIpOworCQkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxNTAwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjBfUFdSX0FOTEcxLAorCQkJCVJUNTY2MF9QV1JfRlYxIHwgUlQ1NjYwX1BXUl9GVjIsCisJCQkJUlQ1NjYwX1BXUl9GVjEgfCBSVDU2NjBfUFdSX0ZWMik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfQklBU19PRkY6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2MF9HRU5fQ1RSTDEsCisJCQlSVDU2NjBfRElHX0dBVEVfQ1RSTCwgMCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYwX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgcnQ1NjYwX3ByaXYgKnJ0NTY2MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcnQ1NjYwLT5jb2RlYyA9IGNvZGVjOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYwX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJcmV0dXJuIHNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2MF9SRVNFVCwgMCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgcnQ1NjYwX3N1c3BlbmQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBydDU2NjBfcHJpdiAqcnQ1NjYwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KHJ0NTY2MC0+cmVnbWFwLCB0cnVlKTsKKwlyZWdjYWNoZV9tYXJrX2RpcnR5KHJ0NTY2MC0+cmVnbWFwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2MF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBydDU2NjBfcHJpdiAqcnQ1NjYwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAocnQ1NjYwLT5wZGF0YS5wb3dlcm9mZl9jb2RlY19pbl9zdXNwZW5kKQorCQl1c2xlZXBfcmFuZ2UoMzUwMDAwLCA0MDAwMDApOworCisJcmVnY2FjaGVfY2FjaGVfb25seShydDU2NjAtPnJlZ21hcCwgZmFsc2UpOworCXJlZ2NhY2hlX3N5bmMocnQ1NjYwLT5yZWdtYXApOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBydDU2NjBfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHJ0NTY2MF9yZXN1bWUgTlVMTAorI2VuZGlmCisKKyNkZWZpbmUgUlQ1NjYwX1NURVJFT19SQVRFUyBTTkRSVl9QQ01fUkFURV84MDAwXzE5MjAwMAorI2RlZmluZSBSVDU2NjBfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfCBcCisJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzgpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHJ0NTY2MF9haWZfZGFpX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gcnQ1NjYwX2h3X3BhcmFtcywKKwkuc2V0X2ZtdCA9IHJ0NTY2MF9zZXRfZGFpX2ZtdCwKKwkuc2V0X3N5c2NsayA9IHJ0NTY2MF9zZXRfZGFpX3N5c2NsaywKKwkuc2V0X3BsbCA9IHJ0NTY2MF9zZXRfZGFpX3BsbCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHJ0NTY2MF9kYWlbXSA9IHsKKwl7CisJCS5uYW1lID0gInJ0NTY2MC1haWYxIiwKKwkJLmlkID0gUlQ1NjYwX0FJRjEsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYxIFBsYXliYWNrIiwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBSVDU2NjBfU1RFUkVPX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBSVDU2NjBfRk9STUFUUywKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGMSBDYXB0dXJlIiwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBSVDU2NjBfU1RFUkVPX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBSVDU2NjBfRk9STUFUUywKKwkJfSwKKwkJLm9wcyA9ICZydDU2NjBfYWlmX2RhaV9vcHMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9ydDU2NjAgPSB7CisJLnByb2JlID0gcnQ1NjYwX3Byb2JlLAorCS5yZW1vdmUgPSBydDU2NjBfcmVtb3ZlLAorCS5zdXNwZW5kID0gcnQ1NjYwX3N1c3BlbmQsCisJLnJlc3VtZSA9IHJ0NTY2MF9yZXN1bWUsCisJLnNldF9iaWFzX2xldmVsID0gcnQ1NjYwX3NldF9iaWFzX2xldmVsLAorCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHJ0NTY2MF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShydDU2NjBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBydDU2NjBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocnQ1NjYwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBydDU2NjBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHJ0NTY2MF9kYXBtX3JvdXRlcyksCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBydDU2NjBfcmVnbWFwID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gMTYsCisJLnVzZV9zaW5nbGVfcncgPSB0cnVlLAorCisJLm1heF9yZWdpc3RlciA9IFJUNTY2MF9WRU5ET1JfSUQyICsgMSArIChBUlJBWV9TSVpFKHJ0NTY2MF9yYW5nZXMpICoKKwkJCQkJICAgICAgIFJUNTY2MF9QUl9TUEFDSU5HKSwKKwkudm9sYXRpbGVfcmVnID0gcnQ1NjYwX3ZvbGF0aWxlX3JlZ2lzdGVyLAorCS5yZWFkYWJsZV9yZWcgPSBydDU2NjBfcmVhZGFibGVfcmVnaXN0ZXIsCisKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkucmVnX2RlZmF1bHRzID0gcnQ1NjYwX3JlZywKKwkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUocnQ1NjYwX3JlZyksCisJLnJhbmdlcyA9IHJ0NTY2MF9yYW5nZXMsCisJLm51bV9yYW5nZXMgPSBBUlJBWV9TSVpFKHJ0NTY2MF9yYW5nZXMpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHJ0NTY2MF9pMmNfaWRbXSA9IHsKKwl7ICJydDU2NjAiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHJ0NTY2MF9pMmNfaWQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBydDU2NjBfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInJlYWx0ZWsscnQ1NjYwIiwgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBydDU2NjBfb2ZfbWF0Y2gpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHJ0NTY2MF9hY3BpX21hdGNoW10gPSB7CisJeyAiMTBFQzU2NjAiLCAwIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgcnQ1NjYwX2FjcGlfbWF0Y2gpOworCitzdGF0aWMgaW50IHJ0NTY2MF9wYXJzZV9kdChzdHJ1Y3QgcnQ1NjYwX3ByaXYgKnJ0NTY2MCwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXJ0NTY2MC0+cGRhdGEuaW4xX2RpZmYgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwKKwkJCQkJInJlYWx0ZWssaW4xLWRpZmZlcmVudGlhbCIpOworCXJ0NTY2MC0+cGRhdGEuaW4zX2RpZmYgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwKKwkJCQkJInJlYWx0ZWssaW4zLWRpZmZlcmVudGlhbCIpOworCXJ0NTY2MC0+cGRhdGEucG93ZXJvZmZfY29kZWNfaW5fc3VzcGVuZCA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LAorCQkJCQkicmVhbHRlayxwb3dlcm9mZi1pbi1zdXNwZW5kIik7CisJZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGRldiwgInJlYWx0ZWssZG1pYzEtZGF0YS1waW4iLAorCQkmcnQ1NjYwLT5wZGF0YS5kbWljMV9kYXRhX3Bpbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjBfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHJ0NTY2MF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJmkyYy0+ZGV2KTsKKwlzdHJ1Y3QgcnQ1NjYwX3ByaXYgKnJ0NTY2MDsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCB2YWw7CisKKwlydDU2NjAgPSBkZXZtX2t6YWxsb2MoJmkyYy0+ZGV2LCBzaXplb2Yoc3RydWN0IHJ0NTY2MF9wcml2KSwKKwkJR0ZQX0tFUk5FTCk7CisKKwlpZiAocnQ1NjYwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogQ2hlY2sgaWYgTUNMSyBwcm92aWRlZCAqLworCXJ0NTY2MC0+bWNsayA9IGRldm1fY2xrX2dldCgmaTJjLT5kZXYsICJtY2xrIik7CisJaWYgKFBUUl9FUlIocnQ1NjYwLT5tY2xrKSA9PSAtRVBST0JFX0RFRkVSKQorCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKworCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIHJ0NTY2MCk7CisKKwlpZiAocGRhdGEpCisJCXJ0NTY2MC0+cGRhdGEgPSAqcGRhdGE7CisJZWxzZSBpZiAoaTJjLT5kZXYub2Zfbm9kZSkKKwkJcnQ1NjYwX3BhcnNlX2R0KHJ0NTY2MCwgJmkyYy0+ZGV2KTsKKworCXJ0NTY2MC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAmcnQ1NjYwX3JlZ21hcCk7CisJaWYgKElTX0VSUihydDU2NjAtPnJlZ21hcCkpIHsKKwkJcmV0ID0gUFRSX0VSUihydDU2NjAtPnJlZ21hcCk7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlZ2lzdGVyIG1hcDogJWRcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJlZ21hcF9yZWFkKHJ0NTY2MC0+cmVnbWFwLCBSVDU2NjBfVkVORE9SX0lEMiwgJnZhbCk7CisJaWYgKHZhbCAhPSBSVDU2NjBfREVWSUNFX0lEKSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LAorCQkJIkRldmljZSB3aXRoIElEIHJlZ2lzdGVyICUjeCBpcyBub3QgcnQ1NjYwXG4iLCB2YWwpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZWdtYXBfd3JpdGUocnQ1NjYwLT5yZWdtYXAsIFJUNTY2MF9SRVNFVCwgMCk7CisKKwlyZXQgPSByZWdtYXBfcmVnaXN0ZXJfcGF0Y2gocnQ1NjYwLT5yZWdtYXAsIHJ0NTY2MF9wYXRjaCwKKwkJCQkgICAgQVJSQVlfU0laRShydDU2NjBfcGF0Y2gpKTsKKwlpZiAocmV0ICE9IDApCisJCWRldl93YXJuKCZpMmMtPmRldiwgIkZhaWxlZCB0byBhcHBseSByZWdtYXAgcGF0Y2g6ICVkXG4iLCByZXQpOworCisJaWYgKHJ0NTY2MC0+cGRhdGEuZG1pYzFfZGF0YV9waW4pIHsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY2MC0+cmVnbWFwLCBSVDU2NjBfR1BJT19DVFJMMSwKKwkJCVJUNTY2MF9HUDFfUElOX01BU0ssIFJUNTY2MF9HUDFfUElOX0RNSUMxX1NDTCk7CisKKwkJaWYgKHJ0NTY2MC0+cGRhdGEuZG1pYzFfZGF0YV9waW4gPT0gUlQ1NjYwX0RNSUMxX0RBVEFfR1BJTzIpCisJCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjYwLT5yZWdtYXAsIFJUNTY2MF9ETUlDX0NUUkwxLAorCQkJCVJUNTY2MF9TRUxfRE1JQ19EQVRBX01BU0ssCisJCQkJUlQ1NjYwX1NFTF9ETUlDX0RBVEFfR1BJTzIpOworCQllbHNlIGlmIChydDU2NjAtPnBkYXRhLmRtaWMxX2RhdGFfcGluID09IFJUNTY2MF9ETUlDMV9EQVRBX0lOMVApCisJCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjYwLT5yZWdtYXAsIFJUNTY2MF9ETUlDX0NUUkwxLAorCQkJCVJUNTY2MF9TRUxfRE1JQ19EQVRBX01BU0ssCisJCQkJUlQ1NjYwX1NFTF9ETUlDX0RBVEFfSU4xUCk7CisJfQorCisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LCAmc29jX2NvZGVjX2Rldl9ydDU2NjAsCisJCQkJICAgICAgcnQ1NjYwX2RhaSwgQVJSQVlfU0laRShydDU2NjBfZGFpKSk7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYwX2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcnQ1NjYwX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAicnQ1NjYwIiwKKwkJLmFjcGlfbWF0Y2hfdGFibGUgPSBBQ1BJX1BUUihydDU2NjBfYWNwaV9tYXRjaCksCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihydDU2NjBfb2ZfbWF0Y2gpLAorCX0sCisJLnByb2JlID0gcnQ1NjYwX2kyY19wcm9iZSwKKwkucmVtb3ZlICAgPSBydDU2NjBfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSBydDU2NjBfaTJjX2lkLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKHJ0NTY2MF9pMmNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIFJUNTY2MCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk9kZXIgQ2hpb3UgPG9kZXJfY2hpb3VAcmVhbHRlay5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY2MC5oIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2RiOTI2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NjAuaApAQCAtMCwwICsxLDg0NyBAQAorLyoKKyAqIHJ0NTY2MC5oICAtLSAgUlQ1NjYwIEFMU0EgU29DIGF1ZGlvIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDE2IFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLgorICogQXV0aG9yOiBPZGVyIENoaW91IDxvZGVyX2NoaW91QHJlYWx0ZWsuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfUlQ1NjYwX0gKKyNkZWZpbmUgX1JUNTY2MF9ICisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxzb3VuZC9ydDU2NjAuaD4KKworLyogSW5mbyAqLworI2RlZmluZSBSVDU2NjBfUkVTRVQJCQkJMHgwMAorI2RlZmluZSBSVDU2NjBfVkVORE9SX0lECQkJMHhmZAorI2RlZmluZSBSVDU2NjBfVkVORE9SX0lEMQkJCTB4ZmUKKyNkZWZpbmUgUlQ1NjYwX1ZFTkRPUl9JRDIJCQkweGZmCisvKiAgSS9PIC0gT3V0cHV0ICovCisjZGVmaW5lIFJUNTY2MF9TUEtfVk9MCQkJCTB4MDEKKyNkZWZpbmUgUlQ1NjYwX0xPVVRfVk9MCQkJCTB4MDIKKy8qIEkvTyAtIElucHV0ICovCisjZGVmaW5lIFJUNTY2MF9JTjFfSU4yCQkJCTB4MGQKKyNkZWZpbmUgUlQ1NjYwX0lOM19JTjQJCQkJMHgwZQorLyogSS9PIC0gQURDL0RBQy9ETUlDICovCisjZGVmaW5lIFJUNTY2MF9EQUMxX0RJR19WT0wJCQkweDE5CisjZGVmaW5lIFJUNTY2MF9TVE8xX0FEQ19ESUdfVk9MCQkJMHgxYworI2RlZmluZSBSVDU2NjBfQURDX0JTVF9WT0wxCQkJMHgxZQorLyogTWl4ZXIgLSBELUQgKi8KKyNkZWZpbmUgUlQ1NjYwX1NUTzFfQURDX01JWEVSCQkJMHgyNworI2RlZmluZSBSVDU2NjBfQURfREFfTUlYRVIJCQkweDI5CisjZGVmaW5lIFJUNTY2MF9TVE9fREFDX01JWEVSCQkJMHgyYQorI2RlZmluZSBSVDU2NjBfRElHX0lORjFfREFUQQkJCTB4MmYKKy8qIE1peGVyIC0gQURDICovCisjZGVmaW5lIFJUNTY2MF9SRUNfTDFfTUlYRVIJCQkweDNiCisjZGVmaW5lIFJUNTY2MF9SRUNfTDJfTUlYRVIJCQkweDNjCisjZGVmaW5lIFJUNTY2MF9SRUNfUjFfTUlYRVIJCQkweDNkCisjZGVmaW5lIFJUNTY2MF9SRUNfUjJfTUlYRVIJCQkweDNlCisvKiBNaXhlciAtIERBQyAqLworI2RlZmluZSBSVDU2NjBfTE9VVF9NSVhFUgkJCTB4NDUKKyNkZWZpbmUgUlQ1NjYwX1NQS19NSVhFUgkJCTB4NDYKKyNkZWZpbmUgUlQ1NjYwX1NQT19NSVhFUgkJCTB4NDgKKyNkZWZpbmUgUlQ1NjYwX1NQT19DTFNEX1JBVElPCQkJMHg0YQorI2RlZmluZSBSVDU2NjBfT1VUX0xfR0FJTjEJCQkweDRkCisjZGVmaW5lIFJUNTY2MF9PVVRfTF9HQUlOMgkJCTB4NGUKKyNkZWZpbmUgUlQ1NjYwX09VVF9MMV9NSVhFUgkJCTB4NGYKKyNkZWZpbmUgUlQ1NjYwX09VVF9SX0dBSU4xCQkJMHg1MAorI2RlZmluZSBSVDU2NjBfT1VUX1JfR0FJTjIJCQkweDUxCisjZGVmaW5lIFJUNTY2MF9PVVRfUjFfTUlYRVIJCQkweDUyCisvKiBQb3dlciAqLworI2RlZmluZSBSVDU2NjBfUFdSX0RJRzEJCQkJMHg2MQorI2RlZmluZSBSVDU2NjBfUFdSX0RJRzIJCQkJMHg2MgorI2RlZmluZSBSVDU2NjBfUFdSX0FOTEcxCQkJMHg2MworI2RlZmluZSBSVDU2NjBfUFdSX0FOTEcyCQkJMHg2NAorI2RlZmluZSBSVDU2NjBfUFdSX01JWEVSCQkJMHg2NQorI2RlZmluZSBSVDU2NjBfUFdSX1ZPTAkJCQkweDY2CisvKiBQcml2YXRlIFJlZ2lzdGVyIENvbnRyb2wgKi8KKyNkZWZpbmUgUlQ1NjYwX1BSSVZfSU5ERVgJCQkweDZhCisjZGVmaW5lIFJUNTY2MF9QUklWX0RBVEEJCQkweDZjCisvKiBGb3JtYXQgLSBBREMvREFDICovCisjZGVmaW5lIFJUNTY2MF9JMlMxX1NEUAkJCQkweDcwCisjZGVmaW5lIFJUNTY2MF9BRERBX0NMSzEJCQkweDczCisjZGVmaW5lIFJUNTY2MF9BRERBX0NMSzIJCQkweDc0CisjZGVmaW5lIFJUNTY2MF9ETUlDX0NUUkwxCQkJMHg3NQorLyogRnVuY3Rpb24gLSBBbmFsb2cgKi8KKyNkZWZpbmUgUlQ1NjYwX0dMQl9DTEsJCQkJMHg4MAorI2RlZmluZSBSVDU2NjBfUExMX0NUUkwxCQkJMHg4MQorI2RlZmluZSBSVDU2NjBfUExMX0NUUkwyCQkJMHg4MgorI2RlZmluZSBSVDU2NjBfQ0xTRF9BTVBfT0NfQ1RSTAkJCTB4OGMKKyNkZWZpbmUgUlQ1NjYwX0NMU0RfQU1QX0NUUkwJCQkweDhkCisjZGVmaW5lIFJUNTY2MF9MT1VUX0FNUF9DVFJMCQkJMHg4ZQorI2RlZmluZSBSVDU2NjBfU1BLX0FNUF9TUEtWREQJCQkweDkyCisjZGVmaW5lIFJUNTY2MF9NSUNCSUFTCQkJCTB4OTMKKyNkZWZpbmUgUlQ1NjYwX0NMU0RfT1VUX0NUUkwxCQkJMHhhMQorI2RlZmluZSBSVDU2NjBfQ0xTRF9PVVRfQ1RSTDIJCQkweGEyCisjZGVmaW5lIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkwxCQkJMHhhMworI2RlZmluZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMMgkJCTB4YTQKKyNkZWZpbmUgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDMJCQkweGE1CisjZGVmaW5lIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkw0CQkJMHhhNgorI2RlZmluZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMNQkJCTB4YTcKKyNkZWZpbmUgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDYJCQkweGE4CisjZGVmaW5lIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkw3CQkJMHhhOQorI2RlZmluZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMOAkJCTB4YWEKKyNkZWZpbmUgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDkJCQkweGFiCisjZGVmaW5lIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkwxMAkJMHhhYworI2RlZmluZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMMTEJCTB4YWQKKyNkZWZpbmUgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDEyCQkweGFlCisvKiBGdW5jdGlvbiAtIERpZ2l0YWwgKi8KKyNkZWZpbmUgUlQ1NjYwX0VRX0NUUkwxCQkJCTB4YjAKKyNkZWZpbmUgUlQ1NjYwX0VRX0NUUkwyCQkJCTB4YjEKKyNkZWZpbmUgUlQ1NjYwX0RSQ19BR0NfQ1RSTDEJCQkweGIzCisjZGVmaW5lIFJUNTY2MF9EUkNfQUdDX0NUUkwyCQkJMHhiNAorI2RlZmluZSBSVDU2NjBfRFJDX0FHQ19DVFJMMwkJCTB4YjUKKyNkZWZpbmUgUlQ1NjYwX0RSQ19BR0NfQ1RSTDQJCQkweGI2CisjZGVmaW5lIFJUNTY2MF9EUkNfQUdDX0NUUkw1CQkJMHhiNworI2RlZmluZSBSVDU2NjBfSkRfQ1RSTAkJCQkweGJiCisjZGVmaW5lIFJUNTY2MF9JUlFfQ1RSTDEJCQkweGJkCisjZGVmaW5lIFJUNTY2MF9JUlFfQ1RSTDIJCQkweGJlCisjZGVmaW5lIFJUNTY2MF9JTlRfSVJRX1NUCQkJMHhiZgorI2RlZmluZSBSVDU2NjBfR1BJT19DVFJMMQkJCTB4YzAKKyNkZWZpbmUgUlQ1NjYwX0dQSU9fQ1RSTDIJCQkweGMyCisjZGVmaW5lIFJUNTY2MF9XSU5EX0ZJTFRFUl9DVFJMMQkJMHhkMworI2RlZmluZSBSVDU2NjBfU1ZfWkNEMQkJCQkweGQ5CisjZGVmaW5lIFJUNTY2MF9TVl9aQ0QyCQkJCTB4ZGEKKyNkZWZpbmUgUlQ1NjYwX0RSQzFfTE1fQ1RSTDEJCQkweGUwCisjZGVmaW5lIFJUNTY2MF9EUkMxX0xNX0NUUkwyCQkJMHhlMQorI2RlZmluZSBSVDU2NjBfRFJDMl9MTV9DVFJMMQkJCTB4ZTIKKyNkZWZpbmUgUlQ1NjYwX0RSQzJfTE1fQ1RSTDIJCQkweGUzCisjZGVmaW5lIFJUNTY2MF9NVUxUSV9EUkNfQ1RSTAkJCTB4ZTQKKyNkZWZpbmUgUlQ1NjYwX0RSQzJfQ1RSTDEJCQkweGU1CisjZGVmaW5lIFJUNTY2MF9EUkMyX0NUUkwyCQkJMHhlNgorI2RlZmluZSBSVDU2NjBfRFJDMl9DVFJMMwkJCTB4ZTcKKyNkZWZpbmUgUlQ1NjYwX0RSQzJfQ1RSTDQJCQkweGU4CisjZGVmaW5lIFJUNTY2MF9EUkMyX0NUUkw1CQkJMHhlOQorI2RlZmluZSBSVDU2NjBfQUxDX1BHQV9DVFJMMQkJCTB4ZWEKKyNkZWZpbmUgUlQ1NjYwX0FMQ19QR0FfQ1RSTDIJCQkweGViCisjZGVmaW5lIFJUNTY2MF9BTENfUEdBX0NUUkwzCQkJMHhlYworI2RlZmluZSBSVDU2NjBfQUxDX1BHQV9DVFJMNAkJCTB4ZWQKKyNkZWZpbmUgUlQ1NjYwX0FMQ19QR0FfQ1RSTDUJCQkweGVlCisjZGVmaW5lIFJUNTY2MF9BTENfUEdBX0NUUkw2CQkJMHhlZgorI2RlZmluZSBSVDU2NjBfQUxDX1BHQV9DVFJMNwkJCTB4ZjAKKworLyogR2VuZXJhbCBDb250cm9sICovCisjZGVmaW5lIFJUNTY2MF9HRU5fQ1RSTDEJCQkweGZhCisjZGVmaW5lIFJUNTY2MF9HRU5fQ1RSTDIJCQkweGZiCisjZGVmaW5lIFJUNTY2MF9HRU5fQ1RSTDMJCQkweGZjCisKKy8qIEluZGV4IG9mIENvZGVjIFByaXZhdGUgUmVnaXN0ZXIgZGVmaW5pdGlvbiAqLworI2RlZmluZSBSVDU2NjBfQ0hPUF9EQUNfQURDCQkJMHgzZAorCisvKiBHbG9iYWwgRGVmaW5pdGlvbiAqLworI2RlZmluZSBSVDU2NjBfTF9NVVRFCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9MX01VVEVfU0ZUCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX1ZPTF9MX01VVEUJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfVk9MX0xfU0ZUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX1JfTVVURQkJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTY2MF9SX01VVEVfU0ZUCQkJNworI2RlZmluZSBSVDU2NjBfVk9MX1JfTVVURQkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjYwX1ZPTF9SX1NGVAkJCTYKKyNkZWZpbmUgUlQ1NjYwX0xfVk9MX01BU0sJCQkoMHgzZiA8PCA4KQorI2RlZmluZSBSVDU2NjBfTF9WT0xfU0ZUCQkJOAorI2RlZmluZSBSVDU2NjBfUl9WT0xfTUFTSwkJCSgweDNmKQorI2RlZmluZSBSVDU2NjBfUl9WT0xfU0ZUCQkJMAorCisvKiBJTjEgYW5kIElOMiBDb250cm9sICgweDBkKSAqLworI2RlZmluZSBSVDU2NjBfSU5fREYxCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9JTl9TRlQxCQkJCTE1CisjZGVmaW5lIFJUNTY2MF9CU1RfTUFTSzEJCQkoMHg3ZiA8PCA4KQorI2RlZmluZSBSVDU2NjBfQlNUX1NGVDEJCQkJOAorI2RlZmluZSBSVDU2NjBfSU5fREYyCQkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX0lOX1NGVDIJCQkJNworI2RlZmluZSBSVDU2NjBfQlNUX01BU0syCQkJKDB4N2YgPDwgMCkKKyNkZWZpbmUgUlQ1NjYwX0JTVF9TRlQyCQkJCTAKKworLyogSU4zIGFuZCBJTjQgQ29udHJvbCAoMHgwZSkgKi8KKyNkZWZpbmUgUlQ1NjYwX0lOX0RGMwkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfSU5fU0ZUMwkJCQkxNQorI2RlZmluZSBSVDU2NjBfQlNUX01BU0szCQkJKDB4N2YgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX0JTVF9TRlQzCQkJCTgKKyNkZWZpbmUgUlQ1NjYwX0lOX0RGNAkJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTY2MF9JTl9TRlQ0CQkJCTcKKyNkZWZpbmUgUlQ1NjYwX0JTVF9NQVNLNAkJCSgweDdmIDw8IDApCisjZGVmaW5lIFJUNTY2MF9CU1RfU0ZUNAkJCQkwCisKKy8qIERBQzEgRGlnaXRhbCBWb2x1bWUgKDB4MTkpICovCisjZGVmaW5lIFJUNTY2MF9EQUNfTDFfVk9MX01BU0sJCQkoMHg3ZiA8PCA5KQorI2RlZmluZSBSVDU2NjBfREFDX0wxX1ZPTF9TRlQJCQk5CisjZGVmaW5lIFJUNTY2MF9EQUNfUjFfVk9MX01BU0sJCQkoMHg3ZiA8PCAxKQorI2RlZmluZSBSVDU2NjBfREFDX1IxX1ZPTF9TRlQJCQkxCisKKy8qIEFEQyBEaWdpdGFsIFZvbHVtZSBDb250cm9sICgweDFjKSAqLworI2RlZmluZSBSVDU2NjBfQURDX0xfVk9MX01BU0sJCQkoMHgzZiA8PCA5KQorI2RlZmluZSBSVDU2NjBfQURDX0xfVk9MX1NGVAkJCTkKKyNkZWZpbmUgUlQ1NjYwX0FEQ19SX1ZPTF9NQVNLCQkJKDB4M2YgPDwgMSkKKyNkZWZpbmUgUlQ1NjYwX0FEQ19SX1ZPTF9TRlQJCQkxCisKKy8qIEFEQyBCb29zdCBWb2x1bWUgQ29udHJvbCAoMHgxZSkgKi8KKyNkZWZpbmUgUlQ1NjYwX1NUTzFfQURDX0xfQlNUX01BU0sJCSgweDMgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9TVE8xX0FEQ19MX0JTVF9TRlQJCTE0CisjZGVmaW5lIFJUNTY2MF9TVE8xX0FEQ19SX0JTVF9NQVNLCQkoMHgzIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfU1RPMV9BRENfUl9CU1RfU0ZUCQkxMgorCisvKiBTdGVyZW8gQURDIE1peGVyIENvbnRyb2wgKDB4MjcpICovCisjZGVmaW5lIFJUNTY2MF9NX0FEQ19MMQkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfTV9BRENfTDFfU0ZUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX01fQURDX0wyCQkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2MF9NX0FEQ19MMl9TRlQJCQkxMworI2RlZmluZSBSVDU2NjBfTV9BRENfUjEJCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjBfTV9BRENfUjFfU0ZUCQkJNgorI2RlZmluZSBSVDU2NjBfTV9BRENfUjIJCQkJKDB4MSA8PCA1KQorI2RlZmluZSBSVDU2NjBfTV9BRENfUjJfU0ZUCQkJNQorCisvKiBBREMgTWl4ZXIgdG8gREFDIE1peGVyIENvbnRyb2wgKDB4MjkpICovCisjZGVmaW5lIFJUNTY2MF9NX0FEQ01JWF9MCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX01fQURDTUlYX0xfU0ZUCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX01fREFDMV9MCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9NX0RBQzFfTF9TRlQJCQkxNAorI2RlZmluZSBSVDU2NjBfTV9BRENNSVhfUgkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX01fQURDTUlYX1JfU0ZUCQkJNworI2RlZmluZSBSVDU2NjBfTV9EQUMxX1IJCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjBfTV9EQUMxX1JfU0ZUCQkJNgorCisvKiBTdGVyZW8gREFDIE1peGVyIENvbnRyb2wgKDB4MmEpICovCisjZGVmaW5lIFJUNTY2MF9NX0RBQ19MMQkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfTV9EQUNfTDFfU0ZUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX0RBQ19MMV9TVE9fTF9WT0xfTUFTSwkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjYwX0RBQ19MMV9TVE9fTF9WT0xfU0ZUCQkxMworI2RlZmluZSBSVDU2NjBfTV9EQUNfUjFfU1RPX0wJCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTY2MF9NX0RBQ19SMV9TVE9fTF9TRlQJCTkKKyNkZWZpbmUgUlQ1NjYwX0RBQ19SMV9TVE9fTF9WT0xfTUFTSwkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2NjBfREFDX1IxX1NUT19MX1ZPTF9TRlQJCTgKKyNkZWZpbmUgUlQ1NjYwX01fREFDX1IxCQkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjYwX01fREFDX1IxX1NGVAkJCTYKKyNkZWZpbmUgUlQ1NjYwX0RBQ19SMV9TVE9fUl9WT0xfTUFTSwkJKDB4MSA8PCA1KQorI2RlZmluZSBSVDU2NjBfREFDX1IxX1NUT19SX1ZPTF9TRlQJCTUKKyNkZWZpbmUgUlQ1NjYwX01fREFDX0wxX1NUT19SCQkJKDB4MSA8PCAxKQorI2RlZmluZSBSVDU2NjBfTV9EQUNfTDFfU1RPX1JfU0ZUCQkxCisjZGVmaW5lIFJUNTY2MF9EQUNfTDFfU1RPX1JfVk9MX01BU0sJCSgweDEpCisjZGVmaW5lIFJUNTY2MF9EQUNfTDFfU1RPX1JfVk9MX1NGVAkJMAorCisvKiBEaWdpdGFsIEludGVyZmFjZSBEYXRhIENvbnRyb2wgKDB4MmYpICovCisjZGVmaW5lIFJUNTY2MF9JRjFfREFDX0lOX1NFTAkJCSgweDMgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9JRjFfREFDX0lOX1NGVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9JRjFfQURDX0lOX1NFTAkJCSgweDMgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9JRjFfQURDX0lOX1NGVAkJCTEyCisKKy8qIFJFQyBMZWZ0IE1peGVyIENvbnRyb2wgMSAoMHgzYikgKi8KKyNkZWZpbmUgUlQ1NjYwX0dfQlNUM19STV9MX01BU0sJCQkoMHg3IDw8IDQpCisjZGVmaW5lIFJUNTY2MF9HX0JTVDNfUk1fTF9TRlQJCQk0CisjZGVmaW5lIFJUNTY2MF9HX0JTVDJfUk1fTF9NQVNLCQkJKDB4NyA8PCAxKQorI2RlZmluZSBSVDU2NjBfR19CU1QyX1JNX0xfU0ZUCQkJMQorCisvKiBSRUMgTGVmdCBNaXhlciBDb250cm9sIDIgKDB4M2MpICovCisjZGVmaW5lIFJUNTY2MF9HX0JTVDFfUk1fTF9NQVNLCQkJKDB4NyA8PCAxMykKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMV9STV9MX1NGVAkJCTEzCisjZGVmaW5lIFJUNTY2MF9HX09NX0xfUk1fTF9NQVNLCQkJKDB4NyA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX0dfT01fTF9STV9MX1NGVAkJCTEwCisjZGVmaW5lIFJUNTY2MF9NX0JTVDNfUk1fTAkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjYwX01fQlNUM19STV9MX1NGVAkJCTMKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMl9STV9MCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjBfTV9CU1QyX1JNX0xfU0ZUCQkJMgorI2RlZmluZSBSVDU2NjBfTV9CU1QxX1JNX0wJCQkoMHgxIDw8IDEpCisjZGVmaW5lIFJUNTY2MF9NX0JTVDFfUk1fTF9TRlQJCQkxCisjZGVmaW5lIFJUNTY2MF9NX09NX0xfUk1fTAkJCSgweDEpCisjZGVmaW5lIFJUNTY2MF9NX09NX0xfUk1fTF9TRlQJCQkwCisKKy8qIFJFQyBSaWdodCBNaXhlciBDb250cm9sIDEgKDB4M2QpICovCisjZGVmaW5lIFJUNTY2MF9HX0JTVDNfUk1fUl9NQVNLCQkJKDB4NyA8PCA0KQorI2RlZmluZSBSVDU2NjBfR19CU1QzX1JNX1JfU0ZUCQkJNAorI2RlZmluZSBSVDU2NjBfR19CU1QyX1JNX1JfTUFTSwkJCSgweDcgPDwgMSkKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMl9STV9SX1NGVAkJCTEKKworLyogUkVDIFJpZ2h0IE1peGVyIENvbnRyb2wgMiAoMHgzZSkgKi8KKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMV9STV9SX01BU0sJCQkoMHg3IDw8IDEzKQorI2RlZmluZSBSVDU2NjBfR19CU1QxX1JNX1JfU0ZUCQkJMTMKKyNkZWZpbmUgUlQ1NjYwX0dfT01fUl9STV9SX01BU0sJCQkoMHg3IDw8IDEwKQorI2RlZmluZSBSVDU2NjBfR19PTV9SX1JNX1JfU0ZUCQkJMTAKKyNkZWZpbmUgUlQ1NjYwX01fQlNUM19STV9SCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjBfTV9CU1QzX1JNX1JfU0ZUCQkJMworI2RlZmluZSBSVDU2NjBfTV9CU1QyX1JNX1IJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9NX0JTVDJfUk1fUl9TRlQJCQkyCisjZGVmaW5lIFJUNTY2MF9NX0JTVDFfUk1fUgkJCSgweDEgPDwgMSkKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMV9STV9SX1NGVAkJCTEKKyNkZWZpbmUgUlQ1NjYwX01fT01fUl9STV9SCQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjYwX01fT01fUl9STV9SX1NGVAkJCTAKKworLyogTE9VVE1JWCBDb250cm9sICgweDQ1KSAqLworI2RlZmluZSBSVDU2NjBfTV9EQUMxX0xNCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX01fREFDMV9MTV9TRlQJCQkxNAorI2RlZmluZSBSVDU2NjBfTV9MT1ZPTF9NCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjYwX01fTE9WT0xfTE1fU0ZUCQkJMTMKKworLyogU1BLIE1peGVyIENvbnRyb2wgKDB4NDYpICovCisjZGVmaW5lIFJUNTY2MF9HX0JTVDNfU01fTUFTSwkJCSgweDMgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9HX0JTVDNfU01fU0ZUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMV9TTV9NQVNLCQkJKDB4MyA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMV9TTV9TRlQJCQkxMgorI2RlZmluZSBSVDU2NjBfR19EQUNsX1NNX01BU0sJCQkoMHgzIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfR19EQUNsX1NNX1NGVAkJCTEwCisjZGVmaW5lIFJUNTY2MF9HX0RBQ1JfU01fTUFTSwkJCSgweDMgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX0dfREFDUl9TTV9TRlQJCQk4CisjZGVmaW5lIFJUNTY2MF9HX09NX0xfU01fTUFTSwkJCSgweDMgPDwgNikKKyNkZWZpbmUgUlQ1NjYwX0dfT01fTF9TTV9TRlQJCQk2CisjZGVmaW5lIFJUNTY2MF9NX0RBQ1JfU00JCQkoMHgxIDw8IDUpCisjZGVmaW5lIFJUNTY2MF9NX0RBQ1JfU01fU0ZUCQkJNQorI2RlZmluZSBSVDU2NjBfTV9CU1QxX1NNCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjBfTV9CU1QxX1NNX1NGVAkJCTQKKyNkZWZpbmUgUlQ1NjYwX01fQlNUM19TTQkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjYwX01fQlNUM19TTV9TRlQJCQkzCisjZGVmaW5lIFJUNTY2MF9NX0RBQ0xfU00JCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9NX0RBQ0xfU01fU0ZUCQkJMgorI2RlZmluZSBSVDU2NjBfTV9PTV9MX1NNCQkJKDB4MSA8PCAxKQorI2RlZmluZSBSVDU2NjBfTV9PTV9MX1NNX1NGVAkJCTEKKworLyogU1BPTUlYIENvbnRyb2wgKDB4NDgpICovCisjZGVmaW5lIFJUNTY2MF9NX0RBQ19SX1NQTQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9NX0RBQ19SX1NQTV9TRlQJCQkxNAorI2RlZmluZSBSVDU2NjBfTV9EQUNfTF9TUE0JCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjBfTV9EQUNfTF9TUE1fU0ZUCQkJMTMKKyNkZWZpbmUgUlQ1NjYwX01fU1ZfU1BNCQkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9NX1NWX1NQTV9TRlQJCQkxMgorI2RlZmluZSBSVDU2NjBfTV9CU1QxX1NQTQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9NX0JTVDFfU1BNX1NGVAkJCTExCisKKy8qIE91dHB1dCBMZWZ0IE1peGVyIENvbnRyb2wgMSAoMHg0ZCkgKi8KKyNkZWZpbmUgUlQ1NjYwX0dfQlNUM19PTV9MX01BU0sJCQkoMHg3IDw8IDEzKQorI2RlZmluZSBSVDU2NjBfR19CU1QzX09NX0xfU0ZUCQkJMTMKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMl9PTV9MX01BU0sJCQkoMHg3IDw8IDEwKQorI2RlZmluZSBSVDU2NjBfR19CU1QyX09NX0xfU0ZUCQkJMTAKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMV9PTV9MX01BU0sJCQkoMHg3IDw8IDcpCisjZGVmaW5lIFJUNTY2MF9HX0JTVDFfT01fTF9TRlQJCQk3CisjZGVmaW5lIFJUNTY2MF9HX1JNX0xfT01fTF9NQVNLCQkJKDB4NyA8PCAxKQorI2RlZmluZSBSVDU2NjBfR19STV9MX09NX0xfU0ZUCQkJMQorCisvKiBPdXRwdXQgTGVmdCBNaXhlciBDb250cm9sIDIgKDB4NGUpICovCisjZGVmaW5lIFJUNTY2MF9HX0RBQ19SMV9PTV9MX01BU0sJCSgweDcgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9HX0RBQ19SMV9PTV9MX1NGVAkJMTAKKyNkZWZpbmUgUlQ1NjYwX0dfREFDX0wxX09NX0xfTUFTSwkJKDB4NyA8PCA3KQorI2RlZmluZSBSVDU2NjBfR19EQUNfTDFfT01fTF9TRlQJCTcKKworLyogT3V0cHV0IExlZnQgTWl4ZXIgQ29udHJvbCAzICgweDRmKSAqLworI2RlZmluZSBSVDU2NjBfTV9CU1QzX09NX0wJCQkoMHgxIDw8IDUpCisjZGVmaW5lIFJUNTY2MF9NX0JTVDNfT01fTF9TRlQJCQk1CisjZGVmaW5lIFJUNTY2MF9NX0JTVDJfT01fTAkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMl9PTV9MX1NGVAkJCTQKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMV9PTV9MCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjBfTV9CU1QxX09NX0xfU0ZUCQkJMworI2RlZmluZSBSVDU2NjBfTV9STV9MX09NX0wJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9NX1JNX0xfT01fTF9TRlQJCQkyCisjZGVmaW5lIFJUNTY2MF9NX0RBQ19SX09NX0wJCQkoMHgxIDw8IDEpCisjZGVmaW5lIFJUNTY2MF9NX0RBQ19SX09NX0xfU0ZUCQkJMQorI2RlZmluZSBSVDU2NjBfTV9EQUNfTF9PTV9MCQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjYwX01fREFDX0xfT01fTF9TRlQJCQkwCisKKy8qIE91dHB1dCBSaWdodCBNaXhlciBDb250cm9sIDEgKDB4NTApICovCisjZGVmaW5lIFJUNTY2MF9HX0JTVDJfT01fUl9NQVNLCQkJKDB4NyA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMl9PTV9SX1NGVAkJCTEwCisjZGVmaW5lIFJUNTY2MF9HX0JTVDFfT01fUl9NQVNLCQkJKDB4NyA8PCA3KQorI2RlZmluZSBSVDU2NjBfR19CU1QxX09NX1JfU0ZUCQkJNworI2RlZmluZSBSVDU2NjBfR19STV9SX09NX1JfTUFTSwkJCSgweDcgPDwgMSkKKyNkZWZpbmUgUlQ1NjYwX0dfUk1fUl9PTV9SX1NGVAkJCTEKKworLyogT3V0cHV0IFJpZ2h0IE1peGVyIENvbnRyb2wgMiAoMHg1MSkgKi8KKyNkZWZpbmUgUlQ1NjYwX0dfREFDX0xfT01fUl9NQVNLCQkoMHg3IDw8IDEwKQorI2RlZmluZSBSVDU2NjBfR19EQUNfTF9PTV9SX1NGVAkJCTEwCisjZGVmaW5lIFJUNTY2MF9HX0RBQ19SX09NX1JfTUFTSwkJKDB4NyA8PCA3KQorI2RlZmluZSBSVDU2NjBfR19EQUNfUl9PTV9SX1NGVAkJCTcKKworLyogT3V0cHV0IFJpZ2h0IE1peGVyIENvbnRyb2wgMyAoMHg1MikgKi8KKyNkZWZpbmUgUlQ1NjYwX01fQlNUMl9PTV9SCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjBfTV9CU1QyX09NX1JfU0ZUCQkJNAorI2RlZmluZSBSVDU2NjBfTV9CU1QxX09NX1IJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2MF9NX0JTVDFfT01fUl9TRlQJCQkzCisjZGVmaW5lIFJUNTY2MF9NX1JNX1JfT01fUgkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX01fUk1fUl9PTV9SX1NGVAkJCTIKKyNkZWZpbmUgUlQ1NjYwX01fREFDX0xfT01fUgkJCSgweDEgPDwgMSkKKyNkZWZpbmUgUlQ1NjYwX01fREFDX0xfT01fUl9TRlQJCQkxCisjZGVmaW5lIFJUNTY2MF9NX0RBQ19SX09NX1IJCQkoMHgxKQorI2RlZmluZSBSVDU2NjBfTV9EQUNfUl9PTV9SX1NGVAkJCTAKKworLyogUG93ZXIgTWFuYWdlbWVudCBmb3IgRGlnaXRhbCAxICgweDYxKSAqLworI2RlZmluZSBSVDU2NjBfUFdSX0kyUzEJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9JMlMxX0JJVAkJCTE1CisjZGVmaW5lIFJUNTY2MF9QV1JfREFDX0wxCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX1BXUl9EQUNfTDFfQklUCQkJMTIKKyNkZWZpbmUgUlQ1NjYwX1BXUl9EQUNfUjEJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfUFdSX0RBQ19SMV9CSVQJCQkxMQorI2RlZmluZSBSVDU2NjBfUFdSX0FEQ19MCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjBfUFdSX0FEQ19MX0JJVAkJCTIKKyNkZWZpbmUgUlQ1NjYwX1BXUl9BRENfUgkJCSgweDEgPDwgMSkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9BRENfUl9CSVQJCQkxCisjZGVmaW5lIFJUNTY2MF9QV1JfQ0xTX0QJCQkoMHgxKQorI2RlZmluZSBSVDU2NjBfUFdSX0NMU19EX0JJVAkJCTAKKworLyogUG93ZXIgTWFuYWdlbWVudCBmb3IgRGlnaXRhbCAyICgweDYyKSAqLworI2RlZmluZSBSVDU2NjBfUFdSX0FEQ19TMUYJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfUFdSX0FEQ19TMUZfQklUCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX1BXUl9EQUNfUzFGCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9EQUNfUzFGX0JJVAkJCTExCisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgZm9yIEFuYWxvZyAxICgweDYzKSAqLworI2RlZmluZSBSVDU2NjBfUFdSX1ZSRUYxCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9WUkVGMV9CSVQJCQkxNQorI2RlZmluZSBSVDU2NjBfUFdSX0ZWMQkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfUFdSX0ZWMV9CSVQJCQkxNAorI2RlZmluZSBSVDU2NjBfUFdSX01CCQkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2MF9QV1JfTUJfQklUCQkJMTMKKyNkZWZpbmUgUlQ1NjYwX1BXUl9CRwkJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfUFdSX0JHX0JJVAkJCTExCisjZGVmaW5lIFJUNTY2MF9QV1JfSFBfTAkJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTY2MF9QV1JfSFBfTF9CSVQJCQk3CisjZGVmaW5lIFJUNTY2MF9QV1JfSFBfUgkJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2MF9QV1JfSFBfUl9CSVQJCQk2CisjZGVmaW5lIFJUNTY2MF9QV1JfSEEJCQkJKDB4MSA8PCA1KQorI2RlZmluZSBSVDU2NjBfUFdSX0hBX0JJVAkJCTUKKyNkZWZpbmUgUlQ1NjYwX1BXUl9WUkVGMgkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9WUkVGMl9CSVQJCQk0CisjZGVmaW5lIFJUNTY2MF9QV1JfRlYyCQkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjYwX1BXUl9GVjJfQklUCQkJMworI2RlZmluZSBSVDU2NjBfUFdSX0xETzIJCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjBfUFdSX0xETzJfQklUCQkJMgorCisvKiBQb3dlciBNYW5hZ2VtZW50IGZvciBBbmFsb2cgMiAoMHg2NCkgKi8KKyNkZWZpbmUgUlQ1NjYwX1BXUl9CU1QxCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9QV1JfQlNUMV9CSVQJCQkxNQorI2RlZmluZSBSVDU2NjBfUFdSX0JTVDIJCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9CU1QyX0JJVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9QV1JfQlNUMwkJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjBfUFdSX0JTVDNfQklUCQkJMTMKKyNkZWZpbmUgUlQ1NjYwX1BXUl9NQjEJCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9NQjFfQklUCQkJMTEKKyNkZWZpbmUgUlQ1NjYwX1BXUl9NQjIJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9NQjJfQklUCQkJMTAKKyNkZWZpbmUgUlQ1NjYwX1BXUl9QTEwJCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2NjBfUFdSX1BMTF9CSVQJCQk5CisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgZm9yIE1peGVyICgweDY1KSAqLworI2RlZmluZSBSVDU2NjBfUFdSX09NX0wJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9PTV9MX0JJVAkJCTE1CisjZGVmaW5lIFJUNTY2MF9QV1JfT01fUgkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfUFdSX09NX1JfQklUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX1BXUl9TTQkJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjBfUFdSX1NNX0JJVAkJCTEzCisjZGVmaW5lIFJUNTY2MF9QV1JfUk1fTAkJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfUFdSX1JNX0xfQklUCQkJMTEKKyNkZWZpbmUgUlQ1NjYwX1BXUl9STV9SCQkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9QV1JfUk1fUl9CSVQJCQkxMAorCisvKiBQb3dlciBNYW5hZ2VtZW50IGZvciBWb2x1bWUgKDB4NjYpICovCisjZGVmaW5lIFJUNTY2MF9QV1JfU1YJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9TVl9CSVQJCQkxNQorI2RlZmluZSBSVDU2NjBfUFdSX0xWX0wJCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9MVl9MX0JJVAkJCTExCisjZGVmaW5lIFJUNTY2MF9QV1JfTFZfUgkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfUFdSX0xWX1JfQklUCQkJMTAKKworLyogSTJTMSBBdWRpbyBTZXJpYWwgRGF0YSBQb3J0IENvbnRyb2wgKDB4NzApICovCisjZGVmaW5lIFJUNTY2MF9JMlNfTVNfTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9JMlNfTVNfU0ZUCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX0kyU19NU19NCQkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9JMlNfTVNfUwkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfSTJTX09fQ1BfTUFTSwkJCSgweDMgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9JMlNfT19DUF9TRlQJCQkxMAorI2RlZmluZSBSVDU2NjBfSTJTX09fQ1BfT0ZGCQkJKDB4MCA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX0kyU19PX0NQX1VfTEFXCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX0kyU19PX0NQX0FfTEFXCQkJKDB4MiA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX0kyU19JX0NQX01BU0sJCQkoMHgzIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9JMlNfSV9DUF9TRlQJCQk4CisjZGVmaW5lIFJUNTY2MF9JMlNfSV9DUF9PRkYJCQkoMHgwIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9JMlNfSV9DUF9VX0xBVwkJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX0kyU19JX0NQX0FfTEFXCQkJKDB4MiA8PCA4KQorI2RlZmluZSBSVDU2NjBfSTJTX0JQX01BU0sJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTY2MF9JMlNfQlBfU0ZUCQkJNworI2RlZmluZSBSVDU2NjBfSTJTX0JQX05PUgkJCSgweDAgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX0kyU19CUF9JTlYJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTY2MF9JMlNfRExfTUFTSwkJCSgweDMgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX0kyU19ETF9TRlQJCQkyCisjZGVmaW5lIFJUNTY2MF9JMlNfRExfMTYJCQkoMHgwIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9JMlNfRExfMjAJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9JMlNfRExfMjQJCQkoMHgyIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9JMlNfRExfOAkJCQkoMHgzIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9JMlNfREZfTUFTSwkJCSgweDMpCisjZGVmaW5lIFJUNTY2MF9JMlNfREZfU0ZUCQkJMAorI2RlZmluZSBSVDU2NjBfSTJTX0RGX0kyUwkJCSgweDApCisjZGVmaW5lIFJUNTY2MF9JMlNfREZfTEVGVAkJCSgweDEpCisjZGVmaW5lIFJUNTY2MF9JMlNfREZfUENNX0EJCQkoMHgyKQorI2RlZmluZSBSVDU2NjBfSTJTX0RGX1BDTV9CCQkJKDB4MykKKworLyogQURDL0RBQyBDbG9jayBDb250cm9sIDEgKDB4NzMpICovCisjZGVmaW5lIFJUNTY2MF9JMlNfQkNMS19NUzFfTUFTSwkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0kyU19CQ0xLX01TMV9TRlQJCQkxNQorI2RlZmluZSBSVDU2NjBfSTJTX0JDTEtfTVMxXzMyCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0kyU19CQ0xLX01TMV82NAkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9JMlNfUEQxX01BU0sJCQkoMHg3IDw8IDEyKQorI2RlZmluZSBSVDU2NjBfSTJTX1BEMV9TRlQJCQkxMgorI2RlZmluZSBSVDU2NjBfSTJTX1BEMV8xCQkJKDB4MCA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0kyU19QRDFfMgkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9JMlNfUEQxXzMJCQkoMHgyIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfSTJTX1BEMV80CQkJKDB4MyA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0kyU19QRDFfNgkJCSgweDQgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9JMlNfUEQxXzgJCQkoMHg1IDw8IDEyKQorI2RlZmluZSBSVDU2NjBfSTJTX1BEMV8xMgkJCSgweDYgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9JMlNfUEQxXzE2CQkJKDB4NyA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0RBQ19PU1JfTUFTSwkJCSgweDMgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX0RBQ19PU1JfU0ZUCQkJMgorI2RlZmluZSBSVDU2NjBfREFDX09TUl8xMjgJCQkoMHgwIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9EQUNfT1NSXzY0CQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjBfREFDX09TUl8zMgkJCSgweDIgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX0RBQ19PU1JfMTYJCQkoMHgzIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9BRENfT1NSX01BU0sJCQkoMHgzKQorI2RlZmluZSBSVDU2NjBfQURDX09TUl9TRlQJCQkwCisjZGVmaW5lIFJUNTY2MF9BRENfT1NSXzEyOAkJCSgweDApCisjZGVmaW5lIFJUNTY2MF9BRENfT1NSXzY0CQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjYwX0FEQ19PU1JfMzIJCQkoMHgyKQorI2RlZmluZSBSVDU2NjBfQURDX09TUl8xNgkJCSgweDMpCisKKy8qIEFEQy9EQUMgQ2xvY2sgQ29udHJvbCAyICgweDc0KSAqLworI2RlZmluZSBSVDU2NjBfUkVTRVRfQURGCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjYwX1JFU0VUX0FERl9TRlQJCQkxMworI2RlZmluZSBSVDU2NjBfUkVTRVRfREFGCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX1JFU0VUX0RBRl9TRlQJCQkxMgorI2RlZmluZSBSVDU2NjBfREFIUEZfRU4JCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX0RBSFBGX0VOX1NGVAkJCTExCisjZGVmaW5lIFJUNTY2MF9BREhQRl9FTgkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfQURIUEZfRU5fU0ZUCQkJMTAKKworLyogRGlnaXRhbCBNaWNyb3Bob25lIENvbnRyb2wgKDB4NzUpICovCisjZGVmaW5lIFJUNTY2MF9ETUlDXzFfRU5fTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9ETUlDXzFfRU5fU0ZUCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX0RNSUNfMV9ESVMJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfRE1JQ18xX0VOCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0RNSUNfMUxfTEhfTUFTSwkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2MF9ETUlDXzFMX0xIX1NGVAkJCTEzCisjZGVmaW5lIFJUNTY2MF9ETUlDXzFMX0xIX1JJU0lORwkJKDB4MCA8PCAxMykKKyNkZWZpbmUgUlQ1NjYwX0RNSUNfMUxfTEhfRkFMTElORwkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjYwX0RNSUNfMVJfTEhfTUFTSwkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9ETUlDXzFSX0xIX1NGVAkJCTEyCisjZGVmaW5lIFJUNTY2MF9ETUlDXzFSX0xIX1JJU0lORwkJKDB4MCA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0RNSUNfMVJfTEhfRkFMTElORwkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX1NFTF9ETUlDX0RBVEFfTUFTSwkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX1NFTF9ETUlDX0RBVEFfU0ZUCQkxMQorI2RlZmluZSBSVDU2NjBfU0VMX0RNSUNfREFUQV9HUElPMgkJKDB4MCA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX1NFTF9ETUlDX0RBVEFfSU4xUAkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX0RNSUNfQ0xLX01BU0sJCQkoMHg3IDw8IDUpCisjZGVmaW5lIFJUNTY2MF9ETUlDX0NMS19TRlQJCQk1CisKKy8qIEdsb2JhbCBDbG9jayBDb250cm9sICgweDgwKSAqLworI2RlZmluZSBSVDU2NjBfU0NMS19TUkNfTUFTSwkJCSgweDMgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9TQ0xLX1NSQ19TRlQJCQkxNAorI2RlZmluZSBSVDU2NjBfU0NMS19TUkNfTUNMSwkJCSgweDAgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9TQ0xLX1NSQ19QTEwxCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX1NDTEtfU1JDX1JDQ0xLCQkJKDB4MiA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX1BMTDFfU1JDX01BU0sJCQkoMHgzIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfUExMMV9TUkNfU0ZUCQkJMTIKKyNkZWZpbmUgUlQ1NjYwX1BMTDFfU1JDX01DTEsJCQkoMHgwIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfUExMMV9TUkNfQkNMSzEJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfUExMMV9TUkNfUkNDTEsJCQkoMHgyIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfUExMMV9QRF9NQVNLCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjBfUExMMV9QRF9TRlQJCQkzCisjZGVmaW5lIFJUNTY2MF9QTEwxX1BEXzEJCQkoMHgwIDw8IDMpCisjZGVmaW5lIFJUNTY2MF9QTEwxX1BEXzIJCQkoMHgxIDw8IDMpCisKKyNkZWZpbmUgUlQ1NjYwX1BMTF9JTlBfTUFYCQkJNDAwMDAwMDAKKyNkZWZpbmUgUlQ1NjYwX1BMTF9JTlBfTUlOCQkJMjU2MDAwCisvKiBQTEwgTS9OL0sgQ29kZSBDb250cm9sIDEgKDB4ODEpICovCisjZGVmaW5lIFJUNTY2MF9QTExfTl9NQVgJCQkweDFmZgorI2RlZmluZSBSVDU2NjBfUExMX05fTUFTSwkJCShSVDU2NjBfUExMX05fTUFYIDw8IDcpCisjZGVmaW5lIFJUNTY2MF9QTExfTl9TRlQJCQk3CisjZGVmaW5lIFJUNTY2MF9QTExfS19NQVgJCQkweDFmCisjZGVmaW5lIFJUNTY2MF9QTExfS19NQVNLCQkJKFJUNTY2MF9QTExfS19NQVgpCisjZGVmaW5lIFJUNTY2MF9QTExfS19TRlQJCQkwCisKKy8qIFBMTCBNL04vSyBDb2RlIENvbnRyb2wgMiAoMHg4MikgKi8KKyNkZWZpbmUgUlQ1NjYwX1BMTF9NX01BWAkJCTB4ZgorI2RlZmluZSBSVDU2NjBfUExMX01fTUFTSwkJCShSVDU2NjBfUExMX01fTUFYIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfUExMX01fU0ZUCQkJMTIKKyNkZWZpbmUgUlQ1NjYwX1BMTF9NX0JQCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9QTExfTV9CUF9TRlQJCQkxMQorCisvKiBDbGFzcyBEIE92ZXIgQ3VycmVudCBDb250cm9sICgweDhjKSAqLworI2RlZmluZSBSVDU2NjBfQ0xTRF9PQ19NQVNLCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2NjBfQ0xTRF9PQ19TRlQJCQk5CisjZGVmaW5lIFJUNTY2MF9DTFNEX09DX1BVCQkJKDB4MCA8PCA5KQorI2RlZmluZSBSVDU2NjBfQ0xTRF9PQ19QRAkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjYwX0FVVE9fUERfTUFTSwkJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX0FVVE9fUERfU0ZUCQkJOAorI2RlZmluZSBSVDU2NjBfQVVUT19QRF9ESVMJCQkoMHgwIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9BVVRPX1BEX0VOCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2NjBfQ0xTRF9PQ19USF9NQVNLCQkJKDB4M2YpCisjZGVmaW5lIFJUNTY2MF9DTFNEX09DX1RIX1NGVAkJCTAKKworLyogQ2xhc3MgRCBPdXRwdXQgQ29udHJvbCAoMHg4ZCkgKi8KKyNkZWZpbmUgUlQ1NjYwX0NMU0RfUkFUSU9fTUFTSwkJCSgweGYgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9DTFNEX1JBVElPX1NGVAkJCTEyCisKKy8qIExvdXQgQW1wIENvbnRyb2wgMSAoMHg4ZSkgKi8KKyNkZWZpbmUgUlQ1NjYwX0xPVVRfQ09fTUFTSwkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjYwX0xPVVRfQ09fU0ZUCQkJNAorI2RlZmluZSBSVDU2NjBfTE9VVF9DT19ESVMJCQkoMHgwIDw8IDQpCisjZGVmaW5lIFJUNTY2MF9MT1VUX0NPX0VOCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjBfTE9VVF9DQl9NQVNLCQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjYwX0xPVVRfQ0JfU0ZUCQkJMAorI2RlZmluZSBSVDU2NjBfTE9VVF9DQl9QRAkJCSgweDApCisjZGVmaW5lIFJUNTY2MF9MT1VUX0NCX1BVCQkJKDB4MSkKKworLyogU1BLVkREIGRldGVjdGlvbiBjb250cm9sICgweDkyKSAqLworI2RlZmluZSBSVDU2NjBfU1BLVkREX0RFVF9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX1NQS1ZERF9ERVRfU0ZUCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX1NQS1ZERF9ERVRfRElTCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX1NQS1ZERF9ERVRfRU4JCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfU1BLX0FHX01BU0sJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfU1BLX0FHX1NGVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9TUEtfQUdfRElTCQkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX1NQS19BR19FTgkJCSgweDEgPDwgMTQpCisKKy8qIE1pY2JpYXMgQ29udHJvbCAoMHg5MykgKi8KKyNkZWZpbmUgUlQ1NjYwX01JQzFfQlNfTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9NSUMxX0JTX1NGVAkJCTE1CisjZGVmaW5lIFJUNTY2MF9NSUMxX0JTXzlBVgkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9NSUMxX0JTXzc1QVYJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfTUlDMl9CU19NQVNLCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX01JQzJfQlNfU0ZUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX01JQzJfQlNfOUFWCQkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX01JQzJfQlNfNzVBVgkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9NSUMxX09WQ0RfTUFTSwkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9NSUMxX09WQ0RfU0ZUCQkJMTEKKyNkZWZpbmUgUlQ1NjYwX01JQzFfT1ZDRF9ESVMJCQkoMHgwIDw8IDExKQorI2RlZmluZSBSVDU2NjBfTUlDMV9PVkNEX0VOCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX01JQzFfT1ZUSF9NQVNLCQkJKDB4MyA8PCA5KQorI2RlZmluZSBSVDU2NjBfTUlDMV9PVlRIX1NGVAkJCTkKKyNkZWZpbmUgUlQ1NjYwX01JQzFfT1ZUSF82MDBVQQkJCSgweDAgPDwgOSkKKyNkZWZpbmUgUlQ1NjYwX01JQzFfT1ZUSF8xNTAwVUEJCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTY2MF9NSUMxX09WVEhfMjAwMFVBCQkJKDB4MiA8PCA5KQorI2RlZmluZSBSVDU2NjBfTUlDMl9PVkNEX01BU0sJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9NSUMyX09WQ0RfU0ZUCQkJOAorI2RlZmluZSBSVDU2NjBfTUlDMl9PVkNEX0RJUwkJCSgweDAgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX01JQzJfT1ZDRF9FTgkJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX01JQzJfT1ZUSF9NQVNLCQkJKDB4MyA8PCA2KQorI2RlZmluZSBSVDU2NjBfTUlDMl9PVlRIX1NGVAkJCTYKKyNkZWZpbmUgUlQ1NjYwX01JQzJfT1ZUSF82MDBVQQkJCSgweDAgPDwgNikKKyNkZWZpbmUgUlQ1NjYwX01JQzJfT1ZUSF8xNTAwVUEJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2MF9NSUMyX09WVEhfMjAwMFVBCQkJKDB4MiA8PCA2KQorI2RlZmluZSBSVDU2NjBfUFdSX0NMSzI1TV9NQVNLCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjBfUFdSX0NMSzI1TV9TRlQJCQk0CisjZGVmaW5lIFJUNTY2MF9QV1JfQ0xLMjVNX1BECQkJKDB4MCA8PCA0KQorI2RlZmluZSBSVDU2NjBfUFdSX0NMSzI1TV9QVQkJCSgweDEgPDwgNCkKKworLyogRVEgQ29udHJvbCAxICgweGIwKSAqLworI2RlZmluZSBSVDU2NjBfRVFfU1JDX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfRVFfU1JDX1NGVAkJCTE1CisjZGVmaW5lIFJUNTY2MF9FUV9TUkNfREFDCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0VRX1NSQ19BREMJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfRVFfVVBECQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9FUV9VUERfQklUCQkJMTQKKworLyogSmFjayBEZXRlY3QgQ29udHJvbCAoMHhiYikgKi8KKyNkZWZpbmUgUlQ1NjYwX0pEX01BU0sJCQkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX0pEX1NGVAkJCQkxNAorI2RlZmluZSBSVDU2NjBfSkRfRElTCQkJCSgweDAgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9KRF9HUElPMQkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfSkRfR1BJTzIJCQkJKDB4MiA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX0pEX0xPVVRfTUFTSwkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9KRF9MT1VUX1NGVAkJCTExCisjZGVmaW5lIFJUNTY2MF9KRF9MT1VUX0RJUwkJCSgweDAgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9KRF9MT1VUX0VOCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX0pEX0xPVVRfVFJHX01BU0sJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfSkRfTE9VVF9UUkdfU0ZUCQkJMTAKKyNkZWZpbmUgUlQ1NjYwX0pEX0xPVVRfVFJHX0xPCQkJKDB4MCA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX0pEX0xPVVRfVFJHX0hJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX0pEX1NQT19NQVNLCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2NjBfSkRfU1BPX1NGVAkJCTkKKyNkZWZpbmUgUlQ1NjYwX0pEX1NQT19ESVMJCQkoMHgwIDw8IDkpCisjZGVmaW5lIFJUNTY2MF9KRF9TUE9fRU4JCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTY2MF9KRF9TUE9fVFJHX01BU0sJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9KRF9TUE9fVFJHX1NGVAkJCTgKKyNkZWZpbmUgUlQ1NjYwX0pEX1NQT19UUkdfTE8JCQkoMHgwIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9KRF9TUE9fVFJHX0hJCQkJKDB4MSA8PCA4KQorCisvKiBJUlEgQ29udHJvbCAxICgweGJkKSAqLworI2RlZmluZSBSVDU2NjBfSVJRX0pEX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfSVJRX0pEX1NGVAkJCTE1CisjZGVmaW5lIFJUNTY2MF9JUlFfSkRfQlAJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfSVJRX0pEX05PUgkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9JUlFfT1RfTUFTSwkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9JUlFfT1RfU0ZUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX0lSUV9PVF9CUAkJCSgweDAgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9JUlFfT1RfTk9SCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX0pEX1NUS1lfTUFTSwkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2MF9KRF9TVEtZX1NGVAkJCTEzCisjZGVmaW5lIFJUNTY2MF9KRF9TVEtZX0RJUwkJCSgweDAgPDwgMTMpCisjZGVmaW5lIFJUNTY2MF9KRF9TVEtZX0VOCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjYwX09UX1NUS1lfTUFTSwkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9PVF9TVEtZX1NGVAkJCTEyCisjZGVmaW5lIFJUNTY2MF9PVF9TVEtZX0RJUwkJCSgweDAgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9PVF9TVEtZX0VOCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0pEX1BfTUFTSwkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9KRF9QX1NGVAkJCQkxMQorI2RlZmluZSBSVDU2NjBfSkRfUF9OT1IJCQkJKDB4MCA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX0pEX1BfSU5WCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9PVF9QX01BU0sJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfT1RfUF9TRlQJCQkJMTAKKyNkZWZpbmUgUlQ1NjYwX09UX1BfTk9SCQkJCSgweDAgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9PVF9QX0lOVgkJCQkoMHgxIDw8IDEwKQorCisvKiBJUlEgQ29udHJvbCAyICgweGJlKSAqLworI2RlZmluZSBSVDU2NjBfSVJRX01CMV9PQ19NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0lSUV9NQjFfT0NfU0ZUCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX0lSUV9NQjFfT0NfQlAJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfSVJRX01CMV9PQ19OT1IJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfSVJRX01CMl9PQ19NQVNLCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX0lSUV9NQjJfT0NfU0ZUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX0lSUV9NQjJfT0NfQlAJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfSVJRX01CMl9PQ19OT1IJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfTUIxX09DX1NUS1lfTUFTSwkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9NQjFfT0NfU1RLWV9TRlQJCQkxMQorI2RlZmluZSBSVDU2NjBfTUIxX09DX1NUS1lfRElTCQkJKDB4MCA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX01CMV9PQ19TVEtZX0VOCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX01CMl9PQ19TVEtZX01BU0sJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfTUIyX09DX1NUS1lfU0ZUCQkJMTAKKyNkZWZpbmUgUlQ1NjYwX01CMl9PQ19TVEtZX0RJUwkJCSgweDAgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9NQjJfT0NfU1RLWV9FTgkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9NQjFfT0NfUF9NQVNLCQkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2NjBfTUIxX09DX1BfU0ZUCQkJNworI2RlZmluZSBSVDU2NjBfTUIxX09DX1BfTk9SCQkJKDB4MCA8PCA3KQorI2RlZmluZSBSVDU2NjBfTUIxX09DX1BfSU5WCQkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2NjBfTUIyX09DX1BfTUFTSwkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjYwX01CMl9PQ19QX1NGVAkJCTYKKyNkZWZpbmUgUlQ1NjYwX01CMl9PQ19QX05PUgkJCSgweDAgPDwgNikKKyNkZWZpbmUgUlQ1NjYwX01CMl9PQ19QX0lOVgkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjYwX01CMV9PQ19DTFIJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2MF9NQjFfT0NfQ0xSX1NGVAkJCTMKKyNkZWZpbmUgUlQ1NjYwX01CMl9PQ19DTFIJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9NQjJfT0NfQ0xSX1NGVAkJCTIKKworLyogR1BJTyBDb250cm9sIDEgKDB4YzApICovCisjZGVmaW5lIFJUNTY2MF9HUDJfUElOX01BU0sJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfR1AyX1BJTl9TRlQJCQkxNAorI2RlZmluZSBSVDU2NjBfR1AyX1BJTl9HUElPMgkJCSgweDAgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9HUDJfUElOX0RNSUMxX1NEQQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX0dQMV9QSU5fTUFTSwkJCSgweDMgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9HUDFfUElOX1NGVAkJCTEyCisjZGVmaW5lIFJUNTY2MF9HUDFfUElOX0dQSU8xCQkJKDB4MCA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0dQMV9QSU5fRE1JQzFfU0NMCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfR1AxX1BJTl9JUlEJCQkoMHgyIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfR1BJT19NX01BU0sJCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTY2MF9HUElPX01fU0ZUCQkJOQorI2RlZmluZSBSVDU2NjBfR1BJT19NX0ZMVAkJCSgweDAgPDwgOSkKKyNkZWZpbmUgUlQ1NjYwX0dQSU9fTV9QSAkJCSgweDEgPDwgOSkKKworLyogR1BJTyBDb250cm9sIDMgKDB4YzIpICovCisjZGVmaW5lIFJUNTY2MF9HUDJfUEZfTUFTSwkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjYwX0dQMl9QRl9TRlQJCQk1CisjZGVmaW5lIFJUNTY2MF9HUDJfUEZfSU4JCQkoMHgwIDw8IDUpCisjZGVmaW5lIFJUNTY2MF9HUDJfUEZfT1VUCQkJKDB4MSA8PCA1KQorI2RlZmluZSBSVDU2NjBfR1AyX09VVF9NQVNLCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjBfR1AyX09VVF9TRlQJCQk0CisjZGVmaW5lIFJUNTY2MF9HUDJfT1VUX0xPCQkJKDB4MCA8PCA0KQorI2RlZmluZSBSVDU2NjBfR1AyX09VVF9ISQkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjYwX0dQMl9QX01BU0sJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2MF9HUDJfUF9TRlQJCQkzCisjZGVmaW5lIFJUNTY2MF9HUDJfUF9OT1IJCQkoMHgwIDw8IDMpCisjZGVmaW5lIFJUNTY2MF9HUDJfUF9JTlYJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2MF9HUDFfUEZfTUFTSwkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX0dQMV9QRl9TRlQJCQkyCisjZGVmaW5lIFJUNTY2MF9HUDFfUEZfSU4JCQkoMHgwIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9HUDFfUEZfT1VUCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjBfR1AxX09VVF9NQVNLCQkJKDB4MSA8PCAxKQorI2RlZmluZSBSVDU2NjBfR1AxX09VVF9TRlQJCQkxCisjZGVmaW5lIFJUNTY2MF9HUDFfT1VUX0xPCQkJKDB4MCA8PCAxKQorI2RlZmluZSBSVDU2NjBfR1AxX09VVF9ISQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgUlQ1NjYwX0dQMV9QX01BU0sJCQkoMHgxKQorI2RlZmluZSBSVDU2NjBfR1AxX1BfU0ZUCQkJMAorI2RlZmluZSBSVDU2NjBfR1AxX1BfTk9SCQkJKDB4MCkKKyNkZWZpbmUgUlQ1NjYwX0dQMV9QX0lOVgkJCSgweDEpCisKKy8qIFNvZnQgdm9sdW1lIGFuZCB6ZXJvIGNyb3NzIGNvbnRyb2wgMSAoMHhkOSkgKi8KKyNkZWZpbmUgUlQ1NjYwX1NWX01BU0sJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX1NWX1NGVAkJCQkxNQorI2RlZmluZSBSVDU2NjBfU1ZfRElTCQkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9TVl9FTgkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfU1BPX1NWX01BU0sJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfU1BPX1NWX1NGVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9TUE9fU1ZfRElTCQkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX1NQT19TVl9FTgkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9PVVRfU1ZfTUFTSwkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9PVVRfU1ZfU0ZUCQkJMTIKKyNkZWZpbmUgUlQ1NjYwX09VVF9TVl9ESVMJCQkoMHgwIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfT1VUX1NWX0VOCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX1pDRF9ESUdfTUFTSwkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9aQ0RfRElHX1NGVAkJCTExCisjZGVmaW5lIFJUNTY2MF9aQ0RfRElHX0RJUwkJCSgweDAgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9aQ0RfRElHX0VOCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX1pDRF9NQVNLCQkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9aQ0RfU0ZUCQkJCTEwCisjZGVmaW5lIFJUNTY2MF9aQ0RfUEQJCQkJKDB4MCA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX1pDRF9QVQkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfU1ZfRExZX01BU0sJCQkoMHhmKQorI2RlZmluZSBSVDU2NjBfU1ZfRExZX1NGVAkJCTAKKworLyogU29mdCB2b2x1bWUgYW5kIHplcm8gY3Jvc3MgY29udHJvbCAyICgweGRhKSAqLworI2RlZmluZSBSVDU2NjBfWkNEX1NQT19NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX1pDRF9TUE9fU0ZUCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX1pDRF9TUE9fRElTCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX1pDRF9TUE9fRU4JCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfWkNEX09NUl9NQVNLCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2NjBfWkNEX09NUl9TRlQJCQk4CisjZGVmaW5lIFJUNTY2MF9aQ0RfT01SX0RJUwkJCSgweDAgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX1pDRF9PTVJfRU4JCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9aQ0RfT01MX01BU0sJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTY2MF9aQ0RfT01MX1NGVAkJCTcKKyNkZWZpbmUgUlQ1NjYwX1pDRF9PTUxfRElTCQkJKDB4MCA8PCA3KQorI2RlZmluZSBSVDU2NjBfWkNEX09NTF9FTgkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX1pDRF9TUE1fTUFTSwkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjYwX1pDRF9TUE1fU0ZUCQkJNgorI2RlZmluZSBSVDU2NjBfWkNEX1NQTV9ESVMJCQkoMHgwIDw8IDYpCisjZGVmaW5lIFJUNTY2MF9aQ0RfU1BNX0VOCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjBfWkNEX1JNUl9NQVNLCQkJKDB4MSA8PCA1KQorI2RlZmluZSBSVDU2NjBfWkNEX1JNUl9TRlQJCQk1CisjZGVmaW5lIFJUNTY2MF9aQ0RfUk1SX0RJUwkJCSgweDAgPDwgNSkKKyNkZWZpbmUgUlQ1NjYwX1pDRF9STVJfRU4JCQkoMHgxIDw8IDUpCisjZGVmaW5lIFJUNTY2MF9aQ0RfUk1MX01BU0sJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2MF9aQ0RfUk1MX1NGVAkJCTQKKyNkZWZpbmUgUlQ1NjYwX1pDRF9STUxfRElTCQkJKDB4MCA8PCA0KQorI2RlZmluZSBSVDU2NjBfWkNEX1JNTF9FTgkJCSgweDEgPDwgNCkKKworLyogR2VuZXJhbCBDb250cm9sIDEgKDB4ZmEpICovCisjZGVmaW5lIFJUNTY2MF9QV1JfVlJFRl9IUAkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9QV1JfVlJFRl9IUF9TRlQJCQkxMQorI2RlZmluZSBSVDU2NjBfRElHX0dBVEVfQ1RSTAkJCSgweDEpCisjZGVmaW5lIFJUNTY2MF9ESUdfR0FURV9DVFJMX1NGVAkJMAorCisvKiBTeXN0ZW0gQ2xvY2sgU291cmNlICovCisjZGVmaW5lIFJUNTY2MF9TQ0xLX1NfTUNMSwkJCTAKKyNkZWZpbmUgUlQ1NjYwX1NDTEtfU19QTEwxCQkJMQorI2RlZmluZSBSVDU2NjBfU0NMS19TX1JDQ0xLCQkJMgorCisvKiBQTEwxIFNvdXJjZSAqLworI2RlZmluZSBSVDU2NjBfUExMMV9TX01DTEsJCQkwCisjZGVmaW5lIFJUNTY2MF9QTEwxX1NfQkNMSwkJCTEKKworZW51bSB7CisJUlQ1NjYwX0FJRjEsCisJUlQ1NjYwX0FJRlMsCit9OworCitzdHJ1Y3QgcnQ1NjYwX3ByaXYgeworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3QgcnQ1NjYwX3BsYXRmb3JtX2RhdGEgcGRhdGE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXN0cnVjdCBjbGsgKm1jbGs7CisKKwlpbnQgc3lzY2xrOworCWludCBzeXNjbGtfc3JjOworCWludCBscmNrW1JUNTY2MF9BSUZTXTsKKwlpbnQgYmNsa1tSVDU2NjBfQUlGU107CisJaW50IG1hc3RlcltSVDU2NjBfQUlGU107CisKKwlpbnQgcGxsX3NyYzsKKwlpbnQgcGxsX2luOworCWludCBwbGxfb3V0OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY2My5jIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWExOGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NjMuYwpAQCAtMCwwICsxLDMyMTggQEAKKy8qCisgKiBydDU2NjMuYyAgLS0gIFJUNTY2OC9SVDU2NjMgQUxTQSBTb0MgYXVkaW8gY29kZWMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTYgUmVhbHRlayBTZW1pY29uZHVjdG9yIENvcnAuCisgKiBBdXRob3I6IEphY2sgWXUgPGphY2sueXVAcmVhbHRlay5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvamFjay5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorCisjaW5jbHVkZSAicnQ1NjYzLmgiCisjaW5jbHVkZSAicmw2MjMxLmgiCisKKyNkZWZpbmUgUlQ1NjY4X0RFVklDRV9JRCAweDY0NTEKKyNkZWZpbmUgUlQ1NjYzX0RFVklDRV9JRCAweDY0MDYKKworZW51bSB7CisJQ09ERUNfVFlQRV9SVDU2NjgsCisJQ09ERUNfVFlQRV9SVDU2NjMsCit9OworCitzdHJ1Y3QgcnQ1NjYzX3ByaXYgeworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IGRlbGF5ZWRfd29yayBqYWNrX2RldGVjdF93b3JrOworCXN0cnVjdCBzbmRfc29jX2phY2sgKmhzX2phY2s7CisJc3RydWN0IHRpbWVyX2xpc3QgYnRuX2NoZWNrX3RpbWVyOworCisJaW50IGNvZGVjX3R5cGU7CisJaW50IHN5c2NsazsKKwlpbnQgc3lzY2xrX3NyYzsKKwlpbnQgbHJjazsKKworCWludCBwbGxfc3JjOworCWludCBwbGxfaW47CisJaW50IHBsbF9vdXQ7CisKKwlpbnQgamFja190eXBlOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCBydDU2NjhfcmVnW10gPSB7CisJeyAweDAwMDAsIDB4MDAwMCB9LAorCXsgMHgwMDAxLCAweGM4YzggfSwKKwl7IDB4MDAwMiwgMHg4MDgwIH0sCisJeyAweDAwMDMsIDB4ODAwMCB9LAorCXsgMHgwMDA0LCAweGM4MGEgfSwKKwl7IDB4MDAwNSwgMHgwMDAwIH0sCisJeyAweDAwMDYsIDB4MDAwMCB9LAorCXsgMHgwMDA3LCAweDAwMDAgfSwKKwl7IDB4MDAwYSwgMHgwMDAwIH0sCisJeyAweDAwMGIsIDB4MDAwMCB9LAorCXsgMHgwMDBjLCAweDAwMDAgfSwKKwl7IDB4MDAwZCwgMHgwMDAwIH0sCisJeyAweDAwMGYsIDB4MDgwOCB9LAorCXsgMHgwMDEwLCAweDQwMDAgfSwKKwl7IDB4MDAxMSwgMHgwMDAwIH0sCisJeyAweDAwMTIsIDB4MTQwNCB9LAorCXsgMHgwMDEzLCAweDEwMDAgfSwKKwl7IDB4MDAxNCwgMHhhMDBhIH0sCisJeyAweDAwMTUsIDB4MDQwNCB9LAorCXsgMHgwMDE2LCAweDA0MDQgfSwKKwl7IDB4MDAxNywgMHgwMDExIH0sCisJeyAweDAwMTgsIDB4YWZhZiB9LAorCXsgMHgwMDE5LCAweGFmYWYgfSwKKwl7IDB4MDAxYSwgMHhhZmFmIH0sCisJeyAweDAwMWIsIDB4MDAxMSB9LAorCXsgMHgwMDFjLCAweDJmMmYgfSwKKwl7IDB4MDAxZCwgMHgyZjJmIH0sCisJeyAweDAwMWUsIDB4MmYyZiB9LAorCXsgMHgwMDFmLCAweDAwMDAgfSwKKwl7IDB4MDAyMCwgMHgwMDAwIH0sCisJeyAweDAwMjEsIDB4MDAwMCB9LAorCXsgMHgwMDIyLCAweDU3NTcgfSwKKwl7IDB4MDAyMywgMHgwMDM5IH0sCisJeyAweDAwMjQsIDB4MDAwYiB9LAorCXsgMHgwMDI2LCAweGMwYzAgfSwKKwl7IDB4MDAyNywgMHhjMGMwIH0sCisJeyAweDAwMjgsIDB4YzBjMCB9LAorCXsgMHgwMDI5LCAweDgwODAgfSwKKwl7IDB4MDAyYSwgMHhhYWFhIH0sCisJeyAweDAwMmIsIDB4YWFhYSB9LAorCXsgMHgwMDJjLCAweGFiYTggfSwKKwl7IDB4MDAyZCwgMHgwMDAwIH0sCisJeyAweDAwMmUsIDB4MDAwMCB9LAorCXsgMHgwMDJmLCAweDAwMDAgfSwKKwl7IDB4MDAzMCwgMHgwMDAwIH0sCisJeyAweDAwMzEsIDB4NTAwMCB9LAorCXsgMHgwMDMyLCAweDAwMDAgfSwKKwl7IDB4MDAzMywgMHgwMDAwIH0sCisJeyAweDAwMzQsIDB4MDAwMCB9LAorCXsgMHgwMDM1LCAweDAwMDAgfSwKKwl7IDB4MDAzYSwgMHgwMDAwIH0sCisJeyAweDAwM2IsIDB4MDAwMCB9LAorCXsgMHgwMDNjLCAweDAwZmYgfSwKKwl7IDB4MDAzZCwgMHgwMDAwIH0sCisJeyAweDAwM2UsIDB4MDBmZiB9LAorCXsgMHgwMDNmLCAweDAwMDAgfSwKKwl7IDB4MDA0MCwgMHgwMDAwIH0sCisJeyAweDAwNDEsIDB4MDBmZiB9LAorCXsgMHgwMDQyLCAweDAwMDAgfSwKKwl7IDB4MDA0MywgMHgwMGZmIH0sCisJeyAweDAwNDQsIDB4MGMwYyB9LAorCXsgMHgwMDQ5LCAweGMwMGIgfSwKKwl7IDB4MDA0YSwgMHgwMDAwIH0sCisJeyAweDAwNGIsIDB4MDMxZiB9LAorCXsgMHgwMDRkLCAweDAwMDAgfSwKKwl7IDB4MDA0ZSwgMHgwMDFmIH0sCisJeyAweDAwNGYsIDB4MDAwMCB9LAorCXsgMHgwMDUwLCAweDAwMWYgfSwKKwl7IDB4MDA1MiwgMHhmMDAwIH0sCisJeyAweDAwNjEsIDB4MDAwMCB9LAorCXsgMHgwMDYyLCAweDAwMDAgfSwKKwl7IDB4MDA2MywgMHgwMDNlIH0sCisJeyAweDAwNjQsIDB4MDAwMCB9LAorCXsgMHgwMDY1LCAweDAwMDAgfSwKKwl7IDB4MDA2NiwgMHgwMDNmIH0sCisJeyAweDAwNjcsIDB4MDAwMCB9LAorCXsgMHgwMDZiLCAweDAwMDAgfSwKKwl7IDB4MDA2ZCwgMHhmZjAwIH0sCisJeyAweDAwNmUsIDB4MjgwOCB9LAorCXsgMHgwMDZmLCAweDAwMGEgfSwKKwl7IDB4MDA3MCwgMHg4MDAwIH0sCisJeyAweDAwNzEsIDB4ODAwMCB9LAorCXsgMHgwMDcyLCAweDgwMDAgfSwKKwl7IDB4MDA3MywgMHg3MDAwIH0sCisJeyAweDAwNzQsIDB4Nzc3MCB9LAorCXsgMHgwMDc1LCAweDAwMDIgfSwKKwl7IDB4MDA3NiwgMHgwMDAxIH0sCisJeyAweDAwNzgsIDB4MDBmMCB9LAorCXsgMHgwMDc5LCAweDAwMDAgfSwKKwl7IDB4MDA3YSwgMHgwMDAwIH0sCisJeyAweDAwN2IsIDB4MDAwMCB9LAorCXsgMHgwMDdjLCAweDAwMDAgfSwKKwl7IDB4MDA3ZCwgMHgwMTIzIH0sCisJeyAweDAwN2UsIDB4NDUwMCB9LAorCXsgMHgwMDdmLCAweDgwMDMgfSwKKwl7IDB4MDA4MCwgMHgwMDAwIH0sCisJeyAweDAwODEsIDB4MDAwMCB9LAorCXsgMHgwMDgyLCAweDAwMDAgfSwKKwl7IDB4MDA4MywgMHgwMDAwIH0sCisJeyAweDAwODQsIDB4MDAwMCB9LAorCXsgMHgwMDg1LCAweDAwMDAgfSwKKwl7IDB4MDA4NiwgMHgwMDA4IH0sCisJeyAweDAwODcsIDB4MDAwMCB9LAorCXsgMHgwMDg4LCAweDAwMDAgfSwKKwl7IDB4MDA4OSwgMHgwMDAwIH0sCisJeyAweDAwOGEsIDB4MDAwMCB9LAorCXsgMHgwMDhiLCAweDAwMDAgfSwKKwl7IDB4MDA4YywgMHgwMDAzIH0sCisJeyAweDAwOGUsIDB4MDA2MCB9LAorCXsgMHgwMDhmLCAweDEwMDAgfSwKKwl7IDB4MDA5MSwgMHgwYzI2IH0sCisJeyAweDAwOTIsIDB4MDA3MyB9LAorCXsgMHgwMDkzLCAweDAwMDAgfSwKKwl7IDB4MDA5NCwgMHgwMDgwIH0sCisJeyAweDAwOTgsIDB4MDAwMCB9LAorCXsgMHgwMDk5LCAweDAwMDAgfSwKKwl7IDB4MDA5YSwgMHgwMDA3IH0sCisJeyAweDAwOWYsIDB4MDAwMCB9LAorCXsgMHgwMGEwLCAweDAwMDAgfSwKKwl7IDB4MDBhMSwgMHgwMDAyIH0sCisJeyAweDAwYTIsIDB4MDAwMSB9LAorCXsgMHgwMGEzLCAweDAwMDIgfSwKKwl7IDB4MDBhNCwgMHgwMDAxIH0sCisJeyAweDAwYWUsIDB4MjA0MCB9LAorCXsgMHgwMGFmLCAweDAwMDAgfSwKKwl7IDB4MDBiNiwgMHgwMDAwIH0sCisJeyAweDAwYjcsIDB4MDAwMCB9LAorCXsgMHgwMGI4LCAweDAwMDAgfSwKKwl7IDB4MDBiOSwgMHgwMDAwIH0sCisJeyAweDAwYmEsIDB4MDAwMiB9LAorCXsgMHgwMGJiLCAweDAwMDAgfSwKKwl7IDB4MDBiZSwgMHgwMDAwIH0sCisJeyAweDAwYzAsIDB4MDAwMCB9LAorCXsgMHgwMGMxLCAweDBhYWEgfSwKKwl7IDB4MDBjMiwgMHhhYTgwIH0sCisJeyAweDAwYzMsIDB4MDAwMyB9LAorCXsgMHgwMGM0LCAweDAwMDAgfSwKKwl7IDB4MDBkMCwgMHgwMDAwIH0sCisJeyAweDAwZDEsIDB4MjI0NCB9LAorCXsgMHgwMGQyLCAweDAwMDAgfSwKKwl7IDB4MDBkMywgMHgzMzAwIH0sCisJeyAweDAwZDQsIDB4MjIwMCB9LAorCXsgMHgwMGQ5LCAweDA4MDkgfSwKKwl7IDB4MDBkYSwgMHgwMDAwIH0sCisJeyAweDAwZGIsIDB4MDAwOCB9LAorCXsgMHgwMGRjLCAweDAwYzAgfSwKKwl7IDB4MDBkZCwgMHg2NzI0IH0sCisJeyAweDAwZGUsIDB4MzEzMSB9LAorCXsgMHgwMGRmLCAweDAwMDggfSwKKwl7IDB4MDBlMCwgMHg0MDAwIH0sCisJeyAweDAwZTEsIDB4MzEzMSB9LAorCXsgMHgwMGUyLCAweDYwMGMgfSwKKwl7IDB4MDBlYSwgMHhiMzIwIH0sCisJeyAweDAwZWIsIDB4MDAwMCB9LAorCXsgMHgwMGVjLCAweGIzMDAgfSwKKwl7IDB4MDBlZCwgMHgwMDAwIH0sCisJeyAweDAwZWUsIDB4YjMyMCB9LAorCXsgMHgwMGVmLCAweDAwMDAgfSwKKwl7IDB4MDBmMCwgMHgwMjAxIH0sCisJeyAweDAwZjEsIDB4MGRkZCB9LAorCXsgMHgwMGYyLCAweDBkZGQgfSwKKwl7IDB4MDBmNiwgMHgwMDAwIH0sCisJeyAweDAwZjcsIDB4MDAwMCB9LAorCXsgMHgwMGY4LCAweDAwMDAgfSwKKwl7IDB4MDBmYSwgMHgwMDAwIH0sCisJeyAweDAwZmIsIDB4MDAwMCB9LAorCXsgMHgwMGZjLCAweDAwMDAgfSwKKwl7IDB4MDBmZCwgMHgwMDAwIH0sCisJeyAweDAwZmUsIDB4MTBlYyB9LAorCXsgMHgwMGZmLCAweDY0NTEgfSwKKwl7IDB4MDEwMCwgMHhhYWFhIH0sCisJeyAweDAxMDEsIDB4MDAwYSB9LAorCXsgMHgwMTBhLCAweGFhYWEgfSwKKwl7IDB4MDEwYiwgMHhhMGEwIH0sCisJeyAweDAxMGMsIDB4YWVhZSB9LAorCXsgMHgwMTBkLCAweGFhYWEgfSwKKwl7IDB4MDEwZSwgMHhhYWFhIH0sCisJeyAweDAxMGYsIDB4YWFhYSB9LAorCXsgMHgwMTEwLCAweGUwMDIgfSwKKwl7IDB4MDExMSwgMHhhNjAyIH0sCisJeyAweDAxMTIsIDB4YWFhYSB9LAorCXsgMHgwMTEzLCAweDIwMDAgfSwKKwl7IDB4MDExNywgMHgwZjAwIH0sCisJeyAweDAxMjUsIDB4MDQyMCB9LAorCXsgMHgwMTMyLCAweDAwMDAgfSwKKwl7IDB4MDEzMywgMHgwMDAwIH0sCisJeyAweDAxMzYsIDB4NTU1NSB9LAorCXsgMHgwMTM3LCAweDU1NDAgfSwKKwl7IDB4MDEzOCwgMHgzNzAwIH0sCisJeyAweDAxMzksIDB4NzlhMSB9LAorCXsgMHgwMTNhLCAweDIwMjAgfSwKKwl7IDB4MDEzYiwgMHgyMDIwIH0sCisJeyAweDAxM2MsIDB4MjAwNSB9LAorCXsgMHgwMTNmLCAweDAwMDAgfSwKKwl7IDB4MDE0NSwgMHgwMDAyIH0sCisJeyAweDAxNDYsIDB4MDAwMCB9LAorCXsgMHgwMTQ3LCAweDAwMDAgfSwKKwl7IDB4MDE0OCwgMHgwMDAwIH0sCisJeyAweDAxNjAsIDB4NGVjMCB9LAorCXsgMHgwMTYxLCAweDAwODAgfSwKKwl7IDB4MDE2MiwgMHgwMjAwIH0sCisJeyAweDAxNjMsIDB4MDgwMCB9LAorCXsgMHgwMTY0LCAweDAwMDAgfSwKKwl7IDB4MDE2NSwgMHgwMDAwIH0sCisJeyAweDAxNjYsIDB4MDAwMCB9LAorCXsgMHgwMTY3LCAweDAwMGYgfSwKKwl7IDB4MDE2OCwgMHgwMDBmIH0sCisJeyAweDAxNzAsIDB4NGU4MCB9LAorCXsgMHgwMTcxLCAweDAwODAgfSwKKwl7IDB4MDE3MiwgMHgwMjAwIH0sCisJeyAweDAxNzMsIDB4MDgwMCB9LAorCXsgMHgwMTc0LCAweDAwZmYgfSwKKwl7IDB4MDE3NSwgMHgwMDAwIH0sCisJeyAweDAxOTAsIDB4NDEzMSB9LAorCXsgMHgwMTkxLCAweDQxMzEgfSwKKwl7IDB4MDE5MiwgMHg0MTMxIH0sCisJeyAweDAxOTMsIDB4NDEzMSB9LAorCXsgMHgwMTk0LCAweDAwMDAgfSwKKwl7IDB4MDE5NSwgMHgwMDAwIH0sCisJeyAweDAxOTYsIDB4MDAwMCB9LAorCXsgMHgwMTk3LCAweDAwMDAgfSwKKwl7IDB4MDE5OCwgMHgwMDAwIH0sCisJeyAweDAxOTksIDB4MDAwMCB9LAorCXsgMHgwMWEwLCAweDFlNjQgfSwKKwl7IDB4MDFhMSwgMHgwNmEzIH0sCisJeyAweDAxYTIsIDB4MDAwMCB9LAorCXsgMHgwMWEzLCAweDAwMDAgfSwKKwl7IDB4MDFhNCwgMHgwMDAwIH0sCisJeyAweDAxYTUsIDB4MDAwMCB9LAorCXsgMHgwMWE2LCAweDAwMDAgfSwKKwl7IDB4MDFhNywgMHgwMDAwIH0sCisJeyAweDAxYTgsIDB4MDAwMCB9LAorCXsgMHgwMWE5LCAweDAwMDAgfSwKKwl7IDB4MDFhYSwgMHgwMDAwIH0sCisJeyAweDAxYWIsIDB4MDAwMCB9LAorCXsgMHgwMWI1LCAweDAwMDAgfSwKKwl7IDB4MDFiNiwgMHgwMWMzIH0sCisJeyAweDAxYjcsIDB4MDJhMCB9LAorCXsgMHgwMWI4LCAweDAzZTkgfSwKKwl7IDB4MDFiOSwgMHgxMzg5IH0sCisJeyAweDAxYmEsIDB4YzM1MSB9LAorCXsgMHgwMWJiLCAweDAwMDkgfSwKKwl7IDB4MDFiYywgMHgwMDE4IH0sCisJeyAweDAxYmQsIDB4MDAyYSB9LAorCXsgMHgwMWJlLCAweDAwNGMgfSwKKwl7IDB4MDFiZiwgMHgwMDk3IH0sCisJeyAweDAxYzAsIDB4NDMzZCB9LAorCXsgMHgwMWMxLCAweDAwMDAgfSwKKwl7IDB4MDFjMiwgMHgwMDAwIH0sCisJeyAweDAxYzMsIDB4MDAwMCB9LAorCXsgMHgwMWM0LCAweDAwMDAgfSwKKwl7IDB4MDFjNSwgMHgwMDAwIH0sCisJeyAweDAxYzYsIDB4MDAwMCB9LAorCXsgMHgwMWM3LCAweDAwMDAgfSwKKwl7IDB4MDFjOCwgMHg0MGFmIH0sCisJeyAweDAxYzksIDB4MDcwMiB9LAorCXsgMHgwMWNhLCAweDAwMDAgfSwKKwl7IDB4MDFjYiwgMHgwMDAwIH0sCisJeyAweDAxY2MsIDB4NTc1NyB9LAorCXsgMHgwMWNkLCAweDU3NTcgfSwKKwl7IDB4MDFjZSwgMHg1NzU3IH0sCisJeyAweDAxY2YsIDB4NTc1NyB9LAorCXsgMHgwMWQwLCAweDU3NTcgfSwKKwl7IDB4MDFkMSwgMHg1NzU3IH0sCisJeyAweDAxZDIsIDB4NTc1NyB9LAorCXsgMHgwMWQzLCAweDU3NTcgfSwKKwl7IDB4MDFkNCwgMHg1NzU3IH0sCisJeyAweDAxZDUsIDB4NTc1NyB9LAorCXsgMHgwMWQ2LCAweDAwM2MgfSwKKwl7IDB4MDFkYSwgMHgwMDAwIH0sCisJeyAweDAxZGIsIDB4MDAwMCB9LAorCXsgMHgwMWRjLCAweDAwMDAgfSwKKwl7IDB4MDFkZSwgMHg3YzAwIH0sCisJeyAweDAxZGYsIDB4MDMyMCB9LAorCXsgMHgwMWUwLCAweDA2YTEgfSwKKwl7IDB4MDFlMSwgMHgwMDAwIH0sCisJeyAweDAxZTIsIDB4MDAwMCB9LAorCXsgMHgwMWUzLCAweDAwMDAgfSwKKwl7IDB4MDFlNCwgMHgwMDAwIH0sCisJeyAweDAxZTUsIDB4MDAwMCB9LAorCXsgMHgwMWU2LCAweDAwMDEgfSwKKwl7IDB4MDFlNywgMHgwMDAwIH0sCisJeyAweDAxZTgsIDB4MDAwMCB9LAorCXsgMHgwMWVhLCAweDAwMDAgfSwKKwl7IDB4MDFlYiwgMHgwMDAwIH0sCisJeyAweDAxZWMsIDB4MDAwMCB9LAorCXsgMHgwMWVkLCAweDAwMDAgfSwKKwl7IDB4MDFlZSwgMHgwMDAwIH0sCisJeyAweDAxZWYsIDB4MDAwMCB9LAorCXsgMHgwMWYwLCAweDAwMDAgfSwKKwl7IDB4MDFmMSwgMHgwMDAwIH0sCisJeyAweDAxZjIsIDB4MDAwMCB9LAorCXsgMHgwMWYzLCAweDAwMDAgfSwKKwl7IDB4MDFmNCwgMHgwMDAwIH0sCisJeyAweDAyMDAsIDB4MDAwMCB9LAorCXsgMHgwMjAxLCAweDAwMDAgfSwKKwl7IDB4MDIwMiwgMHgwMDAwIH0sCisJeyAweDAyMDMsIDB4MDAwMCB9LAorCXsgMHgwMjA0LCAweDAwMDAgfSwKKwl7IDB4MDIwNSwgMHgwMDAwIH0sCisJeyAweDAyMDYsIDB4MDAwMCB9LAorCXsgMHgwMjA3LCAweDAwMDAgfSwKKwl7IDB4MDIwOCwgMHgwMDAwIH0sCisJeyAweDAyMTAsIDB4NjBiMSB9LAorCXsgMHgwMjExLCAweGEwMDAgfSwKKwl7IDB4MDIxMiwgMHgwMjRjIH0sCisJeyAweDAyMTMsIDB4ZjdmZiB9LAorCXsgMHgwMjE0LCAweDAyNGMgfSwKKwl7IDB4MDIxNSwgMHgwMTAyIH0sCisJeyAweDAyMTYsIDB4MDBhMyB9LAorCXsgMHgwMjE3LCAweDAwNDggfSwKKwl7IDB4MDIxOCwgMHg5MmMwIH0sCisJeyAweDAyMTksIDB4MDAwMCB9LAorCXsgMHgwMjFhLCAweDAwYzggfSwKKwl7IDB4MDIxYiwgMHgwMDIwIH0sCisJeyAweDAyZmEsIDB4MDAwMCB9LAorCXsgMHgwMmZiLCAweDAwMDAgfSwKKwl7IDB4MDJmYywgMHgwMDAwIH0sCisJeyAweDAyZmYsIDB4MDExMCB9LAorCXsgMHgwMzAwLCAweDAwMWYgfSwKKwl7IDB4MDMwMSwgMHgwMzJjIH0sCisJeyAweDAzMDIsIDB4NWYyMSB9LAorCXsgMHgwMzAzLCAweDQwMDAgfSwKKwl7IDB4MDMwNCwgMHg0MDAwIH0sCisJeyAweDAzMDUsIDB4MDZkNSB9LAorCXsgMHgwMzA2LCAweDgwMDAgfSwKKwl7IDB4MDMwNywgMHgwNzAwIH0sCisJeyAweDAzMTAsIDB4NDU2MCB9LAorCXsgMHgwMzExLCAweGE0YTggfSwKKwl7IDB4MDMxMiwgMHg3NDE4IH0sCisJeyAweDAzMTMsIDB4MDAwMCB9LAorCXsgMHgwMzE0LCAweDAwMDYgfSwKKwl7IDB4MDMxNSwgMHhmZmZmIH0sCisJeyAweDAzMTYsIDB4YzQwMCB9LAorCXsgMHgwMzE3LCAweDAwMDAgfSwKKwl7IDB4MDMzMCwgMHgwMGE2IH0sCisJeyAweDAzMzEsIDB4MDRjMyB9LAorCXsgMHgwMzMyLCAweDI3YzggfSwKKwl7IDB4MDMzMywgMHhiZjUwIH0sCisJeyAweDAzMzQsIDB4MDA0NSB9LAorCXsgMHgwMzM1LCAweDAwMDcgfSwKKwl7IDB4MDMzNiwgMHg3NDE4IH0sCisJeyAweDAzMzcsIDB4MDUwMSB9LAorCXsgMHgwMzM4LCAweDAwMDAgfSwKKwl7IDB4MDMzOSwgMHgwMDEwIH0sCisJeyAweDAzM2EsIDB4MTAxMCB9LAorCXsgMHgwM2MwLCAweDdlMDAgfSwKKwl7IDB4MDNjMSwgMHg4MDAwIH0sCisJeyAweDAzYzIsIDB4ODAwMCB9LAorCXsgMHgwM2MzLCAweDgwMDAgfSwKKwl7IDB4MDNjNCwgMHg4MDAwIH0sCisJeyAweDAzYzUsIDB4ODAwMCB9LAorCXsgMHgwM2M2LCAweDgwMDAgfSwKKwl7IDB4MDNjNywgMHg4MDAwIH0sCisJeyAweDAzYzgsIDB4ODAwMCB9LAorCXsgMHgwM2M5LCAweDgwMDAgfSwKKwl7IDB4MDNjYSwgMHg4MDAwIH0sCisJeyAweDAzY2IsIDB4ODAwMCB9LAorCXsgMHgwM2NjLCAweDgwMDAgfSwKKwl7IDB4MDNkMCwgMHgwMDAwIH0sCisJeyAweDAzZDEsIDB4MDAwMCB9LAorCXsgMHgwM2QyLCAweDAwMDAgfSwKKwl7IDB4MDNkMywgMHgwMDAwIH0sCisJeyAweDAzZDQsIDB4MjAwMCB9LAorCXsgMHgwM2Q1LCAweDIwMDAgfSwKKwl7IDB4MDNkNiwgMHgwMDAwIH0sCisJeyAweDAzZDcsIDB4MDAwMCB9LAorCXsgMHgwM2Q4LCAweDIwMDAgfSwKKwl7IDB4MDNkOSwgMHgyMDAwIH0sCisJeyAweDAzZGEsIDB4MjAwMCB9LAorCXsgMHgwM2RiLCAweDIwMDAgfSwKKwl7IDB4MDNkYywgMHgwMDAwIH0sCisJeyAweDAzZGQsIDB4MDAwMCB9LAorCXsgMHgwM2RlLCAweDAwMDAgfSwKKwl7IDB4MDNkZiwgMHgyMDAwIH0sCisJeyAweDAzZTAsIDB4MDAwMCB9LAorCXsgMHgwM2UxLCAweDAwMDAgfSwKKwl7IDB4MDNlMiwgMHgwMDAwIH0sCisJeyAweDAzZTMsIDB4MDAwMCB9LAorCXsgMHgwM2U0LCAweDAwMDAgfSwKKwl7IDB4MDNlNSwgMHgwMDAwIH0sCisJeyAweDAzZTYsIDB4MDAwMCB9LAorCXsgMHgwM2U3LCAweDAwMDAgfSwKKwl7IDB4MDNlOCwgMHgwMDAwIH0sCisJeyAweDAzZTksIDB4MDAwMCB9LAorCXsgMHgwM2VhLCAweDAwMDAgfSwKKwl7IDB4MDNlYiwgMHgwMDAwIH0sCisJeyAweDAzZWMsIDB4MDAwMCB9LAorCXsgMHgwM2VkLCAweDAwMDAgfSwKKwl7IDB4MDNlZSwgMHgwMDAwIH0sCisJeyAweDAzZWYsIDB4MDAwMCB9LAorCXsgMHgwM2YwLCAweDA4MDAgfSwKKwl7IDB4MDNmMSwgMHgwODAwIH0sCisJeyAweDAzZjIsIDB4MDgwMCB9LAorCXsgMHgwM2YzLCAweDA4MDAgfSwKKwl7IDB4MDNmZSwgMHgwMDAwIH0sCisJeyAweDAzZmYsIDB4MDAwMCB9LAorCXsgMHgwN2YwLCAweDAwMDAgfSwKKwl7IDB4MDdmYSwgMHgwMDAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0IHJ0NTY2M19yZWdbXSA9IHsKKwl7IDB4MDAwMCwgMHgwMDAwIH0sCisJeyAweDAwMDIsIDB4MDAwOCB9LAorCXsgMHgwMDA1LCAweDEwMDAgfSwKKwl7IDB4MDAwNiwgMHgxMDAwIH0sCisJeyAweDAwMGEsIDB4MDAwMCB9LAorCXsgMHgwMDEwLCAweDAwMGYgfSwKKwl7IDB4MDAxNSwgMHg0MmMxIH0sCisJeyAweDAwMTYsIDB4MDAwMCB9LAorCXsgMHgwMDE4LCAweDAwMGIgfSwKKwl7IDB4MDAxOSwgMHhhZmFmIH0sCisJeyAweDAwMWMsIDB4MmYyZiB9LAorCXsgMHgwMDFmLCAweDAwMDAgfSwKKwl7IDB4MDAyMiwgMHg1NzU3IH0sCisJeyAweDAwMjMsIDB4MDAzOSB9LAorCXsgMHgwMDI2LCAweGMwYzAgfSwKKwl7IDB4MDAyOSwgMHg4MDgwIH0sCisJeyAweDAwMmEsIDB4YTBhMCB9LAorCXsgMHgwMDJjLCAweDAwMGMgfSwKKwl7IDB4MDAyZCwgMHgwMDAwIH0sCisJeyAweDAwNDAsIDB4MDgwOCB9LAorCXsgMHgwMDYxLCAweDAwMDAgfSwKKwl7IDB4MDA2MiwgMHgwMDAwIH0sCisJeyAweDAwNjMsIDB4MDAzZSB9LAorCXsgMHgwMDY0LCAweDAwMDAgfSwKKwl7IDB4MDA2NSwgMHgwMDAwIH0sCisJeyAweDAwNjYsIDB4MDAwMCB9LAorCXsgMHgwMDZiLCAweDAwMDAgfSwKKwl7IDB4MDA2ZSwgMHgwMDAwIH0sCisJeyAweDAwNmYsIDB4MDAwMCB9LAorCXsgMHgwMDcwLCAweDgwMjAgfSwKKwl7IDB4MDA3MywgMHgxMDAwIH0sCisJeyAweDAwNzQsIDB4ZTQwMCB9LAorCXsgMHgwMDc1LCAweDAwMDIgfSwKKwl7IDB4MDA3NiwgMHgwMDAxIH0sCisJeyAweDAwNzcsIDB4MDBmMCB9LAorCXsgMHgwMDc4LCAweDAwMDAgfSwKKwl7IDB4MDA3OSwgMHgwMDAwIH0sCisJeyAweDAwN2EsIDB4MDEyMyB9LAorCXsgMHgwMDdiLCAweDgwMDMgfSwKKwl7IDB4MDA4MCwgMHgwMDAwIH0sCisJeyAweDAwODEsIDB4MDAwMCB9LAorCXsgMHgwMDgyLCAweDAwMDAgfSwKKwl7IDB4MDA4MywgMHgwMDAwIH0sCisJeyAweDAwODQsIDB4MDAwMCB9LAorCXsgMHgwMDg2LCAweDAwMDggfSwKKwl7IDB4MDA4NywgMHgwMDAwIH0sCisJeyAweDAwOGEsIDB4MDAwMCB9LAorCXsgMHgwMDhiLCAweDAwMDAgfSwKKwl7IDB4MDA4YywgMHgwMDAzIH0sCisJeyAweDAwOGUsIDB4MDAwNCB9LAorCXsgMHgwMDhmLCAweDEwMDAgfSwKKwl7IDB4MDA5MCwgMHgwNjQ2IH0sCisJeyAweDAwOTEsIDB4MGUzZSB9LAorCXsgMHgwMDkyLCAweDEwNzEgfSwKKwl7IDB4MDA5MywgMHgwMDAwIH0sCisJeyAweDAwOTQsIDB4MDA4MCB9LAorCXsgMHgwMDk3LCAweDAwMDAgfSwKKwl7IDB4MDA5OCwgMHgwMDAwIH0sCisJeyAweDAwOWEsIDB4MDAwMCB9LAorCXsgMHgwMDlmLCAweDAwMDAgfSwKKwl7IDB4MDBhZSwgMHgyMDAwIH0sCisJeyAweDAwYWYsIDB4MDAwMCB9LAorCXsgMHgwMGI2LCAweDAwMDAgfSwKKwl7IDB4MDBiNywgMHgwMDAwIH0sCisJeyAweDAwYjgsIDB4MDAwMCB9LAorCXsgMHgwMGJhLCAweDAwMDAgfSwKKwl7IDB4MDBiYiwgMHgwMDAwIH0sCisJeyAweDAwYmUsIDB4MDAwMCB9LAorCXsgMHgwMGJmLCAweDAwMDAgfSwKKwl7IDB4MDBjMCwgMHgwMDAwIH0sCisJeyAweDAwYzEsIDB4MDAwMCB9LAorCXsgMHgwMGM1LCAweDAwMDAgfSwKKwl7IDB4MDBjYiwgMHhhMDJmIH0sCisJeyAweDAwY2MsIDB4MDAwMCB9LAorCXsgMHgwMGNkLCAweDBlMDIgfSwKKwl7IDB4MDBkOSwgMHgwOGY5IH0sCisJeyAweDAwZGIsIDB4MDAwOCB9LAorCXsgMHgwMGRjLCAweDAwYzAgfSwKKwl7IDB4MDBkZCwgMHg2NzI0IH0sCisJeyAweDAwZGUsIDB4MzEzMSB9LAorCXsgMHgwMGRmLCAweDAwMDggfSwKKwl7IDB4MDBlMCwgMHg0MDAwIH0sCisJeyAweDAwZTEsIDB4MzEzMSB9LAorCXsgMHgwMGUyLCAweDAwNDMgfSwKKwl7IDB4MDBlNCwgMHg0MDBiIH0sCisJeyAweDAwZTUsIDB4ODAzMSB9LAorCXsgMHgwMGU2LCAweDMwODAgfSwKKwl7IDB4MDBlNywgMHg0MTAwIH0sCisJeyAweDAwZTgsIDB4MTQwMCB9LAorCXsgMHgwMGU5LCAweGUwMGEgfSwKKwl7IDB4MDBlYSwgMHgwNDA0IH0sCisJeyAweDAwZWIsIDB4MDQwNCB9LAorCXsgMHgwMGVjLCAweGIzMjAgfSwKKwl7IDB4MDBlZCwgMHgwMDAwIH0sCisJeyAweDAwZjQsIDB4MDAwMCB9LAorCXsgMHgwMGY2LCAweDAwMDAgfSwKKwl7IDB4MDBmOCwgMHgwMDAwIH0sCisJeyAweDAwZmEsIDB4ODAwMCB9LAorCXsgMHgwMGZkLCAweDAwMDEgfSwKKwl7IDB4MDBmZSwgMHgxMGVjIH0sCisJeyAweDAwZmYsIDB4NjQwNiB9LAorCXsgMHgwMTAwLCAweGEwYTAgfSwKKwl7IDB4MDEwOCwgMHg0NDQ0IH0sCisJeyAweDAxMDksIDB4NDQ0NCB9LAorCXsgMHgwMTBhLCAweGFhYWEgfSwKKwl7IDB4MDEwYiwgMHgwMGEwIH0sCisJeyAweDAxMGMsIDB4OGFhYSB9LAorCXsgMHgwMTBkLCAweGFhYWEgfSwKKwl7IDB4MDEwZSwgMHgyYWFhIH0sCisJeyAweDAxMGYsIDB4MDAyYSB9LAorCXsgMHgwMTEwLCAweGEwYTQgfSwKKwl7IDB4MDExMSwgMHg0NjAyIH0sCisJeyAweDAxMTIsIDB4MDEwMSB9LAorCXsgMHgwMTEzLCAweDIwMDAgfSwKKwl7IDB4MDExNCwgMHgwMDAwIH0sCisJeyAweDAxMTYsIDB4MDAwMCB9LAorCXsgMHgwMTE3LCAweDBmMDAgfSwKKwl7IDB4MDExOCwgMHgwMDA2IH0sCisJeyAweDAxMjUsIDB4MjIyNCB9LAorCXsgMHgwMTI2LCAweDU1NTAgfSwKKwl7IDB4MDEyNywgMHgwNDAwIH0sCisJeyAweDAxMjgsIDB4NzcxMSB9LAorCXsgMHgwMTMyLCAweDAwMDQgfSwKKwl7IDB4MDEzNywgMHg1NDQxIH0sCisJeyAweDAxMzksIDB4NzlhMSB9LAorCXsgMHgwMTNhLCAweDMwYzAgfSwKKwl7IDB4MDEzYiwgMHgyMDAwIH0sCisJeyAweDAxM2MsIDB4MjAwNSB9LAorCXsgMHgwMTNkLCAweDMwYzAgfSwKKwl7IDB4MDEzZSwgMHgwMDAwIH0sCisJeyAweDAxNDAsIDB4MzcwMCB9LAorCXsgMHgwMTQxLCAweDFmMDAgfSwKKwl7IDB4MDE0NCwgMHgwMDAwIH0sCisJeyAweDAxNDUsIDB4MDAwMiB9LAorCXsgMHgwMTQ2LCAweDAwMDAgfSwKKwl7IDB4MDE2MCwgMHgwZTgwIH0sCisJeyAweDAxNjEsIDB4MDAyMCB9LAorCXsgMHgwMTYyLCAweDAwODAgfSwKKwl7IDB4MDE2MywgMHgwODAwIH0sCisJeyAweDAxNjQsIDB4MDAwMCB9LAorCXsgMHgwMTY1LCAweDAwMDAgfSwKKwl7IDB4MDE2NiwgMHgwMDAwIH0sCisJeyAweDAxNjcsIDB4MTQxNyB9LAorCXsgMHgwMTY4LCAweDAwMTcgfSwKKwl7IDB4MDE2OSwgMHgwMDE3IH0sCisJeyAweDAxODAsIDB4MjAwMCB9LAorCXsgMHgwMTgxLCAweDAwMDAgfSwKKwl7IDB4MDE4MiwgMHgwMDAwIH0sCisJeyAweDAxODMsIDB4MjAwMCB9LAorCXsgMHgwMTg0LCAweDAwMDAgfSwKKwl7IDB4MDE4NSwgMHgwMDAwIH0sCisJeyAweDAxYjAsIDB4NGIzMCB9LAorCXsgMHgwMWIxLCAweDAwMDAgfSwKKwl7IDB4MDFiMiwgMHhkODcwIH0sCisJeyAweDAxYjMsIDB4MDAwMCB9LAorCXsgMHgwMWI0LCAweDAwMzAgfSwKKwl7IDB4MDFiNSwgMHg1NzU3IH0sCisJeyAweDAxYjYsIDB4NTc1NyB9LAorCXsgMHgwMWI3LCAweDU3NTcgfSwKKwl7IDB4MDFiOCwgMHg1NzU3IH0sCisJeyAweDAxYzAsIDB4NDMzZCB9LAorCXsgMHgwMWMxLCAweDA1NDAgfSwKKwl7IDB4MDFjMiwgMHgwMDAwIH0sCisJeyAweDAxYzMsIDB4MDAwMCB9LAorCXsgMHgwMWM0LCAweDAwMDAgfSwKKwl7IDB4MDFjNSwgMHgwMDA5IH0sCisJeyAweDAxYzYsIDB4MDAxOCB9LAorCXsgMHgwMWM3LCAweDAwMmEgfSwKKwl7IDB4MDFjOCwgMHgwMDRjIH0sCisJeyAweDAxYzksIDB4MDA5NyB9LAorCXsgMHgwMWNhLCAweDAxYzMgfSwKKwl7IDB4MDFjYiwgMHgwM2U5IH0sCisJeyAweDAxY2MsIDB4MTM4OSB9LAorCXsgMHgwMWNkLCAweGMzNTEgfSwKKwl7IDB4MDFjZSwgMHgwMDAwIH0sCisJeyAweDAxY2YsIDB4MDAwMCB9LAorCXsgMHgwMWQwLCAweDAwMDAgfSwKKwl7IDB4MDFkMSwgMHgwMDAwIH0sCisJeyAweDAxZDIsIDB4MDAwMCB9LAorCXsgMHgwMWQzLCAweDAwM2MgfSwKKwl7IDB4MDFkNCwgMHg1NzU3IH0sCisJeyAweDAxZDUsIDB4NTc1NyB9LAorCXsgMHgwMWQ2LCAweDU3NTcgfSwKKwl7IDB4MDFkNywgMHg1NzU3IH0sCisJeyAweDAxZDgsIDB4NTc1NyB9LAorCXsgMHgwMWQ5LCAweDU3NTcgfSwKKwl7IDB4MDFkYSwgMHgwMDAwIH0sCisJeyAweDAxZGIsIDB4MDAwMCB9LAorCXsgMHgwMWRkLCAweDAwMDkgfSwKKwl7IDB4MDFkZSwgMHg3ZjAwIH0sCisJeyAweDAxZGYsIDB4MDBjOCB9LAorCXsgMHgwMWUwLCAweDA2OTEgfSwKKwl7IDB4MDFlMSwgMHgwMDAwIH0sCisJeyAweDAxZTIsIDB4MDAwMCB9LAorCXsgMHgwMWUzLCAweDAwMDAgfSwKKwl7IDB4MDFlNCwgMHgwMDAwIH0sCisJeyAweDAxZTUsIDB4MDA0MCB9LAorCXsgMHgwMWU2LCAweDAwMDAgfSwKKwl7IDB4MDFlNywgMHgwMDAwIH0sCisJeyAweDAxZTgsIDB4MDAwMCB9LAorCXsgMHgwMWVhLCAweDAwMDAgfSwKKwl7IDB4MDFlYiwgMHgwMDAwIH0sCisJeyAweDAxZWMsIDB4MDAwMCB9LAorCXsgMHgwMWVkLCAweDAwMDAgfSwKKwl7IDB4MDFlZSwgMHgwMDAwIH0sCisJeyAweDAxZWYsIDB4MDAwMCB9LAorCXsgMHgwMWYwLCAweDAwMDAgfSwKKwl7IDB4MDFmMSwgMHgwMDAwIH0sCisJeyAweDAxZjIsIDB4MDAwMCB9LAorCXsgMHgwMjAwLCAweDAwMDAgfSwKKwl7IDB4MDIwMSwgMHgyMjQ0IH0sCisJeyAweDAyMDIsIDB4YWFhYSB9LAorCXsgMHgwMjUwLCAweDgwMTAgfSwKKwl7IDB4MDI1MSwgMHgwMDAwIH0sCisJeyAweDAyNTIsIDB4MDI4YSB9LAorCXsgMHgwMmZhLCAweDAwMDAgfSwKKwl7IDB4MDJmYiwgMHgwMDAwIH0sCisJeyAweDAyZmMsIDB4MDAwMCB9LAorCXsgMHgwMzAwLCAweDAwMDAgfSwKKwl7IDB4MDNkMCwgMHgwMDAwIH0sCisJeyAweDAzZDEsIDB4MDAwMCB9LAorCXsgMHgwM2QyLCAweDAwMDAgfSwKKwl7IDB4MDNkMywgMHgwMDAwIH0sCisJeyAweDAzZDQsIDB4MjAwMCB9LAorCXsgMHgwM2Q1LCAweDIwMDAgfSwKKwl7IDB4MDNkNiwgMHgwMDAwIH0sCisJeyAweDAzZDcsIDB4MDAwMCB9LAorCXsgMHgwM2Q4LCAweDIwMDAgfSwKKwl7IDB4MDNkOSwgMHgyMDAwIH0sCisJeyAweDAzZGEsIDB4MjAwMCB9LAorCXsgMHgwM2RiLCAweDIwMDAgfSwKKwl7IDB4MDNkYywgMHgwMDAwIH0sCisJeyAweDAzZGQsIDB4MDAwMCB9LAorCXsgMHgwM2RlLCAweDAwMDAgfSwKKwl7IDB4MDNkZiwgMHgyMDAwIH0sCisJeyAweDAzZTAsIDB4MDAwMCB9LAorCXsgMHgwM2UxLCAweDAwMDAgfSwKKwl7IDB4MDNlMiwgMHgwMDAwIH0sCisJeyAweDAzZTMsIDB4MDAwMCB9LAorCXsgMHgwM2U0LCAweDAwMDAgfSwKKwl7IDB4MDNlNSwgMHgwMDAwIH0sCisJeyAweDAzZTYsIDB4MDAwMCB9LAorCXsgMHgwM2U3LCAweDAwMDAgfSwKKwl7IDB4MDNlOCwgMHgwMDAwIH0sCisJeyAweDAzZTksIDB4MDAwMCB9LAorCXsgMHgwM2VhLCAweDAwMDAgfSwKKwl7IDB4MDNlYiwgMHgwMDAwIH0sCisJeyAweDAzZWMsIDB4MDAwMCB9LAorCXsgMHgwM2VkLCAweDAwMDAgfSwKKwl7IDB4MDNlZSwgMHgwMDAwIH0sCisJeyAweDAzZWYsIDB4MDAwMCB9LAorCXsgMHgwM2YwLCAweDA4MDAgfSwKKwl7IDB4MDNmMSwgMHgwODAwIH0sCisJeyAweDAzZjIsIDB4MDgwMCB9LAorCXsgMHgwM2YzLCAweDA4MDAgfSwKK307CisKK3N0YXRpYyBib29sIHJ0NTY2M192b2xhdGlsZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFJUNTY2M19SRVNFVDoKKwljYXNlIFJUNTY2M19TSUxfREVUX0NUTDoKKwljYXNlIFJUNTY2M19IUF9JTVBfR0FJTl8yOgorCWNhc2UgUlQ1NjYzX0FEX0RBX01JWEVSOgorCWNhc2UgUlQ1NjYzX0ZSQUNfRElWXzI6CisJY2FzZSBSVDU2NjNfTUlDQklBU18xOgorCWNhc2UgUlQ1NjYzX0FTUkNfMTFfMjoKKwljYXNlIFJUNTY2M19BRENfRVFfMToKKwljYXNlIFJUNTY2M19JTlRfU1RfMToKKwljYXNlIFJUNTY2M19JTlRfU1RfMjoKKwljYXNlIFJUNTY2M19HUElPX1NUQToKKwljYXNlIFJUNTY2M19TSU5fR0VOXzE6CisJY2FzZSBSVDU2NjNfSUxfQ01EXzE6CisJY2FzZSBSVDU2NjNfSUxfQ01EXzU6CisJY2FzZSBSVDU2NjNfSUxfQ01EX1BXUlNBVjE6CisJY2FzZSBSVDU2NjNfRU1fSkFDS19UWVBFXzE6CisJY2FzZSBSVDU2NjNfRU1fSkFDS19UWVBFXzI6CisJY2FzZSBSVDU2NjNfRU1fSkFDS19UWVBFXzM6CisJY2FzZSBSVDU2NjNfSkRfQ1RSTDI6CisJY2FzZSBSVDU2NjNfVkVORE9SX0lEOgorCWNhc2UgUlQ1NjYzX1ZFTkRPUl9JRF8xOgorCWNhc2UgUlQ1NjYzX1ZFTkRPUl9JRF8yOgorCWNhc2UgUlQ1NjYzX1BMTF9JTlRfUkVHOgorCWNhc2UgUlQ1NjYzX1NPRlRfUkFNUDoKKwljYXNlIFJUNTY2M19TVE9fRFJFXzE6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV81OgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfNjoKKwljYXNlIFJUNTY2M19TVE9fRFJFXzc6CisJY2FzZSBSVDU2NjNfTUlDX0RFQ1JPXzE6CisJY2FzZSBSVDU2NjNfTUlDX0RFQ1JPXzQ6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8xOgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMzoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzQ6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl81OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCXzFfMToKKwljYXNlIFJUNTY2M19IUF9DQUxJQl85OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUMToKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDI6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1QzOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUNDoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDU6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q2OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUNzoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDg6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q5OgorCWNhc2UgUlQ1NjYzX0FOQV9KRDoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIGJvb2wgcnQ1NjYzX3JlYWRhYmxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUlQ1NjYzX1JFU0VUOgorCWNhc2UgUlQ1NjYzX0hQX09VVF9FTjoKKwljYXNlIFJUNTY2M19IUF9MQ0hfRFJFOgorCWNhc2UgUlQ1NjYzX0hQX1JDSF9EUkU6CisJY2FzZSBSVDU2NjNfQ0FMSUJfQlNUOgorCWNhc2UgUlQ1NjYzX1JFQ01JWDoKKwljYXNlIFJUNTY2M19TSUxfREVUX0NUTDoKKwljYXNlIFJUNTY2M19QV1JfU0FWX1NJTERFVDoKKwljYXNlIFJUNTY2M19TSURFVE9ORV9DVEw6CisJY2FzZSBSVDU2NjNfU1RPMV9EQUNfRElHX1ZPTDoKKwljYXNlIFJUNTY2M19TVE8xX0FEQ19ESUdfVk9MOgorCWNhc2UgUlQ1NjYzX1NUTzFfQk9PU1Q6CisJY2FzZSBSVDU2NjNfSFBfSU1QX0dBSU5fMToKKwljYXNlIFJUNTY2M19IUF9JTVBfR0FJTl8yOgorCWNhc2UgUlQ1NjYzX1NUTzFfQURDX01JWEVSOgorCWNhc2UgUlQ1NjYzX0FEX0RBX01JWEVSOgorCWNhc2UgUlQ1NjYzX1NUT19EQUNfTUlYRVI6CisJY2FzZSBSVDU2NjNfRElHX1NJREVfTUlYRVI6CisJY2FzZSBSVDU2NjNfQllQQVNTX1NUT19EQUM6CisJY2FzZSBSVDU2NjNfQ0FMSUJfUkVDX01JWDoKKwljYXNlIFJUNTY2M19QV1JfRElHXzE6CisJY2FzZSBSVDU2NjNfUFdSX0RJR18yOgorCWNhc2UgUlQ1NjYzX1BXUl9BTkxHXzE6CisJY2FzZSBSVDU2NjNfUFdSX0FOTEdfMjoKKwljYXNlIFJUNTY2M19QV1JfQU5MR18zOgorCWNhc2UgUlQ1NjYzX1BXUl9NSVhFUjoKKwljYXNlIFJUNTY2M19TSUdfQ0xLX0RFVDoKKwljYXNlIFJUNTY2M19QUkVfRElWX0dBVElOR18xOgorCWNhc2UgUlQ1NjYzX1BSRV9ESVZfR0FUSU5HXzI6CisJY2FzZSBSVDU2NjNfSTJTMV9TRFA6CisJY2FzZSBSVDU2NjNfQUREQV9DTEtfMToKKwljYXNlIFJUNTY2M19BRERBX1JTVDoKKwljYXNlIFJUNTY2M19GUkFDX0RJVl8xOgorCWNhc2UgUlQ1NjYzX0ZSQUNfRElWXzI6CisJY2FzZSBSVDU2NjNfVERNXzE6CisJY2FzZSBSVDU2NjNfVERNXzI6CisJY2FzZSBSVDU2NjNfVERNXzM6CisJY2FzZSBSVDU2NjNfVERNXzQ6CisJY2FzZSBSVDU2NjNfVERNXzU6CisJY2FzZSBSVDU2NjNfR0xCX0NMSzoKKwljYXNlIFJUNTY2M19QTExfMToKKwljYXNlIFJUNTY2M19QTExfMjoKKwljYXNlIFJUNTY2M19BU1JDXzE6CisJY2FzZSBSVDU2NjNfQVNSQ18yOgorCWNhc2UgUlQ1NjYzX0FTUkNfNDoKKwljYXNlIFJUNTY2M19EVU1NWV9SRUc6CisJY2FzZSBSVDU2NjNfQVNSQ184OgorCWNhc2UgUlQ1NjYzX0FTUkNfOToKKwljYXNlIFJUNTY2M19BU1JDXzExOgorCWNhc2UgUlQ1NjYzX0RFUE9QXzE6CisJY2FzZSBSVDU2NjNfREVQT1BfMjoKKwljYXNlIFJUNTY2M19ERVBPUF8zOgorCWNhc2UgUlQ1NjYzX0hQX0NIQVJHRV9QVU1QXzE6CisJY2FzZSBSVDU2NjNfSFBfQ0hBUkdFX1BVTVBfMjoKKwljYXNlIFJUNTY2M19NSUNCSUFTXzE6CisJY2FzZSBSVDU2NjNfUkNfQ0xLOgorCWNhc2UgUlQ1NjYzX0FTUkNfMTFfMjoKKwljYXNlIFJUNTY2M19EVU1NWV9SRUdfMjoKKwljYXNlIFJUNTY2M19SRUNfUEFUSF9HQUlOOgorCWNhc2UgUlQ1NjYzX0FVVE9fMU1SQ19DTEs6CisJY2FzZSBSVDU2NjNfQURDX0VRXzE6CisJY2FzZSBSVDU2NjNfQURDX0VRXzI6CisJY2FzZSBSVDU2NjNfSVJRXzE6CisJY2FzZSBSVDU2NjNfSVJRXzI6CisJY2FzZSBSVDU2NjNfSVJRXzM6CisJY2FzZSBSVDU2NjNfSVJRXzQ6CisJY2FzZSBSVDU2NjNfSVJRXzU6CisJY2FzZSBSVDU2NjNfSU5UX1NUXzE6CisJY2FzZSBSVDU2NjNfSU5UX1NUXzI6CisJY2FzZSBSVDU2NjNfR1BJT18xOgorCWNhc2UgUlQ1NjYzX0dQSU9fMjoKKwljYXNlIFJUNTY2M19HUElPX1NUQToKKwljYXNlIFJUNTY2M19TSU5fR0VOXzE6CisJY2FzZSBSVDU2NjNfU0lOX0dFTl8yOgorCWNhc2UgUlQ1NjYzX1NJTl9HRU5fMzoKKwljYXNlIFJUNTY2M19TT0ZfVk9MX1pDMToKKwljYXNlIFJUNTY2M19JTF9DTURfMToKKwljYXNlIFJUNTY2M19JTF9DTURfMjoKKwljYXNlIFJUNTY2M19JTF9DTURfMzoKKwljYXNlIFJUNTY2M19JTF9DTURfNDoKKwljYXNlIFJUNTY2M19JTF9DTURfNToKKwljYXNlIFJUNTY2M19JTF9DTURfNjoKKwljYXNlIFJUNTY2M19JTF9DTURfNzoKKwljYXNlIFJUNTY2M19JTF9DTURfODoKKwljYXNlIFJUNTY2M19JTF9DTURfUFdSU0FWMToKKwljYXNlIFJUNTY2M19JTF9DTURfUFdSU0FWMjoKKwljYXNlIFJUNTY2M19FTV9KQUNLX1RZUEVfMToKKwljYXNlIFJUNTY2M19FTV9KQUNLX1RZUEVfMjoKKwljYXNlIFJUNTY2M19FTV9KQUNLX1RZUEVfMzoKKwljYXNlIFJUNTY2M19FTV9KQUNLX1RZUEVfNDoKKwljYXNlIFJUNTY2M19FTV9KQUNLX1RZUEVfNToKKwljYXNlIFJUNTY2M19FTV9KQUNLX1RZUEVfNjoKKwljYXNlIFJUNTY2M19TVE8xX0hQRl9BREoxOgorCWNhc2UgUlQ1NjYzX1NUTzFfSFBGX0FESjI6CisJY2FzZSBSVDU2NjNfRkFTVF9PRkZfTUlDQklBUzoKKwljYXNlIFJUNTY2M19KRF9DVFJMMToKKwljYXNlIFJUNTY2M19KRF9DVFJMMjoKKwljYXNlIFJUNTY2M19ESUdfTUlTQzoKKwljYXNlIFJUNTY2M19WRU5ET1JfSUQ6CisJY2FzZSBSVDU2NjNfVkVORE9SX0lEXzE6CisJY2FzZSBSVDU2NjNfVkVORE9SX0lEXzI6CisJY2FzZSBSVDU2NjNfRElHX1ZPTF9aQ0Q6CisJY2FzZSBSVDU2NjNfQU5BX0JJQVNfQ1VSXzE6CisJY2FzZSBSVDU2NjNfQU5BX0JJQVNfQ1VSXzI6CisJY2FzZSBSVDU2NjNfQU5BX0JJQVNfQ1VSXzM6CisJY2FzZSBSVDU2NjNfQU5BX0JJQVNfQ1VSXzQ6CisJY2FzZSBSVDU2NjNfQU5BX0JJQVNfQ1VSXzU6CisJY2FzZSBSVDU2NjNfQU5BX0JJQVNfQ1VSXzY6CisJY2FzZSBSVDU2NjNfQklBU19DVVJfNToKKwljYXNlIFJUNTY2M19CSUFTX0NVUl82OgorCWNhc2UgUlQ1NjYzX0JJQVNfQ1VSXzc6CisJY2FzZSBSVDU2NjNfQklBU19DVVJfODoKKwljYXNlIFJUNTY2M19EQUNSRUZfTERPOgorCWNhc2UgUlQ1NjYzX0RVTU1ZX1JFR18zOgorCWNhc2UgUlQ1NjYzX0JJQVNfQ1VSXzk6CisJY2FzZSBSVDU2NjNfRFVNTVlfUkVHXzQ6CisJY2FzZSBSVDU2NjNfVlJFRkFESl9PUDoKKwljYXNlIFJUNTY2M19WUkVGX1JFQ01JWDoKKwljYXNlIFJUNTY2M19DSEFSR0VfUFVNUF8xOgorCWNhc2UgUlQ1NjYzX0NIQVJHRV9QVU1QXzFfMjoKKwljYXNlIFJUNTY2M19DSEFSR0VfUFVNUF8xXzM6CisJY2FzZSBSVDU2NjNfQ0hBUkdFX1BVTVBfMjoKKwljYXNlIFJUNTY2M19ESUdfSU5fUElOMToKKwljYXNlIFJUNTY2M19QQURfRFJWX0NUTDoKKwljYXNlIFJUNTY2M19QTExfSU5UX1JFRzoKKwljYXNlIFJUNTY2M19DSE9QX0RBQ19MOgorCWNhc2UgUlQ1NjYzX0NIT1BfQURDOgorCWNhc2UgUlQ1NjYzX0NBTElCX0FEQzoKKwljYXNlIFJUNTY2M19DSE9QX0RBQ19SOgorCWNhc2UgUlQ1NjYzX0RVTU1ZX0NUTF9EQUNMUjoKKwljYXNlIFJUNTY2M19EVU1NWV9SRUdfNToKKwljYXNlIFJUNTY2M19TT0ZUX1JBTVA6CisJY2FzZSBSVDU2NjNfVEVTVF9NT0RFXzE6CisJY2FzZSBSVDU2NjNfVEVTVF9NT0RFXzI6CisJY2FzZSBSVDU2NjNfVEVTVF9NT0RFXzM6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV8xOgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfMjoKKwljYXNlIFJUNTY2M19TVE9fRFJFXzM6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV80OgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfNToKKwljYXNlIFJUNTY2M19TVE9fRFJFXzY6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV83OgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfODoKKwljYXNlIFJUNTY2M19TVE9fRFJFXzk6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV8xMDoKKwljYXNlIFJUNTY2M19NSUNfREVDUk9fMToKKwljYXNlIFJUNTY2M19NSUNfREVDUk9fMjoKKwljYXNlIFJUNTY2M19NSUNfREVDUk9fMzoKKwljYXNlIFJUNTY2M19NSUNfREVDUk9fNDoKKwljYXNlIFJUNTY2M19NSUNfREVDUk9fNToKKwljYXNlIFJUNTY2M19NSUNfREVDUk9fNjoKKwljYXNlIFJUNTY2M19IUF9ERUNST18xOgorCWNhc2UgUlQ1NjYzX0hQX0RFQ1JPXzI6CisJY2FzZSBSVDU2NjNfSFBfREVDUk9fMzoKKwljYXNlIFJUNTY2M19IUF9ERUNST180OgorCWNhc2UgUlQ1NjYzX0hQX0RFQ09VUDoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOX01BUDg6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl9NQVA5OgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fTUFQMTA6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl9NQVAxMToKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzE6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8yOgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMzoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzQ6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl81OgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fNjoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzc6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl84OgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fOToKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzEwOgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMTE6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8xMjoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzEzOgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMTQ6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8xNToKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzE2OgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMTc6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8xODoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzE5OgorCWNhc2UgUlQ1NjYzX0hQX0lNUFNFTl9ESUc1OgorCWNhc2UgUlQ1NjYzX0hQX0lNUFNFTl9NQVAxOgorCWNhc2UgUlQ1NjYzX0hQX0lNUFNFTl9NQVAyOgorCWNhc2UgUlQ1NjYzX0hQX0lNUFNFTl9NQVAzOgorCWNhc2UgUlQ1NjYzX0hQX0lNUFNFTl9NQVA0OgorCWNhc2UgUlQ1NjYzX0hQX0lNUFNFTl9NQVA1OgorCWNhc2UgUlQ1NjYzX0hQX0lNUFNFTl9NQVA3OgorCWNhc2UgUlQ1NjYzX0hQX0xPR0lDXzE6CisJY2FzZSBSVDU2NjNfSFBfTE9HSUNfMjoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl8xOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCXzFfMToKKwljYXNlIFJUNTY2M19IUF9DQUxJQl8yOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCXzM6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfNDoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl81OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCXzVfMToKKwljYXNlIFJUNTY2M19IUF9DQUxJQl82OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCXzc6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfOToKKwljYXNlIFJUNTY2M19IUF9DQUxJQl8xMDoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl8xMToKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDE6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1QyOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUMzoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDQ6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q1OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUNjoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDc6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q4OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUOToKKwljYXNlIFJUNTY2M19IUF9BTVBfREVUOgorCWNhc2UgUlQ1NjYzX0RVTU1ZX1JFR182OgorCWNhc2UgUlQ1NjYzX0hQX0JJQVM6CisJY2FzZSBSVDU2NjNfQ0JKXzE6CisJY2FzZSBSVDU2NjNfQ0JKXzI6CisJY2FzZSBSVDU2NjNfQ0JKXzM6CisJY2FzZSBSVDU2NjNfRFVNTVlfMToKKwljYXNlIFJUNTY2M19EVU1NWV8yOgorCWNhc2UgUlQ1NjYzX0RVTU1ZXzM6CisJY2FzZSBSVDU2NjNfQU5BX0pEOgorCWNhc2UgUlQ1NjYzX0FEQ19MQ0hfTFBGMV9BMToKKwljYXNlIFJUNTY2M19BRENfUkNIX0xQRjFfQTE6CisJY2FzZSBSVDU2NjNfQURDX0xDSF9MUEYxX0gwOgorCWNhc2UgUlQ1NjYzX0FEQ19SQ0hfTFBGMV9IMDoKKwljYXNlIFJUNTY2M19BRENfTENIX0JQRjFfQTE6CisJY2FzZSBSVDU2NjNfQURDX1JDSF9CUEYxX0ExOgorCWNhc2UgUlQ1NjYzX0FEQ19MQ0hfQlBGMV9BMjoKKwljYXNlIFJUNTY2M19BRENfUkNIX0JQRjFfQTI6CisJY2FzZSBSVDU2NjNfQURDX0xDSF9CUEYxX0gwOgorCWNhc2UgUlQ1NjYzX0FEQ19SQ0hfQlBGMV9IMDoKKwljYXNlIFJUNTY2M19BRENfTENIX0JQRjJfQTE6CisJY2FzZSBSVDU2NjNfQURDX1JDSF9CUEYyX0ExOgorCWNhc2UgUlQ1NjYzX0FEQ19MQ0hfQlBGMl9BMjoKKwljYXNlIFJUNTY2M19BRENfUkNIX0JQRjJfQTI6CisJY2FzZSBSVDU2NjNfQURDX0xDSF9CUEYyX0gwOgorCWNhc2UgUlQ1NjYzX0FEQ19SQ0hfQlBGMl9IMDoKKwljYXNlIFJUNTY2M19BRENfTENIX0JQRjNfQTE6CisJY2FzZSBSVDU2NjNfQURDX1JDSF9CUEYzX0ExOgorCWNhc2UgUlQ1NjYzX0FEQ19MQ0hfQlBGM19BMjoKKwljYXNlIFJUNTY2M19BRENfUkNIX0JQRjNfQTI6CisJY2FzZSBSVDU2NjNfQURDX0xDSF9CUEYzX0gwOgorCWNhc2UgUlQ1NjYzX0FEQ19SQ0hfQlBGM19IMDoKKwljYXNlIFJUNTY2M19BRENfTENIX0JQRjRfQTE6CisJY2FzZSBSVDU2NjNfQURDX1JDSF9CUEY0X0ExOgorCWNhc2UgUlQ1NjYzX0FEQ19MQ0hfQlBGNF9BMjoKKwljYXNlIFJUNTY2M19BRENfUkNIX0JQRjRfQTI6CisJY2FzZSBSVDU2NjNfQURDX0xDSF9CUEY0X0gwOgorCWNhc2UgUlQ1NjYzX0FEQ19SQ0hfQlBGNF9IMDoKKwljYXNlIFJUNTY2M19BRENfTENIX0hQRjFfQTE6CisJY2FzZSBSVDU2NjNfQURDX1JDSF9IUEYxX0ExOgorCWNhc2UgUlQ1NjYzX0FEQ19MQ0hfSFBGMV9IMDoKKwljYXNlIFJUNTY2M19BRENfUkNIX0hQRjFfSDA6CisJY2FzZSBSVDU2NjNfQURDX0VRX1BSRV9WT0xfTDoKKwljYXNlIFJUNTY2M19BRENfRVFfUFJFX1ZPTF9SOgorCWNhc2UgUlQ1NjYzX0FEQ19FUV9QT1NUX1ZPTF9MOgorCWNhc2UgUlQ1NjYzX0FEQ19FUV9QT1NUX1ZPTF9SOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgYm9vbCBydDU2Njhfdm9sYXRpbGVfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBSVDU2NjNfUkVTRVQ6CisJY2FzZSBSVDU2NjhfQ0JKX1RZUEVfMjoKKwljYXNlIFJUNTY2OF9QRE1fT1VUX0NUTDoKKwljYXNlIFJUNTY2OF9QRE1fSTJDX0RBVEFfQ1RMMToKKwljYXNlIFJUNTY2OF9QRE1fSTJDX0RBVEFfQ1RMNDoKKwljYXNlIFJUNTY2OF9BTENfQktfR0FJTjoKKwljYXNlIFJUNTY2M19QTExfMjoKKwljYXNlIFJUNTY2M19NSUNCSUFTXzE6CisJY2FzZSBSVDU2NjNfQURDX0VRXzE6CisJY2FzZSBSVDU2NjNfSU5UX1NUXzE6CisJY2FzZSBSVDU2NjhfR1BJT19TVEE6CisJY2FzZSBSVDU2NjNfSUxfQ01EXzE6CisJY2FzZSBSVDU2NjNfSUxfQ01EXzU6CisJY2FzZSBSVDU2NjhfQV9KRF9DVFJMOgorCWNhc2UgUlQ1NjYzX0pEX0NUUkwyOgorCWNhc2UgUlQ1NjYzX1ZFTkRPUl9JRDoKKwljYXNlIFJUNTY2M19WRU5ET1JfSURfMToKKwljYXNlIFJUNTY2M19WRU5ET1JfSURfMjoKKwljYXNlIFJUNTY2M19TVE9fRFJFXzE6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV81OgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfNjoKKwljYXNlIFJUNTY2M19TVE9fRFJFXzc6CisJY2FzZSBSVDU2NjhfTU9OT19EWU5BXzY6CisJY2FzZSBSVDU2NjhfU1RPMV9TSUxfREVUOgorCWNhc2UgUlQ1NjY4X01PTk9MX1NJTF9ERVQ6CisJY2FzZSBSVDU2NjhfTU9OT1JfU0lMX0RFVDoKKwljYXNlIFJUNTY2OF9TVE8yX0RBQ19TSUw6CisJY2FzZSBSVDU2NjhfTU9OT19BTVBfQ0FMX1NUMToKKwljYXNlIFJUNTY2OF9NT05PX0FNUF9DQUxfU1QyOgorCWNhc2UgUlQ1NjY4X01PTk9fQU1QX0NBTF9TVDM6CisJY2FzZSBSVDU2NjhfTU9OT19BTVBfQ0FMX1NUNDoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzI6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8zOgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fNDoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzEwOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCXzE6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfMTA6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1QxOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUNDoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDU6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q2OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUNzoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDg6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q5OgorCWNhc2UgUlQ1NjY4X0hQX0NBTElCX1NUMTA6CisJY2FzZSBSVDU2NjhfSFBfQ0FMSUJfU1QxMToKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIGJvb2wgcnQ1NjY4X3JlYWRhYmxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUlQ1NjY4X0xPVVRfQ1RSTDoKKwljYXNlIFJUNTY2OF9IUF9BTVBfMjoKKwljYXNlIFJUNTY2OF9NT05PX09VVDoKKwljYXNlIFJUNTY2OF9NT05PX0dBSU46CisJY2FzZSBSVDU2NjhfQUVDX0JTVDoKKwljYXNlIFJUNTY2OF9JTjFfSU4yOgorCWNhc2UgUlQ1NjY4X0lOM19JTjQ6CisJY2FzZSBSVDU2NjhfSU5MMV9JTlIxOgorCWNhc2UgUlQ1NjY4X0NCSl9UWVBFXzI6CisJY2FzZSBSVDU2NjhfQ0JKX1RZUEVfMzoKKwljYXNlIFJUNTY2OF9DQkpfVFlQRV80OgorCWNhc2UgUlQ1NjY4X0NCSl9UWVBFXzU6CisJY2FzZSBSVDU2NjhfQ0JKX1RZUEVfODoKKwljYXNlIFJUNTY2OF9EQUMzX0RJR19WT0w6CisJY2FzZSBSVDU2NjhfREFDM19DVFJMOgorCWNhc2UgUlQ1NjY4X01PTk9fQURDX0RJR19WT0w6CisJY2FzZSBSVDU2NjhfU1RPMl9BRENfRElHX1ZPTDoKKwljYXNlIFJUNTY2OF9NT05PX0FEQ19CU1RfR0FJTjoKKwljYXNlIFJUNTY2OF9TVE8yX0FEQ19CU1RfR0FJTjoKKwljYXNlIFJUNTY2OF9TSURFVE9ORV9DVFJMOgorCWNhc2UgUlQ1NjY4X01PTk8xX0FEQ19NSVhFUjoKKwljYXNlIFJUNTY2OF9TVE8yX0FEQ19NSVhFUjoKKwljYXNlIFJUNTY2OF9NT05PX0RBQ19NSVhFUjoKKwljYXNlIFJUNTY2OF9EQUMyX1NSQ19DVFJMOgorCWNhc2UgUlQ1NjY4X0lGXzNfNF9EQVRBX0NUTDoKKwljYXNlIFJUNTY2OF9JRl81X0RBVEFfQ1RMOgorCWNhc2UgUlQ1NjY4X1BETV9PVVRfQ1RMOgorCWNhc2UgUlQ1NjY4X1BETV9JMkNfREFUQV9DVEwxOgorCWNhc2UgUlQ1NjY4X1BETV9JMkNfREFUQV9DVEwyOgorCWNhc2UgUlQ1NjY4X1BETV9JMkNfREFUQV9DVEwzOgorCWNhc2UgUlQ1NjY4X1BETV9JMkNfREFUQV9DVEw0OgorCWNhc2UgUlQ1NjY4X1JFQ01JWDFfTkVXOgorCWNhc2UgUlQ1NjY4X1JFQ01JWDFMXzA6CisJY2FzZSBSVDU2NjhfUkVDTUlYMUw6CisJY2FzZSBSVDU2NjhfUkVDTUlYMVJfMDoKKwljYXNlIFJUNTY2OF9SRUNNSVgxUjoKKwljYXNlIFJUNTY2OF9SRUNNSVgyX05FVzoKKwljYXNlIFJUNTY2OF9SRUNNSVgyX0xfMjoKKwljYXNlIFJUNTY2OF9SRUNNSVgyX1I6CisJY2FzZSBSVDU2NjhfUkVDTUlYMl9SXzI6CisJY2FzZSBSVDU2NjhfQ0FMSUJfUkVDX0xSOgorCWNhc2UgUlQ1NjY4X0FMQ19CS19HQUlOOgorCWNhc2UgUlQ1NjY4X01PTk9NSVhfR0FJTjoKKwljYXNlIFJUNTY2OF9NT05PTUlYX0lOX0dBSU46CisJY2FzZSBSVDU2NjhfT1VUX01JWExfR0FJTjoKKwljYXNlIFJUNTY2OF9PVVRfTE1JWF9JTl9HQUlOOgorCWNhc2UgUlQ1NjY4X09VVF9STUlYX0lOX0dBSU46CisJY2FzZSBSVDU2NjhfT1VUX1JNSVhfSU5fR0FJTjE6CisJY2FzZSBSVDU2NjhfTE9VVF9NSVhFUl9DVFJMOgorCWNhc2UgUlQ1NjY4X1BXUl9WT0w6CisJY2FzZSBSVDU2NjhfQURDREFDX1JTVDoKKwljYXNlIFJUNTY2OF9JMlMzNF9TRFA6CisJY2FzZSBSVDU2NjhfSTJTNV9TRFA6CisJY2FzZSBSVDU2NjhfVERNXzU6CisJY2FzZSBSVDU2NjhfVERNXzY6CisJY2FzZSBSVDU2NjhfVERNXzc6CisJY2FzZSBSVDU2NjhfVERNXzg6CisJY2FzZSBSVDU2NjhfQVNSQ18zOgorCWNhc2UgUlQ1NjY4X0FTUkNfNjoKKwljYXNlIFJUNTY2OF9BU1JDXzc6CisJY2FzZSBSVDU2NjhfUExMX1RSS18xMzoKKwljYXNlIFJUNTY2OF9JMlNfTV9DTEtfQ1RMOgorCWNhc2UgUlQ1NjY4X0ZESVZfSTJTMzRfTV9DTEs6CisJY2FzZSBSVDU2NjhfRkRJVl9JMlMzNF9NX0NMSzI6CisJY2FzZSBSVDU2NjhfRkRJVl9JMlM1X01fQ0xLOgorCWNhc2UgUlQ1NjY4X0ZESVZfSTJTNV9NX0NMSzI6CisJY2FzZSBSVDU2NjhfSVJRXzQ6CisJY2FzZSBSVDU2NjhfR1BJT18zOgorCWNhc2UgUlQ1NjY4X0dQSU9fNDoKKwljYXNlIFJUNTY2OF9HUElPX1NUQToKKwljYXNlIFJUNTY2OF9IUF9BTVBfREVUMToKKwljYXNlIFJUNTY2OF9IUF9BTVBfREVUMjoKKwljYXNlIFJUNTY2OF9IUF9BTVBfREVUMzoKKwljYXNlIFJUNTY2OF9NSURfQkRfSFBfQU1QOgorCWNhc2UgUlQ1NjY4X0xPV19CRF9IUF9BTVA6CisJY2FzZSBSVDU2NjhfU09GX1ZPTF9aQzI6CisJY2FzZSBSVDU2NjhfQURDX1NUTzJfQURKMToKKwljYXNlIFJUNTY2OF9BRENfU1RPMl9BREoyOgorCWNhc2UgUlQ1NjY4X0FfSkRfQ1RSTDoKKwljYXNlIFJUNTY2OF9KRDFfVFJFU19DVFJMOgorCWNhc2UgUlQ1NjY4X0pEMl9UUkVTX0NUUkw6CisJY2FzZSBSVDU2NjhfSkRfQ1RSTDI6CisJY2FzZSBSVDU2NjhfRFVNX1JFR18yOgorCWNhc2UgUlQ1NjY4X0RVTV9SRUdfMzoKKwljYXNlIFJUNTY2M19WRU5ET1JfSUQ6CisJY2FzZSBSVDU2NjNfVkVORE9SX0lEXzE6CisJY2FzZSBSVDU2NjNfVkVORE9SX0lEXzI6CisJY2FzZSBSVDU2NjhfREFDQURDX0RJR19WT0wyOgorCWNhc2UgUlQ1NjY4X0RJR19JTl9QSU4yOgorCWNhc2UgUlQ1NjY4X1BBRF9EUlZfQ1RMMToKKwljYXNlIFJUNTY2OF9TT0ZfUkFNX0RFUE9QOgorCWNhc2UgUlQ1NjY4X1ZPTF9URVNUOgorCWNhc2UgUlQ1NjY4X1RFU1RfTU9ERV8zOgorCWNhc2UgUlQ1NjY4X1RFU1RfTU9ERV80OgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfOToKKwljYXNlIFJUNTY2OF9NT05PX0RZTkFfMToKKwljYXNlIFJUNTY2OF9NT05PX0RZTkFfMjoKKwljYXNlIFJUNTY2OF9NT05PX0RZTkFfMzoKKwljYXNlIFJUNTY2OF9NT05PX0RZTkFfNDoKKwljYXNlIFJUNTY2OF9NT05PX0RZTkFfNToKKwljYXNlIFJUNTY2OF9NT05PX0RZTkFfNjoKKwljYXNlIFJUNTY2OF9TVE8xX1NJTF9ERVQ6CisJY2FzZSBSVDU2NjhfTU9OT0xfU0lMX0RFVDoKKwljYXNlIFJUNTY2OF9NT05PUl9TSUxfREVUOgorCWNhc2UgUlQ1NjY4X1NUTzJfREFDX1NJTDoKKwljYXNlIFJUNTY2OF9QV1JfU0FWX0NUTDE6CisJY2FzZSBSVDU2NjhfUFdSX1NBVl9DVEwyOgorCWNhc2UgUlQ1NjY4X1BXUl9TQVZfQ1RMMzoKKwljYXNlIFJUNTY2OF9QV1JfU0FWX0NUTDQ6CisJY2FzZSBSVDU2NjhfUFdSX1NBVl9DVEw1OgorCWNhc2UgUlQ1NjY4X1BXUl9TQVZfQ1RMNjoKKwljYXNlIFJUNTY2OF9NT05PX0FNUF9DQUwxOgorCWNhc2UgUlQ1NjY4X01PTk9fQU1QX0NBTDI6CisJY2FzZSBSVDU2NjhfTU9OT19BTVBfQ0FMMzoKKwljYXNlIFJUNTY2OF9NT05PX0FNUF9DQUw0OgorCWNhc2UgUlQ1NjY4X01PTk9fQU1QX0NBTDU6CisJY2FzZSBSVDU2NjhfTU9OT19BTVBfQ0FMNjoKKwljYXNlIFJUNTY2OF9NT05PX0FNUF9DQUw3OgorCWNhc2UgUlQ1NjY4X01PTk9fQU1QX0NBTF9TVDE6CisJY2FzZSBSVDU2NjhfTU9OT19BTVBfQ0FMX1NUMjoKKwljYXNlIFJUNTY2OF9NT05PX0FNUF9DQUxfU1QzOgorCWNhc2UgUlQ1NjY4X01PTk9fQU1QX0NBTF9TVDQ6CisJY2FzZSBSVDU2NjhfTU9OT19BTVBfQ0FMX1NUNToKKwljYXNlIFJUNTY2OF9IUF9JTVBfU0VOXzEzOgorCWNhc2UgUlQ1NjY4X0hQX0lNUF9TRU5fMTQ6CisJY2FzZSBSVDU2NjhfSFBfSU1QX1NFTl82OgorCWNhc2UgUlQ1NjY4X0hQX0lNUF9TRU5fNzoKKwljYXNlIFJUNTY2OF9IUF9JTVBfU0VOXzg6CisJY2FzZSBSVDU2NjhfSFBfSU1QX1NFTl85OgorCWNhc2UgUlQ1NjY4X0hQX0lNUF9TRU5fMTA6CisJY2FzZSBSVDU2NjhfSFBfTE9HSUNfMzoKKwljYXNlIFJUNTY2OF9IUF9DQUxJQl9TVDEwOgorCWNhc2UgUlQ1NjY4X0hQX0NBTElCX1NUMTE6CisJY2FzZSBSVDU2NjhfUFJPX1JFR19UQkxfNDoKKwljYXNlIFJUNTY2OF9QUk9fUkVHX1RCTF81OgorCWNhc2UgUlQ1NjY4X1BST19SRUdfVEJMXzY6CisJY2FzZSBSVDU2NjhfUFJPX1JFR19UQkxfNzoKKwljYXNlIFJUNTY2OF9QUk9fUkVHX1RCTF84OgorCWNhc2UgUlQ1NjY4X1BST19SRUdfVEJMXzk6CisJY2FzZSBSVDU2NjhfU0FSX0FEQ19JTkxfMToKKwljYXNlIFJUNTY2OF9TQVJfQURDX0lOTF8yOgorCWNhc2UgUlQ1NjY4X1NBUl9BRENfSU5MXzM6CisJY2FzZSBSVDU2NjhfU0FSX0FEQ19JTkxfNDoKKwljYXNlIFJUNTY2OF9TQVJfQURDX0lOTF81OgorCWNhc2UgUlQ1NjY4X1NBUl9BRENfSU5MXzY6CisJY2FzZSBSVDU2NjhfU0FSX0FEQ19JTkxfNzoKKwljYXNlIFJUNTY2OF9TQVJfQURDX0lOTF84OgorCWNhc2UgUlQ1NjY4X1NBUl9BRENfSU5MXzk6CisJY2FzZSBSVDU2NjhfU0FSX0FEQ19JTkxfMTA6CisJY2FzZSBSVDU2NjhfU0FSX0FEQ19JTkxfMTE6CisJY2FzZSBSVDU2NjhfU0FSX0FEQ19JTkxfMTI6CisJY2FzZSBSVDU2NjhfRFJDX0NUUkxfMToKKwljYXNlIFJUNTY2OF9EUkMxX0NUUkxfMjoKKwljYXNlIFJUNTY2OF9EUkMxX0NUUkxfMzoKKwljYXNlIFJUNTY2OF9EUkMxX0NUUkxfNDoKKwljYXNlIFJUNTY2OF9EUkMxX0NUUkxfNToKKwljYXNlIFJUNTY2OF9EUkMxX0NUUkxfNjoKKwljYXNlIFJUNTY2OF9EUkMxX0hEX0NUUkxfMToKKwljYXNlIFJUNTY2OF9EUkMxX0hEX0NUUkxfMjoKKwljYXNlIFJUNTY2OF9EUkMxX1BSSV9SRUdfMToKKwljYXNlIFJUNTY2OF9EUkMxX1BSSV9SRUdfMjoKKwljYXNlIFJUNTY2OF9EUkMxX1BSSV9SRUdfMzoKKwljYXNlIFJUNTY2OF9EUkMxX1BSSV9SRUdfNDoKKwljYXNlIFJUNTY2OF9EUkMxX1BSSV9SRUdfNToKKwljYXNlIFJUNTY2OF9EUkMxX1BSSV9SRUdfNjoKKwljYXNlIFJUNTY2OF9EUkMxX1BSSV9SRUdfNzoKKwljYXNlIFJUNTY2OF9EUkMxX1BSSV9SRUdfODoKKwljYXNlIFJUNTY2OF9BTENfUEdBX0NUTF8xOgorCWNhc2UgUlQ1NjY4X0FMQ19QR0FfQ1RMXzI6CisJY2FzZSBSVDU2NjhfQUxDX1BHQV9DVExfMzoKKwljYXNlIFJUNTY2OF9BTENfUEdBX0NUTF80OgorCWNhc2UgUlQ1NjY4X0FMQ19QR0FfQ1RMXzU6CisJY2FzZSBSVDU2NjhfQUxDX1BHQV9DVExfNjoKKwljYXNlIFJUNTY2OF9BTENfUEdBX0NUTF83OgorCWNhc2UgUlQ1NjY4X0FMQ19QR0FfQ1RMXzg6CisJY2FzZSBSVDU2NjhfQUxDX1BHQV9SRUdfMToKKwljYXNlIFJUNTY2OF9BTENfUEdBX1JFR18yOgorCWNhc2UgUlQ1NjY4X0FMQ19QR0FfUkVHXzM6CisJY2FzZSBSVDU2NjhfQURDX0VRX1JFQ09WXzE6CisJY2FzZSBSVDU2NjhfQURDX0VRX1JFQ09WXzI6CisJY2FzZSBSVDU2NjhfQURDX0VRX1JFQ09WXzM6CisJY2FzZSBSVDU2NjhfQURDX0VRX1JFQ09WXzQ6CisJY2FzZSBSVDU2NjhfQURDX0VRX1JFQ09WXzU6CisJY2FzZSBSVDU2NjhfQURDX0VRX1JFQ09WXzY6CisJY2FzZSBSVDU2NjhfQURDX0VRX1JFQ09WXzc6CisJY2FzZSBSVDU2NjhfQURDX0VRX1JFQ09WXzg6CisJY2FzZSBSVDU2NjhfQURDX0VRX1JFQ09WXzk6CisJY2FzZSBSVDU2NjhfQURDX0VRX1JFQ09WXzEwOgorCWNhc2UgUlQ1NjY4X0FEQ19FUV9SRUNPVl8xMToKKwljYXNlIFJUNTY2OF9BRENfRVFfUkVDT1ZfMTI6CisJY2FzZSBSVDU2NjhfQURDX0VRX1JFQ09WXzEzOgorCWNhc2UgUlQ1NjY4X1ZJRF9ISURERU46CisJY2FzZSBSVDU2NjhfVklEX0NVU1RPTUVSOgorCWNhc2UgUlQ1NjY4X1NDQU5fTU9ERToKKwljYXNlIFJUNTY2OF9JMkNfQllQQToKKwkJcmV0dXJuIHRydWU7CisJY2FzZSBSVDU2NjNfVERNXzE6CisJY2FzZSBSVDU2NjNfREVQT1BfMzoKKwljYXNlIFJUNTY2M19BU1JDXzExXzI6CisJY2FzZSBSVDU2NjNfSU5UX1NUXzI6CisJY2FzZSBSVDU2NjNfR1BJT19TVEE6CisJY2FzZSBSVDU2NjNfU0lOX0dFTl8xOgorCWNhc2UgUlQ1NjYzX1NJTl9HRU5fMjoKKwljYXNlIFJUNTY2M19TSU5fR0VOXzM6CisJY2FzZSBSVDU2NjNfSUxfQ01EX1BXUlNBVjE6CisJY2FzZSBSVDU2NjNfSUxfQ01EX1BXUlNBVjI6CisJY2FzZSBSVDU2NjNfRU1fSkFDS19UWVBFXzE6CisJY2FzZSBSVDU2NjNfRU1fSkFDS19UWVBFXzI6CisJY2FzZSBSVDU2NjNfRU1fSkFDS19UWVBFXzM6CisJY2FzZSBSVDU2NjNfRU1fSkFDS19UWVBFXzQ6CisJY2FzZSBSVDU2NjNfRkFTVF9PRkZfTUlDQklBUzoKKwljYXNlIFJUNTY2M19BTkFfQklBU19DVVJfMToKKwljYXNlIFJUNTY2M19BTkFfQklBU19DVVJfMjoKKwljYXNlIFJUNTY2M19CSUFTX0NVUl85OgorCWNhc2UgUlQ1NjYzX0RVTU1ZX1JFR180OgorCWNhc2UgUlQ1NjYzX1ZSRUZfUkVDTUlYOgorCWNhc2UgUlQ1NjYzX0NIQVJHRV9QVU1QXzFfMjoKKwljYXNlIFJUNTY2M19DSEFSR0VfUFVNUF8xXzM6CisJY2FzZSBSVDU2NjNfQ0hBUkdFX1BVTVBfMjoKKwljYXNlIFJUNTY2M19DSE9QX0RBQ19SOgorCWNhc2UgUlQ1NjYzX0RVTU1ZX0NUTF9EQUNMUjoKKwljYXNlIFJUNTY2M19EVU1NWV9SRUdfNToKKwljYXNlIFJUNTY2M19TT0ZUX1JBTVA6CisJY2FzZSBSVDU2NjNfVEVTVF9NT0RFXzE6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV8xMDoKKwljYXNlIFJUNTY2M19NSUNfREVDUk9fMToKKwljYXNlIFJUNTY2M19NSUNfREVDUk9fMjoKKwljYXNlIFJUNTY2M19NSUNfREVDUk9fMzoKKwljYXNlIFJUNTY2M19NSUNfREVDUk9fNDoKKwljYXNlIFJUNTY2M19NSUNfREVDUk9fNToKKwljYXNlIFJUNTY2M19NSUNfREVDUk9fNjoKKwljYXNlIFJUNTY2M19IUF9ERUNST18xOgorCWNhc2UgUlQ1NjYzX0hQX0RFQ1JPXzI6CisJY2FzZSBSVDU2NjNfSFBfREVDUk9fMzoKKwljYXNlIFJUNTY2M19IUF9ERUNST180OgorCWNhc2UgUlQ1NjYzX0hQX0RFQ09VUDoKKwljYXNlIFJUNTY2M19IUF9JTVBTRU5fTUFQNDoKKwljYXNlIFJUNTY2M19IUF9JTVBTRU5fTUFQNToKKwljYXNlIFJUNTY2M19IUF9JTVBTRU5fTUFQNzoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl8xOgorCWNhc2UgUlQ1NjYzX0NCSl8xOgorCWNhc2UgUlQ1NjYzX0NCSl8yOgorCWNhc2UgUlQ1NjYzX0NCSl8zOgorCQlyZXR1cm4gZmFsc2U7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHJ0NTY2M19yZWFkYWJsZV9yZWdpc3RlcihkZXYsIHJlZyk7CisJfQorfQorCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUocnQ1NjYzX2hwX3ZvbF90bHYsIC0yNDAwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHJ0NTY2OF9ocF92b2xfdGx2LCAtMjI1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYWNfdm9sX3RsdiwgLTY1MjUsIDc1LCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGNfdm9sX3RsdiwgLTE3MjUsIDc1LCAwKTsKKworLyogezAsICsyMCwgKzI0LCArMzAsICszNSwgKzQwLCArNDQsICs1MCwgKzUyfSBkQiAqLworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1JBTkdFKGluX2JzdF90bHYsCisJMCwgMCwgVExWX0RCX1NDQUxFX0lURU0oMCwgMCwgMCksCisJMSwgMSwgVExWX0RCX1NDQUxFX0lURU0oMjAwMCwgMCwgMCksCisJMiwgMiwgVExWX0RCX1NDQUxFX0lURU0oMjQwMCwgMCwgMCksCisJMywgNSwgVExWX0RCX1NDQUxFX0lURU0oMzAwMCwgNTAwLCAwKSwKKwk2LCA2LCBUTFZfREJfU0NBTEVfSVRFTSg0NDAwLCAwLCAwKSwKKwk3LCA3LCBUTFZfREJfU0NBTEVfSVRFTSg1MDAwLCAwLCAwKSwKKwk4LCA4LCBUTFZfREJfU0NBTEVfSVRFTSg1MjAwLCAwLCAwKQorKTsKKworLyogSW50ZXJmYWNlIGRhdGEgc2VsZWN0ICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ0NTY2M19pZjFfYWRjX2RhdGFfc2VsZWN0W10gPSB7CisJIkwvUiIsICJSL0wiLCAiTC9MIiwgIlIvUiIKK307CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NjNfaWYxX2FkY19lbnVtLCBSVDU2NjNfVERNXzIsCisJUlQ1NjYzX0RBVEFfU1dBUF9BRENEQVQxX1NISUZULCBydDU2NjNfaWYxX2FkY19kYXRhX3NlbGVjdCk7CisKK3N0YXRpYyB2b2lkIHJ0NTY2M19lbmFibGVfcHVzaF9idXR0b25faXJxKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwlib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKGVuYWJsZSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSUxfQ01EXzYsCisJCQlSVDU2NjhfRU5fNEJUTl9JTkxfTUFTSywgUlQ1NjY4X0VOXzRCVE5fSU5MX0VOKTsKKwkJLyogcmVzZXQgaW4tbGluZSBjb21tYW5kICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19JTF9DTURfNiwKKwkJCVJUNTY2OF9SRVNFVF80QlROX0lOTF9NQVNLLAorCQkJUlQ1NjY4X1JFU0VUXzRCVE5fSU5MX1JFU0VUKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0lMX0NNRF82LAorCQkJUlQ1NjY4X1JFU0VUXzRCVE5fSU5MX01BU0ssCisJCQlSVDU2NjhfUkVTRVRfNEJUTl9JTkxfTk9SKTsKKwkJc3dpdGNoIChydDU2NjMtPmNvZGVjX3R5cGUpIHsKKwkJY2FzZSBDT0RFQ19UWVBFX1JUNTY2ODoKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19JUlFfMywKKwkJCQlSVDU2NjhfRU5fSVJRX0lOTElORV9NQVNLLAorCQkJCVJUNTY2OF9FTl9JUlFfSU5MSU5FX05PUik7CisJCQlicmVhazsKKwkJY2FzZSBDT0RFQ19UWVBFX1JUNTY2MzoKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19JUlFfMiwKKwkJCQlSVDU2NjNfRU5fSVJRX0lOTElORV9NQVNLLAorCQkJCVJUNTY2M19FTl9JUlFfSU5MSU5FX05PUik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIlVua25vd24gQ09ERUNfVFlQRVxuIik7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKHJ0NTY2My0+Y29kZWNfdHlwZSkgeworCQljYXNlIENPREVDX1RZUEVfUlQ1NjY4OgorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0lSUV8zLAorCQkJCVJUNTY2OF9FTl9JUlFfSU5MSU5FX01BU0ssCisJCQkJUlQ1NjY4X0VOX0lSUV9JTkxJTkVfQllQKTsKKwkJCWJyZWFrOworCQljYXNlIENPREVDX1RZUEVfUlQ1NjYzOgorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0lSUV8yLAorCQkJCVJUNTY2M19FTl9JUlFfSU5MSU5FX01BU0ssCisJCQkJUlQ1NjYzX0VOX0lSUV9JTkxJTkVfQllQKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5rbm93biBDT0RFQ19UWVBFXG4iKTsKKwkJfQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSUxfQ01EXzYsCisJCQlSVDU2NjhfRU5fNEJUTl9JTkxfTUFTSywgUlQ1NjY4X0VOXzRCVE5fSU5MX0RJUyk7CisJCS8qIHJlc2V0IGluLWxpbmUgY29tbWFuZCAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSUxfQ01EXzYsCisJCQlSVDU2NjhfUkVTRVRfNEJUTl9JTkxfTUFTSywKKwkJCVJUNTY2OF9SRVNFVF80QlROX0lOTF9SRVNFVCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19JTF9DTURfNiwKKwkJCVJUNTY2OF9SRVNFVF80QlROX0lOTF9NQVNLLAorCQkJUlQ1NjY4X1JFU0VUXzRCVE5fSU5MX05PUik7CisJfQorfQorCisvKioKKyAqIHJ0NTY2OF9qYWNrX2RldGVjdCAtIERldGVjdCBoZWFkc2V0LgorICogQGNvZGVjOiBTb0MgYXVkaW8gY29kZWMgZGV2aWNlLgorICogQGphY2tfaW5zZXJ0OiBKYWNrIGluc2VydCBvciBub3QuCisgKgorICogRGV0ZWN0IHdoZXRoZXIgaXMgaGVhZHNldCBvciBub3Qgd2hlbiBqYWNrIGluc2VydGVkLgorICoKKyAqIFJldHVybnMgZGV0ZWN0IHN0YXR1cy4KKyAqLworCitzdGF0aWMgaW50IHJ0NTY2OF9qYWNrX2RldGVjdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBqYWNrX2luc2VydCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2OCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCB2YWwsIGkgPSAwLCBzbGVlcF90aW1lWzVdID0gezMwMCwgMTUwLCAxMDAsIDUwLCAzMH07CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyBqYWNrX2luc2VydDolZFxuIiwgX19mdW5jX18sIGphY2tfaW5zZXJ0KTsKKwlpZiAoamFja19pbnNlcnQpIHsKKwkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjY4X0NCSl9UWVBFXzIsIDB4ODA0MCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2OF9DQkpfVFlQRV8zLCAweDE0ODQpOworCisJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKGRhcG0sICJNSUNCSUFTMSIpOworCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbihkYXBtLCAiTUlDQklBUzIiKTsKKwkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oZGFwbSwgIk1pYyBEZXQgUG93ZXIiKTsKKwkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oZGFwbSwgIkNCSiBQb3dlciIpOworCQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX1JDX0NMSywKKwkJCVJUNTY2OF9ESUdfMU1fQ0xLX01BU0ssIFJUNTY2OF9ESUdfMU1fQ0xLX0VOKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX1JFQ01JWCwgMHg4LCAweDgpOworCisJCXdoaWxlIChpIDwgNSkgeworCQkJbXNsZWVwKHNsZWVwX3RpbWVbaV0pOworCQkJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBSVDU2NjhfQ0JKX1RZUEVfMikgJiAweDAwMDM7CisJCQlpZiAodmFsID09IDB4MSB8fCB2YWwgPT0gMHgyIHx8IHZhbCA9PSAweDMpCisJCQkJYnJlYWs7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogTVgtMDAxMSB2YWw9JXggc2xlZXAgJWRcbiIsCisJCQkJX19mdW5jX18sIHZhbCwgc2xlZXBfdGltZVtpXSk7CisJCQlpKys7CisJCX0KKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgdmFsID0gJWRcbiIsIF9fZnVuY19fLCB2YWwpOworCQlzd2l0Y2ggKHZhbCkgeworCQljYXNlIDE6CisJCWNhc2UgMjoKKwkJCXJ0NTY2OC0+amFja190eXBlID0gU05EX0pBQ0tfSEVBRFNFVDsKKwkJCXJ0NTY2M19lbmFibGVfcHVzaF9idXR0b25faXJxKGNvZGVjLCB0cnVlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNSUNCSUFTMSIpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNSUNCSUFTMiIpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNaWMgRGV0IFBvd2VyIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkNCSiBQb3dlciIpOworCQkJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJCQlydDU2NjgtPmphY2tfdHlwZSA9IFNORF9KQUNLX0hFQURQSE9ORTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX1JFQ01JWCwgMHg4LCAweDApOworCisJCWlmIChydDU2NjgtPmphY2tfdHlwZSA9PSBTTkRfSkFDS19IRUFEU0VUKSB7CisJCQlydDU2NjNfZW5hYmxlX3B1c2hfYnV0dG9uX2lycShjb2RlYywgZmFsc2UpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNSUNCSUFTMSIpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNSUNCSUFTMiIpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNaWMgRGV0IFBvd2VyIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkNCSiBQb3dlciIpOworCQkJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJCX0KKwkJcnQ1NjY4LT5qYWNrX3R5cGUgPSAwOworCX0KKworCWRldl9kYmcoY29kZWMtPmRldiwgImphY2tfdHlwZSA9ICVkXG4iLCBydDU2NjgtPmphY2tfdHlwZSk7CisJcmV0dXJuIHJ0NTY2OC0+amFja190eXBlOworfQorCisvKioKKyAqIHJ0NTY2M19qYWNrX2RldGVjdCAtIERldGVjdCBoZWFkc2V0LgorICogQGNvZGVjOiBTb0MgYXVkaW8gY29kZWMgZGV2aWNlLgorICogQGphY2tfaW5zZXJ0OiBKYWNrIGluc2VydCBvciBub3QuCisgKgorICogRGV0ZWN0IHdoZXRoZXIgaXMgaGVhZHNldCBvciBub3Qgd2hlbiBqYWNrIGluc2VydGVkLgorICoKKyAqIFJldHVybnMgZGV0ZWN0IHN0YXR1cy4KKyAqLworc3RhdGljIGludCBydDU2NjNfamFja19kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgamFja19pbnNlcnQpCit7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgdmFsLCBpID0gMCwgc2xlZXBfdGltZVs1XSA9IHszMDAsIDE1MCwgMTAwLCA1MCwgMzB9OworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgamFja19pbnNlcnQ6JWRcbiIsIF9fZnVuY19fLCBqYWNrX2luc2VydCk7CisKKwlpZiAoamFja19pbnNlcnQpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0RJR19NSVNDLAorCQkJUlQ1NjY4X0RJR19HQVRFX0NUUkxfTUFTSywgUlQ1NjY4X0RJR19HQVRFX0NUUkxfRU4pOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSFBfQ0hBUkdFX1BVTVBfMSwKKwkJCVJUNTY2M19TSV9IUF9NQVNLIHwgUlQ1NjY4X09TV19IUF9MX01BU0sgfAorCQkJUlQ1NjY4X09TV19IUF9SX01BU0ssIFJUNTY2M19TSV9IUF9FTiB8CisJCQlSVDU2NjhfT1NXX0hQX0xfRElTIHwgUlQ1NjY4X09TV19IUF9SX0RJUyk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19EVU1NWV8xLAorCQkJUlQ1NjYzX0VNQl9DTEtfTUFTSyB8IFJUNTY2M19IUEFfQ1BMX0JJQVNfTUFTSyB8CisJCQlSVDU2NjNfSFBBX0NQUl9CSUFTX01BU0ssIFJUNTY2M19FTUJfQ0xLX0VOIHwKKwkJCVJUNTY2M19IUEFfQ1BMX0JJQVNfMSB8IFJUNTY2M19IUEFfQ1BSX0JJQVNfMSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19DQkpfMSwKKwkJCVJUNTY2M19JTkJVRl9DQkpfQlNUMV9NQVNLIHwgUlQ1NjYzX0NCSl9TRU5TRV9CU1QxX01BU0ssCisJCQlSVDU2NjNfSU5CVUZfQ0JKX0JTVDFfT04gfCBSVDU2NjNfQ0JKX1NFTlNFX0JTVDFfTCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19JTF9DTURfMiwKKwkJCVJUNTY2M19QV1JfTUlDX0RFVF9NQVNLLCBSVDU2NjNfUFdSX01JQ19ERVRfT04pOworCQkvKiBCU1QxIHBvd2VyIG9uIGZvciBKRCAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfUFdSX0FOTEdfMiwKKwkJCVJUNTY2OF9QV1JfQlNUMV9NQVNLLCBSVDU2NjhfUFdSX0JTVDFfT04pOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfRU1fSkFDS19UWVBFXzEsCisJCQlSVDU2NjNfQ0JKX0RFVF9NQVNLIHwgUlQ1NjYzX0VYVF9KRF9NQVNLIHwKKwkJCVJUNTY2M19QT0xfRVhUX0pEX01BU0ssIFJUNTY2M19DQkpfREVUX0VOIHwKKwkJCVJUNTY2M19FWFRfSkRfRU4gfCBSVDU2NjNfUE9MX0VYVF9KRF9FTik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19QV1JfQU5MR18xLAorCQkJUlQ1NjY4X1BXUl9NQl9NQVNLIHwgUlQ1NjY4X0xETzFfRFZPX01BU0sgfAorCQkJUlQ1NjY4X0FNUF9IUF9NQVNLLCBSVDU2NjhfUFdSX01CIHwKKwkJCVJUNTY2OF9MRE8xX0RWT18wXzlWIHwgUlQ1NjY4X0FNUF9IUF8zWCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19BVVRPXzFNUkNfQ0xLLAorCQkJUlQ1NjY4X0lSUV9QT1dfU0FWX01BU0ssIFJUNTY2OF9JUlFfUE9XX1NBVl9FTik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19JUlFfMSwKKwkJCVJUNTY2M19FTl9JUlFfSkQxX01BU0ssIFJUNTY2M19FTl9JUlFfSkQxX0VOKTsKKwkJd2hpbGUgKGkgPCA1KSB7CisJCQltc2xlZXAoc2xlZXBfdGltZVtpXSk7CisJCQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFJUNTY2M19FTV9KQUNLX1RZUEVfMikgJgorCQkJCTB4MDAwMzsKKwkJCWkrKzsKKwkJCWlmICh2YWwgPT0gMHgxIHx8IHZhbCA9PSAweDIgfHwgdmFsID09IDB4MykKKwkJCQlicmVhazsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBNWC0wMGU3IHZhbD0leCBzbGVlcCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgdmFsLCBzbGVlcF90aW1lW2ldKTsKKwkJfQorCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyB2YWwgPSAlZFxuIiwgX19mdW5jX18sIHZhbCk7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQkJcnQ1NjYzLT5qYWNrX3R5cGUgPSBTTkRfSkFDS19IRUFEU0VUOworCQkJcnQ1NjYzX2VuYWJsZV9wdXNoX2J1dHRvbl9pcnEoY29kZWMsIHRydWUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlydDU2NjMtPmphY2tfdHlwZSA9IFNORF9KQUNLX0hFQURQSE9ORTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHJ0NTY2My0+amFja190eXBlID09IFNORF9KQUNLX0hFQURTRVQpCisJCQlydDU2NjNfZW5hYmxlX3B1c2hfYnV0dG9uX2lycShjb2RlYywgZmFsc2UpOworCQlydDU2NjMtPmphY2tfdHlwZSA9IDA7CisJfQorCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiamFja190eXBlID0gJWRcbiIsIHJ0NTY2My0+amFja190eXBlKTsKKwlyZXR1cm4gcnQ1NjYzLT5qYWNrX3R5cGU7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYzX2J1dHRvbl9kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCBidG5fdHlwZSwgdmFsOworCisJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBSVDU2NjNfSUxfQ01EXzUpOworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB2YWw9MHgleFxuIiwgX19mdW5jX18sIHZhbCk7CisJYnRuX3R5cGUgPSB2YWwgJiAweGZmZjA7CisJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjYzX0lMX0NNRF81LCB2YWwpOworCisJcmV0dXJuIGJ0bl90eXBlOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcnQ1NjYzX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gZGF0YTsKKworCWRldl9kYmcocnQ1NjYzLT5jb2RlYy0+ZGV2LCAiJXMgSVJRIHF1ZXVlIHdvcmtcbiIsIF9fZnVuY19fKTsKKworCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fd3EsICZydDU2NjMtPmphY2tfZGV0ZWN0X3dvcmssCisJCW1zZWNzX3RvX2ppZmZpZXMoMjUwKSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2ludCBydDU2NjNfc2V0X2phY2tfZGV0ZWN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwlzdHJ1Y3Qgc25kX3NvY19qYWNrICpoc19qYWNrKQoreworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlydDU2NjMtPmhzX2phY2sgPSBoc19qYWNrOworCisJcnQ1NjYzX2lycSgwLCBydDU2NjMpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChydDU2NjNfc2V0X2phY2tfZGV0ZWN0KTsKKworc3RhdGljIGJvb2wgcnQ1NjYzX2NoZWNrX2pkX3N0YXR1cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBSVDU2NjNfSU5UX1NUXzEpOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgdmFsPSV4XG4iLCBfX2Z1bmNfXywgdmFsKTsKKworCS8qIEpEMSAqLworCXN3aXRjaCAocnQ1NjYzLT5jb2RlY190eXBlKSB7CisJY2FzZSBDT0RFQ19UWVBFX1JUNTY2ODoKKwkJcmV0dXJuICEodmFsICYgMHgyMDAwKTsKKwljYXNlIENPREVDX1RZUEVfUlQ1NjYzOgorCQlyZXR1cm4gISh2YWwgJiAweDEwMDApOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVua25vd24gQ09ERUNfVFlQRVxuIik7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBydDU2NjNfamFja19kZXRlY3Rfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJ0NTY2M19wcml2LCBqYWNrX2RldGVjdF93b3JrLndvcmspOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0NTY2My0+Y29kZWM7CisJaW50IGJ0bl90eXBlLCByZXBvcnQgPSAwOworCisJaWYgKCFjb2RlYykKKwkJcmV0dXJuOworCisJaWYgKHJ0NTY2M19jaGVja19qZF9zdGF0dXMoY29kZWMpKSB7CisJCS8qIGphY2sgaW4gKi8KKwkJaWYgKHJ0NTY2My0+amFja190eXBlID09IDApIHsKKwkJCS8qIGphY2sgd2FzIG91dCwgcmVwb3J0IGphY2sgdHlwZSAqLworCQkJc3dpdGNoIChydDU2NjMtPmNvZGVjX3R5cGUpIHsKKwkJCWNhc2UgQ09ERUNfVFlQRV9SVDU2Njg6CisJCQkJcmVwb3J0ID0gcnQ1NjY4X2phY2tfZGV0ZWN0KHJ0NTY2My0+Y29kZWMsIDEpOworCQkJCWJyZWFrOworCQkJY2FzZSBDT0RFQ19UWVBFX1JUNTY2MzoKKwkJCQlyZXBvcnQgPSBydDU2NjNfamFja19kZXRlY3QocnQ1NjYzLT5jb2RlYywgMSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWRldl9lcnIoY29kZWMtPmRldiwgIlVua25vd24gQ09ERUNfVFlQRVxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBqYWNrIGlzIGFscmVhZHkgaW4sIHJlcG9ydCBidXR0b24gZXZlbnQgKi8KKwkJCXJlcG9ydCA9IFNORF9KQUNLX0hFQURTRVQ7CisJCQlidG5fdHlwZSA9IHJ0NTY2M19idXR0b25fZGV0ZWN0KHJ0NTY2My0+Y29kZWMpOworCQkJLyoqCisJCQkgKiBydDU2NjMgY2FuIHJlcG9ydCB0aHJlZSBraW5kcyBvZiBidXR0b24gYmVoYXZpb3IsCisJCQkgKiBvbmUgY2xpY2ssIGRvdWJsZSBjbGljayBhbmQgaG9sZC4gSG93ZXZlciwKKwkJCSAqIGN1cnJlbnRseSB3ZSB3aWxsIHJlcG9ydCBidXR0b24gcHJlc3NlZC9yZWxlYXNlZAorCQkJICogZXZlbnQuIFNvIGFsbCB0aGUgdGhyZWUgYnV0dG9uIGJlaGF2aW9ycyBhcmUKKwkJCSAqIHRyZWF0ZWQgYXMgYnV0dG9uIHByZXNzZWQuCisJCQkgKi8KKwkJCXN3aXRjaCAoYnRuX3R5cGUpIHsKKwkJCWNhc2UgMHg4MDAwOgorCQkJY2FzZSAweDQwMDA6CisJCQljYXNlIDB4MjAwMDoKKwkJCQlyZXBvcnQgfD0gU05EX0pBQ0tfQlROXzA7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MTAwMDoKKwkJCWNhc2UgMHgwODAwOgorCQkJY2FzZSAweDA0MDA6CisJCQkJcmVwb3J0IHw9IFNORF9KQUNLX0JUTl8xOworCQkJCWJyZWFrOworCQkJY2FzZSAweDAyMDA6CisJCQljYXNlIDB4MDEwMDoKKwkJCWNhc2UgMHgwMDgwOgorCQkJCXJlcG9ydCB8PSBTTkRfSkFDS19CVE5fMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwMDQwOgorCQkJY2FzZSAweDAwMjA6CisJCQljYXNlIDB4MDAxMDoKKwkJCQlyZXBvcnQgfD0gU05EX0pBQ0tfQlROXzM7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDAwMDogLyogdW5wcmVzc2VkICovCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJ0bl90eXBlID0gMDsKKwkJCQlkZXZfZXJyKHJ0NTY2My0+Y29kZWMtPmRldiwKKwkJCQkJIlVuZXhwZWN0ZWQgYnV0dG9uIGNvZGUgMHglMDR4XG4iLAorCQkJCQlidG5fdHlwZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBidXR0b24gcmVsZWFzZSBvciBzcHVyaW91cyBpbnRlcnJwdXQqLworCQkJaWYgKGJ0bl90eXBlID09IDApCisJCQkJcmVwb3J0ID0gIHJ0NTY2My0+amFja190eXBlOworCQl9CisJfSBlbHNlIHsKKwkJLyogamFjayBvdXQgKi8KKwkJc3dpdGNoIChydDU2NjMtPmNvZGVjX3R5cGUpIHsKKwkJY2FzZSBDT0RFQ19UWVBFX1JUNTY2ODoKKwkJCXJlcG9ydCA9IHJ0NTY2OF9qYWNrX2RldGVjdChydDU2NjMtPmNvZGVjLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIENPREVDX1RZUEVfUlQ1NjYzOgorCQkJcmVwb3J0ID0gcnQ1NjYzX2phY2tfZGV0ZWN0KHJ0NTY2My0+Y29kZWMsIDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIENPREVDX1RZUEVcbiIpOworCQl9CisJfQorCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIGphY2sgcmVwb3J0OiAweCUwNHhcbiIsIF9fZnVuY19fLCByZXBvcnQpOworCXNuZF9zb2NfamFja19yZXBvcnQocnQ1NjYzLT5oc19qYWNrLCByZXBvcnQsIFNORF9KQUNLX0hFQURTRVQgfAorCQkJICAgIFNORF9KQUNLX0JUTl8wIHwgU05EX0pBQ0tfQlROXzEgfAorCQkJICAgIFNORF9KQUNLX0JUTl8yIHwgU05EX0pBQ0tfQlROXzMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYzX3NuZF9jb250cm9sc1tdID0geworCS8qIERBQyBEaWdpdGFsIFZvbHVtZSAqLworCVNPQ19ET1VCTEVfVExWKCJEQUMgUGxheWJhY2sgVm9sdW1lIiwgUlQ1NjYzX1NUTzFfREFDX0RJR19WT0wsCisJCVJUNTY2OF9EQUNfTDFfVk9MX1NISUZUICsgMSwgUlQ1NjY4X0RBQ19SMV9WT0xfU0hJRlQgKyAxLAorCQk4NywgMCwgZGFjX3ZvbF90bHYpLAorCS8qIEFEQyBEaWdpdGFsIFZvbHVtZSBDb250cm9sICovCisJU09DX0RPVUJMRSgiQURDIENhcHR1cmUgU3dpdGNoIiwgUlQ1NjYzX1NUTzFfQURDX0RJR19WT0wsCisJCVJUNTY2OF9BRENfTF9NVVRFX1NISUZULCBSVDU2NjhfQURDX1JfTVVURV9TSElGVCwgMSwgMSksCisJU09DX0RPVUJMRV9UTFYoIkFEQyBDYXB0dXJlIFZvbHVtZSIsIFJUNTY2M19TVE8xX0FEQ19ESUdfVk9MLAorCQlSVDU2NjhfQURDX0xfVk9MX1NISUZUICsgMSwgUlQ1NjY4X0FEQ19SX1ZPTF9TSElGVCArIDEsCisJCTYzLCAwLCBhZGNfdm9sX3RsdiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjY4X3NwZWNpZmljX2NvbnRyb2xzW10gPSB7CisJLyogSGVhZHBob25lIE91dHB1dCBWb2x1bWUgKi8KKwlTT0NfRE9VQkxFX1JfVExWKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgUlQ1NjYzX0hQX0xDSF9EUkUsCisJCVJUNTY2M19IUF9SQ0hfRFJFLCBSVDU2NjhfR0FJTl9IUF9TSElGVCwgMTUsIDEsCisJCXJ0NTY2OF9ocF92b2xfdGx2KSwKKwkvKiBNaWMgQm9vc3QgVm9sdW1lICovCisJU09DX1NJTkdMRV9UTFYoIklOMSBDYXB0dXJlIFZvbHVtZSIsIFJUNTY2OF9BRUNfQlNULAorCQlSVDU2NjhfR0FJTl9DQkpfU0hJRlQsIDgsIDAsIGluX2JzdF90bHYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2M19zcGVjaWZpY19jb250cm9sc1tdID0geworCS8qIEhlYWRwaG9uZSBPdXRwdXQgVm9sdW1lICovCisJU09DX0RPVUJMRV9SX1RMVigiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIFJUNTY2M19TVE9fRFJFXzksCisJCVJUNTY2M19TVE9fRFJFXzEwLCBSVDU2NjNfRFJFX0dBSU5fSFBfU0hJRlQsIDIzLCAxLAorCQlydDU2NjNfaHBfdm9sX3RsdiksCisJLyogTWljIEJvb3N0IFZvbHVtZSovCisJU09DX1NJTkdMRV9UTFYoIklOMSBDYXB0dXJlIFZvbHVtZSIsIFJUNTY2M19DQkpfMiwKKwkJUlQ1NjYzX0dBSU5fQlNUMV9TSElGVCwgOCwgMCwgaW5fYnN0X3RsdiksCisJLyogRGF0YSBTd2FwIGZvciBTbG90MC8xIGluIEFEQ0RBVDEgKi8KKwlTT0NfRU5VTSgiSUYxIEFEQyBEYXRhIFN3YXAiLCBydDU2NjNfaWYxX2FkY19lbnVtKSwKK307CisKK3N0YXRpYyBpbnQgcnQ1NjYzX2lzX3N5c19jbGtfZnJvbV9wbGwoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNpbmspCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisKKwl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFJUNTY2M19HTEJfQ0xLKTsKKwl2YWwgJj0gUlQ1NjYzX1NDTEtfU1JDX01BU0s7CisJaWYgKHZhbCA9PSBSVDU2NjNfU0NMS19TUkNfUExMMSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjNfaXNfdXNpbmdfYXNyYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwl1bnNpZ25lZCBpbnQgcmVnLCBzaGlmdCwgdmFsOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKHJ0NTY2My0+Y29kZWNfdHlwZSA9PSBDT0RFQ19UWVBFX1JUNTY2OCkgeworCQlzd2l0Y2ggKHctPnNoaWZ0KSB7CisJCWNhc2UgUlQ1NjY4X0FEQ19TVE8xX0FTUkNfU0hJRlQ6CisJCQlyZWcgPSBSVDU2NjhfQVNSQ18zOworCQkJc2hpZnQgPSBSVDU2NjhfQURfU1RPMV9UUkFDS19TSElGVDsKKwkJCWJyZWFrOworCQljYXNlIFJUNTY2OF9EQUNfU1RPMV9BU1JDX1NISUZUOgorCQkJcmVnID0gUlQ1NjYzX0FTUkNfMjsKKwkJCXNoaWZ0ID0gUlQ1NjY4X0RBX1NUTzFfVFJBQ0tfU0hJRlQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoICh3LT5zaGlmdCkgeworCQljYXNlIFJUNTY2M19BRENfU1RPMV9BU1JDX1NISUZUOgorCQkJcmVnID0gUlQ1NjYzX0FTUkNfMjsKKwkJCXNoaWZ0ID0gUlQ1NjYzX0FEX1NUTzFfVFJBQ0tfU0hJRlQ7CisJCQlicmVhazsKKwkJY2FzZSBSVDU2NjNfREFDX1NUTzFfQVNSQ19TSElGVDoKKwkJCXJlZyA9IFJUNTY2M19BU1JDXzI7CisJCQlzaGlmdCA9IFJUNTY2M19EQV9TVE8xX1RSQUNLX1NISUZUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXZhbCA9IChzbmRfc29jX3JlYWQoY29kZWMsIHJlZykgPj4gc2hpZnQpICYgMHg3OworCisJaWYgKHZhbCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjNfaTJzX3VzZV9hc3JjKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzb3VyY2UsCisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNpbmspCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHNvdXJjZS0+ZGFwbSk7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgZGFfYXNyY19lbiwgYWRfYXNyY19lbjsKKworCWRhX2FzcmNfZW4gPSAoc25kX3NvY19yZWFkKGNvZGVjLCBSVDU2NjNfQVNSQ18yKSAmCisJCVJUNTY2M19EQV9TVE8xX1RSQUNLX01BU0spID8gMSA6IDA7CisJc3dpdGNoIChydDU2NjMtPmNvZGVjX3R5cGUpIHsKKwljYXNlIENPREVDX1RZUEVfUlQ1NjY4OgorCQlhZF9hc3JjX2VuID0gKHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjY4X0FTUkNfMykgJgorCQkJUlQ1NjY4X0FEX1NUTzFfVFJBQ0tfTUFTSykgPyAxIDogMDsKKwkJYnJlYWs7CisJY2FzZSBDT0RFQ19UWVBFX1JUNTY2MzoKKwkJYWRfYXNyY19lbiA9IChzbmRfc29jX3JlYWQoY29kZWMsIFJUNTY2M19BU1JDXzIpICYKKwkJCVJUNTY2M19BRF9TVE8xX1RSQUNLX01BU0spID8gMSA6IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVua25vd24gQ09ERUNfVFlQRVxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChkYV9hc3JjX2VuIHx8IGFkX2FzcmNfZW4pCisJCWlmIChydDU2NjMtPnN5c2NsayA+IHJ0NTY2My0+bHJjayAqIDM4NCkKKwkJCXJldHVybiAxOworCisJZGV2X2Vycihjb2RlYy0+ZGV2LCAic3lzY2xrIDwgMzg0IHggZnMsIGRpc2FibGUgaTJzIGFzcmNcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcnQ1NjYzX3NlbF9hc3JjX2Nsa19zcmMgLSBzZWxlY3QgQVNSQyBjbG9jayBzb3VyY2UgZm9yIGEgc2V0IG9mIGZpbHRlcnMKKyAqIEBjb2RlYzogU29DIGF1ZGlvIGNvZGVjIGRldmljZS4KKyAqIEBmaWx0ZXJfbWFzazogbWFzayBvZiBmaWx0ZXJzLgorICogQGNsa19zcmM6IGNsb2NrIHNvdXJjZQorICoKKyAqIFRoZSBBU1JDIGZ1bmN0aW9uIGlzIGZvciBhc3luY2hyb25vdXMgTUNMSyBhbmQgTFJDSy4gQWxzbywgc2luY2UgUlQ1NjY4IGNhbgorICogb25seSBzdXBwb3J0IHN0YW5kYXJkIDMyZnMgb3IgNjRmcyBpMnMgZm9ybWF0LCBBU1JDIHNob3VsZCBiZSBlbmFibGVkIHRvCisgKiBzdXBwb3J0IHNwZWNpYWwgaTJzIGNsb2NrIGZvcm1hdCBzdWNoIGFzIEludGVsJ3MgMTAwZnMoMTAwICogc2FtcGxpbmcgcmF0ZSkuCisgKiBBU1JDIGZ1bmN0aW9uIHdpbGwgdHJhY2sgaTJzIGNsb2NrIGFuZCBnZW5lcmF0ZSBhIGNvcnJlc3BvbmRpbmcgc3lzdGVtIGNsb2NrCisgKiBmb3IgY29kZWMuIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYW4gQVBJIHRvIHNlbGVjdCB0aGUgY2xvY2sgc291cmNlIGZvciBhCisgKiBzZXQgb2YgZmlsdGVycyBzcGVjaWZpZWQgYnkgdGhlIG1hc2suIEFuZCB0aGUgY29kZWMgZHJpdmVyIHdpbGwgdHVybiBvbiBBU1JDCisgKiBmb3IgdGhlc2UgZmlsdGVycyBpZiBBU1JDIGlzIHNlbGVjdGVkIGFzIHRoZWlyIGNsb2NrIHNvdXJjZS4KKyAqLworaW50IHJ0NTY2M19zZWxfYXNyY19jbGtfc3JjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJdW5zaWduZWQgaW50IGZpbHRlcl9tYXNrLCB1bnNpZ25lZCBpbnQgY2xrX3NyYykKK3sKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2OCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCBhc3JjMl9tYXNrID0gMDsKKwl1bnNpZ25lZCBpbnQgYXNyYzJfdmFsdWUgPSAwOworCXVuc2lnbmVkIGludCBhc3JjM19tYXNrID0gMDsKKwl1bnNpZ25lZCBpbnQgYXNyYzNfdmFsdWUgPSAwOworCisJc3dpdGNoIChjbGtfc3JjKSB7CisJY2FzZSBSVDU2NjNfQ0xLX1NFTF9TWVM6CisJY2FzZSBSVDU2NjNfQ0xLX1NFTF9JMlMxX0FTUkM6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZpbHRlcl9tYXNrICYgUlQ1NjYzX0RBX1NURVJFT19GSUxURVIpIHsKKwkJYXNyYzJfbWFzayB8PSBSVDU2NjhfREFfU1RPMV9UUkFDS19NQVNLOworCQlhc3JjMl92YWx1ZSB8PSBjbGtfc3JjIDw8IFJUNTY2OF9EQV9TVE8xX1RSQUNLX1NISUZUOworCX0KKworCWlmIChmaWx0ZXJfbWFzayAmIFJUNTY2M19BRF9TVEVSRU9fRklMVEVSKSB7CisJCXN3aXRjaCAocnQ1NjY4LT5jb2RlY190eXBlKSB7CisJCWNhc2UgQ09ERUNfVFlQRV9SVDU2Njg6CisJCQlhc3JjM19tYXNrIHw9IFJUNTY2OF9BRF9TVE8xX1RSQUNLX01BU0s7CisJCQlhc3JjM192YWx1ZSB8PSBjbGtfc3JjIDw8IFJUNTY2OF9BRF9TVE8xX1RSQUNLX1NISUZUOworCQkJYnJlYWs7CisJCWNhc2UgQ09ERUNfVFlQRV9SVDU2NjM6CisJCQlhc3JjMl9tYXNrIHw9IFJUNTY2M19BRF9TVE8xX1RSQUNLX01BU0s7CisJCQlhc3JjMl92YWx1ZSB8PSBjbGtfc3JjIDw8IFJUNTY2M19BRF9TVE8xX1RSQUNLX1NISUZUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIENPREVDX1RZUEVcbiIpOworCQl9CisJfQorCisJaWYgKGFzcmMyX21hc2spCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19BU1JDXzIsIGFzcmMyX21hc2ssCisJCQlhc3JjMl92YWx1ZSk7CisKKwlpZiAoYXNyYzNfbWFzaykKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjY4X0FTUkNfMywgYXNyYzNfbWFzaywKKwkJCWFzcmMzX3ZhbHVlKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocnQ1NjYzX3NlbF9hc3JjX2Nsa19zcmMpOworCisvKiBBbmFsb2cgTWl4ZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjhfcmVjbWl4MWxbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkJTVDIgU3dpdGNoIiwgUlQ1NjY4X1JFQ01JWDFMLAorCQlSVDU2NjhfUkVDTUlYMUxfQlNUMl9TSElGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJCU1QxIENCSiBTd2l0Y2giLCBSVDU2NjhfUkVDTUlYMUwsCisJCVJUNTY2OF9SRUNNSVgxTF9CU1QxX0NCSl9TSElGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjY4X3JlY21peDFyW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJCU1QyIFN3aXRjaCIsIFJUNTY2OF9SRUNNSVgxUiwKKwkJUlQ1NjY4X1JFQ01JWDFSX0JTVDJfU0hJRlQsIDEsIDEpLAorfTsKKworLyogRGlnaXRhbCBNaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2M19zdG8xX2FkY19sX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiQURDMSBTd2l0Y2giLCBSVDU2NjNfU1RPMV9BRENfTUlYRVIsCisJCQlSVDU2NjhfTV9TVE8xX0FEQ19MMV9TSElGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJBREMyIFN3aXRjaCIsIFJUNTY2M19TVE8xX0FEQ19NSVhFUiwKKwkJCVJUNTY2OF9NX1NUTzFfQURDX0wyX1NISUZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2Njhfc3RvMV9hZGNfcl9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkFEQzEgU3dpdGNoIiwgUlQ1NjYzX1NUTzFfQURDX01JWEVSLAorCQkJUlQ1NjY4X01fU1RPMV9BRENfUjFfU0hJRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQURDMiBTd2l0Y2giLCBSVDU2NjNfU1RPMV9BRENfTUlYRVIsCisJCQlSVDU2NjhfTV9TVE8xX0FEQ19SMl9TSElGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYzX2FkZGFfbF9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkFEQyBMIFN3aXRjaCIsIFJUNTY2M19BRF9EQV9NSVhFUiwKKwkJCVJUNTY2OF9NX0FEQ01JWF9MX1NISUZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkRBQyBMIFN3aXRjaCIsIFJUNTY2M19BRF9EQV9NSVhFUiwKKwkJCVJUNTY2OF9NX0RBQzFfTF9TSElGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYzX2FkZGFfcl9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkFEQyBSIFN3aXRjaCIsIFJUNTY2M19BRF9EQV9NSVhFUiwKKwkJCVJUNTY2OF9NX0FEQ01JWF9SX1NISUZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkRBQyBSIFN3aXRjaCIsIFJUNTY2M19BRF9EQV9NSVhFUiwKKwkJCVJUNTY2OF9NX0RBQzFfUl9TSElGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYzX3N0bzFfZGFjX2xfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJEQUMgTCBTd2l0Y2giLCBSVDU2NjNfU1RPX0RBQ19NSVhFUiwKKwkJCVJUNTY2OF9NX0RBQ19MMV9TVE9fTF9TSElGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUMgUiBTd2l0Y2giLCBSVDU2NjNfU1RPX0RBQ19NSVhFUiwKKwkJCVJUNTY2OF9NX0RBQ19SMV9TVE9fTF9TSElGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYzX3N0bzFfZGFjX3JfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJEQUMgTCBTd2l0Y2giLCBSVDU2NjNfU1RPX0RBQ19NSVhFUiwKKwkJCVJUNTY2OF9NX0RBQ19MMV9TVE9fUl9TSElGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUMgUiBTd2l0Y2giLCBSVDU2NjNfU1RPX0RBQ19NSVhFUiwKKwkJCVJUNTY2OF9NX0RBQ19SMV9TVE9fUl9TSElGVCwgMSwgMSksCit9OworCisvKiBPdXQgU3dpdGNoICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjY4X2hwb19zd2l0Y2ggPQorCVNPQ19EQVBNX1NJTkdMRV9BVVRPRElTQUJMRSgiU3dpdGNoIiwgUlQ1NjY4X0hQX0FNUF8yLAorCQlSVDU2NjhfRU5fREFDX0hQT19TSElGVCwgMSwgMCk7CisKKy8qIFN0ZXJlbyBBREMgc291cmNlICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ0NTY2OF9zdG8xX2FkY19zcmNbXSA9IHsKKwkiQURDIEwiLCAiQURDIFIiCit9OworCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjY4X3N0bzFfYWRjbF9lbnVtLCBSVDU2NjNfU1RPMV9BRENfTUlYRVIsCisJUlQ1NjY4X1NUTzFfQURDX0xfU1JDX1NISUZULCBydDU2Njhfc3RvMV9hZGNfc3JjKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2OF9zdG8xX2FkY2xfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJTVE8xIEFEQyBMIE11eCIsIHJ0NTY2OF9zdG8xX2FkY2xfZW51bSk7CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2Njhfc3RvMV9hZGNyX2VudW0sIFJUNTY2M19TVE8xX0FEQ19NSVhFUiwKKwlSVDU2NjhfU1RPMV9BRENfUl9TUkNfU0hJRlQsIHJ0NTY2OF9zdG8xX2FkY19zcmMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjY4X3N0bzFfYWRjcl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlNUTzEgQURDIFIgTXV4IiwgcnQ1NjY4X3N0bzFfYWRjcl9lbnVtKTsKKworLyogUlQ1NjYzOiBBbmFsb2cgREFDTDEgaW5wdXQgc291cmNlICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ0NTY2M19hbGdfZGFjbF9zcmNbXSA9IHsKKwkiREFDIEwiLCAiU1RPIERBQyBNSVhMIgorfTsKKworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY2M19hbGdfZGFjbF9lbnVtLCBSVDU2NjNfQllQQVNTX1NUT19EQUMsCisJUlQ1NjYzX0RBQ0wxX1NSQ19TSElGVCwgcnQ1NjYzX2FsZ19kYWNsX3NyYyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjNfYWxnX2RhY2xfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJEQUMgTCBNdXgiLCBydDU2NjNfYWxnX2RhY2xfZW51bSk7CisKKy8qIFJUNTY2MzogQW5hbG9nIERBQ1IxIGlucHV0IHNvdXJjZSAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBydDU2NjNfYWxnX2RhY3Jfc3JjW10gPSB7CisJIkRBQyBSIiwgIlNUTyBEQUMgTUlYUiIKK307CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NjNfYWxnX2RhY3JfZW51bSwgUlQ1NjYzX0JZUEFTU19TVE9fREFDLAorCVJUNTY2M19EQUNSMV9TUkNfU0hJRlQsIHJ0NTY2M19hbGdfZGFjcl9zcmMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYzX2FsZ19kYWNyX211eCA9CisJU09DX0RBUE1fRU5VTSgiREFDIFIgTXV4IiwgcnQ1NjYzX2FsZ19kYWNyX2VudW0pOworCitzdGF0aWMgaW50IHJ0NTY2M19ocF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlpZiAocnQ1NjYzLT5jb2RlY190eXBlID09IENPREVDX1RZUEVfUlQ1NjY4KSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSFBfQ0hBUkdFX1BVTVBfMSwKKwkJCQlSVDU2NjhfU0VMX1BNX0hQX1NISUZULCBSVDU2NjhfU0VMX1BNX0hQX0hJR0gpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0hQX0xPR0lDXzIsCisJCQkJUlQ1NjY4X0hQX1NJR19TUkMxX01BU0ssCisJCQkJUlQ1NjY4X0hQX1NJR19TUkMxX1NJTEVOQ0UpOworCQl9IGVsc2UgeworCQkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjYzX0RFUE9QXzIsIDB4MzAwMyk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfREVQT1BfMSwgMHgwMDBiLAorCQkJCTB4MDAwYik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfREVQT1BfMSwgMHgwMDMwLAorCQkJCTB4MDAzMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSFBfQ0hBUkdFX1BVTVBfMSwKKwkJCQlSVDU2NjhfT1ZDRF9IUF9NQVNLLCBSVDU2NjhfT1ZDRF9IUF9ESVMpOworCQkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjYzX0hQX0NIQVJHRV9QVU1QXzIsIDB4MTM3MSk7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjNfSFBfQklBUywgMHhhYmJhKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2M19DSEFSR0VfUFVNUF8xLCAweDIyMjQpOworCQkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjYzX0FOQV9CSUFTX0NVUl8xLCAweDc3NjYpOworCQkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjYzX0hQX0JJQVMsIDB4YWZhYSk7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjNfQ0hBUkdFX1BVTVBfMiwgMHg3Nzc3KTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19ERVBPUF8xLCAweDMwMDAsCisJCQkJMHgzMDAwKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCWlmIChydDU2NjMtPmNvZGVjX3R5cGUgPT0gQ09ERUNfVFlQRV9SVDU2NjgpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19IUF9MT0dJQ18yLAorCQkJCVJUNTY2OF9IUF9TSUdfU1JDMV9NQVNLLAorCQkJCVJUNTY2OF9IUF9TSUdfU1JDMV9SRUcpOworCQl9IGVsc2UgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0RFUE9QXzEsIDB4MzAwMCwgMHgwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19IUF9DSEFSR0VfUFVNUF8xLAorCQkJCVJUNTY2OF9PVkNEX0hQX01BU0ssIFJUNTY2OF9PVkNEX0hQX0VOKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19ERVBPUF8xLCAweDAwMzAsIDB4MCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfREVQT1BfMSwgMHgwMDBiLAorCQkJCTB4MDAwYik7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjhfYnN0Ml9wb3dlcihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX1BXUl9BTkxHXzIsCisJCQlSVDU2NjhfUFdSX0JTVDJfTUFTSyB8IFJUNTY2OF9QV1JfQlNUMl9PUF9NQVNLLAorCQkJUlQ1NjY4X1BXUl9CU1QyIHwgUlQ1NjY4X1BXUl9CU1QyX09QKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfUFdSX0FOTEdfMiwKKwkJCVJUNTY2OF9QV1JfQlNUMl9NQVNLIHwgUlQ1NjY4X1BXUl9CU1QyX09QX01BU0ssIDApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2M19wcmVfZGl2X3Bvd2VyKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjNfUFJFX0RJVl9HQVRJTkdfMSwgMHhmZjAwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjYzX1BSRV9ESVZfR0FUSU5HXzIsIDB4ZmZmYyk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKKwkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjYzX1BSRV9ESVZfR0FUSU5HXzEsIDB4MDAwMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2M19QUkVfRElWX0dBVElOR18yLCAweDAwMDApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgcnQ1NjYzX2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9TVVBQTFkoIlBMTCIsIFJUNTY2M19QV1JfQU5MR18zLCBSVDU2NjhfUFdSX1BMTF9TSElGVCwgMCwKKwkJTlVMTCwgMCksCisKKwkvKiBtaWNiaWFzICovCisJU05EX1NPQ19EQVBNX01JQ0JJQVMoIk1JQ0JJQVMxIiwgUlQ1NjYzX1BXUl9BTkxHXzIsCisJCVJUNTY2OF9QV1JfTUIxX1NISUZULCAwKSwKKwlTTkRfU09DX0RBUE1fTUlDQklBUygiTUlDQklBUzIiLCBSVDU2NjNfUFdSX0FOTEdfMiwKKwkJUlQ1NjY4X1BXUl9NQjJfU0hJRlQsIDApLAorCisJLyogSW5wdXQgTGluZXMgKi8KKwlTTkRfU09DX0RBUE1fSU5QVVQoIklOMVAiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIklOMU4iKSwKKworCS8qIFJFQyBNaXhlciBQb3dlciAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIlJFQ01JWDFMIFBvd2VyIiwgUlQ1NjYzX1BXUl9BTkxHXzIsCisJCVJUNTY2OF9QV1JfUkVDTUlYMV9TSElGVCwgMCwgTlVMTCwgMCksCisKKwkvKiBBRENzICovCisJU05EX1NPQ19EQVBNX0FEQygiQURDIEwiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkFEQyBMIFBvd2VyIiwgUlQ1NjYzX1BXUl9ESUdfMSwKKwkJUlQ1NjY4X1BXUl9BRENfTDFfU0hJRlQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkFEQyBDbG9jayIsIFJUNTY2M19DSE9QX0FEQywKKwkJUlQ1NjY4X0NLR0VOX0FEQ0NfU0hJRlQsIDAsIE5VTEwsIDApLAorCisJLyogQURDIE1peGVyICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJTVE8xIEFEQyBNSVhMIiwgU05EX1NPQ19OT1BNLAorCQkwLCAwLCBydDU2NjNfc3RvMV9hZGNfbF9taXgsCisJCUFSUkFZX1NJWkUocnQ1NjYzX3N0bzFfYWRjX2xfbWl4KSksCisKKwkvKiBBREMgRmlsdGVyIFBvd2VyICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiU1RPMSBBREMgRmlsdGVyIiwgUlQ1NjYzX1BXUl9ESUdfMiwKKwkJUlQ1NjY4X1BXUl9BRENfUzFGX1NISUZULCAwLCBOVUxMLCAwKSwKKworCS8qIERpZ2l0YWwgSW50ZXJmYWNlICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiSTJTIiwgUlQ1NjYzX1BXUl9ESUdfMSwgUlQ1NjY4X1BXUl9JMlMxX1NISUZULCAwLAorCQlOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJJRiBEQUMiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIklGMSBEQUMxIEwiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIklGMSBEQUMxIFIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIklGMSBBREMxIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJJRiBBREMiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCisJLyogQXVkaW8gSW50ZXJmYWNlICovCisJU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGUlgiLCAiQUlGIFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGVFgiLCAiQUlGIENhcHR1cmUiLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAorCisJLyogREFDIG1peGVyIGJlZm9yZSBzb3VuZCBlZmZlY3QgICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJBRERBIE1JWEwiLCBTTkRfU09DX05PUE0sIDAsIDAsIHJ0NTY2M19hZGRhX2xfbWl4LAorCQlBUlJBWV9TSVpFKHJ0NTY2M19hZGRhX2xfbWl4KSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJBRERBIE1JWFIiLCBTTkRfU09DX05PUE0sIDAsIDAsIHJ0NTY2M19hZGRhX3JfbWl4LAorCQlBUlJBWV9TSVpFKHJ0NTY2M19hZGRhX3JfbWl4KSksCisJU05EX1NPQ19EQVBNX1BHQSgiREFDIEwxIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJEQUMgUjEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCisJLyogREFDIE1peGVyICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiU1RPMSBEQUMgRmlsdGVyIiwgUlQ1NjYzX1BXUl9ESUdfMiwKKwkJUlQ1NjY4X1BXUl9EQUNfUzFGX1NISUZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNUTzEgREFDIE1JWEwiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXJ0NTY2M19zdG8xX2RhY19sX21peCwgQVJSQVlfU0laRShydDU2NjNfc3RvMV9kYWNfbF9taXgpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNUTzEgREFDIE1JWFIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXJ0NTY2M19zdG8xX2RhY19yX21peCwgQVJSQVlfU0laRShydDU2NjNfc3RvMV9kYWNfcl9taXgpKSwKKworCS8qIERBQ3MgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJTVE8xIERBQyBMIFBvd2VyIiwgUlQ1NjYzX1BXUl9ESUdfMSwKKwkJUlQ1NjY4X1BXUl9EQUNfTDFfU0hJRlQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlNUTzEgREFDIFIgUG93ZXIiLCBSVDU2NjNfUFdSX0RJR18xLAorCQlSVDU2NjhfUFdSX0RBQ19SMV9TSElGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX0RBQygiREFDIEwiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9EQUMoIkRBQyBSIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKworCS8qIEhlYWRwaG9uZSovCisJU05EX1NPQ19EQVBNX1BHQV9TKCJIUCBBbXAiLCAxLCBTTkRfU09DX05PUE0sIDAsIDAsIHJ0NTY2M19ocF9ldmVudCwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorCisJLyogT3V0cHV0IExpbmVzICovCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBPTCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkhQT1IiKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBydDU2Njhfc3BlY2lmaWNfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX1NVUFBMWSgiTERPMiIsIFJUNTY2M19QV1JfQU5MR18zLAorCQlSVDU2NjhfUFdSX0xETzJfU0hJRlQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIk1pYyBEZXQgUG93ZXIiLCBSVDU2NjhfUFdSX1ZPTCwKKwkJUlQ1NjY4X1BXUl9NSUNfREVUX1NISUZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJMRE8gREFDIiwgUlQ1NjYzX1BXUl9ESUdfMSwKKwkJUlQ1NjY4X1BXUl9MRE9fREFDUkVGX1NISUZULCAwLCBOVUxMLCAwKSwKKworCS8qIEFTUkMgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJJMlMgQVNSQyIsIFJUNTY2M19BU1JDXzEsCisJCVJUNTY2OF9JMlMxX0FTUkNfU0hJRlQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkRBQyBBU1JDIiwgUlQ1NjYzX0FTUkNfMSwKKwkJUlQ1NjY4X0RBQ19TVE8xX0FTUkNfU0hJRlQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkFEQyBBU1JDIiwgUlQ1NjYzX0FTUkNfMSwKKwkJUlQ1NjY4X0FEQ19TVE8xX0FTUkNfU0hJRlQsIDAsIE5VTEwsIDApLAorCisJLyogSW5wdXQgTGluZXMgKi8KKwlTTkRfU09DX0RBUE1fSU5QVVQoIklOMlAiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIklOMk4iKSwKKworCS8qIEJvb3N0ICovCisJU05EX1NPQ19EQVBNX1BHQSgiQlNUMSBDQkoiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkNCSiBQb3dlciIsIFJUNTY2M19QV1JfQU5MR18zLAorCQlSVDU2NjhfUFdSX0NCSl9TSElGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiQlNUMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiQlNUMiBQb3dlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJcnQ1NjY4X2JzdDJfcG93ZXIsIFNORF9TT0NfREFQTV9QUkVfUE1EIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKworCS8qIFJFQyBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiUkVDTUlYMUwiLCBTTkRfU09DX05PUE0sIDAsIDAsIHJ0NTY2OF9yZWNtaXgxbCwKKwkJQVJSQVlfU0laRShydDU2NjhfcmVjbWl4MWwpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJFQ01JWDFSIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBydDU2NjhfcmVjbWl4MXIsCisJCUFSUkFZX1NJWkUocnQ1NjY4X3JlY21peDFyKSksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUkVDTUlYMVIgUG93ZXIiLCBSVDU2NjNfUFdSX0FOTEdfMiwKKwkJUlQ1NjY4X1BXUl9SRUNNSVgyX1NISUZULCAwLCBOVUxMLCAwKSwKKworCS8qIEFEQyAqLworCVNORF9TT0NfREFQTV9BREMoIkFEQyBSIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJBREMgUiBQb3dlciIsIFJUNTY2M19QV1JfRElHXzEsCisJCVJUNTY2OF9QV1JfQURDX1IxX1NISUZULCAwLCBOVUxMLCAwKSwKKworCS8qIEFEQyBNdXggKi8KKwlTTkRfU09DX0RBUE1fUEdBKCJTVE8xIEFEQyBMMSIsIFJUNTY2M19TVE8xX0FEQ19NSVhFUiwKKwkJUlQ1NjY4X1NUTzFfQURDX0wxX1NSQ19TSElGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiU1RPMSBBREMgUjEiLCBSVDU2NjNfU1RPMV9BRENfTUlYRVIsCisJCVJUNTY2OF9TVE8xX0FEQ19SMV9TUkNfU0hJRlQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIlNUTzEgQURDIEwyIiwgUlQ1NjYzX1NUTzFfQURDX01JWEVSLAorCQlSVDU2NjhfU1RPMV9BRENfTDJfU1JDX1NISUZULCAxLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJTVE8xIEFEQyBSMiIsIFJUNTY2M19TVE8xX0FEQ19NSVhFUiwKKwkJUlQ1NjY4X1NUTzFfQURDX1IyX1NSQ19TSElGVCwgMSwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJTVE8xIEFEQyBMIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ0NTY2OF9zdG8xX2FkY2xfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJTVE8xIEFEQyBSIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ0NTY2OF9zdG8xX2FkY3JfbXV4KSwKKworCS8qIEFEQyBNaXggKi8KKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNUTzEgQURDIE1JWFIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXJ0NTY2OF9zdG8xX2FkY19yX21peCwgQVJSQVlfU0laRShydDU2Njhfc3RvMV9hZGNfcl9taXgpKSwKKworCS8qIEFuYWxvZyBEQUMgQ2xvY2sgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJEQUMgQ2xvY2siLCBSVDU2NjNfQ0hPUF9EQUNfTCwKKwkJUlQ1NjY4X0NLR0VOX0RBQzFfU0hJRlQsIDAsIE5VTEwsIDApLAorCisJLyogSGVhZHBob25lIG91dCAqLworCVNORF9TT0NfREFQTV9TV0lUQ0goIkhQTyBQbGF5YmFjayIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ0NTY2OF9ocG9fc3dpdGNoKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBydDU2NjNfc3BlY2lmaWNfZGFwbV93aWRnZXRzW10gPSB7CisJLyogU3lzdGVtIENsb2NrIFByZSBEaXZpZGVyIEdhdGluZyAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIlByZSBEaXYgUG93ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXJ0NTY2M19wcmVfZGl2X3Bvd2VyLCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCksCisKKwkvKiBMRE8gKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJMRE8gQURDIiwgUlQ1NjYzX1BXUl9ESUdfMSwKKwkJUlQ1NjY4X1BXUl9MRE9fREFDUkVGX1NISUZULCAwLCBOVUxMLCAwKSwKKworCS8qIEFTUkMgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJJMlMgQVNSQyIsIFJUNTY2M19BU1JDXzEsCisJCVJUNTY2M19JMlMxX0FTUkNfU0hJRlQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkRBQyBBU1JDIiwgUlQ1NjYzX0FTUkNfMSwKKwkJUlQ1NjYzX0RBQ19TVE8xX0FTUkNfU0hJRlQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkFEQyBBU1JDIiwgUlQ1NjYzX0FTUkNfMSwKKwkJUlQ1NjYzX0FEQ19TVE8xX0FTUkNfU0hJRlQsIDAsIE5VTEwsIDApLAorCisJLyogQm9vc3QgKi8KKwlTTkRfU09DX0RBUE1fUEdBKCJCU1QxIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKworCS8qIFNUTyBBREMgKi8KKwlTTkRfU09DX0RBUE1fUEdBKCJTVE8xIEFEQyBMMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiU1RPMSBBREMgTDIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCisJLyogQW5hbG9nIERBQyBzb3VyY2UgKi8KKwlTTkRfU09DX0RBUE1fTVVYKCJEQUMgTCBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZydDU2NjNfYWxnX2RhY2xfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJEQUMgUiBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZydDU2NjNfYWxnX2RhY3JfbXV4KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHJ0NTY2M19kYXBtX3JvdXRlc1tdID0geworCS8qIFBMTCAqLworCXsgIkkyUyIsIE5VTEwsICJQTEwiLCBydDU2NjNfaXNfc3lzX2Nsa19mcm9tX3BsbCB9LAorCisJLyogQVNSQyAqLworCXsgIlNUTzEgQURDIEZpbHRlciIsIE5VTEwsICJBREMgQVNSQyIsIHJ0NTY2M19pc191c2luZ19hc3JjIH0sCisJeyAiU1RPMSBEQUMgRmlsdGVyIiwgTlVMTCwgIkRBQyBBU1JDIiwgcnQ1NjYzX2lzX3VzaW5nX2FzcmMgfSwKKwl7ICJJMlMiLCBOVUxMLCAiSTJTIEFTUkMiLCBydDU2NjNfaTJzX3VzZV9hc3JjIH0sCisKKwl7ICJBREMgTCIsIE5VTEwsICJBREMgTCBQb3dlciIgfSwKKwl7ICJBREMgTCIsIE5VTEwsICJBREMgQ2xvY2siIH0sCisKKwl7ICJTVE8xIEFEQyBMMiIsIE5VTEwsICJTVE8xIERBQyBNSVhMIiB9LAorCisJeyAiU1RPMSBBREMgTUlYTCIsICJBREMxIFN3aXRjaCIsICJTVE8xIEFEQyBMMSIgfSwKKwl7ICJTVE8xIEFEQyBNSVhMIiwgIkFEQzIgU3dpdGNoIiwgIlNUTzEgQURDIEwyIiB9LAorCXsgIlNUTzEgQURDIE1JWEwiLCBOVUxMLCAiU1RPMSBBREMgRmlsdGVyIiB9LAorCisJeyAiSUYxIEFEQzEiLCBOVUxMLCAiU1RPMSBBREMgTUlYTCIgfSwKKwl7ICJJRiBBREMiLCBOVUxMLCAiSUYxIEFEQzEiIH0sCisJeyAiQUlGVFgiLCBOVUxMLCAiSUYgQURDIiB9LAorCXsgIkFJRlRYIiwgTlVMTCwgIkkyUyIgfSwKKworCXsgIkFJRlJYIiwgTlVMTCwgIkkyUyIgfSwKKwl7ICJJRiBEQUMiLCBOVUxMLCAiQUlGUlgiIH0sCisJeyAiSUYxIERBQzEgTCIsIE5VTEwsICJJRiBEQUMiIH0sCisJeyAiSUYxIERBQzEgUiIsIE5VTEwsICJJRiBEQUMiIH0sCisKKwl7ICJBRERBIE1JWEwiLCAiQURDIEwgU3dpdGNoIiwgIlNUTzEgQURDIE1JWEwiIH0sCisJeyAiQUREQSBNSVhMIiwgIkRBQyBMIFN3aXRjaCIsICJJRjEgREFDMSBMIiB9LAorCXsgIkFEREEgTUlYTCIsIE5VTEwsICJTVE8xIERBQyBGaWx0ZXIiIH0sCisJeyAiQUREQSBNSVhMIiwgTlVMTCwgIlNUTzEgREFDIEwgUG93ZXIiIH0sCisJeyAiQUREQSBNSVhSIiwgIkRBQyBSIFN3aXRjaCIsICJJRjEgREFDMSBSIiB9LAorCXsgIkFEREEgTUlYUiIsIE5VTEwsICJTVE8xIERBQyBGaWx0ZXIiIH0sCisJeyAiQUREQSBNSVhSIiwgTlVMTCwgIlNUTzEgREFDIFIgUG93ZXIiIH0sCisKKwl7ICJEQUMgTDEiLCBOVUxMLCAiQUREQSBNSVhMIiB9LAorCXsgIkRBQyBSMSIsIE5VTEwsICJBRERBIE1JWFIiIH0sCisKKwl7ICJTVE8xIERBQyBNSVhMIiwgIkRBQyBMIFN3aXRjaCIsICJEQUMgTDEiIH0sCisJeyAiU1RPMSBEQUMgTUlYTCIsICJEQUMgUiBTd2l0Y2giLCAiREFDIFIxIiB9LAorCXsgIlNUTzEgREFDIE1JWEwiLCBOVUxMLCAiU1RPMSBEQUMgTCBQb3dlciIgfSwKKwl7ICJTVE8xIERBQyBNSVhMIiwgTlVMTCwgIlNUTzEgREFDIEZpbHRlciIgfSwKKwl7ICJTVE8xIERBQyBNSVhSIiwgIkRBQyBSIFN3aXRjaCIsICJEQUMgUjEiIH0sCisJeyAiU1RPMSBEQUMgTUlYUiIsICJEQUMgTCBTd2l0Y2giLCAiREFDIEwxIiB9LAorCXsgIlNUTzEgREFDIE1JWFIiLCBOVUxMLCAiU1RPMSBEQUMgUiBQb3dlciIgfSwKKwl7ICJTVE8xIERBQyBNSVhSIiwgTlVMTCwgIlNUTzEgREFDIEZpbHRlciIgfSwKKworCXsgIkhQIEFtcCIsIE5VTEwsICJEQUMgTCIgfSwKKwl7ICJIUCBBbXAiLCBOVUxMLCAiREFDIFIiIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBydDU2Njhfc3BlY2lmaWNfZGFwbV9yb3V0ZXNbXSA9IHsKKwl7ICJNSUNCSUFTMSIsIE5VTEwsICJMRE8yIiB9LAorCXsgIk1JQ0JJQVMyIiwgTlVMTCwgIkxETzIiIH0sCisKKwl7ICJCU1QxIENCSiIsIE5VTEwsICJJTjFQIiB9LAorCXsgIkJTVDEgQ0JKIiwgTlVMTCwgIklOMU4iIH0sCisJeyAiQlNUMSBDQkoiLCBOVUxMLCAiQ0JKIFBvd2VyIiB9LAorCisJeyAiQlNUMiIsIE5VTEwsICJJTjJQIiB9LAorCXsgIkJTVDIiLCBOVUxMLCAiSU4yTiIgfSwKKwl7ICJCU1QyIiwgTlVMTCwgIkJTVDIgUG93ZXIiIH0sCisKKwl7ICJSRUNNSVgxTCIsICJCU1QyIFN3aXRjaCIsICJCU1QyIiB9LAorCXsgIlJFQ01JWDFMIiwgIkJTVDEgQ0JKIFN3aXRjaCIsICJCU1QxIENCSiIgfSwKKwl7ICJSRUNNSVgxTCIsIE5VTEwsICJSRUNNSVgxTCBQb3dlciIgfSwKKwl7ICJSRUNNSVgxUiIsICJCU1QyIFN3aXRjaCIsICJCU1QyIiB9LAorCXsgIlJFQ01JWDFSIiwgTlVMTCwgIlJFQ01JWDFSIFBvd2VyIiB9LAorCisJeyAiQURDIEwiLCBOVUxMLCAiUkVDTUlYMUwiIH0sCisJeyAiQURDIFIiLCBOVUxMLCAiUkVDTUlYMVIiIH0sCisJeyAiQURDIFIiLCBOVUxMLCAiQURDIFIgUG93ZXIiIH0sCisJeyAiQURDIFIiLCBOVUxMLCAiQURDIENsb2NrIiB9LAorCisJeyAiU1RPMSBBREMgTCBNdXgiLCAiQURDIEwiLCAiQURDIEwiIH0sCisJeyAiU1RPMSBBREMgTCBNdXgiLCAiQURDIFIiLCAiQURDIFIiIH0sCisJeyAiU1RPMSBBREMgTDEiLCBOVUxMLCAiU1RPMSBBREMgTCBNdXgiIH0sCisKKwl7ICJTVE8xIEFEQyBSIE11eCIsICJBREMgTCIsICJBREMgTCIgfSwKKwl7ICJTVE8xIEFEQyBSIE11eCIsICJBREMgUiIsICJBREMgUiIgfSwKKwl7ICJTVE8xIEFEQyBSMSIsIE5VTEwsICJTVE8xIEFEQyBSIE11eCIgfSwKKwl7ICJTVE8xIEFEQyBSMiIsIE5VTEwsICJTVE8xIERBQyBNSVhSIiB9LAorCisJeyAiU1RPMSBBREMgTUlYUiIsICJBREMxIFN3aXRjaCIsICJTVE8xIEFEQyBSMSIgfSwKKwl7ICJTVE8xIEFEQyBNSVhSIiwgIkFEQzIgU3dpdGNoIiwgIlNUTzEgQURDIFIyIiB9LAorCXsgIlNUTzEgQURDIE1JWFIiLCBOVUxMLCAiU1RPMSBBREMgRmlsdGVyIiB9LAorCisJeyAiSUYxIEFEQzEiLCBOVUxMLCAiU1RPMSBBREMgTUlYUiIgfSwKKworCXsgIkFEREEgTUlYUiIsICJBREMgUiBTd2l0Y2giLCAiU1RPMSBBREMgTUlYUiIgfSwKKworCXsgIkRBQyBMIiwgTlVMTCwgIlNUTzEgREFDIE1JWEwiIH0sCisJeyAiREFDIEwiLCBOVUxMLCAiTERPIERBQyIgfSwKKwl7ICJEQUMgTCIsIE5VTEwsICJEQUMgQ2xvY2siIH0sCisJeyAiREFDIFIiLCBOVUxMLCAiU1RPMSBEQUMgTUlYUiIgfSwKKwl7ICJEQUMgUiIsIE5VTEwsICJMRE8gREFDIiB9LAorCXsgIkRBQyBSIiwgTlVMTCwgIkRBQyBDbG9jayIgfSwKKworCXsgIkhQTyBQbGF5YmFjayIsICJTd2l0Y2giLCAiSFAgQW1wIiB9LAorCXsgIkhQT0wiLCBOVUxMLCAiSFBPIFBsYXliYWNrIiB9LAorCXsgIkhQT1IiLCBOVUxMLCAiSFBPIFBsYXliYWNrIiB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgcnQ1NjYzX3NwZWNpZmljX2RhcG1fcm91dGVzW10gPSB7CisJeyAiSTJTIiwgTlVMTCwgIlByZSBEaXYgUG93ZXIiIH0sCisKKwl7ICJCU1QxIiwgTlVMTCwgIklOMVAiIH0sCisJeyAiQlNUMSIsIE5VTEwsICJJTjFOIiB9LAorCXsgIkJTVDEiLCBOVUxMLCAiUkVDTUlYMUwgUG93ZXIiIH0sCisKKwl7ICJBREMgTCIsIE5VTEwsICJCU1QxIiB9LAorCisJeyAiU1RPMSBBREMgTDEiLCBOVUxMLCAiQURDIEwiIH0sCisKKwl7ICJEQUMgTCBNdXgiLCAiREFDIEwiLCAgIkRBQyBMMSIgfSwKKwl7ICJEQUMgTCBNdXgiLCAiU1RPIERBQyBNSVhMIiwgIlNUTzEgREFDIE1JWEwiIH0sCisJeyAiREFDIFIgTXV4IiwgIkRBQyBSIiwgICJEQUMgUjEifSwKKwl7ICJEQUMgUiBNdXgiLCAiU1RPIERBQyBNSVhSIiwgIlNUTzEgREFDIE1JWFIiIH0sCisKKwl7ICJEQUMgTCIsIE5VTEwsICJEQUMgTCBNdXgiIH0sCisJeyAiREFDIFIiLCBOVUxMLCAiREFDIFIgTXV4IiB9LAorCisJeyAiSFBPTCIsIE5VTEwsICJIUCBBbXAiIH0sCisJeyAiSFBPUiIsIE5VTEwsICJIUCBBbXAiIH0sCit9OworCitzdGF0aWMgaW50IHJ0NTY2M19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgdmFsX2xlbiA9IDA7CisJaW50IHByZV9kaXY7CisKKwlydDU2NjMtPmxyY2sgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCisJZGV2X2RiZyhkYWktPmRldiwgImJjbGsgaXMgJWRIeiBhbmQgc3lzY2xrIGlzICVkSHpcbiIsCisJCXJ0NTY2My0+bHJjaywgcnQ1NjYzLT5zeXNjbGspOworCisJcHJlX2RpdiA9IHJsNjIzMV9nZXRfY2xrX2luZm8ocnQ1NjYzLT5zeXNjbGssIHJ0NTY2My0+bHJjayk7CisJaWYgKHByZV9kaXYgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVuc3VwcG9ydGVkIGNsb2NrIHNldHRpbmcgJWQgZm9yIERBSSAlZFxuIiwKKwkJCXJ0NTY2My0+bHJjaywgZGFpLT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9kYmcoZGFpLT5kZXYsICJwcmVfZGl2IGlzICVkIGZvciBpaXMgJWRcbiIsIHByZV9kaXYsIGRhaS0+aWQpOworCisJc3dpdGNoIChwYXJhbXNfd2lkdGgocGFyYW1zKSkgeworCWNhc2UgODoKKwkJdmFsX2xlbiA9IFJUNTY2OF9JMlNfRExfODsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJdmFsX2xlbiA9IFJUNTY2OF9JMlNfRExfMTY7CisJCWJyZWFrOworCWNhc2UgMjA6CisJCXZhbF9sZW4gPSBSVDU2NjhfSTJTX0RMXzIwOworCQlicmVhazsKKwljYXNlIDI0OgorCQl2YWxfbGVuID0gUlQ1NjY4X0kyU19ETF8yNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0kyUzFfU0RQLAorCQlSVDU2NjhfSTJTX0RMX01BU0ssIHZhbF9sZW4pOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0FEREFfQ0xLXzEsCisJCVJUNTY2OF9JMlNfUEQxX01BU0ssIHByZV9kaXYgPDwgUlQ1NjY4X0kyU19QRDFfU0hJRlQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYzX3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCB1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJdW5zaWduZWQgaW50IHJlZ192YWwgPSAwOworCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTToKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQlyZWdfdmFsIHw9IFJUNTY2OF9JMlNfTVNfUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCXJlZ192YWwgfD0gUlQ1NjY4X0kyU19CUF9JTlY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCXJlZ192YWwgfD0gUlQ1NjY4X0kyU19ERl9MRUZUOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQlyZWdfdmFsIHw9IFJUNTY2OF9JMlNfREZfUENNX0E7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCXJlZ192YWwgfD0gUlQ1NjY4X0kyU19ERl9QQ01fQjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0kyUzFfU0RQLCBSVDU2NjhfSTJTX01TX01BU0sgfAorCQlSVDU2NjhfSTJTX0JQX01BU0sgfCBSVDU2NjhfSTJTX0RGX01BU0ssIHJlZ192YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYzX3NldF9kYWlfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgY2xrX2lkLAorCXVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgcmVnX3ZhbCA9IDA7CisKKwlpZiAoZnJlcSA9PSBydDU2NjMtPnN5c2NsayAmJiBjbGtfaWQgPT0gcnQ1NjYzLT5zeXNjbGtfc3JjKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoY2xrX2lkKSB7CisJY2FzZSBSVDU2NjNfU0NMS19TX01DTEs6CisJCXJlZ192YWwgfD0gUlQ1NjYzX1NDTEtfU1JDX01DTEs7CisJCWJyZWFrOworCWNhc2UgUlQ1NjYzX1NDTEtfU19QTEwxOgorCQlyZWdfdmFsIHw9IFJUNTY2M19TQ0xLX1NSQ19QTEwxOworCQlicmVhazsKKwljYXNlIFJUNTY2M19TQ0xLX1NfUkNDTEs6CisJCXJlZ192YWwgfD0gUlQ1NjYzX1NDTEtfU1JDX1JDQ0xLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbnZhbGlkIGNsb2NrIGlkICglZClcbiIsIGNsa19pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfR0xCX0NMSywgUlQ1NjY4X1NDTEtfU1JDX01BU0ssCisJCXJlZ192YWwpOworCXJ0NTY2My0+c3lzY2xrID0gZnJlcTsKKwlydDU2NjMtPnN5c2Nsa19zcmMgPSBjbGtfaWQ7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJTeXNjbGsgaXMgJWRIeiBhbmQgY2xvY2sgaWQgaXMgJWRcbiIsCisJCWZyZXEsIGNsa19pZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjNfc2V0X2RhaV9wbGwoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBwbGxfaWQsIGludCBzb3VyY2UsCisJCQl1bnNpZ25lZCBpbnQgZnJlcV9pbiwgdW5zaWduZWQgaW50IGZyZXFfb3V0KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgcmw2MjMxX3BsbF9jb2RlIHBsbF9jb2RlOworCWludCByZXQ7CisJaW50IG1hc2ssIHNoaWZ0LCB2YWw7CisKKwlpZiAoc291cmNlID09IHJ0NTY2My0+cGxsX3NyYyAmJiBmcmVxX2luID09IHJ0NTY2My0+cGxsX2luICYmCisJICAgIGZyZXFfb3V0ID09IHJ0NTY2My0+cGxsX291dCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWZyZXFfaW4gfHwgIWZyZXFfb3V0KSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIlBMTCBkaXNhYmxlZFxuIik7CisKKwkJcnQ1NjYzLT5wbGxfaW4gPSAwOworCQlydDU2NjMtPnBsbF9vdXQgPSAwOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfR0xCX0NMSywKKwkJCVJUNTY2M19TQ0xLX1NSQ19NQVNLLCBSVDU2NjNfU0NMS19TUkNfTUNMSyk7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAocnQ1NjYzLT5jb2RlY190eXBlKSB7CisJY2FzZSBDT0RFQ19UWVBFX1JUNTY2ODoKKwkJbWFzayA9IFJUNTY2OF9QTEwxX1NSQ19NQVNLOworCQlzaGlmdCA9IFJUNTY2OF9QTEwxX1NSQ19TSElGVDsKKwkJYnJlYWs7CisJY2FzZSBDT0RFQ19UWVBFX1JUNTY2MzoKKwkJbWFzayA9IFJUNTY2M19QTEwxX1NSQ19NQVNLOworCQlzaGlmdCA9IFJUNTY2M19QTEwxX1NSQ19TSElGVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5rbm93biBDT0RFQ19UWVBFXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChzb3VyY2UpIHsKKwljYXNlIFJUNTY2M19QTEwxX1NfTUNMSzoKKwkJdmFsID0gMHgwOworCQlicmVhazsKKwljYXNlIFJUNTY2M19QTEwxX1NfQkNMSzE6CisJCXZhbCA9IDB4MTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5rbm93biBQTEwgc291cmNlICVkXG4iLCBzb3VyY2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0dMQl9DTEssIG1hc2ssICh2YWwgPDwgc2hpZnQpKTsKKworCXJldCA9IHJsNjIzMV9wbGxfY2FsYyhmcmVxX2luLCBmcmVxX291dCwgJnBsbF9jb2RlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbnN1cHBvcnQgaW5wdXQgY2xvY2sgJWRcbiIsIGZyZXFfaW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9kYmcoY29kZWMtPmRldiwgImJ5cGFzcz0lZCBtPSVkIG49JWQgaz0lZFxuIiwgcGxsX2NvZGUubV9icCwKKwkJKHBsbF9jb2RlLm1fYnAgPyAwIDogcGxsX2NvZGUubV9jb2RlKSwgcGxsX2NvZGUubl9jb2RlLAorCQlwbGxfY29kZS5rX2NvZGUpOworCisJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjYzX1BMTF8xLAorCQlwbGxfY29kZS5uX2NvZGUgPDwgUlQ1NjY4X1BMTF9OX1NISUZUIHwgcGxsX2NvZGUua19jb2RlKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjNfUExMXzIsCisJCShwbGxfY29kZS5tX2JwID8gMCA6IHBsbF9jb2RlLm1fY29kZSkgPDwgUlQ1NjY4X1BMTF9NX1NISUZUIHwKKwkJcGxsX2NvZGUubV9icCA8PCBSVDU2NjhfUExMX01fQlBfU0hJRlQpOworCisJcnQ1NjYzLT5wbGxfaW4gPSBmcmVxX2luOworCXJ0NTY2My0+cGxsX291dCA9IGZyZXFfb3V0OworCXJ0NTY2My0+cGxsX3NyYyA9IHNvdXJjZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2M19zZXRfdGRtX3Nsb3Qoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIHVuc2lnbmVkIGludCB0eF9tYXNrLAorCXVuc2lnbmVkIGludCByeF9tYXNrLCBpbnQgc2xvdHMsIGludCBzbG90X3dpZHRoKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgdmFsID0gMCwgcmVnOworCisJaWYgKHJ4X21hc2sgfHwgdHhfbWFzaykKKwkJdmFsIHw9IFJUNTY2OF9URE1fTU9ERV9URE07CisKKwlzd2l0Y2ggKHNsb3RzKSB7CisJY2FzZSA0OgorCQl2YWwgfD0gUlQ1NjY4X1RETV9JTl9DSF80OworCQl2YWwgfD0gUlQ1NjY4X1RETV9PVVRfQ0hfNDsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQl2YWwgfD0gUlQ1NjY4X1RETV9JTl9DSF82OworCQl2YWwgfD0gUlQ1NjY4X1RETV9PVVRfQ0hfNjsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQl2YWwgfD0gUlQ1NjY4X1RETV9JTl9DSF84OworCQl2YWwgfD0gUlQ1NjY4X1RETV9PVVRfQ0hfODsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHNsb3Rfd2lkdGgpIHsKKwljYXNlIDIwOgorCQl2YWwgfD0gUlQ1NjY4X1RETV9JTl9MRU5fMjA7CisJCXZhbCB8PSBSVDU2NjhfVERNX09VVF9MRU5fMjA7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCXZhbCB8PSBSVDU2NjhfVERNX0lOX0xFTl8yNDsKKwkJdmFsIHw9IFJUNTY2OF9URE1fT1VUX0xFTl8yNDsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJdmFsIHw9IFJUNTY2OF9URE1fSU5fTEVOXzMyOworCQl2YWwgfD0gUlQ1NjY4X1RETV9PVVRfTEVOXzMyOworCQlicmVhazsKKwljYXNlIDE2OgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHJ0NTY2My0+Y29kZWNfdHlwZSkgeworCWNhc2UgQ09ERUNfVFlQRV9SVDU2Njg6CisJCXJlZyA9IFJUNTY2M19URE1fMjsKKwkJYnJlYWs7CisJY2FzZSBDT0RFQ19UWVBFX1JUNTY2MzoKKwkJcmVnID0gUlQ1NjYzX1RETV8xOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIENPREVDX1RZUEVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWcsIFJUNTY2OF9URE1fTU9ERV9NQVNLIHwKKwkJUlQ1NjY4X1RETV9JTl9DSF9NQVNLIHwgUlQ1NjY4X1RETV9PVVRfQ0hfTUFTSyB8CisJCVJUNTY2OF9URE1fSU5fTEVOX01BU0sgfCBSVDU2NjhfVERNX09VVF9MRU5fTUFTSywgdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2M19zZXRfYmNsa19yYXRpbyhzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IHJhdGlvKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgcmF0aW8gPSAlZFxuIiwgX19mdW5jX18sIHJhdGlvKTsKKworCWlmIChydDU2NjMtPmNvZGVjX3R5cGUgPT0gQ09ERUNfVFlQRV9SVDU2NjgpCisJCXJlZyA9IFJUNTY2OF9URE1fODsKKwllbHNlCisJCXJlZyA9IFJUNTY2M19URE1fNTsKKworCXN3aXRjaCAocmF0aW8pIHsKKwljYXNlIDMyOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWcsCisJCQlSVDU2NjNfVERNX0xFTkdUTl9NQVNLLAorCQkJUlQ1NjYzX1RETV9MRU5HVE5fMTYpOworCQlicmVhazsKKwljYXNlIDQwOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWcsCisJCQlSVDU2NjNfVERNX0xFTkdUTl9NQVNLLAorCQkJUlQ1NjYzX1RETV9MRU5HVE5fMjApOworCQlicmVhazsKKwljYXNlIDQ4OgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWcsCisJCQlSVDU2NjNfVERNX0xFTkdUTl9NQVNLLAorCQkJUlQ1NjYzX1RETV9MRU5HVE5fMjQpOworCQlicmVhazsKKwljYXNlIDY0OgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWcsCisJCQlSVDU2NjNfVERNX0xFTkdUTl9NQVNLLAorCQkJUlQ1NjYzX1RETV9MRU5HVE5fMzIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbnZhbGlkIHJhdGlvIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2M19zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfUFdSX0FOTEdfMSwKKwkJCVJUNTY2OF9QV1JfRlYxX01BU0sgfCBSVDU2NjhfUFdSX0ZWMl9NQVNLLAorCQkJUlQ1NjY4X1BXUl9GVjEgfCBSVDU2NjhfUFdSX0ZWMik7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKKwkJaWYgKHJ0NTY2My0+Y29kZWNfdHlwZSA9PSBDT0RFQ19UWVBFX1JUNTY2OCkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0RJR19NSVNDLAorCQkJCVJUNTY2OF9ESUdfR0FURV9DVFJMX01BU0ssCisJCQkJUlQ1NjY4X0RJR19HQVRFX0NUUkxfRU4pOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX1NJR19DTEtfREVULAorCQkJCVJUNTY2OF9FTl9BTkFfQ0xLX0RFVF9NQVNLIHwKKwkJCQlSVDU2NjhfUFdSX0NMS19ERVRfTUFTSywKKwkJCQlSVDU2NjhfRU5fQU5BX0NMS19ERVRfQVVUTyB8CisJCQkJUlQ1NjY4X1BXUl9DTEtfREVUX0VOKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCWlmIChydDU2NjMtPmNvZGVjX3R5cGUgPT0gQ09ERUNfVFlQRV9SVDU2NjgpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfRElHX01JU0MsCisJCQkJUlQ1NjY4X0RJR19HQVRFX0NUUkxfTUFTSywKKwkJCQlSVDU2NjhfRElHX0dBVEVfQ1RSTF9ESVMpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfUFdSX0FOTEdfMSwKKwkJCVJUNTY2OF9QV1JfVlJFRjFfTUFTSyB8IFJUNTY2OF9QV1JfVlJFRjJfTUFTSyB8CisJCQlSVDU2NjhfUFdSX0ZWMV9NQVNLIHwgUlQ1NjY4X1BXUl9GVjJfTUFTSyB8CisJCQlSVDU2NjhfUFdSX01CX01BU0ssIFJUNTY2OF9QV1JfVlJFRjEgfAorCQkJUlQ1NjY4X1BXUl9WUkVGMiB8IFJUNTY2OF9QV1JfTUIpOworCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDEwMDA1KTsKKwkJaWYgKHJ0NTY2My0+Y29kZWNfdHlwZSA9PSBDT0RFQ19UWVBFX1JUNTY2OCkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX1NJR19DTEtfREVULAorCQkJCVJUNTY2OF9FTl9BTkFfQ0xLX0RFVF9NQVNLIHwKKwkJCQlSVDU2NjhfUFdSX0NMS19ERVRfTUFTSywKKwkJCQlSVDU2NjhfRU5fQU5BX0NMS19ERVRfRElTIHwKKwkJCQlSVDU2NjhfUFdSX0NMS19ERVRfRElTKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX1BXUl9BTkxHXzEsCisJCQlSVDU2NjhfUFdSX1ZSRUYxX01BU0sgfCBSVDU2NjhfUFdSX1ZSRUYyX01BU0sgfAorCQkJUlQ1NjY4X1BXUl9GVjEgfCBSVDU2NjhfUFdSX0ZWMiwgMHgwKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlydDU2NjMtPmNvZGVjID0gY29kZWM7CisKKwlzd2l0Y2ggKHJ0NTY2My0+Y29kZWNfdHlwZSkgeworCWNhc2UgQ09ERUNfVFlQRV9SVDU2Njg6CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwKKwkJCXJ0NTY2OF9zcGVjaWZpY19kYXBtX3dpZGdldHMsCisJCQlBUlJBWV9TSVpFKHJ0NTY2OF9zcGVjaWZpY19kYXBtX3dpZGdldHMpKTsKKwkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwKKwkJCXJ0NTY2OF9zcGVjaWZpY19kYXBtX3JvdXRlcywKKwkJCUFSUkFZX1NJWkUocnQ1NjY4X3NwZWNpZmljX2RhcG1fcm91dGVzKSk7CisJCXNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBydDU2Njhfc3BlY2lmaWNfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKHJ0NTY2OF9zcGVjaWZpY19jb250cm9scykpOworCQlicmVhazsKKwljYXNlIENPREVDX1RZUEVfUlQ1NjYzOgorCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sCisJCQlydDU2NjNfc3BlY2lmaWNfZGFwbV93aWRnZXRzLAorCQkJQVJSQVlfU0laRShydDU2NjNfc3BlY2lmaWNfZGFwbV93aWRnZXRzKSk7CisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sCisJCQlydDU2NjNfc3BlY2lmaWNfZGFwbV9yb3V0ZXMsCisJCQlBUlJBWV9TSVpFKHJ0NTY2M19zcGVjaWZpY19kYXBtX3JvdXRlcykpOworCQlzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgcnQ1NjYzX3NwZWNpZmljX2NvbnRyb2xzLAorCQkJQVJSQVlfU0laRShydDU2NjNfc3BlY2lmaWNfY29udHJvbHMpKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYzX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXJlZ21hcF93cml0ZShydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX1JFU0VULCAwKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHJ0NTY2M19zdXNwZW5kKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcmVnY2FjaGVfY2FjaGVfb25seShydDU2NjMtPnJlZ21hcCwgdHJ1ZSk7CisJcmVnY2FjaGVfbWFya19kaXJ0eShydDU2NjMtPnJlZ21hcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjNfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcmVnY2FjaGVfY2FjaGVfb25seShydDU2NjMtPnJlZ21hcCwgZmFsc2UpOworCXJlZ2NhY2hlX3N5bmMocnQ1NjYzLT5yZWdtYXApOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBydDU2NjNfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHJ0NTY2M19yZXN1bWUgTlVMTAorI2VuZGlmCisKKyNkZWZpbmUgUlQ1NjYzX1NURVJFT19SQVRFUyBTTkRSVl9QQ01fUkFURV84MDAwXzE5MjAwMAorI2RlZmluZSBSVDU2NjNfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfCBcCisJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzgpCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHJ0NTY2M19haWZfZGFpX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gcnQ1NjYzX2h3X3BhcmFtcywKKwkuc2V0X2ZtdCA9IHJ0NTY2M19zZXRfZGFpX2ZtdCwKKwkuc2V0X3N5c2NsayA9IHJ0NTY2M19zZXRfZGFpX3N5c2NsaywKKwkuc2V0X3BsbCA9IHJ0NTY2M19zZXRfZGFpX3BsbCwKKwkuc2V0X3RkbV9zbG90ID0gcnQ1NjYzX3NldF90ZG1fc2xvdCwKKwkuc2V0X2JjbGtfcmF0aW8gPSBydDU2NjNfc2V0X2JjbGtfcmF0aW8sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBydDU2NjNfZGFpW10gPSB7CisJeworCQkubmFtZSA9ICJydDU2NjMtYWlmIiwKKwkJLmlkID0gUlQ1NjYzX0FJRiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRiBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gUlQ1NjYzX1NURVJFT19SQVRFUywKKwkJCS5mb3JtYXRzID0gUlQ1NjYzX0ZPUk1BVFMsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRiBDYXB0dXJlIiwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBSVDU2NjNfU1RFUkVPX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBSVDU2NjNfRk9STUFUUywKKwkJfSwKKwkJLm9wcyA9ICZydDU2NjNfYWlmX2RhaV9vcHMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9ydDU2NjMgPSB7CisJLnByb2JlID0gcnQ1NjYzX3Byb2JlLAorCS5yZW1vdmUgPSBydDU2NjNfcmVtb3ZlLAorCS5zdXNwZW5kID0gcnQ1NjYzX3N1c3BlbmQsCisJLnJlc3VtZSA9IHJ0NTY2M19yZXN1bWUsCisJLnNldF9iaWFzX2xldmVsID0gcnQ1NjYzX3NldF9iaWFzX2xldmVsLAorCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzID0gcnQ1NjYzX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocnQ1NjYzX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMgPSBydDU2NjNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocnQ1NjYzX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcyA9IHJ0NTY2M19kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocnQ1NjYzX2RhcG1fcm91dGVzKSwKKwl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgcnQ1NjY4X3JlZ21hcCA9IHsKKwkucmVnX2JpdHMgPSAxNiwKKwkudmFsX2JpdHMgPSAxNiwKKwkudXNlX3NpbmdsZV9ydyA9IHRydWUsCisJLm1heF9yZWdpc3RlciA9IDB4MDdmYSwKKwkudm9sYXRpbGVfcmVnID0gcnQ1NjY4X3ZvbGF0aWxlX3JlZ2lzdGVyLAorCS5yZWFkYWJsZV9yZWcgPSBydDU2NjhfcmVhZGFibGVfcmVnaXN0ZXIsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLnJlZ19kZWZhdWx0cyA9IHJ0NTY2OF9yZWcsCisJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKHJ0NTY2OF9yZWcpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHJ0NTY2M19yZWdtYXAgPSB7CisJLnJlZ19iaXRzID0gMTYsCisJLnZhbF9iaXRzID0gMTYsCisJLnVzZV9zaW5nbGVfcncgPSB0cnVlLAorCS5tYXhfcmVnaXN0ZXIgPSAweDAzZjMsCisJLnZvbGF0aWxlX3JlZyA9IHJ0NTY2M192b2xhdGlsZV9yZWdpc3RlciwKKwkucmVhZGFibGVfcmVnID0gcnQ1NjYzX3JlYWRhYmxlX3JlZ2lzdGVyLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5yZWdfZGVmYXVsdHMgPSBydDU2NjNfcmVnLAorCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRShydDU2NjNfcmVnKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB0ZW1wX3JlZ21hcCA9IHsKKwkubmFtZSA9ICJub2NhY2hlIiwKKwkucmVnX2JpdHMgPSAxNiwKKwkudmFsX2JpdHMgPSAxNiwKKwkudXNlX3NpbmdsZV9ydyA9IHRydWUsCisJLm1heF9yZWdpc3RlciA9IDB4MDNmMywKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX05PTkUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcnQ1NjYzX2kyY19pZFtdID0geworCXsgInJ0NTY2OCIsIDAgfSwKKwl7ICJydDU2NjMiLCAwIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcnQ1NjYzX2kyY19pZCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19PRikKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJ0NTY2M19vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicmVhbHRlayxydDU2NjgiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAicmVhbHRlayxydDU2NjMiLCB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHJ0NTY2M19vZl9tYXRjaCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BQ1BJCitzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHJ0NTY2M19hY3BpX21hdGNoW10gPSB7CisJeyAiMTBFQzU2NjgiLCAwfSwKKwl7ICIxMEVDNTY2MyIsIDB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgcnQ1NjYzX2FjcGlfbWF0Y2gpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJ0NTY2OF9jYWxpYnJhdGUoc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjgpCit7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfQklBU19DVVJfOCwgMHhhNDAyKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19QV1JfRElHXzEsIDB4MDEwMCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfUkVDTUlYLCAweDQwNDApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0RJR19NSVNDLCAweDAwMDEpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1JDX0NMSywgMHgwMzgwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19HTEJfQ0xLLCAweDgwMDApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0FEREFfQ0xLXzEsIDB4MTAwMCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfQ0hPUF9EQUNfTCwgMHgzMDMwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19DQUxJQl9BREMsIDB4M2MwNSk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfUFdSX0FOTEdfMSwgMHhhMjNlKTsKKwltc2xlZXAoNDApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1BXUl9BTkxHXzEsIDB4ZjIzZSk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfSFBfQ0FMSUJfMiwgMHgwMzIxKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19IUF9DQUxJQl8xLCAweGZjMDApOworCW1zbGVlcCg1MDApOworfQorCitzdGF0aWMgdm9pZCBydDU2NjNfY2FsaWJyYXRlKHN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjY4KQoreworCWludCB2YWx1ZSwgY291bnQ7CisKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19SQ19DTEssIDB4MDI4MCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfR0xCX0NMSywgMHg4MDAwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19ESUdfTUlTQywgMHg4MDAxKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19WUkVGX1JFQ01JWCwgMHgwMDMyKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19QV1JfQU5MR18xLCAweGEyYmUpOworCW1zbGVlcCgyMCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfUFdSX0FOTEdfMSwgMHhmMmJlKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19QV1JfRElHXzIsIDB4ODQwMCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfQ0hPUF9BREMsIDB4MzAwMCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfREVQT1BfMSwgMHgwMDNiKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19QV1JfRElHXzEsIDB4OGRmOCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfUFdSX0FOTEdfMiwgMHgwMDAzKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19QV1JfQU5MR18zLCAweDAxOGMpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0FEREFfQ0xLXzEsIDB4MTExMSk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfUFJFX0RJVl9HQVRJTkdfMSwgMHhmZmZmKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19QUkVfRElWX0dBVElOR18yLCAweGZmZmYpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0RFUE9QXzIsIDB4MzAwMyk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfREVQT1BfMSwgMHgwMDNiKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19IUF9DSEFSR0VfUFVNUF8xLCAweDFlMzIpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0hQX0NIQVJHRV9QVU1QXzIsIDB4MTM3MSk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfREFDUkVGX0xETywgMHgzYjBiKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19TVE9fREFDX01JWEVSLCAweDIwODApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0JZUEFTU19TVE9fREFDLCAweDAwMGMpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0hQX0JJQVMsIDB4YWJiYSk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfQ0hBUkdFX1BVTVBfMSwgMHgyMjI0KTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19IUF9PVVRfRU4sIDB4ODA4OCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfU1RPX0RSRV85LCAweDAwMTcpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1NUT19EUkVfMTAsIDB4MDAxNyk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfU1RPMV9BRENfTUlYRVIsIDB4NDA0MCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfUkVDTUlYLCAweDAwMDUpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0FEREFfUlNULCAweGMwMDApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1NUTzFfSFBGX0FESjEsIDB4MzMyMCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfSFBfQ0FMSUJfMiwgMHgwMGM5KTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19EVU1NWV8xLCAweDAwNGMpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0FOQV9CSUFTX0NVUl8xLCAweDc3NjYpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0JJQVNfQ1VSXzgsIDB4NDcwMik7CisJbXNsZWVwKDIwMCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfSFBfQ0FMSUJfMSwgMHgwMDY5KTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19IUF9DQUxJQl8zLCAweDA2YzIpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0hQX0NBTElCXzFfMSwgMHg3YjAwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19IUF9DQUxJQl8xXzEsIDB4ZmIwMCk7CisJY291bnQgPSAwOworCXdoaWxlICh0cnVlKSB7CisJCXJlZ21hcF9yZWFkKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfSFBfQ0FMSUJfMV8xLCAmdmFsdWUpOworCQlpZiAodmFsdWUgJiAweDgwMDApCisJCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDEwMDA1KTsKKwkJZWxzZQorCQkJYnJlYWs7CisKKwkJaWYgKGNvdW50ID4gMjAwKQorCQkJcmV0dXJuOworCQljb3VudCsrOworCX0KK30KKworc3RhdGljIGludCBydDU2NjNfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjM7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKworCXJ0NTY2MyA9IGRldm1fa3phbGxvYygmaTJjLT5kZXYsIHNpemVvZihzdHJ1Y3QgcnQ1NjYzX3ByaXYpLAorCQlHRlBfS0VSTkVMKTsKKworCWlmIChydDU2NjMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBydDU2NjMpOworCisJcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAmdGVtcF9yZWdtYXApOworCWlmIChJU19FUlIocmVnbWFwKSkgeworCQlyZXQgPSBQVFJfRVJSKHJlZ21hcCk7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHRlbXAgcmVnaXN0ZXIgbWFwOiAlZFxuIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJlZ21hcF9yZWFkKHJlZ21hcCwgUlQ1NjYzX1ZFTkRPUl9JRF8yLCAmdmFsKTsKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgUlQ1NjY4X0RFVklDRV9JRDoKKwkJcnQ1NjYzLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhpMmMsICZydDU2NjhfcmVnbWFwKTsKKwkJcnQ1NjYzLT5jb2RlY190eXBlID0gQ09ERUNfVFlQRV9SVDU2Njg7CisJCWJyZWFrOworCWNhc2UgUlQ1NjYzX0RFVklDRV9JRDoKKwkJcnQ1NjYzLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhpMmMsICZydDU2NjNfcmVnbWFwKTsKKwkJcnQ1NjYzLT5jb2RlY190eXBlID0gQ09ERUNfVFlQRV9SVDU2NjM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmkyYy0+ZGV2LAorCQkJIkRldmljZSB3aXRoIElEIHJlZ2lzdGVyICUjeCBpcyBub3QgcnQ1NjYzIG9yIHJ0NTY2OFxuIiwKKwkJCXZhbCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChJU19FUlIocnQ1NjYzLT5yZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIocnQ1NjYzLT5yZWdtYXApOworCQlkZXZfZXJyKCZpMmMtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXA6ICVkXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiByZXNldCBhbmQgY2FsaWJyYXRlICovCisJcmVnbWFwX3dyaXRlKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfUkVTRVQsIDApOworCXJlZ2NhY2hlX2NhY2hlX2J5cGFzcyhydDU2NjMtPnJlZ21hcCwgdHJ1ZSk7CisJc3dpdGNoIChydDU2NjMtPmNvZGVjX3R5cGUpIHsKKwljYXNlIENPREVDX1RZUEVfUlQ1NjY4OgorCQlydDU2NjhfY2FsaWJyYXRlKHJ0NTY2Myk7CisJCWJyZWFrOworCWNhc2UgQ09ERUNfVFlQRV9SVDU2NjM6CisJCXJ0NTY2M19jYWxpYnJhdGUocnQ1NjYzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmaTJjLT5kZXYsICIlczpVbmtub3duIGNvZGVjIHR5cGVcbiIsIF9fZnVuY19fKTsKKwl9CisJcmVnY2FjaGVfY2FjaGVfYnlwYXNzKHJ0NTY2My0+cmVnbWFwLCBmYWxzZSk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfUkVTRVQsIDApOworCWRldl9kYmcoJmkyYy0+ZGV2LCAiY2FsaWJyYXRlIGRvbmVcbiIpOworCisJLyogR1BJTzEgYXMgSVJRICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfR1BJT18xLCBSVDU2NjhfR1AxX1BJTl9NQVNLLAorCQlSVDU2NjhfR1AxX1BJTl9JUlEpOworCS8qIDRidG4gaW5saW5lIGNvbW1hbmQgZGVib3VuY2UgKi8KKwlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19JTF9DTURfNSwKKwkJUlQ1NjY4XzRCVE5fQ0xLX0RFQl9NQVNLLCBSVDU2NjhfNEJUTl9DTEtfREVCXzY1TVMpOworCisJc3dpdGNoIChydDU2NjMtPmNvZGVjX3R5cGUpIHsKKwljYXNlIENPREVDX1RZUEVfUlQ1NjY4OgorCQlyZWdtYXBfd3JpdGUocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19CSUFTX0NVUl84LCAweGE0MDIpOworCQkvKiBKRDEgKi8KKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfQVVUT18xTVJDX0NMSywKKwkJCVJUNTY2OF9JUlFfUE9XX1NBVl9NQVNLIHwgUlQ1NjY4X0lSUV9QT1dfU0FWX0pEMV9NQVNLLAorCQkJUlQ1NjY4X0lSUV9QT1dfU0FWX0VOIHwgUlQ1NjY4X0lSUV9QT1dfU0FWX0pEMV9FTik7CisJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX1BXUl9BTkxHXzIsCisJCQlSVDU2NjhfUFdSX0pEMV9NQVNLLCBSVDU2NjhfUFdSX0pEMSk7CisJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX0lSUV8xLAorCQkJUlQ1NjY4X0VOX0NCX0pEX01BU0ssIFJUNTY2OF9FTl9DQl9KRF9FTik7CisKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfSFBfTE9HSUNfMiwKKwkJCVJUNTY2OF9IUF9TSUdfU1JDMV9NQVNLLCBSVDU2NjhfSFBfU0lHX1NSQzFfUkVHKTsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfUkVDTUlYLAorCQkJUlQ1NjY4X1ZSRUZfQklBU19NQVNLIHwgUlQ1NjY4X0NCSl9ERVRfTUFTSyB8CisJCQlSVDU2NjhfREVUX1RZUEVfTUFTSywgUlQ1NjY4X1ZSRUZfQklBU19SRUcgfAorCQkJUlQ1NjY4X0NCSl9ERVRfRU4gfCBSVDU2NjhfREVUX1RZUEVfUUZOKTsKKwkJLyogU2V0IEdQSU80IGFuZCBHUElPOCBhcyBpbnB1dCBmb3IgY29tYm8gamFjayAqLworCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19HUElPXzIsCisJCQlSVDU2NjhfR1A0X1BJTl9DT05GX01BU0ssIFJUNTY2OF9HUDRfUElOX0NPTkZfSU5QVVQpOworCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjYzLT5yZWdtYXAsIFJUNTY2OF9HUElPXzMsCisJCQlSVDU2NjhfR1A4X1BJTl9DT05GX01BU0ssIFJUNTY2OF9HUDhfUElOX0NPTkZfSU5QVVQpOworCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19QV1JfQU5MR18xLAorCQkJUlQ1NjY4X0xETzFfRFZPX01BU0sgfCBSVDU2NjhfQU1QX0hQX01BU0ssCisJCQlSVDU2NjhfTERPMV9EVk9fMF85ViB8IFJUNTY2OF9BTVBfSFBfM1gpOworCQkJYnJlYWs7CisJY2FzZSBDT0RFQ19UWVBFX1JUNTY2MzoKKwkJcmVnbWFwX3dyaXRlKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfVlJFRl9SRUNNSVgsIDB4MDAzMik7CisJCXJlZ21hcF93cml0ZShydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX1BXUl9BTkxHXzEsIDB4YTJiZSk7CisJCW1zbGVlcCgyMCk7CisJCXJlZ21hcF93cml0ZShydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX1BXUl9BTkxHXzEsIDB4ZjJiZSk7CisJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX0dQSU9fMiwKKwkJCVJUNTY2M19HUDFfUElOX0NPTkZfTUFTSywgUlQ1NjYzX0dQMV9QSU5fQ09ORl9PVVRQVVQpOworCQkvKiBEQUNSRUYgTERPIGNvbnRyb2wgKi8KKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfREFDUkVGX0xETywgMHgzZTBlLAorCQkJMHgzYTBhKTsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfUkVDTUlYLAorCQkJUlQ1NjYzX1JFQ01JWDFfQlNUMV9NQVNLLCBSVDU2NjNfUkVDTUlYMV9CU1QxX09OKTsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfVERNXzIsCisJCQlSVDU2NjNfREFUQV9TV0FQX0FEQ0RBVDFfTUFTSywKKwkJCVJUNTY2M19EQVRBX1NXQVBfQURDREFUMV9MTCk7CisJCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZpMmMtPmRldiwgIiVzOlVua25vd24gY29kZWMgdHlwZVxuIiwgX19mdW5jX18pOworCX0KKworCUlOSVRfREVMQVlFRF9XT1JLKCZydDU2NjMtPmphY2tfZGV0ZWN0X3dvcmssIHJ0NTY2M19qYWNrX2RldGVjdF93b3JrKTsKKworCWlmIChpMmMtPmlycSkgeworCQlyZXQgPSByZXF1ZXN0X2lycShpMmMtPmlycSwgcnQ1NjYzX2lycSwKKwkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfRkFMTElORworCQkJfCBJUlFGX09ORVNIT1QsICJydDU2NjMiLCBydDU2NjMpOworCQlpZiAocmV0KQorCQkJZGV2X2VycigmaTJjLT5kZXYsICIlcyBGYWlsZWQgdG8gcmVndWVzdCBJUlE6ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCX0KKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LCAmc29jX2NvZGVjX2Rldl9ydDU2NjMsCisJCQlydDU2NjNfZGFpLCBBUlJBWV9TSVpFKHJ0NTY2M19kYWkpKTsKKworCWlmIChyZXQpIHsKKwkJaWYgKGkyYy0+aXJxKQorCQkJZnJlZV9pcnEoaTJjLT5pcnEsIHJ0NTY2Myk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBydDU2NjNfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQoreworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gaTJjX2dldF9jbGllbnRkYXRhKGkyYyk7CisKKwlpZiAoaTJjLT5pcnEpCisJCWZyZWVfaXJxKGkyYy0+aXJxLCBydDU2NjMpOworCisJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcnQ1NjYzX2kyY19zaHV0ZG93bihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlyZWdtYXBfd3JpdGUocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19SRVNFVCwgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBydDU2NjNfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJydDU2NjMiLAorCQkuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKHJ0NTY2M19hY3BpX21hdGNoKSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHJ0NTY2M19vZl9tYXRjaCksCisJfSwKKwkucHJvYmUgPSBydDU2NjNfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSBydDU2NjNfaTJjX3JlbW92ZSwKKwkuc2h1dGRvd24gPSBydDU2NjNfaTJjX3NodXRkb3duLAorCS5pZF90YWJsZSA9IHJ0NTY2M19pMmNfaWQsCit9OworbW9kdWxlX2kyY19kcml2ZXIocnQ1NjYzX2kyY19kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgUlQ1NjYzIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiSmFjayBZdSA8amFjay55dUByZWFsdGVrLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjYzLmggYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY2My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYzhmMjgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY2My5oCkBAIC0wLDAgKzEsMTEyMSBAQAorLyoKKyAqIHJ0NTY2My5oICAtLSAgUlQ1NjYzIEFMU0EgU29DIGF1ZGlvIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDE2IFJlYWx0ZWsgTWljcm9lbGVjdHJvbmljcworICogQXV0aG9yOiBKYWNrIFl1IDxqYWNrLnl1QHJlYWx0ZWsuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX1JUNTY2M19IX18KKyNkZWZpbmUgX19SVDU2NjNfSF9fCisKKy8qIEluZm8gKi8KKyNkZWZpbmUgUlQ1NjYzX1JFU0VUCQkJCTB4MDAwMAorI2RlZmluZSBSVDU2NjNfVkVORE9SX0lECQkJMHgwMGZkCisjZGVmaW5lIFJUNTY2M19WRU5ET1JfSURfMQkJCTB4MDBmZQorI2RlZmluZSBSVDU2NjNfVkVORE9SX0lEXzIJCQkweDAwZmYKKworI2RlZmluZSBSVDU2NjhfTE9VVF9DVFJMCQkJMHgwMDAxCisjZGVmaW5lIFJUNTY2OF9IUF9BTVBfMgkJCQkweDAwMDMKKyNkZWZpbmUgUlQ1NjY4X01PTk9fT1VUCQkJCTB4MDAwNAorI2RlZmluZSBSVDU2NjhfTU9OT19HQUlOCQkJMHgwMDA3CisKKyNkZWZpbmUgUlQ1NjY4X0FFQ19CU1QJCQkJMHgwMDBiCisjZGVmaW5lIFJUNTY2OF9JTjFfSU4yCQkJCTB4MDAwYworI2RlZmluZSBSVDU2NjhfSU4zX0lONAkJCQkweDAwMGQKKyNkZWZpbmUgUlQ1NjY4X0lOTDFfSU5SMQkJCTB4MDAwZgorI2RlZmluZSBSVDU2NjhfQ0JKX1RZUEVfMgkJCTB4MDAxMQorI2RlZmluZSBSVDU2NjhfQ0JKX1RZUEVfMwkJCTB4MDAxMgorI2RlZmluZSBSVDU2NjhfQ0JKX1RZUEVfNAkJCTB4MDAxMworI2RlZmluZSBSVDU2NjhfQ0JKX1RZUEVfNQkJCTB4MDAxNAorI2RlZmluZSBSVDU2NjhfQ0JKX1RZUEVfOAkJCTB4MDAxNworCisvKiBJL08gLSBBREMvREFDL0RNSUMgKi8KKyNkZWZpbmUgUlQ1NjY4X0RBQzNfRElHX1ZPTAkJCTB4MDAxYQorI2RlZmluZSBSVDU2NjhfREFDM19DVFJMCQkJMHgwMDFiCisjZGVmaW5lIFJUNTY2OF9NT05PX0FEQ19ESUdfVk9MCQkJMHgwMDFkCisjZGVmaW5lIFJUNTY2OF9TVE8yX0FEQ19ESUdfVk9MCQkJMHgwMDFlCisjZGVmaW5lIFJUNTY2OF9NT05PX0FEQ19CU1RfR0FJTgkJMHgwMDIwCisjZGVmaW5lIFJUNTY2OF9TVE8yX0FEQ19CU1RfR0FJTgkJMHgwMDIxCisjZGVmaW5lIFJUNTY2OF9TSURFVE9ORV9DVFJMCQkJMHgwMDI0CisvKiBNaXhlciAtIEQtRCAqLworI2RlZmluZSBSVDU2NjhfTU9OTzFfQURDX01JWEVSCQkJMHgwMDI3CisjZGVmaW5lIFJUNTY2OF9TVE8yX0FEQ19NSVhFUgkJCTB4MDAyOAorI2RlZmluZSBSVDU2NjhfTU9OT19EQUNfTUlYRVIJCQkweDAwMmIKKyNkZWZpbmUgUlQ1NjY4X0RBQzJfU1JDX0NUUkwJCQkweDAwMmUKKyNkZWZpbmUgUlQ1NjY4X0lGXzNfNF9EQVRBX0NUTAkJCTB4MDAyZgorI2RlZmluZSBSVDU2NjhfSUZfNV9EQVRBX0NUTAkJCTB4MDAzMAorI2RlZmluZSBSVDU2NjhfUERNX09VVF9DVEwJCQkweDAwMzEKKyNkZWZpbmUgUlQ1NjY4X1BETV9JMkNfREFUQV9DVEwxCQkweDAwMzIKKyNkZWZpbmUgUlQ1NjY4X1BETV9JMkNfREFUQV9DVEwyCQkweDAwMzMKKyNkZWZpbmUgUlQ1NjY4X1BETV9JMkNfREFUQV9DVEwzCQkweDAwMzQKKyNkZWZpbmUgUlQ1NjY4X1BETV9JMkNfREFUQV9DVEw0CQkweDAwMzUKKworLypNaXhlciAtIEFuYWxvZyovCisjZGVmaW5lIFJUNTY2OF9SRUNNSVgxX05FVwkJCTB4MDAzYQorI2RlZmluZSBSVDU2NjhfUkVDTUlYMUxfMAkJCTB4MDAzYgorI2RlZmluZSBSVDU2NjhfUkVDTUlYMUwJCQkJMHgwMDNjCisjZGVmaW5lIFJUNTY2OF9SRUNNSVgxUl8wCQkJMHgwMDNkCisjZGVmaW5lIFJUNTY2OF9SRUNNSVgxUgkJCQkweDAwM2UKKyNkZWZpbmUgUlQ1NjY4X1JFQ01JWDJfTkVXCQkJMHgwMDNmCisjZGVmaW5lIFJUNTY2OF9SRUNNSVgyX0xfMgkJCTB4MDA0MQorI2RlZmluZSBSVDU2NjhfUkVDTUlYMl9SCQkJMHgwMDQyCisjZGVmaW5lIFJUNTY2OF9SRUNNSVgyX1JfMgkJCTB4MDA0MworI2RlZmluZSBSVDU2NjhfQ0FMSUJfUkVDX0xSCQkJMHgwMDQ0CisjZGVmaW5lIFJUNTY2OF9BTENfQktfR0FJTgkJCTB4MDA0OQorI2RlZmluZSBSVDU2NjhfTU9OT01JWF9HQUlOCQkJMHgwMDRhCisjZGVmaW5lIFJUNTY2OF9NT05PTUlYX0lOX0dBSU4JCQkweDAwNGIKKyNkZWZpbmUgUlQ1NjY4X09VVF9NSVhMX0dBSU4JCQkweDAwNGQKKyNkZWZpbmUgUlQ1NjY4X09VVF9MTUlYX0lOX0dBSU4JCQkweDAwNGUKKyNkZWZpbmUgUlQ1NjY4X09VVF9STUlYX0lOX0dBSU4JCQkweDAwNGYKKyNkZWZpbmUgUlQ1NjY4X09VVF9STUlYX0lOX0dBSU4xCQkweDAwNTAKKyNkZWZpbmUgUlQ1NjY4X0xPVVRfTUlYRVJfQ1RSTAkJCTB4MDA1MgorLyogUG93ZXIgKi8KKyNkZWZpbmUgUlQ1NjY4X1BXUl9WT0wJCQkJMHgwMDY3CisKKyNkZWZpbmUgUlQ1NjY4X0FEQ0RBQ19SU1QJCQkweDAwNmQKKy8qIEZvcm1hdCAtIEFEQy9EQUMgKi8KKyNkZWZpbmUgUlQ1NjY4X0kyUzM0X1NEUAkJCTB4MDA3MQorI2RlZmluZSBSVDU2NjhfSTJTNV9TRFAJCQkJMHgwMDcyCisvKiBGb3JtYXQgLSBURE0gQ29udHJvbCAqLworI2RlZmluZSBSVDU2NjhfVERNXzUJCQkJMHgwMDdjCisjZGVmaW5lIFJUNTY2OF9URE1fNgkJCQkweDAwN2QKKyNkZWZpbmUgUlQ1NjY4X1RETV83CQkJCTB4MDA3ZQorI2RlZmluZSBSVDU2NjhfVERNXzgJCQkJMHgwMDdmCisKKy8qIEZ1bmN0aW9uIC0gQW5hbG9nICovCisjZGVmaW5lIFJUNTY2OF9BU1JDXzMJCQkJMHgwMDg1CisjZGVmaW5lIFJUNTY2OF9BU1JDXzYJCQkJMHgwMDg4CisjZGVmaW5lIFJUNTY2OF9BU1JDXzcJCQkJMHgwMDg5CisjZGVmaW5lIFJUNTY2OF9QTExfVFJLXzEzCQkJMHgwMDk5CisjZGVmaW5lIFJUNTY2OF9JMlNfTV9DTEtfQ1RMCQkJMHgwMGEwCisjZGVmaW5lIFJUNTY2OF9GRElWX0kyUzM0X01fQ0xLCQkJMHgwMGExCisjZGVmaW5lIFJUNTY2OF9GRElWX0kyUzM0X01fQ0xLMgkJMHgwMGEyCisjZGVmaW5lIFJUNTY2OF9GRElWX0kyUzVfTV9DTEsJCQkweDAwYTMKKyNkZWZpbmUgUlQ1NjY4X0ZESVZfSTJTNV9NX0NMSzIJCQkweDAwYTQKKworLyogRnVuY3Rpb24gLSBEaWdpdGFsICovCisjZGVmaW5lIFJUNTY2OF9JUlFfNAkJCQkweDAwYjkKKyNkZWZpbmUgUlQ1NjY4X0dQSU9fMwkJCQkweDAwYzIKKyNkZWZpbmUgUlQ1NjY4X0dQSU9fNAkJCQkweDAwYzMKKyNkZWZpbmUgUlQ1NjY4X0dQSU9fU1RBCQkJCTB4MDBjNAorI2RlZmluZSBSVDU2NjhfSFBfQU1QX0RFVDEJCQkweDAwZDAKKyNkZWZpbmUgUlQ1NjY4X0hQX0FNUF9ERVQyCQkJMHgwMGQxCisjZGVmaW5lIFJUNTY2OF9IUF9BTVBfREVUMwkJCTB4MDBkMgorI2RlZmluZSBSVDU2NjhfTUlEX0JEX0hQX0FNUAkJCTB4MDBkMworI2RlZmluZSBSVDU2NjhfTE9XX0JEX0hQX0FNUAkJCTB4MDBkNAorI2RlZmluZSBSVDU2NjhfU09GX1ZPTF9aQzIJCQkweDAwZGEKKyNkZWZpbmUgUlQ1NjY4X0FEQ19TVE8yX0FESjEJCQkweDAwZWUKKyNkZWZpbmUgUlQ1NjY4X0FEQ19TVE8yX0FESjIJCQkweDAwZWYKKy8qIEdlbmVyYWwgQ29udHJvbCAqLworI2RlZmluZSBSVDU2NjhfQV9KRF9DVFJMCQkJMHgwMGYwCisjZGVmaW5lIFJUNTY2OF9KRDFfVFJFU19DVFJMCQkJMHgwMGYxCisjZGVmaW5lIFJUNTY2OF9KRDJfVFJFU19DVFJMCQkJMHgwMGYyCisjZGVmaW5lIFJUNTY2OF9KRF9DVFJMMgkJCQkweDAwZjcKKyNkZWZpbmUgUlQ1NjY4X0RVTV9SRUdfMgkJCTB4MDBmYgorI2RlZmluZSBSVDU2NjhfRFVNX1JFR18zCQkJMHgwMGZjCisKKworI2RlZmluZSBSVDU2NjhfREFDQURDX0RJR19WT0wyCQkJMHgwMTAxCisjZGVmaW5lIFJUNTY2OF9ESUdfSU5fUElOMgkJCTB4MDEzMworI2RlZmluZSBSVDU2NjhfUEFEX0RSVl9DVEwxCQkJMHgwMTM2CisjZGVmaW5lIFJUNTY2OF9TT0ZfUkFNX0RFUE9QCQkJMHgwMTM4CisjZGVmaW5lIFJUNTY2OF9WT0xfVEVTVAkJCQkweDAxM2YKKyNkZWZpbmUgUlQ1NjY4X1RFU1RfTU9ERV8zCQkJMHgwMTQ3CisjZGVmaW5lIFJUNTY2OF9URVNUX01PREVfNAkJCTB4MDE0OAorI2RlZmluZSBSVDU2NjhfTU9OT19EWU5BXzEJCQkweDAxNzAKKyNkZWZpbmUgUlQ1NjY4X01PTk9fRFlOQV8yCQkJMHgwMTcxCisjZGVmaW5lIFJUNTY2OF9NT05PX0RZTkFfMwkJCTB4MDE3MgorI2RlZmluZSBSVDU2NjhfTU9OT19EWU5BXzQJCQkweDAxNzMKKyNkZWZpbmUgUlQ1NjY4X01PTk9fRFlOQV81CQkJMHgwMTc0CisjZGVmaW5lIFJUNTY2OF9NT05PX0RZTkFfNgkJCTB4MDE3NQorI2RlZmluZSBSVDU2NjhfU1RPMV9TSUxfREVUCQkJMHgwMTkwCisjZGVmaW5lIFJUNTY2OF9NT05PTF9TSUxfREVUCQkJMHgwMTkxCisjZGVmaW5lIFJUNTY2OF9NT05PUl9TSUxfREVUCQkJMHgwMTkyCisjZGVmaW5lIFJUNTY2OF9TVE8yX0RBQ19TSUwJCQkweDAxOTMKKyNkZWZpbmUgUlQ1NjY4X1BXUl9TQVZfQ1RMMQkJCTB4MDE5NAorI2RlZmluZSBSVDU2NjhfUFdSX1NBVl9DVEwyCQkJMHgwMTk1CisjZGVmaW5lIFJUNTY2OF9QV1JfU0FWX0NUTDMJCQkweDAxOTYKKyNkZWZpbmUgUlQ1NjY4X1BXUl9TQVZfQ1RMNAkJCTB4MDE5NworI2RlZmluZSBSVDU2NjhfUFdSX1NBVl9DVEw1CQkJMHgwMTk4CisjZGVmaW5lIFJUNTY2OF9QV1JfU0FWX0NUTDYJCQkweDAxOTkKKyNkZWZpbmUgUlQ1NjY4X01PTk9fQU1QX0NBTDEJCQkweDAxYTAKKyNkZWZpbmUgUlQ1NjY4X01PTk9fQU1QX0NBTDIJCQkweDAxYTEKKyNkZWZpbmUgUlQ1NjY4X01PTk9fQU1QX0NBTDMJCQkweDAxYTIKKyNkZWZpbmUgUlQ1NjY4X01PTk9fQU1QX0NBTDQJCQkweDAxYTMKKyNkZWZpbmUgUlQ1NjY4X01PTk9fQU1QX0NBTDUJCQkweDAxYTQKKyNkZWZpbmUgUlQ1NjY4X01PTk9fQU1QX0NBTDYJCQkweDAxYTUKKyNkZWZpbmUgUlQ1NjY4X01PTk9fQU1QX0NBTDcJCQkweDAxYTYKKyNkZWZpbmUgUlQ1NjY4X01PTk9fQU1QX0NBTF9TVDEJCQkweDAxYTcKKyNkZWZpbmUgUlQ1NjY4X01PTk9fQU1QX0NBTF9TVDIJCQkweDAxYTgKKyNkZWZpbmUgUlQ1NjY4X01PTk9fQU1QX0NBTF9TVDMJCQkweDAxYTkKKyNkZWZpbmUgUlQ1NjY4X01PTk9fQU1QX0NBTF9TVDQJCQkweDAxYWEKKyNkZWZpbmUgUlQ1NjY4X01PTk9fQU1QX0NBTF9TVDUJCQkweDAxYWIKKyNkZWZpbmUgUlQ1NjY4X0hQX0lNUF9TRU5fMTMJCQkweDAxYjkKKyNkZWZpbmUgUlQ1NjY4X0hQX0lNUF9TRU5fMTQJCQkweDAxYmEKKyNkZWZpbmUgUlQ1NjY4X0hQX0lNUF9TRU5fNgkJCTB4MDFiYgorI2RlZmluZSBSVDU2NjhfSFBfSU1QX1NFTl83CQkJMHgwMWJjCisjZGVmaW5lIFJUNTY2OF9IUF9JTVBfU0VOXzgJCQkweDAxYmQKKyNkZWZpbmUgUlQ1NjY4X0hQX0lNUF9TRU5fOQkJCTB4MDFiZQorI2RlZmluZSBSVDU2NjhfSFBfSU1QX1NFTl8xMAkJCTB4MDFiZgorI2RlZmluZSBSVDU2NjhfSFBfTE9HSUNfMwkJCTB4MDFkYworI2RlZmluZSBSVDU2NjhfSFBfQ0FMSUJfU1QxMAkJCTB4MDFmMworI2RlZmluZSBSVDU2NjhfSFBfQ0FMSUJfU1QxMQkJCTB4MDFmNAorI2RlZmluZSBSVDU2NjhfUFJPX1JFR19UQkxfNAkJCTB4MDIwMworI2RlZmluZSBSVDU2NjhfUFJPX1JFR19UQkxfNQkJCTB4MDIwNAorI2RlZmluZSBSVDU2NjhfUFJPX1JFR19UQkxfNgkJCTB4MDIwNQorI2RlZmluZSBSVDU2NjhfUFJPX1JFR19UQkxfNwkJCTB4MDIwNgorI2RlZmluZSBSVDU2NjhfUFJPX1JFR19UQkxfOAkJCTB4MDIwNworI2RlZmluZSBSVDU2NjhfUFJPX1JFR19UQkxfOQkJCTB4MDIwOAorI2RlZmluZSBSVDU2NjhfU0FSX0FEQ19JTkxfMQkJCTB4MDIxMAorI2RlZmluZSBSVDU2NjhfU0FSX0FEQ19JTkxfMgkJCTB4MDIxMQorI2RlZmluZSBSVDU2NjhfU0FSX0FEQ19JTkxfMwkJCTB4MDIxMgorI2RlZmluZSBSVDU2NjhfU0FSX0FEQ19JTkxfNAkJCTB4MDIxMworI2RlZmluZSBSVDU2NjhfU0FSX0FEQ19JTkxfNQkJCTB4MDIxNAorI2RlZmluZSBSVDU2NjhfU0FSX0FEQ19JTkxfNgkJCTB4MDIxNQorI2RlZmluZSBSVDU2NjhfU0FSX0FEQ19JTkxfNwkJCTB4MDIxNgorI2RlZmluZSBSVDU2NjhfU0FSX0FEQ19JTkxfOAkJCTB4MDIxNworI2RlZmluZSBSVDU2NjhfU0FSX0FEQ19JTkxfOQkJCTB4MDIxOAorI2RlZmluZSBSVDU2NjhfU0FSX0FEQ19JTkxfMTAJCQkweDAyMTkKKyNkZWZpbmUgUlQ1NjY4X1NBUl9BRENfSU5MXzExCQkJMHgwMjFhCisjZGVmaW5lIFJUNTY2OF9TQVJfQURDX0lOTF8xMgkJCTB4MDIxYgorI2RlZmluZSBSVDU2NjhfRFJDX0NUUkxfMQkJCTB4MDJmZgorI2RlZmluZSBSVDU2NjhfRFJDMV9DVFJMXzIJCQkweDAzMDEKKyNkZWZpbmUgUlQ1NjY4X0RSQzFfQ1RSTF8zCQkJMHgwMzAyCisjZGVmaW5lIFJUNTY2OF9EUkMxX0NUUkxfNAkJCTB4MDMwMworI2RlZmluZSBSVDU2NjhfRFJDMV9DVFJMXzUJCQkweDAzMDQKKyNkZWZpbmUgUlQ1NjY4X0RSQzFfQ1RSTF82CQkJMHgwMzA1CisjZGVmaW5lIFJUNTY2OF9EUkMxX0hEX0NUUkxfMQkJCTB4MDMwNgorI2RlZmluZSBSVDU2NjhfRFJDMV9IRF9DVFJMXzIJCQkweDAzMDcKKyNkZWZpbmUgUlQ1NjY4X0RSQzFfUFJJX1JFR18xCQkJMHgwMzEwCisjZGVmaW5lIFJUNTY2OF9EUkMxX1BSSV9SRUdfMgkJCTB4MDMxMQorI2RlZmluZSBSVDU2NjhfRFJDMV9QUklfUkVHXzMJCQkweDAzMTIKKyNkZWZpbmUgUlQ1NjY4X0RSQzFfUFJJX1JFR180CQkJMHgwMzEzCisjZGVmaW5lIFJUNTY2OF9EUkMxX1BSSV9SRUdfNQkJCTB4MDMxNAorI2RlZmluZSBSVDU2NjhfRFJDMV9QUklfUkVHXzYJCQkweDAzMTUKKyNkZWZpbmUgUlQ1NjY4X0RSQzFfUFJJX1JFR183CQkJMHgwMzE2CisjZGVmaW5lIFJUNTY2OF9EUkMxX1BSSV9SRUdfOAkJCTB4MDMxNworI2RlZmluZSBSVDU2NjhfQUxDX1BHQV9DVExfMQkJCTB4MDMzMAorI2RlZmluZSBSVDU2NjhfQUxDX1BHQV9DVExfMgkJCTB4MDMzMQorI2RlZmluZSBSVDU2NjhfQUxDX1BHQV9DVExfMwkJCTB4MDMzMgorI2RlZmluZSBSVDU2NjhfQUxDX1BHQV9DVExfNAkJCTB4MDMzMworI2RlZmluZSBSVDU2NjhfQUxDX1BHQV9DVExfNQkJCTB4MDMzNAorI2RlZmluZSBSVDU2NjhfQUxDX1BHQV9DVExfNgkJCTB4MDMzNQorI2RlZmluZSBSVDU2NjhfQUxDX1BHQV9DVExfNwkJCTB4MDMzNgorI2RlZmluZSBSVDU2NjhfQUxDX1BHQV9DVExfOAkJCTB4MDMzNworI2RlZmluZSBSVDU2NjhfQUxDX1BHQV9SRUdfMQkJCTB4MDMzOAorI2RlZmluZSBSVDU2NjhfQUxDX1BHQV9SRUdfMgkJCTB4MDMzOQorI2RlZmluZSBSVDU2NjhfQUxDX1BHQV9SRUdfMwkJCTB4MDMzYQorI2RlZmluZSBSVDU2NjhfQURDX0VRX1JFQ09WXzEJCQkweDAzYzAKKyNkZWZpbmUgUlQ1NjY4X0FEQ19FUV9SRUNPVl8yCQkJMHgwM2MxCisjZGVmaW5lIFJUNTY2OF9BRENfRVFfUkVDT1ZfMwkJCTB4MDNjMgorI2RlZmluZSBSVDU2NjhfQURDX0VRX1JFQ09WXzQJCQkweDAzYzMKKyNkZWZpbmUgUlQ1NjY4X0FEQ19FUV9SRUNPVl81CQkJMHgwM2M0CisjZGVmaW5lIFJUNTY2OF9BRENfRVFfUkVDT1ZfNgkJCTB4MDNjNQorI2RlZmluZSBSVDU2NjhfQURDX0VRX1JFQ09WXzcJCQkweDAzYzYKKyNkZWZpbmUgUlQ1NjY4X0FEQ19FUV9SRUNPVl84CQkJMHgwM2M3CisjZGVmaW5lIFJUNTY2OF9BRENfRVFfUkVDT1ZfOQkJCTB4MDNjOAorI2RlZmluZSBSVDU2NjhfQURDX0VRX1JFQ09WXzEwCQkJMHgwM2M5CisjZGVmaW5lIFJUNTY2OF9BRENfRVFfUkVDT1ZfMTEJCQkweDAzY2EKKyNkZWZpbmUgUlQ1NjY4X0FEQ19FUV9SRUNPVl8xMgkJCTB4MDNjYgorI2RlZmluZSBSVDU2NjhfQURDX0VRX1JFQ09WXzEzCQkJMHgwM2NjCisjZGVmaW5lIFJUNTY2OF9WSURfSElEREVOCQkJMHgwM2ZlCisjZGVmaW5lIFJUNTY2OF9WSURfQ1VTVE9NRVIJCQkweDAzZmYKKyNkZWZpbmUgUlQ1NjY4X1NDQU5fTU9ERQkJCTB4MDdmMAorI2RlZmluZSBSVDU2NjhfSTJDX0JZUEEJCQkJMHgwN2ZhCisKKy8qIEhlYWRwaG9uZSBBbXAgQ29udHJvbCAyICgweDAwMDMpICovCisjZGVmaW5lIFJUNTY2OF9FTl9EQUNfSFBPX01BU0sJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjhfRU5fREFDX0hQT19TSElGVAkJCTE0CisjZGVmaW5lIFJUNTY2OF9FTl9EQUNfSFBPX0RJUwkJCSgweDAgPDwgMTQpCisjZGVmaW5lIFJUNTY2OF9FTl9EQUNfSFBPX0VOCQkJKDB4MSA8PCAxNCkKKworLypIZWFkcGhvbmUgQW1wIEwvUiBBbmFsb2cgR2FpbiBhbmQgRGlnaXRhbCBORzIgR2FpbiBDb250cm9sICgweDAwMDUgMHgwMDA2KSovCisjZGVmaW5lIFJUNTY2OF9HQUlOX0hQCQkJCSgweDFmIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9HQUlOX0hQX1NISUZUCQkJOAorCisvKiBBRUMgQlNUIENvbnRyb2wgKDB4MDAwYikgKi8KKyNkZWZpbmUgUlQ1NjY4X0dBSU5fQ0JKX01BU0sJCQkoMHhmIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9HQUlOX0NCSl9TSElGVAkJCTgKKworLyogSU4xIENvbnRyb2wgLyBNSUMgR05EIFJFRiAoMHgwMDBjKSAqLworI2RlZmluZSBSVDU2NjhfSU4xX0RGX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfSU4xX0RGX1NISUZUCQkJMTUKKworLyogQ29tYm8gSmFjayBhbmQgVHlwZSBEZXRlY3Rpb24gQ29udHJvbCAxICgweDAwMTApICovCisjZGVmaW5lIFJUNTY2OF9DQkpfREVUX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfQ0JKX0RFVF9TSElGVAkJCTE1CisjZGVmaW5lIFJUNTY2OF9DQkpfREVUX0RJUwkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9DQkpfREVUX0VOCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X0RFVF9UWVBFX01BU0sJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjhfREVUX1RZUEVfU0hJRlQJCQkxMgorI2RlZmluZSBSVDU2NjhfREVUX1RZUEVfV0xDU1AJCQkoMHgwIDw8IDEyKQorI2RlZmluZSBSVDU2NjhfREVUX1RZUEVfUUZOCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjY4X1ZSRUZfQklBU19NQVNLCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjhfVlJFRl9CSUFTX1NISUZUCQkJNgorI2RlZmluZSBSVDU2NjhfVlJFRl9CSUFTX0ZTTQkJCSgweDAgPDwgNikKKyNkZWZpbmUgUlQ1NjY4X1ZSRUZfQklBU19SRUcJCQkoMHgxIDw8IDYpCisKKy8qIFJFQyBMZWZ0IE1peGVyIENvbnRyb2wgMiAoMHgwMDNjKSAqLworI2RlZmluZSBSVDU2NjhfUkVDTUlYMUxfQlNUMV9DQkoJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjY4X1JFQ01JWDFMX0JTVDFfQ0JKX1NISUZUCQk3CisjZGVmaW5lIFJUNTY2OF9SRUNNSVgxTF9CU1QyCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjhfUkVDTUlYMUxfQlNUMl9TSElGVAkJNAorCisvKiBSRUMgUmlnaHQgTWl4ZXIgQ29udHJvbCAyICgweDAwM2UpICovCisjZGVmaW5lIFJUNTY2OF9SRUNNSVgxUl9CU1QyCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjhfUkVDTUlYMVJfQlNUMl9TSElGVAkJNAorCisvKiBEQUMxIERpZ2l0YWwgVm9sdW1lICgweDAwMTkpICovCisjZGVmaW5lIFJUNTY2OF9EQUNfTDFfVk9MX01BU0sJCQkoMHhmZiA8PCA4KQorI2RlZmluZSBSVDU2NjhfREFDX0wxX1ZPTF9TSElGVAkJCTgKKyNkZWZpbmUgUlQ1NjY4X0RBQ19SMV9WT0xfTUFTSwkJCSgweGZmKQorI2RlZmluZSBSVDU2NjhfREFDX1IxX1ZPTF9TSElGVAkJCTAKKworLyogQURDIERpZ2l0YWwgVm9sdW1lIENvbnRyb2wgKDB4MDAxYykgKi8KKyNkZWZpbmUgUlQ1NjY4X0FEQ19MX01VVEVfTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9BRENfTF9NVVRFX1NISUZUCQkJMTUKKyNkZWZpbmUgUlQ1NjY4X0FEQ19MX1ZPTF9NQVNLCQkJKDB4N2YgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X0FEQ19MX1ZPTF9TSElGVAkJCTgKKyNkZWZpbmUgUlQ1NjY4X0FEQ19SX01VVEVfTUFTSwkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjY4X0FEQ19SX01VVEVfU0hJRlQJCQk3CisjZGVmaW5lIFJUNTY2OF9BRENfUl9WT0xfTUFTSwkJCSgweDdmKQorI2RlZmluZSBSVDU2NjhfQURDX1JfVk9MX1NISUZUCQkJMAorCisvKiBTdGVyZW8gQURDIE1peGVyIENvbnRyb2wgKDB4MDAyNikgKi8KKyNkZWZpbmUgUlQ1NjY4X01fU1RPMV9BRENfTDEJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfTV9TVE8xX0FEQ19MMV9TSElGVAkJMTUKKyNkZWZpbmUgUlQ1NjY4X01fU1RPMV9BRENfTDIJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjhfTV9TVE8xX0FEQ19MMl9TSElGVAkJMTQKKyNkZWZpbmUgUlQ1NjY4X1NUTzFfQURDX0wxX1NSQwkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2OF9TVE8xX0FEQ19MMV9TUkNfU0hJRlQJCTEzCisjZGVmaW5lIFJUNTY2OF9TVE8xX0FEQ19MMl9TUkMJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjhfU1RPMV9BRENfTDJfU1JDX1NISUZUCQkxMgorI2RlZmluZSBSVDU2NjhfU1RPMV9BRENfTF9TUkMJCQkoMHgzIDw8IDEwKQorI2RlZmluZSBSVDU2NjhfU1RPMV9BRENfTF9TUkNfU0hJRlQJCTEwCisjZGVmaW5lIFJUNTY2OF9NX1NUTzFfQURDX1IxCQkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2NjhfTV9TVE8xX0FEQ19SMV9TSElGVAkJNworI2RlZmluZSBSVDU2NjhfTV9TVE8xX0FEQ19SMgkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjY4X01fU1RPMV9BRENfUjJfU0hJRlQJCTYKKyNkZWZpbmUgUlQ1NjY4X1NUTzFfQURDX1IxX1NSQwkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjY4X1NUTzFfQURDX1IxX1NSQ19TSElGVAkJNQorI2RlZmluZSBSVDU2NjhfU1RPMV9BRENfUjJfU1JDCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjhfU1RPMV9BRENfUjJfU1JDX1NISUZUCQk0CisjZGVmaW5lIFJUNTY2OF9TVE8xX0FEQ19SX1NSQwkJCSgweDMgPDwgMikKKyNkZWZpbmUgUlQ1NjY4X1NUTzFfQURDX1JfU1JDX1NISUZUCQkyCisKKy8qIEFEQyBNaXhlciB0byBEQUMgTWl4ZXIgQ29udHJvbCAoMHgwMDI5KSAqLworI2RlZmluZSBSVDU2NjhfTV9BRENNSVhfTAkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9NX0FEQ01JWF9MX1NISUZUCQkJMTUKKyNkZWZpbmUgUlQ1NjY4X01fREFDMV9MCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2OF9NX0RBQzFfTF9TSElGVAkJCTE0CisjZGVmaW5lIFJUNTY2OF9NX0FEQ01JWF9SCQkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2NjhfTV9BRENNSVhfUl9TSElGVAkJCTcKKyNkZWZpbmUgUlQ1NjY4X01fREFDMV9SCQkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjY4X01fREFDMV9SX1NISUZUCQkJNgorCisvKiBTdGVyZW8gREFDIE1peGVyIENvbnRyb2wgKDB4MDAyYSkgKi8KKyNkZWZpbmUgUlQ1NjY4X01fREFDX0wxX1NUT19MCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X01fREFDX0wxX1NUT19MX1NISUZUCQkxNQorI2RlZmluZSBSVDU2NjhfTV9EQUNfUjFfU1RPX0wJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjhfTV9EQUNfUjFfU1RPX0xfU0hJRlQJCTEzCisjZGVmaW5lIFJUNTY2OF9NX0RBQ19MMV9TVE9fUgkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjY4X01fREFDX0wxX1NUT19SX1NISUZUCQk3CisjZGVmaW5lIFJUNTY2OF9NX0RBQ19SMV9TVE9fUgkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjY4X01fREFDX1IxX1NUT19SX1NISUZUCQk1CisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgZm9yIERpZ2l0YWwgMSAoMHgwMDYxKSAqLworI2RlZmluZSBSVDU2NjhfUFdSX0kyUzEJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9JMlMxX1NISUZUCQkJMTUKKyNkZWZpbmUgUlQ1NjY4X1BXUl9EQUNfTDEJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjhfUFdSX0RBQ19MMV9TSElGVAkJCTExCisjZGVmaW5lIFJUNTY2OF9QV1JfREFDX1IxCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9EQUNfUjFfU0hJRlQJCQkxMAorI2RlZmluZSBSVDU2NjhfUFdSX0xET19EQUNSRUZfTUFTSwkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2NjhfUFdSX0xET19EQUNSRUZfU0hJRlQJCTgKKyNkZWZpbmUgUlQ1NjY4X1BXUl9MRE9fREFDUkVGX09OCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9QV1JfTERPX0RBQ1JFRl9ET1dOCQkoMHgwIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9QV1JfTERPX1NISUZUCQkJOAorI2RlZmluZSBSVDU2NjhfUFdSX0FEQ19MMQkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9BRENfTDFfU0hJRlQJCQk0CisjZGVmaW5lIFJUNTY2OF9QV1JfQURDX1IxCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjhfUFdSX0FEQ19SMV9TSElGVAkJCTMKKworLyogUG93ZXIgTWFuYWdlbWVudCBmb3IgRGlnaXRhbCAyICgweDAwNjIpICovCisjZGVmaW5lIFJUNTY2OF9QV1JfQURDX1MxRgkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9QV1JfQURDX1MxRl9TSElGVAkJMTUKKyNkZWZpbmUgUlQ1NjY4X1BXUl9EQUNfUzFGCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9EQUNfUzFGX1NISUZUCQkxMAorCisvKiBQb3dlciBNYW5hZ2VtZW50IGZvciBBbmFsb2cgMSAoMHgwMDYzKSAqLworI2RlZmluZSBSVDU2NjhfUFdSX1ZSRUYxCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9WUkVGMV9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9WUkVGMV9TSElGVAkJCTE1CisjZGVmaW5lIFJUNTY2OF9QV1JfRlYxCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2OF9QV1JfRlYxX01BU0sJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjhfUFdSX0ZWMV9TSElGVAkJCTE0CisjZGVmaW5lIFJUNTY2OF9QV1JfVlJFRjIJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjhfUFdSX1ZSRUYyX01BU0sJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjhfUFdSX1ZSRUYyX1NISUZUCQkJMTMKKyNkZWZpbmUgUlQ1NjY4X1BXUl9GVjIJCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjY4X1BXUl9GVjJfTUFTSwkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2OF9QV1JfRlYyX1NISUZUCQkJMTIKKyNkZWZpbmUgUlQ1NjY4X1BXUl9NQgkJCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTY2OF9QV1JfTUJfTUFTSwkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9NQl9TSElGVAkJCTkKKyNkZWZpbmUgUlQ1NjY4X0FNUF9IUF9NQVNLCQkJKDB4MyA8PCAyKQorI2RlZmluZSBSVDU2NjhfQU1QX0hQX1NISUZUCQkJMgorI2RlZmluZSBSVDU2NjhfQU1QX0hQXzFYCQkJKDB4MCA8PCAyKQorI2RlZmluZSBSVDU2NjhfQU1QX0hQXzNYCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjhfQU1QX0hQXzVYCQkJKDB4MyA8PCAyKQorI2RlZmluZSBSVDU2NjhfTERPMV9EVk9fTUFTSwkJCSgweDMpCisjZGVmaW5lIFJUNTY2OF9MRE8xX0RWT19TSElGVAkJCTAKKyNkZWZpbmUgUlQ1NjY4X0xETzFfRFZPXzBfOVYJCQkoMHgwKQorI2RlZmluZSBSVDU2NjhfTERPMV9EVk9fMV8wVgkJCSgweDEpCisjZGVmaW5lIFJUNTY2OF9MRE8xX0RWT18xXzJWCQkJKDB4MikKKyNkZWZpbmUgUlQ1NjY4X0xETzFfRFZPXzFfNFYJCQkoMHgzKQorCisvKiBQb3dlciBNYW5hZ2VtZW50IGZvciBBbmFsb2cgMiAoMHgwMDY0KSAqLworI2RlZmluZSBSVDU2NjhfUFdSX0JTVDEJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9CU1QxX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfUFdSX0JTVDFfU0hJRlQJCQkxNQorI2RlZmluZSBSVDU2NjhfUFdSX0JTVDFfT0ZGCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9CU1QxX09OCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9CU1QyCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2OF9QV1JfQlNUMl9NQVNLCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9CU1QyX1NISUZUCQkJMTQKKyNkZWZpbmUgUlQ1NjY4X1BXUl9NQjEJCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9NQjFfU0hJRlQJCQkxMQorI2RlZmluZSBSVDU2NjhfUFdSX01CMgkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjhfUFdSX01CMl9TSElGVAkJCTEwCisjZGVmaW5lIFJUNTY2OF9QV1JfQlNUMl9PUAkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjY4X1BXUl9CU1QyX09QX01BU0sJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2OF9QV1JfQlNUMl9PUF9TSElGVAkJNgorI2RlZmluZSBSVDU2NjhfUFdSX0pEMQkJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2OF9QV1JfSkQxX01BU0sJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2OF9QV1JfSkQxX1NISUZUCQkJMworI2RlZmluZSBSVDU2NjhfUFdSX0pEMgkJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2OF9QV1JfSkQyX01BU0sJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2OF9QV1JfSkQyX1NISUZUCQkJMgorI2RlZmluZSBSVDU2NjhfUFdSX1JFQ01JWDEJCQkoMHgxIDw8IDEpCisjZGVmaW5lIFJUNTY2OF9QV1JfUkVDTUlYMV9TSElGVAkJMQorI2RlZmluZSBSVDU2NjhfUFdSX1JFQ01JWDIJCQkoMHgxKQorI2RlZmluZSBSVDU2NjhfUFdSX1JFQ01JWDJfU0hJRlQJCTAKKworLyogUG93ZXIgTWFuYWdlbWVudCBmb3IgQW5hbG9nIDMgKDB4MDA2NSkgKi8KKyNkZWZpbmUgUlQ1NjY4X1BXUl9DQkpfTUFTSwkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9DQkpfU0hJRlQJCQk5CisjZGVmaW5lIFJUNTY2OF9QV1JfQ0JKX09GRgkJCSgweDAgPDwgOSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9DQkpfT04JCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTY2OF9QV1JfUExMCQkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjY4X1BXUl9QTExfU0hJRlQJCQk2CisjZGVmaW5lIFJUNTY2OF9QV1JfTERPMgkJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2OF9QV1JfTERPMl9TSElGVAkJCTIKKworLyogUG93ZXIgTWFuYWdlbWVudCBmb3IgVm9sdW1lICgweDAwNjcpICovCisjZGVmaW5lIFJUNTY2OF9QV1JfTUlDX0RFVAkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9NSUNfREVUX1NISUZUCQk1CisKKy8qIE1DTEsgYW5kIFN5c3RlbSBDbG9jayBEZXRlY3Rpb24gQ29udHJvbCAoMHgwMDZiKSAqLworI2RlZmluZSBSVDU2NjhfRU5fQU5BX0NMS19ERVRfTUFTSwkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X0VOX0FOQV9DTEtfREVUX1NISUZUCQkxNQorI2RlZmluZSBSVDU2NjhfRU5fQU5BX0NMS19ERVRfRElTCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfRU5fQU5BX0NMS19ERVRfQVVUTwkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9DTEtfREVUX01BU0sJCQkoMHgxKQorI2RlZmluZSBSVDU2NjhfUFdSX0NMS19ERVRfU0hJRlQJCTAKKyNkZWZpbmUgUlQ1NjY4X1BXUl9DTEtfREVUX0RJUwkJCSgweDApCisjZGVmaW5lIFJUNTY2OF9QV1JfQ0xLX0RFVF9FTgkJCSgweDEpCisKKy8qIEkyUzEgQXVkaW8gU2VyaWFsIERhdGEgUG9ydCBDb250cm9sICgweDAwNzApICovCisjZGVmaW5lIFJUNTY2OF9JMlNfTVNfTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9JMlNfTVNfU0hJRlQJCQkxNQorI2RlZmluZSBSVDU2NjhfSTJTX01TX00JCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X0kyU19NU19TCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9JMlNfQlBfTUFTSwkJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X0kyU19CUF9TSElGVAkJCTgKKyNkZWZpbmUgUlQ1NjY4X0kyU19CUF9OT1IJCQkoMHgwIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9JMlNfQlBfSU5WCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2NjhfSTJTX0RMX01BU0sJCQkoMHgzIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9JMlNfRExfU0hJRlQJCQk0CisjZGVmaW5lIFJUNTY2OF9JMlNfRExfMTYJCQkoMHgwIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9JMlNfRExfMjAJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9JMlNfRExfMjQJCQkoMHgyIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9JMlNfRExfOAkJCQkoMHgzIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9JMlNfREZfTUFTSwkJCSgweDcpCisjZGVmaW5lIFJUNTY2OF9JMlNfREZfU0hJRlQJCQkwCisjZGVmaW5lIFJUNTY2OF9JMlNfREZfSTJTCQkJKDB4MCkKKyNkZWZpbmUgUlQ1NjY4X0kyU19ERl9MRUZUCQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjY4X0kyU19ERl9QQ01fQQkJCSgweDIpCisjZGVmaW5lIFJUNTY2OF9JMlNfREZfUENNX0IJCQkoMHgzKQorI2RlZmluZSBSVDU2NjhfSTJTX0RGX1BDTV9BX04JCQkoMHg2KQorI2RlZmluZSBSVDU2NjhfSTJTX0RGX1BDTV9CX04JCQkoMHg3KQorCisvKiBBREMvREFDIENsb2NrIENvbnRyb2wgMSAoMHgwMDczKSAqLworI2RlZmluZSBSVDU2NjhfSTJTX1BEMV9NQVNLCQkJKDB4NyA8PCAxMikKKyNkZWZpbmUgUlQ1NjY4X0kyU19QRDFfU0hJRlQJCQkxMgorI2RlZmluZSBSVDU2NjhfTV9JMlNfRElWX01BU0sJCQkoMHg3IDw8IDgpCisjZGVmaW5lIFJUNTY2OF9NX0kyU19ESVZfU0hJRlQJCQk4CisjZGVmaW5lIFJUNTY2OF9DTEtfU1JDX01BU0sJCQkoMHgzIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9DTEtfU1JDX01DTEsJCQkoMHgwIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9DTEtfU1JDX1BMTF9PVVQJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9DTEtfU1JDX0RJVgkJCSgweDIgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X0NMS19TUkNfUkMJCQkoMHgzIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9EQUNfT1NSX01BU0sJCQkoMHgzIDw8IDIpCisjZGVmaW5lIFJUNTY2OF9EQUNfT1NSX1NISUZUCQkJMgorI2RlZmluZSBSVDU2NjhfREFDX09TUl8xMjgJCQkoMHgwIDw8IDIpCisjZGVmaW5lIFJUNTY2OF9EQUNfT1NSXzY0CQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjhfREFDX09TUl8zMgkJCSgweDIgPDwgMikKKyNkZWZpbmUgUlQ1NjY4X0FEQ19PU1JfTUFTSwkJCSgweDMpCisjZGVmaW5lIFJUNTY2OF9BRENfT1NSX1NISUZUCQkJMAorI2RlZmluZSBSVDU2NjhfQURDX09TUl8xMjgJCQkoMHgwKQorI2RlZmluZSBSVDU2NjhfQURDX09TUl82NAkJCSgweDEpCisjZGVmaW5lIFJUNTY2OF9BRENfT1NSXzMyCQkJKDB4MikKKworLyogVERNMSBjb250cm9sIDEgKDB4MDA3OCkgKi8KKyNkZWZpbmUgUlQ1NjY4X1RETV9NT0RFX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfVERNX01PREVfU0hJRlQJCQkxNQorI2RlZmluZSBSVDU2NjhfVERNX01PREVfSTJTCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X1RETV9NT0RFX1RETQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9URE1fSU5fQ0hfTUFTSwkJCSgweDMgPDwgMTApCisjZGVmaW5lIFJUNTY2OF9URE1fSU5fQ0hfU0hJRlQJCQkxMAorI2RlZmluZSBSVDU2NjhfVERNX0lOX0NIXzIJCQkoMHgwIDw8IDEwKQorI2RlZmluZSBSVDU2NjhfVERNX0lOX0NIXzQJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjhfVERNX0lOX0NIXzYJCQkoMHgyIDw8IDEwKQorI2RlZmluZSBSVDU2NjhfVERNX0lOX0NIXzgJCQkoMHgzIDw8IDEwKQorI2RlZmluZSBSVDU2NjhfVERNX09VVF9DSF9NQVNLCQkJKDB4MyA8PCA4KQorI2RlZmluZSBSVDU2NjhfVERNX09VVF9DSF9TSElGVAkJCTgKKyNkZWZpbmUgUlQ1NjY4X1RETV9PVVRfQ0hfMgkJCSgweDAgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X1RETV9PVVRfQ0hfNAkJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X1RETV9PVVRfQ0hfNgkJCSgweDIgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X1RETV9PVVRfQ0hfOAkJCSgweDMgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X1RETV9JTl9MRU5fTUFTSwkJCSgweDMgPDwgNikKKyNkZWZpbmUgUlQ1NjY4X1RETV9JTl9MRU5fU0hJRlQJCQk2CisjZGVmaW5lIFJUNTY2OF9URE1fSU5fTEVOXzE2CQkJKDB4MCA8PCA2KQorI2RlZmluZSBSVDU2NjhfVERNX0lOX0xFTl8yMAkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjY4X1RETV9JTl9MRU5fMjQJCQkoMHgyIDw8IDYpCisjZGVmaW5lIFJUNTY2OF9URE1fSU5fTEVOXzMyCQkJKDB4MyA8PCA2KQorI2RlZmluZSBSVDU2NjhfVERNX09VVF9MRU5fTUFTSwkJCSgweDMgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X1RETV9PVVRfTEVOX1NISUZUCQk0CisjZGVmaW5lIFJUNTY2OF9URE1fT1VUX0xFTl8xNgkJCSgweDAgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X1RETV9PVVRfTEVOXzIwCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjhfVERNX09VVF9MRU5fMjQJCQkoMHgyIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9URE1fT1VUX0xFTl8zMgkJCSgweDMgPDwgNCkKKworLyogR2xvYmFsIENsb2NrIENvbnRyb2wgKDB4MDA4MCkgKi8KKyNkZWZpbmUgUlQ1NjY4X1NDTEtfU1JDX01BU0sJCQkoMHgzIDw8IDE0KQorI2RlZmluZSBSVDU2NjhfU0NMS19TUkNfU0hJRlQJCQkxNAorI2RlZmluZSBSVDU2NjhfU0NMS19TUkNfTUNMSwkJCSgweDAgPDwgMTQpCisjZGVmaW5lIFJUNTY2OF9TQ0xLX1NSQ19QTEwxCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjY4X1NDTEtfU1JDX1JDQ0xLCQkJKDB4MiA8PCAxNCkKKyNkZWZpbmUgUlQ1NjY4X1BMTDFfU1JDX01BU0sJCQkoMHg3IDw8IDgpCisjZGVmaW5lIFJUNTY2OF9QTEwxX1NSQ19TSElGVAkJCTgKKyNkZWZpbmUgUlQ1NjY4X1BMTDFfU1JDX01DTEsJCQkoMHgwIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9QTEwxX1NSQ19CQ0xLMQkJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X1BMTDFfUERfTUFTSwkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X1BMTDFfUERfU0hJRlQJCQk0CisKKyNkZWZpbmUgUlQ1NjY4X1BMTF9JTlBfTUFYCQkJNDAwMDAwMDAKKyNkZWZpbmUgUlQ1NjY4X1BMTF9JTlBfTUlOCQkJMjU2MDAwCisvKiBQTEwgTS9OL0sgQ29kZSBDb250cm9sIDEgKDB4MDA4MSkgKi8KKyNkZWZpbmUgUlQ1NjY4X1BMTF9OX01BWAkJCTB4MDAxZmYKKyNkZWZpbmUgUlQ1NjY4X1BMTF9OX01BU0sJCQkoUlQ1NjY4X1BMTF9OX01BWCA8PCA3KQorI2RlZmluZSBSVDU2NjhfUExMX05fU0hJRlQJCQk3CisjZGVmaW5lIFJUNTY2OF9QTExfS19NQVgJCQkweDAwMWYKKyNkZWZpbmUgUlQ1NjY4X1BMTF9LX01BU0sJCQkoUlQ1NjY4X1BMTF9LX01BWCkKKyNkZWZpbmUgUlQ1NjY4X1BMTF9LX1NISUZUCQkJMAorCisvKiBQTEwgTS9OL0sgQ29kZSBDb250cm9sIDIgKDB4MDA4MikgKi8KKyNkZWZpbmUgUlQ1NjY4X1BMTF9NX01BWAkJCTB4MDBmCisjZGVmaW5lIFJUNTY2OF9QTExfTV9NQVNLCQkJKFJUNTY2OF9QTExfTV9NQVggPDwgMTIpCisjZGVmaW5lIFJUNTY2OF9QTExfTV9TSElGVAkJCTEyCisjZGVmaW5lIFJUNTY2OF9QTExfTV9CUAkJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjhfUExMX01fQlBfU0hJRlQJCQkxMQorCisvKiBQTEwgdHJhY2tpbmcgbW9kZSAxICgweDAwODMpICovCisjZGVmaW5lIFJUNTY2OF9JMlMxX0FTUkNfTUFTSwkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2OF9JMlMxX0FTUkNfU0hJRlQJCQkxMworI2RlZmluZSBSVDU2NjhfREFDX1NUTzFfQVNSQ19NQVNLCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjhfREFDX1NUTzFfQVNSQ19TSElGVAkJMTIKKyNkZWZpbmUgUlQ1NjY4X0FEQ19TVE8xX0FTUkNfTUFTSwkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjhfQURDX1NUTzFfQVNSQ19TSElGVAkJNAorCisvKiBQTEwgdHJhY2tpbmcgbW9kZSAyICgweDAwODQpKi8KKyNkZWZpbmUgUlQ1NjY4X0RBX1NUTzFfVFJBQ0tfTUFTSwkJKDB4NyA8PCAxMikKKyNkZWZpbmUgUlQ1NjY4X0RBX1NUTzFfVFJBQ0tfU0hJRlQJCTEyCisjZGVmaW5lIFJUNTY2OF9EQV9TVE8xX1RSQUNLX1NZU0NMSwkJKDB4MCA8PCAxMikKKyNkZWZpbmUgUlQ1NjY4X0RBX1NUTzFfVFJBQ0tfSTJTMQkJKDB4MSA8PCAxMikKKworLyogUExMIHRyYWNraW5nIG1vZGUgMyAoMHgwMDg1KSovCisjZGVmaW5lIFJUNTY2OF9BRF9TVE8xX1RSQUNLX01BU0sJCSgweDcgPDwgMTIpCisjZGVmaW5lIFJUNTY2OF9BRF9TVE8xX1RSQUNLX1NISUZUCQkxMgorI2RlZmluZSBSVDU2NjhfQURfU1RPMV9UUkFDS19TWVNDTEsJCSgweDAgPDwgMTIpCisjZGVmaW5lIFJUNTY2OF9BRF9TVE8xX1RSQUNLX0kyUzEJCSgweDEgPDwgMTIpCisKKy8qIEhQT1VUIENoYXJnZSBwdW1wIGNvbnRyb2wgMSAoMHgwMDkxKSAqLworI2RlZmluZSBSVDU2NjhfT1NXX0hQX0xfTUFTSwkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2OF9PU1dfSFBfTF9TSElGVAkJCTExCisjZGVmaW5lIFJUNTY2OF9PU1dfSFBfTF9FTgkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2OF9PU1dfSFBfTF9ESVMJCQkoMHgwIDw8IDExKQorI2RlZmluZSBSVDU2NjhfT1NXX0hQX1JfTUFTSwkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2OF9PU1dfSFBfUl9TSElGVAkJCTEwCisjZGVmaW5lIFJUNTY2OF9PU1dfSFBfUl9FTgkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2OF9PU1dfSFBfUl9ESVMJCQkoMHgwIDw8IDEwKQorI2RlZmluZSBSVDU2NjhfU0VMX1BNX0hQX01BU0sJCQkoMHgzIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9TRUxfUE1fSFBfU0hJRlQJCQk4CisjZGVmaW5lIFJUNTY2OF9TRUxfUE1fSFBfMF82CQkJKDB4MCA8PCA4KQorI2RlZmluZSBSVDU2NjhfU0VMX1BNX0hQXzBfOQkJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X1NFTF9QTV9IUF8xXzgJCQkoMHgyIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9TRUxfUE1fSFBfSElHSAkJCSgweDMgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X09WQ0RfSFBfTUFTSwkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjY4X09WQ0RfSFBfU0hJRlQJCQkyCisjZGVmaW5lIFJUNTY2OF9PVkNEX0hQX0VOCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjhfT1ZDRF9IUF9ESVMJCQkoMHgwIDw8IDIpCisKKy8qIFJDIENsb2NrIENvbnRyb2wgKDB4MDA5NCkgKi8KKyNkZWZpbmUgUlQ1NjY4X0RJR18yNU1fQ0xLX01BU0sJCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTY2OF9ESUdfMjVNX0NMS19TSElGVAkJOQorI2RlZmluZSBSVDU2NjhfRElHXzI1TV9DTEtfRElTCQkJKDB4MCA8PCA5KQorI2RlZmluZSBSVDU2NjhfRElHXzI1TV9DTEtfRU4JCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTY2OF9ESUdfMU1fQ0xLX01BU0sJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9ESUdfMU1fQ0xLX1NISUZUCQkJOAorI2RlZmluZSBSVDU2NjhfRElHXzFNX0NMS19ESVMJCQkoMHgwIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9ESUdfMU1fQ0xLX0VOCQkJKDB4MSA8PCA4KQorCisvKiBBdXRvIFR1cm4gT24gMU0gUkMgQ0xLICgweDAwOWYpICovCisjZGVmaW5lIFJUNTY2OF9JUlFfUE9XX1NBVl9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X0lSUV9QT1dfU0FWX1NISUZUCQkxNQorI2RlZmluZSBSVDU2NjhfSVJRX1BPV19TQVZfRElTCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X0lSUV9QT1dfU0FWX0VOCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X0lSUV9QT1dfU0FWX0pEMV9NQVNLCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjhfSVJRX1BPV19TQVZfSkQxX1NISUZUCQkxNAorI2RlZmluZSBSVDU2NjhfSVJRX1BPV19TQVZfSkQxX0RJUwkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgUlQ1NjY4X0lSUV9QT1dfU0FWX0pEMV9FTgkJKDB4MSA8PCAxNCkKKworLyogSVJRIENvbnRyb2wgMSAoMHgwMGI2KSAqLworI2RlZmluZSBSVDU2NjhfRU5fQ0JfSkRfTUFTSwkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjY4X0VOX0NCX0pEX1NISUZUCQkJMworI2RlZmluZSBSVDU2NjhfRU5fQ0JfSkRfRU4JCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2OF9FTl9DQl9KRF9ESVMJCQkoMHgwIDw8IDMpCisKKy8qIElSUSBDb250cm9sIDMgKDB4MDBiOCkgKi8KKyNkZWZpbmUgUlQ1NjY4X0VOX0lSUV9JTkxJTkVfTUFTSwkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjhfRU5fSVJRX0lOTElORV9TSElGVAkJNgorI2RlZmluZSBSVDU2NjhfRU5fSVJRX0lOTElORV9CWVAJCSgweDAgPDwgNikKKyNkZWZpbmUgUlQ1NjY4X0VOX0lSUV9JTkxJTkVfTk9SCQkoMHgxIDw8IDYpCisKKy8qIEdQSU8gQ29udHJvbCAxICgweDAwYzApICovCisjZGVmaW5lIFJUNTY2OF9HUDFfUElOX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfR1AxX1BJTl9TSElGVAkJCTE1CisjZGVmaW5lIFJUNTY2OF9HUDFfUElOX0dQSU8xCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X0dQMV9QSU5fSVJRCQkJKDB4MSA8PCAxNSkKKworLyogR1BJTyBDb250cm9sIDIgKDB4MDBjMSkgKi8KKyNkZWZpbmUgUlQ1NjY4X0dQNF9QSU5fQ09ORl9NQVNLCQkoMHgxIDw8IDUpCisjZGVmaW5lIFJUNTY2OF9HUDRfUElOX0NPTkZfU0hJRlQJCTUKKyNkZWZpbmUgUlQ1NjY4X0dQNF9QSU5fQ09ORl9JTlBVVAkJKDB4MCA8PCA1KQorI2RlZmluZSBSVDU2NjhfR1A0X1BJTl9DT05GX09VVFBVVAkJKDB4MSA8PCA1KQorCisvKiBHUElPIENvbnRyb2wgMiAoMHgwMGMyKSAqLworI2RlZmluZSBSVDU2NjhfR1A4X1BJTl9DT05GX01BU0sJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2OF9HUDhfUElOX0NPTkZfU0hJRlQJCTEzCisjZGVmaW5lIFJUNTY2OF9HUDhfUElOX0NPTkZfSU5QVVQJCSgweDAgPDwgMTMpCisjZGVmaW5lIFJUNTY2OF9HUDhfUElOX0NPTkZfT1VUUFVUCQkoMHgxIDw8IDEzKQorCisvKiA0IEJ1dHRvbnMgSW5saW5lIENvbW1hbmQgRnVuY3Rpb24gMSAoMHgwMGRmKSAqLworI2RlZmluZSBSVDU2NjhfNEJUTl9DTEtfREVCX01BU0sJCSgweDMgPDwgMikKKyNkZWZpbmUgUlQ1NjY4XzRCVE5fQ0xLX0RFQl9TSElGVAkJMgorI2RlZmluZSBSVDU2NjhfNEJUTl9DTEtfREVCXzhNUwkJCSgweDAgPDwgMikKKyNkZWZpbmUgUlQ1NjY4XzRCVE5fQ0xLX0RFQl8xNk1TCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2OF80QlROX0NMS19ERUJfMzJNUwkJKDB4MiA8PCAyKQorI2RlZmluZSBSVDU2NjhfNEJUTl9DTEtfREVCXzY1TVMJCSgweDMgPDwgMikKKworLyogSW5saW5lIENvbW1hbmQgRnVuY3Rpb24gNiAoMHgwMGUwKSAqLworI2RlZmluZSBSVDU2NjhfRU5fNEJUTl9JTkxfTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9FTl80QlROX0lOTF9TSElGVAkJMTUKKyNkZWZpbmUgUlQ1NjY4X0VOXzRCVE5fSU5MX0RJUwkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9FTl80QlROX0lOTF9FTgkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9SRVNFVF80QlROX0lOTF9NQVNLCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjhfUkVTRVRfNEJUTl9JTkxfU0hJRlQJCTE0CisjZGVmaW5lIFJUNTY2OF9SRVNFVF80QlROX0lOTF9SRVNFVAkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgUlQ1NjY4X1JFU0VUXzRCVE5fSU5MX05PUgkJKDB4MSA8PCAxNCkKKworLyogRGlnaXRhbCBNaXNjIENvbnRyb2wgKDB4MDBmYSkgKi8KKyNkZWZpbmUgUlQ1NjY4X0RJR19HQVRFX0NUUkxfTUFTSwkJMHgxCisjZGVmaW5lIFJUNTY2OF9ESUdfR0FURV9DVFJMX1NISUZUCQkoMCkKKyNkZWZpbmUgUlQ1NjY4X0RJR19HQVRFX0NUUkxfRElTCQkweDAKKyNkZWZpbmUgUlQ1NjY4X0RJR19HQVRFX0NUUkxfRU4JCQkweDEKKworLyogQ2hvcHBlciBhbmQgQ2xvY2sgY29udHJvbCBmb3IgREFDIEwgKDB4MDEzYSkqLworI2RlZmluZSBSVDU2NjhfQ0tYRU5fREFDMV9NQVNLCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjY4X0NLWEVOX0RBQzFfU0hJRlQJCQkxMworI2RlZmluZSBSVDU2NjhfQ0tHRU5fREFDMV9NQVNLCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjY4X0NLR0VOX0RBQzFfU0hJRlQJCQkxMgorCisvKiBDaG9wcGVyIGFuZCBDbG9jayBjb250cm9sIGZvciBBREMgKDB4MDEzYikqLworI2RlZmluZSBSVDU2NjhfQ0tYRU5fQURDQ19NQVNLCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjY4X0NLWEVOX0FEQ0NfU0hJRlQJCQkxMworI2RlZmluZSBSVDU2NjhfQ0tHRU5fQURDQ19NQVNLCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjY4X0NLR0VOX0FEQ0NfU0hJRlQJCQkxMgorCisvKiBIUCBCZWhhdmlvciBMb2dpYyBDb250cm9sIDIgKDB4MDFkYikgKi8KKyNkZWZpbmUgUlQ1NjY4X0hQX1NJR19TUkMxX01BU0sJCQkoMHgzKQorI2RlZmluZSBSVDU2NjhfSFBfU0lHX1NSQzFfU0hJRlQJCTAKKyNkZWZpbmUgUlQ1NjY4X0hQX1NJR19TUkMxX0hQX0RDCQkoMHgwKQorI2RlZmluZSBSVDU2NjhfSFBfU0lHX1NSQzFfSFBfQ0FMSUIJCSgweDEpCisjZGVmaW5lIFJUNTY2OF9IUF9TSUdfU1JDMV9SRUcJCQkoMHgyKQorI2RlZmluZSBSVDU2NjhfSFBfU0lHX1NSQzFfU0lMRU5DRQkJKDB4MykKKworLyogUlQ1NjYzIHNwZWNpZmljIHJlZ2lzdGVyICovCisjZGVmaW5lIFJUNTY2M19IUF9PVVRfRU4JCQkweDAwMDIKKyNkZWZpbmUgUlQ1NjYzX0hQX0xDSF9EUkUJCQkweDAwMDUKKyNkZWZpbmUgUlQ1NjYzX0hQX1JDSF9EUkUJCQkweDAwMDYKKyNkZWZpbmUgUlQ1NjYzX0NBTElCX0JTVAkJCTB4MDAwYQorI2RlZmluZSBSVDU2NjNfUkVDTUlYCQkJCTB4MDAxMAorI2RlZmluZSBSVDU2NjNfU0lMX0RFVF9DVEwJCQkweDAwMTUKKyNkZWZpbmUgUlQ1NjYzX1BXUl9TQVZfU0lMREVUCQkJMHgwMDE2CisjZGVmaW5lIFJUNTY2M19TSURFVE9ORV9DVEwJCQkweDAwMTgKKyNkZWZpbmUgUlQ1NjYzX1NUTzFfREFDX0RJR19WT0wJCQkweDAwMTkKKyNkZWZpbmUgUlQ1NjYzX1NUTzFfQURDX0RJR19WT0wJCQkweDAwMWMKKyNkZWZpbmUgUlQ1NjYzX1NUTzFfQk9PU1QJCQkweDAwMWYKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9HQUlOXzEJCQkweDAwMjIKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9HQUlOXzIJCQkweDAwMjMKKyNkZWZpbmUgUlQ1NjYzX1NUTzFfQURDX01JWEVSCQkJMHgwMDI2CisjZGVmaW5lIFJUNTY2M19BRF9EQV9NSVhFUgkJCTB4MDAyOQorI2RlZmluZSBSVDU2NjNfU1RPX0RBQ19NSVhFUgkJCTB4MDAyYQorI2RlZmluZSBSVDU2NjNfRElHX1NJREVfTUlYRVIJCQkweDAwMmMKKyNkZWZpbmUgUlQ1NjYzX0JZUEFTU19TVE9fREFDCQkJMHgwMDJkCisjZGVmaW5lIFJUNTY2M19DQUxJQl9SRUNfTUlYCQkJMHgwMDQwCisjZGVmaW5lIFJUNTY2M19QV1JfRElHXzEJCQkweDAwNjEKKyNkZWZpbmUgUlQ1NjYzX1BXUl9ESUdfMgkJCTB4MDA2MgorI2RlZmluZSBSVDU2NjNfUFdSX0FOTEdfMQkJCTB4MDA2MworI2RlZmluZSBSVDU2NjNfUFdSX0FOTEdfMgkJCTB4MDA2NAorI2RlZmluZSBSVDU2NjNfUFdSX0FOTEdfMwkJCTB4MDA2NQorI2RlZmluZSBSVDU2NjNfUFdSX01JWEVSCQkJMHgwMDY2CisjZGVmaW5lIFJUNTY2M19TSUdfQ0xLX0RFVAkJCTB4MDA2YgorI2RlZmluZSBSVDU2NjNfUFJFX0RJVl9HQVRJTkdfMQkJCTB4MDA2ZQorI2RlZmluZSBSVDU2NjNfUFJFX0RJVl9HQVRJTkdfMgkJCTB4MDA2ZgorI2RlZmluZSBSVDU2NjNfSTJTMV9TRFAJCQkJMHgwMDcwCisjZGVmaW5lIFJUNTY2M19BRERBX0NMS18xCQkJMHgwMDczCisjZGVmaW5lIFJUNTY2M19BRERBX1JTVAkJCQkweDAwNzQKKyNkZWZpbmUgUlQ1NjYzX0ZSQUNfRElWXzEJCQkweDAwNzUKKyNkZWZpbmUgUlQ1NjYzX0ZSQUNfRElWXzIJCQkweDAwNzYKKyNkZWZpbmUgUlQ1NjYzX1RETV8xCQkJCTB4MDA3NworI2RlZmluZSBSVDU2NjNfVERNXzIJCQkJMHgwMDc4CisjZGVmaW5lIFJUNTY2M19URE1fMwkJCQkweDAwNzkKKyNkZWZpbmUgUlQ1NjYzX1RETV80CQkJCTB4MDA3YQorI2RlZmluZSBSVDU2NjNfVERNXzUJCQkJMHgwMDdiCisjZGVmaW5lIFJUNTY2M19HTEJfQ0xLCQkJCTB4MDA4MAorI2RlZmluZSBSVDU2NjNfUExMXzEJCQkJMHgwMDgxCisjZGVmaW5lIFJUNTY2M19QTExfMgkJCQkweDAwODIKKyNkZWZpbmUgUlQ1NjYzX0FTUkNfMQkJCQkweDAwODMKKyNkZWZpbmUgUlQ1NjYzX0FTUkNfMgkJCQkweDAwODQKKyNkZWZpbmUgUlQ1NjYzX0FTUkNfNAkJCQkweDAwODYKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZX1JFRwkJCTB4MDA4NworI2RlZmluZSBSVDU2NjNfQVNSQ184CQkJCTB4MDA4YQorI2RlZmluZSBSVDU2NjNfQVNSQ185CQkJCTB4MDA4YgorI2RlZmluZSBSVDU2NjNfQVNSQ18xMQkJCQkweDAwOGMKKyNkZWZpbmUgUlQ1NjYzX0RFUE9QXzEJCQkJMHgwMDhlCisjZGVmaW5lIFJUNTY2M19ERVBPUF8yCQkJCTB4MDA4ZgorI2RlZmluZSBSVDU2NjNfREVQT1BfMwkJCQkweDAwOTAKKyNkZWZpbmUgUlQ1NjYzX0hQX0NIQVJHRV9QVU1QXzEJCQkweDAwOTEKKyNkZWZpbmUgUlQ1NjYzX0hQX0NIQVJHRV9QVU1QXzIJCQkweDAwOTIKKyNkZWZpbmUgUlQ1NjYzX01JQ0JJQVNfMQkJCTB4MDA5MworI2RlZmluZSBSVDU2NjNfUkNfQ0xLCQkJCTB4MDA5NAorI2RlZmluZSBSVDU2NjNfQVNSQ18xMV8yCQkJMHgwMDk3CisjZGVmaW5lIFJUNTY2M19EVU1NWV9SRUdfMgkJCTB4MDA5OAorI2RlZmluZSBSVDU2NjNfUkVDX1BBVEhfR0FJTgkJCTB4MDA5YQorI2RlZmluZSBSVDU2NjNfQVVUT18xTVJDX0NMSwkJCTB4MDA5ZgorI2RlZmluZSBSVDU2NjNfQURDX0VRXzEJCQkJMHgwMGFlCisjZGVmaW5lIFJUNTY2M19BRENfRVFfMgkJCQkweDAwYWYKKyNkZWZpbmUgUlQ1NjYzX0lSUV8xCQkJCTB4MDBiNgorI2RlZmluZSBSVDU2NjNfSVJRXzIJCQkJMHgwMGI3CisjZGVmaW5lIFJUNTY2M19JUlFfMwkJCQkweDAwYjgKKyNkZWZpbmUgUlQ1NjYzX0lSUV80CQkJCTB4MDBiYQorI2RlZmluZSBSVDU2NjNfSVJRXzUJCQkJMHgwMGJiCisjZGVmaW5lIFJUNTY2M19JTlRfU1RfMQkJCQkweDAwYmUKKyNkZWZpbmUgUlQ1NjYzX0lOVF9TVF8yCQkJCTB4MDBiZgorI2RlZmluZSBSVDU2NjNfR1BJT18xCQkJCTB4MDBjMAorI2RlZmluZSBSVDU2NjNfR1BJT18yCQkJCTB4MDBjMQorI2RlZmluZSBSVDU2NjNfR1BJT19TVEEJCQkJMHgwMGM1CisjZGVmaW5lIFJUNTY2M19TSU5fR0VOXzEJCQkweDAwY2IKKyNkZWZpbmUgUlQ1NjYzX1NJTl9HRU5fMgkJCTB4MDBjYworI2RlZmluZSBSVDU2NjNfU0lOX0dFTl8zCQkJMHgwMGNkCisjZGVmaW5lIFJUNTY2M19TT0ZfVk9MX1pDMQkJCTB4MDBkOQorI2RlZmluZSBSVDU2NjNfSUxfQ01EXzEJCQkJMHgwMGRiCisjZGVmaW5lIFJUNTY2M19JTF9DTURfMgkJCQkweDAwZGMKKyNkZWZpbmUgUlQ1NjYzX0lMX0NNRF8zCQkJCTB4MDBkZAorI2RlZmluZSBSVDU2NjNfSUxfQ01EXzQJCQkJMHgwMGRlCisjZGVmaW5lIFJUNTY2M19JTF9DTURfNQkJCQkweDAwZGYKKyNkZWZpbmUgUlQ1NjYzX0lMX0NNRF82CQkJCTB4MDBlMAorI2RlZmluZSBSVDU2NjNfSUxfQ01EXzcJCQkJMHgwMGUxCisjZGVmaW5lIFJUNTY2M19JTF9DTURfOAkJCQkweDAwZTIKKyNkZWZpbmUgUlQ1NjYzX0lMX0NNRF9QV1JTQVYxCQkJMHgwMGU0CisjZGVmaW5lIFJUNTY2M19JTF9DTURfUFdSU0FWMgkJCTB4MDBlNQorI2RlZmluZSBSVDU2NjNfRU1fSkFDS19UWVBFXzEJCQkweDAwZTYKKyNkZWZpbmUgUlQ1NjYzX0VNX0pBQ0tfVFlQRV8yCQkJMHgwMGU3CisjZGVmaW5lIFJUNTY2M19FTV9KQUNLX1RZUEVfMwkJCTB4MDBlOAorI2RlZmluZSBSVDU2NjNfRU1fSkFDS19UWVBFXzQJCQkweDAwZTkKKyNkZWZpbmUgUlQ1NjYzX0VNX0pBQ0tfVFlQRV81CQkJMHgwMGVhCisjZGVmaW5lIFJUNTY2M19FTV9KQUNLX1RZUEVfNgkJCTB4MDBlYgorI2RlZmluZSBSVDU2NjNfU1RPMV9IUEZfQURKMQkJCTB4MDBlYworI2RlZmluZSBSVDU2NjNfU1RPMV9IUEZfQURKMgkJCTB4MDBlZAorI2RlZmluZSBSVDU2NjNfRkFTVF9PRkZfTUlDQklBUwkJCTB4MDBmNAorI2RlZmluZSBSVDU2NjNfSkRfQ1RSTDEJCQkJMHgwMGY2CisjZGVmaW5lIFJUNTY2M19KRF9DVFJMMgkJCQkweDAwZjgKKyNkZWZpbmUgUlQ1NjYzX0RJR19NSVNDCQkJCTB4MDBmYQorI2RlZmluZSBSVDU2NjNfRElHX1ZPTF9aQ0QJCQkweDAxMDAKKyNkZWZpbmUgUlQ1NjYzX0FOQV9CSUFTX0NVUl8xCQkJMHgwMTA4CisjZGVmaW5lIFJUNTY2M19BTkFfQklBU19DVVJfMgkJCTB4MDEwOQorI2RlZmluZSBSVDU2NjNfQU5BX0JJQVNfQ1VSXzMJCQkweDAxMGEKKyNkZWZpbmUgUlQ1NjYzX0FOQV9CSUFTX0NVUl80CQkJMHgwMTBiCisjZGVmaW5lIFJUNTY2M19BTkFfQklBU19DVVJfNQkJCTB4MDEwYworI2RlZmluZSBSVDU2NjNfQU5BX0JJQVNfQ1VSXzYJCQkweDAxMGQKKyNkZWZpbmUgUlQ1NjYzX0JJQVNfQ1VSXzUJCQkweDAxMGUKKyNkZWZpbmUgUlQ1NjYzX0JJQVNfQ1VSXzYJCQkweDAxMGYKKyNkZWZpbmUgUlQ1NjYzX0JJQVNfQ1VSXzcJCQkweDAxMTAKKyNkZWZpbmUgUlQ1NjYzX0JJQVNfQ1VSXzgJCQkweDAxMTEKKyNkZWZpbmUgUlQ1NjYzX0RBQ1JFRl9MRE8JCQkweDAxMTIKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZX1JFR18zCQkJMHgwMTEzCisjZGVmaW5lIFJUNTY2M19CSUFTX0NVUl85CQkJMHgwMTE0CisjZGVmaW5lIFJUNTY2M19EVU1NWV9SRUdfNAkJCTB4MDExNgorI2RlZmluZSBSVDU2NjNfVlJFRkFESl9PUAkJCTB4MDExNworI2RlZmluZSBSVDU2NjNfVlJFRl9SRUNNSVgJCQkweDAxMTgKKyNkZWZpbmUgUlQ1NjYzX0NIQVJHRV9QVU1QXzEJCQkweDAxMjUKKyNkZWZpbmUgUlQ1NjYzX0NIQVJHRV9QVU1QXzFfMgkJCTB4MDEyNgorI2RlZmluZSBSVDU2NjNfQ0hBUkdFX1BVTVBfMV8zCQkJMHgwMTI3CisjZGVmaW5lIFJUNTY2M19DSEFSR0VfUFVNUF8yCQkJMHgwMTI4CisjZGVmaW5lIFJUNTY2M19ESUdfSU5fUElOMQkJCTB4MDEzMgorI2RlZmluZSBSVDU2NjNfUEFEX0RSVl9DVEwJCQkweDAxMzcKKyNkZWZpbmUgUlQ1NjYzX1BMTF9JTlRfUkVHCQkJMHgwMTM5CisjZGVmaW5lIFJUNTY2M19DSE9QX0RBQ19MCQkJMHgwMTNhCisjZGVmaW5lIFJUNTY2M19DSE9QX0FEQwkJCQkweDAxM2IKKyNkZWZpbmUgUlQ1NjYzX0NBTElCX0FEQwkJCTB4MDEzYworI2RlZmluZSBSVDU2NjNfQ0hPUF9EQUNfUgkJCTB4MDEzZAorI2RlZmluZSBSVDU2NjNfRFVNTVlfQ1RMX0RBQ0xSCQkJMHgwMTNlCisjZGVmaW5lIFJUNTY2M19EVU1NWV9SRUdfNQkJCTB4MDE0MAorI2RlZmluZSBSVDU2NjNfU09GVF9SQU1QCQkJMHgwMTQxCisjZGVmaW5lIFJUNTY2M19URVNUX01PREVfMQkJCTB4MDE0NAorI2RlZmluZSBSVDU2NjNfVEVTVF9NT0RFXzIJCQkweDAxNDUKKyNkZWZpbmUgUlQ1NjYzX1RFU1RfTU9ERV8zCQkJMHgwMTQ2CisjZGVmaW5lIFJUNTY2M19TVE9fRFJFXzEJCQkweDAxNjAKKyNkZWZpbmUgUlQ1NjYzX1NUT19EUkVfMgkJCTB4MDE2MQorI2RlZmluZSBSVDU2NjNfU1RPX0RSRV8zCQkJMHgwMTYyCisjZGVmaW5lIFJUNTY2M19TVE9fRFJFXzQJCQkweDAxNjMKKyNkZWZpbmUgUlQ1NjYzX1NUT19EUkVfNQkJCTB4MDE2NAorI2RlZmluZSBSVDU2NjNfU1RPX0RSRV82CQkJMHgwMTY1CisjZGVmaW5lIFJUNTY2M19TVE9fRFJFXzcJCQkweDAxNjYKKyNkZWZpbmUgUlQ1NjYzX1NUT19EUkVfOAkJCTB4MDE2NworI2RlZmluZSBSVDU2NjNfU1RPX0RSRV85CQkJMHgwMTY4CisjZGVmaW5lIFJUNTY2M19TVE9fRFJFXzEwCQkJMHgwMTY5CisjZGVmaW5lIFJUNTY2M19NSUNfREVDUk9fMQkJCTB4MDE4MAorI2RlZmluZSBSVDU2NjNfTUlDX0RFQ1JPXzIJCQkweDAxODEKKyNkZWZpbmUgUlQ1NjYzX01JQ19ERUNST18zCQkJMHgwMTgyCisjZGVmaW5lIFJUNTY2M19NSUNfREVDUk9fNAkJCTB4MDE4MworI2RlZmluZSBSVDU2NjNfTUlDX0RFQ1JPXzUJCQkweDAxODQKKyNkZWZpbmUgUlQ1NjYzX01JQ19ERUNST182CQkJMHgwMTg1CisjZGVmaW5lIFJUNTY2M19IUF9ERUNST18xCQkJMHgwMWIwCisjZGVmaW5lIFJUNTY2M19IUF9ERUNST18yCQkJMHgwMWIxCisjZGVmaW5lIFJUNTY2M19IUF9ERUNST18zCQkJMHgwMWIyCisjZGVmaW5lIFJUNTY2M19IUF9ERUNST180CQkJMHgwMWIzCisjZGVmaW5lIFJUNTY2M19IUF9ERUNPVVAJCQkweDAxYjQKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fTUFQOAkJCTB4MDFiNQorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl9NQVA5CQkJMHgwMWI2CisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOX01BUDEwCQkJMHgwMWI3CisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOX01BUDExCQkJMHgwMWI4CisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzEJCQkweDAxYzAKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fMgkJCTB4MDFjMQorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl8zCQkJMHgwMWMyCisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzQJCQkweDAxYzMKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fNQkJCTB4MDFjNAorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl82CQkJMHgwMWM1CisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzcJCQkweDAxYzYKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fOAkJCTB4MDFjNworI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl85CQkJMHgwMWM4CisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzEwCQkJMHgwMWM5CisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzExCQkJMHgwMWNhCisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzEyCQkJMHgwMWNiCisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzEzCQkJMHgwMWNjCisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzE0CQkJMHgwMWNkCisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzE1CQkJMHgwMWNlCisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzE2CQkJMHgwMWNmCisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzE3CQkJMHgwMWQwCisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzE4CQkJMHgwMWQxCisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzE5CQkJMHgwMWQyCisjZGVmaW5lIFJUNTY2M19IUF9JTVBTRU5fRElHNQkJCTB4MDFkMworI2RlZmluZSBSVDU2NjNfSFBfSU1QU0VOX01BUDEJCQkweDAxZDQKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUFNFTl9NQVAyCQkJMHgwMWQ1CisjZGVmaW5lIFJUNTY2M19IUF9JTVBTRU5fTUFQMwkJCTB4MDFkNgorI2RlZmluZSBSVDU2NjNfSFBfSU1QU0VOX01BUDQJCQkweDAxZDcKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUFNFTl9NQVA1CQkJMHgwMWQ4CisjZGVmaW5lIFJUNTY2M19IUF9JTVBTRU5fTUFQNwkJCTB4MDFkOQorI2RlZmluZSBSVDU2NjNfSFBfTE9HSUNfMQkJCTB4MDFkYQorI2RlZmluZSBSVDU2NjNfSFBfTE9HSUNfMgkJCTB4MDFkYgorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfMQkJCTB4MDFkZAorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfMV8xCQkJMHgwMWRlCisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl8yCQkJMHgwMWRmCisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl8zCQkJMHgwMWUwCisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl80CQkJMHgwMWUxCisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl81CQkJMHgwMWUyCisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl81XzEJCQkweDAxZTMKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCXzYJCQkweDAxZTQKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCXzcJCQkweDAxZTUKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCXzkJCQkweDAxZTYKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCXzEwCQkJMHgwMWU3CisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl8xMQkJCTB4MDFlOAorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfU1QxCQkJMHgwMWVhCisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl9TVDIJCQkweDAxZWIKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCX1NUMwkJCTB4MDFlYworI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfU1Q0CQkJMHgwMWVkCisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl9TVDUJCQkweDAxZWUKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCX1NUNgkJCTB4MDFlZgorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfU1Q3CQkJMHgwMWYwCisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl9TVDgJCQkweDAxZjEKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCX1NUOQkJCTB4MDFmMgorI2RlZmluZSBSVDU2NjNfSFBfQU1QX0RFVAkJCTB4MDIwMAorI2RlZmluZSBSVDU2NjNfRFVNTVlfUkVHXzYJCQkweDAyMDEKKyNkZWZpbmUgUlQ1NjYzX0hQX0JJQVMJCQkJMHgwMjAyCisjZGVmaW5lIFJUNTY2M19DQkpfMQkJCQkweDAyNTAKKyNkZWZpbmUgUlQ1NjYzX0NCSl8yCQkJCTB4MDI1MQorI2RlZmluZSBSVDU2NjNfQ0JKXzMJCQkJMHgwMjUyCisjZGVmaW5lIFJUNTY2M19EVU1NWV8xCQkJCTB4MDJmYQorI2RlZmluZSBSVDU2NjNfRFVNTVlfMgkJCQkweDAyZmIKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZXzMJCQkJMHgwMmZjCisjZGVmaW5lIFJUNTY2M19BTkFfSkQJCQkJMHgwMzAwCisjZGVmaW5lIFJUNTY2M19BRENfTENIX0xQRjFfQTEJCQkweDAzZDAKKyNkZWZpbmUgUlQ1NjYzX0FEQ19SQ0hfTFBGMV9BMQkJCTB4MDNkMQorI2RlZmluZSBSVDU2NjNfQURDX0xDSF9MUEYxX0gwCQkJMHgwM2QyCisjZGVmaW5lIFJUNTY2M19BRENfUkNIX0xQRjFfSDAJCQkweDAzZDMKKyNkZWZpbmUgUlQ1NjYzX0FEQ19MQ0hfQlBGMV9BMQkJCTB4MDNkNAorI2RlZmluZSBSVDU2NjNfQURDX1JDSF9CUEYxX0ExCQkJMHgwM2Q1CisjZGVmaW5lIFJUNTY2M19BRENfTENIX0JQRjFfQTIJCQkweDAzZDYKKyNkZWZpbmUgUlQ1NjYzX0FEQ19SQ0hfQlBGMV9BMgkJCTB4MDNkNworI2RlZmluZSBSVDU2NjNfQURDX0xDSF9CUEYxX0gwCQkJMHgwM2Q4CisjZGVmaW5lIFJUNTY2M19BRENfUkNIX0JQRjFfSDAJCQkweDAzZDkKKyNkZWZpbmUgUlQ1NjYzX0FEQ19MQ0hfQlBGMl9BMQkJCTB4MDNkYQorI2RlZmluZSBSVDU2NjNfQURDX1JDSF9CUEYyX0ExCQkJMHgwM2RiCisjZGVmaW5lIFJUNTY2M19BRENfTENIX0JQRjJfQTIJCQkweDAzZGMKKyNkZWZpbmUgUlQ1NjYzX0FEQ19SQ0hfQlBGMl9BMgkJCTB4MDNkZAorI2RlZmluZSBSVDU2NjNfQURDX0xDSF9CUEYyX0gwCQkJMHgwM2RlCisjZGVmaW5lIFJUNTY2M19BRENfUkNIX0JQRjJfSDAJCQkweDAzZGYKKyNkZWZpbmUgUlQ1NjYzX0FEQ19MQ0hfQlBGM19BMQkJCTB4MDNlMAorI2RlZmluZSBSVDU2NjNfQURDX1JDSF9CUEYzX0ExCQkJMHgwM2UxCisjZGVmaW5lIFJUNTY2M19BRENfTENIX0JQRjNfQTIJCQkweDAzZTIKKyNkZWZpbmUgUlQ1NjYzX0FEQ19SQ0hfQlBGM19BMgkJCTB4MDNlMworI2RlZmluZSBSVDU2NjNfQURDX0xDSF9CUEYzX0gwCQkJMHgwM2U0CisjZGVmaW5lIFJUNTY2M19BRENfUkNIX0JQRjNfSDAJCQkweDAzZTUKKyNkZWZpbmUgUlQ1NjYzX0FEQ19MQ0hfQlBGNF9BMQkJCTB4MDNlNgorI2RlZmluZSBSVDU2NjNfQURDX1JDSF9CUEY0X0ExCQkJMHgwM2U3CisjZGVmaW5lIFJUNTY2M19BRENfTENIX0JQRjRfQTIJCQkweDAzZTgKKyNkZWZpbmUgUlQ1NjYzX0FEQ19SQ0hfQlBGNF9BMgkJCTB4MDNlOQorI2RlZmluZSBSVDU2NjNfQURDX0xDSF9CUEY0X0gwCQkJMHgwM2VhCisjZGVmaW5lIFJUNTY2M19BRENfUkNIX0JQRjRfSDAJCQkweDAzZWIKKyNkZWZpbmUgUlQ1NjYzX0FEQ19MQ0hfSFBGMV9BMQkJCTB4MDNlYworI2RlZmluZSBSVDU2NjNfQURDX1JDSF9IUEYxX0ExCQkJMHgwM2VkCisjZGVmaW5lIFJUNTY2M19BRENfTENIX0hQRjFfSDAJCQkweDAzZWUKKyNkZWZpbmUgUlQ1NjYzX0FEQ19SQ0hfSFBGMV9IMAkJCTB4MDNlZgorI2RlZmluZSBSVDU2NjNfQURDX0VRX1BSRV9WT0xfTAkJCTB4MDNmMAorI2RlZmluZSBSVDU2NjNfQURDX0VRX1BSRV9WT0xfUgkJCTB4MDNmMQorI2RlZmluZSBSVDU2NjNfQURDX0VRX1BPU1RfVk9MX0wJCTB4MDNmMgorI2RlZmluZSBSVDU2NjNfQURDX0VRX1BPU1RfVk9MX1IJCTB4MDNmMworCisvKiBSVDU2NjM6IFJFQ01JWCBDb250cm9sICgweDAwMTApICovCisjZGVmaW5lIFJUNTY2M19SRUNNSVgxX0JTVDFfTUFTSwkJKDB4MSkKKyNkZWZpbmUgUlQ1NjYzX1JFQ01JWDFfQlNUMV9TSElGVAkJMAorI2RlZmluZSBSVDU2NjNfUkVDTUlYMV9CU1QxX09OCQkJKDB4MCkKKyNkZWZpbmUgUlQ1NjYzX1JFQ01JWDFfQlNUMV9PRkYJCQkoMHgxKQorCisvKiBSVDU2NjM6IEJ5cGFzcyBTdGVyZW8xIERBQyBNaXhlciBDb250cm9sICgweDAwMmQpICovCisjZGVmaW5lIFJUNTY2M19EQUNMMV9TUkNfTUFTSwkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjYzX0RBQ0wxX1NSQ19TSElGVAkJCTMKKyNkZWZpbmUgUlQ1NjYzX0RBQ1IxX1NSQ19NQVNLCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjNfREFDUjFfU1JDX1NISUZUCQkJMgorCisvKiBSVDU2NjM6IFRETSBjb250cm9sIDIgKDB4MDA3OCkgKi8KKyNkZWZpbmUgUlQ1NjYzX0RBVEFfU1dBUF9BRENEQVQxX01BU0sJCSgweDMgPDwgMTQpCisjZGVmaW5lIFJUNTY2M19EQVRBX1NXQVBfQURDREFUMV9TSElGVAkJMTQKKyNkZWZpbmUgUlQ1NjYzX0RBVEFfU1dBUF9BRENEQVQxX0xSCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2NjNfREFUQV9TV0FQX0FEQ0RBVDFfUkwJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2M19EQVRBX1NXQVBfQURDREFUMV9MTAkJKDB4MiA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYzX0RBVEFfU1dBUF9BRENEQVQxX1JSCQkoMHgzIDw8IDE0KQorCisvKiBSVDU2NjM6IFRETSBjb250cm9sIDUgKDB4MDA3YikgKi8KKyNkZWZpbmUgUlQ1NjYzX1RETV9MRU5HVE5fTUFTSwkJCSgweDMpCisjZGVmaW5lIFJUNTY2M19URE1fTEVOR1ROX1NISUZUCQkJMAorI2RlZmluZSBSVDU2NjNfVERNX0xFTkdUTl8xNgkJCSgweDApCisjZGVmaW5lIFJUNTY2M19URE1fTEVOR1ROXzIwCQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjYzX1RETV9MRU5HVE5fMjQJCQkoMHgyKQorI2RlZmluZSBSVDU2NjNfVERNX0xFTkdUTl8zMgkJCSgweDMpCisKKy8qIFJUNTY2MzogR2xvYmFsIENsb2NrIENvbnRyb2wgKDB4MDA4MCkgKi8KKyNkZWZpbmUgUlQ1NjYzX1NDTEtfU1JDX01BU0sJCQkoMHgzIDw8IDE0KQorI2RlZmluZSBSVDU2NjNfU0NMS19TUkNfU0hJRlQJCQkxNAorI2RlZmluZSBSVDU2NjNfU0NMS19TUkNfTUNMSwkJCSgweDAgPDwgMTQpCisjZGVmaW5lIFJUNTY2M19TQ0xLX1NSQ19QTEwxCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYzX1NDTEtfU1JDX1JDQ0xLCQkJKDB4MiA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYzX1BMTDFfU1JDX01BU0sJCQkoMHg3IDw8IDExKQorI2RlZmluZSBSVDU2NjNfUExMMV9TUkNfU0hJRlQJCQkxMQorI2RlZmluZSBSVDU2NjNfUExMMV9TUkNfTUNMSwkJCSgweDAgPDwgMTEpCisjZGVmaW5lIFJUNTY2M19QTEwxX1NSQ19CQ0xLMQkJCSgweDEgPDwgMTEpCisKKy8qIFBMTCB0cmFja2luZyBtb2RlIDEgKDB4MDA4MykgKi8KKyNkZWZpbmUgUlQ1NjYzX0kyUzFfQVNSQ19NQVNLCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYzX0kyUzFfQVNSQ19TSElGVAkJCTExCisjZGVmaW5lIFJUNTY2M19EQUNfU1RPMV9BU1JDX01BU0sJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2M19EQUNfU1RPMV9BU1JDX1NISUZUCQkxMAorI2RlZmluZSBSVDU2NjNfQURDX1NUTzFfQVNSQ19NQVNLCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2M19BRENfU1RPMV9BU1JDX1NISUZUCQkzCisKKy8qIFBMTCB0cmFja2luZyBtb2RlIDIgKDB4MDA4NCkqLworI2RlZmluZSBSVDU2NjNfREFfU1RPMV9UUkFDS19NQVNLCQkoMHg3IDw8IDEyKQorI2RlZmluZSBSVDU2NjNfREFfU1RPMV9UUkFDS19TSElGVAkJMTIKKyNkZWZpbmUgUlQ1NjYzX0RBX1NUTzFfVFJBQ0tfU1lTQ0xLCQkoMHgwIDw8IDEyKQorI2RlZmluZSBSVDU2NjNfREFfU1RPMV9UUkFDS19JMlMxCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjNfQURfU1RPMV9UUkFDS19NQVNLCQkoMHg3KQorI2RlZmluZSBSVDU2NjNfQURfU1RPMV9UUkFDS19TSElGVAkJMAorI2RlZmluZSBSVDU2NjNfQURfU1RPMV9UUkFDS19TWVNDTEsJCSgweDApCisjZGVmaW5lIFJUNTY2M19BRF9TVE8xX1RSQUNLX0kyUzEJCSgweDEpCisKKy8qIFJUNTY2MzogSFBPVVQgQ2hhcmdlIHB1bXAgY29udHJvbCAxICgweDAwOTEpICovCisjZGVmaW5lIFJUNTY2M19TSV9IUF9NQVNLCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjYzX1NJX0hQX1NISUZUCQkJMTIKKyNkZWZpbmUgUlQ1NjYzX1NJX0hQX0VOCQkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2M19TSV9IUF9ESVMJCQkoMHgwIDw8IDEyKQorCisvKiBSVDU2NjM6IEdQSU8gQ29udHJvbCAyICgweDAwYjYpICovCisjZGVmaW5lIFJUNTY2M19HUDFfUElOX0NPTkZfTUFTSwkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjNfR1AxX1BJTl9DT05GX1NISUZUCQkyCisjZGVmaW5lIFJUNTY2M19HUDFfUElOX0NPTkZfT1VUUFVUCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2M19HUDFfUElOX0NPTkZfSU5QVVQJCSgweDAgPDwgMikKKworLyogUlQ1NjYzOiBHUElPIENvbnRyb2wgMiAoMHgwMGI3KSAqLworI2RlZmluZSBSVDU2NjNfRU5fSVJRX0lOTElORV9NQVNLCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2M19FTl9JUlFfSU5MSU5FX1NISUZUCQkzCisjZGVmaW5lIFJUNTY2M19FTl9JUlFfSU5MSU5FX05PUgkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjNfRU5fSVJRX0lOTElORV9CWVAJCSgweDAgPDwgMykKKworLyogUlQ1NjYzOiBJUlEgQ29udHJvbCAxICgweDAwYzEpICovCisjZGVmaW5lIFJUNTY2M19FTl9JUlFfSkQxX01BU0sJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2M19FTl9JUlFfSkQxX1NISUZUCQkJNgorI2RlZmluZSBSVDU2NjNfRU5fSVJRX0pEMV9FTgkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjYzX0VOX0lSUV9KRDFfRElTCQkJKDB4MCA8PCA2KQorCisvKiBSVDU2NjM6IElubGluZSBDb21tYW5kIEZ1bmN0aW9uIDIgKDB4MDBkYykgKi8KKyNkZWZpbmUgUlQ1NjYzX1BXUl9NSUNfREVUX01BU0sJCQkoMHgxKQorI2RlZmluZSBSVDU2NjNfUFdSX01JQ19ERVRfU0hJRlQJCTAKKyNkZWZpbmUgUlQ1NjYzX1BXUl9NSUNfREVUX09OCQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjYzX1BXUl9NSUNfREVUX09GRgkJCSgweDApCisKKy8qIFJUNTY2MzogRW1iZWVkZWQgSmFjayBhbmQgVHlwZSBEZXRlY3Rpb24gQ29udHJvbCAxICgweDAwZTYpKi8KKyNkZWZpbmUgUlQ1NjYzX0NCSl9ERVRfTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2M19DQkpfREVUX1NISUZUCQkJMTUKKyNkZWZpbmUgUlQ1NjYzX0NCSl9ERVRfRElTCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYzX0NCSl9ERVRfRU4JCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjNfRVhUX0pEX01BU0sJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjNfRVhUX0pEX1NISUZUCQkJMTEKKyNkZWZpbmUgUlQ1NjYzX0VYVF9KRF9FTgkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2M19FWFRfSkRfRElTCQkJKDB4MCA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYzX1BPTF9FWFRfSkRfTUFTSwkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2M19QT0xfRVhUX0pEX1NISUZUCQkJMTAKKyNkZWZpbmUgUlQ1NjYzX1BPTF9FWFRfSkRfRU4JCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjNfUE9MX0VYVF9KRF9ESVMJCQkoMHgwIDw8IDEwKQorCisvKiBSVDU2NjM6IERBQ1JFRiBMRE8gQ29udHJvbCAoMHgwMTEyKSovCisjZGVmaW5lIFJUNTY2M19QV1JfTERPX0RBQ1JFRkxfTUFTSwkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2NjNfUFdSX0xET19EQUNSRUZMX1NISUZUCQk5CisjZGVmaW5lIFJUNTY2M19QV1JfTERPX0RBQ1JFRlJfTUFTSwkJKDB4MSA8PCAxKQorI2RlZmluZSBSVDU2NjNfUFdSX0xET19EQUNSRUZSX1NISUZUCQkxCisKKy8qIFJUNTY2MzogU3RlcmVvIER5bmFtaWMgUmFuZ2UgRW5oYW5jZW1lbnQgQ29udHJvbCA5ICgweDAxNjgsIDB4MDE2OSkqLworI2RlZmluZSBSVDU2NjNfRFJFX0dBSU5fSFBfTUFTSwkJCSgweDFmKQorI2RlZmluZSBSVDU2NjNfRFJFX0dBSU5fSFBfU0hJRlQJCTAKKworLyogUlQ1NjYzOiBDb21ibyBKYWNrIENvbnRyb2wgKDB4MDI1MCkgKi8KKyNkZWZpbmUgUlQ1NjYzX0lOQlVGX0NCSl9CU1QxX01BU0sJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2M19JTkJVRl9DQkpfQlNUMV9TSElGVAkJMTEKKyNkZWZpbmUgUlQ1NjYzX0lOQlVGX0NCSl9CU1QxX09OCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjNfSU5CVUZfQ0JKX0JTVDFfT0ZGCQkoMHgwIDw8IDExKQorI2RlZmluZSBSVDU2NjNfQ0JKX1NFTlNFX0JTVDFfTUFTSwkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYzX0NCSl9TRU5TRV9CU1QxX1NISUZUCQkxMAorI2RlZmluZSBSVDU2NjNfQ0JKX1NFTlNFX0JTVDFfTAkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2M19DQkpfU0VOU0VfQlNUMV9SCQkJKDB4MCA8PCAxMCkKKworLyogUlQ1NjYzOiBDb21ibyBKYWNrIENvbnRyb2wgKDB4MDI1MSkgKi8KKyNkZWZpbmUgUlQ1NjYzX0dBSU5fQlNUMV9NQVNLCQkJKDB4ZikKKyNkZWZpbmUgUlQ1NjYzX0dBSU5fQlNUMV9TSElGVAkJCTAKKworLyogUlQ1NjYzOiBEdW1teSByZWdpc3RlciAxICgweDAyZmEpICovCisjZGVmaW5lIFJUNTY2M19FTUJfQ0xLX01BU0sJCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTY2M19FTUJfQ0xLX1NISUZUCQkJOQorI2RlZmluZSBSVDU2NjNfRU1CX0NMS19FTgkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjYzX0VNQl9DTEtfRElTCQkJKDB4MCA8PCA5KQorI2RlZmluZSBSVDU2NjNfSFBBX0NQTF9CSUFTX01BU0sJCSgweDcgPDwgNikKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUExfQklBU19TSElGVAkJNgorI2RlZmluZSBSVDU2NjNfSFBBX0NQTF9CSUFTXzBfNQkJCSgweDAgPDwgNikKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUExfQklBU18xCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjNfSFBBX0NQTF9CSUFTXzIJCQkoMHgyIDw8IDYpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BMX0JJQVNfMwkJCSgweDMgPDwgNikKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUExfQklBU180XzEJCQkoMHg0IDw8IDYpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BMX0JJQVNfNF8yCQkJKDB4NSA8PCA2KQorI2RlZmluZSBSVDU2NjNfSFBBX0NQTF9CSUFTXzYJCQkoMHg2IDw8IDYpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BMX0JJQVNfOAkJCSgweDcgPDwgNikKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUFJfQklBU19NQVNLCQkoMHg3IDw8IDMpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BSX0JJQVNfU0hJRlQJCTMKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUFJfQklBU18wXzUJCQkoMHgwIDw8IDMpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BSX0JJQVNfMQkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUFJfQklBU18yCQkJKDB4MiA8PCAzKQorI2RlZmluZSBSVDU2NjNfSFBBX0NQUl9CSUFTXzMJCQkoMHgzIDw8IDMpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BSX0JJQVNfNF8xCQkJKDB4NCA8PCAzKQorI2RlZmluZSBSVDU2NjNfSFBBX0NQUl9CSUFTXzRfMgkJCSgweDUgPDwgMykKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUFJfQklBU182CQkJKDB4NiA8PCAzKQorI2RlZmluZSBSVDU2NjNfSFBBX0NQUl9CSUFTXzgJCQkoMHg3IDw8IDMpCisjZGVmaW5lIFJUNTY2M19EVU1NWV9CSUFTX01BU0sJCQkoMHg3KQorI2RlZmluZSBSVDU2NjNfRFVNTVlfQklBU19TSElGVAkJCTAKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZX0JJQVNfMF81CQkJKDB4MCkKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZX0JJQVNfMQkJCSgweDEpCisjZGVmaW5lIFJUNTY2M19EVU1NWV9CSUFTXzIJCQkoMHgyKQorI2RlZmluZSBSVDU2NjNfRFVNTVlfQklBU18zCQkJKDB4MykKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZX0JJQVNfNF8xCQkJKDB4NCkKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZX0JJQVNfNF8yCQkJKDB4NSkKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZX0JJQVNfNgkJCSgweDYpCisjZGVmaW5lIFJUNTY2M19EVU1NWV9CSUFTXzgJCQkoMHg3KQorCisKKy8qIFN5c3RlbSBDbG9jayBTb3VyY2UgKi8KK2VudW0geworCVJUNTY2M19TQ0xLX1NfTUNMSywKKwlSVDU2NjNfU0NMS19TX1BMTDEsCisJUlQ1NjYzX1NDTEtfU19SQ0NMSywKK307CisKKy8qIFBMTDEgU291cmNlICovCitlbnVtIHsKKwlSVDU2NjNfUExMMV9TX01DTEssCisJUlQ1NjYzX1BMTDFfU19CQ0xLMSwKK307CisKK2VudW0geworCVJUNTY2M19BSUYsCisJUlQ1NjYzX0FJRlMsCit9OworCisvKiBhc3JjIGNsb2NrIHNvdXJjZSAqLworZW51bSB7CisJUlQ1NjYzX0NMS19TRUxfU1lTID0gMHgwLAorCVJUNTY2M19DTEtfU0VMX0kyUzFfQVNSQyA9IDB4MSwKK307CisKKy8qIGZpbHRlciBtYXNrICovCitlbnVtIHsKKwlSVDU2NjNfREFfU1RFUkVPX0ZJTFRFUiA9IDB4MSwKKwlSVDU2NjNfQURfU1RFUkVPX0ZJTFRFUiA9IDB4MiwKK307CisKK2ludCBydDU2NjNfc2V0X2phY2tfZGV0ZWN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwlzdHJ1Y3Qgc25kX3NvY19qYWNrICpoc19qYWNrKTsKK2ludCBydDU2NjNfc2VsX2FzcmNfY2xrX3NyYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJdW5zaWduZWQgaW50IGZpbHRlcl9tYXNrLCB1bnNpZ25lZCBpbnQgY2xrX3NyYyk7CisKKyNlbmRpZiAvKiBfX1JUNTY2M19IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjcwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY3MC5jCmluZGV4IDhlZjQ2N2YuLjQ5Y2FmMTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjcwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NzAuYwpAQCAtMjc3NywxMiArMjc3NywxNCBAQAogCS5yZXN1bWUgPSBydDU2NzBfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbCA9IHJ0NTY3MF9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCi0JLmNvbnRyb2xzID0gcnQ1NjcwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShydDU2NzBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gcnQ1NjcwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocnQ1NjcwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gcnQ1NjcwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHJ0NTY3MF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBydDU2NzBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocnQ1NjcwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcnQ1NjcwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHJ0NTY3MF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcnQ1NjcwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShydDU2NzBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgcnQ1NjcwX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1Njc3LmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY3Ny5jCmluZGV4IGRhOTQ4M2MuLmFiYzgwMmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1Njc3LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NzcuYwpAQCAtOSw2ICs5LDcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgpAQCAtNDAsNiArNDEsMTUgQEAKIAogI2RlZmluZSBSVDU2NzdfUFJfQkFTRSAoUlQ1Njc3X1BSX1JBTkdFX0JBU0UgKyAoMCAqIFJUNTY3N19QUl9TUEFDSU5HKSkKIAorLyogR1BJTyBpbmRleGVzIGRlZmluZWQgYnkgQUNQSSAqLworZW51bSB7CisJUlQ1Njc3X0dQSU9fUExVR19ERVQJCT0gMCwKKwlSVDU2NzdfR1BJT19NSUNfUFJFU0VOVF9MCT0gMSwKKwlSVDU2NzdfR1BJT19IT1RXT1JEX0RFVF9MCT0gMiwKKwlSVDU2NzdfR1BJT19EU1BfSU5UCQk9IDMsCisJUlQ1Njc3X0dQSU9fSFBfQU1QX1NIRE5fTAk9IDQsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9yYW5nZV9jZmcgcnQ1Njc3X3Jhbmdlc1tdID0gewogCXsKIAkJLm5hbWUgPSAiUFIiLApAQCAtNDY1Nyw3ICs0NjY3LDcgQEAKIAlyZXR1cm4gcmVnbWFwX2lycV9nZXRfdmlycShkYXRhLCBpcnEpOwogfQogCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCBydDU2NzdfdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHJ0NTY3N190ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gInJ0NTY3NyIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuZGlyZWN0aW9uX291dHB1dAk9IHJ0NTY3N19ncGlvX2RpcmVjdGlvbl9vdXQsCkBAIC00OTc0LDEyICs0OTg0LDE0IEBACiAJLnJlc3VtZSA9IHJ0NTY3N19yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gcnQ1Njc3X3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKLQkuY29udHJvbHMgPSBydDU2Nzdfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHJ0NTY3N19zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBydDU2NzdfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShydDU2NzdfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBydDU2NzdfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocnQ1Njc3X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHJ0NTY3N19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShydDU2Nzdfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBydDU2NzdfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocnQ1Njc3X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBydDU2NzdfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHJ0NTY3N19kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBydDU2NzdfcmVnbWFwX3BoeXNpY2FsID0gewpAQCAtNTAxOCwxMCArNTAzMCw0NyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHJ0NTY3N19pMmNfaWRbXSA9IHsKIAl7ICJydDU2NzciLCBSVDU2NzcgfSwKIAl7ICJydDU2NzYiLCBSVDU2NzYgfSwKKwl7ICJSVDU2NzdDRTowMCIsIFJUNTY3NyB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBydDU2NzdfaTJjX2lkKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2dwaW9fcGFyYW1zIHBsdWdfZGV0X2dwaW8gPSB7IFJUNTY3N19HUElPX1BMVUdfREVULCAwLCBmYWxzZSB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2dwaW9fcGFyYW1zIG1pY19wcmVzZW50X2dwaW8gPSB7IFJUNTY3N19HUElPX01JQ19QUkVTRU5UX0wsIDAsIGZhbHNlIH07CitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZ3Bpb19wYXJhbXMgaGVhZHBob25lX2VuYWJsZV9ncGlvID0geyBSVDU2NzdfR1BJT19IUF9BTVBfU0hETl9MLCAwLCBmYWxzZSB9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZ3Bpb19tYXBwaW5nIGJkd19ydDU2NzdfZ3Bpb3NbXSA9IHsKKwl7ICJwbHVnLWRldC1ncGlvcyIsICZwbHVnX2RldF9ncGlvLCAxIH0sCisJeyAibWljLXByZXNlbnQtZ3Bpb3MiLCAmbWljX3ByZXNlbnRfZ3BpbywgMSB9LAorCXsgImhlYWRwaG9uZS1lbmFibGUtZ3Bpb3MiLCAmaGVhZHBob25lX2VuYWJsZV9ncGlvLCAxIH0sCisJeyBOVUxMIH0sCit9OworCitzdGF0aWMgdm9pZCBydDU2NzdfcmVhZF9hY3BpX3Byb3BlcnRpZXMoc3RydWN0IHJ0NTY3N19wcml2ICpydDU2NzcsCisJCXN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXUzMiB2YWw7CisKKwlyZXQgPSBhY3BpX2Rldl9hZGRfZHJpdmVyX2dwaW9zKEFDUElfQ09NUEFOSU9OKGRldiksCisJCQliZHdfcnQ1Njc3X2dwaW9zKTsKKwlpZiAocmV0KQorCQlkZXZfd2FybihkZXYsICJGYWlsZWQgdG8gYWRkIGRyaXZlciBncGlvc1xuIik7CisKKwlpZiAoIWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJEQ0xLIiwgJnZhbCkpCisJCXJ0NTY3Ny0+cGRhdGEuZG1pYzJfY2xrX3BpbiA9IHZhbDsKKworCXJ0NTY3Ny0+cGRhdGEuaW4xX2RpZmYgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgIklOMSIpOworCXJ0NTY3Ny0+cGRhdGEuaW4yX2RpZmYgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgIklOMiIpOworCXJ0NTY3Ny0+cGRhdGEubG91dDFfZGlmZiA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAiT1VUMSIpOworCXJ0NTY3Ny0+cGRhdGEubG91dDJfZGlmZiA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAiT1VUMiIpOworCXJ0NTY3Ny0+cGRhdGEubG91dDNfZGlmZiA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAiT1VUMyIpOworCisJZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGRldiwgIkpEMSIsICZydDU2NzctPnBkYXRhLmpkMV9ncGlvKTsKKwlkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoZGV2LCAiSkQyIiwgJnJ0NTY3Ny0+cGRhdGEuamQyX2dwaW8pOworCWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJKRDMiLCAmcnQ1Njc3LT5wZGF0YS5qZDNfZ3Bpbyk7Cit9CisKIHN0YXRpYyB2b2lkIHJ0NTY3N19yZWFkX2RldmljZV9wcm9wZXJ0aWVzKHN0cnVjdCBydDU2NzdfcHJpdiAqcnQ1Njc3LAogCQlzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC01MTI3LDggKzUxNzYsMTIgQEAKIAogCWlmIChwZGF0YSkKIAkJcnQ1Njc3LT5wZGF0YSA9ICpwZGF0YTsKLQllbHNlCisJZWxzZSBpZiAoaTJjLT5kZXYub2Zfbm9kZSkKIAkJcnQ1Njc3X3JlYWRfZGV2aWNlX3Byb3BlcnRpZXMocnQ1Njc3LCAmaTJjLT5kZXYpOworCWVsc2UgaWYgKEFDUElfSEFORExFKCZpMmMtPmRldikpCisJCXJ0NTY3N19yZWFkX2FjcGlfcHJvcGVydGllcyhydDU2NzcsICZpMmMtPmRldik7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIHBvdy1sZG8yIGFuZCByZXNldCBhcmUgb3B0aW9uYWwuIFRoZSBjb2RlYyBwaW5zIG1heSBiZSBzdGF0aWNhbGx5CiAJICogY29ubmVjdGVkIG9uIHRoZSBib2FyZCB3aXRob3V0IGdwaW9zLiBJZiB0aGUgZ3BpbyBkZXZpY2UgcHJvcGVydHkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuYwppbmRleCA1MjdiNzU5Li4xNTg5MzI1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NndGw1MDAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zZ3RsNTAwMC5jCkBAIC00MTEsNiArNDExLDggQEAKIAkJCTAsIDgsCiAJCQkweDdmLCAxLAogCQkJaGVhZHBob25lX3ZvbHVtZSksCisJU09DX1NJTkdMRSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIFNHVEw1MDAwX0NISVBfQU5BX0NUUkwsCisJCQk0LCAxLCAxKSwKIAlTT0NfU0lOR0xFKCJIZWFkcGhvbmUgUGxheWJhY2sgWkMgU3dpdGNoIiwgU0dUTDUwMDBfQ0hJUF9BTkFfQ1RSTCwKIAkJCTUsIDEsIDApLAogCkBAIC00MjMsNiArNDI1LDcgQEAKIAkJCVNHVEw1MDAwX0xJTkVfT1VUX1ZPTF9SSUdIVF9TSElGVCwKIAkJCTB4MWYsIDEsCiAJCQlsaW5lb3V0X3ZvbHVtZSksCisJU09DX1NJTkdMRSgiTGluZW91dCBQbGF5YmFjayBTd2l0Y2giLCBTR1RMNTAwMF9DSElQX0FOQV9DVFJMLCA4LCAxLCAxKSwKIH07CiAKIC8qIG11dGUgdGhlIGNvZGVjIHVzZWQgYnkgYWxzYSBjb3JlICovCkBAIC0xMTUxLDEyICsxMTU0LDE0IEBACiAJLnJlbW92ZSA9IHNndGw1MDAwX3JlbW92ZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBzZ3RsNTAwMF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCi0JLmNvbnRyb2xzID0gc2d0bDUwMDBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHNndGw1MDAwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHNndGw1MDAwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoc2d0bDUwMDBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBzZ3RsNTAwMF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShzZ3RsNTAwMF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBzZ3RsNTAwMF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShzZ3RsNTAwMF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHNndGw1MDAwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHNndGw1MDAwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBzZ3RsNTAwMF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoc2d0bDUwMDBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgc2d0bDUwMDBfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zaTQ3NnguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2k0NzZ4LmMKaW5kZXggYTg0MDJkMC4uNTM0NGY0YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zaTQ3NnguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3NpNDc2eC5jCkBAIC0yMzgsMTAgKzIzOCwxMiBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfc2k0NzZ4ID0gewogCS5nZXRfcmVnbWFwID0gc2k0NzZ4X2dldF9yZWdtYXAsCi0JLmRhcG1fd2lkZ2V0cyA9IHNpNDc2eF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHNpNDc2eF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHNpNDc2eF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShzaTQ3NnhfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IHNpNDc2eF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShzaTQ3NnhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHNpNDc2eF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoc2k0NzZ4X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBzaTQ3NnhfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc245NTAzMS5jIGIvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmMKaW5kZXggM2E3ZGUwMS4uZWFlNTRjMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmMKQEAgLTg4OCwxMiArODg4LDE0IEBACiAJLnNldF9iaWFzX2xldmVsCT0gc245NTAzMV9zZXRfdmF1ZF9iaWFzLAogCS5pZGxlX2JpYXNfb2ZmCT0gdHJ1ZSwKIAotCS5jb250cm9scwk9IHNuOTUwMzFfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJPSBBUlJBWV9TSVpFKHNuOTUwMzFfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzCT0gc245NTAzMV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHNuOTUwMzFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJPSBzbjk1MDMxX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShzbjk1MDMxX2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBzbjk1MDMxX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHNuOTUwMzFfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBzbjk1MDMxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHNuOTUwMzFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHNuOTUwMzFfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShzbjk1MDMxX2F1ZGlvX21hcCksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgc245NTAzMV9kZXZpY2VfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3BkaWZfcmVjZWl2ZXIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3BkaWZfcmVjZWl2ZXIuYwppbmRleCAzZWM0MWNjYi4uMjM0Zjg3YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zcGRpZl9yZWNlaXZlci5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3BkaWZfcmVjZWl2ZXIuYwpAQCAtMzgsMTAgKzM4LDEyIEBACiAJCQlTTkRSVl9QQ01fRk1UQklUX0lFQzk1OF9TVUJGUkFNRV9MRSkKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfc3BkaWZfZGlyID0gewotCS5kYXBtX3dpZGdldHMgPSBkaXJfd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoZGlyX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGRpcl9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoZGlyX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gZGlyX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkaXJfd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBkaXJfcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShkaXJfcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgZGlyX3N0dWJfZGFpID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zcGRpZl90cmFuc21pdHRlci5jIGIvc291bmQvc29jL2NvZGVjcy9zcGRpZl90cmFuc21pdHRlci5jCmluZGV4IGVmNjM0YTkuLmVlMzY3NTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc3BkaWZfdHJhbnNtaXR0ZXIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3NwZGlmX3RyYW5zbWl0dGVyLmMKQEAgLTM4LDEwICszOCwxMiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfc3BkaWZfZGl0ID0gewotCS5kYXBtX3dpZGdldHMgPSBkaXRfd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoZGl0X3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGRpdF9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoZGl0X3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gZGl0X3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkaXRfd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBkaXRfcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShkaXRfcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgZGl0X3N0dWJfZGFpID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zc20yNTE4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3NzbTI1MTguYwppbmRleCBlMmUwYmZhLi4zOGE4NWYzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NzbTI1MTguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3NzbTI1MTguYwpAQCAtNzE1LDEyICs3MTUsMTQgQEAKIAkuc2V0X3N5c2NsayA9IHNzbTI1MThfc2V0X3N5c2NsaywKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSBzc20yNTE4X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShzc20yNTE4X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHNzbTI1MThfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShzc20yNTE4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gc3NtMjUxOF9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoc3NtMjUxOF9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gc3NtMjUxOF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShzc20yNTE4X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gc3NtMjUxOF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShzc20yNTE4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBzc20yNTE4X3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoc3NtMjUxOF9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgc3NtMjUxOF9yZWdtYXBfY29uZmlnID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDIuYwppbmRleCA0NDUyZmVhLi45OTNiZGUyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDIuYwpAQCAtNTk3LDEyICs1OTcsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSBzc20yNjAyX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHNzbTI2MHhfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHNzbTI2MHhfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gc3NtMjYweF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHNzbTI2MHhfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBzc20yNjB4X3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShzc20yNjB4X3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBzc20yNjB4X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHNzbTI2MHhfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBzc20yNjB4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHNzbTI2MHhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHNzbTI2MHhfcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShzc20yNjB4X3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBib29sIHNzbTI2MDJfcmVnaXN0ZXJfdm9sYXRpbGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zc200NTY3LmMgYi9zb3VuZC9zb2MvY29kZWNzL3NzbTQ1NjcuYwppbmRleCAwODBjNzhlLi4yYmI1YTExIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NzbTQ1NjcuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3NzbTQ1NjcuYwpAQCAtNDIxLDEyICs0MjEsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSBzc200NTY3X3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHNzbTQ1Njdfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHNzbTQ1Njdfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gc3NtNDU2N19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHNzbTQ1NjdfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBzc200NTY3X3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShzc200NTY3X3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBzc200NTY3X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHNzbTQ1Njdfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBzc200NTY3X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHNzbTQ1NjdfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHNzbTQ1Njdfcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShzc200NTY3X3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzc200NTY3X3JlZ21hcF9jb25maWcgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3N0YTMyeC5jIGIvc291bmQvc29jL2NvZGVjcy9zdGEzMnguYwppbmRleCBhOTg0NGIyLi4wNzkwYWU4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3N0YTMyeC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhMzJ4LmMKQEAgLTk5MSwxMiArOTkxLDE0IEBACiAJLnJlbW92ZSA9CQlzdGEzMnhfcmVtb3ZlLAogCS5zZXRfYmlhc19sZXZlbCA9CXN0YTMyeF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9CXRydWUsCi0JLmNvbnRyb2xzID0JCXN0YTMyeF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9CQlBUlJBWV9TSVpFKHN0YTMyeF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPQkJc3RhMzJ4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9CUFSUkFZX1NJWkUoc3RhMzJ4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0JCXN0YTMyeF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0JQVJSQVlfU0laRShzdGEzMnhfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMgPQkJc3RhMzJ4X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scyA9CQlBUlJBWV9TSVpFKHN0YTMyeF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzID0JCXN0YTMyeF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzID0JQVJSQVlfU0laRShzdGEzMnhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzID0JCXN0YTMyeF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcyA9CUFSUkFZX1NJWkUoc3RhMzJ4X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHN0YTMyeF9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3N0YTM1MC5jIGIvc291bmQvc29jL2NvZGVjcy9zdGEzNTAuYwppbmRleCAzM2E0NjEyLi45NjQ0YzIwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3N0YTM1MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhMzUwLmMKQEAgLTEwNTcsMTIgKzEwNTcsMTQgQEAKIAkucmVtb3ZlID0JCXN0YTM1MF9yZW1vdmUsCiAJLnNldF9iaWFzX2xldmVsID0Jc3RhMzUwX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0JdHJ1ZSwKLQkuY29udHJvbHMgPQkJc3RhMzUwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0JCUFSUkFZX1NJWkUoc3RhMzUwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9CQlzdGEzNTBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0JQVJSQVlfU0laRShzdGEzNTBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPQkJc3RhMzUwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPQlBUlJBWV9TSVpFKHN0YTM1MF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scyA9CQlzdGEzNTBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzID0JCUFSUkFZX1NJWkUoc3RhMzUwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMgPQkJc3RhMzUwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMgPQlBUlJBWV9TSVpFKHN0YTM1MF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMgPQkJc3RhMzUwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzID0JQVJSQVlfU0laRShzdGEzNTBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgc3RhMzUwX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhNTI5LmMgYi9zb3VuZC9zb2MvY29kZWNzL3N0YTUyOS5jCmluZGV4IDJjZGFjYTkuLmQ0YjM4NGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhNTI5LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zdGE1MjkuYwpAQCAtMzE3LDggKzMxNywxMCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IHN0YTUyOV9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSBzdGE1Mjlfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHN0YTUyOV9zbmRfY29udHJvbHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gc3RhNTI5X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHN0YTUyOV9zbmRfY29udHJvbHMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgc3RhNTI5X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhYzk3NjYuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhYzk3NjYuYwppbmRleCAwOTQ1YzUxLi4yN2YzMGQzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3N0YWM5NzY2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zdGFjOTc2Ni5jCkBAIC04NSwxMCArODUsMTAgQEAKIHN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGFjOTc2Nl9zdGVyZW9fbWljX2VudW0sCiAJCQkgICAgQUM5N19TVEFDX1NURVJFT19NSUMsIDIsIHN0YWM5NzY2X3N0ZXJlb19taWMpOwogCi1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKG1hc3Rlcl90bHYsIC00NjAwLCAwKTsKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIocmVjb3JkX3RsdiwgMCwgMjI1MCk7Ci1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKGJlZXBfdGx2LCAtNDUwMCwgMCk7Ci1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKG1peF90bHYsIC0zNDUwLCAxMjAwKTsKK3N0YXRpYyBjb25zdCBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1NDQUxFKG1hc3Rlcl90bHYsIC00NjUwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IFNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfU0NBTEUocmVjb3JkX3RsdiwgICAgIDAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9TQ0FMRShiZWVwX3RsdiwgICAtNDUwMCwgMzAwLCAwKTsKK3N0YXRpYyBjb25zdCBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1NDQUxFKG1peF90bHYsICAgIC0zNDUwLCAxNTAsIDApOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3RhYzk3NjZfc25kX2FjOTdfY29udHJvbHNbXSA9IHsKIAlTT0NfRE9VQkxFX1RMVigiU3BlYWtlciBWb2x1bWUiLCBBQzk3X01BU1RFUiwgOCwgMCwgMzEsIDEsIG1hc3Rlcl90bHYpLApAQCAtMzIwLDggKzMyMCwxMCBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfc3RhYzk3NjYgPSB7Ci0JLmNvbnRyb2xzID0gc3RhYzk3NjZfc25kX2FjOTdfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoc3RhYzk3NjZfc25kX2FjOTdfY29udHJvbHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gc3RhYzk3NjZfc25kX2FjOTdfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShzdGFjOTc2Nl9zbmRfYWM5N19jb250cm9scyksCisJfSwKIAkud3JpdGUgPSBzdGFjOTc2Nl9hYzk3X3dyaXRlLAogCS5yZWFkID0gc3RhYzk3NjZfYWM5N19yZWFkLAogCS5zZXRfYmlhc19sZXZlbCA9IHN0YWM5NzY2X3NldF9iaWFzX2xldmVsLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zdGktc2FzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3N0aS1zYXMuYwppbmRleCAxNjBkNjFhLi43YjMxZWU5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3N0aS1zYXMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3N0aS1zYXMuYwpAQCAtNTkxLDExICs1OTEsMTEgQEAKIAlzdGlfc2FzX2RhaVtTVElfU0FTX0RBSV9BTkFMT0dfT1VUXS5vcHMgPSBkcnZkYXRhLT5kZXZfZGF0YS0+ZGFjX29wczsKIAogCS8qIFNldCBkYXBtcyovCi0Jc3RpX3Nhc19kcml2ZXIuZGFwbV93aWRnZXRzID0gZHJ2ZGF0YS0+ZGV2X2RhdGEtPmRhcG1fd2lkZ2V0czsKLQlzdGlfc2FzX2RyaXZlci5udW1fZGFwbV93aWRnZXRzID0gZHJ2ZGF0YS0+ZGV2X2RhdGEtPm51bV9kYXBtX3dpZGdldHM7CisJc3RpX3Nhc19kcml2ZXIuY29tcG9uZW50X2RyaXZlci5kYXBtX3dpZGdldHMgPSBkcnZkYXRhLT5kZXZfZGF0YS0+ZGFwbV93aWRnZXRzOworCXN0aV9zYXNfZHJpdmVyLmNvbXBvbmVudF9kcml2ZXIubnVtX2RhcG1fd2lkZ2V0cyA9IGRydmRhdGEtPmRldl9kYXRhLT5udW1fZGFwbV93aWRnZXRzOwogCi0Jc3RpX3Nhc19kcml2ZXIuZGFwbV9yb3V0ZXMgPSBkcnZkYXRhLT5kZXZfZGF0YS0+ZGFwbV9yb3V0ZXM7Ci0Jc3RpX3Nhc19kcml2ZXIubnVtX2RhcG1fcm91dGVzID0gZHJ2ZGF0YS0+ZGV2X2RhdGEtPm51bV9kYXBtX3JvdXRlczsKKwlzdGlfc2FzX2RyaXZlci5jb21wb25lbnRfZHJpdmVyLmRhcG1fcm91dGVzID0gZHJ2ZGF0YS0+ZGV2X2RhdGEtPmRhcG1fcm91dGVzOworCXN0aV9zYXNfZHJpdmVyLmNvbXBvbmVudF9kcml2ZXIubnVtX2RhcG1fcm91dGVzID0gZHJ2ZGF0YS0+ZGV2X2RhdGEtPm51bV9kYXBtX3JvdXRlczsKIAogCS8qIFN0b3JlIGNvbnRleHQgKi8KIAlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgZHJ2ZGF0YSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RhczI1NTIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdGFzMjU1Mi5jCmluZGV4IGNjMWQzOTguLmJhZjQ1NWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGFzMjU1Mi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGFzMjU1Mi5jCkBAIC02NjcsMTIgKzY2NywxNCBAQAogCS5yZXN1bWUgPSB0YXMyNTUyX3Jlc3VtZSwKIAkuaWdub3JlX3BtZG93bl90aW1lID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHRhczI1NTJfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHRhczI1NTJfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gdGFzMjU1Ml9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHRhczI1NTJfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB0YXMyNTUyX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh0YXMyNTUyX2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB0YXMyNTUyX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHRhczI1NTJfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB0YXMyNTUyX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHRhczI1NTJfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHRhczI1NTJfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh0YXMyNTUyX2F1ZGlvX21hcCksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB0YXMyNTUyX3JlZ21hcF9jb25maWcgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RhczUwODYuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdGFzNTA4Ni5jCmluZGV4IGQ0OWQyNWQuLmI3ZGU4NTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGFzNTA4Ni5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGFzNTA4Ni5jCkBAIC0zODcsNyArMzg3LDcgQEAKIAl2YWwgPSBpbmRleF9pbl9hcnJheSh0YXM1MDg2X3JhdGlvcywgQVJSQVlfU0laRSh0YXM1MDg2X3JhdGlvcyksCiAJCQkgICAgIHByaXYtPm1jbGsgLyBwcml2LT5yYXRlKTsKIAlpZiAodmFsIDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbmF2bGlkIE1DTEsgLyBGcyByYXRpb1xuIik7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgTUNMSyAvIEZzIHJhdGlvXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC04OTAsMTIgKzg5MCwxNCBAQAogCS5yZW1vdmUJCQk9IHRhczUwODZfcmVtb3ZlLAogCS5zdXNwZW5kCQk9IHRhczUwODZfc29jX3N1c3BlbmQsCiAJLnJlc3VtZQkJCT0gdGFzNTA4Nl9zb2NfcmVzdW1lLAotCS5jb250cm9scwkJPSB0YXM1MDg2X2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh0YXM1MDg2X2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzCQk9IHRhczUwODZfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh0YXM1MDg2X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCQk9IHRhczUwODZfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUodGFzNTA4Nl9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB0YXM1MDg2X2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUodGFzNTA4Nl9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gdGFzNTA4Nl9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh0YXM1MDg2X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB0YXM1MDg2X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh0YXM1MDg2X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHRhczUwODZfaTJjX2lkW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RhczU3MXguYyBiL3NvdW5kL3NvYy9jb2RlY3MvdGFzNTcxeC5jCmluZGV4IGQ4YmFjYTMuLmRmNWU1Y2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGFzNTcxeC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGFzNTcxeC5jCkBAIC02NTgsMTAgKzY1OCwxMiBAQAogCS5zZXRfYmlhc19sZXZlbCA9IHRhczU3MXhfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogCi0JLmRhcG1fd2lkZ2V0cyA9IHRhczU3MXhfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh0YXM1NzF4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gdGFzNTcxeF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh0YXM1NzF4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSB0YXM1NzF4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHRhczU3MXhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHRhczU3MXhfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHRhczU3MXhfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciB0YXM1NzF4X2RhaSA9IHsKQEAgLTc1NCw4ICs3NTYsOCBAQAogCiAKIAltZW1jcHkoJnByaXYtPmNvZGVjX2RyaXZlciwgJnRhczU3MXhfY29kZWMsIHNpemVvZihwcml2LT5jb2RlY19kcml2ZXIpKTsKLQlwcml2LT5jb2RlY19kcml2ZXIuY29udHJvbHMgPSBwcml2LT5jaGlwLT5jb250cm9sczsKLQlwcml2LT5jb2RlY19kcml2ZXIubnVtX2NvbnRyb2xzID0gcHJpdi0+Y2hpcC0+bnVtX2NvbnRyb2xzOworCXByaXYtPmNvZGVjX2RyaXZlci5jb21wb25lbnRfZHJpdmVyLmNvbnRyb2xzID0gcHJpdi0+Y2hpcC0+Y29udHJvbHM7CisJcHJpdi0+Y29kZWNfZHJpdmVyLmNvbXBvbmVudF9kcml2ZXIubnVtX2NvbnRyb2xzID0gcHJpdi0+Y2hpcC0+bnVtX2NvbnRyb2xzOwogCiAJaWYgKHByaXYtPmNoaXAtPnZvbF9yZWdfc2l6ZSA9PSAyKSB7CiAJCS8qCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RhczU3MjAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdGFzNTcyMC5jCmluZGV4IGY1NGZiNDYuLmM2NWI5MTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGFzNTcyMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGFzNTcyMC5jCkBAIC00ODksMTIgKzQ4OSwxNCBAQAogCS5zdXNwZW5kID0gdGFzNTcyMF9zdXNwZW5kLAogCS5yZXN1bWUgPSB0YXM1NzIwX3Jlc3VtZSwKIAotCS5jb250cm9scyA9IHRhczU3MjBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHRhczU3MjBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gdGFzNTcyMF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHRhczU3MjBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB0YXM1NzIwX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh0YXM1NzIwX2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB0YXM1NzIwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHRhczU3MjBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB0YXM1NzIwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHRhczU3MjBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHRhczU3MjBfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh0YXM1NzIwX2F1ZGlvX21hcCksCisJfSwKIH07CiAKIC8qIFBDTSByYXRlcyBzdXBwb3J0ZWQgYnkgdGhlIFRBUzU3MjAgZHJpdmVyICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RmYTk4NzkuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdGZhOTg3OS5jCmluZGV4IGNiNTMxMGQuLjk1ZTBhN2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGZhOTg3OS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGZhOTg3OS5jCkBAIC0yMzEsMTMgKzIzMSwxNCBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciB0ZmE5ODc5X2NvZGVjID0gewotCS5jb250cm9scyA9IHRmYTk4NzlfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUodGZhOTg3OV9jb250cm9scyksCi0KLQkuZGFwbV93aWRnZXRzID0gdGZhOTg3OV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHRmYTk4NzlfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB0ZmE5ODc5X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHRmYTk4NzlfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gdGZhOTg3OV9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHRmYTk4NzlfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHRmYTk4NzlfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUodGZhOTg3OV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gdGZhOTg3OV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUodGZhOTg3OV9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB0ZmE5ODc5X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjMuYwppbmRleCBjZDhjMDJiLi40MTBjYWUwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jCkBAIC01ODMsMTIgKzU4MywxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IHRsdjMyMGFpYzIzX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHRsdjMyMGFpYzIzX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh0bHYzMjBhaWMyM19zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB0bHYzMjBhaWMyM19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gdGx2MzIwYWljMjNfaW50ZXJjb24sCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfaW50ZXJjb24pLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gdGx2MzIwYWljMjNfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB0bHYzMjBhaWMyM19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh0bHYzMjBhaWMyM19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gdGx2MzIwYWljMjNfaW50ZXJjb24sCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHRsdjMyMGFpYzIzX2ludGVyY29uKSwKKwl9LAogfTsKIAogaW50IHRsdjMyMGFpYzIzX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlZ21hcCAqcmVnbWFwKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyNi5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyNi5jCmluZGV4IDJjOTA0ZDcuLjE0YWE5NmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjYuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzI2LmMKQEAgLTMyMSwxMiArMzIxLDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgYWljMjZfc29jX2NvZGVjX2RldiA9IHsKIAkucHJvYmUgPSBhaWMyNl9wcm9iZSwKLQkuY29udHJvbHMgPSBhaWMyNl9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYWljMjZfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gdGx2MzIwYWljMjZfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh0bHYzMjBhaWMyNl9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHRsdjMyMGFpYzI2X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHRsdjMyMGFpYzI2X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFpYzI2X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFpYzI2X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gdGx2MzIwYWljMjZfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUodGx2MzIwYWljMjZfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHRsdjMyMGFpYzI2X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh0bHYzMjBhaWMyNl9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhaWMyNl9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMxeHguYyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzF4eC5jCmluZGV4IDNjNWUxZGYuLmJlMWE2NGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzF4eC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzF4eC5jCkBAIC0yNzMsMTAgKzI3MywyMCBAQAogLyoKICAqIGNvbnRyb2xzIHRvIGJlIGV4cG9ydGVkIHRvIHRoZSB1c2VyIHNwYWNlCiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWMzMXh4X3NuZF9jb250cm9sc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNvbW1vbjMxeHhfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX0RPVUJMRV9SX1NfVExWKCJEQUMgUGxheWJhY2sgVm9sdW1lIiwgQUlDMzFYWF9MREFDVk9MLAogCQkJICAgQUlDMzFYWF9SREFDVk9MLCAwLCAtMTI3LCA0OCwgNywgMCwgZGFjX3ZvbF90bHYpLAogCisJU09DX0RPVUJMRV9SKCJIUCBEcml2ZXIgUGxheWJhY2sgU3dpdGNoIiwgQUlDMzFYWF9IUExHQUlOLAorCQkgICAgIEFJQzMxWFhfSFBSR0FJTiwgMiwgMSwgMCksCisJU09DX0RPVUJMRV9SX1RMVigiSFAgRHJpdmVyIFBsYXliYWNrIFZvbHVtZSIsIEFJQzMxWFhfSFBMR0FJTiwKKwkJCSBBSUMzMVhYX0hQUkdBSU4sIDMsIDB4MDksIDAsIGhwX2Rydl90bHYpLAorCisJU09DX0RPVUJMRV9SX1RMVigiSFAgQW5hbG9nIFBsYXliYWNrIFZvbHVtZSIsIEFJQzMxWFhfTEFOQUxPR0hQTCwKKwkJCSBBSUMzMVhYX1JBTkFMT0dIUFIsIDAsIDB4N0YsIDEsIGhwX3ZvbF90bHYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMxeHhfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX1NJTkdMRV9UTFYoIkFEQyBGaW5lIENhcHR1cmUgVm9sdW1lIiwgQUlDMzFYWF9BRENGR0EsIDQsIDQsIDEsCiAJCSAgICAgICBhZGNfZmdhaW5fdGx2KSwKIApAQCAtMjg2LDE0ICsyOTYsNiBAQAogCiAJU09DX1NJTkdMRV9UTFYoIk1pYyBQR0EgQ2FwdHVyZSBWb2x1bWUiLCBBSUMzMVhYX01JQ1BHQSwgMCwKIAkJICAgICAgIDExOSwgMCwgbWljX3BnYV90bHYpLAotCi0JU09DX0RPVUJMRV9SKCJIUCBEcml2ZXIgUGxheWJhY2sgU3dpdGNoIiwgQUlDMzFYWF9IUExHQUlOLAotCQkgICAgIEFJQzMxWFhfSFBSR0FJTiwgMiwgMSwgMCksCi0JU09DX0RPVUJMRV9SX1RMVigiSFAgRHJpdmVyIFBsYXliYWNrIFZvbHVtZSIsIEFJQzMxWFhfSFBMR0FJTiwKLQkJCSBBSUMzMVhYX0hQUkdBSU4sIDMsIDB4MDksIDAsIGhwX2Rydl90bHYpLAotCi0JU09DX0RPVUJMRV9SX1RMVigiSFAgQW5hbG9nIFBsYXliYWNrIFZvbHVtZSIsIEFJQzMxWFhfTEFOQUxPR0hQTCwKLQkJCSBBSUMzMVhYX1JBTkFMT0dIUFIsIDAsIDB4N0YsIDEsIGhwX3ZvbF90bHYpLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMxMXhfc25kX2NvbnRyb2xzW10gPSB7CkBAIC0zOTcsMTcgKzM5OSwyOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGVmdF9vdXRwdXRfc3dpdGNoZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWMzMXh4X2xlZnRfb3V0cHV0X3N3aXRjaGVzW10gPSB7CiAJU09DX0RBUE1fU0lOR0xFKCJGcm9tIExlZnQgREFDIiwgQUlDMzFYWF9EQUNNSVhFUlJPVVRFLCA2LCAxLCAwKSwKIAlTT0NfREFQTV9TSU5HTEUoIkZyb20gTUlDMUxQIiwgQUlDMzFYWF9EQUNNSVhFUlJPVVRFLCA1LCAxLCAwKSwKIAlTT0NfREFQTV9TSU5HTEUoIkZyb20gTUlDMVJQIiwgQUlDMzFYWF9EQUNNSVhFUlJPVVRFLCA0LCAxLCAwKSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByaWdodF9vdXRwdXRfc3dpdGNoZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWMzMXh4X3JpZ2h0X291dHB1dF9zd2l0Y2hlc1tdID0gewogCVNPQ19EQVBNX1NJTkdMRSgiRnJvbSBSaWdodCBEQUMiLCBBSUMzMVhYX0RBQ01JWEVSUk9VVEUsIDIsIDEsIDApLAogCVNPQ19EQVBNX1NJTkdMRSgiRnJvbSBNSUMxUlAiLCBBSUMzMVhYX0RBQ01JWEVSUk9VVEUsIDEsIDEsIDApLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhYzMxeHhfbGVmdF9vdXRwdXRfc3dpdGNoZXNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkZyb20gTGVmdCBEQUMiLCBBSUMzMVhYX0RBQ01JWEVSUk9VVEUsIDYsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiRnJvbSBBSU4xIiwgQUlDMzFYWF9EQUNNSVhFUlJPVVRFLCA1LCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIkZyb20gQUlOMiIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgNCwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjMzF4eF9yaWdodF9vdXRwdXRfc3dpdGNoZXNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkZyb20gUmlnaHQgREFDIiwgQUlDMzFYWF9EQUNNSVhFUlJPVVRFLCAyLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIkZyb20gQUlOMiIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgMSwgMSwgMCksCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcF90ZXJtX21pYzFscCA9CiAJU09DX0RBUE1fRU5VTSgiTUlDMUxQIFAtVGVybWluYWwiLCBtaWMxbHBfcF9lbnVtKTsKIApAQCAtNDU3LDcgKzQ3MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhaWMzMXh4X2RhcG1fd2lkZ2V0c1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGNvbW1vbjMxeHhfZGFwbV93aWRnZXRzW10gPSB7CiAJU05EX1NPQ19EQVBNX0FJRl9JTigiREFDIElOIiwgIkRBQyBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCiAKIAlTTkRfU09DX0RBUE1fTVVYKCJEQUMgTGVmdCBJbnB1dCIsCkBAIC00NzMsMTQgKzQ4Niw3IEBACiAJCQkgICBBSUMzMVhYX0RBQ1NFVFVQLCA2LCAwLCBhaWMzMXh4X2RhcG1fcG93ZXJfZXZlbnQsCiAJCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAogCi0JLyogT3V0cHV0IE1peGVycyAqLwotCVNORF9TT0NfREFQTV9NSVhFUigiT3V0cHV0IExlZnQiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkgICBsZWZ0X291dHB1dF9zd2l0Y2hlcywKLQkJCSAgIEFSUkFZX1NJWkUobGVmdF9vdXRwdXRfc3dpdGNoZXMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIk91dHB1dCBSaWdodCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgIHJpZ2h0X291dHB1dF9zd2l0Y2hlcywKLQkJCSAgIEFSUkFZX1NJWkUocmlnaHRfb3V0cHV0X3N3aXRjaGVzKSksCi0KKwkvKiBIUCAqLwogCVNORF9TT0NfREFQTV9TV0lUQ0goIkhQIExlZnQiLCBTTkRfU09DX05PUE0sIDAsIDAsCiAJCQkgICAgJmFpYzMxeHhfZGFwbV9ocGxfc3dpdGNoKSwKIAlTTkRfU09DX0RBUE1fU1dJVENIKCJIUCBSaWdodCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKQEAgLTQ5NCwxMCArNTAwLDM0IEBACiAJCQkgICAgICAgTlVMTCwgMCwgYWljMzF4eF9kYXBtX3Bvd2VyX2V2ZW50LAogCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSksCiAKLQkvKiBBREMgKi8KLQlTTkRfU09DX0RBUE1fQURDX0UoIkFEQyIsICJDYXB0dXJlIiwgQUlDMzFYWF9BRENTRVRVUCwgNywgMCwKLQkJCSAgIGFpYzMxeHhfZGFwbV9wb3dlcl9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJCSAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJLyogTWljIEJpYXMgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJNSUNCSUFTIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBtaWNfYmlhc19ldmVudCwKKwkJCSAgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCisKKwkvKiBPdXRwdXRzICovCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBSIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgZGFjMzF4eF9kYXBtX3dpZGdldHNbXSA9IHsKKwkvKiBJbnB1dHMgKi8KKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjEiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjIiKSwKKworCS8qIE91dHB1dCBNaXhlcnMgKi8KKwlTTkRfU09DX0RBUE1fTUlYRVIoIk91dHB1dCBMZWZ0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgZGFjMzF4eF9sZWZ0X291dHB1dF9zd2l0Y2hlcywKKwkJCSAgIEFSUkFZX1NJWkUoZGFjMzF4eF9sZWZ0X291dHB1dF9zd2l0Y2hlcykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiT3V0cHV0IFJpZ2h0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgZGFjMzF4eF9yaWdodF9vdXRwdXRfc3dpdGNoZXMsCisJCQkgICBBUlJBWV9TSVpFKGRhYzMxeHhfcmlnaHRfb3V0cHV0X3N3aXRjaGVzKSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYWljMzF4eF9kYXBtX3dpZGdldHNbXSA9IHsKKwkvKiBJbnB1dHMgKi8KKwlTTkRfU09DX0RBUE1fSU5QVVQoIk1JQzFMUCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDMVJQIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNSUMxTE0iKSwKIAogCS8qIElucHV0IFNlbGVjdGlvbiB0byBNSUNfUEdBICovCiAJU05EX1NPQ19EQVBNX01VWCgiTUlDMUxQIFAtVGVybWluYWwiLCBTTkRfU09DX05PUE0sIDAsIDAsCkBAIC01MDcsMjQgKzUzNywyNSBAQAogCVNORF9TT0NfREFQTV9NVVgoIk1JQzFMTSBQLVRlcm1pbmFsIiwgU05EX1NPQ19OT1BNLCAwLCAwLAogCQkJICZwX3Rlcm1fbWljMWxtKSwKIAorCS8qIEFEQyAqLworCVNORF9TT0NfREFQTV9BRENfRSgiQURDIiwgIkNhcHR1cmUiLCBBSUMzMVhYX0FEQ1NFVFVQLCA3LCAwLAorCQkJICAgYWljMzF4eF9kYXBtX3Bvd2VyX2V2ZW50LCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwogCVNORF9TT0NfREFQTV9NVVgoIk1JQzFMTSBNLVRlcm1pbmFsIiwgU05EX1NPQ19OT1BNLCAwLCAwLAogCQkJICZtX3Rlcm1fbWljMWxtKSwKKwogCS8qIEVuYWJsaW5nICYgRGlzYWJsaW5nIE1JQyBHYWluIEN0bCAqLwogCVNORF9TT0NfREFQTV9QR0EoIk1JQ19HQUlOX0NUTCIsIEFJQzMxWFhfTUlDUEdBLAogCQkJIDcsIDEsIE5VTEwsIDApLAogCi0JLyogTWljIEJpYXMgKi8KLQlTTkRfU09DX0RBUE1fU1VQUExZKCJNSUNCSUFTIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBtaWNfYmlhc19ldmVudCwKLQkJCSAgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCi0KLQkvKiBPdXRwdXRzICovCi0JU05EX1NPQ19EQVBNX09VVFBVVCgiSFBMIiksCi0JU05EX1NPQ19EQVBNX09VVFBVVCgiSFBSIiksCi0KLQkvKiBJbnB1dHMgKi8KLQlTTkRfU09DX0RBUE1fSU5QVVQoIk1JQzFMUCIpLAotCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDMVJQIiksCi0JU05EX1NPQ19EQVBNX0lOUFVUKCJNSUMxTE0iKSwKKwkvKiBPdXRwdXQgTWl4ZXJzICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJPdXRwdXQgTGVmdCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgIGFpYzMxeHhfbGVmdF9vdXRwdXRfc3dpdGNoZXMsCisJCQkgICBBUlJBWV9TSVpFKGFpYzMxeHhfbGVmdF9vdXRwdXRfc3dpdGNoZXMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIk91dHB1dCBSaWdodCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgIGFpYzMxeHhfcmlnaHRfb3V0cHV0X3N3aXRjaGVzLAorCQkJICAgQVJSQVlfU0laRShhaWMzMXh4X3JpZ2h0X291dHB1dF9zd2l0Y2hlcykpLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGFpYzMxMXhfZGFwbV93aWRnZXRzW10gPSB7CkBAIC01NTQsNyArNTg1LDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlCi1haWMzMXh4X2F1ZGlvX21hcFtdID0geworY29tbW9uMzF4eF9hdWRpb19tYXBbXSA9IHsKIAkvKiBEQUMgSW5wdXQgUm91dGluZyAqLwogCXsiREFDIExlZnQgSW5wdXQiLCAiTGVmdCBEYXRhIiwgIkRBQyBJTiJ9LAogCXsiREFDIExlZnQgSW5wdXQiLCAiUmlnaHQgRGF0YSIsICJEQUMgSU4ifSwKQEAgLTU2NSw2ICs1OTYsMzEgQEAKIAl7IkRBQyBMZWZ0IiwgTlVMTCwgIkRBQyBMZWZ0IElucHV0In0sCiAJeyJEQUMgUmlnaHQiLCBOVUxMLCAiREFDIFJpZ2h0IElucHV0In0sCiAKKwkvKiBIUEwgcGF0aCAqLworCXsiSFAgTGVmdCIsICJTd2l0Y2giLCAiT3V0cHV0IExlZnQifSwKKwl7IkhQTCBEcml2ZXIiLCBOVUxMLCAiSFAgTGVmdCJ9LAorCXsiSFBMIiwgTlVMTCwgIkhQTCBEcml2ZXIifSwKKworCS8qIEhQUiBwYXRoICovCisJeyJIUCBSaWdodCIsICJTd2l0Y2giLCAiT3V0cHV0IFJpZ2h0In0sCisJeyJIUFIgRHJpdmVyIiwgTlVMTCwgIkhQIFJpZ2h0In0sCisJeyJIUFIiLCBOVUxMLCAiSFBSIERyaXZlciJ9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUKK2RhYzMxeHhfYXVkaW9fbWFwW10gPSB7CisJLyogTGVmdCBPdXRwdXQgKi8KKwl7Ik91dHB1dCBMZWZ0IiwgIkZyb20gTGVmdCBEQUMiLCAiREFDIExlZnQifSwKKwl7Ik91dHB1dCBMZWZ0IiwgIkZyb20gQUlOMSIsICJBSU4xIn0sCisJeyJPdXRwdXQgTGVmdCIsICJGcm9tIEFJTjIiLCAiQUlOMiJ9LAorCisJLyogUmlnaHQgT3V0cHV0ICovCisJeyJPdXRwdXQgUmlnaHQiLCAiRnJvbSBSaWdodCBEQUMiLCAiREFDIFJpZ2h0In0sCisJeyJPdXRwdXQgUmlnaHQiLCAiRnJvbSBBSU4yIiwgIkFJTjIifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlCithaWMzMXh4X2F1ZGlvX21hcFtdID0gewogCS8qIE1pYyBpbnB1dCAqLwogCXsiTUlDMUxQIFAtVGVybWluYWwiLCAiRkZSIDEwIE9obSIsICJNSUMxTFAifSwKIAl7Ik1JQzFMUCBQLVRlcm1pbmFsIiwgIkZGUiAyMCBPaG0iLCAiTUlDMUxQIn0sCkBAIC01OTUsMTYgKzY1MSw2IEBACiAJLyogUmlnaHQgT3V0cHV0ICovCiAJeyJPdXRwdXQgUmlnaHQiLCAiRnJvbSBSaWdodCBEQUMiLCAiREFDIFJpZ2h0In0sCiAJeyJPdXRwdXQgUmlnaHQiLCAiRnJvbSBNSUMxUlAiLCAiTUlDMVJQIn0sCi0KLQkvKiBIUEwgcGF0aCAqLwotCXsiSFAgTGVmdCIsICJTd2l0Y2giLCAiT3V0cHV0IExlZnQifSwKLQl7IkhQTCBEcml2ZXIiLCBOVUxMLCAiSFAgTGVmdCJ9LAotCXsiSFBMIiwgTlVMTCwgIkhQTCBEcml2ZXIifSwKLQotCS8qIEhQUiBwYXRoICovCi0JeyJIUCBSaWdodCIsICJTd2l0Y2giLCAiT3V0cHV0IFJpZ2h0In0sCi0JeyJIUFIgRHJpdmVyIiwgTlVMTCwgIkhQIFJpZ2h0In0sCi0JeyJIUFIiLCBOVUxMLCAiSFBSIERyaXZlciJ9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUKQEAgLTYzMyw2ICs2NzksMTMgQEAKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKKwlpZiAoIShhaWMzMXh4LT5wZGF0YS5jb2RlY190eXBlICYgREFDMzFYWF9CSVQpKQorCQlyZXQgPSBzbmRfc29jX2FkZF9jb2RlY19jb250cm9scygKKwkJCWNvZGVjLCBhaWMzMXh4X3NuZF9jb250cm9scywKKwkJCUFSUkFZX1NJWkUoYWljMzF4eF9zbmRfY29udHJvbHMpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJaWYgKGFpYzMxeHgtPnBkYXRhLmNvZGVjX3R5cGUgJiBBSUMzMVhYX1NURVJFT19DTEFTU19EX0JJVCkKIAkJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoCiAJCQljb2RlYywgYWljMzExeF9zbmRfY29udHJvbHMsCkBAIC02NTEsNiArNzA0LDMwIEBACiAJc3RydWN0IGFpYzMxeHhfcHJpdiAqYWljMzF4eCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCByZXQgPSAwOwogCisJaWYgKGFpYzMxeHgtPnBkYXRhLmNvZGVjX3R5cGUgJiBEQUMzMVhYX0JJVCkgeworCQlyZXQgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKAorCQkJZGFwbSwgZGFjMzF4eF9kYXBtX3dpZGdldHMsCisJCQlBUlJBWV9TSVpFKGRhYzMxeHhfZGFwbV93aWRnZXRzKSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGRhYzMxeHhfYXVkaW9fbWFwLAorCQkJCQkgICAgICBBUlJBWV9TSVpFKGRhYzMxeHhfYXVkaW9fbWFwKSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoCisJCQlkYXBtLCBhaWMzMXh4X2RhcG1fd2lkZ2V0cywKKwkJCUFSUkFZX1NJWkUoYWljMzF4eF9kYXBtX3dpZGdldHMpKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYWljMzF4eF9hdWRpb19tYXAsCisJCQkJCSAgICAgIEFSUkFZX1NJWkUoYWljMzF4eF9hdWRpb19tYXApKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCiAJaWYgKGFpYzMxeHgtPnBkYXRhLmNvZGVjX3R5cGUgJiBBSUMzMVhYX1NURVJFT19DTEFTU19EX0JJVCkgewogCQlyZXQgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKAogCQkJZGFwbSwgYWljMzExeF9kYXBtX3dpZGdldHMsCkBAIC0xMTE0LDEyICsxMTkxLDE0IEBACiAJLnNldF9iaWFzX2xldmVsCQk9IGFpYzMxeHhfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYJPSB0cnVlLAogCi0JLmNvbnRyb2xzCQk9IGFpYzMxeHhfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhaWMzMXh4X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cwkJPSBhaWMzMXh4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWljMzF4eF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBhaWMzMXh4X2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhaWMzMXh4X2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBjb21tb24zMXh4X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGNvbW1vbjMxeHhfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBjb21tb24zMXh4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGNvbW1vbjMxeHhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGNvbW1vbjMxeHhfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShjb21tb24zMXh4X2F1ZGlvX21hcCksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIGFpYzMxeHhfZGFpX29wcyA9IHsKQEAgLTExMjksMTkgKzEyMDgsMzQgQEAKIAkuZGlnaXRhbF9tdXRlCT0gYWljMzF4eF9kYWNfbXV0ZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGRhYzMxeHhfZGFpX2RyaXZlcltdID0geworCXsKKwkJLm5hbWUgPSAidGx2MzJkYWMzMXh4LWhpZmkiLAorCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUJID0gIlBsYXliYWNrIiwKKwkJCS5jaGFubmVsc19taW4JID0gMiwKKwkJCS5jaGFubmVsc19tYXgJID0gMiwKKwkJCS5yYXRlcwkJID0gQUlDMzFYWF9SQVRFUywKKwkJCS5mb3JtYXRzCSA9IEFJQzMxWFhfRk9STUFUUywKKwkJfSwKKwkJLm9wcyA9ICZhaWMzMXh4X2RhaV9vcHMsCisJCS5zeW1tZXRyaWNfcmF0ZXMgPSAxLAorCX0KK307CisKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGFpYzMxeHhfZGFpX2RyaXZlcltdID0gewogCXsKIAkJLm5hbWUgPSAidGx2MzIwYWljMzF4eC1oaWZpIiwKIAkJLnBsYXliYWNrID0gewogCQkJLnN0cmVhbV9uYW1lCSA9ICJQbGF5YmFjayIsCi0JCQkuY2hhbm5lbHNfbWluCSA9IDEsCisJCQkuY2hhbm5lbHNfbWluCSA9IDIsCiAJCQkuY2hhbm5lbHNfbWF4CSA9IDIsCiAJCQkucmF0ZXMJCSA9IEFJQzMxWFhfUkFURVMsCiAJCQkuZm9ybWF0cwkgPSBBSUMzMVhYX0ZPUk1BVFMsCiAJCX0sCiAJCS5jYXB0dXJlID0gewogCQkJLnN0cmVhbV9uYW1lCSA9ICJDYXB0dXJlIiwKLQkJCS5jaGFubmVsc19taW4JID0gMSwKKwkJCS5jaGFubmVsc19taW4JID0gMiwKIAkJCS5jaGFubmVsc19tYXgJID0gMiwKIAkJCS5yYXRlcwkJID0gQUlDMzFYWF9SQVRFUywKIAkJCS5mb3JtYXRzCSA9IEFJQzMxWFhfRk9STUFUUywKQEAgLTEyNTksOSArMTM1MywxNiBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsICZzb2NfY29kZWNfZHJpdmVyX2FpYzMxeHgsCi0JCQkJICAgICBhaWMzMXh4X2RhaV9kcml2ZXIsCi0JCQkJICAgICBBUlJBWV9TSVpFKGFpYzMxeHhfZGFpX2RyaXZlcikpOworCWlmIChhaWMzMXh4LT5wZGF0YS5jb2RlY190eXBlICYgREFDMzFYWF9CSVQpCisJCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwKKwkJCQkmc29jX2NvZGVjX2RyaXZlcl9haWMzMXh4LAorCQkJCWRhYzMxeHhfZGFpX2RyaXZlciwKKwkJCQlBUlJBWV9TSVpFKGRhYzMxeHhfZGFpX2RyaXZlcikpOworCWVsc2UKKwkJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LAorCQkJCSZzb2NfY29kZWNfZHJpdmVyX2FpYzMxeHgsCisJCQkJYWljMzF4eF9kYWlfZHJpdmVyLAorCQkJCUFSUkFZX1NJWkUoYWljMzF4eF9kYWlfZHJpdmVyKSk7CiB9CiAKIHN0YXRpYyBpbnQgYWljMzF4eF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMpCkBAIC0xMjc3LDYgKzEzNzgsNyBAQAogCXsgInRsdjMyMGFpYzMxMTAiLCBBSUMzMTEwIH0sCiAJeyAidGx2MzIwYWljMzEyMCIsIEFJQzMxMjAgfSwKIAl7ICJ0bHYzMjBhaWMzMTExIiwgQUlDMzExMSB9LAorCXsgInRsdjMyMGRhYzMxMDAiLCBEQUMzMTAwIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFpYzMxeHhfaTJjX2lkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzF4eC5oIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMXh4LmgKaW5kZXggYWM5YjE0Ni4uNWFjZDViNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMXh4LmgKKysrIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMXh4LmgKQEAgLTI0LDEyICsyNCwxNCBAQAogCiAjZGVmaW5lIEFJQzMxWFhfU1RFUkVPX0NMQVNTX0RfQklUCTB4MQogI2RlZmluZSBBSUMzMVhYX01JTklEU1BfQklUCQkweDIKKyNkZWZpbmUgREFDMzFYWF9CSVQJCQkweDQKIAogZW51bSBhaWMzMXh4X3R5cGUgewogCUFJQzMxMDAJPSAwLAogCUFJQzMxMTAgPSBBSUMzMVhYX1NURVJFT19DTEFTU19EX0JJVCwKIAlBSUMzMTIwID0gQUlDMzFYWF9NSU5JRFNQX0JJVCwKIAlBSUMzMTExID0gKEFJQzMxWFhfU1RFUkVPX0NMQVNTX0RfQklUIHwgQUlDMzFYWF9NSU5JRFNQX0JJVCksCisJREFDMzEwMCA9IERBQzMxWFhfQklULAogfTsKIAogc3RydWN0IGFpYzMxeHhfcGRhdGEgewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMng0LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuYwppbmRleCA4NWQ0OTc4Li4yOGZkZmM1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuYwpAQCAtNzk3LDEyICs3OTcsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSBhaWMzMng0X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IGFpYzMyeDRfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFpYzMyeDRfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gYWljMzJ4NF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFpYzMyeDRfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhaWMzMng0X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFpYzMyeDRfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWljMzJ4NF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhaWMzMng0X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gYWljMzJ4NF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhaWMzMng0X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhaWMzMng0X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhaWMzMng0X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBhaWMzMng0X3BhcnNlX2R0KHN0cnVjdCBhaWMzMng0X3ByaXYgKmFpYzMyeDQsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMKaW5kZXggYTU2NDc1OS4uNWE4ZDk2ZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljM3guYwpAQCAtMTY3MCwxMiArMTY3MCwxNCBAQAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIAkucHJvYmUgPSBhaWMzeF9wcm9iZSwKIAkucmVtb3ZlID0gYWljM3hfcmVtb3ZlLAotCS5jb250cm9scyA9IGFpYzN4X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhaWMzeF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBhaWMzeF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFpYzN4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gaW50ZXJjb24sCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoaW50ZXJjb24pLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWljM3hfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWljM3hfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhaWMzeF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhaWMzeF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gaW50ZXJjb24sCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGludGVyY29uKSwKKwl9LAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwZGFjMzMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwZGFjMzMuYwppbmRleCBmN2E2Y2U3Li43YmNmMDFlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGRhYzMzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBkYWMzMy5jCkBAIC05MCw3ICs5MCw2IEBACiAKIHN0cnVjdCB0bHYzMjBkYWMzM19wcml2IHsKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmRhYzMzX3dxOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKIAlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSBzdXBwbGllc1tEQUMzM19OVU1fU1VQUExJRVNdOwpAQCAtNzcxLDcgKzc3MCw3IEBACiAKIAkvKiBEbyBub3Qgc2NoZWR1bGUgdGhlIHdvcmtxdWV1ZSBpbiBNb2RlNyAqLwogCWlmIChkYWMzMy0+Zmlmb19tb2RlICE9IERBQzMzX0ZJRk9fTU9ERTcpCi0JCXF1ZXVlX3dvcmsoZGFjMzMtPmRhYzMzX3dxLCAmZGFjMzMtPndvcmspOworCQlzY2hlZHVsZV93b3JrKCZkYWMzMy0+d29yayk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0xMTI3LDcgKzExMjYsNyBAQAogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKIAkJaWYgKGRhYzMzLT5maWZvX21vZGUpIHsKIAkJCWRhYzMzLT5zdGF0ZSA9IERBQzMzX1BSRUZJTEw7Ci0JCQlxdWV1ZV93b3JrKGRhYzMzLT5kYWMzM193cSwgJmRhYzMzLT53b3JrKTsKKwkJCXNjaGVkdWxlX3dvcmsoJmRhYzMzLT53b3JrKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CkBAIC0xMTM1LDcgKzExMzQsNyBAQAogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKIAkJaWYgKGRhYzMzLT5maWZvX21vZGUpIHsKIAkJCWRhYzMzLT5zdGF0ZSA9IERBQzMzX0ZMVVNIOwotCQkJcXVldWVfd29yayhkYWMzMy0+ZGFjMzNfd3EsICZkYWMzMy0+d29yayk7CisJCQlzY2hlZHVsZV93b3JrKCZkYWMzMy0+d29yayk7CiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTE0MTAsMTQgKzE0MDksNiBAQAogCQkJZGFjMzMtPmlycSA9IC0xOwogCQl9CiAJCWlmIChkYWMzMy0+aXJxICE9IC0xKSB7Ci0JCQkvKiBTZXR1cCB3b3JrIHF1ZXVlICovCi0JCQlkYWMzMy0+ZGFjMzNfd3EgPQotCQkJCWNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJ0bHYzMjBkYWMzMyIpOwotCQkJaWYgKGRhYzMzLT5kYWMzM193cSA9PSBOVUxMKSB7Ci0JCQkJZnJlZV9pcnEoZGFjMzMtPmlycSwgY29kZWMpOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCiAJCQlJTklUX1dPUksoJmRhYzMzLT53b3JrLCBkYWMzM193b3JrKTsKIAkJfQogCX0KQEAgLTE0MzcsNyArMTQyOCw3IEBACiAKIAlpZiAoZGFjMzMtPmlycSA+PSAwKSB7CiAJCWZyZWVfaXJxKGRhYzMzLT5pcnEsIGRhYzMzLT5jb2RlYyk7Ci0JCWRlc3Ryb3lfd29ya3F1ZXVlKGRhYzMzLT5kYWMzM193cSk7CisJCWZsdXNoX3dvcmsoJmRhYzMzLT53b3JrKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDUzLDEyICsxNDQ0LDE0IEBACiAJLnByb2JlID0gZGFjMzNfc29jX3Byb2JlLAogCS5yZW1vdmUgPSBkYWMzM19zb2NfcmVtb3ZlLAogCi0JLmNvbnRyb2xzID0gZGFjMzNfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGRhYzMzX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGRhYzMzX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoZGFjMzNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGRhYzMzX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGRhYzMzX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gZGFjMzNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoZGFjMzNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGF1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogI2RlZmluZSBEQUMzM19SQVRFUwkoU05EUlZfUENNX1JBVEVfNDQxMDAgfCBcCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RwYTYxMzBhMi5jIGIvc291bmQvc29jL2NvZGVjcy90cGE2MTMwYTIuYwppbmRleCBmMWVhMDUyLi4yZTAxNGM4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RwYTYxMzBhMi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdHBhNjEzMGEyLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAogc3RhdGljIGludCB0cGE2MTMwYTJfcG93ZXIoc3RydWN0IHRwYTYxMzBhMl9kYXRhICpkYXRhLCBib29sIGVuYWJsZSkKIHsKLQlpbnQgcmV0OworCWludCByZXQgPSAwLCByZXQyOwogCiAJaWYgKGVuYWJsZSkgewogCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGRhdGEtPnN1cHBseSk7CkBAIC02NCw3ICs2NCwzMCBAQAogCQkvKiBQb3dlciBvbiAqLwogCQlpZiAoZGF0YS0+cG93ZXJfZ3BpbyA+PSAwKQogCQkJZ3Bpb19zZXRfdmFsdWUoZGF0YS0+cG93ZXJfZ3BpbywgMSk7CisKKwkJLyogU3luYyByZWdpc3RlcnMgKi8KKwkJcmVnY2FjaGVfY2FjaGVfb25seShkYXRhLT5yZWdtYXAsIGZhbHNlKTsKKwkJcmV0ID0gcmVnY2FjaGVfc3luYyhkYXRhLT5yZWdtYXApOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWRldl9lcnIoZGF0YS0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gc3luYyByZWdpc3RlcnM6ICVkXG4iLCByZXQpOworCQkJcmVnY2FjaGVfY2FjaGVfb25seShkYXRhLT5yZWdtYXAsIHRydWUpOworCQkJaWYgKGRhdGEtPnBvd2VyX2dwaW8gPj0gMCkKKwkJCQlncGlvX3NldF92YWx1ZShkYXRhLT5wb3dlcl9ncGlvLCAwKTsKKwkJCXJldDIgPSByZWd1bGF0b3JfZGlzYWJsZShkYXRhLT5zdXBwbHkpOworCQkJaWYgKHJldDIgIT0gMCkKKwkJCQlkZXZfZXJyKGRhdGEtPmRldiwKKwkJCQkJIkZhaWxlZCB0byBkaXNhYmxlIHN1cHBseTogJWRcbiIsIHJldDIpOworCQkJcmV0dXJuIHJldDsKKwkJfQogCX0gZWxzZSB7CisJCS8qIFBvd2VyZWQgb2ZmIGRldmljZSBkb2VzIG5vdCByZXRhaW4gcmVnaXN0ZXJzLiBXaGlsZSBkZXZpY2UKKwkJICogaXMgb2ZmLCBhbnkgcmVnaXN0ZXIgdXBkYXRlcyAoaS5lLiB2b2x1bWUgY2hhbmdlcykgc2hvdWxkCisJCSAqIGhhcHBlbiBpbiBjYWNoZSBvbmx5LgorCQkgKi8KKwkJcmVnY2FjaGVfbWFya19kaXJ0eShkYXRhLT5yZWdtYXApOworCQlyZWdjYWNoZV9jYWNoZV9vbmx5KGRhdGEtPnJlZ21hcCwgdHJ1ZSk7CisKIAkJLyogUG93ZXIgb2ZmICovCiAJCWlmIChkYXRhLT5wb3dlcl9ncGlvID49IDApCiAJCQlncGlvX3NldF92YWx1ZShkYXRhLT5wb3dlcl9ncGlvLCAwKTsKQEAgLTc1LDkgKzk4LDYgQEAKIAkJCQkiRmFpbGVkIHRvIGRpc2FibGUgc3VwcGx5OiAlZFxuIiwgcmV0KTsKIAkJCXJldHVybiByZXQ7CiAJCX0KLQotCQkvKiBkZXZpY2UgcmVncyBkb2VzIG5vdCBtYXRjaCB0aGUgY2FjaGUgc3RhdGUgYW55bW9yZSAqLwotCQlyZWdjYWNoZV9tYXJrX2RpcnR5KGRhdGEtPnJlZ21hcCk7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTg4LDI1ICsxMDgsMTQgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmMgPSBzbmRfc29jX2RhcG1fdG9fY29tcG9uZW50KHctPmRhcG0pOwogCXN0cnVjdCB0cGE2MTMwYTJfZGF0YSAqZGF0YSA9IHNuZF9zb2NfY29tcG9uZW50X2dldF9kcnZkYXRhKGMpOwotCWludCByZXQ7CiAKLQkvKiBiZWZvcmUgd2lkZ2V0IHBvd2VyIHVwICovCiAJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpIHsKLQkJLyogVHVybiBvbiB0aGUgY2hpcCAqLwotCQl0cGE2MTMwYTJfcG93ZXIoZGF0YSwgdHJ1ZSk7Ci0JCS8qIFN5bmMgdGhlIHJlZ2lzdGVycyAqLwotCQlyZXQgPSByZWdjYWNoZV9zeW5jKGRhdGEtPnJlZ21hcCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGMtPmRldiwgIkZhaWxlZCB0byBpbml0aWFsaXplIGNoaXBcbiIpOwotCQkJdHBhNjEzMGEyX3Bvd2VyKGRhdGEsIGZhbHNlKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkvKiBhZnRlciB3aWRnZXQgcG93ZXIgZG93biAqLworCQkvKiBCZWZvcmUgd2lkZ2V0IHBvd2VyIHVwOiB0dXJuIGNoaXAgb24sIHN5bmMgcmVnaXN0ZXJzICovCisJCXJldHVybiB0cGE2MTMwYTJfcG93ZXIoZGF0YSwgdHJ1ZSk7CiAJfSBlbHNlIHsKLQkJdHBhNjEzMGEyX3Bvd2VyKGRhdGEsIGZhbHNlKTsKKwkJLyogQWZ0ZXIgd2lkZ2V0IHBvd2VyIGRvd246IHR1cm4gY2hpcCBvZmYgKi8KKwkJcmV0dXJuIHRwYTYxMzBhMl9wb3dlcihkYXRhLCBmYWxzZSk7CiAJfQotCi0JcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xOTAsNyArMTk5LDcgQEAKIAl7ICJSaWdodCBQR0EiLCBOVUxMLCAiUG93ZXIiIH0sCiB9OwogCi1zdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyIHRwYTYxMzBhMl9jb21wb25lbnRfZHJpdmVyID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgdHBhNjEzMGEyX2NvbXBvbmVudF9kcml2ZXIgPSB7CiAJLm5hbWUgPSAidHBhNjEzMGEyIiwKIAkucHJvYmUgPSB0cGE2MTMwYTJfY29tcG9uZW50X3Byb2JlLAogCS5kYXBtX3dpZGdldHMgPSB0cGE2MTMwYTJfZGFwbV93aWRnZXRzLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3R3bDQwMzAuYwppbmRleCBhNWE0ZTlmLi5hMjEwNGQ2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3R3bDQwMzAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3R3bDQwMzAuYwpAQCAtMjE5OSwxMiArMjE5OSwxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IHR3bDQwMzBfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gdHdsNDAzMF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUodHdsNDAzMF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB0d2w0MDMwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodHdsNDAzMF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGludGVyY29uKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHR3bDQwMzBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUodHdsNDAzMF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHR3bDQwMzBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUodHdsNDAzMF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gaW50ZXJjb24sCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGludGVyY29uKSwKKwl9LAogfTsKIAogc3RhdGljIGludCB0d2w0MDMwX2NvZGVjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3R3bDYwNDAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5jCmluZGV4IDFmNzA4MTAuLjc0ODAzNmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5jCkBAIC0xMTU2LDEyICsxMTU2LDE0IEBACiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCS5pZ25vcmVfcG1kb3duX3RpbWUgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gdHdsNjA0MF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUodHdsNjA0MF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB0d2w2MDQwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodHdsNjA0MF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGludGVyY29uKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHR3bDYwNDBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUodHdsNjA0MF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHR3bDYwNDBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUodHdsNjA0MF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gaW50ZXJjb24sCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGludGVyY29uKSwKKwl9LAogfTsKIAogc3RhdGljIGludCB0d2w2MDQwX2NvZGVjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3VkYTEzNHguYyBiL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM0eC5jCmluZGV4IGU0YzY5NGMuLjVmZGVlODcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM0eC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM0eC5jCkBAIC01MjMsMTAgKzUyMywxMiBAQAogCS5zZXRfYmlhc19sZXZlbCA9IHVkYTEzNHhfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmRhcG1fd2lkZ2V0cyA9IHVkYTEzNHhfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh1ZGExMzR4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gdWRhMTM0eF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh1ZGExMzR4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSB1ZGExMzR4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHVkYTEzNHhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHVkYTEzNHhfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHVkYTEzNHhfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgdWRhMTM0eF9yZWdtYXBfY29uZmlnID0gewpAQCAtNTQ0LDYgKzU0Niw3IEBACiB7CiAJc3RydWN0IHVkYTEzNHhfcGxhdGZvcm1fZGF0YSAqcGQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgdWRhMTM0eF9wcml2ICp1ZGExMzR4OworCWludCByZXQ7CiAKIAlpZiAoIXBkKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pc3NpbmcgTDMgYml0YmFuZyBmdW5jdGlvblxuIik7CkBAIC01NTcsNiArNTYwLDEyIEBACiAJdWRhMTM0eC0+cGQgPSBwZDsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB1ZGExMzR4KTsKIAorCWlmIChwZC0+bDMudXNlX2dwaW9zKSB7CisJCXJldCA9IGwzX3NldF9ncGlvX29wcygmcGRldi0+ZGV2LCAmdWRhMTM0eC0+cGQtPmwzKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKwogCXVkYTEzNHgtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXQoJnBkZXYtPmRldiwgTlVMTCwgcGQsCiAJCSZ1ZGExMzR4X3JlZ21hcF9jb25maWcpOwogCWlmIChJU19FUlIodWRhMTM0eC0+cmVnbWFwKSkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM4MC5jIGIvc291bmQvc29jL2NvZGVjcy91ZGExMzgwLmMKaW5kZXggMzVmMDQ2OS4uNTMzZTNiYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy91ZGExMzgwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy91ZGExMzgwLmMKQEAgLTc2NSwxMiArNzY1LDE0IEBACiAJLnJlZ19jYWNoZV9kZWZhdWx0ID0gdWRhMTM4MF9yZWcsCiAJLnJlZ19jYWNoZV9zdGVwID0gMSwKIAotCS5jb250cm9scyA9IHVkYTEzODBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHVkYTEzODBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gdWRhMTM4MF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHVkYTEzODBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB1ZGExMzgwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHVkYTEzODBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gdWRhMTM4MF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh1ZGExMzgwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gdWRhMTM4MF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh1ZGExMzgwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB1ZGExMzgwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh1ZGExMzgwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2wxMjczLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dsMTI3My5jCmluZGV4IDFiNzk3NzguLmZjZmZiNmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2wxMjczLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bDEyNzMuYwpAQCAtNDg0LDEyICs0ODQsMTQgQEAKIAkucHJvYmUgPSB3bDEyNzNfcHJvYmUsCiAJLnJlbW92ZSA9IHdsMTI3M19yZW1vdmUsCiAKLQkuY29udHJvbHMgPSB3bDEyNzNfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod2wxMjczX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd2wxMjczX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod2wxMjczX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd2wxMjczX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdsMTI3M19kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bDEyNzNfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bDEyNzNfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdsMTI3M19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bDEyNzNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdsMTI3M19kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod2wxMjczX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCB3bDEyNzNfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd20wMDEwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtMDAxMC5jCmluZGV4IGUzYzM0YmQuLjBlYjVkY2YgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd20wMDEwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTAwMTAuYwpAQCAtNzg5LDE2ICs3ODksMTggQEAKIAogc3RhdGljIGludCB3bTAwMTBfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtMDAxMCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTAwMTAgPSB7CiAJLnByb2JlID0gd20wMDEwX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtMDAxMF9zZXRfYmlhc19sZXZlbCwKIAkuc2V0X3N5c2NsayA9IHdtMDAxMF9zZXRfc3lzY2xrLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5kYXBtX3dpZGdldHMgPSB3bTAwMTBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTAwMTBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTAwMTBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod20wMDEwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTAwMTBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod20wMDEwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTAwMTBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtMDAxMF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKICNkZWZpbmUgV00wMDEwX1JBVEVTIChTTkRSVl9QQ01fUkFURV80NDEwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTEyNTAtZXYxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtMTI1MC1ldjEuYwppbmRleCBlYzQ1YzViLi5jZjVmMDU4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtMTI1MC1ldjEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtMTI1MC1ldjEuYwpAQCAtMTQxLDEyICsxNDEsMTMgQEAKIAkub3BzID0gJndtMTI1MF9ldjFfb3BzLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtMTI1MF9ldjEgPSB7Ci0JLmRhcG1fd2lkZ2V0cyA9IHdtMTI1MF9ldjFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTEyNTBfZXYxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd20xMjUwX2V2MV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTEyNTBfZXYxX2RhcG1fcm91dGVzKSwKLQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtMTI1MF9ldjEgPSB7CisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gd20xMjUwX2V2MV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTEyNTBfZXYxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTEyNTBfZXYxX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTEyNTBfZXYxX2RhcG1fcm91dGVzKSwKKwl9LAogCS5zZXRfYmlhc19sZXZlbCA9IHdtMTI1MF9ldjFfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd20yMDAwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtMjAwMC5jCmluZGV4IGE2N2VhMTAuLjIzY2RlM2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd20yMDAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTIwMDAuYwpAQCAtNTgxLDcgKzU4MSw3IEBACiAJaWYgKGFuY190cmFuc2l0aW9uc1tpXS5kZXN0ID09IEFOQ19PRkYpCiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZSh3bTIwMDAtPm1jbGspOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB3bTIwMDBfYW5jX3NldF9tb2RlKHN0cnVjdCB3bTIwMDBfcHJpdiAqd20yMDAwKQpAQCAtNzk5LDE4ICs3OTksMjAgQEAKIAlyZXR1cm4gd20yMDAwX2FuY190cmFuc2l0aW9uKHdtMjAwMCwgQU5DX09GRik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTIwMDAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd20yMDAwID0gewogCS5wcm9iZSA9IHdtMjAwMF9wcm9iZSwKIAkucmVtb3ZlID0gd20yMDAwX3JlbW92ZSwKIAkuc3VzcGVuZCA9IHdtMjAwMF9zdXNwZW5kLAogCS5yZXN1bWUgPSB3bTIwMDBfcmVzdW1lLAogCi0JLmRhcG1fd2lkZ2V0cyA9IHdtMjAwMF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtMjAwMF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtMjAwMF9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod20yMDAwX2F1ZGlvX21hcCksCi0JLmNvbnRyb2xzID0gd20yMDAwX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtMjAwMF9jb250cm9scyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTIwMDBfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTIwMDBfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtMjAwMF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTIwMDBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtMjAwMF9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtMjAwMF9hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHdtMjAwMF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd20yMjAwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtMjIwMC5jCmluZGV4IGZkMTQzOWUuLjYwNmJmODggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd20yMjAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTIyMDAuYwpAQCAtMjEwMyw3ICsyMTAzLDcgQEAKIAkub3BzID0gJndtMjIwMF9kYWlfb3BzLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfd20yMjAwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfd20yMjAwID0gewogCS5wcm9iZSA9IHdtMjIwMF9wcm9iZSwKIAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKQEAgLTIxMTEsMTIgKzIxMTEsMTQgQEAKIAkuc2V0X3N5c2NsayA9IHdtMjIwMF9zZXRfc3lzY2xrLAogCS5zZXRfcGxsID0gd20yMjAwX3NldF9mbGwsCiAKLQkuY29udHJvbHMgPSB3bTIyMDBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtMjIwMF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTIyMDBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTIyMDBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTIyMDBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod20yMjAwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtMjIwMF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTIyMDBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTIyMDBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod20yMjAwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTIyMDBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtMjIwMF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB3bTIyMDBfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTUxMDAuYwppbmRleCA1MTJhOWQyLi41NjA1NzUwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAwLmMKQEAgLTIyODUsNyArMjI4NSw3IEBACiAJCQkJICAoMSA8PCBXTTUxMDBfR1AxX0RJUl9TSElGVCkpOwogfQogCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCB3bTUxMDBfdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHdtNTEwMF90ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gIndtNTEwMCIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuZGlyZWN0aW9uX291dHB1dAk9IHdtNTEwMF9ncGlvX2RpcmVjdGlvbl9vdXQsCkBAIC0yMzgxLDcgKzIzODEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd201MTAwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtNTEwMCA9IHsKIAkucHJvYmUgPQl3bTUxMDBfcHJvYmUsCiAJLnJlbW92ZSA9CXdtNTEwMF9yZW1vdmUsCiAKQEAgLTIzOTAsMTIgKzIzOTAsMTQgQEAKIAkuaWRsZV9iaWFzX29mZiA9IDEsCiAKIAkuc2VxX25vdGlmaWVyID0gd201MTAwX3NlcV9ub3RpZmllciwKLQkuY29udHJvbHMgPSB3bTUxMDBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtNTEwMF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTUxMDBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTUxMDBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTUxMDBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod201MTAwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtNTEwMF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTUxMDBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTUxMDBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod201MTAwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTUxMDBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtNTEwMF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3bTUxMDBfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTUxMDIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAyLmMKaW5kZXggODQ2ZGVlZC4uOTM4NzZjNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTUxMDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMi5jCkBAIC0xNTIxLDYgKzE1MjEsMTYgQEAKIAl7ICJJTjNMIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAl7ICJJTjNSIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAorCXsgIkFTUkMxTCIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQVNSQzFSIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBU1JDMkwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFTUkMyUiIsIE5VTEwsICJTWVNDTEsiIH0sCisKKwl7ICJBU1JDMUwiLCBOVUxMLCAiQVNZTkNDTEsiIH0sCisJeyAiQVNSQzFSIiwgTlVMTCwgIkFTWU5DQ0xLIiB9LAorCXsgIkFTUkMyTCIsIE5VTEwsICJBU1lOQ0NMSyIgfSwKKwl7ICJBU1JDMlIiLCBOVUxMLCAiQVNZTkNDTEsiIH0sCisKIAl7ICJNSUNCSUFTMSIsIE5VTEwsICJNSUNWREQiIH0sCiAJeyAiTUlDQklBUzIiLCBOVUxMLCAiTUlDVkREIiB9LAogCXsgIk1JQ0JJQVMzIiwgTlVMTCwgIk1JQ1ZERCIgfSwKQEAgLTE2MDAsNyArMTYxMCw2IEBACiAJeyAiU2xpbTMgQ2FwdHVyZSIsIE5VTEwsICJTWVNDTEsiIH0sCiAKIAl7ICJBdWRpbyBUcmFjZSBEU1AiLCBOVUxMLCAiRFNQMSIgfSwKLQl7ICJBdWRpbyBUcmFjZSBEU1AiLCBOVUxMLCAiU1lTQ0xLIiB9LAogCiAJeyAiSU4xTCBQR0EiLCBOVUxMLCAiSU4xTCIgfSwKIAl7ICJJTjFSIFBHQSIsIE5VTEwsICJJTjFSIiB9LApAQCAtMTk5MCw3ICsxOTk5LDcgQEAKIAlyZXR1cm4gcHJpdi0+Y29yZS5hcml6b25hLT5yZWdtYXA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTUxMDIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd201MTAyID0gewogCS5wcm9iZSA9IHdtNTEwMl9jb2RlY19wcm9iZSwKIAkucmVtb3ZlID0gd201MTAyX2NvZGVjX3JlbW92ZSwKIAkuZ2V0X3JlZ21hcCA9IHdtNTEwMl9nZXRfcmVnbWFwLApAQCAtMjAwMCwxMiArMjAwOSwxNCBAQAogCS5zZXRfc3lzY2xrID0gYXJpem9uYV9zZXRfc3lzY2xrLAogCS5zZXRfcGxsID0gd201MTAyX3NldF9mbGwsCiAKLQkuY29udHJvbHMgPSB3bTUxMDJfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtNTEwMl9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTUxMDJfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTUxMDJfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTUxMDJfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod201MTAyX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtNTEwMl9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTUxMDJfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTUxMDJfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod201MTAyX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTUxMDJfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtNTEwMl9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2NvbXByX29wcyB3bTUxMDJfY29tcHJfb3BzID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTUxMTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTEwLmMKaW5kZXggMTU2NTQ3MC4uMDZiYWUzYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTUxMTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtNTExMC5jCkBAIC0xNzQ1LDYgKzE3NDUsMTYgQEAKIAl7ICJJTjRMIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAl7ICJJTjRSIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAorCXsgIkFTUkMxTCIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQVNSQzFSIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBU1JDMkwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFTUkMyUiIsIE5VTEwsICJTWVNDTEsiIH0sCisKKwl7ICJBU1JDMUwiLCBOVUxMLCAiQVNZTkNDTEsiIH0sCisJeyAiQVNSQzFSIiwgTlVMTCwgIkFTWU5DQ0xLIiB9LAorCXsgIkFTUkMyTCIsIE5VTEwsICJBU1lOQ0NMSyIgfSwKKwl7ICJBU1JDMlIiLCBOVUxMLCAiQVNZTkNDTEsiIH0sCisKIAl7ICJNSUNCSUFTMSIsIE5VTEwsICJNSUNWREQiIH0sCiAJeyAiTUlDQklBUzIiLCBOVUxMLCAiTUlDVkREIiB9LAogCXsgIk1JQ0JJQVMzIiwgTlVMTCwgIk1JQ1ZERCIgfSwKQEAgLTE4MzIsMTAgKzE4NDIsOCBAQAogCXsgIlNsaW0zIENhcHR1cmUiLCBOVUxMLCAiU1lTQ0xLIiB9LAogCiAJeyAiVm9pY2UgQ29udHJvbCBEU1AiLCBOVUxMLCAiRFNQMyIgfSwKLQl7ICJWb2ljZSBDb250cm9sIERTUCIsIE5VTEwsICJTWVNDTEsiIH0sCiAKIAl7ICJBdWRpbyBUcmFjZSBEU1AiLCBOVUxMLCAiRFNQMSIgfSwKLQl7ICJBdWRpbyBUcmFjZSBEU1AiLCBOVUxMLCAiU1lTQ0xLIiB9LAogCiAJeyAiSU4xTCBQR0EiLCBOVUxMLCAiSU4xTCIgfSwKIAl7ICJJTjFSIFBHQSIsIE5VTEwsICJJTjFSIiB9LApAQCAtMjM0Nyw3ICsyMzU1LDcgQEAKIAlyZXR1cm4gcHJpdi0+Y29yZS5hcml6b25hLT5yZWdtYXA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTUxMTAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd201MTEwID0gewogCS5wcm9iZSA9IHdtNTExMF9jb2RlY19wcm9iZSwKIAkucmVtb3ZlID0gd201MTEwX2NvZGVjX3JlbW92ZSwKIAkuZ2V0X3JlZ21hcCA9IHdtNTExMF9nZXRfcmVnbWFwLApAQCAtMjM1NywxMiArMjM2NSwxNCBAQAogCS5zZXRfc3lzY2xrID0gYXJpem9uYV9zZXRfc3lzY2xrLAogCS5zZXRfcGxsID0gd201MTEwX3NldF9mbGwsCiAKLQkuY29udHJvbHMgPSB3bTUxMTBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtNTExMF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTUxMTBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTUxMTBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTUxMTBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod201MTEwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtNTExMF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTUxMTBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTUxMTBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod201MTEwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTUxMTBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtNTExMF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2NvbXByX29wcyB3bTUxMTBfY29tcHJfb3BzID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204MzUwLmMKaW5kZXggZmZiZjNkZi4uMmVmYzViNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODM1MC5jCkBAIC0xNTg3LDE5ICsxNTg3LDIxIEBACiAJcmV0dXJuIHdtODM1MC0+cmVnbWFwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204MzUwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODM1MCA9IHsKIAkucHJvYmUgPQl3bTgzNTBfY29kZWNfcHJvYmUsCiAJLnJlbW92ZSA9CXdtODM1MF9jb2RlY19yZW1vdmUsCiAJLmdldF9yZWdtYXAgPQl3bTgzNTBfZ2V0X3JlZ21hcCwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTgzNTBfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204MzUwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTgzNTBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204MzUwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204MzUwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204MzUwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODM1MF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTgzNTBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204MzUwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204MzUwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODM1MF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204MzUwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTgzNTBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHdtODM1MF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg0MDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NDAwLmMKaW5kZXggYjFkMzQ2YS4uNmM1OWZiOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg0MDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODQwMC5jCkBAIC0xMzMyLDE5ICsxMzMyLDIxIEBACiAJcmV0dXJuIHdtODQwMC0+cmVnbWFwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NDAwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODQwMCA9IHsKIAkucHJvYmUgPQl3bTg0MDBfY29kZWNfcHJvYmUsCiAJLnJlbW92ZSA9CXdtODQwMF9jb2RlY19yZW1vdmUsCiAJLmdldF9yZWdtYXAgPQl3bTg0MDBfZ2V0X3JlZ21hcCwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg0MDBfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204NDAwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg0MDBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204NDAwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204NDAwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204NDAwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODQwMF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg0MDBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204NDAwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204NDAwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODQwMF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204NDAwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg0MDBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHdtODQwMF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg1MTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTEwLmMKaW5kZXggOTllNDBlNi4uMTE5Y2VhYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg1MTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODUxMC5jCkBAIC01ODEsMTcgKzU4MSwxOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NTEwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODUxMCA9IHsKIAkucHJvYmUgPQl3bTg1MTBfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204NTEwX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODUxMF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204NTEwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODUxMF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODUxMF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODUxMF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg1MTBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204NTEwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODUxMF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODUxMF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg1MTBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODUxMF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204NTEwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd204NTEwX29mX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODUyMy5jIGIvc291bmQvc29jL2NvZGVjcy93bTg1MjMuYwppbmRleCBhYTI4N2EzLi5kZWIyZTA3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODUyMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTIzLmMKQEAgLTQxMywxNyArNDEzLDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg1MjMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NTIzID0gewogCS5wcm9iZSA9CXdtODUyM19wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg1MjNfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204NTIzX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODUyM19jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODUyM19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODUyM19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODUyM19kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg1MjNfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204NTIzX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204NTIzX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg1MjNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204NTIzX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg1MjNfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODUyM19kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODUyM19vZl9tYXRjaFtdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg1ODAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTgwLmMKaW5kZXggNjY2MDJiZi4uZmFhNzI4NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg1ODAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODU4MC5jCkBAIC04OTksMTcgKzg5OSwxOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NTgwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODU4MCA9IHsKIAkucHJvYmUgPQl3bTg1ODBfcHJvYmUsCiAJLnJlbW92ZSA9CXdtODU4MF9yZW1vdmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204NTgwX3NldF9iaWFzX2xldmVsLAogCi0JLmNvbnRyb2xzID0gd204NTgwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg1ODBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204NTgwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204NTgwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204NTgwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODU4MF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg1ODBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204NTgwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204NTgwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODU4MF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204NTgwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg1ODBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg1ODBfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzExLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODcxMS5jCmluZGV4IGM3NTllYzAuLjJiMzc2YzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzExLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MTEuYwpAQCAtMzY3LDE3ICszNjcsMTkgQEAKIAogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzExID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODcxMSA9IHsKIAkucHJvYmUgPQl3bTg3MTFfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204NzExX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODcxMV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204NzExX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODcxMV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODcxMV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODcxMV9pbnRlcmNvbiwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg3MTFfaW50ZXJjb24pLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204NzExX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODcxMV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODcxMV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg3MTFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODcxMV9pbnRlcmNvbiwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204NzExX2ludGVyY29uKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd204NzExX29mX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODcyNy5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3MjcuYwppbmRleCBiYjI1YTc1Li43ZmRlMDc3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODcyNy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzI3LmMKQEAgLTUzLDExICs1MywxMyBAQAogCQl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODcyNyA9IHsKLQkuZGFwbV93aWRnZXRzID0gd204NzI3X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204NzI3X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204NzI3X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODcyN19kYXBtX3JvdXRlcyksCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzI3ID0geworCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IHdtODcyN19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg3MjdfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODcyN19kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204NzI3X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCB3bTg3MjdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzI4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODcyOC5jCmluZGV4IDE1NjRlNjkuLjc5N2NjNmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzI4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MjguYwpAQCAtMjExLDE2ICsyMTEsMTggQEAKIAkub3BzID0gJndtODcyOF9kYWlfb3BzLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODcyOCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3MjggPSB7CiAJLnNldF9iaWFzX2xldmVsID0gd204NzI4X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODcyOF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204NzI4X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODcyOF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODcyOF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODcyOF9pbnRlcmNvbiwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg3MjhfaW50ZXJjb24pLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204NzI4X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODcyOF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODcyOF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg3MjhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODcyOF9pbnRlcmNvbiwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204NzI4X2ludGVyY29uKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd204NzI4X29mX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODczMS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYwppbmRleCBkMTgyNjFhLi40ZjlhMWViIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODczMS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMKQEAgLTYyOCwxNiArNjI4LDE4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODczMSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3MzEgPSB7CiAJLnNldF9iaWFzX2xldmVsID0gd204NzMxX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5kYXBtX3dpZGdldHMgPSB3bTg3MzFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg3MzFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg3MzFfaW50ZXJjb24sCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204NzMxX2ludGVyY29uKSwKLQkuY29udHJvbHMgPQl3bTg3MzFfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODczMV9zbmRfY29udHJvbHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204NzMxX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODczMV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODczMV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg3MzFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODczMV9pbnRlcmNvbiwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204NzMxX2ludGVyY29uKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd204NzMxX29mX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODczNy5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzcuYwppbmRleCBlNzgwNzYwLi5mMGNiMWM0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODczNy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzM3LmMKQEAgLTU3MywxNyArNTczLDE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODczNyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3MzcgPSB7CiAJLnByb2JlCQk9IHdtODczN19wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg3Mzdfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204NzM3X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg3Mzdfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204NzM3X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204NzM3X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gaW50ZXJjb24sCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoaW50ZXJjb24pLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204NzM3X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODczN19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODczN19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg3MzdfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShpbnRlcmNvbiksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODczN19vZl9tYXRjaFtdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3NDEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzQxLmMKaW5kZXggMzZlZjkxZi4uNTY1ZDQ3NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3NDEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc0MS5jCkBAIC00OTcsMTUgKzQ5NywxNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzQxID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODc0MSA9IHsKIAkucHJvYmUgPQl3bTg3NDFfcHJvYmUsCiAJLnJlbW92ZSA9CXdtODc0MV9yZW1vdmUsCiAJLnJlc3VtZSA9CXdtODc0MV9yZXN1bWUsCiAKLQkuZGFwbV93aWRnZXRzID0gd204NzQxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204NzQxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204NzQxX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODc0MV9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gd204NzQxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODc0MV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204NzQxX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg3NDFfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg3NDFfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5jCmluZGV4IGJkOWRjZDIuLjBkYTJiYmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYwpAQCAtNzA4LDE3ICs3MDgsMTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzUwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODc1MCA9IHsKIAkucHJvYmUgPQl3bTg3NTBfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204NzUwX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODc1MF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204NzUwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODc1MF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODc1MF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODc1MF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg3NTBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204NzUwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODc1MF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODc1MF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg3NTBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODc1MF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204NzUwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd204NzUwX29mX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYwppbmRleCBjZGNjOTEyLi45YmRmNTQ0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUzLmMKQEAgLTE0NzgsMTggKzE0NzgsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODc1MyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3NTMgPSB7CiAJLnByb2JlID0Jd204NzUzX3Byb2JlLAogCS5yZXN1bWUgPQl3bTg3NTNfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODc1M19zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg3NTNfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODc1M19zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg3NTNfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg3NTNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg3NTNfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204NzUzX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODc1M19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg3NTNfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg3NTNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204NzUzX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg3NTNfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODc1M19kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODc1M19vZl9tYXRjaFtdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3NzAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzcwLmMKaW5kZXggZGY2MTc4NC4uZDZlZGNiYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3NzAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc3MC5jCkBAIC02MDgsMTcgKzYwOCwxOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3NzAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzcwID0gewogCS5wcm9iZSA9IHdtODc3MF9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg3NzBfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204NzcwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg3NzBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204NzcwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204NzcwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204NzcwX2ludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODc3MF9pbnRlcmNvbiksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg3NzBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204NzcwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204NzcwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODc3MF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204NzcwX2ludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg3NzBfaW50ZXJjb24pLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg3NzBfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204Nzc2LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc3Ni5jCmluZGV4IDVhZjQ0ZjkuLmFlMzA0ODAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204Nzc2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NzYuYwpAQCAtNDI1LDE3ICs0MjUsMTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204Nzc2ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODc3NiA9IHsKIAkucHJvYmUgPSAJd204Nzc2X3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODc3Nl9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg3NzZfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODc3Nl9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg3NzZfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg3NzZfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSByb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODc3Nl9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg3NzZfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg3NzZfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204Nzc2X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSByb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHJvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODc3Nl9vZl9tYXRjaFtdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3ODIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzgyLmMKaW5kZXggZmI1NWZkOC4uYmNkYTIxMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3ODIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc4Mi5jCkBAIC01MCwxMSArNTAsMTMgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODc4MiA9IHsKLQkuZGFwbV93aWRnZXRzID0gd204NzgyX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204NzgyX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204NzgyX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODc4Ml9kYXBtX3JvdXRlcyksCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzgyID0geworCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IHdtODc4Ml9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg3ODJfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODc4Ml9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204NzgyX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCB3bTg3ODJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC5jCmluZGV4IDhkOTE0NzAuLmFmOTVkNjQ4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmMKQEAgLTU0NSwxMCArNTQ1LDEyIEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204ODA0ID0gewogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5kYXBtX3dpZGdldHMgPSB3bTg4MDRfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg4MDRfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg4MDRfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204ODA0X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg4MDRfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204ODA0X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg4MDRfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODgwNF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHdtODgwNF9yZWdtYXBfY29uZmlnID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5MDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmMKaW5kZXggNWQ4ZGNhODguLmM3N2I0OWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDAuYwpAQCAtMTIwOCwxOCArMTIwOCwyMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTAwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODkwMCA9IHsKIAkucHJvYmUgPQl3bTg5MDBfcHJvYmUsCiAJLnN1c3BlbmQgPQl3bTg5MDBfc3VzcGVuZCwKIAkucmVzdW1lID0Jd204OTAwX3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5MDBfc2V0X2JpYXNfbGV2ZWwsCiAKLQkuY29udHJvbHMgPSB3bTg5MDBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODkwMF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg5MDBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg5MDBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg5MDBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204OTAwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODkwMF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg5MDBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg5MDBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204OTAwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg5MDBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODkwMF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3bTg5MDBfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5MDMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmMKaW5kZXggYTI2Y2E0OS4uNmU4ODdjMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5MDMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMy5jCkBAIC0xODMwLDcgKzE4MzAsNyBAQAogCQkJICAgISF2YWx1ZSA8PCBXTTg5MDNfR1AxX0xWTF9TSElGVCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHdtODkwM190ZW1wbGF0ZV9jaGlwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgd204OTAzX3RlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAid204OTAzIiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5yZXF1ZXN0CQk9IHdtODkwM19ncGlvX3JlcXVlc3QsCkBAIC0xODc0LDE4ICsxODc0LDIwIEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODkwMyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5MDMgPSB7CiAJLnJlc3VtZSA9CXdtODkwM19yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gd204OTAzX3NldF9iaWFzX2xldmVsLAogCS5zZXFfbm90aWZpZXIgPSB3bTg5MDNfc2VxX25vdGlmaWVyLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODkwM19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTAzX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODkwM19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODkwM19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODkwM19pbnRlcmNvbiwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg5MDNfaW50ZXJjb24pLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204OTAzX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODkwM19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODkwM19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg5MDNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODkwM19pbnRlcmNvbiwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204OTAzX2ludGVyY29uKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHdtODkwM19yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDQuYwppbmRleCBlZGQ3YTc3Li40ZmQzNTBlOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5MDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jCkBAIC0yMDg2LDcgKzIwODYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTA0ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODkwNCA9IHsKIAkucHJvYmUgPQl3bTg5MDRfcHJvYmUsCiAJLnJlbW92ZSA9CXdtODkwNF9yZW1vdmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204OTA0X3NldF9iaWFzX2xldmVsLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTQwLmMKaW5kZXggMWM2MDA4MS4uYjU5MzU2MiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk0MC5jCkBAIC03MjMsMTcgKzcyMywxOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5NDAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTQwID0gewogCS5wcm9iZSA9CXdtODk0MF9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5NDBfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gICAgIHdtODk0MF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTQwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODk0MF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk0MF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9ICB3bTg5NDBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204OTQwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODk0MF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg5NDBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg5NDBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204OTQwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg5NDBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODk0MF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3bTg5NDBfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NTUuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTU1LmMKaW5kZXggOWRiMDBkNS4uMWVkYzdiMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NTUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk1NS5jCkBAIC05NDAsMTcgKzk0MCwxOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5NTUgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTU1ID0gewogCS5wcm9iZSA9CXdtODk1NV9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5NTVfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0Jd204OTU1X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg5NTVfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204OTU1X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204OTU1X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0Jd204OTU1X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODk1NV9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg5NTVfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204OTU1X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204OTU1X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODk1NV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204OTU1X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg5NTVfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgd204OTU1X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2MC5jCmluZGV4IGQ3ZjQ0NGYuLjNiZjA4MWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjAuYwpAQCAtMjI2LDExICsyMjYsMTAgQEAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShieXBhc3NfdGx2LCAtMjEwMCwgMzAwLCAwKTsKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShvdXRfdGx2LCAtMTIxMDAsIDEwMCwgMSk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUobGluZWluYm9vc3RfdGx2LCAtMTUwMCwgMzAwLCAxKTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbWljYm9vc3RfdGx2W10gPSB7Ci0JVExWX0RCX1JBTkdFX0hFQUQoMiksCitzdGF0aWMgY29uc3QgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9SQU5HRShtaWNib29zdF90bHYsCiAJMCwgMSwgVExWX0RCX1NDQUxFX0lURU0oMCwgMTMwMCwgMCksCiAJMiwgMywgVExWX0RCX1NDQUxFX0lURU0oMjAwMCwgOTAwLCAwKSwKLX07CispOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTYwX3NuZF9jb250cm9sc1tdID0gewogU09DX0RPVUJMRV9SX1RMVigiQ2FwdHVyZSBWb2x1bWUiLCBXTTg5NjBfTElOVk9MLCBXTTg5NjBfUklOVk9MLApAQCAtMTI2NCw3ICsxMjYzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk2MCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5NjAgPSB7CiAJLnByb2JlID0Jd204OTYwX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODk2MF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk2MS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjEuYwppbmRleCBlMzA0NDZhLi5lMjNjZWFjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk2MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYxLmMKQEAgLTg4MiwxOCArODgyLDIwIEBACiAjZGVmaW5lIHdtODk2MV9yZXN1bWUgTlVMTAogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5NjEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTYxID0gewogCS5wcm9iZSA9CXdtODk2MV9wcm9iZSwKIAkucmVzdW1lID0Jd204OTYxX3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5NjFfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204OTYxX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg5NjFfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204OTYxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204OTYxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYXVkaW9fcGF0aHMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fcGF0aHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204OTYxX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODk2MV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODk2MV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg5NjFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGF1ZGlvX3BhdGhzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhdWRpb19wYXRocyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3bTg5NjFfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NjIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYyLmMKaW5kZXggZjMxMDlkYS4uZmQyNzMxZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NjIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2Mi5jCkBAIC0zMzU3LDcgKzMzNTcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCB3bTg5NjJfdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHdtODk2Ml90ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gIndtODk2MiIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkucmVxdWVzdAkJPSB3bTg5NjJfZ3Bpb19yZXF1ZXN0LApAQCAtMzQ3OSw3ICszNDc5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk2MiA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5NjIgPSB7CiAJLnByb2JlID0Jd204OTYyX3Byb2JlLAogCS5yZW1vdmUgPQl3bTg5NjJfcmVtb3ZlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODk2Ml9zZXRfYmlhc19sZXZlbCwKQEAgLTM3MTMsNyArMzcxMyw3IEBACiAJCQkJCSAgICBBUlJBWV9TSVpFKHdtODk2Ml9kY19tZWFzdXJlKSk7CiAJCWlmIChyZXQgIT0gMCkKIAkJCWRldl9lcnIoJmkyYy0+ZGV2LAotCQkJCSJGYWlsZWQgdG8gY29uZmlndXJlIGZvciBEQyBtZXN1cmVtZW50OiAlZFxuIiwKKwkJCQkiRmFpbGVkIHRvIGNvbmZpZ3VyZSBmb3IgREMgbWVhc3VyZW1lbnQ6ICVkXG4iLAogCQkJCXJldCk7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3MS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzEuYwppbmRleCAyY2RkZTMyLi44ODdkMzFjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTcxLmMKQEAgLTY0OSwxNyArNjQ5LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5NzEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTcxID0gewogCS5wcm9iZSA9CXdtODk3MV9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5NzFfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204OTcxX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg5NzFfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204OTcxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204OTcxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204OTcxX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODk3MV9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg5NzFfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204OTcxX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204OTcxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODk3MV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204OTcxX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg5NzFfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgd204OTcxX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc0LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk3NC5jCmluZGV4IGRjOGMzYjEuLmQ0MTRkZGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzQuYwpAQCAtNjc2LDE3ICs2NzYsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk3NCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5NzQgPSB7CiAJLnByb2JlID0gCXdtODk3NF9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5NzRfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204OTc0X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg5NzRfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204OTc0X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204OTc0X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204OTc0X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODk3NF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg5NzRfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204OTc0X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204OTc0X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODk3NF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204OTc0X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg5NzRfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHdtODk3NF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk3OC5jCmluZGV4IGQzNmQ2MDAuLjkwYjJkNDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzguYwpAQCAtOTkzLDE4ICs5OTMsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk3OCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5NzggPSB7CiAJLnByb2JlID0Jd204OTc4X3Byb2JlLAogCS5zdXNwZW5kID0Jd204OTc4X3N1c3BlbmQsCiAJLnJlc3VtZSA9CXdtODk3OF9yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gd204OTc4X3NldF9iaWFzX2xldmVsLAogCi0JLmNvbnRyb2xzID0gd204OTc4X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg5Nzhfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204OTc4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204OTc4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204OTc4X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODk3OF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg5Nzhfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204OTc4X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204OTc4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODk3OF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204OTc4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg5NzhfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgd204OTc4X3JlZ21hcF9jb25maWcgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk4My5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODMuYwppbmRleCAwYzAwMmE1Li5iZmRiZTcyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk4My5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTgzLmMKQEAgLTk3NiwxNiArOTc2LDE4IEBACiAJLnN5bW1ldHJpY19yYXRlcyA9IDEKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5ODMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTgzID0gewogCS5wcm9iZSA9IHdtODk4M19wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5ODNfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAotCS5jb250cm9scyA9IHdtODk4M19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTgzX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODk4M19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk4M19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODk4M19hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204OTgzX2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg5ODNfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204OTgzX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204OTgzX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODk4M19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204OTgzX2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204OTgzX2F1ZGlvX21hcCksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3bTg5ODNfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5ODUuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg1LmMKaW5kZXggNzM0N2FiZi4uMDUzNDRmOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5ODUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4NS5jCkBAIC0xMTA1LDE3ICsxMTA1LDE5IEBACiAJLnN5bW1ldHJpY19yYXRlcyA9IDEKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5ODUgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTg1ID0gewogCS5wcm9iZSA9IHdtODk4NV9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5ODVfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204OTg1X2NvbW1vbl9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTg1X2NvbW1vbl9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg5ODVfY29tbW9uX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204OTg1X2NvbW1vbl9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODk4NV9jb21tb25fZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204OTg1X2NvbW1vbl9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg5ODVfY29tbW9uX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODk4NV9jb21tb25fc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg5ODVfY29tbW9uX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODk4NV9jb21tb25fZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODk4NV9jb21tb25fZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODk4NV9jb21tb25fZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgd204OTg1X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4OC5jCmluZGV4IDg5NTcyMWEyLi5iMGQwMjE5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk4OC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg4LmMKQEAgLTgxNywxMiArODE3LDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gd204OTg4X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODk4OF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTg4X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODk4OF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk4OF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODk4OF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg5ODhfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204OTg4X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODk4OF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODk4OF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg5ODhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODk4OF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204OTg4X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHdtODk4OF9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTAuYwppbmRleCAyM2VjZDMwLi5hODk0NTAwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkwLmMKQEAgLTEyOTQsMTcgKzEyOTQsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk5MCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5OTAgPSB7CiAJLnByb2JlID0Jd204OTkwX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODk5MF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPQl3bTg5OTBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODk5MF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg5OTBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg5OTBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPQl3bTg5OTBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204OTkwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODk5MF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg5OTBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg5OTBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204OTkwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg5OTBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODk5MF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3bTg5OTBfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkxLmMKaW5kZXggYzllZTBhYy4uODAyYzA2OTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTEuYwpAQCAtMTExLDE0ICsxMTEsMjQgQEAKIAl9CiB9CiAKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIocmVjX21peF90bHYsIC0xNTAwLCA2MDApOwotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihpbl9wZ2FfdGx2LCAtMTY1MCwgMzAwMCk7Ci1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKG91dF9taXhfdGx2LCAwLCAtMjEwMCk7Ci1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKG91dF9wZ2FfdGx2LCAtNzMwMCwgNjAwKTsKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIob3V0X29taXhfdGx2LCAtNjAwLCAwKTsKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIob3V0X2RhY190bHYsIC03MTYzLCAwKTsKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIoaW5fYWRjX3RsdiwgLTcxNjMsIDE3NjMpOwotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihvdXRfc2lkZXRvbmVfdGx2LCAtMzYwMCwgMCk7CitzdGF0aWMgY29uc3QgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9TQ0FMRShpbl9wZ2FfdGx2LCAtMTY1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1NDQUxFKG91dF9taXhfdGx2LCAtMjEwMCwgMzAwLCAwKTsKK3N0YXRpYyBjb25zdCBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1JBTkdFKG91dF9wZ2FfdGx2LAorCTB4MDAsIDB4MmYsIFNORFJWX0NUTF9UTFZEX0RCX1NDQUxFX0lURU0oU05EUlZfQ1RMX1RMVkRfREJfR0FJTl9NVVRFLCAwLCAxKSwKKwkweDMwLCAweDdmLCBTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9JVEVNKC03MzAwLCAxMDAsIDApLAorKTsKK3N0YXRpYyBjb25zdCBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1JBTkdFKG91dF9kYWNfdGx2LAorCTB4MDAsIDB4YmYsIFNORFJWX0NUTF9UTFZEX0RCX1NDQUxFX0lURU0oLTcxNjI1LCAzNzUsIDEpLAorCTB4YzAsIDB4ZmYsIFNORFJWX0NUTF9UTFZEX0RCX1NDQUxFX0lURU0oMCwgMCwgMCksCispOworc3RhdGljIGNvbnN0IFNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfUkFOR0UoaW5fYWRjX3RsdiwKKwkweDAwLCAweGVmLCBTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9JVEVNKC03MTYyNSwgMzc1LCAxKSwKKwkweGYwLCAweGZmLCBTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9JVEVNKDE3NjI1LCAwLCAwKSwKKyk7CitzdGF0aWMgY29uc3QgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9SQU5HRShvdXRfc2lkZXRvbmVfdGx2LAorCTB4MDAsIDB4MGMsIFNORFJWX0NUTF9UTFZEX0RCX1NDQUxFX0lURU0oLTM2MDAsIDMwMCwgMCksCisJMHgwZCwgMHgwZiwgU05EUlZfQ1RMX1RMVkRfREJfU0NBTEVfSVRFTSgwLCAwLCAwKSwKKyk7CiAKIHN0YXRpYyBpbnQgd204OTl4X291dHBnYV9wdXRfdm9sc3dfdnUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCkBAIC0zOTgsNyArNDA4LDcgQEAKIH0KIAogLyogSU5NSVggZEIgdmFsdWVzICovCi1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKGluX21peF90bHYsIC0xMjAwLCA2MDApOworc3RhdGljIGNvbnN0IFNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfU0NBTEUoaW5fbWl4X3RsdiwgLTEyMDAsIDMwMCwgMSk7CiAKIC8qIExlZnQgSW4gUEdBIENvbm5lY3Rpb25zICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTkxX2RhcG1fbGluMTJfcGdhX2NvbnRyb2xzW10gPSB7CkBAIC0xMjMyLDE2ICsxMjQyLDE4IEBACiAJLm9wcyA9ICZ3bTg5OTFfb3BzCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTkxID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk5MSA9IHsKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5OTFfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204OTkxX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg5OTFfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204OTkxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204OTkxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204OTkxX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODk5MV9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg5OTFfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204OTkxX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204OTkxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODk5MV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204OTkxX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg5OTFfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgd204OTkxX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5My5jCmluZGV4IDg2NjhjNGMuLjE5NWY3YmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTMuYwpAQCAtMTYxMyw3ICsxNjEzLDcgQEAKIAkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUod204OTkzX3JlZ19kZWZhdWx0cyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTkzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk5MyA9IHsKIAkucHJvYmUgPSAJd204OTkzX3Byb2JlLAogCS5zdXNwZW5kID0Jd204OTkzX3N1c3BlbmQsCiAJLnJlc3VtZSA9CXdtODk5M19yZXN1bWUsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYwppbmRleCBhMThhZWNiLi4zODk2NTIzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmMKQEAgLTQ0MzksNyArNDQzOSw3IEBACiAJcmV0dXJuIGNvbnRyb2wtPnJlZ21hcDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk5NCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5OTQgPSB7CiAJLnByb2JlID0Jd204OTk0X2NvZGVjX3Byb2JlLAogCS5yZW1vdmUgPQl3bTg5OTRfY29kZWNfcmVtb3ZlLAogCS5zdXNwZW5kID0Jd204OTk0X2NvZGVjX3N1c3BlbmQsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTUuYwppbmRleCAyNDUwMGJhLi4xOWIwOGE1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk1LmMKQEAgLTIxOTIsMTIgKzIxOTIsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5OTVfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204OTk1X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg5OTVfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204OTk1X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204OTk1X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204OTk1X2ludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODk5NV9pbnRlcmNvbiksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg5OTVfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204OTk1X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204OTk1X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODk5NV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204OTk1X2ludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg5OTVfaW50ZXJjb24pLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgd204OTk1X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk2LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ni5jCmluZGV4IGE3MzA0NDIuLjhhZmZhNDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTYuYwpAQCAtMjE4NCw3ICsyMTg0LDcgQEAKIAkJCQkgICgxIDw8IFdNODk5Nl9HUDFfRElSX1NISUZUKSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHdtODk5Nl90ZW1wbGF0ZV9jaGlwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgd204OTk2X3RlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAid204OTk2IiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5kaXJlY3Rpb25fb3V0cHV0CT0gd204OTk2X2dwaW9fZGlyZWN0aW9uX291dCwKQEAgLTI2ODQsMTggKzI2ODQsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk5NiA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5OTYgPSB7CiAJLnByb2JlID0Jd204OTk2X3Byb2JlLAogCS5yZW1vdmUgPQl3bTg5OTZfcmVtb3ZlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODk5Nl9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZgk9IHRydWUsCiAJLnNlcV9ub3RpZmllciA9IHdtODk5Nl9zZXFfbm90aWZpZXIsCi0JLmNvbnRyb2xzID0gd204OTk2X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg5OTZfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204OTk2X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204OTk2X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204OTk2X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODk5Nl9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg5OTZfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204OTk2X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204OTk2X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODk5Nl9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204OTk2X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg5OTZfZGFwbV9yb3V0ZXMpLAorCX0sCiAJLnNldF9wbGwgPSB3bTg5OTZfc2V0X2ZsbCwKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk3LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ny5jCmluZGV4IDZiMDc4NWIuLjJmMjgyMWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk3LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTcuYwpAQCAtMTA5NSw3ICsxMDk1LDcgQEAKIAlyZXR1cm4gcHJpdi0+Y29yZS5hcml6b25hLT5yZWdtYXA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5OTcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTk3ID0gewogCS5wcm9iZSA9IHdtODk5N19jb2RlY19wcm9iZSwKIAkucmVtb3ZlID0gd204OTk3X2NvZGVjX3JlbW92ZSwKIAkuZ2V0X3JlZ21hcCA9ICAgd204OTk3X2dldF9yZWdtYXAsCkBAIC0xMTA1LDEyICsxMTA1LDE0IEBACiAJLnNldF9zeXNjbGsgPSBhcml6b25hX3NldF9zeXNjbGssCiAJLnNldF9wbGwgPSB3bTg5OTdfc2V0X2ZsbCwKIAotCS5jb250cm9scyA9IHdtODk5N19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTk3X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODk5N19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk5N19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODk5N19kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg5OTdfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204OTk3X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODk5N19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODk5N19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg5OTdfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODk5N19kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204OTk3X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCB3bTg5OTdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5OC5jCmluZGV4IDNhNWM4OTYuLmJjYzJlMTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTguYwpAQCAtOTY2LDYgKzk2NiwxNiBAQAogCXsgIklOMkEiLCBOVUxMLCAiU1lTQ0xLIiB9LAogCXsgIklOMkIiLCBOVUxMLCAiU1lTQ0xLIiB9LAogCisJeyAiQVNSQzFMIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBU1JDMVIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFTUkMyTCIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQVNSQzJSIiwgTlVMTCwgIlNZU0NMSyIgfSwKKworCXsgIkFTUkMxTCIsIE5VTEwsICJBU1lOQ0NMSyIgfSwKKwl7ICJBU1JDMVIiLCBOVUxMLCAiQVNZTkNDTEsiIH0sCisJeyAiQVNSQzJMIiwgTlVMTCwgIkFTWU5DQ0xLIiB9LAorCXsgIkFTUkMyUiIsIE5VTEwsICJBU1lOQ0NMSyIgfSwKKwogCXsgIlNQRDEiLCBOVUxMLCAiU1lTQ0xLIiB9LAogCXsgIlNQRDEiLCBOVUxMLCAiU1BEMVRYMSIgfSwKIAl7ICJTUEQxIiwgTlVMTCwgIlNQRDFUWDIiIH0sCkBAIC0xMzUxLDcgKzEzNjEsNyBAQAogCXJldHVybiBwcml2LT5jb3JlLmFyaXpvbmEtPnJlZ21hcDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk5OCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5OTggPSB7CiAJLnByb2JlID0gd204OTk4X2NvZGVjX3Byb2JlLAogCS5yZW1vdmUgPSB3bTg5OThfY29kZWNfcmVtb3ZlLAogCS5nZXRfcmVnbWFwID0gd204OTk4X2dldF9yZWdtYXAsCkBAIC0xMzYxLDEyICsxMzcxLDE0IEBACiAJLnNldF9zeXNjbGsgPSBhcml6b25hX3NldF9zeXNjbGssCiAJLnNldF9wbGwgPSB3bTg5OThfc2V0X2ZsbCwKIAotCS5jb250cm9scyA9IHdtODk5OF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTk4X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODk5OF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk5OF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODk5OF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg5OThfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204OTk4X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODk5OF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODk5OF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg5OThfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODk5OF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204OTk4X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCB3bTg5OThfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd205MDgxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTA4MS5jCmluZGV4IDM2M2IzYjYuLjg1Njg2N2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd205MDgxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTkwODEuYwpAQCAtMTI3NCw3ICsxMjc0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtOTA4MSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTkwODEgPSB7CiAJLnByb2JlID0gCXdtOTA4MV9wcm9iZSwKIAogCS5zZXRfc3lzY2xrID0gd205MDgxX3NldF9zeXNjbGssCkBAIC0xMjgyLDEyICsxMjgyLDE0IEBACiAKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgICAgICAgICA9IHdtOTA4MV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyAgICAgPSBBUlJBWV9TSVpFKHdtOTA4MV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMJICA9IHdtOTA4MV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtOTA4MV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyAgICAgPSB3bTkwODFfYXVkaW9fcGF0aHMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod205MDgxX2F1ZGlvX3BhdGhzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtOTA4MV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTkwODFfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTkwODFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod205MDgxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTkwODFfYXVkaW9fcGF0aHMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtOTA4MV9hdWRpb19wYXRocyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3bTkwODFfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTkwOTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205MDkwLmMKaW5kZXggNWQ3MzcyOS4uNWExMzEzOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTkwOTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTA5MC5jCkBAIC01NTAsNyArNTUwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtOTA5MCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTkwOTAgPSB7CiAJLnByb2JlID0gCXdtOTA5MF9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTkwOTBfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTk3MDUuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205NzA1LmMKaW5kZXggNzQ0ODQyYy4uZGNkZDA1NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTk3MDUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcwNS5jCkBAIC0zNTIsNyArMzUyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtOTcwNSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTk3MDUgPSB7CiAJLnByb2JlID0gCXdtOTcwNV9zb2NfcHJvYmUsCiAJLnJlbW92ZSA9IAl3bTk3MDVfc29jX3JlbW92ZSwKIAkuc3VzcGVuZCA9CXdtOTcwNV9zb2Nfc3VzcGVuZCwKQEAgLTM2NCwxMiArMzY0LDE0IEBACiAJLnJlZ19jYWNoZV9zdGVwID0gMiwKIAkucmVnX2NhY2hlX2RlZmF1bHQgPSB3bTk3MDVfcmVnLAogCi0JLmNvbnRyb2xzID0gd205NzA1X3NuZF9hYzk3X2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtOTcwNV9zbmRfYWM5N19jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtOTcwNV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtOTcwNV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtOTcwNV9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod205NzA1X2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTk3MDVfc25kX2FjOTdfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTk3MDVfc25kX2FjOTdfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtOTcwNV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTk3MDVfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtOTcwNV9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtOTcwNV9hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHdtOTcwNV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTk3MTIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEyLmMKaW5kZXggNDg4YTkyMi4uNTU3NzA5ZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTk3MTIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMi5jCkBAIC02NjksNyArNjY5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtOTcxMiA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTk3MTIgPSB7CiAJLnByb2JlID0gCXdtOTcxMl9zb2NfcHJvYmUsCiAJLnJlbW92ZSA9IAl3bTk3MTJfc29jX3JlbW92ZSwKIAkucmVzdW1lID0Jd205NzEyX3NvY19yZXN1bWUsCkBAIC02ODIsMTIgKzY4MiwxNCBAQAogCS5yZWdfY2FjaGVfc3RlcCA9IDIsCiAJLnJlZ19jYWNoZV9kZWZhdWx0ID0gd205NzEyX3JlZywKIAotCS5jb250cm9scyA9IHdtOTcxMl9zbmRfYWM5N19jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTk3MTJfc25kX2FjOTdfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTk3MTJfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTk3MTJfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTk3MTJfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtOTcxMl9hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd205NzEyX3NuZF9hYzk3X2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod205NzEyX3NuZF9hYzk3X2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTk3MTJfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod205NzEyX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTk3MTJfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTk3MTJfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogc3RhdGljIGludCB3bTk3MTJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMy5jCmluZGV4IDk4NDk2NDMuLmU0MzAxZGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTk3MTMuYwpAQCAtMTIzNSwxOSArMTIzNSwyMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd205NzEzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtOTcxMyA9IHsKIAkucHJvYmUgPSAJd205NzEzX3NvY19wcm9iZSwKIAkucmVtb3ZlID0gCXdtOTcxM19zb2NfcmVtb3ZlLAogCS5zdXNwZW5kID0Jd205NzEzX3NvY19zdXNwZW5kLAogCS5yZXN1bWUgPSAJd205NzEzX3NvY19yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gd205NzEzX3NldF9iaWFzX2xldmVsLAogCi0JLmNvbnRyb2xzID0gd205NzEzX3NuZF9hYzk3X2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtOTcxM19zbmRfYWM5N19jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtOTcxM19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtOTcxM19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtOTcxM19hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod205NzEzX2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTk3MTNfc25kX2FjOTdfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTk3MTNfc25kX2FjOTdfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtOTcxM19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTk3MTNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtOTcxM19hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtOTcxM19hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHdtOTcxM19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bV9hZHNwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtX2Fkc3AuYwppbmRleCAyMWZiZTdkLi5iOTQzZGRlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtX2Fkc3AuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtX2Fkc3AuYwpAQCAtNDgwLDcgKzQ4MCw3IEBACiAKIAltdXRleF9sb2NrKCZkc3AtPnB3cl9sb2NrKTsKIAotCWlmICghZHNwLT53bWZ3X2ZpbGVfbmFtZSB8fCAhZHNwLT5ydW5uaW5nKQorCWlmICghZHNwLT53bWZ3X2ZpbGVfbmFtZSB8fCAhZHNwLT5ib290ZWQpCiAJCXJldCA9IDA7CiAJZWxzZQogCQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsCkBAIC01MDAsNyArNTAwLDcgQEAKIAogCW11dGV4X2xvY2soJmRzcC0+cHdyX2xvY2spOwogCi0JaWYgKCFkc3AtPmJpbl9maWxlX25hbWUgfHwgIWRzcC0+cnVubmluZykKKwlpZiAoIWRzcC0+YmluX2ZpbGVfbmFtZSB8fCAhZHNwLT5ib290ZWQpCiAJCXJldCA9IDA7CiAJZWxzZQogCQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsCkBAIC01NTQsNiArNTU0LDkgQEAKIAlpZiAoIXJvb3QpCiAJCWdvdG8gZXJyOwogCisJaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJib290ZWQiLCBTX0lSVUdPLCByb290LCAmZHNwLT5ib290ZWQpKQorCQlnb3RvIGVycjsKKwogCWlmICghZGVidWdmc19jcmVhdGVfYm9vbCgicnVubmluZyIsIFNfSVJVR08sIHJvb3QsICZkc3AtPnJ1bm5pbmcpKQogCQlnb3RvIGVycjsKIApAQCAtNjM3LDcgKzY0MCw3IEBACiAKIAltdXRleF9sb2NrKCZkc3BbZS0+c2hpZnRfbF0ucHdyX2xvY2spOwogCi0JaWYgKGRzcFtlLT5zaGlmdF9sXS5ydW5uaW5nIHx8IGRzcFtlLT5zaGlmdF9sXS5jb21wcikKKwlpZiAoZHNwW2UtPnNoaWZ0X2xdLmJvb3RlZCB8fCBkc3BbZS0+c2hpZnRfbF0uY29tcHIpCiAJCXJldCA9IC1FQlVTWTsKIAllbHNlCiAJCWRzcFtlLT5zaGlmdF9sXS5mdyA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CkBAIC03ODksNyArNzkyLDcgQEAKIAltZW1jcHkoY3RsLT5jYWNoZSwgcCwgY3RsLT5sZW4pOwogCiAJY3RsLT5zZXQgPSAxOwotCWlmIChjdGwtPmVuYWJsZWQpCisJaWYgKGN0bC0+ZW5hYmxlZCAmJiBjdGwtPmRzcC0+cnVubmluZykKIAkJcmV0ID0gd21fY29lZmZfd3JpdGVfY29udHJvbChjdGwsIHAsIGN0bC0+bGVuKTsKIAogCW11dGV4X3VubG9jaygmY3RsLT5kc3AtPnB3cl9sb2NrKTsKQEAgLTgxMSw3ICs4MTQsNyBAQAogCQlyZXQgPSAtRUZBVUxUOwogCX0gZWxzZSB7CiAJCWN0bC0+c2V0ID0gMTsKLQkJaWYgKGN0bC0+ZW5hYmxlZCkKKwkJaWYgKGN0bC0+ZW5hYmxlZCAmJiBjdGwtPmRzcC0+cnVubmluZykKIAkJCXJldCA9IHdtX2NvZWZmX3dyaXRlX2NvbnRyb2woY3RsLCBjdGwtPmNhY2hlLCBzaXplKTsKIAl9CiAKQEAgLTg3MSwxMiArODc0LDEyIEBACiAJbXV0ZXhfbG9jaygmY3RsLT5kc3AtPnB3cl9sb2NrKTsKIAogCWlmIChjdGwtPmZsYWdzICYgV01GV19DVExfRkxBR19WT0xBVElMRSkgewotCQlpZiAoY3RsLT5lbmFibGVkKQorCQlpZiAoY3RsLT5lbmFibGVkICYmIGN0bC0+ZHNwLT5ydW5uaW5nKQogCQkJcmV0ID0gd21fY29lZmZfcmVhZF9jb250cm9sKGN0bCwgcCwgY3RsLT5sZW4pOwogCQllbHNlCiAJCQlyZXQgPSAtRVBFUk07CiAJfSBlbHNlIHsKLQkJaWYgKCFjdGwtPmZsYWdzICYmIGN0bC0+ZW5hYmxlZCkKKwkJaWYgKCFjdGwtPmZsYWdzICYmIGN0bC0+ZW5hYmxlZCAmJiBjdGwtPmRzcC0+cnVubmluZykKIAkJCXJldCA9IHdtX2NvZWZmX3JlYWRfY29udHJvbChjdGwsIGN0bC0+Y2FjaGUsIGN0bC0+bGVuKTsKIAogCQltZW1jcHkocCwgY3RsLT5jYWNoZSwgY3RsLT5sZW4pOwpAQCAtODk4LDEyICs5MDEsMTIgQEAKIAltdXRleF9sb2NrKCZjdGwtPmRzcC0+cHdyX2xvY2spOwogCiAJaWYgKGN0bC0+ZmxhZ3MgJiBXTUZXX0NUTF9GTEFHX1ZPTEFUSUxFKSB7Ci0JCWlmIChjdGwtPmVuYWJsZWQpCisJCWlmIChjdGwtPmVuYWJsZWQgJiYgY3RsLT5kc3AtPnJ1bm5pbmcpCiAJCQlyZXQgPSB3bV9jb2VmZl9yZWFkX2NvbnRyb2woY3RsLCBjdGwtPmNhY2hlLCBzaXplKTsKIAkJZWxzZQogCQkJcmV0ID0gLUVQRVJNOwogCX0gZWxzZSB7Ci0JCWlmICghY3RsLT5mbGFncyAmJiBjdGwtPmVuYWJsZWQpCisJCWlmICghY3RsLT5mbGFncyAmJiBjdGwtPmVuYWJsZWQgJiYgY3RsLT5kc3AtPnJ1bm5pbmcpCiAJCQlyZXQgPSB3bV9jb2VmZl9yZWFkX2NvbnRyb2woY3RsLCBjdGwtPmNhY2hlLCBzaXplKTsKIAl9CiAKQEAgLTIxNjYsMTMgKzIxNjksMjAgQEAKIAkJaWYgKHJldCAhPSAwKQogCQkJZ290byBlcnJfZW5hOwogCisJCWRzcC0+Ym9vdGVkID0gdHJ1ZTsKKwogCQkvKiBTdGFydCB0aGUgY29yZSBydW5uaW5nICovCiAJCXJlZ21hcF91cGRhdGVfYml0cyhkc3AtPnJlZ21hcCwgZHNwLT5iYXNlICsgQURTUDFfQ09OVFJPTF8zMCwKIAkJCQkgICBBRFNQMV9DT1JFX0VOQSB8IEFEU1AxX1NUQVJULAogCQkJCSAgIEFEU1AxX0NPUkVfRU5BIHwgQURTUDFfU1RBUlQpOworCisJCWRzcC0+cnVubmluZyA9IHRydWU7CiAJCWJyZWFrOwogCiAJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKKwkJZHNwLT5ydW5uaW5nID0gZmFsc2U7CisJCWRzcC0+Ym9vdGVkID0gZmFsc2U7CisKIAkJLyogSGFsdCB0aGUgY29yZSAqLwogCQlyZWdtYXBfdXBkYXRlX2JpdHMoZHNwLT5yZWdtYXAsIGRzcC0+YmFzZSArIEFEU1AxX0NPTlRST0xfMzAsCiAJCQkJICAgQURTUDFfQ09SRV9FTkEgfCBBRFNQMV9TVEFSVCwgMCk7CkBAIC0yMjI3LDcgKzIyMzcsNyBAQAogCQlpZiAodmFsICYgQURTUDJfUkFNX1JEWSkKIAkJCWJyZWFrOwogCi0JCW1zbGVlcCgxKTsKKwkJdXNsZWVwX3JhbmdlKDI1MCwgNTAwKTsKIAl9CiAKIAlpZiAoISh2YWwgJiBBRFNQMl9SQU1fUkRZKSkgewpAQCAtMjI0OSw2ICsyMjU5LDExIEBACiAKIAltdXRleF9sb2NrKCZkc3AtPnB3cl9sb2NrKTsKIAorCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkc3AtPnJlZ21hcCwgZHNwLT5iYXNlICsgQURTUDJfQ09OVFJPTCwKKwkJCQkgQURTUDJfTUVNX0VOQSwgQURTUDJfTUVNX0VOQSk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGVycl9tdXRleDsKKwogCXJldCA9IHdtX2Fkc3AyX2VuYShkc3ApOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBlcnJfbXV0ZXg7CkBAIC0yMjcwLDEzICsyMjg1LDE0IEBACiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGVycl9lbmE7CiAKLQkvKiBTeW5jIHNldCBjb250cm9scyAqLwotCXJldCA9IHdtX2NvZWZmX3N5bmNfY29udHJvbHMoZHNwKTsKKwlkc3AtPmJvb3RlZCA9IHRydWU7CisKKwkvKiBUdXJuIERTUCBiYWNrIG9mZiB1bnRpbCB3ZSBhcmUgcmVhZHkgdG8gcnVuICovCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGRzcC0+cmVnbWFwLCBkc3AtPmJhc2UgKyBBRFNQMl9DT05UUk9MLAorCQkJCSBBRFNQMl9TWVNfRU5BLCAwKTsKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gZXJyX2VuYTsKIAotCWRzcC0+cnVubmluZyA9IHRydWU7Ci0KIAltdXRleF91bmxvY2soJmRzcC0+cHdyX2xvY2spOwogCiAJcmV0dXJuOwpAQCAtMjMwNyw2ICsyMzIzLDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CiAJc3RydWN0IHdtX2Fkc3AgKmRzcHMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlzdHJ1Y3Qgd21fYWRzcCAqZHNwID0gJmRzcHNbdy0+c2hpZnRdOworCXN0cnVjdCB3bV9jb2VmZl9jdGwgKmN0bDsKIAogCWRzcC0+Y2FyZCA9IGNvZGVjLT5jb21wb25lbnQuY2FyZDsKIApAQCAtMjMxNSw2ICsyMzMyLDI0IEBACiAJCXdtX2Fkc3AyX3NldF9kc3BjbGsoZHNwLCBmcmVxKTsKIAkJcXVldWVfd29yayhzeXN0ZW1fdW5ib3VuZF93cSwgJmRzcC0+Ym9vdF93b3JrKTsKIAkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKKwkJd21fYWRzcF9kZWJ1Z2ZzX2NsZWFyKGRzcCk7CisKKwkJZHNwLT5md19pZCA9IDA7CisJCWRzcC0+ZndfaWRfdmVyc2lvbiA9IDA7CisKKwkJZHNwLT5ib290ZWQgPSBmYWxzZTsKKworCQlyZWdtYXBfdXBkYXRlX2JpdHMoZHNwLT5yZWdtYXAsIGRzcC0+YmFzZSArIEFEU1AyX0NPTlRST0wsCisJCQkJICAgQURTUDJfTUVNX0VOQSwgMCk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjdGwsICZkc3AtPmN0bF9saXN0LCBsaXN0KQorCQkJY3RsLT5lbmFibGVkID0gMDsKKworCQl3bV9hZHNwX2ZyZWVfYWxnX3JlZ2lvbnMoZHNwKTsKKworCQlhZHNwX2RiZyhkc3AsICJTaHV0ZG93biBjb21wbGV0ZVxuIik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTIzMjksMTYgKzIzNjQsMjQgQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CiAJc3RydWN0IHdtX2Fkc3AgKmRzcHMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlzdHJ1Y3Qgd21fYWRzcCAqZHNwID0gJmRzcHNbdy0+c2hpZnRdOwotCXN0cnVjdCB3bV9jb2VmZl9jdGwgKmN0bDsKIAlpbnQgcmV0OwogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgogCQlmbHVzaF93b3JrKCZkc3AtPmJvb3Rfd29yayk7CiAKLQkJaWYgKCFkc3AtPnJ1bm5pbmcpCisJCWlmICghZHNwLT5ib290ZWQpCiAJCQlyZXR1cm4gLUVJTzsKIAorCQlyZXQgPSB3bV9hZHNwMl9lbmEoZHNwKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZ290byBlcnI7CisKKwkJLyogU3luYyBzZXQgY29udHJvbHMgKi8KKwkJcmV0ID0gd21fY29lZmZfc3luY19jb250cm9scyhkc3ApOworCQlpZiAocmV0ICE9IDApCisJCQlnb3RvIGVycjsKKwogCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoZHNwLT5yZWdtYXAsCiAJCQkJCSBkc3AtPmJhc2UgKyBBRFNQMl9DT05UUk9MLAogCQkJCQkgQURTUDJfQ09SRV9FTkEgfCBBRFNQMl9TVEFSVCwKQEAgLTIzNDYsNiArMjM4OSw4IEBACiAJCWlmIChyZXQgIT0gMCkKIAkJCWdvdG8gZXJyOwogCisJCWRzcC0+cnVubmluZyA9IHRydWU7CisKIAkJbXV0ZXhfbG9jaygmZHNwLT5wd3JfbG9jayk7CiAKIAkJaWYgKHdtX2Fkc3BfZndbZHNwLT5md10ubnVtX2NhcHMgIT0gMCkKQEAgLTIzNjEsMTAgKzI0MDYsNiBAQAogCiAJCW11dGV4X2xvY2soJmRzcC0+cHdyX2xvY2spOwogCi0JCXdtX2Fkc3BfZGVidWdmc19jbGVhcihkc3ApOwotCi0JCWRzcC0+ZndfaWQgPSAwOwotCQlkc3AtPmZ3X2lkX3ZlcnNpb24gPSAwOwogCQlkc3AtPnJ1bm5pbmcgPSBmYWxzZTsKIAogCQlyZWdtYXBfdXBkYXRlX2JpdHMoZHNwLT5yZWdtYXAsIGRzcC0+YmFzZSArIEFEU1AyX0NPTlRST0wsCkBAIC0yMzc4LDE3ICsyNDE5LDEyIEBACiAJCXJlZ21hcF91cGRhdGVfYml0cyhkc3AtPnJlZ21hcCwgZHNwLT5iYXNlICsgQURTUDJfQ09OVFJPTCwKIAkJCQkgICBBRFNQMl9TWVNfRU5BLCAwKTsKIAotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0bCwgJmRzcC0+Y3RsX2xpc3QsIGxpc3QpCi0JCQljdGwtPmVuYWJsZWQgPSAwOwotCi0JCXdtX2Fkc3BfZnJlZV9hbGdfcmVnaW9ucyhkc3ApOwotCiAJCWlmICh3bV9hZHNwX2Z3W2RzcC0+ZnddLm51bV9jYXBzICE9IDApCiAJCQl3bV9hZHNwX2J1ZmZlcl9mcmVlKGRzcCk7CiAKIAkJbXV0ZXhfdW5sb2NrKCZkc3AtPnB3cl9sb2NrKTsKIAotCQlhZHNwX2RiZyhkc3AsICJTaHV0ZG93biBjb21wbGV0ZVxuIik7CisJCWFkc3BfZGJnKGRzcCwgIkV4ZWN1dGlvbiBzdG9wcGVkXG4iKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bV9hZHNwLmggYi9zb3VuZC9zb2MvY29kZWNzL3dtX2Fkc3AuaAppbmRleCBiZTNiNWJjLi4zNjJkZDdjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtX2Fkc3AuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtX2Fkc3AuaApAQCAtNjEsNiArNjEsOCBAQAogCiAJaW50IGZ3OwogCWludCBmd192ZXI7CisKKwlib29sIGJvb3RlZDsKIAlib29sIHJ1bm5pbmc7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGN0bF9saXN0OwpAQCAtODUsOSArODcsMTAgQEAKIAkJd21fYWRzcDFfZXZlbnQsIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKQogCiAjZGVmaW5lIFdNX0FEU1AyKHduYW1lLCBudW0sIGV2ZW50X2ZuKSBcCi17CS5pZCA9IHNuZF9zb2NfZGFwbV9kYWlfbGluaywgLm5hbWUgPSB3bmFtZSAiIFByZWxvYWRlciIsIFwKK3sJLmlkID0gc25kX3NvY19kYXBtX3N1cHBseSwgLm5hbWUgPSB3bmFtZSAiIFByZWxvYWRlciIsIFwKIAkucmVnID0gU05EX1NPQ19OT1BNLCAuc2hpZnQgPSBudW0sIC5ldmVudCA9IGV2ZW50X2ZuLCBcCi0JLmV2ZW50X2ZsYWdzID0gU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQgfSwgXAorCS5ldmVudF9mbGFncyA9IFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQsIFwKKwkuc3Vic2VxID0gMTAwLCAvKiBFbnN1cmUgd2UgcnVuIGFmdGVyIFNZU0NMSyBzdXBwbHkgd2lkZ2V0ICovIH0sIFwKIHsJLmlkID0gc25kX3NvY19kYXBtX291dF9kcnYsIC5uYW1lID0gd25hbWUsIFwKIAkucmVnID0gU05EX1NPQ19OT1BNLCAuc2hpZnQgPSBudW0sIC5ldmVudCA9IHdtX2Fkc3AyX2V2ZW50LCBcCiAJLmV2ZW50X2ZsYWdzID0gU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQgfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1tY2FzcC5jIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1tY2FzcC5jCmluZGV4IDA1YzJkMzMuLjNjNWE5ODAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktbWNhc3AuYworKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLW1jYXNwLmMKQEAgLTEyMTgsNyArMTIxOCw3IEBACiAKIAlzbmRfbWFza19ub25lKCZuZm10KTsKIAotCWZvciAoaSA9IDA7IGkgPCBTTkRSVl9QQ01fRk9STUFUX0xBU1Q7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPD0gU05EUlZfUENNX0ZPUk1BVF9MQVNUOyBpKyspIHsKIAkJaWYgKHNuZF9tYXNrX3Rlc3QoZm10LCBpKSkgewogCQkJdWludCBzYml0cyA9IHNuZF9wY21fZm9ybWF0X3dpZHRoKGkpOwogCQkJaW50IHBwbTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9kd2MvZGVzaWdud2FyZV9pMnMuYyBiL3NvdW5kL3NvYy9kd2MvZGVzaWdud2FyZV9pMnMuYwppbmRleCBkYzk3ZjQzLi4yOTk4OTU0YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2R3Yy9kZXNpZ253YXJlX2kycy5jCisrKyBiL3NvdW5kL3NvYy9kd2MvZGVzaWdud2FyZV9pMnMuYwpAQCAtNTc3LDcgKzU3Nyw2IEBACiAJCWRldi0+Y2FwYWJpbGl0eSB8PSBEV0NfSTJTX1BMQVk7CiAJCWRldi0+cGxheV9kbWFfZGF0YS5kdC5hZGRyID0gcmVzLT5zdGFydCArIEkyU19UWERNQTsKIAkJZGV2LT5wbGF5X2RtYV9kYXRhLmR0LmFkZHJfd2lkdGggPSBidXNfd2lkdGhzW2lkeF07Ci0JCWRldi0+cGxheV9kbWFfZGF0YS5kdC5jaGFuX25hbWUgPSAiVFgiOwogCQlkZXYtPnBsYXlfZG1hX2RhdGEuZHQuZmlmb19zaXplID0gZmlmb19kZXB0aCAqCiAJCQkoZmlmb193aWR0aFtpZHgyXSkgPj4gODsKIAkJZGV2LT5wbGF5X2RtYV9kYXRhLmR0Lm1heGJ1cnN0ID0gMTY7CkBAIC01ODgsNyArNTg3LDYgQEAKIAkJZGV2LT5jYXBhYmlsaXR5IHw9IERXQ19JMlNfUkVDT1JEOwogCQlkZXYtPmNhcHR1cmVfZG1hX2RhdGEuZHQuYWRkciA9IHJlcy0+c3RhcnQgKyBJMlNfUlhETUE7CiAJCWRldi0+Y2FwdHVyZV9kbWFfZGF0YS5kdC5hZGRyX3dpZHRoID0gYnVzX3dpZHRoc1tpZHhdOwotCQlkZXYtPmNhcHR1cmVfZG1hX2RhdGEuZHQuY2hhbl9uYW1lID0gIlJYIjsKIAkJZGV2LT5jYXB0dXJlX2RtYV9kYXRhLmR0LmZpZm9fc2l6ZSA9IGZpZm9fZGVwdGggKgogCQkJKGZpZm9fd2lkdGhbaWR4Ml0gPj4gOCk7CiAJCWRldi0+Y2FwdHVyZV9kbWFfZGF0YS5kdC5tYXhidXJzdCA9IDE2OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9mc2xfYXNyYy5jIGIvc291bmQvc29jL2ZzbC9mc2xfYXNyYy5jCmluZGV4IGMxYTBlMDEuLjFkODJmNjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvZnNsX2FzcmMuYworKysgYi9zb3VuZC9zb2MvZnNsL2ZzbF9hc3JjLmMKQEAgLTcyNiw3ICs3MjYsNyBAQAogCS5yZWFkYWJsZV9yZWcgPSBmc2xfYXNyY19yZWFkYWJsZV9yZWcsCiAJLnZvbGF0aWxlX3JlZyA9IGZzbF9hc3JjX3ZvbGF0aWxlX3JlZywKIAkud3JpdGVhYmxlX3JlZyA9IGZzbF9hc3JjX3dyaXRlYWJsZV9yZWcsCi0JLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAogfTsKIAogLyoqCkBAIC04NzksNyArODc5LDcgQEAKIAkJfQogCX0KIAotCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwZGV2LT5kZXYub2Zfbm9kZSwgImZzbCxpbXgzNS1hc3JjIikpIHsKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsaW14MzUtYXNyYyIpKSB7CiAJCWFzcmNfcHJpdi0+Y2hhbm5lbF9iaXRzID0gMzsKIAkJY2xrX21hcFtJTl0gPSBpbnB1dF9jbGtfbWFwX2lteDM1OwogCQljbGtfbWFwW09VVF0gPSBvdXRwdXRfY2xrX21hcF9pbXgzNTsKQEAgLTg5Miw3ICs4OTIsNyBAQAogCXJldCA9IGZzbF9hc3JjX2luaXQoYXNyY19wcml2KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpbml0IGFzcmMgJWRcbiIsIHJldCk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gcmV0OwogCX0KIAogCWFzcmNfcHJpdi0+Y2hhbm5lbF9hdmFpbCA9IDEwOwpAQCAtOTAxLDE0ICs5MDEsMTQgQEAKIAkJCQkgICAmYXNyY19wcml2LT5hc3JjX3JhdGUpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBvdXRwdXQgcmF0ZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZnNsLGFzcmMtd2lkdGgiLAogCQkJCSAgICZhc3JjX3ByaXYtPmFzcmNfd2lkdGgpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBvdXRwdXQgd2lkdGhcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlpZiAoYXNyY19wcml2LT5hc3JjX3dpZHRoICE9IDE2ICYmIGFzcmNfcHJpdi0+YXNyY193aWR0aCAhPSAyNCkgewpAQCAtOTMzLDggKzkzMyw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JZGV2X2luZm8oJnBkZXYtPmRldiwgImRyaXZlciByZWdpc3RlcmVkXG4iKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2ZzbF9hc3JjX2RtYS5jIGIvc291bmQvc29jL2ZzbC9mc2xfYXNyY19kbWEuYwppbmRleCBmZmMwMDBiLi5kYzMwZDc4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2ZzbF9hc3JjX2RtYS5jCisrKyBiL3NvdW5kL3NvYy9mc2wvZnNsX2FzcmNfZG1hLmMKQEAgLTMyMiw3ICszMjIsNyBAQAogCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBwYWlyLT5wb3MpOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGZzbF9hc3JjX2RtYV9wY21fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBmc2xfYXNyY19kbWFfcGNtX29wcyA9IHsKIAkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCiAJLmh3X3BhcmFtcwk9IGZzbF9hc3JjX2RtYV9od19wYXJhbXMsCiAJLmh3X2ZyZWUJPSBmc2xfYXNyY19kbWFfaHdfZnJlZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvZnNsX2VzYWkuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX2VzYWkuYwppbmRleCAyNmE5MGUxLi4zOGJmZDQ2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2ZzbF9lc2FpLmMKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfZXNhaS5jCkBAIC03NywxOSArNzcsMTkgQEAKIAlyZWdtYXBfcmVhZChlc2FpX3ByaXYtPnJlZ21hcCwgUkVHX0VTQUlfRVNSLCAmZXNyKTsKIAogCWlmIChlc3IgJiBFU0FJX0VTUl9USU5JVF9NQVNLKQotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJpc3I6IFRyYW5zbWl0aW9uIEluaXRpYWxpemVkXG4iKTsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiaXNyOiBUcmFuc21pc3Npb24gSW5pdGlhbGl6ZWRcbiIpOwogCiAJaWYgKGVzciAmIEVTQUlfRVNSX1JGRl9NQVNLKQogCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiaXNyOiBSZWNlaXZpbmcgb3ZlcnJ1blxuIik7CiAKIAlpZiAoZXNyICYgRVNBSV9FU1JfVEZFX01BU0spCi0JCWRldl93YXJuKCZwZGV2LT5kZXYsICJpc3I6IFRyYW5zbWl0aW9uIHVuZGVycnVuXG4iKTsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImlzcjogVHJhbnNtaXNzaW9uIHVuZGVycnVuXG4iKTsKIAogCWlmIChlc3IgJiBFU0FJX0VTUl9UTFNfTUFTSykKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiaXNyOiBKdXN0IHRyYW5zbWl0dGVkIHRoZSBsYXN0IHNsb3RcbiIpOwogCiAJaWYgKGVzciAmIEVTQUlfRVNSX1RERV9NQVNLKQotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJpc3I6IFRyYW5zbWl0aW9uIGRhdGEgZXhjZXB0aW9uXG4iKTsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiaXNyOiBUcmFuc21pc3Npb24gZGF0YSBleGNlcHRpb25cbiIpOwogCiAJaWYgKGVzciAmIEVTQUlfRVNSX1RFRF9NQVNLKQogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJpc3I6IFRyYW5zbWl0dGluZyBldmVuIHNsb3RzXG4iKTsKQEAgLTc4MSw3ICs3ODEsNyBAQAogCS5yZWFkYWJsZV9yZWcgPSBmc2xfZXNhaV9yZWFkYWJsZV9yZWcsCiAJLnZvbGF0aWxlX3JlZyA9IGZzbF9lc2FpX3ZvbGF0aWxlX3JlZywKIAkud3JpdGVhYmxlX3JlZyA9IGZzbF9lc2FpX3dyaXRlYWJsZV9yZWcsCi0JLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAogfTsKIAogc3RhdGljIGludCBmc2xfZXNhaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9mc2xfc2FpLmMgYi9zb3VuZC9zb2MvZnNsL2ZzbF9zYWkuYwppbmRleCAyMTQ3OTk0Li45ZmFkZjdlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2ZzbF9zYWkuYworKysgYi9zb3VuZC9zb2MvZnNsL2ZzbF9zYWkuYwpAQCAtODAxLDggKzgwMSw4IEBACiAKIAlzYWktPnBkZXYgPSBwZGV2OwogCi0JaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKHBkZXYtPmRldi5vZl9ub2RlLCAiZnNsLGlteDZzeC1zYWkiKSB8fAotCSAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwZGV2LT5kZXYub2Zfbm9kZSwgImZzbCxpbXg2dWwtc2FpIikpCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLGlteDZzeC1zYWkiKSB8fAorCSAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxpbXg2dWwtc2FpIikpCiAJCXNhaS0+c2FpX29uX2lteCA9IHRydWU7CiAKIAlzYWktPmlzX2xzYl9maXJzdCA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImxzYi1maXJzdCIpOwpAQCAtODgzLDcgKzg4Myw3IEBACiAJfQogCiAJaWYgKG9mX2ZpbmRfcHJvcGVydHkobnAsICJmc2wsc2FpLW1jbGstZGlyZWN0aW9uLW91dHB1dCIsIE5VTEwpICYmCi0JICAgIG9mX2RldmljZV9pc19jb21wYXRpYmxlKHBkZXYtPmRldi5vZl9ub2RlLCAiZnNsLGlteDZ1bC1zYWkiKSkgeworCSAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxpbXg2dWwtc2FpIikpIHsKIAkJZ3ByID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfY29tcGF0aWJsZSgiZnNsLGlteDZ1bC1pb211eGMtZ3ByIik7CiAJCWlmIChJU19FUlIoZ3ByKSkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGZpbmQgaW9tdXhjIHJlZ2lzdGVyc1xuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2ZzbF9zcGRpZi5jIGIvc291bmQvc29jL2ZzbC9mc2xfc3BkaWYuYwppbmRleCBiZWVjNzkzLi4xZmY0NjdjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2ZzbF9zcGRpZi5jCisrKyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NwZGlmLmMKQEAgLTExMDMsNyArMTEwMyw3IEBACiAJLnJlYWRhYmxlX3JlZyA9IGZzbF9zcGRpZl9yZWFkYWJsZV9yZWcsCiAJLnZvbGF0aWxlX3JlZyA9IGZzbF9zcGRpZl92b2xhdGlsZV9yZWcsCiAJLndyaXRlYWJsZV9yZWcgPSBmc2xfc3BkaWZfd3JpdGVhYmxlX3JlZywKLQkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCiB9OwogCiBzdGF0aWMgdTMyIGZzbF9zcGRpZl90eGNsa19jYWxkaXYoc3RydWN0IGZzbF9zcGRpZl9wcml2ICpzcGRpZl9wcml2LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9mc2xfc3NpLmMgYi9zb3VuZC9zb2MvZnNsL2ZzbF9zc2kuYwppbmRleCBiZWRlYzRhLi41MDM0OTQzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2ZzbF9zc2kuYworKysgYi9zb3VuZC9zb2MvZnNsL2ZzbF9zc2kuYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAJLnZvbGF0aWxlX3JlZyA9IGZzbF9zc2lfdm9sYXRpbGVfcmVnLAogCS5wcmVjaW91c19yZWcgPSBmc2xfc3NpX3ByZWNpb3VzX3JlZywKIAkud3JpdGVhYmxlX3JlZyA9IGZzbF9zc2lfd3JpdGVhYmxlX3JlZywKLQkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCiB9OwogCiBzdHJ1Y3QgZnNsX3NzaV9zb2NfZGF0YSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZ2VuZXJpYy9LY29uZmlnIGIvc291bmQvc29jL2dlbmVyaWMvS2NvbmZpZwppbmRleCBjMDFjNWRkLi5kMDIzOTU5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZ2VuZXJpYy9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9nZW5lcmljL0tjb25maWcKQEAgLTYsMyArNiwxMSBAQAogCXNlbGVjdCBTTkRfU0lNUExFX0NBUkRfVVRJTFMKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIGdlbmVyaWMgc2ltcGxlIHNvdW5kIGNhcmQgc3VwcG9ydAorCitjb25maWcgU05EX1NJTVBMRV9TQ1VfQ0FSRAorCXRyaXN0YXRlICJBU29DIFNpbXBsZSBTQ1Ugc291bmQgY2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gT0YKKwlzZWxlY3QgU05EX1NJTVBMRV9DQVJEX1VUSUxTCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBnZW5lcmljIHNpbXBsZSBTQ1Ugc291bmQgY2FyZCBzdXBwb3J0LgorCSAgSXQgc3VwcG9ydHMgRFBDTSBvZiBtdWx0aSBDUFUgc2luZ2xlIENvZGVjIHN5c3RlbS4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9nZW5lcmljL01ha2VmaWxlIGIvc291bmQvc29jL2dlbmVyaWMvTWFrZWZpbGUKaW5kZXggNDU2MDJjYS4uZWU3NTBmMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2dlbmVyaWMvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL2dlbmVyaWMvTWFrZWZpbGUKQEAgLTEsNSArMSw3IEBACi1vYmotJChDT05GSUdfU05EX1NJTVBMRV9DQVJEX1VUSUxTKSA6PSBzaW1wbGUtY2FyZC11dGlscy5vCi0KK3NuZC1zb2Mtc2ltcGxlLWNhcmQtdXRpbHMtb2Jqcwk6PSBzaW1wbGUtY2FyZC11dGlscy5vCiBzbmQtc29jLXNpbXBsZS1jYXJkLW9ianMJOj0gc2ltcGxlLWNhcmQubworc25kLXNvYy1zaW1wbGUtc2N1LWNhcmQtb2Jqcwk6PSBzaW1wbGUtc2N1LWNhcmQubwogCi1vYmotJChDT05GSUdfU05EX1NJTVBMRV9DQVJEKQkrPSBzbmQtc29jLXNpbXBsZS1jYXJkLm8KK29iai0kKENPTkZJR19TTkRfU0lNUExFX0NBUkRfVVRJTFMpCSs9IHNuZC1zb2Mtc2ltcGxlLWNhcmQtdXRpbHMubworb2JqLSQoQ09ORklHX1NORF9TSU1QTEVfQ0FSRCkJCSs9IHNuZC1zb2Mtc2ltcGxlLWNhcmQubworb2JqLSQoQ09ORklHX1NORF9TSU1QTEVfU0NVX0NBUkQpCSs9IHNuZC1zb2Mtc2ltcGxlLXNjdS1jYXJkLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLXV0aWxzLmMgYi9zb3VuZC9zb2MvZ2VuZXJpYy9zaW1wbGUtY2FyZC11dGlscy5jCmluZGV4IGQ4OWE5YTEuLjFjYjM5MzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLXV0aWxzLmMKKysrIGIvc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLWNhcmQtdXRpbHMuYwpAQCAtNyw2ICs3LDggQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8c291bmQvc2ltcGxlX2NhcmRfdXRpbHMuaD4KIApAQCAtOTUsMyArOTcsMTQ4IEBACiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2NhcmRfbmFtZSk7CisKK2ludCBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2NsayhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9ub2RlICpkYWlfb2Zfbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpzaW1wbGVfZGFpKQoreworCXN0cnVjdCBjbGsgKmNsazsKKwl1MzIgdmFsOworCisJLyoKKwkgKiBQYXJzZSBkYWktPnN5c2NsayBjb21lIGZyb20gImNsb2NrcyA9IDwmeHh4PiIKKwkgKiAoaWYgc3lzdGVtIGhhcyBjb21tb24gY2xvY2spCisJICogIG9yICJzeXN0ZW0tY2xvY2stZnJlcXVlbmN5ID0gPHh4eD4iCisJICogIG9yIGRldmljZSdzIG1vZHVsZSBjbG9jay4KKwkgKi8KKwljbGsgPSBvZl9jbGtfZ2V0KG5vZGUsIDApOworCWlmICghSVNfRVJSKGNsaykpIHsKKwkJc2ltcGxlX2RhaS0+c3lzY2xrID0gY2xrX2dldF9yYXRlKGNsayk7CisJCXNpbXBsZV9kYWktPmNsayA9IGNsazsKKwl9IGVsc2UgaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAic3lzdGVtLWNsb2NrLWZyZXF1ZW5jeSIsICZ2YWwpKSB7CisJCXNpbXBsZV9kYWktPnN5c2NsayA9IHZhbDsKKwl9IGVsc2UgeworCQljbGsgPSBvZl9jbGtfZ2V0KGRhaV9vZl9ub2RlLCAwKTsKKwkJaWYgKCFJU19FUlIoY2xrKSkKKwkJCXNpbXBsZV9kYWktPnN5c2NsayA9IGNsa19nZXRfcmF0ZShjbGspOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9jbGspOworCitpbnQgYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9kYWkoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKipkYWlfb2Zfbm9kZSwKKwkJCQkgICAgY29uc3QgY2hhciAqKmRhaV9uYW1lLAorCQkJCSAgICBjb25zdCBjaGFyICpsaXN0X25hbWUsCisJCQkJICAgIGNvbnN0IGNoYXIgKmNlbGxzX25hbWUsCisJCQkJICAgIGludCAqaXNfc2luZ2xlX2xpbmspCit7CisJc3RydWN0IG9mX3BoYW5kbGVfYXJncyBhcmdzOworCWludCByZXQ7CisKKwlpZiAoIW5vZGUpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBHZXQgbm9kZSB2aWEgInNvdW5kLWRhaSA9IDwmcGhhbmRsZSBwb3J0PiIKKwkgKiBpdCB3aWxsIGJlIHVzZWQgYXMgeHh4X29mX25vZGUgb24gc29jX2JpbmRfZGFpX2xpbmsoKQorCSAqLworCXJldCA9IG9mX3BhcnNlX3BoYW5kbGVfd2l0aF9hcmdzKG5vZGUsIGxpc3RfbmFtZSwgY2VsbHNfbmFtZSwgMCwgJmFyZ3MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBHZXQgZGFpLT5uYW1lICovCisJaWYgKGRhaV9uYW1lKSB7CisJCXJldCA9IHNuZF9zb2Nfb2ZfZ2V0X2RhaV9uYW1lKG5vZGUsIGRhaV9uYW1lKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCSpkYWlfb2Zfbm9kZSA9IGFyZ3MubnA7CisKKwlpZiAoaXNfc2luZ2xlX2xpbmspCisJCSppc19zaW5nbGVfbGluayA9ICFhcmdzLmFyZ3NfY291bnQ7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfZGFpKTsKKworaW50IGFzb2Nfc2ltcGxlX2NhcmRfaW5pdF9kYWkoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJCQkgICAgICBzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpzaW1wbGVfZGFpKQoreworCWludCByZXQ7CisKKwlpZiAoc2ltcGxlX2RhaS0+c3lzY2xrKSB7CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoZGFpLCAwLCBzaW1wbGVfZGFpLT5zeXNjbGssIDApOworCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PVFNVUFApIHsKKwkJCWRldl9lcnIoZGFpLT5kZXYsICJzaW1wbGUtY2FyZDogc2V0X3N5c2NsayBlcnJvclxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKHNpbXBsZV9kYWktPnNsb3RzKSB7CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdChkYWksCisJCQkJCSAgICAgICBzaW1wbGVfZGFpLT50eF9zbG90X21hc2ssCisJCQkJCSAgICAgICBzaW1wbGVfZGFpLT5yeF9zbG90X21hc2ssCisJCQkJCSAgICAgICBzaW1wbGVfZGFpLT5zbG90cywKKwkJCQkJICAgICAgIHNpbXBsZV9kYWktPnNsb3Rfd2lkdGgpOworCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PVFNVUFApIHsKKwkJCWRldl9lcnIoZGFpLT5kZXYsICJzaW1wbGUtY2FyZDogc2V0X3RkbV9zbG90IGVycm9yXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFzb2Nfc2ltcGxlX2NhcmRfaW5pdF9kYWkpOworCitpbnQgYXNvY19zaW1wbGVfY2FyZF9jYW5vbmljYWxpemVfZGFpbGluayhzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmspCit7CisJaWYgKCFkYWlfbGluay0+Y3B1X2RhaV9uYW1lIHx8ICFkYWlfbGluay0+Y29kZWNfZGFpX25hbWUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQXNzdW1lcyBwbGF0Zm9ybSA9PSBjcHUgKi8KKwlpZiAoIWRhaV9saW5rLT5wbGF0Zm9ybV9vZl9ub2RlKQorCQlkYWlfbGluay0+cGxhdGZvcm1fb2Zfbm9kZSA9IGRhaV9saW5rLT5jcHVfb2Zfbm9kZTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXNvY19zaW1wbGVfY2FyZF9jYW5vbmljYWxpemVfZGFpbGluayk7CisKK3ZvaWQgYXNvY19zaW1wbGVfY2FyZF9jYW5vbmljYWxpemVfY3B1KHN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluaywKKwkJCQkgICAgICAgaW50IGlzX3NpbmdsZV9saW5rcykKK3sKKwkvKgorCSAqIEluIHNvY19iaW5kX2RhaV9saW5rKCkgd2lsbCBjaGVjayBjcHUgbmFtZSBhZnRlcgorCSAqIG9mX25vZGUgbWF0Y2hpbmcgaWYgZGFpX2xpbmsgaGFzIGNwdV9kYWlfbmFtZS4KKwkgKiBidXQsIGl0IHdpbGwgbmV2ZXIgbWF0Y2ggaWYgbmFtZSB3YXMgY3JlYXRlZCBieQorCSAqIGZtdF9zaW5nbGVfbmFtZSgpIHJlbW92ZSBjcHVfZGFpX25hbWUgaWYgY3B1X2FyZ3MKKwkgKiB3YXMgMC4gU2VlOgorCSAqCWZtdF9zaW5nbGVfbmFtZSgpCisJICoJZm10X211bHRpcGxlX25hbWUoKQorCSAqLworCWlmIChpc19zaW5nbGVfbGlua3MpCisJCWRhaV9saW5rLT5jcHVfZGFpX25hbWUgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXNvY19zaW1wbGVfY2FyZF9jYW5vbmljYWxpemVfY3B1KTsKKworaW50IGFzb2Nfc2ltcGxlX2NhcmRfY2xlYW5fcmVmZXJlbmNlKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rOworCWludCBudW1fbGlua3M7CisKKwlmb3IgKG51bV9saW5rcyA9IDAsIGRhaV9saW5rID0gY2FyZC0+ZGFpX2xpbms7CisJICAgICBudW1fbGlua3MgPCBjYXJkLT5udW1fbGlua3M7CisJICAgICBudW1fbGlua3MrKywgZGFpX2xpbmsrKykgeworCQlvZl9ub2RlX3B1dChkYWlfbGluay0+Y3B1X29mX25vZGUpOworCQlvZl9ub2RlX3B1dChkYWlfbGluay0+Y29kZWNfb2Zfbm9kZSk7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXNvY19zaW1wbGVfY2FyZF9jbGVhbl9yZWZlcmVuY2UpOworCisvKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KK01PRFVMRV9BVVRIT1IoIkt1bmlub3JpIE1vcmltb3RvIDxrdW5pbm9yaS5tb3JpbW90by5neEByZW5lc2FzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUxTQSBTb0MgU2ltcGxlIENhcmQgVXRpbHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLmMgYi9zb3VuZC9zb2MvZ2VuZXJpYy9zaW1wbGUtY2FyZC5jCmluZGV4IDQzMjk1ZjAuLmY2MDhmOGQyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZ2VuZXJpYy9zaW1wbGUtY2FyZC5jCisrKyBiL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLmMKQEAgLTM3LDEzICszNywxNSBAQAogCXVuc2lnbmVkIGludCBtY2xrX2ZzOwogCXN0cnVjdCBhc29jX3NpbXBsZV9qYWNrIGhwX2phY2s7CiAJc3RydWN0IGFzb2Nfc2ltcGxlX2phY2sgbWljX2phY2s7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgZGFpX2xpbmtbXTsJLyogZHluYW1pY2FsbHkgYWxsb2NhdGVkICovCisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rOwogfTsKIAogI2RlZmluZSBzaW1wbGVfcHJpdl90b19kZXYocHJpdikgKChwcml2KS0+c25kX2NhcmQuZGV2KQotI2RlZmluZSBzaW1wbGVfcHJpdl90b19saW5rKHByaXYsIGkpICgocHJpdiktPnNuZF9jYXJkLmRhaV9saW5rICsgaSkKLSNkZWZpbmUgc2ltcGxlX3ByaXZfdG9fcHJvcHMocHJpdiwgaSkgKChwcml2KS0+ZGFpX3Byb3BzICsgaSkKKyNkZWZpbmUgc2ltcGxlX3ByaXZfdG9fbGluayhwcml2LCBpKSAoKHByaXYpLT5zbmRfY2FyZC5kYWlfbGluayArIChpKSkKKyNkZWZpbmUgc2ltcGxlX3ByaXZfdG9fcHJvcHMocHJpdiwgaSkgKChwcml2KS0+ZGFpX3Byb3BzICsgKGkpKQogCisjZGVmaW5lIERBSQkic291bmQtZGFpIgorI2RlZmluZSBDRUxMCSIjc291bmQtZGFpLWNlbGxzIgogI2RlZmluZSBQUkVGSVgJInNpbXBsZS1hdWRpby1jYXJkLCIKIAogI2RlZmluZSBhc29jX3NpbXBsZV9jYXJkX2luaXRfaHAoY2FyZCwgc2phY2ssIHByZWZpeClcCkBAIC0xMTIsMTMgKzExNCwxMyBAQAogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc2ltcGxlX2NhcmRfZGF0YSAqcHJpdiA9CXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydGQtPmNhcmQpOwogCXN0cnVjdCBzaW1wbGVfZGFpX3Byb3BzICpkYWlfcHJvcHMgPQotCQkmcHJpdi0+ZGFpX3Byb3BzW3J0ZC0+bnVtXTsKKwkJc2ltcGxlX3ByaXZfdG9fcHJvcHMocHJpdiwgcnRkLT5udW0pOwogCWludCByZXQ7CiAKIAlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZGFpX3Byb3BzLT5jcHVfZGFpLmNsayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQkKKwogCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkYWlfcHJvcHMtPmNvZGVjX2RhaS5jbGspOwogCWlmIChyZXQpCiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShkYWlfcHJvcHMtPmNwdV9kYWkuY2xrKTsKQEAgLTEzMSw3ICsxMzMsNyBAQAogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc2ltcGxlX2NhcmRfZGF0YSAqcHJpdiA9CXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydGQtPmNhcmQpOwogCXN0cnVjdCBzaW1wbGVfZGFpX3Byb3BzICpkYWlfcHJvcHMgPQotCQkmcHJpdi0+ZGFpX3Byb3BzW3J0ZC0+bnVtXTsKKwkJc2ltcGxlX3ByaXZfdG9fcHJvcHMocHJpdiwgcnRkLT5udW0pOwogCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhaV9wcm9wcy0+Y3B1X2RhaS5jbGspOwogCkBAIC0xNDUsNyArMTQ3LDggQEAKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKIAlzdHJ1Y3Qgc2ltcGxlX2NhcmRfZGF0YSAqcHJpdiA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydGQtPmNhcmQpOwotCXN0cnVjdCBzaW1wbGVfZGFpX3Byb3BzICpkYWlfcHJvcHMgPSAmcHJpdi0+ZGFpX3Byb3BzW3J0ZC0+bnVtXTsKKwlzdHJ1Y3Qgc2ltcGxlX2RhaV9wcm9wcyAqZGFpX3Byb3BzID0KKwkJc2ltcGxlX3ByaXZfdG9fcHJvcHMocHJpdiwgcnRkLT5udW0pOwogCXVuc2lnbmVkIGludCBtY2xrLCBtY2xrX2ZzID0gMDsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMTc3LDUxICsxODAsMjAgQEAKIAkuaHdfcGFyYW1zID0gYXNvY19zaW1wbGVfY2FyZF9od19wYXJhbXMsCiB9OwogCi1zdGF0aWMgaW50IF9fYXNvY19zaW1wbGVfY2FyZF9kYWlfaW5pdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKLQkJCQkgICAgICAgc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqc2V0KQotewotCWludCByZXQ7Ci0KLQlpZiAoc2V0LT5zeXNjbGspIHsKLQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2NsayhkYWksIDAsIHNldC0+c3lzY2xrLCAwKTsKLQkJaWYgKHJldCAmJiByZXQgIT0gLUVOT1RTVVBQKSB7Ci0JCQlkZXZfZXJyKGRhaS0+ZGV2LCAic2ltcGxlLWNhcmQ6IHNldF9zeXNjbGsgZXJyb3JcbiIpOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0KLQlpZiAoc2V0LT5zbG90cykgewotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QoZGFpLAotCQkJCQkgICAgICAgc2V0LT50eF9zbG90X21hc2ssCi0JCQkJCSAgICAgICBzZXQtPnJ4X3Nsb3RfbWFzaywKLQkJCQkJCXNldC0+c2xvdHMsCi0JCQkJCQlzZXQtPnNsb3Rfd2lkdGgpOwotCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PVFNVUFApIHsKLQkJCWRldl9lcnIoZGFpLT5kZXYsICJzaW1wbGUtY2FyZDogc2V0X3RkbV9zbG90IGVycm9yXG4iKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotCi0JcmV0ID0gMDsKLQotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBpbnQgYXNvY19zaW1wbGVfY2FyZF9kYWlfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzaW1wbGVfY2FyZF9kYXRhICpwcml2ID0Jc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlYyA9IHJ0ZC0+Y29kZWNfZGFpOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1ID0gcnRkLT5jcHVfZGFpOwotCXN0cnVjdCBzaW1wbGVfZGFpX3Byb3BzICpkYWlfcHJvcHM7CisJc3RydWN0IHNpbXBsZV9kYWlfcHJvcHMgKmRhaV9wcm9wcyA9CisJCXNpbXBsZV9wcml2X3RvX3Byb3BzKHByaXYsIHJ0ZC0+bnVtKTsKIAlpbnQgcmV0OwogCi0JZGFpX3Byb3BzID0gJnByaXYtPmRhaV9wcm9wc1tydGQtPm51bV07Ci0JcmV0ID0gX19hc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0KGNvZGVjLCAmZGFpX3Byb3BzLT5jb2RlY19kYWkpOworCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfaW5pdF9kYWkoY29kZWMsICZkYWlfcHJvcHMtPmNvZGVjX2RhaSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBfX2Fzb2Nfc2ltcGxlX2NhcmRfZGFpX2luaXQoY3B1LCAmZGFpX3Byb3BzLT5jcHVfZGFpKTsKKwlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX2luaXRfZGFpKGNwdSwgJmRhaV9wcm9wcy0+Y3B1X2RhaSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTIzNiw3OCArMjA4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotYXNvY19zaW1wbGVfY2FyZF9zdWJfcGFyc2Vfb2Yoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCSAgICAgIHN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKmRhaSwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKnBfbm9kZSwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKipuYW1lLAotCQkJICAgICAgaW50ICphcmdzX2NvdW50KQotewotCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgYXJnczsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0JdTMyIHZhbDsKLQlpbnQgcmV0OwotCi0JaWYgKCFucCkKLQkJcmV0dXJuIDA7Ci0KLQkvKgotCSAqIEdldCBub2RlIHZpYSAic291bmQtZGFpID0gPCZwaGFuZGxlIHBvcnQ+IgotCSAqIGl0IHdpbGwgYmUgdXNlZCBhcyB4eHhfb2Zfbm9kZSBvbiBzb2NfYmluZF9kYWlfbGluaygpCi0JICovCi0JcmV0ID0gb2ZfcGFyc2VfcGhhbmRsZV93aXRoX2FyZ3MobnAsICJzb3VuZC1kYWkiLAotCQkJCQkgIiNzb3VuZC1kYWktY2VsbHMiLCAwLCAmYXJncyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCSpwX25vZGUgPSBhcmdzLm5wOwotCi0JaWYgKGFyZ3NfY291bnQpCi0JCSphcmdzX2NvdW50ID0gYXJncy5hcmdzX2NvdW50OwotCi0JLyogR2V0IGRhaS0+bmFtZSAqLwotCWlmIChuYW1lKSB7Ci0JCXJldCA9IHNuZF9zb2Nfb2ZfZ2V0X2RhaV9uYW1lKG5wLCBuYW1lKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmICghZGFpKQotCQlyZXR1cm4gMDsKLQotCS8qIFBhcnNlIFRETSBzbG90ICovCi0JcmV0ID0gc25kX3NvY19vZl9wYXJzZV90ZG1fc2xvdChucCwgJmRhaS0+dHhfc2xvdF9tYXNrLAotCQkJCQkmZGFpLT5yeF9zbG90X21hc2ssCi0JCQkJCSZkYWktPnNsb3RzLCAmZGFpLT5zbG90X3dpZHRoKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyoKLQkgKiBQYXJzZSBkYWktPnN5c2NsayBjb21lIGZyb20gImNsb2NrcyA9IDwmeHh4PiIKLQkgKiAoaWYgc3lzdGVtIGhhcyBjb21tb24gY2xvY2spCi0JICogIG9yICJzeXN0ZW0tY2xvY2stZnJlcXVlbmN5ID0gPHh4eD4iCi0JICogIG9yIGRldmljZSdzIG1vZHVsZSBjbG9jay4KLQkgKi8KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiY2xvY2tzIikpIHsKLQkJY2xrID0gb2ZfY2xrX2dldChucCwgMCk7Ci0JCWlmIChJU19FUlIoY2xrKSkgewotCQkJcmV0ID0gUFRSX0VSUihjbGspOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCWRhaS0+c3lzY2xrID0gY2xrX2dldF9yYXRlKGNsayk7Ci0JCWRhaS0+Y2xrID0gY2xrOwotCX0gZWxzZSBpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAic3lzdGVtLWNsb2NrLWZyZXF1ZW5jeSIsICZ2YWwpKSB7Ci0JCWRhaS0+c3lzY2xrID0gdmFsOwotCX0gZWxzZSB7Ci0JCWNsayA9IG9mX2Nsa19nZXQoYXJncy5ucCwgMCk7Ci0JCWlmICghSVNfRVJSKGNsaykpCi0JCQlkYWktPnN5c2NsayA9IGNsa19nZXRfcmF0ZShjbGspOwotCX0KLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGFzb2Nfc2ltcGxlX2NhcmRfZGFpX2xpbmtfb2Yoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAogCQkJCQlzdHJ1Y3Qgc2ltcGxlX2NhcmRfZGF0YSAqcHJpdiwKIAkJCQkJaW50IGlkeCwKQEAgLTMxNiwxMyArMjE2LDE0IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gc2ltcGxlX3ByaXZfdG9fZGV2KHByaXYpOwogCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IHNpbXBsZV9wcml2X3RvX2xpbmsocHJpdiwgaWR4KTsKIAlzdHJ1Y3Qgc2ltcGxlX2RhaV9wcm9wcyAqZGFpX3Byb3BzID0gc2ltcGxlX3ByaXZfdG9fcHJvcHMocHJpdiwgaWR4KTsKKwlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpjcHVfZGFpID0gJmRhaV9wcm9wcy0+Y3B1X2RhaTsKKwlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpjb2RlY19kYWkgPSAmZGFpX3Byb3BzLT5jb2RlY19kYWk7CiAJc3RydWN0IGRldmljZV9ub2RlICpjcHUgPSBOVUxMOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGxhdCA9IE5VTEw7CiAJc3RydWN0IGRldmljZV9ub2RlICpjb2RlYyA9IE5VTEw7CiAJY2hhciBwcm9wWzEyOF07CiAJY2hhciAqcHJlZml4ID0gIiI7Ci0JaW50IHJldCwgY3B1X2FyZ3M7Ci0JdTMyIHZhbDsKKwlpbnQgcmV0LCBzaW5nbGVfY3B1OwogCiAJLyogRm9yIHNpbmdsZSBEQUkgbGluayAmIG9sZCBzdHlsZSBvZiBEVCBub2RlICovCiAJaWYgKGlzX3RvcF9sZXZlbF9ub2RlKQpAQCAtMzQ4LDM2ICsyNDksNDYgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBkYWlfbGlua19vZl9lcnI7CiAKLQlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJtY2xrLWZzIiwgJnZhbCkpCi0JCWRhaV9wcm9wcy0+bWNsa19mcyA9IHZhbDsKKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAibWNsay1mcyIsICZkYWlfcHJvcHMtPm1jbGtfZnMpOwogCi0JcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9zdWJfcGFyc2Vfb2YoY3B1LCAmZGFpX3Byb3BzLT5jcHVfZGFpLAotCQkJCQkgICAgJmRhaV9saW5rLT5jcHVfb2Zfbm9kZSwKLQkJCQkJICAgICZkYWlfbGluay0+Y3B1X2RhaV9uYW1lLAotCQkJCQkgICAgJmNwdV9hcmdzKTsKKwlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2NwdShjcHUsIGRhaV9saW5rLAorCQkJCQkgREFJLCBDRUxMLCAmc2luZ2xlX2NwdSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZGFpX2xpbmtfb2ZfZXJyOwogCi0JcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9zdWJfcGFyc2Vfb2YoY29kZWMsICZkYWlfcHJvcHMtPmNvZGVjX2RhaSwKLQkJCQkJICAgICZkYWlfbGluay0+Y29kZWNfb2Zfbm9kZSwKLQkJCQkJICAgICZkYWlfbGluay0+Y29kZWNfZGFpX25hbWUsIE5VTEwpOworCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY29kZWMoY29kZWMsIGRhaV9saW5rLCBEQUksIENFTEwpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGRhaV9saW5rX29mX2VycjsKIAotCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfc3ViX3BhcnNlX29mKHBsYXQsIE5VTEwsCi0JCQkJCSAgICAmZGFpX2xpbmstPnBsYXRmb3JtX29mX25vZGUsCi0JCQkJCSAgICBOVUxMLCBOVUxMKTsKKwlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX3BsYXRmb3JtKHBsYXQsIGRhaV9saW5rLCBEQUksIENFTEwpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGRhaV9saW5rX29mX2VycjsKIAotCWlmICghZGFpX2xpbmstPmNwdV9kYWlfbmFtZSB8fCAhZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lKSB7Ci0JCXJldCA9IC1FSU5WQUw7CisJcmV0ID0gc25kX3NvY19vZl9wYXJzZV90ZG1fc2xvdChjcHUsCSZjcHVfZGFpLT50eF9zbG90X21hc2ssCisJCQkJCQkmY3B1X2RhaS0+cnhfc2xvdF9tYXNrLAorCQkJCQkJJmNwdV9kYWktPnNsb3RzLAorCQkJCQkJJmNwdV9kYWktPnNsb3Rfd2lkdGgpOworCWlmIChyZXQgPCAwKQogCQlnb3RvIGRhaV9saW5rX29mX2VycjsKLQl9CiAKLQkvKiBBc3N1bWVzIHBsYXRmb3JtID09IGNwdSAqLwotCWlmICghZGFpX2xpbmstPnBsYXRmb3JtX29mX25vZGUpCi0JCWRhaV9saW5rLT5wbGF0Zm9ybV9vZl9ub2RlID0gZGFpX2xpbmstPmNwdV9vZl9ub2RlOworCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfdGRtX3Nsb3QoY29kZWMsCSZjb2RlY19kYWktPnR4X3Nsb3RfbWFzaywKKwkJCQkJCSZjb2RlY19kYWktPnJ4X3Nsb3RfbWFzaywKKwkJCQkJCSZjb2RlY19kYWktPnNsb3RzLAorCQkJCQkJJmNvZGVjX2RhaS0+c2xvdF93aWR0aCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZGFpX2xpbmtfb2ZfZXJyOworCisJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9jbGtfY3B1KGNwdSwgZGFpX2xpbmssIGNwdV9kYWkpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGRhaV9saW5rX29mX2VycjsKKworCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2xrX2NvZGVjKGNvZGVjLCBkYWlfbGluaywgY29kZWNfZGFpKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBkYWlfbGlua19vZl9lcnI7CisKKwlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX2Nhbm9uaWNhbGl6ZV9kYWlsaW5rKGRhaV9saW5rKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBkYWlfbGlua19vZl9lcnI7CiAKIAlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3NldF9kYWlsaW5rX25hbWUoZGV2LCBkYWlfbGluaywKIAkJCQkJCSIlcy0lcyIsCkBAIC0zOTgsMTcgKzMwOSw3IEBACiAJCWRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSwKIAkJZGFpX3Byb3BzLT5jb2RlY19kYWkuc3lzY2xrKTsKIAotCS8qCi0JICogSW4gc29jX2JpbmRfZGFpX2xpbmsoKSB3aWxsIGNoZWNrIGNwdSBuYW1lIGFmdGVyCi0JICogb2Zfbm9kZSBtYXRjaGluZyBpZiBkYWlfbGluayBoYXMgY3B1X2RhaV9uYW1lLgotCSAqIGJ1dCwgaXQgd2lsbCBuZXZlciBtYXRjaCBpZiBuYW1lIHdhcyBjcmVhdGVkIGJ5Ci0JICogZm10X3NpbmdsZV9uYW1lKCkgcmVtb3ZlIGNwdV9kYWlfbmFtZSBpZiBjcHVfYXJncwotCSAqIHdhcyAwLiBTZWU6Ci0JICoJZm10X3NpbmdsZV9uYW1lKCkKLQkgKglmbXRfbXVsdGlwbGVfbmFtZSgpCi0JICovCi0JaWYgKCFjcHVfYXJncykKLQkJZGFpX2xpbmstPmNwdV9kYWlfbmFtZSA9IE5VTEw7CisJYXNvY19zaW1wbGVfY2FyZF9jYW5vbmljYWxpemVfY3B1KGRhaV9saW5rLCBzaW5nbGVfY3B1KTsKIAogZGFpX2xpbmtfb2ZfZXJyOgogCW9mX25vZGVfcHV0KGNwdSk7CkBAIC00MTcsMjIgKzMxOCw1NCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9hdXhfZGV2cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJCSAgIHN0cnVjdCBzaW1wbGVfY2FyZF9kYXRhICpwcml2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHNpbXBsZV9wcml2X3RvX2Rldihwcml2KTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmF1eF9ub2RlOworCWludCBpLCBuLCBsZW47CisKKwlpZiAoIW9mX2ZpbmRfcHJvcGVydHkobm9kZSwgUFJFRklYICJhdXgtZGV2cyIsICZsZW4pKQorCQlyZXR1cm4gMDsJCS8qIE9rIHRvIGhhdmUgbm8gYXV4LWRldnMgKi8KKworCW4gPSBsZW4gLyBzaXplb2YoX19iZTMyKTsKKwlpZiAobiA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByaXYtPnNuZF9jYXJkLmF1eF9kZXYgPSBkZXZtX2t6YWxsb2MoZGV2LAorCQkJbiAqIHNpemVvZigqcHJpdi0+c25kX2NhcmQuYXV4X2RldiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdi0+c25kX2NhcmQuYXV4X2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCWF1eF9ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShub2RlLCBQUkVGSVggImF1eC1kZXZzIiwgaSk7CisJCWlmICghYXV4X25vZGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcHJpdi0+c25kX2NhcmQuYXV4X2RldltpXS5jb2RlY19vZl9ub2RlID0gYXV4X25vZGU7CisJfQorCisJcHJpdi0+c25kX2NhcmQubnVtX2F1eF9kZXZzID0gbjsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKIAkJCQkgICAgIHN0cnVjdCBzaW1wbGVfY2FyZF9kYXRhICpwcml2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHNpbXBsZV9wcml2X3RvX2Rldihwcml2KTsKLQl1MzIgdmFsOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZGFpX2xpbms7CiAJaW50IHJldDsKIAogCWlmICghbm9kZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlkYWlfbGluayA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5vZGUsIFBSRUZJWCAiZGFpLWxpbmsiKTsKKwogCS8qIFRoZSBvZmYtY29kZWMgd2lkZ2V0cyAqLwogCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobm9kZSwgUFJFRklYICJ3aWRnZXRzIikpIHsKIAkJcmV0ID0gc25kX3NvY19vZl9wYXJzZV9hdWRpb19zaW1wbGVfd2lkZ2V0cygmcHJpdi0+c25kX2NhcmQsCiAJCQkJCVBSRUZJWCAid2lkZ2V0cyIpOwogCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gY2FyZF9wYXJzZV9lbmQ7CiAJfQogCiAJLyogREFQTSByb3V0ZXMgKi8KQEAgLTQ0MCwxNiArMzczLDE0IEBACiAJCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfYXVkaW9fcm91dGluZygmcHJpdi0+c25kX2NhcmQsCiAJCQkJCVBSRUZJWCAicm91dGluZyIpOwogCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gY2FyZF9wYXJzZV9lbmQ7CiAJfQogCiAJLyogRmFjdG9yIHRvIG1jbGssIHVzZWQgaW4gaHdfcGFyYW1zKCkgKi8KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCBQUkVGSVggIm1jbGstZnMiLCAmdmFsKTsKLQlpZiAocmV0ID09IDApCi0JCXByaXYtPm1jbGtfZnMgPSB2YWw7CisJb2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgUFJFRklYICJtY2xrLWZzIiwgJnByaXYtPm1jbGtfZnMpOwogCiAJLyogU2luZ2xlL011dGkgREFJIGxpbmsocykgJiBOZXcgc3R5bGUgb2YgRFQgbm9kZSAqLwotCWlmIChvZl9nZXRfY2hpbGRfYnlfbmFtZShub2RlLCBQUkVGSVggImRhaS1saW5rIikpIHsKKwlpZiAoZGFpX2xpbmspIHsKIAkJc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7CiAJCWludCBpID0gMDsKIApAQCAtNDU5LDcgKzM5MCw3IEBACiAJCQkJCQkJICAgaSwgZmFsc2UpOwogCQkJaWYgKHJldCA8IDApIHsKIAkJCQlvZl9ub2RlX3B1dChucCk7Ci0JCQkJcmV0dXJuIHJldDsKKwkJCQlnb3RvIGNhcmRfcGFyc2VfZW5kOwogCQkJfQogCQkJaSsrOwogCQl9CkBAIC00NjcsNjYgKzM5OCw1NSBAQAogCQkvKiBGb3Igc2luZ2xlIERBSSBsaW5rICYgb2xkIHN0eWxlIG9mIERUIG5vZGUgKi8KIAkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9kYWlfbGlua19vZihub2RlLCBwcml2LCAwLCB0cnVlKTsKIAkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQkJZ290byBjYXJkX3BhcnNlX2VuZDsKIAl9CiAKIAlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2NhcmRfbmFtZSgmcHJpdi0+c25kX2NhcmQsIFBSRUZJWCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBjYXJkX3BhcnNlX2VuZDsKIAotCXJldHVybiAwOwotfQorCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfYXV4X2RldnMobm9kZSwgcHJpdik7CiAKLS8qIERlY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGRldmljZSBub2RlcyAqLwotc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3VucmVmKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rOwotCWludCBudW1fbGlua3M7CitjYXJkX3BhcnNlX2VuZDoKKwlvZl9ub2RlX3B1dChkYWlfbGluayk7CiAKLQlmb3IgKG51bV9saW5rcyA9IDAsIGRhaV9saW5rID0gY2FyZC0+ZGFpX2xpbms7Ci0JICAgICBudW1fbGlua3MgPCBjYXJkLT5udW1fbGlua3M7Ci0JICAgICBudW1fbGlua3MrKywgZGFpX2xpbmsrKykgewotCQlvZl9ub2RlX3B1dChkYWlfbGluay0+Y3B1X29mX25vZGUpOwotCQlvZl9ub2RlX3B1dChkYWlfbGluay0+Y29kZWNfb2Zfbm9kZSk7Ci0JfQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXNvY19zaW1wbGVfY2FyZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzaW1wbGVfY2FyZF9kYXRhICpwcml2OwogCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKKwlzdHJ1Y3Qgc2ltcGxlX2RhaV9wcm9wcyAqZGFpX3Byb3BzOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCWludCBudW1fbGlua3MsIHJldDsKKwlpbnQgbnVtLCByZXQ7CiAKIAkvKiBHZXQgdGhlIG51bWJlciBvZiBEQUkgbGlua3MgKi8KIAlpZiAobnAgJiYgb2ZfZ2V0X2NoaWxkX2J5X25hbWUobnAsIFBSRUZJWCAiZGFpLWxpbmsiKSkKLQkJbnVtX2xpbmtzID0gb2ZfZ2V0X2NoaWxkX2NvdW50KG5wKTsKKwkJbnVtID0gb2ZfZ2V0X2NoaWxkX2NvdW50KG5wKTsKIAllbHNlCi0JCW51bV9saW5rcyA9IDE7CisJCW51bSA9IDE7CiAKIAkvKiBBbGxvY2F0ZSB0aGUgcHJpdmF0ZSBkYXRhIGFuZCB0aGUgREFJIGxpbmsgYXJyYXkgKi8KLQlwcml2ID0gZGV2bV9remFsbG9jKGRldiwKLQkJCXNpemVvZigqcHJpdikgKyBzaXplb2YoKmRhaV9saW5rKSAqIG51bV9saW5rcywKLQkJCUdGUF9LRVJORUwpOworCXByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JLyogSW5pdCBzbmRfc29jX2NhcmQgKi8KLQlwcml2LT5zbmRfY2FyZC5vd25lciA9IFRISVNfTU9EVUxFOwotCXByaXYtPnNuZF9jYXJkLmRldiA9IGRldjsKLQlkYWlfbGluayA9IHByaXYtPmRhaV9saW5rOwotCXByaXYtPnNuZF9jYXJkLmRhaV9saW5rID0gZGFpX2xpbms7Ci0JcHJpdi0+c25kX2NhcmQubnVtX2xpbmtzID0gbnVtX2xpbmtzOwotCi0JLyogR2V0IHJvb20gZm9yIHRoZSBvdGhlciBwcm9wZXJ0aWVzICovCi0JcHJpdi0+ZGFpX3Byb3BzID0gZGV2bV9remFsbG9jKGRldiwKLQkJCXNpemVvZigqcHJpdi0+ZGFpX3Byb3BzKSAqIG51bV9saW5rcywKLQkJCUdGUF9LRVJORUwpOwotCWlmICghcHJpdi0+ZGFpX3Byb3BzKQorCWRhaV9wcm9wcyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGFpX3Byb3BzKSAqIG51bSwgR0ZQX0tFUk5FTCk7CisJZGFpX2xpbmsgID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkYWlfbGluaykgICogbnVtLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhaV9wcm9wcyB8fCAhZGFpX2xpbmspCiAJCXJldHVybiAtRU5PTUVNOwogCisJcHJpdi0+ZGFpX3Byb3BzCQkJPSBkYWlfcHJvcHM7CisJcHJpdi0+ZGFpX2xpbmsJCQk9IGRhaV9saW5rOworCisJLyogSW5pdCBzbmRfc29jX2NhcmQgKi8KKwlwcml2LT5zbmRfY2FyZC5vd25lcgkJPSBUSElTX01PRFVMRTsKKwlwcml2LT5zbmRfY2FyZC5kZXYJCT0gZGV2OworCXByaXYtPnNuZF9jYXJkLmRhaV9saW5rCQk9IHByaXYtPmRhaV9saW5rOworCXByaXYtPnNuZF9jYXJkLm51bV9saW5rcwk9IG51bTsKKwogCWlmIChucCAmJiBvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKG5wKSkgewogCiAJCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2Vfb2YobnAsIHByaXYpOwpAQCAtNTY3LDcgKzQ4Nyw2IEBACiAJCQkJCXNpemVvZihwcml2LT5kYWlfcHJvcHMtPmNwdV9kYWkpKTsKIAkJbWVtY3B5KCZwcml2LT5kYWlfcHJvcHMtPmNvZGVjX2RhaSwgJmNpbmZvLT5jb2RlY19kYWksCiAJCQkJCXNpemVvZihwcml2LT5kYWlfcHJvcHMtPmNvZGVjX2RhaSkpOwotCiAJfQogCiAJc25kX3NvY19jYXJkX3NldF9kcnZkYXRhKCZwcml2LT5zbmRfY2FyZCwgcHJpdik7CkBAIC01NzUsOSArNDk0LDkgQEAKIAlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCAmcHJpdi0+c25kX2NhcmQpOwogCWlmIChyZXQgPj0gMCkKIAkJcmV0dXJuIHJldDsKLQogZXJyOgotCWFzb2Nfc2ltcGxlX2NhcmRfdW5yZWYoJnByaXYtPnNuZF9jYXJkKTsKKwlhc29jX3NpbXBsZV9jYXJkX2NsZWFuX3JlZmVyZW5jZSgmcHJpdi0+c25kX2NhcmQpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTg5LDcgKzUwOCw3IEBACiAJYXNvY19zaW1wbGVfY2FyZF9yZW1vdmVfamFjaygmcHJpdi0+aHBfamFjayk7CiAJYXNvY19zaW1wbGVfY2FyZF9yZW1vdmVfamFjaygmcHJpdi0+bWljX2phY2spOwogCi0JcmV0dXJuIGFzb2Nfc2ltcGxlX2NhcmRfdW5yZWYoY2FyZCk7CisJcmV0dXJuIGFzb2Nfc2ltcGxlX2NhcmRfY2xlYW5fcmVmZXJlbmNlKGNhcmQpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhc29jX3NpbXBsZV9vZl9tYXRjaFtdID0gewpAQCAtNjExLDYgKzUzMCw2IEBACiBtb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGFzb2Nfc2ltcGxlX2NhcmQpOwogCiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmFzb2Mtc2ltcGxlLWNhcmQiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQVNvQyBTaW1wbGUgU291bmQgQ2FyZCIpOwogTU9EVUxFX0FVVEhPUigiS3VuaW5vcmkgTW9yaW1vdG8gPGt1bmlub3JpLm1vcmltb3RvLmd4QHJlbmVzYXMuY29tPiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLXNjdS1jYXJkLmMgYi9zb3VuZC9zb2MvZ2VuZXJpYy9zaW1wbGUtc2N1LWNhcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTk3M2E1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLXNjdS1jYXJkLmMKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBBU29DIHNpbXBsZSBTQ1Ugc291bmQgY2FyZCBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFJlbmVzYXMgU29sdXRpb25zIENvcnAuCisgKiBLdW5pbm9yaSBNb3JpbW90byA8a3VuaW5vcmkubW9yaW1vdG8uZ3hAcmVuZXNhcy5jb20+CisgKgorICogYmFzZWQgb24gJHtMSU5VWH0vc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLWNhcmQuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFpLmg+CisjaW5jbHVkZSA8c291bmQvc2ltcGxlX2NhcmRfdXRpbHMuaD4KKworc3RydWN0IGFzb2Nfc2ltcGxlX2NhcmRfcHJpdiB7CisJc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfY2FyZDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19jb25mIGNvZGVjX2NvbmY7CisJc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqZGFpX3Byb3BzOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKKwl1MzIgY29udmVydF9yYXRlOworCXUzMiBjb252ZXJ0X2NoYW5uZWxzOworfTsKKworI2RlZmluZSBzaW1wbGVfcHJpdl90b19kZXYocHJpdikgKChwcml2KS0+c25kX2NhcmQuZGV2KQorI2RlZmluZSBzaW1wbGVfcHJpdl90b19saW5rKHByaXYsIGkpICgocHJpdiktPnNuZF9jYXJkLmRhaV9saW5rICsgKGkpKQorI2RlZmluZSBzaW1wbGVfcHJpdl90b19wcm9wcyhwcml2LCBpKSAoKHByaXYpLT5kYWlfcHJvcHMgKyAoaSkpCisKKyNkZWZpbmUgREFJCSJzb3VuZC1kYWkiCisjZGVmaW5lIENFTEwJIiNzb3VuZC1kYWktY2VsbHMiCisjZGVmaW5lIFBSRUZJWAkic2ltcGxlLWF1ZGlvLWNhcmQsIgorCitzdGF0aWMgaW50IGFzb2Nfc2ltcGxlX2NhcmRfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGFzb2Nfc2ltcGxlX2NhcmRfcHJpdiAqcHJpdiA9CXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydGQtPmNhcmQpOworCXN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKmRhaV9wcm9wcyA9CisJCXNpbXBsZV9wcml2X3RvX3Byb3BzKHByaXYsIHJ0ZC0+bnVtKTsKKworCXJldHVybiBjbGtfcHJlcGFyZV9lbmFibGUoZGFpX3Byb3BzLT5jbGspOworfQorCitzdGF0aWMgdm9pZCBhc29jX3NpbXBsZV9jYXJkX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXNvY19zaW1wbGVfY2FyZF9wcml2ICpwcml2ID0Jc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7CisJc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqZGFpX3Byb3BzID0KKwkJc2ltcGxlX3ByaXZfdG9fcHJvcHMocHJpdiwgcnRkLT5udW0pOworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhaV9wcm9wcy0+Y2xrKTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBhc29jX3NpbXBsZV9jYXJkX29wcyA9IHsKKwkuc3RhcnR1cCA9IGFzb2Nfc2ltcGxlX2NhcmRfc3RhcnR1cCwKKwkuc2h1dGRvd24gPSBhc29jX3NpbXBsZV9jYXJkX3NodXRkb3duLAorfTsKKworc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IGFzb2Nfc2ltcGxlX2NhcmRfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydGQtPmNhcmQpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKKwlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpkYWlfcHJvcHM7CisJaW50IG51bSA9IHJ0ZC0+bnVtOworCisJZGFpX2xpbmsJPSBzaW1wbGVfcHJpdl90b19saW5rKHByaXYsIG51bSk7CisJZGFpX3Byb3BzCT0gc2ltcGxlX3ByaXZfdG9fcHJvcHMocHJpdiwgbnVtKTsKKwlkYWkJCT0gZGFpX2xpbmstPmR5bmFtaWMgPworCQkJCXJ0ZC0+Y3B1X2RhaSA6CisJCQkJcnRkLT5jb2RlY19kYWk7CisKKwlyZXR1cm4gYXNvY19zaW1wbGVfY2FyZF9pbml0X2RhaShkYWksIGRhaV9wcm9wcyk7Cit9CisKK3N0YXRpYyBpbnQgYXNvY19zaW1wbGVfY2FyZF9iZV9od19wYXJhbXNfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGFzb2Nfc2ltcGxlX2NhcmRfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydGQtPmNhcmQpOworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCQkgICAgICBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMpOworCisJaWYgKHByaXYtPmNvbnZlcnRfcmF0ZSkKKwkJcmF0ZS0+bWluID0KKwkJcmF0ZS0+bWF4ID0gcHJpdi0+Y29udmVydF9yYXRlOworCisJaWYgKHByaXYtPmNvbnZlcnRfY2hhbm5lbHMpCisJCWNoYW5uZWxzLT5taW4gPQorCQljaGFubmVscy0+bWF4ID0gcHJpdi0+Y29udmVydF9jaGFubmVsczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfbGlua3Moc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJc3RydWN0IGFzb2Nfc2ltcGxlX2NhcmRfcHJpdiAqcHJpdiwKKwkJCQkJdW5zaWduZWQgaW50IGRhaWZtdCwKKwkJCQkJaW50IGlkeCwgYm9vbCBpc19mZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBzaW1wbGVfcHJpdl90b19kZXYocHJpdik7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gc2ltcGxlX3ByaXZfdG9fbGluayhwcml2LCBpZHgpOworCXN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKmRhaV9wcm9wcyA9IHNpbXBsZV9wcml2X3RvX3Byb3BzKHByaXYsIGlkeCk7CisJaW50IHJldDsKKworCWlmIChpc19mZSkgeworCQlpbnQgaXNfc2luZ2xlX2xpbmtzID0gMDsKKworCQkvKiBCRSBpcyBkdW1teSAqLworCQlkYWlfbGluay0+Y29kZWNfb2Zfbm9kZQkJPSBOVUxMOworCQlkYWlfbGluay0+Y29kZWNfZGFpX25hbWUJPSAic25kLXNvYy1kdW1teS1kYWkiOworCQlkYWlfbGluay0+Y29kZWNfbmFtZQkJPSAic25kLXNvYy1kdW1teSI7CisKKwkJLyogRkUgc2V0dGluZ3MgKi8KKwkJZGFpX2xpbmstPmR5bmFtaWMJCT0gMTsKKwkJZGFpX2xpbmstPmRwY21fbWVyZ2VkX2Zvcm1hdAk9IDE7CisKKwkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9jcHUobnAsIGRhaV9saW5rLCBEQUksIENFTEwsCisJCQkJCQkgJmlzX3NpbmdsZV9saW5rcyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2xrX2NwdShucCwgZGFpX2xpbmssIGRhaV9wcm9wcyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3NldF9kYWlsaW5rX25hbWUoZGV2LCBkYWlfbGluaywKKwkJCQkJCQkiZmUuJXMiLAorCQkJCQkJCWRhaV9saW5rLT5jcHVfZGFpX25hbWUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJYXNvY19zaW1wbGVfY2FyZF9jYW5vbmljYWxpemVfY3B1KGRhaV9saW5rLCBpc19zaW5nbGVfbGlua3MpOworCX0gZWxzZSB7CisJCS8qIEZFIGlzIGR1bW15ICovCisJCWRhaV9saW5rLT5jcHVfb2Zfbm9kZQkJPSBOVUxMOworCQlkYWlfbGluay0+Y3B1X2RhaV9uYW1lCQk9ICJzbmQtc29jLWR1bW15LWRhaSI7CisJCWRhaV9saW5rLT5jcHVfbmFtZQkJPSAic25kLXNvYy1kdW1teSI7CisKKwkJLyogQkUgc2V0dGluZ3MgKi8KKwkJZGFpX2xpbmstPm5vX3BjbQkJPSAxOworCQlkYWlfbGluay0+YmVfaHdfcGFyYW1zX2ZpeHVwCT0gYXNvY19zaW1wbGVfY2FyZF9iZV9od19wYXJhbXNfZml4dXA7CisKKwkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9jb2RlYyhucCwgZGFpX2xpbmssIERBSSwgQ0VMTCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2Nsa19jb2RlYyhucCwgZGFpX2xpbmssIGRhaV9wcm9wcyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3NldF9kYWlsaW5rX25hbWUoZGV2LCBkYWlfbGluaywKKwkJCQkJCQkiYmUuJXMiLAorCQkJCQkJCWRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3ByZWZpeCgmcHJpdi0+c25kX2NhcmQsCisJCQkJCSAgICAgICZwcml2LT5jb2RlY19jb25mLAorCQkJCQkgICAgICBkYWlfbGluay0+Y29kZWNfb2Zfbm9kZSwKKwkJCQkJICAgICAgUFJFRklYICJwcmVmaXgiKTsKKwl9CisKKwlyZXQgPSBzbmRfc29jX29mX3BhcnNlX3RkbV9zbG90KG5wLAorCQkJCQkmZGFpX3Byb3BzLT50eF9zbG90X21hc2ssCisJCQkJCSZkYWlfcHJvcHMtPnJ4X3Nsb3RfbWFzaywKKwkJCQkJJmRhaV9wcm9wcy0+c2xvdHMsCisJCQkJCSZkYWlfcHJvcHMtPnNsb3Rfd2lkdGgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX2Nhbm9uaWNhbGl6ZV9kYWlsaW5rKGRhaV9saW5rKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWRhaV9saW5rLT5kYWlfZm10CQk9IGRhaWZtdDsKKwlkYWlfbGluay0+ZHBjbV9wbGF5YmFjawkJPSAxOworCWRhaV9saW5rLT5kcGNtX2NhcHR1cmUJCT0gMTsKKwlkYWlfbGluay0+b3BzCQkJPSAmYXNvY19zaW1wbGVfY2FyZF9vcHM7CisJZGFpX2xpbmstPmluaXQJCQk9IGFzb2Nfc2ltcGxlX2NhcmRfZGFpX2luaXQ7CisKKwlkZXZfZGJnKGRldiwgIlx0JXMgLyAlMDR4IC8gJWRcbiIsCisJCWRhaV9saW5rLT5uYW1lLAorCQlkYWlfbGluay0+ZGFpX2ZtdCwKKwkJZGFpX3Byb3BzLT5zeXNjbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXNvY19zaW1wbGVfY2FyZF9kYWlfbGlua19vZihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJIHN0cnVjdCBhc29jX3NpbXBsZV9jYXJkX3ByaXYgKnByaXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gc2ltcGxlX3ByaXZfdG9fZGV2KHByaXYpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdW5zaWduZWQgaW50IGRhaWZtdCA9IDA7CisJaW50IHJldCwgaTsKKwlib29sIGlzX2ZlOworCisJLyogZmluZCAxc3QgY29kZWMgKi8KKwlucCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5vZGUsIFBSRUZJWCAiY29kZWMiKTsKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfZGFpZm10KGRldiwgbm9kZSwgbnAsCisJCQkJCSAgICBQUkVGSVgsICZkYWlmbXQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaSA9IDA7CisJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShub2RlLCBucCkgeworCQlpc19mZSA9IGZhbHNlOworCQlpZiAoc3RyY21wKG5wLT5uYW1lLCBQUkVGSVggImNwdSIpID09IDApCisJCQlpc19mZSA9IHRydWU7CisKKwkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9saW5rcyhucCwgcHJpdiwgZGFpZm10LCBpLCBpc19mZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaSsrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2Vfb2Yoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJICAgICAgc3RydWN0IGFzb2Nfc2ltcGxlX2NhcmRfcHJpdiAqcHJpdiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpwcm9wczsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqbGlua3M7CisJaW50IHJldDsKKwlpbnQgbnVtOworCisJaWYgKCFub2RlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW51bSA9IG9mX2dldF9jaGlsZF9jb3VudChub2RlKTsKKwlwcm9wcyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcHJvcHMpICogbnVtLCBHRlBfS0VSTkVMKTsKKwlsaW5rcyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbGlua3MpICogbnVtLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByb3BzIHx8ICFsaW5rcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcml2LT5kYWlfcHJvcHMJPSBwcm9wczsKKwlwcml2LT5kYWlfbGluawk9IGxpbmtzOworCisJLyogSW5pdCBzbmRfc29jX2NhcmQgKi8KKwlwcml2LT5zbmRfY2FyZC5vd25lcgkJCT0gVEhJU19NT0RVTEU7CisJcHJpdi0+c25kX2NhcmQuZGV2CQkJPSBkZXY7CisJcHJpdi0+c25kX2NhcmQuZGFpX2xpbmsJCQk9IHByaXYtPmRhaV9saW5rOworCXByaXYtPnNuZF9jYXJkLm51bV9saW5rcwkJPSBudW07CisJcHJpdi0+c25kX2NhcmQuY29kZWNfY29uZgkJPSAmcHJpdi0+Y29kZWNfY29uZjsKKwlwcml2LT5zbmRfY2FyZC5udW1fY29uZmlncwkJPSAxOworCisJcmV0ID0gc25kX3NvY19vZl9wYXJzZV9hdWRpb19yb3V0aW5nKCZwcml2LT5zbmRfY2FyZCwgUFJFRklYICJyb3V0aW5nIik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBzYW1wbGluZyByYXRlIGNvbnZlcnQgKi8KKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCBQUkVGSVggImNvbnZlcnQtcmF0ZSIsICZwcml2LT5jb252ZXJ0X3JhdGUpOworCisJLyogY2hhbm5lbHMgdHJhbnNmZXIgKi8KKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCBQUkVGSVggImNvbnZlcnQtY2hhbm5lbHMiLCAmcHJpdi0+Y29udmVydF9jaGFubmVscyk7CisKKwlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX2RhaV9saW5rX29mKG5vZGUsIHByaXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9jYXJkX25hbWUoJnByaXYtPnNuZF9jYXJkLCBQUkVGSVgpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZGV2X2RiZyhkZXYsICJOZXcgY2FyZDogJXNcbiIsCisJCXByaXYtPnNuZF9jYXJkLm5hbWUgPyBwcml2LT5zbmRfY2FyZC5uYW1lIDogIiIpOworCWRldl9kYmcoZGV2LCAiY29udmVydF9yYXRlICAgICAlZFxuIiwgcHJpdi0+Y29udmVydF9yYXRlKTsKKwlkZXZfZGJnKGRldiwgImNvbnZlcnRfY2hhbm5lbHMgJWRcbiIsIHByaXYtPmNvbnZlcnRfY2hhbm5lbHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXNvY19zaW1wbGVfY2FyZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhc29jX3NpbXBsZV9jYXJkX3ByaXYgKnByaXY7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJaW50IHJldDsKKworCS8qIEFsbG9jYXRlIHRoZSBwcml2YXRlIGRhdGEgKi8KKwlwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2Vfb2YobnAsIHByaXYsIGRldik7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKHJldCAhPSAtRVBST0JFX0RFRkVSKQorCQkJZGV2X2VycihkZXYsICJwYXJzZSBlcnJvciAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJc25kX3NvY19jYXJkX3NldF9kcnZkYXRhKCZwcml2LT5zbmRfY2FyZCwgcHJpdik7CisKKwlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCAmcHJpdi0+c25kX2NhcmQpOworCWlmIChyZXQgPj0gMCkKKwkJcmV0dXJuIHJldDsKK2VycjoKKwlhc29jX3NpbXBsZV9jYXJkX2NsZWFuX3JlZmVyZW5jZSgmcHJpdi0+c25kX2NhcmQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJldHVybiBhc29jX3NpbXBsZV9jYXJkX2NsZWFuX3JlZmVyZW5jZShjYXJkKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXNvY19zaW1wbGVfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscnNyYy1jYXJkIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInNpbXBsZS1zY3UtYXVkaW8tY2FyZCIsIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYXNvY19zaW1wbGVfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhc29jX3NpbXBsZV9jYXJkID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInNpbXBsZS1zY3UtYXVkaW8tY2FyZCIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGFzb2Nfc2ltcGxlX29mX21hdGNoLAorCX0sCisJLnByb2JlID0gYXNvY19zaW1wbGVfY2FyZF9wcm9iZSwKKwkucmVtb3ZlID0gYXNvY19zaW1wbGVfY2FyZF9yZW1vdmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGFzb2Nfc2ltcGxlX2NhcmQpOworCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmFzb2Mtc2ltcGxlLXNjdS1jYXJkIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgU2ltcGxlIFNDVSBTb3VuZCBDYXJkIik7CitNT0RVTEVfQVVUSE9SKCJLdW5pbm9yaSBNb3JpbW90byA8a3VuaW5vcmkubW9yaW1vdG8uZ3hAcmVuZXNhcy5jb20+Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW1nL3Bpc3RhY2hpby1pbnRlcm5hbC1kYWMuYyBiL3NvdW5kL3NvYy9pbWcvcGlzdGFjaGlvLWludGVybmFsLWRhYy5jCmluZGV4IDE2MmEwZmQuLjUzZTExYzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbWcvcGlzdGFjaGlvLWludGVybmFsLWRhYy5jCisrKyBiL3NvdW5kL3NvYy9pbWcvcGlzdGFjaGlvLWludGVybmFsLWRhYy5jCkBAIC0xMzQsMTIgKzEzNCwxNCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBwaXN0YWNoaW9faW50ZXJuYWxfZGFjX2RyaXZlciA9IHsKIAkucHJvYmUgPSBwaXN0YWNoaW9faW50ZXJuYWxfZGFjX2NvZGVjX3Byb2JlLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKLQkuY29udHJvbHMgPSBwaXN0YWNoaW9faW50ZXJuYWxfZGFjX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShwaXN0YWNoaW9faW50ZXJuYWxfZGFjX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHBpc3RhY2hpb19pbnRlcm5hbF9kYWNfd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocGlzdGFjaGlvX2ludGVybmFsX2RhY193aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBwaXN0YWNoaW9faW50ZXJuYWxfZGFjX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShwaXN0YWNoaW9faW50ZXJuYWxfZGFjX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBwaXN0YWNoaW9faW50ZXJuYWxfZGFjX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHBpc3RhY2hpb19pbnRlcm5hbF9kYWNfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBwaXN0YWNoaW9faW50ZXJuYWxfZGFjX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShwaXN0YWNoaW9faW50ZXJuYWxfZGFjX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcGlzdGFjaGlvX2ludGVybmFsX2RhY19yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHBpc3RhY2hpb19pbnRlcm5hbF9kYWNfcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBwaXN0YWNoaW9faW50ZXJuYWxfZGFjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvS2NvbmZpZyBiL3NvdW5kL3NvYy9pbnRlbC9LY29uZmlnCmluZGV4IGEyMGMzZGYuLjI2ZWI1YTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9LY29uZmlnCkBAIC0yNSw2ICsyNSw3IEBACiAJdHJpc3RhdGUKIAlzZWxlY3QgU05EX1NTVF9JUEMKIAlzZWxlY3QgU05EX1NPQ19JTlRFTF9TU1QKKwlzZWxlY3QgSU9TRl9NQkkKIAogY29uZmlnIFNORF9TT0NfSU5URUxfU1NUCiAJdHJpc3RhdGUKQEAgLTEyMCw2ICsxMjEsMTcgQEAKIAkgIFRoaXMgYWRkcyBhdWRpbyBkcml2ZXIgZm9yIEludGVsIEJheXRyYWlsIHBsYXRmb3JtIGJhc2VkIGJvYXJkcwogCSAgd2l0aCB0aGUgTUFYOTgwOTAgYXVkaW8gY29kZWMuCiAKK2NvbmZpZyBTTkRfU09DX0lOVEVMX0JEV19SVDU2NzdfTUFDSAorCXRyaXN0YXRlICJBU29DIEF1ZGlvIGRyaXZlciBmb3IgSW50ZWwgQnJvYWR3ZWxsIHdpdGggUlQ1Njc3IGNvZGVjIgorCWRlcGVuZHMgb24gWDg2X0lOVEVMX0xQU1MgJiYgR1BJT0xJQiAmJiBJMkMgJiYgRFdfRE1BQworCWRlcGVuZHMgb24gRFdfRE1BQ19DT1JFPXkKKwlzZWxlY3QgU05EX1NPQ19JTlRFTF9TU1QKKwlzZWxlY3QgU05EX1NPQ19JTlRFTF9IQVNXRUxMCisJc2VsZWN0IFNORF9TT0NfUlQ1Njc3CisJaGVscAorCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIEludGVsIEJyb2Fkd2VsbCBwbGF0Zm9ybSBiYXNlZCBib2FyZHMgd2l0aAorCSAgdGhlIFJUNTY3NyBhdWRpbyBjb2RlYy4KKwogY29uZmlnIFNORF9TT0NfSU5URUxfQlJPQURXRUxMX01BQ0gKIAl0cmlzdGF0ZSAiQVNvQyBBdWRpbyBEU1Agc3VwcG9ydCBmb3IgSW50ZWwgQnJvYWR3ZWxsIFdpbGRjYXRwb2ludCIKIAlkZXBlbmRzIG9uIFg4Nl9JTlRFTF9MUFNTICYmIEkyQyAmJiBEV19ETUFDICYmIFwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC1hdG9tLWNvbnRyb2xzLmMgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtYXRvbS1jb250cm9scy5jCmluZGV4IDk4NzIwYTkuLjA4Mzg0NzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC1hdG9tLWNvbnRyb2xzLmMKKysrIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0LWF0b20tY29udHJvbHMuYwpAQCAtMSw0ICsxLDQgQEAKLS8qCisgLyoKICAqICBzc3QtYXRvbS1jb250cm9scy5jIC0gSW50ZWwgTUlEIFBsYXRmb3JtIGRyaXZlciBEUENNIEFMU0EgY29udHJvbHMgZm9yIE1yZmxkCiAgKgogICogIENvcHlyaWdodCAoQykgMjAxMy0xNCBJbnRlbCBDb3JwCkBAIC01MzQsNiArNTM0LDcgQEAKIAogLyogTG9vayB1cCB0YWJsZSB0byBjb252ZXJ0IE1JWEVSIFNXIGJpdCByZWdzIHRvIFNXTSBpbnB1dHMgKi8KIHN0YXRpYyBjb25zdCB1aW50IHN3bV9taXhlcl9pbnB1dF9pZHNbU1NUX1NXTV9JTlBVVF9DT1VOVF0gPSB7CisJW1NTVF9JUF9NT0RFTV0JCT0gU1NUX1NXTV9JTl9NT0RFTSwKIAlbU1NUX0lQX0NPREVDMF0JCT0gU1NUX1NXTV9JTl9DT0RFQzAsCiAJW1NTVF9JUF9DT0RFQzFdCQk9IFNTVF9TV01fSU5fQ09ERUMxLAogCVtTU1RfSVBfTE9PUDBdCQk9IFNTVF9TV01fSU5fU1BST1RfTE9PUCwKQEAgLTY3NCw2ICs2NzUsNyBAQAogLyogU0JBIG1peGVycyAtIDE2IGlucHV0cyAqLwogI2RlZmluZSBTU1RfU0JBX0RFQ0xBUkVfTUlYX0NPTlRST0xTKGtjdGxfbmFtZSkJCQkJCQkJXAogCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBrY3RsX25hbWVbXSA9IHsJCQkJCVwKKwkJU09DX0RBUE1fU0lOR0xFKCJtb2RlbV9pbiBTd2l0Y2giLCBTTkRfU09DX05PUE0sIFNTVF9JUF9NT0RFTSwgMSwgMCksCQlcCiAJCVNPQ19EQVBNX1NJTkdMRSgiY29kZWNfaW4wIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgU1NUX0lQX0NPREVDMCwgMSwgMCksCQlcCiAJCVNPQ19EQVBNX1NJTkdMRSgiY29kZWNfaW4xIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgU1NUX0lQX0NPREVDMSwgMSwgMCksCQlcCiAJCVNPQ19EQVBNX1NJTkdMRSgic3Byb3RfbG9vcF9pbiBTd2l0Y2giLCBTTkRfU09DX05PUE0sIFNTVF9JUF9MT09QMCwgMSwgMCksCVwKQEAgLTY4NCw2ICs2ODYsNyBAQAogCX0KIAogI2RlZmluZSBTU1RfU0JBX01JWEVSX0dSQVBIX01BUChtaXhfbmFtZSkJCQlcCisJeyBtaXhfbmFtZSwgIm1vZGVtX2luIFN3aXRjaCIsCSJtb2RlbV9pbiIgfSwJCVwKIAl7IG1peF9uYW1lLCAiY29kZWNfaW4wIFN3aXRjaCIsCSJjb2RlY19pbjAiIH0sCQlcCiAJeyBtaXhfbmFtZSwgImNvZGVjX2luMSBTd2l0Y2giLAkiY29kZWNfaW4xIiB9LAkJXAogCXsgbWl4X25hbWUsICJzcHJvdF9sb29wX2luIFN3aXRjaCIsCSJzcHJvdF9sb29wX2luIiB9LAlcCkBAIC03MTMsNiArNzE2LDcgQEAKIFNTVF9TQkFfREVDTEFSRV9NSVhfQ09OVFJPTFMoc3N0X21peF92b2lwX2NvbnRyb2xzKTsKIFNTVF9TQkFfREVDTEFSRV9NSVhfQ09OVFJPTFMoc3N0X21peF9jb2RlYzBfY29udHJvbHMpOwogU1NUX1NCQV9ERUNMQVJFX01JWF9DT05UUk9MUyhzc3RfbWl4X2NvZGVjMV9jb250cm9scyk7CitTU1RfU0JBX0RFQ0xBUkVfTUlYX0NPTlRST0xTKHNzdF9taXhfbW9kZW1fY29udHJvbHMpOwogCiAvKgogICogc3N0X2hhbmRsZV92Yl90aW1lciAtIFN0YXJ0L1N0b3AgdGhlIERTUCBzY2hlZHVsZXIKQEAgLTkzMSwxNyArOTM1LDI2IEBACiBpbnQgc2VuZF9zc3BfY21kKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBjb25zdCBjaGFyICppZCwgYm9vbCBlbmFibGUpCiB7CiAJc3RydWN0IHNzdF9kYXRhICpkcnYgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwotCWNvbnN0IHN0cnVjdCBzc3Rfc3NwX2NvbmZpZyAqY29uZmlnOworCWludCBzc3BfaWQ7CiAKIAlkZXZfaW5mbyhkYWktPmRldiwgIkVudGVyOiBlbmFibGU9JWQgcG9ydF9uYW1lPSVzXG4iLCBlbmFibGUsIGlkKTsKIAorCWlmIChzdHJjbXAoaWQsICJzc3AwLXBvcnQiKSA9PSAwKQorCQlzc3BfaWQgPSBTU1BfTU9ERU07CisJZWxzZSBpZiAoc3RyY21wKGlkLCAic3NwMi1wb3J0IikgPT0gMCkKKwkJc3NwX2lkID0gU1NQX0NPREVDOworCWVsc2UgeworCQlkZXZfZGJnKGRhaS0+ZGV2LCAicG9ydCAlcyBpcyBub3Qgc3VwcG9ydGVkXG4iLCBpZCk7CisJCXJldHVybiAtMTsKKwl9CisKIAlTU1RfRklMTF9ERUZBVUxUX0RFU1RJTkFUSU9OKGRydi0+c3NwX2NtZC5oZWFkZXIuZHN0KTsKIAlkcnYtPnNzcF9jbWQuaGVhZGVyLmNvbW1hbmRfaWQgPSBTQkFfSFdfU0VUX1NTUDsKIAlkcnYtPnNzcF9jbWQuaGVhZGVyLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc3N0X2NtZF9zYmFfaHdfc2V0X3NzcCkKIAkJCQktIHNpemVvZihzdHJ1Y3Qgc3N0X2RzcF9oZWFkZXIpOwogCi0JY29uZmlnID0gJnNzdF9zc3BfY29uZmlnczsKLQlkZXZfZGJnKGRhaS0+ZGV2LCAic3NwX2lkOiAldVxuIiwgY29uZmlnLT5zc3BfaWQpOworCWRydi0+c3NwX2NtZC5zZWxlY3Rpb24gPSBzc3BfaWQ7CisJZGV2X2RiZyhkYWktPmRldiwgInNzcF9pZDogJXVcbiIsIHNzcF9pZCk7CiAKIAlpZiAoZW5hYmxlKQogCQlkcnYtPnNzcF9jbWQuc3dpdGNoX3N0YXRlID0gU1NUX1NXSVRDSF9PTjsKQEAgLTEwNDcsOCArMTA2MCwxMCBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgc3N0X2RhcG1fd2lkZ2V0c1tdID0geworCVNTVF9BSUZfSU4oIm1vZGVtX2luIiwgc3N0X3NldF9iZV9tb2R1bGVzKSwKIAlTU1RfQUlGX0lOKCJjb2RlY19pbjAiLCBzc3Rfc2V0X2JlX21vZHVsZXMpLAogCVNTVF9BSUZfSU4oImNvZGVjX2luMSIsIHNzdF9zZXRfYmVfbW9kdWxlcyksCisJU1NUX0FJRl9PVVQoIm1vZGVtX291dCIsIHNzdF9zZXRfYmVfbW9kdWxlcyksCiAJU1NUX0FJRl9PVVQoImNvZGVjX291dDAiLCBzc3Rfc2V0X2JlX21vZHVsZXMpLAogCVNTVF9BSUZfT1VUKCJjb2RlY19vdXQxIiwgc3N0X3NldF9iZV9tb2R1bGVzKSwKIApAQCAtMTEwMyw2ICsxMTE4LDkgQEAKIAkJICAgICAgc3N0X21peF9jb2RlYzBfY29udHJvbHMsIHNzdF9zd21fbWl4ZXJfZXZlbnQpLAogCVNTVF9TV01fTUlYRVIoImNvZGVjX291dDEgbWl4IDAiLCBTTkRfU09DX05PUE0sIFNTVF9UQVNLX1NCQSwgU1NUX1NXTV9PVVRfQ09ERUMxLAogCQkgICAgICBzc3RfbWl4X2NvZGVjMV9jb250cm9scywgc3N0X3N3bV9taXhlcl9ldmVudCksCisJU1NUX1NXTV9NSVhFUigibW9kZW1fb3V0IG1peCAwIiwgU05EX1NPQ19OT1BNLCBTU1RfVEFTS19TQkEsIFNTVF9TV01fT1VUX01PREVNLAorCQkgICAgICBzc3RfbWl4X21vZGVtX2NvbnRyb2xzLCBzc3Rfc3dtX21peGVyX2V2ZW50KSwKKwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgaW50ZXJjb25bXSA9IHsKQEAgLTExNDgsNiArMTE2Niw5IEBACiAJU1NUX1NCQV9NSVhFUl9HUkFQSF9NQVAoImNvZGVjX291dDAgbWl4IDAiKSwKIAl7ImNvZGVjX291dDEiLCBOVUxMLCAiY29kZWNfb3V0MSBtaXggMCJ9LAogCVNTVF9TQkFfTUlYRVJfR1JBUEhfTUFQKCJjb2RlY19vdXQxIG1peCAwIiksCisJeyJtb2RlbV9vdXQiLCBOVUxMLCAibW9kZW1fb3V0IG1peCAwIn0sCisJU1NUX1NCQV9NSVhFUl9HUkFQSF9NQVAoIm1vZGVtX291dCBtaXggMCIpLAorCiAKIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNsb3RfbmFtZXNbXSA9IHsKQEAgLTEyMTcsNiArMTIzOCw5IEBACiAJU1NUX0dBSU4oIm1lZGlhX2xvb3AyX291dCIsIFNTVF9QQVRIX0lOREVYX01FRElBX0xPT1AyX09VVCwgU1NUX1RBU0tfU0JBLCAwLCAmc3N0X2dhaW5zWzEzXSksCiAJU1NUX0dBSU4oInNwcm90X2xvb3Bfb3V0IiwgU1NUX1BBVEhfSU5ERVhfU1BST1RfTE9PUF9PVVQsIFNTVF9UQVNLX1NCQSwgMCwgJnNzdF9nYWluc1sxNF0pLAogCVNTVF9WT0xVTUUoIm1lZGlhMF9pbiIsIFNTVF9QQVRIX0lOREVYX01FRElBMF9JTiwgU1NUX1RBU0tfTU1YLCAwLCAmc3N0X2dhaW5zWzE1XSksCisJU1NUX0dBSU4oIm1vZGVtX2luIiwgU1NUX1BBVEhfSU5ERVhfTU9ERU1fSU4sIFNTVF9UQVNLX1NCQSwgMCwgJnNzdF9nYWluc1sxNl0pLAorCVNTVF9HQUlOKCJtb2RlbV9vdXQiLCBTU1RfUEFUSF9JTkRFWF9NT0RFTV9PVVQsIFNTVF9UQVNLX1NCQSwgMCwgJnNzdF9nYWluc1sxN10pLAorCiB9OwogCiAjZGVmaW5lIFNTVF9HQUlOX05VTV9DT05UUk9MUyAzCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtYXRvbS1jb250cm9scy5oIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0LWF0b20tY29udHJvbHMuaAppbmRleCBlMDExMzExLi4zNTFkODE0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtYXRvbS1jb250cm9scy5oCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC1hdG9tLWNvbnRyb2xzLmgKQEAgLTM1LDYgKzM1LDggQEAKIC8qIGRlZmluZSBhIGJpdCBmb3IgZWFjaCBtaXhlciBpbnB1dCAqLwogI2RlZmluZSBTU1RfTUlYX0lQKHgpCQkoeCkKIAorI2RlZmluZSBTU1RfSVBfTU9ERU0JCVNTVF9NSVhfSVAoMCkKKyNkZWZpbmUgU1NUX0lQX0JUCQlTU1RfTUlYX0lQKDEpCiAjZGVmaW5lIFNTVF9JUF9DT0RFQzAJCVNTVF9NSVhfSVAoMikKICNkZWZpbmUgU1NUX0lQX0NPREVDMQkJU1NUX01JWF9JUCgzKQogI2RlZmluZSBTU1RfSVBfTE9PUDAJCVNTVF9NSVhfSVAoNCkKQEAgLTYzLDYgKzY1LDcgQEAKICAqIEF1ZGlvIERTUCBQYXRoIElkcy4gU3BlY2lmaWVkIGJ5IHRoZSBhdWRpbyBEU1AgRlcKICAqLwogZW51bSBzc3RfcGF0aF9pbmRleCB7CisJU1NUX1BBVEhfSU5ERVhfTU9ERU1fT1VUICAgICAgICAgICAgICAgID0gKDB4MDAgPDwgU1NUX1BBVEhfSURfU0hJRlQpLAogCVNTVF9QQVRIX0lOREVYX0NPREVDX09VVDAgICAgICAgICAgICAgICA9ICgweDAyIDw8IFNTVF9QQVRIX0lEX1NISUZUKSwKIAlTU1RfUEFUSF9JTkRFWF9DT0RFQ19PVVQxICAgICAgICAgICAgICAgPSAoMHgwMyA8PCBTU1RfUEFUSF9JRF9TSElGVCksCiAKQEAgLTgwLDYgKzgzLDcgQEAKIAogCiAJLyogU3RhcnQgb2YgaW5wdXQgcGF0aHMgKi8KKwlTU1RfUEFUSF9JTkRFWF9NT0RFTV9JTiAgICAgICAgICAgICAgICAgPSAoMHg4MCA8PCBTU1RfUEFUSF9JRF9TSElGVCksCiAJU1NUX1BBVEhfSU5ERVhfQ09ERUNfSU4wICAgICAgICAgICAgICAgID0gKDB4ODIgPDwgU1NUX1BBVEhfSURfU0hJRlQpLAogCVNTVF9QQVRIX0lOREVYX0NPREVDX0lOMSAgICAgICAgICAgICAgICA9ICgweDgzIDw8IFNTVF9QQVRIX0lEX1NISUZUKSwKIApAQCAtMTA1LDYgKzEwOSw3IEBACiAgKiBwYXRoIElEcwogICovCiBlbnVtIHNzdF9zd21faW5wdXRzIHsKKwlTU1RfU1dNX0lOX01PREVNCT0gKFNTVF9QQVRIX0lOREVYX01PREVNX0lOCSAgfCBTU1RfREVGQVVMVF9DRUxMX05CUiksCiAJU1NUX1NXTV9JTl9DT0RFQzAJPSAoU1NUX1BBVEhfSU5ERVhfQ09ERUNfSU4wCSAgfCBTU1RfREVGQVVMVF9DRUxMX05CUiksCiAJU1NUX1NXTV9JTl9DT0RFQzEJPSAoU1NUX1BBVEhfSU5ERVhfQ09ERUNfSU4xCSAgfCBTU1RfREVGQVVMVF9DRUxMX05CUiksCiAJU1NUX1NXTV9JTl9TUFJPVF9MT09QCT0gKFNTVF9QQVRIX0lOREVYX1NQUk9UX0xPT1BfSU4JICB8IFNTVF9ERUZBVUxUX0NFTExfTkJSKSwKQEAgLTEyNCw2ICsxMjksNyBAQAogICogcGF0aCBJRHMKICAqLwogZW51bSBzc3Rfc3dtX291dHB1dHMgeworCVNTVF9TV01fT1VUX01PREVNCT0gKFNTVF9QQVRIX0lOREVYX01PREVNX09VVAkgIHwgU1NUX0RFRkFVTFRfQ0VMTF9OQlIpLAogCVNTVF9TV01fT1VUX0NPREVDMAk9IChTU1RfUEFUSF9JTkRFWF9DT0RFQ19PVVQwCSAgfCBTU1RfREVGQVVMVF9DRUxMX05CUiksCiAJU1NUX1NXTV9PVVRfQ09ERUMxCT0gKFNTVF9QQVRIX0lOREVYX0NPREVDX09VVDEJICB8IFNTVF9ERUZBVUxUX0NFTExfTkJSKSwKIAlTU1RfU1dNX09VVF9TUFJPVF9MT09QCT0gKFNTVF9QQVRIX0lOREVYX1NQUk9UX0xPT1BfT1VUICB8IFNTVF9ERUZBVUxUX0NFTExfTkJSKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC1tZmxkLXBsYXRmb3JtLXBjbS5jIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0LW1mbGQtcGxhdGZvcm0tcGNtLmMKaW5kZXggNTJlZDQzNC4uMjVjNmQ4NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0LW1mbGQtcGxhdGZvcm0tcGNtLmMKKysrIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0LW1mbGQtcGxhdGZvcm0tcGNtLmMKQEAgLTY3MCw3ICs2NzAsNyBAQAogCXJldHVybiBzdHJfaW5mby0+YnVmZmVyX3B0cjsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzc3RfcGxhdGZvcm1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzc3RfcGxhdGZvcm1fb3BzID0gewogCS5vcGVuID0gc3N0X3BsYXRmb3JtX29wZW4sCiAJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCiAJLnRyaWdnZXIgPSBzc3RfcGxhdGZvcm1fcGNtX3RyaWdnZXIsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0LmMgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0LmMKaW5kZXggYTRiNDU4ZS4uOWI2ZTI3MyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdC5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3QuYwpAQCAtMTkwLDcgKzE5MCw4IEBACiAKIAlkZWZhdWx0OgogCQlkZXZfZXJyKHNzdC0+ZGV2LAotCQkJIlNTVCBEcml2ZXIgY2FwYWJsaXRpZXMgbWlzc2luZyBmb3IgZGV2X2lkOiAleCIsIHNzdC0+ZGV2X2lkKTsKKwkJCSJTU1QgRHJpdmVyIGNhcGFiaWxpdGllcyBtaXNzaW5nIGZvciBkZXZfaWQ6ICV4IiwKKwkJCXNzdC0+ZGV2X2lkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfTsKIH0KQEAgLTQ0MSw3ICs0NDIsNyBAQAogCQlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbSA9ICZjdHgtPnN0cmVhbXNbaV07CiAKIAkJaWYgKHN0cmVhbS0+c3RhdHVzID09IFNUUkVBTV9SVU5OSU5HKSB7Ci0JCQlkZXZfZXJyKGRldiwgInN0cmVhbSAlZCBpcyBydW5uaW5nLCBjYW50IHN1c3VwZW5kLCBhYm9ydFxuIiwgaSk7CisJCQlkZXZfZXJyKGRldiwgInN0cmVhbSAlZCBpcyBydW5uaW5nLCBjYW4ndCBzdXNwZW5kLCBhYm9ydFxuIiwgaSk7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9hY3BpLmMgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0X2FjcGkuYwppbmRleCA0ZDMxODQ5Li5iYTVjMGQ3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0X2FjcGkuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0X2FjcGkuYwpAQCAtMzksNiArMzksOCBAQAogI2luY2x1ZGUgPGFjcGkvcGxhdGZvcm0vYWNsaW51eC5oPgogI2luY2x1ZGUgPGFjcGkvYWN0eXBlcy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KKyNpbmNsdWRlIDxhc20vY3B1X2RldmljZV9pZC5oPgorI2luY2x1ZGUgPGFzbS9pb3NmX21iaS5oPgogI2luY2x1ZGUgIi4uL3NzdC1tZmxkLXBsYXRmb3JtLmgiCiAjaW5jbHVkZSAiLi4vLi4vY29tbW9uL3NzdC1kc3AuaCIKICNpbmNsdWRlICIuLi8uLi9jb21tb24vc3N0LWFjcGkuaCIKQEAgLTExMyw2ICsxMTUsMjggQEAKIAkuYWNwaV9pcGNfaXJxX2luZGV4ID0gNSwKIH07CiAKKy8qIEJZVENSIGhhcyBkaWZmZXJlbnQgQklPUyBmcm9tIEJZVCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzc3RfcmVzX2luZm8gYnl0Y3JfcmVzX2luZm8gPSB7CisJLnNoaW1fb2Zmc2V0ID0gMHgxNDAwMDAsCisJLnNoaW1fc2l6ZSA9IDB4MDAwMTAwLAorCS5zaGltX3BoeV9hZGRyID0gU1NUX0JZVF9TSElNX1BIWV9BRERSLAorCS5zc3AwX29mZnNldCA9IDB4YTAwMDAsCisJLnNzcDBfc2l6ZSA9IDB4MTAwMCwKKwkuZG1hMF9vZmZzZXQgPSAweDk4MDAwLAorCS5kbWEwX3NpemUgPSAweDQwMDAsCisJLmRtYTFfb2Zmc2V0ID0gMHg5YzAwMCwKKwkuZG1hMV9zaXplID0gMHg0MDAwLAorCS5pcmFtX29mZnNldCA9IDB4MGMwMDAwLAorCS5pcmFtX3NpemUgPSAweDE0MDAwLAorCS5kcmFtX29mZnNldCA9IDB4MTAwMDAwLAorCS5kcmFtX3NpemUgPSAweDI4MDAwLAorCS5tYm94X29mZnNldCA9IDB4MTQ0MDAwLAorCS5tYm94X3NpemUgPSAweDEwMDAsCisJLmFjcGlfbHBlX3Jlc19pbmRleCA9IDAsCisJLmFjcGlfZGRyX2luZGV4ID0gMiwKKwkuYWNwaV9pcGNfaXJxX2luZGV4ID0gMAorfTsKKwogc3RhdGljIHN0cnVjdCBzc3RfcGxhdGZvcm1faW5mbyBieXRfcnZwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLnByb2JlX2RhdGEgPSAmYnl0X2Z3cGFyc2VfaW5mbywKIAkuaXBjX2luZm8gPSAmYnl0X2lwY19pbmZvLApAQCAtMTQyLDcgKzE2Niw3IEBACiAJcnNyYyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwKIAkJCQkJY3R4LT5wZGF0YS0+cmVzX2luZm8tPmFjcGlfbHBlX3Jlc19pbmRleCk7CiAJaWYgKCFyc3JjKSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsICJJbnZhbGlkIFNISU0gYmFzZSBmcm9tIElGV0kiKTsKKwkJZGV2X2VycihjdHgtPmRldiwgIkludmFsaWQgU0hJTSBiYXNlIGZyb20gSUZXSVxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlkZXZfaW5mbyhjdHgtPmRldiwgIkxQRSBiYXNlOiAlI3ggc2l6ZTolI3giLCAodW5zaWduZWQgaW50KSByc3JjLT5zdGFydCwKQEAgLTE1NCw3ICsxNzgsNyBAQAogCWN0eC0+aXJhbSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKGN0eC0+ZGV2LCBjdHgtPmlyYW1fYmFzZSwKIAkJCQkJIGN0eC0+cGRhdGEtPnJlc19pbmZvLT5pcmFtX3NpemUpOwogCWlmICghY3R4LT5pcmFtKSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsICJ1bmFibGUgdG8gbWFwIElSQU0iKTsKKwkJZGV2X2VycihjdHgtPmRldiwgInVuYWJsZSB0byBtYXAgSVJBTVxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMTY0LDcgKzE4OCw3IEBACiAJY3R4LT5kcmFtID0gZGV2bV9pb3JlbWFwX25vY2FjaGUoY3R4LT5kZXYsIGN0eC0+ZHJhbV9iYXNlLAogCQkJCQkgY3R4LT5wZGF0YS0+cmVzX2luZm8tPmRyYW1fc2l6ZSk7CiAJaWYgKCFjdHgtPmRyYW0pIHsKLQkJZGV2X2VycihjdHgtPmRldiwgInVuYWJsZSB0byBtYXAgRFJBTSIpOworCQlkZXZfZXJyKGN0eC0+ZGV2LCAidW5hYmxlIHRvIG1hcCBEUkFNXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0xNzMsNyArMTk3LDcgQEAKIAljdHgtPnNoaW0gPSBkZXZtX2lvcmVtYXBfbm9jYWNoZShjdHgtPmRldiwgY3R4LT5zaGltX3BoeV9hZGQsCiAJCQkJCWN0eC0+cGRhdGEtPnJlc19pbmZvLT5zaGltX3NpemUpOwogCWlmICghY3R4LT5zaGltKSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsICJ1bmFibGUgdG8gbWFwIFNISU0iKTsKKwkJZGV2X2VycihjdHgtPmRldiwgInVuYWJsZSB0byBtYXAgU0hJTVxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMTg2LDcgKzIxMCw3IEBACiAJY3R4LT5tYWlsYm94ID0gZGV2bV9pb3JlbWFwX25vY2FjaGUoY3R4LT5kZXYsIGN0eC0+bWFpbGJveF9hZGQsCiAJCQkJCSAgICBjdHgtPnBkYXRhLT5yZXNfaW5mby0+bWJveF9zaXplKTsKIAlpZiAoIWN0eC0+bWFpbGJveCkgewotCQlkZXZfZXJyKGN0eC0+ZGV2LCAidW5hYmxlIHRvIG1hcCBtYWlsYm94Iik7CisJCWRldl9lcnIoY3R4LT5kZXYsICJ1bmFibGUgdG8gbWFwIG1haWxib3hcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTE5Niw3ICsyMjAsNyBAQAogCXJzcmMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sCiAJCQkJCWN0eC0+cGRhdGEtPnJlc19pbmZvLT5hY3BpX2Rkcl9pbmRleCk7CiAJaWYgKCFyc3JjKSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsICJJbnZhbGlkIEREUiBiYXNlIGZyb20gSUZXSSIpOworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiSW52YWxpZCBERFIgYmFzZSBmcm9tIElGV0lcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJY3R4LT5kZHJfYmFzZSA9IHJzcmMtPnN0YXJ0OwpAQCAtMjA1LDcgKzIyOSw3IEBACiAJY3R4LT5kZHIgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZShjdHgtPmRldiwgY3R4LT5kZHJfYmFzZSwKIAkJCQkJcmVzb3VyY2Vfc2l6ZShyc3JjKSk7CiAJaWYgKCFjdHgtPmRkcikgewotCQlkZXZfZXJyKGN0eC0+ZGV2LCAidW5hYmxlIHRvIG1hcCBERFIiKTsKKwkJZGV2X2VycihjdHgtPmRldiwgInVuYWJsZSB0byBtYXAgRERSXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0yMTUsNiArMjM5LDQ2IEBACiAJcmV0dXJuIDA7CiB9CiAKKworc3RhdGljIGludCBpc19ieXRfY3Ioc3RydWN0IGRldmljZSAqZGV2LCBib29sICpieXRjcikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmIChJU19FTkFCTEVEKENPTkZJR19JT1NGX01CSSkpIHsKKwkJc3RhdGljIGNvbnN0IHN0cnVjdCB4ODZfY3B1X2lkIGNwdV9pZHNbXSA9IHsKKwkJCXsgWDg2X1ZFTkRPUl9JTlRFTCwgNiwgNTUgfSwgLyogVmFsbGV5dmlldywgQmF5IFRyYWlsICovCisJCQl7fQorCQl9OworCQl1MzIgYmlvc19zdGF0dXM7CisKKwkJaWYgKCF4ODZfbWF0Y2hfY3B1KGNwdV9pZHMpIHx8ICFpb3NmX21iaV9hdmFpbGFibGUoKSkgeworCQkJLyogYmFpbCBzaWxlbnRseSAqLworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCisJCXN0YXR1cyA9IGlvc2ZfbWJpX3JlYWQoQlRfTUJJX1VOSVRfUE1DLCAvKiAweDA0IFBVTklUICovCisJCQkJICAgICAgIE1CSV9SRUdfUkVBRCwgLyogMHgxMCAqLworCQkJCSAgICAgICAweDAwNiwgLyogQklPU19DT05GSUcgKi8KKwkJCQkgICAgICAgJmJpb3Nfc3RhdHVzKTsKKworCQlpZiAoc3RhdHVzKSB7CisJCQlkZXZfZXJyKGRldiwgImNvdWxkIG5vdCByZWFkIFBVTklUIEJJT1NfQ09ORklHXG4iKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGJpdHMgMjY6MjcgbWlycm9yIFBNSUMgb3B0aW9ucyAqLworCQkJYmlvc19zdGF0dXMgPSAoYmlvc19zdGF0dXMgPj4gMjYpICYgMzsKKworCQkJaWYgKChiaW9zX3N0YXR1cyA9PSAxKSB8fCAoYmlvc19zdGF0dXMgPT0gMykpCisJCQkJKmJ5dGNyID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQlkZXZfaW5mbyhkZXYsICJCWVQtQ1Igbm90IGRldGVjdGVkXG4iKTsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9pbmZvKGRldiwgIklPU0ZfTUJJIG5vdCBlbmFibGVkLCBubyBCWVQtQ1IgZGV0ZWN0aW9uXG4iKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworCiBzdGF0aWMgaW50IHNzdF9hY3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKQEAgLTIyNiwxMSArMjkwLDEyIEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdF9kZXY7CiAJc3RydWN0IHNzdF9wbGF0Zm9ybV9pbmZvICpwZGF0YTsKIAl1bnNpZ25lZCBpbnQgZGV2X2lkOworCWJvb2wgYnl0Y3IgPSBmYWxzZTsKIAogCWlkID0gYWNwaV9tYXRjaF9kZXZpY2UoZGV2LT5kcml2ZXItPmFjcGlfbWF0Y2hfdGFibGUsIGRldik7CiAJaWYgKCFpZCkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JZGV2X2RiZyhkZXYsICJmb3IgJXMiLCBpZC0+aWQpOworCWRldl9kYmcoZGV2LCAiZm9yICVzXG4iLCBpZC0+aWQpOwogCiAJbWFjaCA9IChzdHJ1Y3Qgc3N0X2FjcGlfbWFjaCAqKWlkLT5kcml2ZXJfZGF0YTsKIAltYWNoID0gc3N0X2FjcGlfZmluZF9tYWNoaW5lKG1hY2gpOwpAQCAtMjUxLDYgKzMxNiwxOCBAQAogCiAJZGV2X2RiZyhkZXYsICJBQ1BJIGRldmljZSBpZDogJXhcbiIsIGRldl9pZCk7CiAKKwlyZXQgPSBzc3RfYWxsb2NfZHJ2X2NvbnRleHQoJmN0eCwgZGV2LCBkZXZfaWQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaXNfYnl0X2NyKGRldiwgJmJ5dGNyKTsKKwlpZiAoISgocmV0IDwgMCkgfHwgKGJ5dGNyID09IGZhbHNlKSkpIHsKKwkJZGV2X2luZm8oZGV2LCAiRGV0ZWN0ZWQgQmF5dHJhaWwtQ1IgcGxhdGZvcm1cbiIpOworCisJCS8qIG92ZXJyaWRlIHJlc291cmNlIGluZm8gKi8KKwkJYnl0X3J2cF9wbGF0Zm9ybV9kYXRhLnJlc19pbmZvID0gJmJ5dGNyX3Jlc19pbmZvOworCX0KKwogCXBsYXRfZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEoZGV2LCBwZGF0YS0+cGxhdGZvcm0sIC0xLAogCQkJCQkJTlVMTCwgMCk7CiAJaWYgKElTX0VSUihwbGF0X2RldikpIHsKQEAgLTI3MSwxMCArMzQ4LDYgQEAKIAkJcmV0dXJuIFBUUl9FUlIobWRldik7CiAJfQogCi0JcmV0ID0gc3N0X2FsbG9jX2Rydl9jb250ZXh0KCZjdHgsIGRldiwgZGV2X2lkKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQogCS8qIEZpbGwgc3N0IHBsYXRmb3JtIGRhdGEgKi8KIAljdHgtPnBkYXRhID0gcGRhdGE7CiAJc3RyY3B5KGN0eC0+ZmlybXdhcmVfbmFtZSwgbWFjaC0+ZndfZmlsZW5hbWUpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9pcGMuYyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfaXBjLmMKaW5kZXggOGFmYTZmZS4uYmZjODg5OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9pcGMuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0X2lwYy5jCkBAIC0yNjcsNiArMjY3LDkgQEAKIAkJCQkiUGVyaW9kIGVsYXBzZWQgcmN2ZCBmb3IgcGlwZSBpZCAweCV4XG4iLAogCQkJCXBpcGVfaWQpOwogCQkJc3RyZWFtID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07CisJCQkvKiBJZiBzdHJlYW0gaXMgZHJvcHBlZCwgc2tpcCBwcm9jZXNzaW5nIHRoaXMgbWVzc2FnZSovCisJCQlpZiAoc3RyZWFtLT5zdGF0dXMgPT0gU1RSRUFNX0lOSVQpCisJCQkJYnJlYWs7CiAJCQlpZiAoc3RyZWFtLT5wZXJpb2RfZWxhcHNlZCkKIAkJCQlzdHJlYW0tPnBlcmlvZF9lbGFwc2VkKHN0cmVhbS0+cGNtX3N1YnN0cmVhbSk7CiAJCQlpZiAoc3RyZWFtLT5jb21wcl9jYikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfcHZ0LmMgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0X3B2dC5jCmluZGV4IGFkYjMyZmUuLmIxZTZiOGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfcHZ0LmMKKysrIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9wdnQuYwpAQCAtMjc5LDE3ICsyNzksMTUgQEAKIAogCWlmIChyZXNwb25zZSkgewogCQlyZXQgPSBzc3Rfd2FpdF90aW1lb3V0KHNzdCwgYmxvY2spOwotCQlpZiAocmV0IDwgMCkgeworCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0OwotCQl9IGVsc2UgaWYoYmxvY2stPmRhdGEpIHsKLQkJCWlmICghZGF0YSkKLQkJCQlnb3RvIG91dDsKLQkJCSpkYXRhID0ga3phbGxvYyhibG9jay0+c2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoISgqZGF0YSkpIHsKKworCQlpZiAoZGF0YSAmJiBibG9jay0+ZGF0YSkgeworCQkJKmRhdGEgPSBrbWVtZHVwKGJsb2NrLT5kYXRhLCBibG9jay0+c2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoISpkYXRhKSB7CiAJCQkJcmV0ID0gLUVOT01FTTsKIAkJCQlnb3RvIG91dDsKLQkJCX0gZWxzZQotCQkJCW1lbWNweShkYXRhLCAodm9pZCAqKSBibG9jay0+ZGF0YSwgYmxvY2stPnNpemUpOworCQkJfQogCQl9CiAJfQogb3V0OgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2JheXRyYWlsL3NzdC1iYXl0cmFpbC1pcGMuYyBiL3NvdW5kL3NvYy9pbnRlbC9iYXl0cmFpbC9zc3QtYmF5dHJhaWwtaXBjLmMKaW5kZXggNWJiYWE2Ni4uYzg0NTViNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL2JheXRyYWlsL3NzdC1iYXl0cmFpbC1pcGMuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvYmF5dHJhaWwvc3N0LWJheXRyYWlsLWlwYy5jCkBAIC0xODQsMTUgKzE4NCw5IEBACiAKIHN0YXRpYyBpbmxpbmUgdTY0IHNzdF9ieXRfaGVhZGVyKGludCBtc2dfaWQsIGludCBkYXRhLCBib29sIGxhcmdlLCBpbnQgc3RyX2lkKQogewotCXU2NCBoZWFkZXI7Ci0KLQloZWFkZXIgPSBJUENfSEVBREVSX01TR19JRChtc2dfaWQpIHwKLQkJIElQQ19IRUFERVJfU1RSX0lEKHN0cl9pZCkgfAotCQkgSVBDX0hFQURFUl9MQVJHRShsYXJnZSkgfAotCQkgSVBDX0hFQURFUl9EQVRBKGRhdGEpIHwKLQkJIFNTVF9CWVRfSVBDWF9CVVNZOwotCi0JcmV0dXJuIGhlYWRlcjsKKwlyZXR1cm4gSVBDX0hFQURFUl9NU0dfSUQobXNnX2lkKSB8IElQQ19IRUFERVJfU1RSX0lEKHN0cl9pZCkgfAorCSAgICAgICBJUENfSEVBREVSX0xBUkdFKGxhcmdlKSB8IElQQ19IRUFERVJfREFUQShkYXRhKSB8CisJICAgICAgIFNTVF9CWVRfSVBDWF9CVVNZOwogfQogCiBzdGF0aWMgaW5saW5lIHUxNiBzc3RfYnl0X2hlYWRlcl9tc2dfaWQodTY0IGhlYWRlcikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvTWFrZWZpbGUgYi9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL01ha2VmaWxlCmluZGV4IGRhYzAzYTAuLjU2MzlmMTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9NYWtlZmlsZQpAQCAtMSw2ICsxLDcgQEAKIHNuZC1zb2Mtc3N0LWhhc3dlbGwtb2JqcyA6PSBoYXN3ZWxsLm8KIHNuZC1zb2Mtc3N0LWJ5dC1ydDU2NDAtbWFjaC1vYmpzIDo9IGJ5dC1ydDU2NDAubwogc25kLXNvYy1zc3QtYnl0LW1heDk4MDkwLW1hY2gtb2JqcyA6PSBieXQtbWF4OTgwOTAubworc25kLXNvYy1zc3QtYmR3LXJ0NTY3Ny1tYWNoLW9ianMgOj0gYmR3LXJ0NTY3Ny5vCiBzbmQtc29jLXNzdC1icm9hZHdlbGwtb2JqcyA6PSBicm9hZHdlbGwubwogc25kLXNvYy1zc3QtYnh0LWRhNzIxOV9tYXg5ODM1N2Etb2JqcyA6PSBieHRfZGE3MjE5X21heDk4MzU3YS5vCiBzbmQtc29jLXNzdC1ieHQtcnQyOTgtb2JqcyA6PSBieHRfcnQyOTgubwpAQCAtMTksNiArMjAsNyBAQAogb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQlhUX0RBNzIxOV9NQVg5ODM1N0FfTUFDSCkgKz0gc25kLXNvYy1zc3QtYnh0LWRhNzIxOV9tYXg5ODM1N2Eubwogb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQlhUX1JUMjk4X01BQ0gpICs9IHNuZC1zb2Mtc3N0LWJ4dC1ydDI5OC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19JTlRFTF9CUk9BRFdFTExfTUFDSCkgKz0gc25kLXNvYy1zc3QtYnJvYWR3ZWxsLm8KK29iai0kKENPTkZJR19TTkRfU09DX0lOVEVMX0JEV19SVDU2NzdfTUFDSCkgKz0gc25kLXNvYy1zc3QtYmR3LXJ0NTY3Ny1tYWNoLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0lOVEVMX0JZVENSX1JUNTY0MF9NQUNIKSArPSBzbmQtc29jLXNzdC1ieXRjci1ydDU2NDAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQllUQ1JfUlQ1NjUxX01BQ0gpICs9IHNuZC1zb2Mtc3N0LWJ5dGNyLXJ0NTY1MS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19JTlRFTF9DSFRfQlNXX1JUNTY3Ml9NQUNIKSArPSBzbmQtc29jLXNzdC1jaHQtYnN3LXJ0NTY3Mi5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2Jkdy1ydDU2NzcuYyBiL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYmR3LXJ0NTY3Ny5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0N2U2NzAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2Jkdy1ydDU2NzcuYwpAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqIEFTb0MgbWFjaGluZSBkcml2ZXIgZm9yIEludGVsIEJyb2Fkd2VsbCBwbGF0Zm9ybXMgd2l0aCBSVDU2NzcgY29kZWMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIFRoZSBDaHJvbWl1bSBPUyBBdXRob3JzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KKworI2luY2x1ZGUgIi4uL2NvbW1vbi9zc3QtZHNwLmgiCisjaW5jbHVkZSAiLi4vaGFzd2VsbC9zc3QtaGFzd2VsbC1pcGMuaCIKKworI2luY2x1ZGUgIi4uLy4uL2NvZGVjcy9ydDU2NzcuaCIKKworc3RydWN0IGJkd19ydDU2NzdfcHJpdiB7CisJc3RydWN0IGdwaW9fZGVzYyAqZ3Bpb19ocF9lbjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Cit9OworCitzdGF0aWMgaW50IGJkd19ydDU2NzdfZXZlbnRfaHAoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gdy0+ZGFwbTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gZGFwbS0+Y2FyZDsKKwlzdHJ1Y3QgYmR3X3J0NTY3N19wcml2ICpiZHdfcnQ1Njc3ID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOworCisJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpCisJCW1zbGVlcCg3MCk7CisKKwlncGlvZF9zZXRfdmFsdWVfY2Fuc2xlZXAoYmR3X3J0NTY3Ny0+Z3Bpb19ocF9lbiwKKwkJU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGJkd19ydDU2Nzdfd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9IUCgiSGVhZHBob25lIiwgYmR3X3J0NTY3N19ldmVudF9ocCksCisJU05EX1NPQ19EQVBNX1NQSygiU3BlYWtlciIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkhlYWRzZXQgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiTG9jYWwgRE1JQ3MiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJSZW1vdGUgRE1JQ3MiLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJkd19ydDU2NzdfbWFwW10gPSB7CisJLyogU3BlYWtlcnMgKi8KKwl7IlNwZWFrZXIiLCBOVUxMLCAiUERNMUwifSwKKwl7IlNwZWFrZXIiLCBOVUxMLCAiUERNMVIifSwKKworCS8qIEhlYWRzZXQgamFjayBjb25uZWN0b3JzICovCisJeyJIZWFkcGhvbmUiLCBOVUxMLCAiTE9VVDEifSwKKwl7IkhlYWRwaG9uZSIsIE5VTEwsICJMT1VUMiJ9LAorCXsiSU4xUCIsIE5VTEwsICJIZWFkc2V0IE1pYyJ9LAorCXsiSU4xTiIsIE5VTEwsICJIZWFkc2V0IE1pYyJ9LAorCisJLyogRGlnaXRhbCBNSUNzCisJICogTG9jYWwgRE1JQ3M6IHRoZSB0d28gRE1JQ3Mgb24gdGhlIG1haW5ib2FyZAorCSAqIFJlbW90ZSBETUlDczogdGhlIHR3byBETUlDcyBvbiB0aGUgY2FtZXJhIG1vZHVsZQorCSAqLworCXsiRE1JQyBMMSIsIE5VTEwsICJSZW1vdGUgRE1JQ3MifSwKKwl7IkRNSUMgUjEiLCBOVUxMLCAiUmVtb3RlIERNSUNzIn0sCisJeyJETUlDIEwyIiwgTlVMTCwgIkxvY2FsIERNSUNzIn0sCisJeyJETUlDIFIyIiwgTlVMTCwgIkxvY2FsIERNSUNzIn0sCisKKwkvKiBDT0RFQyBCRSBjb25uZWN0aW9ucyAqLworCXsiU1NQMCBDT0RFQyBJTiIsIE5VTEwsICJBSUYxIENhcHR1cmUifSwKKwl7IkFJRjEgUGxheWJhY2siLCBOVUxMLCAiU1NQMCBDT0RFQyBPVVQifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBiZHdfcnQ1Njc3X2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fUElOX1NXSVRDSCgiU3BlYWtlciIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRwaG9uZSIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRzZXQgTWljIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiTG9jYWwgRE1JQ3MiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJSZW1vdGUgRE1JQ3MiKSwKK307CisKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2sgaGVhZHBob25lX2phY2s7CitzdGF0aWMgc3RydWN0IHNuZF9zb2NfamFjayBtaWNfamFjazsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2tfcGluIGhlYWRwaG9uZV9qYWNrX3BpbiA9IHsKKwkucGluCT0gIkhlYWRwaG9uZSIsCisJLm1hc2sJPSBTTkRfSkFDS19IRUFEUEhPTkUsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfamFja19waW4gbWljX2phY2tfcGluID0geworCS5waW4JPSAiSGVhZHNldCBNaWMiLAorCS5tYXNrCT0gU05EX0pBQ0tfTUlDUk9QSE9ORSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19qYWNrX2dwaW8gaGVhZHBob25lX2phY2tfZ3BpbyA9IHsKKwkubmFtZQkJCT0gInBsdWctZGV0IiwKKwkucmVwb3J0CQkJPSBTTkRfSkFDS19IRUFEUEhPTkUsCisJLmRlYm91bmNlX3RpbWUJCT0gMjAwLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2tfZ3BpbyBtaWNfamFja19ncGlvID0geworCS5uYW1lCQkJPSAibWljLXByZXNlbnQiLAorCS5yZXBvcnQJCQk9IFNORF9KQUNLX01JQ1JPUEhPTkUsCisJLmRlYm91bmNlX3RpbWUJCT0gMjAwLAorCS5pbnZlcnQJCQk9IDEsCit9OworCitzdGF0aWMgaW50IGJyb2Fkd2VsbF9zc3AwX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKmNoYW5uZWxzID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKKworCS8qIFRoZSBBRFNQIHdpbGwgY292ZXJ0IHRoZSBGRSByYXRlIHRvIDQ4aywgc3RlcmVvICovCisJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gNDgwMDA7CisJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSAyOworCisJLyogc2V0IFNTUDAgdG8gMTYgYml0ICovCisJc25kX21hc2tfc2V0KCZwYXJhbXMtPm1hc2tzW1NORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQgLQorCQkJCSAgICBTTkRSVl9QQ01fSFdfUEFSQU1fRklSU1RfTUFTS10sCisJCQkJICAgIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZHdfcnQ1Njc3X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlpbnQgcmV0OworCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFJUNTY3N19TQ0xLX1NfTUNMSywgMjQ1NzYwMDAsCisJCVNORF9TT0NfQ0xPQ0tfSU4pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJjYW4ndCBzZXQgY29kZWMgc3lzY2xrIGNvbmZpZ3VyYXRpb25cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgYmR3X3J0NTY3N19vcHMgPSB7CisJLmh3X3BhcmFtcyA9IGJkd19ydDU2NzdfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIGludCBiZHdfcnQ1Njc3X3J0ZF9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKHJ0ZC0+cGxhdGZvcm0tPmRldik7CisJc3RydWN0IHNzdF9oc3cgKmJyb2Fkd2VsbCA9IHBkYXRhLT5kc3A7CisJaW50IHJldDsKKworCS8qIFNldCBBRFNQIFNTUCBwb3J0IHNldHRpbmdzICovCisJcmV0ID0gc3N0X2hzd19kZXZpY2Vfc2V0X2NvbmZpZyhicm9hZHdlbGwsIFNTVF9IU1dfREVWSUNFX1NTUF8wLAorCQlTU1RfSFNXX0RFVklDRV9NQ0xLX0ZSRVFfMjRfTUhaLAorCQlTU1RfSFNXX0RFVklDRV9DTE9DS19NQVNURVIsIDkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIHNldCBkZXZpY2UgY29uZmlnXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZHdfcnQ1Njc3X2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3QgYmR3X3J0NTY3N19wcml2ICpiZHdfcnQ1Njc3ID0KKwkJCXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydGQtPmNhcmQpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7CisKKwkvKiBFbmFibGUgY29kZWMgQVNSQyBmdW5jdGlvbiBmb3IgU3RlcmVvIERBQy9TdGVyZW8xIEFEQy9ETUlDL0kyUzEuCisJICogVGhlIEFTUkMgY2xvY2sgc291cmNlIGlzIGNsa19pMnMxX2FzcmMuCisJICovCisJcnQ1Njc3X3NlbF9hc3JjX2Nsa19zcmMoY29kZWMsIFJUNTY3N19EQV9TVEVSRU9fRklMVEVSIHwKKwkJCVJUNTY3N19BRF9TVEVSRU8xX0ZJTFRFUiB8IFJUNTY3N19JMlMxX1NPVVJDRSwKKwkJCVJUNTY3N19DTEtfU0VMX0kyUzFfQVNSQyk7CisKKwkvKiBSZXF1ZXN0IHJ0NTY3NyBHUElPIGZvciBoZWFkcGhvbmUgYW1wIGNvbnRyb2wgKi8KKwliZHdfcnQ1Njc3LT5ncGlvX2hwX2VuID0gZGV2bV9ncGlvZF9nZXRfaW5kZXgoY29kZWMtPmRldiwKKwkJCSJoZWFkcGhvbmUtZW5hYmxlIiwgMCwgMCk7CisJaWYgKElTX0VSUihiZHdfcnQ1Njc3LT5ncGlvX2hwX2VuKSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJDYW4ndCBmaW5kIEhQX0FNUF9TSEROX0wgZ3Bpb1xuIik7CisJCXJldHVybiBQVFJfRVJSKGJkd19ydDU2NzctPmdwaW9faHBfZW4pOworCX0KKwlncGlvZF9kaXJlY3Rpb25fb3V0cHV0KGJkd19ydDU2NzctPmdwaW9faHBfZW4sIDApOworCisJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGhlYWRwaG9uZSBqYWNrICovCisJaWYgKCFzbmRfc29jX2NhcmRfamFja19uZXcocnRkLT5jYXJkLCAiSGVhZHBob25lIEphY2siLAorCQkJU05EX0pBQ0tfSEVBRFBIT05FLCAmaGVhZHBob25lX2phY2ssCisJCQkmaGVhZHBob25lX2phY2tfcGluLCAxKSkgeworCQloZWFkcGhvbmVfamFja19ncGlvLmdwaW9kX2RldiA9IGNvZGVjLT5kZXY7CisJCWlmIChzbmRfc29jX2phY2tfYWRkX2dwaW9zKCZoZWFkcGhvbmVfamFjaywgMSwKKwkJCQkmaGVhZHBob25lX2phY2tfZ3BpbykpCisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJDYW4ndCBhZGQgaGVhZHBob25lIGphY2sgZ3Bpb1xuIik7CisJfSBlbHNlIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiQ2FuJ3QgY3JlYXRlIGhlYWRwaG9uZSBqYWNrXG4iKTsKKwl9CisKKwkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgbWljIGphY2sgKi8KKwlpZiAoIXNuZF9zb2NfY2FyZF9qYWNrX25ldyhydGQtPmNhcmQsICJNaWMgSmFjayIsCisJCQlTTkRfSkFDS19NSUNST1BIT05FLCAmbWljX2phY2ssCisJCQkmbWljX2phY2tfcGluLCAxKSkgeworCQltaWNfamFja19ncGlvLmdwaW9kX2RldiA9IGNvZGVjLT5kZXY7CisJCWlmIChzbmRfc29jX2phY2tfYWRkX2dwaW9zKCZtaWNfamFjaywgMSwgJm1pY19qYWNrX2dwaW8pKQorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiQ2FuJ3QgYWRkIG1pYyBqYWNrIGdwaW9cbiIpOworCX0gZWxzZSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkNhbid0IGNyZWF0ZSBtaWMgamFja1xuIik7CisJfQorCWJkd19ydDU2NzctPmNvZGVjID0gY29kZWM7CisKKwlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbihkYXBtLCAiTUlDQklBUzEiKTsKKwlyZXR1cm4gMDsKK30KKworLyogYnJvYWR3ZWxsIGRpZ2l0YWwgYXVkaW8gaW50ZXJmYWNlIGdsdWUgLSBjb25uZWN0cyBjb2RlYyA8LS0+IENQVSAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGJkd19ydDU2NzdfZGFpc1tdID0geworCS8qIEZyb250IEVuZCBEQUkgbGlua3MgKi8KKwl7CisJCS5uYW1lID0gIlN5c3RlbSBQQ00iLAorCQkuc3RyZWFtX25hbWUgPSAiU3lzdGVtIFBsYXliYWNrL0NhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIlN5c3RlbSBQaW4iLAorCQkucGxhdGZvcm1fbmFtZSA9ICJoYXN3ZWxsLXBjbS1hdWRpbyIsCisJCS5keW5hbWljID0gMSwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5pbml0ID0gYmR3X3J0NTY3N19ydGRfaW5pdCwKKwkJLnRyaWdnZXIgPSB7CisJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVAorCQl9LAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCX0sCisKKwkvKiBCYWNrIEVuZCBEQUkgbGlua3MgKi8KKwl7CisJCS8qIFNTUDAgLSBDb2RlYyAqLworCQkubmFtZSA9ICJDb2RlYyIsCisJCS5pZCA9IDAsCisJCS5jcHVfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5jb2RlY19uYW1lID0gImkyYy1SVDU2NzdDRTowMCIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJydDU2NzctYWlmMSIsCisJCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAorCQkJU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBicm9hZHdlbGxfc3NwMF9maXh1cCwKKwkJLm9wcyA9ICZiZHdfcnQ1Njc3X29wcywKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmluaXQgPSBiZHdfcnQ1Njc3X2luaXQsCisJfSwKK307CisKK3N0YXRpYyBpbnQgYmR3X3J0NTY3N19zdXNwZW5kX3ByZShzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQoreworCXN0cnVjdCBiZHdfcnQ1Njc3X3ByaXYgKmJkd19ydDU2NzcgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtOworCisJaWYgKGJkd19ydDU2NzctPmNvZGVjKSB7CisJCWRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGJkd19ydDU2NzctPmNvZGVjKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNSUNCSUFTMSIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZHdfcnQ1Njc3X3Jlc3VtZV9wb3N0KHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IGJkd19ydDU2NzdfcHJpdiAqYmR3X3J0NTY3NyA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG07CisKKwlpZiAoYmR3X3J0NTY3Ny0+Y29kZWMpIHsKKwkJZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oYmR3X3J0NTY3Ny0+Y29kZWMpOworCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbihkYXBtLCAiTUlDQklBUzEiKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEFTb0MgbWFjaGluZSBkcml2ZXIgZm9yIEJyb2Fkd2VsbCBEU1AgKyBSVDU2NzcgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIGJkd19ydDU2NzdfY2FyZCA9IHsKKwkubmFtZSA9ICJiZHctcnQ1Njc3IiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuZGFpX2xpbmsgPSBiZHdfcnQ1Njc3X2RhaXMsCisJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUoYmR3X3J0NTY3N19kYWlzKSwKKwkuZGFwbV93aWRnZXRzID0gYmR3X3J0NTY3N193aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShiZHdfcnQ1Njc3X3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGJkd19ydDU2NzdfbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGJkd19ydDU2NzdfbWFwKSwKKwkuY29udHJvbHMgPSBiZHdfcnQ1Njc3X2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGJkd19ydDU2NzdfY29udHJvbHMpLAorCS5mdWxseV9yb3V0ZWQgPSB0cnVlLAorCS5zdXNwZW5kX3ByZSA9IGJkd19ydDU2Nzdfc3VzcGVuZF9wcmUsCisJLnJlc3VtZV9wb3N0ID0gYmR3X3J0NTY3N19yZXN1bWVfcG9zdCwKK307CisKK3N0YXRpYyBpbnQgYmR3X3J0NTY3N19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBiZHdfcnQ1Njc3X3ByaXYgKmJkd19ydDU2Nzc7CisKKwliZHdfcnQ1Njc3X2NhcmQuZGV2ID0gJnBkZXYtPmRldjsKKworCS8qIEFsbG9jYXRlIGRyaXZlciBwcml2YXRlIHN0cnVjdCAqLworCWJkd19ydDU2NzcgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBiZHdfcnQ1Njc3X3ByaXYpLAorCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWJkd19ydDU2NzcpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgYWxsb2NhdGUgYmR3X3J0NTY3N1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNuZF9zb2NfY2FyZF9zZXRfZHJ2ZGF0YSgmYmR3X3J0NTY3N19jYXJkLCBiZHdfcnQ1Njc3KTsKKworCXJldHVybiBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCAmYmR3X3J0NTY3N19jYXJkKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYmR3X3J0NTY3N19hdWRpbyA9IHsKKwkucHJvYmUgPSBiZHdfcnQ1Njc3X3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImJkdy1ydDU2NzciLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGJkd19ydDU2NzdfYXVkaW8pCisKKy8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLworTU9EVUxFX0FVVEhPUigiQmVuIFpoYW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIEJyb2Fkd2VsbCBSVDU2NzcgbWFjaGluZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YmR3LXJ0NTY3NyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieHRfZGE3MjE5X21heDk4MzU3YS5jIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieHRfZGE3MjE5X21heDk4MzU3YS5jCmluZGV4IDM3NzRiMTEuLjY1MzJiOGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYnh0X2RhNzIxOV9tYXg5ODM1N2EuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2J4dF9kYTcyMTlfbWF4OTgzNTdhLmMKQEAgLTM3LDYgKzM3LDcgQEAKIAlCWFRfRFBDTV9BVURJT19QQiA9IDAsCiAJQlhUX0RQQ01fQVVESU9fQ1AsCiAJQlhUX0RQQ01fQVVESU9fUkVGX0NQLAorCUJYVF9EUENNX0FVRElPX0RNSUNfQ1AsCiAJQlhUX0RQQ01fQVVESU9fSERNSTFfUEIsCiAJQlhUX0RQQ01fQVVESU9fSERNSTJfUEIsCiAJQlhUX0RQQ01fQVVESU9fSERNSTNfUEIsCkBAIC0yNTIsMTAgKzI1Myw1NiBAQAogCS5od19mcmVlID0gYnJveHRvbl9kYTcyMTlfaHdfZnJlZSwKIH07CiAKK3N0YXRpYyBpbnQgYnJveHRvbl9kbWljX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBEVUFMX0NIQU5ORUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicm94dG9uX2RtaWNfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0gRFVBTF9DSEFOTkVMOworCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywKKwkJCSZjb25zdHJhaW50c19jaGFubmVscyk7CisKKwlyZXR1cm4gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qoc3Vic3RyZWFtLT5ydW50aW1lLCAwLAorCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsICZjb25zdHJhaW50c19yYXRlcyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19vcHMgYnJveHRvbl9kbWljX29wcyA9IHsKKwkuc3RhcnR1cCA9IGJyb3h0b25fZG1pY19zdGFydHVwLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByYXRlc18xNjAwMFtdID0geworCTE2MDAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c18xNjAwMCA9IHsKKwkuY291bnQgPSBBUlJBWV9TSVpFKHJhdGVzXzE2MDAwKSwKKwkubGlzdCAgPSByYXRlc18xNjAwMCwKK307CisKK3N0YXRpYyBpbnQgYnJveHRvbl9yZWZjYXBfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qoc3Vic3RyZWFtLT5ydW50aW1lLCAwLAorCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCisJCQkmY29uc3RyYWludHNfMTYwMDApOworfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBicm94dG9uX3JlZmNhcF9vcHMgPSB7CisJLnN0YXJ0dXAgPSBicm94dG9uX3JlZmNhcF9zdGFydHVwLAorfTsKKwogLyogYnJveHRvbiBkaWdpdGFsIGF1ZGlvIGludGVyZmFjZSBnbHVlIC0gY29ubmVjdHMgY29kZWMgPC0tPiBDUFUgKi8KIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBicm94dG9uX2RhaXNbXSA9IHsKIAkvKiBGcm9udCBFbmQgREFJIGxpbmtzICovCi0JW0JYVF9EUENNX0FVRElPX1BCXQorCVtCWFRfRFBDTV9BVURJT19QQl0gPQogCXsKIAkJLm5hbWUgPSAiQnh0IEF1ZGlvIFBvcnQiLAogCQkuc3RyZWFtX25hbWUgPSAiQXVkaW8iLApAQCAtMjcxLDcgKzMxOCw3IEBACiAJCS5kcGNtX3BsYXliYWNrID0gMSwKIAkJLm9wcyA9ICZicm94dG9uX2RhNzIxOV9mZV9vcHMsCiAJfSwKLQlbQlhUX0RQQ01fQVVESU9fQ1BdCisJW0JYVF9EUENNX0FVRElPX0NQXSA9CiAJewogCQkubmFtZSA9ICJCeHQgQXVkaW8gQ2FwdHVyZSBQb3J0IiwKIAkJLnN0cmVhbV9uYW1lID0gIkF1ZGlvIFJlY29yZCIsCkBAIC0yODYsNyArMzMzLDcgQEAKIAkJLmRwY21fY2FwdHVyZSA9IDEsCiAJCS5vcHMgPSAmYnJveHRvbl9kYTcyMTlfZmVfb3BzLAogCX0sCi0JW0JYVF9EUENNX0FVRElPX1JFRl9DUF0KKwlbQlhUX0RQQ01fQVVESU9fUkVGX0NQXSA9CiAJewogCQkubmFtZSA9ICJCeHQgQXVkaW8gUmVmZXJlbmNlIGNhcCIsCiAJCS5zdHJlYW1fbmFtZSA9ICJSZWZjYXAiLApAQCAtMjk5LDggKzM0NiwyMyBAQAogCQkuaWdub3JlX3N1c3BlbmQgPSAxLAogCQkubm9uYXRvbWljID0gMSwKIAkJLmR5bmFtaWMgPSAxLAorCQkub3BzID0gJmJyb3h0b25fcmVmY2FwX29wcywKIAl9LAotCVtCWFRfRFBDTV9BVURJT19IRE1JMV9QQl0KKwlbQlhUX0RQQ01fQVVESU9fRE1JQ19DUF0KKwl7CisJCS5uYW1lID0gIkJ4dCBBdWRpbyBETUlDIGNhcCIsCisJCS5zdHJlYW1fbmFtZSA9ICJkbWljY2FwIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJETUlDIFBpbiIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkucGxhdGZvcm1fbmFtZSA9ICIwMDAwOjAwOjBlLjAiLAorCQkuaW5pdCA9IE5VTEwsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkubm9uYXRvbWljID0gMSwKKwkJLmR5bmFtaWMgPSAxLAorCQkub3BzID0gJmJyb3h0b25fZG1pY19vcHMsCisJfSwKKwlbQlhUX0RQQ01fQVVESU9fSERNSTFfUEJdID0KIAl7CiAJCS5uYW1lID0gIkJ4dCBIRE1JIFBvcnQxIiwKIAkJLnN0cmVhbV9uYW1lID0gIkhkbWkxIiwKQEAgLTMxMyw3ICszNzUsNyBAQAogCQkubm9uYXRvbWljID0gMSwKIAkJLmR5bmFtaWMgPSAxLAogCX0sCi0JW0JYVF9EUENNX0FVRElPX0hETUkyX1BCXQorCVtCWFRfRFBDTV9BVURJT19IRE1JMl9QQl0gPQogCXsKIAkJLm5hbWUgPSAiQnh0IEhETUkgUG9ydDIiLAogCQkuc3RyZWFtX25hbWUgPSAiSGRtaTIiLApAQCAtMzI2LDcgKzM4OCw3IEBACiAJCS5ub25hdG9taWMgPSAxLAogCQkuZHluYW1pYyA9IDEsCiAJfSwKLQlbQlhUX0RQQ01fQVVESU9fSERNSTNfUEJdCisJW0JYVF9EUENNX0FVRElPX0hETUkzX1BCXSA9CiAJewogCQkubmFtZSA9ICJCeHQgSERNSSBQb3J0MyIsCiAJCS5zdHJlYW1fbmFtZSA9ICJIZG1pMyIsCkBAIC0zODIsNiArNDQ0LDcgQEAKIAkJLmNvZGVjX2RhaV9uYW1lID0gImRtaWMtaGlmaSIsCiAJCS5wbGF0Zm9ybV9uYW1lID0gIjAwMDA6MDA6MGUuMCIsCiAJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBicm94dG9uX2RtaWNfZml4dXAsCiAJCS5kcGNtX2NhcHR1cmUgPSAxLAogCQkubm9fcGNtID0gMSwKIAl9LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieHRfcnQyOTguYyBiL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYnh0X3J0Mjk4LmMKaW5kZXggMjUzZDdiZi4uZDYxMGJkYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieHRfcnQyOTguYworKysgYi9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2J4dF9ydDI5OC5jCkBAIC0yNzEsNyArMjcxLDcgQEAKIC8qIGJyb3h0b24gZGlnaXRhbCBhdWRpbyBpbnRlcmZhY2UgZ2x1ZSAtIGNvbm5lY3RzIGNvZGVjIDwtLT4gQ1BVICovCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgYnJveHRvbl9ydDI5OF9kYWlzW10gPSB7CiAJLyogRnJvbnQgRW5kIERBSSBsaW5rcyAqLwotCVtCWFRfRFBDTV9BVURJT19QQl0KKwlbQlhUX0RQQ01fQVVESU9fUEJdID0KIAl7CiAJCS5uYW1lID0gIkJ4dCBBdWRpbyBQb3J0IiwKIAkJLnN0cmVhbV9uYW1lID0gIkF1ZGlvIiwKQEAgLTI4Niw3ICsyODYsNyBAQAogCQkuZHBjbV9wbGF5YmFjayA9IDEsCiAJCS5vcHMgPSAmYnJveHRvbl9ydDI4Nl9mZV9vcHMsCiAJfSwKLQlbQlhUX0RQQ01fQVVESU9fQ1BdCisJW0JYVF9EUENNX0FVRElPX0NQXSA9CiAJewogCQkubmFtZSA9ICJCeHQgQXVkaW8gQ2FwdHVyZSBQb3J0IiwKIAkJLnN0cmVhbV9uYW1lID0gIkF1ZGlvIFJlY29yZCIsCkBAIC0zMDAsNyArMzAwLDcgQEAKIAkJLmRwY21fY2FwdHVyZSA9IDEsCiAJCS5vcHMgPSAmYnJveHRvbl9ydDI4Nl9mZV9vcHMsCiAJfSwKLQlbQlhUX0RQQ01fQVVESU9fUkVGX0NQXQorCVtCWFRfRFBDTV9BVURJT19SRUZfQ1BdID0KIAl7CiAJCS5uYW1lID0gIkJ4dCBBdWRpbyBSZWZlcmVuY2UgY2FwIiwKIAkJLnN0cmVhbV9uYW1lID0gInJlZmNhcCIsCkBAIC0zMTMsNyArMzEzLDcgQEAKIAkJLm5vbmF0b21pYyA9IDEsCiAJCS5keW5hbWljID0gMSwKIAl9LAotCVtCWFRfRFBDTV9BVURJT19ETUlDX0NQXQorCVtCWFRfRFBDTV9BVURJT19ETUlDX0NQXSA9CiAJewogCQkubmFtZSA9ICJCeHQgQXVkaW8gRE1JQyBjYXAiLAogCQkuc3RyZWFtX25hbWUgPSAiZG1pY2NhcCIsCkBAIC0zMjcsNyArMzI3LDcgQEAKIAkJLmR5bmFtaWMgPSAxLAogCQkub3BzID0gJmJyb3h0b25fZG1pY19vcHMsCiAJfSwKLQlbQlhUX0RQQ01fQVVESU9fSERNSTFfUEJdCisJW0JYVF9EUENNX0FVRElPX0hETUkxX1BCXSA9CiAJewogCQkubmFtZSA9ICJCeHQgSERNSSBQb3J0MSIsCiAJCS5zdHJlYW1fbmFtZSA9ICJIZG1pMSIsCkBAIC0zNDAsNyArMzQwLDcgQEAKIAkJLm5vbmF0b21pYyA9IDEsCiAJCS5keW5hbWljID0gMSwKIAl9LAotCVtCWFRfRFBDTV9BVURJT19IRE1JMl9QQl0KKwlbQlhUX0RQQ01fQVVESU9fSERNSTJfUEJdID0KIAl7CiAJCS5uYW1lID0gIkJ4dCBIRE1JIFBvcnQyIiwKIAkJLnN0cmVhbV9uYW1lID0gIkhkbWkyIiwKQEAgLTM1Myw3ICszNTMsNyBAQAogCQkubm9uYXRvbWljID0gMSwKIAkJLmR5bmFtaWMgPSAxLAogCX0sCi0JW0JYVF9EUENNX0FVRElPX0hETUkzX1BCXQorCVtCWFRfRFBDTV9BVURJT19IRE1JM19QQl0gPQogCXsKIAkJLm5hbWUgPSAiQnh0IEhETUkgUG9ydDMiLAogCQkuc3RyZWFtX25hbWUgPSAiSGRtaTMiLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieXRjcl9ydDU2NDAuYyBiL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYnl0Y3JfcnQ1NjQwLmMKaW5kZXggODhlZmI2Mi4uYmZmNzdhMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieXRjcl9ydDU2NDAuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2J5dGNyX3J0NTY0MC5jCkBAIC0yNCw2ICsyNCw5IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9jcHVfZGV2aWNlX2lkLmg+CisjaW5jbHVkZSA8YXNtL3BsYXRmb3JtX3NzdF9hdWRpby5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KQEAgLTMxLDQyICszNCwxNTMgQEAKICNpbmNsdWRlICIuLi8uLi9jb2RlY3MvcnQ1NjQwLmgiCiAjaW5jbHVkZSAiLi4vYXRvbS9zc3QtYXRvbS1jb250cm9scy5oIgogI2luY2x1ZGUgIi4uL2NvbW1vbi9zc3QtYWNwaS5oIgorI2luY2x1ZGUgIi4uL2NvbW1vbi9zc3QtZHNwLmgiCiAKIGVudW0gewogCUJZVF9SVDU2NDBfRE1JQzFfTUFQLAogCUJZVF9SVDU2NDBfRE1JQzJfTUFQLAogCUJZVF9SVDU2NDBfSU4xX01BUCwKKwlCWVRfUlQ1NjQwX0lOM19NQVAsCiB9OwogCiAjZGVmaW5lIEJZVF9SVDU2NDBfTUFQKHF1aXJrKQkoKHF1aXJrKSAmIDB4ZmYpCiAjZGVmaW5lIEJZVF9SVDU2NDBfRE1JQ19FTglCSVQoMTYpCisjZGVmaW5lIEJZVF9SVDU2NDBfTU9OT19TUEVBS0VSIEJJVCgxNykKKyNkZWZpbmUgQllUX1JUNTY0MF9ESUZGX01JQyAgICAgQklUKDE4KSAvKiBkZWZhdXQgaXMgc2luZ2xlLWVuZGVkICovCisjZGVmaW5lIEJZVF9SVDU2NDBfU1NQMl9BSUYyICAgICBCSVQoMTkpIC8qIGRlZmF1bHQgaXMgdXNpbmcgQUlGMSAgKi8KKyNkZWZpbmUgQllUX1JUNTY0MF9TU1AwX0FJRjEgICAgIEJJVCgyMCkKKyNkZWZpbmUgQllUX1JUNTY0MF9TU1AwX0FJRjIgICAgIEJJVCgyMSkKKyNkZWZpbmUgQllUX1JUNTY0MF9NQ0xLX0VOCUJJVCgyMikKKyNkZWZpbmUgQllUX1JUNTY0MF9NQ0xLXzI1TUhaCUJJVCgyMykKKworc3RydWN0IGJ5dF9ydDU2NDBfcHJpdmF0ZSB7CisJc3RydWN0IGNsayAqbWNsazsKK307CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGJ5dF9ydDU2NDBfcXVpcmsgPSBCWVRfUlQ1NjQwX0RNSUMxX01BUCB8Ci0JCQkJCUJZVF9SVDU2NDBfRE1JQ19FTjsKKwkJCQkJQllUX1JUNTY0MF9ETUlDX0VOIHwKKwkJCQkJQllUX1JUNTY0MF9NQ0xLX0VOOworCitzdGF0aWMgdm9pZCBsb2dfcXVpcmtzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoQllUX1JUNTY0MF9NQVAoYnl0X3J0NTY0MF9xdWlyaykgPT0gQllUX1JUNTY0MF9ETUlDMV9NQVApCisJCWRldl9pbmZvKGRldiwgInF1aXJrIERNSUMxX01BUCBlbmFibGVkIik7CisJaWYgKEJZVF9SVDU2NDBfTUFQKGJ5dF9ydDU2NDBfcXVpcmspID09IEJZVF9SVDU2NDBfRE1JQzJfTUFQKQorCQlkZXZfaW5mbyhkZXYsICJxdWlyayBETUlDMl9NQVAgZW5hYmxlZCIpOworCWlmIChCWVRfUlQ1NjQwX01BUChieXRfcnQ1NjQwX3F1aXJrKSA9PSBCWVRfUlQ1NjQwX0lOMV9NQVApCisJCWRldl9pbmZvKGRldiwgInF1aXJrIElOMV9NQVAgZW5hYmxlZCIpOworCWlmIChCWVRfUlQ1NjQwX01BUChieXRfcnQ1NjQwX3F1aXJrKSA9PSBCWVRfUlQ1NjQwX0lOM19NQVApCisJCWRldl9pbmZvKGRldiwgInF1aXJrIElOM19NQVAgZW5hYmxlZCIpOworCWlmIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9ETUlDX0VOKQorCQlkZXZfaW5mbyhkZXYsICJxdWlyayBETUlDIGVuYWJsZWQiKTsKKwlpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfTU9OT19TUEVBS0VSKQorCQlkZXZfaW5mbyhkZXYsICJxdWlyayBNT05PX1NQRUFLRVIgZW5hYmxlZCIpOworCWlmIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9ESUZGX01JQykKKwkJZGV2X2luZm8oZGV2LCAicXVpcmsgRElGRl9NSUMgZW5hYmxlZCIpOworCWlmIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9TU1AyX0FJRjIpCisJCWRldl9pbmZvKGRldiwgInF1aXJrIFNTUDJfQUlGMiBlbmFibGVkIik7CisJaWYgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX1NTUDBfQUlGMSkKKwkJZGV2X2luZm8oZGV2LCAicXVpcmsgU1NQMF9BSUYxIGVuYWJsZWQiKTsKKwlpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfU1NQMF9BSUYyKQorCQlkZXZfaW5mbyhkZXYsICJxdWlyayBTU1AwX0FJRjIgZW5hYmxlZCIpOworCWlmIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9NQ0xLX0VOKQorCQlkZXZfaW5mbyhkZXYsICJxdWlyayBNQ0xLX0VOIGVuYWJsZWQiKTsKKwlpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfTUNMS18yNU1IWikKKwkJZGV2X2luZm8oZGV2LCAicXVpcmsgTUNMS18yNU1IWiBlbmFibGVkIik7Cit9CisKKworI2RlZmluZSBCWVRfQ09ERUNfREFJMQkicnQ1NjQwLWFpZjEiCisjZGVmaW5lIEJZVF9DT0RFQ19EQUkyCSJydDU2NDAtYWlmMiIKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc25kX3NvY19kYWkgKmJ5dF9nZXRfY29kZWNfZGFpKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocnRkLCAmY2FyZC0+cnRkX2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFzdHJuY21wKHJ0ZC0+Y29kZWNfZGFpLT5uYW1lLCBCWVRfQ09ERUNfREFJMSwKKwkJCSAgICAgc3RybGVuKEJZVF9DT0RFQ19EQUkxKSkpCisJCQlyZXR1cm4gcnRkLT5jb2RlY19kYWk7CisJCWlmICghc3RybmNtcChydGQtPmNvZGVjX2RhaS0+bmFtZSwgQllUX0NPREVDX0RBSTIsCisJCQkJc3RybGVuKEJZVF9DT0RFQ19EQUkyKSkpCisJCQlyZXR1cm4gcnRkLT5jb2RlY19kYWk7CisKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcGxhdGZvcm1fY2xvY2tfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmssIGludCAgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gdy0+ZGFwbTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gZGFwbS0+Y2FyZDsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaTsKKwlzdHJ1Y3QgYnl0X3J0NTY0MF9wcml2YXRlICpwcml2ID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOworCWludCByZXQ7CisKKwljb2RlY19kYWkgPSBieXRfZ2V0X2NvZGVjX2RhaShjYXJkKTsKKwlpZiAoIWNvZGVjX2RhaSkgeworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJDb2RlYyBkYWkgbm90IGZvdW5kOyBVbmFibGUgdG8gc2V0IHBsYXRmb3JtIGNsb2NrXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpIHsKKwkJaWYgKChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9NQ0xLX0VOKSAmJiBwcml2LT5tY2xrKSB7CisJCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+bWNsayk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCQkiY291bGQgbm90IGNvbmZpZ3VyZSBNQ0xLIHN0YXRlIik7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgUlQ1NjQwX1NDTEtfU19QTEwxLAorCQkJCQkgICAgIDQ4MDAwICogNTEyLAorCQkJCQkgICAgIFNORF9TT0NfQ0xPQ0tfSU4pOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFNldCBjb2RlYyBjbG9jayBzb3VyY2UgdG8gaW50ZXJuYWwgY2xvY2sgYmVmb3JlCisJCSAqIHR1cm5pbmcgb2ZmIHRoZSBwbGF0Zm9ybSBjbG9jay4gQ29kZWMgbmVlZHMgY2xvY2sKKwkJICogZm9yIEphY2sgZGV0ZWN0aW9uIGFuZCBidXR0b24gcHJlc3MKKwkJICovCisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBSVDU2NDBfU0NMS19TX1JDQ0xLLAorCQkJCQkgICAgIDAsCisJCQkJCSAgICAgU05EX1NPQ19DTE9DS19JTik7CisJCWlmICghcmV0KSB7CisJCQlpZiAoKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX01DTEtfRU4pICYmIHByaXYtPm1jbGspCisJCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPm1jbGspOworCQl9CisJfQorCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjYW4ndCBzZXQgY29kZWMgc3lzY2xrOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGJ5dF9ydDU2NDBfd2lkZ2V0c1tdID0gewogCVNORF9TT0NfREFQTV9IUCgiSGVhZHBob25lIiwgTlVMTCksCiAJU05EX1NPQ19EQVBNX01JQygiSGVhZHNldCBNaWMiLCBOVUxMKSwKIAlTTkRfU09DX0RBUE1fTUlDKCJJbnRlcm5hbCBNaWMiLCBOVUxMKSwKIAlTTkRfU09DX0RBUE1fU1BLKCJTcGVha2VyIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUGxhdGZvcm0gQ2xvY2siLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICAgcGxhdGZvcm1fY2xvY2tfY29udHJvbCwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQkJICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9ydDU2NDBfYXVkaW9fbWFwW10gPSB7Ci0JeyJBSUYxIFBsYXliYWNrIiwgTlVMTCwgInNzcDIgVHgifSwKLQl7InNzcDIgVHgiLCBOVUxMLCAiY29kZWNfb3V0MCJ9LAotCXsic3NwMiBUeCIsIE5VTEwsICJjb2RlY19vdXQxIn0sCi0JeyJjb2RlY19pbjAiLCBOVUxMLCAic3NwMiBSeCJ9LAotCXsiY29kZWNfaW4xIiwgTlVMTCwgInNzcDIgUngifSwKLQl7InNzcDIgUngiLCBOVUxMLCAiQUlGMSBDYXB0dXJlIn0sCisJeyJIZWFkcGhvbmUiLCBOVUxMLCAiUGxhdGZvcm0gQ2xvY2sifSwKKwl7IkhlYWRzZXQgTWljIiwgTlVMTCwgIlBsYXRmb3JtIENsb2NrIn0sCisJeyJJbnRlcm5hbCBNaWMiLCBOVUxMLCAiUGxhdGZvcm0gQ2xvY2sifSwKKwl7IlNwZWFrZXIiLCBOVUxMLCAiUGxhdGZvcm0gQ2xvY2sifSwKIAogCXsiSGVhZHNldCBNaWMiLCBOVUxMLCAiTUlDQklBUzEifSwKIAl7IklOMlAiLCBOVUxMLCAiSGVhZHNldCBNaWMifSwKIAl7IkhlYWRwaG9uZSIsIE5VTEwsICJIUE9MIn0sCiAJeyJIZWFkcGhvbmUiLCBOVUxMLCAiSFBPUiJ9LAotCXsiU3BlYWtlciIsIE5VTEwsICJTUE9MUCJ9LAotCXsiU3BlYWtlciIsIE5VTEwsICJTUE9MTiJ9LAotCXsiU3BlYWtlciIsIE5VTEwsICJTUE9SUCJ9LAotCXsiU3BlYWtlciIsIE5VTEwsICJTUE9STiJ9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYnl0X3J0NTY0MF9pbnRtaWNfZG1pYzFfbWFwW10gPSB7CkBAIC04Miw2ICsxOTYsNTkgQEAKIAl7IklOMVAiLCBOVUxMLCAiSW50ZXJuYWwgTWljIn0sCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBieXRfcnQ1NjQwX2ludG1pY19pbjNfbWFwW10gPSB7CisJeyJJbnRlcm5hbCBNaWMiLCBOVUxMLCAiTUlDQklBUzEifSwKKwl7IklOM1AiLCBOVUxMLCAiSW50ZXJuYWwgTWljIn0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBieXRfcnQ1NjQwX3NzcDJfYWlmMV9tYXBbXSA9IHsKKwl7InNzcDIgVHgiLCBOVUxMLCAiY29kZWNfb3V0MCJ9LAorCXsic3NwMiBUeCIsIE5VTEwsICJjb2RlY19vdXQxIn0sCisJeyJjb2RlY19pbjAiLCBOVUxMLCAic3NwMiBSeCJ9LAorCXsiY29kZWNfaW4xIiwgTlVMTCwgInNzcDIgUngifSwKKworCXsiQUlGMSBQbGF5YmFjayIsIE5VTEwsICJzc3AyIFR4In0sCisJeyJzc3AyIFJ4IiwgTlVMTCwgIkFJRjEgQ2FwdHVyZSJ9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYnl0X3J0NTY0MF9zc3AyX2FpZjJfbWFwW10gPSB7CisJeyJzc3AyIFR4IiwgTlVMTCwgImNvZGVjX291dDAifSwKKwl7InNzcDIgVHgiLCBOVUxMLCAiY29kZWNfb3V0MSJ9LAorCXsiY29kZWNfaW4wIiwgTlVMTCwgInNzcDIgUngifSwKKwl7ImNvZGVjX2luMSIsIE5VTEwsICJzc3AyIFJ4In0sCisKKwl7IkFJRjIgUGxheWJhY2siLCBOVUxMLCAic3NwMiBUeCJ9LAorCXsic3NwMiBSeCIsIE5VTEwsICJBSUYyIENhcHR1cmUifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9ydDU2NDBfc3NwMF9haWYxX21hcFtdID0geworCXsic3NwMCBUeCIsIE5VTEwsICJtb2RlbV9vdXQifSwKKwl7Im1vZGVtX2luIiwgTlVMTCwgInNzcDAgUngifSwKKworCXsiQUlGMSBQbGF5YmFjayIsIE5VTEwsICJzc3AwIFR4In0sCisJeyJzc3AwIFJ4IiwgTlVMTCwgIkFJRjEgQ2FwdHVyZSJ9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYnl0X3J0NTY0MF9zc3AwX2FpZjJfbWFwW10gPSB7CisJeyJzc3AwIFR4IiwgTlVMTCwgIm1vZGVtX291dCJ9LAorCXsibW9kZW1faW4iLCBOVUxMLCAic3NwMCBSeCJ9LAorCisJeyJBSUYyIFBsYXliYWNrIiwgTlVMTCwgInNzcDAgVHgifSwKKwl7InNzcDAgUngiLCBOVUxMLCAiQUlGMiBDYXB0dXJlIn0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBieXRfcnQ1NjQwX3N0ZXJlb19zcGtfbWFwW10gPSB7CisJeyJTcGVha2VyIiwgTlVMTCwgIlNQT0xQIn0sCisJeyJTcGVha2VyIiwgTlVMTCwgIlNQT0xOIn0sCisJeyJTcGVha2VyIiwgTlVMTCwgIlNQT1JQIn0sCisJeyJTcGVha2VyIiwgTlVMTCwgIlNQT1JOIn0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBieXRfcnQ1NjQwX21vbm9fc3BrX21hcFtdID0geworCXsiU3BlYWtlciIsIE5VTEwsICJTUE9MUCJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJTUE9MTiJ9LAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGJ5dF9ydDU2NDBfY29udHJvbHNbXSA9IHsKIAlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkcGhvbmUiKSwKIAlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkc2V0IE1pYyIpLApAQCAtOTYsMTkgKzI2Myw0NiBAQAogCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CiAJaW50IHJldDsKIAotCXNuZF9zb2NfZGFpX3NldF9iY2xrX3JhdGlvKGNvZGVjX2RhaSwgNTApOwotCiAJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFJUNTY0MF9TQ0xLX1NfUExMMSwKIAkJCQkgICAgIHBhcmFtc19yYXRlKHBhcmFtcykgKiA1MTIsCiAJCQkJICAgICBTTkRfU09DX0NMT0NLX0lOKTsKKwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIocnRkLT5kZXYsICJjYW4ndCBzZXQgY29kZWMgY2xvY2sgJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIDAsIFJUNTY0MF9QTEwxX1NfQkNMSzEsCi0JCQkJICBwYXJhbXNfcmF0ZShwYXJhbXMpICogNTAsCi0JCQkJICBwYXJhbXNfcmF0ZShwYXJhbXMpICogNTEyKTsKKwlpZiAoIShieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9NQ0xLX0VOKSkgeworCQkvKiB1c2UgYml0Y2xvY2sgYXMgUExMIGlucHV0ICovCisJCWlmICgoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfU1NQMF9BSUYxKSB8fAorCQkJKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX1NTUDBfQUlGMikpIHsKKworCQkJLyogMngxNiBiaXQgc2xvdHMgb24gU1NQMCAqLworCQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIDAsCisJCQkJCQlSVDU2NDBfUExMMV9TX0JDTEsxLAorCQkJCQkJcGFyYW1zX3JhdGUocGFyYW1zKSAqIDMyLAorCQkJCQkJcGFyYW1zX3JhdGUocGFyYW1zKSAqIDUxMik7CisJCX0gZWxzZSB7CisJCQkvKiAyeDE1IGJpdCBzbG90cyBvbiBTU1AyICovCisJCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfcGxsKGNvZGVjX2RhaSwgMCwKKwkJCQkJCVJUNTY0MF9QTEwxX1NfQkNMSzEsCisJCQkJCQlwYXJhbXNfcmF0ZShwYXJhbXMpICogNTAsCisJCQkJCQlwYXJhbXNfcmF0ZShwYXJhbXMpICogNTEyKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9NQ0xLXzI1TUhaKSB7CisJCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfcGxsKGNvZGVjX2RhaSwgMCwKKwkJCQkJCVJUNTY0MF9QTEwxX1NfTUNMSywKKwkJCQkJCTI1MDAwMDAwLAorCQkJCQkJcGFyYW1zX3JhdGUocGFyYW1zKSAqIDUxMik7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfcGxsKGNvZGVjX2RhaSwgMCwKKwkJCQkJCVJUNTY0MF9QTEwxX1NfTUNMSywKKwkJCQkJCTE5MjAwMDAwLAorCQkJCQkJcGFyYW1zX3JhdGUocGFyYW1zKSAqIDUxMik7CisJCX0KKwl9CisKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIHBsbDogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CkBAIC0xMjcsMjcgKzMyMSw3MyBAQAogCXsKIAkJLmNhbGxiYWNrID0gYnl0X3J0NTY0MF9xdWlya19jYiwKIAkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBU1VTVGVLIENPTVBVVEVSIElOQy4iKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVDEwMFRBIiksCisJCQlETUlfRVhBQ1RfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBU1VTVGVLIENPTVBVVEVSIElOQy4iKSwKKwkJCURNSV9FWEFDVF9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVDEwMFRBIiksCiAJCX0sCi0JCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nICopQllUX1JUNTY0MF9JTjFfTUFQLAorCQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZyAqKShCWVRfUlQ1NjQwX0lOMV9NQVAgfAorCQkJCQkJIEJZVF9SVDU2NDBfTUNMS19FTiksCiAJfSwKIAl7CiAJCS5jYWxsYmFjayA9IGJ5dF9ydDU2NDBfcXVpcmtfY2IsCiAJCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbEluYy4iKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVmVudWUgOCBQcm8gNTgzMCIpLAorCQkJRE1JX0VYQUNUX01BVENIKERNSV9TWVNfVkVORE9SLCAiQVNVU1RlSyBDT01QVVRFUiBJTkMuIiksCisJCQlETUlfRVhBQ1RfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlQxMDBUQUYiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcgKikoQllUX1JUNTY0MF9JTjFfTUFQIHwKKwkJCQkJCSBCWVRfUlQ1NjQwX01PTk9fU1BFQUtFUiB8CisJCQkJCQkgQllUX1JUNTY0MF9ESUZGX01JQyB8CisJCQkJCQkgQllUX1JUNTY0MF9TU1AwX0FJRjIgfAorCQkJCQkJIEJZVF9SVDU2NDBfTUNMS19FTgorCQkJCQkJICksCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IGJ5dF9ydDU2NDBfcXVpcmtfY2IsCisJCS5tYXRjaGVzID0geworCQkJRE1JX0VYQUNUX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbEluYy4iKSwKKwkJCURNSV9FWEFDVF9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVmVudWUgOCBQcm8gNTgzMCIpLAogCQl9LAogCQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZyAqKShCWVRfUlQ1NjQwX0RNSUMyX01BUCB8CisJCQkJCQkgQllUX1JUNTY0MF9ETUlDX0VOIHwKKwkJCQkJCSBCWVRfUlQ1NjQwX01DTEtfRU4pLAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBieXRfcnQ1NjQwX3F1aXJrX2NiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9FWEFDVF9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkhld2xldHQtUGFja2FyZCIpLAorCQkJRE1JX0VYQUNUX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJIUCBFbGl0ZVBhZCAxMDAwIEcyIiksCisJCX0sCisJCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nICopKEJZVF9SVDU2NDBfSU4xX01BUCB8CisJCQkJCQkgQllUX1JUNTY0MF9NQ0xLX0VOKSwKKwl9LAorCXsKKwkJLmNhbGxiYWNrID0gYnl0X3J0NTY0MF9xdWlya19jYiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJDaXJjdWl0Y28iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWlubm93Ym9hcmQgTWF4IEIzIFBMQVRGT1JNIiksCisJCX0sCisJCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nICopKEJZVF9SVDU2NDBfRE1JQzFfTUFQIHwKIAkJCQkJCSBCWVRfUlQ1NjQwX0RNSUNfRU4pLAogCX0sCiAJewogCQkuY2FsbGJhY2sgPSBieXRfcnQ1NjQwX3F1aXJrX2NiLAogCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkhld2xldHQtUGFja2FyZCIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJIUCBFbGl0ZVBhZCAxMDAwIEcyIiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIlRFQ0xBU1QiKSwKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgInRQQUQiKSwKIAkJfSwKLQkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcgKilCWVRfUlQ1NjQwX0lOMV9NQVAsCisJCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nICopKEJZVF9SVDU2NDBfSU4zX01BUCB8CisJCQkJCQlCWVRfUlQ1NjQwX01DTEtfRU4gfAorCQkJCQkJQllUX1JUNTY0MF9TU1AwX0FJRjEpLAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBieXRfcnQ1NjQwX3F1aXJrX2NiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIFNXNS0wMTIiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcgKikoQllUX1JUNTY0MF9JTjFfTUFQIHwKKwkJCQkJCSBCWVRfUlQ1NjQwX01DTEtfRU4gfAorCQkJCQkJIEJZVF9SVDU2NDBfU1NQMF9BSUYxKSwKKwogCX0sCiAJe30KIH07CkBAIC0xNTgsMTMgKzM5OCwxOCBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ1bnRpbWUtPmNvZGVjOwogCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBydW50aW1lLT5jYXJkOwogCWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgKmN1c3RvbV9tYXA7CisJc3RydWN0IGJ5dF9ydDU2NDBfcHJpdmF0ZSAqcHJpdiA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKIAlpbnQgbnVtX3JvdXRlczsKIAogCWNhcmQtPmRhcG0uaWRsZV9iaWFzX29mZiA9IHRydWU7CiAKIAlydDU2NDBfc2VsX2FzcmNfY2xrX3NyYyhjb2RlYywKIAkJCQlSVDU2NDBfREFfU1RFUkVPX0ZJTFRFUiB8Ci0JCQkJUlQ1NjQwX0FEX1NURVJFT19GSUxURVIsCisJCQkJUlQ1NjQwX0RBX01PTk9fTF9GSUxURVIJfAorCQkJCVJUNTY0MF9EQV9NT05PX1JfRklMVEVSCXwKKwkJCQlSVDU2NDBfQURfU1RFUkVPX0ZJTFRFUgl8CisJCQkJUlQ1NjQwX0FEX01PTk9fTF9GSUxURVIJfAorCQkJCVJUNTY0MF9BRF9NT05PX1JfRklMVEVSLAogCQkJCVJUNTY0MF9DTEtfU0VMX0FTUkMpOwogCiAJcmV0ID0gc25kX3NvY19hZGRfY2FyZF9jb250cm9scyhjYXJkLCBieXRfcnQ1NjQwX2NvbnRyb2xzLApAQCAtMTc5LDYgKzQyNCwxMCBAQAogCQljdXN0b21fbWFwID0gYnl0X3J0NTY0MF9pbnRtaWNfaW4xX21hcDsKIAkJbnVtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYnl0X3J0NTY0MF9pbnRtaWNfaW4xX21hcCk7CiAJCWJyZWFrOworCWNhc2UgQllUX1JUNTY0MF9JTjNfTUFQOgorCQljdXN0b21fbWFwID0gYnl0X3J0NTY0MF9pbnRtaWNfaW4zX21hcDsKKwkJbnVtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYnl0X3J0NTY0MF9pbnRtaWNfaW4zX21hcCk7CisJCWJyZWFrOwogCWNhc2UgQllUX1JUNTY0MF9ETUlDMl9NQVA6CiAJCWN1c3RvbV9tYXAgPSBieXRfcnQ1NjQwX2ludG1pY19kbWljMl9tYXA7CiAJCW51bV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfaW50bWljX2RtaWMyX21hcCk7CkBAIC0xOTIsNiArNDQxLDQzIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCWlmIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9TU1AyX0FJRjIpIHsKKwkJcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoJmNhcmQtPmRhcG0sCisJCQkJCWJ5dF9ydDU2NDBfc3NwMl9haWYyX21hcCwKKwkJCQkJQVJSQVlfU0laRShieXRfcnQ1NjQwX3NzcDJfYWlmMl9tYXApKTsKKwl9IGVsc2UgaWYgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX1NTUDBfQUlGMSkgeworCQlyZXQgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcygmY2FyZC0+ZGFwbSwKKwkJCQkJYnl0X3J0NTY0MF9zc3AwX2FpZjFfbWFwLAorCQkJCQlBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfc3NwMF9haWYxX21hcCkpOworCX0gZWxzZSBpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfU1NQMF9BSUYyKSB7CisJCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKCZjYXJkLT5kYXBtLAorCQkJCQlieXRfcnQ1NjQwX3NzcDBfYWlmMl9tYXAsCisJCQkJCUFSUkFZX1NJWkUoYnl0X3J0NTY0MF9zc3AwX2FpZjJfbWFwKSk7CisJfSBlbHNlIHsKKwkJcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoJmNhcmQtPmRhcG0sCisJCQkJCWJ5dF9ydDU2NDBfc3NwMl9haWYxX21hcCwKKwkJCQkJQVJSQVlfU0laRShieXRfcnQ1NjQwX3NzcDJfYWlmMV9tYXApKTsKKwl9CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9NT05PX1NQRUFLRVIpIHsKKwkJcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoJmNhcmQtPmRhcG0sCisJCQkJCWJ5dF9ydDU2NDBfbW9ub19zcGtfbWFwLAorCQkJCQlBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfbW9ub19zcGtfbWFwKSk7CisJfSBlbHNlIHsKKwkJcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoJmNhcmQtPmRhcG0sCisJCQkJCWJ5dF9ydDU2NDBfc3RlcmVvX3Nwa19tYXAsCisJCQkJCUFSUkFZX1NJWkUoYnl0X3J0NTY0MF9zdGVyZW9fc3BrX21hcCkpOworCX0KKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX0RJRkZfTUlDKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsICBSVDU2NDBfSU4xX0lOMiwgUlQ1NjQwX0lOX0RGMSwKKwkJCQkgICAgUlQ1NjQwX0lOX0RGMSk7CisJfQorCiAJaWYgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX0RNSUNfRU4pIHsKIAkJcmV0ID0gcnQ1NjQwX2RtaWNfZW5hYmxlKGNvZGVjLCAwLCAwKTsKIAkJaWYgKHJldCkKQEAgLTIwMSw2ICs0ODcsMzAgQEAKIAlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoJmNhcmQtPmRhcG0sICJIZWFkcGhvbmUiKTsKIAlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoJmNhcmQtPmRhcG0sICJTcGVha2VyIik7CiAKKwlpZiAoKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX01DTEtfRU4pICYmIHByaXYtPm1jbGspIHsKKwkJLyoKKwkJICogVGhlIGZpcm13YXJlIG1pZ2h0IGVuYWJsZSB0aGUgY2xvY2sgYXQKKwkJICogYm9vdCAodGhpcyBpbmZvcm1hdGlvbiBtYXkgb3IgbWF5IG5vdAorCQkgKiBiZSByZWZsZWN0ZWQgaW4gdGhlIGVuYWJsZSBjbG9jayByZWdpc3RlcikuCisJCSAqIFRvIGNoYW5nZSB0aGUgcmF0ZSB3ZSBtdXN0IGRpc2FibGUgdGhlIGNsb2NrCisJCSAqIGZpcnN0IHRvIGNvdmVyIHRoZXNlIGNhc2VzLiBEdWUgdG8gY29tbW9uCisJCSAqIGNsb2NrIGZyYW1ld29yayByZXN0cmljdGlvbnMgdGhhdCBkbyBub3QgYWxsb3cKKwkJICogdG8gZGlzYWJsZSBhIGNsb2NrIHRoYXQgaGFzIG5vdCBiZWVuIGVuYWJsZWQsCisJCSAqIHdlIG5lZWQgdG8gZW5hYmxlIHRoZSBjbG9jayBmaXJzdC4KKwkJICovCisJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwcml2LT5tY2xrKTsKKwkJaWYgKCFyZXQpCisJCQljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+bWNsayk7CisKKwkJaWYgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX01DTEtfMjVNSFopCisJCQlyZXQgPSBjbGtfc2V0X3JhdGUocHJpdi0+bWNsaywgMjUwMDAwMDApOworCQllbHNlCisJCQlyZXQgPSBjbGtfc2V0X3JhdGUocHJpdi0+bWNsaywgMTkyMDAwMDApOworCisJCWlmIChyZXQpCisJCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBzZXQgTUNMSyByYXRlXG4iKTsKKwl9CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMjEsMzQgKzUzMSw2MyBAQAogCQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKIAlpbnQgcmV0OwogCi0JLyogVGhlIERTUCB3aWxsIGNvdmVydCB0aGUgRkUgcmF0ZSB0byA0OGssIHN0ZXJlbywgMjRiaXRzICovCisJLyogVGhlIERTUCB3aWxsIGNvdmVydCB0aGUgRkUgcmF0ZSB0byA0OGssIHN0ZXJlbyAqLwogCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IDQ4MDAwOwogCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gMjsKIAotCS8qIHNldCBTU1AyIHRvIDI0LWJpdCAqLwotCXBhcmFtc19zZXRfZm9ybWF0KHBhcmFtcywgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEUpOworCWlmICgoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfU1NQMF9BSUYxKSB8fAorCQkoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfU1NQMF9BSUYyKSkgewogCi0JLyoKLQkgKiBEZWZhdWx0IG1vZGUgZm9yIFNTUCBjb25maWd1cmF0aW9uIGlzIFRETSA0IHNsb3QsIG92ZXJyaWRlIGNvbmZpZwotCSAqIHdpdGggZXhwbGljaXQgc2V0dGluZyB0byBJMlMgMmNoIDI0LWJpdC4gVGhlIHdvcmQgbGVuZ3RoIGlzIHNldCB3aXRoCi0JICogZGFpX3NldF90ZG1fc2xvdCgpIHNpbmNlIHRoZXJlIGlzIG5vIG90aGVyIEFQSSBleHBvc2VkCi0JICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChydGQtPmNwdV9kYWksCi0JCQkJICBTTkRfU09DX0RBSUZNVF9JMlMgICAgIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX0lGICAgfAotCQkJCSAgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUwotCQkJCSAgKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY2FuJ3Qgc2V0IGZvcm1hdCB0byBJMlMsIGVyciAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKKwkJLyogc2V0IFNTUDAgdG8gMTYtYml0ICovCisJCXBhcmFtc19zZXRfZm9ybWF0KHBhcmFtcywgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpOworCisJCS8qCisJCSAqIERlZmF1bHQgbW9kZSBmb3IgU1NQIGNvbmZpZ3VyYXRpb24gaXMgVERNIDQgc2xvdCwgb3ZlcnJpZGUgY29uZmlnCisJCSAqIHdpdGggZXhwbGljaXQgc2V0dGluZyB0byBJMlMgMmNoIDE2LWJpdC4gVGhlIHdvcmQgbGVuZ3RoIGlzIHNldCB3aXRoCisJCSAqIGRhaV9zZXRfdGRtX3Nsb3QoKSBzaW5jZSB0aGVyZSBpcyBubyBvdGhlciBBUEkgZXhwb3NlZAorCQkgKi8KKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChydGQtPmNwdV9kYWksCisJCQkJCVNORF9TT0NfREFJRk1UX0kyUyAgICAgfAorCQkJCQlTTkRfU09DX0RBSUZNVF9OQl9JRiAgIHwKKwkJCQkJU05EX1NPQ19EQUlGTVRfQ0JTX0NGUworCQkJKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsICJjYW4ndCBzZXQgZm9ybWF0IHRvIEkyUywgZXJyICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdChydGQtPmNwdV9kYWksIDB4MywgMHgzLCAyLCAxNik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY2FuJ3Qgc2V0IEkyUyBjb25maWcsIGVyciAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCX0gZWxzZSB7CisKKwkJLyogc2V0IFNTUDIgdG8gMjQtYml0ICovCisJCXBhcmFtc19zZXRfZm9ybWF0KHBhcmFtcywgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEUpOworCisJCS8qCisJCSAqIERlZmF1bHQgbW9kZSBmb3IgU1NQIGNvbmZpZ3VyYXRpb24gaXMgVERNIDQgc2xvdCwgb3ZlcnJpZGUgY29uZmlnCisJCSAqIHdpdGggZXhwbGljaXQgc2V0dGluZyB0byBJMlMgMmNoIDI0LWJpdC4gVGhlIHdvcmQgbGVuZ3RoIGlzIHNldCB3aXRoCisJCSAqIGRhaV9zZXRfdGRtX3Nsb3QoKSBzaW5jZSB0aGVyZSBpcyBubyBvdGhlciBBUEkgZXhwb3NlZAorCQkgKi8KKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChydGQtPmNwdV9kYWksCisJCQkJCVNORF9TT0NfREFJRk1UX0kyUyAgICAgfAorCQkJCQlTTkRfU09DX0RBSUZNVF9OQl9JRiAgIHwKKwkJCQkJU05EX1NPQ19EQUlGTVRfQ0JTX0NGUworCQkJKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsICJjYW4ndCBzZXQgZm9ybWF0IHRvIEkyUywgZXJyICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdChydGQtPmNwdV9kYWksIDB4MywgMHgzLCAyLCAyNCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY2FuJ3Qgc2V0IEkyUyBjb25maWcsIGVyciAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAl9Ci0KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QocnRkLT5jcHVfZGFpLCAweDMsIDB4MywgMiwgMjQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsICJjYW4ndCBzZXQgSTJTIGNvbmZpZywgZXJyICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldHVybiAwOwogfQogCkBAIC0zMDUsMTAgKzY0NCwxMCBAQAogCXsKIAkJLm5hbWUgPSAiU1NQMi1Db2RlYyIsCiAJCS5pZCA9IDEsCi0JCS5jcHVfZGFpX25hbWUgPSAic3NwMi1wb3J0IiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJzc3AyLXBvcnQiLCAvKiBvdmVyd3JpdHRlbiBmb3Igc3NwMCByb3V0aW5nICovCiAJCS5wbGF0Zm9ybV9uYW1lID0gInNzdC1tZmxkLXBsYXRmb3JtIiwKIAkJLm5vX3BjbSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJydDU2NDAtYWlmMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJydDU2NDAtYWlmMSIsIC8qIGNoYW5nZWQgdy8gcXVpcmsgKi8KIAkJLmNvZGVjX25hbWUgPSAiaTJjLTEwRUM1NjQwOjAwIiwgLyogb3ZlcndyaXR0ZW4gd2l0aCBISUQgKi8KIAkJLmRhaV9mbXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9ORgogCQkJCQkJfCBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLApAQCAtMzM1LDYgKzY3NCwyMSBAQAogfTsKIAogc3RhdGljIGNoYXIgYnl0X3J0NTY0MF9jb2RlY19uYW1lWzE2XTsgLyogaTJjLTxISUQ+OjAwIHdpdGggSElEIGJlaW5nIDggY2hhcnMgKi8KK3N0YXRpYyBjaGFyIGJ5dF9ydDU2NDBfY29kZWNfYWlmX25hbWVbMTJdOyAvKiAgPSAicnQ1NjQwLWFpZlsxfDJdIiAqLworc3RhdGljIGNoYXIgYnl0X3J0NTY0MF9jcHVfZGFpX25hbWVbMTBdOyAvKiAgPSAic3NwWzB8Ml0tcG9ydCIgKi8KKworc3RhdGljIGJvb2wgaXNfdmFsbGV5dmlldyh2b2lkKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeDg2X2NwdV9pZCBjcHVfaWRzW10gPSB7CisJCXsgWDg2X1ZFTkRPUl9JTlRFTCwgNiwgNTUgfSwgLyogVmFsbGV5dmlldywgQmF5IFRyYWlsICovCisJCXt9CisJfTsKKworCWlmICgheDg2X21hdGNoX2NwdShjcHVfaWRzKSkKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorCiAKIHN0YXRpYyBpbnQgc25kX2J5dF9ydDU2NDBfbWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKQEAgLTM0MywxMCArNjk3LDE2IEBACiAJY29uc3QgY2hhciAqaTJjX25hbWUgPSBOVUxMOwogCWludCBpOwogCWludCBkYWlfaW5kZXg7CisJc3RydWN0IGJ5dF9ydDU2NDBfcHJpdmF0ZSAqcHJpdjsKKworCXByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIHJlZ2lzdGVyIHRoZSBzb2MgY2FyZCAqLwogCWJ5dF9ydDU2NDBfY2FyZC5kZXYgPSAmcGRldi0+ZGV2OwogCW1hY2ggPSBieXRfcnQ1NjQwX2NhcmQuZGV2LT5wbGF0Zm9ybV9kYXRhOworCXNuZF9zb2NfY2FyZF9zZXRfZHJ2ZGF0YSgmYnl0X3J0NTY0MF9jYXJkLCBwcml2KTsKIAogCS8qIGZpeCBpbmRleCBvZiBjb2RlYyBkYWkgKi8KIAlkYWlfaW5kZXggPSBNRVJSX0RQQ01fQ09NUFIgKyAxOwpAQCAtMzY2LDggKzcyNiw1NyBAQAogCQlieXRfcnQ1NjQwX2RhaXNbZGFpX2luZGV4XS5jb2RlY19uYW1lID0gYnl0X3J0NTY0MF9jb2RlY19uYW1lOwogCX0KIAorCS8qCisJICogc3dhcCBTU1AwIGlmIGJ5dGNyIGlzIGRldGVjdGVkCisJICogKHdpbGwgYmUgb3ZlcnJpZGRlbiBpZiBETUkgcXVpcmsgaXMgZGV0ZWN0ZWQpCisJICovCisJaWYgKGlzX3ZhbGxleXZpZXcoKSkgeworCQlzdHJ1Y3Qgc3N0X3BsYXRmb3JtX2luZm8gKnBfaW5mbyA9IG1hY2gtPnBkYXRhOworCQljb25zdCBzdHJ1Y3Qgc3N0X3Jlc19pbmZvICpyZXNfaW5mbyA9IHBfaW5mby0+cmVzX2luZm87CisKKwkJLyogVE9ETzogdXNlIENIQU4gcGFja2FnZSBpbmZvIGZyb20gQklPUyB0byBkZXRlY3QgQUlGMS9BSUYyICovCisJCWlmIChyZXNfaW5mby0+YWNwaV9pcGNfaXJxX2luZGV4ID09IDApIHsKKwkJCWJ5dF9ydDU2NDBfcXVpcmsgfD0gQllUX1JUNTY0MF9TU1AwX0FJRjI7CisJCX0KKwl9CisKIAkvKiBjaGVjayBxdWlya3MgYmVmb3JlIGNyZWF0aW5nIGNhcmQgKi8KIAlkbWlfY2hlY2tfc3lzdGVtKGJ5dF9ydDU2NDBfcXVpcmtfdGFibGUpOworCWxvZ19xdWlya3MoJnBkZXYtPmRldik7CisKKwlpZiAoKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX1NTUDJfQUlGMikgfHwKKwkgICAgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX1NTUDBfQUlGMikpIHsKKworCQkvKiBmaXh1cCBjb2RlYyBhaWYgbmFtZSAqLworCQlzbnByaW50ZihieXRfcnQ1NjQwX2NvZGVjX2FpZl9uYW1lLAorCQkJc2l6ZW9mKGJ5dF9ydDU2NDBfY29kZWNfYWlmX25hbWUpLAorCQkJIiVzIiwgInJ0NTY0MC1haWYyIik7CisKKwkJYnl0X3J0NTY0MF9kYWlzW2RhaV9pbmRleF0uY29kZWNfZGFpX25hbWUgPQorCQkJYnl0X3J0NTY0MF9jb2RlY19haWZfbmFtZTsKKwl9CisKKwlpZiAoKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX1NTUDBfQUlGMSkgfHwKKwkgICAgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX1NTUDBfQUlGMikpIHsKKworCQkvKiBmaXh1cCBjcHUgZGFpIG5hbWUgbmFtZSAqLworCQlzbnByaW50ZihieXRfcnQ1NjQwX2NwdV9kYWlfbmFtZSwKKwkJCXNpemVvZihieXRfcnQ1NjQwX2NwdV9kYWlfbmFtZSksCisJCQkiJXMiLCAic3NwMC1wb3J0Iik7CisKKwkJYnl0X3J0NTY0MF9kYWlzW2RhaV9pbmRleF0uY3B1X2RhaV9uYW1lID0KKwkJCWJ5dF9ydDU2NDBfY3B1X2RhaV9uYW1lOworCX0KKworCWlmICgoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfTUNMS19FTikgJiYgKGlzX3ZhbGxleXZpZXcoKSkpIHsKKwkJcHJpdi0+bWNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAicG1jX3BsdF9jbGtfMyIpOworCQlpZiAoSVNfRVJSKHByaXYtPm1jbGspKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkZhaWxlZCB0byBnZXQgTUNMSyBmcm9tIHBtY19wbHRfY2xrXzM6ICVsZFxuIiwKKwkJCQlQVFJfRVJSKHByaXYtPm1jbGspKTsKKwkJCXJldHVybiBQVFJfRVJSKHByaXYtPm1jbGspOworCQl9CisJfQogCiAJcmV0X3ZhbCA9IGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsICZieXRfcnQ1NjQwX2NhcmQpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvY29tbW9uL3NzdC1hY3BpLmMgYi9zb3VuZC9zb2MvaW50ZWwvY29tbW9uL3NzdC1hY3BpLmMKaW5kZXggMmM1ZWRhMS4uMTI4NWNjNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL2NvbW1vbi9zc3QtYWNwaS5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9jb21tb24vc3N0LWFjcGkuYwpAQCAtMTk5LDYgKzE5OSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfbWFjaCBicm9hZHdlbGxfbWFjaGluZXNbXSA9IHsKIAl7ICJJTlQzNDNBIiwgImJyb2Fkd2VsbC1hdWRpbyIsICJpbnRlbC9JbnRjU1NUMi5iaW4iLCBOVUxMLCBOVUxMLCBOVUxMIH0sCisJeyAiUlQ1Njc3Q0UiLCAiYmR3LXJ0NTY3NyIsICJpbnRlbC9JbnRjU1NUMi5iaW4iLCBOVUxMLCBOVUxMLCBOVUxMIH0sCiAJe30KIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9oYXN3ZWxsL3NzdC1oYXN3ZWxsLXBjbS5jIGIvc291bmQvc29jL2ludGVsL2hhc3dlbGwvc3N0LWhhc3dlbGwtcGNtLmMKaW5kZXggMzE1NDUyNS4uOWU0MDk0ZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL2hhc3dlbGwvc3N0LWhhc3dlbGwtcGNtLmMKKysrIGIvc291bmQvc29jL2ludGVsL2hhc3dlbGwvc3N0LWhhc3dlbGwtcGNtLmMKQEAgLTg3MSw3ICs4NzEsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgaHN3X3BjbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIGhzd19wY21fb3BzID0gewogCS5vcGVuCQk9IGhzd19wY21fb3BlbiwKIAkuY2xvc2UJCT0gaHN3X3BjbV9jbG9zZSwKIAkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9ieHQtc3N0LmMgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9ieHQtc3N0LmMKaW5kZXggMjY2Mzc4MS4uMWQyNTFkNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL3NreWxha2UvYnh0LXNzdC5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL2J4dC1zc3QuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgIi4uL2NvbW1vbi9zc3QtZHNwLmgiCiAjaW5jbHVkZSAiLi4vY29tbW9uL3NzdC1kc3AtcHJpdi5oIgogI2luY2x1ZGUgInNrbC1zc3QtaXBjLmgiCisjaW5jbHVkZSAic2tsLXRwbGctaW50ZXJmYWNlLmgiCiAKICNkZWZpbmUgQlhUX0JBU0VGV19USU1FT1VUCTMwMDAKICNkZWZpbmUgQlhUX0lOSVRfVElNRU9VVAk1MDAKQEAgLTQwLDExICs0MSw3MyBAQAogI2RlZmluZSBCWFRfSU5TVEFOQ0VfSUQgMAogI2RlZmluZSBCWFRfQkFTRV9GV19NT0RVTEVfSUQgMAogCisjZGVmaW5lIEJYVF9BRFNQX0ZXX0JJTl9IRFJfT0ZGU0VUIDB4MjAwMAorCiBzdGF0aWMgdW5zaWduZWQgaW50IGJ4dF9nZXRfZXJyb3Jjb2RlKHN0cnVjdCBzc3RfZHNwICpjdHgpCiB7CiAJIHJldHVybiBzc3RfZHNwX3NoaW1fcmVhZChjdHgsIEJYVF9BRFNQX0VSUk9SX0NPREUpOwogfQogCitzdGF0aWMgaW50CitieHRfbG9hZF9saWJyYXJ5KHN0cnVjdCBzc3RfZHNwICpjdHgsIHN0cnVjdCBza2xfZGZ3X21hbmlmZXN0ICptaW5mbykKK3sKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgZG1hYjsKKwlzdHJ1Y3Qgc2tsX3NzdCAqc2tsID0gY3R4LT50aHJlYWRfY29udGV4dDsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3ID0gTlVMTDsKKwlzdHJ1Y3QgZmlybXdhcmUgc3RyaXBwZWRfZnc7CisJaW50IHJldCA9IDAsIGksIGRtYV9pZCwgc3RyZWFtX3RhZzsKKworCS8qIGxpYnJhcnkgaW5kaWNlcyBzdGFydCBmcm9tIDEgdG8gTi4gMCByZXByZXNlbnRzIGJhc2UgRlcgKi8KKwlmb3IgKGkgPSAxOyBpIDwgbWluZm8tPmxpYl9jb3VudDsgaSsrKSB7CisJCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBtaW5mby0+bGliW2ldLm5hbWUsIGN0eC0+ZGV2KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoY3R4LT5kZXYsICJSZXF1ZXN0IGxpYiAlcyBmYWlsZWQ6JWRcbiIsCisJCQkJCW1pbmZvLT5saWJbaV0ubmFtZSwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAoc2tsLT5pc19maXJzdF9ib290KSB7CisJCQlyZXQgPSBzbmRfc2tsX3BhcnNlX3V1aWRzKGN0eCwgZncsCisJCQkJCUJYVF9BRFNQX0ZXX0JJTl9IRFJfT0ZGU0VULCBpKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gbG9hZF9saWJyYXJ5X2ZhaWxlZDsKKwkJfQorCisJCXN0cmlwcGVkX2Z3LmRhdGEgPSBmdy0+ZGF0YTsKKwkJc3RyaXBwZWRfZncuc2l6ZSA9IGZ3LT5zaXplOworCQlza2xfZHNwX3N0cmlwX2V4dGVuZGVkX21hbmlmZXN0KCZzdHJpcHBlZF9mdyk7CisKKwkJc3RyZWFtX3RhZyA9IGN0eC0+ZHNwX29wcy5wcmVwYXJlKGN0eC0+ZGV2LCAweDQwLAorCQkJCQlzdHJpcHBlZF9mdy5zaXplLCAmZG1hYik7CisJCWlmIChzdHJlYW1fdGFnIDw9IDApIHsKKwkJCWRldl9lcnIoY3R4LT5kZXYsICJMaWIgcHJlcGFyZSBETUEgZXJyOiAleFxuIiwKKwkJCQkJc3RyZWFtX3RhZyk7CisJCQlyZXQgPSBzdHJlYW1fdGFnOworCQkJZ290byBsb2FkX2xpYnJhcnlfZmFpbGVkOworCQl9CisKKwkJZG1hX2lkID0gc3RyZWFtX3RhZyAtIDE7CisJCW1lbWNweShkbWFiLmFyZWEsIHN0cmlwcGVkX2Z3LmRhdGEsIHN0cmlwcGVkX2Z3LnNpemUpOworCisJCWN0eC0+ZHNwX29wcy50cmlnZ2VyKGN0eC0+ZGV2LCB0cnVlLCBzdHJlYW1fdGFnKTsKKwkJcmV0ID0gc2tsX3NzdF9pcGNfbG9hZF9saWJyYXJ5KCZza2wtPmlwYywgZG1hX2lkLCBpKTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfZXJyKGN0eC0+ZGV2LCAiSVBDIExvYWQgTGliIGZvciAlcyBmYWlsOiAlZFxuIiwKKwkJCQkJbWluZm8tPmxpYltpXS5uYW1lLCByZXQpOworCisJCWN0eC0+ZHNwX29wcy50cmlnZ2VyKGN0eC0+ZGV2LCBmYWxzZSwgc3RyZWFtX3RhZyk7CisJCWN0eC0+ZHNwX29wcy5jbGVhbnVwKGN0eC0+ZGV2LCAmZG1hYiwgc3RyZWFtX3RhZyk7CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQlmdyA9IE5VTEw7CisJfQorCisJcmV0dXJuIHJldDsKKworbG9hZF9saWJyYXJ5X2ZhaWxlZDoKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwlyZXR1cm4gcmV0OworfQorCiAvKgogICogRmlyc3QgYm9vdCBzZXF1ZW5jZSBoYXMgc29tZSBleHRyYSBzdGVwcy4gQ29yZSAwIHdhaXRzIGZvciBwb3dlcgogICogc3RhdHVzIG9uIGNvcmUgMSwgc28gcG93ZXIgdXAgY29yZSAxIGFsc28gbW9tZW50YXJpbHksIGtlZXAgaXQgaW4KQEAgLTE1Nyw4ICsyMjAsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNkZWZpbmUgQlhUX0FEU1BfRldfQklOX0hEUl9PRkZTRVQgMHgyMDAwCi0KIHN0YXRpYyBpbnQgYnh0X2xvYWRfYmFzZV9maXJtd2FyZShzdHJ1Y3Qgc3N0X2RzcCAqY3R4KQogewogCXN0cnVjdCBmaXJtd2FyZSBzdHJpcHBlZF9mdzsKQEAgLTE3NSw5ICsyMzYsMTIgQEAKIAlpZiAoY3R4LT5mdyA9PSBOVUxMKQogCQlnb3RvIHNzdF9sb2FkX2Jhc2VfZmlybXdhcmVfZmFpbGVkOwogCi0JcmV0ID0gc25kX3NrbF9wYXJzZV91dWlkcyhjdHgsIEJYVF9BRFNQX0ZXX0JJTl9IRFJfT0ZGU0VUKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBzc3RfbG9hZF9iYXNlX2Zpcm13YXJlX2ZhaWxlZDsKKwkvKiBwcmFzZSB1dWlkcyBvbiBmaXJzdCBib290ICovCisJaWYgKHNrbC0+aXNfZmlyc3RfYm9vdCkgeworCQlyZXQgPSBzbmRfc2tsX3BhcnNlX3V1aWRzKGN0eCwgY3R4LT5mdywgQlhUX0FEU1BfRldfQklOX0hEUl9PRkZTRVQsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gc3N0X2xvYWRfYmFzZV9maXJtd2FyZV9mYWlsZWQ7CisJfQogCiAJc3RyaXBwZWRfZncuZGF0YSA9IGN0eC0+ZnctPmRhdGE7CiAJc3RyaXBwZWRfZncuc2l6ZSA9IGN0eC0+ZnctPnNpemU7CkBAIC0yMzAsMTIgKzI5NCwyMyBAQAogCWludCByZXQ7CiAJc3RydWN0IHNrbF9pcGNfZHhzdGF0ZV9pbmZvIGR4OwogCXVuc2lnbmVkIGludCBjb3JlX21hc2sgPSBTS0xfRFNQX0NPUkVfTUFTSyhjb3JlX2lkKTsKKwlzdHJ1Y3Qgc2tsX2Rmd19tYW5pZmVzdCAqbWluZm8gPSAmc2tsLT5tYW5pZmVzdDsKIAogCWlmIChza2wtPmZ3X2xvYWRlZCA9PSBmYWxzZSkgewogCQlza2wtPmJvb3RfY29tcGxldGUgPSBmYWxzZTsKIAkJcmV0ID0gYnh0X2xvYWRfYmFzZV9maXJtd2FyZShjdHgpOwotCQlpZiAocmV0IDwgMCkKKwkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoY3R4LT5kZXYsICJyZWxvYWQgZncgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAobWluZm8tPmxpYl9jb3VudCA+IDEpIHsKKwkJCXJldCA9IGJ4dF9sb2FkX2xpYnJhcnkoY3R4LCBtaW5mbyk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWRldl9lcnIoY3R4LT5kZXYsICJyZWxvYWQgbGlicyBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTMyOSw3ICs0MDQsNyBAQAogCiAJcmV0ID0gc2tsX2RzcF9kaXNhYmxlX2NvcmUoY3R4LCBjb3JlX21hc2spOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsICJGYWlsZWQgdG8gZGlzYWJsZSBjb3JlICVkIiwgcmV0KTsKKwkJZGV2X2VycihjdHgtPmRldiwgIkZhaWxlZCB0byBkaXNhYmxlIGNvcmUgJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCXNrbC0+Y29yZXMuc3RhdGVbY29yZV9pZF0gPSBTS0xfRFNQX1JFU0VUOwpAQCAtMzQxLDYgKzQxNiw3IEBACiAJLnNldF9zdGF0ZV9EMyA9IGJ4dF9zZXRfZHNwX0QzLAogCS5sb2FkX2Z3ID0gYnh0X2xvYWRfYmFzZV9maXJtd2FyZSwKIAkuZ2V0X2Z3X2VycmNvZGUgPSBieHRfZ2V0X2Vycm9yY29kZSwKKwkubG9hZF9saWJyYXJ5ID0gYnh0X2xvYWRfbGlicmFyeSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc3N0X29wcyBza2xfb3BzID0gewpAQCAtMzk3LDE0ICs0NzMsNyBAQAogCXNrbC0+Y29yZXMuY291bnQgPSAyOwogCXNrbC0+Ym9vdF9jb21wbGV0ZSA9IGZhbHNlOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNrbC0+Ym9vdF93YWl0KTsKLQotCXJldCA9IHNzdC0+Zndfb3BzLmxvYWRfZncoc3N0KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRldiwgIkxvYWQgYmFzZSBmdyBmYWlsZWQ6ICV4IiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlza2xfZHNwX2luaXRfY29yZV9zdGF0ZShzc3QpOworCXNrbC0+aXNfZmlyc3RfYm9vdCA9IHRydWU7CiAKIAlpZiAoZHNwKQogCQkqZHNwID0gc2tsOwpAQCAtNDEzLDYgKzQ4MiwzMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYnh0X3NzdF9kc3BfaW5pdCk7CiAKK2ludCBieHRfc3N0X2luaXRfZncoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2tsX3NzdCAqY3R4KQoreworCWludCByZXQ7CisJc3RydWN0IHNzdF9kc3AgKnNzdCA9IGN0eC0+ZHNwOworCisJcmV0ID0gc3N0LT5md19vcHMubG9hZF9mdyhzc3QpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiTG9hZCBiYXNlIGZ3IGZhaWxlZDogJXhcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc2tsX2RzcF9pbml0X2NvcmVfc3RhdGUoc3N0KTsKKworCWlmIChjdHgtPm1hbmlmZXN0LmxpYl9jb3VudCA+IDEpIHsKKwkJcmV0ID0gc3N0LT5md19vcHMubG9hZF9saWJyYXJ5KHNzdCwgJmN0eC0+bWFuaWZlc3QpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJMb2FkIExpYnJhcnkgZmFpbGVkIDogJXhcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCWN0eC0+aXNfZmlyc3RfYm9vdCA9IGZhbHNlOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChieHRfc3N0X2luaXRfZncpOwogCiB2b2lkIGJ4dF9zc3RfZHNwX2NsZWFudXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2tsX3NzdCAqY3R4KQogewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLW1lc3NhZ2VzLmMgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtbWVzc2FnZXMuYwppbmRleCA0NGFiNTk1Li44MDViN2YyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtbWVzc2FnZXMuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtbWVzc2FnZXMuYwpAQCAtMjAzLDMyICsyMDMsMzUgQEAKIAkJLmlkID0gMHg5ZDcwLAogCQkubG9hZGVyX29wcyA9IHNrbF9nZXRfbG9hZGVyX29wcywKIAkJLmluaXQgPSBza2xfc3N0X2RzcF9pbml0LAorCQkuaW5pdF9mdyA9IHNrbF9zc3RfaW5pdF9mdywKIAkJLmNsZWFudXAgPSBza2xfc3N0X2RzcF9jbGVhbnVwCiAJfSwKIAl7CiAJCS5pZCA9IDB4OWQ3MSwKIAkJLmxvYWRlcl9vcHMgPSBza2xfZ2V0X2xvYWRlcl9vcHMsCiAJCS5pbml0ID0gc2tsX3NzdF9kc3BfaW5pdCwKKwkJLmluaXRfZncgPSBza2xfc3N0X2luaXRfZncsCiAJCS5jbGVhbnVwID0gc2tsX3NzdF9kc3BfY2xlYW51cAogCX0sCiAJewogCQkuaWQgPSAweDVhOTgsCiAJCS5sb2FkZXJfb3BzID0gYnh0X2dldF9sb2FkZXJfb3BzLAogCQkuaW5pdCA9IGJ4dF9zc3RfZHNwX2luaXQsCisJCS5pbml0X2Z3ID0gYnh0X3NzdF9pbml0X2Z3LAogCQkuY2xlYW51cCA9IGJ4dF9zc3RfZHNwX2NsZWFudXAKIAl9LAogfTsKIAotc3RhdGljIGludCBza2xfZ2V0X2RzcF9vcHMoaW50IHBjaV9pZCkKK2NvbnN0IHN0cnVjdCBza2xfZHNwX29wcyAqc2tsX2dldF9kc3Bfb3BzKGludCBwY2lfaWQpCiB7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkc3Bfb3BzKTsgaSsrKSB7CiAJCWlmIChkc3Bfb3BzW2ldLmlkID09IHBjaV9pZCkKLQkJCXJldHVybiBpOworCQkJcmV0dXJuICZkc3Bfb3BzW2ldOwogCX0KIAotCXJldHVybiAtRUlOVkFMOworCXJldHVybiBOVUxMOwogfQogCiBpbnQgc2tsX2luaXRfZHNwKHN0cnVjdCBza2wgKnNrbCkKQEAgLTIzOCw3ICsyNDEsOCBAQAogCXN0cnVjdCBoZGFjX2J1cyAqYnVzID0gZWJ1c190b19oYnVzKGVidXMpOwogCXN0cnVjdCBza2xfZHNwX2xvYWRlcl9vcHMgbG9hZGVyX29wczsKIAlpbnQgaXJxID0gYnVzLT5pcnE7Ci0JaW50IHJldCwgaW5kZXg7CisJY29uc3Qgc3RydWN0IHNrbF9kc3Bfb3BzICpvcHM7CisJaW50IHJldDsKIAogCS8qIGVuYWJsZSBwcGNhcCBpbnRlcnJ1cHQgKi8KIAlzbmRfaGRhY19leHRfYnVzX3BwY2FwX2VuYWJsZSgmc2tsLT5lYnVzLCB0cnVlKTsKQEAgLTI1MSwxOCArMjU1LDE4IEBACiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0JaW5kZXggID0gc2tsX2dldF9kc3Bfb3BzKHNrbC0+cGNpLT5kZXZpY2UpOwotCWlmIChpbmRleCAgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlvcHMgPSBza2xfZ2V0X2RzcF9vcHMoc2tsLT5wY2ktPmRldmljZSk7CisJaWYgKCFvcHMpCisJCXJldHVybiAtRUlPOwogCi0JbG9hZGVyX29wcyA9IGRzcF9vcHNbaW5kZXhdLmxvYWRlcl9vcHMoKTsKLQlyZXQgPSBkc3Bfb3BzW2luZGV4XS5pbml0KGJ1cy0+ZGV2LCBtbWlvX2Jhc2UsIGlycSwKLQkJCXNrbC0+ZndfbmFtZSwgbG9hZGVyX29wcywgJnNrbC0+c2tsX3NzdCk7CisJbG9hZGVyX29wcyA9IG9wcy0+bG9hZGVyX29wcygpOworCXJldCA9IG9wcy0+aW5pdChidXMtPmRldiwgbW1pb19iYXNlLCBpcnEsCisJCQkJc2tsLT5md19uYW1lLCBsb2FkZXJfb3BzLAorCQkJCSZza2wtPnNrbF9zc3QpOwogCiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlza2xfZHNwX2VuYWJsZV9ub3RpZmljYXRpb24oc2tsLT5za2xfc3N0LCBmYWxzZSk7CiAJZGV2X2RiZyhidXMtPmRldiwgImRzcCByZWdpc3RyYXRpb24gc3RhdHVzPSVkXG4iLCByZXQpOwogCiAJcmV0dXJuIHJldDsKQEAgLTI3MywxNiArMjc3LDE2IEBACiAJc3RydWN0IGhkYWNfZXh0X2J1cyAqZWJ1cyA9ICZza2wtPmVidXM7CiAJc3RydWN0IGhkYWNfYnVzICpidXMgPSBlYnVzX3RvX2hidXMoZWJ1cyk7CiAJc3RydWN0IHNrbF9zc3QgKmN0eCA9IHNrbC0+c2tsX3NzdDsKLQlpbnQgaW5kZXg7CisJY29uc3Qgc3RydWN0IHNrbF9kc3Bfb3BzICpvcHM7CiAKIAkvKiBkaXNhYmxlICBwcGNhcCBpbnRlcnJ1cHQgKi8KIAlzbmRfaGRhY19leHRfYnVzX3BwY2FwX2ludF9lbmFibGUoJnNrbC0+ZWJ1cywgZmFsc2UpOwogCi0JaW5kZXggPSBza2xfZ2V0X2RzcF9vcHMoc2tsLT5wY2ktPmRldmljZSk7Ci0JaWYgKGluZGV4ICA8IDApCisJb3BzID0gc2tsX2dldF9kc3Bfb3BzKHNrbC0+cGNpLT5kZXZpY2UpOworCWlmICghb3BzKQogCQlyZXR1cm4gLUVJTzsKIAotCWRzcF9vcHNbaW5kZXhdLmNsZWFudXAoYnVzLT5kZXYsIGN0eCk7CisJb3BzLT5jbGVhbnVwKGJ1cy0+ZGV2LCBjdHgpOwogCiAJaWYgKGN0eC0+ZHNwLT5hZGRyLmxwZSkKIAkJaW91bm1hcChjdHgtPmRzcC0+YWRkci5scGUpOwpAQCAtMjk2LDcgKzMwMCw3IEBACiAJaW50IHJldDsKIAogCS8qIGlmIHBwY2FwIGlzIG5vdCBzdXBwb3J0ZWQgcmV0dXJuIDAgKi8KLQlpZiAoIXNrbC0+ZWJ1cy5wcGNhcCkKKwlpZiAoIXNrbC0+ZWJ1cy5idXMucHBjYXApCiAJCXJldHVybiAwOwogCiAJcmV0ID0gc2tsX2RzcF9zbGVlcChjdHgtPmRzcCk7CkBAIC0zMTYsMTMgKzMyMCwxNyBAQAogCWludCByZXQ7CiAKIAkvKiBpZiBwcGNhcCBpcyBub3Qgc3VwcG9ydGVkIHJldHVybiAwICovCi0JaWYgKCFza2wtPmVidXMucHBjYXApCisJaWYgKCFza2wtPmVidXMuYnVzLnBwY2FwKQogCQlyZXR1cm4gMDsKIAogCS8qIGVuYWJsZSBwcGNhcCBpbnRlcnJ1cHQgKi8KIAlzbmRfaGRhY19leHRfYnVzX3BwY2FwX2VuYWJsZSgmc2tsLT5lYnVzLCB0cnVlKTsKIAlzbmRfaGRhY19leHRfYnVzX3BwY2FwX2ludF9lbmFibGUoJnNrbC0+ZWJ1cywgdHJ1ZSk7CiAKKwkvKiBjaGVjayBpZiBEU1AgMXN0IGJvb3QgaXMgZG9uZSAqLworCWlmIChza2wtPnNrbF9zc3QtPmlzX2ZpcnN0X2Jvb3QgPT0gdHJ1ZSkKKwkJcmV0dXJuIDA7CisKIAlyZXQgPSBza2xfZHNwX3dha2UoY3R4LT5kc3ApOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtNjcyLDYgKzY4MCw3IEBACiAJCXJldHVybiBwYXJhbV9zaXplOwogCiAJY2FzZSBTS0xfTU9EVUxFX1RZUEVfQkFTRV9PVVRGTVQ6CisJY2FzZSBTS0xfTU9EVUxFX1RZUEVfS1BCOgogCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBza2xfYmFzZV9vdXRmbXRfY2ZnKTsKIAogCWRlZmF1bHQ6CkBAIC03MjUsNiArNzM0LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNLTF9NT0RVTEVfVFlQRV9CQVNFX09VVEZNVDoKKwljYXNlIFNLTF9NT0RVTEVfVFlQRV9LUEI6CiAJCXNrbF9zZXRfYmFzZV9vdXRmbXRfZm9ybWF0KGN0eCwgbW9kdWxlX2NvbmZpZywgKnBhcmFtX2RhdGEpOwogCQlicmVhazsKIApAQCAtNzc5LDYgKzc4OSw3IEBACiAJCQkJbXBpbltpXS5pbl91c2UgPSB0cnVlOwogCQkJCW1waW5baV0uaWQubW9kdWxlX2lkID0gaWQubW9kdWxlX2lkOwogCQkJCW1waW5baV0uaWQuaW5zdGFuY2VfaWQgPSBpZC5pbnN0YW5jZV9pZDsKKwkJCQltcGluW2ldLmlkLnB2dF9pZCA9IGlkLnB2dF9pZDsKIAkJCQltcGluW2ldLnRndF9tY2ZnID0gdGd0X2NmZzsKIAkJCQlyZXR1cm4gaTsKIAkJCX0KQEAgLTgwMiw2ICs4MTMsNyBAQAogCQltcGluW3FfaW5kZXhdLmluX3VzZSA9IGZhbHNlOwogCQltcGluW3FfaW5kZXhdLmlkLm1vZHVsZV9pZCA9IDA7CiAJCW1waW5bcV9pbmRleF0uaWQuaW5zdGFuY2VfaWQgPSAwOworCQltcGluW3FfaW5kZXhdLmlkLnB2dF9pZCA9IDA7CiAJfQogCW1waW5bcV9pbmRleF0ucGluX3N0YXRlID0gU0tMX1BJTl9VTkJJTkQ7CiAJbXBpbltxX2luZGV4XS50Z3RfbWNmZyA9IE5VTEw7CkBAIC04NDIsNyArODU0LDcgQEAKIAlzdHJ1Y3Qgc2tsX2lwY19pbml0X2luc3RhbmNlX21zZyBtc2c7CiAKIAlkZXZfZGJnKGN0eC0+ZGV2LCAiJXM6IG1vZHVsZV9pZCA9ICVkIGluc3RhbmNlPSVkXG4iLCBfX2Z1bmNfXywKLQkJIG1jb25maWctPmlkLm1vZHVsZV9pZCwgbWNvbmZpZy0+aWQuaW5zdGFuY2VfaWQpOworCQkgbWNvbmZpZy0+aWQubW9kdWxlX2lkLCBtY29uZmlnLT5pZC5wdnRfaWQpOwogCiAJaWYgKG1jb25maWctPnBpcGUtPnN0YXRlICE9IFNLTF9QSVBFX0NSRUFURUQpIHsKIAkJZGV2X2VycihjdHgtPmRldiwgIlBpcGUgbm90IGNyZWF0ZWQgc3RhdGU9ICVkIHBpcGVfaWQ9ICVkXG4iLApAQCAtODU4LDEwICs4NzAsMTEgQEAKIAl9CiAKIAltc2cubW9kdWxlX2lkID0gbWNvbmZpZy0+aWQubW9kdWxlX2lkOwotCW1zZy5pbnN0YW5jZV9pZCA9IG1jb25maWctPmlkLmluc3RhbmNlX2lkOworCW1zZy5pbnN0YW5jZV9pZCA9IG1jb25maWctPmlkLnB2dF9pZDsKIAltc2cucHBsX2luc3RhbmNlX2lkID0gbWNvbmZpZy0+cGlwZS0+cHBsX2lkOwogCW1zZy5wYXJhbV9kYXRhX3NpemUgPSBtb2R1bGVfY29uZmlnX3NpemU7CiAJbXNnLmNvcmVfaWQgPSBtY29uZmlnLT5jb3JlX2lkOworCW1zZy5kb21haW4gPSBtY29uZmlnLT5kb21haW47CiAKIAlyZXQgPSBza2xfaXBjX2luaXRfaW5zdGFuY2UoJmN0eC0+aXBjLCAmbXNnLCBwYXJhbV9kYXRhKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtODc4LDkgKzg5MSw5IEBACiAJKnNyY19tb2R1bGUsIHN0cnVjdCBza2xfbW9kdWxlX2NmZyAqZHN0X21vZHVsZSkKIHsKIAlkZXZfZGJnKGN0eC0+ZGV2LCAiJXM6IHNyYyBtb2R1bGVfaWQgPSAlZCAgc3JjX2luc3RhbmNlPSVkXG4iLAotCQlfX2Z1bmNfXywgc3JjX21vZHVsZS0+aWQubW9kdWxlX2lkLCBzcmNfbW9kdWxlLT5pZC5pbnN0YW5jZV9pZCk7CisJCV9fZnVuY19fLCBzcmNfbW9kdWxlLT5pZC5tb2R1bGVfaWQsIHNyY19tb2R1bGUtPmlkLnB2dF9pZCk7CiAJZGV2X2RiZyhjdHgtPmRldiwgIiVzOiBkc3RfbW9kdWxlPSVkIGRzdF9pbnN0YWNuZT0lZFxuIiwgX19mdW5jX18sCi0JCSBkc3RfbW9kdWxlLT5pZC5tb2R1bGVfaWQsIGRzdF9tb2R1bGUtPmlkLmluc3RhbmNlX2lkKTsKKwkJIGRzdF9tb2R1bGUtPmlkLm1vZHVsZV9pZCwgZHN0X21vZHVsZS0+aWQucHZ0X2lkKTsKIAogCWRldl9kYmcoY3R4LT5kZXYsICJzcmNfbW9kdWxlIHN0YXRlID0gJWQgZHN0IG1vZHVsZSBzdGF0ZSA9ICVkXG4iLAogCQlzcmNfbW9kdWxlLT5tX3N0YXRlLCBkc3RfbW9kdWxlLT5tX3N0YXRlKTsKQEAgLTkyNyw5ICs5NDAsOSBAQAogCQlyZXR1cm4gMDsKIAogCW1zZy5tb2R1bGVfaWQgPSBzcmNfbWNmZy0+aWQubW9kdWxlX2lkOwotCW1zZy5pbnN0YW5jZV9pZCA9IHNyY19tY2ZnLT5pZC5pbnN0YW5jZV9pZDsKKwltc2cuaW5zdGFuY2VfaWQgPSBzcmNfbWNmZy0+aWQucHZ0X2lkOwogCW1zZy5kc3RfbW9kdWxlX2lkID0gZHN0X21jZmctPmlkLm1vZHVsZV9pZDsKLQltc2cuZHN0X2luc3RhbmNlX2lkID0gZHN0X21jZmctPmlkLmluc3RhbmNlX2lkOworCW1zZy5kc3RfaW5zdGFuY2VfaWQgPSBkc3RfbWNmZy0+aWQucHZ0X2lkOwogCW1zZy5iaW5kID0gZmFsc2U7CiAKIAlyZXQgPSBza2xfaXBjX2JpbmRfdW5iaW5kKCZjdHgtPmlwYywgJm1zZyk7CkBAIC05ODgsOSArMTAwMSw5IEBACiAJCQkgbXNnLnNyY19xdWV1ZSwgbXNnLmRzdF9xdWV1ZSk7CiAKIAltc2cubW9kdWxlX2lkID0gc3JjX21jZmctPmlkLm1vZHVsZV9pZDsKLQltc2cuaW5zdGFuY2VfaWQgPSBzcmNfbWNmZy0+aWQuaW5zdGFuY2VfaWQ7CisJbXNnLmluc3RhbmNlX2lkID0gc3JjX21jZmctPmlkLnB2dF9pZDsKIAltc2cuZHN0X21vZHVsZV9pZCA9IGRzdF9tY2ZnLT5pZC5tb2R1bGVfaWQ7Ci0JbXNnLmRzdF9pbnN0YW5jZV9pZCA9IGRzdF9tY2ZnLT5pZC5pbnN0YW5jZV9pZDsKKwltc2cuZHN0X2luc3RhbmNlX2lkID0gZHN0X21jZmctPmlkLnB2dF9pZDsKIAltc2cuYmluZCA9IHRydWU7CiAKIAlyZXQgPSBza2xfaXBjX2JpbmRfdW5iaW5kKCZjdHgtPmlwYywgJm1zZyk7CkBAIC0xMTY4LDcgKzExODEsNyBAQAogCXN0cnVjdCBza2xfaXBjX2xhcmdlX2NvbmZpZ19tc2cgbXNnOwogCiAJbXNnLm1vZHVsZV9pZCA9IG1jZmctPmlkLm1vZHVsZV9pZDsKLQltc2cuaW5zdGFuY2VfaWQgPSBtY2ZnLT5pZC5pbnN0YW5jZV9pZDsKKwltc2cuaW5zdGFuY2VfaWQgPSBtY2ZnLT5pZC5wdnRfaWQ7CiAJbXNnLnBhcmFtX2RhdGFfc2l6ZSA9IHNpemU7CiAJbXNnLmxhcmdlX3BhcmFtX2lkID0gcGFyYW1faWQ7CiAKQEAgLTExODEsNyArMTE5NCw3IEBACiAJc3RydWN0IHNrbF9pcGNfbGFyZ2VfY29uZmlnX21zZyBtc2c7CiAKIAltc2cubW9kdWxlX2lkID0gbWNmZy0+aWQubW9kdWxlX2lkOwotCW1zZy5pbnN0YW5jZV9pZCA9IG1jZmctPmlkLmluc3RhbmNlX2lkOworCW1zZy5pbnN0YW5jZV9pZCA9IG1jZmctPmlkLnB2dF9pZDsKIAltc2cucGFyYW1fZGF0YV9zaXplID0gc2l6ZTsKIAltc2cubGFyZ2VfcGFyYW1faWQgPSBwYXJhbV9pZDsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXBjbS5jIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXBjbS5jCmluZGV4IDZlMDViZjguLjU4YzcyODYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1wY20uYworKysgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtcGNtLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCiBzdGF0aWMgZW51bSBoZGFjX2V4dF9zdHJlYW1fdHlwZSBza2xfZ2V0X2hvc3Rfc3RyZWFtX3R5cGUoc3RydWN0IGhkYWNfZXh0X2J1cyAqZWJ1cykKIHsKLQlpZiAoZWJ1cy0+cHBjYXApCisJaWYgKChlYnVzX3RvX2hidXMoZWJ1cykpLT5wcGNhcCkKIAkJcmV0dXJuIEhEQUNfRVhUX1NUUkVBTV9UWVBFX0hPU1Q7CiAJZWxzZQogCQlyZXR1cm4gSERBQ19FWFRfU1RSRUFNX1RZUEVfQ09VUExFRDsKQEAgLTE4OCw3ICsxODgsNyBAQAogCXN0cnVjdCBoZGFjX2V4dF9idXMgKmVidXMgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOwogCWludCBmb3JtYXRfdmFsID0gMDsKIAotCWlmIChlYnVzLT5wcGNhcCkgeworCWlmICgoZWJ1c190b19oYnVzKGVidXMpKS0+cHBjYXApIHsKIAkJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAogCQlmb3JtYXRfdmFsID0gc25kX2hkYWNfY2FsY19zdHJlYW1fZm9ybWF0KHJ1bnRpbWUtPnJhdGUsCkBAIC02NDgsNyArNjQ4LDggQEAKIAkJLmNoYW5uZWxzX21pbiA9IEhEQV9NT05PLAogCQkuY2hhbm5lbHNfbWF4ID0gSERBX1NURVJFTywKIAkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAsCi0JCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAogCX0sCiAJLmNhcHR1cmUgPSB7CiAJCS5zdHJlYW1fbmFtZSA9ICJTeXN0ZW0gQ2FwdHVyZSIsCkBAIC0xMDIwLDcgKzEwMjEsNyBAQAogewogCXN0cnVjdCBoZGFjX2V4dF9idXMgKmVidXMgPSBnZXRfYnVzX2N0eChzdWJzdHJlYW0pOwogCi0JaWYgKCFlYnVzLT5wcGNhcCkKKwlpZiAoIShlYnVzX3RvX2hidXMoZWJ1cykpLT5wcGNhcCkKIAkJcmV0dXJuIHNrbF9jb3VwbGVkX3RyaWdnZXIoc3Vic3RyZWFtLCBjbWQpOwogCiAJcmV0dXJuIDA7CkBAIC0xMDkzLDcgKzEwOTQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNrbF9wbGF0Zm9ybV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNrbF9wbGF0Zm9ybV9vcHMgPSB7CiAJLm9wZW4gPSBza2xfcGxhdGZvcm1fb3BlbiwKIAkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKIAkudHJpZ2dlciA9IHNrbF9wbGF0Zm9ybV9wY21fdHJpZ2dlciwKQEAgLTExMzgsMjAgKzExMzksNjcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgaW50IHNrbF9wb3B1bGF0ZV9tb2R1bGVzKHN0cnVjdCBza2wgKnNrbCkKK3sKKwlzdHJ1Y3Qgc2tsX3BpcGVsaW5lICpwOworCXN0cnVjdCBza2xfcGlwZV9tb2R1bGUgKm07CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7CisJc3RydWN0IHNrbF9tb2R1bGVfY2ZnICptY29uZmlnOworCWludCByZXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZza2wtPnBwbF9saXN0LCBub2RlKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobSwgJnAtPnBpcGUtPndfbGlzdCwgbm9kZSkgeworCisJCQl3ID0gbS0+dzsKKwkJCW1jb25maWcgPSB3LT5wcml2OworCisJCQlyZXQgPSBzbmRfc2tsX2dldF9tb2R1bGVfaW5mbyhza2wtPnNrbF9zc3QsIG1jb25maWcpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlkZXZfZXJyKHNrbC0+c2tsX3NzdC0+ZGV2LAorCQkJCQkicXVlcnkgbW9kdWxlIGluZm8gZmFpbGVkOiVkXG4iLCByZXQpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJfQorZXJyOgorCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgc2tsX3BsYXRmb3JtX3NvY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCiB7CiAJc3RydWN0IGhkYWNfZXh0X2J1cyAqZWJ1cyA9IGRldl9nZXRfZHJ2ZGF0YShwbGF0Zm9ybS0+ZGV2KTsKIAlzdHJ1Y3Qgc2tsICpza2wgPSBlYnVzX3RvX3NrbChlYnVzKTsKKwljb25zdCBzdHJ1Y3Qgc2tsX2RzcF9vcHMgKm9wczsKIAlpbnQgcmV0OwogCi0JaWYgKGVidXMtPnBwY2FwKSB7CisJcG1fcnVudGltZV9nZXRfc3luYyhwbGF0Zm9ybS0+ZGV2KTsKKwlpZiAoKGVidXNfdG9faGJ1cyhlYnVzKSktPnBwY2FwKSB7CiAJCXJldCA9IHNrbF90cGxnX2luaXQocGxhdGZvcm0sIGVidXMpOwogCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2VycihwbGF0Zm9ybS0+ZGV2LCAiRmFpbGVkIHRvIGluaXQgdG9wb2xvZ3khXG4iKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAkJc2tsLT5wbGF0Zm9ybSA9IHBsYXRmb3JtOworCisJCS8qIGxvYWQgdGhlIGZpcm13YXJlcywgc2luY2UgYWxsIGlzIHNldCAqLworCQlvcHMgPSBza2xfZ2V0X2RzcF9vcHMoc2tsLT5wY2ktPmRldmljZSk7CisJCWlmICghb3BzKQorCQkJcmV0dXJuIC1FSU87CisKKwkJaWYgKHNrbC0+c2tsX3NzdC0+aXNfZmlyc3RfYm9vdCA9PSBmYWxzZSkgeworCQkJZGV2X2VycihwbGF0Zm9ybS0+ZGV2LCAiRFNQIHJlcG9ydHMgZmlyc3QgYm9vdCBkb25lISEhXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJcmV0ID0gb3BzLT5pbml0X2Z3KHBsYXRmb3JtLT5kZXYsIHNrbC0+c2tsX3NzdCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKHBsYXRmb3JtLT5kZXYsICJGYWlsZWQgdG8gYm9vdCBmaXJzdCBmdzogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXNrbF9wb3B1bGF0ZV9tb2R1bGVzKHNrbCk7CiAJfQorCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kocGxhdGZvcm0tPmRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQocGxhdGZvcm0tPmRldik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtY2xkbWEuYyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtY2xkbWEuYwppbmRleCBkYTIzMjlkLi5lZmEyNTMyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LWNsZG1hLmMKKysrIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC1jbGRtYS5jCkBAIC0zNDEsMTQgKzM0MSwxNCBAQAogCXJldCA9IGN0eC0+ZHNwX29wcy5hbGxvY19kbWFfYnVmKGN0eC0+ZGV2LAogCQkJJmN0eC0+Y2xfZGV2LmRtYWJfZGF0YSwgY3R4LT5jbF9kZXYuYnVmc2l6ZSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihjdHgtPmRldiwgIkFsbG9jIGJ1ZmZlciBmb3IgYmFzZSBmdyBmYWlsZWQ6ICV4IiwgcmV0KTsKKwkJZGV2X2VycihjdHgtPmRldiwgIkFsbG9jIGJ1ZmZlciBmb3IgYmFzZSBmdyBmYWlsZWQ6ICV4XG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAkvKiBTZXR1cCBDb2RlIGxvYWRlciBCREwgKi8KIAlyZXQgPSBjdHgtPmRzcF9vcHMuYWxsb2NfZG1hX2J1ZihjdHgtPmRldiwKIAkJCSZjdHgtPmNsX2Rldi5kbWFiX2JkbCwgUEFHRV9TSVpFKTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGN0eC0+ZGV2LCAiQWxsb2MgYnVmZmVyIGZvciBibGRlIGZhaWxlZDogJXgiLCByZXQpOworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiQWxsb2MgYnVmZmVyIGZvciBibGRlIGZhaWxlZDogJXhcbiIsIHJldCk7CiAJCWN0eC0+ZHNwX29wcy5mcmVlX2RtYV9idWYoY3R4LT5kZXYsICZjdHgtPmNsX2Rldi5kbWFiX2RhdGEpOwogCQlyZXR1cm4gcmV0OwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtZHNwLmggYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LWRzcC5oCmluZGV4IDBmODYyOWUuLmI5ZTcxZDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtZHNwLmgKKysrIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC1kc3AuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHNvdW5kL21lbWFsbG9jLmg+CiAjaW5jbHVkZSAic2tsLXNzdC1jbGRtYS5oIgogI2luY2x1ZGUgInNrbC10cGxnLWludGVyZmFjZS5oIgorI2luY2x1ZGUgInNrbC10b3BvbG9neS5oIgogCiBzdHJ1Y3Qgc3N0X2RzcDsKIHN0cnVjdCBza2xfc3N0OwpAQCAtMTMzLDYgKzEzNCw4IEBACiBzdHJ1Y3Qgc2tsX2RzcF9md19vcHMgewogCWludCAoKmxvYWRfZncpKHN0cnVjdCBzc3RfZHNwICAqY3R4KTsKIAkvKiBGVyBtb2R1bGUgcGFyc2VyL2xvYWRlciAqLworCWludCAoKmxvYWRfbGlicmFyeSkoc3RydWN0IHNzdF9kc3AgKmN0eCwKKwkJc3RydWN0IHNrbF9kZndfbWFuaWZlc3QgKm1pbmZvKTsKIAlpbnQgKCpwYXJzZV9mdykoc3RydWN0IHNzdF9kc3AgKmN0eCk7CiAJaW50ICgqc2V0X3N0YXRlX0QwKShzdHJ1Y3Qgc3N0X2RzcCAqY3R4LCB1bnNpZ25lZCBpbnQgY29yZV9pZCk7CiAJaW50ICgqc2V0X3N0YXRlX0QzKShzdHJ1Y3Qgc3N0X2RzcCAqY3R4LCB1bnNpZ25lZCBpbnQgY29yZV9pZCk7CkBAIC0yMDMsMTIgKzIwNiwyMSBAQAogaW50IGJ4dF9zc3RfZHNwX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkIF9faW9tZW0gKm1taW9fYmFzZSwgaW50IGlycSwKIAkJY29uc3QgY2hhciAqZndfbmFtZSwgc3RydWN0IHNrbF9kc3BfbG9hZGVyX29wcyBkc3Bfb3BzLAogCQlzdHJ1Y3Qgc2tsX3NzdCAqKmRzcCk7CitpbnQgc2tsX3NzdF9pbml0X2Z3KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrbF9zc3QgKmN0eCk7CitpbnQgYnh0X3NzdF9pbml0X2Z3KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrbF9zc3QgKmN0eCk7CiB2b2lkIHNrbF9zc3RfZHNwX2NsZWFudXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2tsX3NzdCAqY3R4KTsKIHZvaWQgYnh0X3NzdF9kc3BfY2xlYW51cChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBza2xfc3N0ICpjdHgpOwogCi1pbnQgc25kX3NrbF9nZXRfbW9kdWxlX2luZm8oc3RydWN0IHNrbF9zc3QgKmN0eCwgdTggKnV1aWQsCi0JCXN0cnVjdCBza2xfZGZ3X21vZHVsZSAqZGZ3X2NvbmZpZyk7Ci1pbnQgc25kX3NrbF9wYXJzZV91dWlkcyhzdHJ1Y3Qgc3N0X2RzcCAqY3R4LCB1bnNpZ25lZCBpbnQgb2Zmc2V0KTsKK2ludCBzbmRfc2tsX2dldF9tb2R1bGVfaW5mbyhzdHJ1Y3Qgc2tsX3NzdCAqY3R4LAorCQkJCXN0cnVjdCBza2xfbW9kdWxlX2NmZyAqbWNvbmZpZyk7CitpbnQgc25kX3NrbF9wYXJzZV91dWlkcyhzdHJ1Y3Qgc3N0X2RzcCAqY3R4LCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LAorCQkJCXVuc2lnbmVkIGludCBvZmZzZXQsIGludCBpbmRleCk7CitpbnQgc2tsX2dldF9wdnRfaWQoc3RydWN0IHNrbF9zc3QgKmN0eCwKKwkJCQlzdHJ1Y3Qgc2tsX21vZHVsZV9jZmcgKm1jb25maWcpOworaW50IHNrbF9wdXRfcHZ0X2lkKHN0cnVjdCBza2xfc3N0ICpjdHgsCisJCQkJc3RydWN0IHNrbF9tb2R1bGVfY2ZnICptY29uZmlnKTsKK2ludCBza2xfZ2V0X3B2dF9pbnN0YW5jZV9pZF9tYXAoc3RydWN0IHNrbF9zc3QgKmN0eCwKKwkJCQlpbnQgbW9kdWxlX2lkLCBpbnQgaW5zdGFuY2VfaWQpOwogdm9pZCBza2xfZnJlZXVwX3V1aWRfbGlzdChzdHJ1Y3Qgc2tsX3NzdCAqY3R4KTsKIAogaW50IHNrbF9kc3Bfc3RyaXBfZXh0ZW5kZWRfbWFuaWZlc3Qoc3RydWN0IGZpcm13YXJlICpmdyk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LWlwYy5jIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC1pcGMuYwppbmRleCA5NmYyZjY4Li4wYmQwMWU2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LWlwYy5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtaXBjLmMKQEAgLTExNCw2ICsxMTQsMTEgQEAKICNkZWZpbmUgSVBDX0NPUkVfSUQoeCkJCQkoKCh4KSAmIElQQ19DT1JFX0lEX01BU0spIFwKIAkJCQkJPDwgSVBDX0NPUkVfSURfU0hJRlQpCiAKKyNkZWZpbmUgSVBDX0RPTUFJTl9TSElGVCAgICAgICAgICAgICAgICAyOAorI2RlZmluZSBJUENfRE9NQUlOX01BU0sgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBJUENfRE9NQUlOKHgpICAgICAgICAgICAgICAgICAgICgoKHgpICYgSVBDX0RPTUFJTl9NQVNLKSBcCisJCQkJCTw8IElQQ19ET01BSU5fU0hJRlQpCisKIC8qIEJpbmQvVW5iaW5kIG1lc3NhZ2UgZXh0ZW5zaW9uIHJlZ2lzdGVyICovCiAjZGVmaW5lIElQQ19EU1RfTU9EX0lEX1NISUZUCQkwCiAjZGVmaW5lIElQQ19EU1RfTU9EX0lEKHgpCQkoKCh4KSAmIElQQ19NT0RfSURfTUFTSykgXApAQCAtMTkwLDYgKzE5NSw3IEBACiAJSVBDX0dMQl9HRVRfUFBMX0NPTlRFWFRfU0laRSA9IDIxLAogCUlQQ19HTEJfU0FWRV9QUEwgPSAyMiwKIAlJUENfR0xCX1JFU1RPUkVfUFBMID0gMjMsCisJSVBDX0dMQl9MT0FEX0xJQlJBUlkgPSAyNCwKIAlJUENfR0xCX05PVElGWSA9IDI2LAogCUlQQ19HTEJfTUFYX0lQQ19NU0dfTlVNQkVSID0gMzEgLyogTWF4aW11bSBtZXNzYWdlIG51bWJlciAqLwogfTsKQEAgLTMzOCw3ICszNDQsNyBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCWRldl9lcnIoaXBjLT5kZXYsICJpcGM6IFVuaGFuZGxlZCBlcnJvciBtc2c9JXgiLAorCQkJZGV2X2VycihpcGMtPmRldiwgImlwYzogVW5oYW5kbGVkIGVycm9yIG1zZz0leFxuIiwKIAkJCQkJCWhlYWRlci5wcmltYXJ5KTsKIAkJCWJyZWFrOwogCQl9CkBAIC0zNzksMTMgKzM4NSwxMyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoaXBjLT5kZXYsICJVbmtub3duIGlwYyByZXBseTogMHgleCIsIHJlcGx5KTsKKwkJZGV2X2VycihpcGMtPmRldiwgIlVua25vd24gaXBjIHJlcGx5OiAweCV4XG4iLCByZXBseSk7CiAJCW1zZy0+ZXJybm8gPSAtRUlOVkFMOwogCQlicmVhazsKIAl9CiAKIAlpZiAocmVwbHkgIT0gSVBDX0dMQl9SRVBMWV9TVUNDRVNTKSB7Ci0JCWRldl9lcnIoaXBjLT5kZXYsICJpcGMgRlcgcmVwbHk6IHJlcGx5PSVkIiwgcmVwbHkpOworCQlkZXZfZXJyKGlwYy0+ZGV2LCAiaXBjIEZXIHJlcGx5OiByZXBseT0lZFxuIiwgcmVwbHkpOwogCQlkZXZfZXJyKGlwYy0+ZGV2LCAiRlcgRXJyb3IgQ29kZTogJXVcbiIsCiAJCQlpcGMtPmRzcC0+Zndfb3BzLmdldF9md19lcnJjb2RlKGlwYy0+ZHNwKSk7CiAJfQpAQCAtNDM0LDkgKzQ0MCw5IEBACiAJCWhpcGN0ZSA9IHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKGRzcCwgU0tMX0FEU1BfUkVHX0hJUENURSk7CiAJCWhlYWRlci5wcmltYXJ5ID0gaGlwY3Q7CiAJCWhlYWRlci5leHRlbnNpb24gPSBoaXBjdGU7Ci0JCWRldl9kYmcoZHNwLT5kZXYsICJJUEMgaXJxOiBGaXJtd2FyZSByZXNwb25kIHByaW1hcnk6JXgiLAorCQlkZXZfZGJnKGRzcC0+ZGV2LCAiSVBDIGlycTogRmlybXdhcmUgcmVzcG9uZCBwcmltYXJ5OiV4XG4iLAogCQkJCQkJaGVhZGVyLnByaW1hcnkpOwotCQlkZXZfZGJnKGRzcC0+ZGV2LCAiSVBDIGlycTogRmlybXdhcmUgcmVzcG9uZCBleHRlbnNpb246JXgiLAorCQlkZXZfZGJnKGRzcC0+ZGV2LCAiSVBDIGlycTogRmlybXdhcmUgcmVzcG9uZCBleHRlbnNpb246JXhcbiIsCiAJCQkJCQloZWFkZXIuZXh0ZW5zaW9uKTsKIAogCQlpZiAoSVBDX0dMQl9OT1RJRllfUlNQX1RZUEUoaGVhZGVyLnByaW1hcnkpKSB7CkBAIC03MDQsNiArNzEwLDcgQEAKIAloZWFkZXIuZXh0ZW5zaW9uID0gSVBDX0NPUkVfSUQobXNnLT5jb3JlX2lkKTsKIAloZWFkZXIuZXh0ZW5zaW9uIHw9IElQQ19QUExfSU5TVEFOQ0VfSUQobXNnLT5wcGxfaW5zdGFuY2VfaWQpOwogCWhlYWRlci5leHRlbnNpb24gfD0gSVBDX1BBUkFNX0JMT0NLX1NJWkUocGFyYW1fYmxvY2tfc2l6ZSk7CisJaGVhZGVyLmV4dGVuc2lvbiB8PSBJUENfRE9NQUlOKG1zZy0+ZG9tYWluKTsKIAogCWRldl9kYmcoaXBjLT5kZXYsICJJbiAlcyBwcmltYXJ5ID0leCBleHQ9JXhcbiIsIF9fZnVuY19fLAogCQkJIGhlYWRlci5wcmltYXJ5LCBoZWFkZXIuZXh0ZW5zaW9uKTsKQEAgLTc0Miw3ICs3NDksNyBAQAogCQkJIGhlYWRlci5leHRlbnNpb24pOwogCXJldCA9IHNzdF9pcGNfdHhfbWVzc2FnZV93YWl0KGlwYywgKmlwY19oZWFkZXIsIE5VTEwsIDAsIE5VTEwsIDApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoaXBjLT5kZXYsICJpcGM6IGJpbmQvdW5iaW5kIGZhaWxlZGVuIik7CisJCWRldl9lcnIoaXBjLT5kZXYsICJpcGM6IGJpbmQvdW5iaW5kIGZhaWxlZFxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC05MDIsMyArOTA5LDI1IEBACiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNrbF9pcGNfZ2V0X2xhcmdlX2NvbmZpZyk7CisKK2ludCBza2xfc3N0X2lwY19sb2FkX2xpYnJhcnkoc3RydWN0IHNzdF9nZW5lcmljX2lwYyAqaXBjLAorCQkJCXU4IGRtYV9pZCwgdTggdGFibGVfaWQpCit7CisJc3RydWN0IHNrbF9pcGNfaGVhZGVyIGhlYWRlciA9IHswfTsKKwl1NjQgKmlwY19oZWFkZXIgPSAodTY0ICopKCZoZWFkZXIpOworCWludCByZXQgPSAwOworCisJaGVhZGVyLnByaW1hcnkgPSBJUENfTVNHX1RBUkdFVChJUENfRldfR0VOX01TRyk7CisJaGVhZGVyLnByaW1hcnkgfD0gSVBDX01TR19ESVIoSVBDX01TR19SRVFVRVNUKTsKKwloZWFkZXIucHJpbWFyeSB8PSBJUENfR0xCX1RZUEUoSVBDX0dMQl9MT0FEX0xJQlJBUlkpOworCWhlYWRlci5wcmltYXJ5IHw9IElQQ19NT0RfSU5TVEFOQ0VfSUQodGFibGVfaWQpOworCWhlYWRlci5wcmltYXJ5IHw9IElQQ19NT0RfSUQoZG1hX2lkKTsKKworCXJldCA9IHNzdF9pcGNfdHhfbWVzc2FnZV93YWl0KGlwYywgKmlwY19oZWFkZXIsIE5VTEwsIDAsIE5VTEwsIDApOworCisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoaXBjLT5kZXYsICJpcGM6IGxvYWQgbGliIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2tsX3NzdF9pcGNfbG9hZF9saWJyYXJ5KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtaXBjLmggYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LWlwYy5oCmluZGV4IDJlM2Q0ZTguLjAzMzRlZDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtaXBjLmgKKysrIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC1pcGMuaApAQCAtNjYsNyArNjYsNyBAQAogCiAJLyogY2FsbGJhY2sgZm9yIG1pc2NiZGdlICovCiAJdm9pZCAoKmVuYWJsZV9taXNjYmRjZ2UpKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpOwotCS8qSXMgQ0dDVEwuTUlTQ0JEQ0dFIGRpc2FibGVkKi8KKwkvKiBJcyBDR0NUTC5NSVNDQkRDR0UgZGlzYWJsZWQgKi8KIAlib29sIG1pc2NiZGNnX2Rpc2FibGVkOwogCiAJLyogUG9wdWxhdGUgbW9kdWxlIGluZm9ybWF0aW9uICovCkBAIC03NSw4ICs3NSwxNCBAQAogCS8qIElzIGZpcm13YXJlIGxvYWRlZCAqLwogCWJvb2wgZndfbG9hZGVkOwogCisJLyogZmlyc3QgYm9vdCA/ICovCisJYm9vbCBpc19maXJzdF9ib290OworCiAJLyogbXVsdGktY29yZSAqLwogCXN0cnVjdCBza2xfZHNwX2NvcmVzIGNvcmVzOworCisJLyogdHBsZyBtYW5pZmVzdCAqLworCXN0cnVjdCBza2xfZGZ3X21hbmlmZXN0IG1hbmlmZXN0OwogfTsKIAogc3RydWN0IHNrbF9pcGNfaW5pdF9pbnN0YW5jZV9tc2cgewpAQCAtODUsNiArOTEsNyBAQAogCXUxNiBwYXJhbV9kYXRhX3NpemU7CiAJdTggcHBsX2luc3RhbmNlX2lkOwogCXU4IGNvcmVfaWQ7CisJdTggZG9tYWluOwogfTsKIAogc3RydWN0IHNrbF9pcGNfYmluZF91bmJpbmRfbXNnIHsKQEAgLTE0NSw2ICsxNTIsOSBAQAogaW50IHNrbF9pcGNfZ2V0X2xhcmdlX2NvbmZpZyhzdHJ1Y3Qgc3N0X2dlbmVyaWNfaXBjICppcGMsCiAJCXN0cnVjdCBza2xfaXBjX2xhcmdlX2NvbmZpZ19tc2cgKm1zZywgdTMyICpwYXJhbSk7CiAKK2ludCBza2xfc3N0X2lwY19sb2FkX2xpYnJhcnkoc3RydWN0IHNzdF9nZW5lcmljX2lwYyAqaXBjLAorCQkJdTggZG1hX2lkLCB1OCB0YWJsZV9pZCk7CisKIHZvaWQgc2tsX2lwY19pbnRfZW5hYmxlKHN0cnVjdCBzc3RfZHNwICpkc3ApOwogdm9pZCBza2xfaXBjX29wX2ludF9lbmFibGUoc3RydWN0IHNzdF9kc3AgKmN0eCk7CiB2b2lkIHNrbF9pcGNfb3BfaW50X2Rpc2FibGUoc3RydWN0IHNzdF9kc3AgKmN0eCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LXV0aWxzLmMgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LXV0aWxzLmMKaW5kZXggMjVmY2I3OS4uOGRjMDMwMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC11dGlscy5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtdXRpbHMuYwpAQCAtMjgsMTEgKzI4LDYgQEAKIC8qIEZXIEV4dGVuZGVkIE1hbmlmZXN0IEhlYWRlciBpZCA9ICRBRTEgKi8KICNkZWZpbmUgU0tMX0VYVF9NQU5JRkVTVF9IRUFERVJfTUFHSUMgICAweDMxNDU0MTI0CiAKLXN0cnVjdCBza2xfZGZ3X21vZHVsZV9tb2QgewotCWNoYXIgbmFtZVsxMDBdOwotCXN0cnVjdCBza2xfZGZ3X21vZHVsZSBza2xfZGZ3X21vZDsKLX07Ci0KIHN0cnVjdCBVVUlEIHsKIAl1OCBpZFsxNl07CiB9OwpAQCAtOTksMTAgKzk0LDE1IEBACiAJdTMyIGxvYWRfb2Zmc2V0OwogfSBfX3BhY2tlZDsKIAorI2RlZmluZSBNQVhfSU5TVEFOQ0VfQlVGRiAyCisKIHN0cnVjdCB1dWlkX21vZHVsZSB7CiAJdXVpZF9sZSB1dWlkOwogCWludCBpZDsKIAlpbnQgaXNfbG9hZGFibGU7CisJaW50IG1heF9pbnN0YW5jZTsKKwl1NjQgcHZ0X2lkW01BWF9JTlNUQU5DRV9CVUZGXTsKKwlpbnQgKmluc3RhbmNlX2lkOwogCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogfTsKQEAgLTExNSwxOCArMTE1LDIzIEBACiAJdTMyIGVudHJpZXM7CiB9OwogCi1pbnQgc25kX3NrbF9nZXRfbW9kdWxlX2luZm8oc3RydWN0IHNrbF9zc3QgKmN0eCwgdTggKnV1aWQsCi0JCQlzdHJ1Y3Qgc2tsX2Rmd19tb2R1bGUgKmRmd19jb25maWcpCitpbnQgc25kX3NrbF9nZXRfbW9kdWxlX2luZm8oc3RydWN0IHNrbF9zc3QgKmN0eCwKKwkJCQlzdHJ1Y3Qgc2tsX21vZHVsZV9jZmcgKm1jb25maWcpCiB7CiAJc3RydWN0IHV1aWRfbW9kdWxlICptb2R1bGU7CiAJdXVpZF9sZSAqdXVpZF9tb2Q7CiAKLQl1dWlkX21vZCA9ICh1dWlkX2xlICopdXVpZDsKKwl1dWlkX21vZCA9ICh1dWlkX2xlICopbWNvbmZpZy0+Z3VpZDsKKworCWlmIChsaXN0X2VtcHR5KCZjdHgtPnV1aWRfbGlzdCkpIHsKKwkJZGV2X2VycihjdHgtPmRldiwgIk1vZHVsZSBsaXN0IGlzIGVtcHR5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2R1bGUsICZjdHgtPnV1aWRfbGlzdCwgbGlzdCkgewogCQlpZiAodXVpZF9sZV9jbXAoKnV1aWRfbW9kLCBtb2R1bGUtPnV1aWQpID09IDApIHsKLQkJCWRmd19jb25maWctPm1vZHVsZV9pZCA9IG1vZHVsZS0+aWQ7Ci0JCQlkZndfY29uZmlnLT5pc19sb2FkYWJsZSA9IG1vZHVsZS0+aXNfbG9hZGFibGU7CisJCQltY29uZmlnLT5pZC5tb2R1bGVfaWQgPSBtb2R1bGUtPmlkOworCQkJbWNvbmZpZy0+aXNfbG9hZGFibGUgPSBtb2R1bGUtPmlzX2xvYWRhYmxlOwogCiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMTM2LDE1ICsxNDEsMTU0IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc2tsX2dldF9tb2R1bGVfaW5mbyk7CiAKK3N0YXRpYyBpbnQgc2tsX2dldF9wdnRpZF9tYXAoc3RydWN0IHV1aWRfbW9kdWxlICptb2R1bGUsIGludCBpbnN0YW5jZV9pZCkKK3sKKwlpbnQgcHZ0X2lkOworCisJZm9yIChwdnRfaWQgPSAwOyBwdnRfaWQgPCBtb2R1bGUtPm1heF9pbnN0YW5jZTsgcHZ0X2lkKyspIHsKKwkJaWYgKG1vZHVsZS0+aW5zdGFuY2VfaWRbcHZ0X2lkXSA9PSBpbnN0YW5jZV9pZCkKKwkJCXJldHVybiBwdnRfaWQ7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitpbnQgc2tsX2dldF9wdnRfaW5zdGFuY2VfaWRfbWFwKHN0cnVjdCBza2xfc3N0ICpjdHgsCisJCQkJaW50IG1vZHVsZV9pZCwgaW50IGluc3RhbmNlX2lkKQoreworCXN0cnVjdCB1dWlkX21vZHVsZSAqbW9kdWxlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2R1bGUsICZjdHgtPnV1aWRfbGlzdCwgbGlzdCkgeworCQlpZiAobW9kdWxlLT5pZCA9PSBtb2R1bGVfaWQpCisJCQlyZXR1cm4gc2tsX2dldF9wdnRpZF9tYXAobW9kdWxlLCBpbnN0YW5jZV9pZCk7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChza2xfZ2V0X3B2dF9pbnN0YW5jZV9pZF9tYXApOworCitzdGF0aWMgaW5saW5lIGludCBza2xfZ2V0aWRfMzIoc3RydWN0IHV1aWRfbW9kdWxlICptb2R1bGUsIHU2NCAqdmFsLAorCQkJCWludCB3b3JkMV9tYXNrLCBpbnQgd29yZDJfbWFzaykKK3sKKwlpbnQgaW5kZXgsIG1heF9pbnN0LCBwdnRfaWQ7CisJdTMyIG1hc2tfdmFsOworCisJbWF4X2luc3QgPSAgbW9kdWxlLT5tYXhfaW5zdGFuY2U7CisJbWFza192YWwgPSAodTMyKSgqdmFsID4+IHdvcmQxX21hc2spOworCisJaWYgKG1hc2tfdmFsICE9IDB4ZmZmZmZmZmYpIHsKKwkJaW5kZXggPSBmZnoobWFza192YWwpOworCQlwdnRfaWQgPSBpbmRleCArIHdvcmQxX21hc2sgKyB3b3JkMl9tYXNrOworCQlpZiAocHZ0X2lkIDw9IChtYXhfaW5zdCAtIDEpKSB7CisJCQkqdmFsIHw9IDEgPDwgKGluZGV4ICsgd29yZDFfbWFzayk7CisJCQlyZXR1cm4gcHZ0X2lkOworCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNrbF9wdnRpZF8xMjgoc3RydWN0IHV1aWRfbW9kdWxlICptb2R1bGUpCit7CisJaW50IGosIGksIHdvcmQxX21hc2ssIHdvcmQyX21hc2sgPSAwLCBwdnRfaWQ7CisKKwlmb3IgKGogPSAwOyBqIDwgTUFYX0lOU1RBTkNFX0JVRkY7IGorKykgeworCQl3b3JkMV9tYXNrID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQlwdnRfaWQgPSBza2xfZ2V0aWRfMzIobW9kdWxlLCAmbW9kdWxlLT5wdnRfaWRbal0sCisJCQkJCQl3b3JkMV9tYXNrLCB3b3JkMl9tYXNrKTsKKwkJCWlmIChwdnRfaWQgPj0gMCkKKwkJCQlyZXR1cm4gcHZ0X2lkOworCisJCQl3b3JkMV9tYXNrICs9IDMyOworCQkJaWYgKCh3b3JkMV9tYXNrICsgd29yZDJfbWFzaykgPj0gbW9kdWxlLT5tYXhfaW5zdGFuY2UpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQl3b3JkMl9tYXNrICs9IDY0OworCQlpZiAod29yZDJfbWFzayA+PSBtb2R1bGUtPm1heF9pbnN0YW5jZSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIHNrbF9nZXRfcHZ0X2lkOiBnZW5lcmF0ZSBhIHByaXZhdGUgaWQgZm9yIHVzZSBhcyBtb2R1bGUgaWQKKyAqCisgKiBAY3R4OiBkcml2ZXIgY29udGV4dAorICogQG1jb25maWc6IG1vZHVsZSBjb25maWd1cmF0aW9uIGRhdGEKKyAqCisgKiBUaGlzIGdlbmVyYXRlcyBhIDEyOCBiaXQgcHJpdmF0ZSB1bmlxdWUgaWQgZm9yIGEgbW9kdWxlIFRZUEUgc28gdGhhdAorICogbW9kdWxlIGluc3RhbmNlIGlzIHVuaXF1ZQorICovCitpbnQgc2tsX2dldF9wdnRfaWQoc3RydWN0IHNrbF9zc3QgKmN0eCwgc3RydWN0IHNrbF9tb2R1bGVfY2ZnICptY29uZmlnKQoreworCXN0cnVjdCB1dWlkX21vZHVsZSAqbW9kdWxlOworCXV1aWRfbGUgKnV1aWRfbW9kOworCWludCBwdnRfaWQ7CisKKwl1dWlkX21vZCA9ICh1dWlkX2xlICopbWNvbmZpZy0+Z3VpZDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kdWxlLCAmY3R4LT51dWlkX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHV1aWRfbGVfY21wKCp1dWlkX21vZCwgbW9kdWxlLT51dWlkKSA9PSAwKSB7CisKKwkJCXB2dF9pZCA9IHNrbF9wdnRpZF8xMjgobW9kdWxlKTsKKwkJCWlmIChwdnRfaWQgPj0gMCkgeworCQkJCW1vZHVsZS0+aW5zdGFuY2VfaWRbcHZ0X2lkXSA9CisJCQkJCQltY29uZmlnLT5pZC5pbnN0YW5jZV9pZDsKKwkJCQlyZXR1cm4gcHZ0X2lkOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChza2xfZ2V0X3B2dF9pZCk7CisKKy8qKgorICogc2tsX3B1dF9wdnRfaWQ6IGZyZWUgdXAgdGhlIHByaXZhdGUgaWQgYWxsb2NhdGVkCisgKgorICogQGN0eDogZHJpdmVyIGNvbnRleHQKKyAqIEBtY29uZmlnOiBtb2R1bGUgY29uZmlndXJhdGlvbiBkYXRhCisgKgorICogVGhpcyBmcmVlcyBhIDEyOCBiaXQgcHJpdmF0ZSB1bmlxdWUgaWQgcHJldmlvdXNseSBnZW5lcmF0ZWQKKyAqLworaW50IHNrbF9wdXRfcHZ0X2lkKHN0cnVjdCBza2xfc3N0ICpjdHgsIHN0cnVjdCBza2xfbW9kdWxlX2NmZyAqbWNvbmZpZykKK3sKKwlpbnQgaTsKKwl1dWlkX2xlICp1dWlkX21vZDsKKwlzdHJ1Y3QgdXVpZF9tb2R1bGUgKm1vZHVsZTsKKworCXV1aWRfbW9kID0gKHV1aWRfbGUgKiltY29uZmlnLT5ndWlkOworCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kdWxlLCAmY3R4LT51dWlkX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHV1aWRfbGVfY21wKCp1dWlkX21vZCwgbW9kdWxlLT51dWlkKSA9PSAwKSB7CisKKwkJCWlmIChtY29uZmlnLT5pZC5wdnRfaWQgIT0gMCkKKwkJCQlpID0gKG1jb25maWctPmlkLnB2dF9pZCkgLyA2NDsKKwkJCWVsc2UKKwkJCQlpID0gMDsKKworCQkJbW9kdWxlLT5wdnRfaWRbaV0gJj0gfigxIDw8IChtY29uZmlnLT5pZC5wdnRfaWQpKTsKKwkJCW1jb25maWctPmlkLnB2dF9pZCA9IC0xOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNrbF9wdXRfcHZ0X2lkKTsKKwogLyoKICAqIFBhcnNlIHRoZSBmaXJtd2FyZSBiaW5hcnkgdG8gZ2V0IHRoZSBVVUlELCBtb2R1bGUgaWQKICAqIGFuZCBsb2FkYWJsZSBmbGFncwogICovCi1pbnQgc25kX3NrbF9wYXJzZV91dWlkcyhzdHJ1Y3Qgc3N0X2RzcCAqY3R4LCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoraW50IHNuZF9za2xfcGFyc2VfdXVpZHMoc3RydWN0IHNzdF9kc3AgKmN0eCwgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywKKwkJCXVuc2lnbmVkIGludCBvZmZzZXQsIGludCBpbmRleCkKIHsKIAlzdHJ1Y3QgYWRzcF9md19oZHIgKmFkc3BfaGRyOwogCXN0cnVjdCBhZHNwX21vZHVsZV9lbnRyeSAqbW9kX2VudHJ5OwotCWludCBpLCBudW1fZW50cnk7CisJaW50IGksIG51bV9lbnRyeSwgc2l6ZTsKIAl1dWlkX2xlICp1dWlkX2JpbjsKIAljb25zdCBjaGFyICpidWY7CiAJc3RydWN0IHNrbF9zc3QgKnNrbCA9IGN0eC0+dGhyZWFkX2NvbnRleHQ7CkBAIC0xNTMsOCArMjk3LDggQEAKIAl1bnNpZ25lZCBpbnQgc2FmZV9maWxlOwogCiAJLyogR2V0IHRoZSBGVyBwb2ludGVyIHRvIGRlcml2ZSBBRFNQIGhlYWRlciAqLwotCXN0cmlwcGVkX2Z3LmRhdGEgPSBjdHgtPmZ3LT5kYXRhOwotCXN0cmlwcGVkX2Z3LnNpemUgPSBjdHgtPmZ3LT5zaXplOworCXN0cmlwcGVkX2Z3LmRhdGEgPSBmdy0+ZGF0YTsKKwlzdHJpcHBlZF9mdy5zaXplID0gZnctPnNpemU7CiAKIAlza2xfZHNwX3N0cmlwX2V4dGVuZGVkX21hbmlmZXN0KCZzdHJpcHBlZF9mdyk7CiAKQEAgLTIwNSw4ICszNDksMTUgQEAKIAkJdXVpZF9iaW4gPSAodXVpZF9sZSAqKW1vZF9lbnRyeS0+dXVpZC5pZDsKIAkJbWVtY3B5KCZtb2R1bGUtPnV1aWQsIHV1aWRfYmluLCBzaXplb2YobW9kdWxlLT51dWlkKSk7CiAKLQkJbW9kdWxlLT5pZCA9IGk7CisJCW1vZHVsZS0+aWQgPSAoaSB8IChpbmRleCA8PCAxMikpOwogCQltb2R1bGUtPmlzX2xvYWRhYmxlID0gbW9kX2VudHJ5LT50eXBlLmxvYWRfdHlwZTsKKwkJbW9kdWxlLT5tYXhfaW5zdGFuY2UgPSBtb2RfZW50cnktPmluc3RhbmNlX21heF9jb3VudDsKKwkJc2l6ZSA9IHNpemVvZihpbnQpICogbW9kX2VudHJ5LT5pbnN0YW5jZV9tYXhfY291bnQ7CisJCW1vZHVsZS0+aW5zdGFuY2VfaWQgPSBkZXZtX2t6YWxsb2MoY3R4LT5kZXYsIHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIW1vZHVsZS0+aW5zdGFuY2VfaWQpIHsKKwkJCWtmcmVlKG1vZHVsZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQogCiAJCWxpc3RfYWRkX3RhaWwoJm1vZHVsZS0+bGlzdCwgJnNrbC0+dXVpZF9saXN0KTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC5jIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC5jCmluZGV4IDU4OGY4OTkuLjhmYzMxNzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LmMKQEAgLTg4LDEzICs4OCwxNSBAQAogCQl9CiAJfQogCi0JcmV0ID0gc25kX3NrbF9wYXJzZV91dWlkcyhjdHgsIFNLTF9BRFNQX0ZXX0JJTl9IRFJfT0ZGU0VUKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGN0eC0+ZGV2LAotCQkJCSJVVUlEIHBhcnNpbmcgZXJyOiAlZFxuIiwgcmV0KTsKLQkJcmVsZWFzZV9maXJtd2FyZShjdHgtPmZ3KTsKLQkJc2tsX2RzcF9kaXNhYmxlX2NvcmUoY3R4LCBTS0xfRFNQX0NPUkUwX01BU0spOwotCQlyZXR1cm4gcmV0OworCS8qIHByYXNlIHV1aWRzIG9uIGZpcnN0IGJvb3QgKi8KKwlpZiAoc2tsLT5pc19maXJzdF9ib290KSB7CisJCXJldCA9IHNuZF9za2xfcGFyc2VfdXVpZHMoY3R4LCBjdHgtPmZ3LCBTS0xfQURTUF9GV19CSU5fSERSX09GRlNFVCwgMCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGN0eC0+ZGV2LCAiVVVJRCBwYXJzaW5nIGVycjogJWRcbiIsIHJldCk7CisJCQlyZWxlYXNlX2Zpcm13YXJlKGN0eC0+ZncpOworCQkJc2tsX2RzcF9kaXNhYmxlX2NvcmUoY3R4LCBTS0xfRFNQX0NPUkUwX01BU0spOworCQkJcmV0dXJuIHJldDsKKwkJfQogCX0KIAogCS8qIGNoZWNrIGZvciBleHRlbmRlZCBtYW5pZmVzdCAqLwpAQCAtMTA1LDEzICsxMDcsMTMgQEAKIAogCXJldCA9IHNrbF9kc3BfYm9vdChjdHgpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsICJCb290IGRzcCBjb3JlIGZhaWxlZCByZXQ6ICVkIiwgcmV0KTsKKwkJZGV2X2VycihjdHgtPmRldiwgIkJvb3QgZHNwIGNvcmUgZmFpbGVkIHJldDogJWRcbiIsIHJldCk7CiAJCWdvdG8gc2tsX2xvYWRfYmFzZV9maXJtd2FyZV9mYWlsZWQ7CiAJfQogCiAJcmV0ID0gc2tsX2NsZG1hX3ByZXBhcmUoY3R4KTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGN0eC0+ZGV2LCAiQ0wgZG1hIHByZXBhcmUgZmFpbGVkIDogJWQiLCByZXQpOworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiQ0wgZG1hIHByZXBhcmUgZmFpbGVkIDogJWRcbiIsIHJldCk7CiAJCWdvdG8gc2tsX2xvYWRfYmFzZV9maXJtd2FyZV9mYWlsZWQ7CiAJfQogCkBAIC00ODQsMjYgKzQ4NiwzMyBAQAogCQlyZXR1cm4gcmV0OwogCiAJc2tsLT5jb3Jlcy5jb3VudCA9IDI7Ci0KLQlyZXQgPSBzc3QtPmZ3X29wcy5sb2FkX2Z3KHNzdCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJMb2FkIGJhc2UgZncgZmFpbGVkIDogJWQiLCByZXQpOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0Jc2tsX2RzcF9pbml0X2NvcmVfc3RhdGUoc3N0KTsKKwlza2wtPmlzX2ZpcnN0X2Jvb3QgPSB0cnVlOwogCiAJaWYgKGRzcCkKIAkJKmRzcCA9IHNrbDsKIAogCXJldHVybiByZXQ7Ci0KLWNsZWFudXA6Ci0Jc2tsX3NzdF9kc3BfY2xlYW51cChkZXYsIHNrbCk7Ci0JcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNrbF9zc3RfZHNwX2luaXQpOwogCitpbnQgc2tsX3NzdF9pbml0X2Z3KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrbF9zc3QgKmN0eCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBjdHgtPmRzcDsKKworCXJldCA9IHNzdC0+Zndfb3BzLmxvYWRfZncoc3N0KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkxvYWQgYmFzZSBmdyBmYWlsZWQgOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlza2xfZHNwX2luaXRfY29yZV9zdGF0ZShzc3QpOworCWN0eC0+aXNfZmlyc3RfYm9vdCA9IGZhbHNlOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChza2xfc3N0X2luaXRfZncpOworCiB2b2lkIHNrbF9zc3RfZHNwX2NsZWFudXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2tsX3NzdCAqY3R4KQogewogCXNrbF9jbGVhcl9tb2R1bGVfdGFibGUoY3R4LT5kc3ApOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXRvcG9sb2d5LmMgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtdG9wb2xvZ3kuYwppbmRleCBjYzAxNTBmLi5iNWIxOTM0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtdG9wb2xvZ3kuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtdG9wb2xvZ3kuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLXRvcG9sb2d5Lmg+CisjaW5jbHVkZSA8dWFwaS9zb3VuZC9zbmRfc3N0X3Rva2Vucy5oPgogI2luY2x1ZGUgInNrbC1zc3QtZHNwLmgiCiAjaW5jbHVkZSAic2tsLXNzdC1pcGMuaCIKICNpbmNsdWRlICJza2wtdG9wb2xvZ3kuaCIKQEAgLTMyLDYgKzMzLDggQEAKICNkZWZpbmUgU0tMX0NIX0ZJWFVQX01BU0sJCSgxIDw8IDApCiAjZGVmaW5lIFNLTF9SQVRFX0ZJWFVQX01BU0sJCSgxIDw8IDEpCiAjZGVmaW5lIFNLTF9GTVRfRklYVVBfTUFTSwkJKDEgPDwgMikKKyNkZWZpbmUgU0tMX0lOX0RJUl9CSVRfTUFTSwkJQklUKDApCisjZGVmaW5lIFNLTF9QSU5fQ09VTlRfTUFTSwkJR0VOTUFTSyg3LCA0KQogCiAvKgogICogU0tMIERTUCBkcml2ZXIgbW9kZWxsaW5nIHVzZXMgb25seSBmZXcgREFQTSB3aWRnZXRzIHNvIGZvciByZXN0IHdlIHdpbGwKQEAgLTQ3Myw2ICs0NzYsMTQgQEAKIAkJdyA9IHdfbW9kdWxlLT53OwogCQltY29uZmlnID0gdy0+cHJpdjsKIAorCQkvKiBjaGVjayBpZiBtb2R1bGUgaWRzIGFyZSBwb3B1bGF0ZWQgKi8KKwkJaWYgKG1jb25maWctPmlkLm1vZHVsZV9pZCA8IDApIHsKKwkJCWRldl9lcnIoc2tsLT5za2xfc3N0LT5kZXYsCisJCQkJCSJtb2R1bGUgJXBVTCBpZCBub3QgcG9wdWxhdGVkXG4iLAorCQkJCQkodXVpZF9sZSAqKW1jb25maWctPmd1aWQpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwogCQkvKiBjaGVjayByZXNvdXJjZSBhdmFpbGFibGUgKi8KIAkJaWYgKCFza2xfaXNfcGlwZV9tY3BzX2F2YWlsKHNrbCwgbWNvbmZpZykpCiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTQ5NCwxMiArNTA1LDE1IEBACiAJCSAqIEZFL0JFIHBhcmFtcwogCQkgKi8KIAkJc2tsX3RwbGdfdXBkYXRlX21vZHVsZV9wYXJhbXModywgY3R4KTsKLQorCQltY29uZmlnLT5pZC5wdnRfaWQgPSBza2xfZ2V0X3B2dF9pZChjdHgsIG1jb25maWcpOworCQlpZiAobWNvbmZpZy0+aWQucHZ0X2lkIDwgMCkKKwkJCXJldHVybiByZXQ7CiAJCXNrbF90cGxnX3NldF9tb2R1bGVfaW5pdF9kYXRhKHcpOwogCQlyZXQgPSBza2xfaW5pdF9tb2R1bGUoY3R4LCBtY29uZmlnKTsKLQkJaWYgKHJldCA8IDApCisJCWlmIChyZXQgPCAwKSB7CisJCQlza2xfcHV0X3B2dF9pZChjdHgsIG1jb25maWcpOwogCQkJcmV0dXJuIHJldDsKLQorCQl9CiAJCXNrbF90cGxnX2FsbG9jX3BpcGVfbWNwcyhza2wsIG1jb25maWcpOwogCQlyZXQgPSBza2xfdHBsZ19zZXRfbW9kdWxlX3BhcmFtcyh3LCBjdHgpOwogCQlpZiAocmV0IDwgMCkKQEAgLTUxMiw2ICs1MjYsNyBAQAogc3RhdGljIGludCBza2xfdHBsZ191bmxvYWRfcGlwZV9tb2R1bGVzKHN0cnVjdCBza2xfc3N0ICpjdHgsCiAJIHN0cnVjdCBza2xfcGlwZSAqcGlwZSkKIHsKKwlpbnQgcmV0OwogCXN0cnVjdCBza2xfcGlwZV9tb2R1bGUgKndfbW9kdWxlID0gTlVMTDsKIAlzdHJ1Y3Qgc2tsX21vZHVsZV9jZmcgKm1jb25maWcgPSBOVUxMOwogCkBAIC01MTksOSArNTM0LDEzIEBACiAJCW1jb25maWcgID0gd19tb2R1bGUtPnctPnByaXY7CiAKIAkJaWYgKG1jb25maWctPmlzX2xvYWRhYmxlICYmIGN0eC0+ZHNwLT5md19vcHMudW5sb2FkX21vZCAmJgotCQkJbWNvbmZpZy0+bV9zdGF0ZSA+IFNLTF9NT0RVTEVfVU5JTklUKQotCQkJcmV0dXJuIGN0eC0+ZHNwLT5md19vcHMudW5sb2FkX21vZChjdHgtPmRzcCwKKwkJCW1jb25maWctPm1fc3RhdGUgPiBTS0xfTU9EVUxFX1VOSU5JVCkgeworCQkJcmV0ID0gY3R4LT5kc3AtPmZ3X29wcy51bmxvYWRfbW9kKGN0eC0+ZHNwLAogCQkJCQkJbWNvbmZpZy0+aWQubW9kdWxlX2lkKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiAtRUlPOworCQl9CisJCXNrbF9wdXRfcHZ0X2lkKGN0eCwgbWNvbmZpZyk7CiAJfQogCiAJLyogbm8gbW9kdWxlcyB0byB1bmxvYWQgaW4gdGhpcyBwYXRoLCBzbyByZXR1cm4gKi8KQEAgLTU4OCw2ICs2MDcsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBza2xfZmlsbF9zaW5rX2luc3RhbmNlX2lkKHN0cnVjdCBza2xfc3N0ICpjdHgsCisJCQkJc3RydWN0IHNrbF9hbGdvX2RhdGEgKmFsZ19kYXRhKQoreworCXN0cnVjdCBza2xfa3BiX3BhcmFtcyAqcGFyYW1zID0gKHN0cnVjdCBza2xfa3BiX3BhcmFtcyAqKWFsZ19kYXRhLT5wYXJhbXM7CisJc3RydWN0IHNrbF9tb2RfaW5zdF9tYXAgKmluc3Q7CisJaW50IGksIHB2dF9pZDsKKworCWluc3QgPSBwYXJhbXMtPm1hcDsKKworCWZvciAoaSA9IDA7IGkgPCBwYXJhbXMtPm51bV9tb2R1bGVzOyBpKyspIHsKKwkJcHZ0X2lkID0gc2tsX2dldF9wdnRfaW5zdGFuY2VfaWRfbWFwKGN0eCwKKwkJCQkJaW5zdC0+bW9kX2lkLCBpbnN0LT5pbnN0X2lkKTsKKwkJaWYgKHB2dF9pZCA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaW5zdC0+aW5zdF9pZCA9IHB2dF9pZDsKKwkJaW5zdCsrOworCX0KKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIFNvbWUgbW9kdWxlcyByZXF1aXJlIHBhcmFtcyB0byBiZSBzZXQgYWZ0ZXIgdGhlIG1vZHVsZSBpcyBib3VuZCB0bwogICogYWxsIHBpbnMgY29ubmVjdGVkLgpAQCAtNjM2LDYgKzY3NSw4IEBACiAJCQliYyA9IChzdHJ1Y3Qgc2tsX2FsZ29fZGF0YSAqKXNiLT5kb2JqLnByaXZhdGU7CiAKIAkJCWlmIChiYy0+c2V0X3BhcmFtcyA9PSBTS0xfUEFSQU1fQklORCkgeworCQkJCWlmIChtY29uZmlnLT5tX3R5cGUgPT0gU0tMX01PRFVMRV9UWVBFX0tQQikKKwkJCQkJc2tsX2ZpbGxfc2lua19pbnN0YW5jZV9pZChjdHgsIGJjKTsKIAkJCQlyZXQgPSBza2xfc2V0X21vZHVsZV9wYXJhbXMoY3R4LAogCQkJCQkJKHUzMiAqKWJjLT5wYXJhbXMsIGJjLT5tYXgsCiAJCQkJCQliYy0+cGFyYW1faWQsIG1jb25maWcpOwpAQCAtMTQ2MCw4NSArMTUwMSw1NzAgQEAKIAkJCQkJc2tsX3RwbGdfdGx2X2NvbnRyb2xfc2V0fSwKIH07CiAKLS8qCi0gKiBUaGUgdG9wb2xvZ3kgYmluYXJ5IHBhc3NlcyB0aGUgcGluIGluZm8gZm9yIGEgbW9kdWxlIHNvIGluaXRpYWxpemUgdGhlIHBpbgotICogaW5mbyBwYXNzZWQgaW50byBtb2R1bGUgaW5zdGFuY2UKLSAqLwotc3RhdGljIHZvaWQgc2tsX2ZpbGxfbW9kdWxlX3Bpbl9pbmZvKHN0cnVjdCBza2xfZGZ3X21vZHVsZV9waW4gKmRmd19waW4sCi0JCQkJCQlzdHJ1Y3Qgc2tsX21vZHVsZV9waW4gKm1fcGluLAotCQkJCQkJYm9vbCBpc19keW5hbWljLCBpbnQgbWF4X3BpbikKK3N0YXRpYyBpbnQgc2tsX3RwbGdfZmlsbF9waXBlX3RrbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3Qgc2tsX3BpcGUgKnBpcGUsIHUzMiB0a24sCisJCQl1MzIgdGtuX3ZhbCkKIHsKLQlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBtYXhfcGluOyBpKyspIHsKLQkJbV9waW5baV0uaWQubW9kdWxlX2lkID0gZGZ3X3BpbltpXS5tb2R1bGVfaWQ7Ci0JCW1fcGluW2ldLmlkLmluc3RhbmNlX2lkID0gZGZ3X3BpbltpXS5pbnN0YW5jZV9pZDsKLQkJbV9waW5baV0uaW5fdXNlID0gZmFsc2U7Ci0JCW1fcGluW2ldLmlzX2R5bmFtaWMgPSBpc19keW5hbWljOwotCQltX3BpbltpXS5waW5fc3RhdGUgPSBTS0xfUElOX1VOQklORDsKKwlzd2l0Y2ggKHRrbikgeworCWNhc2UgU0tMX1RLTl9VMzJfUElQRV9DT05OX1RZUEU6CisJCXBpcGUtPmNvbm5fdHlwZSA9IHRrbl92YWw7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9QSVBFX1BSSU9SSVRZOgorCQlwaXBlLT5waXBlX3ByaW9yaXR5ID0gdGtuX3ZhbDsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX1BJUEVfTUVNX1BHUzoKKwkJcGlwZS0+bWVtb3J5X3BhZ2VzID0gdGtuX3ZhbDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIlRva2VuIG5vdCBoYW5kbGVkICVkXG4iLCB0a24pOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisKKwlyZXR1cm4gMDsKIH0KIAogLyoKLSAqIEFkZCBwaXBlbGluZSBmcm9tIHRvcG9sb2d5IGJpbmFyeSBpbnRvIGRyaXZlciBwaXBlbGluZSBsaXN0Ci0gKgotICogSWYgYWxyZWFkeSBhZGRlZCB3ZSByZXR1cm4gdGhhdCBpbnN0YW5jZQotICogT3RoZXJ3aXNlIHdlIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBhbmQgYWRkIGludG8gZHJpdmVyIGxpc3QKKyAqIEFkZCBwaXBlbGluZSBieSBwYXJzaW5nIHRoZSByZWxldmFudCB0b2tlbnMKKyAqIFJldHVybiBhbiBleGlzdGluZyBwaXBlIGlmIHRoZSBwaXBlIGFscmVhZHkgZXhpc3RzLgogICovCi1zdGF0aWMgc3RydWN0IHNrbF9waXBlICpza2xfdHBsZ19hZGRfcGlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3Qgc2tsICpza2wsIHN0cnVjdCBza2xfZGZ3X3BpcGUgKmRmd19waXBlKQorc3RhdGljIGludCBza2xfdHBsZ19hZGRfcGlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBza2xfbW9kdWxlX2NmZyAqbWNvbmZpZywgc3RydWN0IHNrbCAqc2tsLAorCQlzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl92YWx1ZV9lbGVtICp0a25fZWxlbSkKIHsKIAlzdHJ1Y3Qgc2tsX3BpcGVsaW5lICpwcGw7CiAJc3RydWN0IHNrbF9waXBlICpwaXBlOwogCXN0cnVjdCBza2xfcGlwZV9wYXJhbXMgKnBhcmFtczsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocHBsLCAmc2tsLT5wcGxfbGlzdCwgbm9kZSkgewotCQlpZiAocHBsLT5waXBlLT5wcGxfaWQgPT0gZGZ3X3BpcGUtPnBpcGVfaWQpCi0JCQlyZXR1cm4gcHBsLT5waXBlOworCQlpZiAocHBsLT5waXBlLT5wcGxfaWQgPT0gdGtuX2VsZW0tPnZhbHVlKSB7CisJCQltY29uZmlnLT5waXBlID0gcHBsLT5waXBlOworCQkJcmV0dXJuIEVFWElTVDsKKwkJfQogCX0KIAogCXBwbCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcHBsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcGwpCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKIAogCXBpcGUgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBpcGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBpcGUpCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKIAogCXBhcmFtcyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcGFyYW1zKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwYXJhbXMpCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKIAotCXBpcGUtPnBwbF9pZCA9IGRmd19waXBlLT5waXBlX2lkOwotCXBpcGUtPm1lbW9yeV9wYWdlcyA9IGRmd19waXBlLT5tZW1vcnlfcGFnZXM7Ci0JcGlwZS0+cGlwZV9wcmlvcml0eSA9IGRmd19waXBlLT5waXBlX3ByaW9yaXR5OwotCXBpcGUtPmNvbm5fdHlwZSA9IGRmd19waXBlLT5jb25uX3R5cGU7Ci0JcGlwZS0+c3RhdGUgPSBTS0xfUElQRV9JTlZBTElEOwogCXBpcGUtPnBfcGFyYW1zID0gcGFyYW1zOworCXBpcGUtPnBwbF9pZCA9IHRrbl9lbGVtLT52YWx1ZTsKIAlJTklUX0xJU1RfSEVBRCgmcGlwZS0+d19saXN0KTsKIAogCXBwbC0+cGlwZSA9IHBpcGU7CiAJbGlzdF9hZGQoJnBwbC0+bm9kZSwgJnNrbC0+cHBsX2xpc3QpOwogCi0JcmV0dXJuIHBwbC0+cGlwZTsKKwltY29uZmlnLT5waXBlID0gcGlwZTsKKwltY29uZmlnLT5waXBlLT5zdGF0ZSA9IFNLTF9QSVBFX0lOVkFMSUQ7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc2tsX3RwbGdfZmlsbF9mbXQoc3RydWN0IHNrbF9tb2R1bGVfZm10ICpkc3RfZm10LAotCQkJCXN0cnVjdCBza2xfZGZ3X21vZHVsZV9mbXQgKnNyY19mbXQsCi0JCQkJaW50IHBpbnMpCitzdGF0aWMgaW50IHNrbF90cGxnX2ZpbGxfcGluKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHRrbiwKKwkJCXN0cnVjdCBza2xfbW9kdWxlX3BpbiAqbV9waW4sCisJCQlpbnQgcGluX2luZGV4LCB1MzIgdmFsdWUpCit7CisJc3dpdGNoICh0a24pIHsKKwljYXNlIFNLTF9US05fVTMyX1BJTl9NT0RfSUQ6CisJCW1fcGluW3Bpbl9pbmRleF0uaWQubW9kdWxlX2lkID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9QSU5fSU5TVF9JRDoKKwkJbV9waW5bcGluX2luZGV4XS5pZC5pbnN0YW5jZV9pZCA9IHZhbHVlOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiJWQgTm90IGEgcGluIHRva2VuXG4iLCB2YWx1ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogUGFyc2UgZm9yIHBpbiBjb25maWcgc3BlY2lmaWMgdG9rZW5zIHRvIGZpbGwgdXAgdGhlCisgKiBtb2R1bGUgcHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbnQgc2tsX3RwbGdfZmlsbF9waW5zX2luZm8oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3Qgc2tsX21vZHVsZV9jZmcgKm1jb25maWcsCisJCXN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX3ZhbHVlX2VsZW0gKnRrbl9lbGVtLAorCQlpbnQgZGlyLCBpbnQgcGluX2NvdW50KQoreworCWludCByZXQ7CisJc3RydWN0IHNrbF9tb2R1bGVfcGluICptX3BpbjsKKworCXN3aXRjaCAoZGlyKSB7CisJY2FzZSBTS0xfRElSX0lOOgorCQltX3BpbiA9IG1jb25maWctPm1faW5fcGluOworCQlicmVhazsKKworCWNhc2UgU0tMX0RJUl9PVVQ6CisJCW1fcGluID0gbWNvbmZpZy0+bV9vdXRfcGluOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBkaXJlY3Rpb24gdmFsdWVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBza2xfdHBsZ19maWxsX3BpbihkZXYsIHRrbl9lbGVtLT50b2tlbiwKKwkJCW1fcGluLCBwaW5fY291bnQsIHRrbl9lbGVtLT52YWx1ZSk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW1fcGluW3Bpbl9jb3VudF0uaW5fdXNlID0gZmFsc2U7CisJbV9waW5bcGluX2NvdW50XS5waW5fc3RhdGUgPSBTS0xfUElOX1VOQklORDsKKworCXJldHVybiAwOworfQorCisvKgorICogRmlsbCB1cCBpbnB1dC9vdXRwdXQgbW9kdWxlIGNvbmZpZyBmb3JtYXQgYmFzZWQKKyAqIG9uIHRoZSBkaXJlY3Rpb24KKyAqLworc3RhdGljIGludCBza2xfdHBsZ19maWxsX2ZtdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBza2xfbW9kdWxlX2NmZyAqbWNvbmZpZywJdTMyIHRrbiwKKwkJdTMyIHZhbHVlLCB1MzIgZGlyLCB1MzIgcGluX2NvdW50KQoreworCXN0cnVjdCBza2xfbW9kdWxlX2ZtdCAqZHN0X2ZtdDsKKworCXN3aXRjaCAoZGlyKSB7CisJY2FzZSBTS0xfRElSX0lOOgorCQlkc3RfZm10ID0gbWNvbmZpZy0+aW5fZm10OworCQlkc3RfZm10ICs9IHBpbl9jb3VudDsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9ESVJfT1VUOgorCQlkc3RfZm10ID0gbWNvbmZpZy0+b3V0X2ZtdDsKKwkJZHN0X2ZtdCArPSBwaW5fY291bnQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIGRpcmVjdGlvbiB2YWx1ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAodGtuKSB7CisJY2FzZSBTS0xfVEtOX1UzMl9GTVRfQ0g6CisJCWRzdF9mbXQtPmNoYW5uZWxzICA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfRk1UX0ZSRVE6CisJCWRzdF9mbXQtPnNfZnJlcSA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfRk1UX0JJVF9ERVBUSDoKKwkJZHN0X2ZtdC0+Yml0X2RlcHRoID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9GTVRfU0FNUExFX1NJWkU6CisJCWRzdF9mbXQtPnZhbGlkX2JpdF9kZXB0aCA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfRk1UX0NIX0NPTkZJRzoKKwkJZHN0X2ZtdC0+Y2hfY2ZnID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9GTVRfSU5URVJMRUFWRToKKwkJZHN0X2ZtdC0+aW50ZXJsZWF2aW5nX3N0eWxlID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9GTVRfU0FNUExFX1RZUEU6CisJCWRzdF9mbXQtPnNhbXBsZV90eXBlID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9GTVRfQ0hfTUFQOgorCQlkc3RfZm10LT5jaF9tYXAgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIkludmFsaWQgdG9rZW4gJWRcbiIsIHRrbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNrbF90cGxnX2dldF91dWlkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrbF9tb2R1bGVfY2ZnICptY29uZmlnLAorCSAgICAgIHN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX3V1aWRfZWxlbSAqdXVpZF90a24pCit7CisJaWYgKHV1aWRfdGtuLT50b2tlbiA9PSBTS0xfVEtOX1VVSUQpCisJCW1lbWNweSgmbWNvbmZpZy0+Z3VpZCwgJnV1aWRfdGtuLT51dWlkLCAxNik7CisJZWxzZSB7CisJCWRldl9lcnIoZGV2LCAiTm90IGFuIFVVSUQgdG9rZW4gdGtuICVkXG4iLCB1dWlkX3Rrbi0+dG9rZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2tsX3RwbGdfZmlsbF9waW5fZHluYW1pY192YWwoCisJCXN0cnVjdCBza2xfbW9kdWxlX3BpbiAqbXBpbiwgdTMyIHBpbl9jb3VudCwgdTMyIHZhbHVlKQogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IHBpbnM7IGkrKykgewotCQlkc3RfZm10W2ldLmNoYW5uZWxzICA9IHNyY19mbXRbaV0uY2hhbm5lbHM7Ci0JCWRzdF9mbXRbaV0uc19mcmVxID0gc3JjX2ZtdFtpXS5mcmVxOwotCQlkc3RfZm10W2ldLmJpdF9kZXB0aCA9IHNyY19mbXRbaV0uYml0X2RlcHRoOwotCQlkc3RfZm10W2ldLnZhbGlkX2JpdF9kZXB0aCA9IHNyY19mbXRbaV0udmFsaWRfYml0X2RlcHRoOwotCQlkc3RfZm10W2ldLmNoX2NmZyA9IHNyY19mbXRbaV0uY2hfY2ZnOwotCQlkc3RfZm10W2ldLmNoX21hcCA9IHNyY19mbXRbaV0uY2hfbWFwOwotCQlkc3RfZm10W2ldLmludGVybGVhdmluZ19zdHlsZSA9IHNyY19mbXRbaV0uaW50ZXJsZWF2aW5nX3N0eWxlOwotCQlkc3RfZm10W2ldLnNhbXBsZV90eXBlID0gc3JjX2ZtdFtpXS5zYW1wbGVfdHlwZTsKKwlmb3IgKGkgPSAwOyBpIDwgcGluX2NvdW50OyBpKyspCisJCW1waW5baV0uaXNfZHluYW1pYyA9IHZhbHVlOworfQorCisvKgorICogUGFyc2UgdG9rZW5zIHRvIGZpbGwgdXAgdGhlIG1vZHVsZSBwcml2YXRlIGRhdGEKKyAqLworc3RhdGljIGludCBza2xfdHBsZ19nZXRfdG9rZW4oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl92YWx1ZV9lbGVtICp0a25fZWxlbSwKKwkJc3RydWN0IHNrbCAqc2tsLCBzdHJ1Y3Qgc2tsX21vZHVsZV9jZmcgKm1jb25maWcpCit7CisJaW50IHRrbl9jb3VudCA9IDA7CisJaW50IHJldDsKKwlzdGF0aWMgaW50IGlzX3BpcGVfZXhpc3RzOworCXN0YXRpYyBpbnQgcGluX2luZGV4LCBkaXI7CisKKwlpZiAodGtuX2VsZW0tPnRva2VuID4gU0tMX1RLTl9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoICh0a25fZWxlbS0+dG9rZW4pIHsKKwljYXNlIFNLTF9US05fVThfSU5fUVVFVUVfQ09VTlQ6CisJCW1jb25maWctPm1heF9pbl9xdWV1ZSA9IHRrbl9lbGVtLT52YWx1ZTsKKwkJbWNvbmZpZy0+bV9pbl9waW4gPSBkZXZtX2t6YWxsb2MoZGV2LCBtY29uZmlnLT5tYXhfaW5fcXVldWUgKgorCQkJCQlzaXplb2YoKm1jb25maWctPm1faW5fcGluKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghbWNvbmZpZy0+bV9pbl9waW4pCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VOF9PVVRfUVVFVUVfQ09VTlQ6CisJCW1jb25maWctPm1heF9vdXRfcXVldWUgPSB0a25fZWxlbS0+dmFsdWU7CisJCW1jb25maWctPm1fb3V0X3BpbiA9IGRldm1fa3phbGxvYyhkZXYsIG1jb25maWctPm1heF9vdXRfcXVldWUgKgorCQkJCQlzaXplb2YoKm1jb25maWctPm1fb3V0X3BpbiksCisJCQkJCUdGUF9LRVJORUwpOworCisJCWlmICghbWNvbmZpZy0+bV9vdXRfcGluKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVThfRFlOX0lOX1BJTjoKKwkJaWYgKCFtY29uZmlnLT5tX2luX3BpbikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXNrbF90cGxnX2ZpbGxfcGluX2R5bmFtaWNfdmFsKG1jb25maWctPm1faW5fcGluLAorCQkJbWNvbmZpZy0+bWF4X2luX3F1ZXVlLCB0a25fZWxlbS0+dmFsdWUpOworCisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1U4X0RZTl9PVVRfUElOOgorCQlpZiAoIW1jb25maWctPm1fb3V0X3BpbikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXNrbF90cGxnX2ZpbGxfcGluX2R5bmFtaWNfdmFsKG1jb25maWctPm1fb3V0X3BpbiwKKwkJCW1jb25maWctPm1heF9vdXRfcXVldWUsIHRrbl9lbGVtLT52YWx1ZSk7CisKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVThfVElNRV9TTE9UOgorCQltY29uZmlnLT50aW1lX3Nsb3QgPSB0a25fZWxlbS0+dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1U4X0NPUkVfSUQ6CisJCW1jb25maWctPmNvcmVfaWQgPSB0a25fZWxlbS0+dmFsdWU7CisKKwljYXNlIFNLTF9US05fVThfTU9EX1RZUEU6CisJCW1jb25maWctPm1fdHlwZSA9IHRrbl9lbGVtLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVThfREVWX1RZUEU6CisJCW1jb25maWctPmRldl90eXBlID0gdGtuX2VsZW0tPnZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VOF9IV19DT05OX1RZUEU6CisJCW1jb25maWctPmh3X2Nvbm5fdHlwZSA9IHRrbl9lbGVtLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTE2X01PRF9JTlNUX0lEOgorCQltY29uZmlnLT5pZC5pbnN0YW5jZV9pZCA9CisJCXRrbl9lbGVtLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX01FTV9QQUdFUzoKKwkJbWNvbmZpZy0+bWVtX3BhZ2VzID0gdGtuX2VsZW0tPnZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfTUFYX01DUFM6CisJCW1jb25maWctPm1jcHMgPSB0a25fZWxlbS0+dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9PQlM6CisJCW1jb25maWctPm9icyA9IHRrbl9lbGVtLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX0lCUzoKKwkJbWNvbmZpZy0+aWJzID0gdGtuX2VsZW0tPnZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfVkJVU19JRDoKKwkJbWNvbmZpZy0+dmJ1c19pZCA9IHRrbl9lbGVtLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX1BBUkFNU19GSVhVUDoKKwkJbWNvbmZpZy0+cGFyYW1zX2ZpeHVwID0gdGtuX2VsZW0tPnZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfQ09OVkVSVEVSOgorCQltY29uZmlnLT5jb252ZXJ0ZXIgPSB0a25fZWxlbS0+dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9QSVBFX0lEOgorCQlyZXQgPSBza2xfdHBsZ19hZGRfcGlwZShkZXYsCisJCQkJbWNvbmZpZywgc2tsLCB0a25fZWxlbSk7CisKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gaXNfcGlwZV9leGlzdHM7CisKKwkJaWYgKHJldCA9PSBFRVhJU1QpCisJCQlpc19waXBlX2V4aXN0cyA9IDE7CisKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX1BJUEVfQ09OTl9UWVBFOgorCWNhc2UgU0tMX1RLTl9VMzJfUElQRV9QUklPUklUWToKKwljYXNlIFNLTF9US05fVTMyX1BJUEVfTUVNX1BHUzoKKwkJaWYgKGlzX3BpcGVfZXhpc3RzKSB7CisJCQlyZXQgPSBza2xfdHBsZ19maWxsX3BpcGVfdGtuKGRldiwgbWNvbmZpZy0+cGlwZSwKKwkJCQkJdGtuX2VsZW0tPnRva2VuLCB0a25fZWxlbS0+dmFsdWUpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWJyZWFrOworCisJLyoKKwkgKiBTS0xfVEtOX1UzMl9ESVJfUElOX0NPVU5UIHRva2VuIGhhcyB0aGUgdmFsdWUgZm9yIGJvdGgKKwkgKiBkaXJlY3Rpb24gYW5kIHRoZSBwaW4gY291bnQuIFRoZSBmaXJzdCBmb3VyIGJpdHMgcmVwcmVzZW50CisJICogZGlyZWN0aW9uIGFuZCBuZXh0IGZvdXIgdGhlIHBpbiBjb3VudC4KKwkgKi8KKwljYXNlIFNLTF9US05fVTMyX0RJUl9QSU5fQ09VTlQ6CisJCWRpciA9IHRrbl9lbGVtLT52YWx1ZSAmIFNLTF9JTl9ESVJfQklUX01BU0s7CisJCXBpbl9pbmRleCA9ICh0a25fZWxlbS0+dmFsdWUgJgorCQkJU0tMX1BJTl9DT1VOVF9NQVNLKSA+PiA0OworCisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9GTVRfQ0g6CisJY2FzZSBTS0xfVEtOX1UzMl9GTVRfRlJFUToKKwljYXNlIFNLTF9US05fVTMyX0ZNVF9CSVRfREVQVEg6CisJY2FzZSBTS0xfVEtOX1UzMl9GTVRfU0FNUExFX1NJWkU6CisJY2FzZSBTS0xfVEtOX1UzMl9GTVRfQ0hfQ09ORklHOgorCWNhc2UgU0tMX1RLTl9VMzJfRk1UX0lOVEVSTEVBVkU6CisJY2FzZSBTS0xfVEtOX1UzMl9GTVRfU0FNUExFX1RZUEU6CisJY2FzZSBTS0xfVEtOX1UzMl9GTVRfQ0hfTUFQOgorCQlyZXQgPSBza2xfdHBsZ19maWxsX2ZtdChkZXYsIG1jb25maWcsIHRrbl9lbGVtLT50b2tlbiwKKwkJCQl0a25fZWxlbS0+dmFsdWUsIGRpciwgcGluX2luZGV4KTsKKworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX1BJTl9NT0RfSUQ6CisJY2FzZSBTS0xfVEtOX1UzMl9QSU5fSU5TVF9JRDoKKwkJcmV0ID0gc2tsX3RwbGdfZmlsbF9waW5zX2luZm8oZGV2LAorCQkJCW1jb25maWcsIHRrbl9lbGVtLCBkaXIsCisJCQkJcGluX2luZGV4KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9DQVBTX1NJWkU6CisJCW1jb25maWctPmZvcm1hdHNfY29uZmlnLmNhcHNfc2l6ZSA9CisJCQl0a25fZWxlbS0+dmFsdWU7CisKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX1BST0NfRE9NQUlOOgorCQltY29uZmlnLT5kb21haW4gPQorCQkJdGtuX2VsZW0tPnZhbHVlOworCisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1U4X0lOX1BJTl9UWVBFOgorCWNhc2UgU0tMX1RLTl9VOF9PVVRfUElOX1RZUEU6CisJY2FzZSBTS0xfVEtOX1U4X0NPTk5fVFlQRToKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIlRva2VuICVkIG5vdCBoYW5kbGVkXG4iLAorCQkJCXRrbl9lbGVtLT50b2tlbik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KKworCXRrbl9jb3VudCsrOworCisJcmV0dXJuIHRrbl9jb3VudDsKK30KKworLyoKKyAqIFBhcnNlIHRoZSB2ZW5kb3IgYXJyYXkgZm9yIHNwZWNpZmljIHRva2VucyB0byBjb25zdHJ1Y3QKKyAqIG1vZHVsZSBwcml2YXRlIGRhdGEKKyAqLworc3RhdGljIGludCBza2xfdHBsZ19nZXRfdG9rZW5zKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJY2hhciAqcHZ0X2RhdGEsCXN0cnVjdCBza2wgKnNrbCwKKwkJc3RydWN0IHNrbF9tb2R1bGVfY2ZnICptY29uZmlnLCBpbnQgYmxvY2tfc2l6ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9hcnJheSAqYXJyYXk7CisJc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfdmFsdWVfZWxlbSAqdGtuX2VsZW07CisJaW50IHRrbl9jb3VudCA9IDAsIHJldDsKKwlpbnQgb2ZmID0gMCwgdHVwbGVfc2l6ZSA9IDA7CisKKwlpZiAoYmxvY2tfc2l6ZSA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdoaWxlICh0dXBsZV9zaXplIDwgYmxvY2tfc2l6ZSkgeworCQlhcnJheSA9IChzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9hcnJheSAqKShwdnRfZGF0YSArIG9mZik7CisKKwkJb2ZmICs9IGFycmF5LT5zaXplOworCisJCXN3aXRjaCAoYXJyYXktPnR5cGUpIHsKKwkJY2FzZSBTTkRfU09DX1RQTEdfVFVQTEVfVFlQRV9TVFJJTkc6CisJCQlkZXZfd2FybihkZXYsICJubyBzdHJpbmcgdG9rZW5zIGV4cGVjdGVkIGZvciBza2wgdHBsZ1xuIik7CisJCQljb250aW51ZTsKKworCQljYXNlIFNORF9TT0NfVFBMR19UVVBMRV9UWVBFX1VVSUQ6CisJCQlyZXQgPSBza2xfdHBsZ19nZXRfdXVpZChkZXYsIG1jb25maWcsIGFycmF5LT51dWlkKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisKKwkJCXR1cGxlX3NpemUgKz0gc2l6ZW9mKCphcnJheS0+dXVpZCk7CisKKwkJCWNvbnRpbnVlOworCisJCWRlZmF1bHQ6CisJCQl0a25fZWxlbSA9IGFycmF5LT52YWx1ZTsKKwkJCXRrbl9jb3VudCA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCXdoaWxlICh0a25fY291bnQgPD0gKGFycmF5LT5udW1fZWxlbXMgLSAxKSkgeworCQkJcmV0ID0gc2tsX3RwbGdfZ2V0X3Rva2VuKGRldiwgdGtuX2VsZW0sCisJCQkJCXNrbCwgbWNvbmZpZyk7CisKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisKKwkJCXRrbl9jb3VudCA9IHRrbl9jb3VudCArIHJldDsKKwkJCXRrbl9lbGVtKys7CisJCX0KKworCQl0dXBsZV9zaXplICs9IHRrbl9jb3VudCAqIHNpemVvZigqdGtuX2VsZW0pOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogRXZlcnkgZGF0YSBibG9jayBpcyBwcmVjZWRlZCBieSBhIGRlc2NyaXB0b3IgdG8gcmVhZCB0aGUgbnVtYmVyCisgKiBvZiBkYXRhIGJsb2NrcywgdGhleSB0eXBlIG9mIHRoZSBibG9jayBhbmQgaXQncyBzaXplCisgKi8KK3N0YXRpYyBpbnQgc2tsX3RwbGdfZ2V0X2Rlc2NfYmxvY2tzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfYXJyYXkgKmFycmF5KQoreworCXN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX3ZhbHVlX2VsZW0gKnRrbl9lbGVtOworCisJdGtuX2VsZW0gPSBhcnJheS0+dmFsdWU7CisKKwlzd2l0Y2ggKHRrbl9lbGVtLT50b2tlbikgeworCWNhc2UgU0tMX1RLTl9VOF9OVU1fQkxPQ0tTOgorCWNhc2UgU0tMX1RLTl9VOF9CTE9DS19UWVBFOgorCWNhc2UgU0tMX1RLTl9VMTZfQkxPQ0tfU0laRToKKwkJcmV0dXJuIHRrbl9lbGVtLT52YWx1ZTsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBkZXNjcmlwdG9yIHRva2VuICVkXG4iLCB0a25fZWxlbS0+dG9rZW4pOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIFBhcnNlIHRoZSBwcml2YXRlIGRhdGEgZm9yIHRoZSB0b2tlbiBhbmQgY29ycmVzcG9uZGluZyB2YWx1ZS4KKyAqIFRoZSBwcml2YXRlIGRhdGEgY2FuIGhhdmUgbXVsdGlwbGUgZGF0YSBibG9ja3MuIFNvLCBhIGRhdGEgYmxvY2sKKyAqIGlzIHByZWNlZGVkIGJ5IGEgZGVzY3JpcHRvciBmb3IgbnVtYmVyIG9mIGJsb2NrcyBhbmQgYSBkZXNjcmlwdG9yCisgKiBmb3IgdGhlIHR5cGUgYW5kIHNpemUgb2YgdGhlIHN1Y2VlZGluZyBkYXRhIGJsb2NrLgorICovCitzdGF0aWMgaW50IHNrbF90cGxnX2dldF9wdnRfZGF0YShzdHJ1Y3Qgc25kX3NvY190cGxnX2RhcG1fd2lkZ2V0ICp0cGxnX3csCisJCQkJc3RydWN0IHNrbCAqc2tsLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IHNrbF9tb2R1bGVfY2ZnICptY29uZmlnKQoreworCXN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX2FycmF5ICphcnJheTsKKwlpbnQgbnVtX2Jsb2NrcywgYmxvY2tfc2l6ZSA9IDAsIGJsb2NrX3R5cGUsIG9mZiA9IDA7CisJY2hhciAqZGF0YTsKKwlpbnQgcmV0OworCisJLyogUmVhZCB0aGUgTlVNX0RBVEFfQkxPQ0tTIGRlc2NyaXB0b3IgKi8KKwlhcnJheSA9IChzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9hcnJheSAqKXRwbGdfdy0+cHJpdi5kYXRhOworCXJldCA9IHNrbF90cGxnX2dldF9kZXNjX2Jsb2NrcyhkZXYsIGFycmF5KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwludW1fYmxvY2tzID0gcmV0OworCisJb2ZmICs9IGFycmF5LT5zaXplOworCWFycmF5ID0gKHN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX2FycmF5ICopKHRwbGdfdy0+cHJpdi5kYXRhICsgb2ZmKTsKKworCS8qIFJlYWQgdGhlIEJMT0NLX1RZUEUgYW5kIEJMT0NLX1NJWkUgZGVzY3JpcHRvciAqLworCXdoaWxlIChudW1fYmxvY2tzID4gMCkgeworCQlyZXQgPSBza2xfdHBsZ19nZXRfZGVzY19ibG9ja3MoZGV2LCBhcnJheSk7CisKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlibG9ja190eXBlID0gcmV0OworCQlvZmYgKz0gYXJyYXktPnNpemU7CisKKwkJYXJyYXkgPSAoc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfYXJyYXkgKikKKwkJCSh0cGxnX3ctPnByaXYuZGF0YSArIG9mZik7CisKKwkJcmV0ID0gc2tsX3RwbGdfZ2V0X2Rlc2NfYmxvY2tzKGRldiwgYXJyYXkpOworCisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJYmxvY2tfc2l6ZSA9IHJldDsKKwkJb2ZmICs9IGFycmF5LT5zaXplOworCisJCWFycmF5ID0gKHN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX2FycmF5ICopCisJCQkodHBsZ193LT5wcml2LmRhdGEgKyBvZmYpOworCisJCWRhdGEgPSAodHBsZ193LT5wcml2LmRhdGEgKyBvZmYpOworCisJCWlmIChibG9ja190eXBlID09IFNLTF9UWVBFX1RVUExFKSB7CisJCQlyZXQgPSBza2xfdHBsZ19nZXRfdG9rZW5zKGRldiwgZGF0YSwKKwkJCQkJc2tsLCBtY29uZmlnLCBibG9ja19zaXplKTsKKworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKworCQkJLS1udW1fYmxvY2tzOworCQl9IGVsc2UgeworCQkJaWYgKG1jb25maWctPmZvcm1hdHNfY29uZmlnLmNhcHNfc2l6ZSA+IDApCisJCQkJbWVtY3B5KG1jb25maWctPmZvcm1hdHNfY29uZmlnLmNhcHMsIGRhdGEsCisJCQkJCW1jb25maWctPmZvcm1hdHNfY29uZmlnLmNhcHNfc2l6ZSk7CisJCQktLW51bV9ibG9ja3M7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc2tsX2NsZWFyX3Bpbl9jb25maWcoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtLApAQCAtMTYwNiw5ICsyMTMyLDYgQEAKIAlzdHJ1Y3Qgc2tsICpza2wgPSBlYnVzX3RvX3NrbChlYnVzKTsKIAlzdHJ1Y3QgaGRhY19idXMgKmJ1cyA9IGVidXNfdG9faGJ1cyhlYnVzKTsKIAlzdHJ1Y3Qgc2tsX21vZHVsZV9jZmcgKm1jb25maWc7Ci0Jc3RydWN0IHNrbF9waXBlICpwaXBlOwotCXN0cnVjdCBza2xfZGZ3X21vZHVsZSAqZGZ3X2NvbmZpZyA9Ci0JCQkJKHN0cnVjdCBza2xfZGZ3X21vZHVsZSAqKXRwbGdfdy0+cHJpdi5kYXRhOwogCiAJaWYgKCF0cGxnX3ctPnByaXYuc2l6ZSkKIAkJZ290byBiaW5kX2V2ZW50OwpAQCAtMTYxOSw3NiArMjE0MiwxNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXctPnByaXYgPSBtY29uZmlnOwotCW1lbWNweSgmbWNvbmZpZy0+Z3VpZCwgJmRmd19jb25maWctPnV1aWQsIDE2KTsKIAotCXJldCA9IHNuZF9za2xfZ2V0X21vZHVsZV9pbmZvKHNrbC0+c2tsX3NzdCwgbWNvbmZpZy0+Z3VpZCwgZGZ3X2NvbmZpZyk7CisJLyoKKwkgKiBtb2R1bGUgYmluYXJ5IGNhbiBiZSBsb2FkZWQgbGF0ZXIsIHNvIHNldCBpdCB0byBxdWVyeSB3aGVuCisJICogbW9kdWxlIGlzIGxvYWQgZm9yIGEgdXNlIGNhc2UKKwkgKi8KKwltY29uZmlnLT5pZC5tb2R1bGVfaWQgPSAtMTsKKworCS8qIFBhcnNlIHByaXZhdGUgZGF0YSBmb3IgdHVwbGVzICovCisJcmV0ID0gc2tsX3RwbGdfZ2V0X3B2dF9kYXRhKHRwbGdfdywgc2tsLCBidXMtPmRldiwgbWNvbmZpZyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0KLQltY29uZmlnLT5pZC5tb2R1bGVfaWQgPSBkZndfY29uZmlnLT5tb2R1bGVfaWQ7Ci0JbWNvbmZpZy0+aWQuaW5zdGFuY2VfaWQgPSBkZndfY29uZmlnLT5pbnN0YW5jZV9pZDsKLQltY29uZmlnLT5tY3BzID0gZGZ3X2NvbmZpZy0+bWF4X21jcHM7Ci0JbWNvbmZpZy0+aWJzID0gZGZ3X2NvbmZpZy0+aWJzOwotCW1jb25maWctPm9icyA9IGRmd19jb25maWctPm9iczsKLQltY29uZmlnLT5jb3JlX2lkID0gZGZ3X2NvbmZpZy0+Y29yZV9pZDsKLQltY29uZmlnLT5tYXhfaW5fcXVldWUgPSBkZndfY29uZmlnLT5tYXhfaW5fcXVldWU7Ci0JbWNvbmZpZy0+bWF4X291dF9xdWV1ZSA9IGRmd19jb25maWctPm1heF9vdXRfcXVldWU7Ci0JbWNvbmZpZy0+aXNfbG9hZGFibGUgPSBkZndfY29uZmlnLT5pc19sb2FkYWJsZTsKLQlza2xfdHBsZ19maWxsX2ZtdChtY29uZmlnLT5pbl9mbXQsIGRmd19jb25maWctPmluX2ZtdCwKLQkJCQkJCU1PRFVMRV9NQVhfSU5fUElOUyk7Ci0Jc2tsX3RwbGdfZmlsbF9mbXQobWNvbmZpZy0+b3V0X2ZtdCwgZGZ3X2NvbmZpZy0+b3V0X2ZtdCwKLQkJCQkJCU1PRFVMRV9NQVhfT1VUX1BJTlMpOwotCi0JbWNvbmZpZy0+cGFyYW1zX2ZpeHVwID0gZGZ3X2NvbmZpZy0+cGFyYW1zX2ZpeHVwOwotCW1jb25maWctPmNvbnZlcnRlciA9IGRmd19jb25maWctPmNvbnZlcnRlcjsKLQltY29uZmlnLT5tX3R5cGUgPSBkZndfY29uZmlnLT5tb2R1bGVfdHlwZTsKLQltY29uZmlnLT52YnVzX2lkID0gZGZ3X2NvbmZpZy0+dmJ1c19pZDsKLQltY29uZmlnLT5tZW1fcGFnZXMgPSBkZndfY29uZmlnLT5tZW1fcGFnZXM7Ci0KLQlwaXBlID0gc2tsX3RwbGdfYWRkX3BpcGUoYnVzLT5kZXYsIHNrbCwgJmRmd19jb25maWctPnBpcGUpOwotCWlmIChwaXBlKQotCQltY29uZmlnLT5waXBlID0gcGlwZTsKLQotCW1jb25maWctPmRldl90eXBlID0gZGZ3X2NvbmZpZy0+ZGV2X3R5cGU7Ci0JbWNvbmZpZy0+aHdfY29ubl90eXBlID0gZGZ3X2NvbmZpZy0+aHdfY29ubl90eXBlOwotCW1jb25maWctPnRpbWVfc2xvdCA9IGRmd19jb25maWctPnRpbWVfc2xvdDsKLQltY29uZmlnLT5mb3JtYXRzX2NvbmZpZy5jYXBzX3NpemUgPSBkZndfY29uZmlnLT5jYXBzLmNhcHNfc2l6ZTsKLQotCW1jb25maWctPm1faW5fcGluID0gZGV2bV9remFsbG9jKGJ1cy0+ZGV2LCAobWNvbmZpZy0+bWF4X2luX3F1ZXVlKSAqCi0JCQkJCQlzaXplb2YoKm1jb25maWctPm1faW5fcGluKSwKLQkJCQkJCUdGUF9LRVJORUwpOwotCWlmICghbWNvbmZpZy0+bV9pbl9waW4pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWNvbmZpZy0+bV9vdXRfcGluID0gZGV2bV9remFsbG9jKGJ1cy0+ZGV2LCAobWNvbmZpZy0+bWF4X291dF9xdWV1ZSkgKgotCQkJCQkJc2l6ZW9mKCptY29uZmlnLT5tX291dF9waW4pLAotCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtY29uZmlnLT5tX291dF9waW4pCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc2tsX2ZpbGxfbW9kdWxlX3Bpbl9pbmZvKGRmd19jb25maWctPmluX3BpbiwgbWNvbmZpZy0+bV9pbl9waW4sCi0JCQkJCQlkZndfY29uZmlnLT5pc19keW5hbWljX2luX3BpbiwKLQkJCQkJCW1jb25maWctPm1heF9pbl9xdWV1ZSk7Ci0KLQlza2xfZmlsbF9tb2R1bGVfcGluX2luZm8oZGZ3X2NvbmZpZy0+b3V0X3BpbiwgbWNvbmZpZy0+bV9vdXRfcGluLAotCQkJCQkJIGRmd19jb25maWctPmlzX2R5bmFtaWNfb3V0X3BpbiwKLQkJCQkJCQltY29uZmlnLT5tYXhfb3V0X3F1ZXVlKTsKLQotCi0JaWYgKG1jb25maWctPmZvcm1hdHNfY29uZmlnLmNhcHNfc2l6ZSA9PSAwKQotCQlnb3RvIGJpbmRfZXZlbnQ7Ci0KLQltY29uZmlnLT5mb3JtYXRzX2NvbmZpZy5jYXBzID0gKHUzMiAqKWRldm1fa3phbGxvYyhidXMtPmRldiwKLQkJCW1jb25maWctPmZvcm1hdHNfY29uZmlnLmNhcHNfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAobWNvbmZpZy0+Zm9ybWF0c19jb25maWcuY2FwcyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1lbWNweShtY29uZmlnLT5mb3JtYXRzX2NvbmZpZy5jYXBzLCBkZndfY29uZmlnLT5jYXBzLmNhcHMsCi0JCQkJCQkgZGZ3X2NvbmZpZy0+Y2Fwcy5jYXBzX3NpemUpOwotCW1jb25maWctPmZvcm1hdHNfY29uZmlnLnBhcmFtX2lkID0gZGZ3X2NvbmZpZy0+Y2Fwcy5wYXJhbV9pZDsKLQltY29uZmlnLT5mb3JtYXRzX2NvbmZpZy5zZXRfcGFyYW1zID0gZGZ3X2NvbmZpZy0+Y2Fwcy5zZXRfcGFyYW1zOwotCiBiaW5kX2V2ZW50OgogCWlmICh0cGxnX3ctPmV2ZW50X3R5cGUgPT0gMCkgewogCQlkZXZfZGJnKGJ1cy0+ZGV2LCAiQVNvQzogTm8gZXZlbnQgaGFuZGxlciByZXF1aXJlZFxuIik7CkBAIC0xNzY3LDExICsyMjMxLDIyOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNrbF90cGxnX2ZpbGxfc3RyX21mZXN0X3RrbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX3N0cmluZ19lbGVtICpzdHJfZWxlbSwKKwkJc3RydWN0IHNrbF9kZndfbWFuaWZlc3QgKm1pbmZvKQoreworCWludCB0a25fY291bnQgPSAwOworCXN0YXRpYyBpbnQgcmVmX2NvdW50OworCisJc3dpdGNoIChzdHJfZWxlbS0+dG9rZW4pIHsKKwljYXNlIFNLTF9US05fU1RSX0xJQl9OQU1FOgorCQlpZiAocmVmX2NvdW50ID4gbWluZm8tPmxpYl9jb3VudCAtIDEpIHsKKwkJCXJlZl9jb3VudCA9IDA7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXN0cm5jcHkobWluZm8tPmxpYltyZWZfY291bnRdLm5hbWUsIHN0cl9lbGVtLT5zdHJpbmcsCisJCQkJQVJSQVlfU0laRShtaW5mby0+bGliW3JlZl9jb3VudF0ubmFtZSkpOworCQlyZWZfY291bnQrKzsKKwkJdGtuX2NvdW50Kys7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJOb3QgYSBzdHJpbmcgdG9rZW4gJWRcbiIsIHN0cl9lbGVtLT50b2tlbik7CisJCWJyZWFrOworCX0KKworCXJldHVybiB0a25fY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgc2tsX3RwbGdfZ2V0X3N0cl90a24oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9hcnJheSAqYXJyYXksCisJCXN0cnVjdCBza2xfZGZ3X21hbmlmZXN0ICptaW5mbykKK3sKKwlpbnQgdGtuX2NvdW50ID0gMCwgcmV0OworCXN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX3N0cmluZ19lbGVtICpzdHJfZWxlbTsKKworCXN0cl9lbGVtID0gKHN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX3N0cmluZ19lbGVtICopYXJyYXktPnZhbHVlOworCXdoaWxlICh0a25fY291bnQgPCBhcnJheS0+bnVtX2VsZW1zKSB7CisJCXJldCA9IHNrbF90cGxnX2ZpbGxfc3RyX21mZXN0X3RrbihkZXYsIHN0cl9lbGVtLCBtaW5mbyk7CisJCXN0cl9lbGVtKys7CisKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXRrbl9jb3VudCA9IHRrbl9jb3VudCArIHJldDsKKwl9CisKKwlyZXR1cm4gdGtuX2NvdW50OworfQorCitzdGF0aWMgaW50IHNrbF90cGxnX2dldF9pbnRfdGtuKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfdmFsdWVfZWxlbSAqdGtuX2VsZW0sCisJCXN0cnVjdCBza2xfZGZ3X21hbmlmZXN0ICptaW5mbykKK3sKKwlpbnQgdGtuX2NvdW50ID0gMDsKKworCXN3aXRjaCAodGtuX2VsZW0tPnRva2VuKSB7CisJY2FzZSBTS0xfVEtOX1UzMl9MSUJfQ09VTlQ6CisJCW1pbmZvLT5saWJfY291bnQgPSB0a25fZWxlbS0+dmFsdWU7CisJCXRrbl9jb3VudCsrOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiTm90IGEgbWFuaWZlc3QgdG9rZW4gJWRcbiIsIHRrbl9lbGVtLT50b2tlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiB0a25fY291bnQ7Cit9CisKKy8qCisgKiBGaWxsIHRoZSBtYW5pZmVzdCBzdHJ1Y3R1cmUgYnkgcGFyc2luZyB0aGUgdG9rZW5zIGJhc2VkIG9uIHRoZQorICogdHlwZS4KKyAqLworc3RhdGljIGludCBza2xfdHBsZ19nZXRfbWFuaWZlc3RfdGtuKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJY2hhciAqcHZ0X2RhdGEsIHN0cnVjdCBza2xfZGZ3X21hbmlmZXN0ICptaW5mbywKKwkJaW50IGJsb2NrX3NpemUpCit7CisJaW50IHRrbl9jb3VudCA9IDAsIHJldDsKKwlpbnQgb2ZmID0gMCwgdHVwbGVfc2l6ZSA9IDA7CisJc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfYXJyYXkgKmFycmF5OworCXN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX3ZhbHVlX2VsZW0gKnRrbl9lbGVtOworCisJaWYgKGJsb2NrX3NpemUgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3aGlsZSAodHVwbGVfc2l6ZSA8IGJsb2NrX3NpemUpIHsKKwkJYXJyYXkgPSAoc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfYXJyYXkgKikocHZ0X2RhdGEgKyBvZmYpOworCQlvZmYgKz0gYXJyYXktPnNpemU7CisJCXN3aXRjaCAoYXJyYXktPnR5cGUpIHsKKwkJY2FzZSBTTkRfU09DX1RQTEdfVFVQTEVfVFlQRV9TVFJJTkc6CisJCQlyZXQgPSBza2xfdHBsZ19nZXRfc3RyX3RrbihkZXYsIGFycmF5LCBtaW5mbyk7CisKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQl0a25fY291bnQgKz0gcmV0OworCisJCQl0dXBsZV9zaXplICs9IHRrbl9jb3VudCAqCisJCQkJc2l6ZW9mKHN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX3N0cmluZ19lbGVtKTsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgU05EX1NPQ19UUExHX1RVUExFX1RZUEVfVVVJRDoKKwkJCWRldl93YXJuKGRldiwgIm5vIHV1aWQgdG9rZW5zIGZvciBza2wgdHBsZiBtYW5pZmVzdFxuIik7CisJCQljb250aW51ZTsKKworCQlkZWZhdWx0OgorCQkJdGtuX2VsZW0gPSBhcnJheS0+dmFsdWU7CisJCQl0a25fY291bnQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQl3aGlsZSAodGtuX2NvdW50IDw9IGFycmF5LT5udW1fZWxlbXMgLSAxKSB7CisJCQlyZXQgPSBza2xfdHBsZ19nZXRfaW50X3RrbihkZXYsCisJCQkJCXRrbl9lbGVtLCBtaW5mbyk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQl0a25fY291bnQgPSB0a25fY291bnQgKyByZXQ7CisJCQl0a25fZWxlbSsrOworCQkJdHVwbGVfc2l6ZSArPSB0a25fY291bnQgKgorCQkJCXNpemVvZihzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl92YWx1ZV9lbGVtKTsKKwkJCWJyZWFrOworCQl9CisJCXRrbl9jb3VudCA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQYXJzZSBtYW5pZmVzdCBwcml2YXRlIGRhdGEgZm9yIHRva2Vucy4gVGhlIHByaXZhdGUgZGF0YSBibG9jayBpcworICogcHJlY2VkZWQgYnkgZGVzY3JpcHRvcnMgZm9yIHR5cGUgYW5kIHNpemUgb2YgZGF0YSBibG9jay4KKyAqLworc3RhdGljIGludCBza2xfdHBsZ19nZXRfbWFuaWZlc3RfZGF0YShzdHJ1Y3Qgc25kX3NvY190cGxnX21hbmlmZXN0ICptYW5pZmVzdCwKKwkJCXN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrbF9kZndfbWFuaWZlc3QgKm1pbmZvKQoreworCXN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX2FycmF5ICphcnJheTsKKwlpbnQgbnVtX2Jsb2NrcywgYmxvY2tfc2l6ZSA9IDAsIGJsb2NrX3R5cGUsIG9mZiA9IDA7CisJY2hhciAqZGF0YTsKKwlpbnQgcmV0OworCisJLyogUmVhZCB0aGUgTlVNX0RBVEFfQkxPQ0tTIGRlc2NyaXB0b3IgKi8KKwlhcnJheSA9IChzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9hcnJheSAqKW1hbmlmZXN0LT5wcml2LmRhdGE7CisJcmV0ID0gc2tsX3RwbGdfZ2V0X2Rlc2NfYmxvY2tzKGRldiwgYXJyYXkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCW51bV9ibG9ja3MgPSByZXQ7CisKKwlvZmYgKz0gYXJyYXktPnNpemU7CisJYXJyYXkgPSAoc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfYXJyYXkgKikKKwkJCShtYW5pZmVzdC0+cHJpdi5kYXRhICsgb2ZmKTsKKworCS8qIFJlYWQgdGhlIEJMT0NLX1RZUEUgYW5kIEJMT0NLX1NJWkUgZGVzY3JpcHRvciAqLworCXdoaWxlIChudW1fYmxvY2tzID4gMCkgeworCQlyZXQgPSBza2xfdHBsZ19nZXRfZGVzY19ibG9ja3MoZGV2LCBhcnJheSk7CisKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlibG9ja190eXBlID0gcmV0OworCQlvZmYgKz0gYXJyYXktPnNpemU7CisKKwkJYXJyYXkgPSAoc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfYXJyYXkgKikKKwkJCShtYW5pZmVzdC0+cHJpdi5kYXRhICsgb2ZmKTsKKworCQlyZXQgPSBza2xfdHBsZ19nZXRfZGVzY19ibG9ja3MoZGV2LCBhcnJheSk7CisKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlibG9ja19zaXplID0gcmV0OworCQlvZmYgKz0gYXJyYXktPnNpemU7CisKKwkJYXJyYXkgPSAoc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfYXJyYXkgKikKKwkJCShtYW5pZmVzdC0+cHJpdi5kYXRhICsgb2ZmKTsKKworCQlkYXRhID0gKG1hbmlmZXN0LT5wcml2LmRhdGEgKyBvZmYpOworCisJCWlmIChibG9ja190eXBlID09IFNLTF9UWVBFX1RVUExFKSB7CisJCQlyZXQgPSBza2xfdHBsZ19nZXRfbWFuaWZlc3RfdGtuKGRldiwgZGF0YSwgbWluZm8sCisJCQkJCWJsb2NrX3NpemUpOworCisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQktLW51bV9ibG9ja3M7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNrbF9tYW5pZmVzdF9sb2FkKHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY21wbnQsCisJCQkJc3RydWN0IHNuZF9zb2NfdHBsZ19tYW5pZmVzdCAqbWFuaWZlc3QpCit7CisJc3RydWN0IHNrbF9kZndfbWFuaWZlc3QgKm1pbmZvOworCXN0cnVjdCBoZGFjX2V4dF9idXMgKmVidXMgPSBzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2ZGF0YShjbXBudCk7CisJc3RydWN0IGhkYWNfYnVzICpidXMgPSBlYnVzX3RvX2hidXMoZWJ1cyk7CisJc3RydWN0IHNrbCAqc2tsID0gZWJ1c190b19za2woZWJ1cyk7CisJaW50IHJldCA9IDA7CisKKwkvKiBwcm9jZWVkIG9ubHkgaWYgd2UgaGF2ZSBwcml2YXRlIGRhdGEgZGVmaW5lZCAqLworCWlmIChtYW5pZmVzdC0+cHJpdi5zaXplID09IDApCisJCXJldHVybiAwOworCisJbWluZm8gPSAmc2tsLT5za2xfc3N0LT5tYW5pZmVzdDsKKworCXNrbF90cGxnX2dldF9tYW5pZmVzdF9kYXRhKG1hbmlmZXN0LCBidXMtPmRldiwgbWluZm8pOworCisJaWYgKG1pbmZvLT5saWJfY291bnQgPiBIREFfTUFYX0xJQikgeworCQlkZXZfZXJyKGJ1cy0+ZGV2LCAiRXhjZWVkaW5nIG1heCBMaWJyYXJ5IGNvdW50LiBHb3Q6JWRcbiIsCisJCQkJCW1pbmZvLT5saWJfY291bnQpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY190cGxnX29wcyBza2xfdHBsZ19vcHMgID0gewogCS53aWRnZXRfbG9hZCA9IHNrbF90cGxnX3dpZGdldF9sb2FkLAogCS5jb250cm9sX2xvYWQgPSBza2xfdHBsZ19jb250cm9sX2xvYWQsCiAJLmJ5dGVzX2V4dF9vcHMgPSBza2xfdGx2X29wcywKIAkuYnl0ZXNfZXh0X29wc19jb3VudCA9IEFSUkFZX1NJWkUoc2tsX3Rsdl9vcHMpLAorCS5tYW5pZmVzdCA9IHNrbF9tYW5pZmVzdF9sb2FkLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC10b3BvbG9neS5oIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXRvcG9sb2d5LmgKaW5kZXggMjJkM2VmOC4uYTUxOTM2MCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXRvcG9sb2d5LmgKKysrIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXRvcG9sb2d5LmgKQEAgLTEzMyw3ICsxMzMsNyBAQAogc3RydWN0IHNrbF9kbWFfY29udHJvbCB7CiAJdTMyIG5vZGVfaWQ7CiAJdTMyIGNvbmZpZ19sZW5ndGg7Ci0JdTMyIGNvbmZpZ19kYXRhWzFdOworCXUzMiBjb25maWdfZGF0YVswXTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBza2xfY3ByX2NmZyB7CkBAIC0yMTUsOSArMjE1LDIwIEBACiAKIHN0cnVjdCBza2xfbW9kdWxlX2NmZzsKIAorc3RydWN0IHNrbF9tb2RfaW5zdF9tYXAgeworCXUxNiBtb2RfaWQ7CisJdTE2IGluc3RfaWQ7Cit9OworCitzdHJ1Y3Qgc2tsX2twYl9wYXJhbXMgeworCXUzMiBudW1fbW9kdWxlczsKKwlzdHJ1Y3Qgc2tsX21vZF9pbnN0X21hcCBtYXBbMF07Cit9OworCiBzdHJ1Y3Qgc2tsX21vZHVsZV9pbnN0X2lkIHsKLQl1MzIgbW9kdWxlX2lkOworCWludCBtb2R1bGVfaWQ7CiAJdTMyIGluc3RhbmNlX2lkOworCWludCBwdnRfaWQ7CiB9OwogCiBlbnVtIHNrbF9tb2R1bGVfcGluX3N0YXRlIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC10cGxnLWludGVyZmFjZS5oIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXRwbGctaW50ZXJmYWNlLmgKaW5kZXggYTMyZTVlOS4uMmY2MjgxZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXRwbGctaW50ZXJmYWNlLmgKKysrIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXRwbGctaW50ZXJmYWNlLmgKQEAgLTgwLDcgKzgwLDggQEAKIAlTS0xfTU9EVUxFX1RZUEVfVVBEV01JWCwKIAlTS0xfTU9EVUxFX1RZUEVfU1JDSU5ULAogCVNLTF9NT0RVTEVfVFlQRV9BTEdPLAotCVNLTF9NT0RVTEVfVFlQRV9CQVNFX09VVEZNVAorCVNLTF9NT0RVTEVfVFlQRV9CQVNFX09VVEZNVCwKKwlTS0xfTU9EVUxFX1RZUEVfS1BCLAogfTsKIAogZW51bSBza2xfY29yZV9hZmZpbml0eSB7CkBAIC0xNDgsNzggKzE0OSw2IEBACiAJU0tMX1BBUkFNX0JJTkQKIH07CiAKLXN0cnVjdCBza2xfZGZ3X21vZHVsZV9waW4gewotCXUxNiBtb2R1bGVfaWQ7Ci0JdTE2IGluc3RhbmNlX2lkOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHNrbF9kZndfbW9kdWxlX2ZtdCB7Ci0JdTMyIGNoYW5uZWxzOwotCXUzMiBmcmVxOwotCXUzMiBiaXRfZGVwdGg7Ci0JdTMyIHZhbGlkX2JpdF9kZXB0aDsKLQl1MzIgY2hfY2ZnOwotCXUzMiBpbnRlcmxlYXZpbmdfc3R5bGU7Ci0JdTMyIHNhbXBsZV90eXBlOwotCXUzMiBjaF9tYXA7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc2tsX2Rmd19tb2R1bGVfY2FwcyB7Ci0JdTMyIHNldF9wYXJhbXM6MjsKLQl1MzIgcnN2ZDozMDsKLQl1MzIgcGFyYW1faWQ7Ci0JdTMyIGNhcHNfc2l6ZTsKLQl1MzIgY2Fwc1tIREFfU1NUX0NGR19NQVhdOwotfTsKLQotc3RydWN0IHNrbF9kZndfcGlwZSB7Ci0JdTggcGlwZV9pZDsKLQl1OCBwaXBlX3ByaW9yaXR5OwotCXUxNiBjb25uX3R5cGU6NDsKLQl1MTYgcnN2ZDo0OwotCXUxNiBtZW1vcnlfcGFnZXM6ODsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBza2xfZGZ3X21vZHVsZSB7Ci0JdTggdXVpZFsxNl07Ci0KLQl1MTYgbW9kdWxlX2lkOwotCXUxNiBpbnN0YW5jZV9pZDsKLQl1MzIgbWF4X21jcHM7Ci0JdTMyIG1lbV9wYWdlczsKLQl1MzIgb2JzOwotCXUzMiBpYnM7Ci0JdTMyIHZidXNfaWQ7Ci0KLQl1MzIgbWF4X2luX3F1ZXVlOjg7Ci0JdTMyIG1heF9vdXRfcXVldWU6ODsKLQl1MzIgdGltZV9zbG90Ojg7Ci0JdTMyIGNvcmVfaWQ6NDsKLQl1MzIgcnN2ZDE6NDsKLQotCXUzMiBtb2R1bGVfdHlwZTo4OwotCXUzMiBjb25uX3R5cGU6NDsKLQl1MzIgZGV2X3R5cGU6NDsKLQl1MzIgaHdfY29ubl90eXBlOjQ7Ci0JdTMyIHJzdmQyOjEyOwotCi0JdTMyIHBhcmFtc19maXh1cDo4OwotCXUzMiBjb252ZXJ0ZXI6ODsKLQl1MzIgaW5wdXRfcGluX3R5cGU6MTsKLQl1MzIgb3V0cHV0X3Bpbl90eXBlOjE7Ci0JdTMyIGlzX2R5bmFtaWNfaW5fcGluOjE7Ci0JdTMyIGlzX2R5bmFtaWNfb3V0X3BpbjoxOwotCXUzMiBpc19sb2FkYWJsZToxOwotCXUzMiByc3ZkMzoxMTsKLQotCXN0cnVjdCBza2xfZGZ3X3BpcGUgcGlwZTsKLQlzdHJ1Y3Qgc2tsX2Rmd19tb2R1bGVfZm10IGluX2ZtdFtNQVhfSU5fUVVFVUVdOwotCXN0cnVjdCBza2xfZGZ3X21vZHVsZV9mbXQgb3V0X2ZtdFtNQVhfT1VUX1FVRVVFXTsKLQlzdHJ1Y3Qgc2tsX2Rmd19tb2R1bGVfcGluIGluX3BpbltNQVhfSU5fUVVFVUVdOwotCXN0cnVjdCBza2xfZGZ3X21vZHVsZV9waW4gb3V0X3BpbltNQVhfT1VUX1FVRVVFXTsKLQlzdHJ1Y3Qgc2tsX2Rmd19tb2R1bGVfY2FwcyBjYXBzOwotfSBfX3BhY2tlZDsKLQogc3RydWN0IHNrbF9kZndfYWxnb19kYXRhIHsKIAl1MzIgc2V0X3BhcmFtczoyOwogCXUzMiByc3ZkOjMwOwpAQCAtMjI4LDQgKzE1NywyNiBAQAogCWNoYXIgcGFyYW1zWzBdOwogfSBfX3BhY2tlZDsKIAorI2RlZmluZSBMSUJfTkFNRV9MRU5HVEgJMTI4CisjZGVmaW5lIEhEQV9NQVhfTElCCTE2CisKK3N0cnVjdCBsaWJfaW5mbyB7CisJY2hhciBuYW1lW0xJQl9OQU1FX0xFTkdUSF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc2tsX2Rmd19tYW5pZmVzdCB7CisJdTMyIGxpYl9jb3VudDsKKwlzdHJ1Y3QgbGliX2luZm8gbGliW0hEQV9NQVhfTElCXTsKK30gX19wYWNrZWQ7CisKK2VudW0gc2tsX3Rrbl9kaXIgeworCVNLTF9ESVJfSU4sCisJU0tMX0RJUl9PVVQKK307CisKK2VudW0gc2tsX3R1cGxlX3R5cGUgeworCVNLTF9UWVBFX1RVUExFLAorCVNLTF9UWVBFX0RBVEEKK307CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLmMgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wuYwppbmRleCBjZDU5NTM2Li4yOTg5YzE2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wuYwpAQCAtNTg3LDcgKzU4Nyw3IEBACiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0Jc25kX2hkYWNfZXh0X2J1c19wYXJzZV9jYXBhYmlsaXRpZXMoZWJ1cyk7CisJc25kX2hkYWNfYnVzX3BhcnNlX2NhcGFiaWxpdGllcyhidXMpOwogCiAJaWYgKHNrbF9hY3F1aXJlX2lycShlYnVzLCAwKSA8IDApCiAJCXJldHVybiAtRUJVU1k7CkBAIC02NzIsOCArNjcyLDEwIEBACiAKIAlza2wtPm5obHQgPSBza2xfbmhsdF9pbml0KGJ1cy0+ZGV2KTsKIAotCWlmIChza2wtPm5obHQgPT0gTlVMTCkKKwlpZiAoc2tsLT5uaGx0ID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBvdXRfZnJlZTsKKwl9CiAKIAlza2xfbmhsdF91cGRhdGVfdG9wb2xvZ3lfYmluKHNrbCk7CiAKQEAgLTY4Miw3ICs2ODQsNyBAQAogCXNrbF9kbWljX2RhdGEuZG1pY19udW0gPSBza2xfZ2V0X2RtaWNfZ2VvKHNrbCk7CiAKIAkvKiBjaGVjayBpZiBkc3AgaXMgdGhlcmUgKi8KLQlpZiAoZWJ1cy0+cHBjYXApIHsKKwlpZiAoYnVzLT5wcGNhcCkgewogCQllcnIgPSBza2xfbWFjaGluZV9kZXZpY2VfcmVnaXN0ZXIoc2tsLAogCQkJCSAgKHZvaWQgKilwY2lfaWQtPmRyaXZlcl9kYXRhKTsKIAkJaWYgKGVyciA8IDApCkBAIC02OTYsNyArNjk4LDcgQEAKIAkJc2tsLT5za2xfc3N0LT5lbmFibGVfbWlzY2JkY2dlID0gc2tsX2VuYWJsZV9taXNjYmRjZ2U7CiAKIAl9Ci0JaWYgKGVidXMtPm1sY2FwKQorCWlmIChidXMtPm1sY2FwKQogCQlzbmRfaGRhY19leHRfYnVzX2dldF9tbF9jYXBhYmlsaXRpZXMoZWJ1cyk7CiAKIAkvKiBjcmVhdGUgZGV2aWNlIGZvciBzb2MgZG1pYyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLmggYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wuaAppbmRleCA5MDY0ZTViLi41ZDRmYmIwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wuaAorKysgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wuaApAQCAtMTA1LDYgKzEwNSw3IEBACiAJCQlpbnQgaXJxLCBjb25zdCBjaGFyICpmd19uYW1lLAogCQkJc3RydWN0IHNrbF9kc3BfbG9hZGVyX29wcyBsb2FkZXJfb3BzLAogCQkJc3RydWN0IHNrbF9zc3QgKipza2xfc3N0KTsKKwlpbnQgKCppbml0X2Z3KShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBza2xfc3N0ICpjdHgpOwogCXZvaWQgKCpjbGVhbnVwKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBza2xfc3N0ICpjdHgpOwogfTsKIApAQCAtMTIzLDQgKzEyNCw1IEBACiBpbnQgc2tsX3N1c3BlbmRfZHNwKHN0cnVjdCBza2wgKnNrbCk7CiBpbnQgc2tsX3Jlc3VtZV9kc3Aoc3RydWN0IHNrbCAqc2tsKTsKIHZvaWQgc2tsX2NsZWFudXBfcmVzb3VyY2VzKHN0cnVjdCBza2wgKnNrbCk7Citjb25zdCBzdHJ1Y3Qgc2tsX2RzcF9vcHMgKnNrbF9nZXRfZHNwX29wcyhpbnQgcGNpX2lkKTsKICNlbmRpZiAvKiBfX1NPVU5EX1NPQ19TS0xfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLWRtYS5jIGIvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLWRtYS5jCmluZGV4IGRiZmRmZTkuLmRhZmQyMmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9raXJrd29vZC9raXJrd29vZC1kbWEuYworKysgYi9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtZG1hLmMKQEAgLTI0Miw3ICsyNDIsNyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBraXJrd29vZF9kbWFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBraXJrd29vZF9kbWFfb3BzID0gewogCS5vcGVuID0JCWtpcmt3b29kX2RtYV9vcGVuLAogCS5jbG9zZSA9ICAgICAgICBraXJrd29vZF9kbWFfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbWVkaWF0ZWsvY29tbW9uL210ay1hZmUtZmUtZGFpLmMgYi9zb3VuZC9zb2MvbWVkaWF0ZWsvY29tbW9uL210ay1hZmUtZmUtZGFpLmMKaW5kZXggYjc4ODc5MWIuLmFjMjMxZDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9tZWRpYXRlay9jb21tb24vbXRrLWFmZS1mZS1kYWkuYworKysgYi9zb3VuZC9zb2MvbWVkaWF0ZWsvY29tbW9uL210ay1hZmUtZmUtZGFpLmMKQEAgLTIzLDcgKzIzLDggQEAKIAogI2RlZmluZSBBRkVfQkFTRV9FTkRfT0ZGU0VUIDgKIAotaW50IG10a19yZWdtYXBfdXBkYXRlX2JpdHMoc3RydWN0IHJlZ21hcCAqbWFwLCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgbWFzaywKK3N0YXRpYyBpbnQgbXRrX3JlZ21hcF91cGRhdGVfYml0cyhzdHJ1Y3QgcmVnbWFwICptYXAsIGludCByZWcsCisJCQkgICB1bnNpZ25lZCBpbnQgbWFzaywKIAkJCSAgIHVuc2lnbmVkIGludCB2YWwpCiB7CiAJaWYgKHJlZyA8IDApCkBAIC0zMSw3ICszMiw3IEBACiAJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhtYXAsIHJlZywgbWFzaywgdmFsKTsKIH0KIAotaW50IG10a19yZWdtYXBfd3JpdGUoc3RydWN0IHJlZ21hcCAqbWFwLCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQorc3RhdGljIGludCBtdGtfcmVnbWFwX3dyaXRlKHN0cnVjdCByZWdtYXAgKm1hcCwgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCkKIHsKIAlpZiAocmVnIDwgMCkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9tY2JzcC5jIGIvc291bmQvc29jL29tYXAvbWNic3AuYwppbmRleCA3NmNlMzMxLi4wNmZlYzU2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9tY2JzcC5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL21jYnNwLmMKQEAgLTIyMSw3ICsyMjEsOCBAQAogCiAJLyogRW5hYmxlIFRYL1JYIHN5bmMgZXJyb3IgaW50ZXJydXB0cyBieSBkZWZhdWx0ICovCiAJaWYgKG1jYnNwLT5pcnEpCi0JCU1DQlNQX1dSSVRFKG1jYnNwLCBJUlFFTiwgUlNZTkNFUlJFTiB8IFhTWU5DRVJSRU4pOworCQlNQ0JTUF9XUklURShtY2JzcCwgSVJRRU4sIFJTWU5DRVJSRU4gfCBYU1lOQ0VSUkVOIHwKKwkJCSAgICBSVU5ERkxFTiB8IFJPVkZMRU4gfCBYVU5ERkxFTiB8IFhPVkZMRU4pOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL29tYXAtYWJlLXR3bDYwNDAuYyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtYWJlLXR3bDYwNDAuYwppbmRleCAwODQzYTY4Li44OWZlOTVlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9vbWFwLWFiZS10d2w2MDQwLmMKKysrIGIvc291bmQvc29jL29tYXAvb21hcC1hYmUtdHdsNjA0MC5jCkBAIC0zOCwxMCArMzgsMTAgQEAKIHN0cnVjdCBhYmVfdHdsNjA0MCB7CiAJaW50CWphY2tfZGV0ZWN0aW9uOwkvKiBib2FyZCBjYW4gZGV0ZWN0IGphY2sgZXZlbnRzICovCiAJaW50CW1jbGtfZnJlcTsJLyogTUNMSyBmcmVxdWVuY3kgc3BlZWQgZm9yIHR3bDYwNDAgKi8KLQotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRtaWNfY29kZWNfZGV2OwogfTsKIAorc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZG1pY19jb2RlY19kZXY7CisKIHN0YXRpYyBpbnQgb21hcF9hYmVfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQogewpAQCAtMjU4LDggKzI1OCw2IEBACiAJaWYgKHByaXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlwcml2LT5kbWljX2NvZGVjX2RldiA9IEVSUl9QVFIoLUVJTlZBTCk7Ci0KIAlpZiAoc25kX3NvY19vZl9wYXJzZV9jYXJkX25hbWUoY2FyZCwgInRpLG1vZGVsIikpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FyZCBuYW1lIGlzIG5vdCBwcm92aWRlZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtMjg0LDEzICsyODIsNiBAQAogCQludW1fbGlua3MgPSAyOwogCQlhYmVfdHdsNjA0MF9kYWlfbGlua3NbMV0uY3B1X29mX25vZGUgPSBkYWlfbm9kZTsKIAkJYWJlX3R3bDYwNDBfZGFpX2xpbmtzWzFdLnBsYXRmb3JtX29mX25vZGUgPSBkYWlfbm9kZTsKLQotCQlwcml2LT5kbWljX2NvZGVjX2RldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoCi0JCQkJCQkiZG1pYy1jb2RlYyIsIC0xLCBOVUxMLCAwKTsKLQkJaWYgKElTX0VSUihwcml2LT5kbWljX2NvZGVjX2RldikpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGluc3RhbnRpYXRlIGRtaWMtY29kZWNcbiIpOwotCQkJcmV0dXJuIFBUUl9FUlIocHJpdi0+ZG1pY19jb2RlY19kZXYpOwotCQl9CiAJfSBlbHNlIHsKIAkJbnVtX2xpbmtzID0gMTsKIAl9CkBAIC0yOTksMTYgKzI5MCwxNCBAQAogCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJ0aSxtY2xrLWZyZXEiLCAmcHJpdi0+bWNsa19mcmVxKTsKIAlpZiAoIXByaXYtPm1jbGtfZnJlcSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNQ0xLIGZyZXF1ZW5jeSBub3QgcHJvdmlkZWRcbiIpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl91bnJlZ2lzdGVyOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAljYXJkLT5mdWxseV9yb3V0ZWQgPSAxOwogCiAJaWYgKCFwcml2LT5tY2xrX2ZyZXEpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiTUNMSyBmcmVxdWVuY3kgbWlzc2luZ1xuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX3VucmVnaXN0ZXI7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWNhcmQtPmRhaV9saW5rID0gYWJlX3R3bDYwNDBfZGFpX2xpbmtzOwpAQCAtMzE2LDM1ICszMDUsMTQgQEAKIAogCXNuZF9zb2NfY2FyZF9zZXRfZHJ2ZGF0YShjYXJkLCBwcml2KTsKIAotCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChjYXJkKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInNuZF9zb2NfcmVnaXN0ZXJfY2FyZCgpIGZhaWxlZDogJWRcbiIsCisJcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwgY2FyZCk7CisJaWYgKHJldCkKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoKSBmYWlsZWQ6ICVkXG4iLAogCQkJcmV0KTsKLQkJZ290byBlcnJfdW5yZWdpc3RlcjsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZXJyX3VucmVnaXN0ZXI6Ci0JaWYgKCFJU19FUlIocHJpdi0+ZG1pY19jb2RlY19kZXYpKQotCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihwcml2LT5kbWljX2NvZGVjX2Rldik7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG9tYXBfYWJlX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgYWJlX3R3bDYwNDAgKnByaXYgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7Ci0KLQlzbmRfc29jX3VucmVnaXN0ZXJfY2FyZChjYXJkKTsKLQotCWlmICghSVNfRVJSKHByaXYtPmRtaWNfY29kZWNfZGV2KSkKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocHJpdi0+ZG1pY19jb2RlY19kZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9tYXBfYWJlX29mX21hdGNoW10gPSB7CiAJey5jb21wYXRpYmxlID0gInRpLGFiZS10d2w2MDQwIiwgfSwKIAl7IH0sCkBAIC0zNTgsMTAgKzMyNiwzNSBAQAogCQkub2ZfbWF0Y2hfdGFibGUgPSBvbWFwX2FiZV9vZl9tYXRjaCwKIAl9LAogCS5wcm9iZSA9IG9tYXBfYWJlX3Byb2JlLAotCS5yZW1vdmUgPSBvbWFwX2FiZV9yZW1vdmUsCiB9OwogCi1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG9tYXBfYWJlX2RyaXZlcik7CitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2FiZV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWRtaWNfY29kZWNfZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiZG1pYy1jb2RlYyIsIC0xLCBOVUxMLAorCQkJCQkJCSAwKTsKKwlpZiAoSVNfRVJSKGRtaWNfY29kZWNfZGV2KSkgeworCQlwcl9lcnIoIiVzOiBkbWljLWNvZGVjIGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBQVFJfRVJSKGRtaWNfY29kZWNfZGV2KTsKKwl9CisKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9tYXBfYWJlX2RyaXZlcik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBwbGF0Zm9ybSBkcml2ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkbWljX2NvZGVjX2Rldik7CisJfQorCisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KG9tYXBfYWJlX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgb21hcF9hYmVfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZvbWFwX2FiZV9kcml2ZXIpOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRtaWNfY29kZWNfZGV2KTsKK30KK21vZHVsZV9leGl0KG9tYXBfYWJlX2V4aXQpOwogCiBNT0RVTEVfQVVUSE9SKCJNaXNhZWwgTG9wZXogQ3J1eiA8bWlzYWVsLmxvcGV6QHRpLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQUxTQSBTb0MgZm9yIE9NQVAgYm9hcmRzIHdpdGggQUJFIGFuZCB0d2w2MDQwIGNvZGVjIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vbWFwLW1jcGRtLmMgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLW1jcGRtLmMKaW5kZXggZTdjZGM1MS4uNjQ2MDljNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvb21hcC1tY3BkbS5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtbWNwZG0uYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KQEAgLTU1LDcgKzU0LDYgQEAKIAl1bnNpZ25lZCBsb25nIHBoeXNfYmFzZTsKIAl2b2lkIF9faW9tZW0gKmlvX2Jhc2U7CiAJaW50IGlycTsKLQlzdHJ1Y3QgY2xrICpwZG1jbGs7CiAKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAKQEAgLTM5MCwxNSArMzg4LDE0IEBACiAJc3RydWN0IG9tYXBfbWNwZG0gKm1jcGRtID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKIAlpbnQgcmV0OwogCi0JY2xrX3ByZXBhcmVfZW5hYmxlKG1jcGRtLT5wZG1jbGspOwogCXBtX3J1bnRpbWVfZW5hYmxlKG1jcGRtLT5kZXYpOwogCiAJLyogRGlzYWJsZSBsaW5lcyB3aGlsZSByZXF1ZXN0IGlzIG9uZ29pbmcgKi8KIAlwbV9ydW50aW1lX2dldF9zeW5jKG1jcGRtLT5kZXYpOwogCW9tYXBfbWNwZG1fd3JpdGUobWNwZG0sIE1DUERNX1JFR19DVFJMLCAweDAwKTsKIAotCXJldCA9IGRldm1fcmVxdWVzdF9pcnEobWNwZG0tPmRldiwgbWNwZG0tPmlycSwgb21hcF9tY3BkbV9pcnFfaGFuZGxlciwKLQkJCQkwLCAiTWNQRE0iLCAodm9pZCAqKW1jcGRtKTsKKwlyZXQgPSByZXF1ZXN0X2lycShtY3BkbS0+aXJxLCBvbWFwX21jcGRtX2lycV9oYW5kbGVyLCAwLCAiTWNQRE0iLAorCQkJICAodm9pZCAqKW1jcGRtKTsKIAogCXBtX3J1bnRpbWVfcHV0X3N5bmMobWNwZG0tPmRldik7CiAKQEAgLTQyMyw5ICs0MjAsOSBAQAogewogCXN0cnVjdCBvbWFwX21jcGRtICptY3BkbSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CiAKKwlmcmVlX2lycShtY3BkbS0+aXJxLCAodm9pZCAqKW1jcGRtKTsKIAlwbV9ydW50aW1lX2Rpc2FibGUobWNwZG0tPmRldik7CiAKLQljbGtfZGlzYWJsZV91bnByZXBhcmUobWNwZG0tPnBkbWNsayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ0NSw4ICs0NDIsNiBAQAogCQltY3BkbS0+cG1fYWN0aXZlX2NvdW50Kys7CiAJfQogCi0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG1jcGRtLT5wZG1jbGspOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ1NCw4ICs0NDksNiBAQAogewogCXN0cnVjdCBvbWFwX21jcGRtICptY3BkbSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CiAKLQljbGtfcHJlcGFyZV9lbmFibGUobWNwZG0tPnBkbWNsayk7Ci0KIAlpZiAobWNwZG0tPnBtX2FjdGl2ZV9jb3VudCkgewogCQl3aGlsZSAobWNwZG0tPnBtX2FjdGl2ZV9jb3VudC0tKQogCQkJcG1fcnVudGltZV9nZXRfc3luYyhtY3BkbS0+ZGV2KTsKQEAgLTU0OSwxNSArNTQyLDYgQEAKIAogCW1jcGRtLT5kZXYgPSAmcGRldi0+ZGV2OwogCi0JbWNwZG0tPnBkbWNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAicGRtY2xrIik7Ci0JaWYgKElTX0VSUihtY3BkbS0+cGRtY2xrKSkgewotCQlpZiAoUFRSX0VSUihtY3BkbS0+cGRtY2xrKSA9PSAtRVBST0JFX0RFRkVSKQotCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7Ci0JCWRldl93YXJuKCZwZGV2LT5kZXYsICJFcnJvciBnZXR0aW5nIHBkbWNsayAoJWxkKSFcbiIsCi0JCQkgUFRSX0VSUihtY3BkbS0+cGRtY2xrKSk7Ci0JCW1jcGRtLT5wZG1jbGsgPSBOVUxMOwotCX0KLQogCXJldCA9ICBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCiAJCQkJCSAgICAgICAmb21hcF9tY3BkbV9jb21wb25lbnQsCiAJCQkJCSAgICAgICAmb21hcF9tY3BkbV9kYWksIDEpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcC1wY20uYyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtcGNtLmMKaW5kZXggYTg0ZjY3Ny4uOTRlOWZmNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvb21hcC1wY20uYworKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLXBjbS5jCkBAIC01OCw3ICs1OCw3IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgU05EUlZfUENNX0ZPUk1BVF9MQVNUOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDw9IFNORFJWX1BDTV9GT1JNQVRfTEFTVDsgaSsrKSB7CiAJCXN3aXRjaCAoc25kX3BjbV9mb3JtYXRfcGh5c2ljYWxfd2lkdGgoaSkpIHsKIAkJY2FzZSA4OgogCQljYXNlIDE2OgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3Fjb20vYXBxODAxNl9zYmMuYyBiL3NvdW5kL3NvYy9xY29tL2FwcTgwMTZfc2JjLmMKaW5kZXggMTI4OTU0My4uMDdmOTFlOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3Fjb20vYXBxODAxNl9zYmMuYworKysgYi9zb3VuZC9zb2MvcWNvbS9hcHE4MDE2X3NiYy5jCkBAIC04NSw2ICs4NSwxNSBAQAogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0KIAorCS8qIERBUE0gcm91dGVzICovCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChub2RlLCAicWNvbSxhdWRpby1yb3V0aW5nIikpIHsKKwkJcmV0ID0gc25kX3NvY19vZl9wYXJzZV9hdWRpb19yb3V0aW5nKGNhcmQsCisJCQkJCSJxY29tLGF1ZGlvLXJvdXRpbmciKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQorCisKIAkvKiBQb3B1bGF0ZSBsaW5rcyAqLwogCW51bV9saW5rcyA9IG9mX2dldF9jaGlsZF9jb3VudChub2RlKTsKIApAQCAtMTQ3LDYgKzE1NiwxNSBAQAogCXJldHVybiBkYXRhOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYXBxODAxNl9zYmNfZGFwbV93aWRnZXRzW10gPSB7CisKKwlTTkRfU09DX0RBUE1fTUlDKCJIYW5kc2V0IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkhlYWRzZXQgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiU2Vjb25kYXJ5IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljMSIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljMiIsIE5VTEwpLAorfTsKKwogc3RhdGljIGludCBhcHE4MDE2X3NiY19wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CkBAIC0xNTksNiArMTc3LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAljYXJkLT5kZXYgPSBkZXY7CisJY2FyZC0+ZGFwbV93aWRnZXRzID0gYXBxODAxNl9zYmNfZGFwbV93aWRnZXRzOworCWNhcmQtPm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFwcTgwMTZfc2JjX2RhcG1fd2lkZ2V0cyk7CiAJZGF0YSA9IGFwcTgwMTZfc2JjX3BhcnNlX29mKGNhcmQpOwogCWlmIChJU19FUlIoZGF0YSkpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRXJyb3IgcmVzb2x2aW5nIGRhaSBsaW5rczogJWxkXG4iLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3Fjb20vbHBhc3MtcGxhdGZvcm0uYyBiL3NvdW5kL3NvYy9xY29tL2xwYXNzLXBsYXRmb3JtLmMKaW5kZXggZGIwMDBjNi4uZTJmZjUzOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3Fjb20vbHBhc3MtcGxhdGZvcm0uYworKysgYi9zb3VuZC9zb2MvcWNvbS9scGFzcy1wbGF0Zm9ybS5jCkBAIC04NCw5ICs4NCw5IEBACiAJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcnVudGltZSA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBscGFzc19wY21fZGF0YSAqcGNtX2RhdGEgPSBzbmRfc29jX3BjbV9nZXRfZHJ2ZGF0YShzb2NfcnVudGltZSk7CiAJc3RydWN0IGxwYXNzX2RhdGEgKmRydmRhdGEgPQogCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHNvY19ydW50aW1lLT5wbGF0Zm9ybSk7CisJc3RydWN0IGxwYXNzX3BjbV9kYXRhICpwY21fZGF0YSA9IGRydmRhdGEtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgbHBhc3NfdmFyaWFudCAqdiA9IGRydmRhdGEtPnZhcmlhbnQ7CiAJc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQgPSBwYXJhbXNfZm9ybWF0KHBhcmFtcyk7CiAJdW5zaWduZWQgaW50IGNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CkBAIC0xNzcsOSArMTc3LDkgQEAKIHN0YXRpYyBpbnQgbHBhc3NfcGxhdGZvcm1fcGNtb3BzX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19ydW50aW1lID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGxwYXNzX3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHNvY19ydW50aW1lKTsKIAlzdHJ1Y3QgbHBhc3NfZGF0YSAqZHJ2ZGF0YSA9CiAJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEoc29jX3J1bnRpbWUtPnBsYXRmb3JtKTsKKwlzdHJ1Y3QgbHBhc3NfcGNtX2RhdGEgKnBjbV9kYXRhID0gZHJ2ZGF0YS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBscGFzc192YXJpYW50ICp2ID0gZHJ2ZGF0YS0+dmFyaWFudDsKIAl1bnNpZ25lZCBpbnQgcmVnOwogCWludCByZXQ7CkBAIC0yMDEsOSArMjAxLDkgQEAKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcnVudGltZSA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBscGFzc19wY21fZGF0YSAqcGNtX2RhdGEgPSBzbmRfc29jX3BjbV9nZXRfZHJ2ZGF0YShzb2NfcnVudGltZSk7CiAJc3RydWN0IGxwYXNzX2RhdGEgKmRydmRhdGEgPQogCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHNvY19ydW50aW1lLT5wbGF0Zm9ybSk7CisJc3RydWN0IGxwYXNzX3BjbV9kYXRhICpwY21fZGF0YSA9IGRydmRhdGEtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgbHBhc3NfdmFyaWFudCAqdiA9IGRydmRhdGEtPnZhcmlhbnQ7CiAJaW50IHJldCwgY2gsIGRpciA9IHN1YnN0cmVhbS0+c3RyZWFtOwogCkBAIC0yNTUsOSArMjU1LDkgQEAKIAkJaW50IGNtZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3J1bnRpbWUgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbHBhc3NfcGNtX2RhdGEgKnBjbV9kYXRhID0gc25kX3NvY19wY21fZ2V0X2RydmRhdGEoc29jX3J1bnRpbWUpOwogCXN0cnVjdCBscGFzc19kYXRhICpkcnZkYXRhID0KIAkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShzb2NfcnVudGltZS0+cGxhdGZvcm0pOworCXN0cnVjdCBscGFzc19wY21fZGF0YSAqcGNtX2RhdGEgPSBkcnZkYXRhLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGxwYXNzX3ZhcmlhbnQgKnYgPSBkcnZkYXRhLT52YXJpYW50OwogCWludCByZXQsIGNoLCBkaXIgPSBzdWJzdHJlYW0tPnN0cmVhbTsKIApAQCAtMzMxLDkgKzMzMSw5IEBACiAJCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcnVudGltZSA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBscGFzc19wY21fZGF0YSAqcGNtX2RhdGEgPSBzbmRfc29jX3BjbV9nZXRfZHJ2ZGF0YShzb2NfcnVudGltZSk7CiAJc3RydWN0IGxwYXNzX2RhdGEgKmRydmRhdGEgPQogCQkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShzb2NfcnVudGltZS0+cGxhdGZvcm0pOworCXN0cnVjdCBscGFzc19wY21fZGF0YSAqcGNtX2RhdGEgPSBkcnZkYXRhLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGxwYXNzX3ZhcmlhbnQgKnYgPSBkcnZkYXRhLT52YXJpYW50OwogCXVuc2lnbmVkIGludCBiYXNlX2FkZHIsIGN1cnJfYWRkcjsKIAlpbnQgcmV0LCBjaCwgZGlyID0gc3Vic3RyZWFtLT5zdHJlYW07CkBAIC0zNzIsNyArMzcyLDcgQEAKIAkJCXJ1bnRpbWUtPmRtYV9ieXRlcyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgbHBhc3NfcGxhdGZvcm1fcGNtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgbHBhc3NfcGxhdGZvcm1fcGNtX29wcyA9IHsKIAkub3BlbgkJPSBscGFzc19wbGF0Zm9ybV9wY21vcHNfb3BlbiwKIAkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCiAJLmh3X3BhcmFtcwk9IGxwYXNzX3BsYXRmb3JtX3BjbW9wc19od19wYXJhbXMsCkBAIC00ODMsNyArNDgzLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlkYXRhLT5pMnNfcG9ydCA9IGNwdV9kYWktPmRyaXZlci0+aWQ7Ci0Jc25kX3NvY19wY21fc2V0X2RydmRhdGEoc29jX3J1bnRpbWUsIGRhdGEpOworCWRydmRhdGEtPnByaXZhdGVfZGF0YSA9IGRhdGE7CiAKIAlwc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbTsKIAlpZiAocHN1YnN0cmVhbSkgewpAQCAtNTcwLDggKzU3MCw4IEBACiAJCXN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tpXS5zdWJzdHJlYW07CiAJCWlmIChzdWJzdHJlYW0pIHsKIAkJCXJ0ID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JCQlkYXRhID0gc25kX3NvY19wY21fZ2V0X2RydmRhdGEocnQpOwogCQkJZHJ2ZGF0YSA9IHNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnQtPnBsYXRmb3JtKTsKKwkJCWRhdGEgPSBkcnZkYXRhLT5wcml2YXRlX2RhdGE7CiAKIAkJCWNoID0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCiAJCQkJPyBkYXRhLT5yZG1hX2NoCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcWNvbS9scGFzcy5oIGIvc291bmQvc29jL3Fjb20vbHBhc3MuaAppbmRleCAzMDcxNGFkLi4zNWIzY2VhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcWNvbS9scGFzcy5oCisrKyBiL3NvdW5kL3NvYy9xY29tL2xwYXNzLmgKQEAgLTU4LDYgKzU4LDggQEAKIAkvKiA4MDE2IHNwZWNpZmljICovCiAJc3RydWN0IGNsayAqcGNub2NfbXBvcnRfY2xrOwogCXN0cnVjdCBjbGsgKnBjbm9jX3N3YXlfY2xrOworCisJdm9pZCAqcHJpdmF0ZV9kYXRhOwogfTsKIAogLyogVmFpcmFudCBkYXRhIHBlciBlYWNoIFNPQyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3JvY2tjaGlwL0tjb25maWcgYi9zb3VuZC9zb2Mvcm9ja2NoaXAvS2NvbmZpZwppbmRleCBmMWUwYzcwLi5jNzgzZjlhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvcm9ja2NoaXAvS2NvbmZpZworKysgYi9zb3VuZC9zb2Mvcm9ja2NoaXAvS2NvbmZpZwpAQCAtNDEsMyArNDEsMTUgQEAKIAloZWxwCiAJICBTYXkgWSBvciBNIGhlcmUgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBSb2NrY2hpcAogCSAgYm9hcmRzIHVzaW5nIHRoZSBSVDU2NDUvUlQ1NjUwIGNvZGVjLCBzdWNoIGFzIFZleXJvbi4KKworY29uZmlnIFNORF9TT0NfUkszMzk5X0dSVV9TT1VORAorCXRyaXN0YXRlICJBU29DIHN1cHBvcnQgbXVsdGlwbGUgY29kZWNzIGZvciBSb2NrY2hpcCBSSzMzOTkgR1JVIGJvYXJkcyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfUk9DS0NISVAgJiYgSTJDICYmIEdQSU9MSUIgJiYgQ0xLREVWX0xPT0tVUCAmJiBTUEkKKwlzZWxlY3QgU05EX1NPQ19ST0NLQ0hJUF9JMlMKKwlzZWxlY3QgU05EX1NPQ19NQVg5ODM1N0EKKwlzZWxlY3QgU05EX1NPQ19SVDU1MTQKKwlzZWxlY3QgU05EX1NPQ19EQTcyMTkKKwlzZWxlY3QgU05EX1NPQ19SVDU1MTRfU1BJCisJaGVscAorCSAgU2F5IFkgb3IgTSBoZXJlIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IG11bHRpcGxlIGNvZGVjcyBmb3IgU29DCisJICBhdWRpbyBvbiBSb2NrY2hpcCBSSzMzOTkgR1JVIGJvYXJkcy4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9yb2NrY2hpcC9NYWtlZmlsZSBiL3NvdW5kL3NvYy9yb2NrY2hpcC9NYWtlZmlsZQppbmRleCBjMGJmNTYwLi44NGU1YzdjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvcm9ja2NoaXAvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL3JvY2tjaGlwL01ha2VmaWxlCkBAIC03LDYgKzcsOCBAQAogCiBzbmQtc29jLXJvY2tjaGlwLW1heDk4MDkwLW9ianMgOj0gcm9ja2NoaXBfbWF4OTgwOTAubwogc25kLXNvYy1yb2NrY2hpcC1ydDU2NDUtb2JqcyA6PSByb2NrY2hpcF9ydDU2NDUubworc25kLXNvYy1yazMzOTktZ3J1LXNvdW5kLW9ianMgOj0gcmszMzk5X2dydV9zb3VuZC5vCiAKIG9iai0kKENPTkZJR19TTkRfU09DX1JPQ0tDSElQX01BWDk4MDkwKSArPSBzbmQtc29jLXJvY2tjaGlwLW1heDk4MDkwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1JPQ0tDSElQX1JUNTY0NSkgKz0gc25kLXNvYy1yb2NrY2hpcC1ydDU2NDUubworb2JqLSQoQ09ORklHX1NORF9TT0NfUkszMzk5X0dSVV9TT1VORCkgKz0gc25kLXNvYy1yazMzOTktZ3J1LXNvdW5kLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9yb2NrY2hpcC9yazMzOTlfZ3J1X3NvdW5kLmMgYi9zb3VuZC9zb2Mvcm9ja2NoaXAvcmszMzk5X2dydV9zb3VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZDczNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2Mvcm9ja2NoaXAvcmszMzk5X2dydV9zb3VuZC5jCkBAIC0wLDAgKzEsMzk3IEBACisvKgorICogUm9ja2NoaXAgbWFjaGluZSBBU29DIGRyaXZlciBmb3IgYm9hcmRzIHVzaW5nIE1BWDk4MzU3QS9SVDU1MTQvREE3MjE5CisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCBST0NLQ0hJUCBDT1JQT1JBVElPTi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvamFjay5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlICJyb2NrY2hpcF9pMnMuaCIKKyNpbmNsdWRlICIuLi9jb2RlY3MvZGE3MjE5LmgiCisjaW5jbHVkZSAiLi4vY29kZWNzL2RhNzIxOS1hYWQuaCIKKyNpbmNsdWRlICIuLi9jb2RlY3MvcnQ1NTE0LmgiCisKKyNkZWZpbmUgRFJWX05BTUUgInJrMzM5OS1ncnUtc291bmQiCisKKyNkZWZpbmUgU09VTkRfRlMJMjU2CisKK3Vuc2lnbmVkIGludCBydDU1MTRfZG1pY19kZWxheTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2sgcm9ja2NoaXBfc291bmRfamFjazsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHJvY2tjaGlwX2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9IUCgiSGVhZHBob25lcyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIlNwZWFrZXJzIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiSGVhZHNldCBNaWMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJJbnQgTWljIiwgTlVMTCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSByb2NrY2hpcF9kYXBtX3JvdXRlc1tdID0geworCS8qIElucHV0IExpbmVzICovCisJeyJNSUMiLCBOVUxMLCAiSGVhZHNldCBNaWMifSwKKwl7IkRNSUMxTCIsIE5VTEwsICJJbnQgTWljIn0sCisJeyJETUlDMVIiLCBOVUxMLCAiSW50IE1pYyJ9LAorCisJLyogT3V0cHV0IExpbmVzICovCisJeyJIZWFkcGhvbmVzIiwgTlVMTCwgIkhQTCJ9LAorCXsiSGVhZHBob25lcyIsIE5VTEwsICJIUFIifSwKKwl7IlNwZWFrZXJzIiwgTlVMTCwgIlNwZWFrZXIifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByb2NrY2hpcF9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRwaG9uZXMiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJTcGVha2VycyIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRzZXQgTWljIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiSW50IE1pYyIpLAorfTsKKworc3RhdGljIGludCByb2NrY2hpcF9zb3VuZF9tYXg5ODM1N2FfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG1jbGs7CisJaW50IHJldDsKKworCS8qIG1heDk4MzU3YSBzdXBwb3J0cyB0aGVzZSBzYW1wbGUgcmF0ZXMgKi8KKwlzd2l0Y2ggKHBhcmFtc19yYXRlKHBhcmFtcykpIHsKKwljYXNlIDgwMDA6CisJY2FzZSAxNjAwMDoKKwljYXNlIDQ4MDAwOgorCWNhc2UgOTYwMDA6CisJCW1jbGsgPSBwYXJhbXNfcmF0ZShwYXJhbXMpICogU09VTkRfRlM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsICIlcygpIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHNhbXBsZSByYXRlOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcGFyYW1zX3JhdGUocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsocnRkLT5jcHVfZGFpLCAwLCBtY2xrLCAwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsICIlcygpIGVycm9yIHNldHRpbmcgc3lzY2xrIHRvICV1OiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgbWNsaywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9zb3VuZF9ydDU1MTRfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJdW5zaWduZWQgaW50IG1jbGs7CisJaW50IHJldDsKKworCW1jbGsgPSBwYXJhbXNfcmF0ZShwYXJhbXMpICogU09VTkRfRlM7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNwdV9kYWksIDAsIG1jbGssCisJCQkJICAgICBTTkRfU09DX0NMT0NLX09VVCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmNhcmQtPmRldiwgIkNhbid0IHNldCBjcHUgY2xvY2sgb3V0ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBSVDU1MTRfU0NMS19TX01DTEssCisJCQkJICAgICBtY2xrLCBTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsICIlcygpIGVycm9yIHNldHRpbmcgc3lzY2xrIHRvICV1OiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcGFyYW1zX3JhdGUocGFyYW1zKSAqIDUxMiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBXYWl0IGZvciBETUlDIHN0YWJsZSAqLworCW1zbGVlcChydDU1MTRfZG1pY19kZWxheSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9zb3VuZF9kYTcyMTlfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJaW50IG1jbGssIHJldDsKKworCS8qIGluIGJ5cGFzcyBtb2RlLCB0aGUgbWNsayBoYXMgdG8gYmUgb25lIG9mIHRoZSBmcmVxdWVuY2llcyBiZWxvdyAqLworCXN3aXRjaCAocGFyYW1zX3JhdGUocGFyYW1zKSkgeworCWNhc2UgODAwMDoKKwljYXNlIDE2MDAwOgorCWNhc2UgMjQwMDA6CisJY2FzZSAzMjAwMDoKKwljYXNlIDQ4MDAwOgorCWNhc2UgNjQwMDA6CisJY2FzZSA5NjAwMDoKKwkJbWNsayA9IDEyMjg4MDAwOworCQlicmVhazsKKwljYXNlIDExMDI1OgorCWNhc2UgMjIwNTA6CisJY2FzZSA0NDEwMDoKKwljYXNlIDg4MjAwOgorCQltY2xrID0gMTEyODk2MDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY3B1X2RhaSwgMCwgbWNsaywKKwkJCQkgICAgIFNORF9TT0NfQ0xPQ0tfT1VUKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjX2RhaS0+ZGV2LCAiQ2FuJ3Qgc2V0IGNwdSBjbG9jayBvdXQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIDAsIG1jbGssCisJCQkJICAgICBTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjX2RhaS0+ZGV2LCAiQ2FuJ3Qgc2V0IGNvZGVjIGNsb2NrIGluICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9wbGwoY29kZWNfZGFpLCAwLCBEQTcyMTlfU1lTQ0xLX01DTEssIDAsIDApOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWNfZGFpLT5kZXYsICJDYW4ndCBzZXQgcGxsIHN5c2NsayBtY2xrICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3NvdW5kX2RhNzIxOV9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlY19kYWlzWzBdLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCWludCByZXQ7CisKKwkvKiBXZSBuZWVkIGRlZmF1bHQgTUNMSyBhbmQgUExMIHNldHRpbmdzIGZvciB0aGUgYWNjZXNzb3J5IGRldGVjdGlvbiAqLworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCAwLCAxMjI4ODAwMCwKKwkJCQkgICAgIFNORF9TT0NfQ0xPQ0tfSU4pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWNfZGFpLT5kZXYsICJJbml0IGNhbid0IHNldCBjb2RlYyBjbG9jayBpbiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfcGxsKGNvZGVjX2RhaSwgMCwgREE3MjE5X1NZU0NMS19NQ0xLLCAwLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjX2RhaS0+ZGV2LCAiSW5pdCBjYW4ndCBzZXQgcGxsIHN5c2NsayBtY2xrICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEVuYWJsZSBIZWFkc2V0IGFuZCA0IEJ1dHRvbnMgSmFjayBkZXRlY3Rpb24gKi8KKwlyZXQgPSBzbmRfc29jX2NhcmRfamFja19uZXcocnRkLT5jYXJkLCAiSGVhZHNldCBKYWNrIiwKKwkJCQkgICAgU05EX0pBQ0tfSEVBRFNFVCB8IFNORF9KQUNLX0xJTkVPVVQgfAorCQkJCSAgICBTTkRfSkFDS19CVE5fMCB8IFNORF9KQUNLX0JUTl8xIHwKKwkJCQkgICAgU05EX0pBQ0tfQlROXzIgfCBTTkRfSkFDS19CVE5fMywKKwkJCQkgICAgJnJvY2tjaGlwX3NvdW5kX2phY2ssIE5VTEwsIDApOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LCAiTmV3IEhlYWRzZXQgSmFjayBmYWlsZWQhICglZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc25kX2phY2tfc2V0X2tleShyb2NrY2hpcF9zb3VuZF9qYWNrLmphY2ssIFNORF9KQUNLX0JUTl8wLCBLRVlfTUVESUEpOworCXNuZF9qYWNrX3NldF9rZXkoCisJCXJvY2tjaGlwX3NvdW5kX2phY2suamFjaywgU05EX0pBQ0tfQlROXzEsIEtFWV9WT0xVTUVVUCk7CisJc25kX2phY2tfc2V0X2tleSgKKwkJcm9ja2NoaXBfc291bmRfamFjay5qYWNrLCBTTkRfSkFDS19CVE5fMiwgS0VZX1ZPTFVNRURPV04pOworCXNuZF9qYWNrX3NldF9rZXkoCisJCXJvY2tjaGlwX3NvdW5kX2phY2suamFjaywgU05EX0pBQ0tfQlROXzMsIEtFWV9WT0lDRUNPTU1BTkQpOworCisJZGE3MjE5X2FhZF9qYWNrX2RldChjb2RlYywgJnJvY2tjaGlwX3NvdW5kX2phY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgcm9ja2NoaXBfc291bmRfbWF4OTgzNTdhX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gcm9ja2NoaXBfc291bmRfbWF4OTgzNTdhX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgcm9ja2NoaXBfc291bmRfcnQ1NTE0X29wcyA9IHsKKwkuaHdfcGFyYW1zID0gcm9ja2NoaXBfc291bmRfcnQ1NTE0X2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgcm9ja2NoaXBfc291bmRfZGE3MjE5X29wcyA9IHsKKwkuaHdfcGFyYW1zID0gcm9ja2NoaXBfc291bmRfZGE3MjE5X2h3X3BhcmFtcywKK307CisKK2VudW0geworCURBSUxJTktfTUFYOTgzNTdBLAorCURBSUxJTktfUlQ1NTE0LAorCURBSUxJTktfREE3MjE5LAorCURBSUxJTktfUlQ1NTE0X0RTUCwKK307CisKKyNkZWZpbmUgREFJTElOS19FTlRJVElFUwkoREFJTElOS19EQTcyMTkgKyAxKQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgcm9ja2NoaXBfZGFpbGlua3NbXSA9IHsKKwlbREFJTElOS19NQVg5ODM1N0FdID0geworCQkubmFtZSA9ICJNQVg5ODM1N0EiLAorCQkuc3RyZWFtX25hbWUgPSAiTUFYOTgzNTdBIFBDTSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJIaUZpIiwKKwkJLm9wcyA9ICZyb2NrY2hpcF9zb3VuZF9tYXg5ODM1N2Ffb3BzLAorCQkvKiBzZXQgbWF4OTgzNTdhIGFzIHNsYXZlICovCisJCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAorCQkJU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKKwl9LAorCVtEQUlMSU5LX1JUNTUxNF0gPSB7CisJCS5uYW1lID0gIlJUNTUxNCIsCisJCS5zdHJlYW1fbmFtZSA9ICJSVDU1MTQgUENNIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInJ0NTUxNC1haWYxIiwKKwkJLm9wcyA9ICZyb2NrY2hpcF9zb3VuZF9ydDU1MTRfb3BzLAorCQkvKiBzZXQgcnQ1NTE0IGFzIHNsYXZlICovCisJCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAorCQkJU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKKwl9LAorCVtEQUlMSU5LX0RBNzIxOV0gPSB7CisJCS5uYW1lID0gIkRBNzIxOSIsCisJCS5zdHJlYW1fbmFtZSA9ICJEQTcyMTkgUENNIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gImRhNzIxOS1oaWZpIiwKKwkJLmluaXQgPSByb2NrY2hpcF9zb3VuZF9kYTcyMTlfaW5pdCwKKwkJLm9wcyA9ICZyb2NrY2hpcF9zb3VuZF9kYTcyMTlfb3BzLAorCQkvKiBzZXQgZGE3MjE5IGFzIHNsYXZlICovCisJCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAorCQkJU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKKwl9LAorCS8qIFJUNTUxNCBEU1AgZm9yIHZvaWNlIHdha2V1cCB2aWEgc3BpIGJ1cyAqLworCVtEQUlMSU5LX1JUNTUxNF9EU1BdID0geworCQkubmFtZSA9ICJSVDU1MTQgRFNQIiwKKwkJLnN0cmVhbV9uYW1lID0gIldha2Ugb24gVm9pY2UiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgcm9ja2NoaXBfc291bmRfY2FyZCA9IHsKKwkubmFtZSA9ICJyazMzOTktZ3J1LXNvdW5kIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuZGFpX2xpbmsgPSByb2NrY2hpcF9kYWlsaW5rcywKKwkubnVtX2xpbmtzID0gIEFSUkFZX1NJWkUocm9ja2NoaXBfZGFpbGlua3MpLAorCS5kYXBtX3dpZGdldHMgPSByb2NrY2hpcF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHJvY2tjaGlwX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gcm9ja2NoaXBfZGFwbV9yb3V0ZXMsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocm9ja2NoaXBfZGFwbV9yb3V0ZXMpLAorCS5jb250cm9scyA9IHJvY2tjaGlwX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHJvY2tjaGlwX2NvbnRyb2xzKSwKK307CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfc291bmRfbWF0Y2hfc3R1YihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfc291bmRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gJnJvY2tjaGlwX3NvdW5kX2NhcmQ7CisJc3RydWN0IGRldmljZV9ub2RlICpjcHVfbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydjsKKwlpbnQgaSwgcmV0OworCisJY3B1X25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLCAicm9ja2NoaXAsY3B1IiwgMCk7CisJaWYgKCFjcHVfbm9kZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJQcm9wZXJ0eSAncm9ja2NoaXAsY3B1JyBtaXNzaW5nIG9yIGludmFsaWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgREFJTElOS19FTlRJVElFUzsgaSsrKSB7CisJCXJvY2tjaGlwX2RhaWxpbmtzW2ldLnBsYXRmb3JtX29mX25vZGUgPSBjcHVfbm9kZTsKKwkJcm9ja2NoaXBfZGFpbGlua3NbaV0uY3B1X29mX25vZGUgPSBjcHVfbm9kZTsKKworCQlyb2NrY2hpcF9kYWlsaW5rc1tpXS5jb2RlY19vZl9ub2RlID0KKwkJCW9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsICJyb2NrY2hpcCxjb2RlYyIsIGkpOworCQlpZiAoIXJvY2tjaGlwX2RhaWxpbmtzW2ldLmNvZGVjX29mX25vZGUpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiUHJvcGVydHlbJWRdICdyb2NrY2hpcCxjb2RlYycgbWlzc2luZyBvciBpbnZhbGlkXG4iLCBpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyoqCisJICogVG8gYWNxdWlyZSB0aGUgc3BpIGRyaXZlciBvZiB0aGUgcnQ1NTE0IGFuZCBzZXQgdGhlIGRhaS1saW5rcyBuYW1lcworCSAqIGZvciBzb2NfYmluZF9kYWlfbGluaworCSAqLworCWRydiA9IGRyaXZlcl9maW5kKCJydDU1MTQiLCAmc3BpX2J1c190eXBlKTsKKwlpZiAoIWRydikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4gbm90IGZpbmQgdGhlIHJ0NTUxNCBkcml2ZXIgYXQgdGhlIHNwaSBidXNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXYgPSBkcml2ZXJfZmluZF9kZXZpY2UoZHJ2LCBOVUxMLCBOVUxMLCByb2NrY2hpcF9zb3VuZF9tYXRjaF9zdHViKTsKKwlpZiAoIWRldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4gbm90IGZpbmQgdGhlIHJ0NTUxNCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBTZXQgRE1JQyBkZWxheSAqLworCXJldCA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMigmcGRldi0+ZGV2LCAiZG1pYy1kZWxheSIsCisJCQkJCSZydDU1MTRfZG1pY19kZWxheSk7CisJaWYgKHJldCkgeworCQlydDU1MTRfZG1pY19kZWxheSA9IDA7CisJCWRldl9kYmcoJnBkZXYtPmRldiwKKwkJCSJubyBvcHRpb25hbCBwcm9wZXJ0eSAnZG1pYy1kZWxheScgZm91bmQsIGRlZmF1bHQ6IG5vIGRlbGF5XG4iKTsKKwl9CisKKwlyb2NrY2hpcF9kYWlsaW5rc1tEQUlMSU5LX1JUNTUxNF9EU1BdLmNwdV9uYW1lID0ga3N0cmR1cF9jb25zdChkZXZfbmFtZShkZXYpLCBHRlBfS0VSTkVMKTsKKwlyb2NrY2hpcF9kYWlsaW5rc1tEQUlMSU5LX1JUNTUxNF9EU1BdLmNwdV9kYWlfbmFtZSA9IGtzdHJkdXBfY29uc3QoZGV2X25hbWUoZGV2KSwgR0ZQX0tFUk5FTCk7CisJcm9ja2NoaXBfZGFpbGlua3NbREFJTElOS19SVDU1MTRfRFNQXS5wbGF0Zm9ybV9uYW1lID0ga3N0cmR1cF9jb25zdChkZXZfbmFtZShkZXYpLCBHRlBfS0VSTkVMKTsKKworCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CisKKwlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCBjYXJkKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBzbmRfc29jX3JlZ2lzdGVyX2NhcmQgZmFpbCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcm9ja2NoaXBfc291bmRfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzM5OS1ncnUtc291bmQiLCB9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcm9ja2NoaXBfc291bmRfZHJpdmVyID0geworCS5wcm9iZSA9IHJvY2tjaGlwX3NvdW5kX3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJWX05BTUUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHJvY2tjaGlwX3NvdW5kX29mX21hdGNoLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0gPSAmc25kX3NvY19wbV9vcHMsCisjZW5kaWYKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyb2NrY2hpcF9zb3VuZF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJYaW5nIFpoZW5nIDx6aGVuZ3hpbmdAcm9jay1jaGlwcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJvY2tjaGlwIEFTb0MgTWFjaGluZSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06IiBEUlZfTkFNRSk7CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByb2NrY2hpcF9zb3VuZF9vZl9tYXRjaCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvcm9ja2NoaXAvcm9ja2NoaXBfaTJzLmMgYi9zb3VuZC9zb2Mvcm9ja2NoaXAvcm9ja2NoaXBfaTJzLmMKaW5kZXggNjUyZThjNS4uOTc0OTE1YyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3JvY2tjaGlwL3JvY2tjaGlwX2kycy5jCisrKyBiL3NvdW5kL3NvYy9yb2NrY2hpcC9yb2NrY2hpcF9pMnMuYwpAQCAtNTcsNiArNTcsNyBAQAogewogCXN0cnVjdCBya19pMnNfZGV2ICppMnMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAorCXJlZ2NhY2hlX2NhY2hlX29ubHkoaTJzLT5yZWdtYXAsIHRydWUpOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShpMnMtPm1jbGspOwogCiAJcmV0dXJuIDA7CkBAIC03Myw3ICs3NCwxNCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldHVybiAwOworCXJlZ2NhY2hlX2NhY2hlX29ubHkoaTJzLT5yZWdtYXAsIGZhbHNlKTsKKwlyZWdjYWNoZV9tYXJrX2RpcnR5KGkycy0+cmVnbWFwKTsKKworCXJldCA9IHJlZ2NhY2hlX3N5bmMoaTJzLT5yZWdtYXApOworCWlmIChyZXQpCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShpMnMtPm1jbGspOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcmtfaTJzX2RldiAqdG9faW5mbyhzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9yb2NrY2hpcC9yb2NrY2hpcF9zcGRpZi5jIGIvc291bmQvc29jL3JvY2tjaGlwL3JvY2tjaGlwX3NwZGlmLmMKaW5kZXggNGNhMjY1Ny4uZmE4MTAxZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3JvY2tjaGlwL3JvY2tjaGlwX3NwZGlmLmMKKysrIGIvc291bmQvc29jL3JvY2tjaGlwL3JvY2tjaGlwX3NwZGlmLmMKQEAgLTY1LDYgKzY1LDcgQEAKIHsKIAlzdHJ1Y3Qgcmtfc3BkaWZfZGV2ICpzcGRpZiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCisJcmVnY2FjaGVfY2FjaGVfb25seShzcGRpZi0+cmVnbWFwLCB0cnVlKTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoc3BkaWYtPm1jbGspOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShzcGRpZi0+aGNsayk7CiAKQEAgLTg4LDcgKzg5LDE2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0dXJuIDA7CisJcmVnY2FjaGVfY2FjaGVfb25seShzcGRpZi0+cmVnbWFwLCBmYWxzZSk7CisJcmVnY2FjaGVfbWFya19kaXJ0eShzcGRpZi0+cmVnbWFwKTsKKworCXJldCA9IHJlZ2NhY2hlX3N5bmMoc3BkaWYtPnJlZ21hcCk7CisJaWYgKHJldCkgeworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoc3BkaWYtPm1jbGspOworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoc3BkaWYtPmhjbGspOworCX0KKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcmtfc3BkaWZfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvS2NvbmZpZyBiL3NvdW5kL3NvYy9zYW1zdW5nL0tjb25maWcKaW5kZXggN2I3MjJiMC4uZjYwMjNiNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvS2NvbmZpZworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9LY29uZmlnCkBAIC0xLDEyICsxLDE0IEBACi1jb25maWcgU05EX1NPQ19TQU1TVU5HCittZW51Y29uZmlnIFNORF9TT0NfU0FNU1VORwogCXRyaXN0YXRlICJBU29DIHN1cHBvcnQgZm9yIFNhbXN1bmciCiAJZGVwZW5kcyBvbiAoUExBVF9TQU1TVU5HIHx8IEFSQ0hfRVhZTk9TKQogCXNlbGVjdCBTTkRfU09DX0dFTkVSSUNfRE1BRU5HSU5FX1BDTQotCWhlbHAKKwktLS1oZWxwLS0tCiAJICBTYXkgWSBvciBNIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBjb2RlY3MgYXR0YWNoZWQgdG8KIAkgIHRoZSBTYW1zdW5nIFNvQ3MnIEF1ZGlvIGludGVyZmFjZXMuIFlvdSB3aWxsIGFsc28gbmVlZCB0bwogCSAgc2VsZWN0IHRoZSBhdWRpbyBpbnRlcmZhY2VzIHRvIHN1cHBvcnQgYmVsb3cuCiAKK2lmIFNORF9TT0NfU0FNU1VORworCiBjb25maWcgU05EX1MzQzI0WFhfSTJTCiAJdHJpc3RhdGUKIApAQCAtMTgsMjIgKzIwLDIyIEBACiAJc2VsZWN0IFNORF9TM0NfSTJTVjJfU09DCiAKIGNvbmZpZyBTTkRfU0FNU1VOR19QQ00KLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJTYW1zdW5nIFBDTSBpbnRlcmZhY2Ugc3VwcG9ydCIKIAogY29uZmlnIFNORF9TQU1TVU5HX0FDOTcKIAl0cmlzdGF0ZQogCXNlbGVjdCBTTkRfU09DX0FDOTdfQlVTCiAKIGNvbmZpZyBTTkRfU0FNU1VOR19TUERJRgotCXRyaXN0YXRlCisJdHJpc3RhdGUgIlNhbXN1bmcgU1BESUYgdHJhbnNtaXR0ZXIgc3VwcG9ydCIKIAlzZWxlY3QgU05EX1NPQ19TUERJRgogCiBjb25maWcgU05EX1NBTVNVTkdfSTJTCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiU2Ftc3VuZyBJMlMgaW50ZXJmYWNlIHN1cHBvcnQiCiAKIGNvbmZpZyBTTkRfU09DX1NBTVNVTkdfTkVPMTk3M19XTTg3NTMKIAl0cmlzdGF0ZSAiQXVkaW8gc3VwcG9ydCBmb3IgT3Blbm1va28gTmVvMTk3MyBTbWFydHBob25lcyAoR1RBMDIpIgotCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIE1BQ0hfTkVPMTk3M19HVEEwMgorCWRlcGVuZHMgb24gTUFDSF9ORU8xOTczX0dUQTAyCiAJc2VsZWN0IFNORF9TM0MyNFhYX0kyUwogCXNlbGVjdCBTTkRfU09DX1dNODc1MwogCXNlbGVjdCBTTkRfU09DX0JUX1NDTwpAQCAtNDMsNyArNDUsNyBAQAogCiBjb25maWcgU05EX1NPQ19TQU1TVU5HX0pJVkVfV004NzUwCiAJdHJpc3RhdGUgIlNvQyBJMlMgQXVkaW8gc3VwcG9ydCBmb3IgSml2ZSIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiBNQUNIX0pJVkUgJiYgSTJDCisJZGVwZW5kcyBvbiBNQUNIX0pJVkUgJiYgSTJDCiAJc2VsZWN0IFNORF9TT0NfV004NzUwCiAJc2VsZWN0IFNORF9TM0MyNDEyX1NPQ19JMlMKIAloZWxwCkBAIC01MSw3ICs1Myw3IEBACiAKIGNvbmZpZyBTTkRfU09DX1NBTVNVTkdfU01ES19XTTg1ODAKIAl0cmlzdGF0ZSAiU29DIEkyUyBBdWRpbyBzdXBwb3J0IGZvciBXTTg1ODAgb24gU01ESyIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiAoTUFDSF9TTURLNjQxMCB8fCBNQUNIX1NNREtDMTAwIHx8IE1BQ0hfU01ES1YyMTAgfHwgTUFDSF9TTURLQzExMCkKKwlkZXBlbmRzIG9uIE1BQ0hfU01ESzY0MTAgfHwgTUFDSF9TTURLQzEwMCB8fCBNQUNIX1NNREtWMjEwIHx8IE1BQ0hfU01ES0MxMTAKIAlkZXBlbmRzIG9uIEkyQwogCXNlbGVjdCBTTkRfU09DX1dNODU4MAogCXNlbGVjdCBTTkRfU0FNU1VOR19JMlMKQEAgLTYwLDcgKzYyLDYgQEAKIAogY29uZmlnIFNORF9TT0NfU0FNU1VOR19TTURLX1dNODk5NAogCXRyaXN0YXRlICJTb0MgSTJTIEF1ZGlvIHN1cHBvcnQgZm9yIFdNODk5NCBvbiBTTURLIgotCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HCiAJZGVwZW5kcyBvbiBJMkM9eQogCXNlbGVjdCBNRkRfV004OTk0CiAJc2VsZWN0IFNORF9TT0NfV004OTk0CkBAIC03MCw3ICs3MSw3IEBACiAKIGNvbmZpZyBTTkRfU09DX1NBTVNVTkdfU01ESzI0NDNfV005NzEwCiAJdHJpc3RhdGUgIlNvQyBBQzk3IEF1ZGlvIHN1cHBvcnQgZm9yIFNNREsyNDQzIC0gV005NzEwIgotCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIE1BQ0hfU01ESzI0NDMKKwlkZXBlbmRzIG9uIE1BQ0hfU01ESzI0NDMKIAlzZWxlY3QgQUM5N19CVVMKIAlzZWxlY3QgU05EX1NPQ19BQzk3X0NPREVDCiAJc2VsZWN0IFNORF9TQU1TVU5HX0FDOTcKQEAgLTgwLDcgKzgxLDcgQEAKIAogY29uZmlnIFNORF9TT0NfU0FNU1VOR19MTjI0NDBTQkNfQUxDNjUwCiAJdHJpc3RhdGUgIlNvQyBBQzk3IEF1ZGlvIHN1cHBvcnQgZm9yIExOMjQ0MFNCQyAtIEFMQzY1MCIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiBBUkNIX1MzQzI0WFgKKwlkZXBlbmRzIG9uIEFSQ0hfUzNDMjRYWAogCXNlbGVjdCBBQzk3X0JVUwogCXNlbGVjdCBTTkRfU09DX0FDOTdfQ09ERUMKIAlzZWxlY3QgU05EX1NBTVNVTkdfQUM5NwpAQCAtOTAsNyArOTEsNyBAQAogCiBjb25maWcgU05EX1NPQ19TQU1TVU5HX1MzQzI0WFhfVURBMTM0WAogCXRyaXN0YXRlICJTb0MgSTJTIEF1ZGlvIHN1cHBvcnQgVURBMTM0WCB3aXJlZCB0byBhIFMzQzI0WFgiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgQVJDSF9TM0MyNFhYCisJZGVwZW5kcyBvbiBBUkNIX1MzQzI0WFgKIAlzZWxlY3QgU05EX1MzQzI0WFhfSTJTCiAJc2VsZWN0IFNORF9TT0NfTDMKIAlzZWxlY3QgU05EX1NPQ19VREExMzRYCkBAIC0xMDIsMjEgKzEwMywyMSBAQAogCiBjb25maWcgU05EX1NPQ19TQU1TVU5HX1NJTVRFQ19UTFYzMjBBSUMyMwogCXRyaXN0YXRlICJTb0MgSTJTIEF1ZGlvIHN1cHBvcnQgZm9yIFRMVjMyMEFJQzIzIG9uIFNpbXRlYyBib2FyZHMiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgQVJDSF9TM0MyNFhYICYmIEkyQworCWRlcGVuZHMgb24gQVJDSF9TM0MyNFhYICYmIEkyQwogCXNlbGVjdCBTTkRfUzNDMjRYWF9JMlMKIAlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyM19JMkMKIAlzZWxlY3QgU05EX1NPQ19TQU1TVU5HX1NJTVRFQwogCiBjb25maWcgU05EX1NPQ19TQU1TVU5HX1NJTVRFQ19IRVJNRVMKIAl0cmlzdGF0ZSAiU29DIEkyUyBBdWRpbyBzdXBwb3J0IGZvciBTaW10ZWMgSGVybWVzIGJvYXJkIgotCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIEFSQ0hfUzNDMjRYWCAmJiBJMkMKKwlkZXBlbmRzIG9uIEFSQ0hfUzNDMjRYWCAmJiBJMkMKIAlzZWxlY3QgU05EX1MzQzI0WFhfSTJTCiAJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDM1gKIAlzZWxlY3QgU05EX1NPQ19TQU1TVU5HX1NJTVRFQwogCiBjb25maWcgU05EX1NPQ19TQU1TVU5HX0gxOTQwX1VEQTEzODAKIAl0cmlzdGF0ZSAiQXVkaW8gc3VwcG9ydCBmb3IgdGhlIEhQIGlQQVEgSDE5NDAiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgQVJDSF9IMTk0MCAmJiBJMkMKKwlkZXBlbmRzIG9uIEFSQ0hfSDE5NDAgJiYgSTJDCiAJc2VsZWN0IFNORF9TM0MyNFhYX0kyUwogCXNlbGVjdCBTTkRfU09DX1VEQTEzODAKIAloZWxwCkBAIC0xMjQsNyArMTI1LDcgQEAKIAogY29uZmlnIFNORF9TT0NfU0FNU1VOR19SWDE5NTBfVURBMTM4MAogCXRyaXN0YXRlICJBdWRpbyBzdXBwb3J0IGZvciB0aGUgSFAgaVBBUSBSWDE5NTAiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgTUFDSF9SWDE5NTAgJiYgSTJDCisJZGVwZW5kcyBvbiBNQUNIX1JYMTk1MCAmJiBJMkMKIAlzZWxlY3QgU05EX1MzQzI0WFhfSTJTCiAJc2VsZWN0IFNORF9TT0NfVURBMTM4MAogCWhlbHAKQEAgLTEzMiw3ICsxMzMsNyBAQAogCiBjb25maWcgU05EX1NPQ19TQU1TVU5HX1NNREtfV005NzEzCiAJdHJpc3RhdGUgIlNvQyBBQzk3IEF1ZGlvIHN1cHBvcnQgZm9yIFNNREsgd2l0aCBXTTk3MTMiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgKE1BQ0hfU01ESzY0MTAgfHwgTUFDSF9TTURLQzEwMCB8fCBNQUNIX1NNREtWMjEwIHx8IE1BQ0hfU01ES0MxMTApCisJZGVwZW5kcyBvbiBNQUNIX1NNREs2NDEwIHx8IE1BQ0hfU01ES0MxMDAgfHwgTUFDSF9TTURLVjIxMCB8fCBNQUNIX1NNREtDMTEwCiAJc2VsZWN0IFNORF9TT0NfV005NzEzCiAJc2VsZWN0IFNORF9TQU1TVU5HX0FDOTcKIAloZWxwCkBAIC0xNDAsMjAgKzE0MSwxOSBAQAogCiBjb25maWcgU05EX1NPQ19TTUFSVFEKIAl0cmlzdGF0ZSAiU29DIEkyUyBBdWRpbyBzdXBwb3J0IGZvciBTbWFydFEgYm9hcmQiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgTUFDSF9TTUFSVFEgJiYgSTJDCisJZGVwZW5kcyBvbiBNQUNIX1NNQVJUUSAmJiBJMkMKIAlzZWxlY3QgU05EX1NBTVNVTkdfSTJTCiAJc2VsZWN0IFNORF9TT0NfV004NzUwCiAKIGNvbmZpZyBTTkRfU09DX1NBTVNVTkdfU01ES19TUERJRgogCXRyaXN0YXRlICJTb0MgUy9QRElGIEF1ZGlvIHN1cHBvcnQgZm9yIFNNREsiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcKIAlzZWxlY3QgU05EX1NBTVNVTkdfU1BESUYKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIFMvUERJRiBhdWRpbyBvbiB0aGUgU01ESy4KIAogY29uZmlnIFNORF9TT0NfU01ES19XTTg1ODBfUENNCiAJdHJpc3RhdGUgIlNvQyBQQ00gQXVkaW8gc3VwcG9ydCBmb3IgV004NTgwIG9uIFNNREsiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgKE1BQ0hfU01ES1YyMTAgfHwgTUFDSF9TTURLQzExMCkKKwlkZXBlbmRzIG9uIE1BQ0hfU01ES1YyMTAgfHwgTUFDSF9TTURLQzExMAogCWRlcGVuZHMgb24gSTJDCiAJc2VsZWN0IFNORF9TT0NfV004NTgwCiAJc2VsZWN0IFNORF9TQU1TVU5HX1BDTQpAQCAtMTYyLDcgKzE2Miw2IEBACiAKIGNvbmZpZyBTTkRfU09DX1NNREtfV004OTk0X1BDTQogCXRyaXN0YXRlICJTb0MgUENNIEF1ZGlvIHN1cHBvcnQgZm9yIFdNODk5NCBvbiBTTURLIgotCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HCiAJZGVwZW5kcyBvbiBJMkM9eQogCXNlbGVjdCBNRkRfV004OTk0CiAJc2VsZWN0IFNORF9TT0NfV004OTk0CkBAIC0xNzIsNyArMTcxLDcgQEAKIAogY29uZmlnIFNORF9TT0NfU1BFWVNJREUKIAl0cmlzdGF0ZSAiQXVkaW8gc3VwcG9ydCBmb3IgV29sZnNvbiBTcGV5c2lkZSIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiBJMkMgJiYgU1BJX01BU1RFUgorCWRlcGVuZHMgb24gSTJDICYmIFNQSV9NQVNURVIKIAlkZXBlbmRzIG9uIE1BQ0hfV0xGX0NSQUdHXzY0MTAgfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IFNORF9TQU1TVU5HX0kyUwogCXNlbGVjdCBTTkRfU09DX1dNODk5NgpAQCAtMTgyLDE0ICsxODEsMTQgQEAKIAogY29uZmlnIFNORF9TT0NfVE9CRVJNT1JZCiAJdHJpc3RhdGUgIkF1ZGlvIHN1cHBvcnQgZm9yIFdvbGZzb24gVG9iZXJtb3J5IgotCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIElOUFVUICYmIEkyQworCWRlcGVuZHMgb24gSU5QVVQgJiYgSTJDCiAJZGVwZW5kcyBvbiBNQUNIX1dMRl9DUkFHR182NDEwIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBTTkRfU0FNU1VOR19JMlMKIAlzZWxlY3QgU05EX1NPQ19XTTg5NjIKIAogY29uZmlnIFNORF9TT0NfQkVMTFMKIAl0cmlzdGF0ZSAiQXVkaW8gc3VwcG9ydCBmb3IgV29sZnNvbiBCZWxscyIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiBNRkRfQVJJWk9OQSAmJiBJMkMgJiYgU1BJX01BU1RFUgorCWRlcGVuZHMgb24gTUZEX0FSSVpPTkEgJiYgSTJDICYmIFNQSV9NQVNURVIKIAlkZXBlbmRzIG9uIE1BQ0hfV0xGX0NSQUdHXzY0MTAgfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IFNORF9TQU1TVU5HX0kyUwogCXNlbGVjdCBTTkRfU09DX1dNNTEwMgpAQCAtMjAwLDcgKzE5OSw3IEBACiAKIGNvbmZpZyBTTkRfU09DX0xPV0xBTkQKIAl0cmlzdGF0ZSAiQXVkaW8gc3VwcG9ydCBmb3IgV29sZnNvbiBMb3dsYW5kIgotCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIEkyQworCWRlcGVuZHMgb24gSTJDCiAJZGVwZW5kcyBvbiBNQUNIX1dMRl9DUkFHR182NDEwIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBTTkRfU0FNU1VOR19JMlMKIAlzZWxlY3QgU05EX1NPQ19XTTUxMDAKQEAgLTIwOCw3ICsyMDcsNyBAQAogCiBjb25maWcgU05EX1NPQ19MSVRUTEVNSUxMCiAJdHJpc3RhdGUgIkF1ZGlvIHN1cHBvcnQgZm9yIFdvbGZzb24gTGl0dGxlbWlsbCIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiBJMkMKKwlkZXBlbmRzIG9uIEkyQwogCWRlcGVuZHMgb24gTUFDSF9XTEZfQ1JBR0dfNjQxMCB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgU05EX1NBTVNVTkdfSTJTCiAJc2VsZWN0IE1GRF9XTTg5OTQKQEAgLTIxNiw3ICsyMTUsNyBAQAogCiBjb25maWcgU05EX1NPQ19TTk9XCiAJdHJpc3RhdGUgIkF1ZGlvIHN1cHBvcnQgZm9yIEdvb2dsZSBTbm93IGJvYXJkcyIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiBJMkMKKwlkZXBlbmRzIG9uIEkyQwogCXNlbGVjdCBTTkRfU09DX01BWDk4MDkwCiAJc2VsZWN0IFNORF9TT0NfTUFYOTgwOTUKIAlzZWxlY3QgU05EX1NBTVNVTkdfSTJTCkBAIC0yMjYsNiArMjI1LDggQEAKIAogY29uZmlnIFNORF9TT0NfQVJOREFMRV9SVDU2MzFfQUxDNTYzMQogICAgICAgICB0cmlzdGF0ZSAiQXVkaW8gc3VwcG9ydCBmb3IgUlQ1NjMxKEFMQzU2MzEpIG9uIEFybmRhbGUgQm9hcmQiCi0gICAgICAgIGRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIEkyQworICAgICAgICBkZXBlbmRzIG9uIEkyQwogICAgICAgICBzZWxlY3QgU05EX1NBTVNVTkdfSTJTCiAgICAgICAgIHNlbGVjdCBTTkRfU09DX1JUNTYzMQorCitlbmRpZiAjU05EX1NPQ19TQU1TVU5HCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9hYzk3LmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9hYzk3LmMKaW5kZXggNTQ3ZDMxMC4uOTdkNjcwMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvYWM5Ny5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2FjOTcuYwpAQCAtMzgsMTYgKzM4LDE2IEBACiB9Owogc3RhdGljIHN0cnVjdCBzM2NfYWM5N19pbmZvIHMzY19hYzk3OwogCi1zdGF0aWMgc3RydWN0IHMzY19kbWFfcGFyYW1zIHMzY19hYzk3X3BjbV9vdXQgPSB7Ci0JLmRtYV9zaXplCT0gNCwKK3N0YXRpYyBzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgczNjX2FjOTdfcGNtX291dCA9IHsKKwkuYWRkcl93aWR0aAk9IDQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzY19kbWFfcGFyYW1zIHMzY19hYzk3X3BjbV9pbiA9IHsKLQkuZG1hX3NpemUJPSA0LAorc3RhdGljIHN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBzM2NfYWM5N19wY21faW4gPSB7CisJLmFkZHJfd2lkdGgJPSA0LAogfTsKIAotc3RhdGljIHN0cnVjdCBzM2NfZG1hX3BhcmFtcyBzM2NfYWM5N19taWNfaW4gPSB7Ci0JLmRtYV9zaXplCT0gNCwKK3N0YXRpYyBzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgczNjX2FjOTdfbWljX2luID0geworCS5hZGRyX3dpZHRoCT0gNCwKIH07CiAKIHN0YXRpYyB2b2lkIHMzY19hYzk3X2FjdGl2YXRlKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKQEAgLTc0LDcgKzc0LDcgQEAKIAl3cml0ZWwoYWNfZ2xiY3RybCwgczNjX2FjOTcucmVncyArIFMzQ19BQzk3X0dMQkNUUkwpOwogCiAJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnMzY19hYzk3LmRvbmUsIEhaKSkKLQkJcHJfZXJyKCJBQzk3OiBVbmFibGUgdG8gYWN0aXZhdGUhIik7CisJCXByX2VycigiQUM5NzogVW5hYmxlIHRvIGFjdGl2YXRlIVxuIik7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzM2NfYWM5N19yZWFkKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywKQEAgLTEwMCw3ICsxMDAsNyBAQAogCXdyaXRlbChhY19nbGJjdHJsLCBzM2NfYWM5Ny5yZWdzICsgUzNDX0FDOTdfR0xCQ1RSTCk7CiAKIAlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmczNjX2FjOTcuZG9uZSwgSFopKQotCQlwcl9lcnIoIkFDOTc6IFVuYWJsZSB0byByZWFkISIpOworCQlwcl9lcnIoIkFDOTc6IFVuYWJsZSB0byByZWFkIVxuIik7CiAKIAlzdGF0ID0gcmVhZGwoczNjX2FjOTcucmVncyArIFMzQ19BQzk3X1NUQVQpOwogCWFkZHIgPSAoc3RhdCA+PiAxNikgJiAweDdmOwpAQCAtMTM3LDcgKzEzNyw3IEBACiAJd3JpdGVsKGFjX2dsYmN0cmwsIHMzY19hYzk3LnJlZ3MgKyBTM0NfQUM5N19HTEJDVFJMKTsKIAogCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZzM2NfYWM5Ny5kb25lLCBIWikpCi0JCXByX2VycigiQUM5NzogVW5hYmxlIHRvIHdyaXRlISIpOworCQlwcl9lcnIoIkFDOTc6IFVuYWJsZSB0byB3cml0ZSFcbiIpOwogCiAJYWNfY29kZWNfY21kID0gcmVhZGwoczNjX2FjOTcucmVncyArIFMzQ19BQzk3X0NPREVDX0NNRCk7CiAJYWNfY29kZWNfY21kIHw9IFMzQ19BQzk3X0NPREVDX0NNRF9SRUFEOwpAQCAtMjczLDE0ICsyNzMsMTQgQEAKIAogc3RhdGljIGludCBzM2NfYWM5N19kYWlfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7Ci0Jc2Ftc3VuZ19hc29jX2luaXRfZG1hX2RhdGEoZGFpLCAmczNjX2FjOTdfcGNtX291dCwgJnMzY19hYzk3X3BjbV9pbik7CisJc25kX3NvY19kYWlfaW5pdF9kbWFfZGF0YShkYWksICZzM2NfYWM5N19wY21fb3V0LCAmczNjX2FjOTdfcGNtX2luKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHMzY19hYzk3X21pY19kYWlfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7Ci0Jc2Ftc3VuZ19hc29jX2luaXRfZG1hX2RhdGEoZGFpLCBOVUxMLCAmczNjX2FjOTdfbWljX2luKTsKKwlzbmRfc29jX2RhaV9pbml0X2RtYV9kYXRhKGRhaSwgTlVMTCwgJnMzY19hYzk3X21pY19pbik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM0NiwxMiArMzQ2LDEyIEBACiAJaWYgKElTX0VSUihzM2NfYWM5Ny5yZWdzKSkKIAkJcmV0dXJuIFBUUl9FUlIoczNjX2FjOTcucmVncyk7CiAKLQlzM2NfYWM5N19wY21fb3V0LnNsYXZlID0gYWM5N19wZGF0YS0+ZG1hX3BsYXliYWNrOwotCXMzY19hYzk3X3BjbV9vdXQuZG1hX2FkZHIgPSBtZW1fcmVzLT5zdGFydCArIFMzQ19BQzk3X1BDTV9EQVRBOwotCXMzY19hYzk3X3BjbV9pbi5zbGF2ZSA9IGFjOTdfcGRhdGEtPmRtYV9jYXB0dXJlOwotCXMzY19hYzk3X3BjbV9pbi5kbWFfYWRkciA9IG1lbV9yZXMtPnN0YXJ0ICsgUzNDX0FDOTdfUENNX0RBVEE7Ci0JczNjX2FjOTdfbWljX2luLnNsYXZlID0gYWM5N19wZGF0YS0+ZG1hX2NhcHR1cmVfbWljOwotCXMzY19hYzk3X21pY19pbi5kbWFfYWRkciA9IG1lbV9yZXMtPnN0YXJ0ICsgUzNDX0FDOTdfTUlDX0RBVEE7CisJczNjX2FjOTdfcGNtX291dC5maWx0ZXJfZGF0YSA9IGFjOTdfcGRhdGEtPmRtYV9wbGF5YmFjazsKKwlzM2NfYWM5N19wY21fb3V0LmFkZHIgPSBtZW1fcmVzLT5zdGFydCArIFMzQ19BQzk3X1BDTV9EQVRBOworCXMzY19hYzk3X3BjbV9pbi5maWx0ZXJfZGF0YSA9IGFjOTdfcGRhdGEtPmRtYV9jYXB0dXJlOworCXMzY19hYzk3X3BjbV9pbi5hZGRyID0gbWVtX3Jlcy0+c3RhcnQgKyBTM0NfQUM5N19QQ01fREFUQTsKKwlzM2NfYWM5N19taWNfaW4uZmlsdGVyX2RhdGEgPSBhYzk3X3BkYXRhLT5kbWFfY2FwdHVyZV9taWM7CisJczNjX2FjOTdfbWljX2luLmFkZHIgPSBtZW1fcmVzLT5zdGFydCArIFMzQ19BQzk3X01JQ19EQVRBOwogCiAJaW5pdF9jb21wbGV0aW9uKCZzM2NfYWM5Ny5kb25lKTsKIAltdXRleF9pbml0KCZzM2NfYWM5Ny5sb2NrKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL2RtYS5oIGIvc291bmQvc29jL3NhbXN1bmcvZG1hLmgKaW5kZXggMzgzMGYyOS4uN2FlNTgwZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvZG1hLmgKKysrIGIvc291bmQvc29jL3NhbXN1bmcvZG1hLmgKQEAgLTEsNiArMSw0IEBACiAvKgotICogIGRtYS5oIC0tCi0gKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAogICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQogICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgpAQCAtOSwyNyArNywxNSBAQAogICogIEFMU0EgUENNIGludGVyZmFjZSBmb3IgdGhlIFNhbXN1bmcgU29DCiAgKi8KIAotI2lmbmRlZiBfUzNDX0FVRElPX0gKLSNkZWZpbmUgX1MzQ19BVURJT19ICisjaWZuZGVmIF9TQU1TVU5HX0RNQV9ICisjZGVmaW5lIF9TQU1TVU5HX0RNQV9ICiAKICNpbmNsdWRlIDxzb3VuZC9kbWFlbmdpbmVfcGNtLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAKLXN0cnVjdCBzM2NfZG1hX3BhcmFtcyB7Ci0Jdm9pZCAqc2xhdmU7CQkJCS8qIENoYW5uZWwgSUQgKi8KLQlkbWFfYWRkcl90IGRtYV9hZGRyOwotCWludCBkbWFfc2l6ZTsJCQkvKiBTaXplIG9mIHRoZSBETUEgdHJhbnNmZXIgKi8KLQljaGFyICpjaF9uYW1lOwotCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBkbWFfZGF0YTsKLX07Ci0KLXZvaWQgc2Ftc3VuZ19hc29jX2luaXRfZG1hX2RhdGEoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCi0JCQkJc3RydWN0IHMzY19kbWFfcGFyYW1zICpwbGF5YmFjaywKLQkJCQlzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgKmNhcHR1cmUpOwogLyoKICAqIEB0eCwgQHJ4IGFyZ3VtZW50cyBjYW4gYmUgTlVMTCBpZiB0aGUgRE1BIGNoYW5uZWwgbmFtZXMgYXJlICJ0eCIsICJyeCIsCiAgKiBvdGhlcndpc2UgYWN0dWFsIERNQSBjaGFubmVsIG5hbWVzIG11c3QgYmUgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24uCiAgKi8KIGludCBzYW1zdW5nX2Fzb2NfZG1hX3BsYXRmb3JtX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2ZpbHRlcl9mbiBmaWx0ZXIsCiAJCQkJICAgICAgIGNvbnN0IGNoYXIgKnR4LCBjb25zdCBjaGFyICpyeCk7Ci0jZW5kaWYKKyNlbmRpZiAvKiBfU0FNU1VOR19ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvZG1hZW5naW5lLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWFlbmdpbmUuYwppbmRleCAyYzg3ZjM4Li45MTA0Yzk4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWFlbmdpbmUuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWFlbmdpbmUuYwpAQCAtMTYsNDkgKzE2LDE4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2FtYmEvcGwwOHguaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1zM2MyNHh4Lmg+Ci0KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL2RtYWVuZ2luZV9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFpLmg+CiAKICNpbmNsdWRlICJkbWEuaCIKIAotdm9pZCBzYW1zdW5nX2Fzb2NfaW5pdF9kbWFfZGF0YShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKLQkJCQlzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgKnBsYXliYWNrLAotCQkJCXN0cnVjdCBzM2NfZG1hX3BhcmFtcyAqY2FwdHVyZSkKLXsKLQlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgKnBsYXliYWNrX2RhdGEgPSBOVUxMOwotCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSAqY2FwdHVyZV9kYXRhID0gTlVMTDsKLQotCWlmIChwbGF5YmFjaykgewotCQlwbGF5YmFja19kYXRhID0gJnBsYXliYWNrLT5kbWFfZGF0YTsKLQkJcGxheWJhY2tfZGF0YS0+ZmlsdGVyX2RhdGEgPSBwbGF5YmFjay0+c2xhdmU7Ci0JCXBsYXliYWNrX2RhdGEtPmNoYW5fbmFtZSA9IHBsYXliYWNrLT5jaF9uYW1lOwotCQlwbGF5YmFja19kYXRhLT5hZGRyID0gcGxheWJhY2stPmRtYV9hZGRyOwotCQlwbGF5YmFja19kYXRhLT5hZGRyX3dpZHRoID0gcGxheWJhY2stPmRtYV9zaXplOwotCX0KLQlpZiAoY2FwdHVyZSkgewotCQljYXB0dXJlX2RhdGEgPSAmY2FwdHVyZS0+ZG1hX2RhdGE7Ci0JCWNhcHR1cmVfZGF0YS0+ZmlsdGVyX2RhdGEgPSBjYXB0dXJlLT5zbGF2ZTsKLQkJY2FwdHVyZV9kYXRhLT5jaGFuX25hbWUgPSBjYXB0dXJlLT5jaF9uYW1lOwotCQljYXB0dXJlX2RhdGEtPmFkZHIgPSBjYXB0dXJlLT5kbWFfYWRkcjsKLQkJY2FwdHVyZV9kYXRhLT5hZGRyX3dpZHRoID0gY2FwdHVyZS0+ZG1hX3NpemU7Ci0JfQotCi0Jc25kX3NvY19kYWlfaW5pdF9kbWFfZGF0YShkYWksIHBsYXliYWNrX2RhdGEsIGNhcHR1cmVfZGF0YSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzYW1zdW5nX2Fzb2NfaW5pdF9kbWFfZGF0YSk7Ci0KIGludCBzYW1zdW5nX2Fzb2NfZG1hX3BsYXRmb3JtX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2ZpbHRlcl9mbiBmaWx0ZXIsCiAJCQkJICAgICAgIGNvbnN0IGNoYXIgKnR4LCBjb25zdCBjaGFyICpyeCkKIHsKIAl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBTTkRfRE1BRU5HSU5FX1BDTV9GTEFHX0NPTVBBVDsKLQogCXN0cnVjdCBzbmRfZG1hZW5naW5lX3BjbV9jb25maWcgKnBjbV9jb25mOwogCiAJcGNtX2NvbmYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBjbV9jb25mKSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9pMnMuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL2kycy5jCmluZGV4IDUwNjM1ZWUuLjdlMzJjZjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL2kycy5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2kycy5jCkBAIC04Nyw5ICs4Nyw5IEBACiAJLyogRHJpdmVyIGZvciB0aGlzIERBSSAqLwogCXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgaTJzX2RhaV9kcnY7CiAJLyogRE1BIHBhcmFtZXRlcnMgKi8KLQlzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgZG1hX3BsYXliYWNrOwotCXN0cnVjdCBzM2NfZG1hX3BhcmFtcyBkbWFfY2FwdHVyZTsKLQlzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgaWRtYV9wbGF5YmFjazsKKwlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgZG1hX3BsYXliYWNrOworCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBkbWFfY2FwdHVyZTsKKwlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgaWRtYV9wbGF5YmFjazsKIAlkbWFfZmlsdGVyX2ZuIGZpbHRlcjsKIAl1MzIJcXVpcmtzOwogCXUzMglzdXNwZW5kX2kyc21vZDsKQEAgLTY5MiwxNSArNjkyLDE1IEBACiAJCWJyZWFrOwogCWNhc2UgMjoKIAkJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCQlpMnMtPmRtYV9wbGF5YmFjay5kbWFfc2l6ZSA9IDQ7CisJCQlpMnMtPmRtYV9wbGF5YmFjay5hZGRyX3dpZHRoID0gNDsKIAkJZWxzZQotCQkJaTJzLT5kbWFfY2FwdHVyZS5kbWFfc2l6ZSA9IDQ7CisJCQlpMnMtPmRtYV9jYXB0dXJlLmFkZHJfd2lkdGggPSA0OwogCQlicmVhazsKIAljYXNlIDE6CiAJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQkJaTJzLT5kbWFfcGxheWJhY2suZG1hX3NpemUgPSAyOworCQkJaTJzLT5kbWFfcGxheWJhY2suYWRkcl93aWR0aCA9IDI7CiAJCWVsc2UKLQkJCWkycy0+ZG1hX2NhcHR1cmUuZG1hX3NpemUgPSAyOworCQkJaTJzLT5kbWFfY2FwdHVyZS5hZGRyX3dpZHRoID0gMjsKIAogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtNzU0LDcgKzc1NCw3IEBACiAJd3JpdGVsKG1vZCwgaTJzLT5hZGRyICsgSTJTTU9EKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGkycy0+bG9jaywgZmxhZ3MpOwogCi0Jc2Ftc3VuZ19hc29jX2luaXRfZG1hX2RhdGEoZGFpLCAmaTJzLT5kbWFfcGxheWJhY2ssICZpMnMtPmRtYV9jYXB0dXJlKTsKKwlzbmRfc29jX2RhaV9pbml0X2RtYV9kYXRhKGRhaSwgJmkycy0+ZG1hX3BsYXliYWNrLCAmaTJzLT5kbWFfY2FwdHVyZSk7CiAKIAlpMnMtPmZybWNsayA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CiAKQEAgLTk5MSwxMCArOTkxLDEwIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChpc19zZWNvbmRhcnkoaTJzKSkgeyAvKiBJZiB0aGlzIGlzIHByb2JlIG9uIHRoZSBzZWNvbmRhcnkgREFJICovCi0JCXNhbXN1bmdfYXNvY19pbml0X2RtYV9kYXRhKGRhaSwgJm90aGVyLT5zZWNfZGFpLT5kbWFfcGxheWJhY2ssCisJCXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoZGFpLCAmb3RoZXItPnNlY19kYWktPmRtYV9wbGF5YmFjaywKIAkJCQkJICAgTlVMTCk7CiAJfSBlbHNlIHsKLQkJc2Ftc3VuZ19hc29jX2luaXRfZG1hX2RhdGEoZGFpLCAmaTJzLT5kbWFfcGxheWJhY2ssCisJCXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoZGFpLCAmaTJzLT5kbWFfcGxheWJhY2ssCiAJCQkJCSAgICZpMnMtPmRtYV9jYXB0dXJlKTsKIAogCQlpZiAoaTJzLT5xdWlya3MgJiBRVUlSS19ORUVEX1JTVENMUikKQEAgLTEwMDIsNyArMTAwMiw3IEBACiAKIAkJaWYgKGkycy0+cXVpcmtzICYgUVVJUktfU1VQUE9SVFNfSURNQSkKIAkJCWlkbWFfcmVnX2FkZHJfaW5pdChpMnMtPmFkZHIsCi0JCQkJCWkycy0+c2VjX2RhaS0+aWRtYV9wbGF5YmFjay5kbWFfYWRkcik7CisJCQkJCWkycy0+c2VjX2RhaS0+aWRtYV9wbGF5YmFjay5hZGRyKTsKIAl9CiAKIAkvKiBSZXNldCBhbnkgY29uc3RyYWludCBvbiBSRlMgYW5kIEJGUyAqLwpAQCAtMTI2Miw4ICsxMjYyLDggQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJcHJpX2RhaS0+ZG1hX3BsYXliYWNrLnNsYXZlID0gaTJzX3BkYXRhLT5kbWFfcGxheWJhY2s7Ci0JCXByaV9kYWktPmRtYV9jYXB0dXJlLnNsYXZlID0gaTJzX3BkYXRhLT5kbWFfY2FwdHVyZTsKKwkJcHJpX2RhaS0+ZG1hX3BsYXliYWNrLmZpbHRlcl9kYXRhID0gaTJzX3BkYXRhLT5kbWFfcGxheWJhY2s7CisJCXByaV9kYWktPmRtYV9jYXB0dXJlLmZpbHRlcl9kYXRhID0gaTJzX3BkYXRhLT5kbWFfY2FwdHVyZTsKIAkJcHJpX2RhaS0+ZmlsdGVyID0gaTJzX3BkYXRhLT5kbWFfZmlsdGVyOwogCiAJCWlmICgmaTJzX3BkYXRhLT50eXBlKQpAQCAtMTMwMiwxMiArMTMwMiwxMiBAQAogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGNsb2NrOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JcHJpX2RhaS0+ZG1hX3BsYXliYWNrLmRtYV9hZGRyID0gcmVnc19iYXNlICsgSTJTVFhEOwotCXByaV9kYWktPmRtYV9jYXB0dXJlLmRtYV9hZGRyID0gcmVnc19iYXNlICsgSTJTUlhEOwotCXByaV9kYWktPmRtYV9wbGF5YmFjay5jaF9uYW1lID0gInR4IjsKLQlwcmlfZGFpLT5kbWFfY2FwdHVyZS5jaF9uYW1lID0gInJ4IjsKLQlwcmlfZGFpLT5kbWFfcGxheWJhY2suZG1hX3NpemUgPSA0OwotCXByaV9kYWktPmRtYV9jYXB0dXJlLmRtYV9zaXplID0gNDsKKwlwcmlfZGFpLT5kbWFfcGxheWJhY2suYWRkciA9IHJlZ3NfYmFzZSArIEkyU1RYRDsKKwlwcmlfZGFpLT5kbWFfY2FwdHVyZS5hZGRyID0gcmVnc19iYXNlICsgSTJTUlhEOworCXByaV9kYWktPmRtYV9wbGF5YmFjay5jaGFuX25hbWUgPSAidHgiOworCXByaV9kYWktPmRtYV9jYXB0dXJlLmNoYW5fbmFtZSA9ICJyeCI7CisJcHJpX2RhaS0+ZG1hX3BsYXliYWNrLmFkZHJfd2lkdGggPSA0OworCXByaV9kYWktPmRtYV9jYXB0dXJlLmFkZHJfd2lkdGggPSA0OwogCXByaV9kYWktPnF1aXJrcyA9IHF1aXJrczsKIAlwcmlfZGFpLT52YXJpYW50X3JlZ3MgPSBpMnNfZGFpX2RhdGEtPmkyc192YXJpYW50X3JlZ3M7CiAKQEAgLTEzMTgsMzEgKzEzMTgsMzMgQEAKIAkJc2VjX2RhaSA9IGkyc19hbGxvY19kYWkocGRldiwgdHJ1ZSk7CiAJCWlmICghc2VjX2RhaSkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jIEkyU19zZWNcbiIpOwotCQkJcmV0dXJuIC1FTk9NRU07CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnJfZGlzYWJsZV9jbGs7CiAJCX0KIAogCQlzZWNfZGFpLT5sb2NrID0gJnByaV9kYWktPnNwaW5sb2NrOwogCQlzZWNfZGFpLT52YXJpYW50X3JlZ3MgPSBwcmlfZGFpLT52YXJpYW50X3JlZ3M7Ci0JCXNlY19kYWktPmRtYV9wbGF5YmFjay5kbWFfYWRkciA9IHJlZ3NfYmFzZSArIEkyU1RYRFM7Ci0JCXNlY19kYWktPmRtYV9wbGF5YmFjay5jaF9uYW1lID0gInR4LXNlYyI7CisJCXNlY19kYWktPmRtYV9wbGF5YmFjay5hZGRyID0gcmVnc19iYXNlICsgSTJTVFhEUzsKKwkJc2VjX2RhaS0+ZG1hX3BsYXliYWNrLmNoYW5fbmFtZSA9ICJ0eC1zZWMiOwogCiAJCWlmICghbnApIHsKLQkJCXNlY19kYWktPmRtYV9wbGF5YmFjay5zbGF2ZSA9IGkyc19wZGF0YS0+ZG1hX3BsYXlfc2VjOworCQkJc2VjX2RhaS0+ZG1hX3BsYXliYWNrLmZpbHRlcl9kYXRhID0gaTJzX3BkYXRhLT5kbWFfcGxheV9zZWM7CiAJCQlzZWNfZGFpLT5maWx0ZXIgPSBpMnNfcGRhdGEtPmRtYV9maWx0ZXI7CiAJCX0KIAotCQlzZWNfZGFpLT5kbWFfcGxheWJhY2suZG1hX3NpemUgPSA0OworCQlzZWNfZGFpLT5kbWFfcGxheWJhY2suYWRkcl93aWR0aCA9IDQ7CiAJCXNlY19kYWktPmFkZHIgPSBwcmlfZGFpLT5hZGRyOwogCQlzZWNfZGFpLT5jbGsgPSBwcmlfZGFpLT5jbGs7CiAJCXNlY19kYWktPnF1aXJrcyA9IHF1aXJrczsKLQkJc2VjX2RhaS0+aWRtYV9wbGF5YmFjay5kbWFfYWRkciA9IGlkbWFfYWRkcjsKKwkJc2VjX2RhaS0+aWRtYV9wbGF5YmFjay5hZGRyID0gaWRtYV9hZGRyOwogCQlzZWNfZGFpLT5wcmlfZGFpID0gcHJpX2RhaTsKIAkJcHJpX2RhaS0+c2VjX2RhaSA9IHNlY19kYWk7CiAJfQogCiAJaWYgKGkyc19wZGF0YSAmJiBpMnNfcGRhdGEtPmNmZ19ncGlvICYmIGkyc19wZGF0YS0+Y2ZnX2dwaW8ocGRldikpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGNvbmZpZ3VyZSBncGlvXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2Rpc2FibGVfY2xrOwogCX0KIAogCXJldCA9IGRldm1fc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnByaV9kYWktPnBkZXYtPmRldiwKQEAgLTEzNjYsNiArMTM2OCw4IEBACiBlcnJfZnJlZV9kYWk6CiAJaWYgKHNlY19kYWkpCiAJCWkyc19mcmVlX3NlY19kYWkoc2VjX2RhaSk7CitlcnJfZGlzYWJsZV9jbGs6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaV9kYWktPmNsayk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvaWRtYS5jIGIvc291bmQvc29jL3NhbXN1bmcvaWRtYS5jCmluZGV4IDRlZDI5ZmYuLjNlNDA4MTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL2lkbWEuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9pZG1hLmMKQEAgLTIyLDcgKzIyLDYgQEAKIAogI2luY2x1ZGUgImkycy5oIgogI2luY2x1ZGUgImlkbWEuaCIKLSNpbmNsdWRlICJkbWEuaCIKICNpbmNsdWRlICJpMnMtcmVncy5oIgogCiAjZGVmaW5lIFNUX1JVTk5JTkcJCSgxPDwwKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvcGNtLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9wY20uYwppbmRleCA0OTBjMWE4Li40M2UzNjdhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9wY20uYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9wY20uYwpAQCAtMTI3LDI1ICsxMjcsMjUgQEAKIAlzdHJ1Y3QgY2xrCSpwY2xrOwogCXN0cnVjdCBjbGsJKmNjbGs7CiAKLQlzdHJ1Y3QgczNjX2RtYV9wYXJhbXMJKmRtYV9wbGF5YmFjazsKLQlzdHJ1Y3QgczNjX2RtYV9wYXJhbXMJKmRtYV9jYXB0dXJlOworCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSAqZG1hX3BsYXliYWNrOworCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSAqZG1hX2NhcHR1cmU7CiB9OwogCi1zdGF0aWMgc3RydWN0IHMzY19kbWFfcGFyYW1zIHMzY19wY21fc3RlcmVvX291dFtdID0geworc3RhdGljIHN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBzM2NfcGNtX3N0ZXJlb19vdXRbXSA9IHsKIAlbMF0gPSB7Ci0JCS5kbWFfc2l6ZQk9IDQsCisJCS5hZGRyX3dpZHRoCT0gNCwKIAl9LAogCVsxXSA9IHsKLQkJLmRtYV9zaXplCT0gNCwKKwkJLmFkZHJfd2lkdGgJPSA0LAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzY19kbWFfcGFyYW1zIHMzY19wY21fc3RlcmVvX2luW10gPSB7CitzdGF0aWMgc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhIHMzY19wY21fc3RlcmVvX2luW10gPSB7CiAJWzBdID0gewotCQkuZG1hX3NpemUJPSA0LAorCQkuYWRkcl93aWR0aAk9IDQsCiAJfSwKIAlbMV0gPSB7Ci0JCS5kbWFfc2l6ZQk9IDQsCisJCS5hZGRyX3dpZHRoCT0gNCwKIAl9LAogfTsKIApAQCAtNTUyLDE1ICs1NTIsMTMgQEAKIAl9CiAJY2xrX3ByZXBhcmVfZW5hYmxlKHBjbS0+cGNsayk7CiAKLQlzM2NfcGNtX3N0ZXJlb19pbltwZGV2LT5pZF0uZG1hX2FkZHIgPSBtZW1fcmVzLT5zdGFydAotCQkJCQkJCSsgUzNDX1BDTV9SWEZJRk87Ci0JczNjX3BjbV9zdGVyZW9fb3V0W3BkZXYtPmlkXS5kbWFfYWRkciA9IG1lbV9yZXMtPnN0YXJ0Ci0JCQkJCQkJKyBTM0NfUENNX1RYRklGTzsKKwlzM2NfcGNtX3N0ZXJlb19pbltwZGV2LT5pZF0uYWRkciA9IG1lbV9yZXMtPnN0YXJ0ICsgUzNDX1BDTV9SWEZJRk87CisJczNjX3BjbV9zdGVyZW9fb3V0W3BkZXYtPmlkXS5hZGRyID0gbWVtX3Jlcy0+c3RhcnQgKyBTM0NfUENNX1RYRklGTzsKIAogCWZpbHRlciA9IE5VTEw7CiAJaWYgKHBjbV9wZGF0YSkgewotCQlzM2NfcGNtX3N0ZXJlb19pbltwZGV2LT5pZF0uc2xhdmUgPSBwY21fcGRhdGEtPmRtYV9jYXB0dXJlOwotCQlzM2NfcGNtX3N0ZXJlb19vdXRbcGRldi0+aWRdLnNsYXZlID0gcGNtX3BkYXRhLT5kbWFfcGxheWJhY2s7CisJCXMzY19wY21fc3RlcmVvX2luW3BkZXYtPmlkXS5maWx0ZXJfZGF0YSA9IHBjbV9wZGF0YS0+ZG1hX2NhcHR1cmU7CisJCXMzY19wY21fc3RlcmVvX291dFtwZGV2LT5pZF0uZmlsdGVyX2RhdGEgPSBwY21fcGRhdGEtPmRtYV9wbGF5YmFjazsKIAkJZmlsdGVyID0gcGNtX3BkYXRhLT5kbWFfZmlsdGVyOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvczNjLWkycy12Mi5jIGIvc291bmQvc29jL3NhbXN1bmcvczNjLWkycy12Mi5jCmluZGV4IGJmOGFlNzkuLjY0NGYxODYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3MzYy1pMnMtdjIuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MtaTJzLXYyLmMKQEAgLTI0LDcgKzI0LDYgQEAKIAogI2luY2x1ZGUgInJlZ3MtaTJzLXYyLmgiCiAjaW5jbHVkZSAiczNjLWkycy12Mi5oIgotI2luY2x1ZGUgImRtYS5oIgogCiAjdW5kZWYgUzNDX0lJU19WMl9TVVBQT1JURUQKIApAQCAtMzAyLDcgKzMwMSw3IEBACiAJCQkJIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewogCXN0cnVjdCBzM2NfaTJzdjJfaW5mbyAqaTJzID0gdG9faW5mbyhkYWkpOwotCXN0cnVjdCBzM2NfZG1hX3BhcmFtcyAqZG1hX2RhdGE7CisJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhICpkbWFfZGF0YTsKIAl1MzIgaWlzbW9kOwogCiAJcHJfZGVidWcoIkVudGVyZWQgJXNcbiIsIF9fZnVuY19fKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3MzYy1pMnMtdjIuaCBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYy1pMnMtdjIuaAppbmRleCBkMDY4NDE0Li4xODJkODA1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MtaTJzLXYyLmgKKysrIGIvc291bmQvc29jL3NhbXN1bmcvczNjLWkycy12Mi5oCkBAIC02MCw4ICs2MCw4IEBACiAKIAl1bnNpZ25lZCBjaGFyCSBtYXN0ZXI7CiAKLQlzdHJ1Y3QgczNjX2RtYV9wYXJhbXMJKmRtYV9wbGF5YmFjazsKLQlzdHJ1Y3QgczNjX2RtYV9wYXJhbXMJKmRtYV9jYXB0dXJlOworCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSAqZG1hX3BsYXliYWNrOworCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSAqZG1hX2NhcHR1cmU7CiAKIAl1MzIJCSBzdXNwZW5kX2lpc21vZDsKIAl1MzIJCSBzdXNwZW5kX2lpc2NvbjsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0MTItaTJzLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNDEyLWkycy5jCmluZGV4IGQ0NWRmZmIuLjNlODlmYmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0MTItaTJzLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjQxMi1pMnMuYwpAQCAtMzQsMTQgKzM0LDE0IEBACiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2Fzb2MtczNjLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgczNjMjQxMl9pMnNfcGNtX3N0ZXJlb19vdXQgPSB7Ci0JLmNoX25hbWUJPSAidHgiLAotCS5kbWFfc2l6ZQk9IDQsCitzdGF0aWMgc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhIHMzYzI0MTJfaTJzX3BjbV9zdGVyZW9fb3V0ID0geworCS5jaGFuX25hbWUJPSAidHgiLAorCS5hZGRyX3dpZHRoCT0gNCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgczNjMjQxMl9pMnNfcGNtX3N0ZXJlb19pbiA9IHsKLQkuY2hfbmFtZQk9ICJyeCIsCi0JLmRtYV9zaXplCT0gNCwKK3N0YXRpYyBzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgczNjMjQxMl9pMnNfcGNtX3N0ZXJlb19pbiA9IHsKKwkuY2hhbl9uYW1lCT0gInJ4IiwKKwkuYWRkcl93aWR0aAk9IDQsCiB9OwogCiBzdGF0aWMgc3RydWN0IHMzY19pMnN2Ml9pbmZvIHMzYzI0MTJfaTJzOwpAQCAtNTIsOCArNTIsOCBAQAogCiAJcHJfZGVidWcoIkVudGVyZWQgJXNcbiIsIF9fZnVuY19fKTsKIAotCXNhbXN1bmdfYXNvY19pbml0X2RtYV9kYXRhKGRhaSwgJnMzYzI0MTJfaTJzX3BjbV9zdGVyZW9fb3V0LAotCQkmczNjMjQxMl9pMnNfcGNtX3N0ZXJlb19pbik7CisJc25kX3NvY19kYWlfaW5pdF9kbWFfZGF0YShkYWksICZzM2MyNDEyX2kyc19wY21fc3RlcmVvX291dCwKKwkJCQkJJnMzYzI0MTJfaTJzX3BjbV9zdGVyZW9faW4pOwogCiAJcmV0ID0gczNjX2kyc3YyX3Byb2JlKGRhaSwgJnMzYzI0MTJfaTJzLCBTM0MyNDEwX1BBX0lJUyk7CiAJaWYgKHJldCkKQEAgLTE2MywxMCArMTYzLDEwIEBACiAJaWYgKElTX0VSUihzM2MyNDEyX2kycy5yZWdzKSkKIAkJcmV0dXJuIFBUUl9FUlIoczNjMjQxMl9pMnMucmVncyk7CiAKLQlzM2MyNDEyX2kyc19wY21fc3RlcmVvX291dC5kbWFfYWRkciA9IHJlcy0+c3RhcnQgKyBTM0MyNDEyX0lJU1RYRDsKLQlzM2MyNDEyX2kyc19wY21fc3RlcmVvX291dC5zbGF2ZSA9IHBkYXRhLT5kbWFfcGxheWJhY2s7Ci0JczNjMjQxMl9pMnNfcGNtX3N0ZXJlb19pbi5kbWFfYWRkciA9IHJlcy0+c3RhcnQgKyBTM0MyNDEyX0lJU1JYRDsKLQlzM2MyNDEyX2kyc19wY21fc3RlcmVvX2luLnNsYXZlID0gcGRhdGEtPmRtYV9jYXB0dXJlOworCXMzYzI0MTJfaTJzX3BjbV9zdGVyZW9fb3V0LmFkZHIgPSByZXMtPnN0YXJ0ICsgUzNDMjQxMl9JSVNUWEQ7CisJczNjMjQxMl9pMnNfcGNtX3N0ZXJlb19vdXQuZmlsdGVyX2RhdGEgPSBwZGF0YS0+ZG1hX3BsYXliYWNrOworCXMzYzI0MTJfaTJzX3BjbV9zdGVyZW9faW4uYWRkciA9IHJlcy0+c3RhcnQgKyBTM0MyNDEyX0lJU1JYRDsKKwlzM2MyNDEyX2kyc19wY21fc3RlcmVvX2luLmZpbHRlcl9kYXRhID0gcGRhdGEtPmRtYV9jYXB0dXJlOwogCiAJcmV0ID0gczNjX2kyc3YyX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LCAtMSwKIAkJCQkJICAgJnMzYzI0MTJfaTJzX2NvbXBvbmVudCwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHgtaTJzLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4LWkycy5jCmluZGV4IDNlNzZmMmEuLmM3OGE5MzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHgtaTJzLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eC1pMnMuYwpAQCAtMzIsMTQgKzMyLDE0IEBACiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2Fzb2MtczNjLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgczNjMjR4eF9pMnNfcGNtX3N0ZXJlb19vdXQgPSB7Ci0JLmNoX25hbWUJPSAidHgiLAotCS5kbWFfc2l6ZQk9IDIsCitzdGF0aWMgc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhIHMzYzI0eHhfaTJzX3BjbV9zdGVyZW9fb3V0ID0geworCS5jaGFuX25hbWUJPSAidHgiLAorCS5hZGRyX3dpZHRoCT0gMiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgczNjMjR4eF9pMnNfcGNtX3N0ZXJlb19pbiA9IHsKLQkuY2hfbmFtZQk9ICJyeCIsCi0JLmRtYV9zaXplCT0gMiwKK3N0YXRpYyBzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgczNjMjR4eF9pMnNfcGNtX3N0ZXJlb19pbiA9IHsKKwkuY2hhbl9uYW1lCT0gInJ4IiwKKwkuYWRkcl93aWR0aAk9IDIsCiB9OwogCiBzdHJ1Y3QgczNjMjR4eF9pMnNfaW5mbyB7CkBAIC0zNjAsOCArMzYwLDggQEAKIHsKIAlwcl9kZWJ1ZygiRW50ZXJlZCAlc1xuIiwgX19mdW5jX18pOwogCi0Jc2Ftc3VuZ19hc29jX2luaXRfZG1hX2RhdGEoZGFpLCAmczNjMjR4eF9pMnNfcGNtX3N0ZXJlb19vdXQsCi0JCSZzM2MyNHh4X2kyc19wY21fc3RlcmVvX2luKTsKKwlzbmRfc29jX2RhaV9pbml0X2RtYV9kYXRhKGRhaSwgJnMzYzI0eHhfaTJzX3BjbV9zdGVyZW9fb3V0LAorCQkJCQkmczNjMjR4eF9pMnNfcGNtX3N0ZXJlb19pbik7CiAKIAlzM2MyNHh4X2kycy5paXNfY2xrID0gZGV2bV9jbGtfZ2V0KGRhaS0+ZGV2LCAiaWlzIik7CiAJaWYgKElTX0VSUihzM2MyNHh4X2kycy5paXNfY2xrKSkgewpAQCAtNDY5LDEwICs0NjksMTAgQEAKIAlpZiAoSVNfRVJSKHMzYzI0eHhfaTJzLnJlZ3MpKQogCQlyZXR1cm4gUFRSX0VSUihzM2MyNHh4X2kycy5yZWdzKTsKIAotCXMzYzI0eHhfaTJzX3BjbV9zdGVyZW9fb3V0LmRtYV9hZGRyID0gcmVzLT5zdGFydCArIFMzQzI0MTBfSUlTRklGTzsKLQlzM2MyNHh4X2kyc19wY21fc3RlcmVvX291dC5zbGF2ZSA9IHBkYXRhLT5kbWFfcGxheWJhY2s7Ci0JczNjMjR4eF9pMnNfcGNtX3N0ZXJlb19pbi5kbWFfYWRkciA9IHJlcy0+c3RhcnQgKyBTM0MyNDEwX0lJU0ZJRk87Ci0JczNjMjR4eF9pMnNfcGNtX3N0ZXJlb19pbi5zbGF2ZSA9IHBkYXRhLT5kbWFfY2FwdHVyZTsKKwlzM2MyNHh4X2kyc19wY21fc3RlcmVvX291dC5hZGRyID0gcmVzLT5zdGFydCArIFMzQzI0MTBfSUlTRklGTzsKKwlzM2MyNHh4X2kyc19wY21fc3RlcmVvX291dC5maWx0ZXJfZGF0YSA9IHBkYXRhLT5kbWFfcGxheWJhY2s7CisJczNjMjR4eF9pMnNfcGNtX3N0ZXJlb19pbi5hZGRyID0gcmVzLT5zdGFydCArIFMzQzI0MTBfSUlTRklGTzsKKwlzM2MyNHh4X2kyc19wY21fc3RlcmVvX2luLmZpbHRlcl9kYXRhID0gcGRhdGEtPmRtYV9jYXB0dXJlOwogCiAJcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAogCQkJJnMzYzI0eHhfaTJzX2NvbXBvbmVudCwgJnMzYzI0eHhfaTJzX2RhaSwgMSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4X3VkYTEzNHguYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfdWRhMTM0eC5jCmluZGV4IDUwODQ5ZTEuLjc4NTNmYmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfdWRhMTM0eC5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfdWRhMTM0eC5jCkBAIC01NCwyOCArNTQsMjcgQEAKIH07CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnMzYzI0eHhfdWRhMTM0eF9zbmRfZGV2aWNlOwotCiBzdGF0aWMgaW50IHMzYzI0eHhfdWRhMTM0eF9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewotCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CiAjaWZkZWYgRU5GT1JDRV9SQVRFUwogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAjZW5kaWYKKwlpbnQgcmV0ID0gMDsKIAogCW11dGV4X2xvY2soJmNsa19sb2NrKTsKLQlwcl9kZWJ1ZygiJXMgJWRcbiIsIF9fZnVuY19fLCBjbGtfdXNlcnMpOworCiAJaWYgKGNsa191c2VycyA9PSAwKSB7Ci0JCXh0YWwgPSBjbGtfZ2V0KCZzM2MyNHh4X3VkYTEzNHhfc25kX2RldmljZS0+ZGV2LCAieHRhbCIpOworCQl4dGFsID0gY2xrX2dldChydGQtPmRldiwgInh0YWwiKTsKIAkJaWYgKElTX0VSUih4dGFsKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBjYW5ub3QgZ2V0IHh0YWxcbiIsIF9fZnVuY19fKTsKKwkJCWRldl9lcnIocnRkLT5kZXYsICIlcyBjYW5ub3QgZ2V0IHh0YWxcbiIsIF9fZnVuY19fKTsKIAkJCXJldCA9IFBUUl9FUlIoeHRhbCk7CiAJCX0gZWxzZSB7Ci0JCQlwY2xrID0gY2xrX2dldCgmczNjMjR4eF91ZGExMzR4X3NuZF9kZXZpY2UtPmRldiwKLQkJCQkgICAgICAgInBjbGsiKTsKKwkJCXBjbGsgPSBjbGtfZ2V0KGNwdV9kYWktPmRldiwgImlpcyIpOwogCQkJaWYgKElTX0VSUihwY2xrKSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiJXMgY2Fubm90IGdldCBwY2xrXG4iLAotCQkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQkJZGV2X2VycihydGQtPmRldiwgIiVzIGNhbm5vdCBnZXQgcGNsa1xuIiwKKwkJCQkJX19mdW5jX18pOwogCQkJCWNsa19wdXQoeHRhbCk7CiAJCQkJcmV0ID0gUFRSX0VSUihwY2xrKTsKIAkJCX0KQEAgLTEwMSw4ICsxMDAsOCBAQAogCQkJCQkJIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAogCQkJCQkJICZod19jb25zdHJhaW50c19yYXRlcyk7CiAJCWlmIChyZXQgPCAwKQotCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBjYW5ub3Qgc2V0IGNvbnN0cmFpbnRzXG4iLAotCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCWRldl9lcnIocnRkLT5kZXYsICIlcyBjYW5ub3Qgc2V0IGNvbnN0cmFpbnRzXG4iLAorCQkJCV9fZnVuY19fKTsKICNlbmRpZgogCX0KIAlyZXR1cm4gcmV0OwpAQCAtMTExLDcgKzExMCw2IEBACiBzdGF0aWMgdm9pZCBzM2MyNHh4X3VkYTEzNHhfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJbXV0ZXhfbG9jaygmY2xrX2xvY2spOwotCXByX2RlYnVnKCIlcyAlZFxuIiwgX19mdW5jX18sIGNsa191c2Vycyk7CiAJY2xrX3VzZXJzIC09IDE7CiAJaWYgKGNsa191c2VycyA9PSAwKSB7CiAJCWNsa19wdXQoeHRhbCk7CkBAIC0xNTgsMTggKzE1NiwxOSBAQAogCQljbGtfc291cmNlID0gUzNDMjRYWF9DTEtTUkNfUENMSzsKIAkJZGl2ID0gYmkgJSAzMzsKIAl9Ci0JcHJfZGVidWcoIiVzIGRlc2lyZWQgcmF0ZSAlbHUsICVkXG4iLCBfX2Z1bmNfXywgcmF0ZSwgYmkpOworCisJZGV2X2RiZyhydGQtPmRldiwgIiVzIGRlc2lyZWQgcmF0ZSAlbHUsICVkXG4iLCBfX2Z1bmNfXywgcmF0ZSwgYmkpOwogCiAJY2xrID0gKGZzX21vZGUgPT0gUzNDMjQxMF9JSVNNT0RfMzg0RlMgPyAzODQgOiAyNTYpICogcmF0ZTsKLQlwcl9kZWJ1ZygiJXMgd2lsbCB1c2U6ICVzICVzICVkIHN5c2NsayAlZCBlcnIgJWxkXG4iLCBfX2Z1bmNfXywKLQkJIGZzX21vZGUgPT0gUzNDMjQxMF9JSVNNT0RfMzg0RlMgPyAiMzg0RlMiIDogIjI1NkZTIiwKLQkJIGNsa19zb3VyY2UgPT0gUzNDMjRYWF9DTEtTUkNfTVBMTCA/ICJNUExMaW4iIDogIlBDTEsiLAotCQkgZGl2LCBjbGssIGVycik7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXMgd2lsbCB1c2U6ICVzICVzICVkIHN5c2NsayAlZCBlcnIgJWxkXG4iLCBfX2Z1bmNfXywKKwkJZnNfbW9kZSA9PSBTM0MyNDEwX0lJU01PRF8zODRGUyA/ICIzODRGUyIgOiAiMjU2RlMiLAorCQljbGtfc291cmNlID09IFMzQzI0WFhfQ0xLU1JDX01QTEwgPyAiTVBMTGluIiA6ICJQQ0xLIiwKKwkJZGl2LCBjbGssIGVycik7CiAKIAlpZiAoKGVyciAqIDEwMCAvIHJhdGUpID4gNSkgewotCQlwcmludGsoS0VSTl9FUlIgIlMzQzI0WFhfVURBMTM0WDogZWZmZWN0aXZlIGZyZXF1ZW5jeSAiCi0JCSAgICAgICAidG9vIGRpZmZlcmVudCBmcm9tIGRlc2lyZWQgKCVsZCUlKVxuIiwKLQkJICAgICAgIGVyciAqIDEwMCAvIHJhdGUpOworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZWZmZWN0aXZlIGZyZXF1ZW5jeSB0b28gZGlmZmVyZW50ICIKKwkJCQkgICJmcm9tIGRlc2lyZWQgKCVsZCUlKVxuIiwgZXJyICogMTAwIC8gcmF0ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjI2LDExNSArMjI1LDI3IEBACiAJLm51bV9saW5rcyA9IDEsCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzYzI0eHhfdWRhMTM0eF9wbGF0Zm9ybV9kYXRhICpzM2MyNHh4X3VkYTEzNHhfbDNfcGluczsKLQotc3RhdGljIHZvaWQgc2V0ZGF0KGludCB2KQotewotCWdwaW9fc2V0X3ZhbHVlKHMzYzI0eHhfdWRhMTM0eF9sM19waW5zLT5sM19kYXRhLCB2ID4gMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldGNsayhpbnQgdikKLXsKLQlncGlvX3NldF92YWx1ZShzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+bDNfY2xrLCB2ID4gMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldG1vZGUoaW50IHYpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoczNjMjR4eF91ZGExMzR4X2wzX3BpbnMtPmwzX21vZGUsIHYgPiAwKTsKLX0KLQotLyogRklYTUUgLSBUaGlzIG11c3QgYmUgY29kZWMgcGxhdGZvcm0gZGF0YSBidXQgaW4gd2hpY2ggYm9hcmQgZmlsZSA/PyAqLwotc3RhdGljIHN0cnVjdCB1ZGExMzR4X3BsYXRmb3JtX2RhdGEgczNjMjR4eF91ZGExMzR4ID0gewotCS5sMyA9IHsKLQkJLnNldGRhdCA9IHNldGRhdCwKLQkJLnNldGNsayA9IHNldGNsaywKLQkJLnNldG1vZGUgPSBzZXRtb2RlLAotCQkuZGF0YV9ob2xkID0gMSwKLQkJLmRhdGFfc2V0dXAgPSAxLAotCQkuY2xvY2tfaGlnaCA9IDEsCi0JCS5tb2RlX2hvbGQgPSAxLAotCQkubW9kZSA9IDEsCi0JCS5tb2RlX3NldHVwID0gMSwKLQl9LAotfTsKLQotc3RhdGljIGludCBzM2MyNHh4X3VkYTEzNHhfc2V0dXBfcGluKGludCBwaW4sIGNoYXIgKmZ1bikKLXsKLQlpZiAoZ3Bpb19yZXF1ZXN0KHBpbiwgInMzYzI0eHhfdWRhMTM0eCIpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlMzQzI0WFhfVURBMTM0WCBTb0MgQXVkaW86ICIKLQkJICAgICAgICJsMyAlcyBwaW4gYWxyZWFkeSBpbiB1c2UiLCBmdW4pOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQocGluLCAwKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBzM2MyNHh4X3VkYTEzNHhfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gJnNuZF9zb2NfczNjMjR4eF91ZGExMzR4OwogCWludCByZXQ7CiAKLQlwcmludGsoS0VSTl9JTkZPICJTM0MyNFhYX1VEQTEzNFggU29DIEF1ZGlvIGRyaXZlclxuIik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CisJY2FyZC0+ZGV2ID0gJnBkZXYtPmRldjsKIAotCXMzYzI0eHhfdWRhMTM0eF9sM19waW5zID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaWYgKHMzYzI0eHhfdWRhMTM0eF9sM19waW5zID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTM0MyNFhYX1VEQTEzNFggU29DIEF1ZGlvOiAiCi0JCSAgICAgICAidW5hYmxlIHRvIGZpbmQgcGxhdGZvcm0gZGF0YVxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlzM2MyNHh4X3VkYTEzNHgucG93ZXIgPSBzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+cG93ZXI7Ci0JczNjMjR4eF91ZGExMzR4Lm1vZGVsID0gczNjMjR4eF91ZGExMzR4X2wzX3BpbnMtPm1vZGVsOwotCi0JaWYgKHMzYzI0eHhfdWRhMTM0eF9zZXR1cF9waW4oczNjMjR4eF91ZGExMzR4X2wzX3BpbnMtPmwzX2RhdGEsCi0JCQkJICAgICAgImRhdGEiKSA8IDApCi0JCXJldHVybiAtRUJVU1k7Ci0JaWYgKHMzYzI0eHhfdWRhMTM0eF9zZXR1cF9waW4oczNjMjR4eF91ZGExMzR4X2wzX3BpbnMtPmwzX2NsaywKLQkJCQkgICAgICAiY2xrIikgPCAwKSB7Ci0JCWdwaW9fZnJlZShzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+bDNfZGF0YSk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCWlmIChzM2MyNHh4X3VkYTEzNHhfc2V0dXBfcGluKHMzYzI0eHhfdWRhMTM0eF9sM19waW5zLT5sM19tb2RlLAotCQkJCSAgICAgICJtb2RlIikgPCAwKSB7Ci0JCWdwaW9fZnJlZShzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+bDNfZGF0YSk7Ci0JCWdwaW9fZnJlZShzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+bDNfY2xrKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlzM2MyNHh4X3VkYTEzNHhfc25kX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29jLWF1ZGlvIiwgLTEpOwotCWlmICghczNjMjR4eF91ZGExMzR4X3NuZF9kZXZpY2UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTM0MyNFhYX1VEQTEzNFggU29DIEF1ZGlvOiAiCi0JCSAgICAgICAiVW5hYmxlIHRvIHJlZ2lzdGVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEoczNjMjR4eF91ZGExMzR4X3NuZF9kZXZpY2UsCi0JCQkgICAgICZzbmRfc29jX3MzYzI0eHhfdWRhMTM0eCk7Ci0JcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHMzYzI0eHhfdWRhMTM0eF9zbmRfZGV2aWNlLCAmczNjMjR4eF91ZGExMzR4LCBzaXplb2YoczNjMjR4eF91ZGExMzR4KSk7Ci0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzM2MyNHh4X3VkYTEzNHhfc25kX2RldmljZSk7Ci0JaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgIlMzQzI0WFhfVURBMTM0WCBTb0MgQXVkaW86IFVuYWJsZSB0byBhZGRcbiIpOwotCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHMzYzI0eHhfdWRhMTM0eF9zbmRfZGV2aWNlKTsKLQl9CisJcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwgY2FyZCk7CisJaWYgKHJldCkKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGNhcmQ6ICVkXG4iLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBzM2MyNHh4X3VkYTEzNHhfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoczNjMjR4eF91ZGExMzR4X3NuZF9kZXZpY2UpOwotCWdwaW9fZnJlZShzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+bDNfZGF0YSk7Ci0JZ3Bpb19mcmVlKHMzYzI0eHhfdWRhMTM0eF9sM19waW5zLT5sM19jbGspOwotCWdwaW9fZnJlZShzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+bDNfbW9kZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHMzYzI0eHhfdWRhMTM0eF9kcml2ZXIgPSB7CiAJLnByb2JlICA9IHMzYzI0eHhfdWRhMTM0eF9wcm9iZSwKLQkucmVtb3ZlID0gczNjMjR4eF91ZGExMzR4X3JlbW92ZSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJzM2MyNHh4X3VkYTEzNHgiLAogCX0sCiB9OwotCiBtb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHMzYzI0eHhfdWRhMTM0eF9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJab2x0YW4gRGV2YWksIENocmlzdGlhbiBQZWxsZWdyaW4gPGNocmlwZWxsQGV2b2x3YXJlLm9yZz4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204NTgwcGNtLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODU4MHBjbS5jCmluZGV4IDZkZWVjNTIuLmE2ZDIyMzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204NTgwcGNtLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg1ODBwY20uYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKICNpbmNsdWRlICIuLi9jb2RlY3Mvd204NTgwLmgiCi0jaW5jbHVkZSAiZG1hLmgiCiAjaW5jbHVkZSAicGNtLmgiCiAKIC8qCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NHBjbS5jIGIvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg5OTRwY20uYwppbmRleCBiMWM4OWVjLi4yZTYyMTQ5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NHBjbS5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0cGNtLmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAKICNpbmNsdWRlICIuLi9jb2RlY3Mvd204OTk0LmgiCi0jaW5jbHVkZSAiZG1hLmgiCiAjaW5jbHVkZSAicGNtLmgiCiAKIC8qCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGRpZi5jIGIvc291bmQvc29jL3NhbXN1bmcvc3BkaWYuYwppbmRleCAwY2I5Yzg1Li4yNmMxZmJlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGRpZi5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NwZGlmLmMKQEAgLTkwLDEwICs5MCwxMCBAQAogCXUzMgkJc2F2ZWRfY2xrY29uOwogCXUzMgkJc2F2ZWRfY29uOwogCXUzMgkJc2F2ZWRfY3N0YXM7Ci0Jc3RydWN0IHMzY19kbWFfcGFyYW1zCSpkbWFfcGxheWJhY2s7CisJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhICpkbWFfcGxheWJhY2s7CiB9OwogCi1zdGF0aWMgc3RydWN0IHMzY19kbWFfcGFyYW1zIHNwZGlmX3N0ZXJlb19vdXQ7CitzdGF0aWMgc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhIHNwZGlmX3N0ZXJlb19vdXQ7CiBzdGF0aWMgc3RydWN0IHNhbXN1bmdfc3BkaWZfaW5mbyBzcGRpZl9pbmZvOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzYW1zdW5nX3NwZGlmX2luZm8gKnRvX2luZm8oc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpKQpAQCAtMTc5LDcgKzE3OSw3IEBACiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzYW1zdW5nX3NwZGlmX2luZm8gKnNwZGlmID0gdG9faW5mbyhydGQtPmNwdV9kYWkpOwogCXZvaWQgX19pb21lbSAqcmVncyA9IHNwZGlmLT5yZWdzOwotCXN0cnVjdCBzM2NfZG1hX3BhcmFtcyAqZG1hX2RhdGE7CisJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhICpkbWFfZGF0YTsKIAl1MzIgY29uLCBjbGtjb24sIGNzdGFzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGksIHJhdGlvOwpAQCAtNDI1LDExICs0MjUsMTEgQEAKIAkJZ290byBlcnI0OwogCX0KIAotCXNwZGlmX3N0ZXJlb19vdXQuZG1hX3NpemUgPSAyOwotCXNwZGlmX3N0ZXJlb19vdXQuZG1hX2FkZHIgPSBtZW1fcmVzLT5zdGFydCArIERBVEFfT1VUQlVGOworCXNwZGlmX3N0ZXJlb19vdXQuYWRkcl93aWR0aCA9IDI7CisJc3BkaWZfc3RlcmVvX291dC5hZGRyID0gbWVtX3Jlcy0+c3RhcnQgKyBEQVRBX09VVEJVRjsKIAlmaWx0ZXIgPSBOVUxMOwogCWlmIChzcGRpZl9wZGF0YSkgewotCQlzcGRpZl9zdGVyZW9fb3V0LnNsYXZlID0gc3BkaWZfcGRhdGEtPmRtYV9wbGF5YmFjazsKKwkJc3BkaWZfc3RlcmVvX291dC5maWx0ZXJfZGF0YSA9IHNwZGlmX3BkYXRhLT5kbWFfcGxheWJhY2s7CiAJCWZpbHRlciA9IHNwZGlmX3BkYXRhLT5kbWFfZmlsdGVyOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL0tjb25maWcgYi9zb3VuZC9zb2Mvc2gvS2NvbmZpZwppbmRleCA5MzExZjExLi42ZGI2NDA1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvS2NvbmZpZworKysgYi9zb3VuZC9zb2Mvc2gvS2NvbmZpZwpAQCAtNDIsMTIgKzQyLDYgQEAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIFItQ2FyIFNSVS9TQ1UvU1NJVS9TU0kgc291bmQgc3VwcG9ydAogCi1jb25maWcgU05EX1NPQ19SU1JDX0NBUkQKLQl0cmlzdGF0ZSAiUmVuZXNhcyBTYW1wbGluZyBSYXRlIENvbnZlcnQgU291bmQgQ2FyZCIKLQlzZWxlY3QgU05EX1NJTVBMRV9DQVJEX1VUSUxTCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzaW1wbGUgc291bmQgaWYgeW91IG5lZWQgc2FtcGxpbmcgcmF0ZSBjb252ZXJ0Ci0KICMjCiAjIyBCb2FyZHMKICMjCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvcmNhci9NYWtlZmlsZSBiL3NvdW5kL3NvYy9zaC9yY2FyL01ha2VmaWxlCmluZGV4IGE4OWRkZjcuLjljM2Q1YWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9yY2FyL01ha2VmaWxlCisrKyBiL3NvdW5kL3NvYy9zaC9yY2FyL01ha2VmaWxlCkBAIC0xLDUgKzEsMiBAQAogc25kLXNvYy1yY2FyLW9ianMJOj0gY29yZS5vIGdlbi5vIGRtYS5vIGFkZy5vIHNzaS5vIHNzaXUubyBzcmMubyBjdHUubyBtaXgubyBkdmMubyBjbWQubwogb2JqLSQoQ09ORklHX1NORF9TT0NfUkNBUikJKz0gc25kLXNvYy1yY2FyLm8KLQotc25kLXNvYy1yc3JjLWNhcmQtb2Jqcwk6PSByc3JjLWNhcmQubwotb2JqLSQoQ09ORklHX1NORF9TT0NfUlNSQ19DQVJEKQkrPSBzbmQtc29jLXJzcmMtY2FyZC5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvcmNhci9jb3JlLmMgYi9zb3VuZC9zb2Mvc2gvcmNhci9jb3JlLmMKaW5kZXggMzM1MWE3MC4uZjE4MTQxMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL3JjYXIvY29yZS5jCisrKyBiL3NvdW5kL3NvYy9zaC9yY2FyL2NvcmUuYwpAQCAtMTEwLDYgKzExMCw3IEBACiAvKgogICoJcnNuZF9tb2QgZnVuY3Rpb25zCiAgKi8KKyNpZmRlZiBERUJVRwogdm9pZCByc25kX21vZF9tYWtlX3N1cmUoc3RydWN0IHJzbmRfbW9kICptb2QsIGVudW0gcnNuZF9tb2RfdHlwZSB0eXBlKQogewogCWlmIChtb2QtPnR5cGUgIT0gdHlwZSkgewpAQCAtMTIwLDYgKzEyMSw3IEBACiAJCQkgcnNuZF9tb2RfbmFtZShtb2QpLCByc25kX21vZF9pZChtb2QpKTsKIAl9CiB9CisjZW5kaWYKIAogY2hhciAqcnNuZF9tb2RfbmFtZShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCkKIHsKQEAgLTU3NCw2ICs1NzYsNyBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgogCQlyc25kX2RhaV9zdHJlYW1faW5pdChpbywgc3Vic3RyZWFtKTsKIAogCQlyZXQgPSByc25kX2RhaV9jYWxsKGluaXQsIGlvLCBwcml2KTsKQEAgLTU5MCw2ICs1OTMsNyBAQAogCiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CiAJCXJldCA9IHJzbmRfZGFpX2NhbGwoaXJxLCBpbywgcHJpdiwgMCk7CiAKIAkJcmV0IHw9IHJzbmRfZGFpX2NhbGwoc3RvcCwgaW8sIHByaXYpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvcnNyYy1jYXJkLmMgYi9zb3VuZC9zb2Mvc2gvcmNhci9yc3JjLWNhcmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzN2Y4NC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2Mvc2gvcmNhci9yc3JjLWNhcmQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vKgotICogUmVuZXNhcyBTYW1wbGluZyBSYXRlIENvbnZlcnQgU291bmQgQ2FyZCBmb3IgRFBDTQotICoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgotICogS3VuaW5vcmkgTW9yaW1vdG8gPGt1bmlub3JpLm1vcmltb3RvLmd4QHJlbmVzYXMuY29tPgotICoKLSAqIGJhc2VkIG9uICR7TElOVVh9L3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLmMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhaS5oPgotI2luY2x1ZGUgPHNvdW5kL3NpbXBsZV9jYXJkX3V0aWxzLmg+Ci0KLXN0cnVjdCByc3JjX2NhcmRfb2ZfZGF0YSB7Ci0JY29uc3QgY2hhciAqcHJlZml4OwotCWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgKnJvdXRlczsKLQlpbnQgbnVtX3JvdXRlczsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHJvdXRlc19zc2kwX2FrNDY0MltdID0gewotCXsiYWs0NjQyIFBsYXliYWNrIiwgTlVMTCwgIkRBSTAgUGxheWJhY2sifSwKLQl7IkRBSTAgQ2FwdHVyZSIsIE5VTEwsICJhazQ2NDIgQ2FwdHVyZSJ9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByc3JjX2NhcmRfb2ZfZGF0YSByb3V0ZXNfb2Zfc3NpMF9hazQ2NDIgPSB7Ci0JLnByZWZpeAkJPSAiYWs0NjQyIiwKLQkucm91dGVzCQk9IHJvdXRlc19zc2kwX2FrNDY0MiwKLQkubnVtX3JvdXRlcwk9IEFSUkFZX1NJWkUocm91dGVzX3NzaTBfYWs0NjQyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJzcmNfY2FyZF9vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxyc3JjLWNhcmQsbGFnZXIiLAkuZGF0YSA9ICZyb3V0ZXNfb2Zfc3NpMF9hazQ2NDIgfSwKLQl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscnNyYy1jYXJkLGtvZWxzY2giLAkuZGF0YSA9ICZyb3V0ZXNfb2Zfc3NpMF9hazQ2NDIgfSwKLQl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscnNyYy1jYXJkIiwgfSwKLQl7fSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByc3JjX2NhcmRfb2ZfbWF0Y2gpOwotCi0jZGVmaW5lIElEWF9DUFUJCTAKLSNkZWZpbmUgSURYX0NPREVDCTEKLXN0cnVjdCByc3JjX2NhcmRfcHJpdiB7Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfY2FyZDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlY19jb25mIGNvZGVjX2NvbmY7Ci0Jc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqZGFpX3Byb3BzOwotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKLQl1MzIgY29udmVydF9yYXRlOwotCXUzMiBjb252ZXJ0X2NoYW5uZWxzOwotfTsKLQotI2RlZmluZSByc3JjX3ByaXZfdG9fZGV2KHByaXYpICgocHJpdiktPnNuZF9jYXJkLmRldikKLSNkZWZpbmUgcnNyY19wcml2X3RvX2xpbmsocHJpdiwgaSkgKChwcml2KS0+c25kX2NhcmQuZGFpX2xpbmsgKyAoaSkpCi0jZGVmaW5lIHJzcmNfcHJpdl90b19wcm9wcyhwcml2LCBpKSAoKHByaXYpLT5kYWlfcHJvcHMgKyAoaSkpCi0KLXN0YXRpYyBpbnQgcnNyY19jYXJkX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCByc3JjX2NhcmRfcHJpdiAqcHJpdiA9CXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydGQtPmNhcmQpOwotCXN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKmRhaV9wcm9wcyA9Ci0JCXJzcmNfcHJpdl90b19wcm9wcyhwcml2LCBydGQtPm51bSk7Ci0KLQlyZXR1cm4gY2xrX3ByZXBhcmVfZW5hYmxlKGRhaV9wcm9wcy0+Y2xrKTsKLX0KLQotc3RhdGljIHZvaWQgcnNyY19jYXJkX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgcnNyY19jYXJkX3ByaXYgKnByaXYgPQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKLQlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpkYWlfcHJvcHMgPQotCQlyc3JjX3ByaXZfdG9fcHJvcHMocHJpdiwgcnRkLT5udW0pOwotCi0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhaV9wcm9wcy0+Y2xrKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyByc3JjX2NhcmRfb3BzID0gewotCS5zdGFydHVwID0gcnNyY19jYXJkX3N0YXJ0dXAsCi0JLnNodXRkb3duID0gcnNyY19jYXJkX3NodXRkb3duLAotfTsKLQotc3RhdGljIGludCByc3JjX2NhcmRfZGFpX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3QgcnNyY19jYXJkX3ByaXYgKnByaXYgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbms7Ci0Jc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqZGFpX3Byb3BzOwotCWludCBudW0gPSBydGQtPm51bTsKLQlpbnQgcmV0OwotCi0JZGFpX2xpbmsJPSByc3JjX3ByaXZfdG9fbGluayhwcml2LCBudW0pOwotCWRhaV9wcm9wcwk9IHJzcmNfcHJpdl90b19wcm9wcyhwcml2LCBudW0pOwotCWRhaQkJPSBkYWlfbGluay0+ZHluYW1pYyA/Ci0JCQkJcnRkLT5jcHVfZGFpIDoKLQkJCQlydGQtPmNvZGVjX2RhaTsKLQotCWlmIChkYWlfcHJvcHMtPnN5c2NsaykgewotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGRhaSwgMCwgZGFpX3Byb3BzLT5zeXNjbGssIDApOwotCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PVFNVUFApIHsKLQkJCWRldl9lcnIoZGFpLT5kZXYsICJzZXRfc3lzY2xrIGVycm9yXG4iKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotCi0JaWYgKGRhaV9wcm9wcy0+c2xvdHMpIHsKLQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3RkbV9zbG90KGRhaSwKLQkJCQkJICAgICAgIGRhaV9wcm9wcy0+dHhfc2xvdF9tYXNrLAotCQkJCQkgICAgICAgZGFpX3Byb3BzLT5yeF9zbG90X21hc2ssCi0JCQkJCSAgICAgICBkYWlfcHJvcHMtPnNsb3RzLAotCQkJCQkgICAgICAgZGFpX3Byb3BzLT5zbG90X3dpZHRoKTsKLQkJaWYgKHJldCAmJiByZXQgIT0gLUVOT1RTVVBQKSB7Ci0JCQlkZXZfZXJyKGRhaS0+ZGV2LCAic2V0X3RkbV9zbG90IGVycm9yXG4iKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotCi0JcmV0ID0gMDsKLQotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcnNyY19jYXJkX2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAotCQkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3QgcnNyY19jYXJkX3ByaXYgKnByaXYgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAotCQkJCQkJICAgICAgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOwotCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKmNoYW5uZWxzID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAotCQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKLQotCWlmIChwcml2LT5jb252ZXJ0X3JhdGUpCi0JCXJhdGUtPm1pbiA9Ci0JCXJhdGUtPm1heCA9IHByaXYtPmNvbnZlcnRfcmF0ZTsKLQotCWlmIChwcml2LT5jb252ZXJ0X2NoYW5uZWxzKQotCQljaGFubmVscy0+bWluID0KLQkJY2hhbm5lbHMtPm1heCA9IHByaXYtPmNvbnZlcnRfY2hhbm5lbHM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByc3JjX2NhcmRfcGFyc2VfbGlua3Moc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkgc3RydWN0IHJzcmNfY2FyZF9wcml2ICpwcml2LAotCQkJCSBpbnQgaWR4LCBib29sIGlzX2ZlKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzcmNfcHJpdl90b19kZXYocHJpdik7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gcnNyY19wcml2X3RvX2xpbmsocHJpdiwgaWR4KTsKLQlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpkYWlfcHJvcHMgPSByc3JjX3ByaXZfdG9fcHJvcHMocHJpdiwgaWR4KTsKLQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzIGFyZ3M7Ci0JaW50IHJldDsKLQotCS8qCi0JICogR2V0IG5vZGUgdmlhICJzb3VuZC1kYWkgPSA8JnBoYW5kbGUgcG9ydD4iCi0JICogaXQgd2lsbCBiZSB1c2VkIGFzIHh4eF9vZl9ub2RlIG9uIHNvY19iaW5kX2RhaV9saW5rKCkKLQkgKi8KLQlyZXQgPSBvZl9wYXJzZV9waGFuZGxlX3dpdGhfYXJncyhucCwgInNvdW5kLWRhaSIsCi0JCQkJCSAiI3NvdW5kLWRhaS1jZWxscyIsIDAsICZhcmdzKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogUGFyc2UgVERNIHNsb3QgKi8KLQlyZXQgPSBzbmRfc29jX29mX3BhcnNlX3RkbV9zbG90KG5wLAotCQkJCQkmZGFpX3Byb3BzLT50eF9zbG90X21hc2ssCi0JCQkJCSZkYWlfcHJvcHMtPnJ4X3Nsb3RfbWFzaywKLQkJCQkJJmRhaV9wcm9wcy0+c2xvdHMsCi0JCQkJCSZkYWlfcHJvcHMtPnNsb3Rfd2lkdGgpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoaXNfZmUpIHsKLQkJLyogQkUgaXMgZHVtbXkgKi8KLQkJZGFpX2xpbmstPmNvZGVjX29mX25vZGUJCT0gTlVMTDsKLQkJZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lCT0gInNuZC1zb2MtZHVtbXktZGFpIjsKLQkJZGFpX2xpbmstPmNvZGVjX25hbWUJCT0gInNuZC1zb2MtZHVtbXkiOwotCi0JCS8qIEZFIHNldHRpbmdzICovCi0JCWRhaV9saW5rLT5keW5hbWljCQk9IDE7Ci0JCWRhaV9saW5rLT5kcGNtX21lcmdlZF9mb3JtYXQJPSAxOwotCQlkYWlfbGluay0+Y3B1X29mX25vZGUJCT0gYXJncy5ucDsKLQkJcmV0ID0gc25kX3NvY19vZl9nZXRfZGFpX25hbWUobnAsICZkYWlfbGluay0+Y3B1X2RhaV9uYW1lKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCi0JCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfc2V0X2RhaWxpbmtfbmFtZShkZXYsIGRhaV9saW5rLAotCQkJCQkJCSJmZS4lcyIsCi0JCQkJCQkJZGFpX2xpbmstPmNwdV9kYWlfbmFtZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQotCQkvKgotCQkgKiBJbiBzb2NfYmluZF9kYWlfbGluaygpIHdpbGwgY2hlY2sgY3B1IG5hbWUgYWZ0ZXIKLQkJICogb2Zfbm9kZSBtYXRjaGluZyBpZiBkYWlfbGluayBoYXMgY3B1X2RhaV9uYW1lLgotCQkgKiBidXQsIGl0IHdpbGwgbmV2ZXIgbWF0Y2ggaWYgbmFtZSB3YXMgY3JlYXRlZCBieQotCQkgKiBmbXRfc2luZ2xlX25hbWUoKSByZW1vdmUgY3B1X2RhaV9uYW1lIGlmIGNwdV9hcmdzCi0JCSAqIHdhcyAwLiBTZWU6Ci0JCSAqCWZtdF9zaW5nbGVfbmFtZSgpCi0JCSAqCWZtdF9tdWx0aXBsZV9uYW1lKCkKLQkJICovCi0JCWlmICghYXJncy5hcmdzX2NvdW50KQotCQkJZGFpX2xpbmstPmNwdV9kYWlfbmFtZSA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJY29uc3Qgc3RydWN0IHJzcmNfY2FyZF9vZl9kYXRhICpvZl9kYXRhOwotCi0JCW9mX2RhdGEgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoZGV2KTsKLQotCQkvKiBGRSBpcyBkdW1teSAqLwotCQlkYWlfbGluay0+Y3B1X29mX25vZGUJCT0gTlVMTDsKLQkJZGFpX2xpbmstPmNwdV9kYWlfbmFtZQkJPSAic25kLXNvYy1kdW1teS1kYWkiOwotCQlkYWlfbGluay0+Y3B1X25hbWUJCT0gInNuZC1zb2MtZHVtbXkiOwotCi0JCS8qIEJFIHNldHRpbmdzICovCi0JCWRhaV9saW5rLT5ub19wY20JCT0gMTsKLQkJZGFpX2xpbmstPmJlX2h3X3BhcmFtc19maXh1cAk9IHJzcmNfY2FyZF9iZV9od19wYXJhbXNfZml4dXA7Ci0JCWRhaV9saW5rLT5jb2RlY19vZl9ub2RlCQk9IGFyZ3MubnA7Ci0JCXJldCA9IHNuZF9zb2Nfb2ZfZ2V0X2RhaV9uYW1lKG5wLCAmZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCi0JCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfc2V0X2RhaWxpbmtfbmFtZShkZXYsIGRhaV9saW5rLAotCQkJCQkJCSJiZS4lcyIsCi0JCQkJCQkJZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCi0JCS8qIGFkZGl0aW9uYWwgbmFtZSBwcmVmaXggKi8KLQkJaWYgKG9mX2RhdGEpIHsKLQkJCXByaXYtPmNvZGVjX2NvbmYub2Zfbm9kZSA9IGRhaV9saW5rLT5jb2RlY19vZl9ub2RlOwotCQkJcHJpdi0+Y29kZWNfY29uZi5uYW1lX3ByZWZpeCA9IG9mX2RhdGEtPnByZWZpeDsKLQkJfSBlbHNlIHsKLQkJCXNuZF9zb2Nfb2ZfcGFyc2VfYXVkaW9fcHJlZml4KCZwcml2LT5zbmRfY2FyZCwKLQkJCQkJCSAgICAgICZwcml2LT5jb2RlY19jb25mLAotCQkJCQkJICAgICAgZGFpX2xpbmstPmNvZGVjX29mX25vZGUsCi0JCQkJCQkgICAgICAiYXVkaW8tcHJlZml4Iik7Ci0JCX0KLQl9Ci0KLQkvKiBTaW1wbGUgQ2FyZCBhc3N1bWVzIHBsYXRmb3JtID09IGNwdSAqLwotCWRhaV9saW5rLT5wbGF0Zm9ybV9vZl9ub2RlCT0gZGFpX2xpbmstPmNwdV9vZl9ub2RlOwotCWRhaV9saW5rLT5kcGNtX3BsYXliYWNrCQk9IDE7Ci0JZGFpX2xpbmstPmRwY21fY2FwdHVyZQkJPSAxOwotCWRhaV9saW5rLT5vcHMJCQk9ICZyc3JjX2NhcmRfb3BzOwotCWRhaV9saW5rLT5pbml0CQkJPSByc3JjX2NhcmRfZGFpX2luaXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByc3JjX2NhcmRfcGFyc2VfY2xrKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkgICAgICAgc3RydWN0IHJzcmNfY2FyZF9wcml2ICpwcml2LAotCQkJICAgICAgIGludCBpZHgsIGJvb2wgaXNfZmUpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gcnNyY19wcml2X3RvX2xpbmsocHJpdiwgaWR4KTsKLQlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpkYWlfcHJvcHMgPSByc3JjX3ByaXZfdG9fcHJvcHMocHJpdiwgaWR4KTsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpvZl9ucCA9IGlzX2ZlID8JZGFpX2xpbmstPmNwdV9vZl9ub2RlIDoKLQkJCQkJCWRhaV9saW5rLT5jb2RlY19vZl9ub2RlOwotCXUzMiB2YWw7Ci0KLQkvKgotCSAqIFBhcnNlIGRhaS0+c3lzY2xrIGNvbWUgZnJvbSAiY2xvY2tzID0gPCZ4eHg+IgotCSAqIChpZiBzeXN0ZW0gaGFzIGNvbW1vbiBjbG9jaykKLQkgKiAgb3IgInN5c3RlbS1jbG9jay1mcmVxdWVuY3kgPSA8eHh4PiIKLQkgKiAgb3IgZGV2aWNlJ3MgbW9kdWxlIGNsb2NrLgotCSAqLwotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJjbG9ja3MiKSkgewotCQljbGsgPSBvZl9jbGtfZ2V0KG5wLCAwKTsKLQkJaWYgKElTX0VSUihjbGspKQotCQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKLQotCQlkYWlfcHJvcHMtPnN5c2NsayA9IGNsa19nZXRfcmF0ZShjbGspOwotCQlkYWlfcHJvcHMtPmNsayA9IGNsazsKLQl9IGVsc2UgaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInN5c3RlbS1jbG9jay1mcmVxdWVuY3kiLCAmdmFsKSkgewotCQlkYWlfcHJvcHMtPnN5c2NsayA9IHZhbDsKLQl9IGVsc2UgewotCQljbGsgPSBvZl9jbGtfZ2V0KG9mX25wLCAwKTsKLQkJaWYgKCFJU19FUlIoY2xrKSkKLQkJCWRhaV9wcm9wcy0+c3lzY2xrID0gY2xrX2dldF9yYXRlKGNsayk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnNyY19jYXJkX2RhaV9zdWJfbGlua19vZihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCSAgICAgc3RydWN0IHJzcmNfY2FyZF9wcml2ICpwcml2LAotCQkJCSAgICAgaW50IGlkeCwgYm9vbCBpc19mZSkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc3JjX3ByaXZfdG9fZGV2KHByaXYpOwotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IHJzcmNfcHJpdl90b19saW5rKHByaXYsIGlkeCk7Ci0Jc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqZGFpX3Byb3BzID0gcnNyY19wcml2X3RvX3Byb3BzKHByaXYsIGlkeCk7Ci0JaW50IHJldDsKLQotCXJldCA9IHJzcmNfY2FyZF9wYXJzZV9saW5rcyhucCwgcHJpdiwgaWR4LCBpc19mZSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSByc3JjX2NhcmRfcGFyc2VfY2xrKG5wLCBwcml2LCBpZHgsIGlzX2ZlKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWRldl9kYmcoZGV2LCAiXHQlcyAvICUwNHggLyAlZFxuIiwKLQkJZGFpX2xpbmstPm5hbWUsCi0JCWRhaV9saW5rLT5kYWlfZm10LAotCQlkYWlfcHJvcHMtPnN5c2Nsayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHJzcmNfY2FyZF9kYWlfbGlua19vZihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCi0JCQkJIHN0cnVjdCByc3JjX2NhcmRfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc3JjX3ByaXZfdG9fZGV2KHByaXYpOwotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXVuc2lnbmVkIGludCBkYWlmbXQgPSAwOwotCWludCByZXQsIGk7Ci0JYm9vbCBpc19mZTsKLQotCS8qIGZpbmQgMXN0IGNvZGVjICovCi0JaSA9IDA7Ci0JZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShub2RlLCBucCkgewotCQlkYWlfbGluayA9IHJzcmNfcHJpdl90b19saW5rKHByaXYsIGkpOwotCi0JCWlmIChzdHJjbXAobnAtPm5hbWUsICJjb2RlYyIpID09IDApIHsKLQkJCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfZGFpZm10KGRldiwgbm9kZSwgbnAsCi0JCQkJCQkJICAgIE5VTEwsICZkYWlmbXQpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKLQkJCWJyZWFrOwotCQl9Ci0JCWkrKzsKLQl9Ci0KLQlpID0gMDsKLQlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5vZGUsIG5wKSB7Ci0JCWRhaV9saW5rID0gcnNyY19wcml2X3RvX2xpbmsocHJpdiwgaSk7Ci0JCWRhaV9saW5rLT5kYWlfZm10ID0gZGFpZm10OwotCi0JCWlzX2ZlID0gZmFsc2U7Ci0JCWlmIChzdHJjbXAobnAtPm5hbWUsICJjcHUiKSA9PSAwKQotCQkJaXNfZmUgPSB0cnVlOwotCi0JCXJldCA9IHJzcmNfY2FyZF9kYWlfc3ViX2xpbmtfb2Yobm9kZSwgbnAsIHByaXYsIGksIGlzX2ZlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCQlpKys7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnNyY19jYXJkX3BhcnNlX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKLQkJCSAgICAgIHN0cnVjdCByc3JjX2NhcmRfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQljb25zdCBzdHJ1Y3QgcnNyY19jYXJkX29mX2RhdGEgKm9mX2RhdGEgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoZGV2KTsKLQlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpwcm9wczsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqbGlua3M7Ci0JaW50IHJldDsKLQlpbnQgbnVtOwotCi0JaWYgKCFub2RlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW51bSA9IG9mX2dldF9jaGlsZF9jb3VudChub2RlKTsKLQlwcm9wcyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcHJvcHMpICogbnVtLCBHRlBfS0VSTkVMKTsKLQlsaW5rcyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbGlua3MpICogbnVtLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByb3BzIHx8ICFsaW5rcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcml2LT5kYWlfcHJvcHMJPSBwcm9wczsKLQlwcml2LT5kYWlfbGluawk9IGxpbmtzOwotCi0JLyogSW5pdCBzbmRfc29jX2NhcmQgKi8KLQlwcml2LT5zbmRfY2FyZC5vd25lcgkJCT0gVEhJU19NT0RVTEU7Ci0JcHJpdi0+c25kX2NhcmQuZGV2CQkJPSBkZXY7Ci0JcHJpdi0+c25kX2NhcmQuZGFpX2xpbmsJCQk9IHByaXYtPmRhaV9saW5rOwotCXByaXYtPnNuZF9jYXJkLm51bV9saW5rcwkJPSBudW07Ci0JcHJpdi0+c25kX2NhcmQuY29kZWNfY29uZgkJPSAmcHJpdi0+Y29kZWNfY29uZjsKLQlwcml2LT5zbmRfY2FyZC5udW1fY29uZmlncwkJPSAxOwotCi0JaWYgKG9mX2RhdGEpIHsKLQkJcHJpdi0+c25kX2NhcmQub2ZfZGFwbV9yb3V0ZXMJCT0gb2ZfZGF0YS0+cm91dGVzOwotCQlwcml2LT5zbmRfY2FyZC5udW1fb2ZfZGFwbV9yb3V0ZXMJPSBvZl9kYXRhLT5udW1fcm91dGVzOwotCX0gZWxzZSB7Ci0JCXNuZF9zb2Nfb2ZfcGFyc2VfYXVkaW9fcm91dGluZygmcHJpdi0+c25kX2NhcmQsCi0JCQkJCSAgICAgICAiYXVkaW8tcm91dGluZyIpOwotCX0KLQotCS8qIHNhbXBsaW5nIHJhdGUgY29udmVydCAqLwotCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJjb252ZXJ0LXJhdGUiLCAmcHJpdi0+Y29udmVydF9yYXRlKTsKLQotCS8qIGNoYW5uZWxzIHRyYW5zZmVyICovCi0Jb2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgImNvbnZlcnQtY2hhbm5lbHMiLCAmcHJpdi0+Y29udmVydF9jaGFubmVscyk7Ci0KLQlkZXZfZGJnKGRldiwgIk5ldyByc3JjLWF1ZGlvLWNhcmQ6ICVzXG4iLAotCQlwcml2LT5zbmRfY2FyZC5uYW1lID8gcHJpdi0+c25kX2NhcmQubmFtZSA6ICIiKTsKLQlkZXZfZGJnKGRldiwgIlNSQyA6IGNvbnZlcnRfcmF0ZSAgICAgJWRcbiIsIHByaXYtPmNvbnZlcnRfcmF0ZSk7Ci0JZGV2X2RiZyhkZXYsICJDVFUgOiBjb252ZXJ0X2NoYW5uZWxzICVkXG4iLCBwcml2LT5jb252ZXJ0X2NoYW5uZWxzKTsKLQotCXJldCA9IHJzcmNfY2FyZF9kYWlfbGlua19vZihub2RlLCBwcml2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2FyZF9uYW1lKCZwcml2LT5zbmRfY2FyZCwgImNhcmQtIik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogRGVjcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgZGV2aWNlIG5vZGVzICovCi1zdGF0aWMgaW50IHJzcmNfY2FyZF91bnJlZihzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQotewotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKLQlpbnQgbnVtX2xpbmtzOwotCi0JZm9yIChudW1fbGlua3MgPSAwLCBkYWlfbGluayA9IGNhcmQtPmRhaV9saW5rOwotCSAgICAgbnVtX2xpbmtzIDwgY2FyZC0+bnVtX2xpbmtzOwotCSAgICAgbnVtX2xpbmtzKyssIGRhaV9saW5rKyspIHsKLQkJb2Zfbm9kZV9wdXQoZGFpX2xpbmstPmNwdV9vZl9ub2RlKTsKLQkJb2Zfbm9kZV9wdXQoZGFpX2xpbmstPmNvZGVjX29mX25vZGUpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByc3JjX2NhcmRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgcnNyY19jYXJkX3ByaXYgKnByaXY7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0JaW50IHJldDsKLQotCS8qIEFsbG9jYXRlIHRoZSBwcml2YXRlIGRhdGEgKi8KLQlwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldCA9IHJzcmNfY2FyZF9wYXJzZV9vZihucCwgcHJpdiwgZGV2KTsKLQlpZiAocmV0IDwgMCkgewotCQlpZiAocmV0ICE9IC1FUFJPQkVfREVGRVIpCi0JCQlkZXZfZXJyKGRldiwgInBhcnNlIGVycm9yICVkXG4iLCByZXQpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoJnByaXYtPnNuZF9jYXJkLCBwcml2KTsKLQotCXJldCA9IGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsICZwcml2LT5zbmRfY2FyZCk7Ci0JaWYgKHJldCA+PSAwKQotCQlyZXR1cm4gcmV0OwotZXJyOgotCXJzcmNfY2FyZF91bnJlZigmcHJpdi0+c25kX2NhcmQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByc3JjX2NhcmRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JcmV0dXJuIHJzcmNfY2FyZF91bnJlZihjYXJkKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcnNyY19jYXJkID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInJlbmVzYXMtc3JjLWF1ZGlvLWNhcmQiLAotCQkub2ZfbWF0Y2hfdGFibGUgPSByc3JjX2NhcmRfb2ZfbWF0Y2gsCi0JfSwKLQkucHJvYmUgPSByc3JjX2NhcmRfcHJvYmUsCi0JLnJlbW92ZSA9IHJzcmNfY2FyZF9yZW1vdmUsCi19OwotCi1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJzcmNfY2FyZCk7Ci0KLU1PRFVMRV9BTElBUygicGxhdGZvcm06cmVuZXNhcy1zcmMtYXVkaW8tY2FyZCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJSZW5lc2FzIFNhbXBsaW5nIFJhdGUgQ29udmVydCBTb3VuZCBDYXJkIik7Ci1NT0RVTEVfQVVUSE9SKCJLdW5pbm9yaSBNb3JpbW90byA8a3VuaW5vcmkubW9yaW1vdG8uZ3hAcmVuZXNhcy5jb20+Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvcmNhci9zcmMuYyBiL3NvdW5kL3NvYy9zaC9yY2FyL3NyYy5jCmluZGV4IGUzOWY5MTYuLjk2OWE1MTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9yY2FyL3NyYy5jCisrKyBiL3NvdW5kL3NvYy9zaC9yY2FyL3NyYy5jCkBAIC0yMjYsOCArMjI2LDEyIEBACiAJaWZzY3IgPSAwOwogCWZzcmF0ZSA9IDA7CiAJaWYgKGZpbiAhPSBmb3V0KSB7CisJCXU2NCBuOworCiAJCWlmc2NyID0gMTsKLQkJZnNyYXRlID0gMHgwNDAwMDAwIC8gZm91dCAqIGZpbjsKKwkJbiA9ICh1NjQpMHgwNDAwMDAwICogZmluOworCQlkb19kaXYobiwgZm91dCk7CisJCWZzcmF0ZSA9IG47CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9yY2FyL3NzaS5jIGIvc291bmQvc29jL3NoL3JjYXIvc3NpLmMKaW5kZXggNWY4NDhmMC4uNmNiNmRiMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL3JjYXIvc3NpLmMKKysrIGIvc291bmQvc29jL3NoL3JjYXIvc3NpLmMKQEAgLTkyOCw3ICs5MjgsNyBAQAogCQl9CiAKIAkJb3BzID0gJnJzbmRfc3NpX25vbl9vcHM7Ci0JCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJwaW8tdHJhbnNmZXIiLCBOVUxMKSkKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgInBpby10cmFuc2ZlciIpKQogCQkJb3BzID0gJnJzbmRfc3NpX3Bpb19vcHM7CiAJCWVsc2UKIAkJCW9wcyA9ICZyc25kX3NzaV9kbWFfb3BzOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1hYzk3LmMgYi9zb3VuZC9zb2Mvc29jLWFjOTcuYwppbmRleCBiYzRhNTViLi42YzhiMGIwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWFjOTcuYworKysgYi9zb3VuZC9zb2Mvc29jLWFjOTcuYwpAQCAtMTE2LDcgKzExNiw3IEBACiAJcmV0dXJuIHNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFDOTdfR1BJT19DRkcsIDEgPDwgb2Zmc2V0LCAwKTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgc25kX3NvY19hYzk3X2dwaW9fY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHNuZF9zb2NfYWM5N19ncGlvX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAic25kX3NvY19hYzk3IiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5yZXF1ZXN0CQk9IHNuZF9zb2NfYWM5N19ncGlvX3JlcXVlc3QsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWNvbXByZXNzLmMgYi9zb3VuZC9zb2Mvc29jLWNvbXByZXNzLmMKaW5kZXggZDJkZjQ2Yy4uYmY3YjUyZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1jb21wcmVzcy5jCisrKyBiL3NvdW5kL3NvYy9zb2MtY29tcHJlc3MuYwpAQCAtMTIxLDcgKzEyMSw3IEBACiAKIAkJZHBjbV9iZV9kaXNjb25uZWN0KGZlLCBzdHJlYW0pOwogCQlmZS0+ZHBjbVtzdHJlYW1dLnJ1bnRpbWUgPSBOVUxMOwotCQlnb3RvIGZlX2VycjsKKwkJZ290byBwYXRoX2VycjsKIAl9CiAKIAlkcGNtX2NsZWFyX3BlbmRpbmdfc3RhdGUoZmUsIHN0cmVhbSk7CkBAIC0xMzYsNiArMTM2LDggQEAKIAogCXJldHVybiAwOwogCitwYXRoX2VycjoKKwlkcGNtX3BhdGhfcHV0KCZsaXN0KTsKIGZlX2VycjoKIAlpZiAoZmUtPmRhaV9saW5rLT5jb21wcl9vcHMgJiYgZmUtPmRhaV9saW5rLT5jb21wcl9vcHMtPnNodXRkb3duKQogCQlmZS0+ZGFpX2xpbmstPmNvbXByX29wcy0+c2h1dGRvd24oY3N0cmVhbSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWNvcmUuYyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCmluZGV4IDE2MzY5Y2EuLmMwYmJjZDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtY29yZS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCkBAIC0xMDU2LDcgKzEwNTYsNyBAQAogCWlmICghcnRkLT5wbGF0Zm9ybSkgewogCQlkZXZfZXJyKGNhcmQtPmRldiwgIkFTb0M6IHBsYXRmb3JtICVzIG5vdCByZWdpc3RlcmVkXG4iLAogCQkJZGFpX2xpbmstPnBsYXRmb3JtX25hbWUpOwotCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwkJZ290byBfZXJyX2RlZmVyOwogCX0KIAogCXNvY19hZGRfcGNtX3J1bnRpbWUoY2FyZCwgcnRkKTsKQEAgLTIwODMsMTQgKzIwODMsMTMgQEAKIAkvKiByZW1vdmUgYXV4aWxpYXJ5IGRldmljZXMgKi8KIAlzb2NfcmVtb3ZlX2F1eF9kZXZpY2VzKGNhcmQpOwogCisJc25kX3NvY19kYXBtX2ZyZWUoJmNhcmQtPmRhcG0pOwogCXNvY19jbGVhbnVwX2NhcmRfZGVidWdmcyhjYXJkKTsKIAogCS8qIHJlbW92ZSB0aGUgY2FyZCAqLwogCWlmIChjYXJkLT5yZW1vdmUpCiAJCWNhcmQtPnJlbW92ZShjYXJkKTsKIAotCXNuZF9zb2NfZGFwbV9mcmVlKCZjYXJkLT5kYXBtKTsKLQogCXNuZF9jYXJkX2ZyZWUoY2FyZC0+c25kX2NhcmQpOwogCXJldHVybiAwOwogCkBAIC0zMzMzLDE5ICszMzMyLDYgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl9mcmVlOwogCi0JaWYgKGNvZGVjX2Rydi0+Y29udHJvbHMpIHsKLQkJY29kZWMtPmNvbXBvbmVudC5jb250cm9scyA9IGNvZGVjX2Rydi0+Y29udHJvbHM7Ci0JCWNvZGVjLT5jb21wb25lbnQubnVtX2NvbnRyb2xzID0gY29kZWNfZHJ2LT5udW1fY29udHJvbHM7Ci0JfQotCWlmIChjb2RlY19kcnYtPmRhcG1fd2lkZ2V0cykgewotCQljb2RlYy0+Y29tcG9uZW50LmRhcG1fd2lkZ2V0cyA9IGNvZGVjX2Rydi0+ZGFwbV93aWRnZXRzOwotCQljb2RlYy0+Y29tcG9uZW50Lm51bV9kYXBtX3dpZGdldHMgPSBjb2RlY19kcnYtPm51bV9kYXBtX3dpZGdldHM7Ci0JfQotCWlmIChjb2RlY19kcnYtPmRhcG1fcm91dGVzKSB7Ci0JCWNvZGVjLT5jb21wb25lbnQuZGFwbV9yb3V0ZXMgPSBjb2RlY19kcnYtPmRhcG1fcm91dGVzOwotCQljb2RlYy0+Y29tcG9uZW50Lm51bV9kYXBtX3JvdXRlcyA9IGNvZGVjX2Rydi0+bnVtX2RhcG1fcm91dGVzOwotCX0KLQogCWlmIChjb2RlY19kcnYtPnByb2JlKQogCQljb2RlYy0+Y29tcG9uZW50LnByb2JlID0gc25kX3NvY19jb2RlY19kcnZfcHJvYmU7CiAJaWYgKGNvZGVjX2Rydi0+cmVtb3ZlKQpAQCAtMzczMyw3ICszNzE5LDcgQEAKIAkgKiBTTkRfU09DX0RBSUZNVF9DTE9DS19NQVNLIGFyZWEKIAkgKi8KIAlzbnByaW50Zihwcm9wLCBzaXplb2YocHJvcCksICIlc2NvbnRpbnVvdXMtY2xvY2siLCBwcmVmaXgpOwotCWlmIChvZl9nZXRfcHJvcGVydHkobnAsIHByb3AsIE5VTEwpKQorCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsIHByb3ApKQogCQlmb3JtYXQgfD0gU05EX1NPQ19EQUlGTVRfQ09OVDsKIAllbHNlCiAJCWZvcm1hdCB8PSBTTkRfU09DX0RBSUZNVF9HQVRFRDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtZGFwbS5jIGIvc291bmQvc29jL3NvYy1kYXBtLmMKaW5kZXggODY5OGMyNi4uM2JiZTMyZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1kYXBtLmMKKysrIGIvc291bmQvc29jL3NvYy1kYXBtLmMKQEAgLTgyMyw2ICs4MjMsNyBAQAogCQkJY2FzZSBzbmRfc29jX2RhcG1fc3dpdGNoOgogCQkJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXI6CiAJCQljYXNlIHNuZF9zb2NfZGFwbV9wZ2E6CisJCQljYXNlIHNuZF9zb2NfZGFwbV9vdXRfZHJ2OgogCQkJCXduYW1lX2luX2xvbmdfbmFtZSA9IHRydWU7CiAJCQkJa2NuYW1lX2luX2xvbmdfbmFtZSA9IHRydWU7CiAJCQkJYnJlYWs7CkBAIC0xMTY5LDcgKzExNzAsNyBAQAogICogQGN1c3RvbV9zdG9wX2NvbmRpdGlvbjogKG9wdGlvbmFsKSBhIGZ1bmN0aW9uIG1lYW50IHRvIHN0b3AgdGhlIHdpZGdldCBncmFwaAogICogICAgICAgICAgICAgICAgICAgICAgICAgd2FsayBiYXNlZCBvbiBjdXN0b20gbG9naWMuCiAgKgotICogUXVlcmllcyBEQVBNIGdyYXBoIGFzIHRvIHdoZXRoZXIgYW4gdmFsaWQgYXVkaW8gc3RyZWFtIHBhdGggZXhpc3RzIGZvcgorICogUXVlcmllcyBEQVBNIGdyYXBoIGFzIHRvIHdoZXRoZXIgYSB2YWxpZCBhdWRpbyBzdHJlYW0gcGF0aCBleGlzdHMgZm9yCiAgKiB0aGUgaW5pdGlhbCBzdHJlYW0gc3BlY2lmaWVkIGJ5IG5hbWUuIFRoaXMgdGFrZXMgaW50byBhY2NvdW50CiAgKiBjdXJyZW50IG1peGVyIGFuZCBtdXgga2NvbnRyb2wgc2V0dGluZ3MuIENyZWF0ZXMgbGlzdCBvZiB2YWxpZCB3aWRnZXRzLgogICoKQEAgLTEyOTQsOCArMTI5NSw3IEBACiAJcmV0dXJuIHctPm5ld19wb3dlcjsKIH0KIAotLyogR2VuZXJpYyBjaGVjayB0byBzZWUgaWYgYSB3aWRnZXQgc2hvdWxkIGJlIHBvd2VyZWQuCi0gKi8KKy8qIEdlbmVyaWMgY2hlY2sgdG8gc2VlIGlmIGEgd2lkZ2V0IHNob3VsZCBiZSBwb3dlcmVkLiAqLwogc3RhdGljIGludCBkYXBtX2dlbmVyaWNfY2hlY2tfcG93ZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncpCiB7CiAJaW50IGluLCBvdXQ7CkBAIC0xNjQ2LDcgKzE2NDYsNyBAQAogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZCA9IGRhdGE7CiAJaW50IHJldDsKIAotCS8qIElmIHdlJ3JlIG9mZiBhbmQgd2UncmUgbm90IHN1cHBvc2VkIHRvIGJlIGdvIGludG8gU1RBTkRCWSAqLworCS8qIElmIHdlJ3JlIG9mZiBhbmQgd2UncmUgbm90IHN1cHBvc2VkIHRvIGdvIGludG8gU1RBTkRCWSAqLwogCWlmIChkLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYgJiYKIAkgICAgZC0+dGFyZ2V0X2JpYXNfbGV2ZWwgIT0gU05EX1NPQ19CSUFTX09GRikgewogCQlpZiAoZC0+ZGV2KQpAQCAtMTc5OCw3ICsxNzk4LDcgQEAKICAqIEEgY29tcGxldGUgcGF0aCBpcyBhIHJvdXRlIHRoYXQgaGFzIHZhbGlkIGVuZHBvaW50cyBpLmUuOi0KICAqCiAgKiAgbyBEQUMgdG8gb3V0cHV0IHBpbi4KLSAqICBvIElucHV0IFBpbiB0byBBREMuCisgKiAgbyBJbnB1dCBwaW4gdG8gQURDLgogICogIG8gSW5wdXQgcGluIHRvIE91dHB1dCBwaW4gKGJ5cGFzcywgc2lkZXRvbmUpCiAgKiAgbyBEQUMgdG8gQURDIChsb29wYmFjaykuCiAgKi8KQEAgLTIxMTQsNyArMjExNCw3IEBACiAgKiBzb2NfZGFwbV9jb25uZWN0X3BhdGgoKSAtIENvbm5lY3RzIG9yIGRpc2Nvbm5lY3RzIGEgcGF0aAogICogQHBhdGg6IFRoZSBwYXRoIHRvIHVwZGF0ZQogICogQGNvbm5lY3Q6IFRoZSBuZXcgY29ubmVjdCBzdGF0ZSBvZiB0aGUgcGF0aC4gVHJ1ZSBpZiB0aGUgcGF0aCBpcyBjb25uZWN0ZWQsCi0gKiAgZmFsc2UgaWYgaXQgaXMgZGlzY29ubmV0ZWQuCisgKiAgZmFsc2UgaWYgaXQgaXMgZGlzY29ubmVjdGVkLgogICogQHJlYXNvbjogVGhlIHJlYXNvbiB3aHkgdGhlIHBhdGggY2hhbmdlZCAoZm9yIGRlYnVnZ2luZyBvbmx5KQogICovCiBzdGF0aWMgdm9pZCBzb2NfZGFwbV9jb25uZWN0X3BhdGgoc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoLApAQCAtMjIzMyw3ICsyMjMzLDcgQEAKIAkJaWYgKHctPmRhcG0gIT0gZGFwbSkKIAkJCWNvbnRpbnVlOwogCi0JCS8qIG9ubHkgZGlzcGxheSB3aWRnZXRzIHRoYXQgYnVybm0gcG93ZXIgKi8KKwkJLyogb25seSBkaXNwbGF5IHdpZGdldHMgdGhhdCBidXJuIHBvd2VyICovCiAJCXN3aXRjaCAody0+aWQpIHsKIAkJY2FzZSBzbmRfc29jX2RhcG1faHA6CiAJCWNhc2Ugc25kX3NvY19kYXBtX21pYzoKQEAgLTI0NjEsNyArMjQ2MSw3IEBACiAKIAlzd2l0Y2ggKHctPmlkKSB7CiAJY2FzZSBzbmRfc29jX2RhcG1faW5wdXQ6Ci0JCS8qIE9uIGEgZnVsbHkgcm91dGVkIGNhcmQgYSBpbnB1dCBpcyBuZXZlciBhIHNvdXJjZSAqLworCQkvKiBPbiBhIGZ1bGx5IHJvdXRlZCBjYXJkIGFuIGlucHV0IGlzIG5ldmVyIGEgc291cmNlICovCiAJCWlmICh3LT5kYXBtLT5jYXJkLT5mdWxseV9yb3V0ZWQpCiAJCQlyZXR1cm47CiAJCWVwID0gU05EX1NPQ19EQVBNX0VQX1NPVVJDRTsKQEAgLTMwNDksNiArMzA0OSw5IEBACiAJfQogCW11dGV4X3VubG9jaygmY2FyZC0+ZGFwbV9tdXRleCk7CiAKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJaWYgKGludmVydCkKIAkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtYXggLSB2YWw7CiAJZWxzZQpAQCAtMzIwMCw3ICszMjAzLDcgQEAKIAlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKSB7CiAJCWlmIChpdGVtWzFdID4gZS0+aXRlbXMpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJdmFsIHw9IHNuZF9zb2NfZW51bV9pdGVtX3RvX3ZhbChlLCBpdGVtWzFdKSA8PCBlLT5zaGlmdF9sOworCQl2YWwgfD0gc25kX3NvY19lbnVtX2l0ZW1fdG9fdmFsKGUsIGl0ZW1bMV0pIDw8IGUtPnNoaWZ0X3I7CiAJCW1hc2sgfD0gZS0+bWFzayA8PCBlLT5zaGlmdF9yOwogCX0KIApAQCAtMzQ0NSw3ICszNDQ4LDcgQEAKIAkJdy0+ZW5kcG9pbnRzW2Rpcl0gPSAtMTsKIAl9CiAKLQkvKiBtYWNoaW5lIGxheWVyIHNldCB1cHMgdW5jb25uZWN0ZWQgcGlucyBhbmQgaW5zZXJ0aW9ucyAqLworCS8qIG1hY2hpbmUgbGF5ZXIgc2V0cyB1cCB1bmNvbm5lY3RlZCBwaW5zIGFuZCBpbnNlcnRpb25zICovCiAJdy0+Y29ubmVjdGVkID0gMTsKIAlyZXR1cm4gdzsKIH0KQEAgLTM0OTMsNiArMzQ5Niw3IEBACiAJY29uc3Qgc3RydWN0IHNuZF9zb2NfcGNtX3N0cmVhbSAqY29uZmlnID0gdy0+cGFyYW1zICsgdy0+cGFyYW1zX3NlbGVjdDsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gc3Vic3RyZWFtOwogCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zID0gTlVMTDsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gTlVMTDsKIAl1NjQgZm10OwogCWludCByZXQ7CiAKQEAgLTM1NDEsNiArMzU0NSwxNCBAQAogCiAJbWVtc2V0KCZzdWJzdHJlYW0sIDAsIHNpemVvZihzdWJzdHJlYW0pKTsKIAorCS8qIEFsbG9jYXRlIGEgZHVtbXkgc25kX3BjbV9ydW50aW1lIGZvciBzdGFydHVwKCkgYW5kIG90aGVyIG9wcygpICovCisJcnVudGltZSA9IGt6YWxsb2Moc2l6ZW9mKCpydW50aW1lKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFydW50aW1lKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlzdWJzdHJlYW0ucnVudGltZSA9IHJ1bnRpbWU7CisKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKIAkJc3Vic3RyZWFtLnN0cmVhbSA9IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRTsKQEAgLTM2MDYsNiArMzYxOCw3IEBACiAJfQogCiBvdXQ6CisJa2ZyZWUocnVudGltZSk7CiAJa2ZyZWUocGFyYW1zKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1vcHMuYyBiL3NvdW5kL3NvYy9zb2Mtb3BzLmMKaW5kZXggYTUxM2EzNC4uOWZjMWE3YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1vcHMuYworKysgYi9zb3VuZC9zb2Mvc29jLW9wcy5jCkBAIC03Nyw3ICs3Nyw3IEBACiAJaXRlbSA9IHNuZF9zb2NfZW51bV92YWxfdG9faXRlbShlLCB2YWwpOwogCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBpdGVtOwogCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpIHsKLQkJdmFsID0gKHJlZ192YWwgPj4gZS0+c2hpZnRfbCkgJiBlLT5tYXNrOworCQl2YWwgPSAocmVnX3ZhbCA+PiBlLT5zaGlmdF9yKSAmIGUtPm1hc2s7CiAJCWl0ZW0gPSBzbmRfc29jX2VudW1fdmFsX3RvX2l0ZW0oZSwgdmFsKTsKIAkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA9IGl0ZW07CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1wY20uYyBiL3NvdW5kL3NvYy9zb2MtcGNtLmMKaW5kZXggNjBkNzAyZi4uZDU2YTE2YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1wY20uYworKysgYi9zb3VuZC9zb2Mvc29jLXBjbS5jCkBAIC0xNjk0LDYgKzE2OTQsOSBAQAogCQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gYmVfc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJCWludCBpOwogCisJCWlmIChydGQtPmRhaV9saW5rLT5iZV9od19wYXJhbXNfZml4dXApCisJCQljb250aW51ZTsKKwogCQlpZiAoc29jX3BjbV9oYXNfc3ltbWV0cnkoYmVfc3Vic3RyZWFtKSkKIAkJCWJlX3N1YnN0cmVhbS0+cnVudGltZS0+aHcuaW5mbyB8PSBTTkRSVl9QQ01fSU5GT19KT0lOVF9EVVBMRVg7CiAKQEAgLTE3OTAsNyArMTc5Myw3IEBACiAJCQljb250aW51ZTsKIAogCQlkZXZfZGJnKGJlLT5kZXYsICJBU29DOiBjbG9zZSBCRSAlc1xuIiwKLQkJCWRwY20tPmZlLT5kYWlfbGluay0+bmFtZSk7CisJCQliZS0+ZGFpX2xpbmstPm5hbWUpOwogCiAJCXNvY19wY21fY2xvc2UoYmVfc3Vic3RyZWFtKTsKIAkJYmVfc3Vic3RyZWFtLT5ydW50aW1lID0gTlVMTDsKQEAgLTE4NTYsNyArMTg1OSw3IEBACiAJCQljb250aW51ZTsKIAogCQlkZXZfZGJnKGJlLT5kZXYsICJBU29DOiBod19mcmVlIEJFICVzXG4iLAotCQkJZHBjbS0+ZmUtPmRhaV9saW5rLT5uYW1lKTsKKwkJCWJlLT5kYWlfbGluay0+bmFtZSk7CiAKIAkJc29jX3BjbV9od19mcmVlKGJlX3N1YnN0cmVhbSk7CiAKQEAgLTE5MzQsNyArMTkzNyw3IEBACiAJCQljb250aW51ZTsKIAogCQlkZXZfZGJnKGJlLT5kZXYsICJBU29DOiBod19wYXJhbXMgQkUgJXNcbiIsCi0JCQlkcGNtLT5mZS0+ZGFpX2xpbmstPm5hbWUpOworCQkJYmUtPmRhaV9saW5rLT5uYW1lKTsKIAogCQlyZXQgPSBzb2NfcGNtX2h3X3BhcmFtcyhiZV9zdWJzdHJlYW0sICZkcGNtLT5od19wYXJhbXMpOwogCQlpZiAocmV0IDwgMCkgewpAQCAtMjAxNCw3ICsyMDE3LDcgQEAKIAlpbnQgcmV0OwogCiAJZGV2X2RiZyhkcGNtLT5iZS0+ZGV2LCAiQVNvQzogdHJpZ2dlciBCRSAlcyBjbWQgJWRcbiIsCi0JCQlkcGNtLT5mZS0+ZGFpX2xpbmstPm5hbWUsIGNtZCk7CisJCQlkcGNtLT5iZS0+ZGFpX2xpbmstPm5hbWUsIGNtZCk7CiAKIAlyZXQgPSBzb2NfcGNtX3RyaWdnZXIoc3Vic3RyZWFtLCBjbWQpOwogCWlmIChyZXQgPCAwKQpAQCAtMjIyOSw3ICsyMjMyLDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWRldl9kYmcoYmUtPmRldiwgIkFTb0M6IHByZXBhcmUgQkUgJXNcbiIsCi0JCQlkcGNtLT5mZS0+ZGFpX2xpbmstPm5hbWUpOworCQkJYmUtPmRhaV9saW5rLT5uYW1lKTsKIAogCQlyZXQgPSBzb2NfcGNtX3ByZXBhcmUoYmVfc3Vic3RyZWFtKTsKIAkJaWYgKHJldCA8IDApIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtdG9wb2xvZ3kuYyBiL3NvdW5kL3NvYy9zb2MtdG9wb2xvZ3kuYwppbmRleCBlZTdmMTVhLi42YjA1MDQ3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLXRvcG9sb2d5LmMKKysrIGIvc291bmQvc29jL3NvYy10b3BvbG9neS5jCkBAIC00OCw5ICs0OCwxMCBAQAogI2RlZmluZSBTT0NfVFBMR19QQVNTX1BDTV9EQUkJCTQKICNkZWZpbmUgU09DX1RQTEdfUEFTU19HUkFQSAkJNQogI2RlZmluZSBTT0NfVFBMR19QQVNTX1BJTlMJCTYKKyNkZWZpbmUgU09DX1RQTEdfUEFTU19CRV9EQUkJCTcKIAogI2RlZmluZSBTT0NfVFBMR19QQVNTX1NUQVJUCVNPQ19UUExHX1BBU1NfTUFOSUZFU1QKLSNkZWZpbmUgU09DX1RQTEdfUEFTU19FTkQJU09DX1RQTEdfUEFTU19QSU5TCisjZGVmaW5lIFNPQ19UUExHX1BBU1NfRU5ECVNPQ19UUExHX1BBU1NfQkVfREFJCiAKIHN0cnVjdCBzb2NfdHBsZyB7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKQEAgLTE0NzUsNiArMTQ3Niw3IEBACiAJaWYgKHdpZGdldCA9PSBOVUxMKSB7CiAJCWRldl9lcnIodHBsZy0+ZGV2LCAiQVNvQzogZmFpbGVkIHRvIGNyZWF0ZSB3aWRnZXQgJXMgY29udHJvbHNcbiIsCiAJCQl3LT5uYW1lKTsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBoZHJfZXJyOwogCX0KIApAQCAtMTU1NCw2ICsxNTU2LDI1IEBACiAJc3RyZWFtLT5yYXRlX21pbiA9IGNhcHMtPnJhdGVfbWluOwogCXN0cmVhbS0+cmF0ZV9tYXggPSBjYXBzLT5yYXRlX21heDsKIAlzdHJlYW0tPmZvcm1hdHMgPSBjYXBzLT5mb3JtYXRzOworCXN0cmVhbS0+c2lnX2JpdHMgPSBjYXBzLT5zaWdfYml0czsKK30KKworc3RhdGljIHZvaWQgc2V0X2RhaV9mbGFncyhzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyICpkYWlfZHJ2LAorCQkJICB1bnNpZ25lZCBpbnQgZmxhZ19tYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaWYgKGZsYWdfbWFzayAmIFNORF9TT0NfVFBMR19EQUlfRkxHQklUX1NZTU1FVFJJQ19SQVRFUykKKwkJZGFpX2Rydi0+c3ltbWV0cmljX3JhdGVzID0KKwkJCWZsYWdzICYgU05EX1NPQ19UUExHX0RBSV9GTEdCSVRfU1lNTUVUUklDX1JBVEVTID8gMSA6IDA7CisKKwlpZiAoZmxhZ19tYXNrICYgU05EX1NPQ19UUExHX0RBSV9GTEdCSVRfU1lNTUVUUklDX0NIQU5ORUxTKQorCQlkYWlfZHJ2LT5zeW1tZXRyaWNfY2hhbm5lbHMgPQorCQkJZmxhZ3MgJiBTTkRfU09DX1RQTEdfREFJX0ZMR0JJVF9TWU1NRVRSSUNfQ0hBTk5FTFMgPworCQkJMSA6IDA7CisKKwlpZiAoZmxhZ19tYXNrICYgU05EX1NPQ19UUExHX0RBSV9GTEdCSVRfU1lNTUVUUklDX1NBTVBMRUJJVFMpCisJCWRhaV9kcnYtPnN5bW1ldHJpY19zYW1wbGViaXRzID0KKwkJCWZsYWdzICYgU05EX1NPQ19UUExHX0RBSV9GTEdCSVRfU1lNTUVUUklDX1NBTVBMRUJJVFMgPworCQkJMSA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgc29jX3RwbGdfZGFpX2NyZWF0ZShzdHJ1Y3Qgc29jX3RwbGcgKnRwbGcsCkBAIC0xNjkwLDggKzE3MTEsOTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogKgorICogc29jX3RwbGdfYmVfZGFpX2NvbmZpZyAtIEZpbmQgYW5kIGNvbmZpZ3VyZSBhbiBleGlzdGluZyBCRSBEQUkuCisgKiBAdHBsZzogdG9wb2xvZ3kgY29udGV4dAorICogQGJlOiB0b3BvbG9neSBCRSBEQUkgY29uZmlncy4KKyAqCisgKiBUaGUgQkUgZGFpIHNob3VsZCBhbHJlYWR5IGJlIHJlZ2lzdGVyZWQgYnkgdGhlIHBsYXRmb3JtIGRyaXZlci4gVGhlCisgKiBwbGF0Zm9ybSBkcml2ZXIgc2hvdWxkIHNwZWNpZnkgdGhlIEJFIERBSSBuYW1lIGFuZCBJRCBmb3IgbWF0Y2hpbmcuCisgKi8KK3N0YXRpYyBpbnQgc29jX3RwbGdfYmVfZGFpX2NvbmZpZyhzdHJ1Y3Qgc29jX3RwbGcgKnRwbGcsCisJCQkJICBzdHJ1Y3Qgc25kX3NvY190cGxnX2JlX2RhaSAqYmUpCit7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmtfY29tcG9uZW50IGRhaV9jb21wb25lbnQgPSB7MH07CisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciAqZGFpX2RydjsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fc3RyZWFtICpzdHJlYW07CisJc3RydWN0IHNuZF9zb2NfdHBsZ19zdHJlYW1fY2FwcyAqY2FwczsKKwlpbnQgcmV0OworCisJZGFpX2NvbXBvbmVudC5kYWlfbmFtZSA9IGJlLT5kYWlfbmFtZTsKKwlkYWkgPSBzbmRfc29jX2ZpbmRfZGFpKCZkYWlfY29tcG9uZW50KTsKKwlpZiAoIWRhaSkgeworCQlkZXZfZXJyKHRwbGctPmRldiwgIkFTb0M6IEJFIERBSSAlcyBub3QgcmVnaXN0ZXJlZFxuIiwKKwkJCWJlLT5kYWlfbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChiZS0+ZGFpX2lkICE9IGRhaS0+aWQpIHsKKwkJZGV2X2Vycih0cGxnLT5kZXYsICJBU29DOiBCRSBEQUkgJXMgaWQgbWlzbWF0Y2hcbiIsCisJCQliZS0+ZGFpX25hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYWlfZHJ2ID0gZGFpLT5kcml2ZXI7CisJaWYgKCFkYWlfZHJ2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChiZS0+cGxheWJhY2spIHsKKwkJc3RyZWFtID0gJmRhaV9kcnYtPnBsYXliYWNrOworCQljYXBzID0gJmJlLT5jYXBzW1NORF9TT0NfVFBMR19TVFJFQU1fUExBWUJBQ0tdOworCQlzZXRfc3RyZWFtX2luZm8oc3RyZWFtLCBjYXBzKTsKKwl9CisKKwlpZiAoYmUtPmNhcHR1cmUpIHsKKwkJc3RyZWFtID0gJmRhaV9kcnYtPmNhcHR1cmU7CisJCWNhcHMgPSAmYmUtPmNhcHNbU05EX1NPQ19UUExHX1NUUkVBTV9DQVBUVVJFXTsKKwkJc2V0X3N0cmVhbV9pbmZvKHN0cmVhbSwgY2Fwcyk7CisJfQorCisJaWYgKGJlLT5mbGFnX21hc2spCisJCXNldF9kYWlfZmxhZ3MoZGFpX2RydiwgYmUtPmZsYWdfbWFzaywgYmUtPmZsYWdzKTsKKworCS8qIHBhc3MgY29udHJvbCB0byBjb21wb25lbnQgZHJpdmVyIGZvciBvcHRpb25hbCBmdXJ0aGVyIGluaXQgKi8KKwlyZXQgPSBzb2NfdHBsZ19kYWlfbG9hZCh0cGxnLCBkYWlfZHJ2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHRwbGctPmNvbXAtPmRldiwgIkFTb0M6IERBSSBsb2FkaW5nIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29jX3RwbGdfYmVfZGFpX2VsZW1zX2xvYWQoc3RydWN0IHNvY190cGxnICp0cGxnLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfc29jX3RwbGdfaGRyICpoZHIpCit7CisJc3RydWN0IHNuZF9zb2NfdHBsZ19iZV9kYWkgKmJlOworCWludCBjb3VudCA9IGhkci0+Y291bnQ7CisJaW50IGk7CisKKwlpZiAodHBsZy0+cGFzcyAhPSBTT0NfVFBMR19QQVNTX0JFX0RBSSkKKwkJcmV0dXJuIDA7CisKKwkvKiBjb25maWcgdGhlIGV4aXN0aW5nIEJFIERBSXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQliZSA9IChzdHJ1Y3Qgc25kX3NvY190cGxnX2JlX2RhaSAqKXRwbGctPnBvczsKKwkJaWYgKGJlLT5zaXplICE9IHNpemVvZigqYmUpKSB7CisJCQlkZXZfZXJyKHRwbGctPmRldiwgIkFTb0M6IGludmFsaWQgQkUgREFJIHNpemVcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlzb2NfdHBsZ19iZV9kYWlfY29uZmlnKHRwbGcsIGJlKTsKKwkJdHBsZy0+cG9zICs9IChzaXplb2YoKmJlKSArIGJlLT5wcml2LnNpemUpOworCX0KKworCWRldl9kYmcodHBsZy0+ZGV2LCAiQVNvQzogQ29uZmlndXJlICVkIEJFIERBSXNcbiIsIGNvdW50KTsKKwlyZXR1cm4gMDsKK30KKworCiBzdGF0aWMgaW50IHNvY190cGxnX21hbmlmZXN0X2xvYWQoc3RydWN0IHNvY190cGxnICp0cGxnLAotCXN0cnVjdCBzbmRfc29jX3RwbGdfaGRyICpoZHIpCisJCQkJICBzdHJ1Y3Qgc25kX3NvY190cGxnX2hkciAqaGRyKQogewogCXN0cnVjdCBzbmRfc29jX3RwbGdfbWFuaWZlc3QgKm1hbmlmZXN0OwogCkBAIC0xNzkzLDYgKzE5MDIsOCBAQAogCQlyZXR1cm4gc29jX3RwbGdfZGFwbV93aWRnZXRfZWxlbXNfbG9hZCh0cGxnLCBoZHIpOwogCWNhc2UgU05EX1NPQ19UUExHX1RZUEVfUENNOgogCQlyZXR1cm4gc29jX3RwbGdfcGNtX2VsZW1zX2xvYWQodHBsZywgaGRyKTsKKwljYXNlIFNORF9TT0NfVFBMR19UWVBFX0JFX0RBSToKKwkJcmV0dXJuIHNvY190cGxnX2JlX2RhaV9lbGVtc19sb2FkKHRwbGcsIGhkcik7CiAJY2FzZSBTTkRfU09DX1RQTEdfVFlQRV9NQU5JRkVTVDoKIAkJcmV0dXJuIHNvY190cGxnX21hbmlmZXN0X2xvYWQodHBsZywgaGRyKTsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy11dGlscy5jIGIvc291bmQvc29jL3NvYy11dGlscy5jCmluZGV4IDUzZGQwODUuLjM5M2U4ZjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtdXRpbHMuYworKysgYi9zb3VuZC9zb2Mvc29jLXV0aWxzLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBkdW1teV9kbWFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBkdW1teV9kbWFfb3BzID0gewogCS5vcGVuCQk9IGR1bW15X2RtYV9vcGVuLAogCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKIH07CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc3RpL3N0aV91bmlwZXJpZi5jIGIvc291bmQvc29jL3N0aS9zdGlfdW5pcGVyaWYuYwppbmRleCA0ODhlZjRlLi41NDlmYWMzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc3RpL3N0aV91bmlwZXJpZi5jCisrKyBiL3NvdW5kL3NvYy9zdGkvc3RpX3VuaXBlcmlmLmMKQEAgLTE5LDYgKzE5LDg0IEBACiAjZGVmaW5lIFVOSVBFUklGX01BWF9GUkFNRV9TWiAweDIwCiAjZGVmaW5lIFVOSVBFUklGX0FMTE9XRURfRlJBTUVfU1ogKDB4MDggfCAweDEwIHwgMHgxOCB8IFVOSVBFUklGX01BWF9GUkFNRV9TWikKIAorc3RydWN0IHN0aV91bmlwZXJpcGhfZGV2X2RhdGEgeworCXVuc2lnbmVkIGludCBpZDsgLyogTmIgYXZhaWxhYmxlIHBsYXllciBpbnN0YW5jZXMgKi8KKwl1bnNpZ25lZCBpbnQgdmVyc2lvbjsgLyogcGxheWVyIElQIHZlcnNpb24gKi8KKwl1bnNpZ25lZCBpbnQgc3RyZWFtOworCWNvbnN0IGNoYXIgKmRhaV9uYW1lczsKKwllbnVtIHVuaXBlcmlmX3R5cGUgdHlwZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RpX3VuaXBlcmlwaF9kZXZfZGF0YSBzdGlfdW5pcGxheWVyX2hkbWkgPSB7CisJLmlkID0gMCwKKwkudmVyc2lvbiA9IFNORF9TVF9VTklQRVJJRl9WRVJTSU9OX1VOSV9QTFJfVE9QXzFfMCwKKwkuc3RyZWFtID0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywKKwkuZGFpX25hbWVzID0gIlVuaSBQbGF5ZXIgIzAgKEhETUkpIiwKKwkudHlwZSA9IFNORF9TVF9VTklQRVJJRl9UWVBFX0hETUkKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RpX3VuaXBlcmlwaF9kZXZfZGF0YSBzdGlfdW5pcGxheWVyX3BjbV9vdXQgPSB7CisJLmlkID0gMSwKKwkudmVyc2lvbiA9IFNORF9TVF9VTklQRVJJRl9WRVJTSU9OX1VOSV9QTFJfVE9QXzFfMCwKKwkuc3RyZWFtID0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywKKwkuZGFpX25hbWVzID0gIlVuaSBQbGF5ZXIgIzEgKFBDTSBPVVQpIiwKKwkudHlwZSA9IFNORF9TVF9VTklQRVJJRl9UWVBFX1BDTSB8IFNORF9TVF9VTklQRVJJRl9UWVBFX1RETSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RpX3VuaXBlcmlwaF9kZXZfZGF0YSBzdGlfdW5pcGxheWVyX2RhYyA9IHsKKwkuaWQgPSAyLAorCS52ZXJzaW9uID0gU05EX1NUX1VOSVBFUklGX1ZFUlNJT05fVU5JX1BMUl9UT1BfMV8wLAorCS5zdHJlYW0gPSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAorCS5kYWlfbmFtZXMgPSAiVW5pIFBsYXllciAjMiAoREFDKSIsCisJLnR5cGUgPSBTTkRfU1RfVU5JUEVSSUZfVFlQRV9QQ00sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN0aV91bmlwZXJpcGhfZGV2X2RhdGEgc3RpX3VuaXBsYXllcl9zcGRpZiA9IHsKKwkuaWQgPSAzLAorCS52ZXJzaW9uID0gU05EX1NUX1VOSVBFUklGX1ZFUlNJT05fVU5JX1BMUl9UT1BfMV8wLAorCS5zdHJlYW0gPSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAorCS5kYWlfbmFtZXMgPSAiVW5pIFBsYXllciAjMyAoU1BESUYpIiwKKwkudHlwZSA9IFNORF9TVF9VTklQRVJJRl9UWVBFX1NQRElGCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN0aV91bmlwZXJpcGhfZGV2X2RhdGEgc3RpX3VuaXJlYWRlcl9wY21faW4gPSB7CisJLmlkID0gMCwKKwkudmVyc2lvbiA9IFNORF9TVF9VTklQRVJJRl9WRVJTSU9OX1VOSV9SRFJfMV8wLAorCS5zdHJlYW0gPSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsCisJLmRhaV9uYW1lcyA9ICJVbmkgUmVhZGVyICMwIChQQ00gSU4pIiwKKwkudHlwZSA9IFNORF9TVF9VTklQRVJJRl9UWVBFX1BDTSB8IFNORF9TVF9VTklQRVJJRl9UWVBFX1RETSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RpX3VuaXBlcmlwaF9kZXZfZGF0YSBzdGlfdW5pcmVhZGVyX2hkbWlfaW4gPSB7CisJLmlkID0gMSwKKwkudmVyc2lvbiA9IFNORF9TVF9VTklQRVJJRl9WRVJTSU9OX1VOSV9SRFJfMV8wLAorCS5zdHJlYW0gPSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsCisJLmRhaV9uYW1lcyA9ICJVbmkgUmVhZGVyICMxIChIRE1JIElOKSIsCisJLnR5cGUgPSBTTkRfU1RfVU5JUEVSSUZfVFlQRV9QQ00sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzbmRfc29jX3N0aV9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy11bmktcGxheWVyLWhkbWkiLAorCSAgLmRhdGEgPSAmc3RpX3VuaXBsYXllcl9oZG1pCisJfSwKKwl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MDctdW5pLXBsYXllci1wY20tb3V0IiwKKwkgIC5kYXRhID0gJnN0aV91bmlwbGF5ZXJfcGNtX291dAorCX0sCisJeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LXVuaS1wbGF5ZXItZGFjIiwKKwkgIC5kYXRhID0gJnN0aV91bmlwbGF5ZXJfZGFjCisJfSwKKwl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MDctdW5pLXBsYXllci1zcGRpZiIsCisJICAuZGF0YSA9ICZzdGlfdW5pcGxheWVyX3NwZGlmCisJfSwKKwl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MDctdW5pLXJlYWRlci1wY21faW4iLAorCSAgLmRhdGEgPSAmc3RpX3VuaXJlYWRlcl9wY21faW4KKwl9LAorCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy11bmktcmVhZGVyLWhkbWkiLAorCSAgLmRhdGEgPSAmc3RpX3VuaXJlYWRlcl9oZG1pX2luCisJfSwKKwl7fSwKK307CisKIGludCBzdGlfdW5pcGVyaXBoX3NldF90ZG1fc2xvdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IHR4X21hc2ssCiAJCQkgICAgICAgdW5zaWduZWQgaW50IHJ4X21hc2ssIGludCBzbG90cywKIAkJCSAgICAgICBpbnQgc2xvdF93aWR0aCkKQEAgLTE2Nyw4ICsyNDUsOCBAQAogCQkgKiBVbmlwZXJpcGhlcmFsIGluc3RhbmNlIElECiAJCSAqLwogCQljdHJsID0gJnVuaS0+c25kX2N0cmxzW2ldOwotCQljdHJsLT5pbmRleCA9IHVuaS0+aW5mby0+aWQ7Ci0JCWN0cmwtPmRldmljZSA9IHVuaS0+aW5mby0+aWQ7CisJCWN0cmwtPmluZGV4ID0gdW5pLT5pZDsKKwkJY3RybC0+ZGV2aWNlID0gdW5pLT5pZDsKIAl9CiAKIAlyZXR1cm4gc25kX3NvY19hZGRfZGFpX2NvbnRyb2xzKGRhaSwgdW5pLT5zbmRfY3RybHMsIHVuaS0+bnVtX2N0cmxzKTsKQEAgLTE4Niw3ICsyNjQsNyBAQAogCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSAqZG1hX2RhdGE7CiAJaW50IHRyYW5zZmVyX3NpemU7CiAKLQlpZiAodW5pLT5pbmZvLT50eXBlID09IFNORF9TVF9VTklQRVJJRl9UWVBFX1RETSkKKwlpZiAodW5pLT50eXBlID09IFNORF9TVF9VTklQRVJJRl9UWVBFX1RETSkKIAkJLyogdHJhbnNmZXIgc2l6ZSA9IHVzZXIgZnJhbWUgc2l6ZSAoaW4gMzItYml0cyBGSUZPIGNlbGwpICovCiAJCXRyYW5zZmVyX3NpemUgPSBzbmRfc29jX3BhcmFtc190b19mcmFtZV9zaXplKHBhcmFtcykgLyAzMjsKIAllbHNlCkBAIC0yMzUsNyArMzEzLDcgQEAKIAlzdHJ1Y3QgdW5pcGVyaWYgKnVuaSA9IHByaXYtPmRhaV9kYXRhLnVuaTsKIAlpbnQgcmV0OwogCi0JaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKGRhaS0+ZGV2LT5vZl9ub2RlLCAic3Qsc3RpLXVuaS1wbGF5ZXIiKSkgeworCWlmIChwcml2LT5kYWlfZGF0YS5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewogCQlyZXQgPSB1bmlfcGxheWVyX3Jlc3VtZSh1bmkpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKQEAgLTI1Niw3ICszMzQsNyBAQAogCXN0cnVjdCBzdGlfdW5pcGVyaXBoX2RhaSAqZGFpX2RhdGEgPSAmcHJpdi0+ZGFpX2RhdGE7CiAKIAkvKiBETUEgc2V0dGluZ3MqLwotCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShkYWktPmRldi0+b2Zfbm9kZSwgInN0LHN0aS11bmktcGxheWVyIikpCisJaWYgKHByaXYtPmRhaV9kYXRhLnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQogCQlzbmRfc29jX2RhaV9pbml0X2RtYV9kYXRhKGRhaSwgJmRhaV9kYXRhLT5kbWFfZGF0YSwgTlVMTCk7CiAJZWxzZQogCQlzbmRfc29jX2RhaV9pbml0X2RtYV9kYXRhKGRhaSwgTlVMTCwgJmRhaV9kYXRhLT5kbWFfZGF0YSk7CkBAIC0yODAsMjUgKzM1OCwzMiBAQAogc3RhdGljIGludCBzdGlfdW5pcGVyaXBoX2NwdV9kYWlfb2Yoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAogCQkJCSAgICBzdHJ1Y3Qgc3RpX3VuaXBlcmlwaF9kYXRhICpwcml2KQogewotCWNvbnN0IGNoYXIgKnN0cjsKLQlpbnQgcmV0OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwcml2LT5wZGV2LT5kZXY7CiAJc3RydWN0IHN0aV91bmlwZXJpcGhfZGFpICpkYWlfZGF0YSA9ICZwcml2LT5kYWlfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyICpkYWkgPSBwcml2LT5kYWk7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3N0cmVhbSAqc3RyZWFtOwogCXN0cnVjdCB1bmlwZXJpZiAqdW5pOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOworCWNvbnN0IHN0cnVjdCBzdGlfdW5pcGVyaXBoX2Rldl9kYXRhICpkZXZfZGF0YTsKKwljb25zdCBjaGFyICptb2RlOworCisJLyogUG9wdWxhdGUgZGF0YSBzdHJ1Y3R1cmUgZGVwZW5kaW5nIG9uIGNvbXBhdGliaWxpdHkgKi8KKwlvZl9pZCA9IG9mX21hdGNoX25vZGUoc25kX3NvY19zdGlfbWF0Y2gsIG5vZGUpOworCWlmICghb2ZfaWQtPmRhdGEpIHsKKwkJZGV2X2VycihkZXYsICJkYXRhIGFzc29jaWF0ZWQgdG8gZGV2aWNlIGlzIG1pc3NpbmciKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldl9kYXRhID0gKHN0cnVjdCBzdGlfdW5pcGVyaXBoX2Rldl9kYXRhICopb2ZfaWQtPmRhdGE7CiAKIAl1bmkgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnVuaSksIEdGUF9LRVJORUwpOwogCWlmICghdW5pKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXVuaS0+aWQgPSBkZXZfZGF0YS0+aWQ7CisJdW5pLT52ZXIgPSBkZXZfZGF0YS0+dmVyc2lvbjsKKwogCSpkYWkgPSBzdGlfdW5pcGVyaXBoX2RhaV90ZW1wbGF0ZTsKLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhub2RlLCAiZGFpLW5hbWUiLCAmc3RyKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBkYWkgbmFtZSBtaXNzaW5nLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZGFpLT5uYW1lID0gc3RyOworCWRhaS0+bmFtZSA9IGRldl9kYXRhLT5kYWlfbmFtZXM7CiAKIAkvKiBHZXQgcmVzb3VyY2VzICovCiAJdW5pLT5tZW1fcmVnaW9uID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHByaXYtPnBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKQEAgLTMyMiw5ICs0MDcsMjAgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKLQlkYWlfZGF0YS0+dW5pID0gdW5pOworCXVuaS0+dHlwZSA9IGRldl9kYXRhLT50eXBlOwogCi0JaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5vZGUsICJzdCxzdGktdW5pLXBsYXllciIpKSB7CisJLyogY2hlY2sgaWYgcGxheWVyIHNob3VsZCBiZSBjb25maWd1cmVkIGZvciB0ZG0gKi8KKwlpZiAoZGV2X2RhdGEtPnR5cGUgJiBTTkRfU1RfVU5JUEVSSUZfVFlQRV9URE0pIHsKKwkJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhub2RlLCAic3QsdGRtLW1vZGUiLCAmbW9kZSkpCisJCQl1bmktPnR5cGUgPSBTTkRfU1RfVU5JUEVSSUZfVFlQRV9URE07CisJCWVsc2UKKwkJCXVuaS0+dHlwZSA9IFNORF9TVF9VTklQRVJJRl9UWVBFX1BDTTsKKwl9CisKKwlkYWlfZGF0YS0+dW5pID0gdW5pOworCWRhaV9kYXRhLT5zdHJlYW0gPSBkZXZfZGF0YS0+c3RyZWFtOworCisJaWYgKHByaXYtPmRhaV9kYXRhLnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CiAJCXVuaV9wbGF5ZXJfaW5pdChwcml2LT5wZGV2LCB1bmkpOwogCQlzdHJlYW0gPSAmZGFpLT5wbGF5YmFjazsKIAl9IGVsc2UgewpAQCAtMzc2LDEyICs0NzIsNiBAQAogCQkJCQkgICAgICAgJmRtYWVuZ2luZV9wY21fY29uZmlnLCAwKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc25kX3NvY19zdGlfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInN0LHN0aS11bmktcGxheWVyIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInN0LHN0aS11bmktcmVhZGVyIiwgfSwKLQl7fSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN0aV91bmlwZXJpcGhfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gInN0aS11bmlwZXJpcGgtZGFpIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zdGkvdW5pcGVyaWYuaCBiL3NvdW5kL3NvYy9zdGkvdW5pcGVyaWYuaAppbmRleCBlYjk5MzNjLi4xOTkzYzY1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc3RpL3VuaXBlcmlmLmgKKysrIGIvc291bmQvc29jL3N0aS91bmlwZXJpZi5oCkBAIC0xMjIwLDE2ICsxMjIwLDE2IEBACiAjZGVmaW5lIFVOSVBFUklGX0ZJRk9fRlJBTUVTCQk0ICAvKiBGRE1BIHRyaWdnZXIgbGltaXQgaW4gZnJhbWVzICovCiAKICNkZWZpbmUgVU5JUEVSSUZfVFlQRV9JU19IRE1JKHApIFwKLQkoKHApLT5pbmZvLT50eXBlID09IFNORF9TVF9VTklQRVJJRl9UWVBFX0hETUkpCisJKChwKS0+dHlwZSA9PSBTTkRfU1RfVU5JUEVSSUZfVFlQRV9IRE1JKQogI2RlZmluZSBVTklQRVJJRl9UWVBFX0lTX1BDTShwKSBcCi0JKChwKS0+aW5mby0+dHlwZSA9PSBTTkRfU1RfVU5JUEVSSUZfVFlQRV9QQ00pCisJKChwKS0+dHlwZSA9PSBTTkRfU1RfVU5JUEVSSUZfVFlQRV9QQ00pCiAjZGVmaW5lIFVOSVBFUklGX1RZUEVfSVNfU1BESUYocCkgXAotCSgocCktPmluZm8tPnR5cGUgPT0gU05EX1NUX1VOSVBFUklGX1RZUEVfU1BESUYpCisJKChwKS0+dHlwZSA9PSBTTkRfU1RfVU5JUEVSSUZfVFlQRV9TUERJRikKICNkZWZpbmUgVU5JUEVSSUZfVFlQRV9JU19JRUM5NTgocCkgXAogCShVTklQRVJJRl9UWVBFX0lTX0hETUkocCkgfHwgXAogCQlVTklQRVJJRl9UWVBFX0lTX1NQRElGKHApKQogI2RlZmluZSBVTklQRVJJRl9UWVBFX0lTX1RETShwKSBcCi0JKChwKS0+aW5mby0+dHlwZSA9PSBTTkRfU1RfVU5JUEVSSUZfVFlQRV9URE0pCisJKChwKS0+dHlwZSA9PSBTTkRfU1RfVU5JUEVSSUZfVFlQRV9URE0pCiAKIC8qCiAgKiBVbmlwZXJpcGhlcmFsIElQIHJldmlzaW9ucwpAQCAtMTI0OSwxMSArMTI0OSwxMSBAQAogfTsKIAogZW51bSB1bmlwZXJpZl90eXBlIHsKLQlTTkRfU1RfVU5JUEVSSUZfVFlQRV9OT05FLAotCVNORF9TVF9VTklQRVJJRl9UWVBFX0hETUksCi0JU05EX1NUX1VOSVBFUklGX1RZUEVfUENNLAotCVNORF9TVF9VTklQRVJJRl9UWVBFX1NQRElGLAotCVNORF9TVF9VTklQRVJJRl9UWVBFX1RETQorCVNORF9TVF9VTklQRVJJRl9UWVBFX05PTkUJPSAweDAwLAorCVNORF9TVF9VTklQRVJJRl9UWVBFX0hETUkJPSAweDAxLAorCVNORF9TVF9VTklQRVJJRl9UWVBFX1BDTQk9IDB4MDIsCisJU05EX1NUX1VOSVBFUklGX1RZUEVfU1BESUYJPSAweDA0LAorCVNORF9TVF9VTklQRVJJRl9UWVBFX1RETQk9IDB4MDgKIH07CiAKIGVudW0gdW5pcGVyaWZfc3RhdGUgewpAQCAtMTI3OCwxMiArMTI3OCw2IEBACiAJV09SRF9NQVgKIH07CiAKLXN0cnVjdCB1bmlwZXJpZl9pbmZvIHsKLQlpbnQgaWQ7IC8qIGluc3RhbmNlIHZhbHVlIG9mIHRoZSB1bmlwZXJpcGhlcmFsIElQICovCi0JZW51bSB1bmlwZXJpZl90eXBlIHR5cGU7Ci0JaW50IHVuZGVyZmxvd19lbmFibGVkOwkJLyogVW5kZXJmbG93IHJlY292ZXJ5IG1vZGUgKi8KLX07Ci0KIHN0cnVjdCB1bmlwZXJpZl9pZWM5NThfc2V0dGluZ3MgewogCWVudW0gdW5pcGVyaWZfaWVjOTU4X2VuY29kaW5nX21vZGUgZW5jb2RpbmdfbW9kZTsKIAlzdHJ1Y3Qgc25kX2Flc19pZWM5NTggaWVjOTU4OwpAQCAtMTI5OCw4ICsxMjkyLDEwIEBACiAKIHN0cnVjdCB1bmlwZXJpZiB7CiAJLyogU3lzdGVtIGluZm9ybWF0aW9uICovCi0Jc3RydWN0IHVuaXBlcmlmX2luZm8gKmluZm87CisJZW51bSB1bmlwZXJpZl90eXBlIHR5cGU7CisJaW50IHVuZGVyZmxvd19lbmFibGVkOyAvKiBVbmRlcmZsb3cgcmVjb3ZlcnkgbW9kZSAqLwogCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgaWQ7IC8qIGluc3RhbmNlIHZhbHVlIG9mIHRoZSB1bmlwZXJpcGhlcmFsIElQICovCiAJaW50IHZlcjsgLyogSVAgdmVyc2lvbiwgdXNlZCBieSByZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCiAJc3RydWN0IHJlZ21hcF9maWVsZCAqY2xrX3NlbDsKIAlzdHJ1Y3QgcmVnbWFwX2ZpZWxkICp2YWxpZF9zZWw7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc3RpL3VuaXBlcmlmX3BsYXllci5jIGIvc291bmQvc29jL3N0aS91bmlwZXJpZl9wbGF5ZXIuYwppbmRleCAxYWMyZGIyLi4xYmM4ZWJjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc3RpL3VuaXBlcmlmX3BsYXllci5jCisrKyBiL3NvdW5kL3NvYy9zdGkvdW5pcGVyaWZfcGxheWVyLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCQlkZXZfZXJyKHBsYXllci0+ZGV2LCAiRklGTyB1bmRlcmZsb3cgZXJyb3IgZGV0ZWN0ZWQiKTsKIAogCQkvKiBJbnRlcnJ1cHQgaXMganVzdCBmb3IgaW5mb3JtYXRpb24gd2hlbiB1bmRlcmZsb3cgcmVjb3ZlcnkgKi8KLQkJaWYgKHBsYXllci0+aW5mby0+dW5kZXJmbG93X2VuYWJsZWQpIHsKKwkJaWYgKHBsYXllci0+dW5kZXJmbG93X2VuYWJsZWQpIHsKIAkJCS8qIFVwZGF0ZSBzdGF0ZSB0byB1bmRlcmZsb3cgKi8KIAkJCXBsYXllci0+c3RhdGUgPSBVTklQRVJJRl9TVEFURV9VTkRFUkZMT1c7CiAKQEAgLTEzNCw3ICsxMzQsNyBAQAogCiAJLyogQ2hlY2sgZm9yIHVuZGVyZmxvdyByZWNvdmVyeSBkb25lICovCiAJaWYgKHVubGlrZWx5KHN0YXR1cyAmIFVOSVBFUklGX0lUTV9VTkRFUkZMT1dfUkVDX0RPTkVfTUFTSyhwbGF5ZXIpKSkgewotCQlpZiAoIXBsYXllci0+aW5mby0+dW5kZXJmbG93X2VuYWJsZWQpIHsKKwkJaWYgKCFwbGF5ZXItPnVuZGVyZmxvd19lbmFibGVkKSB7CiAJCQlkZXZfZXJyKHBsYXllci0+ZGV2LCAidW5leHBlY3RlZCBVbmRlcmZsb3cgcmVjb3ZlcmluZyIpOwogCQkJcmV0dXJuIC1FUEVSTTsKIAkJfQpAQCAtNzY0LDcgKzc2NCw3IEBACiAJfQogCiAJLyogQ2FsY3VsYXRlIHRyYW5zZmVyIHNpemUgKGluIGZpZm8gY2VsbHMgYW5kIGJ5dGVzKSBmb3IgZnJhbWUgY291bnQgKi8KLQlpZiAocGxheWVyLT5pbmZvLT50eXBlID09IFNORF9TVF9VTklQRVJJRl9UWVBFX1RETSkgeworCWlmIChwbGF5ZXItPnR5cGUgPT0gU05EX1NUX1VOSVBFUklGX1RZUEVfVERNKSB7CiAJCS8qIHRyYW5zZmVyIHNpemUgPSB1c2VyIGZyYW1lIHNpemUgKGluIDMyIGJpdHMgRklGTyBjZWxsKSAqLwogCQl0cmFuc2Zlcl9zaXplID0KIAkJCXN0aV91bmlwZXJpcGhfZ2V0X3VzZXJfZnJhbWVfc2l6ZShydW50aW1lKSAvIDQ7CkBAIC03OTQsNyArNzk0LDcgQEAKIAlTRVRfVU5JUEVSSUZfQ09ORklHX0RNQV9UUklHX0xJTUlUKHBsYXllciwgdHJpZ2dlcl9saW1pdCk7CiAKIAkvKiBVbmlwZXJpcGhlcmFsIHNldHVwIGRlcGVuZHMgb24gcGxheWVyIHR5cGUgKi8KLQlzd2l0Y2ggKHBsYXllci0+aW5mby0+dHlwZSkgeworCXN3aXRjaCAocGxheWVyLT50eXBlKSB7CiAJY2FzZSBTTkRfU1RfVU5JUEVSSUZfVFlQRV9IRE1JOgogCQlyZXQgPSB1bmlfcGxheWVyX3ByZXBhcmVfaWVjOTU4KHBsYXllciwgcnVudGltZSk7CiAJCWJyZWFrOwpAQCAtODg0LDcgKzg4NCw3IEBACiAJU0VUX1VOSVBFUklGX0lUTV9CU0VUX0ZJRk9fRVJST1IocGxheWVyKTsKIAogCS8qIEVuYWJsZSB1bmRlcmZsb3cgcmVjb3ZlcnkgaW50ZXJydXB0cyAqLwotCWlmIChwbGF5ZXItPmluZm8tPnVuZGVyZmxvd19lbmFibGVkKSB7CisJaWYgKHBsYXllci0+dW5kZXJmbG93X2VuYWJsZWQpIHsKIAkJU0VUX1VOSVBFUklGX0lUTV9CU0VUX1VOREVSRkxPV19SRUNfRE9ORShwbGF5ZXIpOwogCQlTRVRfVU5JUEVSSUZfSVRNX0JTRVRfVU5ERVJGTE9XX1JFQ19GQUlMRUQocGxheWVyKTsKIAl9CkBAIC04OTMsOCArODkzLDEwIEBACiAJU0VUX1VOSVBFUklGX1NPRlRfUlNUX1NPRlRfUlNUKHBsYXllcik7CiAKIAlyZXQgPSByZXNldF9wbGF5ZXIocGxheWVyKTsKLQlpZiAocmV0IDwgMCkKKwlpZiAocmV0IDwgMCkgeworCQljbGtfZGlzYWJsZV91bnByZXBhcmUocGxheWVyLT5jbGspOwogCQlyZXR1cm4gcmV0OworCX0KIAogCS8qCiAJICogRG9lcyBub3QgdXNlIElFQzYxOTM3IGZlYXR1cmVzIG9mIHRoZSB1bmlwZXJpcGhlcmFsIGhhcmR3YXJlLgpAQCAtMTAyMSw4ICsxMDIzLDggQEAKIAlzdHJ1Y3QgcmVnX2ZpZWxkIHJlZ2ZpZWxkWzJdID0gewogCQkvKiBQQ01fQ0xLX1NFTCAqLwogCQlSRUdfRklFTEQoU1lTX0NGR19BVURJT19HTFVFLAotCQkJICA4ICsgcGxheWVyLT5pbmZvLT5pZCwKLQkJCSAgOCArIHBsYXllci0+aW5mby0+aWQpLAorCQkJICA4ICsgcGxheWVyLT5pZCwKKwkJCSAgOCArIHBsYXllci0+aWQpLAogCQkvKiBQQ01QX1ZBTElEX1NFTCAqLwogCQlSRUdfRklFTEQoU1lTX0NGR19BVURJT19HTFVFLCAwLCAxKQogCX07CkBAIC0xMDQwLDYwICsxMDQyLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1bmlfcGxheWVyX3BhcnNlX2R0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCQkgICAgICAgc3RydWN0IHVuaXBlcmlmICpwbGF5ZXIpCi17Ci0Jc3RydWN0IHVuaXBlcmlmX2luZm8gKmluZm87Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7Ci0JY29uc3QgY2hhciAqbW9kZTsKLQotCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGluZm8gc3RydWN0dXJlICovCi0JaW5mbyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghaW5mbykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIocG5vZGUsICJzdCx2ZXJzaW9uIiwgJnBsYXllci0+dmVyKSB8fAotCSAgICBwbGF5ZXItPnZlciA9PSBTTkRfU1RfVU5JUEVSSUZfVkVSU0lPTl9VTktOT1dOKSB7Ci0JCWRldl9lcnIoZGV2LCAiVW5rbm93biB1bmlwZXJpcGhlcmFsIHZlcnNpb24gIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQkvKiBVbmRlcmZsb3cgcmVjb3ZlcnkgaXMgb25seSBzdXBwb3J0ZWQgb24gbGF0ZXIgaXAgcmV2aXNpb25zICovCi0JaWYgKHBsYXllci0+dmVyID49IFNORF9TVF9VTklQRVJJRl9WRVJTSU9OX1VOSV9QTFJfVE9QXzFfMCkKLQkJaW5mby0+dW5kZXJmbG93X2VuYWJsZWQgPSAxOwotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBub2RlLCAic3QsdW5pcGVyaXBoLWlkIiwgJmluZm8tPmlkKSkgewotCQlkZXZfZXJyKGRldiwgInVuaXBlcmlwaGVyYWwgaWQgbm90IGRlZmluZWQiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogUmVhZCB0aGUgZGV2aWNlIG1vZGUgcHJvcGVydHkgKi8KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcocG5vZGUsICJzdCxtb2RlIiwgJm1vZGUpKSB7Ci0JCWRldl9lcnIoZGV2LCAidW5pcGVyaXBoZXJhbCBtb2RlIG5vdCBkZWZpbmVkIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChzdHJjYXNlY21wKG1vZGUsICJoZG1pIikgPT0gMCkKLQkJaW5mby0+dHlwZSA9IFNORF9TVF9VTklQRVJJRl9UWVBFX0hETUk7Ci0JZWxzZSBpZiAoc3RyY2FzZWNtcChtb2RlLCAicGNtIikgPT0gMCkKLQkJaW5mby0+dHlwZSA9IFNORF9TVF9VTklQRVJJRl9UWVBFX1BDTTsKLQllbHNlIGlmIChzdHJjYXNlY21wKG1vZGUsICJzcGRpZiIpID09IDApCi0JCWluZm8tPnR5cGUgPSBTTkRfU1RfVU5JUEVSSUZfVFlQRV9TUERJRjsKLQllbHNlIGlmIChzdHJjYXNlY21wKG1vZGUsICJ0ZG0iKSA9PSAwKQotCQlpbmZvLT50eXBlID0gU05EX1NUX1VOSVBFUklGX1RZUEVfVERNOwotCWVsc2UKLQkJaW5mby0+dHlwZSA9IFNORF9TVF9VTklQRVJJRl9UWVBFX05PTkU7Ci0KLQkvKiBTYXZlIHRoZSBpbmZvIHN0cnVjdHVyZSAqLwotCXBsYXllci0+aW5mbyA9IGluZm87Ci0KLQkvKiBHZXQgUENNX0NMS19TRUwgJiBQQ01QX1ZBTElEX1NFTCBmcm9tIGF1ZGlvLWdsdWUtY3RybCBTb0MgcmVnICovCi0JaWYgKHVuaV9wbGF5ZXJfcGFyc2VfZHRfYXVkaW9fZ2x1ZShwZGV2LCBwbGF5ZXIpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFpX29wcyB1bmlfcGxheWVyX2RhaV9vcHMgPSB7CiAJCS5zdGFydHVwID0gdW5pX3BsYXllcl9zdGFydHVwLAogCQkuc2h1dGRvd24gPSB1bmlfcGxheWVyX3NodXRkb3duLApAQCAtMTExNCwxMyArMTA2MiwxOCBAQAogCXBsYXllci0+c3RhdGUgPSBVTklQRVJJRl9TVEFURV9TVE9QUEVEOwogCXBsYXllci0+ZGFpX29wcyA9ICZ1bmlfcGxheWVyX2RhaV9vcHM7CiAKLQlyZXQgPSB1bmlfcGxheWVyX3BhcnNlX2R0KHBkZXYsIHBsYXllcik7CisJLyogR2V0IFBDTV9DTEtfU0VMICYgUENNUF9WQUxJRF9TRUwgZnJvbSBhdWRpby1nbHVlLWN0cmwgU29DIHJlZyAqLworCXJldCA9IHVuaV9wbGF5ZXJfcGFyc2VfZHRfYXVkaW9fZ2x1ZShwZGV2LCBwbGF5ZXIpOwogCiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihwbGF5ZXItPmRldiwgIkZhaWxlZCB0byBwYXJzZSBEZXZpY2VUcmVlIik7CiAJCXJldHVybiByZXQ7CiAJfQogCisJLyogVW5kZXJmbG93IHJlY292ZXJ5IGlzIG9ubHkgc3VwcG9ydGVkIG9uIGxhdGVyIGlwIHJldmlzaW9ucyAqLworCWlmIChwbGF5ZXItPnZlciA+PSBTTkRfU1RfVU5JUEVSSUZfVkVSU0lPTl9VTklfUExSX1RPUF8xXzApCisJCXBsYXllci0+dW5kZXJmbG93X2VuYWJsZWQgPSAxOworCiAJaWYgKFVOSVBFUklGX1RZUEVfSVNfVERNKHBsYXllcikpCiAJCXBsYXllci0+aHcgPSAmdW5pX3RkbV9odzsKIAllbHNlCkBAIC0xMTQ0LDggKzEwOTcsOCBAQAogCiAJLyogY29ubmVjdCB0byBJMlMvVERNIFRYIGJ1cyAqLwogCWlmIChwbGF5ZXItPnZhbGlkX3NlbCAmJgotCSAgICAocGxheWVyLT5pbmZvLT5pZCA9PSBVTklQRVJJRl9QTEFZRVJfSTJTX09VVCkpIHsKLQkJcmV0ID0gcmVnbWFwX2ZpZWxkX3dyaXRlKHBsYXllci0+dmFsaWRfc2VsLCBwbGF5ZXItPmluZm8tPmlkKTsKKwkgICAgKHBsYXllci0+aWQgPT0gVU5JUEVSSUZfUExBWUVSX0kyU19PVVQpKSB7CisJCXJldCA9IHJlZ21hcF9maWVsZF93cml0ZShwbGF5ZXItPnZhbGlkX3NlbCwgcGxheWVyLT5pZCk7CiAJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIocGxheWVyLT5kZXYsCiAJCQkJIiVzOiB1bmFibGUgdG8gY29ubmVjdCB0byB0ZG0gYnVzIiwgX19mdW5jX18pOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3N0aS91bmlwZXJpZl9yZWFkZXIuYyBiL3NvdW5kL3NvYy9zdGkvdW5pcGVyaWZfcmVhZGVyLmMKaW5kZXggZWI3NGEzMi4uMGUxYzNlZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3N0aS91bmlwZXJpZl9yZWFkZXIuYworKysgYi9zb3VuZC9zb2Mvc3RpL3VuaXBlcmlmX3JlYWRlci5jCkBAIC0xMyw2ICsxMyw3IEBACiAKICNpbmNsdWRlICJ1bmlwZXJpZi5oIgogCisjZGVmaW5lIFVOSVBFUklGX1JFQURFUl9JMlNfSU4gMCAvKiByZWFkZXIgaWQgY29ubmVjdGVkIHRvIEkyUy9URE0gVFggYnVzICovCiAvKgogICogTm90ZTogc25kX3BjbV9oYXJkd2FyZSBpcyBsaW5rZWQgdG8gRE1BIGNvbnRyb2xsZXIgYnV0IGlzIGRlY2xhcmVkIGhlcmUgdG8KICAqIGludGVncmF0ZSB1bmlyZWFkZXIgY2FwYWJpbGl0eSBpbiB0ZXJtIG9mIHJhdGUgYW5kIHN1cHBvcnRlZCBjaGFubmVscwpAQCAtMTk1LDcgKzE5Niw3IEBACiAJfQogCiAJLyogQ2FsY3VsYXRlIHRyYW5zZmVyIHNpemUgKGluIGZpZm8gY2VsbHMgYW5kIGJ5dGVzKSBmb3IgZnJhbWUgY291bnQgKi8KLQlpZiAocmVhZGVyLT5pbmZvLT50eXBlID09IFNORF9TVF9VTklQRVJJRl9UWVBFX1RETSkgeworCWlmIChyZWFkZXItPnR5cGUgPT0gU05EX1NUX1VOSVBFUklGX1RZUEVfVERNKSB7CiAJCS8qIHRyYW5zZmVyIHNpemUgPSB1bmlwIGZyYW1lIHNpemUgKGluIDMyIGJpdHMgRklGTyBjZWxsKSAqLwogCQl0cmFuc2Zlcl9zaXplID0KIAkJCXN0aV91bmlwZXJpcGhfZ2V0X3VzZXJfZnJhbWVfc2l6ZShydW50aW1lKSAvIDQ7CkBAIC0yODAsNyArMjgxLDcgQEAKIAlTRVRfVU5JUEVSSUZfSVRNX0JTRVRfTUVNX0JMS19SRUFEKHJlYWRlcik7CiAKIAkvKiBFbmFibGUgdW5kZXJmbG93IHJlY292ZXJ5IGludGVycnVwdHMgKi8KLQlpZiAocmVhZGVyLT5pbmZvLT51bmRlcmZsb3dfZW5hYmxlZCkgeworCWlmIChyZWFkZXItPnVuZGVyZmxvd19lbmFibGVkKSB7CiAJCVNFVF9VTklQRVJJRl9JVE1fQlNFVF9VTkRFUkZMT1dfUkVDX0RPTkUocmVhZGVyKTsKIAkJU0VUX1VOSVBFUklGX0lUTV9CU0VUX1VOREVSRkxPV19SRUNfRkFJTEVEKHJlYWRlcik7CiAJfQpAQCAtMzk0LDQxICszOTUsNiBAQAogCX0KIH0KIAotc3RhdGljIGludCB1bmlfcmVhZGVyX3BhcnNlX2R0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCQkgICAgICAgc3RydWN0IHVuaXBlcmlmICpyZWFkZXIpCi17Ci0Jc3RydWN0IHVuaXBlcmlmX2luZm8gKmluZm87Ci0Jc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7Ci0JY29uc3QgY2hhciAqbW9kZTsKLQotCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGluZm8gc3RydWN0dXJlICovCi0JaW5mbyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWluZm8pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJzdCx2ZXJzaW9uIiwgJnJlYWRlci0+dmVyKSB8fAotCSAgICByZWFkZXItPnZlciA9PSBTTkRfU1RfVU5JUEVSSUZfVkVSU0lPTl9VTktOT1dOKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVua25vd24gdW5pcGVyaXBoZXJhbCB2ZXJzaW9uICIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBSZWFkIHRoZSBkZXZpY2UgbW9kZSBwcm9wZXJ0eSAqLwotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhub2RlLCAic3QsbW9kZSIsICZtb2RlKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmlwZXJpcGhlcmFsIG1vZGUgbm90IGRlZmluZWQiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHN0cmNhc2VjbXAobW9kZSwgInRkbSIpID09IDApCi0JCWluZm8tPnR5cGUgPSBTTkRfU1RfVU5JUEVSSUZfVFlQRV9URE07Ci0JZWxzZQotCQlpbmZvLT50eXBlID0gU05EX1NUX1VOSVBFUklGX1RZUEVfUENNOwotCi0JLyogU2F2ZSB0aGUgaW5mbyBzdHJ1Y3R1cmUgKi8KLQlyZWFkZXItPmluZm8gPSBpbmZvOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHVuaV9yZWFkZXJfZGFpX29wcyA9IHsKIAkJLnN0YXJ0dXAgPSB1bmlfcmVhZGVyX3N0YXJ0dXAsCiAJCS5zaHV0ZG93biA9IHVuaV9yZWFkZXJfc2h1dGRvd24sCkBAIC00NDgsMTIgKzQxNCw2IEBACiAJcmVhZGVyLT5zdGF0ZSA9IFVOSVBFUklGX1NUQVRFX1NUT1BQRUQ7CiAJcmVhZGVyLT5kYWlfb3BzID0gJnVuaV9yZWFkZXJfZGFpX29wczsKIAotCXJldCA9IHVuaV9yZWFkZXJfcGFyc2VfZHQocGRldiwgcmVhZGVyKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHJlYWRlci0+ZGV2LCAiRmFpbGVkIHRvIHBhcnNlIERldmljZVRyZWUiKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlpZiAoVU5JUEVSSUZfVFlQRV9JU19URE0ocmVhZGVyKSkKIAkJcmVhZGVyLT5odyA9ICZ1bmlfdGRtX2h3OwogCWVsc2UKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zdW54aS9LY29uZmlnIGIvc291bmQvc29jL3N1bnhpL0tjb25maWcKaW5kZXggMmE5NTRiZC4uZGQyMzY4MiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3N1bnhpL0tjb25maWcKKysrIGIvc291bmQvc29jL3N1bnhpL0tjb25maWcKQEAgLTEsNCArMSw1IEBACiBtZW51ICJBbGx3aW5uZXIgU29DIEF1ZGlvIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX1NVTlhJIHx8IENPTVBJTEVfVEVTVAogCiBjb25maWcgU05EX1NVTjRJX0NPREVDCiAJdHJpc3RhdGUgIkFsbHdpbm5lciBBMTAgQ29kZWMgU3VwcG9ydCIKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zdW54aS9zdW40aS1jb2RlYy5jIGIvc291bmQvc29jL3N1bnhpL3N1bjRpLWNvZGVjLmMKaW5kZXggNDRmMTcwYy4uZTA0N2VjMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3N1bnhpL3N1bjRpLWNvZGVjLmMKKysrIGIvc291bmQvc29jL3N1bnhpL3N1bjRpLWNvZGVjLmMKQEAgLTk2LDggKzk2LDggQEAKIC8qIE90aGVyIHZhcmlvdXMgQURDIHJlZ2lzdGVycyAqLwogI2RlZmluZSBTVU40SV9DT0RFQ19EQUNfVFhDTlQJCQkoMHgzMCkKICNkZWZpbmUgU1VONElfQ09ERUNfQURDX1JYQ05UCQkJKDB4MzQpCi0jZGVmaW5lIFNVTjRJX0NPREVDX0FDX1NZU19WRVJJCQkJKDB4MzgpCi0jZGVmaW5lIFNVTjRJX0NPREVDX0FDX01JQ19QSE9ORV9DQUwJCSgweDNjKQorI2RlZmluZSBTVU43SV9DT0RFQ19BQ19EQUNfQ0FMCQkJKDB4MzgpCisjZGVmaW5lIFNVTjdJX0NPREVDX0FDX01JQ19QSE9ORV9DQUwJCSgweDNjKQogCiBzdHJ1Y3Qgc3VuNGlfY29kZWMgewogCXN0cnVjdCBkZXZpY2UJKmRldjsKQEAgLTUwOSw3ICs1MDksNyBAQAogCiBzdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoc3VuNGlfY29kZWNfcGFfdm9sdW1lX3NjYWxlLCAtNjMwMCwgMTAwLCAxKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHN1bjRpX2NvZGVjX3dpZGdldHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdW40aV9jb2RlY19jb250cm9sc1tdID0gewogCVNPQ19TSU5HTEVfVExWKCJQb3dlciBBbXBsaWZpZXIgVm9sdW1lIiwgU1VONElfQ09ERUNfREFDX0FDVEwsCiAJCSAgICAgICBTVU40SV9DT0RFQ19EQUNfQUNUTF9QQV9WT0wsIDB4M0YsIDAsCiAJCSAgICAgICBzdW40aV9jb2RlY19wYV92b2x1bWVfc2NhbGUpLApAQCAtNjI4LDEyICs2MjgsMTQgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc3VuNGlfY29kZWNfY29kZWMgPSB7Ci0JLmNvbnRyb2xzCQk9IHN1bjRpX2NvZGVjX3dpZGdldHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHN1bjRpX2NvZGVjX3dpZGdldHMpLAotCS5kYXBtX3dpZGdldHMJCT0gc3VuNGlfY29kZWNfY29kZWNfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShzdW40aV9jb2RlY19jb2RlY19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBzdW40aV9jb2RlY19jb2RlY19kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShzdW40aV9jb2RlY19jb2RlY19kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBzdW40aV9jb2RlY19jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHN1bjRpX2NvZGVjX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBzdW40aV9jb2RlY19jb2RlY19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShzdW40aV9jb2RlY19jb2RlY19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gc3VuNGlfY29kZWNfY29kZWNfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHN1bjRpX2NvZGVjX2NvZGVjX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgc3VuNGlfY29kZWNfY29tcG9uZW50ID0gewpAQCAtNjgwLDEyICs2ODIsMzcgQEAKIAkucmVnX2JpdHMJPSAzMiwKIAkucmVnX3N0cmlkZQk9IDQsCiAJLnZhbF9iaXRzCT0gMzIsCi0JLm1heF9yZWdpc3Rlcgk9IFNVTjRJX0NPREVDX0FDX01JQ19QSE9ORV9DQUwsCisJLm1heF9yZWdpc3Rlcgk9IFNVTjRJX0NPREVDX0FEQ19SWENOVCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzdW43aV9jb2RlY19yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cwk9IDMyLAorCS5yZWdfc3RyaWRlCT0gNCwKKwkudmFsX2JpdHMJPSAzMiwKKwkubWF4X3JlZ2lzdGVyCT0gU1VON0lfQ09ERUNfQUNfTUlDX1BIT05FX0NBTCwKK307CisKK3N0cnVjdCBzdW40aV9jb2RlY19xdWlya3MgeworCWNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpyZWdtYXBfY29uZmlnOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdW40aV9jb2RlY19xdWlya3Mgc3VuNGlfY29kZWNfcXVpcmtzID0geworCS5yZWdtYXBfY29uZmlnID0gJnN1bjRpX2NvZGVjX3JlZ21hcF9jb25maWcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN1bjRpX2NvZGVjX3F1aXJrcyBzdW43aV9jb2RlY19xdWlya3MgPSB7CisJLnJlZ21hcF9jb25maWcgPSAmc3VuN2lfY29kZWNfcmVnbWFwX2NvbmZpZywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bjRpX2NvZGVjX29mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLWNvZGVjIiB9LAotCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjdpLWEyMC1jb2RlYyIgfSwKKwl7CisJCS5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtY29kZWMiLAorCQkuZGF0YSA9ICZzdW40aV9jb2RlY19xdWlya3MsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW43aS1hMjAtY29kZWMiLAorCQkuZGF0YSA9ICZzdW43aV9jb2RlY19xdWlya3MsCisJfSwKIAl7fQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN1bjRpX2NvZGVjX29mX21hdGNoKTsKQEAgLTc1OCw2ICs3ODUsNyBAQAogewogCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHN1bjRpX2NvZGVjICpzY29kZWM7CisJY29uc3Qgc3RydWN0IHN1bjRpX2NvZGVjX3F1aXJrcyAqcXVpcmtzOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXZvaWQgX19pb21lbSAqYmFzZTsKIAlpbnQgcmV0OwpAQCAtNzc1LDggKzgwMywxNCBAQAogCQlyZXR1cm4gUFRSX0VSUihiYXNlKTsKIAl9CiAKKwlxdWlya3MgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoJnBkZXYtPmRldik7CisJaWYgKHF1aXJrcyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBkZXRlcm1pbmUgdGhlIHF1aXJrcyB0byB1c2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAlzY29kZWMtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfbW1pbygmcGRldi0+ZGV2LCBiYXNlLAotCQkJCQkgICAgICZzdW40aV9jb2RlY19yZWdtYXBfY29uZmlnKTsKKwkJCQkJICAgICAgIHF1aXJrcy0+cmVnbWFwX2NvbmZpZyk7CiAJaWYgKElTX0VSUihzY29kZWMtPnJlZ21hcCkpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBvdXIgcmVnbWFwXG4iKTsKIAkJcmV0dXJuIFBUUl9FUlIoc2NvZGVjLT5yZWdtYXApOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3N1bnhpL3N1bjRpLXNwZGlmLmMgYi9zb3VuZC9zb2Mvc3VueGkvc3VuNGktc3BkaWYuYwppbmRleCAwYjA0ZmIwLi44OGZiYjNhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc3VueGkvc3VuNGktc3BkaWYuYworKysgYi9zb3VuZC9zb2Mvc3VueGkvc3VuNGktc3BkaWYuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNldC5oPgogI2luY2x1ZGUgPHNvdW5kL2RtYWVuZ2luZV9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CkBAIC0xNjIsNiArMTYzLDcgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCXN0cnVjdCBjbGsgKnNwZGlmX2NsazsKIAlzdHJ1Y3QgY2xrICphcGJfY2xrOworCXN0cnVjdCByZXNldF9jb250cm9sICpyc3Q7CiAJc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBjcHVfZGFpX2RydjsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhIGRtYV9wYXJhbXNfdHg7CkBAIC00MTEsNiArNDEzLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNGlfc3BkaWZfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtc3BkaWYiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjZpLWEzMS1zcGRpZiIsIH0sCiAJeyAvKiBzZW50aW5lbCAqLyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3VuNGlfc3BkaWZfb2ZfbWF0Y2gpOwpAQCAtNDgyLDExICs0ODUsMjMgQEAKIAl9CiAKIAlob3N0LT5kbWFfcGFyYW1zX3R4LmFkZHIgPSByZXMtPnN0YXJ0ICsgU1VONElfU1BESUZfVFhGSUZPOwotCWhvc3QtPmRtYV9wYXJhbXNfdHgubWF4YnVyc3QgPSA0OworCWhvc3QtPmRtYV9wYXJhbXNfdHgubWF4YnVyc3QgPSA4OwogCWhvc3QtPmRtYV9wYXJhbXNfdHguYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8yX0JZVEVTOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaG9zdCk7CiAKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJICAgICJhbGx3aW5uZXIsc3VuNmktYTMxLXNwZGlmIikpIHsKKwkJaG9zdC0+cnN0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldF9vcHRpb25hbCgmcGRldi0+ZGV2LCBOVUxMKTsKKwkJaWYgKElTX0VSUihob3N0LT5yc3QpICYmIFBUUl9FUlIoaG9zdC0+cnN0KSA9PSAtRVBST0JFX0RFRkVSKSB7CisJCQlyZXQgPSAtRVBST0JFX0RFRkVSOworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCByZXNldDogJWRcbiIsIHJldCk7CisJCQlnb3RvIGVycl9kaXNhYmxlX2FwYl9jbGs7CisJCX0KKwkJaWYgKCFJU19FUlIoaG9zdC0+cnN0KSkKKwkJCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQoaG9zdC0+cnN0KTsKKwl9CisKIAlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCiAJCQkJJnN1bjRpX3NwZGlmX2NvbXBvbmVudCwgJnN1bjRpX3NwZGlmX2RhaSwgMSk7CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS9LY29uZmlnIGIvc291bmQvc29jL3RlZ3JhL0tjb25maWcKaW5kZXggYTY3NjhmOC4uZWZiZThkNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL0tjb25maWcKKysrIGIvc291bmQvc29jL3RlZ3JhL0tjb25maWcKQEAgLTEzOCwzICsxMzgsMTQgQEAKIAloZWxwCiAJICBTYXkgWSBvciBNIGhlcmUgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBUZWdyYQogCSAgYm9hcmRzIHVzaW5nIHRoZSBSVDU2NzcgY29kZWMsIHN1Y2ggYXMgUnl1LgorCitjb25maWcgU05EX1NPQ19URUdSQV9TR1RMNTAwMAorCXRyaXN0YXRlICJTb0MgQXVkaW8gc3VwcG9ydCBmb3IgVGVncmEgYm9hcmRzIHVzaW5nIGEgU0dUTDUwMDAgY29kZWMiCisJZGVwZW5kcyBvbiBTTkRfU09DX1RFR1JBICYmIEkyQyAmJiBHUElPTElCCisJc2VsZWN0IFNORF9TT0NfVEVHUkEyMF9JMlMgaWYgQVJDSF9URUdSQV8yeF9TT0MKKwlzZWxlY3QgU05EX1NPQ19URUdSQTMwX0kyUyBpZiBBUkNIX1RFR1JBXzN4X1NPQworCXNlbGVjdCBTTkRfU09DX1NHVEw1MDAwCisJaGVscAorCSAgU2F5IFkgb3IgTSBoZXJlIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gVGVncmEKKwkgIGJvYXJkcyB1c2luZyB0aGUgU0dUTDUwMDAgY29kZWMsIHN1Y2ggYXMgQXBhbGlzIFQzMCwgQXBhbGlzIFRLMSBvcgorCSAgQ29saWJyaSBUMzAuCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvTWFrZWZpbGUgYi9zb3VuZC9zb2MvdGVncmEvTWFrZWZpbGUKaW5kZXggOTE3MTY1NS4uZjIxNGEzZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL01ha2VmaWxlCisrKyBiL3NvdW5kL3NvYy90ZWdyYS9NYWtlZmlsZQpAQCAtMjYsNiArMjYsNyBAQAogc25kLXNvYy10ZWdyYS10cmltc2xpY2Utb2JqcyA6PSB0cmltc2xpY2Uubwogc25kLXNvYy10ZWdyYS1hbGM1NjMyLW9ianMgOj0gdGVncmFfYWxjNTYzMi5vCiBzbmQtc29jLXRlZ3JhLW1heDk4MDkwLW9ianMgOj0gdGVncmFfbWF4OTgwOTAubworc25kLXNvYy10ZWdyYS1zZ3RsNTAwMC1vYmpzIDo9IHRlZ3JhX3NndGw1MDAwLm8KIAogb2JqLSQoQ09ORklHX1NORF9TT0NfVEVHUkFfUlQ1NjQwKSArPSBzbmQtc29jLXRlZ3JhLXJ0NTY0MC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19URUdSQV9SVDU2NzcpICs9IHNuZC1zb2MtdGVncmEtcnQ1Njc3Lm8KQEAgLTM1LDMgKzM2LDQgQEAKIG9iai0kKENPTkZJR19TTkRfU09DX1RFR1JBX1RSSU1TTElDRSkgKz0gc25kLXNvYy10ZWdyYS10cmltc2xpY2Uubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVEVHUkFfQUxDNTYzMikgKz0gc25kLXNvYy10ZWdyYS1hbGM1NjMyLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1RFR1JBX01BWDk4MDkwKSArPSBzbmQtc29jLXRlZ3JhLW1heDk4MDkwLm8KK29iai0kKENPTkZJR19TTkRfU09DX1RFR1JBX1NHVEw1MDAwKSArPSBzbmQtc29jLXRlZ3JhLXNndGw1MDAwLm8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfcnQ1NjQwLmMgYi9zb3VuZC9zb2MvdGVncmEvdGVncmFfcnQ1NjQwLmMKaW5kZXggNzczZGFlYy4uZTVlZjRlOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3J0NTY0MC5jCisrKyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9ydDU2NDAuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0qIHRlZ3JhX3J0NTY0MC5jIC0gVGVncmEgbWFjaGluZSBBU29DIGRyaXZlciBmb3IgYm9hcmRzIHVzaW5nIFdNODkwMyBjb2RlYy4KKyogdGVncmFfcnQ1NjQwLmMgLSBUZWdyYSBtYWNoaW5lIEFTb0MgZHJpdmVyIGZvciBib2FyZHMgdXNpbmcgUlQ1NjQwIGNvZGVjLgogICoKICAqIENvcHlyaWdodCAoYykgMjAxMywgTlZJRElBIENPUlBPUkFUSU9OLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfc2d0bDUwMDAuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9zZ3RsNTAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNzY4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvdGVncmEvdGVncmFfc2d0bDUwMDAuYwpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIHRlZ3JhX3NndGw1MDAwLmMgLSBUZWdyYSBtYWNoaW5lIEFTb0MgZHJpdmVyIGZvciBib2FyZHMgdXNpbmcgU0dUTDUwMDAgY29kZWMKKyAqCisgKiBBdXRob3I6IE1hcmNlbCBaaXN3aWxlciA8bWFyY2VsQHppc3dpbGVyLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIEJhc2VkIG9uIGNvZGUgY29weXJpZ2h0L2J5OgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEyIC0gTlZJRElBLCBJbmMuCisgKiAoYykgMjAwOSwgMjAxMCBOdmlkaWEgR3JhcGhpY3MgUHZ0LiBMdGQuCisgKiBDb3B5cmlnaHQgMjAwNyBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKworI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlICIuLi9jb2RlY3Mvc2d0bDUwMDAuaCIKKworI2luY2x1ZGUgInRlZ3JhX2Fzb2NfdXRpbHMuaCIKKworI2RlZmluZSBEUlZfTkFNRSAidGVncmEtc25kLXNndGw1MDAwIgorCitzdHJ1Y3QgdGVncmFfc2d0bDUwMDAgeworCXN0cnVjdCB0ZWdyYV9hc29jX3V0aWxzX2RhdGEgdXRpbF9kYXRhOworfTsKKworc3RhdGljIGludCB0ZWdyYV9zZ3RsNTAwMF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQ7CisJc3RydWN0IHRlZ3JhX3NndGw1MDAwICptYWNoaW5lID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOworCWludCBzcmF0ZSwgbWNsazsKKwlpbnQgZXJyOworCisJc3JhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCXN3aXRjaCAoc3JhdGUpIHsKKwljYXNlIDExMDI1OgorCWNhc2UgMjIwNTA6CisJY2FzZSA0NDEwMDoKKwljYXNlIDg4MjAwOgorCQltY2xrID0gMTEyODk2MDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1jbGsgPSAxMjI4ODAwMDsKKwkJYnJlYWs7CisJfQorCisJZXJyID0gdGVncmFfYXNvY191dGlsc19zZXRfcmF0ZSgmbWFjaGluZS0+dXRpbF9kYXRhLCBzcmF0ZSwgbWNsayk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJDYW4ndCBjb25maWd1cmUgY2xvY2tzXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgU0dUTDUwMDBfU1lTQ0xLLCBtY2xrLAorCQkJCSAgICAgU05EX1NPQ19DTE9DS19JTik7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjb2RlY19kYWkgY2xvY2sgbm90IHNldFxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgdGVncmFfc2d0bDUwMDBfb3BzID0geworCS5od19wYXJhbXMgPSB0ZWdyYV9zZ3RsNTAwMF9od19wYXJhbXMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgdGVncmFfc2d0bDUwMDBfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUgSmFjayIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9MSU5FKCJMaW5lIEluIEphY2siLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJNaWMgSmFjayIsIE5VTEwpLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIHRlZ3JhX3NndGw1MDAwX2RhaSA9IHsKKwkubmFtZSA9ICJzZ3RsNTAwMCIsCisJLnN0cmVhbV9uYW1lID0gIkhpRmkiLAorCS5jb2RlY19kYWlfbmFtZSA9ICJzZ3RsNTAwMCIsCisJLm9wcyA9ICZ0ZWdyYV9zZ3RsNTAwMF9vcHMsCisJLmRhaV9mbXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CisJCQlTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgc25kX3NvY190ZWdyYV9zZ3RsNTAwMCA9IHsKKwkubmFtZSA9ICJ0ZWdyYS1zZ3RsNTAwMCIsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmRhaV9saW5rID0gJnRlZ3JhX3NndGw1MDAwX2RhaSwKKwkubnVtX2xpbmtzID0gMSwKKwkuZGFwbV93aWRnZXRzID0gdGVncmFfc2d0bDUwMDBfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh0ZWdyYV9zZ3RsNTAwMF9kYXBtX3dpZGdldHMpLAorCS5mdWxseV9yb3V0ZWQgPSB0cnVlLAorfTsKKworc3RhdGljIGludCB0ZWdyYV9zZ3RsNTAwMF9kcml2ZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9ICZzbmRfc29jX3RlZ3JhX3NndGw1MDAwOworCXN0cnVjdCB0ZWdyYV9zZ3RsNTAwMCAqbWFjaGluZTsKKwlpbnQgcmV0OworCisJbWFjaGluZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHRlZ3JhX3NndGw1MDAwKSwKKwkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIW1hY2hpbmUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgYWxsb2NhdGUgdGVncmFfc2d0bDUwMDAgc3RydWN0XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY2FyZC0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKKwlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoY2FyZCwgbWFjaGluZSk7CisKKwlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2NhcmRfbmFtZShjYXJkLCAibnZpZGlhLG1vZGVsIik7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3JvdXRpbmcoY2FyZCwgIm52aWRpYSxhdWRpby1yb3V0aW5nIik7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwl0ZWdyYV9zZ3RsNTAwMF9kYWkuY29kZWNfb2Zfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobnAsCisJCQkibnZpZGlhLGF1ZGlvLWNvZGVjIiwgMCk7CisJaWYgKCF0ZWdyYV9zZ3RsNTAwMF9kYWkuY29kZWNfb2Zfbm9kZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiUHJvcGVydHkgJ252aWRpYSxhdWRpby1jb2RlYycgbWlzc2luZyBvciBpbnZhbGlkXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJdGVncmFfc2d0bDUwMDBfZGFpLmNwdV9vZl9ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwKKwkJCSJudmlkaWEsaTJzLWNvbnRyb2xsZXIiLCAwKTsKKwlpZiAoIXRlZ3JhX3NndGw1MDAwX2RhaS5jcHVfb2Zfbm9kZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiUHJvcGVydHkgJ252aWRpYSxpMnMtY29udHJvbGxlcicgbWlzc2luZy9pbnZhbGlkXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJdGVncmFfc2d0bDUwMDBfZGFpLnBsYXRmb3JtX29mX25vZGUgPSB0ZWdyYV9zZ3RsNTAwMF9kYWkuY3B1X29mX25vZGU7CisKKwlyZXQgPSB0ZWdyYV9hc29jX3V0aWxzX2luaXQoJm1hY2hpbmUtPnV0aWxfZGF0YSwgJnBkZXYtPmRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NhcmQoY2FyZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzbmRfc29jX3JlZ2lzdGVyX2NhcmQgZmFpbGVkICglZClcbiIsCisJCQlyZXQpOworCQlnb3RvIGVycl9maW5pX3V0aWxzOworCX0KKworCXJldHVybiAwOworCitlcnJfZmluaV91dGlsczoKKwl0ZWdyYV9hc29jX3V0aWxzX2ZpbmkoJm1hY2hpbmUtPnV0aWxfZGF0YSk7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZWdyYV9zZ3RsNTAwMF9kcml2ZXJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB0ZWdyYV9zZ3RsNTAwMCAqbWFjaGluZSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKwlpbnQgcmV0OworCisJcmV0ID0gc25kX3NvY191bnJlZ2lzdGVyX2NhcmQoY2FyZCk7CisKKwl0ZWdyYV9hc29jX3V0aWxzX2ZpbmkoJm1hY2hpbmUtPnV0aWxfZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0ZWdyYV9zZ3RsNTAwMF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhLWF1ZGlvLXNndGw1MDAwIiwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0ZWdyYV9zZ3RsNTAwMF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLnBtID0gJnNuZF9zb2NfcG1fb3BzLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB0ZWdyYV9zZ3RsNTAwMF9vZl9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IHRlZ3JhX3NndGw1MDAwX2RyaXZlcl9wcm9iZSwKKwkucmVtb3ZlID0gdGVncmFfc2d0bDUwMDBfZHJpdmVyX3JlbW92ZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHRlZ3JhX3NndGw1MDAwX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIk1hcmNlbCBaaXN3aWxlciA8bWFyY2VsQHppc3dpbGVyLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGVncmEgU0dUTDUwMDAgbWFjaGluZSBBU29DIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSVl9OQU1FKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRlZ3JhX3NndGw1MDAwX29mX21hdGNoKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy91eDUwMC91eDUwMF9tc3BfZGFpLmMgYi9zb3VuZC9zb2MvdXg1MDAvdXg1MDBfbXNwX2RhaS5jCmluZGV4IDZkNTY5OGIuLmIzNDNlZmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy91eDUwMC91eDUwMF9tc3BfZGFpLmMKKysrIGIvc291bmQvc29jL3V4NTAwL3V4NTAwX21zcF9kYWkuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGRhaS0+ZGV2LAotCQkJIiVzOiBFcnJvcjogVW5zb3Bwb3J0ZWQgaW52ZXJzaW9uIChmbXQgPSAweCV4KSFcbiIsCisJCQkiJXM6IEVycm9yOiBVbnN1cHBvcnRlZCBpbnZlcnNpb24gKGZtdCA9IDB4JXgpIVxuIiwKIAkJCV9fZnVuY19fLCBmbXQpOwogCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjE4LDcgKzIxOCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBFcnJvcjogVW5zb3Bwb3J0ZWQgbWFzdGVyIChmbXQgPSAweCV4KSFcbiIsCisJCWRldl9lcnIoZGFpLT5kZXYsICIlczogRXJyb3I6IFVuc3VwcG9ydGVkIG1hc3RlciAoZm10ID0gMHgleCkhXG4iLAogCQkJX19mdW5jX18sIGZtdCk7CiAKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNzQsNyArMzc0LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IEVycm9yOiBVbnNvcHBvcnRlZCBmb3JtYXQgKCVkKSFcbiIsCisJCWRldl9lcnIoZGFpLT5kZXYsICIlczogRXJyb3I6IFVuc3VwcG9ydGVkIGZvcm1hdCAoJWQpIVxuIiwKIAkJCV9fZnVuY19fLCBmbXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FpYXEvYXVkaW8uYyBiL3NvdW5kL3VzYi9jYWlhcS9hdWRpby5jCmluZGV4IDMyN2Y4NjQuLjhmNjZiYTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9jYWlhcS9hdWRpby5jCisrKyBiL3NvdW5kL3VzYi9jYWlhcS9hdWRpby5jCkBAIC03MzksNyArNzM5LDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTl9VUkJTOyBpKyspIHsKIAkJdXJic1tpXSA9IHVzYl9hbGxvY191cmIoRlJBTUVTX1BFUl9VUkIsIEdGUF9LRVJORUwpOwogCQlpZiAoIXVyYnNbaV0pIHsKLQkJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIHVzYl9hbGxvY191cmIoKSwgT09NIT9cbiIpOwogCQkJKnJldCA9IC1FTk9NRU07CiAJCQlyZXR1cm4gdXJiczsKIAkJfQpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2NhcmQuaCBiL3NvdW5kL3VzYi9jYXJkLmgKaW5kZXggNzE3NzhjYS4uMTExYjBmMCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2NhcmQuaAorKysgYi9zb3VuZC91c2IvY2FyZC5oCkBAIC05Miw3ICs5Miw3IEBACiAJdW5zaWduZWQgaW50IGN1cmZyYW1lc2l6ZTsgICAgICAvKiBjdXJyZW50IHBhY2tldCBzaXplIGluIGZyYW1lcyAoZm9yIGNhcHR1cmUpICovCiAJdW5zaWduZWQgaW50IHN5bmNtYXhzaXplOwkvKiBzeW5jIGVuZHBvaW50IHBhY2tldCBzaXplICovCiAJdW5zaWduZWQgaW50IGZpbGxfbWF4OjE7CS8qIGZpbGwgbWF4IHBhY2tldCBzaXplIGFsd2F5cyAqLwotCXVuc2lnbmVkIGludCB1ZGgwMV9mYl9xdWlyazoxOwkvKiBjb3JydXB0ZWQgZmVlZGJhY2sgZGF0YSAqLworCXVuc2lnbmVkIGludCB0ZW5vcl9mYl9xdWlyazoxOwkvKiBjb3JydXB0ZWQgZmVlZGJhY2sgZGF0YSAqLwogCXVuc2lnbmVkIGludCBkYXRhaW50ZXJ2YWw7ICAgICAgLyogbG9nXzIgb2YgZGF0YSBwYWNrZXQgaW50ZXJ2YWwgKi8KIAl1bnNpZ25lZCBpbnQgc3luY2ludGVydmFsOwkvKiBQIGZvciBhZGFwdGl2ZSBtb2RlLCAwIG90aGVyd2lzZSAqLwogCXVuc2lnbmVkIGNoYXIgc2lsZW5jZV92YWx1ZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9lbmRwb2ludC5jIGIvc291bmQvdXNiL2VuZHBvaW50LmMKaW5kZXggYzA3YTdlZC4uYzQ3MDI1MSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2VuZHBvaW50LmMKKysrIGIvc291bmQvdXNiL2VuZHBvaW50LmMKQEAgLTUwMiwxMCArNTAyLDYgQEAKIAkJCWVwLT5zeW5jaW50ZXJ2YWwgPSAzOwogCiAJCWVwLT5zeW5jbWF4c2l6ZSA9IGxlMTZfdG9fY3B1KGdldF9lbmRwb2ludChhbHRzLCAxKS0+d01heFBhY2tldFNpemUpOwotCi0JCWlmIChjaGlwLT51c2JfaWQgPT0gVVNCX0lEKDB4MDY0NCwgMHg4MDM4KSAvKiBURUFDIFVELUgwMSAqLyAmJgotCQkgICAgZXAtPnN5bmNtYXhzaXplID09IDQpCi0JCQllcC0+dWRoMDFfZmJfcXVpcmsgPSAxOwogCX0KIAogCWxpc3RfYWRkX3RhaWwoJmVwLT5saXN0LCAmY2hpcC0+ZXBfbGlzdCk7CkBAIC0xMTcxLDE1ICsxMTY3LDE2IEBACiAJaWYgKGYgPT0gMCkKIAkJcmV0dXJuOwogCi0JaWYgKHVubGlrZWx5KHNlbmRlci0+dWRoMDFfZmJfcXVpcmspKSB7CisJaWYgKHVubGlrZWx5KHNlbmRlci0+dGVub3JfZmJfcXVpcmspKSB7CiAJCS8qCi0JCSAqIFRoZSBURUFDIFVELUgwMSBmaXJtd2FyZSBzb21ldGltZXMgY2hhbmdlcyB0aGUgZmVlZGJhY2sgdmFsdWUKKwkJICogRGV2aWNlcyBiYXNlZCBvbiBUZW5vciA4ODAyIGNoaXBzZXRzIChURUFDIFVELUgwMQorCQkgKiBhbmQgb3RoZXJzKSBzb21ldGltZXMgY2hhbmdlIHRoZSBmZWVkYmFjayB2YWx1ZQogCQkgKiBieSArLy0gMHgxLjAwMDAuCiAJCSAqLwogCQlpZiAoZiA8IGVwLT5mcmVxbiAtIDB4ODAwMCkKLQkJCWYgKz0gMHgxMDAwMDsKKwkJCWYgKz0gMHhmMDAwOwogCQllbHNlIGlmIChmID4gZXAtPmZyZXFuICsgMHg4MDAwKQotCQkJZiAtPSAweDEwMDAwOworCQkJZiAtPSAweGYwMDA7CiAJfSBlbHNlIGlmICh1bmxpa2VseShlcC0+ZnJlcXNoaWZ0ID09IElOVF9NSU4pKSB7CiAJCS8qCiAJCSAqIFRoZSBmaXJzdCB0aW1lIHdlIHNlZSBhIGZlZWRiYWNrIHZhbHVlLCBkZXRlcm1pbmUgaXRzIGZvcm1hdApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2Zvcm1hdC5jIGIvc291bmQvdXNiL2Zvcm1hdC5jCmluZGV4IDc4OWQxOWUuLjJjNDQzODYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9mb3JtYXQuYworKysgYi9zb3VuZC91c2IvZm9ybWF0LmMKQEAgLTE3NiwxMCArMTc2LDggQEAKIAkJaW50IHIsIGlkeDsKIAogCQlmcC0+cmF0ZV90YWJsZSA9IGttYWxsb2Moc2l6ZW9mKGludCkgKiBucl9yYXRlcywgR0ZQX0tFUk5FTCk7Ci0JCWlmIChmcC0+cmF0ZV90YWJsZSA9PSBOVUxMKSB7Ci0JCQl1c2JfYXVkaW9fZXJyKGNoaXAsICJjYW5ub3QgbWFsbG9jXG4iKTsKKwkJaWYgKGZwLT5yYXRlX3RhYmxlID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJfQogCiAJCWZwLT5ucl9yYXRlcyA9IDA7CiAJCWZwLT5yYXRlX21pbiA9IGZwLT5yYXRlX21heCA9IDA7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbGluZTYvS2NvbmZpZyBiL3NvdW5kL3VzYi9saW5lNi9LY29uZmlnCmluZGV4IGY0NTg1ZDM3Li4zOWI0MDAzIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbGluZTYvS2NvbmZpZworKysgYi9zb3VuZC91c2IvbGluZTYvS2NvbmZpZwpAQCAtMiw2ICsyLDcgQEAKIAl0cmlzdGF0ZQogCXNlbGVjdCBTTkRfUkFXTUlESQogCXNlbGVjdCBTTkRfUENNCisJc2VsZWN0IFNORF9IV0RFUAogCiBjb25maWcgU05EX1VTQl9QT0QKIAl0cmlzdGF0ZSAiTGluZSA2IFBPRCBVU0Igc3VwcG9ydCIKQEAgLTIxLDEwICsyMiwxMCBAQAogCSAgICAgIHJlLWFtcGluZykKIAogY29uZmlnIFNORF9VU0JfUE9ESEQKLQl0cmlzdGF0ZSAiTGluZSA2IFBPRCBIRDMwMC80MDAvNTAwIFVTQiBzdXBwb3J0IgorCXRyaXN0YXRlICJMaW5lIDYgUE9EIFgzL0hEMzAwLzQwMC81MDAgVVNCIHN1cHBvcnQiCiAJc2VsZWN0IFNORF9VU0JfTElORTYKIAloZWxwCi0JICBUaGlzIGlzIGEgZHJpdmVyIGZvciBQT0QgSEQzMDAsIDQwMCBhbmQgNTAwIGRldmljZXMuCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciBQT0QgWDMsIEhEMzAwLCA0MDAgYW5kIDUwMCBkZXZpY2VzLgogCiBjb25maWcgU05EX1VTQl9UT05FUE9SVAogCXRyaXN0YXRlICJUb25lUG9ydCBHWCwgVVgxIGFuZCBVWDIgVVNCIHN1cHBvcnQiCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbGluZTYvY2FwdHVyZS5jIGIvc291bmQvdXNiL2xpbmU2L2NhcHR1cmUuYwppbmRleCBmNTE4ZmJiLi43YzgxMjU2IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbGluZTYvY2FwdHVyZS5jCisrKyBiL3NvdW5kL3VzYi9saW5lNi9jYXB0dXJlLmMKQEAgLTI5LDEwICsyOSwxMCBAQAogCWludCByZXQ7CiAJc3RydWN0IHVyYiAqdXJiX2luOwogCi0JaW5kZXggPQotCSAgICBmaW5kX2ZpcnN0X3plcm9fYml0KCZsaW5lNnBjbS0+aW4uYWN0aXZlX3VyYnMsIExJTkU2X0lTT19CVUZGRVJTKTsKKwlpbmRleCA9IGZpbmRfZmlyc3RfemVyb19iaXQoJmxpbmU2cGNtLT5pbi5hY3RpdmVfdXJicywKKwkJCQkgICAgbGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVycyk7CiAKLQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IExJTkU2X0lTT19CVUZGRVJTKSB7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsaW5lNnBjbS0+bGluZTYtPmlzb19idWZmZXJzKSB7CiAJCWRldl9lcnIobGluZTZwY20tPmxpbmU2LT5pZmNkZXYsICJubyBmcmVlIFVSQiBmb3VuZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTQ0LDEzICs0NCwxMyBAQAogCQlzdHJ1Y3QgdXNiX2lzb19wYWNrZXRfZGVzY3JpcHRvciAqZmluID0KIAkJICAgICZ1cmJfaW4tPmlzb19mcmFtZV9kZXNjW2ldOwogCQlmaW4tPm9mZnNldCA9IHVyYl9zaXplOwotCQlmaW4tPmxlbmd0aCA9IGxpbmU2cGNtLT5tYXhfcGFja2V0X3NpemU7Ci0JCXVyYl9zaXplICs9IGxpbmU2cGNtLT5tYXhfcGFja2V0X3NpemU7CisJCWZpbi0+bGVuZ3RoID0gbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZV9pbjsKKwkJdXJiX3NpemUgKz0gbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZV9pbjsKIAl9CiAKIAl1cmJfaW4tPnRyYW5zZmVyX2J1ZmZlciA9CiAJICAgIGxpbmU2cGNtLT5pbi5idWZmZXIgKwotCSAgICBpbmRleCAqIExJTkU2X0lTT19QQUNLRVRTICogbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZTsKKwkgICAgaW5kZXggKiBMSU5FNl9JU09fUEFDS0VUUyAqIGxpbmU2cGNtLT5tYXhfcGFja2V0X3NpemVfaW47CiAJdXJiX2luLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gdXJiX3NpemU7CiAJdXJiX2luLT5jb250ZXh0ID0gbGluZTZwY207CiAKQEAgLTczLDcgKzczLDcgQEAKIHsKIAlpbnQgcmV0ID0gMCwgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBMSU5FNl9JU09fQlVGRkVSUzsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IGxpbmU2cGNtLT5saW5lNi0+aXNvX2J1ZmZlcnM7ICsraSkgewogCQlyZXQgPSBzdWJtaXRfYXVkaW9faW5fdXJiKGxpbmU2cGNtKTsKIAkJaWYgKHJldCA8IDApCiAJCQlicmVhazsKQEAgLTkwLDcgKzkwLDkgQEAKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9CiAJICAgIGdldF9zdWJzdHJlYW0obGluZTZwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQljb25zdCBpbnQgYnl0ZXNfcGVyX2ZyYW1lID0gbGluZTZwY20tPnByb3BlcnRpZXMtPmJ5dGVzX3Blcl9mcmFtZTsKKwljb25zdCBpbnQgYnl0ZXNfcGVyX2ZyYW1lID0KKwkJbGluZTZwY20tPnByb3BlcnRpZXMtPmJ5dGVzX3Blcl9jaGFubmVsICoKKwkJbGluZTZwY20tPnByb3BlcnRpZXMtPmNhcHR1cmVfaHcuY2hhbm5lbHNfbWF4OwogCWludCBmcmFtZXMgPSBmc2l6ZSAvIGJ5dGVzX3Blcl9mcmFtZTsKIAogCWlmIChydW50aW1lID09IE5VTEwpCkBAIC0xNTQsNyArMTU2LDcgQEAKIAlsaW5lNnBjbS0+aW4ubGFzdF9mcmFtZSA9IHVyYi0+c3RhcnRfZnJhbWU7CiAKIAkvKiBmaW5kIGluZGV4IG9mIFVSQiAqLwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IExJTkU2X0lTT19CVUZGRVJTOyArK2luZGV4KQorCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxpbmU2cGNtLT5saW5lNi0+aXNvX2J1ZmZlcnM7ICsraW5kZXgpCiAJCWlmICh1cmIgPT0gbGluZTZwY20tPmluLnVyYnNbaW5kZXhdKQogCQkJYnJlYWs7CiAKQEAgLTE3MywxNyArMTc1LDI3IEBACiAJCWZidWYgPSB1cmItPnRyYW5zZmVyX2J1ZmZlciArIGZpbi0+b2Zmc2V0OwogCQlmc2l6ZSA9IGZpbi0+YWN0dWFsX2xlbmd0aDsKIAotCQlpZiAoZnNpemUgPiBsaW5lNnBjbS0+bWF4X3BhY2tldF9zaXplKSB7CisJCWlmIChmc2l6ZSA+IGxpbmU2cGNtLT5tYXhfcGFja2V0X3NpemVfaW4pIHsKIAkJCWRldl9lcnIobGluZTZwY20tPmxpbmU2LT5pZmNkZXYsCiAJCQkJImRyaXZlciBhbmQvb3IgZGV2aWNlIGJ1ZzogcGFja2V0IHRvbyBsYXJnZSAoJWQgPiAlZClcbiIsCi0JCQkJZnNpemUsIGxpbmU2cGNtLT5tYXhfcGFja2V0X3NpemUpOworCQkJCWZzaXplLCBsaW5lNnBjbS0+bWF4X3BhY2tldF9zaXplX2luKTsKIAkJfQogCiAJCWxlbmd0aCArPSBmc2l6ZTsKIAotCQkvKiB0aGUgZm9sbG93aW5nIGFzc3VtZXMgTElORTZfSVNPX1BBQ0tFVFMgPT0gMTogKi8KKwkJQlVJTERfQlVHX09OX01TRyhMSU5FNl9JU09fUEFDS0VUUyAhPSAxLAorCQkJIlRoZSBmb2xsb3dpbmcgY29kZSBhc3N1bWVzIExJTkU2X0lTT19QQUNLRVRTID09IDEiKTsKKwkJLyogVE9ETzoKKwkJICogQWxzbywgaWYgaXNvX2J1ZmZlcnMgIT0gMiwgdGhlIHByZXYgZnJhbWUgaXMgYWxtb3N0IHJhbmRvbSBhdAorCQkgKiBwbGF5YmFjayBzaWRlLgorCQkgKiBUaGlzIG5lZWRzIHRvIGJlIHJlZGVzaWduZWQuIEl0IHNob3VsZCBiZSAic3RhYmxlIiwgYnV0IHdlIG1heQorCQkgKiBleHBlcmllbmNlIHN5bmMgcHJvYmxlbXMgb24gc3VjaCBoaWdoLXNwZWVkIGNvbmZpZ3MuCisJCSAqLworCiAJCWxpbmU2cGNtLT5wcmV2X2ZidWYgPSBmYnVmOwotCQlsaW5lNnBjbS0+cHJldl9mc2l6ZSA9IGZzaXplOworCQlsaW5lNnBjbS0+cHJldl9mc2l6ZSA9IGZzaXplIC8KKwkJCShsaW5lNnBjbS0+cHJvcGVydGllcy0+Ynl0ZXNfcGVyX2NoYW5uZWwgKgorCQkJbGluZTZwY20tPnByb3BlcnRpZXMtPmNhcHR1cmVfaHcuY2hhbm5lbHNfbWF4KTsKIAogCQlpZiAoIXRlc3RfYml0KExJTkU2X1NUUkVBTV9JTVBVTFNFLCAmbGluZTZwY20tPmluLnJ1bm5pbmcpICYmCiAJCSAgICB0ZXN0X2JpdChMSU5FNl9TVFJFQU1fUENNLCAmbGluZTZwY20tPmluLnJ1bm5pbmcpICYmCkBAIC0yMjAsNiArMjMyLDggQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAorCWxpbmU2X3BjbV9hY3F1aXJlKGxpbmU2cGNtLCBMSU5FNl9TVFJFQU1fQ0FQVFVSRV9IRUxQRVIsIGZhbHNlKTsKKwogCXJ1bnRpbWUtPmh3ID0gbGluZTZwY20tPnByb3BlcnRpZXMtPmNhcHR1cmVfaHc7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMjcsNiArMjQxLDkgQEAKIC8qIGNsb3NlIGNhcHR1cmUgY2FsbGJhY2sgKi8KIHN0YXRpYyBpbnQgc25kX2xpbmU2X2NhcHR1cmVfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CisJc3RydWN0IHNuZF9saW5lNl9wY20gKmxpbmU2cGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJbGluZTZfcGNtX3JlbGVhc2UobGluZTZwY20sIExJTkU2X1NUUkVBTV9DQVBUVVJFX0hFTFBFUik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0Nyw4ICsyNjQsMTMgQEAKIAlzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiA9IGxpbmU2cGNtLT5saW5lNjsKIAlpbnQgaTsKIAorCWxpbmU2cGNtLT5pbi51cmJzID0ga3phbGxvYygKKwkJc2l6ZW9mKHN0cnVjdCB1cmIgKikgKiBsaW5lNi0+aXNvX2J1ZmZlcnMsIEdGUF9LRVJORUwpOworCWlmIChsaW5lNnBjbS0+aW4udXJicyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCS8qIGNyZWF0ZSBhdWRpbyBVUkJzIGFuZCBmaWxsIGluIGNvbnN0YW50IHZhbHVlczogKi8KLQlmb3IgKGkgPSAwOyBpIDwgTElORTZfSVNPX0JVRkZFUlM7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBsaW5lNi0+aXNvX2J1ZmZlcnM7ICsraSkgewogCQlzdHJ1Y3QgdXJiICp1cmI7CiAKIAkJLyogVVJCIGZvciBhdWRpbyBpbjogKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9saW5lNi9kcml2ZXIuYyBiL3NvdW5kL3VzYi9saW5lNi9kcml2ZXIuYwppbmRleCA4MWI3ZGE4Li4xNGU1ODdlIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbGluZTYvZHJpdmVyLmMKKysrIGIvc291bmQvdXNiL2xpbmU2L2RyaXZlci5jCkBAIC0xNyw2ICsxNyw3IEBACiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL2h3ZGVwLmg+CiAKICNpbmNsdWRlICJjYXB0dXJlLmgiCiAjaW5jbHVkZSAiZHJpdmVyLmgiCkBAIC0yOSw3ICszMCw3IEBACiAvKgogCVRoaXMgaXMgTGluZSA2J3MgTUlESSBtYW51ZmFjdHVyZXIgSUQuCiAqLwotY29uc3QgdW5zaWduZWQgY2hhciBsaW5lNl9taWRpX2lkW10gPSB7Citjb25zdCB1bnNpZ25lZCBjaGFyIGxpbmU2X21pZGlfaWRbM10gPSB7CiAJMHgwMCwgMHgwMSwgMHgwYwogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGxpbmU2X21pZGlfaWQpOwpAQCAtNjYsMTAgKzY3LDE3IEBACiB7CiAJaW50IGVycjsKIAotCXVzYl9maWxsX2ludF91cmIobGluZTYtPnVyYl9saXN0ZW4sIGxpbmU2LT51c2JkZXYsCi0JCXVzYl9yY3ZpbnRwaXBlKGxpbmU2LT51c2JkZXYsIGxpbmU2LT5wcm9wZXJ0aWVzLT5lcF9jdHJsX3IpLAotCQlsaW5lNi0+YnVmZmVyX2xpc3RlbiwgTElORTZfQlVGU0laRV9MSVNURU4sCi0JCWxpbmU2X2RhdGFfcmVjZWl2ZWQsIGxpbmU2LCBsaW5lNi0+aW50ZXJ2YWwpOworCWlmIChsaW5lNi0+cHJvcGVydGllcy0+Y2FwYWJpbGl0aWVzICYgTElORTZfQ0FQX0NPTlRST0xfTUlESSkgeworCQl1c2JfZmlsbF9pbnRfdXJiKGxpbmU2LT51cmJfbGlzdGVuLCBsaW5lNi0+dXNiZGV2LAorCQkJdXNiX3JjdmludHBpcGUobGluZTYtPnVzYmRldiwgbGluZTYtPnByb3BlcnRpZXMtPmVwX2N0cmxfciksCisJCQlsaW5lNi0+YnVmZmVyX2xpc3RlbiwgTElORTZfQlVGU0laRV9MSVNURU4sCisJCQlsaW5lNl9kYXRhX3JlY2VpdmVkLCBsaW5lNiwgbGluZTYtPmludGVydmFsKTsKKwl9IGVsc2UgeworCQl1c2JfZmlsbF9idWxrX3VyYihsaW5lNi0+dXJiX2xpc3RlbiwgbGluZTYtPnVzYmRldiwKKwkJCXVzYl9yY3ZidWxrcGlwZShsaW5lNi0+dXNiZGV2LCBsaW5lNi0+cHJvcGVydGllcy0+ZXBfY3RybF9yKSwKKwkJCWxpbmU2LT5idWZmZXJfbGlzdGVuLCBMSU5FNl9CVUZTSVpFX0xJU1RFTiwKKwkJCWxpbmU2X2RhdGFfcmVjZWl2ZWQsIGxpbmU2KTsKKwl9CiAJbGluZTYtPnVyYl9saXN0ZW4tPmFjdHVhbF9sZW5ndGggPSAwOwogCWVyciA9IHVzYl9zdWJtaXRfdXJiKGxpbmU2LT51cmJfbGlzdGVuLCBHRlBfQVRPTUlDKTsKIAlyZXR1cm4gZXJyOwpAQCAtOTAsNiArOTgsNyBAQAogCQkJCSAgaW50IHNpemUpCiB7CiAJaW50IGksIGRvbmUgPSAwOworCWNvbnN0IHN0cnVjdCBsaW5lNl9wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzID0gbGluZTYtPnByb3BlcnRpZXM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBsaW5lNi0+bWF4X3BhY2tldF9zaXplKSB7CiAJCWludCBwYXJ0aWFsOwpAQCAtOTcsMTUgKzEwNiwyMSBAQAogCQlpbnQgZnJhZ19zaXplID0gbWluKGxpbmU2LT5tYXhfcGFja2V0X3NpemUsIHNpemUgLSBpKTsKIAkJaW50IHJldHZhbDsKIAotCQlyZXR2YWwgPSB1c2JfaW50ZXJydXB0X21zZyhsaW5lNi0+dXNiZGV2LAotCQkJCQl1c2Jfc25kaW50cGlwZShsaW5lNi0+dXNiZGV2LAotCQkJCQkJbGluZTYtPnByb3BlcnRpZXMtPmVwX2N0cmxfdyksCi0JCQkJCShjaGFyICopZnJhZ19idWYsIGZyYWdfc2l6ZSwKLQkJCQkJJnBhcnRpYWwsIExJTkU2X1RJTUVPVVQgKiBIWik7CisJCWlmIChwcm9wZXJ0aWVzLT5jYXBhYmlsaXRpZXMgJiBMSU5FNl9DQVBfQ09OVFJPTF9NSURJKSB7CisJCQlyZXR2YWwgPSB1c2JfaW50ZXJydXB0X21zZyhsaW5lNi0+dXNiZGV2LAorCQkJCQkJdXNiX3NuZGludHBpcGUobGluZTYtPnVzYmRldiwgcHJvcGVydGllcy0+ZXBfY3RybF93KSwKKwkJCQkJCShjaGFyICopZnJhZ19idWYsIGZyYWdfc2l6ZSwKKwkJCQkJCSZwYXJ0aWFsLCBMSU5FNl9USU1FT1VUICogSFopOworCQl9IGVsc2UgeworCQkJcmV0dmFsID0gdXNiX2J1bGtfbXNnKGxpbmU2LT51c2JkZXYsCisJCQkJCQl1c2Jfc25kYnVsa3BpcGUobGluZTYtPnVzYmRldiwgcHJvcGVydGllcy0+ZXBfY3RybF93KSwKKwkJCQkJCShjaGFyICopZnJhZ19idWYsIGZyYWdfc2l6ZSwKKwkJCQkJCSZwYXJ0aWFsLCBMSU5FNl9USU1FT1VUICogSFopOworCQl9CiAKIAkJaWYgKHJldHZhbCkgewogCQkJZGV2X2VycihsaW5lNi0+aWZjZGV2LAotCQkJCSJ1c2JfaW50ZXJydXB0X21zZyBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKKwkJCQkidXNiX2J1bGtfbXNnIGZhaWxlZCAoJWQpXG4iLCByZXR2YWwpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTQwLDEwICsxNTUsMTcgQEAKIAlpbnQgZG9uZSA9IG1zZy0+ZG9uZTsKIAlpbnQgYnl0ZXMgPSBtaW4obXNnLT5zaXplIC0gZG9uZSwgbGluZTYtPm1heF9wYWNrZXRfc2l6ZSk7CiAKLQl1c2JfZmlsbF9pbnRfdXJiKHVyYiwgbGluZTYtPnVzYmRldiwKLQkJdXNiX3NuZGludHBpcGUobGluZTYtPnVzYmRldiwgbGluZTYtPnByb3BlcnRpZXMtPmVwX2N0cmxfdyksCi0JCShjaGFyICopbXNnLT5idWZmZXIgKyBkb25lLCBieXRlcywKLQkJbGluZTZfYXN5bmNfcmVxdWVzdF9zZW50LCBtc2csIGxpbmU2LT5pbnRlcnZhbCk7CisJaWYgKGxpbmU2LT5wcm9wZXJ0aWVzLT5jYXBhYmlsaXRpZXMgJiBMSU5FNl9DQVBfQ09OVFJPTF9NSURJKSB7CisJCXVzYl9maWxsX2ludF91cmIodXJiLCBsaW5lNi0+dXNiZGV2LAorCQkJdXNiX3NuZGludHBpcGUobGluZTYtPnVzYmRldiwgbGluZTYtPnByb3BlcnRpZXMtPmVwX2N0cmxfdyksCisJCQkoY2hhciAqKW1zZy0+YnVmZmVyICsgZG9uZSwgYnl0ZXMsCisJCQlsaW5lNl9hc3luY19yZXF1ZXN0X3NlbnQsIG1zZywgbGluZTYtPmludGVydmFsKTsKKwl9IGVsc2UgeworCQl1c2JfZmlsbF9idWxrX3VyYih1cmIsIGxpbmU2LT51c2JkZXYsCisJCQl1c2Jfc25kYnVsa3BpcGUobGluZTYtPnVzYmRldiwgbGluZTYtPnByb3BlcnRpZXMtPmVwX2N0cmxfdyksCisJCQkoY2hhciAqKW1zZy0+YnVmZmVyICsgZG9uZSwgYnl0ZXMsCisJCQlsaW5lNl9hc3luY19yZXF1ZXN0X3NlbnQsIG1zZyk7CisJfQogCiAJbXNnLT5kb25lICs9IGJ5dGVzOwogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CkBAIC0yNjksMjggKzI5MSwzNiBAQAogCWlmICh1cmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKQogCQlyZXR1cm47CiAKLQlkb25lID0KLQkgICAgbGluZTZfbWlkaWJ1Zl93cml0ZShtYiwgdXJiLT50cmFuc2Zlcl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7Ci0KLQlpZiAoZG9uZSA8IHVyYi0+YWN0dWFsX2xlbmd0aCkgewotCQlsaW5lNl9taWRpYnVmX2lnbm9yZShtYiwgZG9uZSk7Ci0JCWRldl9kYmcobGluZTYtPmlmY2RldiwgIiVkICVkIGJ1ZmZlciBvdmVyZmxvdyAtIG1lc3NhZ2Ugc2tpcHBlZFxuIiwKLQkJCWRvbmUsIHVyYi0+YWN0dWFsX2xlbmd0aCk7Ci0JfQotCi0JZm9yICg7OykgeworCWlmIChsaW5lNi0+cHJvcGVydGllcy0+Y2FwYWJpbGl0aWVzICYgTElORTZfQ0FQX0NPTlRST0xfTUlESSkgewogCQlkb25lID0KLQkJICAgIGxpbmU2X21pZGlidWZfcmVhZChtYiwgbGluZTYtPmJ1ZmZlcl9tZXNzYWdlLAotCQkJCSAgICAgICBMSU5FNl9NRVNTQUdFX01BWExFTik7CisJCQlsaW5lNl9taWRpYnVmX3dyaXRlKG1iLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAotCQlpZiAoZG9uZSA9PSAwKQotCQkJYnJlYWs7CisJCWlmIChkb25lIDwgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7CisJCQlsaW5lNl9taWRpYnVmX2lnbm9yZShtYiwgZG9uZSk7CisJCQlkZXZfZGJnKGxpbmU2LT5pZmNkZXYsICIlZCAlZCBidWZmZXIgb3ZlcmZsb3cgLSBtZXNzYWdlIHNraXBwZWRcbiIsCisJCQkJZG9uZSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJfQogCi0JCWxpbmU2LT5tZXNzYWdlX2xlbmd0aCA9IGRvbmU7Ci0JCWxpbmU2X21pZGlfcmVjZWl2ZShsaW5lNiwgbGluZTYtPmJ1ZmZlcl9tZXNzYWdlLCBkb25lKTsKKwkJZm9yICg7OykgeworCQkJZG9uZSA9CisJCQkJbGluZTZfbWlkaWJ1Zl9yZWFkKG1iLCBsaW5lNi0+YnVmZmVyX21lc3NhZ2UsCisJCQkJCQlMSU5FNl9NSURJX01FU1NBR0VfTUFYTEVOKTsKIAorCQkJaWYgKGRvbmUgPT0gMCkKKwkJCQlicmVhazsKKworCQkJbGluZTYtPm1lc3NhZ2VfbGVuZ3RoID0gZG9uZTsKKwkJCWxpbmU2X21pZGlfcmVjZWl2ZShsaW5lNiwgbGluZTYtPmJ1ZmZlcl9tZXNzYWdlLCBkb25lKTsKKworCQkJaWYgKGxpbmU2LT5wcm9jZXNzX21lc3NhZ2UpCisJCQkJbGluZTYtPnByb2Nlc3NfbWVzc2FnZShsaW5lNik7CisJCX0KKwl9IGVsc2UgeworCQlsaW5lNi0+YnVmZmVyX21lc3NhZ2UgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwkJbGluZTYtPm1lc3NhZ2VfbGVuZ3RoID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwogCQlpZiAobGluZTYtPnByb2Nlc3NfbWVzc2FnZSkKIAkJCWxpbmU2LT5wcm9jZXNzX21lc3NhZ2UobGluZTYpOworCQlsaW5lNi0+YnVmZmVyX21lc3NhZ2UgPSBOVUxMOwogCX0KIAogCWxpbmU2X3N0YXJ0X2xpc3RlbihsaW5lNik7CkBAIC00NDcsMTIgKzQ3NywxNiBAQAogCXN0cnVjdCB1c2JfbGluZTYgKmxpbmU2ID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXYgPSBsaW5lNi0+dXNiZGV2OwogCi0JLyogZnJlZSBidWZmZXIgbWVtb3J5IGZpcnN0OiAqLworCS8qIEZyZWUgYnVmZmVyIG1lbW9yeSBmaXJzdC4gV2UgY2Fubm90IGRlcGVuZCBvbiB0aGUgZXhpc3RlbmNlIG9mIHByaXZhdGUKKwkgKiBkYXRhIGZyb20gdGhlIChwb2RoZCkgbW9kdWxlLCBpdCBtYXkgYmUgZ29uZSBhbHJlYWR5IGR1cmluZyB0aGlzIGNhbGwKKwkgKi8KIAlrZnJlZShsaW5lNi0+YnVmZmVyX21lc3NhZ2UpOworCiAJa2ZyZWUobGluZTYtPmJ1ZmZlcl9saXN0ZW4pOwogCiAJLyogdGhlbiBmcmVlIFVSQnM6ICovCiAJdXNiX2ZyZWVfdXJiKGxpbmU2LT51cmJfbGlzdGVuKTsKKwlsaW5lNi0+dXJiX2xpc3RlbiA9IE5VTEw7CiAKIAkvKiBkZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50ZXJzOiAqLwogCXVzYl9wdXRfZGV2KHVzYmRldik7CkBAIC00NjIsMTMgKzQ5NiwyOSBAQAogc3RhdGljIHZvaWQgbGluZTZfZ2V0X2ludGVydmFsKHN0cnVjdCB1c2JfbGluZTYgKmxpbmU2KQogewogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXYgPSBsaW5lNi0+dXNiZGV2OworCWNvbnN0IHN0cnVjdCBsaW5lNl9wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzID0gbGluZTYtPnByb3BlcnRpZXM7CisJaW50IHBpcGU7CiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcDsKLQl1bnNpZ25lZCBwaXBlID0gdXNiX3JjdmludHBpcGUodXNiZGV2LCBsaW5lNi0+cHJvcGVydGllcy0+ZXBfY3RybF9yKTsKLQl1bnNpZ25lZCBlcG51bSA9IHVzYl9waXBlZW5kcG9pbnQocGlwZSk7CiAKLQllcCA9IHVzYmRldi0+ZXBfaW5bZXBudW1dOworCWlmIChwcm9wZXJ0aWVzLT5jYXBhYmlsaXRpZXMgJiBMSU5FNl9DQVBfQ09OVFJPTF9NSURJKSB7CisJCXBpcGUgPQorCQkJdXNiX3JjdmludHBpcGUobGluZTYtPnVzYmRldiwgbGluZTYtPnByb3BlcnRpZXMtPmVwX2N0cmxfcik7CisJfSBlbHNlIHsKKwkJcGlwZSA9CisJCQl1c2JfcmN2YnVsa3BpcGUobGluZTYtPnVzYmRldiwgbGluZTYtPnByb3BlcnRpZXMtPmVwX2N0cmxfcik7CisJfQorCWVwID0gdXNiZGV2LT5lcF9pblt1c2JfcGlwZWVuZHBvaW50KHBpcGUpXTsKKwogCWlmIChlcCkgewogCQlsaW5lNi0+aW50ZXJ2YWwgPSBlcC0+ZGVzYy5iSW50ZXJ2YWw7CisJCWlmICh1c2JkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9MT1cpIHsKKwkJCWxpbmU2LT5pbnRlcnZhbHNfcGVyX3NlY29uZCA9IFVTQl9MT1dfSU5URVJWQUxTX1BFUl9TRUNPTkQ7CisJCQlsaW5lNi0+aXNvX2J1ZmZlcnMgPSBVU0JfTE9XX0lTT19CVUZGRVJTOworCQl9IGVsc2UgeworCQkJbGluZTYtPmludGVydmFsc19wZXJfc2Vjb25kID0gVVNCX0hJR0hfSU5URVJWQUxTX1BFUl9TRUNPTkQ7CisJCQlsaW5lNi0+aXNvX2J1ZmZlcnMgPSBVU0JfSElHSF9JU09fQlVGRkVSUzsKKwkJfQorCiAJCWxpbmU2LT5tYXhfcGFja2V0X3NpemUgPSBsZTE2X3RvX2NwdShlcC0+ZGVzYy53TWF4UGFja2V0U2l6ZSk7CiAJfSBlbHNlIHsKIAkJZGV2X2VycihsaW5lNi0+aWZjZGV2LApAQCAtNDc4LDYgKzUyOCwxMzggQEAKIAl9CiB9CiAKKworLyogRW5hYmxlIGJ1ZmZlcmluZyBvZiBpbmNvbWluZyBtZXNzYWdlcywgZmx1c2ggdGhlIGJ1ZmZlciAqLworc3RhdGljIGludCBsaW5lNl9od2RlcF9vcGVuKHN0cnVjdCBzbmRfaHdkZXAgKmh3LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiA9IGh3LT5wcml2YXRlX2RhdGE7CisKKwkvKiBOT1RFOiBod2RlcCBsYXllciBwcm92aWRlcyBhdG9taWNpdHkgaGVyZSAqLworCisJbGluZTYtPm1lc3NhZ2VzLmFjdGl2ZSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogU3RvcCBidWZmZXJpbmcgKi8KK3N0YXRpYyBpbnQgbGluZTZfaHdkZXBfcmVsZWFzZShzdHJ1Y3Qgc25kX2h3ZGVwICpodywgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHVzYl9saW5lNiAqbGluZTYgPSBody0+cHJpdmF0ZV9kYXRhOworCisJbGluZTYtPm1lc3NhZ2VzLmFjdGl2ZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVhZCBmcm9tIGNpcmN1bGFyIGJ1ZmZlciwgcmV0dXJuIHRvIHVzZXIgKi8KK3N0YXRpYyBsb25nCitsaW5lNl9od2RlcF9yZWFkKHN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwLCBjaGFyIF9fdXNlciAqYnVmLCBsb25nIGNvdW50LAorCQkJCQlsb2ZmX3QgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7CisJbG9uZyBydiA9IDA7CisJdW5zaWduZWQgaW50IG91dF9jb3VudDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmxpbmU2LT5tZXNzYWdlcy5yZWFkX2xvY2spKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJd2hpbGUgKGtmaWZvX2xlbigmbGluZTYtPm1lc3NhZ2VzLmZpZm8pID09IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZsaW5lNi0+bWVzc2FnZXMucmVhZF9sb2NrKTsKKworCQlydiA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKKwkJCWxpbmU2LT5tZXNzYWdlcy53YWl0X3F1ZXVlLAorCQkJa2ZpZm9fbGVuKCZsaW5lNi0+bWVzc2FnZXMuZmlmbykgIT0gMCk7CisJCWlmIChydiA8IDApCisJCQlyZXR1cm4gcnY7CisKKwkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmbGluZTYtPm1lc3NhZ2VzLnJlYWRfbG9jaykpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKworCWlmIChrZmlmb19wZWVrX2xlbigmbGluZTYtPm1lc3NhZ2VzLmZpZm8pID4gY291bnQpIHsKKwkJLyogQnVmZmVyIHRvbyBzbWFsbDsgYWxsb3cgcmUtcmVhZCBvZiB0aGUgY3VycmVudCBpdGVtLi4uICovCisJCXJ2ID0gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlydiA9IGtmaWZvX3RvX3VzZXIoJmxpbmU2LT5tZXNzYWdlcy5maWZvLCBidWYsIGNvdW50LCAmb3V0X2NvdW50KTsKKwkJaWYgKHJ2ID09IDApCisJCQlydiA9IG91dF9jb3VudDsKKwl9CisKKwltdXRleF91bmxvY2soJmxpbmU2LT5tZXNzYWdlcy5yZWFkX2xvY2spOworCXJldHVybiBydjsKK30KKworLyogV3JpdGUgZGlyZWN0bHkgKG5vIGJ1ZmZlcmluZykgdG8gZGV2aWNlIGJ5IHVzZXIqLworc3RhdGljIGxvbmcKK2xpbmU2X2h3ZGVwX3dyaXRlKHN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwgbG9uZyBjb3VudCwKKwkJCQkJbG9mZl90ICpvZmZzZXQpCit7CisJc3RydWN0IHVzYl9saW5lNiAqbGluZTYgPSBod2RlcC0+cHJpdmF0ZV9kYXRhOworCWludCBydjsKKwljaGFyICpkYXRhX2NvcHk7CisKKwlpZiAoY291bnQgPiBsaW5lNi0+bWF4X3BhY2tldF9zaXplICogTElORTZfUkFXX01FU1NBR0VTX01BWENPVU5UKSB7CisJCS8qIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IGxpbWl0IC0gc3RpbGwgYmV0dGVyIHRoYW4gbm90aGluZy4uLiAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYXRhX2NvcHkgPSBtZW1kdXBfdXNlcihkYXRhLCBjb3VudCk7CisJaWYgKElTX0VSUihFUlJfUFRSKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlydiA9IGxpbmU2X3NlbmRfcmF3X21lc3NhZ2UobGluZTYsIGRhdGFfY29weSwgY291bnQpOworCisJa2ZyZWUoZGF0YV9jb3B5KTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2h3ZGVwX29wcyBod2RlcF9vcHMgPSB7CisJLm9wZW4gICAgPSBsaW5lNl9od2RlcF9vcGVuLAorCS5yZWxlYXNlID0gbGluZTZfaHdkZXBfcmVsZWFzZSwKKwkucmVhZCAgICA9IGxpbmU2X2h3ZGVwX3JlYWQsCisJLndyaXRlICAgPSBsaW5lNl9od2RlcF93cml0ZSwKK307CisKKy8qIEluc2VydCBpbnRvIGNpcmN1bGFyIGJ1ZmZlciAqLworc3RhdGljIHZvaWQgbGluZTZfaHdkZXBfcHVzaF9tZXNzYWdlKHN0cnVjdCB1c2JfbGluZTYgKmxpbmU2KQoreworCWlmICghbGluZTYtPm1lc3NhZ2VzLmFjdGl2ZSkKKwkJcmV0dXJuOworCisJaWYgKGtmaWZvX2F2YWlsKCZsaW5lNi0+bWVzc2FnZXMuZmlmbykgPj0gbGluZTYtPm1lc3NhZ2VfbGVuZ3RoKSB7CisJCS8qIE5vIHJhY2UgY29uZGl0aW9uIGhlcmUsIHRoZXJlJ3Mgb25seSBvbmUgd3JpdGVyICovCisJCWtmaWZvX2luKCZsaW5lNi0+bWVzc2FnZXMuZmlmbywKKwkJCWxpbmU2LT5idWZmZXJfbWVzc2FnZSwgbGluZTYtPm1lc3NhZ2VfbGVuZ3RoKTsKKwl9IC8qIGVsc2UgVE9ETzogc2lnbmFsIG92ZXJmbG93ICovCisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmxpbmU2LT5tZXNzYWdlcy53YWl0X3F1ZXVlKTsKK30KKworc3RhdGljIGludCBsaW5lNl9od2RlcF9pbml0KHN0cnVjdCB1c2JfbGluZTYgKmxpbmU2KQoreworCWludCBlcnI7CisJc3RydWN0IHNuZF9od2RlcCAqaHdkZXA7CisKKwkvKiBUT0RPOiB1c2JfZHJpdmVyX2NsYWltX2ludGVyZmFjZSgpOyAqLworCWxpbmU2LT5wcm9jZXNzX21lc3NhZ2UgPSBsaW5lNl9od2RlcF9wdXNoX21lc3NhZ2U7CisJbGluZTYtPm1lc3NhZ2VzLmFjdGl2ZSA9IDA7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbGluZTYtPm1lc3NhZ2VzLndhaXRfcXVldWUpOworCW11dGV4X2luaXQoJmxpbmU2LT5tZXNzYWdlcy5yZWFkX2xvY2spOworCUlOSVRfS0ZJRk8obGluZTYtPm1lc3NhZ2VzLmZpZm8pOworCisJZXJyID0gc25kX2h3ZGVwX25ldyhsaW5lNi0+Y2FyZCwgImNvbmZpZyIsIDAsICZod2RlcCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZW5kOworCXN0cmNweShod2RlcC0+bmFtZSwgImNvbmZpZyIpOworCWh3ZGVwLT5pZmFjZSA9IFNORFJWX0hXREVQX0lGQUNFX0xJTkU2OworCWh3ZGVwLT5vcHMgPSBod2RlcF9vcHM7CisJaHdkZXAtPnByaXZhdGVfZGF0YSA9IGxpbmU2OworCWh3ZGVwLT5leGNsdXNpdmUgPSB0cnVlOworCitlbmQ6CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBsaW5lNl9pbml0X2NhcF9jb250cm9sKHN0cnVjdCB1c2JfbGluZTYgKmxpbmU2KQogewogCWludCByZXQ7CkBAIC00ODcsMTQgKzY2OSwyMCBAQAogCWlmICghbGluZTYtPmJ1ZmZlcl9saXN0ZW4pCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbGluZTYtPmJ1ZmZlcl9tZXNzYWdlID0ga21hbGxvYyhMSU5FNl9NRVNTQUdFX01BWExFTiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFsaW5lNi0+YnVmZmVyX21lc3NhZ2UpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJbGluZTYtPnVyYl9saXN0ZW4gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCWlmICghbGluZTYtPnVyYl9saXN0ZW4pCiAJCXJldHVybiAtRU5PTUVNOwogCisJaWYgKGxpbmU2LT5wcm9wZXJ0aWVzLT5jYXBhYmlsaXRpZXMgJiBMSU5FNl9DQVBfQ09OVFJPTF9NSURJKSB7CisJCWxpbmU2LT5idWZmZXJfbWVzc2FnZSA9IGttYWxsb2MoTElORTZfTUlESV9NRVNTQUdFX01BWExFTiwgR0ZQX0tFUk5FTCk7CisJCWlmICghbGluZTYtPmJ1ZmZlcl9tZXNzYWdlKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfSBlbHNlIHsKKwkJcmV0ID0gbGluZTZfaHdkZXBfaW5pdChsaW5lNik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKIAlyZXQgPSBsaW5lNl9zdGFydF9saXN0ZW4obGluZTYpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIobGluZTYtPmlmY2RldiwgImNhbm5vdCBzdGFydCBsaXN0ZW5pbmc6ICVkXG4iLCByZXQpOwpAQCAtNTU4LDYgKzc0Niw3IEBACiAJLyogcXVlcnkgaW50ZXJmYWNlIG51bWJlciAqLwogCWludGVyZmFjZV9udW1iZXIgPSBpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CiAKKwkvKiBUT0RPIHJlc2VydmVzIHRoZSBidXMgYmFuZHdpZHRoIGV2ZW4gd2l0aG91dCBhY3R1YWwgdHJhbnNmZXIgKi8KIAlyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZSh1c2JkZXYsIGludGVyZmFjZV9udW1iZXIsCiAJCQkJcHJvcGVydGllcy0+YWx0c2V0dGluZyk7CiAJaWYgKHJldCA8IDApIHsKQEAgLTU2NSw5ICs3NTQsOCBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCWxpbmU2X2dldF9pbnRlcnZhbChsaW5lNik7Ci0KIAlpZiAocHJvcGVydGllcy0+Y2FwYWJpbGl0aWVzICYgTElORTZfQ0FQX0NPTlRST0wpIHsKKwkJbGluZTZfZ2V0X2ludGVydmFsKGxpbmU2KTsKIAkJcmV0ID0gbGluZTZfaW5pdF9jYXBfY29udHJvbChsaW5lNik7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBlcnJvcjsKQEAgLTY3MCwzICs4NTgsNCBAQAogTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9saW5lNi9kcml2ZXIuaCBiL3NvdW5kL3VzYi9saW5lNi9kcml2ZXIuaAppbmRleCA3ZGE2NDNlLi43ZTNhM2FhIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbGluZTYvZHJpdmVyLmgKKysrIGIvc291bmQvdXNiL2xpbmU2L2RyaXZlci5oCkBAIC0xMiwyMSArMTIsMzcgQEAKICNpZm5kZWYgRFJJVkVSX0gKICNkZWZpbmUgRFJJVkVSX0gKIAotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KIAogI2luY2x1ZGUgIm1pZGkuaCIKIAotI2RlZmluZSBVU0JfSU5URVJWQUxTX1BFUl9TRUNPTkQgMTAwMAorLyogVVNCIDEuMSBzcGVlZCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIFVTQl9MT1dfSU5URVJWQUxTX1BFUl9TRUNPTkQgMTAwMAorI2RlZmluZSBVU0JfTE9XX0lTT19CVUZGRVJTIDIKKworLyogVVNCIDIuMCsgc3BlZWQgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBVU0JfSElHSF9JTlRFUlZBTFNfUEVSX1NFQ09ORCA4MDAwCisjZGVmaW5lIFVTQl9ISUdIX0lTT19CVUZGRVJTIDE2CiAKIC8qIEZhbGxiYWNrIFVTQiBpbnRlcnZhbCBhbmQgbWF4IHBhY2tldCBzaXplIHZhbHVlcyAqLwogI2RlZmluZSBMSU5FNl9GQUxMQkFDS19JTlRFUlZBTCAxMAogI2RlZmluZSBMSU5FNl9GQUxMQkFDS19NQVhQQUNLRVRTSVpFIDE2CiAKICNkZWZpbmUgTElORTZfVElNRU9VVCAxCi0jZGVmaW5lIExJTkU2X0JVRlNJWkVfTElTVEVOIDMyCi0jZGVmaW5lIExJTkU2X01FU1NBR0VfTUFYTEVOIDI1NgorI2RlZmluZSBMSU5FNl9CVUZTSVpFX0xJU1RFTiA2NAorI2RlZmluZSBMSU5FNl9NSURJX01FU1NBR0VfTUFYTEVOIDI1NgorCisjZGVmaW5lIExJTkU2X1JBV19NRVNTQUdFU19NQVhDT1VOVF9PUkRFUiA3CisvKiA0ayBwYWNrZXRzIGFyZSBjb21tb24sIEJVRlNJWkUgKiBNQVhDT1VOVCBzaG91bGQgYmUgYmlnZ2VyLi4uICovCisjZGVmaW5lIExJTkU2X1JBV19NRVNTQUdFU19NQVhDT1VOVCAoMSA8PCBMSU5FNl9SQVdfTUVTU0FHRVNfTUFYQ09VTlRfT1JERVIpCisKKworI2lmIExJTkU2X0JVRlNJWkVfTElTVEVOID4gNjU1MzUKKyNlcnJvciAiVXNlIGR5bmFtaWMgZmlmbyBpbnN0ZWFkIgorI2VuZGlmCiAKIC8qCiAJTGluZSA2IE1JREkgY29udHJvbCBjb21tYW5kcwpAQCAtOTQsOCArMTEwLDEyIEBACiAJTElORTZfQ0FQX0NPTlRST0wgPQkxIDw8IDAsCiAJLyogZGV2aWNlIHN1cHBvcnRzIFBDTSBpbnB1dC9vdXRwdXQgdmlhIFVTQiAqLwogCUxJTkU2X0NBUF9QQ00gPQkJMSA8PCAxLAotCS8qIGRldmljZSBzdXBwb3J0IGhhcmR3YXJlIG1vbml0b3JpbmcgKi8KKwkvKiBkZXZpY2Ugc3VwcG9ydHMgaGFyZHdhcmUgbW9uaXRvcmluZyAqLwogCUxJTkU2X0NBUF9IV01PTiA9CTEgPDwgMiwKKwkvKiBkZXZpY2UgcmVxdWlyZXMgb3V0cHV0IGRhdGEgd2hlbiBpbnB1dCBpcyByZWFkICovCisJTElORTZfQ0FQX0lOX05FRURTX09VVCA9IDEgPDwgMywKKwkvKiBkZXZpY2UgdXNlcyByYXcgTUlESSB2aWEgVVNCIChkYXRhIGVuZHBvaW50cykgKi8KKwlMSU5FNl9DQVBfQ09OVFJPTF9NSURJID0gMSA8PCA0LAogfTsKIAogLyoKQEAgLTEwOSwxMCArMTI5LDE1IEBACiAJLyogUHJvcGVydGllcyAqLwogCWNvbnN0IHN0cnVjdCBsaW5lNl9wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzOwogCi0JLyogSW50ZXJ2YWwgKG1zKSAqLworCS8qIEludGVydmFsIGZvciBkYXRhIFVTQiBwYWNrZXRzICovCiAJaW50IGludGVydmFsOworCS8qIC4uLmZvciBpc29jaHJvbm91cyB0cmFuc2ZlcnMgZnJhbWluZyAqLworCWludCBpbnRlcnZhbHNfcGVyX3NlY29uZDsKIAotCS8qIE1heGltdW0gc2l6ZSBvZiBVU0IgcGFja2V0ICovCisJLyogTnVtYmVyIG9mIGlzb2Nocm9ub3VzIFVSQnMgdXNlZCBmb3IgZnJhbWUgdHJhbnNmZXJzICovCisJaW50IGlzb19idWZmZXJzOworCisJLyogTWF4aW11bSBzaXplIG9mIGRhdGEgVVNCIHBhY2tldCAqLwogCWludCBtYXhfcGFja2V0X3NpemU7CiAKIAkvKiBEZXZpY2UgcmVwcmVzZW50aW5nIHRoZSBVU0IgaW50ZXJmYWNlICovCkBAIC0xMjksMTggKzE1NCwzMCBAQAogCS8qIExpbmUgNiBNSURJIGRldmljZSBkYXRhIHN0cnVjdHVyZSAqLwogCXN0cnVjdCBzbmRfbGluZTZfbWlkaSAqbGluZTZtaWRpOwogCi0JLyogVVJCIGZvciBsaXN0ZW5pbmcgdG8gUE9EeHQgUHJvIGNvbnRyb2wgZW5kcG9pbnQgKi8KKwkvKiBVUkIgZm9yIGxpc3RlbmluZyB0byBQT0QgZGF0YSBlbmRwb2ludCAqLwogCXN0cnVjdCB1cmIgKnVyYl9saXN0ZW47CiAKLQkvKiBCdWZmZXIgZm9yIGxpc3RlbmluZyB0byBQT0R4dCBQcm8gY29udHJvbCBlbmRwb2ludCAqLworCS8qIEJ1ZmZlciBmb3IgaW5jb21pbmcgZGF0YSBmcm9tIFBPRCBkYXRhIGVuZHBvaW50ICovCiAJdW5zaWduZWQgY2hhciAqYnVmZmVyX2xpc3RlbjsKIAotCS8qIEJ1ZmZlciBmb3IgbWVzc2FnZSB0byBiZSBwcm9jZXNzZWQgKi8KKwkvKiBCdWZmZXIgZm9yIG1lc3NhZ2UgdG8gYmUgcHJvY2Vzc2VkLCBnZW5lcmF0ZWQgZnJvbSBNSURJIGxheWVyICovCiAJdW5zaWduZWQgY2hhciAqYnVmZmVyX21lc3NhZ2U7CiAKLQkvKiBMZW5ndGggb2YgbWVzc2FnZSB0byBiZSBwcm9jZXNzZWQgKi8KKwkvKiBMZW5ndGggb2YgbWVzc2FnZSB0byBiZSBwcm9jZXNzZWQsIGdlbmVyYXRlZCBmcm9tIE1JREkgbGF5ZXIgICovCiAJaW50IG1lc3NhZ2VfbGVuZ3RoOwogCisJLyogQ2lyY3VsYXIgYnVmZmVyIGZvciBub24tTUlESSBjb250cm9sIG1lc3NhZ2VzICovCisJc3RydWN0IHsKKwkJc3RydWN0IG11dGV4IHJlYWRfbG9jazsKKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xdWV1ZTsKKwkJdW5zaWduZWQgaW50IGFjdGl2ZToxOworCQlTVFJVQ1RfS0ZJRk9fUkVDXzIoTElORTZfQlVGU0laRV9MSVNURU4gKiBMSU5FNl9SQVdfTUVTU0FHRVNfTUFYQ09VTlQpCisJCQlmaWZvOworCX0gbWVzc2FnZXM7CisKKwkvKiBJZiBNSURJIGlzIHN1cHBvcnRlZCwgYnVmZmVyX21lc3NhZ2UgY29udGFpbnMgdGhlIHByZS1wcm9jZXNzZWQgZGF0YTsKKwkgKiBvdGhlcndpc2UgdGhlIGRhdGEgaXMgb25seSBpbiB1cmJfbGlzdGVuIChidWZmZXJfaW5jb21pbmcpLgorCSAqLwogCXZvaWQgKCpwcm9jZXNzX21lc3NhZ2UpKHN0cnVjdCB1c2JfbGluZTYgKik7CiAJdm9pZCAoKmRpc2Nvbm5lY3QpKHN0cnVjdCB1c2JfbGluZTYgKmxpbmU2KTsKIH07CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbGluZTYvbWlkaS5jIGIvc291bmQvdXNiL2xpbmU2L21pZGkuYwppbmRleCBjZWJlYTliLi5kMGZiMmYyIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbGluZTYvbWlkaS5jCisrKyBiL3NvdW5kL3VzYi9saW5lNi9taWRpLmMKQEAgLTI1OCw3ICsyNTgsNyBAQAogCXN0cnVjdCBzbmRfcmF3bWlkaSAqcm1pZGk7CiAJc3RydWN0IHNuZF9saW5lNl9taWRpICpsaW5lNm1pZGk7CiAKLQlpZiAoIShsaW5lNi0+cHJvcGVydGllcy0+Y2FwYWJpbGl0aWVzICYgTElORTZfQ0FQX0NPTlRST0wpKSB7CisJaWYgKCEobGluZTYtPnByb3BlcnRpZXMtPmNhcGFiaWxpdGllcyAmIExJTkU2X0NBUF9DT05UUk9MX01JREkpKSB7CiAJCS8qIHNraXAgTUlESSBpbml0aWFsaXphdGlvbiBhbmQgcmVwb3J0IHN1Y2Nlc3MgKi8KIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2xpbmU2L3BjbS5jIGIvc291bmQvdXNiL2xpbmU2L3BjbS5jCmluZGV4IDIwNGNjMDcuLmZhYjUzZjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9saW5lNi9wY20uYworKysgYi9zb3VuZC91c2IvbGluZTYvcGNtLmMKQEAgLTUyLDEwICs1Miw5IEBACiAKIAlsaW5lNnBjbS0+aW1wdWxzZV92b2x1bWUgPSB2YWx1ZTsKIAlpZiAodmFsdWUgPiAwKSB7Ci0JCWVyciA9IGxpbmU2X3BjbV9hY3F1aXJlKGxpbmU2cGNtLCBMSU5FNl9TVFJFQU1fSU1QVUxTRSk7CisJCWVyciA9IGxpbmU2X3BjbV9hY3F1aXJlKGxpbmU2cGNtLCBMSU5FNl9TVFJFQU1fSU1QVUxTRSwgdHJ1ZSk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlsaW5lNnBjbS0+aW1wdWxzZV92b2x1bWUgPSAwOwotCQkJbGluZTZfcGNtX3JlbGVhc2UobGluZTZwY20sIExJTkU2X1NUUkVBTV9JTVBVTFNFKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9IGVsc2UgewpAQCAtMTA1LDcgKzEwNCw3IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTElORTZfSVNPX0JVRkZFUlM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBsaW5lNnBjbS0+bGluZTYtPmlzb19idWZmZXJzOyBpKyspIHsKIAkJaWYgKHRlc3RfYml0KGksICZwY21zLT5hY3RpdmVfdXJicykpIHsKIAkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChpLCAmcGNtcy0+dW5saW5rX3VyYnMpKQogCQkJCXVzYl91bmxpbmtfdXJiKHBjbXMtPnVyYnNbaV0pOwpAQCAtMTI1LDcgKzEyNCw3IEBACiAKIAlkbyB7CiAJCWFsaXZlID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IExJTkU2X0lTT19CVUZGRVJTOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IGxpbmU2cGNtLT5saW5lNi0+aXNvX2J1ZmZlcnM7IGkrKykgewogCQkJaWYgKHRlc3RfYml0KGksICZwY21zLT5hY3RpdmVfdXJicykpCiAJCQkJYWxpdmUrKzsKIAkJfQpAQCAtMTQ3LDE1ICsxNDYsMjAgQEAKIH0KIAogLyogYWxsb2NhdGUgYSBidWZmZXIgaWYgbm90IG9wZW5lZCB5ZXQ7Ci0gKiBjYWxsIHRoaXMgaW4gbGluZTZwY20uc3RhdGVfY2hhbmdlIG11dGV4CisgKiBjYWxsIHRoaXMgaW4gbGluZTZwY20uc3RhdGVfbXV0ZXgKICAqLwogc3RhdGljIGludCBsaW5lNl9idWZmZXJfYWNxdWlyZShzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20sCi0JCQkJc3RydWN0IGxpbmU2X3BjbV9zdHJlYW0gKnBzdHIsIGludCB0eXBlKQorCQkJCXN0cnVjdCBsaW5lNl9wY21fc3RyZWFtICpwc3RyLCBpbnQgZGlyZWN0aW9uLCBpbnQgdHlwZSkKIHsKKwljb25zdCBpbnQgcGt0X3NpemUgPQorCQkoZGlyZWN0aW9uID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spID8KKwkJCWxpbmU2cGNtLT5tYXhfcGFja2V0X3NpemVfb3V0IDoKKwkJCWxpbmU2cGNtLT5tYXhfcGFja2V0X3NpemVfaW47CisKIAkvKiBJbnZva2VkIG11bHRpcGxlIHRpbWVzIGluIGEgcm93IHNvIGFsbG9jYXRlIG9uY2Ugb25seSAqLwogCWlmICghdGVzdF9hbmRfc2V0X2JpdCh0eXBlLCAmcHN0ci0+b3BlbmVkKSAmJiAhcHN0ci0+YnVmZmVyKSB7Ci0JCXBzdHItPmJ1ZmZlciA9IGttYWxsb2MoTElORTZfSVNPX0JVRkZFUlMgKiBMSU5FNl9JU09fUEFDS0VUUyAqCi0JCQkJICAgICAgIGxpbmU2cGNtLT5tYXhfcGFja2V0X3NpemUsIEdGUF9LRVJORUwpOworCQlwc3RyLT5idWZmZXIgPSBrbWFsbG9jKGxpbmU2cGNtLT5saW5lNi0+aXNvX2J1ZmZlcnMgKgorCQkJCSAgICAgICBMSU5FNl9JU09fUEFDS0VUUyAqIHBrdF9zaXplLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFwc3RyLT5idWZmZXIpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0xNjMsMTIgKzE2NywxMSBAQAogfQogCiAvKiBmcmVlIGEgYnVmZmVyIGlmIGFsbCBzdHJlYW1zIGFyZSBjbG9zZWQ7Ci0gKiBjYWxsIHRoaXMgaW4gbGluZTZwY20uc3RhdGVfY2hhbmdlIG11dGV4CisgKiBjYWxsIHRoaXMgaW4gbGluZTZwY20uc3RhdGVfbXV0ZXgKICAqLwogc3RhdGljIHZvaWQgbGluZTZfYnVmZmVyX3JlbGVhc2Uoc3RydWN0IHNuZF9saW5lNl9wY20gKmxpbmU2cGNtLAogCQkJCSBzdHJ1Y3QgbGluZTZfcGNtX3N0cmVhbSAqcHN0ciwgaW50IHR5cGUpCiB7Ci0KIAljbGVhcl9iaXQodHlwZSwgJnBzdHItPm9wZW5lZCk7CiAJaWYgKCFwc3RyLT5vcGVuZWQpIHsKIAkJbGluZTZfd2FpdF9jbGVhcl9hdWRpb191cmJzKGxpbmU2cGNtLCBwc3RyKTsKQEAgLTE5NSw2ICsxOTgsNyBAQAogCQllbHNlCiAJCQlyZXQgPSBsaW5lNl9zdWJtaXRfYXVkaW9faW5fYWxsX3VyYnMobGluZTZwY20pOwogCX0KKwogCWlmIChyZXQgPCAwKQogCQljbGVhcl9iaXQodHlwZSwgJnBzdHItPnJ1bm5pbmcpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzdHItPmxvY2ssIGZsYWdzKTsKQEAgLTIxMSw3ICsyMTUsOSBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZwc3RyLT5sb2NrLCBmbGFncyk7CiAJY2xlYXJfYml0KHR5cGUsICZwc3RyLT5ydW5uaW5nKTsKIAlpZiAoIXBzdHItPnJ1bm5pbmcpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHN0ci0+bG9jaywgZmxhZ3MpOwogCQlsaW5lNl91bmxpbmtfYXVkaW9fdXJicyhsaW5lNnBjbSwgcHN0cik7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwc3RyLT5sb2NrLCBmbGFncyk7CiAJCWlmIChkaXJlY3Rpb24gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7CiAJCQlsaW5lNnBjbS0+cHJldl9mYnVmID0gTlVMTDsKIAkJCWxpbmU2cGNtLT5wcmV2X2ZzaXplID0gMDsKQEAgLTIzNiw2ICsyNDIsMTQgQEAKIAkJc3dpdGNoIChjbWQpIHsKIAkJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKIAkJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisJCQlpZiAocy0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSAmJgorCQkJCShsaW5lNnBjbS0+bGluZTYtPnByb3BlcnRpZXMtPmNhcGFiaWxpdGllcyAmCisJCQkJCUxJTkU2X0NBUF9JTl9ORUVEU19PVVQpKSB7CisJCQkJZXJyID0gbGluZTZfc3RyZWFtX3N0YXJ0KGxpbmU2cGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAorCQkJCQkJIExJTkU2X1NUUkVBTV9DQVBUVVJFX0hFTFBFUik7CisJCQkJaWYgKGVyciA8IDApCisJCQkJCXJldHVybiBlcnI7CisJCQl9CiAJCQllcnIgPSBsaW5lNl9zdHJlYW1fc3RhcnQobGluZTZwY20sIHMtPnN0cmVhbSwKIAkJCQkJCSBMSU5FNl9TVFJFQU1fUENNKTsKIAkJCWlmIChlcnIgPCAwKQpAQCAtMjQ0LDYgKzI1OCwxMiBAQAogCiAJCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKIAkJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCQkJaWYgKHMtPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUgJiYKKwkJCQkobGluZTZwY20tPmxpbmU2LT5wcm9wZXJ0aWVzLT5jYXBhYmlsaXRpZXMgJgorCQkJCQlMSU5FNl9DQVBfSU5fTkVFRFNfT1VUKSkgeworCQkJCWxpbmU2X3N0cmVhbV9zdG9wKGxpbmU2cGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAorCQkJCQkgIExJTkU2X1NUUkVBTV9DQVBUVVJFX0hFTFBFUik7CisJCQl9CiAJCQlsaW5lNl9zdHJlYW1fc3RvcChsaW5lNnBjbSwgcy0+c3RyZWFtLAogCQkJCQkgIExJTkU2X1NUUkVBTV9QQ00pOwogCQkJYnJlYWs7CkBAIC0yNzcsMjcgKzI5NywzMCBAQAogCXJldHVybiBwc3RyLT5wb3NfZG9uZTsKIH0KIAotLyogQWNxdWlyZSBhbmQgc3RhcnQgZHVwbGV4IHN0cmVhbXM6CisvKiBBY3F1aXJlIGFuZCBvcHRpb25hbGx5IHN0YXJ0IGR1cGxleCBzdHJlYW1zOgogICogdHlwZSBpcyBlaXRoZXIgTElORTZfU1RSRUFNX0lNUFVMU0Ugb3IgTElORTZfU1RSRUFNX01PTklUT1IKICAqLwotaW50IGxpbmU2X3BjbV9hY3F1aXJlKHN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSwgaW50IHR5cGUpCitpbnQgbGluZTZfcGNtX2FjcXVpcmUoc3RydWN0IHNuZF9saW5lNl9wY20gKmxpbmU2cGNtLCBpbnQgdHlwZSwgYm9vbCBzdGFydCkKIHsKIAlzdHJ1Y3QgbGluZTZfcGNtX3N0cmVhbSAqcHN0cjsKIAlpbnQgcmV0ID0gMCwgZGlyOwogCisJLyogVE9ETzogV2Ugc2hvdWxkIGFzc2VydCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLL0NBUFRVUkUgPT0gMC8xICovCiAJbXV0ZXhfbG9jaygmbGluZTZwY20tPnN0YXRlX211dGV4KTsKIAlmb3IgKGRpciA9IDA7IGRpciA8IDI7IGRpcisrKSB7CiAJCXBzdHIgPSBnZXRfc3RyZWFtKGxpbmU2cGNtLCBkaXIpOwotCQlyZXQgPSBsaW5lNl9idWZmZXJfYWNxdWlyZShsaW5lNnBjbSwgcHN0ciwgdHlwZSk7CisJCXJldCA9IGxpbmU2X2J1ZmZlcl9hY3F1aXJlKGxpbmU2cGNtLCBwc3RyLCBkaXIsIHR5cGUpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZXJyb3I7CiAJCWlmICghcHN0ci0+cnVubmluZykKIAkJCWxpbmU2X3dhaXRfY2xlYXJfYXVkaW9fdXJicyhsaW5lNnBjbSwgcHN0cik7CiAJfQotCWZvciAoZGlyID0gMDsgZGlyIDwgMjsgZGlyKyspIHsKLQkJcmV0ID0gbGluZTZfc3RyZWFtX3N0YXJ0KGxpbmU2cGNtLCBkaXIsIHR5cGUpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXJyb3I7CisJaWYgKHN0YXJ0KSB7CisJCWZvciAoZGlyID0gMDsgZGlyIDwgMjsgZGlyKyspIHsKKwkJCXJldCA9IGxpbmU2X3N0cmVhbV9zdGFydChsaW5lNnBjbSwgZGlyLCB0eXBlKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCX0KIAl9CiAgZXJyb3I6CiAJbXV0ZXhfdW5sb2NrKCZsaW5lNnBjbS0+c3RhdGVfbXV0ZXgpOwpAQCAtMzMzLDcgKzM1Niw4IEBACiAJc3RydWN0IGxpbmU2X3BjbV9zdHJlYW0gKnBzdHIgPSBnZXRfc3RyZWFtKGxpbmU2cGNtLCBzdWJzdHJlYW0tPnN0cmVhbSk7CiAKIAltdXRleF9sb2NrKCZsaW5lNnBjbS0+c3RhdGVfbXV0ZXgpOwotCXJldCA9IGxpbmU2X2J1ZmZlcl9hY3F1aXJlKGxpbmU2cGNtLCBwc3RyLCBMSU5FNl9TVFJFQU1fUENNKTsKKwlyZXQgPSBsaW5lNl9idWZmZXJfYWNxdWlyZShsaW5lNnBjbSwgcHN0ciwgc3Vic3RyZWFtLT5zdHJlYW0sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgTElORTZfU1RSRUFNX1BDTSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTQzMywyNCArNDU3LDMwIEBACiAvKgogCUNsZWFudXAgdGhlIFBDTSBkZXZpY2UuCiAqLwotc3RhdGljIHZvaWQgY2xlYW51cF91cmJzKHN0cnVjdCBsaW5lNl9wY21fc3RyZWFtICpwY21zKQorc3RhdGljIHZvaWQgY2xlYW51cF91cmJzKHN0cnVjdCBsaW5lNl9wY21fc3RyZWFtICpwY21zLCBpbnQgaXNvX2J1ZmZlcnMpCiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTElORTZfSVNPX0JVRkZFUlM7IGkrKykgeworCS8qIE1vc3QgbGlrZWx5IGltcG9zc2libGUgaW4gY3VycmVudCBjb2RlLi4uICovCisJaWYgKHBjbXMtPnVyYnMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IGlzb19idWZmZXJzOyBpKyspIHsKIAkJaWYgKHBjbXMtPnVyYnNbaV0pIHsKIAkJCXVzYl9raWxsX3VyYihwY21zLT51cmJzW2ldKTsKIAkJCXVzYl9mcmVlX3VyYihwY21zLT51cmJzW2ldKTsKIAkJfQogCX0KKwlrZnJlZShwY21zLT51cmJzKTsKKwlwY21zLT51cmJzID0gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgbGluZTZfY2xlYW51cF9wY20oc3RydWN0IHNuZF9wY20gKnBjbSkKIHsKIAlzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20gPSBzbmRfcGNtX2NoaXAocGNtKTsKIAotCWNsZWFudXBfdXJicygmbGluZTZwY20tPm91dCk7Ci0JY2xlYW51cF91cmJzKCZsaW5lNnBjbS0+aW4pOworCWNsZWFudXBfdXJicygmbGluZTZwY20tPm91dCwgbGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVycyk7CisJY2xlYW51cF91cmJzKCZsaW5lNnBjbS0+aW4sIGxpbmU2cGNtLT5saW5lNi0+aXNvX2J1ZmZlcnMpOwogCWtmcmVlKGxpbmU2cGNtKTsKIH0KIApAQCAtNTIyLDEyICs1NTIsMTIgQEAKIAlsaW5lNnBjbS0+dm9sdW1lX21vbml0b3IgPSAyNTU7CiAJbGluZTZwY20tPmxpbmU2ID0gbGluZTY7CiAKLQkvKiBSZWFkIGFuZCB3cml0ZSBidWZmZXJzIGFyZSBzaXplZCBpZGVudGljYWxseSwgc28gY2hvb3NlIG1pbmltdW0gKi8KLQlsaW5lNnBjbS0+bWF4X3BhY2tldF9zaXplID0gbWluKAotCQkJdXNiX21heHBhY2tldChsaW5lNi0+dXNiZGV2LAotCQkJCXVzYl9yY3Zpc29jcGlwZShsaW5lNi0+dXNiZGV2LCBlcF9yZWFkKSwgMCksCi0JCQl1c2JfbWF4cGFja2V0KGxpbmU2LT51c2JkZXYsCi0JCQkJdXNiX3NuZGlzb2NwaXBlKGxpbmU2LT51c2JkZXYsIGVwX3dyaXRlKSwgMSkpOworCWxpbmU2cGNtLT5tYXhfcGFja2V0X3NpemVfaW4gPQorCQl1c2JfbWF4cGFja2V0KGxpbmU2LT51c2JkZXYsCisJCQl1c2JfcmN2aXNvY3BpcGUobGluZTYtPnVzYmRldiwgZXBfcmVhZCksIDApOworCWxpbmU2cGNtLT5tYXhfcGFja2V0X3NpemVfb3V0ID0KKwkJdXNiX21heHBhY2tldChsaW5lNi0+dXNiZGV2LAorCQkJdXNiX3NuZGlzb2NwaXBlKGxpbmU2LT51c2JkZXYsIGVwX3dyaXRlKSwgMSk7CiAKIAlzcGluX2xvY2tfaW5pdCgmbGluZTZwY20tPm91dC5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmbGluZTZwY20tPmluLmxvY2spOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2xpbmU2L3BjbS5oIGIvc291bmQvdXNiL2xpbmU2L3BjbS5oCmluZGV4IDUwODQxMGEuLmJiMGM5Y2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9saW5lNi9wY20uaAorKysgYi9zb3VuZC91c2IvbGluZTYvcGNtLmgKQEAgLTIwLDkgKzIwLDYgQEAKIAogI2luY2x1ZGUgImRyaXZlci5oIgogCi0vKiBudW1iZXIgb2YgVVJCcyAqLwotI2RlZmluZSBMSU5FNl9JU09fQlVGRkVSUwkyCi0KIC8qCiAJbnVtYmVyIG9mIFVTQiBmcmFtZXMgcGVyIFVSQgogCVRoZSBMaW5lIDYgV2luZG93cyBkcml2ZXIgYWx3YXlzIHRyYW5zbWl0cyB0d28gZnJhbWVzIHBlciBwYWNrZXQsIGJ1dApAQCAtMzEsNyArMjgsOSBAQAogKi8KICNkZWZpbmUgTElORTZfSVNPX1BBQ0tFVFMJMQogCi0vKiBpbiBhICJmdWxsIHNwZWVkIiBkZXZpY2UgKHN1Y2ggYXMgdGhlIFBPRHh0IFBybykgdGhpcyBtZWFucyAxbXMgKi8KKy8qIGluIGEgImZ1bGwgc3BlZWQiIGRldmljZSAoc3VjaCBhcyB0aGUgUE9EeHQgUHJvKSB0aGlzIG1lYW5zIDFtcywKKyAqICBmb3IgImhpZ2ggc3BlZWQiIGl0J3MgMS84bXMKKyAqLwogI2RlZmluZSBMSU5FNl9JU09fSU5URVJWQUwJMQogCiAjZGVmaW5lIExJTkU2X0lNUFVMU0VfREVGQVVMVF9QRVJJT0QgMTAwCkBAIC03NCw2ICs3Myw3IEBACiAJTElORTZfU1RSRUFNX1BDTSwKIAlMSU5FNl9TVFJFQU1fTU9OSVRPUiwKIAlMSU5FNl9TVFJFQU1fSU1QVUxTRSwKKwlMSU5FNl9TVFJFQU1fQ0FQVFVSRV9IRUxQRVIsCiB9OwogCiAvKiBtaXNjIGJpdCBmbGFncyBmb3IgUENNIG9wZXJhdGlvbiAqLwpAQCAtODUsMTIgKzg1LDEyIEBACiBzdHJ1Y3QgbGluZTZfcGNtX3Byb3BlcnRpZXMgewogCXN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHBsYXliYWNrX2h3LCBjYXB0dXJlX2h3OwogCXN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfcmF0ZGVucyByYXRlczsKLQlpbnQgYnl0ZXNfcGVyX2ZyYW1lOworCWludCBieXRlc19wZXJfY2hhbm5lbDsKIH07CiAKIHN0cnVjdCBsaW5lNl9wY21fc3RyZWFtIHsKIAkvKiBhbGxvY2F0ZWQgVVJCcyAqLwotCXN0cnVjdCB1cmIgKnVyYnNbTElORTZfSVNPX0JVRkZFUlNdOworCXN0cnVjdCB1cmIgKip1cmJzOwogCiAJLyogVGVtcG9yYXJ5IGJ1ZmZlcjsKIAkgKiBTaW5jZSB0aGUgcGFja2V0IHNpemUgaXMgbm90IGtub3duIGluIGFkdmFuY2UsIHRoaXMgYnVmZmVyIGlzCkBAIC0xNTcsMTEgKzE1NywxMiBAQAogCS8qIFByZXZpb3VzbHkgY2FwdHVyZWQgZnJhbWUgKGZvciBzb2Z0d2FyZSBtb25pdG9yaW5nKSAqLwogCXVuc2lnbmVkIGNoYXIgKnByZXZfZmJ1ZjsKIAotCS8qIFNpemUgb2YgcHJldmlvdXNseSBjYXB0dXJlZCBmcmFtZSAoZm9yIHNvZnR3YXJlIG1vbml0b3JpbmcpICovCisJLyogU2l6ZSBvZiBwcmV2aW91c2x5IGNhcHR1cmVkIGZyYW1lIChmb3Igc29mdHdhcmUgbW9uaXRvcmluZy9zeW5jKSAqLwogCWludCBwcmV2X2ZzaXplOwogCiAJLyogTWF4aW11bSBzaXplIG9mIFVTQiBwYWNrZXQgKi8KLQlpbnQgbWF4X3BhY2tldF9zaXplOworCWludCBtYXhfcGFja2V0X3NpemVfaW47CisJaW50IG1heF9wYWNrZXRfc2l6ZV9vdXQ7CiAKIAkvKiBQQ00gcGxheWJhY2sgdm9sdW1lIChsZWZ0IGFuZCByaWdodCkgKi8KIAlpbnQgdm9sdW1lX3BsYXliYWNrWzJdOwpAQCAtMTkxLDcgKzE5Miw4IEBACiBleHRlcm4gaW50IHNuZF9saW5lNl9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKIGV4dGVybiBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfbGluZTZfcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7CiBleHRlcm4gdm9pZCBsaW5lNl9wY21fZGlzY29ubmVjdChzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20pOwotZXh0ZXJuIGludCBsaW5lNl9wY21fYWNxdWlyZShzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20sIGludCB0eXBlKTsKK2V4dGVybiBpbnQgbGluZTZfcGNtX2FjcXVpcmUoc3RydWN0IHNuZF9saW5lNl9wY20gKmxpbmU2cGNtLCBpbnQgdHlwZSwKKwkJCSAgICAgICBib29sIHN0YXJ0KTsKIGV4dGVybiB2b2lkIGxpbmU2X3BjbV9yZWxlYXNlKHN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSwgaW50IHR5cGUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9saW5lNi9wbGF5YmFjay5jIGIvc291bmQvdXNiL2xpbmU2L3BsYXliYWNrLmMKaW5kZXggOTdlZDU5My4uODEyZDE4MSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2xpbmU2L3BsYXliYWNrLmMKKysrIGIvc291bmQvdXNiL2xpbmU2L3BsYXliYWNrLmMKQEAgLTE0NiwxOCArMTQ2LDIwIEBACiAJaW50IGluZGV4OwogCWludCBpLCB1cmJfc2l6ZSwgdXJiX2ZyYW1lczsKIAlpbnQgcmV0OwotCWNvbnN0IGludCBieXRlc19wZXJfZnJhbWUgPSBsaW5lNnBjbS0+cHJvcGVydGllcy0+Ynl0ZXNfcGVyX2ZyYW1lOworCWNvbnN0IGludCBieXRlc19wZXJfZnJhbWUgPQorCQlsaW5lNnBjbS0+cHJvcGVydGllcy0+Ynl0ZXNfcGVyX2NoYW5uZWwgKgorCQlsaW5lNnBjbS0+cHJvcGVydGllcy0+cGxheWJhY2tfaHcuY2hhbm5lbHNfbWF4OwogCWNvbnN0IGludCBmcmFtZV9pbmNyZW1lbnQgPQogCQlsaW5lNnBjbS0+cHJvcGVydGllcy0+cmF0ZXMucmF0c1swXS5udW1fbWluOwogCWNvbnN0IGludCBmcmFtZV9mYWN0b3IgPQogCQlsaW5lNnBjbS0+cHJvcGVydGllcy0+cmF0ZXMucmF0c1swXS5kZW4gKgotCQkoVVNCX0lOVEVSVkFMU19QRVJfU0VDT05EIC8gTElORTZfSVNPX0lOVEVSVkFMKTsKKwkJKGxpbmU2cGNtLT5saW5lNi0+aW50ZXJ2YWxzX3Blcl9zZWNvbmQgLyBMSU5FNl9JU09fSU5URVJWQUwpOwogCXN0cnVjdCB1cmIgKnVyYl9vdXQ7CiAKLQlpbmRleCA9Ci0JICAgIGZpbmRfZmlyc3RfemVyb19iaXQoJmxpbmU2cGNtLT5vdXQuYWN0aXZlX3VyYnMsIExJTkU2X0lTT19CVUZGRVJTKTsKKwlpbmRleCA9IGZpbmRfZmlyc3RfemVyb19iaXQoJmxpbmU2cGNtLT5vdXQuYWN0aXZlX3VyYnMsCisJCQkJICAgIGxpbmU2cGNtLT5saW5lNi0+aXNvX2J1ZmZlcnMpOwogCi0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBMSU5FNl9JU09fQlVGRkVSUykgeworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVycykgewogCQlkZXZfZXJyKGxpbmU2cGNtLT5saW5lNi0+aWZjZGV2LCAibm8gZnJlZSBVUkIgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNjUsNiArMTY3LDcgQEAKIAl1cmJfb3V0ID0gbGluZTZwY20tPm91dC51cmJzW2luZGV4XTsKIAl1cmJfc2l6ZSA9IDA7CiAKKwkvKiBUT0RPOiB0aGlzIG1heSBub3Qgd29yayBmb3IgTElORTZfSVNPX1BBQ0tFVFMgIT0gMSAqLwogCWZvciAoaSA9IDA7IGkgPCBMSU5FNl9JU09fUEFDS0VUUzsgKytpKSB7CiAJCS8qIGNvbXB1dGUgZnJhbWUgc2l6ZSBmb3IgZ2l2ZW4gc2FtcGxpbmcgcmF0ZSAqLwogCQlpbnQgZnNpemUgPSAwOwpAQCAtMTc4LDkgKzE4MSwxMSBAQAogCQkJbGluZTZwY20tPm91dC5jb3VudCArPSBmcmFtZV9pbmNyZW1lbnQ7CiAJCQluID0gbGluZTZwY20tPm91dC5jb3VudCAvIGZyYW1lX2ZhY3RvcjsKIAkJCWxpbmU2cGNtLT5vdXQuY291bnQgLT0gbiAqIGZyYW1lX2ZhY3RvcjsKLQkJCWZzaXplID0gbiAqIGJ5dGVzX3Blcl9mcmFtZTsKKwkJCWZzaXplID0gbjsKIAkJfQogCisJCWZzaXplICo9IGJ5dGVzX3Blcl9mcmFtZTsKKwogCQlmb3V0LT5vZmZzZXQgPSB1cmJfc2l6ZTsKIAkJZm91dC0+bGVuZ3RoID0gZnNpemU7CiAJCXVyYl9zaXplICs9IGZzaXplOwpAQCAtMTk1LDcgKzIwMCw3IEBACiAJdXJiX2ZyYW1lcyA9IHVyYl9zaXplIC8gYnl0ZXNfcGVyX2ZyYW1lOwogCXVyYl9vdXQtPnRyYW5zZmVyX2J1ZmZlciA9CiAJICAgIGxpbmU2cGNtLT5vdXQuYnVmZmVyICsKLQkgICAgaW5kZXggKiBMSU5FNl9JU09fUEFDS0VUUyAqIGxpbmU2cGNtLT5tYXhfcGFja2V0X3NpemU7CisJICAgIGluZGV4ICogTElORTZfSVNPX1BBQ0tFVFMgKiBsaW5lNnBjbS0+bWF4X3BhY2tldF9zaXplX291dDsKIAl1cmJfb3V0LT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gdXJiX3NpemU7CiAJdXJiX291dC0+Y29udGV4dCA9IGxpbmU2cGNtOwogCkBAIC0yODYsNyArMjkxLDcgQEAKIHsKIAlpbnQgcmV0ID0gMCwgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBMSU5FNl9JU09fQlVGRkVSUzsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IGxpbmU2cGNtLT5saW5lNi0+aXNvX2J1ZmZlcnM7ICsraSkgewogCQlyZXQgPSBzdWJtaXRfYXVkaW9fb3V0X3VyYihsaW5lNnBjbSk7CiAJCWlmIChyZXQgPCAwKQogCQkJYnJlYWs7CkBAIC0zMDUsNiArMzEwLDkgQEAKIAlzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20gPSAoc3RydWN0IHNuZF9saW5lNl9wY20gKil1cmItPmNvbnRleHQ7CiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPQogCSAgICBnZXRfc3Vic3RyZWFtKGxpbmU2cGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKTsKKwljb25zdCBpbnQgYnl0ZXNfcGVyX2ZyYW1lID0KKwkJbGluZTZwY20tPnByb3BlcnRpZXMtPmJ5dGVzX3Blcl9jaGFubmVsICoKKwkJbGluZTZwY20tPnByb3BlcnRpZXMtPnBsYXliYWNrX2h3LmNoYW5uZWxzX21heDsKIAogI2lmIFVTRV9DTEVBUl9CVUZGRVJfV09SS0FST1VORAogCW1lbXNldCh1cmItPnRyYW5zZmVyX2J1ZmZlciwgMCwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKQEAgLTMxMywxMSArMzIxLDExIEBACiAJbGluZTZwY20tPm91dC5sYXN0X2ZyYW1lID0gdXJiLT5zdGFydF9mcmFtZTsKIAogCS8qIGZpbmQgaW5kZXggb2YgVVJCICovCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTElORTZfSVNPX0JVRkZFUlM7IGluZGV4KyspCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVyczsgaW5kZXgrKykKIAkJaWYgKHVyYiA9PSBsaW5lNnBjbS0+b3V0LnVyYnNbaW5kZXhdKQogCQkJYnJlYWs7CiAKLQlpZiAoaW5kZXggPj0gTElORTZfSVNPX0JVRkZFUlMpCisJaWYgKGluZGV4ID49IGxpbmU2cGNtLT5saW5lNi0+aXNvX2J1ZmZlcnMpCiAJCXJldHVybjsJCS8qIFVSQiBoYXMgYmVlbiB1bmxpbmtlZCBhc3luY2hyb25vdXNseSAqLwogCiAJZm9yIChpID0gMDsgaSA8IExJTkU2X0lTT19QQUNLRVRTOyBpKyspCkBAIC0zMjksNyArMzM3LDcgQEAKIAkJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAogCQlsaW5lNnBjbS0+b3V0LnBvc19kb25lICs9Ci0JCSAgICBsZW5ndGggLyBsaW5lNnBjbS0+cHJvcGVydGllcy0+Ynl0ZXNfcGVyX2ZyYW1lOworCQkgICAgbGVuZ3RoIC8gYnl0ZXNfcGVyX2ZyYW1lOwogCiAJCWlmIChsaW5lNnBjbS0+b3V0LnBvc19kb25lID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQogCQkJbGluZTZwY20tPm91dC5wb3NfZG9uZSAtPSBydW50aW1lLT5idWZmZXJfc2l6ZTsKQEAgLTQwMSw4ICs0MDksMTMgQEAKIAlzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiA9IGxpbmU2cGNtLT5saW5lNjsKIAlpbnQgaTsKIAorCWxpbmU2cGNtLT5vdXQudXJicyA9IGt6YWxsb2MoCisJCXNpemVvZihzdHJ1Y3QgdXJiICopICogbGluZTYtPmlzb19idWZmZXJzLCBHRlBfS0VSTkVMKTsKKwlpZiAobGluZTZwY20tPm91dC51cmJzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCiAJLyogY3JlYXRlIGF1ZGlvIFVSQnMgYW5kIGZpbGwgaW4gY29uc3RhbnQgdmFsdWVzOiAqLwotCWZvciAoaSA9IDA7IGkgPCBMSU5FNl9JU09fQlVGRkVSUzsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IGxpbmU2LT5pc29fYnVmZmVyczsgKytpKSB7CiAJCXN0cnVjdCB1cmIgKnVyYjsKIAogCQkvKiBVUkIgZm9yIGF1ZGlvIG91dDogKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9saW5lNi9wb2QuYyBiL3NvdW5kL3VzYi9saW5lNi9wb2QuYwppbmRleCBkYWY4MWQxLi4xN2FhNjE2IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbGluZTYvcG9kLmMKKysrIGIvc291bmQvdXNiL2xpbmU2L3BvZC5jCkBAIC04Myw3ICs4Myw2IEBACiB9OwogCiAjZGVmaW5lIFBPRF9TWVNFWF9DT0RFIDMKLSNkZWZpbmUgUE9EX0JZVEVTX1BFUl9GUkFNRSA2CS8qIDI0Yml0IGF1ZGlvIChzdGVyZW8pICovCiAKIC8qICpJTkRFTlQtT0ZGKiAqLwogCkBAIC0xNjcsNyArMTY2LDcgQEAKIAkucmF0ZXMgPSB7CiAJCQkgICAgLm5yYXRzID0gMSwKIAkJCSAgICAucmF0cyA9ICZwb2RfcmF0ZGVufSwKLQkuYnl0ZXNfcGVyX2ZyYW1lID0gUE9EX0JZVEVTX1BFUl9GUkFNRQorCS5ieXRlc19wZXJfY2hhbm5lbCA9IDMgLyogU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFICovCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciBwb2RfdmVyc2lvbl9oZWFkZXJbXSA9IHsKQEAgLTI0NCw4ICsyNDMsOCBAQAogc3RhdGljIHNzaXplX3Qgc2VyaWFsX251bWJlcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKLQlzdHJ1Y3QgdXNiX2xpbmU2X3BvZCAqcG9kID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl90b19zbmRfY2FyZChkZXYpOworCXN0cnVjdCB1c2JfbGluZTZfcG9kICpwb2QgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgcG9kLT5zZXJpYWxfbnVtYmVyKTsKIH0KQEAgLTI1Niw4ICsyNTUsOCBAQAogc3RhdGljIHNzaXplX3QgZmlybXdhcmVfdmVyc2lvbl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKLQlzdHJ1Y3QgdXNiX2xpbmU2X3BvZCAqcG9kID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl90b19zbmRfY2FyZChkZXYpOworCXN0cnVjdCB1c2JfbGluZTZfcG9kICpwb2QgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZC4lMDJkXG4iLCBwb2QtPmZpcm13YXJlX3ZlcnNpb24gLyAxMDAsCiAJCSAgICAgICBwb2QtPmZpcm13YXJlX3ZlcnNpb24gJSAxMDApOwpAQCAtMjY5LDggKzI2OCw4IEBACiBzdGF0aWMgc3NpemVfdCBkZXZpY2VfaWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UgPSB0b191c2JfaW50ZXJmYWNlKGRldik7Ci0Jc3RydWN0IHVzYl9saW5lNl9wb2QgKnBvZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZfdG9fc25kX2NhcmQoZGV2KTsKKwlzdHJ1Y3QgdXNiX2xpbmU2X3BvZCAqcG9kID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHBvZC0+ZGV2aWNlX2lkKTsKIH0KQEAgLTQ3Niw2ICs0NzUsNyBAQAogCQkuaWQgPSAiQmFzc1BPRHh0IiwKIAkJLm5hbWUgPSAiQmFzc1BPRHh0IiwKIAkJLmNhcGFiaWxpdGllcwk9IExJTkU2X0NBUF9DT05UUk9MCisJCQkJfCBMSU5FNl9DQVBfQ09OVFJPTF9NSURJCiAJCQkJfCBMSU5FNl9DQVBfUENNCiAJCQkJfCBMSU5FNl9DQVBfSFdNT04sCiAJCS5hbHRzZXR0aW5nID0gNSwKQEAgLTQ4OCw2ICs0ODgsNyBAQAogCQkuaWQgPSAiQmFzc1BPRHh0TGl2ZSIsCiAJCS5uYW1lID0gIkJhc3NQT0R4dCBMaXZlIiwKIAkJLmNhcGFiaWxpdGllcwk9IExJTkU2X0NBUF9DT05UUk9MCisJCQkJfCBMSU5FNl9DQVBfQ09OVFJPTF9NSURJCiAJCQkJfCBMSU5FNl9DQVBfUENNCiAJCQkJfCBMSU5FNl9DQVBfSFdNT04sCiAJCS5hbHRzZXR0aW5nID0gMSwKQEAgLTUwMCw2ICs1MDEsNyBAQAogCQkuaWQgPSAiQmFzc1BPRHh0UHJvIiwKIAkJLm5hbWUgPSAiQmFzc1BPRHh0IFBybyIsCiAJCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfQ09OVFJPTAorCQkJCXwgTElORTZfQ0FQX0NPTlRST0xfTUlESQogCQkJCXwgTElORTZfQ0FQX1BDTQogCQkJCXwgTElORTZfQ0FQX0hXTU9OLAogCQkuYWx0c2V0dGluZyA9IDUsCkBAIC01MTEsNyArNTEzLDggQEAKIAlbTElORTZfUE9DS0VUUE9EXSA9IHsKIAkJLmlkID0gIlBvY2tldFBPRCIsCiAJCS5uYW1lID0gIlBvY2tldCBQT0QiLAotCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX0NPTlRST0wsCisJCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfQ09OVFJPTAorCQkJCXwgTElORTZfQ0FQX0NPTlRST0xfTUlESSwKIAkJLmFsdHNldHRpbmcgPSAwLAogCQkuZXBfY3RybF9yID0gMHg4MiwKIAkJLmVwX2N0cmxfdyA9IDB4MDIsCkBAIC01MjEsNiArNTI0LDcgQEAKIAkJLmlkID0gIlBPRHh0IiwKIAkJLm5hbWUgPSAiUE9EeHQiLAogCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX0NPTlRST0wKKwkJCQl8IExJTkU2X0NBUF9DT05UUk9MX01JREkKIAkJCQl8IExJTkU2X0NBUF9QQ00KIAkJCQl8IExJTkU2X0NBUF9IV01PTiwKIAkJLmFsdHNldHRpbmcgPSA1LApAQCAtNTMzLDYgKzUzNyw3IEBACiAJCS5pZCA9ICJQT0R4dExpdmUiLAogCQkubmFtZSA9ICJQT0R4dCBMaXZlIiwKIAkJLmNhcGFiaWxpdGllcwk9IExJTkU2X0NBUF9DT05UUk9MCisJCQkJfCBMSU5FNl9DQVBfQ09OVFJPTF9NSURJCiAJCQkJfCBMSU5FNl9DQVBfUENNCiAJCQkJfCBMSU5FNl9DQVBfSFdNT04sCiAJCS5hbHRzZXR0aW5nID0gMSwKQEAgLTU0NSw2ICs1NTAsNyBAQAogCQkuaWQgPSAiUE9EeHRQcm8iLAogCQkubmFtZSA9ICJQT0R4dCBQcm8iLAogCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX0NPTlRST0wKKwkJCQl8IExJTkU2X0NBUF9DT05UUk9MX01JREkKIAkJCQl8IExJTkU2X0NBUF9QQ00KIAkJCQl8IExJTkU2X0NBUF9IV01PTiwKIAkJLmFsdHNldHRpbmcgPSA1LApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2xpbmU2L3BvZGhkLmMgYi9zb3VuZC91c2IvbGluZTYvcG9kaGQuYwppbmRleCA2M2RjYWVmLi45MzUyYTQ0IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbGluZTYvcG9kaGQuYworKysgYi9zb3VuZC91c2IvbGluZTYvcG9kaGQuYwpAQCAtMiw2ICsyLDcgQEAKICAqIExpbmUgNiBQb2QgSEQKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU3RlZmFuIEhham5vY3ppIDxzdGVmYW5oYUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW5kcmVqIEtydXRhayA8ZGV2QGFuZHJlZS5zaz4KICAqCiAgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtMTgsMTQgKzE5LDQ2IEBACiAjaW5jbHVkZSAiZHJpdmVyLmgiCiAjaW5jbHVkZSAicGNtLmgiCiAKKyNkZWZpbmUgUE9ESERfU1RBUlRVUF9ERUxBWSA1MDAKKworLyoKKyAqIFN0YWdlcyBvZiBQT0Qgc3RhcnR1cCBwcm9jZWR1cmUKKyAqLworZW51bSB7CisJUE9ESERfU1RBUlRVUF9JTklUID0gMSwKKwlQT0RIRF9TVEFSVFVQX1NDSEVEVUxFX1dPUktRVUVVRSwKKwlQT0RIRF9TVEFSVFVQX1NFVFVQLAorCVBPREhEX1NUQVJUVVBfTEFTVCA9IFBPREhEX1NUQVJUVVBfU0VUVVAgLSAxCit9OworCiBlbnVtIHsKIAlMSU5FNl9QT0RIRDMwMCwKIAlMSU5FNl9QT0RIRDQwMCwKIAlMSU5FNl9QT0RIRDUwMF8wLAogCUxJTkU2X1BPREhENTAwXzEsCisJTElORTZfUE9EWDMsCisJTElORTZfUE9EWDNMSVZFCiB9OwogCi0jZGVmaW5lIFBPREhEX0JZVEVTX1BFUl9GUkFNRSA2CS8qIDI0Yml0IGF1ZGlvIChzdGVyZW8pICovCitzdHJ1Y3QgdXNiX2xpbmU2X3BvZGhkIHsKKwkvKiBHZW5lcmljIExpbmUgNiBVU0IgZGF0YSAqLworCXN0cnVjdCB1c2JfbGluZTYgbGluZTY7CisKKwkvKiBUaW1lciBmb3IgZGV2aWNlIGluaXRpYWxpemF0aW9uICovCisJc3RydWN0IHRpbWVyX2xpc3Qgc3RhcnR1cF90aW1lcjsKKworCS8qIFdvcmsgaGFuZGxlciBmb3IgZGV2aWNlIGluaXRpYWxpemF0aW9uICovCisJc3RydWN0IHdvcmtfc3RydWN0IHN0YXJ0dXBfd29yazsKKworCS8qIEN1cnJlbnQgcHJvZ3Jlc3MgaW4gc3RhcnR1cCBwcm9jZWR1cmUgKi8KKwlpbnQgc3RhcnR1cF9wcm9ncmVzczsKKworCS8qIFNlcmlhbCBudW1iZXIgb2YgZGV2aWNlICovCisJdTMyIHNlcmlhbF9udW1iZXI7CisKKwkvKiBGaXJtd2FyZSB2ZXJzaW9uICovCisJaW50IGZpcm13YXJlX3ZlcnNpb247Cit9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9yYXRkZW4gcG9kaGRfcmF0ZGVuID0gewogCS5udW1fbWluID0gNDgwMDAsCkBAIC03Myw5ICsxMDYsMTk2IEBACiAJLnJhdGVzID0gewogCQkJICAgIC5ucmF0cyA9IDEsCiAJCQkgICAgLnJhdHMgPSAmcG9kaGRfcmF0ZGVufSwKLQkuYnl0ZXNfcGVyX2ZyYW1lID0gUE9ESERfQllURVNfUEVSX0ZSQU1FCisJLmJ5dGVzX3Blcl9jaGFubmVsID0gMyAvKiBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbGluZTZfcGNtX3Byb3BlcnRpZXMgcG9keDNfcGNtX3Byb3BlcnRpZXMgPSB7CisJLnBsYXliYWNrX2h3ID0geworCQkJCSAgLmluZm8gPSAoU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJCSAgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkJICAgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCQkgICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkJICAgU05EUlZfUENNX0lORk9fUEFVU0UgfAorCQkJCQkgICBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUKSwKKwkJCQkgIC5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFLAorCQkJCSAgLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkJICAucmF0ZV9taW4gPSA0ODAwMCwKKwkJCQkgIC5yYXRlX21heCA9IDQ4MDAwLAorCQkJCSAgLmNoYW5uZWxzX21pbiA9IDIsCisJCQkJICAuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCQkgIC5idWZmZXJfYnl0ZXNfbWF4ID0gNjAwMDAsCisJCQkJICAucGVyaW9kX2J5dGVzX21pbiA9IDY0LAorCQkJCSAgLnBlcmlvZF9ieXRlc19tYXggPSA4MTkyLAorCQkJCSAgLnBlcmlvZHNfbWluID0gMSwKKwkJCQkgIC5wZXJpb2RzX21heCA9IDEwMjR9LAorCS5jYXB0dXJlX2h3ID0geworCQkJCSAuaW5mbyA9IChTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkJICBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJCSAgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCQkgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCQkgIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAorCQkJCSAuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSwKKwkJCQkgLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkJIC5yYXRlX21pbiA9IDQ4MDAwLAorCQkJCSAucmF0ZV9tYXggPSA0ODAwMCwKKwkJCQkgLyogMSsyOiBNYWluIHNpZ25hbCAob3V0KSwgMys0OiBUb25lIDEsCisJCQkJICAqIDUrNjogVG9uZSAyLCA3Kzg6IHJhdworCQkJCSAgKi8KKwkJCQkgLmNoYW5uZWxzX21pbiA9IDgsCisJCQkJIC5jaGFubmVsc19tYXggPSA4LAorCQkJCSAuYnVmZmVyX2J5dGVzX21heCA9IDYwMDAwLAorCQkJCSAucGVyaW9kX2J5dGVzX21pbiA9IDY0LAorCQkJCSAucGVyaW9kX2J5dGVzX21heCA9IDgxOTIsCisJCQkJIC5wZXJpb2RzX21pbiA9IDEsCisJCQkJIC5wZXJpb2RzX21heCA9IDEwMjR9LAorCS5yYXRlcyA9IHsKKwkJCSAgICAubnJhdHMgPSAxLAorCQkJICAgIC5yYXRzID0gJnBvZGhkX3JhdGRlbn0sCisJLmJ5dGVzX3Blcl9jaGFubmVsID0gMyAvKiBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgKi8KK307CisKK3N0YXRpYyB2b2lkIHBvZGhkX3N0YXJ0dXBfc3RhcnRfd29ya3F1ZXVlKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBwb2RoZF9zdGFydHVwX3dvcmtxdWV1ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIGludCBwb2RoZF9zdGFydHVwX2ZpbmFsaXplKHN0cnVjdCB1c2JfbGluZTZfcG9kaGQgKnBvZCk7CisKK3N0YXRpYyBzc2l6ZV90IHNlcmlhbF9udW1iZXJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl90b19zbmRfY2FyZChkZXYpOworCXN0cnVjdCB1c2JfbGluZTZfcG9kaGQgKnBvZCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBwb2QtPnNlcmlhbF9udW1iZXIpOworfQorCitzdGF0aWMgc3NpemVfdCBmaXJtd2FyZV92ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZfdG9fc25kX2NhcmQoZGV2KTsKKwlzdHJ1Y3QgdXNiX2xpbmU2X3BvZGhkICpwb2QgPSBjYXJkLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlMDZ4XG4iLCBwb2QtPmZpcm13YXJlX3ZlcnNpb24pOworfQorCitzdGF0aWMgREVWSUNFX0FUVFJfUk8oZmlybXdhcmVfdmVyc2lvbik7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8oc2VyaWFsX251bWJlcik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpwb2RoZF9kZXZfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfZmlybXdhcmVfdmVyc2lvbi5hdHRyLAorCSZkZXZfYXR0cl9zZXJpYWxfbnVtYmVyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgcG9kaGRfZGV2X2F0dHJfZ3JvdXAgPSB7CisJLm5hbWUgPSAicG9kaGQiLAorCS5hdHRycyA9IHBvZGhkX2Rldl9hdHRycywKK307CisKKy8qCisgKiBQT0QgWDMgc3RhcnR1cCBwcm9jZWR1cmUuCisgKgorICogTWF5IGJlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBQT0QgSEQncywgc2luY2UgaXQncyBhbHNvIHNpbWlsYXIgdG8gdGhlCisgKiBwcmV2aW91cyBQT0Qgc2V0dXAuIEluIGFueSBjYXNlLCBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgcmVxdWlyZWQgZm9yIHRoZQorICogYXVkaW8gbm9yIGJ1bGsgaW50ZXJmYWNlcyB0byB3b3JrLgorICovCisKK3N0YXRpYyB2b2lkIHBvZGhkX3N0YXJ0dXAoc3RydWN0IHVzYl9saW5lNl9wb2RoZCAqcG9kKQoreworCUNIRUNLX1NUQVJUVVBfUFJPR1JFU1MocG9kLT5zdGFydHVwX3Byb2dyZXNzLCBQT0RIRF9TVEFSVFVQX0lOSVQpOworCisJLyogZGVsYXkgc3RhcnR1cCBwcm9jZWR1cmU6ICovCisJbGluZTZfc3RhcnRfdGltZXIoJnBvZC0+c3RhcnR1cF90aW1lciwgUE9ESERfU1RBUlRVUF9ERUxBWSwKKwkJcG9kaGRfc3RhcnR1cF9zdGFydF93b3JrcXVldWUsICh1bnNpZ25lZCBsb25nKXBvZCk7Cit9CisKK3N0YXRpYyB2b2lkIHBvZGhkX3N0YXJ0dXBfc3RhcnRfd29ya3F1ZXVlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgdXNiX2xpbmU2X3BvZGhkICpwb2QgPSAoc3RydWN0IHVzYl9saW5lNl9wb2RoZCAqKWRhdGE7CisKKwlDSEVDS19TVEFSVFVQX1BST0dSRVNTKHBvZC0+c3RhcnR1cF9wcm9ncmVzcywKKwkJUE9ESERfU1RBUlRVUF9TQ0hFRFVMRV9XT1JLUVVFVUUpOworCisJLyogc2NoZWR1bGUgd29yayBmb3IgZ2xvYmFsIHdvcmsgcXVldWU6ICovCisJc2NoZWR1bGVfd29yaygmcG9kLT5zdGFydHVwX3dvcmspOworfQorCitzdGF0aWMgaW50IHBvZGhkX2Rldl9zdGFydChzdHJ1Y3QgdXNiX2xpbmU2X3BvZGhkICpwb2QpCit7CisJaW50IHJldDsKKwl1OCBpbml0X2J5dGVzWzhdOworCWludCBpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXYgPSBwb2QtPmxpbmU2LnVzYmRldjsKKworCXJldCA9IHVzYl9jb250cm9sX21zZyh1c2JkZXYsIHVzYl9zbmRjdHJscGlwZSh1c2JkZXYsIDApLAorCQkJCQkweDY3LCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9PVVQsCisJCQkJCTB4MTEsIDAsCisJCQkJCU5VTEwsIDAsIExJTkU2X1RJTUVPVVQgKiBIWik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihwb2QtPmxpbmU2LmlmY2RldiwgInJlYWQgcmVxdWVzdCBmYWlsZWQgKGVycm9yICVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBOT1RFOiBsb29rcyBsaWtlIHNvbWUga2luZCBvZiBwaW5nIG1lc3NhZ2UgKi8KKwlyZXQgPSB1c2JfY29udHJvbF9tc2codXNiZGV2LCB1c2JfcmN2Y3RybHBpcGUodXNiZGV2LCAwKSwgMHg2NywKKwkJCQkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfSU4sCisJCQkJCTB4MTEsIDB4MCwKKwkJCQkJJmluaXRfYnl0ZXMsIDMsIExJTkU2X1RJTUVPVVQgKiBIWik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihwb2QtPmxpbmU2LmlmY2RldiwKKwkJCSJyZWNlaXZlIGxlbmd0aCBmYWlsZWQgKGVycm9yICVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwb2QtPmZpcm13YXJlX3ZlcnNpb24gPQorCQkoaW5pdF9ieXRlc1swXSA8PCAxNikgfCAoaW5pdF9ieXRlc1sxXSA8PCA4KSB8IChpbml0X2J5dGVzWzJdIDw8IDApOworCisJZm9yIChpID0gMDsgaSA8PSAxNjsgaSsrKSB7CisJCXJldCA9IGxpbmU2X3JlYWRfZGF0YSgmcG9kLT5saW5lNiwgMHhmMDAwICsgMHgwOCAqIGksIGluaXRfYnl0ZXMsIDgpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVzYmRldiwgdXNiX3NuZGN0cmxwaXBlKHVzYmRldiwgMCksCisJCQkJCVVTQl9SRVFfU0VUX0ZFQVRVUkUsCisJCQkJCVVTQl9UWVBFX1NUQU5EQVJEIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfT1VULAorCQkJCQkxLCAwLAorCQkJCQlOVUxMLCAwLCBMSU5FNl9USU1FT1VUICogSFopOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBvZGhkX3N0YXJ0dXBfd29ya3F1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdXNiX2xpbmU2X3BvZGhkICpwb2QgPQorCSAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHVzYl9saW5lNl9wb2RoZCwgc3RhcnR1cF93b3JrKTsKKworCUNIRUNLX1NUQVJUVVBfUFJPR1JFU1MocG9kLT5zdGFydHVwX3Byb2dyZXNzLCBQT0RIRF9TVEFSVFVQX1NFVFVQKTsKKworCXBvZGhkX2Rldl9zdGFydChwb2QpOworCWxpbmU2X3JlYWRfc2VyaWFsX251bWJlcigmcG9kLT5saW5lNiwgJnBvZC0+c2VyaWFsX251bWJlcik7CisKKwlwb2RoZF9zdGFydHVwX2ZpbmFsaXplKHBvZCk7Cit9CisKK3N0YXRpYyBpbnQgcG9kaGRfc3RhcnR1cF9maW5hbGl6ZShzdHJ1Y3QgdXNiX2xpbmU2X3BvZGhkICpwb2QpCit7CisJc3RydWN0IHVzYl9saW5lNiAqbGluZTYgPSAmcG9kLT5saW5lNjsKKworCS8qIEFMU0EgYXVkaW8gaW50ZXJmYWNlOiAqLworCXJldHVybiBzbmRfY2FyZF9yZWdpc3RlcihsaW5lNi0+Y2FyZCk7Cit9CisKK3N0YXRpYyB2b2lkIHBvZGhkX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9saW5lNiAqbGluZTYpCit7CisJc3RydWN0IHVzYl9saW5lNl9wb2RoZCAqcG9kID0gKHN0cnVjdCB1c2JfbGluZTZfcG9kaGQgKilsaW5lNjsKKworCWlmIChwb2QtPmxpbmU2LnByb3BlcnRpZXMtPmNhcGFiaWxpdGllcyAmIExJTkU2X0NBUF9DT05UUk9MKSB7CisJCWRlbF90aW1lcl9zeW5jKCZwb2QtPnN0YXJ0dXBfdGltZXIpOworCQljYW5jZWxfd29ya19zeW5jKCZwb2QtPnN0YXJ0dXBfd29yayk7CisJfQorfQorCiAvKgogCVRyeSB0byBpbml0IFBPRCBIRCBkZXZpY2UuCiAqLwpAQCAtODMsMTkgKzMwMywzNiBAQAogCQkgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CiAJaW50IGVycjsKKwlzdHJ1Y3QgdXNiX2xpbmU2X3BvZGhkICpwb2QgPSAoc3RydWN0IHVzYl9saW5lNl9wb2RoZCAqKSBsaW5lNjsKIAotCS8qIGluaXRpYWxpemUgTUlESSBzdWJzeXN0ZW06ICovCi0JZXJyID0gbGluZTZfaW5pdF9taWRpKGxpbmU2KTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwlsaW5lNi0+ZGlzY29ubmVjdCA9IHBvZGhkX2Rpc2Nvbm5lY3Q7CiAKLQkvKiBpbml0aWFsaXplIFBDTSBzdWJzeXN0ZW06ICovCi0JZXJyID0gbGluZTZfaW5pdF9wY20obGluZTYsICZwb2RoZF9wY21fcHJvcGVydGllcyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7CisJaWYgKHBvZC0+bGluZTYucHJvcGVydGllcy0+Y2FwYWJpbGl0aWVzICYgTElORTZfQ0FQX0NPTlRST0wpIHsKKwkJLyogY3JlYXRlIHN5c2ZzIGVudHJpZXM6ICovCisJCWVyciA9IHNuZF9jYXJkX2FkZF9kZXZfYXR0cihsaW5lNi0+Y2FyZCwgJnBvZGhkX2Rldl9hdHRyX2dyb3VwKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KIAotCS8qIHJlZ2lzdGVyIFVTQiBhdWRpbyBzeXN0ZW06ICovCi0JcmV0dXJuIHNuZF9jYXJkX3JlZ2lzdGVyKGxpbmU2LT5jYXJkKTsKKwlpZiAocG9kLT5saW5lNi5wcm9wZXJ0aWVzLT5jYXBhYmlsaXRpZXMgJiBMSU5FNl9DQVBfUENNKSB7CisJCS8qIGluaXRpYWxpemUgUENNIHN1YnN5c3RlbTogKi8KKwkJZXJyID0gbGluZTZfaW5pdF9wY20obGluZTYsCisJCQkoaWQtPmRyaXZlcl9pbmZvID09IExJTkU2X1BPRFgzKSA/ICZwb2R4M19wY21fcHJvcGVydGllcyA6CisJCQkmcG9kaGRfcGNtX3Byb3BlcnRpZXMpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKCEocG9kLT5saW5lNi5wcm9wZXJ0aWVzLT5jYXBhYmlsaXRpZXMgJiBMSU5FNl9DQVBfQ09OVFJPTCkpIHsKKwkJLyogcmVnaXN0ZXIgVVNCIGF1ZGlvIHN5c3RlbSBkaXJlY3RseSAqLworCQlyZXR1cm4gcG9kaGRfc3RhcnR1cF9maW5hbGl6ZShwb2QpOworCX0KKworCS8qIGluaXQgZGV2aWNlIGFuZCBkZWxheSByZWdpc3RlcmluZyAqLworCWluaXRfdGltZXIoJnBvZC0+c3RhcnR1cF90aW1lcik7CisJSU5JVF9XT1JLKCZwb2QtPnN0YXJ0dXBfd29yaywgcG9kaGRfc3RhcnR1cF93b3JrcXVldWUpOworCXBvZGhkX3N0YXJ0dXAocG9kKTsKKwlyZXR1cm4gMDsKIH0KIAogI2RlZmluZSBMSU5FNl9ERVZJQ0UocHJvZCkgVVNCX0RFVklDRSgweDBlNDEsIHByb2QpCkBAIC0xMDMsMTAgKzM0MCwxMyBAQAogCiAvKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgcG9kaGRfaWRfdGFibGVbXSA9IHsKKwkvKiBUT0RPOiBubyBuZWVkIHRvIGFsbG9jIGRhdGEgaW50ZXJmYWNlcyB3aGVuIG9ubHkgYXVkaW8gaXMgdXNlZCAqLwogCXsgTElORTZfREVWSUNFKDB4NTA1NyksICAgIC5kcml2ZXJfaW5mbyA9IExJTkU2X1BPREhEMzAwIH0sCiAJeyBMSU5FNl9ERVZJQ0UoMHg1MDU4KSwgICAgLmRyaXZlcl9pbmZvID0gTElORTZfUE9ESEQ0MDAgfSwKIAl7IExJTkU2X0lGX05VTSgweDQxNEQsIDApLCAuZHJpdmVyX2luZm8gPSBMSU5FNl9QT0RIRDUwMF8wIH0sCiAJeyBMSU5FNl9JRl9OVU0oMHg0MTRELCAxKSwgLmRyaXZlcl9pbmZvID0gTElORTZfUE9ESEQ1MDBfMSB9LAorCXsgTElORTZfSUZfTlVNKDB4NDE0QSwgMCksIC5kcml2ZXJfaW5mbyA9IExJTkU2X1BPRFgzIH0sCisJeyBMSU5FNl9JRl9OVU0oMHg0MTRCLCAwKSwgLmRyaXZlcl9pbmZvID0gTElORTZfUE9EWDNMSVZFIH0sCiAJe30KIH07CiAKQEAgLTExNiw4ICszNTYsNyBAQAogCVtMSU5FNl9QT0RIRDMwMF0gPSB7CiAJCS5pZCA9ICJQT0RIRDMwMCIsCiAJCS5uYW1lID0gIlBPRCBIRDMwMCIsCi0JCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfQ09OVFJPTAotCQkJCXwgTElORTZfQ0FQX1BDTQorCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX1BDTQogCQkJCXwgTElORTZfQ0FQX0hXTU9OLAogCQkuYWx0c2V0dGluZyA9IDUsCiAJCS5lcF9jdHJsX3IgPSAweDg0LApAQCAtMTI4LDggKzM2Nyw3IEBACiAJW0xJTkU2X1BPREhENDAwXSA9IHsKIAkJLmlkID0gIlBPREhENDAwIiwKIAkJLm5hbWUgPSAiUE9EIEhENDAwIiwKLQkJLmNhcGFiaWxpdGllcwk9IExJTkU2X0NBUF9DT05UUk9MCi0JCQkJfCBMSU5FNl9DQVBfUENNCisJCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfUENNCiAJCQkJfCBMSU5FNl9DQVBfSFdNT04sCiAJCS5hbHRzZXR0aW5nID0gNSwKIAkJLmVwX2N0cmxfciA9IDB4ODQsCkBAIC0xNDAsOCArMzc4LDcgQEAKIAlbTElORTZfUE9ESEQ1MDBfMF0gPSB7CiAJCS5pZCA9ICJQT0RIRDUwMCIsCiAJCS5uYW1lID0gIlBPRCBIRDUwMCIsCi0JCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfQ09OVFJPTAotCQkJCXwgTElORTZfQ0FQX1BDTQorCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX1BDTQogCQkJCXwgTElORTZfQ0FQX0hXTU9OLAogCQkuYWx0c2V0dGluZyA9IDEsCiAJCS5lcF9jdHJsX3IgPSAweDgxLApAQCAtMTUyLDggKzM4OSw3IEBACiAJW0xJTkU2X1BPREhENTAwXzFdID0gewogCQkuaWQgPSAiUE9ESEQ1MDAiLAogCQkubmFtZSA9ICJQT0QgSEQ1MDAiLAotCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX0NPTlRST0wKLQkJCQl8IExJTkU2X0NBUF9QQ00KKwkJLmNhcGFiaWxpdGllcwk9IExJTkU2X0NBUF9QQ00KIAkJCQl8IExJTkU2X0NBUF9IV01PTiwKIAkJLmFsdHNldHRpbmcgPSAxLAogCQkuZXBfY3RybF9yID0gMHg4MSwKQEAgLTE2MSw2ICszOTcsMjggQEAKIAkJLmVwX2F1ZGlvX3IgPSAweDg2LAogCQkuZXBfYXVkaW9fdyA9IDB4MDIsCiAJfSwKKwlbTElORTZfUE9EWDNdID0geworCQkuaWQgPSAiUE9EWDMiLAorCQkubmFtZSA9ICJQT0QgWDMiLAorCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX0NPTlRST0wKKwkJCQl8IExJTkU2X0NBUF9QQ00gfCBMSU5FNl9DQVBfSFdNT04gfCBMSU5FNl9DQVBfSU5fTkVFRFNfT1VULAorCQkuYWx0c2V0dGluZyA9IDEsCisJCS5lcF9jdHJsX3IgPSAweDgxLAorCQkuZXBfY3RybF93ID0gMHgwMSwKKwkJLmVwX2F1ZGlvX3IgPSAweDg2LAorCQkuZXBfYXVkaW9fdyA9IDB4MDIsCisJfSwKKwlbTElORTZfUE9EWDNMSVZFXSA9IHsKKwkJLmlkID0gIlBPRFgzTElWRSIsCisJCS5uYW1lID0gIlBPRCBYMyBMSVZFIiwKKwkJLmNhcGFiaWxpdGllcwk9IExJTkU2X0NBUF9DT05UUk9MCisJCQkJfCBMSU5FNl9DQVBfUENNIHwgTElORTZfQ0FQX0hXTU9OIHwgTElORTZfQ0FQX0lOX05FRURTX09VVCwKKwkJLmFsdHNldHRpbmcgPSAxLAorCQkuZXBfY3RybF9yID0gMHg4MSwKKwkJLmVwX2N0cmxfdyA9IDB4MDEsCisJCS5lcF9hdWRpb19yID0gMHg4NiwKKwkJLmVwX2F1ZGlvX3cgPSAweDAyLAorCX0sCiB9OwogCiAvKgpAQCAtMTcxLDcgKzQyOSw3IEBACiB7CiAJcmV0dXJuIGxpbmU2X3Byb2JlKGludGVyZmFjZSwgaWQsICJMaW5lNi1QT0RIRCIsCiAJCQkgICAmcG9kaGRfcHJvcGVydGllc190YWJsZVtpZC0+ZHJpdmVyX2luZm9dLAotCQkJICAgcG9kaGRfaW5pdCwgc2l6ZW9mKHN0cnVjdCB1c2JfbGluZTYpKTsKKwkJCSAgIHBvZGhkX2luaXQsIHNpemVvZihzdHJ1Y3QgdXNiX2xpbmU2X3BvZGhkKSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBwb2RoZF9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbGluZTYvdG9uZXBvcnQuYyBiL3NvdW5kL3VzYi9saW5lNi90b25lcG9ydC5jCmluZGV4IDZkNGM1MGMuLjhlMjJmNDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9saW5lNi90b25lcG9ydC5jCisrKyBiL3NvdW5kL3VzYi9saW5lNi90b25lcG9ydC5jCkBAIC0xMTQsNyArMTE0LDcgQEAKIAkucmF0ZXMgPSB7CiAJCQkgICAgLm5yYXRzID0gMSwKIAkJCSAgICAucmF0cyA9ICZ0b25lcG9ydF9yYXRkZW59LAotCS5ieXRlc19wZXJfZnJhbWUgPSA0CisJLmJ5dGVzX3Blcl9jaGFubmVsID0gMgogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB7CkBAIC0xNzcsNyArMTc3LDcgQEAKIAlsaW5lNnBjbS0+dm9sdW1lX21vbml0b3IgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKIAogCWlmIChsaW5lNnBjbS0+dm9sdW1lX21vbml0b3IgPiAwKSB7Ci0JCWVyciA9IGxpbmU2X3BjbV9hY3F1aXJlKGxpbmU2cGNtLCBMSU5FNl9TVFJFQU1fTU9OSVRPUik7CisJCWVyciA9IGxpbmU2X3BjbV9hY3F1aXJlKGxpbmU2cGNtLCBMSU5FNl9TVFJFQU1fTU9OSVRPUiwgdHJ1ZSk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlsaW5lNnBjbS0+dm9sdW1lX21vbml0b3IgPSAwOwogCQkJbGluZTZfcGNtX3JlbGVhc2UobGluZTZwY20sIExJTkU2X1NUUkVBTV9NT05JVE9SKTsKQEAgLTI0Niw3ICsyNDYsNyBAQAogCXN0cnVjdCB1c2JfbGluZTZfdG9uZXBvcnQgKnRvbmVwb3J0ID0gKHN0cnVjdCB1c2JfbGluZTZfdG9uZXBvcnQgKilhcmc7CiAJc3RydWN0IHVzYl9saW5lNiAqbGluZTYgPSAmdG9uZXBvcnQtPmxpbmU2OwogCi0JbGluZTZfcGNtX2FjcXVpcmUobGluZTYtPmxpbmU2cGNtLCBMSU5FNl9TVFJFQU1fTU9OSVRPUik7CisJbGluZTZfcGNtX2FjcXVpcmUobGluZTYtPmxpbmU2cGNtLCBMSU5FNl9TVFJFQU1fTU9OSVRPUiwgdHJ1ZSk7CiB9CiAKIC8qIGNvbnRyb2wgZGVmaW5pdGlvbiAqLwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2xpbmU2L3ZhcmlheC5jIGIvc291bmQvdXNiL2xpbmU2L3ZhcmlheC5jCmluZGV4IGRkYzIzZGQuLjBjNDUxMmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9saW5lNi92YXJpYXguYworKysgYi9zb3VuZC91c2IvbGluZTYvdmFyaWF4LmMKQEAgLTI1OSw3ICsyNTksOCBAQAogCVtMSU5FNl9QT0RYVExJVkVfVkFSSUFYXSA9IHsKIAkJLmlkID0gIlBPRHh0TGl2ZSIsCiAJCS5uYW1lID0gIlBPRHh0IExpdmUiLAotCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX0NPTlRST0wsCisJCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfQ09OVFJPTAorCQkJCXwgTElORTZfQ0FQX0NPTlRST0xfTUlESSwKIAkJLmFsdHNldHRpbmcgPSAxLAogCQkuZXBfY3RybF9yID0gMHg4NiwKIAkJLmVwX2N0cmxfdyA9IDB4MDUsCkBAIC0yNjksNyArMjcwLDggQEAKIAlbTElORTZfVkFSSUFYXSA9IHsKIAkJLmlkID0gIlZhcmlheCIsCiAJCS5uYW1lID0gIlZhcmlheCBXb3JrYmVuY2giLAotCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX0NPTlRST0wsCisJCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfQ09OVFJPTAorCQkJCXwgTElORTZfQ0FQX0NPTlRST0xfTUlESSwKIAkJLmFsdHNldHRpbmcgPSAxLAogCQkuZXBfY3RybF9yID0gMHg4MiwKIAkJLmVwX2N0cmxfdyA9IDB4MDEsCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXJfcXVpcmtzLmMgYi9zb3VuZC91c2IvbWl4ZXJfcXVpcmtzLmMKaW5kZXggZjZjM2JmNy4uMDQ5OTFiMCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL21peGVyX3F1aXJrcy5jCisrKyBiL3NvdW5kL3VzYi9taXhlcl9xdWlya3MuYwpAQCAtMTgzMSw2ICsxODMxLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgc25kX2RyYWdvbmZseV9xdWlya19kYl9zY2FsZShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIsCisJCQkJCSBzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqY3ZhbCwKIAkJCQkJIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwpCiB7CiAJLyogQXBwcm94aW1hdGlvbiB1c2luZyAxMCByYW5nZXMgYmFzZWQgb24gb3V0cHV0IG1lYXN1cmVtZW50IG9uIGh3IHYxLjIuCkBAIC0xODQ4LDEwICsxODQ5LDE5IEBACiAJCTQxLCA1MCwgVExWX0RCX01JTk1BWF9JVEVNKC00NDEsIDApLAogCSk7CiAKLQl1c2JfYXVkaW9faW5mbyhtaXhlci0+Y2hpcCwgImFwcGx5aW5nIERyYWdvbkZseSBkQiBzY2FsZSBxdWlya1xuIik7Ci0Ja2N0bC0+dGx2LnAgPSBzY2FsZTsKLQlrY3RsLT52ZFswXS5hY2Nlc3MgfD0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEOwotCWtjdGwtPnZkWzBdLmFjY2VzcyAmPSB+U05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9DQUxMQkFDSzsKKwlpZiAoY3ZhbC0+bWluID09IDAgJiYgY3ZhbC0+bWF4ID09IDUwKSB7CisJCXVzYl9hdWRpb19pbmZvKG1peGVyLT5jaGlwLCAiYXBwbHlpbmcgRHJhZ29uRmx5IGRCIHNjYWxlIHF1aXJrICgwLTUwIHZhcmlhbnQpXG4iKTsKKwkJa2N0bC0+dGx2LnAgPSBzY2FsZTsKKwkJa2N0bC0+dmRbMF0uYWNjZXNzIHw9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRDsKKwkJa2N0bC0+dmRbMF0uYWNjZXNzICY9IH5TTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX0NBTExCQUNLOworCisJfSBlbHNlIGlmIChjdmFsLT5taW4gPT0gMCAmJiBjdmFsLT5tYXggPD0gMTAwMCkgeworCQkvKiBTb21lIG90aGVyIGNsZWFybHkgYnJva2VuIERyYWdvbkZseSB2YXJpYW50LgorCQkgKiBBdCBsZWFzdCBhIDAuLjUzIHZhcmlhbnQgKGh3IHYxLjApIGV4aXN0cy4KKwkJICovCisJCXVzYl9hdWRpb19pbmZvKG1peGVyLT5jaGlwLCAiaWdub3JpbmcgdG9vIG5hcnJvdyBkQiByYW5nZSBvbiBhIERyYWdvbkZseSBkZXZpY2UiKTsKKwkJa2N0bC0+dmRbMF0uYWNjZXNzICY9IH5TTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX0NBTExCQUNLOworCX0KIH0KIAogdm9pZCBzbmRfdXNiX21peGVyX2Z1X2FwcGx5X3F1aXJrKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciwKQEAgLTE4NjAsOCArMTg3MCw4IEBACiB7CiAJc3dpdGNoIChtaXhlci0+Y2hpcC0+dXNiX2lkKSB7CiAJY2FzZSBVU0JfSUQoMHgyMWI0LCAweDAwODEpOiAvKiBBdWRpb1F1ZXN0IERyYWdvbkZseSAqLwotCQlpZiAodW5pdGlkID09IDcgJiYgY3ZhbC0+bWluID09IDAgJiYgY3ZhbC0+bWF4ID09IDUwKQotCQkJc25kX2RyYWdvbmZseV9xdWlya19kYl9zY2FsZShtaXhlciwga2N0bCk7CisJCWlmICh1bml0aWQgPT0gNyAmJiBjdmFsLT5jb250cm9sID09IFVBQ19GVV9WT0xVTUUpCisJCQlzbmRfZHJhZ29uZmx5X3F1aXJrX2RiX3NjYWxlKG1peGVyLCBjdmFsLCBrY3RsKTsKIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3F1aXJrcy5jIGIvc291bmQvdXNiL3F1aXJrcy5jCmluZGV4IDZjZjFmMzUuLjI3ODIxNTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9xdWlya3MuYworKysgYi9zb3VuZC91c2IvcXVpcmtzLmMKQEAgLTExNDEsNiArMTE0MSw3IEBACiAJY2FzZSBVU0JfSUQoMHgwNTU2LCAweDAwMTQpOiAvKiBQaG9lbml4IEF1ZGlvIFRNWDMyMFZDICovCiAJY2FzZSBVU0JfSUQoMHgwNUEzLCAweDk0MjApOiAvKiBFTFAgSEQgVVNCIENhbWVyYSAqLwogCWNhc2UgVVNCX0lEKDB4MDc0RCwgMHgzNTUzKTogLyogT3V0bGF3IFJSMjE1MCAoTWljcm9uYXMgVUFDMzU1M0IpICovCisJY2FzZSBVU0JfSUQoMHgxOTAxLCAweDAxOTEpOiAvKiBHRSBCODUwVjMgQ1AyMTE0IGF1ZGlvIGludGVyZmFjZSAqLwogCWNhc2UgVVNCX0lEKDB4MWRlNywgMHgwMDEzKTogLyogUGhvZW5peCBBdWRpbyBNVDIwMmV4ZSAqLwogCWNhc2UgVVNCX0lEKDB4MWRlNywgMHgwMDE0KTogLyogUGhvZW5peCBBdWRpbyBUTVgzMjAgKi8KIAljYXNlIFVTQl9JRCgweDFkZTcsIDB4MDExNCk6IC8qIFBob2VuaXggQXVkaW8gTVQyMDJwY3MgKi8KQEAgLTEyMTYsNiArMTIxNywxMiBAQAogCSAgICAgZXAtPmNoaXAtPnVzYl9pZCA9PSBVU0JfSUQoMHgwNzYzLCAweDIwMzEpKSAmJgogCSAgICBlcC0+dHlwZSA9PSBTTkRfVVNCX0VORFBPSU5UX1RZUEVfREFUQSkKIAkJZXAtPnNraXBfcGFja2V0cyA9IDE2OworCisJLyogV29yayBhcm91bmQgZGV2aWNlcyB0aGF0IHJlcG9ydCB1bnJlYXNvbmFibGUgZmVlZGJhY2sgZGF0YSAqLworCWlmICgoZXAtPmNoaXAtPnVzYl9pZCA9PSBVU0JfSUQoMHgwNjQ0LCAweDgwMzgpIHx8ICAvKiBURUFDIFVELUgwMSAqLworCSAgICAgZXAtPmNoaXAtPnVzYl9pZCA9PSBVU0JfSUQoMHgxODUyLCAweDUwMzQpKSAmJiAvKiBUK0EgRGFjOCAqLworCSAgICBlcC0+c3luY21heHNpemUgPT0gNCkKKwkJZXAtPnRlbm9yX2ZiX3F1aXJrID0gMTsKIH0KIAogdm9pZCBzbmRfdXNiX3NldF9pbnRlcmZhY2VfcXVpcmsoc3RydWN0IHVzYl9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvYWxwaGEvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL2FscGhhL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOGI2NGMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL2FscGhhL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsNDcgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9BTFBIQV9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfQUxQSEFfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBNQURWX0RPRFVNUAkxNworI2RlZmluZSBNQURWX0RPRk9SSwkxMQorI2RlZmluZSBNQURWX0RPTlREVU1QICAgMTYKKyNkZWZpbmUgTUFEVl9ET05URk9SSwkxMAorI2RlZmluZSBNQURWX0RPTlRORUVECTYKKyNkZWZpbmUgTUFEVl9GUkVFCTgKKyNkZWZpbmUgTUFEVl9IVUdFUEFHRQkxNAorI2RlZmluZSBNQURWX01FUkdFQUJMRSAgIDEyCisjZGVmaW5lIE1BRFZfTk9IVUdFUEFHRQkxNQorI2RlZmluZSBNQURWX05PUk1BTAkwCisjZGVmaW5lIE1BRFZfUkFORE9NCTEKKyNkZWZpbmUgTUFEVl9SRU1PVkUJOQorI2RlZmluZSBNQURWX1NFUVVFTlRJQUwJMgorI2RlZmluZSBNQURWX1VOTUVSR0VBQkxFIDEzCisjZGVmaW5lIE1BRFZfV0lMTE5FRUQJMworI2RlZmluZSBNQVBfQU5PTllNT1VTCTB4MTAKKyNkZWZpbmUgTUFQX0RFTllXUklURQkweDAyMDAwCisjZGVmaW5lIE1BUF9FWEVDVVRBQkxFCTB4MDQwMDAKKyNkZWZpbmUgTUFQX0ZJTEUJMAorI2RlZmluZSBNQVBfRklYRUQJMHgxMDAKKyNkZWZpbmUgTUFQX0dST1dTRE9XTgkweDAxMDAwCisjZGVmaW5lIE1BUF9IVUdFVExCCTB4MTAwMDAwCisjZGVmaW5lIE1BUF9MT0NLRUQJMHgwODAwMAorI2RlZmluZSBNQVBfTk9OQkxPQ0sJMHg0MDAwMAorI2RlZmluZSBNQVBfTk9SRVNFUlZFCTB4MTAwMDAKKyNkZWZpbmUgTUFQX1BPUFVMQVRFCTB4MjAwMDAKKyNkZWZpbmUgTUFQX1BSSVZBVEUJMHgwMgorI2RlZmluZSBNQVBfU0hBUkVECTB4MDEKKyNkZWZpbmUgTUFQX1NUQUNLCTB4ODAwMDAKKyNkZWZpbmUgUFJPVF9FWEVDCTB4NAorI2RlZmluZSBQUk9UX0dST1dTRE9XTgkweDAxMDAwMDAwCisjZGVmaW5lIFBST1RfR1JPV1NVUAkweDAyMDAwMDAwCisjZGVmaW5lIFBST1RfTk9ORQkweDAKKyNkZWZpbmUgUFJPVF9SRUFECTB4MQorI2RlZmluZSBQUk9UX1NFTQkweDgKKyNkZWZpbmUgUFJPVF9XUklURQkweDIKKy8qIE1BRFZfSFdQT0lTT04gaXMgdW5kZWZpbmVkIG9uIGFscGhhLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFEVl9IV1BPSVNPTgkxMDAKKy8qIE1BRFZfU09GVF9PRkZMSU5FIGlzIHVuZGVmaW5lZCBvbiBhbHBoYSwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BRFZfU09GVF9PRkZMSU5FIDEwMQorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBhbHBoYSwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisvKiBNQVBfVU5JTklUSUFMSVpFRCBpcyB1bmRlZmluZWQgb24gYWxwaGEsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfVU5JTklUSUFMSVpFRAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvYXJjL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oIGIvdG9vbHMvYXJjaC9hcmMvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzYWNkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvYXJjL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBUT09MU19BUkNIX0FSQ19VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfQVJDX1VBUElfQVNNX01NQU5fRklYX0gKKyNpbmNsdWRlIDx1YXBpL2FzbS1nZW5lcmljL21tYW4uaD4KKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24gYXJjLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9hcm0vaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL2FybS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzhmNjk5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9hcm0vaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfQVJNX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9BUk1fVUFQSV9BU01fTU1BTl9GSVhfSAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBhcm0sIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL2FybTY0L2luY2x1ZGUvdWFwaS9hc20va3ZtLmggYi90b29scy9hcmNoL2FybTY0L2luY2x1ZGUvdWFwaS9hc20va3ZtLmgKaW5kZXggZjIwOWVhMS4uMzA1MWY4NiAxMDA2NDQKLS0tIGEvdG9vbHMvYXJjaC9hcm02NC9pbmNsdWRlL3VhcGkvYXNtL2t2bS5oCisrKyBiL3Rvb2xzL2FyY2gvYXJtNjQvaW5jbHVkZS91YXBpL2FzbS9rdm0uaApAQCAtODcsOSArODcsMTEgQEAKIC8qIFN1cHBvcnRlZCBWR0lDdjMgYWRkcmVzcyB0eXBlcyAgKi8KICNkZWZpbmUgS1ZNX1ZHSUNfVjNfQUREUl9UWVBFX0RJU1QJMgogI2RlZmluZSBLVk1fVkdJQ19WM19BRERSX1RZUEVfUkVESVNUCTMKKyNkZWZpbmUgS1ZNX1ZHSUNfSVRTX0FERFJfVFlQRQkJNAogCiAjZGVmaW5lIEtWTV9WR0lDX1YzX0RJU1RfU0laRQkJU1pfNjRLCiAjZGVmaW5lIEtWTV9WR0lDX1YzX1JFRElTVF9TSVpFCQkoMiAqIFNaXzY0SykKKyNkZWZpbmUgS1ZNX1ZHSUNfVjNfSVRTX1NJWkUJCSgyICogU1pfNjRLKQogCiAjZGVmaW5lIEtWTV9BUk1fVkNQVV9QT1dFUl9PRkYJCTAgLyogQ1BVIGlzIHN0YXJ0ZWQgaW4gT0ZGIHN0YXRlICovCiAjZGVmaW5lIEtWTV9BUk1fVkNQVV9FTDFfMzJCSVQJCTEgLyogQ1BVIHJ1bm5pbmcgYSAzMmJpdCBWTSAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9hcm02NC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvYXJtNjQvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmZDMxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvYXJtNjQvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfQVJNNjRfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX0FSTTY0X1VBUElfQVNNX01NQU5fRklYX0gKKyNpbmNsdWRlIDx1YXBpL2FzbS1nZW5lcmljL21tYW4uaD4KKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24gYXJtNjQsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL2Zydi9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvZnJ2L2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZTc4YWMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL2Zydi9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9GUlZfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX0ZSVl9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjaW5jbHVkZSA8dWFwaS9hc20tZ2VuZXJpYy9tbWFuLmg+CisvKiBNQVBfMzJCSVQgaXMgdW5kZWZpbmVkIG9uIGZydiwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvaDgzMDAvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL2g4MzAwL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOWFjNTQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL2g4MzAwL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBUT09MU19BUkNIX0g4MzAwX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9IODMwMF9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjaW5jbHVkZSA8dWFwaS9hc20tZ2VuZXJpYy9tbWFuLmg+CisvKiBNQVBfMzJCSVQgaXMgdW5kZWZpbmVkIG9uIGg4MzAwLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9oZXhhZ29uL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oIGIvdG9vbHMvYXJjaC9oZXhhZ29uL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMmYzZmEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL2hleGFnb24vaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfSEVYQUdPTl9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfSEVYQUdPTl9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjaW5jbHVkZSA8dWFwaS9hc20tZ2VuZXJpYy9tbWFuLmg+CisvKiBNQVBfMzJCSVQgaXMgdW5kZWZpbmVkIG9uIGhleGFnb24sIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL2lhNjQvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL2lhNjQvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2ZTVhYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvaWE2NC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9JQTY0X1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9JQTY0X1VBUElfQVNNX01NQU5fRklYX0gKKyNpbmNsdWRlIDx1YXBpL2FzbS1nZW5lcmljL21tYW4uaD4KKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24gaWE2NCwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvbTMyci9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvbTMyci9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzI5NjM1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9tMzJyL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBUT09MU19BUkNIX00zMlJfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX00zMlJfVUFQSV9BU01fTU1BTl9GSVhfSAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBtMzJyLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oIGIvdG9vbHMvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNWNkNTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfTUlDUk9CTEFaRV9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfTUlDUk9CTEFaRV9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjaW5jbHVkZSA8dWFwaS9hc20tZ2VuZXJpYy9tbWFuLmg+CisvKiBNQVBfMzJCSVQgaXMgdW5kZWZpbmVkIG9uIG1pY3JvYmxhemUsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAyMDUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDQ2IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfTUlQU19VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfTUlQU19VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIE1BRFZfRE9EVU1QCTE3CisjZGVmaW5lIE1BRFZfRE9GT1JLCTExCisjZGVmaW5lIE1BRFZfRE9OVERVTVAJMTYKKyNkZWZpbmUgTUFEVl9ET05URk9SSwkxMAorI2RlZmluZSBNQURWX0RPTlRORUVECTQKKyNkZWZpbmUgTUFEVl9GUkVFCTgKKyNkZWZpbmUgTUFEVl9IVUdFUEFHRQkxNAorI2RlZmluZSBNQURWX0hXUE9JU09OCSAxMDAKKyNkZWZpbmUgTUFEVl9NRVJHRUFCTEUJIDEyCisjZGVmaW5lIE1BRFZfTk9IVUdFUEFHRSAxNQorI2RlZmluZSBNQURWX05PUk1BTAkwCisjZGVmaW5lIE1BRFZfUkFORE9NCTEKKyNkZWZpbmUgTUFEVl9SRU1PVkUJOQorI2RlZmluZSBNQURWX1NFUVVFTlRJQUwgMgorI2RlZmluZSBNQURWX1VOTUVSR0VBQkxFIDEzCisjZGVmaW5lIE1BRFZfV0lMTE5FRUQJMworI2RlZmluZSBNQVBfQU5PTllNT1VTCTB4MDgwMAorI2RlZmluZSBNQVBfREVOWVdSSVRFCTB4MjAwMAorI2RlZmluZSBNQVBfRVhFQ1VUQUJMRQkweDQwMDAKKyNkZWZpbmUgTUFQX0ZJTEUJMAorI2RlZmluZSBNQVBfRklYRUQJMHgwMTAKKyNkZWZpbmUgTUFQX0dST1dTRE9XTgkweDEwMDAKKyNkZWZpbmUgTUFQX0hVR0VUTEIJMHg4MDAwMAorI2RlZmluZSBNQVBfTE9DS0VECTB4ODAwMAorI2RlZmluZSBNQVBfTk9OQkxPQ0sJMHgyMDAwMAorI2RlZmluZSBNQVBfTk9SRVNFUlZFCTB4MDQwMAorI2RlZmluZSBNQVBfUE9QVUxBVEUJMHgxMDAwMAorI2RlZmluZSBNQVBfUFJJVkFURQkweDAwMgorI2RlZmluZSBNQVBfU0hBUkVECTB4MDAxCisjZGVmaW5lIE1BUF9TVEFDSwkweDQwMDAwCisjZGVmaW5lIFBST1RfRVhFQwkweDA0CisjZGVmaW5lIFBST1RfR1JPV1NET1dOCTB4MDEwMDAwMDAKKyNkZWZpbmUgUFJPVF9HUk9XU1VQCTB4MDIwMDAwMDAKKyNkZWZpbmUgUFJPVF9OT05FCTB4MDAKKyNkZWZpbmUgUFJPVF9SRUFECTB4MDEKKyNkZWZpbmUgUFJPVF9TRU0JMHgxMAorI2RlZmluZSBQUk9UX1dSSVRFCTB4MDIKKy8qIE1BRFZfU09GVF9PRkZMSU5FIGlzIHVuZGVmaW5lZCBvbiBtaXBzLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFEVl9TT0ZUX09GRkxJTkUgMTAxCisvKiBNQVBfMzJCSVQgaXMgdW5kZWZpbmVkIG9uIG1pcHMsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorLyogTUFQX1VOSU5JVElBTElaRUQgaXMgdW5kZWZpbmVkIG9uIG1pcHMsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfVU5JTklUSUFMSVpFRAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvbW4xMDMwMC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvbW4xMDMwMC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWVhMzZkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9tbjEwMzAwL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBUT09MU19BUkNIX01OMTAzMDBfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX01OMTAzMDBfVUFQSV9BU01fTU1BTl9GSVhfSAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBtbjEwMzAwLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Q4ZDViCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw0NyBAQAorI2lmbmRlZiBUT09MU19BUkNIX1BBUklTQ19VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfUEFSSVNDX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgTUFEVl9ET0RVTVAJNzAKKyNkZWZpbmUgTUFEVl9ET0ZPUksJMTEKKyNkZWZpbmUgTUFEVl9ET05URFVNUCAgIDY5CisjZGVmaW5lIE1BRFZfRE9OVEZPUksJMTAKKyNkZWZpbmUgTUFEVl9ET05UTkVFRCAgIDQKKyNkZWZpbmUgTUFEVl9GUkVFCTgKKyNkZWZpbmUgTUFEVl9IVUdFUEFHRQk2NworI2RlZmluZSBNQURWX01FUkdFQUJMRSAgIDY1CisjZGVmaW5lIE1BRFZfTk9IVUdFUEFHRQk2OAorI2RlZmluZSBNQURWX05PUk1BTCAgICAgMAorI2RlZmluZSBNQURWX1JBTkRPTSAgICAgMQorI2RlZmluZSBNQURWX1JFTU9WRQk5CisjZGVmaW5lIE1BRFZfU0VRVUVOVElBTCAyCisjZGVmaW5lIE1BRFZfVU5NRVJHRUFCTEUgNjYKKyNkZWZpbmUgTUFEVl9XSUxMTkVFRCAgIDMKKyNkZWZpbmUgTUFQX0FOT05ZTU9VUwkweDEwCisjZGVmaW5lIE1BUF9ERU5ZV1JJVEUJMHgwODAwCisjZGVmaW5lIE1BUF9FWEVDVVRBQkxFCTB4MTAwMAorI2RlZmluZSBNQVBfRklMRQkwCisjZGVmaW5lIE1BUF9GSVhFRAkweDA0CisjZGVmaW5lIE1BUF9HUk9XU0RPV04JMHg4MDAwCisjZGVmaW5lIE1BUF9IVUdFVExCCTB4ODAwMDAKKyNkZWZpbmUgTUFQX0xPQ0tFRAkweDIwMDAKKyNkZWZpbmUgTUFQX05PTkJMT0NLCTB4MjAwMDAKKyNkZWZpbmUgTUFQX05PUkVTRVJWRQkweDQwMDAKKyNkZWZpbmUgTUFQX1BPUFVMQVRFCTB4MTAwMDAKKyNkZWZpbmUgTUFQX1BSSVZBVEUJMHgwMgorI2RlZmluZSBNQVBfU0hBUkVECTB4MDEKKyNkZWZpbmUgTUFQX1NUQUNLCTB4NDAwMDAKKyNkZWZpbmUgUFJPVF9FWEVDCTB4NAorI2RlZmluZSBQUk9UX0dST1dTRE9XTgkweDAxMDAwMDAwCisjZGVmaW5lIFBST1RfR1JPV1NVUAkweDAyMDAwMDAwCisjZGVmaW5lIFBST1RfTk9ORQkweDAKKyNkZWZpbmUgUFJPVF9SRUFECTB4MQorI2RlZmluZSBQUk9UX1NFTQkweDgKKyNkZWZpbmUgUFJPVF9XUklURQkweDIKKy8qIE1BRFZfSFdQT0lTT04gaXMgdW5kZWZpbmVkIG9uIHBhcmlzYywgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BRFZfSFdQT0lTT04JMTAwCisvKiBNQURWX1NPRlRfT0ZGTElORSBpcyB1bmRlZmluZWQgb24gcGFyaXNjLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFEVl9TT0ZUX09GRkxJTkUgMTAxCisvKiBNQVBfMzJCSVQgaXMgdW5kZWZpbmVkIG9uIHBhcmlzYywgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisvKiBNQVBfVU5JTklUSUFMSVpFRCBpcyB1bmRlZmluZWQgb24gcGFyaXNjLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQX1VOSU5JVElBTElaRUQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL3Bvd2VycGMvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL3Bvd2VycGMvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxZGI0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvcG93ZXJwYy9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfUE9XRVJQQ19VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfUE9XRVJQQ19VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIE1BUF9ERU5ZV1JJVEUJMHgwODAwCisjZGVmaW5lIE1BUF9FWEVDVVRBQkxFCTB4MTAwMAorI2RlZmluZSBNQVBfR1JPV1NET1dOCTB4MDEwMAorI2RlZmluZSBNQVBfSFVHRVRMQgkweDQwMDAwCisjZGVmaW5lIE1BUF9MT0NLRUQJMHg4MAorI2RlZmluZSBNQVBfTk9OQkxPQ0sJMHgxMDAwMAorI2RlZmluZSBNQVBfTk9SRVNFUlZFICAgMHg0MAorI2RlZmluZSBNQVBfUE9QVUxBVEUJMHg4MDAwCisjZGVmaW5lIE1BUF9TVEFDSwkweDIwMDAwCisjaW5jbHVkZSA8dWFwaS9hc20tZ2VuZXJpYy9tbWFuLWNvbW1vbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBwb3dlcnBjLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9zMzkwL2luY2x1ZGUvdWFwaS9hc20va3ZtLmggYi90b29scy9hcmNoL3MzOTAvaW5jbHVkZS91YXBpL2FzbS9rdm0uaAppbmRleCAzYjhlOTllLi5hMmZmZWM0IDEwMDY0NAotLS0gYS90b29scy9hcmNoL3MzOTAvaW5jbHVkZS91YXBpL2FzbS9rdm0uaAorKysgYi90b29scy9hcmNoL3MzOTAvaW5jbHVkZS91YXBpL2FzbS9rdm0uaApAQCAtOTMsNiArOTMsNDcgQEAKIAlfX3U2NCBmYWNfbGlzdFsyNTZdOwogfTsKIAorI2RlZmluZSBLVk1fUzM5MF9WTV9DUFVfUFJPQ0VTU09SX0ZFQVQJMgorI2RlZmluZSBLVk1fUzM5MF9WTV9DUFVfTUFDSElORV9GRUFUCTMKKworI2RlZmluZSBLVk1fUzM5MF9WTV9DUFVfRkVBVF9OUl9CSVRTCTEwMjQKKyNkZWZpbmUgS1ZNX1MzOTBfVk1fQ1BVX0ZFQVRfRVNPUAkwCisjZGVmaW5lIEtWTV9TMzkwX1ZNX0NQVV9GRUFUX1NJRUYyCTEKKyNkZWZpbmUgS1ZNX1MzOTBfVk1fQ1BVX0ZFQVRfNjRCU0NBTwkyCisjZGVmaW5lIEtWTV9TMzkwX1ZNX0NQVV9GRUFUX1NJSUYJMworI2RlZmluZSBLVk1fUzM5MF9WTV9DUFVfRkVBVF9HUEVSRQk0CisjZGVmaW5lIEtWTV9TMzkwX1ZNX0NQVV9GRUFUX0dTTFMJNQorI2RlZmluZSBLVk1fUzM5MF9WTV9DUFVfRkVBVF9JQgkJNgorI2RlZmluZSBLVk1fUzM5MF9WTV9DUFVfRkVBVF9DRUkJNworI2RlZmluZSBLVk1fUzM5MF9WTV9DUFVfRkVBVF9JQlMJOAorI2RlZmluZSBLVk1fUzM5MF9WTV9DUFVfRkVBVF9TS0VZCTkKKyNkZWZpbmUgS1ZNX1MzOTBfVk1fQ1BVX0ZFQVRfQ01NQQkxMAorI2RlZmluZSBLVk1fUzM5MF9WTV9DUFVfRkVBVF9QRk1GSQkxMQorI2RlZmluZSBLVk1fUzM5MF9WTV9DUFVfRkVBVF9TSUdQSUYJMTIKK3N0cnVjdCBrdm1fczM5MF92bV9jcHVfZmVhdCB7CisJX191NjQgZmVhdFsxNl07Cit9OworCisjZGVmaW5lIEtWTV9TMzkwX1ZNX0NQVV9QUk9DRVNTT1JfU1VCRlVOQwk0CisjZGVmaW5lIEtWTV9TMzkwX1ZNX0NQVV9NQUNISU5FX1NVQkZVTkMJCTUKKy8qIGZvciAidGVzdCBiaXQiIGluc3RydWN0aW9ucyBNU0IgMCBiaXQgb3JkZXJpbmcsIGZvciAicXVlcnkiIHJhdyBibG9ja3MgKi8KK3N0cnVjdCBrdm1fczM5MF92bV9jcHVfc3ViZnVuYyB7CisJX191OCBwbG9bMzJdOwkJLyogYWx3YXlzICovCisJX191OCBwdGZmWzE2XTsJCS8qIHdpdGggVE9ELWNsb2NrIHN0ZWVyaW5nICovCisJX191OCBrbWFjWzE2XTsJCS8qIHdpdGggTVNBICovCisJX191OCBrbWNbMTZdOwkJLyogd2l0aCBNU0EgKi8KKwlfX3U4IGttWzE2XTsJCS8qIHdpdGggTVNBICovCisJX191OCBraW1kWzE2XTsJCS8qIHdpdGggTVNBICovCisJX191OCBrbG1kWzE2XTsJCS8qIHdpdGggTVNBICovCisJX191OCBwY2ttb1sxNl07CQkvKiB3aXRoIE1TQTMgKi8KKwlfX3U4IGttY3RyWzE2XTsJCS8qIHdpdGggTVNBNCAqLworCV9fdTgga21mWzE2XTsJCS8qIHdpdGggTVNBNCAqLworCV9fdTgga21vWzE2XTsJCS8qIHdpdGggTVNBNCAqLworCV9fdTggcGNjWzE2XTsJCS8qIHdpdGggTVNBNCAqLworCV9fdTggcHBub1sxNl07CQkvKiB3aXRoIE1TQTUgKi8KKwlfX3U4IHJlc2VydmVkWzE4MjRdOworfTsKKwogLyoga3ZtIGF0dHJpYnV0ZXMgZm9yIGNyeXB0byAqLwogI2RlZmluZSBLVk1fUzM5MF9WTV9DUllQVE9fRU5BQkxFX0FFU19LVwkwCiAjZGVmaW5lIEtWTV9TMzkwX1ZNX0NSWVBUT19FTkFCTEVfREVBX0tXCTEKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDNkZWE5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9zMzkwL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBUT09MU19BUkNIX1MzOTBfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX1MzOTBfVUFQSV9BU01fTU1BTl9GSVhfSAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBzMzkwLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9zMzkwL2luY2x1ZGUvdWFwaS9hc20vc2llLmggYi90b29scy9hcmNoL3MzOTAvaW5jbHVkZS91YXBpL2FzbS9zaWUuaAppbmRleCA4ZmI1ZDRhLi4zYWM2MzQzIDEwMDY0NAotLS0gYS90b29scy9hcmNoL3MzOTAvaW5jbHVkZS91YXBpL2FzbS9zaWUuaAorKysgYi90b29scy9hcmNoL3MzOTAvaW5jbHVkZS91YXBpL2FzbS9zaWUuaApAQCAtMTQwLDYgKzE0MCw3IEBACiAJZXhpdF9jb2RlX2lwYTAoMHhCMiwgMHg0YywgIlRBUiIpLAlcCiAJZXhpdF9jb2RlX2lwYTAoMHhCMiwgMHg1MCwgIkNTUCIpLAlcCiAJZXhpdF9jb2RlX2lwYTAoMHhCMiwgMHg1NCwgIk1WUEciKSwJXAorCWV4aXRfY29kZV9pcGEwKDB4QjIsIDB4NTYsICJTVEhZSSIpLAlcCiAJZXhpdF9jb2RlX2lwYTAoMHhCMiwgMHg1OCwgIkJTRyIpLAlcCiAJZXhpdF9jb2RlX2lwYTAoMHhCMiwgMHg1YSwgIkJTQSIpLAlcCiAJZXhpdF9jb2RlX2lwYTAoMHhCMiwgMHg1ZiwgIkNIU0MiKSwJXApkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9zY29yZS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvc2NvcmUvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4ZmI4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvc2NvcmUvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfU0NPUkVfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX1NDT1JFX1VBUElfQVNNX01NQU5fRklYX0gKKyNpbmNsdWRlIDx1YXBpL2FzbS1nZW5lcmljL21tYW4uaD4KKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24gc2NvcmUsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL3NoL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oIGIvdG9vbHMvYXJjaC9zaC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjUwNGY2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9zaC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9TSF9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfU0hfVUFQSV9BU01fTU1BTl9GSVhfSAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBzaCwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvc3BhcmMvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL3NwYXJjL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NDA1MjUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL3NwYXJjL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9TUEFSQ19VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfU1BBUkNfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBNQVBfREVOWVdSSVRFCTB4MDgwMAorI2RlZmluZSBNQVBfRVhFQ1VUQUJMRQkweDEwMDAKKyNkZWZpbmUgTUFQX0dST1dTRE9XTgkweDAyMDAKKyNkZWZpbmUgTUFQX0hVR0VUTEIJMHg0MDAwMAorI2RlZmluZSBNQVBfTE9DS0VEICAgICAgMHgxMDAKKyNkZWZpbmUgTUFQX05PTkJMT0NLCTB4MTAwMDAKKyNkZWZpbmUgTUFQX05PUkVTRVJWRSAgIDB4NDAKKyNkZWZpbmUgTUFQX1BPUFVMQVRFCTB4ODAwMAorI2RlZmluZSBNQVBfU1RBQ0sJMHgyMDAwMAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi1jb21tb24uaD4KKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24gc3BhcmMsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL3RpbGUvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL3RpbGUvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExNmM0YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvdGlsZS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfVElMRV9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfVElMRV9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIE1BUF9ERU5ZV1JJVEUJMHgwODAwCisjZGVmaW5lIE1BUF9FWEVDVVRBQkxFCTB4MTAwMAorI2RlZmluZSBNQVBfR1JPV1NET1dOCTB4MDEwMAorI2RlZmluZSBNQVBfSFVHRVRMQgkweDQwMDAKKyNkZWZpbmUgTUFQX0xPQ0tFRAkweDAyMDAKKyNkZWZpbmUgTUFQX05PTkJMT0NLCTB4MDA4MAorI2RlZmluZSBNQVBfTk9SRVNFUlZFCTB4MDQwMAorI2RlZmluZSBNQVBfUE9QVUxBVEUJMHgwMDQwCisjZGVmaW5lIE1BUF9TVEFDSwlNQVBfR1JPV1NET1dOCisjaW5jbHVkZSA8dWFwaS9hc20tZ2VuZXJpYy9tbWFuLWNvbW1vbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiB0aWxlLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzNjMWFmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw1IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfWDg2X1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9YODZfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBNQVBfMzJCSVQJMHg0MAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi5oPgorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL3h0ZW5zYS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gveHRlbnNhL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NTMxOTUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL3h0ZW5zYS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDQ3IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfWFRFTlNBX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9YVEVOU0FfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBNQURWX0RPRFVNUAkxNworI2RlZmluZSBNQURWX0RPRk9SSwkxMQorI2RlZmluZSBNQURWX0RPTlREVU1QICAgMTYKKyNkZWZpbmUgTUFEVl9ET05URk9SSwkxMAorI2RlZmluZSBNQURWX0RPTlRORUVECTQKKyNkZWZpbmUgTUFEVl9GUkVFCTgKKyNkZWZpbmUgTUFEVl9IVUdFUEFHRQkxNAorI2RlZmluZSBNQURWX01FUkdFQUJMRSAgIDEyCisjZGVmaW5lIE1BRFZfTk9IVUdFUEFHRQkxNQorI2RlZmluZSBNQURWX05PUk1BTAkwCisjZGVmaW5lIE1BRFZfUkFORE9NCTEKKyNkZWZpbmUgTUFEVl9SRU1PVkUJOQorI2RlZmluZSBNQURWX1NFUVVFTlRJQUwJMgorI2RlZmluZSBNQURWX1VOTUVSR0VBQkxFIDEzCisjZGVmaW5lIE1BRFZfV0lMTE5FRUQJMworI2RlZmluZSBNQVBfQU5PTllNT1VTCTB4MDgwMAorI2RlZmluZSBNQVBfREVOWVdSSVRFCTB4MjAwMAorI2RlZmluZSBNQVBfRVhFQ1VUQUJMRQkweDQwMDAKKyNkZWZpbmUgTUFQX0ZJTEUJMAorI2RlZmluZSBNQVBfRklYRUQJMHgwMTAKKyNkZWZpbmUgTUFQX0dST1dTRE9XTgkweDEwMDAKKyNkZWZpbmUgTUFQX0hVR0VUTEIJMHg4MDAwMAorI2RlZmluZSBNQVBfTE9DS0VECTB4ODAwMAorI2RlZmluZSBNQVBfTk9OQkxPQ0sJMHgyMDAwMAorI2RlZmluZSBNQVBfTk9SRVNFUlZFCTB4MDQwMAorI2RlZmluZSBNQVBfUE9QVUxBVEUJMHgxMDAwMAorI2RlZmluZSBNQVBfUFJJVkFURQkweDAwMgorI2RlZmluZSBNQVBfU0hBUkVECTB4MDAxCisjZGVmaW5lIE1BUF9TVEFDSwkweDQwMDAwCisjZGVmaW5lIFBST1RfRVhFQwkweDQKKyNkZWZpbmUgUFJPVF9HUk9XU0RPV04JMHgwMTAwMDAwMAorI2RlZmluZSBQUk9UX0dST1dTVVAJMHgwMjAwMDAwMAorI2RlZmluZSBQUk9UX05PTkUJMHgwCisjZGVmaW5lIFBST1RfUkVBRAkweDEKKyNkZWZpbmUgUFJPVF9TRU0JMHgxMAorI2RlZmluZSBQUk9UX1dSSVRFCTB4MgorLyogTUFEVl9IV1BPSVNPTiBpcyB1bmRlZmluZWQgb24geHRlbnNhLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFEVl9IV1BPSVNPTgkxMDAKKy8qIE1BRFZfU09GVF9PRkZMSU5FIGlzIHVuZGVmaW5lZCBvbiB4dGVuc2EsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQURWX1NPRlRfT0ZGTElORSAxMDEKKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24geHRlbnNhLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKy8qIE1BUF9VTklOSVRJQUxJWkVEIGlzIHVuZGVmaW5lZCBvbiB4dGVuc2EsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfVU5JTklUSUFMSVpFRAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2dwaW8vZ3Bpby1ldmVudC1tb24uYyBiL3Rvb2xzL2dwaW8vZ3Bpby1ldmVudC1tb24uYwppbmRleCA0NDhlZDk2Li4xYzE0YzI1IDEwMDY0NAotLS0gYS90b29scy9ncGlvL2dwaW8tZXZlbnQtbW9uLmMKKysrIGIvdG9vbHMvZ3Bpby9ncGlvLWV2ZW50LW1vbi5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGdwaW8taGFtbWVyIC0gZXhhbXBsZSBzd2lzcyBhcm15IGtuaWZlIHRvIHNoYWtlIEdQSU8gbGluZXMgb24gYSBzeXN0ZW0KKyAqIGdwaW8tZXZlbnQtbW9uIC0gbW9uaXRvciBHUElPIGxpbmUgZXZlbnRzIGZyb20gdXNlcnNwYWNlCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDE2IExpbnVzIFdhbGxlaWoKICAqCmRpZmYgLS1naXQgYS90b29scy9odi9odl9rdnBfZGFlbW9uLmMgYi90b29scy9odi9odl9rdnBfZGFlbW9uLmMKaW5kZXggMGQ5ZjQ4ZS4uYmM3YWRiOCAxMDA2NDQKLS0tIGEvdG9vbHMvaHYvaHZfa3ZwX2RhZW1vbi5jCisrKyBiL3Rvb2xzL2h2L2h2X2t2cF9kYWVtb24uYwpAQCAtMTQzMyw3ICsxNDMzLDcgQEAKIAlvcGVubG9nKCJLVlAiLCAwLCBMT0dfVVNFUik7CiAJc3lzbG9nKExPR19JTkZPLCAiS1ZQIHN0YXJ0aW5nOyBwaWQgaXM6JWQiLCBnZXRwaWQoKSk7CiAKLQlrdnBfZmQgPSBvcGVuKCIvZGV2L3ZtYnVzL2h2X2t2cCIsIE9fUkRXUik7CisJa3ZwX2ZkID0gb3BlbigiL2Rldi92bWJ1cy9odl9rdnAiLCBPX1JEV1IgfCBPX0NMT0VYRUMpOwogCiAJaWYgKGt2cF9mZCA8IDApIHsKIAkJc3lzbG9nKExPR19FUlIsICJvcGVuIC9kZXYvdm1idXMvaHZfa3ZwIGZhaWxlZDsgZXJyb3I6ICVkICVzIiwKZGlmZiAtLWdpdCBhL3Rvb2xzL2h2L2h2X3Zzc19kYWVtb24uYyBiL3Rvb2xzL2h2L2h2X3Zzc19kYWVtb24uYwppbmRleCA1ZDUxZDZmLi5lMDgyOTgwIDEwMDY0NAotLS0gYS90b29scy9odi9odl92c3NfZGFlbW9uLmMKKysrIGIvdG9vbHMvaHYvaHZfdnNzX2RhZW1vbi5jCkBAIC0yNTAsNiArMjUwLDkgQEAKIAkJCQlzeXNsb2coTE9HX0VSUiwgIi9ldGMvZnN0YWIgYW5kIC9wcm9jL21vdW50cyIpOwogCQkJfQogCQkJYnJlYWs7CisJCWNhc2UgVlNTX09QX0hPVF9CQUNLVVA6CisJCQlzeXNsb2coTE9HX0lORk8sICJWU1M6IG9wPUNIRUNLIEhPVCBCQUNLVVBcbiIpOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlzeXNsb2coTE9HX0VSUiwgIklsbGVnYWwgb3A6JWRcbiIsIG9wKTsKIAkJfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWlvL2lpb19nZW5lcmljX2J1ZmZlci5jIGIvdG9vbHMvaWlvL2lpb19nZW5lcmljX2J1ZmZlci5jCmluZGV4IDBlOGExZjcuLmYzOWMwZTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2lpby9paW9fZ2VuZXJpY19idWZmZXIuYworKysgYi90b29scy9paW8vaWlvX2dlbmVyaWNfYnVmZmVyLmMKQEAgLTM0OCw3ICszNDgsNyBAQAogCWludCBub3RyaWdnZXIgPSAwOwogCWNoYXIgKmR1bW15OwogCi0Jc3RydWN0IGlpb19jaGFubmVsX2luZm8gKmNoYW5uZWxzOworCXN0cnVjdCBpaW9fY2hhbm5lbF9pbmZvICpjaGFubmVscyA9IE5VTEw7CiAKIAlyZWdpc3Rlcl9jbGVhbnVwKCk7CiAKQEAgLTQ1Niw3ICs0NTYsNyBAQAogCiAJaWYgKG5vdHJpZ2dlcikgewogCQlwcmludGYoInRyaWdnZXItbGVzcyBtb2RlIHNlbGVjdGVkXG4iKTsKLQl9IGlmICh0cmlnX251bSA+PSAwKSB7CisJfSBlbHNlIGlmICh0cmlnX251bSA+PSAwKSB7CiAJCWNoYXIgKnRyaWdfZGV2X25hbWU7CiAJCXJldCA9IGFzcHJpbnRmKCZ0cmlnX2Rldl9uYW1lLCAiJXN0cmlnZ2VyJWQiLCBpaW9fZGlyLCB0cmlnX251bSk7CiAJCWlmIChyZXQgPCAwKSB7CmRpZmYgLS1naXQgYS90b29scy9paW8vaWlvX3V0aWxzLmMgYi90b29scy9paW8vaWlvX3V0aWxzLmMKaW5kZXggNWViNjc5My4uN2E2ZDYxYyAxMDA2NDQKLS0tIGEvdG9vbHMvaWlvL2lpb191dGlscy5jCisrKyBiL3Rvb2xzL2lpby9paW9fdXRpbHMuYwpAQCAtMTIxLDEwICsxMjEsNiBAQAogCiAJcmV0ID0gLUVOT0VOVDsKIAl3aGlsZSAoZW50ID0gcmVhZGRpcihkcCksIGVudCkKLQkJLyoKLQkJICogRG8gd2UgYWxsb3cgZGV2aWNlcyB0byBvdmVycmlkZSBhIGdlbmVyaWMgbmFtZSB3aXRoCi0JCSAqIGEgc3BlY2lmaWMgb25lPwotCQkgKi8KIAkJaWYgKChzdHJjbXAoYnVpbHRuYW1lLCBlbnQtPmRfbmFtZSkgPT0gMCkgfHwKIAkJICAgIChzdHJjbXAoYnVpbHRuYW1lX2dlbmVyaWMsIGVudC0+ZF9uYW1lKSA9PSAwKSkgewogCQkJcmV0ID0gYXNwcmludGYoJmZpbGVuYW1lLApAQCAtMTc4LDYgKzE3NCwxMyBAQAogCQkJc3lzZnNmcCA9IDA7CiAJCQlmcmVlKGZpbGVuYW1lKTsKIAkJCWZpbGVuYW1lID0gMDsKKworCQkJLyoKKwkJCSAqIEF2b2lkIGhhdmluZyBhIG1vcmUgZ2VuZXJpYyBlbnRyeSBvdmVyd3JpdGluZworCQkJICogdGhlIHNldHRpbmdzLgorCQkJICovCisJCQlpZiAoc3RyY21wKGJ1aWx0bmFtZSwgZW50LT5kX25hbWUpID09IDApCisJCQkJYnJlYWs7CiAJCX0KIAogZXJyb3JfY2xvc2Vfc3lzZnNmcDoKZGlmZiAtLWdpdCBhL3Rvb2xzL2lpby9sc2lpby5jIGIvdG9vbHMvaWlvL2xzaWlvLmMKaW5kZXggM2Q2NTBlNi4uYWIwZjVjZiAxMDA2NDQKLS0tIGEvdG9vbHMvaWlvL2xzaWlvLmMKKysrIGIvdG9vbHMvaWlvL2xzaWlvLmMKQEAgLTUxLDcgKzUxLDggQEAKIAogCXdoaWxlIChlbnQgPSByZWFkZGlyKGRwKSwgZW50KQogCQlpZiAoY2hlY2tfcHJlZml4KGVudC0+ZF9uYW1lLCAiaW5fIikgJiYKLQkJICAgIGNoZWNrX3Bvc3RmaXgoZW50LT5kX25hbWUsICJfcmF3IikpCisJCSAgIChjaGVja19wb3N0Zml4KGVudC0+ZF9uYW1lLCAiX3JhdyIpIHx8CisJCSAgICBjaGVja19wb3N0Zml4KGVudC0+ZF9uYW1lLCAiX2lucHV0IikpKQogCQkJcHJpbnRmKCIgICAlLTEwc1xuIiwgZW50LT5kX25hbWUpOwogCiAJcmV0dXJuIChjbG9zZWRpcihkcCkgPT0gLTEpID8gLWVycm5vIDogMDsKZGlmZiAtLWdpdCBhL3Rvb2xzL2luY2x1ZGUvbGludXgvY29yZXNpZ2h0LXBtdS5oIGIvdG9vbHMvaW5jbHVkZS9saW51eC9jb3Jlc2lnaHQtcG11LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q0MTAyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2luY2x1ZGUvbGludXgvY29yZXNpZ2h0LXBtdS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQoQykgMjAxNSBMaW5hcm8gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEF1dGhvcjogTWF0aGlldSBQb2lyaWVyIDxtYXRoaWV1LnBvaXJpZXJAbGluYXJvLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX0xJTlVYX0NPUkVTSUdIVF9QTVVfSAorI2RlZmluZSBfTElOVVhfQ09SRVNJR0hUX1BNVV9ICisKKyNkZWZpbmUgQ09SRVNJR0hUX0VUTV9QTVVfTkFNRSAiY3NfZXRtIgorI2RlZmluZSBDT1JFU0lHSFRfRVRNX1BNVV9TRUVEICAweDEwCisKKy8qIEVUTXYzLjUvUFRNJ3MgRVRNQ1IgY29uZmlnIGJpdCAqLworI2RlZmluZSBFVE1fT1BUX0NZQ0FDQyAgMTIKKyNkZWZpbmUgRVRNX09QVF9UUyAgICAgIDI4CisKK3N0YXRpYyBpbmxpbmUgaW50IGNvcmVzaWdodF9nZXRfdHJhY2VfaWQoaW50IGNwdSkKK3sKKwkvKgorCSAqIEEgdHJhY2UgSUQgb2YgdmFsdWUgMCBpcyBpbnZhbGlkLCBzbyBsZXQncyBzdGFydCBhdCBzb21lCisJICogcmFuZG9tIHZhbHVlIHRoYXQgZml0cyBpbiA3IGJpdHMgYW5kIGdvIGZyb20gdGhlcmUuICBTaW5jZQorCSAqIHRoZSBjb21tb24gY29udmVudGlvbiBpcyB0byBoYXZlIGRhdGEgdHJhY2UgSURzIGJlIEkoTikgKyAxLAorCSAqIHNldCBpbnN0cnVjdGlvbiB0cmFjZSBJRHMgYXMgYSBmdW5jdGlvbiBvZiB0aGUgQ1BVIG51bWJlci4KKwkgKi8KKwlyZXR1cm4gKENPUkVTSUdIVF9FVE1fUE1VX1NFRUQgKyAoY3B1ICogMikpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2luY2x1ZGUvbGludXgvc3RyaW5nLmggYi90b29scy9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCmluZGV4IGI5Njg3OTQuLmY0MzZkMjQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKKysrIGIvdG9vbHMvaW5jbHVkZS9saW51eC9zdHJpbmcuaApAQCAtOCw3ICs4LDExIEBACiAKIGludCBzdHJ0b2Jvb2woY29uc3QgY2hhciAqcywgYm9vbCAqcmVzKTsKIAotI2lmZGVmIF9fR0xJQkNfXworLyoKKyAqIGdsaWJjIGJhc2VkIGJ1aWxkcyBuZWVkcyB0aGUgZXh0ZXJuIHdoaWxlIHVDbGliYyBkb2Vzbid0LgorICogSG93ZXZlciB1Q2xpYmMgaGVhZGVycyBhbHNvIGRlZmluZSBfX0dMSUJDX18gaGVuY2UgdGhlIGhhY2sgYmVsb3cKKyAqLworI2lmIGRlZmluZWQoX19HTElCQ19fKSAmJiAhZGVmaW5lZChfX1VDTElCQ19fKQogZXh0ZXJuIHNpemVfdCBzdHJsY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNpemUpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2luY2x1ZGUvbGludXgvdGltZTY0LmggYi90b29scy9pbmNsdWRlL2xpbnV4L3RpbWU2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTI2NTQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pbmNsdWRlL2xpbnV4L3RpbWU2NC5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX1RPT0xTX0xJTlVYX1RJTUU2NF9ICisjZGVmaW5lIF9UT09MU19MSU5VWF9USU1FNjRfSAorCisjZGVmaW5lIE1TRUNfUEVSX1NFQwkxMDAwTAorI2RlZmluZSBVU0VDX1BFUl9NU0VDCTEwMDBMCisjZGVmaW5lIE5TRUNfUEVSX1VTRUMJMTAwMEwKKyNkZWZpbmUgTlNFQ19QRVJfTVNFQwkxMDAwMDAwTAorI2RlZmluZSBVU0VDX1BFUl9TRUMJMTAwMDAwMEwKKyNkZWZpbmUgTlNFQ19QRVJfU0VDCTEwMDAwMDAwMDBMCisjZGVmaW5lIEZTRUNfUEVSX1NFQwkxMDAwMDAwMDAwMDAwMDAwTEwKKworI2VuZGlmIC8qIF9MSU5VWF9USU1FNjRfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21tYW4tY29tbW9uLmggYi90b29scy9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvbW1hbi1jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODI3NDM4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21tYW4tY29tbW9uLmgKQEAgLTAsMCArMSw3NSBAQAorI2lmbmRlZiBfX0FTTV9HRU5FUklDX01NQU5fQ09NTU9OX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19NTUFOX0NPTU1PTl9ICisKKy8qCisgQXV0aG9yOiBNaWNoYWVsIFMuIFRzaXJraW4gPG1zdEBtZWxsYW5veC5jby5pbD4sIE1lbGxhbm94IFRlY2hub2xvZ2llcyBMdGQuCisgQmFzZWQgb246IGFzbS14eHgvbW1hbi5oCisqLworCisjZGVmaW5lIFBST1RfUkVBRAkweDEJCS8qIHBhZ2UgY2FuIGJlIHJlYWQgKi8KKyNkZWZpbmUgUFJPVF9XUklURQkweDIJCS8qIHBhZ2UgY2FuIGJlIHdyaXR0ZW4gKi8KKyNkZWZpbmUgUFJPVF9FWEVDCTB4NAkJLyogcGFnZSBjYW4gYmUgZXhlY3V0ZWQgKi8KKyNkZWZpbmUgUFJPVF9TRU0JMHg4CQkvKiBwYWdlIG1heSBiZSB1c2VkIGZvciBhdG9taWMgb3BzICovCisjZGVmaW5lIFBST1RfTk9ORQkweDAJCS8qIHBhZ2UgY2FuIG5vdCBiZSBhY2Nlc3NlZCAqLworI2RlZmluZSBQUk9UX0dST1dTRE9XTgkweDAxMDAwMDAwCS8qIG1wcm90ZWN0IGZsYWc6IGV4dGVuZCBjaGFuZ2UgdG8gc3RhcnQgb2YgZ3Jvd3Nkb3duIHZtYSAqLworI2RlZmluZSBQUk9UX0dST1dTVVAJMHgwMjAwMDAwMAkvKiBtcHJvdGVjdCBmbGFnOiBleHRlbmQgY2hhbmdlIHRvIGVuZCBvZiBncm93c3VwIHZtYSAqLworCisjZGVmaW5lIE1BUF9TSEFSRUQJMHgwMQkJLyogU2hhcmUgY2hhbmdlcyAqLworI2RlZmluZSBNQVBfUFJJVkFURQkweDAyCQkvKiBDaGFuZ2VzIGFyZSBwcml2YXRlICovCisjZGVmaW5lIE1BUF9UWVBFCTB4MGYJCS8qIE1hc2sgZm9yIHR5cGUgb2YgbWFwcGluZyAqLworI2RlZmluZSBNQVBfRklYRUQJMHgxMAkJLyogSW50ZXJwcmV0IGFkZHIgZXhhY3RseSAqLworI2RlZmluZSBNQVBfQU5PTllNT1VTCTB4MjAJCS8qIGRvbid0IHVzZSBhIGZpbGUgKi8KKyNpZmRlZiBDT05GSUdfTU1BUF9BTExPV19VTklOSVRJQUxJWkVECisjIGRlZmluZSBNQVBfVU5JTklUSUFMSVpFRCAweDQwMDAwMDAJLyogRm9yIGFub255bW91cyBtbWFwLCBtZW1vcnkgY291bGQgYmUgdW5pbml0aWFsaXplZCAqLworI2Vsc2UKKyMgZGVmaW5lIE1BUF9VTklOSVRJQUxJWkVEIDB4MAkJLyogRG9uJ3Qgc3VwcG9ydCB0aGlzIGZsYWcgKi8KKyNlbmRpZgorCisvKgorICogRmxhZ3MgZm9yIG1sb2NrCisgKi8KKyNkZWZpbmUgTUxPQ0tfT05GQVVMVAkweDAxCQkvKiBMb2NrIHBhZ2VzIGluIHJhbmdlIGFmdGVyIHRoZXkgYXJlIGZhdWx0ZWQgaW4sIGRvIG5vdCBwcmVmYXVsdCAqLworCisjZGVmaW5lIE1TX0FTWU5DCTEJCS8qIHN5bmMgbWVtb3J5IGFzeW5jaHJvbm91c2x5ICovCisjZGVmaW5lIE1TX0lOVkFMSURBVEUJMgkJLyogaW52YWxpZGF0ZSB0aGUgY2FjaGVzICovCisjZGVmaW5lIE1TX1NZTkMJCTQJCS8qIHN5bmNocm9ub3VzIG1lbW9yeSBzeW5jICovCisKKyNkZWZpbmUgTUFEVl9OT1JNQUwJMAkJLyogbm8gZnVydGhlciBzcGVjaWFsIHRyZWF0bWVudCAqLworI2RlZmluZSBNQURWX1JBTkRPTQkxCQkvKiBleHBlY3QgcmFuZG9tIHBhZ2UgcmVmZXJlbmNlcyAqLworI2RlZmluZSBNQURWX1NFUVVFTlRJQUwJMgkJLyogZXhwZWN0IHNlcXVlbnRpYWwgcGFnZSByZWZlcmVuY2VzICovCisjZGVmaW5lIE1BRFZfV0lMTE5FRUQJMwkJLyogd2lsbCBuZWVkIHRoZXNlIHBhZ2VzICovCisjZGVmaW5lIE1BRFZfRE9OVE5FRUQJNAkJLyogZG9uJ3QgbmVlZCB0aGVzZSBwYWdlcyAqLworCisvKiBjb21tb24gcGFyYW1ldGVyczogdHJ5IHRvIGtlZXAgdGhlc2UgY29uc2lzdGVudCBhY3Jvc3MgYXJjaGl0ZWN0dXJlcyAqLworI2RlZmluZSBNQURWX0ZSRUUJOAkJLyogZnJlZSBwYWdlcyBvbmx5IGlmIG1lbW9yeSBwcmVzc3VyZSAqLworI2RlZmluZSBNQURWX1JFTU9WRQk5CQkvKiByZW1vdmUgdGhlc2UgcGFnZXMgJiByZXNvdXJjZXMgKi8KKyNkZWZpbmUgTUFEVl9ET05URk9SSwkxMAkJLyogZG9uJ3QgaW5oZXJpdCBhY3Jvc3MgZm9yayAqLworI2RlZmluZSBNQURWX0RPRk9SSwkxMQkJLyogZG8gaW5oZXJpdCBhY3Jvc3MgZm9yayAqLworI2RlZmluZSBNQURWX0hXUE9JU09OCTEwMAkJLyogcG9pc29uIGEgcGFnZSBmb3IgdGVzdGluZyAqLworI2RlZmluZSBNQURWX1NPRlRfT0ZGTElORSAxMDEJCS8qIHNvZnQgb2ZmbGluZSBwYWdlIGZvciB0ZXN0aW5nICovCisKKyNkZWZpbmUgTUFEVl9NRVJHRUFCTEUgICAxMgkJLyogS1NNIG1heSBtZXJnZSBpZGVudGljYWwgcGFnZXMgKi8KKyNkZWZpbmUgTUFEVl9VTk1FUkdFQUJMRSAxMwkJLyogS1NNIG1heSBub3QgbWVyZ2UgaWRlbnRpY2FsIHBhZ2VzICovCisKKyNkZWZpbmUgTUFEVl9IVUdFUEFHRQkxNAkJLyogV29ydGggYmFja2luZyB3aXRoIGh1Z2VwYWdlcyAqLworI2RlZmluZSBNQURWX05PSFVHRVBBR0UJMTUJCS8qIE5vdCB3b3J0aCBiYWNraW5nIHdpdGggaHVnZXBhZ2VzICovCisKKyNkZWZpbmUgTUFEVl9ET05URFVNUCAgIDE2CQkvKiBFeHBsaWNpdHkgZXhjbHVkZSBmcm9tIHRoZSBjb3JlIGR1bXAsCisJCQkJCSAgIG92ZXJyaWRlcyB0aGUgY29yZWR1bXAgZmlsdGVyIGJpdHMgKi8KKyNkZWZpbmUgTUFEVl9ET0RVTVAJMTcJCS8qIENsZWFyIHRoZSBNQURWX0RPTlREVU1QIGZsYWcgKi8KKworLyogY29tcGF0aWJpbGl0eSBmbGFncyAqLworI2RlZmluZSBNQVBfRklMRQkwCisKKy8qCisgKiBXaGVuIE1BUF9IVUdFVExCIGlzIHNldCBiaXRzIFsyNjozMV0gZW5jb2RlIHRoZSBsb2cyIG9mIHRoZSBodWdlIHBhZ2Ugc2l6ZS4KKyAqIFRoaXMgZ2l2ZXMgdXMgNiBiaXRzLCB3aGljaCBpcyBlbm91Z2ggdW50aWwgc29tZW9uZSBpbnZlbnRzIDEyOCBiaXQgYWRkcmVzcworICogc3BhY2VzLgorICoKKyAqIEFzc3VtZSB0aGVzZSBhcmUgYWxsIHBvd2VyIG9mIHR3b3MuCisgKiBXaGVuIDAgdXNlIHRoZSBkZWZhdWx0IHBhZ2Ugc2l6ZS4KKyAqLworI2RlZmluZSBNQVBfSFVHRV9TSElGVAkyNgorI2RlZmluZSBNQVBfSFVHRV9NQVNLCTB4M2YKKworI2VuZGlmIC8qIF9fQVNNX0dFTkVSSUNfTU1BTl9DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21tYW4uaCBiL3Rvb2xzL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmYTc4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9tbWFuLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfX0FTTV9HRU5FUklDX01NQU5fSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX01NQU5fSAorCisjaW5jbHVkZSA8dWFwaS9hc20tZ2VuZXJpYy9tbWFuLWNvbW1vbi5oPgorCisjZGVmaW5lIE1BUF9HUk9XU0RPV04JMHgwMTAwCQkvKiBzdGFjay1saWtlIHNlZ21lbnQgKi8KKyNkZWZpbmUgTUFQX0RFTllXUklURQkweDA4MDAJCS8qIEVUWFRCU1kgKi8KKyNkZWZpbmUgTUFQX0VYRUNVVEFCTEUJMHgxMDAwCQkvKiBtYXJrIGl0IGFzIGFuIGV4ZWN1dGFibGUgKi8KKyNkZWZpbmUgTUFQX0xPQ0tFRAkweDIwMDAJCS8qIHBhZ2VzIGFyZSBsb2NrZWQgKi8KKyNkZWZpbmUgTUFQX05PUkVTRVJWRQkweDQwMDAJCS8qIGRvbid0IGNoZWNrIGZvciByZXNlcnZhdGlvbnMgKi8KKyNkZWZpbmUgTUFQX1BPUFVMQVRFCTB4ODAwMAkJLyogcG9wdWxhdGUgKHByZWZhdWx0KSBwYWdldGFibGVzICovCisjZGVmaW5lIE1BUF9OT05CTE9DSwkweDEwMDAwCQkvKiBkbyBub3QgYmxvY2sgb24gSU8gKi8KKyNkZWZpbmUgTUFQX1NUQUNLCTB4MjAwMDAJCS8qIGdpdmUgb3V0IGFuIGFkZHJlc3MgdGhhdCBpcyBiZXN0IHN1aXRlZCBmb3IgcHJvY2Vzcy90aHJlYWQgc3RhY2tzICovCisjZGVmaW5lIE1BUF9IVUdFVExCCTB4NDAwMDAJCS8qIGNyZWF0ZSBhIGh1Z2UgcGFnZSBtYXBwaW5nICovCisKKy8qIEJpdHMgWzI2OjMxXSBhcmUgcmVzZXJ2ZWQsIHNlZSBtbWFuLWNvbW1vbi5oIGZvciBNQVBfSFVHRVRMQiB1c2FnZSAqLworCisjZGVmaW5lIE1DTF9DVVJSRU5UCTEJCS8qIGxvY2sgYWxsIGN1cnJlbnQgbWFwcGluZ3MgKi8KKyNkZWZpbmUgTUNMX0ZVVFVSRQkyCQkvKiBsb2NrIGFsbCBmdXR1cmUgbWFwcGluZ3MgKi8KKyNkZWZpbmUgTUNMX09ORkFVTFQJNAkJLyogbG9jayBhbGwgcGFnZXMgdGhhdCBhcmUgZmF1bHRlZCBpbiAqLworCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19NTUFOX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9tbWFuLmggYi90b29scy9pbmNsdWRlL3VhcGkvbGludXgvbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZDhlZGYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pbmNsdWRlL3VhcGkvbGludXgvbW1hbi5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX1VBUElfTElOVVhfTU1BTl9ICisjZGVmaW5lIF9VQVBJX0xJTlVYX01NQU5fSAorCisjaW5jbHVkZSA8dWFwaS9hc20vbW1hbi5oPgorCisjZGVmaW5lIE1SRU1BUF9NQVlNT1ZFCTEKKyNkZWZpbmUgTVJFTUFQX0ZJWEVECTIKKworI2RlZmluZSBPVkVSQ09NTUlUX0dVRVNTCQkwCisjZGVmaW5lIE9WRVJDT01NSVRfQUxXQVlTCQkxCisjZGVmaW5lIE9WRVJDT01NSVRfTkVWRVIJCTIKKworI2VuZGlmIC8qIF9VQVBJX0xJTlVYX01NQU5fSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGd1ZXN0L2xndWVzdC5jIGIvdG9vbHMvbGd1ZXN0L2xndWVzdC5jCmluZGV4IGQ5ODM2YzUuLjExYzhkOWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xndWVzdC9sZ3Vlc3QuYworKysgYi90b29scy9sZ3Vlc3QvbGd1ZXN0LmMKQEAgLTMyNjYsNiArMzI2Niw5IEBACiAJCX0KIAl9CiAKKwkvKiBJZiB3ZSBleGl0IHZpYSBlcnIoKSwgdGhpcyBraWxscyBhbGwgdGhlIHRocmVhZHMsIHJlc3RvcmVzIHR0eS4gKi8KKwlhdGV4aXQoY2xlYW51cF9kZXZpY2VzKTsKKwogCS8qIFdlIGFsd2F5cyBoYXZlIGEgY29uc29sZSBkZXZpY2UsIGFuZCBpdCdzIGFsd2F5cyBkZXZpY2UgMS4gKi8KIAlzZXR1cF9jb25zb2xlKCk7CiAKQEAgLTMzNjksOSArMzM3Miw2IEBACiAJLyogRW5zdXJlIHRoYXQgd2UgdGVybWluYXRlIGlmIGEgZGV2aWNlLXNlcnZpY2luZyBjaGlsZCBkaWVzLiAqLwogCXNpZ25hbChTSUdDSExELCBraWxsX2xhdW5jaGVyKTsKIAotCS8qIElmIHdlIGV4aXQgdmlhIGVycigpLCB0aGlzIGtpbGxzIGFsbCB0aGUgdGhyZWFkcywgcmVzdG9yZXMgdHR5LiAqLwotCWF0ZXhpdChjbGVhbnVwX2RldmljZXMpOwotCiAJLyogSWYgcmVxdWVzdGVkLCBjaHJvb3QgdG8gYSBkaXJlY3RvcnkgKi8KIAlpZiAoY2hyb290X3BhdGgpIHsKIAkJaWYgKGNocm9vdChjaHJvb3RfcGF0aCkgIT0gMCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9hcGkvZnMvZnMuYyBiL3Rvb2xzL2xpYi9hcGkvZnMvZnMuYwppbmRleCBiYTcwOTRiLi5mOTlmNDllNCAxMDA2NDQKLS0tIGEvdG9vbHMvbGliL2FwaS9mcy9mcy5jCisrKyBiL3Rvb2xzL2xpYi9hcGkvZnMvZnMuYwpAQCAtMzQsNiArMzQsMTAgQEAKICNkZWZpbmUgVFJBQ0VGU19NQUdJQyAgICAgICAgICAweDc0NzI2MTYzCiAjZW5kaWYKIAorI2lmbmRlZiBIVUdFVExCRlNfTUFHSUMKKyNkZWZpbmUgSFVHRVRMQkZTX01BR0lDICAgICAgICAweDk1ODQ1OGY2CisjZW5kaWYKKwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzeXNmc19fZnNfa25vd25fbW91bnRwb2ludHNbXSA9IHsKIAkiL3N5cyIsCiAJMCwKQEAgLTY3LDYgKzcxLDEwIEBACiAJMCwKIH07CiAKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaHVnZXRsYmZzX19rbm93bl9tb3VudHBvaW50c1tdID0geworCTAsCit9OworCiBzdHJ1Y3QgZnMgewogCWNvbnN0IGNoYXIJCSpuYW1lOwogCWNvbnN0IGNoYXIgKiBjb25zdAkqbW91bnRzOwpAQCAtODAsNiArODgsNyBAQAogCUZTX19QUk9DRlMgID0gMSwKIAlGU19fREVCVUdGUyA9IDIsCiAJRlNfX1RSQUNFRlMgPSAzLAorCUZTX19IVUdFVExCRlMgPSA0LAogfTsKIAogI2lmbmRlZiBUUkFDRUZTX01BR0lDCkBAIC0xMDcsNiArMTE2LDExIEBACiAJCS5tb3VudHMJPSB0cmFjZWZzX19rbm93bl9tb3VudHBvaW50cywKIAkJLm1hZ2ljCT0gVFJBQ0VGU19NQUdJQywKIAl9LAorCVtGU19fSFVHRVRMQkZTXSA9IHsKKwkJLm5hbWUJPSAiaHVnZXRsYmZzIiwKKwkJLm1vdW50cyA9IGh1Z2V0bGJmc19fa25vd25fbW91bnRwb2ludHMsCisJCS5tYWdpYwk9IEhVR0VUTEJGU19NQUdJQywKKwl9LAogfTsKIAogc3RhdGljIGJvb2wgZnNfX3JlYWRfbW91bnRzKHN0cnVjdCBmcyAqZnMpCkBAIC0yNjUsNiArMjc5LDcgQEAKIEZTKHByb2NmcywgIEZTX19QUk9DRlMpOwogRlMoZGVidWdmcywgRlNfX0RFQlVHRlMpOwogRlModHJhY2VmcywgRlNfX1RSQUNFRlMpOworRlMoaHVnZXRsYmZzLCBGU19fSFVHRVRMQkZTKTsKIAogaW50IGZpbGVuYW1lX19yZWFkX2ludChjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50ICp2YWx1ZSkKIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9hcGkvZnMvZnMuaCBiL3Rvb2xzL2xpYi9hcGkvZnMvZnMuaAppbmRleCAxNmM5YzJlLi5hNjMyNjlmIDEwMDY0NAotLS0gYS90b29scy9saWIvYXBpL2ZzL2ZzLmgKKysrIGIvdG9vbHMvbGliL2FwaS9mcy9mcy5oCkBAIC0yMSw2ICsyMSw3IEBACiBGUyhwcm9jZnMpCiBGUyhkZWJ1Z2ZzKQogRlModHJhY2VmcykKK0ZTKGh1Z2V0bGJmcykKIAogI3VuZGVmIEZTCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL29ianRvb2wvYnVpbHRpbi1jaGVjay5jIGIvdG9vbHMvb2JqdG9vbC9idWlsdGluLWNoZWNrLmMKaW5kZXggYmQwOWQwZS4uMTQzYjZjZCAxMDA2NDQKLS0tIGEvdG9vbHMvb2JqdG9vbC9idWlsdGluLWNoZWNrLmMKKysrIGIvdG9vbHMvb2JqdG9vbC9idWlsdGluLWNoZWNrLmMKQEAgLTE3NSw2ICsxNzUsNyBAQAogCQkiX19zdGFja19jaGtfZmFpbCIsCiAJCSJwYW5pYyIsCiAJCSJkb19leGl0IiwKKwkJImRvX3Rhc2tfZGVhZCIsCiAJCSJfX21vZHVsZV9wdXRfYW5kX2V4aXQiLAogCQkiY29tcGxldGVfYW5kX2V4aXQiLAogCQkia3ZtX3NwdXJpb3VzX2ZhdWx0IiwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWNvbmZpZy50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1jb25maWcudHh0CmluZGV4IDE1OTQ5ZTIuLmNiMDgxYWM1IDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1jb25maWcudHh0CisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWNvbmZpZy50eHQKQEAgLTExMCw2ICsxMTAsMTQgQEAKIAkJb3JkZXIgPSBjYWxsZXIKIAkJc29ydC1rZXkgPSBmdW5jdGlvbgogCisJW3JlcG9ydF0KKwkJIyBEZWZhdWx0cworCQlzb3J0LW9yZGVyID0gY29tbSxkc28sc3ltYm9sCisJCXBlcmNlbnQtbGltaXQgPSAwCisJCXF1ZXVlLXNpemUgPSAwCisJCWNoaWxkcmVuID0gdHJ1ZQorCQlncm91cCA9IHRydWUKKwogVmFyaWFibGVzCiB+fn5+fn5+fn4KIApAQCAtMzgyLDYgKzM5MCwxMCBAQAogCQloaXN0b2dyYW0gZW50cnkuIERlZmF1bHQgaXMgMCB3aGljaCBtZWFucyBubyBsaW1pdGF0aW9uLgogCiByZXBvcnQuKjo6CisJcmVwb3J0LnNvcnRfb3JkZXI6OgorCQlBbGxvd3MgY2hhbmdpbmcgdGhlIGRlZmF1bHQgc29ydCBvcmRlciBmcm9tICJjb21tLGRzbyxzeW1ib2wiIHRvCisJCXNvbWUgb3RoZXIgZGVmYXVsdCwgZm9yIGluc3RhbmNlICJzeW0sZHNvIiBtYXkgYmUgbW9yZSBmaXR0aW5nIGZvcgorCQlrZXJuZWwgZGV2ZWxvcGVycy4KIAlyZXBvcnQucGVyY2VudC1saW1pdDo6CiAJCVRoaXMgb25lIGlzIG1vc3RseSB0aGUgc2FtZSBhcyBjYWxsLWdyYXBoLnRocmVzaG9sZCBidXQgd29ya3MgZm9yCiAJCWhpc3RvZ3JhbSBlbnRyaWVzLiBFbnRyaWVzIGhhdmluZyBhbiBvdmVyaGVhZCBsb3dlciB0aGFuIHRoaXMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXByb2JlLnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXByb2JlLnR4dAppbmRleCBiMzAzYmNkLi5lNmM5OTAyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1wcm9iZS50eHQKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcHJvYmUudHh0CkBAIC0yMSw2ICsyMSw4IEBACiAncGVyZiBwcm9iZScgW29wdGlvbnNdIC0tdmFycz0nUFJPQkVQT0lOVCcKIG9yCiAncGVyZiBwcm9iZScgW29wdGlvbnNdIC0tZnVuY3MKK29yCisncGVyZiBwcm9iZScgW29wdGlvbnNdIC0tZGVmaW5pdGlvbj0nUFJPQkUnIFsuLi5dCiAKIERFU0NSSVBUSU9OCiAtLS0tLS0tLS0tLQpAQCAtMzQsNiArMzYsOCBAQAogLWs6OgogLS12bWxpbnV4PVBBVEg6OgogCVNwZWNpZnkgdm1saW51eCBwYXRoIHdoaWNoIGhhcyBkZWJ1Z2luZm8gKER3YXJmIGJpbmFyeSkuCisJT25seSB3aGVuIHVzaW5nIHRoaXMgd2l0aCAtLWRlZmluaXRpb24sIHlvdSBjYW4gZ2l2ZSBhbiBvZmZsaW5lCisJdm1saW51eCBmaWxlLgogCiAtbTo6CiAtLW1vZHVsZT1NT0ROQU1FfFBBVEg6OgpAQCAtOTYsNiArMTAwLDExIEBACiAJY2FuIGFsc28gbGlzdCBmdW5jdGlvbnMgaW4gYSB1c2VyIHNwYWNlIGV4ZWN1dGFibGUgLyBzaGFyZWQgbGlicmFyeS4KIAlUaGlzIGFsc28gY2FuIGFjY2VwdCBhIEZJTFRFUiBydWxlIGFyZ3VtZW50LgogCistRDo6CistLWRlZmluaXRpb249OjoKKwlTaG93IHRyYWNlLWV2ZW50IGRlZmluaXRpb24gY29udmVydGVkIGZyb20gZ2l2ZW4gcHJvYmUtZXZlbnQgaW5zdGVhZAorCW9mIHdyaXRlIGl0IGludG8gdHJhY2luZy9bayx1XXByb2JlX2V2ZW50cy4KKwogLS1maWx0ZXI9RklMVEVSOjoKIAkoT25seSBmb3IgLS12YXJzIGFuZCAtLWZ1bmNzKSBTZXQgZmlsdGVyLiBGSUxURVIgaXMgYSBjb21iaW5hdGlvbiBvZiBnbG9iCiAJcGF0dGVybiwgc2VlIEZJTFRFUiBQQVRURVJOIGZvciBkZXRhaWwuCkBAIC0xNzYsMTMgKzE4NSwxMiBAQAogCiAnTkFNRScgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoaXMgYXJndW1lbnQgKG9wdGlvbmFsKS4gWW91IGNhbiB1c2UgdGhlIG5hbWUgb2YgbG9jYWwgdmFyaWFibGUsIGxvY2FsIGRhdGEgc3RydWN0dXJlIG1lbWJlciAoZS5nLiB2YXItPmZpZWxkLCB2YXIuZmllbGQyKSwgbG9jYWwgYXJyYXkgd2l0aCBmaXhlZCBpbmRleCAoZS5nLiBhcnJheVsxXSwgdmFyLT5hcnJheVswXSwgdmFyLT5wb2ludGVyWzJdKSwgb3Iga3Byb2JlLXRyYWNlciBhcmd1bWVudCBmb3JtYXQgKGUuZy4gJHJldHZhbCwgJWF4LCBldGMpLiBOb3RlIHRoYXQgdGhlIG5hbWUgb2YgdGhpcyBhcmd1bWVudCB3aWxsIGJlIHNldCBhcyB0aGUgbGFzdCBtZW1iZXIgbmFtZSBpZiB5b3Ugc3BlY2lmeSBhIGxvY2FsIGRhdGEgc3RydWN0dXJlIG1lbWJlciAoZS5nLiBmaWVsZDIgZm9yICd2YXItPmZpZWxkMS5maWVsZDInLikKICckdmFycycgYW5kICckcGFyYW1zJyBzcGVjaWFsIGFyZ3VtZW50cyBhcmUgYWxzbyBhdmFpbGFibGUgZm9yIE5BTUUsICckdmFycycgaXMgZXhwYW5kZWQgdG8gdGhlIGxvY2FsIHZhcmlhYmxlcyAoaW5jbHVkaW5nIGZ1bmN0aW9uIHBhcmFtZXRlcnMpIHdoaWNoIGNhbiBhY2Nlc3MgYXQgZ2l2ZW4gcHJvYmUgcG9pbnQuICckcGFyYW1zJyBpcyBleHBhbmRlZCB0byBvbmx5IHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzLgotJ1RZUEUnIGNhc3RzIHRoZSB0eXBlIG9mIHRoaXMgYXJndW1lbnQgKG9wdGlvbmFsKS4gSWYgb21pdHRlZCwgcGVyZiBwcm9iZSBhdXRvbWF0aWNhbGx5IHNldCB0aGUgdHlwZSBiYXNlZCBvbiBkZWJ1Z2luZm8uIEN1cnJlbnRseSwgYmFzaWMgdHlwZXMgKHU4L3UxNi91MzIvdTY0L3M4L3MxNi9zMzIvczY0KSwgc2lnbmVkbmVzcyBjYXN0aW5nICh1L3MpLCAic3RyaW5nIiBhbmQgYml0ZmllbGQgYXJlIHN1cHBvcnRlZC4gKHNlZSBUWVBFUyBmb3IgZGV0YWlsKQotCisnVFlQRScgY2FzdHMgdGhlIHR5cGUgb2YgdGhpcyBhcmd1bWVudCAob3B0aW9uYWwpLiBJZiBvbWl0dGVkLCBwZXJmIHByb2JlIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSB0eXBlIGJhc2VkIG9uIGRlYnVnaW5mbyAoKikuIEN1cnJlbnRseSwgYmFzaWMgdHlwZXMgKHU4L3UxNi91MzIvdTY0L3M4L3MxNi9zMzIvczY0KSwgaGV4YWRlY2ltYWwgaW50ZWdlcnMgKHgveDgveDE2L3gzMi94NjQpLCBzaWduZWRuZXNzIGNhc3RpbmcgKHUvcyksICJzdHJpbmciIGFuZCBiaXRmaWVsZCBhcmUgc3VwcG9ydGVkLiAoc2VlIFRZUEVTIGZvciBkZXRhaWwpCiBPbiB4ODYgc3lzdGVtcyAlUkVHIGlzIGFsd2F5cyB0aGUgc2hvcnQgZm9ybSBvZiB0aGUgcmVnaXN0ZXI6IGZvciBleGFtcGxlICVBWC4gJVJBWCBvciAlRUFYIGlzIG5vdCB2YWxpZC4KIAogVFlQRVMKIC0tLS0tCi1CYXNpYyB0eXBlcyAodTgvdTE2L3UzMi91NjQvczgvczE2L3MzMi9zNjQpIGFyZSBpbnRlZ2VyIHR5cGVzLiBQcmVmaXggJ3MnIGFuZCAndScgbWVhbnMgdGhvc2UgdHlwZXMgYXJlIHNpZ25lZCBhbmQgdW5zaWduZWQgcmVzcGVjdGl2ZWx5LiBUcmFjZWQgYXJndW1lbnRzIGFyZSBzaG93biBpbiBkZWNpbWFsIChzaWduZWQpIG9yIGhleCAodW5zaWduZWQpLiBZb3UgY2FuIGFsc28gdXNlICdzJyBvciAndScgdG8gc3BlY2lmeSBvbmx5IHNpZ25lZG5lc3MgYW5kIGxlYXZlIGl0cyBzaXplIGF1dG8tZGV0ZWN0ZWQgYnkgcGVyZiBwcm9iZS4KK0Jhc2ljIHR5cGVzICh1OC91MTYvdTMyL3U2NC9zOC9zMTYvczMyL3M2NCkgYW5kIGhleGFkZWNpbWFsIGludGVnZXJzICh4OC94MTYveDMyL3g2NCkgYXJlIGludGVnZXIgdHlwZXMuIFByZWZpeCAncycgYW5kICd1JyBtZWFucyB0aG9zZSB0eXBlcyBhcmUgc2lnbmVkIGFuZCB1bnNpZ25lZCByZXNwZWN0aXZlbHksIGFuZCAneCcgbWVhbnMgdGhhdCBpcyBzaG93biBpbiBoZXhhZGVjaW1hbCBmb3JtYXQuIFRyYWNlZCBhcmd1bWVudHMgYXJlIHNob3duIGluIGRlY2ltYWwgKHNOTi91Tk4pIG9yIGhleCAoeE5OKS4gWW91IGNhbiBhbHNvIHVzZSAncycgb3IgJ3UnIHRvIHNwZWNpZnkgb25seSBzaWduZWRuZXNzIGFuZCBsZWF2ZSBpdHMgc2l6ZSBhdXRvLWRldGVjdGVkIGJ5IHBlcmYgcHJvYmUuIE1vcmVvdmVyLCB5b3UgY2FuIHVzZSAneCcgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRvIGJlIHNob3duIGluIGhleGFkZWNpbWFsICh0aGUgc2l6ZSBpcyBhbHNvIGF1dG8tZGV0ZWN0ZWQpLgogU3RyaW5nIHR5cGUgaXMgYSBzcGVjaWFsIHR5cGUsIHdoaWNoIGZldGNoZXMgYSAibnVsbC10ZXJtaW5hdGVkIiBzdHJpbmcgZnJvbSBrZXJuZWwgc3BhY2UuIFRoaXMgbWVhbnMgaXQgd2lsbCBmYWlsIGFuZCBzdG9yZSBOVUxMIGlmIHRoZSBzdHJpbmcgY29udGFpbmVyIGhhcyBiZWVuIHBhZ2VkIG91dC4gWW91IGNhbiBzcGVjaWZ5ICdzdHJpbmcnIHR5cGUgb25seSBmb3IgdGhlIGxvY2FsIHZhcmlhYmxlIG9yIHN0cnVjdHVyZSBtZW1iZXIgd2hpY2ggaXMgYW4gYXJyYXkgb2Ygb3IgYSBwb2ludGVyIHRvICdjaGFyJyBvciAndW5zaWduZWQgY2hhcicgdHlwZS4KIEJpdGZpZWxkIGlzIGFub3RoZXIgc3BlY2lhbCB0eXBlLCB3aGljaCB0YWtlcyAzIHBhcmFtZXRlcnMsIGJpdC13aWR0aCwgYml0LW9mZnNldCwgYW5kIGNvbnRhaW5lci1zaXplICh1c3VhbGx5IDMyKS4gVGhlIHN5bnRheCBpczsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVjb3JkLnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXJlY29yZC50eHQKaW5kZXggMzc5YTJiZS4uOTIzMzUxOSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVjb3JkLnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZWNvcmQudHh0CkBAIC0zNSwxNSArMzUsMTUgQEAKIAogCS0gYSBzeW1ib2xpY2FsbHkgZm9ybWVkIFBNVSBldmVudCBsaWtlICdwbXUvcGFyYW0xPTB4MyxwYXJhbTIvJyB3aGVyZQogCSAgJ3BhcmFtMScsICdwYXJhbTInLCBldGMgYXJlIGRlZmluZWQgYXMgZm9ybWF0cyBmb3IgdGhlIFBNVSBpbgotCSAgL3N5cy9idXMvZXZlbnRfc291cmNlcy9kZXZpY2VzLzxwbXU+L2Zvcm1hdC8qLgorCSAgL3N5cy9idXMvZXZlbnRfc291cmNlL2RldmljZXMvPHBtdT4vZm9ybWF0LyouCiAKIAktIGEgc3ltYm9saWNhbGx5IGZvcm1lZCBldmVudCBsaWtlICdwbXUvY29uZmlnPU0sY29uZmlnMT1OLGNvbmZpZzM9Sy8nCiAKICAgICAgICAgICB3aGVyZSBNLCBOLCBLIGFyZSBudW1iZXJzIChpbiBkZWNpbWFsLCBoZXgsIG9jdGFsIGZvcm1hdCkuIEFjY2VwdGFibGUKICAgICAgICAgICB2YWx1ZXMgZm9yIGVhY2ggb2YgJ2NvbmZpZycsICdjb25maWcxJyBhbmQgJ2NvbmZpZzInIGFyZSBkZWZpbmVkIGJ5Ci0gICAgICAgICAgY29ycmVzcG9uZGluZyBlbnRyaWVzIGluIC9zeXMvYnVzL2V2ZW50X3NvdXJjZXMvZGV2aWNlcy88cG11Pi9mb3JtYXQvKgorICAgICAgICAgIGNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiAvc3lzL2J1cy9ldmVudF9zb3VyY2UvZGV2aWNlcy88cG11Pi9mb3JtYXQvKgogICAgICAgICAgIHBhcmFtMSBhbmQgcGFyYW0yIGFyZSBkZWZpbmVkIGFzIGZvcm1hdHMgZm9yIHRoZSBQTVUgaW46Ci0gICAgICAgICAgL3N5cy9idXMvZXZlbnRfc291cmNlcy9kZXZpY2VzLzxwbXU+L2Zvcm1hdC8qCisgICAgICAgICAgL3N5cy9idXMvZXZlbnRfc291cmNlL2RldmljZXMvPHBtdT4vZm9ybWF0LyoKIAogCSAgVGhlcmUgYXJlIGFsc28gc29tZSBwYXJhbXMgd2hpY2ggYXJlIG5vdCBkZWZpbmVkIGluIC4uLi88cG11Pi9mb3JtYXQvKi4KIAkgIFRoZXNlIHBhcmFtcyBjYW4gYmUgdXNlZCB0byBvdmVybG9hZCBkZWZhdWx0IGNvbmZpZyB2YWx1ZXMgcGVyIGV2ZW50LgpAQCAtNjAsNiArNjAsMTggQEAKIAkgIE5vdGU6IElmIHVzZXIgZXhwbGljaXRseSBzZXRzIG9wdGlvbnMgd2hpY2ggY29uZmxpY3Qgd2l0aCB0aGUgcGFyYW1zLAogCSAgdGhlIHZhbHVlIHNldCBieSB0aGUgcGFyYW1zIHdpbGwgYmUgb3ZlcnJpZGRlbi4KIAorCSAgQWxzbyBub3QgZGVmaW5lZCBpbiAuLi4vPHBtdT4vZm9ybWF0LyogYXJlIFBNVSBkcml2ZXIgc3BlY2lmaWMKKwkgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4gIEFueSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBwcmVjZWRlZCBieQorCSAgdGhlIGxldHRlciAnQCcgaXMgbm90IGludGVycHJldGVkIGluIHVzZXIgc3BhY2UgYW5kIHNlbnQgZG93biBkaXJlY3RseQorCSAgdG8gdGhlIFBNVSBkcml2ZXIuICBGb3IgZXhhbXBsZToKKworCSAgcGVyZiByZWNvcmQgLWUgc29tZV9ldmVudC9AY2ZnMSxAY2ZnMj1jb25maWcvIC4uLgorCisJICB3aWxsIHNlZSAnY2ZnMScgYW5kICdjZmcyPWNvbmZpZycgcHVzaGVkIHRvIHRoZSBQTVUgZHJpdmVyIGFzc29jaWF0ZWQKKwkgIHdpdGggdGhlIGV2ZW50IGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuICBUaGVyZSBpcyBubyByZXN0cmljdGlvbiBvbgorCSAgd2hhdCB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSwgYXMgbG9uZyBhcyB0aGVpciBzZW1hbnRpYyBpcworCSAgdW5kZXJzdG9vZCBhbmQgc3VwcG9ydGVkIGJ5IHRoZSBQTVUgZHJpdmVyLgorCiAgICAgICAgIC0gYSBoYXJkd2FyZSBicmVha3BvaW50IGV2ZW50IGluIHRoZSBmb3JtIG9mICdcbWVtOmFkZHJbL2xlbl1bOmFjY2Vzc10nCiAgICAgICAgICAgd2hlcmUgYWRkciBpcyB0aGUgYWRkcmVzcyBpbiBtZW1vcnkgeW91IHdhbnQgdG8gYnJlYWsgaW4uCiAgICAgICAgICAgQWNjZXNzIGlzIHRoZSBtZW1vcnkgYWNjZXNzIHR5cGUgKHJlYWQsIHdyaXRlLCBleGVjdXRlKSBpdCBjYW4KQEAgLTc3LDkgKzg5LDYyIEBACiAKIC0tZmlsdGVyPTxmaWx0ZXI+OjoKICAgICAgICAgRXZlbnQgZmlsdGVyLiBUaGlzIG9wdGlvbiBzaG91bGQgZm9sbG93IGEgZXZlbnQgc2VsZWN0b3IgKC1lKSB3aGljaAotCXNlbGVjdHMgdHJhY2Vwb2ludCBldmVudChzKS4gTXVsdGlwbGUgJy0tZmlsdGVyJyBvcHRpb25zIGFyZSBjb21iaW5lZAorCXNlbGVjdHMgZWl0aGVyIHRyYWNlcG9pbnQgZXZlbnQocykgb3IgYSBoYXJkd2FyZSB0cmFjZSBQTVUKKwkoZS5nLiBJbnRlbCBQVCBvciBDb3JlU2lnaHQpLgorCisJLSB0cmFjZXBvaW50IGZpbHRlcnMKKworCUluIHRoZSBjYXNlIG9mIHRyYWNlcG9pbnRzLCBtdWx0aXBsZSAnLS1maWx0ZXInIG9wdGlvbnMgYXJlIGNvbWJpbmVkCiAJdXNpbmcgJyYmJy4KIAorCS0gYWRkcmVzcyBmaWx0ZXJzCisKKwlBIGhhcmR3YXJlIHRyYWNlIFBNVSBhZHZlcnRpc2VzIGl0cyBhYmlsaXR5IHRvIGFjY2VwdCBhIG51bWJlciBvZgorCWFkZHJlc3MgZmlsdGVycwlieSBzcGVjaWZ5aW5nIGEgbm9uLXplcm8gdmFsdWUgaW4KKwkvc3lzL2J1cy9ldmVudF9zb3VyY2UvZGV2aWNlcy88cG11Pi9ucl9hZGRyX2ZpbHRlcnMuCisKKwlBZGRyZXNzIGZpbHRlcnMgaGF2ZSB0aGUgZm9ybWF0OgorCisJZmlsdGVyfHN0YXJ0fHN0b3B8dHJhY2VzdG9wIDxzdGFydD4gWy8gPHNpemU+XSBbQDxmaWxlIG5hbWU+XQorCisJV2hlcmU6CisJLSAnZmlsdGVyJzogZGVmaW5lcyBhIHJlZ2lvbiB0aGF0IHdpbGwgYmUgdHJhY2VkLgorCS0gJ3N0YXJ0JzogZGVmaW5lcyBhbiBhZGRyZXNzIGF0IHdoaWNoIHRyYWNpbmcgd2lsbCBiZWdpbi4KKwktICdzdG9wJzogZGVmaW5lcyBhbiBhZGRyZXNzIGF0IHdoaWNoIHRyYWNpbmcgd2lsbCBzdG9wLgorCS0gJ3RyYWNlc3RvcCc6IGRlZmluZXMgYSByZWdpb24gaW4gd2hpY2ggdHJhY2luZyB3aWxsIHN0b3AuCisKKwk8ZmlsZSBuYW1lPiBpcyB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IGZpbGUsIDxzdGFydD4gaXMgdGhlIG9mZnNldCB0byB0aGUKKwljb2RlIHRvIHRyYWNlIGluIHRoYXQgZmlsZSwgYW5kIDxzaXplPiBpcyB0aGUgc2l6ZSBvZiB0aGUgcmVnaW9uIHRvCisJdHJhY2UuICdzdGFydCcgYW5kICdzdG9wJyBmaWx0ZXJzIG5lZWQgbm90IHNwZWNpZnkgYSA8c2l6ZT4uCisKKwlJZiBubyBvYmplY3QgZmlsZSBpcyBzcGVjaWZpZWQgdGhlbiB0aGUga2VybmVsIGlzIGFzc3VtZWQsIGluIHdoaWNoIGNhc2UKKwl0aGUgc3RhcnQgYWRkcmVzcyBtdXN0IGJlIGEgY3VycmVudCBrZXJuZWwgbWVtb3J5IGFkZHJlc3MuCisKKwk8c3RhcnQ+IGNhbiBhbHNvIGJlIHNwZWNpZmllZCBieSBwcm92aWRpbmcgdGhlIG5hbWUgb2YgYSBzeW1ib2wuIElmIHRoZQorCXN5bWJvbCBuYW1lIGlzIG5vdCB1bmlxdWUsIGl0IGNhbiBiZSBkaXNhbWJpZ3VhdGVkIGJ5IGluc2VydGluZyAjbiB3aGVyZQorCSduJyBzZWxlY3RzIHRoZSBuJ3RoIHN5bWJvbCBpbiBhZGRyZXNzIG9yZGVyLiBBbHRlcm5hdGVseSAjMCwgI2cgb3IgI0cKKwlzZWxlY3Qgb25seSBhIGdsb2JhbCBzeW1ib2wuIDxzaXplPiBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgYnkgcHJvdmlkaW5nCisJdGhlIG5hbWUgb2YgYSBzeW1ib2wsIGluIHdoaWNoIGNhc2UgdGhlIHNpemUgaXMgY2FsY3VsYXRlZCB0byB0aGUgZW5kCisJb2YgdGhhdCBzeW1ib2wuIEZvciAnZmlsdGVyJyBhbmQgJ3RyYWNlc3RvcCcgZmlsdGVycywgaWYgPHNpemU+IGlzCisJb21pdHRlZCBhbmQgPHN0YXJ0PiBpcyBhIHN5bWJvbCwgdGhlbiB0aGUgc2l6ZSBpcyBjYWxjdWxhdGVkIHRvIHRoZSBlbmQKKwlvZiB0aGF0IHN5bWJvbC4KKworCUlmIDxzaXplPiBpcyBvbWl0dGVkIGFuZCA8c3RhcnQ+IGlzICcqJywgdGhlbiB0aGUgc3RhcnQgYW5kIHNpemUgd2lsbAorCWJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgZmlyc3QgYW5kIGxhc3Qgc3ltYm9scywgaS5lLiB0byB0cmFjZSB0aGUgd2hvbGUKKwlmaWxlLgorCisJSWYgc3ltYm9sIG5hbWVzIChvciAnKicpIGFyZSBwcm92aWRlZCwgdGhleSBtdXN0IGJlIHN1cnJvdW5kZWQgYnkgd2hpdGUKKwlzcGFjZS4KKworCVRoZSBmaWx0ZXIgcGFzc2VkIHRvIHRoZSBrZXJuZWwgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIGVudGVyZWQuCisJVG8gc2VlIHRoZSBmaWx0ZXIgdGhhdCBpcyBwYXNzZWQsIHVzZSB0aGUgLXYgb3B0aW9uLgorCisJVGhlIGtlcm5lbCBtYXkgbm90IGJlIGFibGUgdG8gY29uZmlndXJlIGEgdHJhY2UgcmVnaW9uIGlmIGl0IGlzIG5vdAorCXdpdGhpbiBhIHNpbmdsZSBtYXBwaW5nLiAgTU1BUCBldmVudHMgKG9yIC9wcm9jLzxwaWQ+L21hcHMpIGNhbiBiZQorCWV4YW1pbmVkIHRvIGRldGVybWluZSBpZiB0aGF0IGlzIGEgcG9zc2liaWxpdHkuCisKKwlNdWx0aXBsZSBmaWx0ZXJzIGNhbiBiZSBzZXBhcmF0ZWQgd2l0aCBzcGFjZSBvciBjb21tYS4KKwogLS1leGNsdWRlLXBlcmY6OgogCURvbid0IHJlY29yZCBldmVudHMgaXNzdWVkIGJ5IHBlcmYgaXRzZWxmLiBUaGlzIG9wdGlvbiBzaG91bGQgZm9sbG93CiAJYSBldmVudCBzZWxlY3RvciAoLWUpIHdoaWNoIHNlbGVjdHMgdHJhY2Vwb2ludCBldmVudChzKS4gSXQgYWRkcyBhCmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi5kYXRhLWZpbGUtZm9ybWF0LnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLmRhdGEtZmlsZS1mb3JtYXQudHh0CmluZGV4IGZkYzk5ZmUuLmI2NjRiMTggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLmRhdGEtZmlsZS1mb3JtYXQudHh0CisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLmRhdGEtZmlsZS1mb3JtYXQudHh0CkBAIC00MzcsNiArNDM3LDEwIEBACiBxdWlwcGVyCiAKIFRoZSBxdWlwcGVyIEMrKyBwYXJzZXIgaXMgYXZhaWxhYmxlIGF0Ci1odHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW1vcy9wbGF0Zm9ybS9jaHJvbWl1bW9zLXdpZGUtcHJvZmlsaW5nLworaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtb3MvcGxhdGZvcm0yCisKK0l0IGlzIHVuZGVyIHRoZSBjaHJvbWl1bW9zLXdpZGUtcHJvZmlsaW5nLyBzdWJkaXJlY3RvcnkuIFRoaXMgbGlicmFyeSBjYW4KK2NvbnZlcnQgYSBwZXJmIGRhdGEgZmlsZSB0byBhIHByb3RvYnVmIGFuZCB2aWNlIHZlcnNhLgorCiBVbmZvcnR1bmF0ZWx5IHRoaXMgcGFyc2VyIHRlbmRzIHRvIGJlIG1hbnkgdmVyc2lvbnMgYmVoaW5kIGFuZCBtYXkgbm90IGJlIGFibGUKIHRvIHBhcnNlIGRhdGEgZmlsZXMgZ2VuZXJhdGVkIGJ5IHJlY2VudCBwZXJmLgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmZjb25maWcuZXhhbXBsZSBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmY29uZmlnLmV4YW1wbGUKaW5kZXggMWQ4ZDViYy4uMmI0NzdjMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmZjb25maWcuZXhhbXBsZQorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZmNvbmZpZy5leGFtcGxlCkBAIC0yNywzICsyNywxMiBAQAogCXVzZV9vZmZzZXQgPSB0cnVlCiAJanVtcF9hcnJvd3MgPSB0cnVlCiAJc2hvd19ucl9qdW1wcyA9IGZhbHNlCisKK1tyZXBvcnRdCisKKwkjIERlZmF1bHRzCisJc29ydC1vcmRlciA9IGNvbW0sZHNvLHN5bWJvbAorCXBlcmNlbnQtbGltaXQgPSAwCisJcXVldWUtc2l6ZSA9IDAKKwljaGlsZHJlbiA9IHRydWUKKwlncm91cCA9IHRydWUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvTUFOSUZFU1QgYi90b29scy9wZXJmL01BTklGRVNUCmluZGV4IGFkMjUzNGQuLjBiZGEyY2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvTUFOSUZFU1QKKysrIGIvdG9vbHMvcGVyZi9NQU5JRkVTVApAQCAtNjAsMTQgKzYwLDE4IEBACiB0b29scy9pbmNsdWRlL2xpbnV4L2F0b21pYy5oCiB0b29scy9pbmNsdWRlL2xpbnV4L2JpdG9wcy5oCiB0b29scy9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmgKK3Rvb2xzL2luY2x1ZGUvbGludXgvY29yZXNpZ2h0LXBtdS5oCiB0b29scy9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oCiB0b29scy9pbmNsdWRlL2xpbnV4L2hhc2guaAogdG9vbHMvaW5jbHVkZS9saW51eC9rZXJuZWwuaAogdG9vbHMvaW5jbHVkZS9saW51eC9saXN0LmgKIHRvb2xzL2luY2x1ZGUvbGludXgvbG9nMi5oCit0b29scy9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvbW1hbi1jb21tb24uaAordG9vbHMvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21tYW4uaAogdG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oCiB0b29scy9pbmNsdWRlL3VhcGkvbGludXgvYnBmX2NvbW1vbi5oCiB0b29scy9pbmNsdWRlL3VhcGkvbGludXgvaHdfYnJlYWtwb2ludC5oCit0b29scy9pbmNsdWRlL3VhcGkvbGludXgvbW1hbi5oCiB0b29scy9pbmNsdWRlL3VhcGkvbGludXgvcGVyZl9ldmVudC5oCiB0b29scy9pbmNsdWRlL2xpbnV4L3BvaXNvbi5oCiB0b29scy9pbmNsdWRlL2xpbnV4L3JidHJlZS5oCkBAIC03Nyw0ICs4MSw2IEBACiB0b29scy9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKIHRvb2xzL2luY2x1ZGUvbGludXgvZXJyLmgKIHRvb2xzL2luY2x1ZGUvbGludXgvYml0bWFwLmgKK3Rvb2xzL2luY2x1ZGUvbGludXgvdGltZTY0LmgKK3Rvb2xzL2FyY2gvKi9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaAogdG9vbHMvYXJjaC8qL2luY2x1ZGUvdWFwaS9hc20vcGVyZl9yZWdzLmgKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvTWFrZWZpbGUuY29uZmlnIGIvdG9vbHMvcGVyZi9NYWtlZmlsZS5jb25maWcKaW5kZXggMjQ4MDNjNS4uNzJlZGY4MyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9NYWtlZmlsZS5jb25maWcKKysrIGIvdG9vbHMvcGVyZi9NYWtlZmlsZS5jb25maWcKQEAgLTc0NiwxMCArNzQ2LDEzIEBACiBlbmRpZgogCiBpZm5kZWYgTk9fQVVYVFJBQ0UKLSAgaWZlcSAoJChmZWF0dXJlLWdldF9jcHVpZCksIDApCi0gICAgbXNnIDo9ICQod2FybmluZyBZb3VyIGdjYyBsYWNrcyB0aGUgX19nZXRfY3B1aWQoKSBidWlsdGluLCBkaXNhYmxlcyBzdXBwb3J0IGZvciBhdXh0cmFjZS9JbnRlbCBQVCwgcGxlYXNlIGluc3RhbGwgYSBuZXdlciBnY2MpOwotICAgIE5PX0FVWFRSQUNFIDo9IDEKLSAgZWxzZQorICBpZmVxICgkKEFSQ0gpLHg4NikKKyAgICBpZmVxICgkKGZlYXR1cmUtZ2V0X2NwdWlkKSwgMCkKKyAgICAgIG1zZyA6PSAkKHdhcm5pbmcgWW91ciBnY2MgbGFja3MgdGhlIF9fZ2V0X2NwdWlkKCkgYnVpbHRpbiwgZGlzYWJsZXMgc3VwcG9ydCBmb3IgYXV4dHJhY2UvSW50ZWwgUFQsIHBsZWFzZSBpbnN0YWxsIGEgbmV3ZXIgZ2NjKTsKKyAgICAgIE5PX0FVWFRSQUNFIDo9IDEKKyAgICBlbmRpZgorICBlbmRpZgorICBpZm5kZWYgTk9fQVVYVFJBQ0UKICAgICAkKGNhbGwgZGV0ZWN0ZWQsQ09ORklHX0FVWFRSQUNFKQogICAgIENGTEFHUyArPSAtREhBVkVfQVVYVFJBQ0VfU1VQUE9SVAogICBlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9NYWtlZmlsZS5wZXJmIGIvdG9vbHMvcGVyZi9NYWtlZmlsZS5wZXJmCmluZGV4IDJkOTA4NzUuLmQ3MTBkYjEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvTWFrZWZpbGUucGVyZgorKysgYi90b29scy9wZXJmL01ha2VmaWxlLnBlcmYKQEAgLTE2NSw3ICsxNjUsNyBAQAogIyBub24tY29uZmlnIGNhc2VzCiBjb25maWcgOj0gMQogCi1OT05fQ09ORklHX1RBUkdFVFMgOj0gY2xlYW4gVEFHUyB0YWdzIGNzY29wZSBoZWxwCitOT05fQ09ORklHX1RBUkdFVFMgOj0gY2xlYW4gVEFHUyB0YWdzIGNzY29wZSBoZWxwIGluc3RhbGwtZG9jCiAKIGlmZGVmIE1BS0VDTURHT0FMUwogaWZlcSAoJChmaWx0ZXItb3V0ICQoTk9OX0NPTkZJR19UQVJHRVRTKSwkKE1BS0VDTURHT0FMUykpLCkKQEAgLTQyOSw2ICs0MjksMTggQEAKIAlAKHRlc3QgLWYgLi4vLi4vaW5jbHVkZS9hc20tZ2VuZXJpYy9iaXRvcHMvZmxzNjQuaCAmJiAoIFwKICAgICAgICAgKGRpZmYgLUIgLi4vaW5jbHVkZS9hc20tZ2VuZXJpYy9iaXRvcHMvZmxzNjQuaCAuLi8uLi9pbmNsdWRlL2FzbS1nZW5lcmljL2JpdG9wcy9mbHM2NC5oID4vZGV2L251bGwpIFwKICAgICAgICAgfHwgZWNobyAiV2FybmluZzogdG9vbHMvaW5jbHVkZS9hc20tZ2VuZXJpYy9iaXRvcHMvZmxzNjQuaCBkaWZmZXJzIGZyb20ga2VybmVsIiA+JjIgKSkgfHwgdHJ1ZQorCUAodGVzdCAtZiAuLi8uLi9pbmNsdWRlL2xpbnV4L2NvcmVzaWdodC1wbXUuaCAmJiAoIFwKKwkoZGlmZiAtQiAuLi9pbmNsdWRlL2xpbnV4L2NvcmVzaWdodC1wbXUuaCAuLi8uLi9pbmNsdWRlL2xpbnV4L2NvcmVzaWdodC1wbXUuaCA+L2Rldi9udWxsKSBcCisJfHwgZWNobyAiV2FybmluZzogdG9vbHMvaW5jbHVkZS9saW51eC9jb3Jlc2lnaHQtcG11LmggZGlmZmVycyBmcm9tIGtlcm5lbCIgPiYyICkpIHx8IHRydWUKKwlAKHRlc3QgLWYgLi4vLi4vaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21tYW4tY29tbW9uLmggJiYgKCBcCisJKGRpZmYgLUIgLi4vaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21tYW4tY29tbW9uLmggLi4vLi4vaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21tYW4tY29tbW9uLmggPi9kZXYvbnVsbCkgXAorCXx8IGVjaG8gIldhcm5pbmc6IHRvb2xzL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9tbWFuLWNvbW1vbi5oIGRpZmZlcnMgZnJvbSBrZXJuZWwiID4mMiApKSB8fCB0cnVlCisJQCh0ZXN0IC1mIC4uLy4uL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9tbWFuLmggJiYgKCBcCisJKGRpZmYgLUIgLUkgIl4jaW5jbHVkZSA8XCh1YXBpL1wpKmFzbS1nZW5lcmljL21tYW4tY29tbW9uLmg+JCQiIC4uL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9tbWFuLmggLi4vLi4vaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21tYW4uaCA+L2Rldi9udWxsKSBcCisJfHwgZWNobyAiV2FybmluZzogdG9vbHMvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21tYW4uaCBkaWZmZXJzIGZyb20ga2VybmVsIiA+JjIgKSkgfHwgdHJ1ZQorCUAodGVzdCAtZiAuLi8uLi9pbmNsdWRlL3VhcGkvbGludXgvbW1hbi5oICYmICggXAorCShkaWZmIC1CIC1JICJeI2luY2x1ZGUgPFwodWFwaS9cKSphc20vbW1hbi5oPiQkIiAuLi9pbmNsdWRlL3VhcGkvbGludXgvbW1hbi5oIC4uLy4uL2luY2x1ZGUvdWFwaS9saW51eC9tbWFuLmggPi9kZXYvbnVsbCkgXAorCXx8IGVjaG8gIldhcm5pbmc6IHRvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9tbWFuLmggZGlmZmVycyBmcm9tIGtlcm5lbCIgPiYyICkpIHx8IHRydWUKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT1wZXJmCiAKICQoT1VUUFVUKXBlcmY6ICQoUEVSRkxJQlMpICQoUEVSRl9JTikgJChMSUJUUkFDRUVWRU5UX0RZTkFNSUNfTElTVCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9hcm0vaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmggYi90b29scy9wZXJmL2FyY2gvYXJtL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOThkMDMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gvYXJtL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oCkBAIC0wLDAgKzEsOSBAQAorI2lmZGVmIERFRklORV9EV0FSRl9SRUdTVFJfVEFCTEUKKy8qIFRoaXMgaXMgaW5jbHVkZWQgaW4gcGVyZi91dGlsL2R3YXJmLXJlZ3MuYyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFybV9yZWdzdHJfdGJsW10gPSB7CisJIiVyMCIsICIlcjEiLCAiJXIyIiwgIiVyMyIsICIlcjQiLAorCSIlcjUiLCAiJXI2IiwgIiVyNyIsICIlcjgiLCAiJXI5IiwgIiVyMTAiLAorCSIlZnAiLCAiJWlwIiwgIiVzcCIsICIlbHIiLCAiJXBjIiwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9hcm0vdXRpbC9CdWlsZCBiL3Rvb2xzL3BlcmYvYXJjaC9hcm0vdXRpbC9CdWlsZAppbmRleCBmOThkYTE3Li5lNjRjNWYyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvQnVpbGQKKysrIGIvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL0J1aWxkCkBAIC0yLDMgKzIsNSBAQAogCiBsaWJwZXJmLSQoQ09ORklHX0xPQ0FMX0xJQlVOV0lORCkgICAgKz0gdW53aW5kLWxpYnVud2luZC5vCiBsaWJwZXJmLSQoQ09ORklHX0xJQkRXX0RXQVJGX1VOV0lORCkgKz0gdW53aW5kLWxpYmR3Lm8KKworbGlicGVyZi0kKENPTkZJR19BVVhUUkFDRSkgKz0gcG11Lm8gYXV4dHJhY2UubyBjcy1ldG0ubwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL2F1eHRyYWNlLmMgYi90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvYXV4dHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWRmMmNiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL2F1eHRyYWNlLmMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodChDKSAyMDE1IExpbmFybyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQXV0aG9yOiBNYXRoaWV1IFBvaXJpZXIgPG1hdGhpZXUucG9pcmllckBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9jb3Jlc2lnaHQtcG11Lmg+CisKKyNpbmNsdWRlICIuLi8uLi91dGlsL2F1eHRyYWNlLmgiCisjaW5jbHVkZSAiLi4vLi4vdXRpbC9ldmxpc3QuaCIKKyNpbmNsdWRlICIuLi8uLi91dGlsL3BtdS5oIgorI2luY2x1ZGUgImNzLWV0bS5oIgorCitzdHJ1Y3QgYXV4dHJhY2VfcmVjb3JkCisqYXV4dHJhY2VfcmVjb3JkX19pbml0KHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCBpbnQgKmVycikKK3sKKwlzdHJ1Y3QgcGVyZl9wbXUJKmNzX2V0bV9wbXU7CisJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsOworCWJvb2wgZm91bmRfZXRtID0gZmFsc2U7CisKKwljc19ldG1fcG11ID0gcGVyZl9wbXVfX2ZpbmQoQ09SRVNJR0hUX0VUTV9QTVVfTkFNRSk7CisKKwlpZiAoZXZsaXN0KSB7CisJCWV2bGlzdF9fZm9yX2VhY2hfZW50cnkoZXZsaXN0LCBldnNlbCkgeworCQkJaWYgKGNzX2V0bV9wbXUgJiYKKwkJCSAgICBldnNlbC0+YXR0ci50eXBlID09IGNzX2V0bV9wbXUtPnR5cGUpCisJCQkJZm91bmRfZXRtID0gdHJ1ZTsKKwkJfQorCX0KKworCWlmIChmb3VuZF9ldG0pCisJCXJldHVybiBjc19ldG1fcmVjb3JkX2luaXQoZXJyKTsKKworCS8qCisJICogQ2xlYXIgJ2VycicgZXZlbiBpZiB3ZSBoYXZlbid0IGZvdW5kIGEgY3NfZXRtIGV2ZW50IC0gdGhhdCB3YXkgcGVyZgorCSAqIHJlY29yZCBjYW4gc3RpbGwgYmUgdXNlZCBldmVuIGlmIHRyYWNlcnMgYXJlbid0IHByZXNlbnQuICBUaGUgTlVMTAorCSAqIHJldHVybiB2YWx1ZSB3aWxsIHRha2UgY2FyZSBvZiB0ZWxsaW5nIHRoZSBpbmZyYXN0cnVjdHVyZSBIVyB0cmFjaW5nCisJICogaXNuJ3QgYXZhaWxhYmxlLgorCSAqLworCSplcnIgPSAwOworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL2NzLWV0bS5jIGIvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL2NzLWV0bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZDU4NGQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvY3MtZXRtLmMKQEAgLTAsMCArMSw2MTcgQEAKKy8qCisgKiBDb3B5cmlnaHQoQykgMjAxNSBMaW5hcm8gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEF1dGhvcjogTWF0aGlldSBQb2lyaWVyIDxtYXRoaWV1LnBvaXJpZXJAbGluYXJvLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxhcGkvZnMvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb3Jlc2lnaHQtcG11Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJjcy1ldG0uaCIKKyNpbmNsdWRlICIuLi8uLi9wZXJmLmgiCisjaW5jbHVkZSAiLi4vLi4vdXRpbC9hdXh0cmFjZS5oIgorI2luY2x1ZGUgIi4uLy4uL3V0aWwvY3B1bWFwLmgiCisjaW5jbHVkZSAiLi4vLi4vdXRpbC9ldmxpc3QuaCIKKyNpbmNsdWRlICIuLi8uLi91dGlsL2V2c2VsLmgiCisjaW5jbHVkZSAiLi4vLi4vdXRpbC9wbXUuaCIKKyNpbmNsdWRlICIuLi8uLi91dGlsL3RocmVhZF9tYXAuaCIKKyNpbmNsdWRlICIuLi8uLi91dGlsL2NzLWV0bS5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgRU5BQkxFX1NJTktfTUFYCTEyOAorI2RlZmluZSBDU19CVVNfREVWSUNFX1BBVEggIi9idXMvY29yZXNpZ2h0L2RldmljZXMvIgorCitzdHJ1Y3QgY3NfZXRtX3JlY29yZGluZyB7CisJc3RydWN0IGF1eHRyYWNlX3JlY29yZAlpdHI7CisJc3RydWN0IHBlcmZfcG11CQkqY3NfZXRtX3BtdTsKKwlzdHJ1Y3QgcGVyZl9ldmxpc3QJKmV2bGlzdDsKKwlib29sCQkJc25hcHNob3RfbW9kZTsKKwlzaXplX3QJCQlzbmFwc2hvdF9zaXplOworfTsKKworc3RhdGljIGJvb2wgY3NfZXRtX2lzX2V0bXY0KHN0cnVjdCBhdXh0cmFjZV9yZWNvcmQgKml0ciwgaW50IGNwdSk7CisKK3N0YXRpYyBpbnQgY3NfZXRtX3BhcnNlX3NuYXBzaG90X29wdGlvbnMoc3RydWN0IGF1eHRyYWNlX3JlY29yZCAqaXRyLAorCQkJCQkgc3RydWN0IHJlY29yZF9vcHRzICpvcHRzLAorCQkJCQkgY29uc3QgY2hhciAqc3RyKQoreworCXN0cnVjdCBjc19ldG1fcmVjb3JkaW5nICpwdHIgPQorCQkJCWNvbnRhaW5lcl9vZihpdHIsIHN0cnVjdCBjc19ldG1fcmVjb3JkaW5nLCBpdHIpOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzbmFwc2hvdF9zaXplID0gMDsKKwljaGFyICplbmRwdHI7CisKKwlpZiAoc3RyKSB7CisJCXNuYXBzaG90X3NpemUgPSBzdHJ0b3VsbChzdHIsICZlbmRwdHIsIDApOworCQlpZiAoKmVuZHB0ciB8fCBzbmFwc2hvdF9zaXplID4gU0laRV9NQVgpCisJCQlyZXR1cm4gLTE7CisJfQorCisJb3B0cy0+YXV4dHJhY2Vfc25hcHNob3RfbW9kZSA9IHRydWU7CisJb3B0cy0+YXV4dHJhY2Vfc25hcHNob3Rfc2l6ZSA9IHNuYXBzaG90X3NpemU7CisJcHRyLT5zbmFwc2hvdF9zaXplID0gc25hcHNob3Rfc2l6ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNzX2V0bV9yZWNvcmRpbmdfb3B0aW9ucyhzdHJ1Y3QgYXV4dHJhY2VfcmVjb3JkICppdHIsCisJCQkJICAgIHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LAorCQkJCSAgICBzdHJ1Y3QgcmVjb3JkX29wdHMgKm9wdHMpCit7CisJc3RydWN0IGNzX2V0bV9yZWNvcmRpbmcgKnB0ciA9CisJCQkJY29udGFpbmVyX29mKGl0ciwgc3RydWN0IGNzX2V0bV9yZWNvcmRpbmcsIGl0cik7CisJc3RydWN0IHBlcmZfcG11ICpjc19ldG1fcG11ID0gcHRyLT5jc19ldG1fcG11OworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgKmNzX2V0bV9ldnNlbCA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGNwdV9tYXAgKmNwdXMgPSBldmxpc3QtPmNwdXM7CisJYm9vbCBwcml2aWxlZ2VkID0gKGdldGV1aWQoKSA9PSAwIHx8IHBlcmZfZXZlbnRfcGFyYW5vaWQoKSA8IDApOworCisJcHRyLT5ldmxpc3QgPSBldmxpc3Q7CisJcHRyLT5zbmFwc2hvdF9tb2RlID0gb3B0cy0+YXV4dHJhY2Vfc25hcHNob3RfbW9kZTsKKworCWV2bGlzdF9fZm9yX2VhY2hfZW50cnkoZXZsaXN0LCBldnNlbCkgeworCQlpZiAoZXZzZWwtPmF0dHIudHlwZSA9PSBjc19ldG1fcG11LT50eXBlKSB7CisJCQlpZiAoY3NfZXRtX2V2c2VsKSB7CisJCQkJcHJfZXJyKCJUaGVyZSBtYXkgYmUgb25seSBvbmUgJXMgZXZlbnRcbiIsCisJCQkJICAgICAgIENPUkVTSUdIVF9FVE1fUE1VX05BTUUpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJZXZzZWwtPmF0dHIuZnJlcSA9IDA7CisJCQlldnNlbC0+YXR0ci5zYW1wbGVfcGVyaW9kID0gMTsKKwkJCWNzX2V0bV9ldnNlbCA9IGV2c2VsOworCQkJb3B0cy0+ZnVsbF9hdXh0cmFjZSA9IHRydWU7CisJCX0KKwl9CisKKwkvKiBubyBuZWVkIHRvIGNvbnRpbnVlIGlmIGF0IGxlYXN0IG9uZSBldmVudCBvZiBpbnRlcmVzdCB3YXMgZm91bmQgKi8KKwlpZiAoIWNzX2V0bV9ldnNlbCkKKwkJcmV0dXJuIDA7CisKKwlpZiAob3B0cy0+dXNlX2Nsb2NraWQpIHsKKwkJcHJfZXJyKCJDYW5ub3QgdXNlIGNsb2NraWQgKC1rIG9wdGlvbikgd2l0aCAlc1xuIiwKKwkJICAgICAgIENPUkVTSUdIVF9FVE1fUE1VX05BTUUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiB3ZSBhcmUgaW4gc25hcHNob3QgbW9kZSAqLworCWlmIChvcHRzLT5hdXh0cmFjZV9zbmFwc2hvdF9tb2RlKSB7CisJCS8qCisJCSAqIE5vIHNpemUgd2VyZSBnaXZlbiB0byAnLVMnIG9yICctbSwnLCBzbyBnbyB3aXRoCisJCSAqIHRoZSBkZWZhdWx0CisJCSAqLworCQlpZiAoIW9wdHMtPmF1eHRyYWNlX3NuYXBzaG90X3NpemUgJiYKKwkJICAgICFvcHRzLT5hdXh0cmFjZV9tbWFwX3BhZ2VzKSB7CisJCQlpZiAocHJpdmlsZWdlZCkgeworCQkJCW9wdHMtPmF1eHRyYWNlX21tYXBfcGFnZXMgPSBNaUIoNCkgLyBwYWdlX3NpemU7CisJCQl9IGVsc2UgeworCQkJCW9wdHMtPmF1eHRyYWNlX21tYXBfcGFnZXMgPQorCQkJCQkJCUtpQigxMjgpIC8gcGFnZV9zaXplOworCQkJCWlmIChvcHRzLT5tbWFwX3BhZ2VzID09IFVJTlRfTUFYKQorCQkJCQlvcHRzLT5tbWFwX3BhZ2VzID0gS2lCKDI1NikgLyBwYWdlX3NpemU7CisJCQl9CisJCX0gZWxzZSBpZiAoIW9wdHMtPmF1eHRyYWNlX21tYXBfcGFnZXMgJiYgIXByaXZpbGVnZWQgJiYKKwkJCQkJCW9wdHMtPm1tYXBfcGFnZXMgPT0gVUlOVF9NQVgpIHsKKwkJCW9wdHMtPm1tYXBfcGFnZXMgPSBLaUIoMjU2KSAvIHBhZ2Vfc2l6ZTsKKwkJfQorCisJCS8qCisJCSAqICctbSx4eXonIHdhcyBzcGVjaWZpZWQgYnV0IG5vIHNuYXBzaG90IHNpemUsIHNvIG1ha2UgdGhlCisJCSAqIHNuYXBzaG90IHNpemUgYXMgYmlnIGFzIHRoZSBhdXh0cmFjZSBtbWFwIGFyZWEuCisJCSAqLworCQlpZiAoIW9wdHMtPmF1eHRyYWNlX3NuYXBzaG90X3NpemUpIHsKKwkJCW9wdHMtPmF1eHRyYWNlX3NuYXBzaG90X3NpemUgPQorCQkJCW9wdHMtPmF1eHRyYWNlX21tYXBfcGFnZXMgKiAoc2l6ZV90KXBhZ2Vfc2l6ZTsKKwkJfQorCisJCS8qCisJCSAqIC1TeHl6IHdhcyBzcGVjaWZpZWQgYnV0IG5vIGF1eHRyYWNlIG1tYXAgYXJlYSwgc28gbWFrZSB0aGUKKwkJICogYXV4dHJhY2UgbW1hcCBhcmVhIGJpZyBlbm91Z2ggdG8gZml0IHRoZSByZXF1ZXN0ZWQgc25hcHNob3QKKwkJICogc2l6ZS4KKwkJICovCisJCWlmICghb3B0cy0+YXV4dHJhY2VfbW1hcF9wYWdlcykgeworCQkJc2l6ZV90IHN6ID0gb3B0cy0+YXV4dHJhY2Vfc25hcHNob3Rfc2l6ZTsKKworCQkJc3ogPSByb3VuZF91cChzeiwgcGFnZV9zaXplKSAvIHBhZ2Vfc2l6ZTsKKwkJCW9wdHMtPmF1eHRyYWNlX21tYXBfcGFnZXMgPSByb3VuZHVwX3Bvd19vZl90d28oc3opOworCQl9CisKKwkJLyogU25hcHNob3N0IHNpemUgY2FuJ3QgYmUgYmlnZ2VyIHRoYW4gdGhlIGF1eHRyYWNlIGFyZWEgKi8KKwkJaWYgKG9wdHMtPmF1eHRyYWNlX3NuYXBzaG90X3NpemUgPgorCQkJCW9wdHMtPmF1eHRyYWNlX21tYXBfcGFnZXMgKiAoc2l6ZV90KXBhZ2Vfc2l6ZSkgeworCQkJcHJfZXJyKCJTbmFwc2hvdCBzaXplICV6dSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gQVVYIGFyZWEgdHJhY2luZyBtbWFwIHNpemUgJXp1XG4iLAorCQkJICAgICAgIG9wdHMtPmF1eHRyYWNlX3NuYXBzaG90X3NpemUsCisJCQkgICAgICAgb3B0cy0+YXV4dHJhY2VfbW1hcF9wYWdlcyAqIChzaXplX3QpcGFnZV9zaXplKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogU29tZXRoaW5nIHdlbnQgd3Jvbmcgc29tZXdoZXJlIC0gdGhpcyBzaG91bGRuJ3QgaGFwcGVuICovCisJCWlmICghb3B0cy0+YXV4dHJhY2Vfc25hcHNob3Rfc2l6ZSB8fAorCQkgICAgIW9wdHMtPmF1eHRyYWNlX21tYXBfcGFnZXMpIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIGNhbGN1bGF0ZSBkZWZhdWx0IHNuYXBzaG90IHNpemUgYW5kL29yIEFVWCBhcmVhIHRyYWNpbmcgbW1hcCBwYWdlc1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qIFdlIGFyZSBpbiBmdWxsIHRyYWNlIG1vZGUgYnV0ICctbSx4eXonIHdhc24ndCBzcGVjaWZpZWQgKi8KKwlpZiAob3B0cy0+ZnVsbF9hdXh0cmFjZSAmJiAhb3B0cy0+YXV4dHJhY2VfbW1hcF9wYWdlcykgeworCQlpZiAocHJpdmlsZWdlZCkgeworCQkJb3B0cy0+YXV4dHJhY2VfbW1hcF9wYWdlcyA9IE1pQig0KSAvIHBhZ2Vfc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCW9wdHMtPmF1eHRyYWNlX21tYXBfcGFnZXMgPSBLaUIoMTI4KSAvIHBhZ2Vfc2l6ZTsKKwkJCWlmIChvcHRzLT5tbWFwX3BhZ2VzID09IFVJTlRfTUFYKQorCQkJCW9wdHMtPm1tYXBfcGFnZXMgPSBLaUIoMjU2KSAvIHBhZ2Vfc2l6ZTsKKwkJfQorCisJfQorCisJLyogVmFsaWRhdGUgYXV4dHJhY2VfbW1hcF9wYWdlcyBwcm92aWRlZCBieSB1c2VyICovCisJaWYgKG9wdHMtPmF1eHRyYWNlX21tYXBfcGFnZXMpIHsKKwkJdW5zaWduZWQgaW50IG1heF9wYWdlID0gKEtpQigxMjgpIC8gcGFnZV9zaXplKTsKKwkJc2l6ZV90IHN6ID0gb3B0cy0+YXV4dHJhY2VfbW1hcF9wYWdlcyAqIChzaXplX3QpcGFnZV9zaXplOworCisJCWlmICghcHJpdmlsZWdlZCAmJgorCQkgICAgb3B0cy0+YXV4dHJhY2VfbW1hcF9wYWdlcyA+IG1heF9wYWdlKSB7CisJCQlvcHRzLT5hdXh0cmFjZV9tbWFwX3BhZ2VzID0gbWF4X3BhZ2U7CisJCQlwcl9lcnIoImF1eHRyYWNlIHRvbyBiaWcsIHRydW5jYXRpbmcgdG8gJWRcbiIsCisJCQkgICAgICAgbWF4X3BhZ2UpOworCQl9CisKKwkJaWYgKCFpc19wb3dlcl9vZl8yKHN6KSkgeworCQkJcHJfZXJyKCJJbnZhbGlkIG1tYXAgc2l6ZSBmb3IgJXM6IG11c3QgYmUgYSBwb3dlciBvZiAyXG4iLAorCQkJICAgICAgIENPUkVTSUdIVF9FVE1fUE1VX05BTUUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAob3B0cy0+YXV4dHJhY2Vfc25hcHNob3RfbW9kZSkKKwkJcHJfZGVidWcyKCIlcyBzbmFwc2hvdCBzaXplOiAlenVcbiIsIENPUkVTSUdIVF9FVE1fUE1VX05BTUUsCisJCQkgIG9wdHMtPmF1eHRyYWNlX3NuYXBzaG90X3NpemUpOworCisJaWYgKGNzX2V0bV9ldnNlbCkgeworCQkvKgorCQkgKiBUbyBvYnRhaW4gdGhlIGF1eHRyYWNlIGJ1ZmZlciBmaWxlIGRlc2NyaXB0b3IsIHRoZSBhdXh0cmFjZQorCQkgKiBldmVudCBtdXN0IGNvbWUgZmlyc3QuCisJCSAqLworCQlwZXJmX2V2bGlzdF9fdG9fZnJvbnQoZXZsaXN0LCBjc19ldG1fZXZzZWwpOworCQkvKgorCQkgKiBJbiB0aGUgY2FzZSBvZiBwZXItY3B1IG1tYXBzLCB3ZSBuZWVkIHRoZSBDUFUgb24gdGhlCisJCSAqIEFVWCBldmVudC4KKwkJICovCisJCWlmICghY3B1X21hcF9fZW1wdHkoY3B1cykpCisJCQlwZXJmX2V2c2VsX19zZXRfc2FtcGxlX2JpdChjc19ldG1fZXZzZWwsIENQVSk7CisJfQorCisJLyogQWRkIGR1bW15IGV2ZW50IHRvIGtlZXAgdHJhY2tpbmcgKi8KKwlpZiAob3B0cy0+ZnVsbF9hdXh0cmFjZSkgeworCQlzdHJ1Y3QgcGVyZl9ldnNlbCAqdHJhY2tpbmdfZXZzZWw7CisJCWludCBlcnI7CisKKwkJZXJyID0gcGFyc2VfZXZlbnRzKGV2bGlzdCwgImR1bW15OnUiLCBOVUxMKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJdHJhY2tpbmdfZXZzZWwgPSBwZXJmX2V2bGlzdF9fbGFzdChldmxpc3QpOworCQlwZXJmX2V2bGlzdF9fc2V0X3RyYWNraW5nX2V2ZW50KGV2bGlzdCwgdHJhY2tpbmdfZXZzZWwpOworCisJCXRyYWNraW5nX2V2c2VsLT5hdHRyLmZyZXEgPSAwOworCQl0cmFja2luZ19ldnNlbC0+YXR0ci5zYW1wbGVfcGVyaW9kID0gMTsKKworCQkvKiBJbiBwZXItY3B1IGNhc2UsIGFsd2F5cyBuZWVkIHRoZSB0aW1lIG9mIG1tYXAgZXZlbnRzIGV0YyAqLworCQlpZiAoIWNwdV9tYXBfX2VtcHR5KGNwdXMpKQorCQkJcGVyZl9ldnNlbF9fc2V0X3NhbXBsZV9iaXQodHJhY2tpbmdfZXZzZWwsIFRJTUUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTY0IGNzX2V0bV9nZXRfY29uZmlnKHN0cnVjdCBhdXh0cmFjZV9yZWNvcmQgKml0cikKK3sKKwl1NjQgY29uZmlnID0gMDsKKwlzdHJ1Y3QgY3NfZXRtX3JlY29yZGluZyAqcHRyID0KKwkJCWNvbnRhaW5lcl9vZihpdHIsIHN0cnVjdCBjc19ldG1fcmVjb3JkaW5nLCBpdHIpOworCXN0cnVjdCBwZXJmX3BtdSAqY3NfZXRtX3BtdSA9IHB0ci0+Y3NfZXRtX3BtdTsKKwlzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCA9IHB0ci0+ZXZsaXN0OworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKworCWV2bGlzdF9fZm9yX2VhY2hfZW50cnkoZXZsaXN0LCBldnNlbCkgeworCQlpZiAoZXZzZWwtPmF0dHIudHlwZSA9PSBjc19ldG1fcG11LT50eXBlKSB7CisJCQkvKgorCQkJICogVmFyaWFibGUgcGVyZl9ldmVudF9hdHRyOjpjb25maWcgaXMgYXNzaWduZWQgdG8KKwkJCSAqIEVUTXYzL1BUTS4gIFRoZSBiaXQgZmllbGRzIGhhdmUgYmVlbiBtYWRlIHRvIG1hdGNoCisJCQkgKiB0aGUgRVRNdjMuNSBFVFJNQ1IgcmVnaXN0ZXIgc3BlY2lmaWNhdGlvbi4gIFNlZSB0aGUKKwkJCSAqIFBNVV9GT1JNQVRfQVRUUigpIGRlY2xhcmF0aW9ucyBpbgorCQkJICogZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1wZXJmLmMgZm9yCisJCQkgKiBkZXRhaWxzLgorCQkJICovCisJCQljb25maWcgPSBldnNlbC0+YXR0ci5jb25maWc7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBjb25maWc7Cit9CisKK3N0YXRpYyBzaXplX3QKK2NzX2V0bV9pbmZvX3ByaXZfc2l6ZShzdHJ1Y3QgYXV4dHJhY2VfcmVjb3JkICppdHIgX19tYXliZV91bnVzZWQsCisJCSAgICAgIHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0IF9fbWF5YmVfdW51c2VkKQoreworCWludCBpOworCWludCBldG12MyA9IDAsIGV0bXY0ID0gMDsKKwljb25zdCBzdHJ1Y3QgY3B1X21hcCAqY3B1cyA9IGV2bGlzdC0+Y3B1czsKKworCS8qIGNwdSBtYXAgaXMgbm90IGVtcHR5LCB3ZSBoYXZlIHNwZWNpZmljIENQVXMgdG8gd29yayB3aXRoICovCisJaWYgKCFjcHVfbWFwX19lbXB0eShjcHVzKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgY3B1X21hcF9fbnIoY3B1cyk7IGkrKykgeworCQkJaWYgKGNzX2V0bV9pc19ldG12NChpdHIsIGNwdXMtPm1hcFtpXSkpCisJCQkJZXRtdjQrKzsKKwkJCWVsc2UKKwkJCQlldG12MysrOworCQl9CisJfSBlbHNlIHsKKwkJLyogZ2V0IGNvbmZpZ3VyYXRpb24gZm9yIGFsbCBDUFVzIGluIHRoZSBzeXN0ZW0gKi8KKwkJZm9yIChpID0gMDsgaSA8IGNwdV9fbWF4X2NwdSgpOyBpKyspIHsKKwkJCWlmIChjc19ldG1faXNfZXRtdjQoaXRyLCBpKSkKKwkJCQlldG12NCsrOworCQkJZWxzZQorCQkJCWV0bXYzKys7CisJCX0KKwl9CisKKwlyZXR1cm4gKENTX0VUTV9IRUFERVJfU0laRSArCisJICAgICAgIChldG12NCAqIENTX0VUTVY0X1BSSVZfU0laRSkgKworCSAgICAgICAoZXRtdjMgKiBDU19FVE1WM19QUklWX1NJWkUpKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm1ldGFkYXRhX2V0bXYzX3JvW0NTX0VUTV9QUklWX01BWF0gPSB7CisJW0NTX0VUTV9FVE1DQ0VSXQk9ICJtZ210L2V0bWNjZXIiLAorCVtDU19FVE1fRVRNSURSXQkJPSAibWdtdC9ldG1pZHIiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm1ldGFkYXRhX2V0bXY0X3JvW0NTX0VUTVY0X1BSSVZfTUFYXSA9IHsKKwlbQ1NfRVRNVjRfVFJDSURSMF0JCT0gInRyY2lkci90cmNpZHIwIiwKKwlbQ1NfRVRNVjRfVFJDSURSMV0JCT0gInRyY2lkci90cmNpZHIxIiwKKwlbQ1NfRVRNVjRfVFJDSURSMl0JCT0gInRyY2lkci90cmNpZHIyIiwKKwlbQ1NfRVRNVjRfVFJDSURSOF0JCT0gInRyY2lkci90cmNpZHI4IiwKKwlbQ1NfRVRNVjRfVFJDQVVUSFNUQVRVU10JPSAibWdtdC90cmNhdXRoc3RhdHVzIiwKK307CisKK3N0YXRpYyBib29sIGNzX2V0bV9pc19ldG12NChzdHJ1Y3QgYXV4dHJhY2VfcmVjb3JkICppdHIsIGludCBjcHUpCit7CisJYm9vbCByZXQgPSBmYWxzZTsKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCWludCBzY2FuOworCXVuc2lnbmVkIGludCB2YWw7CisJc3RydWN0IGNzX2V0bV9yZWNvcmRpbmcgKnB0ciA9CisJCQljb250YWluZXJfb2YoaXRyLCBzdHJ1Y3QgY3NfZXRtX3JlY29yZGluZywgaXRyKTsKKwlzdHJ1Y3QgcGVyZl9wbXUgKmNzX2V0bV9wbXUgPSBwdHItPmNzX2V0bV9wbXU7CisKKwkvKiBUYWtlIGFueSBvZiB0aGUgUk8gZmlsZXMgZm9yIEVUTXY0IGFuZCBzZWUgaWYgaXQgcHJlc2VudCAqLworCXNucHJpbnRmKHBhdGgsIFBBVEhfTUFYLCAiY3B1JWQvJXMiLAorCQkgY3B1LCBtZXRhZGF0YV9ldG12NF9yb1tDU19FVE1WNF9UUkNJRFIwXSk7CisJc2NhbiA9IHBlcmZfcG11X19zY2FuX2ZpbGUoY3NfZXRtX3BtdSwgcGF0aCwgIiV4IiwgJnZhbCk7CisKKwkvKiBUaGUgZmlsZSB3YXMgcmVhZCBzdWNjZXNzZnVsbHksIHdlIGhhdmUgYSB3aW5uZXIgKi8KKwlpZiAoc2NhbiA9PSAxKQorCQlyZXQgPSB0cnVlOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjc19ldG1fZ2V0X3JvKHN0cnVjdCBwZXJmX3BtdSAqcG11LCBpbnQgY3B1LCBjb25zdCBjaGFyICpwYXRoKQoreworCWNoYXIgcG11X3BhdGhbUEFUSF9NQVhdOworCWludCBzY2FuOworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCisJLyogR2V0IFJPIG1ldGFkYXRhIGZyb20gc3lzZnMgKi8KKwlzbnByaW50ZihwbXVfcGF0aCwgUEFUSF9NQVgsICJjcHUlZC8lcyIsIGNwdSwgcGF0aCk7CisKKwlzY2FuID0gcGVyZl9wbXVfX3NjYW5fZmlsZShwbXUsIHBtdV9wYXRoLCAiJXgiLCAmdmFsKTsKKwlpZiAoc2NhbiAhPSAxKQorCQlwcl9lcnIoIiVzOiBlcnJvciByZWFkaW5nOiAlc1xuIiwgX19mdW5jX18sIHBtdV9wYXRoKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGNzX2V0bV9nZXRfbWV0YWRhdGEoaW50IGNwdSwgdTMyICpvZmZzZXQsCisJCQkJc3RydWN0IGF1eHRyYWNlX3JlY29yZCAqaXRyLAorCQkJCXN0cnVjdCBhdXh0cmFjZV9pbmZvX2V2ZW50ICppbmZvKQoreworCXUzMiBpbmNyZW1lbnQ7CisJdTY0IG1hZ2ljOworCXN0cnVjdCBjc19ldG1fcmVjb3JkaW5nICpwdHIgPQorCQkJY29udGFpbmVyX29mKGl0ciwgc3RydWN0IGNzX2V0bV9yZWNvcmRpbmcsIGl0cik7CisJc3RydWN0IHBlcmZfcG11ICpjc19ldG1fcG11ID0gcHRyLT5jc19ldG1fcG11OworCisJLyogZmlyc3Qgc2VlIHdoYXQga2luZCBvZiB0cmFjZXIgdGhpcyBjcHUgaXMgYWZmaW5lZCB0byAqLworCWlmIChjc19ldG1faXNfZXRtdjQoaXRyLCBjcHUpKSB7CisJCW1hZ2ljID0gX19wZXJmX2NzX2V0bXY0X21hZ2ljOworCQkvKiBHZXQgdHJhY2UgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCQlpbmZvLT5wcml2WypvZmZzZXQgKyBDU19FVE1WNF9UUkNDT05GSUdSXSA9CisJCQkJCQljc19ldG1fZ2V0X2NvbmZpZyhpdHIpOworCQkvKiBHZXQgdHJhY2VJRCBmcm9tIHRoZSBmcmFtZXdvcmsgKi8KKwkJaW5mby0+cHJpdlsqb2Zmc2V0ICsgQ1NfRVRNVjRfVFJDVFJBQ0VJRFJdID0KKwkJCQkJCWNvcmVzaWdodF9nZXRfdHJhY2VfaWQoY3B1KTsKKwkJLyogR2V0IHJlYWQtb25seSBpbmZvcm1hdGlvbiBmcm9tIHN5c0ZTICovCisJCWluZm8tPnByaXZbKm9mZnNldCArIENTX0VUTVY0X1RSQ0lEUjBdID0KKwkJCWNzX2V0bV9nZXRfcm8oY3NfZXRtX3BtdSwgY3B1LAorCQkJCSAgICAgIG1ldGFkYXRhX2V0bXY0X3JvW0NTX0VUTVY0X1RSQ0lEUjBdKTsKKwkJaW5mby0+cHJpdlsqb2Zmc2V0ICsgQ1NfRVRNVjRfVFJDSURSMV0gPQorCQkJY3NfZXRtX2dldF9ybyhjc19ldG1fcG11LCBjcHUsCisJCQkJICAgICAgbWV0YWRhdGFfZXRtdjRfcm9bQ1NfRVRNVjRfVFJDSURSMV0pOworCQlpbmZvLT5wcml2WypvZmZzZXQgKyBDU19FVE1WNF9UUkNJRFIyXSA9CisJCQljc19ldG1fZ2V0X3JvKGNzX2V0bV9wbXUsIGNwdSwKKwkJCQkgICAgICBtZXRhZGF0YV9ldG12NF9yb1tDU19FVE1WNF9UUkNJRFIyXSk7CisJCWluZm8tPnByaXZbKm9mZnNldCArIENTX0VUTVY0X1RSQ0lEUjhdID0KKwkJCWNzX2V0bV9nZXRfcm8oY3NfZXRtX3BtdSwgY3B1LAorCQkJCSAgICAgIG1ldGFkYXRhX2V0bXY0X3JvW0NTX0VUTVY0X1RSQ0lEUjhdKTsKKwkJaW5mby0+cHJpdlsqb2Zmc2V0ICsgQ1NfRVRNVjRfVFJDQVVUSFNUQVRVU10gPQorCQkJY3NfZXRtX2dldF9ybyhjc19ldG1fcG11LCBjcHUsCisJCQkJICAgICAgbWV0YWRhdGFfZXRtdjRfcm8KKwkJCQkgICAgICBbQ1NfRVRNVjRfVFJDQVVUSFNUQVRVU10pOworCisJCS8qIEhvdyBtdWNoIHNwYWNlIHdhcyB1c2VkICovCisJCWluY3JlbWVudCA9IENTX0VUTVY0X1BSSVZfTUFYOworCX0gZWxzZSB7CisJCW1hZ2ljID0gX19wZXJmX2NzX2V0bXYzX21hZ2ljOworCQkvKiBHZXQgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCQlpbmZvLT5wcml2WypvZmZzZXQgKyBDU19FVE1fRVRNQ1JdID0gY3NfZXRtX2dldF9jb25maWcoaXRyKTsKKwkJLyogR2V0IHRyYWNlSUQgZnJvbSB0aGUgZnJhbWV3b3JrICovCisJCWluZm8tPnByaXZbKm9mZnNldCArIENTX0VUTV9FVE1UUkFDRUlEUl0gPQorCQkJCQkJY29yZXNpZ2h0X2dldF90cmFjZV9pZChjcHUpOworCQkvKiBHZXQgcmVhZC1vbmx5IGluZm9ybWF0aW9uIGZyb20gc3lzRlMgKi8KKwkJaW5mby0+cHJpdlsqb2Zmc2V0ICsgQ1NfRVRNX0VUTUNDRVJdID0KKwkJCWNzX2V0bV9nZXRfcm8oY3NfZXRtX3BtdSwgY3B1LAorCQkJCSAgICAgIG1ldGFkYXRhX2V0bXYzX3JvW0NTX0VUTV9FVE1DQ0VSXSk7CisJCWluZm8tPnByaXZbKm9mZnNldCArIENTX0VUTV9FVE1JRFJdID0KKwkJCWNzX2V0bV9nZXRfcm8oY3NfZXRtX3BtdSwgY3B1LAorCQkJCSAgICAgIG1ldGFkYXRhX2V0bXYzX3JvW0NTX0VUTV9FVE1JRFJdKTsKKworCQkvKiBIb3cgbXVjaCBzcGFjZSB3YXMgdXNlZCAqLworCQlpbmNyZW1lbnQgPSBDU19FVE1fUFJJVl9NQVg7CisJfQorCisJLyogQnVpbGQgZ2VuZXJpYyBoZWFkZXIgcG9ydGlvbiAqLworCWluZm8tPnByaXZbKm9mZnNldCArIENTX0VUTV9NQUdJQ10gPSBtYWdpYzsKKwlpbmZvLT5wcml2WypvZmZzZXQgKyBDU19FVE1fQ1BVXSA9IGNwdTsKKwkvKiBXaGVyZSB0aGUgbmV4dCBDUFUgZW50cnkgc2hvdWxkIHN0YXJ0IGZyb20gKi8KKwkqb2Zmc2V0ICs9IGluY3JlbWVudDsKK30KKworc3RhdGljIGludCBjc19ldG1faW5mb19maWxsKHN0cnVjdCBhdXh0cmFjZV9yZWNvcmQgKml0ciwKKwkJCSAgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAorCQkJICAgIHN0cnVjdCBhdXh0cmFjZV9pbmZvX2V2ZW50ICppbmZvLAorCQkJICAgIHNpemVfdCBwcml2X3NpemUpCit7CisJaW50IGk7CisJdTMyIG9mZnNldDsKKwl1NjQgbnJfY3B1LCB0eXBlOworCWNvbnN0IHN0cnVjdCBjcHVfbWFwICpjcHVzID0gc2Vzc2lvbi0+ZXZsaXN0LT5jcHVzOworCXN0cnVjdCBjc19ldG1fcmVjb3JkaW5nICpwdHIgPQorCQkJY29udGFpbmVyX29mKGl0ciwgc3RydWN0IGNzX2V0bV9yZWNvcmRpbmcsIGl0cik7CisJc3RydWN0IHBlcmZfcG11ICpjc19ldG1fcG11ID0gcHRyLT5jc19ldG1fcG11OworCisJaWYgKHByaXZfc2l6ZSAhPSBjc19ldG1faW5mb19wcml2X3NpemUoaXRyLCBzZXNzaW9uLT5ldmxpc3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc2Vzc2lvbi0+ZXZsaXN0LT5ucl9tbWFwcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBJZiB0aGUgY3B1X21hcCBpcyBlbXB0eSBhbGwgQ1BVcyBhcmUgaW52b2x2ZWQgKi8KKwlucl9jcHUgPSBjcHVfbWFwX19lbXB0eShjcHVzKSA/IGNwdV9fbWF4X2NwdSgpIDogY3B1X21hcF9fbnIoY3B1cyk7CisJLyogR2V0IFBNVSB0eXBlIGFzIGR5bmFtaWNhbGx5IGFzc2lnbmVkIGJ5IHRoZSBjb3JlICovCisJdHlwZSA9IGNzX2V0bV9wbXUtPnR5cGU7CisKKwkvKiBGaXJzdCBmaWxsIG91dCB0aGUgc2Vzc2lvbiBoZWFkZXIgKi8KKwlpbmZvLT50eXBlID0gUEVSRl9BVVhUUkFDRV9DU19FVE07CisJaW5mby0+cHJpdltDU19IRUFERVJfVkVSU0lPTl8wXSA9IDA7CisJaW5mby0+cHJpdltDU19QTVVfVFlQRV9DUFVTXSA9IHR5cGUgPDwgMzI7CisJaW5mby0+cHJpdltDU19QTVVfVFlQRV9DUFVTXSB8PSBucl9jcHU7CisJaW5mby0+cHJpdltDU19FVE1fU05BUFNIT1RdID0gcHRyLT5zbmFwc2hvdF9tb2RlOworCisJb2Zmc2V0ID0gQ1NfRVRNX1NOQVBTSE9UICsgMTsKKworCS8qIGNwdSBtYXAgaXMgbm90IGVtcHR5LCB3ZSBoYXZlIHNwZWNpZmljIENQVXMgdG8gd29yayB3aXRoICovCisJaWYgKCFjcHVfbWFwX19lbXB0eShjcHVzKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgY3B1X21hcF9fbnIoY3B1cykgJiYgb2Zmc2V0IDwgcHJpdl9zaXplOyBpKyspCisJCQljc19ldG1fZ2V0X21ldGFkYXRhKGNwdXMtPm1hcFtpXSwgJm9mZnNldCwgaXRyLCBpbmZvKTsKKwl9IGVsc2UgeworCQkvKiBnZXQgY29uZmlndXJhdGlvbiBmb3IgYWxsIENQVXMgaW4gdGhlIHN5c3RlbSAqLworCQlmb3IgKGkgPSAwOyBpIDwgY3B1X19tYXhfY3B1KCk7IGkrKykKKwkJCWNzX2V0bV9nZXRfbWV0YWRhdGEoaSwgJm9mZnNldCwgaXRyLCBpbmZvKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjc19ldG1fZmluZF9zbmFwc2hvdChzdHJ1Y3QgYXV4dHJhY2VfcmVjb3JkICppdHIgX19tYXliZV91bnVzZWQsCisJCQkJaW50IGlkeCwgc3RydWN0IGF1eHRyYWNlX21tYXAgKm1tLAorCQkJCXVuc2lnbmVkIGNoYXIgKmRhdGEgX19tYXliZV91bnVzZWQsCisJCQkJdTY0ICpoZWFkLCB1NjQgKm9sZCkKK3sKKwlwcl9kZWJ1ZzMoIiVzOiBtbWFwIGluZGV4ICVkIG9sZCBoZWFkICV6dSBuZXcgaGVhZCAlenUgc2l6ZSAlenVcbiIsCisJCSAgX19mdW5jX18sIGlkeCwgKHNpemVfdCkqb2xkLCAoc2l6ZV90KSpoZWFkLCBtbS0+bGVuKTsKKworCSpvbGQgPSAqaGVhZDsKKwkqaGVhZCArPSBtbS0+bGVuOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3NfZXRtX3NuYXBzaG90X3N0YXJ0KHN0cnVjdCBhdXh0cmFjZV9yZWNvcmQgKml0cikKK3sKKwlzdHJ1Y3QgY3NfZXRtX3JlY29yZGluZyAqcHRyID0KKwkJCWNvbnRhaW5lcl9vZihpdHIsIHN0cnVjdCBjc19ldG1fcmVjb3JkaW5nLCBpdHIpOworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKworCWV2bGlzdF9fZm9yX2VhY2hfZW50cnkocHRyLT5ldmxpc3QsIGV2c2VsKSB7CisJCWlmIChldnNlbC0+YXR0ci50eXBlID09IHB0ci0+Y3NfZXRtX3BtdS0+dHlwZSkKKwkJCXJldHVybiBwZXJmX2V2c2VsX19kaXNhYmxlKGV2c2VsKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgY3NfZXRtX3NuYXBzaG90X2ZpbmlzaChzdHJ1Y3QgYXV4dHJhY2VfcmVjb3JkICppdHIpCit7CisJc3RydWN0IGNzX2V0bV9yZWNvcmRpbmcgKnB0ciA9CisJCQljb250YWluZXJfb2YoaXRyLCBzdHJ1Y3QgY3NfZXRtX3JlY29yZGluZywgaXRyKTsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CisKKwlldmxpc3RfX2Zvcl9lYWNoX2VudHJ5KHB0ci0+ZXZsaXN0LCBldnNlbCkgeworCQlpZiAoZXZzZWwtPmF0dHIudHlwZSA9PSBwdHItPmNzX2V0bV9wbXUtPnR5cGUpCisJCQlyZXR1cm4gcGVyZl9ldnNlbF9fZW5hYmxlKGV2c2VsKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB1NjQgY3NfZXRtX3JlZmVyZW5jZShzdHJ1Y3QgYXV4dHJhY2VfcmVjb3JkICppdHIgX19tYXliZV91bnVzZWQpCit7CisJcmV0dXJuICgoKHU2NCkgcmFuZCgpIDw8ICAwKSAmIDB4MDAwMDAwMDBGRkZGRkZGRnVsbCkgfAorCQkoKCh1NjQpIHJhbmQoKSA8PCAzMikgJiAweEZGRkZGRkZGMDAwMDAwMDB1bGwpOworfQorCitzdGF0aWMgdm9pZCBjc19ldG1fcmVjb3JkaW5nX2ZyZWUoc3RydWN0IGF1eHRyYWNlX3JlY29yZCAqaXRyKQoreworCXN0cnVjdCBjc19ldG1fcmVjb3JkaW5nICpwdHIgPQorCQkJY29udGFpbmVyX29mKGl0ciwgc3RydWN0IGNzX2V0bV9yZWNvcmRpbmcsIGl0cik7CisJZnJlZShwdHIpOworfQorCitzdGF0aWMgaW50IGNzX2V0bV9yZWFkX2ZpbmlzaChzdHJ1Y3QgYXV4dHJhY2VfcmVjb3JkICppdHIsIGludCBpZHgpCit7CisJc3RydWN0IGNzX2V0bV9yZWNvcmRpbmcgKnB0ciA9CisJCQljb250YWluZXJfb2YoaXRyLCBzdHJ1Y3QgY3NfZXRtX3JlY29yZGluZywgaXRyKTsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CisKKwlldmxpc3RfX2Zvcl9lYWNoX2VudHJ5KHB0ci0+ZXZsaXN0LCBldnNlbCkgeworCQlpZiAoZXZzZWwtPmF0dHIudHlwZSA9PSBwdHItPmNzX2V0bV9wbXUtPnR5cGUpCisJCQlyZXR1cm4gcGVyZl9ldmxpc3RfX2VuYWJsZV9ldmVudF9pZHgocHRyLT5ldmxpc3QsCisJCQkJCQkJICAgICBldnNlbCwgaWR4KTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RydWN0IGF1eHRyYWNlX3JlY29yZCAqY3NfZXRtX3JlY29yZF9pbml0KGludCAqZXJyKQoreworCXN0cnVjdCBwZXJmX3BtdSAqY3NfZXRtX3BtdTsKKwlzdHJ1Y3QgY3NfZXRtX3JlY29yZGluZyAqcHRyOworCisJY3NfZXRtX3BtdSA9IHBlcmZfcG11X19maW5kKENPUkVTSUdIVF9FVE1fUE1VX05BTUUpOworCisJaWYgKCFjc19ldG1fcG11KSB7CisJCSplcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlwdHIgPSB6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjc19ldG1fcmVjb3JkaW5nKSk7CisJaWYgKCFwdHIpIHsKKwkJKmVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXB0ci0+Y3NfZXRtX3BtdQkJCT0gY3NfZXRtX3BtdTsKKwlwdHItPml0ci5wYXJzZV9zbmFwc2hvdF9vcHRpb25zCT0gY3NfZXRtX3BhcnNlX3NuYXBzaG90X29wdGlvbnM7CisJcHRyLT5pdHIucmVjb3JkaW5nX29wdGlvbnMJPSBjc19ldG1fcmVjb3JkaW5nX29wdGlvbnM7CisJcHRyLT5pdHIuaW5mb19wcml2X3NpemUJCT0gY3NfZXRtX2luZm9fcHJpdl9zaXplOworCXB0ci0+aXRyLmluZm9fZmlsbAkJPSBjc19ldG1faW5mb19maWxsOworCXB0ci0+aXRyLmZpbmRfc25hcHNob3QJCT0gY3NfZXRtX2ZpbmRfc25hcHNob3Q7CisJcHRyLT5pdHIuc25hcHNob3Rfc3RhcnQJCT0gY3NfZXRtX3NuYXBzaG90X3N0YXJ0OworCXB0ci0+aXRyLnNuYXBzaG90X2ZpbmlzaAk9IGNzX2V0bV9zbmFwc2hvdF9maW5pc2g7CisJcHRyLT5pdHIucmVmZXJlbmNlCQk9IGNzX2V0bV9yZWZlcmVuY2U7CisJcHRyLT5pdHIuZnJlZQkJCT0gY3NfZXRtX3JlY29yZGluZ19mcmVlOworCXB0ci0+aXRyLnJlYWRfZmluaXNoCQk9IGNzX2V0bV9yZWFkX2ZpbmlzaDsKKworCSplcnIgPSAwOworCXJldHVybiAmcHRyLT5pdHI7CitvdXQ6CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBGSUxFICpjc19kZXZpY2VfX29wZW5fZmlsZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzdGF0IHN0OworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJY29uc3QgY2hhciAqc3lzZnM7CisKKwlzeXNmcyA9IHN5c2ZzX19tb3VudHBvaW50KCk7CisJaWYgKCFzeXNmcykKKwkJcmV0dXJuIE5VTEw7CisKKwlzbnByaW50ZihwYXRoLCBQQVRIX01BWCwKKwkJICIlcyIgQ1NfQlVTX0RFVklDRV9QQVRIICIlcyIsIHN5c2ZzLCBuYW1lKTsKKworCXByaW50ZigicGF0aDogJXNcbiIsIHBhdGgpOworCisJaWYgKHN0YXQocGF0aCwgJnN0KSA8IDApCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGZvcGVuKHBhdGgsICJ3Iik7CisKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSkKK2ludCBjc19kZXZpY2VfX3ByaW50X2ZpbGUoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCUZJTEUgKmZpbGU7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWZpbGUgPSBjc19kZXZpY2VfX29wZW5fZmlsZShuYW1lKTsKKwlpZiAoZmlsZSkgeworCQlyZXQgPSB2ZnByaW50ZihmaWxlLCBmbXQsIGFyZ3MpOworCQlmY2xvc2UoZmlsZSk7CisJfQorCXZhX2VuZChhcmdzKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgY3NfZXRtX3NldF9kcnZfY29uZmlnKHN0cnVjdCBwZXJmX2V2c2VsX2NvbmZpZ190ZXJtICp0ZXJtKQoreworCWludCByZXQ7CisJY2hhciBlbmFibGVfc2lua1tFTkFCTEVfU0lOS19NQVhdOworCisJc25wcmludGYoZW5hYmxlX3NpbmssIEVOQUJMRV9TSU5LX01BWCwgIiVzLyVzIiwKKwkJIHRlcm0tPnZhbC5kcnZfY2ZnLCAiZW5hYmxlX3NpbmsiKTsKKworCXJldCA9IGNzX2RldmljZV9fcHJpbnRfZmlsZShlbmFibGVfc2luaywgIiVkIiwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9hcm0vdXRpbC9jcy1ldG0uaCBiL3Rvb2xzL3BlcmYvYXJjaC9hcm0vdXRpbC9jcy1ldG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjU2NzQxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL2NzLWV0bS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQoQykgMjAxNSBMaW5hcm8gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEF1dGhvcjogTWF0aGlldSBQb2lyaWVyIDxtYXRoaWV1LnBvaXJpZXJAbGluYXJvLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgSU5DTFVERV9fUEVSRl9DU19FVE1fSF9fCisjZGVmaW5lIElOQ0xVREVfX1BFUkZfQ1NfRVRNX0hfXworCisjaW5jbHVkZSAiLi4vLi4vdXRpbC9ldnNlbC5oIgorCitzdHJ1Y3QgYXV4dHJhY2VfcmVjb3JkICpjc19ldG1fcmVjb3JkX2luaXQoaW50ICplcnIpOworaW50IGNzX2V0bV9zZXRfZHJ2X2NvbmZpZyhzdHJ1Y3QgcGVyZl9ldnNlbF9jb25maWdfdGVybSAqdGVybSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL3BtdS5jIGIvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL3BtdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZDY3MzkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvcG11LmMKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodChDKSAyMDE1IExpbmFybyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQXV0aG9yOiBNYXRoaWV1IFBvaXJpZXIgPG1hdGhpZXUucG9pcmllckBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvcmVzaWdodC1wbXUuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CisKKyNpbmNsdWRlICJjcy1ldG0uaCIKKyNpbmNsdWRlICIuLi8uLi91dGlsL3BtdS5oIgorCitzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyCisqcGVyZl9wbXVfX2dldF9kZWZhdWx0X2NvbmZpZyhzdHJ1Y3QgcGVyZl9wbXUgKnBtdSBfX21heWJlX3VudXNlZCkKK3sKKyNpZmRlZiBIQVZFX0FVWFRSQUNFX1NVUFBPUlQKKwlpZiAoIXN0cmNtcChwbXUtPm5hbWUsIENPUkVTSUdIVF9FVE1fUE1VX05BTUUpKSB7CisJCS8qIGFkZCBFVE0gZGVmYXVsdCBjb25maWcgaGVyZSAqLworCQlwbXUtPnNlbGVjdGFibGUgPSB0cnVlOworCQlwbXUtPnNldF9kcnZfY29uZmlnID0gY3NfZXRtX3NldF9kcnZfY29uZmlnOworCX0KKyNlbmRpZgorCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL2FybTY0L2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oIGIvdG9vbHMvcGVyZi9hcmNoL2FybTY0L2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NzU5MzYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gvYXJtNjQvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmZGVmIERFRklORV9EV0FSRl9SRUdTVFJfVEFCTEUKKy8qIFRoaXMgaXMgaW5jbHVkZWQgaW4gcGVyZi91dGlsL2R3YXJmLXJlZ3MuYyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFhcmNoNjRfcmVnc3RyX3RibFtdID0geworCSIlcjAiLCAiJXIxIiwgIiVyMiIsICIlcjMiLCAiJXI0IiwKKwkiJXI1IiwgIiVyNiIsICIlcjciLCAiJXI4IiwgIiVyOSIsCisJIiVyMTAiLCAiJXIxMSIsICIlcjEyIiwgIiVyMTMiLCAiJXIxNCIsCisJIiVyMTUiLCAiJXIxNiIsICIlcjE3IiwgIiVyMTgiLCAiJXIxOSIsCisJIiVyMjAiLCAiJXIyMSIsICIlcjIyIiwgIiVyMjMiLCAiJXIyNCIsCisJIiVyMjUiLCAiJXIyNiIsICIlcjI3IiwgIiVyMjgiLCAiJXIyOSIsCisJIiVsciIsICIlc3AiLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL2FybTY0L3V0aWwvQnVpbGQgYi90b29scy9wZXJmL2FyY2gvYXJtNjQvdXRpbC9CdWlsZAppbmRleCAwMmY0MWRiLi5jZWY2ZmIzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2FyY2gvYXJtNjQvdXRpbC9CdWlsZAorKysgYi90b29scy9wZXJmL2FyY2gvYXJtNjQvdXRpbC9CdWlsZApAQCAtMSwyICsxLDYgQEAKIGxpYnBlcmYtJChDT05GSUdfRFdBUkYpICAgICArPSBkd2FyZi1yZWdzLm8KIGxpYnBlcmYtJChDT05GSUdfTE9DQUxfTElCVU5XSU5EKSArPSB1bndpbmQtbGlidW53aW5kLm8KKworbGlicGVyZi0kKENPTkZJR19BVVhUUkFDRSkgKz0gLi4vLi4vYXJtL3V0aWwvcG11Lm8gXAorCQkJICAgICAgLi4vLi4vYXJtL3V0aWwvYXV4dHJhY2UubyBcCisJCQkgICAgICAuLi8uLi9hcm0vdXRpbC9jcy1ldG0ubwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvQnVpbGQgYi90b29scy9wZXJmL2FyY2gvcG93ZXJwYy9CdWlsZAppbmRleCA1NGFmZTRhLi5kYjUyZmEyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2FyY2gvcG93ZXJwYy9CdWlsZAorKysgYi90b29scy9wZXJmL2FyY2gvcG93ZXJwYy9CdWlsZApAQCAtMSArMSwyIEBACiBsaWJwZXJmLXkgKz0gdXRpbC8KK2xpYnBlcmYteSArPSB0ZXN0cy8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXJjaC10ZXN0cy5oIGIvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hcmNoLXRlc3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkOGRlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXJjaC10ZXN0cy5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgQVJDSF9URVNUU19ICisjZGVmaW5lIEFSQ0hfVEVTVFNfSAorCisjaWZkZWYgSEFWRV9EV0FSRl9VTldJTkRfU1VQUE9SVAorc3RydWN0IHRocmVhZDsKK3N0cnVjdCBwZXJmX3NhbXBsZTsKK2ludCB0ZXN0X19hcmNoX3Vud2luZF9zYW1wbGUoc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCisJCQkgICAgIHN0cnVjdCB0aHJlYWQgKnRocmVhZCk7CisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCB0ZXN0IGFyY2hfdGVzdHNbXTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCBiL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNDczMGYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaApAQCAtMCwwICsxLDI3IEBACisjaWZkZWYgREVGSU5FX0RXQVJGX1JFR1NUUl9UQUJMRQorLyogVGhpcyBpcyBpbmNsdWRlZCBpbiBwZXJmL3V0aWwvZHdhcmYtcmVncy5jICovCisKKy8qCisgKiBSZWZlcmVuY2U6CisgKiBodHRwOi8vcmVmc3BlY3MubGludXhmb3VuZGF0aW9uLm9yZy9FTEYvcHBjNjQvUFBDLWVsZjY0YWJpLTEuOS5odG1sCisgKiBodHRwOi8vcmVmc3BlY3MubGludXgtZm91bmRhdGlvbi5vcmcvZWxmL2VsZnNwZWNfcHBjLnBkZgorICovCisjZGVmaW5lIFJFR19EV0FSRk5VTV9OQU1FKHJlZywgaWR4KQlbaWR4XSA9ICIlIiAjcmVnCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcG93ZXJwY19yZWdzdHJfdGJsW10gPSB7CisJIiVncHIwIiwgIiVncHIxIiwgIiVncHIyIiwgIiVncHIzIiwgIiVncHI0IiwKKwkiJWdwcjUiLCAiJWdwcjYiLCAiJWdwcjciLCAiJWdwcjgiLCAiJWdwcjkiLAorCSIlZ3ByMTAiLCAiJWdwcjExIiwgIiVncHIxMiIsICIlZ3ByMTMiLCAiJWdwcjE0IiwKKwkiJWdwcjE1IiwgIiVncHIxNiIsICIlZ3ByMTciLCAiJWdwcjE4IiwgIiVncHIxOSIsCisJIiVncHIyMCIsICIlZ3ByMjEiLCAiJWdwcjIyIiwgIiVncHIyMyIsICIlZ3ByMjQiLAorCSIlZ3ByMjUiLCAiJWdwcjI2IiwgIiVncHIyNyIsICIlZ3ByMjgiLCAiJWdwcjI5IiwKKwkiJWdwcjMwIiwgIiVncHIzMSIsCisJUkVHX0RXQVJGTlVNX05BTUUobXNyLCAgIDY2KSwKKwlSRUdfRFdBUkZOVU1fTkFNRShjdHIsICAgMTA5KSwKKwlSRUdfRFdBUkZOVU1fTkFNRShsaW5rLCAgMTA4KSwKKwlSRUdfRFdBUkZOVU1fTkFNRSh4ZXIsICAgMTAxKSwKKwlSRUdfRFdBUkZOVU1fTkFNRShkYXIsICAgMTE5KSwKKwlSRUdfRFdBUkZOVU1fTkFNRShkc2lzciwgMTE4KSwKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9wZXJmX3JlZ3MuaCBiL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL2luY2x1ZGUvcGVyZl9yZWdzLmgKaW5kZXggNzVkZTBlOS4uYzEyZjRlOCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9wZXJmX3JlZ3MuaAorKysgYi90b29scy9wZXJmL2FyY2gvcG93ZXJwYy9pbmNsdWRlL3BlcmZfcmVncy5oCkBAIC01LDYgKzUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3BlcmZfcmVncy5oPgogCit2b2lkIHBlcmZfcmVnc19sb2FkKHU2NCAqcmVncyk7CisKICNkZWZpbmUgUEVSRl9SRUdTX01BU0sgICgoMVVMTCA8PCBQRVJGX1JFR19QT1dFUlBDX01BWCkgLSAxKQogI2RlZmluZSBQRVJGX1JFR1NfTUFYICAgUEVSRl9SRUdfUE9XRVJQQ19NQVgKICNpZmRlZiBfX3Bvd2VycGM2NF9fCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvcG93ZXJwYy90ZXN0cy9CdWlsZCBiL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL3Rlc3RzL0J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MjdlZjMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gvcG93ZXJwYy90ZXN0cy9CdWlsZApAQCAtMCwwICsxLDQgQEAKK2xpYnBlcmYtJChDT05GSUdfRFdBUkZfVU5XSU5EKSArPSByZWdzX2xvYWQubworbGlicGVyZi0kKENPTkZJR19EV0FSRl9VTldJTkQpICs9IGR3YXJmLXVud2luZC5vCisKK2xpYnBlcmYteSArPSBhcmNoLXRlc3RzLm8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL3Rlc3RzL2FyY2gtdGVzdHMuYyBiL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL3Rlc3RzL2FyY2gtdGVzdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRmNDYyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvdGVzdHMvYXJjaC10ZXN0cy5jCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ0ZXN0cy90ZXN0cy5oIgorI2luY2x1ZGUgImFyY2gtdGVzdHMuaCIKKworc3RydWN0IHRlc3QgYXJjaF90ZXN0c1tdID0geworI2lmZGVmIEhBVkVfRFdBUkZfVU5XSU5EX1NVUFBPUlQKKwl7CisJCS5kZXNjID0gIlRlc3QgZHdhcmYgdW53aW5kIiwKKwkJLmZ1bmMgPSB0ZXN0X19kd2FyZl91bndpbmQsCisJfSwKKyNlbmRpZgorCXsKKwkJLmZ1bmMgPSBOVUxMLAorCX0sCit9OwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvdGVzdHMvZHdhcmYtdW53aW5kLmMgYi90b29scy9wZXJmL2FyY2gvcG93ZXJwYy90ZXN0cy9kd2FyZi11bndpbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmFjMzEzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvdGVzdHMvZHdhcmYtdW53aW5kLmMKQEAgLTAsMCArMSw2MiBAQAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInBlcmZfcmVncy5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgIm1hcC5oIgorI2luY2x1ZGUgImV2ZW50LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ0ZXN0cy90ZXN0cy5oIgorI2luY2x1ZGUgImFyY2gtdGVzdHMuaCIKKworI2RlZmluZSBTVEFDS19TSVpFIDgxOTIKKworc3RhdGljIGludCBzYW1wbGVfdXN0YWNrKHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAorCQkJIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgdTY0ICpyZWdzKQoreworCXN0cnVjdCBzdGFja19kdW1wICpzdGFjayA9ICZzYW1wbGUtPnVzZXJfc3RhY2s7CisJc3RydWN0IG1hcCAqbWFwOworCXVuc2lnbmVkIGxvbmcgc3A7CisJdTY0IHN0YWNrX3NpemUsICpidWY7CisKKwlidWYgPSBtYWxsb2MoU1RBQ0tfU0laRSk7CisJaWYgKCFidWYpIHsKKwkJcHJfZGVidWcoImZhaWxlZCB0byBhbGxvY2F0ZSBzYW1wbGUgdXJlZ3MgZGF0YVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzcCA9ICh1bnNpZ25lZCBsb25nKSByZWdzW1BFUkZfUkVHX1BPV0VSUENfUjFdOworCisJbWFwID0gbWFwX2dyb3Vwc19fZmluZCh0aHJlYWQtPm1nLCBNQVBfX1ZBUklBQkxFLCAodTY0KSBzcCk7CisJaWYgKCFtYXApIHsKKwkJcHJfZGVidWcoImZhaWxlZCB0byBnZXQgc3RhY2sgbWFwXG4iKTsKKwkJZnJlZShidWYpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3RhY2tfc2l6ZSA9IG1hcC0+ZW5kIC0gc3A7CisJc3RhY2tfc2l6ZSA9IHN0YWNrX3NpemUgPiBTVEFDS19TSVpFID8gU1RBQ0tfU0laRSA6IHN0YWNrX3NpemU7CisKKwltZW1jcHkoYnVmLCAodm9pZCAqKSBzcCwgc3RhY2tfc2l6ZSk7CisJc3RhY2stPmRhdGEgPSAoY2hhciAqKSBidWY7CisJc3RhY2stPnNpemUgPSBzdGFja19zaXplOworCXJldHVybiAwOworfQorCitpbnQgdGVzdF9fYXJjaF91bndpbmRfc2FtcGxlKHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAorCQkJICAgICBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpCit7CisJc3RydWN0IHJlZ3NfZHVtcCAqcmVncyA9ICZzYW1wbGUtPnVzZXJfcmVnczsKKwl1NjQgKmJ1ZjsKKworCWJ1ZiA9IGNhbGxvYygxLCBzaXplb2YodTY0KSAqIFBFUkZfUkVHU19NQVgpOworCWlmICghYnVmKSB7CisJCXByX2RlYnVnKCJmYWlsZWQgdG8gYWxsb2NhdGUgc2FtcGxlIHVyZWdzIGRhdGFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcGVyZl9yZWdzX2xvYWQoYnVmKTsKKwlyZWdzLT5hYmkgID0gUEVSRl9TQU1QTEVfUkVHU19BQkk7CisJcmVncy0+cmVncyA9IGJ1ZjsKKwlyZWdzLT5tYXNrID0gUEVSRl9SRUdTX01BU0s7CisKKwlyZXR1cm4gc2FtcGxlX3VzdGFjayhzYW1wbGUsIHRocmVhZCwgYnVmKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL3Rlc3RzL3JlZ3NfbG9hZC5TIGIvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvdGVzdHMvcmVnc19sb2FkLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2YzlhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL3Rlc3RzL3JlZ3NfbG9hZC5TCkBAIC0wLDAgKzEsOTQgQEAKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKKy8qIE9mZnNldCBpcyBiYXNlZCBvbiBtYWNyb3MgZnJvbSBhcmNoL3Bvd2VycGMvaW5jbHVkZS91YXBpL2FzbS9wdHJhY2UuaC4gKi8KKyNkZWZpbmUgUjAJIDAKKyNkZWZpbmUgUjEJIDEgKiA4CisjZGVmaW5lIFIyCSAyICogOAorI2RlZmluZSBSMwkgMyAqIDgKKyNkZWZpbmUgUjQJIDQgKiA4CisjZGVmaW5lIFI1CSA1ICogOAorI2RlZmluZSBSNgkgNiAqIDgKKyNkZWZpbmUgUjcJIDcgKiA4CisjZGVmaW5lIFI4CSA4ICogOAorI2RlZmluZSBSOQkgOSAqIDgKKyNkZWZpbmUgUjEwCTEwICogOAorI2RlZmluZSBSMTEJMTEgKiA4CisjZGVmaW5lIFIxMgkxMiAqIDgKKyNkZWZpbmUgUjEzCTEzICogOAorI2RlZmluZSBSMTQJMTQgKiA4CisjZGVmaW5lIFIxNQkxNSAqIDgKKyNkZWZpbmUgUjE2CTE2ICogOAorI2RlZmluZSBSMTcJMTcgKiA4CisjZGVmaW5lIFIxOAkxOCAqIDgKKyNkZWZpbmUgUjE5CTE5ICogOAorI2RlZmluZSBSMjAJMjAgKiA4CisjZGVmaW5lIFIyMQkyMSAqIDgKKyNkZWZpbmUgUjIyCTIyICogOAorI2RlZmluZSBSMjMJMjMgKiA4CisjZGVmaW5lIFIyNAkyNCAqIDgKKyNkZWZpbmUgUjI1CTI1ICogOAorI2RlZmluZSBSMjYJMjYgKiA4CisjZGVmaW5lIFIyNwkyNyAqIDgKKyNkZWZpbmUgUjI4CTI4ICogOAorI2RlZmluZSBSMjkJMjkgKiA4CisjZGVmaW5lIFIzMAkzMCAqIDgKKyNkZWZpbmUgUjMxCTMxICogOAorI2RlZmluZSBOSVAJMzIgKiA4CisjZGVmaW5lIENUUgkzNSAqIDgKKyNkZWZpbmUgTElOSwkzNiAqIDgKKyNkZWZpbmUgWEVSCTM3ICogOAorCisuZ2xvYmwgcGVyZl9yZWdzX2xvYWQKK3BlcmZfcmVnc19sb2FkOgorCXN0ZCAwLCBSMCgzKQorCXN0ZCAxLCBSMSgzKQorCXN0ZCAyLCBSMigzKQorCXN0ZCAzLCBSMygzKQorCXN0ZCA0LCBSNCgzKQorCXN0ZCA1LCBSNSgzKQorCXN0ZCA2LCBSNigzKQorCXN0ZCA3LCBSNygzKQorCXN0ZCA4LCBSOCgzKQorCXN0ZCA5LCBSOSgzKQorCXN0ZCAxMCwgUjEwKDMpCisJc3RkIDExLCBSMTEoMykKKwlzdGQgMTIsIFIxMigzKQorCXN0ZCAxMywgUjEzKDMpCisJc3RkIDE0LCBSMTQoMykKKwlzdGQgMTUsIFIxNSgzKQorCXN0ZCAxNiwgUjE2KDMpCisJc3RkIDE3LCBSMTcoMykKKwlzdGQgMTgsIFIxOCgzKQorCXN0ZCAxOSwgUjE5KDMpCisJc3RkIDIwLCBSMjAoMykKKwlzdGQgMjEsIFIyMSgzKQorCXN0ZCAyMiwgUjIyKDMpCisJc3RkIDIzLCBSMjMoMykKKwlzdGQgMjQsIFIyNCgzKQorCXN0ZCAyNSwgUjI1KDMpCisJc3RkIDI2LCBSMjYoMykKKwlzdGQgMjcsIFIyNygzKQorCXN0ZCAyOCwgUjI4KDMpCisJc3RkIDI5LCBSMjkoMykKKwlzdGQgMzAsIFIzMCgzKQorCXN0ZCAzMSwgUjMxKDMpCisKKwkvKiBzdG9yZSBOSVAgKi8KKwltZmxyIDQKKwlzdGQgNCwgTklQKDMpCisKKwkvKiBTdG9yZSBMUiAqLworCXN0ZCA0LCBMSU5LKDMpCisKKwkvKiBTdG9yZSBYRVIgKi8KKwltZnhlciA0CisJc3RkIDQsIFhFUigzKQorCisJLyogU3RvcmUgQ1RSICovCisJbWZjdHIgNAorCXN0ZCA0LCBDVFIoMykKKworCS8qIFJlc3RvcmUgb3JpZ2luYWwgdmFsdWUgb2YgcjQgKi8KKwlsZCA0LCBSNCgzKQorCisJYmxyCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvcG93ZXJwYy91dGlsL3N5bS1oYW5kbGluZy5jIGIvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvdXRpbC9zeW0taGFuZGxpbmcuYwppbmRleCA4ZDRkYzk3Li5lZDlkNWQxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2FyY2gvcG93ZXJwYy91dGlsL3N5bS1oYW5kbGluZy5jCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL3V0aWwvc3ltLWhhbmRsaW5nLmMKQEAgLTk3LDYgKzk3LDcgQEAKIAl9CiB9CiAKKyNpZmRlZiBIQVZFX0xJQkVMRl9TVVBQT1JUCiB2b2lkIGFyY2hfX3Bvc3RfcHJvY2Vzc19wcm9iZV90cmFjZV9ldmVudHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwKIAkJCQkJICAgaW50IG50ZXZzKQogewpAQCAtMTA3LDcgKzEwOCw3IEBACiAJaW50IGkgPSAwOwogCiAJbWFwID0gZ2V0X3RhcmdldF9tYXAocGV2LT50YXJnZXQsIHBldi0+dXByb2Jlcyk7Ci0JaWYgKCFtYXAgfHwgbWFwX19sb2FkKG1hcCwgTlVMTCkgPCAwKQorCWlmICghbWFwIHx8IG1hcF9fbG9hZChtYXApIDwgMCkKIAkJcmV0dXJuOwogCiAJZm9yIChpID0gMDsgaSA8IG50ZXZzOyBpKyspIHsKQEAgLTExOCw1ICsxMTksNiBAQAogCQl9CiAJfQogfQorI2VuZGlmIC8qIEhBVkVfTElCRUxGX1NVUFBPUlQgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvczM5MC9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCBiL3Rvb2xzL3BlcmYvYXJjaC9zMzkwL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYTc0YTkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gvczM5MC9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaApAQCAtMCwwICsxLDggQEAKKyNpZmRlZiBERUZJTkVfRFdBUkZfUkVHU1RSX1RBQkxFCisvKiBUaGlzIGlzIGluY2x1ZGVkIGluIHBlcmYvdXRpbC9kd2FyZi1yZWdzLmMgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzMzkwX3JlZ3N0cl90YmxbXSA9IHsKKwkiJXIwIiwgIiVyMSIsICAiJXIyIiwgICIlcjMiLCAgIiVyNCIsICAiJXI1IiwgICIlcjYiLCAgIiVyNyIsCisJIiVyOCIsICIlcjkiLCAiJXIxMCIsICIlcjExIiwgIiVyMTIiLCAiJXIxMyIsICIlcjE0IiwgIiVyMTUiLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3NoL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oIGIvdG9vbHMvcGVyZi9hcmNoL3NoL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMmRlYWYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gvc2gvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgKQEAgLTAsMCArMSwyNSBAQAorI2lmZGVmIERFRklORV9EV0FSRl9SRUdTVFJfVEFCTEUKKy8qIFRoaXMgaXMgaW5jbHVkZWQgaW4gcGVyZi91dGlsL2R3YXJmLXJlZ3MuYyAqLworCitjb25zdCBjaGFyICogY29uc3Qgc2hfcmVnc3RyX3RibFtdID0geworCSJyMCIsCisJInIxIiwKKwkicjIiLAorCSJyMyIsCisJInI0IiwKKwkicjUiLAorCSJyNiIsCisJInI3IiwKKwkicjgiLAorCSJyOSIsCisJInIxMCIsCisJInIxMSIsCisJInIxMiIsCisJInIxMyIsCisJInIxNCIsCisJInIxNSIsCisJInBjIiwKKwkicHIiLAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvc3BhcmMvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmggYi90b29scy9wZXJmL2FyY2gvc3BhcmMvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjMDc2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9zcGFyYy9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaApAQCAtMCwwICsxLDE4IEBACisjaWZkZWYgREVGSU5FX0RXQVJGX1JFR1NUUl9UQUJMRQorLyogVGhpcyBpcyBpbmNsdWRlZCBpbiBwZXJmL3V0aWwvZHdhcmYtcmVncy5jICovCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BhcmNfcmVnc3RyX3RibFtdID0geworCSIlZzAiLCAiJWcxIiwgIiVnMiIsICIlZzMiLCAiJWc0IiwgIiVnNSIsICIlZzYiLCAiJWc3IiwKKwkiJW8wIiwgIiVvMSIsICIlbzIiLCAiJW8zIiwgIiVvNCIsICIlbzUiLCAiJXNwIiwgIiVvNyIsCisJIiVsMCIsICIlbDEiLCAiJWwyIiwgIiVsMyIsICIlbDQiLCAiJWw1IiwgIiVsNiIsICIlbDciLAorCSIlaTAiLCAiJWkxIiwgIiVpMiIsICIlaTMiLCAiJWk0IiwgIiVpNSIsICIlZnAiLCAiJWk3IiwKKwkiJWYwIiwgIiVmMSIsICIlZjIiLCAiJWYzIiwgIiVmNCIsICIlZjUiLCAiJWY2IiwgIiVmNyIsCisJIiVmOCIsICIlZjkiLCAiJWYxMCIsICIlZjExIiwgIiVmMTIiLCAiJWYxMyIsICIlZjE0IiwgIiVmMTUiLAorCSIlZjE2IiwgIiVmMTciLCAiJWYxOCIsICIlZjE5IiwgIiVmMjAiLCAiJWYyMSIsICIlZjIyIiwgIiVmMjMiLAorCSIlZjI0IiwgIiVmMjUiLCAiJWYyNiIsICIlZjI3IiwgIiVmMjgiLCAiJWYyOSIsICIlZjMwIiwgIiVmMzEiLAorCSIlZjMyIiwgIiVmMzMiLCAiJWYzNCIsICIlZjM1IiwgIiVmMzYiLCAiJWYzNyIsICIlZjM4IiwgIiVmMzkiLAorCSIlZjQwIiwgIiVmNDEiLCAiJWY0MiIsICIlZjQzIiwgIiVmNDQiLCAiJWY0NSIsICIlZjQ2IiwgIiVmNDciLAorCSIlZjQ4IiwgIiVmNDkiLCAiJWY1MCIsICIlZjUxIiwgIiVmNTIiLCAiJWY1MyIsICIlZjU0IiwgIiVmNTUiLAorCSIlZjU2IiwgIiVmNTciLCAiJWY1OCIsICIlZjU5IiwgIiVmNjAiLCAiJWY2MSIsICIlZjYyIiwgIiVmNjMiLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1ZTVjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgKQEAgLTAsMCArMSwxNCBAQAorI2lmZGVmIERFRklORV9EV0FSRl9SRUdTVFJfVEFCTEUKKy8qIFRoaXMgaXMgaW5jbHVkZWQgaW4gcGVyZi91dGlsL2R3YXJmLXJlZ3MuYyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHg4Nl8zMl9yZWdzdHJfdGJsW10gPSB7CisJIiVheCIsICIlY3giLCAiJWR4IiwgIiVieCIsICIkc3RhY2siLC8qIFN0YWNrIGFkZHJlc3MgaW5zdGVhZCBvZiAlc3AgKi8KKwkiJWJwIiwgIiVzaSIsICIlZGkiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB4ODZfNjRfcmVnc3RyX3RibFtdID0geworCSIlYXgiLCAiJWR4IiwgIiVjeCIsICIlYngiLCAiJXNpIiwgIiVkaSIsCisJIiVicCIsICIlc3AiLCAiJXI4IiwgIiVyOSIsICIlcjEwIiwgIiVyMTEiLAorCSIlcjEyIiwgIiVyMTMiLCAiJXIxNCIsICIlcjE1IiwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC94ODYvdXRpbC9pbnRlbC1wdC5jIGIvdG9vbHMvcGVyZi9hcmNoL3g4Ni91dGlsL2ludGVsLXB0LmMKaW5kZXggZmI1MTQ1Ny4uOTBmYTIyOCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni91dGlsL2ludGVsLXB0LmMKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3g4Ni91dGlsL2ludGVsLXB0LmMKQEAgLTYyLDYgKzYyLDcgQEAKIAlzaXplX3QJCQkJc25hcHNob3RfcmVmX2J1Zl9zaXplOwogCWludAkJCQlzbmFwc2hvdF9yZWZfY250OwogCXN0cnVjdCBpbnRlbF9wdF9zbmFwc2hvdF9yZWYJKnNuYXBzaG90X3JlZnM7CisJc2l6ZV90CQkJCXByaXZfc2l6ZTsKIH07CiAKIHN0YXRpYyBpbnQgaW50ZWxfcHRfcGFyc2VfdGVybXNfd2l0aF9kZWZhdWx0KHN0cnVjdCBsaXN0X2hlYWQgKmZvcm1hdHMsCkBAIC0yNzMsMTEgKzI3NCwzNyBAQAogCXJldHVybiBhdHRyOwogfQogCi1zdGF0aWMgc2l6ZV90Ci1pbnRlbF9wdF9pbmZvX3ByaXZfc2l6ZShzdHJ1Y3QgYXV4dHJhY2VfcmVjb3JkICppdHIgX19tYXliZV91bnVzZWQsCi0JCQlzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCBfX21heWJlX3VudXNlZCkKK3N0YXRpYyBjb25zdCBjaGFyICppbnRlbF9wdF9maW5kX2ZpbHRlcihzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwKKwkJCQkJc3RydWN0IHBlcmZfcG11ICppbnRlbF9wdF9wbXUpCiB7Ci0JcmV0dXJuIElOVEVMX1BUX0FVWFRSQUNFX1BSSVZfU0laRTsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CisKKwlldmxpc3RfX2Zvcl9lYWNoX2VudHJ5KGV2bGlzdCwgZXZzZWwpIHsKKwkJaWYgKGV2c2VsLT5hdHRyLnR5cGUgPT0gaW50ZWxfcHRfcG11LT50eXBlKQorCQkJcmV0dXJuIGV2c2VsLT5maWx0ZXI7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzaXplX3QgaW50ZWxfcHRfZmlsdGVyX2J5dGVzKGNvbnN0IGNoYXIgKmZpbHRlcikKK3sKKwlzaXplX3QgbGVuID0gZmlsdGVyID8gc3RybGVuKGZpbHRlcikgOiAwOworCisJcmV0dXJuIGxlbiA/IHJvdW5kdXAobGVuICsgMSwgOCkgOiAwOworfQorCitzdGF0aWMgc2l6ZV90CitpbnRlbF9wdF9pbmZvX3ByaXZfc2l6ZShzdHJ1Y3QgYXV4dHJhY2VfcmVjb3JkICppdHIsIHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQoreworCXN0cnVjdCBpbnRlbF9wdF9yZWNvcmRpbmcgKnB0ciA9CisJCQljb250YWluZXJfb2YoaXRyLCBzdHJ1Y3QgaW50ZWxfcHRfcmVjb3JkaW5nLCBpdHIpOworCWNvbnN0IGNoYXIgKmZpbHRlciA9IGludGVsX3B0X2ZpbmRfZmlsdGVyKGV2bGlzdCwgcHRyLT5pbnRlbF9wdF9wbXUpOworCisJcHRyLT5wcml2X3NpemUgPSAoSU5URUxfUFRfQVVYVFJBQ0VfUFJJVl9NQVggKiBzaXplb2YodTY0KSkgKworCQkJIGludGVsX3B0X2ZpbHRlcl9ieXRlcyhmaWx0ZXIpOworCisJcmV0dXJuIHB0ci0+cHJpdl9zaXplOwogfQogCiBzdGF0aWMgdm9pZCBpbnRlbF9wdF90c2NfY3RjX3JhdGlvKHUzMiAqbiwgdTMyICpkKQpAQCAtMzAyLDkgKzMyOSwxMyBAQAogCWJvb2wgY2FwX3VzZXJfdGltZV96ZXJvID0gZmFsc2UsIHBlcl9jcHVfbW1hcHM7CiAJdTY0IHRzY19iaXQsIG10Y19iaXQsIG10Y19mcmVxX2JpdHMsIGN5Y19iaXQsIG5vcmV0Y29tcF9iaXQ7CiAJdTMyIHRzY19jdGNfcmF0aW9fbiwgdHNjX2N0Y19yYXRpb19kOworCXVuc2lnbmVkIGxvbmcgbWF4X25vbl90dXJib19yYXRpbzsKKwlzaXplX3QgZmlsdGVyX3N0cl9sZW47CisJY29uc3QgY2hhciAqZmlsdGVyOworCXU2NCAqaW5mbzsKIAlpbnQgZXJyOwogCi0JaWYgKHByaXZfc2l6ZSAhPSBJTlRFTF9QVF9BVVhUUkFDRV9QUklWX1NJWkUpCisJaWYgKHByaXZfc2l6ZSAhPSBwdHItPnByaXZfc2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpbnRlbF9wdF9wYXJzZV90ZXJtcygmaW50ZWxfcHRfcG11LT5mb3JtYXQsICJ0c2MiLCAmdHNjX2JpdCk7CkBAIC0zMTcsNiArMzQ4LDEzIEBACiAKIAlpbnRlbF9wdF90c2NfY3RjX3JhdGlvKCZ0c2NfY3RjX3JhdGlvX24sICZ0c2NfY3RjX3JhdGlvX2QpOwogCisJaWYgKHBlcmZfcG11X19zY2FuX2ZpbGUoaW50ZWxfcHRfcG11LCAibWF4X25vbnR1cmJvX3JhdGlvIiwKKwkJCQkiJWx1IiwgJm1heF9ub25fdHVyYm9fcmF0aW8pICE9IDEpCisJCW1heF9ub25fdHVyYm9fcmF0aW8gPSAwOworCisJZmlsdGVyID0gaW50ZWxfcHRfZmluZF9maWx0ZXIoc2Vzc2lvbi0+ZXZsaXN0LCBwdHItPmludGVsX3B0X3BtdSk7CisJZmlsdGVyX3N0cl9sZW4gPSBmaWx0ZXIgPyBzdHJsZW4oZmlsdGVyKSA6IDA7CisKIAlpZiAoIXNlc3Npb24tPmV2bGlzdC0+bnJfbW1hcHMpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0zNTEsNiArMzg5LDE3IEBACiAJYXV4dHJhY2VfaW5mby0+cHJpdltJTlRFTF9QVF9UU0NfQ1RDX05dID0gdHNjX2N0Y19yYXRpb19uOwogCWF1eHRyYWNlX2luZm8tPnByaXZbSU5URUxfUFRfVFNDX0NUQ19EXSA9IHRzY19jdGNfcmF0aW9fZDsKIAlhdXh0cmFjZV9pbmZvLT5wcml2W0lOVEVMX1BUX0NZQ19CSVRdID0gY3ljX2JpdDsKKwlhdXh0cmFjZV9pbmZvLT5wcml2W0lOVEVMX1BUX01BWF9OT05UVVJCT19SQVRJT10gPSBtYXhfbm9uX3R1cmJvX3JhdGlvOworCWF1eHRyYWNlX2luZm8tPnByaXZbSU5URUxfUFRfRklMVEVSX1NUUl9MRU5dID0gZmlsdGVyX3N0cl9sZW47CisKKwlpbmZvID0gJmF1eHRyYWNlX2luZm8tPnByaXZbSU5URUxfUFRfRklMVEVSX1NUUl9MRU5dICsgMTsKKworCWlmIChmaWx0ZXJfc3RyX2xlbikgeworCQlzaXplX3QgbGVuID0gaW50ZWxfcHRfZmlsdGVyX2J5dGVzKGZpbHRlcik7CisKKwkJc3RybmNweSgoY2hhciAqKWluZm8sIGZpbHRlciwgbGVuKTsKKwkJaW5mbyArPSBsZW4gPj4gMzsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUwMSw3ICs1NTAsNyBAQAogCXN0cnVjdCBpbnRlbF9wdF9yZWNvcmRpbmcgKnB0ciA9CiAJCQljb250YWluZXJfb2YoaXRyLCBzdHJ1Y3QgaW50ZWxfcHRfcmVjb3JkaW5nLCBpdHIpOwogCXN0cnVjdCBwZXJmX3BtdSAqaW50ZWxfcHRfcG11ID0gcHRyLT5pbnRlbF9wdF9wbXU7Ci0JYm9vbCBoYXZlX3RpbWluZ19pbmZvOworCWJvb2wgaGF2ZV90aW1pbmdfaW5mbywgbmVlZF9pbW1lZGlhdGUgPSBmYWxzZTsKIAlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsICppbnRlbF9wdF9ldnNlbCA9IE5VTEw7CiAJY29uc3Qgc3RydWN0IGNwdV9tYXAgKmNwdXMgPSBldmxpc3QtPmNwdXM7CiAJYm9vbCBwcml2aWxlZ2VkID0gZ2V0ZXVpZCgpID09IDAgfHwgcGVyZl9ldmVudF9wYXJhbm9pZCgpIDwgMDsKQEAgLTY1NSw2ICs3MDQsNyBAQAogCQkJCXB0ci0+aGF2ZV9zY2hlZF9zd2l0Y2ggPSAzOwogCQkJfSBlbHNlIHsKIAkJCQlvcHRzLT5yZWNvcmRfc3dpdGNoX2V2ZW50cyA9IHRydWU7CisJCQkJbmVlZF9pbW1lZGlhdGUgPSB0cnVlOwogCQkJCWlmIChjcHVfd2lkZSkKIAkJCQkJcHRyLT5oYXZlX3NjaGVkX3N3aXRjaCA9IDM7CiAJCQkJZWxzZQpAQCAtNzAwLDYgKzc1MCw5IEBACiAJCXRyYWNraW5nX2V2c2VsLT5hdHRyLmZyZXEgPSAwOwogCQl0cmFja2luZ19ldnNlbC0+YXR0ci5zYW1wbGVfcGVyaW9kID0gMTsKIAorCQlpZiAobmVlZF9pbW1lZGlhdGUpCisJCQl0cmFja2luZ19ldnNlbC0+aW1tZWRpYXRlID0gdHJ1ZTsKKwogCQkvKiBJbiBwZXItY3B1IGNhc2UsIGFsd2F5cyBuZWVkIHRoZSB0aW1lIG9mIG1tYXAgZXZlbnRzIGV0YyAqLwogCQlpZiAoIWNwdV9tYXBfX2VtcHR5KGNwdXMpKSB7CiAJCQlwZXJmX2V2c2VsX19zZXRfc2FtcGxlX2JpdCh0cmFja2luZ19ldnNlbCwgVElNRSk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gveHRlbnNhL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oIGIvdG9vbHMvcGVyZi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTA0NDRhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaApAQCAtMCwwICsxLDggQEAKKyNpZmRlZiBERUZJTkVfRFdBUkZfUkVHU1RSX1RBQkxFCisvKiBUaGlzIGlzIGluY2x1ZGVkIGluIHBlcmYvdXRpbC9kd2FyZi1yZWdzLmMgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB4dGVuc2FfcmVnc3RyX3RibFtdID0geworCSJhMCIsICJhMSIsICJhMiIsICJhMyIsICJhNCIsICJhNSIsICJhNiIsICJhNyIsCisJImE4IiwgImE5IiwgImExMCIsICJhMTEiLCAiYTEyIiwgImExMyIsICJhMTQiLCAiYTE1IiwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtcmVxdWV1ZS5jIGIvdG9vbHMvcGVyZi9iZW5jaC9mdXRleC1yZXF1ZXVlLmMKaW5kZXggZjk2ZTIyZS4uMmI5NzA1YSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9iZW5jaC9mdXRleC1yZXF1ZXVlLmMKKysrIGIvdG9vbHMvcGVyZi9iZW5jaC9mdXRleC1yZXF1ZXVlLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxzdWJjbWQvcGFyc2Utb3B0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlICJiZW5jaC5oIgogI2luY2x1ZGUgImZ1dGV4LmgiCkBAIC02Miw3ICs2Myw3IEBACiAJcHJpbnRmKCJSZXF1ZXVlZCAlZCBvZiAlZCB0aHJlYWRzIGluICUuNGYgbXMgKCstJS4yZiUlKVxuIiwKIAkgICAgICAgcmVxdWV1ZWRfYXZnLAogCSAgICAgICBudGhyZWFkcywKLQkgICAgICAgcmVxdWV1ZXRpbWVfYXZnLzFlMywKKwkgICAgICAgcmVxdWV1ZXRpbWVfYXZnIC8gVVNFQ19QRVJfTVNFQywKIAkgICAgICAgcmVsX3N0ZGRldl9zdGF0cyhyZXF1ZXVldGltZV9zdGRkZXYsIHJlcXVldWV0aW1lX2F2ZykpOwogfQogCkBAIC0xODQsNyArMTg1LDcgQEAKIAogCQlpZiAoIXNpbGVudCkgewogCQkJcHJpbnRmKCJbUnVuICVkXTogUmVxdWV1ZWQgJWQgb2YgJWQgdGhyZWFkcyBpbiAlLjRmIG1zXG4iLAotCQkJICAgICAgIGogKyAxLCBucmVxdWV1ZWQsIG50aHJlYWRzLCBydW50aW1lLnR2X3VzZWMvMWUzKTsKKwkJCSAgICAgICBqICsgMSwgbnJlcXVldWVkLCBudGhyZWFkcywgcnVudGltZS50dl91c2VjIC8gKGRvdWJsZSlVU0VDX1BFUl9NU0VDKTsKIAkJfQogCiAJCS8qIGV2ZXJ5Ym9keSBzaG91bGQgYmUgYmxvY2tlZCBvbiBmdXRleDIsIHdha2UnZW0gdXAgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtd2FrZS1wYXJhbGxlbC5jIGIvdG9vbHMvcGVyZi9iZW5jaC9mdXRleC13YWtlLXBhcmFsbGVsLmMKaW5kZXggNGEyZWNkNy4uMmM4ZmE2NyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9iZW5jaC9mdXRleC13YWtlLXBhcmFsbGVsLmMKKysrIGIvdG9vbHMvcGVyZi9iZW5jaC9mdXRleC13YWtlLXBhcmFsbGVsLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxzdWJjbWQvcGFyc2Utb3B0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlICJiZW5jaC5oIgogI2luY2x1ZGUgImZ1dGV4LmgiCkBAIC0xNTYsNyArMTU3LDcgQEAKIAogCXByaW50ZigiW1J1biAlZF06IEF2ZyBwZXItdGhyZWFkIGxhdGVuY3kgKHdha2luZyAlZC8lZCB0aHJlYWRzKSAiCiAJICAgICAgICJpbiAlLjRmIG1zICgrLSUuMmYlJSlcbiIsIHJ1bl9udW0gKyAxLCB3YWtldXBfYXZnLAotCSAgICAgICBuYmxvY2tlZF90aHJlYWRzLCB3YWtldGltZV9hdmcvMWUzLAorCSAgICAgICBuYmxvY2tlZF90aHJlYWRzLCB3YWtldGltZV9hdmcgLyBVU0VDX1BFUl9NU0VDLAogCSAgICAgICByZWxfc3RkZGV2X3N0YXRzKHdha2V0aW1lX3N0ZGRldiwgd2FrZXRpbWVfYXZnKSk7CiB9CiAKQEAgLTE3Miw3ICsxNzMsNyBAQAogCXByaW50ZigiQXZnIHBlci10aHJlYWQgbGF0ZW5jeSAod2FraW5nICVkLyVkIHRocmVhZHMpIGluICUuNGYgbXMgKCstJS4yZiUlKVxuIiwKIAkgICAgICAgd2FrZXVwX2F2ZywKIAkgICAgICAgbmJsb2NrZWRfdGhyZWFkcywKLQkgICAgICAgd2FrZXRpbWVfYXZnLzFlMywKKwkgICAgICAgd2FrZXRpbWVfYXZnIC8gVVNFQ19QRVJfTVNFQywKIAkgICAgICAgcmVsX3N0ZGRldl9zdGF0cyh3YWtldGltZV9zdGRkZXYsIHdha2V0aW1lX2F2ZykpOwogfQogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXdha2UuYyBiL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtd2FrZS5jCmluZGV4IDg3ZDhmNGYuLmUyNDZiMWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtd2FrZS5jCisrKyBiL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtd2FrZS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8c3ViY21kL3BhcnNlLW9wdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWU2NC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSAiYmVuY2guaCIKICNpbmNsdWRlICJmdXRleC5oIgpAQCAtODEsNyArODIsNyBAQAogCXByaW50ZigiV29rZXVwICVkIG9mICVkIHRocmVhZHMgaW4gJS40ZiBtcyAoKy0lLjJmJSUpXG4iLAogCSAgICAgICB3YWtldXBfYXZnLAogCSAgICAgICBudGhyZWFkcywKLQkgICAgICAgd2FrZXRpbWVfYXZnLzFlMywKKwkgICAgICAgd2FrZXRpbWVfYXZnIC8gVVNFQ19QRVJfTVNFQywKIAkgICAgICAgcmVsX3N0ZGRldl9zdGF0cyh3YWtldGltZV9zdGRkZXYsIHdha2V0aW1lX2F2ZykpOwogfQogCkBAIC0xODIsNyArMTgzLDcgQEAKIAogCQlpZiAoIXNpbGVudCkgewogCQkJcHJpbnRmKCJbUnVuICVkXTogV29rZXVwICVkIG9mICVkIHRocmVhZHMgaW4gJS40ZiBtc1xuIiwKLQkJCSAgICAgICBqICsgMSwgbndva2VuLCBudGhyZWFkcywgcnVudGltZS50dl91c2VjLzFlMyk7CisJCQkgICAgICAgaiArIDEsIG53b2tlbiwgbnRocmVhZHMsIHJ1bnRpbWUudHZfdXNlYyAvIChkb3VibGUpVVNFQ19QRVJfTVNFQyk7CiAJCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9iZW5jaC9tZW0tZnVuY3Rpb25zLmMgYi90b29scy9wZXJmL2JlbmNoL21lbS1mdW5jdGlvbnMuYwppbmRleCAyYjU0ZDBmLi5jNjg0OTEwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2JlbmNoL21lbS1mdW5jdGlvbnMuYworKysgYi90b29scy9wZXJmL2JlbmNoL21lbS1mdW5jdGlvbnMuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KIAogI2RlZmluZSBLIDEwMjQKIApAQCAtODksNyArOTAsNyBAQAogCiBzdGF0aWMgZG91YmxlIHRpbWV2YWwyZG91YmxlKHN0cnVjdCB0aW1ldmFsICp0cykKIHsKLQlyZXR1cm4gKGRvdWJsZSl0cy0+dHZfc2VjICsgKGRvdWJsZSl0cy0+dHZfdXNlYyAvIChkb3VibGUpMTAwMDAwMDsKKwlyZXR1cm4gKGRvdWJsZSl0cy0+dHZfc2VjICsgKGRvdWJsZSl0cy0+dHZfdXNlYyAvIChkb3VibGUpVVNFQ19QRVJfU0VDOwogfQogCiAjZGVmaW5lIHByaW50X2Jwcyh4KSBkbyB7CQkJCQkJXApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9iZW5jaC9udW1hLmMgYi90b29scy9wZXJmL2JlbmNoL251bWEuYwppbmRleCBmN2Y1MzAwLi44ZWZlOTA0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2JlbmNoL251bWEuYworKysgYi90b29scy9wZXJmL2JlbmNoL251bWEuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAKICNpbmNsdWRlIDxudW1hLmg+CiAjaW5jbHVkZSA8bnVtYWlmLmg+CkBAIC0xMDA0LDcgKzEwMDUsNyBAQAogCWlmIChzdHJvbmcgJiYgcHJvY2Vzc19ncm91cHMgPT0gZy0+cC5ucl9wcm9jKSB7CiAJCWlmICghKmNvbnZlcmdlbmNlKSB7CiAJCQkqY29udmVyZ2VuY2UgPSBydW50aW1lX25zX21heDsKLQkJCXRwcmludGYoIiAoJTYuMWZzIGNvbnZlcmdlZClcbiIsICpjb252ZXJnZW5jZS8xZTkpOworCQkJdHByaW50ZigiICglNi4xZnMgY29udmVyZ2VkKVxuIiwgKmNvbnZlcmdlbmNlIC8gTlNFQ19QRVJfU0VDKTsKIAkJCWlmIChnLT5wLm1lYXN1cmVfY29udmVyZ2VuY2UpIHsKIAkJCQlnLT5hbGxfY29udmVyZ2VkID0gdHJ1ZTsKIAkJCQlnLT5zdG9wX3dvcmsgPSB0cnVlOwpAQCAtMTAxMiw3ICsxMDEzLDcgQEAKIAkJfQogCX0gZWxzZSB7CiAJCWlmICgqY29udmVyZ2VuY2UpIHsKLQkJCXRwcmludGYoIiAoJTYuMWZzIGRlLWNvbnZlcmdlZCkiLCBydW50aW1lX25zX21heC8xZTkpOworCQkJdHByaW50ZigiICglNi4xZnMgZGUtY29udmVyZ2VkKSIsIHJ1bnRpbWVfbnNfbWF4IC8gTlNFQ19QRVJfU0VDKTsKIAkJCSpjb252ZXJnZW5jZSA9IDA7CiAJCX0KIAkJdHByaW50ZigiXG4iKTsKQEAgLTEwMjIsNyArMTAyMyw3IEBACiBzdGF0aWMgdm9pZCBzaG93X3N1bW1hcnkoZG91YmxlIHJ1bnRpbWVfbnNfbWF4LCBpbnQgbCwgZG91YmxlICpjb252ZXJnZW5jZSkKIHsKIAl0cHJpbnRmKCJcciAjICAlNS4xZiUlICBbJS4xZiBtaW5zXSIsCi0JCShkb3VibGUpKGwrMSkvZy0+cC5ucl9sb29wcyoxMDAuMCwgcnVudGltZV9uc19tYXgvMWU5IC8gNjAuMCk7CisJCShkb3VibGUpKGwrMSkvZy0+cC5ucl9sb29wcyoxMDAuMCwgcnVudGltZV9uc19tYXggLyBOU0VDX1BFUl9TRUMgLyA2MC4wKTsKIAogCWNhbGNfY29udmVyZ2VuY2UocnVudGltZV9uc19tYXgsIGNvbnZlcmdlbmNlKTsKIApAQCAtMTE3OSw4ICsxMTgwLDggQEAKIAogCQlpZiAoZGV0YWlscyA+PSAzKSB7CiAJCQl0aW1lcnN1Yigmc3RvcCwgJnN0YXJ0LCAmZGlmZik7Ci0JCQlydW50aW1lX25zX21heCA9IGRpZmYudHZfc2VjICogMTAwMDAwMDAwMDsKLQkJCXJ1bnRpbWVfbnNfbWF4ICs9IGRpZmYudHZfdXNlYyAqIDEwMDA7CisJCQlydW50aW1lX25zX21heCA9IGRpZmYudHZfc2VjICogTlNFQ19QRVJfU0VDOworCQkJcnVudGltZV9uc19tYXggKz0gZGlmZi50dl91c2VjICogTlNFQ19QRVJfVVNFQzsKIAogCQkJaWYgKGRldGFpbHMgPj0gMCkgewogCQkJCXByaW50ZigiICMlMmQgLyAlMmQ6ICUxNC4ybGYgbnNlY3Mvb3AgW3ZhbDogJTAxNiJQUkl4NjQiXVxuIiwKQEAgLTExOTIsMjMgKzExOTMsMjMgQEAKIAkJCWNvbnRpbnVlOwogCiAJCXRpbWVyc3ViKCZzdG9wLCAmc3RhcnQwLCAmZGlmZik7Ci0JCXJ1bnRpbWVfbnNfbWF4ID0gZGlmZi50dl9zZWMgKiAxMDAwMDAwMDAwVUxMOwotCQlydW50aW1lX25zX21heCArPSBkaWZmLnR2X3VzZWMgKiAxMDAwVUxMOworCQlydW50aW1lX25zX21heCA9IGRpZmYudHZfc2VjICogTlNFQ19QRVJfU0VDOworCQlydW50aW1lX25zX21heCArPSBkaWZmLnR2X3VzZWMgKiBOU0VDX1BFUl9VU0VDOwogCiAJCXNob3dfc3VtbWFyeShydW50aW1lX25zX21heCwgbCwgJmNvbnZlcmdlbmNlKTsKIAl9CiAKIAlnZXR0aW1lb2ZkYXkoJnN0b3AsIE5VTEwpOwogCXRpbWVyc3ViKCZzdG9wLCAmc3RhcnQwLCAmZGlmZik7Ci0JdGQtPnJ1bnRpbWVfbnMgPSBkaWZmLnR2X3NlYyAqIDEwMDAwMDAwMDBVTEw7Ci0JdGQtPnJ1bnRpbWVfbnMgKz0gZGlmZi50dl91c2VjICogMTAwMFVMTDsKLQl0ZC0+c3BlZWRfZ2JzID0gYnl0ZXNfZG9uZSAvICh0ZC0+cnVudGltZV9ucyAvIDFlOSkgLyAxZTk7CisJdGQtPnJ1bnRpbWVfbnMgPSBkaWZmLnR2X3NlYyAqIE5TRUNfUEVSX1NFQzsKKwl0ZC0+cnVudGltZV9ucyArPSBkaWZmLnR2X3VzZWMgKiBOU0VDX1BFUl9VU0VDOworCXRkLT5zcGVlZF9nYnMgPSBieXRlc19kb25lIC8gKHRkLT5ydW50aW1lX25zIC8gTlNFQ19QRVJfU0VDKSAvIDFlOTsKIAogCWdldHJ1c2FnZShSVVNBR0VfVEhSRUFELCAmcnVzYWdlKTsKLQl0ZC0+c3lzdGVtX3RpbWVfbnMgPSBydXNhZ2UucnVfc3RpbWUudHZfc2VjICogMTAwMDAwMDAwMFVMTDsKLQl0ZC0+c3lzdGVtX3RpbWVfbnMgKz0gcnVzYWdlLnJ1X3N0aW1lLnR2X3VzZWMgKiAxMDAwVUxMOwotCXRkLT51c2VyX3RpbWVfbnMgPSBydXNhZ2UucnVfdXRpbWUudHZfc2VjICogMTAwMDAwMDAwMFVMTDsKLQl0ZC0+dXNlcl90aW1lX25zICs9IHJ1c2FnZS5ydV91dGltZS50dl91c2VjICogMTAwMFVMTDsKKwl0ZC0+c3lzdGVtX3RpbWVfbnMgPSBydXNhZ2UucnVfc3RpbWUudHZfc2VjICogTlNFQ19QRVJfU0VDOworCXRkLT5zeXN0ZW1fdGltZV9ucyArPSBydXNhZ2UucnVfc3RpbWUudHZfdXNlYyAqIE5TRUNfUEVSX1VTRUM7CisJdGQtPnVzZXJfdGltZV9ucyA9IHJ1c2FnZS5ydV91dGltZS50dl9zZWMgKiBOU0VDX1BFUl9TRUM7CisJdGQtPnVzZXJfdGltZV9ucyArPSBydXNhZ2UucnVfdXRpbWUudHZfdXNlYyAqIE5TRUNfUEVSX1VTRUM7CiAKIAlmcmVlX2RhdGEodGhyZWFkX2RhdGEsIGctPnAuYnl0ZXNfdGhyZWFkKTsKIApAQCAtMTQ2OSw3ICsxNDcwLDcgQEAKIAl9CiAJLyogV2FpdCBmb3IgYWxsIHRoZSB0aHJlYWRzIHRvIHN0YXJ0IHVwOiAqLwogCXdoaWxlIChnLT5ucl90YXNrc19zdGFydGVkICE9IGctPnAubnJfdGFza3MpCi0JCXVzbGVlcCgxMDAwKTsKKwkJdXNsZWVwKFVTRUNfUEVSX01TRUMpOwogCiAJQlVHX09OKGctPm5yX3Rhc2tzX3N0YXJ0ZWQgIT0gZy0+cC5ucl90YXNrcyk7CiAKQEAgLTE0ODgsOSArMTQ4OSw5IEBACiAKIAkJdGltZXJzdWIoJnN0b3AsICZzdGFydCwgJmRpZmYpOwogCi0JCXN0YXJ0dXBfc2VjID0gZGlmZi50dl9zZWMgKiAxMDAwMDAwMDAwLjA7Ci0JCXN0YXJ0dXBfc2VjICs9IGRpZmYudHZfdXNlYyAqIDEwMDAuMDsKLQkJc3RhcnR1cF9zZWMgLz0gMWU5OworCQlzdGFydHVwX3NlYyA9IGRpZmYudHZfc2VjICogTlNFQ19QRVJfU0VDOworCQlzdGFydHVwX3NlYyArPSBkaWZmLnR2X3VzZWMgKiBOU0VDX1BFUl9VU0VDOworCQlzdGFydHVwX3NlYyAvPSBOU0VDX1BFUl9TRUM7CiAKIAkJdHByaW50ZigiIHRocmVhZHMgaW5pdGlhbGl6ZWQgaW4gJS42ZiBzZWNvbmRzLlxuIiwgc3RhcnR1cF9zZWMpOwogCQl0cHJpbnRmKCIgI1xuIik7CkBAIC0xNTI5LDE0ICsxNTMwLDE0IEBACiAJdHByaW50ZigiXG4gIyMjXG4iKTsKIAl0cHJpbnRmKCJcbiIpOwogCi0JcnVudGltZV9zZWNfbWF4ID0gZGlmZi50dl9zZWMgKiAxMDAwMDAwMDAwLjA7Ci0JcnVudGltZV9zZWNfbWF4ICs9IGRpZmYudHZfdXNlYyAqIDEwMDAuMDsKLQlydW50aW1lX3NlY19tYXggLz0gMWU5OworCXJ1bnRpbWVfc2VjX21heCA9IGRpZmYudHZfc2VjICogTlNFQ19QRVJfU0VDOworCXJ1bnRpbWVfc2VjX21heCArPSBkaWZmLnR2X3VzZWMgKiBOU0VDX1BFUl9VU0VDOworCXJ1bnRpbWVfc2VjX21heCAvPSBOU0VDX1BFUl9TRUM7CiAKLQlydW50aW1lX3NlY19taW4gPSBydW50aW1lX25zX21pbi8xZTk7CisJcnVudGltZV9zZWNfbWluID0gcnVudGltZV9uc19taW4gLyBOU0VDX1BFUl9TRUM7CiAKIAlieXRlcyA9IGctPmJ5dGVzX2RvbmU7Ci0JcnVudGltZV9hdmcgPSAoZG91YmxlKXJ1bnRpbWVfbnNfc3VtIC8gZy0+cC5ucl90YXNrcyAvIDFlOTsKKwlydW50aW1lX2F2ZyA9IChkb3VibGUpcnVudGltZV9uc19zdW0gLyBnLT5wLm5yX3Rhc2tzIC8gTlNFQ19QRVJfU0VDOwogCiAJaWYgKGctPnAubWVhc3VyZV9jb252ZXJnZW5jZSkgewogCQlwcmludF9yZXMobmFtZSwgcnVudGltZV9zZWNfbWF4LApAQCAtMTU2Miw3ICsxNTYzLDcgQEAKIAlwcmludF9yZXMobmFtZSwgYnl0ZXMgLyAxZTksCiAJCSJHQiwiLCAiZGF0YS10b3RhbCIsCQkiR0IgZGF0YSBwcm9jZXNzZWQsIHRvdGFsIik7CiAKLQlwcmludF9yZXMobmFtZSwgcnVudGltZV9zZWNfbWF4ICogMWU5IC8gKGJ5dGVzIC8gZy0+cC5ucl90YXNrcyksCisJcHJpbnRfcmVzKG5hbWUsIHJ1bnRpbWVfc2VjX21heCAqIE5TRUNfUEVSX1NFQyAvIChieXRlcyAvIGctPnAubnJfdGFza3MpLAogCQkibnNlY3MsIiwgInJ1bnRpbWUvYnl0ZS90aHJlYWQiLCJuc2Vjcy9ieXRlL3RocmVhZCBydW50aW1lIik7CiAKIAlwcmludF9yZXMobmFtZSwgYnl0ZXMgLyBnLT5wLm5yX3Rhc2tzIC8gMWU5IC8gcnVudGltZV9zZWNfbWF4LApAQCAtMTU4MSw5ICsxNTgyLDkgQEAKIAkJCQlzbnByaW50Zih0bmFtZSwgMzIsICJwcm9jZXNzJWQ6dGhyZWFkJWQiLCBwLCB0KTsKIAkJCQlwcmludF9yZXModG5hbWUsIHRkLT5zcGVlZF9nYnMsCiAJCQkJCSJHQi9zZWMiLAkidGhyZWFkLXNwZWVkIiwgIkdCL3NlYy90aHJlYWQgc3BlZWQiKTsKLQkJCQlwcmludF9yZXModG5hbWUsIHRkLT5zeXN0ZW1fdGltZV9ucyAvIDFlOSwKKwkJCQlwcmludF9yZXModG5hbWUsIHRkLT5zeXN0ZW1fdGltZV9ucyAvIE5TRUNfUEVSX1NFQywKIAkJCQkJInNlY3MiLAkidGhyZWFkLXN5c3RlbS10aW1lIiwgInN5c3RlbSBDUFUgdGltZS90aHJlYWQiKTsKLQkJCQlwcmludF9yZXModG5hbWUsIHRkLT51c2VyX3RpbWVfbnMgLyAxZTksCisJCQkJcHJpbnRfcmVzKHRuYW1lLCB0ZC0+dXNlcl90aW1lX25zIC8gTlNFQ19QRVJfU0VDLAogCQkJCQkic2VjcyIsCSJ0aHJlYWQtdXNlci10aW1lIiwgInVzZXIgQ1BVIHRpbWUvdGhyZWFkIik7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYmVuY2gvc2NoZWQtbWVzc2FnaW5nLmMgYi90b29scy9wZXJmL2JlbmNoL3NjaGVkLW1lc3NhZ2luZy5jCmluZGV4IGJmYWY5NTAuLjZhMTExZTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYmVuY2gvc2NoZWQtbWVzc2FnaW5nLmMKKysrIGIvdG9vbHMvcGVyZi9iZW5jaC9zY2hlZC1tZXNzYWdpbmcuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPHBvbGwuaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxlcnIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KIAogI2RlZmluZSBEQVRBU0laRSAxMDAKIApAQCAtMzEyLDExICszMTMsMTEgQEAKIAkJICAgICAgIHRocmVhZF9tb2RlID8gInRocmVhZHMiIDogInByb2Nlc3NlcyIpOwogCQlwcmludGYoIiAlMTRzOiAlbHUuJTAzbHUgW3NlY11cbiIsICJUb3RhbCB0aW1lIiwKIAkJICAgICAgIGRpZmYudHZfc2VjLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChkaWZmLnR2X3VzZWMvMTAwMCkpOworCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChkaWZmLnR2X3VzZWMgLyBVU0VDX1BFUl9NU0VDKSk7CiAJCWJyZWFrOwogCWNhc2UgQkVOQ0hfRk9STUFUX1NJTVBMRToKIAkJcHJpbnRmKCIlbHUuJTAzbHVcbiIsIGRpZmYudHZfc2VjLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChkaWZmLnR2X3VzZWMvMTAwMCkpOworCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChkaWZmLnR2X3VzZWMgLyBVU0VDX1BFUl9NU0VDKSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIHJlYWNoaW5nIGhlcmUgaXMgc29tZXRoaW5nIGRpc2FzdGVyICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2JlbmNoL3NjaGVkLXBpcGUuYyBiL3Rvb2xzL3BlcmYvYmVuY2gvc2NoZWQtcGlwZS5jCmluZGV4IDFkYzJkMTMuLjIyNDNmMDEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYmVuY2gvc2NoZWQtcGlwZS5jCisrKyBiL3Rvb2xzL3BlcmYvYmVuY2gvc2NoZWQtcGlwZS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWU2NC5oPgogCiAjaW5jbHVkZSA8cHRocmVhZC5oPgogCkBAIC0xNTMsMjQgKzE1NCwyNCBAQAogCQlwcmludGYoIiMgRXhlY3V0ZWQgJWQgcGlwZSBvcGVyYXRpb25zIGJldHdlZW4gdHdvICVzXG5cbiIsCiAJCQlsb29wcywgdGhyZWFkZWQgPyAidGhyZWFkcyIgOiAicHJvY2Vzc2VzIik7CiAKLQkJcmVzdWx0X3VzZWMgPSBkaWZmLnR2X3NlYyAqIDEwMDAwMDA7CisJCXJlc3VsdF91c2VjID0gZGlmZi50dl9zZWMgKiBVU0VDX1BFUl9TRUM7CiAJCXJlc3VsdF91c2VjICs9IGRpZmYudHZfdXNlYzsKIAogCQlwcmludGYoIiAlMTRzOiAlbHUuJTAzbHUgW3NlY11cblxuIiwgIlRvdGFsIHRpbWUiLAogCQkgICAgICAgZGlmZi50dl9zZWMsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgKGRpZmYudHZfdXNlYy8xMDAwKSk7CisJCSAgICAgICAodW5zaWduZWQgbG9uZykgKGRpZmYudHZfdXNlYyAvIFVTRUNfUEVSX01TRUMpKTsKIAogCQlwcmludGYoIiAlMTRsZiB1c2Vjcy9vcFxuIiwKIAkJICAgICAgIChkb3VibGUpcmVzdWx0X3VzZWMgLyAoZG91YmxlKWxvb3BzKTsKIAkJcHJpbnRmKCIgJTE0ZCBvcHMvc2VjXG4iLAogCQkgICAgICAgKGludCkoKGRvdWJsZSlsb29wcyAvCi0JCQkgICAgICgoZG91YmxlKXJlc3VsdF91c2VjIC8gKGRvdWJsZSkxMDAwMDAwKSkpOworCQkJICAgICAoKGRvdWJsZSlyZXN1bHRfdXNlYyAvIChkb3VibGUpVVNFQ19QRVJfU0VDKSkpOwogCQlicmVhazsKIAogCWNhc2UgQkVOQ0hfRk9STUFUX1NJTVBMRToKIAkJcHJpbnRmKCIlbHUuJTAzbHVcbiIsCiAJCSAgICAgICBkaWZmLnR2X3NlYywKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKSAoZGlmZi50dl91c2VjIC8gMTAwMCkpOworCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChkaWZmLnR2X3VzZWMgLyBVU0VDX1BFUl9NU0VDKSk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1hbm5vdGF0ZS5jIGIvdG9vbHMvcGVyZi9idWlsdGluLWFubm90YXRlLmMKaW5kZXggOWMxMDM0ZC4uZWJiNjI4MyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLWFubm90YXRlLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWFubm90YXRlLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlICJ1dGlsL3Rvb2wuaCIKICNpbmNsdWRlICJ1dGlsL2RhdGEuaCIKICNpbmNsdWRlICJhcmNoL2NvbW1vbi5oIgorI2luY2x1ZGUgInV0aWwvYmxvY2stcmFuZ2UuaCIKIAogI2luY2x1ZGUgPGRsZmNuLmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CkBAIC00Niw2ICs0NywxMDMgQEAKIAlERUNMQVJFX0JJVE1BUChjcHVfYml0bWFwLCBNQVhfTlJfQ1BVUyk7CiB9OwogCisvKgorICogR2l2ZW4gb25lIGJhc2ljIGJsb2NrOgorICoKKyAqCWZyb20JdG8JCWJyYW5jaF9pCisgKgkqIC0tLS0+ICoKKyAqCQl8CisgKgkJfCBibG9jaworICoJCXYKKyAqCQkqIC0tLS0+ICoKKyAqCQlmcm9tCXRvCWJyYW5jaF9pKzEKKyAqCisgKiB3aGVyZSB0aGUgaG9yaXpvbnRhbCBhcmUgdGhlIGJyYW5jaGVzIGFuZCB0aGUgdmVydGljYWwgaXMgdGhlIGV4ZWN1dGVkCisgKiBibG9jayBvZiBpbnN0cnVjdGlvbnMuCisgKgorICogV2UgY291bnQsIGZvciBlYWNoICdpbnN0cnVjdGlvbicsIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgY292ZXJlZCBpdCBhcworICogd2VsbCBhcyBjb3VudCB0aGUgcmF0aW8gZWFjaCBicmFuY2ggaXMgdGFrZW4uCisgKgorICogV2UgY2FuIGRvIHRoaXMgd2l0aG91dCBrbm93aW5nIHRoZSBhY3R1YWwgaW5zdHJ1Y3Rpb24gc3RyZWFtIGJ5IGtlZXBpbmcKKyAqIHRyYWNrIG9mIHRoZSBhZGRyZXNzIHJhbmdlcy4gV2UgYnJlYWsgZG93biByYW5nZXMgc3VjaCB0aGF0IHRoZXJlIGlzIG5vCisgKiBvdmVybGFwIGFuZCBpdGVyYXRlIGZyb20gdGhlIHN0YXJ0IHVudGlsIHRoZSBlbmQuCisgKgorICogQGFjbWU6IG9uY2Ugd2UgcGFyc2UgdGhlIG9iamR1bXAgb3V0cHV0IF9iZWZvcmVfIHByb2Nlc3NpbmcgdGhlIHNhbXBsZXMsCisgKiB3ZSBjYW4gZWFzaWx5IGZvbGQgdGhlIGJyYW5jaC5jeWNsZXMgSVBDIGJpdHMgaW4uCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfYmFzaWNfYmxvY2soc3RydWN0IGFkZHJfbWFwX3N5bWJvbCAqc3RhcnQsCisJCQkJc3RydWN0IGFkZHJfbWFwX3N5bWJvbCAqZW5kLAorCQkJCXN0cnVjdCBicmFuY2hfZmxhZ3MgKmZsYWdzKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IHN0YXJ0LT5zeW07CisJc3RydWN0IGFubm90YXRpb24gKm5vdGVzID0gc3ltID8gc3ltYm9sX19hbm5vdGF0aW9uKHN5bSkgOiBOVUxMOworCXN0cnVjdCBibG9ja19yYW5nZV9pdGVyIGl0ZXI7CisJc3RydWN0IGJsb2NrX3JhbmdlICplbnRyeTsKKworCS8qCisJICogU2FuaXR5OyBOVUxMIGlzbid0IGV4ZWN1dGFibGUgYW5kIHRoZSBDUFUgY2Fubm90IGV4ZWN1dGUgYmFja3dhcmRzCisJICovCisJaWYgKCFzdGFydC0+YWRkciB8fCBzdGFydC0+YWRkciA+IGVuZC0+YWRkcikKKwkJcmV0dXJuOworCisJaXRlciA9IGJsb2NrX3JhbmdlX19jcmVhdGUoc3RhcnQtPmFkZHIsIGVuZC0+YWRkcik7CisJaWYgKCFibG9ja19yYW5nZV9pdGVyX192YWxpZCgmaXRlcikpCisJCXJldHVybjsKKworCS8qCisJICogRmlyc3QgYmxvY2sgaW4gcmFuZ2UgaXMgYSBicmFuY2ggdGFyZ2V0LgorCSAqLworCWVudHJ5ID0gYmxvY2tfcmFuZ2VfaXRlcigmaXRlcik7CisJYXNzZXJ0KGVudHJ5LT5pc190YXJnZXQpOworCWVudHJ5LT5lbnRyeSsrOworCisJZG8geworCQllbnRyeSA9IGJsb2NrX3JhbmdlX2l0ZXIoJml0ZXIpOworCisJCWVudHJ5LT5jb3ZlcmFnZSsrOworCQllbnRyeS0+c3ltID0gc3ltOworCisJCWlmIChub3RlcykKKwkJCW5vdGVzLT5tYXhfY292ZXJhZ2UgPSBtYXgobm90ZXMtPm1heF9jb3ZlcmFnZSwgZW50cnktPmNvdmVyYWdlKTsKKworCX0gd2hpbGUgKGJsb2NrX3JhbmdlX2l0ZXJfX25leHQoJml0ZXIpKTsKKworCS8qCisJICogTGFzdCBibG9jayBpbiByYWdlIGlzIGEgYnJhbmNoLgorCSAqLworCWVudHJ5ID0gYmxvY2tfcmFuZ2VfaXRlcigmaXRlcik7CisJYXNzZXJ0KGVudHJ5LT5pc19icmFuY2gpOworCWVudHJ5LT50YWtlbisrOworCWlmIChmbGFncy0+cHJlZGljdGVkKQorCQllbnRyeS0+cHJlZCsrOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2JyYW5jaF9zdGFjayhzdHJ1Y3QgYnJhbmNoX3N0YWNrICpicywgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsLAorCQkJCSBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkKK3sKKwlzdHJ1Y3QgYWRkcl9tYXBfc3ltYm9sICpwcmV2ID0gTlVMTDsKKwlzdHJ1Y3QgYnJhbmNoX2luZm8gKmJpOworCWludCBpOworCisJaWYgKCFicyB8fCAhYnMtPm5yKQorCQlyZXR1cm47CisKKwliaSA9IHNhbXBsZV9fcmVzb2x2ZV9ic3RhY2soc2FtcGxlLCBhbCk7CisJaWYgKCFiaSkKKwkJcmV0dXJuOworCisJZm9yIChpID0gYnMtPm5yIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJLyoKKwkJICogWFhYIGZpbHRlciBhZ2FpbnN0IHN5bWJvbAorCQkgKi8KKwkJaWYgKHByZXYpCisJCQlwcm9jZXNzX2Jhc2ljX2Jsb2NrKHByZXYsICZiaVtpXS5mcm9tLCAmYmlbaV0uZmxhZ3MpOworCQlwcmV2ID0gJmJpW2ldLnRvOworCX0KKworCWZyZWUoYmkpOworfQorCiBzdGF0aWMgaW50IHBlcmZfZXZzZWxfX2FkZF9zYW1wbGUoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAogCQkJCSAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCiAJCQkJICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsCkBAIC03Miw2ICsxNzAsMTIgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJLyoKKwkgKiBYWFggZmlsdGVyZWQgc2FtcGxlcyBjYW4gc3RpbGwgaGF2ZSBicmFuY2ggZW50aXJlcyBwb2ludGluZyBpbnRvIG91cgorCSAqIHN5bWJvbCBhbmQgYXJlIG1pc3NlZC4KKwkgKi8KKwlwcm9jZXNzX2JyYW5jaF9zdGFjayhzYW1wbGUtPmJyYW5jaF9zdGFjaywgYWwsIHNhbXBsZSk7CisKIAlzYW1wbGUtPnBlcmlvZCA9IDE7CiAJc2FtcGxlLT53ZWlnaHQgPSAxOwogCkBAIC0yMDQsOCArMzA4LDYgQEAKIAlzdHJ1Y3QgcGVyZl9ldnNlbCAqcG9zOwogCXU2NCB0b3RhbF9ucl9zYW1wbGVzOwogCi0JbWFjaGluZXNfX3NldF9zeW1ib2xfZmlsdGVyKCZzZXNzaW9uLT5tYWNoaW5lcywgc3ltYm9sX19hbm5vdGF0ZV9pbml0KTsKLQogCWlmIChhbm4tPmNwdV9saXN0KSB7CiAJCXJldCA9IHBlcmZfc2Vzc2lvbl9fY3B1X2JpdG1hcChzZXNzaW9uLCBhbm4tPmNwdV9saXN0LAogCQkJCQkgICAgICAgYW5uLT5jcHVfYml0bWFwKTsKQEAgLTM2Nyw3ICs0NjksMTAgQEAKIAlpZiAoYW5ub3RhdGUuc2Vzc2lvbiA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAKLQlzeW1ib2xfY29uZi5wcml2X3NpemUgPSBzaXplb2Yoc3RydWN0IGFubm90YXRpb24pOworCXJldCA9IHN5bWJvbF9fYW5ub3RhdGlvbl9pbml0KCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X2RlbGV0ZTsKKwogCXN5bWJvbF9jb25mLnRyeV92bWxpbnV4X3BhdGggPSB0cnVlOwogCiAJcmV0ID0gc3ltYm9sX19pbml0KCZhbm5vdGF0ZS5zZXNzaW9uLT5oZWFkZXIuZW52KTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1kaWZmLmMgYi90b29scy9wZXJmL2J1aWx0aW4tZGlmZi5jCmluZGV4IDIxZWU3NTMuLjlmZjBkYjQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1kaWZmLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWRpZmYuYwpAQCAtMTAzMyw3ICsxMDMzLDkgQEAKIH0KIAogc3RhdGljIGludCBocHBfX2hlYWRlcihzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsIHN0cnVjdCBwZXJmX2hwcCAqaHBwLAotCQkgICAgICAgc3RydWN0IGhpc3RzICpoaXN0cyBfX21heWJlX3VudXNlZCkKKwkJICAgICAgIHN0cnVjdCBoaXN0cyAqaGlzdHMgX19tYXliZV91bnVzZWQsCisJCSAgICAgICBpbnQgbGluZSBfX21heWJlX3VudXNlZCwKKwkJICAgICAgIGludCAqc3BhbiBfX21heWJlX3VudXNlZCkKIHsKIAlzdHJ1Y3QgZGlmZl9ocHBfZm10ICpkZm10ID0KIAkJY29udGFpbmVyX29mKGZtdCwgc3RydWN0IGRpZmZfaHBwX2ZtdCwgZm10KTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1pbmplY3QuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1pbmplY3QuYwppbmRleCA3M2MxYzRjLi5iOWJjN2UzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4taW5qZWN0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWluamVjdC5jCkBAIC00MjksNyArNDI5LDcgQEAKIAlpZiAoYWwubWFwICE9IE5VTEwpIHsKIAkJaWYgKCFhbC5tYXAtPmRzby0+aGl0KSB7CiAJCQlhbC5tYXAtPmRzby0+aGl0ID0gMTsKLQkJCWlmIChtYXBfX2xvYWQoYWwubWFwLCBOVUxMKSA+PSAwKSB7CisJCQlpZiAobWFwX19sb2FkKGFsLm1hcCkgPj0gMCkgewogCQkJCWRzb19faW5qZWN0X2J1aWxkX2lkKGFsLm1hcC0+ZHNvLCB0b29sLCBtYWNoaW5lKTsKIAkJCQkvKgogCQkJCSAqIElmIHRoaXMgZmFpbHMsIHRvbyBiYWQsIGxldCB0aGUgb3RoZXIgc2lkZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWttZW0uYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1rbWVtLmMKaW5kZXggZmRkZTFiZC4uZDQyNmRjYiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLWttZW0uYworKysgYi90b29scy9wZXJmL2J1aWx0aW4ta21lbS5jCkBAIC0zMzAsNyArMzMwLDcgQEAKIAl9CiAKIAlrZXJuZWxfbWFwID0gbWFjaGluZV9fa2VybmVsX21hcChtYWNoaW5lKTsKLQlpZiAobWFwX19sb2FkKGtlcm5lbF9tYXAsIE5VTEwpIDwgMCkgeworCWlmIChtYXBfX2xvYWQoa2VybmVsX21hcCkgPCAwKSB7CiAJCXByX2VycigiY2Fubm90IGxvYWQga2VybmVsIG1hcFxuIik7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KQEAgLTk3OSw3ICs5NzksNyBAQAogCQlpZiAoaXNfY2FsbGVyKSB7CiAJCQlhZGRyID0gZGF0YS0+Y2FsbF9zaXRlOwogCQkJaWYgKCFyYXdfaXApCi0JCQkJc3ltID0gbWFjaGluZV9fZmluZF9rZXJuZWxfZnVuY3Rpb24obWFjaGluZSwgYWRkciwgJm1hcCwgTlVMTCk7CisJCQkJc3ltID0gbWFjaGluZV9fZmluZF9rZXJuZWxfZnVuY3Rpb24obWFjaGluZSwgYWRkciwgJm1hcCk7CiAJCX0gZWxzZQogCQkJYWRkciA9IGRhdGEtPnB0cjsKIApAQCAtMTA0Myw4ICsxMDQzLDcgQEAKIAkJY2hhciAqY2FsbGVyID0gYnVmOwogCiAJCWRhdGEgPSByYl9lbnRyeShuZXh0LCBzdHJ1Y3QgcGFnZV9zdGF0LCBub2RlKTsKLQkJc3ltID0gbWFjaGluZV9fZmluZF9rZXJuZWxfZnVuY3Rpb24obWFjaGluZSwgZGF0YS0+Y2FsbHNpdGUsCi0JCQkJCQkgICAgJm1hcCwgTlVMTCk7CisJCXN5bSA9IG1hY2hpbmVfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uKG1hY2hpbmUsIGRhdGEtPmNhbGxzaXRlLCAmbWFwKTsKIAkJaWYgKHN5bSAmJiBzeW0tPm5hbWUpCiAJCQljYWxsZXIgPSBzeW0tPm5hbWU7CiAJCWVsc2UKQEAgLTEwODYsOCArMTA4NSw3IEBACiAJCWNoYXIgKmNhbGxlciA9IGJ1ZjsKIAogCQlkYXRhID0gcmJfZW50cnkobmV4dCwgc3RydWN0IHBhZ2Vfc3RhdCwgbm9kZSk7Ci0JCXN5bSA9IG1hY2hpbmVfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uKG1hY2hpbmUsIGRhdGEtPmNhbGxzaXRlLAotCQkJCQkJICAgICZtYXAsIE5VTEwpOworCQlzeW0gPSBtYWNoaW5lX19maW5kX2tlcm5lbF9mdW5jdGlvbihtYWNoaW5lLCBkYXRhLT5jYWxsc2l0ZSwgJm1hcCk7CiAJCWlmIChzeW0gJiYgc3ltLT5uYW1lKQogCQkJY2FsbGVyID0gc3ltLT5uYW1lOwogCQllbHNlCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4ta3ZtLmMgYi90b29scy9wZXJmL2J1aWx0aW4ta3ZtLmMKaW5kZXggNWUyMTI3ZS4uMDhmYTg4ZiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLWt2bS5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1rdm0uYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPHN5cy90aW1lcmZkLmg+CiAjZW5kaWYKIAorI2luY2x1ZGUgPGxpbnV4L3RpbWU2NC5oPgogI2luY2x1ZGUgPHRlcm1pb3MuaD4KICNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CkBAIC0zNjIsNyArMzYzLDcgQEAKIAkJaWYgKCFza2lwX2V2ZW50KGRlY29kZSkpIHsKIAkJCXByX2luZm8oIiUiIFBSSXU2NCAiIFZNICVkLCB2Y3B1ICVkOiAlcyBldmVudCB0b29rICUiIFBSSXU2NCAidXNlY1xuIiwKIAkJCQkgc2FtcGxlLT50aW1lLCBzYW1wbGUtPnBpZCwgdmNwdV9yZWNvcmQtPnZjcHVfaWQsCi0JCQkJIGRlY29kZSwgdGltZV9kaWZmLzEwMDApOworCQkJCSBkZWNvZGUsIHRpbWVfZGlmZiAvIE5TRUNfUEVSX1VTRUMpOwogCQl9CiAJfQogCkBAIC02MDgsMTUgKzYwOSwxNSBAQAogCQlwcl9pbmZvKCIlMTBsbHUgIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyllY291bnQpOwogCQlwcl9pbmZvKCIlOC4yZiUlICIsIChkb3VibGUpZWNvdW50IC8ga3ZtLT50b3RhbF9jb3VudCAqIDEwMCk7CiAJCXByX2luZm8oIiU4LjJmJSUgIiwgKGRvdWJsZSlldGltZSAvIGt2bS0+dG90YWxfdGltZSAqIDEwMCk7Ci0JCXByX2luZm8oIiU5LjJmdXMgIiwgKGRvdWJsZSltaW4gLyAxZTMpOwotCQlwcl9pbmZvKCIlOS4yZnVzICIsIChkb3VibGUpbWF4IC8gMWUzKTsKLQkJcHJfaW5mbygiJTkuMmZ1cyAoICstJTcuMmYlJSApIiwgKGRvdWJsZSlldGltZSAvIGVjb3VudC8xZTMsCisJCXByX2luZm8oIiU5LjJmdXMgIiwgKGRvdWJsZSltaW4gLyBOU0VDX1BFUl9VU0VDKTsKKwkJcHJfaW5mbygiJTkuMmZ1cyAiLCAoZG91YmxlKW1heCAvIE5TRUNfUEVSX1VTRUMpOworCQlwcl9pbmZvKCIlOS4yZnVzICggKy0lNy4yZiUlICkiLCAoZG91YmxlKWV0aW1lIC8gZWNvdW50IC8gTlNFQ19QRVJfVVNFQywKIAkJCWt2bV9ldmVudF9yZWxfc3RkZGV2KHZjcHUsIGV2ZW50KSk7CiAJCXByX2luZm8oIlxuIik7CiAJfQogCiAJcHJfaW5mbygiXG5Ub3RhbCBTYW1wbGVzOiUiIFBSSXU2NCAiLCBUb3RhbCBldmVudHMgaGFuZGxlZCB0aW1lOiUuMmZ1cy5cblxuIiwKLQkJa3ZtLT50b3RhbF9jb3VudCwga3ZtLT50b3RhbF90aW1lIC8gMWUzKTsKKwkJa3ZtLT50b3RhbF9jb3VudCwga3ZtLT50b3RhbF90aW1lIC8gKGRvdWJsZSlOU0VDX1BFUl9VU0VDKTsKIAogCWlmIChrdm0tPmxvc3RfZXZlbnRzKQogCQlwcl9pbmZvKCJcbkxvc3QgZXZlbnRzOiAlIiBQUkl1NjQgIlxuXG4iLCBrdm0tPmxvc3RfZXZlbnRzKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1tZW0uYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1tZW0uYwppbmRleCBkNjA4YTJjLi5kMWNlMjliIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tbWVtLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLW1lbS5jCkBAIC04OCw2ICs4OCw5IEBACiAJaWYgKG1lbS0+b3BlcmF0aW9uICYgTUVNX09QRVJBVElPTl9MT0FEKQogCQlwZXJmX21lbV9ldmVudHNbUEVSRl9NRU1fRVZFTlRTX19MT0FEXS5yZWNvcmQgPSB0cnVlOwogCisJaWYgKG1lbS0+b3BlcmF0aW9uICYgTUVNX09QRVJBVElPTl9TVE9SRSkKKwkJcGVyZl9tZW1fZXZlbnRzW1BFUkZfTUVNX0VWRU5UU19fU1RPUkVdLnJlY29yZCA9IHRydWU7CisKIAlpZiAocGVyZl9tZW1fZXZlbnRzW1BFUkZfTUVNX0VWRU5UU19fTE9BRF0ucmVjb3JkKQogCQlyZWNfYXJndltpKytdID0gIi1XIjsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXByb2JlLmMgYi90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYwppbmRleCBlZTViNDIxLi5mODc5OTZiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYwpAQCAtMzI2LDYgKzMyNiwxMSBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9jbGVhbnVwOwogCisJaWYgKHBhcmFtcy5jb21tYW5kID09ICdEJykgewkvKiBpdCBzaG93cyBkZWZpbml0aW9uICovCisJCXJldCA9IHNob3dfcHJvYmVfdHJhY2VfZXZlbnRzKHBldnMsIG5wZXZzKTsKKwkJZ290byBvdXRfY2xlYW51cDsKKwl9CisKIAlyZXQgPSBhcHBseV9wZXJmX3Byb2JlX2V2ZW50cyhwZXZzLCBucGV2cyk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X2NsZWFudXA7CkBAIC00NTQsNiArNDU5LDE0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIEhBVkVfRFdBUkZfU1VQUE9SVAorI2RlZmluZSBQUk9CRURFRl9TVFIJXAorCSJbRVZFTlQ9XUZVTkNbQFNSQ11bK09GRnwlcmV0dXJufDpSTHw7UFRdfFNSQzpBTHxTUkM7UFQgW1tOQU1FPV1BUkcgLi4uXSIKKyNlbHNlCisjZGVmaW5lIFBST0JFREVGX1NUUgkiW0VWRU5UPV1GVU5DWytPRkZ8JXJldHVybl0gW1tOQU1FPV1BUkcgLi4uXSIKKyNlbmRpZgorCisKIHN0YXRpYyBpbnQKIF9fY21kX3Byb2JlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4IF9fbWF5YmVfdW51c2VkKQogewpAQCAtNDc5LDEzICs0OTIsNyBAQAogCQkJICAgICBvcHRfc2V0X2ZpbHRlcl93aXRoX2NvbW1hbmQsIERFRkFVTFRfTElTVF9GSUxURVIpLAogCU9QVF9DQUxMQkFDSygnZCcsICJkZWwiLCBOVUxMLCAiW0dST1VQOl1FVkVOVCIsICJkZWxldGUgYSBwcm9iZSBldmVudC4iLAogCQkgICAgIG9wdF9zZXRfZmlsdGVyX3dpdGhfY29tbWFuZCksCi0JT1BUX0NBTExCQUNLKCdhJywgImFkZCIsIE5VTEwsCi0jaWZkZWYgSEFWRV9EV0FSRl9TVVBQT1JUCi0JCSJbRVZFTlQ9XUZVTkNbQFNSQ11bK09GRnwlcmV0dXJufDpSTHw7UFRdfFNSQzpBTHxTUkM7UFQiCi0JCSIgW1tOQU1FPV1BUkcgLi4uXSIsCi0jZWxzZQotCQkiW0VWRU5UPV1GVU5DWytPRkZ8JXJldHVybl0gW1tOQU1FPV1BUkcgLi4uXSIsCi0jZW5kaWYKKwlPUFRfQ0FMTEJBQ0soJ2EnLCAiYWRkIiwgTlVMTCwgUFJPQkVERUZfU1RSLAogCQkicHJvYmUgcG9pbnQgZGVmaW5pdGlvbiwgd2hlcmVcbiIKIAkJIlx0XHRHUk9VUDpcdEdyb3VwIG5hbWUgKG9wdGlvbmFsKVxuIgogCQkiXHRcdEVWRU5UOlx0RXZlbnQgbmFtZVxuIgpAQCAtNTAzLDYgKzUxMCw5IEBACiAJCSJcdFx0QVJHOlx0UHJvYmUgYXJndW1lbnQgKGtwcm9iZS10cmFjZXIgYXJndW1lbnQgZm9ybWF0LilcbiIsCiAjZW5kaWYKIAkJb3B0X2FkZF9wcm9iZV9ldmVudCksCisJT1BUX0NBTExCQUNLKCdEJywgImRlZmluaXRpb24iLCBOVUxMLCBQUk9CRURFRl9TVFIsCisJCSJTaG93IHRyYWNlIGV2ZW50IGRlZmluaXRpb24gb2YgZ2l2ZW4gdHJhY2VldmVudCBmb3Igay91cHJvYmVfZXZlbnRzLiIsCisJCW9wdF9hZGRfcHJvYmVfZXZlbnQpLAogCU9QVF9CT09MRUFOKCdmJywgImZvcmNlIiwgJnByb2JlX2NvbmYuZm9yY2VfYWRkLCAiZm9yY2libHkgYWRkIGV2ZW50cyIKIAkJICAgICIgd2l0aCBleGlzdGluZyBuYW1lIiksCiAJT1BUX0NBTExCQUNLKCdMJywgImxpbmUiLCBOVUxMLApAQCAtNTQ4LDYgKzU1OCw3IEBACiAKIAlzZXRfb3B0aW9uX2ZsYWcob3B0aW9ucywgJ2EnLCAiYWRkIiwgUEFSU0VfT1BUX0VYQ0xVU0lWRSk7CiAJc2V0X29wdGlvbl9mbGFnKG9wdGlvbnMsICdkJywgImRlbCIsIFBBUlNFX09QVF9FWENMVVNJVkUpOworCXNldF9vcHRpb25fZmxhZyhvcHRpb25zLCAnRCcsICJkZWZpbml0aW9uIiwgUEFSU0VfT1BUX0VYQ0xVU0lWRSk7CiAJc2V0X29wdGlvbl9mbGFnKG9wdGlvbnMsICdsJywgImxpc3QiLCBQQVJTRV9PUFRfRVhDTFVTSVZFKTsKICNpZmRlZiBIQVZFX0RXQVJGX1NVUFBPUlQKIAlzZXRfb3B0aW9uX2ZsYWcob3B0aW9ucywgJ0wnLCAibGluZSIsIFBBUlNFX09QVF9FWENMVVNJVkUpOwpAQCAtNjAwLDYgKzYxMSwxNCBAQAogCSAqLwogCXN5bWJvbF9jb25mLnRyeV92bWxpbnV4X3BhdGggPSAoc3ltYm9sX2NvbmYudm1saW51eF9uYW1lID09IE5VTEwpOwogCisJLyoKKwkgKiBFeGNlcHQgZm9yIC0tbGlzdCwgLS1kZWwgYW5kIC0tYWRkLCBvdGhlciBjb21tYW5kIGRvZXNuJ3QgZGVwZW5kCisJICogbm9yIGNoYW5nZSBydW5uaW5nIGtlcm5lbC4gU28gaWYgdXNlciBnaXZlcyBvZmZsaW5lIHZtbGludXgsCisJICogaWdub3JlIGl0cyBidWlsZGlkLgorCSAqLworCWlmICghc3RyY2hyKCJsZGEiLCBwYXJhbXMuY29tbWFuZCkgJiYgc3ltYm9sX2NvbmYudm1saW51eF9uYW1lKQorCQlzeW1ib2xfY29uZi5pZ25vcmVfdm1saW51eF9idWlsZGlkID0gdHJ1ZTsKKwogCXN3aXRjaCAocGFyYW1zLmNvbW1hbmQpIHsKIAljYXNlICdsJzoKIAkJaWYgKHBhcmFtcy51cHJvYmVzKSB7CkBAIC02NDMsNyArNjYyLDkgQEAKIAkJCXJldHVybiByZXQ7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSAnRCc6CiAJY2FzZSAnYSc6CisKIAkJLyogRW5zdXJlIHRoZSBsYXN0IGdpdmVuIHRhcmdldCBpcyB1c2VkICovCiAJCWlmIChwYXJhbXMudGFyZ2V0ICYmICFwYXJhbXMudGFyZ2V0X3VzZWQpIHsKIAkJCXByX2VycigiICBFcnJvcjogLXgvLW0gbXVzdCBmb2xsb3cgdGhlIHByb2JlIGRlZmluaXRpb25zLlxuIik7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMgYi90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKaW5kZXggNjM1NTkwMi4uNjdkMmE5MCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgInV0aWwvZXZsaXN0LmgiCiAjaW5jbHVkZSAidXRpbC9ldnNlbC5oIgogI2luY2x1ZGUgInV0aWwvZGVidWcuaCIKKyNpbmNsdWRlICJ1dGlsL2Rydl9jb25maWdzLmgiCiAjaW5jbHVkZSAidXRpbC9zZXNzaW9uLmgiCiAjaW5jbHVkZSAidXRpbC90b29sLmgiCiAjaW5jbHVkZSAidXRpbC9zeW1ib2wuaCIKQEAgLTQyLDcgKzQzLDcgQEAKICNpbmNsdWRlIDxzY2hlZC5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8YXNtL2J1Zy5oPgotCisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAKIHN0cnVjdCByZWNvcmQgewogCXN0cnVjdCBwZXJmX3Rvb2wJdG9vbDsKQEAgLTk2LDcgKzk3LDcgQEAKIAkqc3RhcnQgPSBoZWFkOwogCXdoaWxlICh0cnVlKSB7CiAJCWlmIChldnRfaGVhZCAtIGhlYWQgPj0gKHVuc2lnbmVkIGludClzaXplKSB7Ci0JCQlwcl9kZWJ1ZygiRmluc2hlZCByZWFkaW5nIGJhY2t3YXJkIHJpbmcgYnVmZmVyOiByZXdpbmRcbiIpOworCQkJcHJfZGVidWcoIkZpbmlzaGVkIHJlYWRpbmcgYmFja3dhcmQgcmluZyBidWZmZXI6IHJld2luZFxuIik7CiAJCQlpZiAoZXZ0X2hlYWQgLSBoZWFkID4gKHVuc2lnbmVkIGludClzaXplKQogCQkJCWV2dF9oZWFkIC09IHBoZWFkZXItPnNpemU7CiAJCQkqZW5kID0gZXZ0X2hlYWQ7CkBAIC0xMDYsNyArMTA3LDcgQEAKIAkJcGhlYWRlciA9IChzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgKikoYnVmICsgKGV2dF9oZWFkICYgbWFzaykpOwogCiAJCWlmIChwaGVhZGVyLT5zaXplID09IDApIHsKLQkJCXByX2RlYnVnKCJGaW5zaGVkIHJlYWRpbmcgYmFja3dhcmQgcmluZyBidWZmZXI6IGdldCBzdGFydFxuIik7CisJCQlwcl9kZWJ1ZygiRmluaXNoZWQgcmVhZGluZyBiYWNrd2FyZCByaW5nIGJ1ZmZlcjogZ2V0IHN0YXJ0XG4iKTsKIAkJCSplbmQgPSBldnRfaGVhZDsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0zODMsNiArMzg0LDcgQEAKIAlzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCA9IHJlYy0+ZXZsaXN0OwogCXN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24gPSByZWMtPnNlc3Npb247CiAJc3RydWN0IHJlY29yZF9vcHRzICpvcHRzID0gJnJlYy0+b3B0czsKKwlzdHJ1Y3QgcGVyZl9ldnNlbF9jb25maWdfdGVybSAqZXJyX3Rlcm07CiAJaW50IHJjID0gMDsKIAogCXBlcmZfZXZsaXN0X19jb25maWcoZXZsaXN0LCBvcHRzLCAmY2FsbGNoYWluX3BhcmFtKTsKQEAgLTQxMiw2ICs0MTQsMTQgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJaWYgKHBlcmZfZXZsaXN0X19hcHBseV9kcnZfY29uZmlncyhldmxpc3QsICZwb3MsICZlcnJfdGVybSkpIHsKKwkJZXJyb3IoImZhaWxlZCB0byBzZXQgY29uZmlnIFwiJXNcIiBvbiBldmVudCAlcyB3aXRoICVkICglcylcbiIsCisJCSAgICAgIGVycl90ZXJtLT52YWwuZHJ2X2NmZywgcGVyZl9ldnNlbF9fbmFtZShwb3MpLCBlcnJubywKKwkJICAgICAgc3RyX2Vycm9yX3IoZXJybm8sIG1zZywgc2l6ZW9mKG1zZykpKTsKKwkJcmMgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCiAJcmMgPSByZWNvcmRfX21tYXAocmVjKTsKIAlpZiAocmMpCiAJCWdvdG8gb3V0OwpAQCAtOTU0LDcgKzk2NCw3IEBACiAJfQogCiAJaWYgKG9wdHMtPmluaXRpYWxfZGVsYXkpIHsKLQkJdXNsZWVwKG9wdHMtPmluaXRpYWxfZGVsYXkgKiAxMDAwKTsKKwkJdXNsZWVwKG9wdHMtPmluaXRpYWxfZGVsYXkgKiBVU0VDX1BFUl9NU0VDKTsKIAkJcGVyZl9ldmxpc3RfX2VuYWJsZShyZWMtPmV2bGlzdCk7CiAJfQogCkBAIC0xNTYzLDI5ICsxNTczLDM5IEBACiAJaWYgKCFyZWMtPml0cikgewogCQlyZWMtPml0ciA9IGF1eHRyYWNlX3JlY29yZF9faW5pdChyZWMtPmV2bGlzdCwgJmVycik7CiAJCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOworCQkJZ290byBvdXQ7CiAJfQogCiAJZXJyID0gYXV4dHJhY2VfcGFyc2Vfc25hcHNob3Rfb3B0aW9ucyhyZWMtPml0ciwgJnJlYy0+b3B0cywKIAkJCQkJICAgICAgcmVjLT5vcHRzLmF1eHRyYWNlX3NuYXBzaG90X29wdHMpOwogCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBBbGxvdyBhbGlhc2VzIHRvIGZhY2lsaXRhdGUgdGhlIGxvb2t1cCBvZiBzeW1ib2xzIGZvciBhZGRyZXNzCisJICogZmlsdGVycy4gUmVmZXIgdG8gYXV4dHJhY2VfcGFyc2VfZmlsdGVycygpLgorCSAqLworCXN5bWJvbF9jb25mLmFsbG93X2FsaWFzZXMgPSB0cnVlOworCisJc3ltYm9sX19pbml0KE5VTEwpOworCisJZXJyID0gYXV4dHJhY2VfcGFyc2VfZmlsdGVycyhyZWMtPmV2bGlzdCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CiAKIAlpZiAoZHJ5X3J1bikKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCiAJZXJyID0gYnBmX19zZXR1cF9zdGRvdXQocmVjLT5ldmxpc3QpOwogCWlmIChlcnIpIHsKIAkJYnBmX19zdHJlcnJvcl9zZXR1cF9zdGRvdXQocmVjLT5ldmxpc3QsIGVyciwgZXJyYnVmLCBzaXplb2YoZXJyYnVmKSk7CiAJCXByX2VycigiRVJST1I6IFNldHVwIEJQRiBzdGRvdXQgZmFpbGVkOiAlc1xuIiwKIAkJCSBlcnJidWYpOwotCQlyZXR1cm4gZXJyOworCQlnb3RvIG91dDsKIAl9CiAKIAllcnIgPSAtRU5PTUVNOwogCi0Jc3ltYm9sX19pbml0KE5VTEwpOwotCiAJaWYgKHN5bWJvbF9jb25mLmtwdHJfcmVzdHJpY3QpCiAJCXByX3dhcm5pbmcoCiAiV0FSTklORzogS2VybmVsIGFkZHJlc3MgbWFwcyAoL3Byb2Mve2thbGxzeW1zLG1vZHVsZXN9KSBhcmUgcmVzdHJpY3RlZCxcbiIKQEAgLTE2MzMsNyArMTY1Myw3IEBACiAJaWYgKHJlYy0+ZXZsaXN0LT5ucl9lbnRyaWVzID09IDAgJiYKIAkgICAgcGVyZl9ldmxpc3RfX2FkZF9kZWZhdWx0KHJlYy0+ZXZsaXN0KSA8IDApIHsKIAkJcHJfZXJyKCJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgZXZlbnQgc2VsZWN0b3IgbGlzdFxuIik7Ci0JCWdvdG8gb3V0X3N5bWJvbF9leGl0OworCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAocmVjLT5vcHRzLnRhcmdldC50aWQgJiYgIXJlYy0+b3B0cy5ub19pbmhlcml0X3NldCkKQEAgLTE2NTMsNyArMTY3Myw3IEBACiAJCXVpX19lcnJvcigiJXMiLCBlcnJidWYpOwogCiAJCWVyciA9IC1zYXZlZF9lcnJubzsKLQkJZ290byBvdXRfc3ltYm9sX2V4aXQ7CisJCWdvdG8gb3V0OwogCX0KIAogCWVyciA9IC1FTk9NRU07CkBAIC0xNjYyLDcgKzE2ODIsNyBAQAogCiAJZXJyID0gYXV4dHJhY2VfcmVjb3JkX19vcHRpb25zKHJlYy0+aXRyLCByZWMtPmV2bGlzdCwgJnJlYy0+b3B0cyk7CiAJaWYgKGVycikKLQkJZ290byBvdXRfc3ltYm9sX2V4aXQ7CisJCWdvdG8gb3V0OwogCiAJLyoKIAkgKiBXZSB0YWtlIGFsbCBidWlsZGlkcyB3aGVuIHRoZSBmaWxlIGNvbnRhaW5zCkBAIC0xNjc0LDExICsxNjk0LDExIEBACiAKIAlpZiAocmVjb3JkX29wdHNfX2NvbmZpZygmcmVjLT5vcHRzKSkgewogCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9zeW1ib2xfZXhpdDsKKwkJZ290byBvdXQ7CiAJfQogCiAJZXJyID0gX19jbWRfcmVjb3JkKCZyZWNvcmQsIGFyZ2MsIGFyZ3YpOwotb3V0X3N5bWJvbF9leGl0Ogorb3V0OgogCXBlcmZfZXZsaXN0X19kZWxldGUocmVjLT5ldmxpc3QpOwogCXN5bWJvbF9fZXhpdCgpOwogCWF1eHRyYWNlX3JlY29yZF9fZnJlZShyZWMtPml0cik7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMKaW5kZXggOTQ5ZTVhMS4uNmU4ODQ2MCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXJlcG9ydC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZXBvcnQuYwpAQCAtODksNiArODksMTAgQEAKIAkJcmVwLT5xdWV1ZV9zaXplID0gcGVyZl9jb25maWdfdTY0KHZhciwgdmFsdWUpOwogCQlyZXR1cm4gMDsKIAl9CisJaWYgKCFzdHJjbXAodmFyLCAicmVwb3J0LnNvcnRfb3JkZXIiKSkgeworCQlkZWZhdWx0X3NvcnRfb3JkZXIgPSBzdHJkdXAodmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTkzMSw3ICs5MzUsNiBAQAogCiAJaWYgKHN5bWJvbF9jb25mLnJlcG9ydF9oaWVyYXJjaHkpIHsKIAkJLyogZGlzYWJsZSBpbmNvbXBhdGlibGUgb3B0aW9ucyAqLwotCQlzeW1ib2xfY29uZi5ldmVudF9ncm91cCA9IGZhbHNlOwogCQlzeW1ib2xfY29uZi5jdW11bGF0ZV9jYWxsY2hhaW4gPSBmYWxzZTsKIAogCQlpZiAoZmllbGRfb3JkZXIpIHsKQEAgLTk4MCw5ICs5ODMsOSBAQAogCSAqIGltcGxlbWVudGF0aW9uLgogCSAqLwogCWlmICh1aV9faGFzX2Fubm90YXRpb24oKSkgewotCQlzeW1ib2xfY29uZi5wcml2X3NpemUgPSBzaXplb2Yoc3RydWN0IGFubm90YXRpb24pOwotCQltYWNoaW5lc19fc2V0X3N5bWJvbF9maWx0ZXIoJnNlc3Npb24tPm1hY2hpbmVzLAotCQkJCQkgICAgc3ltYm9sX19hbm5vdGF0ZV9pbml0KTsKKwkJcmV0ID0gc3ltYm9sX19hbm5vdGF0aW9uX2luaXQoKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yOwogCQkvKgogIAkJICogRm9yIHNlYXJjaGluZyBieSBuYW1lIG9uIHRoZSAiQnJvd3NlIG1hcCBkZXRhaWxzIi4KICAJCSAqIHByb3ZpZGluZyBpdCBvbmx5IGluIHZlcmJvc2UgbW9kZSBub3QgdG8gYmxvYXQgdG9vCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jCmluZGV4IDBkZmU4ZGYuLmY1NTAzY2EgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxhcGkvZnMvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KIAogI2RlZmluZSBQUl9TRVRfTkFNRQkJMTUgICAgICAgICAgICAgICAvKiBTZXQgcHJvY2VzcyBuYW1lICovCiAjZGVmaW5lIE1BWF9DUFVTCQk0MDk2CkBAIC0xOTksNyArMjAwLDcgQEAKIAogCWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOwogCi0JcmV0dXJuIHRzLnR2X3NlYyAqIDEwMDAwMDAwMDBVTEwgKyB0cy50dl9uc2VjOworCXJldHVybiB0cy50dl9zZWMgKiBOU0VDX1BFUl9TRUMgKyB0cy50dl9uc2VjOwogfQogCiBzdGF0aWMgdm9pZCBidXJuX25zZWNzKHN0cnVjdCBwZXJmX3NjaGVkICpzY2hlZCwgdTY0IG5zZWNzKQpAQCAtMjIzLDcgKzIyNCw3IEBACiAKIHN0YXRpYyB2b2lkIGNhbGlicmF0ZV9ydW5fbWVhc3VyZW1lbnRfb3ZlcmhlYWQoc3RydWN0IHBlcmZfc2NoZWQgKnNjaGVkKQogewotCXU2NCBUMCwgVDEsIGRlbHRhLCBtaW5fZGVsdGEgPSAxMDAwMDAwMDAwVUxMOworCXU2NCBUMCwgVDEsIGRlbHRhLCBtaW5fZGVsdGEgPSBOU0VDX1BFUl9TRUM7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewpAQCAtMjQwLDcgKzI0MSw3IEBACiAKIHN0YXRpYyB2b2lkIGNhbGlicmF0ZV9zbGVlcF9tZWFzdXJlbWVudF9vdmVyaGVhZChzdHJ1Y3QgcGVyZl9zY2hlZCAqc2NoZWQpCiB7Ci0JdTY0IFQwLCBUMSwgZGVsdGEsIG1pbl9kZWx0YSA9IDEwMDAwMDAwMDBVTEw7CisJdTY0IFQwLCBUMSwgZGVsdGEsIG1pbl9kZWx0YSA9IE5TRUNfUEVSX1NFQzsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CkBAIC00NTIsOCArNDUzLDggQEAKIAllcnIgPSBnZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZydSk7CiAJQlVHX09OKGVycik7CiAKLQlzdW0gPSAgcnUucnVfdXRpbWUudHZfc2VjKjFlOSArIHJ1LnJ1X3V0aW1lLnR2X3VzZWMqMWUzOwotCXN1bSArPSBydS5ydV9zdGltZS50dl9zZWMqMWU5ICsgcnUucnVfc3RpbWUudHZfdXNlYyoxZTM7CisJc3VtID0gIHJ1LnJ1X3V0aW1lLnR2X3NlYyAqIE5TRUNfUEVSX1NFQyArIHJ1LnJ1X3V0aW1lLnR2X3VzZWMgKiBOU0VDX1BFUl9VU0VDOworCXN1bSArPSBydS5ydV9zdGltZS50dl9zZWMgKiBOU0VDX1BFUl9TRUMgKyBydS5ydV9zdGltZS50dl91c2VjICogTlNFQ19QRVJfVVNFQzsKIAogCXJldHVybiBzdW07CiB9CkBAIC02NjcsMTIgKzY2OCwxMiBAQAogCQlzY2hlZC0+cnVuX2F2ZyA9IGRlbHRhOwogCXNjaGVkLT5ydW5fYXZnID0gKHNjaGVkLT5ydW5fYXZnICogKHNjaGVkLT5yZXBsYXlfcmVwZWF0IC0gMSkgKyBkZWx0YSkgLyBzY2hlZC0+cmVwbGF5X3JlcGVhdDsKIAotCXByaW50ZigiIyUtM2xkOiAlMC4zZiwgIiwgc2NoZWQtPm5yX3J1bnMsIChkb3VibGUpZGVsdGEgLyAxMDAwMDAwLjApOworCXByaW50ZigiIyUtM2xkOiAlMC4zZiwgIiwgc2NoZWQtPm5yX3J1bnMsIChkb3VibGUpZGVsdGEgLyBOU0VDX1BFUl9NU0VDKTsKIAotCXByaW50ZigicmF2ZzogJTAuMmYsICIsIChkb3VibGUpc2NoZWQtPnJ1bl9hdmcgLyAxZTYpOworCXByaW50ZigicmF2ZzogJTAuMmYsICIsIChkb3VibGUpc2NoZWQtPnJ1bl9hdmcgLyBOU0VDX1BFUl9NU0VDKTsKIAogCXByaW50ZigiY3B1OiAlMC4yZiAvICUwLjJmIiwKLQkJKGRvdWJsZSlzY2hlZC0+Y3B1X3VzYWdlIC8gMWU2LCAoZG91YmxlKXNjaGVkLT5ydW5hdmdfY3B1X3VzYWdlIC8gMWU2KTsKKwkJKGRvdWJsZSlzY2hlZC0+Y3B1X3VzYWdlIC8gTlNFQ19QRVJfTVNFQywgKGRvdWJsZSlzY2hlZC0+cnVuYXZnX2NwdV91c2FnZSAvIE5TRUNfUEVSX01TRUMpOwogCiAjaWYgMAogCS8qCkBAIC02ODAsOCArNjgxLDggQEAKIAkgKiBhY2N1cmF0ZSB0aGFuIHRoZSBzY2hlZC0+c3VtX2V4ZWNfcnVudGltZSBiYXNlZCBzdGF0aXN0aWNzOgogCSAqLwogCXByaW50ZigiIFslMC4yZiAvICUwLjJmXSIsCi0JCShkb3VibGUpc2NoZWQtPnBhcmVudF9jcHVfdXNhZ2UvMWU2LAotCQkoZG91YmxlKXNjaGVkLT5ydW5hdmdfcGFyZW50X2NwdV91c2FnZS8xZTYpOworCQkoZG91YmxlKXNjaGVkLT5wYXJlbnRfY3B1X3VzYWdlIC8gTlNFQ19QRVJfTVNFQywKKwkJKGRvdWJsZSlzY2hlZC0+cnVuYXZnX3BhcmVudF9jcHVfdXNhZ2UgLyBOU0VDX1BFUl9NU0VDKTsKICNlbmRpZgogCiAJcHJpbnRmKCJcbiIpOwpAQCAtNjk2LDEzICs2OTcsMTMgQEAKIAl1NjQgVDAsIFQxOwogCiAJVDAgPSBnZXRfbnNlY3MoKTsKLQlidXJuX25zZWNzKHNjaGVkLCAxZTYpOworCWJ1cm5fbnNlY3Moc2NoZWQsIE5TRUNfUEVSX01TRUMpOwogCVQxID0gZ2V0X25zZWNzKCk7CiAKIAlwcmludGYoInRoZSBydW4gdGVzdCB0b29rICUiIFBSSXU2NCAiIG5zZWNzXG4iLCBUMSAtIFQwKTsKIAogCVQwID0gZ2V0X25zZWNzKCk7Ci0Jc2xlZXBfbnNlY3MoMWU2KTsKKwlzbGVlcF9uc2VjcyhOU0VDX1BFUl9NU0VDKTsKIAlUMSA9IGdldF9uc2VjcygpOwogCiAJcHJpbnRmKCJ0aGUgc2xlZXAgdGVzdCB0b29rICUiIFBSSXU2NCAiIG5zZWNzXG4iLCBUMSAtIFQwKTsKQEAgLTEyMTMsMTAgKzEyMTQsMTAgQEAKIAlhdmcgPSB3b3JrX2xpc3QtPnRvdGFsX2xhdCAvIHdvcmtfbGlzdC0+bmJfYXRvbXM7CiAKIAlwcmludGYoInwlMTEuM2YgbXMgfCU5IiBQUkl1NjQgIiB8IGF2ZzolOS4zZiBtcyB8IG1heDolOS4zZiBtcyB8IG1heCBhdDogJTEzLjZmIHNcbiIsCi0JICAgICAgKGRvdWJsZSl3b3JrX2xpc3QtPnRvdGFsX3J1bnRpbWUgLyAxZTYsCi0JCSB3b3JrX2xpc3QtPm5iX2F0b21zLCAoZG91YmxlKWF2ZyAvIDFlNiwKLQkJIChkb3VibGUpd29ya19saXN0LT5tYXhfbGF0IC8gMWU2LAotCQkgKGRvdWJsZSl3b3JrX2xpc3QtPm1heF9sYXRfYXQgLyAxZTkpOworCSAgICAgIChkb3VibGUpd29ya19saXN0LT50b3RhbF9ydW50aW1lIC8gTlNFQ19QRVJfTVNFQywKKwkJIHdvcmtfbGlzdC0+bmJfYXRvbXMsIChkb3VibGUpYXZnIC8gTlNFQ19QRVJfTVNFQywKKwkJIChkb3VibGUpd29ya19saXN0LT5tYXhfbGF0IC8gTlNFQ19QRVJfTVNFQywKKwkJIChkb3VibGUpd29ya19saXN0LT5tYXhfbGF0X2F0IC8gTlNFQ19QRVJfU0VDKTsKIH0KIAogc3RhdGljIGludCBwaWRfY21wKHN0cnVjdCB3b3JrX2F0b21zICpsLCBzdHJ1Y3Qgd29ya19hdG9tcyAqcikKQEAgLTE0OTEsNyArMTQ5Miw3IEBACiAJaWYgKHNjaGVkLT5tYXAuY3B1cyAmJiAhY3B1X21hcF9faGFzKHNjaGVkLT5tYXAuY3B1cywgdGhpc19jcHUpKQogCQlnb3RvIG91dDsKIAotCWNvbG9yX2ZwcmludGYoc3Rkb3V0LCBjb2xvciwgIiAgJTEyLjZmIHNlY3MgIiwgKGRvdWJsZSl0aW1lc3RhbXAvMWU5KTsKKwljb2xvcl9mcHJpbnRmKHN0ZG91dCwgY29sb3IsICIgICUxMi42ZiBzZWNzICIsIChkb3VibGUpdGltZXN0YW1wIC8gTlNFQ19QRVJfU0VDKTsKIAlpZiAobmV3X3Nob3J0bmFtZSkgewogCQljb25zdCBjaGFyICpwaWRfY29sb3IgPSBjb2xvcjsKIApAQCAtMTc1Myw3ICsxNzU0LDcgQEAKIAogCXByaW50ZigiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAlwcmludGYoIiAgVE9UQUw6ICAgICAgICAgICAgICAgIHwlMTEuM2YgbXMgfCU5IiBQUkl1NjQgIiB8XG4iLAotCQkoZG91YmxlKXNjaGVkLT5hbGxfcnVudGltZSAvIDFlNiwgc2NoZWQtPmFsbF9jb3VudCk7CisJCShkb3VibGUpc2NoZWQtPmFsbF9ydW50aW1lIC8gTlNFQ19QRVJfTVNFQywgc2NoZWQtPmFsbF9jb3VudCk7CiAKIAlwcmludGYoIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tc2NyaXB0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tc2NyaXB0LmMKaW5kZXggOWM2NDBhOC4uNzIyOGQxNCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXNjcmlwdC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY3JpcHQuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgInV0aWwvdGhyZWFkLXN0YWNrLmgiCiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAjaW5jbHVkZSAiYXNtL2J1Zy5oIgogI2luY2x1ZGUgInV0aWwvbWVtLWV2ZW50cy5oIgogCkBAIC0zNzEsMTQgKzM3MiwxNiBAQAogCiAJaWYgKCFub19jYWxsY2hhaW4pIHsKIAkJYm9vbCB1c2VfY2FsbGNoYWluID0gZmFsc2U7CisJCWJvb2wgbm90X3BpcGUgPSBmYWxzZTsKIAogCQlldmxpc3RfX2Zvcl9lYWNoX2VudHJ5KHNlc3Npb24tPmV2bGlzdCwgZXZzZWwpIHsKKwkJCW5vdF9waXBlID0gdHJ1ZTsKIAkJCWlmIChldnNlbC0+YXR0ci5zYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0NBTExDSEFJTikgewogCQkJCXVzZV9jYWxsY2hhaW4gPSB0cnVlOwogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCWlmICghdXNlX2NhbGxjaGFpbikKKwkJaWYgKG5vdF9waXBlICYmICF1c2VfY2FsbGNoYWluKQogCQkJc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbiA9IGZhbHNlOwogCX0KIApAQCAtNDYyLDkgKzQ2NSw5IEBACiAKIAlpZiAoUFJJTlRfRklFTEQoVElNRSkpIHsKIAkJbnNlY3MgPSBzYW1wbGUtPnRpbWU7Ci0JCXNlY3MgPSBuc2VjcyAvIE5TRUNTX1BFUl9TRUM7Ci0JCW5zZWNzIC09IHNlY3MgKiBOU0VDU19QRVJfU0VDOwotCQl1c2VjcyA9IG5zZWNzIC8gTlNFQ1NfUEVSX1VTRUM7CisJCXNlY3MgPSBuc2VjcyAvIE5TRUNfUEVSX1NFQzsKKwkJbnNlY3MgLT0gc2VjcyAqIE5TRUNfUEVSX1NFQzsKKwkJdXNlY3MgPSBuc2VjcyAvIE5TRUNfUEVSX1VTRUM7CiAJCWlmIChuYW5vc2VjcykKIAkJCXByaW50ZigiJTVsdS4lMDlsbHU6ICIsIHNlY3MsIG5zZWNzKTsKIAkJZWxzZQpAQCAtNTE5LDExICs1MjIsMTEgQEAKIAogCQl0aHJlYWRfX2ZpbmRfYWRkcl9tYXAodGhyZWFkLCBzYW1wbGUtPmNwdW1vZGUsIE1BUF9fRlVOQ1RJT04sIGZyb20sICZhbGYpOwogCQlpZiAoYWxmLm1hcCkKLQkJCWFsZi5zeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGFsZi5tYXAsIGFsZi5hZGRyLCBOVUxMKTsKKwkJCWFsZi5zeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGFsZi5tYXAsIGFsZi5hZGRyKTsKIAogCQl0aHJlYWRfX2ZpbmRfYWRkcl9tYXAodGhyZWFkLCBzYW1wbGUtPmNwdW1vZGUsIE1BUF9fRlVOQ1RJT04sIHRvLCAmYWx0KTsKIAkJaWYgKGFsdC5tYXApCi0JCQlhbHQuc3ltID0gbWFwX19maW5kX3N5bWJvbChhbHQubWFwLCBhbHQuYWRkciwgTlVMTCk7CisJCQlhbHQuc3ltID0gbWFwX19maW5kX3N5bWJvbChhbHQubWFwLCBhbHQuYWRkcik7CiAKIAkJc3ltYm9sX19mcHJpbnRmX3N5bW5hbWVfb2ZmcyhhbGYuc3ltLCAmYWxmLCBzdGRvdXQpOwogCQlwdXRjaGFyKCcvJyk7CkBAIC0xNjkwLDggKzE2OTMsMTMgQEAKIAlzbnByaW50ZihzY3JpcHRzX3BhdGgsIE1BWFBBVEhMRU4sICIlcy9zY3JpcHRzIiwgZ2V0X2FyZ3ZfZXhlY19wYXRoKCkpOwogCiAJc2NyaXB0c19kaXIgPSBvcGVuZGlyKHNjcmlwdHNfcGF0aCk7Ci0JaWYgKCFzY3JpcHRzX2RpcikKLQkJcmV0dXJuIC0xOworCWlmICghc2NyaXB0c19kaXIpIHsKKwkJZnByaW50ZihzdGRvdXQsCisJCQkib3BlbiglcykgZmFpbGVkLlxuIgorCQkJIkNoZWNrIFwiUEVSRl9FWEVDX1BBVEhcIiBlbnYgdG8gc2V0IHNjcmlwdHMgZGlyLlxuIiwKKwkJCXNjcmlwdHNfcGF0aCk7CisJCWV4aXQoLTEpOworCX0KIAogCWZvcl9lYWNoX2xhbmcoc2NyaXB0c19wYXRoLCBzY3JpcHRzX2RpciwgbGFuZ19kaXJlbnQpIHsKIAkJc25wcmludGYobGFuZ19wYXRoLCBNQVhQQVRITEVOLCAiJXMvJXMvYmluIiwgc2NyaXB0c19wYXRoLApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMKaW5kZXggM2M3NDUyYi4uNjg4ZGVhNyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSAidXRpbC9ldmxpc3QuaCIKICNpbmNsdWRlICJ1dGlsL2V2c2VsLmgiCiAjaW5jbHVkZSAidXRpbC9kZWJ1Zy5oIgorI2luY2x1ZGUgInV0aWwvZHJ2X2NvbmZpZ3MuaCIKICNpbmNsdWRlICJ1dGlsL2NvbG9yLmgiCiAjaW5jbHVkZSAidXRpbC9zdGF0LmgiCiAjaW5jbHVkZSAidXRpbC9oZWFkZXIuaCIKQEAgLTY1LDYgKzY2LDcgQEAKICNpbmNsdWRlICJ1dGlsL2dyb3VwLmgiCiAjaW5jbHVkZSAiYXNtL2J1Zy5oIgogCisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAjaW5jbHVkZSA8YXBpL2ZzL2ZzLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CkBAIC0xNzIsNyArMTc0LDcgQEAKIHsKIAlyLT50dl9zZWMgPSBhLT50dl9zZWMgLSBiLT50dl9zZWM7CiAJaWYgKGEtPnR2X25zZWMgPCBiLT50dl9uc2VjKSB7Ci0JCXItPnR2X25zZWMgPSBhLT50dl9uc2VjICsgMTAwMDAwMDAwMEwgLSBiLT50dl9uc2VjOworCQlyLT50dl9uc2VjID0gYS0+dHZfbnNlYyArIE5TRUNfUEVSX1NFQyAtIGItPnR2X25zZWM7CiAJCXItPnR2X3NlYy0tOwogCX0gZWxzZSB7CiAJCXItPnR2X25zZWMgPSBhLT50dl9uc2VjIC0gYi0+dHZfbnNlYyA7CkBAIC0zNTQsNyArMzU2LDcgQEAKIAlkaWZmX3RpbWVzcGVjKCZycywgJnRzLCAmcmVmX3RpbWUpOwogCiAJaWYgKFNUQVRfUkVDT1JEKSB7Ci0JCWlmIChXUklURV9TVEFUX1JPVU5EX0VWRU5UKHJzLnR2X3NlYyAqIE5TRUNTX1BFUl9TRUMgKyBycy50dl9uc2VjLCBJTlRFUlZBTCkpCisJCWlmIChXUklURV9TVEFUX1JPVU5EX0VWRU5UKHJzLnR2X3NlYyAqIE5TRUNfUEVSX1NFQyArIHJzLnR2X25zZWMsIElOVEVSVkFMKSkKIAkJCXByX2VycigiZmFpbGVkIHRvIHdyaXRlIHN0YXQgcm91bmQgZXZlbnRcbiIpOwogCX0KIApAQCAtMzY0LDcgKzM2Niw3IEBACiBzdGF0aWMgdm9pZCBlbmFibGVfY291bnRlcnModm9pZCkKIHsKIAlpZiAoaW5pdGlhbF9kZWxheSkKLQkJdXNsZWVwKGluaXRpYWxfZGVsYXkgKiAxMDAwKTsKKwkJdXNsZWVwKGluaXRpYWxfZGVsYXkgKiBVU0VDX1BFUl9NU0VDKTsKIAogCS8qCiAJICogV2UgbmVlZCB0byBlbmFibGUgY291bnRlcnMgb25seSBpZjoKQEAgLTUzOSwxMCArNTQxLDExIEBACiAJaW50IHN0YXR1cyA9IDA7CiAJY29uc3QgYm9vbCBmb3JrcyA9IChhcmdjID4gMCk7CiAJYm9vbCBpc19waXBlID0gU1RBVF9SRUNPUkQgPyBwZXJmX3N0YXQuZmlsZS5pc19waXBlIDogZmFsc2U7CisJc3RydWN0IHBlcmZfZXZzZWxfY29uZmlnX3Rlcm0gKmVycl90ZXJtOwogCiAJaWYgKGludGVydmFsKSB7Ci0JCXRzLnR2X3NlYyAgPSBpbnRlcnZhbCAvIDEwMDA7Ci0JCXRzLnR2X25zZWMgPSAoaW50ZXJ2YWwgJSAxMDAwKSAqIDEwMDAwMDA7CisJCXRzLnR2X3NlYyAgPSBpbnRlcnZhbCAvIFVTRUNfUEVSX01TRUM7CisJCXRzLnR2X25zZWMgPSAoaW50ZXJ2YWwgJSBVU0VDX1BFUl9NU0VDKSAqIE5TRUNfUEVSX01TRUM7CiAJfSBlbHNlIHsKIAkJdHMudHZfc2VjICA9IDE7CiAJCXRzLnR2X25zZWMgPSAwOwpAQCAtNjEwLDYgKzYxMywxMyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCisJaWYgKHBlcmZfZXZsaXN0X19hcHBseV9kcnZfY29uZmlncyhldnNlbF9saXN0LCAmY291bnRlciwgJmVycl90ZXJtKSkgeworCQllcnJvcigiZmFpbGVkIHRvIHNldCBjb25maWcgXCIlc1wiIG9uIGV2ZW50ICVzIHdpdGggJWQgKCVzKVxuIiwKKwkJICAgICAgZXJyX3Rlcm0tPnZhbC5kcnZfY2ZnLCBwZXJmX2V2c2VsX19uYW1lKGNvdW50ZXIpLCBlcnJubywKKwkJICAgICAgc3RyX2Vycm9yX3IoZXJybm8sIG1zZywgc2l6ZW9mKG1zZykpKTsKKwkJcmV0dXJuIC0xOworCX0KKwogCWlmIChTVEFUX1JFQ09SRCkgewogCQlpbnQgZXJyLCBmZCA9IHBlcmZfZGF0YV9maWxlX19mZCgmcGVyZl9zdGF0LmZpbGUpOwogCkBAIC05NzEsNyArOTgxLDcgQEAKIHN0YXRpYyB2b2lkIG5zZWNfcHJpbnRvdXQoaW50IGlkLCBpbnQgbnIsIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgZG91YmxlIGF2ZykKIHsKIAlGSUxFICpvdXRwdXQgPSBzdGF0X2NvbmZpZy5vdXRwdXQ7Ci0JZG91YmxlIG1zZWNzID0gYXZnIC8gMWU2OworCWRvdWJsZSBtc2VjcyA9IGF2ZyAvIE5TRUNfUEVSX01TRUM7CiAJY29uc3QgY2hhciAqZm10X3YsICpmbXRfbjsKIAljaGFyIG5hbWVbMjVdOwogCkBAIC0xNDYwLDcgKzE0NzAsNyBAQAogCWlmICghbnVsbF9ydW4pCiAJCWZwcmludGYob3V0cHV0LCAiXG4iKTsKIAlmcHJpbnRmKG91dHB1dCwgIiAlMTcuOWYgc2Vjb25kcyB0aW1lIGVsYXBzZWQiLAotCQkJYXZnX3N0YXRzKCZ3YWxsdGltZV9uc2Vjc19zdGF0cykvMWU5KTsKKwkJCWF2Z19zdGF0cygmd2FsbHRpbWVfbnNlY3Nfc3RhdHMpIC8gTlNFQ19QRVJfU0VDKTsKIAlpZiAocnVuX2NvdW50ID4gMSkgewogCQlmcHJpbnRmKG91dHB1dCwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKIAkJcHJpbnRfbm9pc2VfcGN0KHN0ZGRldl9zdGF0cygmd2FsbHRpbWVfbnNlY3Nfc3RhdHMpLApAQCAtMjE3NSw4ICsyMTg1LDggQEAKIAkJdXBkYXRlX3N0YXRzKCZ3YWxsdGltZV9uc2Vjc19zdGF0cywgc3RhdF9yb3VuZC0+dGltZSk7CiAKIAlpZiAoc3RhdF9jb25maWcuaW50ZXJ2YWwgJiYgc3RhdF9yb3VuZC0+dGltZSkgewotCQl0c2gudHZfc2VjICA9IHN0YXRfcm91bmQtPnRpbWUgLyBOU0VDU19QRVJfU0VDOwotCQl0c2gudHZfbnNlYyA9IHN0YXRfcm91bmQtPnRpbWUgJSBOU0VDU19QRVJfU0VDOworCQl0c2gudHZfc2VjICA9IHN0YXRfcm91bmQtPnRpbWUgLyBOU0VDX1BFUl9TRUM7CisJCXRzaC50dl9uc2VjID0gc3RhdF9yb3VuZC0+dGltZSAlIE5TRUNfUEVSX1NFQzsKIAkJdHMgPSAmdHNoOwogCX0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRpbWVjaGFydC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXRpbWVjaGFydC5jCmluZGV4IDczM2E1NTQuLmU3ZWFhMjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10aW1lY2hhcnQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdGltZWNoYXJ0LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJ1dGlsL2V2bGlzdC5oIgogI2luY2x1ZGUgInV0aWwvZXZzZWwuaCIKICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KICNpbmNsdWRlICJ1dGlsL3N5bWJvbC5oIgogI2luY2x1ZGUgInV0aWwvY2FsbGNoYWluLmgiCiAjaW5jbHVkZSAidXRpbC9zdHJsaXN0LmgiCkBAIC0xMjg4LDkgKzEyODksOSBAQAogCQkJaWYgKGMtPmNvbW0pIHsKIAkJCQljaGFyIGNvbW1bMjU2XTsKIAkJCQlpZiAoYy0+dG90YWxfdGltZSA+IDUwMDAwMDAwMDApIC8qIDUgc2Vjb25kcyAqLwotCQkJCQlzcHJpbnRmKGNvbW0sICIlczolaSAoJTIuMmZzKSIsIGMtPmNvbW0sIHAtPnBpZCwgYy0+dG90YWxfdGltZSAvIDEwMDAwMDAwMDAuMCk7CisJCQkJCXNwcmludGYoY29tbSwgIiVzOiVpICglMi4yZnMpIiwgYy0+Y29tbSwgcC0+cGlkLCBjLT50b3RhbF90aW1lIC8gKGRvdWJsZSlOU0VDX1BFUl9TRUMpOwogCQkJCWVsc2UKLQkJCQkJc3ByaW50Zihjb21tLCAiJXM6JWkgKCUzLjFmbXMpIiwgYy0+Y29tbSwgcC0+cGlkLCBjLT50b3RhbF90aW1lIC8gMTAwMDAwMC4wKTsKKwkJCQkJc3ByaW50Zihjb21tLCAiJXM6JWkgKCUzLjFmbXMpIiwgYy0+Y29tbSwgcC0+cGlkLCBjLT50b3RhbF90aW1lIC8gKGRvdWJsZSlOU0VDX1BFUl9NU0VDKTsKIAogCQkJCXN2Z190ZXh0KFksIGMtPnN0YXJ0X3RpbWUsIGNvbW0pOwogCQkJfQpAQCAtMTYzNyw3ICsxNjM4LDcgQEAKIAl3cml0ZV9zdmdfZmlsZSh0Y2hhcnQsIG91dHB1dF9uYW1lKTsKIAogCXByX2luZm8oIldyaXR0ZW4gJTIuMWYgc2Vjb25kcyBvZiB0cmFjZSB0byAlcy5cbiIsCi0JCSh0Y2hhcnQtPmxhc3RfdGltZSAtIHRjaGFydC0+Zmlyc3RfdGltZSkgLyAxMDAwMDAwMDAwLjAsIG91dHB1dF9uYW1lKTsKKwkJKHRjaGFydC0+bGFzdF90aW1lIC0gdGNoYXJ0LT5maXJzdF90aW1lKSAvIChkb3VibGUpTlNFQ19QRVJfU0VDLCBvdXRwdXRfbmFtZSk7CiBvdXRfZGVsZXRlOgogCXBlcmZfc2Vzc2lvbl9fZGVsZXRlKHNlc3Npb24pOwogCXJldHVybiByZXQ7CkBAIC0xOTAxLDEwICsxOTAyLDEwIEBACiAJaWYgKHNzY2FuZihhcmcsICIlIiBQUkl1NjQgIiVjcyIsIHZhbHVlLCAmdW5pdCkgPiAwKSB7CiAJCXN3aXRjaCAodW5pdCkgewogCQljYXNlICdtJzoKLQkJCSp2YWx1ZSAqPSAxMDAwMDAwOworCQkJKnZhbHVlICo9IE5TRUNfUEVSX01TRUM7CiAJCQlicmVhazsKIAkJY2FzZSAndSc6Ci0JCQkqdmFsdWUgKj0gMTAwMDsKKwkJCSp2YWx1ZSAqPSBOU0VDX1BFUl9VU0VDOwogCQkJYnJlYWs7CiAJCWNhc2UgJ24nOgogCQkJYnJlYWs7CkBAIC0xOTI4LDcgKzE5MjksNyBAQAogCQkJLm9yZGVyZWRfZXZlbnRzCSA9IHRydWUsCiAJCX0sCiAJCS5wcm9jX251bSA9IDE1LAotCQkubWluX3RpbWUgPSAxMDAwMDAwLAorCQkubWluX3RpbWUgPSBOU0VDX1BFUl9NU0VDLAogCQkubWVyZ2VfZGlzdCA9IDEwMDAsCiAJfTsKIAljb25zdCBjaGFyICpvdXRwdXRfbmFtZSA9ICJvdXRwdXQuc3ZnIjsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYwppbmRleCA0MThlZDk0Li5mZTNhZjk1IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAidXRpbC9hbm5vdGF0ZS5oIgogI2luY2x1ZGUgInV0aWwvY29uZmlnLmgiCiAjaW5jbHVkZSAidXRpbC9jb2xvci5oIgorI2luY2x1ZGUgInV0aWwvZHJ2X2NvbmZpZ3MuaCIKICNpbmNsdWRlICJ1dGlsL2V2bGlzdC5oIgogI2luY2x1ZGUgInV0aWwvZXZzZWwuaCIKICNpbmNsdWRlICJ1dGlsL21hY2hpbmUuaCIKQEAgLTY4LDYgKzY5LDcgQEAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogCiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogc3RhdGljIHZvbGF0aWxlIGludCBkb25lOwpAQCAtNjI0LDcgKzYyNiw3IEBACiAJZGlzcGxheV9zZXR1cF9zaWcoKTsKIAlwdGhyZWFkX191bmJsb2NrX3NpZ3dpbmNoKCk7CiByZXBlYXQ6Ci0JZGVsYXlfbXNlY3MgPSB0b3AtPmRlbGF5X3NlY3MgKiAxMDAwOworCWRlbGF5X21zZWNzID0gdG9wLT5kZWxheV9zZWNzICogTVNFQ19QRVJfU0VDOwogCXNldF90ZXJtX3F1aWV0X2lucHV0KCZzYXZlKTsKIAkvKiB0cmFzaCByZXR1cm4qLwogCWdldGMoc3RkaW4pOwpAQCAtNjU2LDM0ICs2NTgsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IHN5bWJvbF9maWx0ZXIoc3RydWN0IG1hcCAqbWFwLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCi17Ci0JY29uc3QgY2hhciAqbmFtZSA9IHN5bS0+bmFtZTsKLQotCWlmICghX19tYXBfX2lzX2tlcm5lbChtYXApKQotCQlyZXR1cm4gMDsKLQkvKgotCSAqIHBwYzY0IHVzZXMgZnVuY3Rpb24gZGVzY3JpcHRvcnMgYW5kIGFwcGVuZHMgYSAnLicgdG8gdGhlCi0JICogc3RhcnQgb2YgZXZlcnkgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4gUmVtb3ZlIGl0LgotCSAqLwotCWlmIChuYW1lWzBdID09ICcuJykKLQkJbmFtZSsrOwotCi0JaWYgKCFzdHJjbXAobmFtZSwgIl90ZXh0IikgfHwKLQkgICAgIXN0cmNtcChuYW1lLCAiX2V0ZXh0IikgfHwKLQkgICAgIXN0cmNtcChuYW1lLCAiX3Npbml0dGV4dCIpIHx8Ci0JICAgICFzdHJuY21wKCJpbml0X21vZHVsZSIsIG5hbWUsIDExKSB8fAotCSAgICAhc3RybmNtcCgiY2xlYW51cF9tb2R1bGUiLCBuYW1lLCAxNCkgfHwKLQkgICAgc3Ryc3RyKG5hbWUsICJfdGV4dF9zdGFydCIpIHx8Ci0JICAgIHN0cnN0cihuYW1lLCAiX3RleHRfZW5kIikpCi0JCXJldHVybiAxOwotCi0JaWYgKHN5bWJvbF9faXNfaWRsZShzeW0pKQotCQlzeW0tPmlnbm9yZSA9IHRydWU7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBoaXN0X2l0ZXJfX3RvcF9jYWxsYmFjayhzdHJ1Y3QgaGlzdF9lbnRyeV9pdGVyICppdGVyLAogCQkJCSAgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwgYm9vbCBzaW5nbGUsCiAJCQkJICAgdm9pZCAqYXJnKQpAQCAtNzgyLDcgKzc1Niw3IEBACiAJCX0KIAl9CiAKLQlpZiAoYWwuc3ltID09IE5VTEwgfHwgIWFsLnN5bS0+aWdub3JlKSB7CisJaWYgKGFsLnN5bSA9PSBOVUxMIHx8ICFhbC5zeW0tPmlkbGUpIHsKIAkJc3RydWN0IGhpc3RzICpoaXN0cyA9IGV2c2VsX19oaXN0cyhldnNlbCk7CiAJCXN0cnVjdCBoaXN0X2VudHJ5X2l0ZXIgaXRlciA9IHsKIAkJCS5ldnNlbAkJPSBldnNlbCwKQEAgLTk0MCw2ICs5MTQsMTAgQEAKIAogc3RhdGljIGludCBfX2NtZF90b3Aoc3RydWN0IHBlcmZfdG9wICp0b3ApCiB7CisJY2hhciBtc2dbNTEyXTsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqcG9zOworCXN0cnVjdCBwZXJmX2V2c2VsX2NvbmZpZ190ZXJtICplcnJfdGVybTsKKwlzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCA9IHRvcC0+ZXZsaXN0OwogCXN0cnVjdCByZWNvcmRfb3B0cyAqb3B0cyA9ICZ0b3AtPnJlY29yZF9vcHRzOwogCXB0aHJlYWRfdCB0aHJlYWQ7CiAJaW50IHJldDsKQEAgLTk0OCw4ICs5MjYsNiBAQAogCWlmICh0b3AtPnNlc3Npb24gPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwogCi0JbWFjaGluZXNfX3NldF9zeW1ib2xfZmlsdGVyKCZ0b3AtPnNlc3Npb24tPm1hY2hpbmVzLCBzeW1ib2xfZmlsdGVyKTsKLQogCWlmICghb2JqZHVtcF9wYXRoKSB7CiAJCXJldCA9IHBlcmZfZW52X19sb29rdXBfb2JqZHVtcCgmdG9wLT5zZXNzaW9uLT5oZWFkZXIuZW52KTsKIAkJaWYgKHJldCkKQEAgLTk3Niw2ICs5NTIsMTQgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dF9kZWxldGU7CiAKKwlyZXQgPSBwZXJmX2V2bGlzdF9fYXBwbHlfZHJ2X2NvbmZpZ3MoZXZsaXN0LCAmcG9zLCAmZXJyX3Rlcm0pOworCWlmIChyZXQpIHsKKwkJZXJyb3IoImZhaWxlZCB0byBzZXQgY29uZmlnIFwiJXNcIiBvbiBldmVudCAlcyB3aXRoICVkICglcylcbiIsCisJCQllcnJfdGVybS0+dmFsLmRydl9jZmcsIHBlcmZfZXZzZWxfX25hbWUocG9zKSwgZXJybm8sCisJCQlzdHJfZXJyb3JfcihlcnJubywgbXNnLCBzaXplb2YobXNnKSkpOworCQlnb3RvIG91dF9kZWxldGU7CisJfQorCiAJdG9wLT5zZXNzaW9uLT5ldmxpc3QgPSB0b3AtPmV2bGlzdDsKIAlwZXJmX3Nlc3Npb25fX3NldF9pZF9oZHJfc2l6ZSh0b3AtPnNlc3Npb24pOwogCkBAIC0xMzIzLDcgKzEzMDcsOSBAQAogCWlmIChzeW1ib2xfY29uZi5jdW11bGF0ZV9jYWxsY2hhaW4gJiYgIWNhbGxjaGFpbl9wYXJhbS5vcmRlcl9zZXQpCiAJCWNhbGxjaGFpbl9wYXJhbS5vcmRlciA9IE9SREVSX0NBTExFUjsKIAotCXN5bWJvbF9jb25mLnByaXZfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYW5ub3RhdGlvbik7CisJc3RhdHVzID0gc3ltYm9sX19hbm5vdGF0aW9uX2luaXQoKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBvdXRfZGVsZXRlX2V2bGlzdDsKIAogCXN5bWJvbF9jb25mLnRyeV92bWxpbnV4X3BhdGggPSAoc3ltYm9sX2NvbmYudm1saW51eF9uYW1lID09IE5VTEwpOwogCWlmIChzeW1ib2xfX2luaXQoTlVMTCkgPCAwKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRyYWNlLmMgYi90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYwppbmRleCBiOGM2NzY2Li5jMjk4YmQzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAKICNpZm5kZWYgT19DTE9FWEVDCiAjIGRlZmluZSBPX0NMT0VYRUMJCTAyMDAwMDAwCkBAIC03NDEsNiArNzQyLDggQEAKIAkgIC5hcmdfc2NucHJpbnRmID0geyBbMV0gPSBTQ0FfU0lHTlVNLCAvKiBzaWcgKi8gfSwgfSwKIAl7IC5uYW1lCSAgICA9ICJydF90Z3NpZ3F1ZXVlaW5mbyIsIC5lcnJtc2cgPSB0cnVlLAogCSAgLmFyZ19zY25wcmludGYgPSB7IFsyXSA9IFNDQV9TSUdOVU0sIC8qIHNpZyAqLyB9LCB9LAorCXsgLm5hbWUJICAgID0gInNjaGVkX2dldGF0dHIiLAkgICAgICAuZXJybXNnID0gdHJ1ZSwgfSwKKwl7IC5uYW1lCSAgICA9ICJzY2hlZF9zZXRhdHRyIiwJICAgICAgLmVycm1zZyA9IHRydWUsIH0sCiAJeyAubmFtZQkgICAgPSAic2NoZWRfc2V0c2NoZWR1bGVyIiwgICAuZXJybXNnID0gdHJ1ZSwKIAkgIC5hcmdfc2NucHJpbnRmID0geyBbMV0gPSBTQ0FfU0NIRURfUE9MSUNZLCAvKiBwb2xpY3kgKi8gfSwgfSwKIAl7IC5uYW1lCSAgICA9ICJzZWNjb21wIiwgLmVycm1zZyA9IHRydWUsCkBAIC0yMTQwLDYgKzIxNDMsNyBAQAogc3RhdGljIGludCB0cmFjZV9fc2V0X2V2X3F1YWxpZmllcl9maWx0ZXIoc3RydWN0IHRyYWNlICp0cmFjZSkKIHsKIAlpbnQgZXJyID0gLTE7CisJc3RydWN0IHBlcmZfZXZzZWwgKnN5c19leGl0OwogCWNoYXIgKmZpbHRlciA9IGFzcHJpbnRmX2V4cHJfaW5vdXRfaW50cygiaWQiLCAhdHJhY2UtPm5vdF9ldl9xdWFsaWZpZXIsCiAJCQkJCQl0cmFjZS0+ZXZfcXVhbGlmaWVyX2lkcy5uciwKIAkJCQkJCXRyYWNlLT5ldl9xdWFsaWZpZXJfaWRzLmVudHJpZXMpOwpAQCAtMjE0Nyw4ICsyMTUxLDExIEBACiAJaWYgKGZpbHRlciA9PSBOVUxMKQogCQlnb3RvIG91dF9lbm9tZW07CiAKLQlpZiAoIXBlcmZfZXZzZWxfX2FwcGVuZF9maWx0ZXIodHJhY2UtPnN5c2NhbGxzLmV2ZW50cy5zeXNfZW50ZXIsICImJiIsIGZpbHRlcikpCi0JCWVyciA9IHBlcmZfZXZzZWxfX2FwcGVuZF9maWx0ZXIodHJhY2UtPnN5c2NhbGxzLmV2ZW50cy5zeXNfZXhpdCwgIiYmIiwgZmlsdGVyKTsKKwlpZiAoIXBlcmZfZXZzZWxfX2FwcGVuZF90cF9maWx0ZXIodHJhY2UtPnN5c2NhbGxzLmV2ZW50cy5zeXNfZW50ZXIsCisJCQkJCSAgZmlsdGVyKSkgeworCQlzeXNfZXhpdCA9IHRyYWNlLT5zeXNjYWxscy5ldmVudHMuc3lzX2V4aXQ7CisJCWVyciA9IHBlcmZfZXZzZWxfX2FwcGVuZF90cF9maWx0ZXIoc3lzX2V4aXQsIGZpbHRlcik7CisJfQogCiAJZnJlZShmaWx0ZXIpOwogb3V0OgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9wZXJmLXN5cy5oIGIvdG9vbHMvcGVyZi9wZXJmLXN5cy5oCmluZGV4IDdlZDcyYTQuLmU0YjcxN2UgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvcGVyZi1zeXMuaAorKysgYi90b29scy9wZXJmL3BlcmYtc3lzLmgKQEAgLTIwLDcgKzIwLDYgQEAKICNlbmRpZgogCiAjaWZkZWYgX19wb3dlcnBjX18KLSNpbmNsdWRlICIuLi8uLi9hcmNoL3Bvd2VycGMvaW5jbHVkZS91YXBpL2FzbS91bmlzdGQuaCIKICNkZWZpbmUgQ1BVSU5GT19QUk9DCXsiY3B1In0KICNlbmRpZgogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3BlcmYuaCBiL3Rvb2xzL3BlcmYvcGVyZi5oCmluZGV4IGNiMGYxMzUuLjlhMDIzNmEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvcGVyZi5oCisrKyBiL3Rvb2xzL3BlcmYvcGVyZi5oCkBAIC0xNCwxMyArMTQsNiBAQAogI2RlZmluZSBIQVZFX0FUVFJfVEVTVAogI2luY2x1ZGUgInBlcmYtc3lzLmgiCiAKLSNpZm5kZWYgTlNFQ19QRVJfU0VDCi0jIGRlZmluZSBOU0VDX1BFUl9TRUMJCQkxMDAwMDAwMDAwVUxMCi0jZW5kaWYKLSNpZm5kZWYgTlNFQ19QRVJfVVNFQwotIyBkZWZpbmUgTlNFQ19QRVJfVVNFQwkJCTEwMDBVTEwKLSNlbmRpZgotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyByZGNsb2NrKHZvaWQpCiB7CiAJc3RydWN0IHRpbWVzcGVjIHRzOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi90ZXN0cy9CdWlsZCBiL3Rvb2xzL3BlcmYvdGVzdHMvQnVpbGQKaW5kZXggZGM1MWJjNS4uOGE0Y2U0OSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90ZXN0cy9CdWlsZAorKysgYi90b29scy9wZXJmL3Rlc3RzL0J1aWxkCkBAIC03MSw3ICs3MSw3IEBACiAJJChRKXNlZCAtZSAncy8iL1xcIi9nJyAtZSAncy9cKC4qXCkvIlwxXFxuIi9nJyAkPCA+PiAkQAogCSQoUSllY2hvICc7JyA+PiAkQAogCi1pZmVxICgkKEFSQ0gpLCQoZmlsdGVyICQoQVJDSCkseDg2IGFybSBhcm02NCkpCitpZmVxICgkKEFSQ0gpLCQoZmlsdGVyICQoQVJDSCkseDg2IGFybSBhcm02NCBwb3dlcnBjKSkKIHBlcmYtJChDT05GSUdfRFdBUkZfVU5XSU5EKSArPSBkd2FyZi11bndpbmQubwogZW5kaWYKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi90ZXN0cy9iYWNrd2FyZC1yaW5nLWJ1ZmZlci5jIGIvdG9vbHMvcGVyZi90ZXN0cy9iYWNrd2FyZC1yaW5nLWJ1ZmZlci5jCmluZGV4IDYxNTc4MGMuLmU2ZDE4MTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdGVzdHMvYmFja3dhcmQtcmluZy1idWZmZXIuYworKysgYi90b29scy9wZXJmL3Rlc3RzL2JhY2t3YXJkLXJpbmctYnVmZmVyLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAogCWV2bGlzdCA9IHBlcmZfZXZsaXN0X19uZXcoKTsKIAlpZiAoIWV2bGlzdCkgewotCQlwcl9kZWJ1ZygiTm8gZWhvdWdoIG1lbW9yeSB0byBjcmVhdGUgZXZsaXN0XG4iKTsKKwkJcHJfZGVidWcoIk5vIGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIGV2bGlzdFxuIik7CiAJCXJldHVybiBURVNUX0ZBSUw7CiAJfQogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL2JwZi5jIGIvdG9vbHMvcGVyZi90ZXN0cy9icGYuYwppbmRleCBmYzU0MDY0Li4yNjczZTg2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3Rlc3RzL2JwZi5jCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvYnBmLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogCS8qIEluc3RlYWQgb2YgcGVyZl9ldmxpc3RfX25ld19kZWZhdWx0LCBkb24ndCBhZGQgZGVmYXVsdCBldmVudHMgKi8KIAlldmxpc3QgPSBwZXJmX2V2bGlzdF9fbmV3KCk7CiAJaWYgKCFldmxpc3QpIHsKLQkJcHJfZGVidWcoIk5vIGVob3VnaCBtZW1vcnkgdG8gY3JlYXRlIGV2bGlzdFxuIik7CisJCXByX2RlYnVnKCJObyBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSBldmxpc3RcbiIpOwogCQlyZXR1cm4gVEVTVF9GQUlMOwogCX0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi90ZXN0cy9jb2RlLXJlYWRpbmcuYyBiL3Rvb2xzL3BlcmYvdGVzdHMvY29kZS1yZWFkaW5nLmMKaW5kZXggMmFmMTU2YS4uZmY1YmM2MyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90ZXN0cy9jb2RlLXJlYWRpbmcuYworKysgYi90b29scy9wZXJmL3Rlc3RzL2NvZGUtcmVhZGluZy5jCkBAIC0yNjMsNyArMjYzLDcgQEAKIAkgKiBDb252ZXJ0aW5nIGFkZHJlc3NlcyBmb3IgdXNlIGJ5IG9iamR1bXAgcmVxdWlyZXMgbW9yZSBpbmZvcm1hdGlvbi4KIAkgKiBtYXBfX2xvYWQoKSBkb2VzIHRoYXQuICBTZWUgbWFwX19yaXBfMm9iamR1bXAoKSBmb3IgZGV0YWlscy4KIAkgKi8KLQlpZiAobWFwX19sb2FkKGFsLm1hcCwgTlVMTCkpCisJaWYgKG1hcF9fbG9hZChhbC5tYXApKQogCQlyZXR1cm4gLTE7CiAKIAkvKiBvYmpkdW1wIHN0cnVnZ2xlcyB3aXRoIGtjb3JlIC0gdHJ5IGVhY2ggbWFwIG9ubHkgb25jZSAqLwpAQCAtNTExLDcgKzUxMSw3IEBACiAKIAkvKiBMb2FkIGtlcm5lbCBtYXAgKi8KIAltYXAgPSBtYWNoaW5lX19rZXJuZWxfbWFwKG1hY2hpbmUpOwotCXJldCA9IG1hcF9fbG9hZChtYXAsIE5VTEwpOworCXJldCA9IG1hcF9fbG9hZChtYXApOwogCWlmIChyZXQgPCAwKSB7CiAJCXByX2RlYnVnKCJtYXBfX2xvYWQgZmFpbGVkXG4iKTsKIAkJZ290byBvdXRfZXJyOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi90ZXN0cy9kd2FyZi11bndpbmQuYyBiL3Rvb2xzL3BlcmYvdGVzdHMvZHdhcmYtdW53aW5kLmMKaW5kZXggOGY2ZWI4NS4uMTA0NjQ5MSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90ZXN0cy9kd2FyZi11bndpbmQuYworKysgYi90b29scy9wZXJmL3Rlc3RzL2R3YXJmLXVud2luZC5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSAidGhyZWFkLmgiCiAjaW5jbHVkZSAiY2FsbGNoYWluLmgiCiAKLSNpZiBkZWZpbmVkIChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkIChfX2kzODZfXykKKyNpZiBkZWZpbmVkIChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkIChfX2kzODZfXykgfHwgZGVmaW5lZCAoX19wb3dlcnBjX18pCiAjaW5jbHVkZSAiYXJjaC10ZXN0cy5oIgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvdm1saW51eC1rYWxsc3ltcy5jIGIvdG9vbHMvcGVyZi90ZXN0cy92bWxpbnV4LWthbGxzeW1zLmMKaW5kZXggZTYzYWJhYi4uYTUwODIzMyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90ZXN0cy92bWxpbnV4LWthbGxzeW1zLmMKKysrIGIvdG9vbHMvcGVyZi90ZXN0cy92bWxpbnV4LWthbGxzeW1zLmMKQEAgLTgsMTQgKzgsNiBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAibWFjaGluZS5oIgogCi1zdGF0aWMgaW50IHZtbGludXhfbWF0Y2hlc19rYWxsc3ltc19maWx0ZXIoc3RydWN0IG1hcCAqbWFwIF9fbWF5YmVfdW51c2VkLAotCQkJCQkgICBzdHJ1Y3Qgc3ltYm9sICpzeW0pCi17Ci0JYm9vbCAqdmlzaXRlZCA9IHN5bWJvbF9fcHJpdihzeW0pOwotCSp2aXNpdGVkID0gdHJ1ZTsKLQlyZXR1cm4gMDsKLX0KLQogI2RlZmluZSBVTSh4KSBrYWxsc3ltc19tYXAtPnVubWFwX2lwKGthbGxzeW1zX21hcCwgKHgpKQogCiBpbnQgdGVzdF9fdm1saW51eF9tYXRjaGVzX2thbGxzeW1zKGludCBzdWJ0ZXN0IF9fbWF5YmVfdW51c2VkKQpAQCAtMjgsNiArMjAsNyBAQAogCWVudW0gbWFwX3R5cGUgdHlwZSA9IE1BUF9fRlVOQ1RJT047CiAJc3RydWN0IG1hcHMgKm1hcHMgPSAmdm1saW51eC5rbWFwcy5tYXBzW3R5cGVdOwogCXU2NCBtZW1fc3RhcnQsIG1lbV9lbmQ7CisJYm9vbCBoZWFkZXJfcHJpbnRlZDsKIAogCS8qCiAJICogU3RlcCAxOgpAQCAtNjEsNyArNTQsNyBAQAogCSAqIGJlIGNvbXBhY3RlZCBhZ2FpbnN0IHRoZSBsaXN0IG9mIG1vZHVsZXMgZm91bmQgaW4gdGhlICJ2bWxpbnV4IgogCSAqIGNvZGUgYW5kIHdpdGggdGhlIG9uZSBnb3QgZnJvbSAvcHJvYy9tb2R1bGVzIGZyb20gdGhlICJrYWxsc3ltcyIgY29kZS4KIAkgKi8KLQlpZiAoX19tYWNoaW5lX19sb2FkX2thbGxzeW1zKCZrYWxsc3ltcywgIi9wcm9jL2thbGxzeW1zIiwgdHlwZSwgdHJ1ZSwgTlVMTCkgPD0gMCkgeworCWlmIChfX21hY2hpbmVfX2xvYWRfa2FsbHN5bXMoJmthbGxzeW1zLCAiL3Byb2Mva2FsbHN5bXMiLCB0eXBlLCB0cnVlKSA8PSAwKSB7CiAJCXByX2RlYnVnKCJkc29fX2xvYWRfa2FsbHN5bXMgIik7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTk5LDggKzkyLDcgQEAKIAkgKiBtYXBzX19yZWxvY192bWxpbnV4IHdpbGwgbm90aWNlIGFuZCBzZXQgcHJvcGVyIC0+W3VuXW1hcF9pcCByb3V0aW5lcwogCSAqIHRvIGZpeHVwIHRoZSBzeW1ib2xzLgogCSAqLwotCWlmIChtYWNoaW5lX19sb2FkX3ZtbGludXhfcGF0aCgmdm1saW51eCwgdHlwZSwKLQkJCQkgICAgICAgdm1saW51eF9tYXRjaGVzX2thbGxzeW1zX2ZpbHRlcikgPD0gMCkgeworCWlmIChtYWNoaW5lX19sb2FkX3ZtbGludXhfcGF0aCgmdm1saW51eCwgdHlwZSkgPD0gMCkgewogCQlwcl9kZWJ1ZygiQ291bGRuJ3QgZmluZCBhIHZtbGludXggdGhhdCBtYXRjaGVzIHRoZSBrZXJuZWwgcnVubmluZyBvbiB0aGlzIG1hY2hpbmUsIHNraXBwaW5nIHRlc3RcbiIpOwogCQllcnIgPSBURVNUX1NLSVA7CiAJCWdvdG8gb3V0OwpAQCAtMTI2LDcgKzExOCw3IEBACiAJCW1lbV9lbmQgPSB2bWxpbnV4X21hcC0+dW5tYXBfaXAodm1saW51eF9tYXAsIHN5bS0+ZW5kKTsKIAogCQlmaXJzdF9wYWlyID0gbWFjaGluZV9fZmluZF9rZXJuZWxfc3ltYm9sKCZrYWxsc3ltcywgdHlwZSwKLQkJCQkJCQkgbWVtX3N0YXJ0LCBOVUxMLCBOVUxMKTsKKwkJCQkJCQkgbWVtX3N0YXJ0LCBOVUxMKTsKIAkJcGFpciA9IGZpcnN0X3BhaXI7CiAKIAkJaWYgKHBhaXIgJiYgVU0ocGFpci0+c3RhcnQpID09IG1lbV9zdGFydCkgewpAQCAtMTQzLDcgKzEzNSw3IEBACiAJCQkJICovCiAJCQkJczY0IHNrZXcgPSBtZW1fZW5kIC0gVU0ocGFpci0+ZW5kKTsKIAkJCQlpZiAobGxhYnMoc2tldykgPj0gcGFnZV9zaXplKQotCQkJCQlwcl9kZWJ1ZygiJSMiIFBSSXg2NCAiOiBkaWZmIGVuZCBhZGRyIGZvciAlcyB2OiAlIyIgUFJJeDY0ICIgazogJSMiIFBSSXg2NCAiXG4iLAorCQkJCQlwcl9kZWJ1ZygiV0FSTjogJSMiIFBSSXg2NCAiOiBkaWZmIGVuZCBhZGRyIGZvciAlcyB2OiAlIyIgUFJJeDY0ICIgazogJSMiIFBSSXg2NCAiXG4iLAogCQkJCQkJIG1lbV9zdGFydCwgc3ltLT5uYW1lLCBtZW1fZW5kLAogCQkJCQkJIFVNKHBhaXItPmVuZCkpOwogCkBAIC0xNTQsMjIgKzE0NiwyMyBAQAogCQkJCSAqIGthbGxzeW1zLgogCQkJCSAqLwogCQkJCWNvbnRpbnVlOwotCiAJCQl9IGVsc2UgewotCQkJCXBhaXIgPSBtYWNoaW5lX19maW5kX2tlcm5lbF9zeW1ib2xfYnlfbmFtZSgma2FsbHN5bXMsIHR5cGUsIHN5bS0+bmFtZSwgTlVMTCwgTlVMTCk7CisJCQkJcGFpciA9IG1hY2hpbmVfX2ZpbmRfa2VybmVsX3N5bWJvbF9ieV9uYW1lKCZrYWxsc3ltcywgdHlwZSwgc3ltLT5uYW1lLCBOVUxMKTsKIAkJCQlpZiAocGFpcikgewogCQkJCQlpZiAoVU0ocGFpci0+c3RhcnQpID09IG1lbV9zdGFydCkKIAkJCQkJCWdvdG8gbmV4dF9wYWlyOwogCi0JCQkJCXByX2RlYnVnKCIlIyIgUFJJeDY0ICI6IGRpZmYgbmFtZSB2OiAlcyBrOiAlc1xuIiwKKwkJCQkJcHJfZGVidWcoIldBUk46ICUjIiBQUkl4NjQgIjogZGlmZiBuYW1lIHY6ICVzIGs6ICVzXG4iLAogCQkJCQkJIG1lbV9zdGFydCwgc3ltLT5uYW1lLCBwYWlyLT5uYW1lKTsKIAkJCQl9IGVsc2UgewotCQkJCQlwcl9kZWJ1ZygiJSMiIFBSSXg2NCAiOiBkaWZmIG5hbWUgdjogJXMgazogJXNcbiIsCisJCQkJCXByX2RlYnVnKCJXQVJOOiAlIyIgUFJJeDY0ICI6IGRpZmYgbmFtZSB2OiAlcyBrOiAlc1xuIiwKIAkJCQkJCSBtZW1fc3RhcnQsIHN5bS0+bmFtZSwgZmlyc3RfcGFpci0+bmFtZSk7CiAJCQkJfQorCisJCQkJY29udGludWU7CiAJCQl9CiAJCX0gZWxzZQotCQkJcHJfZGVidWcoIiUjIiBQUkl4NjQgIjogJXMgbm90IG9uIGthbGxzeW1zXG4iLAorCQkJcHJfZGVidWcoIkVSUiA6ICUjIiBQUkl4NjQgIjogJXMgbm90IG9uIGthbGxzeW1zXG4iLAogCQkJCSBtZW1fc3RhcnQsIHN5bS0+bmFtZSk7CiAKIAkJZXJyID0gLTE7CkBAIC0xNzgsNyArMTcxLDcgQEAKIAlpZiAoIXZlcmJvc2UpCiAJCWdvdG8gb3V0OwogCi0JcHJfaW5mbygiTWFwcyBvbmx5IGluIHZtbGludXg6XG4iKTsKKwloZWFkZXJfcHJpbnRlZCA9IGZhbHNlOwogCiAJZm9yIChtYXAgPSBtYXBzX19maXJzdChtYXBzKTsgbWFwOyBtYXAgPSBtYXBfX25leHQobWFwKSkgewogCQlzdHJ1Y3QgbWFwICoKQEAgLTE5MiwxMyArMTg1LDE4IEBACiAJCQkJCQkobWFwLT5kc28tPmtlcm5lbCA/CiAJCQkJCQkJbWFwLT5kc28tPnNob3J0X25hbWUgOgogCQkJCQkJCW1hcC0+ZHNvLT5uYW1lKSk7Ci0JCWlmIChwYWlyKQorCQlpZiAocGFpcikgewogCQkJcGFpci0+cHJpdiA9IDE7Ci0JCWVsc2UKKwkJfSBlbHNlIHsKKwkJCWlmICghaGVhZGVyX3ByaW50ZWQpIHsKKwkJCQlwcl9pbmZvKCJXQVJOOiBNYXBzIG9ubHkgaW4gdm1saW51eDpcbiIpOworCQkJCWhlYWRlcl9wcmludGVkID0gdHJ1ZTsKKwkJCX0KIAkJCW1hcF9fZnByaW50ZihtYXAsIHN0ZGVycik7CisJCX0KIAl9CiAKLQlwcl9pbmZvKCJNYXBzIGluIHZtbGludXggd2l0aCBhIGRpZmZlcmVudCBuYW1lIGluIGthbGxzeW1zOlxuIik7CisJaGVhZGVyX3ByaW50ZWQgPSBmYWxzZTsKIAogCWZvciAobWFwID0gbWFwc19fZmlyc3QobWFwcyk7IG1hcDsgbWFwID0gbWFwX19uZXh0KG1hcCkpIHsKIAkJc3RydWN0IG1hcCAqcGFpcjsKQEAgLTIxMSwyNCArMjA5LDMzIEBACiAJCQljb250aW51ZTsKIAogCQlpZiAocGFpci0+c3RhcnQgPT0gbWVtX3N0YXJ0KSB7Ci0JCQlwYWlyLT5wcml2ID0gMTsKLQkJCXByX2luZm8oIiAlIiBQUkl4NjQgIi0lIiBQUkl4NjQgIiAlIiBQUkl4NjQgIiAlcyBpbiBrYWxsc3ltcyBhcyIsCisJCQlpZiAoIWhlYWRlcl9wcmludGVkKSB7CisJCQkJcHJfaW5mbygiV0FSTjogTWFwcyBpbiB2bWxpbnV4IHdpdGggYSBkaWZmZXJlbnQgbmFtZSBpbiBrYWxsc3ltczpcbiIpOworCQkJCWhlYWRlcl9wcmludGVkID0gdHJ1ZTsKKwkJCX0KKworCQkJcHJfaW5mbygiV0FSTjogJSIgUFJJeDY0ICItJSIgUFJJeDY0ICIgJSIgUFJJeDY0ICIgJXMgaW4ga2FsbHN5bXMgYXMiLAogCQkJCW1hcC0+c3RhcnQsIG1hcC0+ZW5kLCBtYXAtPnBnb2ZmLCBtYXAtPmRzby0+bmFtZSk7CiAJCQlpZiAobWVtX2VuZCAhPSBwYWlyLT5lbmQpCi0JCQkJcHJfaW5mbygiOlxuKiUiIFBSSXg2NCAiLSUiIFBSSXg2NCAiICUiIFBSSXg2NCwKKwkJCQlwcl9pbmZvKCI6XG5XQVJOOiAqJSIgUFJJeDY0ICItJSIgUFJJeDY0ICIgJSIgUFJJeDY0LAogCQkJCQlwYWlyLT5zdGFydCwgcGFpci0+ZW5kLCBwYWlyLT5wZ29mZik7CiAJCQlwcl9pbmZvKCIgJXNcbiIsIHBhaXItPmRzby0+bmFtZSk7CiAJCQlwYWlyLT5wcml2ID0gMTsKIAkJfQogCX0KIAotCXByX2luZm8oIk1hcHMgb25seSBpbiBrYWxsc3ltczpcbiIpOworCWhlYWRlcl9wcmludGVkID0gZmFsc2U7CiAKIAltYXBzID0gJmthbGxzeW1zLmttYXBzLm1hcHNbdHlwZV07CiAKIAlmb3IgKG1hcCA9IG1hcHNfX2ZpcnN0KG1hcHMpOyBtYXA7IG1hcCA9IG1hcF9fbmV4dChtYXApKSB7Ci0JCWlmICghbWFwLT5wcml2KQorCQlpZiAoIW1hcC0+cHJpdikgeworCQkJaWYgKCFoZWFkZXJfcHJpbnRlZCkgeworCQkJCXByX2luZm8oIldBUk46IE1hcHMgb25seSBpbiBrYWxsc3ltczpcbiIpOworCQkJCWhlYWRlcl9wcmludGVkID0gdHJ1ZTsKKwkJCX0KIAkJCW1hcF9fZnByaW50ZihtYXAsIHN0ZGVycik7CisJCX0KIAl9CiBvdXQ6CiAJbWFjaGluZV9fZXhpdCgma2FsbHN5bXMpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi90cmFjZS9iZWF1dHkvbW1hcC5jIGIvdG9vbHMvcGVyZi90cmFjZS9iZWF1dHkvbW1hcC5jCmluZGV4IGQwYTNhOGUuLmZkNzEwYWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdHJhY2UvYmVhdXR5L21tYXAuYworKysgYi90b29scy9wZXJmL3RyYWNlL2JlYXV0eS9tbWFwLmMKQEAgLTEsOCArMSw0IEBACi0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotI2lmbmRlZiBQUk9UX1NFTQotI2RlZmluZSBQUk9UX1NFTSAweDgKLSNlbmRpZgorI2luY2x1ZGUgPHVhcGkvbGludXgvbW1hbi5oPgogCiBzdGF0aWMgc2l6ZV90IHN5c2NhbGxfYXJnX19zY25wcmludGZfbW1hcF9wcm90KGNoYXIgKmJmLCBzaXplX3Qgc2l6ZSwKIAkJCQkJICAgICAgIHN0cnVjdCBzeXNjYWxsX2FyZyAqYXJnKQpAQCAtMzMsMzEgKzI5LDYgQEAKIAogI2RlZmluZSBTQ0FfTU1BUF9QUk9UIHN5c2NhbGxfYXJnX19zY25wcmludGZfbW1hcF9wcm90CiAKLSNpZm5kZWYgTUFQX0ZJWEVECi0jZGVmaW5lIE1BUF9GSVhFRAkJICAgICAweDEwCi0jZW5kaWYKLQotI2lmbmRlZiBNQVBfQU5PTllNT1VTCi0jZGVmaW5lIE1BUF9BTk9OWU1PVVMJCSAgICAgMHgyMAotI2VuZGlmCi0KLSNpZm5kZWYgTUFQXzMyQklUCi0jZGVmaW5lIE1BUF8zMkJJVAkJICAgICAweDQwCi0jZW5kaWYKLQotI2lmbmRlZiBNQVBfU1RBQ0sKLSNkZWZpbmUgTUFQX1NUQUNLCQkgIDB4MjAwMDAKLSNlbmRpZgotCi0jaWZuZGVmIE1BUF9IVUdFVExCCi0jZGVmaW5lIE1BUF9IVUdFVExCCQkgIDB4NDAwMDAKLSNlbmRpZgotCi0jaWZuZGVmIE1BUF9VTklOSVRJQUxJWkVECi0jZGVmaW5lIE1BUF9VTklOSVRJQUxJWkVECTB4NDAwMDAwMAotI2VuZGlmCi0KLQogc3RhdGljIHNpemVfdCBzeXNjYWxsX2FyZ19fc2NucHJpbnRmX21tYXBfZmxhZ3MoY2hhciAqYmYsIHNpemVfdCBzaXplLAogCQkJCQkJc3RydWN0IHN5c2NhbGxfYXJnICphcmcpCiB7CkBAIC05NSwxMyArNjYsNiBAQAogCiAjZGVmaW5lIFNDQV9NTUFQX0ZMQUdTIHN5c2NhbGxfYXJnX19zY25wcmludGZfbW1hcF9mbGFncwogCi0jaWZuZGVmIE1SRU1BUF9NQVlNT1ZFCi0jZGVmaW5lIE1SRU1BUF9NQVlNT1ZFIDEKLSNlbmRpZgotI2lmbmRlZiBNUkVNQVBfRklYRUQKLSNkZWZpbmUgTVJFTUFQX0ZJWEVEIDIKLSNlbmRpZgotCiBzdGF0aWMgc2l6ZV90IHN5c2NhbGxfYXJnX19zY25wcmludGZfbXJlbWFwX2ZsYWdzKGNoYXIgKmJmLCBzaXplX3Qgc2l6ZSwKIAkJCQkJCSAgc3RydWN0IHN5c2NhbGxfYXJnICphcmcpCiB7CkBAIC0xMjUsMzkgKzg5LDYgQEAKIAogI2RlZmluZSBTQ0FfTVJFTUFQX0ZMQUdTIHN5c2NhbGxfYXJnX19zY25wcmludGZfbXJlbWFwX2ZsYWdzCiAKLSNpZm5kZWYgTUFEVl9IV1BPSVNPTgotI2RlZmluZSBNQURWX0hXUE9JU09OCQkxMDAKLSNlbmRpZgotCi0jaWZuZGVmIE1BRFZfU09GVF9PRkZMSU5FCi0jZGVmaW5lIE1BRFZfU09GVF9PRkZMSU5FCTEwMQotI2VuZGlmCi0KLSNpZm5kZWYgTUFEVl9NRVJHRUFCTEUKLSNkZWZpbmUgTUFEVl9NRVJHRUFCTEUJCSAxMgotI2VuZGlmCi0KLSNpZm5kZWYgTUFEVl9VTk1FUkdFQUJMRQotI2RlZmluZSBNQURWX1VOTUVSR0VBQkxFCSAxMwotI2VuZGlmCi0KLSNpZm5kZWYgTUFEVl9IVUdFUEFHRQotI2RlZmluZSBNQURWX0hVR0VQQUdFCQkgMTQKLSNlbmRpZgotCi0jaWZuZGVmIE1BRFZfTk9IVUdFUEFHRQotI2RlZmluZSBNQURWX05PSFVHRVBBR0UJCSAxNQotI2VuZGlmCi0KLSNpZm5kZWYgTUFEVl9ET05URFVNUAotI2RlZmluZSBNQURWX0RPTlREVU1QCQkgMTYKLSNlbmRpZgotCi0jaWZuZGVmIE1BRFZfRE9EVU1QCi0jZGVmaW5lIE1BRFZfRE9EVU1QCQkgMTcKLSNlbmRpZgotCi0KIHN0YXRpYyBzaXplX3Qgc3lzY2FsbF9hcmdfX3NjbnByaW50Zl9tYWR2aXNlX2JlaGF2aW9yKGNoYXIgKmJmLCBzaXplX3Qgc2l6ZSwKIAkJCQkJCSAgICAgIHN0cnVjdCBzeXNjYWxsX2FyZyAqYXJnKQogewpAQCAtMTcwLDYgKzEwMSw3IEBACiAJUF9NQURWX0JIVihTRVFVRU5USUFMKTsKIAlQX01BRFZfQkhWKFdJTExORUVEKTsKIAlQX01BRFZfQkhWKERPTlRORUVEKTsKKwlQX01BRFZfQkhWKEZSRUUpOwogCVBfTUFEVl9CSFYoUkVNT1ZFKTsKIAlQX01BRFZfQkhWKERPTlRGT1JLKTsKIAlQX01BRFZfQkhWKERPRk9SSyk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3VpL2Jyb3dzZXJzL2Fubm90YXRlLmMgYi90b29scy9wZXJmL3VpL2Jyb3dzZXJzL2Fubm90YXRlLmMKaW5kZXggMmUyZDEwMC4uNGMxODI3MSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91aS9icm93c2Vycy9hbm5vdGF0ZS5jCisrKyBiL3Rvb2xzL3BlcmYvdWkvYnJvd3NlcnMvYW5ub3RhdGUuYwpAQCAtNDk1LDcgKzQ5NSw3IEBACiAJaWYgKCFpbnNfX2lzX2NhbGwoZGwtPmlucykpCiAJCXJldHVybiBmYWxzZTsKIAotCWlmIChtYXBfZ3JvdXBzX19maW5kX2FtcygmdGFyZ2V0LCBOVUxMKSB8fAorCWlmIChtYXBfZ3JvdXBzX19maW5kX2FtcygmdGFyZ2V0KSB8fAogCSAgICBtYXBfX3JpcF8yb2JqZHVtcCh0YXJnZXQubWFwLCB0YXJnZXQubWFwLT5tYXBfaXAodGFyZ2V0Lm1hcCwKIAkJCQkJCQkgICAgIHRhcmdldC5hZGRyKSkgIT0KIAkgICAgZGwtPm9wcy50YXJnZXQuYWRkcikgewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91aS9icm93c2Vycy9oaXN0cy5jIGIvdG9vbHMvcGVyZi91aS9icm93c2Vycy9oaXN0cy5jCmluZGV4IDEzZDQxNDMuLmZiOGU0MmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdWkvYnJvd3NlcnMvaGlzdHMuYworKysgYi90b29scy9wZXJmL3VpL2Jyb3dzZXJzL2hpc3RzLmMKQEAgLTY5LDggKzY5LDExIEBACiBzdGF0aWMgdm9pZCBoaXN0X2Jyb3dzZXJfX3VwZGF0ZV9yb3dzKHN0cnVjdCBoaXN0X2Jyb3dzZXIgKmhiKQogewogCXN0cnVjdCB1aV9icm93c2VyICpicm93c2VyID0gJmhiLT5iOwotCXUxNiBoZWFkZXJfb2Zmc2V0ID0gaGItPnNob3dfaGVhZGVycyA/IDEgOiAwLCBpbmRleF9yb3c7CisJc3RydWN0IGhpc3RzICpoaXN0cyA9IGhiLT5oaXN0czsKKwlzdHJ1Y3QgcGVyZl9ocHBfbGlzdCAqaHBwX2xpc3QgPSBoaXN0cy0+aHBwX2xpc3Q7CisJdTE2IGhlYWRlcl9vZmZzZXQsIGluZGV4X3JvdzsKIAorCWhlYWRlcl9vZmZzZXQgPSBoYi0+c2hvd19oZWFkZXJzID8gaHBwX2xpc3QtPm5yX2hlYWRlcl9saW5lcyA6IDA7CiAJYnJvd3Nlci0+cm93cyA9IGJyb3dzZXItPmhlaWdodCAtIGhlYWRlcl9vZmZzZXQ7CiAJLyoKIAkgKiBWZXJpZnkgaWYgd2Ugd2VyZSBhdCB0aGUgbGFzdCBsaW5lIGFuZCB0aGF0IGxpbmUgaXNuJ3QKQEAgLTk5LDggKzEwMiwxMSBAQAogCiBzdGF0aWMgdm9pZCBoaXN0X2Jyb3dzZXJfX2dvdG9yYyhzdHJ1Y3QgaGlzdF9icm93c2VyICpicm93c2VyLCBpbnQgcm93LCBpbnQgY29sdW1uKQogewotCXUxNiBoZWFkZXJfb2Zmc2V0ID0gYnJvd3Nlci0+c2hvd19oZWFkZXJzID8gMSA6IDA7CisJc3RydWN0IGhpc3RzICpoaXN0cyA9IGJyb3dzZXItPmhpc3RzOworCXN0cnVjdCBwZXJmX2hwcF9saXN0ICpocHBfbGlzdCA9IGhpc3RzLT5ocHBfbGlzdDsKKwl1MTYgaGVhZGVyX29mZnNldDsKIAorCWhlYWRlcl9vZmZzZXQgPSBicm93c2VyLT5zaG93X2hlYWRlcnMgPyBocHBfbGlzdC0+bnJfaGVhZGVyX2xpbmVzIDogMDsKIAl1aV9icm93c2VyX19nb3RvcmMoJmJyb3dzZXItPmIsIHJvdyArIGhlYWRlcl9vZmZzZXQsIGNvbHVtbik7CiB9CiAKQEAgLTEwNzQsNyArMTA4MCw3IEBACiAJYm9vbCBjdXJyZW50X2VudHJ5OwogfTsKIAotc3RhdGljIGludCBfX2hwcF9fc2xzbWdfY29sb3JfcHJpbnRmKHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK2ludCBfX2hwcF9fc2xzbWdfY29sb3JfcHJpbnRmKHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKIAlzdHJ1Y3QgaHBwX2FyZyAqYXJnID0gaHBwLT5wdHI7CiAJaW50IHJldCwgbGVuOwpAQCAtMTA5MSw3ICsxMDk3LDYgQEAKIAlyZXQgPSBzY25wcmludGYoaHBwLT5idWYsIGhwcC0+c2l6ZSwgZm10LCBsZW4sIHBlcmNlbnQpOwogCXVpX2Jyb3dzZXJfX3ByaW50ZihhcmctPmIsICIlcyIsIGhwcC0+YnVmKTsKIAotCWFkdmFuY2VfaHBwKGhwcCwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDk2LDcgKzE1MDEsOSBAQAogCXJldHVybiBocHAtPnNpemUgPD0gMDsKIH0KIAotc3RhdGljIGludCBoaXN0c19icm93c2VyX19zY25wcmludGZfaGVhZGVycyhzdHJ1Y3QgaGlzdF9icm93c2VyICpicm93c2VyLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQorc3RhdGljIGludAoraGlzdHNfYnJvd3Nlcl9fc2NucHJpbnRmX2hlYWRlcnMoc3RydWN0IGhpc3RfYnJvd3NlciAqYnJvd3NlciwgY2hhciAqYnVmLAorCQkJCSBzaXplX3Qgc2l6ZSwgaW50IGxpbmUpCiB7CiAJc3RydWN0IGhpc3RzICpoaXN0cyA9IGJyb3dzZXItPmhpc3RzOwogCXN0cnVjdCBwZXJmX2hwcCBkdW1teV9ocHAgPSB7CkBAIC0xNTA2LDYgKzE1MTMsNyBAQAogCXN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdDsKIAlzaXplX3QgcmV0ID0gMDsKIAlpbnQgY29sdW1uID0gMDsKKwlpbnQgc3BhbiA9IDA7CiAKIAlpZiAoc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbikgewogCQlyZXQgPSBzY25wcmludGYoYnVmLCBzaXplLCAiICAiKTsKQEAgLTE1MTcsMTAgKzE1MjUsMTMgQEAKIAkJaWYgKHBlcmZfaHBwX19zaG91bGRfc2tpcChmbXQsIGhpc3RzKSAgfHwgY29sdW1uKysgPCBicm93c2VyLT5iLmhvcml6X3Njcm9sbCkKIAkJCWNvbnRpbnVlOwogCi0JCXJldCA9IGZtdC0+aGVhZGVyKGZtdCwgJmR1bW15X2hwcCwgaGlzdHMpOworCQlyZXQgPSBmbXQtPmhlYWRlcihmbXQsICZkdW1teV9ocHAsIGhpc3RzLCBsaW5lLCAmc3Bhbik7CiAJCWlmIChhZHZhbmNlX2hwcF9jaGVjaygmZHVtbXlfaHBwLCByZXQpKQogCQkJYnJlYWs7CiAKKwkJaWYgKHNwYW4pCisJCQljb250aW51ZTsKKwogCQlyZXQgPSBzY25wcmludGYoZHVtbXlfaHBwLmJ1ZiwgZHVtbXlfaHBwLnNpemUsICIgICIpOwogCQlpZiAoYWR2YW5jZV9ocHBfY2hlY2soJmR1bW15X2hwcCwgcmV0KSkKIAkJCWJyZWFrOwpAQCAtMTU1NCw3ICsxNTY1LDcgQEAKIAkJaWYgKGNvbHVtbisrIDwgYnJvd3Nlci0+Yi5ob3Jpel9zY3JvbGwpCiAJCQljb250aW51ZTsKIAotCQlyZXQgPSBmbXQtPmhlYWRlcihmbXQsICZkdW1teV9ocHAsIGhpc3RzKTsKKwkJcmV0ID0gZm10LT5oZWFkZXIoZm10LCAmZHVtbXlfaHBwLCBoaXN0cywgMCwgTlVMTCk7CiAJCWlmIChhZHZhbmNlX2hwcF9jaGVjaygmZHVtbXlfaHBwLCByZXQpKQogCQkJYnJlYWs7CiAKQEAgLTE1OTEsNyArMTYwMiw3IEBACiAJCQl9CiAJCQlmaXJzdF9jb2wgPSBmYWxzZTsKIAotCQkJcmV0ID0gZm10LT5oZWFkZXIoZm10LCAmZHVtbXlfaHBwLCBoaXN0cyk7CisJCQlyZXQgPSBmbXQtPmhlYWRlcihmbXQsICZkdW1teV9ocHAsIGhpc3RzLCAwLCBOVUxMKTsKIAkJCWR1bW15X2hwcC5idWZbcmV0XSA9ICdcMCc7CiAKIAkJCXN0YXJ0ID0gdHJpbShkdW1teV9ocHAuYnVmKTsKQEAgLTE2MjIsMTQgKzE2MzMsMjEgQEAKIAogc3RhdGljIHZvaWQgaGlzdHNfYnJvd3Nlcl9faGVhZGVycyhzdHJ1Y3QgaGlzdF9icm93c2VyICpicm93c2VyKQogewotCWNoYXIgaGVhZGVyc1sxMDI0XTsKKwlzdHJ1Y3QgaGlzdHMgKmhpc3RzID0gYnJvd3Nlci0+aGlzdHM7CisJc3RydWN0IHBlcmZfaHBwX2xpc3QgKmhwcF9saXN0ID0gaGlzdHMtPmhwcF9saXN0OwogCi0JaGlzdHNfYnJvd3Nlcl9fc2NucHJpbnRmX2hlYWRlcnMoYnJvd3NlciwgaGVhZGVycywKLQkJCQkJIHNpemVvZihoZWFkZXJzKSk7CisJaW50IGxpbmU7CiAKLQl1aV9icm93c2VyX19nb3RvcmMoJmJyb3dzZXItPmIsIDAsIDApOwotCXVpX2Jyb3dzZXJfX3NldF9jb2xvcigmYnJvd3Nlci0+YiwgSEVfQ09MT1JTRVRfUk9PVCk7Ci0JdWlfYnJvd3Nlcl9fd3JpdGVfbnN0cmluZygmYnJvd3Nlci0+YiwgaGVhZGVycywgYnJvd3Nlci0+Yi53aWR0aCArIDEpOworCWZvciAobGluZSA9IDA7IGxpbmUgPCBocHBfbGlzdC0+bnJfaGVhZGVyX2xpbmVzOyBsaW5lKyspIHsKKwkJY2hhciBoZWFkZXJzWzEwMjRdOworCisJCWhpc3RzX2Jyb3dzZXJfX3NjbnByaW50Zl9oZWFkZXJzKGJyb3dzZXIsIGhlYWRlcnMsCisJCQkJCQkgc2l6ZW9mKGhlYWRlcnMpLCBsaW5lKTsKKworCQl1aV9icm93c2VyX19nb3RvcmMoJmJyb3dzZXItPmIsIGxpbmUsIDApOworCQl1aV9icm93c2VyX19zZXRfY29sb3IoJmJyb3dzZXItPmIsIEhFX0NPTE9SU0VUX1JPT1QpOworCQl1aV9icm93c2VyX193cml0ZV9uc3RyaW5nKCZicm93c2VyLT5iLCBoZWFkZXJzLCBicm93c2VyLT5iLndpZHRoICsgMSk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBoaXN0X2Jyb3dzZXJfX3Nob3dfaGVhZGVycyhzdHJ1Y3QgaGlzdF9icm93c2VyICpicm93c2VyKQpAQCAtMTY1NiwxMCArMTY3NCwxMyBAQAogCXUxNiBoZWFkZXJfb2Zmc2V0ID0gMDsKIAlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CiAJc3RydWN0IGhpc3RfYnJvd3NlciAqaGIgPSBjb250YWluZXJfb2YoYnJvd3Nlciwgc3RydWN0IGhpc3RfYnJvd3NlciwgYik7CisJc3RydWN0IGhpc3RzICpoaXN0cyA9IGhiLT5oaXN0czsKIAogCWlmIChoYi0+c2hvd19oZWFkZXJzKSB7CisJCXN0cnVjdCBwZXJmX2hwcF9saXN0ICpocHBfbGlzdCA9IGhpc3RzLT5ocHBfbGlzdDsKKwogCQloaXN0X2Jyb3dzZXJfX3Nob3dfaGVhZGVycyhoYik7Ci0JCWhlYWRlcl9vZmZzZXQgPSAxOworCQloZWFkZXJfb2Zmc2V0ID0gaHBwX2xpc3QtPm5yX2hlYWRlcl9saW5lczsKIAl9CiAKIAl1aV9icm93c2VyX19oaXN0c19pbml0X3RvcChicm93c2VyKTsKQEAgLTIwNTQsMTAgKzIwNzUsMTAgQEAKIAlicm93c2VyLT5iLnVzZV9uYXZrZXlwcmVzc2VkCT0gdHJ1ZTsKIAlicm93c2VyLT5zaG93X2hlYWRlcnMJCT0gc3ltYm9sX2NvbmYuc2hvd19oaXN0X2hlYWRlcnM7CiAKLQloaXN0c19fZm9yX2VhY2hfZm9ybWF0KGhpc3RzLCBmbXQpIHsKLQkJcGVyZl9ocHBfX3Jlc2V0X3dpZHRoKGZtdCwgaGlzdHMpOworCWhpc3RzX19mb3JfZWFjaF9mb3JtYXQoaGlzdHMsIGZtdCkKIAkJKyticm93c2VyLT5iLmNvbHVtbnM7Ci0JfQorCisJaGlzdHNfX3Jlc2V0X2NvbHVtbl93aWR0aChoaXN0cyk7CiB9CiAKIHN0cnVjdCBoaXN0X2Jyb3dzZXIgKmhpc3RfYnJvd3Nlcl9fbmV3KHN0cnVjdCBoaXN0cyAqaGlzdHMpCkBAIC0yNDE4LDggKzI0MzksNiBAQAogCQlicm93c2VyLT5oaXN0cy0+ZHNvX2ZpbHRlciA9IE5VTEw7CiAJCXVpX2hlbHBsaW5lX19wb3AoKTsKIAl9IGVsc2UgewotCQlpZiAobWFwID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKIAkJdWlfaGVscGxpbmVfX2ZwdXNoKCJUbyB6b29tIG91dCBwcmVzcyBFU0Mgb3IgRU5URVIgKyBcIlpvb20gb3V0IG9mICVzIERTT1wiIiwKIAkJCQkgICBfX21hcF9faXNfa2VybmVsKG1hcCkgPyAidGhlIEtlcm5lbCIgOiBtYXAtPmRzby0+c2hvcnRfbmFtZSk7CiAJCWJyb3dzZXItPmhpc3RzLT5kc29fZmlsdGVyID0gbWFwLT5kc287CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3VpL2Jyb3dzZXJzL21hcC5jIGIvdG9vbHMvcGVyZi91aS9icm93c2Vycy9tYXAuYwppbmRleCA4MDkxMjc3Li45OGEzNDY2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3VpL2Jyb3dzZXJzL21hcC5jCisrKyBiL3Rvb2xzL3BlcmYvdWkvYnJvd3NlcnMvbWFwLmMKQEAgLTUyLDkgKzUyLDkgQEAKIAogCWlmICh0YXJnZXRbMF0gPT0gJzAnICYmIHRvbG93ZXIodGFyZ2V0WzFdKSA9PSAneCcpIHsKIAkJdTY0IGFkZHIgPSBzdHJ0b3VsbCh0YXJnZXQsIE5VTEwsIDE2KTsKLQkJc3ltID0gbWFwX19maW5kX3N5bWJvbChicm93c2VyLT5tYXAsIGFkZHIsIE5VTEwpOworCQlzeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGJyb3dzZXItPm1hcCwgYWRkcik7CiAJfSBlbHNlCi0JCXN5bSA9IG1hcF9fZmluZF9zeW1ib2xfYnlfbmFtZShicm93c2VyLT5tYXAsIHRhcmdldCwgTlVMTCk7CisJCXN5bSA9IG1hcF9fZmluZF9zeW1ib2xfYnlfbmFtZShicm93c2VyLT5tYXAsIHRhcmdldCk7CiAKIAlpZiAoc3ltICE9IE5VTEwpIHsKIAkJdTMyICppZHggPSBzeW1ib2xfX2Jyb3dzZXJfaW5kZXgoc3ltKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdWkvZ3RrL2hpc3RzLmMgYi90b29scy9wZXJmL3VpL2d0ay9oaXN0cy5jCmluZGV4IGM1ZjM2NzcuLmE0ZjAyZGUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdWkvZ3RrL2hpc3RzLmMKKysrIGIvdG9vbHMvcGVyZi91aS9ndGsvaGlzdHMuYwpAQCAtNTQ5LDcgKzU0OSw3IEBACiAJCQkJc3RyY2F0KGJ1ZiwgIisiKTsKIAkJCWZpcnN0X2NvbCA9IGZhbHNlOwogCi0JCQlmbXQtPmhlYWRlcihmbXQsICZocHAsIGhpc3RzKTsKKwkJCWZtdC0+aGVhZGVyKGZtdCwgJmhwcCwgaGlzdHMsIDAsIE5VTEwpOwogCQkJc3RyY2F0KGJ1ZiwgbHRyaW0ocnRyaW0oaHBwLmJ1ZikpKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdWkvaGlzdC5jIGIvdG9vbHMvcGVyZi91aS9oaXN0LmMKaW5kZXggNDI3NDk2OS4uMzczODgzOSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91aS9oaXN0LmMKKysrIGIvdG9vbHMvcGVyZi91aS9oaXN0LmMKQEAgLTIzMCwxMyArMjMwLDE0IEBACiB9CiAKIHN0YXRpYyBpbnQgaHBwX19oZWFkZXJfZm4oc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKLQkJCSAgc3RydWN0IGhpc3RzICpoaXN0cykKKwkJCSAgc3RydWN0IGhpc3RzICpoaXN0cywgaW50IGxpbmUgX19tYXliZV91bnVzZWQsCisJCQkgIGludCAqc3BhbiBfX21heWJlX3VudXNlZCkKIHsKIAlpbnQgbGVuID0gaHBwX193aWR0aF9mbihmbXQsIGhwcCwgaGlzdHMpOwogCXJldHVybiBzY25wcmludGYoaHBwLT5idWYsIGhwcC0+c2l6ZSwgIiUqcyIsIGxlbiwgZm10LT5uYW1lKTsKIH0KIAotc3RhdGljIGludCBocHBfY29sb3Jfc2NucHJpbnRmKHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK2ludCBocHBfY29sb3Jfc2NucHJpbnRmKHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CiAJc3NpemVfdCBzc2l6ZSA9IGhwcC0+c2l6ZTsKQEAgLTQ0MSw2ICs0NDIsNyBAQAogc3RydWN0IHBlcmZfaHBwX2xpc3QgcGVyZl9ocHBfbGlzdCA9IHsKIAkuZmllbGRzCT0gTElTVF9IRUFEX0lOSVQocGVyZl9ocHBfbGlzdC5maWVsZHMpLAogCS5zb3J0cwk9IExJU1RfSEVBRF9JTklUKHBlcmZfaHBwX2xpc3Quc29ydHMpLAorCS5ucl9oZWFkZXJfbGluZXMgPSAxLAogfTsKIAogI3VuZGVmIEhQUF9fQ09MT1JfUFJJTlRfRk5TCkBAIC02OTcsNiArNjk5LDIxIEBACiAJfQogfQogCit2b2lkIGhpc3RzX19yZXNldF9jb2x1bW5fd2lkdGgoc3RydWN0IGhpc3RzICpoaXN0cykKK3sKKwlzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQ7CisJc3RydWN0IHBlcmZfaHBwX2xpc3Rfbm9kZSAqbm9kZTsKKworCWhpc3RzX19mb3JfZWFjaF9mb3JtYXQoaGlzdHMsIGZtdCkKKwkJcGVyZl9ocHBfX3Jlc2V0X3dpZHRoKGZtdCwgaGlzdHMpOworCisJLyogaGllcmFyY2h5IGVudHJpZXMgaGF2ZSB0aGVpciBvd24gaHBwIGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsICZoaXN0cy0+aHBwX2Zvcm1hdHMsIGxpc3QpIHsKKwkJcGVyZl9ocHBfbGlzdF9fZm9yX2VhY2hfZm9ybWF0KCZub2RlLT5ocHAsIGZtdCkKKwkJCXBlcmZfaHBwX19yZXNldF93aWR0aChmbXQsIGhpc3RzKTsKKwl9Cit9CisKIHZvaWQgcGVyZl9ocHBfX3NldF91c2VyX3dpZHRoKGNvbnN0IGNoYXIgKndpZHRoX2xpc3Rfc3RyKQogewogCXN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdWkvc3RkaW8vaGlzdC5jIGIvdG9vbHMvcGVyZi91aS9zdGRpby9oaXN0LmMKaW5kZXggZjA0YTYzMS4uODlkODQ0MSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91aS9zdGRpby9oaXN0LmMKKysrIGIvdG9vbHMvcGVyZi91aS9zdGRpby9oaXN0LmMKQEAgLTM3Myw3ICszNzMsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGhpc3RfZW50cnlfX3NucHJpbnRmKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSwgc3RydWN0IHBlcmZfaHBwICpocHApCitpbnQgX19oaXN0X2VudHJ5X19zbnByaW50ZihzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUsIHN0cnVjdCBwZXJmX2hwcCAqaHBwLAorCQkJICAgc3RydWN0IHBlcmZfaHBwX2xpc3QgKmhwcF9saXN0KQogewogCWNvbnN0IGNoYXIgKnNlcCA9IHN5bWJvbF9jb25mLmZpZWxkX3NlcDsKIAlzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQ7CkBAIC0zODQsNyArMzg1LDcgQEAKIAlpZiAoc3ltYm9sX2NvbmYuZXhjbHVkZV9vdGhlciAmJiAhaGUtPnBhcmVudCkKIAkJcmV0dXJuIDA7CiAKLQloaXN0c19fZm9yX2VhY2hfZm9ybWF0KGhlLT5oaXN0cywgZm10KSB7CisJcGVyZl9ocHBfbGlzdF9fZm9yX2VhY2hfZm9ybWF0KGhwcF9saXN0LCBmbXQpIHsKIAkJaWYgKHBlcmZfaHBwX19zaG91bGRfc2tpcChmbXQsIGhlLT5oaXN0cykpCiAJCQljb250aW51ZTsKIApAQCAtNDEwLDYgKzQxMSwxMSBAQAogCXJldHVybiBocHAtPmJ1ZiAtIHN0YXJ0OwogfQogCitzdGF0aWMgaW50IGhpc3RfZW50cnlfX3NucHJpbnRmKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSwgc3RydWN0IHBlcmZfaHBwICpocHApCit7CisJcmV0dXJuIF9faGlzdF9lbnRyeV9fc25wcmludGYoaGUsIGhwcCwgaGUtPmhpc3RzLT5ocHBfbGlzdCk7Cit9CisKIHN0YXRpYyBpbnQgaGlzdF9lbnRyeV9faGllcmFyY2h5X2ZwcmludGYoc3RydWN0IGhpc3RfZW50cnkgKmhlLAogCQkJCQkgc3RydWN0IHBlcmZfaHBwICpocHAsCiAJCQkJCSBzdHJ1Y3QgaGlzdHMgKmhpc3RzLApAQCAtNTI4LDggKzUzNCw4IEBACiAJcmV0dXJuIGZwcmludGYoZnAsICIlLS4qcyIsIChpbmRlbnQgLSAyKSAqIEhJRVJBUkNIWV9JTkRFTlQsIGxpbmUpOwogfQogCi1zdGF0aWMgaW50IHByaW50X2hpZXJhcmNoeV9oZWFkZXIoc3RydWN0IGhpc3RzICpoaXN0cywgc3RydWN0IHBlcmZfaHBwICpocHAsCi0JCQkJICBjb25zdCBjaGFyICpzZXAsIEZJTEUgKmZwKQorc3RhdGljIGludCBoaXN0c19fZnByaW50Zl9oaWVyYXJjaHlfaGVhZGVycyhzdHJ1Y3QgaGlzdHMgKmhpc3RzLAorCQkJCQkgICAgc3RydWN0IHBlcmZfaHBwICpocHAsIEZJTEUgKmZwKQogewogCWJvb2wgZmlyc3Rfbm9kZSwgZmlyc3RfY29sOwogCWludCBpbmRlbnQ7CkBAIC01MzgsNiArNTQ0LDcgQEAKIAl1bnNpZ25lZCBoZWFkZXJfd2lkdGggPSAwOwogCXN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdDsKIAlzdHJ1Y3QgcGVyZl9ocHBfbGlzdF9ub2RlICpmbXRfbm9kZTsKKwljb25zdCBjaGFyICpzZXAgPSBzeW1ib2xfY29uZi5maWVsZF9zZXA7CiAKIAlpbmRlbnQgPSBoaXN0cy0+bnJfaHBwX25vZGU7CiAKQEAgLTU0OSw3ICs1NTYsNyBAQAogCQkJCSAgICBzdHJ1Y3QgcGVyZl9ocHBfbGlzdF9ub2RlLCBsaXN0KTsKIAogCXBlcmZfaHBwX2xpc3RfX2Zvcl9lYWNoX2Zvcm1hdCgmZm10X25vZGUtPmhwcCwgZm10KSB7Ci0JCWZtdC0+aGVhZGVyKGZtdCwgaHBwLCBoaXN0cyk7CisJCWZtdC0+aGVhZGVyKGZtdCwgaHBwLCBoaXN0cywgMCwgTlVMTCk7CiAJCWZwcmludGYoZnAsICIlcyVzIiwgaHBwLT5idWYsIHNlcCA/OiAiICAiKTsKIAl9CiAKQEAgLTU2OSw3ICs1NzYsNyBAQAogCQkJCWhlYWRlcl93aWR0aCArPSBmcHJpbnRmKGZwLCAiKyIpOwogCQkJZmlyc3RfY29sID0gZmFsc2U7CiAKLQkJCWZtdC0+aGVhZGVyKGZtdCwgaHBwLCBoaXN0cyk7CisJCQlmbXQtPmhlYWRlcihmbXQsIGhwcCwgaGlzdHMsIDAsIE5VTEwpOwogCiAJCQloZWFkZXJfd2lkdGggKz0gZnByaW50ZihmcCwgIiVzIiwgdHJpbShocHAtPmJ1ZikpOwogCQl9CkBAIC02MjMsMjAgKzYzMCwyOCBAQAogCXJldHVybiAyOwogfQogCi1zdGF0aWMgaW50Ci1oaXN0c19fZnByaW50Zl9oaWVyYXJjaHlfaGVhZGVycyhzdHJ1Y3QgaGlzdHMgKmhpc3RzLAotCQkJCSBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKLQkJCQkgRklMRSAqZnApCitzdGF0aWMgdm9pZCBmcHJpbnRmX2xpbmUoc3RydWN0IGhpc3RzICpoaXN0cywgc3RydWN0IHBlcmZfaHBwICpocHAsCisJCQkgaW50IGxpbmUsIEZJTEUgKmZwKQogewotCXN0cnVjdCBwZXJmX2hwcF9saXN0X25vZGUgKmZtdF9ub2RlOwogCXN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdDsKKwljb25zdCBjaGFyICpzZXAgPSBzeW1ib2xfY29uZi5maWVsZF9zZXA7CisJYm9vbCBmaXJzdCA9IHRydWU7CisJaW50IHNwYW4gPSAwOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShmbXRfbm9kZSwgJmhpc3RzLT5ocHBfZm9ybWF0cywgbGlzdCkgewotCQlwZXJmX2hwcF9saXN0X19mb3JfZWFjaF9mb3JtYXQoJmZtdF9ub2RlLT5ocHAsIGZtdCkKLQkJCXBlcmZfaHBwX19yZXNldF93aWR0aChmbXQsIGhpc3RzKTsKKwloaXN0c19fZm9yX2VhY2hfZm9ybWF0KGhpc3RzLCBmbXQpIHsKKwkJaWYgKHBlcmZfaHBwX19zaG91bGRfc2tpcChmbXQsIGhpc3RzKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghZmlyc3QgJiYgIXNwYW4pCisJCQlmcHJpbnRmKGZwLCAiJXMiLCBzZXAgPzogIiAgIik7CisJCWVsc2UKKwkJCWZpcnN0ID0gZmFsc2U7CisKKwkJZm10LT5oZWFkZXIoZm10LCBocHAsIGhpc3RzLCBsaW5lLCAmc3Bhbik7CisKKwkJaWYgKCFzcGFuKQorCQkJZnByaW50ZihmcCwgIiVzIiwgaHBwLT5idWYpOwogCX0KLQotCXJldHVybiBwcmludF9oaWVyYXJjaHlfaGVhZGVyKGhpc3RzLCBocHAsIHN5bWJvbF9jb25mLmZpZWxkX3NlcCwgZnApOwogfQogCiBzdGF0aWMgaW50CkBAIC02NDQsMjggKzY1OSwyMyBAQAogCQkJCXN0cnVjdCBwZXJmX2hwcCAqaHBwLAogCQkJCUZJTEUgKmZwKQogeworCXN0cnVjdCBwZXJmX2hwcF9saXN0ICpocHBfbGlzdCA9IGhpc3RzLT5ocHBfbGlzdDsKIAlzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQ7CiAJdW5zaWduZWQgaW50IHdpZHRoOwogCWNvbnN0IGNoYXIgKnNlcCA9IHN5bWJvbF9jb25mLmZpZWxkX3NlcDsKIAlib29sIGZpcnN0ID0gdHJ1ZTsKKwlpbnQgbGluZTsKIAotCWhpc3RzX19mb3JfZWFjaF9mb3JtYXQoaGlzdHMsIGZtdCkgewotCQlpZiAocGVyZl9ocHBfX3Nob3VsZF9za2lwKGZtdCwgaGlzdHMpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCFmaXJzdCkKLQkJCWZwcmludGYoZnAsICIlcyIsIHNlcCA/OiAiICAiKTsKLQkJZWxzZQotCQkJZmlyc3QgPSBmYWxzZTsKLQotCQlmbXQtPmhlYWRlcihmbXQsIGhwcCwgaGlzdHMpOwotCQlmcHJpbnRmKGZwLCAiJXMiLCBocHAtPmJ1Zik7CisJZm9yIChsaW5lID0gMDsgbGluZSA8IGhwcF9saXN0LT5ucl9oZWFkZXJfbGluZXM7IGxpbmUrKykgeworCQkvKiBmaXJzdCAjIGlzIGRpc3BsYXllZCBvbmUgbGV2ZWwgdXAgKi8KKwkJaWYgKGxpbmUpCisJCQlmcHJpbnRmKGZwLCAiIyAiKTsKKwkJZnByaW50Zl9saW5lKGhpc3RzLCBocHAsIGxpbmUsIGZwKTsKKwkJZnByaW50ZihmcCwgIlxuIik7CiAJfQogCi0JZnByaW50ZihmcCwgIlxuIik7Ci0KIAlpZiAoc2VwKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIGhwcF9saXN0LT5ucl9oZWFkZXJfbGluZXM7CiAKIAlmaXJzdCA9IHRydWU7CiAKQEAgLTY4OSwxMiArNjk5LDEyIEBACiAKIAlmcHJpbnRmKGZwLCAiXG4iKTsKIAlmcHJpbnRmKGZwLCAiI1xuIik7Ci0JcmV0dXJuIDM7CisJcmV0dXJuIGhwcF9saXN0LT5ucl9oZWFkZXJfbGluZXMgKyAyOwogfQogCi1zdGF0aWMgaW50IGhpc3RzX19mcHJpbnRmX2hlYWRlcnMoc3RydWN0IGhpc3RzICpoaXN0cywgRklMRSAqZnApCitpbnQgaGlzdHNfX2ZwcmludGZfaGVhZGVycyhzdHJ1Y3QgaGlzdHMgKmhpc3RzLCBGSUxFICpmcCkKIHsKLQljaGFyIGJmWzk2XTsKKwljaGFyIGJmWzEwMjRdOwogCXN0cnVjdCBwZXJmX2hwcCBkdW1teV9ocHAgPSB7CiAJCS5idWYJPSBiZiwKIAkJLnNpemUJPSBzaXplb2YoYmYpLApAQCAtNzEzLDcgKzcyMyw2IEBACiAJCSAgICAgIGludCBtYXhfY29scywgZmxvYXQgbWluX3BjbnQsIEZJTEUgKmZwLAogCQkgICAgICBib29sIHVzZV9jYWxsY2hhaW4pCiB7Ci0Jc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10OwogCXN0cnVjdCByYl9ub2RlICpuZDsKIAlzaXplX3QgcmV0ID0gMDsKIAljb25zdCBjaGFyICpzZXAgPSBzeW1ib2xfY29uZi5maWVsZF9zZXA7CkBAIC03MjQsOCArNzMzLDcgQEAKIAogCWluaXRfcmVtX2hpdHMoKTsKIAotCWhpc3RzX19mb3JfZWFjaF9mb3JtYXQoaGlzdHMsIGZtdCkKLQkJcGVyZl9ocHBfX3Jlc2V0X3dpZHRoKGZtdCwgaGlzdHMpOworCWhpc3RzX19yZXNldF9jb2x1bW5fd2lkdGgoaGlzdHMpOwogCiAJaWYgKHN5bWJvbF9jb25mLmNvbF93aWR0aF9saXN0X3N0cikKIAkJcGVyZl9ocHBfX3NldF91c2VyX3dpZHRoKHN5bWJvbF9jb25mLmNvbF93aWR0aF9saXN0X3N0cik7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvQnVpbGQgYi90b29scy9wZXJmL3V0aWwvQnVpbGQKaW5kZXggOTFjNWY2ZS4uZWI2MGU2MSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL0J1aWxkCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9CdWlsZApAQCAtMSw1ICsxLDYgQEAKIGxpYnBlcmYteSArPSBhbGlhcy5vCiBsaWJwZXJmLXkgKz0gYW5ub3RhdGUubworbGlicGVyZi15ICs9IGJsb2NrLXJhbmdlLm8KIGxpYnBlcmYteSArPSBidWlsZC1pZC5vCiBsaWJwZXJmLXkgKz0gY29uZmlnLm8KIGxpYnBlcmYteSArPSBjdHlwZS5vCkBAIC04NSw2ICs4Niw3IEBACiBsaWJwZXJmLXkgKz0gaGVscC11bmtub3duLWNtZC5vCiBsaWJwZXJmLXkgKz0gbWVtLWV2ZW50cy5vCiBsaWJwZXJmLXkgKz0gdnNwcmludGYubworbGlicGVyZi15ICs9IGRydl9jb25maWdzLm8KIAogbGlicGVyZi0kKENPTkZJR19MSUJCUEYpICs9IGJwZi1sb2FkZXIubwogbGlicGVyZi0kKENPTkZJR19CUEZfUFJPTE9HVUUpICs9IGJwZi1wcm9sb2d1ZS5vCkBAIC05OCw2ICsxMDAsNyBAQAogCiBsaWJwZXJmLSQoQ09ORklHX0RXQVJGKSArPSBwcm9iZS1maW5kZXIubwogbGlicGVyZi0kKENPTkZJR19EV0FSRikgKz0gZHdhcmYtYXV4Lm8KK2xpYnBlcmYtJChDT05GSUdfRFdBUkYpICs9IGR3YXJmLXJlZ3MubwogCiBsaWJwZXJmLSQoQ09ORklHX0xJQkRXX0RXQVJGX1VOV0lORCkgKz0gdW53aW5kLWxpYmR3Lm8KIGxpYnBlcmYtJChDT05GSUdfTE9DQUxfTElCVU5XSU5EKSAgICArPSB1bndpbmQtbGlidW53aW5kLWxvY2FsLm8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9hbm5vdGF0ZS5jIGIvdG9vbHMvcGVyZi91dGlsL2Fubm90YXRlLmMKaW5kZXggNDAyNGQzMC4uYWViNWE0NCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2Fubm90YXRlLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2Fubm90YXRlLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImFubm90YXRlLmgiCiAjaW5jbHVkZSAiZXZzZWwuaCIKKyNpbmNsdWRlICJibG9jay1yYW5nZS5oIgogI2luY2x1ZGUgPHJlZ2V4Lmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgpAQCAtNTMsNyArNTQsNyBAQAogCXJldHVybiBpbnNfX3Jhd19zY25wcmludGYoaW5zLCBiZiwgc2l6ZSwgb3BzKTsKIH0KIAotc3RhdGljIGludCBjYWxsX19wYXJzZShzdHJ1Y3QgaW5zX29wZXJhbmRzICpvcHMpCitzdGF0aWMgaW50IGNhbGxfX3BhcnNlKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcywgc3RydWN0IG1hcCAqbWFwKQogewogCWNoYXIgKmVuZHB0ciwgKnRvaywgKm5hbWU7CiAKQEAgLTgxLDE2ICs4MiwxNiBAQAogCXJldHVybiBvcHMtPnRhcmdldC5uYW1lID09IE5VTEwgPyAtMSA6IDA7CiAKIGluZGlyZWN0X2NhbGw6Ci0JdG9rID0gc3RyY2hyKGVuZHB0ciwgJygnKTsKLQlpZiAodG9rICE9IE5VTEwpIHsKLQkJb3BzLT50YXJnZXQuYWRkciA9IDA7CisJdG9rID0gc3RyY2hyKGVuZHB0ciwgJyonKTsKKwlpZiAodG9rID09IE5VTEwpIHsKKwkJc3RydWN0IHN5bWJvbCAqc3ltID0gbWFwX19maW5kX3N5bWJvbChtYXAsIG1hcC0+bWFwX2lwKG1hcCwgb3BzLT50YXJnZXQuYWRkcikpOworCQlpZiAoc3ltICE9IE5VTEwpCisJCQlvcHMtPnRhcmdldC5uYW1lID0gc3RyZHVwKHN5bS0+bmFtZSk7CisJCWVsc2UKKwkJCW9wcy0+dGFyZ2V0LmFkZHIgPSAwOwogCQlyZXR1cm4gMDsKIAl9CiAKLQl0b2sgPSBzdHJjaHIoZW5kcHRyLCAnKicpOwotCWlmICh0b2sgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCiAJb3BzLT50YXJnZXQuYWRkciA9IHN0cnRvdWxsKHRvayArIDEsIE5VTEwsIDE2KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTExNyw3ICsxMTgsNyBAQAogCXJldHVybiBpbnMtPm9wcyA9PSAmY2FsbF9vcHM7CiB9CiAKLXN0YXRpYyBpbnQganVtcF9fcGFyc2Uoc3RydWN0IGluc19vcGVyYW5kcyAqb3BzKQorc3RhdGljIGludCBqdW1wX19wYXJzZShzdHJ1Y3QgaW5zX29wZXJhbmRzICpvcHMsIHN0cnVjdCBtYXAgKm1hcCBfX21heWJlX3VudXNlZCkKIHsKIAljb25zdCBjaGFyICpzID0gc3RyY2hyKG9wcy0+cmF3LCAnKycpOwogCkBAIC0xNzIsNyArMTczLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBsb2NrX19wYXJzZShzdHJ1Y3QgaW5zX29wZXJhbmRzICpvcHMpCitzdGF0aWMgaW50IGxvY2tfX3BhcnNlKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcywgc3RydWN0IG1hcCAqbWFwKQogewogCWNoYXIgKm5hbWU7CiAKQEAgLTE5Myw3ICsxOTQsNyBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChvcHMtPmxvY2tlZC5pbnMtPm9wcy0+cGFyc2UgJiYKLQkgICAgb3BzLT5sb2NrZWQuaW5zLT5vcHMtPnBhcnNlKG9wcy0+bG9ja2VkLm9wcykgPCAwKQorCSAgICBvcHMtPmxvY2tlZC5pbnMtPm9wcy0+cGFyc2Uob3BzLT5sb2NrZWQub3BzLCBtYXApIDwgMCkKIAkJZ290byBvdXRfZnJlZV9vcHM7CiAKIAlyZXR1cm4gMDsKQEAgLTIzNiw3ICsyMzcsNyBAQAogCS5zY25wcmludGYgPSBsb2NrX19zY25wcmludGYsCiB9OwogCi1zdGF0aWMgaW50IG1vdl9fcGFyc2Uoc3RydWN0IGluc19vcGVyYW5kcyAqb3BzKQorc3RhdGljIGludCBtb3ZfX3BhcnNlKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcywgc3RydWN0IG1hcCAqbWFwIF9fbWF5YmVfdW51c2VkKQogewogCWNoYXIgKnMgPSBzdHJjaHIob3BzLT5yYXcsICcsJyksICp0YXJnZXQsICpjb21tZW50LCBwcmV2OwogCkBAIC0zMDMsNyArMzA0LDcgQEAKIAkuc2NucHJpbnRmID0gbW92X19zY25wcmludGYsCiB9OwogCi1zdGF0aWMgaW50IGRlY19fcGFyc2Uoc3RydWN0IGluc19vcGVyYW5kcyAqb3BzKQorc3RhdGljIGludCBkZWNfX3BhcnNlKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcywgc3RydWN0IG1hcCAqbWFwIF9fbWF5YmVfdW51c2VkKQogewogCWNoYXIgKnRhcmdldCwgKmNvbW1lbnQsICpzLCBwcmV2OwogCkBAIC00OTEsMTMgKzQ5Miw2IEBACiAJcmV0dXJuIGJzZWFyY2gobmFtZSwgaW5zdHJ1Y3Rpb25zLCBubWVtYiwgc2l6ZW9mKHN0cnVjdCBpbnMpLCBpbnNfX2tleV9jbXApOwogfQogCi1pbnQgc3ltYm9sX19hbm5vdGF0ZV9pbml0KHN0cnVjdCBtYXAgKm1hcCBfX21heWJlX3VudXNlZCwgc3RydWN0IHN5bWJvbCAqc3ltKQotewotCXN0cnVjdCBhbm5vdGF0aW9uICpub3RlcyA9IHN5bWJvbF9fYW5ub3RhdGlvbihzeW0pOwotCXB0aHJlYWRfbXV0ZXhfaW5pdCgmbm90ZXMtPmxvY2ssIE5VTEwpOwotCXJldHVybiAwOwotfQotCiBpbnQgc3ltYm9sX19hbGxvY19oaXN0KHN0cnVjdCBzeW1ib2wgKnN5bSkKIHsKIAlzdHJ1Y3QgYW5ub3RhdGlvbiAqbm90ZXMgPSBzeW1ib2xfX2Fubm90YXRpb24oc3ltKTsKQEAgLTcxNSw3ICs3MDksNyBAQAogCXJldHVybiBzeW1ib2xfX2luY19hZGRyX3NhbXBsZXMoaGUtPm1zLnN5bSwgaGUtPm1zLm1hcCwgZXZpZHgsIGlwKTsKIH0KIAotc3RhdGljIHZvaWQgZGlzYXNtX2xpbmVfX2luaXRfaW5zKHN0cnVjdCBkaXNhc21fbGluZSAqZGwpCitzdGF0aWMgdm9pZCBkaXNhc21fbGluZV9faW5pdF9pbnMoc3RydWN0IGRpc2FzbV9saW5lICpkbCwgc3RydWN0IG1hcCAqbWFwKQogewogCWRsLT5pbnMgPSBpbnNfX2ZpbmQoZGwtPm5hbWUpOwogCkBAIC03MjUsNyArNzE5LDcgQEAKIAlpZiAoIWRsLT5pbnMtPm9wcykKIAkJcmV0dXJuOwogCi0JaWYgKGRsLT5pbnMtPm9wcy0+cGFyc2UgJiYgZGwtPmlucy0+b3BzLT5wYXJzZSgmZGwtPm9wcykgPCAwKQorCWlmIChkbC0+aW5zLT5vcHMtPnBhcnNlICYmIGRsLT5pbnMtPm9wcy0+cGFyc2UoJmRsLT5vcHMsIG1hcCkgPCAwKQogCQlkbC0+aW5zID0gTlVMTDsKIH0KIApAQCAtNzY3LDcgKzc2MSw4IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGlzYXNtX2xpbmUgKmRpc2FzbV9saW5lX19uZXcoczY0IG9mZnNldCwgY2hhciAqbGluZSwKLQkJCQkJc2l6ZV90IHByaXZzaXplLCBpbnQgbGluZV9ucikKKwkJCQkJICAgIHNpemVfdCBwcml2c2l6ZSwgaW50IGxpbmVfbnIsCisJCQkJCSAgICBzdHJ1Y3QgbWFwICptYXApCiB7CiAJc3RydWN0IGRpc2FzbV9saW5lICpkbCA9IHphbGxvYyhzaXplb2YoKmRsKSArIHByaXZzaXplKTsKIApAQCAtNzgyLDcgKzc3Nyw3IEBACiAJCQlpZiAoZGlzYXNtX2xpbmVfX3BhcnNlKGRsLT5saW5lLCAmZGwtPm5hbWUsICZkbC0+b3BzLnJhdykgPCAwKQogCQkJCWdvdG8gb3V0X2ZyZWVfbGluZTsKIAotCQkJZGlzYXNtX2xpbmVfX2luaXRfaW5zKGRsKTsKKwkJCWRpc2FzbV9saW5lX19pbml0X2lucyhkbCwgbWFwKTsKIAkJfQogCX0KIApAQCAtODY2LDYgKzg2MSw4OSBAQAogCXJldHVybiBwZXJjZW50OwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqYW5ub3RhdGVfX2FkZHJlc3NfY29sb3Ioc3RydWN0IGJsb2NrX3JhbmdlICpicikKK3sKKwlkb3VibGUgY292ID0gYmxvY2tfcmFuZ2VfX2NvdmVyYWdlKGJyKTsKKworCWlmIChjb3YgPj0gMCkgeworCQkvKiBtYXJrIHJlZCBmb3IgPjc1JSBjb3ZlcmFnZSAqLworCQlpZiAoY292ID4gMC43NSkKKwkJCXJldHVybiBQRVJGX0NPTE9SX1JFRDsKKworCQkvKiBtYXJrIGR1bGwgZm9yIDwxJSBjb3ZlcmFnZSAqLworCQlpZiAoY292IDwgMC4wMSkKKwkJCXJldHVybiBQRVJGX0NPTE9SX05PUk1BTDsKKwl9CisKKwlyZXR1cm4gUEVSRl9DT0xPUl9NQUdFTlRBOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYW5ub3RhdGVfX2FzbV9jb2xvcihzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmJyKQoreworCWRvdWJsZSBjb3YgPSBibG9ja19yYW5nZV9fY292ZXJhZ2UoYnIpOworCisJaWYgKGNvdiA+PSAwKSB7CisJCS8qIG1hcmsgZHVsbCBmb3IgPDElIGNvdmVyYWdlICovCisJCWlmIChjb3YgPCAwLjAxKQorCQkJcmV0dXJuIFBFUkZfQ09MT1JfTk9STUFMOworCX0KKworCXJldHVybiBQRVJGX0NPTE9SX0JMVUU7Cit9CisKK3N0YXRpYyB2b2lkIGFubm90YXRlX19icmFuY2hfcHJpbnRmKHN0cnVjdCBibG9ja19yYW5nZSAqYnIsIHU2NCBhZGRyKQoreworCWJvb2wgZW1pdF9jb21tZW50ID0gdHJ1ZTsKKworCWlmICghYnIpCisJCXJldHVybjsKKworI2lmIDEKKwlpZiAoYnItPmlzX3RhcmdldCAmJiBici0+c3RhcnQgPT0gYWRkcikgeworCQlzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmJyYW5jaCA9IGJyOworCQlkb3VibGUgcDsKKworCQkvKgorCQkgKiBGaW5kIG1hdGNoaW5nIGJyYW5jaCB0byBvdXIgdGFyZ2V0LgorCQkgKi8KKwkJd2hpbGUgKCFicmFuY2gtPmlzX2JyYW5jaCkKKwkJCWJyYW5jaCA9IGJsb2NrX3JhbmdlX19uZXh0KGJyYW5jaCk7CisKKwkJcCA9IDEwMCAqKGRvdWJsZSlici0+ZW50cnkgLyBicmFuY2gtPmNvdmVyYWdlOworCisJCWlmIChwID4gMC4xKSB7CisJCQlpZiAoZW1pdF9jb21tZW50KSB7CisJCQkJZW1pdF9jb21tZW50ID0gZmFsc2U7CisJCQkJcHJpbnRmKCJcdCMiKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFRoZSBwZXJjZW50YWdlIG9mIGNvdmVyYWdlIGpvaW5lZCBhdCB0aGlzIHRhcmdldCBpbiByZWxhdGlvbgorCQkJICogdG8gdGhlIG5leHQgYnJhbmNoLgorCQkJICovCisJCQlwcmludGYoIiArJS4yZiUlIiwgcCk7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoYnItPmlzX2JyYW5jaCAmJiBici0+ZW5kID09IGFkZHIpIHsKKwkJZG91YmxlIHAgPSAxMDAqKGRvdWJsZSlici0+dGFrZW4gLyBici0+Y292ZXJhZ2U7CisKKwkJaWYgKHAgPiAwLjEpIHsKKwkJCWlmIChlbWl0X2NvbW1lbnQpIHsKKwkJCQllbWl0X2NvbW1lbnQgPSBmYWxzZTsKKwkJCQlwcmludGYoIlx0IyIpOworCQkJfQorCisJCQkvKgorCQkJICogVGhlIHBlcmNlbnRhZ2Ugb2YgY292ZXJhZ2UgbGVhdmluZyBhdCB0aGlzIGJyYW5jaCwgYW5kCisJCQkgKiBpdHMgcHJlZGljdGlvbiByYXRpby4KKwkJCSAqLworCQkJcHJpbnRmKCIgLSUuMmYlJSAocDolLjJmJSUpIiwgcCwgMTAwKihkb3VibGUpYnItPnByZWQgIC8gYnItPnRha2VuKTsKKwkJfQorCX0KK30KKworCiBzdGF0aWMgaW50IGRpc2FzbV9saW5lX19wcmludChzdHJ1Y3QgZGlzYXNtX2xpbmUgKmRsLCBzdHJ1Y3Qgc3ltYm9sICpzeW0sIHU2NCBzdGFydCwKIAkJICAgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCB1NjQgbGVuLCBpbnQgbWluX3BjbnQsIGludCBwcmludGVkLAogCQkgICAgICBpbnQgbWF4X2xpbmVzLCBzdHJ1Y3QgZGlzYXNtX2xpbmUgKnF1ZXVlKQpAQCAtODg1LDYgKzk2Myw3IEBACiAJCXM2NCBvZmZzZXQgPSBkbC0+b2Zmc2V0OwogCQljb25zdCB1NjQgYWRkciA9IHN0YXJ0ICsgb2Zmc2V0OwogCQlzdHJ1Y3QgZGlzYXNtX2xpbmUgKm5leHQ7CisJCXN0cnVjdCBibG9ja19yYW5nZSAqYnI7CiAKIAkJbmV4dCA9IGRpc2FzbV9fZ2V0X25leHRfaXBfbGluZSgmbm90ZXMtPnNyYy0+c291cmNlLCBkbCk7CiAKQEAgLTk1NCw4ICsxMDMzLDEyIEBACiAJCX0KIAogCQlwcmludGYoIiA6CSIpOwotCQljb2xvcl9mcHJpbnRmKHN0ZG91dCwgUEVSRl9DT0xPUl9NQUdFTlRBLCAiICAlIiBQUkl4NjQgIjoiLCBhZGRyKTsKLQkJY29sb3JfZnByaW50ZihzdGRvdXQsIFBFUkZfQ09MT1JfQkxVRSwgIiVzXG4iLCBkbC0+bGluZSk7CisKKwkJYnIgPSBibG9ja19yYW5nZV9fZmluZChhZGRyKTsKKwkJY29sb3JfZnByaW50ZihzdGRvdXQsIGFubm90YXRlX19hZGRyZXNzX2NvbG9yKGJyKSwgIiAgJSIgUFJJeDY0ICI6IiwgYWRkcik7CisJCWNvbG9yX2ZwcmludGYoc3Rkb3V0LCBhbm5vdGF0ZV9fYXNtX2NvbG9yKGJyKSwgIiVzIiwgZGwtPmxpbmUpOworCQlhbm5vdGF0ZV9fYnJhbmNoX3ByaW50ZihiciwgYWRkcik7CisJCXByaW50ZigiXG4iKTsKIAogCQlpZiAocHBlcmNlbnRzICE9ICZwZXJjZW50KQogCQkJZnJlZShwcGVyY2VudHMpOwpAQCAtMTA2Niw3ICsxMTQ5LDcgQEAKIAkJCXBhcnNlZF9saW5lID0gdG1wMiArIDE7CiAJfQogCi0JZGwgPSBkaXNhc21fbGluZV9fbmV3KG9mZnNldCwgcGFyc2VkX2xpbmUsIHByaXZzaXplLCAqbGluZV9ucik7CisJZGwgPSBkaXNhc21fbGluZV9fbmV3KG9mZnNldCwgcGFyc2VkX2xpbmUsIHByaXZzaXplLCAqbGluZV9uciwgbWFwKTsKIAlmcmVlKGxpbmUpOwogCSgqbGluZV9ucikrKzsKIApAQCAtMTA4NCw3ICsxMTY3LDcgQEAKIAkJCS5hZGRyID0gZGwtPm9wcy50YXJnZXQuYWRkciwKIAkJfTsKIAotCQlpZiAoIW1hcF9ncm91cHNfX2ZpbmRfYW1zKCZ0YXJnZXQsIE5VTEwpICYmCisJCWlmICghbWFwX2dyb3Vwc19fZmluZF9hbXMoJnRhcmdldCkgJiYKIAkJICAgIHRhcmdldC5zeW0tPnN0YXJ0ID09IHRhcmdldC5hbF9hZGRyKQogCQkJZGwtPm9wcy50YXJnZXQubmFtZSA9IHN0cmR1cCh0YXJnZXQuc3ltLT5uYW1lKTsKIAl9CkBAIC0xMTYyLDE0ICsxMjQ1LDQ2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZHNvX19kaXNhc3NlbWJsZV9maWxlbmFtZShzdHJ1Y3QgZHNvICpkc28sIGNoYXIgKmZpbGVuYW1lLCBzaXplX3QgZmlsZW5hbWVfc2l6ZSkKK3sKKwljaGFyIGxpbmtuYW1lW1BBVEhfTUFYXTsKKwljaGFyICpidWlsZF9pZF9maWxlbmFtZTsKKworCWlmIChkc28tPnN5bXRhYl90eXBlID09IERTT19CSU5BUllfVFlQRV9fS0FMTFNZTVMgJiYKKwkgICAgIWRzb19faXNfa2NvcmUoZHNvKSkKKwkJcmV0dXJuIFNZTUJPTF9BTk5PVEFURV9FUlJOT19fTk9fVk1MSU5VWDsKKworCWJ1aWxkX2lkX2ZpbGVuYW1lID0gZHNvX19idWlsZF9pZF9maWxlbmFtZShkc28sIE5VTEwsIDApOworCWlmIChidWlsZF9pZF9maWxlbmFtZSkgeworCQlfX3N5bWJvbF9fam9pbl9zeW1mcyhmaWxlbmFtZSwgZmlsZW5hbWVfc2l6ZSwgYnVpbGRfaWRfZmlsZW5hbWUpOworCQlmcmVlKGJ1aWxkX2lkX2ZpbGVuYW1lKTsKKwl9IGVsc2UgeworCQlpZiAoZHNvLT5oYXNfYnVpbGRfaWQpCisJCQlyZXR1cm4gRU5PTUVNOworCQlnb3RvIGZhbGxiYWNrOworCX0KKworCWlmIChkc29fX2lzX2tjb3JlKGRzbykgfHwKKwkgICAgcmVhZGxpbmsoZmlsZW5hbWUsIGxpbmtuYW1lLCBzaXplb2YobGlua25hbWUpKSA8IDAgfHwKKwkgICAgc3Ryc3RyKGxpbmtuYW1lLCBEU09fX05BTUVfS0FMTFNZTVMpIHx8CisJICAgIGFjY2VzcyhmaWxlbmFtZSwgUl9PSykpIHsKK2ZhbGxiYWNrOgorCQkvKgorCQkgKiBJZiB3ZSBkb24ndCBoYXZlIGJ1aWxkLWlkcyBvciB0aGUgYnVpbGQtaWQgZmlsZSBpc24ndCBpbiB0aGUKKwkJICogY2FjaGUsIG9yIGlzIGp1c3QgYSBrYWxsc3ltcyBmaWxlLCB3ZWxsLCBsZXRzIGhvcGUgdGhhdCB0aGlzCisJCSAqIERTTyBpcyB0aGUgc2FtZSBhcyB3aGVuICdwZXJmIHJlY29yZCcgcmFuLgorCQkgKi8KKwkJX19zeW1ib2xfX2pvaW5fc3ltZnMoZmlsZW5hbWUsIGZpbGVuYW1lX3NpemUsIGRzby0+bG9uZ19uYW1lKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogaW50IHN5bWJvbF9fZGlzYXNzZW1ibGUoc3RydWN0IHN5bWJvbCAqc3ltLCBzdHJ1Y3QgbWFwICptYXAsIHNpemVfdCBwcml2c2l6ZSkKIHsKIAlzdHJ1Y3QgZHNvICpkc28gPSBtYXAtPmRzbzsKLQljaGFyICpmaWxlbmFtZSA9IGRzb19fYnVpbGRfaWRfZmlsZW5hbWUoZHNvLCBOVUxMLCAwKTsKLQlib29sIGZyZWVfZmlsZW5hbWUgPSB0cnVlOwogCWNoYXIgY29tbWFuZFtQQVRIX01BWCAqIDJdOwogCUZJTEUgKmZpbGU7Ci0JaW50IGVyciA9IDA7CiAJY2hhciBzeW1mc19maWxlbmFtZVtQQVRIX01BWF07CiAJc3RydWN0IGtjb3JlX2V4dHJhY3Qga2NlOwogCWJvb2wgZGVsZXRlX2V4dHJhY3QgPSBmYWxzZTsKQEAgLTExNzcsMzggKzEyOTIsMTMgQEAKIAlpbnQgbGluZW5vID0gMDsKIAlpbnQgbmxpbmU7CiAJcGlkX3QgcGlkOworCWludCBlcnIgPSBkc29fX2Rpc2Fzc2VtYmxlX2ZpbGVuYW1lKGRzbywgc3ltZnNfZmlsZW5hbWUsIHNpemVvZihzeW1mc19maWxlbmFtZSkpOwogCi0JaWYgKGZpbGVuYW1lKQotCQlzeW1ib2xfX2pvaW5fc3ltZnMoc3ltZnNfZmlsZW5hbWUsIGZpbGVuYW1lKTsKLQotCWlmIChmaWxlbmFtZSA9PSBOVUxMKSB7Ci0JCWlmIChkc28tPmhhc19idWlsZF9pZCkKLQkJCXJldHVybiBFTk9NRU07Ci0JCWdvdG8gZmFsbGJhY2s7Ci0JfSBlbHNlIGlmIChkc29fX2lzX2tjb3JlKGRzbykgfHwKLQkJICAgcmVhZGxpbmsoc3ltZnNfZmlsZW5hbWUsIGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSkgPCAwIHx8Ci0JCSAgIHN0cnN0cihjb21tYW5kLCBEU09fX05BTUVfS0FMTFNZTVMpIHx8Ci0JCSAgIGFjY2VzcyhzeW1mc19maWxlbmFtZSwgUl9PSykpIHsKLQkJZnJlZShmaWxlbmFtZSk7Ci1mYWxsYmFjazoKLQkJLyoKLQkJICogSWYgd2UgZG9uJ3QgaGF2ZSBidWlsZC1pZHMgb3IgdGhlIGJ1aWxkLWlkIGZpbGUgaXNuJ3QgaW4gdGhlCi0JCSAqIGNhY2hlLCBvciBpcyBqdXN0IGEga2FsbHN5bXMgZmlsZSwgd2VsbCwgbGV0cyBob3BlIHRoYXQgdGhpcwotCQkgKiBEU08gaXMgdGhlIHNhbWUgYXMgd2hlbiAncGVyZiByZWNvcmQnIHJhbi4KLQkJICovCi0JCWZpbGVuYW1lID0gKGNoYXIgKilkc28tPmxvbmdfbmFtZTsKLQkJc3ltYm9sX19qb2luX3N5bWZzKHN5bWZzX2ZpbGVuYW1lLCBmaWxlbmFtZSk7Ci0JCWZyZWVfZmlsZW5hbWUgPSBmYWxzZTsKLQl9Ci0KLQlpZiAoZHNvLT5zeW10YWJfdHlwZSA9PSBEU09fQklOQVJZX1RZUEVfX0tBTExTWU1TICYmCi0JICAgICFkc29fX2lzX2tjb3JlKGRzbykpIHsKLQkJZXJyID0gU1lNQk9MX0FOTk9UQVRFX0VSUk5PX19OT19WTUxJTlVYOwotCQlnb3RvIG91dF9mcmVlX2ZpbGVuYW1lOwotCX0KKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJcHJfZGVidWcoIiVzOiBmaWxlbmFtZT0lcywgc3ltPSVzLCBzdGFydD0lIyIgUFJJeDY0ICIsIGVuZD0lIyIgUFJJeDY0ICJcbiIsIF9fZnVuY19fLAotCQkgZmlsZW5hbWUsIHN5bS0+bmFtZSwgbWFwLT51bm1hcF9pcChtYXAsIHN5bS0+c3RhcnQpLAorCQkgc3ltZnNfZmlsZW5hbWUsIHN5bS0+bmFtZSwgbWFwLT51bm1hcF9pcChtYXAsIHN5bS0+c3RhcnQpLAogCQkgbWFwLT51bm1hcF9pcChtYXAsIHN5bS0+ZW5kKSk7CiAKIAlwcl9kZWJ1ZygiYW5ub3RhdGluZyBbJXBdICUzMHMgOiBbJXBdICUzMHNcbiIsCkBAIC0xMjIzLDExICsxMzEzLDYgQEAKIAkJCWRlbGV0ZV9leHRyYWN0ID0gdHJ1ZTsKIAkJCXN0cmxjcHkoc3ltZnNfZmlsZW5hbWUsIGtjZS5leHRyYWN0X2ZpbGVuYW1lLAogCQkJCXNpemVvZihzeW1mc19maWxlbmFtZSkpOwotCQkJaWYgKGZyZWVfZmlsZW5hbWUpIHsKLQkJCQlmcmVlKGZpbGVuYW1lKTsKLQkJCQlmcmVlX2ZpbGVuYW1lID0gZmFsc2U7Ci0JCQl9Ci0JCQlmaWxlbmFtZSA9IHN5bWZzX2ZpbGVuYW1lOwogCQl9CiAJfSBlbHNlIGlmIChkc29fX25lZWRzX2RlY29tcHJlc3MoZHNvKSkgewogCQljaGFyIHRtcFtQQVRIX01BWF07CkBAIC0xMjM2LDE0ICsxMzIxLDE0IEBACiAJCWJvb2wgcmV0OwogCiAJCWlmIChrbW9kX3BhdGhfX3BhcnNlX2V4dCgmbSwgc3ltZnNfZmlsZW5hbWUpKQotCQkJZ290byBvdXRfZnJlZV9maWxlbmFtZTsKKwkJCWdvdG8gb3V0OwogCiAJCXNucHJpbnRmKHRtcCwgUEFUSF9NQVgsICIvdG1wL3BlcmYta21vZC1YWFhYWFgiKTsKIAogCQlmZCA9IG1rc3RlbXAodG1wKTsKIAkJaWYgKGZkIDwgMCkgewogCQkJZnJlZShtLmV4dCk7Ci0JCQlnb3RvIG91dF9mcmVlX2ZpbGVuYW1lOworCQkJZ290byBvdXQ7CiAJCX0KIAogCQlyZXQgPSBkZWNvbXByZXNzX3RvX2ZpbGUobS5leHQsIHN5bWZzX2ZpbGVuYW1lLCBmZCk7CkBAIC0xMjU1LDcgKzEzNDAsNyBAQAogCQljbG9zZShmZCk7CiAKIAkJaWYgKCFyZXQpCi0JCQlnb3RvIG91dF9mcmVlX2ZpbGVuYW1lOworCQkJZ290byBvdXQ7CiAKIAkJc3RyY3B5KHN5bWZzX2ZpbGVuYW1lLCB0bXApOwogCX0KQEAgLTEyNzEsNyArMTM1Niw3IEBACiAJCSBtYXBfX3JpcF8yb2JqZHVtcChtYXAsIHN5bS0+ZW5kKSwKIAkJIHN5bWJvbF9jb25mLmFubm90YXRlX2FzbV9yYXcgPyAiIiA6ICItLW5vLXNob3ctcmF3IiwKIAkJIHN5bWJvbF9jb25mLmFubm90YXRlX3NyYyA/ICItUyIgOiAiIiwKLQkJIHN5bWZzX2ZpbGVuYW1lLCBmaWxlbmFtZSk7CisJCSBzeW1mc19maWxlbmFtZSwgc3ltZnNfZmlsZW5hbWUpOwogCiAJcHJfZGVidWcoIkV4ZWN1dGluZzogJXNcbiIsIGNvbW1hbmQpOwogCkBAIC0xMzMzLDExICsxNDE4LDEwIEBACiAKIAlpZiAoZHNvX19uZWVkc19kZWNvbXByZXNzKGRzbykpCiAJCXVubGluayhzeW1mc19maWxlbmFtZSk7Ci1vdXRfZnJlZV9maWxlbmFtZToKKwogCWlmIChkZWxldGVfZXh0cmFjdCkKIAkJa2NvcmVfZXh0cmFjdF9fZGVsZXRlKCZrY2UpOwotCWlmIChmcmVlX2ZpbGVuYW1lKQotCQlmcmVlKGZpbGVuYW1lKTsKK291dDoKIAlyZXR1cm4gZXJyOwogCiBvdXRfY2xvc2Vfc3Rkb3V0OgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2Fubm90YXRlLmggYi90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuaAppbmRleCBmNjdjY2IwLi41YmJjZWMxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuaAorKysgYi90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuaApAQCAtMzYsNyArMzYsNyBAQAogCiBzdHJ1Y3QgaW5zX29wcyB7CiAJdm9pZCAoKmZyZWUpKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcyk7Ci0JaW50ICgqcGFyc2UpKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcyk7CisJaW50ICgqcGFyc2UpKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcywgc3RydWN0IG1hcCAqbWFwKTsKIAlpbnQgKCpzY25wcmludGYpKHN0cnVjdCBpbnMgKmlucywgY2hhciAqYmYsIHNpemVfdCBzaXplLAogCQkJIHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcyk7CiB9OwpAQCAtMTMwLDYgKzEzMCw3IEBACiAKIHN0cnVjdCBhbm5vdGF0aW9uIHsKIAlwdGhyZWFkX211dGV4X3QJCWxvY2s7CisJdTY0CQkJbWF4X2NvdmVyYWdlOwogCXN0cnVjdCBhbm5vdGF0ZWRfc291cmNlICpzcmM7CiB9OwogCkBAIC0xNzcsNyArMTc4LDYgQEAKIGludCBzeW1ib2xfX3N0cmVycm9yX2Rpc2Fzc2VtYmxlKHN0cnVjdCBzeW1ib2wgKnN5bSwgc3RydWN0IG1hcCAqbWFwLAogCQkJCSBpbnQgZXJybnVtLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pOwogCi1pbnQgc3ltYm9sX19hbm5vdGF0ZV9pbml0KHN0cnVjdCBtYXAgKm1hcCwgc3RydWN0IHN5bWJvbCAqc3ltKTsKIGludCBzeW1ib2xfX2Fubm90YXRlX3ByaW50ZihzdHJ1Y3Qgc3ltYm9sICpzeW0sIHN0cnVjdCBtYXAgKm1hcCwKIAkJCSAgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIGJvb2wgZnVsbF9wYXRocywKIAkJCSAgICBpbnQgbWluX3BjbnQsIGludCBtYXhfbGluZXMsIGludCBjb250ZXh0KTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9hdXh0cmFjZS5jIGIvdG9vbHMvcGVyZi91dGlsL2F1eHRyYWNlLmMKaW5kZXggYzkxNjkwMS4uYzVhNmUwYjEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9hdXh0cmFjZS5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9hdXh0cmFjZS5jCkBAIC0xNiw2ICsxNiwxMCBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KQEAgLTM1LDkgKzM5LDE0IEBACiAjaW5jbHVkZSAiLi4vcGVyZi5oIgogI2luY2x1ZGUgInV0aWwuaCIKICNpbmNsdWRlICJldmxpc3QuaCIKKyNpbmNsdWRlICJkc28uaCIKKyNpbmNsdWRlICJtYXAuaCIKKyNpbmNsdWRlICJwbXUuaCIKKyNpbmNsdWRlICJldnNlbC5oIgogI2luY2x1ZGUgImNwdW1hcC5oIgogI2luY2x1ZGUgInRocmVhZF9tYXAuaCIKICNpbmNsdWRlICJhc20vYnVnLmgiCisjaW5jbHVkZSAic3ltYm9sL2thbGxzeW1zLmgiCiAjaW5jbHVkZSAiYXV4dHJhY2UuaCIKIAogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KQEAgLTg5Miw2ICs5MDEsNyBAQAogCQlyZXR1cm4gaW50ZWxfcHRfcHJvY2Vzc19hdXh0cmFjZV9pbmZvKGV2ZW50LCBzZXNzaW9uKTsKIAljYXNlIFBFUkZfQVVYVFJBQ0VfSU5URUxfQlRTOgogCQlyZXR1cm4gaW50ZWxfYnRzX3Byb2Nlc3NfYXV4dHJhY2VfaW5mbyhldmVudCwgc2Vzc2lvbik7CisJY2FzZSBQRVJGX0FVWFRSQUNFX0NTX0VUTToKIAljYXNlIFBFUkZfQVVYVFJBQ0VfVU5LTk9XTjoKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEzOTgsMyArMTQwOCw3MzEgQEAKIAogCXJldHVybiBOVUxMOwogfQorCitzdGF0aWMgdm9pZCBhZGRyX2ZpbHRlcl9fZnJlZV9zdHIoc3RydWN0IGFkZHJfZmlsdGVyICpmaWx0KQoreworCWZyZWUoZmlsdC0+c3RyKTsKKwlmaWx0LT5hY3Rpb24gICA9IE5VTEw7CisJZmlsdC0+c3ltX2Zyb20gPSBOVUxMOworCWZpbHQtPnN5bV90byAgID0gTlVMTDsKKwlmaWx0LT5maWxlbmFtZSA9IE5VTEw7CisJZmlsdC0+c3RyICAgICAgPSBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGFkZHJfZmlsdGVyICphZGRyX2ZpbHRlcl9fbmV3KHZvaWQpCit7CisJc3RydWN0IGFkZHJfZmlsdGVyICpmaWx0ID0gemFsbG9jKHNpemVvZigqZmlsdCkpOworCisJaWYgKGZpbHQpCisJCUlOSVRfTElTVF9IRUFEKCZmaWx0LT5saXN0KTsKKworCXJldHVybiBmaWx0OworfQorCitzdGF0aWMgdm9pZCBhZGRyX2ZpbHRlcl9fZnJlZShzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQpCit7CisJaWYgKGZpbHQpCisJCWFkZHJfZmlsdGVyX19mcmVlX3N0cihmaWx0KTsKKwlmcmVlKGZpbHQpOworfQorCitzdGF0aWMgdm9pZCBhZGRyX2ZpbHRlcnNfX2FkZChzdHJ1Y3QgYWRkcl9maWx0ZXJzICpmaWx0cywKKwkJCSAgICAgIHN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdCkKK3sKKwlsaXN0X2FkZF90YWlsKCZmaWx0LT5saXN0LCAmZmlsdHMtPmhlYWQpOworCWZpbHRzLT5jbnQgKz0gMTsKK30KKworc3RhdGljIHZvaWQgYWRkcl9maWx0ZXJzX19kZWwoc3RydWN0IGFkZHJfZmlsdGVycyAqZmlsdHMsCisJCQkgICAgICBzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQpCit7CisJbGlzdF9kZWxfaW5pdCgmZmlsdC0+bGlzdCk7CisJZmlsdHMtPmNudCAtPSAxOworfQorCit2b2lkIGFkZHJfZmlsdGVyc19faW5pdChzdHJ1Y3QgYWRkcl9maWx0ZXJzICpmaWx0cykKK3sKKwlJTklUX0xJU1RfSEVBRCgmZmlsdHMtPmhlYWQpOworCWZpbHRzLT5jbnQgPSAwOworfQorCit2b2lkIGFkZHJfZmlsdGVyc19fZXhpdChzdHJ1Y3QgYWRkcl9maWx0ZXJzICpmaWx0cykKK3sKKwlzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQsICpuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZpbHQsIG4sICZmaWx0cy0+aGVhZCwgbGlzdCkgeworCQlhZGRyX2ZpbHRlcnNfX2RlbChmaWx0cywgZmlsdCk7CisJCWFkZHJfZmlsdGVyX19mcmVlKGZpbHQpOworCX0KK30KKworc3RhdGljIGludCBwYXJzZV9udW1fb3Jfc3RyKGNoYXIgKippbnAsIHU2NCAqbnVtLCBjb25zdCBjaGFyICoqc3RyLAorCQkJICAgIGNvbnN0IGNoYXIgKnN0cl9kZWxpbSkKK3sKKwkqaW5wICs9IHN0cnNwbigqaW5wLCAiICIpOworCisJaWYgKGlzZGlnaXQoKippbnApKSB7CisJCWNoYXIgKmVuZHB0cjsKKworCQlpZiAoIW51bSkKKwkJCXJldHVybiAtRUlOVkFMOworCQllcnJubyA9IDA7CisJCSpudW0gPSBzdHJ0b3VsbCgqaW5wLCAmZW5kcHRyLCAwKTsKKwkJaWYgKGVycm5vKQorCQkJcmV0dXJuIC1lcnJubzsKKwkJaWYgKGVuZHB0ciA9PSAqaW5wKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCSppbnAgPSBlbmRwdHI7CisJfSBlbHNlIHsKKwkJc2l6ZV90IG47CisKKwkJaWYgKCFzdHIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJKmlucCArPSBzdHJzcG4oKmlucCwgIiAiKTsKKwkJKnN0ciA9ICppbnA7CisJCW4gPSBzdHJjc3BuKCppbnAsIHN0cl9kZWxpbSk7CisJCWlmICghbikKKwkJCXJldHVybiAtRUlOVkFMOworCQkqaW5wICs9IG47CisJCWlmICgqKmlucCkgeworCQkJKippbnAgPSAnXDAnOworCQkJKmlucCArPSAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2FjdGlvbihzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQpCit7CisJaWYgKCFzdHJjbXAoZmlsdC0+YWN0aW9uLCAiZmlsdGVyIikpIHsKKwkJZmlsdC0+c3RhcnQgPSB0cnVlOworCQlmaWx0LT5yYW5nZSA9IHRydWU7CisJfSBlbHNlIGlmICghc3RyY21wKGZpbHQtPmFjdGlvbiwgInN0YXJ0IikpIHsKKwkJZmlsdC0+c3RhcnQgPSB0cnVlOworCX0gZWxzZSBpZiAoIXN0cmNtcChmaWx0LT5hY3Rpb24sICJzdG9wIikpIHsKKwkJZmlsdC0+c3RhcnQgPSBmYWxzZTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoZmlsdC0+YWN0aW9uLCAidHJhY2VzdG9wIikpIHsKKwkJZmlsdC0+c3RhcnQgPSBmYWxzZTsKKwkJZmlsdC0+cmFuZ2UgPSB0cnVlOworCQlmaWx0LT5hY3Rpb24gKz0gNTsgLyogQ2hhbmdlICd0cmFjZXN0b3AnIHRvICdzdG9wJyAqLworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9zeW1faWR4KGNoYXIgKippbnAsIGludCAqaWR4KQoreworCSppZHggPSAtMTsKKworCSppbnAgKz0gc3Ryc3BuKCppbnAsICIgIik7CisKKwlpZiAoKippbnAgIT0gJyMnKQorCQlyZXR1cm4gMDsKKworCSppbnAgKz0gMTsKKworCWlmICgqKmlucCA9PSAnZycgfHwgKippbnAgPT0gJ0cnKSB7CisJCSppbnAgKz0gMTsKKwkJKmlkeCA9IDA7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBudW07CisJCWNoYXIgKmVuZHB0cjsKKworCQllcnJubyA9IDA7CisJCW51bSA9IHN0cnRvdWwoKmlucCwgJmVuZHB0ciwgMCk7CisJCWlmIChlcnJubykKKwkJCXJldHVybiAtZXJybm87CisJCWlmIChlbmRwdHIgPT0gKmlucCB8fCBudW0gPiBJTlRfTUFYKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCSppbnAgPSBlbmRwdHI7CisJCSppZHggPSBudW07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYWRkcl9zaXplKGNoYXIgKippbnAsIHU2NCAqbnVtLCBjb25zdCBjaGFyICoqc3RyLCBpbnQgKmlkeCkKK3sKKwlpbnQgZXJyID0gcGFyc2VfbnVtX29yX3N0cihpbnAsIG51bSwgc3RyLCAiICIpOworCisJaWYgKCFlcnIgJiYgKnN0cikKKwkJZXJyID0gcGFyc2Vfc3ltX2lkeChpbnAsIGlkeCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHBhcnNlX29uZV9maWx0ZXIoc3RydWN0IGFkZHJfZmlsdGVyICpmaWx0LCBjb25zdCBjaGFyICoqZmlsdGVyX2lucCkKK3sKKwljaGFyICpmc3RyOworCWludCBlcnI7CisKKwlmaWx0LT5zdHIgPSBmc3RyID0gc3RyZHVwKCpmaWx0ZXJfaW5wKTsKKwlpZiAoIWZzdHIpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gcGFyc2VfbnVtX29yX3N0cigmZnN0ciwgTlVMTCwgJmZpbHQtPmFjdGlvbiwgIiAiKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9lcnI7CisKKwllcnIgPSBwYXJzZV9hY3Rpb24oZmlsdCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZXJyOworCisJZXJyID0gcGFyc2VfYWRkcl9zaXplKCZmc3RyLCAmZmlsdC0+YWRkciwgJmZpbHQtPnN5bV9mcm9tLAorCQkJICAgICAgJmZpbHQtPnN5bV9mcm9tX2lkeCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZXJyOworCisJZnN0ciArPSBzdHJzcG4oZnN0ciwgIiAiKTsKKworCWlmICgqZnN0ciA9PSAnLycpIHsKKwkJZnN0ciArPSAxOworCQllcnIgPSBwYXJzZV9hZGRyX3NpemUoJmZzdHIsICZmaWx0LT5zaXplLCAmZmlsdC0+c3ltX3RvLAorCQkJCSAgICAgICZmaWx0LT5zeW1fdG9faWR4KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2VycjsKKwkJZmlsdC0+cmFuZ2UgPSB0cnVlOworCX0KKworCWZzdHIgKz0gc3Ryc3BuKGZzdHIsICIgIik7CisKKwlpZiAoKmZzdHIgPT0gJ0AnKSB7CisJCWZzdHIgKz0gMTsKKwkJZXJyID0gcGFyc2VfbnVtX29yX3N0cigmZnN0ciwgTlVMTCwgJmZpbHQtPmZpbGVuYW1lLCAiICwiKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlmc3RyICs9IHN0cnNwbihmc3RyLCAiICwiKTsKKworCSpmaWx0ZXJfaW5wICs9IGZzdHIgLSBmaWx0LT5zdHI7CisKKwlyZXR1cm4gMDsKKworb3V0X2VycjoKKwlhZGRyX2ZpbHRlcl9fZnJlZV9zdHIoZmlsdCk7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYWRkcl9maWx0ZXJzX19wYXJzZV9iYXJlX2ZpbHRlcihzdHJ1Y3QgYWRkcl9maWx0ZXJzICpmaWx0cywKKwkJCQkgICAgY29uc3QgY2hhciAqZmlsdGVyKQoreworCXN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdDsKKwljb25zdCBjaGFyICpmc3RyID0gZmlsdGVyOworCWludCBlcnI7CisKKwl3aGlsZSAoKmZzdHIpIHsKKwkJZmlsdCA9IGFkZHJfZmlsdGVyX19uZXcoKTsKKwkJZXJyID0gcGFyc2Vfb25lX2ZpbHRlcihmaWx0LCAmZnN0cik7CisJCWlmIChlcnIpIHsKKwkJCWFkZHJfZmlsdGVyX19mcmVlKGZpbHQpOworCQkJYWRkcl9maWx0ZXJzX19leGl0KGZpbHRzKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJYWRkcl9maWx0ZXJzX19hZGQoZmlsdHMsIGZpbHQpOworCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc3ltX2FyZ3MgeworCWNvbnN0IGNoYXIJKm5hbWU7CisJdTY0CQlzdGFydDsKKwl1NjQJCXNpemU7CisJaW50CQlpZHg7CisJaW50CQljbnQ7CisJYm9vbAkJc3RhcnRlZDsKKwlib29sCQlnbG9iYWw7CisJYm9vbAkJc2VsZWN0ZWQ7CisJYm9vbAkJZHVwbGljYXRlOworCWJvb2wJCW5lYXI7Cit9OworCitzdGF0aWMgYm9vbCBrZXJuX3N5bV9tYXRjaChzdHJ1Y3Qgc3ltX2FyZ3MgKmFyZ3MsIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgdHlwZSkKK3sKKwkvKiBBIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSwgYW5kIGdsb2JhbCBvciB0aGUgbid0aCBmb3VuZCBvciBhbnkgKi8KKwlyZXR1cm4gc3ltYm9sX3R5cGVfX2lzX2EodHlwZSwgTUFQX19GVU5DVElPTikgJiYKKwkgICAgICAgIXN0cmNtcChuYW1lLCBhcmdzLT5uYW1lKSAmJgorCSAgICAgICAoKGFyZ3MtPmdsb2JhbCAmJiBpc3VwcGVyKHR5cGUpKSB8fAorCQkoYXJncy0+c2VsZWN0ZWQgJiYgKysoYXJncy0+Y250KSA9PSBhcmdzLT5pZHgpIHx8CisJCSghYXJncy0+Z2xvYmFsICYmICFhcmdzLT5zZWxlY3RlZCkpOworfQorCitzdGF0aWMgaW50IGZpbmRfa2Vybl9zeW1fY2Iodm9pZCAqYXJnLCBjb25zdCBjaGFyICpuYW1lLCBjaGFyIHR5cGUsIHU2NCBzdGFydCkKK3sKKwlzdHJ1Y3Qgc3ltX2FyZ3MgKmFyZ3MgPSBhcmc7CisKKwlpZiAoYXJncy0+c3RhcnRlZCkgeworCQlpZiAoIWFyZ3MtPnNpemUpCisJCQlhcmdzLT5zaXplID0gc3RhcnQgLSBhcmdzLT5zdGFydDsKKwkJaWYgKGFyZ3MtPnNlbGVjdGVkKSB7CisJCQlpZiAoYXJncy0+c2l6ZSkKKwkJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIGlmIChrZXJuX3N5bV9tYXRjaChhcmdzLCBuYW1lLCB0eXBlKSkgeworCQkJYXJncy0+ZHVwbGljYXRlID0gdHJ1ZTsKKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlIGlmIChrZXJuX3N5bV9tYXRjaChhcmdzLCBuYW1lLCB0eXBlKSkgeworCQlhcmdzLT5zdGFydGVkID0gdHJ1ZTsKKwkJYXJncy0+c3RhcnQgPSBzdGFydDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmludF9rZXJuX3N5bV9jYih2b2lkICphcmcsIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgdHlwZSwgdTY0IHN0YXJ0KQoreworCXN0cnVjdCBzeW1fYXJncyAqYXJncyA9IGFyZzsKKworCWlmIChrZXJuX3N5bV9tYXRjaChhcmdzLCBuYW1lLCB0eXBlKSkgeworCQlwcl9lcnIoIiMlZFx0MHglIlBSSXg2NCJcdCVjXHQlc1xuIiwKKwkJICAgICAgICsrYXJncy0+Y250LCBzdGFydCwgdHlwZSwgbmFtZSk7CisJCWFyZ3MtPm5lYXIgPSB0cnVlOworCX0gZWxzZSBpZiAoYXJncy0+bmVhcikgeworCQlhcmdzLT5uZWFyID0gZmFsc2U7CisJCXByX2VycigiXHRcdHdoaWNoIGlzIG5lYXJcdFx0JXNcbiIsIG5hbWUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN5bV9ub3RfZm91bmRfZXJyb3IoY29uc3QgY2hhciAqc3ltX25hbWUsIGludCBpZHgpCit7CisJaWYgKGlkeCA+IDApIHsKKwkJcHJfZXJyKCJOJ3RoIG9jY3VycmVuY2UgKE49JWQpIG9mIHN5bWJvbCAnJXMnIG5vdCBmb3VuZC5cbiIsCisJCSAgICAgICBpZHgsIHN5bV9uYW1lKTsKKwl9IGVsc2UgaWYgKCFpZHgpIHsKKwkJcHJfZXJyKCJHbG9iYWwgc3ltYm9sICclcycgbm90IGZvdW5kLlxuIiwgc3ltX25hbWUpOworCX0gZWxzZSB7CisJCXByX2VycigiU3ltYm9sICclcycgbm90IGZvdW5kLlxuIiwgc3ltX25hbWUpOworCX0KKwlwcl9lcnIoIk5vdGUgdGhhdCBzeW1ib2xzIG11c3QgYmUgZnVuY3Rpb25zLlxuIik7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBmaW5kX2tlcm5fc3ltKGNvbnN0IGNoYXIgKnN5bV9uYW1lLCB1NjQgKnN0YXJ0LCB1NjQgKnNpemUsIGludCBpZHgpCit7CisJc3RydWN0IHN5bV9hcmdzIGFyZ3MgPSB7CisJCS5uYW1lID0gc3ltX25hbWUsCisJCS5pZHggPSBpZHgsCisJCS5nbG9iYWwgPSAhaWR4LAorCQkuc2VsZWN0ZWQgPSBpZHggPiAwLAorCX07CisJaW50IGVycjsKKworCSpzdGFydCA9IDA7CisJKnNpemUgPSAwOworCisJZXJyID0ga2FsbHN5bXNfX3BhcnNlKCIvcHJvYy9rYWxsc3ltcyIsICZhcmdzLCBmaW5kX2tlcm5fc3ltX2NiKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBwYXJzZSAvcHJvYy9rYWxsc3ltc1xuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKGFyZ3MuZHVwbGljYXRlKSB7CisJCXByX2VycigiTXVsdGlwbGUga2VybmVsIHN5bWJvbHMgd2l0aCBuYW1lICclcydcbiIsIHN5bV9uYW1lKTsKKwkJYXJncy5jbnQgPSAwOworCQlrYWxsc3ltc19fcGFyc2UoIi9wcm9jL2thbGxzeW1zIiwgJmFyZ3MsIHByaW50X2tlcm5fc3ltX2NiKTsKKwkJcHJfZXJyKCJEaXNhbWJpZ3VhdGUgc3ltYm9sIG5hbWUgYnkgaW5zZXJ0aW5nICNuIGFmdGVyIHRoZSBuYW1lIGUuZy4gJXMgIzJcbiIsCisJCSAgICAgICBzeW1fbmFtZSk7CisJCXByX2VycigiT3Igc2VsZWN0IGEgZ2xvYmFsIHN5bWJvbCBieSBpbnNlcnRpbmcgIzAgb3IgI2cgb3IgI0dcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWFyZ3Muc3RhcnRlZCkgeworCQlwcl9lcnIoIktlcm5lbCBzeW1ib2wgbG9va3VwOiAiKTsKKwkJcmV0dXJuIHN5bV9ub3RfZm91bmRfZXJyb3Ioc3ltX25hbWUsIGlkeCk7CisJfQorCisJKnN0YXJ0ID0gYXJncy5zdGFydDsKKwkqc2l6ZSA9IGFyZ3Muc2l6ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbmRfZW50aXJlX2tlcm5fY2Iodm9pZCAqYXJnLCBjb25zdCBjaGFyICpuYW1lIF9fbWF5YmVfdW51c2VkLAorCQkJICAgICAgIGNoYXIgdHlwZSwgdTY0IHN0YXJ0KQoreworCXN0cnVjdCBzeW1fYXJncyAqYXJncyA9IGFyZzsKKworCWlmICghc3ltYm9sX3R5cGVfX2lzX2EodHlwZSwgTUFQX19GVU5DVElPTikpCisJCXJldHVybiAwOworCisJaWYgKCFhcmdzLT5zdGFydGVkKSB7CisJCWFyZ3MtPnN0YXJ0ZWQgPSB0cnVlOworCQlhcmdzLT5zdGFydCA9IHN0YXJ0OworCX0KKwkvKiBEb24ndCBrbm93IGV4YWN0bHkgd2hlcmUgdGhlIGtlcm5lbCBlbmRzLCBzbyB3ZSBhZGQgYSBwYWdlICovCisJYXJncy0+c2l6ZSA9IHJvdW5kX3VwKHN0YXJ0LCBwYWdlX3NpemUpICsgcGFnZV9zaXplIC0gYXJncy0+c3RhcnQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRyX2ZpbHRlcl9fZW50aXJlX2tlcm5lbChzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQpCit7CisJc3RydWN0IHN5bV9hcmdzIGFyZ3MgPSB7IC5zdGFydGVkID0gZmFsc2UgfTsKKwlpbnQgZXJyOworCisJZXJyID0ga2FsbHN5bXNfX3BhcnNlKCIvcHJvYy9rYWxsc3ltcyIsICZhcmdzLCBmaW5kX2VudGlyZV9rZXJuX2NiKTsKKwlpZiAoZXJyIDwgMCB8fCAhYXJncy5zdGFydGVkKSB7CisJCXByX2VycigiRmFpbGVkIHRvIHBhcnNlIC9wcm9jL2thbGxzeW1zXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlmaWx0LT5hZGRyID0gYXJncy5zdGFydDsKKwlmaWx0LT5zaXplID0gYXJncy5zaXplOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZW5kX2FmdGVyX3N0YXJ0KHN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdCwgdTY0IHN0YXJ0LCB1NjQgc2l6ZSkKK3sKKwlpZiAoc3RhcnQgKyBzaXplID49IGZpbHQtPmFkZHIpCisJCXJldHVybiAwOworCisJaWYgKGZpbHQtPnN5bV9mcm9tKSB7CisJCXByX2VycigiU3ltYm9sICclcycgKDB4JSJQUkl4NjQiKSBjb21lcyBiZWZvcmUgJyVzJyAoMHglIlBSSXg2NCIpXG4iLAorCQkgICAgICAgZmlsdC0+c3ltX3RvLCBzdGFydCwgZmlsdC0+c3ltX2Zyb20sIGZpbHQtPmFkZHIpOworCX0gZWxzZSB7CisJCXByX2VycigiU3ltYm9sICclcycgKDB4JSJQUkl4NjQiKSBjb21lcyBiZWZvcmUgYWRkcmVzcyAweCUiUFJJeDY0IilcbiIsCisJCSAgICAgICBmaWx0LT5zeW1fdG8sIHN0YXJ0LCBmaWx0LT5hZGRyKTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhZGRyX2ZpbHRlcl9fcmVzb2x2ZV9rZXJuZWxfc3ltcyhzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQpCit7CisJYm9vbCBub19zaXplID0gZmFsc2U7CisJdTY0IHN0YXJ0LCBzaXplOworCWludCBlcnI7CisKKwlpZiAoc3ltYm9sX2NvbmYua3B0cl9yZXN0cmljdCkgeworCQlwcl9lcnIoIktlcm5lbCBhZGRyZXNzZXMgYXJlIHJlc3RyaWN0ZWQuIFVuYWJsZSB0byByZXNvbHZlIGtlcm5lbCBzeW1ib2xzLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChmaWx0LT5zeW1fZnJvbSAmJiAhc3RyY21wKGZpbHQtPnN5bV9mcm9tLCAiKiIpKQorCQlyZXR1cm4gYWRkcl9maWx0ZXJfX2VudGlyZV9rZXJuZWwoZmlsdCk7CisKKwlpZiAoZmlsdC0+c3ltX2Zyb20pIHsKKwkJZXJyID0gZmluZF9rZXJuX3N5bShmaWx0LT5zeW1fZnJvbSwgJnN0YXJ0LCAmc2l6ZSwKKwkJCQkgICAgZmlsdC0+c3ltX2Zyb21faWR4KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWZpbHQtPmFkZHIgPSBzdGFydDsKKwkJaWYgKGZpbHQtPnJhbmdlICYmICFmaWx0LT5zaXplICYmICFmaWx0LT5zeW1fdG8pIHsKKwkJCWZpbHQtPnNpemUgPSBzaXplOworCQkJbm9fc2l6ZSA9ICEhc2l6ZTsKKwkJfQorCX0KKworCWlmIChmaWx0LT5zeW1fdG8pIHsKKwkJZXJyID0gZmluZF9rZXJuX3N5bShmaWx0LT5zeW1fdG8sICZzdGFydCwgJnNpemUsCisJCQkJICAgIGZpbHQtPnN5bV90b19pZHgpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQllcnIgPSBjaGVja19lbmRfYWZ0ZXJfc3RhcnQoZmlsdCwgc3RhcnQsIHNpemUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJZmlsdC0+c2l6ZSA9IHN0YXJ0ICsgc2l6ZSAtIGZpbHQtPmFkZHI7CisJCW5vX3NpemUgPSAhIXNpemU7CisJfQorCisJLyogVGhlIHZlcnkgbGFzdCBzeW1ib2wgaW4ga2FsbHN5bXMgZG9lcyBub3QgaW1wbHkgYSBwYXJ0aWN1bGFyIHNpemUgKi8KKwlpZiAobm9fc2l6ZSkgeworCQlwcl9lcnIoIkNhbm5vdCBkZXRlcm1pbmUgc2l6ZSBvZiBzeW1ib2wgJyVzJ1xuIiwKKwkJICAgICAgIGZpbHQtPnN5bV90byA/IGZpbHQtPnN5bV90byA6IGZpbHQtPnN5bV9mcm9tKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHNvICpsb2FkX2Rzbyhjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBtYXAgKm1hcDsKKwlzdHJ1Y3QgZHNvICpkc287CisKKwltYXAgPSBkc29fX25ld19tYXAobmFtZSk7CisJaWYgKCFtYXApCisJCXJldHVybiBOVUxMOworCisJbWFwX19sb2FkKG1hcCk7CisKKwlkc28gPSBkc29fX2dldChtYXAtPmRzbyk7CisKKwltYXBfX3B1dChtYXApOworCisJcmV0dXJuIGRzbzsKK30KKworc3RhdGljIGJvb2wgZHNvX3N5bV9tYXRjaChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqY250LAorCQkJICBpbnQgaWR4KQoreworCS8qIFNhbWUgbmFtZSwgYW5kIGdsb2JhbCBvciB0aGUgbid0aCBmb3VuZCBvciBhbnkgKi8KKwlyZXR1cm4gIWFyY2hfX2NvbXBhcmVfc3ltYm9sX25hbWVzKG5hbWUsIHN5bS0+bmFtZSkgJiYKKwkgICAgICAgKCghaWR4ICYmIHN5bS0+YmluZGluZyA9PSBTVEJfR0xPQkFMKSB8fAorCQkoaWR4ID4gMCAmJiArKypjbnQgPT0gaWR4KSB8fAorCQlpZHggPCAwKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZHVwbGljYXRlX3N5bXMoc3RydWN0IGRzbyAqZHNvLCBjb25zdCBjaGFyICpzeW1fbmFtZSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJYm9vbCBuZWFyID0gZmFsc2U7CisJaW50IGNudCA9IDA7CisKKwlwcl9lcnIoIk11bHRpcGxlIHN5bWJvbHMgd2l0aCBuYW1lICclcydcbiIsIHN5bV9uYW1lKTsKKworCXN5bSA9IGRzb19fZmlyc3Rfc3ltYm9sKGRzbywgTUFQX19GVU5DVElPTik7CisJd2hpbGUgKHN5bSkgeworCQlpZiAoZHNvX3N5bV9tYXRjaChzeW0sIHN5bV9uYW1lLCAmY250LCAtMSkpIHsKKwkJCXByX2VycigiIyVkXHQweCUiUFJJeDY0Ilx0JWNcdCVzXG4iLAorCQkJICAgICAgICsrY250LCBzeW0tPnN0YXJ0LAorCQkJICAgICAgIHN5bS0+YmluZGluZyA9PSBTVEJfR0xPQkFMID8gJ2cnIDoKKwkJCSAgICAgICBzeW0tPmJpbmRpbmcgPT0gU1RCX0xPQ0FMICA/ICdsJyA6ICd3JywKKwkJCSAgICAgICBzeW0tPm5hbWUpOworCQkJbmVhciA9IHRydWU7CisJCX0gZWxzZSBpZiAobmVhcikgeworCQkJbmVhciA9IGZhbHNlOworCQkJcHJfZXJyKCJcdFx0d2hpY2ggaXMgbmVhclx0XHQlc1xuIiwgc3ltLT5uYW1lKTsKKwkJfQorCQlzeW0gPSBkc29fX25leHRfc3ltYm9sKHN5bSk7CisJfQorCisJcHJfZXJyKCJEaXNhbWJpZ3VhdGUgc3ltYm9sIG5hbWUgYnkgaW5zZXJ0aW5nICNuIGFmdGVyIHRoZSBuYW1lIGUuZy4gJXMgIzJcbiIsCisJICAgICAgIHN5bV9uYW1lKTsKKwlwcl9lcnIoIk9yIHNlbGVjdCBhIGdsb2JhbCBzeW1ib2wgYnkgaW5zZXJ0aW5nICMwIG9yICNnIG9yICNHXG4iKTsKK30KKworc3RhdGljIGludCBmaW5kX2Rzb19zeW0oc3RydWN0IGRzbyAqZHNvLCBjb25zdCBjaGFyICpzeW1fbmFtZSwgdTY0ICpzdGFydCwKKwkJCXU2NCAqc2l6ZSwgaW50IGlkeCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJaW50IGNudCA9IDA7CisKKwkqc3RhcnQgPSAwOworCSpzaXplID0gMDsKKworCXN5bSA9IGRzb19fZmlyc3Rfc3ltYm9sKGRzbywgTUFQX19GVU5DVElPTik7CisJd2hpbGUgKHN5bSkgeworCQlpZiAoKnN0YXJ0KSB7CisJCQlpZiAoISpzaXplKQorCQkJCSpzaXplID0gc3ltLT5zdGFydCAtICpzdGFydDsKKwkJCWlmIChpZHggPiAwKSB7CisJCQkJaWYgKCpzaXplKQorCQkJCQlyZXR1cm4gMTsKKwkJCX0gZWxzZSBpZiAoZHNvX3N5bV9tYXRjaChzeW0sIHN5bV9uYW1lLCAmY250LCBpZHgpKSB7CisJCQkJcHJpbnRfZHVwbGljYXRlX3N5bXMoZHNvLCBzeW1fbmFtZSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0gZWxzZSBpZiAoZHNvX3N5bV9tYXRjaChzeW0sIHN5bV9uYW1lLCAmY250LCBpZHgpKSB7CisJCQkqc3RhcnQgPSBzeW0tPnN0YXJ0OworCQkJKnNpemUgPSBzeW0tPmVuZCAtIHN5bS0+c3RhcnQ7CisJCX0KKwkJc3ltID0gZHNvX19uZXh0X3N5bWJvbChzeW0pOworCX0KKworCWlmICghKnN0YXJ0KQorCQlyZXR1cm4gc3ltX25vdF9mb3VuZF9lcnJvcihzeW1fbmFtZSwgaWR4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZHJfZmlsdGVyX19lbnRpcmVfZHNvKHN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdCwgc3RydWN0IGRzbyAqZHNvKQoreworCXN0cnVjdCBzeW1ib2wgKmZpcnN0X3N5bSA9IGRzb19fZmlyc3Rfc3ltYm9sKGRzbywgTUFQX19GVU5DVElPTik7CisJc3RydWN0IHN5bWJvbCAqbGFzdF9zeW0gPSBkc29fX2xhc3Rfc3ltYm9sKGRzbywgTUFQX19GVU5DVElPTik7CisKKwlpZiAoIWZpcnN0X3N5bSB8fCAhbGFzdF9zeW0pIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gZGV0ZXJtaW5lIGZpbHRlciBmb3IgJXNcbk5vIHN5bWJvbHMgZm91bmQuXG4iLAorCQkgICAgICAgZmlsdC0+ZmlsZW5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmaWx0LT5hZGRyID0gZmlyc3Rfc3ltLT5zdGFydDsKKwlmaWx0LT5zaXplID0gbGFzdF9zeW0tPmVuZCAtIGZpcnN0X3N5bS0+c3RhcnQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRyX2ZpbHRlcl9fcmVzb2x2ZV9zeW1zKHN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdCkKK3sKKwl1NjQgc3RhcnQsIHNpemU7CisJc3RydWN0IGRzbyAqZHNvOworCWludCBlcnIgPSAwOworCisJaWYgKCFmaWx0LT5zeW1fZnJvbSAmJiAhZmlsdC0+c3ltX3RvKQorCQlyZXR1cm4gMDsKKworCWlmICghZmlsdC0+ZmlsZW5hbWUpCisJCXJldHVybiBhZGRyX2ZpbHRlcl9fcmVzb2x2ZV9rZXJuZWxfc3ltcyhmaWx0KTsKKworCWRzbyA9IGxvYWRfZHNvKGZpbHQtPmZpbGVuYW1lKTsKKwlpZiAoIWRzbykgeworCQlwcl9lcnIoIkZhaWxlZCB0byBsb2FkIHN5bWJvbHMgZnJvbTogJXNcbiIsIGZpbHQtPmZpbGVuYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZpbHQtPnN5bV9mcm9tICYmICFzdHJjbXAoZmlsdC0+c3ltX2Zyb20sICIqIikpIHsKKwkJZXJyID0gYWRkcl9maWx0ZXJfX2VudGlyZV9kc28oZmlsdCwgZHNvKTsKKwkJZ290byBwdXRfZHNvOworCX0KKworCWlmIChmaWx0LT5zeW1fZnJvbSkgeworCQllcnIgPSBmaW5kX2Rzb19zeW0oZHNvLCBmaWx0LT5zeW1fZnJvbSwgJnN0YXJ0LCAmc2l6ZSwKKwkJCQkgICBmaWx0LT5zeW1fZnJvbV9pZHgpOworCQlpZiAoZXJyKQorCQkJZ290byBwdXRfZHNvOworCQlmaWx0LT5hZGRyID0gc3RhcnQ7CisJCWlmIChmaWx0LT5yYW5nZSAmJiAhZmlsdC0+c2l6ZSAmJiAhZmlsdC0+c3ltX3RvKQorCQkJZmlsdC0+c2l6ZSA9IHNpemU7CisJfQorCisJaWYgKGZpbHQtPnN5bV90bykgeworCQllcnIgPSBmaW5kX2Rzb19zeW0oZHNvLCBmaWx0LT5zeW1fdG8sICZzdGFydCwgJnNpemUsCisJCQkJICAgZmlsdC0+c3ltX3RvX2lkeCk7CisJCWlmIChlcnIpCisJCQlnb3RvIHB1dF9kc287CisKKwkJZXJyID0gY2hlY2tfZW5kX2FmdGVyX3N0YXJ0KGZpbHQsIHN0YXJ0LCBzaXplKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJZmlsdC0+c2l6ZSA9IHN0YXJ0ICsgc2l6ZSAtIGZpbHQtPmFkZHI7CisJfQorCitwdXRfZHNvOgorCWRzb19fcHV0KGRzbyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY2hhciAqYWRkcl9maWx0ZXJfX3RvX3N0cihzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQpCit7CisJY2hhciBmaWxlbmFtZV9idWZbUEFUSF9NQVhdOworCWNvbnN0IGNoYXIgKmF0ID0gIiI7CisJY29uc3QgY2hhciAqZm4gPSAiIjsKKwljaGFyICpmaWx0ZXI7CisJaW50IGVycjsKKworCWlmIChmaWx0LT5maWxlbmFtZSkgeworCQlhdCA9ICJAIjsKKwkJZm4gPSByZWFscGF0aChmaWx0LT5maWxlbmFtZSwgZmlsZW5hbWVfYnVmKTsKKwkJaWYgKCFmbikKKwkJCXJldHVybiBOVUxMOworCX0KKworCWlmIChmaWx0LT5yYW5nZSkgeworCQllcnIgPSBhc3ByaW50ZigmZmlsdGVyLCAiJXMgMHglIlBSSXg2NCIvMHglIlBSSXg2NCIlcyVzIiwKKwkJCSAgICAgICBmaWx0LT5hY3Rpb24sIGZpbHQtPmFkZHIsIGZpbHQtPnNpemUsIGF0LCBmbik7CisJfSBlbHNlIHsKKwkJZXJyID0gYXNwcmludGYoJmZpbHRlciwgIiVzIDB4JSJQUkl4NjQiJXMlcyIsCisJCQkgICAgICAgZmlsdC0+YWN0aW9uLCBmaWx0LT5hZGRyLCBhdCwgZm4pOworCX0KKworCXJldHVybiBlcnIgPCAwID8gTlVMTCA6IGZpbHRlcjsKK30KKworc3RhdGljIGludCBwYXJzZV9hZGRyX2ZpbHRlcihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIGNvbnN0IGNoYXIgKmZpbHRlciwKKwkJCSAgICAgaW50IG1heF9ucikKK3sKKwlzdHJ1Y3QgYWRkcl9maWx0ZXJzIGZpbHRzOworCXN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdDsKKwlpbnQgZXJyOworCisJYWRkcl9maWx0ZXJzX19pbml0KCZmaWx0cyk7CisKKwllcnIgPSBhZGRyX2ZpbHRlcnNfX3BhcnNlX2JhcmVfZmlsdGVyKCZmaWx0cywgZmlsdGVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9leGl0OworCisJaWYgKGZpbHRzLmNudCA+IG1heF9ucikgeworCQlwcl9lcnIoIkVycm9yOiBudW1iZXIgb2YgYWRkcmVzcyBmaWx0ZXJzICglZCkgZXhjZWVkcyBtYXhpbXVtICglZClcbiIsCisJCSAgICAgICBmaWx0cy5jbnQsIG1heF9ucik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2V4aXQ7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmaWx0LCAmZmlsdHMuaGVhZCwgbGlzdCkgeworCQljaGFyICpuZXdfZmlsdGVyOworCisJCWVyciA9IGFkZHJfZmlsdGVyX19yZXNvbHZlX3N5bXMoZmlsdCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9leGl0OworCisJCW5ld19maWx0ZXIgPSBhZGRyX2ZpbHRlcl9fdG9fc3RyKGZpbHQpOworCQlpZiAoIW5ld19maWx0ZXIpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9leGl0OworCQl9CisKKwkJaWYgKHBlcmZfZXZzZWxfX2FwcGVuZF9hZGRyX2ZpbHRlcihldnNlbCwgbmV3X2ZpbHRlcikpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9leGl0OworCQl9CisJfQorCitvdXRfZXhpdDoKKwlhZGRyX2ZpbHRlcnNfX2V4aXQoJmZpbHRzKTsKKworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gcGFyc2UgYWRkcmVzcyBmaWx0ZXI6ICclcydcbiIsIGZpbHRlcik7CisJCXByX2VycigiRmlsdGVyIGZvcm1hdCBpczogZmlsdGVyfHN0YXJ0fHN0b3B8dHJhY2VzdG9wIDxzdGFydCBzeW1ib2wgb3IgYWRkcmVzcz4gWy8gPGVuZCBzeW1ib2wgb3Igc2l6ZT5dIFtAPGZpbGUgbmFtZT5dXG4iKTsKKwkJcHJfZXJyKCJXaGVyZSBtdWx0aXBsZSBmaWx0ZXJzIGFyZSBzZXBhcmF0ZWQgYnkgc3BhY2Ugb3IgY29tbWEuXG4iKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IHBlcmZfcG11ICpwZXJmX2V2c2VsX19maW5kX3BtdShzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwpCit7CisJc3RydWN0IHBlcmZfcG11ICpwbXUgPSBOVUxMOworCisJd2hpbGUgKChwbXUgPSBwZXJmX3BtdV9fc2NhbihwbXUpKSAhPSBOVUxMKSB7CisJCWlmIChwbXUtPnR5cGUgPT0gZXZzZWwtPmF0dHIudHlwZSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBwbXU7Cit9CisKK3N0YXRpYyBpbnQgcGVyZl9ldnNlbF9fbnJfYWRkcl9maWx0ZXIoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsKQoreworCXN0cnVjdCBwZXJmX3BtdSAqcG11ID0gcGVyZl9ldnNlbF9fZmluZF9wbXUoZXZzZWwpOworCWludCBucl9hZGRyX2ZpbHRlcnMgPSAwOworCisJaWYgKCFwbXUpCisJCXJldHVybiAwOworCisJcGVyZl9wbXVfX3NjYW5fZmlsZShwbXUsICJucl9hZGRyX2ZpbHRlcnMiLCAiJWQiLCAmbnJfYWRkcl9maWx0ZXJzKTsKKworCXJldHVybiBucl9hZGRyX2ZpbHRlcnM7Cit9CisKK2ludCBhdXh0cmFjZV9wYXJzZV9maWx0ZXJzKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKwljaGFyICpmaWx0ZXI7CisJaW50IGVyciwgbWF4X25yOworCisJZXZsaXN0X19mb3JfZWFjaF9lbnRyeShldmxpc3QsIGV2c2VsKSB7CisJCWZpbHRlciA9IGV2c2VsLT5maWx0ZXI7CisJCW1heF9uciA9IHBlcmZfZXZzZWxfX25yX2FkZHJfZmlsdGVyKGV2c2VsKTsKKwkJaWYgKCFmaWx0ZXIgfHwgIW1heF9ucikKKwkJCWNvbnRpbnVlOworCQlldnNlbC0+ZmlsdGVyID0gTlVMTDsKKwkJZXJyID0gcGFyc2VfYWRkcl9maWx0ZXIoZXZzZWwsIGZpbHRlciwgbWF4X25yKTsKKwkJZnJlZShmaWx0ZXIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJcHJfZGVidWcoIkFkZHJlc3MgZmlsdGVyOiAlc1xuIiwgZXZzZWwtPmZpbHRlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvYXV4dHJhY2UuaCBiL3Rvb2xzL3BlcmYvdXRpbC9hdXh0cmFjZS5oCmluZGV4IGFjNWYwZDcuLjI2ZmIxZWUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9hdXh0cmFjZS5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9hdXh0cmFjZS5oCkBAIC00MSw2ICs0MSw3IEBACiAJUEVSRl9BVVhUUkFDRV9VTktOT1dOLAogCVBFUkZfQVVYVFJBQ0VfSU5URUxfUFQsCiAJUEVSRl9BVVhUUkFDRV9JTlRFTF9CVFMsCisJUEVSRl9BVVhUUkFDRV9DU19FVE0sCiB9OwogCiBlbnVtIGl0cmFjZV9wZXJpb2RfdHlwZSB7CkBAIC0zMTcsNiArMzE4LDQ4IEBACiAJdW5zaWduZWQgaW50IGFsaWdubWVudDsKIH07CiAKKy8qKgorICogc3RydWN0IGFkZHJfZmlsdGVyIC0gYWRkcmVzcyBmaWx0ZXIuCisgKiBAbGlzdDogbGlzdCBub2RlCisgKiBAcmFuZ2U6IHRydWUgaWYgaXQgaXMgYSByYW5nZSBmaWx0ZXIKKyAqIEBzdGFydDogdHJ1ZSBpZiBhY3Rpb24gaXMgJ2ZpbHRlcicgb3IgJ3N0YXJ0JworICogQGFjdGlvbjogJ2ZpbHRlcicsICdzdGFydCcgb3IgJ3N0b3AnICgndHJhY2VzdG9wJyBpcyBhY2NlcHRlZCBidXQgY29udmVydGVkCisgKiAgICAgICAgICB0byAnc3RvcCcpCisgKiBAc3ltX2Zyb206IHN5bWJvbCBuYW1lIGZvciB0aGUgZmlsdGVyIGFkZHJlc3MKKyAqIEBzeW1fdG86IHN5bWJvbCBuYW1lIHRoYXQgZGV0ZXJtaW5lcyB0aGUgZmlsdGVyIHNpemUKKyAqIEBzeW1fZnJvbV9pZHg6IHNlbGVjdHMgbid0aCBmcm9tIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lICgwIG1lYW5zIGdsb2JhbAorICogICAgICAgICAgICAgICAgYW5kIGxlc3MgdGhhbiAwIG1lYW5zIHN5bWJvbCBtdXN0IGJlIHVuaXF1ZSkKKyAqIEBzeW1fdG9faWR4OiBzYW1lIGFzIEBzeW1fZnJvbV9pZHggYnV0IGZvciBAc3ltX3RvCisgKiBAYWRkcjogZmlsdGVyIGFkZHJlc3MKKyAqIEBzaXplOiBmaWx0ZXIgcmVnaW9uIHNpemUgKGZvciByYW5nZSBmaWx0ZXJzKQorICogQGZpbGVuYW1lOiBEU08gZmlsZSBuYW1lIG9yIE5VTEwgZm9yIHRoZSBrZXJuZWwKKyAqIEBzdHI6IGFsbG9jYXRlZCBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUgb3RoZXIgc3RyaW5nIG1lbWJlcnMKKyAqLworc3RydWN0IGFkZHJfZmlsdGVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJYm9vbAkJCXJhbmdlOworCWJvb2wJCQlzdGFydDsKKwljb25zdCBjaGFyCQkqYWN0aW9uOworCWNvbnN0IGNoYXIJCSpzeW1fZnJvbTsKKwljb25zdCBjaGFyCQkqc3ltX3RvOworCWludAkJCXN5bV9mcm9tX2lkeDsKKwlpbnQJCQlzeW1fdG9faWR4OworCXU2NAkJCWFkZHI7CisJdTY0CQkJc2l6ZTsKKwljb25zdCBjaGFyCQkqZmlsZW5hbWU7CisJY2hhcgkJCSpzdHI7Cit9OworCisvKioKKyAqIHN0cnVjdCBhZGRyX2ZpbHRlcnMgLSBsaXN0IG9mIGFkZHJlc3MgZmlsdGVycy4KKyAqIEBoZWFkOiBsaXN0IG9mIGFkZHJlc3MgZmlsdGVycworICogQGNudDogbnVtYmVyIG9mIGFkZHJlc3MgZmlsdGVycworICovCitzdHJ1Y3QgYWRkcl9maWx0ZXJzIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWhlYWQ7CisJaW50CQkJY250OworfTsKKwogI2lmZGVmIEhBVkVfQVVYVFJBQ0VfU1VQUE9SVAogCiAvKgpAQCAtNDgxLDYgKzUyNCwxMiBAQAogCQkJCSAgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50KTsKIHZvaWQgZXZlbnRzX3N0YXRzX19hdXh0cmFjZV9lcnJvcl93YXJuKGNvbnN0IHN0cnVjdCBldmVudHNfc3RhdHMgKnN0YXRzKTsKIAordm9pZCBhZGRyX2ZpbHRlcnNfX2luaXQoc3RydWN0IGFkZHJfZmlsdGVycyAqZmlsdHMpOwordm9pZCBhZGRyX2ZpbHRlcnNfX2V4aXQoc3RydWN0IGFkZHJfZmlsdGVycyAqZmlsdHMpOworaW50IGFkZHJfZmlsdGVyc19fcGFyc2VfYmFyZV9maWx0ZXIoc3RydWN0IGFkZHJfZmlsdGVycyAqZmlsdHMsCisJCQkJICAgIGNvbnN0IGNoYXIgKmZpbHRlcik7CitpbnQgYXV4dHJhY2VfcGFyc2VfZmlsdGVycyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCk7CisKIHN0YXRpYyBpbmxpbmUgaW50IGF1eHRyYWNlX19wcm9jZXNzX2V2ZW50KHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCiAJCQkJCSAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJCSAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCkBAIC02MzksNiArNjg4LDEyIEBACiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUKK2ludCBhdXh0cmFjZV9wYXJzZV9maWx0ZXJzKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0IF9fbWF5YmVfdW51c2VkKQoreworCXJldHVybiAwOworfQorCiBpbnQgYXV4dHJhY2VfbW1hcF9fbW1hcChzdHJ1Y3QgYXV4dHJhY2VfbW1hcCAqbW0sCiAJCQlzdHJ1Y3QgYXV4dHJhY2VfbW1hcF9wYXJhbXMgKm1wLAogCQkJdm9pZCAqdXNlcnBnLCBpbnQgZmQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2Jsb2NrLXJhbmdlLmMgYi90b29scy9wZXJmL3V0aWwvYmxvY2stcmFuZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjNlMWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2Jsb2NrLXJhbmdlLmMKQEAgLTAsMCArMSwzMjggQEAKKyNpbmNsdWRlICJibG9jay1yYW5nZS5oIgorI2luY2x1ZGUgImFubm90YXRlLmgiCisKK3N0cnVjdCB7CisJc3RydWN0IHJiX3Jvb3Qgcm9vdDsKKwl1NjQgYmxvY2tzOworfSBibG9ja19yYW5nZXM7CisKK3N0YXRpYyB2b2lkIGJsb2NrX3JhbmdlX19kZWJ1Zyh2b2lkKQoreworCS8qCisJICogWFhYIHN0aWxsIHBhcmFub2lkIGZvciBub3c7IHNlZSBpZiB3ZSBjYW4gbWFrZSB0aGlzIGRlcGVuZCBvbgorCSAqIERFQlVHPTEgYnVpbGRzLgorCSAqLworI2lmIDEKKwlzdHJ1Y3QgcmJfbm9kZSAqcmI7CisJdTY0IG9sZCA9IDA7IC8qIE5VTEwgaXNuJ3QgZXhlY3V0YWJsZSAqLworCisJZm9yIChyYiA9IHJiX2ZpcnN0KCZibG9ja19yYW5nZXMucm9vdCk7IHJiOyByYiA9IHJiX25leHQocmIpKSB7CisJCXN0cnVjdCBibG9ja19yYW5nZSAqZW50cnkgPSByYl9lbnRyeShyYiwgc3RydWN0IGJsb2NrX3JhbmdlLCBub2RlKTsKKworCQlhc3NlcnQob2xkIDwgZW50cnktPnN0YXJ0KTsKKwkJYXNzZXJ0KGVudHJ5LT5zdGFydCA8PSBlbnRyeS0+ZW5kKTsgLyogc2luZ2xlIGluc3RydWN0aW9uIGJsb2NrOyBqdW1wIHRvIGEganVtcCAqLworCisJCW9sZCA9IGVudHJ5LT5lbmQ7CisJfQorI2VuZGlmCit9CisKK3N0cnVjdCBibG9ja19yYW5nZSAqYmxvY2tfcmFuZ2VfX2ZpbmQodTY0IGFkZHIpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJmJsb2NrX3Jhbmdlcy5yb290LnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGJsb2NrX3JhbmdlICplbnRyeTsKKworCXdoaWxlICgqcCAhPSBOVUxMKSB7CisJCXBhcmVudCA9ICpwOworCQllbnRyeSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJsb2NrX3JhbmdlLCBub2RlKTsKKworCQlpZiAoYWRkciA8IGVudHJ5LT5zdGFydCkKKwkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OworCQllbHNlIGlmIChhZGRyID4gZW50cnktPmVuZCkKKwkJCXAgPSAmcGFyZW50LT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIGVudHJ5OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmJfbGlua19sZWZ0X29mX25vZGUoc3RydWN0IHJiX25vZGUgKmxlZnQsIHN0cnVjdCByYl9ub2RlICpub2RlKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZub2RlLT5yYl9sZWZ0OworCXdoaWxlICgqcCkgeworCQlub2RlID0gKnA7CisJCXAgPSAmbm9kZS0+cmJfcmlnaHQ7CisJfQorCXJiX2xpbmtfbm9kZShsZWZ0LCBub2RlLCBwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJiX2xpbmtfcmlnaHRfb2Zfbm9kZShzdHJ1Y3QgcmJfbm9kZSAqcmlnaHQsIHN0cnVjdCByYl9ub2RlICpub2RlKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZub2RlLT5yYl9yaWdodDsKKwl3aGlsZSAoKnApIHsKKwkJbm9kZSA9ICpwOworCQlwID0gJm5vZGUtPnJiX2xlZnQ7CisJfQorCXJiX2xpbmtfbm9kZShyaWdodCwgbm9kZSwgcCk7Cit9CisKKy8qKgorICogYmxvY2tfcmFuZ2VfX2NyZWF0ZQorICogQHN0YXJ0OiBicmFuY2ggdGFyZ2V0IHN0YXJ0aW5nIHRoaXMgYmFzaWMgYmxvY2sKKyAqIEBlbmQ6ICAgYnJhbmNoIGVuZGluZyB0aGlzIGJhc2ljIGJsb2NrCisgKgorICogQ3JlYXRlIGFsbCB0aGUgcmVxdWlyZWQgYmxvY2sgcmFuZ2VzIHRvIHByZWNpc2VseSBzcGFuIHRoZSBnaXZlbiByYW5nZS4KKyAqLworc3RydWN0IGJsb2NrX3JhbmdlX2l0ZXIgYmxvY2tfcmFuZ2VfX2NyZWF0ZSh1NjQgc3RhcnQsIHU2NCBlbmQpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJmJsb2NrX3Jhbmdlcy5yb290LnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKm4sICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBibG9ja19yYW5nZSAqbmV4dCwgKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgYmxvY2tfcmFuZ2VfaXRlciBpdGVyID0geyBOVUxMLCBOVUxMIH07CisKKwl3aGlsZSAoKnAgIT0gTlVMTCkgeworCQlwYXJlbnQgPSAqcDsKKwkJZW50cnkgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBibG9ja19yYW5nZSwgbm9kZSk7CisKKwkJaWYgKHN0YXJ0IDwgZW50cnktPnN0YXJ0KQorCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKHN0YXJ0ID4gZW50cnktPmVuZCkKKwkJCXAgPSAmcGFyZW50LT5yYl9yaWdodDsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBEaWRuJ3QgZmluZCBhbnl0aGluZy4uIHRoZXJlJ3MgYSBob2xlIGF0IEBzdGFydCwgaG93ZXZlciBAZW5kIG1pZ2h0CisJICogYmUgaW5zaWRlL2JlaGluZCB0aGUgbmV4dCByYW5nZS4KKwkgKi8KKwlpZiAoISpwKSB7CisJCWlmICghZW50cnkpIC8qIHRyZWUgZW1wdHkgKi8KKwkJCWdvdG8gZG9fd2hvbGU7CisKKwkJLyoKKwkJICogSWYgdGhlIGxhc3Qgbm9kZSBpcyBiZWZvcmUsIGFkdmFuY2Ugb25lIHRvIGZpbmQgdGhlIG5leHQuCisJCSAqLworCQluID0gcGFyZW50OworCQlpZiAoZW50cnktPmVuZCA8IHN0YXJ0KSB7CisJCQluID0gcmJfbmV4dChuKTsKKwkJCWlmICghbikKKwkJCQlnb3RvIGRvX3dob2xlOworCQl9CisJCW5leHQgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmxvY2tfcmFuZ2UsIG5vZGUpOworCisJCWlmIChuZXh0LT5zdGFydCA8PSBlbmQpIHsgLyogYWRkIGhlYWQ6IFtzdGFydC4uLl1bbi0+c3RhcnQuLi5dICovCisJCQlzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmhlYWQgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBibG9ja19yYW5nZSkpOworCQkJaWYgKCFoZWFkKQorCQkJCXJldHVybiBpdGVyOworCisJCQkqaGVhZCA9IChzdHJ1Y3QgYmxvY2tfcmFuZ2UpeworCQkJCS5zdGFydAkJPSBzdGFydCwKKwkJCQkuZW5kCQk9IG5leHQtPnN0YXJ0IC0gMSwKKwkJCQkuaXNfdGFyZ2V0CT0gMSwKKwkJCQkuaXNfYnJhbmNoCT0gMCwKKwkJCX07CisKKwkJCXJiX2xpbmtfbGVmdF9vZl9ub2RlKCZoZWFkLT5ub2RlLCAmbmV4dC0+bm9kZSk7CisJCQlyYl9pbnNlcnRfY29sb3IoJmhlYWQtPm5vZGUsICZibG9ja19yYW5nZXMucm9vdCk7CisJCQlibG9ja19yYW5nZV9fZGVidWcoKTsKKworCQkJaXRlci5zdGFydCA9IGhlYWQ7CisJCQlnb3RvIGRvX3RhaWw7CisJCX0KKworZG9fd2hvbGU6CisJCS8qCisJCSAqIFRoZSB3aG9sZSBbc3RhcnQuLmVuZF0gcmFuZ2UgaXMgbm9uLW92ZXJsYXBwaW5nLgorCQkgKi8KKwkJZW50cnkgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBibG9ja19yYW5nZSkpOworCQlpZiAoIWVudHJ5KQorCQkJcmV0dXJuIGl0ZXI7CisKKwkJKmVudHJ5ID0gKHN0cnVjdCBibG9ja19yYW5nZSl7CisJCQkuc3RhcnQJCT0gc3RhcnQsCisJCQkuZW5kCQk9IGVuZCwKKwkJCS5pc190YXJnZXQJPSAxLAorCQkJLmlzX2JyYW5jaAk9IDEsCisJCX07CisKKwkJcmJfbGlua19ub2RlKCZlbnRyeS0+bm9kZSwgcGFyZW50LCBwKTsKKwkJcmJfaW5zZXJ0X2NvbG9yKCZlbnRyeS0+bm9kZSwgJmJsb2NrX3Jhbmdlcy5yb290KTsKKwkJYmxvY2tfcmFuZ2VfX2RlYnVnKCk7CisKKwkJaXRlci5zdGFydCA9IGVudHJ5OworCQlpdGVyLmVuZCAgID0gZW50cnk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIFdlIGZvdW5kIGEgcmFuZ2UgdGhhdCBvdmVybGFwcGVkIHdpdGggb3Vycywgc3BsaXQgaWYgbmVlZGVkLgorCSAqLworCWlmIChlbnRyeS0+c3RhcnQgPCBzdGFydCkgeyAvKiBzcGxpdDogW2UtPnN0YXJ0Li4uXVtzdGFydC4uLl0gKi8KKwkJc3RydWN0IGJsb2NrX3JhbmdlICpoZWFkID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYmxvY2tfcmFuZ2UpKTsKKwkJaWYgKCFoZWFkKQorCQkJcmV0dXJuIGl0ZXI7CisKKwkJKmhlYWQgPSAoc3RydWN0IGJsb2NrX3JhbmdlKXsKKwkJCS5zdGFydAkJPSBlbnRyeS0+c3RhcnQsCisJCQkuZW5kCQk9IHN0YXJ0IC0gMSwKKwkJCS5pc190YXJnZXQJPSBlbnRyeS0+aXNfdGFyZ2V0LAorCQkJLmlzX2JyYW5jaAk9IDAsCisKKwkJCS5jb3ZlcmFnZQk9IGVudHJ5LT5jb3ZlcmFnZSwKKwkJCS5lbnRyeQkJPSBlbnRyeS0+ZW50cnksCisJCX07CisKKwkJZW50cnktPnN0YXJ0CQk9IHN0YXJ0OworCQllbnRyeS0+aXNfdGFyZ2V0CT0gMTsKKwkJZW50cnktPmVudHJ5CQk9IDA7CisKKwkJcmJfbGlua19sZWZ0X29mX25vZGUoJmhlYWQtPm5vZGUsICZlbnRyeS0+bm9kZSk7CisJCXJiX2luc2VydF9jb2xvcigmaGVhZC0+bm9kZSwgJmJsb2NrX3Jhbmdlcy5yb290KTsKKwkJYmxvY2tfcmFuZ2VfX2RlYnVnKCk7CisKKwl9IGVsc2UgaWYgKGVudHJ5LT5zdGFydCA9PSBzdGFydCkKKwkJZW50cnktPmlzX3RhcmdldCA9IDE7CisKKwlpdGVyLnN0YXJ0ID0gZW50cnk7CisKK2RvX3RhaWw6CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHdlJ3ZlIGdvdDogQGl0ZXIuc3RhcnQgPSBbQHN0YXJ0Li4uXSBidXQgQGVuZCBjYW4gc3RpbGwgYmUKKwkgKiBpbnNpZGUgb3IgYmV5b25kIGl0LgorCSAqLworCWVudHJ5ID0gaXRlci5zdGFydDsKKwlmb3IgKDs7KSB7CisJCS8qCisJCSAqIElmIEBlbmQgaXMgaW5zaWRlIEBlbnRyeSwgc3BsaXQuCisJCSAqLworCQlpZiAoZW5kIDwgZW50cnktPmVuZCkgeyAvKiBzcGxpdDogWy4uLmVuZF1bLi4uZS0+ZW5kXSAqLworCQkJc3RydWN0IGJsb2NrX3JhbmdlICp0YWlsID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYmxvY2tfcmFuZ2UpKTsKKwkJCWlmICghdGFpbCkKKwkJCQlyZXR1cm4gaXRlcjsKKworCQkJKnRhaWwgPSAoc3RydWN0IGJsb2NrX3JhbmdlKXsKKwkJCQkuc3RhcnQJCT0gZW5kICsgMSwKKwkJCQkuZW5kCQk9IGVudHJ5LT5lbmQsCisJCQkJLmlzX3RhcmdldAk9IDAsCisJCQkJLmlzX2JyYW5jaAk9IGVudHJ5LT5pc19icmFuY2gsCisKKwkJCQkuY292ZXJhZ2UJPSBlbnRyeS0+Y292ZXJhZ2UsCisJCQkJLnRha2VuCQk9IGVudHJ5LT50YWtlbiwKKwkJCQkucHJlZAkJPSBlbnRyeS0+cHJlZCwKKwkJCX07CisKKwkJCWVudHJ5LT5lbmQJCT0gZW5kOworCQkJZW50cnktPmlzX2JyYW5jaAk9IDE7CisJCQllbnRyeS0+dGFrZW4JCT0gMDsKKwkJCWVudHJ5LT5wcmVkCQk9IDA7CisKKwkJCXJiX2xpbmtfcmlnaHRfb2Zfbm9kZSgmdGFpbC0+bm9kZSwgJmVudHJ5LT5ub2RlKTsKKwkJCXJiX2luc2VydF9jb2xvcigmdGFpbC0+bm9kZSwgJmJsb2NrX3Jhbmdlcy5yb290KTsKKwkJCWJsb2NrX3JhbmdlX19kZWJ1ZygpOworCisJCQlpdGVyLmVuZCA9IGVudHJ5OworCQkJZ290byBkb25lOworCQl9CisKKwkJLyoKKwkJICogSWYgQGVuZCBtYXRjaGVzIEBlbnRyeSwgZG9uZQorCQkgKi8KKwkJaWYgKGVuZCA9PSBlbnRyeS0+ZW5kKSB7CisJCQllbnRyeS0+aXNfYnJhbmNoID0gMTsKKwkJCWl0ZXIuZW5kID0gZW50cnk7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQluZXh0ID0gYmxvY2tfcmFuZ2VfX25leHQoZW50cnkpOworCQlpZiAoIW5leHQpCisJCQlnb3RvIGFkZF90YWlsOworCisJCS8qCisJCSAqIElmIEBlbmQgaXMgaW4gYmV5b25kIEBlbnRyeSBidXQgbm90IGluc2lkZSBAbmV4dCwgYWRkIHRhaWwuCisJCSAqLworCQlpZiAoZW5kIDwgbmV4dC0+c3RhcnQpIHsgLyogYWRkIHRhaWw6IFsuLi5lLT5lbmRdWy4uLmVuZF0gKi8KKwkJCXN0cnVjdCBibG9ja19yYW5nZSAqdGFpbDsKK2FkZF90YWlsOgorCQkJdGFpbCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGJsb2NrX3JhbmdlKSk7CisJCQlpZiAoIXRhaWwpCisJCQkJcmV0dXJuIGl0ZXI7CisKKwkJCSp0YWlsID0gKHN0cnVjdCBibG9ja19yYW5nZSl7CisJCQkJLnN0YXJ0CQk9IGVudHJ5LT5lbmQgKyAxLAorCQkJCS5lbmQJCT0gZW5kLAorCQkJCS5pc190YXJnZXQJPSAwLAorCQkJCS5pc19icmFuY2gJPSAxLAorCQkJfTsKKworCQkJcmJfbGlua19yaWdodF9vZl9ub2RlKCZ0YWlsLT5ub2RlLCAmZW50cnktPm5vZGUpOworCQkJcmJfaW5zZXJ0X2NvbG9yKCZ0YWlsLT5ub2RlLCAmYmxvY2tfcmFuZ2VzLnJvb3QpOworCQkJYmxvY2tfcmFuZ2VfX2RlYnVnKCk7CisKKwkJCWl0ZXIuZW5kID0gdGFpbDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCS8qCisJCSAqIElmIHRoZXJlIGlzIGEgaG9sZSBiZXR3ZWVuIEBlbnRyeSBhbmQgQG5leHQsIGZpbGwgaXQuCisJCSAqLworCQlpZiAoZW50cnktPmVuZCArIDEgIT0gbmV4dC0+c3RhcnQpIHsKKwkJCXN0cnVjdCBibG9ja19yYW5nZSAqaG9sZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGJsb2NrX3JhbmdlKSk7CisJCQlpZiAoIWhvbGUpCisJCQkJcmV0dXJuIGl0ZXI7CisKKwkJCSpob2xlID0gKHN0cnVjdCBibG9ja19yYW5nZSl7CisJCQkJLnN0YXJ0CQk9IGVudHJ5LT5lbmQgKyAxLAorCQkJCS5lbmQJCT0gbmV4dC0+c3RhcnQgLSAxLAorCQkJCS5pc190YXJnZXQJPSAwLAorCQkJCS5pc19icmFuY2gJPSAwLAorCQkJfTsKKworCQkJcmJfbGlua19sZWZ0X29mX25vZGUoJmhvbGUtPm5vZGUsICZuZXh0LT5ub2RlKTsKKwkJCXJiX2luc2VydF9jb2xvcigmaG9sZS0+bm9kZSwgJmJsb2NrX3Jhbmdlcy5yb290KTsKKwkJCWJsb2NrX3JhbmdlX19kZWJ1ZygpOworCQl9CisKKwkJZW50cnkgPSBuZXh0OworCX0KKworZG9uZToKKwlhc3NlcnQoaXRlci5zdGFydC0+c3RhcnQgPT0gc3RhcnQgJiYgaXRlci5zdGFydC0+aXNfdGFyZ2V0KTsKKwlhc3NlcnQoaXRlci5lbmQtPmVuZCA9PSBlbmQgJiYgaXRlci5lbmQtPmlzX2JyYW5jaCk7CisKKwlibG9ja19yYW5nZXMuYmxvY2tzKys7CisKKwlyZXR1cm4gaXRlcjsKK30KKworCisvKgorICogQ29tcHV0ZSBjb3ZlcmFnZSBhczoKKyAqCisgKiAgICBici0+Y292ZXJhZ2UgLyBici0+c3ltLT5tYXhfY292ZXJhZ2UKKyAqCisgKiBUaGlzIGVuc3VyZXMgZWFjaCBzeW1ib2wgaGFzIGEgMTAwJSBzcG90LCB0byByZWZsZWN0IHRoYXQgZWFjaCBzeW1ib2wgaGFzIGEKKyAqIG1vc3QgY292ZXJlZCBzZWN0aW9uLgorICoKKyAqIFJldHVybnMgWzAtMV0gZm9yIGNvdmVyYWdlIGFuZCAtMSBpZiB3ZSBoYWQgbm8gZGF0YSB3aGF0IHNvIGV2ZXIgb3IgdGhlCisgKiBzeW1ib2wgZG9lcyBub3QgZXhpc3QuCisgKi8KK2RvdWJsZSBibG9ja19yYW5nZV9fY292ZXJhZ2Uoc3RydWN0IGJsb2NrX3JhbmdlICpicikKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisKKwlpZiAoIWJyKSB7CisJCWlmIChibG9ja19yYW5nZXMuYmxvY2tzKQorCQkJcmV0dXJuIDA7CisKKwkJcmV0dXJuIC0xOworCX0KKworCXN5bSA9IGJyLT5zeW07CisJaWYgKCFzeW0pCisJCXJldHVybiAtMTsKKworCXJldHVybiAoZG91YmxlKWJyLT5jb3ZlcmFnZSAvIHN5bWJvbF9fYW5ub3RhdGlvbihzeW0pLT5tYXhfY292ZXJhZ2U7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvYmxvY2stcmFuZ2UuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ibG9jay1yYW5nZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Yzg0MTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvYmxvY2stcmFuZ2UuaApAQCAtMCwwICsxLDcxIEBACisjaWZuZGVmIF9fUEVSRl9CTE9DS19SQU5HRV9ICisjZGVmaW5lIF9fUEVSRl9CTE9DS19SQU5HRV9ICisKKyNpbmNsdWRlICJzeW1ib2wuaCIKKworLyoKKyAqIHN0cnVjdCBibG9ja19yYW5nZSAtIG5vbi1vdmVybGFwcGluZyBwYXJ0cyBvZiBiYXNpYyBibG9ja3MKKyAqIEBub2RlOgl0cmVlbm9kZQorICogQHN0YXJ0OglpbmNsdXNpdmUgc3RhcnQgb2YgcmFuZ2UKKyAqIEBlbmQ6CWluY2x1c2l2ZSBlbmQgb2YgcmFuZ2UKKyAqIEBpc190YXJnZXQ6CUBzdGFydCBpcyBhIGp1bXAgdGFyZ2V0CisgKiBAaXNfYnJhbmNoOglAZW5kIGlzIGEgYnJhbmNoIGluc3RydWN0aW9uCisgKiBAY292ZXJhZ2U6CW51bWJlciBvZiBibG9ja3MgdGhhdCBjb3ZlciB0aGlzIHJhbmdlCisgKiBAdGFrZW46CW51bWJlciBvZiB0aW1lcyB0aGUgYnJhbmNoIGlzIHRha2VuIChyZXF1aXJlcyBAaXNfYnJhbmNoKQorICogQHByZWQ6CW51bWJlciBvZiB0aW1lcyB0aGUgdGFrZW4gYnJhbmNoIHdhcyBwcmVkaWN0ZWQKKyAqLworc3RydWN0IGJsb2NrX3JhbmdlIHsKKwlzdHJ1Y3QgcmJfbm9kZSBub2RlOworCisJc3RydWN0IHN5bWJvbCAqc3ltOworCisJdTY0IHN0YXJ0OworCXU2NCBlbmQ7CisKKwlpbnQgaXNfdGFyZ2V0LCBpc19icmFuY2g7CisKKwl1NjQgY292ZXJhZ2U7CisJdTY0IGVudHJ5OworCXU2NCB0YWtlbjsKKwl1NjQgcHJlZDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJsb2NrX3JhbmdlICpibG9ja19yYW5nZV9fbmV4dChzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmJyKQoreworCXN0cnVjdCByYl9ub2RlICpuID0gcmJfbmV4dCgmYnItPm5vZGUpOworCWlmICghbikKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHJiX2VudHJ5KG4sIHN0cnVjdCBibG9ja19yYW5nZSwgbm9kZSk7Cit9CisKK3N0cnVjdCBibG9ja19yYW5nZV9pdGVyIHsKKwlzdHJ1Y3QgYmxvY2tfcmFuZ2UgKnN0YXJ0OworCXN0cnVjdCBibG9ja19yYW5nZSAqZW5kOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmJsb2NrX3JhbmdlX2l0ZXIoc3RydWN0IGJsb2NrX3JhbmdlX2l0ZXIgKml0ZXIpCit7CisJcmV0dXJuIGl0ZXItPnN0YXJ0OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYmxvY2tfcmFuZ2VfaXRlcl9fbmV4dChzdHJ1Y3QgYmxvY2tfcmFuZ2VfaXRlciAqaXRlcikKK3sKKwlpZiAoaXRlci0+c3RhcnQgPT0gaXRlci0+ZW5kKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpdGVyLT5zdGFydCA9IGJsb2NrX3JhbmdlX19uZXh0KGl0ZXItPnN0YXJ0KTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSBib29sIGJsb2NrX3JhbmdlX2l0ZXJfX3ZhbGlkKHN0cnVjdCBibG9ja19yYW5nZV9pdGVyICppdGVyKQoreworCWlmICghaXRlci0+c3RhcnQgfHwgIWl0ZXItPmVuZCkKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorCitleHRlcm4gc3RydWN0IGJsb2NrX3JhbmdlICpibG9ja19yYW5nZV9fZmluZCh1NjQgYWRkcik7CitleHRlcm4gc3RydWN0IGJsb2NrX3JhbmdlX2l0ZXIgYmxvY2tfcmFuZ2VfX2NyZWF0ZSh1NjQgc3RhcnQsIHU2NCBlbmQpOworZXh0ZXJuIGRvdWJsZSBibG9ja19yYW5nZV9fY292ZXJhZ2Uoc3RydWN0IGJsb2NrX3JhbmdlICpicik7CisKKyNlbmRpZiAvKiBfX1BFUkZfQkxPQ0tfUkFOR0VfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2JwZi1sb2FkZXIuYyBiL3Rvb2xzL3BlcmYvdXRpbC9icGYtbG9hZGVyLmMKaW5kZXggMWYxMmU0ZS4uMmIyYzliOCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2JwZi1sb2FkZXIuYworKysgYi90b29scy9wZXJmL3V0aWwvYnBmLWxvYWRlci5jCkBAIC01MzEsNyArNTMxLDcgQEAKIAogCXB0ZXZzID0gbWFsbG9jKGFycmF5X3N6KTsKIAlpZiAoIXB0ZXZzKSB7Ci0JCXByX2RlYnVnKCJObyBlaG91Z2ggbWVtb3J5OiBhbGxvYyBwdGV2cyBmYWlsZWRcbiIpOworCQlwcl9kZWJ1ZygiTm8gZW5vdWdoIG1lbW9yeTogYWxsb2MgcHRldnMgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvYnVpbGQtaWQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9idWlsZC1pZC5jCmluZGV4IDU2NTFmM2MuLmU1MjhjNDAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9idWlsZC1pZC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9idWlsZC1pZC5jCkBAIC02MjAsNyArNjIwLDcgQEAKIAogCXJldCA9IHByb2JlX2NhY2hlX19zY2FuX3NkdChjYWNoZSwgcmVhbG5hbWUpOwogCWlmIChyZXQgPj0gMCkgewotCQlwcl9kZWJ1ZygiRm91bmQgJWQgU0RUcyBpbiAlc1xuIiwgcmV0LCByZWFsbmFtZSk7CisJCXByX2RlYnVnNCgiRm91bmQgJWQgU0RUcyBpbiAlc1xuIiwgcmV0LCByZWFsbmFtZSk7CiAJCWlmIChwcm9iZV9jYWNoZV9fY29tbWl0KGNhY2hlKSA8IDApCiAJCQlyZXQgPSAtMTsKIAl9CkBAIC02OTEsNyArNjkxLDcgQEAKIAogCS8qIFVwZGF0ZSBTRFQgY2FjaGUgOiBlcnJvciBpcyBqdXN0IHdhcm5lZCAqLwogCWlmIChidWlsZF9pZF9jYWNoZV9fYWRkX3NkdF9jYWNoZShzYnVpbGRfaWQsIHJlYWxuYW1lKSA8IDApCi0JCXByX2RlYnVnKCJGYWlsZWQgdG8gdXBkYXRlL3NjYW4gU0RUIGNhY2hlIGZvciAlc1xuIiwgcmVhbG5hbWUpOworCQlwcl9kZWJ1ZzQoIkZhaWxlZCB0byB1cGRhdGUvc2NhbiBTRFQgY2FjaGUgZm9yICVzXG4iLCByZWFsbmFtZSk7CiAKIG91dF9mcmVlOgogCWlmICghaXNfa2FsbHN5bXMpCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvY3MtZXRtLmggYi90b29scy9wZXJmL3V0aWwvY3MtZXRtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjNmJjMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9jcy1ldG0uaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0KEMpIDIwMTUgTGluYXJvIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBdXRob3I6IE1hdGhpZXUgUG9pcmllciA8bWF0aGlldS5wb2lyaWVyQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfX1VUSUxfUEVSRl9DU19FVE1fSF9fCisjZGVmaW5lIElOQ0xVREVfX1VUSUxfUEVSRl9DU19FVE1fSF9fCisKKy8qIFZlcnNpb25uaW5nIGhlYWRlciBpbiBjYXNlIHRoaW5ncyBuZWVkIHRybyBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4gIFRoYXQgd2F5CisgKiBkZWNvZGluZyBvZiBvbGQgc25hcHNob3QgaXMgc3RpbGwgcG9zc2libGUuCisgKi8KK2VudW0geworCS8qIFN0YXJ0aW5nIHdpdGggMHgwICovCisJQ1NfSEVBREVSX1ZFUlNJT05fMCwKKwkvKiBQTVUtPnR5cGUgKDMyIGJpdCksIHRvdGFsICMgb2YgQ1BVcyAoMzIgYml0KSAqLworCUNTX1BNVV9UWVBFX0NQVVMsCisJQ1NfRVRNX1NOQVBTSE9ULAorCUNTX0hFQURFUl9WRVJTSU9OXzBfTUFYLAorfTsKKworLyogQmVnaW5uaW5nIG9mIGhlYWRlciBjb21tb24gdG8gYm90aCBFVE12MyBhbmQgVjQgKi8KK2VudW0geworCUNTX0VUTV9NQUdJQywKKwlDU19FVE1fQ1BVLAorfTsKKworLyogRVRNdjMvUFRNIG1ldGFkYXRhICovCitlbnVtIHsKKwkvKiBEeW5hbWljLCBjb25maWd1cmFibGUgcGFyYW1ldGVycyAqLworCUNTX0VUTV9FVE1DUiA9IENTX0VUTV9DUFUgKyAxLAorCUNTX0VUTV9FVE1UUkFDRUlEUiwKKwkvKiBSTywgdGFrZW4gZnJvbSBzeXNGUyAqLworCUNTX0VUTV9FVE1DQ0VSLAorCUNTX0VUTV9FVE1JRFIsCisJQ1NfRVRNX1BSSVZfTUFYLAorfTsKKworLyogRVRNdjQgbWV0YWRhdGEgKi8KK2VudW0geworCS8qIER5bmFtaWMsIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzICovCisJQ1NfRVRNVjRfVFJDQ09ORklHUiA9IENTX0VUTV9DUFUgKyAxLAorCUNTX0VUTVY0X1RSQ1RSQUNFSURSLAorCS8qIFJPLCB0YWtlbiBmcm9tIHN5c0ZTICovCisJQ1NfRVRNVjRfVFJDSURSMCwKKwlDU19FVE1WNF9UUkNJRFIxLAorCUNTX0VUTVY0X1RSQ0lEUjIsCisJQ1NfRVRNVjRfVFJDSURSOCwKKwlDU19FVE1WNF9UUkNBVVRIU1RBVFVTLAorCUNTX0VUTVY0X1BSSVZfTUFYLAorfTsKKworI2RlZmluZSBLaUIoeCkgKCh4KSAqIDEwMjQpCisjZGVmaW5lIE1pQih4KSAoKHgpICogMTAyNCAqIDEwMjQpCisKKyNkZWZpbmUgQ1NfRVRNX0hFQURFUl9TSVpFIChDU19IRUFERVJfVkVSU0lPTl8wX01BWCAqIHNpemVvZih1NjQpKQorCitzdGF0aWMgY29uc3QgdTY0IF9fcGVyZl9jc19ldG12M19tYWdpYyAgID0gMHgzMDMwMzAzMDMwMzAzMDMwVUxMOworc3RhdGljIGNvbnN0IHU2NCBfX3BlcmZfY3NfZXRtdjRfbWFnaWMgICA9IDB4NDA0MDQwNDA0MDQwNDA0MFVMTDsKKyNkZWZpbmUgQ1NfRVRNVjNfUFJJVl9TSVpFIChDU19FVE1fUFJJVl9NQVggKiBzaXplb2YodTY0KSkKKyNkZWZpbmUgQ1NfRVRNVjRfUFJJVl9TSVpFIChDU19FVE1WNF9QUklWX01BWCAqIHNpemVvZih1NjQpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9kYXRhLWNvbnZlcnQtYnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9kYXRhLWNvbnZlcnQtYnQuYwppbmRleCA0Zjk3OWJiLi43MTIzZjRkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZGF0YS1jb252ZXJ0LWJ0LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2RhdGEtY29udmVydC1idC5jCkBAIC00MzcsNyArNDM3LDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKG5yX2VsZW1lbnRzICogc2l6ZW9mKHUzMikgIT0gcmF3X3NpemUpCi0JCXByX3dhcm5pbmcoIkluY29ycmVjdCByYXdfc2l6ZSAoJXUpIGluIGJwZiBvdXRwdXQgZXZlbnQsIHNraXAgJWx1IGJ5dGVzXG4iLAorCQlwcl93YXJuaW5nKCJJbmNvcnJlY3QgcmF3X3NpemUgKCV1KSBpbiBicGYgb3V0cHV0IGV2ZW50LCBza2lwICV6dSBieXRlc1xuIiwKIAkJCSAgIHJhd19zaXplLCBucl9lbGVtZW50cyAqIHNpemVvZih1MzIpIC0gcmF3X3NpemUpOwogCiAJbGVuX3R5cGUgPSBidF9jdGZfZXZlbnRfY2xhc3NfZ2V0X2ZpZWxkX2J5X25hbWUoZXZlbnRfY2xhc3MsICJyYXdfbGVuIik7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZGVidWcuYyBiL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Zy5jCmluZGV4IDhjNDIxMmEuLmMxODM4YjYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Zy5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Zy5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8YXBpL2RlYnVnLmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAKICNpbmNsdWRlICJjYWNoZS5oIgogI2luY2x1ZGUgImNvbG9yLmgiCkBAIC0xNCw5ICsxNSw2IEBACiAjaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgInRhcmdldC5oIgogCi0jZGVmaW5lIE5TRUNTX1BFUl9TRUMgIDEwMDAwMDAwMDBVTEwKLSNkZWZpbmUgTlNFQ1NfUEVSX1VTRUMgMTAwMFVMTAotCiBpbnQgdmVyYm9zZTsKIGJvb2wgZHVtcF90cmFjZSA9IGZhbHNlLCBxdWlldCA9IGZhbHNlOwogaW50IGRlYnVnX29yZGVyZWRfZXZlbnRzOwpAQCAtNTQsOSArNTIsOSBAQAogCWludCByZXQgPSAwOwogCXU2NCBzZWNzLCB1c2VjcywgbnNlY3MgPSB0OwogCi0Jc2VjcyAgID0gbnNlY3MgLyBOU0VDU19QRVJfU0VDOwotCW5zZWNzIC09IHNlY3MgICogTlNFQ1NfUEVSX1NFQzsKLQl1c2VjcyAgPSBuc2VjcyAvIE5TRUNTX1BFUl9VU0VDOworCXNlY3MgICA9IG5zZWNzIC8gTlNFQ19QRVJfU0VDOworCW5zZWNzIC09IHNlY3MgICogTlNFQ19QRVJfU0VDOworCXVzZWNzICA9IG5zZWNzIC8gTlNFQ19QRVJfVVNFQzsKIAogCXJldCA9IGZwcmludGYoc3RkZXJyLCAiWyUxMyIgUFJJdTY0ICIuJTA2IiBQUkl1NjQgIl0gIiwKIAkJICAgICAgc2VjcywgdXNlY3MpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2Rydl9jb25maWdzLmMgYi90b29scy9wZXJmL3V0aWwvZHJ2X2NvbmZpZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjQ3ZjI4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2Rydl9jb25maWdzLmMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIGRydl9jb25maWdzLmg6IEludGVyZmFjZSB0byBhcHBseSBQTVUgc3BlY2lmaWMgY29uZmlndXJhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTgsIExpbmFybyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSAiZHJ2X2NvbmZpZ3MuaCIKKyNpbmNsdWRlICJldmxpc3QuaCIKKyNpbmNsdWRlICJldnNlbC5oIgorI2luY2x1ZGUgInBtdS5oIgorCitzdGF0aWMgaW50CitwZXJmX2V2c2VsX19hcHBseV9kcnZfY29uZmlncyhzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCisJCQkgICAgICBzdHJ1Y3QgcGVyZl9ldnNlbF9jb25maWdfdGVybSAqKmVycl90ZXJtKQoreworCWJvb2wgZm91bmQgPSBmYWxzZTsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgcGVyZl9ldnNlbF9jb25maWdfdGVybSAqdGVybTsKKwlzdHJ1Y3QgcGVyZl9wbXUgKnBtdSA9IE5VTEw7CisKKwl3aGlsZSAoKHBtdSA9IHBlcmZfcG11X19zY2FuKHBtdSkpICE9IE5VTEwpCisJCWlmIChwbXUtPnR5cGUgPT0gZXZzZWwtPmF0dHIudHlwZSkgeworCQkJZm91bmQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkodGVybSwgJmV2c2VsLT5jb25maWdfdGVybXMsIGxpc3QpIHsKKwkJaWYgKHRlcm0tPnR5cGUgIT0gUEVSRl9FVlNFTF9fQ09ORklHX1RFUk1fRFJWX0NGRykKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIFdlIGhhdmUgYSBjb25maWd1cmF0aW9uIHRlcm0sIHJlcG9ydCBhbiBlcnJvciBpZiB3ZQorCQkgKiBjYW4ndCBmaW5kIHRoZSBQTVUgb3IgaWYgdGhlIFBNVSBkcml2ZXIgZG9lc24ndCBzdXBwb3J0CisJCSAqIGNtZCBsaW5lIGRyaXZlciBjb25maWd1cmF0aW9uLgorCQkgKi8KKwkJaWYgKCFmb3VuZCB8fCAhcG11LT5zZXRfZHJ2X2NvbmZpZykgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCSplcnJfdGVybSA9IHRlcm07CisJCQlicmVhazsKKwkJfQorCisJCWVyciA9IHBtdS0+c2V0X2Rydl9jb25maWcodGVybSk7CisJCWlmIChlcnIpIHsKKwkJCSplcnJfdGVybSA9IHRlcm07CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBlcnI7Cit9CisKK2ludCBwZXJmX2V2bGlzdF9fYXBwbHlfZHJ2X2NvbmZpZ3Moc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCisJCQkJICAgc3RydWN0IHBlcmZfZXZzZWwgKiplcnJfZXZzZWwsCisJCQkJICAgc3RydWN0IHBlcmZfZXZzZWxfY29uZmlnX3Rlcm0gKiplcnJfdGVybSkKK3sKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CisJaW50IGVyciA9IDA7CisKKwlldmxpc3RfX2Zvcl9lYWNoX2VudHJ5KGV2bGlzdCwgZXZzZWwpIHsKKwkJZXJyID0gcGVyZl9ldnNlbF9fYXBwbHlfZHJ2X2NvbmZpZ3MoZXZzZWwsIGVycl90ZXJtKTsKKwkJaWYgKGVycikgeworCQkJKmVycl9ldnNlbCA9IGV2c2VsOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2Rydl9jb25maWdzLmggYi90b29scy9wZXJmL3V0aWwvZHJ2X2NvbmZpZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmJjOWJhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2Rydl9jb25maWdzLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIGRydl9jb25maWdzLmg6IEludGVyZmFjZSB0byBhcHBseSBQTVUgc3BlY2lmaWMgY29uZmlndXJhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTgsIExpbmFybyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fUEVSRl9EUlZfQ09ORklHU19ICisjZGVmaW5lIF9fUEVSRl9EUlZfQ09ORklHU19ICisKKyNpbmNsdWRlICJkcnZfY29uZmlncy5oIgorI2luY2x1ZGUgImV2bGlzdC5oIgorI2luY2x1ZGUgImV2c2VsLmgiCisKK2ludCBwZXJmX2V2bGlzdF9fYXBwbHlfZHJ2X2NvbmZpZ3Moc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCisJCQkJICAgc3RydWN0IHBlcmZfZXZzZWwgKiplcnJfZXZzZWwsCisJCQkJICAgc3RydWN0IHBlcmZfZXZzZWxfY29uZmlnX3Rlcm0gKip0ZXJtKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2Rzby5jIGIvdG9vbHMvcGVyZi91dGlsL2Rzby5jCmluZGV4IDc3NGY2ZWMuLmQyYzZjZGQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9kc28uYworKysgYi90b29scy9wZXJmL3V0aWwvZHNvLmMKQEAgLTM2Myw2ICszNjMsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoIWlzX3JlZ3VsYXJfZmlsZShuYW1lKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlmZCA9IGRvX29wZW4obmFtZSk7CiAJZnJlZShuYW1lKTsKIAlyZXR1cm4gZmQ7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZHdhcmYtYXV4LmMgYi90b29scy9wZXJmL3V0aWwvZHdhcmYtYXV4LmMKaW5kZXggYTM0N2IxOS4uNDFlMDY4ZSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2R3YXJmLWF1eC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9kd2FyZi1hdXguYwpAQCAtMTMwLDYgKzEzMCwyMiBAQAogfQogCiAvKioKKyAqIGRpZV9nZXRfbGlua2FnZV9uYW1lIC0gR2V0IHRoZSBsaW5rYWdlIG5hbWUgb2YgdGhlIG9iamVjdAorICogQGR3X2RpZTogQSBESUUgb2YgdGhlIG9iamVjdAorICoKKyAqIEdldCB0aGUgbGlua2FnZSBuYW1lIGF0dGlyaWJ1dGUgb2YgZ2l2ZW4gQGR3X2RpZS4KKyAqIEZvciBDKysgYmluYXJ5LCB0aGUgbGlua2FnZSBuYW1lIHdpbGwgYmUgdGhlIG1hbmdsZWQgc3ltYm9sLgorICovCitjb25zdCBjaGFyICpkaWVfZ2V0X2xpbmthZ2VfbmFtZShEd2FyZl9EaWUgKmR3X2RpZSkKK3sKKwlEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKKworCWlmIChkd2FyZl9hdHRyX2ludGVncmF0ZShkd19kaWUsIERXX0FUX2xpbmthZ2VfbmFtZSwgJmF0dHIpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJldHVybiBkd2FyZl9mb3Jtc3RyaW5nKCZhdHRyKTsKK30KKworLyoqCiAgKiBkaWVfY29tcGFyZV9uYW1lIC0gQ29tcGFyZSBkaWVuYW1lIGFuZCB0bmFtZQogICogQGR3X2RpZTogYSBESUUKICAqIEB0bmFtZTogYSBzdHJpbmcgb2YgdGFyZ2V0IG5hbWUKQEAgLTE0NSwxOCArMTYxLDI2IEBACiB9CiAKIC8qKgotICogZGllX21hdGNoX25hbWUgLSBNYXRjaCBkaWVuYW1lIGFuZCBnbG9iCisgKiBkaWVfbWF0Y2hfbmFtZSAtIE1hdGNoIGRpZW5hbWUvbGlua2FnZSBuYW1lIGFuZCBnbG9iCiAgKiBAZHdfZGllOiBhIERJRQogICogQGdsb2I6IGEgc3RyaW5nIG9mIHRhcmdldCBnbG9iIHBhdHRlcm4KICAqCiAgKiBHbG9iIG1hdGNoaW5nIHRoZSBuYW1lIG9mIEBkd19kaWUgYW5kIEBnbG9iLiBSZXR1cm4gZmFsc2UgaWYgbWF0Y2hpbmcgZmFpbC4KKyAqIFRoaXMgYWxzbyBtYXRjaCBsaW5rYWdlIG5hbWUuCiAgKi8KIGJvb2wgZGllX21hdGNoX25hbWUoRHdhcmZfRGllICpkd19kaWUsIGNvbnN0IGNoYXIgKmdsb2IpCiB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAogCW5hbWUgPSBkd2FyZl9kaWVuYW1lKGR3X2RpZSk7Ci0JcmV0dXJuIG5hbWUgPyBzdHJnbG9ibWF0Y2gobmFtZSwgZ2xvYikgOiBmYWxzZTsKKwlpZiAobmFtZSAmJiBzdHJnbG9ibWF0Y2gobmFtZSwgZ2xvYikpCisJCXJldHVybiB0cnVlOworCS8qIGZhbGwgYmFjayB0byBjaGVjayBsaW5rYWdlIG5hbWUgKi8KKwluYW1lID0gZGllX2dldF9saW5rYWdlX25hbWUoZHdfZGllKTsKKwlpZiAobmFtZSAmJiBzdHJnbG9ibWF0Y2gobmFtZSwgZ2xvYikpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOwogfQogCiAvKioKQEAgLTEwODUsMyArMTEwOSwxODIgQEAKIAlyZXR1cm4gLUVOT1RTVVA7CiB9CiAjZW5kaWYKKworLyoKKyAqIGRpZV9oYXNfbG9jbGlzdCAtIENoZWNrIGlmIERXX0FUX2xvY2F0aW9uIG9mIEB2cl9kaWUgaXMgYSBsb2NhdGlvbiBsaXN0CisgKiBAdnJfZGllOiBhIHZhcmlhYmxlIERJRQorICovCitzdGF0aWMgYm9vbCBkaWVfaGFzX2xvY2xpc3QoRHdhcmZfRGllICp2cl9kaWUpCit7CisJRHdhcmZfQXR0cmlidXRlIGxvYzsKKwlpbnQgdGFnID0gZHdhcmZfdGFnKHZyX2RpZSk7CisKKwlpZiAodGFnICE9IERXX1RBR19mb3JtYWxfcGFyYW1ldGVyICYmCisJICAgIHRhZyAhPSBEV19UQUdfdmFyaWFibGUpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiAoZHdhcmZfYXR0cl9pbnRlZ3JhdGUodnJfZGllLCBEV19BVF9sb2NhdGlvbiwgJmxvYykgJiYKKwkJZHdhcmZfd2hhdGZvcm0oJmxvYykgPT0gRFdfRk9STV9zZWNfb2Zmc2V0KTsKK30KKworLyoKKyAqIGRpZV9pc19vcHRpbWl6ZWRfdGFyZ2V0IC0gQ2hlY2sgaWYgdGFyZ2V0IHByb2dyYW0gaXMgY29tcGlsZWQgd2l0aAorICogb3B0aW1pemF0aW9uCisgKiBAY3VfZGllOiBhIENVIERJRQorICoKKyAqIEZvciBhbnkgb2JqZWN0IGluIGdpdmVuIENVIHdob3NlIERXX0FUX2xvY2F0aW9uIGlzIGEgbG9jYXRpb24gbGlzdCwKKyAqIHRhcmdldCBwcm9ncmFtIGlzIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9uLiBUaGlzIGlzIGFwcGxpY2FibGUgdG8KKyAqIGNsYW5nIGFzIHdlbGwuCisgKi8KK2Jvb2wgZGllX2lzX29wdGltaXplZF90YXJnZXQoRHdhcmZfRGllICpjdV9kaWUpCit7CisJRHdhcmZfRGllIHRtcF9kaWU7CisKKwlpZiAoZGllX2hhc19sb2NsaXN0KGN1X2RpZSkpCisJCXJldHVybiB0cnVlOworCisJaWYgKCFkd2FyZl9jaGlsZChjdV9kaWUsICZ0bXBfZGllKSAmJgorCSAgICBkaWVfaXNfb3B0aW1pemVkX3RhcmdldCgmdG1wX2RpZSkpCisJCXJldHVybiB0cnVlOworCisJaWYgKCFkd2FyZl9zaWJsaW5nb2YoY3VfZGllLCAmdG1wX2RpZSkgJiYKKwkgICAgZGllX2lzX29wdGltaXplZF90YXJnZXQoJnRtcF9kaWUpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIGRpZV9zZWFyY2hfaWR4IC0gU2VhcmNoIGluZGV4IG9mIGdpdmVuIGxpbmUgYWRkcmVzcworICogQGxpbmVzOiBMaW5lIHJlY29yZHMgb2Ygc2luZ2xlIENVCisgKiBAbnJfbGluZXM6IE51bWJlciBvZiBAbGluZXMKKyAqIEBhZGRyOiBhZGRyZXNzIHdlIGFyZSBsb29raW5nIGZvcgorICogQGlkeDogaW5kZXggdG8gYmUgc2V0IGJ5IHRoaXMgZnVuY3Rpb24gKHJldHVybiB2YWx1ZSkKKyAqCisgKiBTZWFyY2ggZm9yIEBhZGRyIGJ5IGxvb3Bpbmcgb3ZlciBldmVyeSBsaW5lcyBvZiBDVS4gSWYgYWRkcmVzcworICogbWF0Y2hlcywgc2V0IGluZGV4IG9mIHRoYXQgbGluZSBpbiBAaWR4LiBOb3RlIHRoYXQgc2luZ2xlIHNvdXJjZQorICogbGluZSBjYW4gaGF2ZSBtdWx0aXBsZSBsaW5lIHJlY29yZHMuIGkuZS4gc2luZ2xlIHNvdXJjZSBsaW5lIGNhbgorICogaGF2ZSBtdWx0aXBsZSBpbmRleC4KKyAqLworc3RhdGljIGJvb2wgZGllX3NlYXJjaF9pZHgoRHdhcmZfTGluZXMgKmxpbmVzLCB1bnNpZ25lZCBsb25nIG5yX2xpbmVzLAorCQkJICAgRHdhcmZfQWRkciBhZGRyLCB1bnNpZ25lZCBsb25nICppZHgpCit7CisJdW5zaWduZWQgbG9uZyBpOworCUR3YXJmX0FkZHIgdG1wOworCisJZm9yIChpID0gMDsgaSA8IG5yX2xpbmVzOyBpKyspIHsKKwkJaWYgKGR3YXJmX2xpbmVhZGRyKGR3YXJmX29uZXNyY2xpbmUobGluZXMsIGkpLCAmdG1wKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpZiAodG1wID09IGFkZHIpIHsKKwkJCSppZHggPSBpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogZGllX2dldF9wb3N0cHJvbG9ndWVfYWRkciAtIFNlYXJjaCBuZXh0IGFkZHJlc3MgYWZ0ZXIgZnVuY3Rpb24gcHJvbG9ndWUKKyAqIEBlbnRyeXBjX2lkeDogZW50cnlwYyBpbmRleAorICogQGxpbmVzOiBMaW5lIHJlY29yZHMgb2Ygc2luZ2xlIENVCisgKiBAbnJfbGluZXM6IE51bWJlciBvZiBAbGluZXMKKyAqIEBoaWducGM6IGhpZ2ggUEMgYWRkcmVzcyBvZiBmdW5jdGlvbgorICogQHBvc3Rwcm9sb2d1ZV9hZGRyOiBOZXh0IGFkZHJlc3MgYWZ0ZXIgZnVuY3Rpb24gcHJvbG9ndWUgKHJldHVybiB2YWx1ZSkKKyAqCisgKiBMb29rIGZvciBwcm9sb2d1ZS1lbmQgbWFya2VyLiBJZiB0aGVyZSBpcyBubyBleHBsaWNpdCBtYXJrZXIsIHJldHVybgorICogYWRkcmVzcyBvZiBuZXh0IGxpbmUgcmVjb3JkIG9yIG5leHQgc291cmNlIGxpbmUuCisgKi8KK3N0YXRpYyBib29sIGRpZV9nZXRfcG9zdHByb2xvZ3VlX2FkZHIodW5zaWduZWQgbG9uZyBlbnRyeXBjX2lkeCwKKwkJCQkgICAgICBEd2FyZl9MaW5lcyAqbGluZXMsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBucl9saW5lcywKKwkJCQkgICAgICBEd2FyZl9BZGRyIGhpZ2hwYywKKwkJCQkgICAgICBEd2FyZl9BZGRyICpwb3N0cHJvbG9ndWVfYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisJaW50IGVudHJ5cGNfbG5vLCBsbm87CisJRHdhcmZfTGluZSAqbGluZTsKKwlEd2FyZl9BZGRyIGFkZHI7CisJYm9vbCBwX2VuZDsKKworCS8qIGVudHJ5cGNfbG5vIGlzIGFjdHVhbCBzb3VyY2UgbGluZSBudW1iZXIgKi8KKwlsaW5lID0gZHdhcmZfb25lc3JjbGluZShsaW5lcywgZW50cnlwY19pZHgpOworCWlmIChkd2FyZl9saW5lbm8obGluZSwgJmVudHJ5cGNfbG5vKSkKKwkJcmV0dXJuIGZhbHNlOworCisJZm9yIChpID0gZW50cnlwY19pZHg7IGkgPCBucl9saW5lczsgaSsrKSB7CisJCWxpbmUgPSBkd2FyZl9vbmVzcmNsaW5lKGxpbmVzLCBpKTsKKworCQlpZiAoZHdhcmZfbGluZWFkZHIobGluZSwgJmFkZHIpIHx8CisJCSAgICBkd2FyZl9saW5lbm8obGluZSwgJmxubykgICAgfHwKKwkJICAgIGR3YXJmX2xpbmVwcm9sb2d1ZWVuZChsaW5lLCAmcF9lbmQpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCS8qIGhpZ2hwYyBpcyBleGNsdXNpdmUuIFtlbnRyeXBjLGhpZ2hwYykgKi8KKwkJaWYgKGFkZHIgPj0gaGlnaHBjKQorCQkJYnJlYWs7CisKKwkJLyogY2xhbmcgc3VwcG9ydHMgcHJvbG9ndWUtZW5kIG1hcmtlciAqLworCQlpZiAocF9lbmQpCisJCQlicmVhazsKKworCQkvKiBBY3R1YWwgbmV4dCBsaW5lIGluIHNvdXJjZSAqLworCQlpZiAobG5vICE9IGVudHJ5cGNfbG5vKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogU2luZ2xlIHNvdXJjZSBsaW5lIGNhbiBoYXZlIG11bHRpcGxlIGxpbmUgcmVjb3Jkcy4KKwkJICogRm9yIEV4YW1wbGUsCisJCSAqICAgICB2b2lkIGZvbygpIHsgcHJpbnRmKCJoZWxsb1xuIik7IH0KKwkJICogY29udGFpbnMgdHdvIGxpbmUgcmVjb3Jkcy4gT25lIHBvaW50cyB0byBkZWNsYXJhdGlvbiBhbmQKKwkJICogb3RoZXIgcG9pbnRzIHRvIHByaW50ZigpIGxpbmUuIFZhcmlhYmxlICdsbm8nIHdvbid0IGdldAorCQkgKiBpbmNyZW1lbnRlZCBpbiB0aGlzIGNhc2UgYnV0ICdpJyB3aWxsLgorCQkgKi8KKwkJaWYgKGkgIT0gZW50cnlwY19pZHgpCisJCQlicmVhazsKKwl9CisKKwlkd2FyZl9saW5lYWRkcihsaW5lLCBwb3N0cHJvbG9ndWVfYWRkcik7CisJaWYgKCpwb3N0cHJvbG9ndWVfYWRkciA+PSBoaWdocGMpCisJCWR3YXJmX2xpbmVhZGRyKGR3YXJmX29uZXNyY2xpbmUobGluZXMsIGkgLSAxKSwKKwkJCSAgICAgICBwb3N0cHJvbG9ndWVfYWRkcik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIGRpZV9za2lwX3Byb2xvZ3VlIC0gVXNlIG5leHQgYWRkcmVzcyBhZnRlciBwcm9sb2d1ZSBhcyBwcm9iZSBsb2NhdGlvbgorICogQHNwX2RpZTogYSBzdWJwcm9ncmFtIERJRQorICogQGN1X2RpZTogYSBDVSBESUUKKyAqIEBlbnRyeXBjOiBlbnRyeXBjIG9mIHRoZSBmdW5jdGlvbgorICoKKyAqIEZ1bmN0aW9uIHByb2xvZ3VlIHByZXBhcmVzIHN0YWNrIGFuZCByZWdpc3RlcnMgYmVmb3JlIGV4ZWN1dGluZyBmdW5jdGlvbgorICogbG9naWMuIFdoZW4gdGFyZ2V0IHByb2dyYW0gaXMgY29tcGlsZWQgd2l0aG91dCBvcHRpbWl6YXRpb24sIGZ1bmN0aW9uCisgKiBwYXJhbWV0ZXIgaW5mb3JtYXRpb24gaXMgb25seSB2YWxpZCBhZnRlciBwcm9sb2d1ZS4gV2hlbiB3ZSBwcm9iZSBlbnRyeXBjCisgKiBvZiB0aGUgZnVuY3Rpb24sIGFuZCB0cnkgdG8gcmVjb3JkIGZ1bmN0aW9uIHBhcmFtZXRlciwgaXQgY29udGFpbnMKKyAqIGdhcmJhZ2UgdmFsdWUuCisgKi8KK3ZvaWQgZGllX3NraXBfcHJvbG9ndWUoRHdhcmZfRGllICpzcF9kaWUsIER3YXJmX0RpZSAqY3VfZGllLAorCQkgICAgICAgRHdhcmZfQWRkciAqZW50cnlwYykKK3sKKwlzaXplX3QgbnJfbGluZXMgPSAwOworCXVuc2lnbmVkIGxvbmcgZW50cnlwY19pZHggPSAwOworCUR3YXJmX0xpbmVzICpsaW5lcyA9IE5VTEw7CisJRHdhcmZfQWRkciBwb3N0cHJvbG9ndWVfYWRkcjsKKwlEd2FyZl9BZGRyIGhpZ2hwYzsKKworCWlmIChkd2FyZl9oaWdocGMoc3BfZGllLCAmaGlnaHBjKSkKKwkJcmV0dXJuOworCisJaWYgKGR3YXJmX2dldHNyY2xpbmVzKGN1X2RpZSwgJmxpbmVzLCAmbnJfbGluZXMpKQorCQlyZXR1cm47CisKKwlpZiAoIWRpZV9zZWFyY2hfaWR4KGxpbmVzLCBucl9saW5lcywgKmVudHJ5cGMsICZlbnRyeXBjX2lkeCkpCisJCXJldHVybjsKKworCWlmICghZGllX2dldF9wb3N0cHJvbG9ndWVfYWRkcihlbnRyeXBjX2lkeCwgbGluZXMsIG5yX2xpbmVzLAorCQkJCSAgICAgICBoaWdocGMsICZwb3N0cHJvbG9ndWVfYWRkcikpCisJCXJldHVybjsKKworCSplbnRyeXBjID0gcG9zdHByb2xvZ3VlX2FkZHI7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZHdhcmYtYXV4LmggYi90b29scy9wZXJmL3V0aWwvZHdhcmYtYXV4LmgKaW5kZXggZGMwY2UxYS4uOGFjNTNiZiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2R3YXJmLWF1eC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9kd2FyZi1hdXguaApAQCAtMzgsNiArMzgsOSBAQAogaW50IGN1X3dhbGtfZnVuY3Rpb25zX2F0KER3YXJmX0RpZSAqY3VfZGllLCBEd2FyZl9BZGRyIGFkZHIsCiAJCQkgaW50ICgqY2FsbGJhY2spKER3YXJmX0RpZSAqLCB2b2lkICopLCB2b2lkICpkYXRhKTsKIAorLyogR2V0IERXX0FUX2xpbmthZ2VfbmFtZSAoc2hvdWxkIGJlIE5VTEwgZm9yIEMgYmluYXJ5KSAqLworY29uc3QgY2hhciAqZGllX2dldF9saW5rYWdlX25hbWUoRHdhcmZfRGllICpkd19kaWUpOworCiAvKiBFbnN1cmUgdGhhdCB0aGlzIERJRSBpcyBhIHN1YnByb2dyYW0gYW5kIGRlZmluaXRpb24gKG5vdCBkZWNsYXJhdGlvbikgKi8KIGJvb2wgZGllX2lzX2Z1bmNfZGVmKER3YXJmX0RpZSAqZHdfZGllKTsKIApAQCAtMTI1LDQgKzEyOCwxMiBAQAogLyogR2V0IHRoZSBuYW1lIGFuZCB0eXBlIG9mIGdpdmVuIHZhcmlhYmxlIERJRSwgc3RvcmVkIGFzICJ0eXBlXHRuYW1lIiAqLwogaW50IGRpZV9nZXRfdmFybmFtZShEd2FyZl9EaWUgKnZyX2RpZSwgc3RydWN0IHN0cmJ1ZiAqYnVmKTsKIGludCBkaWVfZ2V0X3Zhcl9yYW5nZShEd2FyZl9EaWUgKnNwX2RpZSwgRHdhcmZfRGllICp2cl9kaWUsIHN0cnVjdCBzdHJidWYgKmJ1Zik7CisKKy8qIENoZWNrIGlmIHRhcmdldCBwcm9ncmFtIGlzIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9uICovCitib29sIGRpZV9pc19vcHRpbWl6ZWRfdGFyZ2V0KER3YXJmX0RpZSAqY3VfZGllKTsKKworLyogVXNlIG5leHQgYWRkcmVzcyBhZnRlciBwcm9sb2d1ZSBhcyBwcm9iZSBsb2NhdGlvbiAqLwordm9pZCBkaWVfc2tpcF9wcm9sb2d1ZShEd2FyZl9EaWUgKnNwX2RpZSwgRHdhcmZfRGllICpjdV9kaWUsCisJCSAgICAgICBEd2FyZl9BZGRyICplbnRyeXBjKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZHdhcmYtcmVncy5jIGIvdG9vbHMvcGVyZi91dGlsL2R3YXJmLXJlZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmJjNGE4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2R3YXJmLXJlZ3MuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogZHdhcmYtcmVncy5jIDogTWFwcGluZyBvZiBEV0FSRiBkZWJ1ZyByZWdpc3RlciBudW1iZXJzIGludG8gcmVnaXN0ZXIgbmFtZXMuCisgKgorICogV3JpdHRlbiBieTogTWFzYW1pIEhpcmFtYXRzdSA8bWhpcmFtYXRAa2VybmVsLm9yZz4KKyAqLworCisjaW5jbHVkZSA8dXRpbC5oPgorI2luY2x1ZGUgPGRlYnVnLmg+CisjaW5jbHVkZSA8ZHdhcmYtcmVncy5oPgorI2luY2x1ZGUgPGVsZi5oPgorCisjaWZuZGVmIEVNX0FBUkNINjQKKyNkZWZpbmUgRU1fQUFSQ0g2NAkxODMgIC8qIEFSTSA2NCBiaXQgKi8KKyNlbmRpZgorCisvKiBEZWZpbmUgY29uc3QgY2hhciAqIHthcmNofV9yZWdpc3Rlcl90YmxbXSAqLworI2RlZmluZSBERUZJTkVfRFdBUkZfUkVHU1RSX1RBQkxFCisjaW5jbHVkZSAiLi4vYXJjaC94ODYvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgiCisjaW5jbHVkZSAiLi4vYXJjaC9hcm0vaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgiCisjaW5jbHVkZSAiLi4vYXJjaC9hcm02NC9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCIKKyNpbmNsdWRlICIuLi9hcmNoL3NoL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oIgorI2luY2x1ZGUgIi4uL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCIKKyNpbmNsdWRlICIuLi9hcmNoL3MzOTAvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgiCisjaW5jbHVkZSAiLi4vYXJjaC9zcGFyYy9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCIKKyNpbmNsdWRlICIuLi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCIKKworI2RlZmluZSBfX2dldF9kd2FyZl9yZWdzdHIodGJsLCBuKSAoKChuKSA8IEFSUkFZX1NJWkUodGJsKSkgPyAodGJsKVsobildIDogTlVMTCkKKworLyogUmV0dXJuIGFyY2hpdGVjdHVyZSBkZXBlbmRlbnQgcmVnaXN0ZXIgc3RyaW5nIChmb3Iga3Byb2JlLXRyYWNlcikgKi8KK2NvbnN0IGNoYXIgKmdldF9kd2FyZl9yZWdzdHIodW5zaWduZWQgaW50IG4sIHVuc2lnbmVkIGludCBtYWNoaW5lKQoreworCXN3aXRjaCAobWFjaGluZSkgeworCWNhc2UgRU1fTk9ORToJLyogR2VuZXJpYyBhcmNoIC0gdXNlIGhvc3QgYXJjaCAqLworCQlyZXR1cm4gZ2V0X2FyY2hfcmVnc3RyKG4pOworCWNhc2UgRU1fMzg2OgorCQlyZXR1cm4gX19nZXRfZHdhcmZfcmVnc3RyKHg4Nl8zMl9yZWdzdHJfdGJsLCBuKTsKKwljYXNlIEVNX1g4Nl82NDoKKwkJcmV0dXJuIF9fZ2V0X2R3YXJmX3JlZ3N0cih4ODZfNjRfcmVnc3RyX3RibCwgbik7CisJY2FzZSBFTV9BUk06CisJCXJldHVybiBfX2dldF9kd2FyZl9yZWdzdHIoYXJtX3JlZ3N0cl90YmwsIG4pOworCWNhc2UgRU1fQUFSQ0g2NDoKKwkJcmV0dXJuIF9fZ2V0X2R3YXJmX3JlZ3N0cihhYXJjaDY0X3JlZ3N0cl90YmwsIG4pOworCWNhc2UgRU1fU0g6CisJCXJldHVybiBfX2dldF9kd2FyZl9yZWdzdHIoc2hfcmVnc3RyX3RibCwgbik7CisJY2FzZSBFTV9TMzkwOgorCQlyZXR1cm4gX19nZXRfZHdhcmZfcmVnc3RyKHMzOTBfcmVnc3RyX3RibCwgbik7CisJY2FzZSBFTV9QUEM6CisJY2FzZSBFTV9QUEM2NDoKKwkJcmV0dXJuIF9fZ2V0X2R3YXJmX3JlZ3N0cihwb3dlcnBjX3JlZ3N0cl90YmwsIG4pOworCWNhc2UgRU1fU1BBUkM6CisJY2FzZSBFTV9TUEFSQ1Y5OgorCQlyZXR1cm4gX19nZXRfZHdhcmZfcmVnc3RyKHNwYXJjX3JlZ3N0cl90YmwsIG4pOworCWNhc2UgRU1fWFRFTlNBOgorCQlyZXR1cm4gX19nZXRfZHdhcmZfcmVnc3RyKHh0ZW5zYV9yZWdzdHJfdGJsLCBuKTsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIkVMRiBNQUNISU5FICV4IGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBtYWNoaW5lKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZlbnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCmluZGV4IGUyMDQzOGIuLjhhYjBkN2QgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCkBAIC0xLDUgKzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L21tYW4uaD4gLyogVG8gZ2V0IHRoaW5ncyBsaWtlIE1BUF9IVUdFVExCIGV2ZW4gb24gb2xkZXIgbGliYyBoZWFkZXJzICovCisjaW5jbHVkZSA8YXBpL2ZzL2ZzLmg+CiAjaW5jbHVkZSAiZXZlbnQuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImhpc3QuaCIKQEAgLTI0OCw2ICsyNDksOCBAQAogCWJvb2wgdHJ1bmNhdGlvbiA9IGZhbHNlOwogCXVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lb3V0ID0gcHJvY19tYXBfdGltZW91dCAqIDEwMDAwMDBVTEw7CiAJaW50IHJjID0gMDsKKwljb25zdCBjaGFyICpodWdldGxiZnNfbW50ID0gaHVnZXRsYmZzX19tb3VudHBvaW50KCk7CisJaW50IGh1Z2V0bGJmc19tbnRfbGVuID0gaHVnZXRsYmZzX21udCA/IHN0cmxlbihodWdldGxiZnNfbW50KSA6IDA7CiAKIAlpZiAobWFjaGluZV9faXNfZGVmYXVsdF9ndWVzdChtYWNoaW5lKSkKIAkJcmV0dXJuIDA7CkBAIC0zNDMsNiArMzQ2LDEyIEBACiAJCWlmICghc3RyY21wKGV4ZWNuYW1lLCAiIikpCiAJCQlzdHJjcHkoZXhlY25hbWUsIGFub25zdHIpOwogCisJCWlmIChodWdldGxiZnNfbW50X2xlbiAmJgorCQkgICAgIXN0cm5jbXAoZXhlY25hbWUsIGh1Z2V0bGJmc19tbnQsIGh1Z2V0bGJmc19tbnRfbGVuKSkgeworCQkJc3RyY3B5KGV4ZWNuYW1lLCBhbm9uc3RyKTsKKwkJCWV2ZW50LT5tbWFwMi5mbGFncyB8PSBNQVBfSFVHRVRMQjsKKwkJfQorCiAJCXNpemUgPSBzdHJsZW4oZXhlY25hbWUpICsgMTsKIAkJbWVtY3B5KGV2ZW50LT5tbWFwMi5maWxlbmFtZSwgZXhlY25hbWUsIHNpemUpOwogCQlzaXplID0gUEVSRl9BTElHTihzaXplLCBzaXplb2YodTY0KSk7CkBAIC0xMjg2LDcgKzEyOTUsNyBAQAogCQkgKiBtdXN0IGJlIGRvbmUgcHJpb3IgdG8gdXNpbmcga2VybmVsIG1hcHMuCiAJCSAqLwogCQlpZiAobG9hZF9tYXApCi0JCQltYXBfX2xvYWQoYWwtPm1hcCwgbWFjaGluZS0+c3ltYm9sX2ZpbHRlcik7CisJCQltYXBfX2xvYWQoYWwtPm1hcCk7CiAJCWFsLT5hZGRyID0gYWwtPm1hcC0+bWFwX2lwKGFsLT5tYXAsIGFsLT5hZGRyKTsKIAl9CiB9CkBAIC0xMjk3LDggKzEzMDYsNyBAQAogewogCXRocmVhZF9fZmluZF9hZGRyX21hcCh0aHJlYWQsIGNwdW1vZGUsIHR5cGUsIGFkZHIsIGFsKTsKIAlpZiAoYWwtPm1hcCAhPSBOVUxMKQotCQlhbC0+c3ltID0gbWFwX19maW5kX3N5bWJvbChhbC0+bWFwLCBhbC0+YWRkciwKLQkJCQkJICAgdGhyZWFkLT5tZy0+bWFjaGluZS0+c3ltYm9sX2ZpbHRlcik7CisJCWFsLT5zeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGFsLT5tYXAsIGFsLT5hZGRyKTsKIAllbHNlCiAJCWFsLT5zeW0gPSBOVUxMOwogfQpAQCAtMTM1OSw4ICsxMzY3LDcgQEAKIAkJCWFsLT5maWx0ZXJlZCB8PSAoMSA8PCBISVNUX0ZJTFRFUl9fRFNPKTsKIAkJfQogCi0JCWFsLT5zeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGFsLT5tYXAsIGFsLT5hZGRyLAotCQkJCQkgICBtYWNoaW5lLT5zeW1ib2xfZmlsdGVyKTsKKwkJYWwtPnN5bSA9IG1hcF9fZmluZF9zeW1ib2woYWwtPm1hcCwgYWwtPmFkZHIpOwogCX0KIAogCWlmIChzeW1ib2xfY29uZi5zeW1fbGlzdCAmJgpAQCAtMTQxNiw1ICsxNDIzLDUgQEAKIAlhbC0+c3ltID0gTlVMTDsKIAogCWlmIChhbC0+bWFwKQotCQlhbC0+c3ltID0gbWFwX19maW5kX3N5bWJvbChhbC0+bWFwLCBhbC0+YWRkciwgTlVMTCk7CisJCWFsLT5zeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGFsLT5tYXAsIGFsLT5hZGRyKTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuYwppbmRleCAwOTdiM2VkLi5lYTM0YzVhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZsaXN0LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5jCkBAIC0xMDMyLDE2ICsxMDMyLDE4IEBACiB9CiAKIHN0YXRpYyBpbnQgcGVyZl9ldmxpc3RfX21tYXBfcGVyX2V2c2VsKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCBpbnQgaWR4LAotCQkJCSAgICAgICBzdHJ1Y3QgbW1hcF9wYXJhbXMgKm1wLCBpbnQgY3B1LAorCQkJCSAgICAgICBzdHJ1Y3QgbW1hcF9wYXJhbXMgKm1wLCBpbnQgY3B1X2lkeCwKIAkJCQkgICAgICAgaW50IHRocmVhZCwgaW50ICpfb3V0cHV0LCBpbnQgKl9vdXRwdXRfYmFja3dhcmQpCiB7CiAJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsOwogCWludCByZXZlbnQ7CisJaW50IGV2bGlzdF9jcHUgPSBjcHVfbWFwX19jcHUoZXZsaXN0LT5jcHVzLCBjcHVfaWR4KTsKIAogCWV2bGlzdF9fZm9yX2VhY2hfZW50cnkoZXZsaXN0LCBldnNlbCkgewogCQlzdHJ1Y3QgcGVyZl9tbWFwICptYXBzID0gZXZsaXN0LT5tbWFwOwogCQlpbnQgKm91dHB1dCA9IF9vdXRwdXQ7CiAJCWludCBmZDsKKwkJaW50IGNwdTsKIAogCQlpZiAoZXZzZWwtPmF0dHIud3JpdGVfYmFja3dhcmQpIHsKIAkJCW91dHB1dCA9IF9vdXRwdXRfYmFja3dhcmQ7CkBAIC0xMDYwLDYgKzEwNjIsMTAgQEAKIAkJaWYgKGV2c2VsLT5zeXN0ZW1fd2lkZSAmJiB0aHJlYWQpCiAJCQljb250aW51ZTsKIAorCQljcHUgPSBjcHVfbWFwX19pZHgoZXZzZWwtPmNwdXMsIGV2bGlzdF9jcHUpOworCQlpZiAoY3B1ID09IC0xKQorCQkJY29udGludWU7CisKIAkJZmQgPSBGRChldnNlbCwgY3B1LCB0aHJlYWQpOwogCiAJCWlmICgqb3V0cHV0ID09IC0xKSB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZzZWwuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCmluZGV4IGQ5YjgwZWYuLjM4MGU4NGMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCkBAIC01MDcsMTcgKzUwNywxNyBAQAogCXU4IG9wLCByZXN1bHQsIHR5cGUgPSAoY29uZmlnID4+ICAwKSAmIDB4ZmY7CiAJY29uc3QgY2hhciAqZXJyID0gInVua25vd24tZXh0LWhhcmR3YXJlLWNhY2hlLXR5cGUiOwogCi0JaWYgKHR5cGUgPiBQRVJGX0NPVU5UX0hXX0NBQ0hFX01BWCkKKwlpZiAodHlwZSA+PSBQRVJGX0NPVU5UX0hXX0NBQ0hFX01BWCkKIAkJZ290byBvdXRfZXJyOwogCiAJb3AgPSAoY29uZmlnID4+ICA4KSAmIDB4ZmY7CiAJZXJyID0gInVua25vd24tZXh0LWhhcmR3YXJlLWNhY2hlLW9wIjsKLQlpZiAob3AgPiBQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWCkKKwlpZiAob3AgPj0gUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVgpCiAJCWdvdG8gb3V0X2VycjsKIAogCXJlc3VsdCA9IChjb25maWcgPj4gMTYpICYgMHhmZjsKIAllcnIgPSAidW5rbm93bi1leHQtaGFyZHdhcmUtY2FjaGUtcmVzdWx0IjsKLQlpZiAocmVzdWx0ID4gUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfTUFYKQorCWlmIChyZXN1bHQgPj0gUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfTUFYKQogCQlnb3RvIG91dF9lcnI7CiAKIAllcnIgPSAiaW52YWxpZC1jYWNoZSI7CkBAIC0xMDQ1LDE1ICsxMDQ1LDE1IEBACiAJcmV0dXJuIC0xOwogfQogCi1pbnQgcGVyZl9ldnNlbF9fYXBwZW5kX2ZpbHRlcihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCi0JCQkgICAgICBjb25zdCBjaGFyICpvcCwgY29uc3QgY2hhciAqZmlsdGVyKQorc3RhdGljIGludCBwZXJmX2V2c2VsX19hcHBlbmRfZmlsdGVyKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmZtdCwgY29uc3QgY2hhciAqZmlsdGVyKQogewogCWNoYXIgKm5ld19maWx0ZXI7CiAKIAlpZiAoZXZzZWwtPmZpbHRlciA9PSBOVUxMKQogCQlyZXR1cm4gcGVyZl9ldnNlbF9fc2V0X2ZpbHRlcihldnNlbCwgZmlsdGVyKTsKIAotCWlmIChhc3ByaW50ZigmbmV3X2ZpbHRlciwiKCVzKSAlcyAoJXMpIiwgZXZzZWwtPmZpbHRlciwgb3AsIGZpbHRlcikgPiAwKSB7CisJaWYgKGFzcHJpbnRmKCZuZXdfZmlsdGVyLCBmbXQsIGV2c2VsLT5maWx0ZXIsIGZpbHRlcikgPiAwKSB7CiAJCWZyZWUoZXZzZWwtPmZpbHRlcik7CiAJCWV2c2VsLT5maWx0ZXIgPSBuZXdfZmlsdGVyOwogCQlyZXR1cm4gMDsKQEAgLTEwNjIsNiArMTA2MiwxNiBAQAogCXJldHVybiAtMTsKIH0KIAoraW50IHBlcmZfZXZzZWxfX2FwcGVuZF90cF9maWx0ZXIoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBjb25zdCBjaGFyICpmaWx0ZXIpCit7CisJcmV0dXJuIHBlcmZfZXZzZWxfX2FwcGVuZF9maWx0ZXIoZXZzZWwsICIoJXMpICYmICglcykiLCBmaWx0ZXIpOworfQorCitpbnQgcGVyZl9ldnNlbF9fYXBwZW5kX2FkZHJfZmlsdGVyKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgY29uc3QgY2hhciAqZmlsdGVyKQoreworCXJldHVybiBwZXJmX2V2c2VsX19hcHBlbmRfZmlsdGVyKGV2c2VsLCAiJXMsJXMiLCBmaWx0ZXIpOworfQorCiBpbnQgcGVyZl9ldnNlbF9fZW5hYmxlKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCkKIHsKIAlpbnQgbnRocmVhZHMgPSB0aHJlYWRfbWFwX19ucihldnNlbC0+dGhyZWFkcyk7CkBAIC0xNzI4LDcgKzE3MzgsNiBAQAogCWRhdGEtPmNwdSA9IGRhdGEtPnBpZCA9IGRhdGEtPnRpZCA9IC0xOwogCWRhdGEtPnN0cmVhbV9pZCA9IGRhdGEtPmlkID0gZGF0YS0+dGltZSA9IC0xVUxMOwogCWRhdGEtPnBlcmlvZCA9IGV2c2VsLT5hdHRyLnNhbXBsZV9wZXJpb2Q7Ci0JZGF0YS0+d2VpZ2h0ID0gMDsKIAlkYXRhLT5jcHVtb2RlID0gZXZlbnQtPmhlYWRlci5taXNjICYgUEVSRl9SRUNPUkRfTUlTQ19DUFVNT0RFX01BU0s7CiAKIAlpZiAoZXZlbnQtPmhlYWRlci50eXBlICE9IFBFUkZfUkVDT1JEX1NBTVBMRSkgewpAQCAtMTkzNSw3ICsxOTQ0LDYgQEAKIAkJfQogCX0KIAotCWRhdGEtPndlaWdodCA9IDA7CiAJaWYgKHR5cGUgJiBQRVJGX1NBTVBMRV9XRUlHSFQpIHsKIAkJT1ZFUkZMT1dfQ0hFQ0tfdTY0KGFycmF5KTsKIAkJZGF0YS0+d2VpZ2h0ID0gKmFycmF5OwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmggYi90b29scy9wZXJmL3V0aWwvZXZzZWwuaAppbmRleCA0ZDQ0MTI5Li5iMTUwM2IwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZzZWwuaAorKysgYi90b29scy9wZXJmL3V0aWwvZXZzZWwuaApAQCAtNDYsNiArNDYsNyBAQAogCVBFUkZfRVZTRUxfX0NPTkZJR19URVJNX0lOSEVSSVQsCiAJUEVSRl9FVlNFTF9fQ09ORklHX1RFUk1fTUFYX1NUQUNLLAogCVBFUkZfRVZTRUxfX0NPTkZJR19URVJNX09WRVJXUklURSwKKwlQRVJGX0VWU0VMX19DT05GSUdfVEVSTV9EUlZfQ0ZHLAogCVBFUkZfRVZTRUxfX0NPTkZJR19URVJNX01BWCwKIH07CiAKQEAgLTU3LDYgKzU4LDcgQEAKIAkJdTY0CWZyZXE7CiAJCWJvb2wJdGltZTsKIAkJY2hhcgkqY2FsbGdyYXBoOworCQljaGFyCSpkcnZfY2ZnOwogCQl1NjQJc3RhY2tfdXNlcjsKIAkJaW50CW1heF9zdGFjazsKIAkJYm9vbAlpbmhlcml0OwpAQCAtMjMzLDggKzIzNSw5IEBACiAJCQkgICAgICAgYm9vbCB1c2Vfc2FtcGxlX2lkZW50aWZpZXIpOwogCiBpbnQgcGVyZl9ldnNlbF9fc2V0X2ZpbHRlcihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIGNvbnN0IGNoYXIgKmZpbHRlcik7Ci1pbnQgcGVyZl9ldnNlbF9fYXBwZW5kX2ZpbHRlcihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCi0JCQkgICAgICBjb25zdCBjaGFyICpvcCwgY29uc3QgY2hhciAqZmlsdGVyKTsKK2ludCBwZXJmX2V2c2VsX19hcHBlbmRfdHBfZmlsdGVyKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgY29uc3QgY2hhciAqZmlsdGVyKTsKK2ludCBwZXJmX2V2c2VsX19hcHBlbmRfYWRkcl9maWx0ZXIoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAorCQkJCSAgIGNvbnN0IGNoYXIgKmZpbHRlcik7CiBpbnQgcGVyZl9ldnNlbF9fYXBwbHlfZmlsdGVyKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgaW50IG5jcHVzLCBpbnQgbnRocmVhZHMsCiAJCQkgICAgIGNvbnN0IGNoYXIgKmZpbHRlcik7CiBpbnQgcGVyZl9ldnNlbF9fZW5hYmxlKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZzZWxfZnByaW50Zi5jIGIvdG9vbHMvcGVyZi91dGlsL2V2c2VsX2ZwcmludGYuYwppbmRleCAzNjc0ZTc3Li42NjJhMGE2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZzZWxfZnByaW50Zi5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbF9mcHJpbnRmLmMKQEAgLTEyMiw5ICsxMjIsNiBAQAogCQkJaWYgKCFub2RlKQogCQkJCWJyZWFrOwogCi0JCQlpZiAobm9kZS0+c3ltICYmIG5vZGUtPnN5bS0+aWdub3JlKQotCQkJCWdvdG8gbmV4dDsKLQogCQkJcHJpbnRlZCArPSBmcHJpbnRmKGZwLCAiJS0qLipzIiwgbGVmdF9hbGlnbm1lbnQsIGxlZnRfYWxpZ25tZW50LCAiICIpOwogCiAJCQlpZiAocHJpbnRfaXApCkBAIC0xNTgsNyArMTU1LDcgQEAKIAogCQkJaWYgKCFwcmludF9vbmVsaW5lKQogCQkJCXByaW50ZWQgKz0gZnByaW50ZihmcCwgIlxuIik7Ci1uZXh0OgorCiAJCQljYWxsY2hhaW5fY3Vyc29yX2FkdmFuY2UoY3Vyc29yKTsKIAkJfQogCX0KQEAgLTE4MSw3ICsxNzgsNyBAQAogCWlmIChjdXJzb3IgIT0gTlVMTCkgewogCQlwcmludGVkICs9IHNhbXBsZV9fZnByaW50Zl9jYWxsY2hhaW4oc2FtcGxlLCBsZWZ0X2FsaWdubWVudCwKIAkJCQkJCSAgICAgcHJpbnRfb3B0cywgY3Vyc29yLCBmcCk7Ci0JfSBlbHNlIGlmICghKGFsLT5zeW0gJiYgYWwtPnN5bS0+aWdub3JlKSkgeworCX0gZWxzZSB7CiAJCXByaW50ZWQgKz0gZnByaW50ZihmcCwgIiUtKi4qcyIsIGxlZnRfYWxpZ25tZW50LCBsZWZ0X2FsaWdubWVudCwgIiAiKTsKIAogCQlpZiAocHJpbnRfaXApCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGVhZGVyLmMgYi90b29scy9wZXJmL3V0aWwvaGVhZGVyLmMKaW5kZXggOGYwZGI0MC4uODVkZDBkYiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2hlYWRlci5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuYwpAQCAtODI4LDggKzgyOCw3IEBACiAgKiBkZWZhdWx0IGdldF9jcHVpZCgpOiBub3RoaW5nIGdldHMgcmVjb3JkZWQKICAqIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBtdXN0IGJlIGluIGFyY2gvJChBUkNIKS91dGlsL2hlYWRlci5jCiAgKi8KLWludCBfX2F0dHJpYnV0ZV9fICgod2VhaykpIGdldF9jcHVpZChjaGFyICpidWZmZXIgX19tYXliZV91bnVzZWQsCi0JCQkJICAgICBzaXplX3Qgc3ogX19tYXliZV91bnVzZWQpCitpbnQgX193ZWFrIGdldF9jcHVpZChjaGFyICpidWZmZXIgX19tYXliZV91bnVzZWQsIHNpemVfdCBzeiBfX21heWJlX3VudXNlZCkKIHsKIAlyZXR1cm4gLTE7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGlzdC5jIGIvdG9vbHMvcGVyZi91dGlsL2hpc3QuYwppbmRleCBkZTE1ZGJjLi5iMDI5OTJlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaGlzdC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmMKQEAgLTE3Nyw4ICsxNzcsMTAgQEAKIAloaXN0c19fbmV3X2NvbF9sZW4oaGlzdHMsIEhJU1RDX0xPQ0FMX1dFSUdIVCwgMTIpOwogCWhpc3RzX19uZXdfY29sX2xlbihoaXN0cywgSElTVENfR0xPQkFMX1dFSUdIVCwgMTIpOwogCi0JaWYgKGgtPnNyY2xpbmUpCi0JCWhpc3RzX19uZXdfY29sX2xlbihoaXN0cywgSElTVENfU1JDTElORSwgc3RybGVuKGgtPnNyY2xpbmUpKTsKKwlpZiAoaC0+c3JjbGluZSkgeworCQlsZW4gPSBNQVgoc3RybGVuKGgtPnNyY2xpbmUpLCBzdHJsZW4oc29ydF9zcmNsaW5lLnNlX2hlYWRlcikpOworCQloaXN0c19fbmV3X2NvbF9sZW4oaGlzdHMsIEhJU1RDX1NSQ0xJTkUsIGxlbik7CisJfQogCiAJaWYgKGgtPnNyY2ZpbGUpCiAJCWhpc3RzX19uZXdfY29sX2xlbihoaXN0cywgSElTVENfU1JDRklMRSwgc3RybGVuKGgtPnNyY2ZpbGUpKTsKQEAgLTQxNyw2ICs0MTksOCBAQAogCX0KIAlJTklUX0xJU1RfSEVBRCgmaGUtPnBhaXJzLm5vZGUpOwogCXRocmVhZF9fZ2V0KGhlLT50aHJlYWQpOworCWhlLT5ocm9vdF9pbiAgPSBSQl9ST09UOworCWhlLT5ocm9vdF9vdXQgPSBSQl9ST09UOwogCiAJaWYgKCFzeW1ib2xfY29uZi5yZXBvcnRfaGllcmFyY2h5KQogCQloZS0+bGVhZiA9IHRydWU7CkBAIC0yMTQ5LDYgKzIxNTMsNTAgQEAKIAlyZXR1cm4gaGU7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaGlzdF9lbnRyeSAqYWRkX2R1bW15X2hpZXJhcmNoeV9lbnRyeShzdHJ1Y3QgaGlzdHMgKmhpc3RzLAorCQkJCQkJICAgIHN0cnVjdCByYl9yb290ICpyb290LAorCQkJCQkJICAgIHN0cnVjdCBoaXN0X2VudHJ5ICpwYWlyKQoreworCXN0cnVjdCByYl9ub2RlICoqcDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgaGlzdF9lbnRyeSAqaGU7CisJc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10OworCisJcCA9ICZyb290LT5yYl9ub2RlOworCXdoaWxlICgqcCAhPSBOVUxMKSB7CisJCWludDY0X3QgY21wID0gMDsKKworCQlwYXJlbnQgPSAqcDsKKwkJaGUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlX2luKTsKKworCQlwZXJmX2hwcF9saXN0X19mb3JfZWFjaF9zb3J0X2xpc3QoaGUtPmhwcF9saXN0LCBmbXQpIHsKKwkJCWNtcCA9IGZtdC0+Y29sbGFwc2UoZm10LCBoZSwgcGFpcik7CisJCQlpZiAoY21wKQorCQkJCWJyZWFrOworCQl9CisJCWlmICghY21wKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKGNtcCA8IDApCisJCQlwID0gJnBhcmVudC0+cmJfbGVmdDsKKwkJZWxzZQorCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCX0KKworCWhlID0gaGlzdF9lbnRyeV9fbmV3KHBhaXIsIHRydWUpOworCWlmIChoZSkgeworCQlyYl9saW5rX25vZGUoJmhlLT5yYl9ub2RlX2luLCBwYXJlbnQsIHApOworCQlyYl9pbnNlcnRfY29sb3IoJmhlLT5yYl9ub2RlX2luLCByb290KTsKKworCQloZS0+ZHVtbXkgPSB0cnVlOworCQloZS0+aGlzdHMgPSBoaXN0czsKKwkJbWVtc2V0KCZoZS0+c3RhdCwgMCwgc2l6ZW9mKGhlLT5zdGF0KSk7CisJCWhpc3RzX19pbmNfc3RhdHMoaGlzdHMsIGhlKTsKKwl9CitvdXQ6CisJcmV0dXJuIGhlOworfQorCiBzdGF0aWMgc3RydWN0IGhpc3RfZW50cnkgKmhpc3RzX19maW5kX2VudHJ5KHN0cnVjdCBoaXN0cyAqaGlzdHMsCiAJCQkJCSAgICBzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUpCiB7CkBAIC0yMTc0LDYgKzIyMjIsNTEgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIHN0cnVjdCBoaXN0X2VudHJ5ICpoaXN0c19fZmluZF9oaWVyYXJjaHlfZW50cnkoc3RydWN0IHJiX3Jvb3QgKnJvb3QsCisJCQkJCQkgICAgICBzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUpCit7CisJc3RydWN0IHJiX25vZGUgKm4gPSByb290LT5yYl9ub2RlOworCisJd2hpbGUgKG4pIHsKKwkJc3RydWN0IGhpc3RfZW50cnkgKml0ZXI7CisJCXN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdDsKKwkJaW50NjRfdCBjbXAgPSAwOworCisJCWl0ZXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZV9pbik7CisJCXBlcmZfaHBwX2xpc3RfX2Zvcl9lYWNoX3NvcnRfbGlzdChoZS0+aHBwX2xpc3QsIGZtdCkgeworCQkJY21wID0gZm10LT5jb2xsYXBzZShmbXQsIGl0ZXIsIGhlKTsKKwkJCWlmIChjbXApCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY21wIDwgMCkKKwkJCW4gPSBuLT5yYl9sZWZ0OworCQllbHNlIGlmIChjbXAgPiAwKQorCQkJbiA9IG4tPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gaXRlcjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaGlzdHNfX21hdGNoX2hpZXJhcmNoeShzdHJ1Y3QgcmJfcm9vdCAqbGVhZGVyX3Jvb3QsCisJCQkJICAgc3RydWN0IHJiX3Jvb3QgKm90aGVyX3Jvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKm5kOworCXN0cnVjdCBoaXN0X2VudHJ5ICpwb3MsICpwYWlyOworCisJZm9yIChuZCA9IHJiX2ZpcnN0KGxlYWRlcl9yb290KTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKKwkJcG9zICA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZV9pbik7CisJCXBhaXIgPSBoaXN0c19fZmluZF9oaWVyYXJjaHlfZW50cnkob3RoZXJfcm9vdCwgcG9zKTsKKworCQlpZiAocGFpcikgeworCQkJaGlzdF9lbnRyeV9fYWRkX3BhaXIocGFpciwgcG9zKTsKKwkJCWhpc3RzX19tYXRjaF9oaWVyYXJjaHkoJnBvcy0+aHJvb3RfaW4sICZwYWlyLT5ocm9vdF9pbik7CisJCX0KKwl9Cit9CisKIC8qCiAgKiBMb29rIGZvciBwYWlycyB0byBsaW5rIHRvIHRoZSBsZWFkZXIgYnVja2V0cyAoaGlzdF9lbnRyaWVzKToKICAqLwpAQCAtMjE4Myw2ICsyMjc2LDEyIEBACiAJc3RydWN0IHJiX25vZGUgKm5kOwogCXN0cnVjdCBoaXN0X2VudHJ5ICpwb3MsICpwYWlyOwogCisJaWYgKHN5bWJvbF9jb25mLnJlcG9ydF9oaWVyYXJjaHkpIHsKKwkJLyogaGllcmFyY2h5IHJlcG9ydCBhbHdheXMgY29sbGFwc2VzIGVudHJpZXMgKi8KKwkJcmV0dXJuIGhpc3RzX19tYXRjaF9oaWVyYXJjaHkoJmxlYWRlci0+ZW50cmllc19jb2xsYXBzZWQsCisJCQkJCSAgICAgICZvdGhlci0+ZW50cmllc19jb2xsYXBzZWQpOworCX0KKwogCWlmIChoaXN0c19faGFzKGxlYWRlciwgbmVlZF9jb2xsYXBzZSkpCiAJCXJvb3QgPSAmbGVhZGVyLT5lbnRyaWVzX2NvbGxhcHNlZDsKIAllbHNlCkBAIC0yMTk3LDYgKzIyOTYsNTAgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgaGlzdHNfX2xpbmtfaGllcmFyY2h5KHN0cnVjdCBoaXN0cyAqbGVhZGVyX2hpc3RzLAorCQkJCSBzdHJ1Y3QgaGlzdF9lbnRyeSAqcGFyZW50LAorCQkJCSBzdHJ1Y3QgcmJfcm9vdCAqbGVhZGVyX3Jvb3QsCisJCQkJIHN0cnVjdCByYl9yb290ICpvdGhlcl9yb290KQoreworCXN0cnVjdCByYl9ub2RlICpuZDsKKwlzdHJ1Y3QgaGlzdF9lbnRyeSAqcG9zLCAqbGVhZGVyOworCisJZm9yIChuZCA9IHJiX2ZpcnN0KG90aGVyX3Jvb3QpOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgeworCQlwb3MgPSByYl9lbnRyeShuZCwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGVfaW4pOworCisJCWlmIChoaXN0X2VudHJ5X19oYXNfcGFpcnMocG9zKSkgeworCQkJYm9vbCBmb3VuZCA9IGZhbHNlOworCisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxlYWRlciwgJnBvcy0+cGFpcnMuaGVhZCwgcGFpcnMubm9kZSkgeworCQkJCWlmIChsZWFkZXItPmhpc3RzID09IGxlYWRlcl9oaXN0cykgeworCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmICghZm91bmQpCisJCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJbGVhZGVyID0gYWRkX2R1bW15X2hpZXJhcmNoeV9lbnRyeShsZWFkZXJfaGlzdHMsCisJCQkJCQkJICAgbGVhZGVyX3Jvb3QsIHBvcyk7CisJCQlpZiAobGVhZGVyID09IE5VTEwpCisJCQkJcmV0dXJuIC0xOworCisJCQkvKiBkbyBub3QgcG9pbnQgcGFyZW50IGluIHRoZSBwb3MgKi8KKwkJCWxlYWRlci0+cGFyZW50X2hlID0gcGFyZW50OworCisJCQloaXN0X2VudHJ5X19hZGRfcGFpcihwb3MsIGxlYWRlcik7CisJCX0KKworCQlpZiAoIXBvcy0+bGVhZikgeworCQkJaWYgKGhpc3RzX19saW5rX2hpZXJhcmNoeShsZWFkZXJfaGlzdHMsIGxlYWRlciwKKwkJCQkJCSAgJmxlYWRlci0+aHJvb3RfaW4sCisJCQkJCQkgICZwb3MtPmhyb290X2luKSA8IDApCisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAwOworfQorCiAvKgogICogTG9vayBmb3IgZW50cmllcyBpbiB0aGUgb3RoZXIgaGlzdHMgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIGxlYWRlciwgaWYKICAqIHdlIGZpbmQgdGhlbSwganVzdCBhZGQgYSBkdW1teSBlbnRyeSBvbiB0aGUgbGVhZGVyIGhpc3RzLCB3aXRoIHBlcmlvZD0wLApAQCAtMjIwOCw2ICsyMzUxLDEzIEBACiAJc3RydWN0IHJiX25vZGUgKm5kOwogCXN0cnVjdCBoaXN0X2VudHJ5ICpwb3MsICpwYWlyOwogCisJaWYgKHN5bWJvbF9jb25mLnJlcG9ydF9oaWVyYXJjaHkpIHsKKwkJLyogaGllcmFyY2h5IHJlcG9ydCBhbHdheXMgY29sbGFwc2VzIGVudHJpZXMgKi8KKwkJcmV0dXJuIGhpc3RzX19saW5rX2hpZXJhcmNoeShsZWFkZXIsIE5VTEwsCisJCQkJCSAgICAgJmxlYWRlci0+ZW50cmllc19jb2xsYXBzZWQsCisJCQkJCSAgICAgJm90aGVyLT5lbnRyaWVzX2NvbGxhcHNlZCk7CisJfQorCiAJaWYgKGhpc3RzX19oYXMob3RoZXIsIG5lZWRfY29sbGFwc2UpKQogCQlyb290ID0gJm90aGVyLT5lbnRyaWVzX2NvbGxhcHNlZDsKIAllbHNlCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGlzdC5oIGIvdG9vbHMvcGVyZi91dGlsL2hpc3QuaAppbmRleCAwYTFlZGYxLi45OTI4ZmVkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaGlzdC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmgKQEAgLTIzMCw3ICsyMzAsNyBAQAogc3RydWN0IHBlcmZfaHBwX2ZtdCB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAlpbnQgKCpoZWFkZXIpKHN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdCwgc3RydWN0IHBlcmZfaHBwICpocHAsCi0JCSAgICAgIHN0cnVjdCBoaXN0cyAqaGlzdHMpOworCQkgICAgICBzdHJ1Y3QgaGlzdHMgKmhpc3RzLCBpbnQgbGluZSwgaW50ICpzcGFuKTsKIAlpbnQgKCp3aWR0aCkoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKIAkJICAgICBzdHJ1Y3QgaGlzdHMgKmhpc3RzKTsKIAlpbnQgKCpjb2xvcikoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKQEAgLTI1OSw2ICsyNTksNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgZmllbGRzOwogCXN0cnVjdCBsaXN0X2hlYWQgc29ydHM7CiAKKwlpbnQgbnJfaGVhZGVyX2xpbmVzOwogCWludCBuZWVkX2NvbGxhcHNlOwogCWludCBwYXJlbnQ7CiAJaW50IHN5bTsKQEAgLTM2Nyw2ICszNjgsNyBAQAogdm9pZCBwZXJmX2hwcF9fcmVzZXRfd2lkdGgoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgaGlzdHMgKmhpc3RzKTsKIHZvaWQgcGVyZl9ocHBfX3Jlc2V0X3NvcnRfd2lkdGgoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgaGlzdHMgKmhpc3RzKTsKIHZvaWQgcGVyZl9ocHBfX3NldF91c2VyX3dpZHRoKGNvbnN0IGNoYXIgKndpZHRoX2xpc3Rfc3RyKTsKK3ZvaWQgaGlzdHNfX3Jlc2V0X2NvbHVtbl93aWR0aChzdHJ1Y3QgaGlzdHMgKmhpc3RzKTsKIAogdHlwZWRlZiB1NjQgKCpocHBfZmllbGRfZm4pKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSk7CiB0eXBlZGVmIGludCAoKmhwcF9jYWxsYmFja19mbikoc3RydWN0IHBlcmZfaHBwICpocHAsIGJvb2wgZnJvbnQpOwpAQCAtNDgzLDUgKzQ4NSwxMCBAQAogI2RlZmluZSBISUVSQVJDSFlfSU5ERU5UICAzCiAKIGJvb2wgaGlzdF9lbnRyeV9faGFzX2hpZXJhcmNoeV9jaGlsZHJlbihzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUsIGZsb2F0IGxpbWl0KTsKK2ludCBocHBfY29sb3Jfc2NucHJpbnRmKHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitpbnQgX19ocHBfX3Nsc21nX2NvbG9yX3ByaW50ZihzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgY29uc3QgY2hhciAqZm10LCAuLi4pOworaW50IF9faGlzdF9lbnRyeV9fc25wcmludGYoc3RydWN0IGhpc3RfZW50cnkgKmhlLCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKKwkJCSAgIHN0cnVjdCBwZXJmX2hwcF9saXN0ICpocHBfbGlzdCk7CitpbnQgaGlzdHNfX2ZwcmludGZfaGVhZGVycyhzdHJ1Y3QgaGlzdHMgKmhpc3RzLCBGSUxFICpmcCk7CiAKICNlbmRpZgkvKiBfX1BFUkZfSElTVF9IICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9kd2FyZi1yZWdzLmggYi90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9kd2FyZi1yZWdzLmgKaW5kZXggMDdjNjQ0ZS4uNDNiZmQ4ZCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2luY2x1ZGUvZHdhcmYtcmVncy5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2R3YXJmLXJlZ3MuaApAQCAtMyw2ICszLDEyIEBACiAKICNpZmRlZiBIQVZFX0RXQVJGX1NVUFBPUlQKIGNvbnN0IGNoYXIgKmdldF9hcmNoX3JlZ3N0cih1bnNpZ25lZCBpbnQgbik7CisvKgorICogZ2V0X2R3YXJmX3JlZ3N0ciAtIFJldHVybnMgZnRyYWNlIHJlZ2lzdGVyIHN0cmluZyBmcm9tIERXQVJGIHJlZ251bQorICogbjogRFdBUkYgcmVnaXN0ZXIgbnVtYmVyCisgKiBtYWNoaW5lOiBFTEYgbWFjaGluZSBzaWduYXR1cmUgKEVNXyopCisgKi8KK2NvbnN0IGNoYXIgKmdldF9kd2FyZl9yZWdzdHIodW5zaWduZWQgaW50IG4sIHVuc2lnbmVkIGludCBtYWNoaW5lKTsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9BUkNIX1JFR1NfUVVFUllfUkVHSVNURVJfT0ZGU0VUCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaW50ZWwtYnRzLmMgYi90b29scy9wZXJmL3V0aWwvaW50ZWwtYnRzLmMKaW5kZXggNzQ5ZTZmMi4uZjU0NWVjMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2ludGVsLWJ0cy5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1idHMuYwpAQCAtMzQ2LDcgKzM0Niw3IEBACiAJCWdvdG8gb3V0X3B1dDsKIAogCS8qIExvYWQgbWFwcyB0byBlbnN1cmUgZHNvLT5pc182NF9iaXQgaGFzIGJlZW4gdXBkYXRlZCAqLwotCW1hcF9fbG9hZChhbC5tYXAsIG1hY2hpbmUtPnN5bWJvbF9maWx0ZXIpOworCW1hcF9fbG9hZChhbC5tYXApOwogCiAJeDg2XzY0ID0gYWwubWFwLT5kc28tPmlzXzY0X2JpdDsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LWRlY29kZXIvaW50ZWwtcHQtZGVjb2Rlci5jIGIvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LWRlY29kZXIvaW50ZWwtcHQtZGVjb2Rlci5jCmluZGV4IDljOGYxNWQuLjc1OTFhMGMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC1kZWNvZGVyL2ludGVsLXB0LWRlY29kZXIuYworKysgYi90b29scy9wZXJmL3V0aWwvaW50ZWwtcHQtZGVjb2Rlci9pbnRlbC1wdC1kZWNvZGVyLmMKQEAgLTgwLDYgKzgwLDcgQEAKIAlpbnQgKCp3YWxrX2luc24pKHN0cnVjdCBpbnRlbF9wdF9pbnNuICppbnRlbF9wdF9pbnNuLAogCQkJIHVpbnQ2NF90ICppbnNuX2NudF9wdHIsIHVpbnQ2NF90ICppcCwgdWludDY0X3QgdG9faXAsCiAJCQkgdWludDY0X3QgbWF4X2luc25fY250LCB2b2lkICpkYXRhKTsKKwlib29sICgqcGdkX2lwKSh1aW50NjRfdCBpcCwgdm9pZCAqZGF0YSk7CiAJdm9pZCAqZGF0YTsKIAlzdHJ1Y3QgaW50ZWxfcHRfc3RhdGUgc3RhdGU7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmOwpAQCAtMTIzLDggKzEyNCw2IEBACiAJYm9vbCBoYXZlX2NhbGNfY3ljX3RvX3RzYzsKIAlpbnQgZXhlY19tb2RlOwogCXVuc2lnbmVkIGludCBpbnNuX2J5dGVzOwotCXVpbnQ2NF90IHNpZ25fYml0OwotCXVpbnQ2NF90IHNpZ25fYml0czsKIAl1aW50NjRfdCBwZXJpb2Q7CiAJZW51bSBpbnRlbF9wdF9wZXJpb2RfdHlwZSBwZXJpb2RfdHlwZTsKIAl1aW50NjRfdCB0b3RfaW5zbl9jbnQ7CkBAIC0xODgsMTIgKzE4NywxMCBAQAogCiAJZGVjb2Rlci0+Z2V0X3RyYWNlICAgICAgICAgID0gcGFyYW1zLT5nZXRfdHJhY2U7CiAJZGVjb2Rlci0+d2Fsa19pbnNuICAgICAgICAgID0gcGFyYW1zLT53YWxrX2luc247CisJZGVjb2Rlci0+cGdkX2lwICAgICAgICAgICAgID0gcGFyYW1zLT5wZ2RfaXA7CiAJZGVjb2Rlci0+ZGF0YSAgICAgICAgICAgICAgID0gcGFyYW1zLT5kYXRhOwogCWRlY29kZXItPnJldHVybl9jb21wcmVzc2lvbiA9IHBhcmFtcy0+cmV0dXJuX2NvbXByZXNzaW9uOwogCi0JZGVjb2Rlci0+c2lnbl9iaXQgICAgICAgICAgID0gKHVpbnQ2NF90KTEgPDwgNDc7Ci0JZGVjb2Rlci0+c2lnbl9iaXRzICAgICAgICAgID0gfigoKHVpbnQ2NF90KTEgPDwgNDgpIC0gMSk7Ci0KIAlkZWNvZGVyLT5wZXJpb2QgICAgICAgICAgICAgPSBwYXJhbXMtPnBlcmlvZDsKIAlkZWNvZGVyLT5wZXJpb2RfdHlwZSAgICAgICAgPSBwYXJhbXMtPnBlcmlvZF90eXBlOwogCkBAIC0zNjIsMjEgKzM1OSwzMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdWludDY0X3QgaW50ZWxfcHRfY2FsY19pcChzdHJ1Y3QgaW50ZWxfcHRfZGVjb2RlciAqZGVjb2RlciwKLQkJCQkgY29uc3Qgc3RydWN0IGludGVsX3B0X3BrdCAqcGFja2V0LAorc3RhdGljIHVpbnQ2NF90IGludGVsX3B0X2NhbGNfaXAoY29uc3Qgc3RydWN0IGludGVsX3B0X3BrdCAqcGFja2V0LAogCQkJCSB1aW50NjRfdCBsYXN0X2lwKQogewogCXVpbnQ2NF90IGlwOwogCiAJc3dpdGNoIChwYWNrZXQtPmNvdW50KSB7Ci0JY2FzZSAyOgorCWNhc2UgMToKIAkJaXAgPSAobGFzdF9pcCAmICh1aW50NjRfdCkweGZmZmZmZmZmZmZmZjAwMDBVTEwpIHwKIAkJICAgICBwYWNrZXQtPnBheWxvYWQ7CiAJCWJyZWFrOwotCWNhc2UgNDoKKwljYXNlIDI6CiAJCWlwID0gKGxhc3RfaXAgJiAodWludDY0X3QpMHhmZmZmZmZmZjAwMDAwMDAwVUxMKSB8CiAJCSAgICAgcGFja2V0LT5wYXlsb2FkOwogCQlicmVhazsKKwljYXNlIDM6CisJCWlwID0gcGFja2V0LT5wYXlsb2FkOworCQkvKiBTaWduLWV4dGVuZCA2LWJ5dGUgaXAgKi8KKwkJaWYgKGlwICYgKHVpbnQ2NF90KTB4ODAwMDAwMDAwMDAwVUxMKQorCQkJaXAgfD0gKHVpbnQ2NF90KTB4ZmZmZjAwMDAwMDAwMDAwMFVMTDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlpcCA9IChsYXN0X2lwICYgKHVpbnQ2NF90KTB4ZmZmZjAwMDAwMDAwMDAwMFVMTCkgfAorCQkgICAgIHBhY2tldC0+cGF5bG9hZDsKKwkJYnJlYWs7CiAJY2FzZSA2OgogCQlpcCA9IHBhY2tldC0+cGF5bG9hZDsKIAkJYnJlYWs7CkBAIC0zODQsMTYgKzM5MCwxMiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoaXAgJiBkZWNvZGVyLT5zaWduX2JpdCkKLQkJcmV0dXJuIGlwIHwgZGVjb2Rlci0+c2lnbl9iaXRzOwotCiAJcmV0dXJuIGlwOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW50ZWxfcHRfc2V0X2xhc3RfaXAoc3RydWN0IGludGVsX3B0X2RlY29kZXIgKmRlY29kZXIpCiB7Ci0JZGVjb2Rlci0+bGFzdF9pcCA9IGludGVsX3B0X2NhbGNfaXAoZGVjb2RlciwgJmRlY29kZXItPnBhY2tldCwKLQkJCQkJICAgIGRlY29kZXItPmxhc3RfaXApOworCWRlY29kZXItPmxhc3RfaXAgPSBpbnRlbF9wdF9jYWxjX2lwKCZkZWNvZGVyLT5wYWNrZXQsIGRlY29kZXItPmxhc3RfaXApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW50ZWxfcHRfc2V0X2lwKHN0cnVjdCBpbnRlbF9wdF9kZWNvZGVyICpkZWNvZGVyKQpAQCAtMTAwOCw2ICsxMDEwLDE5IEBACiAJaW50IGVycjsKIAogCWVyciA9IGludGVsX3B0X3dhbGtfaW5zbihkZWNvZGVyLCAmaW50ZWxfcHRfaW5zbiwgMCk7CisJaWYgKGVyciA9PSBJTlRFTF9QVF9SRVRVUk4gJiYKKwkgICAgZGVjb2Rlci0+cGdkX2lwICYmCisJICAgIGRlY29kZXItPnBrdF9zdGF0ZSA9PSBJTlRFTF9QVF9TVEFURV9USVBfUEdEICYmCisJICAgIChkZWNvZGVyLT5zdGF0ZS50eXBlICYgSU5URUxfUFRfQlJBTkNIKSAmJgorCSAgICBkZWNvZGVyLT5wZ2RfaXAoZGVjb2Rlci0+c3RhdGUudG9faXAsIGRlY29kZXItPmRhdGEpKSB7CisJCS8qIFVuY29uZGl0aW9uYWwgYnJhbmNoIGxlYXZpbmcgZmlsdGVyIHJlZ2lvbiAqLworCQlkZWNvZGVyLT5ub19wcm9ncmVzcyA9IDA7CisJCWRlY29kZXItPnBnZSA9IGZhbHNlOworCQlkZWNvZGVyLT5jb250aW51b3VzX3BlcmlvZCA9IGZhbHNlOworCQlkZWNvZGVyLT5wa3Rfc3RhdGUgPSBJTlRFTF9QVF9TVEFURV9JTl9TWU5DOworCQlkZWNvZGVyLT5zdGF0ZS50b19pcCA9IDA7CisJCXJldHVybiAwOworCX0KIAlpZiAoZXJyID09IElOVEVMX1BUX1JFVFVSTikKIAkJcmV0dXJuIDA7CiAJaWYgKGVycikKQEAgLTEwMzYsNiArMTA1MSwyMSBAQAogCX0KIAogCWlmIChpbnRlbF9wdF9pbnNuLmJyYW5jaCA9PSBJTlRFTF9QVF9CUl9DT05ESVRJT05BTCkgeworCQl1aW50NjRfdCB0b19pcCA9IGRlY29kZXItPmlwICsgaW50ZWxfcHRfaW5zbi5sZW5ndGggKworCQkJCSBpbnRlbF9wdF9pbnNuLnJlbDsKKworCQlpZiAoZGVjb2Rlci0+cGdkX2lwICYmCisJCSAgICBkZWNvZGVyLT5wa3Rfc3RhdGUgPT0gSU5URUxfUFRfU1RBVEVfVElQX1BHRCAmJgorCQkgICAgZGVjb2Rlci0+cGdkX2lwKHRvX2lwLCBkZWNvZGVyLT5kYXRhKSkgeworCQkJLyogQ29uZGl0aW9uYWwgYnJhbmNoIGxlYXZpbmcgZmlsdGVyIHJlZ2lvbiAqLworCQkJZGVjb2Rlci0+cGdlID0gZmFsc2U7CisJCQlkZWNvZGVyLT5jb250aW51b3VzX3BlcmlvZCA9IGZhbHNlOworCQkJZGVjb2Rlci0+cGt0X3N0YXRlID0gSU5URUxfUFRfU1RBVEVfSU5fU1lOQzsKKwkJCWRlY29kZXItPmlwID0gdG9faXA7CisJCQlkZWNvZGVyLT5zdGF0ZS5mcm9tX2lwID0gZGVjb2Rlci0+aXA7CisJCQlkZWNvZGVyLT5zdGF0ZS50b19pcCA9IDA7CisJCQlyZXR1cm4gMDsKKwkJfQogCQlpbnRlbF9wdF9sb2dfYXQoIkVSUk9SOiBDb25kaXRpb25hbCBicmFuY2ggd2hlbiBleHBlY3RpbmcgaW5kaXJlY3QgYnJhbmNoIiwKIAkJCQlkZWNvZGVyLT5pcCk7CiAJCWRlY29kZXItPnBrdF9zdGF0ZSA9IElOVEVMX1BUX1NUQVRFX0VSUl9SRVNZTkM7CkBAIC0xNjU3LDYgKzE2ODcsMTIgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBpbnRlbF9wdF9oYXZlX2lwKHN0cnVjdCBpbnRlbF9wdF9kZWNvZGVyICpkZWNvZGVyKQoreworCXJldHVybiBkZWNvZGVyLT5sYXN0X2lwIHx8IGRlY29kZXItPnBhY2tldC5jb3VudCA9PSAwIHx8CisJICAgICAgIGRlY29kZXItPnBhY2tldC5jb3VudCA9PSAzIHx8IGRlY29kZXItPnBhY2tldC5jb3VudCA9PSA2OworfQorCiAvKiBXYWxrIFBTQisgcGFja2V0cyB0byBnZXQgaW4gc3luYy4gKi8KIHN0YXRpYyBpbnQgaW50ZWxfcHRfd2Fsa19wc2Ioc3RydWN0IGludGVsX3B0X2RlY29kZXIgKmRlY29kZXIpCiB7CkBAIC0xNjc3LDggKzE3MTMsNyBAQAogCiAJCWNhc2UgSU5URUxfUFRfRlVQOgogCQkJZGVjb2Rlci0+cGdlID0gdHJ1ZTsKLQkJCWlmIChkZWNvZGVyLT5sYXN0X2lwIHx8IGRlY29kZXItPnBhY2tldC5jb3VudCA9PSA2IHx8Ci0JCQkgICAgZGVjb2Rlci0+cGFja2V0LmNvdW50ID09IDApIHsKKwkJCWlmIChpbnRlbF9wdF9oYXZlX2lwKGRlY29kZXIpKSB7CiAJCQkJdWludDY0X3QgY3VycmVudF9pcCA9IGRlY29kZXItPmlwOwogCiAJCQkJaW50ZWxfcHRfc2V0X2lwKGRlY29kZXIpOwpAQCAtMTc2Nyw4ICsxODAyLDcgQEAKIAkJY2FzZSBJTlRFTF9QVF9USVBfUEdFOgogCQljYXNlIElOVEVMX1BUX1RJUDoKIAkJCWRlY29kZXItPnBnZSA9IGRlY29kZXItPnBhY2tldC50eXBlICE9IElOVEVMX1BUX1RJUF9QR0Q7Ci0JCQlpZiAoZGVjb2Rlci0+bGFzdF9pcCB8fCBkZWNvZGVyLT5wYWNrZXQuY291bnQgPT0gNiB8fAotCQkJICAgIGRlY29kZXItPnBhY2tldC5jb3VudCA9PSAwKQorCQkJaWYgKGludGVsX3B0X2hhdmVfaXAoZGVjb2RlcikpCiAJCQkJaW50ZWxfcHRfc2V0X2lwKGRlY29kZXIpOwogCQkJaWYgKGRlY29kZXItPmlwKQogCQkJCXJldHVybiAwOwpAQCAtMTc3Niw5ICsxODEwLDcgQEAKIAogCQljYXNlIElOVEVMX1BUX0ZVUDoKIAkJCWlmIChkZWNvZGVyLT5vdmVyZmxvdykgewotCQkJCWlmIChkZWNvZGVyLT5sYXN0X2lwIHx8Ci0JCQkJICAgIGRlY29kZXItPnBhY2tldC5jb3VudCA9PSA2IHx8Ci0JCQkJICAgIGRlY29kZXItPnBhY2tldC5jb3VudCA9PSAwKQorCQkJCWlmIChpbnRlbF9wdF9oYXZlX2lwKGRlY29kZXIpKQogCQkJCQlpbnRlbF9wdF9zZXRfaXAoZGVjb2Rlcik7CiAJCQkJaWYgKGRlY29kZXItPmlwKQogCQkJCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC1kZWNvZGVyL2ludGVsLXB0LWRlY29kZXIuaCBiL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC1kZWNvZGVyL2ludGVsLXB0LWRlY29kZXIuaAppbmRleCAwMmMzOGZlLi44OTM5OTk4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaW50ZWwtcHQtZGVjb2Rlci9pbnRlbC1wdC1kZWNvZGVyLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LWRlY29kZXIvaW50ZWwtcHQtZGVjb2Rlci5oCkBAIC04Myw2ICs4Myw3IEBACiAJaW50ICgqd2Fsa19pbnNuKShzdHJ1Y3QgaW50ZWxfcHRfaW5zbiAqaW50ZWxfcHRfaW5zbiwKIAkJCSB1aW50NjRfdCAqaW5zbl9jbnRfcHRyLCB1aW50NjRfdCAqaXAsIHVpbnQ2NF90IHRvX2lwLAogCQkJIHVpbnQ2NF90IG1heF9pbnNuX2NudCwgdm9pZCAqZGF0YSk7CisJYm9vbCAoKnBnZF9pcCkodWludDY0X3QgaXAsIHZvaWQgKmRhdGEpOwogCXZvaWQgKmRhdGE7CiAJYm9vbCByZXR1cm5fY29tcHJlc3Npb247CiAJdWludDY0X3QgcGVyaW9kOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LWRlY29kZXIvaW50ZWwtcHQtcGt0LWRlY29kZXIuYyBiL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC1kZWNvZGVyL2ludGVsLXB0LXBrdC1kZWNvZGVyLmMKaW5kZXggYjEyNTdjOC4uNGY3YjMyMCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LWRlY29kZXIvaW50ZWwtcHQtcGt0LWRlY29kZXIuYworKysgYi90b29scy9wZXJmL3V0aWwvaW50ZWwtcHQtZGVjb2Rlci9pbnRlbC1wdC1wa3QtZGVjb2Rlci5jCkBAIC0yOTIsMzYgKzI5Miw0NiBAQAogCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuLAogCQkJICAgc3RydWN0IGludGVsX3B0X3BrdCAqcGFja2V0KQogewotCXN3aXRjaCAoYnl0ZSA+PiA1KSB7CisJaW50IGlwX2xlbjsKKworCXBhY2tldC0+Y291bnQgPSBieXRlID4+IDU7CisKKwlzd2l0Y2ggKHBhY2tldC0+Y291bnQpIHsKIAljYXNlIDA6Ci0JCXBhY2tldC0+Y291bnQgPSAwOworCQlpcF9sZW4gPSAwOwogCQlicmVhazsKIAljYXNlIDE6CiAJCWlmIChsZW4gPCAzKQogCQkJcmV0dXJuIElOVEVMX1BUX05FRURfTU9SRV9CWVRFUzsKLQkJcGFja2V0LT5jb3VudCA9IDI7CisJCWlwX2xlbiA9IDI7CiAJCXBhY2tldC0+cGF5bG9hZCA9IGxlMTZfdG9fY3B1KCoodWludDE2X3QgKikoYnVmICsgMSkpOwogCQlicmVhazsKIAljYXNlIDI6CiAJCWlmIChsZW4gPCA1KQogCQkJcmV0dXJuIElOVEVMX1BUX05FRURfTU9SRV9CWVRFUzsKLQkJcGFja2V0LT5jb3VudCA9IDQ7CisJCWlwX2xlbiA9IDQ7CiAJCXBhY2tldC0+cGF5bG9hZCA9IGxlMzJfdG9fY3B1KCoodWludDMyX3QgKikoYnVmICsgMSkpOwogCQlicmVhazsKIAljYXNlIDM6Ci0JY2FzZSA2OgorCWNhc2UgNDoKIAkJaWYgKGxlbiA8IDcpCiAJCQlyZXR1cm4gSU5URUxfUFRfTkVFRF9NT1JFX0JZVEVTOwotCQlwYWNrZXQtPmNvdW50ID0gNjsKKwkJaXBfbGVuID0gNjsKIAkJbWVtY3B5X2xlNjQoJnBhY2tldC0+cGF5bG9hZCwgYnVmICsgMSwgNik7CiAJCWJyZWFrOworCWNhc2UgNjoKKwkJaWYgKGxlbiA8IDkpCisJCQlyZXR1cm4gSU5URUxfUFRfTkVFRF9NT1JFX0JZVEVTOworCQlpcF9sZW4gPSA4OworCQlwYWNrZXQtPnBheWxvYWQgPSBsZTY0X3RvX2NwdSgqKHVpbnQ2NF90ICopKGJ1ZiArIDEpKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIElOVEVMX1BUX0JBRF9QQUNLRVQ7CiAJfQogCiAJcGFja2V0LT50eXBlID0gdHlwZTsKIAotCXJldHVybiBwYWNrZXQtPmNvdW50ICsgMTsKKwlyZXR1cm4gaXBfbGVuICsgMTsKIH0KIAogc3RhdGljIGludCBpbnRlbF9wdF9nZXRfbW9kZShjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4sCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaW50ZWwtcHQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC5jCmluZGV4IDU1MWZmNmYuLmRjMDQxZDQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC5jCkBAIC0xMDMsNiArMTAzLDkgQEAKIAl1bnNpZ25lZCBtYXhfbm9uX3R1cmJvX3JhdGlvOwogCiAJdW5zaWduZWQgbG9uZyBudW1fZXZlbnRzOworCisJY2hhciAqZmlsdGVyOworCXN0cnVjdCBhZGRyX2ZpbHRlcnMgZmlsdHM7CiB9OwogCiBlbnVtIHN3aXRjaF9zdGF0ZSB7CkBAIC0yNDEsNyArMjQ0LDcgQEAKIAl9CiAKIAlxdWV1ZSA9ICZwdHEtPnB0LT5xdWV1ZXMucXVldWVfYXJyYXlbcHRxLT5xdWV1ZV9ucl07Ci0KK25leHQ6CiAJYnVmZmVyID0gYXV4dHJhY2VfYnVmZmVyX19uZXh0KHF1ZXVlLCBidWZmZXIpOwogCWlmICghYnVmZmVyKSB7CiAJCWlmIChvbGRfYnVmZmVyKQpAQCAtMjY0LDkgKzI2Nyw2IEBACiAJICAgIGludGVsX3B0X2RvX2ZpeF9vdmVybGFwKHB0cS0+cHQsIG9sZF9idWZmZXIsIGJ1ZmZlcikpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKG9sZF9idWZmZXIpCi0JCWF1eHRyYWNlX2J1ZmZlcl9fZHJvcF9kYXRhKG9sZF9idWZmZXIpOwotCiAJaWYgKGJ1ZmZlci0+dXNlX2RhdGEpIHsKIAkJYi0+bGVuID0gYnVmZmVyLT51c2Vfc2l6ZTsKIAkJYi0+YnVmID0gYnVmZmVyLT51c2VfZGF0YTsKQEAgLTI3Niw2ICsyNzYsMTYgQEAKIAl9CiAJYi0+cmVmX3RpbWVzdGFtcCA9IGJ1ZmZlci0+cmVmZXJlbmNlOwogCisJLyoKKwkgKiBJZiBpbiBzbmFwc2hvdCBtb2RlIGFuZCB0aGUgYnVmZmVyIGhhcyBubyB1c2FibGUgZGF0YSwgZ2V0IG5leHQKKwkgKiBidWZmZXIgYW5kIGFnYWluIGNoZWNrIG92ZXJsYXAgYWdhaW5zdCBvbGRfYnVmZmVyLgorCSAqLworCWlmIChwdHEtPnB0LT5zbmFwc2hvdF9tb2RlICYmICFiLT5sZW4pCisJCWdvdG8gbmV4dDsKKworCWlmIChvbGRfYnVmZmVyKQorCQlhdXh0cmFjZV9idWZmZXJfX2Ryb3BfZGF0YShvbGRfYnVmZmVyKTsKKwogCWlmICghb2xkX2J1ZmZlciB8fCBwdHEtPnB0LT5zYW1wbGluZ19tb2RlIHx8IChwdHEtPnB0LT5zbmFwc2hvdF9tb2RlICYmCiAJCQkJCQkgICAgICAhYnVmZmVyLT5jb25zZWN1dGl2ZSkpIHsKIAkJYi0+Y29uc2VjdXRpdmUgPSBmYWxzZTsKQEAgLTQ3Nyw3ICs0ODcsNyBAQAogCQlzdGFydF9pcCA9ICppcDsKIAogCQkvKiBMb2FkIG1hcHMgdG8gZW5zdXJlIGRzby0+aXNfNjRfYml0IGhhcyBiZWVuIHVwZGF0ZWQgKi8KLQkJbWFwX19sb2FkKGFsLm1hcCwgbWFjaGluZS0+c3ltYm9sX2ZpbHRlcik7CisJCW1hcF9fbG9hZChhbC5tYXApOwogCiAJCXg4Nl82NCA9IGFsLm1hcC0+ZHNvLT5pc182NF9iaXQ7CiAKQEAgLTU0MSw2ICs1NTEsNzYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGJvb2wgaW50ZWxfcHRfbWF0Y2hfcGdkX2lwKHN0cnVjdCBpbnRlbF9wdCAqcHQsIHVpbnQ2NF90IGlwLAorCQkJCSAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQ7CisJYm9vbCBoYXZlX2ZpbHRlciAgID0gZmFsc2U7CisJYm9vbCBoaXRfdHJhY2VzdG9wID0gZmFsc2U7CisJYm9vbCBoaXRfZmlsdGVyICAgID0gZmFsc2U7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZpbHQsICZwdC0+ZmlsdHMuaGVhZCwgbGlzdCkgeworCQlpZiAoZmlsdC0+c3RhcnQpCisJCQloYXZlX2ZpbHRlciA9IHRydWU7CisKKwkJaWYgKChmaWxlbmFtZSAmJiAhZmlsdC0+ZmlsZW5hbWUpIHx8CisJCSAgICAoIWZpbGVuYW1lICYmIGZpbHQtPmZpbGVuYW1lKSB8fAorCQkgICAgKGZpbGVuYW1lICYmIHN0cmNtcChmaWxlbmFtZSwgZmlsdC0+ZmlsZW5hbWUpKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKG9mZnNldCA+PSBmaWx0LT5hZGRyICYmIG9mZnNldCA8IGZpbHQtPmFkZHIgKyBmaWx0LT5zaXplKSkKKwkJCWNvbnRpbnVlOworCisJCWludGVsX3B0X2xvZygiVElQLlBHRCBpcCAlIyJQUkl4NjQiIG9mZnNldCAlIyJQUkl4NjQiIGluICVzIGhpdCBmaWx0ZXI6ICVzIG9mZnNldCAlIyJQUkl4NjQiIHNpemUgJSMiUFJJeDY0IlxuIiwKKwkJCSAgICAgaXAsIG9mZnNldCwgZmlsZW5hbWUgPyBmaWxlbmFtZSA6ICJba2VybmVsXSIsCisJCQkgICAgIGZpbHQtPnN0YXJ0ID8gImZpbHRlciIgOiAic3RvcCIsCisJCQkgICAgIGZpbHQtPmFkZHIsIGZpbHQtPnNpemUpOworCisJCWlmIChmaWx0LT5zdGFydCkKKwkJCWhpdF9maWx0ZXIgPSB0cnVlOworCQllbHNlCisJCQloaXRfdHJhY2VzdG9wID0gdHJ1ZTsKKwl9CisKKwlpZiAoIWhpdF90cmFjZXN0b3AgJiYgIWhpdF9maWx0ZXIpCisJCWludGVsX3B0X2xvZygiVElQLlBHRCBpcCAlIyJQUkl4NjQiIG9mZnNldCAlIyJQUkl4NjQiIGluICVzIGlzIG5vdCBpbiBhIGZpbHRlciByZWdpb25cbiIsCisJCQkgICAgIGlwLCBvZmZzZXQsIGZpbGVuYW1lID8gZmlsZW5hbWUgOiAiW2tlcm5lbF0iKTsKKworCXJldHVybiBoaXRfdHJhY2VzdG9wIHx8IChoYXZlX2ZpbHRlciAmJiAhaGl0X2ZpbHRlcik7Cit9CisKK3N0YXRpYyBpbnQgX19pbnRlbF9wdF9wZ2RfaXAodWludDY0X3QgaXAsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGludGVsX3B0X3F1ZXVlICpwdHEgPSBkYXRhOworCXN0cnVjdCB0aHJlYWQgKnRocmVhZDsKKwlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKKwl1OCBjcHVtb2RlOworCXU2NCBvZmZzZXQ7CisKKwlpZiAoaXAgPj0gcHRxLT5wdC0+a2VybmVsX3N0YXJ0KQorCQlyZXR1cm4gaW50ZWxfcHRfbWF0Y2hfcGdkX2lwKHB0cS0+cHQsIGlwLCBpcCwgTlVMTCk7CisKKwljcHVtb2RlID0gUEVSRl9SRUNPUkRfTUlTQ19VU0VSOworCisJdGhyZWFkID0gcHRxLT50aHJlYWQ7CisJaWYgKCF0aHJlYWQpCisJCXJldHVybiAtRUlOVkFMOworCisJdGhyZWFkX19maW5kX2FkZHJfbWFwKHRocmVhZCwgY3B1bW9kZSwgTUFQX19GVU5DVElPTiwgaXAsICZhbCk7CisJaWYgKCFhbC5tYXAgfHwgIWFsLm1hcC0+ZHNvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9mZnNldCA9IGFsLm1hcC0+bWFwX2lwKGFsLm1hcCwgaXApOworCisJcmV0dXJuIGludGVsX3B0X21hdGNoX3BnZF9pcChwdHEtPnB0LCBpcCwgb2Zmc2V0LAorCQkJCSAgICAgYWwubWFwLT5kc28tPmxvbmdfbmFtZSk7Cit9CisKK3N0YXRpYyBib29sIGludGVsX3B0X3BnZF9pcCh1aW50NjRfdCBpcCwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gX19pbnRlbF9wdF9wZ2RfaXAoaXAsIGRhdGEpID4gMDsKK30KKwogc3RhdGljIGJvb2wgaW50ZWxfcHRfZ2V0X2NvbmZpZyhzdHJ1Y3QgaW50ZWxfcHQgKnB0LAogCQkJCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsIHU2NCAqY29uZmlnKQogewpAQCAtNzE3LDYgKzc5Nyw5IEBACiAJcGFyYW1zLnRzY19jdGNfcmF0aW9fbiA9IHB0LT50c2NfY3RjX3JhdGlvX247CiAJcGFyYW1zLnRzY19jdGNfcmF0aW9fZCA9IHB0LT50c2NfY3RjX3JhdGlvX2Q7CiAKKwlpZiAocHQtPmZpbHRzLmNudCA+IDApCisJCXBhcmFtcy5wZ2RfaXAgPSBpbnRlbF9wdF9wZ2RfaXA7CisKIAlpZiAocHQtPnN5bnRoX29wdHMuaW5zdHJ1Y3Rpb25zKSB7CiAJCWlmIChwdC0+c3ludGhfb3B0cy5wZXJpb2QpIHsKIAkJCXN3aXRjaCAocHQtPnN5bnRoX29wdHMucGVyaW9kX3R5cGUpIHsKQEAgLTEyOTQsNyArMTM3Nyw3IEBACiAJaWYgKCFtYXApCiAJCXJldHVybiAwOwogCi0JaWYgKG1hcF9fbG9hZChtYXAsIG1hY2hpbmUtPnN5bWJvbF9maWx0ZXIpKQorCWlmIChtYXBfX2xvYWQobWFwKSkKIAkJcmV0dXJuIDA7CiAKIAlzdGFydCA9IGRzb19fZmlyc3Rfc3ltYm9sKG1hcC0+ZHNvLCBNQVBfX0ZVTkNUSU9OKTsKQEAgLTE3NjcsNiArMTg1MCw4IEBACiAJaW50ZWxfcHRfZnJlZV9ldmVudHMoc2Vzc2lvbik7CiAJc2Vzc2lvbi0+YXV4dHJhY2UgPSBOVUxMOwogCXRocmVhZF9fcHV0KHB0LT51bmtub3duX3RocmVhZCk7CisJYWRkcl9maWx0ZXJzX19leGl0KCZwdC0+ZmlsdHMpOworCXpmcmVlKCZwdC0+ZmlsdGVyKTsKIAlmcmVlKHB0KTsKIH0KIApAQCAtMjAxNiw2ICsyMTAxLDggQEAKIAlbSU5URUxfUFRfVFNDX0NUQ19OXQkJPSAiICBUU0M6Q1RDIG51bWVyYXRvciAgICUiUFJJdTY0IlxuIiwKIAlbSU5URUxfUFRfVFNDX0NUQ19EXQkJPSAiICBUU0M6Q1RDIGRlbm9taW5hdG9yICUiUFJJdTY0IlxuIiwKIAlbSU5URUxfUFRfQ1lDX0JJVF0JCT0gIiAgQ1lDIGJpdCAgICAgICAgICAgICAlIyJQUkl4NjQiXG4iLAorCVtJTlRFTF9QVF9NQVhfTk9OVFVSQk9fUkFUSU9dCT0gIiAgTWF4IG5vbi10dXJibyByYXRpbyAlIlBSSXU2NCJcbiIsCisJW0lOVEVMX1BUX0ZJTFRFUl9TVFJfTEVOXQk9ICIgIEZpbHRlciBzdHJpbmcgbGVuLiAgJSJQUkl1NjQiXG4iLAogfTsKIAogc3RhdGljIHZvaWQgaW50ZWxfcHRfcHJpbnRfaW5mbyh1NjQgKmFyciwgaW50IHN0YXJ0LCBpbnQgZmluaXNoKQpAQCAtMjAyOSwxMiArMjExNiwyOCBAQAogCQlmcHJpbnRmKHN0ZG91dCwgaW50ZWxfcHRfaW5mb19mbXRzW2ldLCBhcnJbaV0pOwogfQogCitzdGF0aWMgdm9pZCBpbnRlbF9wdF9wcmludF9pbmZvX3N0cihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzdHIpCit7CisJaWYgKCFkdW1wX3RyYWNlKQorCQlyZXR1cm47CisKKwlmcHJpbnRmKHN0ZG91dCwgIiAgJS0yMHMlc1xuIiwgbmFtZSwgc3RyID8gc3RyIDogIiIpOworfQorCitzdGF0aWMgYm9vbCBpbnRlbF9wdF9oYXMoc3RydWN0IGF1eHRyYWNlX2luZm9fZXZlbnQgKmF1eHRyYWNlX2luZm8sIGludCBwb3MpCit7CisJcmV0dXJuIGF1eHRyYWNlX2luZm8tPmhlYWRlci5zaXplID49CisJCXNpemVvZihzdHJ1Y3QgYXV4dHJhY2VfaW5mb19ldmVudCkgKyAoc2l6ZW9mKHU2NCkgKiAocG9zICsgMSkpOworfQorCiBpbnQgaW50ZWxfcHRfcHJvY2Vzc19hdXh0cmFjZV9pbmZvKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCSAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCiB7CiAJc3RydWN0IGF1eHRyYWNlX2luZm9fZXZlbnQgKmF1eHRyYWNlX2luZm8gPSAmZXZlbnQtPmF1eHRyYWNlX2luZm87CiAJc2l6ZV90IG1pbl9zeiA9IHNpemVvZih1NjQpICogSU5URUxfUFRfUEVSX0NQVV9NTUFQUzsKIAlzdHJ1Y3QgaW50ZWxfcHQgKnB0OworCXZvaWQgKmluZm9fZW5kOworCXU2NCAqaW5mbzsKIAlpbnQgZXJyOwogCiAJaWYgKGF1eHRyYWNlX2luZm8tPmhlYWRlci5zaXplIDwgc2l6ZW9mKHN0cnVjdCBhdXh0cmFjZV9pbmZvX2V2ZW50KSArCkBAIC0yMDQ1LDYgKzIxNDgsOCBAQAogCWlmICghcHQpCiAJCXJldHVybiAtRU5PTUVNOwogCisJYWRkcl9maWx0ZXJzX19pbml0KCZwdC0+ZmlsdHMpOworCiAJcGVyZl9jb25maWcoaW50ZWxfcHRfcGVyZl9jb25maWcsIHB0KTsKIAogCWVyciA9IGF1eHRyYWNlX3F1ZXVlc19faW5pdCgmcHQtPnF1ZXVlcyk7CkBAIC0yMDY5LDggKzIxNzQsNyBAQAogCWludGVsX3B0X3ByaW50X2luZm8oJmF1eHRyYWNlX2luZm8tPnByaXZbMF0sIElOVEVMX1BUX1BNVV9UWVBFLAogCQkJICAgIElOVEVMX1BUX1BFUl9DUFVfTU1BUFMpOwogCi0JaWYgKGF1eHRyYWNlX2luZm8tPmhlYWRlci5zaXplID49IHNpemVvZihzdHJ1Y3QgYXV4dHJhY2VfaW5mb19ldmVudCkgKwotCQkJCQkoc2l6ZW9mKHU2NCkgKiBJTlRFTF9QVF9DWUNfQklUKSkgeworCWlmIChpbnRlbF9wdF9oYXMoYXV4dHJhY2VfaW5mbywgSU5URUxfUFRfQ1lDX0JJVCkpIHsKIAkJcHQtPm10Y19iaXQgPSBhdXh0cmFjZV9pbmZvLT5wcml2W0lOVEVMX1BUX01UQ19CSVRdOwogCQlwdC0+bXRjX2ZyZXFfYml0cyA9IGF1eHRyYWNlX2luZm8tPnByaXZbSU5URUxfUFRfTVRDX0ZSRVFfQklUU107CiAJCXB0LT50c2NfY3RjX3JhdGlvX24gPSBhdXh0cmFjZV9pbmZvLT5wcml2W0lOVEVMX1BUX1RTQ19DVENfTl07CkBAIC0yMDgwLDYgKzIxODQsNTQgQEAKIAkJCQkgICAgSU5URUxfUFRfQ1lDX0JJVCk7CiAJfQogCisJaWYgKGludGVsX3B0X2hhcyhhdXh0cmFjZV9pbmZvLCBJTlRFTF9QVF9NQVhfTk9OVFVSQk9fUkFUSU8pKSB7CisJCXB0LT5tYXhfbm9uX3R1cmJvX3JhdGlvID0KKwkJCWF1eHRyYWNlX2luZm8tPnByaXZbSU5URUxfUFRfTUFYX05PTlRVUkJPX1JBVElPXTsKKwkJaW50ZWxfcHRfcHJpbnRfaW5mbygmYXV4dHJhY2VfaW5mby0+cHJpdlswXSwKKwkJCQkgICAgSU5URUxfUFRfTUFYX05PTlRVUkJPX1JBVElPLAorCQkJCSAgICBJTlRFTF9QVF9NQVhfTk9OVFVSQk9fUkFUSU8pOworCX0KKworCWluZm8gPSAmYXV4dHJhY2VfaW5mby0+cHJpdltJTlRFTF9QVF9GSUxURVJfU1RSX0xFTl0gKyAxOworCWluZm9fZW5kID0gKHZvaWQgKilpbmZvICsgYXV4dHJhY2VfaW5mby0+aGVhZGVyLnNpemU7CisKKwlpZiAoaW50ZWxfcHRfaGFzKGF1eHRyYWNlX2luZm8sIElOVEVMX1BUX0ZJTFRFUl9TVFJfTEVOKSkgeworCQlzaXplX3QgbGVuOworCisJCWxlbiA9IGF1eHRyYWNlX2luZm8tPnByaXZbSU5URUxfUFRfRklMVEVSX1NUUl9MRU5dOworCQlpbnRlbF9wdF9wcmludF9pbmZvKCZhdXh0cmFjZV9pbmZvLT5wcml2WzBdLAorCQkJCSAgICBJTlRFTF9QVF9GSUxURVJfU1RSX0xFTiwKKwkJCQkgICAgSU5URUxfUFRfRklMVEVSX1NUUl9MRU4pOworCQlpZiAobGVuKSB7CisJCQljb25zdCBjaGFyICpmaWx0ZXIgPSAoY29uc3QgY2hhciAqKWluZm87CisKKwkJCWxlbiA9IHJvdW5kdXAobGVuICsgMSwgOCk7CisJCQlpbmZvICs9IGxlbiA+PiAzOworCQkJaWYgKCh2b2lkICopaW5mbyA+IGluZm9fZW5kKSB7CisJCQkJcHJfZXJyKCIlczogYmFkIGZpbHRlciBzdHJpbmcgbGVuZ3RoXG4iLCBfX2Z1bmNfXyk7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycl9mcmVlX3F1ZXVlczsKKwkJCX0KKwkJCXB0LT5maWx0ZXIgPSBtZW1kdXAoZmlsdGVyLCBsZW4pOworCQkJaWYgKCFwdC0+ZmlsdGVyKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlnb3RvIGVycl9mcmVlX3F1ZXVlczsKKwkJCX0KKwkJCWlmIChzZXNzaW9uLT5oZWFkZXIubmVlZHNfc3dhcCkKKwkJCQltZW1fYnN3YXBfNjQocHQtPmZpbHRlciwgbGVuKTsKKwkJCWlmIChwdC0+ZmlsdGVyW2xlbiAtIDFdKSB7CisJCQkJcHJfZXJyKCIlczogZmlsdGVyIHN0cmluZyBub3QgbnVsbCB0ZXJtaW5hdGVkXG4iLCBfX2Z1bmNfXyk7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycl9mcmVlX3F1ZXVlczsKKwkJCX0KKwkJCWVyciA9IGFkZHJfZmlsdGVyc19fcGFyc2VfYmFyZV9maWx0ZXIoJnB0LT5maWx0cywKKwkJCQkJCQkgICAgICBmaWx0ZXIpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGVycl9mcmVlX3F1ZXVlczsKKwkJfQorCQlpbnRlbF9wdF9wcmludF9pbmZvX3N0cigiRmlsdGVyIHN0cmluZyIsIHB0LT5maWx0ZXIpOworCX0KKwogCXB0LT50aW1lbGVzc19kZWNvZGluZyA9IGludGVsX3B0X3RpbWVsZXNzX2RlY29kaW5nKHB0KTsKIAlwdC0+aGF2ZV90c2MgPSBpbnRlbF9wdF9oYXZlX3RzYyhwdCk7CiAJcHQtPnNhbXBsaW5nX21vZGUgPSBmYWxzZTsKQEAgLTIxMjEsMTEgKzIyNzMsMTMgQEAKIAkJcHQtPnN3aXRjaF9ldnNlbCA9IGludGVsX3B0X2ZpbmRfc2NoZWRfc3dpdGNoKHNlc3Npb24tPmV2bGlzdCk7CiAJCWlmICghcHQtPnN3aXRjaF9ldnNlbCkgewogCQkJcHJfZXJyKCIlczogbWlzc2luZyBzY2hlZF9zd2l0Y2ggZXZlbnRcbiIsIF9fZnVuY19fKTsKKwkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycl9kZWxldGVfdGhyZWFkOwogCQl9CiAJfSBlbHNlIGlmIChwdC0+aGF2ZV9zY2hlZF9zd2l0Y2ggPT0gMiAmJgogCQkgICAhaW50ZWxfcHRfZmluZF9zd2l0Y2goc2Vzc2lvbi0+ZXZsaXN0KSkgewogCQlwcl9lcnIoIiVzOiBtaXNzaW5nIGNvbnRleHRfc3dpdGNoIGF0dHJpYnV0ZSBmbGFnXG4iLCBfX2Z1bmNfXyk7CisJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2RlbGV0ZV90aHJlYWQ7CiAJfQogCkBAIC0yMTQ5LDcgKzIzMDMsOSBAQAogCWlmIChwdC0+dGMudGltZV9tdWx0KSB7CiAJCXU2NCB0c2NfZnJlcSA9IGludGVsX3B0X25zX3RvX3RpY2tzKHB0LCAxMDAwMDAwMDAwKTsKIAotCQlwdC0+bWF4X25vbl90dXJib19yYXRpbyA9ICh0c2NfZnJlcSArIDUwMDAwMDAwKSAvIDEwMDAwMDAwMDsKKwkJaWYgKCFwdC0+bWF4X25vbl90dXJib19yYXRpbykKKwkJCXB0LT5tYXhfbm9uX3R1cmJvX3JhdGlvID0KKwkJCQkJKHRzY19mcmVxICsgNTAwMDAwMDApIC8gMTAwMDAwMDAwOwogCQlpbnRlbF9wdF9sb2coIlRTQyBmcmVxdWVuY3kgJSJQUkl1NjQiXG4iLCB0c2NfZnJlcSk7CiAJCWludGVsX3B0X2xvZygiTWF4aW11bSBub24tdHVyYm8gcmF0aW8gJXVcbiIsCiAJCQkgICAgIHB0LT5tYXhfbm9uX3R1cmJvX3JhdGlvKTsKQEAgLTIxOTMsNiArMjM0OSw4IEBACiAJYXV4dHJhY2VfcXVldWVzX19mcmVlKCZwdC0+cXVldWVzKTsKIAlzZXNzaW9uLT5hdXh0cmFjZSA9IE5VTEw7CiBlcnJfZnJlZToKKwlhZGRyX2ZpbHRlcnNfX2V4aXQoJnB0LT5maWx0cyk7CisJemZyZWUoJnB0LT5maWx0ZXIpOwogCWZyZWUocHQpOwogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaW50ZWwtcHQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC5oCmluZGV4IDAwNjU5NDkuLmUxM2IxNGUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC5oCkBAIC0zNCwxMSArMzQsMTEgQEAKIAlJTlRFTF9QVF9UU0NfQ1RDX04sCiAJSU5URUxfUFRfVFNDX0NUQ19ELAogCUlOVEVMX1BUX0NZQ19CSVQsCisJSU5URUxfUFRfTUFYX05PTlRVUkJPX1JBVElPLAorCUlOVEVMX1BUX0ZJTFRFUl9TVFJfTEVOLAogCUlOVEVMX1BUX0FVWFRSQUNFX1BSSVZfTUFYLAogfTsKIAotI2RlZmluZSBJTlRFTF9QVF9BVVhUUkFDRV9QUklWX1NJWkUgKElOVEVMX1BUX0FVWFRSQUNFX1BSSVZfTUFYICogc2l6ZW9mKHU2NCkpCi0KIHN0cnVjdCBhdXh0cmFjZV9yZWNvcmQ7CiBzdHJ1Y3QgcGVyZl90b29sOwogdW5pb24gcGVyZl9ldmVudDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9qaXRkdW1wLmMgYi90b29scy9wZXJmL3V0aWwvaml0ZHVtcC5jCmluZGV4IDlmMzMwNWYuLjk1ZjA4ODQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9qaXRkdW1wLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2ppdGR1bXAuYwpAQCAtMSwzICsxLDQgQEAKKyNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9sem1hLmMgYi90b29scy9wZXJmL3V0aWwvbHptYS5jCmluZGV4IDk1YTFhY2IuLjlkZGVhNWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9sem1hLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2x6bWEuYwpAQCAtMjksNiArMjksNyBAQAogCWx6bWFfYWN0aW9uIGFjdGlvbiA9IExaTUFfUlVOOwogCWx6bWFfc3RyZWFtIHN0cm0gICA9IExaTUFfU1RSRUFNX0lOSVQ7CiAJbHptYV9yZXQgcmV0OworCWludCBlcnIgPSAtMTsKIAogCXU4IGJ1Zl9pbltCVUZTSVpFXTsKIAl1OCBidWZfb3V0W0JVRlNJWkVdOwpAQCAtNDUsNyArNDYsNyBAQAogCWlmIChyZXQgIT0gTFpNQV9PSykgewogCQlwcl9lcnIoImx6bWE6IGx6bWFfc3RyZWFtX2RlY29kZXIgZmFpbGVkICVzICglZClcbiIsCiAJCQlsem1hX3N0cmVycm9yKHJldCksIHJldCk7Ci0JCXJldHVybiAtMTsKKwkJZ290byBlcnJfZmNsb3NlOwogCX0KIAogCXN0cm0ubmV4dF9pbiAgID0gTlVMTDsKQEAgLTYwLDcgKzYxLDcgQEAKIAogCQkJaWYgKGZlcnJvcihpbmZpbGUpKSB7CiAJCQkJcHJfZXJyKCJsem1hOiByZWFkIGVycm9yOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQlyZXR1cm4gLTE7CisJCQkJZ290byBlcnJfZmNsb3NlOwogCQkJfQogCiAJCQlpZiAoZmVvZihpbmZpbGUpKQpAQCAtNzQsNyArNzUsNyBAQAogCiAJCQlpZiAod3JpdGVuKG91dHB1dF9mZCwgYnVmX291dCwgd3JpdGVfc2l6ZSkgIT0gd3JpdGVfc2l6ZSkgewogCQkJCXByX2VycigibHptYTogd3JpdGUgZXJyb3I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotCQkJCXJldHVybiAtMTsKKwkJCQlnb3RvIGVycl9mY2xvc2U7CiAJCQl9CiAKIAkJCXN0cm0ubmV4dF9vdXQgID0gYnVmX291dDsKQEAgLTgzLDEzICs4NCwxNSBAQAogCiAJCWlmIChyZXQgIT0gTFpNQV9PSykgewogCQkJaWYgKHJldCA9PSBMWk1BX1NUUkVBTV9FTkQpCi0JCQkJcmV0dXJuIDA7CisJCQkJYnJlYWs7CiAKIAkJCXByX2VycigibHptYTogZmFpbGVkICVzXG4iLCBsem1hX3N0cmVycm9yKHJldCkpOwotCQkJcmV0dXJuIC0xOworCQkJZ290byBlcnJfZmNsb3NlOwogCQl9CiAJfQogCisJZXJyID0gMDsKK2Vycl9mY2xvc2U6CiAJZmNsb3NlKGluZmlsZSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmMgYi90b29scy9wZXJmL3V0aWwvbWFjaGluZS5jCmluZGV4IGNiNjM4OGQuLjE4ZTQ1MTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuYwpAQCAtNDEsNyArNDEsNiBAQAogCiAJbWFjaGluZS0+cGlkID0gcGlkOwogCi0JbWFjaGluZS0+c3ltYm9sX2ZpbHRlciA9IE5VTEw7CiAJbWFjaGluZS0+aWRfaGRyX3NpemUgPSAwOwogCW1hY2hpbmUtPmtwdHJfcmVzdHJpY3Rfd2FybmVkID0gZmFsc2U7CiAJbWFjaGluZS0+Y29tbV9leGVjID0gZmFsc2U7CkBAIC0xNDgsNyArMTQ3LDYgQEAKIHsKIAltYWNoaW5lX19pbml0KCZtYWNoaW5lcy0+aG9zdCwgIiIsIEhPU1RfS0VSTkVMX0lEKTsKIAltYWNoaW5lcy0+Z3Vlc3RzID0gUkJfUk9PVDsKLQltYWNoaW5lcy0+c3ltYm9sX2ZpbHRlciA9IE5VTEw7CiB9CiAKIHZvaWQgbWFjaGluZXNfX2V4aXQoc3RydWN0IG1hY2hpbmVzICptYWNoaW5lcykKQEAgLTE3Miw4ICsxNzAsNiBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQltYWNoaW5lLT5zeW1ib2xfZmlsdGVyID0gbWFjaGluZXMtPnN5bWJvbF9maWx0ZXI7Ci0KIAl3aGlsZSAoKnAgIT0gTlVMTCkgewogCQlwYXJlbnQgPSAqcDsKIAkJcG9zID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgbWFjaGluZSwgcmJfbm9kZSk7CkBAIC0xODksMjEgKzE4NSw2IEBACiAJcmV0dXJuIG1hY2hpbmU7CiB9CiAKLXZvaWQgbWFjaGluZXNfX3NldF9zeW1ib2xfZmlsdGVyKHN0cnVjdCBtYWNoaW5lcyAqbWFjaGluZXMsCi0JCQkJIHN5bWJvbF9maWx0ZXJfdCBzeW1ib2xfZmlsdGVyKQotewotCXN0cnVjdCByYl9ub2RlICpuZDsKLQotCW1hY2hpbmVzLT5zeW1ib2xfZmlsdGVyID0gc3ltYm9sX2ZpbHRlcjsKLQltYWNoaW5lcy0+aG9zdC5zeW1ib2xfZmlsdGVyID0gc3ltYm9sX2ZpbHRlcjsKLQotCWZvciAobmQgPSByYl9maXJzdCgmbWFjaGluZXMtPmd1ZXN0cyk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7Ci0JCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lID0gcmJfZW50cnkobmQsIHN0cnVjdCBtYWNoaW5lLCByYl9ub2RlKTsKLQotCQltYWNoaW5lLT5zeW1ib2xfZmlsdGVyID0gc3ltYm9sX2ZpbHRlcjsKLQl9Ci19Ci0KIHZvaWQgbWFjaGluZXNfX3NldF9jb21tX2V4ZWMoc3RydWN0IG1hY2hpbmVzICptYWNoaW5lcywgYm9vbCBjb21tX2V4ZWMpCiB7CiAJc3RydWN0IHJiX25vZGUgKm5kOwpAQCAtOTE2LDEwICs4OTcsMTAgQEAKIH0KIAogaW50IF9fbWFjaGluZV9fbG9hZF9rYWxsc3ltcyhzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0JCQkgICAgIGVudW0gbWFwX3R5cGUgdHlwZSwgYm9vbCBub19rY29yZSwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKKwkJCSAgICAgZW51bSBtYXBfdHlwZSB0eXBlLCBib29sIG5vX2tjb3JlKQogewogCXN0cnVjdCBtYXAgKm1hcCA9IG1hY2hpbmVfX2tlcm5lbF9tYXAobWFjaGluZSk7Ci0JaW50IHJldCA9IF9fZHNvX19sb2FkX2thbGxzeW1zKG1hcC0+ZHNvLCBmaWxlbmFtZSwgbWFwLCBub19rY29yZSwgZmlsdGVyKTsKKwlpbnQgcmV0ID0gX19kc29fX2xvYWRfa2FsbHN5bXMobWFwLT5kc28sIGZpbGVuYW1lLCBtYXAsIG5vX2tjb3JlKTsKIAogCWlmIChyZXQgPiAwKSB7CiAJCWRzb19fc2V0X2xvYWRlZChtYXAtPmRzbywgdHlwZSk7CkBAIC05MzUsMTYgKzkxNiwxNSBAQAogfQogCiBpbnQgbWFjaGluZV9fbG9hZF9rYWxsc3ltcyhzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0JCQkgICBlbnVtIG1hcF90eXBlIHR5cGUsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCisJCQkgICBlbnVtIG1hcF90eXBlIHR5cGUpCiB7Ci0JcmV0dXJuIF9fbWFjaGluZV9fbG9hZF9rYWxsc3ltcyhtYWNoaW5lLCBmaWxlbmFtZSwgdHlwZSwgZmFsc2UsIGZpbHRlcik7CisJcmV0dXJuIF9fbWFjaGluZV9fbG9hZF9rYWxsc3ltcyhtYWNoaW5lLCBmaWxlbmFtZSwgdHlwZSwgZmFsc2UpOwogfQogCi1pbnQgbWFjaGluZV9fbG9hZF92bWxpbnV4X3BhdGgoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIGVudW0gbWFwX3R5cGUgdHlwZSwKLQkJCSAgICAgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQoraW50IG1hY2hpbmVfX2xvYWRfdm1saW51eF9wYXRoKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBlbnVtIG1hcF90eXBlIHR5cGUpCiB7CiAJc3RydWN0IG1hcCAqbWFwID0gbWFjaGluZV9fa2VybmVsX21hcChtYWNoaW5lKTsKLQlpbnQgcmV0ID0gZHNvX19sb2FkX3ZtbGludXhfcGF0aChtYXAtPmRzbywgbWFwLCBmaWx0ZXIpOworCWludCByZXQgPSBkc29fX2xvYWRfdm1saW51eF9wYXRoKG1hcC0+ZHNvLCBtYXApOwogCiAJaWYgKHJldCA+IDApCiAJCWRzb19fc2V0X2xvYWRlZChtYXAtPmRzbywgdHlwZSk7CkBAIC0xMzEzLDcgKzEyOTMsNyBAQAogCQkJLyoKIAkJCSAqIHByZWxvYWQgZHNvIG9mIGd1ZXN0IGtlcm5lbCBhbmQgbW9kdWxlcwogCQkJICovCi0JCQlkc29fX2xvYWQoa2VybmVsLCBtYWNoaW5lX19rZXJuZWxfbWFwKG1hY2hpbmUpLCBOVUxMKTsKKwkJCWRzb19fbG9hZChrZXJuZWwsIG1hY2hpbmVfX2tlcm5lbF9tYXAobWFjaGluZSkpOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtMjExNSw3ICsyMDk1LDcgQEAKIAkgKi8KIAltYWNoaW5lLT5rZXJuZWxfc3RhcnQgPSAxVUxMIDw8IDYzOwogCWlmIChtYXApIHsKLQkJZXJyID0gbWFwX19sb2FkKG1hcCwgbWFjaGluZS0+c3ltYm9sX2ZpbHRlcik7CisJCWVyciA9IG1hcF9fbG9hZChtYXApOwogCQlpZiAobWFwLT5zdGFydCkKIAkJCW1hY2hpbmUtPmtlcm5lbF9zdGFydCA9IG1hcC0+c3RhcnQ7CiAJfQpAQCAtMjEzMSw3ICsyMTExLDcgQEAKIHsKIAlzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSA9IHZtYWNoaW5lOwogCXN0cnVjdCBtYXAgKm1hcDsKLQlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtYXBfZ3JvdXBzX19maW5kX3N5bWJvbCgmbWFjaGluZS0+a21hcHMsIE1BUF9fRlVOQ1RJT04sICphZGRycCwgJm1hcCwgIE5VTEwpOworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1hcF9ncm91cHNfX2ZpbmRfc3ltYm9sKCZtYWNoaW5lLT5rbWFwcywgTUFQX19GVU5DVElPTiwgKmFkZHJwLCAmbWFwKTsKIAogCWlmIChzeW0gPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbWFjaGluZS5oIGIvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuaAppbmRleCAyMDczOWY3Li4zNTRkZTZlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvbWFjaGluZS5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmgKQEAgLTQxLDcgKzQxLDYgQEAKIAlzdHJ1Y3QgbWFwX2dyb3VwcyBrbWFwczsKIAlzdHJ1Y3QgbWFwCSAgKnZtbGludXhfbWFwc1tNQVBfX05SX1RZUEVTXTsKIAl1NjQJCSAga2VybmVsX3N0YXJ0OwotCXN5bWJvbF9maWx0ZXJfdAkgIHN5bWJvbF9maWx0ZXI7CiAJcGlkX3QJCSAgKmN1cnJlbnRfdGlkOwogCXVuaW9uIHsgLyogVG9vbCBzcGVjaWZpYyBhcmVhICovCiAJCXZvaWQJICAqcHJpdjsKQEAgLTExMCw3ICsxMDksNiBAQAogc3RydWN0IG1hY2hpbmVzIHsKIAlzdHJ1Y3QgbWFjaGluZSBob3N0OwogCXN0cnVjdCByYl9yb290IGd1ZXN0czsKLQlzeW1ib2xfZmlsdGVyX3Qgc3ltYm9sX2ZpbHRlcjsKIH07CiAKIHZvaWQgbWFjaGluZXNfX2luaXQoc3RydWN0IG1hY2hpbmVzICptYWNoaW5lcyk7CkBAIC0xMjgsOCArMTI2LDYgQEAKIHZvaWQgbWFjaGluZXNfX3NldF9pZF9oZHJfc2l6ZShzdHJ1Y3QgbWFjaGluZXMgKm1hY2hpbmVzLCB1MTYgaWRfaGRyX3NpemUpOwogY2hhciAqbWFjaGluZV9fbW1hcF9uYW1lKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBjaGFyICpiZiwgc2l6ZV90IHNpemUpOwogCi12b2lkIG1hY2hpbmVzX19zZXRfc3ltYm9sX2ZpbHRlcihzdHJ1Y3QgbWFjaGluZXMgKm1hY2hpbmVzLAotCQkJCSBzeW1ib2xfZmlsdGVyX3Qgc3ltYm9sX2ZpbHRlcik7CiB2b2lkIG1hY2hpbmVzX19zZXRfY29tbV9leGVjKHN0cnVjdCBtYWNoaW5lcyAqbWFjaGluZXMsIGJvb2wgY29tbV9leGVjKTsKIAogc3RydWN0IG1hY2hpbmUgKm1hY2hpbmVfX25ld19ob3N0KHZvaWQpOwpAQCAtMTc4LDQwICsxNzQsMzMgQEAKIHN0YXRpYyBpbmxpbmUKIHN0cnVjdCBzeW1ib2wgKm1hY2hpbmVfX2ZpbmRfa2VybmVsX3N5bWJvbChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKIAkJCQkJICAgZW51bSBtYXBfdHlwZSB0eXBlLCB1NjQgYWRkciwKLQkJCQkJICAgc3RydWN0IG1hcCAqKm1hcHAsCi0JCQkJCSAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCisJCQkJCSAgIHN0cnVjdCBtYXAgKiptYXBwKQogewotCXJldHVybiBtYXBfZ3JvdXBzX19maW5kX3N5bWJvbCgmbWFjaGluZS0+a21hcHMsIHR5cGUsIGFkZHIsCi0JCQkJICAgICAgIG1hcHAsIGZpbHRlcik7CisJcmV0dXJuIG1hcF9ncm91cHNfX2ZpbmRfc3ltYm9sKCZtYWNoaW5lLT5rbWFwcywgdHlwZSwgYWRkciwgbWFwcCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUKIHN0cnVjdCBzeW1ib2wgKm1hY2hpbmVfX2ZpbmRfa2VybmVsX3N5bWJvbF9ieV9uYW1lKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAogCQkJCQkJICAgZW51bSBtYXBfdHlwZSB0eXBlLCBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkJICAgc3RydWN0IG1hcCAqKm1hcHAsCi0JCQkJCQkgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorCQkJCQkJICAgc3RydWN0IG1hcCAqKm1hcHApCiB7Ci0JcmV0dXJuIG1hcF9ncm91cHNfX2ZpbmRfc3ltYm9sX2J5X25hbWUoJm1hY2hpbmUtPmttYXBzLCB0eXBlLCBuYW1lLAotCQkJCQkgICAgICAgbWFwcCwgZmlsdGVyKTsKKwlyZXR1cm4gbWFwX2dyb3Vwc19fZmluZF9zeW1ib2xfYnlfbmFtZSgmbWFjaGluZS0+a21hcHMsIHR5cGUsIG5hbWUsIG1hcHApOwogfQogCiBzdGF0aWMgaW5saW5lCiBzdHJ1Y3Qgc3ltYm9sICptYWNoaW5lX19maW5kX2tlcm5lbF9mdW5jdGlvbihzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgdTY0IGFkZHIsCi0JCQkJCSAgICAgc3RydWN0IG1hcCAqKm1hcHAsCi0JCQkJCSAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKKwkJCQkJICAgICBzdHJ1Y3QgbWFwICoqbWFwcCkKIHsKIAlyZXR1cm4gbWFjaGluZV9fZmluZF9rZXJuZWxfc3ltYm9sKG1hY2hpbmUsIE1BUF9fRlVOQ1RJT04sIGFkZHIsCi0JCQkJCSAgIG1hcHAsIGZpbHRlcik7CisJCQkJCSAgIG1hcHApOwogfQogCiBzdGF0aWMgaW5saW5lCiBzdHJ1Y3Qgc3ltYm9sICptYWNoaW5lX19maW5kX2tlcm5lbF9mdW5jdGlvbl9ieV9uYW1lKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAogCQkJCQkJICAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkJICAgICBzdHJ1Y3QgbWFwICoqbWFwcCwKLQkJCQkJCSAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKKwkJCQkJCSAgICAgc3RydWN0IG1hcCAqKm1hcHApCiB7Ci0JcmV0dXJuIG1hcF9ncm91cHNfX2ZpbmRfZnVuY3Rpb25fYnlfbmFtZSgmbWFjaGluZS0+a21hcHMsIG5hbWUsIG1hcHAsCi0JCQkJCQkgZmlsdGVyKTsKKwlyZXR1cm4gbWFwX2dyb3Vwc19fZmluZF9mdW5jdGlvbl9ieV9uYW1lKCZtYWNoaW5lLT5rbWFwcywgbmFtZSwgbWFwcCk7CiB9CiAKIHN0cnVjdCBtYXAgKm1hY2hpbmVfX2ZpbmRuZXdfbW9kdWxlX21hcChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgdTY0IHN0YXJ0LApAQCAtMjE5LDExICsyMDgsMTAgQEAKIGludCBhcmNoX19maXhfbW9kdWxlX3RleHRfc3RhcnQodTY0ICpzdGFydCwgY29uc3QgY2hhciAqbmFtZSk7CiAKIGludCBfX21hY2hpbmVfX2xvYWRfa2FsbHN5bXMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkJICAgICBlbnVtIG1hcF90eXBlIHR5cGUsIGJvb2wgbm9fa2NvcmUsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOworCQkJICAgICBlbnVtIG1hcF90eXBlIHR5cGUsIGJvb2wgbm9fa2NvcmUpOwogaW50IG1hY2hpbmVfX2xvYWRfa2FsbHN5bXMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkJICAgZW51bSBtYXBfdHlwZSB0eXBlLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKLWludCBtYWNoaW5lX19sb2FkX3ZtbGludXhfcGF0aChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgZW51bSBtYXBfdHlwZSB0eXBlLAotCQkJICAgICAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOworCQkJICAgZW51bSBtYXBfdHlwZSB0eXBlKTsKK2ludCBtYWNoaW5lX19sb2FkX3ZtbGludXhfcGF0aChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgZW51bSBtYXBfdHlwZSB0eXBlKTsKIAogc2l6ZV90IG1hY2hpbmVfX2ZwcmludGZfZHNvc19idWlsZGlkKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBGSUxFICpmcCwKIAkJCQkgICAgIGJvb2wgKHNraXApKHN0cnVjdCBkc28gKmRzbywgaW50IHBhcm0pLCBpbnQgcGFybSk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbWFwLmMgYi90b29scy9wZXJmL3V0aWwvbWFwLmMKaW5kZXggNzI4MTI5YS4uYzY2MmZlZiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL21hcC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9tYXAuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvbW1hbi5oPiAvKiBUbyBnZXQgdGhpbmdzIGxpa2UgTUFQX0hVR0VUTEIgZXZlbiBvbiBvbGRlciBsaWJjIGhlYWRlcnMgKi8KICNpbmNsdWRlICJtYXAuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJzdHJsaXN0LmgiCkBAIC0yNCw5ICsyNSwxMCBAQAogCVtNQVBfX1ZBUklBQkxFXSA9ICJWYXJpYWJsZXMiLAogfTsKIAotc3RhdGljIGlubGluZSBpbnQgaXNfYW5vbl9tZW1vcnkoY29uc3QgY2hhciAqZmlsZW5hbWUpCitzdGF0aWMgaW5saW5lIGludCBpc19hbm9uX21lbW9yeShjb25zdCBjaGFyICpmaWxlbmFtZSwgdTMyIGZsYWdzKQogewotCXJldHVybiAhc3RyY21wKGZpbGVuYW1lLCAiLy9hbm9uIikgfHwKKwlyZXR1cm4gZmxhZ3MgJiBNQVBfSFVHRVRMQiB8fAorCSAgICAgICAhc3RyY21wKGZpbGVuYW1lLCAiLy9hbm9uIikgfHwKIAkgICAgICAgIXN0cm5jbXAoZmlsZW5hbWUsICIvZGV2L3plcm8iLCBzaXplb2YoIi9kZXYvemVybyIpIC0gMSkgfHwKIAkgICAgICAgIXN0cm5jbXAoZmlsZW5hbWUsICIvYW5vbl9odWdlcGFnZSIsIHNpemVvZigiL2Fub25faHVnZXBhZ2UiKSAtIDEpOwogfQpAQCAtMTU1LDcgKzE1Nyw3IEBACiAJCWludCBhbm9uLCBub19kc28sIHZkc28sIGFuZHJvaWQ7CiAKIAkJYW5kcm9pZCA9IGlzX2FuZHJvaWRfbGliKGZpbGVuYW1lKTsKLQkJYW5vbiA9IGlzX2Fub25fbWVtb3J5KGZpbGVuYW1lKTsKKwkJYW5vbiA9IGlzX2Fub25fbWVtb3J5KGZpbGVuYW1lLCBmbGFncyk7CiAJCXZkc28gPSBpc192ZHNvX21hcChmaWxlbmFtZSk7CiAJCW5vX2RzbyA9IGlzX25vX2Rzb19tZW1vcnkoZmlsZW5hbWUpOwogCkBAIC0yNzksNyArMjgxLDcgQEAKIAogI2RlZmluZSBEU09fX0RFTEVURUQgIihkZWxldGVkKSIKIAotaW50IG1hcF9fbG9hZChzdHJ1Y3QgbWFwICptYXAsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCitpbnQgbWFwX19sb2FkKHN0cnVjdCBtYXAgKm1hcCkKIHsKIAljb25zdCBjaGFyICpuYW1lID0gbWFwLT5kc28tPmxvbmdfbmFtZTsKIAlpbnQgbnI7CkBAIC0yODcsNyArMjg5LDcgQEAKIAlpZiAoZHNvX19sb2FkZWQobWFwLT5kc28sIG1hcC0+dHlwZSkpCiAJCXJldHVybiAwOwogCi0JbnIgPSBkc29fX2xvYWQobWFwLT5kc28sIG1hcCwgZmlsdGVyKTsKKwluciA9IGRzb19fbG9hZChtYXAtPmRzbywgbWFwKTsKIAlpZiAobnIgPCAwKSB7CiAJCWlmIChtYXAtPmRzby0+aGFzX2J1aWxkX2lkKSB7CiAJCQljaGFyIHNidWlsZF9pZFtTQlVJTERfSURfU0laRV07CkBAIC0zMTIsOSArMzE0LDYgQEAKIAkJCXByX3dhcm5pbmcoIiUuKnMgd2FzIHVwZGF0ZWQgKGlzIHByZWxpbmsgZW5hYmxlZD8pLiAiCiAJCQkJIlJlc3RhcnQgdGhlIGxvbmcgcnVubmluZyBhcHBzIHRoYXQgdXNlIGl0IVxuIiwKIAkJCQkgICAoaW50KXJlYWxfbGVuLCBuYW1lKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXIpIHsKLQkJCXByX3dhcm5pbmcoIm5vIHN5bWJvbHMgcGFzc2VkIHRoZSBnaXZlbiBmaWx0ZXIuXG4iKTsKLQkJCXJldHVybiAtMjsJLyogRW1wdHkgYnV0IG1heWJlIGJ5IHRoZSBmaWx0ZXIgKi8KIAkJfSBlbHNlIHsKIAkJCXByX3dhcm5pbmcoIm5vIHN5bWJvbHMgZm91bmQgaW4gJXMsIG1heWJlIGluc3RhbGwgIgogCQkJCSAgICJhIGRlYnVnIHBhY2thZ2U/XG4iLCBuYW1lKTsKQEAgLTMzMSwxOSArMzMwLDE3IEBACiAJcmV0dXJuIHN0cmNtcChuYW1lYSwgbmFtZWIpOwogfQogCi1zdHJ1Y3Qgc3ltYm9sICptYXBfX2ZpbmRfc3ltYm9sKHN0cnVjdCBtYXAgKm1hcCwgdTY0IGFkZHIsCi0JCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK3N0cnVjdCBzeW1ib2wgKm1hcF9fZmluZF9zeW1ib2woc3RydWN0IG1hcCAqbWFwLCB1NjQgYWRkcikKIHsKLQlpZiAobWFwX19sb2FkKG1hcCwgZmlsdGVyKSA8IDApCisJaWYgKG1hcF9fbG9hZChtYXApIDwgMCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZXR1cm4gZHNvX19maW5kX3N5bWJvbChtYXAtPmRzbywgbWFwLT50eXBlLCBhZGRyKTsKIH0KIAotc3RydWN0IHN5bWJvbCAqbWFwX19maW5kX3N5bWJvbF9ieV9uYW1lKHN0cnVjdCBtYXAgKm1hcCwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK3N0cnVjdCBzeW1ib2wgKm1hcF9fZmluZF9zeW1ib2xfYnlfbmFtZShzdHJ1Y3QgbWFwICptYXAsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JaWYgKG1hcF9fbG9hZChtYXAsIGZpbHRlcikgPCAwKQorCWlmIChtYXBfX2xvYWQobWFwKSA8IDApCiAJCXJldHVybiBOVUxMOwogCiAJaWYgKCFkc29fX3NvcnRlZF9ieV9uYW1lKG1hcC0+ZHNvLCBtYXAtPnR5cGUpKQpAQCAtNTU2LDIzICs1NTMsMjIgQEAKIAogc3RydWN0IHN5bWJvbCAqbWFwX2dyb3Vwc19fZmluZF9zeW1ib2woc3RydWN0IG1hcF9ncm91cHMgKm1nLAogCQkJCSAgICAgICBlbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyLAotCQkJCSAgICAgICBzdHJ1Y3QgbWFwICoqbWFwcCwKLQkJCQkgICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKKwkJCQkgICAgICAgc3RydWN0IG1hcCAqKm1hcHApCiB7CiAJc3RydWN0IG1hcCAqbWFwID0gbWFwX2dyb3Vwc19fZmluZChtZywgdHlwZSwgYWRkcik7CiAKIAkvKiBFbnN1cmUgbWFwIGlzIGxvYWRlZCBiZWZvcmUgdXNpbmcgbWFwLT5tYXBfaXAgKi8KLQlpZiAobWFwICE9IE5VTEwgJiYgbWFwX19sb2FkKG1hcCwgZmlsdGVyKSA+PSAwKSB7CisJaWYgKG1hcCAhPSBOVUxMICYmIG1hcF9fbG9hZChtYXApID49IDApIHsKIAkJaWYgKG1hcHAgIT0gTlVMTCkKIAkJCSptYXBwID0gbWFwOwotCQlyZXR1cm4gbWFwX19maW5kX3N5bWJvbChtYXAsIG1hcC0+bWFwX2lwKG1hcCwgYWRkciksIGZpbHRlcik7CisJCXJldHVybiBtYXBfX2ZpbmRfc3ltYm9sKG1hcCwgbWFwLT5tYXBfaXAobWFwLCBhZGRyKSk7CiAJfQogCiAJcmV0dXJuIE5VTEw7CiB9CiAKIHN0cnVjdCBzeW1ib2wgKm1hcHNfX2ZpbmRfc3ltYm9sX2J5X25hbWUoc3RydWN0IG1hcHMgKm1hcHMsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSBzdHJ1Y3QgbWFwICoqbWFwcCwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKKwkJCQkJIHN0cnVjdCBtYXAgKiptYXBwKQogewogCXN0cnVjdCBzeW1ib2wgKnN5bTsKIAlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CkBAIC01ODIsNyArNTc4LDcgQEAKIAlmb3IgKG5kID0gcmJfZmlyc3QoJm1hcHMtPmVudHJpZXMpOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgewogCQlzdHJ1Y3QgbWFwICpwb3MgPSByYl9lbnRyeShuZCwgc3RydWN0IG1hcCwgcmJfbm9kZSk7CiAKLQkJc3ltID0gbWFwX19maW5kX3N5bWJvbF9ieV9uYW1lKHBvcywgbmFtZSwgZmlsdGVyKTsKKwkJc3ltID0gbWFwX19maW5kX3N5bWJvbF9ieV9uYW1lKHBvcywgbmFtZSk7CiAKIAkJaWYgKHN5bSA9PSBOVUxMKQogCQkJY29udGludWU7CkBAIC02MDAsMTUgKzU5NiwxNCBAQAogc3RydWN0IHN5bWJvbCAqbWFwX2dyb3Vwc19fZmluZF9zeW1ib2xfYnlfbmFtZShzdHJ1Y3QgbWFwX2dyb3VwcyAqbWcsCiAJCQkJCSAgICAgICBlbnVtIG1hcF90eXBlIHR5cGUsCiAJCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgICAgICAgc3RydWN0IG1hcCAqKm1hcHAsCi0JCQkJCSAgICAgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorCQkJCQkgICAgICAgc3RydWN0IG1hcCAqKm1hcHApCiB7Ci0Jc3RydWN0IHN5bWJvbCAqc3ltID0gbWFwc19fZmluZF9zeW1ib2xfYnlfbmFtZSgmbWctPm1hcHNbdHlwZV0sIG5hbWUsIG1hcHAsIGZpbHRlcik7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gbWFwc19fZmluZF9zeW1ib2xfYnlfbmFtZSgmbWctPm1hcHNbdHlwZV0sIG5hbWUsIG1hcHApOwogCiAJcmV0dXJuIHN5bTsKIH0KIAotaW50IG1hcF9ncm91cHNfX2ZpbmRfYW1zKHN0cnVjdCBhZGRyX21hcF9zeW1ib2wgKmFtcywgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK2ludCBtYXBfZ3JvdXBzX19maW5kX2FtcyhzdHJ1Y3QgYWRkcl9tYXBfc3ltYm9sICphbXMpCiB7CiAJaWYgKGFtcy0+YWRkciA8IGFtcy0+bWFwLT5zdGFydCB8fCBhbXMtPmFkZHIgPj0gYW1zLT5tYXAtPmVuZCkgewogCQlpZiAoYW1zLT5tYXAtPmdyb3VwcyA9PSBOVUxMKQpAQCAtNjIwLDcgKzYxNSw3IEBACiAJfQogCiAJYW1zLT5hbF9hZGRyID0gYW1zLT5tYXAtPm1hcF9pcChhbXMtPm1hcCwgYW1zLT5hZGRyKTsKLQlhbXMtPnN5bSA9IG1hcF9fZmluZF9zeW1ib2woYW1zLT5tYXAsIGFtcy0+YWxfYWRkciwgZmlsdGVyKTsKKwlhbXMtPnN5bSA9IG1hcF9fZmluZF9zeW1ib2woYW1zLT5tYXAsIGFtcy0+YWxfYWRkcik7CiAKIAlyZXR1cm4gYW1zLT5zeW0gPyAwIDogLTE7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbWFwLmggYi90b29scy9wZXJmL3V0aWwvbWFwLmgKaW5kZXggZDgzMzk2Yy4uYWJkYWNmOCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL21hcC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9tYXAuaApAQCAtMTI3LDE3ICsxMjcsMTQgQEAKICAqIEBtYXA6IHRoZSAnc3RydWN0IG1hcCAqJyBpbiB3aGljaCBzeW1ib2xzIGl0ZXJlYXRlZAogICogQHN5bV9uYW1lOiB0aGUgc3ltYm9sIG5hbWUKICAqIEBwb3M6IHRoZSAnc3RydWN0IHN5bWJvbCAqJyB0byB1c2UgYXMgYSBsb29wIGN1cnNvcgotICogQGZpbHRlcjogdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgRFNPCiAgKi8KLSNkZWZpbmUgX19tYXBfX2Zvcl9lYWNoX3N5bWJvbF9ieV9uYW1lKG1hcCwgc3ltX25hbWUsIHBvcywgZmlsdGVyKQlcCi0JZm9yIChwb3MgPSBtYXBfX2ZpbmRfc3ltYm9sX2J5X25hbWUobWFwLCBzeW1fbmFtZSwgZmlsdGVyKTsJXAorI2RlZmluZSBfX21hcF9fZm9yX2VhY2hfc3ltYm9sX2J5X25hbWUobWFwLCBzeW1fbmFtZSwgcG9zKQlcCisJZm9yIChwb3MgPSBtYXBfX2ZpbmRfc3ltYm9sX2J5X25hbWUobWFwLCBzeW1fbmFtZSk7CVwKIAkgICAgIHBvcyAmJiBhcmNoX19jb21wYXJlX3N5bWJvbF9uYW1lcyhwb3MtPm5hbWUsIHN5bV9uYW1lKSA9PSAwOwlcCiAJICAgICBwb3MgPSBzeW1ib2xfX25leHRfYnlfbmFtZShwb3MpKQogCiAjZGVmaW5lIG1hcF9fZm9yX2VhY2hfc3ltYm9sX2J5X25hbWUobWFwLCBzeW1fbmFtZSwgcG9zKQkJXAotCV9fbWFwX19mb3JfZWFjaF9zeW1ib2xfYnlfbmFtZShtYXAsIHN5bV9uYW1lLCAocG9zKSwgTlVMTCkKLQotdHlwZWRlZiBpbnQgKCpzeW1ib2xfZmlsdGVyX3QpKHN0cnVjdCBtYXAgKm1hcCwgc3RydWN0IHN5bWJvbCAqc3ltKTsKKwlfX21hcF9fZm9yX2VhY2hfc3ltYm9sX2J5X25hbWUobWFwLCBzeW1fbmFtZSwgKHBvcykpCiAKIGludCBhcmNoX19jb21wYXJlX3N5bWJvbF9uYW1lcyhjb25zdCBjaGFyICpuYW1lYSwgY29uc3QgY2hhciAqbmFtZWIpOwogdm9pZCBtYXBfX2luaXQoc3RydWN0IG1hcCAqbWFwLCBlbnVtIG1hcF90eXBlIHR5cGUsCkBAIC0xNzMsMTEgKzE3MCw5IEBACiBpbnQgbWFwX19mcHJpbnRmX3NyY2xpbmUoc3RydWN0IG1hcCAqbWFwLCB1NjQgYWRkciwgY29uc3QgY2hhciAqcHJlZml4LAogCQkJIEZJTEUgKmZwKTsKIAotaW50IG1hcF9fbG9hZChzdHJ1Y3QgbWFwICptYXAsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOwotc3RydWN0IHN5bWJvbCAqbWFwX19maW5kX3N5bWJvbChzdHJ1Y3QgbWFwICptYXAsCi0JCQkJdTY0IGFkZHIsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOwotc3RydWN0IHN5bWJvbCAqbWFwX19maW5kX3N5bWJvbF9ieV9uYW1lKHN0cnVjdCBtYXAgKm1hcCwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CitpbnQgbWFwX19sb2FkKHN0cnVjdCBtYXAgKm1hcCk7CitzdHJ1Y3Qgc3ltYm9sICptYXBfX2ZpbmRfc3ltYm9sKHN0cnVjdCBtYXAgKm1hcCwgdTY0IGFkZHIpOworc3RydWN0IHN5bWJvbCAqbWFwX19maW5kX3N5bWJvbF9ieV9uYW1lKHN0cnVjdCBtYXAgKm1hcCwgY29uc3QgY2hhciAqbmFtZSk7CiB2b2lkIG1hcF9fZml4dXBfc3RhcnQoc3RydWN0IG1hcCAqbWFwKTsKIHZvaWQgbWFwX19maXh1cF9lbmQoc3RydWN0IG1hcCAqbWFwKTsKIApAQCAtMTkxLDcgKzE4Niw3IEBACiBzdHJ1Y3QgbWFwICptYXBzX19maXJzdChzdHJ1Y3QgbWFwcyAqbWFwcyk7CiBzdHJ1Y3QgbWFwICptYXBfX25leHQoc3RydWN0IG1hcCAqbWFwKTsKIHN0cnVjdCBzeW1ib2wgKm1hcHNfX2ZpbmRfc3ltYm9sX2J5X25hbWUoc3RydWN0IG1hcHMgKm1hcHMsIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtYXAgKiptYXBwLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1hcCAqKm1hcHApOwogdm9pZCBtYXBfZ3JvdXBzX19pbml0KHN0cnVjdCBtYXBfZ3JvdXBzICptZywgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpOwogdm9pZCBtYXBfZ3JvdXBzX19leGl0KHN0cnVjdCBtYXBfZ3JvdXBzICptZyk7CiBpbnQgbWFwX2dyb3Vwc19fY2xvbmUoc3RydWN0IHRocmVhZCAqdGhyZWFkLApAQCAtMjMxLDI1ICsyMjYsMjIgQEAKIAogc3RydWN0IHN5bWJvbCAqbWFwX2dyb3Vwc19fZmluZF9zeW1ib2woc3RydWN0IG1hcF9ncm91cHMgKm1nLAogCQkJCSAgICAgICBlbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyLAotCQkJCSAgICAgICBzdHJ1Y3QgbWFwICoqbWFwcCwKLQkJCQkgICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CisJCQkJICAgICAgIHN0cnVjdCBtYXAgKiptYXBwKTsKIAogc3RydWN0IHN5bWJvbCAqbWFwX2dyb3Vwc19fZmluZF9zeW1ib2xfYnlfbmFtZShzdHJ1Y3QgbWFwX2dyb3VwcyAqbWcsCiAJCQkJCSAgICAgICBlbnVtIG1hcF90eXBlIHR5cGUsCiAJCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgICAgICAgc3RydWN0IG1hcCAqKm1hcHAsCi0JCQkJCSAgICAgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKKwkJCQkJICAgICAgIHN0cnVjdCBtYXAgKiptYXBwKTsKIAogc3RydWN0IGFkZHJfbWFwX3N5bWJvbDsKIAotaW50IG1hcF9ncm91cHNfX2ZpbmRfYW1zKHN0cnVjdCBhZGRyX21hcF9zeW1ib2wgKmFtcywgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CitpbnQgbWFwX2dyb3Vwc19fZmluZF9hbXMoc3RydWN0IGFkZHJfbWFwX3N5bWJvbCAqYW1zKTsKIAogc3RhdGljIGlubGluZQogc3RydWN0IHN5bWJvbCAqbWFwX2dyb3Vwc19fZmluZF9mdW5jdGlvbl9ieV9uYW1lKHN0cnVjdCBtYXBfZ3JvdXBzICptZywKLQkJCQkJCSBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgbWFwICoqbWFwcCwKLQkJCQkJCSBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorCQkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBtYXAgKiptYXBwKQogewotCXJldHVybiBtYXBfZ3JvdXBzX19maW5kX3N5bWJvbF9ieV9uYW1lKG1nLCBNQVBfX0ZVTkNUSU9OLCBuYW1lLCBtYXBwLCBmaWx0ZXIpOworCXJldHVybiBtYXBfZ3JvdXBzX19maW5kX3N5bWJvbF9ieV9uYW1lKG1nLCBNQVBfX0ZVTkNUSU9OLCBuYW1lLCBtYXBwKTsKIH0KIAogaW50IG1hcF9ncm91cHNfX2ZpeHVwX292ZXJsYXBwaW5ncyhzdHJ1Y3QgbWFwX2dyb3VwcyAqbWcsIHN0cnVjdCBtYXAgKm1hcCwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYwppbmRleCA2YzkxM2MzLi4zMzU0NmMzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jCkBAIC05MDQsNiArOTA0LDcgQEAKIAlbUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfTUFYX1NUQUNLXQkJPSAibWF4LXN0YWNrIiwKIAlbUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfT1ZFUldSSVRFXQkJPSAib3ZlcndyaXRlIiwKIAlbUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfTk9PVkVSV1JJVEVdCQk9ICJuby1vdmVyd3JpdGUiLAorCVtQQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9EUlZfQ0ZHXQkJPSAiZHJpdmVyLWNvbmZpZyIsCiB9OwogCiBzdGF0aWMgYm9vbCBjb25maWdfdGVybV9zaHJpbmtlZDsKQEAgLTEwMzQsNyArMTAzNSw4IEBACiAJCQkgICBzdHJ1Y3QgcGFyc2VfZXZlbnRzX3Rlcm0gKnRlcm0sCiAJCQkgICBzdHJ1Y3QgcGFyc2VfZXZlbnRzX2Vycm9yICplcnIpCiB7Ci0JaWYgKHRlcm0tPnR5cGVfdGVybSA9PSBQQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9VU0VSKQorCWlmICh0ZXJtLT50eXBlX3Rlcm0gPT0gUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfVVNFUiB8fAorCSAgICB0ZXJtLT50eXBlX3Rlcm0gPT0gUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfRFJWX0NGRykKIAkJLyoKIAkJICogQWx3YXlzIHN1Y2NlZWQgZm9yIHN5c2ZzIHRlcm1zLCBhcyB3ZSBkb250IGtub3cKIAkJICogYXQgdGhpcyBwb2ludCB3aGF0IHR5cGUgdGhleSBuZWVkIHRvIGhhdmUuCkBAIC0xMTM0LDYgKzExMzYsOSBAQAogCQljYXNlIFBBUlNFX0VWRU5UU19fVEVSTV9UWVBFX05PT1ZFUldSSVRFOgogCQkJQUREX0NPTkZJR19URVJNKE9WRVJXUklURSwgb3ZlcndyaXRlLCB0ZXJtLT52YWwubnVtID8gMCA6IDEpOwogCQkJYnJlYWs7CisJCWNhc2UgUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfRFJWX0NGRzoKKwkJCUFERF9DT05GSUdfVEVSTShEUlZfQ0ZHLCBkcnZfY2ZnLCB0ZXJtLT52YWwuc3RyKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KQEAgLTE3NTUsMjAgKzE3NjAsNDkgQEAKIHN0YXRpYyBpbnQgc2V0X2ZpbHRlcihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIGNvbnN0IHZvaWQgKmFyZykKIHsKIAljb25zdCBjaGFyICpzdHIgPSBhcmc7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCWludCBucl9hZGRyX2ZpbHRlcnMgPSAwOworCXN0cnVjdCBwZXJmX3BtdSAqcG11ID0gTlVMTDsKIAotCWlmIChldnNlbCA9PSBOVUxMIHx8IGV2c2VsLT5hdHRyLnR5cGUgIT0gUEVSRl9UWVBFX1RSQUNFUE9JTlQpIHsKLQkJZnByaW50ZihzdGRlcnIsCi0JCQkiLS1maWx0ZXIgb3B0aW9uIHNob3VsZCBmb2xsb3cgYSAtZSB0cmFjZXBvaW50IG9wdGlvblxuIik7Ci0JCXJldHVybiAtMTsKKwlpZiAoZXZzZWwgPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwlpZiAoZXZzZWwtPmF0dHIudHlwZSA9PSBQRVJGX1RZUEVfVFJBQ0VQT0lOVCkgeworCQlpZiAocGVyZl9ldnNlbF9fYXBwZW5kX3RwX2ZpbHRlcihldnNlbCwgc3RyKSA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJub3QgZW5vdWdoIG1lbW9yeSB0byBob2xkIGZpbHRlciBzdHJpbmdcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKHBlcmZfZXZzZWxfX2FwcGVuZF9maWx0ZXIoZXZzZWwsICImJiIsIHN0cikgPCAwKSB7CisJd2hpbGUgKChwbXUgPSBwZXJmX3BtdV9fc2NhbihwbXUpKSAhPSBOVUxMKQorCQlpZiAocG11LT50eXBlID09IGV2c2VsLT5hdHRyLnR5cGUpIHsKKwkJCWZvdW5kID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisKKwlpZiAoZm91bmQpCisJCXBlcmZfcG11X19zY2FuX2ZpbGUocG11LCAibnJfYWRkcl9maWx0ZXJzIiwKKwkJCQkgICAgIiVkIiwgJm5yX2FkZHJfZmlsdGVycyk7CisKKwlpZiAoIW5yX2FkZHJfZmlsdGVycykKKwkJZ290byBlcnI7CisKKwlpZiAocGVyZl9ldnNlbF9fYXBwZW5kX2FkZHJfZmlsdGVyKGV2c2VsLCBzdHIpIDwgMCkgewogCQlmcHJpbnRmKHN0ZGVyciwKIAkJCSJub3QgZW5vdWdoIG1lbW9yeSB0byBob2xkIGZpbHRlciBzdHJpbmdcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJcmV0dXJuIDA7CisKK2VycjoKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIi0tZmlsdGVyIG9wdGlvbiBzaG91bGQgZm9sbG93IGEgLWUgdHJhY2Vwb2ludCBvciBIVyB0cmFjZXIgb3B0aW9uXG4iKTsKKworCXJldHVybiAtMTsKIH0KIAogaW50IHBhcnNlX2ZpbHRlcihjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQsIGNvbnN0IGNoYXIgKnN0ciwKQEAgLTE3OTMsNyArMTgyNyw3IEBACiAKIAlzbnByaW50ZihuZXdfZmlsdGVyLCBzaXplb2YobmV3X2ZpbHRlciksICJjb21tb25fcGlkICE9ICVkIiwgZ2V0cGlkKCkpOwogCi0JaWYgKHBlcmZfZXZzZWxfX2FwcGVuZF9maWx0ZXIoZXZzZWwsICImJiIsIG5ld19maWx0ZXIpIDwgMCkgeworCWlmIChwZXJmX2V2c2VsX19hcHBlbmRfdHBfZmlsdGVyKGV2c2VsLCBuZXdfZmlsdGVyKSA8IDApIHsKIAkJZnByaW50ZihzdGRlcnIsCiAJCQkibm90IGVub3VnaCBtZW1vcnkgdG8gaG9sZCBmaWx0ZXIgc3RyaW5nXG4iKTsKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5oIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5oCmluZGV4IGQxZWRiZjguLjhkMDlhOTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuaAorKysgYi90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmgKQEAgLTcxLDYgKzcxLDcgQEAKIAlQQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9NQVhfU1RBQ0ssCiAJUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfTk9PVkVSV1JJVEUsCiAJUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfT1ZFUldSSVRFLAorCVBBUlNFX0VWRU5UU19fVEVSTV9UWVBFX0RSVl9DRkcsCiAJX19QQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9OUiwKIH07CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMubCBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMubAppbmRleCA3YTI1MTk0Li45ZjQzZmRhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5sCkBAIC01Myw2ICs1MywyNiBAQAogCXJldHVybiB0b2tlbjsKIH0KIAorLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHBhcnNlciBnZXRzIHR3byBraW5kIG9mIGlucHV0OgorICoKKyAqIAlAY2ZnMSBvciBAY2ZnMj1jb25maWcKKyAqCisgKiBUaGUgbGVhZGluZyAnQCcgaXMgc3RyaXBwZWQgb2ZmIGJlZm9yZSAnY2ZnMScgYW5kICdjZmcyPWNvbmZpZycgYXJlIGdpdmVuIHRvCisgKiBiaXNvbi4gIEluIHRoZSBsYXR0ZXIgY2FzZSBpdCBpcyBuZWNlc3NhcnkgdG8ga2VlcCB0aGUgc3RyaW5nIGludGFjdCBzbyB0aGF0CisgKiB0aGUgUE1VIGtlcm5lbCBkcml2ZXIgY2FuIGRldGVybWluZSB3aGF0IGNvbmZpZ3VyYWJsZSBpcyBhc3NvY2lhdGVkIHRvCisgKiAnY29uZmlnJy4KKyAqLworc3RhdGljIGludCBkcnZfc3RyKHl5c2Nhbl90IHNjYW5uZXIsIGludCB0b2tlbikKK3sKKwlZWVNUWVBFICp5eWx2YWwgPSBwYXJzZV9ldmVudHNfZ2V0X2x2YWwoc2Nhbm5lcik7CisJY2hhciAqdGV4dCA9IHBhcnNlX2V2ZW50c19nZXRfdGV4dChzY2FubmVyKTsKKworCS8qIFN0cmlwIG9mZiB0aGUgJ0AnICovCisJeXlsdmFsLT5zdHIgPSBzdHJkdXAodGV4dCArIDEpOworCXJldHVybiB0b2tlbjsKK30KKwogI2RlZmluZSBSRVdJTkQoX19hbGxvYykJCQkJXAogZG8gewkJCQkJCQkJXAogCVlZU1RZUEUgKl9feXlsdmFsID0gcGFyc2VfZXZlbnRzX2dldF9sdmFsKHl5c2Nhbm5lcik7CVwKQEAgLTEyNCw2ICsxNDQsNyBAQAogbnVtX3Jhd19oZXgJW2EtZkEtRjAtOV0rCiBuYW1lCQlbYS16QS1aXyo/XVthLXpBLVowLTlfKj8uXSoKIG5hbWVfbWludXMJW2EtekEtWl8qP11bYS16QS1aMC05XC1fKj8uOl0qCitkcnZfY2ZnX3Rlcm0JW2EtekEtWjAtOV9cLl0rKD1bYS16QS1aMC05Xyo/XC46XSspPwogLyogSWYgeW91IGFkZCBhIG1vZGlmaWVyIHlvdSBuZWVkIHRvIHVwZGF0ZSBjaGVja19tb2RpZmllcigpICovCiBtb2RpZmllcl9ldmVudAlbdWtocFBHSFNESV0rCiBtb2RpZmllcl9icAlbcnd4XXsxLDN9CkBAIC0yMDksNiArMjMwLDcgQEAKIHtuYW1lX21pbnVzfQkJeyByZXR1cm4gc3RyKHl5c2Nhbm5lciwgUEVfTkFNRSk7IH0KIFxbYWxsXF0JCQl7IHJldHVybiBQRV9BUlJBWV9BTEw7IH0KICJbIgkJCXsgQkVHSU4oYXJyYXkpOyByZXR1cm4gJ1snOyB9CitAe2Rydl9jZmdfdGVybX0JCXsgcmV0dXJuIGRydl9zdHIoeXlzY2FubmVyLCBQRV9EUlZfQ0ZHX1RFUk0pOyB9CiB9CiAKIDxtZW0+ewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy55IGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy55CmluZGV4IDViZTRhNWYuLjg3OTExNWYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMueQorKysgYi90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLnkKQEAgLTQ5LDYgKzQ5LDcgQEAKICV0b2tlbiBQRV9FUlJPUgogJXRva2VuIFBFX1BNVV9FVkVOVF9QUkUgUEVfUE1VX0VWRU5UX1NVRiBQRV9LRVJORUxfUE1VX0VWRU5UCiAldG9rZW4gUEVfQVJSQVlfQUxMIFBFX0FSUkFZX1JBTkdFCisldG9rZW4gUEVfRFJWX0NGR19URVJNCiAldHlwZSA8bnVtPiBQRV9WQUxVRQogJXR5cGUgPG51bT4gUEVfVkFMVUVfU1lNX0hXCiAldHlwZSA8bnVtPiBQRV9WQUxVRV9TWU1fU1cKQEAgLTYzLDYgKzY0LDcgQEAKICV0eXBlIDxzdHI+IFBFX01PRElGSUVSX0JQCiAldHlwZSA8c3RyPiBQRV9FVkVOVF9OQU1FCiAldHlwZSA8c3RyPiBQRV9QTVVfRVZFTlRfUFJFIFBFX1BNVV9FVkVOVF9TVUYgUEVfS0VSTkVMX1BNVV9FVkVOVAorJXR5cGUgPHN0cj4gUEVfRFJWX0NGR19URVJNCiAldHlwZSA8bnVtPiB2YWx1ZV9zeW0KICV0eXBlIDxoZWFkPiBldmVudF9jb25maWcKICV0eXBlIDxoZWFkPiBvcHRfZXZlbnRfY29uZmlnCkBAIC01OTksNiArNjAxLDE1IEBACiAJdGVybS0+YXJyYXkgPSAkMjsKIAkkJCA9IHRlcm07CiB9Cit8CitQRV9EUlZfQ0ZHX1RFUk0KK3sKKwlzdHJ1Y3QgcGFyc2VfZXZlbnRzX3Rlcm0gKnRlcm07CisKKwlBQk9SVF9PTihwYXJzZV9ldmVudHNfdGVybV9fc3RyKCZ0ZXJtLCBQQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9EUlZfQ0ZHLAorCQkJCQkkMSwgJDEsICZAMSwgTlVMTCkpOworCSQkID0gdGVybTsKK30KIAogYXJyYXk6CiAnWycgYXJyYXlfdGVybXMgJ10nCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcG11LmMgYi90b29scy9wZXJmL3V0aWwvcG11LmMKaW5kZXggZGRiMDI2MS4uMmJhYmNkZiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3BtdS5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wbXUuYwpAQCAtNDQ1LDE0ICs0NDUsMjMgQEAKIAlGSUxFICpmaWxlOwogCXN0cnVjdCBjcHVfbWFwICpjcHVzOwogCWNvbnN0IGNoYXIgKnN5c2ZzID0gc3lzZnNfX21vdW50cG9pbnQoKTsKKwljb25zdCBjaGFyICp0ZW1wbGF0ZXNbXSA9IHsKKwkJICIlcy9idXMvZXZlbnRfc291cmNlL2RldmljZXMvJXMvY3B1bWFzayIsCisJCSAiJXMvYnVzL2V2ZW50X3NvdXJjZS9kZXZpY2VzLyVzL2NwdXMiLAorCQkgTlVMTAorCX07CisJY29uc3QgY2hhciAqKnRlbXBsYXRlOwogCiAJaWYgKCFzeXNmcykKIAkJcmV0dXJuIE5VTEw7CiAKLQlzbnByaW50ZihwYXRoLCBQQVRIX01BWCwKLQkJICIlcy9idXMvZXZlbnRfc291cmNlL2RldmljZXMvJXMvY3B1bWFzayIsIHN5c2ZzLCBuYW1lKTsKKwlmb3IgKHRlbXBsYXRlID0gdGVtcGxhdGVzOyAqdGVtcGxhdGU7IHRlbXBsYXRlKyspIHsKKwkJc25wcmludGYocGF0aCwgUEFUSF9NQVgsICp0ZW1wbGF0ZSwgc3lzZnMsIG5hbWUpOworCQlpZiAoc3RhdChwYXRoLCAmc3QpID09IDApCisJCQlicmVhazsKKwl9CiAKLQlpZiAoc3RhdChwYXRoLCAmc3QpIDwgMCkKKwlpZiAoISp0ZW1wbGF0ZSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlmaWxlID0gZm9wZW4ocGF0aCwgInIiKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wbXUuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wbXUuaAppbmRleCA1ZDdlODQ0Li43NDM0MjJhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcG11LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BtdS5oCkBAIC00LDYgKzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KICNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSAiZXZzZWwuaCIKICNpbmNsdWRlICJwYXJzZS1ldmVudHMuaCIKIAogZW51bSB7CkBAIC0yNSw2ICsyNiw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBmb3JtYXQ7ICAvKiBIRUFEIHN0cnVjdCBwZXJmX3BtdV9mb3JtYXQgLT4gbGlzdCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgYWxpYXNlczsgLyogSEVBRCBzdHJ1Y3QgcGVyZl9wbXVfYWxpYXMgLT4gbGlzdCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgICAgLyogRUxFTSAqLworCWludCAoKnNldF9kcnZfY29uZmlnKQkoc3RydWN0IHBlcmZfZXZzZWxfY29uZmlnX3Rlcm0gKnRlcm0pOwogfTsKIAogc3RydWN0IHBlcmZfcG11X2luZm8gewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYwppbmRleCAyODczMzk2Li5mY2ZiZWYwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYworKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYwpAQCAtMTEwLDEzICsxMTAsMTIgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSwKIAkJCQkJCSAgICAgc3RydWN0IG1hcCAqKm1hcHApCiB7Ci0JcmV0dXJuIG1hY2hpbmVfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uX2J5X25hbWUoaG9zdF9tYWNoaW5lLCBuYW1lLCBtYXBwLAotCQkJCQkJICAgICBOVUxMKTsKKwlyZXR1cm4gbWFjaGluZV9fZmluZF9rZXJuZWxfZnVuY3Rpb25fYnlfbmFtZShob3N0X21hY2hpbmUsIG5hbWUsIG1hcHApOwogfQogCiBzdGF0aWMgc3RydWN0IHN5bWJvbCAqX19maW5kX2tlcm5lbF9mdW5jdGlvbih1NjQgYWRkciwgc3RydWN0IG1hcCAqKm1hcHApCiB7Ci0JcmV0dXJuIG1hY2hpbmVfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uKGhvc3RfbWFjaGluZSwgYWRkciwgbWFwcCwgTlVMTCk7CisJcmV0dXJuIG1hY2hpbmVfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uKGhvc3RfbWFjaGluZSwgYWRkciwgbWFwcCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcmVmX3JlbG9jX3N5bSAqa2VybmVsX2dldF9yZWZfcmVsb2Nfc3ltKHZvaWQpCkBAIC0xMjUsNyArMTI0LDcgQEAKIAlzdHJ1Y3Qga21hcCAqa21hcDsKIAlzdHJ1Y3QgbWFwICptYXAgPSBtYWNoaW5lX19rZXJuZWxfbWFwKGhvc3RfbWFjaGluZSk7CiAKLQlpZiAobWFwX19sb2FkKG1hcCwgTlVMTCkgPCAwKQorCWlmIChtYXBfX2xvYWQobWFwKSA8IDApCiAJCXJldHVybiBOVUxMOwogCiAJa21hcCA9IG1hcF9fa21hcChtYXApOwpAQCAtMjE0LDkgKzIxMywxMyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlwdHIyID0gc3RycGJyayhwdHIxLCAiLS5fIik7Ci0JaWYgKHB0cjIpCi0JCSpwdHIyID0gJ1wwJzsKKwlmb3IgKHB0cjIgPSBwdHIxOyBwdHIyICE9ICdcMCc7IHB0cjIrKykgeworCQlpZiAoIWlzYWxudW0oKnB0cjIpICYmICpwdHIyICE9ICdfJykgeworCQkJKnB0cjIgPSAnXDAnOworCQkJYnJlYWs7CisJCX0KKwl9CisKIAlyZXQgPSBlX3NucHJpbnRmKGJ1ZiwgNjQsICIlc18lcyIsIFBFUkZQUk9CRV9HUk9VUCwgcHRyMSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwpAQCAtMzUxLDkgKzM1NCw5IEBACiAJdm1saW51eF9uYW1lID0gc3ltYm9sX2NvbmYudm1saW51eF9uYW1lOwogCWRzby0+bG9hZF9lcnJubyA9IDA7CiAJaWYgKHZtbGludXhfbmFtZSkKLQkJcmV0ID0gZHNvX19sb2FkX3ZtbGludXgoZHNvLCBtYXAsIHZtbGludXhfbmFtZSwgZmFsc2UsIE5VTEwpOworCQlyZXQgPSBkc29fX2xvYWRfdm1saW51eChkc28sIG1hcCwgdm1saW51eF9uYW1lLCBmYWxzZSk7CiAJZWxzZQotCQlyZXQgPSBkc29fX2xvYWRfdm1saW51eF9wYXRoKGRzbywgbWFwLCBOVUxMKTsKKwkJcmV0ID0gZHNvX19sb2FkX3ZtbGludXhfcGF0aChkc28sIG1hcCk7CiBmb3VuZDoKIAkqcGRzbyA9IGRzbzsKIAlyZXR1cm4gcmV0OwpAQCAtNjc0LDYgKzY3NywxMCBAQAogCWNoYXIgKnRtcDsKIAlpbnQgaSwgc2tpcHBlZCA9IDA7CiAKKwkvKiBTa2lwIHBvc3QgcHJvY2VzcyBpZiB0aGUgdGFyZ2V0IGlzIGFuIG9mZmxpbmUga2VybmVsICovCisJaWYgKHN5bWJvbF9jb25mLmlnbm9yZV92bWxpbnV4X2J1aWxkaWQpCisJCXJldHVybiAwOworCiAJcmVsb2Nfc3ltID0ga2VybmVsX2dldF9yZWZfcmVsb2Nfc3ltKCk7CiAJaWYgKCFyZWxvY19zeW0pIHsKIAkJcHJfd2FybmluZygiUmVsb2NhdGVkIGJhc2Ugc3ltYm9sIGlzIG5vdCBmb3VuZCFcbiIpOwpAQCAtMTYxNCwxOSArMTYyMSwyNyBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qIFJldHVybnMgdHJ1ZSBpZiAqYW55KiBBUkcgaXMgZWl0aGVyIEMgdmFyaWFibGUsICRwYXJhbXMgb3IgJHZhcnMuICovCitib29sIHBlcmZfcHJvYmVfd2l0aF92YXIoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldikKK3sKKwlpbnQgaSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGV2LT5uYXJnczsgaSsrKQorCQlpZiAoaXNfY192YXJuYW1lKHBldi0+YXJnc1tpXS52YXIpICAgICAgICAgICAgICB8fAorCQkgICAgIXN0cmNtcChwZXYtPmFyZ3NbaV0udmFyLCBQUk9CRV9BUkdfUEFSQU1TKSB8fAorCQkgICAgIXN0cmNtcChwZXYtPmFyZ3NbaV0udmFyLCBQUk9CRV9BUkdfVkFSUykpCisJCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKIC8qIFJldHVybiB0cnVlIGlmIHRoaXMgcGVyZl9wcm9iZV9ldmVudCByZXF1aXJlcyBkZWJ1Z2luZm8gKi8KIGJvb2wgcGVyZl9wcm9iZV9ldmVudF9uZWVkX2R3YXJmKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYpCiB7Ci0JaW50IGk7Ci0KIAlpZiAocGV2LT5wb2ludC5maWxlIHx8IHBldi0+cG9pbnQubGluZSB8fCBwZXYtPnBvaW50LmxhenlfbGluZSkKIAkJcmV0dXJuIHRydWU7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcGV2LT5uYXJnczsgaSsrKQotCQlpZiAoaXNfY192YXJuYW1lKHBldi0+YXJnc1tpXS52YXIpIHx8Ci0JCSAgICAhc3RyY21wKHBldi0+YXJnc1tpXS52YXIsICIkcGFyYW1zIikgfHwKLQkJICAgICFzdHJjbXAocGV2LT5hcmdzW2ldLnZhciwgIiR2YXJzIikpCi0JCQlyZXR1cm4gdHJ1ZTsKKwlpZiAocGVyZl9wcm9iZV93aXRoX3ZhcihwZXYpKQorCQlyZXR1cm4gdHJ1ZTsKIAogCXJldHVybiBmYWxzZTsKIH0KQEAgLTE5ODcsNyArMjAwMiw3IEBACiAJCW1hcCA9IGRzb19fbmV3X21hcCh0cC0+bW9kdWxlKTsKIAkJaWYgKCFtYXApCiAJCQlnb3RvIG91dDsKLQkJc3ltID0gbWFwX19maW5kX3N5bWJvbChtYXAsIGFkZHIsIE5VTEwpOworCQlzeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKG1hcCwgYWRkcik7CiAJfSBlbHNlIHsKIAkJaWYgKHRwLT5zeW1ib2wgJiYgIWFkZHIpIHsKIAkJCWlmIChrZXJuZWxfZ2V0X3N5bWJvbF9hZGRyZXNzX2J5X25hbWUodHAtPnN5bWJvbCwKQEAgLTI2OTIsNyArMjcwNyw3IEBACiAJc3RydWN0IHN5bWJvbCAqc3ltOwogCXN0cnVjdCByYl9ub2RlICp0bXA7CiAKLQlpZiAobWFwX19sb2FkKG1hcCwgTlVMTCkgPCAwKQorCWlmIChtYXBfX2xvYWQobWFwKSA8IDApCiAJCXJldHVybiAwOwogCiAJbWFwX19mb3JfZWFjaF9zeW1ib2wobWFwLCBzeW0sIHRtcCkgewpAQCAtMzIwNyw2ICszMjIyLDUyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc2hvd19wcm9iZV90cmFjZV9ldmVudChzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldikKK3sKKwljaGFyICpidWYgPSBzeW50aGVzaXplX3Byb2JlX3RyYWNlX2NvbW1hbmQodGV2KTsKKworCWlmICghYnVmKSB7CisJCXByX2RlYnVnKCJGYWlsZWQgdG8gc3ludGhlc2l6ZSBwcm9iZSB0cmFjZSBldmVudC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBTaG93aW5nIGRlZmluaXRpb24gYWx3YXlzIGdvIHN0ZG91dCAqLworCXByaW50ZigiJXNcbiIsIGJ1Zik7CisJZnJlZShidWYpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzaG93X3Byb2JlX3RyYWNlX2V2ZW50cyhzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2cywgaW50IG5wZXZzKQoreworCXN0cnVjdCBzdHJsaXN0ICpuYW1lbGlzdCA9IHN0cmxpc3RfX25ldyhOVUxMLCBOVUxMKTsKKwlzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldjsKKwlzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2OworCWludCBpLCBqLCByZXQgPSAwOworCisJaWYgKCFuYW1lbGlzdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGogPSAwOyBqIDwgbnBldnMgJiYgIXJldDsgaisrKSB7CisJCXBldiA9ICZwZXZzW2pdOworCQlmb3IgKGkgPSAwOyBpIDwgcGV2LT5udGV2cyAmJiAhcmV0OyBpKyspIHsKKwkJCXRldiA9ICZwZXYtPnRldnNbaV07CisJCQkvKiBTa2lwIGlmIHRoZSBzeW1ib2wgaXMgb3V0IG9mIC50ZXh0IG9yIGJsYWNrbGlzdGVkICovCisJCQlpZiAoIXRldi0+cG9pbnQuc3ltYm9sICYmICFwZXYtPnVwcm9iZXMpCisJCQkJY29udGludWU7CisKKwkJCS8qIFNldCBuZXcgbmFtZSBmb3IgdGV2IChhbmQgdXBkYXRlIG5hbWVsaXN0KSAqLworCQkJcmV0ID0gcHJvYmVfdHJhY2VfZXZlbnRfX3NldF9uYW1lKHRldiwgcGV2LAorCQkJCQkJCSAgbmFtZWxpc3QsIHRydWUpOworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gc2hvd19wcm9iZV90cmFjZV9ldmVudCh0ZXYpOworCQl9CisJfQorCXN0cmxpc3RfX2RlbGV0ZShuYW1lbGlzdCk7CisKKwlyZXR1cm4gcmV0OworfQorCiBpbnQgYXBwbHlfcGVyZl9wcm9iZV9ldmVudHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldnMsIGludCBucGV2cykKIHsKIAlpbnQgaSwgcmV0ID0gMDsKQEAgLTMyODksMjQgKzMzNTAsMTAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBUT0RPOiBkb24ndCB1c2UgYSBnbG9iYWwgdmFyaWFibGUgZm9yIGZpbHRlciAuLi4gKi8KLXN0YXRpYyBzdHJ1Y3Qgc3RyZmlsdGVyICphdmFpbGFibGVfZnVuY19maWx0ZXI7Ci0KLS8qCi0gKiBJZiBhIHN5bWJvbCBjb3JyZXNwb25kcyB0byBhIGZ1bmN0aW9uIHdpdGggZ2xvYmFsIGJpbmRpbmcgYW5kCi0gKiBtYXRjaGVzIGZpbHRlciByZXR1cm4gMC4gRm9yIGFsbCBvdGhlcnMgcmV0dXJuIDEuCi0gKi8KLXN0YXRpYyBpbnQgZmlsdGVyX2F2YWlsYWJsZV9mdW5jdGlvbnMoc3RydWN0IG1hcCAqbWFwIF9fbWF5YmVfdW51c2VkLAotCQkJCSAgICAgIHN0cnVjdCBzeW1ib2wgKnN5bSkKLXsKLQlpZiAoc3RyZmlsdGVyX19jb21wYXJlKGF2YWlsYWJsZV9mdW5jX2ZpbHRlciwgc3ltLT5uYW1lKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci19Ci0KIGludCBzaG93X2F2YWlsYWJsZV9mdW5jcyhjb25zdCBjaGFyICp0YXJnZXQsIHN0cnVjdCBzdHJmaWx0ZXIgKl9maWx0ZXIsCiAJCQkJCWJvb2wgdXNlcikKIHsKKyAgICAgICAgc3RydWN0IHJiX25vZGUgKm5kOwogCXN0cnVjdCBtYXAgKm1hcDsKIAlpbnQgcmV0OwogCkBAIC0zMzI0LDkgKzMzNzEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQkvKiBMb2FkIHN5bWJvbHMgd2l0aCBnaXZlbiBmaWx0ZXIgKi8KLQlhdmFpbGFibGVfZnVuY19maWx0ZXIgPSBfZmlsdGVyOwotCXJldCA9IG1hcF9fbG9hZChtYXAsIGZpbHRlcl9hdmFpbGFibGVfZnVuY3Rpb25zKTsKKwlyZXQgPSBtYXBfX2xvYWQobWFwKTsKIAlpZiAocmV0KSB7CiAJCWlmIChyZXQgPT0gLTIpIHsKIAkJCWNoYXIgKnN0ciA9IHN0cmZpbHRlcl9fc3RyaW5nKF9maWx0ZXIpOwpAQCAtMzM0Myw3ICszMzg4LDE0IEBACiAKIAkvKiBTaG93IGFsbCAoZmlsdGVyZWQpIHN5bWJvbHMgKi8KIAlzZXR1cF9wYWdlcigpOwotCWRzb19fZnByaW50Zl9zeW1ib2xzX2J5X25hbWUobWFwLT5kc28sIG1hcC0+dHlwZSwgc3Rkb3V0KTsKKworICAgICAgICBmb3IgKG5kID0gcmJfZmlyc3QoJm1hcC0+ZHNvLT5zeW1ib2xfbmFtZXNbbWFwLT50eXBlXSk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CisJCXN0cnVjdCBzeW1ib2xfbmFtZV9yYl9ub2RlICpwb3MgPSByYl9lbnRyeShuZCwgc3RydWN0IHN5bWJvbF9uYW1lX3JiX25vZGUsIHJiX25vZGUpOworCisJCWlmIChzdHJmaWx0ZXJfX2NvbXBhcmUoX2ZpbHRlciwgcG9zLT5zeW0ubmFtZSkpCisJCQlwcmludGYoIiVzXG4iLCBwb3MtPnN5bS5uYW1lKTsKKyAgICAgICAgfQorCiBlbmQ6CiAJaWYgKHVzZXIpIHsKIAkJbWFwX19wdXQobWFwKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5oIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmgKaW5kZXggZjRmNDVkYi4uODA5MWQxNSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmgKQEAgLTEyOCw2ICsxMjgsOCBAQAogaW50IHBlcmZfcHJvYmVfZXZlbnRfX2NvcHkoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKmRzdCwKIAkJCSAgIHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpzcmMpOwogCitib29sIHBlcmZfcHJvYmVfd2l0aF92YXIoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldik7CisKIC8qIENoZWNrIHRoZSBwZXJmX3Byb2JlX2V2ZW50IG5lZWRzIGRlYnVnaW5mbyAqLwogYm9vbCBwZXJmX3Byb2JlX2V2ZW50X25lZWRfZHdhcmYoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldik7CiAKQEAgLTE0Nyw2ICsxNDksNyBAQAogaW50IGFkZF9wZXJmX3Byb2JlX2V2ZW50cyhzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2cywgaW50IG5wZXZzKTsKIGludCBjb252ZXJ0X3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXZzLCBpbnQgbnBldnMpOwogaW50IGFwcGx5X3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXZzLCBpbnQgbnBldnMpOworaW50IHNob3dfcHJvYmVfdHJhY2VfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXZzLCBpbnQgbnBldnMpOwogdm9pZCBjbGVhbnVwX3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXZzLCBpbnQgbnBldnMpOwogaW50IGRlbF9wZXJmX3Byb2JlX2V2ZW50cyhzdHJ1Y3Qgc3RyZmlsdGVyICpmaWx0ZXIpOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmlsZS5jIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbGUuYwppbmRleCA5YWVkOWMzLi40MzZiNjQ3IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmlsZS5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maWxlLmMKQEAgLTczLDExICs3MywxMCBAQAogc3RhdGljIGludCBvcGVuX3Byb2JlX2V2ZW50cyhjb25zdCBjaGFyICp0cmFjZV9maWxlLCBib29sIHJlYWR3cml0ZSkKIHsKIAljaGFyIGJ1ZltQQVRIX01BWF07Ci0JY29uc3QgY2hhciAqdHJhY2luZ19kaXIgPSAiIjsKIAlpbnQgcmV0OwogCi0JcmV0ID0gZV9zbnByaW50ZihidWYsIFBBVEhfTUFYLCAiJXMvJXMlcyIsCi0JCQkgdHJhY2luZ19wYXRoLCB0cmFjaW5nX2RpciwgdHJhY2VfZmlsZSk7CisJcmV0ID0gZV9zbnByaW50ZihidWYsIFBBVEhfTUFYLCAiJXMvJXMiLAorCQkJIHRyYWNpbmdfcGF0aCwgdHJhY2VfZmlsZSk7CiAJaWYgKHJldCA+PSAwKSB7CiAJCXByX2RlYnVnKCJPcGVuaW5nICVzIHdyaXRlPSVkXG4iLCBidWYsIHJlYWR3cml0ZSk7CiAJCWlmIChyZWFkd3JpdGUgJiYgIXByb2JlX2V2ZW50X2RyeV9ydW4pCkBAIC0xMzMsNyArMTMyLDcgQEAKIC8qIEdldCByYXcgc3RyaW5nIGxpc3Qgb2YgY3VycmVudCBrcHJvYmVfZXZlbnRzICBvciB1cHJvYmVfZXZlbnRzICovCiBzdHJ1Y3Qgc3RybGlzdCAqcHJvYmVfZmlsZV9fZ2V0X3Jhd2xpc3QoaW50IGZkKQogewotCWludCByZXQsIGlkeDsKKwlpbnQgcmV0LCBpZHgsIGZkZHVwOwogCUZJTEUgKmZwOwogCWNoYXIgYnVmW01BWF9DTURMRU5dOwogCWNoYXIgKnA7CkBAIC0xNDMsOCArMTQyLDE3IEBACiAJCXJldHVybiBOVUxMOwogCiAJc2wgPSBzdHJsaXN0X19uZXcoTlVMTCwgTlVMTCk7CisJaWYgKHNsID09IE5VTEwpCisJCXJldHVybiBOVUxMOwogCi0JZnAgPSBmZG9wZW4oZHVwKGZkKSwgInIiKTsKKwlmZGR1cCA9IGR1cChmZCk7CisJaWYgKGZkZHVwIDwgMCkKKwkJZ290byBvdXRfZnJlZV9zbDsKKworCWZwID0gZmRvcGVuKGZkZHVwLCAiciIpOworCWlmICghZnApCisJCWdvdG8gb3V0X2Nsb3NlX2ZkZHVwOworCiAJd2hpbGUgKCFmZW9mKGZwKSkgewogCQlwID0gZmdldHMoYnVmLCBNQVhfQ01ETEVOLCBmcCk7CiAJCWlmICghcCkKQEAgLTE1NiwxMyArMTY0LDIxIEBACiAJCXJldCA9IHN0cmxpc3RfX2FkZChzbCwgYnVmKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXByX2RlYnVnKCJzdHJsaXN0X19hZGQgZmFpbGVkICglZClcbiIsIHJldCk7Ci0JCQlzdHJsaXN0X19kZWxldGUoc2wpOwotCQkJcmV0dXJuIE5VTEw7CisJCQlnb3RvIG91dF9jbG9zZV9mcDsKIAkJfQogCX0KIAlmY2xvc2UoZnApOwogCiAJcmV0dXJuIHNsOworCitvdXRfY2xvc2VfZnA6CisJZmNsb3NlKGZwKTsKKwlnb3RvIG91dF9mcmVlX3NsOworb3V0X2Nsb3NlX2ZkZHVwOgorCWNsb3NlKGZkZHVwKTsKK291dF9mcmVlX3NsOgorCXN0cmxpc3RfX2RlbGV0ZShzbCk7CisJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3RybGlzdCAqX19wcm9iZV9maWxlX19nZXRfbmFtZWxpc3QoaW50IGZkLCBib29sIGluY2x1ZGVfZ3JvdXApCkBAIC00NDcsMTIgKzQ2MywxNyBAQAogewogCXN0cnVjdCBwcm9iZV9jYWNoZV9lbnRyeSAqZW50cnkgPSBOVUxMOwogCWNoYXIgYnVmW01BWF9DTURMRU5dLCAqcDsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0ID0gMCwgZmRkdXA7CiAJRklMRSAqZnA7CiAKLQlmcCA9IGZkb3BlbihkdXAocGNhY2hlLT5mZCksICJyIik7Ci0JaWYgKCFmcCkKKwlmZGR1cCA9IGR1cChwY2FjaGUtPmZkKTsKKwlpZiAoZmRkdXAgPCAwKQorCQlyZXR1cm4gLWVycm5vOworCWZwID0gZmRvcGVuKGZkZHVwLCAiciIpOworCWlmICghZnApIHsKKwkJY2xvc2UoZmRkdXApOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAl3aGlsZSAoIWZlb2YoZnApKSB7CiAJCWlmICghZmdldHMoYnVmLCBNQVhfQ01ETEVOLCBmcCkpCkBAIC02NzgsNyArNjk5LDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmc2R0bGlzdCk7CiAJcmV0ID0gZ2V0X3NkdF9ub3RlX2xpc3QoJnNkdGxpc3QsIHBhdGhuYW1lKTsKIAlpZiAocmV0IDwgMCkgewotCQlwcl9kZWJ1ZygiRmFpbGVkIHRvIGdldCBzZHQgbm90ZTogJWRcbiIsIHJldCk7CisJCXByX2RlYnVnNCgiRmFpbGVkIHRvIGdldCBzZHQgbm90ZTogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCWxpc3RfZm9yX2VhY2hfZW50cnkobm90ZSwgJnNkdGxpc3QsIG5vdGVfbGlzdCkgewpAQCAtODU1LDMgKzg3Niw2MCBAQAogCiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKnBhdHRlcm47CisJYm9vbAlhdmFpbDsKKwlib29sCWNoZWNrZWQ7Cit9IHByb2JlX3R5cGVfdGFibGVbXSA9IHsKKyNkZWZpbmUgREVGSU5FX1RZUEUoaWR4LCBwYXQsIGRlZl9hdmFpbCkJXAorCVtpZHhdID0gey5wYXR0ZXJuID0gcGF0LCAuYXZhaWwgPSAoZGVmX2F2YWlsKX0KKwlERUZJTkVfVFlQRShQUk9CRV9UWVBFX1UsICIqIHU4LzE2LzMyLzY0LCoiLCB0cnVlKSwKKwlERUZJTkVfVFlQRShQUk9CRV9UWVBFX1MsICIqIHM4LzE2LzMyLzY0LCoiLCB0cnVlKSwKKwlERUZJTkVfVFlQRShQUk9CRV9UWVBFX1gsICIqIHg4LzE2LzMyLzY0LCoiLCBmYWxzZSksCisJREVGSU5FX1RZUEUoUFJPQkVfVFlQRV9TVFJJTkcsICIqIHN0cmluZywqIiwgdHJ1ZSksCisJREVGSU5FX1RZUEUoUFJPQkVfVFlQRV9CSVRGSUVMRCwKKwkJICAgICIqIGI8Yml0LXdpZHRoPkA8Yml0LW9mZnNldD4vPGNvbnRhaW5lci1zaXplPiIsIHRydWUpLAorfTsKKworYm9vbCBwcm9iZV90eXBlX2lzX2F2YWlsYWJsZShlbnVtIHByb2JlX3R5cGUgdHlwZSkKK3sKKwlGSUxFICpmcDsKKwljaGFyICpidWYgPSBOVUxMOworCXNpemVfdCBsZW4gPSAwOworCWJvb2wgdGFyZ2V0X2xpbmUgPSBmYWxzZTsKKwlib29sIHJldCA9IHByb2JlX3R5cGVfdGFibGVbdHlwZV0uYXZhaWw7CisKKwlpZiAodHlwZSA+PSBQUk9CRV9UWVBFX0VORCkKKwkJcmV0dXJuIGZhbHNlOworCS8qIFdlIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlIHR5cGUgd2hpY2ggc3VwcG9ydGVkIGJ5IGRlZmF1bHQgKi8KKwlpZiAocmV0IHx8IHByb2JlX3R5cGVfdGFibGVbdHlwZV0uY2hlY2tlZCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChhc3ByaW50ZigmYnVmLCAiJXMvUkVBRE1FIiwgdHJhY2luZ19wYXRoKSA8IDApCisJCXJldHVybiByZXQ7CisKKwlmcCA9IGZvcGVuKGJ1ZiwgInIiKTsKKwlpZiAoIWZwKQorCQlnb3RvIGVuZDsKKworCXpmcmVlKCZidWYpOworCXdoaWxlIChnZXRsaW5lKCZidWYsICZsZW4sIGZwKSA+IDAgJiYgIXJldCkgeworCQlpZiAoIXRhcmdldF9saW5lKSB7CisJCQl0YXJnZXRfbGluZSA9ICEhc3Ryc3RyKGJ1ZiwgIiB0eXBlOiAiKTsKKwkJCWlmICghdGFyZ2V0X2xpbmUpCisJCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoc3Ryc3RyKGJ1ZiwgIlx0ICAgICAgICAgICIpICE9IGJ1ZikKKwkJCWJyZWFrOworCQlyZXQgPSBzdHJnbG9ibWF0Y2goYnVmLCBwcm9iZV90eXBlX3RhYmxlW3R5cGVdLnBhdHRlcm4pOworCX0KKwkvKiBDYWNoZSB0aGUgcmVzdWx0ICovCisJcHJvYmVfdHlwZV90YWJsZVt0eXBlXS5jaGVja2VkID0gdHJ1ZTsKKwlwcm9iZV90eXBlX3RhYmxlW3R5cGVdLmF2YWlsID0gcmV0OworCisJZmNsb3NlKGZwKTsKK2VuZDoKKwlmcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbGUuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maWxlLmgKaW5kZXggOTU3N2I1Yy4uZWJhNDRjMyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbGUuaAorKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmlsZS5oCkBAIC0xOSw2ICsxOSwxNSBAQAogCXN0cnVjdCBsaXN0X2hlYWQgZW50cmllczsKIH07CiAKK2VudW0gcHJvYmVfdHlwZSB7CisJUFJPQkVfVFlQRV9VID0gMCwKKwlQUk9CRV9UWVBFX1MsCisJUFJPQkVfVFlQRV9YLAorCVBST0JFX1RZUEVfU1RSSU5HLAorCVBST0JFX1RZUEVfQklURklFTEQsCisJUFJPQkVfVFlQRV9FTkQsCit9OworCiAjZGVmaW5lIFBGX0ZMX1VQUk9CRQkxCiAjZGVmaW5lIFBGX0ZMX1JXCTIKICNkZWZpbmUgZm9yX2VhY2hfcHJvYmVfY2FjaGVfZW50cnkoZW50cnksIHBjYWNoZSkgXApAQCAtNTQsNiArNjMsNyBAQAogc3RydWN0IHByb2JlX2NhY2hlX2VudHJ5ICpwcm9iZV9jYWNoZV9fZmluZF9ieV9uYW1lKHN0cnVjdCBwcm9iZV9jYWNoZSAqcGNhY2hlLAogCQkJCQljb25zdCBjaGFyICpncm91cCwgY29uc3QgY2hhciAqZXZlbnQpOwogaW50IHByb2JlX2NhY2hlX19zaG93X2FsbF9jYWNoZXMoc3RydWN0IHN0cmZpbHRlciAqZmlsdGVyKTsKK2Jvb2wgcHJvYmVfdHlwZV9pc19hdmFpbGFibGUoZW51bSBwcm9iZV90eXBlIHR5cGUpOwogI2Vsc2UJLyogISBIQVZFX0xJQkVMRl9TVVBQT1JUICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwcm9iZV9jYWNoZSAqcHJvYmVfY2FjaGVfX25ldyhjb25zdCBjaGFyICp0Z3QgX19tYXliZV91bnVzZWQpCiB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMKaW5kZXggNWMyOTBjNi4uZGY0ZGViZSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgInV0aWwuaCIKICNpbmNsdWRlICJzeW1ib2wuaCIKICNpbmNsdWRlICJwcm9iZS1maW5kZXIuaCIKKyNpbmNsdWRlICJwcm9iZS1maWxlLmgiCiAKIC8qIEtwcm9iZSB0cmFjZXIgYmFzaWMgdHlwZSBpcyB1cCB0byB1NjQgKi8KICNkZWZpbmUgTUFYX0JBU0lDX1RZUEVfQklUUwk2NApAQCAtMTcwLDYgKzE3MSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgY29udmVydF92YXJpYWJsZV9sb2NhdGlvbihEd2FyZl9EaWUgKnZyX2RpZSwgRHdhcmZfQWRkciBhZGRyLAogCQkJCSAgICAgRHdhcmZfT3AgKmZiX29wcywgRHdhcmZfRGllICpzcF9kaWUsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgbWFjaGluZSwKIAkJCQkgICAgIHN0cnVjdCBwcm9iZV90cmFjZV9hcmcgKnR2YXIpCiB7CiAJRHdhcmZfQXR0cmlidXRlIGF0dHI7CkBAIC0yNjUsNyArMjY3LDcgQEAKIAlpZiAoIXR2YXIpCiAJCXJldHVybiByZXQyOwogCi0JcmVncyA9IGdldF9hcmNoX3JlZ3N0cihyZWduKTsKKwlyZWdzID0gZ2V0X2R3YXJmX3JlZ3N0cihyZWduLCBtYWNoaW5lKTsKIAlpZiAoIXJlZ3MpIHsKIAkJLyogVGhpcyBzaG91bGQgYmUgYSBidWcgaW4gRFdBUkYgb3IgdGhpcyB0b29sICovCiAJCXByX3dhcm5pbmcoIk1hcHBpbmcgZm9yIHRoZSByZWdpc3RlciBudW1iZXIgJXUgIgpAQCAtMjk3LDEzICsyOTksMTMgQEAKIAljaGFyIHNidWZbU1RSRVJSX0JVRlNJWkVdOwogCWludCBic2l6ZSwgYm9mZnMsIHRvdGFsOwogCWludCByZXQ7Ci0JY2hhciBzaWduOworCWNoYXIgcHJlZml4OwogCiAJLyogVE9ETzogY2hlY2sgYWxsIHR5cGVzICovCi0JaWYgKGNhc3QgJiYgc3RyY21wKGNhc3QsICJzdHJpbmciKSAhPSAwICYmCisJaWYgKGNhc3QgJiYgc3RyY21wKGNhc3QsICJzdHJpbmciKSAhPSAwICYmIHN0cmNtcChjYXN0LCAieCIpICE9IDAgJiYKIAkgICAgc3RyY21wKGNhc3QsICJzIikgIT0gMCAmJiBzdHJjbXAoY2FzdCwgInUiKSAhPSAwKSB7CiAJCS8qIE5vbiBzdHJpbmcgdHlwZSBpcyBPSyAqLwotCQkvKiBhbmQgcmVzcGVjdCBzaWduZWRuZXNzIGNhc3QgKi8KKwkJLyogYW5kIHJlc3BlY3Qgc2lnbmVkbmVzcy9oZXhhZGVjaW1hbCBjYXN0ICovCiAJCXR2YXItPnR5cGUgPSBzdHJkdXAoY2FzdCk7CiAJCXJldHVybiAodHZhci0+dHlwZSA9PSBOVUxMKSA/IC1FTk9NRU0gOiAwOwogCX0KQEAgLTM2NSwxMSArMzY3LDE1IEBACiAJfQogCiAJaWYgKGNhc3QgJiYgKHN0cmNtcChjYXN0LCAidSIpID09IDApKQotCQlzaWduID0gJ3UnOworCQlwcmVmaXggPSAndSc7CiAJZWxzZSBpZiAoY2FzdCAmJiAoc3RyY21wKGNhc3QsICJzIikgPT0gMCkpCi0JCXNpZ24gPSAncyc7CisJCXByZWZpeCA9ICdzJzsKKwllbHNlIGlmIChjYXN0ICYmIChzdHJjbXAoY2FzdCwgIngiKSA9PSAwKSAmJgorCQkgcHJvYmVfdHlwZV9pc19hdmFpbGFibGUoUFJPQkVfVFlQRV9YKSkKKwkJcHJlZml4ID0gJ3gnOwogCWVsc2UKLQkJc2lnbiA9IGRpZV9pc19zaWduZWRfdHlwZSgmdHlwZSkgPyAncycgOiAndSc7CisJCXByZWZpeCA9IGRpZV9pc19zaWduZWRfdHlwZSgmdHlwZSkgPyAncycgOgorCQkJIHByb2JlX3R5cGVfaXNfYXZhaWxhYmxlKFBST0JFX1RZUEVfWCkgPyAneCcgOiAndSc7CiAKIAlyZXQgPSBkd2FyZl9ieXRlc2l6ZSgmdHlwZSk7CiAJaWYgKHJldCA8PSAwKQpAQCAtMzgzLDcgKzM4OSw3IEBACiAJCQlkd2FyZl9kaWVuYW1lKCZ0eXBlKSwgTUFYX0JBU0lDX1RZUEVfQklUUyk7CiAJCXJldCA9IE1BWF9CQVNJQ19UWVBFX0JJVFM7CiAJfQotCXJldCA9IHNucHJpbnRmKGJ1ZiwgMTYsICIlYyVkIiwgc2lnbiwgcmV0KTsKKwlyZXQgPSBzbnByaW50ZihidWYsIDE2LCAiJWMlZCIsIHByZWZpeCwgcmV0KTsKIAogZm9ybWF0dGVkOgogCWlmIChyZXQgPCAwIHx8IHJldCA+PSAxNikgewpAQCAtNTM4LDcgKzU0NCw3IEBACiAJCSBkd2FyZl9kaWVuYW1lKHZyX2RpZSkpOwogCiAJcmV0ID0gY29udmVydF92YXJpYWJsZV9sb2NhdGlvbih2cl9kaWUsIHBmLT5hZGRyLCBwZi0+ZmJfb3BzLAotCQkJCQkmcGYtPnNwX2RpZSwgcGYtPnR2YXIpOworCQkJCQkmcGYtPnNwX2RpZSwgcGYtPm1hY2hpbmUsIHBmLT50dmFyKTsKIAlpZiAocmV0ID09IC1FTk9FTlQgfHwgcmV0ID09IC1FSU5WQUwpIHsKIAkJcHJfZXJyKCJGYWlsZWQgdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlICclcycgdmFyaWFibGUgYXQgdGhpcyBhZGRyZXNzLlxuIgogCQkgICAgICAgIiBQZXJoYXBzIGl0IGhhcyBiZWVuIG9wdGltaXplZCBvdXQuXG4iCkBAIC05MDEsNiArOTA3LDM4IEBACiAJcmV0dXJuIGRpZV93YWxrX2xpbmVzKHNwX2RpZSwgcHJvYmVfcG9pbnRfbGF6eV93YWxrZXIsIHBmKTsKIH0KIAorc3RhdGljIHZvaWQgc2tpcF9wcm9sb2d1ZShEd2FyZl9EaWUgKnNwX2RpZSwgc3RydWN0IHByb2JlX2ZpbmRlciAqcGYpCit7CisJc3RydWN0IHBlcmZfcHJvYmVfcG9pbnQgKnBwID0gJnBmLT5wZXYtPnBvaW50OworCisJLyogTm90IHVwcm9iZT8gKi8KKwlpZiAoIXBmLT5wZXYtPnVwcm9iZXMpCisJCXJldHVybjsKKworCS8qIENvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9uPyAqLworCWlmIChkaWVfaXNfb3B0aW1pemVkX3RhcmdldCgmcGYtPmN1X2RpZSkpCisJCXJldHVybjsKKworCS8qIERvbid0IGtub3cgZW50cnlwYz8gKi8KKwlpZiAoIXBmLT5hZGRyKQorCQlyZXR1cm47CisKKwkvKiBPbmx5IEZVTkMgYW5kIEZVTkNAU1JDIGFyZSBlbGlnaWJsZS4gKi8KKwlpZiAoIXBwLT5mdW5jdGlvbiB8fCBwcC0+bGluZSB8fCBwcC0+cmV0cHJvYmUgfHwgcHAtPmxhenlfbGluZSB8fAorCSAgICBwcC0+b2Zmc2V0IHx8IHBwLT5hYnNfYWRkcmVzcykKKwkJcmV0dXJuOworCisJLyogTm90IGludGVyZXN0ZWQgaW4gZnVuYyBwYXJhbWV0ZXI/ICovCisJaWYgKCFwZXJmX3Byb2JlX3dpdGhfdmFyKHBmLT5wZXYpKQorCQlyZXR1cm47CisKKwlwcl9pbmZvKCJUYXJnZXQgcHJvZ3JhbSBpcyBjb21waWxlZCB3aXRob3V0IG9wdGltaXphdGlvbi4gU2tpcHBpbmcgcHJvbG9ndWUuXG4iCisJCSJQcm9iZSBvbiBhZGRyZXNzIDB4JSIgUFJJeDY0ICIgdG8gZm9yY2UgcHJvYmluZyBhdCB0aGUgZnVuY3Rpb24gZW50cnkuXG5cbiIsCisJCXBmLT5hZGRyKTsKKworCWRpZV9za2lwX3Byb2xvZ3VlKHNwX2RpZSwgJnBmLT5jdV9kaWUsICZwZi0+YWRkcik7Cit9CisKIHN0YXRpYyBpbnQgcHJvYmVfcG9pbnRfaW5saW5lX2NiKER3YXJmX0RpZSAqaW5fZGllLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBwcm9iZV9maW5kZXIgKnBmID0gZGF0YTsKQEAgLTkxNyw2ICs5NTUsMTEgQEAKIAkJCQkgICBkd2FyZl9kaWVuYW1lKGluX2RpZSkpOwogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KKwkJaWYgKGFkZHIgPT0gMCkgeworCQkJcHJfZGVidWcoIiVzIGhhcyBubyB2YWxpZCBlbnRyeSBhZGRyZXNzLiBza2lwcGVkLlxuIiwKKwkJCQkgZHdhcmZfZGllbmFtZShpbl9kaWUpKTsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CiAJCXBmLT5hZGRyID0gYWRkcjsKIAkJcGYtPmFkZHIgKz0gcHAtPm9mZnNldDsKIAkJcHJfZGVidWcoImZvdW5kIGlubGluZSBhZGRyOiAweCVqeFxuIiwKQEAgLTk1MCw3ICs5OTMsOCBAQAogCWlmIChwcC0+ZmlsZSAmJiBzdHJ0YWlsY21wKHBwLT5maWxlLCBkd2FyZl9kZWNsX2ZpbGUoc3BfZGllKSkpCiAJCXJldHVybiBEV0FSRl9DQl9PSzsKIAotCXByX2RlYnVnKCJNYXRjaGVkIGZ1bmN0aW9uOiAlc1xuIiwgZHdhcmZfZGllbmFtZShzcF9kaWUpKTsKKwlwcl9kZWJ1ZygiTWF0Y2hlZCBmdW5jdGlvbjogJXMgWyVseF1cbiIsIGR3YXJmX2RpZW5hbWUoc3BfZGllKSwKKwkJICh1bnNpZ25lZCBsb25nKWR3YXJmX2RpZW9mZnNldChzcF9kaWUpKTsKIAlwZi0+Zm5hbWUgPSBkd2FyZl9kZWNsX2ZpbGUoc3BfZGllKTsKIAlpZiAocHAtPmxpbmUpIHsgLyogRnVuY3Rpb24gcmVsYXRpdmUgbGluZSAqLwogCQlkd2FyZl9kZWNsX2xpbmUoc3BfZGllLCAmcGYtPmxubyk7CkBAIC05NTksMTAgKzEwMDMsMTYgQEAKIAl9IGVsc2UgaWYgKGRpZV9pc19mdW5jX2luc3RhbmNlKHNwX2RpZSkpIHsKIAkJLyogSW5zdGFuY2VzIGFsd2F5cyBoYXZlIHRoZSBlbnRyeSBhZGRyZXNzICovCiAJCWR3YXJmX2VudHJ5cGMoc3BfZGllLCAmcGYtPmFkZHIpOworCQkvKiBCdXQgaW4gc29tZSBjYXNlIHRoZSBlbnRyeSBhZGRyZXNzIGlzIDAgKi8KKwkJaWYgKHBmLT5hZGRyID09IDApIHsKKwkJCXByX2RlYnVnKCIlcyBoYXMgbm8gZW50cnkgUEMuIFNraXBwZWRcbiIsCisJCQkJIGR3YXJmX2RpZW5hbWUoc3BfZGllKSk7CisJCQlwYXJhbS0+cmV0dmFsID0gMDsKIAkJLyogUmVhbCBmdW5jdGlvbiAqLwotCQlpZiAocHAtPmxhenlfbGluZSkKKwkJfSBlbHNlIGlmIChwcC0+bGF6eV9saW5lKQogCQkJcGFyYW0tPnJldHZhbCA9IGZpbmRfcHJvYmVfcG9pbnRfbGF6eShzcF9kaWUsIHBmKTsKIAkJZWxzZSB7CisJCQlza2lwX3Byb2xvZ3VlKHNwX2RpZSwgcGYpOwogCQkJcGYtPmFkZHIgKz0gcHAtPm9mZnNldDsKIAkJCS8qIFRPRE86IENoZWNrIHRoZSBhZGRyZXNzIGluIHRoaXMgZnVuY3Rpb24gKi8KIAkJCXBhcmFtLT5yZXR2YWwgPSBjYWxsX3Byb2JlX2ZpbmRlcihzcF9kaWUsIHBmKTsKQEAgLTk3Miw3ICsxMDIyLDcgQEAKIAkJcGFyYW0tPnJldHZhbCA9IGRpZV93YWxrX2luc3RhbmNlcyhzcF9kaWUsCiAJCQkJCXByb2JlX3BvaW50X2lubGluZV9jYiwgKHZvaWQgKilwZik7CiAJCS8qIFRoaXMgY291bGQgYmUgYSBub24tZXhpc3RlZCBpbmxpbmUgZGVmaW5pdGlvbiAqLwotCQlpZiAocGFyYW0tPnJldHZhbCA9PSAtRU5PRU5UICYmIHN0cmlzZ2xvYihwcC0+ZnVuY3Rpb24pKQorCQlpZiAocGFyYW0tPnJldHZhbCA9PSAtRU5PRU5UKQogCQkJcGFyYW0tPnJldHZhbCA9IDA7CiAJfQogCkBAIC0xMTAxLDExICsxMTUxLDggQEAKIAkJCQkgIHN0cnVjdCBwcm9iZV9maW5kZXIgKnBmKQogewogCWludCByZXQgPSAwOwotCi0jaWYgX0VMRlVUSUxTX1BSRVJFUSgwLCAxNDIpCiAJRWxmICplbGY7CiAJR0VsZl9FaGRyIGVoZHI7Ci0JR0VsZl9TaGRyIHNoZHI7CiAKIAlpZiAocGYtPmNmaV9laCB8fCBwZi0+Y2ZpX2RiZykKIAkJcmV0dXJuIGRlYnVnaW5mb19fZmluZF9wcm9iZV9sb2NhdGlvbihkYmcsIHBmKTsKQEAgLTExMTgsMTEgKzExNjUsMTggQEAKIAlpZiAoZ2VsZl9nZXRlaGRyKGVsZiwgJmVoZHIpID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGVsZl9zZWN0aW9uX2J5X25hbWUoZWxmLCAmZWhkciwgJnNoZHIsICIuZWhfZnJhbWUiLCBOVUxMKSAmJgotCSAgICBzaGRyLnNoX3R5cGUgPT0gU0hUX1BST0dCSVRTKQotCQlwZi0+Y2ZpX2VoID0gZHdhcmZfZ2V0Y2ZpX2VsZihlbGYpOworCXBmLT5tYWNoaW5lID0gZWhkci5lX21hY2hpbmU7CiAKLQlwZi0+Y2ZpX2RiZyA9IGR3YXJmX2dldGNmaShkYmctPmRiZyk7CisjaWYgX0VMRlVUSUxTX1BSRVJFUSgwLCAxNDIpCisJZG8geworCQlHRWxmX1NoZHIgc2hkcjsKKworCQlpZiAoZWxmX3NlY3Rpb25fYnlfbmFtZShlbGYsICZlaGRyLCAmc2hkciwgIi5laF9mcmFtZSIsIE5VTEwpICYmCisJCSAgICBzaGRyLnNoX3R5cGUgPT0gU0hUX1BST0dCSVRTKQorCQkJcGYtPmNmaV9laCA9IGR3YXJmX2dldGNmaV9lbGYoZWxmKTsKKworCQlwZi0+Y2ZpX2RiZyA9IGR3YXJmX2dldGNmaShkYmctPmRiZyk7CisJfSB3aGlsZSAoMCk7CiAjZW5kaWYKIAogCXJldCA9IGRlYnVnaW5mb19fZmluZF9wcm9iZV9sb2NhdGlvbihkYmcsIHBmKTsKQEAgLTExNTAsNyArMTIwNCw3IEBACiAJICAgICh0YWcgPT0gRFdfVEFHX3ZhcmlhYmxlICYmIHZmLT52YXJzKSkgewogCQlpZiAoY29udmVydF92YXJpYWJsZV9sb2NhdGlvbihkaWVfbWVtLCB2Zi0+cGYtPmFkZHIsCiAJCQkJCSAgICAgIHZmLT5wZi0+ZmJfb3BzLCAmcGYtPnNwX2RpZSwKLQkJCQkJICAgICAgTlVMTCkgPT0gMCkgeworCQkJCQkgICAgICBwZi0+bWFjaGluZSwgTlVMTCkgPT0gMCkgewogCQkJdmYtPmFyZ3NbdmYtPm5hcmdzXS52YXIgPSAoY2hhciAqKWR3YXJmX2RpZW5hbWUoZGllX21lbSk7CiAJCQlpZiAodmYtPmFyZ3NbdmYtPm5hcmdzXS52YXIgPT0gTlVMTCkgewogCQkJCXZmLT5yZXQgPSAtRU5PTUVNOwpAQCAtMTMxMyw3ICsxMzY3LDcgQEAKIAkgICAgdGFnID09IERXX1RBR192YXJpYWJsZSkgewogCQlyZXQgPSBjb252ZXJ0X3ZhcmlhYmxlX2xvY2F0aW9uKGRpZV9tZW0sIGFmLT5wZi5hZGRyLAogCQkJCQkJYWYtPnBmLmZiX29wcywgJmFmLT5wZi5zcF9kaWUsCi0JCQkJCQlOVUxMKTsKKwkJCQkJCWFmLT5wZi5tYWNoaW5lLCBOVUxMKTsKIAkJaWYgKHJldCA9PSAwIHx8IHJldCA9PSAtRVJBTkdFKSB7CiAJCQlpbnQgcmV0MjsKIAkJCWJvb2wgZXh0ZXJucyA9ICFhZi0+Y2hpbGQ7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmggYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmgKaW5kZXggNTExMzdmYy4uZjFkODU1OCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuaApAQCAtODAsNiArODAsNyBAQAogCUR3YXJmX0NGSQkJKmNmaV9kYmc7CiAjZW5kaWYKIAlEd2FyZl9PcAkJKmZiX29wczsJLyogRnJhbWUgYmFzZSBhdHRyaWJ1dGUgKi8KKwl1bnNpZ25lZCBpbnQJCW1hY2hpbmU7CS8qIFRhcmdldCBtYWNoaW5lIGFyY2ggKi8KIAlzdHJ1Y3QgcGVyZl9wcm9iZV9hcmcJKnB2YXI7CQkvKiBDdXJyZW50IHRhcmdldCB2YXJpYWJsZSAqLwogCXN0cnVjdCBwcm9iZV90cmFjZV9hcmcJKnR2YXI7CQkvKiBDdXJyZW50IHJlc3VsdCB2YXJpYWJsZSAqLwogfTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1wZXJsLmMgYi90b29scy9wZXJmL3V0aWwvc2NyaXB0aW5nLWVuZ2luZXMvdHJhY2UtZXZlbnQtcGVybC5jCmluZGV4IDVkMWViMWMuLmU1NWExMzIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1wZXJsLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXBlcmwuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KIAogI2luY2x1ZGUgIi4uL3V0aWwuaCIKICNpbmNsdWRlIDxFWFRFUk4uaD4KQEAgLTM1OSw4ICszNjAsOCBAQAogCWlmICghdGVzdF9hbmRfc2V0X2JpdChldmVudC0+aWQsIGV2ZW50c19kZWZpbmVkKSkKIAkJZGVmaW5lX2V2ZW50X3N5bWJvbHMoZXZlbnQsIGhhbmRsZXIsIGV2ZW50LT5wcmludF9mbXQuYXJncyk7CiAKLQlzID0gbnNlY3MgLyBOU0VDU19QRVJfU0VDOwotCW5zID0gbnNlY3MgLSBzICogTlNFQ1NfUEVSX1NFQzsKKwlzID0gbnNlY3MgLyBOU0VDX1BFUl9TRUM7CisJbnMgPSBuc2VjcyAtIHMgKiBOU0VDX1BFUl9TRUM7CiAKIAlzY3JpcHRpbmdfY29udGV4dC0+ZXZlbnRfZGF0YSA9IGRhdGE7CiAJc2NyaXB0aW5nX2NvbnRleHQtPnBldmVudCA9IGV2c2VsLT50cF9mb3JtYXQtPnBldmVudDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1weXRob24uYyBiL3Rvb2xzL3BlcmYvdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1weXRob24uYwppbmRleCBlMDIwM2I5Li4wODk0MzhkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc2NyaXB0aW5nLWVuZ2luZXMvdHJhY2UtZXZlbnQtcHl0aG9uLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXB5dGhvbi5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAKICNpbmNsdWRlICIuLi8uLi9wZXJmLmgiCiAjaW5jbHVkZSAiLi4vZGVidWcuaCIKQEAgLTQyNiw4ICs0MjcsOCBAQAogCQlpZiAoIWRpY3QpCiAJCQlQeV9GYXRhbEVycm9yKCJjb3VsZG4ndCBjcmVhdGUgUHl0aG9uIGRpY3QiKTsKIAl9Ci0JcyA9IG5zZWNzIC8gTlNFQ1NfUEVSX1NFQzsKLQlucyA9IG5zZWNzIC0gcyAqIE5TRUNTX1BFUl9TRUM7CisJcyA9IG5zZWNzIC8gTlNFQ19QRVJfU0VDOworCW5zID0gbnNlY3MgLSBzICogTlNFQ19QRVJfU0VDOwogCiAJc2NyaXB0aW5nX2NvbnRleHQtPmV2ZW50X2RhdGEgPSBkYXRhOwogCXNjcmlwdGluZ19jb250ZXh0LT5wZXZlbnQgPSBldnNlbC0+dHBfZm9ybWF0LT5wZXZlbnQ7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc29ydC5jIGIvdG9vbHMvcGVyZi91dGlsL3NvcnQuYwppbmRleCAzZDNjYjgzLi40NTJlMTVhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc29ydC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmMKQEAgLTExLDcgKzExLDcgQEAKIHJlZ2V4X3QJCXBhcmVudF9yZWdleDsKIGNvbnN0IGNoYXIJZGVmYXVsdF9wYXJlbnRfcGF0dGVybltdID0gIl5zeXNffF5kb19wYWdlX2ZhdWx0IjsKIGNvbnN0IGNoYXIJKnBhcmVudF9wYXR0ZXJuID0gZGVmYXVsdF9wYXJlbnRfcGF0dGVybjsKLWNvbnN0IGNoYXIJZGVmYXVsdF9zb3J0X29yZGVyW10gPSAiY29tbSxkc28sc3ltYm9sIjsKK2NvbnN0IGNoYXIJKmRlZmF1bHRfc29ydF9vcmRlciA9ICJjb21tLGRzbyxzeW1ib2wiOwogY29uc3QgY2hhcglkZWZhdWx0X2JyYW5jaF9zb3J0X29yZGVyW10gPSAiY29tbSxkc29fZnJvbSxzeW1ib2xfZnJvbSxzeW1ib2xfdG8sY3ljbGVzIjsKIGNvbnN0IGNoYXIJZGVmYXVsdF9tZW1fc29ydF9vcmRlcltdID0gImxvY2FsX3dlaWdodCxtZW0sc3ltLGRzbyxzeW1ib2xfZGFkZHIsZHNvX2RhZGRyLHNub29wLHRsYixsb2NrZWQiOwogY29uc3QgY2hhcglkZWZhdWx0X3RvcF9zb3J0X29yZGVyW10gPSAiZHNvLHN5bWJvbCI7CkBAIC04NjcsNyArODY3LDcgQEAKIH07CiAKIC8qIC0tc29ydCBkYWRkcl9zeW0gKi8KLXN0YXRpYyBpbnQ2NF90CitpbnQ2NF90CiBzb3J0X19kYWRkcl9jbXAoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCkKIHsKIAl1aW50NjRfdCBsID0gMCwgciA9IDA7CkBAIC04OTYsNyArODk2LDcgQEAKIAkJCQkJIHdpZHRoKTsKIH0KIAotc3RhdGljIGludDY0X3QKK2ludDY0X3QKIHNvcnRfX2lhZGRyX2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KQogewogCXVpbnQ2NF90IGwgPSAwLCByID0gMDsKQEAgLTEwNjIsNyArMTA2Miw3IEBACiAJcmV0dXJuIHJlcHNlcF9zbnByaW50ZihiZiwgc2l6ZSwgIiUtKnMiLCB3aWR0aCwgb3V0KTsKIH0KIAotc3RhdGljIGludDY0X3QKK2ludDY0X3QKIHNvcnRfX2RjYWNoZWxpbmVfY21wKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpCiB7CiAJdTY0IGwsIHI7CkBAIC0xNDkyLDcgKzE0OTIsOCBAQAogfQogCiBzdGF0aWMgaW50IF9fc29ydF9faHBwX2hlYWRlcihzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsIHN0cnVjdCBwZXJmX2hwcCAqaHBwLAotCQkJICAgICAgc3RydWN0IGhpc3RzICpoaXN0cykKKwkJCSAgICAgIHN0cnVjdCBoaXN0cyAqaGlzdHMsIGludCBsaW5lIF9fbWF5YmVfdW51c2VkLAorCQkJICAgICAgaW50ICpzcGFuIF9fbWF5YmVfdW51c2VkKQogewogCXN0cnVjdCBocHBfc29ydF9lbnRyeSAqaHNlOwogCXNpemVfdCBsZW4gPSBmbXQtPnVzZXJfbGVuOwpAQCAtMTc5Nyw3ICsxNzk4LDkgQEAKIH0KIAogc3RhdGljIGludCBfX3NvcnRfX2hkZV9oZWFkZXIoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKLQkJCSAgICAgIHN0cnVjdCBoaXN0cyAqaGlzdHMgX19tYXliZV91bnVzZWQpCisJCQkgICAgICBzdHJ1Y3QgaGlzdHMgKmhpc3RzIF9fbWF5YmVfdW51c2VkLAorCQkJICAgICAgaW50IGxpbmUgX19tYXliZV91bnVzZWQsCisJCQkgICAgICBpbnQgKnNwYW4gX19tYXliZV91bnVzZWQpCiB7CiAJc3RydWN0IGhwcF9keW5hbWljX2VudHJ5ICpoZGU7CiAJc2l6ZV90IGxlbiA9IGZtdC0+dXNlcl9sZW47CkBAIC0yMzA1LDkgKzIzMDgsOSBAQAogCXJldHVybiBfX2hwcF9kaW1lbnNpb25fX2FkZF9vdXRwdXQoJnBlcmZfaHBwX2xpc3QsICZocHBfc29ydF9kaW1lbnNpb25zW2NvbF0pOwogfQogCi1zdGF0aWMgaW50IHNvcnRfZGltZW5zaW9uX19hZGQoc3RydWN0IHBlcmZfaHBwX2xpc3QgKmxpc3QsIGNvbnN0IGNoYXIgKnRvaywKLQkJCSAgICAgICBzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwKLQkJCSAgICAgICBpbnQgbGV2ZWwpCitpbnQgc29ydF9kaW1lbnNpb25fX2FkZChzdHJ1Y3QgcGVyZl9ocHBfbGlzdCAqbGlzdCwgY29uc3QgY2hhciAqdG9rLAorCQkJc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCisJCQlpbnQgbGV2ZWwpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKQEAgLTI2ODIsNyArMjY4NSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IG91dHB1dF9maWVsZF9hZGQoc3RydWN0IHBlcmZfaHBwX2xpc3QgKmxpc3QsIGNoYXIgKnRvaykKK2ludCBvdXRwdXRfZmllbGRfYWRkKHN0cnVjdCBwZXJmX2hwcF9saXN0ICpsaXN0LCBjaGFyICp0b2spCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKQEAgLTI3NDUsNyArMjc0OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgcmVzZXRfZGltZW5zaW9ucyh2b2lkKQordm9pZCByZXNldF9kaW1lbnNpb25zKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmggYi90b29scy9wZXJmL3V0aWwvc29ydC5oCmluZGV4IDdjYTM3ZWEuLjA5OWM5NzUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3NvcnQuaApAQCAtMjgsNyArMjgsNyBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKmZpZWxkX29yZGVyOwogZXh0ZXJuIGNvbnN0IGNoYXIgZGVmYXVsdF9wYXJlbnRfcGF0dGVybltdOwogZXh0ZXJuIGNvbnN0IGNoYXIgKnBhcmVudF9wYXR0ZXJuOwotZXh0ZXJuIGNvbnN0IGNoYXIgZGVmYXVsdF9zb3J0X29yZGVyW107CitleHRlcm4gY29uc3QgY2hhciAqZGVmYXVsdF9zb3J0X29yZGVyOwogZXh0ZXJuIHJlZ2V4X3QgaWdub3JlX2NhbGxlZXNfcmVnZXg7CiBleHRlcm4gaW50IGhhdmVfaWdub3JlX2NhbGxlZXM7CiBleHRlcm4gZW51bSBzb3J0X21vZGUgc29ydF9fbW9kZTsKQEAgLTQwLDYgKzQwLDcgQEAKIGV4dGVybiBzdHJ1Y3Qgc29ydF9lbnRyeSBzb3J0X2Rzb190bzsKIGV4dGVybiBzdHJ1Y3Qgc29ydF9lbnRyeSBzb3J0X3N5bV9mcm9tOwogZXh0ZXJuIHN0cnVjdCBzb3J0X2VudHJ5IHNvcnRfc3ltX3RvOworZXh0ZXJuIHN0cnVjdCBzb3J0X2VudHJ5IHNvcnRfc3JjbGluZTsKIGV4dGVybiBlbnVtIHNvcnRfdHlwZSBzb3J0X19maXJzdF9kaW1lbnNpb247CiBleHRlcm4gY29uc3QgY2hhciBkZWZhdWx0X21lbV9zb3J0X29yZGVyW107CiAKQEAgLTI2OCw0ICsyNjksMTUgQEAKIGJvb2wgaXNfc3RyaWN0X29yZGVyKGNvbnN0IGNoYXIgKm9yZGVyKTsKIAogaW50IGhwcF9kaW1lbnNpb25fX2FkZF9vdXRwdXQodW5zaWduZWQgY29sKTsKK3ZvaWQgcmVzZXRfZGltZW5zaW9ucyh2b2lkKTsKK2ludCBzb3J0X2RpbWVuc2lvbl9fYWRkKHN0cnVjdCBwZXJmX2hwcF9saXN0ICpsaXN0LCBjb25zdCBjaGFyICp0b2ssCisJCQlzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwKKwkJCWludCBsZXZlbCk7CitpbnQgb3V0cHV0X2ZpZWxkX2FkZChzdHJ1Y3QgcGVyZl9ocHBfbGlzdCAqbGlzdCwgY2hhciAqdG9rKTsKK2ludDY0X3QKK3NvcnRfX2lhZGRyX2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KTsKK2ludDY0X3QKK3NvcnRfX2RhZGRyX2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KTsKK2ludDY0X3QKK3NvcnRfX2RjYWNoZWxpbmVfY21wKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpOwogI2VuZGlmCS8qIF9fUEVSRl9TT1JUX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zdmdoZWxwZXIuYyBiL3Rvb2xzL3BlcmYvdXRpbC9zdmdoZWxwZXIuYwppbmRleCBlZWM2YzExLi4xY2JhZGEyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc3ZnaGVscGVyLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N2Z2hlbHBlci5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAKICNpbmNsdWRlICJwZXJmLmgiCiAjaW5jbHVkZSAic3ZnaGVscGVyLmgiCkBAIC0yNzQsMTQgKzI3NSwxNCBAQAogCiAJdGV4dFswXSA9IDA7CiAKLQlpZiAoZHVyYXRpb24gPCAxMDAwKSAvKiBsZXNzIHRoYW4gMSB1c2VjICovCisJaWYgKGR1cmF0aW9uIDwgTlNFQ19QRVJfVVNFQykgLyogbGVzcyB0aGFuIDEgdXNlYyAqLwogCQlyZXR1cm4gdGV4dDsKIAotCWlmIChkdXJhdGlvbiA8IDEwMDAgKiAxMDAwKSB7IC8qIGxlc3MgdGhhbiAxIG1zZWMgKi8KLQkJc3ByaW50Zih0ZXh0LCAiJS4xZiB1cyIsIGR1cmF0aW9uIC8gMTAwMC4wKTsKKwlpZiAoZHVyYXRpb24gPCBOU0VDX1BFUl9NU0VDKSB7IC8qIGxlc3MgdGhhbiAxIG1zZWMgKi8KKwkJc3ByaW50Zih0ZXh0LCAiJS4xZiB1cyIsIGR1cmF0aW9uIC8gKGRvdWJsZSlOU0VDX1BFUl9VU0VDKTsKIAkJcmV0dXJuIHRleHQ7CiAJfQotCXNwcmludGYodGV4dCwgIiUuMWYgbXMiLCBkdXJhdGlvbiAvIDEwMDAuMCAvIDEwMDApOworCXNwcmludGYodGV4dCwgIiUuMWYgbXMiLCBkdXJhdGlvbiAvIChkb3VibGUpTlNFQ19QRVJfTVNFQyk7CiAKIAlyZXR1cm4gdGV4dDsKIH0KQEAgLTI5Nyw3ICsyOTgsNyBAQAogCiAJc3R5bGUgPSAid2FpdGluZyI7CiAKLQlpZiAoZW5kLXN0YXJ0ID4gMTAgKiAxMDAwMDAwKSAvKiAxMCBtc2VjICovCisJaWYgKGVuZC1zdGFydCA+IDEwICogTlNFQ19QRVJfTVNFQykgLyogMTAgbXNlYyAqLwogCQlzdHlsZSA9ICJXQUlUSU5HIjsKIAogCXRleHQgPSB0aW1lX3RvX3N0cmluZyhlbmQtc3RhcnQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1lbGYuYyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wtZWxmLmMKaW5kZXggYTM0MzIxZS4uOTk0MDBiMCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1lbGYuYworKysgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLWVsZi5jCkBAIC0yMDYsNiArMjA2LDM3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBib29sIHdhbnRfZGVtYW5nbGUoYm9vbCBpc19rZXJuZWxfc3ltKQoreworCXJldHVybiBpc19rZXJuZWxfc3ltID8gc3ltYm9sX2NvbmYuZGVtYW5nbGVfa2VybmVsIDogc3ltYm9sX2NvbmYuZGVtYW5nbGU7Cit9CisKK3N0YXRpYyBjaGFyICpkZW1hbmdsZV9zeW0oc3RydWN0IGRzbyAqZHNvLCBpbnQga21vZHVsZSwgY29uc3QgY2hhciAqZWxmX25hbWUpCit7CisJaW50IGRlbWFuZ2xlX2ZsYWdzID0gdmVyYm9zZSA/IChETUdMX1BBUkFNUyB8IERNR0xfQU5TSSkgOiBETUdMX05PX09QVFM7CisJY2hhciAqZGVtYW5nbGVkID0gTlVMTDsKKworCS8qCisJICogV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQgZnJvbSBDKysgc291cmNlcworCSAqIERXQVJGIERXX2NvbXBpbGVfdW5pdCBoYXMgdGhpcywgYnV0IHdlIGRvbid0IGFsd2F5cyBoYXZlIGFjY2VzcworCSAqIHRvIGl0Li4uCisJICovCisJaWYgKCF3YW50X2RlbWFuZ2xlKGRzby0+a2VybmVsIHx8IGttb2R1bGUpKQorCSAgICByZXR1cm4gZGVtYW5nbGVkOworCisJZGVtYW5nbGVkID0gYmZkX2RlbWFuZ2xlKE5VTEwsIGVsZl9uYW1lLCBkZW1hbmdsZV9mbGFncyk7CisJaWYgKGRlbWFuZ2xlZCA9PSBOVUxMKQorCQlkZW1hbmdsZWQgPSBqYXZhX2RlbWFuZ2xlX3N5bShlbGZfbmFtZSwgSkFWQV9ERU1BTkdMRV9OT1JFVCk7CisJZWxzZSBpZiAocnVzdF9pc19tYW5nbGVkKGRlbWFuZ2xlZCkpCisJCS8qCisJCSAgICAqIElucHV0IHRvIFJ1c3QgZGVtYW5nbGluZyBpcyB0aGUgQkZELWRlbWFuZ2xlZAorCQkgICAgKiBuYW1lIHdoaWNoIGl0IFJ1c3QtZGVtYW5nbGVzIGluIHBsYWNlLgorCQkgICAgKi8KKwkJcnVzdF9kZW1hbmdsZV9zeW0oZGVtYW5nbGVkKTsKKworCXJldHVybiBkZW1hbmdsZWQ7Cit9CisKICNkZWZpbmUgZWxmX3NlY3Rpb25fX2Zvcl9lYWNoX3JlbChyZWxkYXRhLCBwb3MsIHBvc19tZW0sIGlkeCwgbnJfZW50cmllcykgXAogCWZvciAoaWR4ID0gMCwgcG9zID0gZ2VsZl9nZXRyZWwocmVsZGF0YSwgMCwgJnBvc19tZW0pOyBcCiAJICAgICBpZHggPCBucl9lbnRyaWVzOyBcCkBAIC0yMjMsOCArMjU0LDcgQEAKICAqIEFuZCBhbHdheXMgbG9vayBhdCB0aGUgb3JpZ2luYWwgZHNvLCBub3QgYXQgZGVidWdpbmZvIHBhY2thZ2VzLCB0aGF0CiAgKiBoYXZlIHRoZSBQTFQgZGF0YSBzdHJpcHBlZCBvdXQgKHNoZHJfcmVsX3BsdC5zaF90eXBlID09IFNIVF9OT0JJVFMpLgogICovCi1pbnQgZHNvX19zeW50aGVzaXplX3BsdF9zeW1ib2xzKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IHN5bXNyYyAqc3MsIHN0cnVjdCBtYXAgKm1hcCwKLQkJCQlzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQoraW50IGRzb19fc3ludGhlc2l6ZV9wbHRfc3ltYm9scyhzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBzeW1zcmMgKnNzLCBzdHJ1Y3QgbWFwICptYXApCiB7CiAJdWludDMyX3QgbnJfcmVsX2VudHJpZXMsIGlkeDsKIAlHRWxmX1N5bSBzeW07CkBAIC0zMDEsNDUgKzMzMSw1MyBAQAogCiAJCWVsZl9zZWN0aW9uX19mb3JfZWFjaF9yZWxhKHJlbGRhdGEsIHBvcywgcG9zX21lbSwgaWR4LAogCQkJCQkgICBucl9yZWxfZW50cmllcykgeworCQkJY29uc3QgY2hhciAqZWxmX25hbWUgPSBOVUxMOworCQkJY2hhciAqZGVtYW5nbGVkID0gTlVMTDsKIAkJCXN5bWlkeCA9IEdFTEZfUl9TWU0ocG9zLT5yX2luZm8pOwogCQkJcGx0X29mZnNldCArPSBzaGRyX3BsdC5zaF9lbnRzaXplOwogCQkJZ2VsZl9nZXRzeW0oc3ltcywgc3ltaWR4LCAmc3ltKTsKKworCQkJZWxmX25hbWUgPSBlbGZfc3ltX19uYW1lKCZzeW0sIHN5bXN0cnMpOworCQkJZGVtYW5nbGVkID0gZGVtYW5nbGVfc3ltKGRzbywgMCwgZWxmX25hbWUpOworCQkJaWYgKGRlbWFuZ2xlZCAhPSBOVUxMKQorCQkJCWVsZl9uYW1lID0gZGVtYW5nbGVkOwogCQkJc25wcmludGYoc3ltcGx0bmFtZSwgc2l6ZW9mKHN5bXBsdG5hbWUpLAotCQkJCSAiJXNAcGx0IiwgZWxmX3N5bV9fbmFtZSgmc3ltLCBzeW1zdHJzKSk7CisJCQkJICIlc0BwbHQiLCBlbGZfbmFtZSk7CisJCQlmcmVlKGRlbWFuZ2xlZCk7CiAKIAkJCWYgPSBzeW1ib2xfX25ldyhwbHRfb2Zmc2V0LCBzaGRyX3BsdC5zaF9lbnRzaXplLAogCQkJCQlTVEJfR0xPQkFMLCBzeW1wbHRuYW1lKTsKIAkJCWlmICghZikKIAkJCQlnb3RvIG91dF9lbGZfZW5kOwogCi0JCQlpZiAoZmlsdGVyICYmIGZpbHRlcihtYXAsIGYpKQotCQkJCXN5bWJvbF9fZGVsZXRlKGYpOwotCQkJZWxzZSB7Ci0JCQkJc3ltYm9sc19faW5zZXJ0KCZkc28tPnN5bWJvbHNbbWFwLT50eXBlXSwgZik7Ci0JCQkJKytucjsKLQkJCX0KKwkJCXN5bWJvbHNfX2luc2VydCgmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV0sIGYpOworCQkJKytucjsKIAkJfQogCX0gZWxzZSBpZiAoc2hkcl9yZWxfcGx0LnNoX3R5cGUgPT0gU0hUX1JFTCkgewogCQlHRWxmX1JlbCBwb3NfbWVtLCAqcG9zOwogCQllbGZfc2VjdGlvbl9fZm9yX2VhY2hfcmVsKHJlbGRhdGEsIHBvcywgcG9zX21lbSwgaWR4LAogCQkJCQkgIG5yX3JlbF9lbnRyaWVzKSB7CisJCQljb25zdCBjaGFyICplbGZfbmFtZSA9IE5VTEw7CisJCQljaGFyICpkZW1hbmdsZWQgPSBOVUxMOwogCQkJc3ltaWR4ID0gR0VMRl9SX1NZTShwb3MtPnJfaW5mbyk7CiAJCQlwbHRfb2Zmc2V0ICs9IHNoZHJfcGx0LnNoX2VudHNpemU7CiAJCQlnZWxmX2dldHN5bShzeW1zLCBzeW1pZHgsICZzeW0pOworCisJCQllbGZfbmFtZSA9IGVsZl9zeW1fX25hbWUoJnN5bSwgc3ltc3Rycyk7CisJCQlkZW1hbmdsZWQgPSBkZW1hbmdsZV9zeW0oZHNvLCAwLCBlbGZfbmFtZSk7CisJCQlpZiAoZGVtYW5nbGVkICE9IE5VTEwpCisJCQkJZWxmX25hbWUgPSBkZW1hbmdsZWQ7CiAJCQlzbnByaW50ZihzeW1wbHRuYW1lLCBzaXplb2Yoc3ltcGx0bmFtZSksCi0JCQkJICIlc0BwbHQiLCBlbGZfc3ltX19uYW1lKCZzeW0sIHN5bXN0cnMpKTsKKwkJCQkgIiVzQHBsdCIsIGVsZl9uYW1lKTsKKwkJCWZyZWUoZGVtYW5nbGVkKTsKIAogCQkJZiA9IHN5bWJvbF9fbmV3KHBsdF9vZmZzZXQsIHNoZHJfcGx0LnNoX2VudHNpemUsCiAJCQkJCVNUQl9HTE9CQUwsIHN5bXBsdG5hbWUpOwogCQkJaWYgKCFmKQogCQkJCWdvdG8gb3V0X2VsZl9lbmQ7CiAKLQkJCWlmIChmaWx0ZXIgJiYgZmlsdGVyKG1hcCwgZikpCi0JCQkJc3ltYm9sX19kZWxldGUoZik7Ci0JCQllbHNlIHsKLQkJCQlzeW1ib2xzX19pbnNlcnQoJmRzby0+c3ltYm9sc1ttYXAtPnR5cGVdLCBmKTsKLQkJCQkrK25yOwotCQkJfQorCQkJc3ltYm9sc19faW5zZXJ0KCZkc28tPnN5bWJvbHNbbWFwLT50eXBlXSwgZik7CisJCQkrK25yOwogCQl9CiAJfQogCkBAIC02ODUsNyArNzIzLDcgQEAKIAl9CiAKIAkvKiBBbHdheXMgcmVqZWN0IGltYWdlcyB3aXRoIGEgbWlzbWF0Y2hlZCBidWlsZC1pZDogKi8KLQlpZiAoZHNvLT5oYXNfYnVpbGRfaWQpIHsKKwlpZiAoZHNvLT5oYXNfYnVpbGRfaWQgJiYgIXN5bWJvbF9jb25mLmlnbm9yZV92bWxpbnV4X2J1aWxkaWQpIHsKIAkJdTggYnVpbGRfaWRbQlVJTERfSURfU0laRV07CiAKIAkJaWYgKGVsZl9yZWFkX2J1aWxkX2lkKGVsZiwgYnVpbGRfaWQsIEJVSUxEX0lEX1NJWkUpIDwgMCkgewpAQCAtNzc1LDE3ICs4MTMsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGJvb2wgd2FudF9kZW1hbmdsZShib29sIGlzX2tlcm5lbF9zeW0pCi17Ci0JcmV0dXJuIGlzX2tlcm5lbF9zeW0gPyBzeW1ib2xfY29uZi5kZW1hbmdsZV9rZXJuZWwgOiBzeW1ib2xfY29uZi5kZW1hbmdsZTsKLX0KLQogdm9pZCBfX3dlYWsgYXJjaF9fc3ltX3VwZGF0ZShzdHJ1Y3Qgc3ltYm9sICpzIF9fbWF5YmVfdW51c2VkLAogCQlHRWxmX1N5bSAqc3ltIF9fbWF5YmVfdW51c2VkKSB7IH0KIAotaW50IGRzb19fbG9hZF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCi0JCSAgc3RydWN0IHN5bXNyYyAqc3ltc19zcywgc3RydWN0IHN5bXNyYyAqcnVudGltZV9zcywKLQkJICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyLCBpbnQga21vZHVsZSkKK2ludCBkc29fX2xvYWRfc3ltKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLCBzdHJ1Y3Qgc3ltc3JjICpzeW1zX3NzLAorCQkgIHN0cnVjdCBzeW1zcmMgKnJ1bnRpbWVfc3MsIGludCBrbW9kdWxlKQogewogCXN0cnVjdCBrbWFwICprbWFwID0gZHNvLT5rZXJuZWwgPyBtYXBfX2ttYXAobWFwKSA6IE5VTEw7CiAJc3RydWN0IG1hcF9ncm91cHMgKmttYXBzID0ga21hcCA/IG1hcF9fa21hcHMobWFwKSA6IE5VTEw7CkBAIC04MzcsNyArODY5LDggQEAKIAlzZWMgPSBzeW1zX3NzLT5zeW10YWI7CiAJc2hkciA9IHN5bXNfc3MtPnN5bXNoZHI7CiAKLQlpZiAoZWxmX3NlY3Rpb25fYnlfbmFtZShlbGYsICZlaGRyLCAmdHNoZHIsICIudGV4dCIsIE5VTEwpKQorCWlmIChlbGZfc2VjdGlvbl9ieV9uYW1lKHJ1bnRpbWVfc3MtPmVsZiwgJnJ1bnRpbWVfc3MtPmVoZHIsICZ0c2hkciwKKwkJCQkiLnRleHQiLCBOVUxMKSkKIAkJZHNvLT50ZXh0X29mZnNldCA9IHRzaGRyLnNoX2FkZHIgLSB0c2hkci5zaF9vZmZzZXQ7CiAKIAlpZiAocnVudGltZV9zcy0+b3Bkc2VjKQpAQCAtMTA2OSwyOSArMTEwMiwxMCBAQAogCQkJc3ltLnN0X3ZhbHVlIC09IHNoZHIuc2hfYWRkciAtIHNoZHIuc2hfb2Zmc2V0OwogCQl9CiBuZXdfc3ltYm9sOgotCQkvKgotCQkgKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIG9iamVjdCB3YXMgY3JlYXRlZCBmcm9tIEMrKyBzb3VyY2VzCi0JCSAqIERXQVJGIERXX2NvbXBpbGVfdW5pdCBoYXMgdGhpcywgYnV0IHdlIGRvbid0IGFsd2F5cyBoYXZlIGFjY2VzcwotCQkgKiB0byBpdC4uLgotCQkgKi8KLQkJaWYgKHdhbnRfZGVtYW5nbGUoZHNvLT5rZXJuZWwgfHwga21vZHVsZSkpIHsKLQkJCWludCBkZW1hbmdsZV9mbGFncyA9IERNR0xfTk9fT1BUUzsKLQkJCWlmICh2ZXJib3NlKQotCQkJCWRlbWFuZ2xlX2ZsYWdzID0gRE1HTF9QQVJBTVMgfCBETUdMX0FOU0k7CisJCWRlbWFuZ2xlZCA9IGRlbWFuZ2xlX3N5bShkc28sIGttb2R1bGUsIGVsZl9uYW1lKTsKKwkJaWYgKGRlbWFuZ2xlZCAhPSBOVUxMKQorCQkJZWxmX25hbWUgPSBkZW1hbmdsZWQ7CiAKLQkJCWRlbWFuZ2xlZCA9IGJmZF9kZW1hbmdsZShOVUxMLCBlbGZfbmFtZSwgZGVtYW5nbGVfZmxhZ3MpOwotCQkJaWYgKGRlbWFuZ2xlZCA9PSBOVUxMKQotCQkJCWRlbWFuZ2xlZCA9IGphdmFfZGVtYW5nbGVfc3ltKGVsZl9uYW1lLCBKQVZBX0RFTUFOR0xFX05PUkVUKTsKLQkJCWVsc2UgaWYgKHJ1c3RfaXNfbWFuZ2xlZChkZW1hbmdsZWQpKQotCQkJCS8qCi0JCQkJICogSW5wdXQgdG8gUnVzdCBkZW1hbmdsaW5nIGlzIHRoZSBCRkQtZGVtYW5nbGVkCi0JCQkJICogbmFtZSB3aGljaCBpdCBSdXN0LWRlbWFuZ2xlcyBpbiBwbGFjZS4KLQkJCQkgKi8KLQkJCQlydXN0X2RlbWFuZ2xlX3N5bShkZW1hbmdsZWQpOwotCi0JCQlpZiAoZGVtYW5nbGVkICE9IE5VTEwpCi0JCQkJZWxmX25hbWUgPSBkZW1hbmdsZWQ7Ci0JCX0KIAkJZiA9IHN5bWJvbF9fbmV3KHN5bS5zdF92YWx1ZSwgc3ltLnN0X3NpemUsCiAJCQkJR0VMRl9TVF9CSU5EKHN5bS5zdF9pbmZvKSwgZWxmX25hbWUpOwogCQlmcmVlKGRlbWFuZ2xlZCk7CkBAIC0xMTAwLDIxICsxMTE0LDE2IEBACiAKIAkJYXJjaF9fc3ltX3VwZGF0ZShmLCAmc3ltKTsKIAotCQlpZiAoZmlsdGVyICYmIGZpbHRlcihjdXJyX21hcCwgZikpCi0JCQlzeW1ib2xfX2RlbGV0ZShmKTsKLQkJZWxzZSB7Ci0JCQlzeW1ib2xzX19pbnNlcnQoJmN1cnJfZHNvLT5zeW1ib2xzW2N1cnJfbWFwLT50eXBlXSwgZik7Ci0JCQlucisrOwotCQl9CisJCV9fc3ltYm9sc19faW5zZXJ0KCZjdXJyX2Rzby0+c3ltYm9sc1tjdXJyX21hcC0+dHlwZV0sIGYsIGRzby0+a2VybmVsKTsKKwkJbnIrKzsKIAl9CiAKIAkvKgogCSAqIEZvciBtaXNhbm5vdGF0ZWQsIHplcm9lZCwgQVNNIGZ1bmN0aW9uIHNpemVzLgogCSAqLwogCWlmIChuciA+IDApIHsKLQkJaWYgKCFzeW1ib2xfY29uZi5hbGxvd19hbGlhc2VzKQotCQkJc3ltYm9sc19fZml4dXBfZHVwbGljYXRlKCZkc28tPnN5bWJvbHNbbWFwLT50eXBlXSk7CiAJCXN5bWJvbHNfX2ZpeHVwX2VuZCgmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV0pOworCQlzeW1ib2xzX19maXh1cF9kdXBsaWNhdGUoJmRzby0+c3ltYm9sc1ttYXAtPnR5cGVdKTsKIAkJaWYgKGttYXApIHsKIAkJCS8qCiAJCQkgKiBXZSBuZWVkIHRvIGZpeHVwIHRoaXMgaGVyZSB0b28gYmVjYXVzZSB3ZSBjcmVhdGUgbmV3CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLW1pbmltYWwuYyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wtbWluaW1hbC5jCmluZGV4IDQ4OTA2MzMuLjExY2RkZTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wtbWluaW1hbC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wtbWluaW1hbC5jCkBAIC0yODcsOCArMjg3LDcgQEAKIAogaW50IGRzb19fc3ludGhlc2l6ZV9wbHRfc3ltYm9scyhzdHJ1Y3QgZHNvICpkc28gX19tYXliZV91bnVzZWQsCiAJCQkJc3RydWN0IHN5bXNyYyAqc3MgX19tYXliZV91bnVzZWQsCi0JCQkJc3RydWN0IG1hcCAqbWFwIF9fbWF5YmVfdW51c2VkLAotCQkJCXN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIgX19tYXliZV91bnVzZWQpCisJCQkJc3RydWN0IG1hcCAqbWFwIF9fbWF5YmVfdW51c2VkKQogewogCXJldHVybiAwOwogfQpAQCAtMzM0LDcgKzMzMyw2IEBACiBpbnQgZHNvX19sb2FkX3N5bShzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYXAgKm1hcCBfX21heWJlX3VudXNlZCwKIAkJICBzdHJ1Y3Qgc3ltc3JjICpzcywKIAkJICBzdHJ1Y3Qgc3ltc3JjICpydW50aW1lX3NzIF9fbWF5YmVfdW51c2VkLAotCQkgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIgX19tYXliZV91bnVzZWQsCiAJCSAgaW50IGttb2R1bGUgX19tYXliZV91bnVzZWQpCiB7CiAJdW5zaWduZWQgY2hhciBidWlsZF9pZFtCVUlMRF9JRF9TSVpFXTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYwppbmRleCAzN2U4ZDIwLi5hZWNmZjY5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlICJhbm5vdGF0ZS5oIgogI2luY2x1ZGUgImJ1aWxkLWlkLmgiCiAjaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCkBAIC0yMywxMCArMjQsMTAgQEAKICNpbmNsdWRlIDxzeW1ib2wva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgogCi1zdGF0aWMgaW50IGRzb19fbG9hZF9rZXJuZWxfc3ltKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAotCQkJCXN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOwotc3RhdGljIGludCBkc29fX2xvYWRfZ3Vlc3Rfa2VybmVsX3N5bShzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYXAgKm1hcCwKLQkJCXN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOworc3RhdGljIGludCBkc29fX2xvYWRfa2VybmVsX3N5bShzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYXAgKm1hcCk7CitzdGF0aWMgaW50IGRzb19fbG9hZF9ndWVzdF9rZXJuZWxfc3ltKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwKTsKK3N0YXRpYyBib29sIHN5bWJvbF9faXNfaWRsZShjb25zdCBjaGFyICpuYW1lKTsKKwogaW50IHZtbGludXhfcGF0aF9fbnJfZW50cmllczsKIGNoYXIgKip2bWxpbnV4X3BhdGg7CiAKQEAgLTE1Miw2ICsxNTMsOSBAQAogCXN0cnVjdCByYl9ub2RlICpuZDsKIAlzdHJ1Y3Qgc3ltYm9sICpjdXJyLCAqbmV4dDsKIAorCWlmIChzeW1ib2xfY29uZi5hbGxvd19hbGlhc2VzKQorCQlyZXR1cm47CisKIAluZCA9IHJiX2ZpcnN0KHN5bWJvbHMpOwogCiAJd2hpbGUgKG5kKSB7CkBAIC0yMzUsOCArMjM5LDEzIEBACiAJaWYgKHN5bSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChzeW1ib2xfY29uZi5wcml2X3NpemUpCisJaWYgKHN5bWJvbF9jb25mLnByaXZfc2l6ZSkgeworCQlpZiAoc3ltYm9sX2NvbmYuaW5pdF9hbm5vdGF0aW9uKSB7CisJCQlzdHJ1Y3QgYW5ub3RhdGlvbiAqbm90ZXMgPSAodm9pZCAqKXN5bTsKKwkJCXB0aHJlYWRfbXV0ZXhfaW5pdCgmbm90ZXMtPmxvY2ssIE5VTEwpOworCQl9CiAJCXN5bSA9ICgodm9pZCAqKXN5bSkgKyBzeW1ib2xfY29uZi5wcml2X3NpemU7CisJfQogCiAJc3ltLT5zdGFydCAgID0gc3RhcnQ7CiAJc3ltLT5lbmQgICAgID0gbGVuID8gc3RhcnQgKyBsZW4gOiBzdGFydDsKQEAgLTI2OCwxMyArMjc3LDI0IEBACiAJfQogfQogCi12b2lkIHN5bWJvbHNfX2luc2VydChzdHJ1Y3QgcmJfcm9vdCAqc3ltYm9scywgc3RydWN0IHN5bWJvbCAqc3ltKQordm9pZCBfX3N5bWJvbHNfX2luc2VydChzdHJ1Y3QgcmJfcm9vdCAqc3ltYm9scywgc3RydWN0IHN5bWJvbCAqc3ltLCBib29sIGtlcm5lbCkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmc3ltYm9scy0+cmJfbm9kZTsKIAlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKIAljb25zdCB1NjQgaXAgPSBzeW0tPnN0YXJ0OwogCXN0cnVjdCBzeW1ib2wgKnM7CiAKKwlpZiAoa2VybmVsKSB7CisJCWNvbnN0IGNoYXIgKm5hbWUgPSBzeW0tPm5hbWU7CisJCS8qCisJCSAqIHBwYzY0IHVzZXMgZnVuY3Rpb24gZGVzY3JpcHRvcnMgYW5kIGFwcGVuZHMgYSAnLicgdG8gdGhlCisJCSAqIHN0YXJ0IG9mIGV2ZXJ5IGluc3RydWN0aW9uIGFkZHJlc3MuIFJlbW92ZSBpdC4KKwkJICovCisJCWlmIChuYW1lWzBdID09ICcuJykKKwkJCW5hbWUrKzsKKwkJc3ltLT5pZGxlID0gc3ltYm9sX19pc19pZGxlKG5hbWUpOworCX0KKwogCXdoaWxlICgqcCAhPSBOVUxMKSB7CiAJCXBhcmVudCA9ICpwOwogCQlzID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3Qgc3ltYm9sLCByYl9ub2RlKTsKQEAgLTI4Nyw2ICszMDcsMTEgQEAKIAlyYl9pbnNlcnRfY29sb3IoJnN5bS0+cmJfbm9kZSwgc3ltYm9scyk7CiB9CiAKK3ZvaWQgc3ltYm9sc19faW5zZXJ0KHN0cnVjdCByYl9yb290ICpzeW1ib2xzLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJX19zeW1ib2xzX19pbnNlcnQoc3ltYm9scywgc3ltLCBmYWxzZSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpzeW1ib2xzX19maW5kKHN0cnVjdCByYl9yb290ICpzeW1ib2xzLCB1NjQgaXApCiB7CiAJc3RydWN0IHJiX25vZGUgKm47CkBAIC0zMjAsNiArMzQ1LDE2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpzeW1ib2xzX19sYXN0KHN0cnVjdCByYl9yb290ICpzeW1ib2xzKQoreworCXN0cnVjdCByYl9ub2RlICpuID0gcmJfbGFzdChzeW1ib2xzKTsKKworCWlmIChuKQorCQlyZXR1cm4gcmJfZW50cnkobiwgc3RydWN0IHN5bWJvbCwgcmJfbm9kZSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bWJvbHNfX25leHQoc3RydWN0IHN5bWJvbCAqc3ltKQogewogCXN0cnVjdCByYl9ub2RlICpuID0gcmJfbmV4dCgmc3ltLT5yYl9ub2RlKTsKQEAgLTQxNSw3ICs0NTAsNyBAQAogCiB2b2lkIGRzb19faW5zZXJ0X3N5bWJvbChzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqc3ltKQogewotCXN5bWJvbHNfX2luc2VydCgmZHNvLT5zeW1ib2xzW3R5cGVdLCBzeW0pOworCV9fc3ltYm9sc19faW5zZXJ0KCZkc28tPnN5bWJvbHNbdHlwZV0sIHN5bSwgZHNvLT5rZXJuZWwpOwogCiAJLyogdXBkYXRlIHRoZSBzeW1ib2wgY2FjaGUgaWYgbmVjZXNzYXJ5ICovCiAJaWYgKGRzby0+bGFzdF9maW5kX3Jlc3VsdFt0eXBlXS5hZGRyID49IHN5bS0+c3RhcnQgJiYKQEAgLTQ0MSw2ICs0NzYsMTEgQEAKIAlyZXR1cm4gc3ltYm9sc19fZmlyc3QoJmRzby0+c3ltYm9sc1t0eXBlXSk7CiB9CiAKK3N0cnVjdCBzeW1ib2wgKmRzb19fbGFzdF9zeW1ib2woc3RydWN0IGRzbyAqZHNvLCBlbnVtIG1hcF90eXBlIHR5cGUpCit7CisJcmV0dXJuIHN5bWJvbHNfX2xhc3QoJmRzby0+c3ltYm9sc1t0eXBlXSk7Cit9CisKIHN0cnVjdCBzeW1ib2wgKmRzb19fbmV4dF9zeW1ib2woc3RydWN0IHN5bWJvbCAqc3ltKQogewogCXJldHVybiBzeW1ib2xzX19uZXh0KHN5bSk7CkBAIC01MzcsNyArNTc3LDcgQEAKICAqIFRoZXNlIGFyZSBzeW1ib2xzIGluIHRoZSBrZXJuZWwgaW1hZ2UsIHNvIG1ha2Ugc3VyZSB0aGF0CiAgKiBzeW0gaXMgZnJvbSBhIGtlcm5lbCBEU08uCiAgKi8KLWJvb2wgc3ltYm9sX19pc19pZGxlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3N0YXRpYyBib29sIHN5bWJvbF9faXNfaWRsZShjb25zdCBjaGFyICpuYW1lKQogewogCWNvbnN0IGNoYXIgKiBjb25zdCBpZGxlX3N5bWJvbHNbXSA9IHsKIAkJImNwdV9pZGxlIiwKQEAgLTU1NCwxNCArNTk0LDEwIEBACiAJCSJwc2VyaWVzX2RlZGljYXRlZF9pZGxlX3NsZWVwIiwKIAkJTlVMTAogCX07Ci0KIAlpbnQgaTsKIAotCWlmICghc3ltKQotCQlyZXR1cm4gZmFsc2U7Ci0KIAlmb3IgKGkgPSAwOyBpZGxlX3N5bWJvbHNbaV07IGkrKykgewotCQlpZiAoIXN0cmNtcChpZGxlX3N5bWJvbHNbaV0sIHN5bS0+bmFtZSkpCisJCWlmICghc3RyY21wKGlkbGVfc3ltYm9sc1tpXSwgbmFtZSkpCiAJCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKQEAgLTU5MCw3ICs2MjYsNyBAQAogCSAqIFdlIHdpbGwgcGFzcyB0aGUgc3ltYm9scyB0byB0aGUgZmlsdGVyIGxhdGVyLCBpbgogCSAqIG1hcF9fc3BsaXRfa2FsbHN5bXMsIHdoZW4gd2UgaGF2ZSBzcGxpdCB0aGUgbWFwcyBwZXIgbW9kdWxlCiAJICovCi0Jc3ltYm9sc19faW5zZXJ0KHJvb3QsIHN5bSk7CisJX19zeW1ib2xzX19pbnNlcnQocm9vdCwgc3ltLCAhc3RyY2hyKG5hbWUsICdbJykpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MDcsOCArNjQzLDcgQEAKIAlyZXR1cm4ga2FsbHN5bXNfX3BhcnNlKGZpbGVuYW1lLCAmYXJncywgbWFwX19wcm9jZXNzX2thbGxzeW1fc3ltYm9sKTsKIH0KIAotc3RhdGljIGludCBkc29fX3NwbGl0X2thbGxzeW1zX2Zvcl9rY29yZShzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYXAgKm1hcCwKLQkJCQkJIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCitzdGF0aWMgaW50IGRzb19fc3BsaXRfa2FsbHN5bXNfZm9yX2tjb3JlKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwKQogewogCXN0cnVjdCBtYXBfZ3JvdXBzICprbWFwcyA9IG1hcF9fa21hcHMobWFwKTsKIAlzdHJ1Y3QgbWFwICpjdXJyX21hcDsKQEAgLTYzNyw3ICs2NzIsNyBAQAogCiAJCWN1cnJfbWFwID0gbWFwX2dyb3Vwc19fZmluZChrbWFwcywgbWFwLT50eXBlLCBwb3MtPnN0YXJ0KTsKIAotCQlpZiAoIWN1cnJfbWFwIHx8IChmaWx0ZXIgJiYgZmlsdGVyKGN1cnJfbWFwLCBwb3MpKSkgeworCQlpZiAoIWN1cnJfbWFwKSB7CiAJCQlzeW1ib2xfX2RlbGV0ZShwb3MpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTY2MCw4ICs2OTUsNyBAQAogICoga2VybmVsIHJhbmdlIGlzIGJyb2tlbiBpbiBzZXZlcmFsIG1hcHMsIG5hbWVkIFtrZXJuZWxdLk4sIGFzIHdlIGRvbid0IGhhdmUKICAqIHRoZSBvcmlnaW5hbCBFTEYgc2VjdGlvbiBuYW1lcyB2bWxpbnV4IGhhdmUuCiAgKi8KLXN0YXRpYyBpbnQgZHNvX19zcGxpdF9rYWxsc3ltcyhzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYXAgKm1hcCwgdTY0IGRlbHRhLAotCQkJICAgICAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCitzdGF0aWMgaW50IGRzb19fc3BsaXRfa2FsbHN5bXMoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsIHU2NCBkZWx0YSkKIHsKIAlzdHJ1Y3QgbWFwX2dyb3VwcyAqa21hcHMgPSBtYXBfX2ttYXBzKG1hcCk7CiAJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmU7CkBAIC03MzgsNyArNzcyLDcgQEAKIAogCQkJaWYgKGNvdW50ID09IDApIHsKIAkJCQljdXJyX21hcCA9IG1hcDsKLQkJCQlnb3RvIGZpbHRlcl9zeW1ib2w7CisJCQkJZ290byBhZGRfc3ltYm9sOwogCQkJfQogCiAJCQlpZiAoZHNvLT5rZXJuZWwgPT0gRFNPX1RZUEVfR1VFU1RfS0VSTkVMKQpAQCAtNzcwLDE4ICs4MDQsMTggQEAKIAkJCXBvcy0+c3RhcnQgLT0gZGVsdGE7CiAJCQlwb3MtPmVuZCAtPSBkZWx0YTsKIAkJfQotZmlsdGVyX3N5bWJvbDoKLQkJaWYgKGZpbHRlciAmJiBmaWx0ZXIoY3Vycl9tYXAsIHBvcykpIHsKLWRpc2NhcmRfc3ltYm9sOgkJcmJfZXJhc2UoJnBvcy0+cmJfbm9kZSwgcm9vdCk7Ci0JCQlzeW1ib2xfX2RlbGV0ZShwb3MpOwotCQl9IGVsc2UgewotCQkJaWYgKGN1cnJfbWFwICE9IG1hcCkgewotCQkJCXJiX2VyYXNlKCZwb3MtPnJiX25vZGUsIHJvb3QpOwotCQkJCXN5bWJvbHNfX2luc2VydCgmY3Vycl9tYXAtPmRzby0+c3ltYm9sc1tjdXJyX21hcC0+dHlwZV0sIHBvcyk7Ci0JCQkJKyttb3ZlZDsKLQkJCX0gZWxzZQotCQkJCSsrY291bnQ7Ci0JCX0KK2FkZF9zeW1ib2w6CisJCWlmIChjdXJyX21hcCAhPSBtYXApIHsKKwkJCXJiX2VyYXNlKCZwb3MtPnJiX25vZGUsIHJvb3QpOworCQkJc3ltYm9sc19faW5zZXJ0KCZjdXJyX21hcC0+ZHNvLT5zeW1ib2xzW2N1cnJfbWFwLT50eXBlXSwgcG9zKTsKKwkJCSsrbW92ZWQ7CisJCX0gZWxzZQorCQkJKytjb3VudDsKKworCQljb250aW51ZTsKK2Rpc2NhcmRfc3ltYm9sOgorCQlyYl9lcmFzZSgmcG9zLT5yYl9ub2RlLCByb290KTsKKwkJc3ltYm9sX19kZWxldGUocG9zKTsKIAl9CiAKIAlpZiAoY3Vycl9tYXAgIT0gbWFwICYmCkBAIC0xMjIxLDcgKzEyNTUsNyBAQAogfQogCiBpbnQgX19kc29fX2xvYWRfa2FsbHN5bXMoc3RydWN0IGRzbyAqZHNvLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKLQkJCSBzdHJ1Y3QgbWFwICptYXAsIGJvb2wgbm9fa2NvcmUsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCisJCQkgc3RydWN0IG1hcCAqbWFwLCBib29sIG5vX2tjb3JlKQogewogCXU2NCBkZWx0YSA9IDA7CiAKQEAgLTEyMzQsOCArMTI2OCw4IEBACiAJaWYgKGthbGxzeW1zX19kZWx0YShtYXAsIGZpbGVuYW1lLCAmZGVsdGEpKQogCQlyZXR1cm4gLTE7CiAKLQlzeW1ib2xzX19maXh1cF9kdXBsaWNhdGUoJmRzby0+c3ltYm9sc1ttYXAtPnR5cGVdKTsKIAlzeW1ib2xzX19maXh1cF9lbmQoJmRzby0+c3ltYm9sc1ttYXAtPnR5cGVdKTsKKwlzeW1ib2xzX19maXh1cF9kdXBsaWNhdGUoJmRzby0+c3ltYm9sc1ttYXAtPnR5cGVdKTsKIAogCWlmIChkc28tPmtlcm5lbCA9PSBEU09fVFlQRV9HVUVTVF9LRVJORUwpCiAJCWRzby0+c3ltdGFiX3R5cGUgPSBEU09fQklOQVJZX1RZUEVfX0dVRVNUX0tBTExTWU1TOwpAQCAtMTI0MywxOSArMTI3NywxOCBAQAogCQlkc28tPnN5bXRhYl90eXBlID0gRFNPX0JJTkFSWV9UWVBFX19LQUxMU1lNUzsKIAogCWlmICghbm9fa2NvcmUgJiYgIWRzb19fbG9hZF9rY29yZShkc28sIG1hcCwgZmlsZW5hbWUpKQotCQlyZXR1cm4gZHNvX19zcGxpdF9rYWxsc3ltc19mb3Jfa2NvcmUoZHNvLCBtYXAsIGZpbHRlcik7CisJCXJldHVybiBkc29fX3NwbGl0X2thbGxzeW1zX2Zvcl9rY29yZShkc28sIG1hcCk7CiAJZWxzZQotCQlyZXR1cm4gZHNvX19zcGxpdF9rYWxsc3ltcyhkc28sIG1hcCwgZGVsdGEsIGZpbHRlcik7CisJCXJldHVybiBkc29fX3NwbGl0X2thbGxzeW1zKGRzbywgbWFwLCBkZWx0YSk7CiB9CiAKIGludCBkc29fX2xvYWRfa2FsbHN5bXMoc3RydWN0IGRzbyAqZHNvLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKLQkJICAgICAgIHN0cnVjdCBtYXAgKm1hcCwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKKwkJICAgICAgIHN0cnVjdCBtYXAgKm1hcCkKIHsKLQlyZXR1cm4gX19kc29fX2xvYWRfa2FsbHN5bXMoZHNvLCBmaWxlbmFtZSwgbWFwLCBmYWxzZSwgZmlsdGVyKTsKKwlyZXR1cm4gX19kc29fX2xvYWRfa2FsbHN5bXMoZHNvLCBmaWxlbmFtZSwgbWFwLCBmYWxzZSk7CiB9CiAKLXN0YXRpYyBpbnQgZHNvX19sb2FkX3BlcmZfbWFwKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAotCQkJICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK3N0YXRpYyBpbnQgZHNvX19sb2FkX3BlcmZfbWFwKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwKQogewogCWNoYXIgKmxpbmUgPSBOVUxMOwogCXNpemVfdCBuOwpAQCAtMTI5NywxMiArMTMzMCw4IEBACiAJCWlmIChzeW0gPT0gTlVMTCkKIAkJCWdvdG8gb3V0X2RlbGV0ZV9saW5lOwogCi0JCWlmIChmaWx0ZXIgJiYgZmlsdGVyKG1hcCwgc3ltKSkKLQkJCXN5bWJvbF9fZGVsZXRlKHN5bSk7Ci0JCWVsc2UgewotCQkJc3ltYm9sc19faW5zZXJ0KCZkc28tPnN5bWJvbHNbbWFwLT50eXBlXSwgc3ltKTsKLQkJCW5yX3N5bXMrKzsKLQkJfQorCQlzeW1ib2xzX19pbnNlcnQoJmRzby0+c3ltYm9sc1ttYXAtPnR5cGVdLCBzeW0pOworCQlucl9zeW1zKys7CiAJfQogCiAJZnJlZShsaW5lKTsKQEAgLTEzNTgsNyArMTM4Nyw3IEBACiAJfQogfQogCi1pbnQgZHNvX19sb2FkKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQoraW50IGRzb19fbG9hZChzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYXAgKm1hcCkKIHsKIAljaGFyICpuYW1lOwogCWludCByZXQgPSAtMTsKQEAgLTEzODEsOSArMTQxMCw5IEBACiAKIAlpZiAoZHNvLT5rZXJuZWwpIHsKIAkJaWYgKGRzby0+a2VybmVsID09IERTT19UWVBFX0tFUk5FTCkKLQkJCXJldCA9IGRzb19fbG9hZF9rZXJuZWxfc3ltKGRzbywgbWFwLCBmaWx0ZXIpOworCQkJcmV0ID0gZHNvX19sb2FkX2tlcm5lbF9zeW0oZHNvLCBtYXApOwogCQllbHNlIGlmIChkc28tPmtlcm5lbCA9PSBEU09fVFlQRV9HVUVTVF9LRVJORUwpCi0JCQlyZXQgPSBkc29fX2xvYWRfZ3Vlc3Rfa2VybmVsX3N5bShkc28sIG1hcCwgZmlsdGVyKTsKKwkJCXJldCA9IGRzb19fbG9hZF9ndWVzdF9rZXJuZWxfc3ltKGRzbywgbWFwKTsKIAogCQlnb3RvIG91dDsKIAl9CkBAIC0xNDA3LDcgKzE0MzYsNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlyZXQgPSBkc29fX2xvYWRfcGVyZl9tYXAoZHNvLCBtYXAsIGZpbHRlcik7CisJCXJldCA9IGRzb19fbG9hZF9wZXJmX21hcChkc28sIG1hcCk7CiAJCWRzby0+c3ltdGFiX3R5cGUgPSByZXQgPiAwID8gRFNPX0JJTkFSWV9UWVBFX19KQVZBX0pJVCA6CiAJCQkJCSAgICAgRFNPX0JJTkFSWV9UWVBFX19OT1RfRk9VTkQ7CiAJCWdvdG8gb3V0OwpAQCAtMTQ5OCwxNCArMTUyNywxNCBAQAogCQkJa21vZCA9IHRydWU7CiAKIAlpZiAoc3ltc19zcykKLQkJcmV0ID0gZHNvX19sb2FkX3N5bShkc28sIG1hcCwgc3ltc19zcywgcnVudGltZV9zcywgZmlsdGVyLCBrbW9kKTsKKwkJcmV0ID0gZHNvX19sb2FkX3N5bShkc28sIG1hcCwgc3ltc19zcywgcnVudGltZV9zcywga21vZCk7CiAJZWxzZQogCQlyZXQgPSAtMTsKIAogCWlmIChyZXQgPiAwKSB7CiAJCWludCBucl9wbHQ7CiAKLQkJbnJfcGx0ID0gZHNvX19zeW50aGVzaXplX3BsdF9zeW1ib2xzKGRzbywgcnVudGltZV9zcywgbWFwLCBmaWx0ZXIpOworCQlucl9wbHQgPSBkc29fX3N5bnRoZXNpemVfcGx0X3N5bWJvbHMoZHNvLCBydW50aW1lX3NzLCBtYXApOwogCQlpZiAobnJfcGx0ID4gMCkKIAkJCXJldCArPSBucl9wbHQ7CiAJfQpAQCAtMTU0NCw4ICsxNTczLDcgQEAKIH0KIAogaW50IGRzb19fbG9hZF92bWxpbnV4KHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAotCQkgICAgICBjb25zdCBjaGFyICp2bWxpbnV4LCBib29sIHZtbGludXhfYWxsb2NhdGVkLAotCQkgICAgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorCQkgICAgICBjb25zdCBjaGFyICp2bWxpbnV4LCBib29sIHZtbGludXhfYWxsb2NhdGVkKQogewogCWludCBlcnIgPSAtMTsKIAlzdHJ1Y3Qgc3ltc3JjIHNzOwpAQCAtMTU2NSw3ICsxNTkzLDcgQEAKIAlpZiAoc3ltc3JjX19pbml0KCZzcywgZHNvLCBzeW1mc192bWxpbnV4LCBzeW10YWJfdHlwZSkpCiAJCXJldHVybiAtMTsKIAotCWVyciA9IGRzb19fbG9hZF9zeW0oZHNvLCBtYXAsICZzcywgJnNzLCBmaWx0ZXIsIDApOworCWVyciA9IGRzb19fbG9hZF9zeW0oZHNvLCBtYXAsICZzcywgJnNzLCAwKTsKIAlzeW1zcmNfX2Rlc3Ryb3koJnNzKTsKIAogCWlmIChlcnIgPiAwKSB7CkBAIC0xNTgxLDggKzE2MDksNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBkc29fX2xvYWRfdm1saW51eF9wYXRoKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAotCQkJICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK2ludCBkc29fX2xvYWRfdm1saW51eF9wYXRoKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwKQogewogCWludCBpLCBlcnIgPSAwOwogCWNoYXIgKmZpbGVuYW1lID0gTlVMTDsKQEAgLTE1OTEsNyArMTYxOCw3IEBACiAJCSB2bWxpbnV4X3BhdGhfX25yX2VudHJpZXMgKyAxKTsKIAogCWZvciAoaSA9IDA7IGkgPCB2bWxpbnV4X3BhdGhfX25yX2VudHJpZXM7ICsraSkgewotCQllcnIgPSBkc29fX2xvYWRfdm1saW51eChkc28sIG1hcCwgdm1saW51eF9wYXRoW2ldLCBmYWxzZSwgZmlsdGVyKTsKKwkJZXJyID0gZHNvX19sb2FkX3ZtbGludXgoZHNvLCBtYXAsIHZtbGludXhfcGF0aFtpXSwgZmFsc2UpOwogCQlpZiAoZXJyID4gMCkKIAkJCWdvdG8gb3V0OwogCX0KQEAgLTE1OTksNyArMTYyNiw3IEBACiAJaWYgKCFzeW1ib2xfY29uZi5pZ25vcmVfdm1saW51eF9idWlsZGlkKQogCQlmaWxlbmFtZSA9IGRzb19fYnVpbGRfaWRfZmlsZW5hbWUoZHNvLCBOVUxMLCAwKTsKIAlpZiAoZmlsZW5hbWUgIT0gTlVMTCkgewotCQllcnIgPSBkc29fX2xvYWRfdm1saW51eChkc28sIG1hcCwgZmlsZW5hbWUsIHRydWUsIGZpbHRlcik7CisJCWVyciA9IGRzb19fbG9hZF92bWxpbnV4KGRzbywgbWFwLCBmaWxlbmFtZSwgdHJ1ZSk7CiAJCWlmIChlcnIgPiAwKQogCQkJZ290byBvdXQ7CiAJCWZyZWUoZmlsZW5hbWUpOwpAQCAtMTcxMyw4ICsxNzQwLDcgQEAKIAlyZXR1cm4gc3RyZHVwKHBhdGgpOwogfQogCi1zdGF0aWMgaW50IGRzb19fbG9hZF9rZXJuZWxfc3ltKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAotCQkJCXN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCitzdGF0aWMgaW50IGRzb19fbG9hZF9rZXJuZWxfc3ltKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwKQogewogCWludCBlcnI7CiAJY29uc3QgY2hhciAqa2FsbHN5bXNfZmlsZW5hbWUgPSBOVUxMOwpAQCAtMTc0MCwxMiArMTc2NiwxMSBAQAogCX0KIAogCWlmICghc3ltYm9sX2NvbmYuaWdub3JlX3ZtbGludXggJiYgc3ltYm9sX2NvbmYudm1saW51eF9uYW1lICE9IE5VTEwpIHsKLQkJcmV0dXJuIGRzb19fbG9hZF92bWxpbnV4KGRzbywgbWFwLCBzeW1ib2xfY29uZi52bWxpbnV4X25hbWUsCi0JCQkJCSBmYWxzZSwgZmlsdGVyKTsKKwkJcmV0dXJuIGRzb19fbG9hZF92bWxpbnV4KGRzbywgbWFwLCBzeW1ib2xfY29uZi52bWxpbnV4X25hbWUsIGZhbHNlKTsKIAl9CiAKIAlpZiAoIXN5bWJvbF9jb25mLmlnbm9yZV92bWxpbnV4ICYmIHZtbGludXhfcGF0aCAhPSBOVUxMKSB7Ci0JCWVyciA9IGRzb19fbG9hZF92bWxpbnV4X3BhdGgoZHNvLCBtYXAsIGZpbHRlcik7CisJCWVyciA9IGRzb19fbG9hZF92bWxpbnV4X3BhdGgoZHNvLCBtYXApOwogCQlpZiAoZXJyID4gMCkKIAkJCXJldHVybiBlcnI7CiAJfQpAQCAtMTc2MSw3ICsxNzg2LDcgQEAKIAlrYWxsc3ltc19maWxlbmFtZSA9IGthbGxzeW1zX2FsbG9jYXRlZF9maWxlbmFtZTsKIAogZG9fa2FsbHN5bXM6Ci0JZXJyID0gZHNvX19sb2FkX2thbGxzeW1zKGRzbywga2FsbHN5bXNfZmlsZW5hbWUsIG1hcCwgZmlsdGVyKTsKKwllcnIgPSBkc29fX2xvYWRfa2FsbHN5bXMoZHNvLCBrYWxsc3ltc19maWxlbmFtZSwgbWFwKTsKIAlpZiAoZXJyID4gMCkKIAkJcHJfZGVidWcoIlVzaW5nICVzIGZvciBzeW1ib2xzXG4iLCBrYWxsc3ltc19maWxlbmFtZSk7CiAJZnJlZShrYWxsc3ltc19hbGxvY2F0ZWRfZmlsZW5hbWUpOwpAQCAtMTc3Niw4ICsxODAxLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGRzb19fbG9hZF9ndWVzdF9rZXJuZWxfc3ltKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAotCQkJCSAgICAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCitzdGF0aWMgaW50IGRzb19fbG9hZF9ndWVzdF9rZXJuZWxfc3ltKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwKQogewogCWludCBlcnI7CiAJY29uc3QgY2hhciAqa2FsbHN5bXNfZmlsZW5hbWUgPSBOVUxMOwpAQCAtMTc5OSw3ICsxODIzLDcgQEAKIAkJaWYgKHN5bWJvbF9jb25mLmRlZmF1bHRfZ3Vlc3Rfdm1saW51eF9uYW1lICE9IE5VTEwpIHsKIAkJCWVyciA9IGRzb19fbG9hZF92bWxpbnV4KGRzbywgbWFwLAogCQkJCQkJc3ltYm9sX2NvbmYuZGVmYXVsdF9ndWVzdF92bWxpbnV4X25hbWUsCi0JCQkJCQlmYWxzZSwgZmlsdGVyKTsKKwkJCQkJCWZhbHNlKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIApAQCAtMTgxMSw3ICsxODM1LDcgQEAKIAkJa2FsbHN5bXNfZmlsZW5hbWUgPSBwYXRoOwogCX0KIAotCWVyciA9IGRzb19fbG9hZF9rYWxsc3ltcyhkc28sIGthbGxzeW1zX2ZpbGVuYW1lLCBtYXAsIGZpbHRlcik7CisJZXJyID0gZHNvX19sb2FkX2thbGxzeW1zKGRzbywga2FsbHN5bXNfZmlsZW5hbWUsIG1hcCk7CiAJaWYgKGVyciA+IDApCiAJCXByX2RlYnVnKCJVc2luZyAlcyBmb3Igc3ltYm9sc1xuIiwga2FsbHN5bXNfZmlsZW5hbWUpOwogCWlmIChlcnIgPiAwICYmICFkc29fX2lzX2tjb3JlKGRzbykpIHsKQEAgLTE5NDgsNiArMTk3MiwyMyBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAoraW50IHN5bWJvbF9fYW5ub3RhdGlvbl9pbml0KHZvaWQpCit7CisJaWYgKHN5bWJvbF9jb25mLmluaXRpYWxpemVkKSB7CisJCXByX2VycigiQW5ub3RhdGlvbiBuZWVkcyB0byBiZSBpbml0IGJlZm9yZSBzeW1ib2xfX2luaXQoKVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc3ltYm9sX2NvbmYuaW5pdF9hbm5vdGF0aW9uKSB7CisJCXByX3dhcm5pbmcoIkFubm90YXRpb24gYmVpbmcgaW5pdGlhbGl6ZWQgbXVsdGlwbGUgdGltZXNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzeW1ib2xfY29uZi5wcml2X3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBhbm5vdGF0aW9uKTsKKwlzeW1ib2xfY29uZi5pbml0X2Fubm90YXRpb24gPSB0cnVlOworCXJldHVybiAwOworfQorCiBpbnQgc3ltYm9sX19pbml0KHN0cnVjdCBwZXJmX2VudiAqZW52KQogewogCWNvbnN0IGNoYXIgKnN5bWZzOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oCmluZGV4IDY5OWY3Y2IuLmQ5NjQ4NDQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuaAorKysgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmgKQEAgLTU3LDcgKzU3LDcgQEAKIAl1NjQJCWVuZDsKIAl1MTYJCW5hbWVsZW47CiAJdTgJCWJpbmRpbmc7Ci0JYm9vbAkJaWdub3JlOworCXU4CQlpZGxlOjE7CiAJdTgJCWFyY2hfc3ltOwogCWNoYXIJCW5hbWVbMF07CiB9OwpAQCAtODgsNiArODgsNyBAQAogCXVuc2lnbmVkIHNob3J0CXByaXZfc2l6ZTsKIAl1bnNpZ25lZCBzaG9ydAlucl9ldmVudHM7CiAJYm9vbAkJdHJ5X3ZtbGludXhfcGF0aCwKKwkJCWluaXRfYW5ub3RhdGlvbiwKIAkJCWZvcmNlLAogCQkJaWdub3JlX3ZtbGludXgsCiAJCQlpZ25vcmVfdm1saW51eF9idWlsZGlkLApAQCAtMjQwLDE2ICsyNDEsMTMgQEAKIGJvb2wgc3ltc3JjX19oYXNfc3ltdGFiKHN0cnVjdCBzeW1zcmMgKnNzKTsKIGJvb2wgc3ltc3JjX19wb3NzaWJseV9ydW50aW1lKHN0cnVjdCBzeW1zcmMgKnNzKTsKIAotaW50IGRzb19fbG9hZChzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYXAgKm1hcCwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CitpbnQgZHNvX19sb2FkKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwKTsKIGludCBkc29fX2xvYWRfdm1saW51eChzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYXAgKm1hcCwKLQkJICAgICAgY29uc3QgY2hhciAqdm1saW51eCwgYm9vbCB2bWxpbnV4X2FsbG9jYXRlZCwKLQkJICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7Ci1pbnQgZHNvX19sb2FkX3ZtbGludXhfcGF0aChzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYXAgKm1hcCwKLQkJCSAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOworCQkgICAgICBjb25zdCBjaGFyICp2bWxpbnV4LCBib29sIHZtbGludXhfYWxsb2NhdGVkKTsKK2ludCBkc29fX2xvYWRfdm1saW51eF9wYXRoKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwKTsKIGludCBfX2Rzb19fbG9hZF9rYWxsc3ltcyhzdHJ1Y3QgZHNvICpkc28sIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3QgbWFwICptYXAsCi0JCQkgYm9vbCBub19rY29yZSwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7Ci1pbnQgZHNvX19sb2FkX2thbGxzeW1zKHN0cnVjdCBkc28gKmRzbywgY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCBtYXAgKm1hcCwKLQkJICAgICAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOworCQkJIGJvb2wgbm9fa2NvcmUpOworaW50IGRzb19fbG9hZF9rYWxsc3ltcyhzdHJ1Y3QgZHNvICpkc28sIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3QgbWFwICptYXApOwogCiB2b2lkIGRzb19faW5zZXJ0X3N5bWJvbChzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSwKIAkJCXN0cnVjdCBzeW1ib2wgKnN5bSk7CkBAIC0yNjEsNiArMjU5LDcgQEAKIHN0cnVjdCBzeW1ib2wgKnN5bWJvbF9fbmV4dF9ieV9uYW1lKHN0cnVjdCBzeW1ib2wgKnN5bSk7CiAKIHN0cnVjdCBzeW1ib2wgKmRzb19fZmlyc3Rfc3ltYm9sKHN0cnVjdCBkc28gKmRzbywgZW51bSBtYXBfdHlwZSB0eXBlKTsKK3N0cnVjdCBzeW1ib2wgKmRzb19fbGFzdF9zeW1ib2woc3RydWN0IGRzbyAqZHNvLCBlbnVtIG1hcF90eXBlIHR5cGUpOwogc3RydWN0IHN5bWJvbCAqZHNvX19uZXh0X3N5bWJvbChzdHJ1Y3Qgc3ltYm9sICpzeW0pOwogCiBlbnVtIGRzb190eXBlIGRzb19fdHlwZV9mZChpbnQgZmQpOwpAQCAtMjc3LDYgKzI3Niw4IEBACiBpbnQgc3ltYm9sX19pbml0KHN0cnVjdCBwZXJmX2VudiAqZW52KTsKIHZvaWQgc3ltYm9sX19leGl0KHZvaWQpOwogdm9pZCBzeW1ib2xfX2VsZl9pbml0KHZvaWQpOworaW50IHN5bWJvbF9fYW5ub3RhdGlvbl9pbml0KHZvaWQpOworCiBzdHJ1Y3Qgc3ltYm9sICpzeW1ib2xfX25ldyh1NjQgc3RhcnQsIHU2NCBsZW4sIHU4IGJpbmRpbmcsIGNvbnN0IGNoYXIgKm5hbWUpOwogc2l6ZV90IF9fc3ltYm9sX19mcHJpbnRmX3N5bW5hbWVfb2Zmcyhjb25zdCBzdHJ1Y3Qgc3ltYm9sICpzeW0sCiAJCQkJICAgICAgY29uc3Qgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsLApAQCAtMjkxLDE2ICsyOTIsMTUgQEAKIGJvb2wgc3ltYm9sX3R5cGVfX2lzX2EoY2hhciBzeW1ib2xfdHlwZSwgZW51bSBtYXBfdHlwZSBtYXBfdHlwZSk7CiBib29sIHN5bWJvbF9fcmVzdHJpY3RlZF9maWxlbmFtZShjb25zdCBjaGFyICpmaWxlbmFtZSwKIAkJCQkgY29uc3QgY2hhciAqcmVzdHJpY3RlZF9maWxlbmFtZSk7Ci1ib29sIHN5bWJvbF9faXNfaWRsZShzdHJ1Y3Qgc3ltYm9sICpzeW0pOwogaW50IHN5bWJvbF9fY29uZmlnX3N5bWZzKGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCBfX21heWJlX3VudXNlZCwKIAkJCSBjb25zdCBjaGFyICpkaXIsIGludCB1bnNldCBfX21heWJlX3VudXNlZCk7CiAKIGludCBkc29fX2xvYWRfc3ltKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLCBzdHJ1Y3Qgc3ltc3JjICpzeW1zX3NzLAotCQkgIHN0cnVjdCBzeW1zcmMgKnJ1bnRpbWVfc3MsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIsCi0JCSAgaW50IGttb2R1bGUpOworCQkgIHN0cnVjdCBzeW1zcmMgKnJ1bnRpbWVfc3MsIGludCBrbW9kdWxlKTsKIGludCBkc29fX3N5bnRoZXNpemVfcGx0X3N5bWJvbHMoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3Qgc3ltc3JjICpzcywKLQkJCQlzdHJ1Y3QgbWFwICptYXAsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOworCQkJCXN0cnVjdCBtYXAgKm1hcCk7CiAKK3ZvaWQgX19zeW1ib2xzX19pbnNlcnQoc3RydWN0IHJiX3Jvb3QgKnN5bWJvbHMsIHN0cnVjdCBzeW1ib2wgKnN5bSwgYm9vbCBrZXJuZWwpOwogdm9pZCBzeW1ib2xzX19pbnNlcnQoc3RydWN0IHJiX3Jvb3QgKnN5bWJvbHMsIHN0cnVjdCBzeW1ib2wgKnN5bSk7CiB2b2lkIHN5bWJvbHNfX2ZpeHVwX2R1cGxpY2F0ZShzdHJ1Y3QgcmJfcm9vdCAqc3ltYm9scyk7CiB2b2lkIHN5bWJvbHNfX2ZpeHVwX2VuZChzdHJ1Y3QgcmJfcm9vdCAqc3ltYm9scyk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdW53aW5kLWxpYmR3LmMgYi90b29scy9wZXJmL3V0aWwvdW53aW5kLWxpYmR3LmMKaW5kZXggY2Y1ZTI1MC4uNzgzYTUzZiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Vud2luZC1saWJkdy5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91bndpbmQtbGliZHcuYwpAQCAtNjYsNyArNjYsNyBAQAogCWlmIChfX3JlcG9ydF9tb2R1bGUoJmFsLCBpcCwgdWkpKQogCQlyZXR1cm4gLTE7CiAKLQllLT5pcCAgPSBpcDsKKwllLT5pcCAgPSBhbC5hZGRyOwogCWUtPm1hcCA9IGFsLm1hcDsKIAllLT5zeW0gPSBhbC5zeW07CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91bndpbmQtbGlidW53aW5kLWxvY2FsLmMgYi90b29scy9wZXJmL3V0aWwvdW53aW5kLWxpYnVud2luZC1sb2NhbC5jCmluZGV4IDk3YzBmOGYuLjIwYzJlNTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC91bndpbmQtbGlidW53aW5kLWxvY2FsLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Vud2luZC1saWJ1bndpbmQtbG9jYWwuYwpAQCAtNTQyLDcgKzU0Miw3IEBACiAJdGhyZWFkX19maW5kX2FkZHJfbG9jYXRpb24odGhyZWFkLCBQRVJGX1JFQ09SRF9NSVNDX1VTRVIsCiAJCQkJICAgTUFQX19GVU5DVElPTiwgaXAsICZhbCk7CiAKLQllLmlwID0gaXA7CisJZS5pcCA9IGFsLmFkZHI7CiAJZS5tYXAgPSBhbC5tYXA7CiAJZS5zeW0gPSBhbC5zeW07CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmMgYi90b29scy9wZXJmL3V0aWwvdXRpbC5jCmluZGV4IGNlZTU1OWQuLjg1YzU2ODAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3V0aWwuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWU2NC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgImNhbGxjaGFpbi5oIgogI2luY2x1ZGUgInN0cmxpc3QuaCIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmggYi90b29scy9wZXJmL3V0aWwvdXRpbC5oCmluZGV4IGU1ZjU1NDcuLjQzODk5ZTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3V0aWwuaApAQCAtMTc5LDEwICsxNzksNiBAQAogI3VuZGVmIHRvbG93ZXIKICN1bmRlZiB0b3VwcGVyCiAKLSNpZm5kZWYgTlNFQ19QRVJfTVNFQwotI2RlZmluZSBOU0VDX1BFUl9NU0VDCTEwMDAwMDBMCi0jZW5kaWYKLQogaW50IHBhcnNlX25zZWNfdGltZShjb25zdCBjaGFyICpzdHIsIHU2NCAqcHRpbWUpOwogCiBleHRlcm4gdW5zaWduZWQgY2hhciBzYW5lX2N0eXBlWzI1Nl07CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9hY3BpL2NvbW1vbi9jbWZzaXplLmMgYi90b29scy9wb3dlci9hY3BpL2NvbW1vbi9jbWZzaXplLmMKaW5kZXggZTczYTc5Zi4uYmM4MjU5NiAxMDA2NDQKLS0tIGEvdG9vbHMvcG93ZXIvYWNwaS9jb21tb24vY21mc2l6ZS5jCisrKyBiL3Rvb2xzL3Bvd2VyL2FjcGkvY29tbW9uL2NtZnNpemUuYwpAQCAtNDQsNyArNDQsNiBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAjaW5jbHVkZSAiYWNhcHBzLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVE9PTFMKIEFDUElfTU9EVUxFX05BTUUoImNtZnNpemUiKQpAQCAtNjksMjQgKzY4LDI0IEBACiAKIAkvKiBTYXZlIHRoZSBjdXJyZW50IGZpbGUgcG9pbnRlciwgc2VlayB0byBFT0YgdG8gb2J0YWluIGZpbGUgc2l6ZSAqLwogCi0JY3VycmVudF9vZmZzZXQgPSBhY3BpX29zX2dldF9maWxlX29mZnNldChmaWxlKTsKKwljdXJyZW50X29mZnNldCA9IGZ0ZWxsKGZpbGUpOwogCWlmIChjdXJyZW50X29mZnNldCA8IDApIHsKIAkJZ290byBvZmZzZXRfZXJyb3I7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9vc19zZXRfZmlsZV9vZmZzZXQoZmlsZSwgMCwgQUNQSV9GSUxFX0VORCk7CisJc3RhdHVzID0gZnNlZWsoZmlsZSwgMCwgU0VFS19FTkQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIHNlZWtfZXJyb3I7CiAJfQogCi0JZmlsZV9zaXplID0gYWNwaV9vc19nZXRfZmlsZV9vZmZzZXQoZmlsZSk7CisJZmlsZV9zaXplID0gZnRlbGwoZmlsZSk7CiAJaWYgKGZpbGVfc2l6ZSA8IDApIHsKIAkJZ290byBvZmZzZXRfZXJyb3I7CiAJfQogCiAJLyogUmVzdG9yZSBvcmlnaW5hbCBmaWxlIHBvaW50ZXIgKi8KIAotCXN0YXR1cyA9IGFjcGlfb3Nfc2V0X2ZpbGVfb2Zmc2V0KGZpbGUsIGN1cnJlbnRfb2Zmc2V0LCBBQ1BJX0ZJTEVfQkVHSU4pOworCXN0YXR1cyA9IGZzZWVrKGZpbGUsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gc2Vla19lcnJvcjsKIAl9CkBAIC05NCwxMCArOTMsMTAgQEAKIAlyZXR1cm4gKCh1MzIpZmlsZV9zaXplKTsKIAogb2Zmc2V0X2Vycm9yOgotCWFjcGlfbG9nX2Vycm9yKCJDb3VsZCBub3QgZ2V0IGZpbGUgb2Zmc2V0Iik7CisJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZ2V0IGZpbGUgb2Zmc2V0XG4iKTsKIAlyZXR1cm4gKEFDUElfVUlOVDMyX01BWCk7CiAKIHNlZWtfZXJyb3I6Ci0JYWNwaV9sb2dfZXJyb3IoIkNvdWxkIG5vdCBzZXQgZmlsZSBvZmZzZXQiKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBzZXQgZmlsZSBvZmZzZXRcbiIpOwogCXJldHVybiAoQUNQSV9VSU5UMzJfTUFYKTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2FjcGkvY29tbW9uL2dldG9wdC5jIGIvdG9vbHMvcG93ZXIvYWNwaS9jb21tb24vZ2V0b3B0LmMKaW5kZXggMGJkMzQzZi4uMzkxOTk3MCAxMDA2NDQKLS0tIGEvdG9vbHMvcG93ZXIvYWNwaS9jb21tb24vZ2V0b3B0LmMKKysrIGIvdG9vbHMvcG93ZXIvYWNwaS9jb21tb24vZ2V0b3B0LmMKQEAgLTU3LDcgKzU3LDcgQEAKICNpbmNsdWRlICJhY2FwcHMuaCIKIAogI2RlZmluZSBBQ1BJX09QVElPTl9FUlJPUihtc2csIGJhZGNoYXIpIFwKLQlpZiAoYWNwaV9nYmxfb3B0ZXJyKSB7YWNwaV9sb2dfZXJyb3IgKCIlcyVjXG4iLCBtc2csIGJhZGNoYXIpO30KKwlpZiAoYWNwaV9nYmxfb3B0ZXJyKSB7ZnByaW50ZiAoc3RkZXJyLCAiJXMlY1xuIiwgbXNnLCBiYWRjaGFyKTt9CiAKIGludCBhY3BpX2dibF9vcHRlcnIgPSAxOwogaW50IGFjcGlfZ2JsX29wdGluZCA9IDE7CkBAIC05NCw3ICs5NCw3IEBACiAJCWFjcGlfZ2JsX29wdGFyZyA9CiAJCSAgICAmYXJndlthY3BpX2dibF9vcHRpbmQrK11bKGludCkoY3VycmVudF9jaGFyX3B0ciArIDEpXTsKIAl9IGVsc2UgaWYgKCsrYWNwaV9nYmxfb3B0aW5kID49IGFyZ2MpIHsKLQkJQUNQSV9PUFRJT05fRVJST1IoIk9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudDogLSIsICd2Jyk7CisJCUFDUElfT1BUSU9OX0VSUk9SKCJcbk9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIsIDApOwogCiAJCWN1cnJlbnRfY2hhcl9wdHIgPSAxOwogCQlyZXR1cm4gKC0xKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2FjcGkvb3Nfc3BlY2lmaWMvc2VydmljZV9sYXllcnMvb3NsaWJjZnMuYyBiL3Rvb2xzL3Bvd2VyL2FjcGkvb3Nfc3BlY2lmaWMvc2VydmljZV9sYXllcnMvb3NsaWJjZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFmNGFiYS4uMDAwMDAwMAotLS0gYS90b29scy9wb3dlci9hY3BpL29zX3NwZWNpZmljL3NlcnZpY2VfbGF5ZXJzL29zbGliY2ZzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBvc2xpYmNmcyAtIEMgbGlicmFyeSBPU0wgZm9yIGZpbGUgSS9PCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNiwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfT1NfU0VSVklDRVMKLUFDUElfTU9EVUxFX05BTUUoIm9zbGliY2ZzIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9vc19vcGVuX2ZpbGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgcGF0aCAgICAgICAgICAgICAgICAtIEZpbGUgcGF0aAotICogICAgICAgICAgICAgIG1vZGVzICAgICAgICAgICAgICAgLSBGaWxlIG9wZXJhdGlvbiB0eXBlCi0gKgotICogUkVUVVJOOiAgICAgIEZpbGUgZGVzY3JpcHRvci4KLSAqCi0gKiBERVNDUklQVElPTjogT3BlbiBhIGZpbGUgZm9yIHJlYWRpbmcgKEFDUElfRklMRV9SRUFESU5HKSBvci9hbmQgd3JpdGluZwotICogICAgICAgICAgICAgIChBQ1BJX0ZJTEVfV1JJVElORykuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUFDUElfRklMRSBhY3BpX29zX29wZW5fZmlsZShjb25zdCBjaGFyICpwYXRoLCB1OCBtb2RlcykKLXsKLQlBQ1BJX0ZJTEUgZmlsZTsKLQl1MzIgaSA9IDA7Ci0JY2hhciBtb2Rlc19zdHJbNF07Ci0KLQlpZiAobW9kZXMgJiBBQ1BJX0ZJTEVfUkVBRElORykgewotCQltb2Rlc19zdHJbaSsrXSA9ICdyJzsKLQl9Ci0JaWYgKG1vZGVzICYgQUNQSV9GSUxFX1dSSVRJTkcpIHsKLQkJbW9kZXNfc3RyW2krK10gPSAndyc7Ci0JfQotCi0JaWYgKG1vZGVzICYgQUNQSV9GSUxFX0JJTkFSWSkgewotCQltb2Rlc19zdHJbaSsrXSA9ICdiJzsKLQl9Ci0KLQltb2Rlc19zdHJbaSsrXSA9ICdcMCc7Ci0KLQlmaWxlID0gZm9wZW4ocGF0aCwgbW9kZXNfc3RyKTsKLQlpZiAoIWZpbGUpIHsKLQkJcGVycm9yKCJDb3VsZCBub3Qgb3BlbiBmaWxlIik7Ci0JfQotCi0JcmV0dXJuIChmaWxlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9vc19jbG9zZV9maWxlCi0gKgotICogUEFSQU1FVEVSUzogIGZpbGUgICAgICAgICAgICAgICAgLSBBbiBvcGVuIGZpbGUgZGVzY3JpcHRvcgotICoKLSAqIFJFVFVSTjogICAgICBOb25lLgotICoKLSAqIERFU0NSSVBUSU9OOiBDbG9zZSBhIGZpbGUgb3BlbmVkIHZpYSBhY3BpX29zX29wZW5fZmlsZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfb3NfY2xvc2VfZmlsZShBQ1BJX0ZJTEUgZmlsZSkKLXsKLQotCWZjbG9zZShmaWxlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9vc19yZWFkX2ZpbGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgZmlsZSAgICAgICAgICAgICAgICAtIEFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yCi0gKiAgICAgICAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAtIERhdGEgYnVmZmVyCi0gKiAgICAgICAgICAgICAgc2l6ZSAgICAgICAgICAgICAgICAtIERhdGEgYmxvY2sgc2l6ZQotICogICAgICAgICAgICAgIGNvdW50ICAgICAgICAgICAgICAgLSBOdW1iZXIgb2YgZGF0YSBibG9ja3MKLSAqCi0gKiBSRVRVUk46ICAgICAgTnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQuCi0gKgotICogREVTQ1JJUFRJT046IFJlYWQgZnJvbSBhIGZpbGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW50Ci1hY3BpX29zX3JlYWRfZmlsZShBQ1BJX0ZJTEUgZmlsZSwgdm9pZCAqYnVmZmVyLCBhY3BpX3NpemUgc2l6ZSwgYWNwaV9zaXplIGNvdW50KQotewotCWludCBsZW5ndGg7Ci0KLQlsZW5ndGggPSBmcmVhZChidWZmZXIsIHNpemUsIGNvdW50LCBmaWxlKTsKLQlpZiAobGVuZ3RoIDwgMCkgewotCQlwZXJyb3IoIkVycm9yIHJlYWRpbmcgZmlsZSIpOwotCX0KLQotCXJldHVybiAobGVuZ3RoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9vc193cml0ZV9maWxlCi0gKgotICogUEFSQU1FVEVSUzogIGZpbGUgICAgICAgICAgICAgICAgLSBBbiBvcGVuIGZpbGUgZGVzY3JpcHRvcgotICogICAgICAgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgLSBEYXRhIGJ1ZmZlcgotICogICAgICAgICAgICAgIHNpemUgICAgICAgICAgICAgICAgLSBEYXRhIGJsb2NrIHNpemUKLSAqICAgICAgICAgICAgICBjb3VudCAgICAgICAgICAgICAgIC0gTnVtYmVyIG9mIGRhdGEgYmxvY2tzCi0gKgotICogUkVUVVJOOiAgICAgIE51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuLgotICoKLSAqIERFU0NSSVBUSU9OOiBXcml0ZSB0byBhIGZpbGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW50Ci1hY3BpX29zX3dyaXRlX2ZpbGUoQUNQSV9GSUxFIGZpbGUsCi0JCSAgIHZvaWQgKmJ1ZmZlciwgYWNwaV9zaXplIHNpemUsIGFjcGlfc2l6ZSBjb3VudCkKLXsKLQlpbnQgbGVuZ3RoOwotCi0JbGVuZ3RoID0gZndyaXRlKGJ1ZmZlciwgc2l6ZSwgY291bnQsIGZpbGUpOwotCWlmIChsZW5ndGggPCAwKSB7Ci0JCXBlcnJvcigiRXJyb3Igd3JpdGluZyBmaWxlIik7Ci0JfQotCi0JcmV0dXJuIChsZW5ndGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX29zX2dldF9maWxlX29mZnNldAotICoKLSAqIFBBUkFNRVRFUlM6ICBmaWxlICAgICAgICAgICAgICAgIC0gQW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IKLSAqCi0gKiBSRVRVUk46ICAgICAgQ3VycmVudCBmaWxlIHBvaW50ZXIgcG9zaXRpb24uCi0gKgotICogREVTQ1JJUFRJT046IEdldCBjdXJyZW50IGZpbGUgb2Zmc2V0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWxvbmcgYWNwaV9vc19nZXRfZmlsZV9vZmZzZXQoQUNQSV9GSUxFIGZpbGUpCi17Ci0JbG9uZyBvZmZzZXQ7Ci0KLQlvZmZzZXQgPSBmdGVsbChmaWxlKTsKLQlyZXR1cm4gKG9mZnNldCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfb3Nfc2V0X2ZpbGVfb2Zmc2V0Ci0gKgotICogUEFSQU1FVEVSUzogIGZpbGUgICAgICAgICAgICAgICAgLSBBbiBvcGVuIGZpbGUgZGVzY3JpcHRvcgotICogICAgICAgICAgICAgIG9mZnNldCAgICAgICAgICAgICAgLSBOZXcgZmlsZSBvZmZzZXQKLSAqICAgICAgICAgICAgICBmcm9tICAgICAgICAgICAgICAgIC0gRnJvbSBiZWdpbi9lbmQgb2YgZmlsZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogU2V0IGN1cnJlbnQgZmlsZSBvZmZzZXQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9vc19zZXRfZmlsZV9vZmZzZXQoQUNQSV9GSUxFIGZpbGUsIGxvbmcgb2Zmc2V0LCB1OCBmcm9tKQotewotCWludCByZXQgPSAwOwotCi0JaWYgKGZyb20gPT0gQUNQSV9GSUxFX0JFR0lOKSB7Ci0JCXJldCA9IGZzZWVrKGZpbGUsIG9mZnNldCwgU0VFS19TRVQpOwotCX0KLQotCWlmIChmcm9tID09IEFDUElfRklMRV9FTkQpIHsKLQkJcmV0ID0gZnNlZWsoZmlsZSwgb2Zmc2V0LCBTRUVLX0VORCk7Ci0JfQotCi0JaWYgKHJldCA8IDApIHsKLQkJcmV0dXJuIChBRV9FUlJPUik7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIChBRV9PSyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvYWNwaS9vc19zcGVjaWZpYy9zZXJ2aWNlX2xheWVycy9vc3VuaXh4Zi5jIGIvdG9vbHMvcG93ZXIvYWNwaS9vc19zcGVjaWZpYy9zZXJ2aWNlX2xheWVycy9vc3VuaXh4Zi5jCmluZGV4IDg4YWE2NmUuLjhkODAwM2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Bvd2VyL2FjcGkvb3Nfc3BlY2lmaWMvc2VydmljZV9sYXllcnMvb3N1bml4eGYuYworKysgYi90b29scy9wb3dlci9hY3BpL29zX3NwZWNpZmljL3NlcnZpY2VfbGF5ZXJzL29zdW5peHhmLmMKQEAgLTYzLDEwICs2Myw3IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9PU19TRVJWSUNFUwogQUNQSV9NT0RVTEVfTkFNRSgib3N1bml4eGYiKQogCi11OCBhY3BpX2dibF9kZWJ1Z190aW1lb3V0ID0gRkFMU0U7Ci0KIC8qIFVwY2FsbHMgdG8gYWNwaV9leGVjICovCi0KIHZvaWQKIGFlX3RhYmxlX292ZXJyaWRlKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqZXhpc3RpbmdfdGFibGUsCiAJCSAgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqbmV3X3RhYmxlKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvTWFrZWZpbGUgYi90b29scy9wb3dlci9hY3BpL3Rvb2xzL2FjcGlkdW1wL01ha2VmaWxlCmluZGV4IDI5NDJjZGMuLjA0YjVkYjcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvTWFrZWZpbGUKKysrIGIvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9NYWtlZmlsZQpAQCAtMzYsMTIgKzM2LDEzIEBACiAJdXRkZWJ1Zy5vXAogCXV0ZXhjZXAub1wKIAl1dGdsb2JhbC5vXAorCXV0aGV4Lm9cCiAJdXRtYXRoLm9cCiAJdXRub25hbnNpLm9cCiAJdXRwcmludC5vXAogCXV0c3RyaW5nLm9cCisJdXRzdHJ0b3VsNjQub1wKIAl1dHhmZXJyb3Iub1wKLQlvc2xpYmNmcy5vXAogCW9zbGludXh0Ymwub1wKIAljbWZzaXplLm9cCiAJZ2V0b3B0Lm8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvYWNwaWR1bXAuaCBiL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvYWNwaWR1bXAuaAppbmRleCAwMjVjMjMyLi4wMDQyM2ZjIDEwMDY0NAotLS0gYS90b29scy9wb3dlci9hY3BpL3Rvb2xzL2FjcGlkdW1wL2FjcGlkdW1wLmgKKysrIGIvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hY3BpZHVtcC5oCkBAIC01NSwxMSArNTUsNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAjaW5jbHVkZSAiYWN0YWJsZXMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAiYWNhcHBzLmgiCiAKIC8qIEdsb2JhbHMgKi8KIApAQCAtNzIsMTIgKzY4LDYgQEAKIEVYVEVSTiBjaGFyIElOSVRfR0xPQkFMKCpnYmxfb3V0cHV0X2ZpbGVuYW1lLCBOVUxMKTsKIEVYVEVSTiB1NjQgSU5JVF9HTE9CQUwoZ2JsX3JzZHBfYmFzZSwgMCk7CiAKLS8qIEdsb2JhbHMgcmVxdWlyZWQgZm9yIHVzZSB3aXRoIEFDUElDQSBtb2R1bGVzICovCi0KLSNpZmRlZiBfREVDTEFSRV9HTE9CQUxTCi11OCBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGggPSA4OwotI2VuZGlmCi0KIC8qIEFjdGlvbiB0YWJsZSB1c2VkIHRvIGRlZmVyIHJlcXVlc3RlZCBvcHRpb25zICovCiAKIHN0cnVjdCBhcF9kdW1wX2FjdGlvbiB7CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9hY3BpL3Rvb2xzL2FjcGlkdW1wL2FwZHVtcC5jIGIvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hcGR1bXAuYwppbmRleCBmYjhmMWQ5Li45MDMxYmUxIDEwMDY0NAotLS0gYS90b29scy9wb3dlci9hY3BpL3Rvb2xzL2FjcGlkdW1wL2FwZHVtcC5jCisrKyBiL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvYXBkdW1wLmMKQEAgLTY5LDE2ICs2OSwxNyBAQAogCQkvKiBNYWtlIHN1cmUgc2lnbmF0dXJlIGlzIGFsbCBBU0NJSSBhbmQgYSB2YWxpZCBBQ1BJIG5hbWUgKi8KIAogCQlpZiAoIWFjcGlfdXRfdmFsaWRfbmFtZXNlZyh0YWJsZS0+c2lnbmF0dXJlKSkgewotCQkJYWNwaV9sb2dfZXJyb3IoIlRhYmxlIHNpZ25hdHVyZSAoMHglOC44WCkgaXMgaW52YWxpZFxuIiwKLQkJCQkgICAgICAgKih1MzIgKil0YWJsZS0+c2lnbmF0dXJlKTsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJUYWJsZSBzaWduYXR1cmUgKDB4JTguOFgpIGlzIGludmFsaWRcbiIsCisJCQkJKih1MzIgKil0YWJsZS0+c2lnbmF0dXJlKTsKIAkJCXJldHVybiAoRkFMU0UpOwogCQl9CiAKIAkJLyogQ2hlY2sgZm9yIG1pbmltdW0gdGFibGUgbGVuZ3RoICovCiAKIAkJaWYgKHRhYmxlLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgewotCQkJYWNwaV9sb2dfZXJyb3IoIlRhYmxlIGxlbmd0aCAoMHglOC44WCkgaXMgaW52YWxpZFxuIiwKLQkJCQkgICAgICAgdGFibGUtPmxlbmd0aCk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlRhYmxlIGxlbmd0aCAoMHglOC44WCkgaXMgaW52YWxpZFxuIiwKKwkJCQl0YWJsZS0+bGVuZ3RoKTsKIAkJCXJldHVybiAoRkFMU0UpOwogCQl9CiAJfQpAQCAtMTE1LDggKzExNiw4IEBACiAJfQogCiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCIlNC40czogV2FybmluZzogd3JvbmcgY2hlY2tzdW0gaW4gdGFibGVcbiIsCi0JCQkgICAgICAgdGFibGUtPnNpZ25hdHVyZSk7CisJCWZwcmludGYoc3RkZXJyLCAiJTQuNHM6IFdhcm5pbmc6IHdyb25nIGNoZWNrc3VtIGluIHRhYmxlXG4iLAorCQkJdGFibGUtPnNpZ25hdHVyZSk7CiAJfQogCiAJcmV0dXJuIChBRV9PSyk7CkBAIC0xOTUsMTMgKzE5NiwxMyBAQAogCSAqIE5vdGU6IHNpbXBsZXN0IHRvIGp1c3QgYWx3YXlzIGVtaXQgYSA2NC1iaXQgYWRkcmVzcy4gYWNwaV94dHJhY3QKIAkgKiB1dGlsaXR5IGNhbiBoYW5kbGUgdGhpcy4KIAkgKi8KLQlhY3BpX3V0X2ZpbGVfcHJpbnRmKGdibF9vdXRwdXRfZmlsZSwgIiU0LjRzIEAgMHglOC44WCU4LjhYXG4iLAotCQkJICAgIHRhYmxlLT5zaWduYXR1cmUsIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzKSk7CisJZnByaW50ZihnYmxfb3V0cHV0X2ZpbGUsICIlNC40cyBAIDB4JTguOFglOC44WFxuIiwKKwkJdGFibGUtPnNpZ25hdHVyZSwgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3MpKTsKIAogCWFjcGlfdXRfZHVtcF9idWZmZXJfdG9fZmlsZShnYmxfb3V0cHV0X2ZpbGUsCiAJCQkJICAgIEFDUElfQ0FTVF9QVFIodTgsIHRhYmxlKSwgdGFibGVfbGVuZ3RoLAogCQkJCSAgICBEQl9CWVRFX0RJU1BMQVksIDApOwotCWFjcGlfdXRfZmlsZV9wcmludGYoZ2JsX291dHB1dF9maWxlLCAiXG4iKTsKKwlmcHJpbnRmKGdibF9vdXRwdXRfZmlsZSwgIlxuIik7CiAJcmV0dXJuICgwKTsKIH0KIApAQCAtMjM5LDE0ICsyNDAsMTQgQEAKIAkJCWlmIChzdGF0dXMgPT0gQUVfTElNSVQpIHsKIAkJCQlyZXR1cm4gKDApOwogCQkJfSBlbHNlIGlmIChpID09IDApIHsKLQkJCQlhY3BpX2xvZ19lcnJvcgotCQkJCSAgICAoIkNvdWxkIG5vdCBnZXQgQUNQSSB0YWJsZXMsICVzXG4iLAotCQkJCSAgICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiQ291bGQgbm90IGdldCBBQ1BJIHRhYmxlcywgJXNcbiIsCisJCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKTsKIAkJCQlyZXR1cm4gKC0xKTsKIAkJCX0gZWxzZSB7Ci0JCQkJYWNwaV9sb2dfZXJyb3IKLQkJCQkgICAgKCJDb3VsZCBub3QgZ2V0IEFDUEkgdGFibGUgYXQgaW5kZXggJXUsICVzXG4iLAotCQkJCSAgICAgaSwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiQ291bGQgbm90IGdldCBBQ1BJIHRhYmxlIGF0IGluZGV4ICV1LCAlc1xuIiwKKwkJCQkJaSwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQl9CkBAIC0yODYsMjAgKzI4NywyMCBAQAogCiAJLyogQ29udmVydCBhcmd1bWVudCB0byBhbiBpbnRlZ2VyIHBoeXNpY2FsIGFkZHJlc3MgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfc3RydG91bDY0KGFzY2lpX2FkZHJlc3MsIEFDUElfQU5ZX0JBU0UsCi0JCQkJICAgQUNQSV9NQVg2NF9CWVRFX1dJRFRILCAmbG9uZ19hZGRyZXNzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X3N0cnRvdWw2NChhc2NpaV9hZGRyZXNzLCBBQ1BJX1NUUlRPVUxfNjRCSVQsCisJCQkJICAgJmxvbmdfYWRkcmVzcyk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCIlczogQ291bGQgbm90IGNvbnZlcnQgdG8gYSBwaHlzaWNhbCBhZGRyZXNzXG4iLAotCQkJICAgICAgIGFzY2lpX2FkZHJlc3MpOworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBDb3VsZCBub3QgY29udmVydCB0byBhIHBoeXNpY2FsIGFkZHJlc3NcbiIsCisJCQlhc2NpaV9hZGRyZXNzKTsKIAkJcmV0dXJuICgtMSk7CiAJfQogCiAJYWRkcmVzcyA9IChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpbG9uZ19hZGRyZXNzOwogCXN0YXR1cyA9IGFjcGlfb3NfZ2V0X3RhYmxlX2J5X2FkZHJlc3MoYWRkcmVzcywgJnRhYmxlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJYWNwaV9sb2dfZXJyb3IoIkNvdWxkIG5vdCBnZXQgdGFibGUgYXQgMHglOC44WCU4LjhYLCAlc1xuIiwKLQkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcyksCi0JCQkgICAgICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBnZXQgdGFibGUgYXQgMHglOC44WCU4LjhYLCAlc1xuIiwKKwkJCUFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzKSwKKwkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKTsKIAkJcmV0dXJuICgtMSk7CiAJfQogCkBAIC0zMzEsOSArMzMyLDkgQEAKIAlpbnQgdGFibGVfc3RhdHVzOwogCiAJaWYgKHN0cmxlbihzaWduYXR1cmUpICE9IEFDUElfTkFNRV9TSVpFKSB7Ci0JCWFjcGlfbG9nX2Vycm9yCi0JCSAgICAoIkludmFsaWQgdGFibGUgc2lnbmF0dXJlIFslc106IG11c3QgYmUgZXhhY3RseSA0IGNoYXJhY3RlcnNcbiIsCi0JCSAgICAgc2lnbmF0dXJlKTsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiSW52YWxpZCB0YWJsZSBzaWduYXR1cmUgWyVzXTogbXVzdCBiZSBleGFjdGx5IDQgY2hhcmFjdGVyc1xuIiwKKwkJCXNpZ25hdHVyZSk7CiAJCXJldHVybiAoLTEpOwogCX0KIApAQCAtMzYzLDkgKzM2NCw5IEBACiAJCQkJcmV0dXJuICgwKTsKIAkJCX0KIAotCQkJYWNwaV9sb2dfZXJyb3IKLQkJCSAgICAoIkNvdWxkIG5vdCBnZXQgQUNQSSB0YWJsZSB3aXRoIHNpZ25hdHVyZSBbJXNdLCAlc1xuIiwKLQkJCSAgICAgbG9jYWxfc2lnbmF0dXJlLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSk7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiQ291bGQgbm90IGdldCBBQ1BJIHRhYmxlIHdpdGggc2lnbmF0dXJlIFslc10sICVzXG4iLAorCQkJCWxvY2FsX3NpZ25hdHVyZSwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOwogCQkJcmV0dXJuICgtMSk7CiAJCX0KIApAQCAtNDA4LDI0ICs0MDksMjQgQEAKIAl9CiAKIAlpZiAoIWFjcGlfdXRfdmFsaWRfbmFtZXNlZyh0YWJsZS0+c2lnbmF0dXJlKSkgewotCQlhY3BpX2xvZ19lcnJvcgotCQkgICAgKCJObyB2YWxpZCBBQ1BJIHNpZ25hdHVyZSB3YXMgZm91bmQgaW4gaW5wdXQgZmlsZSAlc1xuIiwKLQkJICAgICBwYXRobmFtZSk7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIk5vIHZhbGlkIEFDUEkgc2lnbmF0dXJlIHdhcyBmb3VuZCBpbiBpbnB1dCBmaWxlICVzXG4iLAorCQkJcGF0aG5hbWUpOwogCX0KIAogCS8qIEZpbGUgbXVzdCBiZSBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSB0YWJsZSBsZW5ndGggKi8KIAogCWlmICh0YWJsZS0+bGVuZ3RoID4gZmlsZV9zaXplKSB7Ci0JCWFjcGlfbG9nX2Vycm9yCi0JCSAgICAoIlRhYmxlIGxlbmd0aCAoMHglWCkgaXMgdG9vIGxhcmdlIGZvciBpbnB1dCBmaWxlICgweCVYKSAlc1xuIiwKLQkJICAgICB0YWJsZS0+bGVuZ3RoLCBmaWxlX3NpemUsIHBhdGhuYW1lKTsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiVGFibGUgbGVuZ3RoICgweCVYKSBpcyB0b28gbGFyZ2UgZm9yIGlucHV0IGZpbGUgKDB4JVgpICVzXG4iLAorCQkJdGFibGUtPmxlbmd0aCwgZmlsZV9zaXplLCBwYXRobmFtZSk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlpZiAoZ2JsX3ZlcmJvc2VfbW9kZSkgewotCQlhY3BpX2xvZ19lcnJvcgotCQkgICAgKCJJbnB1dCBmaWxlOiAgJXMgY29udGFpbnMgdGFibGUgWyU0LjRzXSwgMHglWCAoJXUpIGJ5dGVzXG4iLAotCQkgICAgIHBhdGhuYW1lLCB0YWJsZS0+c2lnbmF0dXJlLCBmaWxlX3NpemUsIGZpbGVfc2l6ZSk7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIklucHV0IGZpbGU6ICAlcyBjb250YWlucyB0YWJsZSBbJTQuNHNdLCAweCVYICgldSkgYnl0ZXNcbiIsCisJCQlwYXRobmFtZSwgdGFibGUtPnNpZ25hdHVyZSwgZmlsZV9zaXplLCBmaWxlX3NpemUpOwogCX0KIAogCXRhYmxlX3N0YXR1cyA9IGFwX2R1bXBfdGFibGVfYnVmZmVyKHRhYmxlLCAwLCAwKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvYXBmaWxlcy5jIGIvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hcGZpbGVzLmMKaW5kZXggNWZjZDk3MC4uZGQ1Yjg2MSAxMDA2NDQKLS0tIGEvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hcGZpbGVzLmMKKysrIGIvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hcGZpbGVzLmMKQEAgLTQyLDcgKzQyLDYgQEAKICAqLwogCiAjaW5jbHVkZSAiYWNwaWR1bXAuaCIKLSNpbmNsdWRlICJhY2FwcHMuaCIKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwogCkBAIC02Niw3ICs2NSw4IEBACiAJc3RydWN0IHN0YXQgc3RhdF9pbmZvOwogCiAJaWYgKCFzdGF0KHBhdGhuYW1lLCAmc3RhdF9pbmZvKSkgewotCQlhY3BpX2xvZ19lcnJvcigiVGFyZ2V0IHBhdGggYWxyZWFkeSBleGlzdHMsIG92ZXJ3cml0ZT8gW3l8bl0gIik7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIlRhcmdldCBwYXRoIGFscmVhZHkgZXhpc3RzLCBvdmVyd3JpdGU/IFt5fG5dICIpOwogCiAJCWlmIChnZXRjaGFyKCkgIT0gJ3knKSB7CiAJCQlyZXR1cm4gKC0xKTsKQEAgLTEwMiw5ICsxMDIsOSBAQAogCiAJLyogUG9pbnQgc3Rkb3V0IHRvIHRoZSBmaWxlICovCiAKLQlmaWxlID0gYWNwaV9vc19vcGVuX2ZpbGUocGF0aG5hbWUsIEFDUElfRklMRV9XUklUSU5HKTsKKwlmaWxlID0gZm9wZW4ocGF0aG5hbWUsICJ3Iik7CiAJaWYgKCFmaWxlKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCJDb3VsZCBub3Qgb3BlbiBvdXRwdXQgZmlsZTogJXNcbiIsIHBhdGhuYW1lKTsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBvdXRwdXQgZmlsZTogJXNcbiIsIHBhdGhuYW1lKTsKIAkJcmV0dXJuICgtMSk7CiAJfQogCkBAIC0xMzQsNyArMTM0LDcgQEAKIAljaGFyIGZpbGVuYW1lW0FDUElfTkFNRV9TSVpFICsgMTZdOwogCWNoYXIgaW5zdGFuY2Vfc3RyWzE2XTsKIAlBQ1BJX0ZJTEUgZmlsZTsKLQlzaXplX3QgYWN0dWFsOworCWFjcGlfc2l6ZSBhY3R1YWw7CiAJdTMyIHRhYmxlX2xlbmd0aDsKIAogCS8qIE9idGFpbiB0YWJsZSBsZW5ndGggKi8KQEAgLTE1OCwzNyArMTU4LDM2IEBACiAJLyogSGFuZGxlIG11bHRpcGxlIFNTRHRzIC0gY3JlYXRlIGRpZmZlcmVudCBmaWxlbmFtZXMgZm9yIGVhY2ggKi8KIAogCWlmIChpbnN0YW5jZSA+IDApIHsKLQkJYWNwaV91dF9zbnByaW50ZihpbnN0YW5jZV9zdHIsIHNpemVvZihpbnN0YW5jZV9zdHIpLCAiJXUiLAotCQkJCSBpbnN0YW5jZSk7CisJCXNucHJpbnRmKGluc3RhbmNlX3N0ciwgc2l6ZW9mKGluc3RhbmNlX3N0ciksICIldSIsIGluc3RhbmNlKTsKIAkJc3RyY2F0KGZpbGVuYW1lLCBpbnN0YW5jZV9zdHIpOwogCX0KIAogCXN0cmNhdChmaWxlbmFtZSwgRklMRV9TVUZGSVhfQklOQVJZX1RBQkxFKTsKIAogCWlmIChnYmxfdmVyYm9zZV9tb2RlKSB7Ci0JCWFjcGlfbG9nX2Vycm9yCi0JCSAgICAoIldyaXRpbmcgWyU0LjRzXSB0byBiaW5hcnkgZmlsZTogJXMgMHglWCAoJXUpIGJ5dGVzXG4iLAotCQkgICAgIHRhYmxlLT5zaWduYXR1cmUsIGZpbGVuYW1lLCB0YWJsZS0+bGVuZ3RoLCB0YWJsZS0+bGVuZ3RoKTsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiV3JpdGluZyBbJTQuNHNdIHRvIGJpbmFyeSBmaWxlOiAlcyAweCVYICgldSkgYnl0ZXNcbiIsCisJCQl0YWJsZS0+c2lnbmF0dXJlLCBmaWxlbmFtZSwgdGFibGUtPmxlbmd0aCwKKwkJCXRhYmxlLT5sZW5ndGgpOwogCX0KIAogCS8qIE9wZW4gdGhlIGZpbGUgYW5kIGR1bXAgdGhlIGVudGlyZSB0YWJsZSBpbiBiaW5hcnkgbW9kZSAqLwogCi0JZmlsZSA9IGFjcGlfb3Nfb3Blbl9maWxlKGZpbGVuYW1lLAotCQkJCSBBQ1BJX0ZJTEVfV1JJVElORyB8IEFDUElfRklMRV9CSU5BUlkpOworCWZpbGUgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7CiAJaWYgKCFmaWxlKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCJDb3VsZCBub3Qgb3BlbiBvdXRwdXQgZmlsZTogJXNcbiIsIGZpbGVuYW1lKTsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBvdXRwdXQgZmlsZTogJXNcbiIsIGZpbGVuYW1lKTsKIAkJcmV0dXJuICgtMSk7CiAJfQogCi0JYWN0dWFsID0gYWNwaV9vc193cml0ZV9maWxlKGZpbGUsIHRhYmxlLCAxLCB0YWJsZV9sZW5ndGgpOworCWFjdHVhbCA9IGZ3cml0ZSh0YWJsZSwgMSwgdGFibGVfbGVuZ3RoLCBmaWxlKTsKIAlpZiAoYWN0dWFsICE9IHRhYmxlX2xlbmd0aCkgewotCQlhY3BpX2xvZ19lcnJvcigiRXJyb3Igd3JpdGluZyBiaW5hcnkgb3V0cHV0IGZpbGU6ICVzXG4iLAotCQkJICAgICAgIGZpbGVuYW1lKTsKLQkJYWNwaV9vc19jbG9zZV9maWxlKGZpbGUpOworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdyaXRpbmcgYmluYXJ5IG91dHB1dCBmaWxlOiAlc1xuIiwKKwkJCWZpbGVuYW1lKTsKKwkJZmNsb3NlKGZpbGUpOwogCQlyZXR1cm4gKC0xKTsKIAl9CiAKLQlhY3BpX29zX2Nsb3NlX2ZpbGUoZmlsZSk7CisJZmNsb3NlKGZpbGUpOwogCXJldHVybiAoMCk7CiB9CiAKQEAgLTIxMSwxNCArMjEwLDEzIEBACiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpidWZmZXIgPSBOVUxMOwogCUFDUElfRklMRSBmaWxlOwogCXUzMiBmaWxlX3NpemU7Ci0Jc2l6ZV90IGFjdHVhbDsKKwlhY3BpX3NpemUgYWN0dWFsOwogCiAJLyogTXVzdCB1c2UgYmluYXJ5IG1vZGUgKi8KIAotCWZpbGUgPQotCSAgICBhY3BpX29zX29wZW5fZmlsZShwYXRobmFtZSwgQUNQSV9GSUxFX1JFQURJTkcgfCBBQ1BJX0ZJTEVfQklOQVJZKTsKKwlmaWxlID0gZm9wZW4ocGF0aG5hbWUsICJyYiIpOwogCWlmICghZmlsZSkgewotCQlhY3BpX2xvZ19lcnJvcigiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZTogJXNcbiIsIHBhdGhuYW1lKTsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlOiAlc1xuIiwgcGF0aG5hbWUpOwogCQlyZXR1cm4gKE5VTEwpOwogCX0KIApAQCAtMjI2LDcgKzIyNCw4IEBACiAKIAlmaWxlX3NpemUgPSBjbV9nZXRfZmlsZV9zaXplKGZpbGUpOwogCWlmIChmaWxlX3NpemUgPT0gQUNQSV9VSU5UMzJfTUFYKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCJDb3VsZCBub3QgZ2V0IGlucHV0IGZpbGUgc2l6ZTogJXNcbiIsIHBhdGhuYW1lKTsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiQ291bGQgbm90IGdldCBpbnB1dCBmaWxlIHNpemU6ICVzXG4iLCBwYXRobmFtZSk7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKQEAgLTIzNCwxNiArMjMzLDE3IEBACiAKIAlidWZmZXIgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChmaWxlX3NpemUpOwogCWlmICghYnVmZmVyKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCJDb3VsZCBub3QgYWxsb2NhdGUgZmlsZSBidWZmZXIgb2Ygc2l6ZTogJXVcbiIsCi0JCQkgICAgICAgZmlsZV9zaXplKTsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiQ291bGQgbm90IGFsbG9jYXRlIGZpbGUgYnVmZmVyIG9mIHNpemU6ICV1XG4iLAorCQkJZmlsZV9zaXplKTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIFJlYWQgdGhlIGVudGlyZSBmaWxlICovCiAKLQlhY3R1YWwgPSBhY3BpX29zX3JlYWRfZmlsZShmaWxlLCBidWZmZXIsIDEsIGZpbGVfc2l6ZSk7CisJYWN0dWFsID0gZnJlYWQoYnVmZmVyLCAxLCBmaWxlX3NpemUsIGZpbGUpOwogCWlmIChhY3R1YWwgIT0gZmlsZV9zaXplKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCJDb3VsZCBub3QgcmVhZCBpbnB1dCBmaWxlOiAlc1xuIiwgcGF0aG5hbWUpOworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCByZWFkIGlucHV0IGZpbGU6ICVzXG4iLCBwYXRobmFtZSk7CiAJCUFDUElfRlJFRShidWZmZXIpOwogCQlidWZmZXIgPSBOVUxMOwogCQlnb3RvIGNsZWFudXA7CkBAIC0yNTIsNiArMjUyLDYgQEAKIAkqb3V0X2ZpbGVfc2l6ZSA9IGZpbGVfc2l6ZTsKIAogY2xlYW51cDoKLQlhY3BpX29zX2Nsb3NlX2ZpbGUoZmlsZSk7CisJZmNsb3NlKGZpbGUpOwogCXJldHVybiAoYnVmZmVyKTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvYXBtYWluLmMgYi90b29scy9wb3dlci9hY3BpL3Rvb2xzL2FjcGlkdW1wL2FwbWFpbi5jCmluZGV4IDc2OTJlNmIuLjdmZjQ2YmUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvYXBtYWluLmMKKysrIGIvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hcG1haW4uYwpAQCAtNDMsNyArNDMsNiBAQAogCiAjZGVmaW5lIF9ERUNMQVJFX0dMT0JBTFMKICNpbmNsdWRlICJhY3BpZHVtcC5oIgotI2luY2x1ZGUgImFjYXBwcy5oIgogCiAvKgogICogYWNwaWR1bXAgLSBBIHBvcnRhYmxlIHV0aWxpdHkgZm9yIG9idGFpbmluZyBzeXN0ZW0gQUNQSSB0YWJsZXMgYW5kIGR1bXBpbmcKQEAgLTE0MCw4ICsxMzksOCBAQAogCiAJY3VycmVudF9hY3Rpb24rKzsKIAlpZiAoY3VycmVudF9hY3Rpb24gPiBBUF9NQVhfQUNUSU9OUykgewotCQlhY3BpX2xvZ19lcnJvcigiVG9vIG1hbnkgdGFibGUgb3B0aW9ucyAobWF4ICV1KVxuIiwKLQkJCSAgICAgICBBUF9NQVhfQUNUSU9OUyk7CisJCWZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgdGFibGUgb3B0aW9ucyAobWF4ICV1KVxuIiwKKwkJCUFQX01BWF9BQ1RJT05TKTsKIAkJcmV0dXJuICgtMSk7CiAJfQogCkBAIC0xODYsOSArMTg1LDkgQEAKIAkJCX0gZWxzZSBpZiAoIXN0cmNtcChhY3BpX2dibF9vcHRhcmcsICJvZmYiKSkgewogCQkJCWdibF9kdW1wX2N1c3RvbWl6ZWRfdGFibGVzID0gRkFMU0U7CiAJCQl9IGVsc2UgewotCQkJCWFjcGlfbG9nX2Vycm9yCi0JCQkJICAgICgiJXM6IENhbm5vdCBoYW5kbGUgdGhpcyBzd2l0Y2gsIHBsZWFzZSB1c2Ugb258b2ZmXG4iLAotCQkJCSAgICAgYWNwaV9nYmxfb3B0YXJnKTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIiVzOiBDYW5ub3QgaGFuZGxlIHRoaXMgc3dpdGNoLCBwbGVhc2UgdXNlIG9ufG9mZlxuIiwKKwkJCQkJYWNwaV9nYmxfb3B0YXJnKTsKIAkJCQlyZXR1cm4gKC0xKTsKIAkJCX0KIAkJCWNvbnRpbnVlOwpAQCAtMjA5LDEzICsyMDgsMTMgQEAKIAkJY2FzZSAncic6CS8qIER1bXAgdGFibGVzIGZyb20gc3BlY2lmaWVkIFJTRFAgKi8KIAogCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX3V0X3N0cnRvdWw2NChhY3BpX2dibF9vcHRhcmcsIEFDUElfQU5ZX0JBU0UsCi0JCQkJCSAgICAgIEFDUElfTUFYNjRfQllURV9XSURUSCwKKwkJCSAgICBhY3BpX3V0X3N0cnRvdWw2NChhY3BpX2dibF9vcHRhcmcsCisJCQkJCSAgICAgIEFDUElfU1RSVE9VTF82NEJJVCwKIAkJCQkJICAgICAgJmdibF9yc2RwX2Jhc2UpOwogCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJYWNwaV9sb2dfZXJyb3IKLQkJCQkgICAgKCIlczogQ291bGQgbm90IGNvbnZlcnQgdG8gYSBwaHlzaWNhbCBhZGRyZXNzXG4iLAotCQkJCSAgICAgYWNwaV9nYmxfb3B0YXJnKTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIiVzOiBDb3VsZCBub3QgY29udmVydCB0byBhIHBoeXNpY2FsIGFkZHJlc3NcbiIsCisJCQkJCWFjcGlfZ2JsX29wdGFyZyk7CiAJCQkJcmV0dXJuICgtMSk7CiAJCQl9CiAJCQljb250aW51ZTsKQEAgLTI0Miw3ICsyNDEsNyBAQAogCQljYXNlICd6JzoJLyogVmVyYm9zZSBtb2RlICovCiAKIAkJCWdibF92ZXJib3NlX21vZGUgPSBUUlVFOwotCQkJYWNwaV9sb2dfZXJyb3IoQUNQSV9DT01NT05fU0lHTk9OKEFQX1VUSUxJVFlfTkFNRSkpOworCQkJZnByaW50ZihzdGRlcnIsIEFDUElfQ09NTU9OX1NJR05PTihBUF9VVElMSVRZX05BTUUpKTsKIAkJCWNvbnRpbnVlOwogCiAJCQkvKgpAQCAtMzE1LDYgKzMxNCw3IEBACiAJQUNQSV9ERUJVR19JTklUSUFMSVpFKCk7CS8qIEZvciBkZWJ1ZyB2ZXJzaW9uIG9ubHkgKi8KIAlhY3BpX29zX2luaXRpYWxpemUoKTsKIAlnYmxfb3V0cHV0X2ZpbGUgPSBBQ1BJX0ZJTEVfT1VUOworCWFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCA9IDg7CiAKIAkvKiBQcm9jZXNzIGNvbW1hbmQgbGluZSBvcHRpb25zICovCiAKQEAgLTM1Myw4ICszNTMsOSBAQAogCiAJCWRlZmF1bHQ6CiAKLQkJCWFjcGlfbG9nX2Vycm9yKCJJbnRlcm5hbCBlcnJvciwgaW52YWxpZCBhY3Rpb246IDB4JVhcbiIsCi0JCQkJICAgICAgIGFjdGlvbi0+dG9fYmVfZG9uZSk7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiSW50ZXJuYWwgZXJyb3IsIGludmFsaWQgYWN0aW9uOiAweCVYXG4iLAorCQkJCWFjdGlvbi0+dG9fYmVfZG9uZSk7CiAJCQlyZXR1cm4gKC0xKTsKIAkJfQogCkBAIC0zNjksMTIgKzM3MCwxMiBAQAogCQkJLyogU3VtbWFyeSBmb3IgdGhlIG91dHB1dCBmaWxlICovCiAKIAkJCWZpbGVfc2l6ZSA9IGNtX2dldF9maWxlX3NpemUoZ2JsX291dHB1dF9maWxlKTsKLQkJCWFjcGlfbG9nX2Vycm9yCi0JCQkgICAgKCJPdXRwdXQgZmlsZSAlcyBjb250YWlucyAweCVYICgldSkgYnl0ZXNcblxuIiwKLQkJCSAgICAgZ2JsX291dHB1dF9maWxlbmFtZSwgZmlsZV9zaXplLCBmaWxlX3NpemUpOworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIk91dHB1dCBmaWxlICVzIGNvbnRhaW5zIDB4JVggKCV1KSBieXRlc1xuXG4iLAorCQkJCWdibF9vdXRwdXRfZmlsZW5hbWUsIGZpbGVfc2l6ZSwgZmlsZV9zaXplKTsKIAkJfQogCi0JCWFjcGlfb3NfY2xvc2VfZmlsZShnYmxfb3V0cHV0X2ZpbGUpOworCQlmY2xvc2UoZ2JsX291dHB1dF9maWxlKTsKIAl9CiAKIAlyZXR1cm4gKHN0YXR1cyk7CmRpZmYgLS1naXQgYS90b29scy9zcGkvTWFrZWZpbGUgYi90b29scy9zcGkvTWFrZWZpbGUKaW5kZXggY2QwZGI2Mi4uMzgxNWIxOCAxMDA2NDQKLS0tIGEvdG9vbHMvc3BpL01ha2VmaWxlCisrKyBiL3Rvb2xzL3NwaS9NYWtlZmlsZQpAQCAtMSwzICsxLDUgQEAKK0NDID0gJChDUk9TU19DT01QSUxFKWdjYworCiBhbGw6IHNwaWRldl90ZXN0IHNwaWRldl9mZHgKIAogY2xlYW46CmRpZmYgLS1naXQgYS90b29scy9zcGkvc3BpZGV2X3Rlc3QuYyBiL3Rvb2xzL3NwaS9zcGlkZXZfdGVzdC5jCmluZGV4IDhhNzNkODEuLmYwNDZiNzcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3NwaS9zcGlkZXZfdGVzdC5jCisrKyBiL3Rvb2xzL3NwaS9zcGlkZXZfdGVzdC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8Z2V0b3B0Lmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpZGV2Lmg+CkBAIC0yODQsNyArMjg1LDcgQEAKIAogc3RhdGljIHZvaWQgdHJhbnNmZXJfZXNjYXBlZF9zdHJpbmcoaW50IGZkLCBjaGFyICpzdHIpCiB7Ci0Jc2l6ZV90IHNpemUgPSBzdHJsZW4oc3RyICsgMSk7CisJc2l6ZV90IHNpemUgPSBzdHJsZW4oc3RyKTsKIAl1aW50OF90ICp0eDsKIAl1aW50OF90ICpyeDsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9udmRpbW0vdGVzdC9uZml0LmMgYi90b29scy90ZXN0aW5nL252ZGltbS90ZXN0L25maXQuYwppbmRleCBkZDQ4ZjQyLi5mNjRjNTdiIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL252ZGltbS90ZXN0L25maXQuYworKysgYi90b29scy90ZXN0aW5nL252ZGltbS90ZXN0L25maXQuYwpAQCAtNjAzLDcgKzYwMyw4IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJc3ByaW50Zih0LT5sYWJlbFtpXSwgImxhYmVsJWQiLCBpKTsKIAotCQl0LT5mbHVzaFtpXSA9IHRlc3RfYWxsb2ModCwgc2l6ZW9mKHU2NCkgKiBOVU1fSElOVFMsCisJCXQtPmZsdXNoW2ldID0gdGVzdF9hbGxvYyh0LCBtYXgoUEFHRV9TSVpFLAorCQkJCQlzaXplb2YodTY0KSAqIE5VTV9ISU5UUyksCiAJCQkJJnQtPmZsdXNoX2RtYVtpXSk7CiAJCWlmICghdC0+Zmx1c2hbaV0pCiAJCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9NYWtlZmlsZQppbmRleCAzYjUzMDQ2Li45ZDA5MTllZCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKIAotQ0ZMQUdTICs9IC1JLiAtZyAtV2FsbCAtRF9MR1BMX1NPVVJDRQorQ0ZMQUdTICs9IC1JLiAtZyAtTzIgLVdhbGwgLURfTEdQTF9TT1VSQ0UKIExERkxBR1MgKz0gLWxwdGhyZWFkIC1sdXJjdQogVEFSR0VUUyA9IG1haW4KIE9GSUxFUyA9IG1haW4ubyByYWRpeC10cmVlLm8gbGludXgubyB0ZXN0Lm8gdGFnX2NoZWNrLm8gZmluZF9uZXh0X2JpdC5vIFwKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9saW51eC9jcHUuaCBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9saW51eC9jcHUuaAppbmRleCA2MGE0MDQ1Li43Y2Y0MTIxIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbGludXgvY3B1LmgKKysrIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xpbnV4L2NwdS5oCkBAIC03LDE5ICs3LDggQEAKICNkZWZpbmUgQ1BVX0RPV05fUFJFUEFSRQkweDAwMDUgLyogQ1BVICh1bnNpZ25lZCl2IGdvaW5nIGRvd24gKi8KICNkZWZpbmUgQ1BVX0RPV05fRkFJTEVECQkweDAwMDYgLyogQ1BVICh1bnNpZ25lZCl2IE5PVCBnb2luZyBkb3duICovCiAjZGVmaW5lIENQVV9ERUFECQkweDAwMDcgLyogQ1BVICh1bnNpZ25lZCl2IGRlYWQgKi8KLSNkZWZpbmUgQ1BVX0RZSU5HCQkweDAwMDggLyogQ1BVICh1bnNpZ25lZCl2IG5vdCBydW5uaW5nIGFueSB0YXNrLAotCQkJCQkqIG5vdCBoYW5kbGluZyBpbnRlcnJ1cHRzLCBzb29uIGRlYWQuCi0JCQkJCSogQ2FsbGVkIG9uIHRoZSBkeWluZyBjcHUsIGludGVycnVwdHMKLQkJCQkJKiBhcmUgYWxyZWFkeSBkaXNhYmxlZC4gTXVzdCBub3QKLQkJCQkJKiBzbGVlcCwgbXVzdCBub3QgZmFpbCAqLwogI2RlZmluZSBDUFVfUE9TVF9ERUFECQkweDAwMDkgLyogQ1BVICh1bnNpZ25lZCl2IGRlYWQsIGNwdV9ob3RwbHVnCiAJCQkJCSogbG9jayBpcyBkcm9wcGVkICovCi0jZGVmaW5lIENQVV9TVEFSVElORwkJMHgwMDBBIC8qIENQVSAodW5zaWduZWQpdiBzb29uIHJ1bm5pbmcuCi0JCQkJCSogQ2FsbGVkIG9uIHRoZSBuZXcgY3B1LCBqdXN0IGJlZm9yZQotCQkJCQkqIGVuYWJsaW5nIGludGVycnVwdHMuIE11c3Qgbm90IHNsZWVwLAotCQkJCQkqIG11c3Qgbm90IGZhaWwgKi8KLSNkZWZpbmUgQ1BVX0RZSU5HX0lETEUJCTB4MDAwQiAvKiBDUFUgKHVuc2lnbmVkKXYgZHlpbmcsIHJlYWNoZWQKLQkJCQkJKiBpZGxlIGxvb3AuICovCiAjZGVmaW5lIENQVV9CUk9LRU4JCTB4MDAwQyAvKiBDUFUgKHVuc2lnbmVkKXYgZGlkIG5vdCBkaWUgcHJvcGVybHksCiAJCQkJCSogcGVyaGFwcyBkdWUgdG8gcHJlZW1wdGlvbi4gKi8KICNkZWZpbmUgQ1BVX1RBU0tTX0ZST1pFTgkweDAwMTAKQEAgLTMwLDUgKzE5LDMgQEAKICNkZWZpbmUgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU4gKENQVV9ET1dOX1BSRVBBUkUgfCBDUFVfVEFTS1NfRlJPWkVOKQogI2RlZmluZSBDUFVfRE9XTl9GQUlMRURfRlJPWkVOICAoQ1BVX0RPV05fRkFJTEVEIHwgQ1BVX1RBU0tTX0ZST1pFTikKICNkZWZpbmUgQ1BVX0RFQURfRlJPWkVOCQkoQ1BVX0RFQUQgfCBDUFVfVEFTS1NfRlJPWkVOKQotI2RlZmluZSBDUFVfRFlJTkdfRlJPWkVOCShDUFVfRFlJTkcgfCBDUFVfVEFTS1NfRlJPWkVOKQotI2RlZmluZSBDUFVfU1RBUlRJTkdfRlJPWkVOCShDUFVfU1RBUlRJTkcgfCBDUFVfVEFTS1NfRlJPWkVOKQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL211bHRpb3JkZXIuYyBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9tdWx0aW9yZGVyLmMKaW5kZXggMzlkOWI5NS4uMDVkN2JjNCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL211bHRpb3JkZXIuYworKysgYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbXVsdGlvcmRlci5jCkBAIC0xMjQsNiArMTI0LDggQEAKIAl1bnNpZ25lZCBsb25nIGk7CiAJdW5zaWduZWQgbG9uZyBtaW4gPSBpbmRleCAmIH4oKDFVTCA8PCBvcmRlcikgLSAxKTsKIAl1bnNpZ25lZCBsb25nIG1heCA9IG1pbiArICgxVUwgPDwgb3JkZXIpOworCXZvaWQgKipzbG90OworCXN0cnVjdCBpdGVtICppdGVtMiA9IGl0ZW1fY3JlYXRlKG1pbik7CiAJUkFESVhfVFJFRSh0cmVlLCBHRlBfS0VSTkVMKTsKIAogCXByaW50ZigiTXVsdGlvcmRlciBpbmRleCAlbGQsIG9yZGVyICVkXG4iLCBpbmRleCwgb3JkZXIpOwpAQCAtMTM5LDEzICsxNDEsMTkgQEAKIAkJaXRlbV9jaGVja19hYnNlbnQoJnRyZWUsIGkpOwogCWZvciAoaSA9IG1heDsgaSA8IDIqbWF4OyBpKyspCiAJCWl0ZW1fY2hlY2tfYWJzZW50KCZ0cmVlLCBpKTsKKwlmb3IgKGkgPSBtaW47IGkgPCBtYXg7IGkrKykKKwkJYXNzZXJ0KHJhZGl4X3RyZWVfaW5zZXJ0KCZ0cmVlLCBpLCBpdGVtMikgPT0gLUVFWElTVCk7CisKKwlzbG90ID0gcmFkaXhfdHJlZV9sb29rdXBfc2xvdCgmdHJlZSwgaW5kZXgpOworCWZyZWUoKnNsb3QpOworCXJhZGl4X3RyZWVfcmVwbGFjZV9zbG90KHNsb3QsIGl0ZW0yKTsKIAlmb3IgKGkgPSBtaW47IGkgPCBtYXg7IGkrKykgewotCQlzdGF0aWMgdm9pZCAqZW50cnkgPSAodm9pZCAqKQotCQkJCQkoMHhBMCB8IFJBRElYX1RSRUVfRVhDRVBUSU9OQUxfRU5UUlkpOwotCQlhc3NlcnQocmFkaXhfdHJlZV9pbnNlcnQoJnRyZWUsIGksIGVudHJ5KSA9PSAtRUVYSVNUKTsKKwkJc3RydWN0IGl0ZW0gKml0ZW0gPSBpdGVtX2xvb2t1cCgmdHJlZSwgaSk7CisJCWFzc2VydChpdGVtICE9IDApOworCQlhc3NlcnQoaXRlbS0+aW5kZXggPT0gbWluKTsKIAl9CiAKLQlhc3NlcnQoaXRlbV9kZWxldGUoJnRyZWUsIGluZGV4KSAhPSAwKTsKKwlhc3NlcnQoaXRlbV9kZWxldGUoJnRyZWUsIG1pbikgIT0gMCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMiptYXg7IGkrKykKIAkJaXRlbV9jaGVja19hYnNlbnQoJnRyZWUsIGkpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMveDg2L3B0cmFjZV9zeXNjYWxsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy94ODYvcHRyYWNlX3N5c2NhbGwuYwppbmRleCA0MjE0NTY3Li5iMDM3Y2U5YyAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMveDg2L3B0cmFjZV9zeXNjYWxsLmMKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMveDg2L3B0cmFjZV9zeXNjYWxsLmMKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCWlmIChhcmdzLm5yICE9IGdldHBpZCgpIHx8CiAJICAgIGFyZ3MuYXJnMCAhPSAxMCB8fCBhcmdzLmFyZzEgIT0gMTEgfHwgYXJncy5hcmcyICE9IDEyIHx8CiAJICAgIGFyZ3MuYXJnMyAhPSAxMyB8fCBhcmdzLmFyZzQgIT0gMTQgfHwgYXJncy5hcmc1ICE9IDE1KSB7Ci0JCXByaW50ZigiW0ZBSUxdXHRnZXRwaWQoKSBmYWlsZWQgdG8gcHJlc2V2ZSByZWdzXG4iKTsKKwkJcHJpbnRmKCJbRkFJTF1cdGdldHBpZCgpIGZhaWxlZCB0byBwcmVzZXJ2ZSByZWdzXG4iKTsKIAkJbmVycnMrKzsKIAl9IGVsc2UgewogCQlwcmludGYoIltPS11cdGdldHBpZCgpIHByZXNlcnZlcyByZWdzXG4iKTsKQEAgLTE2Miw3ICsxNjIsNyBAQAogCWlmIChhcmdzLm5yICE9IDAgfHwKIAkgICAgYXJncy5hcmcwICE9IGdldHBpZCgpIHx8IGFyZ3MuYXJnMSAhPSBTSUdVU1IxIHx8IGFyZ3MuYXJnMiAhPSAxMiB8fAogCSAgICBhcmdzLmFyZzMgIT0gMTMgfHwgYXJncy5hcmc0ICE9IDE0IHx8IGFyZ3MuYXJnNSAhPSAxNSkgewotCQlwcmludGYoIltGQUlMXVx0a2lsbChnZXRwaWQoKSwgU0lHVVNSMSkgZmFpbGVkIHRvIHByZXNldmUgcmVnc1xuIik7CisJCXByaW50ZigiW0ZBSUxdXHRraWxsKGdldHBpZCgpLCBTSUdVU1IxKSBmYWlsZWQgdG8gcHJlc2VydmUgcmVnc1xuIik7CiAJCW5lcnJzKys7CiAJfSBlbHNlIHsKIAkJcHJpbnRmKCJbT0tdXHRraWxsKGdldHBpZCgpLCBTSUdVU1IxKSBwcmVzZXJ2ZXMgcmVnc1xuIik7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy94ODYvc2lncmV0dXJuLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy94ODYvc2lncmV0dXJuLmMKaW5kZXggOGE1NzdlNy4uMjQ2MTQ1YiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMveDg2L3NpZ3JldHVybi5jCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3g4Ni9zaWdyZXR1cm4uYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAgICAgICIudHlwZSBpbnQzLCBAZnVuY3Rpb25cblx0IgogICAgICAiLmFsaWduIDQwOTZcblx0IgogICAgICAiaW50Mzpcblx0IgotICAgICAibW92ICVzcywlZWF4XG5cdCIKKyAgICAgIm1vdiAlc3MsJWVjeFxuXHQiCiAgICAgICJpbnQzXG5cdCIKICAgICAgIi5zaXplIGludDMsIC4gLSBpbnQzXG5cdCIKICAgICAgIi5hbGlnbiA0MDk2LCAweGNjXG5cdCIKQEAgLTMwNiw3ICszMDYsNyBAQAogI2lmZGVmIF9feDg2XzY0X18KICMgZGVmaW5lIFJFR19JUCBSRUdfUklQCiAjIGRlZmluZSBSRUdfU1AgUkVHX1JTUAotIyBkZWZpbmUgUkVHX0FYIFJFR19SQVgKKyMgZGVmaW5lIFJFR19DWCBSRUdfUkNYCiAKIHN0cnVjdCBzZWxlY3RvcnMgewogCXVuc2lnbmVkIHNob3J0IGNzLCBncywgZnMsIHNzOwpAQCAtMzI2LDcgKzMyNiw3IEBACiAjZWxzZQogIyBkZWZpbmUgUkVHX0lQIFJFR19FSVAKICMgZGVmaW5lIFJFR19TUCBSRUdfRVNQCi0jIGRlZmluZSBSRUdfQVggUkVHX0VBWAorIyBkZWZpbmUgUkVHX0NYIFJFR19FQ1gKIAogc3RhdGljIGdyZWdfdCAqc3NwdHIodWNvbnRleHRfdCAqY3R4KQogewpAQCAtNDU3LDEwICs0NTcsMTAgQEAKIAljdHgtPnVjX21jb250ZXh0LmdyZWdzW1JFR19JUF0gPQogCQlzaWdfY3MgPT0gY29kZTE2X3NlbCA/IDAgOiAodW5zaWduZWQgbG9uZykmaW50MzsKIAljdHgtPnVjX21jb250ZXh0LmdyZWdzW1JFR19TUF0gPSAodW5zaWduZWQgbG9uZykweDhiYWRmMDBkNWFhZGMwZGVVTEw7Ci0JY3R4LT51Y19tY29udGV4dC5ncmVnc1tSRUdfQVhdID0gMDsKKwljdHgtPnVjX21jb250ZXh0LmdyZWdzW1JFR19DWF0gPSAwOwogCiAJbWVtY3B5KCZyZXF1ZXN0ZWRfcmVncywgJmN0eC0+dWNfbWNvbnRleHQuZ3JlZ3MsIHNpemVvZihncmVnc2V0X3QpKTsKLQlyZXF1ZXN0ZWRfcmVnc1tSRUdfQVhdID0gKnNzcHRyKGN0eCk7CS8qIFRoZSBhc20gY29kZSBkb2VzIHRoaXMuICovCisJcmVxdWVzdGVkX3JlZ3NbUkVHX0NYXSA9ICpzc3B0cihjdHgpOwkvKiBUaGUgYXNtIGNvZGUgZG9lcyB0aGlzLiAqLwogCiAJcmV0dXJuOwogfQpAQCAtNDgyLDcgKzQ4Miw3IEBACiAJdW5zaWduZWQgc2hvcnQgc3M7CiAJYXNtICgibW92ICUlc3MsJTAiIDogIj1yIiAoc3MpKTsKIAotCWdyZWdfdCBhc21fc3MgPSBjdHgtPnVjX21jb250ZXh0LmdyZWdzW1JFR19BWF07CisJZ3JlZ190IGFzbV9zcyA9IGN0eC0+dWNfbWNvbnRleHQuZ3JlZ3NbUkVHX0NYXTsKIAlpZiAoYXNtX3NzICE9IHNpZ19zcyAmJiBzaWcgPT0gU0lHVFJBUCkgewogCQkvKiBTYW5pdHkgY2hlY2sgZmFpbHVyZS4gKi8KIAkJcHJpbnRmKCJbRkFJTF1cdFNJR1RSQVA6IHNzID0gJWh4LCBmcmFtZSBzcyA9ICVoeCwgYXggPSAlbGx4XG4iLApAQCAtNjU0LDggKzY1NCw4IEBACiAjZW5kaWYKIAogCQkvKiBTYW5pdHkgY2hlY2sgb24gdGhlIGtlcm5lbCAqLwotCQlpZiAoaSA9PSBSRUdfQVggJiYgcmVxdWVzdGVkX3JlZ3NbaV0gIT0gcmVzdWx0aW5nX3JlZ3NbaV0pIHsKLQkJCXByaW50ZigiW0ZBSUxdXHRBWCAoc2F2ZWQgU1ApIG1pc21hdGNoOiByZXF1ZXN0ZWQgMHglbGx4OyBnb3QgMHglbGx4XG4iLAorCQlpZiAoaSA9PSBSRUdfQ1ggJiYgcmVxdWVzdGVkX3JlZ3NbaV0gIT0gcmVzdWx0aW5nX3JlZ3NbaV0pIHsKKwkJCXByaW50ZigiW0ZBSUxdXHRDWCAoc2F2ZWQgU1ApIG1pc21hdGNoOiByZXF1ZXN0ZWQgMHglbGx4OyBnb3QgMHglbGx4XG4iLAogCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmVxdWVzdGVkX3JlZ3NbaV0sCiAJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXN1bHRpbmdfcmVnc1tpXSk7CiAJCQluZXJycysrOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdmlydGlvL2xpbnV4L2RtYS1tYXBwaW5nLmggYi90b29scy92aXJ0aW8vbGludXgvZG1hLW1hcHBpbmcuaAppbmRleCA0ZjkzYWY4Li4xODYwMWY2IDEwMDY0NAotLS0gYS90b29scy92aXJ0aW8vbGludXgvZG1hLW1hcHBpbmcuaAorKysgYi90b29scy92aXJ0aW8vbGludXgvZG1hLW1hcHBpbmcuaApAQCAtMTQsNCArMTQsMjAgQEAKIAlETUFfTk9ORSA9IDMsCiB9OwogCisjZGVmaW5lIGRtYV9hbGxvY19jb2hlcmVudChkLCBzLCBocCwgZikgKHsgXAorCXZvaWQgKl9fZG1hX2FsbG9jX2NvaGVyZW50X3AgPSBrbWFsbG9jKChzKSwgKGYpKTsgXAorCSooaHApID0gKHVuc2lnbmVkIGxvbmcpX19kbWFfYWxsb2NfY29oZXJlbnRfcDsgXAorCV9fZG1hX2FsbG9jX2NvaGVyZW50X3A7IFwKK30pCisKKyNkZWZpbmUgZG1hX2ZyZWVfY29oZXJlbnQoZCwgcywgcCwgaCkga2ZyZWUocCkKKworI2RlZmluZSBkbWFfbWFwX3BhZ2UoZCwgcCwgbywgcywgZGlyKSAocGFnZV90b19waHlzKHApICsgKG8pKQorCisjZGVmaW5lIGRtYV9tYXBfc2luZ2xlKGQsIHAsIHMsIGRpcikgKHZpcnRfdG9fcGh5cyhwKSkKKyNkZWZpbmUgZG1hX21hcHBpbmdfZXJyb3IoLi4uKSAoMCkKKworI2RlZmluZSBkbWFfdW5tYXBfc2luZ2xlKC4uLikgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBkbWFfdW5tYXBfcGFnZSguLi4pIGRvIHsgfSB3aGlsZSAoMCkKKwogI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy92aXJ0aW8vbGludXgva2VybmVsLmggYi90b29scy92aXJ0aW8vbGludXgva2VybmVsLmgKaW5kZXggMDMzODQ5OS4uZDk1NTRmYyAxMDA2NDQKLS0tIGEvdG9vbHMvdmlydGlvL2xpbnV4L2tlcm5lbC5oCisrKyBiL3Rvb2xzL3ZpcnRpby9saW51eC9rZXJuZWwuaApAQCAtMjAsNyArMjAsOSBAQAogCiAjZGVmaW5lIFBBR0VfU0laRSBnZXRwYWdlc2l6ZSgpCiAjZGVmaW5lIFBBR0VfTUFTSyAofihQQUdFX1NJWkUtMSkpCisjZGVmaW5lIFBBR0VfQUxJR04oeCkgKCh4ICsgUEFHRV9TSVpFIC0gMSkgJiBQQUdFX01BU0spCiAKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHBoeXNfYWRkcl90OwogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgZG1hX2FkZHJfdDsKIHR5cGVkZWYgc2l6ZV90IF9fa2VybmVsX3NpemVfdDsKIHR5cGVkZWYgdW5zaWduZWQgaW50IF9fd3N1bTsKQEAgLTU3LDYgKzU5LDExIEBACiAJcmV0dXJuIHA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCAqYWxsb2NfcGFnZXNfZXhhY3Qoc2l6ZV90IHMsIGdmcF90IGdmcCkKK3sKKwlyZXR1cm4ga21hbGxvYyhzLCBnZnApOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQga2ZyZWUodm9pZCAqcCkKIHsKIAlpZiAocCA+PSBfX2tmcmVlX2lnbm9yZV9zdGFydCAmJiBwIDwgX19rZnJlZV9pZ25vcmVfZW5kKQpAQCAtNjQsNiArNzEsMTEgQEAKIAlmcmVlKHApOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9wYWdlc19leGFjdCh2b2lkICpwLCBzaXplX3QgcykKK3sKKwlrZnJlZShwKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkICprcmVhbGxvYyh2b2lkICpwLCBzaXplX3QgcywgZ2ZwX3QgZ2ZwKQogewogCXJldHVybiByZWFsbG9jKHAsIHMpOwpAQCAtMTA1LDYgKzExNyw4IEBACiAjZGVmaW5lIGRldl9lcnIoZGV2LCBmb3JtYXQsIC4uLikgZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsICMjIF9fVkFfQVJHU19fKQogI2RlZmluZSBkZXZfd2FybihkZXYsIGZvcm1hdCwgLi4uKSBmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgIyMgX19WQV9BUkdTX18pCiAKKyNkZWZpbmUgV0FSTl9PTl9PTkNFKGNvbmQpICgoY29uZCkgJiYgZnByaW50ZiAoc3RkZXJyLCAiV0FSTklOR1xuIikpCisKICNkZWZpbmUgbWluKHgsIHkpICh7CQkJCVwKIAl0eXBlb2YoeCkgX21pbjEgPSAoeCk7CQkJXAogCXR5cGVvZih5KSBfbWluMiA9ICh5KTsJCQlcCmRpZmYgLS1naXQgYS90b29scy92aXJ0aW8vbGludXgvc2xhYi5oIGIvdG9vbHMvdmlydGlvL2xpbnV4L3NsYWIuaAppbmRleCA4MWJhZWFjLi43ZTFjMTE5IDEwMDY0NAotLS0gYS90b29scy92aXJ0aW8vbGludXgvc2xhYi5oCisrKyBiL3Rvb2xzL3ZpcnRpby9saW51eC9zbGFiLmgKQEAgLTEsMiArMSw2IEBACiAjaWZuZGVmIExJTlVYX1NMQUJfSAorI2RlZmluZSBHRlBfS0VSTkVMIDAKKyNkZWZpbmUgR0ZQX0FUT01JQyAwCisjZGVmaW5lIF9fR0ZQX05PV0FSTiAwCisjZGVmaW5lIF9fR0ZQX1pFUk8gMAogI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy92aXJ0aW8vbGludXgvdmlydGlvLmggYi90b29scy92aXJ0aW8vbGludXgvdmlydGlvLmgKaW5kZXggZWUxMjVlNy4uOTM3N2M4YiAxMDA2NDQKLS0tIGEvdG9vbHMvdmlydGlvL2xpbnV4L3ZpcnRpby5oCisrKyBiL3Rvb2xzL3ZpcnRpby9saW51eC92aXJ0aW8uaApAQCAtMyw4ICszLDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAorc3RydWN0IGRldmljZSB7CisJdm9pZCAqcGFyZW50OworfTsKKwogc3RydWN0IHZpcnRpb19kZXZpY2UgewotCXZvaWQgKmRldjsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKIAl1NjQgZmVhdHVyZXM7CiB9OwogCmRpZmYgLS1naXQgYS90b29scy92aXJ0aW8vbGludXgvdmlydGlvX2NvbmZpZy5oIGIvdG9vbHMvdmlydGlvL2xpbnV4L3ZpcnRpb19jb25maWcuaAppbmRleCA1N2E2OTY0Li45YmExMTgxIDEwMDY0NAotLS0gYS90b29scy92aXJ0aW8vbGludXgvdmlydGlvX2NvbmZpZy5oCisrKyBiL3Rvb2xzL3ZpcnRpby9saW51eC92aXJ0aW9fY29uZmlnLmgKQEAgLTQwLDYgKzQwLDE5IEBACiAjZGVmaW5lIHZpcnRpb19oYXNfZmVhdHVyZShkZXYsIGZlYXR1cmUpIFwKIAkoX192aXJ0aW9fdGVzdF9iaXQoKGRldiksIGZlYXR1cmUpKQogCisvKioKKyAqIHZpcnRpb19oYXNfaW9tbXVfcXVpcmsgLSBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGRldmljZSBoYXMgdGhlIGlvbW11IHF1aXJrCisgKiBAdmRldjogdGhlIGRldmljZQorICovCitzdGF0aWMgaW5saW5lIGJvb2wgdmlydGlvX2hhc19pb21tdV9xdWlyayhjb25zdCBzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldikKK3sKKwkvKgorCSAqIE5vdGUgdGhlIHJldmVyc2UgcG9sYXJpdHkgb2YgdGhlIHF1aXJrIGZlYXR1cmUgKGNvbXBhcmVkIHRvIG1vc3QKKwkgKiBvdGhlciBmZWF0dXJlcyksIHRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgc3lzdGVtcy4KKwkgKi8KKwlyZXR1cm4gIXZpcnRpb19oYXNfZmVhdHVyZSh2ZGV2LCBWSVJUSU9fRl9JT01NVV9QTEFURk9STSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgYm9vbCB2aXJ0aW9faXNfbGl0dGxlX2VuZGlhbihzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldikKIHsKIAlyZXR1cm4gdmlydGlvX2hhc19mZWF0dXJlKHZkZXYsIFZJUlRJT19GX1ZFUlNJT05fMSkgfHwKZGlmZiAtLWdpdCBhL3Rvb2xzL3ZpcnRpby9yaW5ndGVzdC9wdHJfcmluZy5jIGIvdG9vbHMvdmlydGlvL3Jpbmd0ZXN0L3B0cl9yaW5nLmMKaW5kZXggNjhlNGY5Zi4uYmQyYWQxZCAxMDA2NDQKLS0tIGEvdG9vbHMvdmlydGlvL3Jpbmd0ZXN0L3B0cl9yaW5nLmMKKysrIGIvdG9vbHMvdmlydGlvL3Jpbmd0ZXN0L3B0cl9yaW5nLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNkZWZpbmUgY2FjaGVfbGluZV9zaXplKCkgU01QX0NBQ0hFX0JZVEVTCiAjZGVmaW5lIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFNNUF9DQUNIRV9CWVRFUykpKQogI2RlZmluZSB1bmxpa2VseSh4KSAgICAoX19idWlsdGluX2V4cGVjdCghISh4KSwgMCkpCisjZGVmaW5lIGxpa2VseSh4KSAgICAoX19idWlsdGluX2V4cGVjdCghISh4KSwgMSkpCiAjZGVmaW5lIEFMSUdOKHgsIGEpICgoKHgpICsgKGEpIC0gMSkgLyAoYSkgKiAoYSkpCiB0eXBlZGVmIHB0aHJlYWRfc3BpbmxvY2tfdCAgc3BpbmxvY2tfdDsKIApkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL2FyY2hfdGltZXIuYyBiL3ZpcnQva3ZtL2FybS9hcmNoX3RpbWVyLmMKaW5kZXggNGZkZThjNy4uNzdlNmNjZiAxMDA2NDQKLS0tIGEvdmlydC9rdm0vYXJtL2FyY2hfdGltZXIuYworKysgYi92aXJ0L2t2bS9hcm0vYXJjaF90aW1lci5jCkBAIC0zMyw2ICszMyw3IEBACiBzdGF0aWMgc3RydWN0IHRpbWVjb3VudGVyICp0aW1lY291bnRlcjsKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3F1ZXVlOwogc3RhdGljIHVuc2lnbmVkIGludCBob3N0X3Z0aW1lcl9pcnE7CitzdGF0aWMgdTMyIGhvc3RfdnRpbWVyX2lycV9mbGFnczsKIAogdm9pZCBrdm1fdGltZXJfdmNwdV9wdXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewpAQCAtMzY1LDcgKzM2Niw3IEBACiAKIHN0YXRpYyB2b2lkIGt2bV90aW1lcl9pbml0X2ludGVycnVwdCh2b2lkICppbmZvKQogewotCWVuYWJsZV9wZXJjcHVfaXJxKGhvc3RfdnRpbWVyX2lycSwgMCk7CisJZW5hYmxlX3BlcmNwdV9pcnEoaG9zdF92dGltZXJfaXJxLCBob3N0X3Z0aW1lcl9pcnFfZmxhZ3MpOwogfQogCiBpbnQga3ZtX2FybV90aW1lcl9zZXRfcmVnKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHJlZ2lkLCB1NjQgdmFsdWUpCkBAIC00MzIsNiArNDMzLDE0IEBACiAJfQogCWhvc3RfdnRpbWVyX2lycSA9IGluZm8tPnZpcnR1YWxfaXJxOwogCisJaG9zdF92dGltZXJfaXJxX2ZsYWdzID0gaXJxX2dldF90cmlnZ2VyX3R5cGUoaG9zdF92dGltZXJfaXJxKTsKKwlpZiAoaG9zdF92dGltZXJfaXJxX2ZsYWdzICE9IElSUUZfVFJJR0dFUl9ISUdIICYmCisJICAgIGhvc3RfdnRpbWVyX2lycV9mbGFncyAhPSBJUlFGX1RSSUdHRVJfTE9XKSB7CisJCWt2bV9lcnIoIkludmFsaWQgdHJpZ2dlciBmb3IgSVJRJWQsIGFzc3VtaW5nIGxldmVsIGxvd1xuIiwKKwkJCWhvc3RfdnRpbWVyX2lycSk7CisJCWhvc3RfdnRpbWVyX2lycV9mbGFncyA9IElSUUZfVFJJR0dFUl9MT1c7CisJfQorCiAJZXJyID0gcmVxdWVzdF9wZXJjcHVfaXJxKGhvc3RfdnRpbWVyX2lycSwga3ZtX2FyY2hfdGltZXJfaGFuZGxlciwKIAkJCQkgImt2bSBndWVzdCB0aW1lciIsIGt2bV9nZXRfcnVubmluZ192Y3B1cygpKTsKIAlpZiAoZXJyKSB7CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLWl0cy5jIGIvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy1pdHMuYwppbmRleCAwNzQxMWNmLi40NjYwYTdkIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLWl0cy5jCisrKyBiL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtaXRzLmMKQEAgLTUxLDcgKzUxLDcgQEAKIAogCWlycSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2Z2ljX2lycSksIEdGUF9LRVJORUwpOwogCWlmICghaXJxKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlJTklUX0xJU1RfSEVBRCgmaXJxLT5scGlfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmlycS0+YXBfbGlzdCk7CkBAIC00NDEsMzkgKzQ0MSw2MyBAQAogICogRmluZCB0aGUgdGFyZ2V0IFZDUFUgYW5kIHRoZSBMUEkgbnVtYmVyIGZvciBhIGdpdmVuIGRldmlkL2V2ZW50aWQgcGFpcgogICogYW5kIG1ha2UgdGhpcyBJUlEgcGVuZGluZywgcG9zc2libHkgaW5qZWN0aW5nIGl0LgogICogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgaXRzX2xvY2sgbXV0ZXggaGVsZC4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBhIHBvc2l0aXZlIGVycm9yIHZhbHVlIGZvciBhbnkgSVRTIG1hcHBpbmcKKyAqIHJlbGF0ZWQgZXJyb3JzIGFuZCBuZWdhdGl2ZSBlcnJvciB2YWx1ZXMgZm9yIGdlbmVyaWMgZXJyb3JzLgogICovCi1zdGF0aWMgdm9pZCB2Z2ljX2l0c190cmlnZ2VyX21zaShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCB2Z2ljX2l0cyAqaXRzLAotCQkJCSB1MzIgZGV2aWQsIHUzMiBldmVudGlkKQorc3RhdGljIGludCB2Z2ljX2l0c190cmlnZ2VyX21zaShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCB2Z2ljX2l0cyAqaXRzLAorCQkJCXUzMiBkZXZpZCwgdTMyIGV2ZW50aWQpCiB7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OwogCXN0cnVjdCBpdHNfaXR0ZSAqaXR0ZTsKIAogCWlmICghaXRzLT5lbmFibGVkKQotCQlyZXR1cm47CisJCXJldHVybiAtRUJVU1k7CiAKIAlpdHRlID0gZmluZF9pdHRlKGl0cywgZGV2aWQsIGV2ZW50aWQpOwotCS8qIFRyaWdnZXJpbmcgYW4gdW5tYXBwZWQgSVJRIGdldHMgc2lsZW50bHkgZHJvcHBlZC4gKi8KLQlpZiAoaXR0ZSAmJiBpdHNfaXNfY29sbGVjdGlvbl9tYXBwZWQoaXR0ZS0+Y29sbGVjdGlvbikpIHsKLQkJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OworCWlmICghaXR0ZSB8fCAhaXRzX2lzX2NvbGxlY3Rpb25fbWFwcGVkKGl0dGUtPmNvbGxlY3Rpb24pKQorCQlyZXR1cm4gRV9JVFNfSU5UX1VOTUFQUEVEX0lOVEVSUlVQVDsKIAotCQl2Y3B1ID0ga3ZtX2dldF92Y3B1KGt2bSwgaXR0ZS0+Y29sbGVjdGlvbi0+dGFyZ2V0X2FkZHIpOwotCQlpZiAodmNwdSAmJiB2Y3B1LT5hcmNoLnZnaWNfY3B1LmxwaXNfZW5hYmxlZCkgewotCQkJc3Bpbl9sb2NrKCZpdHRlLT5pcnEtPmlycV9sb2NrKTsKLQkJCWl0dGUtPmlycS0+cGVuZGluZyA9IHRydWU7Ci0JCQl2Z2ljX3F1ZXVlX2lycV91bmxvY2soa3ZtLCBpdHRlLT5pcnEpOwotCQl9Ci0JfQorCXZjcHUgPSBrdm1fZ2V0X3ZjcHUoa3ZtLCBpdHRlLT5jb2xsZWN0aW9uLT50YXJnZXRfYWRkcik7CisJaWYgKCF2Y3B1KQorCQlyZXR1cm4gRV9JVFNfSU5UX1VOTUFQUEVEX0lOVEVSUlVQVDsKKworCWlmICghdmNwdS0+YXJjaC52Z2ljX2NwdS5scGlzX2VuYWJsZWQpCisJCXJldHVybiAtRUJVU1k7CisKKwlzcGluX2xvY2soJml0dGUtPmlycS0+aXJxX2xvY2spOworCWl0dGUtPmlycS0+cGVuZGluZyA9IHRydWU7CisJdmdpY19xdWV1ZV9pcnFfdW5sb2NrKGt2bSwgaXR0ZS0+aXJxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZnaWNfaW9fZGV2aWNlICp2Z2ljX2dldF9pdHNfaW9kZXYoc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmdpY19pb19kZXZpY2UgKmlvZGV2OworCisJaWYgKGRldi0+b3BzICE9ICZrdm1faW9fZ2ljX29wcykKKwkJcmV0dXJuIE5VTEw7CisKKwlpb2RldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB2Z2ljX2lvX2RldmljZSwgZGV2KTsKKworCWlmIChpb2Rldi0+aW9kZXZfdHlwZSAhPSBJT0RFVl9JVFMpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGlvZGV2OwogfQogCiAvKgogICogUXVlcmllcyB0aGUgS1ZNIElPIGJ1cyBmcmFtZXdvcmsgdG8gZ2V0IHRoZSBJVFMgcG9pbnRlciBmcm9tIHRoZSBnaXZlbgogICogZG9vcmJlbGwgYWRkcmVzcy4KICAqIFdlIHRoZW4gY2FsbCB2Z2ljX2l0c190cmlnZ2VyX21zaSgpIHdpdGggdGhlIGRlY29kZWQgZGF0YS4KKyAqIEFjY29yZGluZyB0byB0aGUgS1ZNX1NJR05BTF9NU0kgQVBJIGRlc2NyaXB0aW9uIHJldHVybnMgMSBvbiBzdWNjZXNzLgogICovCiBpbnQgdmdpY19pdHNfaW5qZWN0X21zaShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbXNpICptc2kpCiB7CiAJdTY0IGFkZHJlc3M7CiAJc3RydWN0IGt2bV9pb19kZXZpY2UgKmt2bV9pb19kZXY7CiAJc3RydWN0IHZnaWNfaW9fZGV2aWNlICppb2RldjsKKwlpbnQgcmV0OwogCiAJaWYgKCF2Z2ljX2hhc19pdHMoa3ZtKSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC00ODUsMTUgKzUwOSwyOCBAQAogCiAJa3ZtX2lvX2RldiA9IGt2bV9pb19idXNfZ2V0X2Rldihrdm0sIEtWTV9NTUlPX0JVUywgYWRkcmVzcyk7CiAJaWYgKCFrdm1faW9fZGV2KQotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpb2RldiA9IGNvbnRhaW5lcl9vZihrdm1faW9fZGV2LCBzdHJ1Y3QgdmdpY19pb19kZXZpY2UsIGRldik7CisJaW9kZXYgPSB2Z2ljX2dldF9pdHNfaW9kZXYoa3ZtX2lvX2Rldik7CisJaWYgKCFpb2RldikKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZpb2Rldi0+aXRzLT5pdHNfbG9jayk7Ci0JdmdpY19pdHNfdHJpZ2dlcl9tc2koa3ZtLCBpb2Rldi0+aXRzLCBtc2ktPmRldmlkLCBtc2ktPmRhdGEpOworCXJldCA9IHZnaWNfaXRzX3RyaWdnZXJfbXNpKGt2bSwgaW9kZXYtPml0cywgbXNpLT5kZXZpZCwgbXNpLT5kYXRhKTsKIAltdXRleF91bmxvY2soJmlvZGV2LT5pdHMtPml0c19sb2NrKTsKIAotCXJldHVybiAwOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBLVk1fU0lHTkFMX01TSSBkZW1hbmRzIGEgcmV0dXJuIHZhbHVlID4gMCBmb3Igc3VjY2VzcyBhbmQgMAorCSAqIGlmIHRoZSBndWVzdCBoYXMgYmxvY2tlZCB0aGUgTVNJLiBTbyB3ZSBtYXAgYW55IExQSSBtYXBwaW5nCisJICogcmVsYXRlZCBlcnJvciB0byB0aGF0LgorCSAqLworCWlmIChyZXQpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDE7CiB9CiAKIC8qIFJlcXVpcmVzIHRoZSBpdHNfbG9jayB0byBiZSBoZWxkLiAqLwpAQCAtNTAyLDcgKzUzOSw4IEBACiAJbGlzdF9kZWwoJml0dGUtPml0dGVfbGlzdCk7CiAKIAkvKiBUaGlzIHB1dCBtYXRjaGVzIHRoZSBnZXQgaW4gdmdpY19hZGRfbHBpLiAqLwotCXZnaWNfcHV0X2lycShrdm0sIGl0dGUtPmlycSk7CisJaWYgKGl0dGUtPmlycSkKKwkJdmdpY19wdXRfaXJxKGt2bSwgaXR0ZS0+aXJxKTsKIAogCWtmcmVlKGl0dGUpOwogfQpAQCAtNjk3LDYgKzczNSw3IEBACiAJc3RydWN0IGl0c19kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgaXRzX2NvbGxlY3Rpb24gKmNvbGxlY3Rpb24sICpuZXdfY29sbCA9IE5VTEw7CiAJaW50IGxwaV9ucjsKKwlzdHJ1Y3QgdmdpY19pcnEgKmlycTsKIAogCWRldmljZSA9IGZpbmRfaXRzX2RldmljZShpdHMsIGRldmljZV9pZCk7CiAJaWYgKCFkZXZpY2UpCkBAIC03MTAsNiArNzQ5LDEwIEBACiAJICAgIGxwaV9uciA+PSBtYXhfbHBpc19wcm9wYmFzZXIoa3ZtLT5hcmNoLnZnaWMucHJvcGJhc2VyKSkKIAkJcmV0dXJuIEVfSVRTX01BUFRJX1BIWVNJQ0FMSURfT09SOwogCisJLyogSWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgbWFwcGluZywgYmVoYXZpb3IgaXMgVU5QUkVESUNUQUJMRS4gKi8KKwlpZiAoZmluZF9pdHRlKGl0cywgZGV2aWNlX2lkLCBldmVudF9pZCkpCisJCXJldHVybiAwOworCiAJY29sbGVjdGlvbiA9IGZpbmRfY29sbGVjdGlvbihpdHMsIGNvbGxfaWQpOwogCWlmICghY29sbGVjdGlvbikgewogCQlpbnQgcmV0ID0gdmdpY19pdHNfYWxsb2NfY29sbGVjdGlvbihpdHMsICZjb2xsZWN0aW9uLCBjb2xsX2lkKTsKQEAgLTcxOCwyMiArNzYxLDI4IEBACiAJCW5ld19jb2xsID0gY29sbGVjdGlvbjsKIAl9CiAKLQlpdHRlID0gZmluZF9pdHRlKGl0cywgZGV2aWNlX2lkLCBldmVudF9pZCk7CisJaXR0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpdHNfaXR0ZSksIEdGUF9LRVJORUwpOwogCWlmICghaXR0ZSkgewotCQlpdHRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGl0c19pdHRlKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghaXR0ZSkgewotCQkJaWYgKG5ld19jb2xsKQotCQkJCXZnaWNfaXRzX2ZyZWVfY29sbGVjdGlvbihpdHMsIGNvbGxfaWQpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQlpdHRlLT5ldmVudF9pZAk9IGV2ZW50X2lkOwotCQlsaXN0X2FkZF90YWlsKCZpdHRlLT5pdHRlX2xpc3QsICZkZXZpY2UtPml0dF9oZWFkKTsKKwkJaWYgKG5ld19jb2xsKQorCQkJdmdpY19pdHNfZnJlZV9jb2xsZWN0aW9uKGl0cywgY29sbF9pZCk7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCWl0dGUtPmV2ZW50X2lkCT0gZXZlbnRfaWQ7CisJbGlzdF9hZGRfdGFpbCgmaXR0ZS0+aXR0ZV9saXN0LCAmZGV2aWNlLT5pdHRfaGVhZCk7CisKIAlpdHRlLT5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKIAlpdHRlLT5scGkgPSBscGlfbnI7Ci0JaXR0ZS0+aXJxID0gdmdpY19hZGRfbHBpKGt2bSwgbHBpX25yKTsKKworCWlycSA9IHZnaWNfYWRkX2xwaShrdm0sIGxwaV9ucik7CisJaWYgKElTX0VSUihpcnEpKSB7CisJCWlmIChuZXdfY29sbCkKKwkJCXZnaWNfaXRzX2ZyZWVfY29sbGVjdGlvbihpdHMsIGNvbGxfaWQpOworCQlpdHNfZnJlZV9pdHRlKGt2bSwgaXR0ZSk7CisJCXJldHVybiBQVFJfRVJSKGlycSk7CisJfQorCWl0dGUtPmlycSA9IGlycTsKKwogCXVwZGF0ZV9hZmZpbml0eV9pdHRlKGt2bSwgaXR0ZSk7CiAKIAkvKgpAQCAtOTgxLDkgKzEwMzAsNyBAQAogCXUzMiBtc2lfZGF0YSA9IGl0c19jbWRfZ2V0X2lkKGl0c19jbWQpOwogCXU2NCBtc2lfZGV2aWQgPSBpdHNfY21kX2dldF9kZXZpY2VpZChpdHNfY21kKTsKIAotCXZnaWNfaXRzX3RyaWdnZXJfbXNpKGt2bSwgaXRzLCBtc2lfZGV2aWQsIG1zaV9kYXRhKTsKLQotCXJldHVybiAwOworCXJldHVybiB2Z2ljX2l0c190cmlnZ2VyX21zaShrdm0sIGl0cywgbXNpX2RldmlkLCBtc2lfZGF0YSk7CiB9CiAKIC8qCkBAIC0xMjg4LDEzICsxMzM1LDEzIEBACiAJCWl0c19zeW5jX2xwaV9wZW5kaW5nX3RhYmxlKHZjcHUpOwogfQogCi1zdGF0aWMgaW50IHZnaWNfaXRzX2luaXRfaXRzKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IHZnaWNfaXRzICppdHMpCitzdGF0aWMgaW50IHZnaWNfcmVnaXN0ZXJfaXRzX2lvZGV2KHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IHZnaWNfaXRzICppdHMpCiB7CiAJc3RydWN0IHZnaWNfaW9fZGV2aWNlICppb2RldiA9ICZpdHMtPmlvZGV2OwogCWludCByZXQ7CiAKLQlpZiAoaXRzLT5pbml0aWFsaXplZCkKLQkJcmV0dXJuIDA7CisJaWYgKCFpdHMtPmluaXRpYWxpemVkKQorCQlyZXR1cm4gLUVCVVNZOwogCiAJaWYgKElTX1ZHSUNfQUREUl9VTkRFRihpdHMtPnZnaWNfaXRzX2Jhc2UpKQogCQlyZXR1cm4gLUVOWElPOwpAQCAtMTMxMSw5ICsxMzU4LDYgQEAKIAkJCQkgICAgICBLVk1fVkdJQ19WM19JVFNfU0laRSwgJmlvZGV2LT5kZXYpOwogCW11dGV4X3VubG9jaygma3ZtLT5zbG90c19sb2NrKTsKIAotCWlmICghcmV0KQotCQlpdHMtPmluaXRpYWxpemVkID0gdHJ1ZTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0MzUsOSArMTQ3OSw2IEBACiAJCWlmICh0eXBlICE9IEtWTV9WR0lDX0lUU19BRERSX1RZUEUpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAotCQlpZiAoaXRzLT5pbml0aWFsaXplZCkKLQkJCXJldHVybiAtRUJVU1k7Ci0KIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZhZGRyLCB1YWRkciwgc2l6ZW9mKGFkZHIpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCkBAIC0xNDUzLDcgKzE0OTQsOSBAQAogCWNhc2UgS1ZNX0RFVl9BUk1fVkdJQ19HUlBfQ1RSTDoKIAkJc3dpdGNoIChhdHRyLT5hdHRyKSB7CiAJCWNhc2UgS1ZNX0RFVl9BUk1fVkdJQ19DVFJMX0lOSVQ6Ci0JCQlyZXR1cm4gdmdpY19pdHNfaW5pdF9pdHMoZGV2LT5rdm0sIGl0cyk7CisJCQlpdHMtPmluaXRpYWxpemVkID0gdHJ1ZTsKKworCQkJcmV0dXJuIDA7CiAJCX0KIAkJYnJlYWs7CiAJfQpAQCAtMTQ5OCwzICsxNTQxLDMwIEBACiAJcmV0dXJuIGt2bV9yZWdpc3Rlcl9kZXZpY2Vfb3BzKCZrdm1fYXJtX3ZnaWNfaXRzX29wcywKIAkJCQkgICAgICAgS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX0lUUyk7CiB9CisKKy8qCisgKiBSZWdpc3RlcnMgYWxsIElUU2VzIHdpdGggdGhlIGt2bV9pb19idXMgZnJhbWV3b3JrLgorICogVG8gZm9sbG93IHRoZSBleGlzdGluZyBWR0lDIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLCB0aGlzIGhhcyB0byBiZQorICogZG9uZSBhcyBsYXRlIGFzIHBvc3NpYmxlLCBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgVkNQVSBydW5zLgorICovCitpbnQgdmdpY19yZWdpc3Rlcl9pdHNfaW9kZXZzKHN0cnVjdCBrdm0gKmt2bSkKK3sKKwlzdHJ1Y3Qga3ZtX2RldmljZSAqZGV2OworCWludCByZXQgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZrdm0tPmRldmljZXMsIHZtX25vZGUpIHsKKwkJaWYgKGRldi0+b3BzICE9ICZrdm1fYXJtX3ZnaWNfaXRzX29wcykKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IHZnaWNfcmVnaXN0ZXJfaXRzX2lvZGV2KGt2bSwgZGV2LT5wcml2YXRlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCS8qCisJCSAqIFdlIGRvbid0IG5lZWQgdG8gY2FyZSBhYm91dCB0ZWFyaW5nIGRvd24gcHJldmlvdXNseQorCQkgKiByZWdpc3RlcmVkIElUU2VzLCBhcyB0aGUga3ZtX2lvX2J1cyBmcmFtZXdvcmsgcmVtb3ZlcworCQkgKiB0aGVtIGZvciB1cyBpZiB0aGUgVk0gZ2V0cyBkZXN0cm95ZWQuCisJCSAqLworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLW1taW8tdjMuYyBiL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtbW1pby12My5jCmluZGV4IGZmNjY4ZTAuLjkwZDgxODEgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtbW1pby12My5jCisrKyBiL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtbW1pby12My5jCkBAIC0zMDYsMTYgKzMwNiwxOSBAQAogewogCXN0cnVjdCB2Z2ljX2Rpc3QgKmRpc3QgPSAmdmNwdS0+a3ZtLT5hcmNoLnZnaWM7CiAJc3RydWN0IHZnaWNfY3B1ICp2Z2ljX2NwdSA9ICZ2Y3B1LT5hcmNoLnZnaWNfY3B1OwotCXU2NCBwcm9wYmFzZXIgPSBkaXN0LT5wcm9wYmFzZXI7CisJdTY0IG9sZF9wcm9wYmFzZXIsIHByb3BiYXNlcjsKIAogCS8qIFN0b3JpbmcgYSB2YWx1ZSB3aXRoIExQSXMgYWxyZWFkeSBlbmFibGVkIGlzIHVuZGVmaW5lZCAqLwogCWlmICh2Z2ljX2NwdS0+bHBpc19lbmFibGVkKQogCQlyZXR1cm47CiAKLQlwcm9wYmFzZXIgPSB1cGRhdGVfNjRiaXRfcmVnKHByb3BiYXNlciwgYWRkciAmIDQsIGxlbiwgdmFsKTsKLQlwcm9wYmFzZXIgPSB2Z2ljX3Nhbml0aXNlX3Byb3BiYXNlcihwcm9wYmFzZXIpOwotCi0JZGlzdC0+cHJvcGJhc2VyID0gcHJvcGJhc2VyOworCWRvIHsKKwkJb2xkX3Byb3BiYXNlciA9IGRpc3QtPnByb3BiYXNlcjsKKwkJcHJvcGJhc2VyID0gb2xkX3Byb3BiYXNlcjsKKwkJcHJvcGJhc2VyID0gdXBkYXRlXzY0Yml0X3JlZyhwcm9wYmFzZXIsIGFkZHIgJiA0LCBsZW4sIHZhbCk7CisJCXByb3BiYXNlciA9IHZnaWNfc2FuaXRpc2VfcHJvcGJhc2VyKHByb3BiYXNlcik7CisJfSB3aGlsZSAoY21weGNoZzY0KCZkaXN0LT5wcm9wYmFzZXIsIG9sZF9wcm9wYmFzZXIsCisJCQkgICBwcm9wYmFzZXIpICE9IG9sZF9wcm9wYmFzZXIpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB2Z2ljX21taW9fcmVhZF9wZW5kYmFzZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCkBAIC0zMzEsMTYgKzMzNCwxOSBAQAogCQkJCSAgICAgdW5zaWduZWQgbG9uZyB2YWwpCiB7CiAJc3RydWN0IHZnaWNfY3B1ICp2Z2ljX2NwdSA9ICZ2Y3B1LT5hcmNoLnZnaWNfY3B1OwotCXU2NCBwZW5kYmFzZXIgPSB2Z2ljX2NwdS0+cGVuZGJhc2VyOworCXU2NCBvbGRfcGVuZGJhc2VyLCBwZW5kYmFzZXI7CiAKIAkvKiBTdG9yaW5nIGEgdmFsdWUgd2l0aCBMUElzIGFscmVhZHkgZW5hYmxlZCBpcyB1bmRlZmluZWQgKi8KIAlpZiAodmdpY19jcHUtPmxwaXNfZW5hYmxlZCkKIAkJcmV0dXJuOwogCi0JcGVuZGJhc2VyID0gdXBkYXRlXzY0Yml0X3JlZyhwZW5kYmFzZXIsIGFkZHIgJiA0LCBsZW4sIHZhbCk7Ci0JcGVuZGJhc2VyID0gdmdpY19zYW5pdGlzZV9wZW5kYmFzZXIocGVuZGJhc2VyKTsKLQotCXZnaWNfY3B1LT5wZW5kYmFzZXIgPSBwZW5kYmFzZXI7CisJZG8geworCQlvbGRfcGVuZGJhc2VyID0gdmdpY19jcHUtPnBlbmRiYXNlcjsKKwkJcGVuZGJhc2VyID0gb2xkX3BlbmRiYXNlcjsKKwkJcGVuZGJhc2VyID0gdXBkYXRlXzY0Yml0X3JlZyhwZW5kYmFzZXIsIGFkZHIgJiA0LCBsZW4sIHZhbCk7CisJCXBlbmRiYXNlciA9IHZnaWNfc2FuaXRpc2VfcGVuZGJhc2VyKHBlbmRiYXNlcik7CisJfSB3aGlsZSAoY21weGNoZzY0KCZ2Z2ljX2NwdS0+cGVuZGJhc2VyLCBvbGRfcGVuZGJhc2VyLAorCQkJICAgcGVuZGJhc2VyKSAhPSBvbGRfcGVuZGJhc2VyKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtdjMuYyBiL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtdjMuYwppbmRleCAwNTA2NTQzLi45ZjBkYWUzIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLXYzLmMKKysrIGIvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy12My5jCkBAIC0yODksNiArMjg5LDE0IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWlmICh2Z2ljX2hhc19pdHMoa3ZtKSkgeworCQlyZXQgPSB2Z2ljX3JlZ2lzdGVyX2l0c19pb2RldnMoa3ZtKTsKKwkJaWYgKHJldCkgeworCQkJa3ZtX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIFZHSUMgSVRTIE1NSU8gcmVnaW9uc1xuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwogCWRpc3QtPnJlYWR5ID0gdHJ1ZTsKIAogb3V0OgpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy5jIGIvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy5jCmluZGV4IGU3YWVhYzcuLmU4M2I3ZmUgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMuYworKysgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLmMKQEAgLTExNywxNyArMTE3LDE3IEBACiAKIHZvaWQgdmdpY19wdXRfaXJxKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IHZnaWNfaXJxICppcnEpCiB7Ci0Jc3RydWN0IHZnaWNfZGlzdCAqZGlzdDsKKwlzdHJ1Y3QgdmdpY19kaXN0ICpkaXN0ID0gJmt2bS0+YXJjaC52Z2ljOwogCiAJaWYgKGlycS0+aW50aWQgPCBWR0lDX01JTl9MUEkpCiAJCXJldHVybjsKIAotCWlmICgha3JlZl9wdXQoJmlycS0+cmVmY291bnQsIHZnaWNfaXJxX3JlbGVhc2UpKQotCQlyZXR1cm47Ci0KLQlkaXN0ID0gJmt2bS0+YXJjaC52Z2ljOwotCiAJc3Bpbl9sb2NrKCZkaXN0LT5scGlfbGlzdF9sb2NrKTsKKwlpZiAoIWtyZWZfcHV0KCZpcnEtPnJlZmNvdW50LCB2Z2ljX2lycV9yZWxlYXNlKSkgeworCQlzcGluX3VubG9jaygmZGlzdC0+bHBpX2xpc3RfbG9jayk7CisJCXJldHVybjsKKwl9OworCiAJbGlzdF9kZWwoJmlycS0+bHBpX2xpc3QpOwogCWRpc3QtPmxwaV9saXN0X2NvdW50LS07CiAJc3Bpbl91bmxvY2soJmRpc3QtPmxwaV9saXN0X2xvY2spOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy5oIGIvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy5oCmluZGV4IDFkOGUyMWQuLjZjNDYyNWMgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMuaAorKysgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLmgKQEAgLTg0LDYgKzg0LDcgQEAKIGludCB2Z2ljX3YzX3Byb2JlKGNvbnN0IHN0cnVjdCBnaWNfa3ZtX2luZm8gKmluZm8pOwogaW50IHZnaWNfdjNfbWFwX3Jlc291cmNlcyhzdHJ1Y3Qga3ZtICprdm0pOwogaW50IHZnaWNfcmVnaXN0ZXJfcmVkaXN0X2lvZGV2cyhzdHJ1Y3Qga3ZtICprdm0sIGdwYV90IGRpc3RfYmFzZV9hZGRyZXNzKTsKK2ludCB2Z2ljX3JlZ2lzdGVyX2l0c19pb2RldnMoc3RydWN0IGt2bSAqa3ZtKTsKIGJvb2wgdmdpY19oYXNfaXRzKHN0cnVjdCBrdm0gKmt2bSk7CiBpbnQga3ZtX3ZnaWNfcmVnaXN0ZXJfaXRzX2RldmljZSh2b2lkKTsKIHZvaWQgdmdpY19lbmFibGVfbHBpcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwpAQCAtMTQwLDYgKzE0MSwxMSBAQAogCXJldHVybiAtRU5PREVWOwogfQogCitzdGF0aWMgaW5saW5lIGludCB2Z2ljX3JlZ2lzdGVyX2l0c19pb2RldnMoc3RydWN0IGt2bSAqa3ZtKQoreworCXJldHVybiAtRU5PREVWOworfQorCiBzdGF0aWMgaW5saW5lIGJvb2wgdmdpY19oYXNfaXRzKHN0cnVjdCBrdm0gKmt2bSkKIHsKIAlyZXR1cm4gZmFsc2U7Cg==